[
  {
    "path": ".cargo/config.toml",
    "content": "[build]\n# Share one `target` directory at the project root for all Cargo projects and workspaces in smithy-rs\ntarget-dir = \"target\"\n"
  },
  {
    "path": ".cargo-deny-config.toml",
    "content": "# This is the config file for `cargo-deny` used in CI\n\n# This section is considered when running `cargo deny check licenses`\n# More documentation for the licenses section can be found here:\n# https://embarkstudios.github.io/cargo-deny/checks/licenses/cfg.html\n[licenses]\nallow = [\n    # See https://spdx.org/licenses/ for list of possible licenses\n    # [possible values: any SPDX 3.11 short identifier (+ optional exception)].\n    \"Apache-2.0 WITH LLVM-exception\",\n    \"Apache-2.0\",\n    \"BSD-3-Clause\",\n    \"ISC\",\n    \"MIT\",\n    \"MPL-2.0\",\n    \"Unicode-DFS-2016\",\n    \"Unicode-3.0\",\n    \"Zlib\",\n]\nconfidence-threshold = 1.0\nexceptions = [\n    { allow = [\"OpenSSL\"], name = \"ring\", version = \"*\" },\n    { allow = [\"OpenSSL\"], name = \"aws-lc-sys\", version = \"*\" },\n    { allow = [\"OpenSSL\"], name = \"aws-lc-fips-sys\", version = \"*\" },\n    { allow = [\"BlueOak-1.0.0\"], name = \"minicbor\", version = \"<=0.24.2\" },\n    # Safe to bump as long as license does not change -------------^\n    # See D105255799.\n]\n\n[[licenses.clarify]]\nname = \"webpki\"\nversion = \"*\"\nexpression = \"MIT AND ISC\"\nlicense-files = [{ path = \"LICENSE\", hash = 0x001c7e6c }]\n\n[[licenses.clarify]]\nname = \"ring\"\nexpression = \"MIT AND ISC AND OpenSSL\"\nlicense-files = [{ path = \"LICENSE\", hash = 0xbd0eed23 }]\n\n[[licenses.clarify]]\nname = \"webpki\"\nexpression = \"ISC\"\nlicense-files = [\n    { path = \"LICENSE\", hash = 0x001c7e6c },\n]\n\n[[licenses.clarify]]\nname = \"rustls-webpki\"\nexpression = \"ISC\"\nlicense-files = [\n    { path = \"LICENSE\", hash = 0x001c7e6c },\n]\n\n# This section is considered when running `cargo deny check bans`.\n# More documentation about the 'bans' section can be found here:\n# https://embarkstudios.github.io/cargo-deny/checks/bans/cfg.html\n[bans]\nmultiple-versions = \"allow\"\nwildcards = \"deny\" # Don't allow wildcard dependencies\nhighlight = \"all\"\ndeny = []\n\n# This section is considered when running `cargo deny check sources`.\n# More documentation about the 'sources' section can be found here:\n# https://embarkstudios.github.io/cargo-deny/checks/sources/cfg.html\n[sources]\nunknown-registry = \"deny\"\nunknown-git = \"deny\"\nallow-registry = [\"https://github.com/rust-lang/crates.io-index\"]\nallow-git = []\n"
  },
  {
    "path": ".changelog/.example",
    "content": "# Example changelog entry, Markdown with YAML front matter\n# ---\n# applies_to: [\"client\", \"server\", \"aws-sdk-rust\"] # \"aws-sdk-rust\" here duplicates this entry into release notes in `aws-sdk-rust`\n# authors: [\"rcoh\"]\n# references: [\"smithy-rs#920\"]\n# breaking: false\n# new_feature: false\n# bug_fix: false\n# ---\n# Fix typos in module documentation for generated crates\n"
  },
  {
    "path": ".editorconfig",
    "content": "[*.{kt,kts}]\nij_kotlin_allow_trailing_comma = true\nij_kotlin_allow_trailing_comma_on_call_site = true\nij_java_use_single_class_imports = true\nij_groovy_use_single_class_imports = true\nij_kotlin_name_count_to_use_star_import = 100\nij_kotlin_name_count_to_use_star_import_for_members = 100\nindent_size = 4\nindent_style = space\ninsert_final_newline = true\nmax_line_length = 120\n\n# Ktlint-specific config\nktlint_standard = enabled\nktlint_experimental = disabled\nktlint_standard_filename = disabled\nktlint_standard_max-line-length = disabled\nktlint_standard_argument-list-wrapping = disabled\nktlint_standard_parameter-list-wrapping = disabled\nktlint_standard_property-naming = disabled\nktlint_standard_comment-wrapping = disabled\n"
  },
  {
    "path": ".git-blame-ignore-revs",
    "content": "# .git-blame-ignore-revs\n#\n# To make use of this file when running `git blame`, add `--ignore-revs-file .git-blame-ignore-revs` to the arguments.\n# To always make use of this file, run the following:\n#   git config blame.ignoreRevsFile .git-blame-ignore-revs\n#\n\n# Add `client` to `codegen-client` package namespace (#1711)\n1a0f81ae33816c10c9d305f33ea03da23c6265ef\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/blank_issue.md",
    "content": "---\nname: Blank Issue\nabout: Create a blank issue.\n---\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "content": "blank_issues_enabled: false\n"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "content": "## Motivation and Context\n<!--- Why is this change required? What problem does it solve? -->\n<!--- If it fixes an open issue, please link to the issue here -->\n\n## Description\n<!--- Describe your changes in detail -->\n\n## Testing\n<!--- Please describe in detail how you tested your changes -->\n<!--- Include details of your testing environment, and the tests you ran to -->\n<!--- see how your change affects other areas of the code, etc. -->\n\n## Checklist\n<!--- If a checkbox below is not applicable, then please DELETE it rather than leaving it unchecked -->\n- [ ] For changes to the smithy-rs codegen or runtime crates, I have created a changelog entry Markdown file in the `.changelog` directory, specifying \"client,\" \"server,\" or both in the `applies_to` key.\n- [ ] For changes to the AWS SDK, generated SDK code, or SDK runtime crates, I have created a changelog entry Markdown file in the `.changelog` directory, specifying \"aws-sdk-rust\" in the `applies_to` key.\n\n----\n\n_By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice._\n"
  },
  {
    "path": ".github/actions/docker-build/action.yml",
    "content": "# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n\n# Use this action to execute the action scripts in tools/ci-scripts.\nname: smithy-rs Docker Build\ndescription: Run Docker build command for smithy-rs\ninputs:\n  # The name of the script in tools/ci-scripts to run\n  action:\n    description: What action to run in the Docker build\n    required: true\n  action-arguments:\n    description: Arguments to pass to the action\n    required: false\n  use_cache:\n    description: Whether to use the gradle cache\n    type: boolean\n    required: false\n    default: true\n\nruns:\n  using: composite\n  steps:\n  - name: Gradle Cache\n    if: ${{ github.event.inputs.use_cache == 'true' }}\n    uses: actions/cache@v4\n    with:\n      path: |\n        gradle/caches\n        gradle/wrapper\n      key: ${{ runner.os }}-gradle-${{ hashFiles('gradle/caches/**/*', 'gradle/wrapper/**/*') }}\n      restore-keys: |\n        ${{ runner.os }}-gradle-\n       # Pinned to the commit hash of v2.7.3\n  - uses: Swatinem/rust-cache@23bce251a8cd2ffc3c1075eaa2367cf899916d84\n    with:\n      shared-key: ${{ runner.os }}-${{ github.job }}\n      workspaces: |\n        . smithy-rs-target\n  - name: Download all artifacts\n    uses: ./smithy-rs/.github/actions/download-all-artifacts\n  - name: Prepare build image\n    shell: bash\n    run: |\n      set -x\n      ls -lsa\n      docker image ls\n\n      # Check the build artifacts to see if a prior step built a new Docker build image.\n      # If smithy-rs-base-image was included in the downloaded build artifacts, then load\n      # it and tag it as the base image to use for this action. This will prevent acquire-build-image\n      # from attempting to download an image from ECR since it will already exist,\n      # which enables testing build image modifications as part of the pull request.\n      if [[ -d smithy-rs-base-image ]]; then\n        echo \"found base image in artifacts...loading it back into docker\"\n        IMAGE_TAG=\"ci-$(./smithy-rs/.github/scripts/docker-image-hash)\"\n        docker load -i smithy-rs-base-image/smithy-rs-base-image\n        docker tag \"smithy-rs-base-image:${IMAGE_TAG}\" \"smithy-rs-base-image:local\"\n      fi\n\n      docker image ls\n\n      # For this step, we want images to come from build artifacts (built as part a prior step),\n      # or from ECR. We disable building the image from scratch so that any mistakes in the CI\n      # configuration won't cause each individual action to build its own image, which would\n      # drastically increase the total CI time. Fail fast!\n      ALLOW_LOCAL_BUILD=false ./smithy-rs/.github/scripts/acquire-build-image\n     # This runs the commands from the matrix strategy\n  - name: Run ${{ inputs.action }}\n    shell: bash\n    run: |\n      ./smithy-rs/tools/ci-build/ci-action ${{ inputs.action }} ${{ inputs.action-arguments}}\n      tar cfz artifacts-${{ inputs.action }}.tar.gz -C artifacts .\n  - name: Upload artifacts\n    uses: actions/upload-artifact@v4\n    with:\n      name: artifacts-${{ inputs.action }}\n      path: artifacts-${{ inputs.action }}.tar.gz\n      if-no-files-found: error\n      retention-days: 3\n      overwrite: true\n"
  },
  {
    "path": ".github/actions/download-all-artifacts/action.yml",
    "content": "# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n\nname: Download All Artifacts\ndescription: Downloads and untars all available build artifacts\nruns:\n  using: composite\n  steps:\n  - name: Download artifacts\n    uses: actions/download-artifact@v4\n  - name: Untar artifacts\n    shell: bash\n    run: find . -maxdepth 2 -iname 'artifacts-*.tar.gz' -print -exec tar xfz {} \\;\n"
  },
  {
    "path": ".github/actions/free-disk-space/action.yml",
    "content": "# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n\nname: 'Free Disk Space'\ndescription: 'Free up disk space on GitHub Actions runners'\nruns:\n  using: 'composite'\n  steps:\n    - name: Free up disk space\n      shell: bash\n      run: |\n        sudo rm -rf /usr/share/dotnet\n        sudo rm -rf \"$AGENT_TOOLSDIRECTORY\"\n"
  },
  {
    "path": ".github/scripts/README.md",
    "content": "# GitHub Actions Scripts\n\nThis directory contains scripts used in the smithy-rs CI/CD workflows.\n\n## acquire-build-image\n\n**Purpose**: Acquires and prepares Docker build images for CI/CD workflows. Acts as an intelligent wrapper that handles\nimage availability checking, remote pulling from AWS ECR, authentication, and local building as needed.\n\n### Usage\n\n```bash\n# Basic usage\n./acquire-build-image\n\n# Run self-tests\n./acquire-build-image --self-test\n\n# With environment variables\nALLOW_LOCAL_BUILD=false ./acquire-build-image\nGITHUB_ACTIONS=true ./acquire-build-image\n```\n\n### Environment Variables\n\n- `ALLOW_LOCAL_BUILD` - Enable local image building (default: `true`)\n- `GITHUB_ACTIONS` - Indicates running in GitHub Actions (default: `false`)\n- `ENCRYPTED_DOCKER_PASSWORD` - Base64 encrypted Docker registry password\n- `DOCKER_LOGIN_TOKEN_PASSPHRASE` - Passphrase for decrypting Docker password\n- `OCI_EXE` - Docker-compatible executable e.g. docker, finch, podman, etc (default: `docker`)\n\n### Behavior & Outputs\n\n#### When image exists locally:\n- Uses existing local image\n- Tags: `smithy-rs-base-image:local`, `smithy-rs-build-image:latest`\n- No network activity\n\n#### When image doesn't exist locally:\n1. **Attempts remote pull** from AWS ECR (`<acccount-id>.dkr.ecr.us-west-2.amazonaws.com/smithy-rs-build-image`)\n   - On success: Tags remote image as `smithy-rs-base-image:<tag>`\n   - On failure: Falls back to local build (if enabled)\n\n2. **Local build fallback** (when remote pull fails or on ARM64):\n   - Builds from `tools/ci-build/Dockerfile`\n   - Tags: `smithy-rs-base-image:<tag>`\n   - In GitHub Actions: Also saves image to `./smithy-rs-base-image` file\n\n3. **Final step** (always):\n   - Creates user-specific build image: `smithy-rs-build-image:latest`\n   - Tags base image as: `smithy-rs-base-image:local`\n\n### Exit Codes\n\n- `0` - Success: Build image ready for use\n- `1` - Failure: Unable to acquire image\n\n### Common Scenarios\n\n**Local development (first run):**\n```bash\n./acquire-build-image\n# → Pulls remote image → Tags locally → Creates build image\n```\n\n**Local development (subsequent runs):**\n```bash\n./acquire-build-image\n# → Uses local image → Creates build image (fast)\n```\n\n**GitHub Actions:**\n```bash\nGITHUB_ACTIONS=true ./acquire-build-image\n# → Same as above, but saves image file for job sharing if built locally\n```\n\n**ARM64 systems (Apple Silicon):**\n```bash\n./acquire-build-image\n# → Skips remote pull → Builds locally (architecture mismatch)\n```\n\n## docker-image-hash\n\n**Purpose**: Generates a unique hash based on the contents of the `tools/ci-build` directory. Used to create consistent Docker image tags.\n\n### Usage\n\n```bash\n./docker-image-hash\n# Outputs: a1b2c3d4e5f6... (git hash of tools/ci-build directory)\n```\n\n### Output\n- Prints a git hash to stdout based on all files in `tools/ci-build`\n- Hash changes only when build configuration files are modified\n- Used by `acquire-build-image` to determine image tags\n\n## upload-build-image.sh\n\n**Purpose**: Uploads a local Docker build image to AWS ECR with proper authentication and tagging.\n\n### Usage\n\n```bash\n# Upload with specific tag\n./upload-build-image.sh <tag-name>\n\n# Dry run (skip actual push)\nDRY_RUN=true ./upload-build-image.sh <tag-name>\n\n# Use alternative OCI executable\nOCI_EXE=podman ./upload-build-image.sh <tag-name>\n```\n\n### Environment Variables\n- `DRY_RUN` - Skip push to ECR (default: `false`)\n- `OCI_EXE` - Docker-compatible executable (default: `docker`)\n\n### Behavior\n1. Authenticates with AWS ECR using AWS CLI\n2. Tags local `smithy-rs-build-image:latest` as `<account>.dkr.ecr.us-west-2.amazonaws.com/smithy-rs-build-image:<tag>`\n3. Pushes tagged image to ECR (unless `DRY_RUN=true`)\n\n### Requirements\n- AWS CLI configured with appropriate permissions\n- Local image `smithy-rs-build-image:latest` must exist\n"
  },
  {
    "path": ".github/scripts/acquire-build-image",
    "content": "#!/usr/bin/env -S python3 -u\n#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n\nfrom enum import Enum\nfrom unittest.mock import call, MagicMock\nimport os\nimport shlex\nimport subprocess\nimport sys\nimport time\nimport unittest\nimport base64\n\nAWS_ACCOUNT_ID=\"686190543447\"\nAWS_REGION=\"us-west-2\"\nECR_REPOSITORY=\"smithy-rs-build-image\"\nREMOTE_BASE_IMAGE_NAME = f\"{AWS_ACCOUNT_ID}.dkr.ecr.{AWS_REGION}.amazonaws.com/{ECR_REPOSITORY}\"\nLOCAL_BASE_IMAGE_NAME = \"smithy-rs-base-image\"\nLOCAL_TAG = \"local\"\n\nC_YELLOW = '\\033[1;33m'\nC_RESET = '\\033[0m'\n\n\ndef announce(message):\n    print(f\"{C_YELLOW}{message}{C_RESET}\")\n\n\nclass DockerPullResult(Enum):\n    SUCCESS = 1\n    REMOTE_ARCHITECTURE_MISMATCH = 2\n    ERROR_THROTTLED = 3\n    RETRYABLE_ERROR = 4\n    NOT_FOUND = 5\n    UNKNOWN_ERROR = 6\n    UNAUTHENTICATED = 7\n\n\nclass Platform(Enum):\n    X86_64 = 0\n    ARM_64 = 1\n\n\ndef oci_exe():\n    return os.getenv(\"OCI_EXE\", \"docker\")\n\n# Script context\nclass Context:\n    def __init__(self, start_path, script_path, tools_path, user_id, image_tag, allow_local_build, github_actions,\n                 encrypted_docker_password, docker_passphrase):\n        self.start_path = start_path\n        self.script_path = script_path\n        self.tools_path = tools_path\n        self.docker_image_path = tools_path + \"/ci-build\"\n        self.user_id = user_id\n        self.image_tag = image_tag\n        self.allow_local_build = allow_local_build\n        self.github_actions = github_actions\n        self.encrypted_docker_password = encrypted_docker_password\n        self.docker_passphrase = docker_passphrase\n\n    @staticmethod\n    def default():\n        start_path = os.path.realpath(os.curdir)\n        script_path = os.path.dirname(os.path.realpath(__file__))\n        tools_path = get_cmd_output(\"git rev-parse --show-toplevel\", cwd=script_path)[1] + \"/tools\"\n        user_id = get_cmd_output(\"id -u\")[1]\n        tools_image_hash = get_cmd_output(\"./docker-image-hash\", cwd=script_path)[1]\n        image_tag = f\"ci-{tools_image_hash}\"\n        allow_local_build = os.getenv(\"ALLOW_LOCAL_BUILD\") != \"false\"\n        github_actions = os.getenv(\"GITHUB_ACTIONS\") == \"true\"\n        encrypted_docker_password = os.getenv(\"ENCRYPTED_DOCKER_PASSWORD\") or None\n        docker_passphrase = os.getenv(\"DOCKER_LOGIN_TOKEN_PASSPHRASE\") or None\n\n        print(f\"Start path: {start_path}\")\n        print(f\"Script path: {script_path}\")\n        print(f\"Tools path: {tools_path}\")\n        print(f\"User ID: {user_id}\")\n        print(f\"Required base image tag: {image_tag}\")\n        print(f\"Allow local build: {allow_local_build}\")\n        print(f\"Running in GitHub Actions: {github_actions}\")\n        return Context(start_path=start_path, script_path=script_path, tools_path=tools_path, user_id=user_id,\n                       image_tag=image_tag, allow_local_build=allow_local_build, github_actions=github_actions,\n                       encrypted_docker_password=encrypted_docker_password, docker_passphrase=docker_passphrase)\n\n\ndef output_contains_any(stdout, stderr, messages):\n    for message in messages:\n        if message in stdout or message in stderr:\n            return True\n    return False\n\n# Mockable shell commands\nclass Shell:\n    # Returns the platform that this script is running on\n    def platform(self):\n        (_, stdout, _) = get_cmd_output(\"uname -m\")\n        if stdout == \"arm64\":\n            return Platform.ARM_64\n        return Platform.X86_64\n\n    # Returns True if the given `image_name` and `image_tag` exist locally\n    def docker_image_exists_locally(self, image_name, image_tag):\n        (status, _, _) = get_cmd_output(f\"{oci_exe()} inspect \\\"{image_name}:{image_tag}\\\"\", check=False)\n        return status == 0\n\n    def docker_login(self, password):\n        get_cmd_output(f\"{oci_exe()} login --username AWS --password-stdin {AWS_ACCOUNT_ID}.dkr.ecr.{AWS_REGION}.amazonaws.com\", input=password.encode('utf-8'))\n\n    # Pulls the requested `image_name` with `image_tag`. Returns `DockerPullResult`.\n    def docker_pull(self, image_name, image_tag):\n        (status, stdout, stderr) = get_cmd_output(f\"{oci_exe()} pull \\\"{image_name}:{image_tag}\\\"\", check=False)\n        print(f\"{oci_exe()} pull output:\")\n        print(\"------STDOUT---------\")\n        print(stdout)\n        print(\"------STDERR---------\")\n        print(stderr)\n        print(\"-------------------\")\n\n        not_found_messages = [\"not found: manifest unknown\"]\n        throttle_messages = [\"toomanyrequests:\"]\n        retryable_messages = [\"net/http: TLS handshake timeout\"]\n        unauthenticated_messages = [\"no basic auth credentials\"]\n        if status == 0:\n            return DockerPullResult.SUCCESS\n\n        print(f\"{oci_exe()} pull status: {status}\")\n        if output_contains_any(stdout, stderr, throttle_messages):\n            return DockerPullResult.ERROR_THROTTLED\n        elif output_contains_any(stdout, stderr, not_found_messages):\n            return DockerPullResult.NOT_FOUND\n        elif output_contains_any(stdout, stderr, retryable_messages):\n            return DockerPullResult.RETRYABLE_ERROR\n        elif output_contains_any(stdout, stderr, unauthenticated_messages):\n            return DockerPullResult.UNAUTHENTICATED\n        return DockerPullResult.UNKNOWN_ERROR\n\n    # Builds the base image with the Dockerfile in `path` and tags with with `image_tag`\n    def docker_build_base_image(self, image_tag, path):\n        run(f\"{oci_exe()} build -t \\\"smithy-rs-base-image:{image_tag}\\\" .\", cwd=path)\n\n    # Builds the local build image\n    def docker_build_build_image(self, user_id, docker_image_path):\n        run(\n            f\"{oci_exe()} build -t smithy-rs-build-image --file add-local-user.dockerfile --build-arg=USER_ID={user_id} .\",\n            cwd=docker_image_path\n        )\n\n    # Saves the Docker image named `image_name` with `image_tag` to `output_path`\n    def docker_save(self, image_name, image_tag, output_path):\n        run(f\"{oci_exe()} save -o \\\"{output_path}\\\" \\\"{image_name}:{image_tag}\\\"\")\n\n    # Tags an image with a new image name and tag\n    def docker_tag(self, image_name, image_tag, new_image_name, new_image_tag):\n        run(f\"{oci_exe()} tag \\\"{image_name}:{image_tag}\\\" \\\"{new_image_name}:{new_image_tag}\\\"\")\n\n\n# Pulls a Docker image and retries if it gets throttled\ndef docker_pull_with_retry(shell, image_name, image_tag, throttle_sleep_time=120, retryable_error_sleep_time=1):\n    if shell.platform() == Platform.ARM_64:\n        return DockerPullResult.REMOTE_ARCHITECTURE_MISMATCH\n    for attempt in range(1, 6):\n        announce(f\"Attempting to pull remote image {image_name}:{image_tag} (attempt {attempt})...\")\n        result = shell.docker_pull(image_name, image_tag)\n        if result == DockerPullResult.ERROR_THROTTLED:\n            announce(\"Pull failed due to throttling. Waiting and trying again...\")\n            time.sleep(throttle_sleep_time)\n        elif result == DockerPullResult.RETRYABLE_ERROR:\n            announce(\"A retryable error occurred. Trying again...\")\n            time.sleep(retryable_error_sleep_time)\n        else:\n            return result\n    # Hit max retries; the image probably exists, but we are getting throttled hard. Fail.\n    announce(\"Image pulling throttled for too many attempts. The remote image might exist, but we can't get it.\")\n    return DockerPullResult.ERROR_THROTTLED\n\n\n# Runs a shell command\ndef run(command, cwd=None):\n    subprocess.run(shlex.split(command), stdout=sys.stderr, stderr=sys.stderr, cwd=cwd, check=True)\n\n\n# Returns (status, output) from a shell command\ndef get_cmd_output(command, cwd=None, check=True, **kwargs):\n    if isinstance(command, str):\n        command = shlex.split(command)\n\n    result = subprocess.run(\n        command,\n        capture_output=True,\n        check=False,\n        cwd=cwd,\n        **kwargs\n    )\n    stdout = result.stdout.decode(\"utf-8\").strip()\n    stderr = result.stderr.decode(\"utf-8\").strip()\n    if check and result.returncode != 0:\n        raise Exception(f\"failed to run '{command}.\\n{stdout}\\n{stderr}\")\n\n    return result.returncode, stdout, stderr\n\n\ndef decrypt_and_login(shell, secret, passphrase):\n    decoded = base64.b64decode(secret, validate=True)\n    if not passphrase:\n        raise Exception(\"a secret was set but no passphrase was set (or it was empty)\")\n    (code, password, err) = get_cmd_output(\n        [\"gpg\", \"--decrypt\", \"--batch\", \"--quiet\", \"--passphrase\", passphrase, \"--output\", \"-\"],\n        input=decoded)\n    shell.docker_login(password)\n    print(f\"{oci_exe()} login success!\")\n\n\ndef acquire_build_image(context=Context.default(), shell=Shell()):\n    if context.encrypted_docker_password is not None:\n        decrypt_and_login(shell, context.encrypted_docker_password, context.docker_passphrase)\n    # If the image doesn't already exist locally, then look remotely\n    if not shell.docker_image_exists_locally(LOCAL_BASE_IMAGE_NAME, context.image_tag):\n        announce(\"Base image not found locally.\")\n        pull_result = docker_pull_with_retry(shell, REMOTE_BASE_IMAGE_NAME, context.image_tag)\n        if pull_result != DockerPullResult.SUCCESS:\n            if pull_result == DockerPullResult.REMOTE_ARCHITECTURE_MISMATCH:\n                announce(\"Remote architecture is not the same as the local architecture. A local build is required.\")\n            elif pull_result == DockerPullResult.UNKNOWN_ERROR:\n                announce(\"An unknown failure happened during Docker pull. This needs to be examined.\")\n                return 1\n            elif pull_result == DockerPullResult.UNAUTHENTICATED:\n                announce(\"Unable to authenticate and pull image from remote repository. A local build is required.\")\n            else:\n                announce(\"Failed to pull remote image, which can happen if it doesn't exist.\")\n\n            if not context.allow_local_build:\n                announce(\"Local build turned off by ALLOW_LOCAL_BUILD env var. Aborting.\")\n                return 1\n\n            announce(\"Building a new image locally.\")\n            shell.docker_build_base_image(context.image_tag, context.docker_image_path)\n\n            if context.github_actions:\n                announce(\"Saving base image for use in later jobs...\")\n                shell.docker_save(\n                    LOCAL_BASE_IMAGE_NAME,\n                    context.image_tag,\n                    context.start_path + \"/smithy-rs-base-image\"\n                )\n        else:\n            announce(\"Successfully pulled remote image!\")\n            shell.docker_tag(REMOTE_BASE_IMAGE_NAME, context.image_tag, LOCAL_BASE_IMAGE_NAME, context.image_tag)\n    else:\n        announce(\"Base image found locally! No retrieval or rebuild necessary.\")\n\n    announce(\"Creating local build image...\")\n    shell.docker_tag(LOCAL_BASE_IMAGE_NAME, context.image_tag, LOCAL_BASE_IMAGE_NAME, LOCAL_TAG)\n    shell.docker_build_build_image(context.user_id, context.docker_image_path)\n    return 0\n\n\nclass SelfTest(unittest.TestCase):\n    def test_context(self, github_actions=False, allow_local_build=False, encrypted_docker_password=None,\n                     docker_passphrase=None):\n        return Context(\n            start_path=\"/tmp/test/start-path\",\n            script_path=\"/tmp/test/script-path\",\n            tools_path=\"/tmp/test/tools-path\",\n            user_id=\"123\",\n            image_tag=\"someimagetag\",\n            encrypted_docker_password=encrypted_docker_password,\n            docker_passphrase=docker_passphrase,\n            github_actions=github_actions,\n            allow_local_build=allow_local_build,\n        )\n\n    def mock_shell(self):\n        shell = Shell()\n        shell.platform = MagicMock()\n        shell.docker_build_base_image = MagicMock()\n        shell.docker_build_build_image = MagicMock()\n        shell.docker_image_exists_locally = MagicMock()\n        shell.docker_pull = MagicMock()\n        shell.docker_save = MagicMock()\n        shell.docker_tag = MagicMock()\n        shell.docker_login = MagicMock()\n        return shell\n\n    def test_retry_architecture_mismatch(self):\n        shell = self.mock_shell()\n        shell.platform.side_effect = [Platform.ARM_64]\n        self.assertEqual(\n            DockerPullResult.REMOTE_ARCHITECTURE_MISMATCH,\n            docker_pull_with_retry(\n                shell,\n                \"test-image\",\n                \"test-image-tag\",\n                throttle_sleep_time=0,\n                retryable_error_sleep_time=0\n            )\n        )\n\n    def test_docker_login(self):\n        shell = self.mock_shell()\n        acquire_build_image(self.test_context(\n            encrypted_docker_password=\"jA0ECQMCvYU/JxsX3g/70j0BxbLLW8QaFWWb/DqY9gPhTuEN/xdYVxaoDnV6Fha+lAWdT7xN0qZr5DHPBalLfVvvM1SEXRBI8qnfXyGI\",\n            docker_passphrase=\"secret\"), shell)\n        shell.docker_login.assert_called_with(\"payload\")\n\n    def test_retry_immediate_success(self):\n        shell = self.mock_shell()\n        shell.docker_pull.side_effect = [DockerPullResult.SUCCESS]\n        self.assertEqual(\n            DockerPullResult.SUCCESS,\n            docker_pull_with_retry(\n                shell,\n                \"test-image\",\n                \"test-image-tag\",\n                throttle_sleep_time=0,\n                retryable_error_sleep_time=0\n            )\n        )\n\n    def test_retry_immediate_not_found(self):\n        shell = self.mock_shell()\n        shell.docker_pull.side_effect = [DockerPullResult.NOT_FOUND]\n        self.assertEqual(\n            DockerPullResult.NOT_FOUND,\n            docker_pull_with_retry(\n                shell,\n                \"test-image\",\n                \"test-image-tag\",\n                throttle_sleep_time=0,\n                retryable_error_sleep_time=0\n            )\n        )\n\n    def test_retry_immediate_unknown_error(self):\n        shell = self.mock_shell()\n        shell.docker_pull.side_effect = [DockerPullResult.UNKNOWN_ERROR]\n        self.assertEqual(\n            DockerPullResult.UNKNOWN_ERROR,\n            docker_pull_with_retry(\n                shell,\n                \"test-image\",\n                \"test-image-tag\",\n                throttle_sleep_time=0,\n                retryable_error_sleep_time=0\n            )\n        )\n\n    def test_retry_throttling_then_success(self):\n        shell = self.mock_shell()\n        shell.docker_pull.side_effect = [\n            DockerPullResult.ERROR_THROTTLED,\n            DockerPullResult.ERROR_THROTTLED,\n            DockerPullResult.SUCCESS\n        ]\n        self.assertEqual(\n            DockerPullResult.SUCCESS,\n            docker_pull_with_retry(\n                shell,\n                \"test-image\",\n                \"test-image-tag\",\n                throttle_sleep_time=0,\n                retryable_error_sleep_time=0\n            )\n        )\n\n    def test_retry_throttling_and_retryable_error_then_success(self):\n        shell = self.mock_shell()\n        shell.docker_pull.side_effect = [\n            DockerPullResult.ERROR_THROTTLED,\n            DockerPullResult.RETRYABLE_ERROR,\n            DockerPullResult.ERROR_THROTTLED,\n            DockerPullResult.SUCCESS\n        ]\n        self.assertEqual(\n            DockerPullResult.SUCCESS,\n            docker_pull_with_retry(\n                shell,\n                \"test-image\",\n                \"test-image-tag\",\n                throttle_sleep_time=0,\n                retryable_error_sleep_time=0\n            )\n        )\n\n    def test_retry_throttling_then_not_found(self):\n        shell = self.mock_shell()\n        shell.docker_pull.side_effect = [\n            DockerPullResult.ERROR_THROTTLED,\n            DockerPullResult.NOT_FOUND\n        ]\n        self.assertEqual(\n            DockerPullResult.NOT_FOUND,\n            docker_pull_with_retry(\n                shell,\n                \"test-image\",\n                \"test-image-tag\",\n                throttle_sleep_time=0,\n                retryable_error_sleep_time=0\n            )\n        )\n\n    def test_retry_max_attempts(self):\n        shell = self.mock_shell()\n        shell.docker_pull.side_effect = [\n            DockerPullResult.ERROR_THROTTLED,\n            DockerPullResult.ERROR_THROTTLED,\n            DockerPullResult.ERROR_THROTTLED,\n            DockerPullResult.ERROR_THROTTLED,\n            DockerPullResult.ERROR_THROTTLED,\n        ]\n        self.assertEqual(\n            DockerPullResult.ERROR_THROTTLED,\n            docker_pull_with_retry(\n                shell,\n                \"test-image\",\n                \"test-image-tag\",\n                throttle_sleep_time=0,\n                retryable_error_sleep_time=0\n            )\n        )\n\n    # When: the base image already exists locally with the right image tag\n    # It should: build a local build image using that local base image\n    def test_image_exists_locally_already(self):\n        shell = self.mock_shell()\n        shell.platform.side_effect = [Platform.X86_64]\n        shell.docker_image_exists_locally.side_effect = [True]\n\n        self.assertEqual(0, acquire_build_image(self.test_context(), shell))\n\n        shell.docker_image_exists_locally.assert_called_once()\n        shell.docker_tag.assert_called_with(LOCAL_BASE_IMAGE_NAME, \"someimagetag\", LOCAL_BASE_IMAGE_NAME, LOCAL_TAG)\n        shell.docker_build_build_image.assert_called_with(\"123\", \"/tmp/test/tools-path/ci-build\")\n\n    # When:\n    #  - the base image doesn't exist locally\n    #  - the base image doesn't exist remotely\n    #  - local builds are allowed\n    #  - NOT running in GitHub Actions\n    # It should: build a local image from scratch and NOT save it to file\n    def test_image_local_build(self):\n        context = self.test_context(allow_local_build=True)\n        shell = self.mock_shell()\n        shell.platform.side_effect = [Platform.X86_64]\n        shell.docker_image_exists_locally.side_effect = [False]\n        shell.docker_pull.side_effect = [DockerPullResult.NOT_FOUND]\n\n        self.assertEqual(0, acquire_build_image(context, shell))\n        shell.docker_image_exists_locally.assert_called_once()\n        shell.docker_build_base_image.assert_called_with(\"someimagetag\", \"/tmp/test/tools-path/ci-build\")\n        shell.docker_save.assert_not_called()\n        shell.docker_tag.assert_called_with(LOCAL_BASE_IMAGE_NAME, \"someimagetag\", LOCAL_BASE_IMAGE_NAME, LOCAL_TAG)\n        shell.docker_build_build_image.assert_called_with(\"123\", \"/tmp/test/tools-path/ci-build\")\n\n    # When:\n    #  - the base image doesn't exist locally\n    #  - the base image exists remotely\n    #  - local builds are allowed\n    #  - there is a difference in platform between local and remote\n    #  - NOT running in GitHub Actions\n    # It should: build a local image from scratch and NOT save it to file\n    def test_image_local_build_architecture_mismatch(self):\n        context = self.test_context(allow_local_build=True)\n        shell = self.mock_shell()\n        shell.platform.side_effect = [Platform.ARM_64]\n        shell.docker_image_exists_locally.side_effect = [False]\n\n        self.assertEqual(0, acquire_build_image(context, shell))\n        shell.docker_image_exists_locally.assert_called_once()\n        shell.docker_build_base_image.assert_called_with(\"someimagetag\", \"/tmp/test/tools-path/ci-build\")\n        shell.docker_save.assert_not_called()\n        shell.docker_tag.assert_called_with(LOCAL_BASE_IMAGE_NAME, \"someimagetag\", LOCAL_BASE_IMAGE_NAME, LOCAL_TAG)\n        shell.docker_build_build_image.assert_called_with(\"123\", \"/tmp/test/tools-path/ci-build\")\n\n    # When:\n    #  - the base image doesn't exist locally\n    #  - the base image doesn't exist remotely\n    #  - local builds are allowed\n    #  - running in GitHub Actions\n    # It should: build a local image from scratch and save it to file\n    def test_image_local_build_github_actions(self):\n        context = self.test_context(allow_local_build=True, github_actions=True)\n        shell = self.mock_shell()\n        shell.platform.side_effect = [Platform.X86_64]\n        shell.docker_image_exists_locally.side_effect = [False]\n        shell.docker_pull.side_effect = [DockerPullResult.NOT_FOUND]\n\n        self.assertEqual(0, acquire_build_image(context, shell))\n        shell.docker_image_exists_locally.assert_called_once()\n        shell.docker_build_base_image.assert_called_with(\"someimagetag\", \"/tmp/test/tools-path/ci-build\")\n        shell.docker_save.assert_called_with(\n            LOCAL_BASE_IMAGE_NAME,\n            \"someimagetag\",\n            \"/tmp/test/start-path/smithy-rs-base-image\"\n        )\n        shell.docker_tag.assert_called_with(LOCAL_BASE_IMAGE_NAME, \"someimagetag\", LOCAL_BASE_IMAGE_NAME, LOCAL_TAG)\n        shell.docker_build_build_image.assert_called_with(\"123\", \"/tmp/test/tools-path/ci-build\")\n\n    # When:\n    #  - the base image doesn't exist locally\n    #  - the base image doesn't exist remotely\n    #  - local builds are NOT allowed\n    # It should: fail since local builds are not allowed\n    def test_image_fail_local_build_disabled(self):\n        context = self.test_context(allow_local_build=False)\n        shell = self.mock_shell()\n        shell.platform.side_effect = [Platform.X86_64]\n        shell.docker_image_exists_locally.side_effect = [False]\n        shell.docker_pull.side_effect = [DockerPullResult.NOT_FOUND]\n\n        self.assertEqual(1, acquire_build_image(context, shell))\n        shell.docker_image_exists_locally.assert_called_once()\n        shell.docker_build_base_image.assert_not_called()\n        shell.docker_save.assert_not_called()\n        shell.docker_tag.assert_not_called()\n        shell.docker_build_build_image.assert_not_called()\n\n    # When:\n    #  - the base image doesn't exist locally\n    #  - the base image exists remotely\n    # It should: pull the remote image and tag it\n    def test_pull_remote_image(self):\n        context = self.test_context(allow_local_build=False)\n        shell = self.mock_shell()\n        shell.platform.side_effect = [Platform.X86_64]\n        shell.docker_image_exists_locally.side_effect = [False]\n        shell.docker_pull.side_effect = [DockerPullResult.SUCCESS]\n\n        self.assertEqual(0, acquire_build_image(context, shell))\n        shell.docker_image_exists_locally.assert_called_once()\n        shell.docker_build_base_image.assert_not_called()\n        shell.docker_save.assert_not_called()\n        shell.docker_tag.assert_has_calls([\n            call(REMOTE_BASE_IMAGE_NAME, \"someimagetag\", LOCAL_BASE_IMAGE_NAME, \"someimagetag\"),\n            call(LOCAL_BASE_IMAGE_NAME, \"someimagetag\", LOCAL_BASE_IMAGE_NAME, LOCAL_TAG)\n        ])\n        shell.docker_build_build_image.assert_called_with(\"123\", \"/tmp/test/tools-path/ci-build\")\n\n\ndef main():\n    # Run unit tests if given `--self-test` argument\n    if len(sys.argv) > 1 and sys.argv[1] == \"--self-test\":\n        sys.argv.pop()\n        unittest.main()\n    else:\n        sys.exit(acquire_build_image())\n\n\nif __name__ == \"__main__\":\n    main()\n"
  },
  {
    "path": ".github/scripts/docker-image-hash",
    "content": "#!/bin/bash\n#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n\n# Outputs the git hash of the `tools/` directory.\n# The tools git hash is used to tag the Docker build images that get uploaded to ECR.\n\nset -eo pipefail\n\ncd \"$(dirname \"$0\")\"\ncd \"$(git rev-parse --show-toplevel)\"\n\ngit ls-files -s --full-name \"tools/ci-build\" | git hash-object --stdin\n"
  },
  {
    "path": ".github/scripts/get-or-create-release-branch.sh",
    "content": "#!/bin/bash\n#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\nset -eux\n\n# The script populates an output file with key-value pairs that are needed in the release CI workflow to carry out\n# the next steps in the release flow: the name of the release branch and a boolean flag that is set to 'true' if this\n# is the beginning of a new release series.\n\nif [ -z \"$1\" ]; then\n  echo \"You need to specify the path of the file where you want to collect the output\"\n  exit 1\nelse\n  output_file=\"$1\"\nfi\n\nbranch_name=\"smithy-rs-release-1.x.y\"\n\nif [[ \"${DRY_RUN}\" == \"true\" ]]; then\n  branch_name=\"${branch_name}-preview\"\nfi\necho \"release_branch=${branch_name}\" >\"${output_file}\"\n\ncommit_sha=$(git rev-parse --short HEAD)\n# the git repo is in a weird state because **main has never been checked out**!\n# This prevents the `git branch --contains` from working because there is no _local_ ref for main\ngit checkout main\ngit checkout \"${commit_sha}\"\nif ! git ls-remote --exit-code --heads origin \"${branch_name}\"; then\n  # The release branch does not exist.\n  # We need to make sure that the commit SHA that we are releasing is on `main`.\n  git fetch origin main\n  echo \"Branches: \"\n  git branch --contains \"${commit_sha}\"\n  git show origin/main | head -n 1\n  if git branch --contains \"${commit_sha}\" | grep main; then\n    # We can then create the release branch and set the current commit as its tip\n    if [[ \"${DRY_RUN}\" == \"true\" ]]; then\n      git push --force origin \"HEAD:refs/heads/${branch_name}\"\n    else\n      git checkout -b \"${branch_name}\"\n      git push origin \"${branch_name}\"\n    fi\n  else\n    echo \"You must choose a commit from main to create a new release branch!\"\n    exit 1\n  fi\nelse\n  echo \"Patch release ${branch_name} already exists\"\nfi\n"
  },
  {
    "path": ".github/scripts/upload-build-image.sh",
    "content": "#!/bin/bash\n#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\nset -eux\n\nif [ $# -ne 1 ]; then\n    echo \"Error: Tag name is required\"\n    echo \"Usage: $0 <tag-name>\"\n    exit 1\nfi\n\n# Set OCI executor - default to docker if not set\n: \"${OCI_EXE:=docker}\"\n\nDRY_RUN=${DRY_RUN:-false}\nTAG_NAME=$1\nAWS_REGION=\"us-west-2\"\nAWS_ACCOUNT_ID=\"686190543447\"\nECR_REPOSITORY=\"smithy-rs-build-image\"\nECR_IMAGE=\"${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/${ECR_REPOSITORY}:${TAG_NAME}\"\n\necho \"Logging in to Amazon ECR...\"\naws ecr get-login-password --region ${AWS_REGION} | ${OCI_EXE} login --username AWS --password-stdin ${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com\n\nif [ $? -ne 0 ]; then\n    echo \"Error: Failed to login to ECR\"\n    exit 1\nfi\n\necho \"Tagging image as: ${ECR_IMAGE}\"\n${OCI_EXE} tag ${ECR_REPOSITORY}:latest ${ECR_IMAGE}\n\nif [ $? -ne 0 ]; then\n    echo \"Error: Failed to tag the image\"\n    exit 1\nfi\n\nif [[ \"${DRY_RUN}\" == \"true\" ]]; then\n  echo \"Dry run enabled - skipping push to ECR\"\n  exit 0\nelse\n  echo \"Pushing image to ECR...\"\n  ${OCI_EXE} push ${ECR_IMAGE}\n\n  if [ $? -ne 0 ]; then\n      echo \"Error: Failed to push the image\"\n      exit 1\n  fi\n\n  echo \"Successfully uploaded image to ECR: ${ECR_IMAGE}\"\nfi\n"
  },
  {
    "path": ".github/workflows/backport-pull-request.yml",
    "content": "# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n\nname: Open a backport PR to merge the release branch into main\n\non:\n  # automatically called by release.yml\n  workflow_dispatch:\n  # can also be manually triggered when a patch fix is merged into the release branch and needs to be back-ported\n  workflow_call:\n    secrets:\n      RELEASE_AUTOMATION_BOT_PAT:\n        required: true\n\nenv:\n  release_branch: smithy-rs-release-1.x.y\n\njobs:\n  create-backport-pull-request:\n    runs-on: ubuntu-latest\n    steps:\n    - uses: GitHubSecurityLab/actions-permissions/monitor@v1\n    - name: Checkout\n      uses: actions/checkout@v4\n      with:\n        token: ${{ secrets.RELEASE_AUTOMATION_BOT_PAT }}\n\n    - name: Prepare backport branch\n      id: backport-branch\n      run: |\n        # This step assumes the merge runs cleanly without conflicts, which should be the case when\n        # this workflow is called by the release workflow right after a release tag has been created.\n        git config --local user.name \"AWS SDK Rust Bot\"\n        git config --local user.email \"aws-sdk-rust-primary@amazon.com\"\n\n        git fetch --unshallow\n        git checkout origin/main\n        backport_branch=\"merge-${{ env.release_branch }}-to-main-$(date +%s)\"\n        git checkout -b \"${backport_branch}\"\n\n        git merge \"origin/${{ env.release_branch }}\" -m 'Merge remote-tracking branch \"origin/${{ env.release_branch }}\" into \"merge-${{ env.release_branch }}-to-main\"'\n        git push origin HEAD\n\n        echo \"branch_name=${backport_branch}\" > $GITHUB_OUTPUT\n\n    - name: Create pull request\n      env:\n        GITHUB_TOKEN: ${{ secrets.RELEASE_AUTOMATION_BOT_PAT }}\n      run: |\n        gh pr create \\\n          --title \"Merge ${{ env.release_branch }} into main\" \\\n          --body \"Merge it with \\`gh pr merge --admin --merge\\` or manually merge it with the merge commit (not squash merge).\" \\\n          --base main \\\n          --head ${{ steps.backport-branch.outputs.branch_name }} \\\n          --label \"needs-sdk-review\" \\\n          --draft\n"
  },
  {
    "path": ".github/workflows/ci-main.yml",
    "content": "# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n\n# This workflow differs from PR CI in that it uploads a Docker build image to public ECR.\n# This should be done only on push to main so that PRs from forks can successfully run CI\n# since GitHub secrets cannot be shared with a PR from a fork.\nname: CI on Branch `main`\non:\n  workflow_dispatch:\n  push:\n    branches: [main]\n\n# Allow only one Docker build image build to run at a time for the entire smithy-rs repo\nconcurrency:\n  group: ci-main-yml\n  cancel-in-progress: true\n\npermissions:\n  actions: read\n  contents: read\n  id-token: write\n  pull-requests: read\n\njobs:\n  # Build and upload the Docker build image if necessary\n  acquire-base-image:\n    runs-on: smithy_ubuntu-latest_8-core\n    name: Acquire Base Image\n    timeout-minutes: 60\n    outputs:\n      docker-login-password: ${{ steps.set-token.outputs.docker-login-password }}\n    permissions:\n      id-token: write\n      contents: read\n    steps:\n    - uses: GitHubSecurityLab/actions-permissions/monitor@v1\n    - name: Checkout\n      uses: actions/checkout@v4\n    - uses: ./.github/actions/free-disk-space\n    - name: Acquire credentials\n      uses: aws-actions/configure-aws-credentials@v4\n      with:\n        role-to-assume: ${{ secrets.SMITHY_RS_ECR_PUSH_ROLE_ARN }}\n        role-session-name: GitHubActions\n        aws-region: us-west-2\n    - name: Save the docker login password to the output\n      id: set-token\n      run: |\n        ENCRYPTED_PAYLOAD=$(\n          gpg --symmetric --batch --passphrase \"${{ secrets.DOCKER_LOGIN_TOKEN_PASSPHRASE }}\" --output - <(aws ecr get-login-password --region us-west-2) | base64 -w0\n        )\n        echo \"docker-login-password=$ENCRYPTED_PAYLOAD\" >> $GITHUB_OUTPUT\n    - name: Acquire base image\n      id: acquire\n      env:\n        DOCKER_BUILDKIT: 1\n        ENCRYPTED_DOCKER_PASSWORD: ${{ steps.set-token.outputs.docker-login-password }}\n        DOCKER_LOGIN_TOKEN_PASSPHRASE: ${{ secrets.DOCKER_LOGIN_TOKEN_PASSPHRASE }}\n      run: ./.github/scripts/acquire-build-image\n    - name: Tag and upload image\n      run: |\n        pwd\n        IMAGE_TAG=\"ci-$(./.github/scripts/docker-image-hash)\"\n        ./.github/scripts/upload-build-image.sh $IMAGE_TAG\n\n  # Run the shared CI after a Docker build image has been uploaded to ECR\n  ci:\n    needs: acquire-base-image\n    uses: ./.github/workflows/ci.yml\n    secrets:\n      ENCRYPTED_DOCKER_PASSWORD: ${{ needs.acquire-base-image.outputs.docker-login-password }}\n      DOCKER_LOGIN_TOKEN_PASSPHRASE: ${{ secrets.DOCKER_LOGIN_TOKEN_PASSPHRASE }}\n      CANARY_GITHUB_ACTIONS_ROLE_ARN: ${{ secrets.CANARY_GITHUB_ACTIONS_ROLE_ARN }}\n      CANARY_STACK_CDK_OUTPUTS_BUCKET_NAME: ${{ secrets.CANARY_STACK_CDK_OUTPUTS_BUCKET_NAME }}\n"
  },
  {
    "path": ".github/workflows/ci-pr-forks.yml",
    "content": "# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n\n# This workflow runs CI for pull requests from forks, which can't make use of secrets.\n\nname: CI (from fork)\non:\n  pull_request:\n\n# Allow one instance of this workflow per pull request, and cancel older runs when new changes are pushed\nconcurrency:\n  group: ci-forks-yaml-${{ github.ref }}\n  cancel-in-progress: true\n\npermissions:\n  actions: read\n  contents: read\n  id-token: write\n  pull-requests: read\n\njobs:\n  # Forks do not have access to private ECR repository. Image is built locally\n  # and uploaded as a build artifact for other jobs to download and use.\n  acquire-base-image:\n    name: Acquire Base Image\n    if: ${{ github.event.pull_request.head.repo.full_name != 'smithy-lang/smithy-rs' }}\n    permissions:\n      id-token: write\n      contents: read\n    runs-on: smithy_ubuntu-latest_8-core\n    timeout-minutes: 90\n    steps:\n    - uses: GitHubSecurityLab/actions-permissions/monitor@v1\n    - uses: actions/checkout@v4\n      with:\n        path: smithy-rs\n    - uses: ./smithy-rs/.github/actions/free-disk-space\n    - name: Acquire base image\n      id: acquire\n      env:\n        DOCKER_BUILDKIT: 1\n      run: ./smithy-rs/.github/scripts/acquire-build-image\n    - name: Upload base image\n      uses: actions/upload-artifact@v4\n      with:\n        name: smithy-rs-base-image\n        path: smithy-rs-base-image\n        retention-days: 1\n\n  # Run shared CI after the Docker build image has been built locally\n  ci:\n    needs: acquire-base-image\n    if: ${{ github.event.pull_request.head.repo.full_name != 'smithy-lang/smithy-rs' }}\n    uses: ./.github/workflows/ci.yml\n    with:\n      run_canary: false\n\n  semver-checks:\n    name: Check PR semver compliance\n    permissions:\n      pull-requests: read\n    runs-on: smithy_ubuntu-latest_8-core\n    timeout-minutes: 30\n    needs:\n    - acquire-base-image\n    if: |\n      always() &&\n      !contains(needs.*.result, 'failure') &&\n      !contains(needs.*.result, 'cancelled') &&\n      github.event.pull_request.head.repo.full_name != 'smithy-lang/smithy-rs'\n    steps:\n    - uses: GitHubSecurityLab/actions-permissions/monitor@v1\n    - uses: actions/checkout@v4\n      with:\n        path: smithy-rs\n        ref: ${{ inputs.git_ref }}\n    - name: Get PR info\n      id: check-breaking-label\n      uses: actions/github-script@v7\n      with:\n        script: |\n          const response = await github.rest.pulls.get({\n            pull_number: context.issue.number,\n            owner: context.repo.owner,\n            repo: context.repo.repo,\n          });\n          const labels = response.data.labels.map(l => l.name);\n          const isBreaking = labels.includes(\"breaking-change\");\n          const data = {\n            labels,\n            isBreaking\n          };\n          console.log(\"data:\", data);\n          return data;\n    - name: Run semver check\n      uses: ./smithy-rs/.github/actions/docker-build\n      with:\n        action: check-semver\n        action-arguments: ${{ github.event.pull_request.base.sha }} ${{ fromJSON(steps.check-breaking-label.outputs.result).isBreaking }}\n    - name: Print help message\n      if: failure()\n      run: echo \"::error::This pull request either contains breaking changes, or has cross-crate changes that may be backwards compatible, but that cargo-semver-checks cannot verify. Please scrutinize the change for backwards compatibility.\"\n"
  },
  {
    "path": ".github/workflows/ci-pr.yml",
    "content": "# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n\n# This workflow runs CI and the PR Bot on pull requests that are not from forked repositories.\n\nname: CI\non:\n  pull_request:\n\n# Allow one instance of this workflow per pull request, and cancel older runs when new changes are pushed\nconcurrency:\n  group: ci-yaml-${{ github.ref }}\n  cancel-in-progress: true\n\npermissions:\n  actions: read\n  contents: read\n  id-token: write\n  pull-requests: write\n\njobs:\n  # This job will, if possible, save a docker login password to the job outputs. The token will\n  # be encrypted with the passphrase stored as a GitHub secret. The login password expires after 12h.\n  # The login password is encrypted with the repo secret DOCKER_LOGIN_TOKEN_PASSPHRASE\n  save-docker-login-token:\n    name: Save a docker login token\n    timeout-minutes: 10\n    if: ${{ github.event.pull_request.head.repo.full_name == 'smithy-lang/smithy-rs' }}\n    outputs:\n      docker-login-password: ${{ steps.set-token.outputs.docker-login-password }}\n    permissions:\n      id-token: write\n      contents: read\n    continue-on-error: true\n    runs-on: ubuntu-latest\n    steps:\n    - uses: GitHubSecurityLab/actions-permissions/monitor@v1\n    - name: Attempt to load a docker login password\n      uses: aws-actions/configure-aws-credentials@v4\n      with:\n        role-to-assume: ${{ secrets.SMITHY_RS_ECR_PUSH_ROLE_ARN }}\n        role-session-name: GitHubActions\n        aws-region: us-west-2\n    - name: Save the docker login password to the output\n      id: set-token\n      run: |\n        ENCRYPTED_PAYLOAD=$(\n          gpg --symmetric --batch --passphrase \"${{ secrets.DOCKER_LOGIN_TOKEN_PASSPHRASE }}\" --output - <(aws ecr get-login-password --region us-west-2) | base64 -w0\n        )\n        echo \"docker-login-password=$ENCRYPTED_PAYLOAD\" >> $GITHUB_OUTPUT\n\n  # This job detects if the PR made changes to build tools. If it did, then it builds a new\n  # build Docker image. Otherwise, it downloads a build image from ECR. In both cases,\n  # it uploads the image as a build artifact for other jobs to download and use.\n  acquire-base-image:\n    name: Acquire Base Image\n    timeout-minutes: 90\n    needs: save-docker-login-token\n    if: ${{ github.event.pull_request.head.repo.full_name == 'smithy-lang/smithy-rs' }}\n    runs-on: smithy_ubuntu-latest_8-core\n    env:\n      ENCRYPTED_DOCKER_PASSWORD: ${{ needs.save-docker-login-token.outputs.docker-login-password }}\n      DOCKER_LOGIN_TOKEN_PASSPHRASE: ${{ secrets.DOCKER_LOGIN_TOKEN_PASSPHRASE }}\n    permissions:\n      id-token: write\n      contents: read\n    steps:\n    - uses: GitHubSecurityLab/actions-permissions/monitor@v1\n    - uses: actions/checkout@v4\n      with:\n        path: smithy-rs\n    - uses: ./smithy-rs/.github/actions/free-disk-space\n    - name: Acquire base image\n      id: acquire\n      env:\n        DOCKER_BUILDKIT: 1\n      run: ./smithy-rs/.github/scripts/acquire-build-image\n    - name: Acquire credentials\n      uses: aws-actions/configure-aws-credentials@v4\n      with:\n        role-to-assume: ${{ secrets.SMITHY_RS_ECR_PUSH_ROLE_ARN }}\n        role-session-name: GitHubActions\n        aws-region: us-west-2\n    - name: Upload image\n      run: |\n        IMAGE_TAG=\"ci-$(./smithy-rs/.github/scripts/docker-image-hash)\"\n        ./smithy-rs/.github/scripts/upload-build-image.sh $IMAGE_TAG\n\n  # Run shared CI after the Docker build image has either been rebuilt or found in ECR\n  ci:\n    needs:\n    - save-docker-login-token\n    - acquire-base-image\n    if: ${{ github.event.pull_request.head.repo.full_name == 'smithy-lang/smithy-rs' }}\n    uses: ./.github/workflows/ci.yml\n    secrets:\n      ENCRYPTED_DOCKER_PASSWORD: ${{ needs.save-docker-login-token.outputs.docker-login-password }}\n      DOCKER_LOGIN_TOKEN_PASSPHRASE: ${{ secrets.DOCKER_LOGIN_TOKEN_PASSPHRASE }}\n      CANARY_GITHUB_ACTIONS_ROLE_ARN: ${{ secrets.CANARY_GITHUB_ACTIONS_ROLE_ARN }}\n      CANARY_STACK_CDK_OUTPUTS_BUCKET_NAME: ${{ secrets.CANARY_STACK_CDK_OUTPUTS_BUCKET_NAME }}\n\n  # The PR bot requires a Docker build image, so make it depend on the `acquire-base-image` job.\n  pr_bot:\n    name: PR Bot\n    if: ${{ github.event.pull_request.head.repo.full_name == 'smithy-lang/smithy-rs' }}\n    needs:\n    - save-docker-login-token\n    - acquire-base-image\n    uses: ./.github/workflows/pull-request-bot.yml\n    with:\n      issue_number: ${{ github.event.number }}\n      base_revision: ${{ github.event.pull_request.base.sha }}\n      head_revision: ${{ github.event.pull_request.head.sha }}\n    secrets:\n      SMITHY_RS_PULL_REQUEST_CDN_S3_BUCKET_NAME: ${{ secrets.SMITHY_RS_PULL_REQUEST_CDN_S3_BUCKET_NAME }}\n      SMITHY_RS_PULL_REQUEST_CDN_ROLE_ARN: ${{ secrets.SMITHY_RS_PULL_REQUEST_CDN_ROLE_ARN }}\n      ENCRYPTED_DOCKER_PASSWORD: ${{ needs.save-docker-login-token.outputs.docker-login-password }}\n      DOCKER_LOGIN_TOKEN_PASSPHRASE: ${{ secrets.DOCKER_LOGIN_TOKEN_PASSPHRASE }}\n\n  semver-checks:\n    name: Check PR semver compliance\n    permissions:\n      pull-requests: read\n    runs-on: smithy_ubuntu-latest_8-core\n    timeout-minutes: 30\n    needs:\n    - save-docker-login-token\n    - acquire-base-image\n    # We need `always` here otherwise this job won't run if the previous job has been skipped\n    # See https://samanpavel.medium.com/github-actions-conditional-job-execution-e6aa363d2867\n    if: |\n      always() &&\n      !contains(needs.*.result, 'failure') &&\n      !contains(needs.*.result, 'cancelled') &&\n      github.event.pull_request.head.repo.full_name == 'smithy-lang/smithy-rs'\n    steps:\n    - uses: GitHubSecurityLab/actions-permissions/monitor@v1\n    - uses: actions/checkout@v4\n      with:\n        path: smithy-rs\n        ref: ${{ inputs.git_ref }}\n    - name: Get PR info\n      id: check-breaking-label\n      uses: actions/github-script@v7\n      with:\n        script: |\n          const response = await github.rest.pulls.get({\n            pull_number: context.issue.number,\n            owner: context.repo.owner,\n            repo: context.repo.repo,\n          });\n          const labels = response.data.labels.map(l => l.name);\n          const isBreaking = labels.includes(\"breaking-change\");\n          const data = {\n            labels,\n            isBreaking\n          };\n          console.log(\"data:\", data);\n          return data;\n    - name: Run semver check\n      env:\n        ENCRYPTED_DOCKER_PASSWORD: ${{ needs.save-docker-login-token.outputs.docker-login-password }}\n        DOCKER_LOGIN_TOKEN_PASSPHRASE: ${{ secrets.DOCKER_LOGIN_TOKEN_PASSPHRASE }}\n      uses: ./smithy-rs/.github/actions/docker-build\n      with:\n        action: check-semver\n        action-arguments: ${{ github.event.pull_request.base.sha }} ${{ fromJSON(steps.check-breaking-label.outputs.result).isBreaking }}\n    - name: Print help message\n      if: failure()\n      run: echo \"::error::This pull request either contains breaking changes, or has cross-crate changes that may be backwards compatible, but that cargo-semver-checks cannot verify. Please scrutinize the change for backwards compatibility.\"\n"
  },
  {
    "path": ".github/workflows/ci-tls.yml",
    "content": "# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n\n# This workflow tests the TLS configuration of the smithy-rs client\n# To run on an Ubuntu machine, run each step in this order.\n# Each script can be run on your Ubuntu host.\n# You will have to install Docker and rustc/cargo manually.\n\nenv:\n  rust_version: 1.68.2\n\nname: Verify client TLS configuration\non:\n  workflow_dispatch:\n  pull_request:\n  push:\n    branches: [main]\n\njobs:\n  verify-tls-config:\n    name: Verify TLS configuration\n    # TODO: GH runners recently bumped the default Ubuntu version to 24.x, this comes with an upgraded OpenSSL\n    # version that causes the python oscrypto package to throw an error: https://github.com/wbond/oscrypto/issues/78\n    # Until that package is updated we are pinning the version here.\n    runs-on: ubuntu-22.04\n    timeout-minutes: 20\n    steps:\n    - name: Install packages\n      shell: bash\n      run: |\n        sudo apt-get update\n        sudo apt-get -y install gcc make python3-pip nginx git ruby pkg-config libssl-dev faketime\n        pip3 install certbuilder crlbuilder\n    - name: Configure JDK\n      uses: actions/setup-java@v4\n      with:\n        distribution: corretto\n        java-version: 17\n    - name: Stop nginx\n      run: sudo systemctl stop nginx\n    - name: Checkout smithy-rs\n      uses: actions/checkout@v4\n      with:\n        path: ./smithy-rs\n    - name: Checkout trytls\n      uses: actions/checkout@v4\n      with:\n        repository: ouspg/trytls\n        path: ./trytls\n    - name: Checkout badtls\n      uses: actions/checkout@v4\n      with:\n        repository: wbond/badtls.io\n        path: ./badtls.io\n    - name: Checkout badssl\n      uses: actions/checkout@v4\n      with:\n        repository: chromium/badssl.com\n        path: ./badssl.com\n    - name: Install Rust\n      uses: dtolnay/rust-toolchain@master\n      with:\n        toolchain: ${{ env.rust_version }}\n    - name: Build badssl.com\n      shell: bash\n      working-directory: badssl.com\n      env:\n        DOCKER_BUILDKIT: 1\n      run: ../smithy-rs/tools/ci-scripts/configure-tls/configure-badssl\n    - name: Build SDK\n      working-directory: smithy-rs\n      run: ./gradlew :aws:sdk:assemble -Paws.services=+sts,+sso,+ssooidc,+signin\n    - name: Build trytls\n      shell: bash\n      working-directory: trytls\n      run: ../smithy-rs/tools/ci-scripts/configure-tls/configure-trytls\n    - name: Build badtls.io\n      working-directory: badtls.io\n      shell: bash\n      run: ../smithy-rs/tools/ci-scripts/configure-tls/configure-badtls\n    - name: Update TLS configuration\n      shell: bash\n      run: smithy-rs/tools/ci-scripts/configure-tls/update-certs\n    - name: Build TLS stub\n      working-directory: smithy-rs/tools/ci-resources/tls-stub\n      shell: bash\n      run: cargo build\n    - name: Test TLS configuration\n      working-directory: smithy-rs/tools\n      shell: bash\n      run: trytls https target/debug/stub\n"
  },
  {
    "path": ".github/workflows/ci.yml",
    "content": "# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n\n# This is the shared CI workflow that is run by both `ci-pr.yml` and `ci-main.yml` depending\n# on if a pull request is being checked, or if the `main` branch is being checked after merge.\n\nname: Test\n\non:\n  workflow_call:\n    inputs:\n      run_canary:\n        description: Whether to run the canary or not.\n        required: false\n        default: true\n        type: boolean\n      git_ref:\n        description: |\n          The git reference that all checks should be run against. It can be a branch, a tag or a commit SHA.\n          If unspecified, it will default to the git reference or SHA that triggered the execution of this workflow.\n        required: false\n        type: string\n        default: ''\n    secrets:\n      # the docker login password for ECR (encrypted with the DOCKER_LOGIN_TOKEN_PASSPHRASE)\n      ENCRYPTED_DOCKER_PASSWORD:\n        required: false\n      DOCKER_LOGIN_TOKEN_PASSPHRASE:\n        required: false\n      CANARY_GITHUB_ACTIONS_ROLE_ARN:\n        required: false\n      CANARY_STACK_CDK_OUTPUTS_BUCKET_NAME:\n        required: false\n\nenv:\n  rust_version: 1.91.1\n  rust_toolchain_components: clippy,rustfmt\n  ENCRYPTED_DOCKER_PASSWORD: ${{ secrets.ENCRYPTED_DOCKER_PASSWORD }}\n  DOCKER_LOGIN_TOKEN_PASSPHRASE: ${{ secrets.DOCKER_LOGIN_TOKEN_PASSPHRASE }}\n\njobs:\n  # The `generate` job runs scripts that produce artifacts that are required by the `test` job,\n  # and also runs some checks/lints so that those are run sooner rather than later.\n  generate:\n    name: Generate\n    timeout-minutes: 30\n    runs-on: smithy_ubuntu-latest_8-core\n    # To avoid repeating setup boilerplate, we have the actual commands\n    # in a matrix strategy. These commands get run in the steps after all the setup.\n    strategy:\n      fail-fast: false\n      matrix:\n        # These correspond to scripts in tools/ci-scripts that will be run in the Docker build image\n        actions:\n        - action: generate-aws-sdk\n        - action: generate-aws-sdk-smoketest\n        - action: generate-smithy-rs-release\n    steps:\n    - uses: GitHubSecurityLab/actions-permissions/monitor@v1\n    - uses: actions/checkout@v4\n      with:\n        path: smithy-rs\n        ref: ${{ inputs.git_ref }}\n        # `generate-smithy-rs-release` requires access to previous tags to determine if a numerical suffix is needed\n        # to make the release tag unique\n        fetch-depth: 0\n    # The models from aws-sdk-rust are needed to generate the full SDK for CI\n    - uses: actions/checkout@v4\n      with:\n        repository: awslabs/aws-sdk-rust\n        path: aws-sdk-rust\n    - name: Run ${{ matrix.actions.action }}\n      uses: ./smithy-rs/.github/actions/docker-build\n      with:\n        action: ${{ matrix.actions.action }}\n\n  # Test the code generator and other parts (styles and lints) that don't require\n  # code to have already been generated in order to run.\n  test-codegen:\n    name: Test Codegen\n    runs-on: ${{ matrix.test.runner }}\n    timeout-minutes: 35\n    # To avoid repeating setup boilerplate, we have the actual test commands\n    # in a matrix strategy. These commands get run in the steps after all the setup.\n    strategy:\n      fail-fast: false\n      matrix:\n        # These correspond to scripts in tools/ci-scripts that will be run in the Docker build image\n        test:\n        - action: check-aws-sdk-adhoc-tests\n          runner: smithy_ubuntu-latest_8-core\n        - action: check-client-codegen-integration-tests\n          runner: smithy_ubuntu-latest_8-core\n        - action: check-client-codegen-unit-tests\n          runner: smithy_ubuntu-latest_8-core\n        - action: check-core-codegen-unit-tests\n          runner: smithy_ubuntu-latest_8-core\n        - action: check-rust-runtimes\n          runner: smithy_ubuntu-latest_8-core\n          fetch-depth: 0\n        - action: check-sdk-codegen-unit-tests\n          runner: smithy_ubuntu-latest_8-core\n        - action: check-fuzzgen\n          runner: smithy_ubuntu-latest_8-core\n        - action: check-server-codegen-integration-tests\n          runner: smithy_ubuntu-latest_8-core\n        - action: check-server-codegen-integration-tests-python\n          runner: smithy_ubuntu-latest_8-core\n        - action: check-server-codegen-unit-tests\n          runner: smithy_ubuntu-latest_8-core\n        - action: check-server-codegen-unit-tests-python\n          runner: smithy_ubuntu-latest_8-core\n        - action: check-serde-codegen-unit-tests\n          runner: smithy_ubuntu-latest_8-core\n        - action: check-server-e2e-test\n          runner: smithy_ubuntu-latest_8-core\n        - action: check-server-python-e2e-test\n          runner: smithy_ubuntu-latest_8-core\n        - action: check-style-and-lints\n          runner: smithy_ubuntu-latest_8-core\n        - action: check-book\n          runner: smithy_ubuntu-latest_8-core\n        - action: check-tools\n          runner: smithy_ubuntu-latest_8-core\n        - action: check-deterministic-codegen\n          runner: smithy_ubuntu-latest_8-core\n        - action: check-codegen-version\n          runner: smithy_ubuntu-latest_8-core\n    steps:\n    - uses: GitHubSecurityLab/actions-permissions/monitor@v1\n    - uses: actions/checkout@v4\n      with:\n        path: smithy-rs\n        ref: ${{ inputs.git_ref }}\n        # Defaults to 1 if not set\n        fetch-depth: ${{ matrix.test.fetch-depth }}\n    - name: Run ${{ matrix.test.action }}\n      uses: ./smithy-rs/.github/actions/docker-build\n      with:\n        action: ${{ matrix.test.action }}\n\n  # Separate from the main checks above because it uses aws-sdk-rust from GitHub\n  check-semver-hazards:\n    name: Check for semver hazards\n    runs-on: smithy_ubuntu-latest_8-core\n    timeout-minutes: 30\n    steps:\n    - uses: actions/checkout@v4\n      with:\n        path: smithy-rs\n        ref: ${{ inputs.git_ref }}\n        fetch-depth: 0\n    - uses: actions/checkout@v4\n      with:\n        repository: awslabs/aws-sdk-rust\n        path: aws-sdk-rust\n        fetch-depth: 0\n    - name: Run check-semver-hazards\n      uses: ./smithy-rs/.github/actions/docker-build\n      with:\n        action: check-semver-hazards\n\n  # Test all the things that require generated code. Note: the Rust runtimes require codegen\n  # to be checked since `aws-config` depends on the generated STS client.\n  test-sdk:\n    name: Test the SDK\n    needs: generate\n    runs-on: ${{ matrix.test.runner }}\n    timeout-minutes: 45\n    # To avoid repeating setup boilerplate, we have the actual test commands\n    # in a matrix strategy. These commands get run in the steps after all the setup.\n    strategy:\n      fail-fast: false\n      matrix:\n        # These correspond to scripts in tools/ci-scripts that will be run in the Docker build image\n        test:\n        - action: check-aws-config\n          runner: smithy_ubuntu-latest_8-core\n        - action: check-aws-sdk-canary\n          runner: smithy_ubuntu-latest_8-core\n        - action: check-aws-sdk-cargo-deny\n          runner: smithy_ubuntu-latest_8-core\n        - action: check-only-aws-sdk-services\n          runner: smithy_ubuntu-latest_8-core\n        - action: check-aws-sdk-smoketest-docs-clippy-udeps\n          runner: smithy_ubuntu-latest_16-core\n        - action: check-aws-sdk-smoketest-unit-tests\n          runner: smithy_ubuntu-latest_8-core\n        - action: check-aws-sdk-standalone-integration-tests\n          runner: smithy_ubuntu-latest_8-core\n        - action: check-aws-sdk-benchmarks\n          runner: smithy_ubuntu-latest_8-core\n    steps:\n    - uses: GitHubSecurityLab/actions-permissions/monitor@v1\n    - uses: actions/checkout@v4\n      with:\n        path: smithy-rs\n        ref: ${{ inputs.git_ref }}\n    - name: Run ${{ matrix.test.action }}\n      uses: ./smithy-rs/.github/actions/docker-build\n      with:\n        action: ${{ matrix.test.action }}\n\n  test-rust-windows:\n    name: Rust Tests on Windows\n    runs-on: windows-latest\n    timeout-minutes: 30\n    env:\n      # Disable incremental compilation to reduce disk space use\n      CARGO_INCREMENTAL: 0\n      RUSTDOCFLAGS: -D warnings\n      RUSTFLAGS: -D warnings\n    steps:\n    - uses: actions/checkout@v4\n      with:\n        ref: ${{ inputs.git_ref }}\n      # Pinned to the commit hash of v2.7.3\n    - uses: Swatinem/rust-cache@23bce251a8cd2ffc3c1075eaa2367cf899916d84\n      with:\n        shared-key: ${{ runner.os }}-${{ env.rust_version }}-${{ github.job }}\n        workspaces: |\n          .\n          tools\n    - uses: dtolnay/rust-toolchain@master\n      with:\n        toolchain: ${{ env.rust_version }}\n        components: ${{ env.rust_toolchain_components }}\n      # To fix OpenSSL not found on Windows: https://github.com/sfackler/rust-openssl/issues/1542\n    - run: echo \"VCPKG_ROOT=$env:VCPKG_INSTALLATION_ROOT\" | Out-File -FilePath $env:GITHUB_ENV -Append\n    - run: vcpkg install openssl:x64-windows-static-md\n    - name: Run tests\n      shell: bash\n      run: tools/ci-scripts/test-windows.sh\n\n  # We make sure that smithy-rs can be compiled on platforms that are not\n  # natively supported by GitHub actions. We run as many tests as we can on\n  # those platforms, but not all of them, because they require a more\n  # complicated setup involving architecture emulation.\n  test-exotic-platform-support:\n    name: Exotic platform support\n    runs-on: ubuntu-latest\n    timeout-minutes: 25\n    env:\n      CROSS_CONFIG: Cross.toml\n    strategy:\n      fail-fast: false\n      # We always exclude `aws-smithy-http-server-python`, `aws-smithy-http-server-typescript`, and `aws-smithy-experimental` since they are experimental.\n      # We exclude `aws-smithy-http-client` due to FIPS related feature flags and aws-lc-fips target support\n      # We exclude `aws-smithy-wasm` because it is only meant to build for WASM targets\n      matrix:\n        include:\n        - target: i686-unknown-linux-gnu\n          build_smithy_rs_features: --all-features\n          build_aws_exclude: ''\n          build_smithy_rs_exclude: --exclude aws-smithy-http-server-python --exclude aws-smithy-http-server-typescript --exclude aws-smithy-experimental --exclude aws-smithy-http-client --exclude aws-smithy-wasm\n          test_smithy_rs_features: --all-features\n          test_aws_features: --all-features\n          test_aws_exclude: ''\n          test_smithy_rs_exclude: --exclude aws-smithy-http-server-python --exclude aws-smithy-http-server-typescript --exclude aws-smithy-experimental --exclude aws-smithy-http-client  --exclude aws-smithy-wasm\n        - target: powerpc-unknown-linux-gnu\n          build_smithy_rs_features: ''\n          build_aws_exclude: --exclude aws-inlineable\n          build_smithy_rs_exclude: --exclude aws-smithy-http-server-python --exclude aws-smithy-http-server-typescript --exclude aws-smithy-experimental --exclude aws-smithy-http-client --exclude aws-smithy-http-server-metrics --exclude aws-smithy-http-server-metrics-macro  --exclude aws-smithy-wasm\n          test_smithy_rs_features: ''\n          test_aws_features: ''\n          test_aws_exclude: --exclude aws-inlineable\n          test_smithy_rs_exclude: --exclude aws-smithy-http-server-python --exclude aws-smithy-http-server-typescript --exclude aws-smithy-experimental --exclude aws-smithy-http-client --exclude aws-smithy-http-server-metrics --exclude aws-smithy-http-server-metrics-macro  --exclude aws-smithy-wasm\n        - target: powerpc64-unknown-linux-gnu\n          build_smithy_rs_features: ''\n          build_aws_exclude: --exclude aws-inlineable\n          build_smithy_rs_exclude: --exclude aws-smithy-http-server-python --exclude aws-smithy-http-server-typescript --exclude aws-smithy-experimental --exclude aws-smithy-http-client  --exclude aws-smithy-wasm\n          test_smithy_rs_features: ''\n          test_aws_features: ''\n          test_aws_exclude: --exclude aws-inlineable\n          test_smithy_rs_exclude: --exclude aws-smithy-http-server-python --exclude aws-smithy-http-server-typescript --exclude aws-smithy-experimental --exclude aws-smithy-http-client  --exclude aws-smithy-wasm\n    steps:\n    - uses: GitHubSecurityLab/actions-permissions/monitor@v1\n    - name: Checkout\n      uses: actions/checkout@v4\n      with:\n        ref: ${{ inputs.git_ref }}\n      # Pinned to the commit hash of v2.7.3\n    - uses: Swatinem/rust-cache@23bce251a8cd2ffc3c1075eaa2367cf899916d84\n      with:\n        shared-key: ${{ runner.os }}-${{ env.rust_version }}-${{ github.job }}-${{ matrix.target }}\n        workspaces: |\n          .\n          tools\n    - uses: dtolnay/rust-toolchain@master\n      with:\n        toolchain: ${{ env.rust_version }}\n        components: ${{ env.rust_toolchain_components }}\n        targets: ${{ matrix.target }}\n    - name: Sets OpenSSL env vars on i686\n      run: |\n        echo \"OPENSSL_LIB_DIR=/usr/lib/i386-linux-gnu\" >> $GITHUB_ENV\n        echo \"OPENSSL_INCLUDE_DIR=/usr/include/i386-linux-gnu\" >> $GITHUB_ENV\n      if: matrix.target == 'i686-unknown-linux-gnu'\n    - name: Sets OpenSSL env vars on ppc and ppc64\n      run: |\n        echo \"OPENSSL_DIR=/openssl\" >> $GITHUB_ENV\n      if: matrix.target != 'i686-unknown-linux-gnu'\n    - name: Configure cross\n      shell: bash\n      # configure and cross compile openssl locally on ppc and ppc64 to be able to run aws-smithy-client tests.\n      # since cross dropped support for openssl, we use the build script from version 0.16.\n      run: |\n        cargo install cross --locked --version 0.2.4\n\n        cat > Cross.toml << EOF\n        [target.i686-unknown-linux-gnu]\n        pre-build = [\"dpkg --add-architecture i386\", \"apt-get update && apt-get install --assume-yes pkg-config:i386 libssl-dev:i386\"]\n        [target.i686-unknown-linux-gnu.env]\n        passthrough = [\n            \"OPENSSL_LIB_DIR\",\n            \"OPENSSL_INCLUDE_DIR\",\n        ]\n        [target.powerpc-unknown-linux-gnu]\n        pre-build = [\"curl -L -s https://github.com/cross-rs/cross/raw/c183ee37a9dc6b0e6b6a6ac9c918173137bad4ef/docker/openssl.sh | sed 's/curl https/curl -L https/' > /tmp/openssl.sh && bash /tmp/openssl.sh linux-ppc powerpc-linux-gnu-\"]\n        [target.powerpc-unknown-linux-gnu.env]\n        passthrough = [\"OPENSSL_DIR\"]\n        [target.powerpc64-unknown-linux-gnu]\n        pre-build = [\"curl -L -s https://github.com/cross-rs/cross/raw/c183ee37a9dc6b0e6b6a6ac9c918173137bad4ef/docker/openssl.sh | sed 's/curl https/curl -L https/' > /tmp/openssl.sh && bash /tmp/openssl.sh linux-ppc64 powerpc64-linux-gnu-\"]\n        [target.powerpc64-unknown-linux-gnu.env]\n        passthrough = [\"OPENSSL_DIR\"]\n        EOF\n    - name: Build Smithy-rs rust-runtime crates\n      shell: bash\n      run: cross build -vv --target ${{ matrix.target }} --manifest-path \"rust-runtime/Cargo.toml\" ${{ matrix.build_smithy_rs_exclude }} --workspace ${{ matrix.build_smithy_rs_features }}\n    - name: Build AWS rust-runtime crates\n      shell: bash\n      run: cross build -vv --target ${{ matrix.target }} --manifest-path \"aws/rust-runtime/Cargo.toml\" ${{ matrix.build_aws_exclude }} --workspace\n    - name: Test Smithy-rs rust-runtime crates\n      shell: bash\n      run: cross test --target ${{ matrix.target }} --manifest-path \"rust-runtime/Cargo.toml\" ${{ matrix.test_smithy_rs_exclude }} --workspace ${{ matrix.test_smithy_rs_features }}\n    - name: Test AWS rust-runtime crates\n      shell: bash\n      run: cross test --target ${{ matrix.target }} --manifest-path \"aws/rust-runtime/Cargo.toml\" ${{ matrix.test_aws_exclude }} --workspace ${{ matrix.test_aws_features }}\n\n  # Run the canary against generated SDKs\n  #\n  # In addition to Matrix Success, this job will also be required to pass for merge.\n  # CI execution from forked repositories will skip this job, and when it does\n  # this skipped job will report its status as \"Success\".\n  # https://docs.github.com/en/actions/using-jobs/using-conditions-to-control-job-execution#overview\n  canary:\n    name: Canary\n    if: ${{ inputs.run_canary }}\n    needs: generate\n    runs-on: smithy_ubuntu-latest_8-core\n    timeout-minutes: 30\n    permissions:\n      id-token: write\n      contents: read\n      actions: read\n      pull-requests: read\n    steps:\n    - uses: GitHubSecurityLab/actions-permissions/monitor@v1\n    - uses: actions/checkout@v4\n      with:\n        path: smithy-rs\n        ref: ${{ inputs.git_ref }}\n    - name: Configure credentials\n      id: creds\n      uses: aws-actions/configure-aws-credentials@v4\n      with:\n        aws-region: us-west-2\n        role-to-assume: ${{ secrets.CANARY_GITHUB_ACTIONS_ROLE_ARN }}\n        output-credentials: true\n    - name: Run canary\n      uses: ./smithy-rs/.github/actions/docker-build\n      with:\n        action: run-canary\n        action-arguments: ${{ secrets.CANARY_STACK_CDK_OUTPUTS_BUCKET_NAME }} ${{ steps.creds.outputs.aws-access-key-id }} ${{ steps.creds.outputs.aws-secret-access-key }} ${{ steps.creds.outputs.aws-session-token }}\n\n  # This is always a failing job since forked repositories do not have necessary repository secrets\n  # to run the PR bot workflow or the canary workflow\n  ask-maintainer-to-run-pr-bot-and-canary:\n    name: Ask maintainer to run the PR bot and canary workflows\n    if: ${{ !inputs.run_canary }}\n    runs-on: ubuntu-latest\n    steps:\n    - uses: GitHubSecurityLab/actions-permissions/monitor@v1\n    - run: |\n        echo \"PR bot and canary cannot be invoked from a forked repository. Ask a maintainer to manually invoke them using your PR.\"\n        exit 1\n\n  # Pseudo-job that depends on matrix jobs so that we don't have to enter\n  # the myriad of test matrix combinations into GitHub's protected branch rules\n  require-all:\n    needs:\n    - generate\n    - test-codegen\n    - check-semver-hazards\n    - test-sdk\n    - test-rust-windows\n    - test-exotic-platform-support\n    # Run this job even if its dependency jobs fail\n    if: always()\n    runs-on: ubuntu-latest\n    name: Matrix Success\n    steps:\n    - uses: GitHubSecurityLab/actions-permissions/monitor@v1\n    - name: Verify jobs succeeded\n      # Pinned to commit hash of v1.2.2\n      uses: re-actors/alls-green@05ac9388f0aebcb5727afa17fcccfecd6f8ec5fe\n      with:\n        jobs: ${{ toJSON(needs) }}\n"
  },
  {
    "path": ".github/workflows/claim-crate-names.yml",
    "content": "# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n\n# This workflow claims the names of the unpublished crates in this repository\n# on crates.io (by publishing a dummy empty package)\n\n# Allow only one crate claim workflow to run at a time\nconcurrency:\n  group: claim-crates-smithy-rs\n  cancel-in-progress: true\n\nenv:\n  rust_version: 1.91.1\n\nname: Claim unpublished crate names on crates.io\nrun-name: ${{ github.workflow }}\non:\n  # It runs daily, but it can also be triggered on demand.\n  workflow_dispatch:\n  schedule:\n  - cron: 0 11 * * *     # run at 11:00 UTC (morning) every day\n\njobs:\n  main-branch-check:\n    name: Check that workflow is running in main\n    runs-on: ubuntu-latest\n    steps:\n    - uses: GitHubSecurityLab/actions-permissions/monitor@v1\n    - name: Main branch check\n      if: ${{ github.ref_name != 'main' }}\n      uses: actions/github-script@v7\n      with:\n        script: |\n          core.setFailed(\"This workflow can only be ran on main (current branch: ${{ github.ref_name }})\")\n\n  # This job will be a no-op if an image was already built on main by another workflow.\n  acquire-base-image:\n    name: Acquire Base Image\n    permissions:\n      id-token: write\n      contents: read\n    needs:\n    - main-branch-check\n    runs-on: ubuntu-latest\n    steps:\n    - uses: GitHubSecurityLab/actions-permissions/monitor@v1\n    - uses: actions/checkout@v4\n      with:\n        path: smithy-rs\n        fetch-depth: 0\n    - uses: ./smithy-rs/.github/actions/free-disk-space\n    - name: Acquire base image\n      id: acquire\n      run: ./smithy-rs/.github/scripts/acquire-build-image\n    - name: Upload base image\n      uses: actions/upload-artifact@v4\n      with:\n        name: smithy-rs-base-image\n        path: smithy-rs-base-image\n        retention-days: 1\n\n  claim:\n    name: Claim crate names\n    needs:\n    - main-branch-check\n    - acquire-base-image\n    runs-on: ubuntu-latest\n    steps:\n    - uses: GitHubSecurityLab/actions-permissions/monitor@v1\n    - name: Install Rust\n      uses: dtolnay/rust-toolchain@master\n      with:\n        toolchain: ${{ env.rust_version }}\n    - name: Checkout smithy-rs\n      uses: actions/checkout@v4\n    - name: Publish to crates.io\n      shell: bash\n      env:\n        CARGO_REGISTRY_TOKEN: ${{ secrets.RELEASE_AUTOMATION_BOT_CRATESIO_TOKEN }}\n      run: |\n        cargo install --path tools/ci-build/publisher\n        # Verify the publisher tool installed successfully\n        publisher --version\n        publisher claim-crate-names -y\n"
  },
  {
    "path": ".github/workflows/credentials-verification.yml",
    "content": "name: Daily credentials verification\non:\n  schedule:\n    # Runs 00:00 UTC every day\n  - cron: 0 0 * * *\n  workflow_dispatch:\n\njobs:\n  # Verifies the token used by the bot to publish crates to crates.io\n  verify-crates-io-token:\n    name: Verify Crates.io Token\n    if: github.repository == 'smithy-lang/smithy-rs'\n    runs-on: ubuntu-latest\n    steps:\n    - uses: GitHubSecurityLab/actions-permissions/monitor@v1\n    - name: Checkout smithy-rs\n      uses: actions/checkout@v4\n    - name: Verify Crates.io Token\n      shell: bash\n      env:\n        CARGO_REGISTRY_TOKEN: ${{ secrets.RELEASE_AUTOMATION_BOT_CRATESIO_TOKEN }}\n      run: |\n        echo \"Checking cargo auth token...\"\n        # \"cargo login\" only saves a token and does not actually use it, so we use \"cargo yank\" to verify the token.\n        # This version has already been yanked, so it is safe to execute the command below repeatedly.\n        # This command succeeds if we have a token with permission to yank the crate.\n        cargo yank aws-sigv4 --version 0.55.0\n    - name: Notify Slack on Failure\n      if: failure()\n      env:\n        SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}\n      run: |\n        curl -X POST \"${SLACK_WEBHOOK_URL}\" -H 'Content-type: application/json' \\\n        --data '{\"workflow_msg\":\"⚠️ Invalid crates.io token. Create a new token as soon as possible!\"}'\n\n  # Verifies the token used to perform actions on the repository on behalf of the bot user\n  verify-personal-access-token:\n    name: Verify Personal Access Token\n    if: github.repository == 'smithy-lang/smithy-rs'\n    runs-on: ubuntu-latest\n    steps:\n    - uses: GitHubSecurityLab/actions-permissions/monitor@v1\n    - name: Checkout smithy-rs\n        # To test the validity of the personal access token, we only need to perform checkout with the specified token.\n      uses: actions/checkout@v4\n      with:\n        token: ${{ secrets.RELEASE_AUTOMATION_BOT_PAT }}\n    - name: Notify Slack on Failure\n      if: failure()\n      env:\n        SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}\n      run: |\n        curl -X POST \"${SLACK_WEBHOOK_URL}\" -H 'Content-type: application/json' \\\n        --data '{\"workflow_msg\":\"⚠️ Invalid GitHub personal access token. Create a new token as soon as possible!\"}'\n"
  },
  {
    "path": ".github/workflows/dry-run-release-scheduled.yml",
    "content": "# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n\n# This workflow performs a scheduled dry-run for smithy-rs release.\n# When run, it only produces release artifacts, but will not cut a release tag in GitHub or publish to crates.io.\n\nname: Scheduled smithy-rs dry-run release\nrun-name: ${{ github.workflow }}\non:\n  schedule:\n    # Runs 00:00 UTC every day\n  - cron: 0 0 * * *\n\npermissions:\n  actions: read\n  contents: read\n  id-token: write\n  pull-requests: read\n\njobs:\n  smithy-rs-scheduled-dry-run-release:\n    name: Scheduled dry-run release\n    if: github.repository == 'smithy-lang/smithy-rs'\n    uses: ./.github/workflows/release.yml\n    with:\n      commit_sha: main\n      dry_run: true\n      # If the automation runs this workflow in the background, we might as well run the full CI to catch any potential issues.\n      skip_ci: false\n    secrets:\n      RELEASE_AUTOMATION_BOT_PAT: ${{ secrets.RELEASE_AUTOMATION_BOT_PAT }}\n      RELEASE_AUTOMATION_BOT_CRATESIO_TOKEN: ${{ secrets.RELEASE_AUTOMATION_BOT_CRATESIO_TOKEN }}\n      CANARY_GITHUB_ACTIONS_ROLE_ARN: ${{ secrets.CANARY_GITHUB_ACTIONS_ROLE_ARN }}\n      CANARY_STACK_CDK_OUTPUTS_BUCKET_NAME: ${{ secrets.CANARY_STACK_CDK_OUTPUTS_BUCKET_NAME }}\n      SMITHY_RS_ECR_PUSH_ROLE_ARN: ${{ secrets.SMITHY_RS_ECR_PUSH_ROLE_ARN }}\n      MAVEN_CENTRAL_GPG_PUBLIC_KEY_SECRET_ARN: ${{ secrets.MAVEN_CENTRAL_GPG_PUBLIC_KEY_SECRET_ARN }}\n      MAVEN_CENTRAL_GPG_PRIVATE_KEY_SECRET_ARN: ${{ secrets.MAVEN_CENTRAL_GPG_PRIVATE_KEY_SECRET_ARN }}\n      MAVEN_CENTRAL_GPG_PASSPHRASE_SECRET_ARN: ${{ secrets.MAVEN_CENTRAL_GPG_PASSPHRASE_SECRET_ARN }}\n      MAVEN_CENTRAL_SONATYPE_CREDENTIALS_SECRET_ARN: ${{ secrets.MAVEN_CENTRAL_SONATYPE_CREDENTIALS_SECRET_ARN }}\n"
  },
  {
    "path": ".github/workflows/dry-run-release.yml",
    "content": "# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n\n# This workflow performs a manual dry-run for smithy-rs release.\n# When run, it only produces release artifacts, but will not cut a release tag in GitHub or publish to crates.io.\n\nname: Smithy-rs dry-run release\nrun-name: ${{ github.workflow }}-${{ inputs.commit_sha }}\non:\n  workflow_dispatch:\n    inputs:\n      commit_sha:\n        description: |\n          Commit SHA: The SHA of the git commit that you want to release.\n          You must use the non-abbreviated SHA (e.g. b2318b0 won't work!).\n          Alternatively, you can use the name of a branch.\n        required: true\n        type: string\n      skip_ci:\n        description: Skip CI\n        required: true\n        type: boolean\n        default: true\n\npermissions:\n  actions: read\n  contents: read\n  id-token: write\n  pull-requests: read\n\njobs:\n  smithy-rs-manual-dry-run-release:\n    name: Manual dry run release\n    if: ${{ github.event_name == 'workflow_dispatch' }}\n    uses: ./.github/workflows/release.yml\n    with:\n      commit_sha: ${{ inputs.commit_sha }}\n      dry_run: true\n      skip_ci: ${{ inputs.skip_ci }}\n    secrets:\n      RELEASE_AUTOMATION_BOT_PAT: ${{ secrets.RELEASE_AUTOMATION_BOT_PAT }}\n      RELEASE_AUTOMATION_BOT_CRATESIO_TOKEN: ${{ secrets.RELEASE_AUTOMATION_BOT_CRATESIO_TOKEN }}\n      CANARY_GITHUB_ACTIONS_ROLE_ARN: ${{ secrets.CANARY_GITHUB_ACTIONS_ROLE_ARN }}\n      CANARY_STACK_CDK_OUTPUTS_BUCKET_NAME: ${{ secrets.CANARY_STACK_CDK_OUTPUTS_BUCKET_NAME }}\n      SMITHY_RS_ECR_PUSH_ROLE_ARN: ${{ secrets.SMITHY_RS_ECR_PUSH_ROLE_ARN }}\n      MAVEN_CENTRAL_GPG_PUBLIC_KEY_SECRET_ARN: ${{ secrets.MAVEN_CENTRAL_GPG_PUBLIC_KEY_SECRET_ARN }}\n      MAVEN_CENTRAL_GPG_PRIVATE_KEY_SECRET_ARN: ${{ secrets.MAVEN_CENTRAL_GPG_PRIVATE_KEY_SECRET_ARN }}\n      MAVEN_CENTRAL_GPG_PASSPHRASE_SECRET_ARN: ${{ secrets.MAVEN_CENTRAL_GPG_PASSPHRASE_SECRET_ARN }}\n      MAVEN_CENTRAL_SONATYPE_CREDENTIALS_SECRET_ARN: ${{ secrets.MAVEN_CENTRAL_SONATYPE_CREDENTIALS_SECRET_ARN }}\n"
  },
  {
    "path": ".github/workflows/github-pages.yml",
    "content": "on:\n  workflow_dispatch:\n  push:\n    branches: [main]\n    paths:\n    - design/**\n\nname: Update GitHub Pages\n\nenv:\n  rust_version: 1.91.1\n\n# Allow only one doc pages build to run at a time for the entire smithy-rs repo\nconcurrency:\n  group: github-pages-yml\n  cancel-in-progress: true\n\njobs:\n  build-and-deploy-docs:\n    if: github.repository == 'smithy-lang/smithy-rs'\n    runs-on: ubuntu-latest\n    steps:\n    - uses: GitHubSecurityLab/actions-permissions/monitor@v1\n    - name: Checkout\n      uses: actions/checkout@v4\n      with:\n        persist-credentials: false\n    - uses: dtolnay/rust-toolchain@master\n      with:\n        toolchain: ${{ env.rust_version }}\n    - name: Generate docs\n      env:\n        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n      run: |\n        git config --local user.name \"AWS SDK Rust Bot\"\n        git config --local user.email \"aws-sdk-rust-primary@amazon.com\"\n        git remote set-url origin https://x-access-token:${GITHUB_TOKEN}@github.com/${{ github.repository }}\n        REV=$(git rev-parse --short HEAD)\n\n        pushd design &>/dev/null\n        cargo install mdbook\n        cargo install --locked mdbook-mermaid\n        mdbook build --dest-dir ../../output\n        popd &>/dev/null\n\n        git checkout --orphan github-pages\n        git rm --cached -r .\n        git clean -ffdx\n        mv ../output design\n        git add design\n        git commit -m \"Design docs @ ${{ github.repository }}@${REV}\"\n        git push origin github-pages --force\n"
  },
  {
    "path": ".github/workflows/manual-canary.yml",
    "content": "# This workflow allows maintainers to manually run the canary given an external contributor's pull request created from\n# a forked repository, which does not have required repository secrets to execute the canary.\nname: Invoke Canary as Maintainer\non:\n  workflow_dispatch:\n    inputs:\n      pull_request_number:\n        description: The PR number to invoke the canary for.\n        required: true\n        type: string\n      commit_sha:\n        description: The the full SHA for the HEAD commit of the PR\n        required: true\n        type: string\nrun-name: ${{ github.workflow }} for Pull Request ${{ inputs.pull_request_number }}\n\n# Allow one instance of this workflow per pull request, and cancel older runs when new changes are pushed\nconcurrency:\n  group: manual-canary-${{ inputs.pull_request_number }}\n  cancel-in-progress: true\n\njobs:\n  get-pr-info:\n    name: Get PR info\n    runs-on: ubuntu-latest\n    steps:\n    - uses: GitHubSecurityLab/actions-permissions/monitor@v1\n    - name: Get PR info\n      id: get-pr-info\n      uses: actions/github-script@v7\n      with:\n        script: |\n          const response = await github.rest.pulls.get({\n            pull_number: ${{ inputs.pull_request_number }},\n            owner: context.repo.owner,\n            repo: context.repo.repo,\n          });\n          const data = {\n            commit_sha: response.data.head.sha,\n          };\n          console.log(\"data:\", data);\n          if(data.commit_sha !== \"${{ inputs.commit_sha }}\"){\n            throw new Error(\"Input SHA does not match retrieved SHA\")\n          }\n          return data;\n    outputs:\n      pull_data: ${{ steps.get-pr-info.outputs.result }}\n\n  acquire-base-image:\n    name: Acquire Base Image\n    permissions:\n      id-token: write\n      contents: read\n    needs:\n    - get-pr-info\n    runs-on: ubuntu-latest\n    steps:\n    - uses: GitHubSecurityLab/actions-permissions/monitor@v1\n    - uses: actions/checkout@v4\n      with:\n        path: smithy-rs\n            # The ref used needs to match the HEAD revision of the PR being diffed, or else\n            # the `docker-build` action won't find the built Docker image.\n        ref: ${{ inputs.commit_sha }}\n        fetch-depth: 0\n    - uses: ./smithy-rs/.github/actions/free-disk-space\n    - name: Acquire base image\n      id: acquire\n      run: ./smithy-rs/.github/scripts/acquire-build-image\n    - name: Upload base image\n      uses: actions/upload-artifact@v4\n      with:\n        name: smithy-rs-base-image\n        path: smithy-rs-base-image\n        retention-days: 1\n\n  generate:\n    name: Generate\n    needs:\n    - acquire-base-image\n    - get-pr-info\n    runs-on: smithy_ubuntu-latest_8-core\n    steps:\n    - uses: GitHubSecurityLab/actions-permissions/monitor@v1\n    - uses: actions/checkout@v4\n      with:\n        path: smithy-rs\n        ref: ${{ inputs.commit_sha }}\n    - name: Generate a subset of SDKs for the canary\n      uses: ./smithy-rs/.github/actions/docker-build\n      with:\n        action: generate-aws-sdk-for-canary\n\n  canary:\n    name: Canary\n    needs:\n    - generate\n    - get-pr-info\n    runs-on: smithy_ubuntu-latest_8-core\n    permissions:\n      id-token: write\n      contents: read\n    steps:\n    - uses: GitHubSecurityLab/actions-permissions/monitor@v1\n    - uses: actions/checkout@v4\n      with:\n        path: smithy-rs\n        ref: ${{ inputs.commit_sha }}\n    - name: Configure credentials\n      id: creds\n      uses: aws-actions/configure-aws-credentials@v4\n      with:\n        aws-region: us-west-2\n        role-to-assume: ${{ secrets.CANARY_GITHUB_ACTIONS_ROLE_ARN }}\n        output-credentials: true\n    - name: Run canary\n      uses: ./smithy-rs/.github/actions/docker-build\n      with:\n        action: run-canary\n        action-arguments: ${{ secrets.CANARY_STACK_CDK_OUTPUTS_BUCKET_NAME }} ${{ steps.creds.outputs.aws-access-key-id }} ${{ steps.creds.outputs.aws-secret-access-key }} ${{ steps.creds.outputs.aws-session-token }}\n"
  },
  {
    "path": ".github/workflows/manual-pull-request-bot.yml",
    "content": "# This workflow allows maintainers to manually run the PR bot on a pull request to work around permissions\n# issues that prevent it from working for non-maintainers.\nname: Invoke PR Bot as Maintainer\non:\n  workflow_dispatch:\n    inputs:\n      pull_number:\n        description: The PR number to invoke the PR bot on.\n        required: true\n        type: string\n      commit_sha:\n        description: The the full SHA for the HEAD commit of the PR\n        required: true\n        type: string\n\npermissions:\n  id-token: write\n  pull-requests: write\n  contents: read\n\njobs:\n  get-pr-info:\n    name: Get PR info\n    runs-on: ubuntu-latest\n    steps:\n    - uses: GitHubSecurityLab/actions-permissions/monitor@v1\n    - name: Get PR info\n      id: get-pr-info\n      uses: actions/github-script@v7\n      with:\n        script: |\n          const response = await github.rest.pulls.get({\n            pull_number: ${{ inputs.pull_number }},\n            owner: context.repo.owner,\n            repo: context.repo.repo,\n          });\n          const data = {\n            base_revision: response.data.base.sha,\n            head_revision: response.data.head.sha,\n          };\n          console.log(\"data:\", data);\n          if(data.head_revision !== \"${{ inputs.commit_sha }}\"){\n            throw new Error(\"Input SHA does not match retrieved SHA\")\n          }\n          return data;\n    outputs:\n      pull_data: ${{ steps.get-pr-info.outputs.result }}\n\n  # This job detects if the PR made changes to build tools. If it did, then it builds a new\n  # build Docker image. Otherwise, it downloads a build image from Public ECR. In both cases,\n  # it uploads the image as a build artifact for other jobs to download and use.\n  acquire-base-image:\n    name: Acquire Base Image\n    permissions:\n      id-token: write\n      contents: read\n    needs:\n    - get-pr-info\n    runs-on: smithy_ubuntu-latest_8-core\n    steps:\n    - uses: GitHubSecurityLab/actions-permissions/monitor@v1\n    - uses: actions/checkout@v4\n      with:\n        path: smithy-rs\n            # The ref used needs to match the HEAD revision of the PR being diffed, or else\n            # the `docker-build` action won't find the built Docker image. This has the unfortunate\n            # side effect that the codegen diff tool used is the one in the PR rather than in\n            # the branch this workflow was launched from.\n        ref: ${{ inputs.commit_sha }}\n        fetch-depth: 0\n    - uses: ./smithy-rs/.github/actions/free-disk-space\n    - name: Acquire base image\n      id: acquire\n      run: ./smithy-rs/.github/scripts/acquire-build-image\n    - name: Upload base image\n      uses: actions/upload-artifact@v4\n      with:\n        name: smithy-rs-base-image\n        path: smithy-rs-base-image\n        retention-days: 1\n\n  invoke-pr-bot:\n    name: PR Bot\n    needs:\n    - acquire-base-image\n    - get-pr-info\n    uses: ./.github/workflows/pull-request-bot.yml\n    with:\n      issue_number: ${{ inputs.pull_number }}\n      base_revision: ${{ fromJSON(needs.get-pr-info.outputs.pull_data).base_revision }}\n      head_revision: ${{ inputs.commit_sha  }}\n    secrets:\n      SMITHY_RS_PULL_REQUEST_CDN_S3_BUCKET_NAME: ${{ secrets.SMITHY_RS_PULL_REQUEST_CDN_S3_BUCKET_NAME }}\n      SMITHY_RS_PULL_REQUEST_CDN_ROLE_ARN: ${{ secrets.SMITHY_RS_PULL_REQUEST_CDN_ROLE_ARN }}\n"
  },
  {
    "path": ".github/workflows/manual-update-lockfiles.yml",
    "content": "# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n\nname: Update lockfiles manually\nrun-name: ${{ github.workflow }} (${{ inputs.base_branch }})\non:\n  workflow_dispatch:\n    inputs:\n      base_branch:\n        description: The name of the branch on which to run `cargo update` for lockfiles\n        required: true\n        type: string\n      force_update_on_broken_dependencies:\n        description: When true, it forces `cargo update` to update broken dependencies to the latest semver-compatible versions, without downgrading them to the last known working versions\n        required: true\n        type: boolean\n        default: false\n\npermissions:\n  contents: read\n  id-token: write\n\nconcurrency:\n  group: ${{ github.workflow }}-${{ inputs.base_branch }}\n  cancel-in-progress: true\n\njobs:\n  cargo-update-runtime-lockfiles-and-sdk-lockfile:\n    name: Run cargo update on the runtime lockfiles and the SDK lockfile\n    if: ${{ github.event_name == 'workflow_dispatch' }}\n    uses: ./.github/workflows/pull-request-updating-lockfiles.yml\n    with:\n      base_branch: ${{ inputs.base_branch }}\n      force_update_on_broken_dependencies: ${{ inputs.force_update_on_broken_dependencies }}\n    secrets:\n      DOCKER_LOGIN_TOKEN_PASSPHRASE: ${{ secrets.DOCKER_LOGIN_TOKEN_PASSPHRASE }}\n      SMITHY_RS_ECR_PUSH_ROLE_ARN: ${{ secrets.SMITHY_RS_ECR_PUSH_ROLE_ARN }}\n      RELEASE_AUTOMATION_BOT_PAT: ${{ secrets.RELEASE_AUTOMATION_BOT_PAT }}\n"
  },
  {
    "path": ".github/workflows/prod-release.yml",
    "content": "# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n\n# This workflow performs a production smithy-rs release. It will cut a release tag in GitHub and publish to crates.io.\n# It is idempotent (e.g. won't publish the same crates to crates.io twice), so we can run it repeatedly until it succeeds.\n\nname: Smithy-rs prod release\nrun-name: ${{ github.workflow }} (${{ inputs.commit_sha }})\non:\n  workflow_dispatch:\n    inputs:\n      commit_sha:\n        description: |\n          Commit SHA: The SHA of the git commit that you want to release.\n          You must use the non-abbreviated SHA (e.g. b2318b0 won't work!).\n          Alternatively, you can use the name of a branch.\n        required: true\n        type: string\n\npermissions:\n  actions: read\n  contents: read\n  id-token: write\n  pull-requests: read\n\njobs:\n  smithy-rs-prod-release:\n    name: Prod release\n    uses: ./.github/workflows/release.yml\n    with:\n      commit_sha: ${{ inputs.commit_sha }}\n      dry_run: false\n      skip_ci: false\n    secrets:\n      RELEASE_AUTOMATION_BOT_PAT: ${{ secrets.RELEASE_AUTOMATION_BOT_PAT }}\n      RELEASE_AUTOMATION_BOT_CRATESIO_TOKEN: ${{ secrets.RELEASE_AUTOMATION_BOT_CRATESIO_TOKEN }}\n      CANARY_GITHUB_ACTIONS_ROLE_ARN: ${{ secrets.CANARY_GITHUB_ACTIONS_ROLE_ARN }}\n      CANARY_STACK_CDK_OUTPUTS_BUCKET_NAME: ${{ secrets.CANARY_STACK_CDK_OUTPUTS_BUCKET_NAME }}\n      SMITHY_RS_ECR_PUSH_ROLE_ARN: ${{ secrets.SMITHY_RS_ECR_PUSH_ROLE_ARN }}\n      MAVEN_CENTRAL_GPG_PUBLIC_KEY_SECRET_ARN: ${{ secrets.MAVEN_CENTRAL_GPG_PUBLIC_KEY_SECRET_ARN }}\n      MAVEN_CENTRAL_GPG_PRIVATE_KEY_SECRET_ARN: ${{ secrets.MAVEN_CENTRAL_GPG_PRIVATE_KEY_SECRET_ARN }}\n      MAVEN_CENTRAL_GPG_PASSPHRASE_SECRET_ARN: ${{ secrets.MAVEN_CENTRAL_GPG_PASSPHRASE_SECRET_ARN }}\n      MAVEN_CENTRAL_SONATYPE_CREDENTIALS_SECRET_ARN: ${{ secrets.MAVEN_CENTRAL_SONATYPE_CREDENTIALS_SECRET_ARN }}\n"
  },
  {
    "path": ".github/workflows/pull-request-bot.yml",
    "content": "# This job will generate a codegen diff, upload it to S3, and link to it in a comment on the PR.\nname: PR Bot\non:\n  workflow_call:\n    inputs:\n      issue_number:\n        description: The issue number to post the diff comment to.\n        required: true\n        type: string\n      base_revision:\n        description: Base git revision.\n        required: true\n        type: string\n      head_revision:\n        description: Head git revision.\n        required: true\n        type: string\n    secrets:\n      SMITHY_RS_PULL_REQUEST_CDN_S3_BUCKET_NAME:\n        required: true\n      SMITHY_RS_PULL_REQUEST_CDN_ROLE_ARN:\n        required: true\n      # the docker login password for ECR (encrypted with the DOCKER_LOGIN_TOKEN_PASSPHRASE)\n      ENCRYPTED_DOCKER_PASSWORD:\n        required: false\n      DOCKER_LOGIN_TOKEN_PASSPHRASE:\n        required: false\n\n# Allow one instance of this workflow per pull request, and cancel older runs when new changes are pushed\nconcurrency:\n  group: pull-request-bot-yml-${{ inputs.issue_number }}\n  cancel-in-progress: true\n\nenv:\n  apt_dependencies: libssl-dev gnuplot jq\n  java_version: 17\n  rust_toolchain_components: clippy,rustfmt\n  rust_nightly_version: nightly-2025-10-18\n  ENCRYPTED_DOCKER_PASSWORD: ${{ secrets.ENCRYPTED_DOCKER_PASSWORD }}\n  DOCKER_LOGIN_TOKEN_PASSPHRASE: ${{ secrets.DOCKER_LOGIN_TOKEN_PASSPHRASE }}\n\njobs:\n  generate-diff:\n    runs-on: smithy_ubuntu-latest_8-core\n    name: Generate diff and upload to S3\n    env:\n      AWS_REGION: us-west-2\n      S3_BUCKET_NAME: ${{ secrets.SMITHY_RS_PULL_REQUEST_CDN_S3_BUCKET_NAME }}\n    permissions:\n      id-token: write\n      contents: read\n      pull-requests: write\n    outputs:\n      bot-message: ${{ steps.generate-diff.outputs.bot-message }}\n    steps:\n    - uses: GitHubSecurityLab/actions-permissions/monitor@v1\n    - uses: actions/checkout@v4\n      with:\n        path: smithy-rs\n        ref: ${{ inputs.head_revision }}\n    - name: Generate diff\n      uses: ./smithy-rs/.github/actions/docker-build\n      with:\n        action: generate-codegen-diff\n        action-arguments: ${{ inputs.base_revision }}\n    - uses: aws-actions/configure-aws-credentials@v4\n      name: Acquire credentials for uploading to S3\n      with:\n        role-to-assume: ${{ secrets.SMITHY_RS_PULL_REQUEST_CDN_ROLE_ARN }}\n        role-session-name: GitHubActions\n        aws-region: us-west-2\n    - name: Upload diff to S3\n      run: |\n        if [[ -d artifacts/codegen-diff/${{ inputs.base_revision }} ]]; then\n            aws s3 cp artifacts/codegen-diff/${{ inputs.base_revision }} \\\n                \"s3://${S3_BUCKET_NAME}/codegen-diff/${{ inputs.base_revision }}\" --recursive\n        fi\n\n  generate-doc-preview:\n    runs-on: smithy_ubuntu-latest_8-core\n    name: Generate rustdoc preview and upload to S3\n    env:\n      AWS_REGION: us-west-2\n      S3_BUCKET_NAME: ${{ secrets.SMITHY_RS_PULL_REQUEST_CDN_S3_BUCKET_NAME }}\n    permissions:\n      id-token: write\n      contents: read\n      pull-requests: write\n    outputs:\n      bot-message: ${{ steps.generate-preview.outputs.bot-message }}\n    steps:\n    - uses: actions/checkout@v4\n    - uses: actions/cache@v4\n      name: Gradle Cache\n      with:\n        path: |\n          ~/.gradle/caches\n          ~/.gradle/wrapper\n        key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*') }}\n        restore-keys: |\n          ${{ runner.os }}-gradle-\n      # JDK is needed to generate code\n    - name: Set up JDK\n      uses: actions/setup-java@v4\n      with:\n        distribution: corretto\n        java-package: jdk\n        java-version: ${{ env.java_version }}\n    - uses: dtolnay/rust-toolchain@master\n      with:\n        toolchain: ${{ env.rust_nightly_version }}\n    - name: Generate doc preview\n      id: generate-preview\n      # Only generate three of the smallest services since the doc build can be very large. STS, SSO, and SignIn must be\n      # included since aws-config depends on them. Transcribe Streaming and DynamoDB (paginators/waiters) were chosen\n      # below to stay small while still representing most features. Combined, they are about ~20MB at time of writing.\n      run: |\n        ./gradlew -Paws.services=+sts,+sso,+ssooidc,+signin,+transcribestreaming,+dynamodb :aws:sdk:assemble\n\n        # Copy the Server runtime crate(s) in\n        cp -r rust-runtime/aws-smithy-http-server rust-runtime/aws-smithy-http-server-python rust-runtime/aws-smithy-http-server-typescript rust-runtime/aws-smithy-legacy-http-server aws/sdk/build/aws-sdk/sdk\n\n        pushd aws/sdk/build/aws-sdk\n\n        # Remove example crates from workspace\n        sed -i '/examples/d' Cargo.toml\n\n        # Add server runtime crates to the workspace\n        sed -i 's/\"sdk\\/sts\",/\"sdk\\/sts\",\"sdk\\/aws-smithy-http-server\",\"sdk\\/aws-smithy-http-server-python\",\"sdk\\/aws-smithy-http-server-typescript\",\"sdk\\/aws-smithy-legacy-http-server\",/' Cargo.toml\n\n        RUSTDOCFLAGS=\"--cfg docsrs\" cargo +${{ env.rust_nightly_version }} doc --all-features --no-deps\n\n        popd\n        ./tools/ci-scripts/generate-doc-preview-index.sh ${{ inputs.base_revision }}\n\n        echo 'bot-message=A [new doc preview](https://d2luzm2xt3nokh.cloudfront.net/docs/'${{ inputs.head_revision }}'/index.html) is ready to view.' >> \"${GITHUB_OUTPUT}\"\n    - uses: aws-actions/configure-aws-credentials@v4\n      name: Acquire credentials for uploading to S3\n      with:\n        role-to-assume: ${{ secrets.SMITHY_RS_PULL_REQUEST_CDN_ROLE_ARN }}\n        role-session-name: GitHubActions\n        aws-region: us-west-2\n    - name: Upload doc preview to S3\n      run: |\n        aws s3 cp target/doc \"s3://${S3_BUCKET_NAME}/docs/${{ inputs.head_revision }}\" --recursive\n\n  post-bot-comment:\n    needs:\n    - generate-diff\n    - generate-doc-preview\n    runs-on: ubuntu-latest\n    name: Post bot comment\n    permissions:\n      id-token: write\n      contents: read\n      pull-requests: write\n    steps:\n    - uses: GitHubSecurityLab/actions-permissions/monitor@v1\n    - uses: actions/checkout@v4\n      with:\n        path: smithy-rs\n    - name: Download all artifacts\n      uses: ./smithy-rs/.github/actions/download-all-artifacts\n    - name: Set bot message outputs\n      id: bot-messages\n      run: |\n        set -eux\n        echo \"codegen-diff=$(cat ./bot-message-codegen-diff)\" >> \"${GITHUB_OUTPUT}\"\n    - name: Post bot comment\n      uses: actions/github-script@v7\n      with:\n        script: |\n          await github.rest.issues.createComment({\n            issue_number: ${{ inputs.issue_number }},\n            owner: context.repo.owner,\n            repo: context.repo.repo,\n            body: '${{ steps.bot-messages.outputs.codegen-diff }}\\n\\n' +\n              '${{ needs.generate-doc-preview.outputs.bot-message }}\\n\\n'\n          })\n"
  },
  {
    "path": ".github/workflows/pull-request-updating-lockfiles.yml",
    "content": "# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n\n# This is a shared workflow used by both `update-lockfiles.yml` and `manual-update-lockfiles.yml`.\n\nname: Pull Request for Updating Lockfiles\non:\n  workflow_call:\n    inputs:\n      base_branch:\n        description: The name of the branch on which to run `cargo update` for lockfiles\n        required: true\n        type: string\n      force_update_on_broken_dependencies:\n        description: When true, it forces `cargo update` to update broken dependencies to the latest semver-compatible versions, without downgrading them to the last known working versions\n        required: true\n        type: boolean\n    secrets:\n      DOCKER_LOGIN_TOKEN_PASSPHRASE:\n        required: true\n      SMITHY_RS_ECR_PUSH_ROLE_ARN:\n        required: true\n      RELEASE_AUTOMATION_BOT_PAT:\n        required: true\n\njobs:\n  save-docker-login-token:\n    name: Save a docker login token\n    timeout-minutes: 10\n    outputs:\n      docker-login-password: ${{ steps.set-token.outputs.docker-login-password }}\n    permissions:\n      id-token: write\n      contents: read\n    continue-on-error: true\n    runs-on: ubuntu-latest\n    steps:\n    - uses: GitHubSecurityLab/actions-permissions/monitor@v1\n    - name: Attempt to load a docker login password\n      uses: aws-actions/configure-aws-credentials@v4\n      with:\n        role-to-assume: ${{ secrets.SMITHY_RS_ECR_PUSH_ROLE_ARN }}\n        role-session-name: GitHubActions\n        aws-region: us-west-2\n    - name: Save the docker login password to the output\n      id: set-token\n      run: |\n        ENCRYPTED_PAYLOAD=$(\n          gpg --symmetric --batch --passphrase \"${{ secrets.DOCKER_LOGIN_TOKEN_PASSPHRASE }}\" --output - <(aws ecr get-login-password --region us-west-2) | base64 -w0\n        )\n        echo \"docker-login-password=$ENCRYPTED_PAYLOAD\" >> $GITHUB_OUTPUT\n\n  acquire-base-image:\n    name: Acquire Base Image\n    needs: save-docker-login-token\n    runs-on: ubuntu-latest\n    timeout-minutes: 60\n    env:\n      ENCRYPTED_DOCKER_PASSWORD: ${{ needs.save-docker-login-token.outputs.docker-login-password }}\n      DOCKER_LOGIN_TOKEN_PASSPHRASE: ${{ secrets.DOCKER_LOGIN_TOKEN_PASSPHRASE }}\n    permissions:\n      id-token: write\n      contents: read\n    steps:\n    - uses: GitHubSecurityLab/actions-permissions/monitor@v1\n    - uses: actions/checkout@v4\n      with:\n        path: smithy-rs\n    - uses: ./smithy-rs/.github/actions/free-disk-space\n    - name: Acquire base image\n      id: acquire\n      env:\n        DOCKER_BUILDKIT: 1\n      run: ./smithy-rs/.github/scripts/acquire-build-image\n    - name: Acquire credentials\n      uses: aws-actions/configure-aws-credentials@v4\n      with:\n        role-to-assume: ${{ secrets.SMITHY_RS_ECR_PUSH_ROLE_ARN }}\n        role-session-name: GitHubActions\n        aws-region: us-west-2\n    - name: Upload image\n      run: |\n        IMAGE_TAG=\"ci-$(./smithy-rs/.github/scripts/docker-image-hash)\"\n        ./smithy-rs/.github/scripts/upload-build-image.sh $IMAGE_TAG\n\n  create-pull-request-for-updating-lockfiles:\n    name: Create a Pull Request for updating lockfiles\n    needs:\n    - save-docker-login-token\n    - acquire-base-image\n    runs-on: ubuntu-latest\n    steps:\n    - uses: GitHubSecurityLab/actions-permissions/monitor@v1\n    - name: Checkout smithy-rs\n      uses: actions/checkout@v4\n      with:\n        path: smithy-rs\n        token: ${{ secrets.RELEASE_AUTOMATION_BOT_PAT }}\n    - name: Create branch name for updating lockfiles\n      id: branch-name-for-updating-lockfiles\n      shell: bash\n      run: |\n        branch_name=\"update-all-lockfiles-$(date +%s)\"\n        echo \"branch_name=${branch_name}\" > $GITHUB_OUTPUT\n    - name: Cargo update all lockfiles\n      env:\n        ENCRYPTED_DOCKER_PASSWORD: ${{ needs.save-docker-login-token.outputs.docker-login-password }}\n        DOCKER_LOGIN_TOKEN_PASSPHRASE: ${{ secrets.DOCKER_LOGIN_TOKEN_PASSPHRASE }}\n      uses: ./smithy-rs/.github/actions/docker-build\n      with:\n        action: cargo-update-lockfiles\n        action-arguments: ${{ inputs.base_branch }} ${{ steps.branch-name-for-updating-lockfiles.outputs.branch_name }} ${{ inputs.force_update_on_broken_dependencies }}\n    - name: Create pull request\n      working-directory: smithy-rs\n      shell: bash\n      env:\n        GITHUB_TOKEN: ${{ secrets.RELEASE_AUTOMATION_BOT_PAT }}\n      run: |\n        echo -e 'If CI fails, commit the necessary fixes to this PR until all checks pass.\\n\\nIf changes are required to [crateNameToLastKnownWorkingVersions](https://github.com/smithy-lang/smithy-rs/blob/92916b5484cdfef9ff58540ebf5e845eeeccf860/aws/sdk/build.gradle.kts#L504), revert the first commit in the PR, run `./gradlew aws:sdk:cargoUpdateAllLockfiles`, and commit the updated lockfiles.' | \\\n        gh pr create \\\n          --title 'Run `cargo update` on the runtime lockfiles and the SDK lockfile' \\\n          --base ${{ inputs.base_branch }} \\\n          --head ${{ steps.branch-name-for-updating-lockfiles.outputs.branch_name }} \\\n          --label \"needs-sdk-review\" \\\n          --body-file -\n"
  },
  {
    "path": ".github/workflows/release-scripts/create-release.js",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n// This script is used by the release.yml GitHub Actions workflow to idempotently\n// create a tagged GitHub release from the generated release manifest file.\n\nconst assert = require(\"assert\");\nconst fs = require(\"fs\");\n\nconst smithy_rs_repo = {\n    owner: \"smithy-lang\",\n    repo: \"smithy-rs\",\n};\n\nasync function getExistingRelease(github, tag) {\n    try {\n        const response = await github.rest.repos.getReleaseByTag({ ...smithy_rs_repo, tag });\n        return { name: response.data.name, body: response.data.body };\n    } catch (error) {\n        if (error.status === 404) {\n            console.info(`No existing release found with tag '${tag}'`);\n            return null;\n        }\n        throw error;\n    }\n}\n\nfunction loadReleaseManifest(path) {\n    const releaseManifest = JSON.parse(fs.readFileSync(path));\n    console.info(\"Release manifest: \", releaseManifest);\n    assert(releaseManifest.tagName !== undefined, \"release manifest must have a `tagName` field\");\n    assert(releaseManifest.name !== undefined, \"release manifest must have a `name` field\");\n    assert(releaseManifest.body !== undefined, \"release manifest must have a `body` field\");\n    assert(releaseManifest.prerelease !== undefined, \"release manifest must have a `prerelease` field\");\n    return releaseManifest;\n}\n\nmodule.exports = async ({\n    // GitHub API (Octokit)\n    github,\n    // Boolean indicating if this is a dry-run release or not\n    isDryRun,\n    // Release manifest file path\n    releaseManifestPath,\n    // The commit-like reference that we want to release (e.g. a commit SHA or a branch name)\n    releaseCommitish,\n}) => {\n    assert(github !== undefined, \"The `github` argument is required\");\n    assert(isDryRun !== undefined, \"The `isDryRun` argument is required\");\n    assert(releaseManifestPath !== undefined, \"The `releaseManifestPath` argument is required\");\n    assert(releaseCommitish !== undefined, \"The `releaseCommitish` argument is required\");\n\n    console.info(`Starting GitHub release creation with isDryRun: ${isDryRun}, and releaseManifestPath: '${releaseManifestPath}'`);\n\n    // Load the release manifest generated by the `changelogger` tool during build\n    const releaseManifest = loadReleaseManifest(releaseManifestPath);\n\n    // Idempotency check: Look up an existing GitHub release for the tag in the release manifest\n    const existingRelease = await getExistingRelease(github, releaseManifest.tagName);\n    if (existingRelease) {\n        console.info(`Found an existing release with tag '${releaseManifest.tagName}': `, existingRelease);\n        if (existingRelease.name !== releaseManifest.name || existingRelease.body !== releaseManifest.body) {\n            throw Error(\"FATAL: Existing release does not match the release manifest!\");\n        } else {\n            console.info(\"SUCCESS: Existing release matches details in the release manifest. No work needs to be done!\");\n        }\n    } else {\n        // Explicitly comparing against `false` to avoid accidental publish in the event that\n        // the `isDryRun` argument wasn't passed in correctly from the GitHub Actions workflow.\n        if (isDryRun === false) {\n            console.info(\"Not a dry-run; creating a new release...\");\n            const response = await github.rest.repos.createRelease({\n                ...smithy_rs_repo,\n                tag_name: releaseManifest.tagName,\n                name: releaseManifest.name,\n                body: releaseManifest.body,\n                prerelease: releaseManifest.prerelease,\n                target_commitish: releaseCommitish,\n            });\n            console.info(`SUCCESS: Created release with ID: ${response.data.id}, URL: ${response.data.html_url} `);\n        } else {\n            console.info(\"SUCCESS: Exiting early since this is a dry-run release.\");\n        }\n    }\n};\n"
  },
  {
    "path": ".github/workflows/release.yml",
    "content": "# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n\n# This is the shared release workflow run by both `prod-release.yml` and `dry-run-release.yml'.\n# A calling workflow will indicate whether it wants to run this with a prod run or a dry run.\n\n# Allow only one release to run at a time\nconcurrency:\n  group: release-smithy-rs-${{ inputs.dry_run }}\n  cancel-in-progress: true\n\nenv:\n  rust_version: 1.91.1\n\nname: Release smithy-rs\non:\n  workflow_call:\n    inputs:\n      commit_sha:\n        description: The SHA of the git commit that you want to release.\n        required: true\n        type: string\n      dry_run:\n        description: When true, it only produces release artifacts, but will not cut a release tag in GitHub or publish to crates.io.\n        required: true\n        type: boolean\n      skip_ci:\n        description: Skip CI when executing a release\n        required: true\n        type: boolean\n    secrets:\n      RELEASE_AUTOMATION_BOT_PAT:\n        required: true\n      RELEASE_AUTOMATION_BOT_CRATESIO_TOKEN:\n        required: true\n      CANARY_GITHUB_ACTIONS_ROLE_ARN:\n        required: true\n      CANARY_STACK_CDK_OUTPUTS_BUCKET_NAME:\n        required: true\n      SMITHY_RS_ECR_PUSH_ROLE_ARN:\n        required: true\n      MAVEN_CENTRAL_GPG_PUBLIC_KEY_SECRET_ARN:\n        required: true\n      MAVEN_CENTRAL_GPG_PRIVATE_KEY_SECRET_ARN:\n        required: true\n      MAVEN_CENTRAL_GPG_PASSPHRASE_SECRET_ARN:\n        required: true\n      MAVEN_CENTRAL_SONATYPE_CREDENTIALS_SECRET_ARN:\n        required: true\n\njobs:\n  check-actor-for-prod-run:\n    name: Check actor for prod run\n    if: inputs.dry_run == false\n    runs-on: ubuntu-latest\n    env:\n      ACTOR: ${{ github.actor }}\n    steps:\n    - uses: GitHubSecurityLab/actions-permissions/monitor@v1\n    - name: Check actor for prod run\n      run: |\n        set -e\n\n        if [ \"${ACTOR}\" != \"aws-sdk-rust-ci\" ]; then\n          echo \"Error: The current actor is '${ACTOR}' but only 'aws-sdk-rust-ci' is allowed to run a prod release workflow.\"\n          exit 1\n        fi\n\n        echo \"The current actor is 'aws-sdk-rust-ci', continuing with the workflow.\"\n\n  # We'll need to build a base image to work against if:\n  # - a release was kicked off before the image build step triggered by a push to the release branch/main completed\n  # - a dry-run release was kicked off against a feature branch to test automation changes\n  # This job will be a no-op if an image had already been built.\n  acquire-base-image:\n    name: Acquire Base Image\n    permissions:\n      id-token: write\n      contents: read\n    needs:\n    - check-actor-for-prod-run\n    # We need `always` here otherwise this job won't run if the previous job has been skipped\n    # See https://samanpavel.medium.com/github-actions-conditional-job-execution-e6aa363d2867\n    if: |\n      always() &&\n      (needs.check-actor-for-prod-run.result == 'success' || needs.check-actor-for-prod-run.result == 'skipped')\n    runs-on: smithy_ubuntu-latest_16-core\n    steps:\n    - uses: GitHubSecurityLab/actions-permissions/monitor@v1\n    - uses: actions/checkout@v4\n      with:\n        path: smithy-rs\n        ref: ${{ inputs.commit_sha }}\n        fetch-depth: 0\n    - uses: ./smithy-rs/.github/actions/free-disk-space\n    - name: Acquire credentials\n      uses: aws-actions/configure-aws-credentials@v4\n      with:\n        role-to-assume: ${{ secrets.SMITHY_RS_ECR_PUSH_ROLE_ARN }}\n        role-session-name: GitHubActions\n        aws-region: us-west-2\n    - name: Acquire base image\n      id: acquire\n      run: ./smithy-rs/.github/scripts/acquire-build-image\n    - name: Upload base image\n      uses: actions/upload-artifact@v4\n      with:\n        name: smithy-rs-base-image\n        path: smithy-rs-base-image\n        retention-days: 1\n\n  release-ci:\n    name: Pre-release checks\n    # We need `always` here otherwise this job won't run if the previous job has been skipped\n    # See https://samanpavel.medium.com/github-actions-conditional-job-execution-e6aa363d2867\n    if: always() && inputs.skip_ci == false\n    needs:\n    - acquire-base-image\n    uses: ./.github/workflows/ci.yml\n    with:\n      git_ref: ${{ inputs.commit_sha }}\n    secrets:\n      CANARY_GITHUB_ACTIONS_ROLE_ARN: ${{ secrets.CANARY_GITHUB_ACTIONS_ROLE_ARN }}\n      CANARY_STACK_CDK_OUTPUTS_BUCKET_NAME: ${{ secrets.CANARY_STACK_CDK_OUTPUTS_BUCKET_NAME }}\n\n  check-semver-hazards:\n    name: Check for semver hazards\n    needs:\n    - acquire-base-image\n    # We need `always` here otherwise this job won't run if the previous job has been skipped\n    # See https://samanpavel.medium.com/github-actions-conditional-job-execution-e6aa363d2867\n    if: always()\n    runs-on: smithy_ubuntu-latest_8-core\n    steps:\n    - uses: actions/checkout@v4\n      with:\n        path: smithy-rs\n        ref: ${{ inputs.commit_sha }}\n        fetch-depth: 0\n    - uses: actions/checkout@v4\n      with:\n        repository: awslabs/aws-sdk-rust\n        path: aws-sdk-rust\n        fetch-depth: 0\n    - name: Run check-semver-hazards\n      uses: ./smithy-rs/.github/actions/docker-build\n      with:\n        action: check-semver-hazards\n        use_cache: false\n\n  get-or-create-release-branch:\n    name: Get or create a release branch\n    needs:\n    - acquire-base-image\n    - check-semver-hazards\n    - release-ci\n    # We need `always` here otherwise this job won't run if the previous job has been skipped\n    # See https://samanpavel.medium.com/github-actions-conditional-job-execution-e6aa363d2867\n    if: |\n      always() &&\n      needs.acquire-base-image.result == 'success' &&\n      (needs.release-ci.result == 'success' || needs.release-ci.result == 'skipped')\n    runs-on: ubuntu-latest\n    outputs:\n      release_branch: ${{ steps.branch-push.outputs.release_branch }}\n      new_release_series: ${{ steps.branch-push.outputs.new_release_series }}\n    steps:\n    - uses: GitHubSecurityLab/actions-permissions/monitor@v1\n    - uses: actions/checkout@v4\n      with:\n        ref: ${{ inputs.commit_sha }}\n        token: ${{ secrets.RELEASE_AUTOMATION_BOT_PAT }}\n        fetch-depth: 0\n    - name: Get or create release branch\n      id: branch-push\n      shell: bash\n      env:\n        DRY_RUN: ${{ inputs.dry_run }}\n      run: |\n        set -e\n\n        ./.github/scripts/get-or-create-release-branch.sh output\n        cat output > $GITHUB_OUTPUT\n\n  release:\n    name: Release\n    needs:\n    - get-or-create-release-branch\n    # See https://github.com/actions/runner/issues/2205#issuecomment-1381988186 for an explanation as to why\n    # we need this here _even though_ the job we depend on is never skipped.\n    if: |\n      always() &&\n      !contains(needs.*.result, 'failure') &&\n      !contains(needs.*.result, 'cancelled')\n    runs-on: smithy_ubuntu-latest_16-core\n    steps:\n    - uses: GitHubSecurityLab/actions-permissions/monitor@v1\n    - name: Install Rust\n      uses: dtolnay/rust-toolchain@master\n      with:\n        toolchain: ${{ env.rust_version }}\n    - name: Checkout smithy-rs\n      uses: actions/checkout@v4\n      with:\n        ref: ${{ inputs.commit_sha }}\n        path: smithy-rs\n        token: ${{ secrets.RELEASE_AUTOMATION_BOT_PAT }}\n        fetch-depth: 0\n    - name: Generate release artifacts\n      uses: ./smithy-rs/.github/actions/docker-build\n      with:\n        action: generate-smithy-rs-release\n        use_cache: false\n    - name: Download all artifacts\n      uses: ./smithy-rs/.github/actions/download-all-artifacts\n        # This step is not idempotent, as it pushes release artifacts to the `smithy-rs-release-1.x.y` branch. However,\n        # if this step succeeds but a subsequent step fails, retrying the release workflow is \"safe\" in that it does not\n        # create any inconsistent states; this step would simply fail because the release branch would be ahead of `main`\n        # due to previously pushed artifacts.\n        # To successfully retry a release, revert the commits in the release branch that pushed the artifacts.\n    - name: Push smithy-rs changes\n      shell: bash\n      working-directory: smithy-rs-release/smithy-rs\n      id: push-changelog\n      env:\n        RELEASE_BRANCH_NAME: ${{ needs.get-or-create-release-branch.outputs.release_branch }}\n        DRY_RUN: ${{ inputs.dry_run }}\n      run: |\n        if ! git diff-index --quiet HEAD; then\n          echo \"Pushing release commits...\"\n          # This will fail if we tried to release from a non-HEAD commit on the release branch.\n          # The only scenario where we would try to release a non-HEAD commit from the release branch is\n          # to retry a release action execution that failed due to a transient issue.\n          # In that case, we expect the commit to be releasable as-is, i.e. the changelog should have already\n          # been processed.\n          git fetch\n          if [[ \"${DRY_RUN}\" == \"true\" ]]; then\n            # During dry-runs, \"git push\" without \"--force\" can fail if smithy-rs-release-x.y.z-preview is behind\n            # smithy-rs-release-x.y.z, but that does not matter much during dry-runs.\n            git push --force origin \"HEAD:refs/heads/${RELEASE_BRANCH_NAME}\"\n            git push --dry-run origin \"HEAD:refs/heads/${RELEASE_BRANCH_NAME}\"\n          else\n            echo \"attempting to push $(git rev-parse HEAD) to $RELEASE_BRANCH_NAME $(git rev-parse $RELEASE_BRANCH_NAME)\"\n            git push origin \"HEAD:refs/heads/${RELEASE_BRANCH_NAME}\"\n          fi\n        fi\n        echo \"commit_sha=$(git rev-parse HEAD)\" > $GITHUB_OUTPUT\n       # This step is idempotent; the `publisher` will not publish a crate if the version is already published on crates.io.\n    - name: Publish to crates.io\n      shell: bash\n      working-directory: smithy-rs-release/crates-to-publish\n      env:\n        CARGO_REGISTRY_TOKEN: ${{ secrets.RELEASE_AUTOMATION_BOT_CRATESIO_TOKEN }}\n      run: |\n        cargo install --path \"$(realpath ../smithy-rs/tools/ci-build/publisher)\"\n        # Verify the publisher tool installed successfully\n        publisher --version\n\n        if [[ \"${{ inputs.dry_run }}\" == \"true\" ]]; then\n          if [[ ! -f aws-smithy-types/Cargo.toml ]]; then\n            echo \"Crates to publish not found!\"\n            exit 1\n          fi\n          echo \"Checking cargo auth token...\"\n          # This version has already been yanked. This command succeeds if we have a token with permission to yank the crate.\n          cargo yank aws-sigv4 --version 0.55.0\n        else\n          publisher publish -y --location .\n        fi\n       # This step is not idempotent and MUST be performed last, as it will generate a new release in the `smithy-rs`\n        # repository with the release tag that is always unique and has an increasing numerical suffix.\n    - name: Tag release\n      uses: actions/github-script@v7\n      with:\n        github-token: ${{ secrets.RELEASE_AUTOMATION_BOT_PAT }}\n        script: |\n          const createReleaseScript = require(\"./smithy-rs/.github/workflows/release-scripts/create-release.js\");\n          await createReleaseScript({\n            github,\n            isDryRun: ${{ inputs.dry_run }},\n            releaseManifestPath: \"smithy-rs-release/smithy-rs-release-manifest.json\",\n            releaseCommitish: \"${{ steps.push-changelog.outputs.commit_sha }}\"\n          });\n\n  publish-to-maven-central:\n    name: Publish Codegen artifacts to Maven Central\n    needs:\n    - release\n    if: always() && needs.release.result == 'success'\n    runs-on: smithy_ubuntu-latest_8-core\n    steps:\n    - uses: GitHubSecurityLab/actions-permissions/monitor@v1\n    - uses: actions/checkout@v4\n      with:\n        path: smithy-rs\n        ref: ${{ inputs.commit_sha }}\n        fetch-depth: 0\n    - name: Set up JDK\n      uses: actions/setup-java@v4\n      with:\n        distribution: temurin\n        java-version: '17'\n    - name: Check if publishing is needed\n      id: check-publish\n      shell: bash\n      working-directory: smithy-rs\n      run: |\n        # Run the Gradle task to check if publishing is needed\n        ./gradlew checkMavenCentralPublishingNeeded\n\n        # Read the result from the build\n        if grep -q \"mavenCentralPublishingNeeded=true\" build/maven-central/publishing.properties; then\n          echo \"publish=true\" >> $GITHUB_OUTPUT\n        else\n          echo \"publish=false\" >> $GITHUB_OUTPUT\n        fi\n    - name: Acquire credentials\n      if: steps.check-publish.outputs.publish == 'true'\n      uses: aws-actions/configure-aws-credentials@v4\n      with:\n        role-to-assume: ${{ secrets.SMITHY_RS_ECR_PUSH_ROLE_ARN }}\n        role-session-name: GitHubActions\n        aws-region: us-west-2\n    - name: Publish to Maven Central\n      if: steps.check-publish.outputs.publish == 'true'\n      shell: bash\n      working-directory: smithy-rs\n      env:\n        GPG_PUBLIC_KEY_SECRET_ARN: ${{ secrets.MAVEN_CENTRAL_GPG_PUBLIC_KEY_SECRET_ARN }}\n        GPG_PRIVATE_KEY_SECRET_ARN: ${{ secrets.MAVEN_CENTRAL_GPG_PRIVATE_KEY_SECRET_ARN }}\n        GPG_PASSPHRASE_SECRET_ARN: ${{ secrets.MAVEN_CENTRAL_GPG_PASSPHRASE_SECRET_ARN }}\n        SONATYPE_CREDENTIALS_SECRET_ARN: ${{ secrets.MAVEN_CENTRAL_SONATYPE_CREDENTIALS_SECRET_ARN }}\n        JRELEASER_DRY_RUN: ${{ inputs.dry_run }}\n      run: |\n        pwd\n        # Get secrets from AWS Secrets Manager\n        GPG_PUBLIC_KEY=$(aws secretsmanager get-secret-value --secret-id $GPG_PUBLIC_KEY_SECRET_ARN --query SecretString --output text)\n        GPG_PRIVATE_KEY=$(aws secretsmanager get-secret-value --secret-id $GPG_PRIVATE_KEY_SECRET_ARN --query SecretString --output text)\n        GPG_PASSPHRASE=$(aws secretsmanager get-secret-value --secret-id $GPG_PASSPHRASE_SECRET_ARN --query SecretString --output text)\n\n        # Get Sonatype credentials from JSON secret\n        SONATYPE_CREDS=$(aws secretsmanager get-secret-value --secret-id $SONATYPE_CREDENTIALS_SECRET_ARN --query SecretString --output text)\n        MAVEN_CENTRAL_USERNAME=$(echo $SONATYPE_CREDS | jq -r '.[\"sonatype-portal-token-username\"]')\n        MAVEN_CENTRAL_TOKEN=$(echo $SONATYPE_CREDS | jq -r '.[\"sonatype-portal-token\"]')\n\n        # Set up JReleaser environment variables\n        export JRELEASER_GPG_PUBLIC_KEY=\"$GPG_PUBLIC_KEY\"\n        export JRELEASER_GPG_SECRET_KEY=\"$GPG_PRIVATE_KEY\"\n        export JRELEASER_GPG_PASSPHRASE=\"$GPG_PASSPHRASE\"\n        export JRELEASER_MAVENCENTRAL_USERNAME=\"$MAVEN_CENTRAL_USERNAME\"\n        export JRELEASER_MAVENCENTRAL_TOKEN=\"$MAVEN_CENTRAL_TOKEN\"\n        export JRELEASER_GENERIC_TOKEN=not-used-but-must-be-set\n\n        # Run Gradle publish task to stage outputs to build/m2 directory\n        ./gradlew publish\n        ls -lsa build/m2/software/amazon/smithy/rust\n        ./gradlew jreleaserConfig\n        ./gradlew jreleaserFullRelease\n\n  # If this step fails for any reason, there's no need to retry the release workflow, as this step is auxiliary\n  # and the release itself was successful. Instead, manually trigger `backport-pull-request.yml`.\n  open-backport-pull-request:\n    name: Open backport pull request to merge the release branch back to main\n    needs:\n    - release\n    # See https://github.com/actions/runner/issues/2205#issuecomment-1381988186 for details on the workaround\n    if: inputs.dry_run == false && always() && needs.release.result == 'success'\n    uses: ./.github/workflows/backport-pull-request.yml\n    secrets:\n      RELEASE_AUTOMATION_BOT_PAT: ${{ secrets.RELEASE_AUTOMATION_BOT_PAT }}\n\n  publish-build-image:\n    name: Publish new smithy-rs-build-image tag to ECR\n    runs-on: smithy_ubuntu-latest_8-core\n    needs:\n    - acquire-base-image\n    - release\n    if: always() && needs.release.result == 'success'\n    steps:\n    - uses: GitHubSecurityLab/actions-permissions/monitor@v1\n    - uses: actions/checkout@v4\n      with:\n        path: smithy-rs\n        ref: ${{ inputs.commit_sha }}\n        fetch-depth: 0\n    - name: Download all artifacts\n      uses: ./smithy-rs/.github/actions/download-all-artifacts\n    - name: Acquire credentials\n      uses: aws-actions/configure-aws-credentials@v4\n      with:\n        role-to-assume: ${{ secrets.SMITHY_RS_ECR_PUSH_ROLE_ARN }}\n        role-session-name: GitHubActions\n        aws-region: us-west-2\n    - name: Tag and upload new build image\n      env:\n        DRY_RUN: ${{ inputs.dry_run }}\n      shell: bash\n      run: |\n        set -x\n        ls -lsa\n        docker image ls\n\n        # re-load the already built image from previous acquire-build-image step\n        # image tags in CI are tagged as ci-<tools-dir-sha>\n        CI_IMAGE_TAG=\"ci-$(./smithy-rs/.github/scripts/docker-image-hash)\"\n        docker load -i smithy-rs-base-image/smithy-rs-base-image\n        docker tag \"smithy-rs-base-image:${CI_IMAGE_TAG}\" \"smithy-rs-base-image:local\"\n        docker image ls\n        # running acquire-build-image with local builds turned off is mostly a no-op\n        # but it sets up the appropriate \"local\" tags needed for re-tagging\n        ALLOW_LOCAL_BUILD=false ./smithy-rs/.github/scripts/acquire-build-image\n        docker image ls\n\n        RELEASE_IMAGE_TAG=$(jq -r \".tagName\" smithy-rs-release/smithy-rs-release-manifest.json)\n        ./smithy-rs/.github/scripts/upload-build-image.sh $RELEASE_IMAGE_TAG\n"
  },
  {
    "path": ".github/workflows/update-lockfiles.yml",
    "content": "# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n\nname: Update lockfiles scheduled\nrun-name: ${{ github.workflow }}\non:\n  schedule:\n    # Runs 22:00 UTC every Tuesday\n  - cron: 0 22 * * 2\n\npermissions:\n  contents: read\n  id-token: write\n\njobs:\n  cargo-update-runtime-lockfiles-and-sdk-lockfile:\n    name: Run cargo update on the runtime lockfiles and the SDK lockfile\n    # Don't run on forked repositories\n    if: github.repository == 'smithy-lang/smithy-rs'\n    uses: ./.github/workflows/pull-request-updating-lockfiles.yml\n    with:\n      base_branch: main\n      force_update_on_broken_dependencies: false\n    secrets:\n      DOCKER_LOGIN_TOKEN_PASSPHRASE: ${{ secrets.DOCKER_LOGIN_TOKEN_PASSPHRASE }}\n      SMITHY_RS_ECR_PUSH_ROLE_ARN: ${{ secrets.SMITHY_RS_ECR_PUSH_ROLE_ARN }}\n      RELEASE_AUTOMATION_BOT_PAT: ${{ secrets.RELEASE_AUTOMATION_BOT_PAT }}\n"
  },
  {
    "path": ".github/workflows/update-sdk-next.yml",
    "content": "# This workflow updates the `next` branch with freshly generated\n# code from the latest smithy-rs and models that reside in aws-sdk-rust.\n\n# Allow only one release to run at a time\nconcurrency:\n  group: update-aws-sdk-next\n  cancel-in-progress: true\n\nname: Update `aws-sdk-rust/next`\non:\n  workflow_dispatch:\n    inputs:\n      generate_ref:\n        description: |\n          Which branch/commit/tag of smithy-rs to use to generate aws-sdk-rust/next. Defaults to `main`.\n        required: true\n        type: string\n        default: main\n\njobs:\n  update-next:\n    name: Update `next`\n    runs-on: ubuntu-latest\n    steps:\n    - uses: GitHubSecurityLab/actions-permissions/monitor@v1\n    - name: Check out `smithy-rs`\n      uses: actions/checkout@v4\n      with:\n        repository: smithy-lang/smithy-rs\n        ref: ${{ inputs.generate_ref }}\n        path: smithy-rs\n    - name: Check out `aws-sdk-rust`\n      uses: actions/checkout@v4\n      with:\n        repository: awslabs/aws-sdk-rust\n        ref: main\n        path: aws-sdk-rust\n        token: ${{ secrets.RELEASE_AUTOMATION_BOT_PAT }}\n    - name: Set up JDK\n      uses: actions/setup-java@v4\n      with:\n        distribution: corretto\n        java-package: jdk\n        java-version: 17\n      # Rust is only used to `rustfmt` the generated code; doesn't need to match MSRV\n    - name: Set up Rust\n      uses: dtolnay/rust-toolchain@master\n      with:\n        toolchain: 1.91.1\n    - name: Delete old SDK\n      run: |\n    - name: Generate a fresh SDK\n      run: |\n        WORKSPACE=\"$(pwd)\"\n        cd smithy-rs\n        ./gradlew aws:sdk:assemble --info -Paws.sdk.models.path=\"${WORKSPACE}/aws-sdk-rust/aws-models\"\n    - name: Update `aws-sdk-rust/next`\n      run: |\n        set -eux\n        cd aws-sdk-rust\n        git checkout origin/main -b next\n\n        # Delete the old SDK\n        rm -rf sdk examples tests\n        rm -f versions.toml Cargo.toml index.md\n\n        # Copy in the new SDK\n        mv ../smithy-rs/aws/sdk/build/aws-sdk/* .\n        git add .\n        git -c 'user.name=AWS SDK Rust Bot' -c 'user.email=aws-sdk-rust-primary@amazon.com' commit -m 'Update `aws-sdk-rust/next`' --allow-empty\n        git push origin next:next --force\n"
  },
  {
    "path": ".gitignore",
    "content": "# attn: Intellij related ignores belong in ~/.gitignore\n# Java/Kotlin\n# Compiled class file\n*.class\n\n# Log file\n*.log\n\n# BlueJ files\n*.ctxt\n\n# Mobile Tools for Java (J2ME)\n.mtj.tmp/\n\n# Package Files #\n*.jar\n*.war\n*.nar\n*.ear\n*.zip\n*.rar\n\n# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml\nhs_err_pid*\n\n\n# Gradle\n.gradle\nbuild/\n**/bin/main/\n**/bin/test/\n\n# Ignore Gradle GUI config\ngradle-app.setting\n\n# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored)\n!gradle-wrapper.jar\n\n# Cache of project\n.gradletasknamecache\n\n# # Work around https://youtrack.jetbrains.com/issue/IDEA-116898\n# gradle/wrapper/gradle-wrapper.properties\n\n# MacOS\n.DS_Store\n\n# Rust build artifacts\ntarget/\n\n# IDEs\n.idea/\n.vscode/\n.project\n.settings\n.classpath\n\n# tools\n.tool-versions\n\n# python\n__pycache__\n"
  },
  {
    "path": ".pre-commit-config.yaml",
    "content": "repos:\n- repo: https://github.com/pre-commit/pre-commit-hooks\n  rev: v4.4.0\n  hooks:\n  - id: check-yaml\n  - id: end-of-file-fixer\n    exclude: ^aws/rust-runtime/(aws-sigv4/aws-sig-v4-test-suite/|aws-config/test-data/default-provider-chain/eks_pod_identity_credentials/fs/token.jwt$)\n  - id: trailing-whitespace\n- repo: https://github.com/macisamuele/language-formatters-pre-commit-hooks\n  rev: v2.11.0\n  hooks:\n  - id: pretty-format-yaml\n    args: [--autofix, --indent, '2']\n  - id: pretty-format-rust\n    entry: rustfmt --edition 2021\n    files: ^.*\\.rs$\n- repo: local\n  hooks:\n  - id: ktlint\n    name: Ktlint\n    entry: ./.pre-commit-hooks/ktlint.sh\n    language: system\n    files: ^.*\\.kt$\n  - id: kotlin-block-quotes\n    name: Kotlin Block Quotes\n    entry: ./.pre-commit-hooks/kotlin-block-quotes.py\n    language: python\n    files: ^.*\\.kt$\n  - id: sdk-lints-check\n    name: sdk-lints\n    entry: ./.pre-commit-hooks/sdk-lints.sh\n    language: system\n    files: ^.*$\n    pass_filenames: false\n  # Check that runtime crates are properly version bumped when changed\n  - id: runtime-versioner-check\n    name: runtime-versioner\n    entry: ./.pre-commit-hooks/runtime-versioner.sh\n    language: system\n    # Only run if the rust runtime files change\n    files: ^.*/?rust-runtime/.*$\n    pass_filenames: false\n    # Show the info messages from the runtime versioner that explain how things will publish\n    verbose: true\n"
  },
  {
    "path": ".pre-commit-hooks/kotlin-block-quotes.py",
    "content": "#!/usr/bin/env python\n\n#  Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n#  SPDX-License-Identifier: Apache-2.0\n\n#\n# Script for pre-commit that fixes Kotlin block quote indentation\n# for Smithy codegen, where the actual whitespace in the block quotes\n# doesn't actually matter.\n#\n# In anticipation that the script isn't perfect, it will not change any\n# file if non-indentation changes were made. Instead, it fails and says\n# where the ambiguous code is so that it can be touched up manually.\n#\n# To run unit tests, run this script directly with the `--self-test` arg.\n# To test against the repository, run `pre-commit run --all --verbose`.\n#\nimport re\nimport sys\nimport unittest\nfrom enum import Enum\n\nINDENT_SIZE = 4\n\n# Chops of any line comment\ndef without_line_comment(line):\n    line_comment_start = line.find(\"//\")\n    if line_comment_start != -1:\n        return line[:line_comment_start]\n    return line\n\ndef _calc_block_comment(line, direction):\n    regex = \"(\" + re.escape(\"/*\") + \"|\" + re.escape(\"*/\") + \"|\" + re.escape(\"//\") + \")\"\n    tokens = [m.string[m.start(0):m.end(0)] for m in re.finditer(regex, line)]\n    depth = 0\n    for token in tokens:\n        if direction > 0 and token == \"//\" and depth == 0:\n            break\n        elif token == \"/*\":\n            depth += direction\n        elif token == \"*/\":\n            depth -= direction\n    return depth > 0\n\n# Returns True if the line starts a block comment\ndef starts_block_comment(line):\n    return _calc_block_comment(line, 1)\n\n# Returns True if the line ends a block comment\ndef ends_block_comment(line):\n    return _calc_block_comment(line, -1)\n\n# Returns True if the line starts or ends a block quote (depending on state)\ndef starts_or_ends_block_quote(line, inside_block_quotes):\n    regex = \"(\" + re.escape('\"\"\"') + \"|\" + re.escape(\"//\") + \")\"\n    tokens = [m.string[m.start(0):m.end(0)] for m in re.finditer(regex, line)]\n    start_value = inside_block_quotes\n    for token in tokens:\n        if not inside_block_quotes and token == \"//\":\n            break\n        elif token == '\"\"\"':\n            inside_block_quotes = not inside_block_quotes\n    return start_value != inside_block_quotes\n\n# Returns the indentation of a line\ndef line_indent(line):\n    indent = re.search(r\"[^\\s]\", line)\n    if indent != None:\n        return indent.start(0)\n    else:\n        return 0\n\n# Changes the indentation of a line\ndef adjust_indent(line, indent):\n    old_indent = re.search(r\"[^\\s]\", line)\n    if old_indent == None:\n        return line\n    line = line[old_indent.start(0):]\n    return (\" \" * indent) + line\n\n# Parser state.\nclass State(Enum):\n    Default = 0 # Just started, or not inside a block comment or block quote\n    InsideBlockComment = 1\n    InsideBlockQuote = 2\n\n# Fixes block quote indentation and returns a list of line numbers changed\ndef fix_lines(lines):\n    state = State.Default\n    changed = []\n    correct_indent = 0\n    correct_end_indent = 0\n    first_inner_indent = None\n\n    for index, line in enumerate(lines):\n        # Look for block quotes or block comments\n        if state == State.Default:\n            if starts_block_comment(line):\n                state = State.InsideBlockComment\n            elif starts_or_ends_block_quote(line, inside_block_quotes = False):\n                state = State.InsideBlockQuote\n                correct_end_indent = line_indent(line)\n                # Determine correct block comment indentation once one is found\n                if line.lstrip().startswith('\"\"\"'):\n                    correct_indent = line_indent(line)\n                else:\n                    correct_indent = line_indent(line) + INDENT_SIZE\n                first_inner_indent = None\n\n        # Skip all lines inside of block comments\n        elif state == State.InsideBlockComment:\n            if ends_block_comment(line):\n                state = State.Default\n\n        # Format block quotes\n        elif state == State.InsideBlockQuote:\n            if first_inner_indent == None and len(line.strip()) == 0:\n                continue\n\n            current_indent = line_indent(line)\n            # Track the first line's indentation inside of the block quote\n            # so that relative indentation can be preserved.\n            if first_inner_indent == None:\n                first_inner_indent = current_indent\n            # Handle the end of the block quote\n            if starts_or_ends_block_quote(line, inside_block_quotes = True):\n                if line.lstrip().startswith('\"\"\"') and current_indent != correct_end_indent:\n                    lines[index] = adjust_indent(line, correct_end_indent)\n                    changed.append(index + 1)\n                state = State.Default\n            else:\n                # Handle lines in the middle of the block quote\n                indent_relative_to_first = max(0, current_indent - first_inner_indent)\n                adjusted_indent = correct_indent + indent_relative_to_first\n                if current_indent != adjusted_indent:\n                    lines[index] = adjust_indent(line, adjusted_indent)\n                    changed.append(index + 1)\n\n    return changed\n\n# Determines if the changes made were only to indentation\ndef only_changed_indentation(lines_before, lines_after):\n    if len(lines_before) != len(lines_after):\n        return False\n    for index in range(0, len(lines_before)):\n        if lines_before[index].lstrip() != lines_after[index].lstrip():\n            return False\n    return True\n\n# Fixes the indentation in a file, and returns True if the file was changed\ndef fix_file(file_name):\n    lines = []\n    with open(file_name, \"r\") as file:\n        lines = file.readlines()\n    old_lines = lines[:]\n    changed_line_numbers = fix_lines(lines)\n    if len(changed_line_numbers) > 0 and old_lines != lines:\n        # This script isn't perfect, so if anything other than whitespace changed,\n        # then bail to avoid losing any code changes.\n        if not only_changed_indentation(old_lines, lines):\n            print(\"ERROR: `\" + file_name + \"`: Block quote indentation is wrong on lines \" + str(changed_line_numbers) + \\\n                \". The pre-commit script can't fix it automatically in this instance.\")\n            sys.exit(1)\n        else:\n            text = \"\".join(lines)\n            with open(file_name, \"w\") as file:\n                file.write(text)\n            print(\"INFO: Fixed indentation in `\" + file_name + \"`.\")\n            return True\n    else:\n        # This print is useful when debugging this script, but spammy otherwise. Leave it commented.\n        # print(\"INFO: `\" + file_name + \"` is fine.\")\n        return False\n\nclass SelfTest(unittest.TestCase):\n    def test_starts_block_comment(self):\n        assert(not starts_block_comment(\"\"))\n        assert(not starts_block_comment(\"foo\"))\n        assert(not starts_block_comment(\"/* false */\"))\n        assert(not starts_block_comment(\"    /* false */\"))\n        assert(not starts_block_comment(\"    /* false */ asdf\"))\n        assert(not starts_block_comment(\"  asdf  /* false */ asdf\"))\n        assert(not starts_block_comment(\"    /* false */ /* false */\"))\n        assert(not starts_block_comment(\"    /* false /* false */ */\"))\n        assert(not starts_block_comment(\"    /* false /* false /* false */ */ */\"))\n        assert(not starts_block_comment(\"   false */\"))\n        assert(not starts_block_comment(\"/* false //*/\"))\n        assert(not starts_block_comment(\"    /* false /* false /* false */ */ // */\"))\n        assert(not starts_block_comment(\"// /* false\"))\n        assert(starts_block_comment(\"    /* true *\"))\n        assert(starts_block_comment(\"    /* true */ /*\"))\n        assert(starts_block_comment(\"    /* true /* true /* true */ */\"))\n\n    def test_ends_block_comment(self):\n        assert(not ends_block_comment(\"\"))\n        assert(ends_block_comment(\"*/\"))\n        assert(ends_block_comment(\"// */\"))\n        assert(ends_block_comment(\"  */ asdf\"))\n        assert(ends_block_comment(\"  asdf */ asdf\"))\n        assert(not ends_block_comment(\" /* asdf */ asdf\"))\n        assert(not ends_block_comment(\"    /* true */ /*\"))\n        assert(not ends_block_comment(\"    /* true /* true /* true */ */\"))\n\n    def test_starts_or_ends_block_quote(self):\n        assert(not starts_or_ends_block_quote(\"\", False))\n        assert(not starts_or_ends_block_quote('  \"\"\"foo \"bar\" baz\"\"\"', False))\n        assert(not starts_or_ends_block_quote('  \"\"\"foo \"bar\" baz\"\"\" test \"\"\"foo\"\"\"', False))\n        assert(starts_or_ends_block_quote('  \"\"\"foo \"bar\" baz\"\"\" test \"\"\"foo', False))\n        assert(starts_or_ends_block_quote('\"\"\"', False))\n\n        assert(not starts_or_ends_block_quote('// \"\"\"', False))\n        assert(starts_or_ends_block_quote('\"\"\"//\"\"\" \"\"\"', False))\n        assert(not starts_or_ends_block_quote('\"\"\"//\"\"\"', False))\n\n        assert(starts_or_ends_block_quote('// \"\"\"', True))\n        assert(starts_or_ends_block_quote('\"\"\"//\"\"\" \"\"\"', True))\n        assert(starts_or_ends_block_quote('\"\"\"//\"\"\"', True))\n\n    def test_line_indent(self):\n        self.assertEqual(line_indent(\"\"), 0)\n        self.assertEqual(line_indent(\"   \"), 0)\n        self.assertEqual(line_indent(\"   foo\"), 3)\n        self.assertEqual(line_indent(\"   foo bar\"), 3)\n\n    def test_adjust_indent(self):\n        self.assertEqual(adjust_indent(\"\", 3), \"\")\n        self.assertEqual(adjust_indent(\"foo\", 3), \"   foo\")\n        self.assertEqual(adjust_indent(\" foo\", 3), \"   foo\")\n\n    def test_only_changed_indentation(self):\n        assert(only_changed_indentation([\"foo\"], [\"foo\"]))\n        assert(only_changed_indentation([\"foo\"], [\"    foo\"]))\n        assert(not only_changed_indentation([\"foo\"], [\"oo\"]))\n        assert(not only_changed_indentation([\"foo\"], [\"foo\", \"bar\"]))\n        assert(not only_changed_indentation([\"foo\", \"bar\"], [\"foo\"]))\n        assert(not only_changed_indentation([\"  foo\"], [\"  oo\"]))\n\n    def fix_lines_test_case(self, expected, input, lines_changed):\n        actual_lines_changed = fix_lines(input)\n        self.assertEqual(expected, input)\n        self.assertEqual(lines_changed, actual_lines_changed)\n\n    def test_fix_lines(self):\n        self.fix_lines_test_case( \\\n            expected = ['  \"\"\"', '  if something {', '      foo();', '  }', '  \"\"\"'], \\\n            input = ['  \"\"\"', '  if something {', '      foo();', '  }', '\"\"\"'], \\\n            lines_changed = [5] \\\n        )\n        self.fix_lines_test_case( \\\n            expected = ['  foo = \"\"\"', '      asdf', '  \"\"\"'], \\\n            input = ['  foo = \"\"\"', '    asdf', '    \"\"\"'], \\\n            lines_changed = [2, 3] \\\n        )\n        self.fix_lines_test_case( \\\n            expected = ['  foo = \"\"\"', '      // asdf', '  //\"\"\"'], \\\n            input = ['  foo = \"\"\"', '      // asdf', '  //\"\"\"'], \\\n            lines_changed = [] \\\n        )\n        self.fix_lines_test_case( \\\n            expected = ['    \"\"\"', '    asdf {', '        asdf', '    }', '    \"\"\"'], \\\n            input = ['    \"\"\"', '  asdf {', '      asdf', '  }', '\"\"\"'], \\\n            lines_changed = [2, 3, 4, 5] \\\n        )\n        self.fix_lines_test_case( \\\n            expected = ['    \"\"\"', '', '    foo', '    bar', '    \"\"\"'], \\\n            input = ['    \"\"\"', '', '    foo', '    bar', '    \"\"\"'], \\\n            lines_changed = [] \\\n        )\n\ndef main():\n    # Run unit tests if given `--self-test` argument\n    if len(sys.argv) > 1 and sys.argv[1] == \"--self-test\":\n        sys.argv.pop()\n        unittest.main()\n    else:\n        file_names = sys.argv[1:]\n        status = 0\n        for file_name in file_names:\n            if fix_file(file_name):\n                status = 1\n        sys.exit(status)\n\nif __name__ == \"__main__\":\n    main()\n"
  },
  {
    "path": ".pre-commit-hooks/ktlint.sh",
    "content": "#!/bin/bash\n#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\n\nset -e\n\ncd \"$(git rev-parse --show-toplevel)\"\n# `-q`: run gradle in quiet mode\n# `--console plain`: Turn off the fancy terminal printing in gradle\n# `2>/dev/null`: Suppress the build success/failure output at the end since pre-commit will report failures\n./gradlew -q --console plain ktlintPreCommit -DktlintPreCommitArgs=\"$*\" 2>/dev/null\n"
  },
  {
    "path": ".pre-commit-hooks/runtime-versioner.sh",
    "content": "#!/bin/bash\n#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\n\nset -e\ncd \"$(git rev-parse --show-toplevel)/tools/ci-build/runtime-versioner\" && cargo run -- audit\n"
  },
  {
    "path": ".pre-commit-hooks/sdk-lints.sh",
    "content": "#!/bin/bash\n#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\n\nset -e\ncd \"$(git rev-parse --show-toplevel)/tools/ci-build/sdk-lints\" && cargo run -- check --all\n"
  },
  {
    "path": "AGENTS.md",
    "content": "# Smithy-rs AI Agent Guide\n\n## Package Layout\n\n- **`codegen-core/`** - Shared codegen\n- **`codegen-server/`** - Server codegen\n- **`codegen-client/`** - Client codegen\n- **`rust-runtime/`** - Runtime libraries\n- **`codegen-server-test/`** - Server integration tests\n\nProtocol files: `codegen-{core,server}/.../protocols/`\n\n## Protocol Tests\n\nProtocol tests validate that generated code correctly implements Smithy protocols (like restJson1, awsJson1_1, etc.).\n\n### Adding Protocol Tests\n\nProtocol tests are defined in Smithy model files using `@httpRequestTests` and `@httpResponseTests` traits:\n\n```\n@http(uri: \"/my-operation\", method: \"GET\")\n@httpRequestTests([\n    {\n        id: \"MyOperationRequest\",\n        documentation: \"Test description\",\n        protocol: \"aws.protocols#restJson1\",\n        method: \"GET\",\n        uri: \"/my-operation\",\n        queryParams: [\"param1=value1\", \"param2=value2\"],\n        params: {\n            queryMap: {\n                \"param1\": \"value1\",\n                \"param2\": \"value2\"\n            }\n        },\n        appliesTo: \"client\",\n    }\n])\noperation MyOperation {\n   input: MyOperationInput,\n}\n```\n\n### Key Protocol Test Locations\n\n- **`codegen-core/common-test-models/rest-json-extras.smithy`** - restJson1 protocol tests\n- **`codegen-core/common-test-models/constraints.smithy`** - Constraint validation tests with restJson1\n- **`codegen-client-test/model/main.smithy`** - awsJson1_1 protocol tests\n\n### httpQueryParams Bug Investigation\n\nWhen investigating the `@httpQueryParams` bug (where query parameters weren't appearing in requests), the issue was in `RequestBindingGenerator.kt` line 173. The bug occurred when:\n\n1. An operation had ONLY `@httpQueryParams` (no regular `@httpQuery` parameters)\n2. The condition `if (dynamicParams.isEmpty() && literalParams.isEmpty() && mapParams.isEmpty())` would skip generating the `uri_query` function\n\nThe fix was to ensure `mapParams.isEmpty()` was included in the condition check. The current implementation correctly generates query parameters for `@httpQueryParams` even when no other query parameters exist.\n\n**Testing httpQueryParams**: Create operations with only `@httpQueryParams` to ensure they generate proper query strings in requests.\n\n## rustTemplate Formatting\n\n**CRITICAL**: Because `#` is the formatting character in `rustTemplate`, Rust attributes must be escaped:\n\n❌ Wrong: `#[derive(Debug)]`\n✅ Correct: `##[derive(Debug)]`\n\nThis applies to ALL Rust attributes: `##[non_exhaustive]`, `##[derive(...)]`, `##[cfg(...)]`, etc.\n\n## preludeScope: Rust Prelude Types\n\n**Always use `preludeScope` for Rust prelude types:**\n\n```kotlin\nrustTemplate(\n    \"let result: #{Result}<#{String}, #{Error}> = #{Ok}(value);\",\n    *preludeScope,  // Provides Result, String, Ok\n    \"Error\" to myErrorType\n)\n```\n\n❌ Wrong: `\"let result: Result<String, Error> = Ok(value);\"`\n✅ Correct: Use `*preludeScope` in templates\n\n## RuntimeType and Dependencies\n\n`RuntimeType` objects contain:\n\n- **`path`**: Rust path (e.g., `\"::mime::Mime\"`)\n- **`dependency`**: `CargoDependency` or `InlineDependency`\n\nUsing a `RuntimeType` automatically adds its dependency to `Cargo.toml`.\n\n### Creating RuntimeTypes\n\n```kotlin\n// Pre-defined dependencies\nval Mime = CargoDependency.Mime.toType()\nval Bytes = CargoDependency.Bytes.toType().resolve(\"Bytes\")\n\n// Runtime crates\nval smithyTypes = RuntimeType.smithyTypes(runtimeConfig)\n```\n\n### Always Use Symbols\n\n❌ Wrong: `rust(\"const MIME: ::mime::Mime = ::mime::APPLICATION_JSON;\")`\n✅ Correct: `rustTemplate(\"const MIME: #{Mime}::Mime = #{Mime}::APPLICATION_JSON;\", \"Mime\" to RuntimeType.Mime)`\n\n### String Interpolation in Templates\n\n**For RuntimeTypes and complex objects**: Use `#{name}` syntax. NOTE: you do not need to use `#{name:W}`. This is now\nthe default. You may see old code with this pattern.\n**For simple strings**: Use `$` with `.dq()` for double-quoted strings\n\n```kotlin\n// ❌ Wrong - causes \"Invalid type provided to RustSymbolFormatter\"\nrustTemplate(\"let content_type = \\\"#{content_type}\\\";\", \"content_type\" to \"application/json\")\n\n// ✅ Correct - use $ interpolation for strings\nrustTemplate(\"let content_type = ${contentType.dq()};\")\n```\n\n## RuntimeType.forInlineFun: Lazy Generation\n\nCode is only generated if used. `forInlineFun` enables lazy generation:\n\n```kotlin\nval mimeType = RuntimeType.forInlineFun(\"APPLICATION_JSON\", module) {\n    rustTemplate(\n        \"pub const APPLICATION_JSON: #{Mime}::Mime = #{Mime}::APPLICATION_JSON;\",\n        \"Mime\" to RuntimeType.Mime\n    )\n}\n```\n\n⚠️ **Footgun**: Name collisions mean only one implementation gets generated.\n\n## GitHub CLI Integration\n\n**View issues and PRs:**\n\n```bash\ngh issue view <number> --repo smithy-lang/smithy-rs\ngh pr view <number> --repo smithy-lang/smithy-rs\ngh pr diff <number> --repo smithy-lang/smithy-rs\n```\n\n**Debug CI failures:**\n\n```bash\n# Get PR status and identify failed checks\ngh pr view <PR_NUMBER> --repo smithy-lang/smithy-rs --json statusCheckRollup | \\\n  jq '.statusCheckRollup[] | select(.conclusion == \"FAILURE\") | {name: .name, url: .detailsUrl}'\n\n# Get run ID from PR\ngh pr view <PR_NUMBER> --repo smithy-lang/smithy-rs --json statusCheckRollup | \\\n  jq -r '.statusCheckRollup[0].detailsUrl' | grep -oP 'runs/\\K[0-9]+'\n\n# List failed jobs in a run\ngh api repos/smithy-lang/smithy-rs/actions/runs/<RUN_ID>/jobs | \\\n  jq '.jobs[] | select(.conclusion == \"failure\") | {name: .name, id: .id}'\n\n# Get logs for a specific failed job\ngh api repos/smithy-lang/smithy-rs/actions/jobs/<JOB_ID>/logs | grep -B 5 -A 10 \"error:\"\n\n# Search logs for specific patterns\ngh api repos/smithy-lang/smithy-rs/actions/jobs/<JOB_ID>/logs | grep -i \"lint\\|doctest\\|aborting\"\n```\n\n**Add comments (use single quotes for complex markdown):**\n\n```bash\ngh issue comment <number> --repo smithy-lang/smithy-rs --body 'markdown content with `backticks` and special chars'\n```\n\n**Comment Guidelines:**\n- Always ask for confirmation before posting comments\n- Always start comments with `*Comment from Claude*` in italics\n\n**Run PR Bot and Canary workflows:**\n\n```bash\n# Get PR info first\ngh pr view <PR_NUMBER> --repo smithy-lang/smithy-rs --json headRefOid,number\n\n# Run PR Bot (generates codegen diff and doc preview)\ngh workflow run \"Invoke PR Bot as Maintainer\" --repo smithy-lang/smithy-rs \\\n  -f pull_number=<PR_NUMBER> -f commit_sha=<HEAD_SHA>\n\n# Run Canary (tests SDK generation and integration)\ngh workflow run \"Invoke Canary as Maintainer\" --repo smithy-lang/smithy-rs \\\n  -f pull_request_number=<PR_NUMBER> -f commit_sha=<HEAD_SHA>\n```\n\n## Investigation Patterns\n\n**Before implementing changes:**\n\n1. **Research existing work** - Check related PRs/issues first\n2. **Build and examine generated code** - `./gradlew codegen-server-test:assemble --quiet`\n3. **Generated code location** - `codegen-server-test/build/smithyprojections/codegen-server-test/`\n4. **Key generated files** - `src/protocol_serde/shape_*.rs`, `src/event_stream_serde.rs`\n5. **Look for patterns** - Client vs server codegen often mirrors each other\n6. **Identify minimal change** - Understand current behavior before modifying codegen\n\n**Single Protocol Development:**\n\n- When working on a single protocol, uncomment the filter line in `codegen-server-test/build.gradle.kts:111`\n- This speeds up builds by only generating code for the protocol you're working on\n\n**Client/Server Symmetry:**\n\nClient changes often show the pattern for server-side implementation\n\n**Configuration Debugging:**\n- `codegen` settings are defined in `CoreCodegenConfig`, `ServerCodegenConfig`, or `ClientCodegenConfig` (in respective `*RustSettings.kt` files)\n- `customizationConfig` settings: search for `settings.customizationConfig` usages - classify as client/server based on whether a `ClientCodegenDecorator` or `ServerCodegenDecorator` uses it\n- In smithy-build[-template].json, use `\"codegen\"` not `\"codegenConfig\"` (the latter is only a Kotlin property name)\n- When settings aren't working, check the generated smithy-build.json structure first\n- Settings placement matters - wrong nesting means settings are ignored silently\n- Always verify actual generated configuration matches expectations\n\n**Testing Configuration Settings:**\n- Create separate services with different settings to test configuration behavior\n- Use integration tests that verify actual generated code behavior, not just compilation\n- Test both enabled and disabled states to ensure the setting actually controls behavior\n\n## Testing\n\n### Integration Tests\n\nTest actual generated code, not just codegen logic:\n\n```kotlin\nserverIntegrationTest(model) { codegenContext, rustCrate ->\n    rustCrate.testModule {\n        tokioTest(\"test_accept_header\") {\n            rustTemplate(\n                \"\"\"\n                let request = ::http::Request::builder()\n                    .header(\"Accept\", \"application/cbor\")\n                    .body(Body::empty()).unwrap();\n                let result = MyInput::from_request(request).await;\n                result.expect(\"should accept valid header\");\n            \"\"\"\n            )\n        }\n    }\n}\n```\n\n### Running Tests\n\n**Codegen tests:**\n\n```bash\n./gradlew test --tests \"*MyTest*\"\n./gradlew codegen-server-test:assemble --quiet\n```\n\n**Debug failing tests:**\n\n```bash\n# Remove --quiet to see failure details\n./gradlew :codegen-core:test --tests \"*InlineDependencyTest*\"\n# Extract just the error from HTML report (avoid HTML markup pollution)\ngrep -A 5 \"AssertionError\\|Exception\" codegen-core/build/reports/tests/test/classes/software.amazon.smithy.rust.codegen.core.rustlang.InlineDependencyTest.html\n```\n\n**Runtime tests:**\n\n```bash\ncd rust-runtime && cargo test --quiet -p aws-smithy-types\n```\n\n**Protocol tests:**\n\n```bash\n./gradlew codegen-client-test:assemble --quiet\ncd codegen-client-test/build/smithyprojections/codegen-client-test/rest_xml_extras/rust-client-codegen\ncargo test --quiet\n```\n\n**Note: Always use `--quiet` with cargo commands to reduce noise and focus on actual errors.**\n\n## Viewing Generated Code\n\nGenerated code appears in:\n\n```\ncodegen-server-test/build/smithyprojections/codegen-server-test/SERVICE_NAME/rust-server-codegen/\n```\n\nEnable debug comments:\n\n```kotlin\nserverIntegrationTest(\n    model, IntegrationTestParams(\n        additionalSettings = ServerAdditionalSettings.builder()\n            .generateCodegenComments()  // Adds Kotlin source line comments\n            .toObjectNode()\n    )\n) { /* test code */ }\n```\n"
  },
  {
    "path": "CHANGELOG.md",
    "content": "<!-- Do not manually edit this file. Use the `changelogger` tool. -->\nApril 16th, 2026\n================\n**Breaking Changes:**\n- :bug::warning: (client) Now files written by the SDK (like credential caches) are created with file\n    permissions `0o600` on unix systems. This could break customers who were relying\n    on the visibility of those files to other users on the system.\n\n**New this release:**\n- :tada: (client, [smithy-rs#4521](https://github.com/smithy-lang/smithy-rs/issues/4521)) Add `sigv4a_signing_region_set` client configuration. Supports programmatic, environment variable (`AWS_SIGV4A_SIGNING_REGION_SET`), and shared config file (`sigv4a_signing_region_set`) configuration. User-provided values now take priority over endpoint-resolved values.\n- :bug: (client, [smithy-rs#4340](https://github.com/smithy-lang/smithy-rs/issues/4340), @ysaito) Prevent memory leak in identity cache when overriding credentials via `config_override`. Each `config_override` that sets a credentials provider now uses an operation-scoped identity cache instead of the shared client-level cache, preventing unbounded partition growth. Additionally, the client-level identity cache now enforces a configurable `max_partitions` cap (default: 64) as a safety net.\n- :bug: (client, [smithy-rs#4596](https://github.com/smithy-lang/smithy-rs/issues/4596), [aws-sdk-rust#1423](https://github.com/awslabs/aws-sdk-rust/issues/1423), @annahay4) Fix `TokenBucket::is_full()` and `TokenBucket::is_empty()` to convert fractional tokens into whole permits before checking availability. Previously, accumulated fractional tokens from success rewards were not accounted for, causing these methods to return incorrect results.\n- :bug: (client, [smithy-rs#4587](https://github.com/smithy-lang/smithy-rs/issues/4587)) Upgrade `sha2` from 0.10.x to 0.11.x. The previous version defaulted to software-based compression instead of hardware-accelerated compression, resulting in lower throughput. The new version automatically detects and uses hardware-accelerated instructions when available.\n- (client, [smithy-rs#4591](https://github.com/smithy-lang/smithy-rs/issues/4591)) Optimize `Encoder::str()` and `Encoder::blob()` by collapsing multiple `write_all` calls into a single buffer operation. This bypasses minicbor's generic writer to write the CBOR type+length header and payload directly into the underlying `Vec<u8>`, improving performance on serialization-heavy hot paths.\n- :bug: (all, [smithy-rs#4572](https://github.com/smithy-lang/smithy-rs/issues/4572), @jlizen) Re-export `EventStreamSender` from generated SDK crates when the service uses event streams, so users do not need a direct dependency on `aws-smithy-http` to construct event stream responses.\n- :bug: (client, [smithy-rs#4599](https://github.com/smithy-lang/smithy-rs/issues/4599)) Fix waiter codegen failure when JMESPath `&&` or `||` expressions have non-boolean operands (e.g., a list field used as a truthiness check). Non-boolean types are now coerced to booleans using JMESPath truthiness rules: arrays and strings check `!is_empty()`, all other non-null types are truthy.\n- :bug: (client, [smithy-rs#4431](https://github.com/smithy-lang/smithy-rs/issues/4431), @jlizen) Add missing `EventOrInitial`, `EventOrInitialMarshaller`, and `EventStreamSender::into_inner` to `aws-smithy-legacy-http` event_stream module, fixing compilation failures in generated SDKs that reference these types.\n\n**Contributors**\nThank you for your contributions! ❤\n- @annahay4 ([aws-sdk-rust#1423](https://github.com/awslabs/aws-sdk-rust/issues/1423), [smithy-rs#4596](https://github.com/smithy-lang/smithy-rs/issues/4596))\n- @jlizen ([smithy-rs#4431](https://github.com/smithy-lang/smithy-rs/issues/4431), [smithy-rs#4572](https://github.com/smithy-lang/smithy-rs/issues/4572))\n- @ysaito ([smithy-rs#4340](https://github.com/smithy-lang/smithy-rs/issues/4340))\n\n\nMarch 16th, 2026\n================\n**New this release:**\n- :bug: (client) Fix null value handling in dense collections: SDK now correctly rejects null values in non-sparse collections instead of silently dropping them.\n\n\nMarch 2nd, 2026\n===============\n**New this release:**\n- :bug: (client, [smithy-rs#4429](https://github.com/smithy-lang/smithy-rs/issues/4429)) Fix bug where initial-request messages in event stream operations are not signed.\n\n\nFebruary 16th, 2026\n===================\n**New this release:**\n- :tada: (server, [smithy-rs#4494](https://github.com/smithy-lang/smithy-rs/issues/4494)) Automatically add `smithy.framework#ValidationException` to operations with constrained inputs. Previously, users had to either set `addValidationExceptionToConstrainedOperations: true` in codegen settings or manually add `ValidationException` to each operation. Now this happens automatically unless a custom validation exception (a structure with the `@validationException` trait) is defined in the model. When using a custom validation exception, users must explicitly add it to each applicable operation. The `addValidationExceptionToConstrainedOperations` flag is deprecated.\n\n\nFebruary 10th, 2026\n===================\n**Breaking Changes:**\n- :warning: (all) Upgrade MSRV to Rust 1.91.0.\n\n\nFebruary 1st, 2026\n==================\n**Breaking Changes:**\n- :warning::tada: (client, [smithy-rs#4454](https://github.com/smithy-lang/smithy-rs/issues/4454), [smithy-rs#4467](https://github.com/smithy-lang/smithy-rs/issues/4467), [aws-sdk-rust#1389](https://github.com/awslabs/aws-sdk-rust/issues/1389)) Enable retries by default for AWS SDK clients using `BehaviorVersion::v2026_01_12()` or later.\n\n    Previously, retries were only enabled when constructing clients via `aws_config::load_from_env()`. Clients constructed directly using `Client::from_conf()` did not have retries enabled, which was inconsistent with AWS SDK behavior in other languages.\n\n    This change affects AWS SDK clients constructed with `Client::from_conf()` when using `BehaviorVersion::v2026_01_12()` or `BehaviorVersion::latest()`. Generic Smithy clients (non-AWS) are not affected.\n\n    To disable retries:\n    ```rust\n    let config = aws_sdk_s3::Config::builder()\n        .retry_config(RetryConfig::disabled())\n        // ...\n        .build();\n    ```\n\n    For more context, see the [discussion on retry behavior](https://github.com/smithy-lang/smithy-rs/discussions/4466).\n\n**New this release:**\n- :tada: (client, [smithy-rs#312](https://github.com/smithy-lang/smithy-rs/issues/312), @AmitKulkarni23) Add support for Smithy bigInteger and bigDecimal types as string wrappers in aws-smithy-types, allowing users to parse with their preferred big number library.\n- :tada: (all, [smithy-rs#4484](https://github.com/smithy-lang/smithy-rs/issues/4484)) All Smithy-rs crates, for both servers and clients, now use the 1.x version of\n    the `http` crate for all internal processing. Utility methods are still provided\n    for users to convert between SDK types and both of the `http` 0.x and 1.x types.\n- :bug: (client, [smithy-rs#4500](https://github.com/smithy-lang/smithy-rs/issues/4500)) Fix JMESPath integer literal handling in waiters to support Smithy 1.66.0, which parses integer literals as `Long` instead of `Double`.\n\n**Contributors**\nThank you for your contributions! ❤\n- @AmitKulkarni23 ([smithy-rs#312](https://github.com/smithy-lang/smithy-rs/issues/312))\n\n\nJanuary 14th, 2026\n==================\n**New this release:**\n- (client) Add support for tracking observability business metrics (OBSERVABILITY_TRACING, OBSERVABILITY_OTEL_TRACING, OBSERVABILITY_OTEL_METRICS) in User-Agent headers when telemetry providers are configured.\n- :bug: (client, [smithy-rs#4459](https://github.com/smithy-lang/smithy-rs/issues/4459), @lnj) Updated the `TokenBucket` creation to initialize the bucket with the user-provided `TimeSource` from the `Config`.\n    This fixes the bug in [issue 4459](https://github.com/smithy-lang/smithy-rs/issues/4459) that caused failures\n    in WASM since the TokenBucket was being created with a default `SystemTime` based `TimeSource`\n- :bug: (client, @svix-jbrown) Update the `lru` dependency for `aws-sdk-s3` and `rust-runtime`\n- (client, [smithy-rs#4469](https://github.com/smithy-lang/smithy-rs/issues/4469), @greenwoodcm) Add support for `aws-smithy-mocks` interceptor to handle concurrent requests.\n- :bug: (client, [smithy-rs#4413](https://github.com/smithy-lang/smithy-rs/issues/4413)) Deprecate [NoAuthRuntimePlugin](https://docs.rs/aws-smithy-runtime/1.9.4/aws_smithy_runtime/client/auth/no_auth/struct.NoAuthRuntimePlugin.html), which does not properly configure the auth scheme option resolver for noAuth, and introduce `NoAuthRuntimePluginV2` that does.\n- (client) Update crc-fast to 1.9\n\n**Contributors**\nThank you for your contributions! ❤\n- @greenwoodcm ([smithy-rs#4469](https://github.com/smithy-lang/smithy-rs/issues/4469))\n- @lnj ([smithy-rs#4459](https://github.com/smithy-lang/smithy-rs/issues/4459))\n- @svix-jbrown\n\n\nDecember 16th, 2025\n===================\n**New this release:**\n- :tada: (all, [smithy-rs#4418](https://github.com/smithy-lang/smithy-rs/issues/4418), @AmitKulkarni23) Add `expect_number_as_string_or_null` function to `aws-smithy-json` that extracts JSON numbers as strings without converting to u64/i64/f64. This preserves arbitrary precision for BigInteger and BigDecimal support, preventing precision loss for numbers larger than standard numeric types can represent.\n- :tada: (client, @annahay) Add token bucket success rewards, time based refill, fractional tokens\n\n**Contributors**\nThank you for your contributions! ❤\n- @AmitKulkarni23 ([smithy-rs#4418](https://github.com/smithy-lang/smithy-rs/issues/4418))\n- @annahay\n\n\nDecember 8th, 2025\n==================\n**Breaking Changes:**\n- :bug::warning: (server, [smithy-rs#4400](https://github.com/smithy-lang/smithy-rs/issues/4400), [smithy-rs#4397](https://github.com/smithy-lang/smithy-rs/issues/4397)) Fix issue where SigV4 envelopes for EventStreams did not support the initial message. This is _technically_ a breaking change but should not break consumers in practice since the\n    resulting type has the same methods.\n\n**New this release:**\n- :tada: (client, @annahay) Added methods in token bucket to indicate if bucket is full or empty\n- :bug: (client, [smithy-rs#4427](https://github.com/smithy-lang/smithy-rs/issues/4427)) Fix Content-Type and Accept headers for event streams in RPC v2 CBOR to set `application/vnd.amazon.eventstream`\n- :bug: (client, [aws-sdk-rust#1390](https://github.com/awslabs/aws-sdk-rust/issues/1390), @arielb1) In `legacy-rustls-ring`, polyfill `with_native_roots` to use `rustls_native_certs 0.8` to avoid\n    RUSTSEC-2025-0134.\n- :bug: (all, @arielby) Publish an MSRV for all packages\n\n\n**Contributors**\nThank you for your contributions! ❤\n- @annahay\n- @arielb1 ([aws-sdk-rust#1390](https://github.com/awslabs/aws-sdk-rust/issues/1390))\n- @arielby\n\n\nNovember 20th, 2025\n===================\n**New this release:**\n- (client, [smithy-rs#4388](https://github.com/smithy-lang/smithy-rs/issues/4388), @greenwoodcm) Add `then_compute_response` to Smithy mock\n\n**Contributors**\nThank you for your contributions! ❤\n- @greenwoodcm ([smithy-rs#4388](https://github.com/smithy-lang/smithy-rs/issues/4388))\n\n\nNovember 6th, 2025\n==================\n**New this release:**\n- (client) Bump crc-fast version to 1.6.0\n- (client) Validate `Region` is a valid host label when constructing endpoints.\n\n\nOctober 30th, 2025\n==================\n**Breaking Changes:**\n- :warning::tada: (server, [smithy-rs#4356](https://github.com/smithy-lang/smithy-rs/issues/4356)) Parse EventStream signed-frames for servers marked with `@sigv4`.\n\n    This is a breaking change, because events from SigV4 services are wrapped in a SignedEvent frame.\n- :warning: (all, [smithy-rs#4367](https://github.com/smithy-lang/smithy-rs/issues/4367)) Upgrade MSRV to Rust 1.88.0.\n\n**New this release:**\n- :bug::tada: (server, [smithy-rs#4352](https://github.com/smithy-lang/smithy-rs/issues/4352), [smithy-rs#4345](https://github.com/smithy-lang/smithy-rs/issues/4345)) Update smithy-rs servers to support sending `initial-response` events over event streams.\n\n    Prior to this change, event streams that had initial responses were unsupported. This change also adds a new codegen setting, `alwaysSendEventStreamInitialResponse`.\n\n    When this setting is set to `true`, the generated server will unconditionally send `initial-response` objects, even when empty. This is required for compatibility with smithy-java as well as a few other clients.\n\n    This setting defaults to false currently because smithy-rs based clients do not currently support this behavior.\n\n    ```json\n    \"codegen\": {\n      \"alwaysSendEventStreamInitialResponse\": true // default false\n    }\n    ```\n- :tada: (all, @arielby) Include the protocol name in `package.metadata.smithy.protocol` in `Cargo.toml`\n    to allow easily figuring out which protocol was used to generate a crate.\n- :bug::tada: (client, [smithy-rs#4349](https://github.com/smithy-lang/smithy-rs/issues/4349), @arielby) Make Hyper idle pool timeout configurable, and fix the bug where pool timeouts\n    would not work if the client was built directly.\n- :tada: (server, [smithy-rs#4317](https://github.com/smithy-lang/smithy-rs/issues/4317), @jasgin) Adds validators and codegen support for the custom traits custom traits `@validationException`, `@validationMessage`,\n    `@validationFieldList`, `@validationFieldName`, and `@validationFieldMessage` for defining a custom validation exception\n    to use instead of `smithy.framework#ValidationException`.\n- :bug: (client, [smithy-rs#4346](https://github.com/smithy-lang/smithy-rs/issues/4346)) Fix bug where httpQueryParams were silently dropped when no other query parameters were modeled.\n- :bug: (server, [smithy-rs#4344](https://github.com/smithy-lang/smithy-rs/issues/4344), [smithy-rs#4325](https://github.com/smithy-lang/smithy-rs/issues/4325)) Fix bug where servers did not attempt to parse an `initial-request`. `initial-requests` may be sent by clients both when they would contain valid data\n    and when they are empty.\n- :bug: (client, [smithy-rs#4352](https://github.com/smithy-lang/smithy-rs/issues/4352), [smithy-rs#4353](https://github.com/smithy-lang/smithy-rs/issues/4353)) Update clients to allow `initial-response` events to be accepted on event streams, even when know modeled initial response exists.\n\n    This is required for spec compliance, backwards compatibility, and compatibility with non-smithy-rs based servers that\n    MAY unconditionally send `initial-response` messages.\n- :bug: (client, [smithy-rs#4265](https://github.com/smithy-lang/smithy-rs/issues/4265), [smithy-rs#4189](https://github.com/smithy-lang/smithy-rs/issues/4189)) Adds new `with_test_defaults_v2()` for all clients supporting region configuration which applies `us-east-1` as default region if not set by user. This allows `aws-smithy-mocks` to work for non AWS SDK generated clients. Also clarify `test-util` feature requirement when using `aws-smithy-mocks`.\n\n**Contributors**\nThank you for your contributions! ❤\n- @arielby ([smithy-rs#4349](https://github.com/smithy-lang/smithy-rs/issues/4349))\n- @jasgin ([smithy-rs#4317](https://github.com/smithy-lang/smithy-rs/issues/4317))\n\n\nOctober 6th, 2025\n=================\n**New this release:**\n- :tada: (server, [smithy-rs#4321](https://github.com/smithy-lang/smithy-rs/issues/4321), @jasgin) Adds the custom traits `@validationException`, `@validationMessage`, `@validationFieldList`, `@validationFieldName`, and `@validationFieldMessage`\n    for defining custom validation exceptions.\n\n**Contributors**\nThank you for your contributions! ❤\n- @jasgin ([smithy-rs#4321](https://github.com/smithy-lang/smithy-rs/issues/4321))\n\n\nOctober 2nd, 2025\n=================\n**New this release:**\n- :bug: (server) Fix bug where servers rejected `application/vnd.amazon.evenstream` ACCEPT header for RPCv2Cbor\n\n    This change allows this header while also allowing `application/cbor` for backwards compatibility.\n\n\nOctober 1st, 2025\n=================\n**New this release:**\n- :tada: (client, [smithy-rs#4299](https://github.com/smithy-lang/smithy-rs/issues/4299), @greenwoodcm) Added a new `then_compute_output` to `aws-smithy-mocks` rule builder that allows using the input type when computing a mocked response, e.g. \n    ```rs\n    // Return a computed output based on the input\n    let compute_rule = mock!(Client::get_object)\n        .then_compute_output(|req| {\n            let key = req.key().unwrap_or(\"unknown\");\n            GetObjectOutput::builder()\n                .body(ByteStream::from_static(format!(\"content for {}\", key).as_bytes()))\n                .build()\n        });\n    ```\n- :bug: (client, [smithy-rs#4226](https://github.com/smithy-lang/smithy-rs/issues/4226), @haydenbaker) Fixed problematic assertion on HttpApiKeyAuthTrait `scheme`, which was causing client-codegen to fail when the correct settings for api-key based auth were set.\n\n**Contributors**\nThank you for your contributions! ❤\n- @greenwoodcm ([smithy-rs#4299](https://github.com/smithy-lang/smithy-rs/issues/4299))\n- @haydenbaker ([smithy-rs#4226](https://github.com/smithy-lang/smithy-rs/issues/4226))\n\n\nSeptember 10th, 2025\n====================\n**New this release:**\n- :bug: (client, [smithy-rs#4274](https://github.com/smithy-lang/smithy-rs/issues/4274)) The `HickoryDnsResolver` and `TokioDnsResolver` were not `Clone` making it impossible to use them in the http_client builder's `build_with_resolver` method.\n\n\nAugust 28th, 2025\n=================\n**New this release:**\n- :tada: (client, [smithy-rs#4274](https://github.com/smithy-lang/smithy-rs/issues/4274)) Add a new crate, `aws-smithy-dns` that contains a `HickoryDnsResolver`. This wraps a `hickory_resolver::Resolver` and provides some minimal configuration options (timeouts, retries, etc.) Instructions for overriding the DNS resolver on your HTTP client can be found in our documentation at https://docs.aws.amazon.com/sdk-for-rust/latest/dg/http.html#overrideDns\n- :bug: (client, [smithy-rs#4282](https://github.com/smithy-lang/smithy-rs/issues/4282)) Set the `pool_timer` for the default Hyper client. This is required to allow the `pool_idle_timeout` to work. Now idle connections will be released by the pool after 90 seconds.\n- (client, [smithy-rs#4263](https://github.com/smithy-lang/smithy-rs/issues/4263)) Make [`TokenBucket`](https://docs.rs/aws-smithy-runtime/latest/aws_smithy_runtime/client/retries/struct.TokenBucket.html) and [`ClientRateLimiter`](https://docs.rs/aws-smithy-runtime/latest/aws_smithy_runtime/client/retries/struct.ClientRateLimiter.html) configurable through [`RetryPartition`](https://docs.rs/aws-smithy-runtime/latest/aws_smithy_runtime/client/retries/struct.RetryPartition.html).\n\n\nAugust 18th, 2025\n=================\n**New this release:**\n- :tada: (client, [aws-sdk-rust#169](https://github.com/awslabs/aws-sdk-rust/issues/169)) Add support for proxy environment variables (`HTTP_PROXY, `HTTPS_PROXY`, `ALL_PROXY`, `NO_PROXY`). Service clients will now automatically respect these proxy environment variables on the latest `BehaviorVersion`. Older behavior versions do not automatically detect these environment variables and will require manually building a `aws_smithy_http_client::Connector` with a proxy config explicitly set to use this feature.\n- :tada: (client, @WillChilds-Klein) Enable rustls post-quantum by default.\n- (client) fix `aws-smithy-eventstream` feature `derive-arbitrary` on `arbitrary` >= 1.4.2\n\n**Contributors**\nThank you for your contributions! ❤\n- @WillChilds-Klein\n\n\nAugust 13th, 2025\n=================\n**New this release:**\n- :bug: (client) pin crc-fast to <1.4 to workaround SIGILL\n\n\nAugust 11th, 2025\n=================\n**New this release:**\n- :tada: (client, [smithy-rs#4208](https://github.com/smithy-lang/smithy-rs/issues/4208)) Add the ability to insert `hints.mostly-unused = true` in Cargo.toml. Enable this hint for the below crates:\n    - aws-sdk-cloudformation\n    - aws-sdk-dynamodb\n    - aws-sdk-ec2\n    - aws-sdk-s3\n    - aws-sdk-sns\n    - aws-sdk-sqs\n    - aws-sdk-ssm\n    - aws-sdk-sts\n\n    See more information about this hint at https://blog.rust-lang.org/inside-rust/2025/07/15/call-for-testing-hint-mostly-unused/\n- :tada: (client, [smithy-rs#4208](https://github.com/smithy-lang/smithy-rs/issues/4208), @joshtriplett) Enable `hints.mostly-unused = true` for `aws-sdk-lambda` (taking a release\n    build from 57s to 40s) and `aws-sdk-rds` (taking a release build from 1m34s to\n    49s).\n\n**Contributors**\nThank you for your contributions! ❤\n- @joshtriplett ([smithy-rs#4208](https://github.com/smithy-lang/smithy-rs/issues/4208))\n\n\nAugust 4th, 2025\n================\n**New this release:**\n- :tada: (all, @Dorenavant) Add EnumSection to allow decorators to modify enum member attributes\n- :bug: (client, [smithy-rs#4227](https://github.com/smithy-lang/smithy-rs/issues/4227)) Fix canonical request sort order\n\n**Contributors**\nThank you for your contributions! ❤\n- @Dorenavant\n\n\nJuly 25th, 2025\n===============\n**New this release:**\n- :bug: (client, [smithy-rs#4232](https://github.com/smithy-lang/smithy-rs/issues/4232)) Add fallback equality on no auth `AuthSchemeId` for backward compatibility, treating `AuthSchemeId::from(\"no_auth\")` (legacy) and `AuthSchemeId::from(\"noAuth\")` (updated) as equivalent.\n\n\nJuly 23rd, 2025\n===============\n\nJuly 21st, 2025\n===============\n**New this release:**\n- :tada: (client, [smithy-rs#4203](https://github.com/smithy-lang/smithy-rs/issues/4203)) Add support for configuring auth schemes manually using an auth scheme preference list.\n    The preference list allows customers to reprioritize the order of auth schemes originally\n    determined by the auth scheme resolver.\n    Customers can configure the auth scheme preference at the following locations, listed in order of precedence:\n    1. Service Client Configuration\n    ```rust\n    use aws_runtime::auth::sigv4;\n    use aws_smithy_runtime_api::client::auth::AuthSchemeId;\n    use aws_smithy_runtime_api::client::auth::http::HTTP_BEARER_AUTH_SCHEME_ID;\n\n    let config = aws_sdk_s3::Config::builder()\n        .auth_scheme_preference([AuthSchemeId::from(\"scheme1\"), sigv4::SCHEME_ID, HTTP_BEARER_AUTH_SCHEME_ID])\n        // ...\n        .build();\n    ```\n    2. Environment Variable\n    ```\n    AWS_AUTH_SCHEME_PREFERENCE=scheme1, sigv4, httpBearerAuth\n    ```\n    3. Configuration File\n    ```\n    auth_scheme_preference=scheme1, sigv4, httpBearerAuth\n    ```\n    With this configuration, the auth scheme resolver will prefer to select them in the specified order,\n    if they are supported.\n\n\nJuly 17th, 2025\n===============\n**New this release:**\n- (all, [smithy-rs#4212](https://github.com/smithy-lang/smithy-rs/issues/4212)) Event streams now allocate a right-sized buffer avoiding repeated reallocations during serialization\n\n\nJuly 16th, 2025\n===============\n**New this release:**\n- (client) re-use checksums on retry attempts for enhanced durability\n\n\nJuly 8th, 2025\n==============\n**New this release:**\n- (client, [smithy-rs#4076](https://github.com/smithy-lang/smithy-rs/issues/4076), [smithy-rs#4198](https://github.com/smithy-lang/smithy-rs/issues/4198)) Allows customers to configure the auth schemes and auth scheme resolver. For more information see the GitHub [discussion](https://github.com/smithy-lang/smithy-rs/discussions/4197).\n\n\nJune 30th, 2025\n===============\n\nJune 27th, 2025\n===============\n**New this release:**\n- :bug: (client) Fix hyper 1.x connection refused errors not marked as retryable\n- (client, [smithy-rs#4186](https://github.com/smithy-lang/smithy-rs/issues/4186)) Make Rpc V2 CBOR a compatible protocol for `awsQuery` using `awsQueryCompatible` trait\n\n\nJune 11th, 2025\n===============\n**Breaking Changes:**\n- :bug::warning: (server) Fixed SmithyRpcV2CBOR Router to properly respect case in service names, preventing routing failures for services with mixed-case service shape ID.\n\n**New this release:**\n- :bug: (client, [smithy-rs#4165](https://github.com/smithy-lang/smithy-rs/issues/4165)) Fix default supported protocols incorrectly ordered in `ClientProtocolLoader`.\n\n\nJune 3rd, 2025\n==============\n**New this release:**\n- :bug: (client, [aws-sdk-rust#1272](https://github.com/awslabs/aws-sdk-rust/issues/1272)) Fix h2 GoAway errors not being retried by hyper legacy client\n\n\nMay 19th, 2025\n==============\n**New this release:**\n- :tada: (client, [smithy-rs#4135](https://github.com/smithy-lang/smithy-rs/issues/4135)) Introduce a new `repeatedly()` function to `aws-smithy-mocks` sequence builder to build mock rules that behave as an\n    infinite sequence.\n\n    ```rust\n    let rule = mock!(aws_sdk_s3::Client::get_object)\n        .sequence()\n        .http_status(503, None)\n        .times(2)        // repeat the last output twice before moving onto the next response in the sequence\n        .output(|| GetObjectOutput::builder()\n            .body(ByteStream::from_static(b\"success\"))\n            .build()\n        )\n        .repeatedly()    // repeat the last output forever\n        .build();\n    ```\n- :bug: (client, [aws-sdk-rust#1291](https://github.com/awslabs/aws-sdk-rust/issues/1291)) Removing the `optimize_crc32_auto` feature flag from the `crc-fast` dependency of the `aws-smithy-checksums` crate since it was causing build issues for some customers.\n- :bug: (client, [smithy-rs#4137](https://github.com/smithy-lang/smithy-rs/issues/4137)) Fix bug with enum codegen\n\n    When the first enum generated has the `@sensitive` trait the opaque type\n    underlying the `UnknownVariant` inherits that sensitivity. This means that\n    it does not derive `Debug`. Since the module is only generated once this\n    causes a problem for non-sensitive enums that rely on the type deriving\n    `Debug` so that they can also derive `Debug`. We manually add `Debug` to\n    the module so it will always be there since the `UnknownVariant` is not\n    modeled and cannot be `@sensitive`.\n- :bug: (client, [smithy-rs#4135](https://github.com/smithy-lang/smithy-rs/issues/4135)) fix simple rules behavior with `RuleMode::MatchAny`\n\n\nMay 15th, 2025\n==============\n**New this release:**\n- :bug: (all, [smithy-rs#4132](https://github.com/smithy-lang/smithy-rs/issues/4132)) Smithy unions that contain members named \"unknown\" will now codegen correctly\n- (all, [smithy-rs#4105](https://github.com/smithy-lang/smithy-rs/issues/4105), @FalkWoldmann) Replace once_cell with std equivalents\n\n**Contributors**\nThank you for your contributions! ❤\n- @FalkWoldmann ([smithy-rs#4105](https://github.com/smithy-lang/smithy-rs/issues/4105))\n\n\nMay 9th, 2025\n=============\n**Breaking Changes:**\n- :warning: (all, [smithy-rs#4120](https://github.com/smithy-lang/smithy-rs/issues/4120)) Update MSRV to 1.82.0\n\n**New this release:**\n- :bug::tada: (client, [smithy-rs#4074](https://github.com/smithy-lang/smithy-rs/issues/4074), [smithy-rs#3926](https://github.com/smithy-lang/smithy-rs/issues/3926)) Promote `aws-smithy-mocks-experimental` to `aws-smithy-mocks`. This crate is now a recommended tool for testing\n    generated SDK clients. This release includes several fixes as well as a new sequence builder API that can be\n    used to test more complex scenarios such as retries.\n\n    ```rust\n    use aws_sdk_s3::operation::get_object::GetObjectOutput;\n    use aws_sdk_s3::config::retry::RetryConfig;\n    use aws_smithy_types::byte_stream::ByteStream;\n    use aws_smithy_mocks::{mock, mock_client, RuleMode};\n\n    #[tokio::test]\n    async fn test_retry_behavior() {\n        // Create a rule that returns 503 twice, then succeeds\n        let retry_rule = mock!(aws_sdk_s3::Client::get_object)\n            .sequence()\n            .http_status(503, None)\n            .times(2)                                            // Return 503 HTTP status twice\n            .output(|| GetObjectOutput::builder()                // Finally return a successful output\n                .body(ByteStream::from_static(b\"success\"))\n                .build())\n            .build();\n\n        // Create a mocked client with the rule\n        let s3 = mock_client!(\n            aws_sdk_s3,\n            RuleMode::Sequential,\n            [&retry_rule],\n            |client_builder| {\n                client_builder.retry_config(RetryConfig::standard().with_max_attempts(3))\n            }\n        );\n\n        // This should succeed after two retries\n        let result = s3\n            .get_object()\n            .bucket(\"test-bucket\")\n            .key(\"test-key\")\n            .send()\n            .await\n            .expect(\"success after retries\");\n\n        // Verify the response\n        let data = result.body.collect().await.expect(\"successful read\").to_vec();\n        assert_eq!(data, b\"success\");\n\n        // Verify all responses were used\n        assert_eq!(retry_rule.num_calls(), 3);\n    }\n    ```\n- :bug: (all, [smithy-rs#4117](https://github.com/smithy-lang/smithy-rs/issues/4117)) Fix a bug where fields that were initially annotated with the `required` trait and later updated to use the `addedDefault` trait were not serialized when their values matched the default, even when the values were explicitly set. With this fix, fields with `addedDefault` are now always serialized.\n\n\nMay 2nd, 2025\n=============\n\nApril 23rd, 2025\n================\n**Breaking Changes:**\n- :warning: (client, [smithy-rs#3776](https://github.com/smithy-lang/smithy-rs/issues/3776)) [AuthSchemeId](https://docs.rs/aws-smithy-runtime-api/1.7.4/aws_smithy_runtime_api/client/auth/struct.AuthSchemeId.html) no longer implements the `Copy` trait. This type has primarily been used by the Smithy code generator, so this change is not expected to affect users of SDKs.\n\n**New this release:**\n- (all, [smithy-rs#4050](https://github.com/smithy-lang/smithy-rs/issues/4050), @FalkWoldmann) Replace the `once_cell` crate with the `std` counterpart in Smithy runtime crates.\n- (client) remove redundant span attributes and improve log output format\n\n**Contributors**\nThank you for your contributions! ❤\n- @FalkWoldmann ([smithy-rs#4050](https://github.com/smithy-lang/smithy-rs/issues/4050))\n\n\nMarch 27th, 2025\n================\n\nMarch 25th, 2025\n================\n**New this release:**\n- :bug: (client, [smithy-rs#4054](https://github.com/smithy-lang/smithy-rs/issues/4054)) Fix traversal of operations bound to resources in several places including logic to determine if an event stream exists\n- (client, [smithy-rs#4052](https://github.com/smithy-lang/smithy-rs/issues/4052)) Update spans to better align with spec.\n\n\nMarch 10th, 2025\n================\n**New this release:**\n- (client, [aws-sdk-rust#977](https://github.com/awslabs/aws-sdk-rust/issues/977), [smithy-rs#1925](https://github.com/smithy-lang/smithy-rs/issues/1925), [smithy-rs#3710](https://github.com/smithy-lang/smithy-rs/issues/3710)) Updates the default HTTP client to be based on the 1.x version of hyper and updates the default TLS provider to [rustls](https://github.com/rustls/rustls) with [aws-lc](https://github.com/aws/aws-lc-rs). For more information see the GitHub [discussion](https://github.com/awslabs/aws-sdk-rust/discussions/1257).\n\n\nMarch 4th, 2025\n===============\n**New this release:**\n- :tada: (client, [smithy-rs#121](https://github.com/smithy-lang/smithy-rs/issues/121)) Adds support for event stream operations with non-REST protocols such as RPC v2 CBOR.\n\n\nFebruary 20th, 2025\n===================\n**New this release:**\n- :bug: (server) Fixed code generation failure that occurred when using `Result` as a shape name in Smithy models with constrained members by properly handling naming conflicts with Rust's built-in Result type\n- :bug: (server) Previously, models would fail to generate when both the list and at least one of its members was directly constrained with documentation comments\n\n\nFebruary 12th, 2025\n===================\n\nFebruary 3rd, 2025\n==================\n\nJanuary 28th, 2025\n==================\n\nJanuary 23rd, 2025\n==================\n\nJanuary 17th, 2025\n==================\n\nJanuary 14th, 2025\n==================\n**New this release:**\n- :bug::tada: (client, [smithy-rs#3845](https://github.com/smithy-lang/smithy-rs/issues/3845)) S3 client behavior is updated to always calculate a checksum by default for operations that support it (such as PutObject or UploadPart), or require it (such as DeleteObjects). The default checksum algorithm is CRC32. Checksum behavior can be configured using `when_supported` and `when_required` options - in shared config using request_checksum_calculation, or as env variable using AWS_REQUEST_CHECKSUM_CALCULATION.\n\n    The S3 client attempts to validate response checksums for all S3 API operations that support checksums. However, if the SDK has not implemented the specified checksum algorithm then this validation is skipped. Checksum validation behavior can be configured using `when_supported` and `when_required` options - in shared config using response_checksum_validation, or as env variable using AWS_RESPONSE_CHECKSUM_VALIDATION.\n- :bug::tada: (client, [smithy-rs#3967](https://github.com/smithy-lang/smithy-rs/issues/3967)) Updates client generation to conform with Smithy's updates to the [httpChecksum trait](https://smithy.io/2.0/aws/aws-core.html#aws-protocols-httpchecksum-trait).\n- :bug: (client, [aws-sdk-rust#1234](https://github.com/awslabs/aws-sdk-rust/issues/1234)) Fix token bucket not being set for standard and adaptive retry modes\n\n\nDecember 30th, 2024\n===================\n\nDecember 26th, 2024\n===================\n**New this release:**\n- :bug: (server, [smithy-rs#3890](https://github.com/smithy-lang/smithy-rs/issues/3890)) Fix bug in `serde` decorator that generated non-compiling code on some models\n\n\nDecember 16th, 2024\n===================\n\nDecember 3rd, 2024\n==================\n**Breaking Changes:**\n- :bug::warning: (server, [smithy-rs#3880](https://github.com/smithy-lang/smithy-rs/issues/3880)) Unnamed enums now validate assigned values and will raise a `ConstraintViolation` if an unknown variant is set.\n\n    The following is an example of an unnamed enum:\n    ```smithy\n    @enum([\n        { value: \"MONDAY\" },\n        { value: \"TUESDAY\" }\n    ])\n    string UnnamedDayOfWeek\n    ```\n\n\nNovember 5th, 2024\n==================\n\nOctober 30th, 2024\n==================\n\nOctober 24th, 2024\n==================\n\nOctober 9th, 2024\n=================\n**New this release:**\n- :bug: (client, [smithy-rs#3871](https://github.com/smithy-lang/smithy-rs/issues/3871), [aws-sdk-rust#1202](https://github.com/awslabs/aws-sdk-rust/issues/1202)) Fix minimum throughput detection for downloads to avoid incorrectly raising an error while the user is consuming data at a slow but steady pace.\n\n\nOctober 5th, 2024\n=================\n**New this release:**\n- :bug: (client, [smithy-rs#3852](https://github.com/smithy-lang/smithy-rs/issues/3852)) Fix AWS SDK generation examples in README in the `aws/sdk` directory.\n\n\nOctober 4th, 2024\n=================\n\nOctober 3rd, 2024\n=================\n**Breaking Changes:**\n- :warning: (server) The generated crates no longer have the `aws-lambda` feature flag enabled by default. This prevents the [aws-lambda](https://docs.rs/crate/aws-smithy-http-server/0.63.3/features#aws-lambda) feature from being automatically enabled in [aws-smithy-http-server](https://docs.rs/aws-smithy-http-server/0.63.3/aws_smithy_http_server/) when the SDK is not intended for AWS Lambda.\n\n**New this release:**\n- :tada: (server) All relevant types from [aws-smithy-http-server](https://docs.rs/aws-smithy-http-server/0.63.3/aws_smithy_http_server/) are now re-exported within the generated crates. This removes the need to explicitly depend on [aws-smithy-http-server](https://docs.rs/aws-smithy-http-server/0.63.3/aws_smithy_http_server/) in service handler code and prevents compilation errors caused by version mismatches.\n\n- :tada: (all, [smithy-rs#3573](https://github.com/smithy-lang/smithy-rs/issues/3573)) Support for the [rpcv2Cbor](https://smithy.io/2.0/additional-specs/protocols/smithy-rpc-v2.html) protocol has been added, allowing services to serialize RPC payloads as CBOR (Concise Binary Object Representation), improving performance and efficiency in data transmission.\n\n\nSeptember 26th, 2024\n====================\n**New this release:**\n- :bug: (client, [smithy-rs#3820](https://github.com/smithy-lang/smithy-rs/issues/3820)) Fixed a bug with the content length of compressed payloads that caused such requests to hang.\n\n\nSeptember 17th, 2024\n====================\n\nSeptember 9th, 2024\n===================\n**Breaking Changes:**\n- :bug::warning: (server, [smithy-rs#3813](https://github.com/smithy-lang/smithy-rs/issues/3813)) Operations with event stream member shapes must include `ValidationException` in the errors list. This is necessary because the member shape is a required field, and the builder for the operation input or output returns a `std::result::Result` with the error set to `crate::model::ValidationExceptionField`.\n\n**New this release:**\n- :tada: (server, [smithy-rs#3803](https://github.com/smithy-lang/smithy-rs/issues/3803)) Setting the `addValidationExceptionToConstrainedOperations` codegen flag adds `aws.smithy.framework#ValidationException` to operations with constrained inputs that do not already have this exception added.\n\n    Sample `smithy-build-template.json`:\n\n    ```\n    {\n        \"...\",\n        \"plugins\": {\n            \"rust-server-codegen\": {\n                \"service\": \"ServiceToGenerateSDKFor\",\n                    \"module\": \"amzn-sample-server-sdk\",\n                    \"codegen\": {\n                        \"addValidationExceptionToConstrainedOperations\": true,\n                    }\n            }\n        }\n    }\n    ```\n- :bug: (all, [smithy-rs#3805](https://github.com/smithy-lang/smithy-rs/issues/3805)) Fix bug in `DateTime::from_secs_f64` where certain floating point values could lead to a panic.\n\n\nAugust 28th, 2024\n=================\n**Breaking Changes:**\n- :warning: (all, [smithy-rs#3800](https://github.com/smithy-lang/smithy-rs/issues/3800)) Upgrade MSRV to Rust 1.78.0.\n\n**New this release:**\n- :bug: (client, [smithy-rs#3798](https://github.com/smithy-lang/smithy-rs/issues/3798)) Fix the execution order of [modify_before_serialization](https://docs.rs/aws-smithy-runtime-api/latest/aws_smithy_runtime_api/client/interceptors/trait.Intercept.html#method.modify_before_serialization) and [read_before_serialization](https://docs.rs/aws-smithy-runtime-api/latest/aws_smithy_runtime_api/client/interceptors/trait.Intercept.html#method.read_before_serialization) in the orchestrator. The `modify_before_serialization` method now executes before the `read_before_serialization` method. This adjustment may result in changes in behavior depending on how you customize interceptors.\n- (client, [smithy-rs#1925](https://github.com/smithy-lang/smithy-rs/issues/1925)) Backport connection poisoning to hyper 1.x support\n- :bug: (client, [aws-sdk-rust#821](https://github.com/awslabs/aws-sdk-rust/issues/821), [smithy-rs#3797](https://github.com/smithy-lang/smithy-rs/issues/3797)) Fix the [Length::UpTo](https://docs.rs/aws-smithy-types/1.2.2/aws_smithy_types/byte_stream/enum.Length.html) usage in [FsBuilder](https://docs.rs/aws-smithy-types/1.2.2/aws_smithy_types/byte_stream/struct.FsBuilder.html), ensuring that the specified length does not exceed the remaining file length.\n- :bug: (client, [aws-sdk-rust#820](https://github.com/awslabs/aws-sdk-rust/issues/820)) Re-export `ByteStream`'s `Length` and `FsBuilder`. By making these types available directly within a client crate, customers can use `ByteStream::read_from` without needing to import them separately from the `aws-smithy-types` crate.\n\n\nAugust 16th, 2024\n=================\n\nAugust 14th, 2024\n=================\n\nAugust 8th, 2024\n================\n**New this release:**\n- :bug: (client, [smithy-rs#3767](https://github.com/smithy-lang/smithy-rs/issues/3767)) Fix client error correction to properly parse structure members that target a `Union` containing that structure recursively.\n- :bug: (client, [smithy-rs#3765](https://github.com/smithy-lang/smithy-rs/issues/3765), [smithy-rs#3757](https://github.com/smithy-lang/smithy-rs/issues/3757)) Fix incorrect redaction of `@sensitive` types in maps and lists.\n- (client, [smithy-rs#3779](https://github.com/smithy-lang/smithy-rs/issues/3779)) Improve error messaging when HTTP headers aren't valid UTF-8\n\n\nJuly 16th, 2024\n===============\n**New this release:**\n- (client, [smithy-rs#3742](https://github.com/smithy-lang/smithy-rs/issues/3742)) Support `stringArray` type in endpoints params\n- (client, [smithy-rs#3755](https://github.com/smithy-lang/smithy-rs/issues/3755)) Add support for `operationContextParams` Endpoints trait\n- (client, [smithy-rs#3591](https://github.com/smithy-lang/smithy-rs/issues/3591)) `aws_smithy_runtime_api::client::orchestrator::HttpRequest` and `aws_smithy_runtime_api::client::orchestrator::HttpResponse` are now re-exported in generated clients so that using these types does not require directly depending on `aws-smithy-runtime-api`.\n\n\nJuly 9th, 2024\n==============\n**Breaking Changes:**\n- :warning: (server, [smithy-rs#3746](https://github.com/smithy-lang/smithy-rs/issues/3746)) `FromParts<Protocol>::Rejection` must implement `std::fmt::Display`.\n\n    Handlers can accept user-defined types if they implement \n    [FromParts<Protocol>](https://docs.rs/aws-smithy-http-server/latest/aws_smithy_http_server/request/trait.FromParts.html) with a `Rejection` \n    type that implements `std::fmt::Display` (preferably `std::error::Error`) to enable error logging when parameter construction from request parts fails.\n\n    See the [changelog discussion for futher details](https://github.com/smithy-lang/smithy-rs/discussions/3749).\n\n**New this release:**\n- (client, [smithy-rs#3742](https://github.com/smithy-lang/smithy-rs/issues/3742)) Support `stringArray` type in endpoints params\n- :bug: (client, [smithy-rs#3744](https://github.com/smithy-lang/smithy-rs/issues/3744)) Fix bug where stalled stream protection would panic with an underflow if the first event was logged too soon.\n\n\nJuly 3rd, 2024\n==============\n**New this release:**\n- :bug: (server, [smithy-rs#3643](https://github.com/smithy-lang/smithy-rs/issues/3643)) A feature, `aws-lambda`, has been added to generated SDKs to re-export types required for Lambda deployment.\n- :bug: (server, [smithy-rs#3471](https://github.com/smithy-lang/smithy-rs/issues/3471), [smithy-rs#3724](https://github.com/smithy-lang/smithy-rs/issues/3724), @djedward) Content-Type header validation now ignores parameter portion of media types.\n\n**Contributors**\nThank you for your contributions! ❤\n- @djedward ([smithy-rs#3471](https://github.com/smithy-lang/smithy-rs/issues/3471), [smithy-rs#3724](https://github.com/smithy-lang/smithy-rs/issues/3724))\n\n\nJune 19th, 2024\n===============\n**Breaking Changes:**\n- :bug::warning: (server, [smithy-rs#3690](https://github.com/smithy-lang/smithy-rs/issues/3690)) Fix request `Content-Type` header checking\n\n    Two bugs related to how servers were checking the `Content-Type` header in incoming requests have been fixed:\n\n    1. `Content-Type` header checking was incorrectly succeeding when no `Content-Type` header was present but one was expected.\n    2. When a shape was @httpPayload`-bound, `Content-Type` header checking occurred even when no payload was being sent. In this case it is not necessary to check the header, since there is no content.\n\n    This is a breaking change in that servers are now stricter at enforcing the expected `Content-Type` header is being sent by the client in general, and laxer when the shape is bound with `@httpPayload`.\n\n\nJune 17th, 2024\n===============\n\nJune 12th, 2024\n===============\n\nJune 10th, 2024\n===============\n**New this release:**\n- (all, [smithy-rs#1925](https://github.com/smithy-lang/smithy-rs/issues/1925), [smithy-rs#3673](https://github.com/smithy-lang/smithy-rs/issues/3673)) Add support for v1 `http_body::Body` to `aws_smithy_types::byte_stream::bytestream_util::PathBody`.\n- (all, [smithy-rs#3637](https://github.com/smithy-lang/smithy-rs/issues/3637), @khuey) Add conversions from smithy StatusCode to http StatusCode.\n- :bug: (client, [smithy-rs#3675](https://github.com/smithy-lang/smithy-rs/issues/3675), @dastrom) Enable aws-smithy-runtime to compile in rustc 1.72.1\n\n**Contributors**\nThank you for your contributions! ❤\n- @dastrom ([smithy-rs#3675](https://github.com/smithy-lang/smithy-rs/issues/3675))\n- @khuey ([smithy-rs#3637](https://github.com/smithy-lang/smithy-rs/issues/3637))\n\n\nJune 3rd, 2024\n==============\n**New this release:**\n- (client, [smithy-rs#3664](https://github.com/smithy-lang/smithy-rs/issues/3664)) Reduce verbosity of various debug logs\n\n\nMay 28th, 2024\n==============\n\nMay 22nd, 2024\n==============\n**New this release:**\n- :bug: (client, [smithy-rs#3656](https://github.com/smithy-lang/smithy-rs/issues/3656), [smithy-rs#3657](https://github.com/smithy-lang/smithy-rs/issues/3657)) Fix the Content-Length enforcement so it is only applied to GET requests.\n\n\nMay 21st, 2024\n==============\n**Breaking Changes:**\n- :warning::tada: (all, [smithy-rs#3653](https://github.com/smithy-lang/smithy-rs/issues/3653)) Update MSRV to `1.76.0`\n\n**New this release:**\n- :tada: (client, [smithy-rs#2891](https://github.com/smithy-lang/smithy-rs/issues/2891)) Compression is now supported for operations modeled with the `@requestCompression` trait.\n\n    [**For more details, see the long-form changelog discussion**](https://github.com/smithy-lang/smithy-rs/discussions/3646).\n- :bug: (client, [aws-sdk-rust#1133](https://github.com/awslabs/aws-sdk-rust/issues/1133)) Fix panics that occurred when `Duration` for exponential backoff could not be created from too big a float.\n- :bug: (all, [smithy-rs#3491](https://github.com/smithy-lang/smithy-rs/issues/3491), [aws-sdk-rust#1079](https://github.com/awslabs/aws-sdk-rust/issues/1079)) Clients now enforce that the Content-Length sent by the server matches the length of the returned response body. In most cases, Hyper will enforce this behavior, however, in extremely rare circumstances where the Tokio runtime is dropped in between subsequent requests, this scenario can occur.\n- :bug: (all, [aws-sdk-rust#1141](https://github.com/awslabs/aws-sdk-rust/issues/1141), [aws-sdk-rust#1146](https://github.com/awslabs/aws-sdk-rust/issues/1146), [aws-sdk-rust#1148](https://github.com/awslabs/aws-sdk-rust/issues/1148)) Fixes stalled upload stream protection to not apply to empty request bodies and to stop checking for violations once the request body has been read.\n\n\nMay 8th, 2024\n=============\n**Breaking Changes:**\n- :warning::tada: (all, [smithy-rs#3527](https://github.com/smithy-lang/smithy-rs/issues/3527)) Stalled stream protection on uploads is now enabled by default behind `BehaviorVersion::v2024_03_28()`. If you're using `BehaviorVersion::latest()`, you will get this change automatically by running `cargo update`.\n\n**New this release:**\n- (all, [smithy-rs#3161](https://github.com/smithy-lang/smithy-rs/issues/3161), @mnissenb) Implement Debug for DateTime\n\n**Contributors**\nThank you for your contributions! ❤\n- @mnissenb ([smithy-rs#3161](https://github.com/smithy-lang/smithy-rs/issues/3161))\n\n\nApril 30th, 2024\n================\n**New this release:**\n- :tada: (client, [smithy-rs#119](https://github.com/smithy-lang/smithy-rs/issues/119), [smithy-rs#3595](https://github.com/smithy-lang/smithy-rs/issues/3595), [smithy-rs#3593](https://github.com/smithy-lang/smithy-rs/issues/3593), [smithy-rs#3585](https://github.com/smithy-lang/smithy-rs/issues/3585), [smithy-rs#3571](https://github.com/smithy-lang/smithy-rs/issues/3571), [smithy-rs#3569](https://github.com/smithy-lang/smithy-rs/issues/3569)) Added support for waiters. Services that model waiters now have a `Waiters` trait that adds\n    some methods prefixed with `wait_until` to the existing clients.\n\n    For example, if there was a waiter modeled for \"thing\" that takes a \"thing ID\", using\n    that waiter would look as follows:\n\n    ```rust\n    use my_generated_client::client::Waiters;\n\n    let result = client.wait_until_thing()\n        .thing_id(\"someId\")\n        .wait(Duration::from_secs(120))\n        .await;\n    ```\n- :bug: (all, [smithy-rs#3603](https://github.com/smithy-lang/smithy-rs/issues/3603)) Fix event stream `:content-type` message headers for struct messages. Note: this was the `:content-type` header on individual event message frames that was incorrect, not the HTTP `content-type` header for the initial request.\n\n\nApril 19th, 2024\n================\n**New this release:**\n- :tada: (server, [smithy-rs#3430](https://github.com/smithy-lang/smithy-rs/issues/3430)) Implement `std::error::Error` for `ConstraintViolation`\n- (all, [smithy-rs#3553](https://github.com/smithy-lang/smithy-rs/issues/3553)) Upgraded MSRV to Rust 1.75\n\n\nApril 11th, 2024\n================\n**New this release:**\n- :tada: (all, [smithy-rs#3485](https://github.com/smithy-lang/smithy-rs/issues/3485)) Stalled stream protection now supports request upload streams. It is currently off by default, but will be enabled by default in a future release. To enable it now, you can do the following:\n\n    ```rust\n    let config = my_service::Config::builder()\n        .stalled_stream_protection(StalledStreamProtectionConfig::enabled().build())\n        // ...\n        .build();\n    ```\n- :bug: (all, [smithy-rs#3427](https://github.com/smithy-lang/smithy-rs/issues/3427)) `SharedIdentityResolver` now respects an existing cache partition when the `ResolveIdentity` implementation\n    provides one already.\n- :bug: (all, [smithy-rs#3485](https://github.com/smithy-lang/smithy-rs/issues/3485)) Stalled stream protection on downloads will now only trigger if the upstream source is too slow. Previously, stalled stream protection could be erroneously triggered if the user was slowly consuming the stream slower than the minimum speed limit.\n- :bug: (all, [smithy-rs#2546](https://github.com/smithy-lang/smithy-rs/issues/2546)) Unions with unit target member shape are now fully supported\n\n\nApril 2nd, 2024\n===============\n**Breaking Changes:**\n- :bug::warning: (client, [aws-sdk-rust#1111](https://github.com/awslabs/aws-sdk-rust/issues/1111), [smithy-rs#3513](https://github.com/smithy-lang/smithy-rs/issues/3513), @Ten0) Make `BehaviorVersion` be future-proof by disallowing it to be constructed via the `BehaviorVersion {}` syntax.\n\n**New this release:**\n- :tada: (all, [smithy-rs#3539](https://github.com/smithy-lang/smithy-rs/issues/3539)) Add FIPS support to our Hyper 1.0-based client. Customers can enable this mode by enabling the `crypto-aws-lc-fips` on `aws-smithy-experimental`. To construct a client using the new client, consult this [example](https://github.com/awslabs/aws-sdk-rust/blob/release-2024-03-29/sdk/s3/tests/hyper-10.rs).\n\n    Please note that support for Hyper 1.0 remains experimental.\n- (all, [smithy-rs#3389](https://github.com/smithy-lang/smithy-rs/issues/3389)) All requests are now retryable, even if they are deserialized successfully. Previously, this was not allowed.\n- (all, [smithy-rs#3539](https://github.com/smithy-lang/smithy-rs/issues/3539)) Fix bug in Hyper 1.0 support where https URLs returned an error\n\n**Contributors**\nThank you for your contributions! ❤\n- @Ten0 ([aws-sdk-rust#1111](https://github.com/awslabs/aws-sdk-rust/issues/1111), [smithy-rs#3513](https://github.com/smithy-lang/smithy-rs/issues/3513))\n\n\nMarch 25th, 2024\n================\n**New this release:**\n- (all, [smithy-rs#3476](https://github.com/smithy-lang/smithy-rs/issues/3476), @landonxjames) Increased minimum version of wasi crate dependency in aws-smithy-wasm to 0.12.1.\n\n**Contributors**\nThank you for your contributions! ❤\n- @landonxjames ([smithy-rs#3476](https://github.com/smithy-lang/smithy-rs/issues/3476))\n\n\nMarch 12th, 2024\n================\n**New this release:**\n- :tada: (all, [smithy-rs#2087](https://github.com/smithy-lang/smithy-rs/issues/2087), [smithy-rs#2520](https://github.com/smithy-lang/smithy-rs/issues/2520), [smithy-rs#3409](https://github.com/smithy-lang/smithy-rs/issues/3409), [aws-sdk-rust#59](https://github.com/awslabs/aws-sdk-rust/issues/59), @landonxjames, @eduardomourar) Added aws-smithy-wasm crate to enable SDK use in WASI compliant environments\n- :tada: (client, [smithy-rs#2087](https://github.com/smithy-lang/smithy-rs/issues/2087), [smithy-rs#2520](https://github.com/smithy-lang/smithy-rs/issues/2520), [smithy-rs#3409](https://github.com/smithy-lang/smithy-rs/issues/3409), @landonxjames, @eduardomourar) Added aws-smithy-wasm crate to enable SDK use in WASI compliant environments\n- :tada: (all, [smithy-rs#3365](https://github.com/smithy-lang/smithy-rs/issues/3365), [aws-sdk-rust#1046](https://github.com/awslabs/aws-sdk-rust/issues/1046), @cayman-amzn) [`SdkBody`](https://docs.rs/aws-smithy-types/latest/aws_smithy_types/body/struct.SdkBody.html) now implements the 1.0 version of the `http_body::Body` trait.\n- (all, [smithy-rs#3470](https://github.com/smithy-lang/smithy-rs/issues/3470)) Upgrade Smithy to 1.45.\n- (client, [smithy-rs#3465](https://github.com/smithy-lang/smithy-rs/issues/3465), [smithy-rs#3477](https://github.com/smithy-lang/smithy-rs/issues/3477)) The `ResolveIdentity` trait is now aware of its `IdentityCache` location.\n- (client, [smithy-rs#3465](https://github.com/smithy-lang/smithy-rs/issues/3465), [smithy-rs#3477](https://github.com/smithy-lang/smithy-rs/issues/3477)) `RuntimeComponents` can now be converted back to a `RuntimeComponentsBuilder`, using `.to_builder()`.\n\n**Contributors**\nThank you for your contributions! ❤\n- @cayman-amzn ([aws-sdk-rust#1046](https://github.com/awslabs/aws-sdk-rust/issues/1046), [smithy-rs#3365](https://github.com/smithy-lang/smithy-rs/issues/3365))\n- @eduardomourar ([aws-sdk-rust#59](https://github.com/awslabs/aws-sdk-rust/issues/59), [smithy-rs#2087](https://github.com/smithy-lang/smithy-rs/issues/2087), [smithy-rs#2520](https://github.com/smithy-lang/smithy-rs/issues/2520), [smithy-rs#3409](https://github.com/smithy-lang/smithy-rs/issues/3409))\n- @landonxjames ([aws-sdk-rust#59](https://github.com/awslabs/aws-sdk-rust/issues/59), [smithy-rs#2087](https://github.com/smithy-lang/smithy-rs/issues/2087), [smithy-rs#2520](https://github.com/smithy-lang/smithy-rs/issues/2520), [smithy-rs#3409](https://github.com/smithy-lang/smithy-rs/issues/3409))\n\n\nFebruary 22nd, 2024\n===================\n**New this release:**\n- (all, [smithy-rs#3410](https://github.com/smithy-lang/smithy-rs/issues/3410)) The MSRV has been increase to 1.74.1\n\n\nFebruary 15th, 2024\n===================\n**Breaking Changes:**\n- :bug::warning: (client, [smithy-rs#3405](https://github.com/smithy-lang/smithy-rs/issues/3405), [smithy-rs#3400](https://github.com/smithy-lang/smithy-rs/issues/3400), [smithy-rs#3258](https://github.com/smithy-lang/smithy-rs/issues/3258)) Fix bug where timeout settings where not merged properly. This will add a default connect timeout of 3.1s seconds for most clients.\n\n    [**For more details see the long-form changelog discussion**](https://github.com/smithy-lang/smithy-rs/discussions/3408).\n\n**New this release:**\n- (all, [aws-sdk-rust#977](https://github.com/awslabs/aws-sdk-rust/issues/977), [smithy-rs#3365](https://github.com/smithy-lang/smithy-rs/issues/3365), [smithy-rs#3373](https://github.com/smithy-lang/smithy-rs/issues/3373)) Add `try_into_http1x` and `try_from_http1x` to Request and Response container types.\n- (client, [smithy-rs#3336](https://github.com/smithy-lang/smithy-rs/issues/3336), [smithy-rs#3391](https://github.com/smithy-lang/smithy-rs/issues/3391), @iampkmone) Added impl `Display` to Enums.\n- :bug: (all, [smithy-rs#3322](https://github.com/smithy-lang/smithy-rs/issues/3322)) Retry classifiers will now be sorted by priority. This change only affects requests\n    that are retried. Some requests that were previously been classified as transient\n    errors may now be classified as throttling errors.\n\n    If you were\n\n    - configuring multiple custom retry classifiers\n    - that would disagree on how to classify a response\n    - that have differing priorities\n\n    you may see a behavior change in that classification for the same response is now\n    dependent on the classifier priority instead of the order in which the classifier\n    was added.\n- :bug: (client, [smithy-rs#3402](https://github.com/smithy-lang/smithy-rs/issues/3402)) Cap the maximum jitter fraction for identity cache refresh buffer time to 0.5. It was previously 1.0, and if the fraction was randomly set to 1.0, it was equivalent to disregarding the buffer time for cache refresh.\n\n**Contributors**\nThank you for your contributions! ❤\n- @iampkmone ([smithy-rs#3336](https://github.com/smithy-lang/smithy-rs/issues/3336), [smithy-rs#3391](https://github.com/smithy-lang/smithy-rs/issues/3391))\n\n\nFebruary 8th, 2024\n==================\n\nJanuary 24th, 2024\n==================\n\nJanuary 18th, 2024\n==================\n**New this release:**\n- (client, [smithy-rs#3318](https://github.com/smithy-lang/smithy-rs/issues/3318)) `EndpointPrefix` and `apply_endpoint` moved from aws-smithy-http to aws-smithy-runtime-api so that is in a stable (1.x) crate. A deprecated type alias was left in place with a note showing the new location.\n- (client, [smithy-rs#3325](https://github.com/smithy-lang/smithy-rs/issues/3325)) The `Metadata` storable was moved from aws_smithy_http into aws_smithy_runtime_api. A deprecated type alias was left in place with a note showing where the new location is.\n\n\nJanuary 10th, 2024\n==================\n**New this release:**\n- :tada: (all, [smithy-rs#3300](https://github.com/smithy-lang/smithy-rs/issues/3300), [aws-sdk-rust#977](https://github.com/awslabs/aws-sdk-rust/issues/977)) Add support for constructing [`SdkBody`] and [`ByteStream`] from `http-body` 1.0 bodies. Note that this is initial support and works via a backwards compatibility shim to http-body 0.4. Hyper 1.0 is not supported.\n- :tada: (all, [smithy-rs#3333](https://github.com/smithy-lang/smithy-rs/issues/3333), [aws-sdk-rust#998](https://github.com/awslabs/aws-sdk-rust/issues/998), [aws-sdk-rust#1010](https://github.com/awslabs/aws-sdk-rust/issues/1010)) Add `as_service_err()` to `SdkError` to allow checking the type of an error is without taking ownership.\n- (client, [smithy-rs#3299](https://github.com/smithy-lang/smithy-rs/issues/3299), @Ploppz)  Add `PaginationStreamExt` extension trait to `aws-smithy-types-convert` behind the `convert-streams` feature. This makes it possible to treat a paginator as a [`futures_core::Stream`](https://docs.rs/futures-core/latest/futures_core/stream/trait.Stream.html), allowing customers to use stream combinators like [`map`](https://docs.rs/tokio-stream/latest/tokio_stream/trait.StreamExt.html#method.map) and [`filter`](https://docs.rs/tokio-stream/latest/tokio_stream/trait.StreamExt.html#method.filter).\n\n    Example:\n\n    ```rust\n    use aws_smithy_types_convert::stream::PaginationStreamExt\n    let stream = s3_client.list_objects_v2().bucket(\"...\").into_paginator().send().into_stream_03x();\n    ```\n- :bug: (client, [smithy-rs#3252](https://github.com/smithy-lang/smithy-rs/issues/3252), [smithy-rs#3312](https://github.com/smithy-lang/smithy-rs/issues/3312), @milesziemer) Serialize 0/false in query parameters, and ignore actual default value during serialization instead of just 0/false. See [changelog discussion](https://github.com/smithy-lang/smithy-rs/discussions/3312) for details.\n- (all, [smithy-rs#3292](https://github.com/smithy-lang/smithy-rs/issues/3292)) `requireEndpointResolver: false` is no longer required to remove the need for an endpoint resolver. Instead, `\"awsSdkBuilder\"` (default false), now _removes_ that requirement.\n\n**Contributors**\nThank you for your contributions! ❤\n- @Ploppz ([smithy-rs#3299](https://github.com/smithy-lang/smithy-rs/issues/3299))\n- @milesziemer ([smithy-rs#3252](https://github.com/smithy-lang/smithy-rs/issues/3252), [smithy-rs#3312](https://github.com/smithy-lang/smithy-rs/issues/3312))\n\n\nDecember 13th, 2023\n===================\n\nDecember 11th, 2023\n===================\n**New this release:**\n- :bug: (client, [smithy-rs#3305](https://github.com/smithy-lang/smithy-rs/issues/3305)) `crate::event_receiver::EventReceiver` is now re-exported as `crate::primitives::event_stream::EventReceiver` when a service supports event stream operations.\n\n\nDecember 8th, 2023\n==================\n**New this release:**\n- :tada: (all, [smithy-rs#3121](https://github.com/smithy-lang/smithy-rs/issues/3121), [smithy-rs#3295](https://github.com/smithy-lang/smithy-rs/issues/3295)) All generated docs now include docsrs labels when features are required\n- :bug: (client, [smithy-rs#3262](https://github.com/smithy-lang/smithy-rs/issues/3262)) Loading native TLS trusted certs for the default HTTP client now only occurs if the default HTTP client is not overridden in config.\n- (client, [smithy-rs#3277](https://github.com/smithy-lang/smithy-rs/issues/3277)) Improve the error messages for when auth fails to select an auth scheme for a request.\n- (client, [smithy-rs#3282](https://github.com/smithy-lang/smithy-rs/issues/3282)) Fix documentation and examples on HyperConnector and HyperClientBuilder.\n- (client, [aws-sdk-rust#990](https://github.com/awslabs/aws-sdk-rust/issues/990), @declanvk) Expose local socket address from ConnectionMetadata.\n- (all, [smithy-rs#3294](https://github.com/smithy-lang/smithy-rs/issues/3294)) [`Number`](https://docs.rs/aws-smithy-types/latest/aws_smithy_types/enum.Number.html) `TryInto` implementations now succesfully convert from `f64` to numeric types when no precision is lost. This fixes some deserialization issues where numbers like `25.0` were sent when `Byte` fields were expected.\n\n**Contributors**\nThank you for your contributions! ❤\n- @declanvk ([aws-sdk-rust#990](https://github.com/awslabs/aws-sdk-rust/issues/990))\n\n\nDecember 1st, 2023\n==================\n**New this release:**\n- (client, [smithy-rs#3278](https://github.com/smithy-lang/smithy-rs/issues/3278)) `RuntimeComponentsBuilder::push_identity_resolver` is now deprecated since it does not replace the existing identity resolver of a given auth scheme ID. Use `RuntimeComponentsBuilder::set_identity_resolver` instead.\n\n\nNovember 27th, 2023\n===================\n**New this release:**\n- (client, [aws-sdk-rust#738](https://github.com/awslabs/aws-sdk-rust/issues/738), [aws-sdk-rust#858](https://github.com/awslabs/aws-sdk-rust/issues/858)) Retry additional classes of H2 errors (H2 GoAway & H2 ResetStream)\n\n\nNovember 26th, 2023\n===================\n\nNovember 25th, 2023\n===================\n\nNovember 21st, 2023\n===================\n**Internal changes only with this release**\n\n\nNovember 17th, 2023\n===================\n**Breaking Changes:**\n- :warning::tada: (client, [smithy-rs#3202](https://github.com/smithy-lang/smithy-rs/issues/3202)) Add configurable stalled-stream protection for downloads.\n\n    When making HTTP calls,\n    it's possible for a connection to 'stall out' and emit no more data due to server-side issues.\n    In the event this happens, it's desirable for the stream to error out as quickly as possible.\n    While timeouts can protect you from this issue, they aren't adaptive to the amount of data\n    being sent and so must be configured specifically for each use case. When enabled, stalled-stream\n    protection will ensure that bad streams error out quickly, regardless of the amount of data being\n    downloaded.\n\n    Protection is enabled by default for all clients but can be configured or disabled.\n    See [this discussion](https://github.com/awslabs/aws-sdk-rust/discussions/956) for more details.\n- :warning: (client, [smithy-rs#3222](https://github.com/smithy-lang/smithy-rs/issues/3222)) Types/functions that were deprecated in previous releases were removed. Unfortunately, some of these deprecations\n    were ignored by the Rust compiler (we found out later that `#[deprecated]` on `pub use` doesn't work). See\n    the [deprecations removal list](https://github.com/smithy-lang/smithy-rs/discussions/3223) for more details.\n- :warning: (all, [smithy-rs#3236](https://github.com/smithy-lang/smithy-rs/issues/3236)) Conversions for HTTP request in aws-smithy-runtime-api are now feature gated behind the `http-02x` feature\n\n**New this release:**\n- :tada: (all, [smithy-rs#3183](https://github.com/smithy-lang/smithy-rs/issues/3183), @HakanVardarr) Add `Display` impl for `DateTime`.\n- :bug: (client, [smithy-rs#3229](https://github.com/smithy-lang/smithy-rs/issues/3229), [aws-sdk-rust#960](https://github.com/awslabs/aws-sdk-rust/issues/960)) Prevent multiplication overflow in backoff computation\n- (client, [smithy-rs#3226](https://github.com/smithy-lang/smithy-rs/issues/3226)) Types/functions that were previously `#[doc(hidden)]` in `aws-smithy-async`, `aws-smithy-runtime-api`, `aws-smithy-runtime`, `aws-smithy-types`, and the SDK crates are now visible. For those that are not intended to be used directly, they are called out in their docs as such.\n\n**Contributors**\nThank you for your contributions! ❤\n- @HakanVardarr ([smithy-rs#3183](https://github.com/smithy-lang/smithy-rs/issues/3183))\n\n\nNovember 16th, 2023\n===================\n**Breaking Changes:**\n- :warning: (client, [smithy-rs#3205](https://github.com/smithy-lang/smithy-rs/issues/3205)) SignableRequest::apply_to_request in aws_sigv4 has been renamed `apply_to_request_http0x`\n\n\nNovember 15th, 2023\n===================\n**Breaking Changes:**\n- :warning: (all, [smithy-rs#3138](https://github.com/smithy-lang/smithy-rs/issues/3138), [smithy-rs#3148](https://github.com/smithy-lang/smithy-rs/issues/3148)) [Upgrade guidance for HTTP Request/Response changes](https://github.com/awslabs/smithy-rs/discussions/3154). HTTP request types moved, and a new HTTP response type was added.\n- :warning: (all, [smithy-rs#3139](https://github.com/smithy-lang/smithy-rs/issues/3139)) `Message`, `Header`, `HeaderValue`, and `StrBytes` have been moved to `aws-smithy-types` from `aws-smithy-eventstream`. `Message::read_from` and `Message::write_to` remain in `aws-smithy-eventstream` but they are converted to free functions with the names `read_message_from` and `write_message_to` respectively.\n- :warning: (client, [smithy-rs#3100](https://github.com/smithy-lang/smithy-rs/issues/3100), [smithy-rs#3114](https://github.com/smithy-lang/smithy-rs/issues/3114)) An operation output that supports receiving events from stream now provides a new-type wrapping `aws_smithy_http::event_stream::receiver::Receiver`. The new-type supports the `.recv()` method whose signature is the same as [`aws_smithy_http::event_stream::receiver::Receiver::recv`](https://docs.rs/aws-smithy-http/0.57.0/aws_smithy_http/event_stream/struct.Receiver.html#method.recv).\n- :warning: (all, [smithy-rs#3151](https://github.com/smithy-lang/smithy-rs/issues/3151)) Clients now require a `BehaviorVersion` to be provided. For must customers, `latest` is the best choice. This will be enabled automatically if you enable the `behavior-version-latest` cargo feature on `aws-config` or on an SDK crate. For customers that wish to pin to a specific behavior major version, it can be set in `aws-config` or when constructing the service client.\n\n    ```rust\n    async fn example() {\n        // when creating a client\n        let client = my_service::Client::from_conf(my_service::Config::builder().behavior_version(..).<other params>.build());\n    }\n    ```\n- :warning: (client, [smithy-rs#3189](https://github.com/smithy-lang/smithy-rs/issues/3189)) Remove deprecated error kind type aliases.\n- :warning: (client, [smithy-rs#3191](https://github.com/smithy-lang/smithy-rs/issues/3191)) Unhandled errors have been made opaque to ensure code is written in a future-proof manner. Where previously, you\n    might have:\n    ```rust\n    match service_error.err() {\n        GetStorageError::StorageAccessNotAuthorized(_) => { /* ... */ }\n        GetStorageError::Unhandled(unhandled) if unhandled.code() == Some(\"SomeUnmodeledErrorCode\") {\n            // unhandled error handling\n        }\n        _ => { /* ... */ }\n    }\n    ```\n    It should now look as follows:\n    ```rust\n    match service_error.err() {\n        GetStorageError::StorageAccessNotAuthorized(_) => { /* ... */ }\n        err if err.code() == Some(\"SomeUnmodeledErrorCode\") {\n            // unhandled error handling\n        }\n        _ => { /* ... */ }\n    }\n    ```\n    The `Unhandled` variant should never be referenced directly.\n\n**New this release:**\n- :tada: (client, [aws-sdk-rust#780](https://github.com/awslabs/aws-sdk-rust/issues/780), [smithy-rs#3189](https://github.com/smithy-lang/smithy-rs/issues/3189)) Add `ProvideErrorMetadata` impl for service `Error` type.\n- :bug: (client, [smithy-rs#3182](https://github.com/smithy-lang/smithy-rs/issues/3182), @codypenta) Fix rendering of @error structs when fields have default values\n\n**Contributors**\nThank you for your contributions! ❤\n- @codypenta ([smithy-rs#3182](https://github.com/smithy-lang/smithy-rs/issues/3182))\n\n\nNovember 1st, 2023\n==================\n**New this release:**\n- (client, [smithy-rs#3112](https://github.com/smithy-lang/smithy-rs/issues/3112), [smithy-rs#3116](https://github.com/smithy-lang/smithy-rs/issues/3116)) Upgrade `ring` to 0.17.5.\n\n\nOctober 31st, 2023\n==================\n**Breaking Changes:**\n- :warning::tada: (client, [smithy-rs#2417](https://github.com/smithy-lang/smithy-rs/issues/2417), [smithy-rs#3018](https://github.com/smithy-lang/smithy-rs/issues/3018)) Retry classifiers are now configurable at the service and operation levels. Users may also define their own custom retry classifiers.\n\n    For more information, see the [guide](https://github.com/smithy-lang/smithy-rs/discussions/3050).\n- :warning: (client, [smithy-rs#3011](https://github.com/smithy-lang/smithy-rs/issues/3011)) HTTP connector configuration has changed significantly. See the [upgrade guidance](https://github.com/smithy-lang/smithy-rs/discussions/3022) for details.\n- :warning: (client, [smithy-rs#3038](https://github.com/smithy-lang/smithy-rs/issues/3038)) The `enableNewSmithyRuntime: middleware` opt-out flag in smithy-build.json has been removed and no longer opts out of the client orchestrator implementation. Middleware is no longer supported. If you haven't already upgraded to the orchestrator, see [the guide](https://github.com/smithy-lang/smithy-rs/discussions/2887).\n- :warning: (client, [smithy-rs#2909](https://github.com/smithy-lang/smithy-rs/issues/2909)) It's now possible to nest runtime components with the `RuntimePlugin` trait. A `current_components` argument was added to the `runtime_components` method so that components configured from previous runtime plugins can be referenced in the current runtime plugin. Ordering of runtime plugins was also introduced via a new `RuntimePlugin::order` method.\n- :warning: (all, [smithy-rs#2948](https://github.com/smithy-lang/smithy-rs/issues/2948)) Update MSRV to Rust 1.70.0\n- :warning: (client, [smithy-rs#2970](https://github.com/smithy-lang/smithy-rs/issues/2970)) `aws_smithy_client::hyper_ext::Adapter` was moved/renamed to `aws_smithy_runtime::client::connectors::hyper_connector::HyperConnector`.\n- :warning: (client, [smithy-rs#2970](https://github.com/smithy-lang/smithy-rs/issues/2970)) Test connectors moved into `aws_smithy_runtime::client::connectors::test_util` behind the `test-util` feature.\n- :warning: (client, [smithy-rs#2970](https://github.com/smithy-lang/smithy-rs/issues/2970)) DVR's RecordingConnection and ReplayingConnection were renamed to RecordingConnector and ReplayingConnector respectively.\n- :warning: (client, [smithy-rs#2970](https://github.com/smithy-lang/smithy-rs/issues/2970)) TestConnection was renamed to EventConnector.\n- :warning: (all, [smithy-rs#2973](https://github.com/smithy-lang/smithy-rs/issues/2973)) Remove `once_cell` from public API.\n- :warning: (all, [smithy-rs#2995](https://github.com/smithy-lang/smithy-rs/issues/2995)) Structure members with the type `Option<Vec<T>>` now produce an accessor with the type `&[T]` instead of `Option<&[T]>`. This is enabled by default for clients and can be disabled by updating your smithy-build.json with the following setting:\n    ```json\n    {\n      \"codegen\": {\n        \"flattenCollectionAccessors\": false,\n        ...\n      }\n    }\n    ```\n- :warning: (client, [smithy-rs#2978](https://github.com/smithy-lang/smithy-rs/issues/2978)) The `futures_core::stream::Stream` trait has been removed from public API. `FnStream` only supports `next`, `try_next`, `collect`, and `try_collect` methods. [`TryFlatMap::flat_map`](https://docs.rs/aws-smithy-async/latest/aws_smithy_async/future/pagination_stream/struct.TryFlatMap.html#method.flat_map) returns [`PaginationStream`](https://docs.rs/aws-smithy-async/latest/aws_smithy_async/future/pagination_stream/struct.PaginationStream.html), which should be preferred to `FnStream` at an interface level. Other stream operations that were previously available through the trait or its extension traits can be added later in a backward compatible manner. Finally, `fn_stream` has been moved to be a child module of `pagination_stream`.\n- :warning: (client, [smithy-rs#2983](https://github.com/smithy-lang/smithy-rs/issues/2983)) The `futures_core::stream::Stream` trait has been removed from [`ByteStream`](https://docs.rs/aws-smithy-http/latest/aws_smithy_http/byte_stream/struct.ByteStream.html). The methods mentioned in the [doc](https://docs.rs/aws-smithy-http/latest/aws_smithy_http/byte_stream/struct.ByteStream.html#getting-data-out-of-a-bytestream) will continue to be supported. Other stream operations that were previously available through the trait or its extension traits can be added later in a backward compatible manner.\n- :warning: (client, [smithy-rs#2997](https://github.com/smithy-lang/smithy-rs/issues/2997)) `StaticUriEndpointResolver`'s `uri` constructor now takes a `String` instead of a `Uri`.\n- :warning: (server, [smithy-rs#3038](https://github.com/smithy-lang/smithy-rs/issues/3038)) `SdkError` is no longer re-exported in generated server crates.\n- :warning: (client, [smithy-rs#3039](https://github.com/smithy-lang/smithy-rs/issues/3039)) The `customize()` method is now sync and infallible. Remove any `await`s and error handling from it to make things compile again.\n- :bug::warning: (all, [smithy-rs#3037](https://github.com/smithy-lang/smithy-rs/issues/3037), [aws-sdk-rust#756](https://github.com/awslabs/aws-sdk-rust/issues/756)) Our algorithm for converting identifiers to `snake_case` has been updated. This may result in a small change for some identifiers, particularly acronyms ending in `s`, e.g. `ACLs`.\n- :warning: (client, [smithy-rs#3055](https://github.com/smithy-lang/smithy-rs/issues/3055)) The future return types on traits `EndpointResolver` and `IdentityResolver` changed to new-types `EndpointFuture` and `IdentityFuture` respectively.\n- :warning: (client, [smithy-rs#3032](https://github.com/smithy-lang/smithy-rs/issues/3032)) [`EndpointPrefix::new`](https://docs.rs/aws-smithy-http/latest/aws_smithy_http/endpoint/struct.EndpointPrefix.html#method.new) no longer returns `crate::operation::error::BuildError` for an Err variant, instead returns a more specific [`InvalidEndpointError`](https://docs.rs/aws-smithy-http/latest/aws_smithy_http/endpoint/error/struct.InvalidEndpointError.html).\n- :warning: (client, [smithy-rs#3061](https://github.com/smithy-lang/smithy-rs/issues/3061)) Lifetimes have been added to the `EndpointResolver` trait.\n- :warning: (client, [smithy-rs#3065](https://github.com/smithy-lang/smithy-rs/issues/3065)) Several traits have been renamed from noun form to verb form to be more idiomatic:\n    - `AuthSchemeOptionResolver` -> `ResolveAuthSchemeOptions`\n    - `EndpointResolver` -> `ResolveEndpoint`\n    - `IdentityResolver` -> `ResolveIdentity`\n    - `Signer` -> `Sign`\n    - `RequestSerializer` -> `SerializeRequest`\n    - `ResponseDeserializer` -> `DeserializeResponse`\n    - `Interceptor` -> `Intercept`\n- :warning: (client, [smithy-rs#3059](https://github.com/smithy-lang/smithy-rs/issues/3059)) **This change has [detailed upgrade guidance](https://github.com/smithy-lang/smithy-rs/discussions/3067)**. A summary is below.<br><br> The `HttpRequest` type alias now points to `aws-smithy-runtime-api::client::http::Request`. This is a first-party request type to allow us to gracefully support `http = 1.0` when it arrives. Most customer code using this method should be unaffected. `TryFrom`/`TryInto` conversions are provided for `http = 0.2.*`.\n- :warning: (client, [smithy-rs#2917](https://github.com/smithy-lang/smithy-rs/issues/2917)) `RuntimeComponents` have been added as an argument to the `IdentityResolver::resolve_identity` trait function.\n- :warning: (client, [smithy-rs#3072](https://github.com/smithy-lang/smithy-rs/issues/3072)) The `idempotency_provider` field has been removed from config as a public field. If you need access to this field, it is still available from the context of an interceptor.\n- :warning: (client, [smithy-rs#3078](https://github.com/smithy-lang/smithy-rs/issues/3078)) The `config::Builder::endpoint_resolver` method no longer accepts `&'static str`. Use `config::Builder::endpoint_url` instead.\n- :warning: (client, [smithy-rs#3043](https://github.com/smithy-lang/smithy-rs/issues/3043), [smithy-rs#3078](https://github.com/smithy-lang/smithy-rs/issues/3078)) **This change has [detailed upgrade guidance](https://github.com/smithy-lang/smithy-rs/discussions/3079).** <br><br>The endpoint interfaces from `aws-smithy-http` have been removed. Service-specific endpoint resolver traits have been added.\n- :warning: (all, [smithy-rs#3054](https://github.com/smithy-lang/smithy-rs/issues/3054), [smithy-rs#3070](https://github.com/smithy-lang/smithy-rs/issues/3070)) `aws_smithy_http::operation::error::{BuildError, SerializationError}` have been moved to `aws_smithy_types::error::operation::{BuildError, SerializationError}`. Type aliases for them are left in `aws_smithy_http` for backwards compatibility but are deprecated.\n- :warning: (all, [smithy-rs#3076](https://github.com/smithy-lang/smithy-rs/issues/3076)) `aws_smithy_http::body::{BoxBody, Error, SdkBody}` have been moved to `aws_smithy_types::body::{BoxBody, Error, SdkBody}`. Type aliases for them are left in `aws_smithy_http` for backwards compatibility but are deprecated.\n- :warning: (all, [smithy-rs#3076](https://github.com/smithy-lang/smithy-rs/issues/3076), [smithy-rs#3091](https://github.com/smithy-lang/smithy-rs/issues/3091)) `aws_smithy_http::byte_stream::{AggregatedBytes, ByteStream, error::Error, FsBuilder, Length}` have been moved to `aws_smithy_types::byte_stream::{AggregatedBytes, ByteStream, error::Error, FsBuilder, Length}`. Type aliases for them are left in `aws_smithy_http` for backwards compatibility but are deprecated.\n- :warning: (client, [smithy-rs#3077](https://github.com/smithy-lang/smithy-rs/issues/3077)) **Behavior Break!** Identities for auth are now cached by default. See the `Config` builder's `identity_cache()` method docs for an example of how to disable this caching.\n- :warning: (all, [smithy-rs#3033](https://github.com/smithy-lang/smithy-rs/issues/3033), [smithy-rs#3088](https://github.com/smithy-lang/smithy-rs/issues/3088), [smithy-rs#3101](https://github.com/smithy-lang/smithy-rs/issues/3101)) Publicly exposed types from `http-body` and `hyper` crates within `aws-smithy-types` are now feature-gated. See the [upgrade guidance](https://github.com/smithy-lang/smithy-rs/discussions/3089) for details.\n- :warning: (all, [smithy-rs#3033](https://github.com/smithy-lang/smithy-rs/issues/3033), [smithy-rs#3088](https://github.com/smithy-lang/smithy-rs/issues/3088)) `ByteStream::poll_next` is now feature-gated. You can turn on a cargo feature `byte-stream-poll-next` in `aws-smithy-types` to use it.\n- :warning: (client, [smithy-rs#3092](https://github.com/smithy-lang/smithy-rs/issues/3092), [smithy-rs#3093](https://github.com/smithy-lang/smithy-rs/issues/3093)) The [`connection`](https://docs.rs/aws-smithy-http/latest/aws_smithy_http/connection/index.html) and [`result`](https://docs.rs/aws-smithy-http/latest/aws_smithy_http/result/index.html) modules in `aws-smithy-http` have been moved to `aws-smithy-runtime-api`. Type aliases for all affected pub items, except for a trait, are left in `aws-smithy-http` for backwards compatibility but are deprecated. Due to lack of trait aliases, the moved trait `CreateUnhandledError` needs to be used from `aws-smithy-runtime-api`.\n- :bug::warning: (server, [smithy-rs#3095](https://github.com/smithy-lang/smithy-rs/issues/3095), [smithy-rs#3096](https://github.com/smithy-lang/smithy-rs/issues/3096)) Service builder initialization now takes in a `${serviceName}Config` object on which plugins and layers should be registered. The `builder_with_plugins` and `builder_without_plugins` methods on the service builder, as well as the `layer` method on the built service have been deprecated, and will be removed in a future release. See the [upgrade guidance](https://github.com/smithy-lang/smithy-rs/discussions/3096) for more details.\n\n**New this release:**\n- :tada: (client, [smithy-rs#2916](https://github.com/smithy-lang/smithy-rs/issues/2916), [smithy-rs#1767](https://github.com/smithy-lang/smithy-rs/issues/1767)) Support for Smithy IDLv2 nullability is now enabled by default. You can maintain the old behavior by setting `nullabilityCheckMode: \"CLIENT_ZERO_VALUE_V1\" in your codegen config.\n    For upgrade guidance and more info, see [here](https://github.com/smithy-lang/smithy-rs/discussions/2929).\n- :tada: (server, [smithy-rs#3005](https://github.com/smithy-lang/smithy-rs/issues/3005)) Python middleware can set URI. This can be used to route a request to a different handler.\n- :tada: (client, [smithy-rs#3071](https://github.com/smithy-lang/smithy-rs/issues/3071)) Clients now have a default async sleep implementation so that one does not need to be specified if you're using Tokio.\n- :bug: (client, [smithy-rs#2944](https://github.com/smithy-lang/smithy-rs/issues/2944), [smithy-rs#2951](https://github.com/smithy-lang/smithy-rs/issues/2951)) `CustomizableOperation`, created as a result of calling the `.customize` method on a fluent builder, ceased to be `Send` and `Sync` in the previous releases. It is now `Send` and `Sync` again.\n- :bug: (client, [smithy-rs#2960](https://github.com/smithy-lang/smithy-rs/issues/2960)) Generate a region setter when a model uses SigV4.\n- :bug: (all, [smithy-rs#2969](https://github.com/smithy-lang/smithy-rs/issues/2969), [smithy-rs#1896](https://github.com/smithy-lang/smithy-rs/issues/1896)) Fix code generation for union members with the `@httpPayload` trait.\n- (client, [smithy-rs#2964](https://github.com/smithy-lang/smithy-rs/issues/2964)) Required members with @contextParam are now treated as client-side required.\n- :bug: (client, [smithy-rs#2926](https://github.com/smithy-lang/smithy-rs/issues/2926), [smithy-rs#2972](https://github.com/smithy-lang/smithy-rs/issues/2972)) Fix regression with redacting sensitive HTTP response bodies.\n- :bug: (all, [smithy-rs#2831](https://github.com/smithy-lang/smithy-rs/issues/2831), [aws-sdk-rust#818](https://github.com/awslabs/aws-sdk-rust/issues/818)) Omit fractional seconds from `http-date` format.\n- :bug: (client, [smithy-rs#2985](https://github.com/smithy-lang/smithy-rs/issues/2985)) Source defaults from the default trait instead of implicitly based on type. This has minimal changes in the generated code.\n- (client, [smithy-rs#2996](https://github.com/smithy-lang/smithy-rs/issues/2996)) Produce better docs when items are marked @required\n- :bug: (client, [smithy-rs#3034](https://github.com/smithy-lang/smithy-rs/issues/3034), [smithy-rs#3087](https://github.com/smithy-lang/smithy-rs/issues/3087)) Enable custom auth schemes to work by changing the code generated auth options to be set at the client level at `DEFAULTS` priority.\n\n\nAugust 22nd, 2023\n=================\n**Breaking Changes:**\n- :bug::warning: (client, [smithy-rs#2931](https://github.com/smithy-lang/smithy-rs/issues/2931), [aws-sdk-rust#875](https://github.com/awslabs/aws-sdk-rust/issues/875)) Fixed re-exported `SdkError` type. The previous release had the wrong type for `SdkError` when generating code for orchestrator mode, which caused projects to fail to compile when upgrading.\n\n**New this release:**\n- (client, [smithy-rs#2904](https://github.com/smithy-lang/smithy-rs/issues/2904)) `RuntimeComponents` and `RuntimeComponentsBuilder` are now re-exported in generated clients so that implementing a custom interceptor or runtime plugin doens't require directly depending on `aws-smithy-runtime-api`.\n- :bug: (client, [smithy-rs#2914](https://github.com/smithy-lang/smithy-rs/issues/2914), [aws-sdk-rust#825](https://github.com/awslabs/aws-sdk-rust/issues/825)) Fix incorrect summary docs for builders\n- :bug: (client, [smithy-rs#2934](https://github.com/smithy-lang/smithy-rs/issues/2934), [aws-sdk-rust#872](https://github.com/awslabs/aws-sdk-rust/issues/872)) Logging via `#[instrument]` in the `aws_smithy_runtime::client::orchestrator` module is now emitted at the `DEBUG` level to reduce the amount of logging when emitted at the `INFO` level.\n- :bug: (client, [smithy-rs#2935](https://github.com/smithy-lang/smithy-rs/issues/2935)) Fix `SDK::Endpoint` built-in for `@endpointRuleSet`.\n\n\nAugust 1st, 2023\n================\n**Breaking Changes:**\n- ⚠🎉 (server, [smithy-rs#2740](https://github.com/smithy-lang/smithy-rs/issues/2740), [smithy-rs#2759](https://github.com/smithy-lang/smithy-rs/issues/2759), [smithy-rs#2779](https://github.com/smithy-lang/smithy-rs/issues/2779), [smithy-rs#2827](https://github.com/smithy-lang/smithy-rs/issues/2827), @hlbarber) The middleware system has been reworked as we push for a unified, simple, and consistent API. The following changes have been made in service of this goal:\n\n    - A `ServiceShape` trait has been added.\n    - The `Plugin` trait has been simplified.\n    - The `HttpMarker` and `ModelMarker` marker traits have been added to better distinguish when plugins run and what they have access to.\n    - The `Operation` structure has been removed.\n    - A `Scoped` `Plugin` has been added.\n\n    The `Plugin` trait has now been simplified and the `Operation` struct has been removed.\n\n    ## Addition of `ServiceShape`\n\n    Since the [0.52 release](https://github.com/smithy-lang/smithy-rs/releases/tag/release-2022-12-12) the `OperationShape` has existed.\n\n    ```rust\n    /// Models the [Smithy Operation shape].\n    ///\n    /// [Smithy Operation shape]: https://awslabs.github.io/smithy/1.0/spec/core/model.html#operation\n    pub trait OperationShape {\n        /// The ID of the operation.\n        const ID: ShapeId;\n\n        /// The operation input.\n        type Input;\n        /// The operation output.\n        type Output;\n        /// The operation error. [`Infallible`](std::convert::Infallible) in the case where no error\n        /// exists.\n        type Error;\n    }\n    ```\n\n    This allowed `Plugin` authors to access these associated types and constants. See the [`PrintPlugin`](https://github.com/smithy-lang/smithy-rs/blob/main/examples/pokemon-service/src/plugin.rs) as an example.\n\n    We continue with this approach and introduce the following trait:\n\n    ```rust\n    /// Models the [Smithy Service shape].\n    ///\n    /// [Smithy Service shape]: https://smithy.io/2.0/spec/service-types.html\n    pub trait ServiceShape {\n        /// The [`ShapeId`] of the service.\n        const ID: ShapeId;\n\n        /// The version of the service.\n        const VERSION: Option<&'static str>;\n\n        /// The [Protocol] applied to this service.\n        ///\n        /// [Protocol]: https://smithy.io/2.0/spec/protocol-traits.html\n        type Protocol;\n\n        /// An enumeration of all operations contained in this service.\n        type Operations;\n    }\n    ```\n\n    With the changes to `Plugin`, described below, middleware authors now have access to this information at compile time.\n\n    ## Simplication of the `Plugin` trait\n\n    Previously,\n\n    ```rust\n    trait Plugin<P, Op, S, L> {\n        type Service;\n        type Layer;\n\n        fn map(&self, input: Operation<S, L>) -> Operation<Self::Service, Self::Layer>;\n    }\n    ```\n\n    modified an `Operation`.\n\n    Now,\n\n    ```rust\n    trait Plugin<Service, Operation, T> {\n        type Output;\n\n        fn apply(&self, input: T) -> Self::Output;\n    }\n    ```\n\n    maps a `tower::Service` to a `tower::Service`. This is equivalent to `tower::Layer` with two extra type parameters: `Service` and `Operation`, which implement `ServiceShape` and `OperationShape` respectively.\n\n    Having both `Service` and `Operation` as type parameters also provides an even surface for advanced users to extend the codegenerator in a structured way. See [this issue](https://github.com/smithy-lang/smithy-rs/issues/2777) for more context.\n\n    The following middleware setup\n\n    ```rust\n    pub struct PrintService<S> {\n        inner: S,\n        name: &'static str,\n    }\n\n    impl<R, S> Service<R> for PrintService<S>\n    where\n        S: Service<R>,\n    {\n        async fn call(&mut self, req: R) -> Self::Future {\n            println!(\"Hi {}\", self.name);\n            self.inner.call(req)\n        }\n    }\n\n    pub struct PrintLayer {\n        name: &'static str,\n    }\n\n    impl<S> Layer<S> for PrintLayer {\n        type Service = PrintService<S>;\n\n        fn layer(&self, service: S) -> Self::Service {\n            PrintService {\n                inner: service,\n                name: self.name,\n            }\n        }\n    }\n\n    pub struct PrintPlugin;\n\n    impl<P, Op, S, L> Plugin<P, Op, S, L> for PrintPlugin\n    where\n        Op: OperationShape,\n    {\n        type Service = S;\n        type Layer = Stack<L, PrintLayer>;\n\n        fn map(&self, input: Operation<S, L>) -> Operation<Self::Service, Self::Layer> {\n            input.layer(PrintLayer { name: Op::NAME })\n        }\n    }\n    ```\n\n    now becomes\n\n    ```rust\n    pub struct PrintService<S> {\n        inner: S,\n        name: &'static str,\n    }\n\n    impl<R, S> Service<R> for PrintService<S>\n    where\n        S: Service<R>,\n    {\n        async fn call(&mut self, req: R) -> Self::Future {\n            println!(\"Hi {}\", self.name);\n            self.inner.call(req)\n        }\n    }\n\n    pub struct PrintPlugin;\n\n    impl<Service, Op, T> Plugin<Service, Operation, T> for PrintPlugin\n    where\n        Op: OperationShape,\n    {\n        type Output = PrintService<S>;\n\n        fn apply(&self, inner: T) -> Self::Output {\n            PrintService { inner, name: Op::ID.name() }\n        }\n    }\n\n    impl HttpMarker for PrintPlugin { }\n    ```\n\n    Alternatively, using the new `ServiceShape`, implemented on `Ser`:\n\n    ```rust\n    impl<Service, Operation, T> Plugin<Service, Operation, T> for PrintPlugin\n    where\n        Ser: ServiceShape,\n    {\n        type Service = PrintService<S>;\n\n        fn apply(&self, inner: T) -> Self::Service {\n            PrintService { inner, name: Ser::ID.name() }\n        }\n    }\n    ```\n\n    A single `Plugin` can no longer apply a `tower::Layer` on HTTP requests/responses _and_ modelled structures at the same time (see middleware positions [C](https://smithy-lang.github.io/smithy-rs/design/server/middleware.html#c-operation-specific-http-middleware) and [D](https://smithy-lang.github.io/smithy-rs/design/server/middleware.html#d-operation-specific-model-middleware). Instead one `Plugin` must be specified for each and passed to the service builder constructor separately:\n\n    ```rust\n    let app = PokemonService::builder_with_plugins(/* HTTP plugins */, /* model plugins */)\n        /* setters */\n        .build()\n        .unwrap();\n    ```\n\n    To better distinguish when a plugin runs and what it has access to, `Plugin`s now have to additionally implement the `HttpMarker` marker trait, the `ModelMarker` marker trait, or both:\n\n    - A HTTP plugin acts on the HTTP request before it is deserialized, and acts on the HTTP response after it is serialized.\n    - A model plugin acts on the modeled operation input after it is deserialized, and acts on the modeled operation output or the modeled operation error before it is serialized.\n\n    The motivation behind this change is to simplify the job of middleware authors, separate concerns, accomodate common cases better, and to improve composition internally.\n\n    Because `Plugin` is now closer to `tower::Layer` we have two canonical converters:\n\n    ```rust\n    use aws_smithy_http_server::plugin::{PluginLayer, LayerPlugin};\n\n    // Convert from `Layer` to `Plugin` which applies uniformly across all operations\n    let layer = /* some layer */;\n    let plugin = PluginLayer(layer);\n\n    // Convert from `Plugin` to `Layer` for some fixed protocol and operation\n    let plugin = /* some plugin */;\n    let layer = LayerPlugin::new::<SomeProtocol, SomeOperation>(plugin);\n    ```\n\n    ## Removal of `PluginPipeline`\n\n    Since plugins now come in two flavors (those marked with `HttpMarker` and those marked with `ModelMarker`) that shouldn't be mixed in a collection of plugins, the primary way of concatenating plugins, `PluginPipeline` has been removed in favor of the `HttpPlugins` and `ModelPlugins` types, which eagerly check that whenever a plugin is pushed, it is of the expected type.\n\n    This worked before, but you wouldn't be able to do apply this collection of plugins anywhere; if you tried to, the compilation error messages would not be very helpful:\n\n    ```rust\n    use aws_smithy_http_server::plugin::PluginPipeline;\n\n    let pipeline = PluginPipeline::new().push(http_plugin).push(model_plugin);\n    ```\n\n    Now collections of plugins must contain plugins of the same flavor:\n\n    ```rust\n    use aws_smithy_http_server::plugin::{HttpPlugins, ModelPlugins};\n\n    let http_plugins = HttpPlugins::new()\n        .push(http_plugin)\n        // .push(model_plugin) // This fails to compile with a helpful error message.\n        .push(&http_and_model_plugin);\n    let model_plugins = ModelPlugins::new()\n        .push(model_plugin)\n        .push(&http_and_model_plugin);\n    ```\n\n    In the above example, `&http_and_model_plugin` implements both `HttpMarker` and `ModelMarker`, so we can add it to both collections.\n\n    ## Removal of `Operation`\n\n    The `aws_smithy_http_server::operation::Operation` structure has now been removed. Previously, there existed a `{operation_name}_operation` setter on the service builder, which accepted an `Operation`. This allowed users to\n\n    ```rust\n    let operation /* : Operation<_, _> */ = GetPokemonSpecies::from_service(/* tower::Service */);\n\n    let app = PokemonService::builder_without_plugins()\n        .get_pokemon_species_operation(operation)\n        /* other setters */\n        .build()\n        .unwrap();\n    ```\n\n    to set an operation with a `tower::Service`, and\n\n    ```rust\n    let operation /* : Operation<_, _> */ = GetPokemonSpecies::from_service(/* tower::Service */).layer(/* layer */);\n    let operation /* : Operation<_, _> */ = GetPokemonSpecies::from_handler(/* closure */).layer(/* layer */);\n\n    let app = PokemonService::builder_without_plugins()\n        .get_pokemon_species_operation(operation)\n        /* other setters */\n        .build()\n        .unwrap();\n    ```\n\n    to add a `tower::Layer` (acting on HTTP requests/responses post-routing) to a single operation.\n\n    We have seen little adoption of this API and for this reason we have opted instead to introduce a new setter, accepting a `tower::Service`, on the service builder:\n\n    ```rust\n    let app = PokemonService::builder_without_plugins()\n        .get_pokemon_species_service(/* tower::Service */)\n        /* other setters */\n        .build()\n        .unwrap();\n    ```\n\n    Applying a `tower::Layer` to a _subset_ of operations is should now be done through the `Plugin` API via `filter_by_operation_id`\n\n    ```rust\n    use aws_smithy_http_server::plugin::{PluginLayer, filter_by_operation_name, IdentityPlugin};\n\n    let plugin = PluginLayer(/* layer */);\n    let scoped_plugin = filter_by_operation_name(plugin, |id| id == GetPokemonSpecies::ID);\n\n    let app = PokemonService::builder_with_plugins(scoped_plugin, IdentityPlugin)\n        .get_pokemon_species(/* handler */)\n        /* other setters */\n        .build()\n        .unwrap();\n    ```\n\n    or the new `Scoped` `Plugin` introduced below.\n\n    # Addition of `Scoped`\n\n    Currently, users can selectively apply a `Plugin` via the `filter_by_operation_id` function\n\n    ```rust\n    use aws_smithy_http_server::plugin::filter_by_operation_id;\n    // Only apply `plugin` to `CheckHealth` and `GetStorage` operation\n    let filtered_plugin = filter_by_operation_id(plugin, |name| name == CheckHealth::ID || name == GetStorage::ID);\n    ```\n\n    In addition to this, we now provide `Scoped`, which selectively applies a `Plugin` at _compiletime_. Users should prefer this to `filter_by_operation_id` when applicable.\n\n    ```rust\n    use aws_smithy_http_server::plugin::Scoped;\n    use pokemon_service_server_sdk::scoped;\n\n    scope! {\n        /// Includes only the `CheckHealth` and `GetStorage` operation.\n        struct SomeScope {\n            includes: [CheckHealth, GetStorage]\n        }\n    }\n    let scoped_plugin = Scoped::new::<SomeScope>(plugin);\n    ```\n\n- ⚠ (all, [smithy-rs#2675](https://github.com/smithy-lang/smithy-rs/issues/2675)) Remove native-tls and add a migration guide.\n- ⚠ (client, [smithy-rs#2671](https://github.com/smithy-lang/smithy-rs/issues/2671)) <details>\n    <summary>Breaking change in how event stream signing works (click to expand more details)</summary>\n\n    This change will only impact you if you are wiring up their own event stream signing/authentication scheme. If you're using `aws-sig-auth` to use AWS SigV4 event stream signing, then this change will **not** impact you.\n\n    Previously, event stream signing was configured at codegen time by placing a `new_event_stream_signer` method on the `Config`. This function was called at serialization time to connect the signer to the streaming body. Now, instead, a special `DeferredSigner` is wired up at serialization time that relies on a signing implementation to be sent on a channel by the HTTP request signer. To do this, a `DeferredSignerSender` must be pulled out of the property bag, and its `send()` method called with the desired event stream signing implementation.\n\n    See the changes in https://github.com/smithy-lang/smithy-rs/pull/2671 for an example of how this was done for SigV4.\n    </details>\n- ⚠ (all, [smithy-rs#2673](https://github.com/smithy-lang/smithy-rs/issues/2673)) For event stream operations, the `EventStreamSender` in inputs/outputs now requires the passed in `Stream` impl to implement `Sync`.\n- ⚠ (server, [smithy-rs#2539](https://github.com/smithy-lang/smithy-rs/issues/2539)) Code generation will abort if the `ignoreUnsupportedConstraints` codegen flag has no effect, that is, if all constraint traits used in your model are well-supported. Please remove the flag in such case.\n- ⚠ (client, [smithy-rs#2728](https://github.com/smithy-lang/smithy-rs/issues/2728), [smithy-rs#2262](https://github.com/smithy-lang/smithy-rs/issues/2262), [aws-sdk-rust#2087](https://github.com/awslabs/aws-sdk-rust/issues/2087)) The property bag type for Time is now `SharedTimeSource`, not `SystemTime`. If your code relies on setting request time, use `aws_smithy_async::time::SharedTimeSource`.\n- ⚠ (server, [smithy-rs#2676](https://github.com/smithy-lang/smithy-rs/issues/2676), [smithy-rs#2685](https://github.com/smithy-lang/smithy-rs/issues/2685)) Bump dependency on `lambda_http` by `aws-smithy-http-server` to 0.8.0. This version of `aws-smithy-http-server` is only guaranteed to be compatible with 0.8.0, or semver-compatible versions of 0.8.0 of the `lambda_http` crate. It will not work with versions prior to 0.8.0 _at runtime_, making requests to your smithy-rs service unroutable, so please make sure you're running your service in a compatible configuration\n- ⚠ (server, [smithy-rs#2457](https://github.com/smithy-lang/smithy-rs/issues/2457), @hlbarber) Remove `PollError` from an operations `Service::Error`.\n\n    Any [`tower::Service`](https://docs.rs/tower/latest/tower/trait.Service.html) provided to\n    [`Operation::from_service`](https://docs.rs/aws-smithy-http-server/latest/aws_smithy_http_server/operation/struct.Operation.html#method.from_service)\n    no longer requires `Service::Error = OperationError<Op::Error, PollError>`, instead requiring just `Service::Error = Op::Error`.\n- ⚠ (client, [smithy-rs#2742](https://github.com/smithy-lang/smithy-rs/issues/2742)) A newtype wrapper `SharedAsyncSleep` has been introduced and occurrences of `Arc<dyn AsyncSleep>` that appear in public APIs have been replaced with it.\n- ⚠ (all, [smithy-rs#2893](https://github.com/smithy-lang/smithy-rs/issues/2893)) Update MSRV to Rust 1.69.0\n- ⚠ (server, [smithy-rs#2678](https://github.com/smithy-lang/smithy-rs/issues/2678)) `ShapeId` is the new structure used to represent a shape, with its absolute name, namespace and name.\n    `OperationExtension`'s members are replaced by the `ShapeId` and operations' names are now replced by a `ShapeId`.\n\n    Before you had an operation and an absolute name as its `NAME` member. You could apply a plugin only to some selected operation:\n\n    ```\n    filter_by_operation_name(plugin, |name| name != Op::ID);\n    ```\n\n    Your new filter selects on an operation's absolute name, namespace or name.\n\n    ```\n    filter_by_operation_id(plugin, |id| id.name() != Op::ID.name());\n    ```\n\n    The above filter is applied to an operation's name, the one you use to specify the operation in the Smithy model.\n\n    You can filter all operations in a namespace or absolute name:\n\n    ```\n    filter_by_operation_id(plugin, |id| id.namespace() != \"namespace\");\n    filter_by_operation_id(plugin, |id| id.absolute() != \"namespace#name\");\n    ```\n- ⚠ (client, [smithy-rs#2758](https://github.com/smithy-lang/smithy-rs/issues/2758)) The occurrences of `Arc<dyn ResolveEndpoint>` have now been replaced with `SharedEndpointResolver` in public APIs.\n- ⚠ (server, [smithy-rs#2740](https://github.com/smithy-lang/smithy-rs/issues/2740), [smithy-rs#2759](https://github.com/smithy-lang/smithy-rs/issues/2759), [smithy-rs#2779](https://github.com/smithy-lang/smithy-rs/issues/2779), @hlbarber) Remove `filter_by_operation_id` and `plugin_from_operation_id_fn` in favour of `filter_by_operation` and `plugin_from_operation_fn`.\n\n    Previously, we provided `filter_by_operation_id` which filtered `Plugin` application via a predicate over the Shape ID.\n\n    ```rust\n    use aws_smithy_http_server::plugin::filter_by_operation_id;\n    use pokemon_service_server_sdk::operation_shape::CheckHealth;\n\n    let filtered = filter_by_operation_id(plugin, |name| name != CheckHealth::NAME);\n    ```\n\n    This had the problem that the user is unable to exhaustively match over a `&'static str`. To remedy this we have switched to `filter_by_operation` which is a predicate over an enum containing all operations contained in the service.\n\n    ```rust\n    use aws_smithy_http_server::plugin::filter_by_operation_id;\n    use pokemon_service_server_sdk::service::Operation;\n\n    let filtered = filter_by_operation(plugin, |op: Operation| op != Operation::CheckHealth);\n    ```\n\n    Similarly, `plugin_from_operation_fn` now allows for\n\n    ```rust\n    use aws_smithy_http_server::plugin::plugin_from_operation_fn;\n    use pokemon_service_server_sdk::service::Operation;\n\n    fn map<S>(op: Operation, inner: S) -> PrintService<S> {\n        match op {\n            Operation::CheckHealth => PrintService { name: op.shape_id().name(), inner },\n            Operation::GetPokemonSpecies => PrintService { name: \"hello world\", inner },\n            _ => todo!()\n        }\n    }\n\n    let plugin = plugin_from_operation_fn(map);\n    ```\n- ⚠ (client, [smithy-rs#2783](https://github.com/smithy-lang/smithy-rs/issues/2783)) The naming `make_token` for fields and the API of `IdempotencyTokenProvider` in service configs and their builders has now been updated to `idempotency_token_provider`.\n- ⚠ (client, [smithy-rs#2845](https://github.com/smithy-lang/smithy-rs/issues/2845)) `aws_smithy_async::future::rendezvous::Sender::send` no longer exposes `tokio::sync::mpsc::error::SendError` for the error of its return type and instead exposes a new-type wrapper called `aws_smithy_async::future::rendezvous::error::SendError`. In addition, the `aws_smithy_xml` crate no longer exposes types from `xmlparser`.\n- ⚠ (client, [smithy-rs#2848](https://github.com/smithy-lang/smithy-rs/issues/2848)) The implementation `From<bytes_utils::segmented::SegmentedBuf>` for `aws_smithy_http::event_stream::RawMessage` has been removed.\n- ⚠ (server, [smithy-rs#2865](https://github.com/smithy-lang/smithy-rs/issues/2865)) The `alb_health_check` module has been moved out of the `plugin` module into a new `layer` module. ALB health checks should be enacted before routing, and plugins run after routing, so the module location was misleading. Examples have been corrected to reflect the intended application of the layer.\n- ⚠ (client, [smithy-rs#2873](https://github.com/smithy-lang/smithy-rs/issues/2873)) The `test-util` feature in aws-smithy-client has been split to include a separate `wiremock` feature. This allows test-util to be used without a Hyper server dependency making it usable in webassembly targets.\n- ⚠ (client) The entire architecture of generated clients has been overhauled. See the [upgrade guide](https://github.com/smithy-lang/smithy-rs/discussions/2887) to get your code working again.\n\n**New this release:**\n- 🎉 (all, [smithy-rs#2647](https://github.com/smithy-lang/smithy-rs/issues/2647), [smithy-rs#2645](https://github.com/smithy-lang/smithy-rs/issues/2645), [smithy-rs#2646](https://github.com/smithy-lang/smithy-rs/issues/2646), [smithy-rs#2616](https://github.com/smithy-lang/smithy-rs/issues/2616), @thomas-k-cameron) Implement unstable serde support for the `Number`, `Blob`, `Document`, `DateTime` primitives\n- 🎉 (client, [smithy-rs#2652](https://github.com/smithy-lang/smithy-rs/issues/2652), @thomas-k-cameron) Add a `send_with` function on `-Input` types for sending requests without fluent builders\n- (client, [smithy-rs#2791](https://github.com/smithy-lang/smithy-rs/issues/2791), @davidsouther) Add accessors to Builders\n- (all, [smithy-rs#2786](https://github.com/smithy-lang/smithy-rs/issues/2786), @yotamofek) Avoid intermediate vec allocations in AggregatedBytes::to_vec.\n- 🐛 (server, [smithy-rs#2733](https://github.com/smithy-lang/smithy-rs/issues/2733), @thor-bjorgvinsson) Fix bug in AWS JSON 1.x routers where, if a service had more than 14 operations, the router was created without the route for the 15th operation.\n- (client, [smithy-rs#2728](https://github.com/smithy-lang/smithy-rs/issues/2728), [smithy-rs#2262](https://github.com/smithy-lang/smithy-rs/issues/2262), [aws-sdk-rust#2087](https://github.com/awslabs/aws-sdk-rust/issues/2087)) Time is now controlled by the `TimeSource` trait. This facilitates testing as well as use cases like WASM where `SystemTime::now()` is not supported.\n- 🐛 (client, [smithy-rs#2767](https://github.com/smithy-lang/smithy-rs/issues/2767), @mcmasn-amzn) Fix bug in client generation when using smithy.rules#endpointTests and operation and service shapes are in different namespaces.\n- (client, [smithy-rs#2854](https://github.com/smithy-lang/smithy-rs/issues/2854)) Public fields in structs are no longer marked as `#[doc(hidden)]`, and they are now visible.\n- (server, [smithy-rs#2866](https://github.com/smithy-lang/smithy-rs/issues/2866)) [RestJson1](https://awslabs.github.io/smithy/2.0/aws/protocols/aws-restjson1-protocol.html#operation-error-serialization) server SDKs now serialize only the [shape name](https://smithy.io/2.0/spec/model.html#shape-id) in operation error responses. Previously (from versions 0.52.0 to 0.55.4), the full shape ID was rendered.\n    Example server error response by a smithy-rs server version 0.52.0 until 0.55.4:\n    ```\n    HTTP/1.1 400 Bad Request\n    content-type: application/json\n    x-amzn-errortype: com.example.service#InvalidRequestException\n    ...\n    ```\n    Example server error response now:\n    ```\n    HTTP/1.1 400 Bad Request\n    content-type: application/json\n    x-amzn-errortype: InvalidRequestException\n    ...\n    ```\n\n**Contributors**\nThank you for your contributions! ❤\n- @davidsouther ([smithy-rs#2791](https://github.com/smithy-lang/smithy-rs/issues/2791))\n- @hlbarber ([smithy-rs#2457](https://github.com/smithy-lang/smithy-rs/issues/2457), [smithy-rs#2740](https://github.com/smithy-lang/smithy-rs/issues/2740), [smithy-rs#2759](https://github.com/smithy-lang/smithy-rs/issues/2759), [smithy-rs#2779](https://github.com/smithy-lang/smithy-rs/issues/2779), [smithy-rs#2827](https://github.com/smithy-lang/smithy-rs/issues/2827))\n- @mcmasn-amzn ([smithy-rs#2767](https://github.com/smithy-lang/smithy-rs/issues/2767))\n- @thomas-k-cameron ([smithy-rs#2616](https://github.com/smithy-lang/smithy-rs/issues/2616), [smithy-rs#2645](https://github.com/smithy-lang/smithy-rs/issues/2645), [smithy-rs#2646](https://github.com/smithy-lang/smithy-rs/issues/2646), [smithy-rs#2647](https://github.com/smithy-lang/smithy-rs/issues/2647), [smithy-rs#2652](https://github.com/smithy-lang/smithy-rs/issues/2652))\n- @thor-bjorgvinsson ([smithy-rs#2733](https://github.com/smithy-lang/smithy-rs/issues/2733))\n- @yotamofek ([smithy-rs#2786](https://github.com/smithy-lang/smithy-rs/issues/2786))\n\n\nMay 23rd, 2023\n==============\n**New this release:**\n- (all, [smithy-rs#2612](https://github.com/smithy-lang/smithy-rs/issues/2612)) The `Debug` implementation for `PropertyBag` now prints a list of the types it contains. This significantly improves debuggability.\n- (all, [smithy-rs#2653](https://github.com/smithy-lang/smithy-rs/issues/2653), [smithy-rs#2656](https://github.com/smithy-lang/smithy-rs/issues/2656), @henriiik) Implement `Ord` and `PartialOrd` for `DateTime`.\n- 🐛 (client, [smithy-rs#2696](https://github.com/smithy-lang/smithy-rs/issues/2696)) Fix compiler errors in generated code when naming shapes after types in the Rust standard library prelude.\n\n**Contributors**\nThank you for your contributions! ❤\n- @henriiik ([smithy-rs#2653](https://github.com/smithy-lang/smithy-rs/issues/2653), [smithy-rs#2656](https://github.com/smithy-lang/smithy-rs/issues/2656))\n\n\nApril 26th, 2023\n================\n**Breaking Changes:**\n- ⚠ (all, [smithy-rs#2611](https://github.com/smithy-lang/smithy-rs/issues/2611)) Update MSRV to Rust 1.67.1\n\n**New this release:**\n- 🎉 (server, [smithy-rs#2540](https://github.com/smithy-lang/smithy-rs/issues/2540)) Implement layer for servers to handle [ALB health checks](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/target-group-health-checks.html).\n    Take a look at `aws_smithy_http_server::plugin::alb_health_check` to learn about it.\n- 🎉 (client, [smithy-rs#2254](https://github.com/smithy-lang/smithy-rs/issues/2254), @eduardomourar) Clients now compile for the `wasm32-unknown-unknown` and `wasm32-wasi` targets when no default features are enabled. WebAssembly is not officially supported yet, but this is a great first step towards it!\n- (server, [smithy-rs#2540](https://github.com/smithy-lang/smithy-rs/issues/2540)) Implement `PluginPipeline::http_layer` which allows you to apply a `tower::Layer` to all operations.\n- (client, [aws-sdk-rust#784](https://github.com/awslabs/aws-sdk-rust/issues/784), @abusch) Implement std::error::Error#source() properly for the service meta Error enum.\n- 🐛 (all, [smithy-rs#2496](https://github.com/smithy-lang/smithy-rs/issues/2496)) The outputs for event stream operations now implement the `Sync` auto-trait.\n- 🐛 (all, [smithy-rs#2495](https://github.com/smithy-lang/smithy-rs/issues/2495)) Streaming operations now emit the request ID at the `debug` log level like their non-streaming counterparts.\n- 🐛 (client, [smithy-rs#2495](https://github.com/smithy-lang/smithy-rs/issues/2495)) Streaming operations now emit the request ID at the `debug` log level like their non-streaming counterparts.\n- (client, [smithy-rs#2507](https://github.com/smithy-lang/smithy-rs/issues/2507)) The `enableNewCrateOrganizationScheme` codegen flag has been removed. If you opted out of the new crate organization scheme, it must be adopted now in order to upgrade (see [the upgrade guidance](https://github.com/smithy-lang/smithy-rs/discussions/2449) from March 23rd's release).\n- (client, [smithy-rs#2534](https://github.com/smithy-lang/smithy-rs/issues/2534)) `aws_smithy_types::date_time::Format` has been re-exported in service client crates.\n- 🐛 (server, [smithy-rs#2582](https://github.com/smithy-lang/smithy-rs/issues/2582), [smithy-rs#2585](https://github.com/smithy-lang/smithy-rs/issues/2585)) Fix generation of constrained shapes reaching `@sensitive` shapes\n- 🐛 (server, [smithy-rs#2583](https://github.com/smithy-lang/smithy-rs/issues/2583), [smithy-rs#2584](https://github.com/smithy-lang/smithy-rs/issues/2584)) Fix server code generation bug affecting constrained shapes bound with `@httpPayload`\n- (client, [smithy-rs#2603](https://github.com/smithy-lang/smithy-rs/issues/2603)) Add a sensitive method to `ParseHttpResponse`. When this returns true, logging of the HTTP response body will be suppressed.\n\n**Contributors**\nThank you for your contributions! ❤\n- @abusch ([aws-sdk-rust#784](https://github.com/awslabs/aws-sdk-rust/issues/784))\n- @eduardomourar ([smithy-rs#2254](https://github.com/smithy-lang/smithy-rs/issues/2254))\n\n\nApril 11th, 2023\n================\n\n\nMarch 23rd, 2023\n================\n**Breaking Changes:**\n- ⚠🎉 (all, [smithy-rs#2467](https://github.com/smithy-lang/smithy-rs/issues/2467)) Update MSRV to 1.66.1\n- ⚠ (client, [smithy-rs#76](https://github.com/smithy-lang/smithy-rs/issues/76), [smithy-rs#2129](https://github.com/smithy-lang/smithy-rs/issues/2129)) Generic clients no longer expose a `request_id()` function on errors. To get request ID functionality, use the SDK code generator.\n- ⚠ (client, [smithy-rs#76](https://github.com/smithy-lang/smithy-rs/issues/76), [smithy-rs#2129](https://github.com/smithy-lang/smithy-rs/issues/2129)) The `message()` and `code()` methods on errors have been moved into `ProvideErrorMetadata` trait. This trait will need to be imported to continue calling these.\n- ⚠ (client, [smithy-rs#76](https://github.com/smithy-lang/smithy-rs/issues/76), [smithy-rs#2129](https://github.com/smithy-lang/smithy-rs/issues/2129), [smithy-rs#2075](https://github.com/smithy-lang/smithy-rs/issues/2075)) The `*Error` and `*ErrorKind` types have been combined to make error matching simpler.\n    <details>\n    <summary>Example with S3</summary>\n    **Before:**\n    ```rust\n    let result = client\n        .get_object()\n        .bucket(BUCKET_NAME)\n        .key(\"some-key\")\n        .send()\n        .await;\n    match result {\n        Ok(_output) => { /* Do something with the output */ }\n        Err(err) => match err.into_service_error() {\n            GetObjectError { kind, .. } => match kind {\n                GetObjectErrorKind::InvalidObjectState(value) => println!(\"invalid object state: {:?}\", value),\n                GetObjectErrorKind::NoSuchKey(_) => println!(\"object didn't exist\"),\n            }\n            err @ GetObjectError { .. } if err.code() == Some(\"SomeUnmodeledError\") => {}\n            err @ _ => return Err(err.into()),\n        },\n    }\n    ```\n    **After:**\n    ```rust\n    // Needed to access the `.code()` function on the error type:\n    use aws_sdk_s3::types::ProvideErrorMetadata;\n    let result = client\n        .get_object()\n        .bucket(BUCKET_NAME)\n        .key(\"some-key\")\n        .send()\n        .await;\n    match result {\n        Ok(_output) => { /* Do something with the output */ }\n        Err(err) => match err.into_service_error() {\n            GetObjectError::InvalidObjectState(value) => {\n                println!(\"invalid object state: {:?}\", value);\n            }\n            GetObjectError::NoSuchKey(_) => {\n                println!(\"object didn't exist\");\n            }\n            err if err.code() == Some(\"SomeUnmodeledError\") => {}\n            err @ _ => return Err(err.into()),\n        },\n    }\n    ```\n    </details>\n- ⚠ (client, [smithy-rs#76](https://github.com/smithy-lang/smithy-rs/issues/76), [smithy-rs#2129](https://github.com/smithy-lang/smithy-rs/issues/2129)) `aws_smithy_types::Error` has been renamed to `aws_smithy_types::error::ErrorMetadata`.\n- ⚠ (server, [smithy-rs#2436](https://github.com/smithy-lang/smithy-rs/issues/2436)) Remove unnecessary type parameter `B` from `Upgrade` service.\n- 🐛⚠ (server, [smithy-rs#2382](https://github.com/smithy-lang/smithy-rs/issues/2382)) Smithy members named `send` were previously renamed to `send_value` at codegen time. These will now be called `send` in the generated code.\n- ⚠ (client, [smithy-rs#2448](https://github.com/smithy-lang/smithy-rs/issues/2448)) The modules in generated client crates have been reorganized. See the [Client Crate Reorganization Upgrade Guidance](https://github.com/smithy-lang/smithy-rs/discussions/2449) to see how to fix your code after this change.\n- ⚠ (server, [smithy-rs#2438](https://github.com/smithy-lang/smithy-rs/issues/2438)) Servers can send the `ServerRequestId` in the response headers.\n    Servers need to create their service using the new layer builder `ServerRequestIdProviderLayer::new_with_response_header`:\n    ```\n    let app = app\n        .layer(&ServerRequestIdProviderLayer::new_with_response_header(HeaderName::from_static(\"x-request-id\")));\n    ```\n\n**New this release:**\n- 🐛🎉 (client, [aws-sdk-rust#740](https://github.com/awslabs/aws-sdk-rust/issues/740)) Fluent builder methods on the client are now marked as deprecated when the related operation is deprecated.\n- 🎉 (all, [smithy-rs#2398](https://github.com/smithy-lang/smithy-rs/issues/2398)) Add support for the `awsQueryCompatible` trait. This allows services to continue supporting a custom error code (via the `awsQueryError` trait) when the services migrate their protocol from `awsQuery` to `awsJson1_0` annotated with `awsQueryCompatible`.\n    <details>\n    <summary>Click to expand for more details...</summary>\n\n    After the migration, services will include an additional header `x-amzn-query-error` in their responses whose value is in the form of `<error code>;<error type>`. An example response looks something like\n    ```\n    HTTP/1.1 400\n    x-amzn-query-error: AWS.SimpleQueueService.NonExistentQueue;Sender\n    Date: Wed, 08 Sep 2021 23:46:52 GMT\n    Content-Type: application/x-amz-json-1.0\n    Content-Length: 163\n\n    {\n        \"__type\": \"com.amazonaws.sqs#QueueDoesNotExist\",\n        \"message\": \"some user-visible message\"\n    }\n    ```\n    `<error code>` is `AWS.SimpleQueueService.NonExistentQueue` and `<error type>` is `Sender`.\n\n    If an operation results in an error that causes a service to send back the response above, you can access `<error code>` and `<error type>` as follows:\n    ```rust\n    match client.some_operation().send().await {\n        Ok(_) => { /* success */ }\n        Err(sdk_err) => {\n            let err = sdk_err.into_service_error();\n            assert_eq!(\n                error.meta().code(),\n                Some(\"AWS.SimpleQueueService.NonExistentQueue\"),\n            );\n            assert_eq!(error.meta().extra(\"type\"), Some(\"Sender\"));\n        }\n    }\n    </details>\n    ```\n- 🎉 (client, [smithy-rs#2428](https://github.com/smithy-lang/smithy-rs/issues/2428), [smithy-rs#2208](https://github.com/smithy-lang/smithy-rs/issues/2208)) `SdkError` variants can now be constructed for easier unit testing.\n- 🐛 (server, [smithy-rs#2441](https://github.com/smithy-lang/smithy-rs/issues/2441)) Fix `FilterByOperationName` plugin. This previous caused services with this applied to fail to compile due to mismatched bounds.\n- (client, [smithy-rs#2437](https://github.com/smithy-lang/smithy-rs/issues/2437), [aws-sdk-rust#600](https://github.com/awslabs/aws-sdk-rust/issues/600)) Add more client re-exports. Specifically, it re-exports `aws_smithy_http::body::SdkBody`, `aws_smithy_http::byte_stream::error::Error`, and `aws_smithy_http::operation::{Request, Response}`.\n- 🐛 (all, [smithy-rs#2226](https://github.com/smithy-lang/smithy-rs/issues/2226)) Fix bug in timestamp format resolution. Prior to this fix, the timestamp format may have been incorrect if set on the target instead of on the member.\n- (all, [smithy-rs#2226](https://github.com/smithy-lang/smithy-rs/issues/2226)) Add support for offsets when parsing datetimes. RFC3339 date times now support offsets like `-0200`\n- (client, [aws-sdk-rust#160](https://github.com/awslabs/aws-sdk-rust/issues/160), [smithy-rs#2445](https://github.com/smithy-lang/smithy-rs/issues/2445)) Reconnect on transient errors.\n\n    Note: **this behavior is disabled by default for generic clients**. It can be enabled with\n    `aws_smithy_client::Builder::reconnect_on_transient_errors`\n\n    If a transient error (timeout, 500, 503, 503) is encountered, the connection will be evicted from the pool and will not\n    be reused.\n- (all, [smithy-rs#2474](https://github.com/smithy-lang/smithy-rs/issues/2474)) Increase Tokio version to 1.23.1 for all crates. This is to address [RUSTSEC-2023-0001](https://rustsec.org/advisories/RUSTSEC-2023-0001)\n\n\nJanuary 25th, 2023\n==================\n**New this release:**\n- 🐛 (server, [smithy-rs#920](https://github.com/smithy-lang/smithy-rs/issues/920)) Fix bug in `OperationExtensionFuture`s `Future::poll` implementation\n\n\nJanuary 24th, 2023\n==================\n**Breaking Changes:**\n- ⚠ (server, [smithy-rs#2161](https://github.com/smithy-lang/smithy-rs/issues/2161)) Remove deprecated service builder, this includes:\n\n    - Remove `aws_smithy_http_server::routing::Router` and `aws_smithy_http_server::request::RequestParts`.\n    - Move the `aws_smithy_http_server::routers::Router` trait and `aws_smithy_http_server::routing::RoutingService` into `aws_smithy_http_server::routing`.\n    - Remove the following from the generated SDK:\n        - `operation_registry.rs`\n        - `operation_handler.rs`\n        - `server_operation_handler_trait.rs`\n\n    If migration to the new service builder API has not already been completed a brief summary of required changes can be seen in [previous release notes](https://github.com/smithy-lang/smithy-rs/releases/tag/release-2022-12-12) and in API documentation of the root crate.\n\n**New this release:**\n- 🐛 (server, [smithy-rs#2213](https://github.com/smithy-lang/smithy-rs/issues/2213)) `@sparse` list shapes and map shapes with constraint traits and with constrained members are now supported\n- 🐛 (server, [smithy-rs#2200](https://github.com/smithy-lang/smithy-rs/pull/2200)) Event streams no longer generate empty error enums when their operations don’t have modeled errors\n- (all, [smithy-rs#2223](https://github.com/smithy-lang/smithy-rs/issues/2223)) `aws_smithy_types::date_time::DateTime`, `aws_smithy_types::Blob` now implement the `Eq` and `Hash` traits\n- (server, [smithy-rs#2223](https://github.com/smithy-lang/smithy-rs/issues/2223)) Code-generated types for server SDKs now implement the `Eq` and `Hash` traits when possible\n\n\nJanuary 12th, 2023\n==================\n**New this release:**\n- 🐛 (server, [smithy-rs#2201](https://github.com/smithy-lang/smithy-rs/issues/2201)) Fix severe bug where a router fails to deserialize percent-encoded query strings, reporting no operation match when there could be one. If your Smithy model uses an operation with a request URI spec containing [query string literals](https://smithy.io/2.0/spec/http-bindings.html#query-string-literals), you are affected. This fix was released in `aws-smithy-http-server` v0.53.1.\n\n\nJanuary 11th, 2023\n==================\n**Breaking Changes:**\n- ⚠ (client, [smithy-rs#2099](https://github.com/smithy-lang/smithy-rs/issues/2099)) The Rust client codegen plugin is now called `rust-client-codegen` instead of `rust-codegen`. Be sure to update your `smithy-build.json` files to refer to the correct plugin name.\n- ⚠ (client, [smithy-rs#2099](https://github.com/smithy-lang/smithy-rs/issues/2099)) Client codegen plugins need to define a service named `software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator` (this is the new file name for the plugin definition in `resources/META-INF/services`).\n- ⚠ (server, [smithy-rs#2099](https://github.com/smithy-lang/smithy-rs/issues/2099)) Server codegen plugins need to define a service named `software.amazon.smithy.rust.codegen.server.smithy.customize.ServerCodegenDecorator` (this is the new file name for the plugin definition in `resources/META-INF/services`).\n\n**New this release:**\n- 🐛 (server, [smithy-rs#2103](https://github.com/smithy-lang/smithy-rs/issues/2103)) In 0.52, `@length`-constrained collection shapes whose members are not constrained made the server code generator crash. This has been fixed.\n- (server, [smithy-rs#1879](https://github.com/smithy-lang/smithy-rs/issues/1879)) Servers support the `@default` trait: models can specify default values. Default values will be automatically supplied when not manually set.\n- (server, [smithy-rs#2131](https://github.com/smithy-lang/smithy-rs/issues/2131)) The constraint `@length` on non-streaming blob shapes is supported.\n- 🐛 (client, [smithy-rs#2150](https://github.com/smithy-lang/smithy-rs/issues/2150)) Fix bug where string default values were not supported for endpoint parameters\n- 🐛 (all, [smithy-rs#2170](https://github.com/smithy-lang/smithy-rs/issues/2170), [aws-sdk-rust#706](https://github.com/awslabs/aws-sdk-rust/issues/706)) Remove the webpki-roots feature from `hyper-rustls`\n- 🐛 (server, [smithy-rs#2054](https://github.com/smithy-lang/smithy-rs/issues/2054)) Servers can generate a unique request ID and use it in their handlers.\n\n\nDecember 12th, 2022\n===================\n**Breaking Changes:**\n- ⚠🎉 (all, [smithy-rs#1938](https://github.com/smithy-lang/smithy-rs/issues/1938), @jjantdev) Upgrade Rust MSRV to 1.62.1\n- ⚠🎉 (server, [smithy-rs#1199](https://github.com/smithy-lang/smithy-rs/issues/1199), [smithy-rs#1342](https://github.com/smithy-lang/smithy-rs/issues/1342), [smithy-rs#1401](https://github.com/smithy-lang/smithy-rs/issues/1401), [smithy-rs#1998](https://github.com/smithy-lang/smithy-rs/issues/1998), [smithy-rs#2005](https://github.com/smithy-lang/smithy-rs/issues/2005), [smithy-rs#2028](https://github.com/smithy-lang/smithy-rs/issues/2028), [smithy-rs#2034](https://github.com/smithy-lang/smithy-rs/issues/2034), [smithy-rs#2036](https://github.com/smithy-lang/smithy-rs/issues/2036)) [Constraint traits](https://awslabs.github.io/smithy/2.0/spec/constraint-traits.html) in server SDKs are beginning to be supported. The following are now supported:\n\n    * The `length` trait on `string` shapes.\n    * The `length` trait on `map` shapes.\n    * The `length` trait on `list` shapes.\n    * The `range` trait on `byte` shapes.\n    * The `range` trait on `short` shapes.\n    * The `range` trait on `integer` shapes.\n    * The `range` trait on `long` shapes.\n    * The `pattern` trait on `string` shapes.\n\n    Upon receiving a request that violates the modeled constraints, the server SDK will reject it with a message indicating why.\n\n    Unsupported (constraint trait, target shape) combinations will now fail at code generation time, whereas previously they were just ignored. This is a breaking change to raise awareness in service owners of their server SDKs behaving differently than what was modeled. To continue generating a server SDK with unsupported constraint traits, set `codegen.ignoreUnsupportedConstraints` to `true` in your `smithy-build.json`.\n\n    ```json\n    {\n        ...\n        \"rust-server-codegen\": {\n            ...\n            \"codegen\": {\n                \"ignoreUnsupportedConstraints\": true\n            }\n        }\n    }\n    ```\n- ⚠🎉 (server, [smithy-rs#1342](https://github.com/smithy-lang/smithy-rs/issues/1342), [smithy-rs#1119](https://github.com/smithy-lang/smithy-rs/issues/1119)) Server SDKs now generate \"constrained types\" for constrained shapes. Constrained types are [newtypes](https://rust-unofficial.github.io/patterns/patterns/behavioural/newtype.html) that encapsulate the modeled constraints. They constitute a [widespread pattern to guarantee domain invariants](https://www.lpalmieri.com/posts/2020-12-11-zero-to-production-6-domain-modelling/) and promote correctness in your business logic. So, for example, the model:\n\n    ```smithy\n    @length(min: 1, max: 69)\n    string NiceString\n    ```\n\n    will now render a `struct NiceString(String)`. Instantiating a `NiceString` is a fallible operation:\n\n    ```rust\n    let data: String = ... ;\n    let nice_string = NiceString::try_from(data).expect(\"data is not nice\");\n    ```\n\n    A failed attempt to instantiate a constrained type will yield a `ConstraintViolation` error type you may want to handle. This type's API is subject to change.\n\n    Constrained types _guarantee_, by virtue of the type system, that your service's operation outputs adhere to the modeled constraints. To learn more about the motivation for constrained types and how they work, see [the RFC](https://github.com/smithy-lang/smithy-rs/pull/1199).\n\n    If you'd like to opt-out of generating constrained types, you can set `codegen.publicConstrainedTypes` to `false`. Note that if you do, the generated server SDK will still honor your operation input's modeled constraints upon receiving a request, but will not help you in writing business logic code that adheres to the constraints, and _will not prevent you from returning responses containing operation outputs that violate said constraints_.\n\n    ```json\n    {\n        ...\n        \"rust-server-codegen\": {\n            ...\n            \"codegen\": {\n                \"publicConstrainedTypes\": false\n            }\n        }\n    }\n    ```\n- 🐛⚠🎉 (server, [smithy-rs#1714](https://github.com/smithy-lang/smithy-rs/issues/1714), [smithy-rs#1342](https://github.com/smithy-lang/smithy-rs/issues/1342)) Structure builders in server SDKs have undergone significant changes.\n\n    The API surface has been reduced. It is now simpler and closely follows what you would get when using the [`derive_builder`](https://docs.rs/derive_builder/latest/derive_builder/) crate:\n\n    1. Builders no longer have `set_*` methods taking in `Option<T>`. You must use the unprefixed method, named exactly after the structure's field name, and taking in a value _whose type matches exactly that of the structure's field_.\n    2. Builders no longer have convenience methods to pass in an element for a field whose type is a vector or a map. You must pass in the entire contents of the collection up front.\n    3. Builders no longer implement [`PartialEq`](https://doc.rust-lang.org/std/cmp/trait.PartialEq.html).\n\n    Bug fixes:\n\n    4. Builders now always fail to build if a value for a `required` member is not provided. Previously, builders were falling back to a default value (e.g. `\"\"` for `String`s) for some shapes. This was a bug.\n\n    Additions:\n\n    5. A structure `Structure` with builder `Builder` now implements `TryFrom<Builder> for Structure` or `From<Builder> for Structure`, depending on whether the structure [is constrained](https://awslabs.github.io/smithy/2.0/spec/constraint-traits.html) or not, respectively.\n\n    To illustrate how to migrate to the new API, consider the example model below.\n\n    ```smithy\n    structure Pokemon {\n        @required\n        name: String,\n        @required\n        description: String,\n        @required\n        evolvesTo: PokemonList\n    }\n\n    list PokemonList {\n        member: Pokemon\n    }\n    ```\n\n    In the Rust code below, note the references calling out the changes described in the numbered list above.\n\n    Before:\n\n    ```rust\n    let eevee_builder = Pokemon::builder()\n        // (1) `set_description` takes in `Some<String>`.\n        .set_description(Some(\"Su código genético es muy inestable. Puede evolucionar en diversas razas de Pokémon.\".to_owned()))\n        // (2) Convenience method to add one element to the `evolvesTo` list.\n        .evolves_to(vaporeon)\n        .evolves_to(jolteon)\n        .evolves_to(flareon);\n\n    // (3) Builder types can be compared.\n    assert_ne!(eevee_builder, Pokemon::builder());\n\n    // (4) Builds fine even though we didn't provide a value for `name`, which is `required`!\n    let _eevee = eevee_builder.build();\n    ```\n\n    After:\n\n    ```rust\n    let eevee_builder = Pokemon::builder()\n        // (1) `set_description` no longer exists. Use `description`, which directly takes in `String`.\n        .description(\"Su código genético es muy inestable. Puede evolucionar en diversas razas de Pokémon.\".to_owned())\n        // (2) Convenience methods removed; provide the entire collection up front.\n        .evolves_to(vec![vaporeon, jolteon, flareon]);\n\n    // (3) Binary operation `==` cannot be applied to `pokemon::Builder`.\n    // assert_ne!(eevee_builder, Pokemon::builder());\n\n    // (4) `required` member `name` was not set.\n    // (5) Builder type can be fallibly converted to the structure using `TryFrom` or `TryInto`.\n    let _error = Pokemon::try_from(eevee_builder).expect_err(\"name was not provided\");\n    ```\n- ⚠🎉 (server, [smithy-rs#1620](https://github.com/smithy-lang/smithy-rs/issues/1620), [smithy-rs#1666](https://github.com/smithy-lang/smithy-rs/issues/1666), [smithy-rs#1731](https://github.com/smithy-lang/smithy-rs/issues/1731), [smithy-rs#1736](https://github.com/smithy-lang/smithy-rs/issues/1736), [smithy-rs#1753](https://github.com/smithy-lang/smithy-rs/issues/1753), [smithy-rs#1738](https://github.com/smithy-lang/smithy-rs/issues/1738), [smithy-rs#1782](https://github.com/smithy-lang/smithy-rs/issues/1782), [smithy-rs#1829](https://github.com/smithy-lang/smithy-rs/issues/1829), [smithy-rs#1837](https://github.com/smithy-lang/smithy-rs/issues/1837), [smithy-rs#1891](https://github.com/smithy-lang/smithy-rs/issues/1891), [smithy-rs#1840](https://github.com/smithy-lang/smithy-rs/issues/1840), [smithy-rs#1844](https://github.com/smithy-lang/smithy-rs/issues/1844), [smithy-rs#1858](https://github.com/smithy-lang/smithy-rs/issues/1858), [smithy-rs#1930](https://github.com/smithy-lang/smithy-rs/issues/1930), [smithy-rs#1999](https://github.com/smithy-lang/smithy-rs/issues/1999), [smithy-rs#2003](https://github.com/smithy-lang/smithy-rs/issues/2003), [smithy-rs#2008](https://github.com/smithy-lang/smithy-rs/issues/2008), [smithy-rs#2010](https://github.com/smithy-lang/smithy-rs/issues/2010), [smithy-rs#2019](https://github.com/smithy-lang/smithy-rs/issues/2019), [smithy-rs#2020](https://github.com/smithy-lang/smithy-rs/issues/2020), [smithy-rs#2021](https://github.com/smithy-lang/smithy-rs/issues/2021), [smithy-rs#2038](https://github.com/smithy-lang/smithy-rs/issues/2038), [smithy-rs#2039](https://github.com/smithy-lang/smithy-rs/issues/2039), [smithy-rs#2041](https://github.com/smithy-lang/smithy-rs/issues/2041)) ### Plugins/New Service Builder API\n\n    The `Router` struct has been replaced by a new `Service` located at the root of the generated crate. Its name coincides with the same name as the Smithy service you are generating.\n\n    ```rust\n    use pokemon_service_server_sdk::PokemonService;\n    ```\n\n    The new service builder infrastructure comes with a `Plugin` system which supports middleware on `smithy-rs`. See the [mididleware documentation](https://github.com/smithy-lang/smithy-rs/blob/main/design/src/server/middleware.md) and the [API documentation](https://docs.rs/aws-smithy-http-server/latest/aws_smithy_http_server/plugin/index.html) for more details.\n\n    Usage of the new service builder API:\n\n    ```rust\n    // Apply a sequence of plugins using `PluginPipeline`.\n    let plugins = PluginPipeline::new()\n        // Apply the `PrintPlugin`.\n        // This is a dummy plugin found in `rust-runtime/aws-smithy-http-server/examples/pokemon-service/src/plugin.rs`\n        .print()\n        // Apply the `InstrumentPlugin` plugin, which applies `tracing` instrumentation.\n        .instrument();\n\n    // Construct the service builder using the `plugins` defined above.\n    let app = PokemonService::builder_with_plugins(plugins)\n        // Assign all the handlers.\n        .get_pokemon_species(get_pokemon_species)\n        .get_storage(get_storage)\n        .get_server_statistics(get_server_statistics)\n        .capture_pokemon(capture_pokemon)\n        .do_nothing(do_nothing)\n        .check_health(check_health)\n        // Construct the `PokemonService`.\n        .build()\n        // If handlers are missing a descriptive error will be provided.\n        .expect(\"failed to build an instance of `PokemonService`\");\n    ```\n\n    See the `rust-runtime/aws-smithy-http-server/examples/pokemon-service/src/bin` folder for various working examples.\n\n    ### Public `FromParts` trait\n\n    Previously, we only supported one [`Extension`](https://docs.rs/aws-smithy-http-server/latest/aws_smithy_http_server/request/struct.Extension.html) as an additional argument provided to the handler. This number has been increased to 8 and the argument type has been broadened to any struct which implements the [`FromParts`](https://docs.rs/aws-smithy-http-server/latest/aws_smithy_http_server/request/trait.FromParts.html) trait. The trait is publicly exported and therefore provides customers with the ability to extend the domain of the handlers.\n\n    As noted, a ubiqutious example of a struct that implements `FromParts` is the `Extension` struct, which extracts state from the `Extensions` typemap of a [`http::Request`](https://docs.rs/http/latest/http/request/struct.Request.html). A new example is the `ConnectInfo` struct which allows handlers to access the connection data. See the `rust-runtime/aws-smithy-http-server/examples/pokemon-service/src/bin/pokemon-service-connect-info.rs` example.\n\n    ```rust\n    fn get_pokemon_species(\n        input: GetPokemonSpeciesInput,\n        state: Extension<State>,\n        address: ConnectInfo<SocketAddr>\n    ) -> Result<GetPokemonSpeciesOutput, GetPokemonSpeciesError> {\n        todo!()\n    }\n    ```\n\n    In addition to the [`ConnectInfo`](https://docs.rs/aws-smithy-http-server/latest/aws_smithy_http_server/request/connect_info/struct.ConnectInfo.html) extractor, we also have added [lambda extractors](https://docs.rs/aws-smithy-http-server/latest/aws_smithy_http_server/request/lambda/index.html) which are feature gated with `aws-lambda`.\n\n    [`FromParts` documentation](https://github.com/smithy-lang/smithy-rs/blob/main/design/src/server/from_parts.md) has been added.\n\n    ### New Documentation\n\n    New sections to have been added to the [server side of the book](https://github.com/smithy-lang/smithy-rs/blob/main/design/src/server/overview.md).\n\n    These include:\n\n    - [Middleware](https://github.com/smithy-lang/smithy-rs/blob/main/design/src/server/middleware.md)\n    - [Accessing Un-modelled Data](https://github.com/smithy-lang/smithy-rs/blob/main/design/src/server/from_parts.md)\n    - [Anatomy of a Service](https://github.com/smithy-lang/smithy-rs/blob/main/design/src/server/anatomy.md)\n\n    This release also introduces extensive documentation at the root of the generated crate. For best results compile documentation with `cargo +nightly doc --open`.\n\n    ### Deprecations\n\n    The existing service builder infrastructure, `OperationRegistryBuilder`/`OperationRegistry`/`Router`, is now deprecated. Customers should migrate to the newer scheme described above. The deprecated types will be removed in a future release.\n- ⚠ (client, [smithy-rs#1875](https://github.com/smithy-lang/smithy-rs/issues/1875)) Replace bool with enum for a function parameter of `label::fmt_string`.\n- ⚠ (all, [smithy-rs#1980](https://github.com/smithy-lang/smithy-rs/issues/1980)) aws_smithy_types_convert::date_time::DateTimeExt::to_chrono_utc returns a Result<>\n- ⚠ (client, [smithy-rs#1926](https://github.com/smithy-lang/smithy-rs/issues/1926), [smithy-rs#1819](https://github.com/smithy-lang/smithy-rs/issues/1819)) Several breaking changes have been made to errors. See [the upgrade guide](https://github.com/smithy-lang/smithy-rs/issues/1950) for more information.\n- 🐛⚠ (server, [smithy-rs#1714](https://github.com/smithy-lang/smithy-rs/issues/1714), [smithy-rs#1342](https://github.com/smithy-lang/smithy-rs/issues/1342), [smithy-rs#1860](https://github.com/smithy-lang/smithy-rs/issues/1860)) Server SDKs now correctly reject operation inputs that don't set values for `required` structure members. Previously, in some scenarios, server SDKs would accept the request and set a default value for the member (e.g. `\"\"` for a `String`), even when the member shape did not have [Smithy IDL v2's `default` trait](https://awslabs.github.io/smithy/2.0/spec/type-refinement-traits.html#smithy-api-default-trait) attached. The `default` trait is [still unsupported](https://github.com/smithy-lang/smithy-rs/issues/1860).\n- ⚠ (client, [smithy-rs#1945](https://github.com/smithy-lang/smithy-rs/issues/1945)) Generate enums that guide the users to write match expressions in a forward-compatible way.\n    Before this change, users could write a match expression against an enum in a non-forward-compatible way:\n    ```rust\n    match some_enum {\n        SomeEnum::Variant1 => { /* ... */ },\n        SomeEnum::Variant2 => { /* ... */ },\n        Unknown(value) if value == \"NewVariant\" => { /* ... */ },\n        _ => { /* ... */ },\n    }\n    ```\n    This code can handle a case for \"NewVariant\" with a version of SDK where the enum does not yet include `SomeEnum::NewVariant`, but breaks with another version of SDK where the enum defines `SomeEnum::NewVariant` because the execution will hit a different match arm, i.e. the last one.\n    After this change, users are guided to write the above match expression as follows:\n    ```rust\n    match some_enum {\n        SomeEnum::Variant1 => { /* ... */ },\n        SomeEnum::Variant2 => { /* ... */ },\n        other @ _ if other.as_str() == \"NewVariant\" => { /* ... */ },\n        _ => { /* ... */ },\n    }\n    ```\n    This is forward-compatible because the execution will hit the second last match arm regardless of whether the enum defines `SomeEnum::NewVariant` or not.\n- ⚠ (client, [smithy-rs#1984](https://github.com/smithy-lang/smithy-rs/issues/1984), [smithy-rs#1496](https://github.com/smithy-lang/smithy-rs/issues/1496)) Functions on `aws_smithy_http::endpoint::Endpoint` now return a `Result` instead of panicking.\n- ⚠ (client, [smithy-rs#1984](https://github.com/smithy-lang/smithy-rs/issues/1984), [smithy-rs#1496](https://github.com/smithy-lang/smithy-rs/issues/1496)) `Endpoint::mutable` now takes `impl AsRef<str>` instead of `Uri`. For the old functionality, use `Endpoint::mutable_uri`.\n- ⚠ (client, [smithy-rs#1984](https://github.com/smithy-lang/smithy-rs/issues/1984), [smithy-rs#1496](https://github.com/smithy-lang/smithy-rs/issues/1496)) `Endpoint::immutable` now takes `impl AsRef<str>` instead of `Uri`. For the old functionality, use `Endpoint::immutable_uri`.\n- ⚠ (server, [smithy-rs#1982](https://github.com/smithy-lang/smithy-rs/issues/1982)) [RestJson1](https://awslabs.github.io/smithy/2.0/aws/protocols/aws-restjson1-protocol.html#operation-error-serialization) server SDKs now serialize the [full shape ID](https://smithy.io/2.0/spec/model.html#shape-id) (including namespace) in operation error responses.\n\n    Example server error response before:\n\n    ```\n    HTTP/1.1 400 Bad Request\n    content-type: application/json\n    x-amzn-errortype: InvalidRequestException\n    ...\n    ```\n\n    Example server error response now:\n\n    ```\n    HTTP/1.1 400 Bad Request\n    content-type: application/json\n    x-amzn-errortype: com.example.service#InvalidRequestException\n    ...\n    ```\n- ⚠ (server, [smithy-rs#2035](https://github.com/smithy-lang/smithy-rs/issues/2035)) All types that are exclusively relevant within the context of an AWS Lambda function are now gated behind the\n    `aws-lambda` feature flag.\n\n    This will reduce the number of dependencies (and improve build times) for users that are running their Smithy services\n    in non-serverless environments (e.g. via `hyper`).\n- ⚠ (all, [smithy-rs#1983](https://github.com/smithy-lang/smithy-rs/issues/1983), [smithy-rs#2029](https://github.com/smithy-lang/smithy-rs/issues/2029)) Implementation of the Debug trait for container shapes now redacts what is printed per the sensitive trait.\n- ⚠ (client, [smithy-rs#2065](https://github.com/smithy-lang/smithy-rs/issues/2065)) `SdkBody` callbacks have been removed. If you were using these, please [file an issue](https://github.com/smithy-lang/smithy-rs/issues/new) so that we can better understand your use-case and provide the support you need.\n- ⚠ (client, [smithy-rs#2063](https://github.com/smithy-lang/smithy-rs/issues/2063)) Added SmithyEndpointStage which can be used to set an endpoint for smithy-native clients\n- ⚠ (all, [smithy-rs#1989](https://github.com/smithy-lang/smithy-rs/issues/1989)) The Unit type for a Union member is no longer rendered. The serializers and parsers generated now function accordingly in the absence of the inner data associated with the Unit type.\n\n**New this release:**\n- 🎉 (all, [smithy-rs#1929](https://github.com/smithy-lang/smithy-rs/issues/1929)) Upgrade Smithy to v1.26\n- 🎉 (client, [smithy-rs#2044](https://github.com/smithy-lang/smithy-rs/issues/2044), [smithy-rs#371](https://github.com/smithy-lang/smithy-rs/issues/371)) Fixed and improved the request `tracing` span hierarchy to improve log messages, profiling, and debuggability.\n- 🐛 (all, [smithy-rs#1847](https://github.com/smithy-lang/smithy-rs/issues/1847)) Support Sigv4 signature generation on PowerPC 32 and 64 bit. This architecture cannot compile `ring`, so the implementation has been updated to rely on `hamc` + `sha2` to achive the same result with broader platform compatibility and higher performance. We also updated the CI which is now running as many tests as possible against i686 and PowerPC 32 and 64 bit.\n- 🐛 (server, [smithy-rs#1910](https://github.com/smithy-lang/smithy-rs/issues/1910)) `aws_smithy_http_server::routing::Router` is exported from the crate root again. This reverts unintentional breakage that was introduced in `aws-smithy-http-server` v0.51.0 only.\n- 🐛 (client, [smithy-rs#1903](https://github.com/smithy-lang/smithy-rs/issues/1903), [smithy-rs#1902](https://github.com/smithy-lang/smithy-rs/issues/1902)) Fix bug that can cause panics in paginators\n- (client, [smithy-rs#1919](https://github.com/smithy-lang/smithy-rs/issues/1919)) Operation metadata is now added to the property bag before sending requests allowing middlewares to behave\n    differently depending on the operation being sent.\n- (all, [smithy-rs#1907](https://github.com/smithy-lang/smithy-rs/issues/1907)) Fix cargo audit issue on chrono.\n- 🐛 (client, [smithy-rs#1957](https://github.com/smithy-lang/smithy-rs/issues/1957)) It was previously possible to send requests without setting query parameters modeled as required. Doing this may cause a\n    service to interpret a request incorrectly instead of just sending back a 400 error. Now, when an operation has query\n    parameters that are marked as required, the omission of those query parameters will cause a BuildError, preventing the\n    invalid operation from being sent.\n- (all, [smithy-rs#1972](https://github.com/smithy-lang/smithy-rs/issues/1972)) Upgrade to Smithy 1.26.2\n- (all, [smithy-rs#2011](https://github.com/smithy-lang/smithy-rs/issues/2011), @lsr0) Make generated enum `values()` functions callable in const contexts.\n- (client, [smithy-rs#2064](https://github.com/smithy-lang/smithy-rs/issues/2064), [aws-sdk-rust#632](https://github.com/awslabs/aws-sdk-rust/issues/632)) Clients now default max idle connections to 70 (previously unlimited) to reduce the likelihood of hitting max file handles in AWS Lambda.\n- (client, [smithy-rs#2057](https://github.com/smithy-lang/smithy-rs/issues/2057), [smithy-rs#371](https://github.com/smithy-lang/smithy-rs/issues/371)) Add more `tracing` events to signing and event streams\n\n**Contributors**\nThank you for your contributions! ❤\n- @jjantdev ([smithy-rs#1938](https://github.com/smithy-lang/smithy-rs/issues/1938))\n- @lsr0 ([smithy-rs#2011](https://github.com/smithy-lang/smithy-rs/issues/2011))\n\nOctober 24th, 2022\n==================\n**Breaking Changes:**\n- ⚠ (all, [smithy-rs#1825](https://github.com/smithy-lang/smithy-rs/issues/1825)) Bump MSRV to be 1.62.0.\n- ⚠ (server, [smithy-rs#1825](https://github.com/smithy-lang/smithy-rs/issues/1825)) Bump pyo3 and pyo3-asyncio from 0.16.x to 0.17.0 for aws-smithy-http-server-python.\n- ⚠ (client, [smithy-rs#1811](https://github.com/smithy-lang/smithy-rs/issues/1811)) Replace all usages of `AtomicU64` with `AtomicUsize` to support 32bit targets.\n- ⚠ (server, [smithy-rs#1803](https://github.com/smithy-lang/smithy-rs/issues/1803)) Mark `operation` and `operation_handler` modules as private in the generated server crate.\n    Both modules did not contain any public types, therefore there should be no actual breakage when updating.\n- ⚠ (client, [smithy-rs#1740](https://github.com/smithy-lang/smithy-rs/issues/1740), [smithy-rs#256](https://github.com/smithy-lang/smithy-rs/issues/256)) A large list of breaking changes were made to accomodate default timeouts in the AWS SDK.\n    See [the smithy-rs upgrade guide](https://github.com/smithy-lang/smithy-rs/issues/1760) for a full list\n    of breaking changes and how to resolve them.\n- ⚠ (server, [smithy-rs#1829](https://github.com/smithy-lang/smithy-rs/issues/1829)) Remove `Protocol` enum, removing an obstruction to extending smithy to third-party protocols.\n- ⚠ (server, [smithy-rs#1829](https://github.com/smithy-lang/smithy-rs/issues/1829)) Convert the `protocol` argument on `PyMiddlewares::new` constructor to a type parameter.\n- ⚠ (server, [smithy-rs#1753](https://github.com/smithy-lang/smithy-rs/issues/1753)) `aws_smithy_http_server::routing::Router` is no longer exported from the crate root. This was unintentional breakage that will be reverted in the next release.\n\n**New this release:**\n- (server, [smithy-rs#1811](https://github.com/smithy-lang/smithy-rs/issues/1811)) Replace all usages of `AtomicU64` with `AtomicUsize` to support 32bit targets.\n- 🐛 (all, [smithy-rs#1802](https://github.com/smithy-lang/smithy-rs/issues/1802)) Sensitive fields in errors now respect @sensitive trait and are properly redacted.\n- (server, [smithy-rs#1727](https://github.com/smithy-lang/smithy-rs/issues/1727), @GeneralSwiss) Pokémon Service example code now runs clippy during build.\n- (server, [smithy-rs#1734](https://github.com/smithy-lang/smithy-rs/issues/1734)) Implement support for pure Python request middleware. Improve idiomatic logging support over tracing.\n- 🐛 (client, [aws-sdk-rust#620](https://github.com/awslabs/aws-sdk-rust/issues/620), [smithy-rs#1748](https://github.com/smithy-lang/smithy-rs/issues/1748)) Paginators now stop on encountering a duplicate token by default rather than panic. This behavior can be customized by toggling the `stop_on_duplicate_token` property on the paginator before calling `send`.\n- 🐛 (all, [smithy-rs#1817](https://github.com/smithy-lang/smithy-rs/issues/1817), @ethyi) Update aws-types zeroize to flexible version to prevent downstream version conflicts.\n- (all, [smithy-rs#1852](https://github.com/smithy-lang/smithy-rs/issues/1852), @ogudavid) Enable local maven repo dependency override.\n\n**Contributors**\nThank you for your contributions! ❤\n- @GeneralSwiss ([smithy-rs#1727](https://github.com/smithy-lang/smithy-rs/issues/1727))\n- @ethyi ([smithy-rs#1817](https://github.com/smithy-lang/smithy-rs/issues/1817))\n- @ogudavid ([smithy-rs#1852](https://github.com/smithy-lang/smithy-rs/issues/1852))\n\nSeptember 20th, 2022\n====================\n**Breaking Changes:**\n- ⚠ (client, [smithy-rs#1603](https://github.com/smithy-lang/smithy-rs/issues/1603), [aws-sdk-rust#586](https://github.com/awslabs/aws-sdk-rust/issues/586)) `aws_smithy_types::RetryConfig` no longer implements `Default`, and its `new` function has been replaced with `standard`.\n- ⚠ (client, [smithy-rs#1603](https://github.com/smithy-lang/smithy-rs/issues/1603), [aws-sdk-rust#586](https://github.com/awslabs/aws-sdk-rust/issues/586)) Client creation now panics if retries or timeouts are enabled without an async sleep implementation.\n    If you're using the Tokio runtime and have the `rt-tokio` feature enabled (which is enabled by default),\n    then you shouldn't notice this change at all.\n    Otherwise, if using something other than Tokio as the async runtime, the `AsyncSleep` trait must be implemented,\n    and that implementation given to the config builder via the `sleep_impl` method. Alternatively, retry can be\n    explicitly turned off by setting `max_attempts` to 1, which will result in successful client creation without an\n    async sleep implementation.\n- ⚠ (client, [smithy-rs#1603](https://github.com/smithy-lang/smithy-rs/issues/1603), [aws-sdk-rust#586](https://github.com/awslabs/aws-sdk-rust/issues/586)) The `default_async_sleep` method on the `Client` builder has been removed. The default async sleep is\n    wired up by default if none is provided.\n- ⚠ (client, [smithy-rs#976](https://github.com/smithy-lang/smithy-rs/issues/976), [smithy-rs#1710](https://github.com/smithy-lang/smithy-rs/issues/1710)) Removed the need to generate operation output and retry aliases in codegen.\n- ⚠ (client, [smithy-rs#1715](https://github.com/smithy-lang/smithy-rs/issues/1715), [smithy-rs#1717](https://github.com/smithy-lang/smithy-rs/issues/1717)) `ClassifyResponse` was renamed to `ClassifyRetry` and is no longer implemented for the unit type.\n- ⚠ (client, [smithy-rs#1715](https://github.com/smithy-lang/smithy-rs/issues/1715), [smithy-rs#1717](https://github.com/smithy-lang/smithy-rs/issues/1717)) The `with_retry_policy` and `retry_policy` functions on `aws_smithy_http::operation::Operation` have been\n    renamed to `with_retry_classifier` and `retry_classifier` respectively. Public member `retry_policy` on\n    `aws_smithy_http::operation::Parts` has been renamed to `retry_classifier`.\n\n**New this release:**\n- 🎉 (client, [smithy-rs#1647](https://github.com/smithy-lang/smithy-rs/issues/1647), [smithy-rs#1112](https://github.com/smithy-lang/smithy-rs/issues/1112)) Implemented customizable operations per [RFC-0017](https://smithy-lang.github.io/smithy-rs/design/rfcs/rfc0017_customizable_client_operations.html).\n\n    Before this change, modifying operations before sending them required using lower-level APIs:\n\n    ```rust\n    let input = SomeOperationInput::builder().some_value(5).build()?;\n\n    let operation = {\n        let op = input.make_operation(&service_config).await?;\n        let (request, response) = op.into_request_response();\n\n        let request = request.augment(|req, _props| {\n            req.headers_mut().insert(\n                HeaderName::from_static(\"x-some-header\"),\n                HeaderValue::from_static(\"some-value\")\n            );\n            Result::<_, Infallible>::Ok(req)\n        })?;\n\n        Operation::from_parts(request, response)\n    };\n\n    let response = smithy_client.call(operation).await?;\n    ```\n\n    Now, users may easily modify operations before sending with the `customize` method:\n\n    ```rust\n    let response = client.some_operation()\n        .some_value(5)\n        .customize()\n        .await?\n        .mutate_request(|mut req| {\n            req.headers_mut().insert(\n                HeaderName::from_static(\"x-some-header\"),\n                HeaderValue::from_static(\"some-value\")\n            );\n        })\n        .send()\n        .await?;\n    ```\n- (client, [smithy-rs#1735](https://github.com/smithy-lang/smithy-rs/issues/1735), @vojtechkral) Lower log level of two info-level log messages.\n- (all, [smithy-rs#1710](https://github.com/smithy-lang/smithy-rs/issues/1710)) Added `writable` property to `RustType` and `RuntimeType` that returns them in `Writable` form\n- (all, [smithy-rs#1680](https://github.com/smithy-lang/smithy-rs/issues/1680), @ogudavid) Smithy IDL v2 mixins are now supported\n- 🐛 (client, [smithy-rs#1715](https://github.com/smithy-lang/smithy-rs/issues/1715), [smithy-rs#1717](https://github.com/smithy-lang/smithy-rs/issues/1717)) Generated clients now retry transient errors without replacing the retry policy.\n- 🐛 (all, [smithy-rs#1725](https://github.com/smithy-lang/smithy-rs/issues/1725), @sugmanue) Correctly determine nullability of members in IDLv2 models\n\n**Contributors**\nThank you for your contributions! ❤\n- @ogudavid ([smithy-rs#1680](https://github.com/smithy-lang/smithy-rs/issues/1680))\n- @sugmanue ([smithy-rs#1725](https://github.com/smithy-lang/smithy-rs/issues/1725))\n- @vojtechkral ([smithy-rs#1735](https://github.com/smithy-lang/smithy-rs/issues/1735))\n\nAugust 31st, 2022\n=================\n**Breaking Changes:**\n- ⚠🎉 (client, [smithy-rs#1598](https://github.com/smithy-lang/smithy-rs/issues/1598)) Previously, the config customizations that added functionality related to retry configs, timeout configs, and the\n    async sleep impl were defined in the smithy codegen module but were being loaded in the AWS codegen module. They\n    have now been updated to be loaded during smithy codegen. The affected classes are all defined in the\n    `software.amazon.smithy.rust.codegen.smithy.customizations` module of smithy codegen.` This change does not affect\n    the generated code.\n\n    These classes have been removed:\n    - `RetryConfigDecorator`\n    - `SleepImplDecorator`\n    - `TimeoutConfigDecorator`\n\n    These classes have been renamed:\n    - `RetryConfigProviderConfig` is now `RetryConfigProviderCustomization`\n    - `PubUseRetryConfig` is now `PubUseRetryConfigGenerator`\n    - `SleepImplProviderConfig` is now `SleepImplProviderCustomization`\n    - `TimeoutConfigProviderConfig` is now `TimeoutConfigProviderCustomization`\n- ⚠🎉 (all, [smithy-rs#1635](https://github.com/smithy-lang/smithy-rs/issues/1635), [smithy-rs#1416](https://github.com/smithy-lang/smithy-rs/issues/1416), @weihanglo) Support granular control of specifying runtime crate versions.\n\n    For code generation, the field `runtimeConfig.version` in smithy-build.json has been removed.\n    The new field `runtimeConfig.versions` is an object whose keys are runtime crate names (e.g. `aws-smithy-http`),\n    and values are user-specified versions.\n\n    If you previously set `version = \"DEFAULT\"`, the migration path is simple.\n    By setting `versions` with an empty object or just not setting it at all,\n    the version number of the code generator will be used as the version for all runtime crates.\n\n    If you specified a certain version such as `version = \"0.47.0\", you can migrate to a special reserved key `DEFAULT`.\n    The equivalent JSON config would look like:\n\n    ```json\n    {\n      \"runtimeConfig\": {\n          \"versions\": {\n              \"DEFAULT\": \"0.47.0\"\n          }\n      }\n    }\n    ```\n\n    Then all runtime crates are set with version 0.47.0 by default unless overridden by specific crates. For example,\n\n    ```json\n    {\n      \"runtimeConfig\": {\n          \"versions\": {\n              \"DEFAULT\": \"0.47.0\",\n              \"aws-smithy-http\": \"0.47.1\"\n          }\n      }\n    }\n    ```\n\n    implies that we're using `aws-smithy-http` 0.47.1 specifically. For the rest of the crates, it will default to 0.47.0.\n- ⚠ (all, [smithy-rs#1623](https://github.com/smithy-lang/smithy-rs/issues/1623), @ogudavid) Remove @sensitive trait tests which applied trait to member. The ability to mark members with @sensitive was removed in Smithy 1.22.\n- ⚠ (server, [smithy-rs#1544](https://github.com/smithy-lang/smithy-rs/issues/1544)) Servers now allow requests' ACCEPT header values to be:\n    - `*/*`\n    - `type/*`\n    - `type/subtype`\n- 🐛⚠ (all, [smithy-rs#1274](https://github.com/smithy-lang/smithy-rs/issues/1274)) Lossy converters into integer types for `aws_smithy_types::Number` have been\n    removed. Lossy converters into floating point types for\n    `aws_smithy_types::Number` have been suffixed with `_lossy`. If you were\n    directly using the integer lossy converters, we recommend you use the safe\n    converters.\n    _Before:_\n    ```rust\n    fn f1(n: aws_smithy_types::Number) {\n        let foo: f32 = n.to_f32(); // Lossy conversion!\n        let bar: u32 = n.to_u32(); // Lossy conversion!\n    }\n    ```\n    _After:_\n    ```rust\n    fn f1(n: aws_smithy_types::Number) {\n        use std::convert::TryInto; // Unnecessary import if you're using Rust 2021 edition.\n        let foo: f32 = n.try_into().expect(\"lossy conversion detected\"); // Or handle the error instead of panicking.\n        // You can still do lossy conversions, but only into floating point types.\n        let foo: f32 = n.to_f32_lossy();\n        // To lossily convert into integer types, use an `as` cast directly.\n        let bar: u32 = n as u32; // Lossy conversion!\n    }\n    ```\n- ⚠ (all, [smithy-rs#1699](https://github.com/smithy-lang/smithy-rs/issues/1699)) Bump [MSRV](https://github.com/awslabs/aws-sdk-rust#supported-rust-versions-msrv) from 1.58.1 to 1.61.0 per our policy.\n\n**New this release:**\n- 🎉 (all, [smithy-rs#1623](https://github.com/smithy-lang/smithy-rs/issues/1623), @ogudavid) Update Smithy dependency to 1.23.1. Models using version 2.0 of the IDL are now supported.\n- 🎉 (server, [smithy-rs#1551](https://github.com/smithy-lang/smithy-rs/issues/1551), @hugobast) There is a canonical and easier way to run smithy-rs on Lambda [see example].\n\n    [see example]: https://github.com/smithy-lang/smithy-rs/blob/main/rust-runtime/aws-smithy-http-server/examples/pokemon-service/src/lambda.rs\n- 🐛 (all, [smithy-rs#1623](https://github.com/smithy-lang/smithy-rs/issues/1623), @ogudavid) Fix detecting sensitive members through their target shape having the @sensitive trait applied.\n- (all, [smithy-rs#1623](https://github.com/smithy-lang/smithy-rs/issues/1623), @ogudavid) Fix SetShape matching needing to occur before ListShape since it is now a subclass. Sets were deprecated in Smithy 1.22.\n- (all, [smithy-rs#1623](https://github.com/smithy-lang/smithy-rs/issues/1623), @ogudavid) Fix Union shape test data having an invalid empty union. Break fixed from Smithy 1.21 to Smithy 1.22.\n- (all, [smithy-rs#1612](https://github.com/smithy-lang/smithy-rs/issues/1612), @unexge) Add codegen version to generated package metadata\n- (client, [aws-sdk-rust#609](https://github.com/awslabs/aws-sdk-rust/issues/609)) It is now possible to exempt specific operations from XML body root checking. To do this, add the `AllowInvalidXmlRoot`\n    trait to the output struct of the operation you want to exempt.\n\n**Contributors**\nThank you for your contributions! ❤\n- @hugobast ([smithy-rs#1551](https://github.com/smithy-lang/smithy-rs/issues/1551))\n- @ogudavid ([smithy-rs#1623](https://github.com/smithy-lang/smithy-rs/issues/1623))\n- @unexge ([smithy-rs#1612](https://github.com/smithy-lang/smithy-rs/issues/1612))\n- @weihanglo ([smithy-rs#1416](https://github.com/smithy-lang/smithy-rs/issues/1416), [smithy-rs#1635](https://github.com/smithy-lang/smithy-rs/issues/1635))\n\nAugust 4th, 2022\n================\n**Breaking Changes:**\n- ⚠🎉 (all, [smithy-rs#1570](https://github.com/smithy-lang/smithy-rs/issues/1570), @weihanglo) Support @deprecated trait for aggregate shapes\n- ⚠ (all, [smithy-rs#1157](https://github.com/smithy-lang/smithy-rs/issues/1157)) Rename EventStreamInput to EventStreamSender\n- ⚠ (all, [smithy-rs#1157](https://github.com/smithy-lang/smithy-rs/issues/1157)) The type of streaming unions that contain errors is generated without those errors.\n    Errors in a streaming union `Union` are generated as members of the type `UnionError`.\n    Taking Transcribe as an example, the `AudioStream` streaming union generates, in the client, both the `AudioStream` type:\n    ```rust\n    pub enum AudioStream {\n        AudioEvent(crate::model::AudioEvent),\n        Unknown,\n    }\n    ```\n    and its error type,\n    ```rust\n    pub struct AudioStreamError {\n        /// Kind of error that occurred.\n        pub kind: AudioStreamErrorKind,\n        /// Additional metadata about the error, including error code, message, and request ID.\n        pub(crate) meta: aws_smithy_types::Error,\n    }\n    ```\n    `AudioStreamErrorKind` contains all error variants for the union.\n    Before, the generated code looked as:\n    ```rust\n    pub enum AudioStream {\n        AudioEvent(crate::model::AudioEvent),\n        ... all error variants,\n        Unknown,\n    }\n    ```\n- ⚠ (all, [smithy-rs#1157](https://github.com/smithy-lang/smithy-rs/issues/1157)) `aws_smithy_http::event_stream::EventStreamSender` and `aws_smithy_http::event_stream::Receiver` are now generic over `<T, E>`,\n    where `T` is a streaming union and `E` the union's errors.\n    This means that event stream errors are now sent as `Err` of the union's error type.\n    With this example model:\n    ```smithy\n    @streaming union Event {\n        throttlingError: ThrottlingError\n    }\n    @error(\"client\") structure ThrottlingError {}\n    ```\n    Before:\n    ```rust\n    stream! { yield Ok(Event::ThrottlingError ...) }\n    ```\n    After:\n    ```rust\n    stream! { yield Err(EventError::ThrottlingError ...) }\n    ```\n    An example from the SDK is in [transcribe streaming](https://github.com/smithy-lang/smithy-rs/blob/4f51dd450ea3234a7faf481c6025597f22f03805/aws/sdk/integration-tests/transcribestreaming/tests/test.rs#L80).\n\n**New this release:**\n- 🎉 (all, [smithy-rs#1482](https://github.com/smithy-lang/smithy-rs/issues/1482)) Update codegen to generate support for flexible checksums.\n- (all, [smithy-rs#1520](https://github.com/smithy-lang/smithy-rs/issues/1520)) Add explicit cast during JSON deserialization in case of custom Symbol providers.\n- (all, [smithy-rs#1578](https://github.com/smithy-lang/smithy-rs/issues/1578), @lkts) Change detailed logs in CredentialsProviderChain from info to debug\n- (all, [smithy-rs#1573](https://github.com/smithy-lang/smithy-rs/issues/1573), [smithy-rs#1569](https://github.com/smithy-lang/smithy-rs/issues/1569)) Non-streaming struct members are now marked `#[doc(hidden)]` since they will be removed in the future\n\n**Contributors**\nThank you for your contributions! ❤\n- @lkts ([smithy-rs#1578](https://github.com/smithy-lang/smithy-rs/issues/1578))\n- @weihanglo ([smithy-rs#1570](https://github.com/smithy-lang/smithy-rs/issues/1570))\n\nJuly 20th, 2022\n===============\n**New this release:**\n- 🎉 (all, [aws-sdk-rust#567](https://github.com/awslabs/aws-sdk-rust/issues/567)) Updated the smithy client's retry behavior to allow for a configurable initial backoff. Previously, the initial backoff\n    (named `r` in the code) was set to 2 seconds. This is not an ideal default for services that expect clients to quickly\n    retry failed request attempts. Now, users can set quicker (or slower) backoffs according to their needs.\n- (all, [smithy-rs#1263](https://github.com/smithy-lang/smithy-rs/issues/1263)) Add checksum calculation and validation wrappers for HTTP bodies.\n- (all, [smithy-rs#1263](https://github.com/smithy-lang/smithy-rs/issues/1263)) `aws_smithy_http::header::append_merge_header_maps`, a function for merging two `HeaderMap`s, is now public.\n\n\nv0.45.0 (June 28th, 2022)\n=========================\n**Breaking Changes:**\n- ⚠ ([smithy-rs#932](https://github.com/smithy-lang/smithy-rs/issues/932)) Replaced use of `pin-project` with equivalent `pin-project-lite`. For pinned enum tuple variants and tuple structs, this\n    change requires that we switch to using enum struct variants and regular structs. Most of the structs and enums that\n    were updated had only private fields/variants and so have the same public API. However, this change does affect the\n    public API of `aws_smithy_http_tower::map_request::MapRequestFuture<F, E>`. The `Inner` and `Ready` variants contained a\n    single value. Each have been converted to struct variants and the inner value is now accessible by the `inner` field\n    instead of the `0` field.\n\n**New this release:**\n- 🎉 ([smithy-rs#1411](https://github.com/smithy-lang/smithy-rs/issues/1411), [smithy-rs#1167](https://github.com/smithy-lang/smithy-rs/issues/1167)) Upgrade to Gradle 7. This change is not a breaking change, however, users of smithy-rs will need to switch to JDK 17\n- 🐛 ([smithy-rs#1505](https://github.com/smithy-lang/smithy-rs/issues/1505), @kiiadi) Fix issue with codegen on Windows where module names were incorrectly determined from filenames\n\n**Contributors**\nThank you for your contributions! ❤\n- @kiiadi ([smithy-rs#1505](https://github.com/smithy-lang/smithy-rs/issues/1505))\n<!-- Do not manually edit this file, use `update-changelogs` -->\nv0.44.0 (June 22nd, 2022)\n=========================\n**New this release:**\n- ([smithy-rs#1460](https://github.com/smithy-lang/smithy-rs/issues/1460)) Fix a potential bug with `ByteStream`'s implementation of `futures_core::stream::Stream` and add helpful error messages\n    for users on 32-bit systems that try to stream HTTP bodies larger than 4.29Gb.\n- 🐛 ([smithy-rs#1427](https://github.com/smithy-lang/smithy-rs/issues/1427), [smithy-rs#1465](https://github.com/smithy-lang/smithy-rs/issues/1465), [smithy-rs#1459](https://github.com/smithy-lang/smithy-rs/issues/1459)) Fix RustWriter bugs for `rustTemplate` and `docs` utility methods\n- 🐛 ([aws-sdk-rust#554](https://github.com/awslabs/aws-sdk-rust/issues/554)) Requests to Route53 that return `ResourceId`s often come with a prefix. When passing those IDs directly into another\n    request, the request would fail unless they manually stripped the prefix. Now, when making a request with a prefixed ID,\n    the prefix will be stripped automatically.\n\n\nv0.43.0 (June 9th, 2022)\n========================\n**New this release:**\n- 🎉 ([smithy-rs#1381](https://github.com/smithy-lang/smithy-rs/issues/1381), @alonlud) Add ability to sign a request with all headers, or to change which headers are excluded from signing\n- 🎉 ([smithy-rs#1390](https://github.com/smithy-lang/smithy-rs/issues/1390)) Add method `ByteStream::into_async_read`. This makes it easy to convert `ByteStream`s into a struct implementing `tokio:io::AsyncRead`. Available on **crate feature** `rt-tokio` only.\n- ([smithy-rs#1404](https://github.com/smithy-lang/smithy-rs/issues/1404), @petrosagg) Add ability to specify a different rust crate name than the one derived from the package name\n- ([smithy-rs#1404](https://github.com/smithy-lang/smithy-rs/issues/1404), @petrosagg) Switch to [RustCrypto](https://github.com/RustCrypto)'s implementation of MD5.\n\n**Contributors**\nThank you for your contributions! ❤\n- @alonlud ([smithy-rs#1381](https://github.com/smithy-lang/smithy-rs/issues/1381))\n- @petrosagg ([smithy-rs#1404](https://github.com/smithy-lang/smithy-rs/issues/1404))\n\nv0.42.0 (May 13th, 2022)\n========================\n**Breaking Changes:**\n- ⚠🎉 ([aws-sdk-rust#494](https://github.com/awslabs/aws-sdk-rust/issues/494), [aws-sdk-rust#519](https://github.com/awslabs/aws-sdk-rust/issues/519)) The `aws_smithy_http::byte_stream::bytestream_util::FsBuilder` has been updated to allow for easier creation of\n    multi-part requests.\n\n    - `FsBuilder::offset` is a new method allowing users to specify an offset to start reading a file from.\n    - `FsBuilder::file_size` has been reworked into `FsBuilder::length` and is now used to specify the amount of data to read.\n\n    With these two methods, it's now simple to create a `ByteStream` that will read a single \"chunk\" of a file. The example\n    below demonstrates how you could divide a single `File` into consecutive chunks to create multiple `ByteStream`s.\n\n    ```rust\n    let example_file_path = Path::new(\"/example.txt\");\n    let example_file_size = tokio::fs::metadata(&example_file_path).await.unwrap().len();\n    let chunks = 6;\n    let chunk_size = file_size / chunks;\n    let mut byte_streams = Vec::new();\n\n    for i in 0..chunks {\n        let length = if i == chunks - 1 {\n            // If we're on the last chunk, the length to read might be less than a whole chunk.\n            // We substract the size of all previous chunks from the total file size to get the\n            // size of the final chunk.\n            file_size - (i * chunk_size)\n        } else {\n            chunk_size\n        };\n\n        let byte_stream = ByteStream::read_from()\n            .path(&file_path)\n            .offset(i * chunk_size)\n            .length(length)\n            .build()\n            .await?;\n\n        byte_streams.push(byte_stream);\n    }\n\n    for chunk in byte_streams {\n        // Make requests to a service\n    }\n    ```\n\n**New this release:**\n- ([smithy-rs#1352](https://github.com/smithy-lang/smithy-rs/issues/1352)) Log a debug event when a retry is going to be peformed\n- ([smithy-rs#1332](https://github.com/smithy-lang/smithy-rs/issues/1332), @82marbag) Update generated crates to Rust 2021\n\n**Contributors**\nThank you for your contributions! ❤\n- @82marbag ([smithy-rs#1332](https://github.com/smithy-lang/smithy-rs/issues/1332))\n\n0.41.0 (April 28th, 2022)\n=========================\n**Breaking Changes:**\n- ⚠ ([smithy-rs#1318](https://github.com/smithy-lang/smithy-rs/issues/1318)) Bump [MSRV](https://github.com/awslabs/aws-sdk-rust#supported-rust-versions-msrv) from 1.56.1 to 1.58.1 per our \"two versions behind\" policy.\n\n**New this release:**\n- ([smithy-rs#1307](https://github.com/smithy-lang/smithy-rs/issues/1307)) Add new trait for HTTP body callbacks. This is the first step to enabling us to implement optional checksum verification of requests and responses.\n- ([smithy-rs#1330](https://github.com/smithy-lang/smithy-rs/issues/1330)) Upgrade to Smithy 1.21.0\n\n\n0.40.2 (April 14th, 2022)\n=========================\n\n**Breaking Changes:**\n- ⚠ ([aws-sdk-rust#490](https://github.com/awslabs/aws-sdk-rust/issues/490)) Update all runtime crates to [edition 2021](https://blog.rust-lang.org/2021/10/21/Rust-1.56.0.html)\n\n**New this release:**\n- ([smithy-rs#1262](https://github.com/smithy-lang/smithy-rs/issues/1262), @liubin) Fix link to Developer Guide in crate's README.md\n- ([smithy-rs#1301](https://github.com/smithy-lang/smithy-rs/issues/1301), @benesch) Update urlencoding crate to v2.1.0\n\n**Contributors**\nThank you for your contributions! ❤\n- @benesch ([smithy-rs#1301](https://github.com/smithy-lang/smithy-rs/issues/1301))\n- @liubin ([smithy-rs#1262](https://github.com/smithy-lang/smithy-rs/issues/1262))\n\n0.39.0 (March 17, 2022)\n=======================\n**Breaking Changes:**\n- ⚠ ([aws-sdk-rust#406](https://github.com/awslabs/aws-sdk-rust/issues/406)) `aws_types::config::Config` has been renamed to `aws_types:sdk_config::SdkConfig`. This is to better differentiate it\n    from service-specific configs like `aws_s3_sdk::Config`. If you were creating shared configs with\n    `aws_config::load_from_env()`, then you don't have to do anything. If you were directly referring to a shared config,\n    update your `use` statements and `struct` names.\n\n    _Before:_\n    ```rust\n    use aws_types::config::Config;\n\n    fn main() {\n        let config = Config::builder()\n        // config builder methods...\n        .build()\n        .await;\n    }\n    ```\n\n    _After:_\n    ```rust\n    use aws_types::SdkConfig;\n\n    fn main() {\n        let config = SdkConfig::builder()\n        // config builder methods...\n        .build()\n        .await;\n    }\n    ```\n- ⚠ ([smithy-rs#724](https://github.com/smithy-lang/smithy-rs/issues/724)) Timeout configuration has been refactored a bit. If you were setting timeouts through environment variables or an AWS\n    profile, then you shouldn't need to change anything. Take note, however, that we don't currently support HTTP connect,\n    read, write, or TLS negotiation timeouts. If you try to set any of those timeouts in your profile or environment, we'll\n    log a warning explaining that those timeouts don't currently do anything.\n\n    If you were using timeouts programmatically,\n    you'll need to update your code. In previous versions, timeout configuration was stored in a single `TimeoutConfig`\n    struct. In this new version, timeouts have been broken up into several different config structs that are then collected\n    in a `timeout::Config` struct. As an example, to get the API per-attempt timeout in previous versions you would access\n    it with `<your TimeoutConfig>.api_call_attempt_timeout()` and in this new version you would access it with\n    `<your timeout::Config>.api.call_attempt_timeout()`. We also made some unimplemented timeouts inaccessible in order to\n    avoid giving users the impression that setting them had an effect. We plan to re-introduce them once they're made\n    functional in a future update.\n\n**New this release:**\n- ([smithy-rs#1225](https://github.com/smithy-lang/smithy-rs/issues/1225)) `DynMiddleware` is now `clone`able\n- ([smithy-rs#1257](https://github.com/smithy-lang/smithy-rs/issues/1257)) HTTP request property bag now contains list of desired HTTP versions to use when making requests. This list is not currently used but will be in an upcoming update.\n\n\n0.38.0 (Februrary 24, 2022)\n===========================\n**Breaking Changes:**\n- ⚠ ([smithy-rs#1197](https://github.com/smithy-lang/smithy-rs/issues/1197)) `aws_smithy_types::retry::RetryKind` had its `NotRetryable` variant split into `UnretryableFailure` and `Unnecessary`. If you implement the `ClassifyResponse`, then successful responses need to return `Unnecessary`, and failures that shouldn't be retried need to return `UnretryableFailure`.\n- ⚠ ([smithy-rs#1209](https://github.com/smithy-lang/smithy-rs/issues/1209)) `aws_smithy_types::primitive::Encoder` is now a struct rather than an enum, but its usage remains the same.\n- ⚠ ([smithy-rs#1217](https://github.com/smithy-lang/smithy-rs/issues/1217)) `ClientBuilder` helpers `rustls()` and `native_tls()` now return `DynConnector` and use dynamic dispatch rather than returning their concrete connector type that would allow static dispatch. If static dispatch is desired, then manually construct a connector to give to the builder. For example, for rustls: `builder.connector(Adapter::builder().build(aws_smithy_client::conns::https()))` (where `Adapter` is in `aws_smithy_client::hyper_ext`).\n\n**New this release:**\n- 🐛 ([smithy-rs#1197](https://github.com/smithy-lang/smithy-rs/issues/1197)) Fixed a bug that caused clients to eventually stop retrying. The cross-request retry allowance wasn't being reimbursed upon receiving a successful response, so once this allowance reached zero, no further retries would ever be attempted.\n\n\n0.37.0 (February 18th, 2022)\n============================\n**Breaking Changes:**\n- ⚠ ([smithy-rs#1144](https://github.com/smithy-lang/smithy-rs/issues/1144)) Some APIs required that timeout configuration be specified with an `aws_smithy_client::timeout::Settings` struct while\n    others required an `aws_smithy_types::timeout::TimeoutConfig` struct. Both were equivalent. Now `aws_smithy_types::timeout::TimeoutConfig`\n    is used everywhere and `aws_smithy_client::timeout::Settings` has been removed. Here's how to migrate code your code that\n    depended on `timeout::Settings`:\n\n    The old way:\n    ```rust\n    let timeout = timeout::Settings::new()\n        .with_connect_timeout(Duration::from_secs(1))\n        .with_read_timeout(Duration::from_secs(2));\n    ```\n\n    The new way:\n    ```rust\n    // This example is passing values, so they're wrapped in `Option::Some`. You can disable a timeout by passing `None`.\n    let timeout = TimeoutConfig::new()\n        .with_connect_timeout(Some(Duration::from_secs(1)))\n        .with_read_timeout(Some(Duration::from_secs(2)));\n    ```\n- ⚠ ([smithy-rs#1085](https://github.com/smithy-lang/smithy-rs/issues/1085)) Moved the following re-exports into a `types` module for all services:\n    - `<service>::AggregatedBytes` -> `<service>::types::AggregatedBytes`\n    - `<service>::Blob` -> `<service>::types::Blob`\n    - `<service>::ByteStream` -> `<service>::types::ByteStream`\n    - `<service>::DateTime` -> `<service>::types::DateTime`\n    - `<service>::SdkError` -> `<service>::types::SdkError`\n- ⚠ ([smithy-rs#1085](https://github.com/smithy-lang/smithy-rs/issues/1085)) `AggregatedBytes` and `ByteStream` are now only re-exported if the service has streaming operations,\n    and `Blob`/`DateTime` are only re-exported if the service uses them.\n- ⚠ ([smithy-rs#1130](https://github.com/smithy-lang/smithy-rs/issues/1130)) MSRV increased from `1.54` to `1.56.1` per our 2-behind MSRV policy.\n\n**New this release:**\n- ([smithy-rs#1144](https://github.com/smithy-lang/smithy-rs/issues/1144)) `MakeConnectorFn`, `HttpConnector`, and `HttpSettings` have been moved from `aws_config::provider_config` to\n    `aws_smithy_client::http_connector`. This is in preparation for a later update that will change how connectors are\n    created and configured.\n- ([smithy-rs#1123](https://github.com/smithy-lang/smithy-rs/issues/1123)) Refactor `Document` shape parser generation\n- ([smithy-rs#1085](https://github.com/smithy-lang/smithy-rs/issues/1085)) The `Client` and `Config` re-exports now have their documentation inlined in the service docs\n\n\n0.36.0 (January 26, 2022)\n=========================\n**New this release:**\n- ([smithy-rs#1087](https://github.com/smithy-lang/smithy-rs/issues/1087)) Improve docs on `Endpoint::{mutable, immutable}`\n- ([smithy-rs#1118](https://github.com/smithy-lang/smithy-rs/issues/1118)) SDK examples now come from [`awsdocs/aws-doc-sdk-examples`](https://github.com/awsdocs/aws-doc-sdk-examples) rather than from `smithy-rs`\n- ([smithy-rs#1114](https://github.com/smithy-lang/smithy-rs/issues/1114), @mchoicpe-amazon) Provide SigningService creation via owned String\n\n**Contributors**\nThank you for your contributions! ❤\n- @mchoicpe-amazon ([smithy-rs#1114](https://github.com/smithy-lang/smithy-rs/issues/1114))\n\n\n0.35.2 (January 20th, 2022)\n===========================\n_Changes only impact generated AWS SDK_\n\nv0.35.1 (January 19th, 2022)\n============================\n_Changes only impact generated AWS SDK_\n\n\n0.35.0 (January 19, 2022)\n=========================\n**New this release:**\n- ([smithy-rs#1053](https://github.com/smithy-lang/smithy-rs/issues/1053)) Upgraded Smithy to 1.16.1\n- 🐛 ([smithy-rs#1069](https://github.com/smithy-lang/smithy-rs/issues/1069)) Fix broken link to `RetryMode` in client docs\n- 🐛 ([smithy-rs#1069](https://github.com/smithy-lang/smithy-rs/issues/1069)) Fix several doc links to raw identifiers (identifiers excaped with `r#`)\n- 🐛 ([smithy-rs#1069](https://github.com/smithy-lang/smithy-rs/issues/1069)) Reduce dependency recompilation in local dev\n- 🐛 ([aws-sdk-rust#405](https://github.com/awslabs/aws-sdk-rust/issues/405), [smithy-rs#1083](https://github.com/smithy-lang/smithy-rs/issues/1083)) Fixed paginator bug impacting EC2 describe VPCs (and others)\n\n\n\nv0.34.1 (January 10, 2022)\n==========================\n**New this release:**\n- 🐛 (smithy-rs#1054, aws-sdk-rust#391) Fix critical paginator bug where an empty outputToken lead to a never ending stream.\n\n\n\n0.34.0 (January 6th, 2022)\n==========================\n**Breaking Changes:**\n- ⚠ (smithy-rs#990) Codegen will no longer produce builders and clients with methods that take `impl Into<T>` except for strings and boxed types.\n- ⚠ (smithy-rs#1003) The signature of `aws_smithy_protocol_test::validate_headers` was made more flexible but may require adjusting invocations slightly.\n\n**New this release:**\n- 🎉 (aws-sdk-rust#47, smithy-rs#1006) Add support for paginators! Paginated APIs now include `.into_paginator()` and (when supported) `.into_paginator().items()` to enable paginating responses automatically. The paginator API should be considered in preview and is subject to change pending customer feedback.\n- 🐛 (aws-sdk-rust#357) Generated docs will convert `<a>` tags with no `href` attribute to `<pre>` tags\n- (aws-sdk-rust#254, @jacco) Made fluent operation structs cloneable\n\n**Contributors**\nThank you for your contributions! ❤\n- @jacco (aws-sdk-rust#254)\n\n\nv0.33.1 (December 15th, 2021)\n=============================\n**New this release:**\n- 🐛 (smithy-rs#979) Make `aws-smithy-client` a required dependency in generated services.\n\n\n\nv0.33.0 (December 15th, 2021)\n=============================\n**Breaking Changes:**\n- ⚠ (smithy-rs#930) Runtime crates no longer have default features. You must now specify the features that you want when you add a dependency to your `Cargo.toml`.\n\n    **Upgrade guide**\n\n    | before                          | after |\n    |---------------------------------|-------|\n    | `aws-smithy-async = \"VERSION\"`  | `aws-smithy-async = { version = \"VERSION\", features = [\"rt-tokio\"] }` |\n    | `aws-smithy-client = \"VERSION\"` | `aws-smithy-client = { version = \"VERSION\", features = [\"client-hyper\", \"rustls\", \"rt-tokio\"] }` |\n    | `aws-smithy-http = \"VERSION\"`   | `aws-smithy-http = { version = \"VERSION\", features = [\"rt-tokio\"] }` |\n- ⚠ (smithy-rs#940) `aws_smithy_client::Client::https()` has been renamed to `dyn_https()`.\n    This is to clearly distinguish it from `rustls` and `native_tls` which do not use a boxed connector.\n\n**New this release:**\n- 🐛 (smithy-rs#957) Include non-service-specific examples in the generated root Cargo workspace\n- 🎉 (smithy-rs#922, smithy-rs#914) Add changelog automation to sdk-lints\n- 🐛 (aws-sdk-rust#317, smithy-rs#907) Removed spamming log message when a client was used without a sleep implementation, and\n    improved context and call to action in logged messages around missing sleep implementations.\n- (smithy-rs#923) Use provided `sleep_impl` for retries instead of using Tokio directly.\n- (smithy-rs#920) Fix typos in module documentation for generated crates\n- 🐛 (aws-sdk-rust#301, smithy-rs#892) Avoid serializing repetitive `xmlns` attributes in generated XML serializers.\n- 🐛 (smithy-rs#953, aws-sdk-rust#331) Fixed a bug where certain characters caused a panic during URI encoding.\n\n\n\nv0.32.0 (December 2nd, 2021)\n=======================\n\n- This release was a version bump to fix a version number conflict in crates.io\n\nv0.31.0 (December 2nd, 2021)\n=======================\n**New this week**\n- Add docs.rs metadata section to all crates to document all features\n\n\nv0.30.0-alpha (November 23rd, 2021)\n===================================\n\n**New this week**\n- Improve docs on `aws-smithy-client` (smithy-rs#855)\n- Fix http-body dependency version (smithy-rs#883, aws-sdk-rust#305)\n- `SdkError` now includes a variant `TimeoutError` for when a request times out (smithy-rs#885)\n- Timeouts for requests are now configurable. You can set separate timeouts for each individual request attempt and all attempts made for a request. (smithy-rs#831)\n\n**Breaking Changes**\n- (aws-smithy-client): Extraneous `pub use SdkSuccess` removed from `aws_smithy_client::hyper_ext`. (smithy-rs#855)\n\n\nv0.29.0-alpha (November 11th, 2021)\n===================================\n\n**Breaking Changes**\n\nSeveral breaking changes around `aws_smithy_types::Instant` were introduced by smithy-rs#849:\n- `aws_smithy_types::Instant` from was renamed to `DateTime` to avoid confusion with the standard library's monotonically non-decreasing `Instant` type.\n- `DateParseError` in `aws_smithy_types` has been renamed to `DateTimeParseError` to match the type that's being parsed.\n- The `chrono-conversions` feature and associated functions have been moved to the `aws-smithy-types-convert` crate.\n  - Calls to `Instant::from_chrono` should be changed to:\n    ```rust\n    use aws_smithy_types::DateTime;\n    use aws_smithy_types_convert::date_time::DateTimeExt;\n\n    // For chrono::DateTime<Utc>\n    let date_time = DateTime::from_chrono_utc(chrono_date_time);\n    // For chrono::DateTime<FixedOffset>\n    let date_time = DateTime::from_chrono_offset(chrono_date_time);\n    ```\n  - Calls to `instant.to_chrono()` should be changed to:\n    ```rust\n    use aws_smithy_types_convert::date_time::DateTimeExt;\n\n    date_time.to_chrono_utc();\n    ```\n- `Instant::from_system_time` and `Instant::to_system_time` have been changed to `From` trait implementations.\n  - Calls to `from_system_time` should be changed to:\n    ```rust\n    DateTime::from(system_time);\n    // or\n    let date_time: DateTime = system_time.into();\n    ```\n  - Calls to `to_system_time` should be changed to:\n    ```rust\n    SystemTime::from(date_time);\n    // or\n    let system_time: SystemTime = date_time.into();\n    ```\n- Several functions in `Instant`/`DateTime` were renamed:\n  - `Instant::from_f64` -> `DateTime::from_secs_f64`\n  - `Instant::from_fractional_seconds` -> `DateTime::from_fractional_secs`\n  - `Instant::from_epoch_seconds` -> `DateTime::from_secs`\n  - `Instant::from_epoch_millis` -> `DateTime::from_millis`\n  - `Instant::epoch_fractional_seconds` -> `DateTime::as_secs_f64`\n  - `Instant::has_nanos` -> `DateTime::has_subsec_nanos`\n  - `Instant::epoch_seconds` -> `DateTime::secs`\n  - `Instant::epoch_subsecond_nanos` -> `DateTime::subsec_nanos`\n  - `Instant::to_epoch_millis` -> `DateTime::to_millis`\n- The `DateTime::fmt` method is now fallible and fails when a `DateTime`'s value is outside what can be represented by the desired date format.\n- In `aws-sigv4`, the `SigningParams` builder's `date_time` setter was renamed to `time` and changed to take a `std::time::SystemTime` instead of a chrono's `DateTime<Utc>`.\n\n**New this week**\n\n- :warning: MSRV increased from 1.53.0 to 1.54.0 per our 3-behind MSRV policy.\n- Conversions from `aws_smithy_types::DateTime` to `OffsetDateTime` from the `time` crate are now available from the `aws-smithy-types-convert` crate. (smithy-rs#849)\n- Fixed links to Usage Examples (smithy-rs#862, @floric)\n\nv0.28.0-alpha (November 11th, 2021)\n===================================\n\nNo changes since last release except for version bumping since older versions\nof the AWS SDK were failing to compile with the `0.27.0-alpha.2` version chosen\nfor the previous release.\n\nv0.27.0-alpha.2 (November 9th, 2021)\n=======================\n**Breaking Changes**\n\n- Members named `builder` on model structs were renamed to `builder_value` so that their accessors don't conflict with the existing `builder()` methods (smithy-rs#842)\n\n**New this week**\n\n- Fix epoch seconds date-time parsing bug in `aws-smithy-types` (smithy-rs#834)\n- Omit trailing zeros from fraction when formatting HTTP dates in `aws-smithy-types` (smithy-rs#834)\n- Generated structs now have accessor methods for their members (smithy-rs#842)\n\nv0.27.0-alpha.1 (November 3rd, 2021)\n====================================\n**Breaking Changes**\n- `<operation>.make_operation(&config)` is now an `async` function for all operations. Code should be updated to call `.await`. This will only impact users using the low-level API. (smithy-rs#797)\n\n**New this week**\n- SDK code generation now includes a version in addition to path parameters when the `version` parameter is included in smithy-build.json\n- `moduleDescription` in `smithy-build.json` settings is now optional\n- Upgrade to Smithy 1.12\n- `hyper::Error(IncompleteMessage)` will now be retried (smithy-rs#815)\n- Unions will optionally generate an `Unknown` variant to support parsing variants that don't exist on the client. These variants will fail to serialize if they are ever included in requests.\n- Fix generated docs on unions. (smithy-rs#826)\n\nv0.27 (October 20th, 2021)\n==========================\n\n**Breaking Changes**\n\n- :warning: All Smithy runtime crates have been renamed to have an `aws-` prefix. This may require code changes:\n  - _Cargo.toml_ changes:\n    - `smithy-async` -> `aws-smithy-async`\n    - `smithy-client` -> `aws-smithy-client`\n    - `smithy-eventstream` -> `aws-smithy-eventstream`\n    - `smithy-http` -> `aws-smithy-http`\n    - `smithy-http-tower` -> `aws-smithy-http-tower`\n    - `smithy-json` -> `aws-smithy-json`\n    - `smithy-protocol-test` -> `aws-smithy-protocol-test`\n    - `smithy-query` -> `aws-smithy-query`\n    - `smithy-types` -> `aws-smithy-types`\n    - `smithy-xml` -> `aws-smithy-xml`\n  - Rust `use` statement changes:\n    - `smithy_async` -> `aws_smithy_async`\n    - `smithy_client` -> `aws_smithy_client`\n    - `smithy_eventstream` -> `aws_smithy_eventstream`\n    - `smithy_http` -> `aws_smithy_http`\n    - `smithy_http_tower` -> `aws_smithy_http_tower`\n    - `smithy_json` -> `aws_smithy_json`\n    - `smithy_protocol_test` -> `aws_smithy_protocol_test`\n    - `smithy_query` -> `aws_smithy_query`\n    - `smithy_types` -> `aws_smithy_types`\n    - `smithy_xml` -> `aws_smithy_xml`\n\n**New this week**\n\n- Filled in missing docs for services in the rustdoc documentation (smithy-rs#779)\n\nv0.26 (October 15th, 2021)\n=======================\n\n**Breaking Changes**\n\n- :warning: The `rust-codegen` plugin now requires a `moduleDescription` in the *smithy-build.json* file. This\n  property goes into the generated *Cargo.toml* file as the package description. (smithy-rs#766)\n\n**New this week**\n\n- Add `RustSettings` to `CodegenContext` (smithy-rs#616, smithy-rs#752)\n- Prepare crate manifests for publishing to crates.io (smithy-rs#755)\n- Generated *Cargo.toml* files can now be customized (smithy-rs#766)\n\nv0.25.1 (October 11th, 2021)\n=========================\n**New this week**\n- :bug: Re-add missing deserialization operations that were missing because of a typo in `HttpBoundProtocolGenerator.kt`\n\nv0.25 (October 7th, 2021)\n=========================\n**Breaking changes**\n- :warning: MSRV increased from 1.52.1 to 1.53.0 per our 3-behind MSRV policy.\n- :warning: `smithy_client::retry::Config` field `max_retries` is renamed to `max_attempts`\n  - This also brings a change to the semantics of the field. In the old version, setting `max_retries` to 3 would mean\n    that up to 4 requests could occur (1 initial request and 3 retries). In the new version, setting `max_attempts` to 3\n    would mean that up to 3 requests could occur (1 initial request and 2 retries).\n- :warning: `smithy_client::retry::Config::with_max_retries` method is renamed to `with_max_attempts`\n- :warning: Several classes in the codegen module were renamed and/or refactored (smithy-rs#735):\n  - `ProtocolConfig` became `CodegenContext` and moved to `software.amazon.smithy.rust.codegen.smithy`\n  - `HttpProtocolGenerator` became `ProtocolGenerator` and was refactored\n    to rely on composition instead of inheritance\n  - `HttpProtocolTestGenerator` became `ProtocolTestGenerator`\n  - `Protocol` moved into `software.amazon.smithy.rust.codegen.smithy.protocols`\n- `SmithyConnector` and `DynConnector` now return `ConnectorError` instead of `Box<dyn Error>`. If you have written a custom connector, it will need to be updated to return the new error type. (#744)\n- The `DispatchError` variant of `SdkError` now contains `ConnectorError` instead of `Box<dyn Error>` (#744).\n\n**New this week**\n\n- :bug: Fix an issue where `smithy-xml` may have generated invalid XML (smithy-rs#719)\n- Add `RetryConfig` struct for configuring retry behavior (smithy-rs#725)\n- :bug: Fix error when receiving empty event stream messages (smithy-rs#736)\n- :bug: Fix bug in event stream receiver that could cause the last events in the response stream to be lost (smithy-rs#736)\n- Add connect & HTTP read timeouts to IMDS, defaulting to 1 second\n- IO and timeout errors from Hyper can now be retried (#744)\n\n**Contributors**\n\nThank you for your contributions! :heart:\n* @obi1kenobi (smithy-rs#719)\n* @guyilin-amazon (smithy-rs#750)\n\nv0.24 (September 24th, 2021)\n============================\n\n**New This Week**\n\n- Add IMDS credential provider to `aws-config` (smithy-rs#709)\n- Add IMDS client to `aws-config` (smithy-rs#701)\n- Add `TimeSource` to `aws_types::os_shim_internal` (smithy-rs#701)\n- User agent construction is now `const fn` (smithy-rs#701)\n- Add `sts::AssumeRoleProvider` to `aws-config` (smithy-rs#703, aws-sdk-rust#3)\n- Add IMDS region provider to `aws-config` (smithy-rs#715)\n- Add query param signing to the `aws-sigv4` crate (smithy-rs#707)\n- :bug: Update event stream `Receiver`s to be `Send` (smithy-rs#702, #aws-sdk-rust#224)\n\nv0.23 (September 14th, 2021)\n=======================\n\n**New This Week**\n- :bug: Fixes issue where `Content-Length` header could be duplicated leading to signing failure (aws-sdk-rust#220, smithy-rs#697)\n- :bug: Fixes naming collision during generation of model shapes that collide with `<operationname>Input` and `<operationname>Output` (#699)\n\nv0.22 (September 2nd, 2021)\n===========================\n\nThis release adds support for three commonly requested features:\n- More powerful credential chain\n- Support for constructing multiple clients from the same configuration\n- Support for Transcribe streaming and S3 Select\n\nIn addition, this overhauls client configuration which lead to a number of breaking changes. Detailed changes are inline.\n\nCurrent Credential Provider Support:\n- [x] Environment variables\n- [x] Web Identity Token Credentials\n- [ ] Profile file support (partial)\n  - [ ] Credentials\n    - [ ] SSO\n    - [ ] ECS Credential source\n    - [ ] IMDS credential source\n    - [x] Assume role from source profile\n    - [x] Static credentials source profile\n    - [x] WebTokenIdentity provider\n  - [x] Region\n- [ ] IMDS\n- [ ] ECS\n\nUpgrade Guide\n-------------\n\n### If you use `<sdk>::Client::from_env`\n\n`from_env` loaded region & credentials from environment variables _only_. Default sources have been removed from the generated\nSDK clients and moved to the `aws-config` package. Note that the `aws-config` package default chain adds support for\nprofile file and web identity token profiles.\n\n1. Add a dependency on `aws-config`:\n     ```toml\n     [dependencies]\n     aws-config = { git = \"https://github.com/awslabs/aws-sdk-rust\", tag = \"v0.0.17-alpha\" }\n     ```\n2. Update your client creation code:\n   ```rust\n   // `shared_config` can be used to construct multiple different service clients!\n   let shared_config = aws_config::load_from_env().await;\n   // before: <service>::Client::from_env();\n   let client = <service>::Client::new(&shared_config)\n   ```\n\n### If you used `<client>::Config::builder()`\n\n`Config::build()` has been modified to _not_ fallback to a default provider. Instead, use `aws-config` to load and modify\nthe default chain. Note that when you switch to `aws-config`, support for profile files and web identity tokens will be added.\n\n1. Add a dependency on `aws-config`:\n     ```toml\n     [dependencies]\n     aws-config = { git = \"https://github.com/awslabs/aws-sdk-rust\", tag = \"v0.0.17-alpha\" }\n     ```\n\n2. Update your client creation code:\n\n   ```rust\n   fn before() {\n     let region = aws_types::region::ChainProvider::first_try(<1 provider>).or_default_provider();\n     let config = <service>::Config::builder().region(region).build();\n     let client = <service>::Client::from_conf(&config);\n   }\n\n   async fn after() {\n     use aws_config::meta::region::RegionProviderChain;\n     let region_provider = RegionProviderChain::first_try(<1 provider>).or_default_provider();\n     // `shared_config` can be used to construct multiple different service clients!\n     let shared_config = aws_config::from_env().region(region_provider).load().await;\n     let client = <service>::Client::new(&shared_config)\n   }\n   ```\n\n### If you used `aws-auth-providers`\nAll credential providers that were in `aws-auth-providers` have been moved to `aws-config`. Unless you have a specific use case\nfor a specific credential provider, you should use the default provider chain:\n\n```rust\n let shared_config = aws_config::load_from_env().await;\n let client = <service>::Client::new(&shared_config);\n```\n\n### If you maintain your own credential provider\n\n`AsyncProvideCredentials` has been renamed to `ProvideCredentials`. The trait has been moved from `aws-auth` to `aws-types`.\nThe original `ProvideCredentials` trait has been removed. The return type has been changed to by a custom future.\n\nFor synchronous use cases:\n```rust\nuse aws_types::credentials::{ProvideCredentials, future};\n\n#[derive(Debug)]\nstruct CustomCreds;\nimpl ProvideCredentials for CustomCreds {\n  fn provide_credentials<'a>(&'a self) -> future::ProvideCredentials<'a>\n    where\n            Self: 'a,\n  {\n    // if your credentials are synchronous, use `::ready`\n    // if your credentials are loaded asynchronously, use `::new`\n    future::ProvideCredentials::ready(todo!()) // your credentials go here\n  }\n}\n```\n\nFor asynchronous use cases:\n```rust\nuse aws_types::credentials::{ProvideCredentials, future, Result};\n\n#[derive(Debug)]\nstruct CustomAsyncCreds;\nimpl CustomAsyncCreds {\n  async fn load_credentials(&self) -> Result {\n    Ok(Credentials::from_keys(\"my creds...\", \"secret\", None))\n  }\n}\n\nimpl ProvideCredentials for CustomCreds {\n  fn provide_credentials<'a>(&'a self) -> future::ProvideCredentials<'a>\n    where\n            Self: 'a,\n  {\n    future::ProvideCredentials::new(self.load_credentials())\n  }\n}\n```\n\nChanges\n-------\n\n**Breaking Changes**\n\n- Credential providers from `aws-auth-providers` have been moved to `aws-config` (#678)\n- `AsyncProvideCredentials` has been renamed to `ProvideCredentials`. The original non-async provide credentials has been\n  removed. See the migration guide above.\n- `<sevicename>::from_env()` has been removed (#675). A drop-in replacement is available:\n  1. Add a dependency on `aws-config`:\n     ```toml\n     [dependencies]\n     aws-config = { git = \"https://github.com/awslabs/aws-sdk-rust\", tag = \"v0.0.17-alpha\" }\n     ```\n  2. Update your client creation code:\n     ```rust\n     let client = <service>>::Client::new(&aws_config::load_from_env().await)\n     ```\n\n- `ProvideRegion` has been moved to `aws_config::meta::region::ProvideRegion`. (#675)\n- `aws_types::region::ChainProvider` has been moved to `aws_config::meta::region::RegionProviderChain` (#675).\n- `ProvideRegion` is now asynchronous. Code that called `provider.region()` must be changed to `provider.region().await`.\n- `<awsservice>::Config::builder()` will **not** load a default region. To preserve previous behavior:\n  1. Add a dependency on `aws-config`:\n     ```toml\n     [dependencies]\n     aws-config = { git = \"https://github.com/awslabs/aws-sdk-rust\", tag = \"v0.0.17-alpha\" }\n     ```\n  2. ```rust\n     let shared_config = aws_config::load_from_env().await;\n     let config = <service>::config::Builder::from(&shared_config).<other builder modifications>.build();\n     ```\n- `Request` and `Response` in `smithy_http::operation` now use `SharedPropertyBag` instead of `Arc<Mutex<PropertyBag>>`. Use the `acquire` and `acquire_mut` methods to get a reference to the underlying `PropertyBag` to access properties. (#667)\n\n**New this week**\n\n- :tada: Add profile file provider for region (#594, #682)\n- :tada: Add support for shared configuration between multiple services (#673)\n- :tada: Add support for Transcribe `StartStreamTranscription` and S3 `SelectObjectContent` operations (#667)\n- :tada: Add support for new MemoryDB service (#677)\n- Improve documentation on collection-aware builders (#664)\n- Update AWS SDK models (#677)\n- :bug: Fix sigv4 signing when request ALPN negotiates to HTTP/2. (#674)\n- :bug: Fix integer size on S3 `Size` (#679, aws-sdk-rust#209)\n- :bug: Fix JSON parsing issue for modeled empty structs (#683, aws-sdk-rust#212)\n- :bug: Fix acronym case disagreement between FluentClientGenerator and HttpProtocolGenerator type aliasing (#668)\n\n**Internal Changes**\n\n- Add Event Stream support for restJson1 and restXml (#653, #667)\n- Add NowOrLater future to smithy-async (#672)\n\n\nv0.21 (August 19th, 2021)\n=========================\n\n**New This Week**\n\n- :tada: Add Chime Identity, Chime Messaging, and Snow Device Management support (#657)\n- :tada: Add profile file credential provider implementation. This implementation currently does not support credential sources for assume role providers other than environment variables. (#640)\n- :tada: Add support for WebIdentityToken providers via profile & environment variables. (#654)\n- :bug: Fix name collision that occurred when a model had both a union and a structure named `Result` (#643)\n- :bug: Fix STS Assume Role with WebIdentity & Assume role with SAML to support clients with no credentials provided (#652)\n- Update AWS SDK models (#657)\n- Add initial implementation of a default provider chain. (#650)\n\n**Internal Changes**\n\n- Update sigv4 tests to work around behavior change in httparse 1.5. (#656)\n- Remove Bintray/JCenter source from gradle build. (#651)\n- Add experimental `dvr` module to smithy-client. This will enable easier testing of HTTP traffic. (#640)\n- Update smithy-client to simplify creating HTTP/HTTPS connectors (#650)\n- Add Event Stream support to aws-sigv4 (#648)\n- Add support for the smithy auth trait. This enables authorizations that explicitly disable authorization to work when no credentials have been provided. (#652)\n\nv0.20 (August 10th, 2021)\n=========================\n\n**Breaking changes**\n\n- (#635) The `config()`, `config_mut()`, `request()`, and `request_mut()` methods on `operation::Request` have been\n  renamed to `properties()`, `properties_mut()`, `http()`, and `http_mut()` respectively.\n- (#635) The `Response` type on Tower middleware has been changed from `http::Response<SdkBody>`\n  to `operation::Response`. The HTTP response is still available from the `operation::Response` using its `http()`\n  and `http_mut()` methods.\n- (#635) The `ParseHttpResponse` trait's `parse_unloaded()` method now takes an `operation::Response` rather than\n  an `http::Response<SdkBody>`.\n- (#626) `ParseHttpResponse` no longer has a generic argument for the body type, but instead, always uses `SdkBody`.\n  This may cause compilation failures for you if you are using Smithy generated types to parse JSON or XML without using\n  a client to request data from a service. The fix should be as simple as removing `<SdkBody>` in the example below:\n\n  Before:\n  ```rust\n  let output = <Query as ParseHttpResponse<SdkBody>>::parse_loaded(&parser, &response).unwrap();\n  ```\n\n  After:\n  ```rust\n  let output = <Query as ParseHttpResponse>::parse_loaded(&parser, &response).unwrap();\n  ```\n\n**New This Week**\n\n- Add AssumeRoleProvider parser implementation. (#632)\n- The closure passed to `provide_credentials_fn` can now borrow values (#637)\n- Add `Sender`/`Receiver` implementations for Event Stream (#639)\n- Bring in the latest AWS models (#630)\n\nv0.19 (August 3rd, 2021)\n========================\n\nIoT Data Plane is now available! If you discover it isn't functioning as expected, please let us know!\n\nThis week also sees the addition of a robust async caching credentials provider. Take a look at the\n[STS example](https://github.com/smithy-lang/smithy-rs/blob/7fa4af4a9367aeca6d55e26fc4d4ba93093b90c4/aws/sdk/examples/sts/src/bin/credentials-provider.rs)\nto see how to use it.\n\n**New This Week**\n\n- :tada: Add IoT Data Plane (#624)\n- :tada: Add LazyCachingCredentialsProvider to aws-auth for use with expiring credentials, such as STS AssumeRole.\n  Update STS example to use this new provider (#578, #595)\n- :bug: Correctly encode HTTP Checksums using base64 instead of hex. Fixes aws-sdk-rust#164. (#615)\n- Update SDK gradle build logic to use gradle properties (#620)\n- Overhaul serialization/deserialization of numeric/boolean types. This resolves issues around serialization of\n  NaN/Infinity and should also reduce the number of allocations required during serialization. (#618)\n- Update SQS example to clarify usage of FIFO vs. standard queues (#622, @trevorrobertsjr)\n- Implement Event Stream frame encoding/decoding (#609, #619)\n\n**Contributions**\n\nThank you for your contributions! :heart:\n\n- @trevorrobertsjr (#622)\n\nv0.18.1 (July 27th 2021)\n========================\n\n- Remove timestreamwrite and timestreamquery from the generated services (#613)\n\nv0.18 (July 27th 2021)\n======================\n\n**Breaking changes**\n\n- `test-util` has been made an optional dependency and has moved from aws-hyper to smithy-http. If you were relying\n  on `aws_hyper::TestConnection`, add `smithy-client` as a dependency and enable the optional `test-util` feature. This\n  prunes some unnecessary dependencies on `roxmltree` and `serde_json`\n  for most users. (#608)\n\n**New This Week**\n\n- :tada: Release all but three remaining AWS services! Glacier, IoT Data Plane and Transcribe streaming will be\n  available in a future release. If you discover that a service isn't functioning as expected please let us know! (#607)\n- :bug: Bugfix: Fix parsing bug where parsing XML incorrectly stripped whitespace (#590, aws-sdk-rust#153)\n- Establish common abstraction for environment variables (#594)\n- Add windows to the test matrix (#594)\n- :bug: Bugfix: Constrain RFC-3339 timestamp formatting to microsecond precision (#596)\n\nv0.17 (July 15th 2021)\n======================\n\n**New this Week**\n\n- :tada: Add support for Autoscaling (#576, #582)\n- `AsyncProvideCredentials` now introduces an additional lifetime parameter, simplifying bridging it\n  with `#[async_trait]` interfaces\n- Fix S3 bug when content type was set explicitly (aws-sdk-rust#131, #566, @eagletmt)\n\n**Contributions**\n\nThank you for your contributions! :heart:\n\n- @eagletmt (#566)\n\nv0.16 (July 6th 2021)\n=====================\n\n**New this Week**\n\n- :warning: **Breaking Change:** `ProvideCredentials` and `CredentialError` were both moved into `aws_auth::provider`\n  when they were previously in `aws_auth` (#572)\n- :tada: Add support for AWS Config (#570)\n- :tada: Add support for EBS (#567)\n- :tada: Add support for Cognito (#573)\n- :tada: Add support for Snowball (#579, @landonxjames)\n- Make it possible to asynchronously provide credentials with `provide_credentials_fn` (#572, #577)\n- Improve RDS, QLDB, Polly, and KMS examples (#561, #560, #558, #556, #550)\n- Update AWS SDK models (#575)\n- :bug: Bugfix: Fill in message from error response even when it doesn't match the modeled case format (#565)\n\n**Internal Changes**\n\n- Add support for `@unsignedPayload` Smithy trait (#567)\n- Strip service/api/client suffix from sdkId (#546)\n- Remove idempotency token trait (#571)\n\n**Contributions**\n\nThank you for your contributions! :heart:\n\n- landonxjames (#579)\n\nv0.15 (June 29th 2021)\n======================\n\nThis week, we've added EKS, ECR and Cloudwatch. The JSON deserialization implementation has been replaced, please be on\nthe lookout for potential issues.\n\n**New this Week**\n\n- :tada: Add support for ECR (#557)\n- :tada: Add support for Cloudwatch (#554)\n- :tada: Add support for EKS (#553)\n- :warn: **Breaking Change:** httpLabel no longer causes fields to be non-optional. (#537)\n- :warn: **Breaking Change:** `Exception` is not renamed to `Error`. Code may need to be updated to replace `exception`\n  with `error`\n- Add more SES examples, and improve examples for Batch.\n- Improved error handling ergonomics: Errors now provide `is_<variantname>()` methods to simplify error handling\n- :bug: Bugfix: fix bug where invalid query strings could be generated (#531, @eagletmt)\n\n**Internal Changes**\n\n- Pin CI version to 1.52.1 (#532)\n- New JSON deserializer implementation (#530)\n- Fix numerous namespace collision bugs (#539)\n- Gracefully handle empty response bodies during JSON parsing (#553)\n\n**Contributors**\n\nThank you for your contributions! :heart:\n\n- @eagletmt (#531)\n\nv0.14 (June 22nd 2021)\n======================\n\nThis week, we've added CloudWatch Logs support and fixed several bugs in the generated S3 clients. There are a few\nbreaking changes this week.\n\n**New this Week**\n\n- :tada: Add support for CloudWatch Logs (#526)\n- :warning: **Breaking Change:** The `set_*` functions on generated Builders now always take an `Option` (#506)\n- :warning: **Breaking Change:** Unions with Documents will see the inner document type change from `Option<Document>`\n  to `Document` (#520)\n- :warning: **Breaking Change:** The `as_*` functions on unions now return `Result` rather than `Option` to clearly\n  indicate what the actual value is (#527)\n- Add more S3 examples, and improve SNS, SQS, and SageMaker examples. Improve example doc comments (#490, #508, #509,\n  #510, #511, #512, #513, #524)\n- :bug: Bugfix: Show response body in trace logs for calls that don't return a stream (#514)\n- :bug: Bugfix: Correctly parse S3's GetBucketLocation response (#516)\n- :bug: Bugfix: Correctly URL-encode tilde characters before SigV4 signing (#519)\n- :bug: Bugfix: Fix S3 PutBucketLifecycle operation by adding support for the `@httpChecksumRequired` Smithy trait (\n  #523)\n- :bug: Bugfix: Correctly parse non-list headers with commas in them (#525, @eagletmt)\n\n**Internal Changes**\n\n- Reduce name collisions in generated code (#502)\n- Combine individual example packages into per-service example packages with multiple binaries (#481, #490)\n- Re-export HyperAdapter in smithy-client (#515, @zekisherif)\n- Add serialization/deserialization benchmark for DynamoDB to exercise restJson1 generated code (#507)\n\n**Contributions**\n\nThank you for your contributions! :heart:\n\n- @eagletmt (#525)\n- @zekisherif (#515)\n\nv0.13 (June 15th 2021)\n======================\n\nSmithy-rs now has codegen support for all AWS services! This week, we've added CloudFormation, SageMaker, EC2, and SES.\nMore details below.\n\n**New this Week**\n\n- :tada: Add support for CloudFormation (#500, @alistaim)\n- :tada: Add support for SageMaker (#473, @alistaim)\n- :tada: Add support for EC2 (#495)\n- :tada: Add support for SES (#499)\n- Add support for the EC2 Query protocol (#475)\n- Generate fluent builders for all smithy-rs clients (#496, @jonhoo)\n- :bug: Bugfix: RFC-3339 timestamps (`date-time` format in Smithy) are now formatted correctly (#479, #489)\n- :bug: Bugfix: Union and enum variants named Self no longer cause compile errors in generated code (#492)\n\n**Internal Changes**\n\n- Combine individual example packages into per-service example packages with multiple binaries (#477, #480, #482, #484,\n  #485, #486, #487, #491)\n- Work towards JSON deserialization overhaul (#474)\n- Make deserializer function naming consistent between XML and JSON deserializers (#497)\n\nContributors:\n\n- @Doug-AWS\n- @jdisanti\n- @rcoh\n- @alistaim\n- @jonhoo\n\nThanks!!\n\nv0.12 (June 8th 2021)\n=====================\n\nStarting this week, smithy-rs now has codegen support for all AWS services except EC2. This week we’ve added MediaLive,\nMediaPackage, SNS, Batch, STS, RDS, RDSData, Route53, and IAM. More details below.\n\n**New this Week**\n\n- :tada: Add support for MediaLive and MediaPackage (#449, @alastaim)\n- :tada: Add support for SNS (#450)\n- :tada: Add support for Batch (#452, @alistaim)\n- :tada: Add support for STS. **Note:** This does not include support for an STS-based credential provider although an\n  example is provided. (#453)\n- :tada: Add support for RDS (#455) and RDS-Data (#470). (@LMJW)\n- :tada: Add support for Route53 (#457, @alistaim)\n- Support AWS Endpoints & Regions. With this update, regions like `iam-fips` and `cn-north-1` will now resolve to the\n  correct endpoint. Please report any issues with endpoint resolution. (#468)\n- :bug: Bugfix: Primitive numerics and booleans are now filtered from serialization when they are 0 and not marked as\n  required. This resolves issues where maxResults needed to be set even though it is optional. (#451)\n- :bug: Bugfix: S3 Head Object returned the wrong error when the object did not exist (#460, fixes #456)\n\n**Internal Changes**\n\n- Remove unused key “build” from smithy-build.json and Rust settings (#447)\n- Split SDK CI jobs for faster builds & reporting (#446)\n- Fix broken doc link in JSON serializer (@LMJW)\n- Work towards JSON deserialization overhaul (#454, #462)\n\nContributors:\n\n- @rcoh\n- @jdisanti\n- @alistaim\n- @LMJW\n\nThanks!!\n\nv0.11 (June 1st, 2021)\n======================\n\n**New this week:**\n\n- :tada: Add support for SQS. SQS is our first service to use the awsQuery protocol. Please report any issues you may\n  encounter.\n- :tada: Add support for ECS.\n- **Breaking Change**: Refactored `smithy_types::Error` to be more flexible. Internal fields of `Error` are now private\n  and can now be accessed accessor functions. (#426)\n- `ByteStream::from_path` now accepts `implications AsRef<Path>` (@LMJW)\n- Add support for S3 extended request id (#429)\n- Add support for the awsQuery protocol. smithy-rs can now add support for all services except EC2.\n- **Bugfix**: Timestamps that fell precisely on minute boundaries were not properly formatted (#435)\n- Improve documentation for `ByteStream` & add `pub use` (#443)\n- Add support for `EndpointPrefix` used\n  by [`s3::WriteGetObjectResponse`](https://awslabs.github.io/aws-sdk-rust/aws_sdk_s3/operation/struct.WriteGetObjectResponse.html) (\n  #420)\n\n**Smithy Internals**\n\n- Rewrite JSON serializer (#411, #423, #416, #427)\n- Remove dead “rootProject” setting in `smithy-build.json`\n- **Bugfix:** Idempotency tokens were not properly generated when operations were used by resources\n\nContributors:\n\n- @jdisanti\n- @rcoh\n- @LMJW\n\nThanks!\n"
  },
  {
    "path": "CODEOWNERS",
    "content": "*                                                   @smithy-lang/aws-sdk-rust\n\n# Server\n/codegen-server-test/                               @smithy-lang/smithy-rs-server\n/codegen-server/                                    @smithy-lang/smithy-rs-server\n/rust-runtime/aws-smithy-http-server/               @smithy-lang/smithy-rs-server\n/rust-runtime/aws-smithy-legacy-http-server/        @smithy-lang/smithy-rs-server\n/rust-runtime/aws-smithy-http-server-metrics        @smithy-lang/smithy-rs-server\n/rust-runtime/aws-smithy-http-server-metrics-macro  @smithy-lang/smithy-rs-server\n\n# Python Server\n/codegen-server-test/python/                        @smithy-lang/smithy-rs-server\n/codegen-server/python/                             @smithy-lang/smithy-rs-server\n/rust-runtime/aws-smithy-http-server-python/        @smithy-lang/smithy-rs-server\n\n# Typescript Server\n/codegen-server-test/typescript/                    @smithy-lang/smithy-rs-server\n/codegen-server/typescript/                         @smithy-lang/smithy-rs-server\n/rust-runtime/aws-smithy-http-server-typescript/    @smithy-lang/smithy-rs-server\n\n# Shared ownership\n/.changelog/                                        @smithy-lang/aws-sdk-rust @smithy-lang/smithy-rs-server\n/.github/                                           @smithy-lang/aws-sdk-rust @smithy-lang/smithy-rs-server\n/CHANGELOG.md                                       @smithy-lang/aws-sdk-rust @smithy-lang/smithy-rs-server\n/README.md                                          @smithy-lang/aws-sdk-rust @smithy-lang/smithy-rs-server\n/build.gradle.kts                                   @smithy-lang/aws-sdk-rust @smithy-lang/smithy-rs-server\n/buildSrc/                                          @smithy-lang/aws-sdk-rust @smithy-lang/smithy-rs-server\n/codegen-core/                                      @smithy-lang/aws-sdk-rust @smithy-lang/smithy-rs-server\n/design/                                            @smithy-lang/aws-sdk-rust @smithy-lang/smithy-rs-server\n/examples/                                          @smithy-lang/aws-sdk-rust @smithy-lang/smithy-rs-server\n/gradle.properties                                  @smithy-lang/aws-sdk-rust @smithy-lang/smithy-rs-server\n/tools/                                             @smithy-lang/aws-sdk-rust @smithy-lang/smithy-rs-server\n/rust-runtime/aws-smithy-async/                     @smithy-lang/aws-sdk-rust @smithy-lang/smithy-rs-server\n/rust-runtime/aws-smithy-eventstream/               @smithy-lang/aws-sdk-rust @smithy-lang/smithy-rs-server\n/rust-runtime/aws-smithy-http/                      @smithy-lang/aws-sdk-rust @smithy-lang/smithy-rs-server\n/rust-runtime/aws-smithy-json/                      @smithy-lang/aws-sdk-rust @smithy-lang/smithy-rs-server\n/rust-runtime/aws-smithy-protocol-test/             @smithy-lang/aws-sdk-rust @smithy-lang/smithy-rs-server\n/rust-runtime/aws-smithy-types/                     @smithy-lang/aws-sdk-rust @smithy-lang/smithy-rs-server\n/rust-runtime/aws-smithy-types-convert/             @smithy-lang/aws-sdk-rust @smithy-lang/smithy-rs-server\n/rust-runtime/aws-smithy-xml/                       @smithy-lang/aws-sdk-rust @smithy-lang/smithy-rs-server\n/rust-runtime/inlineable/                           @smithy-lang/aws-sdk-rust @smithy-lang/smithy-rs-server\n/rust-runtime/build.gradle.kts                      @smithy-lang/aws-sdk-rust @smithy-lang/smithy-rs-server\n/rust-runtime/Cargo.toml                            @smithy-lang/aws-sdk-rust @smithy-lang/smithy-rs-server\n"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "content": "## Code of Conduct\nThis project has adopted the [Amazon Open Source Code of Conduct](https://aws.github.io/code-of-conduct).\nFor more information see the [Code of Conduct FAQ](https://aws.github.io/code-of-conduct-faq) or contact\nopensource-codeofconduct@amazon.com with any additional questions or comments.\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# Contributing Guidelines\n\nThank you for your interest in contributing to our project. Whether it's a bug report, new feature, correction, or additional\ndocumentation, we greatly value feedback and contributions from our community.\n\nPlease read through this document before submitting any issues or pull requests to ensure we have all the necessary\ninformation to effectively respond to your bug report or contribution.\n\n\n## Reporting Bugs/Feature Requests\n\nWe welcome you to use the GitHub issue tracker to report bugs or suggest features.\n\nWhen filing an issue, please check existing open, or recently closed, issues to make sure somebody else hasn't already\nreported the issue. Please try to include as much information as you can. Details like these are incredibly useful:\n\n* A reproducible test case or series of steps\n* The version of our code being used\n* Any modifications you've made relevant to the bug\n* Anything unusual about your environment or deployment\n\n\n## Contributing via Pull Requests\nContributions via pull requests are much appreciated. Before sending us a pull request, please ensure that:\n\n1. You are working against the latest source on the *main* branch.\n2. You check existing open, and recently merged, pull requests to make sure someone else hasn't addressed the problem already.\n3. **You open an issue to discuss any significant work** - we would hate for your time to be wasted. Alternatively, you\n   may submit an RFC. You can learn about our RFC process [here](./design/src/rfcs/overview.md).\n\nTo send us a pull request, please:\n\n1. Fork the repository.\n2. Modify the source; please focus on the specific change you are contributing. If you also reformat all the code, it will be hard for us to focus on your change.\n3. Ensure local tests pass.\n4. Commit to your fork using clear commit messages.\n5. Send us a pull request, answering any default questions in the pull request interface. To create a changelog entry Markdown file in the `.changelog` directory, you can do either of the following:\n   - Use the `new` subcommand of [changelogger](https://github.com/smithy-lang/smithy-rs/tree/main/tools/ci-build/changelogger) CLI (**preferred**)\n   - Create one manually. Name the file `XXX.md`, where `XXX` can be any name you choose, as long as it is unique in the `.changelog` directory. Ensure the contents follow Markdown syntax with the YAML front matter. For reference, see [.example](https://github.com/smithy-lang/smithy-rs/blob/3e250cf9f61ee17ccd66e16314d4e47f3dd95e25/.changelog/.example) or other Markdown files in the `.changelog` directory.\n6. Include updated Cargo lockfiles in your pull request if you have modified the `aws-config` crate or any crate(s) (excluding `inlineable`) under  the [rust-runtime](https://github.com/smithy-lang/smithy-rs/tree/main/rust-runtime) or the [aws/rust-runtime](https://github.com/smithy-lang/smithy-rs/tree/main/aws/rust-runtime) workspaces.\n   - If you encounter merge conflicts in a lockfile when merging the latest main branch into your branch, resolve the conflicts by running  `git checkout --theirs <path to lockfile>` to keep the changes from the main branch and rerun the tests for the updated crate.\n7. Pay attention to any automated CI failures reported in the pull request, and stay involved in the conversation.\n8. Ask maintainers to manually trigger [canary](https://github.com/smithy-lang/smithy-rs/actions/workflows/manual-canary.yml) and [PR bot](https://github.com/smithy-lang/smithy-rs/actions/workflows/manual-pull-request-bot.yml) workflows using your pull request number. Those workflows cannot run in your fork and are always skipped as such.\n\nGitHub provides additional document on [forking a repository](https://help.github.com/articles/fork-a-repo/) and\n[creating a pull request](https://help.github.com/articles/creating-a-pull-request/).\n\n\n## Finding contributions to work on\nLooking at the existing issues is a great way to find something to contribute on. As our projects, by default, use the default GitHub issue labels (enhancement/bug/duplicate/help wanted/invalid/question/wontfix), looking at any 'help wanted' issues is a great place to start.\n\n\n## Code of Conduct\nThis project has adopted the [Amazon Open Source Code of Conduct](https://aws.github.io/code-of-conduct).\nFor more information see the [Code of Conduct FAQ](https://aws.github.io/code-of-conduct-faq) or contact\nopensource-codeofconduct@amazon.com with any additional questions or comments.\n\n\n## Reporting a Vulnerability\n\nIf you discover a potential security issue in this project we ask that you notify AWS/Amazon Security\nvia our [vulnerability reporting page](http://aws.amazon.com/security/vulnerability-reporting/) or directly via email to aws-security@amazon.com.\nPlease do **not** create a public GitHub issue.\n\n\n## Licensing\n\nSee the [LICENSE](LICENSE) file for our project's licensing. We will ask you to confirm the licensing of your contribution.\n\n## More helpful information for contributors\n\nPart of our [design docs](./design/src/overview.md) are dedicated to helpful information for contributors.\n[Take a look](./design/src/contributing/overview.md).\n"
  },
  {
    "path": "LICENSE",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n"
  },
  {
    "path": "NOTICE",
    "content": "Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n"
  },
  {
    "path": "README.md",
    "content": "Smithy Rust [![CI on Branch `main`](https://github.com/smithy-lang/smithy-rs/actions/workflows/ci-main.yml/badge.svg)](https://github.com/smithy-lang/smithy-rs/actions/workflows/ci-main.yml)\n==================================================================================\n\nSmithy code generators for Rust that generate clients, servers, and the entire AWS SDK.\nThe latest unreleased SDK build can be found in [aws-sdk-rust/next](https://github.com/awslabs/aws-sdk-rust/tree/next).\n\n[Design documentation](https://smithy-lang.github.io/smithy-rs/design/)\n\n**All internal and external interfaces are considered unstable and subject to change without notice.**\n\nSetup\n-----\n\n1. `./gradlew` will setup gradle for you. JDK 17 is required.\n2. Running tests requires a working Rust installation. See [Rust docs](https://www.rust-lang.org/learn/get-started) for\ninstallation instructions on your platform. The MSRV (**M**inimum **S**upported **R**ust **V**ersion) for the crates in this project is `stable-2`, i.e. the current `stable` Rust version and the prior two versions. Older versions may work.\n\nDevelopment\n-----------\n\nFor development, pre-commit hooks make it easier to pass automated linting when opening a pull request. Setup:\n```bash\nbrew install pre-commit # (or appropriate for your platform: https://pre-commit.com/)\npre-commit install\n```\n\nProject Layout\n--------------\n\n* `aws`: AWS specific codegen & Rust code (signing, endpoints, customizations, etc.)\n  Common commands:\n  * `./gradlew :aws:sdk:assemble`: Generate (but do not test / compile etc.) a fresh SDK into `sdk/build/aws-sdk`\n  * `./gradlew :aws:sdk:sdkTest`: Generate & run all tests for a fresh SDK. (Note that these tests require Go to be\n  installed for FIP support to compile properly)\n  * `./gradlew :aws:sdk:{cargoCheck, cargoTest, cargoDocs, cargoClippy}`: Generate & run specified cargo command.\n* `codegen-core`: Common code generation logic useful for clients and servers\n* `codegen-client`: Smithy client code generation\n* `codegen-client-test`: Smithy protocol test generation & integration tests for Smithy client whitelabel code\n* [`design`](design): Design documentation. See the [design/README.md](design/README.md) for details about building / viewing.\n* `codegen-server`: Smithy server code generation\n* `codegen-server-test`: Smithy protocol test generation & integration tests for Smithy server whitelabel code\n* `examples`: A collection of server implementation examples\n\nTesting\n-------\n\nRunning all of smithy-rs's tests can take a very long time, so it's better to know which parts\nto test based on the changes being made, and allow continuous integration to find other issues\nwhen posting a pull request.\n\nIn general, the components of smithy-rs affect each other in the following order (with earlier affecting later):\n\n1. `rust-runtime`\n2. `codegen` and `codegen-server`\n3. `aws/rust-runtime`\n4. `aws/codegen-aws-sdk`\n\nSome components, such as `codegen-client-test` and `codegen-server-test`, are purely for testing other components.\n\n### Testing `rust-runtime` and `aws/rust-runtime`\n\nTo test the `rust-runtime` crates:\n\n```bash\n# Run all Rust tests for `rust-runtime/` (from repo root):\ncargo test --manifest-path=rust-runtime/Cargo.toml\n# Run clippy for `rust-runtime/` (from repo root):\ncargo clippy --manifest-path=rust-runtime/Cargo.toml\n\n# Or\ncd rust-runtime\ncargo test\ncargo clippy\n```\n\nTo test the `aws/rust-runtime` crates:\n\n```bash\n# Run all Rust tests for `aws/rust-runtime/` (from repo root):\ncargo test --manifest-path=aws/rust-runtime/Cargo.toml\n# Run clippy for `aws/rust-runtime/` (from repo root):\ncargo clippy --manifest-path=aws/rust-runtime/Cargo.toml\n\n# Or\ncd aws/rust-runtime\ncargo test\ncargo clippy\n```\n\nSome runtime crates have a `additional-ci` script that can also be run. These scripts often require\n[`cargo-hack`](https://github.com/taiki-e/cargo-hack) and [`cargo-udeps`](https://github.com/est31/cargo-udeps)\nto be installed.\n\n### Testing Client/Server Codegen\n\nTo test the code generation, the following can be used:\n\n```bash\n# Run Kotlin codegen unit tests\n./gradlew codegen-core:check\n./gradlew codegen-client:check\n./gradlew codegen-server:check\n# Run client codegen tests\n./gradlew codegen-client-test:check\n# Run server codegen tests\n./gradlew codegen-server-test:check\n```\n\nSeveral Kotlin unit tests generate Rust projects and compile them. When these fail, they typically\noutput links to the location of the generated code so that it can be inspected.\n\nTo look at generated code when the codegen tests fail, check these paths depending on the test suite that's failing:\n- For codegen-client-test: `codegen-client-test/build/smithyprojections/codegen-client-test`\n- For codegen-server-test: `codegen-server-test/build/smithyprojections/codegen-server-test`\n\n### Testing SDK Codegen\n\nSee the readme in `aws/sdk/` for more information about these targets as they can be configured\nto generate more or less AWS service clients.\n\n```bash\n# Run Kotlin codegen unit tests\n./gradlew aws:codegen-aws-sdk:check\n# Generate an SDK, but do not attempt to compile / run tests. Useful for inspecting generated code\n./gradlew :aws:sdk:assemble\n# Run all the tests\n./gradlew :aws:sdk:sdkTest\n# Validate that the generated code compiles\n./gradlew :aws:sdk:cargoCheck\n# Validate that the generated code passes Clippy\n./gradlew :aws:sdk:cargoClippy\n# Validate the generated docs\n./gradlew :aws:sdk:cargoDoc\n```\n\nThe generated SDK will be placed in `aws/sdk/build/aws-sdk`.\n"
  },
  {
    "path": "aws/SDK_CHANGELOG.next.json",
    "content": "# This file will be used by automation when cutting a release of the SDK\n# to include code generator change log entries into the release notes.\n# This is an auto-generated file. Do not edit.\n\n{\n  \"smithy-rs\": [],\n  \"aws-sdk-rust\": [\n    {\n      \"message\": \"Upgrade MSRV to Rust 1.91.0.\\n\",\n      \"meta\": {\n        \"bug\": false,\n        \"breaking\": true,\n        \"tada\": false\n      },\n      \"author\": \"vcjana\",\n      \"references\": [],\n      \"since-commit\": \"4fcd5503215ba832f29bb246e23e1d9b20510d14\",\n      \"age\": 5\n    },\n    {\n      \"message\": \"Add full support for [AWS chunked content encoding](https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-streaming.html). AWS chunked content encoding enables streaming sigv4 for payloads without precomputing the sha256 of the entire payload. While this encoding was already used in S3's `PutObject` and `UploadPart` operations to support trailing checksums with non-chunked, unsigned streaming payloads, this release now splits streaming payloads into 64 KiB chunks by default (the last chunk may be smaller) and adds support for chunk signing (currently only activated for non-TLS requests).\\n\\nIf the default chunk size does not suit your use case, it can be configured via the service config:\\n```\\n// Custom chunk size\\nlet config = aws_sdk_s3::Config::builder()\\n    .aws_chunked_encoding_chunk_size(Some(10240)) // 10 KiB chunks\\n    // other configurations\\n    .build();\\nlet client = aws_sdk_s3::Client::from_conf(config);\\n```\\n\\n```\\n// Disable chunking (buffers entire body in memory and sends it as one chunk)\\nlet config = aws_sdk_s3::Config::builder()\\n    .aws_chunked_encoding_chunk_size(None)\\n    // other configurations\\n    .build();\\nlet client = aws_sdk_s3::Client::from_conf(config);\\n```\\n\",\n      \"meta\": {\n        \"bug\": true,\n        \"breaking\": false,\n        \"tada\": false\n      },\n      \"author\": \"ysaito1001\",\n      \"references\": [\n        \"smithy-rs#1798\",\n        \"smithy-rs#4188\"\n      ],\n      \"since-commit\": \"4fcd5503215ba832f29bb246e23e1d9b20510d14\",\n      \"age\": 5\n    },\n    {\n      \"message\": \"Change sha1 calculation in aws-config from ring to sha1 crate.\\n\",\n      \"meta\": {\n        \"bug\": false,\n        \"breaking\": false,\n        \"tada\": false\n      },\n      \"author\": \"markuskobler\",\n      \"references\": [\n        \"aws-sdk-rust#1317\"\n      ],\n      \"since-commit\": \"81d71b3312e7063e663909d5bb14443ad57c9e2a\",\n      \"age\": 3\n    },\n    {\n      \"message\": \"Fix bug where initial-request messages in event stream operations are not signed.\\n\",\n      \"meta\": {\n        \"bug\": true,\n        \"breaking\": false,\n        \"tada\": false\n      },\n      \"author\": [\n        \"rcoh\",\n        \"ysaito1001\"\n      ],\n      \"references\": [\n        \"smithy-rs#4429\"\n      ],\n      \"since-commit\": \"81d71b3312e7063e663909d5bb14443ad57c9e2a\",\n      \"age\": 3\n    },\n    {\n      \"message\": \"Fix null value handling in dense collections: SDK now correctly rejects null values in non-sparse collections instead of silently dropping them.\\n\",\n      \"meta\": {\n        \"bug\": true,\n        \"breaking\": false,\n        \"tada\": false\n      },\n      \"author\": \"vcjana\",\n      \"references\": [],\n      \"since-commit\": \"2d226ef3c59de83febdc6790e2bf2a44f43f1d1f\",\n      \"age\": 2\n    },\n    {\n      \"message\": \"Prevent memory leak in identity cache when overriding credentials via `config_override`. Each `config_override` that sets a credentials provider now uses an operation-scoped identity cache instead of the shared client-level cache, preventing unbounded partition growth. Additionally, the client-level identity cache now enforces a configurable `max_partitions` cap (default: 64) as a safety net.\\n\",\n      \"meta\": {\n        \"bug\": true,\n        \"breaking\": false,\n        \"tada\": false\n      },\n      \"author\": \"ysaito\",\n      \"references\": [\n        \"smithy-rs#4340\"\n      ],\n      \"since-commit\": \"00c6d6096f0d618545a7dece903770d8acb21114\",\n      \"age\": 1\n    },\n    {\n      \"message\": \"Fix `TokenBucket::is_full()` and `TokenBucket::is_empty()` to convert fractional tokens into whole permits before checking availability. Previously, accumulated fractional tokens from success rewards were not accounted for, causing these methods to return incorrect results.\\n\",\n      \"meta\": {\n        \"bug\": true,\n        \"breaking\": false,\n        \"tada\": false\n      },\n      \"author\": \"annahay4\",\n      \"references\": [\n        \"smithy-rs#4596\",\n        \"aws-sdk-rust#1423\"\n      ],\n      \"since-commit\": \"00c6d6096f0d618545a7dece903770d8acb21114\",\n      \"age\": 1\n    },\n    {\n      \"message\": \"Make `ProviderConfig::with_use_fips()` and `ProviderConfig::with_use_dual_stack()` public so that applications constructing a `ProviderConfig` directly can propagate FIPS and dual-stack settings to credential providers.\\n\",\n      \"meta\": {\n        \"bug\": false,\n        \"breaking\": false,\n        \"tada\": true\n      },\n      \"author\": \"hligit\",\n      \"references\": [\n        \"smithy-rs#4551\"\n      ],\n      \"since-commit\": \"00c6d6096f0d618545a7dece903770d8acb21114\",\n      \"age\": 1\n    },\n    {\n      \"message\": \"Upgrade `sha2` from 0.10.x to 0.11.x. The previous version defaulted to software-based compression instead of hardware-accelerated compression, resulting in lower throughput. The new version automatically detects and uses hardware-accelerated instructions when available.\\n\",\n      \"meta\": {\n        \"bug\": true,\n        \"breaking\": false,\n        \"tada\": false\n      },\n      \"author\": \"ysaito1001\",\n      \"references\": [\n        \"smithy-rs#4587\"\n      ],\n      \"since-commit\": \"00c6d6096f0d618545a7dece903770d8acb21114\",\n      \"age\": 1\n    },\n    {\n      \"message\": \"Optimize `Encoder::str()` and `Encoder::blob()` by collapsing multiple `write_all` calls into a single buffer operation. This bypasses minicbor's generic writer to write the CBOR type+length header and payload directly into the underlying `Vec<u8>`, improving performance on serialization-heavy hot paths.\\n\",\n      \"meta\": {\n        \"bug\": false,\n        \"breaking\": false,\n        \"tada\": false\n      },\n      \"author\": \"ysaito1001\",\n      \"references\": [\n        \"smithy-rs#4591\"\n      ],\n      \"since-commit\": \"00c6d6096f0d618545a7dece903770d8acb21114\",\n      \"age\": 1\n    },\n    {\n      \"message\": \"Fix waiter codegen failure when JMESPath `&&` or `||` expressions have non-boolean operands (e.g., a list field used as a truthiness check). Non-boolean types are now coerced to booleans using JMESPath truthiness rules: arrays and strings check `!is_empty()`, all other non-null types are truthy.\\n\",\n      \"meta\": {\n        \"bug\": true,\n        \"breaking\": false,\n        \"tada\": false\n      },\n      \"author\": \"ysaito1001\",\n      \"references\": [\n        \"smithy-rs#4599\"\n      ],\n      \"since-commit\": \"00c6d6096f0d618545a7dece903770d8acb21114\",\n      \"age\": 1\n    },\n    {\n      \"message\": \"Add `sigv4a_signing_region_set` client configuration. Supports programmatic, environment variable (`AWS_SIGV4A_SIGNING_REGION_SET`), and shared config file (`sigv4a_signing_region_set`) configuration. User-provided values now take priority over endpoint-resolved values.\\n\",\n      \"meta\": {\n        \"bug\": false,\n        \"breaking\": false,\n        \"tada\": true\n      },\n      \"author\": \"vcjana\",\n      \"references\": [\n        \"smithy-rs#4521\"\n      ],\n      \"since-commit\": \"00c6d6096f0d618545a7dece903770d8acb21114\",\n      \"age\": 1\n    },\n    {\n      \"message\": \"Add missing `EventOrInitial`, `EventOrInitialMarshaller`, and `EventStreamSender::into_inner` to `aws-smithy-legacy-http` event_stream module, fixing compilation failures in generated SDKs that reference these types.\\n\",\n      \"meta\": {\n        \"bug\": true,\n        \"breaking\": false,\n        \"tada\": false\n      },\n      \"author\": \"jlizen\",\n      \"references\": [\n        \"smithy-rs#4431\"\n      ],\n      \"since-commit\": \"00c6d6096f0d618545a7dece903770d8acb21114\",\n      \"age\": 1\n    }\n  ],\n  \"aws-sdk-model\": []\n}"
  },
  {
    "path": "aws/SDK_README.md.hb",
    "content": "{{!--\nThis is the README Handlebars template for `aws-sdk-rust`.\nIt gets instantiated and copied into the build artifacts by the `aws:sdk:assemble` build target.\n\nAvailable template arguments:\n- `{{sdk_version_<crate_name_in_snake_case>}}` (e.g., `{{sdk_version_aws_config}}` for the `aws-config` crate): the version number of the given crate (just the number, no `v` prefix)\n- `{{msrv}}`: The MSRV Rust compiler version (just the number, no `v` prefix)\n--}}\n<!--\nIMPORTANT:\nThis README file is auto-generated by the build system in smithy-lang/smithy-rs.\nTo update it, edit the `aws/SDK_README.md.hb` Handlebars template in that repository.\n-->\n\n# The AWS SDK for Rust [![Docs](https://img.shields.io/badge/docs-blue)](https://awslabs.github.io/aws-sdk-rust/) ![MSRV](https://img.shields.io/badge/msrv-{{msrv}}-red) [![Usage Guide](https://img.shields.io/badge/Developer_Guide-blue)](https://docs.aws.amazon.com/sdk-for-rust/latest/dg/welcome.html)\n\nThis repo contains the AWS SDK for Rust and its [public roadmap](https://github.com/orgs/awslabs/projects/50/views/1).\n\nThe SDK is code generated from [Smithy models](https://smithy.io/2.0/index.html) that represent each AWS service.\nThe code used to generate the SDK can be found in [smithy-rs](https://github.com/smithy-lang/smithy-rs).\n\n## Getting Started with the SDK\n\n> Examples are available for many services and operations, check out the [Rust examples](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/rustv1) in the `aws-doc-sdk-examples` repository.\n\n> For a step-by-step guide including several advanced use cases, check out the [Developer Guide](https://docs.aws.amazon.com/sdk-for-rust/latest/dg/welcome.html).\n\nThe SDK provides one crate per AWS service. You must add [Tokio](https://crates.io/crates/tokio) as a dependency within your Rust project to execute asynchronous code.\n\n1. Create a new Rust project: `cargo new sdk-example`\n2. Add dependencies to DynamoDB and Tokio to your **Cargo.toml** file:\n\n    ```toml\n    [dependencies]\n    aws-config = { version= \"{{sdk_version_aws_config}}\", features = [\"behavior-version-latest\"] }\n    aws-sdk-dynamodb = \"{{sdk_version_aws_sdk_dynamodb}}\"\n    tokio = { version = \"1\", features = [\"full\"] }\n    ```\n\n3. Provide your AWS credentials with the default credential provider chain, which currently looks in:\n   - Environment variables: `AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY`, and `AWS_REGION`\n   - The default credentials files located in `~/.aws/config` and `~/.aws/credentials` (location can vary per platform)\n   - Web Identity Token credentials from the environment or container (including EKS)\n   - ECS Container Credentials (IAM roles for tasks)\n   - EC2 Instance Metadata Service (IAM Roles attached to instance)\n\n4. Make a request using DynamoDB\n\n```rust\nuse aws_sdk_dynamodb::{Client, Error};\n\n#[tokio::main]\nasync fn main() -> Result<(), Error> {\n    let shared_config = aws_config::load_from_env().await;\n    let client = Client::new(&shared_config);\n    let req = client.list_tables().limit(10);\n    let resp = req.send().await?;\n    println!(\"Current DynamoDB tables: {:?}\", resp.table_names);\n    Ok(())\n}\n```\n\n### Prerequisites\n\nIn order to use the SDK, you must already have Rust and Cargo installed. If you don't, [these instructions](https://doc.rust-lang.org/book/ch01-01-installation.html) describe how to install Rust and Cargo.\n\n## Using the SDK\n\nDetailed usage instructions are available in the [Developer Guide](https://docs.aws.amazon.com/sdk-for-rust/latest/dg/welcome.html).\nSuggestions for additional sections or improvements for the guide are welcome. Please open an issue describing what you are trying to do.\n\n## Getting Help\n* [Developer Guide](https://docs.aws.amazon.com/sdk-for-rust/latest/dg/welcome.html)\n* [GitHub discussions](https://github.com/awslabs/aws-sdk-rust/discussions) - For ideas, RFCs & general questions\n* [GitHub issues](https://github.com/awslabs/aws-sdk-rust/issues/new/choose) – For bug reports & feature requests\n* [Generated Docs (latest version)](https://awslabs.github.io/aws-sdk-rust/)\n* [Usage examples](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/rustv1)\n\n## Feedback and Contributing\n\n### Feedback\n\nThe SDK uses **GitHub Issues** to track feature requests and issues with the SDK. In addition, we use **GitHub Projects** to provide users with a high level view of our roadmap and the features we're actively working on.\n\nYou can provide feedback or report a bug  by submitting a **GitHub issue**.\nThis is the preferred mechanism to give feedback so that other users can engage in the conversation, +1 issues, etc.\nIssues you open will be evaluated for our roadmap.\n\n### Contributing\n\nIf you are interested in contributing to the SDK, please take a look at [CONTRIBUTING](CONTRIBUTING.md)\n\n## Supported Rust Versions (MSRV)\n\nThe SDK currently requires a minimum of Rust {{msrv}}, and is not guaranteed to build on compiler versions\nearlier than that. We keep the minimum compiler version two releases behind the latest stable release where\npossible (so if the latest stable were 1.55, we would support 1.53). Increases in minimum required Rust\nversion will be called out in the Release Notes for new releases of the SDK.\n\n## Additional Resources\n\n- Design docs - Design documentation for the SDK lives in the [design folder of smithy-rs](https://github.com/smithy-lang/smithy-rs/tree/main/design).\n- Runtime / Handwritten code: The Rust Runtime code that underpins the SDK can be accessed [here](https://github.com/smithy-lang/smithy-rs/tree/main/rust-runtime) and [here](https://github.com/smithy-lang/smithy-rs/tree/main/aws/rust-runtime). This code is copied into this repo as part of code generation.\n- [Code Examples](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/rustv1)\n- [API reference documentation (rustdoc)](https://awslabs.github.io/aws-sdk-rust/)\n\n## Security\n\nSee [CONTRIBUTING](CONTRIBUTING.md#security-issue-notifications) for more information.\n\n## License\n\nThis project is licensed under the Apache-2.0 License.\n"
  },
  {
    "path": "aws/codegen-aws-sdk/build.gradle.kts",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nplugins {\n    id(\"smithy-rs.kotlin-conventions\")\n    id(\"smithy-rs.publishing-conventions\")\n}\n\ndescription = \"AWS Specific Customizations for Smithy code generation\"\nextra[\"displayName\"] = \"Smithy :: Rust :: AWS Codegen\"\nextra[\"moduleName\"] = \"software.amazon.smithy.rustsdk\"\n\ndependencies {\n    implementation(project(\":codegen-core\"))\n    implementation(project(\":codegen-client\"))\n    implementation(libs.jsoup)\n    implementation(libs.smithy.aws.traits)\n    implementation(libs.smithy.protocol.test.traits)\n    implementation(libs.smithy.rules.engine)\n    implementation(libs.smithy.aws.endpoints)\n    implementation(libs.smithy.smoke.test.traits)\n    implementation(libs.smithy.aws.smoke.test.model)\n\n\n    implementation(project(\":aws:aws-rust-runtime\"))\n    testImplementation(libs.junit.jupiter)\n    testImplementation(libs.kotest.assertions.core.jvm)\n}\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/main/kotlin/software/amazon/smithy/rustsdk/AccountIdEndpointParamsDecorator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rustsdk\n\nimport software.amazon.smithy.model.node.Node\nimport software.amazon.smithy.rulesengine.aws.language.functions.AwsBuiltIns\nimport software.amazon.smithy.rulesengine.language.syntax.parameters.Parameter\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ConditionalDecorator\nimport software.amazon.smithy.rust.codegen.client.smithy.endpoint.EndpointCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.endpoint.EndpointTypesGenerator\nimport software.amazon.smithy.rust.codegen.client.smithy.endpoint.rustName\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginSection\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.config.ServiceConfig\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.docsOrFallback\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.AdHocCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.adhocCustomization\nimport software.amazon.smithy.rust.codegen.core.util.dq\nimport software.amazon.smithy.rust.codegen.core.util.orNull\n\n/**\n * Client codegen decorator for the `AWS::Auth::AccountId` endpoint built-in parameter.\n *\n * The `AccountID` parameter is special because:\n * - The setters are neither exposed in `SdkConfig` nor in config builder.\n * - It does not require customizations like `loadBuiltInFromServiceConfig`,\n *  as it is not available when the `read_before_execution` method of the endpoint parameters interceptor is executed\n *  (the identity from which an account ID is retrieved has not been resolved yet).\n */\nclass AccountIdBuiltInParamDecorator : ConditionalDecorator(\n    predicate =\n        { codegenContext, _ ->\n            codegenContext?.let {\n                codegenContext.getBuiltIn(AwsBuiltIns.ACCOUNT_ID) != null\n            } ?: false\n        },\n    delegateTo =\n        object : ClientCodegenDecorator {\n            override val name: String get() = \"AccountIdBuiltInParamDecorator\"\n            override val order: Byte = 0\n\n            override fun endpointCustomizations(codegenContext: ClientCodegenContext): List<EndpointCustomization> =\n                listOf(\n                    object : EndpointCustomization {\n                        override fun serviceSpecificEndpointParamsFinalizer(\n                            codegenContext: ClientCodegenContext,\n                            params: String,\n                        ): Writable? {\n                            val runtimeConfig = codegenContext.runtimeConfig\n                            return writable {\n                                rustTemplate(\n                                    \"\"\"\n                                    // This is required to satisfy the borrow checker. By obtaining an `Option<Identity>`,\n                                    // `params` is no longer mutably borrowed in the match expression below.\n                                    // Furthermore, by using `std::mem::replace` with an empty `Identity`, we avoid\n                                    // leaving the sensitive `Identity` inside `params` within `EndpointResolverParams`.\n                                    let identity = $params\n                                        .get_property_mut::<#{Identity}>()\n                                        .map(|id| {\n                                            std::mem::replace(\n                                                id,\n                                                #{Identity}::new((), #{None}),\n                                            )\n                                        });\n                                    match (\n                                        $params.get_mut::<#{Params}>(),\n                                        identity\n                                            .as_ref()\n                                            .and_then(|id| id.property::<#{AccountId}>()),\n                                    ) {\n                                        (#{Some}(concrete_params), #{Some}(account_id)) => {\n                                            concrete_params.account_id = #{Some}(account_id.as_str().to_string());\n                                        }\n                                        (#{Some}(_), #{None}) => {\n                                            // No account ID; nothing to do.\n                                        }\n                                        (#{None}, _) => {\n                                            return #{Err}(\"service-specific endpoint params was not present\".into());\n                                        }\n                                    }\n                                    \"\"\",\n                                    *preludeScope,\n                                    \"AccountId\" to\n                                        AwsRuntimeType.awsCredentialTypes(runtimeConfig)\n                                            .resolve(\"attributes::AccountId\"),\n                                    \"Identity\" to\n                                        RuntimeType.smithyRuntimeApiClient(runtimeConfig)\n                                            .resolve(\"client::identity::Identity\"),\n                                    \"Params\" to EndpointTypesGenerator.fromContext(codegenContext).paramsStruct(),\n                                )\n                            }\n                        }\n                    },\n                )\n        },\n)\n\n/**\n * Client codegen decorator for the `AWS::Auth::AccountIdEndpointMode` endpoint built-in parameter.\n *\n * The `AccountIdEndpointMode` parameter is special because:\n * - The corresponding Rust type is an enum containing valid values\n */\nclass AccountIdEndpointModeBuiltInParamDecorator : ConditionalDecorator(\n    predicate =\n        { codegenContext, _ ->\n            codegenContext?.let {\n                codegenContext.getBuiltIn(AwsBuiltIns.ACCOUNT_ID_ENDPOINT_MODE) != null\n            } ?: false\n        },\n    delegateTo =\n        object : ClientCodegenDecorator {\n            override val name: String get() = \"AccountIdEndpointModeBuiltInParamDecorator\"\n            override val order: Byte = 0\n            private val paramName = AwsBuiltIns.ACCOUNT_ID_ENDPOINT_MODE.name.rustName()\n\n            override fun extraSections(codegenContext: ClientCodegenContext): List<AdHocCustomization> =\n                listOf(\n                    adhocCustomization<SdkConfigSection.CopySdkConfigToClientConfig> { section ->\n                        rust(\"${section.serviceConfigBuilder}.set_$paramName(${section.sdkConfig}.$paramName().cloned());\")\n                    },\n                )\n\n            override fun configCustomizations(\n                codegenContext: ClientCodegenContext,\n                baseCustomizations: List<ConfigCustomization>,\n            ): List<ConfigCustomization> {\n                return baseCustomizations +\n                    object : ConfigCustomization() {\n                        private val codegenScope =\n                            arrayOf(\n                                *preludeScope,\n                                \"AccountIdEndpointMode\" to\n                                    AwsRuntimeType.awsTypes(codegenContext.runtimeConfig)\n                                        .resolve(\"endpoint_config::AccountIdEndpointMode\"),\n                            )\n\n                        override fun section(section: ServiceConfig): Writable {\n                            return when (section) {\n                                ServiceConfig.BuilderImpl ->\n                                    writable {\n                                        val docs = AwsBuiltIns.ACCOUNT_ID_ENDPOINT_MODE.documentation.orNull()\n                                        docsOrFallback(docs)\n                                        rustTemplate(\n                                            \"\"\"\n                                            pub fn $paramName(mut self, $paramName: #{AccountIdEndpointMode}) -> Self {\n                                                self.set_$paramName(#{Some}($paramName));\n                                                self\n                                            }\"\"\",\n                                            *codegenScope,\n                                        )\n\n                                        docsOrFallback(docs)\n                                        rustTemplate(\n                                            \"\"\"\n                                            pub fn set_$paramName(&mut self, $paramName: #{Option}<#{AccountIdEndpointMode}>) -> &mut Self {\n                                                self.config.store_or_unset($paramName);\n                                                self\n                                            }\n                                            \"\"\",\n                                            *codegenScope,\n                                        )\n                                    }\n\n                                is ServiceConfig.BuilderFromConfigBag ->\n                                    writable {\n                                        rustTemplate(\n                                            \"\"\"\n                                            ${section.builder}.set_$paramName(${section.configBag}.load::<#{AccountIdEndpointMode}>().cloned());\n                                            \"\"\",\n                                            \"AccountIdEndpointMode\" to\n                                                AwsRuntimeType.awsTypes(codegenContext.runtimeConfig)\n                                                    .resolve(\"endpoint_config::AccountIdEndpointMode\"),\n                                        )\n                                    }\n\n                                else -> emptySection\n                            }\n                        }\n                    }\n            }\n\n            override fun endpointCustomizations(codegenContext: ClientCodegenContext): List<EndpointCustomization> =\n                listOf(\n                    object : EndpointCustomization {\n                        private val codegenScope =\n                            arrayOf(\n                                *preludeScope,\n                                \"AccountIdEndpointMode\" to\n                                    AwsRuntimeType.awsTypes(codegenContext.runtimeConfig)\n                                        .resolve(\"endpoint_config::AccountIdEndpointMode\"),\n                                \"AwsSdkFeature\" to\n                                    AwsRuntimeType.awsRuntime(codegenContext.runtimeConfig)\n                                        .resolve(\"sdk_feature::AwsSdkFeature\"),\n                                \"tracing\" to RuntimeType.Tracing,\n                            )\n\n                        override fun loadBuiltInFromServiceConfig(\n                            parameter: Parameter,\n                            configRef: String,\n                        ): Writable? =\n                            when (parameter) {\n                                AwsBuiltIns.ACCOUNT_ID_ENDPOINT_MODE -> {\n                                    writable {\n                                        rustTemplate(\n                                            \"#{Some}($configRef.load::<#{AccountIdEndpointMode}>().cloned().unwrap_or_default().to_string())\",\n                                            *codegenScope,\n                                        )\n                                    }\n                                }\n\n                                else -> null\n                            }\n\n                        // This override is for endpoint_tests.\n                        override fun setBuiltInOnServiceConfig(\n                            name: String,\n                            value: Node,\n                            configBuilderRef: String,\n                        ): Writable? {\n                            if (name != AwsBuiltIns.ACCOUNT_ID_ENDPOINT_MODE.builtIn.get()) {\n                                return null\n                            }\n                            return writable {\n                                rustTemplate(\n                                    \"\"\"let $configBuilderRef = $configBuilderRef.account_id_endpoint_mode(<#{AccountIdEndpointMode} as std::str::FromStr>::from_str(${value.expectStringNode().value.dq()}).expect(\"should parse\"));\"\"\",\n                                    *codegenScope,\n                                )\n                            }\n                        }\n                    },\n                )\n\n            override fun serviceRuntimePluginCustomizations(\n                codegenContext: ClientCodegenContext,\n                baseCustomizations: List<ServiceRuntimePluginCustomization>,\n            ): List<ServiceRuntimePluginCustomization> =\n                baseCustomizations + listOf(AccountIdEndpointFeatureTrackerInterceptor(codegenContext))\n        },\n)\n\nprivate class AccountIdEndpointFeatureTrackerInterceptor(codegenContext: ClientCodegenContext) :\n    ServiceRuntimePluginCustomization() {\n    private val runtimeConfig = codegenContext.runtimeConfig\n\n    override fun section(section: ServiceRuntimePluginSection) =\n        writable {\n            if (section is ServiceRuntimePluginSection.RegisterRuntimeComponents) {\n                section.registerPermanentInterceptor(runtimeConfig, this) {\n                    rustTemplate(\n                        \"#{Interceptor}\",\n                        \"Interceptor\" to\n                            RuntimeType.forInlineDependency(\n                                InlineAwsDependency.forRustFile(\n                                    \"account_id_endpoint\",\n                                ),\n                            ).resolve(\"AccountIdEndpointFeatureTrackerInterceptor\"),\n                    )\n                }\n            }\n        }\n}\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCargoDependency.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rustsdk\n\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig\nimport software.amazon.smithy.rust.codegen.core.smithy.crateLocation\n\nfun RuntimeConfig.awsRuntimeCrate(\n    name: String,\n    features: Set<String> = setOf(),\n): CargoDependency = CargoDependency(name, awsRoot().crateLocation(name), features = features)\n\nobject AwsCargoDependency {\n    fun awsConfig(runtimeConfig: RuntimeConfig) = runtimeConfig.awsRuntimeCrate(\"aws-config\")\n\n    fun awsCredentialTypes(runtimeConfig: RuntimeConfig) = runtimeConfig.awsRuntimeCrate(\"aws-credential-types\")\n\n    fun awsRuntime(runtimeConfig: RuntimeConfig) = runtimeConfig.awsRuntimeCrate(\"aws-runtime\")\n\n    fun awsRuntimeApi(runtimeConfig: RuntimeConfig) = runtimeConfig.awsRuntimeCrate(\"aws-runtime-api\")\n\n    fun awsSigv4(runtimeConfig: RuntimeConfig) = runtimeConfig.awsRuntimeCrate(\"aws-sigv4\")\n\n    fun awsTypes(runtimeConfig: RuntimeConfig) = runtimeConfig.awsRuntimeCrate(\"aws-types\")\n}\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/main/kotlin/software/amazon/smithy/rustsdk/AwsChunkedContentEncodingDecorator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rustsdk\n\nimport software.amazon.smithy.aws.traits.HttpChecksumTrait\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.traits.HttpHeaderTrait\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.OperationSection\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.config.ServiceConfig\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.Visibility\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\nimport software.amazon.smithy.rust.codegen.core.util.getTrait\nimport software.amazon.smithy.rust.codegen.core.util.hasStreamingMember\n\nclass AwsChunkedContentEncodingDecorator : ClientCodegenDecorator {\n    override val name: String = \"AwsChunkedContentEncoding\"\n\n    // This decorator must decorate after any of the following:\n    // - HttpRequestChecksumDecorator\n    // - HttpRequestCompressionDecorator\n    //\n    // TODO(https://github.com/smithy-lang/smithy-rs/issues/4382): Change ORDER to -1 once\n    //  a dedicated Smithy trait is available.\n    //  Why ORDER -2 is needed temporarily:\n    //  - AwsChunkedContentEncodingDecorator is part of AwsSdkCodegenDecorator (ORDER -1),\n    //    which only applies to S3\n    //  - HttpChecksumTest needs aws-chunked for flexible checksums but uses a non-S3 model\n    //  - To test this, AwsChunkedContentEncodingDecorator must be passed separately to\n    //    awsSdkIntegrationTest alongside AwsSdkCodegenDecorator\n    //  - Since HttpRequestChecksumDecorator is in AwsSdkCodegenDecorator (ORDER -1),\n    //    we need ORDER -2 to run before it\n    override val order: Byte =\n        (minOf(HttpRequestChecksumDecorator.ORDER, HttpRequestCompressionDecorator.ORDER) - 2).toByte()\n\n    override fun configCustomizations(\n        codegenContext: ClientCodegenContext,\n        baseCustomizations: List<ConfigCustomization>,\n    ): List<ConfigCustomization> = baseCustomizations + AwsChunkedConfigCustomization(codegenContext)\n\n    override fun operationCustomizations(\n        codegenContext: ClientCodegenContext,\n        operation: OperationShape,\n        baseCustomizations: List<OperationCustomization>,\n    ) = baseCustomizations + AwsChunkedOperationCustomization(codegenContext, operation)\n}\n\nprivate class AwsChunkedConfigCustomization(\n    codegenContext: ClientCodegenContext,\n) : ConfigCustomization() {\n    private val runtimeConfig = codegenContext.runtimeConfig\n    private val moduleUseName = codegenContext.moduleUseName()\n\n    override fun section(section: ServiceConfig) =\n        writable {\n            when (section) {\n                ServiceConfig.BuilderImpl -> {\n                    rustTemplate(\n                        \"\"\"\n                        /// Sets the chunk size for [`aws-chunked encoding`].\n                        ///\n                        /// Pass `Some(size)` to use a specific chunk size (minimum 8 KiB).\n                        /// Pass `None` to use the content-length as chunk size (no chunking).\n                        ///\n                        /// The minimum chunk size of 8 KiB is validated when the request is sent.\n                        ///\n                        /// **Note:** This setting only applies to operations that support aws-chunked encoding\n                        /// and has no effect on other operations. If this method is not invoked, a default\n                        /// chunk size of 64 KiB is used.\n                        ///\n                        /// [`aws-chunked encoding`]: https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-streaming.html\n                        ///\n                        /// ## Example - Custom chunk size\n                        /// ```no_run\n                        /// ## use $moduleUseName::{Client, Config};\n                        /// ## async fn example(client: Client) -> Result<(), Box<dyn std::error::Error>> {\n                        /// let config = Config::builder()\n                        ///     .aws_chunked_encoding_chunk_size(Some(10240)) // 10 KiB chunks\n                        ///     .build();\n                        /// let client = Client::from_conf(config);\n                        /// ## Ok(())\n                        /// ## }\n                        /// ```\n                        ///\n                        /// ## Example - No chunking (buffers entire body in memory)\n                        /// ```no_run\n                        /// ## use aws_sdk_s3::{Client, Config};\n                        /// ## async fn example(client: Client) -> Result<(), Box<dyn std::error::Error>> {\n                        /// let config = Config::builder()\n                        ///     .aws_chunked_encoding_chunk_size(None) // Use entire content as one chunk\n                        ///     .build();\n                        /// let client = Client::from_conf(config);\n                        /// ## Ok(())\n                        /// ## }\n                        /// ```\n                        pub fn aws_chunked_encoding_chunk_size(mut self, chunk_size: #{Option}<usize>) -> Self {\n                            self.set_aws_chunked_encoding_chunk_size(#{Some}(chunk_size));\n                            self\n                        }\n\n                        /// Sets the chunk size for aws-chunked encoding.\n                        pub fn set_aws_chunked_encoding_chunk_size(&mut self, chunk_size: #{Option}<#{Option}<usize>>) -> &mut Self {\n                            if let #{Some}(chunk_size) = chunk_size {\n                                let chunk_size = match chunk_size {\n                                    #{Some}(size) => #{ChunkSize}::Configured(size),\n                                    #{None} => #{ChunkSize}::DisableChunking,\n                                };\n                                self.push_runtime_plugin(#{ChunkSizeRuntimePlugin}::new(chunk_size).into_shared());\n                            }\n                            self\n                        }\n                        \"\"\",\n                        *preludeScope,\n                        \"ChunkSize\" to runtimeConfig.awsChunked().resolve(\"ChunkSize\"),\n                        \"ChunkSizeRuntimePlugin\" to runtimeConfig.awsChunked().resolve(\"ChunkSizeRuntimePlugin\"),\n                    )\n                }\n\n                else -> emptySection\n            }\n        }\n}\n\n// TODO(https://github.com/smithy-lang/smithy-rs/issues/4382): Replace this condition with a dedicated\n//  Smithy trait once available to determine whether operations require aws-chunked encoding.\nprivate fun operationRequiresAwsChunked(\n    codegenContext: ClientCodegenContext,\n    operation: OperationShape,\n): Boolean {\n    val checksumTrait = operation.getTrait<HttpChecksumTrait>() ?: return false\n    val requestAlgorithmMember =\n        checksumTrait.requestAlgorithmMemberShape(codegenContext, operation) ?: return false\n    requestAlgorithmMember.getTrait<HttpHeaderTrait>()?.value ?: return false\n    val input = codegenContext.model.expectShape(operation.inputShape, StructureShape::class.java)\n    return input.hasStreamingMember(codegenContext.model)\n}\n\nprivate class AwsChunkedOperationCustomization(\n    private val codegenContext: ClientCodegenContext,\n    private val operation: OperationShape,\n) : OperationCustomization() {\n    private val runtimeConfig = codegenContext.runtimeConfig\n\n    override fun section(section: OperationSection) =\n        writable {\n            when (section) {\n                is OperationSection.AdditionalInterceptors -> {\n                    if (!operationRequiresAwsChunked(codegenContext, operation)) return@writable\n\n                    section.registerPermanentInterceptor(runtimeConfig, this) {\n                        rustTemplate(\n                            \"\"\"\n                            #{AwsChunkedContentEncodingInterceptor}\n                            \"\"\",\n                            \"AwsChunkedContentEncodingInterceptor\" to\n                                runtimeConfig.awsChunked()\n                                    .resolve(\"AwsChunkedContentEncodingInterceptor\"),\n                        )\n                    }\n                }\n\n                else -> emptySection\n            }\n        }\n}\n\nprivate fun RuntimeConfig.awsChunked() =\n    RuntimeType.forInlineDependency(\n        InlineAwsDependency.forRustFile(\n            \"aws_chunked\", visibility = Visibility.PUBCRATE,\n            CargoDependency.Bytes,\n            CargoDependency.Http1x,\n            CargoDependency.HttpBody1x,\n            CargoDependency.Tracing,\n            CargoDependency.HttpBodyUtil01x.toDevDependency(),\n            AwsCargoDependency.awsRuntime(this).withFeature(\"http-02x\"),\n            CargoDependency.smithyRuntimeApiClient(this),\n            CargoDependency.smithyTypes(this),\n            AwsCargoDependency.awsSigv4(this),\n            CargoDependency.TempFile.toDevDependency(),\n            CargoDependency.Tokio.toDevDependency(),\n        ),\n    )\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCodegenDecorator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rustsdk\n\nimport software.amazon.smithy.rust.codegen.client.smithy.customizations.DocsRsMetadataDecorator\nimport software.amazon.smithy.rust.codegen.client.smithy.customizations.DocsRsMetadataSettings\nimport software.amazon.smithy.rust.codegen.client.smithy.customizations.ManifestHintsDecorator\nimport software.amazon.smithy.rust.codegen.client.smithy.customizations.ManifestHintsSettings\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.CombinedClientCodegenDecorator\nimport software.amazon.smithy.rustsdk.customize.AwsDisableStalledStreamProtection\nimport software.amazon.smithy.rustsdk.customize.DisabledAuthDecorator\nimport software.amazon.smithy.rustsdk.customize.EnvironmentTokenProviderDecorator\nimport software.amazon.smithy.rustsdk.customize.IsTruncatedPaginatorDecorator\nimport software.amazon.smithy.rustsdk.customize.RemoveDefaultsDecorator\nimport software.amazon.smithy.rustsdk.customize.Sigv4aAuthTraitBackfillDecorator\nimport software.amazon.smithy.rustsdk.customize.apigateway.ApiGatewayDecorator\nimport software.amazon.smithy.rustsdk.customize.applyDecorators\nimport software.amazon.smithy.rustsdk.customize.applyExceptFor\nimport software.amazon.smithy.rustsdk.customize.dsql.DsqlDecorator\nimport software.amazon.smithy.rustsdk.customize.ec2.Ec2Decorator\nimport software.amazon.smithy.rustsdk.customize.glacier.GlacierDecorator\nimport software.amazon.smithy.rustsdk.customize.onlyApplyTo\nimport software.amazon.smithy.rustsdk.customize.onlyApplyToList\nimport software.amazon.smithy.rustsdk.customize.rds.RdsDecorator\nimport software.amazon.smithy.rustsdk.customize.route53.Route53Decorator\nimport software.amazon.smithy.rustsdk.customize.s3.S3Decorator\nimport software.amazon.smithy.rustsdk.customize.s3.S3ExpiresDecorator\nimport software.amazon.smithy.rustsdk.customize.s3.S3ExpressDecorator\nimport software.amazon.smithy.rustsdk.customize.s3.S3ExtendedRequestIdDecorator\nimport software.amazon.smithy.rustsdk.customize.s3control.S3ControlDecorator\nimport software.amazon.smithy.rustsdk.customize.sso.SSODecorator\nimport software.amazon.smithy.rustsdk.customize.sts.STSDecorator\nimport software.amazon.smithy.rustsdk.customize.timestream.TimestreamDecorator\nimport software.amazon.smithy.rustsdk.endpoints.AwsEndpointsStdLib\nimport software.amazon.smithy.rustsdk.endpoints.OperationInputTestDecorator\nimport software.amazon.smithy.rustsdk.endpoints.RequireEndpointRules\n\nval DECORATORS: List<ClientCodegenDecorator> =\n    listOf(\n        // General AWS Decorators\n        listOf(\n            CredentialsProviderDecorator(),\n            RegionDecorator(),\n            RequireEndpointRules(),\n            ObservabilityMetricDecorator(),\n            EndpointOverrideMetricDecorator(),\n            UserAgentDecorator(),\n            SigV4AuthDecorator(),\n            HttpRequestChecksumDecorator(),\n            HttpResponseChecksumDecorator(),\n            IntegrationTestDecorator(),\n            AwsFluentClientDecorator(),\n            CrateLicenseDecorator(),\n            SdkConfigDecorator(),\n            ServiceConfigDecorator(),\n            AwsPresigningDecorator(),\n            AwsCrateDocsDecorator(),\n            AwsEndpointsStdLib(),\n            *PromotedBuiltInsDecorators,\n            GenericSmithySdkConfigSettings(),\n            OperationInputTestDecorator(),\n            AwsRequestIdDecorator(),\n            DisabledAuthDecorator(),\n            RecursionDetectionDecorator(),\n            InvocationIdDecorator(),\n            RetryInformationHeaderDecorator(),\n            RemoveDefaultsDecorator(),\n            TokenProvidersDecorator(),\n            ServiceEnvConfigDecorator(),\n            HttpRequestCompressionDecorator(),\n            DisablePayloadSigningDecorator(),\n            AwsDisableStalledStreamProtection(),\n            Sigv4aAuthTraitBackfillDecorator(),\n            EndpointBasedAuthSchemeDecorator(),\n            SpanDecorator(),\n            // TODO(https://github.com/smithy-lang/smithy-rs/issues/3863): Comment in once the issue has been resolved\n            // SmokeTestsDecorator(),\n        ),\n        // S3 needs `AwsErrorCodeClassifier` to handle an `InternalError` as a transient error. We need to customize\n        // that behavior for S3 in a way that does not conflict with the globally applied `RetryClassifierDecorator`.\n        // Therefore, that decorator is applied to all but S3, and S3 customizes the creation of `AwsErrorCodeClassifier`\n        // accordingly (see https://github.com/smithy-lang/smithy-rs/pull/3699).\n        RetryClassifierDecorator().applyExceptFor(\"com.amazonaws.s3#AmazonS3\"),\n        // Service specific decorators\n        ApiGatewayDecorator().onlyApplyTo(\"com.amazonaws.apigateway#BackplaneControlService\"),\n        DsqlDecorator().onlyApplyTo(\"com.amazonaws.dsql#DSQL\"),\n        Ec2Decorator().onlyApplyTo(\"com.amazonaws.ec2#AmazonEC2\"),\n        GlacierDecorator().onlyApplyTo(\"com.amazonaws.glacier#Glacier\"),\n        RdsDecorator().onlyApplyTo(\"com.amazonaws.rds#AmazonRDSv19\"),\n        Route53Decorator().onlyApplyTo(\"com.amazonaws.route53#AWSDnsV20130401\"),\n        \"com.amazonaws.s3#AmazonS3\".applyDecorators(\n            S3Decorator(),\n            S3ExpressDecorator(),\n            S3ExtendedRequestIdDecorator(),\n            IsTruncatedPaginatorDecorator(),\n            S3ExpiresDecorator(),\n            // TODO(https://github.com/smithy-lang/smithy-rs/issues/4382): Apply this decorator based on\n            //  a dedicated Smithy trait once available.\n            AwsChunkedContentEncodingDecorator(),\n        ),\n        S3ControlDecorator().onlyApplyTo(\"com.amazonaws.s3control#AWSS3ControlServiceV20180820\"),\n        STSDecorator().onlyApplyTo(\"com.amazonaws.sts#AWSSecurityTokenServiceV20110615\"),\n        SSODecorator().onlyApplyTo(\"com.amazonaws.sso#SWBPortalService\"),\n        TimestreamDecorator().onlyApplyTo(\"com.amazonaws.timestreamwrite#Timestream_20181101\"),\n        TimestreamDecorator().onlyApplyTo(\"com.amazonaws.timestreamquery#Timestream_20181101\"),\n        listOf(\"bedrock\").map { EnvironmentTokenProviderDecorator(it) },\n        // Only build docs-rs for linux to reduce load on docs.rs\n        listOf(\n            DocsRsMetadataDecorator(\n                DocsRsMetadataSettings(\n                    targets = listOf(\"x86_64-unknown-linux-gnu\"),\n                    allFeatures = true,\n                ),\n            ),\n        ),\n        ManifestHintsDecorator(ManifestHintsSettings(mostlyUnused = true)).onlyApplyToList(\n            listOf(\n                \"com.amazonaws.cloudformation#CloudFormation\",\n                \"com.amazonaws.dynamodb#DynamoDB_20120810\",\n                \"com.amazonaws.ec2#AmazonEC2\",\n                \"com.amazonaws.lambda#AWSGirApiService\",\n                \"com.amazonaws.rds#AmazonRDSv19\",\n                \"com.amazonaws.s3#AmazonS3\",\n                \"com.amazonaws.sns#AmazonSimpleNotificationService\",\n                \"com.amazonaws.sqs#AmazonSQS\",\n                \"com.amazonaws.ssm#AmazonSSM\",\n                \"com.amazonaws.sts#AWSSecurityTokenServiceV20110615\",\n            ),\n        ),\n    ).flatten()\n\nclass AwsCodegenDecorator : CombinedClientCodegenDecorator(DECORATORS) {\n    override val name: String = \"AwsSdkCodegenDecorator\"\n    override val order: Byte = -1\n}\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/main/kotlin/software/amazon/smithy/rustsdk/AwsCrateDocsDecorator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rustsdk\n\nimport org.jsoup.Jsoup\nimport org.jsoup.nodes.Element\nimport org.jsoup.nodes.TextNode\nimport software.amazon.smithy.model.traits.DocumentationTrait\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.containerDocsTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.docs\nimport software.amazon.smithy.rust.codegen.core.rustlang.escape\nimport software.amazon.smithy.rust.codegen.core.rustlang.rawTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RustCrate\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.AdHocSection\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.LibRsCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.LibRsSection\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.ManifestCustomizations\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.ModuleDocSection\nimport software.amazon.smithy.rust.codegen.core.util.getTrait\nimport software.amazon.smithy.rust.codegen.core.util.serviceNameOrDefault\nimport java.util.logging.Logger\n\n// Use a sigil that should always be unique in the text to fix line breaks and spaces\n// since Jsoup doesn't preserve whitespace at all.\nprivate const val LINE_BREAK_SIGIL = \"[[smithy-rs-br]]\"\nprivate const val SPACE_SIGIL = \"[[smithy-rs-nbsp]]\"\n\n/**\n * Generates a README.md and top-level crate documentation for each service crate for display on crates.io and docs.rs.\n */\nclass AwsCrateDocsDecorator : ClientCodegenDecorator {\n    override val name: String = \"AwsReadmeDecorator\"\n    override val order: Byte = 0\n\n    override fun crateManifestCustomizations(codegenContext: ClientCodegenContext): ManifestCustomizations =\n        if (generateReadme(codegenContext)) {\n            mapOf(\"package\" to mapOf(\"readme\" to \"README.md\"))\n        } else {\n            emptyMap()\n        }\n\n    override fun libRsCustomizations(\n        codegenContext: ClientCodegenContext,\n        baseCustomizations: List<LibRsCustomization>,\n    ): List<LibRsCustomization> =\n        baseCustomizations +\n            listOf(\n                object : LibRsCustomization() {\n                    override fun section(section: LibRsSection): Writable =\n                        when {\n                            section is LibRsSection.ModuleDoc && section.subsection is ModuleDocSection.ServiceDocs ->\n                                writable {\n                                    // Include README contents in crate docs if they are to be generated\n                                    if (generateReadme(codegenContext)) {\n                                        AwsCrateDocGenerator(codegenContext).generateCrateDocComment()(this)\n                                    }\n                                }\n\n                            else -> emptySection\n                        }\n                },\n            )\n\n    override fun extras(\n        codegenContext: ClientCodegenContext,\n        rustCrate: RustCrate,\n    ) {\n        if (generateReadme(codegenContext)) {\n            AwsCrateDocGenerator(codegenContext).generateReadme(rustCrate)\n        }\n    }\n\n    override fun clientConstructionDocs(\n        codegenContext: ClientCodegenContext,\n        baseDocs: Writable,\n    ): Writable =\n        writable {\n            val serviceName = codegenContext.serviceShape.serviceNameOrDefault(\"the service\")\n            docs(\"Client for calling $serviceName.\")\n            if (generateReadme(codegenContext)) {\n                AwsDocs.clientConstructionDocs(codegenContext)(this)\n            }\n        }\n\n    private fun generateReadme(codegenContext: ClientCodegenContext) =\n        SdkSettings.from(codegenContext.settings).generateReadme\n}\n\nsealed class DocSection(name: String) : AdHocSection(name) {\n    data class CreateClient(val crateName: String, val clientName: String = \"client\", val indent: String) : DocSection(\"CustomExample\")\n}\n\ninternal class AwsCrateDocGenerator(private val codegenContext: ClientCodegenContext) {\n    private val logger: Logger = Logger.getLogger(javaClass.name)\n    private val awsConfigVersion by lazy {\n        SdkSettings.from(codegenContext.settings).awsConfigVersion\n            ?: throw IllegalStateException(\"missing `awsConfigVersion` codegen setting\")\n    }\n\n    private fun RustWriter.template(\n        asComments: Boolean,\n        text: String,\n        vararg args: Pair<String, Any>,\n    ) = when (asComments) {\n        true -> containerDocsTemplate(text, *args)\n        else -> rawTemplate(text + \"\\n\", *args)\n    }\n\n    internal fun docText(\n        includeHeader: Boolean,\n        includeLicense: Boolean,\n        asComments: Boolean,\n    ): Writable =\n        writable {\n            val moduleVersion = codegenContext.settings.moduleVersion\n            check(moduleVersion.isNotEmpty() && moduleVersion[0].isDigit())\n\n            val moduleName = codegenContext.settings.moduleName\n            val description =\n                normalizeDescription(\n                    codegenContext.moduleName,\n                    codegenContext.settings.getService(codegenContext.model).getTrait<DocumentationTrait>()?.value ?: \"\",\n                )\n            val snakeCaseModuleName = moduleName.replace('-', '_')\n            val shortModuleName = moduleName.removePrefix(\"aws-sdk-\")\n\n            if (includeHeader) {\n                template(asComments, escape(\"# $moduleName\\n\"))\n            }\n\n            if (description.isNotBlank()) {\n                template(asComments, escape(\"$description\\n\"))\n            }\n\n            val compileExample = AwsDocs.canRelyOnAwsConfig(codegenContext)\n            val exampleMode = if (compileExample) \"no_run\" else \"ignore\"\n            template(\n                asComments,\n                \"\"\"\n                #### Getting Started\n\n                > Examples are available for many services and operations, check out the\n                > [usage examples](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/rustv1).\n\n                The SDK provides one crate per AWS service. You must add [Tokio](https://crates.io/crates/tokio)\n                as a dependency within your Rust project to execute asynchronous code. To add `$moduleName` to\n                your project, add the following to your **Cargo.toml** file:\n\n                ```toml\n                [dependencies]\n                aws-config = { version = \"$awsConfigVersion\", features = [\"behavior-version-latest\"] }\n                $moduleName = \"$moduleVersion\"\n                tokio = { version = \"1\", features = [\"full\"] }\n                ```\n\n                Then in code, a client can be created with the following:\n\n                ```rust,$exampleMode\n                use $snakeCaseModuleName as $shortModuleName;\n\n                ##[#{tokio}::main]\n                async fn main() -> Result<(), $shortModuleName::Error> {\n                    #{constructClient}\n\n                    // ... make some calls with the client\n\n                    Ok(())\n                }\n                ```\n\n                See the [client documentation](https://docs.rs/$moduleName/latest/$snakeCaseModuleName/client/struct.Client.html)\n                for information on what calls can be made, and the inputs and outputs for each of those calls.${\"\\n\"}\n                \"\"\".trimIndent().trimStart(),\n                \"tokio\" to CargoDependency.Tokio.toDevDependency().toType(),\n                \"aws_config\" to\n                    when (compileExample) {\n                        true -> AwsCargoDependency.awsConfig(codegenContext.runtimeConfig).toDevDependency().toType()\n                        else -> writable { rust(\"aws_config\") }\n                    },\n                \"constructClient\" to AwsDocs.constructClient(codegenContext, indent = \"    \"),\n            )\n\n            template(\n                asComments,\n                \"\"\"\n                #### Using the SDK\n\n                Until the SDK is released, we will be adding information about using the SDK to the\n                [Developer Guide](https://docs.aws.amazon.com/sdk-for-rust/latest/dg/welcome.html). Feel free to suggest\n                additional sections for the guide by opening an issue and describing what you are trying to do.${\"\\n\"}\n                \"\"\".trimIndent(),\n            )\n\n            template(\n                asComments,\n                \"\"\"\n                #### Getting Help\n\n                * [GitHub discussions](https://github.com/awslabs/aws-sdk-rust/discussions) - For ideas, RFCs & general questions\n                * [GitHub issues](https://github.com/awslabs/aws-sdk-rust/issues/new/choose) - For bug reports & feature requests\n                * [Generated Docs (latest version)](https://awslabs.github.io/aws-sdk-rust/)\n                * [Usage examples](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/rustv1)${\"\\n\"}\n                \"\"\".trimIndent(),\n            )\n\n            if (includeLicense) {\n                template(\n                    asComments,\n                    \"\"\"\n                    #### License\n\n                    This project is licensed under the Apache-2.0 License.\n                    \"\"\".trimIndent(),\n                )\n            }\n        }\n\n    internal fun generateCrateDocComment(): Writable =\n        docText(includeHeader = false, includeLicense = false, asComments = true)\n\n    internal fun generateReadme(rustCrate: RustCrate) =\n        rustCrate.withFile(\"README.md\") {\n            docText(includeHeader = true, includeLicense = true, asComments = false)(this)\n        }\n\n    /**\n     * Strips HTML from the description and makes it human-readable Markdown.\n     */\n    internal fun normalizeDescription(\n        moduleName: String,\n        input: String,\n    ): String {\n        val doc = Jsoup.parse(input)\n        doc.body().apply {\n            // The order of operations here is important:\n            stripUndesiredNodes() // Remove `<fullname>`, blank whitespace nodes, etc\n            normalizeInlineStyles() // Convert bold/italics tags to Markdown equivalents\n            normalizeAnchors() // Convert anchor tags into Markdown links\n            normalizeBreaks() // Convert `<br>` tags into newlines\n            normalizeLists() // Convert HTML lists into Markdown lists\n            normalizeDescriptionLists() // Converts HTML <dl> description lists into Markdown\n            normalizeParagraphs() // Replace paragraph tags into blocks of text separated by newlines\n            warnOnUnrecognizedElements(moduleName) // Log a warning if we missed something\n        }\n        return doc.body().text()\n            .replace(LINE_BREAK_SIGIL, \"\\n\")\n            .replace(SPACE_SIGIL, \" \")\n            .normalizeLineWhitespace()\n    }\n\n    private fun Element.stripUndesiredNodes() {\n        // Remove the `<fullname>` tag\n        getElementsByTag(\"fullname\").forEach { it.remove() }\n        // Unwrap `<important>` tags\n        getElementsByTag(\"important\").forEach { it.changeInto(\"span\") }\n        // Remove the `<note>` tag\n        getElementsByTag(\"note\").forEach {\n            if (it.children().isEmpty()) {\n                throw IllegalStateException(\"<note> tag unexpectedly had children\")\n            }\n            it.remove()\n        }\n\n        // Eliminate empty whitespace\n        textNodes().forEach { text ->\n            if (text.isBlank) {\n                text.remove()\n            }\n        }\n    }\n\n    private fun Element.changeInto(tagName: String) {\n        replaceWith(Element(tagName).also { elem -> elem.appendChildren(childNodesCopy()) })\n    }\n\n    private fun Element.normalizeInlineStyles() {\n        getElementsByTag(\"b\").forEach { normalizeInlineStyleTag(\"__\", it) }\n        getElementsByTag(\"i\").forEach { normalizeInlineStyleTag(\"_\", it) }\n    }\n\n    private fun normalizeInlineStyleTag(\n        surround: String,\n        tag: Element,\n    ) {\n        tag.replaceWith(\n            Element(\"span\").also { span ->\n                span.append(surround)\n                span.appendChildren(tag.childNodesCopy())\n                span.append(surround)\n            },\n        )\n    }\n\n    private fun Element.normalizeAnchors() {\n        for (anchor in getElementsByTag(\"a\")) {\n            val text = anchor.text()\n            val link = anchor.attr(\"href\")\n            anchor.replaceWith(\n                TextNode(\n                    if (link.isNotBlank()) {\n                        \"[$text]($link)\"\n                    } else {\n                        text\n                    },\n                ),\n            )\n        }\n    }\n\n    private fun Element.normalizeBreaks() {\n        getElementsByTag(\"br\").forEach { lineBreak -> lineBreak.replaceWith(TextNode(LINE_BREAK_SIGIL)) }\n    }\n\n    private fun Element.isList(): Boolean = tagName() == \"ul\" || tagName() == \"ol\"\n\n    private fun Element.normalizeLists() {\n        (getElementsByTag(\"ul\") + getElementsByTag(\"ol\"))\n            // Only operate on lists that are top-level (are not nested within other lists)\n            .filter { list -> list.parents().none { it.isList() } }\n            .forEach { list -> list.normalizeList() }\n    }\n\n    private fun Element.normalizeList(indent: Int = 1) {\n        // First, replace nested lists\n        for (child in children().filter { tag -> tag.tagName() == \"li\" }) {\n            for (itemChild in child.children()) {\n                if (itemChild.isList()) {\n                    itemChild.normalizeList(indent + 1)\n                }\n            }\n        }\n        // Then format the list items down to Markdown\n        val result = StringBuilder(if (indent == 1) \"\" else LINE_BREAK_SIGIL)\n        val prefix = if (tagName() == \"ul\") \"- \" else \"1. \"\n        val indentText = SPACE_SIGIL.repeat(indent * 2)\n        for (child in children()) {\n            result.append(\"$indentText$prefix${child.text().trim()}$LINE_BREAK_SIGIL\")\n        }\n        replaceWith(TextNode(result.toString()))\n    }\n\n    private fun Element.normalizeDescriptionLists() {\n        getElementsByTag(\"dl\").forEach { list -> list.normalizeDescriptionList() }\n    }\n\n    private fun Element.normalizeDescriptionList() {\n        getElementsByTag(\"dt\").forEach { dt ->\n            dt.text(\"${LINE_BREAK_SIGIL}__${dt.text()}__$LINE_BREAK_SIGIL\")\n            dt.changeInto(\"span\")\n        }\n        getElementsByTag(\"dd\").forEach { dd -> dd.changeInto(\"p\") }\n        appendChild(TextNode(LINE_BREAK_SIGIL))\n        changeInto(\"span\")\n    }\n\n    private fun Element.normalizeParagraphs() {\n        getElementsByTag(\"p\").forEach { paragraph ->\n            paragraph.replaceWith(TextNode(LINE_BREAK_SIGIL + paragraph.text() + LINE_BREAK_SIGIL))\n        }\n    }\n\n    private fun Element.warnOnUnrecognizedElements(moduleName: String) {\n        allElements\n            .filter { elem ->\n                // body is always present\n                elem.tagName() != \"body\" &&\n                    // we replace certain elements with span, so these are fine\n                    elem.tagName() != \"span\"\n            }\n            .map { elem -> elem.tagName() }.toSortedSet().joinToString(\", \")\n            .let { tags ->\n                if (tags.isNotEmpty()) {\n                    logger.warning { \"[$moduleName] Unrecognized HTML tags encountered when normalizing text: $tags\" }\n                }\n            }\n    }\n\n    private fun String.normalizeLineWhitespace(): String =\n        // Convert sigils back into whitespace\n        replace(LINE_BREAK_SIGIL, \"\\n\")\n            .replace(SPACE_SIGIL, \" \")\n            // Replace long runs of linebreaks with just two line breaks\n            .replace(Regex(\"\\n\\n\\n+\"), \"\\n\\n\")\n            // Remove trailing whitespace from each line\n            .replace(Regex(\"[ \\t]+\\n\"), \"\\n\")\n            // Remove leading whitespace from each line when it's not a list item\n            .replace(Regex(\"\\n[ \\t]+([^ \\t\\\\-1])\"), \"\\n$1\")\n            // Chop off leading newlines\n            .replace(Regex(\"^\\n+\"), \"\")\n            // Chop off trailing newlines\n            .replace(Regex(\"\\n+$\"), \"\")\n}\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/main/kotlin/software/amazon/smithy/rustsdk/AwsDocs.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rustsdk\n\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.docsTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.writeCustomizationsOrElse\n\nobject AwsDocs {\n    /**\n     * If no `aws-config` version is provided, assume that docs referencing `aws-config` cannot be given.\n     * Also, STS and SSO must NOT reference `aws-config` since that would create a circular dependency.\n     */\n    fun canRelyOnAwsConfig(codegenContext: ClientCodegenContext): Boolean =\n        SdkSettings.from(codegenContext.settings).awsConfigVersion != null &&\n            !setOf(\n                ShapeId.from(\"com.amazonaws.sso#SWBPortalService\"),\n                ShapeId.from(\"com.amazonaws.ssooidc#AWSSSOOIDCService\"),\n                ShapeId.from(\"com.amazonaws.sts#AWSSecurityTokenServiceV20110615\"),\n                ShapeId.from(\"com.amazonaws.signin#Signin\"),\n            ).contains(codegenContext.serviceShape.id)\n\n    fun constructClient(\n        codegenContext: ClientCodegenContext,\n        indent: String,\n    ): Writable {\n        val crateName = codegenContext.moduleUseName()\n        return writable {\n            writeCustomizationsOrElse(\n                codegenContext.rootDecorator.extraSections(codegenContext),\n                DocSection.CreateClient(crateName = crateName, indent = indent),\n            ) {\n                if (canRelyOnAwsConfig(codegenContext)) {\n                    addDependency(AwsCargoDependency.awsConfig(codegenContext.runtimeConfig).toDevDependency())\n                }\n                rustTemplate(\n                    \"\"\"\n                    let config = aws_config::load_from_env().await;\n                    let client = $crateName::Client::new(&config);\n                    \"\"\".trimIndent().prependIndent(indent),\n                )\n            }\n        }\n    }\n\n    fun clientConstructionDocs(codegenContext: ClientCodegenContext): Writable =\n        {\n            if (canRelyOnAwsConfig(codegenContext)) {\n                val crateName = codegenContext.moduleUseName()\n                docsTemplate(\n                    \"\"\"\n                    #### Constructing a `Client`\n\n                    A [`Config`] is required to construct a client. For most use cases, the [`aws-config`]\n                    crate should be used to automatically resolve this config using\n                    [`aws_config::load_from_env()`], since this will resolve an [`SdkConfig`] which can be shared\n                    across multiple different AWS SDK clients. This config resolution process can be customized\n                    by calling [`aws_config::from_env()`] instead, which returns a [`ConfigLoader`] that uses\n                    the [builder pattern] to customize the default config.\n\n                    In the simplest case, creating a client looks as follows:\n                    ```rust,no_run\n                    ## async fn wrapper() {\n                    #{constructClient}\n                    ## }\n                    ```\n\n                    Occasionally, SDKs may have additional service-specific values that can be set on the [`Config`] that\n                    is absent from [`SdkConfig`], or slightly different settings for a specific client may be desired.\n                    The [`Builder`](crate::config::Builder) struct implements `From<&SdkConfig>`, so setting these specific settings can be\n                    done as follows:\n\n                    ```rust,no_run\n                    ## async fn wrapper() {\n                    let sdk_config = #{aws_config}::load_from_env().await;\n                    let config = $crateName::config::Builder::from(&sdk_config)\n                    ## /*\n                        .some_service_specific_setting(\"value\")\n                    ## */\n                        .build();\n                    ## }\n                    ```\n\n                    See the [`aws-config` docs] and [`Config`] for more information on customizing configuration.\n\n                    _Note:_ Client construction is expensive due to connection thread pool initialization, and should\n                    be done once at application start-up.\n\n                    [`Config`]: crate::Config\n                    [`ConfigLoader`]: https://docs.rs/aws-config/*/aws_config/struct.ConfigLoader.html\n                    [`SdkConfig`]: https://docs.rs/aws-config/*/aws_config/struct.SdkConfig.html\n                    [`aws-config` docs]: https://docs.rs/aws-config/*\n                    [`aws-config`]: https://crates.io/crates/aws-config\n                    [`aws_config::from_env()`]: https://docs.rs/aws-config/*/aws_config/fn.from_env.html\n                    [`aws_config::load_from_env()`]: https://docs.rs/aws-config/*/aws_config/fn.load_from_env.html\n                    [builder pattern]: https://rust-lang.github.io/api-guidelines/type-safety.html##builders-enable-construction-of-complex-values-c-builder\n                    \"\"\".trimIndent(),\n                    \"aws_config\" to AwsCargoDependency.awsConfig(codegenContext.runtimeConfig).toDevDependency().toType(),\n                    \"constructClient\" to constructClient(codegenContext, indent = \"\"),\n                )\n            }\n        }\n}\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/main/kotlin/software/amazon/smithy/rustsdk/AwsFluentClientDecorator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rustsdk\n\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.client.FluentClientCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.client.FluentClientDocs\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.client.FluentClientGenerator\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.client.FluentClientSection\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.protocol.ClientProtocolTestGenerator\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute\nimport software.amazon.smithy.rust.codegen.core.rustlang.Feature\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlockTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\nimport software.amazon.smithy.rust.codegen.core.smithy.RustCrate\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.LibRsCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.LibRsSection\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.protocol.ProtocolTestGenerator\nimport software.amazon.smithy.rust.codegen.core.util.letIf\nimport software.amazon.smithy.rust.codegen.core.util.serviceNameOrDefault\nimport software.amazon.smithy.rustsdk.customize.s3.S3ExpressFluentClientCustomization\n\nprivate class Types(runtimeConfig: RuntimeConfig) {\n    private val smithyTypes = RuntimeType.smithyTypes(runtimeConfig)\n\n    val awsTypes = AwsRuntimeType.awsTypes(runtimeConfig)\n    val retryConfig = smithyTypes.resolve(\"retry::RetryConfig\")\n    val timeoutConfig = smithyTypes.resolve(\"timeout::TimeoutConfig\")\n}\n\nclass AwsFluentClientDecorator : ClientCodegenDecorator {\n    override val name: String = \"FluentClient\"\n\n    // Must run after the AwsPresigningDecorator so that the presignable trait is correctly added to operations\n    override val order: Byte = (AwsPresigningDecorator.ORDER + 1).toByte()\n\n    override fun extras(\n        codegenContext: ClientCodegenContext,\n        rustCrate: RustCrate,\n    ) {\n        val runtimeConfig = codegenContext.runtimeConfig\n        val types = Types(runtimeConfig)\n        FluentClientGenerator(\n            codegenContext,\n            customizations =\n                listOf(\n                    AwsPresignedFluentBuilderMethod(codegenContext),\n                    AwsFluentClientDocs(codegenContext),\n                    AwsFluentClientRetryPartition(codegenContext),\n                    AwsFluentClientEnableRetries(codegenContext),\n                ).letIf(codegenContext.serviceShape.id == ShapeId.from(\"com.amazonaws.s3#AmazonS3\")) {\n                    it + S3ExpressFluentClientCustomization(codegenContext)\n                },\n        ).render(rustCrate)\n        rustCrate.withModule(ClientRustModule.client) {\n            AwsFluentClientExtensions(codegenContext, types).render(this)\n        }\n\n        // TODO(hyper1): disable rustls as a default feature in future release\n        // NOTE: We enable both rustls and default-https-client as default features. This keeps the legacy hyper+rustls\n        // stack working as is and lets BehaviorVersion control which client you get. In a future release we will\n        // break this and disable the rustls feature by default (and break old BMV versions w.r.t http client default).\n        rustCrate.mergeFeature(Feature(\"rustls\", default = true, listOf(\"aws-smithy-runtime/tls-rustls\")))\n        rustCrate.mergeFeature(Feature(\"default-https-client\", default = true, listOf(\"aws-smithy-runtime/default-https-client\")))\n    }\n\n    override fun libRsCustomizations(\n        codegenContext: ClientCodegenContext,\n        baseCustomizations: List<LibRsCustomization>,\n    ): List<LibRsCustomization> {\n        return baseCustomizations +\n            object : LibRsCustomization() {\n                override fun section(section: LibRsSection) =\n                    when (section) {\n                        is LibRsSection.Body ->\n                            writable {\n                                Attribute.DocInline.render(this)\n                                rust(\"pub use client::Client;\")\n                            }\n\n                        else -> emptySection\n                    }\n            }\n    }\n\n    override fun protocolTestGenerator(\n        codegenContext: ClientCodegenContext,\n        baseGenerator: ProtocolTestGenerator,\n    ): ProtocolTestGenerator =\n        ClientProtocolTestGenerator(\n            codegenContext,\n            baseGenerator.protocolSupport,\n            baseGenerator.operationShape,\n            renderClientCreation = { params ->\n                rustTemplate(\n                    \"\"\"\n                    let mut ${params.configBuilderName} = ${params.configBuilderName};\n                    ${params.configBuilderName}.set_region(Some(crate::config::Region::new(\"us-east-1\")));\n\n                    let config = ${params.configBuilderName}.http_client(${params.httpClientName}).build();\n                    let ${params.clientName} = #{Client}::from_conf(config);\n                    \"\"\",\n                    \"Client\" to ClientRustModule.root.toType().resolve(\"Client\"),\n                )\n            },\n        )\n}\n\nprivate class AwsFluentClientExtensions(private val codegenContext: ClientCodegenContext, private val types: Types) {\n    private val codegenScope =\n        arrayOf(\n            \"Arc\" to RuntimeType.Arc,\n            \"RetryConfig\" to types.retryConfig,\n            \"TimeoutConfig\" to types.timeoutConfig,\n            \"aws_types\" to types.awsTypes,\n        )\n\n    fun render(writer: RustWriter) {\n        writer.rustBlockTemplate(\"impl Client\", *codegenScope) {\n            rustTemplate(\n                \"\"\"\n                /// Creates a new client from an [SDK Config](#{aws_types}::sdk_config::SdkConfig).\n                ///\n                /// ## Panics\n                ///\n                /// - This method will panic if the `sdk_config` is missing an async sleep implementation. If you experience this panic, set\n                ///   the `sleep_impl` on the Config passed into this function to fix it.\n                /// - This method will panic if the `sdk_config` is missing an HTTP connector. If you experience this panic, set the\n                ///   `http_connector` on the Config passed into this function to fix it.\n                /// - This method will panic if no `BehaviorVersion` is provided. If you experience this panic, set `behavior_version` on the Config or enable the `behavior-version-latest` Cargo feature.\n                ##[track_caller]\n                pub fn new(sdk_config: &#{aws_types}::sdk_config::SdkConfig) -> Self {\n                    Self::from_conf(sdk_config.into())\n                }\n                \"\"\",\n                *codegenScope,\n            )\n        }\n    }\n}\n\nprivate class AwsFluentClientDocs(private val codegenContext: ClientCodegenContext) : FluentClientCustomization() {\n    private val serviceName = codegenContext.serviceShape.serviceNameOrDefault(\"the service\")\n\n    override fun section(section: FluentClientSection): Writable {\n        return when (section) {\n            is FluentClientSection.FluentClientDocs ->\n                writable {\n                    rustTemplate(\n                        \"\"\"\n                        /// Client for $serviceName\n                        ///\n                        /// Client for invoking operations on $serviceName. Each operation on $serviceName is a method on this\n                        /// this struct. `.send()` MUST be invoked on the generated operations to dispatch the request to the service.\"\"\",\n                    )\n                    AwsDocs.clientConstructionDocs(codegenContext)(this)\n                    FluentClientDocs.clientUsageDocs(codegenContext)(this)\n                    FluentClientDocs.waiterDocs(codegenContext)(this)\n                }\n\n            else -> emptySection\n        }\n    }\n}\n\n/**\n * Replaces the default retry partition for all operations to include the AWS region if set\n */\nprivate class AwsFluentClientRetryPartition(private val codegenContext: ClientCodegenContext) : FluentClientCustomization() {\n    override fun section(section: FluentClientSection): Writable {\n        return when {\n            section is FluentClientSection.BeforeBaseClientPluginSetup && usesRegion(codegenContext) -> {\n                writable {\n                    rustTemplate(\n                        \"\"\"\n                        let default_retry_partition = match config.region() {\n                            Some(region) => #{Cow}::from(format!(\"{default_retry_partition}-{region}\")),\n                            None => #{Cow}::from(default_retry_partition),\n                        };\n                        \"\"\",\n                        *preludeScope,\n                        \"Cow\" to RuntimeType.Cow,\n                    )\n                }\n            }\n            else -> emptySection\n        }\n    }\n}\n\n/**\n * Enables retries by default for AWS SDK clients when awsSdkBuild is true.\n *\n * Only applies to real AWS SDK builds (controlled by awsSdkBuild in JSON settings).\n */\nprivate class AwsFluentClientEnableRetries(private val codegenContext: ClientCodegenContext) : FluentClientCustomization() {\n    override fun section(section: FluentClientSection): Writable {\n        if (!codegenContext.sdkSettings().awsSdkBuild) {\n            return emptySection\n        }\n\n        return when (section) {\n            is FluentClientSection.CustomizeDefaultPluginParams -> {\n                writable {\n                    rust(\".with_is_aws_sdk(true)\")\n                }\n            }\n            else -> emptySection\n        }\n    }\n}\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/main/kotlin/software/amazon/smithy/rustsdk/AwsPresigningDecorator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rustsdk\n\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.knowledge.HttpBinding\nimport software.amazon.smithy.model.knowledge.HttpBindingIndex\nimport software.amazon.smithy.model.knowledge.TopDownIndex\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.ServiceShape\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.model.shapes.ToShapeId\nimport software.amazon.smithy.model.traits.HttpQueryTrait\nimport software.amazon.smithy.model.traits.HttpTrait\nimport software.amazon.smithy.model.transform.ModelTransformer\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientRustSettings\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.client.CustomizableOperationSection\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.client.FluentClientCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.client.FluentClientSection\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.client.InternalTraitsModule\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.client.fluentBuilderType\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.protocol.RequestSerializerGenerator\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.Feature\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.docs\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlockTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\nimport software.amazon.smithy.rust.codegen.core.smithy.RustCrate\nimport software.amazon.smithy.rust.codegen.core.smithy.contextName\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.AdHocCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.adhocCustomization\nimport software.amazon.smithy.rust.codegen.core.util.cloneOperation\nimport software.amazon.smithy.rust.codegen.core.util.expectTrait\nimport software.amazon.smithy.rust.codegen.core.util.thenSingletonListOf\nimport software.amazon.smithy.rustsdk.traits.PresignableTrait\n\nprivate val presigningTypes: Array<Pair<String, Any>> =\n    arrayOf(\n        \"PresignedRequest\" to AwsRuntimeType.presigning().resolve(\"PresignedRequest\"),\n        \"PresigningConfig\" to AwsRuntimeType.presigning().resolve(\"PresigningConfig\"),\n    )\n\ninternal enum class PayloadSigningType {\n    EMPTY,\n    UNSIGNED_PAYLOAD,\n}\n\nprivate fun syntheticShapeId(shape: ToShapeId): ShapeId =\n    shape.toShapeId().let { id -> ShapeId.fromParts(id.namespace + \".synthetic.aws.presigned\", id.name) }\n\ninternal class PresignableOperation(\n    val payloadSigningType: PayloadSigningType,\n    val modelTransforms: List<PresignModelTransform> = emptyList(),\n) {\n    fun hasModelTransforms(): Boolean = modelTransforms.isNotEmpty()\n}\n\nprivate val SYNTHESIZE_SPEECH_OP = ShapeId.from(\"com.amazonaws.polly#SynthesizeSpeech\")\ninternal val PRESIGNABLE_OPERATIONS by lazy {\n    mapOf(\n        // S3\n        // TODO(https://github.com/awslabs/aws-sdk-rust/issues/488) Technically, all S3 operations support presigning\n        ShapeId.from(\"com.amazonaws.s3#HeadObject\") to PresignableOperation(PayloadSigningType.UNSIGNED_PAYLOAD),\n        ShapeId.from(\"com.amazonaws.s3#GetObject\") to PresignableOperation(PayloadSigningType.UNSIGNED_PAYLOAD),\n        ShapeId.from(\"com.amazonaws.s3#PutObject\") to PresignableOperation(PayloadSigningType.UNSIGNED_PAYLOAD),\n        ShapeId.from(\"com.amazonaws.s3#UploadPart\") to PresignableOperation(PayloadSigningType.UNSIGNED_PAYLOAD),\n        ShapeId.from(\"com.amazonaws.s3#DeleteObject\") to PresignableOperation(PayloadSigningType.UNSIGNED_PAYLOAD),\n        // Polly\n        SYNTHESIZE_SPEECH_OP to\n            PresignableOperation(\n                PayloadSigningType.EMPTY,\n                // Polly's SynthesizeSpeech operation has the HTTP method overridden to GET,\n                // and the document members changed to query param members.\n                modelTransforms =\n                    listOf(\n                        OverrideHttpMethodTransform(mapOf(SYNTHESIZE_SPEECH_OP to \"GET\")),\n                        MoveDocumentMembersToQueryParamsTransform(listOf(SYNTHESIZE_SPEECH_OP)),\n                    ),\n            ),\n    )\n}\n\nclass AwsPresigningDecorator internal constructor(\n    private val presignableOperations: Map<ShapeId, PresignableOperation> = PRESIGNABLE_OPERATIONS,\n) : ClientCodegenDecorator {\n    companion object {\n        const val ORDER: Byte = 0\n    }\n\n    override val name: String = \"AwsPresigning\"\n    override val order: Byte = ORDER\n\n    /**\n     * Adds presignable trait to known presignable operations and creates synthetic presignable shapes for codegen\n     */\n    override fun transformModel(\n        service: ServiceShape,\n        model: Model,\n        settings: ClientRustSettings,\n    ): Model {\n        val modelWithSynthetics = addSyntheticOperations(model)\n        val presignableTransforms = mutableListOf<PresignModelTransform>()\n        val intermediate =\n            ModelTransformer.create().mapShapes(modelWithSynthetics) { shape ->\n                if (shape is OperationShape && presignableOperations.containsKey(shape.id)) {\n                    presignableTransforms.addAll(presignableOperations.getValue(shape.id).modelTransforms)\n                    shape.toBuilder().addTrait(PresignableTrait(syntheticShapeId(shape))).build()\n                } else {\n                    shape\n                }\n            }\n        // Apply operation-specific model transformations\n        return presignableTransforms.fold(intermediate) { m, t -> t.transform(m) }\n    }\n\n    private fun addSyntheticOperations(model: Model): Model {\n        val presignableOps =\n            model.shapes()\n                .filter { shape -> shape is OperationShape && presignableOperations.containsKey(shape.id) }\n                .toList()\n        return model.toBuilder().also { builder ->\n            for (op in presignableOps) {\n                builder.cloneOperation(model, op, ::syntheticShapeId)\n            }\n        }.build()\n    }\n\n    private fun anyPresignedShapes(ctx: ClientCodegenContext) =\n        TopDownIndex.of(ctx.model).getContainedOperations(ctx.serviceShape)\n            .any { presignableOperations.containsKey(it.id) }\n\n    override fun extraSections(codegenContext: ClientCodegenContext): List<AdHocCustomization> =\n        anyPresignedShapes(codegenContext).thenSingletonListOf {\n            adhocCustomization<CustomizableOperationSection.CustomizableOperationImpl> {\n                rustTemplate(\n                    \"\"\"\n                    /// Sends the request and returns the response.\n                    ##[allow(unused_mut)]\n                    pub async fn presigned(mut self, presigning_config: #{PresigningConfig}) -> #{Result}<#{PresignedRequest}, crate::error::SdkError<E>> where\n                        E: std::error::Error + #{Send} + #{Sync} + 'static,\n                        B: #{CustomizablePresigned}<E>\n                    {\n                        self.execute(move |sender, conf|sender.presign(conf, presigning_config)).await\n                    }\n                    \"\"\",\n                    *preludeScope,\n                    *presigningTypes,\n                    \"CustomizablePresigned\" to customizablePresigned,\n                )\n            }\n        }\n\n    override fun extras(\n        codegenContext: ClientCodegenContext,\n        rustCrate: RustCrate,\n    ) {\n        if (anyPresignedShapes(codegenContext)) {\n            rustCrate.mergeFeature(\n                Feature(\n                    \"http-1x\",\n                    default = true,\n                    listOf(\"aws-smithy-runtime-api/http-1x\"),\n                ),\n            )\n        }\n    }\n\n    private val customizablePresigned =\n        RuntimeType.forInlineFun(\"CustomizablePresigned\", InternalTraitsModule) {\n            rustTemplate(\n                \"\"\"\n                pub trait CustomizablePresigned<E>: #{Send} + #{Sync} {\n                    fn presign(self, config_override: crate::config::Builder, presigning_config: #{PresigningConfig}) -> BoxFuture<SendResult<#{PresignedRequest}, E>>;\n                }\n\n                \"\"\",\n                *preludeScope,\n                *presigningTypes,\n            )\n        }\n}\n\nclass AwsPresignedFluentBuilderMethod(\n    private val codegenContext: ClientCodegenContext,\n) : FluentClientCustomization() {\n    private val runtimeConfig = codegenContext.runtimeConfig\n    private val codegenScope =\n        arrayOf(\n            *preludeScope,\n            *presigningTypes,\n            \"Error\" to AwsRuntimeType.presigning().resolve(\"config::Error\"),\n            \"SdkError\" to RuntimeType.sdkError(runtimeConfig),\n        )\n\n    // Presigning requires both http version features since it pub exposes into_http_02x_request\n    // and into_http_1x_request functions\n    private val smithyRuntimeApi =\n        CargoDependency.smithyRuntimeApiClient(codegenContext.runtimeConfig)\n            .withFeature(\"http-02x\")\n            .withFeature(\"http-1x\")\n            .toType()\n\n    override fun section(section: FluentClientSection): Writable =\n        writable {\n            if (section is FluentClientSection.FluentBuilderImpl && section.operationShape.hasTrait(PresignableTrait::class.java)) {\n                documentPresignedMethod(hasConfigArg = false)\n                rustBlockTemplate(\n                    \"\"\"\n                    ##[allow(unused_mut)]\n                    pub async fn presigned(\n                        mut self,\n                        presigning_config: #{PresigningConfig},\n                    ) -> #{Result}<#{PresignedRequest}, #{SdkError}<#{OpError}, #{RawResponseType}>>\n                    \"\"\",\n                    *codegenScope,\n                    \"OpError\" to section.operationErrorType,\n                    \"RawResponseType\" to\n                        smithyRuntimeApi\n                            .resolve(\"client::orchestrator::HttpResponse\"),\n                ) {\n                    renderPresignedMethodBody(section)\n                    val builderName = section.operationShape.fluentBuilderType(codegenContext.symbolProvider).name\n                    addDependency(implementPresignedTrait(section, builderName).dependency!!)\n                }\n            }\n        }\n\n    private fun implementPresignedTrait(\n        section: FluentClientSection.FluentBuilderImpl,\n        builderName: String,\n    ): RuntimeType {\n        return RuntimeType.forInlineFun(\n            \"TraitImplementation\",\n            codegenContext.symbolProvider.moduleForBuilder(section.operationShape),\n        ) {\n            rustTemplate(\n                \"\"\"\n                impl\n                    crate::client::customize::internal::CustomizablePresigned<\n                        #{OperationError},\n                    > for $builderName\n                {\n                    fn presign(\n                        self,\n                        config_override: crate::config::Builder,\n                        presigning_config: #{PresigningConfig}\n                    ) -> crate::client::customize::internal::BoxFuture<\n                        crate::client::customize::internal::SendResult<\n                            #{PresignedRequest},\n                            #{OperationError},\n                        >,\n                    > {\n                        #{Box}::pin(async move { self.config_override(config_override).presigned(presigning_config).await })\n                    }\n                }\n                \"\"\",\n                *codegenScope,\n                \"OperationError\" to section.operationErrorType,\n                \"SdkError\" to RuntimeType.sdkError(runtimeConfig),\n            )\n        }\n    }\n\n    private fun RustWriter.renderPresignedMethodBody(section: FluentClientSection.FluentBuilderImpl) {\n        val presignableOp = PRESIGNABLE_OPERATIONS.getValue(section.operationShape.id)\n        val operationShape =\n            if (presignableOp.hasModelTransforms()) {\n                codegenContext.model.expectShape(\n                    syntheticShapeId(section.operationShape.id),\n                    OperationShape::class.java,\n                )\n            } else {\n                section.operationShape\n            }\n\n        rustTemplate(\n            \"\"\"\n            #{alternate_presigning_serializer}\n\n            let runtime_plugins = #{Operation}::operation_runtime_plugins(\n                self.handle.runtime_plugins.clone(),\n                &self.handle.conf,\n                self.config_override,\n            )\n                .with_client_plugin(#{SigV4PresigningRuntimePlugin}::new(presigning_config, #{payload_override}))\n                #{alternate_presigning_serializer_registration};\n\n            let input = self.inner.build().map_err(#{SdkError}::construction_failure)?;\n            let mut context = #{Operation}::orchestrate_with_stop_point(&runtime_plugins, input, #{StopPoint}::BeforeTransmit)\n                .await\n                .map_err(|err| {\n                    err.map_service_error(|err| {\n                        err.downcast::<#{OperationError}>().expect(\"correct error type\")\n                    })\n                })?;\n            let request = context.take_request().expect(\"request set before transmit\");\n            #{PresignedRequest}::new(request).map_err(#{SdkError}::construction_failure)\n            \"\"\",\n            *codegenScope,\n            \"Operation\" to codegenContext.symbolProvider.toSymbol(section.operationShape),\n            \"OperationError\" to section.operationErrorType,\n            \"RuntimePlugins\" to RuntimeType.runtimePlugins(runtimeConfig),\n            \"SharedInterceptor\" to\n                smithyRuntimeApi.resolve(\"client::interceptors\")\n                    .resolve(\"SharedInterceptor\"),\n            \"SigV4PresigningRuntimePlugin\" to\n                AwsRuntimeType.presigningInterceptor(runtimeConfig)\n                    .resolve(\"SigV4PresigningRuntimePlugin\"),\n            \"StopPoint\" to RuntimeType.smithyRuntime(runtimeConfig).resolve(\"client::orchestrator::StopPoint\"),\n            \"USER_AGENT\" to CargoDependency.Http1x.toType().resolve(\"header::USER_AGENT\"),\n            \"alternate_presigning_serializer\" to\n                writable {\n                    if (presignableOp.hasModelTransforms()) {\n                        val smithyTypes = RuntimeType.smithyTypes(codegenContext.runtimeConfig)\n                        rustTemplate(\n                            \"\"\"\n                            ##[derive(::std::fmt::Debug)]\n                            struct AlternatePresigningSerializerRuntimePlugin;\n                            impl #{RuntimePlugin} for AlternatePresigningSerializerRuntimePlugin {\n                                fn config(&self) -> #{Option}<#{FrozenLayer}> {\n                                    let mut cfg = #{Layer}::new(\"presigning_serializer\");\n                                    cfg.store_put(#{SharedRequestSerializer}::new(#{AlternateSerializer}));\n                                    #{Some}(cfg.freeze())\n                                }\n                            }\n                            \"\"\",\n                            *preludeScope,\n                            \"AlternateSerializer\" to alternateSerializer(operationShape),\n                            \"FrozenLayer\" to smithyTypes.resolve(\"config_bag::FrozenLayer\"),\n                            \"Layer\" to smithyTypes.resolve(\"config_bag::Layer\"),\n                            \"RuntimePlugin\" to RuntimeType.runtimePlugin(codegenContext.runtimeConfig),\n                            \"SharedRequestSerializer\" to\n                                smithyRuntimeApi\n                                    .resolve(\"client::ser_de::SharedRequestSerializer\"),\n                        )\n                    }\n                },\n            \"alternate_presigning_serializer_registration\" to\n                writable {\n                    if (presignableOp.hasModelTransforms()) {\n                        rust(\".with_operation_plugin(AlternatePresigningSerializerRuntimePlugin)\")\n                    }\n                },\n            \"payload_override\" to\n                writable {\n                    rustTemplate(\n                        \"#{aws_sigv4}::http_request::SignableBody::\" +\n                            when (presignableOp.payloadSigningType) {\n                                PayloadSigningType.EMPTY -> \"Bytes(b\\\"\\\")\"\n                                PayloadSigningType.UNSIGNED_PAYLOAD -> \"UnsignedPayload\"\n                            },\n                        \"aws_sigv4\" to AwsRuntimeType.awsSigv4(runtimeConfig),\n                    )\n                },\n        )\n    }\n\n    private fun alternateSerializer(transformedOperationShape: OperationShape): RuntimeType =\n        transformedOperationShape.contextName(codegenContext.serviceShape).replaceFirstChar {\n            it.uppercase()\n        }.let { baseName ->\n            \"${baseName}PresigningRequestSerializer\".let { name ->\n                RuntimeType.forInlineFun(\n                    name,\n                    codegenContext.symbolProvider.moduleForShape(transformedOperationShape),\n                ) {\n                    RequestSerializerGenerator(\n                        codegenContext,\n                        codegenContext.protocolImpl!!,\n                        null,\n                        nameOverride = name,\n                    ).render(\n                        this,\n                        transformedOperationShape,\n                    )\n                }\n            }\n        }\n}\n\ninterface PresignModelTransform {\n    fun transform(model: Model): Model\n}\n\n/**\n * Model transform that overrides HTTP request methods for the given map of operations.\n *\n * Note: this doesn't work for non-REST protocols. The protocol generators will need to be refactored\n * to respect HTTP traits or synthetic equivalents if this is needed for AwsQuery, Ec2Query, or AwsJson.\n */\nclass OverrideHttpMethodTransform(\n    httpMethodOverrides: Map<ShapeId, String>,\n) : PresignModelTransform {\n    private val overrides = httpMethodOverrides.mapKeys { entry -> syntheticShapeId(entry.key) }\n\n    override fun transform(model: Model): Model {\n        return ModelTransformer.create().mapShapes(model) { shape ->\n            if (shape is OperationShape && overrides.containsKey(shape.id)) {\n                val newMethod = overrides.getValue(shape.id)\n                check(shape.hasTrait(HttpTrait.ID)) {\n                    \"OverrideHttpMethodTransform can only be used with REST protocols\"\n                }\n                val originalHttpTrait = shape.expectTrait<HttpTrait>()\n                shape.toBuilder()\n                    .removeTrait(HttpTrait.ID)\n                    .addTrait(originalHttpTrait.toBuilder().method(newMethod).build())\n                    .build()\n            } else {\n                shape\n            }\n        }\n    }\n}\n\n/**\n * Model transform that moves document members into query parameters for the given list of operations.\n *\n * Note: this doesn't work for non-REST protocols. The protocol generators will need to be refactored\n * to respect HTTP traits or synthetic equivalents if this is needed for AwsQuery, Ec2Query, or AwsJson.\n */\nclass MoveDocumentMembersToQueryParamsTransform(\n    private val presignableOperations: List<ShapeId>,\n) : PresignModelTransform {\n    override fun transform(model: Model): Model {\n        val index = HttpBindingIndex(model)\n        val operations =\n            presignableOperations.map { id ->\n                model.expectShape(syntheticShapeId(id), OperationShape::class.java).also { shape ->\n                    check(shape.hasTrait(HttpTrait.ID)) {\n                        \"MoveDocumentMembersToQueryParamsTransform can only be used with REST protocols\"\n                    }\n                }\n            }\n\n        // Find document members of the presignable operations\n        val membersToUpdate =\n            operations.map { operation ->\n                val payloadBindings = index.getRequestBindings(operation, HttpBinding.Location.DOCUMENT)\n                payloadBindings.map { binding -> binding.member }\n            }.flatten()\n\n        // Transform found shapes for presigning\n        return ModelTransformer.create().mapShapes(model) { shape ->\n            if (shape is MemberShape && membersToUpdate.contains(shape)) {\n                shape.toBuilder().addTrait(HttpQueryTrait(shape.memberName)).build()\n            } else {\n                shape\n            }\n        }\n    }\n}\n\nprivate fun RustWriter.documentPresignedMethod(hasConfigArg: Boolean) {\n    val configBlurb =\n        if (hasConfigArg) {\n            \"The credentials provider from the `config` will be used to generate the request's signature.\\n\"\n        } else {\n            \"\"\n        }\n    docs(\n        \"\"\"\n        Creates a presigned request for this operation.\n\n        ${configBlurb}The `presigning_config` provides additional presigning-specific config values, such as the\n        amount of time the request should be valid for after creation.\n\n        Presigned requests can be given to other users or applications to access a resource or perform\n        an operation without having access to the AWS security credentials.\n\n        _Important:_ If you're using credentials that can expire, such as those from STS AssumeRole or SSO, then\n        the presigned request can only be valid for as long as the credentials used to create it are.\n        \"\"\",\n    )\n}\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/main/kotlin/software/amazon/smithy/rustsdk/AwsRequestIdDecorator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rustsdk\n\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\n\n/**\n * Customizes response parsing logic to add AWS request IDs to error metadata and outputs\n */\nclass AwsRequestIdDecorator : BaseRequestIdDecorator() {\n    override val name: String = \"AwsRequestIdDecorator\"\n    override val order: Byte = 0\n\n    override val fieldName: String = \"request_id\"\n    override val accessorFunctionName: String = \"request_id\"\n\n    private fun requestIdModule(codegenContext: ClientCodegenContext): RuntimeType =\n        AwsRuntimeType.awsTypes(codegenContext.runtimeConfig).resolve(\"request_id\")\n\n    override fun accessorTrait(codegenContext: ClientCodegenContext): RuntimeType =\n        requestIdModule(codegenContext).resolve(\"RequestId\")\n\n    override fun applyToError(codegenContext: ClientCodegenContext): RuntimeType =\n        requestIdModule(codegenContext).resolve(\"apply_request_id\")\n}\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/main/kotlin/software/amazon/smithy/rustsdk/AwsRuntimeType.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rustsdk\n\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.Visibility\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeCrateLocation\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport java.io.File\nimport java.nio.file.Path\n\nfun RuntimeConfig.awsRoot(): RuntimeCrateLocation {\n    val updatedPath =\n        runtimeCrateLocation.path?.let { cratePath ->\n            val asPath = Path.of(cratePath)\n            val path =\n                if (asPath.isAbsolute) {\n                    asPath.parent.resolve(\"aws/rust-runtime\").toAbsolutePath().toString()\n                } else {\n                    cratePath\n                }\n            check(File(path).exists()) { \"$path must exist to generate a working SDK\" }\n            path\n        }\n    return runtimeCrateLocation.copy(\n        path = updatedPath, versions = runtimeCrateLocation.versions,\n    )\n}\n\nobject AwsRuntimeType {\n    fun presigning(): RuntimeType =\n        RuntimeType.forInlineDependency(\n            InlineAwsDependency.forRustFile(\n                \"presigning\", visibility = Visibility.PUBLIC,\n                // Requires http_02x because of existing pub *_http_02x_request methods\n                CargoDependency.Http0x,\n                CargoDependency.Http1x,\n                CargoDependency.HttpBody1x,\n            ),\n        )\n\n    fun presigningInterceptor(runtimeConfig: RuntimeConfig): RuntimeType =\n        RuntimeType.forInlineDependency(\n            InlineAwsDependency.forRustFile(\n                \"presigning_interceptors\",\n                visibility = Visibility.PUBCRATE,\n                AwsCargoDependency.awsSigv4(runtimeConfig),\n                CargoDependency.smithyRuntimeApiClient(runtimeConfig),\n            ),\n        )\n\n    fun awsCredentialTypes(runtimeConfig: RuntimeConfig) = AwsCargoDependency.awsCredentialTypes(runtimeConfig).toType()\n\n    fun awsCredentialTypesTestUtil(runtimeConfig: RuntimeConfig) =\n        AwsCargoDependency.awsCredentialTypes(runtimeConfig).toDevDependency().withFeature(\"test-util\").toType()\n\n    fun awsSigv4(runtimeConfig: RuntimeConfig) = AwsCargoDependency.awsSigv4(runtimeConfig).toType()\n\n    fun awsTypes(runtimeConfig: RuntimeConfig) = AwsCargoDependency.awsTypes(runtimeConfig).toType()\n\n    fun awsRuntime(runtimeConfig: RuntimeConfig) = AwsCargoDependency.awsRuntime(runtimeConfig).toType()\n\n    fun awsRuntimeTestUtil(runtimeConfig: RuntimeConfig) =\n        AwsCargoDependency.awsRuntime(runtimeConfig).toDevDependency().withFeature(\"test-util\").toType()\n\n    fun awsRuntimeApi(runtimeConfig: RuntimeConfig) = AwsCargoDependency.awsRuntimeApi(runtimeConfig).toType()\n}\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/main/kotlin/software/amazon/smithy/rustsdk/BaseRequestIdDecorator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rustsdk\n\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.OperationSection\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.error.ErrorCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.error.ErrorSection\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\nimport software.amazon.smithy.rust.codegen.core.smithy.RustCrate\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.BuilderCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.BuilderSection\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.StructureCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.StructureSection\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.error.ErrorImplCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.error.ErrorImplSection\nimport software.amazon.smithy.rust.codegen.core.smithy.isOptional\nimport software.amazon.smithy.rust.codegen.core.smithy.traits.SyntheticOutputTrait\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\n\n/**\n * Base customization for adding a request ID (or extended request ID) to outputs and errors.\n */\nabstract class BaseRequestIdDecorator : ClientCodegenDecorator {\n    abstract val accessorFunctionName: String\n    abstract val fieldName: String\n\n    abstract fun accessorTrait(codegenContext: ClientCodegenContext): RuntimeType\n\n    abstract fun applyToError(codegenContext: ClientCodegenContext): RuntimeType\n\n    override fun operationCustomizations(\n        codegenContext: ClientCodegenContext,\n        operation: OperationShape,\n        baseCustomizations: List<OperationCustomization>,\n    ): List<OperationCustomization> = baseCustomizations + listOf(RequestIdOperationCustomization(codegenContext))\n\n    override fun errorCustomizations(\n        codegenContext: ClientCodegenContext,\n        baseCustomizations: List<ErrorCustomization>,\n    ): List<ErrorCustomization> = baseCustomizations + listOf(RequestIdErrorCustomization(codegenContext))\n\n    override fun errorImplCustomizations(\n        codegenContext: ClientCodegenContext,\n        baseCustomizations: List<ErrorImplCustomization>,\n    ): List<ErrorImplCustomization> = baseCustomizations + listOf(RequestIdErrorImplCustomization(codegenContext))\n\n    override fun structureCustomizations(\n        codegenContext: ClientCodegenContext,\n        baseCustomizations: List<StructureCustomization>,\n    ): List<StructureCustomization> = baseCustomizations + listOf(RequestIdStructureCustomization(codegenContext))\n\n    override fun builderCustomizations(\n        codegenContext: ClientCodegenContext,\n        baseCustomizations: List<BuilderCustomization>,\n    ): List<BuilderCustomization> = baseCustomizations + listOf(RequestIdBuilderCustomization())\n\n    override fun extras(\n        codegenContext: ClientCodegenContext,\n        rustCrate: RustCrate,\n    ) {\n        rustCrate.withModule(ClientRustModule.Operation) {\n            // Re-export RequestId in generated crate\n            rust(\"pub use #T;\", accessorTrait(codegenContext))\n        }\n    }\n\n    open fun asMemberShape(container: StructureShape): MemberShape? {\n        return container.members().firstOrNull { member -> member.memberName.lowercase() == \"requestid\" }\n    }\n\n    private inner class RequestIdOperationCustomization(private val codegenContext: ClientCodegenContext) :\n        OperationCustomization() {\n        override fun section(section: OperationSection): Writable =\n            writable {\n                when (section) {\n                    is OperationSection.PopulateErrorMetadataExtras -> {\n                        rustTemplate(\n                            \"${section.builderName} = #{apply_to_error}(${section.builderName}, ${section.responseHeadersName});\",\n                            \"apply_to_error\" to applyToError(codegenContext),\n                        )\n                    }\n\n                    is OperationSection.MutateOutput -> {\n                        rust(\n                            \"output._set_$fieldName(#T::$accessorFunctionName(${section.responseHeadersName}).map(str::to_string));\",\n                            accessorTrait(codegenContext),\n                        )\n                    }\n\n                    is OperationSection.BeforeParseResponse -> {\n                        rustTemplate(\n                            \"#{tracing}::debug!($fieldName = ?#{trait}::$accessorFunctionName(${section.responseName}));\",\n                            \"tracing\" to RuntimeType.Tracing,\n                            \"trait\" to accessorTrait(codegenContext),\n                        )\n                    }\n\n                    else -> {}\n                }\n            }\n    }\n\n    private inner class RequestIdErrorCustomization(private val codegenContext: ClientCodegenContext) :\n        ErrorCustomization() {\n        override fun section(section: ErrorSection): Writable =\n            writable {\n                when (section) {\n                    is ErrorSection.OperationErrorAdditionalTraitImpls -> {\n                        rustTemplate(\n                            \"\"\"\n                            impl #{AccessorTrait} for #{error} {\n                                fn $accessorFunctionName(&self) -> Option<&str> {\n                                    self.meta().$accessorFunctionName()\n                                }\n                            }\n                            \"\"\",\n                            \"AccessorTrait\" to accessorTrait(codegenContext),\n                            \"error\" to section.errorSymbol,\n                        )\n                    }\n\n                    is ErrorSection.ServiceErrorAdditionalTraitImpls -> {\n                        rustBlock(\"impl #T for Error\", accessorTrait(codegenContext)) {\n                            rustBlock(\"fn $accessorFunctionName(&self) -> Option<&str>\") {\n                                rustBlock(\"match self\") {\n                                    section.allErrors.forEach { error ->\n                                        val optional =\n                                            asMemberShape(error)?.let { member ->\n                                                codegenContext.symbolProvider.toSymbol(member).isOptional()\n                                            } ?: true\n                                        val wrapped =\n                                            writable {\n                                                when (optional) {\n                                                    false -> rustTemplate(\"#{Some}(e.$accessorFunctionName())\", *preludeScope)\n                                                    true -> rustTemplate(\"e.$accessorFunctionName()\")\n                                                }\n                                            }\n                                        val sym = codegenContext.symbolProvider.toSymbol(error)\n                                        rust(\"Self::${sym.name}(e) => #T,\", wrapped)\n                                    }\n                                    rust(\"Self::Unhandled(e) => e.meta.$accessorFunctionName(),\")\n                                }\n                            }\n                        }\n                    }\n                }\n            }\n    }\n\n    private inner class RequestIdErrorImplCustomization(private val codegenContext: ClientCodegenContext) :\n        ErrorImplCustomization() {\n        override fun section(section: ErrorImplSection): Writable =\n            writable {\n                when (section) {\n                    is ErrorImplSection.ErrorAdditionalTraitImpls -> {\n                        rustBlock(\"impl #1T for #2T\", accessorTrait(codegenContext), section.errorType) {\n                            rustBlock(\"fn $accessorFunctionName(&self) -> Option<&str>\") {\n                                rust(\"use #T;\", RuntimeType.provideErrorMetadataTrait(codegenContext.runtimeConfig))\n                                rust(\"self.meta().$accessorFunctionName()\")\n                            }\n                        }\n                    }\n\n                    else -> {}\n                }\n            }\n    }\n\n    private inner class RequestIdStructureCustomization(private val codegenContext: ClientCodegenContext) :\n        StructureCustomization() {\n        override fun section(section: StructureSection): Writable =\n            writable {\n                if (section.shape.hasTrait<SyntheticOutputTrait>()) {\n                    when (section) {\n                        is StructureSection.AdditionalFields -> {\n                            rust(\"_$fieldName: Option<String>,\")\n                        }\n\n                        is StructureSection.AdditionalTraitImpls -> {\n                            rustTemplate(\n                                \"\"\"\n                                impl #{AccessorTrait} for ${section.structName} {\n                                    fn $accessorFunctionName(&self) -> Option<&str> {\n                                        self._$fieldName.as_deref()\n                                    }\n                                }\n                                \"\"\",\n                                \"AccessorTrait\" to accessorTrait(codegenContext),\n                            )\n                        }\n\n                        is StructureSection.AdditionalDebugFields -> {\n                            rust(\"\"\"${section.formatterName}.field(\"_$fieldName\", &self._$fieldName);\"\"\")\n                        }\n                    }\n                }\n            }\n    }\n\n    private inner class RequestIdBuilderCustomization : BuilderCustomization() {\n        override fun section(section: BuilderSection): Writable =\n            writable {\n                if (section.shape.hasTrait<SyntheticOutputTrait>()) {\n                    when (section) {\n                        is BuilderSection.AdditionalFields -> {\n                            rust(\"_$fieldName: Option<String>,\")\n                        }\n\n                        is BuilderSection.AdditionalMethods -> {\n                            rust(\n                                \"\"\"\n                                pub(crate) fn _$fieldName(mut self, $fieldName: impl Into<String>) -> Self {\n                                    self._$fieldName = Some($fieldName.into());\n                                    self\n                                }\n\n                                pub(crate) fn _set_$fieldName(&mut self, $fieldName: Option<String>) -> &mut Self {\n                                    self._$fieldName = $fieldName;\n                                    self\n                                }\n                                \"\"\",\n                            )\n                        }\n\n                        is BuilderSection.AdditionalDebugFields -> {\n                            rust(\"\"\"${section.formatterName}.field(\"_$fieldName\", &self._$fieldName);\"\"\")\n                        }\n\n                        is BuilderSection.AdditionalFieldsInBuild -> {\n                            rust(\"_$fieldName: self._$fieldName,\")\n                        }\n                    }\n                }\n            }\n    }\n}\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/main/kotlin/software/amazon/smithy/rustsdk/CrateLicenseDecorator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rustsdk\n\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.core.rustlang.raw\nimport software.amazon.smithy.rust.codegen.core.smithy.RustCrate\n\nclass CrateLicenseDecorator : ClientCodegenDecorator {\n    override val name: String = \"CrateLicense\"\n    override val order: Byte = 0\n\n    override fun extras(\n        codegenContext: ClientCodegenContext,\n        rustCrate: RustCrate,\n    ) {\n        rustCrate.withFile(\"LICENSE\") {\n            val license = this::class.java.getResource(\"/LICENSE\").readText()\n            raw(license)\n        }\n    }\n}\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/main/kotlin/software/amazon/smithy/rustsdk/CredentialProvidersDecorator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rustsdk\n\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule\nimport software.amazon.smithy.rust.codegen.client.smithy.configReexport\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ConditionalDecorator\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.TestUtilFeature\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.config.ServiceConfig\nimport software.amazon.smithy.rust.codegen.core.rustlang.featureGateBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlockTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\nimport software.amazon.smithy.rust.codegen.core.smithy.RustCrate\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.AdHocCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.adhocCustomization\n\nclass CredentialsProviderDecorator : ConditionalDecorator(\n    predicate = { codegenContext, _ -> codegenContext?.usesSigAuth() ?: false },\n    delegateTo =\n        object : ClientCodegenDecorator {\n            override val name: String = \"CredentialsProviderDecorator\"\n            override val order: Byte = 0\n\n            override fun configCustomizations(\n                codegenContext: ClientCodegenContext,\n                baseCustomizations: List<ConfigCustomization>,\n            ): List<ConfigCustomization> = baseCustomizations + CredentialProviderConfig(codegenContext)\n\n            override fun extraSections(codegenContext: ClientCodegenContext): List<AdHocCustomization> =\n                listOf(\n                    adhocCustomization<SdkConfigSection.CopySdkConfigToClientConfig> { section ->\n                        rust(\"${section.serviceConfigBuilder}.set_credentials_provider(${section.sdkConfig}.credentials_provider());\")\n                    },\n                )\n\n            override fun extras(\n                codegenContext: ClientCodegenContext,\n                rustCrate: RustCrate,\n            ) {\n                rustCrate.mergeFeature(TestUtilFeature.copy(deps = listOf(\"aws-credential-types/test-util\")))\n\n                rustCrate.withModule(ClientRustModule.config) {\n                    rust(\n                        \"pub use #T::Credentials;\",\n                        AwsRuntimeType.awsCredentialTypes(codegenContext.runtimeConfig),\n                    )\n                }\n            }\n        },\n)\n\n/**\n * Add a `.credentials_provider` field and builder to the `Config` for a given service\n */\nclass CredentialProviderConfig(private val codegenContext: ClientCodegenContext) : ConfigCustomization() {\n    private val runtimeConfig = codegenContext.runtimeConfig\n    private val codegenScope =\n        arrayOf(\n            *preludeScope,\n            \"Credentials\" to configReexport(AwsRuntimeType.awsCredentialTypes(runtimeConfig).resolve(\"Credentials\")),\n            \"ProvideCredentials\" to\n                configReexport(\n                    AwsRuntimeType.awsCredentialTypes(runtimeConfig)\n                        .resolve(\"provider::ProvideCredentials\"),\n                ),\n            \"SharedCredentialsProvider\" to\n                configReexport(\n                    AwsRuntimeType.awsCredentialTypes(runtimeConfig)\n                        .resolve(\"provider::SharedCredentialsProvider\"),\n                ),\n            \"SIGV4A_SCHEME_ID\" to\n                AwsRuntimeType.awsRuntime(runtimeConfig)\n                    .resolve(\"auth::sigv4a::SCHEME_ID\"),\n            \"SIGV4_SCHEME_ID\" to\n                AwsRuntimeType.awsRuntime(runtimeConfig)\n                    .resolve(\"auth::sigv4::SCHEME_ID\"),\n            \"TestCredentials\" to AwsRuntimeType.awsCredentialTypesTestUtil(runtimeConfig).resolve(\"Credentials\"),\n        )\n\n    override fun section(section: ServiceConfig) =\n        writable {\n            when (section) {\n                ServiceConfig.ConfigImpl -> {\n                    rustTemplate(\n                        \"\"\"\n                        /// This function was intended to be removed, and has been broken since release-2023-11-15 as it always returns a `None`. Do not use.\n                        ##[deprecated(note = \"This function was intended to be removed, and has been broken since release-2023-11-15 as it always returns a `None`. Do not use.\")]\n                        pub fn credentials_provider(&self) -> Option<#{SharedCredentialsProvider}> {\n                            #{None}\n                        }\n                        \"\"\",\n                        *codegenScope,\n                    )\n                }\n\n                ServiceConfig.BuilderImpl -> {\n                    rustTemplate(\n                        \"\"\"\n                        /// Sets the credentials provider for this service\n                        pub fn credentials_provider(mut self, credentials_provider: impl #{ProvideCredentials} + 'static) -> Self {\n                            self.set_credentials_provider(#{Some}(#{SharedCredentialsProvider}::new(credentials_provider)));\n                            self\n                        }\n                        \"\"\",\n                        *codegenScope,\n                    )\n\n                    rustBlockTemplate(\n                        \"\"\"\n                        /// Sets the credentials provider for this service\n                        pub fn set_credentials_provider(&mut self, credentials_provider: #{Option}<#{SharedCredentialsProvider}>) -> &mut Self\n                        \"\"\",\n                        *codegenScope,\n                    ) {\n                        rustBlockTemplate(\n                            \"\"\"\n                            if let Some(credentials_provider) = credentials_provider\n                            \"\"\",\n                            *codegenScope,\n                        ) {\n                            if (codegenContext.usesSigV4a()) {\n                                featureGateBlock(\"sigv4a\") {\n                                    rustTemplate(\n                                        \"self.runtime_components.set_identity_resolver(#{SIGV4A_SCHEME_ID}, credentials_provider.clone());\",\n                                        *codegenScope,\n                                    )\n                                }\n                            }\n                            rustTemplate(\n                                \"self.runtime_components.set_identity_resolver(#{SIGV4_SCHEME_ID}, credentials_provider);\",\n                                *codegenScope,\n                            )\n                        }\n                        rust(\"self\")\n                    }\n                }\n\n                is ServiceConfig.DefaultForTests ->\n                    rustTemplate(\n                        \"${section.configBuilderRef}.set_credentials_provider(Some(#{SharedCredentialsProvider}::new(#{TestCredentials}::for_tests())));\",\n                        *codegenScope,\n                    )\n\n                else -> emptySection\n            }\n        }\n}\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/main/kotlin/software/amazon/smithy/rustsdk/DisablePayloadSigningDecorator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rustsdk\n\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.OperationSection\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\n\ninternal val DISABLE_PAYLOAD_SIGNING_OPERATIONS by lazy {\n    listOf(\n        // S3\n        ShapeId.from(\"com.amazonaws.s3#PutObject\"),\n        ShapeId.from(\"com.amazonaws.s3#UploadPart\"),\n    )\n}\n\nclass DisablePayloadSigningDecorator : ClientCodegenDecorator {\n    override val name: String = \"DisablePayloadSigning\"\n    override val order: Byte = 0\n\n    override fun operationCustomizations(\n        codegenContext: ClientCodegenContext,\n        operation: OperationShape,\n        baseCustomizations: List<OperationCustomization>,\n    ): List<OperationCustomization> {\n        return baseCustomizations +\n            object : OperationCustomization() {\n                private val runtimeConfig = codegenContext.runtimeConfig\n\n                override fun section(section: OperationSection): Writable {\n                    return writable {\n                        when (section) {\n                            is OperationSection.CustomizableOperationImpl -> {\n                                if (DISABLE_PAYLOAD_SIGNING_OPERATIONS.contains(operation.id)) {\n                                    rustTemplate(\n                                        \"\"\"\n                                        /// Disable payload signing for this request.\n                                        ///\n                                        /// **WARNING:** This is an advanced feature that removes\n                                        /// the cost of signing a request payload by removing a data\n                                        /// integrity check. Not all services/operations support\n                                        /// this feature.\n                                        pub fn disable_payload_signing(self) -> Self {\n                                            self.runtime_plugin(#{PayloadSigningOverrideRuntimePlugin}::unsigned())\n                                        }\n                                        \"\"\",\n                                        *preludeScope,\n                                        \"PayloadSigningOverrideRuntimePlugin\" to\n                                            AwsRuntimeType.awsRuntime(runtimeConfig)\n                                                .resolve(\"auth::PayloadSigningOverrideRuntimePlugin\"),\n                                    )\n                                }\n                            }\n\n                            else -> {}\n                        }\n                    }\n                }\n            }\n    }\n}\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/main/kotlin/software/amazon/smithy/rustsdk/EndpointBasedAuthSchemeDecorator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rustsdk\n\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.auth.AuthCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.auth.AuthSection\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ConditionalDecorator\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency.Companion.Tracing\nimport software.amazon.smithy.rust.codegen.core.rustlang.Visibility\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.toType\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.util.sdkId\n\n/**\n * Contains a list of SDK IDs that are allowed to use the endpoint-based auth scheme resolution logic.\n *\n * Going forward, we expect new services to leverage static information in a model as much as possible (e.g., the auth\n * trait). This helps avoid runtime factors, such as endpoints, influencing auth option resolution behavior.\n */\nprivate val EndpointBasedAuthSchemeAllowList =\n    setOf(\n        \"CloudFront KeyValueStore\",\n        \"EventBridge\",\n        \"S3\",\n        \"SESv2\",\n    )\n\nclass EndpointBasedAuthSchemeDecorator : ConditionalDecorator(\n    predicate = { codegenContext, _ ->\n        codegenContext?.let {\n            EndpointBasedAuthSchemeAllowList.contains(codegenContext.serviceShape.sdkId())\n        } ?: false\n    },\n    delegateTo =\n        object : ClientCodegenDecorator {\n            override val name: String get() = \"EndpointBasedAuthSchemeDecorator\"\n            override val order: Byte = 0\n\n            override fun authCustomizations(\n                codegenContext: ClientCodegenContext,\n                baseCustomizations: List<AuthCustomization>,\n            ): List<AuthCustomization> =\n                baseCustomizations +\n                    object : AuthCustomization() {\n                        val ctx = codegenContext\n\n                        override fun section(section: AuthSection) =\n                            writable {\n                                when (section) {\n                                    is AuthSection.DefaultResolverAdditionalImpl -> {\n                                        rustTemplate(\n                                            \"\"\"\n                                            let _fut = #{AuthSchemeOptionsFuture}::new(async move {\n                                                #{resolve_endpoint_based_auth_scheme_options}(\n                                                    modeled_auth_options,\n                                                    _cfg,\n                                                    _runtime_components,\n                                                ).await\n                                            });\n                                            \"\"\",\n                                            \"AuthSchemeOptionsFuture\" to RuntimeType.smithyRuntimeApiClient(ctx.runtimeConfig).resolve(\"client::auth::AuthSchemeOptionsFuture\"),\n                                            \"AuthSchemeOptionResolverParams\" to RuntimeType.smithyRuntimeApiClient(ctx.runtimeConfig).resolve(\"client::auth::AuthSchemeOptionResolverParams\"),\n                                            \"resolve_endpoint_based_auth_scheme_options\" to inlineModule(ctx.runtimeConfig).resolve(\"resolve_endpoint_based_auth_scheme_options\"),\n                                        )\n                                    }\n\n                                    else -> emptySection\n                                }\n                            }\n                    }\n        },\n)\n\nprivate fun inlineModule(runtimeConfig: RuntimeConfig) =\n    InlineAwsDependency.forRustFile(\n        \"endpoint_auth\", visibility = Visibility.PUBCRATE,\n        CargoDependency.smithyRuntimeApiClient(runtimeConfig),\n        Tracing,\n    ).toType()\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/main/kotlin/software/amazon/smithy/rustsdk/EndpointBuiltInsDecorator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rustsdk\n\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.node.BooleanNode\nimport software.amazon.smithy.model.node.Node\nimport software.amazon.smithy.model.node.StringNode\nimport software.amazon.smithy.model.shapes.ServiceShape\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.rulesengine.aws.language.functions.AwsBuiltIns\nimport software.amazon.smithy.rulesengine.language.EndpointRuleSet\nimport software.amazon.smithy.rulesengine.language.syntax.parameters.BuiltIns\nimport software.amazon.smithy.rulesengine.language.syntax.parameters.Parameter\nimport software.amazon.smithy.rulesengine.language.syntax.parameters.ParameterType\nimport software.amazon.smithy.rulesengine.traits.EndpointBddTrait\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.client.smithy.endpoint.EndpointCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.endpoint.EndpointRulesetIndex\nimport software.amazon.smithy.rust.codegen.client.smithy.endpoint.rustName\nimport software.amazon.smithy.rust.codegen.client.smithy.endpoint.symbol\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigParam\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.config.configParamNewtype\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.config.loadFromConfigBag\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.config.standardConfigParam\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustType\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.docs\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.stripOuter\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.AdHocCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.mapRustType\nimport software.amazon.smithy.rust.codegen.core.util.PANIC\nimport software.amazon.smithy.rust.codegen.core.util.dq\nimport software.amazon.smithy.rust.codegen.core.util.extendIf\nimport software.amazon.smithy.rust.codegen.core.util.orNull\nimport software.amazon.smithy.rust.codegen.core.util.sdkId\nimport software.amazon.smithy.rust.codegen.core.util.toPascalCase\nimport java.util.Optional\n\n/** load a builtIn parameter from a ruleset by name */\nfun EndpointRuleSet.getBuiltIn(builtIn: String) = parameters.toList().find { it.builtIn == Optional.of(builtIn) }\n\nfun EndpointBddTrait.getBuiltIn(builtIn: String) = parameters.find { it.builtIn == Optional.of(builtIn) }\n\n/** load a builtIn parameter from a ruleset. The returned builtIn is the one defined in the ruleset (including latest docs, etc.) */\nfun EndpointRuleSet.getBuiltIn(builtIn: Parameter) = getBuiltIn(builtIn.builtIn.orNull()!!)\n\nfun EndpointBddTrait.getBuiltIn(builtIn: Parameter) = getBuiltIn(builtIn.builtIn.orNull()!!)\n\nfun ClientCodegenContext.getBuiltIn(builtIn: Parameter): Parameter? = getBuiltIn(builtIn.builtIn.orNull()!!)\n\nfun ClientCodegenContext.getBuiltIn(builtIn: String): Parameter? {\n    val idx = EndpointRulesetIndex.of(model)\n    val endpointBddTrait = idx.getEndpointBddTrait(serviceShape)\n    val rules = idx.endpointRulesForService(serviceShape)\n    return if (endpointBddTrait != null) {\n        endpointBddTrait.getBuiltIn(builtIn)\n    } else if (rules != null) {\n        rules.getBuiltIn(builtIn)\n    } else {\n        null\n    }\n}\n\nprivate fun promotedBuiltins(parameter: Parameter) =\n    parameter.builtIn == AwsBuiltIns.FIPS.builtIn ||\n        parameter.builtIn == AwsBuiltIns.DUALSTACK.builtIn ||\n        parameter.builtIn == BuiltIns.SDK_ENDPOINT.builtIn\n\nprivate fun configParamNewtype(\n    parameter: Parameter,\n    name: String,\n    runtimeConfig: RuntimeConfig,\n): RuntimeType {\n    val type = parameter.symbol().mapRustType { t -> t.stripOuter<RustType.Option>() }\n    return when (promotedBuiltins(parameter)) {\n        true ->\n            AwsRuntimeType.awsTypes(runtimeConfig)\n                .resolve(\"endpoint_config::${name.toPascalCase()}\")\n\n        false -> configParamNewtype(name.toPascalCase(), type, runtimeConfig)\n    }\n}\n\nprivate fun ConfigParam.Builder.toConfigParam(\n    parameter: Parameter,\n    runtimeConfig: RuntimeConfig,\n): ConfigParam =\n    this.name(this.name ?: parameter.name.rustName())\n        .type(parameter.symbol().mapRustType { t -> t.stripOuter<RustType.Option>() })\n        .newtype(configParamNewtype(parameter, this.name!!, runtimeConfig))\n        .setterDocs(this.setterDocs ?: parameter.documentation.orNull()?.let { writable { docs(it) } })\n        .build()\n\nfun Model.loadBuiltIn(\n    serviceId: ShapeId,\n    builtInSrc: Parameter,\n): Parameter? {\n    val model = this\n    val idx = EndpointRulesetIndex.of(model)\n    val service = model.expectShape(serviceId, ServiceShape::class.java)\n    val endpointBddTrait = idx.getEndpointBddTrait(service)\n    val rules = idx.endpointRulesForService(service)\n\n    // load the builtIn with a matching name from the ruleset allowing for any docs updates\n    if (endpointBddTrait != null) {\n        return endpointBddTrait.getBuiltIn(builtInSrc)\n    } else if (rules != null) {\n        return rules.getBuiltIn(builtInSrc)\n    } else {\n        return null\n    }\n}\n\nfun Model.sdkConfigSetter(\n    serviceShape: ServiceShape,\n    builtInSrc: Parameter,\n    configParameterNameOverride: String?,\n): AdHocCustomization? {\n    val serviceId = serviceShape.id\n    val builtIn = loadBuiltIn(serviceId, builtInSrc) ?: return null\n    val fieldName = configParameterNameOverride ?: builtIn.name.rustName()\n\n    val builtinType = builtIn.type!!\n    val map =\n        when (builtinType) {\n            ParameterType.STRING -> writable { rust(\"|s|s.to_string()\") }\n            ParameterType.BOOLEAN -> null\n            // No builtins currently map to stringArray\n            else -> PANIC(\"needs to handle unimplemented endpoint parameter builtin type: $builtinType\")\n        }\n\n    return if (fieldName == \"endpoint_url\") {\n        SdkConfigCustomization.copyFieldAndCheckForServiceConfig(serviceShape.sdkId(), fieldName, map)\n    } else {\n        SdkConfigCustomization.copyField(fieldName, map)\n    }\n}\n\n/**\n * Create a client codegen decorator that creates bindings for a builtIn parameter. Optionally, you can provide\n * [clientParam.Builder] which allows control over the config parameter that will be generated.\n */\nfun decoratorForBuiltIn(\n    builtIn: Parameter,\n    clientParamBuilder: ConfigParam.Builder? = null,\n): ClientCodegenDecorator {\n    val nameOverride = clientParamBuilder?.name\n    val name = nameOverride ?: builtIn.name.rustName()\n    return object : ClientCodegenDecorator {\n        override val name: String = \"Auto${builtIn.builtIn.get()}\"\n        override val order: Byte = 0\n\n        private fun rulesetContainsBuiltIn(codegenContext: ClientCodegenContext) =\n            codegenContext.getBuiltIn(builtIn) != null\n\n        override fun extraSections(codegenContext: ClientCodegenContext): List<AdHocCustomization> =\n            listOfNotNull(\n                codegenContext.model.sdkConfigSetter(\n                    codegenContext.serviceShape,\n                    builtIn,\n                    clientParamBuilder?.name,\n                ),\n            )\n\n        override fun configCustomizations(\n            codegenContext: ClientCodegenContext,\n            baseCustomizations: List<ConfigCustomization>,\n        ): List<ConfigCustomization> {\n            return baseCustomizations.extendIf(rulesetContainsBuiltIn(codegenContext)) {\n                standardConfigParam(\n                    clientParamBuilder?.toConfigParam(builtIn, codegenContext.runtimeConfig) ?: ConfigParam.Builder()\n                        .toConfigParam(builtIn, codegenContext.runtimeConfig),\n                )\n            }\n        }\n\n        override fun endpointCustomizations(codegenContext: ClientCodegenContext): List<EndpointCustomization> =\n            listOf(\n                object : EndpointCustomization {\n                    override fun loadBuiltInFromServiceConfig(\n                        parameter: Parameter,\n                        configRef: String,\n                    ): Writable? =\n                        when (parameter.builtIn) {\n                            builtIn.builtIn ->\n                                writable {\n                                    val newtype = configParamNewtype(parameter, name, codegenContext.runtimeConfig)\n                                    val symbol = parameter.symbol().mapRustType { t -> t.stripOuter<RustType.Option>() }\n                                    rustTemplate(\n                                        \"\"\"$configRef.#{load_from_service_config_layer}\"\"\",\n                                        \"load_from_service_config_layer\" to loadFromConfigBag(symbol.name, newtype),\n                                    )\n                                }\n\n                            else -> null\n                        }\n\n                    override fun setBuiltInOnServiceConfig(\n                        name: String,\n                        value: Node,\n                        configBuilderRef: String,\n                    ): Writable? {\n                        if (name != builtIn.builtIn.get()) {\n                            return null\n                        }\n                        return writable {\n                            rustTemplate(\n                                \"let $configBuilderRef = $configBuilderRef.${nameOverride ?: builtIn.name.rustName()}(#{value});\",\n                                \"value\" to value.toWritable(),\n                            )\n                        }\n                    }\n                },\n            )\n    }\n}\n\nprivate val endpointUrlDocs =\n    writable {\n        rust(\n            \"\"\"\n            /// Sets the endpoint URL used to communicate with this service.\n            ///\n            /// Note: this is used in combination with other endpoint rules, e.g. an API that applies a host-label prefix\n            /// will be prefixed onto this URL. To fully override the endpoint resolver, use\n            /// [`Builder::endpoint_resolver`].\n            \"\"\".trimIndent(),\n        )\n    }\n\nfun Node.toWritable(): Writable {\n    val node = this\n    return writable {\n        when (node) {\n            is StringNode -> rust(node.value.dq())\n            is BooleanNode -> rust(\"${node.value}\")\n            else -> PANIC(\"unsupported value for a default: $node\")\n        }\n    }\n}\n\nval PromotedBuiltInsDecorators =\n    listOf(\n        decoratorForBuiltIn(AwsBuiltIns.FIPS),\n        decoratorForBuiltIn(AwsBuiltIns.DUALSTACK),\n        decoratorForBuiltIn(\n            BuiltIns.SDK_ENDPOINT,\n            ConfigParam.Builder()\n                .name(\"endpoint_url\")\n                .type(RuntimeType.String.toSymbol())\n                .setterDocs(endpointUrlDocs),\n        ),\n        AccountIdEndpointModeBuiltInParamDecorator(),\n        AccountIdBuiltInParamDecorator(),\n    ).toTypedArray()\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/main/kotlin/software/amazon/smithy/rustsdk/EndpointOverrideMetricDecorator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rustsdk\n\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginSection\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\nimport software.amazon.smithy.rust.codegen.core.smithy.RustCrate\n\n/**\n * Decorator that tracks endpoint override business metric when endpoint URL is configured.\n */\nclass EndpointOverrideMetricDecorator : ClientCodegenDecorator {\n    override val name: String = \"EndpointOverrideMetric\"\n    override val order: Byte = 0\n\n    override fun extras(\n        codegenContext: ClientCodegenContext,\n        rustCrate: RustCrate,\n    ) {\n        // Generate the interceptor in the config::endpoint module\n        rustCrate.withModule(ClientRustModule.Config.endpoint) {\n            val runtimeConfig = codegenContext.runtimeConfig\n            val smithyRuntimeApi = RuntimeType.smithyRuntimeApiClient(runtimeConfig)\n            val smithyTypes = RuntimeType.smithyTypes(runtimeConfig)\n            val awsRuntime = AwsRuntimeType.awsRuntime(runtimeConfig)\n            val awsTypes = AwsRuntimeType.awsTypes(runtimeConfig)\n\n            rustTemplate(\n                \"\"\"\n                /// Interceptor that tracks endpoint override business metric.\n                ##[derive(Debug, Default)]\n                pub(crate) struct EndpointOverrideFeatureTrackerInterceptor;\n\n                ##[#{dyn_dispatch_hint}]\n                impl #{Intercept} for EndpointOverrideFeatureTrackerInterceptor {\n                    fn name(&self) -> &'static str {\n                        \"EndpointOverrideFeatureTrackerInterceptor\"\n                    }\n\n                    fn read_before_execution(\n                        &self,\n                        _context: &#{BeforeSerializationInterceptorContextRef}<'_>,\n                        cfg: &mut #{ConfigBag},\n                    ) -> #{Result}<(), #{BoxError}> {\n                        if cfg.load::<#{EndpointUrl}>().is_some() {\n                            cfg.interceptor_state()\n                                .store_append(#{AwsSdkFeature}::EndpointOverride);\n                        }\n                        #{Ok}(())\n                    }\n                }\n                \"\"\",\n                \"Intercept\" to smithyRuntimeApi.resolve(\"client::interceptors::Intercept\"),\n                \"dyn_dispatch_hint\" to smithyRuntimeApi.resolve(\"client::interceptors::dyn_dispatch_hint\"),\n                \"BeforeSerializationInterceptorContextRef\" to\n                    smithyRuntimeApi.resolve(\"client::interceptors::context::BeforeSerializationInterceptorContextRef\"),\n                \"ConfigBag\" to smithyTypes.resolve(\"config_bag::ConfigBag\"),\n                \"BoxError\" to smithyRuntimeApi.resolve(\"box_error::BoxError\"),\n                \"EndpointUrl\" to awsTypes.resolve(\"endpoint_config::EndpointUrl\"),\n                \"AwsSdkFeature\" to awsRuntime.resolve(\"sdk_feature::AwsSdkFeature\"),\n                *preludeScope,\n            )\n        }\n    }\n\n    override fun serviceRuntimePluginCustomizations(\n        codegenContext: ClientCodegenContext,\n        baseCustomizations: List<ServiceRuntimePluginCustomization>,\n    ): List<ServiceRuntimePluginCustomization> =\n        baseCustomizations + listOf(EndpointOverrideFeatureTrackerRegistration(codegenContext))\n}\n\nprivate class EndpointOverrideFeatureTrackerRegistration(\n    private val codegenContext: ClientCodegenContext,\n) : ServiceRuntimePluginCustomization() {\n    override fun section(section: ServiceRuntimePluginSection) =\n        writable {\n            if (section is ServiceRuntimePluginSection.RegisterRuntimeComponents) {\n                section.registerPermanentInterceptor(codegenContext.runtimeConfig, this) {\n                    rustTemplate(\"crate::config::endpoint::EndpointOverrideFeatureTrackerInterceptor\")\n                }\n            }\n        }\n}\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/main/kotlin/software/amazon/smithy/rustsdk/HttpRequestChecksumDecorator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rustsdk\n\nimport software.amazon.smithy.aws.traits.HttpChecksumTrait\nimport software.amazon.smithy.model.knowledge.TopDownIndex\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.traits.HttpHeaderTrait\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.configReexport\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.OperationSection\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.config.ServiceConfig\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.Visibility\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.AdHocCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.NamedCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.adhocCustomization\nimport software.amazon.smithy.rust.codegen.core.util.dq\nimport software.amazon.smithy.rust.codegen.core.util.expectMember\nimport software.amazon.smithy.rust.codegen.core.util.getTrait\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\nimport software.amazon.smithy.rust.codegen.core.util.inputShape\nimport software.amazon.smithy.rust.codegen.core.util.orNull\n\ninternal fun RuntimeConfig.awsInlineableHttpRequestChecksum() =\n    RuntimeType.forInlineDependency(\n        InlineAwsDependency.forRustFile(\n            \"http_request_checksum\", visibility = Visibility.PUBCRATE,\n            CargoDependency.Bytes,\n            CargoDependency.Http1x,\n            CargoDependency.HttpBody1x,\n            CargoDependency.HttpBodyUtil01x.toDevDependency(),\n            CargoDependency.Tracing,\n            AwsCargoDependency.awsRuntime(this).withFeature(\"http-1x\"),\n            CargoDependency.smithyChecksums(this),\n            CargoDependency.smithyHttp(this),\n            CargoDependency.smithyRuntimeApiClient(this),\n            CargoDependency.smithyTypes(this),\n            AwsCargoDependency.awsSigv4(this),\n            CargoDependency.TempFile.toDevDependency(),\n        ),\n    )\n\nclass HttpRequestChecksumDecorator : ClientCodegenDecorator {\n    companion object {\n        const val ORDER: Byte = 0\n    }\n\n    override val name: String = \"HttpRequestChecksum\"\n    override val order: Byte = ORDER\n\n    override fun operationCustomizations(\n        codegenContext: ClientCodegenContext,\n        operation: OperationShape,\n        baseCustomizations: List<OperationCustomization>,\n    ): List<OperationCustomization> = baseCustomizations + HttpRequestChecksumCustomization(codegenContext, operation)\n\n    override fun configCustomizations(\n        codegenContext: ClientCodegenContext,\n        baseCustomizations: List<ConfigCustomization>,\n    ): List<ConfigCustomization> = baseCustomizations + HttpRequestChecksumConfigCustomization(codegenContext)\n\n    /**\n     * Copy the `request_checksum_calculation` value from the `SdkConfig` to the client config\n     */\n    override fun extraSections(codegenContext: ClientCodegenContext): List<AdHocCustomization> =\n        if (!serviceHasHttpChecksumOperation(codegenContext)) {\n            listOf()\n        } else {\n            listOf(\n                adhocCustomization<SdkConfigSection.CopySdkConfigToClientConfig> { section ->\n                    rust(\n                        \"\"\"\n                        ${section.serviceConfigBuilder}.set_request_checksum_calculation(${section.sdkConfig}.request_checksum_calculation());\n                        \"\"\",\n                    )\n                },\n            )\n        }\n}\n\n/**\n * Extract the name of the operation's input member that indicates which checksum algorithm to use\n */\nprivate fun HttpChecksumTrait.requestAlgorithmMember(\n    codegenContext: ClientCodegenContext,\n    operationShape: OperationShape,\n): String? {\n    val requestAlgorithmMember = this.requestAlgorithmMember.orNull() ?: return null\n    val checksumAlgorithmMemberShape =\n        operationShape.inputShape(codegenContext.model).expectMember(requestAlgorithmMember)\n\n    return codegenContext.symbolProvider.toMemberName(checksumAlgorithmMemberShape)\n}\n\n// This is the single place where the default algorithm is set. It must be all uppercased.\n// There is some special logic in HttpChecksumTest and in the http_request_checksum inlineable\n// for testing the default case, if you change this value you will have to update that logic as well.\nconst val DEFAULT_ALGORITHM = \"CRC32\"\n\n/**\n * Extract the name of the operation's input member that indicates which checksum algorithm to use\n */\nprivate fun HttpChecksumTrait.checksumAlgorithmToStr(\n    codegenContext: ClientCodegenContext,\n    operationShape: OperationShape,\n): Writable {\n    val runtimeConfig = codegenContext.runtimeConfig\n    val requestAlgorithmMember = this.requestAlgorithmMember(codegenContext, operationShape)\n    val isRequestChecksumRequired = this.isRequestChecksumRequired\n\n    return {\n        if (requestAlgorithmMember == null && isRequestChecksumRequired) {\n            // Checksums are required but a user can't set one, so we set the default for them\n            rust(\"\"\"let checksum_algorithm = Some(\"${DEFAULT_ALGORITHM.lowercase()}\");\"\"\")\n        } else {\n            // Use checksum algo set by user\n            rust(\"\"\"let checksum_algorithm = checksum_algorithm.map(|algorithm| algorithm.as_str());\"\"\")\n        }\n\n        // If a request checksum is not required and there's no way to set one, do nothing\n        // This happens when an operation only supports response checksums\n    }\n}\n\n// This generator was implemented based on this spec:\n// https://smithy.io/2.0/aws/aws-core.html#http-request-checksums\n\n/**\n * Calculate the checksum algorithm based on the input member identified by the trait's\n * `requestAlgorithmMember`. Then instantiate an (inlineable) `http_request_checksum`\n * interceptor with that checksum algorithm.\n */\nclass HttpRequestChecksumCustomization(\n    private val codegenContext: ClientCodegenContext,\n    private val operationShape: OperationShape,\n) : OperationCustomization() {\n    private val runtimeConfig = codegenContext.runtimeConfig\n\n    override fun section(section: OperationSection): Writable =\n        writable {\n            // Get the `HttpChecksumTrait`, returning early if this `OperationShape` doesn't have one\n            // if there is no request algorithm member or if there is no httpHeader for the request algorithm\n            val checksumTrait = operationShape.getTrait<HttpChecksumTrait>() ?: return@writable\n            val requestAlgorithmMember =\n                checksumTrait.requestAlgorithmMemberShape(codegenContext, operationShape) ?: return@writable\n            val requestAlgoHeader =\n                requestAlgorithmMember.getTrait<HttpHeaderTrait>()?.value ?: return@writable\n            val requestAlgorithmMemberName = checksumTrait.requestAlgorithmMember(codegenContext, operationShape)\n            val inputShape = codegenContext.model.expectShape(operationShape.inputShape)\n            val requestChecksumRequired = checksumTrait.isRequestChecksumRequired\n            val operationName = codegenContext.symbolProvider.toSymbol(operationShape).name\n            val requestAlgorithmMemberInner =\n                if (requestAlgorithmMember.isOptional) {\n                    codegenContext.model.expectShape(requestAlgorithmMember.target)\n                } else {\n                    requestAlgorithmMember\n                }\n\n            when (section) {\n                is OperationSection.AdditionalInterceptors -> {\n                    if (requestAlgorithmMemberName != null) {\n                        section.registerPermanentInterceptor(runtimeConfig, this) {\n                            val runtimeApi = RuntimeType.smithyRuntimeApiClient(runtimeConfig)\n                            rustTemplate(\n                                \"\"\"\n                                #{RequestChecksumInterceptor}::new(\n                                |input: &#{Input}| {\n                                    let input: &#{OperationInput} = input.downcast_ref().expect(\"correct type\");\n                                    let checksum_algorithm = input.$requestAlgorithmMemberName();\n                                    #{checksum_algorithm_to_str}\n                                    (checksum_algorithm.map(|s| s.to_string()), $requestChecksumRequired)\n                                },\n                                |request: &mut #{Request}, cfg: &#{ConfigBag}| {\n                                    // We check if the user has set any of the checksum values manually\n                                    let mut user_set_checksum_value = false;\n                                    let headers_to_check = request.headers().iter().filter_map(|(name, _val)| {\n                                        if name.starts_with(\"x-amz-checksum-\") {\n                                            Some(name)\n                                        } else {\n                                            None\n                                        }\n                                    });\n                                    for algo_header in headers_to_check {\n                                        if request.headers().get(algo_header).is_some() {\n                                            user_set_checksum_value = true;\n                                        }\n                                    }\n\n                                    // We check if the user set the checksum algo manually\n                                    let user_set_checksum_algo = request.headers()\n                                        .get(${requestAlgoHeader.dq()})\n                                        .is_some();\n\n                                    // This value is set by the user on the SdkConfig to indicate their preference\n                                    let request_checksum_calculation = cfg\n                                        .load::<#{RequestChecksumCalculation}>()\n                                        .unwrap_or(&#{RequestChecksumCalculation}::WhenSupported);\n\n                                    // From the httpChecksum trait\n                                    let http_checksum_required = $requestChecksumRequired;\n\n                                    let is_presigned_req = cfg.load::<#{PresigningMarker}>().is_some();\n\n                                    // If the request is presigned we do not set a default.\n                                    // If the RequestChecksumCalculation is WhenSupported and the user has not set a checksum value or algo\n                                    // we set the default. If it is WhenRequired and a checksum is required by the trait and the user has not\n                                    // set a checksum value or algo we also set the default. In all other cases we do nothing.\n                                    match (\n                                        request_checksum_calculation,\n                                        http_checksum_required,\n                                        user_set_checksum_value,\n                                        user_set_checksum_algo,\n                                        is_presigned_req,\n                                    ) {\n                                        (_, _, _, _, true) => {}\n                                        (#{RequestChecksumCalculation}::WhenSupported, _, false, false, _)\n                                        | (#{RequestChecksumCalculation}::WhenRequired, true, false, false, _) => {\n                                            request.headers_mut().insert(${requestAlgoHeader.dq()}, \"$DEFAULT_ALGORITHM\");\n                                        }\n                                        _ => {},\n                                    }\n\n                                    // We return a bool indicating if the user did set the checksum value, if they did\n                                    // we can short circuit and exit the interceptor early.\n                                    Ok(user_set_checksum_value)\n                                }\n                                )\n                                \"\"\",\n                                *preludeScope,\n                                \"BoxError\" to RuntimeType.boxError(runtimeConfig),\n                                \"Input\" to runtimeApi.resolve(\"client::interceptors::context::Input\"),\n                                \"Request\" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve(\"http::Request\"),\n                                \"OperationInput\" to codegenContext.symbolProvider.toSymbol(inputShape),\n                                \"ConfigBag\" to RuntimeType.configBag(runtimeConfig),\n                                \"RequestChecksumInterceptor\" to\n                                    runtimeConfig.awsInlineableHttpRequestChecksum()\n                                        .resolve(\"RequestChecksumInterceptor\"),\n                                \"checksum_algorithm_to_str\" to\n                                    checksumTrait.checksumAlgorithmToStr(\n                                        codegenContext,\n                                        operationShape,\n                                    ),\n                                \"RequestChecksumCalculation\" to\n                                    CargoDependency.smithyTypes(runtimeConfig).toType()\n                                        .resolve(\"checksum_config::RequestChecksumCalculation\"),\n                                \"ChecksumAlgoShape\" to\n                                    codegenContext.symbolProvider.toSymbol(\n                                        requestAlgorithmMemberInner,\n                                    ),\n                                \"OperationInputType\" to\n                                    codegenContext.symbolProvider.toSymbol(\n                                        operationShape.inputShape(\n                                            codegenContext.model,\n                                        ),\n                                    ),\n                                \"PresigningMarker\" to AwsRuntimeType.presigning().resolve(\"PresigningMarker\"),\n                            )\n                        }\n                    }\n                }\n\n                else -> {}\n            }\n        }\n}\n\n/**\n * Add a `request_checksum_calculation;` field to Service config.\n */\nclass HttpRequestChecksumConfigCustomization(private val codegenContext: ClientCodegenContext) :\n    NamedCustomization<ServiceConfig>() {\n    private val rc = codegenContext.runtimeConfig\n    private val codegenScope =\n        arrayOf(\n            *preludeScope,\n            \"RequestChecksumCalculation\" to\n                configReexport(\n                    RuntimeType.smithyTypes(rc)\n                        .resolve(\"checksum_config::RequestChecksumCalculation\"),\n                ),\n        )\n\n    override fun section(section: ServiceConfig): Writable {\n        // If the service contains no operations with the httpChecksum trait we return early\n        if (!serviceHasHttpChecksumOperation(codegenContext)) {\n            return emptySection\n        }\n\n        // Otherwise we write the necessary sections to the service config\n        return when (section) {\n            is ServiceConfig.ConfigImpl ->\n                writable {\n                    rustTemplate(\n                        \"\"\"\n                        /// Return a reference to the request_checksum_calculation value contained in this config, if any.\n                        pub fn request_checksum_calculation(&self) -> #{Option}<&#{RequestChecksumCalculation}> {\n                            self.config.load::<#{RequestChecksumCalculation}>()\n                        }\n                        \"\"\",\n                        *codegenScope,\n                    )\n                }\n\n            is ServiceConfig.BuilderImpl ->\n                writable {\n                    rustTemplate(\n                        \"\"\"\n                        /// Set the [`RequestChecksumCalculation`](#{RequestChecksumCalculation})\n                        /// to determine when a checksum will be calculated for request payloads.\n                        pub fn request_checksum_calculation(\n                            mut self,\n                            request_checksum_calculation: #{RequestChecksumCalculation}\n                        ) -> Self {\n                            self.set_request_checksum_calculation(#{Some}(request_checksum_calculation));\n                            self\n                        }\n                        \"\"\",\n                        *codegenScope,\n                    )\n\n                    rustTemplate(\n                        \"\"\"\n                        /// Set the [`RequestChecksumCalculation`](#{RequestChecksumCalculation})\n                        /// to determine when a checksum will be calculated for request payloads.\n                        pub fn set_request_checksum_calculation(\n                            &mut self,\n                            request_checksum_calculation: #{Option}<#{RequestChecksumCalculation}>\n                        ) -> &mut Self {\n                            self.config.store_or_unset(request_checksum_calculation);\n                            self\n                        }\n                        \"\"\",\n                        *codegenScope,\n                    )\n                }\n\n            is ServiceConfig.BuilderFromConfigBag ->\n                writable {\n                    rustTemplate(\n                        \"${section.builder}.set_request_checksum_calculation(${section.configBag}.load::<#{RequestChecksumCalculation}>().cloned());\",\n                        *codegenScope,\n                    )\n                }\n\n            else -> emptySection\n        }\n    }\n}\n\n/**\n * Determine if the current service contains any operations with the HttpChecksum trait\n */\nfun serviceHasHttpChecksumOperation(codegenContext: ClientCodegenContext): Boolean {\n    val index = TopDownIndex.of(codegenContext.model)\n    val ops = index.getContainedOperations(codegenContext.serviceShape.id)\n    return ops.any { it.hasTrait<HttpChecksumTrait>() }\n}\n\n/**\n * Get the top-level operation input member used to opt-in to best-effort validation of a checksum returned in\n * the HTTP response of the operation.\n */\nfun HttpChecksumTrait.requestAlgorithmMemberShape(\n    codegenContext: ClientCodegenContext,\n    operationShape: OperationShape,\n): MemberShape? {\n    val requestAlgorithmMember = this.requestAlgorithmMember.orNull() ?: return null\n    return operationShape.inputShape(codegenContext.model).expectMember(requestAlgorithmMember)\n}\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/main/kotlin/software/amazon/smithy/rustsdk/HttpRequestCompressionDecorator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rustsdk\n\nimport software.amazon.smithy.model.knowledge.TopDownIndex\nimport software.amazon.smithy.model.traits.RequestCompressionTrait\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.config.ServiceConfig\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.AdHocCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.adhocCustomization\nimport software.amazon.smithy.rust.codegen.core.util.thenSingletonListOf\n\nclass HttpRequestCompressionDecorator : ClientCodegenDecorator {\n    companion object {\n        const val ORDER: Byte = 0\n    }\n\n    override val name: String = \"HttpRequestCompression\"\n    override val order: Byte = ORDER\n\n    private fun usesRequestCompression(codegenContext: ClientCodegenContext): Boolean {\n        val index = TopDownIndex.of(codegenContext.model)\n        val ops = index.getContainedOperations(codegenContext.serviceShape.id)\n        return ops.any { it.hasTrait(RequestCompressionTrait.ID) }\n    }\n\n    override fun configCustomizations(\n        codegenContext: ClientCodegenContext,\n        baseCustomizations: List<ConfigCustomization>,\n    ): List<ConfigCustomization> {\n        return baseCustomizations +\n            usesRequestCompression(codegenContext).thenSingletonListOf {\n                HttpRequestCompressionConfigCustomization(codegenContext)\n            }\n    }\n\n    override fun extraSections(codegenContext: ClientCodegenContext): List<AdHocCustomization> {\n        return usesRequestCompression(codegenContext).thenSingletonListOf {\n            adhocCustomization<SdkConfigSection.CopySdkConfigToClientConfig> { section ->\n                rust(\n                    \"\"\"\n                    ${section.serviceConfigBuilder} = ${section.serviceConfigBuilder}\n                        .disable_request_compression(${section.sdkConfig}.disable_request_compression());\n                    ${section.serviceConfigBuilder} = ${section.serviceConfigBuilder}\n                        .request_min_compression_size_bytes(${section.sdkConfig}.request_min_compression_size_bytes());\n                    \"\"\",\n                )\n            }\n        }\n    }\n}\n\nclass HttpRequestCompressionConfigCustomization(codegenContext: ClientCodegenContext) : ConfigCustomization() {\n    private val runtimeConfig = codegenContext.runtimeConfig\n    private val codegenScope =\n        arrayOf(\n            \"DisableRequestCompression\" to RuntimeType.clientRequestCompression(runtimeConfig).resolve(\"DisableRequestCompression\"),\n            \"RequestMinCompressionSizeBytes\" to RuntimeType.clientRequestCompression(runtimeConfig).resolve(\"RequestMinCompressionSizeBytes\"),\n            \"Storable\" to RuntimeType.smithyTypes(runtimeConfig).resolve(\"config_bag::Storable\"),\n            \"StoreReplace\" to RuntimeType.smithyTypes(runtimeConfig).resolve(\"config_bag::StoreReplace\"),\n            *preludeScope,\n        )\n\n    override fun section(section: ServiceConfig) =\n        writable {\n            when (section) {\n                ServiceConfig.ConfigImpl -> {\n                    rustTemplate(\n                        \"\"\"\n                        /// Returns the `disable request compression` setting, if it was provided.\n                        pub fn disable_request_compression(&self) -> #{Option}<bool> {\n                            self.config.load::<#{DisableRequestCompression}>().map(|it| it.0)\n                        }\n\n                        /// Returns the `request minimum compression size in bytes`, if it was provided.\n                        pub fn request_min_compression_size_bytes(&self) -> #{Option}<u32> {\n                            self.config.load::<#{RequestMinCompressionSizeBytes}>().map(|it| it.0)\n                        }\n                        \"\"\",\n                        *codegenScope,\n                    )\n                }\n\n                ServiceConfig.BuilderImpl -> {\n                    rustTemplate(\n                        \"\"\"\n                        /// Sets the `disable request compression` used when making requests.\n                        pub fn disable_request_compression(mut self, disable_request_compression: impl #{Into}<#{Option}<bool>>) -> Self {\n                            self.set_disable_request_compression(disable_request_compression.into());\n                            self\n                        }\n\n                        /// Sets the `request minimum compression size in bytes` used when making requests.\n                        pub fn request_min_compression_size_bytes(mut self, request_min_compression_size_bytes: impl #{Into}<#{Option}<u32>>) -> Self {\n                            self.set_request_min_compression_size_bytes(request_min_compression_size_bytes.into());\n                            self\n                        }\n                        \"\"\",\n                        *codegenScope,\n                    )\n\n                    rustTemplate(\n                        \"\"\"\n                        /// Sets the `disable request compression` used when making requests.\n                        pub fn set_disable_request_compression(&mut self, disable_request_compression: #{Option}<bool>) -> &mut Self {\n                            self.config.store_or_unset::<#{DisableRequestCompression}>(disable_request_compression.map(Into::into));\n                            self\n                        }\n\n                        /// Sets the `request minimum compression size in bytes` used when making requests.\n                        pub fn set_request_min_compression_size_bytes(&mut self, request_min_compression_size_bytes: #{Option}<u32>) -> &mut Self {\n                            self.config.store_or_unset::<#{RequestMinCompressionSizeBytes}>(request_min_compression_size_bytes.map(Into::into));\n                            self\n                        }\n                        \"\"\",\n                        *codegenScope,\n                    )\n                }\n\n                is ServiceConfig.BuilderFromConfigBag -> {\n                    rustTemplate(\n                        \"\"\"\n                        ${section.builder}.set_disable_request_compression(\n                            ${section.configBag}.load::<#{DisableRequestCompression}>().cloned().map(|it| it.0));\n                        ${section.builder}.set_request_min_compression_size_bytes(\n                            ${section.configBag}.load::<#{RequestMinCompressionSizeBytes}>().cloned().map(|it| it.0));\n                        \"\"\",\n                        *codegenScope,\n                    )\n                }\n\n                else -> emptySection\n            }\n        }\n}\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/main/kotlin/software/amazon/smithy/rustsdk/HttpResponseChecksumDecorator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rustsdk\n\nimport software.amazon.smithy.aws.traits.HttpChecksumTrait\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.configReexport\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.OperationSection\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.config.ServiceConfig\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.Visibility\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.AdHocCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.NamedCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.adhocCustomization\nimport software.amazon.smithy.rust.codegen.core.util.dq\nimport software.amazon.smithy.rust.codegen.core.util.expectMember\nimport software.amazon.smithy.rust.codegen.core.util.getTrait\nimport software.amazon.smithy.rust.codegen.core.util.inputShape\nimport software.amazon.smithy.rust.codegen.core.util.letIf\nimport software.amazon.smithy.rust.codegen.core.util.orNull\n\nprivate fun RuntimeConfig.awsInlineableHttpResponseChecksum() =\n    RuntimeType.forInlineDependency(\n        InlineAwsDependency.forRustFile(\n            \"http_response_checksum\", visibility = Visibility.PUBCRATE,\n            CargoDependency.Bytes,\n            CargoDependency.Tracing,\n            CargoDependency.smithyChecksums(this),\n            CargoDependency.smithyHttp(this),\n            CargoDependency.smithyRuntimeApiClient(this),\n            CargoDependency.smithyTypes(this),\n        ),\n    )\n\n/**\n * Get the top-level operation input member used to opt-in to best-effort validation of a checksum returned in\n * the HTTP response of the operation.\n */\nfun HttpChecksumTrait.requestValidationModeMember(\n    codegenContext: ClientCodegenContext,\n    operationShape: OperationShape,\n): MemberShape? {\n    val requestValidationModeMember = this.requestValidationModeMember.orNull() ?: return null\n    return operationShape.inputShape(codegenContext.model).expectMember(requestValidationModeMember)\n}\n\nclass HttpResponseChecksumDecorator : ClientCodegenDecorator {\n    override val name: String = \"HttpResponseChecksum\"\n    override val order: Byte = 0\n\n    private fun applies(operationShape: OperationShape): Boolean =\n        operationShape.outputShape != ShapeId.from(\"com.amazonaws.s3#GetObjectOutput\")\n\n    override fun operationCustomizations(\n        codegenContext: ClientCodegenContext,\n        operation: OperationShape,\n        baseCustomizations: List<OperationCustomization>,\n    ): List<OperationCustomization> =\n        baseCustomizations.letIf(applies(operation)) {\n            it + HttpResponseChecksumCustomization(codegenContext, operation)\n        }\n\n    override fun configCustomizations(\n        codegenContext: ClientCodegenContext,\n        baseCustomizations: List<ConfigCustomization>,\n    ): List<ConfigCustomization> = baseCustomizations + HttpResponseChecksumConfigCustomization(codegenContext)\n\n    /**\n     * Copy the `response_checksum_validation` value from the `SdkConfig` to the client config\n     */\n    override fun extraSections(codegenContext: ClientCodegenContext): List<AdHocCustomization> =\n        if (serviceHasHttpChecksumOperation(codegenContext)) {\n            listOf(\n                adhocCustomization<SdkConfigSection.CopySdkConfigToClientConfig> { section ->\n                    rust(\n                        \"\"\"\n                        ${section.serviceConfigBuilder}.set_response_checksum_validation(${section.sdkConfig}.response_checksum_validation());\n                        \"\"\",\n                    )\n                },\n            )\n        } else {\n            listOf()\n        }\n}\n\n// This generator was implemented based on this spec:\n// https://smithy.io/2.0/aws/aws-core.html#http-request-checksums\n\n/**\n * Calculate the checksum algorithm based on the input member identified by the trait's\n * `requestAlgorithmMember`. Then instantiate an (inlineable) `http_request_checksum`\n * interceptor with that checksum algorithm.\n */\nclass HttpResponseChecksumCustomization(\n    private val codegenContext: ClientCodegenContext,\n    private val operationShape: OperationShape,\n) : OperationCustomization() {\n    override fun section(section: OperationSection): Writable =\n        writable {\n            // Return early if this operation lacks the `httpChecksum` trait or that trait lacks a `requestValidationModeMember`\n            val checksumTrait = operationShape.getTrait<HttpChecksumTrait>() ?: return@writable\n            val requestValidationModeMember =\n                checksumTrait.requestValidationModeMember(codegenContext, operationShape) ?: return@writable\n            val requestValidationModeName = codegenContext.symbolProvider.toSymbol(requestValidationModeMember).name\n            val requestValidationModeMemberInner =\n                if (requestValidationModeMember.isOptional) {\n                    codegenContext.model.expectShape(requestValidationModeMember.target)\n                } else {\n                    requestValidationModeMember\n                }\n            val validationModeName = codegenContext.symbolProvider.toMemberName(requestValidationModeMember)\n            val inputShape = codegenContext.model.expectShape(operationShape.inputShape)\n            val operationName = codegenContext.symbolProvider.toSymbol(operationShape).name\n\n            when (section) {\n                is OperationSection.AdditionalInterceptors -> {\n                    section.registerPermanentInterceptor(codegenContext.runtimeConfig, this) {\n                        // CRC32, CRC32C, SHA256, SHA1 -> \"crc32\", \"crc32c\", \"sha256\", \"sha1\"\n                        val responseAlgorithms =\n                            checksumTrait.responseAlgorithms\n                                .map { algorithm -> algorithm.lowercase() }\n                                .joinToString(\", \") { algorithm -> algorithm.dq() }\n                        val runtimeApi = RuntimeType.smithyRuntimeApiClient(codegenContext.runtimeConfig)\n                        rustTemplate(\n                            \"\"\"\n                            #{ResponseChecksumInterceptor}::new(\n                                [$responseAlgorithms].as_slice(),\n                                |input: &#{Input}| {\n                                    ${\n                                \"\"/* Per [the spec](https://smithy.io/2.0/aws/aws-core.html#http-response-checksums),\n                                           we check to see if it's the `ENABLED` variant */\n                            }\n                                    let input: &#{OperationInput} = input.downcast_ref().expect(\"correct type\");\n                                    matches!(input.$validationModeName(), #{Some}(#{ValidationModeShape}::Enabled))\n                                },\n                                |input: &mut #{Input}, cfg: &#{ConfigBag}|  {\n                                    let input = input\n                                        .downcast_mut::<#{OperationInputType}>()\n                                        .ok_or(\"failed to downcast to #{OperationInputType}\")?;\n\n                                    let request_validation_enabled =\n                                        matches!(input.$requestValidationModeName(), Some(#{ValidationModeShape}::Enabled));\n\n                                    if !request_validation_enabled {\n                                        // This value is set by the user on the SdkConfig to indicate their preference\n                                        let response_checksum_validation = cfg\n                                            .load::<#{ResponseChecksumValidation}>()\n                                            .unwrap_or(&#{ResponseChecksumValidation}::WhenSupported);\n\n                                        let is_presigned_req = cfg.load::<#{PresigningMarker}>().is_some();\n\n                                        // For presigned requests we do not enable the checksum-mode header.\n                                        if is_presigned_req {\n                                            return #{Ok}(())\n                                        }\n\n                                        // If validation setting is WhenSupported (or unknown) we enable response checksum\n                                        // validation. If it is WhenRequired we do not enable (since there is no way to\n                                        // indicate that a response checksum is required).\n                                        ##[allow(clippy::wildcard_in_or_patterns)]\n                                        match response_checksum_validation {\n                                            #{ResponseChecksumValidation}::WhenRequired => {}\n                                            #{ResponseChecksumValidation}::WhenSupported | _ => {\n                                                input.$requestValidationModeName = Some(#{ValidationModeShape}::Enabled);\n                                            }\n                                        }\n                                    }\n\n                                    #{Ok}(())\n                                }\n                            )\n                            \"\"\",\n                            *preludeScope,\n                            \"ResponseChecksumInterceptor\" to\n                                codegenContext.runtimeConfig.awsInlineableHttpResponseChecksum()\n                                    .resolve(\"ResponseChecksumInterceptor\"),\n                            \"Input\" to runtimeApi.resolve(\"client::interceptors::context::Input\"),\n                            \"OperationInput\" to codegenContext.symbolProvider.toSymbol(inputShape),\n                            \"ValidationModeShape\" to\n                                codegenContext.symbolProvider.toSymbol(\n                                    requestValidationModeMemberInner,\n                                ),\n                            \"OperationInputType\" to\n                                codegenContext.symbolProvider.toSymbol(\n                                    operationShape.inputShape(\n                                        codegenContext.model,\n                                    ),\n                                ),\n                            \"ValidationModeShape\" to\n                                codegenContext.symbolProvider.toSymbol(\n                                    requestValidationModeMemberInner,\n                                ),\n                            \"ResponseChecksumValidation\" to\n                                CargoDependency.smithyTypes(codegenContext.runtimeConfig).toType()\n                                    .resolve(\"checksum_config::ResponseChecksumValidation\"),\n                            \"ConfigBag\" to RuntimeType.configBag(codegenContext.runtimeConfig),\n                            \"PresigningMarker\" to AwsRuntimeType.presigning().resolve(\"PresigningMarker\"),\n                        )\n                    }\n                }\n\n                else -> {}\n            }\n        }\n}\n\n/**\n * Add a `response_checksum_validation;` field to Service config.\n */\nclass HttpResponseChecksumConfigCustomization(private val codegenContext: ClientCodegenContext) :\n    NamedCustomization<ServiceConfig>() {\n    private val rc = codegenContext.runtimeConfig\n    private val codegenScope =\n        arrayOf(\n            *preludeScope,\n            \"ResponseChecksumValidation\" to\n                configReexport(\n                    RuntimeType.smithyTypes(rc)\n                        .resolve(\"checksum_config::ResponseChecksumValidation\"),\n                ),\n        )\n\n    override fun section(section: ServiceConfig): Writable {\n        // If the service contains no operations with the httpChecksum trait we return early\n        if (!serviceHasHttpChecksumOperation(codegenContext)) {\n            return emptySection\n        }\n\n        // Otherwise we write the necessary sections to the service config\n        return when (section) {\n            is ServiceConfig.ConfigImpl ->\n                writable {\n                    rustTemplate(\n                        \"\"\"\n                        /// Return a reference to the response_checksum_validation value contained in this config, if any.\n                        pub fn response_checksum_validation(&self) -> #{Option}<&#{ResponseChecksumValidation}> {\n                            self.config.load::<#{ResponseChecksumValidation}>()\n                        }\n                        \"\"\",\n                        *codegenScope,\n                    )\n                }\n\n            is ServiceConfig.BuilderImpl ->\n                writable {\n                    rustTemplate(\n                        \"\"\"\n                        /// Set the [`ResponseChecksumValidation`](#{ResponseChecksumValidation})\n                        /// to determine when checksum validation will be performed on response payloads.\n                        pub fn response_checksum_validation(\n                            mut self,\n                            response_checksum_validation: #{ResponseChecksumValidation}\n                        ) -> Self {\n                            self.set_response_checksum_validation(#{Some}(response_checksum_validation));\n                            self\n                        }\n                        \"\"\",\n                        *codegenScope,\n                    )\n\n                    rustTemplate(\n                        \"\"\"\n                        /// Set the [`ResponseChecksumValidation`](#{ResponseChecksumValidation})\n                        /// to determine when checksum validation will be performed on response payloads.\n                        pub fn set_response_checksum_validation(\n                            &mut self,\n                            response_checksum_validation: #{Option}<#{ResponseChecksumValidation}>\n                        ) -> &mut Self {\n                            self.config.store_or_unset(response_checksum_validation);\n                            self\n                        }\n                        \"\"\",\n                        *codegenScope,\n                    )\n                }\n\n            is ServiceConfig.BuilderFromConfigBag ->\n                writable {\n                    rustTemplate(\n                        \"${section.builder}.set_response_checksum_validation(${section.configBag}.load::<#{ResponseChecksumValidation}>().cloned());\",\n                        *codegenScope,\n                    )\n                }\n\n            else -> emptySection\n        }\n    }\n}\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/main/kotlin/software/amazon/smithy/rustsdk/InlineAwsDependency.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rustsdk\n\nimport software.amazon.smithy.rust.codegen.core.rustlang.InlineDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustModule\nimport software.amazon.smithy.rust.codegen.core.rustlang.Visibility\n\nobject InlineAwsDependency {\n    fun forRustFile(\n        file: String,\n        visibility: Visibility = Visibility.PRIVATE,\n        vararg additionalDependency: RustDependency,\n    ): InlineDependency = forRustFileAs(file, file, visibility, *additionalDependency)\n\n    fun forRustFileAs(\n        file: String,\n        moduleName: String,\n        visibility: Visibility = Visibility.PRIVATE,\n        vararg additionalDependency: RustDependency,\n    ): InlineDependency =\n        InlineDependency.Companion.forRustFile(\n            RustModule.new(moduleName, visibility, documentationOverride = \"\"),\n            \"/aws-inlineable/src/$file.rs\",\n            *additionalDependency,\n        )\n}\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/main/kotlin/software/amazon/smithy/rustsdk/IntegrationTestDependencies.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rustsdk\n\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency.Companion.Approx\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency.Companion.AsyncStd\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency.Companion.AsyncStream\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency.Companion.BytesUtils\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency.Companion.Criterion\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency.Companion.FastRand\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency.Companion.FuturesCore\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency.Companion.FuturesUtil\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency.Companion.GetRandom\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency.Companion.HdrHistogram\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency.Companion.Hound\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency.Companion.Http1x\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency.Companion.HttpBody1x\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency.Companion.HttpBodyUtil01x\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency.Companion.PinProjectLite\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency.Companion.SerdeJson\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency.Companion.Smol\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency.Companion.TempFile\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency.Companion.Tokio\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency.Companion.Tracing\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency.Companion.TracingAppender\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency.Companion.TracingSubscriber\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency.Companion.TracingTest\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency.Companion.smithyHttpClient\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency.Companion.smithyMocks\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency.Companion.smithyProtocolTestHelpers\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency.Companion.smithyRuntime\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency.Companion.smithyRuntimeApiTestUtil\nimport software.amazon.smithy.rust.codegen.core.rustlang.DependencyScope\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.LibRsCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.LibRsSection\nimport software.amazon.smithy.rust.codegen.core.testutil.testDependenciesOnly\nimport software.amazon.smithy.rust.codegen.core.util.hasEventStreamOperations\nimport software.amazon.smithy.rustsdk.AwsCargoDependency.awsConfig\nimport software.amazon.smithy.rustsdk.AwsCargoDependency.awsRuntime\nimport software.amazon.smithy.rustsdk.AwsCargoDependency.awsTypes\nimport java.nio.file.Files\nimport java.nio.file.Paths\nimport kotlin.io.path.absolute\n\nclass IntegrationTestDecorator : ClientCodegenDecorator {\n    override val name: String = \"IntegrationTest\"\n    override val order: Byte = 0\n\n    override fun libRsCustomizations(\n        codegenContext: ClientCodegenContext,\n        baseCustomizations: List<LibRsCustomization>,\n    ): List<LibRsCustomization> {\n        val integrationTestPath = Paths.get(SdkSettings.from(codegenContext.settings).integrationTestPath)\n        check(Files.exists(integrationTestPath)) {\n            \"Failed to find the AWS SDK integration tests (${integrationTestPath.absolute()}). Make sure the integration test path is configured \" +\n                \"correctly in the smithy-build.json.\"\n        }\n\n        val moduleName = codegenContext.moduleName.removePrefix(\"aws-sdk-\")\n        val testPackagePath = integrationTestPath.resolve(moduleName)\n        return if (Files.exists(testPackagePath) && Files.exists(testPackagePath.resolve(\"Cargo.toml\"))) {\n            val hasTests = Files.exists(testPackagePath.resolve(\"tests\"))\n            val hasBenches = Files.exists(testPackagePath.resolve(\"benches\"))\n            baseCustomizations +\n                IntegrationTestDependencies(\n                    codegenContext,\n                    moduleName,\n                    hasTests,\n                    hasBenches,\n                )\n        } else {\n            baseCustomizations\n        }\n    }\n}\n\nclass IntegrationTestDependencies(\n    codegenContext: ClientCodegenContext,\n    private val moduleName: String,\n    private val hasTests: Boolean,\n    private val hasBenches: Boolean,\n) : LibRsCustomization() {\n    private val runtimeConfig = codegenContext.runtimeConfig\n    private val serviceShape = codegenContext.serviceShape\n    private val model = codegenContext.model\n\n    override fun section(section: LibRsSection) =\n        when (section) {\n            is LibRsSection.Body ->\n                testDependenciesOnly {\n                    if (hasTests) {\n                        val smithyAsync =\n                            CargoDependency.smithyAsync(runtimeConfig)\n                                .copy(features = setOf(\"test-util\"), scope = DependencyScope.Dev)\n                        val smithyTypes =\n                            CargoDependency.smithyTypes(runtimeConfig)\n                                .copy(features = setOf(\"test-util\"), scope = DependencyScope.Dev)\n                        addDependency(awsRuntime(runtimeConfig).toDevDependency().withFeature(\"test-util\"))\n                        addDependency(FuturesUtil.toDevDependency())\n                        addDependency(SerdeJson)\n                        addDependency(smithyAsync)\n                        addDependency(smithyProtocolTestHelpers(runtimeConfig))\n                        addDependency(\n                            smithyRuntime(runtimeConfig).copy(\n                                features = setOf(\"test-util\"),\n                                scope = DependencyScope.Dev,\n                            ),\n                        )\n                        addDependency(smithyRuntimeApiTestUtil(runtimeConfig))\n                        addDependency(smithyTypes)\n                        addDependency(Tokio)\n                        addDependency(Tracing.toDevDependency())\n                        addDependency(TracingSubscriber)\n                        addDependency(\n                            smithyHttpClient(runtimeConfig).copy(\n                                features = setOf(\"test-util\", \"wire-mock\"),\n                                scope = DependencyScope.Dev,\n                            ),\n                        )\n                        addDependency(Http1x.toDevDependency())\n                    }\n                    if (hasBenches) {\n                        addDependency(Criterion)\n                    }\n                    if (serviceShape.hasEventStreamOperations(model)) {\n                        addDependency(\n                            CargoDependency.smithyEventStream(runtimeConfig)\n                                .copy(features = setOf(\"test-util\"), scope = DependencyScope.Dev),\n                        )\n                    }\n                    for (serviceSpecific in serviceSpecificCustomizations()) {\n                        serviceSpecific.section(section)(this)\n                    }\n                }\n\n            else -> emptySection\n        }\n\n    private fun serviceSpecificCustomizations(): List<LibRsCustomization> =\n        when (moduleName) {\n            \"bedrockruntime\" -> listOf(BedrockRuntimeDependencies(runtimeConfig))\n            \"dynamodb\" -> listOf(DynamoDbTestDependencies())\n            \"s3\" -> listOf(S3TestDependencies(runtimeConfig))\n            \"transcribestreaming\" -> listOf(TranscribeTestDependencies())\n            \"webassembly\" -> listOf(WebAssemblyTestDependencies())\n            else -> emptyList()\n        }\n}\n\nclass BedrockRuntimeDependencies(private val runtimeConfig: RuntimeConfig) : LibRsCustomization() {\n    override fun section(section: LibRsSection): Writable =\n        writable {\n            addDependency(awsTypes(runtimeConfig).toDevDependency())\n        }\n}\n\nclass DynamoDbTestDependencies : LibRsCustomization() {\n    override fun section(section: LibRsSection): Writable =\n        writable {\n            addDependency(Approx)\n        }\n}\n\nclass S3TestDependencies(private val runtimeConfig: RuntimeConfig) : LibRsCustomization() {\n    override fun section(section: LibRsSection): Writable =\n        writable {\n            addDependency(awsConfig(runtimeConfig).toDevDependency().withFeature(\"behavior-version-latest\"))\n            addDependency(smithyHttpClient(runtimeConfig).toDevDependency().withFeature(\"rustls-ring\"))\n            addDependency(AsyncStd)\n            addDependency(BytesUtils.toDevDependency())\n            addDependency(FastRand.toDevDependency())\n            addDependency(FuturesUtil.toDevDependency())\n            addDependency(HdrHistogram)\n            addDependency(HttpBody1x.toDevDependency().copy(optional = false))\n            addDependency(HttpBodyUtil01x.toDevDependency().copy(optional = false))\n            addDependency(PinProjectLite.toDevDependency())\n            addDependency(Smol)\n            addDependency(TempFile)\n            addDependency(TracingAppender)\n            addDependency(TracingTest)\n            addDependency(smithyMocks(runtimeConfig))\n        }\n}\n\nclass TranscribeTestDependencies : LibRsCustomization() {\n    override fun section(section: LibRsSection): Writable =\n        writable {\n            addDependency(AsyncStream)\n            addDependency(FuturesCore)\n            addDependency(Hound)\n        }\n}\n\nclass WebAssemblyTestDependencies : LibRsCustomization() {\n    override fun section(section: LibRsSection): Writable =\n        writable {\n            addDependency(GetRandom.withFeature(\"wasm_js\"))\n        }\n}\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/main/kotlin/software/amazon/smithy/rustsdk/InvocationIdDecorator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rustsdk\n\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginSection\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.config.ServiceConfig\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.docs\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\n\nclass InvocationIdDecorator : ClientCodegenDecorator {\n    override val name: String get() = \"InvocationIdDecorator\"\n    override val order: Byte get() = 0\n\n    override fun serviceRuntimePluginCustomizations(\n        codegenContext: ClientCodegenContext,\n        baseCustomizations: List<ServiceRuntimePluginCustomization>,\n    ): List<ServiceRuntimePluginCustomization> =\n        baseCustomizations + InvocationIdRuntimePluginCustomization(codegenContext)\n\n    override fun configCustomizations(\n        codegenContext: ClientCodegenContext,\n        baseCustomizations: List<ConfigCustomization>,\n    ): List<ConfigCustomization> = baseCustomizations + InvocationIdConfigCustomization(codegenContext)\n}\n\nprivate class InvocationIdRuntimePluginCustomization(\n    private val codegenContext: ClientCodegenContext,\n) : ServiceRuntimePluginCustomization() {\n    private val runtimeConfig = codegenContext.runtimeConfig\n    private val awsRuntime = AwsRuntimeType.awsRuntime(runtimeConfig)\n    private val codegenScope =\n        arrayOf(\n            \"InvocationIdInterceptor\" to awsRuntime.resolve(\"invocation_id::InvocationIdInterceptor\"),\n        )\n\n    override fun section(section: ServiceRuntimePluginSection): Writable =\n        writable {\n            if (section is ServiceRuntimePluginSection.RegisterRuntimeComponents) {\n                section.registerInterceptor(this) {\n                    rustTemplate(\"#{InvocationIdInterceptor}::new()\", *codegenScope)\n                }\n            }\n        }\n}\n\nconst val GENERATOR_DOCS: String =\n    \"The invocation ID generator generates ID values for the `amz-sdk-invocation-id` header. \" +\n        \"By default, this will be a random UUID. Overriding it may be useful in tests that \" +\n        \"examine the HTTP request and need to be deterministic.\"\n\nprivate class InvocationIdConfigCustomization(\n    codegenContext: ClientCodegenContext,\n) : ConfigCustomization() {\n    private val awsRuntime = AwsRuntimeType.awsRuntime(codegenContext.runtimeConfig)\n    private val codegenScope =\n        arrayOf(\n            *preludeScope,\n            \"InvocationIdGenerator\" to awsRuntime.resolve(\"invocation_id::InvocationIdGenerator\"),\n            \"SharedInvocationIdGenerator\" to awsRuntime.resolve(\"invocation_id::SharedInvocationIdGenerator\"),\n        )\n\n    override fun section(section: ServiceConfig): Writable =\n        writable {\n            when (section) {\n                is ServiceConfig.BuilderImpl -> {\n                    docs(\"Overrides the default invocation ID generator.\\n\\n$GENERATOR_DOCS\")\n                    rustTemplate(\n                        \"\"\"\n                        pub fn invocation_id_generator(mut self, gen: impl #{InvocationIdGenerator} + 'static) -> Self {\n                            self.set_invocation_id_generator(#{Some}(#{SharedInvocationIdGenerator}::new(gen)));\n                            self\n                        }\n                        \"\"\",\n                        *codegenScope,\n                    )\n\n                    docs(\"Overrides the default invocation ID generator.\\n\\n$GENERATOR_DOCS\")\n                    rustTemplate(\n                        \"\"\"\n                        pub fn set_invocation_id_generator(&mut self, gen: #{Option}<#{SharedInvocationIdGenerator}>) -> &mut Self {\n                            self.config.store_or_unset(gen);\n                            self\n                        }\n                        \"\"\",\n                        *codegenScope,\n                    )\n                }\n\n                is ServiceConfig.ConfigImpl -> {\n                    docs(\"Returns the invocation ID generator if one was given in config.\\n\\n$GENERATOR_DOCS\")\n                    rustTemplate(\n                        \"\"\"\n                        pub fn invocation_id_generator(&self) -> #{Option}<#{SharedInvocationIdGenerator}> {\n                            self.config.load::<#{SharedInvocationIdGenerator}>().cloned()\n                        }\n                        \"\"\",\n                        *codegenScope,\n                    )\n                }\n\n                else -> {}\n            }\n        }\n}\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/main/kotlin/software/amazon/smithy/rustsdk/ObservabilityMetricDecorator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rustsdk\n\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginSection\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.Visibility\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\n\n/**\n * Decorator that tracks observability business metrics when tracing/metrics providers are configured.\n */\nclass ObservabilityMetricDecorator : ClientCodegenDecorator {\n    override val name: String = \"ObservabilityMetric\"\n    override val order: Byte = 0\n\n    override fun serviceRuntimePluginCustomizations(\n        codegenContext: ClientCodegenContext,\n        baseCustomizations: List<ServiceRuntimePluginCustomization>,\n    ): List<ServiceRuntimePluginCustomization> =\n        baseCustomizations + listOf(ObservabilityFeatureTrackerInterceptor(codegenContext))\n}\n\nprivate class ObservabilityFeatureTrackerInterceptor(private val codegenContext: ClientCodegenContext) :\n    ServiceRuntimePluginCustomization() {\n    override fun section(section: ServiceRuntimePluginSection) =\n        writable {\n            if (section is ServiceRuntimePluginSection.RegisterRuntimeComponents) {\n                section.registerPermanentInterceptor(codegenContext.runtimeConfig, this) {\n                    val runtimeConfig = codegenContext.runtimeConfig\n                    rustTemplate(\n                        \"#{Interceptor}\",\n                        \"Interceptor\" to\n                            RuntimeType.forInlineDependency(\n                                InlineAwsDependency.forRustFile(\n                                    \"observability_feature\",\n                                    Visibility.PRIVATE,\n                                    CargoDependency.smithyObservability(runtimeConfig),\n                                ),\n                            ).resolve(\"ObservabilityFeatureTrackerInterceptor\"),\n                    )\n                }\n            }\n        }\n}\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/main/kotlin/software/amazon/smithy/rustsdk/RecursionDetectionDecorator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rustsdk\n\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginSection\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\n\nclass RecursionDetectionDecorator : ClientCodegenDecorator {\n    override val name: String get() = \"RecursionDetectionDecorator\"\n    override val order: Byte get() = 0\n\n    override fun serviceRuntimePluginCustomizations(\n        codegenContext: ClientCodegenContext,\n        baseCustomizations: List<ServiceRuntimePluginCustomization>,\n    ): List<ServiceRuntimePluginCustomization> =\n        baseCustomizations + RecursionDetectionRuntimePluginCustomization(codegenContext)\n}\n\nprivate class RecursionDetectionRuntimePluginCustomization(\n    private val codegenContext: ClientCodegenContext,\n) : ServiceRuntimePluginCustomization() {\n    override fun section(section: ServiceRuntimePluginSection): Writable =\n        writable {\n            if (section is ServiceRuntimePluginSection.RegisterRuntimeComponents) {\n                section.registerPermanentInterceptor(codegenContext.runtimeConfig, this) {\n                    rust(\n                        \"#T::new()\",\n                        AwsRuntimeType.awsRuntime(codegenContext.runtimeConfig)\n                            .resolve(\"recursion_detection::RecursionDetectionInterceptor\"),\n                    )\n                }\n            }\n        }\n}\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/main/kotlin/software/amazon/smithy/rustsdk/RegionDecorator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rustsdk\n\nimport software.amazon.smithy.aws.traits.auth.SigV4Trait\nimport software.amazon.smithy.model.knowledge.ServiceIndex\nimport software.amazon.smithy.model.node.Node\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.rulesengine.aws.language.functions.AwsBuiltIns\nimport software.amazon.smithy.rulesengine.language.syntax.parameters.Parameter\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.configReexport\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.client.smithy.endpoint.EndpointCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.endpoint.EndpointsLib\nimport software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators.EndpointParamsGenerator\nimport software.amazon.smithy.rust.codegen.client.smithy.endpoint.memberName\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.config.ServiceConfig\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.AdHocCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.adhocCustomization\nimport software.amazon.smithy.rust.codegen.core.util.dq\nimport software.amazon.smithy.rust.codegen.core.util.extendIf\nimport software.amazon.smithy.rust.codegen.core.util.thenSingletonListOf\n\n// Example Generated Code\n// ----------------------\n//\n// pub struct Config {\n//     pub(crate) region: Option<aws_types::region::Region>,\n// }\n//\n// impl std::fmt::Debug for Config {\n//     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n//         let mut config = f.debug_struct(\"Config\");\n//         config.finish()\n//     }\n// }\n//\n// impl Config {\n//     pub fn builder() -> Builder {\n//         Builder::default()\n//     }\n// }\n//\n// #[derive(Default)]\n// pub struct Builder {\n//     region: Option<aws_types::region::Region>,\n// }\n//\n// impl Builder {\n//     pub fn new() -> Self {\n//         Self::default()\n//     }\n//\n//     pub fn region(mut self, region: impl Into<Option<aws_types::region::Region>>) -> Self {\n//         self.region = region.into();\n//         self\n//     }\n//\n//     pub fn build(self) -> Config {\n//         Config {\n//             region: self.region,\n//         }\n//     }\n// }\n//\n// #[test]\n// fn test_1() {\n//     fn assert_send_sync<T: Send + Sync>() {}\n//     assert_send_sync::<Config>();\n// }\n//\n\nclass RegionDecorator : ClientCodegenDecorator {\n    override val name: String = \"Region\"\n    override val order: Byte = 0\n    private val envKey = \"AWS_REGION\".dq()\n    private val profileKey = \"region\".dq()\n\n    override fun configCustomizations(\n        codegenContext: ClientCodegenContext,\n        baseCustomizations: List<ConfigCustomization>,\n    ): List<ConfigCustomization> {\n        return baseCustomizations.extendIf(usesRegion(codegenContext)) {\n            RegionProviderConfig(codegenContext)\n        }\n    }\n\n    override fun extraSections(codegenContext: ClientCodegenContext): List<AdHocCustomization> {\n        return usesRegion(codegenContext).thenSingletonListOf {\n            adhocCustomization<SdkConfigSection.CopySdkConfigToClientConfig> { section ->\n                rust(\n                    \"\"\"\n                    ${section.serviceConfigBuilder} =\n                         ${section.serviceConfigBuilder}.region(${section.sdkConfig}.region().cloned());\n                    \"\"\",\n                )\n            }\n        }\n    }\n\n    override fun endpointCustomizations(codegenContext: ClientCodegenContext): List<EndpointCustomization> {\n        if (!usesRegion(codegenContext)) {\n            return listOf()\n        }\n        return listOf(\n            object : EndpointCustomization {\n                override fun loadBuiltInFromServiceConfig(\n                    parameter: Parameter,\n                    configRef: String,\n                ): Writable? {\n                    return when (parameter.builtIn) {\n                        AwsBuiltIns.REGION.builtIn ->\n                            writable {\n                                rustTemplate(\n                                    \"$configRef.load::<#{Region}>().map(|r|r.as_ref().to_owned())\",\n                                    \"Region\" to region(codegenContext.runtimeConfig).resolve(\"Region\"),\n                                )\n                            }\n\n                        else -> null\n                    }\n                }\n\n                override fun setBuiltInOnServiceConfig(\n                    name: String,\n                    value: Node,\n                    configBuilderRef: String,\n                ): Writable? {\n                    if (name != AwsBuiltIns.REGION.builtIn.get()) {\n                        return null\n                    }\n                    return writable {\n                        rustTemplate(\n                            \"let $configBuilderRef = $configBuilderRef.region(#{Region}::new(${value.expectStringNode().value.dq()}));\",\n                            \"Region\" to region(codegenContext.runtimeConfig).resolve(\"Region\"),\n                        )\n                    }\n                }\n\n                override fun endpointParamsBuilderValidator(\n                    codegenContext: ClientCodegenContext,\n                    parameter: Parameter,\n                ): Writable? {\n                    if (endpointTestsValidatesRegionAlready(codegenContext)) {\n                        return null\n                    }\n\n                    return when (parameter.builtIn) {\n                        AwsBuiltIns.REGION.builtIn ->\n                            writable {\n                                rustTemplate(\n                                    \"\"\"\n                                    if let Some(region) = &self.${parameter.memberName()} {\n                                        if !#{is_valid_host_label}(region.as_ref() as &str, true, &mut #{DiagnosticCollector}::new()) {\n                                            return Err(#{ParamsError}::invalid_value(${parameter.memberName().dq()}, \"must be a valid host label\"))\n                                        }\n                                    }\n                                    \"\"\",\n                                    \"is_valid_host_label\" to EndpointsLib.isValidHostLabel,\n                                    \"ParamsError\" to EndpointParamsGenerator.paramsError(),\n                                    \"DiagnosticCollector\" to EndpointsLib.DiagnosticCollector,\n                                )\n                            }\n\n                        else -> null\n                    }\n                }\n            },\n        )\n    }\n}\n\nclass RegionProviderConfig(codegenContext: ClientCodegenContext) : ConfigCustomization() {\n    private val region = region(codegenContext.runtimeConfig)\n    private val moduleUseName = codegenContext.moduleUseName()\n    private val codegenScope =\n        arrayOf(\n            *preludeScope,\n            \"Region\" to configReexport(region.resolve(\"Region\")),\n        )\n\n    override fun section(section: ServiceConfig) =\n        writable {\n            when (section) {\n                ServiceConfig.ConfigImpl -> {\n                    rustTemplate(\n                        \"\"\"\n                        /// Returns the AWS region, if it was provided.\n                        pub fn region(&self) -> #{Option}<&#{Region}> {\n                            self.config.load::<#{Region}>()\n                        }\n                        \"\"\",\n                        *codegenScope,\n                    )\n                }\n\n                ServiceConfig.BuilderImpl -> {\n                    rustTemplate(\n                        \"\"\"\n                        /// Sets the AWS region to use when making requests.\n                        ///\n                        /// ## Examples\n                        /// ```no_run\n                        /// use aws_types::region::Region;\n                        /// use $moduleUseName::config::{Builder, Config};\n                        ///\n                        /// let config = $moduleUseName::Config::builder()\n                        ///     .region(Region::new(\"us-east-1\"))\n                        ///     .build();\n                        /// ```\n                        pub fn region(mut self, region: impl #{Into}<#{Option}<#{Region}>>) -> Self {\n                            self.set_region(region.into());\n                            self\n                        }\n                        \"\"\",\n                        *codegenScope,\n                    )\n\n                    rustTemplate(\n                        \"\"\"\n                        /// Sets the AWS region to use when making requests.\n                        pub fn set_region(&mut self, region: #{Option}<#{Region}>) -> &mut Self {\n                            self.config.store_or_unset(region);\n                            self\n                        }\n                        \"\"\",\n                        *codegenScope,\n                    )\n                }\n                is ServiceConfig.DefaultForTestsV2 -> {\n                    // this was added later, for backwards compat we only set a default if a region hasn't already been set by user\n                    rustTemplate(\n                        \"\"\"\n                        if ${section.configBuilderRef}.config.load::<#{Region}>().is_none() {\n                            self.set_region(#{Some}(#{Region}::new(\"us-east-1\")));\n                        }\n                        \"\"\",\n                        *codegenScope,\n                    )\n                }\n\n                is ServiceConfig.BuilderFromConfigBag -> {\n                    rustTemplate(\"${section.builder}.set_region(${section.configBag}.load::<#{Region}>().cloned());\", *codegenScope)\n                }\n\n                else -> emptySection\n            }\n        }\n}\n\nfun region(runtimeConfig: RuntimeConfig) = AwsRuntimeType.awsTypes(runtimeConfig).resolve(\"region\")\n\n/**\n * Test if region is used and configured for a model (and available on a service client).\n *\n * Services that have an endpoint ruleset that references the SDK::Region built in, or\n * that use SigV4, both need a configurable region.\n */\nfun usesRegion(codegenContext: ClientCodegenContext) =\n    codegenContext.getBuiltIn(AwsBuiltIns.REGION) != null ||\n        ServiceIndex.of(codegenContext.model)\n            .getEffectiveAuthSchemes(codegenContext.serviceShape).containsKey(SigV4Trait.ID)\n\n/**\n * Test if region is already validated via endpoint rules tests. Validating region when building parameters\n * will break endpoint tests which validate during resolution and expect specific errors.\n */\nfun endpointTestsValidatesRegionAlready(codegenContext: ClientCodegenContext): Boolean =\n    codegenContext.serviceShape.id in\n        setOf(\n            ShapeId.from(\"com.amazonaws.s3#AmazonS3\"),\n            ShapeId.from(\"com.amazonaws.s3control#AWSS3ControlServiceV20180820\"),\n        )\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/main/kotlin/software/amazon/smithy/rustsdk/RetryClassifierDecorator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rustsdk\n\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.OperationSection\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\n\nclass RetryClassifierDecorator : ClientCodegenDecorator {\n    override val name: String = \"RetryPolicy\"\n    override val order: Byte = 0\n\n    override fun operationCustomizations(\n        codegenContext: ClientCodegenContext,\n        operation: OperationShape,\n        baseCustomizations: List<OperationCustomization>,\n    ): List<OperationCustomization> =\n        baseCustomizations +\n            OperationRetryClassifiersFeature(codegenContext, operation)\n}\n\nclass OperationRetryClassifiersFeature(\n    codegenContext: ClientCodegenContext,\n    val operation: OperationShape,\n) : OperationCustomization() {\n    private val runtimeConfig = codegenContext.runtimeConfig\n    private val symbolProvider = codegenContext.symbolProvider\n\n    override fun section(section: OperationSection) =\n        when (section) {\n            is OperationSection.RetryClassifiers ->\n                writable {\n                    section.registerRetryClassifier(this) {\n                        rustTemplate(\n                            \"#{AwsErrorCodeClassifier}::<#{OperationError}>::new()\",\n                            \"AwsErrorCodeClassifier\" to AwsRuntimeType.awsRuntime(runtimeConfig).resolve(\"retries::classifiers::AwsErrorCodeClassifier\"),\n                            \"OperationError\" to symbolProvider.symbolForOperationError(operation),\n                        )\n                    }\n                }\n\n            else -> emptySection\n        }\n}\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/main/kotlin/software/amazon/smithy/rustsdk/RetryInformationHeaderDecorator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rustsdk\n\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginSection\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\n\nclass RetryInformationHeaderDecorator : ClientCodegenDecorator {\n    override val name: String = \"RetryInformationHeader\"\n    override val order: Byte = 10\n\n    override fun serviceRuntimePluginCustomizations(\n        codegenContext: ClientCodegenContext,\n        baseCustomizations: List<ServiceRuntimePluginCustomization>,\n    ): List<ServiceRuntimePluginCustomization> =\n        baseCustomizations + listOf(AddRetryInformationHeaderInterceptors(codegenContext))\n}\n\nprivate class AddRetryInformationHeaderInterceptors(codegenContext: ClientCodegenContext) :\n    ServiceRuntimePluginCustomization() {\n    private val runtimeConfig = codegenContext.runtimeConfig\n    private val awsRuntime = AwsRuntimeType.awsRuntime(runtimeConfig)\n\n    override fun section(section: ServiceRuntimePluginSection): Writable =\n        writable {\n            if (section is ServiceRuntimePluginSection.RegisterRuntimeComponents) {\n                // Track the latency between client and server.\n                section.registerPermanentInterceptor(runtimeConfig, this) {\n                    rust(\n                        \"#T::new()\",\n                        awsRuntime.resolve(\"service_clock_skew::ServiceClockSkewInterceptor\"),\n                    )\n                }\n\n                // Add request metadata to outgoing requests. Sets a header.\n                section.registerInterceptor(this) {\n                    rust(\"#T::new()\", awsRuntime.resolve(\"request_info::RequestInfoInterceptor\"))\n                }\n            }\n        }\n}\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/main/kotlin/software/amazon/smithy/rustsdk/SdkConfigDecorator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rustsdk\n\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.config.ServiceConfig\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig\nimport software.amazon.smithy.rust.codegen.core.smithy.RustCrate\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.AdHocCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.AdHocSection\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.adhocCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.writeCustomizations\nimport software.amazon.smithy.rust.codegen.core.util.dq\nimport software.amazon.smithy.rust.codegen.core.util.toSnakeCase\n\nsealed class SdkConfigSection(name: String) : AdHocSection(name) {\n    /**\n     * [sdkConfig]: A reference to the SDK config struct\n     * [serviceConfigBuilder]: A reference (owned) to the `<service>::config::Builder` struct.\n     *\n     * Each invocation of this section MUST be a complete statement (ending with a semicolon), e.g:\n     * ```\n     * rust(\"${section.serviceConfigBuilder}.set_foo(${section.sdkConfig}.foo());\")\n     * ```\n     */\n    data class CopySdkConfigToClientConfig(val sdkConfig: String, val serviceConfigBuilder: String) :\n        SdkConfigSection(\"CopySdkConfigToClientConfig\")\n}\n\n/**\n * Section enabling linkage between `SdkConfig` and <service>::Config\n */\nobject SdkConfigCustomization {\n    /**\n     * Copy a field from SDK config to service config with an optional map block.\n     *\n     * This handles the common case where the field name is identical in both cases and an accessor is used.\n     *\n     * # Examples\n     * ```kotlin\n     * SdkConfigCustomization.copyField(\"some_string_field\") { rust(\"|s|s.to_to_string()\") }\n     * ```\n     */\n    fun copyField(\n        fieldName: String,\n        map: Writable?,\n    ) = adhocCustomization<SdkConfigSection.CopySdkConfigToClientConfig> { section ->\n        val mapBlock = map?.let { writable { rust(\".map(#W)\", it) } } ?: writable { }\n        rustTemplate(\n            \"${section.serviceConfigBuilder}.set_$fieldName(${section.sdkConfig}.$fieldName()#{map});\",\n            \"map\" to mapBlock,\n        )\n    }\n\n    fun copyFieldAndCheckForServiceConfig(\n        serviceId: String,\n        fieldName: String,\n        map: Writable?,\n    ) = adhocCustomization<SdkConfigSection.CopySdkConfigToClientConfig> { section ->\n        val mapBlock = map?.let { writable { rust(\".map(#W)\", it) } } ?: writable { }\n        val envKey = \"AWS_${fieldName.toSnakeCase().uppercase()}\".dq()\n        val profileKey = fieldName.toSnakeCase().dq()\n\n        rustTemplate(\n            \"\"\"\n            if ${section.sdkConfig}.get_origin(\"endpoint_url\").is_client_config() {\n                ${section.serviceConfigBuilder}.set_$fieldName(${section.sdkConfig}.$fieldName()#{map});\n            } else {\n                ${section.serviceConfigBuilder}.set_$fieldName(\n                    ${section.sdkConfig}\n                        .service_config()\n                        .and_then(|conf| conf.load_config(service_config_key(${serviceId.dq()}, $envKey, $profileKey)).map(|it| it.parse().unwrap()))\n                        .or_else(|| ${section.sdkConfig}.$fieldName()#{map})\n                );\n            }\n            \"\"\",\n            \"map\" to mapBlock,\n        )\n    }\n}\n\n/**\n * SdkConfig -> <service>::Config for settings that come from generic smithy\n */\nclass GenericSmithySdkConfigSettings : ClientCodegenDecorator {\n    override val name: String = \"GenericSmithySdkConfigSettings\"\n    override val order: Byte = 0\n\n    override fun extraSections(codegenContext: ClientCodegenContext): List<AdHocCustomization> =\n        listOf(\n            adhocCustomization<SdkConfigSection.CopySdkConfigToClientConfig> { section ->\n                rust(\n                    \"\"\"\n                    // resiliency\n                    ${section.serviceConfigBuilder}.set_retry_config(${section.sdkConfig}.retry_config().cloned());\n                    ${section.serviceConfigBuilder}.set_timeout_config(${section.sdkConfig}.timeout_config().cloned());\n                    ${section.serviceConfigBuilder}.set_sleep_impl(${section.sdkConfig}.sleep_impl());\n\n                    ${section.serviceConfigBuilder}.set_http_client(${section.sdkConfig}.http_client());\n                    ${section.serviceConfigBuilder}.set_time_source(${section.sdkConfig}.time_source());\n                    ${section.serviceConfigBuilder}.set_behavior_version(${section.sdkConfig}.behavior_version());\n                    ${section.serviceConfigBuilder}.set_auth_scheme_preference(${section.sdkConfig}.auth_scheme_preference().cloned());\n                    // setting `None` here removes the default\n                    if let Some(config) = ${section.sdkConfig}.stalled_stream_protection() {\n                        ${section.serviceConfigBuilder}.set_stalled_stream_protection(Some(config));\n                    }\n\n                    if let Some(cache) = ${section.sdkConfig}.identity_cache() {\n                        ${section.serviceConfigBuilder}.set_identity_cache(cache);\n                    }\n                    \"\"\",\n                )\n            },\n        )\n}\n\n/**\n * Adds functionality for constructing `<service>::Config` objects from `aws_types::SdkConfig`s\n *\n * - `From<&aws_types::SdkConfig> for <service>::config::Builder`: Enabling customization\n * - `pub fn new(&aws_types::SdkConfig) -> <service>::Config`: Direct construction without customization\n */\nclass SdkConfigDecorator : ClientCodegenDecorator {\n    override val name: String = \"SdkConfig\"\n    override val order: Byte = 0\n\n    override fun configCustomizations(\n        codegenContext: ClientCodegenContext,\n        baseCustomizations: List<ConfigCustomization>,\n    ): List<ConfigCustomization> {\n        return baseCustomizations + NewFromShared(codegenContext.runtimeConfig)\n    }\n\n    override fun extras(\n        codegenContext: ClientCodegenContext,\n        rustCrate: RustCrate,\n    ) {\n        val codegenScope =\n            arrayOf(\n                \"SdkConfig\" to AwsRuntimeType.awsTypes(codegenContext.runtimeConfig).resolve(\"sdk_config::SdkConfig\"),\n            )\n\n        rustCrate.withModule(ClientRustModule.config) {\n            rustTemplate(\n                \"\"\"\n                impl From<&#{SdkConfig}> for Builder {\n                    fn from(input: &#{SdkConfig}) -> Self {\n                        let mut builder = Builder::default();\n                        #{augmentBuilder:W}\n\n                        builder\n                    }\n                }\n\n                impl From<&#{SdkConfig}> for Config {\n                    fn from(sdk_config: &#{SdkConfig}) -> Self {\n                        Builder::from(sdk_config).build()\n                    }\n                }\n                \"\"\",\n                \"augmentBuilder\" to\n                    writable {\n                        writeCustomizations(\n                            codegenContext.rootDecorator.extraSections(codegenContext),\n                            SdkConfigSection.CopySdkConfigToClientConfig(\n                                sdkConfig = \"input\",\n                                serviceConfigBuilder = \"builder\",\n                            ),\n                        )\n                    },\n                *codegenScope,\n            )\n        }\n    }\n}\n\nclass NewFromShared(runtimeConfig: RuntimeConfig) : ConfigCustomization() {\n    private val codegenScope =\n        arrayOf(\n            \"SdkConfig\" to AwsRuntimeType.awsTypes(runtimeConfig).resolve(\"sdk_config::SdkConfig\"),\n        )\n\n    override fun section(section: ServiceConfig): Writable {\n        return when (section) {\n            ServiceConfig.ConfigImpl ->\n                writable {\n                    rustTemplate(\n                        \"\"\"\n                        /// Creates a new [service config](crate::Config) from a [shared `config`](#{SdkConfig}).\n                        pub fn new(config: &#{SdkConfig}) -> Self {\n                            Builder::from(config).build()\n                        }\n                        \"\"\",\n                        *codegenScope,\n                    )\n                }\n\n            else -> emptySection\n        }\n    }\n}\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/main/kotlin/software/amazon/smithy/rustsdk/SdkSettings.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\npackage software.amazon.smithy.rustsdk\n\nimport software.amazon.smithy.model.node.ObjectNode\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.core.smithy.CoreRustSettings\nimport software.amazon.smithy.rust.codegen.core.util.orNull\nimport java.nio.file.Path\nimport java.nio.file.Paths\nimport java.util.logging.Logger\n\n/**\n * SDK-specific settings within the Rust codegen `customizationConfig.awsSdk` object.\n */\nclass SdkSettings private constructor(private val awsSdk: ObjectNode?) {\n    private fun warnOnUnusedProperties() {\n        if (awsSdk == null) {\n            return\n        }\n        val logger = Logger.getLogger(\"SdkSettings\")\n        if (awsSdk.getMember(\"generateReadme\").isPresent) {\n            logger.warning(\n                \"`generateReadme` parameter is now ignored. Readmes are now only generated when \" +\n                    \"`awsSdkBuild` is set to `true`. You can use `suppressReadme` to explicitly suppress the readme in that case.\",\n            )\n        }\n\n        if (awsSdk.getMember(\"requireEndpointResolver\").isPresent) {\n            logger.warning(\n                \"`requireEndpointResolver` is no a no-op and you may remove it from your configuration. \" +\n                    \"An endpoint resolver is only required when `awsSdkBuild` is set to true.\",\n            )\n        }\n    }\n\n    companion object {\n        fun from(coreRustSettings: CoreRustSettings): SdkSettings {\n            val settings = SdkSettings(coreRustSettings.customizationConfig?.getObjectMember(\"awsSdk\")?.orNull())\n            if (shouldPrintWarning()) {\n                settings.warnOnUnusedProperties()\n                warningPrinted()\n            }\n            return settings\n        }\n\n        @Volatile\n        var warningPrinted = false\n\n        private fun warningPrinted() {\n            synchronized(this) {\n                this.warningPrinted = true\n            }\n        }\n\n        private fun shouldPrintWarning(): Boolean {\n            synchronized(this) {\n                return !this.warningPrinted\n            }\n        }\n    }\n\n    /** Path to the `sdk-default-configuration.json` config file */\n    val defaultsConfigPath: Path?\n        get() =\n            awsSdk?.getStringMember(\"defaultConfigPath\")?.orNull()?.value.let { Paths.get(it) }\n\n    /** Path to the `default-partitions.json` configuration */\n    val partitionsConfigPath: Path?\n        get() =\n            awsSdk?.getStringMember(\"partitionsConfigPath\")?.orNull()?.value?.let { Paths.get(it) }\n\n    val awsSdkBuild: Boolean\n        get() = awsSdk?.getBooleanMember(\"awsSdkBuild\")?.orNull()?.value ?: false\n\n    /** Path to AWS SDK integration tests */\n    val integrationTestPath: String\n        get() =\n            awsSdk?.getStringMember(\"integrationTestPath\")?.orNull()?.value ?: \"aws/sdk/integration-tests\"\n\n    /** Version number of the `aws-config` crate. This is used to set the dev-dependency when generating readme's  */\n    val awsConfigVersion: String?\n        get() =\n            awsSdk?.getStringMember(\"awsConfigVersion\")?.orNull()?.value\n\n    /** Whether to generate a README */\n    val generateReadme: Boolean\n        get() = awsSdkBuild && !(awsSdk?.getBooleanMember(\"suppressReadme\")?.orNull()?.value ?: false)\n\n    val requireEndpointResolver: Boolean\n        get() = awsSdkBuild\n}\n\nfun ClientCodegenContext.sdkSettings() = SdkSettings.from(this.settings)\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/main/kotlin/software/amazon/smithy/rustsdk/ServiceConfigDecorator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rustsdk\n\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.config.ServiceConfig\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.docs\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\n\nclass ServiceConfigDecorator : ClientCodegenDecorator {\n    override val name: String = \"ServiceConfigGenerator\"\n    override val order: Byte = 0\n\n    override fun configCustomizations(\n        codegenContext: ClientCodegenContext,\n        baseCustomizations: List<ConfigCustomization>,\n    ): List<ConfigCustomization> = baseCustomizations + SharedConfigDocsCustomization()\n}\n\nclass SharedConfigDocsCustomization : ConfigCustomization() {\n    override fun section(section: ServiceConfig): Writable {\n        return if (section is ServiceConfig.ConfigStructAdditionalDocs) {\n            writable {\n                docs(\n                    \"\"\"Service configuration allows for customization of endpoints, region, credentials providers,\n                    and retry configuration. Generally, it is constructed automatically for you from a shared\n                    configuration loaded by the `aws-config` crate. For example:\n\n                    ```ignore\n                    // Load a shared config from the environment\n                    let shared_config = aws_config::from_env().load().await;\n                    // The client constructor automatically converts the shared config into the service config\n                    let client = Client::new(&shared_config);\n                    ```\n\n                    The service config can also be constructed manually using its builder.\n                    \"\"\",\n                )\n            }\n        } else {\n            emptySection\n        }\n    }\n}\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/main/kotlin/software/amazon/smithy/rustsdk/ServiceEnvConfigDecorator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rustsdk\n\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.smithy.RustCrate\n\nclass ServiceEnvConfigDecorator : ClientCodegenDecorator {\n    override val name: String = \"ServiceEnvConfigDecorator\"\n    override val order: Byte = 10\n\n    override fun extras(\n        codegenContext: ClientCodegenContext,\n        rustCrate: RustCrate,\n    ) {\n        val rc = codegenContext.runtimeConfig\n        rustCrate.withModule(ClientRustModule.config) {\n            Attribute.AllowDeadCode.render(this)\n            rustTemplate(\n                \"\"\"\n                fn service_config_key<'a>(\n                    service_id: &'a str,\n                    env: &'a str,\n                    profile: &'a str,\n                ) -> aws_types::service_config::ServiceConfigKey<'a> {\n                    #{ServiceConfigKey}::builder()\n                        .service_id(service_id)\n                        .env(env)\n                        .profile(profile)\n                        .build()\n                        .expect(\"all field sets explicitly, can't fail\")\n                }\n                \"\"\",\n                \"ServiceConfigKey\" to AwsRuntimeType.awsTypes(rc).resolve(\"service_config::ServiceConfigKey\"),\n            )\n        }\n    }\n}\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/main/kotlin/software/amazon/smithy/rustsdk/SigV4AuthDecorator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rustsdk\n\nimport software.amazon.smithy.aws.traits.auth.SigV4ATrait\nimport software.amazon.smithy.aws.traits.auth.SigV4Trait\nimport software.amazon.smithy.aws.traits.auth.UnsignedPayloadTrait\nimport software.amazon.smithy.model.knowledge.ServiceIndex\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.ServiceShape\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.auth.AuthSchemeOption\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ConditionalDecorator\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.OperationSection\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginSection\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.config.ServiceConfig\nimport software.amazon.smithy.rust.codegen.core.rustlang.Feature\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.featureGateBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RustCrate\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.AdHocCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.adhocCustomization\nimport software.amazon.smithy.rust.codegen.core.util.dq\nimport software.amazon.smithy.rust.codegen.core.util.getTrait\nimport software.amazon.smithy.rust.codegen.core.util.hasEventStreamOperations\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\nimport software.amazon.smithy.rust.codegen.core.util.isInputEventStream\nimport software.amazon.smithy.rust.codegen.core.util.letIf\n\ninternal fun ClientCodegenContext.usesSigAuth(): Boolean =\n    ServiceIndex.of(model).getAuthSchemes(serviceShape).containsKey(SigV4Trait.ID) ||\n        usesSigV4a()\n\ninternal fun ClientCodegenContext.usesSigV4a(): Boolean =\n    ServiceIndex.of(model).getAuthSchemes(serviceShape).containsKey(SigV4ATrait.ID)\n\nclass SigV4AuthDecorator : ConditionalDecorator(\n    predicate = { codegenContext, _ -> codegenContext?.usesSigAuth() ?: false },\n    delegateTo =\n        object : ClientCodegenDecorator {\n            override val name: String get() = \"SigV4AuthDecorator\"\n            override val order: Byte = ORDER\n\n            override fun authSchemeOptions(\n                codegenContext: ClientCodegenContext,\n                baseAuthSchemeOptions: List<AuthSchemeOption>,\n            ): List<AuthSchemeOption> =\n                (baseAuthSchemeOptions + Sigv4AuthSchemeOption())\n                    .letIf(codegenContext.usesSigV4a()) {\n                        it + Sigv4aAuthSchemeOption()\n                    }\n\n            override fun serviceRuntimePluginCustomizations(\n                codegenContext: ClientCodegenContext,\n                baseCustomizations: List<ServiceRuntimePluginCustomization>,\n            ): List<ServiceRuntimePluginCustomization> =\n                baseCustomizations + listOf(AuthServiceRuntimePluginCustomization(codegenContext))\n\n            override fun operationCustomizations(\n                codegenContext: ClientCodegenContext,\n                operation: OperationShape,\n                baseCustomizations: List<OperationCustomization>,\n            ): List<OperationCustomization> = baseCustomizations + AuthOperationCustomization(codegenContext)\n\n            override fun configCustomizations(\n                codegenContext: ClientCodegenContext,\n                baseCustomizations: List<ConfigCustomization>,\n            ): List<ConfigCustomization> =\n                (\n                    baseCustomizations +\n                        SigV4SigningConfig(codegenContext.runtimeConfig, codegenContext.serviceShape.getTrait())\n                )\n                    .letIf(codegenContext.usesSigV4a()) {\n                        it + SigningRegionSetConfigCustomization(codegenContext.runtimeConfig)\n                    }\n\n            override fun extraSections(codegenContext: ClientCodegenContext): List<AdHocCustomization> =\n                emptyList<AdHocCustomization>().letIf(codegenContext.usesSigV4a()) {\n                    it +\n                        adhocCustomization<SdkConfigSection.CopySdkConfigToClientConfig> { section ->\n                            rust(\"${section.serviceConfigBuilder}.set_sigv4a_signing_region_set(${section.sdkConfig}.sigv4a_signing_region_set().cloned());\")\n                        }\n                }\n\n            override fun extras(\n                codegenContext: ClientCodegenContext,\n                rustCrate: RustCrate,\n            ) {\n                if (codegenContext.usesSigV4a()) {\n                    // Add optional feature for SigV4a support\n                    rustCrate.mergeFeature(Feature(\"sigv4a\", true, listOf(\"aws-runtime/sigv4a\")))\n                }\n            }\n        },\n) {\n    companion object {\n        const val ORDER: Byte = 0\n    }\n}\n\nprivate class Sigv4AuthSchemeOption : AuthSchemeOption {\n    override val authSchemeId = SigV4Trait.ID\n\n    override fun render(\n        codegenContext: ClientCodegenContext,\n        operation: OperationShape?,\n    ) = renderImpl(\n        codegenContext.runtimeConfig,\n        AwsRuntimeType.awsRuntime(codegenContext.runtimeConfig)\n            .resolve(\"auth::sigv4::SCHEME_ID\"),\n        operation,\n    )\n}\n\nprivate class Sigv4aAuthSchemeOption : AuthSchemeOption {\n    override val authSchemeId = SigV4ATrait.ID\n\n    override fun render(\n        codegenContext: ClientCodegenContext,\n        operation: OperationShape?,\n    ) = writable {\n        featureGateBlock(\"sigv4a\") {\n            rust(\n                \"#T\",\n                renderImpl(\n                    codegenContext.runtimeConfig,\n                    AwsRuntimeType.awsRuntime(codegenContext.runtimeConfig)\n                        .resolve(\"auth::sigv4a::SCHEME_ID\"),\n                    operation,\n                ),\n            )\n        }\n    }\n}\n\nprivate fun renderImpl(\n    runtimeConfig: RuntimeConfig,\n    schemeId: RuntimeType,\n    op: OperationShape?,\n) = writable {\n    val codegenScope =\n        arrayOf(\n            \"AuthSchemeOption\" to\n                RuntimeType.smithyRuntimeApiClient(runtimeConfig)\n                    .resolve(\"client::auth::AuthSchemeOption\"),\n            \"Layer\" to\n                RuntimeType.smithyTypes(runtimeConfig)\n                    .resolve(\"config_bag::Layer\"),\n            \"PayloadSigningOverride\" to\n                AwsRuntimeType.awsRuntime(runtimeConfig)\n                    .resolve(\"auth::PayloadSigningOverride\"),\n        )\n    rustTemplate(\n        \"\"\"\n        #{AuthSchemeOption}::builder()\n            .scheme_id(#{schemeId})\n            #{properties:W}\n            .build()\n            .expect(\"required fields set\")\n        \"\"\",\n        *codegenScope,\n        \"schemeId\" to schemeId,\n        \"properties\" to\n            writable {\n                if (op?.hasTrait<UnsignedPayloadTrait>() == true) {\n                    rustTemplate(\n                        \"\"\"\n                        .properties({\n                            let mut layer = #{Layer}::new(\"${op.id.name}AuthOptionProperties\");\n                            layer.store_put(#{PayloadSigningOverride}::unsigned_payload());\n                            layer.freeze()\n                        })\n                        \"\"\",\n                        *codegenScope,\n                    )\n                }\n            },\n    )\n}\n\nprivate class SigV4SigningConfig(\n    runtimeConfig: RuntimeConfig,\n    private val sigV4Trait: SigV4Trait?,\n) : ConfigCustomization() {\n    private val codegenScope =\n        arrayOf(\n            \"Region\" to AwsRuntimeType.awsTypes(runtimeConfig).resolve(\"region::Region\"),\n            \"SigningName\" to AwsRuntimeType.awsTypes(runtimeConfig).resolve(\"SigningName\"),\n            \"SigningRegion\" to AwsRuntimeType.awsTypes(runtimeConfig).resolve(\"region::SigningRegion\"),\n        )\n\n    override fun section(section: ServiceConfig): Writable =\n        writable {\n            if (sigV4Trait != null) {\n                when (section) {\n                    ServiceConfig.ConfigImpl -> {\n                        rust(\n                            \"\"\"\n                            /// The signature version 4 service signing name to use in the credential scope when signing requests.\n                            ///\n                            /// The signing service may be overridden by the `Endpoint`, or by specifying a custom\n                            /// [`SigningName`](aws_types::SigningName) during operation construction\n                            pub fn signing_name(&self) -> &'static str {\n                                ${sigV4Trait.name.dq()}\n                            }\n                            \"\"\",\n                        )\n                    }\n\n                    ServiceConfig.BuilderBuild -> {\n                        rustTemplate(\n                            \"\"\"\n                            layer.store_put(#{SigningName}::from_static(${sigV4Trait.name.dq()}));\n                            layer.load::<#{Region}>().cloned().map(|r| layer.store_put(#{SigningRegion}::from(r)));\n                            \"\"\",\n                            *codegenScope,\n                        )\n                    }\n\n                    is ServiceConfig.OperationConfigOverride -> {\n                        rustTemplate(\n                            \"\"\"\n                            resolver.config_mut()\n                                .load::<#{Region}>()\n                                .cloned()\n                                .map(|r| resolver.config_mut().store_put(#{SigningRegion}::from(r)));\n                            \"\"\",\n                            *codegenScope,\n                        )\n                    }\n\n                    else -> {}\n                }\n            }\n        }\n}\n\nprivate class AuthServiceRuntimePluginCustomization(private val codegenContext: ClientCodegenContext) :\n    ServiceRuntimePluginCustomization() {\n    private val runtimeConfig = codegenContext.runtimeConfig\n    private val codegenScope by lazy {\n        val awsRuntime = AwsRuntimeType.awsRuntime(runtimeConfig)\n        arrayOf(\n            \"SigV4AuthScheme\" to awsRuntime.resolve(\"auth::sigv4::SigV4AuthScheme\"),\n            \"SigV4aAuthScheme\" to awsRuntime.resolve(\"auth::sigv4a::SigV4aAuthScheme\"),\n            \"SharedAuthScheme\" to\n                RuntimeType.smithyRuntimeApiClient(runtimeConfig)\n                    .resolve(\"client::auth::SharedAuthScheme\"),\n        )\n    }\n\n    override fun section(section: ServiceRuntimePluginSection): Writable =\n        writable {\n            when (section) {\n                is ServiceRuntimePluginSection.RegisterRuntimeComponents -> {\n                    val serviceHasEventStream =\n                        codegenContext.serviceShape.hasEventStreamOperations(codegenContext.model)\n                    if (serviceHasEventStream) {\n                        // enable the aws-runtime `event-stream` feature\n                        addDependency(\n                            AwsCargoDependency.awsRuntime(runtimeConfig).withFeature(\"event-stream\").toType()\n                                .toSymbol(),\n                        )\n                    }\n                    section.registerAuthScheme(this) {\n                        rustTemplate(\"#{SharedAuthScheme}::new(#{SigV4AuthScheme}::new())\", *codegenScope)\n                    }\n\n                    if (codegenContext.usesSigV4a()) {\n                        featureGateBlock(\"sigv4a\") {\n                            section.registerAuthScheme(this) {\n                                rustTemplate(\"#{SharedAuthScheme}::new(#{SigV4aAuthScheme}::new())\", *codegenScope)\n                            }\n                        }\n                    }\n                }\n\n                else -> {}\n            }\n        }\n}\n\nfun needsAmzSha256(service: ServiceShape) =\n    when (service.id) {\n        ShapeId.from(\"com.amazonaws.s3#AmazonS3\") -> true\n        ShapeId.from(\"com.amazonaws.s3control#AWSS3ControlServiceV20180820\") -> true\n        else -> false\n    }\n\nfun disableDoubleEncode(service: ServiceShape) =\n    when (service.id) {\n        ShapeId.from(\"com.amazonaws.s3#AmazonS3\") -> true\n        else -> false\n    }\n\nfun disableUriPathNormalization(service: ServiceShape) =\n    when (service.id) {\n        ShapeId.from(\"com.amazonaws.s3#AmazonS3\") -> true\n        else -> false\n    }\n\nprivate class AuthOperationCustomization(private val codegenContext: ClientCodegenContext) : OperationCustomization() {\n    private val runtimeConfig = codegenContext.runtimeConfig\n    private val codegenScope by lazy {\n        val awsRuntime = AwsRuntimeType.awsRuntime(runtimeConfig)\n        arrayOf(\n            \"SigV4OperationSigningConfig\" to awsRuntime.resolve(\"auth::SigV4OperationSigningConfig\"),\n            \"SigningOptions\" to awsRuntime.resolve(\"auth::SigningOptions\"),\n            \"SignableBody\" to AwsRuntimeType.awsSigv4(runtimeConfig).resolve(\"http_request::SignableBody\"),\n            \"Default\" to RuntimeType.Default,\n        )\n    }\n    private val serviceIndex = ServiceIndex.of(codegenContext.model)\n\n    override fun section(section: OperationSection): Writable =\n        writable {\n            when (section) {\n                is OperationSection.AdditionalRuntimePluginConfig -> {\n                    val authSchemes =\n                        serviceIndex.getEffectiveAuthSchemes(codegenContext.serviceShape, section.operationShape)\n                    if (authSchemes.containsKey(SigV4Trait.ID)) {\n                        val unsignedPayload = section.operationShape.hasTrait<UnsignedPayloadTrait>()\n                        val doubleUriEncode = unsignedPayload || !disableDoubleEncode(codegenContext.serviceShape)\n                        val contentSha256Header = needsAmzSha256(codegenContext.serviceShape) || unsignedPayload\n                        val normalizeUrlPath = !disableUriPathNormalization(codegenContext.serviceShape)\n                        rustTemplate(\n                            \"\"\"\n                            let mut signing_options = #{SigningOptions}::default();\n                            signing_options.double_uri_encode = $doubleUriEncode;\n                            signing_options.content_sha256_header = $contentSha256Header;\n                            signing_options.normalize_uri_path = $normalizeUrlPath;\n                            signing_options.payload_override = #{payload_override};\n\n                            ${section.newLayerName}.store_put(#{SigV4OperationSigningConfig} {\n                                signing_options,\n                                ..#{Default}::default()\n                            });\n                            \"\"\",\n                            *codegenScope,\n                            \"payload_override\" to\n                                writable {\n                                    if (unsignedPayload) {\n                                        rustTemplate(\"Some(#{SignableBody}::UnsignedPayload)\", *codegenScope)\n                                    } else if (section.operationShape.isInputEventStream(codegenContext.model)) {\n                                        // TODO(EventStream): Is this actually correct for all Event Stream operations?\n                                        rustTemplate(\"Some(#{SignableBody}::Bytes(&[]))\", *codegenScope)\n                                    } else {\n                                        rust(\"None\")\n                                    }\n                                },\n                        )\n                    }\n                }\n\n                else -> {}\n            }\n        }\n}\n\nprivate class SigningRegionSetConfigCustomization(runtimeConfig: RuntimeConfig) : ConfigCustomization() {\n    private val codegenScope =\n        arrayOf(\n            \"SigningRegionSet\" to AwsRuntimeType.awsTypes(runtimeConfig).resolve(\"region::SigningRegionSet\"),\n        )\n\n    override fun section(section: ServiceConfig): Writable =\n        writable {\n            when (section) {\n                ServiceConfig.ConfigImpl -> {\n                    rustTemplate(\n                        \"\"\"\n                        /// Returns the SigV4a signing region set, if configured.\n                        pub fn sigv4a_signing_region_set(&self) -> Option<&#{SigningRegionSet}> {\n                            self.config.load::<#{SigningRegionSet}>()\n                        }\n                        \"\"\",\n                        *codegenScope,\n                    )\n                }\n\n                ServiceConfig.BuilderImpl -> {\n                    rustTemplate(\n                        \"\"\"\n                        /// Sets the SigV4a signing region set.\n                        pub fn sigv4a_signing_region_set(mut self, v: impl Into<#{SigningRegionSet}>) -> Self {\n                            self.set_sigv4a_signing_region_set(Some(v.into()));\n                            self\n                        }\n\n                        /// Sets the SigV4a signing region set.\n                        pub fn set_sigv4a_signing_region_set(&mut self, v: Option<#{SigningRegionSet}>) -> &mut Self {\n                            self.config.store_or_unset(v);\n                            self\n                        }\n                        \"\"\",\n                        *codegenScope,\n                    )\n                }\n\n                is ServiceConfig.BuilderFromConfigBag -> {\n                    rustTemplate(\n                        \"${section.builder}.set_sigv4a_signing_region_set(${section.configBag}.load::<#{SigningRegionSet}>().cloned());\",\n                        *codegenScope,\n                    )\n                }\n\n                else -> {}\n            }\n        }\n}\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/main/kotlin/software/amazon/smithy/rustsdk/SmokeTestsDecorator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rustsdk\n\nimport software.amazon.smithy.aws.smoketests.model.AwsSmokeTestModel\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.node.ObjectNode\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.rulesengine.language.syntax.parameters.Parameters\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.client.smithy.endpoint.EndpointRulesetIndex\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.client.FluentClientGenerator\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute.Companion.cfg\nimport software.amazon.smithy.rust.codegen.core.rustlang.AttributeKind\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.containerDocs\nimport software.amazon.smithy.rust.codegen.core.rustlang.docs\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenContext\nimport software.amazon.smithy.rust.codegen.core.smithy.PublicImportSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.RustCrate\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.BuilderGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.Instantiator\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.setterName\nimport software.amazon.smithy.rust.codegen.core.testutil.integrationTest\nimport software.amazon.smithy.rust.codegen.core.util.dq\nimport software.amazon.smithy.rust.codegen.core.util.expectTrait\nimport software.amazon.smithy.rust.codegen.core.util.inputShape\nimport software.amazon.smithy.rust.codegen.core.util.orNull\nimport software.amazon.smithy.rust.codegen.core.util.toSnakeCase\nimport software.amazon.smithy.smoketests.traits.Expectation\nimport software.amazon.smithy.smoketests.traits.SmokeTestCase\nimport software.amazon.smithy.smoketests.traits.SmokeTestsTrait\nimport java.util.Optional\nimport java.util.logging.Logger\nimport kotlin.jvm.optionals.getOrElse\n\nclass SmokeTestsDecorator : ClientCodegenDecorator {\n    override val name: String = \"SmokeTests\"\n    override val order: Byte = 0\n    private val logger: Logger = Logger.getLogger(javaClass.name)\n\n    private fun isSmokeTestSupported(smokeTestCase: SmokeTestCase): Boolean {\n        AwsSmokeTestModel.getAwsVendorParams(smokeTestCase)?.orNull()?.let { vendorParams ->\n            if (vendorParams.sigv4aRegionSet.isPresent) {\n                logger.warning(\"skipping smoketest `${smokeTestCase.id}` with unsupported vendorParam `sigv4aRegionSet`\")\n                return false\n            }\n        }\n        AwsSmokeTestModel.getS3VendorParams(smokeTestCase)?.orNull()?.let { s3VendorParams ->\n            if (s3VendorParams.useGlobalEndpoint()) {\n                logger.warning(\"skipping smoketest `${smokeTestCase.id}` with unsupported vendorParam `useGlobalEndpoint`\")\n                return false\n            }\n        }\n\n        return true\n    }\n\n    override fun extras(\n        codegenContext: ClientCodegenContext,\n        rustCrate: RustCrate,\n    ) {\n        // Get all operations with smoke tests\n        val smokeTestedOperations = operationToTestCases(codegenContext.model)\n        val supportedTests =\n            smokeTestedOperations.map { (operationShape, testCases) ->\n                // filter out unsupported smoke tests, logging a warning for each one, and sort the remaining tests by\n                // case ID. This ensures deterministic rendering, meaning the test methods are always rendered in a\n                // consistent order.\n                testCases.filter { smokeTestCase ->\n                    isSmokeTestSupported(smokeTestCase)\n                }.sortedBy { smokeTestCase -> smokeTestCase.id }\n\n                operationShape to testCases\n            }\n                // filter out operations with no supported smoke tests\n                .filter { (_, testCases) -> testCases.isNotEmpty() }\n                // Similar to sorting test cases above, sort operations by name to ensure consistent ordering.\n                .sortedBy { (operationShape, _) -> operationShape.id.name }\n\n        // Return if there are no supported smoke tests across all operations\n        if (supportedTests.isEmpty()) return\n\n        rustCrate.integrationTest(\"smoketests\") {\n            renderPrologue(codegenContext.moduleUseName(), this)\n\n            for ((operationShape, testCases) in supportedTests) {\n                docs(\"Smoke tests for the `${operationShape.id.name.toSnakeCase()}` operation\")\n                val instantiator =\n                    SmokeTestsInstantiator(\n                        codegenContext, operationShape,\n                        configBuilderInitializer = { ->\n                            writable {\n                                rustTemplate(\n                                    \"\"\"\n                                    let config = #{awsConfig}::load_defaults(config::BehaviorVersion::latest()).await;\n                                    let conf = config::Config::from(&config).to_builder()\n                                    \"\"\",\n                                    \"awsConfig\" to AwsCargoDependency.awsConfig(codegenContext.runtimeConfig).toType(),\n                                )\n                            }\n                        },\n                    )\n                for (testCase in testCases) {\n                    Attribute.TokioTest.render(this)\n                    this.rustBlock(\"async fn test_${testCase.id.toSnakeCase()}()\") {\n                        instantiator.render(this, testCase)\n                    }\n                }\n            }\n        }\n    }\n}\n\nfun renderPrologue(\n    moduleUseName: String,\n    writer: RustWriter,\n) = writer.apply {\n    // Don't run the tests in this module unless `RUSTFLAGS=\"--cfg smoketests\"` is passed.\n    Attribute(cfg(\"smoketests\")).render(this, AttributeKind.Inner)\n\n    containerDocs(\n        \"\"\"\n        The tests in this module run against live AWS services. As such,\n        they are disabled by default. To enable them, run the tests with\n\n        ```sh\n        RUSTFLAGS=\"--cfg smoketests\" cargo test\n        ```\n        \"\"\",\n    )\n\n    rust(\"use $moduleUseName::{Client, config};\")\n}\n\nfun operationToTestCases(model: Model) =\n    model.getOperationShapesWithTrait(SmokeTestsTrait::class.java).toList().map { operationShape ->\n        operationShape to operationShape.expectTrait<SmokeTestsTrait>().testCases\n    }\n\nclass SmokeTestsBuilderKindBehavior(val codegenContext: CodegenContext) : Instantiator.BuilderKindBehavior {\n    override fun hasFallibleBuilder(shape: StructureShape): Boolean =\n        BuilderGenerator.hasFallibleBuilder(shape, codegenContext.symbolProvider)\n\n    override fun setterName(memberShape: MemberShape): String = memberShape.setterName()\n\n    override fun doesSetterTakeInOption(memberShape: MemberShape): Boolean = true\n}\n\nclass SmokeTestsInstantiator(\n    codegenContext: ClientCodegenContext, private val operationShape: OperationShape,\n    private val configBuilderInitializer: () -> Writable,\n) : Instantiator(\n        PublicImportSymbolProvider(codegenContext.symbolProvider, codegenContext.moduleUseName()),\n        codegenContext.model,\n        codegenContext.runtimeConfig,\n        SmokeTestsBuilderKindBehavior(codegenContext),\n    ) {\n    private val model = codegenContext.model\n    private val symbolProvider = codegenContext.symbolProvider\n\n    // Get list of the built-ins actually included in the model\n    private val builtInParamNames: List<String> by lazy {\n        val index = EndpointRulesetIndex.of(codegenContext.model)\n        val rulesOrNull = index.endpointRulesForService(codegenContext.serviceShape)\n        val builtInParams: Parameters = (rulesOrNull?.parameters ?: Parameters.builder().build())\n        val temp: MutableList<String> = mutableListOf()\n        builtInParams.forEach { temp.add(it.builtIn.getOrElse { \"\" }) }\n        temp\n    }\n    private val fipsName = \"AWS::UseFIPS\"\n    private val dualStackName = \"AWS::UseDualStack\"\n    private val rc = codegenContext.runtimeConfig\n\n    fun render(\n        writer: RustWriter,\n        testCase: SmokeTestCase,\n    ) = writer.apply {\n        renderConf(this, testCase)\n        rust(\"let client = Client::from_conf(conf);\")\n        renderInput(this, testCase.params)\n        renderExpectation(this, testCase.expectation)\n    }\n\n    private fun renderConf(\n        writer: RustWriter,\n        testCase: SmokeTestCase,\n    ) = writer.apply {\n        rustTemplate(\"#{config_builder_initializer}\", \"config_builder_initializer\" to configBuilderInitializer())\n        indent()\n\n        // TODO(https://github.com/smithy-lang/smithy-rs/issues/3863) When re-enabling service smoke tests,\n        //  include the config setting for account ID, especially to disable it if needed, as it is enabled\n        //  by default in `AwsVendorParams`.\n\n        val vendorParams = AwsSmokeTestModel.getAwsVendorParams(testCase)\n        vendorParams.orNull()?.let { params ->\n            rustTemplate(\n                \".region(#{Region}::new(${params.region.dq()}))\",\n                \"Region\" to AwsRuntimeType.awsTypes(rc).resolve(\"region::Region\"),\n            )\n\n            // The `use_dual_stack` and `use_fips` fields will only exist on the endpoint params if they built-ins are\n            // included in the model, so we check for that before setting them.\n            if (builtInParamNames.contains(dualStackName)) {\n                rust(\".use_dual_stack(${params.useDualstack()})\")\n            }\n            if (builtInParamNames.contains(fipsName)) {\n                rust(\".use_fips(${params.useFips()})\")\n            }\n\n            params.uri.orNull()?.let { rust(\".endpoint_url($it)\") }\n        }\n\n        val s3VendorParams = AwsSmokeTestModel.getS3VendorParams(testCase)\n        s3VendorParams.orNull()?.let { params ->\n            rust(\".accelerate_(${params.useAccelerate()})\")\n            rust(\".force_path_style_(${params.forcePathStyle()})\")\n            rust(\".use_arn_region(${params.useArnRegion()})\")\n            rust(\".disable_multi_region_access_points(${params.useMultiRegionAccessPoints().not()})\")\n        }\n\n        rust(\".build();\")\n        dedent()\n    }\n\n    private fun renderInput(\n        writer: RustWriter,\n        data: Optional<ObjectNode>,\n        headers: Map<String, String> = mapOf(),\n        ctx: Ctx = Ctx(),\n    ) = writer.apply {\n        val operationBuilderName =\n            FluentClientGenerator.clientOperationFnName(operationShape, symbolProvider)\n        val inputShape = operationShape.inputShape(model)\n\n        rust(\"let res = client.$operationBuilderName()\")\n        indent()\n        data.orNull()?.let {\n            renderStructureMembers(writer, inputShape, it, headers, ctx)\n        }\n        rust(\".send().await;\")\n        dedent()\n    }\n\n    private fun renderExpectation(\n        writer: RustWriter,\n        expectation: Expectation,\n    ) = writer.apply {\n        if (expectation.isSuccess) {\n            rust(\"\"\"res.expect(\"request should succeed\");\"\"\")\n        } else if (expectation.isFailure) {\n            val expectedErrShape = expectation.failure.orNull()?.errorId?.orNull()\n            println(expectedErrShape)\n            if (expectedErrShape != null) {\n                val failureShape = model.expectShape(expectedErrShape)\n                val errName = symbolProvider.toSymbol(failureShape).name.toSnakeCase()\n                rust(\n                    \"\"\"\n                    let err = res.expect_err(\"request should fail\");\n                    let err = err.into_service_error();\n                    assert!(err.is_$errName())\n                    \"\"\",\n                )\n            } else {\n                rust(\"\"\"res.expect_err(\"request should fail\");\"\"\")\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/main/kotlin/software/amazon/smithy/rustsdk/SpanDecorator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rustsdk\n\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.OperationSection\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.util.dq\n\n/**\n * Adds the AWS SDK specific `rpc.system = \"aws-api\"` field to the operation's tracing span\n */\nclass SpanDecorator : ClientCodegenDecorator {\n    override val name: String = \"SpanDecorator\"\n    override val order: Byte = 0\n\n    override fun operationCustomizations(\n        codegenContext: ClientCodegenContext,\n        operation: OperationShape,\n        baseCustomizations: List<OperationCustomization>,\n    ): List<OperationCustomization> {\n        return baseCustomizations +\n            object : OperationCustomization() {\n                private val runtimeConfig = codegenContext.runtimeConfig\n\n                override fun section(section: OperationSection): Writable {\n                    return writable {\n                        when (section) {\n                            is OperationSection.AdditionalOperationSpanFields -> {\n                                section.addField(this, \"rpc.system\", writable(\"aws-api\".dq()))\n                            }\n\n                            else -> {}\n                        }\n                    }\n                }\n            }\n    }\n}\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/main/kotlin/software/amazon/smithy/rustsdk/TokenProvidersDecorator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\npackage software.amazon.smithy.rustsdk\n\nimport software.amazon.smithy.model.knowledge.ServiceIndex\nimport software.amazon.smithy.model.traits.HttpBearerAuthTrait\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.configReexport\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ConditionalDecorator\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.config.ServiceConfig\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.AdHocCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.adhocCustomization\n\nclass TokenProvidersDecorator : ConditionalDecorator(\n    predicate = { codegenContext, _ ->\n        codegenContext?.let {\n            ServiceIndex.of(codegenContext.model).getEffectiveAuthSchemes(codegenContext.serviceShape)\n                .containsKey(HttpBearerAuthTrait.ID)\n        } ?: false\n    },\n    delegateTo =\n        object : ClientCodegenDecorator {\n            override val name: String get() = \"TokenProvidersDecorator\"\n            override val order: Byte = ORDER\n\n            override fun configCustomizations(\n                codegenContext: ClientCodegenContext,\n                baseCustomizations: List<ConfigCustomization>,\n            ): List<ConfigCustomization> = baseCustomizations + TokenProviderConfig(codegenContext)\n\n            override fun extraSections(codegenContext: ClientCodegenContext): List<AdHocCustomization> =\n                listOf(\n                    adhocCustomization<SdkConfigSection.CopySdkConfigToClientConfig> { section ->\n                        rust(\"${section.serviceConfigBuilder}.set_token_provider(${section.sdkConfig}.token_provider());\")\n                    },\n                )\n        },\n) {\n    companion object {\n        const val ORDER: Byte = 0\n    }\n}\n\n/**\n * Add a `.token_provider` field and builder to the `Config` for a given service\n */\nclass TokenProviderConfig(private val codegenContext: ClientCodegenContext) : ConfigCustomization() {\n    private val runtimeConfig = codegenContext.runtimeConfig\n    private val codegenScope =\n        arrayOf(\n            *RuntimeType.preludeScope,\n            \"IntoShared\" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve(\"shared::IntoShared\"),\n            \"Token\" to configReexport(AwsRuntimeType.awsCredentialTypes(runtimeConfig).resolve(\"Token\")),\n            \"ProvideToken\" to\n                configReexport(\n                    AwsRuntimeType.awsCredentialTypes(runtimeConfig)\n                        .resolve(\"provider::token::ProvideToken\"),\n                ),\n            \"SharedTokenProvider\" to\n                configReexport(\n                    AwsRuntimeType.awsCredentialTypes(runtimeConfig)\n                        .resolve(\"provider::token::SharedTokenProvider\"),\n                ),\n            \"TestToken\" to AwsRuntimeType.awsCredentialTypesTestUtil(runtimeConfig).resolve(\"Token\"),\n            \"HTTP_BEARER_AUTH_SCHEME_ID\" to\n                CargoDependency.smithyRuntimeApiClient(runtimeConfig)\n                    .withFeature(\"http-auth\").toType().resolve(\"client::auth::http\")\n                    .resolve(\"HTTP_BEARER_AUTH_SCHEME_ID\"),\n        )\n\n    override fun section(section: ServiceConfig) =\n        writable {\n            when (section) {\n                ServiceConfig.BuilderImpl -> {\n                    rustTemplate(\n                        \"\"\"\n                        /// Sets the access token provider for this service\n                        ///\n                        /// Note: the [`Self::bearer_token`] and [`Self::bearer_token_resolver`] methods are\n                        /// equivalent to this method, but take the [`Token`] and [`ResolveIdentity`] types\n                        /// respectively.\n                        ///\n                        /// [`Token`]: crate::config::Token\n                        /// [`ResolveIdentity`]: crate::config::ResolveIdentity\n                        pub fn token_provider(mut self, token_provider: impl #{ProvideToken} + 'static) -> Self {\n                            self.set_token_provider(#{Some}(#{IntoShared}::<#{SharedTokenProvider}>::into_shared(token_provider)));\n                            self\n                        }\n\n                        /// Sets the access token provider for this service\n                        ///\n                        /// Note: the [`Self::bearer_token`] and [`Self::bearer_token_resolver`] methods are\n                        /// equivalent to this method, but take the [`Token`] and [`ResolveIdentity`] types\n                        /// respectively.\n                        ///\n                        /// [`Token`]: crate::config::Token\n                        /// [`ResolveIdentity`]: crate::config::ResolveIdentity\n                        pub fn set_token_provider(&mut self, token_provider: #{Option}<#{SharedTokenProvider}>) -> &mut Self {\n                            if let Some(token_provider) = token_provider {\n                                self.runtime_components.set_identity_resolver(#{HTTP_BEARER_AUTH_SCHEME_ID}, token_provider);\n                            }\n                            self\n                        }\n                        \"\"\",\n                        *codegenScope,\n                    )\n                }\n\n                is ServiceConfig.DefaultForTests ->\n                    rustTemplate(\n                        \"${section.configBuilderRef}.set_token_provider(Some(#{SharedTokenProvider}::new(#{TestToken}::for_tests())));\",\n                        *codegenScope,\n                    )\n\n                else -> emptySection\n            }\n        }\n}\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/main/kotlin/software/amazon/smithy/rustsdk/UserAgentDecorator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rustsdk\n\nimport software.amazon.smithy.aws.traits.ServiceTrait\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginSection\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.config.ServiceConfig\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\nimport software.amazon.smithy.rust.codegen.core.smithy.RustCrate\nimport software.amazon.smithy.rust.codegen.core.smithy.customizations.CrateVersionCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.AdHocCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.adhocCustomization\nimport software.amazon.smithy.rust.codegen.core.util.dq\nimport software.amazon.smithy.rust.codegen.core.util.expectTrait\n\n/**\n * Inserts a UserAgent configuration into the operation\n */\nclass UserAgentDecorator : ClientCodegenDecorator {\n    override val name: String = \"UserAgent\"\n    override val order: Byte = 10\n\n    override fun configCustomizations(\n        codegenContext: ClientCodegenContext,\n        baseCustomizations: List<ConfigCustomization>,\n    ): List<ConfigCustomization> {\n        return baseCustomizations + AppNameCustomization(codegenContext)\n    }\n\n    override fun serviceRuntimePluginCustomizations(\n        codegenContext: ClientCodegenContext,\n        baseCustomizations: List<ServiceRuntimePluginCustomization>,\n    ): List<ServiceRuntimePluginCustomization> = baseCustomizations + AddApiMetadataIntoConfigBag(codegenContext)\n\n    override fun extraSections(codegenContext: ClientCodegenContext): List<AdHocCustomization> {\n        return listOf(\n            adhocCustomization<SdkConfigSection.CopySdkConfigToClientConfig> { section ->\n                rust(\"${section.serviceConfigBuilder}.set_app_name(${section.sdkConfig}.app_name().cloned());\")\n            },\n        )\n    }\n\n    /**\n     * Adds a static `API_METADATA` variable to the crate `config` containing the serviceId & the version of the crate for this individual service\n     */\n    override fun extras(\n        codegenContext: ClientCodegenContext,\n        rustCrate: RustCrate,\n    ) {\n        val runtimeConfig = codegenContext.runtimeConfig\n\n        // We are generating an AWS SDK, the service needs to have the AWS service trait\n        val serviceTrait = codegenContext.serviceShape.expectTrait<ServiceTrait>()\n        val serviceId = serviceTrait.sdkId.lowercase().replace(\" \", \"\")\n\n        rustCrate.withModule(ClientRustModule.Meta) {\n            rustTemplate(\n                \"\"\"\n                pub(crate) static API_METADATA: #{user_agent}::ApiMetadata =\n                    #{user_agent}::ApiMetadata::new(${serviceId.dq()}, #{PKG_VERSION});\n                \"\"\",\n                \"user_agent\" to AwsRuntimeType.awsRuntime(runtimeConfig).resolve(\"user_agent\"),\n                \"PKG_VERSION\" to CrateVersionCustomization.pkgVersion(ClientRustModule.Meta),\n            )\n        }\n\n        rustCrate.withModule(ClientRustModule.config) {\n            // Re-export the app name so that it can be specified in config programmatically without an explicit dependency\n            rustTemplate(\n                \"pub use #{AppName};\",\n                \"AppName\" to AwsRuntimeType.awsTypes(runtimeConfig).resolve(\"app_name::AppName\"),\n            )\n        }\n    }\n\n    private class AddApiMetadataIntoConfigBag(codegenContext: ClientCodegenContext) :\n        ServiceRuntimePluginCustomization() {\n        private val runtimeConfig = codegenContext.runtimeConfig\n        private val awsRuntime = AwsRuntimeType.awsRuntime(runtimeConfig)\n\n        override fun section(section: ServiceRuntimePluginSection): Writable =\n            writable {\n                when (section) {\n                    is ServiceRuntimePluginSection.RegisterRuntimeComponents -> {\n                        section.registerInterceptor(this) {\n                            rust(\"#T::new()\", awsRuntime.resolve(\"user_agent::UserAgentInterceptor\"))\n                        }\n                    }\n                    else -> emptySection\n                }\n            }\n    }\n\n    private class AppNameCustomization(codegenContext: ClientCodegenContext) : ConfigCustomization() {\n        private val runtimeConfig = codegenContext.runtimeConfig\n        private val codegenScope =\n            arrayOf(\n                *preludeScope,\n                \"AppName\" to AwsRuntimeType.awsTypes(runtimeConfig).resolve(\"app_name::AppName\"),\n                \"AwsUserAgent\" to AwsRuntimeType.awsRuntime(runtimeConfig).resolve(\"user_agent::AwsUserAgent\"),\n            )\n\n        override fun section(section: ServiceConfig): Writable =\n            when (section) {\n                is ServiceConfig.BuilderImpl ->\n                    writable {\n                        rustTemplate(\n                            \"\"\"\n                            /// Sets the name of the app that is using the client.\n                            ///\n                            /// This _optional_ name is used to identify the application in the user agent that\n                            /// gets sent along with requests.\n                            pub fn app_name(mut self, app_name: #{AppName}) -> Self {\n                                self.set_app_name(Some(app_name));\n                                self\n                            }\n                            \"\"\",\n                            *codegenScope,\n                        )\n\n                        rustTemplate(\n                            \"\"\"\n                            /// Sets the name of the app that is using the client.\n                            ///\n                            /// This _optional_ name is used to identify the application in the user agent that\n                            /// gets sent along with requests.\n                            pub fn set_app_name(&mut self, app_name: #{Option}<#{AppName}>) -> &mut Self {\n                                self.config.store_or_unset(app_name);\n                                self\n                            }\n                            \"\"\",\n                            *codegenScope,\n                        )\n                    }\n\n                is ServiceConfig.BuilderFromConfigBag ->\n                    writable {\n                        rustTemplate(\"${section.builder}.set_app_name(${section.configBag}.load::<#{AppName}>().cloned());\", *codegenScope)\n                    }\n\n                is ServiceConfig.BuilderBuild ->\n                    writable {\n                        rust(\"layer.store_put(#T.clone());\", ClientRustModule.Meta.toType().resolve(\"API_METADATA\"))\n                    }\n\n                is ServiceConfig.ConfigImpl ->\n                    writable {\n                        rustTemplate(\n                            \"\"\"\n                            /// Returns the name of the app that is using the client, if it was provided.\n                            ///\n                            /// This _optional_ name is used to identify the application in the user agent that\n                            /// gets sent along with requests.\n                            pub fn app_name(&self) -> #{Option}<&#{AppName}> {\n                               self.config.load::<#{AppName}>()\n                            }\n                            \"\"\",\n                            *codegenScope,\n                        )\n                    }\n\n                is ServiceConfig.DefaultForTests ->\n                    writable {\n                        rustTemplate(\n                            \"\"\"\n                            self.config.store_put(#{AwsUserAgent}::for_tests());\n                            \"\"\",\n                            *codegenScope,\n                        )\n                    }\n\n                else -> emptySection\n            }\n    }\n}\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/main/kotlin/software/amazon/smithy/rustsdk/customize/AwsDisableStalledStreamProtection.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rustsdk.customize\n\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.ServiceShape\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.model.transform.ModelTransformer\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientRustSettings\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.client.smithy.transformers.DisableStalledStreamProtection\nimport software.amazon.smithy.rust.codegen.core.util.letIf\nimport java.util.logging.Logger\n\n/**\n * Disables stalled stream protection for specific operations.\n *\n * While a generic client-level decorator, `DisableStalledStreamProtection`, exists to handle this\n * at the model level, certain cases require operation-specific removal criteria that cannot be\n * generalized. (If we can fully generate the criteria, this class can be removed.)\n *\n * This class serves as a centralized solution for disabling stalled stream protection in such cases,\n * preventing the need for service-specific decorators solely for this purpose.\n */\nclass AwsDisableStalledStreamProtection : ClientCodegenDecorator {\n    // These long-running operations may have times with no data transfer,\n    // violating stalled stream protection.\n    private val operationsIncompatibleWithStalledStreamProtection =\n        setOf(\n            ShapeId.from(\"com.amazonaws.lambda#Invoke\"),\n            ShapeId.from(\"com.amazonaws.lambda#InvokeAsync\"),\n            ShapeId.from(\"com.amazonaws.s3#CopyObject\"),\n        )\n\n    override val name: String = \"AwsDisableStalledStreamProtection\"\n    override val order: Byte = 0\n    private val logger = Logger.getLogger(javaClass.name)\n\n    override fun transformModel(\n        service: ServiceShape,\n        model: Model,\n        settings: ClientRustSettings,\n    ): Model =\n        ModelTransformer.create().mapShapes(model) { shape ->\n            shape.letIf(operationsIncompatibleWithStalledStreamProtection.contains(shape.id)) {\n                logger.info(\"Adding IncompatibleWithStalledStreamProtection trait to $it\")\n                (DisableStalledStreamProtection::transformOperation)((it as OperationShape))\n            }\n        }\n}\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/main/kotlin/software/amazon/smithy/rustsdk/customize/DisabledAuthDecorator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rustsdk.customize\n\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.ServiceShape\nimport software.amazon.smithy.model.traits.OptionalAuthTrait\nimport software.amazon.smithy.model.transform.ModelTransformer\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientRustSettings\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.core.util.shapeId\n\n// / STS (and possibly other services) need to have auth manually set to []\nclass DisabledAuthDecorator : ClientCodegenDecorator {\n    override val name: String = \"OptionalAuth\"\n    override val order: Byte = 0\n\n    private val optionalAuth =\n        mapOf(\n            \"com.amazonaws.sts#AWSSecurityTokenServiceV20110615\".shapeId() to\n                setOf(\n                    \"com.amazonaws.sts#AssumeRoleWithSAML\".shapeId(),\n                    \"com.amazonaws.sts#AssumeRoleWithWebIdentity\".shapeId(),\n                ),\n        )\n\n    private fun applies(service: ServiceShape) = optionalAuth.containsKey(service.id)\n\n    override fun transformModel(\n        service: ServiceShape,\n        model: Model,\n        settings: ClientRustSettings,\n    ): Model {\n        if (!applies(service)) {\n            return model\n        }\n        val optionalOperations = optionalAuth[service.id]!!\n        return ModelTransformer.create().mapShapes(model) {\n            if (optionalOperations.contains(it.id) && it is OperationShape) {\n                it.toBuilder().addTrait(OptionalAuthTrait()).build()\n            } else {\n                it\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/main/kotlin/software/amazon/smithy/rustsdk/customize/EnvironmentTokenProviderDecorator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rustsdk.customize\n\nimport software.amazon.smithy.aws.traits.auth.SigV4Trait\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.auth.AuthDecorator\nimport software.amazon.smithy.rust.codegen.client.smithy.configReexport\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ConditionalDecorator\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.AdHocCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.adhocCustomization\nimport software.amazon.smithy.rust.codegen.core.util.dq\nimport software.amazon.smithy.rust.codegen.core.util.getTrait\nimport software.amazon.smithy.rust.codegen.core.util.toPascalCase\nimport software.amazon.smithy.rustsdk.AwsRuntimeType\nimport software.amazon.smithy.rustsdk.SdkConfigSection\nimport software.amazon.smithy.rustsdk.TokenProvidersDecorator\n\n/** Environment variable prefix for AWS bearer tokens */\nconst val AWS_BEARER_TOKEN = \"AWS_BEARER_TOKEN\"\n\n/**\n * A code generation decorator that adds support for service-specific environment variable-based\n * bearer token authentication.\n *\n * This decorator is relevant to AWS services whose SigV4 service signing name matches the input\n * to the decorator. It generates code that allows these services to automatically configure bearer\n * token authentication from service-specific environment variables.\n *\n * @param signingName The AWS service signing name used to match against SigV4 traits and construct\n *                    the environment variable name (e.g., \"bedrock\" -> AWS_BEARER_TOKEN_BEDROCK)\n */\nclass EnvironmentTokenProviderDecorator(signingName: String) : ConditionalDecorator(\n    predicate = { codegenContext, _ ->\n        codegenContext?.serviceShape?.getTrait<SigV4Trait>()?.name == signingName\n    },\n    delegateTo =\n        object : ClientCodegenDecorator {\n            override val name = \"${signingName.toPascalCase()}EnvironmentTokenProviderDecorator\"\n\n            // This decorator must decorate after `TokenProvidersDecorator` and `AuthDecorator`,\n            // so it injects code within `impl From<&SdkConfig> for Builder` like so\n            // ```\n            // impl From<&SdkConfig> for Builder {\n            //     fn from(input: &SdkConfig) -> Self {\n            //         let mut builder = Builder::default();\n            //         // --snip--\n            //         builder.set_auth_scheme_preference(input.auth_scheme_preference()); // by AuthDecorator\n            //         builder.set_token_provider(input.token_provider()); // by TokenProvidersDecorator\n            //         // --snip--\n            //         // auth scheme preference and token provider from service specific env\n            //         // should be set after the lines above to avoid incorrectly being overwritten\n            //     }\n            // }\n            // ```\n            override val order: Byte = (maxOf(TokenProvidersDecorator.ORDER, AuthDecorator.ORDER) + 1).toByte()\n\n            override fun extraSections(codegenContext: ClientCodegenContext): List<AdHocCustomization> {\n                val rc = codegenContext.runtimeConfig\n                val codegenScope =\n                    arrayOf(\n                        *preludeScope,\n                        \"AwsCredentialFeature\" to\n                            AwsRuntimeType.awsCredentialTypes(rc)\n                                .resolve(\"credential_feature::AwsCredentialFeature\"),\n                        \"HTTP_BEARER_AUTH_SCHEME_ID\" to\n                            CargoDependency.smithyRuntimeApiClient(rc)\n                                .withFeature(\"http-auth\").toType().resolve(\"client::auth::http\")\n                                .resolve(\"HTTP_BEARER_AUTH_SCHEME_ID\"),\n                        \"Identity\" to RuntimeType.smithyRuntimeApiClient(rc).resolve(\"client::identity::Identity\"),\n                        \"Layer\" to RuntimeType.smithyTypes(rc).resolve(\"config_bag::Layer\"),\n                        \"LoadServiceConfig\" to AwsRuntimeType.awsTypes(rc).resolve(\"service_config::LoadServiceConfig\"),\n                        \"Token\" to configReexport(AwsRuntimeType.awsCredentialTypes(rc).resolve(\"Token\")),\n                    )\n\n                return listOf(\n                    adhocCustomization<SdkConfigSection.CopySdkConfigToClientConfig> { _ ->\n                        rustTemplate(\n                            \"\"\"\n                            if let #{Some}(val) = input.service_config().and_then(|conf| {\n                                // Passing an empty string for the last argument of `service_config_key`,\n                                // since shared config/profile for environment token provider is not supported.\n                                #{LoadServiceConfig}::load_config(\n                                    conf,\n                                    service_config_key(${signingName.replace(\"-\", \" \").dq()}, ${AWS_BEARER_TOKEN.dq()}, \"\")\n                                )\n                                .and_then(|it| it.parse::<#{String}>().ok())\n                            }) {\n                                if !input.get_origin(\"auth_scheme_preference\").is_client_config() {\n                                    builder.set_auth_scheme_preference(#{Some}([#{HTTP_BEARER_AUTH_SCHEME_ID}].into()));\n                                }\n                                if !input.get_origin(\"token_provider\").is_client_config() {\n                                    let mut layer = #{Layer}::new(\"AwsBearerToken${signingName.toPascalCase()}\");\n                                    layer.store_append(#{AwsCredentialFeature}::BearerServiceEnvVars);\n                                    let identity = #{Identity}::builder()\n                                        .data(#{Token}::new(val, #{None}))\n                                        .property(layer.freeze())\n                                        .build()\n                                        .expect(\"required fields set\");\n                                    builder.runtime_components.set_identity_resolver(#{HTTP_BEARER_AUTH_SCHEME_ID}, identity);\n                                }\n                            }\n                            \"\"\",\n                            *codegenScope,\n                        )\n                    },\n                )\n            }\n        },\n)\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/main/kotlin/software/amazon/smithy/rustsdk/customize/IsTruncatedPaginatorDecorator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rustsdk.customize\n\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.ServiceShape\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.transform.ModelTransformer\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientRustSettings\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.client.smithy.traits.IsTruncatedPaginatorTrait\nimport software.amazon.smithy.rust.codegen.core.util.letIf\nimport java.util.logging.Logger\n\n/**\n * Decorator for adding isTruncatedPaginator trait\n */\nclass IsTruncatedPaginatorDecorator : ClientCodegenDecorator {\n    override val name: String = \"IsTruncatedPaginatorDecorator\"\n    override val order: Byte = 0\n    private val logger: Logger = Logger.getLogger(javaClass.name)\n    private val operationsWithIsTruncatedPaginator = setOf(ShapeId.from(\"com.amazonaws.s3#ListPartsOutput\"))\n\n    override fun transformModel(\n        service: ServiceShape,\n        model: Model,\n        settings: ClientRustSettings,\n    ): Model =\n        ModelTransformer.create().mapShapes(model) { shape ->\n            shape.letIf(isInIsTruncatedList(shape)) {\n                logger.info(\"Adding IsTruncatedPaginator trait to $it\")\n                (it as StructureShape).toBuilder().addTrait(IsTruncatedPaginatorTrait()).build()\n            }\n        }\n\n    private fun isInIsTruncatedList(shape: Shape): Boolean {\n        return shape.isStructureShape && operationsWithIsTruncatedPaginator.contains(shape.id)\n    }\n}\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/main/kotlin/software/amazon/smithy/rustsdk/customize/RemoveDefaults.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rustsdk.customize\n\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.AbstractShapeBuilder\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.model.traits.DefaultTrait\nimport software.amazon.smithy.model.transform.ModelTransformer\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\nimport software.amazon.smithy.rust.codegen.core.util.letIf\nimport software.amazon.smithy.utils.ToSmithyBuilder\nimport java.util.logging.Logger\n\n/**\n * Removes default values from specified root shapes, and any members that target those\n * root shapes.\n */\nobject RemoveDefaults {\n    private val logger: Logger = Logger.getLogger(javaClass.name)\n\n    fun processModel(\n        model: Model,\n        removeDefaultsFrom: Set<ShapeId>,\n    ): Model {\n        val removedRootDefaults: MutableSet<ShapeId> = HashSet()\n        val removedRootDefaultsModel =\n            ModelTransformer.create().mapShapes(model) { shape ->\n                shape.letIf(shouldRemoveRootDefault(shape, removeDefaultsFrom)) {\n                    logger.info(\"Removing default trait from root $shape\")\n                    removedRootDefaults.add(shape.id)\n                    removeDefault(shape)\n                }\n            }\n\n        return ModelTransformer.create().mapShapes(removedRootDefaultsModel) { shape ->\n            shape.letIf(shouldRemoveMemberDefault(shape, removedRootDefaults, removeDefaultsFrom)) {\n                logger.info(\"Removing default trait from member $shape\")\n                removeDefault(shape)\n            }\n        }\n    }\n\n    private fun shouldRemoveRootDefault(\n        shape: Shape,\n        removeDefaultsFrom: Set<ShapeId>,\n    ): Boolean {\n        return shape !is MemberShape && removeDefaultsFrom.contains(shape.id) && shape.hasTrait<DefaultTrait>()\n    }\n\n    private fun shouldRemoveMemberDefault(\n        shape: Shape,\n        removedRootDefaults: Set<ShapeId>,\n        removeDefaultsFrom: Set<ShapeId>,\n    ): Boolean {\n        return shape is MemberShape &&\n            // Check the original set of shapes to remove for this shape id, to remove members that were in that set.\n            (removedRootDefaults.contains(shape.target) || removeDefaultsFrom.contains(shape.id)) &&\n            shape.hasTrait<DefaultTrait>()\n    }\n\n    private fun removeDefault(shape: Shape): Shape {\n        return ((shape as ToSmithyBuilder<*>).toBuilder() as AbstractShapeBuilder<*, *>)\n            .removeTrait(DefaultTrait.ID)\n            .build()\n    }\n}\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/main/kotlin/software/amazon/smithy/rustsdk/customize/RemoveDefaultsDecorator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rustsdk.customize\n\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.ServiceShape\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientRustSettings\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.core.util.shapeId\nimport java.util.logging.Logger\n\n/**\n * Removes default values from certain shapes, and any member that targets those shapes,\n * for some services where the default value causes serialization issues, validation\n * issues, or other unexpected behavior.\n */\nclass RemoveDefaultsDecorator : ClientCodegenDecorator {\n    override val name: String = \"RemoveDefaults\"\n    override val order: Byte = 0\n    private val logger: Logger = Logger.getLogger(javaClass.name)\n\n    // Service shape id -> Shape id of each root shape to remove the default from.\n    // TODO(https://github.com/smithy-lang/smithy-rs/issues/3220): Remove this customization after model updates.\n    private val removeDefaults: Map<ShapeId, Set<ShapeId>> =\n        mapOf(\n            \"com.amazonaws.amplifyuibuilder#AmplifyUIBuilder\" to\n                setOf(\n                    \"com.amazonaws.amplifyuibuilder#ListComponentsLimit\",\n                    \"com.amazonaws.amplifyuibuilder#ListFormsLimit\",\n                    \"com.amazonaws.amplifyuibuilder#ListThemesLimit\",\n                ),\n            \"com.amazonaws.drs#ElasticDisasterRecoveryService\" to\n                setOf(\n                    \"com.amazonaws.drs#Validity\",\n                    \"com.amazonaws.drs#CostOptimizationConfiguration\\$burstBalanceThreshold\",\n                    \"com.amazonaws.drs#CostOptimizationConfiguration\\$burstBalanceDeltaThreshold\",\n                    \"com.amazonaws.drs.synthetic#ListStagingAccountsInput\\$maxResults\",\n                    \"com.amazonaws.drs#StrictlyPositiveInteger\",\n                    \"com.amazonaws.drs#MaxResultsType\",\n                    \"com.amazonaws.drs#MaxResultsReplicatingSourceServers\",\n                    \"com.amazonaws.drs#LaunchActionOrder\",\n                ),\n            \"com.amazonaws.evidently#Evidently\" to\n                setOf(\n                    \"com.amazonaws.evidently#ResultsPeriod\",\n                ),\n            \"com.amazonaws.location#LocationService\" to\n                setOf(\n                    \"com.amazonaws.location.synthetic#ListPlaceIndexesInput\\$MaxResults\",\n                    \"com.amazonaws.location.synthetic#SearchPlaceIndexForSuggestionsInput\\$MaxResults\",\n                    \"com.amazonaws.location#PlaceIndexSearchResultLimit\",\n                ),\n            \"com.amazonaws.paymentcryptographydata#PaymentCryptographyDataPlane\" to\n                setOf(\n                    \"com.amazonaws.paymentcryptographydata#IntegerRangeBetween4And12\",\n                ),\n            \"com.amazonaws.emrserverless#AwsToledoWebService\" to\n                setOf(\n                    \"com.amazonaws.emrserverless#WorkerCounts\",\n                ),\n            \"com.amazonaws.s3control#AWSS3ControlServiceV20180820\" to\n                setOf(\n                    \"com.amazonaws.s3control#PublicAccessBlockConfiguration\\$BlockPublicAcls\",\n                    \"com.amazonaws.s3control#PublicAccessBlockConfiguration\\$IgnorePublicAcls\",\n                    \"com.amazonaws.s3control#PublicAccessBlockConfiguration\\$BlockPublicPolicy\",\n                    \"com.amazonaws.s3control#PublicAccessBlockConfiguration\\$RestrictPublicBuckets\",\n                ),\n            \"com.amazonaws.iot#AWSIotService\" to\n                setOf(\n                    \"com.amazonaws.iot#ThingConnectivity\\$connected\",\n                    \"com.amazonaws.iot.synthetic#UpdateProvisioningTemplateInput\\$enabled\",\n                    \"com.amazonaws.iot.synthetic#CreateProvisioningTemplateInput\\$enabled\",\n                    \"com.amazonaws.iot.synthetic#DescribeProvisioningTemplateOutput\\$enabled\",\n                    \"com.amazonaws.iot.synthetic#DescribeProvisioningTemplateOutput\\$enabled\",\n                    \"com.amazonaws.iot#ProvisioningTemplateSummary\\$enabled\",\n                ),\n        ).map { (k, v) -> k.shapeId() to v.map { it.shapeId() }.toSet() }.toMap()\n\n    private fun applies(service: ServiceShape) = removeDefaults.containsKey(service.id)\n\n    override fun transformModel(\n        service: ServiceShape,\n        model: Model,\n        settings: ClientRustSettings,\n    ): Model {\n        if (!applies(service)) {\n            return model\n        }\n        logger.info(\"Removing invalid defaults from ${service.id}\")\n        return RemoveDefaults.processModel(model, removeDefaults[service.id]!!)\n    }\n}\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/main/kotlin/software/amazon/smithy/rustsdk/customize/ServiceSpecificDecorator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rustsdk.customize\n\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ConditionalDecorator\n\n/** Only apply this decorator to the given service ID */\nfun ClientCodegenDecorator.onlyApplyTo(serviceId: String): List<ClientCodegenDecorator> =\n    listOf(\n        ConditionalDecorator(this) { _, serviceShapeId ->\n            serviceShapeId == ShapeId.from(serviceId)\n        },\n    )\n\n/** Only apply this decorator to the given list of service IDs */\nfun ClientCodegenDecorator.onlyApplyToList(serviceIds: List<String>): List<ClientCodegenDecorator> =\n    serviceIds.map {\n        ConditionalDecorator(this) { _, serviceShapeId ->\n            serviceShapeId == ShapeId.from(it)\n        }\n    }\n\n/** Apply this decorator to all services but the one identified by ID */\nfun ClientCodegenDecorator.applyExceptFor(serviceId: String): List<ClientCodegenDecorator> =\n    listOf(\n        ConditionalDecorator(this) { _, serviceShapeId ->\n            serviceShapeId != ShapeId.from(serviceId)\n        },\n    )\n\n/** Apply the given decorators only to this service ID */\nfun String.applyDecorators(vararg decorators: ClientCodegenDecorator): List<ClientCodegenDecorator> =\n    decorators.map { it.onlyApplyTo(this) }.flatten()\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/main/kotlin/software/amazon/smithy/rustsdk/customize/Sigv4aAuthTraitBackfillDecorator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rustsdk.customize\n\nimport software.amazon.smithy.aws.traits.ServiceTrait\nimport software.amazon.smithy.aws.traits.auth.SigV4ATrait\nimport software.amazon.smithy.aws.traits.auth.SigV4Trait\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.ServiceShape\nimport software.amazon.smithy.model.traits.AuthTrait\nimport software.amazon.smithy.model.transform.ModelTransformer\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientRustSettings\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.core.util.getTrait\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\nimport software.amazon.smithy.rust.codegen.core.util.sdkId\nimport software.amazon.smithy.rustsdk.SigV4AuthDecorator\n\nclass Sigv4aAuthTraitBackfillDecorator : ClientCodegenDecorator {\n    private val needsSigv4aBackfill =\n        setOf(\n            \"CloudFront KeyValueStore\",\n            \"EventBridge\",\n            \"S3\",\n            \"SESv2\",\n        )\n\n    override val name: String get() = \"Sigv4aAuthTraitBackfill\"\n\n    // This decorator must decorate before SigV4AuthDecorator so the model transformer of this class runs first\n    override val order: Byte = (SigV4AuthDecorator.ORDER + 1).toByte()\n\n    override fun transformModel(\n        service: ServiceShape,\n        model: Model,\n        settings: ClientRustSettings,\n    ): Model {\n        if (!applies(service)) {\n            return model\n        }\n\n        return ModelTransformer.create().mapShapes(model) { shape ->\n            when (shape.isServiceShape) {\n                true -> {\n                    val builder = (shape as ServiceShape).toBuilder()\n\n                    if (!shape.hasTrait<SigV4ATrait>()) {\n                        builder.addTrait(\n                            SigV4ATrait.builder()\n                                .name(\n                                    shape.getTrait<SigV4Trait>()?.name\n                                        ?: shape.getTrait<ServiceTrait>()?.arnNamespace,\n                                )\n                                .build(),\n                        )\n                    }\n\n                    // SigV4A is appended at the end because these services implement SigV4A\n                    // through endpoint-specific rules rather than the service shape.\n                    // To ensure correct prioritization, it's safest to add it last,\n                    // letting the endpoint rules take precedence as needed.\n                    val authTrait =\n                        shape.getTrait<AuthTrait>()?.let {\n                            if (it.valueSet.contains(SigV4ATrait.ID)) {\n                                it\n                            } else {\n                                AuthTrait(it.valueSet + mutableSetOf(SigV4ATrait.ID))\n                            }\n                        } ?: AuthTrait(mutableSetOf(SigV4Trait.ID, SigV4ATrait.ID))\n                    builder.addTrait(authTrait)\n\n                    builder.build()\n                }\n\n                false -> {\n                    shape\n                }\n            }\n        }\n    }\n\n    private fun applies(service: ServiceShape) = needsSigv4aBackfill.contains(service.sdkId())\n}\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/main/kotlin/software/amazon/smithy/rustsdk/customize/apigateway/ApiGatewayDecorator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rustsdk.customize.apigateway\n\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginSection\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rustsdk.InlineAwsDependency\n\nclass ApiGatewayDecorator : ClientCodegenDecorator {\n    override val name: String = \"ApiGateway\"\n    override val order: Byte = 0\n\n    override fun serviceRuntimePluginCustomizations(\n        codegenContext: ClientCodegenContext,\n        baseCustomizations: List<ServiceRuntimePluginCustomization>,\n    ): List<ServiceRuntimePluginCustomization> =\n        baseCustomizations + ApiGatewayAcceptHeaderInterceptorCustomization(codegenContext)\n}\n\nprivate class ApiGatewayAcceptHeaderInterceptorCustomization(private val codegenContext: ClientCodegenContext) :\n    ServiceRuntimePluginCustomization() {\n    override fun section(section: ServiceRuntimePluginSection): Writable =\n        writable {\n            if (section is ServiceRuntimePluginSection.RegisterRuntimeComponents) {\n                section.registerPermanentInterceptor(codegenContext.runtimeConfig, this) {\n                    rustTemplate(\n                        \"#{Interceptor}::default()\",\n                        \"Interceptor\" to\n                            RuntimeType.forInlineDependency(\n                                InlineAwsDependency.forRustFile(\n                                    \"apigateway_interceptors\",\n                                    additionalDependency =\n                                        arrayOf(\n                                            CargoDependency.smithyRuntimeApiClient(codegenContext.runtimeConfig),\n                                            CargoDependency.Http1x,\n                                        ),\n                                ),\n                            ).resolve(\"AcceptHeaderInterceptor\"),\n                    )\n                }\n            }\n        }\n}\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/main/kotlin/software/amazon/smithy/rustsdk/customize/dsql/DsqlDecorator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\npackage software.amazon.smithy.rustsdk.customize.dsql\n\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.Visibility\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RustCrate\nimport software.amazon.smithy.rustsdk.AwsCargoDependency\nimport software.amazon.smithy.rustsdk.InlineAwsDependency\n\nclass DsqlDecorator : ClientCodegenDecorator {\n    override val name: String = \"DSQL\"\n    override val order: Byte = 0\n\n    override fun extras(\n        codegenContext: ClientCodegenContext,\n        rustCrate: RustCrate,\n    ) {\n        val rc = codegenContext.runtimeConfig\n\n        rustCrate.lib {\n            // We should have a better way of including an inline dependency.\n            rust(\n                \"// include #T;\",\n                RuntimeType.forInlineDependency(\n                    InlineAwsDependency.forRustFileAs(\n                        \"dsql_auth_token\",\n                        \"auth_token\",\n                        Visibility.PUBLIC,\n                        AwsCargoDependency.awsSigv4(rc),\n                        CargoDependency.smithyRuntimeApiClient(rc),\n                        CargoDependency.smithyAsync(rc).toDevDependency().withFeature(\"test-util\"),\n                        CargoDependency.Url,\n                    ),\n                ),\n            )\n        }\n    }\n}\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/main/kotlin/software/amazon/smithy/rustsdk/customize/ec2/BoxPrimitiveShapes.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rustsdk.customize.ec2\n\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.AbstractShapeBuilder\nimport software.amazon.smithy.model.shapes.BigDecimalShape\nimport software.amazon.smithy.model.shapes.BigIntegerShape\nimport software.amazon.smithy.model.shapes.BooleanShape\nimport software.amazon.smithy.model.shapes.ByteShape\nimport software.amazon.smithy.model.shapes.DoubleShape\nimport software.amazon.smithy.model.shapes.FloatShape\nimport software.amazon.smithy.model.shapes.IntegerShape\nimport software.amazon.smithy.model.shapes.LongShape\nimport software.amazon.smithy.model.shapes.NumberShape\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.shapes.ShortShape\nimport software.amazon.smithy.model.traits.BoxTrait\nimport software.amazon.smithy.model.transform.ModelTransformer\nimport software.amazon.smithy.rust.codegen.core.util.UNREACHABLE\nimport software.amazon.smithy.utils.ToSmithyBuilder\n\nobject BoxPrimitiveShapes {\n    fun processModel(model: Model): Model {\n        val transformer = ModelTransformer.create()\n        return transformer.mapShapes(model, ::boxPrimitives)\n    }\n\n    private fun boxPrimitives(shape: Shape): Shape {\n        return when (shape) {\n            is NumberShape -> {\n                when (shape) {\n                    is ByteShape -> box(shape)\n                    is DoubleShape -> box(shape)\n                    is LongShape -> box(shape)\n                    is ShortShape -> box(shape)\n                    is FloatShape -> box(shape)\n                    is BigDecimalShape -> box(shape)\n                    is BigIntegerShape -> box(shape)\n                    is IntegerShape -> box(shape)\n                    else -> UNREACHABLE(\"unhandled numeric shape: $shape\")\n                }\n            }\n            is BooleanShape -> box(shape)\n            else -> shape\n        }\n    }\n\n    private fun <T> box(shape: T): Shape where T : Shape, T : ToSmithyBuilder<T> {\n        return (shape.toBuilder() as AbstractShapeBuilder<*, T>).addTrait(BoxTrait()).build()\n    }\n}\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/main/kotlin/software/amazon/smithy/rustsdk/customize/ec2/EC2MakePrimitivesOptional.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rustsdk.customize.ec2\n\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.traits.ClientOptionalTrait\nimport software.amazon.smithy.model.transform.ModelTransformer\n\nobject EC2MakePrimitivesOptional {\n    fun processModel(model: Model): Model {\n        val updates = arrayListOf<Shape>()\n        for (struct in model.structureShapes) {\n            for (member in struct.allMembers.values) {\n                updates.add(member.toBuilder().addTrait(ClientOptionalTrait()).build())\n            }\n        }\n        return ModelTransformer.create().replaceShapes(model, updates)\n    }\n}\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/main/kotlin/software/amazon/smithy/rustsdk/customize/ec2/Ec2Decorator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rustsdk.customize.ec2\n\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.ServiceShape\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientRustSettings\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator\n\nclass Ec2Decorator : ClientCodegenDecorator {\n    override val name: String = \"Ec2\"\n    override val order: Byte = 0\n\n    // EC2 incorrectly models primitive shapes as unboxed when they actually\n    // need to be boxed for the API to work properly\n    override fun transformModel(\n        service: ServiceShape,\n        model: Model,\n        settings: ClientRustSettings,\n    ): Model = EC2MakePrimitivesOptional.processModel(model)\n}\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/main/kotlin/software/amazon/smithy/rustsdk/customize/glacier/GlacierDecorator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rustsdk.customize.glacier\n\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.OperationSection\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginSection\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.StructureCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.StructureSection\nimport software.amazon.smithy.rust.codegen.core.smithy.traits.SyntheticInputTrait\nimport software.amazon.smithy.rust.codegen.core.util.dq\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\nimport software.amazon.smithy.rustsdk.AwsCargoDependency\nimport software.amazon.smithy.rustsdk.InlineAwsDependency\n\n/**\n * Glacier has three required customizations:\n *\n * 1. Add the `x-amz-glacier-version` header to all requests\n * 2. For operations with an `account_id` field, autofill that field with `-` if it is not set by the customer.\n *    This is required because the account ID is sent across as part of the URL, and `-` has been pre-established\n *    \"no account ID\" in the Glacier service.\n * 3. The `UploadArchive` and `UploadMultipartPart` operations require tree hash headers to be\n *    calculated and added to the request.\n *\n * This decorator wires up these three customizations.\n */\nclass GlacierDecorator : ClientCodegenDecorator {\n    override val name: String = \"Glacier\"\n    override val order: Byte = 0\n\n    override fun operationCustomizations(\n        codegenContext: ClientCodegenContext,\n        operation: OperationShape,\n        baseCustomizations: List<OperationCustomization>,\n    ): List<OperationCustomization> = baseCustomizations + GlacierOperationInterceptorsCustomization(codegenContext)\n\n    override fun structureCustomizations(\n        codegenContext: ClientCodegenContext,\n        baseCustomizations: List<StructureCustomization>,\n    ): List<StructureCustomization> = baseCustomizations + GlacierAccountIdCustomization(codegenContext)\n\n    override fun serviceRuntimePluginCustomizations(\n        codegenContext: ClientCodegenContext,\n        baseCustomizations: List<ServiceRuntimePluginCustomization>,\n    ): List<ServiceRuntimePluginCustomization> = baseCustomizations + GlacierApiVersionCustomization(codegenContext)\n}\n\n/** Implements the `GlacierAccountId` trait for inputs that have an `account_id` field */\nprivate class GlacierAccountIdCustomization(private val codegenContext: ClientCodegenContext) :\n    StructureCustomization() {\n    override fun section(section: StructureSection): Writable =\n        writable {\n            if (section is StructureSection.AdditionalTraitImpls && section.shape.inputWithAccountId()) {\n                val inlineModule = inlineModule(codegenContext.runtimeConfig)\n                rustTemplate(\n                    \"\"\"\n                    impl #{GlacierAccountId} for ${section.structName} {\n                        fn account_id_mut(&mut self) -> &mut Option<String> {\n                            &mut self.account_id\n                        }\n                    }\n                    \"\"\",\n                    \"GlacierAccountId\" to inlineModule.resolve(\"GlacierAccountId\"),\n                )\n            }\n        }\n}\n\n/** Adds the `x-amz-glacier-version` header to all requests */\nprivate class GlacierApiVersionCustomization(private val codegenContext: ClientCodegenContext) :\n    ServiceRuntimePluginCustomization() {\n    override fun section(section: ServiceRuntimePluginSection): Writable =\n        writable {\n            if (section is ServiceRuntimePluginSection.RegisterRuntimeComponents) {\n                val apiVersion = codegenContext.serviceShape.version\n                section.registerPermanentInterceptor(codegenContext.runtimeConfig, this) {\n                    rustTemplate(\n                        \"#{Interceptor}::new(${apiVersion.dq()})\",\n                        \"Interceptor\" to inlineModule(codegenContext.runtimeConfig).resolve(\"GlacierApiVersionInterceptor\"),\n                    )\n                }\n            }\n        }\n}\n\n/**\n * Adds two interceptors:\n * 1. `GlacierAccountIdAutofillInterceptor`: Uses the `GlacierAccountId` trait to correctly autofill the account ID field\n * 2. `GlacierSetPrecomputedSignableBodyInterceptor`: Reuses the tree hash computation during signing rather than allowing\n *    the `aws-sigv4` module to recalculate the payload hash.\n */\nprivate class GlacierOperationInterceptorsCustomization(private val codegenContext: ClientCodegenContext) :\n    OperationCustomization() {\n    override fun section(section: OperationSection): Writable =\n        writable {\n            if (section is OperationSection.AdditionalInterceptors) {\n                val inputShape = codegenContext.model.expectShape(section.operationShape.inputShape) as StructureShape\n                val inlineModule = inlineModule(codegenContext.runtimeConfig)\n                if (inputShape.inputWithAccountId()) {\n                    section.registerPermanentInterceptor(codegenContext.runtimeConfig, this) {\n                        rustTemplate(\n                            \"#{Interceptor}::<#{Input}>::new()\",\n                            \"Interceptor\" to inlineModule.resolve(\"GlacierAccountIdAutofillInterceptor\"),\n                            \"Input\" to codegenContext.symbolProvider.toSymbol(inputShape),\n                        )\n                    }\n                }\n                if (section.operationShape.requiresTreeHashHeader()) {\n                    section.registerPermanentInterceptor(codegenContext.runtimeConfig, this) {\n                        rustTemplate(\n                            \"#{Interceptor}::default()\",\n                            \"Interceptor\" to inlineModule.resolve(\"GlacierTreeHashHeaderInterceptor\"),\n                        )\n                    }\n                }\n            }\n        }\n}\n\n/** True when the operation requires tree hash headers */\nprivate fun OperationShape.requiresTreeHashHeader(): Boolean =\n    id == ShapeId.from(\"com.amazonaws.glacier#UploadArchive\") ||\n        id == ShapeId.from(\"com.amazonaws.glacier#UploadMultipartPart\")\n\nprivate fun StructureShape.inputWithAccountId(): Boolean =\n    hasTrait<SyntheticInputTrait>() && members().any { it.memberName.lowercase() == \"accountid\" }\n\nprivate fun inlineModule(runtimeConfig: RuntimeConfig) =\n    RuntimeType.forInlineDependency(\n        InlineAwsDependency.forRustFile(\n            \"glacier_interceptors\",\n            additionalDependency = glacierInterceptorDependencies(runtimeConfig).toTypedArray(),\n        ),\n    )\n\nprivate fun glacierInterceptorDependencies(runtimeConfig: RuntimeConfig) =\n    listOf(\n        AwsCargoDependency.awsRuntime(runtimeConfig),\n        AwsCargoDependency.awsSigv4(runtimeConfig),\n        CargoDependency.Bytes,\n        CargoDependency.Hex,\n        CargoDependency.Ring,\n        CargoDependency.smithyHttp(runtimeConfig),\n        CargoDependency.smithyRuntimeApiClient(runtimeConfig),\n        CargoDependency.Http1x,\n    )\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/main/kotlin/software/amazon/smithy/rustsdk/customize/rds/RdsDecorator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\npackage software.amazon.smithy.rustsdk.customize.rds\n\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.Visibility\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RustCrate\nimport software.amazon.smithy.rustsdk.AwsCargoDependency\nimport software.amazon.smithy.rustsdk.InlineAwsDependency\n\nclass RdsDecorator : ClientCodegenDecorator {\n    override val name: String = \"RDS\"\n    override val order: Byte = 0\n\n    override fun extras(\n        codegenContext: ClientCodegenContext,\n        rustCrate: RustCrate,\n    ) {\n        val rc = codegenContext.runtimeConfig\n\n        rustCrate.lib {\n            // We should have a better way of including an inline dependency.\n            rust(\n                \"// include #T;\",\n                RuntimeType.forInlineDependency(\n                    InlineAwsDependency.forRustFileAs(\n                        \"rds_auth_token\",\n                        \"auth_token\",\n                        Visibility.PUBLIC,\n                        AwsCargoDependency.awsSigv4(rc),\n                        CargoDependency.smithyRuntimeApiClient(rc),\n                        CargoDependency.smithyAsync(rc).toDevDependency().withFeature(\"test-util\"),\n                        CargoDependency.Url,\n                    ),\n                ),\n            )\n        }\n    }\n}\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/main/kotlin/software/amazon/smithy/rustsdk/customize/route53/Route53Decorator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\npackage software.amazon.smithy.rustsdk.customize.route53\n\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.ServiceShape\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.traits.HttpLabelTrait\nimport software.amazon.smithy.model.transform.ModelTransformer\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientRustSettings\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.OperationSection\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\nimport software.amazon.smithy.rust.codegen.core.util.inputShape\nimport software.amazon.smithy.rust.codegen.core.util.letIf\nimport software.amazon.smithy.rustsdk.InlineAwsDependency\nimport java.util.logging.Logger\n\nclass Route53Decorator : ClientCodegenDecorator {\n    override val name: String = \"Route53\"\n    override val order: Byte = 0\n    private val logger: Logger = Logger.getLogger(javaClass.name)\n    private val resourceShapes =\n        setOf(ShapeId.from(\"com.amazonaws.route53#ResourceId\"), ShapeId.from(\"com.amazonaws.route53#ChangeId\"))\n\n    override fun transformModel(\n        service: ServiceShape,\n        model: Model,\n        settings: ClientRustSettings,\n    ): Model =\n        ModelTransformer.create().mapShapes(model) { shape ->\n            shape.letIf(isResourceId(shape)) {\n                logger.info(\"Adding TrimResourceId trait to $shape\")\n                (shape as MemberShape).toBuilder().addTrait(TrimResourceId()).build()\n            }\n        }\n\n    override fun operationCustomizations(\n        codegenContext: ClientCodegenContext,\n        operation: OperationShape,\n        baseCustomizations: List<OperationCustomization>,\n    ): List<OperationCustomization> {\n        val inputShape = operation.inputShape(codegenContext.model)\n        val hostedZoneMember = inputShape.members().find { it.hasTrait<TrimResourceId>() }\n        return if (hostedZoneMember != null) {\n            baseCustomizations +\n                TrimResourceIdCustomization(\n                    codegenContext,\n                    inputShape,\n                    codegenContext.symbolProvider.toMemberName(hostedZoneMember),\n                )\n        } else {\n            baseCustomizations\n        }\n    }\n\n    private fun isResourceId(shape: Shape): Boolean {\n        return (shape is MemberShape && resourceShapes.contains(shape.target)) && shape.hasTrait<HttpLabelTrait>()\n    }\n}\n\nclass TrimResourceIdCustomization(\n    private val codegenContext: ClientCodegenContext,\n    private val inputShape: StructureShape,\n    private val fieldName: String,\n) : OperationCustomization() {\n    override fun section(section: OperationSection): Writable =\n        writable {\n            when (section) {\n                is OperationSection.AdditionalInterceptors -> {\n                    section.registerPermanentInterceptor(codegenContext.runtimeConfig, this) {\n                        val smithyRuntimeApi = RuntimeType.smithyRuntimeApiClient(codegenContext.runtimeConfig)\n                        val interceptor =\n                            RuntimeType.forInlineDependency(\n                                InlineAwsDependency.forRustFile(\"route53_resource_id_preprocessor\"),\n                            ).resolve(\"Route53ResourceIdInterceptor\")\n                        rustTemplate(\n                            \"\"\"\n                            #{Route53ResourceIdInterceptor}::new(|input: &mut #{Input}| {\n                                &mut input.$fieldName\n                            })\n                            \"\"\",\n                            \"Input\" to codegenContext.symbolProvider.toSymbol(inputShape),\n                            \"Route53ResourceIdInterceptor\" to interceptor,\n                            \"SharedInterceptor\" to smithyRuntimeApi.resolve(\"client::interceptors::SharedInterceptor\"),\n                        )\n                    }\n                }\n                else -> {}\n            }\n        }\n}\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/main/kotlin/software/amazon/smithy/rustsdk/customize/route53/TrimResourceId.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rustsdk.customize.route53\n\nimport software.amazon.smithy.model.node.Node\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.model.traits.AnnotationTrait\n\n/**\n * Indicates that a member should have their resource ID prefix stripped\n */\nclass TrimResourceId : AnnotationTrait(ID, Node.objectNode()) {\n    companion object {\n        val ID: ShapeId = ShapeId.from(\"aws.api.internal#trimResourceId\")\n    }\n}\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/main/kotlin/software/amazon/smithy/rustsdk/customize/s3/MakeS3BoolsAndNumbersOptional.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rustsdk.customize.s3\n\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.AbstractShapeBuilder\nimport software.amazon.smithy.model.shapes.BooleanShape\nimport software.amazon.smithy.model.shapes.NumberShape\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.traits.DefaultTrait\nimport software.amazon.smithy.model.transform.ModelTransformer\n\n/**\n * The s3 model is being updated but if we consume that model update, then we'll run into an issue with examples compilation\n *\n * This \"pre-updates\" the model so we can fix examples without requiring complex coordination\n */\nclass MakeS3BoolsAndNumbersOptional {\n    fun processModel(model: Model): Model {\n        val updates = arrayListOf<Shape>()\n        for (struct in model.structureShapes) {\n            for (member in struct.allMembers.values) {\n                val target = model.expectShape(member.target)\n                val boolTarget = target as? BooleanShape\n                val numberTarget = target as? NumberShape\n                if (boolTarget != null || numberTarget != null) {\n                    updates.add(member.toBuilder().removeTrait(DefaultTrait.ID).build())\n                    val builder: AbstractShapeBuilder<*, *> = Shape.shapeToBuilder(target)\n                    updates.add(builder.removeTrait(DefaultTrait.ID).build())\n                }\n            }\n        }\n        return ModelTransformer.create().replaceShapes(model, updates)\n    }\n}\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/main/kotlin/software/amazon/smithy/rustsdk/customize/s3/S3Decorator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rustsdk.customize.s3\n\nimport software.amazon.smithy.aws.traits.protocols.RestXmlTrait\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.node.Node\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.ServiceShape\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.transform.ModelTransformer\nimport software.amazon.smithy.rulesengine.traits.EndpointTestCase\nimport software.amazon.smithy.rulesengine.traits.EndpointTestOperationInput\nimport software.amazon.smithy.rulesengine.traits.EndpointTestsTrait\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientRustSettings\nimport software.amazon.smithy.rust.codegen.client.smithy.customizations.SyntheticNoAuthTrait\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.client.smithy.endpoint.EndpointCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.endpoint.rustName\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.OperationGenerator\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.OperationSection\nimport software.amazon.smithy.rust.codegen.client.smithy.protocols.ClientRestXmlFactory\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlockTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenContext\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.ProtocolFunctions\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.ProtocolMap\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.RestXml\nimport software.amazon.smithy.rust.codegen.core.smithy.traits.AllowInvalidXmlRoot\nimport software.amazon.smithy.rust.codegen.core.util.letIf\nimport software.amazon.smithy.rustsdk.AwsRuntimeType\nimport software.amazon.smithy.rustsdk.getBuiltIn\nimport software.amazon.smithy.rustsdk.toWritable\nimport java.util.logging.Logger\n\n/**\n * Top level decorator for S3\n */\nclass S3Decorator : ClientCodegenDecorator {\n    override val name: String = \"S3\"\n    override val order: Byte = 0\n    private val logger: Logger = Logger.getLogger(javaClass.name)\n    private val invalidXmlRootAllowList =\n        setOf(\n            // To work around https://github.com/awslabs/aws-sdk-rust/issues/991\n            ShapeId.from(\"com.amazonaws.s3#CreateSessionOutput\"),\n            // API returns GetObjectAttributes_Response_ instead of Output\n            ShapeId.from(\"com.amazonaws.s3#GetObjectAttributesOutput\"),\n            // API returns ListAllMyDirectoryBucketsResult instead of ListDirectoryBucketsOutput\n            ShapeId.from(\"com.amazonaws.s3#ListDirectoryBucketsOutput\"),\n        )\n\n    override fun protocols(\n        serviceId: ShapeId,\n        currentProtocols: ProtocolMap<OperationGenerator, ClientCodegenContext>,\n    ): ProtocolMap<OperationGenerator, ClientCodegenContext> =\n        currentProtocols +\n            mapOf(\n                RestXmlTrait.ID to\n                    ClientRestXmlFactory { protocolConfig ->\n                        S3ProtocolOverride(protocolConfig)\n                    },\n            )\n\n    override fun transformModel(\n        service: ServiceShape,\n        model: Model,\n        settings: ClientRustSettings,\n    ): Model =\n        ModelTransformer.create().mapShapes(model) { shape ->\n            shape.letIf(isInInvalidXmlRootAllowList(shape)) {\n                logger.info(\"Adding AllowInvalidXmlRoot trait to $it\")\n                (it as StructureShape).toBuilder().addTrait(AllowInvalidXmlRoot()).build()\n            }\n        }\n            // the model has the bucket in the path\n            .let(StripBucketFromHttpPath()::transform)\n            // the tests in EP2 are incorrect and are missing request route\n            .let(\n                FilterEndpointTests(\n                    operationInputFilter = { input ->\n                        when (input.operationName) {\n                            // it's impossible to express HostPrefix behavior in the current EP2 rules schema :-/\n                            // A handwritten test was written to cover this behavior\n                            \"WriteGetObjectResponse\" -> null\n                            else -> input\n                        }\n                    },\n                )::transform,\n            )\n            // enable no auth for the service to support operations commonly used with public buckets\n            .let(AddSyntheticNoAuth()::transform)\n            .let(MakeS3BoolsAndNumbersOptional()::processModel)\n\n    override fun endpointCustomizations(codegenContext: ClientCodegenContext): List<EndpointCustomization> {\n        return listOf(\n            object : EndpointCustomization {\n                override fun setBuiltInOnServiceConfig(\n                    name: String,\n                    value: Node,\n                    configBuilderRef: String,\n                ): Writable? {\n                    if (!name.startsWith(\"AWS::S3\")) {\n                        return null\n                    }\n                    val builtIn = codegenContext.getBuiltIn(name) ?: return null\n                    return writable {\n                        rustTemplate(\n                            \"let $configBuilderRef = $configBuilderRef.${builtIn.name.rustName()}(#{value});\",\n                            \"value\" to value.toWritable(),\n                        )\n                    }\n                }\n            },\n        )\n    }\n\n    override fun operationCustomizations(\n        codegenContext: ClientCodegenContext,\n        operation: OperationShape,\n        baseCustomizations: List<OperationCustomization>,\n    ): List<OperationCustomization> {\n        return baseCustomizations +\n            object : OperationCustomization() {\n                private val runtimeConfig = codegenContext.runtimeConfig\n                private val symbolProvider = codegenContext.symbolProvider\n\n                override fun section(section: OperationSection): Writable {\n                    return writable {\n                        when (section) {\n                            is OperationSection.BeforeParseResponse -> {\n                                section.body?.also { body ->\n                                    rustTemplate(\n                                        \"\"\"\n                                        if matches!(#{errors}::body_is_error($body), Ok(true)) {\n                                            ${section.forceError} = true;\n                                        }\n                                        \"\"\",\n                                        \"errors\" to RuntimeType.unwrappedXmlErrors(runtimeConfig),\n                                    )\n                                }\n                            }\n\n                            is OperationSection.RetryClassifiers -> {\n                                section.registerRetryClassifier(this) {\n                                    rustTemplate(\n                                        \"\"\"\n                                        #{AwsErrorCodeClassifier}::<#{OperationError}>::builder().transient_errors({\n                                            let mut transient_errors: Vec<&'static str> = #{TRANSIENT_ERRORS}.into();\n                                            transient_errors.push(\"InternalError\");\n                                            #{Cow}::Owned(transient_errors)\n                                            }).build()\"\"\",\n                                        \"AwsErrorCodeClassifier\" to\n                                            AwsRuntimeType.awsRuntime(runtimeConfig)\n                                                .resolve(\"retries::classifiers::AwsErrorCodeClassifier\"),\n                                        \"Cow\" to RuntimeType.Cow,\n                                        \"OperationError\" to symbolProvider.symbolForOperationError(operation),\n                                        \"TRANSIENT_ERRORS\" to\n                                            AwsRuntimeType.awsRuntime(runtimeConfig)\n                                                .resolve(\"retries::classifiers::TRANSIENT_ERRORS\"),\n                                    )\n                                }\n                            }\n\n                            else -> {}\n                        }\n                    }\n                }\n            }\n    }\n\n    private fun isInInvalidXmlRootAllowList(shape: Shape): Boolean {\n        return shape.isStructureShape && invalidXmlRootAllowList.contains(shape.id)\n    }\n}\n\nclass FilterEndpointTests(\n    private val testFilter: (EndpointTestCase) -> EndpointTestCase? = { a -> a },\n    private val operationInputFilter: (EndpointTestOperationInput) -> EndpointTestOperationInput? = { a -> a },\n) {\n    private fun updateEndpointTests(endpointTests: List<EndpointTestCase>): List<EndpointTestCase> {\n        val filteredTests = endpointTests.mapNotNull { test -> testFilter(test) }\n        return filteredTests.map { test ->\n            val operationInputs = test.operationInputs\n            test.toBuilder().operationInputs(operationInputs.mapNotNull { operationInputFilter(it) }).build()\n        }\n    }\n\n    fun transform(model: Model): Model =\n        ModelTransformer.create().mapTraits(model) { _, trait ->\n            when (trait) {\n                is EndpointTestsTrait ->\n                    EndpointTestsTrait.builder().testCases(updateEndpointTests(trait.testCases))\n                        .version(trait.version).build()\n\n                else -> trait\n            }\n        }\n}\n\n// TODO(P96049742): This model transform may need to change depending on if and how the S3 model is updated.\n// See the comment in the `SyntheticNoAuthTrait` class for why we use a synthetic trait instead of `optionalAuth`.\nprivate class AddSyntheticNoAuth {\n    fun transform(model: Model): Model =\n        ModelTransformer.create().mapShapes(model) { shape ->\n            if (shape is ServiceShape) {\n                shape.toBuilder()\n                    .addTrait(SyntheticNoAuthTrait())\n                    .build()\n            } else {\n                shape\n            }\n        }\n}\n\nclass S3ProtocolOverride(codegenContext: CodegenContext) : RestXml(codegenContext) {\n    private val runtimeConfig = codegenContext.runtimeConfig\n    private val errorScope =\n        arrayOf(\n            *RuntimeType.preludeScope,\n            \"Bytes\" to RuntimeType.Bytes,\n            \"ErrorMetadata\" to RuntimeType.errorMetadata(runtimeConfig),\n            \"ErrorBuilder\" to RuntimeType.errorMetadataBuilder(runtimeConfig),\n            \"Headers\" to RuntimeType.headers(runtimeConfig),\n            \"XmlDecodeError\" to RuntimeType.smithyXml(runtimeConfig).resolve(\"decode::XmlDecodeError\"),\n            \"base_errors\" to restXmlErrors,\n        )\n\n    override fun parseHttpErrorMetadata(operationShape: OperationShape): RuntimeType {\n        return ProtocolFunctions.crossOperationFn(\"parse_http_error_metadata\") { fnName ->\n            rustBlockTemplate(\n                \"pub fn $fnName(response_status: u16, _response_headers: &#{Headers}, response_body: &[u8]) -> #{Result}<#{ErrorBuilder}, #{XmlDecodeError}>\",\n                *errorScope,\n            ) {\n                rustTemplate(\n                    \"\"\"\n                    // S3 HEAD responses have no response body to for an error code. Therefore,\n                    // check the HTTP response status and populate an error code for 404s.\n                    if response_body.is_empty() {\n                        let mut builder = #{ErrorMetadata}::builder();\n                        if response_status == 404 {\n                            builder = builder.code(\"NotFound\");\n                        }\n                        Ok(builder)\n                    } else {\n                        #{base_errors}::parse_error_metadata(response_body)\n                    }\n                    \"\"\",\n                    *errorScope,\n                )\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/main/kotlin/software/amazon/smithy/rustsdk/customize/s3/S3ExpiresDecorator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rustsdk.customize.s3\n\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.ServiceShape\nimport software.amazon.smithy.model.shapes.ShapeType\nimport software.amazon.smithy.model.shapes.StringShape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.traits.DeprecatedTrait\nimport software.amazon.smithy.model.traits.DocumentationTrait\nimport software.amazon.smithy.model.traits.HttpHeaderTrait\nimport software.amazon.smithy.model.traits.OutputTrait\nimport software.amazon.smithy.model.transform.ModelTransformer\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientRustSettings\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.OperationSection\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.util.getTrait\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\nimport software.amazon.smithy.rust.codegen.core.util.outputShape\nimport software.amazon.smithy.rustsdk.InlineAwsDependency\nimport kotlin.streams.asSequence\n\n/**\n * Enforces that Expires fields have the DateTime type (since in the future the model will change to model them as String),\n * and add an ExpiresString field to maintain the raw string value sent.\n */\nclass S3ExpiresDecorator : ClientCodegenDecorator {\n    override val name: String = \"S3ExpiresDecorator\"\n    override val order: Byte = 0\n    private val expires = \"Expires\"\n    private val expiresString = \"ExpiresString\"\n\n    override fun transformModel(\n        service: ServiceShape,\n        model: Model,\n        settings: ClientRustSettings,\n    ): Model {\n        val transformer = ModelTransformer.create()\n\n        // Ensure all `Expires` shapes are timestamps\n        val expiresShapeTimestampMap =\n            model.shapes()\n                .asSequence()\n                .mapNotNull { shape ->\n                    shape.members()\n                        .singleOrNull { member -> member.memberName.equals(expires, ignoreCase = true) }\n                        ?.target\n                }\n                .associateWith { ShapeType.TIMESTAMP }\n        var transformedModel = transformer.changeShapeType(model, expiresShapeTimestampMap)\n\n        // Add an `ExpiresString` string shape to the model\n        val expiresStringShape = StringShape.builder().id(\"aws.sdk.rust.s3.synthetic#$expiresString\").build()\n        transformedModel = transformedModel.toBuilder().addShape(expiresStringShape).build()\n\n        // For output shapes only, deprecate `Expires` and add a synthetic member that targets `ExpiresString`\n        transformedModel =\n            transformer.mapShapes(transformedModel) { shape ->\n                if (shape.hasTrait<OutputTrait>() && shape.memberNames.any { it.equals(expires, ignoreCase = true) }) {\n                    val builder = (shape as StructureShape).toBuilder()\n\n                    // Deprecate `Expires`\n                    val expiresMember = shape.members().single { it.memberName.equals(expires, ignoreCase = true) }\n\n                    builder.removeMember(expiresMember.memberName)\n                    val deprecatedTrait =\n                        DeprecatedTrait.builder()\n                            .message(\"Please use `expires_string` which contains the raw, unparsed value of this field.\")\n                            .build()\n\n                    builder.addMember(\n                        expiresMember.toBuilder()\n                            .addTrait(deprecatedTrait)\n                            .build(),\n                    )\n\n                    // Add a synthetic member targeting `ExpiresString`\n                    val expiresStringMember = MemberShape.builder()\n                    expiresStringMember.target(expiresStringShape.id)\n                    expiresStringMember.id(expiresMember.id.toString() + \"String\") // i.e. com.amazonaws.s3.<MEMBER_NAME>$ExpiresString\n                    expiresStringMember.addTrait(HttpHeaderTrait(expiresString)) // Add HttpHeaderTrait to ensure the field is deserialized\n                    expiresMember.getTrait<DocumentationTrait>()?.let {\n                        expiresStringMember.addTrait(it) // Copy documentation from `Expires`\n                    }\n                    builder.addMember(expiresStringMember.build())\n                    builder.build()\n                } else {\n                    shape\n                }\n            }\n\n        return transformedModel\n    }\n\n    override fun operationCustomizations(\n        codegenContext: ClientCodegenContext,\n        operation: OperationShape,\n        baseCustomizations: List<OperationCustomization>,\n    ): List<OperationCustomization> {\n        val outputShape = operation.outputShape(codegenContext.model)\n\n        if (outputShape.memberNames.any { it.equals(expires, ignoreCase = true) }) {\n            return baseCustomizations +\n                ParseExpiresFieldsCustomization(\n                    codegenContext,\n                )\n        } else {\n            return baseCustomizations\n        }\n    }\n}\n\nclass ParseExpiresFieldsCustomization(\n    private val codegenContext: ClientCodegenContext,\n) : OperationCustomization() {\n    override fun section(section: OperationSection): Writable =\n        writable {\n            when (section) {\n                is OperationSection.AdditionalInterceptors -> {\n                    section.registerPermanentInterceptor(codegenContext.runtimeConfig, this) {\n                        val interceptor =\n                            RuntimeType.forInlineDependency(\n                                InlineAwsDependency.forRustFile(\"s3_expires_interceptor\"),\n                            ).resolve(\"S3ExpiresInterceptor\")\n                        rustTemplate(\n                            \"\"\"\n                            #{S3ExpiresInterceptor}\n                            \"\"\",\n                            \"S3ExpiresInterceptor\" to interceptor,\n                        )\n                    }\n                }\n\n                else -> {}\n            }\n        }\n}\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/main/kotlin/software/amazon/smithy/rustsdk/customize/s3/S3ExpressDecorator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rustsdk.customize.s3\n\nimport software.amazon.smithy.aws.traits.HttpChecksumTrait\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.configReexport\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.OperationSection\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginSection\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.client.FluentClientCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.client.FluentClientSection\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.config.ServiceConfig\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.AdHocCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.adhocCustomization\nimport software.amazon.smithy.rust.codegen.core.util.dq\nimport software.amazon.smithy.rust.codegen.core.util.getTrait\nimport software.amazon.smithy.rust.codegen.core.util.sdkId\nimport software.amazon.smithy.rustsdk.AwsCargoDependency\nimport software.amazon.smithy.rustsdk.AwsRuntimeType\nimport software.amazon.smithy.rustsdk.InlineAwsDependency\nimport software.amazon.smithy.rustsdk.SdkConfigSection\n\nclass S3ExpressDecorator : ClientCodegenDecorator {\n    override val name: String = \"S3ExpressDecorator\"\n\n    override val order: Byte = 0\n\n    override fun serviceRuntimePluginCustomizations(\n        codegenContext: ClientCodegenContext,\n        baseCustomizations: List<ServiceRuntimePluginCustomization>,\n    ): List<ServiceRuntimePluginCustomization> =\n        baseCustomizations + listOf(S3ExpressServiceRuntimePluginCustomization(codegenContext))\n\n    override fun configCustomizations(\n        codegenContext: ClientCodegenContext,\n        baseCustomizations: List<ConfigCustomization>,\n    ): List<ConfigCustomization> = baseCustomizations + listOf(S3ExpressIdentityProviderConfig(codegenContext))\n\n    override fun operationCustomizations(\n        codegenContext: ClientCodegenContext,\n        operation: OperationShape,\n        baseCustomizations: List<OperationCustomization>,\n    ): List<OperationCustomization> =\n        baseCustomizations +\n            S3ExpressRequestChecksumCustomization(\n                codegenContext, operation,\n            )\n\n    override fun extraSections(codegenContext: ClientCodegenContext): List<AdHocCustomization> {\n        val serviceId = codegenContext.serviceShape.sdkId()\n        return listOf(\n            adhocCustomization<SdkConfigSection.CopySdkConfigToClientConfig> { section ->\n                rust(\n                    \"\"\"\n                    ${section.serviceConfigBuilder}.set_disable_s3_express_session_auth(\n                        ${section.sdkConfig}\n                            .service_config()\n                            .and_then(|conf| {\n                                let str_config = conf.load_config(\n                                    service_config_key(${serviceId.dq()}, \"AWS_S3_DISABLE_EXPRESS_SESSION_AUTH\", \"s3_disable_express_session_auth\")\n                                );\n                                str_config.and_then(|it| it.parse::<bool>().ok())\n                            }),\n                    );\n                    \"\"\",\n                )\n            },\n        )\n    }\n}\n\nprivate class S3ExpressServiceRuntimePluginCustomization(codegenContext: ClientCodegenContext) :\n    ServiceRuntimePluginCustomization() {\n    private val runtimeConfig = codegenContext.runtimeConfig\n    private val codegenScope by lazy {\n        arrayOf(\n            \"DefaultS3ExpressIdentityProvider\" to\n                s3ExpressModule(runtimeConfig).resolve(\"identity_provider::DefaultS3ExpressIdentityProvider\"),\n            \"IdentityCacheLocation\" to\n                RuntimeType.smithyRuntimeApiClient(runtimeConfig)\n                    .resolve(\"client::identity::IdentityCacheLocation\"),\n            \"S3ExpressAuthScheme\" to\n                s3ExpressModule(runtimeConfig).resolve(\"auth::S3ExpressAuthScheme\"),\n            \"S3_EXPRESS_SCHEME_ID\" to\n                s3ExpressModule(runtimeConfig).resolve(\"auth::SCHEME_ID\"),\n            \"SharedAuthScheme\" to\n                RuntimeType.smithyRuntimeApiClient(runtimeConfig)\n                    .resolve(\"client::auth::SharedAuthScheme\"),\n            \"SharedCredentialsProvider\" to\n                configReexport(\n                    AwsRuntimeType.awsCredentialTypes(runtimeConfig)\n                        .resolve(\"provider::SharedCredentialsProvider\"),\n                ),\n            \"SharedIdentityResolver\" to\n                RuntimeType.smithyRuntimeApiClient(runtimeConfig)\n                    .resolve(\"client::identity::SharedIdentityResolver\"),\n        )\n    }\n\n    override fun section(section: ServiceRuntimePluginSection): Writable =\n        writable {\n            when (section) {\n                is ServiceRuntimePluginSection.RegisterRuntimeComponents -> {\n                    section.registerAuthScheme(this) {\n                        rustTemplate(\n                            \"#{SharedAuthScheme}::new(#{S3ExpressAuthScheme}::new())\",\n                            *codegenScope,\n                        )\n                    }\n                }\n\n                else -> {}\n            }\n        }\n}\n\nprivate class S3ExpressIdentityProviderConfig(codegenContext: ClientCodegenContext) : ConfigCustomization() {\n    private val runtimeConfig = codegenContext.runtimeConfig\n    private val codegenScope =\n        arrayOf(\n            *preludeScope,\n            \"IdentityCacheLocation\" to\n                RuntimeType.smithyRuntimeApiClient(runtimeConfig)\n                    .resolve(\"client::identity::IdentityCacheLocation\"),\n            \"ProvideCredentials\" to\n                configReexport(\n                    AwsRuntimeType.awsCredentialTypes(runtimeConfig)\n                        .resolve(\"provider::ProvideCredentials\"),\n                ),\n            \"SharedCredentialsProvider\" to\n                configReexport(\n                    AwsRuntimeType.awsCredentialTypes(runtimeConfig)\n                        .resolve(\"provider::SharedCredentialsProvider\"),\n                ),\n            \"SharedIdentityResolver\" to\n                RuntimeType.smithyRuntimeApiClient(runtimeConfig)\n                    .resolve(\"client::identity::SharedIdentityResolver\"),\n            \"S3_EXPRESS_SCHEME_ID\" to\n                s3ExpressModule(runtimeConfig).resolve(\"auth::SCHEME_ID\"),\n        )\n\n    override fun section(section: ServiceConfig) =\n        writable {\n            when (section) {\n                ServiceConfig.BuilderImpl -> {\n                    rustTemplate(\n                        \"\"\"\n                        /// Sets the credentials provider for S3 Express One Zone\n                        pub fn express_credentials_provider(mut self, credentials_provider: impl #{ProvideCredentials} + 'static) -> Self {\n                            self.set_express_credentials_provider(#{Some}(#{SharedCredentialsProvider}::new(credentials_provider)));\n                            self\n                        }\n                        \"\"\",\n                        *codegenScope,\n                    )\n\n                    rustTemplate(\n                        \"\"\"\n                        /// Sets the credentials provider for S3 Express One Zone\n                        pub fn set_express_credentials_provider(&mut self, credentials_provider: #{Option}<#{SharedCredentialsProvider}>) -> &mut Self {\n                            if let #{Some}(credentials_provider) = credentials_provider {\n                                self.runtime_components.set_identity_resolver(#{S3_EXPRESS_SCHEME_ID}, credentials_provider);\n                            }\n                            self\n                        }\n                        \"\"\",\n                        *codegenScope,\n                    )\n                }\n\n                else -> emptySection\n            }\n        }\n}\n\nclass S3ExpressFluentClientCustomization(\n    codegenContext: ClientCodegenContext,\n) : FluentClientCustomization() {\n    private val runtimeConfig = codegenContext.runtimeConfig\n    private val codegenScope =\n        arrayOf(\n            *preludeScope,\n            \"S3ExpressRuntimePlugin\" to s3ExpressModule(runtimeConfig).resolve(\"runtime_plugin::S3ExpressRuntimePlugin\"),\n        )\n\n    override fun section(section: FluentClientSection): Writable =\n        writable {\n            when (section) {\n                is FluentClientSection.AdditionalBaseClientPlugins -> {\n                    rustTemplate(\n                        \"\"\"\n                        ${section.plugins} = ${section.plugins}.with_client_plugin(\n                            #{S3ExpressRuntimePlugin}::new(${section.config}.clone())\n                        );\n                        \"\"\",\n                        *codegenScope,\n                    )\n                }\n\n                else -> emptySection\n            }\n        }\n}\n\nclass S3ExpressRequestChecksumCustomization(\n    codegenContext: ClientCodegenContext,\n    private val operationShape: OperationShape,\n) : OperationCustomization() {\n    private val runtimeConfig = codegenContext.runtimeConfig\n\n    private val codegenScope =\n        arrayOf(\n            *preludeScope,\n            \"ChecksumAlgorithm\" to RuntimeType.smithyChecksums(runtimeConfig).resolve(\"ChecksumAlgorithm\"),\n            \"ConfigBag\" to RuntimeType.configBag(runtimeConfig),\n            \"Document\" to RuntimeType.smithyTypes(runtimeConfig).resolve(\"Document\"),\n            \"for_s3_express\" to s3ExpressModule(runtimeConfig).resolve(\"utils::for_s3_express\"),\n            \"provide_default_checksum_algorithm\" to s3ExpressModule(runtimeConfig).resolve(\"checksum::provide_default_checksum_algorithm\"),\n        )\n\n    override fun section(section: OperationSection): Writable =\n        writable {\n            // Get the `HttpChecksumTrait`, returning early if this `OperationShape` doesn't have one\n            val checksumTrait = operationShape.getTrait<HttpChecksumTrait>() ?: return@writable\n            when (section) {\n                is OperationSection.AdditionalRuntimePluginConfig -> {\n                    if (checksumTrait.isRequestChecksumRequired) {\n                        rustTemplate(\n                            \"\"\"\n                            ${section.newLayerName}.store_put(#{provide_default_checksum_algorithm}());\n                            \"\"\",\n                            *codegenScope,\n                            \"customDefault\" to\n                                writable {\n                                    rustTemplate(\"#{Some}(#{ChecksumAlgorithm}::Crc32)\", *codegenScope)\n                                },\n                        )\n                    }\n                }\n\n                else -> { }\n            }\n        }\n}\n\nprivate fun s3ExpressModule(runtimeConfig: RuntimeConfig) =\n    RuntimeType.forInlineDependency(\n        InlineAwsDependency.forRustFile(\n            \"s3_express\",\n            additionalDependency = s3ExpressDependencies(runtimeConfig),\n        ),\n    )\n\nprivate fun s3ExpressDependencies(runtimeConfig: RuntimeConfig) =\n    arrayOf(\n        AwsCargoDependency.awsCredentialTypes(runtimeConfig),\n        AwsCargoDependency.awsRuntime(runtimeConfig),\n        AwsCargoDependency.awsSigv4(runtimeConfig),\n        CargoDependency.FastRand,\n        CargoDependency.Hex,\n        CargoDependency.Hmac,\n        CargoDependency.Lru,\n        CargoDependency.Sha2,\n        CargoDependency.smithyAsync(runtimeConfig),\n        CargoDependency.smithyChecksums(runtimeConfig),\n        CargoDependency.smithyRuntimeApiClient(runtimeConfig),\n        CargoDependency.smithyTypes(runtimeConfig),\n    )\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/main/kotlin/software/amazon/smithy/rustsdk/customize/s3/S3ExtendedRequestIdDecorator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rustsdk.customize.s3\n\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rustsdk.BaseRequestIdDecorator\nimport software.amazon.smithy.rustsdk.InlineAwsDependency\n\nclass S3ExtendedRequestIdDecorator : BaseRequestIdDecorator() {\n    override val name: String = \"S3ExtendedRequestIdDecorator\"\n    override val order: Byte = 0\n\n    override val fieldName: String = \"extended_request_id\"\n    override val accessorFunctionName: String = \"extended_request_id\"\n\n    override fun asMemberShape(container: StructureShape): MemberShape? {\n        return null\n    }\n\n    private val requestIdModule: RuntimeType =\n        RuntimeType.forInlineDependency(InlineAwsDependency.forRustFile(\"s3_request_id\"))\n\n    override fun accessorTrait(codegenContext: ClientCodegenContext): RuntimeType =\n        requestIdModule.resolve(\"RequestIdExt\")\n\n    override fun applyToError(codegenContext: ClientCodegenContext): RuntimeType =\n        requestIdModule.resolve(\"apply_extended_request_id\")\n}\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/main/kotlin/software/amazon/smithy/rustsdk/customize/s3/StripBucketFromPath.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rustsdk.customize.s3\n\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.pattern.UriPattern\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.traits.HttpTrait\nimport software.amazon.smithy.model.transform.ModelTransformer\nimport software.amazon.smithy.rust.codegen.core.util.letIf\n\nclass StripBucketFromHttpPath {\n    private val transformer = ModelTransformer.create()\n\n    fun transform(model: Model): Model {\n        // Remove `/{Bucket}` from the path (http trait)\n        // The endpoints 2.0 rules handle either placing the bucket into the virtual host or adding it to the path\n        return transformer.mapTraits(model) { shape, trait ->\n            when (trait) {\n                is HttpTrait -> {\n                    val appliedToOperation =\n                        shape\n                            .asOperationShape()\n                            .map { operation ->\n                                model.expectShape(operation.inputShape, StructureShape::class.java)\n                                    .getMember(\"Bucket\").isPresent\n                            }.orElse(false)\n                    trait.letIf(appliedToOperation) {\n                        it.toBuilder().uri(UriPattern.parse(transformUri(trait.uri.toString()))).build()\n                    }\n                }\n\n                else -> trait\n            }\n        }\n    }\n\n    private fun transformUri(uri: String): String {\n        if (!uri.startsWith(\"/{Bucket}\")) {\n            throw IllegalStateException(\"tried to transform `$uri` that was not a standard bucket URI\")\n        }\n        val withoutBucket = uri.replace(\"/{Bucket}\", \"\")\n        return if (!withoutBucket.startsWith(\"/\")) {\n            \"/$withoutBucket\"\n        } else {\n            withoutBucket\n        }\n    }\n}\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/main/kotlin/software/amazon/smithy/rustsdk/customize/s3control/S3ControlDecorator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rustsdk.customize.s3control\n\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.node.Node\nimport software.amazon.smithy.model.shapes.ServiceShape\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientRustSettings\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.client.smithy.endpoint.EndpointCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.endpoint.rustName\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rustsdk.endpoints.stripEndpointTrait\nimport software.amazon.smithy.rustsdk.getBuiltIn\nimport software.amazon.smithy.rustsdk.toWritable\n\nclass S3ControlDecorator : ClientCodegenDecorator {\n    override val name: String = \"S3Control\"\n    override val order: Byte = 0\n\n    override fun transformModel(\n        service: ServiceShape,\n        model: Model,\n        settings: ClientRustSettings,\n    ): Model = stripEndpointTrait(\"AccountId\")(model)\n\n    override fun endpointCustomizations(codegenContext: ClientCodegenContext): List<EndpointCustomization> {\n        return listOf(\n            object : EndpointCustomization {\n                override fun setBuiltInOnServiceConfig(\n                    name: String,\n                    value: Node,\n                    configBuilderRef: String,\n                ): Writable? {\n                    if (!name.startsWith(\"AWS::S3Control\")) {\n                        return null\n                    }\n                    val builtIn = codegenContext.getBuiltIn(name) ?: return null\n                    return writable {\n                        rustTemplate(\n                            \"let $configBuilderRef = $configBuilderRef.${builtIn.name.rustName()}(#{value});\",\n                            \"value\" to value.toWritable(),\n                        )\n                    }\n                }\n            },\n        )\n    }\n}\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/main/kotlin/software/amazon/smithy/rustsdk/customize/sso/SSODecorator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rustsdk.customize.sso\n\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.ServiceShape\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.traits.SensitiveTrait\nimport software.amazon.smithy.model.transform.ModelTransformer\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientRustSettings\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.core.util.letIf\nimport java.util.logging.Logger\n\nclass SSODecorator : ClientCodegenDecorator {\n    override val name: String = \"SSO\"\n    override val order: Byte = 0\n    private val logger: Logger = Logger.getLogger(javaClass.name)\n\n    private fun isAwsCredentials(shape: Shape): Boolean = shape.id == ShapeId.from(\"com.amazonaws.sso#RoleCredentials\")\n\n    override fun transformModel(\n        service: ServiceShape,\n        model: Model,\n        settings: ClientRustSettings,\n    ): Model =\n        ModelTransformer.create().mapShapes(model) { shape ->\n            shape.letIf(isAwsCredentials(shape)) {\n                (shape as StructureShape).toBuilder().addTrait(SensitiveTrait()).build()\n            }\n        }\n}\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/main/kotlin/software/amazon/smithy/rustsdk/customize/sts/STSDecorator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\npackage software.amazon.smithy.rustsdk.customize.sts\n\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.ServiceShape\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.traits.ErrorTrait\nimport software.amazon.smithy.model.traits.RetryableTrait\nimport software.amazon.smithy.model.traits.SensitiveTrait\nimport software.amazon.smithy.model.transform.ModelTransformer\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientRustSettings\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\nimport software.amazon.smithy.rust.codegen.core.util.letIf\nimport java.util.logging.Logger\n\nclass STSDecorator : ClientCodegenDecorator {\n    override val name: String = \"STS\"\n    override val order: Byte = 0\n    private val logger: Logger = Logger.getLogger(javaClass.name)\n\n    private fun isIdpCommunicationError(shape: Shape): Boolean =\n        shape is StructureShape && shape.hasTrait<ErrorTrait>() &&\n            shape.id.namespace == \"com.amazonaws.sts\" && shape.id.name == \"IDPCommunicationErrorException\"\n\n    private fun isAwsCredentials(shape: Shape): Boolean = shape.id == ShapeId.from(\"com.amazonaws.sts#Credentials\")\n\n    override fun transformModel(\n        service: ServiceShape,\n        model: Model,\n        settings: ClientRustSettings,\n    ): Model =\n        ModelTransformer.create().mapShapes(model) { shape ->\n            shape.letIf(isIdpCommunicationError(shape)) {\n                logger.info(\"Adding @retryable trait to $shape and setting its error type to 'server'\")\n                (shape as StructureShape).toBuilder()\n                    .removeTrait(ErrorTrait.ID)\n                    .addTrait(ErrorTrait(\"server\"))\n                    .addTrait(RetryableTrait.builder().build()).build()\n            }.letIf(isAwsCredentials(shape)) {\n                (shape as StructureShape).toBuilder().addTrait(SensitiveTrait()).build()\n            }\n        }\n}\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/main/kotlin/software/amazon/smithy/rustsdk/customize/timestream/TimestreamDecorator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rustsdk.customize.timestream\n\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.client.smithy.endpoint.Types\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.DependencyScope\nimport software.amazon.smithy.rust.codegen.core.rustlang.Visibility\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.toType\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.std\nimport software.amazon.smithy.rust.codegen.core.smithy.RustCrate\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.AdHocCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.adhocCustomization\nimport software.amazon.smithy.rustsdk.AwsCargoDependency\nimport software.amazon.smithy.rustsdk.DocSection\nimport software.amazon.smithy.rustsdk.InlineAwsDependency\n\n/**\n * This decorator does two things:\n * 1. Adds the `endpoint_discovery` inlineable\n * 2. Adds a `with_endpoint_discovery_enabled` method on client that returns a wrapped client with endpoint discovery enabled\n */\nclass TimestreamDecorator : ClientCodegenDecorator {\n    override val name: String = \"Timestream\"\n    override val order: Byte = -1\n\n    override fun extraSections(codegenContext: ClientCodegenContext): List<AdHocCustomization> =\n        listOf(\n            adhocCustomization<DocSection.CreateClient> {\n                addDependency(AwsCargoDependency.awsConfig(codegenContext.runtimeConfig).toDevDependency())\n                rustTemplate(\n                    \"\"\"\n                    let config = aws_config::load_from_env().await;\n                    // You MUST call `with_endpoint_discovery_enabled` to produce a working client for this service.\n                    let ${it.clientName} = ${it.crateName}::Client::new(&config).with_endpoint_discovery_enabled().await;\n                    \"\"\".replaceIndent(it.indent),\n                )\n            },\n        )\n\n    override fun extras(\n        codegenContext: ClientCodegenContext,\n        rustCrate: RustCrate,\n    ) {\n        val endpointDiscovery =\n            InlineAwsDependency.forRustFile(\n                \"endpoint_discovery\",\n                Visibility.PUBLIC,\n                CargoDependency.Tokio.copy(scope = DependencyScope.Compile, features = setOf(\"sync\")),\n                CargoDependency.smithyAsync(codegenContext.runtimeConfig).toDevDependency().withFeature(\"test-util\"),\n            )\n        rustCrate.withModule(ClientRustModule.client) {\n            // helper function to resolve an endpoint given a base client\n            rustTemplate(\n                \"\"\"\n                async fn resolve_endpoint(client: &crate::Client) -> #{Result}<(#{Endpoint}, #{SystemTime}), #{BoxError}> {\n                    let describe_endpoints =\n                        client.describe_endpoints().send().await?;\n                    let endpoint = describe_endpoints.endpoints().first().unwrap();\n                    let expiry = client.config().time_source().expect(\"checked when ep discovery was enabled\").now()\n                        + #{Duration}::from_secs(endpoint.cache_period_in_minutes() as u64 * 60);\n                    Ok((\n                        #{Endpoint}::builder()\n                            .url(format!(\"https://{}\", endpoint.address()))\n                            .build(),\n                        expiry,\n                    ))\n                }\n\n                impl Client {\n                    /// Enable endpoint discovery for this client\n                    ///\n                    /// This method MUST be called to construct a working client.\n                    pub async fn with_endpoint_discovery_enabled(self) -> #{Result}<(Self, #{endpoint_discovery}::ReloadEndpoint), #{BoxError}> {\n                        let handle = self.handle.clone();\n\n                        // The original client without endpoint discover gets moved into the endpoint discovery\n                        // resolver since calls to DescribeEndpoint without discovery need to be made.\n                        let client_without_discovery = self;\n                        let (resolver, reloader) = #{endpoint_discovery}::create_cache(\n                            move || {\n                                let client = client_without_discovery.clone();\n                                async move { resolve_endpoint(&client).await }\n                            },\n                            handle.conf.sleep_impl()\n                                .expect(\"endpoint discovery requires the client config to have a sleep impl\"),\n                            handle.conf.time_source()\n                                .expect(\"endpoint discovery requires the client config to have a time source\"),\n                        ).await?;\n\n                        use #{IntoShared};\n                        let mut conf = handle.conf.to_builder();\n                        conf.set_endpoint_resolver(Some(resolver.into_shared()));\n\n                        let client_with_discovery = crate::Client::from_conf(conf.build());\n                        Ok((client_with_discovery, reloader))\n                    }\n                }\n                \"\"\",\n                *RuntimeType.preludeScope,\n                \"Arc\" to RuntimeType.Arc,\n                \"Duration\" to RuntimeType.std.resolve(\"time::Duration\"),\n                \"SystemTime\" to RuntimeType.std.resolve(\"time::SystemTime\"),\n                \"endpoint_discovery\" to endpointDiscovery.toType(),\n                \"BoxError\" to RuntimeType.boxError(codegenContext.runtimeConfig),\n                \"IntoShared\" to RuntimeType.smithyRuntimeApi(codegenContext.runtimeConfig).resolve(\"shared::IntoShared\"),\n                *Types(codegenContext.runtimeConfig).toArray(),\n            )\n        }\n    }\n}\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/main/kotlin/software/amazon/smithy/rustsdk/endpoints/AwsEndpointsStdLib.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rustsdk.endpoints\n\nimport software.amazon.smithy.model.node.Node\nimport software.amazon.smithy.model.node.ObjectNode\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.client.smithy.endpoint.EndpointCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators.CustomRuntimeFunction\nimport software.amazon.smithy.rust.codegen.client.smithy.endpoint.rulesgen.awsStandardLib\nimport software.amazon.smithy.rust.codegen.core.util.PANIC\nimport software.amazon.smithy.rustsdk.SdkSettings\nimport kotlin.io.path.readText\n\n/**\n * Standard library functions for AWS-specific endpoint standard library functions.\n *\n * This decorator uses partitions.json to source a default partition map for the partition resolver (when used).\n *\n * For test purposes, [awsStandardLib] can be used directly with a manually supplied partitions.json\n */\nclass AwsEndpointsStdLib() : ClientCodegenDecorator {\n    private var partitionsCache: ObjectNode? = null\n    override val name: String = \"AwsEndpointsStdLib\"\n    override val order: Byte = 0\n\n    private fun partitionMetadata(sdkSettings: SdkSettings): ObjectNode {\n        if (partitionsCache == null) {\n            val partitionsJson =\n                when (val path = sdkSettings.partitionsConfigPath) {\n                    null -> {\n                        if (sdkSettings.awsSdkBuild) {\n                            PANIC(\"cannot use hardcoded partitions in AWS SDK build\")\n                        }\n                        (\n                            javaClass.getResource(\"/default-partitions.json\")\n                                ?: throw IllegalStateException(\"Failed to find default-partitions.json in the JAR\")\n                        ).readText()\n                    }\n\n                    else -> path.readText()\n                }\n            partitionsCache = Node.parse(partitionsJson).expectObjectNode()\n        }\n        return partitionsCache!!\n    }\n\n    override fun endpointCustomizations(codegenContext: ClientCodegenContext): List<EndpointCustomization> {\n        return listOf<EndpointCustomization>(\n            object : EndpointCustomization {\n                override fun customRuntimeFunctions(codegenContext: ClientCodegenContext): List<CustomRuntimeFunction> {\n                    val sdkSettings = SdkSettings.from(codegenContext.settings)\n                    return awsStandardLib(codegenContext.runtimeConfig, partitionMetadata(sdkSettings))\n                }\n            },\n        )\n    }\n}\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/main/kotlin/software/amazon/smithy/rustsdk/endpoints/OperationInputTestGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rustsdk.endpoints\n\nimport software.amazon.smithy.model.knowledge.TopDownIndex\nimport software.amazon.smithy.model.node.Node\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.rulesengine.aws.language.functions.AwsBuiltIns\nimport software.amazon.smithy.rulesengine.traits.EndpointTestCase\nimport software.amazon.smithy.rulesengine.traits.EndpointTestOperationInput\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.client.smithy.endpoint.EndpointTypesGenerator\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.ClientInstantiator\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute\nimport software.amazon.smithy.rust.codegen.core.rustlang.AttributeKind\nimport software.amazon.smithy.rust.codegen.core.rustlang.escape\nimport software.amazon.smithy.rust.codegen.core.rustlang.join\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.PublicImportSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RustCrate\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.setterName\nimport software.amazon.smithy.rust.codegen.core.testutil.integrationTest\nimport software.amazon.smithy.rust.codegen.core.testutil.tokioTest\nimport software.amazon.smithy.rust.codegen.core.util.dq\nimport software.amazon.smithy.rust.codegen.core.util.expectMember\nimport software.amazon.smithy.rust.codegen.core.util.inputShape\nimport software.amazon.smithy.rust.codegen.core.util.orNull\nimport software.amazon.smithy.rust.codegen.core.util.orNullIfEmpty\nimport software.amazon.smithy.rust.codegen.core.util.toSnakeCase\nimport software.amazon.smithy.rustsdk.AwsRuntimeType\nimport java.util.logging.Logger\n\nclass OperationInputTestDecorator : ClientCodegenDecorator {\n    override val name: String = \"OperationInputTest\"\n    override val order: Byte = 0\n\n    override fun extras(\n        codegenContext: ClientCodegenContext,\n        rustCrate: RustCrate,\n    ) {\n        val endpointTests = EndpointTypesGenerator.fromContext(codegenContext).tests.orNullIfEmpty() ?: return\n        rustCrate.integrationTest(\"endpoint_tests\") {\n            Attribute(Attribute.cfg(Attribute.feature(\"test-util\"))).render(this, AttributeKind.Inner)\n            val tests =\n                endpointTests.flatMap { test ->\n                    val generator = OperationInputTestGenerator(codegenContext, test)\n                    test.operationInputs.filterNot { usesDeprecatedBuiltIns(it) }.map { operationInput ->\n                        generator.generateInput(operationInput)\n                    }\n                }\n            tests.join(\"\\n\")(this)\n        }\n    }\n}\n\nprivate val deprecatedBuiltins =\n    setOf(\n        // The Rust SDK DOES NOT support the S3 global endpoint because we do not support bucket redirects\n        AwsBuiltIns.S3_USE_GLOBAL_ENDPOINT,\n        // STS global endpoint was deprecated after STS regionalization\n        AwsBuiltIns.STS_USE_GLOBAL_ENDPOINT,\n    ).map { it.builtIn.get() }\n\nfun usesDeprecatedBuiltIns(testOperationInput: EndpointTestOperationInput): Boolean {\n    return testOperationInput.builtInParams.members.map { it.key.value }.any { deprecatedBuiltins.contains(it) }\n}\n\n/**\n * Generate `operationInputTests` for EP2 tests.\n *\n * These are `tests/` style integration tests that run as a public SDK user against a complete client. `capture_request`\n * is used to retrieve the URL.\n *\n * Example generated test:\n * ```rust\n * #[tokio::test]\n * async fn operation_input_test_get_object_119() {\n *     /* builtIns: {\n *         \"AWS::Region\": \"us-west-2\",\n *         \"AWS::S3::UseArnRegion\": false\n *     } */\n *     /* clientParams: {} */\n *     let (http_client, rcvr) = aws_smithy_runtime::client::http::test_util::capture_request(None);\n *     let conf = {\n *         #[allow(unused_mut)]\n *         let mut builder = aws_sdk_s3::Config::builder()\n *             .with_test_defaults()\n *             .http_client(http_client);\n *         let builder = builder.region(aws_types::region::Region::new(\"us-west-2\"));\n *         let builder = builder.use_arn_region(false);\n *         builder.build()\n *     };\n *     let client = aws_sdk_s3::Client::from_conf(conf);\n *     let _result = dbg!(client.get_object()\n *         .set_bucket(Some(\n *             \"arn:aws:s3-outposts:us-east-1:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint\".to_owned()\n *         ))\n *         .set_key(Some(\n *             \"key\".to_owned()\n *         ))\n *         .send().await);\n *     rcvr.expect_no_request();\n *     let error = _result.expect_err(\"expected error: Invalid configuration: region from ARN `us-east-1` does not match client region `us-west-2` and UseArnRegion is `false` [outposts arn with region mismatch and UseArnRegion=false]\");\n *     assert!(format!(\"{:?}\", error).contains(\"Invalid configuration: region from ARN `us-east-1` does not match client region `us-west-2` and UseArnRegion is `false`\"), \"expected error to contain `Invalid configuration: region from ARN `us-east-1` does not match client region `us-west-2` and UseArnRegion is `false`` but it was {}\", format!(\"{:?}\", error));\n * }\n * ```\n *\n * Eventually, we need to pull this test into generic smithy. However, this relies on generic smithy clients\n * supporting middleware and being instantiable from config (https://github.com/smithy-lang/smithy-rs/issues/2194)\n *\n * Doing this in AWS codegen allows us to actually integration test generated clients.\n */\n\nclass OperationInputTestGenerator(_ctx: ClientCodegenContext, private val test: EndpointTestCase) {\n    private val ctx = _ctx.copy(symbolProvider = PublicImportSymbolProvider(_ctx.symbolProvider, _ctx.moduleUseName()))\n    private val runtimeConfig = ctx.runtimeConfig\n    private val moduleName = ctx.moduleUseName()\n    private val endpointCustomizations = ctx.rootDecorator.endpointCustomizations(ctx)\n    private val model = ctx.model\n    private val instantiator = ClientInstantiator(ctx)\n\n    fun generateInput(testOperationInput: EndpointTestOperationInput) =\n        writable {\n            val operationName = testOperationInput.operationName.toSnakeCase()\n            tokioTest(safeName(\"operation_input_test_$operationName\")) {\n                rustTemplate(\n                    \"\"\"\n                    /* documentation: ${test.documentation.orElse(\"No docs :(\")} */\n                    /* builtIns: ${escape(Node.prettyPrintJson(testOperationInput.builtInParams))} */\n                    /* clientParams: ${escape(Node.prettyPrintJson(testOperationInput.clientParams))} */\n                    let (http_client, rcvr) = #{capture_request}(None);\n                    let conf = #{conf};\n                    let client = $moduleName::Client::from_conf(conf);\n                    let _result = dbg!(#{invoke_operation});\n                    #{assertion}\n                    \"\"\",\n                    \"capture_request\" to RuntimeType.captureRequest(runtimeConfig),\n                    \"conf\" to config(testOperationInput),\n                    \"invoke_operation\" to operationInvocation(testOperationInput),\n                    \"assertion\" to\n                        writable {\n                            test.expect.endpoint.ifPresent { endpoint ->\n                                val uri = escape(endpoint.url)\n                                rustTemplate(\n                                    \"\"\"\n                                    let req = rcvr.expect_request();\n                                    let uri = req.uri().to_string();\n                                    assert!(uri.starts_with(${uri.dq()}), \"expected URI to start with `$uri` but it was `{}`\", uri);\n                                    \"\"\",\n                                )\n                            }\n                            test.expect.error.ifPresent { error ->\n                                val expectedError =\n                                    escape(\"expected error: $error [${test.documentation.orNull() ?: \"no docs\"}]\")\n                                val escapedError = escape(error)\n                                rustTemplate(\n                                    \"\"\"\n                                    rcvr.expect_no_request();\n                                    let error = _result.expect_err(${expectedError.dq()});\n                                    assert!(\n                                        format!(\"{:?}\", error).contains(${escapedError.dq()}),\n                                        \"expected error to contain `$escapedError` but it was {:?}\", error\n                                    );\n                                    \"\"\",\n                                )\n                            }\n                        },\n                )\n            }\n        }\n\n    private fun operationInvocation(testOperationInput: EndpointTestOperationInput) =\n        writable {\n            rust(\"client.${testOperationInput.operationName.toSnakeCase()}()\")\n            val operationInput =\n                model.expectShape(ctx.operationId(testOperationInput), OperationShape::class.java).inputShape(model)\n            testOperationInput.operationParams.members.forEach { (key, value) ->\n                val member = operationInput.expectMember(key.value)\n                rustTemplate(\n                    \".${member.setterName()}(#{value})\",\n                    \"value\" to instantiator.generate(member, value),\n                )\n            }\n            rust(\".send().await\")\n        }\n\n    /** initialize service config for test */\n    private fun config(operationInput: EndpointTestOperationInput) =\n        writable {\n            rustBlock(\"\") {\n                Attribute.AllowUnusedMut.render(this)\n                rust(\"let mut builder = $moduleName::Config::builder().with_test_defaults().http_client(http_client);\")\n                operationInput.builtInParams.members.forEach { (builtIn, value) ->\n                    val setter =\n                        endpointCustomizations.firstNotNullOfOrNull {\n                            it.setBuiltInOnServiceConfig(\n                                builtIn.value,\n                                value,\n                                \"builder\",\n                            )\n                        }\n                    if (setter != null) {\n                        setter(this)\n                    } else if (builtIn.value != AwsBuiltIns.ACCOUNT_ID.builtIn.get()) {\n                        // It is expected that `AWS::Auth::AccountId` built-in parameter does not have config setters.\n                        Logger.getLogger(\"OperationTestGenerator\").warning(\"No provider for ${builtIn.value}\")\n                    }\n                    // If the test case uses the AWS::Auth::AccountId built-in parameter,\n                    // override the credentials provider (set via `with_test_defaults`)\n                    // with one that supplies the account ID.\n                    if (builtIn.value == AwsBuiltIns.ACCOUNT_ID.builtIn.get()) {\n                        rustTemplate(\n                            \"\"\"\n                            let builder = builder.credentials_provider(#{SharedCredentialsProvider}::new(\n                                #{CredentialsBuilder}::for_tests()\n                                    .account_id(${value.expectStringNode().value.dq()})\n                                    .build()\n                            ));\n                            \"\"\",\n                            \"SharedCredentialsProvider\" to\n                                AwsRuntimeType.awsCredentialTypes(runtimeConfig)\n                                    .resolve(\"provider::SharedCredentialsProvider\"),\n                            \"CredentialsBuilder\" to\n                                AwsRuntimeType.awsCredentialTypesTestUtil(runtimeConfig)\n                                    .resolve(\"CredentialsBuilder\"),\n                        )\n                    }\n                }\n                // If the test contains Endpoint built-ins and does not contain an AWS::Region then we set one\n                if (!operationInput.builtInParams.isEmpty && !operationInput.builtInParams.containsMember(\"AWS::Region\")) {\n                    rust(\"let builder = builder.region(::aws_types::region::Region::new(\\\"us-east-1\\\"));\")\n                }\n                rust(\"builder.build()\")\n            }\n        }\n}\n\nfun ClientCodegenContext.operationId(testOperationInput: EndpointTestOperationInput): ShapeId =\n    TopDownIndex.of(this.model)\n        .getContainedOperations(this.serviceShape)\n        .map { it.toShapeId() }\n        .first { it.name == testOperationInput.operationName }\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/main/kotlin/software/amazon/smithy/rustsdk/endpoints/RequireEndpointRules.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rustsdk.endpoints\n\nimport software.amazon.smithy.codegen.core.CodegenException\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.client.smithy.endpoint.EndpointTypesGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.RustCrate\nimport software.amazon.smithy.rustsdk.sdkSettings\n\nclass RequireEndpointRules : ClientCodegenDecorator {\n    override val name: String = \"RequireEndpointRules\"\n    override val order: Byte = 100\n\n    override fun extras(\n        codegenContext: ClientCodegenContext,\n        rustCrate: RustCrate,\n    ) {\n        if (!codegenContext.sdkSettings().requireEndpointResolver) {\n            return\n        }\n        val epTypes = EndpointTypesGenerator.fromContext(codegenContext)\n        if (epTypes.defaultResolver() == null) {\n            throw CodegenException(\n                \"${codegenContext.serviceShape} did not provide endpoint rules. To explicitly allow this, set `awsSdk.requireEndpointResolver: false` in smithy-build.json.\",\n            )\n        }\n    }\n}\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/main/kotlin/software/amazon/smithy/rustsdk/endpoints/StripEndpointTrait.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rustsdk.endpoints\n\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.traits.EndpointTrait\nimport software.amazon.smithy.model.transform.ModelTransformer\n\nfun stripEndpointTrait(hostPrefix: String): (Model) -> Model {\n    return { model: Model ->\n        ModelTransformer.create()\n            .removeTraitsIf(model) { _, trait ->\n                trait is EndpointTrait &&\n                    trait.hostPrefix.labels.any {\n                        it.isLabel && it.content == hostPrefix\n                    }\n            }\n    }\n}\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/main/kotlin/software/amazon/smithy/rustsdk/traits/PresignableTrait.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rustsdk.traits\n\nimport software.amazon.smithy.model.node.Node\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.model.traits.AnnotationTrait\n\n// TODO(https://github.com/awslabs/smithy/pull/897) this can be replaced when the trait is added to Smithy.\n\n/** Synthetic trait that indicates an operation is presignable. */\nclass PresignableTrait(val syntheticOperationId: ShapeId) : AnnotationTrait(ID, Node.objectNode()) {\n    companion object {\n        val ID = ShapeId.from(\"smithy.api.aws.internal#presignable\")\n    }\n}\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/main/resources/LICENSE",
    "content": "                                Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"{}\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright 2018-2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/main/resources/META-INF/services/software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator",
    "content": "#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\n\nsoftware.amazon.smithy.rustsdk.AwsCodegenDecorator\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/main/resources/default-partitions.json",
    "content": "{\n  \"partitions\" : [ {\n    \"id\" : \"aws\",\n    \"outputs\" : {\n      \"dnsSuffix\" : \"amazonaws.com\",\n      \"dualStackDnsSuffix\" : \"api.aws\",\n      \"implicitGlobalRegion\" : \"us-east-1\",\n      \"name\" : \"aws\",\n      \"supportsDualStack\" : true,\n      \"supportsFIPS\" : true\n    },\n    \"regionRegex\" : \"^(us|eu|ap|sa|ca|me|af|il|mx)\\\\-\\\\w+\\\\-\\\\d+$\",\n    \"regions\" : {\n      \"af-south-1\" : {\n        \"description\" : \"Africa (Cape Town)\"\n      },\n      \"ap-east-1\" : {\n        \"description\" : \"Asia Pacific (Hong Kong)\"\n      },\n      \"ap-east-2\" : {\n        \"description\" : \"Asia Pacific (Taipei)\"\n      },\n      \"ap-northeast-1\" : {\n        \"description\" : \"Asia Pacific (Tokyo)\"\n      },\n      \"ap-northeast-2\" : {\n        \"description\" : \"Asia Pacific (Seoul)\"\n      },\n      \"ap-northeast-3\" : {\n        \"description\" : \"Asia Pacific (Osaka)\"\n      },\n      \"ap-south-1\" : {\n        \"description\" : \"Asia Pacific (Mumbai)\"\n      },\n      \"ap-south-2\" : {\n        \"description\" : \"Asia Pacific (Hyderabad)\"\n      },\n      \"ap-southeast-1\" : {\n        \"description\" : \"Asia Pacific (Singapore)\"\n      },\n      \"ap-southeast-2\" : {\n        \"description\" : \"Asia Pacific (Sydney)\"\n      },\n      \"ap-southeast-3\" : {\n        \"description\" : \"Asia Pacific (Jakarta)\"\n      },\n      \"ap-southeast-4\" : {\n        \"description\" : \"Asia Pacific (Melbourne)\"\n      },\n      \"ap-southeast-5\" : {\n        \"description\" : \"Asia Pacific (Malaysia)\"\n      },\n      \"ap-southeast-6\" : {\n        \"description\" : \"Asia Pacific (New Zealand)\"\n      },\n      \"ap-southeast-7\" : {\n        \"description\" : \"Asia Pacific (Thailand)\"\n      },\n      \"aws-global\" : {\n        \"description\" : \"aws global region\"\n      },\n      \"ca-central-1\" : {\n        \"description\" : \"Canada (Central)\"\n      },\n      \"ca-west-1\" : {\n        \"description\" : \"Canada West (Calgary)\"\n      },\n      \"eu-central-1\" : {\n        \"description\" : \"Europe (Frankfurt)\"\n      },\n      \"eu-central-2\" : {\n        \"description\" : \"Europe (Zurich)\"\n      },\n      \"eu-north-1\" : {\n        \"description\" : \"Europe (Stockholm)\"\n      },\n      \"eu-south-1\" : {\n        \"description\" : \"Europe (Milan)\"\n      },\n      \"eu-south-2\" : {\n        \"description\" : \"Europe (Spain)\"\n      },\n      \"eu-west-1\" : {\n        \"description\" : \"Europe (Ireland)\"\n      },\n      \"eu-west-2\" : {\n        \"description\" : \"Europe (London)\"\n      },\n      \"eu-west-3\" : {\n        \"description\" : \"Europe (Paris)\"\n      },\n      \"il-central-1\" : {\n        \"description\" : \"Israel (Tel Aviv)\"\n      },\n      \"me-central-1\" : {\n        \"description\" : \"Middle East (UAE)\"\n      },\n      \"me-south-1\" : {\n        \"description\" : \"Middle East (Bahrain)\"\n      },\n      \"mx-central-1\" : {\n        \"description\" : \"Mexico (Central)\"\n      },\n      \"sa-east-1\" : {\n        \"description\" : \"South America (Sao Paulo)\"\n      },\n      \"us-east-1\" : {\n        \"description\" : \"US East (N. Virginia)\"\n      },\n      \"us-east-2\" : {\n        \"description\" : \"US East (Ohio)\"\n      },\n      \"us-west-1\" : {\n        \"description\" : \"US West (N. California)\"\n      },\n      \"us-west-2\" : {\n        \"description\" : \"US West (Oregon)\"\n      }\n    }\n  }, {\n    \"id\" : \"aws-cn\",\n    \"outputs\" : {\n      \"dnsSuffix\" : \"amazonaws.com.cn\",\n      \"dualStackDnsSuffix\" : \"api.amazonwebservices.com.cn\",\n      \"implicitGlobalRegion\" : \"cn-northwest-1\",\n      \"name\" : \"aws-cn\",\n      \"supportsDualStack\" : true,\n      \"supportsFIPS\" : true\n    },\n    \"regionRegex\" : \"^cn\\\\-\\\\w+\\\\-\\\\d+$\",\n    \"regions\" : {\n      \"aws-cn-global\" : {\n        \"description\" : \"aws-cn global region\"\n      },\n      \"cn-north-1\" : {\n        \"description\" : \"China (Beijing)\"\n      },\n      \"cn-northwest-1\" : {\n        \"description\" : \"China (Ningxia)\"\n      }\n    }\n  }, {\n    \"id\" : \"aws-eusc\",\n    \"outputs\" : {\n      \"dnsSuffix\" : \"amazonaws.eu\",\n      \"dualStackDnsSuffix\" : \"api.amazonwebservices.eu\",\n      \"implicitGlobalRegion\" : \"eusc-de-east-1\",\n      \"name\" : \"aws-eusc\",\n      \"supportsDualStack\" : true,\n      \"supportsFIPS\" : true\n    },\n    \"regionRegex\" : \"^eusc\\\\-(de)\\\\-\\\\w+\\\\-\\\\d+$\",\n    \"regions\" : {\n      \"eusc-de-east-1\" : {\n        \"description\" : \"EU (Germany)\"\n      }\n    }\n  }, {\n    \"id\" : \"aws-iso\",\n    \"outputs\" : {\n      \"dnsSuffix\" : \"c2s.ic.gov\",\n      \"dualStackDnsSuffix\" : \"api.aws.ic.gov\",\n      \"implicitGlobalRegion\" : \"us-iso-east-1\",\n      \"name\" : \"aws-iso\",\n      \"supportsDualStack\" : true,\n      \"supportsFIPS\" : true\n    },\n    \"regionRegex\" : \"^us\\\\-iso\\\\-\\\\w+\\\\-\\\\d+$\",\n    \"regions\" : {\n      \"aws-iso-global\" : {\n        \"description\" : \"aws-iso global region\"\n      },\n      \"us-iso-east-1\" : {\n        \"description\" : \"US ISO East\"\n      },\n      \"us-iso-west-1\" : {\n        \"description\" : \"US ISO WEST\"\n      }\n    }\n  }, {\n    \"id\" : \"aws-iso-b\",\n    \"outputs\" : {\n      \"dnsSuffix\" : \"sc2s.sgov.gov\",\n      \"dualStackDnsSuffix\" : \"api.aws.scloud\",\n      \"implicitGlobalRegion\" : \"us-isob-east-1\",\n      \"name\" : \"aws-iso-b\",\n      \"supportsDualStack\" : true,\n      \"supportsFIPS\" : true\n    },\n    \"regionRegex\" : \"^us\\\\-isob\\\\-\\\\w+\\\\-\\\\d+$\",\n    \"regions\" : {\n      \"aws-iso-b-global\" : {\n        \"description\" : \"aws-iso-b global region\"\n      },\n      \"us-isob-east-1\" : {\n        \"description\" : \"US ISOB East (Ohio)\"\n      }\n    }\n  }, {\n    \"id\" : \"aws-iso-e\",\n    \"outputs\" : {\n      \"dnsSuffix\" : \"cloud.adc-e.uk\",\n      \"dualStackDnsSuffix\" : \"api.cloud-aws.adc-e.uk\",\n      \"implicitGlobalRegion\" : \"eu-isoe-west-1\",\n      \"name\" : \"aws-iso-e\",\n      \"supportsDualStack\" : true,\n      \"supportsFIPS\" : true\n    },\n    \"regionRegex\" : \"^eu\\\\-isoe\\\\-\\\\w+\\\\-\\\\d+$\",\n    \"regions\" : {\n      \"aws-iso-e-global\" : {\n        \"description\" : \"aws-iso-e global region\"\n      },\n      \"eu-isoe-west-1\" : {\n        \"description\" : \"EU ISOE West\"\n      }\n    }\n  }, {\n    \"id\" : \"aws-iso-f\",\n    \"outputs\" : {\n      \"dnsSuffix\" : \"csp.hci.ic.gov\",\n      \"dualStackDnsSuffix\" : \"api.aws.hci.ic.gov\",\n      \"implicitGlobalRegion\" : \"us-isof-south-1\",\n      \"name\" : \"aws-iso-f\",\n      \"supportsDualStack\" : true,\n      \"supportsFIPS\" : true\n    },\n    \"regionRegex\" : \"^us\\\\-isof\\\\-\\\\w+\\\\-\\\\d+$\",\n    \"regions\" : {\n      \"aws-iso-f-global\" : {\n        \"description\" : \"aws-iso-f global region\"\n      },\n      \"us-isof-east-1\" : {\n        \"description\" : \"US ISOF EAST\"\n      },\n      \"us-isof-south-1\" : {\n        \"description\" : \"US ISOF SOUTH\"\n      }\n    }\n  }, {\n    \"id\" : \"aws-us-gov\",\n    \"outputs\" : {\n      \"dnsSuffix\" : \"amazonaws.com\",\n      \"dualStackDnsSuffix\" : \"api.aws\",\n      \"implicitGlobalRegion\" : \"us-gov-west-1\",\n      \"name\" : \"aws-us-gov\",\n      \"supportsDualStack\" : true,\n      \"supportsFIPS\" : true\n    },\n    \"regionRegex\" : \"^us\\\\-gov\\\\-\\\\w+\\\\-\\\\d+$\",\n    \"regions\" : {\n      \"aws-us-gov-global\" : {\n        \"description\" : \"aws-us-gov global region\"\n      },\n      \"us-gov-east-1\" : {\n        \"description\" : \"AWS GovCloud (US-East)\"\n      },\n      \"us-gov-west-1\" : {\n        \"description\" : \"AWS GovCloud (US-West)\"\n      }\n    }\n  } ],\n  \"version\" : \"1.1\"\n}\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/test/kotlin/AwsCrateDocsDecoratorTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport org.junit.jupiter.api.Assertions.assertEquals\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.model.loader.ModelAssembler\nimport software.amazon.smithy.rust.codegen.client.testutil.testClientCodegenContext\nimport software.amazon.smithy.rustsdk.AwsCrateDocGenerator\n\nclass AwsCrateDocsDecoratorTest {\n    private val codegenContext = testClientCodegenContext(ModelAssembler().assemble().unwrap())\n\n    @Test\n    fun `it converts description HTML into Markdown`() {\n        assertEquals(\n            \"\"\"\n            This is __some paragraph__ of information.\n\n            This is _another_ paragraph of information.\n\n            More information [can be found here](https://example.com).\n            \"\"\".trimIndent(),\n            AwsCrateDocGenerator(codegenContext).normalizeDescription(\n                \"\",\n                \"\"\"\n                <fullname>Some service</fullname>\n                <p>This is <b>some paragraph</b>\n                of information.</p>\n                <p>This is <i>another</i> paragraph\n                of information.</p>\n                <p>More information <a href=\"https://example.com\">can be found here</a>.</p>\n                \"\"\".trimIndent(),\n            ),\n        )\n    }\n\n    @Test\n    fun `it converts lists`() {\n        assertEquals(\n            \"\"\"\n            Some text introducing a list:\n              - foo bar baz\n              - baz bar foo\n                1. nested item\n                1. another\n\n            More text.\n            \"\"\".trimIndent(),\n            AwsCrateDocGenerator(codegenContext).normalizeDescription(\n                \"\",\n                \"\"\"\n                <p>Some text introducing a list:\n                <ul>\n                  <li>foo bar baz</li>\n                  <li>baz bar foo\n                    <ol><li>nested item</li><li>another</li></ol>\n                  </li>\n                </ul> More text.</p>\n                \"\"\".trimIndent(),\n            ),\n        )\n    }\n\n    @Test\n    fun `it converts description lists`() {\n        assertEquals(\n            \"\"\"\n            Some text introducing a description list:\n\n            __Something__\n\n            Some description of [something](test).\n\n            __Another thing__\n\n            Some description of another thing.\n\n            A second paragraph that describes another thing.\n\n            __MDN says these can be wrapped in divs__\n\n            So here we are\n\n            Some trailing text.\n            \"\"\".trimIndent(),\n            AwsCrateDocGenerator(codegenContext).normalizeDescription(\n                \"\",\n                \"\"\"\n                <p>Some text introducing a description list:\n                <dl>\n                  <dt>Something</dt>\n                  <dd>Some description of <a href=\"test\">something</a>.</dd>\n                  <dt>Another thing</dt>\n                  <dd>Some description of another thing.</dd>\n                  <dd>A second paragraph that describes another thing.</dd>\n                  <div>\n                      <dt>MDN says these can be wrapped in divs</dt>\n                      <dd>So here we are</dd>\n                  </div>\n                </dl>\n                Some trailing text.\n                </p>\n                \"\"\".trimIndent(),\n            ),\n        )\n    }\n}\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/test/kotlin/SdkCodegenIntegrationTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rustsdk.awsSdkIntegrationTest\n\nclass SdkCodegenIntegrationTest {\n    companion object {\n        val model =\n            \"\"\"\n            namespace test\n\n            use aws.api#service\n            use aws.auth#sigv4\n            use aws.protocols#restJson1\n            use smithy.rules#endpointRuleSet\n\n            @service(sdkId: \"dontcare\")\n            @restJson1\n            @sigv4(name: \"dontcare\")\n            @auth([sigv4])\n            @endpointRuleSet({\n                \"version\": \"1.0\",\n                \"rules\": [{ \"type\": \"endpoint\", \"conditions\": [], \"endpoint\": { \"url\": \"https://example.com\" } }],\n                \"parameters\": {\n                    \"Region\": { \"required\": false, \"type\": \"String\", \"builtIn\": \"AWS::Region\" },\n                }\n            })\n            service TestService {\n                version: \"2023-01-01\",\n                operations: [\n                    NeatOperation,\n                    SomeOperation\n                ]\n            }\n\n            structure SomeOutput {\n                someAttribute: Long,\n                someVal: String\n            }\n\n            @http(uri: \"/NeatOperation\", method: \"GET\")\n            operation NeatOperation {}\n\n            @http(uri: \"/SomeOperation\", method: \"GET\")\n            @optionalAuth\n            operation SomeOperation {\n                output: SomeOutput\n            }\n            \"\"\".asSmithyModel()\n    }\n\n    @Test\n    fun smokeTestSdkCodegen() {\n        awsSdkIntegrationTest(model) { _, _ ->\n            // it should compile\n        }\n    }\n}\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/test/kotlin/software/amazon/smithy/rustsdk/AwsPresigningDecoratorTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rustsdk\n\nimport io.kotest.matchers.shouldBe\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.knowledge.HttpBinding\nimport software.amazon.smithy.model.knowledge.HttpBindingIndex\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.ServiceShape\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.model.traits.HttpTrait\nimport software.amazon.smithy.rust.codegen.client.testutil.testClientRustSettings\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.util.expectTrait\nimport software.amazon.smithy.rust.codegen.core.util.orNull\nimport software.amazon.smithy.rustsdk.traits.PresignableTrait\n\nclass AwsPresigningDecoratorTest {\n    @Test\n    fun `it should add the synthetic presignable trait to known presignable operations`() {\n        testTransform(\"some.service\", \"NotPresignable\", presignable = false)\n        testTransform(\"com.amazonaws.s3\", \"GetObject\", presignable = true)\n    }\n\n    private fun testTransform(\n        namespace: String,\n        name: String,\n        presignable: Boolean,\n    ) {\n        val settings = testClientRustSettings()\n        val decorator = AwsPresigningDecorator()\n        val model = testOperation(namespace, name)\n        val transformed = decorator.transformModel(serviceShape(model), model, settings)\n        hasPresignableTrait(transformed, namespace, name) shouldBe presignable\n    }\n\n    private fun hasPresignableTrait(\n        model: Model,\n        namespace: String,\n        name: String,\n    ): Boolean =\n        model.shapes().filter { shape -> shape is OperationShape && shape.id == ShapeId.fromParts(namespace, name) }\n            .findFirst()\n            .orNull()!!\n            .hasTrait(PresignableTrait.ID)\n\n    private fun serviceShape(model: Model): ServiceShape =\n        model.shapes().filter { shape -> shape is ServiceShape }.findFirst().orNull()!! as ServiceShape\n\n    private fun testOperation(\n        namespace: String,\n        name: String,\n    ): Model =\n        \"\"\"\n        namespace $namespace\n        use aws.protocols#restJson1\n\n        @restJson1\n        service TestService {\n            version: \"2019-12-16\",\n            operations: [\"$name\"],\n        }\n\n        operation $name {\n            input: ${name}InputOutput,\n            output: ${name}InputOutput,\n        }\n        structure ${name}InputOutput {\n        }\n        \"\"\".asSmithyModel()\n}\n\nclass OverrideHttpMethodTransformTest {\n    @Test\n    fun `it should override the HTTP method for the listed operations`() {\n        val settings = testClientRustSettings()\n        val model =\n            \"\"\"\n            namespace test\n            use aws.protocols#restJson1\n\n            @restJson1\n            service TestService {\n                version: \"2019-12-16\",\n                operations: [\"One\", \"Two\", \"Three\"],\n            }\n\n            structure TestInput { }\n            structure TestOutput { }\n\n            @http(uri: \"/one\", method: \"POST\")\n            operation One { input: TestInput, output: TestOutput }\n\n            @http(uri: \"/two\", method: \"GET\")\n            operation Two { input: TestInput, output: TestOutput }\n\n            @http(uri: \"/three\", method: \"POST\")\n            operation Three { input: TestInput, output: TestOutput }\n            \"\"\".asSmithyModel()\n\n        val serviceShape = model.expectShape(ShapeId.from(\"test#TestService\"), ServiceShape::class.java)\n        val presignableOp =\n            PresignableOperation(\n                PayloadSigningType.EMPTY,\n                listOf(\n                    OverrideHttpMethodTransform(\n                        mapOf(\n                            ShapeId.from(\"test#One\") to \"GET\",\n                            ShapeId.from(\"test#Two\") to \"POST\",\n                        ),\n                    ),\n                ),\n            )\n        val transformed =\n            AwsPresigningDecorator(\n                mapOf(\n                    ShapeId.from(\"test#One\") to presignableOp,\n                    ShapeId.from(\"test#Two\") to presignableOp,\n                ),\n            ).transformModel(serviceShape, model, settings)\n\n        val synthNamespace = \"test.synthetic.aws.presigned\"\n        transformed.expectShape(ShapeId.from(\"$synthNamespace#One\")).expectTrait<HttpTrait>().method shouldBe \"GET\"\n        transformed.expectShape(ShapeId.from(\"$synthNamespace#Two\")).expectTrait<HttpTrait>().method shouldBe \"POST\"\n        transformed.getShape(ShapeId.from(\"$synthNamespace#Three\")).orNull() shouldBe null\n    }\n}\n\nclass MoveDocumentMembersToQueryParamsTransformTest {\n    @Test\n    fun `it should move document members to query parameters for the listed operations`() {\n        val settings = testClientRustSettings()\n        val model =\n            \"\"\"\n            namespace test\n            use aws.protocols#restJson1\n\n            @restJson1\n            service TestService {\n                version: \"2019-12-16\",\n                operations: [\"One\", \"Two\"],\n            }\n\n            structure OneInputOutput {\n                @httpHeader(\"one\")\n                one: String,\n                @httpQuery(\"two\")\n                two: String,\n\n                three: String,\n                four: String,\n            }\n            structure TwoInputOutput {\n                @httpHeader(\"one\")\n                one: String,\n                @httpQuery(\"two\")\n                two: String,\n\n                three: String,\n                four: String,\n            }\n\n            @http(uri: \"/one\", method: \"POST\")\n            operation One { input: OneInputOutput, output: OneInputOutput }\n\n            @http(uri: \"/two\", method: \"POST\")\n            operation Two { input: TwoInputOutput, output: TwoInputOutput }\n            \"\"\".asSmithyModel()\n\n        val serviceShape = model.expectShape(ShapeId.from(\"test#TestService\"), ServiceShape::class.java)\n        val presignableOp =\n            PresignableOperation(\n                PayloadSigningType.EMPTY,\n                listOf(\n                    MoveDocumentMembersToQueryParamsTransform(\n                        listOf(ShapeId.from(\"test#One\")),\n                    ),\n                ),\n            )\n        val transformed =\n            AwsPresigningDecorator(\n                mapOf(ShapeId.from(\"test#One\") to presignableOp),\n            ).transformModel(serviceShape, model, settings)\n\n        val index = HttpBindingIndex(transformed)\n        index.getRequestBindings(ShapeId.from(\"test.synthetic.aws.presigned#One\")).map { (key, value) ->\n            key to value.location\n        }.toMap() shouldBe\n            mapOf(\n                \"one\" to HttpBinding.Location.HEADER,\n                \"two\" to HttpBinding.Location.QUERY,\n                \"three\" to HttpBinding.Location.QUERY,\n                \"four\" to HttpBinding.Location.QUERY,\n            )\n\n        transformed.getShape(ShapeId.from(\"test.synthetic.aws.presigned#Two\")).orNull() shouldBe null\n        index.getRequestBindings(ShapeId.from(\"test#Two\")).map { (key, value) ->\n            key to value.location\n        }.toMap() shouldBe\n            mapOf(\n                \"one\" to HttpBinding.Location.HEADER,\n                \"two\" to HttpBinding.Location.QUERY,\n                \"three\" to HttpBinding.Location.DOCUMENT,\n                \"four\" to HttpBinding.Location.DOCUMENT,\n            )\n    }\n}\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/test/kotlin/software/amazon/smithy/rustsdk/CredentialProviderConfigTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rustsdk\n\nimport SdkCodegenIntegrationTest\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.testutil.integrationTest\nimport software.amazon.smithy.rust.codegen.core.testutil.tokioTest\n\ninternal class CredentialProviderConfigTest {\n    @Test\n    fun `configuring credentials provider at operation level should work`() {\n        awsSdkIntegrationTest(SdkCodegenIntegrationTest.model) { ctx, rustCrate ->\n            val rc = ctx.runtimeConfig\n            val codegenScope =\n                arrayOf(\n                    *RuntimeType.preludeScope,\n                    \"capture_request\" to RuntimeType.captureRequest(rc),\n                    \"Credentials\" to\n                        AwsRuntimeType.awsCredentialTypesTestUtil(rc)\n                            .resolve(\"Credentials\"),\n                    \"Region\" to AwsRuntimeType.awsTypes(rc).resolve(\"region::Region\"),\n                )\n            rustCrate.integrationTest(\"credentials_provider\") {\n                // per https://github.com/awslabs/aws-sdk-rust/issues/901\n                tokioTest(\"configuring_credentials_provider_at_operation_level_should_work\") {\n                    val moduleName = ctx.moduleUseName()\n                    rustTemplate(\n                        \"\"\"\n                        let (http_client, _rx) = #{capture_request}(#{None});\n                        let client_config = $moduleName::Config::builder()\n                            .http_client(http_client)\n                            .build();\n\n                        let client = $moduleName::Client::from_conf(client_config);\n\n                        let credentials = #{Credentials}::new(\n                            \"test\",\n                            \"test\",\n                            #{None},\n                            #{None},\n                            \"test\",\n                        );\n                        let operation_config_override = $moduleName::Config::builder()\n                            .credentials_provider(credentials.clone())\n                            .region(#{Region}::new(\"us-west-2\"));\n\n                        let _ = client\n                            .some_operation()\n                            .customize()\n                            .config_override(operation_config_override)\n                            .send()\n                            .await\n                            .expect(\"success\");\n                        \"\"\",\n                        *codegenScope,\n                    )\n                }\n            }\n        }\n    }\n\n    @Test\n    fun `configuring credentials provider on builder should replace what was previously set`() {\n        awsSdkIntegrationTest(SdkCodegenIntegrationTest.model) { ctx, rustCrate ->\n            val rc = ctx.runtimeConfig\n            val codegenScope =\n                arrayOf(\n                    *RuntimeType.preludeScope,\n                    \"capture_request\" to RuntimeType.captureRequest(rc),\n                    \"Credentials\" to\n                        AwsRuntimeType.awsCredentialTypesTestUtil(rc)\n                            .resolve(\"Credentials\"),\n                    \"Region\" to AwsRuntimeType.awsTypes(rc).resolve(\"region::Region\"),\n                    \"SdkConfig\" to AwsRuntimeType.awsTypes(rc).resolve(\"sdk_config::SdkConfig\"),\n                    \"SharedCredentialsProvider\" to\n                        AwsRuntimeType.awsCredentialTypes(rc)\n                            .resolve(\"provider::SharedCredentialsProvider\"),\n                )\n            rustCrate.integrationTest(\"credentials_provider\") {\n                // per https://github.com/awslabs/aws-sdk-rust/issues/973\n                tokioTest(\"configuring_credentials_provider_on_builder_should_replace_what_was_previously_set\") {\n                    val moduleName = ctx.moduleUseName()\n                    rustTemplate(\n                        \"\"\"\n                        let (http_client, rx) = #{capture_request}(#{None});\n\n                        let replace_me = #{Credentials}::new(\n                            \"replace_me\",\n                            \"replace_me\",\n                            #{None},\n                            #{None},\n                            \"replace_me\",\n                        );\n                        let sdk_config = #{SdkConfig}::builder()\n                            .credentials_provider(\n                                #{SharedCredentialsProvider}::new(replace_me),\n                            )\n                            .region(#{Region}::new(\"us-west-2\"))\n                            .build();\n\n                        let expected = #{Credentials}::new(\n                            \"expected_credential\",\n                            \"expected_credential\",\n                            #{None},\n                            #{None},\n                            \"expected_credential\",\n                        );\n                        let conf = $moduleName::config::Builder::from(&sdk_config)\n                            .http_client(http_client)\n                            .credentials_provider(expected)\n                            .build();\n\n                        let client = $moduleName::Client::from_conf(conf);\n\n                        let _ = client\n                            .neat_operation()\n                            .send()\n                            .await\n                            .expect(\"success\");\n\n                        let req = rx.expect_request();\n                        let auth_header = req.headers().get(\"AUTHORIZATION\").unwrap();\n                        assert!(auth_header.contains(\"expected_credential\"), \"{auth_header}\");\n                        \"\"\",\n                        *codegenScope,\n                    )\n                }\n            }\n        }\n    }\n\n    @Test\n    fun `config override credentials should not leak and should be cached across retries`() {\n        awsSdkIntegrationTest(SdkCodegenIntegrationTest.model) { ctx, rustCrate ->\n            val rc = ctx.runtimeConfig\n            val codegenScope =\n                arrayOf(\n                    *RuntimeType.preludeScope,\n                    \"Credentials\" to\n                        AwsRuntimeType.awsCredentialTypesTestUtil(rc)\n                            .resolve(\"Credentials\"),\n                    \"Region\" to AwsRuntimeType.awsTypes(rc).resolve(\"region::Region\"),\n                    \"ProvideCredentials\" to\n                        AwsRuntimeType.awsCredentialTypes(rc)\n                            .resolve(\"provider::ProvideCredentials\"),\n                    \"ProvideCredentialsFuture\" to\n                        AwsRuntimeType.awsCredentialTypes(rc)\n                            .resolve(\"provider::future::ProvideCredentials\"),\n                    \"RetryConfig\" to\n                        RuntimeType.smithyTypes(rc).resolve(\"retry::RetryConfig\"),\n                    \"SharedAsyncSleep\" to\n                        RuntimeType.smithyAsync(rc).resolve(\"rt::sleep::SharedAsyncSleep\"),\n                    \"TokioSleep\" to\n                        CargoDependency.smithyAsync(rc).withFeature(\"rt-tokio\")\n                            .toType().resolve(\"rt::sleep::TokioSleep\"),\n                )\n            val moduleName = ctx.moduleUseName()\n            rustCrate.integrationTest(\"credentials_provider\") {\n                addDependency(CargoDependency.TracingTest.toDevDependency())\n                addDependency(CargoDependency.Tracing.toDevDependency())\n                addDependency(CargoDependency.Tokio.toDevDependency().withFeature(\"test-util\"))\n\n                rustTemplate(\n                    \"\"\"\n                    ##[tracing_test::traced_test]\n                    ##[::tokio::test]\n                    async fn config_override_credentials_should_not_grow_client_cache_partitions() {\n                        use aws_smithy_runtime::client::http::test_util::infallible_client_fn;\n                        use aws_smithy_types::body::SdkBody;\n\n                        let http_client = infallible_client_fn(|_req| {\n                            http::Response::builder().body(SdkBody::empty()).unwrap()\n                        });\n                        let client_config = $moduleName::Config::builder()\n                            .http_client(http_client)\n                            .credentials_provider(#{Credentials}::new(\"base\", \"base\", #{None}, #{None}, \"base\"))\n                            .region(#{Region}::new(\"us-west-2\"))\n                            .build();\n                        let client = $moduleName::Client::from_conf(client_config);\n\n                        // Make one call without config_override to establish the baseline partition\n                        let _ = client.some_operation().send().await;\n\n                        // Now make 10 calls, each with a different credentials provider via config_override\n                        for i in 0..10 {\n                            let creds = #{Credentials}::new(\n                                format!(\"akid_{i}\"), format!(\"secret_{i}\"), #{None}, #{None}, \"test\",\n                            );\n                            let _ = client\n                                .some_operation()\n                                .customize()\n                                .config_override($moduleName::Config::builder().credentials_provider(creds))\n                                .send()\n                                .await;\n                        }\n\n                        // The client-level identity cache should not have grown beyond the initial\n                        // partition. Each config_override gets its own short-lived cache, so the\n                        // client cache should still have partition_count=1.\n                        // If the client cache grew, it would log partition_count=2 on the second\n                        // override — which is the first sign of the leak this test guards against.\n                        assert!(logs_contain(\"partition_count=1\"));\n                        assert!(!logs_contain(\"partition_count=2\"));\n                    }\n\n                    ##[::tokio::test]\n                    async fn config_override_credentials_are_cached_across_retries() {\n                        use std::sync::{Arc, Mutex};\n                        use aws_smithy_runtime::client::http::test_util::{ReplayEvent, StaticReplayClient};\n                        use aws_smithy_types::body::SdkBody;\n\n                        // A credentials provider backed by a list. Each call to provide_credentials\n                        // removes and returns the first element. If the cache works, only the first\n                        // element should be consumed; the second should remain.\n                        ##[derive(Debug, Clone)]\n                        struct CredentialsList(Arc<Mutex<Vec<#{Credentials}>>>);\n                        impl #{ProvideCredentials} for CredentialsList {\n                            fn provide_credentials<'a>(&'a self) -> #{ProvideCredentialsFuture}<'a>\n                            where Self: 'a,\n                            {\n                                let next = self.0.lock().unwrap().remove(0);\n                                #{ProvideCredentialsFuture}::ready(#{Ok}(next))\n                            }\n                        }\n\n                        let http_client = StaticReplayClient::new(vec![\n                            // First attempt: 500 triggers retry\n                            ReplayEvent::new(\n                                http::Request::builder().body(SdkBody::from(\"\")).unwrap(),\n                                http::Response::builder().status(500).body(SdkBody::from(\"{}\")).unwrap(),\n                            ),\n                            // Second attempt: 200 succeeds\n                            ReplayEvent::new(\n                                http::Request::builder().body(SdkBody::from(\"\")).unwrap(),\n                                http::Response::builder().status(200).body(SdkBody::from(\"{}\")).unwrap(),\n                            ),\n                        ]);\n\n                        let client_config = $moduleName::Config::builder()\n                            .http_client(http_client)\n                            .credentials_provider(#{Credentials}::new(\"base\", \"base\", #{None}, #{None}, \"base\"))\n                            .region(#{Region}::new(\"us-west-2\"))\n                            .retry_config(#{RetryConfig}::standard())\n                            .sleep_impl(#{SharedAsyncSleep}::new(#{TokioSleep}::new()))\n                            .build();\n                        let client = $moduleName::Client::from_conf(client_config);\n\n                        let creds_list = Arc::new(Mutex::new(vec![\n                            #{Credentials}::new(\"first\", \"first\", #{None}, #{None}, \"first\"),\n                            #{Credentials}::new(\"second\", \"second\", #{None}, #{None}, \"second\"),\n                        ]));\n                        let override_provider = CredentialsList(creds_list.clone());\n\n                        let _ = client\n                            .some_operation()\n                            .customize()\n                            .config_override(\n                                $moduleName::Config::builder().credentials_provider(override_provider),\n                            )\n                            .send()\n                            .await;\n\n                        // Only the first credentials should have been consumed. The retry should\n                        // have served the identity from the operation-scoped cache, leaving the\n                        // second credentials untouched.\n                        let remaining = creds_list.lock().unwrap();\n                        assert_eq!(\n                            1,\n                            remaining.len(),\n                            \"expected one credentials remaining (retry should use cache), but found {}\",\n                            remaining.len(),\n                        );\n                        assert_eq!(\"second\", remaining[0].access_key_id());\n                    }\n                    \"\"\",\n                    *codegenScope,\n                )\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/test/kotlin/software/amazon/smithy/rustsdk/EndpointBuiltInsDecoratorTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rustsdk\n\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenContext\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.integrationTest\nimport software.amazon.smithy.rust.codegen.core.testutil.tokioTest\nimport software.amazon.smithy.rust.codegen.core.util.dq\n\nclass EndpointBuiltInsDecoratorTest {\n    @Test\n    fun endpointUrlBuiltInWorksEndToEnd() {\n        val endpointUrlModel =\n            \"\"\"\n            namespace test\n\n            use aws.api#service\n            use aws.auth#sigv4\n            use aws.protocols#restJson1\n            use smithy.rules#endpointRuleSet\n\n            @service(sdkId: \"dontcare\")\n            @restJson1\n            @sigv4(name: \"dontcare\")\n            @auth([sigv4])\n            @endpointRuleSet({\n                \"version\": \"1.0\"\n                \"parameters\": {\n                    \"endpoint\": { \"required\": false, \"type\": \"string\", \"builtIn\": \"SDK::Endpoint\" },\n                    \"region\": { \"required\": false, \"type\": \"String\", \"builtIn\": \"AWS::Region\" },\n                }\n                \"rules\": [\n                    {\n                        \"type\": \"endpoint\"\n                        \"conditions\": [\n                            {\"fn\": \"isSet\", \"argv\": [{\"ref\": \"endpoint\"}]},\n                            {\"fn\": \"isSet\", \"argv\": [{\"ref\": \"region\"}]},\n                        ],\n                        \"endpoint\": {\n                            \"url\": \"{endpoint}\"\n                            \"properties\": {\n                                \"authSchemes\": [{\"name\": \"sigv4\",\"signingRegion\": \"{region}\", \"signingName\": \"dontcare\"}]\n                            }\n                        }\n                    },\n                    {\n                        \"type\": \"endpoint\"\n                        \"conditions\": [\n                            {\"fn\": \"isSet\", \"argv\": [{\"ref\": \"region\"}]},\n                        ],\n                        \"endpoint\": {\n                            \"url\": \"https://WRONG/\"\n                            \"properties\": {\n                                \"authSchemes\": [{\"name\": \"sigv4\", \"signingRegion\": \"{region}\", \"signingName\": \"dontcare\"}]\n                            }\n                        }\n                    }\n                ]\n            })\n            service TestService {\n                version: \"2023-01-01\",\n                operations: [SomeOperation]\n            }\n\n            structure SomeOutput {\n                someAttribute: Long,\n                someVal: String\n            }\n\n            @http(uri: \"/SomeOperation\", method: \"GET\")\n            @optionalAuth\n            operation SomeOperation {\n                output: SomeOutput\n            }\n            \"\"\".asSmithyModel(smithyVersion = \"2.0\")\n\n        awsSdkIntegrationTest(endpointUrlModel) { codegenContext, rustCrate ->\n            rustCrate.integrationTest(\"endpoint_url_built_in_works\") {\n                val module = codegenContext.moduleUseName()\n                rustTemplate(\n                    \"\"\"\n                    use $module::{Config, Client, config::Region};\n\n                    ##[#{tokio}::test]\n                    async fn endpoint_url_built_in_works() {\n                        let http_client = #{StaticReplayClient}::new(\n                            vec![#{ReplayEvent}::new(\n                                http::Request::builder()\n                                    .uri(\"https://RIGHT/SomeOperation\")\n                                    .body(#{SdkBody}::empty())\n                                    .unwrap(),\n                                http::Response::builder().status(200).body(#{SdkBody}::empty()).unwrap()\n                            )],\n                        );\n                        let config = Config::builder()\n                            .http_client(http_client.clone())\n                            .region(Region::new(\"us-east-1\"))\n                            .endpoint_url(\"https://RIGHT\")\n                            .build();\n                        let client = Client::from_conf(config);\n                        dbg!(client.some_operation().send().await).expect(\"success\");\n                        http_client.assert_requests_match(&[]);\n                    }\n                    \"\"\",\n                    \"tokio\" to CargoDependency.Tokio.toDevDependency().withFeature(\"rt\").withFeature(\"macros\").toType(),\n                    \"StaticReplayClient\" to\n                        CargoDependency.smithyHttpClientTestUtil(codegenContext.runtimeConfig).toType()\n                            .resolve(\"test_util::StaticReplayClient\"),\n                    \"ReplayEvent\" to\n                        CargoDependency.smithyHttpClientTestUtil(codegenContext.runtimeConfig).toType()\n                            .resolve(\"test_util::ReplayEvent\"),\n                    \"SdkBody\" to RuntimeType.sdkBody(codegenContext.runtimeConfig),\n                )\n            }\n        }\n    }\n\n    private fun modelWithAccountId(authAnnotation: String? = null) =\n        \"\"\"\n        namespace test\n\n        use aws.api#service\n        use aws.protocols#restJson1\n        use smithy.rules#endpointRuleSet\n\n        @service(sdkId: \"dontcare\")\n        @restJson1\n        \"\"\" + (authAnnotation.orEmpty()) +\n            \"\"\"\n            @suppress([\"RuleSetAwsBuiltIn.AWS::Auth::AccountId\", \"RuleSetAwsBuiltIn.AWS::Auth::AccountIdEndpointMode\"])\n            @endpointRuleSet({\n                \"version\": \"1.0\"\n                \"parameters\": {\n                    \"endpoint\": { \"required\": false, \"type\": \"string\", \"builtIn\": \"SDK::Endpoint\" },\n                    \"region\": { \"required\": false, \"type\": \"String\", \"builtIn\": \"AWS::Region\" },\n                    \"accountId\": { \"required\": false, \"type\": \"String\", \"builtIn\": \"AWS::Auth::AccountId\" },\n                    \"accountIdEndpointMode\": { \"required\": false, \"type\": \"String\", \"builtIn\": \"AWS::Auth::AccountIdEndpointMode\" },\n                }\n                \"rules\": [\n                    {\n                        \"type\": \"endpoint\"\n                        \"conditions\": [\n                            {\"fn\": \"isSet\", \"argv\": [{\"ref\": \"region\"}]},\n                            {\n                                \"fn\": \"not\",\n                                \"argv\": [\n                                    {\n                                        \"fn\": \"isSet\",\n                                        \"argv\": [\n                                            {\"ref\": \"accountId\"}\n                                        ]\n                                    }\n                                ]\n                            }\n                        ],\n                        \"endpoint\": {\n                            \"url\": \"https://ACCOUNT-ID-NOT-SET/\"\n                        }\n                    },\n                    {\n                        \"type\": \"endpoint\"\n                        \"conditions\": [\n                            {\"fn\": \"isSet\", \"argv\": [{\"ref\": \"region\"}]},\n                            {\n                                \"fn\": \"isSet\",\n                                \"argv\": [\n                                    {\"ref\": \"accountId\"}\n                                ]\n                            }\n                        ],\n                        \"endpoint\": {\n                            \"url\": \"https://ACCOUNT-ID-SET/\"\n                        }\n                    }\n                ]\n            })\n            service TestService {\n                version: \"2023-01-01\",\n                operations: [SomeOperation]\n            }\n\n            structure SomeOutput {\n                someAttribute: Long,\n                someVal: String\n            }\n\n            @http(uri: \"/SomeOperation\", method: \"GET\")\n            operation SomeOperation {\n                output: SomeOutput\n            }\n            \"\"\"\n\n    @Test\n    fun accountIdBuiltInParam() {\n        fun runTest(\n            expectedUrl: String,\n            credentialsProvider: (CodegenContext) -> Writable,\n            authAnnotation: String? = null,\n        ) {\n            awsSdkIntegrationTest(modelWithAccountId(authAnnotation).asSmithyModel(smithyVersion = \"2.0\")) { ctx, rustCrate ->\n                rustCrate.integrationTest(\"account_id_built_in_param\") {\n                    tokioTest(\"should_work\") {\n                        val module = ctx.moduleUseName()\n                        rustTemplate(\n                            \"\"\"\n                            use $module::{Config, Client, config::Region};\n\n                            let (conn, req) = #{capture_request}(None);\n                            let config = Config::builder()\n                                #{creds_provider}\n                                .http_client(conn)\n                                .region(Region::new(\"us-east-1\"))\n                                .build();\n                            let client = Client::from_conf(config);\n                            let _ = dbg!(client.some_operation().send().await);\n                            let req = req.expect_request();\n                            assert_eq!(${expectedUrl.dq()}, req.uri());\n                            \"\"\",\n                            \"capture_request\" to RuntimeType.captureRequest(ctx.runtimeConfig),\n                            \"creds_provider\" to credentialsProvider(ctx),\n                        )\n                    }\n                }\n            }\n        }\n\n        // The model uses no authentication (`NoAuthScheme`), causing  `NoAuthIdentityResolver` to resolve a\n        // `NoAuthIdentity`. Since `NoAuthIdentity` lacks an account ID, this test is intended\n        // to exercise an endpoint rule whose condition expects the account ID to be unset.\n        runTest(\"https://ACCOUNT-ID-NOT-SET/SomeOperation\", { _ -> writable {} })\n\n        // The model uses SigV4 authentication, with the credentials provider returning credentials\n        // containing an account ID. This should exercise an endpoint rule whose condition expects the account ID to\n        // be set.\n        runTest(\n            \"https://ACCOUNT-ID-SET/SomeOperation\",\n            { ctx ->\n                writable {\n                    rustTemplate(\n                        \"\"\"\n                        .credentials_provider(\n                            #{SharedCredentialsProvider}::new(\n                                #{CredentialsBuilder}::for_tests()\n                                    .account_id(\"123456789012\")\n                                    .build()\n                            )\n                        )\n                        \"\"\",\n                        \"SharedCredentialsProvider\" to\n                            AwsRuntimeType.awsCredentialTypes(ctx.runtimeConfig)\n                                .resolve(\"provider::SharedCredentialsProvider\"),\n                        \"CredentialsBuilder\" to\n                            AwsRuntimeType.awsCredentialTypesTestUtil(ctx.runtimeConfig)\n                                .resolve(\"CredentialsBuilder\"),\n                    )\n                }\n            },\n            \"@aws.auth#sigv4(name: \\\"donotcare\\\")\\n\",\n        )\n    }\n}\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/test/kotlin/software/amazon/smithy/rustsdk/EndpointOverrideMetricDecoratorTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rustsdk\n\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.rust.codegen.core.rustlang.Feature\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.integrationTest\nimport software.amazon.smithy.rust.codegen.core.testutil.tokioTest\n\nclass EndpointOverrideMetricDecoratorTest {\n    companion object {\n        private const val PREFIX = \"\\$version: \\\"2\\\"\"\n        val model =\n            \"\"\"\n            $PREFIX\n            namespace test\n\n            use aws.api#service\n            use aws.auth#sigv4\n            use aws.protocols#restJson1\n            use smithy.rules#endpointRuleSet\n\n            @service(sdkId: \"dontcare\")\n            @restJson1\n            @sigv4(name: \"dontcare\")\n            @auth([sigv4])\n            @endpointRuleSet({\n                \"version\": \"1.0\",\n                \"rules\": [\n                    {\n                        \"type\": \"endpoint\",\n                        \"conditions\": [\n                            { \"fn\": \"isSet\", \"argv\": [{ \"ref\": \"Endpoint\" }] }\n                        ],\n                        \"endpoint\": { \"url\": { \"ref\": \"Endpoint\" } }\n                    },\n                    {\n                        \"type\": \"endpoint\",\n                        \"conditions\": [],\n                        \"endpoint\": { \"url\": \"https://example.com\" }\n                    }\n                ],\n                \"parameters\": {\n                    \"Region\": { \"required\": false, \"type\": \"String\", \"builtIn\": \"AWS::Region\" },\n                    \"Endpoint\": { \"required\": false, \"type\": \"String\", \"builtIn\": \"SDK::Endpoint\" }\n                }\n            })\n            service TestService {\n                version: \"2023-01-01\",\n                operations: [SomeOperation]\n            }\n\n            @http(uri: \"/SomeOperation\", method: \"GET\")\n            @optionalAuth\n            operation SomeOperation {\n                input: SomeInput,\n                output: SomeOutput\n            }\n\n            @input\n            structure SomeInput {}\n\n            @output\n            structure SomeOutput {}\n            \"\"\".asSmithyModel()\n    }\n\n    @Test\n    fun `decorator is registered in AwsCodegenDecorator list`() {\n        val decoratorNames = DECORATORS.map { it.name }\n        assert(decoratorNames.contains(\"EndpointOverrideMetric\")) {\n            \"EndpointOverrideMetricDecorator should be registered in DECORATORS list. Found: $decoratorNames\"\n        }\n    }\n\n    @Test\n    fun `endpoint override metric appears when set via SdkConfig`() {\n        val testParams = awsIntegrationTestParams()\n\n        awsSdkIntegrationTest(\n            model,\n            testParams,\n        ) { context, rustCrate ->\n            val rc = context.runtimeConfig\n            val moduleName = context.moduleUseName()\n\n            // Enable test-util feature for aws-runtime\n            rustCrate.mergeFeature(Feature(\"test-util\", true, listOf(\"aws-runtime/test-util\")))\n\n            rustCrate.integrationTest(\"endpoint_override_via_sdk_config\") {\n                tokioTest(\"metric_tracked_when_endpoint_set_via_sdk_config\") {\n                    rustTemplate(\n                        \"\"\"\n                        use $moduleName::config::Region;\n                        use $moduleName::Client;\n                        use #{capture_request};\n                        use #{assert_ua_contains_metric_values};\n\n                        let (http_client, rcvr) = capture_request(None);\n\n                        // Create SdkConfig with endpoint URL\n                        let sdk_config = #{SdkConfig}::builder()\n                            .region(Region::new(\"us-east-1\"))\n                            .endpoint_url(\"https://sdk-custom.example.com\")\n                            .http_client(http_client.clone())\n                            .build();\n\n                        // Create client from SdkConfig\n                        let client = Client::new(&sdk_config);\n\n                        // Make a request\n                        let _ = client.some_operation().send().await;\n\n                        // Verify the request\n                        let request = rcvr.expect_request();\n\n                        // Verify endpoint was overridden\n                        let uri = request.uri().to_string();\n                        assert!(\n                            uri.starts_with(\"https://sdk-custom.example.com\"),\n                            \"Expected SDK custom endpoint, got: {}\",\n                            uri\n                        );\n\n                        // Verify metric 'N' is present in x-amz-user-agent header\n                        let user_agent = request\n                            .headers()\n                            .get(\"x-amz-user-agent\")\n                            .expect(\"x-amz-user-agent header missing\");\n\n                        assert_ua_contains_metric_values(user_agent, &[\"N\"]);\n                        \"\"\",\n                        *preludeScope,\n                        \"capture_request\" to RuntimeType.captureRequest(rc),\n                        \"assert_ua_contains_metric_values\" to AwsRuntimeType.awsRuntime(rc).resolve(\"user_agent::test_util::assert_ua_contains_metric_values\"),\n                        \"SdkConfig\" to AwsRuntimeType.awsTypes(rc).resolve(\"sdk_config::SdkConfig\"),\n                    )\n                }\n            }\n        }\n    }\n\n    @Test\n    fun `no endpoint override metric when endpoint not set`() {\n        val testParams = awsIntegrationTestParams()\n\n        awsSdkIntegrationTest(\n            model,\n            testParams,\n        ) { context, rustCrate ->\n            val rc = context.runtimeConfig\n            val moduleName = context.moduleUseName()\n\n            // Enable test-util feature for aws-runtime\n            rustCrate.mergeFeature(Feature(\"test-util\", true, listOf(\"aws-runtime/test-util\")))\n\n            rustCrate.integrationTest(\"no_endpoint_override\") {\n                tokioTest(\"no_metric_when_endpoint_not_overridden\") {\n                    rustTemplate(\n                        \"\"\"\n                        use $moduleName::config::{Credentials, Region, SharedCredentialsProvider};\n                        use $moduleName::{Config, Client};\n                        use #{capture_request};\n\n                        let (http_client, rcvr) = capture_request(None);\n\n                        // Create config WITHOUT endpoint override\n                        let config = Config::builder()\n                            .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests()))\n                            .region(Region::new(\"us-east-1\"))\n                            .http_client(http_client.clone())\n                            .build();\n                        let client = Client::from_conf(config);\n\n                        // Make a request\n                        let _ = client.some_operation().send().await;\n\n                        // Verify the request\n                        let request = rcvr.expect_request();\n\n                        // Verify default endpoint was used\n                        let uri = request.uri().to_string();\n                        assert!(\n                            uri.starts_with(\"https://example.com\"),\n                            \"Expected default endpoint, got: {}\",\n                            uri\n                        );\n\n                        // Verify metric 'N' is NOT present\n                        let user_agent = request\n                            .headers()\n                            .get(\"x-amz-user-agent\")\n                            .expect(\"x-amz-user-agent header should be present\");\n\n                        assert!(\n                            !user_agent.contains(\"m/N\"),\n                            \"Metric 'N' should NOT be present when endpoint not overridden\"\n                        );\n                        \"\"\",\n                        *preludeScope,\n                        \"capture_request\" to RuntimeType.captureRequest(rc),\n                    )\n                }\n\n                // Add a should_panic test to verify assert_ua_contains_metric_values panics when metric is not present\n                rust(\"##[should_panic(expected = \\\"metric values\\\")]\")\n                tokioTest(\"assert_panics_when_metric_not_present\") {\n                    rustTemplate(\n                        \"\"\"\n                        use $moduleName::config::{Credentials, Region, SharedCredentialsProvider};\n                        use $moduleName::{Config, Client};\n                        use #{capture_request};\n                        use #{assert_ua_contains_metric_values};\n\n                        let (http_client, rcvr) = capture_request(None);\n\n                        let config = Config::builder()\n                            .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests()))\n                            .region(Region::new(\"us-east-1\"))\n                            .http_client(http_client.clone())\n                            .build();\n                        let client = Client::from_conf(config);\n\n                        let _ = client.some_operation().send().await;\n                        let request = rcvr.expect_request();\n                        let user_agent = request.headers().get(\"x-amz-user-agent\").unwrap();\n\n                        // This should panic because 'N' is not present\n                        assert_ua_contains_metric_values(user_agent, &[\"N\"]);\n                        \"\"\",\n                        *preludeScope,\n                        \"capture_request\" to RuntimeType.captureRequest(rc),\n                        \"assert_ua_contains_metric_values\" to AwsRuntimeType.awsRuntime(rc).resolve(\"user_agent::test_util::assert_ua_contains_metric_values\"),\n                    )\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/test/kotlin/software/amazon/smithy/rustsdk/EndpointsCredentialsTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rustsdk\n\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.integrationTest\nimport software.amazon.smithy.rust.codegen.core.testutil.tokioTest\n\n/**\n * A test to ensure that authentication parameters flow properly in the case where they are set as well as the case\n * where they are not\n */\nclass EndpointsCredentialsTest {\n    // This model has two endpoint rule paths:\n    // 1. A rule that sets no authentication scheme—in this case, we should be using the default from the service\n    // 2. A rule that sets a custom authentication scheme and that configures signing\n    // The chosen path is controlled by static context parameters set on the operation\n    private val model =\n        \"\"\"\n        namespace aws.fooBaz\n\n        use aws.api#service\n        use aws.auth#sigv4\n        use aws.protocols#restJson1\n        use smithy.rules#endpointRuleSet\n        use smithy.rules#staticContextParams\n        use smithy.rules#clientContextParams\n\n        @service(sdkId: \"Some Value\")\n        @title(\"Test Auth Service\")\n        @sigv4(name: \"foobaz\")\n        @endpointRuleSet({\n            \"version\": \"1.0\",\n            \"rules\": [{\n                          \"type\": \"endpoint\",\n                          \"conditions\": [{\"fn\": \"isSet\", \"argv\": [{\"ref\": \"AuthMode\"}]}, {\"fn\": \"stringEquals\", \"argv\": [{\"ref\": \"AuthMode\"}, \"default-auth\"]}],\n                          \"endpoint\": { \"url\": \"https://example.com\" }\n                      },{\n                          \"type\": \"endpoint\",\n                          \"conditions\": [{\"fn\": \"isSet\", \"argv\": [{\"ref\": \"AuthMode\"}]}],\n                          \"endpoint\": {\n                            \"url\": \"https://example.com\"\n                            \"properties\": {\n                                \"authSchemes\": [{\n                                    \"name\": \"sigv4\",\n                                    \"signingRegion\": \"region-{AuthMode}\",\n                                    \"signingName\": \"name-{AuthMode}\"\n                                }]\n                            }\n                          }\n                      }],\n            \"parameters\": {\n                \"AuthMode\": { \"required\": false, \"type\": \"String\" },\n                \"Region\": { \"required\": false, \"type\": \"String\", \"builtIn\": \"AWS::Region\" },\n            }\n        })\n        @restJson1\n        service FooBaz {\n            version: \"2018-03-17\",\n            operations: [DefaultAuth, CustomAuth]\n        }\n\n        @http(uri: \"/default\", method: \"GET\")\n        @staticContextParams({ AuthMode: { value: \"default-auth\" } })\n        operation DefaultAuth { }\n\n\n        @http(uri: \"/custom\", method: \"GET\")\n        @staticContextParams({ AuthMode: { value: \"custom-auth\" } })\n        operation CustomAuth { }\n        \"\"\".asSmithyModel()\n\n    @Test\n    fun `endpoint rules configure auth in default and non-default case`() {\n        awsSdkIntegrationTest(model) { context, rustCrate ->\n            val moduleName = context.moduleUseName()\n            rustCrate.integrationTest(\"endpoints_auth\") {\n                // assert that a rule with no default auth works properly\n                tokioTest(\"default_auth\") {\n                    rustTemplate(\n                        \"\"\"\n                        let (http_client, rcvr) = #{capture_request}(None);\n                        let conf = $moduleName::Config::builder()\n                            .http_client(http_client)\n                            .region(#{Region}::new(\"us-west-2\"))\n                            .credentials_provider(#{Credentials}::for_tests())\n                            .build();\n                        let client = $moduleName::Client::from_conf(conf);\n                        let _ = client.default_auth().send().await;\n                        let req = rcvr.expect_request();\n                        let auth_header = req.headers().get(\"AUTHORIZATION\").unwrap();\n                        assert!(auth_header.contains(\"/us-west-2/foobaz/aws4_request\"), \"{}\", auth_header);\n                        \"\"\",\n                        \"capture_request\" to RuntimeType.captureRequest(context.runtimeConfig),\n                        \"Credentials\" to\n                            AwsRuntimeType.awsCredentialTypesTestUtil(context.runtimeConfig)\n                                .resolve(\"Credentials\"),\n                        \"Region\" to AwsRuntimeType.awsTypes(context.runtimeConfig).resolve(\"region::Region\"),\n                    )\n                }\n\n                // assert that auth scheme in the custom case flows through\n                tokioTest(\"custom_auth\") {\n                    rustTemplate(\n                        \"\"\"\n                        let (http_client, rcvr) = #{capture_request}(None);\n                        let conf = $moduleName::Config::builder()\n                            .http_client(http_client)\n                            .region(#{Region}::new(\"us-west-2\"))\n                            .credentials_provider(#{Credentials}::for_tests())\n                            .build();\n                        let client = $moduleName::Client::from_conf(conf);\n                        let _ = dbg!(client.custom_auth().send().await);\n                        let req = rcvr.expect_request();\n                        let auth_header = req.headers().get(\"AUTHORIZATION\").unwrap();\n                        assert!(auth_header.contains(\"/region-custom-auth/name-custom-auth/aws4_request\"), \"{}\", auth_header);\n                        \"\"\",\n                        \"capture_request\" to RuntimeType.captureRequest(context.runtimeConfig),\n                        \"Credentials\" to\n                            AwsRuntimeType.awsCredentialTypesTestUtil(context.runtimeConfig)\n                                .resolve(\"Credentials\"),\n                        \"Region\" to AwsRuntimeType.awsTypes(context.runtimeConfig).resolve(\"region::Region\"),\n                    )\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/test/kotlin/software/amazon/smithy/rustsdk/HttpChecksumTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rustsdk\n\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.Feature\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.join\nimport software.amazon.smithy.rust.codegen.core.rustlang.plus\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.integrationTest\nimport software.amazon.smithy.rust.codegen.core.util.dq\n\ninternal class HttpChecksumTest {\n    companion object {\n        private const val PREFIX = \"\\$version: \\\"2\\\"\"\n        private val model =\n            \"\"\"\n            $PREFIX\n            namespace test\n\n            use aws.api#service\n            use aws.auth#sigv4\n            use aws.protocols#httpChecksum\n            use aws.protocols#restJson1\n            use smithy.rules#endpointRuleSet\n\n            @service(sdkId: \"dontcare\")\n            @restJson1\n            @sigv4(name: \"dontcare\")\n            @auth([sigv4])\n            @endpointRuleSet({\n                \"version\": \"1.0\",\n                \"rules\": [{ \"type\": \"endpoint\", \"conditions\": [], \"endpoint\": { \"url\": \"https://example.com\" } }],\n                \"parameters\": {\n                    \"Region\": { \"required\": false, \"type\": \"String\", \"builtIn\": \"AWS::Region\" },\n                }\n            })\n            service TestService {\n                version: \"2023-01-01\",\n                operations: [HttpChecksumOperation, HttpChecksumStreamingOperation]\n            }\n\n            @http(uri: \"/HttpChecksumOperation\", method: \"POST\")\n            @optionalAuth\n            @httpChecksum(\n                requestChecksumRequired: true,\n                requestAlgorithmMember: \"checksumAlgorithm\",\n                requestValidationModeMember: \"validationMode\",\n                responseAlgorithms: [\"CRC32\", \"CRC32C\", \"CRC64NVME\", \"SHA1\", \"SHA256\"]\n            )\n            operation HttpChecksumOperation {\n                input: SomeInput,\n                output: SomeOutput\n            }\n\n            @input\n            structure SomeInput {\n                @httpHeader(\"x-amz-request-algorithm\")\n                checksumAlgorithm: ChecksumAlgorithm\n\n                @httpHeader(\"x-amz-response-validation-mode\")\n                validationMode: ValidationMode\n\n                @httpHeader(\"x-amz-checksum-crc32\")\n                ChecksumCRC32: String\n\n                @httpHeader(\"x-amz-checksum-crc32c\")\n                ChecksumCRC32C: String\n\n                @httpHeader(\"x-amz-checksum-crc64nvme\")\n                ChecksumCRC64Nvme: String\n\n                @httpHeader(\"x-amz-checksum-sha1\")\n                ChecksumSHA1: String\n\n                @httpHeader(\"x-amz-checksum-sha256\")\n                ChecksumSHA256: String\n\n                @httpHeader(\"x-amz-checksum-foo\")\n                ChecksumFoo: String\n\n                @httpPayload\n                @required\n                body: Blob\n            }\n\n            @output\n            structure SomeOutput {}\n\n            @http(uri: \"/HttpChecksumStreamingOperation\", method: \"POST\")\n            @optionalAuth\n            @httpChecksum(\n                requestChecksumRequired: true,\n                requestAlgorithmMember: \"checksumAlgorithm\",\n                requestValidationModeMember: \"validationMode\",\n                responseAlgorithms: [\"CRC32\", \"CRC32C\", \"CRC64NVME\", \"SHA1\", \"SHA256\"]\n            )\n            operation HttpChecksumStreamingOperation {\n                input: SomeStreamingInput,\n                output: SomeStreamingOutput\n            }\n\n            @streaming\n            blob StreamingBlob\n\n            @input\n            structure SomeStreamingInput {\n                @httpHeader(\"x-amz-request-algorithm\")\n                checksumAlgorithm: ChecksumAlgorithm\n\n                @httpHeader(\"x-amz-response-validation-mode\")\n                validationMode: ValidationMode\n\n                @httpPayload\n                @required\n                body: StreamingBlob\n            }\n\n            @output\n            structure SomeStreamingOutput {}\n\n            enum ChecksumAlgorithm {\n                CRC32\n                CRC32C\n                CRC64NVME\n                SHA1\n                SHA256\n            }\n\n            enum ValidationMode {\n                ENABLED\n            }\n            \"\"\".asSmithyModel()\n    }\n\n    @Test\n    fun requestResponseChecksumWorks() {\n        awsSdkIntegrationTest(\n            model,\n            // TODO(https://github.com/smithy-lang/smithy-rs/issues/4382): Remove this additional decorator\n            //  and update the test model above with a dedicated Smithy trait once available.\n            additionalDecorators = listOf(AwsChunkedContentEncodingDecorator()),\n        ) { context, rustCrate ->\n            // Allows us to use the user-agent test-utils in aws-runtime\n            rustCrate.mergeFeature(Feature(\"test-util\", true, listOf(\"aws-runtime/test-util\")))\n            val rc = context.runtimeConfig\n\n            // Create Writables for all test types\n            val checksumRequestTestWritables =\n                checksumRequestTests.map { createRequestChecksumCalculationTest(it, context) }.join(\"\\n\")\n            val checksumResponseSuccTestWritables =\n                checksumResponseSuccTests.map { createResponseChecksumValidationSuccessTest(it, context) }.join(\"\\n\")\n            val checksumResponseFailTestWritables =\n                checksumResponseFailTests.map { createResponseChecksumValidationFailureTest(it, context) }.join(\"\\n\")\n            val checksumStreamingRequestTestWritables =\n                streamingRequestTests.map { createStreamingRequestChecksumCalculationTest(it, context) }.join(\"\\n\")\n            val userProvidedChecksumTestWritables =\n                userProvidedChecksumTests.map { createUserProvidedChecksumsTest(it, context) }.join(\"\\n\")\n            val miscTests = createMiscellaneousTests(context)\n\n            // Shared imports for all test types\n            // Note about the `//#{PresigningMarker}` below. The `RequestChecksumInterceptor` relies on the `PresigningMarker` type from\n            // the presigning inlineable. The decorator for that inlineable doesn't play nicely with the test model from the SEP, so we\n            // use this as a kind of blunt way to include the presigning inlineable without actually wiring it up with the model.\n            // We also have to ensure the `http-1x` feature the presigning inlineable expects is present on the generated crate.\n            rustCrate.mergeFeature(\n                Feature(\n                    \"http-1x\",\n                    default = false,\n                    listOf(\"aws-smithy-runtime-api/http-1x\"),\n                ),\n            )\n\n            val testBase =\n                writable {\n                    rustTemplate(\n                        \"\"\"\n                        ##![cfg(feature = \"test-util\")]\n                        ##![allow(unused_imports)]\n\n                        use #{Blob};\n                        use #{Region};\n                        use #{pretty_assertions}::assert_eq;\n                        use #{SdkBody};\n                        use std::io::Write;\n                        use http_body_1x::Body;\n                        use http_body_util::BodyExt;\n                        use #{HttpRequest};\n                        use #{UaAssert};\n                        use #{UaExtract};\n                        //#{PresigningMarker};\n                        \"\"\",\n                        *preludeScope,\n                        \"Blob\" to RuntimeType.smithyTypes(rc).resolve(\"Blob\"),\n                        \"Region\" to AwsRuntimeType.awsTypes(rc).resolve(\"region::Region\"),\n                        \"pretty_assertions\" to CargoDependency.PrettyAssertions.toType(),\n                        \"SdkBody\" to RuntimeType.smithyTypes(rc).resolve(\"body::SdkBody\"),\n                        \"HttpRequest\" to RuntimeType.smithyRuntimeApi(rc).resolve(\"client::orchestrator::HttpRequest\"),\n                        \"UaAssert\" to\n                            AwsRuntimeType.awsRuntime(rc)\n                                .resolve(\"user_agent::test_util::assert_ua_contains_metric_values\"),\n                        \"UaExtract\" to\n                            AwsRuntimeType.awsRuntime(rc)\n                                .resolve(\"user_agent::test_util::extract_ua_values\"),\n                        \"PresigningMarker\" to AwsRuntimeType.presigning().resolve(\"PresigningMarker\"),\n                    )\n                }\n\n            // Create one integ test per test type\n            rustCrate.integrationTest(\"request_checksums\") {\n                testBase.plus(checksumRequestTestWritables)()\n            }\n\n            rustCrate.integrationTest(\"response_checksums_success\") {\n                testBase.plus(checksumResponseSuccTestWritables)()\n            }\n\n            rustCrate.integrationTest(\"response_checksums_fail\") {\n                testBase.plus(checksumResponseFailTestWritables)()\n            }\n\n            rustCrate.integrationTest(\"streaming_request_checksums\") {\n                testBase.plus(checksumStreamingRequestTestWritables)()\n            }\n\n            rustCrate.integrationTest(\"user_provided_checksums\") {\n                testBase.plus(userProvidedChecksumTestWritables)()\n            }\n\n            rustCrate.integrationTest(\"misc_tests\") {\n                testBase.plus(miscTests)()\n            }\n        }\n    }\n\n    /**\n     * Generate tests where the request checksum is calculated correctly\n     */\n    private fun createRequestChecksumCalculationTest(\n        testDef: RequestChecksumCalculationTest,\n        context: ClientCodegenContext,\n    ): Writable {\n        val rc = context.runtimeConfig\n        val moduleName = context.moduleUseName()\n        val algoLower = testDef.checksumAlgorithm.lowercase()\n        // If the algo is Crc32 don't explicitly set it to test that the default is correctly set\n        val setChecksumAlgo =\n            if (testDef.checksumAlgorithm != \"Crc32\") {\n                \".checksum_algorithm($moduleName::types::ChecksumAlgorithm::${testDef.checksumAlgorithm})\"\n            } else {\n                \"\"\n            }\n        return writable {\n            rustTemplate(\n                \"\"\"\n                //${testDef.docs}\n                ##[#{tokio}::test]\n                async fn ${algoLower}_request_checksums_work() {\n                    let (http_client, rx) = #{capture_request}(None);\n                    let config = $moduleName::Config::builder()\n                        .region(Region::from_static(\"doesntmatter\"))\n                        .with_test_defaults()\n                        .http_client(http_client)\n                        .build();\n\n                    let client = $moduleName::Client::from_conf(config);\n                    let _ = client.http_checksum_operation()\n                    .body(Blob::new(b\"${testDef.requestPayload}\"))\n                    $setChecksumAlgo\n                    .send()\n                    .await;\n                    let request = rx.expect_request();\n                    let ${algoLower}_header = request.headers()\n                        .get(\"x-amz-checksum-$algoLower\")\n                        .expect(\"x-amz-checksum-$algoLower header should exist\");\n\n                    assert_eq!(${algoLower}_header, \"${testDef.checksumHeader}\");\n\n                    let algo_header = request.headers()\n                        .get(\"x-amz-request-algorithm\")\n                        .expect(\"algo header should exist\");\n\n                    assert_eq!(algo_header, \"${testDef.algoHeader}\");\n\n                    // Check the user-agent metrics for the selected algo\n                    assert_ua_contains_metric_values(\n                        &request\n                            .headers()\n                            .get(\"x-amz-user-agent\")\n                            .expect(\"UA header should be present\"),\n                        &[\"${testDef.algoFeatureId}\"],\n                    );\n                }\n                \"\"\",\n                *preludeScope,\n                \"tokio\" to CargoDependency.Tokio.toType(),\n                \"capture_request\" to RuntimeType.captureRequest(rc),\n                \"http_1x\" to CargoDependency.Http1x.toType(),\n            )\n        }\n    }\n\n    /**\n     * Generate tests where the request is streaming and checksum is calculated correctly\n     */\n    private fun createStreamingRequestChecksumCalculationTest(\n        testDef: StreamingRequestChecksumCalculationTest,\n        context: ClientCodegenContext,\n    ): Writable {\n        val rc = context.runtimeConfig\n        val moduleName = context.moduleUseName()\n        val algoLower = testDef.checksumAlgorithm.lowercase()\n        // If the algo is Crc32 don't explicitly set it to test that the default is correctly set\n        val setChecksumAlgo =\n            if (testDef.checksumAlgorithm != \"Crc32\") {\n                \".checksum_algorithm($moduleName::types::ChecksumAlgorithm::${testDef.checksumAlgorithm})\"\n            } else {\n                \"\"\n            }\n        return writable {\n            rustTemplate(\n                \"\"\"\n                //${testDef.docs}\n                ##[#{tokio}::test]\n                async fn ${algoLower}_request_checksums_work() {\n                    let (http_client, rx) = #{capture_request}(None);\n                    let config = $moduleName::Config::builder()\n                        .region(Region::from_static(\"doesntmatter\"))\n                        .with_test_defaults()\n                        .http_client(http_client)\n                        .build();\n\n                    let client = $moduleName::Client::from_conf(config);\n\n                    let mut file = tempfile::NamedTempFile::new().unwrap();\n                    file.as_file_mut()\n                    .write_all(\"${testDef.requestPayload}\".as_bytes())\n                    .unwrap();\n\n                    let streaming_body = aws_smithy_types::byte_stream::ByteStream::read_from()\n                        .path(&file)\n                        .build()\n                        .await\n                        .unwrap();\n\n                    let _operation = client\n                        .http_checksum_streaming_operation()\n                        .body(streaming_body)\n                        $setChecksumAlgo\n                        .send()\n                        .await;\n\n                    let request = rx.expect_request();\n\n                    let headers = request.headers();\n\n                    assert_eq!(\n                        headers.get(\"x-amz-trailer\").unwrap(),\n                        \"x-amz-checksum-$algoLower\",\n                    );\n                    assert_eq!(headers.get(\"content-encoding\").unwrap(), \"aws-chunked\");\n\n                    let body = request\n                    .body()\n                    .try_clone()\n                    .expect(\"body is retryable\")\n                    .collect()\n                    .await\n                    .expect(\"body is collectable\");\n\n                    let mut body_data = bytes::BytesMut::new();\n                    body_data.extend_from_slice(&body.to_bytes());\n\n                    let body_string = std::str::from_utf8(&body_data).unwrap();\n                    assert!(body_string.contains(\"x-amz-checksum-$algoLower:${testDef.trailerChecksum}\"));\n                }\n                \"\"\",\n                *preludeScope,\n                \"tokio\" to CargoDependency.Tokio.toType(),\n                \"capture_request\" to RuntimeType.captureRequest(rc),\n                \"http_1x\" to CargoDependency.Http1x.toType(),\n            )\n        }\n    }\n\n    /**\n     * Generate tests where the response checksum validates successfully\n     */\n    private fun createResponseChecksumValidationSuccessTest(\n        testDef: ResponseChecksumValidationSuccessTest,\n        context: ClientCodegenContext,\n    ): Writable {\n        val rc = context.runtimeConfig\n        val moduleName = context.moduleUseName()\n        val algoLower = testDef.checksumAlgorithm.lowercase()\n        return writable {\n            rustTemplate(\n                \"\"\"\n                //${testDef.docs}\n                ##[::tokio::test]\n                async fn ${algoLower}_response_checksums_works() {\n                    let (http_client, _rx) = #{capture_request}(Some(\n                        #{http_1x}::Response::builder()\n                            .header(\"x-amz-checksum-$algoLower\", \"${testDef.checksumHeaderValue}\")\n                            .body(SdkBody::from(\"${testDef.responsePayload}\"))\n                            .unwrap(),\n                    ));\n                    let config = $moduleName::Config::builder()\n                        .region(Region::from_static(\"doesntmatter\"))\n                        .with_test_defaults()\n                        .http_client(http_client)\n                        .build();\n\n                    let client = $moduleName::Client::from_conf(config);\n                    let res = client\n                        .http_checksum_operation()\n                        .body(Blob::new(b\"Doesn't matter.\"))\n                        .checksum_algorithm($moduleName::types::ChecksumAlgorithm::${testDef.checksumAlgorithm})\n                        .validation_mode($moduleName::types::ValidationMode::Enabled)\n                        .send()\n                        .await;\n                    assert!(res.is_ok())\n                }\n                \"\"\",\n                *preludeScope,\n                \"tokio\" to CargoDependency.Tokio.toType(),\n                \"capture_request\" to RuntimeType.captureRequest(rc),\n                \"http_1x\" to CargoDependency.Http1x.toType(),\n            )\n        }\n    }\n\n    /**\n     * Generate tests where the response checksum fails to validate\n     */\n    private fun createResponseChecksumValidationFailureTest(\n        testDef: ResponseChecksumValidationFailureTest,\n        context: ClientCodegenContext,\n    ): Writable {\n        val rc = context.runtimeConfig\n        val moduleName = context.moduleUseName()\n        val algoLower = testDef.checksumAlgorithm.lowercase()\n        return writable {\n            rustTemplate(\n                \"\"\"\n                //${testDef.docs}\n                ##[::tokio::test]\n                async fn ${algoLower}_response_checksums_fail_correctly() {\n                    let (http_client, _rx) = #{capture_request}(Some(\n                        #{http_1x}::Response::builder()\n                            .header(\"x-amz-checksum-$algoLower\", \"${testDef.checksumHeaderValue}\")\n                            .body(SdkBody::from(\"${testDef.responsePayload}\"))\n                            .unwrap(),\n                    ));\n                    let config = $moduleName::Config::builder()\n                        .region(Region::from_static(\"doesntmatter\"))\n                        .with_test_defaults()\n                        .http_client(http_client)\n                        .retry_config(#{RetryConfig}::disabled())\n                        .build();\n\n                    let client = $moduleName::Client::from_conf(config);\n                    let res = client\n                        .http_checksum_operation()\n                        .body(Blob::new(b\"Doesn't matter.\"))\n                        .checksum_algorithm($moduleName::types::ChecksumAlgorithm::${testDef.checksumAlgorithm})\n                        .validation_mode($moduleName::types::ValidationMode::Enabled)\n                        .send()\n                        .await;\n\n                    assert!(res.is_err());\n\n                    let boxed_err = res\n                        .unwrap_err()\n                        .into_source()\n                        .unwrap()\n                        .downcast::<aws_smithy_checksums::body::validate::Error>();\n                    let typed_err = boxed_err.as_ref().unwrap().as_ref();\n\n                    match typed_err {\n                        aws_smithy_checksums::body::validate::Error::ChecksumMismatch { actual, .. } => {\n                            let calculated_checksum = aws_smithy_types::base64::encode(actual);\n                            assert_eq!(calculated_checksum, \"${testDef.calculatedChecksum}\");\n                        }\n                        _ => panic!(\"Unknown error type in checksum validation\"),\n                    };\n                }\n                \"\"\",\n                *preludeScope,\n                \"tokio\" to CargoDependency.Tokio.toType(),\n                \"capture_request\" to RuntimeType.captureRequest(rc),\n                \"http_1x\" to CargoDependency.Http1x.toType(),\n                \"RetryConfig\" to RuntimeType.smithyTypes(rc).resolve(\"retry::RetryConfig\"),\n            )\n        }\n    }\n\n    /**\n     * Generate tests for the case where a user provides a checksum\n     */\n    private fun createUserProvidedChecksumsTest(\n        testDef: UserProvidedChecksumTest,\n        context: ClientCodegenContext,\n    ): Writable {\n        val rc = context.runtimeConfig\n        val moduleName = context.moduleUseName()\n        val algoLower = testDef.checksumAlgorithm.lowercase()\n        // We treat the c after crc32c and the nvme after crc64nvme as separate words\n        // so this quick map helps us find the field to set\n        val algoFieldNames =\n            mapOf(\n                \"crc32\" to \"checksum_crc32\",\n                \"crc32c\" to \"checksum_crc32_c\",\n                \"crc64nvme\" to \"checksum_crc64_nvme\",\n                \"foo\" to \"checksum_foo\",\n                \"sha1\" to \"checksum_sha1\",\n                \"sha256\" to \"checksum_sha256\",\n            )\n\n        return writable {\n            rustTemplate(\n                \"\"\"\n                //${testDef.docs}\n                ##[#{tokio}::test]\n                async fn user_provided_${algoLower}_request_checksum_works() {\n                    let (http_client, rx) = #{capture_request}(None);\n                    let config = $moduleName::Config::builder()\n                        .region(Region::from_static(\"doesntmatter\"))\n                        .with_test_defaults()\n                        .http_client(http_client)\n                        .build();\n\n                    let client = $moduleName::Client::from_conf(config);\n                    let _ = client.http_checksum_operation()\n                    .body(Blob::new(b\"${testDef.requestPayload}\"))\n                    .${algoFieldNames.get(algoLower)}(${testDef.checksumValue.dq()})\n                    .send()\n                    .await;\n                    let request = rx.expect_request();\n                    let ${algoLower}_header = request.headers()\n                        .get(\"x-amz-checksum-$algoLower\")\n                        .expect(\"x-amz-checksum-$algoLower header should exist\");\n\n                    assert_eq!(${algoLower}_header, \"${testDef.expectedHeaderValue}\");\n\n                    let algo_header = request.headers()\n                        .get(\"x-amz-request-algorithm\");\n\n                    assert!(algo_header.is_none());\n                }\n                \"\"\",\n                *preludeScope,\n                \"tokio\" to CargoDependency.Tokio.toType(),\n                \"capture_request\" to RuntimeType.captureRequest(rc),\n                \"http_1x\" to CargoDependency.Http1x.toType(),\n            )\n        }\n    }\n\n    /**\n     * Generate miscellaneous tests, currently mostly focused on the inclusion of the checksum config metrics in the\n     * user-agent header\n     */\n    private fun createMiscellaneousTests(context: ClientCodegenContext): Writable {\n        val rc = context.runtimeConfig\n        val moduleName = context.moduleUseName()\n        return writable {\n            rustTemplate(\n                \"\"\"\n                // The following tests confirm that the user-agent business metrics header is correctly\n                // set for the request/response checksum config values\n                ##[::tokio::test]\n                async fn request_config_ua_required() {\n                    let (http_client, rx) = #{capture_request}(None);\n                    let config = $moduleName::Config::builder()\n                        .region(Region::from_static(\"doesntmatter\"))\n                        .with_test_defaults()\n                        .http_client(http_client)\n                        .request_checksum_calculation(\n                            aws_types::sdk_config::RequestChecksumCalculation::WhenRequired,\n                        )\n                        .build();\n\n                    let client = $moduleName::Client::from_conf(config);\n                    let _ = client\n                        .http_checksum_operation()\n                        .body(Blob::new(b\"Doesn't matter\"))\n                        .send()\n                        .await;\n                    let request = rx.expect_request();\n\n                    let sdk_metrics = extract_ua_values(\n                        &request\n                            .headers()\n                            .get(\"x-amz-user-agent\")\n                            .expect(\"UA header should be present\"),\n                    ).expect(\"UA header should be present\");\n                    assert!(sdk_metrics.contains(&\"a\"));\n                    assert!(!sdk_metrics.contains(&\"Z\"));\n                }\n\n                ##[::tokio::test]\n                async fn request_config_ua_supported() {\n                    let (http_client, rx) = #{capture_request}(None);\n                    let config = $moduleName::Config::builder()\n                        .region(Region::from_static(\"doesntmatter\"))\n                        .with_test_defaults()\n                        .http_client(http_client)\n                        .build();\n\n                    let client = $moduleName::Client::from_conf(config);\n                    let _ = client\n                        .http_checksum_operation()\n                        .body(Blob::new(b\"Doesn't matter\"))\n                        .send()\n                        .await;\n                    let request = rx.expect_request();\n\n                    let sdk_metrics = extract_ua_values(\n                        &request\n                            .headers()\n                            .get(\"x-amz-user-agent\")\n                            .expect(\"UA header should be present\"),\n                    ).expect(\"UA header should be present\");\n                    assert!(sdk_metrics.contains(&\"Z\"));\n                    assert!(!sdk_metrics.contains(&\"a\"));\n                }\n\n                ##[::tokio::test]\n                async fn response_config_ua_supported() {\n                    let (http_client, rx) = #{capture_request}(Some(\n                        #{http_1x}::Response::builder()\n                            .header(\"x-amz-checksum-crc32\", \"i9aeUg==\")\n                            .body(SdkBody::from(\"Hello world\"))\n                            .unwrap(),\n                    ));\n                    let config = $moduleName::Config::builder()\n                        .region(Region::from_static(\"doesntmatter\"))\n                        .with_test_defaults()\n                        .http_client(http_client)\n                        .build();\n\n                    let client = $moduleName::Client::from_conf(config);\n                    let _ = client\n                        .http_checksum_operation()\n                        .body(Blob::new(b\"Doesn't matter\"))\n                        .send()\n                        .await;\n                    let request = rx.expect_request();\n\n                    let sdk_metrics = extract_ua_values(\n                        &request\n                            .headers()\n                            .get(\"x-amz-user-agent\")\n                            .expect(\"UA header should be present\"),\n                    ).expect(\"UA header should be present\");\n                    assert!(sdk_metrics.contains(&\"b\"));\n                    assert!(!sdk_metrics.contains(&\"c\"));\n                }\n\n                ##[::tokio::test]\n                async fn response_config_ua_required() {\n                    let (http_client, rx) = #{capture_request}(Some(\n                        #{http_1x}::Response::builder()\n                            .header(\"x-amz-checksum-crc32\", \"i9aeUg==\")\n                            .body(SdkBody::from(\"Hello world\"))\n                            .unwrap(),\n                    ));\n                    let config = $moduleName::Config::builder()\n                        .region(Region::from_static(\"doesntmatter\"))\n                        .with_test_defaults()\n                        .http_client(http_client)\n                        .response_checksum_validation(\n                            aws_types::sdk_config::ResponseChecksumValidation::WhenRequired,\n                        )\n                        .build();\n\n                    let client = $moduleName::Client::from_conf(config);\n                    let _ = client\n                        .http_checksum_operation()\n                        .body(Blob::new(b\"Doesn't matter\"))\n                        .send()\n                        .await;\n                    let request = rx.expect_request();\n\n                    let sdk_metrics = extract_ua_values(\n                        &request\n                            .headers()\n                            .get(\"x-amz-user-agent\")\n                            .expect(\"UA header should be present\"),\n                    ).expect(\"UA header should be present\");\n                    assert!(sdk_metrics.contains(&\"c\"));\n                    assert!(!sdk_metrics.contains(&\"b\"));\n                }\n                \"\"\",\n                *preludeScope,\n                \"tokio\" to CargoDependency.Tokio.toType(),\n                \"capture_request\" to RuntimeType.captureRequest(rc),\n                \"http_1x\" to CargoDependency.Http1x.toType(),\n            )\n        }\n    }\n}\n\n// Classes and data for test definitions\n\ndata class RequestChecksumCalculationTest(\n    val docs: String,\n    val requestPayload: String,\n    val checksumAlgorithm: String,\n    val algoHeader: String,\n    val checksumHeader: String,\n    val algoFeatureId: String,\n)\n\nval checksumRequestTests =\n    listOf(\n        RequestChecksumCalculationTest(\n            \"CRC32 checksum calculation works.\",\n            \"Hello world\",\n            \"Crc32\",\n            \"CRC32\",\n            \"i9aeUg==\",\n            \"U\",\n        ),\n        RequestChecksumCalculationTest(\n            \"CRC32C checksum calculation works.\",\n            \"Hello world\",\n            \"Crc32C\",\n            \"CRC32C\",\n            \"crUfeA==\",\n            \"V\",\n        ),\n        RequestChecksumCalculationTest(\n            \"CRC64NVME checksum calculation works.\",\n            \"Hello world\",\n            \"Crc64Nvme\",\n            \"CRC64NVME\",\n            \"OOJZ0D8xKts=\",\n            \"W\",\n        ),\n        RequestChecksumCalculationTest(\n            \"SHA1 checksum calculation works.\",\n            \"Hello world\",\n            \"Sha1\",\n            \"SHA1\",\n            \"e1AsOh9IyGCa4hLN+2Od7jlnP14=\",\n            \"X\",\n        ),\n        RequestChecksumCalculationTest(\n            \"SHA256 checksum calculation works.\",\n            \"Hello world\",\n            \"Sha256\",\n            \"SHA256\",\n            \"ZOyIygCyaOW6GjVnihtTFtIS9PNmskdyMlNKiuyjfzw=\",\n            \"Y\",\n        ),\n    )\n\ndata class StreamingRequestChecksumCalculationTest(\n    val docs: String,\n    val requestPayload: String,\n    val checksumAlgorithm: String,\n    val trailerChecksum: String,\n)\n\nval streamingRequestTests =\n    listOf(\n        StreamingRequestChecksumCalculationTest(\n            \"CRC32 streaming checksum calculation works.\",\n            \"Hello world\",\n            \"Crc32\",\n            \"i9aeUg==\",\n        ),\n        StreamingRequestChecksumCalculationTest(\n            \"CRC32C streaming checksum calculation works.\",\n            \"Hello world\",\n            \"Crc32C\",\n            \"crUfeA==\",\n        ),\n        StreamingRequestChecksumCalculationTest(\n            \"CRC64NVME streaming checksum calculation works.\",\n            \"Hello world\",\n            \"Crc64Nvme\",\n            \"OOJZ0D8xKts=\",\n        ),\n        StreamingRequestChecksumCalculationTest(\n            \"SHA1 streaming checksum calculation works.\",\n            \"Hello world\",\n            \"Sha1\",\n            \"e1AsOh9IyGCa4hLN+2Od7jlnP14=\",\n        ),\n        StreamingRequestChecksumCalculationTest(\n            \"SHA256 streaming checksum calculation works.\",\n            \"Hello world\",\n            \"Sha256\",\n            \"ZOyIygCyaOW6GjVnihtTFtIS9PNmskdyMlNKiuyjfzw=\",\n        ),\n    )\n\ndata class ResponseChecksumValidationSuccessTest(\n    val docs: String,\n    val responsePayload: String,\n    val checksumAlgorithm: String,\n    val checksumHeaderValue: String,\n)\n\nval checksumResponseSuccTests =\n    listOf(\n        ResponseChecksumValidationSuccessTest(\n            \"Successful payload validation with CRC32 checksum.\",\n            \"Hello world\",\n            \"Crc32\",\n            \"i9aeUg==\",\n        ),\n        ResponseChecksumValidationSuccessTest(\n            \"Successful payload validation with Crc32C checksum.\",\n            \"Hello world\",\n            \"Crc32C\",\n            \"crUfeA==\",\n        ),\n        ResponseChecksumValidationSuccessTest(\n            \"Successful payload validation with Crc64Nvme checksum.\",\n            \"Hello world\",\n            \"Crc64Nvme\",\n            \"OOJZ0D8xKts=\",\n        ),\n        ResponseChecksumValidationSuccessTest(\n            \"Successful payload validation with Sha1 checksum.\",\n            \"Hello world\",\n            \"Sha1\",\n            \"e1AsOh9IyGCa4hLN+2Od7jlnP14=\",\n        ),\n        ResponseChecksumValidationSuccessTest(\n            \"Successful payload validation with Sha256 checksum.\",\n            \"Hello world\",\n            \"Sha256\",\n            \"ZOyIygCyaOW6GjVnihtTFtIS9PNmskdyMlNKiuyjfzw=\",\n        ),\n    )\n\ndata class ResponseChecksumValidationFailureTest(\n    val docs: String,\n    val responsePayload: String,\n    val checksumAlgorithm: String,\n    val checksumHeaderValue: String,\n    val calculatedChecksum: String,\n)\n\nval checksumResponseFailTests =\n    listOf(\n        ResponseChecksumValidationFailureTest(\n            \"Failed payload validation with CRC32 checksum.\",\n            \"Hello world\",\n            \"Crc32\",\n            \"bm90LWEtY2hlY2tzdW0=\",\n            \"i9aeUg==\",\n        ),\n        ResponseChecksumValidationFailureTest(\n            \"Failed payload validation with CRC32C checksum.\",\n            \"Hello world\",\n            \"Crc32C\",\n            \"bm90LWEtY2hlY2tzdW0=\",\n            \"crUfeA==\",\n        ),\n        ResponseChecksumValidationFailureTest(\n            \"Failed payload validation with CRC64NVME checksum.\",\n            \"Hello world\",\n            \"Crc64Nvme\",\n            \"bm90LWEtY2hlY2tzdW0=\",\n            \"OOJZ0D8xKts=\",\n        ),\n        ResponseChecksumValidationFailureTest(\n            \"Failed payload validation with SHA1 checksum.\",\n            \"Hello world\",\n            \"Sha1\",\n            \"bm90LWEtY2hlY2tzdW0=\",\n            \"e1AsOh9IyGCa4hLN+2Od7jlnP14=\",\n        ),\n        ResponseChecksumValidationFailureTest(\n            \"Failed payload validation with SHA256 checksum.\",\n            \"Hello world\",\n            \"Sha256\",\n            \"bm90LWEtY2hlY2tzdW0=\",\n            \"ZOyIygCyaOW6GjVnihtTFtIS9PNmskdyMlNKiuyjfzw=\",\n        ),\n    )\n\ndata class UserProvidedChecksumTest(\n    val docs: String,\n    val requestPayload: String,\n    val checksumAlgorithm: String,\n    val checksumValue: String,\n    val expectedHeaderName: String,\n    val expectedHeaderValue: String,\n    val forbidHeaderName: String,\n)\n\nval userProvidedChecksumTests =\n    listOf(\n        UserProvidedChecksumTest(\n            \"CRC32 checksum provided by user.\",\n            \"Hello world\",\n            \"Crc32\",\n            \"i9aeUg==\",\n            \"x-amz-checksum-crc32\",\n            \"i9aeUg==\",\n            \"x-amz-request-algorithm\",\n        ),\n        UserProvidedChecksumTest(\n            \"CRC32C checksum provided by user.\",\n            \"Hello world\",\n            \"Crc32C\",\n            \"crUfeA==\",\n            \"x-amz-checksum-crc32c\",\n            \"crUfeA==\",\n            \"x-amz-request-algorithm\",\n        ),\n        UserProvidedChecksumTest(\n            \"CRC64NVME checksum provided by user.\",\n            \"Hello world\",\n            \"Crc64Nvme\",\n            \"OOJZ0D8xKts=\",\n            \"x-amz-checksum-crc64nvme\",\n            \"OOJZ0D8xKts=\",\n            \"x-amz-request-algorithm\",\n        ),\n        UserProvidedChecksumTest(\n            \"SHA1 checksum provided by user.\",\n            \"Hello world\",\n            \"Sha1\",\n            \"e1AsOh9IyGCa4hLN+2Od7jlnP14=\",\n            \"x-amz-checksum-sha1\",\n            \"e1AsOh9IyGCa4hLN+2Od7jlnP14=\",\n            \"x-amz-request-algorithm\",\n        ),\n        UserProvidedChecksumTest(\n            \"SHA256 checksum provided by user.\",\n            \"Hello world\",\n            \"Sha256\",\n            \"ZOyIygCyaOW6GjVnihtTFtIS9PNmskdyMlNKiuyjfzw=\",\n            \"x-amz-checksum-sha256\",\n            \"ZOyIygCyaOW6GjVnihtTFtIS9PNmskdyMlNKiuyjfzw=\",\n            \"x-amz-request-algorithm\",\n        ),\n        UserProvidedChecksumTest(\n            \"Forwards compatibility, unmodeled checksum provided by user.\",\n            \"Hello world\",\n            \"Foo\",\n            \"This-is-not-a-real-checksum\",\n            \"x-amz-checksum-foo\",\n            \"This-is-not-a-real-checksum\",\n            \"x-amz-request-algorithm\",\n        ),\n    )\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/test/kotlin/software/amazon/smithy/rustsdk/HttpRequestCompressionDecoratorTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rustsdk\n\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.integrationTest\n\nclass HttpRequestCompressionDecoratorTest {\n    companion object {\n        val model =\n            \"\"\"\n            namespace test\n\n            use aws.api#service\n            use aws.auth#sigv4\n            use aws.protocols#restJson1\n            use smithy.rules#endpointRuleSet\n\n            @service(sdkId: \"dontcare\")\n            @restJson1\n            @sigv4(name: \"dontcare\")\n            @auth([sigv4])\n            @endpointRuleSet({\n                \"version\": \"1.0\",\n                \"rules\": [{ \"type\": \"endpoint\", \"conditions\": [], \"endpoint\": { \"url\": \"https://example.com\" } }],\n                \"parameters\": {\n                    \"Region\": { \"required\": false, \"type\": \"String\", \"builtIn\": \"AWS::Region\" },\n                }\n            })\n            service TestService {\n                version: \"2023-01-01\",\n                operations: [SomeOperation, SomeStreamingOperation, NotACompressibleOperation]\n            }\n\n            @streaming\n            blob StreamingBlob\n\n            blob NonStreamingBlob\n\n            @http(uri: \"/SomeOperation\", method: \"POST\")\n            @optionalAuth\n            @requestCompression(encodings: [\"gzip\"])\n            operation SomeOperation {\n                input: SomeInput,\n                output: SomeOutput\n            }\n\n            @input\n            structure SomeInput {\n                @httpPayload\n                @required\n                body: NonStreamingBlob\n            }\n\n            @output\n            structure SomeOutput {}\n\n            @http(uri: \"/SomeStreamingOperation\", method: \"POST\")\n            @optionalAuth\n            @requestCompression(encodings: [\"gzip\"])\n            operation SomeStreamingOperation {\n                input: SomeStreamingInput,\n                output: SomeStreamingOutput\n            }\n\n            @input\n            structure SomeStreamingInput {\n                @httpPayload\n                @required\n                body: StreamingBlob\n            }\n\n            @output\n            structure SomeStreamingOutput {}\n\n            @http(uri: \"/NotACompressibleOperation\", method: \"PUT\")\n            @optionalAuth\n            operation NotACompressibleOperation {\n                input: SomeIncompressibleInput,\n                output: SomeIncompressibleOutput\n            }\n\n            @input\n            structure SomeIncompressibleInput {\n                @httpPayload\n                @required\n                body: NonStreamingBlob\n            }\n\n            @output\n            structure SomeIncompressibleOutput {}\n            \"\"\".asSmithyModel(smithyVersion = \"2.0\")\n    }\n\n    @Test\n    fun smokeTestSdkCodegen() {\n        awsSdkIntegrationTest(model) { _, _ ->\n            // it should compile\n        }\n    }\n\n    @Test\n    fun requestCompressionWorks() {\n        awsSdkIntegrationTest(model) { context, rustCrate ->\n            val rc = context.runtimeConfig\n            val moduleName = context.moduleUseName()\n            rustCrate.integrationTest(\"request_compression\") {\n                rustTemplate(\n                    \"\"\"\n                    ##![cfg(feature = \"test-util\")]\n\n                    use #{ByteStream};\n                    use #{Blob};\n                    use #{Region};\n                    use #{pretty_assertions}::{assert_eq, assert_ne};\n\n                    const UNCOMPRESSED_INPUT: &[u8] = b\"Action=PutMetricData&Version=2010-08-01&Namespace=Namespace&MetricData.member.1.MetricName=metric&MetricData.member.1.Unit=Bytes&MetricData.member.1.Value=128\";\n                    // This may break if we ever change the default compression level.\n                    const COMPRESSED_OUTPUT: &[u8] = &[\n                        31, 139, 8, 0, 0, 0, 0, 0, 0, 255, 109, 139, 49, 14, 128, 32, 16, 4, 127, 67, 39, 1, 43, 155,\n                        43, 52, 182, 26, 27, 233, 79, 114, 5, 137, 160, 129, 163, 240, 247, 6, 77, 180, 161, 155, 204,\n                        206, 246, 150, 221, 17, 96, 201, 60, 17, 71, 103, 71, 100, 20, 134, 98, 42, 182, 85, 90, 53,\n                        170, 107, 148, 22, 51, 122, 74, 39, 90, 130, 143, 196, 255, 144, 158, 252, 70, 81, 106, 249,\n                        186, 210, 128, 127, 176, 90, 173, 193, 49, 12, 23, 83, 170, 206, 6, 247, 76, 160, 219, 238, 6,\n                        30, 221, 9, 253, 158, 0, 0, 0,\n                    ];\n\n                    ##[#{tokio}::test]\n                    async fn test_request_compression_isnt_applied_unless_modeled() {\n                        let (http_client, rx) = #{capture_request}(None);\n                        let config = $moduleName::Config::builder()\n                            .region(Region::from_static(\"doesntmatter\"))\n                            .with_test_defaults()\n                            .http_client(http_client)\n                            .disable_request_compression(true)\n                            .build();\n\n                        let client = $moduleName::Client::from_conf(config);\n                        let _ = client\n                            .not_a_compressible_operation()\n                            .body(Blob::new(UNCOMPRESSED_INPUT))\n                            .send()\n                            .await;\n                        let request = rx.expect_request();\n                        // Check that the content-encoding header is not set.\n                        assert_eq!(None, request.headers().get(#{http_1x}::header::CONTENT_ENCODING));\n\n                        let compressed_body = ByteStream::from(request.into_body())\n                            .collect()\n                            .await\n                            .unwrap()\n                            .to_vec();\n                        // Assert input body was not compressed\n                        assert_eq!(UNCOMPRESSED_INPUT, compressed_body.as_slice());\n                    }\n\n                    ##[#{tokio}::test]\n                    async fn test_request_compression_can_be_disabled() {\n                        let (http_client, rx) = #{capture_request}(None);\n                        let config = $moduleName::Config::builder()\n                            .region(Region::from_static(\"doesntmatter\"))\n                            .with_test_defaults()\n                            .http_client(http_client)\n                            .disable_request_compression(true)\n                            .build();\n\n                        let client = $moduleName::Client::from_conf(config);\n                        let _ = client\n                            .some_operation()\n                            .body(Blob::new(UNCOMPRESSED_INPUT))\n                            .send()\n                            .await;\n                        let request = rx.expect_request();\n                        // Check that the content-encoding header is not set to \"gzip\"\n                        assert_ne!(\n                            Some(\"gzip\"),\n                            request.headers().get(#{http_1x}::header::CONTENT_ENCODING)\n                        );\n\n                        let compressed_body = ByteStream::from(request.into_body())\n                            .collect()\n                            .await\n                            .unwrap()\n                            .to_vec();\n                        // Assert input body was not compressed\n                        assert_eq!(UNCOMPRESSED_INPUT, compressed_body.as_slice());\n                    }\n\n                    ##[#{tokio}::test]\n                    async fn test_request_min_size_body_over_minimum() {\n                        let (http_client, rx) = #{capture_request}(None);\n                        let config = $moduleName::Config::builder()\n                            .region(Region::from_static(\"doesntmatter\"))\n                            .with_test_defaults()\n                            .http_client(http_client)\n                            .disable_request_compression(false)\n                            .request_min_compression_size_bytes(128)\n                            .build();\n\n                        let client = $moduleName::Client::from_conf(config);\n                        let _ = client\n                            .some_operation()\n                            .body(Blob::new(UNCOMPRESSED_INPUT))\n                            .send()\n                            .await;\n                        let request = rx.expect_request();\n                        // Check that the content-encoding header is set to \"gzip\"\n                        assert_eq!(\n                            Some(\"gzip\"),\n                            request.headers().get(#{http_1x}::header::CONTENT_ENCODING)\n                        );\n\n                        let compressed_body = ByteStream::from(request.into_body())\n                            .collect()\n                            .await\n                            .unwrap()\n                            .to_vec();\n                        // Assert input body was compressed\n                        assert_eq!(COMPRESSED_OUTPUT, compressed_body.as_slice());\n                    }\n\n                    ##[#{tokio}::test]\n                    async fn test_request_min_size_body_under_minimum() {\n                        let (http_client, rx) = #{capture_request}(None);\n                        let config = $moduleName::Config::builder()\n                            .region(Region::from_static(\"doesntmatter\"))\n                            .with_test_defaults()\n                            .http_client(http_client)\n                            .disable_request_compression(false)\n                            .request_min_compression_size_bytes(256)\n                            .build();\n\n                        let client = $moduleName::Client::from_conf(config);\n                        let _ = client\n                            .some_operation()\n                            .body(Blob::new(UNCOMPRESSED_INPUT))\n                            .send()\n                            .await;\n                        let request = rx.expect_request();\n                        // Check that the content-encoding header is not set to \"gzip\"\n                        assert_ne!(\n                            Some(\"gzip\"),\n                            request.headers().get(#{http_1x}::header::CONTENT_ENCODING)\n                        );\n\n                        let compressed_body = ByteStream::from(request.into_body())\n                            .collect()\n                            .await\n                            .unwrap()\n                            .to_vec();\n                        // Assert input body was not compressed\n                        assert_eq!(UNCOMPRESSED_INPUT, compressed_body.as_slice());\n                    }\n\n                    ##[#{tokio}::test]\n                    async fn test_request_compression_implicitly_enabled() {\n                        let (http_client, rx) = #{capture_request}(None);\n                        let config = $moduleName::Config::builder()\n                            .region(Region::from_static(\"doesntmatter\"))\n                            .with_test_defaults()\n                            .http_client(http_client)\n                            .request_min_compression_size_bytes(128)\n                            .build();\n\n                        let client = $moduleName::Client::from_conf(config);\n                        let _ = client\n                            .some_operation()\n                            .body(Blob::new(UNCOMPRESSED_INPUT))\n                            .send()\n                            .await;\n                        let request = rx.expect_request();\n                        // Check that the content-encoding header is set to \"gzip\"\n                        assert_eq!(\n                            Some(\"gzip\"),\n                            request.headers().get(#{http_1x}::header::CONTENT_ENCODING)\n                        );\n\n                        let compressed_body = ByteStream::from(request.into_body())\n                            .collect()\n                            .await\n                            .unwrap()\n                            .to_vec();\n                        // Assert input body was compressed\n                        assert_eq!(COMPRESSED_OUTPUT, compressed_body.as_slice());\n                    }\n\n                    ##[#{tokio}::test]\n                    async fn test_request_compression_min_size_default() {\n                        let (http_client, rx) = #{capture_request}(None);\n                        let config = $moduleName::Config::builder()\n                            .region(Region::from_static(\"doesntmatter\"))\n                            .with_test_defaults()\n                            .http_client(http_client)\n                            .disable_request_compression(false)\n                            .build();\n\n                        let client = $moduleName::Client::from_conf(config);\n                        let _ = client\n                            .some_operation()\n                            .body(Blob::new(UNCOMPRESSED_INPUT))\n                            .send()\n                            .await;\n                        let request = rx.expect_request();\n                        // Check that the content-encoding header is not set to \"gzip\"\n                        assert_ne!(\n                            Some(\"gzip\"),\n                            request.headers().get(#{http_1x}::header::CONTENT_ENCODING)\n                        );\n\n                        let compressed_body = ByteStream::from(request.into_body())\n                            .collect()\n                            .await\n                            .unwrap()\n                            .to_vec();\n                        // Assert input body was not compressed\n                        assert_eq!(UNCOMPRESSED_INPUT, compressed_body.as_slice());\n                    }\n\n                    ##[#{tokio}::test]\n                    async fn test_request_compression_streaming_body() {\n                        let (http_client, rx) = #{capture_request}(None);\n                        let config = $moduleName::Config::builder()\n                            .region(Region::from_static(\"doesntmatter\"))\n                            .with_test_defaults()\n                            .http_client(http_client)\n                            .disable_request_compression(false)\n                            // Since our streaming body is sized, we have to set this.\n                            .request_min_compression_size_bytes(128)\n                            .build();\n\n                        let client = $moduleName::Client::from_conf(config);\n                        // ByteStreams created from a file are streaming\n                        let mut file = #{tempfile}::NamedTempFile::new().unwrap();\n                        use std::io::Write;\n                        file.write_all(UNCOMPRESSED_INPUT).unwrap();\n\n                        let body = ByteStream::read_from()\n                            .path(file.path())\n                            .buffer_size(1024)\n                            .length(::aws_smithy_types::byte_stream::Length::Exact(\n                                UNCOMPRESSED_INPUT.len() as u64,\n                            ))\n                            .build()\n                            .await\n                            .unwrap();\n                        let _ = client.some_streaming_operation().body(body).send().await;\n                        let request = rx.expect_request();\n                        // Check that the content-encoding header is set to \"gzip\"\n                        assert_eq!(\n                            Some(\"gzip\"),\n                            request.headers().get(#{http_1x}::header::CONTENT_ENCODING)\n                        );\n\n                        let compressed_body = ByteStream::from(request.into_body())\n                            .collect()\n                            .await\n                            .unwrap()\n                            .to_vec();\n                        // Assert input body is different from uncompressed input\n                        assert_ne!(\n                            UNCOMPRESSED_INPUT,\n                            compressed_body.as_slice(),\n                            \"input was not compressed\"\n                        );\n                        // Assert input body was compressed\n                        assert_eq!(COMPRESSED_OUTPUT, compressed_body.as_slice());\n                    }\n\n                    ##[#{tokio}::test]\n                    async fn test_compressed_content_length() {\n                        let (http_client, rx) = #{capture_request}(None);\n                        let config = $moduleName::Config::builder()\n                            .region(Region::from_static(\"doesntmatter\"))\n                            .with_test_defaults()\n                            .http_client(http_client)\n                            .disable_request_compression(false)\n                            .request_min_compression_size_bytes(0)\n                            .build();\n\n                        let client = $moduleName::Client::from_conf(config);\n                        let _ = client\n                            .some_operation()\n                            .body(Blob::new(UNCOMPRESSED_INPUT))\n                            .send()\n                            .await;\n                        let request = rx.expect_request();\n                        // Check that the content-length header is set correctly.\n                        if let Some(content_length) = request\n                            .headers()\n                            .get(#{http_1x}::header::CONTENT_LENGTH)\n                            .and_then(|len| len.parse::<usize>().ok())\n                        {\n                            assert_ne!(\n                                content_length, UNCOMPRESSED_INPUT.len(),\n                                \"`content-length` of in-memory payload was incorrectly set to the length of the uncompressed input but should have been set to the length of the compressed payload\"\n                            );\n                            assert_eq!(COMPRESSED_OUTPUT.len(), content_length);\n                        }\n\n                        let (http_client, rx) = #{capture_request}(None);\n                        let config = $moduleName::Config::builder()\n                            .region(Region::from_static(\"doesntmatter\"))\n                            .with_test_defaults()\n                            .http_client(http_client)\n                            .disable_request_compression(false)\n                            .request_min_compression_size_bytes(0)\n                            .build();\n\n                        let client = $moduleName::Client::from_conf(config);\n                        // ByteStreams created from a file are streaming\n                        let mut file = #{tempfile}::NamedTempFile::new().unwrap();\n                        use std::io::Write;\n                        file.write_all(UNCOMPRESSED_INPUT).unwrap();\n\n                        let body = ByteStream::read_from()\n                            .path(file.path())\n                            .buffer_size(1024)\n                            .length(::aws_smithy_types::byte_stream::Length::Exact(\n                                UNCOMPRESSED_INPUT.len() as u64,\n                            ))\n                            .build()\n                            .await\n                            .unwrap();\n                        let _ = client.some_streaming_operation().body(body).send().await;\n                        let request = rx.expect_request();\n\n                        assert!(\n                            request\n                                .headers()\n                                .get(#{http_1x}::header::CONTENT_LENGTH)\n                                .is_none(),\n                            \"expected that no content length header is set because the request is streaming.\"\n                        );\n                    }\n                    \"\"\",\n                    *preludeScope,\n                    \"ByteStream\" to RuntimeType.smithyTypes(rc).resolve(\"byte_stream::ByteStream\"),\n                    \"Blob\" to RuntimeType.smithyTypes(rc).resolve(\"Blob\"),\n                    \"Region\" to AwsRuntimeType.awsTypes(rc).resolve(\"region::Region\"),\n                    \"http_1x\" to CargoDependency.Http1x.toType(),\n                    \"tokio\" to CargoDependency.Tokio.toType(),\n                    \"capture_request\" to RuntimeType.captureRequest(rc),\n                    \"pretty_assertions\" to CargoDependency.PrettyAssertions.toType(),\n                    \"tempfile\" to CargoDependency.TempFile.toType(),\n                    \"Length\" to RuntimeType.smithyTypes(rc).resolve(\"byte_stream::Length\"),\n                )\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/test/kotlin/software/amazon/smithy/rustsdk/InvocationIdDecoratorTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rustsdk\n\nimport SdkCodegenIntegrationTest\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\nimport software.amazon.smithy.rust.codegen.core.testutil.integrationTest\n\nclass InvocationIdDecoratorTest {\n    @Test\n    fun customInvocationIdGenerator() {\n        awsSdkIntegrationTest(SdkCodegenIntegrationTest.model) { context, rustCrate ->\n            val rc = context.runtimeConfig\n            val moduleName = context.moduleUseName()\n            rustCrate.integrationTest(\"custom_invocation_id\") {\n                rustTemplate(\n                    \"\"\"\n                    ##[#{tokio}::test]\n                    async fn custom_invocation_id() {\n                        ##[derive(::std::fmt::Debug)]\n                        struct TestIdGen;\n                        impl #{InvocationIdGenerator} for TestIdGen {\n                            fn generate(&self) -> #{Result}<#{Option}<#{InvocationId}>, #{BoxError}> {\n                                #{Ok}(#{Some}(#{InvocationId}::new(\"custom\".into())))\n                            }\n                        }\n\n                        let (http_client, rx) = #{capture_request}(None);\n                        let config = $moduleName::Config::builder()\n                            .http_client(http_client)\n                            .invocation_id_generator(TestIdGen)\n                            .build();\n                        assert!(config.invocation_id_generator().is_some());\n\n                        let client = $moduleName::Client::from_conf(config);\n\n                        let _ = dbg!(client.some_operation().send().await);\n                        let request = rx.expect_request();\n                        assert_eq!(\"custom\", request.headers().get(\"amz-sdk-invocation-id\").unwrap());\n                    }\n                    \"\"\",\n                    *preludeScope,\n                    \"tokio\" to CargoDependency.Tokio.toType(),\n                    \"InvocationIdGenerator\" to\n                        AwsRuntimeType.awsRuntime(rc)\n                            .resolve(\"invocation_id::InvocationIdGenerator\"),\n                    \"InvocationId\" to\n                        AwsRuntimeType.awsRuntime(rc)\n                            .resolve(\"invocation_id::InvocationId\"),\n                    \"BoxError\" to RuntimeType.boxError(rc),\n                    \"capture_request\" to RuntimeType.captureRequest(rc),\n                )\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/test/kotlin/software/amazon/smithy/rustsdk/OperationInputTestGeneratorTests.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rustsdk\n\nimport org.junit.jupiter.api.Assertions.assertEquals\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.assertThrows\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.rulesengine.traits.EndpointTestOperationInput\nimport software.amazon.smithy.rust.codegen.client.testutil.testClientCodegenContext\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rustsdk.endpoints.operationId\n\nclass OperationInputTestGeneratorTests {\n    @Test\n    fun `finds operation shape by name`() {\n        val prefix = \"\\$version: \\\"2\\\"\"\n        val operationModel =\n            \"\"\"\n            $prefix\n            namespace operations\n\n            operation Ping {}\n            \"\"\".trimIndent()\n        val serviceModel =\n            \"\"\"\n            $prefix\n            namespace service\n\n            use operations#Ping\n\n            service MyService {\n                operations: [Ping]\n            }\n            \"\"\".trimIndent()\n\n        val model =\n            Model.assembler()\n                .discoverModels()\n                .addUnparsedModel(\"operation.smithy\", operationModel)\n                .addUnparsedModel(\"main.smithy\", serviceModel)\n                .assemble()\n                .unwrap()\n\n        val context = testClientCodegenContext(model)\n        val testOperationInput =\n            EndpointTestOperationInput.builder()\n                .operationName(\"Ping\")\n                .build()\n\n        val operationId = context.operationId(testOperationInput)\n        assertEquals(\"operations#Ping\", operationId.toString())\n    }\n\n    @Test\n    fun `finds operation shape by name from nested operations`() {\n        val prefix = \"\\$version: \\\"2\\\"\"\n        val operationModel =\n            \"\"\"\n            $prefix\n            namespace operations.bells\n\n            resource Bell {\n                operations: [Ding]\n            }\n\n            operation Ding {}\n            \"\"\".trimIndent()\n        val serviceModel =\n            \"\"\"\n            $prefix\n            namespace service\n\n            use operations.bells#Bell\n\n            service MyService {\n                resources: [Bell]\n            }\n            \"\"\".trimIndent()\n\n        val model =\n            Model.assembler()\n                .discoverModels()\n                .addUnparsedModel(\"operation.smithy\", operationModel)\n                .addUnparsedModel(\"main.smithy\", serviceModel)\n                .assemble()\n                .unwrap()\n\n        val context = testClientCodegenContext(model)\n        val testOperationInput =\n            EndpointTestOperationInput.builder()\n                .operationName(\"Ding\")\n                .build()\n\n        val operationId = context.operationId(testOperationInput)\n        assertEquals(\"operations.bells#Ding\", operationId.toString())\n    }\n\n    @Test\n    fun `fails for operation name not found`() {\n        val model =\n            \"\"\"\n            namespace test\n            operation Ping {}\n            service MyService {\n                operations: [Ping]\n            }\n            \"\"\".trimIndent().asSmithyModel()\n\n        val context = testClientCodegenContext(model)\n        val testOperationInput =\n            EndpointTestOperationInput.builder()\n                .operationName(\"Pong\")\n                .build()\n\n        assertThrows<NoSuchElementException> { context.operationId(testOperationInput) }\n    }\n}\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/test/kotlin/software/amazon/smithy/rustsdk/RegionDecoratorTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\npackage software.amazon.smithy.rustsdk\n\nimport org.junit.jupiter.api.Assertions.assertFalse\nimport org.junit.jupiter.api.Assertions.assertTrue\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.integrationTest\nimport software.amazon.smithy.rust.codegen.core.testutil.tokioTest\nimport kotlin.io.path.readText\n\nclass RegionDecoratorTest {\n    private val modelWithoutRegionParamOrSigV4AuthScheme =\n        \"\"\"\n        namespace test\n\n        use aws.api#service\n        use aws.protocols#awsJson1_0\n        use smithy.rules#endpointRuleSet\n\n        @awsJson1_0\n        @endpointRuleSet({\n            \"version\": \"1.0\",\n            \"rules\": [{ \"type\": \"endpoint\", \"conditions\": [], \"endpoint\": { \"url\": \"https://example.com\" } }],\n            \"parameters\": {}\n        })\n        @service(sdkId: \"dontcare\")\n        service TestService { version: \"2023-01-01\", operations: [SomeOperation] }\n        structure SomeOutput { something: String }\n        operation SomeOperation { output: SomeOutput }\n        \"\"\".asSmithyModel()\n\n    private val modelWithRegionParam =\n        \"\"\"\n        namespace test\n\n        use aws.api#service\n        use aws.protocols#awsJson1_0\n        use smithy.rules#endpointRuleSet\n\n        @awsJson1_0\n        @endpointRuleSet({\n            \"version\": \"1.0\",\n            \"rules\": [{ \"type\": \"endpoint\", \"conditions\": [], \"endpoint\": { \"url\": \"https://example.com\" } }],\n            \"parameters\": {\n                \"Region\": { \"required\": false, \"type\": \"String\", \"builtIn\": \"AWS::Region\" },\n            }\n        })\n        @service(sdkId: \"dontcare\")\n        service TestService { version: \"2023-01-01\", operations: [SomeOperation] }\n        structure SomeOutput { something: String }\n        operation SomeOperation { output: SomeOutput }\n        \"\"\".asSmithyModel()\n\n    private val modelWithSigV4AuthScheme =\n        \"\"\"\n        namespace test\n\n        use aws.auth#sigv4\n        use aws.api#service\n        use aws.protocols#awsJson1_0\n        use smithy.rules#endpointRuleSet\n\n        @auth([sigv4])\n        @sigv4(name: \"dontcare\")\n        @awsJson1_0\n        @endpointRuleSet({\n            \"version\": \"1.0\",\n            \"rules\": [{ \"type\": \"endpoint\", \"conditions\": [], \"endpoint\": { \"url\": \"https://example.com\" } }],\n            \"parameters\": {}\n        })\n        @service(sdkId: \"dontcare\")\n        service TestService { version: \"2023-01-01\", operations: [SomeOperation] }\n        structure SomeOutput { something: String }\n        operation SomeOperation { output: SomeOutput }\n        \"\"\".asSmithyModel()\n\n    @Test\n    fun `models without region built-in params or SigV4 should not have configurable regions`() {\n        val path =\n            awsSdkIntegrationTest(modelWithoutRegionParamOrSigV4AuthScheme) { _, _ ->\n                // it should generate and compile successfully\n            }\n        val configContents = path.resolve(\"src/config.rs\").readText()\n        assertFalse(configContents.contains(\"fn set_region(\"))\n    }\n\n    @Test\n    fun `models with region built-in params should have configurable regions`() {\n        val path =\n            awsSdkIntegrationTest(modelWithRegionParam) { _, _ ->\n                // it should generate and compile successfully\n            }\n        val configContents = path.resolve(\"src/config.rs\").readText()\n        assertTrue(configContents.contains(\"fn set_region(\"))\n    }\n\n    @Test\n    fun `models with SigV4 should have configurable regions`() {\n        val path =\n            awsSdkIntegrationTest(modelWithSigV4AuthScheme) { _, _ ->\n                // it should generate and compile successfully\n            }\n        val configContents = path.resolve(\"src/config.rs\").readText()\n        assertTrue(configContents.contains(\"fn set_region(\"))\n    }\n\n    // V1988105516\n    @Test\n    fun `models with region built-in params should validate host label`() {\n        awsSdkIntegrationTest(modelWithRegionParam) { ctx, rustCrate ->\n            val rc = ctx.runtimeConfig\n            val codegenScope =\n                arrayOf(\n                    *RuntimeType.preludeScope,\n                    \"capture_request\" to RuntimeType.captureRequest(rc),\n                    \"Region\" to AwsRuntimeType.awsTypes(rc).resolve(\"region::Region\"),\n                )\n\n            rustCrate.integrationTest(\"endpoint_params_validation\") {\n                tokioTest(\"region_must_be_valid_host_label\") {\n                    val moduleName = ctx.moduleUseName()\n                    rustTemplate(\n                        \"\"\"\n                        let (http_client, _rx) = #{capture_request}(#{None});\n                        let client_config = $moduleName::Config::builder()\n                            .http_client(http_client)\n                            .region(#{Region}::new(\"@controlled-proxy.com##\"))\n                            .build();\n\n                        let client = $moduleName::Client::from_conf(client_config);\n\n                        let err = client\n                            .some_operation()\n                            .send()\n                            .await\n                            .expect_err(\"error\");\n\n                        let err_str = format!(\"{}\", $moduleName::error::DisplayErrorContext(&err));\n                        dbg!(&err_str);\n                        let expected = \"invalid value for field: `region` - must be a valid host label\";\n                        assert!(err_str.contains(expected));\n\n                        \"\"\",\n                        *codegenScope,\n                    )\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/test/kotlin/software/amazon/smithy/rustsdk/RegionProviderConfigTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rustsdk\n\nimport SdkCodegenIntegrationTest\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.testutil.unitTest\n\ninternal class RegionProviderConfigTest {\n    @Test\n    fun `generates a valid config`() {\n        awsSdkIntegrationTest(SdkCodegenIntegrationTest.model) { _, crate ->\n            crate.unitTest {\n                rustTemplate(\"let conf: Option<crate::Config> = None; let _reg: Option<crate::config::Region> = conf.and_then(|c|c.region().cloned());\")\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/test/kotlin/software/amazon/smithy/rustsdk/RetryPartitionTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\npackage software.amazon.smithy.rustsdk\n\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.testutil.integrationTest\nimport software.amazon.smithy.rust.codegen.core.testutil.tokioTest\n\nclass RetryPartitionTest {\n    @Test\n    fun `default retry partition`() {\n        awsSdkIntegrationTest(SdkCodegenIntegrationTest.model) { ctx, rustCrate ->\n            val rc = ctx.runtimeConfig\n            val codegenScope =\n                arrayOf(\n                    *RuntimeType.preludeScope,\n                    \"capture_request\" to RuntimeType.captureRequest(rc),\n                    \"capture_test_logs\" to\n                        CargoDependency.smithyRuntimeTestUtil(rc).toType()\n                            .resolve(\"test_util::capture_test_logs::capture_test_logs\"),\n                    \"Credentials\" to\n                        AwsRuntimeType.awsCredentialTypesTestUtil(rc)\n                            .resolve(\"Credentials\"),\n                    \"Region\" to AwsRuntimeType.awsTypes(rc).resolve(\"region::Region\"),\n                )\n\n            rustCrate.integrationTest(\"default_retry_partition\") {\n                tokioTest(\"default_retry_partition_includes_region\") {\n                    val moduleName = ctx.moduleUseName()\n                    rustTemplate(\n                        \"\"\"\n                        let (_logs, logs_rx) = #{capture_test_logs}();\n                        let (http_client, _rx) = #{capture_request}(#{None});\n                        let client_config = $moduleName::Config::builder()\n                            .http_client(http_client)\n                            .region(#{Region}::new(\"us-west-2\"))\n                            .credentials_provider(#{Credentials}::for_tests())\n                            .build();\n\n                        let client = $moduleName::Client::from_conf(client_config);\n\n                        let _ = client\n                            .some_operation()\n                            .send()\n                            .await\n                            .expect(\"success\");\n\n                        let log_contents = logs_rx.contents();\n                        let expected = r##\"token bucket for RetryPartition { inner: Default(\"dontcare-us-west-2\") } added to config bag\"##;\n                        assert!(log_contents.contains(expected));\n\n                        \"\"\",\n                        *codegenScope,\n                    )\n                }\n\n                tokioTest(\"user_config_retry_partition\") {\n                    val moduleName = ctx.moduleUseName()\n                    rustTemplate(\n                        \"\"\"\n                        let (_logs, logs_rx) = #{capture_test_logs}();\n                        let (http_client, _rx) = #{capture_request}(#{None});\n                        let client_config = $moduleName::Config::builder()\n                            .http_client(http_client)\n                            .region(#{Region}::new(\"us-west-2\"))\n                            .credentials_provider(#{Credentials}::for_tests())\n                            .retry_partition(#{RetryPartition}::new(\"user-partition\"))\n                            .build();\n\n                        let client = $moduleName::Client::from_conf(client_config);\n\n                        let _ = client\n                            .some_operation()\n                            .send()\n                            .await\n                            .expect(\"success\");\n\n                        let log_contents = logs_rx.contents();\n                        let expected = r##\"token bucket for RetryPartition { inner: Default(\"user-partition\") } added to config bag\"##;\n                        assert!(log_contents.contains(expected));\n\n                        \"\"\",\n                        *codegenScope,\n                        \"RetryPartition\" to RuntimeType.smithyRuntime(ctx.runtimeConfig).resolve(\"client::retries::RetryPartition\"),\n                    )\n                }\n            }\n        }\n    }\n\n    // This test doesn't need to be in \"sdk-codegen\" but since \"default retry partition\" test was initially here,\n    // it is added to this file for consistency.\n    @Test\n    fun `custom retry partition`() {\n        awsSdkIntegrationTest(\n            SdkCodegenIntegrationTest.model,\n        ) { ctx, crate ->\n            val codegenScope =\n                arrayOf(\n                    \"BeforeTransmitInterceptorContextRef\" to RuntimeType.beforeTransmitInterceptorContextRef(ctx.runtimeConfig),\n                    \"BoxError\" to RuntimeType.boxError(ctx.runtimeConfig),\n                    \"capture_test_logs\" to\n                        CargoDependency.smithyRuntimeTestUtil(ctx.runtimeConfig).toType()\n                            .resolve(\"test_util::capture_test_logs::capture_test_logs\"),\n                    \"capture_request\" to RuntimeType.captureRequest(ctx.runtimeConfig),\n                    \"ConfigBag\" to RuntimeType.configBag(ctx.runtimeConfig),\n                    \"Intercept\" to RuntimeType.intercept(ctx.runtimeConfig),\n                    \"RetryConfig\" to RuntimeType.smithyTypes(ctx.runtimeConfig).resolve(\"retry::RetryConfig\"),\n                    \"RetryPartition\" to RuntimeType.smithyRuntime(ctx.runtimeConfig).resolve(\"client::retries::RetryPartition\"),\n                    \"RuntimeComponents\" to RuntimeType.runtimeComponents(ctx.runtimeConfig),\n                    \"TokenBucket\" to RuntimeType.smithyRuntime(ctx.runtimeConfig).resolve(\"client::retries::TokenBucket\"),\n                    \"MAXIMUM_CAPACITY\" to RuntimeType.smithyRuntime(ctx.runtimeConfig).resolve(\"client::retries::MAXIMUM_CAPACITY\"),\n                )\n            crate.integrationTest(\"custom_retry_partition\") {\n                tokioTest(\"test_custom_token_bucket\") {\n                    val moduleName = ctx.moduleUseName()\n                    rustTemplate(\n                        \"\"\"\n                        use std::sync::{Arc, atomic::{AtomicU32, Ordering}};\n                        use $moduleName::{Client, Config};\n\n                        ##[derive(Clone, Debug, Default)]\n                        struct TestInterceptor {\n                            called: Arc<AtomicU32>,\n                        }\n                        impl #{Intercept} for TestInterceptor {\n                            fn name(&self) -> &'static str {\n                                \"TestInterceptor\"\n                            }\n                            fn read_before_attempt(\n                                &self,\n                                _context: &#{BeforeTransmitInterceptorContextRef}<'_>,\n                                _runtime_components: &#{RuntimeComponents},\n                                cfg: &mut #{ConfigBag},\n                            ) -> Result<(), #{BoxError}> {\n                                self.called.fetch_add(1, Ordering::Relaxed);\n                                let token_bucket = cfg.load::<#{TokenBucket}>().unwrap();\n                                let max_capacity = #{MAXIMUM_CAPACITY};\n                                let expected = format!(\"permits: {}\", max_capacity);\n                                assert!(\n                                    format!(\"{token_bucket:?}\").contains(&expected),\n                                    \"Expected debug output to contain `{expected}`, but got: {token_bucket:?}\"\n                                );\n                                Ok(())\n                            }\n                        }\n\n                        let (http_client, _) = #{capture_request}(None);\n                        let test_interceptor = TestInterceptor::default();\n                        let client_config = Config::builder()\n                            .interceptor(test_interceptor.clone())\n                            .retry_partition(#{RetryPartition}::custom(\"test\")\n                                .token_bucket(#{TokenBucket}::unlimited())\n                                .build()\n                            )\n                            .http_client(http_client)\n                            .build();\n\n                        let client = Client::from_conf(client_config);\n                        let _ = client.some_operation().send().await;\n\n                        assert!(\n                            test_interceptor.called.load(Ordering::Relaxed) == 1,\n                            \"the interceptor should have been called\"\n                        );\n                        \"\"\",\n                        *codegenScope,\n                    )\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/test/kotlin/software/amazon/smithy/rustsdk/SigV4AuthDecoratorTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\npackage software.amazon.smithy.rustsdk\n\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.integrationTest\nimport software.amazon.smithy.rust.codegen.core.testutil.tokioTest\n\nclass SigV4AuthDecoratorTest {\n    private val modelWithSigV4AuthScheme =\n        \"\"\"\n        namespace test\n\n        use aws.auth#sigv4\n        use aws.api#service\n        use aws.protocols#restJson1\n        use smithy.rules#endpointRuleSet\n        use aws.auth#unsignedPayload\n        use smithy.test#httpRequestTests\n\n        @auth([sigv4])\n        @sigv4(name: \"dontcare\")\n        @restJson1\n        @endpointRuleSet({\n            \"version\": \"1.0\",\n            \"rules\": [{ \"type\": \"endpoint\", \"conditions\": [], \"endpoint\": { \"url\": \"https://example.com\" } }],\n            \"parameters\": {\n                \"endpoint\": { \"required\": true, \"type\": \"string\", \"builtIn\": \"SDK::Endpoint\" },\n            }\n        })\n        @service(sdkId: \"dontcare\")\n        service TestService { version: \"2023-01-01\", operations: [SomeOperation] }\n        structure SomeOutput { something: String }\n\n        structure SomeInput {\n            @httpPayload\n            @required\n            something: Bytestream\n         }\n\n        @streaming\n        blob Bytestream\n\n        @httpRequestTests([{\n            id: \"unsignedPayload\",\n            protocol: restJson1,\n            method: \"POST\",\n            uri: \"/\",\n            params: {\n                something: \"hello\"\n            },\n            headers: {\n                \"x-amz-content-sha256\": \"UNSIGNED-PAYLOAD\",\n            },\n        }])\n        @unsignedPayload\n        @http(uri: \"/\", method: \"POST\")\n        operation SomeOperation { input: SomeInput, output: SomeOutput }\n        \"\"\".asSmithyModel(smithyVersion = \"2.0\")\n\n    @Test\n    fun unsignedPayloadSetsCorrectHeader() {\n        awsSdkIntegrationTest(modelWithSigV4AuthScheme) { _, _ -> }\n    }\n\n    private val modelWithSigV4aAuthScheme =\n        \"\"\"\n        namespace test\n\n        use aws.auth#sigv4\n        use aws.auth#sigv4a\n        use aws.api#service\n        use aws.protocols#restJson1\n        use smithy.rules#endpointRuleSet\n        use aws.auth#unsignedPayload\n        use smithy.test#httpRequestTests\n\n        @auth([sigv4a,sigv4])\n        @sigv4(name: \"dontcare\")\n        @sigv4a(name: \"dontcare\")\n        @restJson1\n        @endpointRuleSet({\n            \"version\": \"1.0\",\n            \"rules\": [\n                {\n                    \"type\": \"endpoint\",\n                    \"conditions\": [],\n                    \"endpoint\": {\n                        \"url\": \"https://example.com\",\n                        \"properties\": {\n                            \"authSchemes\": [\n                                {\n                                    \"name\": \"sigv4a\",\n                                    \"signingRegionSet\": [\"*\"],\n                                    \"signingName\": \"dontcare\"\n                                }\n                            ]\n                        }\n                    }\n                }\n            ],\n            \"parameters\": {\n                \"endpoint\": { \"required\": true, \"type\": \"string\", \"builtIn\": \"SDK::Endpoint\" },\n            }\n        })\n        @service(sdkId: \"dontcare\")\n        service TestService { version: \"2023-01-01\", operations: [SomeOperation] }\n\n        @streaming\n        blob Bytestream\n\n        structure SomeInput {\n            @httpPayload\n            @required\n            something: Bytestream\n         }\n\n        structure SomeOutput { something: String }\n\n        @http(uri: \"/\", method: \"POST\")\n        operation SomeOperation { input: SomeInput, output: SomeOutput }\n        \"\"\".asSmithyModel(smithyVersion = \"2.0\")\n\n    @Test\n    fun unsignedPayloadSetsCorrectHeaderForSigV4a() {\n        awsSdkIntegrationTest(modelWithSigV4aAuthScheme) { clientCodegenContext, rustCrate ->\n            val moduleUseName = clientCodegenContext.moduleUseName()\n            val rc = clientCodegenContext.runtimeConfig\n\n            rustCrate.integrationTest(\"sigv4a\") {\n                Attribute.featureGate(\"test-util\").render(this)\n                tokioTest(\"test_sigv4a_signing\") {\n                    rustTemplate(\n                        \"\"\"\n                        let http_client = #{StaticReplayClient}::new(vec![#{ReplayEvent}::new(\n                            #{Request}::builder()\n                                .header(\"authorization\", \"AWS4-ECDSA-P256-SHA256 Credential=ANOTREAL/20090213/dontcare/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-date;x-amz-region-set;x-amz-user-agent, Signature=3045022100b95d1c054ff04b676d12f0c893348606844d67ccf595981f0ca4968fae2eddfd022073e66edc0ad1da05b08392fccefa3ad69f8ec9393461033412fa05c55b749e9d\")\n                                .uri(\"https://example.com\")\n                                .body(#{SdkBody}::from(\"Hello, world!\"))\n                                .unwrap(),\n                            #{Response}::builder().status(200).body(#{SdkBody}::empty()).unwrap(),\n                        )]);\n                        let config = $moduleUseName::Config::builder()\n                            .http_client(http_client.clone())\n                            .endpoint_url(\"https://example.com\")\n                            .behavior_version_latest()\n                            .with_test_defaults()\n                            .build();\n                        let client = $moduleUseName::Client::from_conf(config);\n                        let _ = client.some_operation().something(#{ByteStream}::from_static(b\"Hello, world!\")).send().await;\n\n                        http_client.assert_requests_match(&[\"authorization\"]);\n                        let auth_header = http_client.actual_requests().next().unwrap().headers().get(http::header::AUTHORIZATION).unwrap();\n                        assert!(auth_header.contains(\"AWS4-ECDSA-P256-SHA256\"));\n                        \"\"\",\n                        \"ByteStream\" to RuntimeType.byteStream(rc),\n                        \"Credentials\" to AwsRuntimeType.awsCredentialTypesTestUtil(rc).resolve(\"Credentials\"),\n                        \"Region\" to AwsRuntimeType.awsTypes(rc).resolve(\"region::Region\"),\n                        \"ReplayEvent\" to\n                            CargoDependency.smithyHttpClientTestUtil(rc).toType()\n                                .resolve(\"test_util::ReplayEvent\"),\n                        \"Request\" to RuntimeType.HttpRequest1x,\n                        \"Response\" to RuntimeType.HttpResponse1x,\n                        \"SdkBody\" to RuntimeType.sdkBody(rc),\n                        \"StaticReplayClient\" to\n                            CargoDependency.smithyHttpClientTestUtil(rc).toType()\n                                .resolve(\"test_util::StaticReplayClient\"),\n                        \"tracing_subscriber\" to RuntimeType.TracingSubscriber,\n                    )\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/test/kotlin/software/amazon/smithy/rustsdk/SmokeTestsDecoratorTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rustsdk\n\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.build.PluginContext\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenVisitor\nimport software.amazon.smithy.rust.codegen.client.smithy.customizations.NoAuthDecorator\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.CombinedClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.RequiredCustomizations\nimport software.amazon.smithy.rust.codegen.client.smithy.endpoint.EndpointsDecorator\nimport software.amazon.smithy.rust.codegen.client.testutil.ClientDecoratableBuildPlugin\nimport software.amazon.smithy.rust.codegen.client.testutil.testClientCodegenContext\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.integrationTest\nimport software.amazon.smithy.rust.codegen.core.testutil.tokioTest\nimport software.amazon.smithy.rust.codegen.core.util.toSnakeCase\n\nclass SmokeTestsDecoratorTest {\n    companion object {\n        val imports = \"\"\"\n            namespace test\n\n            use aws.api#service\n            use smithy.test#smokeTests\n            use aws.auth#sigv4\n            use aws.protocols#restJson1\n            use smithy.rules#endpointRuleSet\n        \"\"\"\n        val traitsWithAllBuiltIns =\n            \"\"\"\n            @service(sdkId: \"dontcare\")\n            @restJson1\n            @sigv4(name: \"dontcare\")\n            @auth([sigv4])\n            @endpointRuleSet({\n                \"version\": \"1.0\",\n                \"rules\": [{ \"type\": \"endpoint\", \"conditions\": [], \"endpoint\": { \"url\": \"https://example.com\" } }],\n                \"parameters\": {\n                    \"Region\": { \"required\": false, \"type\": \"String\", \"builtIn\": \"AWS::Region\" },\n                    \"Endpoint\": {\n                      \"builtIn\": \"SDK::Endpoint\",\n                      \"required\": false,\n                      \"documentation\": \"Override the endpoint used to send this request\",\n                      \"type\": \"String\"\n                    },\n                    \"UseFIPS\": {\n                      \"builtIn\": \"AWS::UseFIPS\",\n                      \"required\": true,\n                      \"default\": false,\n                      \"type\": \"Boolean\"\n                    },\n                    \"UseDualStack\": {\n                      \"builtIn\": \"AWS::UseDualStack\",\n                      \"required\": true,\n                      \"default\": false,\n                      \"type\": \"Boolean\"\n                    },\n                }\n            })\n            \"\"\"\n\n        val traitsWithNoDualStack =\n            \"\"\"\n            @service(sdkId: \"dontcare\")\n            @restJson1\n            @sigv4(name: \"dontcare\")\n            @auth([sigv4])\n            @endpointRuleSet({\n                \"version\": \"1.0\",\n                \"rules\": [{ \"type\": \"endpoint\", \"conditions\": [], \"endpoint\": { \"url\": \"https://example.com\" } }],\n                \"parameters\": {\n                    \"Region\": { \"required\": false, \"type\": \"String\", \"builtIn\": \"AWS::Region\" },\n                    \"Endpoint\": {\n                      \"builtIn\": \"SDK::Endpoint\",\n                      \"required\": false,\n                      \"documentation\": \"Override the endpoint used to send this request\",\n                      \"type\": \"String\"\n                    },\n                    \"UseFIPS\": {\n                      \"builtIn\": \"AWS::UseFIPS\",\n                      \"required\": true,\n                      \"default\": false,\n                      \"type\": \"Boolean\"\n                    },\n                }\n            })\n            \"\"\"\n\n        val traitsWithNoFips =\n            \"\"\"\n            @service(sdkId: \"dontcare\")\n            @restJson1\n            @sigv4(name: \"dontcare\")\n            @auth([sigv4])\n            @endpointRuleSet({\n                \"version\": \"1.0\",\n                \"rules\": [{ \"type\": \"endpoint\", \"conditions\": [], \"endpoint\": { \"url\": \"https://example.com\" } }],\n                \"parameters\": {\n                    \"Region\": { \"required\": false, \"type\": \"String\", \"builtIn\": \"AWS::Region\" },\n                    \"Endpoint\": {\n                      \"builtIn\": \"SDK::Endpoint\",\n                      \"required\": false,\n                      \"documentation\": \"Override the endpoint used to send this request\",\n                      \"type\": \"String\"\n                    },\n                    \"UseDualStack\": {\n                      \"builtIn\": \"AWS::UseDualStack\",\n                      \"required\": true,\n                      \"default\": false,\n                      \"type\": \"Boolean\"\n                    },\n                }\n            })\n            \"\"\"\n\n        val traitsWithNeither =\n            \"\"\"\n            @service(sdkId: \"dontcare\")\n            @restJson1\n            @sigv4(name: \"dontcare\")\n            @auth([sigv4])\n            @endpointRuleSet({\n                \"version\": \"1.0\",\n                \"rules\": [{ \"type\": \"endpoint\", \"conditions\": [], \"endpoint\": { \"url\": \"https://example.com\" } }],\n                \"parameters\": {\n                    \"Region\": { \"required\": false, \"type\": \"String\", \"builtIn\": \"AWS::Region\" },\n                }\n            })\n            \"\"\"\n\n        val serviceDef = \"\"\"\n            service TestService {\n                version: \"2023-01-01\",\n                operations: [SomeOperation]\n            }\n\n            @smokeTests([\n                {\n                    id: \"SomeOperationSuccess\",\n                    params: {}\n                    vendorParamsShape: \"aws.test#AwsVendorParams\",\n                    vendorParams: {\n                        region: \"us-west-2\"\n                    }\n                    expect: { success: {} }\n                }\n                {\n                    id: \"SomeOperationFailure\",\n                    params: {}\n                    vendorParamsShape: \"aws.test#AwsVendorParams\",\n                    vendorParams: {\n                        region: \"us-west-2\"\n                    }\n                    expect: { failure: {} }\n                }\n                {\n                    id: \"SomeOperationFailureExplicitShape\",\n                    params: {}\n                    vendorParamsShape: \"aws.test#AwsVendorParams\",\n                    vendorParams: {\n                        region: \"us-west-2\"\n                    }\n                    expect: {\n                        failure: { errorId: FooException }\n                    }\n                }\n            ])\n            @http(uri: \"/SomeOperation\", method: \"POST\")\n            @optionalAuth\n            operation SomeOperation {\n                input: SomeInput,\n                output: SomeOutput,\n                errors: [FooException]\n            }\n\n            @input\n            structure SomeInput {}\n\n            @output\n            structure SomeOutput {}\n\n            @error(\"server\")\n            structure FooException { }\n        \"\"\"\n        val model = (imports + traitsWithAllBuiltIns + serviceDef).asSmithyModel(smithyVersion = \"2\")\n        val modelWithNoDualStack = (imports + traitsWithNoDualStack + serviceDef).asSmithyModel(smithyVersion = \"2\")\n        val modelWithNoFips = (imports + traitsWithNoFips + serviceDef).asSmithyModel(smithyVersion = \"2\")\n        val modelWithNeitherBuiltIn = (imports + traitsWithNeither + serviceDef).asSmithyModel(smithyVersion = \"2\")\n    }\n\n    @Test\n    fun smokeTestSdkCodegen() {\n        // TODO(https://github.com/smithy-lang/smithy-rs/issues/3863): Comment in once the issue has been resolved\n        // testSmokeTestsWithModel(model)\n    }\n\n    @Test\n    fun smokeTestSdkCodegenNoDualStack() {\n        // TODO(https://github.com/smithy-lang/smithy-rs/issues/3863): Comment in once the issue has been resolved\n        // testSmokeTestsWithModel(modelWithNoDualStack)\n    }\n\n    @Test\n    fun smokeTestSdkCodegenNoFips() {\n        // TODO(https://github.com/smithy-lang/smithy-rs/issues/3863): Comment in once the issue has been resolved\n        // testSmokeTestsWithModel(modelWithNoFips)\n    }\n\n    @Test\n    fun smokeTestSdkCodegenNeitherBuiltIn() {\n        // TODO(https://github.com/smithy-lang/smithy-rs/issues/3863): Comment in once the issue has been resolved\n        // testSmokeTestsWithModel(modelWithNeitherBuiltIn)\n    }\n\n    fun testSmokeTestsWithModel(model: Model) {\n        val codegenContext = testClientCodegenContext(model)\n        val smokeTestedOperations = operationToTestCases(model)\n        awsSdkIntegrationTest(\n            model,\n            buildPlugin = SdkSmokeTestsRustClientCodegenPlugin(),\n            // `SdkSmokeTestsRustClientCodegenPlugin` only uses the minimal set of codegen decorators, which results\n            // in a significant amount of unused code. This can cause `clippy` to fail with the `--deny warnings`\n            // setting enabled by default in `.crate/config.toml` in test workspaces.\n            // To work around this issue, we unset `RUSTFLAGS` to allow unused and dead code. To perform a compilation\n            // only test, we don't need to set `mapOf(Pair(\"RUSTFLAGS\", \"--cfg smoketests\"))` since that would\n            // cause the tests to actually run (against a non-existent service) and fail.\n            environment = mapOf(Pair(\"RUSTFLAGS\", \"\")),\n            test = { codegenContext, crate ->\n                // It should compile. We can't run the tests because they don't target a real service.\n                // They are skipped because the `smoketests` flag is unset for `rustc` in the `cargo test`\n                // invocation specified by `awsIntegrationTestParams`.\n                crate.integrationTest(\"smoketests\") {\n                    renderPrologue(codegenContext.moduleUseName(), this)\n                    for ((shape, testCases) in smokeTestedOperations) {\n                        val sut =\n                            SmokeTestsInstantiator(\n                                codegenContext, shape,\n                                // We cannot use `aws_config::load_defaults`, but a default-constructed config builder\n                                // will suffice for the test.\n                                configBuilderInitializer = { ->\n                                    writable {\n                                        rust(\n                                            \"\"\"\n                                            let conf = config::Builder::new().build();\n                                            let params = ${codegenContext.moduleUseName()}::config::endpoint::Params::builder()\n                                            \"\"\".trimIndent(),\n                                        )\n                                    }\n                                },\n                            )\n                        for (testCase in testCases) {\n                            tokioTest(\"test_${testCase.id.toSnakeCase()}\") {\n                                sut.render(this, testCase)\n                            }\n                        }\n                    }\n                }\n            },\n        )\n    }\n}\n\n/**\n * A `ClientDecoratableBuildPlugin` that intentionally avoids including `codegenDecorator` on the classpath.\n *\n *  If we used `RustClientCodegenPlugin` on the classpath from this location, it would return decorators including\n *  `SmokeTestsDecorator` that ultimately pulls in the `aws-config` crate. This crate depends on runtime crates located\n *  in the `aws/sdk/build` directory, causing conflicts with runtime crates in `rust-runtime` or in `aws/rust-runtime`.\n *\n *  This class does not look at the classpath to prevent the inclusion of the `aws-config` crate. Instead, it uses the\n *  minimal set of codegen decorators to generate modules sufficient to compile smoke tests in a test\n *  workspace.\n */\nclass SdkSmokeTestsRustClientCodegenPlugin : ClientDecoratableBuildPlugin() {\n    override fun getName(): String = \"sdk-smoke-tests-rust-client-codegen\"\n\n    override fun executeWithDecorator(\n        context: PluginContext,\n        vararg decorator: ClientCodegenDecorator,\n    ) {\n        val codegenDecorator =\n            CombinedClientCodegenDecorator(\n                listOf(\n                    EndpointsDecorator(),\n                    AwsFluentClientDecorator(),\n                    SdkConfigDecorator(),\n                    NoAuthDecorator(),\n                    RequiredCustomizations(),\n                    *decorator,\n                ),\n            )\n\n        ClientCodegenVisitor(context, codegenDecorator).execute()\n    }\n}\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/test/kotlin/software/amazon/smithy/rustsdk/TestUtil.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rustsdk\n\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.node.ObjectNode\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientRustSettings\nimport software.amazon.smithy.rust.codegen.client.smithy.RustClientCodegenPlugin\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.client.testutil.ClientDecoratableBuildPlugin\nimport software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest\nimport software.amazon.smithy.rust.codegen.client.testutil.testClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.testutil.testClientRustSettings\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeCrateLocation\nimport software.amazon.smithy.rust.codegen.core.smithy.RustCrate\nimport software.amazon.smithy.rust.codegen.core.testutil.IntegrationTestParams\nimport software.amazon.smithy.rust.codegen.core.testutil.TestRuntimeConfig\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport java.io.File\n\n// In aws-sdk-codegen, the working dir when gradle runs tests is actually `./aws`. So, to find the smithy runtime, we need\n// to go up one more level\nval AwsTestRuntimeConfig =\n    TestRuntimeConfig.copy(\n        runtimeCrateLocation =\n            run {\n                val path = File(\"../../rust-runtime\")\n                check(path.exists()) { \"$path must exist to generate a working SDK\" }\n                RuntimeCrateLocation.path(path.absolutePath)\n            },\n    )\n\nfun awsTestCodegenContext(\n    model: Model? = null,\n    settings: ClientRustSettings? = null,\n) = testClientCodegenContext(\n    model ?: \"namespace test\".asSmithyModel(),\n    settings = settings ?: testClientRustSettings(runtimeConfig = AwsTestRuntimeConfig),\n)\n\nfun awsSdkIntegrationTest(\n    model: Model,\n    params: IntegrationTestParams = awsIntegrationTestParams(),\n    additionalDecorators: List<ClientCodegenDecorator> = listOf(),\n    buildPlugin: ClientDecoratableBuildPlugin = RustClientCodegenPlugin(),\n    environment: Map<String, String> = mapOf(),\n    test: (ClientCodegenContext, RustCrate) -> Unit = { _, _ -> },\n) = clientIntegrationTest(\n    model,\n    params,\n    additionalDecorators = additionalDecorators,\n    buildPlugin = buildPlugin,\n    environment = environment,\n    test = test,\n)\n\nfun awsIntegrationTestParams() =\n    IntegrationTestParams(\n        cargoCommand = \"cargo test --features test-util,behavior-version-latest --tests --lib\",\n        runtimeConfig = AwsTestRuntimeConfig,\n        additionalSettings =\n            ObjectNode.builder().withMember(\n                \"customizationConfig\",\n                ObjectNode.builder()\n                    .withMember(\n                        \"awsSdk\",\n                        ObjectNode.builder()\n                            .withMember(\"awsSdkBuild\", true)\n                            .withMember(\"suppressReadme\", true)\n                            .withMember(\"integrationTestPath\", \"../sdk/integration-tests\")\n                            .withMember(\"partitionsConfigPath\", \"../sdk/aws-models/sdk-partitions.json\")\n                            .build(),\n                    ).build(),\n            )\n                .withMember(\n                    \"codegen\",\n                    ObjectNode.builder()\n                        .withMember(\"includeFluentClient\", false)\n                        .withMember(\"includeEndpointUrlConfig\", false)\n                        .build(),\n                ).build(),\n    )\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/test/kotlin/software/amazon/smithy/rustsdk/TimeoutConfigMergingTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rustsdk\n\nimport SdkCodegenIntegrationTest\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.testutil.integrationTest\n\nclass TimeoutConfigMergingTest {\n    @Test\n    fun testTimeoutSettingsProperlyMerged() {\n        awsSdkIntegrationTest(SdkCodegenIntegrationTest.model) { ctx, crate ->\n            val name = ctx.moduleUseName()\n            crate.integrationTest(\"timeout_settings_properly_merged\") {\n                rustTemplate(\n                    \"\"\"\n\n                    use $name::Client;\n                    use aws_smithy_runtime::test_util::capture_test_logs::capture_test_logs;\n                    use aws_smithy_runtime_api::box_error::BoxError;\n                    use aws_smithy_runtime_api::client::interceptors::context::BeforeTransmitInterceptorContextRef;\n                    use aws_smithy_runtime_api::client::interceptors::Intercept;\n                    use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents;\n                    use aws_smithy_runtime::client::http::test_util::infallible_client_fn;\n                    use aws_smithy_types::config_bag::ConfigBag;\n                    use aws_smithy_types::timeout::TimeoutConfig;\n                    use aws_smithy_types::body::SdkBody;\n                    use aws_types::SdkConfig;\n                    use std::sync::Arc;\n                    use std::sync::Mutex;\n                    use std::time::Duration;\n\n                    ##[derive(Debug, Clone)]\n                    struct CaptureConfigInterceptor {\n                        timeout_config: Arc<Mutex<Option<TimeoutConfig>>>,\n                    }\n\n                    impl Intercept for CaptureConfigInterceptor {\n                        fn name(&self) -> &'static str {\n                            \"capture config interceptor\"\n                        }\n\n                        fn read_before_attempt(\n                            &self,\n                            _context: &BeforeTransmitInterceptorContextRef<'_>,\n                            _runtime_components: &RuntimeComponents,\n                            cfg: &mut ConfigBag,\n                        ) -> Result<(), BoxError> {\n                            *self.timeout_config.lock().unwrap() = cfg.load::<TimeoutConfig>().cloned();\n                            Ok(())\n                        }\n                    }\n                    #{tokio_test}\n                    async fn test_all_timeouts() {\n                        let (_logs, _guard) = capture_test_logs();\n                        let connect_timeout = Duration::from_secs(1);\n                        let read_timeout = Duration::from_secs(2);\n                        let operation_attempt = Duration::from_secs(3);\n                        let operation = Duration::from_secs(4);\n                        let http_client = infallible_client_fn(|_req| http::Response::builder().body(SdkBody::empty()).unwrap());\n                        let sdk_config = SdkConfig::builder()\n                            .behavior_version(aws_smithy_runtime_api::client::behavior_version::BehaviorVersion::v2026_01_12())\n                            .timeout_config(\n                                TimeoutConfig::builder()\n                                    .connect_timeout(connect_timeout)\n                                    .build(),\n                            )\n                            .http_client(http_client)\n                            .build();\n                        let client_config = $name::config::Builder::from(&sdk_config)\n                            .timeout_config(TimeoutConfig::builder().read_timeout(read_timeout).build())\n                            .build();\n                        let client = Client::from_conf(client_config);\n                        let interceptor = CaptureConfigInterceptor {\n                            timeout_config: Default::default(),\n                        };\n                        let _err = client\n                            .some_operation()\n                            .customize()\n                            .config_override(\n                                $name::Config::builder().timeout_config(\n                                    TimeoutConfig::builder()\n                                        .operation_attempt_timeout(operation_attempt)\n                                        .operation_timeout(operation)\n                                        .build(),\n                                ),\n                            )\n                            .interceptor(interceptor.clone())\n                            .send()\n                            .await;\n                        let _ = dbg!(_err);\n                        assert_eq!(\n                            interceptor\n                                .timeout_config\n                                .lock()\n                                .unwrap()\n                                .as_ref()\n                                .expect(\"timeout config not set\"),\n                            &TimeoutConfig::builder()\n                                .operation_timeout(operation)\n                                .operation_attempt_timeout(operation_attempt)\n                                .read_timeout(read_timeout)\n                                .connect_timeout(connect_timeout)\n                                .build(),\n                            \"full set of timeouts set from all three sources.\"\n                        );\n\n                        // disable timeouts\n                        let _err = client\n                            .some_operation()\n                            .customize()\n                            .config_override(\n                                $name::Config::builder().timeout_config(\n                                    TimeoutConfig::disabled(),\n                                ),\n                            )\n                            .interceptor(interceptor.clone())\n                            .send()\n                            .await;\n                        let _ = dbg!(_err);\n                        assert_eq!(\n                            interceptor\n                                .timeout_config\n                                .lock()\n                                .unwrap()\n                                .as_ref()\n                                .expect(\"timeout config not set\"),\n                            &TimeoutConfig::disabled(),\n                            \"timeouts disabled by config override\"\n                        );\n\n                        // override one field\n                        let _err = client\n                            .some_operation()\n                            .customize()\n                            .config_override(\n                                $name::Config::builder().timeout_config(\n                                    TimeoutConfig::builder().read_timeout(Duration::from_secs(10)).build(),\n                                ),\n                            )\n                            .interceptor(interceptor.clone())\n                            .send()\n                            .await;\n                        let _ = dbg!(_err);\n                        assert_eq!(\n                            interceptor\n                                .timeout_config\n                                .lock()\n                                .unwrap()\n                                .as_ref()\n                                .expect(\"timeout config not set\"),\n                            &TimeoutConfig::builder()\n                                .read_timeout(Duration::from_secs(10))\n                                .connect_timeout(connect_timeout)\n                                .build(),\n                            \"read timeout overridden\"\n                        );\n                    }\n                    \"\"\",\n                    \"tokio_test\" to writable { Attribute.TokioTest.render(this) },\n                )\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/test/kotlin/software/amazon/smithy/rustsdk/TokenProvidersDecoratorTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rustsdk\n\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.integrationTest\nimport software.amazon.smithy.rust.codegen.core.testutil.tokioTest\n\nclass TokenProvidersDecoratorTest {\n    val model =\n        \"\"\"\n        namespace test\n\n        use aws.api#service\n        use aws.protocols#restJson1\n        use smithy.rules#endpointRuleSet\n\n        @service(sdkId: \"dontcare\")\n        @restJson1\n        @httpBearerAuth\n        @endpointRuleSet({\n            \"version\": \"1.0\",\n            \"rules\": [{ \"type\": \"endpoint\", \"conditions\": [], \"endpoint\": { \"url\": \"https://example.com\" } }],\n            \"parameters\": {\n                \"Region\": { \"required\": false, \"type\": \"String\", \"builtIn\": \"AWS::Region\" },\n            }\n        })\n        service TestService {\n            version: \"2023-01-01\",\n            operations: [SomeOperation]\n        }\n\n        structure SomeOutput {\n            someAttribute: Long,\n            someVal: String\n        }\n\n        @http(uri: \"/SomeOperation\", method: \"GET\")\n        operation SomeOperation {\n            output: SomeOutput\n        }\n        \"\"\".asSmithyModel()\n\n    @Test\n    fun `it adds token provider configuration`() {\n        awsSdkIntegrationTest(model) { ctx, rustCrate ->\n            rustCrate.integrationTest(\"token_providers\") {\n                tokioTest(\"configuring_credentials_provider_at_operation_level_should_work\") {\n                    val moduleName = ctx.moduleUseName()\n                    rustTemplate(\n                        \"\"\"\n                        // this should compile\n                        let _ = $moduleName::Config::builder()\n                            .token_provider(#{TestToken}::for_tests())\n                            .build();\n\n                        // this should also compile\n                        $moduleName::Config::builder()\n                            .set_token_provider(Some(#{SharedTokenProvider}::new(#{TestToken}::for_tests())));\n                        \"\"\",\n                        \"TestToken\" to AwsRuntimeType.awsCredentialTypesTestUtil(ctx.runtimeConfig).resolve(\"Token\"),\n                        \"SharedTokenProvider\" to\n                            AwsRuntimeType.awsCredentialTypes(ctx.runtimeConfig)\n                                .resolve(\"provider::token::SharedTokenProvider\"),\n                    )\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/test/kotlin/software/amazon/smithy/rustsdk/UserAgentDecoratorTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rustsdk\n\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.integrationTest\nimport software.amazon.smithy.rust.codegen.core.testutil.tokioTest\n\nclass UserAgentDecoratorTest {\n    companion object {\n        // Can't use the dollar sign in a multiline string with doing it like this.\n        private const val PREFIX = \"\\$version: \\\"2\\\"\"\n        val model =\n            \"\"\"\n            $PREFIX\n            namespace test\n\n            use aws.api#service\n            use aws.auth#sigv4\n            use aws.protocols#restJson1\n            use smithy.rules#endpointRuleSet\n\n            @service(sdkId: \"dontcare\")\n            @restJson1\n            @sigv4(name: \"dontcare\")\n            @auth([sigv4])\n            @endpointRuleSet({\n                \"version\": \"1.0\",\n                \"rules\": [{ \"type\": \"endpoint\", \"conditions\": [], \"endpoint\": { \"url\": \"https://example.com\" } }],\n                \"parameters\": {\n                    \"Region\": { \"required\": false, \"type\": \"String\", \"builtIn\": \"AWS::Region\" },\n                }\n            })\n            service TestService {\n                version: \"2023-01-01\",\n                operations: [SomeOperation]\n            }\n\n            @http(uri: \"/SomeOperation\", method: \"GET\")\n            @optionalAuth\n            operation SomeOperation {\n                input: SomeInput,\n                output: SomeOutput\n            }\n\n            @input\n            structure SomeInput {}\n\n            @output\n            structure SomeOutput {}\n            \"\"\".asSmithyModel()\n    }\n\n    @Test\n    fun smokeTestSdkCodegen() {\n        awsSdkIntegrationTest(model) { _, _ ->\n            // it should compile\n        }\n    }\n\n    @Test\n    fun userAgentWorks() {\n        awsSdkIntegrationTest(model) { context, rustCrate ->\n            val rc = context.runtimeConfig\n            val moduleName = context.moduleUseName()\n            rustCrate.integrationTest(\"user-agent\") {\n                rustTemplate(\n                    \"\"\"\n                    use $moduleName::config::{AppName, Credentials, Region, SharedCredentialsProvider};\n                    use $moduleName::{Config, Client};\n                    use #{capture_request};\n\n                    ##[#{tokio}::test]\n                    async fn user_agent_app_name() {\n                        let (http_client, rcvr) = capture_request(None);\n                        let config = Config::builder()\n                            .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests()))\n                            .region(Region::new(\"us-east-1\"))\n                            .http_client(http_client.clone())\n                            .app_name(AppName::new(\"test-app-name\").expect(\"valid app name\")) // set app name in config\n                            .build();\n                        let client = Client::from_conf(config);\n                        let _ = client.some_operation().send().await;\n\n                        // verify app name made it to the user agent\n                        let request = rcvr.expect_request();\n                        let formatted = std::str::from_utf8(\n                            request\n                                .headers()\n                                .get(\"x-amz-user-agent\")\n                                .unwrap()\n                                .as_bytes(),\n                        )\n                        .unwrap();\n                        assert!(\n                            formatted.ends_with(\" app/test-app-name\"),\n                            \"'{}' didn't end with the app name\",\n                            formatted\n                        );\n                    }\n\n                    ##[#{tokio}::test]\n                    async fn user_agent_http_client() {\n                        let (http_client, rcvr) = capture_request(None);\n                        let config = Config::builder()\n                            .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests()))\n                            .region(Region::new(\"us-east-1\"))\n                            .http_client(http_client.clone())\n                            .app_name(AppName::new(\"test-app-name\").expect(\"valid app name\")) // set app name in config\n                            .build();\n                        let client = Client::from_conf(config);\n                        let _ = client.some_operation().send().await;\n\n                        // verify app name made it to the user agent\n                        let request = rcvr.expect_request();\n                        let formatted = std::str::from_utf8(\n                            request\n                                .headers()\n                                .get(\"x-amz-user-agent\")\n                                .unwrap()\n                                .as_bytes(),\n                        )\n                        .unwrap();\n                        assert!(\n                            formatted.contains(\"md/http##capture-request-handler\"),\n                            \"'{}' didn't include connector metadata\",\n                            formatted\n                        );\n                    }\n                    \"\"\",\n                    *preludeScope,\n                    \"tokio\" to CargoDependency.Tokio.toDevDependency().withFeature(\"rt\").withFeature(\"macros\").toType(),\n                    \"capture_request\" to RuntimeType.captureRequest(rc),\n                )\n            }\n        }\n    }\n\n    @Test\n    fun `it avoids emitting repeated business metrics on retry`() {\n        awsSdkIntegrationTest(model) { context, rustCrate ->\n            rustCrate.integrationTest(\"business_metrics\") {\n                tokioTest(\"metrics_should_not_be_repeated\") {\n                    val rc = context.runtimeConfig\n                    val moduleName = context.moduleUseName()\n                    rustTemplate(\n                        \"\"\"\n                        use $moduleName::config::{AppName, Credentials, Region, SharedCredentialsProvider};\n                        use $moduleName::{Config, Client};\n\n                        let http_client = #{StaticReplayClient}::new(vec![\n                            #{ReplayEvent}::new(\n                                #{HttpRequest1x}::builder()\n                                    .uri(\"http://localhost:1234/\")\n                                    .body(#{SdkBody}::empty())\n                                    .unwrap(),\n                                #{HttpResponse1x}::builder()\n                                    .status(500)\n                                    .body(#{SdkBody}::empty())\n                                    .unwrap(),\n                            ),\n                            #{ReplayEvent}::new(\n                                #{HttpRequest1x}::builder()\n                                    .uri(\"http://localhost:1234/\")\n                                    .body(#{SdkBody}::empty())\n                                    .unwrap(),\n                                #{HttpResponse1x}::builder()\n                                    .status(200)\n                                    .body(#{SdkBody}::empty())\n                                    .unwrap(),\n                            ),\n                        ]);\n\n                        let mut creds = Credentials::for_tests();\n                        creds.get_property_mut_or_default::<Vec<#{AwsCredentialFeature}>>()\n                            .push(#{AwsCredentialFeature}::CredentialsEnvVars);\n\n                        let config = Config::builder()\n                            .credentials_provider(SharedCredentialsProvider::new(creds))\n                            .retry_config(#{RetryConfig}::standard().with_max_attempts(2))\n                            .region(Region::new(\"us-east-1\"))\n                            .http_client(http_client.clone())\n                            .app_name(AppName::new(\"test-app-name\").expect(\"valid app name\"))\n                            .build();\n                        let client = Client::from_conf(config);\n                        let _ = client.some_operation().send().await;\n\n                        let req = http_client.actual_requests().last().unwrap();\n                        let aws_ua_header = req.headers().get(\"x-amz-user-agent\").unwrap();\n                        let metrics_section = aws_ua_header\n                            .split(\" m/\")\n                            .nth(1)\n                            .unwrap()\n                            .split_ascii_whitespace()\n                            .nth(0)\n                            .unwrap();\n                        assert_eq!(1, metrics_section.matches(\"g\").count());\n                        \"\"\",\n                        \"AwsCredentialFeature\" to\n                            AwsRuntimeType.awsCredentialTypes(rc)\n                                .resolve(\"credential_feature::AwsCredentialFeature\"),\n                        \"HttpRequest1x\" to RuntimeType.HttpRequest1x,\n                        \"HttpResponse1x\" to RuntimeType.HttpResponse1x,\n                        \"RetryConfig\" to RuntimeType.smithyTypes(rc).resolve(\"retry::RetryConfig\"),\n                        \"ReplayEvent\" to RuntimeType.smithyHttpClientTestUtil(rc).resolve(\"test_util::ReplayEvent\"),\n                        \"SdkBody\" to RuntimeType.sdkBody(rc),\n                        \"StaticReplayClient\" to\n                            RuntimeType.smithyHttpClientTestUtil(rc)\n                                .resolve(\"test_util::StaticReplayClient\"),\n                    )\n                }\n            }\n        }\n    }\n\n    @Test\n    fun `it emits business metric for RPC v2 CBOR in user agent`() {\n        val model =\n            \"\"\"\n            namespace test\n\n            use aws.auth#sigv4\n            use aws.api#service\n            use smithy.protocols#rpcv2Cbor\n            use smithy.rules#endpointRuleSet\n\n            @auth([sigv4])\n            @sigv4(name: \"dontcare\")\n            @rpcv2Cbor\n            @endpointRuleSet({\n                \"version\": \"1.0\",\n                \"rules\": [{ \"type\": \"endpoint\", \"conditions\": [], \"endpoint\": { \"url\": \"https://example.com\" } }],\n                \"parameters\": {}\n            })\n            @service(sdkId: \"dontcare\")\n            service TestService { version: \"2023-01-01\", operations: [SomeOperation] }\n            structure SomeOutput { something: String }\n            operation SomeOperation { output: SomeOutput }\n            \"\"\".asSmithyModel()\n\n        awsSdkIntegrationTest(model) { ctx, rustCrate ->\n            rustCrate.integrationTest(\"business_metric_for_rpc_v2_cbor\") {\n                tokioTest(\"should_emit_metric_in_user_agent\") {\n                    val rc = ctx.runtimeConfig\n                    val moduleName = ctx.moduleUseName()\n                    rustTemplate(\n                        \"\"\"\n                        use $moduleName::config::Region;\n                        use $moduleName::{Client, Config};\n\n                        let (http_client, rcvr) = #{capture_request}(#{None});\n                        let config = Config::builder()\n                            .region(Region::new(\"us-east-1\"))\n                            .http_client(http_client.clone())\n                            .with_test_defaults()\n                            .build();\n                        let client = Client::from_conf(config);\n                        let _ = client.some_operation().send().await;\n                        let expected_req = rcvr.expect_request();\n                        let user_agent = expected_req\n                            .headers()\n                            .get(\"x-amz-user-agent\")\n                            .unwrap();\n                        #{assert_ua_contains_metric_values}(user_agent, &[\"M\"]);\n                        \"\"\",\n                        *preludeScope,\n                        \"assert_ua_contains_metric_values\" to\n                            AwsRuntimeType.awsRuntimeTestUtil(rc)\n                                .resolve(\"user_agent::test_util::assert_ua_contains_metric_values\"),\n                        \"capture_request\" to RuntimeType.captureRequest(rc),\n                        \"UserAgentInterceptor\" to\n                            AwsRuntimeType.awsRuntime(rc)\n                                .resolve(\"user_agent::UserAgentInterceptor\"),\n                    )\n                }\n            }\n        }\n    }\n\n    @Test\n    fun `it emits business metrics for retry modes`() {\n        val model =\n            \"\"\"\n            namespace test\n\n            use aws.auth#sigv4\n            use aws.api#service\n            use aws.protocols#restJson1\n            use smithy.rules#endpointRuleSet\n\n            @auth([sigv4])\n            @sigv4(name: \"dontcare\")\n            @endpointRuleSet({\n                \"version\": \"1.0\",\n                \"rules\": [{ \"type\": \"endpoint\", \"conditions\": [], \"endpoint\": { \"url\": \"https://example.com\" } }],\n                \"parameters\": {}\n            })\n            @service(sdkId: \"dontcare\")\n            @restJson1\n            service TestService { version: \"2023-01-01\", operations: [SomeOperation] }\n\n            @http(uri: \"/SomeOperation\", method: \"GET\")\n            @optionalAuth\n            operation SomeOperation {\n                input: SomeInput,\n                output: SomeOutput\n            }\n\n            @input\n            structure SomeInput {}\n\n            @output\n            structure SomeOutput {}\n            \"\"\".asSmithyModel()\n\n        awsSdkIntegrationTest(model) { ctx, rustCrate ->\n            rustCrate.integrationTest(\"retry_mode_feature_tracker\") {\n                val rc = ctx.runtimeConfig\n                val moduleName = ctx.moduleUseName()\n\n                rust(\n                    \"\"\"\n                    use $moduleName::config::{Region, retry::RetryConfig};\n                    use $moduleName::{Client, Config};\n                    \"\"\",\n                )\n\n                tokioTest(\"should_emit_metric_in_user_agent_standard_mode\") {\n                    rustTemplate(\n                        \"\"\"\n                        let (http_client, rcvr) = #{capture_request}(#{None});\n                        let config = Config::builder()\n                            .region(Region::new(\"us-east-1\"))\n                            .http_client(http_client.clone())\n                            .retry_config(RetryConfig::standard())\n                            .with_test_defaults()\n                            .build();\n                        let client = Client::from_conf(config);\n                        let _ = client.some_operation().send().await;\n                        let expected_req = rcvr.expect_request();\n                        let user_agent = expected_req\n                            .headers()\n                            .get(\"x-amz-user-agent\")\n                            .unwrap();\n                        #{assert_ua_contains_metric_values}(user_agent, &[\"E\"]);\n                        \"\"\",\n                        *preludeScope,\n                        \"assert_ua_contains_metric_values\" to\n                            AwsRuntimeType.awsRuntimeTestUtil(rc)\n                                .resolve(\"user_agent::test_util::assert_ua_contains_metric_values\"),\n                        \"capture_request\" to RuntimeType.captureRequest(rc),\n                        \"UserAgentInterceptor\" to\n                            AwsRuntimeType.awsRuntime(rc)\n                                .resolve(\"user_agent::UserAgentInterceptor\"),\n                    )\n                }\n\n                tokioTest(\"should_emit_metric_in_user_agent_adaptive_mode\") {\n                    rustTemplate(\n                        \"\"\"\n                        let (http_client, rcvr) = #{capture_request}(#{None});\n                        let config = Config::builder()\n                            .region(Region::new(\"us-east-1\"))\n                            .http_client(http_client.clone())\n                            .retry_config(RetryConfig::adaptive())\n                            .with_test_defaults()\n                            .build();\n                        let client = Client::from_conf(config);\n                        let _ = client.some_operation().send().await;\n                        let expected_req = rcvr.expect_request();\n                        let user_agent = expected_req\n                            .headers()\n                            .get(\"x-amz-user-agent\")\n                            .unwrap();\n                        #{assert_ua_contains_metric_values}(user_agent, &[\"F\"]);\n                        \"\"\",\n                        *preludeScope,\n                        \"assert_ua_contains_metric_values\" to\n                            AwsRuntimeType.awsRuntimeTestUtil(rc)\n                                .resolve(\"user_agent::test_util::assert_ua_contains_metric_values\"),\n                        \"capture_request\" to RuntimeType.captureRequest(rc),\n                        \"UserAgentInterceptor\" to\n                            AwsRuntimeType.awsRuntime(rc)\n                                .resolve(\"user_agent::UserAgentInterceptor\"),\n                    )\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/test/kotlin/software/amazon/smithy/rustsdk/customize/IsTruncatedPaginatorTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rustsdk.customize\n\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.transform.ModelTransformer\nimport software.amazon.smithy.rust.codegen.client.smithy.traits.IsTruncatedPaginatorTrait\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.integrationTest\nimport software.amazon.smithy.rust.codegen.core.util.letIf\nimport software.amazon.smithy.rustsdk.AwsRuntimeType\nimport software.amazon.smithy.rustsdk.awsSdkIntegrationTest\n\nclass IsTruncatedPaginatorTest {\n    private val model =\n        \"\"\"\n        namespace test\n\n        use aws.protocols#restXml\n        use aws.api#service\n        use smithy.rules#endpointRuleSet\n\n        @restXml\n        @service(sdkId: \"fake\")\n        @endpointRuleSet({\n            \"version\": \"1.0\",\n            \"rules\": [{ \"type\": \"endpoint\", \"conditions\": [], \"endpoint\": { \"url\": \"https://example.com\" } }],\n            \"parameters\": {\n                \"Region\": { \"required\": false, \"type\": \"String\", \"builtIn\": \"AWS::Region\" },\n            }\n        })\n        service TestService {\n            operations: [PaginatedList]\n        }\n\n        @readonly\n        @optionalAuth\n        @http(uri: \"/PaginatedList\", method: \"POST\")\n        @paginated(inputToken: \"nextToken\", outputToken: \"nextToken\",\n                   pageSize: \"maxResults\", items: \"items\")\n        operation PaginatedList {\n            input: GetFoosInput,\n            output: GetFoosOutput\n        }\n\n        structure GetFoosInput {\n            maxResults: Integer,\n            nextToken: String\n        }\n\n        structure GetFoosOutput {\n            nextToken: String,\n            items: StringList,\n            isTruncated: Boolean,\n        }\n\n        list StringList {\n            member: String\n        }\n        \"\"\".asSmithyModel()\n\n    @Test\n    fun `isTruncated paginators work`() {\n        // Adding IsTruncated trait to the output shape\n        val modifiedModel =\n            ModelTransformer.create().mapShapes(model) { shape ->\n                shape.letIf(shape.isStructureShape && shape.toShapeId() == ShapeId.from(\"test#GetFoosOutput\")) {\n                    (it as StructureShape).toBuilder().addTrait(IsTruncatedPaginatorTrait()).build()\n                }\n            }\n\n        awsSdkIntegrationTest(modifiedModel) { context, rustCrate ->\n            val rc = context.runtimeConfig\n            val moduleName = context.moduleUseName()\n            rustCrate.integrationTest(\"is_truncated_paginator\") {\n                rustTemplate(\n                    \"\"\"\n                    ##![cfg(feature = \"test-util\")]\n\n                    use $moduleName::Config;\n                    use $moduleName::Client;\n                    use #{Region};\n                    use aws_smithy_runtime::client::http::test_util::{ReplayEvent, StaticReplayClient};\n                    use aws_smithy_types::body::SdkBody;\n\n                    fn mk_response(part_marker: u8) -> http::Response<SdkBody> {\n                        let (part_num_marker, next_num_marker, is_truncated) = if part_marker < 3 {\n                            (part_marker, part_marker + 1, true)\n                        } else {\n                            (part_marker, 0, false)\n                        };\n                        let body = format!(\n                            \"<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?>\\n\n                        <GetFoosOutput\n                            xmlns=\\\"http://s3.amazonaws.com/doc/2006-03-01/\\\">\n                            <token>{part_num_marker}</token>\n                            <nextToken>{next_num_marker}</nextToken>\n                            <isTruncated>{is_truncated}</isTruncated>\n                        </GetFoosOutput>\"\n                        );\n                        http::Response::builder().body(SdkBody::from(body)).unwrap()\n                    }\n\n                    fn mk_request() -> http::Request<SdkBody> {\n                        http::Request::builder()\n                            .uri(\"https://some-test-bucket.s3.us-east-1.amazonaws.com/test.txt?part-number-marker=PartNumberMarker&uploadId=UploadId\")\n                            .body(SdkBody::empty())\n                            .unwrap()\n                    }\n\n                    ##[#{tokio}::test]\n                    async fn is_truncated_pagination_does_not_loop() {\n                        let http_client = StaticReplayClient::new(vec![\n                            ReplayEvent::new(mk_request(), mk_response(0)),\n                            ReplayEvent::new(mk_request(), mk_response(1)),\n                            ReplayEvent::new(mk_request(), mk_response(2)),\n                            ReplayEvent::new(mk_request(), mk_response(3)),\n                            //The events below should never be called because the pagination should\n                            //terminate with the event above\n                            ReplayEvent::new(mk_request(), mk_response(0)),\n                            ReplayEvent::new(mk_request(), mk_response(1)),\n                        ]);\n\n                        let config = Config::builder()\n                            .region(Region::new(\"fake\"))\n                            .http_client(http_client.clone())\n                            .with_test_defaults()\n                            .build();\n                        let client = Client::from_conf(config);\n\n                        let list_parts_res = client\n                            .paginated_list()\n                            .max_results(1)\n                            .into_paginator()\n                            .send()\n                            .collect::<Vec<_>>()\n                            .await;\n\n                        // Confirm that the pagination stopped calling the http client after the\n                        // first page with is_truncated = false\n                        assert_eq!(list_parts_res.len(), 4)\n                    }\n                    \"\"\",\n                    *preludeScope,\n                    \"tokio\" to CargoDependency.Tokio.toType(),\n                    \"Region\" to AwsRuntimeType.awsTypes(rc).resolve(\"region::Region\"),\n                )\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/test/kotlin/software/amazon/smithy/rustsdk/customize/RemoveDefaultsTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rustsdk.customize\n\nimport io.kotest.matchers.shouldBe\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.model.shapes.IntegerShape\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.traits.DefaultTrait\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\nimport software.amazon.smithy.rust.codegen.core.util.lookup\nimport software.amazon.smithy.rust.codegen.core.util.shapeId\n\ninternal class RemoveDefaultsTest {\n    @Test\n    fun `defaults should be removed`() {\n        val removeDefaults =\n            setOf(\n                \"test#Bar\".shapeId(),\n                \"test#Foo\\$baz\".shapeId(),\n            )\n        val baseModel =\n            \"\"\"\n            namespace test\n\n            structure Foo {\n                bar: Bar = 0\n                baz: Integer = 0\n            }\n\n            @default(0)\n            integer Bar\n\n            \"\"\".asSmithyModel(smithyVersion = \"2.0\")\n        val model = RemoveDefaults.processModel(baseModel, removeDefaults)\n        val barMember = model.lookup<MemberShape>(\"test#Foo\\$bar\")\n        barMember.hasTrait<DefaultTrait>() shouldBe false\n        val bazMember = model.lookup<MemberShape>(\"test#Foo\\$baz\")\n        bazMember.hasTrait<DefaultTrait>() shouldBe false\n        val root = model.lookup<IntegerShape>(\"test#Bar\")\n        root.hasTrait<DefaultTrait>() shouldBe false\n    }\n}\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/test/kotlin/software/amazon/smithy/rustsdk/customize/ec2/EC2MakePrimitivesOptionalTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rustsdk.customize.ec2\n\nimport io.kotest.matchers.shouldBe\nimport org.junit.jupiter.params.ParameterizedTest\nimport org.junit.jupiter.params.provider.CsvSource\nimport software.amazon.smithy.model.knowledge.NullableIndex\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.util.lookup\n\ninternal class EC2MakePrimitivesOptionalTest {\n    @ParameterizedTest\n    @CsvSource(\n        \"CLIENT\",\n        \"CLIENT_CAREFUL\",\n        \"CLIENT_ZERO_VALUE_V1\",\n        \"CLIENT_ZERO_VALUE_V1_NO_INPUT\",\n    )\n    fun `primitive shapes are boxed`(nullabilityCheckMode: NullableIndex.CheckMode) {\n        val baseModel =\n            \"\"\"\n            namespace test\n            structure Primitives {\n                int: PrimitiveInteger,\n                bool: PrimitiveBoolean,\n                long: PrimitiveLong,\n                double: PrimitiveDouble,\n                boxedAlready: BoxedField,\n                other: Other\n            }\n\n            @box\n            integer BoxedField\n\n            structure Other {}\n\n            \"\"\".asSmithyModel()\n        val model = EC2MakePrimitivesOptional.processModel(baseModel)\n        val nullableIndex = NullableIndex(model)\n        val struct = model.lookup<StructureShape>(\"test#Primitives\")\n        struct.members().forEach {\n            nullableIndex.isMemberNullable(it, nullabilityCheckMode) shouldBe true\n        }\n    }\n}\n"
  },
  {
    "path": "aws/codegen-aws-sdk/src/test/kotlin/software/amazon/smithy/rustsdk/customize/s3/S3ExpiresDecoratorTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rustsdk.customize.s3\n\nimport org.junit.jupiter.api.Assertions.assertNull\nimport org.junit.jupiter.api.Assertions.assertTrue\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.model.shapes.ServiceShape\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.model.traits.DeprecatedTrait\nimport software.amazon.smithy.rust.codegen.client.testutil.testClientRustSettings\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\nimport software.amazon.smithy.rust.codegen.core.util.targetOrSelf\nimport kotlin.jvm.optionals.getOrNull\n\ninternal class S3ExpiresDecoratorTest {\n    private val baseModel =\n        \"\"\"\n        namespace smithy.example\n        use aws.protocols#restXml\n        use aws.auth#sigv4\n        use aws.api#service\n        @restXml\n        @sigv4(name: \"s3\")\n        @service(\n            sdkId: \"S3\"\n            arnNamespace: \"s3\"\n        )\n        service S3 {\n            version: \"1.0.0\",\n            operations: [GetFoo, NewGetFoo]\n        }\n        operation GetFoo {\n            input: GetFooInput\n            output: GetFooOutput\n        }\n\n        operation NewGetFoo {\n            input: GetFooInput\n            output: NewGetFooOutput\n        }\n\n        structure GetFooInput {\n            payload: String\n            expires: String\n        }\n\n        @output\n        structure GetFooOutput {\n            expires: Timestamp\n        }\n\n        @output\n        structure NewGetFooOutput {\n            expires: String\n        }\n        \"\"\".asSmithyModel()\n\n    private val serviceShape = baseModel.expectShape(ShapeId.from(\"smithy.example#S3\"), ServiceShape::class.java)\n    private val settings = testClientRustSettings()\n    private val model = S3ExpiresDecorator().transformModel(serviceShape, baseModel, settings)\n\n    @Test\n    fun `Model is pre-processed correctly`() {\n        val expiresShapes =\n            listOf(\n                model.expectShape(ShapeId.from(\"smithy.example#GetFooInput\\$expires\")),\n                model.expectShape(ShapeId.from(\"smithy.example#GetFooOutput\\$expires\")),\n                model.expectShape(ShapeId.from(\"smithy.example#NewGetFooOutput\\$expires\")),\n            )\n\n        // Expires should always be Timestamp, even if not modeled as such since its\n        // type will change in the future\n        assertTrue(expiresShapes.all { it.targetOrSelf(model).isTimestampShape })\n\n        // All Expires output members should be marked with the deprecated trait\n        assertTrue(\n            expiresShapes\n                .filter { it.id.toString().contains(\"Output\") }\n                .all { it.hasTrait<DeprecatedTrait>() },\n        )\n\n        // No ExpiresString member should be added to the input shape\n        assertNull(model.getShape(ShapeId.from(\"smithy.example#GetFooInput\\$expiresString\")).getOrNull())\n\n        val expiresStringOutputFields =\n            listOf(\n                model.expectShape(ShapeId.from(\"smithy.example#GetFooOutput\\$expiresString\")),\n                model.expectShape(ShapeId.from(\"smithy.example#NewGetFooOutput\\$expiresString\")),\n            )\n\n        // There should be a synthetic ExpiresString string member added to output shapes\n        assertTrue(expiresStringOutputFields.all { it.targetOrSelf(model).isStringShape })\n\n        // The synthetic fields should not be deprecated\n        assertTrue(expiresStringOutputFields.none { it.hasTrait<DeprecatedTrait>() })\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/.gitignore",
    "content": "target/\n"
  },
  {
    "path": "aws/rust-runtime/Cargo.toml",
    "content": "# Note: this workspace exists solely for the convenience of running tests. These packages will all eventually\n# end up in the final SDK workspace.\n[workspace]\nresolver = \"2\"\nmembers = [\n    \"aws-credential-types\",\n    \"aws-inlineable\",\n    \"aws-runtime\",\n    \"aws-runtime-api\",\n    \"aws-sigv4\",\n    \"aws-types\",\n]\n\nexclude = [\"aws-config\"]\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/Cargo.toml",
    "content": "[package]\nname = \"aws-config\"\nversion = \"1.8.16\"\nauthors = [\n    \"AWS Rust SDK Team <aws-sdk-rust@amazon.com>\",\n    \"Russell Cohen <rcoh@amazon.com>\",\n]\ndescription = \"AWS SDK config and credential provider implementations.\"\nedition = \"2021\"\nexclude = [\"test-data/*\", \"integration-tests/*\"]\nlicense = \"Apache-2.0\"\nrepository = \"https://github.com/smithy-lang/smithy-rs\"\nrust-version = \"1.91.1\"\n\n[features]\nbehavior-version-latest = []\ncredentials-process = [\"tokio/process\"]\ndefault = [\"default-https-client\", \"rt-tokio\", \"credentials-process\", \"sso\"]\nrt-tokio = [\"aws-smithy-async/rt-tokio\", \"aws-smithy-runtime/rt-tokio\", \"tokio/rt\"]\n# NOTE: `client-hyper` and `rustls` were proxies for enabling the default HTTP client plugin of `aws-smithy-runtime`\n# there is no direct usage otherwise on hyper or rustls in this crate. These are superceded by the more appropriately\n# named `default-https-client` feature and `client-hyper` and `rustls` are now synonyms for the same\n# TODO(hyper1) - deprecate legacy `client-hyper` and `rustls` features when available in cargo: https://github.com/rust-lang/cargo/issues/7130\nclient-hyper = [\"aws-smithy-runtime/default-https-client\"]\nrustls = [\"client-hyper\"]\ndefault-https-client = [\"aws-smithy-runtime/default-https-client\"]\nsso = [\"dep:aws-sdk-sso\", \"dep:aws-sdk-ssooidc\", \"dep:sha1\", \"dep:hex\", \"dep:zeroize\", \"aws-smithy-runtime-api/http-auth\"]\ncredentials-login = [\n    \"dep:aws-sdk-signin\",\n    \"dep:sha2\",\n    \"dep:zeroize\",\n    \"dep:hex\",\n    \"dep:base64-simd\",\n    \"dep:uuid\",\n    \"uuid?/v4\",\n    \"dep:p256\",\n    \"p256?/arithmetic\",\n    \"p256?/pem\",\n    \"dep:rand\",\n]\ntest-util = [\"aws-runtime/test-util\"]\n\n# deprecated: this feature does nothing\nallow-compilation = []\n\n[dependencies]\naws-credential-types = { path = \"../../sdk/build/aws-sdk/sdk/aws-credential-types\", features = [\"test-util\"] }\naws-runtime = { path = \"../../sdk/build/aws-sdk/sdk/aws-runtime\" }\naws-sdk-sts = { path = \"../../sdk/build/aws-sdk/sdk/sts\", default-features = false }\naws-smithy-async = { path = \"../../sdk/build/aws-sdk/sdk/aws-smithy-async\" }\naws-smithy-http = { path = \"../../sdk/build/aws-sdk/sdk/aws-smithy-http\" }\naws-smithy-json = { path = \"../../sdk/build/aws-sdk/sdk/aws-smithy-json\" }\naws-smithy-runtime = { path = \"../../sdk/build/aws-sdk/sdk/aws-smithy-runtime\", features = [\"client\"] }\naws-smithy-runtime-api = { path = \"../../sdk/build/aws-sdk/sdk/aws-smithy-runtime-api\", features = [\"client\"] }\naws-smithy-types = { path = \"../../sdk/build/aws-sdk/sdk/aws-smithy-types\" }\naws-types = { path = \"../../sdk/build/aws-sdk/sdk/aws-types\" }\nbytes = \"1.11.1\"\nhttp = \"1\"\ntime = { version = \"0.3.4\", features = [\"parsing\"] }\ntokio = { version = \"1.13.1\", features = [\"sync\"] }\ntracing = { version = \"0.1\" }\nurl = \"2.5.4\"\n\n# implementation detail of IMDS credentials provider\nfastrand = \"2.3.0\"\n\n# implementation detail of SSO credential caching\naws-sdk-sso = { path = \"../../sdk/build/aws-sdk/sdk/sso\", default-features = false, optional = true }\nsha1 = { version = \"0.10\", optional = true }\nhex = { version = \"0.4.3\", optional = true }\nzeroize = { version = \"1\", optional = true }\n\n# implementation detail of SSO OIDC `CreateToken` for SSO token providers\naws-sdk-ssooidc = { path = \"../../sdk/build/aws-sdk/sdk/ssooidc\", default-features = false, optional = true }\n\n# implementation detail of LoginCredentialsProvider (AWS Sign-In)\np256 = { version = \"0.13.2\", optional = true }\nsha2 = { version = \"0.10.9\", optional = true }\naws-sdk-signin = { path = \"../../sdk/build/aws-sdk/sdk/signin\", default-features = false, optional = true }\nbase64-simd = { version = \"0.8.0\", optional = true }\nuuid = { version = \"1.18.1\", optional = true }\n# TODO(signin): latest version of rand uses a newer version of rand_core incompatible with current stable p256 crate, latest RC is up-to date so next release (0.14.x will use latest rand)\nrand = { version = \"0.8.5\", default-features = false, features = [\"std\", \"std_rng\"], optional = true }\n\n[dev-dependencies]\naws-smithy-async = { path = \"../../sdk/build/aws-sdk/sdk/aws-smithy-async\", features = [\"rt-tokio\", \"test-util\"] }\naws-smithy-http-client = { path = \"../../sdk/build/aws-sdk/sdk/aws-smithy-http-client\", features = [\"default-client\", \"test-util\"] }\naws-smithy-runtime = { path = \"../../sdk/build/aws-sdk/sdk/aws-smithy-runtime\", features = [\"client\", \"test-util\"] }\naws-smithy-runtime-api = { path = \"../../sdk/build/aws-sdk/sdk/aws-smithy-runtime-api\", features = [\"test-util\"] }\nfutures-util = { version = \"0.3.29\", default-features = false }\ntracing-test = \"0.2.4\"\ntracing-subscriber = { version = \"0.3.16\", features = [\"fmt\", \"json\"] }\ntokio = { version = \"1.23.1\", features = [\"full\", \"test-util\"] }\n\n# used for test case deserialization\nserde = { version = \"1\", features = [\"derive\"] }\nserde_json = \"1\"\n\n[package.metadata.docs.rs]\nall-features = true\ntargets = [\"x86_64-unknown-linux-gnu\"]\ncargo-args = [\"-Zunstable-options\", \"-Zrustdoc-scrape-examples\"]\nrustdoc-args = [\"--cfg\", \"docsrs\"]\n# End of docs.rs metadata\n\n# make sure to keep crate stability in sync with the second element of the following tuple in\n# buildSrc/src/main/kotlin/CrateSet.kt:\n#  Crate(\"aws-config\", STABLE_VERSION_PROP_NAME),\n[package.metadata.smithy-rs-release-tooling]\nstable = true\n\n# FIXME - workaround minimal-versions check issue with proc-macro < 1.0.60\n[package.metadata.cargo-udeps.ignore]\nnormal = [\"proc-macro2\"]\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/LICENSE",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/README.md",
    "content": "# aws-config\n\nAWS SDK config and credential provider implementations.\n\n The implementations can be used either via the default chain implementation `from_env`/`ConfigLoader` or ad-hoc individual credential and region providers.\n\nA `ConfigLoader` can combine different configuration sources into an AWS shared-config `Config`. The `Config` can then be used to configure one or more AWS service clients.\n\n## Examples\n\nLoad default SDK configuration:\n\n```rust\nasync fn example() {\n    let config = aws_config::load_from_env().await;\n    let client = aws_sdk_dynamodb::Client::new(&config);\n}\n```\n\nLoad SDK configuration with a region override:\n\n```rust\nuse aws_config::meta::region::RegionProviderChain;\n\nasync fn example() {\n    let region_provider = RegionProviderChain::default_provider().or_else(\"us-east-1\");\n    let config = aws_config::from_env().region(region_provider).load().await;\n    let client = aws_sdk_dynamodb::Client::new(&config);\n}\n```\n\n## Getting Started\n\n_Examples are available for many services and operations, check out the [Usage examples]._\n\nThe SDK provides one crate per AWS service. You must add [Tokio] as a dependency within your Rust project to execute asynchronous code. To add aws-sdk-config to your project, add the following to your Cargo.toml file where VERSION is the version of the SDK you want to use:\n\n```toml\n[dependencies]\naws-config = \"VERSION\"\naws-sdk-config = \"VERSION\"\ntokio = { version = \"1\", features = [\"full\"] }\n```\n\n## Using the SDK\n\nDetailed usage instructions are available in the [Developer Guide](https://docs.aws.amazon.com/sdk-for-rust/latest/dg/welcome.html).\nSuggestions for additional sections or improvements for the guide are welcome. Please open an issue describing what you are trying to do.\n\n## Getting Help\n\n- [GitHub discussions] - For ideas, RFCs & general questions\n- [GitHub issues] – For bug reports & feature requests\n- [Generated Docs] (latest version)\n- [Usage examples]\n\n## License\n\nThis project is licensed under the Apache-2.0 License.\n\n[Tokio]: https://crates.io/crates/tokio\n[Guide]: https://github.com/awslabs/aws-sdk-rust/blob/main/Guide.md\n[GitHub discussions]: https://github.com/awslabs/aws-sdk-rust/discussions\n[GitHub issues]: https://github.com/awslabs/aws-sdk-rust/issues/new/choose\n[Generated Docs]: https://awslabs.github.io/aws-sdk-rust/\n[Usage examples]: https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/rustv1\n\n<!-- anchor_start:footer -->\nThis crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator.\n<!-- anchor_end:footer -->\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/clippy.toml",
    "content": "# this file is named `clippy-root.toml` so it isn't picked up automagically. Clippy\n# will search up the filesystem for a clippy.toml and this causes problems with tools.\ndisallowed-methods = [\n    # fully qualified function/method name:\n    \"std::time::SystemTime::now\",\n    \"std::time::SystemTime::elapsed\",\n    \"std::time::Instant::now\",\n    \"std::time::Instant::elapsed\"\n]\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/examples/imds.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/// IMDSv2 client usage example\n///\n/// The IMDS client is used with `aws-config` to load credentials and regions, however, you can also\n/// use the client directly. This example demonstrates loading the instance-id from IMDS. More\n/// fetures of IMDS can be found [here](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html)\n#[tokio::main]\nasync fn main() -> Result<(), Box<dyn std::error::Error>> {\n    use aws_config::imds::Client;\n\n    let imds = Client::builder().build();\n    let instance_id = imds.get(\"/latest/meta-data/instance-id\").await?;\n    println!(\"current instance id: {}\", instance_id.as_ref());\n    Ok(())\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/external-types.toml",
    "content": "# IMPORTANT: Types from `aws-sdk-*` crates MUST NOT be allowed to be\n# exposed in `aws-config`'s public API. Otherwise, `aws-config` will\n# require manual version bumping every time an automated version bump\n# to the exposed SDK crates happens.\nallowed_external_types = [\n   \"aws_credential_types::provider::credentials::ProvideCredentials\",\n   \"aws_credential_types::provider::credentials::Result\",\n   \"aws_credential_types::provider::token::ProvideToken\",\n   \"aws_runtime::env_config::error::EnvConfigFileLoadError\",\n   \"aws_runtime::env_config::file::Builder\",\n   \"aws_runtime::env_config::file::EnvConfigFileKind\",\n   \"aws_runtime::env_config::file::EnvConfigFiles\",\n   \"aws_runtime::env_config::parse::EnvConfigParseError\",\n   \"aws_runtime::env_config::property::Property\",\n   \"aws_runtime::env_config::section::EnvConfigSections\",\n   \"aws_runtime::env_config::section::Profile\",\n   \"aws_smithy_async::rt::sleep::AsyncSleep\",\n   \"aws_smithy_async::time::TimeSource\",\n   \"aws_smithy_runtime::client::identity::cache::IdentityCache\",\n   \"aws_smithy_runtime::client::identity::cache::lazy::LazyCacheBuilder\",\n   \"aws_smithy_runtime_api::client::auth::AuthSchemePreference\",\n   \"aws_smithy_runtime_api::box_error::BoxError\",\n   \"aws_smithy_runtime_api::client::behavior_version::BehaviorVersion\",\n   \"aws_smithy_runtime_api::client::dns::ResolveDns\",\n   \"aws_smithy_runtime_api::client::http::HttpClient\",\n   \"aws_smithy_runtime_api::client::identity::ResolveCachedIdentity\",\n   \"aws_smithy_runtime_api::client::identity::ResolveIdentity\",\n   \"aws_smithy_runtime_api::client::orchestrator::HttpResponse\",\n   \"aws_smithy_runtime_api::client::retries::classifiers::ClassifyRetry\",\n   \"aws_smithy_runtime_api::client::retries::classifiers::SharedRetryClassifier\",\n   \"aws_smithy_runtime_api::client::stalled_stream_protection::StalledStreamProtectionConfig\",\n   \"aws_smithy_types::checksum_config::RequestChecksumCalculation\",\n   \"aws_smithy_types::checksum_config::ResponseChecksumValidation\",\n   \"aws_smithy_types::retry::*\",\n   \"aws_smithy_types::timeout::OperationTimeoutConfig\",\n   \"aws_smithy_types::timeout::TimeoutConfig\",\n   \"aws_smithy_types::timeout::TimeoutConfigBuilder\",\n   \"aws_types::*\",\n]\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/fuzz/.gitignore",
    "content": "\ntarget\ncorpus\nartifacts\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/fuzz/Cargo.toml",
    "content": "\n[package]\nname = \"aws-types-fuzz\"\nversion = \"0.0.0\"\nauthors = [\"Automatically generated\"]\npublish = false\nedition = \"2021\"\n\n[package.metadata]\ncargo-fuzz = true\n\n[dependencies]\n# Version pinned due to https://github.com/rust-fuzz/libfuzzer/issues/126\nlibfuzzer-sys = \"=0.4.7\"\naws-config = { path = \"..\" }\n\n[dependencies.aws-types]\npath = \"../../../sdk/build/aws-sdk/sdk/aws-types\"\n\n\n\n# Prevent this from interfering with workspaces\n[workspace]\nmembers = [\".\"]\n\n[[bin]]\nname = \"profile-parser\"\npath = \"fuzz_targets/profile-parser.rs\"\ntest = false\ndoc = false\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/fuzz/fuzz_targets/profile-parser.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n#![no_main]\nuse aws_config::profile;\nuse aws_types::os_shim_internal::{Env, Fs};\nuse libfuzzer_sys::fuzz_target;\nuse std::collections::HashMap;\nuse std::ffi::OsString;\n\n// Fuzz on a tuple of (`config`, `credentials`)\nfuzz_target!(|data: (Option<&str>, Option<&str>)| {\n    let mut fs: HashMap<OsString, Vec<u8>> = HashMap::new();\n    if let Some(config) = data.0 {\n        fs.insert(\n            \"~/.aws/config\".to_string().into(),\n            config.to_string().into(),\n        );\n    }\n    if let Some(creds) = data.1 {\n        fs.insert(\n            \"~/.aws/credentials\".to_string().into(),\n            creds.to_string().into(),\n        );\n    }\n    let fs = Fs::from_raw_map(fs);\n    let env = Env::real();\n    let _ = profile::load(&fs, &env);\n});\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/integration-tests/eks-credentials/.gitignore",
    "content": "*.js\n!jest.config.js\n*.d.ts\nnode_modules\n\n# CDK asset staging directory\n.cdk.staging\ncdk.out\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/integration-tests/eks-credentials/.npmignore",
    "content": "*.ts\n!*.d.ts\n\n# CDK asset staging directory\n.cdk.staging\ncdk.out\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/integration-tests/eks-credentials/README.md",
    "content": "# CDK Stack for EKS credentials provider testing\n\nThis project defines a CDK stack that launches an EKS cluster, creates a DynamoDB table, and sets up:\n1. A service account role that allows a pod to access the table via IRSA.\n2. A service account and pod identity association that allows a pod to access the table via EKS Pod Identity.\n\n`test.rs` is provided as an example script to run.\n\n## Usage\n```bsh\ncdk bootstrap aws://accountid/region\ncdk deploy\n# make lunch, go for a bike ride, etc. ~1h.\nkubectl exec rust-sdk-test-irsa -it bash\n# write some rust code, e.g. test.rs, run it. will have irsa identity\nkubectl exec rust-sdk-test-pod-identity -it bash\n# run more rust code. will have eks pod identity\n```\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/integration-tests/eks-credentials/bin/eks-credentials.ts",
    "content": "#!/usr/bin/env node\n/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport 'source-map-support/register';\nimport { App } from \"aws-cdk-lib\";\nimport { EksCredentialsStack } from '../lib/eks-credentials-stack';\n\nconst app = new App();\nnew EksCredentialsStack(app, 'EksCredentialsStack', {\n  /* If you don't specify 'env', this stack will be environment-agnostic.\n   * Account/Region-dependent features and context lookups will not work,\n   * but a single synthesized template can be deployed anywhere. */\n\n  /* Uncomment the next line to specialize this stack for the AWS Account\n   * and Region that are implied by the current CLI configuration. */\n  // env: { account: process.env.CDK_DEFAULT_ACCOUNT, region: process.env.CDK_DEFAULT_REGION },\n\n  /* Uncomment the next line if you know exactly what Account and Region you\n   * want to deploy the stack to. */\n  // env: { account: '123456789012', region: 'us-east-1' },\n\n  /* For more information, see https://docs.aws.amazon.com/cdk/latest/guide/environments.html */\n});\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/integration-tests/eks-credentials/cdk.json",
    "content": "{\n  \"app\": \"npx ts-node --prefer-ts-exts bin/eks-credentials.ts\",\n  \"context\": {\n  }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/integration-tests/eks-credentials/jest.config.js",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nmodule.exports = {\n  testEnvironment: 'node',\n  roots: ['<rootDir>/test'],\n  testMatch: ['**/*.test.ts'],\n  transform: {\n    '^.+\\\\.tsx?$': 'ts-jest'\n  }\n};\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/integration-tests/eks-credentials/lib/eks-credentials-stack.ts",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { Stack, StackProps } from \"aws-cdk-lib\";\nimport * as eks from \"aws-cdk-lib/aws-eks\";\nimport * as iam from \"aws-cdk-lib/aws-iam\";\nimport * as dynamodb from \"aws-cdk-lib/aws-dynamodb\";\nimport { Construct } from \"constructs\";\nimport {KubectlV28Layer} from \"@aws-cdk/lambda-layer-kubectl-v28\";\n\nexport class EksCredentialsStack extends Stack {\n  constructor(scope: Construct, id: string, props?: StackProps) {\n    super(scope, id, props);\n\n\n    // create a cluster\n    const cluster = new eks.Cluster(this, 'hello-eks', {\n      version: eks.KubernetesVersion.V1_28,\n      kubectlLayer: new KubectlV28Layer(this, 'hello-eks-kubectl'),\n    });\n\n    const podIdentityAddon = new eks.CfnAddon(this, 'eks-pod-identity-addon', {\n      addonName: 'eks-pod-identity-agent',\n      clusterName: cluster.clusterName,\n      addonVersion: 'v1.1.0-eksbuild.1',\n    });\n\n    const serviceAccountIRSA = cluster.addServiceAccount(\"eks-service-account-irsa\");\n    const serviceAccountPodIdentity = cluster.addManifest(\"eks-service-account-pod-identity\", {\n      apiVersion: \"v1\",\n      kind: \"ServiceAccount\",\n      metadata: {\n        name: \"eks-service-account-pod-identity\",\n        namespace: \"default\",\n        labels: {\"app.kubernetes.io/name\": \"eks-service-account-pod-identity\"},\n      }\n    })\n\n    const table = new dynamodb.Table(this, 'Table', {\n      partitionKey: { name: 'id', type: dynamodb.AttributeType.STRING }\n    });\n    table.grantReadWriteData(serviceAccountIRSA);\n\n    let podIdentityPrincipal = new iam.ServicePrincipal(\"pods.eks.amazonaws.com\")\n\n    let podIdentityRole = new iam.Role(cluster, \"eks-role-pod-identity\", {\n      assumedBy: podIdentityPrincipal,\n    })\n    podIdentityRole.assumeRolePolicy?.addStatements(iam.PolicyStatement.fromJson({\n          \"Sid\": \"AllowEksAuthToAssumeRoleForPodIdentity\",\n          \"Effect\": \"Allow\",\n          \"Principal\": {\n            \"Service\": \"pods.eks.amazonaws.com\"\n          },\n          \"Action\": [\n            \"sts:AssumeRole\",\n            \"sts:TagSession\"\n          ]\n    }))\n    table.grantReadWriteData(podIdentityRole);\n\n    let podIdentityAssociation = new eks.CfnPodIdentityAssociation(cluster, \"eks-pod-identity-associations\", {\n      roleArn: podIdentityRole.roleArn,\n      clusterName: cluster.clusterName,\n      namespace: \"default\",\n      serviceAccount: \"eks-service-account-pod-identity\",\n    })\n\n    // apply a kubernetes manifest to the cluster\n    const podIRSA = cluster.addManifest('rust-sdk-test-irsa', {\n      apiVersion: 'v1',\n      kind: 'Pod',\n      metadata: { name: 'rust-sdk-test-irsa' },\n      spec: {\n        serviceAccountName: serviceAccountIRSA.serviceAccountName,\n        containers: [\n          {\n            name: 'hello',\n            image: 'rust:buster',\n            ports: [{ containerPort: 8080 }],\n            command: ['sh', '-c', 'sleep infinity'],\n            env: [{name: 'DYNAMO_TABLE', value: table.tableName}]\n          }\n        ]\n      }\n    });\n    podIRSA.node.addDependency(serviceAccountIRSA);\n\n    const podPodIdentity = cluster.addManifest('rust-sdk-test-pod-identity', {\n      apiVersion: 'v1',\n      kind: 'Pod',\n      metadata: { name: 'rust-sdk-test-pod-identity' },\n      spec: {\n        serviceAccountName: \"eks-service-account-pod-identity\",\n        containers: [\n          {\n            name: 'hello',\n            image: 'rust:buster',\n            ports: [{ containerPort: 8080 }],\n            command: ['sh', '-c', 'sleep infinity'],\n            env: [{name: 'DYNAMO_TABLE', value: table.tableName}]\n          }\n        ]\n      }\n    });\n    podPodIdentity.node.addDependency(serviceAccountPodIdentity);\n    podPodIdentity.node.addDependency(podIdentityAssociation);\n    podPodIdentity.node.addDependency(podIdentityAddon)\n  }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/integration-tests/eks-credentials/package.json",
    "content": "{\n  \"name\": \"eks-credentials\",\n  \"version\": \"0.1.0\",\n  \"license\": \"Apache-2.0\",\n  \"private\": true,\n  \"bin\": {\n    \"eks-credentials\": \"bin/eks-credentials.js\"\n  },\n  \"scripts\": {\n    \"build\": \"tsc\",\n    \"watch\": \"tsc -w\",\n    \"cdk\": \"cdk\"\n  },\n  \"devDependencies\": {\n    \"@types/node\": \"10.17.27\",\n    \"aws-cdk\": \"^2.0.0\",\n    \"aws-cdk-lib\": \"^2.177.0\",\n    \"@aws-cdk/lambda-layer-kubectl-v28\": \"^2.2.0\",\n    \"constructs\": \"^10.0.0\",\n    \"ts-node\": \"^9.0.0\",\n    \"typescript\": \"~4.5.5\"\n  }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/integration-tests/eks-credentials/test.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_sdk_dynamodb::types::AttributeValue;\n#[tokio::main]\nasync fn main() {\n    let conf = aws_config::load_from_env().await;\n    let dynamo = aws_sdk_dynamodb::Client::new(&conf);\n    println!(\n        \"{:?}\",\n        dynamo\n            .get_item()\n            .key(\"id\", AttributeValue::S(\"foo\".into()))\n            .table_name(std::env::var(\"DYNAMO_TABLE\").unwrap())\n            .send()\n            .await\n    );\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/integration-tests/eks-credentials/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"ES2018\",\n    \"module\": \"commonjs\",\n    \"lib\": [\n      \"es2018\"\n    ],\n    \"declaration\": true,\n    \"strict\": true,\n    \"noImplicitAny\": true,\n    \"strictNullChecks\": true,\n    \"noImplicitThis\": true,\n    \"alwaysStrict\": true,\n    \"noUnusedLocals\": false,\n    \"noUnusedParameters\": false,\n    \"noImplicitReturns\": true,\n    \"noFallthroughCasesInSwitch\": false,\n    \"inlineSourceMap\": true,\n    \"inlineSources\": true,\n    \"experimentalDecorators\": true,\n    \"strictPropertyInitialization\": false,\n    \"typeRoots\": [\n      \"./node_modules/@types\"\n    ]\n  },\n  \"exclude\": [\n    \"node_modules\",\n    \"cdk.out\"\n  ]\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/src/credential_process.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n#![cfg(feature = \"credentials-process\")]\n\n//! Credentials Provider for external process\n\nuse crate::json_credentials::{json_parse_loop, InvalidJsonCredentials};\nuse crate::sensitive_command::CommandWithSensitiveArgs;\nuse aws_credential_types::attributes::AccountId;\nuse aws_credential_types::credential_feature::AwsCredentialFeature;\nuse aws_credential_types::provider::{self, error::CredentialsError, future, ProvideCredentials};\nuse aws_credential_types::Credentials;\nuse aws_smithy_json::deserialize::Token;\nuse std::borrow::Cow;\nuse std::process::Command;\nuse std::time::SystemTime;\nuse time::format_description::well_known::Rfc3339;\nuse time::OffsetDateTime;\n\n/// External process credentials provider\n///\n/// This credentials provider runs a configured external process and parses\n/// its output to retrieve credentials.\n///\n/// The external process must exit with status 0 and output the following\n/// JSON format to `stdout` to provide credentials:\n///\n/// ```json\n/// {\n///     \"Version:\" 1,\n///     \"AccessKeyId\": \"access key id\",\n///     \"SecretAccessKey\": \"secret access key\",\n///     \"SessionToken\": \"session token\",\n///     \"Expiration\": \"time that the expiration will expire\"\n/// }\n/// ```\n///\n/// The `Version` must be set to 1. `AccessKeyId` and `SecretAccessKey` are always required.\n/// `SessionToken` must be set if a session token is associated with the `AccessKeyId`.\n/// The `Expiration` is optional, and must be given in the RFC 3339 date time format (e.g.,\n/// `2022-05-26T12:34:56.789Z`).\n///\n/// If the external process exits with a non-zero status, then the contents of `stderr`\n/// will be output as part of the credentials provider error message.\n///\n/// This credentials provider is included in the profile credentials provider, and can be\n/// configured using the `credential_process` attribute. For example:\n///\n/// ```plain\n/// [profile example]\n/// credential_process = /path/to/my/process --some --arguments\n/// ```\n#[derive(Debug)]\npub struct CredentialProcessProvider {\n    command: CommandWithSensitiveArgs<String>,\n    profile_account_id: Option<AccountId>,\n}\n\nimpl ProvideCredentials for CredentialProcessProvider {\n    fn provide_credentials<'a>(&'a self) -> future::ProvideCredentials<'a>\n    where\n        Self: 'a,\n    {\n        future::ProvideCredentials::new(self.credentials())\n    }\n}\n\nimpl CredentialProcessProvider {\n    /// Create new [`CredentialProcessProvider`] with the `command` needed to execute the external process.\n    pub fn new(command: String) -> Self {\n        Self {\n            command: CommandWithSensitiveArgs::new(command),\n            profile_account_id: None,\n        }\n    }\n\n    pub(crate) fn builder() -> Builder {\n        Builder::default()\n    }\n\n    async fn credentials(&self) -> provider::Result {\n        // Security: command arguments must be redacted at debug level\n        tracing::debug!(command = %self.command, \"loading credentials from external process\");\n\n        let command = if cfg!(windows) {\n            let mut command = Command::new(\"cmd.exe\");\n            command.args([\"/C\", self.command.unredacted()]);\n            command\n        } else {\n            let mut command = Command::new(\"sh\");\n            command.args([\"-c\", self.command.unredacted()]);\n            command\n        };\n        let output = tokio::process::Command::from(command)\n            .output()\n            .await\n            .map_err(|e| {\n                CredentialsError::provider_error(format!(\n                    \"Error retrieving credentials from external process: {e}\",\n                ))\n            })?;\n\n        // Security: command arguments can be logged at trace level\n        tracing::trace!(command = ?self.command, status = ?output.status, \"executed command (unredacted)\");\n\n        if !output.status.success() {\n            let reason =\n                std::str::from_utf8(&output.stderr).unwrap_or(\"could not decode stderr as UTF-8\");\n            return Err(CredentialsError::provider_error(format!(\n                \"Error retrieving credentials: external process exited with code {}. Stderr: {}\",\n                output.status, reason\n            )));\n        }\n\n        let output = std::str::from_utf8(&output.stdout).map_err(|e| {\n            CredentialsError::provider_error(format!(\n                \"Error retrieving credentials from external process: could not decode output as UTF-8: {e}\",\n            ))\n        })?;\n\n        parse_credential_process_json_credentials(output, self.profile_account_id.as_ref())\n            .map(|mut creds| {\n                creds\n                    .get_property_mut_or_default::<Vec<AwsCredentialFeature>>()\n                    .push(AwsCredentialFeature::CredentialsProcess);\n                creds\n            })\n            .map_err(|invalid| {\n                CredentialsError::provider_error(format!(\n                \"Error retrieving credentials from external process, could not parse response: {invalid}\",\n            ))\n            })\n    }\n}\n\n#[derive(Debug, Default)]\npub(crate) struct Builder {\n    command: Option<CommandWithSensitiveArgs<String>>,\n    profile_account_id: Option<AccountId>,\n}\n\nimpl Builder {\n    pub(crate) fn command(mut self, command: CommandWithSensitiveArgs<String>) -> Self {\n        self.command = Some(command);\n        self\n    }\n\n    #[allow(dead_code)] // only used in unit tests\n    pub(crate) fn account_id(mut self, account_id: impl Into<AccountId>) -> Self {\n        self.set_account_id(Some(account_id.into()));\n        self\n    }\n\n    pub(crate) fn set_account_id(&mut self, account_id: Option<AccountId>) {\n        self.profile_account_id = account_id;\n    }\n\n    pub(crate) fn build(self) -> CredentialProcessProvider {\n        CredentialProcessProvider {\n            command: self.command.expect(\"should be set\"),\n            profile_account_id: self.profile_account_id,\n        }\n    }\n}\n\n/// Deserialize a credential_process response from a string\n///\n/// Returns an error if the response cannot be successfully parsed or is missing keys.\n///\n/// Keys are case insensitive.\n/// The function optionally takes `profile_account_id` that originates from the profile section.\n/// If process execution result does not contain an account ID, the function uses it as a fallback.\npub(crate) fn parse_credential_process_json_credentials(\n    credentials_response: &str,\n    profile_account_id: Option<&AccountId>,\n) -> Result<Credentials, InvalidJsonCredentials> {\n    let mut version = None;\n    let mut access_key_id = None;\n    let mut secret_access_key = None;\n    let mut session_token = None;\n    let mut expiration = None;\n    let mut account_id = profile_account_id\n        .as_ref()\n        .map(|id| Cow::Borrowed(id.as_str()));\n    json_parse_loop(credentials_response.as_bytes(), |key, value| {\n        match (key, value) {\n            /*\n             \"Version\": 1,\n             \"AccessKeyId\": \"ASIARTESTID\",\n             \"SecretAccessKey\": \"TESTSECRETKEY\",\n             \"SessionToken\": \"TESTSESSIONTOKEN\",\n             \"Expiration\": \"2022-05-02T18:36:00+00:00\",\n             \"AccountId\": \"111122223333\"\n            */\n            (key, Token::ValueNumber { value, .. }) if key.eq_ignore_ascii_case(\"Version\") => {\n                version = Some(i32::try_from(*value).map_err(|err| {\n                    InvalidJsonCredentials::InvalidField {\n                        field: \"Version\",\n                        err: err.into(),\n                    }\n                })?);\n            }\n            (key, Token::ValueString { value, .. }) if key.eq_ignore_ascii_case(\"AccessKeyId\") => {\n                access_key_id = Some(value.to_unescaped()?)\n            }\n            (key, Token::ValueString { value, .. })\n                if key.eq_ignore_ascii_case(\"SecretAccessKey\") =>\n            {\n                secret_access_key = Some(value.to_unescaped()?)\n            }\n            (key, Token::ValueString { value, .. }) if key.eq_ignore_ascii_case(\"SessionToken\") => {\n                session_token = Some(value.to_unescaped()?)\n            }\n            (key, Token::ValueString { value, .. }) if key.eq_ignore_ascii_case(\"Expiration\") => {\n                expiration = Some(value.to_unescaped()?)\n            }\n            (key, Token::ValueString { value, .. }) if key.eq_ignore_ascii_case(\"AccountId\") => {\n                account_id = Some(value.to_unescaped()?)\n            }\n\n            _ => {}\n        };\n        Ok(())\n    })?;\n\n    match version {\n        Some(1) => { /* continue */ }\n        None => return Err(InvalidJsonCredentials::MissingField(\"Version\")),\n        Some(version) => {\n            return Err(InvalidJsonCredentials::InvalidField {\n                field: \"version\",\n                err: format!(\"unknown version number: {version}\").into(),\n            })\n        }\n    }\n\n    let access_key_id = access_key_id.ok_or(InvalidJsonCredentials::MissingField(\"AccessKeyId\"))?;\n    let secret_access_key =\n        secret_access_key.ok_or(InvalidJsonCredentials::MissingField(\"SecretAccessKey\"))?;\n    let expiration = expiration.map(parse_expiration).transpose()?;\n    if expiration.is_none() {\n        tracing::debug!(\"no expiration provided for credentials provider credentials. these credentials will never be refreshed.\")\n    }\n    let mut builder = Credentials::builder()\n        .access_key_id(access_key_id)\n        .secret_access_key(secret_access_key)\n        .provider_name(\"CredentialProcess\");\n    builder.set_session_token(session_token.map(String::from));\n    builder.set_expiry(expiration);\n    builder.set_account_id(account_id.map(AccountId::from));\n    Ok(builder.build())\n}\n\nfn parse_expiration(expiration: impl AsRef<str>) -> Result<SystemTime, InvalidJsonCredentials> {\n    OffsetDateTime::parse(expiration.as_ref(), &Rfc3339)\n        .map(SystemTime::from)\n        .map_err(|err| InvalidJsonCredentials::InvalidField {\n            field: \"Expiration\",\n            err: err.into(),\n        })\n}\n\n#[cfg(test)]\nmod test {\n    use crate::credential_process::CredentialProcessProvider;\n    use crate::sensitive_command::CommandWithSensitiveArgs;\n    use aws_credential_types::credential_feature::AwsCredentialFeature;\n    use aws_credential_types::provider::ProvideCredentials;\n    use std::time::{Duration, SystemTime};\n    use time::format_description::well_known::Rfc3339;\n    use time::OffsetDateTime;\n    use tokio::time::timeout;\n\n    // TODO(https://github.com/awslabs/aws-sdk-rust/issues/1117) This test is ignored on Windows because it uses Unix-style paths\n    #[tokio::test]\n    #[cfg_attr(windows, ignore)]\n    async fn test_credential_process() {\n        let provider = CredentialProcessProvider::new(String::from(\n            r#\"echo '{ \"Version\": 1, \"AccessKeyId\": \"ASIARTESTID\", \"SecretAccessKey\": \"TESTSECRETKEY\", \"SessionToken\": \"TESTSESSIONTOKEN\", \"AccountId\": \"123456789001\", \"Expiration\": \"2022-05-02T18:36:00+00:00\" }'\"#,\n        ));\n        let creds = provider.provide_credentials().await.expect(\"valid creds\");\n        assert_eq!(creds.access_key_id(), \"ASIARTESTID\");\n        assert_eq!(creds.secret_access_key(), \"TESTSECRETKEY\");\n        assert_eq!(creds.session_token(), Some(\"TESTSESSIONTOKEN\"));\n        assert_eq!(creds.account_id().unwrap().as_str(), \"123456789001\");\n        assert_eq!(\n            creds.expiry(),\n            Some(\n                SystemTime::try_from(\n                    OffsetDateTime::parse(\"2022-05-02T18:36:00+00:00\", &Rfc3339)\n                        .expect(\"static datetime\")\n                )\n                .expect(\"static datetime\")\n            )\n        );\n    }\n\n    // TODO(https://github.com/awslabs/aws-sdk-rust/issues/1117) This test is ignored on Windows because it uses Unix-style paths\n    #[tokio::test]\n    #[cfg_attr(windows, ignore)]\n    async fn test_credential_process_no_expiry() {\n        let provider = CredentialProcessProvider::new(String::from(\n            r#\"echo '{ \"Version\": 1, \"AccessKeyId\": \"ASIARTESTID\", \"SecretAccessKey\": \"TESTSECRETKEY\" }'\"#,\n        ));\n        let creds = provider.provide_credentials().await.expect(\"valid creds\");\n        assert_eq!(creds.access_key_id(), \"ASIARTESTID\");\n        assert_eq!(creds.secret_access_key(), \"TESTSECRETKEY\");\n        assert_eq!(creds.session_token(), None);\n        assert_eq!(creds.expiry(), None);\n    }\n\n    #[tokio::test]\n    async fn credentials_process_timeouts() {\n        let provider = CredentialProcessProvider::new(String::from(\"sleep 1000\"));\n        let _creds = timeout(Duration::from_millis(1), provider.provide_credentials())\n            .await\n            .expect_err(\"timeout forced\");\n    }\n\n    #[tokio::test]\n    async fn credentials_with_fallback_account_id() {\n        let provider = CredentialProcessProvider::builder()\n            .command(CommandWithSensitiveArgs::new(String::from(\n                r#\"echo '{ \"Version\": 1, \"AccessKeyId\": \"ASIARTESTID\", \"SecretAccessKey\": \"TESTSECRETKEY\" }'\"#,\n            )))\n            .account_id(\"012345678901\")\n            .build();\n        let creds = provider.provide_credentials().await.unwrap();\n        assert_eq!(\"012345678901\", creds.account_id().unwrap().as_str());\n    }\n\n    #[tokio::test]\n    async fn fallback_account_id_shadowed_by_account_id_in_process_output() {\n        let provider = CredentialProcessProvider::builder()\n            .command(CommandWithSensitiveArgs::new(String::from(\n                r#\"echo '{ \"Version\": 1, \"AccessKeyId\": \"ASIARTESTID\", \"SecretAccessKey\": \"TESTSECRETKEY\", \"AccountId\": \"111122223333\" }'\"#,\n            )))\n            .account_id(\"012345678901\")\n            .build();\n        let creds = provider.provide_credentials().await.unwrap();\n        assert_eq!(\"111122223333\", creds.account_id().unwrap().as_str());\n    }\n\n    #[tokio::test]\n    async fn credential_feature() {\n        let provider = CredentialProcessProvider::builder()\n            .command(CommandWithSensitiveArgs::new(String::from(\n                r#\"echo '{ \"Version\": 1, \"AccessKeyId\": \"ASIARTESTID\", \"SecretAccessKey\": \"TESTSECRETKEY\", \"AccountId\": \"111122223333\" }'\"#,\n            )))\n            .account_id(\"012345678901\")\n            .build();\n        let creds = provider.provide_credentials().await.unwrap();\n        assert_eq!(\n            &vec![AwsCredentialFeature::CredentialsProcess],\n            creds.get_property::<Vec<AwsCredentialFeature>>().unwrap()\n        );\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/src/default_provider/account_id_endpoint_mode.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::provider_config::ProviderConfig;\nuse aws_runtime::env_config::EnvConfigValue;\nuse aws_smithy_types::error::display::DisplayErrorContext;\nuse aws_types::endpoint_config::AccountIdEndpointMode;\nuse std::str::FromStr;\n\nmod env {\n    pub(super) const ACCOUNT_ID_ENDPOINT_MODE: &str = \"AWS_ACCOUNT_ID_ENDPOINT_MODE\";\n}\n\nmod profile_key {\n    pub(super) const ACCOUNT_ID_ENDPOINT_MODE: &str = \"account_id_endpoint_mode\";\n}\n\n/// Load the value for the Account-based endpoint mode\n///\n/// This checks the following sources:\n/// 1. The environment variable `AWS_ACCOUNT_ID_ENDPOINT_MODE=preferred/disabled/required`\n/// 2. The profile key `account_id_endpoint_mode=preferred/disabled/required`\n///\n/// If invalid values are found, the provider will return `None` and an error will be logged.\npub(crate) async fn account_id_endpoint_mode_provider(\n    provider_config: &ProviderConfig,\n) -> Option<AccountIdEndpointMode> {\n    let env = provider_config.env();\n    let profiles = provider_config.profile().await;\n\n    EnvConfigValue::new()\n        .env(env::ACCOUNT_ID_ENDPOINT_MODE)\n        .profile(profile_key::ACCOUNT_ID_ENDPOINT_MODE)\n        .validate(&env, profiles, AccountIdEndpointMode::from_str)\n        .map_err(|err| tracing::warn!(err = %DisplayErrorContext(&err), \"invalid value for `AccountIdEndpointMode`\"))\n        .unwrap_or(None)\n}\n\n#[cfg(test)]\nmod test {\n    use super::account_id_endpoint_mode_provider;\n    use super::env;\n    #[allow(deprecated)]\n    use crate::profile::profile_file::{ProfileFileKind, ProfileFiles};\n    use crate::provider_config::ProviderConfig;\n    use aws_types::os_shim_internal::{Env, Fs};\n    use tracing_test::traced_test;\n\n    #[tokio::test]\n    #[traced_test]\n    async fn log_error_on_invalid_value() {\n        let conf = ProviderConfig::empty().with_env(Env::from_slice(&[(\n            env::ACCOUNT_ID_ENDPOINT_MODE,\n            \"invalid\",\n        )]));\n        assert_eq!(None, account_id_endpoint_mode_provider(&conf).await);\n        assert!(logs_contain(\"invalid value for `AccountIdEndpointMode`\"));\n    }\n\n    #[tokio::test]\n    #[traced_test]\n    async fn environment_priority() {\n        let conf = ProviderConfig::empty()\n            .with_env(Env::from_slice(&[(\n                env::ACCOUNT_ID_ENDPOINT_MODE,\n                \"disabled\",\n            )]))\n            .with_profile_config(\n                Some(\n                    #[allow(deprecated)]\n                    ProfileFiles::builder()\n                        .with_file(\n                            #[allow(deprecated)]\n                            ProfileFileKind::Config,\n                            \"conf\",\n                        )\n                        .build(),\n                ),\n                None,\n            )\n            .with_fs(Fs::from_slice(&[(\n                \"conf\",\n                \"[default]\\naccount_id_endpoint_mode = required\",\n            )]));\n        assert_eq!(\n            \"disabled\".to_owned(),\n            account_id_endpoint_mode_provider(&conf)\n                .await\n                .unwrap()\n                .to_string(),\n        );\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/src/default_provider/app_name.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::provider_config::ProviderConfig;\nuse aws_runtime::env_config::{EnvConfigError, EnvConfigValue};\nuse aws_smithy_types::error::display::DisplayErrorContext;\nuse aws_types::app_name::{AppName, InvalidAppName};\n\n/// Default App Name Provider chain\n///\n/// This provider will check the following sources in order:\n/// 1. Environment variables: `AWS_SDK_UA_APP_ID`\n/// 2. Profile files from the key `sdk_ua_app_id`\n///\n#[doc = include_str!(\"../profile/location_of_profile_files.md\")]\n///\n/// # Examples\n///\n/// **Loads \"my-app\" as the app name**\n/// ```ini\n/// [default]\n/// sdk_ua_app_id = my-app\n/// ```\n///\n/// **Loads \"my-app\" as the app name _if and only if_ the `AWS_PROFILE` environment variable\n/// is set to `other`.**\n/// ```ini\n/// [profile other]\n/// sdk_ua_app_id = my-app\n/// ```\npub fn default_provider() -> Builder {\n    Builder::default()\n}\n\n/// Default provider builder for [`AppName`]\n#[derive(Debug, Default)]\npub struct Builder {\n    provider_config: ProviderConfig,\n}\n\nimpl Builder {\n    /// Configure the default chain\n    ///\n    /// Exposed for overriding the environment when unit-testing providers\n    pub(crate) fn configure(self, configuration: &ProviderConfig) -> Self {\n        Self {\n            provider_config: configuration.clone(),\n        }\n    }\n\n    /// Override the profile name used by this provider\n    pub fn profile_name(mut self, name: &str) -> Self {\n        self.provider_config = self.provider_config.with_profile_name(name.to_string());\n        self\n    }\n\n    async fn fallback_app_name(&self) -> Result<Option<AppName>, EnvConfigError<InvalidAppName>> {\n        let env = self.provider_config.env();\n        let profiles = self.provider_config.profile().await;\n\n        EnvConfigValue::new()\n            .profile(\"sdk-ua-app-id\")\n            .validate(&env, profiles, |name| AppName::new(name.to_string()))\n    }\n\n    /// Build an [`AppName`] from the default chain\n    pub async fn app_name(self) -> Option<AppName> {\n        let env = self.provider_config.env();\n        let profiles = self.provider_config.profile().await;\n\n        let standard = EnvConfigValue::new()\n            .env(\"AWS_SDK_UA_APP_ID\")\n            .profile(\"sdk_ua_app_id\")\n            .validate(&env, profiles, |name| AppName::new(name.to_string()));\n        let with_fallback = match standard {\n            Ok(None) => self.fallback_app_name().await,\n            other => other,\n        };\n\n        with_fallback.map_err(\n                |err| tracing::warn!(err = %DisplayErrorContext(&err), \"invalid value for App Name setting\"),\n            )\n            .unwrap_or(None)\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    #[allow(deprecated)]\n    use crate::profile::profile_file::{ProfileFileKind, ProfileFiles};\n    use crate::provider_config::ProviderConfig;\n    use crate::test_case::{no_traffic_client, InstantSleep};\n    use aws_smithy_runtime_api::client::behavior_version::BehaviorVersion;\n    use aws_types::os_shim_internal::{Env, Fs};\n\n    #[tokio::test]\n    async fn prefer_env_to_profile() {\n        let fs = Fs::from_slice(&[(\"test_config\", \"[default]\\nsdk-ua-app-id = wrong\")]);\n        let env = Env::from_slice(&[\n            (\"AWS_CONFIG_FILE\", \"test_config\"),\n            (\"AWS_SDK_UA_APP_ID\", \"correct\"),\n        ]);\n        let app_name = Builder::default()\n            .configure(\n                &ProviderConfig::no_configuration()\n                    .with_fs(fs)\n                    .with_env(env)\n                    .with_http_client(no_traffic_client()),\n            )\n            .app_name()\n            .await;\n\n        assert_eq!(Some(AppName::new(\"correct\").unwrap()), app_name);\n    }\n\n    // test that overriding profile_name on the root level is deprecated\n    #[tokio::test]\n    async fn profile_name_override() {\n        let fs = Fs::from_slice(&[(\"test_config\", \"[profile custom]\\nsdk_ua_app_id = correct\")]);\n        let conf = crate::defaults(BehaviorVersion::latest())\n            .sleep_impl(InstantSleep)\n            .fs(fs)\n            .http_client(no_traffic_client())\n            .profile_name(\"custom\")\n            .profile_files(\n                #[allow(deprecated)]\n                ProfileFiles::builder()\n                    .with_file(\n                        #[allow(deprecated)]\n                        ProfileFileKind::Config,\n                        \"test_config\",\n                    )\n                    .build(),\n            )\n            .load()\n            .await;\n        assert_eq!(conf.app_name(), Some(&AppName::new(\"correct\").unwrap()));\n    }\n\n    #[tokio::test]\n    async fn load_from_profile() {\n        let fs = Fs::from_slice(&[(\"test_config\", \"[default]\\nsdk_ua_app_id = correct\")]);\n        let env = Env::from_slice(&[(\"AWS_CONFIG_FILE\", \"test_config\")]);\n        let app_name = Builder::default()\n            .configure(\n                &ProviderConfig::empty()\n                    .with_fs(fs)\n                    .with_env(env)\n                    .with_http_client(no_traffic_client()),\n            )\n            .app_name()\n            .await;\n\n        assert_eq!(Some(AppName::new(\"correct\").unwrap()), app_name);\n    }\n\n    #[tokio::test]\n    async fn load_from_profile_old_name() {\n        let fs = Fs::from_slice(&[(\"test_config\", \"[default]\\nsdk-ua-app-id = correct\")]);\n        let env = Env::from_slice(&[(\"AWS_CONFIG_FILE\", \"test_config\")]);\n        let app_name = Builder::default()\n            .configure(\n                &ProviderConfig::empty()\n                    .with_fs(fs)\n                    .with_env(env)\n                    .with_http_client(no_traffic_client()),\n            )\n            .app_name()\n            .await;\n\n        assert_eq!(Some(AppName::new(\"correct\").unwrap()), app_name);\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/src/default_provider/auth_scheme_preference.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::provider_config::ProviderConfig;\nuse aws_runtime::env_config::EnvConfigValue;\nuse aws_smithy_runtime_api::client::auth::{AuthSchemeId, AuthSchemePreference};\nuse aws_smithy_types::error::display::DisplayErrorContext;\nuse std::borrow::Cow;\nuse std::fmt;\n\nmod env {\n    pub(super) const AUTH_SCHEME_PREFERENCE: &str = \"AWS_AUTH_SCHEME_PREFERENCE\";\n}\n\nmod profile_key {\n    pub(super) const AUTH_SCHEME_PREFERENCE: &str = \"auth_scheme_preference\";\n}\n\n/// Load the value for the auth scheme preference\n///\n/// This checks the following sources:\n/// 1. The environment variable `AWS_AUTH_SCHEME_PREFERENCE=scheme1,scheme2,scheme3`\n/// 2. The profile key `auth_scheme_preference=scheme1,scheme2,scheme3`\n///\n/// A scheme name can be either a fully qualified name or a shorthand with the namespace prefix trimmed.\n/// For example, valid scheme names include \"aws.auth#sigv4\", \"smithy.api#httpBasicAuth\", \"sigv4\", and \"httpBasicAuth\".\n/// Whitespace (spaces or tabs), including leading, trailing, and between names, is ignored.\n///\n/// Returns `None` if a parsed string component is empty when creating an `AuthSchemeId`.\npub(crate) async fn auth_scheme_preference_provider(\n    provider_config: &ProviderConfig,\n) -> Option<AuthSchemePreference> {\n    let env = provider_config.env();\n    let profiles = provider_config.profile().await;\n\n    EnvConfigValue::new()\n        .env(env::AUTH_SCHEME_PREFERENCE)\n        .profile(profile_key::AUTH_SCHEME_PREFERENCE)\n        .validate(&env, profiles, parse_auth_scheme_names)\n        .map_err(|err| tracing::warn!(err = %DisplayErrorContext(&err), \"invalid value for `AuthSchemePreference`\"))\n        .unwrap_or(None)\n}\n\nfn parse_auth_scheme_names(csv: &str) -> Result<AuthSchemePreference, InvalidAuthSchemeNamesCsv> {\n    csv.split(',')\n        .map(|s| {\n            let trimmed = s.trim().replace([' ', '\\t'], \"\");\n            if trimmed.is_empty() {\n                return Err(InvalidAuthSchemeNamesCsv {\n                    value: format!(\"Empty name found in `{csv}`.\"),\n                });\n            }\n            let scheme_name = trimmed.split('#').next_back().unwrap_or(&trimmed);\n            Ok(AuthSchemeId::from(Cow::Owned(scheme_name.to_owned())))\n        })\n        .collect::<Result<Vec<_>, _>>()\n        .map(AuthSchemePreference::from)\n}\n\n#[derive(Debug)]\npub(crate) struct InvalidAuthSchemeNamesCsv {\n    value: String,\n}\n\nimpl fmt::Display for InvalidAuthSchemeNamesCsv {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        write!(\n            f,\n            \"Not a valid comma-separated auth scheme names: {}\",\n            self.value\n        )\n    }\n}\n\nimpl std::error::Error for InvalidAuthSchemeNamesCsv {}\n\n#[cfg(test)]\nmod test {\n    use super::env;\n    use crate::{\n        default_provider::auth_scheme_preference::auth_scheme_preference_provider,\n        provider_config::ProviderConfig,\n    };\n    use aws_types::os_shim_internal::Env;\n    use tracing_test::traced_test;\n\n    #[tokio::test]\n    #[traced_test]\n    async fn log_error_on_invalid_value() {\n        let conf = ProviderConfig::empty().with_env(Env::from_slice(&[(\n            env::AUTH_SCHEME_PREFERENCE,\n            \"scheme1, , \\tscheme2\",\n        )]));\n        assert_eq!(None, auth_scheme_preference_provider(&conf).await);\n        assert!(logs_contain(\n            \"Not a valid comma-separated auth scheme names: Empty name found\"\n        ));\n    }\n\n    #[cfg(feature = \"sso\")] // for aws-smithy-runtime-api/http-auth\n    mod http_auth_tests {\n        use super::env;\n        #[allow(deprecated)]\n        use crate::profile::profile_file::{ProfileFileKind, ProfileFiles};\n        use crate::{\n            default_provider::auth_scheme_preference::auth_scheme_preference_provider,\n            provider_config::ProviderConfig,\n        };\n        use aws_smithy_runtime_api::client::auth::AuthSchemePreference;\n        use aws_types::os_shim_internal::{Env, Fs};\n\n        #[tokio::test]\n        async fn environment_priority() {\n            let conf = ProviderConfig::empty()\n            .with_env(Env::from_slice(&[(\n                env::AUTH_SCHEME_PREFERENCE,\n                \"aws.auth#sigv4, smithy.api#httpBasicAuth, smithy.api#httpDigestAuth, smithy.api#httpBearerAuth, smithy.api#httpApiKeyAuth\",\n            )]))\n            .with_profile_config(\n                Some(\n                    #[allow(deprecated)]\n                    ProfileFiles::builder()\n                        .with_file(\n                            #[allow(deprecated)]\n                            ProfileFileKind::Config,\n                            \"conf\",\n                        )\n                        .build(),\n                ),\n                None,\n            )\n            .with_fs(Fs::from_slice(&[(\n                \"conf\",\n                \"[default]\\nauth_scheme_preference = scheme1, scheme2 , \\tscheme3 \\t\",\n            )]));\n            assert_eq!(\n                AuthSchemePreference::from([\n                    aws_runtime::auth::sigv4::SCHEME_ID,\n                    aws_smithy_runtime_api::client::auth::http::HTTP_BASIC_AUTH_SCHEME_ID,\n                    aws_smithy_runtime_api::client::auth::http::HTTP_DIGEST_AUTH_SCHEME_ID,\n                    aws_smithy_runtime_api::client::auth::http::HTTP_BEARER_AUTH_SCHEME_ID,\n                    aws_smithy_runtime_api::client::auth::http::HTTP_API_KEY_AUTH_SCHEME_ID,\n                ]),\n                auth_scheme_preference_provider(&conf).await.unwrap()\n            );\n        }\n\n        #[tokio::test]\n        async fn load_from_profile() {\n            let conf = ProviderConfig::empty()\n            .with_profile_config(\n                Some(\n                    #[allow(deprecated)]\n                    ProfileFiles::builder()\n                        .with_file(\n                            #[allow(deprecated)]\n                            ProfileFileKind::Config,\n                            \"conf\",\n                        )\n                        .build(),\n                ),\n                None,\n            )\n            .with_fs(Fs::from_slice(&[(\n                \"conf\",\n                \"[default]\\nauth_scheme_preference = sigv4, httpBasicAuth, httpDigestAuth, \\thttpBearerAuth \\t, httpApiKeyAuth \",\n            )]));\n            assert_eq!(\n                AuthSchemePreference::from([\n                    aws_runtime::auth::sigv4::SCHEME_ID,\n                    aws_smithy_runtime_api::client::auth::http::HTTP_BASIC_AUTH_SCHEME_ID,\n                    aws_smithy_runtime_api::client::auth::http::HTTP_DIGEST_AUTH_SCHEME_ID,\n                    aws_smithy_runtime_api::client::auth::http::HTTP_BEARER_AUTH_SCHEME_ID,\n                    aws_smithy_runtime_api::client::auth::http::HTTP_API_KEY_AUTH_SCHEME_ID,\n                ]),\n                auth_scheme_preference_provider(&conf).await.unwrap()\n            );\n        }\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/src/default_provider/checksums.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::provider_config::ProviderConfig;\nuse aws_runtime::env_config::EnvConfigValue;\nuse aws_smithy_types::error::display::DisplayErrorContext;\nuse aws_types::sdk_config::{RequestChecksumCalculation, ResponseChecksumValidation};\nuse std::str::FromStr;\n\nmod env {\n    pub(super) const REQUEST_CHECKSUM_CALCULATION: &str = \"AWS_REQUEST_CHECKSUM_CALCULATION\";\n    pub(super) const RESPONSE_CHECKSUM_VALIDATION: &str = \"AWS_RESPONSE_CHECKSUM_VALIDATION\";\n}\n\nmod profile_key {\n    pub(super) const REQUEST_CHECKSUM_CALCULATION: &str = \"request_checksum_calculation\";\n    pub(super) const RESPONSE_CHECKSUM_VALIDATION: &str = \"response_checksum_validation\";\n}\n\n/// Load the value for `request_checksum_calculation`\n///\n/// This checks the following sources:\n/// 1. The environment variable `AWS_REQUEST_CHECKSUM_CALCULATION=WHEN_SUPPORTED/WHEN_REQUIRED`\n/// 2. The profile key `request_checksum_calculation=WHEN_SUPPORTED/WHEN_REQUIRED`\n///\n/// If invalid values are found, the provider will return `None` and an error will be logged.\npub async fn request_checksum_calculation_provider(\n    provider_config: &ProviderConfig,\n) -> Option<RequestChecksumCalculation> {\n    let env = provider_config.env();\n    let profiles = provider_config.profile().await;\n\n    let loaded = EnvConfigValue::new()\n         .env(env::REQUEST_CHECKSUM_CALCULATION)\n         .profile(profile_key::REQUEST_CHECKSUM_CALCULATION)\n         .validate(&env, profiles, RequestChecksumCalculation::from_str)\n         .map_err(\n             |err| tracing::warn!(err = %DisplayErrorContext(&err), \"invalid value for request_checksum_calculation setting\"),\n         )\n         .unwrap_or(None);\n\n    // request_checksum_calculation should always have a non-None value and the\n    // default is WhenSupported\n    loaded.or(Some(RequestChecksumCalculation::WhenSupported))\n}\n\n/// Load the value for `response_checksum_validation`\n///\n/// This checks the following sources:\n/// 1. The environment variable `AWS_RESPONSE_CHECKSUM_VALIDATION=WHEN_SUPPORTED/WHEN_REQUIRED`\n/// 2. The profile key `response_checksum_validation=WHEN_SUPPORTED/WHEN_REQUIRED`\n///\n/// If invalid values are found, the provider will return `None` and an error will be logged.\npub async fn response_checksum_validation_provider(\n    provider_config: &ProviderConfig,\n) -> Option<ResponseChecksumValidation> {\n    let env = provider_config.env();\n    let profiles = provider_config.profile().await;\n\n    let loaded = EnvConfigValue::new()\n         .env(env::RESPONSE_CHECKSUM_VALIDATION)\n         .profile(profile_key::RESPONSE_CHECKSUM_VALIDATION)\n         .validate(&env, profiles, ResponseChecksumValidation::from_str)\n         .map_err(\n             |err| tracing::warn!(err = %DisplayErrorContext(&err), \"invalid value for response_checksum_validation setting\"),\n         )\n         .unwrap_or(None);\n\n    // response_checksum_validation should always have a non-None value and the\n    // default is WhenSupported\n    loaded.or(Some(ResponseChecksumValidation::WhenSupported))\n}\n\n#[cfg(test)]\nmod test {\n    use crate::default_provider::checksums::{\n        request_checksum_calculation_provider, response_checksum_validation_provider,\n    };\n    #[allow(deprecated)]\n    use crate::profile::profile_file::{ProfileFileKind, ProfileFiles};\n    use crate::provider_config::ProviderConfig;\n    use aws_smithy_types::checksum_config::{\n        RequestChecksumCalculation, ResponseChecksumValidation,\n    };\n    use aws_types::os_shim_internal::{Env, Fs};\n    use tracing_test::traced_test;\n\n    #[tokio::test]\n    #[traced_test]\n    async fn log_error_on_invalid_value_request() {\n        let conf = ProviderConfig::empty().with_env(Env::from_slice(&[(\n            \"AWS_REQUEST_CHECKSUM_CALCULATION\",\n            \"not-a-valid-value\",\n        )]));\n        assert_eq!(\n            request_checksum_calculation_provider(&conf).await,\n            Some(RequestChecksumCalculation::WhenSupported)\n        );\n        assert!(logs_contain(\n            \"invalid value for request_checksum_calculation setting\"\n        ));\n        assert!(logs_contain(\"AWS_REQUEST_CHECKSUM_CALCULATION\"));\n    }\n\n    #[tokio::test]\n    #[traced_test]\n    async fn environment_priority_request() {\n        let conf = ProviderConfig::empty()\n            .with_env(Env::from_slice(&[(\n                \"AWS_REQUEST_CHECKSUM_CALCULATION\",\n                \"WHEN_REQUIRED\",\n            )]))\n            .with_profile_config(\n                Some(\n                    #[allow(deprecated)]\n                    ProfileFiles::builder()\n                        .with_file(\n                            #[allow(deprecated)]\n                            ProfileFileKind::Config,\n                            \"conf\",\n                        )\n                        .build(),\n                ),\n                None,\n            )\n            .with_fs(Fs::from_slice(&[(\n                \"conf\",\n                \"[default]\\nrequest_checksum_calculation = WHEN_SUPPORTED\",\n            )]));\n        assert_eq!(\n            request_checksum_calculation_provider(&conf).await,\n            Some(RequestChecksumCalculation::WhenRequired)\n        );\n    }\n\n    #[tokio::test]\n    #[traced_test]\n    async fn profile_works_request() {\n        let conf = ProviderConfig::empty()\n            .with_profile_config(\n                Some(\n                    #[allow(deprecated)]\n                    ProfileFiles::builder()\n                        .with_file(\n                            #[allow(deprecated)]\n                            ProfileFileKind::Config,\n                            \"conf\",\n                        )\n                        .build(),\n                ),\n                None,\n            )\n            .with_fs(Fs::from_slice(&[(\n                \"conf\",\n                \"[default]\\nrequest_checksum_calculation = WHEN_REQUIRED\",\n            )]));\n        assert_eq!(\n            request_checksum_calculation_provider(&conf).await,\n            Some(RequestChecksumCalculation::WhenRequired)\n        );\n    }\n\n    #[tokio::test]\n    #[traced_test]\n    async fn default_works_request() {\n        let conf = ProviderConfig::empty();\n        assert_eq!(\n            request_checksum_calculation_provider(&conf).await,\n            Some(RequestChecksumCalculation::WhenSupported)\n        );\n    }\n\n    #[tokio::test]\n    #[traced_test]\n    async fn log_error_on_invalid_value_response() {\n        let conf = ProviderConfig::empty().with_env(Env::from_slice(&[(\n            \"AWS_RESPONSE_CHECKSUM_VALIDATION\",\n            \"not-a-valid-value\",\n        )]));\n        assert_eq!(\n            response_checksum_validation_provider(&conf).await,\n            Some(ResponseChecksumValidation::WhenSupported)\n        );\n        assert!(logs_contain(\n            \"invalid value for response_checksum_validation setting\"\n        ));\n        assert!(logs_contain(\"AWS_RESPONSE_CHECKSUM_VALIDATION\"));\n    }\n\n    #[tokio::test]\n    #[traced_test]\n    async fn environment_priority_response() {\n        let conf = ProviderConfig::empty()\n            .with_env(Env::from_slice(&[(\n                \"AWS_RESPONSE_CHECKSUM_VALIDATION\",\n                \"WHEN_SUPPORTED\",\n            )]))\n            .with_profile_config(\n                Some(\n                    #[allow(deprecated)]\n                    ProfileFiles::builder()\n                        .with_file(\n                            #[allow(deprecated)]\n                            ProfileFileKind::Config,\n                            \"conf\",\n                        )\n                        .build(),\n                ),\n                None,\n            )\n            .with_fs(Fs::from_slice(&[(\n                \"conf\",\n                \"[default]\\response_checksum_validation = WHEN_REQUIRED\",\n            )]));\n        assert_eq!(\n            response_checksum_validation_provider(&conf).await,\n            Some(ResponseChecksumValidation::WhenSupported)\n        );\n    }\n\n    #[tokio::test]\n    #[traced_test]\n    async fn profile_works_response() {\n        let conf = ProviderConfig::empty()\n            .with_profile_config(\n                Some(\n                    #[allow(deprecated)]\n                    ProfileFiles::builder()\n                        .with_file(\n                            #[allow(deprecated)]\n                            ProfileFileKind::Config,\n                            \"conf\",\n                        )\n                        .build(),\n                ),\n                None,\n            )\n            .with_fs(Fs::from_slice(&[(\n                \"conf\",\n                \"[default]\\nresponse_checksum_validation = WHEN_REQUIRED\",\n            )]));\n        assert_eq!(\n            response_checksum_validation_provider(&conf).await,\n            Some(ResponseChecksumValidation::WhenRequired)\n        );\n    }\n\n    #[tokio::test]\n    #[traced_test]\n    async fn default_works_response() {\n        let conf = ProviderConfig::empty();\n        assert_eq!(\n            response_checksum_validation_provider(&conf).await,\n            Some(ResponseChecksumValidation::WhenSupported)\n        );\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/src/default_provider/credentials.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::borrow::Cow;\n\nuse aws_credential_types::provider::{self, future, ProvideCredentials};\nuse aws_credential_types::Credentials;\nuse tracing::Instrument;\n\nuse crate::environment::credentials::EnvironmentVariableCredentialsProvider;\nuse crate::meta::credentials::CredentialsProviderChain;\nuse crate::meta::region::ProvideRegion;\nuse crate::provider_config::ProviderConfig;\n\n#[cfg(any(feature = \"default-https-client\", feature = \"rustls\"))]\n/// Default Credentials Provider chain\n///\n/// The region from the default region provider will be used\npub async fn default_provider() -> impl ProvideCredentials {\n    DefaultCredentialsChain::builder().build().await\n}\n\n/// Default AWS Credential Provider Chain\n///\n/// Resolution order:\n/// 1. Environment variables: [`EnvironmentVariableCredentialsProvider`]\n/// 2. Shared config (`~/.aws/config`, `~/.aws/credentials`): [`SharedConfigCredentialsProvider`](crate::profile::ProfileFileCredentialsProvider)\n/// 3. [Web Identity Tokens](crate::web_identity_token)\n/// 4. ECS (IAM Roles for Tasks) & General HTTP credentials: [`ecs`](crate::ecs)\n/// 5. [EC2 IMDSv2](crate::imds)\n///\n/// The outer provider is wrapped in a refreshing cache.\n///\n/// More providers are a work in progress.\n///\n/// # Examples\n/// Create a default chain with a custom region:\n/// ```no_run\n/// use aws_types::region::Region;\n/// use aws_config::default_provider::credentials::DefaultCredentialsChain;\n/// let credentials_provider = DefaultCredentialsChain::builder()\n///     .region(Region::new(\"us-west-1\"))\n///     .build();\n/// ```\n///\n/// Create a default chain with no overrides:\n/// ```no_run\n/// use aws_config::default_provider::credentials::DefaultCredentialsChain;\n/// let credentials_provider = DefaultCredentialsChain::builder().build();\n/// ```\n///\n/// Create a default chain that uses a different profile:\n/// ```no_run\n/// use aws_config::default_provider::credentials::DefaultCredentialsChain;\n/// let credentials_provider = DefaultCredentialsChain::builder()\n///     .profile_name(\"otherprofile\")\n///     .build();\n/// ```\n#[derive(Debug)]\npub struct DefaultCredentialsChain {\n    provider_chain: CredentialsProviderChain,\n}\n\nimpl DefaultCredentialsChain {\n    /// Builder for `DefaultCredentialsChain`\n    pub fn builder() -> Builder {\n        Builder::default()\n    }\n\n    async fn credentials(&self) -> provider::Result {\n        self.provider_chain\n            .provide_credentials()\n            .instrument(tracing::debug_span!(\"default_credentials_chain\"))\n            .await\n    }\n}\n\nimpl ProvideCredentials for DefaultCredentialsChain {\n    fn provide_credentials<'a>(&'a self) -> future::ProvideCredentials<'a>\n    where\n        Self: 'a,\n    {\n        future::ProvideCredentials::new(self.credentials())\n    }\n\n    fn fallback_on_interrupt(&self) -> Option<Credentials> {\n        self.provider_chain.fallback_on_interrupt()\n    }\n}\n\n/// Builder for [`DefaultCredentialsChain`].\n#[derive(Debug, Default)]\npub struct Builder {\n    profile_file_builder: crate::profile::credentials::Builder,\n    web_identity_builder: crate::web_identity_token::Builder,\n    imds_builder: crate::imds::credentials::Builder,\n    ecs_builder: crate::ecs::Builder,\n    region_override: Option<Box<dyn ProvideRegion>>,\n    region_chain: crate::default_provider::region::Builder,\n    conf: Option<ProviderConfig>,\n}\n\nimpl Builder {\n    /// Sets the region used when making requests to AWS services\n    ///\n    /// When unset, the default region resolver chain will be used.\n    pub fn region(mut self, region: impl ProvideRegion + 'static) -> Self {\n        self.set_region(Some(region));\n        self\n    }\n\n    /// Sets the region used when making requests to AWS services\n    ///\n    /// When unset, the default region resolver chain will be used.\n    pub fn set_region(&mut self, region: Option<impl ProvideRegion + 'static>) -> &mut Self {\n        self.region_override = region.map(|provider| Box::new(provider) as _);\n        self\n    }\n\n    /// Add an additional credential source for the ProfileProvider\n    ///\n    /// Assume role profiles may specify named credential sources:\n    /// ```ini\n    /// [default]\n    /// role_arn = arn:aws:iam::123456789:role/RoleA\n    /// credential_source = MyCustomProvider\n    /// ```\n    ///\n    /// Typically, these are built-in providers like `Environment`, however, custom sources may\n    /// also be used.\n    ///\n    /// See [`with_custom_provider`](crate::profile::credentials::Builder::with_custom_provider)\n    pub fn with_custom_credential_source(\n        mut self,\n        name: impl Into<Cow<'static, str>>,\n        provider: impl ProvideCredentials + 'static,\n    ) -> Self {\n        self.profile_file_builder = self\n            .profile_file_builder\n            .with_custom_provider(name, provider);\n        self\n    }\n\n    /// Override the profile name used by this provider\n    ///\n    /// When unset, the value of the `AWS_PROFILE` environment variable will be used.\n    pub fn profile_name(mut self, name: &str) -> Self {\n        self.profile_file_builder = self.profile_file_builder.profile_name(name);\n        self.region_chain = self.region_chain.profile_name(name);\n        self\n    }\n\n    /// Override the IMDS client used for this provider\n    ///\n    /// When unset, the default IMDS client will be used.\n    pub fn imds_client(mut self, client: crate::imds::Client) -> Self {\n        self.imds_builder = self.imds_builder.imds_client(client);\n        self\n    }\n\n    /// Override the configuration used for this provider\n    pub fn configure(mut self, config: ProviderConfig) -> Self {\n        self.region_chain = self.region_chain.configure(&config);\n        self.conf = Some(config);\n        self\n    }\n\n    /// Creates a `DefaultCredentialsChain`\n    ///\n    /// ## Panics\n    /// This function will panic if no connector has been set or the `default-https-client`\n    /// feature has been disabled.\n    pub async fn build(self) -> DefaultCredentialsChain {\n        let region = match self.region_override {\n            Some(provider) => provider.region().await,\n            None => self.region_chain.build().region().await,\n        };\n\n        let conf = self.conf.unwrap_or_default().with_region(region);\n\n        let env_provider = EnvironmentVariableCredentialsProvider::new_with_env(conf.env());\n        let profile_provider = self.profile_file_builder.configure(&conf).build();\n        let web_identity_token_provider = self.web_identity_builder.configure(&conf).build();\n        let imds_provider = self.imds_builder.configure(&conf).build();\n        let ecs_provider = self.ecs_builder.configure(&conf).build();\n\n        let provider_chain = CredentialsProviderChain::first_try(\"Environment\", env_provider)\n            .or_else(\"Profile\", profile_provider)\n            .or_else(\"WebIdentityToken\", web_identity_token_provider)\n            .or_else(\"EcsContainer\", ecs_provider)\n            .or_else(\"Ec2InstanceMetadata\", imds_provider);\n\n        DefaultCredentialsChain { provider_chain }\n    }\n}\n\n#[cfg(test)]\nmod test {\n    use crate::default_provider::credentials::DefaultCredentialsChain;\n    use crate::test_case::{StaticTestProvider, TestEnvironment};\n    use aws_credential_types::provider::ProvideCredentials;\n    use aws_smithy_async::time::StaticTimeSource;\n    use std::time::UNIX_EPOCH;\n\n    /// Test generation macro\n    ///\n    /// # Examples\n    /// **Run the test case in `test-data/default-credential-provider-chain/test_name`\n    /// ```no_run\n    /// make_test!(test_name);\n    /// ```\n    ///\n    /// **Update (responses are replayed but new requests are recorded) the test case**:\n    /// ```no_run\n    /// make_test!(update: test_name)\n    /// ```\n    ///\n    /// **Run the test case against a real HTTPS connection:**\n    /// > Note: Be careful to remove sensitive information before committing. Always use a temporary\n    /// > AWS account when recording live traffic.\n    /// ```no_run\n    /// make_test!(live: test_name)\n    /// ```\n    macro_rules! make_test {\n        ($name:ident $(#[$m:meta])*) => {\n            make_test!($name, execute, $(#[$m])*);\n        };\n        (update: $name:ident) => {\n            make_test!($name, execute_and_update);\n        };\n        (live: $name:ident) => {\n            make_test!($name, execute_from_live_traffic);\n        };\n        ($name:ident, $func:ident, $(#[$m:meta])*) => {\n            make_test!($name, $func, std::convert::identity $(, #[$m])*);\n        };\n        ($name:ident, builder: $provider_config_builder:expr) => {\n            make_test!($name, execute, $provider_config_builder);\n        };\n        ($name:ident, $func:ident, $provider_config_builder:expr $(, #[$m:meta])*) => {\n            $(#[$m])*\n            #[tokio::test]\n            async fn $name() {\n                let _ = crate::test_case::TestEnvironment::from_dir(\n                    concat!(\n                        \"./test-data/default-credential-provider-chain/\",\n                        stringify!($name)\n                    ),\n                    crate::test_case::test_credentials_provider(|config| {\n                        async move {\n                            crate::default_provider::credentials::Builder::default()\n                                .configure(config)\n                                .build()\n                                .await\n                                .provide_credentials()\n                                .await\n                        }\n                    }),\n                )\n                .await\n                .unwrap()\n                .map_provider_config($provider_config_builder)\n                .$func()\n                .await;\n            }\n        };\n    }\n\n    make_test!(prefer_environment);\n    make_test!(profile_static_keys);\n    make_test!(profile_static_keys_case_insensitive);\n    make_test!(web_identity_token_env);\n    make_test!(web_identity_source_profile_no_env);\n    make_test!(web_identity_token_invalid_jwt);\n    make_test!(web_identity_token_source_profile);\n    make_test!(web_identity_token_profile);\n    make_test!(profile_name);\n    make_test!(profile_overrides_web_identity);\n    make_test!(environment_variables);\n    make_test!(environment_variables_blank);\n    make_test!(imds_token_fail);\n\n    make_test!(imds_no_iam_role);\n    make_test!(imds_default_chain_error);\n    make_test!(imds_default_chain_success, builder: |config| {\n        config.with_time_source(StaticTimeSource::new(UNIX_EPOCH))\n    });\n    make_test!(imds_assume_role);\n    make_test!(imds_config_with_no_creds, builder: |config| {\n        config.with_time_source(StaticTimeSource::new(UNIX_EPOCH))\n    });\n    make_test!(imds_disabled);\n    make_test!(imds_default_chain_retries, builder: |config| {\n        config.with_time_source(StaticTimeSource::new(UNIX_EPOCH))\n    });\n    make_test!(ecs_assume_role);\n    make_test!(ecs_credentials);\n    make_test!(ecs_credentials_invalid_profile);\n\n    make_test!(eks_pod_identity_credentials);\n    // TODO(https://github.com/awslabs/aws-sdk-rust/issues/1117) This test is disabled on Windows because it uses Unix-style paths\n    #[cfg(not(windows))]\n    make_test!(eks_pod_identity_no_token_file);\n\n    #[cfg(not(feature = \"sso\"))]\n    make_test!(sso_assume_role #[should_panic(expected = \"This behavior requires following cargo feature(s) enabled: sso\")]);\n\n    #[cfg(feature = \"sso\")]\n    make_test!(sso_assume_role);\n\n    // TODO(https://github.com/awslabs/aws-sdk-rust/issues/1117) This test is disabled on Windows because it uses Unix-style paths\n    #[cfg(not(any(feature = \"sso\", windows)))]\n    make_test!(sso_no_token_file #[should_panic(expected = \"This behavior requires following cargo feature(s) enabled: sso\")]);\n    // TODO(https://github.com/awslabs/aws-sdk-rust/issues/1117) This test is disabled on Windows because it uses Unix-style paths\n    #[cfg(all(feature = \"sso\", not(windows)))]\n    make_test!(sso_no_token_file);\n\n    #[cfg(feature = \"sso\")]\n    make_test!(sso_server_error, builder: |config| {\n        // disable retry to simplify traffic recording\n        config.with_retry_config(crate::retry::RetryConfig::disabled())\n    });\n\n    #[cfg(feature = \"sso\")]\n    make_test!(e2e_fips_and_dual_stack_sso);\n\n    #[tokio::test]\n    async fn profile_name_override() {\n        // Only use the TestEnvironment to create a ProviderConfig from the\n        // profile_static_keys test directory. We don't actually want to\n        // use the expected test output from that directory since we're\n        // overriding the profile name on the credentials chain in this test.\n        let provider_config = TestEnvironment::<crate::test_case::Credentials, ()>::from_dir(\n            \"./test-data/default-credential-provider-chain/profile_static_keys\",\n            StaticTestProvider::new(|_| unreachable!()),\n        )\n        .await\n        .unwrap()\n        .provider_config()\n        .clone();\n\n        let creds = DefaultCredentialsChain::builder()\n            .profile_name(\"secondary\")\n            .configure(provider_config)\n            .build()\n            .await\n            .provide_credentials()\n            .await\n            .expect(\"creds should load\");\n\n        assert_eq!(creds.access_key_id(), \"correct_key_secondary\");\n    }\n\n    #[tokio::test]\n    async fn no_providers_configured_err() {\n        use crate::provider_config::ProviderConfig;\n        use aws_credential_types::provider::error::CredentialsError;\n        use aws_smithy_async::rt::sleep::TokioSleep;\n        use aws_smithy_http_client::test_util::NeverTcpConnector;\n\n        tokio::time::pause();\n        let conf = ProviderConfig::no_configuration()\n            .with_http_client(NeverTcpConnector::new().into_client())\n            .with_time_source(StaticTimeSource::new(UNIX_EPOCH))\n            .with_sleep_impl(TokioSleep::new());\n        let provider = DefaultCredentialsChain::builder()\n            .configure(conf)\n            .build()\n            .await;\n        let creds = provider\n            .provide_credentials()\n            .await\n            .expect_err(\"no providers enabled\");\n        assert!(\n            matches!(creds, CredentialsError::CredentialsNotLoaded { .. }),\n            \"should be NotLoaded: {:?}\",\n            creds\n        )\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/src/default_provider/disable_request_compression.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::environment::parse_bool;\nuse crate::provider_config::ProviderConfig;\nuse aws_runtime::env_config::EnvConfigValue;\nuse aws_smithy_types::error::display::DisplayErrorContext;\n\nmod env {\n    pub(super) const DISABLE_REQUEST_COMPRESSION: &str = \"AWS_DISABLE_REQUEST_COMPRESSION\";\n}\n\nmod profile_key {\n    pub(super) const DISABLE_REQUEST_COMPRESSION: &str = \"disable_request_compression\";\n}\n\n/// Load the value for \"disable request compression\".\n///\n/// This checks the following sources:\n/// 1. The environment variable `AWS_DISABLE_REQUEST_COMPRESSION=true/false`\n/// 2. The profile key `disable_request_compression=true/false`\n///\n/// If invalid values are found, the provider will return None and an error will be logged.\npub(crate) async fn disable_request_compression_provider(\n    provider_config: &ProviderConfig,\n) -> Option<bool> {\n    let env = provider_config.env();\n    let profiles = provider_config.profile().await;\n\n    EnvConfigValue::new()\n        .env(env::DISABLE_REQUEST_COMPRESSION)\n        .profile(profile_key::DISABLE_REQUEST_COMPRESSION)\n        .validate(&env, profiles, parse_bool)\n        .map_err(\n            |err| tracing::warn!(err = %DisplayErrorContext(&err), \"invalid value for `disable request compression` setting\"),\n        )\n        .unwrap_or(None)\n}\n\n#[cfg(test)]\nmod test {\n    use super::disable_request_compression_provider;\n    #[allow(deprecated)]\n    use crate::profile::profile_file::{ProfileFileKind, ProfileFiles};\n    use crate::provider_config::ProviderConfig;\n    use aws_types::os_shim_internal::{Env, Fs};\n    use tracing_test::traced_test;\n\n    #[tokio::test]\n    #[traced_test]\n    async fn log_error_on_invalid_value() {\n        let conf = ProviderConfig::empty().with_env(Env::from_slice(&[(\n            \"AWS_DISABLE_REQUEST_COMPRESSION\",\n            \"not-a-boolean\",\n        )]));\n        assert_eq!(disable_request_compression_provider(&conf).await, None);\n        assert!(logs_contain(\n            \"invalid value for `disable request compression` setting\"\n        ));\n        assert!(logs_contain(\"AWS_DISABLE_REQUEST_COMPRESSION\"));\n    }\n\n    #[tokio::test]\n    #[traced_test]\n    async fn environment_priority() {\n        let conf = ProviderConfig::empty()\n            .with_env(Env::from_slice(&[(\n                \"AWS_DISABLE_REQUEST_COMPRESSION\",\n                \"TRUE\",\n            )]))\n            .with_profile_config(\n                Some(\n                    #[allow(deprecated)]\n                    ProfileFiles::builder()\n                        .with_file(\n                            #[allow(deprecated)]\n                            ProfileFileKind::Config,\n                            \"conf\",\n                        )\n                        .build(),\n                ),\n                None,\n            )\n            .with_fs(Fs::from_slice(&[(\n                \"conf\",\n                \"[default]\\ndisable_request_compression = false\",\n            )]));\n        assert_eq!(\n            disable_request_compression_provider(&conf).await,\n            Some(true)\n        );\n    }\n\n    #[tokio::test]\n    #[traced_test]\n    async fn profile_config_works() {\n        let conf = ProviderConfig::empty()\n            .with_profile_config(\n                Some(\n                    #[allow(deprecated)]\n                    ProfileFiles::builder()\n                        .with_file(\n                            #[allow(deprecated)]\n                            ProfileFileKind::Config,\n                            \"conf\",\n                        )\n                        .build(),\n                ),\n                None,\n            )\n            .with_fs(Fs::from_slice(&[(\n                \"conf\",\n                \"[default]\\ndisable_request_compression = true\",\n            )]));\n        assert_eq!(\n            disable_request_compression_provider(&conf).await,\n            Some(true)\n        );\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/src/default_provider/endpoint_url.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::environment::parse_url;\nuse crate::provider_config::ProviderConfig;\nuse aws_runtime::env_config::EnvConfigValue;\nuse aws_smithy_types::error::display::DisplayErrorContext;\nuse aws_types::origin::Origin;\n\nmod env {\n    pub(super) const ENDPOINT_URL: &str = \"AWS_ENDPOINT_URL\";\n}\n\nmod profile_key {\n    pub(super) const ENDPOINT_URL: &str = \"endpoint_url\";\n}\n\n/// Load the value for an endpoint URL\n///\n/// This checks the following sources:\n/// 1. The environment variable `AWS_ENDPOINT_URL=http://localhost`\n/// 2. The profile key `endpoint_url=http://localhost`\n///\n/// If invalid values are found, the provider will return None and an error will be logged.\npub async fn endpoint_url_provider(provider_config: &ProviderConfig) -> Option<String> {\n    let env = provider_config.env();\n    let profiles = provider_config.profile().await;\n\n    EnvConfigValue::new()\n        .env(env::ENDPOINT_URL)\n        .profile(profile_key::ENDPOINT_URL)\n        .validate(&env, profiles, parse_url)\n        .map_err(\n            |err| tracing::warn!(err = %DisplayErrorContext(&err), \"invalid value for endpoint URL setting\"),\n        )\n        .unwrap_or(None)\n}\n\n/// Load the value for an endpoint URL\n///\n/// This checks the following sources:\n/// 1. The environment variable `AWS_ENDPOINT_URL=http://localhost`\n/// 2. The profile key `endpoint_url=http://localhost`\n///\n/// If invalid values are found, the provider will return None and an error will be logged.\npub async fn endpoint_url_provider_with_origin(\n    provider_config: &ProviderConfig,\n) -> (Option<String>, Origin) {\n    let env = provider_config.env();\n    let profiles = provider_config.profile().await;\n\n    EnvConfigValue::new()\n        .env(env::ENDPOINT_URL)\n        .profile(profile_key::ENDPOINT_URL)\n        .validate_and_return_origin(&env, profiles, parse_url)\n        .map_err(\n            |err| tracing::warn!(err = %DisplayErrorContext(&err), \"invalid value for endpoint URL setting\"),\n        )\n        .unwrap_or_default()\n}\n\n#[cfg(test)]\nmod test {\n    use super::endpoint_url_provider;\n    use super::env;\n    #[allow(deprecated)]\n    use crate::profile::profile_file::{ProfileFileKind, ProfileFiles};\n    use crate::provider_config::ProviderConfig;\n    use aws_types::os_shim_internal::{Env, Fs};\n    use tracing_test::traced_test;\n\n    #[tokio::test]\n    #[traced_test]\n    async fn log_error_on_invalid_value() {\n        let conf =\n            ProviderConfig::empty().with_env(Env::from_slice(&[(env::ENDPOINT_URL, \"not-a-url\")]));\n        assert_eq!(None, endpoint_url_provider(&conf).await);\n        assert!(logs_contain(\"invalid value for endpoint URL setting\"));\n        assert!(logs_contain(env::ENDPOINT_URL));\n    }\n\n    #[tokio::test]\n    #[traced_test]\n    async fn environment_priority() {\n        let conf = ProviderConfig::empty()\n            .with_env(Env::from_slice(&[(env::ENDPOINT_URL, \"http://localhost\")]))\n            .with_profile_config(\n                Some(\n                    #[allow(deprecated)]\n                    ProfileFiles::builder()\n                        .with_file(\n                            #[allow(deprecated)]\n                            ProfileFileKind::Config,\n                            \"conf\",\n                        )\n                        .build(),\n                ),\n                None,\n            )\n            .with_fs(Fs::from_slice(&[(\n                \"conf\",\n                \"[default]\\nendpoint_url = http://production\",\n            )]));\n        assert_eq!(\n            Some(\"http://localhost\".to_owned()),\n            endpoint_url_provider(&conf).await,\n        );\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/src/default_provider/ignore_configured_endpoint_urls.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::environment::parse_bool;\nuse crate::provider_config::ProviderConfig;\nuse aws_runtime::env_config::EnvConfigValue;\nuse aws_smithy_types::error::display::DisplayErrorContext;\n\nmod env {\n    pub(super) const IGNORE_CONFIGURED_ENDPOINT_URLS: &str = \"AWS_IGNORE_CONFIGURED_ENDPOINT_URLS\";\n}\n\nmod profile_key {\n    pub(super) const IGNORE_CONFIGURED_ENDPOINT_URLS: &str = \"ignore_configured_endpoint_urls\";\n}\n\n/// Load the value for \"ignore configured endpoint URLs\"\n///\n/// This checks the following sources:\n/// 1. The environment variable `AWS_IGNORE_CONFIGURED_ENDPOINT_URLS_ENDPOINT=true/false`\n/// 2. The profile key `ignore_configured_endpoint_urls=true/false`\n///\n/// If invalid values are found, the provider will return None and an error will be logged.\npub async fn ignore_configured_endpoint_urls_provider(\n    provider_config: &ProviderConfig,\n) -> Option<bool> {\n    let env = provider_config.env();\n    let profiles = provider_config.profile().await;\n\n    EnvConfigValue::new()\n        .env(env::IGNORE_CONFIGURED_ENDPOINT_URLS)\n        .profile(profile_key::IGNORE_CONFIGURED_ENDPOINT_URLS)\n        .validate(&env, profiles, parse_bool)\n        .map_err(\n            |err| tracing::warn!(err = %DisplayErrorContext(&err), \"invalid value for 'ignore configured endpoint URLs' setting\"),\n        )\n        .unwrap_or(None)\n}\n\n#[cfg(test)]\nmod test {\n    use super::env;\n    use super::ignore_configured_endpoint_urls_provider;\n    #[allow(deprecated)]\n    use crate::profile::profile_file::{ProfileFileKind, ProfileFiles};\n    use crate::provider_config::ProviderConfig;\n    use aws_types::os_shim_internal::{Env, Fs};\n    use tracing_test::traced_test;\n\n    #[tokio::test]\n    #[traced_test]\n    async fn log_error_on_invalid_value() {\n        let conf = ProviderConfig::empty().with_env(Env::from_slice(&[(\n            env::IGNORE_CONFIGURED_ENDPOINT_URLS,\n            \"not-a-boolean\",\n        )]));\n        assert_eq!(None, ignore_configured_endpoint_urls_provider(&conf).await,);\n        assert!(logs_contain(\n            \"invalid value for 'ignore configured endpoint URLs' setting\"\n        ));\n        assert!(logs_contain(env::IGNORE_CONFIGURED_ENDPOINT_URLS));\n    }\n\n    #[tokio::test]\n    #[traced_test]\n    async fn environment_priority() {\n        let conf = ProviderConfig::empty()\n            .with_env(Env::from_slice(&[(\n                env::IGNORE_CONFIGURED_ENDPOINT_URLS,\n                \"TRUE\",\n            )]))\n            .with_profile_config(\n                Some(\n                    #[allow(deprecated)]\n                    ProfileFiles::builder()\n                        .with_file(\n                            #[allow(deprecated)]\n                            ProfileFileKind::Config,\n                            \"conf\",\n                        )\n                        .build(),\n                ),\n                None,\n            )\n            .with_fs(Fs::from_slice(&[(\n                \"conf\",\n                \"[default]\\nignore_configured_endpoint_urls = false\",\n            )]));\n        assert_eq!(\n            Some(true),\n            ignore_configured_endpoint_urls_provider(&conf).await,\n        );\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/src/default_provider/region.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_types::region::Region;\n\nuse crate::environment::region::EnvironmentVariableRegionProvider;\nuse crate::meta::region::{ProvideRegion, RegionProviderChain};\nuse crate::provider_config::ProviderConfig;\nuse crate::{imds, profile};\n\n/// Default Region Provider chain\n///\n/// This provider will check the following sources in order:\n/// 1. [Environment variables](EnvironmentVariableRegionProvider)\n/// 2. [Profile file](crate::profile::region::ProfileFileRegionProvider)\n/// 3. [EC2 IMDSv2](crate::imds::region)\npub fn default_provider() -> impl ProvideRegion {\n    Builder::default().build()\n}\n\n/// Default region provider chain\n#[derive(Debug)]\npub struct DefaultRegionChain(RegionProviderChain);\n\nimpl DefaultRegionChain {\n    /// Load a region from this chain\n    pub async fn region(&self) -> Option<Region> {\n        self.0.region().await\n    }\n\n    /// Builder for [`DefaultRegionChain`]\n    pub fn builder() -> Builder {\n        Builder::default()\n    }\n}\n\n/// Builder for [DefaultRegionChain]\n#[derive(Debug, Default)]\npub struct Builder {\n    env_provider: EnvironmentVariableRegionProvider,\n    profile_file: profile::region::Builder,\n    imds: imds::region::Builder,\n}\n\nimpl Builder {\n    /// Configure the default chain\n    ///\n    /// Exposed for overriding the environment when unit-testing providers\n    pub(crate) fn configure(mut self, configuration: &ProviderConfig) -> Self {\n        self.env_provider = EnvironmentVariableRegionProvider::new_with_env(configuration.env());\n        self.profile_file = self.profile_file.configure(configuration);\n        self.imds = self.imds.configure(configuration);\n        self\n    }\n\n    /// Override the profile name used by this provider\n    pub fn profile_name(mut self, name: &str) -> Self {\n        self.profile_file = self.profile_file.profile_name(name);\n        self\n    }\n\n    /// Build a [DefaultRegionChain]\n    pub fn build(self) -> DefaultRegionChain {\n        DefaultRegionChain(\n            RegionProviderChain::first_try(self.env_provider)\n                .or_else(self.profile_file.build())\n                .or_else(self.imds.build()),\n        )\n    }\n}\n\nimpl ProvideRegion for DefaultRegionChain {\n    fn region(&self) -> crate::meta::region::future::ProvideRegion<'_> {\n        ProvideRegion::region(&self.0)\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/src/default_provider/request_min_compression_size_bytes.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::environment::parse_uint;\nuse crate::provider_config::ProviderConfig;\nuse aws_runtime::env_config::EnvConfigValue;\nuse aws_smithy_types::error::display::DisplayErrorContext;\n\nmod env {\n    pub(super) const REQUEST_MIN_COMPRESSION_SIZE_BYTES: &str =\n        \"AWS_REQUEST_MIN_COMPRESSION_SIZE_BYTES\";\n}\n\nmod profile_key {\n    pub(super) const REQUEST_MIN_COMPRESSION_SIZE_BYTES: &str =\n        \"request_min_compression_size_bytes\";\n}\n\n/// Load the value for \"request minimum compression size bytes\".\n///\n/// This checks the following sources:\n/// 1. The environment variable `AWS_REQUEST_MIN_COMPRESSION_SIZE_BYTES=10240`\n/// 2. The profile key `request_min_compression_size_bytes=10240`\n///\n/// If invalid values are found, the provider will return None and an error will be logged.\npub(crate) async fn request_min_compression_size_bytes_provider(\n    provider_config: &ProviderConfig,\n) -> Option<u32> {\n    let env = provider_config.env();\n    let profiles = provider_config.profile().await;\n\n    EnvConfigValue::new()\n        .env(env::REQUEST_MIN_COMPRESSION_SIZE_BYTES)\n        .profile(profile_key::REQUEST_MIN_COMPRESSION_SIZE_BYTES)\n        .validate(&env, profiles, parse_uint)\n        .map_err(\n            |err| tracing::warn!(err = %DisplayErrorContext(&err), \"invalid value for `request minimum compression size bytes` setting\"),\n        )\n        .unwrap_or(None)\n}\n\n#[cfg(test)]\nmod test {\n    use super::request_min_compression_size_bytes_provider;\n    #[allow(deprecated)]\n    use crate::profile::profile_file::{ProfileFileKind, ProfileFiles};\n    use crate::provider_config::ProviderConfig;\n    use aws_types::os_shim_internal::{Env, Fs};\n    use tracing_test::traced_test;\n\n    #[tokio::test]\n    #[traced_test]\n    async fn log_error_on_invalid_value() {\n        let conf = ProviderConfig::empty().with_env(Env::from_slice(&[(\n            \"AWS_REQUEST_MIN_COMPRESSION_SIZE_BYTES\",\n            \"not-a-uint\",\n        )]));\n        assert_eq!(\n            request_min_compression_size_bytes_provider(&conf).await,\n            None\n        );\n        assert!(logs_contain(\n            \"invalid value for `request minimum compression size bytes` setting\"\n        ));\n        assert!(logs_contain(\"AWS_REQUEST_MIN_COMPRESSION_SIZE_BYTES\"));\n    }\n\n    #[tokio::test]\n    #[traced_test]\n    async fn environment_priority() {\n        let conf = ProviderConfig::empty()\n            .with_env(Env::from_slice(&[(\n                \"AWS_REQUEST_MIN_COMPRESSION_SIZE_BYTES\",\n                \"99\",\n            )]))\n            .with_profile_config(\n                Some(\n                    #[allow(deprecated)]\n                    ProfileFiles::builder()\n                        .with_file(\n                            #[allow(deprecated)]\n                            ProfileFileKind::Config,\n                            \"conf\",\n                        )\n                        .build(),\n                ),\n                None,\n            )\n            .with_fs(Fs::from_slice(&[(\n                \"conf\",\n                \"[default]\\nrequest_min_compression_size_bytes = 100\",\n            )]));\n        assert_eq!(\n            request_min_compression_size_bytes_provider(&conf).await,\n            Some(99)\n        );\n    }\n\n    #[tokio::test]\n    #[traced_test]\n    async fn profile_config_works() {\n        let conf = ProviderConfig::empty()\n            .with_profile_config(\n                Some(\n                    #[allow(deprecated)]\n                    ProfileFiles::builder()\n                        .with_file(\n                            #[allow(deprecated)]\n                            ProfileFileKind::Config,\n                            \"conf\",\n                        )\n                        .build(),\n                ),\n                None,\n            )\n            .with_fs(Fs::from_slice(&[(\n                \"conf\",\n                \"[default]\\nrequest_min_compression_size_bytes = 22\",\n            )]));\n        assert_eq!(\n            request_min_compression_size_bytes_provider(&conf).await,\n            Some(22)\n        );\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/src/default_provider/retry_config.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::provider_config::ProviderConfig;\nuse crate::retry::error::{RetryConfigError, RetryConfigErrorKind};\nuse aws_runtime::env_config::{EnvConfigError, EnvConfigValue};\nuse aws_smithy_types::error::display::DisplayErrorContext;\nuse aws_smithy_types::retry::{RetryConfig, RetryMode};\nuse std::str::FromStr;\n\n/// Default RetryConfig Provider chain\n///\n/// Unlike other \"providers\" `RetryConfig` has no related `RetryConfigProvider` trait. Instead,\n/// a builder struct is returned which has a similar API.\n///\n/// This provider will check the following sources in order:\n/// 1. Environment variables: `AWS_MAX_ATTEMPTS` & `AWS_RETRY_MODE`\n/// 2. Profile file: `max_attempts` and `retry_mode`\n///\n/// # Example\n///\n/// When running [`aws_config::from_env()`](crate::from_env()), a [`ConfigLoader`](crate::ConfigLoader)\n/// is created that will then create a [`RetryConfig`] from the default_provider. There is no\n/// need to call `default_provider` and the example below is only for illustration purposes.\n///\n/// ```no_run\n/// # use std::error::Error;\n/// # #[tokio::main]\n/// # async fn main() -> Result<(), Box<dyn Error>> {\n/// use aws_config::default_provider::retry_config;\n///\n/// // Load a retry config from a specific profile\n/// let retry_config = retry_config::default_provider()\n///     .profile_name(\"other_profile\")\n///     .retry_config()\n///     .await;\n/// let config = aws_config::from_env()\n///     // Override the retry config set by the default profile\n///     .retry_config(retry_config)\n///     .load()\n///     .await;\n/// // instantiate a service client:\n/// // <my_aws_service>::Client::new(&config);\n/// #     Ok(())\n/// # }\n/// ```\npub fn default_provider() -> Builder {\n    Builder::default()\n}\n\nmod env {\n    pub(super) const MAX_ATTEMPTS: &str = \"AWS_MAX_ATTEMPTS\";\n    pub(super) const RETRY_MODE: &str = \"AWS_RETRY_MODE\";\n}\n\nmod profile_keys {\n    pub(super) const MAX_ATTEMPTS: &str = \"max_attempts\";\n    pub(super) const RETRY_MODE: &str = \"retry_mode\";\n}\n\n/// Builder for RetryConfig that checks the environment and aws profile for configuration\n#[derive(Debug, Default)]\npub struct Builder {\n    provider_config: ProviderConfig,\n}\n\nimpl Builder {\n    /// Configure the default chain\n    ///\n    /// Exposed for overriding the environment when unit-testing providers\n    pub fn configure(mut self, configuration: &ProviderConfig) -> Self {\n        self.provider_config = configuration.clone();\n        self\n    }\n\n    /// Override the profile name used by this provider\n    pub fn profile_name(mut self, name: &str) -> Self {\n        self.provider_config = self.provider_config.with_profile_name(name.to_string());\n        self\n    }\n\n    /// Attempt to create a [`RetryConfig`] from following sources in order:\n    /// 1. Environment variables: `AWS_MAX_ATTEMPTS` & `AWS_RETRY_MODE`\n    /// 2. Profile file: `max_attempts` and `retry_mode`\n    /// 3. [RetryConfig::standard()](aws_smithy_types::retry::RetryConfig::standard)\n    ///\n    /// Precedence is considered on a per-field basis\n    ///\n    /// # Panics\n    ///\n    /// - Panics if the `AWS_MAX_ATTEMPTS` env var or `max_attempts` profile var is set to 0\n    /// - Panics if the `AWS_RETRY_MODE` env var or `retry_mode` profile var is set to \"adaptive\" (it's not yet supported)\n    pub async fn retry_config(self) -> RetryConfig {\n        match self.try_retry_config().await {\n            Ok(conf) => conf,\n            Err(e) => panic!(\"{}\", DisplayErrorContext(e)),\n        }\n    }\n\n    pub(crate) async fn try_retry_config(\n        self,\n    ) -> Result<RetryConfig, EnvConfigError<RetryConfigError>> {\n        let env = self.provider_config.env();\n        let profiles = self.provider_config.profile().await;\n        // Both of these can return errors due to invalid config settings, and we want to surface those as early as possible\n        // hence, we'll panic if any config values are invalid (missing values are OK though)\n        // We match this instead of unwrapping, so we can print the error with the `Display` impl instead of the `Debug` impl that unwrap uses\n        let mut retry_config = RetryConfig::standard();\n        let max_attempts = EnvConfigValue::new()\n            .env(env::MAX_ATTEMPTS)\n            .profile(profile_keys::MAX_ATTEMPTS)\n            .validate(&env, profiles, validate_max_attempts);\n\n        let retry_mode = EnvConfigValue::new()\n            .env(env::RETRY_MODE)\n            .profile(profile_keys::RETRY_MODE)\n            .validate(&env, profiles, |s| {\n                RetryMode::from_str(s)\n                    .map_err(|err| RetryConfigErrorKind::InvalidRetryMode { source: err }.into())\n            });\n\n        if let Some(max_attempts) = max_attempts? {\n            retry_config = retry_config.with_max_attempts(max_attempts);\n        }\n\n        if let Some(retry_mode) = retry_mode? {\n            retry_config = retry_config.with_retry_mode(retry_mode);\n        }\n\n        Ok(retry_config)\n    }\n}\n\nfn validate_max_attempts(max_attempts: &str) -> Result<u32, RetryConfigError> {\n    match max_attempts.parse::<u32>() {\n        Ok(0) => Err(RetryConfigErrorKind::MaxAttemptsMustNotBeZero.into()),\n        Ok(max_attempts) => Ok(max_attempts),\n        Err(source) => Err(RetryConfigErrorKind::FailedToParseMaxAttempts { source }.into()),\n    }\n}\n\n#[cfg(test)]\nmod test {\n    use crate::default_provider::retry_config::env;\n    use crate::provider_config::ProviderConfig;\n    use crate::retry::{\n        error::RetryConfigError, error::RetryConfigErrorKind, RetryConfig, RetryMode,\n    };\n    use aws_runtime::env_config::EnvConfigError;\n    use aws_types::os_shim_internal::{Env, Fs};\n\n    async fn test_provider(\n        vars: &[(&str, &str)],\n    ) -> Result<RetryConfig, EnvConfigError<RetryConfigError>> {\n        super::Builder::default()\n            .configure(&ProviderConfig::no_configuration().with_env(Env::from_slice(vars)))\n            .try_retry_config()\n            .await\n    }\n\n    #[tokio::test]\n    async fn test_returns_default_retry_config_from_empty_profile() {\n        let env = Env::from_slice(&[(\"AWS_CONFIG_FILE\", \"config\")]);\n        let fs = Fs::from_slice(&[(\"config\", \"[default]\\n\")]);\n\n        let provider_config = ProviderConfig::no_configuration().with_env(env).with_fs(fs);\n\n        let actual_retry_config = super::default_provider()\n            .configure(&provider_config)\n            .retry_config()\n            .await;\n\n        let expected_retry_config = RetryConfig::standard();\n\n        assert_eq!(actual_retry_config, expected_retry_config);\n        // This is redundant, but it's really important to make sure that\n        // we're setting these exact values by default, so we check twice\n        assert_eq!(actual_retry_config.max_attempts(), 3);\n        assert_eq!(actual_retry_config.mode(), RetryMode::Standard);\n    }\n\n    #[tokio::test]\n    async fn test_no_retry_config_in_empty_profile() {\n        let env = Env::from_slice(&[(\"AWS_CONFIG_FILE\", \"config\")]);\n        let fs = Fs::from_slice(&[(\"config\", \"[default]\\n\")]);\n\n        let provider_config = ProviderConfig::no_configuration().with_env(env).with_fs(fs);\n\n        let actual_retry_config = super::default_provider()\n            .configure(&provider_config)\n            .retry_config()\n            .await;\n\n        let expected_retry_config = RetryConfig::standard();\n\n        assert_eq!(actual_retry_config, expected_retry_config)\n    }\n\n    #[tokio::test]\n    async fn test_creation_of_retry_config_from_profile() {\n        let env = Env::from_slice(&[(\"AWS_CONFIG_FILE\", \"config\")]);\n        // TODO(https://github.com/awslabs/aws-sdk-rust/issues/247): standard is the default mode;\n        // this test would be better if it was setting it to adaptive mode\n        // adaptive mode is currently unsupported so that would panic\n        let fs = Fs::from_slice(&[(\n            \"config\",\n            // If the lines with the vars have preceding spaces, they don't get read\n            r#\"[default]\nmax_attempts = 1\nretry_mode = standard\n            \"#,\n        )]);\n\n        let provider_config = ProviderConfig::no_configuration().with_env(env).with_fs(fs);\n\n        let actual_retry_config = super::default_provider()\n            .configure(&provider_config)\n            .retry_config()\n            .await;\n\n        let expected_retry_config = RetryConfig::standard().with_max_attempts(1);\n\n        assert_eq!(actual_retry_config, expected_retry_config)\n    }\n\n    #[tokio::test]\n    async fn test_env_retry_config_takes_precedence_over_profile_retry_config() {\n        let env = Env::from_slice(&[\n            (\"AWS_CONFIG_FILE\", \"config\"),\n            (\"AWS_MAX_ATTEMPTS\", \"42\"),\n            (\"AWS_RETRY_MODE\", \"standard\"),\n        ]);\n        // TODO(https://github.com/awslabs/aws-sdk-rust/issues/247) standard is the default mode;\n        // this test would be better if it was setting it to adaptive mode\n        // adaptive mode is currently unsupported so that would panic\n        let fs = Fs::from_slice(&[(\n            \"config\",\n            // If the lines with the vars have preceding spaces, they don't get read\n            r#\"[default]\nmax_attempts = 88\nretry_mode = standard\n            \"#,\n        )]);\n\n        let provider_config = ProviderConfig::no_configuration().with_env(env).with_fs(fs);\n\n        let actual_retry_config = super::default_provider()\n            .configure(&provider_config)\n            .retry_config()\n            .await;\n\n        let expected_retry_config = RetryConfig::standard().with_max_attempts(42);\n\n        assert_eq!(actual_retry_config, expected_retry_config)\n    }\n\n    #[tokio::test]\n    #[should_panic = \"failed to parse max attempts. source: global profile (`default`) key: `max_attempts`: invalid digit found in string\"]\n    async fn test_invalid_profile_retry_config_panics() {\n        let env = Env::from_slice(&[(\"AWS_CONFIG_FILE\", \"config\")]);\n        let fs = Fs::from_slice(&[(\n            \"config\",\n            // If the lines with the vars have preceding spaces, they don't get read\n            r#\"[default]\nmax_attempts = potato\n            \"#,\n        )]);\n\n        let provider_config = ProviderConfig::no_configuration().with_env(env).with_fs(fs);\n\n        let _ = super::default_provider()\n            .configure(&provider_config)\n            .retry_config()\n            .await;\n    }\n\n    #[tokio::test]\n    async fn defaults() {\n        let built = test_provider(&[]).await.unwrap();\n\n        assert_eq!(built.mode(), RetryMode::Standard);\n        assert_eq!(built.max_attempts(), 3);\n    }\n\n    #[tokio::test]\n    async fn max_attempts_is_read_correctly() {\n        assert_eq!(\n            test_provider(&[(env::MAX_ATTEMPTS, \"88\")]).await.unwrap(),\n            RetryConfig::standard().with_max_attempts(88)\n        );\n    }\n\n    #[tokio::test]\n    async fn max_attempts_errors_when_it_cant_be_parsed_as_an_integer() {\n        assert!(matches!(\n            test_provider(&[(env::MAX_ATTEMPTS, \"not an integer\")])\n                .await\n                .unwrap_err()\n                .err(),\n            RetryConfigError {\n                kind: RetryConfigErrorKind::FailedToParseMaxAttempts { .. }\n            }\n        ));\n    }\n\n    #[tokio::test]\n    async fn retry_mode_is_read_correctly() {\n        assert_eq!(\n            test_provider(&[(env::RETRY_MODE, \"standard\")])\n                .await\n                .unwrap(),\n            RetryConfig::standard()\n        );\n    }\n\n    #[tokio::test]\n    async fn both_fields_can_be_set_at_once() {\n        assert_eq!(\n            test_provider(&[(env::RETRY_MODE, \"standard\"), (env::MAX_ATTEMPTS, \"13\")])\n                .await\n                .unwrap(),\n            RetryConfig::standard().with_max_attempts(13)\n        );\n    }\n\n    #[tokio::test]\n    async fn disallow_zero_max_attempts() {\n        let err = test_provider(&[(env::MAX_ATTEMPTS, \"0\")])\n            .await\n            .unwrap_err();\n        let err = err.err();\n        assert!(matches!(\n            err,\n            RetryConfigError {\n                kind: RetryConfigErrorKind::MaxAttemptsMustNotBeZero { .. }\n            }\n        ));\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/src/default_provider/sigv4a_signing_region_set.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::provider_config::ProviderConfig;\nuse aws_runtime::env_config::EnvConfigValue;\nuse aws_smithy_types::error::display::DisplayErrorContext;\nuse aws_types::region::SigningRegionSet;\nuse std::fmt;\n\nmod env {\n    pub(super) const SIGV4A_SIGNING_REGION_SET: &str = \"AWS_SIGV4A_SIGNING_REGION_SET\";\n}\n\nmod profile_key {\n    pub(super) const SIGV4A_SIGNING_REGION_SET: &str = \"sigv4a_signing_region_set\";\n}\n\n/// Load the value for the SigV4a signing region set.\n///\n/// Checks `AWS_SIGV4A_SIGNING_REGION_SET` env var, then `sigv4a_signing_region_set` profile key.\n/// The value is a comma-delimited list of region names.\npub(crate) async fn sigv4a_signing_region_set_provider(\n    provider_config: &ProviderConfig,\n) -> Option<SigningRegionSet> {\n    let env = provider_config.env();\n    let profiles = provider_config.profile().await;\n\n    EnvConfigValue::new()\n        .env(env::SIGV4A_SIGNING_REGION_SET)\n        .profile(profile_key::SIGV4A_SIGNING_REGION_SET)\n        .validate(&env, profiles, parse_signing_region_set)\n        .map_err(|err| {\n            tracing::warn!(\n                err = %DisplayErrorContext(&err),\n                \"invalid value for sigv4a signing region set\"\n            )\n        })\n        .unwrap_or(None)\n}\n\nfn parse_signing_region_set(csv: &str) -> Result<SigningRegionSet, InvalidSigningRegionSet> {\n    let region_set: SigningRegionSet = csv\n        .split(',')\n        .map(|s| s.trim())\n        .filter(|s| !s.is_empty())\n        .collect();\n    if region_set.as_ref().is_empty() {\n        return Err(InvalidSigningRegionSet {\n            value: format!(\"Empty value in `{csv}`.\"),\n        });\n    }\n    Ok(region_set)\n}\n\n#[derive(Debug)]\nstruct InvalidSigningRegionSet {\n    value: String,\n}\n\nimpl fmt::Display for InvalidSigningRegionSet {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        write!(f, \"Not a valid signing region set: {}\", self.value)\n    }\n}\n\nimpl std::error::Error for InvalidSigningRegionSet {}\n\n#[cfg(test)]\nmod test {\n    use super::env;\n    use crate::{\n        default_provider::sigv4a_signing_region_set::sigv4a_signing_region_set_provider,\n        provider_config::ProviderConfig,\n    };\n    use aws_types::os_shim_internal::{Env, Fs};\n    use aws_types::region::SigningRegionSet;\n    use tracing_test::traced_test;\n\n    #[tokio::test]\n    async fn load_from_env_var() {\n        let conf = ProviderConfig::empty()\n            .with_env(Env::from_slice(&[(env::SIGV4A_SIGNING_REGION_SET, \"*\")]));\n        let result = sigv4a_signing_region_set_provider(&conf).await;\n        assert_eq!(result, Some(SigningRegionSet::from(\"*\")));\n    }\n\n    #[tokio::test]\n    async fn load_from_env_var_multi_region() {\n        let conf = ProviderConfig::empty().with_env(Env::from_slice(&[(\n            env::SIGV4A_SIGNING_REGION_SET,\n            \"us-east-1, eu-west-1\",\n        )]));\n        let result = sigv4a_signing_region_set_provider(&conf).await;\n        assert!(result.is_some());\n        assert_eq!(result.unwrap().as_ref(), \"us-east-1,eu-west-1\");\n    }\n\n    #[tokio::test]\n    async fn load_from_profile() {\n        let conf = ProviderConfig::empty()\n            .with_profile_config(\n                Some(\n                    #[allow(deprecated)]\n                    crate::profile::profile_file::ProfileFiles::builder()\n                        .with_file(\n                            #[allow(deprecated)]\n                            crate::profile::profile_file::ProfileFileKind::Config,\n                            \"conf\",\n                        )\n                        .build(),\n                ),\n                None,\n            )\n            .with_fs(Fs::from_slice(&[(\n                \"conf\",\n                \"[default]\\nsigv4a_signing_region_set = *\",\n            )]));\n        let result = sigv4a_signing_region_set_provider(&conf).await;\n        assert_eq!(result, Some(SigningRegionSet::from(\"*\")));\n    }\n\n    #[tokio::test]\n    async fn env_var_wins_over_profile() {\n        let conf = ProviderConfig::empty()\n            .with_env(Env::from_slice(&[(\n                env::SIGV4A_SIGNING_REGION_SET,\n                \"us-east-1\",\n            )]))\n            .with_profile_config(\n                Some(\n                    #[allow(deprecated)]\n                    crate::profile::profile_file::ProfileFiles::builder()\n                        .with_file(\n                            #[allow(deprecated)]\n                            crate::profile::profile_file::ProfileFileKind::Config,\n                            \"conf\",\n                        )\n                        .build(),\n                ),\n                None,\n            )\n            .with_fs(Fs::from_slice(&[(\n                \"conf\",\n                \"[default]\\nsigv4a_signing_region_set = *\",\n            )]));\n        let result = sigv4a_signing_region_set_provider(&conf).await;\n        assert_eq!(result, Some(SigningRegionSet::from(\"us-east-1\")));\n    }\n\n    #[tokio::test]\n    async fn returns_none_when_not_configured() {\n        let conf = ProviderConfig::empty();\n        let result = sigv4a_signing_region_set_provider(&conf).await;\n        assert_eq!(result, None);\n    }\n\n    #[tokio::test]\n    #[traced_test]\n    async fn log_error_on_empty_value() {\n        let conf = ProviderConfig::empty()\n            .with_env(Env::from_slice(&[(env::SIGV4A_SIGNING_REGION_SET, \"\")]));\n        let result = sigv4a_signing_region_set_provider(&conf).await;\n        assert_eq!(result, None);\n        assert!(logs_contain(\"invalid value for sigv4a signing region set\"));\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/src/default_provider/timeout_config.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::provider_config::ProviderConfig;\nuse aws_smithy_types::timeout::TimeoutConfig;\nuse std::time::Duration;\n\nconst SDK_DEFAULT_CONNECT_TIMEOUT: Duration = Duration::from_millis(3100);\n\n/// Default [`TimeoutConfig`] provider chain\n///\n/// Unlike other credentials and region, [`TimeoutConfig`] has no related `TimeoutConfigProvider` trait. Instead,\n/// a builder struct is returned which has a similar API.\n///\npub fn default_provider() -> Builder {\n    Builder::default()\n}\n\n/// Builder for [`TimeoutConfig`] that resolves the default timeout configuration\n#[non_exhaustive]\n#[derive(Debug, Default)]\npub struct Builder;\n\nimpl Builder {\n    /// Configure the default chain\n    ///\n    /// Exposed for overriding the environment when unit-testing providers\n    pub fn configure(self, _configuration: &ProviderConfig) -> Self {\n        self\n    }\n\n    /// Resolve default timeout configuration\n    pub async fn timeout_config(self) -> TimeoutConfig {\n        // TODO(https://github.com/smithy-lang/smithy-rs/issues/1732): Implement complete timeout defaults specification\n        TimeoutConfig::builder()\n            .connect_timeout(SDK_DEFAULT_CONNECT_TIMEOUT)\n            .build()\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/src/default_provider/token.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::{\n    meta::{region::ProvideRegion, token::TokenProviderChain},\n    provider_config::ProviderConfig,\n};\nuse aws_credential_types::provider::{future, token::ProvideToken};\n\n/// Default access token provider chain\n///\n/// The region from the default region provider will be used\npub async fn default_provider() -> impl ProvideToken {\n    DefaultTokenChain::builder().build().await\n}\n\n/// Default access token provider chain\n///\n/// Currently, the default chain only examines the shared config\n/// (`~/.aws/config`) file and the SSO token cache to resolve an\n/// access token.\n///\n/// The AWS CLI can be used to retrieve the initial access token into\n/// the SSO token cache. Once it's there, the SDK can refresh automatically\n/// long as the it remains refreshable (it will eventually expire).\n///\n/// # Examples\n/// Create a default chain with a custom region:\n/// ```no_run\n/// use aws_types::region::Region;\n/// use aws_config::default_provider::token::DefaultTokenChain;\n/// let token_provider = DefaultTokenChain::builder()\n///     .region(Region::new(\"us-west-1\"))\n///     .build();\n/// ```\n///\n/// Create a default chain with no overrides:\n/// ```no_run\n/// use aws_config::default_provider::token::DefaultTokenChain;\n/// let token_provider = DefaultTokenChain::builder().build();\n/// ```\n///\n/// Create a default chain that uses a different profile:\n/// ```no_run\n/// use aws_config::default_provider::token::DefaultTokenChain;\n/// let token_provider = DefaultTokenChain::builder()\n///     .profile_name(\"otherprofile\")\n///     .build();\n/// ```\n#[derive(Debug)]\npub struct DefaultTokenChain {\n    provider_chain: TokenProviderChain,\n}\n\nimpl DefaultTokenChain {\n    /// Builder for `DefaultTokenChain`.\n    pub fn builder() -> Builder {\n        Builder::default()\n    }\n}\n\nimpl ProvideToken for DefaultTokenChain {\n    fn provide_token<'a>(&'a self) -> future::ProvideToken<'a>\n    where\n        Self: 'a,\n    {\n        self.provider_chain.provide_token()\n    }\n}\n\n/// Builder for [`DefaultTokenChain`].\n#[derive(Debug, Default)]\npub struct Builder {\n    profile_file_builder: crate::profile::token::Builder,\n    region_override: Option<Box<dyn ProvideRegion>>,\n    region_chain: crate::default_provider::region::Builder,\n    conf: Option<ProviderConfig>,\n}\n\nimpl Builder {\n    /// Sets the region used when making requests to AWS services\n    ///\n    /// When unset, the default region resolver chain will be used.\n    pub fn region(mut self, region: impl ProvideRegion + 'static) -> Self {\n        self.set_region(Some(region));\n        self\n    }\n\n    /// Sets the region used when making requests to AWS services\n    ///\n    /// When unset, the default region resolver chain will be used.\n    pub fn set_region(&mut self, region: Option<impl ProvideRegion + 'static>) -> &mut Self {\n        self.region_override = region.map(|provider| Box::new(provider) as _);\n        self\n    }\n\n    /// Override the profile name used by this provider\n    ///\n    /// When unset, the value of the `AWS_PROFILE` environment variable will be used.\n    pub fn profile_name(mut self, name: &str) -> Self {\n        self.profile_file_builder = self.profile_file_builder.profile_name(name);\n        self.region_chain = self.region_chain.profile_name(name);\n        self\n    }\n\n    /// Override the configuration used for this provider\n    pub(crate) fn configure(mut self, config: ProviderConfig) -> Self {\n        self.region_chain = self.region_chain.configure(&config);\n        self.conf = Some(config);\n        self\n    }\n\n    /// Creates a [`DefaultTokenChain`].\n    pub async fn build(self) -> DefaultTokenChain {\n        let region = match self.region_override {\n            Some(provider) => provider.region().await,\n            None => self.region_chain.build().region().await,\n        };\n        let conf = self.conf.unwrap_or_default().with_region(region);\n\n        let provider_chain = TokenProviderChain::first_try(\n            \"Profile\",\n            self.profile_file_builder.configure(&conf).build(),\n        );\n        DefaultTokenChain { provider_chain }\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/src/default_provider/use_dual_stack.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::environment::parse_bool;\nuse crate::provider_config::ProviderConfig;\nuse aws_runtime::env_config::EnvConfigValue;\nuse aws_smithy_types::error::display::DisplayErrorContext;\n\nmod env {\n    pub(super) const USE_DUAL_STACK: &str = \"AWS_USE_DUALSTACK_ENDPOINT\";\n}\n\nmod profile_key {\n    pub(super) const USE_DUAL_STACK: &str = \"use_dualstack_endpoint\";\n}\n\n/// Load the value for \"use dual-stack\"\n///\n/// This checks the following sources:\n/// 1. The environment variable `AWS_USE_DUALSTACK_ENDPOINT=true/false`\n/// 2. The profile key `use_dualstack_endpoint=true/false`\n///\n/// If invalid values are found, the provider will return `None` and an error will be logged.\npub async fn use_dual_stack_provider(provider_config: &ProviderConfig) -> Option<bool> {\n    let env = provider_config.env();\n    let profiles = provider_config.profile().await;\n\n    EnvConfigValue::new()\n        .env(env::USE_DUAL_STACK)\n        .profile(profile_key::USE_DUAL_STACK)\n        .validate(&env, profiles, parse_bool)\n        .map_err(\n            |err| tracing::warn!(err = %DisplayErrorContext(&err), \"invalid value for dual-stack setting\"),\n        )\n        .unwrap_or(None)\n}\n\n#[cfg(test)]\nmod test {\n    use crate::default_provider::use_dual_stack::use_dual_stack_provider;\n    #[allow(deprecated)]\n    use crate::profile::profile_file::{ProfileFileKind, ProfileFiles};\n    use crate::provider_config::ProviderConfig;\n    use aws_types::os_shim_internal::{Env, Fs};\n    use tracing_test::traced_test;\n\n    #[tokio::test]\n    #[traced_test]\n    async fn log_error_on_invalid_value() {\n        let conf = ProviderConfig::empty().with_env(Env::from_slice(&[(\n            \"AWS_USE_DUALSTACK_ENDPOINT\",\n            \"not-a-boolean\",\n        )]));\n        assert_eq!(use_dual_stack_provider(&conf).await, None);\n        assert!(logs_contain(\"invalid value for dual-stack setting\"));\n        assert!(logs_contain(\"AWS_USE_DUALSTACK_ENDPOINT\"));\n    }\n\n    #[tokio::test]\n    #[traced_test]\n    async fn environment_priority() {\n        let conf = ProviderConfig::empty()\n            .with_env(Env::from_slice(&[(\"AWS_USE_DUALSTACK_ENDPOINT\", \"TRUE\")]))\n            .with_profile_config(\n                Some(\n                    #[allow(deprecated)]\n                    ProfileFiles::builder()\n                        .with_file(\n                            #[allow(deprecated)]\n                            ProfileFileKind::Config,\n                            \"conf\",\n                        )\n                        .build(),\n                ),\n                None,\n            )\n            .with_fs(Fs::from_slice(&[(\n                \"conf\",\n                \"[default]\\nuse_dualstack_endpoint = false\",\n            )]));\n        assert_eq!(use_dual_stack_provider(&conf).await, Some(true));\n    }\n\n    #[tokio::test]\n    #[traced_test]\n    async fn profile_works() {\n        let conf = ProviderConfig::empty()\n            .with_profile_config(\n                Some(\n                    #[allow(deprecated)]\n                    ProfileFiles::builder()\n                        .with_file(\n                            #[allow(deprecated)]\n                            ProfileFileKind::Config,\n                            \"conf\",\n                        )\n                        .build(),\n                ),\n                None,\n            )\n            .with_fs(Fs::from_slice(&[(\n                \"conf\",\n                \"[default]\\nuse_dualstack_endpoint = false\",\n            )]));\n        assert_eq!(use_dual_stack_provider(&conf).await, Some(false));\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/src/default_provider/use_fips.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::environment::parse_bool;\nuse crate::provider_config::ProviderConfig;\nuse aws_runtime::env_config::EnvConfigValue;\nuse aws_smithy_types::error::display::DisplayErrorContext;\n\nmod env {\n    pub(super) const USE_FIPS: &str = \"AWS_USE_FIPS_ENDPOINT\";\n}\n\nmod profile_key {\n    pub(super) const USE_FIPS: &str = \"use_fips_endpoint\";\n}\n\n/// Load the value for \"use FIPS\"\n///\n/// This checks the following sources:\n/// 1. The environment variable `AWS_USE_FIPS_ENDPOINT=true/false`\n/// 2. The profile key `use_fips_endpoint=true/false`\n///\n/// If invalid values are found, the provider will return None and an error will be logged.\npub async fn use_fips_provider(provider_config: &ProviderConfig) -> Option<bool> {\n    let env = provider_config.env();\n    let profiles = provider_config.profile().await;\n\n    EnvConfigValue::new()\n        .env(env::USE_FIPS)\n        .profile(profile_key::USE_FIPS)\n        .validate(&env, profiles, parse_bool)\n        .map_err(\n            |err| tracing::warn!(err = %DisplayErrorContext(&err), \"invalid value for FIPS setting\"),\n        )\n        .unwrap_or(None)\n}\n\n#[cfg(test)]\nmod test {\n    use crate::default_provider::use_fips::use_fips_provider;\n    #[allow(deprecated)]\n    use crate::profile::profile_file::{ProfileFileKind, ProfileFiles};\n    use crate::provider_config::ProviderConfig;\n    use aws_types::os_shim_internal::{Env, Fs};\n    use tracing_test::traced_test;\n\n    #[tokio::test]\n    #[traced_test]\n    async fn log_error_on_invalid_value() {\n        let conf = ProviderConfig::empty().with_env(Env::from_slice(&[(\n            \"AWS_USE_FIPS_ENDPOINT\",\n            \"not-a-boolean\",\n        )]));\n        assert_eq!(use_fips_provider(&conf).await, None);\n        assert!(logs_contain(\"invalid value for FIPS setting\"));\n        assert!(logs_contain(\"AWS_USE_FIPS_ENDPOINT\"));\n    }\n\n    #[tokio::test]\n    #[traced_test]\n    async fn environment_priority() {\n        let conf = ProviderConfig::empty()\n            .with_env(Env::from_slice(&[(\"AWS_USE_FIPS_ENDPOINT\", \"TRUE\")]))\n            .with_profile_config(\n                Some(\n                    #[allow(deprecated)]\n                    ProfileFiles::builder()\n                        .with_file(\n                            #[allow(deprecated)]\n                            ProfileFileKind::Config,\n                            \"conf\",\n                        )\n                        .build(),\n                ),\n                None,\n            )\n            .with_fs(Fs::from_slice(&[(\n                \"conf\",\n                \"[default]\\nuse_fips_endpoint = false\",\n            )]));\n        assert_eq!(use_fips_provider(&conf).await, Some(true));\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/src/default_provider.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Providers that implement the default AWS provider chain\n//!\n//! Default Provider chains for [`region`], [`credentials`],\n//! [retries](crate::default_provider::retry_config), [timeouts](crate::default_provider::timeout_config) and\n//! [app name](crate::default_provider::app_name).\n//!\n//! Typically, this module is used via [`load_from_env`](crate::load_from_env) or [`from_env`](crate::from_env). It should only be used directly\n//! if you need to set custom configuration options to override the default resolution chain.\n\n/// Default [region](aws_types::region::Region) provider chain\n///\n/// Typically, this module is used via [`load_from_env`](crate::load_from_env) or [`from_env`](crate::from_env). It should only be used directly\n/// if you need to set custom configuration options to override the default resolution chain.\npub mod region;\n\n/// Default retry behavior configuration provider chain\n///\n/// Typically, this module is used via [`load_from_env`](crate::load_from_env) or [`from_env`](crate::from_env). It should only be used directly\n/// if you need to set custom configuration options to override the default resolution chain.\npub mod retry_config;\n\n/// Default app name provider chain\n///\n/// Typically, this module is used via [`load_from_env`](crate::load_from_env) or [`from_env`](crate::from_env). It should only be used directly\n/// if you need to set custom configuration options to override the default resolution chain.\npub mod app_name;\n\n/// Default timeout configuration provider chain\n///\n/// Typically, this module is used via [`load_from_env`](crate::load_from_env) or [`from_env`](crate::from_env). It should only be used directly\n/// if you need to set custom configuration options to override the default resolution chain.\npub mod timeout_config;\n\n/// Default credentials provider chain\n///\n/// Typically, this module is used via [`load_from_env`](crate::load_from_env) or [`from_env`](crate::from_env). It should only be used directly\n/// if you need to set custom configuration options like [`region`](credentials::Builder::region) or [`profile_name`](credentials::Builder::profile_name).\npub mod credentials;\n\n/// Default FIPS provider chain\npub mod use_fips;\n\n/// Default dual-stack provider chain\npub mod use_dual_stack;\n\n/// Default access token provider chain\n#[cfg(feature = \"sso\")]\npub mod token;\n\n/// Default \"ignore configured endpoint URLs\" provider chain\npub mod ignore_configured_endpoint_urls;\n\n/// Default endpoint URL provider chain\npub mod endpoint_url;\n\n/// Default \"disable request compression\" provider chain\npub mod disable_request_compression;\n\n/// Default \"request minimum compression size bytes\" provider chain\npub mod request_min_compression_size_bytes;\n\n/// Default provider chains for request/response checksum configuration\npub mod checksums;\n\n/// Default provider chain for account-based endpoint mode\npub mod account_id_endpoint_mode;\n\n/// Default provider chain for auth scheme preference list\npub mod auth_scheme_preference;\n\n/// Default provider chain for SigV4a signing region set\npub(crate) mod sigv4a_signing_region_set;\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/src/ecs.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Ecs Credentials Provider\n//!\n//! This credential provider is frequently used with an AWS-provided credentials service (e.g.\n//! [IAM Roles for tasks](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-iam-roles.html)).\n//! However, it's possible to use environment variables to configure this provider to use your own\n//! credentials sources.\n//!\n//! This provider is part of the [default credentials chain](crate::default_provider::credentials).\n//!\n//! ## Configuration\n//! **First**: It will check the value of `$AWS_CONTAINER_CREDENTIALS_RELATIVE_URI`. It will use this\n//! to construct a URI rooted at `http://169.254.170.2`. For example, if the value of the environment\n//! variable was `/credentials`, the SDK would look for credentials at `http://169.254.170.2/credentials`.\n//!\n//! **Next**: It will check the value of `$AWS_CONTAINER_CREDENTIALS_FULL_URI`. This specifies the full\n//! URL to load credentials. The URL MUST satisfy one of the following three properties:\n//! 1. The URL begins with `https`\n//! 2. The URL refers to an allowed IP address. If a URL contains a domain name instead of an IP address,\n//!    a DNS lookup will be performed. ALL resolved IP addresses MUST refer to an allowed IP address, or\n//!    the credentials provider will return `CredentialsError::InvalidConfiguration`. Valid IP addresses are:\n//!    a) Loopback interfaces\n//!    b) The [ECS Task Metadata V2](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-metadata-endpoint-v2.html)\n//!    address ie 169.254.170.2.\n//!    c) [EKS Pod Identity](https://docs.aws.amazon.com/eks/latest/userguide/pod-identities.html) addresses\n//!    ie 169.254.170.23 or fd00:ec2::23\n//!\n//! **Next**: It will check the value of `$AWS_CONTAINER_AUTHORIZATION_TOKEN_FILE`. If this is set,\n//! the filename specified will be read, and the value passed in the `Authorization` header. If the file\n//! cannot be read, an error is returned.\n//!\n//! **Finally**: It will check the value of `$AWS_CONTAINER_AUTHORIZATION_TOKEN`. If this is set, the\n//! value will be passed in the `Authorization` header.\n//!\n//! ## Credentials Format\n//! Credentials MUST be returned in a JSON format:\n//! ```json\n//! {\n//!    \"AccessKeyId\" : \"MUA...\",\n//!    \"SecretAccessKey\" : \"/7PC5om....\",\n//!    \"Token\" : \"AQoDY....=\",\n//!    \"Expiration\" : \"2016-02-25T06:03:31Z\"\n//!  }\n//! ```\n//!\n//! Credentials errors MAY be returned with a `code` and `message` field:\n//! ```json\n//! {\n//!   \"code\": \"ErrorCode\",\n//!   \"message\": \"Helpful error message.\"\n//! }\n//! ```\n\nuse crate::http_credential_provider::HttpCredentialProvider;\nuse crate::provider_config::ProviderConfig;\nuse aws_credential_types::provider::{self, error::CredentialsError, future, ProvideCredentials};\nuse aws_smithy_http::endpoint::apply_endpoint;\nuse aws_smithy_runtime_api::client::dns::{ResolveDns, ResolveDnsError, SharedDnsResolver};\nuse aws_smithy_runtime_api::client::http::HttpConnectorSettings;\nuse aws_smithy_runtime_api::shared::IntoShared;\nuse aws_smithy_types::error::display::DisplayErrorContext;\nuse aws_types::os_shim_internal::{Env, Fs};\nuse http::header::InvalidHeaderValue;\nuse http::uri::{InvalidUri, PathAndQuery, Scheme};\nuse http::{HeaderValue, Uri};\nuse std::error::Error;\nuse std::fmt::{Display, Formatter};\nuse std::net::{IpAddr, Ipv4Addr, Ipv6Addr};\nuse std::time::Duration;\nuse tokio::sync::OnceCell;\n\nconst DEFAULT_READ_TIMEOUT: Duration = Duration::from_secs(5);\nconst DEFAULT_CONNECT_TIMEOUT: Duration = Duration::from_secs(2);\n\n// URL from https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-metadata-endpoint-v2.html\nconst BASE_HOST: &str = \"http://169.254.170.2\";\nconst ENV_RELATIVE_URI: &str = \"AWS_CONTAINER_CREDENTIALS_RELATIVE_URI\";\nconst ENV_FULL_URI: &str = \"AWS_CONTAINER_CREDENTIALS_FULL_URI\";\nconst ENV_AUTHORIZATION_TOKEN: &str = \"AWS_CONTAINER_AUTHORIZATION_TOKEN\";\nconst ENV_AUTHORIZATION_TOKEN_FILE: &str = \"AWS_CONTAINER_AUTHORIZATION_TOKEN_FILE\";\n\n/// Credential provider for ECS and generalized HTTP credentials\n///\n/// See the [module](crate::ecs) documentation for more details.\n///\n/// This credential provider is part of the default chain.\n#[derive(Debug)]\npub struct EcsCredentialsProvider {\n    inner: OnceCell<Provider>,\n    env: Env,\n    fs: Fs,\n    builder: Builder,\n}\n\nimpl EcsCredentialsProvider {\n    /// Builder for [`EcsCredentialsProvider`]\n    pub fn builder() -> Builder {\n        Builder::default()\n    }\n\n    /// Load credentials from this credentials provider\n    pub async fn credentials(&self) -> provider::Result {\n        let env_token_file = self.env.get(ENV_AUTHORIZATION_TOKEN_FILE).ok();\n        let env_token = self.env.get(ENV_AUTHORIZATION_TOKEN).ok();\n        let auth = if let Some(auth_token_file) = env_token_file {\n            let auth = self\n                .fs\n                .read_to_end(auth_token_file)\n                .await\n                .map_err(CredentialsError::provider_error)?;\n            Some(HeaderValue::from_bytes(auth.as_slice()).map_err(|err| {\n                let auth_token = String::from_utf8_lossy(auth.as_slice()).to_string();\n                tracing::warn!(token = %auth_token, \"invalid auth token\");\n                CredentialsError::invalid_configuration(EcsConfigurationError::InvalidAuthToken {\n                    err,\n                    value: auth_token,\n                })\n            })?)\n        } else if let Some(auth_token) = env_token {\n            Some(HeaderValue::from_str(&auth_token).map_err(|err| {\n                tracing::warn!(token = %auth_token, \"invalid auth token\");\n                CredentialsError::invalid_configuration(EcsConfigurationError::InvalidAuthToken {\n                    err,\n                    value: auth_token,\n                })\n            })?)\n        } else {\n            None\n        };\n        match self.provider().await {\n            Provider::NotConfigured => {\n                Err(CredentialsError::not_loaded(\"ECS provider not configured\"))\n            }\n            Provider::InvalidConfiguration(err) => {\n                Err(CredentialsError::invalid_configuration(format!(\"{err}\")))\n            }\n            Provider::Configured(provider) => provider.credentials(auth).await,\n        }\n    }\n\n    async fn provider(&self) -> &Provider {\n        self.inner\n            .get_or_init(|| Provider::make(self.builder.clone()))\n            .await\n    }\n}\n\nimpl ProvideCredentials for EcsCredentialsProvider {\n    fn provide_credentials<'a>(&'a self) -> future::ProvideCredentials<'a>\n    where\n        Self: 'a,\n    {\n        future::ProvideCredentials::new(self.credentials())\n    }\n}\n\n/// Inner Provider that can record failed configuration state\n#[derive(Debug)]\n#[allow(clippy::large_enum_variant)]\nenum Provider {\n    Configured(HttpCredentialProvider),\n    NotConfigured,\n    InvalidConfiguration(EcsConfigurationError),\n}\n\nimpl Provider {\n    async fn uri(env: Env, dns: Option<SharedDnsResolver>) -> Result<Uri, EcsConfigurationError> {\n        let relative_uri = env.get(ENV_RELATIVE_URI).ok();\n        let full_uri = env.get(ENV_FULL_URI).ok();\n        if let Some(relative_uri) = relative_uri {\n            Self::build_full_uri(relative_uri)\n        } else if let Some(full_uri) = full_uri {\n            let dns = dns.or_else(default_dns);\n            validate_full_uri(&full_uri, dns)\n                .await\n                .map_err(|err| EcsConfigurationError::InvalidFullUri { err, uri: full_uri })\n        } else {\n            Err(EcsConfigurationError::NotConfigured)\n        }\n    }\n\n    async fn make(builder: Builder) -> Self {\n        let provider_config = builder.provider_config.unwrap_or_default();\n        let env = provider_config.env();\n        let uri = match Self::uri(env, builder.dns).await {\n            Ok(uri) => uri,\n            Err(EcsConfigurationError::NotConfigured) => return Provider::NotConfigured,\n            Err(err) => return Provider::InvalidConfiguration(err),\n        };\n        let path_and_query = match uri.path_and_query() {\n            Some(path_and_query) => path_and_query.to_string(),\n            None => uri.path().to_string(),\n        };\n        let endpoint = {\n            let mut parts = uri.into_parts();\n            parts.path_and_query = Some(PathAndQuery::from_static(\"/\"));\n            Uri::from_parts(parts)\n        }\n        .expect(\"parts will be valid\")\n        .to_string();\n\n        let http_provider = HttpCredentialProvider::builder()\n            .configure(&provider_config)\n            .http_connector_settings(\n                HttpConnectorSettings::builder()\n                    .connect_timeout(DEFAULT_CONNECT_TIMEOUT)\n                    .read_timeout(DEFAULT_READ_TIMEOUT)\n                    .build(),\n            )\n            .build(\"EcsContainer\", &endpoint, path_and_query);\n        Provider::Configured(http_provider)\n    }\n\n    fn build_full_uri(relative_uri: String) -> Result<Uri, EcsConfigurationError> {\n        let mut relative_uri = match relative_uri.parse::<Uri>() {\n            Ok(uri) => uri,\n            Err(invalid_uri) => {\n                tracing::warn!(uri = %DisplayErrorContext(&invalid_uri), \"invalid URI loaded from environment\");\n                return Err(EcsConfigurationError::InvalidRelativeUri {\n                    err: invalid_uri,\n                    uri: relative_uri,\n                });\n            }\n        };\n        let endpoint = Uri::from_static(BASE_HOST);\n        apply_endpoint(&mut relative_uri, &endpoint, None)\n            .expect(\"appending relative URLs to the ECS endpoint should always succeed\");\n        Ok(relative_uri)\n    }\n}\n\n#[derive(Debug)]\nenum EcsConfigurationError {\n    InvalidRelativeUri {\n        err: InvalidUri,\n        uri: String,\n    },\n    InvalidFullUri {\n        err: InvalidFullUriError,\n        uri: String,\n    },\n    InvalidAuthToken {\n        err: InvalidHeaderValue,\n        value: String,\n    },\n    NotConfigured,\n}\n\nimpl Display for EcsConfigurationError {\n    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {\n        match self {\n            EcsConfigurationError::InvalidRelativeUri { err, uri } => {\n                write!(f, \"invalid relative URI for ECS provider ({err}): {uri}\",)\n            }\n            EcsConfigurationError::InvalidFullUri { err, uri } => {\n                write!(f, \"invalid full URI for ECS provider ({err}): {uri}\")\n            }\n            EcsConfigurationError::NotConfigured => write!(\n                f,\n                \"No environment variables were set to configure ECS provider\"\n            ),\n            EcsConfigurationError::InvalidAuthToken { err, value } => write!(\n                f,\n                \"`{value}` could not be used as a header value for the auth token. {err}\",\n            ),\n        }\n    }\n}\n\nimpl Error for EcsConfigurationError {\n    fn source(&self) -> Option<&(dyn Error + 'static)> {\n        match &self {\n            EcsConfigurationError::InvalidRelativeUri { err, .. } => Some(err),\n            EcsConfigurationError::InvalidFullUri { err, .. } => Some(err),\n            EcsConfigurationError::InvalidAuthToken { err, .. } => Some(err),\n            EcsConfigurationError::NotConfigured => None,\n        }\n    }\n}\n\n/// Builder for [`EcsCredentialsProvider`]\n#[derive(Default, Debug, Clone)]\npub struct Builder {\n    provider_config: Option<ProviderConfig>,\n    dns: Option<SharedDnsResolver>,\n    connect_timeout: Option<Duration>,\n    read_timeout: Option<Duration>,\n}\n\nimpl Builder {\n    /// Override the configuration used for this provider\n    pub fn configure(mut self, provider_config: &ProviderConfig) -> Self {\n        self.provider_config = Some(provider_config.clone());\n        self\n    }\n\n    /// Override the DNS resolver used to validate URIs\n    ///\n    /// URIs must refer to valid IP addresses as defined in the module documentation. The [`ResolveDns`]\n    /// implementation is used to retrieve IP addresses for a given domain.\n    pub fn dns(mut self, dns: impl ResolveDns + 'static) -> Self {\n        self.dns = Some(dns.into_shared());\n        self\n    }\n\n    /// Override the connect timeout for the HTTP client\n    ///\n    /// This value defaults to 2 seconds\n    pub fn connect_timeout(mut self, timeout: Duration) -> Self {\n        self.connect_timeout = Some(timeout);\n        self\n    }\n\n    /// Override the read timeout for the HTTP client\n    ///\n    /// This value defaults to 5 seconds\n    pub fn read_timeout(mut self, timeout: Duration) -> Self {\n        self.read_timeout = Some(timeout);\n        self\n    }\n\n    /// Create an [`EcsCredentialsProvider`] from this builder\n    pub fn build(self) -> EcsCredentialsProvider {\n        let env = self\n            .provider_config\n            .as_ref()\n            .map(|config| config.env())\n            .unwrap_or_default();\n        let fs = self\n            .provider_config\n            .as_ref()\n            .map(|config| config.fs())\n            .unwrap_or_default();\n        EcsCredentialsProvider {\n            inner: OnceCell::new(),\n            env,\n            fs,\n            builder: self,\n        }\n    }\n}\n\n#[derive(Debug)]\nenum InvalidFullUriErrorKind {\n    /// The provided URI could not be parsed as a URI\n    #[non_exhaustive]\n    InvalidUri(InvalidUri),\n\n    /// No Dns resolver was provided\n    #[non_exhaustive]\n    NoDnsResolver,\n\n    /// The URI did not specify a host\n    #[non_exhaustive]\n    MissingHost,\n\n    /// The URI did not refer to an allowed IP address\n    #[non_exhaustive]\n    DisallowedIP,\n\n    /// DNS lookup failed when attempting to resolve the host to an IP Address for validation.\n    DnsLookupFailed(ResolveDnsError),\n}\n\n/// Invalid Full URI\n///\n/// When the full URI setting is used, the URI must either be HTTPS, point to a loopback interface,\n/// or point to known ECS/EKS container IPs.\n#[derive(Debug)]\npub struct InvalidFullUriError {\n    kind: InvalidFullUriErrorKind,\n}\n\nimpl Display for InvalidFullUriError {\n    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {\n        use InvalidFullUriErrorKind::*;\n        match self.kind {\n            InvalidUri(_) => write!(f, \"URI was invalid\"),\n            MissingHost => write!(f, \"URI did not specify a host\"),\n            DisallowedIP => {\n                write!(f, \"URI did not refer to an allowed IP address\")\n            }\n            DnsLookupFailed(_) => {\n                write!(\n                    f,\n                    \"failed to perform DNS lookup while validating URI\"\n                )\n            }\n            NoDnsResolver => write!(f, \"no DNS resolver was provided. Enable `rt-tokio` or provide a `dns` resolver to the builder.\")\n        }\n    }\n}\n\nimpl Error for InvalidFullUriError {\n    fn source(&self) -> Option<&(dyn Error + 'static)> {\n        use InvalidFullUriErrorKind::*;\n        match &self.kind {\n            InvalidUri(err) => Some(err),\n            DnsLookupFailed(err) => Some(err as _),\n            _ => None,\n        }\n    }\n}\n\nimpl From<InvalidFullUriErrorKind> for InvalidFullUriError {\n    fn from(kind: InvalidFullUriErrorKind) -> Self {\n        Self { kind }\n    }\n}\n\n/// Validate that `uri` is valid to be used as a full provider URI\n/// Either:\n/// 1. The URL is uses `https`\n/// 2. The URL refers to an allowed IP. If a URL contains a domain name instead of an IP address,\n///    a DNS lookup will be performed. ALL resolved IP addresses MUST refer to an allowed IP, or\n///    the credentials provider will return `CredentialsError::InvalidConfiguration`. Allowed IPs\n///    are the loopback interfaces, and the known ECS/EKS container IPs.\nasync fn validate_full_uri(\n    uri: &str,\n    dns: Option<SharedDnsResolver>,\n) -> Result<Uri, InvalidFullUriError> {\n    let uri = uri\n        .parse::<Uri>()\n        .map_err(InvalidFullUriErrorKind::InvalidUri)?;\n    if uri.scheme() == Some(&Scheme::HTTPS) {\n        return Ok(uri);\n    }\n    // For HTTP URIs, we need to validate that it points to a valid IP\n    let host = uri.host().ok_or(InvalidFullUriErrorKind::MissingHost)?;\n    let maybe_ip = if host.starts_with('[') && host.ends_with(']') {\n        host[1..host.len() - 1].parse::<IpAddr>()\n    } else {\n        host.parse::<IpAddr>()\n    };\n    let is_allowed = match maybe_ip {\n        Ok(addr) => is_full_uri_ip_allowed(&addr),\n        Err(_domain_name) => {\n            let dns = dns.ok_or(InvalidFullUriErrorKind::NoDnsResolver)?;\n            dns.resolve_dns(host)\n                .await\n                .map_err(|err| InvalidFullUriErrorKind::DnsLookupFailed(ResolveDnsError::new(err)))?\n                .iter()\n                    .all(|addr| {\n                        if !is_full_uri_ip_allowed(addr) {\n                            tracing::warn!(\n                                addr = ?addr,\n                                \"HTTP credential provider cannot be used: Address does not resolve to an allowed IP.\"\n                            )\n                        };\n                        is_full_uri_ip_allowed(addr)\n                    })\n        }\n    };\n    match is_allowed {\n        true => Ok(uri),\n        false => Err(InvalidFullUriErrorKind::DisallowedIP.into()),\n    }\n}\n\n// \"169.254.170.2\"\nconst ECS_CONTAINER_IPV4: IpAddr = IpAddr::V4(Ipv4Addr::new(169, 254, 170, 2));\n\n// \"169.254.170.23\"\nconst EKS_CONTAINER_IPV4: IpAddr = IpAddr::V4(Ipv4Addr::new(169, 254, 170, 23));\n\n// \"fd00:ec2::23\"\nconst EKS_CONTAINER_IPV6: IpAddr = IpAddr::V6(Ipv6Addr::new(0xFD00, 0x0EC2, 0, 0, 0, 0, 0, 0x23));\nfn is_full_uri_ip_allowed(ip: &IpAddr) -> bool {\n    ip.is_loopback()\n        || ip.eq(&ECS_CONTAINER_IPV4)\n        || ip.eq(&EKS_CONTAINER_IPV4)\n        || ip.eq(&EKS_CONTAINER_IPV6)\n}\n\n/// Default DNS resolver impl\n///\n/// DNS resolution is required to validate that provided URIs point to a valid IP address\n#[cfg(any(not(feature = \"rt-tokio\"), target_family = \"wasm\"))]\nfn default_dns() -> Option<SharedDnsResolver> {\n    None\n}\n#[cfg(all(feature = \"rt-tokio\", not(target_family = \"wasm\")))]\nfn default_dns() -> Option<SharedDnsResolver> {\n    use aws_smithy_runtime::client::dns::TokioDnsResolver;\n    Some(TokioDnsResolver::new().into_shared())\n}\n\n#[cfg(test)]\nmod test {\n    use super::*;\n    use crate::provider_config::ProviderConfig;\n    use crate::test_case::{no_traffic_client, GenericTestResult};\n    use aws_credential_types::provider::ProvideCredentials;\n    use aws_credential_types::Credentials;\n    use aws_smithy_async::future::never::Never;\n    use aws_smithy_async::rt::sleep::TokioSleep;\n    use aws_smithy_http_client::test_util::{ReplayEvent, StaticReplayClient};\n    use aws_smithy_runtime_api::client::dns::DnsFuture;\n    use aws_smithy_runtime_api::client::http::HttpClient;\n    use aws_smithy_runtime_api::shared::IntoShared;\n    use aws_smithy_types::body::SdkBody;\n    use aws_types::os_shim_internal::Env;\n    use futures_util::FutureExt;\n    use http::header::AUTHORIZATION;\n    use http::Uri;\n    use serde::Deserialize;\n    use std::collections::HashMap;\n    use std::error::Error;\n    use std::ffi::OsString;\n    use std::net::IpAddr;\n    use std::time::{Duration, UNIX_EPOCH};\n    use tracing_test::traced_test;\n\n    fn provider(\n        env: Env,\n        fs: Fs,\n        http_client: impl HttpClient + 'static,\n    ) -> EcsCredentialsProvider {\n        let provider_config = ProviderConfig::empty()\n            .with_env(env)\n            .with_fs(fs)\n            .with_http_client(http_client)\n            .with_sleep_impl(TokioSleep::new());\n        Builder::default().configure(&provider_config).build()\n    }\n\n    #[derive(Deserialize)]\n    struct EcsUriTest {\n        env: HashMap<String, String>,\n        result: GenericTestResult<String>,\n    }\n\n    impl EcsUriTest {\n        async fn check(&self) {\n            let env = Env::from(self.env.clone());\n            let uri = Provider::uri(env, Some(TestDns::default().into_shared()))\n                .await\n                .map(|uri| uri.to_string());\n            self.result.assert_matches(uri.as_ref());\n        }\n    }\n\n    #[tokio::test]\n    async fn run_config_tests() -> Result<(), Box<dyn Error>> {\n        let test_cases = std::fs::read_to_string(\"test-data/ecs-tests.json\")?;\n        #[derive(Deserialize)]\n        struct TestCases {\n            tests: Vec<EcsUriTest>,\n        }\n\n        let test_cases: TestCases = serde_json::from_str(&test_cases)?;\n        let test_cases = test_cases.tests;\n        for test in test_cases {\n            test.check().await\n        }\n        Ok(())\n    }\n\n    #[test]\n    fn validate_uri_https() {\n        // over HTTPs, any URI is fine\n        let dns = Some(NeverDns.into_shared());\n        assert_eq!(\n            validate_full_uri(\"https://amazon.com\", None)\n                .now_or_never()\n                .unwrap()\n                .expect(\"valid\"),\n            Uri::from_static(\"https://amazon.com\")\n        );\n        // over HTTP, it will try to lookup\n        assert!(\n            validate_full_uri(\"http://amazon.com\", dns)\n                .now_or_never()\n                .is_none(),\n            \"DNS lookup should occur, but it will never return\"\n        );\n\n        let no_dns_error = validate_full_uri(\"http://amazon.com\", None)\n            .now_or_never()\n            .unwrap()\n            .expect_err(\"DNS service is required\");\n        assert!(\n            matches!(\n                no_dns_error,\n                InvalidFullUriError {\n                    kind: InvalidFullUriErrorKind::NoDnsResolver\n                }\n            ),\n            \"expected no dns service, got: {}\",\n            no_dns_error\n        );\n    }\n\n    #[test]\n    fn valid_uri_loopback() {\n        assert_eq!(\n            validate_full_uri(\"http://127.0.0.1:8080/get-credentials\", None)\n                .now_or_never()\n                .unwrap()\n                .expect(\"valid uri\"),\n            Uri::from_static(\"http://127.0.0.1:8080/get-credentials\")\n        );\n\n        let err = validate_full_uri(\"http://192.168.10.120/creds\", None)\n            .now_or_never()\n            .unwrap()\n            .expect_err(\"not a loopback\");\n        assert!(matches!(\n            err,\n            InvalidFullUriError {\n                kind: InvalidFullUriErrorKind::DisallowedIP\n            }\n        ));\n    }\n\n    #[test]\n    fn valid_uri_ecs_eks() {\n        assert_eq!(\n            validate_full_uri(\"http://169.254.170.2:8080/get-credentials\", None)\n                .now_or_never()\n                .unwrap()\n                .expect(\"valid uri\"),\n            Uri::from_static(\"http://169.254.170.2:8080/get-credentials\")\n        );\n        assert_eq!(\n            validate_full_uri(\"http://169.254.170.23:8080/get-credentials\", None)\n                .now_or_never()\n                .unwrap()\n                .expect(\"valid uri\"),\n            Uri::from_static(\"http://169.254.170.23:8080/get-credentials\")\n        );\n        assert_eq!(\n            validate_full_uri(\"http://[fd00:ec2::23]:8080/get-credentials\", None)\n                .now_or_never()\n                .unwrap()\n                .expect(\"valid uri\"),\n            Uri::from_static(\"http://[fd00:ec2::23]:8080/get-credentials\")\n        );\n\n        let err = validate_full_uri(\"http://169.254.171.23/creds\", None)\n            .now_or_never()\n            .unwrap()\n            .expect_err(\"not an ecs/eks container address\");\n        assert!(matches!(\n            err,\n            InvalidFullUriError {\n                kind: InvalidFullUriErrorKind::DisallowedIP\n            }\n        ));\n\n        let err = validate_full_uri(\"http://[fd00:ec2::2]/creds\", None)\n            .now_or_never()\n            .unwrap()\n            .expect_err(\"not an ecs/eks container address\");\n        assert!(matches!(\n            err,\n            InvalidFullUriError {\n                kind: InvalidFullUriErrorKind::DisallowedIP\n            }\n        ));\n    }\n\n    #[test]\n    fn all_addrs_local() {\n        let dns = Some(\n            TestDns::with_fallback(vec![\n                \"127.0.0.1\".parse().unwrap(),\n                \"127.0.0.2\".parse().unwrap(),\n                \"169.254.170.23\".parse().unwrap(),\n                \"fd00:ec2::23\".parse().unwrap(),\n            ])\n            .into_shared(),\n        );\n        let resp = validate_full_uri(\"http://localhost:8888\", dns)\n            .now_or_never()\n            .unwrap();\n        assert!(resp.is_ok(), \"Should be valid: {:?}\", resp);\n    }\n\n    #[test]\n    fn all_addrs_not_local() {\n        let dns = Some(\n            TestDns::with_fallback(vec![\n                \"127.0.0.1\".parse().unwrap(),\n                \"192.168.0.1\".parse().unwrap(),\n            ])\n            .into_shared(),\n        );\n        let resp = validate_full_uri(\"http://localhost:8888\", dns)\n            .now_or_never()\n            .unwrap();\n        assert!(\n            matches!(\n                resp,\n                Err(InvalidFullUriError {\n                    kind: InvalidFullUriErrorKind::DisallowedIP\n                })\n            ),\n            \"Should be invalid: {:?}\",\n            resp\n        );\n    }\n\n    fn creds_request(uri: &str, auth: Option<&str>) -> http::Request<SdkBody> {\n        let mut builder = http::Request::builder();\n        if let Some(auth) = auth {\n            builder = builder.header(AUTHORIZATION, auth);\n        }\n        builder.uri(uri).body(SdkBody::empty()).unwrap()\n    }\n\n    fn ok_creds_response() -> http::Response<SdkBody> {\n        http::Response::builder()\n            .status(200)\n            .body(SdkBody::from(\n                r#\" {\n                       \"AccessKeyId\" : \"AKID\",\n                       \"SecretAccessKey\" : \"SECRET\",\n                       \"Token\" : \"TOKEN....=\",\n                       \"AccountId\" : \"AID\",\n                       \"Expiration\" : \"2009-02-13T23:31:30Z\"\n                     }\"#,\n            ))\n            .unwrap()\n    }\n\n    #[track_caller]\n    fn assert_correct(creds: Credentials) {\n        assert_eq!(creds.access_key_id(), \"AKID\");\n        assert_eq!(creds.secret_access_key(), \"SECRET\");\n        assert_eq!(creds.account_id().unwrap().as_str(), \"AID\");\n        assert_eq!(creds.session_token().unwrap(), \"TOKEN....=\");\n        assert_eq!(\n            creds.expiry().unwrap(),\n            UNIX_EPOCH + Duration::from_secs(1234567890)\n        );\n    }\n\n    #[tokio::test]\n    async fn load_valid_creds_auth() {\n        let env = Env::from_slice(&[\n            (\"AWS_CONTAINER_CREDENTIALS_RELATIVE_URI\", \"/credentials\"),\n            (\"AWS_CONTAINER_AUTHORIZATION_TOKEN\", \"Basic password\"),\n        ]);\n        let http_client = StaticReplayClient::new(vec![ReplayEvent::new(\n            creds_request(\"http://169.254.170.2/credentials\", Some(\"Basic password\")),\n            ok_creds_response(),\n        )]);\n        let provider = provider(env, Fs::default(), http_client.clone());\n        let creds = provider\n            .provide_credentials()\n            .await\n            .expect(\"valid credentials\");\n        assert_correct(creds);\n        http_client.assert_requests_match(&[]);\n    }\n\n    #[tokio::test]\n    async fn load_valid_creds_auth_file() {\n        let env = Env::from_slice(&[\n            (\n                \"AWS_CONTAINER_CREDENTIALS_FULL_URI\",\n                \"http://169.254.170.23/v1/credentials\",\n            ),\n            (\n                \"AWS_CONTAINER_AUTHORIZATION_TOKEN_FILE\",\n                \"/var/run/secrets/pods.eks.amazonaws.com/serviceaccount/eks-pod-identity-token\",\n            ),\n        ]);\n        let fs = Fs::from_raw_map(HashMap::from([(\n            OsString::from(\n                \"/var/run/secrets/pods.eks.amazonaws.com/serviceaccount/eks-pod-identity-token\",\n            ),\n            \"Basic password\".into(),\n        )]));\n\n        let http_client = StaticReplayClient::new(vec![ReplayEvent::new(\n            creds_request(\n                \"http://169.254.170.23/v1/credentials\",\n                Some(\"Basic password\"),\n            ),\n            ok_creds_response(),\n        )]);\n        let provider = provider(env, fs, http_client.clone());\n        let creds = provider\n            .provide_credentials()\n            .await\n            .expect(\"valid credentials\");\n        assert_correct(creds);\n        http_client.assert_requests_match(&[]);\n    }\n\n    #[tokio::test]\n    async fn auth_file_precedence_over_env() {\n        let env = Env::from_slice(&[\n            (\n                \"AWS_CONTAINER_CREDENTIALS_FULL_URI\",\n                \"http://169.254.170.23/v1/credentials\",\n            ),\n            (\n                \"AWS_CONTAINER_AUTHORIZATION_TOKEN_FILE\",\n                \"/var/run/secrets/pods.eks.amazonaws.com/serviceaccount/eks-pod-identity-token\",\n            ),\n            (\"AWS_CONTAINER_AUTHORIZATION_TOKEN\", \"unused\"),\n        ]);\n        let fs = Fs::from_raw_map(HashMap::from([(\n            OsString::from(\n                \"/var/run/secrets/pods.eks.amazonaws.com/serviceaccount/eks-pod-identity-token\",\n            ),\n            \"Basic password\".into(),\n        )]));\n\n        let http_client = StaticReplayClient::new(vec![ReplayEvent::new(\n            creds_request(\n                \"http://169.254.170.23/v1/credentials\",\n                Some(\"Basic password\"),\n            ),\n            ok_creds_response(),\n        )]);\n        let provider = provider(env, fs, http_client.clone());\n        let creds = provider\n            .provide_credentials()\n            .await\n            .expect(\"valid credentials\");\n        assert_correct(creds);\n        http_client.assert_requests_match(&[]);\n    }\n\n    #[tokio::test]\n    async fn query_params_should_be_included_in_credentials_http_request() {\n        let env = Env::from_slice(&[\n            (\n                \"AWS_CONTAINER_CREDENTIALS_RELATIVE_URI\",\n                \"/my-credentials/?applicationName=test2024\",\n            ),\n            (\n                \"AWS_CONTAINER_AUTHORIZATION_TOKEN_FILE\",\n                \"/var/run/secrets/pods.eks.amazonaws.com/serviceaccount/eks-pod-identity-token\",\n            ),\n            (\"AWS_CONTAINER_AUTHORIZATION_TOKEN\", \"unused\"),\n        ]);\n        let fs = Fs::from_raw_map(HashMap::from([(\n            OsString::from(\n                \"/var/run/secrets/pods.eks.amazonaws.com/serviceaccount/eks-pod-identity-token\",\n            ),\n            \"Basic password\".into(),\n        )]));\n\n        let http_client = StaticReplayClient::new(vec![ReplayEvent::new(\n            creds_request(\n                \"http://169.254.170.2/my-credentials/?applicationName=test2024\",\n                Some(\"Basic password\"),\n            ),\n            ok_creds_response(),\n        )]);\n        let provider = provider(env, fs, http_client.clone());\n        let creds = provider\n            .provide_credentials()\n            .await\n            .expect(\"valid credentials\");\n        assert_correct(creds);\n        http_client.assert_requests_match(&[]);\n    }\n\n    #[tokio::test]\n    async fn fs_missing_file() {\n        let env = Env::from_slice(&[\n            (\n                \"AWS_CONTAINER_CREDENTIALS_FULL_URI\",\n                \"http://169.254.170.23/v1/credentials\",\n            ),\n            (\n                \"AWS_CONTAINER_AUTHORIZATION_TOKEN_FILE\",\n                \"/var/run/secrets/pods.eks.amazonaws.com/serviceaccount/eks-pod-identity-token\",\n            ),\n        ]);\n        let fs = Fs::from_raw_map(HashMap::new());\n\n        let provider = provider(env, fs, no_traffic_client());\n        let err = provider.credentials().await.expect_err(\"no JWT token file\");\n        match err {\n            CredentialsError::ProviderError { .. } => { /* ok */ }\n            _ => panic!(\"incorrect error variant\"),\n        }\n    }\n\n    #[tokio::test]\n    async fn retry_5xx() {\n        let env = Env::from_slice(&[(\"AWS_CONTAINER_CREDENTIALS_RELATIVE_URI\", \"/credentials\")]);\n        let http_client = StaticReplayClient::new(vec![\n            ReplayEvent::new(\n                creds_request(\"http://169.254.170.2/credentials\", None),\n                http::Response::builder()\n                    .status(500)\n                    .body(SdkBody::empty())\n                    .unwrap(),\n            ),\n            ReplayEvent::new(\n                creds_request(\"http://169.254.170.2/credentials\", None),\n                ok_creds_response(),\n            ),\n        ]);\n        tokio::time::pause();\n        let provider = provider(env, Fs::default(), http_client.clone());\n        let creds = provider\n            .provide_credentials()\n            .await\n            .expect(\"valid credentials\");\n        assert_correct(creds);\n    }\n\n    #[tokio::test]\n    async fn load_valid_creds_no_auth() {\n        let env = Env::from_slice(&[(\"AWS_CONTAINER_CREDENTIALS_RELATIVE_URI\", \"/credentials\")]);\n        let http_client = StaticReplayClient::new(vec![ReplayEvent::new(\n            creds_request(\"http://169.254.170.2/credentials\", None),\n            ok_creds_response(),\n        )]);\n        let provider = provider(env, Fs::default(), http_client.clone());\n        let creds = provider\n            .provide_credentials()\n            .await\n            .expect(\"valid credentials\");\n        assert_correct(creds);\n        http_client.assert_requests_match(&[]);\n    }\n\n    // ignored by default because it relies on actual DNS resolution\n    #[allow(unused_attributes)]\n    #[tokio::test]\n    #[traced_test]\n    #[ignore]\n    async fn real_dns_lookup() {\n        let dns = Some(\n            default_dns()\n                .expect(\"feature must be enabled\")\n                .into_shared(),\n        );\n        let err = validate_full_uri(\"http://www.amazon.com/creds\", dns.clone())\n            .await\n            .expect_err(\"not a valid IP\");\n        assert!(\n            matches!(\n                err,\n                InvalidFullUriError {\n                    kind: InvalidFullUriErrorKind::DisallowedIP\n                }\n            ),\n            \"{:?}\",\n            err\n        );\n        assert!(logs_contain(\"Address does not resolve to an allowed IP\"));\n        validate_full_uri(\"http://localhost:8888/creds\", dns.clone())\n            .await\n            .expect(\"localhost is the loopback interface\");\n        validate_full_uri(\"http://169.254.170.2.backname.io:8888/creds\", dns.clone())\n            .await\n            .expect(\"169.254.170.2.backname.io is the ecs container address\");\n        validate_full_uri(\"http://169.254.170.23.backname.io:8888/creds\", dns.clone())\n            .await\n            .expect(\"169.254.170.23.backname.io is the eks pod identity address\");\n        validate_full_uri(\"http://fd00-ec2--23.backname.io:8888/creds\", dns)\n            .await\n            .expect(\"fd00-ec2--23.backname.io is the eks pod identity address\");\n    }\n\n    /// Always returns the same IP addresses\n    #[derive(Clone, Debug)]\n    struct TestDns {\n        addrs: HashMap<String, Vec<IpAddr>>,\n        fallback: Vec<IpAddr>,\n    }\n\n    /// Default that returns a loopback for `localhost` and a non-loopback for all other hostnames\n    impl Default for TestDns {\n        fn default() -> Self {\n            let mut addrs = HashMap::new();\n            addrs.insert(\n                \"localhost\".into(),\n                vec![\"127.0.0.1\".parse().unwrap(), \"127.0.0.2\".parse().unwrap()],\n            );\n            TestDns {\n                addrs,\n                // non-loopback address\n                fallback: vec![\"72.21.210.29\".parse().unwrap()],\n            }\n        }\n    }\n\n    impl TestDns {\n        fn with_fallback(fallback: Vec<IpAddr>) -> Self {\n            TestDns {\n                addrs: Default::default(),\n                fallback,\n            }\n        }\n    }\n\n    impl ResolveDns for TestDns {\n        fn resolve_dns<'a>(&'a self, name: &'a str) -> DnsFuture<'a> {\n            DnsFuture::ready(Ok(self.addrs.get(name).unwrap_or(&self.fallback).clone()))\n        }\n    }\n\n    #[derive(Debug)]\n    struct NeverDns;\n    impl ResolveDns for NeverDns {\n        fn resolve_dns<'a>(&'a self, _name: &'a str) -> DnsFuture<'a> {\n            DnsFuture::new(async {\n                Never::new().await;\n                unreachable!()\n            })\n        }\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/src/env_service_config.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_runtime::env_config::section::EnvConfigSections;\nuse aws_runtime::env_config::EnvConfigValue;\nuse aws_types::os_shim_internal::Env;\nuse aws_types::service_config::{LoadServiceConfig, ServiceConfigKey};\n\n#[derive(Debug)]\npub(crate) struct EnvServiceConfig {\n    pub(crate) env: Env,\n    pub(crate) env_config_sections: EnvConfigSections,\n}\n\nimpl LoadServiceConfig for EnvServiceConfig {\n    fn load_config(&self, key: ServiceConfigKey<'_>) -> Option<String> {\n        let (value, _source) = EnvConfigValue::new()\n            .env(key.env())\n            .profile(key.profile())\n            .service_id(key.service_id())\n            .load(&self.env, Some(&self.env_config_sections))?;\n\n        Some(value.to_string())\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/src/environment/credentials.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::env::VarError;\n\nuse aws_credential_types::attributes::AccountId;\nuse aws_credential_types::credential_feature::AwsCredentialFeature;\nuse aws_credential_types::provider::{self, error::CredentialsError, future, ProvideCredentials};\nuse aws_credential_types::Credentials;\nuse aws_types::os_shim_internal::Env;\n\n/// Load Credentials from Environment Variables\n///\n/// `EnvironmentVariableCredentialsProvider` uses the following variables:\n/// - `AWS_ACCESS_KEY_ID`\n/// - `AWS_SECRET_ACCESS_KEY` with fallback to `SECRET_ACCESS_KEY`\n/// - `AWS_SESSION_TOKEN` (optional)\n/// - `AWS_ACCOUNT_ID` (optional)\n#[derive(Debug, Clone)]\npub struct EnvironmentVariableCredentialsProvider {\n    env: Env,\n}\n\nimpl EnvironmentVariableCredentialsProvider {\n    fn credentials(&self) -> provider::Result {\n        let access_key = self\n            .env\n            .get(\"AWS_ACCESS_KEY_ID\")\n            .and_then(err_if_blank)\n            .map_err(to_cred_error)?;\n        let secret_key = self\n            .env\n            .get(\"AWS_SECRET_ACCESS_KEY\")\n            .and_then(err_if_blank)\n            .or_else(|_| self.env.get(\"SECRET_ACCESS_KEY\"))\n            .and_then(err_if_blank)\n            .map_err(to_cred_error)?;\n        let session_token =\n            self.env\n                .get(\"AWS_SESSION_TOKEN\")\n                .ok()\n                .and_then(|token| match token.trim() {\n                    \"\" => None,\n                    s => Some(s.to_string()),\n                });\n        let account_id =\n            self.env\n                .get(\"AWS_ACCOUNT_ID\")\n                .ok()\n                .and_then(|account_id| match account_id.trim() {\n                    \"\" => None,\n                    s => Some(AccountId::from(s)),\n                });\n        let mut builder = Credentials::builder()\n            .access_key_id(access_key)\n            .secret_access_key(secret_key)\n            .provider_name(ENV_PROVIDER);\n        builder.set_session_token(session_token);\n        builder.set_account_id(account_id);\n        let mut creds = builder.build();\n        creds\n            .get_property_mut_or_default::<Vec<AwsCredentialFeature>>()\n            .push(AwsCredentialFeature::CredentialsEnvVars);\n        Ok(creds)\n    }\n}\n\nimpl EnvironmentVariableCredentialsProvider {\n    /// Create a `EnvironmentVariableCredentialsProvider`\n    pub fn new() -> Self {\n        Self::new_with_env(Env::real())\n    }\n\n    /// Create a new `EnvironmentVariableCredentialsProvider` with `Env` overridden\n    ///\n    /// This function is intended for tests that mock out the process environment.\n    pub(crate) fn new_with_env(env: Env) -> Self {\n        Self { env }\n    }\n}\n\nimpl Default for EnvironmentVariableCredentialsProvider {\n    fn default() -> Self {\n        Self::new()\n    }\n}\n\nconst ENV_PROVIDER: &str = \"EnvironmentVariable\";\n\nimpl ProvideCredentials for EnvironmentVariableCredentialsProvider {\n    fn provide_credentials<'a>(&'a self) -> future::ProvideCredentials<'a>\n    where\n        Self: 'a,\n    {\n        future::ProvideCredentials::ready(self.credentials())\n    }\n}\n\nfn to_cred_error(err: VarError) -> CredentialsError {\n    match err {\n        VarError::NotPresent => CredentialsError::not_loaded(\"environment variable not set\"),\n        e @ VarError::NotUnicode(_) => CredentialsError::unhandled(e),\n    }\n}\n\nfn err_if_blank(value: String) -> Result<String, VarError> {\n    if value.trim().is_empty() {\n        Err(VarError::NotPresent)\n    } else {\n        Ok(value)\n    }\n}\n\n#[cfg(test)]\nmod test {\n    use aws_credential_types::credential_feature::AwsCredentialFeature;\n    use aws_credential_types::provider::{error::CredentialsError, ProvideCredentials};\n    use aws_types::os_shim_internal::Env;\n    use futures_util::FutureExt;\n\n    use super::EnvironmentVariableCredentialsProvider;\n\n    fn make_provider(vars: &[(&str, &str)]) -> EnvironmentVariableCredentialsProvider {\n        EnvironmentVariableCredentialsProvider {\n            env: Env::from_slice(vars),\n        }\n    }\n\n    #[test]\n    fn valid_no_token() {\n        let provider = make_provider(&[\n            (\"AWS_ACCESS_KEY_ID\", \"access\"),\n            (\"AWS_SECRET_ACCESS_KEY\", \"secret\"),\n        ]);\n        let creds = provider\n            .provide_credentials()\n            .now_or_never()\n            .unwrap()\n            .expect(\"valid credentials\");\n        assert_eq!(creds.session_token(), None);\n        assert_eq!(creds.access_key_id(), \"access\");\n        assert_eq!(creds.secret_access_key(), \"secret\");\n    }\n\n    #[test]\n    fn valid_with_token() {\n        let provider = make_provider(&[\n            (\"AWS_ACCESS_KEY_ID\", \"access\"),\n            (\"AWS_SECRET_ACCESS_KEY\", \"secret\"),\n            (\"AWS_SESSION_TOKEN\", \"token\"),\n        ]);\n\n        let creds = provider\n            .provide_credentials()\n            .now_or_never()\n            .unwrap()\n            .expect(\"valid credentials\");\n        assert_eq!(creds.session_token().unwrap(), \"token\");\n        assert_eq!(creds.access_key_id(), \"access\");\n        assert_eq!(creds.secret_access_key(), \"secret\");\n    }\n\n    #[test]\n    fn empty_token_env_var() {\n        for token_value in &[\"\", \" \"] {\n            let provider = make_provider(&[\n                (\"AWS_ACCESS_KEY_ID\", \"access\"),\n                (\"AWS_SECRET_ACCESS_KEY\", \"secret\"),\n                (\"AWS_SESSION_TOKEN\", token_value),\n            ]);\n\n            let creds = provider\n                .provide_credentials()\n                .now_or_never()\n                .unwrap()\n                .expect(\"valid credentials\");\n            assert_eq!(creds.access_key_id(), \"access\");\n            assert_eq!(creds.secret_access_key(), \"secret\");\n            assert_eq!(creds.session_token(), None);\n        }\n    }\n\n    #[test]\n    fn secret_key_fallback() {\n        let provider = make_provider(&[\n            (\"AWS_ACCESS_KEY_ID\", \"access\"),\n            (\"SECRET_ACCESS_KEY\", \"secret\"),\n            (\"AWS_SESSION_TOKEN\", \"token\"),\n        ]);\n\n        let creds = provider\n            .provide_credentials()\n            .now_or_never()\n            .unwrap()\n            .expect(\"valid credentials\");\n        assert_eq!(creds.session_token().unwrap(), \"token\");\n        assert_eq!(creds.access_key_id(), \"access\");\n        assert_eq!(creds.secret_access_key(), \"secret\");\n    }\n\n    #[test]\n    fn secret_key_fallback_empty() {\n        let provider = make_provider(&[\n            (\"AWS_ACCESS_KEY_ID\", \"access\"),\n            (\"AWS_SECRET_ACCESS_KEY\", \" \"),\n            (\"SECRET_ACCESS_KEY\", \"secret\"),\n            (\"AWS_SESSION_TOKEN\", \"token\"),\n        ]);\n\n        let creds = provider\n            .provide_credentials()\n            .now_or_never()\n            .unwrap()\n            .expect(\"valid credentials\");\n        assert_eq!(creds.session_token().unwrap(), \"token\");\n        assert_eq!(creds.access_key_id(), \"access\");\n        assert_eq!(creds.secret_access_key(), \"secret\");\n    }\n\n    #[test]\n    fn missing() {\n        let provider = make_provider(&[]);\n        let err = provider\n            .provide_credentials()\n            .now_or_never()\n            .unwrap()\n            .expect_err(\"no credentials defined\");\n        assert!(matches!(err, CredentialsError::CredentialsNotLoaded { .. }));\n    }\n\n    #[test]\n    fn empty_keys_env_vars() {\n        for [access_key_value, secret_key_value] in &[\n            &[\"\", \"\"],\n            &[\" \", \"\"],\n            &[\"access\", \"\"],\n            &[\"\", \" \"],\n            &[\" \", \" \"],\n            &[\"access\", \" \"],\n            &[\"\", \"secret\"],\n            &[\" \", \"secret\"],\n        ] {\n            let provider = make_provider(&[\n                (\"AWS_ACCESS_KEY_ID\", access_key_value),\n                (\"AWS_SECRET_ACCESS_KEY\", secret_key_value),\n            ]);\n\n            let err = provider\n                .provide_credentials()\n                .now_or_never()\n                .unwrap()\n                .expect_err(\"no credentials defined\");\n            assert!(matches!(err, CredentialsError::CredentialsNotLoaded { .. }));\n        }\n    }\n\n    #[test]\n    fn credentials_feature() {\n        let provider = make_provider(&[\n            (\"AWS_ACCESS_KEY_ID\", \"access\"),\n            (\"AWS_SECRET_ACCESS_KEY\", \"secret\"),\n            (\"SECRET_ACCESS_KEY\", \"secret\"),\n            (\"AWS_SESSION_TOKEN\", \"token\"),\n        ]);\n\n        let creds = provider\n            .provide_credentials()\n            .now_or_never()\n            .unwrap()\n            .expect(\"valid credentials\");\n        assert_eq!(\n            &vec![AwsCredentialFeature::CredentialsEnvVars],\n            creds.get_property::<Vec<AwsCredentialFeature>>().unwrap()\n        );\n    }\n\n    #[test]\n    fn real_environment() {\n        let provider = EnvironmentVariableCredentialsProvider::new();\n        // we don't know what's in the env, just make sure it doesn't crash.\n        let _fut = provider.provide_credentials();\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/src/environment/mod.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Providers that load configuration from environment variables\n\nuse std::error::Error;\nuse std::fmt;\n\n/// Load credentials from the environment\npub mod credentials;\npub use credentials::EnvironmentVariableCredentialsProvider;\n\n/// Load regions from the environment\npub mod region;\npub use region::EnvironmentVariableRegionProvider;\n\n#[derive(Debug)]\npub(crate) struct InvalidBooleanValue {\n    value: String,\n}\n\nimpl fmt::Display for InvalidBooleanValue {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        write!(f, \"{} is not a valid boolean\", self.value)\n    }\n}\n\nimpl Error for InvalidBooleanValue {}\n\npub(crate) fn parse_bool(value: &str) -> Result<bool, InvalidBooleanValue> {\n    if value.eq_ignore_ascii_case(\"false\") {\n        Ok(false)\n    } else if value.eq_ignore_ascii_case(\"true\") {\n        Ok(true)\n    } else {\n        Err(InvalidBooleanValue {\n            value: value.to_string(),\n        })\n    }\n}\n\n#[derive(Debug)]\npub(crate) struct InvalidUintValue {\n    value: String,\n}\n\nimpl fmt::Display for InvalidUintValue {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        write!(f, \"{} is not a valid u32\", self.value)\n    }\n}\n\nimpl Error for InvalidUintValue {}\n\npub(crate) fn parse_uint(value: &str) -> Result<u32, InvalidUintValue> {\n    value.parse::<u32>().map_err(|_| InvalidUintValue {\n        value: value.to_string(),\n    })\n}\n\n#[derive(Debug)]\npub(crate) struct InvalidUrlValue {\n    value: String,\n}\n\nimpl fmt::Display for InvalidUrlValue {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        write!(f, \"{} is not a valid URL\", self.value)\n    }\n}\n\nimpl Error for InvalidUrlValue {}\n\npub(crate) fn parse_url(value: &str) -> Result<String, InvalidUrlValue> {\n    match url::Url::parse(value) {\n        // We discard the parse result because it includes a trailing slash\n        Ok(_) => Ok(value.to_string()),\n        Err(_) => Err(InvalidUrlValue {\n            value: value.to_string(),\n        }),\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/src/environment/region.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::meta::region::{future, ProvideRegion};\nuse aws_types::os_shim_internal::Env;\nuse aws_types::region::Region;\n\n/// Load a region from environment variables\n///\n/// This provider will first check the value of `AWS_REGION`, falling back to `AWS_DEFAULT_REGION`\n/// when `AWS_REGION` is unset.\n#[derive(Debug, Default)]\npub struct EnvironmentVariableRegionProvider {\n    env: Env,\n}\n\nimpl EnvironmentVariableRegionProvider {\n    /// Create a new `EnvironmentVariableRegionProvider`\n    pub fn new() -> Self {\n        EnvironmentVariableRegionProvider { env: Env::real() }\n    }\n\n    /// Create an region provider from a given `Env`\n    ///\n    /// This method is used for tests that need to override environment variables.\n    pub(crate) fn new_with_env(env: Env) -> Self {\n        EnvironmentVariableRegionProvider { env }\n    }\n}\n\nimpl ProvideRegion for EnvironmentVariableRegionProvider {\n    fn region(&self) -> future::ProvideRegion<'_> {\n        let region = self\n            .env\n            .get(\"AWS_REGION\")\n            .or_else(|_| self.env.get(\"AWS_DEFAULT_REGION\"))\n            .map(Region::new)\n            .ok();\n        future::ProvideRegion::ready(region)\n    }\n}\n#[cfg(test)]\nmod test {\n    use crate::environment::region::EnvironmentVariableRegionProvider;\n    use crate::meta::region::ProvideRegion;\n    use aws_types::os_shim_internal::Env;\n    use aws_types::region::Region;\n    use futures_util::FutureExt;\n\n    fn test_provider(vars: &[(&str, &str)]) -> EnvironmentVariableRegionProvider {\n        EnvironmentVariableRegionProvider::new_with_env(Env::from_slice(vars))\n    }\n\n    #[test]\n    fn no_region() {\n        assert_eq!(\n            test_provider(&[])\n                .region()\n                .now_or_never()\n                .expect(\"no polling\"),\n            None\n        );\n    }\n\n    #[test]\n    fn prioritize_aws_region() {\n        let provider = test_provider(&[\n            (\"AWS_REGION\", \"us-east-1\"),\n            (\"AWS_DEFAULT_REGION\", \"us-east-2\"),\n        ]);\n        assert_eq!(\n            provider.region().now_or_never().expect(\"no polling\"),\n            Some(Region::new(\"us-east-1\"))\n        );\n    }\n\n    #[test]\n    fn fallback_to_default_region() {\n        assert_eq!(\n            test_provider(&[(\"AWS_DEFAULT_REGION\", \"us-east-2\")])\n                .region()\n                .now_or_never()\n                .expect(\"no polling\"),\n            Some(Region::new(\"us-east-2\"))\n        );\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/src/http_credential_provider.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Generalized HTTP credential provider. Currently, this cannot be used directly and can only\n//! be used via the ECS credential provider.\n//!\n//! Future work will stabilize this interface and enable it to be used directly.\n\nuse crate::json_credentials::{parse_json_credentials, JsonCredentials, RefreshableCredentials};\nuse crate::provider_config::ProviderConfig;\nuse aws_credential_types::attributes::AccountId;\nuse aws_credential_types::credential_feature::AwsCredentialFeature;\nuse aws_credential_types::provider::{self, error::CredentialsError};\nuse aws_credential_types::Credentials;\nuse aws_smithy_runtime::client::metrics::MetricsRuntimePlugin;\nuse aws_smithy_runtime::client::orchestrator::operation::Operation;\nuse aws_smithy_runtime::client::retries::classifiers::{\n    HttpStatusCodeClassifier, TransientErrorClassifier,\n};\nuse aws_smithy_runtime_api::client::http::HttpConnectorSettings;\nuse aws_smithy_runtime_api::client::interceptors::context::{Error, InterceptorContext};\nuse aws_smithy_runtime_api::client::orchestrator::{\n    HttpResponse, Metadata, OrchestratorError, SensitiveOutput,\n};\nuse aws_smithy_runtime_api::client::result::SdkError;\nuse aws_smithy_runtime_api::client::retries::classifiers::ClassifyRetry;\nuse aws_smithy_runtime_api::client::retries::classifiers::RetryAction;\nuse aws_smithy_runtime_api::client::runtime_plugin::StaticRuntimePlugin;\nuse aws_smithy_types::body::SdkBody;\nuse aws_smithy_types::config_bag::Layer;\nuse aws_smithy_types::retry::RetryConfig;\nuse aws_smithy_types::timeout::TimeoutConfig;\nuse http::header::{ACCEPT, AUTHORIZATION};\nuse http::HeaderValue;\nuse std::time::Duration;\n\nconst DEFAULT_READ_TIMEOUT: Duration = Duration::from_secs(5);\nconst DEFAULT_CONNECT_TIMEOUT: Duration = Duration::from_secs(2);\n\n#[derive(Debug)]\nstruct HttpProviderAuth {\n    auth: Option<HeaderValue>,\n}\n\n#[derive(Debug)]\npub(crate) struct HttpCredentialProvider {\n    operation: Operation<HttpProviderAuth, Credentials, CredentialsError>,\n}\n\nimpl HttpCredentialProvider {\n    pub(crate) fn builder() -> Builder {\n        Builder::default()\n    }\n\n    pub(crate) async fn credentials(&self, auth: Option<HeaderValue>) -> provider::Result {\n        let credentials =\n            self.operation\n                .invoke(HttpProviderAuth { auth })\n                .await\n                .map(|mut creds| {\n                    creds\n                        .get_property_mut_or_default::<Vec<AwsCredentialFeature>>()\n                        .push(AwsCredentialFeature::CredentialsHttp);\n                    creds\n                });\n        match credentials {\n            Ok(creds) => Ok(creds),\n            Err(SdkError::ServiceError(context)) => Err(context.into_err()),\n            Err(other) => Err(CredentialsError::unhandled(other)),\n        }\n    }\n}\n\n#[derive(Default)]\npub(crate) struct Builder {\n    provider_config: Option<ProviderConfig>,\n    http_connector_settings: Option<HttpConnectorSettings>,\n}\n\nimpl Builder {\n    pub(crate) fn configure(mut self, provider_config: &ProviderConfig) -> Self {\n        self.provider_config = Some(provider_config.clone());\n        self\n    }\n\n    pub(crate) fn http_connector_settings(\n        mut self,\n        http_connector_settings: HttpConnectorSettings,\n    ) -> Self {\n        self.http_connector_settings = Some(http_connector_settings);\n        self\n    }\n\n    pub(crate) fn build(\n        self,\n        provider_name: &'static str,\n        endpoint: &str,\n        path: impl Into<String>,\n    ) -> HttpCredentialProvider {\n        let provider_config = self.provider_config.unwrap_or_default();\n        let path = path.into();\n\n        let mut builder = Operation::builder()\n            .service_name(\"HttpCredentialProvider\")\n            .operation_name(\"LoadCredentials\")\n            .with_connection_poisoning()\n            .endpoint_url(endpoint)\n            .no_auth()\n            .timeout_config(\n                TimeoutConfig::builder()\n                    .connect_timeout(DEFAULT_CONNECT_TIMEOUT)\n                    .read_timeout(DEFAULT_READ_TIMEOUT)\n                    .build(),\n            )\n            .runtime_plugin(StaticRuntimePlugin::new().with_config({\n                let mut layer = Layer::new(\"SensitiveOutput\");\n                layer.store_put(SensitiveOutput);\n                layer.freeze()\n            }))\n            .runtime_plugin(\n                MetricsRuntimePlugin::builder()\n                    .with_scope(\"aws_config::http_credential_provider\")\n                    .with_time_source(provider_config.time_source())\n                    .with_metadata(Metadata::new(path.clone(), provider_name))\n                    .build()\n                    .expect(\"All required fields have been set\"),\n            );\n        if let Some(http_client) = provider_config.http_client() {\n            builder = builder.http_client(http_client);\n        }\n        if let Some(sleep_impl) = provider_config.sleep_impl() {\n            builder = builder\n                .standard_retry(&RetryConfig::standard())\n                // The following errors are retryable:\n                //   - Socket errors\n                //   - Networking timeouts\n                //   - 5xx errors\n                //   - Non-parseable 200 responses.\n                .retry_classifier(HttpCredentialRetryClassifier)\n                // Socket errors and network timeouts\n                .retry_classifier(TransientErrorClassifier::<Error>::new())\n                // 5xx errors\n                .retry_classifier(HttpStatusCodeClassifier::default())\n                .sleep_impl(sleep_impl);\n        } else {\n            builder = builder.no_retry();\n        }\n        let operation = builder\n            .serializer(move |input: HttpProviderAuth| {\n                let mut http_req = http::Request::builder()\n                    .uri(path.clone())\n                    .header(ACCEPT, \"application/json\");\n                if let Some(auth) = input.auth {\n                    http_req = http_req.header(AUTHORIZATION, auth);\n                }\n                Ok(http_req\n                    .body(SdkBody::empty())\n                    .expect(\"valid request\")\n                    .try_into()\n                    .unwrap())\n            })\n            .deserializer(move |response| parse_response(provider_name, response))\n            .build();\n        HttpCredentialProvider { operation }\n    }\n}\n\nfn parse_response(\n    provider_name: &'static str,\n    response: &HttpResponse,\n) -> Result<Credentials, OrchestratorError<CredentialsError>> {\n    if !response.status().is_success() {\n        return Err(OrchestratorError::operation(\n            CredentialsError::provider_error(format!(\n                \"Non-success status from HTTP credential provider: {:?}\",\n                response.status()\n            )),\n        ));\n    }\n    let resp_bytes = response.body().bytes().expect(\"non-streaming deserializer\");\n    let str_resp = std::str::from_utf8(resp_bytes)\n        .map_err(|err| OrchestratorError::operation(CredentialsError::unhandled(err)))?;\n    let json_creds = parse_json_credentials(str_resp)\n        .map_err(|err| OrchestratorError::operation(CredentialsError::unhandled(err)))?;\n    match json_creds {\n        JsonCredentials::RefreshableCredentials(RefreshableCredentials {\n            access_key_id,\n            secret_access_key,\n            session_token,\n            account_id,\n            expiration,\n        }) => {\n            let mut builder = Credentials::builder()\n                .access_key_id(access_key_id)\n                .secret_access_key(secret_access_key)\n                .session_token(session_token)\n                .expiry(expiration)\n                .provider_name(provider_name);\n            builder.set_account_id(account_id.map(AccountId::from));\n            Ok(builder.build())\n        }\n        JsonCredentials::Error { code, message } => Err(OrchestratorError::operation(\n            CredentialsError::provider_error(format!(\n                \"failed to load credentials [{code}]: {message}\",\n            )),\n        )),\n    }\n}\n\n#[derive(Clone, Debug)]\nstruct HttpCredentialRetryClassifier;\n\nimpl ClassifyRetry for HttpCredentialRetryClassifier {\n    fn name(&self) -> &'static str {\n        \"HttpCredentialRetryClassifier\"\n    }\n\n    fn classify_retry(&self, ctx: &InterceptorContext) -> RetryAction {\n        let output_or_error = ctx.output_or_error();\n        let error = match output_or_error {\n            Some(Ok(_)) | None => return RetryAction::NoActionIndicated,\n            Some(Err(err)) => err,\n        };\n\n        // Retry non-parseable 200 responses\n        if let Some((err, status)) = error\n            .as_operation_error()\n            .and_then(|err| err.downcast_ref::<CredentialsError>())\n            .zip(ctx.response().map(HttpResponse::status))\n        {\n            if matches!(err, CredentialsError::Unhandled { .. }) && status.is_success() {\n                return RetryAction::server_error();\n            }\n        }\n\n        RetryAction::NoActionIndicated\n    }\n}\n\n#[cfg(test)]\nmod test {\n    use super::*;\n    use aws_credential_types::credential_feature::AwsCredentialFeature;\n    use aws_credential_types::provider::error::CredentialsError;\n    use aws_smithy_http_client::test_util::{ReplayEvent, StaticReplayClient};\n    use aws_smithy_types::body::SdkBody;\n    use http::{Request, Response, Uri};\n    use std::time::SystemTime;\n\n    async fn provide_creds(\n        http_client: StaticReplayClient,\n    ) -> Result<Credentials, CredentialsError> {\n        let provider_config = ProviderConfig::default().with_http_client(http_client.clone());\n        let provider = HttpCredentialProvider::builder()\n            .configure(&provider_config)\n            .build(\"test\", \"http://localhost:1234/\", \"/some-creds\");\n        provider.credentials(None).await\n    }\n\n    fn successful_req_resp() -> ReplayEvent {\n        ReplayEvent::new(\n            Request::builder()\n                .uri(Uri::from_static(\"http://localhost:1234/some-creds\"))\n                .body(SdkBody::empty())\n                .unwrap(),\n            Response::builder()\n                .status(200)\n                .body(SdkBody::from(\n                    r#\"{\n                        \"AccessKeyId\" : \"MUA...\",\n                        \"SecretAccessKey\" : \"/7PC5om....\",\n                        \"Token\" : \"AQoDY....=\",\n                        \"Expiration\" : \"2016-02-25T06:03:31Z\"\n                    }\"#,\n                ))\n                .unwrap(),\n        )\n    }\n\n    #[tokio::test]\n    async fn successful_response() {\n        let http_client = StaticReplayClient::new(vec![successful_req_resp()]);\n        let creds = provide_creds(http_client.clone()).await.expect(\"success\");\n        assert_eq!(\"MUA...\", creds.access_key_id());\n        assert_eq!(\"/7PC5om....\", creds.secret_access_key());\n        assert_eq!(Some(\"AQoDY....=\"), creds.session_token());\n        assert_eq!(\n            Some(SystemTime::UNIX_EPOCH + Duration::from_secs(1456380211)),\n            creds.expiry()\n        );\n        http_client.assert_requests_match(&[]);\n    }\n\n    #[tokio::test]\n    async fn retry_nonparseable_response() {\n        let http_client = StaticReplayClient::new(vec![\n            ReplayEvent::new(\n                Request::builder()\n                    .uri(Uri::from_static(\"http://localhost:1234/some-creds\"))\n                    .body(SdkBody::empty())\n                    .unwrap(),\n                Response::builder()\n                    .status(200)\n                    .body(SdkBody::from(r#\"not json\"#))\n                    .unwrap(),\n            ),\n            successful_req_resp(),\n        ]);\n        let creds = provide_creds(http_client.clone()).await.expect(\"success\");\n        assert_eq!(\"MUA...\", creds.access_key_id());\n        http_client.assert_requests_match(&[]);\n    }\n\n    #[tokio::test]\n    async fn retry_error_code() {\n        let http_client = StaticReplayClient::new(vec![\n            ReplayEvent::new(\n                Request::builder()\n                    .uri(Uri::from_static(\"http://localhost:1234/some-creds\"))\n                    .body(SdkBody::empty())\n                    .unwrap(),\n                Response::builder()\n                    .status(500)\n                    .body(SdkBody::from(r#\"it broke\"#))\n                    .unwrap(),\n            ),\n            successful_req_resp(),\n        ]);\n        let creds = provide_creds(http_client.clone()).await.expect(\"success\");\n        assert_eq!(\"MUA...\", creds.access_key_id());\n        http_client.assert_requests_match(&[]);\n    }\n\n    #[tokio::test]\n    async fn explicit_error_not_retryable() {\n        let http_client = StaticReplayClient::new(vec![ReplayEvent::new(\n            Request::builder()\n                .uri(Uri::from_static(\"http://localhost:1234/some-creds\"))\n                .body(SdkBody::empty())\n                .unwrap(),\n            Response::builder()\n                .status(400)\n                .body(SdkBody::from(\n                    r#\"{ \"Code\": \"Error\", \"Message\": \"There was a problem, it was your fault\" }\"#,\n                ))\n                .unwrap(),\n        )]);\n        let err = provide_creds(http_client.clone())\n            .await\n            .expect_err(\"it should fail\");\n        assert!(\n            matches!(err, CredentialsError::ProviderError { .. }),\n            \"should be CredentialsError::ProviderError: {err}\",\n        );\n        http_client.assert_requests_match(&[]);\n    }\n\n    #[tokio::test]\n    async fn credentials_feature() {\n        let http_client = StaticReplayClient::new(vec![successful_req_resp()]);\n        let creds = provide_creds(http_client.clone()).await.expect(\"success\");\n        assert_eq!(\n            &vec![AwsCredentialFeature::CredentialsHttp],\n            creds.get_property::<Vec<AwsCredentialFeature>>().unwrap()\n        );\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/src/imds/client/error.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Error types for [`ImdsClient`](crate::imds::client::Client)\n\nuse aws_smithy_runtime_api::client::orchestrator::HttpResponse;\nuse aws_smithy_runtime_api::client::result::SdkError;\nuse std::error::Error;\nuse std::fmt;\n\n/// Error context for [`ImdsError::FailedToLoadToken`]\n#[derive(Debug)]\npub struct FailedToLoadToken {\n    source: SdkError<TokenError, HttpResponse>,\n}\n\nimpl FailedToLoadToken {\n    /// Returns `true` if a dispatch failure caused the token to fail to load\n    pub fn is_dispatch_failure(&self) -> bool {\n        matches!(self.source, SdkError::DispatchFailure(_))\n    }\n\n    pub(crate) fn into_source(self) -> SdkError<TokenError, HttpResponse> {\n        self.source\n    }\n}\n\n/// Error context for [`ImdsError::ErrorResponse`]\n#[derive(Debug)]\npub struct ErrorResponse {\n    raw: HttpResponse,\n}\n\nimpl ErrorResponse {\n    /// Returns the raw response from IMDS\n    pub fn response(&self) -> &HttpResponse {\n        &self.raw\n    }\n}\n\n/// Error context for [`ImdsError::IoError`]\n#[derive(Debug)]\npub struct IoError {\n    source: Box<dyn Error + Send + Sync + 'static>,\n}\n\n/// Error context for [`ImdsError::Unexpected`]\n#[derive(Debug)]\npub struct Unexpected {\n    source: Box<dyn Error + Send + Sync + 'static>,\n}\n\n/// An error retrieving metadata from IMDS\n#[derive(Debug)]\n#[non_exhaustive]\npub enum ImdsError {\n    /// An IMDSv2 Token could not be loaded\n    ///\n    /// Requests to IMDS must be accompanied by a token obtained via a `PUT` request. This is handled\n    /// transparently by the [`Client`](crate::imds::client::Client).\n    FailedToLoadToken(FailedToLoadToken),\n\n    /// An error response was returned from IMDS\n    ErrorResponse(ErrorResponse),\n\n    /// IO Error\n    ///\n    /// An error occurred communication with IMDS\n    IoError(IoError),\n\n    /// An unexpected error occurred communicating with IMDS\n    Unexpected(Unexpected),\n}\n\nimpl ImdsError {\n    pub(super) fn failed_to_load_token(source: SdkError<TokenError, HttpResponse>) -> Self {\n        Self::FailedToLoadToken(FailedToLoadToken { source })\n    }\n\n    pub(super) fn error_response(raw: HttpResponse) -> Self {\n        Self::ErrorResponse(ErrorResponse { raw })\n    }\n\n    pub(super) fn io_error(source: impl Into<Box<dyn Error + Send + Sync + 'static>>) -> Self {\n        Self::IoError(IoError {\n            source: source.into(),\n        })\n    }\n\n    pub(super) fn unexpected(source: impl Into<Box<dyn Error + Send + Sync + 'static>>) -> Self {\n        Self::Unexpected(Unexpected {\n            source: source.into(),\n        })\n    }\n}\n\nimpl fmt::Display for ImdsError {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        match self {\n            ImdsError::FailedToLoadToken(_) => {\n                write!(f, \"failed to load IMDS session token\")\n            }\n            ImdsError::ErrorResponse(context) => write!(\n                f,\n                \"error response from IMDS (code: {}). {:?}\",\n                context.raw.status().as_u16(),\n                context.raw\n            ),\n            ImdsError::IoError(_) => {\n                write!(f, \"an IO error occurred communicating with IMDS\")\n            }\n            ImdsError::Unexpected(_) => {\n                write!(f, \"an unexpected error occurred communicating with IMDS\",)\n            }\n        }\n    }\n}\n\nimpl Error for ImdsError {\n    fn source(&self) -> Option<&(dyn Error + 'static)> {\n        match &self {\n            ImdsError::FailedToLoadToken(context) => Some(&context.source),\n            ImdsError::IoError(context) => Some(context.source.as_ref()),\n            ImdsError::Unexpected(context) => Some(context.source.as_ref()),\n            ImdsError::ErrorResponse(_) => None,\n        }\n    }\n}\n\n#[derive(Debug)]\npub(super) enum InnerImdsError {\n    BadStatus,\n    InvalidUtf8,\n}\n\nimpl fmt::Display for InnerImdsError {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> std::fmt::Result {\n        match self {\n            InnerImdsError::BadStatus => write!(f, \"failing status code returned from IMDS\"),\n            InnerImdsError::InvalidUtf8 => write!(f, \"IMDS did not return valid UTF-8\"),\n        }\n    }\n}\n\nimpl Error for InnerImdsError {}\n\n/// Invalid Endpoint Mode\n#[derive(Debug)]\npub struct InvalidEndpointMode {\n    mode: String,\n}\n\nimpl InvalidEndpointMode {\n    pub(super) fn new(mode: impl Into<String>) -> Self {\n        Self { mode: mode.into() }\n    }\n}\n\nimpl fmt::Display for InvalidEndpointMode {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        write!(\n            f,\n            \"`{}` is not a valid endpoint mode. Valid values are [`IPv4`, `IPv6`]\",\n            &self.mode\n        )\n    }\n}\n\nimpl Error for InvalidEndpointMode {}\n\n#[derive(Debug)]\n#[allow(clippy::enum_variant_names)]\nenum BuildErrorKind {\n    /// The endpoint mode was invalid\n    InvalidEndpointMode(InvalidEndpointMode),\n\n    /// The specified endpoint was not a valid URI\n    InvalidEndpointUri(Box<dyn Error + Send + Sync + 'static>),\n}\n\n/// Error constructing IMDSv2 Client\n#[derive(Debug)]\npub struct BuildError {\n    kind: BuildErrorKind,\n}\n\nimpl BuildError {\n    pub(super) fn invalid_endpoint_mode(source: InvalidEndpointMode) -> Self {\n        Self {\n            kind: BuildErrorKind::InvalidEndpointMode(source),\n        }\n    }\n\n    pub(super) fn invalid_endpoint_uri(\n        source: impl Into<Box<dyn Error + Send + Sync + 'static>>,\n    ) -> Self {\n        Self {\n            kind: BuildErrorKind::InvalidEndpointUri(source.into()),\n        }\n    }\n}\n\nimpl fmt::Display for BuildError {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> std::fmt::Result {\n        use BuildErrorKind::*;\n        write!(f, \"failed to build IMDS client: \")?;\n        match self.kind {\n            InvalidEndpointMode(_) => write!(f, \"invalid endpoint mode\"),\n            InvalidEndpointUri(_) => write!(f, \"invalid URI\"),\n        }\n    }\n}\n\nimpl Error for BuildError {\n    fn source(&self) -> Option<&(dyn Error + 'static)> {\n        use BuildErrorKind::*;\n        match &self.kind {\n            InvalidEndpointMode(e) => Some(e),\n            InvalidEndpointUri(e) => Some(e.as_ref()),\n        }\n    }\n}\n\n#[derive(Debug)]\npub(super) enum TokenErrorKind {\n    /// The token was invalid\n    ///\n    /// Because tokens must be eventually sent as a header, the token must be a valid header value.\n    InvalidToken,\n\n    /// No TTL was sent\n    ///\n    /// The token response must include a time-to-live indicating the lifespan of the token.\n    NoTtl,\n\n    /// The TTL was invalid\n    ///\n    /// The TTL must be a valid positive integer.\n    InvalidTtl,\n\n    /// Invalid Parameters\n    ///\n    /// The request to load a token was malformed. This indicates an SDK bug.\n    InvalidParameters,\n\n    /// Forbidden\n    ///\n    /// IMDS is disabled or has been disallowed via permissions.\n    Forbidden,\n}\n\n/// Error retrieving token from IMDS\n#[derive(Debug)]\npub struct TokenError {\n    kind: TokenErrorKind,\n}\n\nimpl fmt::Display for TokenError {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        use TokenErrorKind::*;\n        match self.kind {\n            InvalidToken => write!(f, \"invalid token\"),\n            NoTtl => write!(f, \"token response did not contain a TTL header\"),\n            InvalidTtl => write!(f, \"the returned TTL was invalid\"),\n            InvalidParameters => {\n                write!(f, \"invalid request parameters. This indicates an SDK bug.\")\n            }\n            Forbidden => write!(\n                f,\n                \"request forbidden: IMDS is disabled or the caller has insufficient permissions.\"\n            ),\n        }\n    }\n}\n\nimpl Error for TokenError {}\n\nimpl From<TokenErrorKind> for TokenError {\n    fn from(kind: TokenErrorKind) -> Self {\n        Self { kind }\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/src/imds/client/token.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! IMDS Token Middleware\n//! Requests to IMDS are two part:\n//! 1. A PUT request to the token API is made\n//! 2. A GET request is made to the requested API. The Token is added as a header.\n//!\n//! This module implements a middleware that will:\n//! - Load a token via the token API\n//! - Cache the token according to the TTL\n//! - Retry token loading when it fails\n//! - Attach the token to the request in the `x-aws-ec2-metadata-token` header\n\nuse crate::identity::IdentityCache;\nuse crate::imds::client::error::{ImdsError, TokenError, TokenErrorKind};\nuse aws_smithy_async::time::SharedTimeSource;\nuse aws_smithy_runtime::client::orchestrator::operation::Operation;\nuse aws_smithy_runtime::expiring_cache::ExpiringCache;\nuse aws_smithy_runtime_api::box_error::BoxError;\nuse aws_smithy_runtime_api::client::auth::static_resolver::StaticAuthSchemeOptionResolver;\nuse aws_smithy_runtime_api::client::auth::{\n    AuthScheme, AuthSchemeEndpointConfig, AuthSchemeId, Sign,\n};\nuse aws_smithy_runtime_api::client::identity::{\n    Identity, IdentityFuture, ResolveIdentity, SharedIdentityResolver,\n};\nuse aws_smithy_runtime_api::client::orchestrator::{HttpRequest, HttpResponse, OrchestratorError};\nuse aws_smithy_runtime_api::client::runtime_components::{\n    GetIdentityResolver, RuntimeComponents, RuntimeComponentsBuilder,\n};\nuse aws_smithy_runtime_api::client::runtime_plugin::{RuntimePlugin, SharedRuntimePlugin};\nuse aws_smithy_types::body::SdkBody;\nuse aws_smithy_types::config_bag::ConfigBag;\nuse http::{HeaderValue, Uri};\nuse std::borrow::Cow;\nuse std::fmt;\nuse std::sync::Arc;\nuse std::time::{Duration, SystemTime};\n\n/// Token Refresh Buffer\n///\n/// Tokens are cached to remove the need to reload the token between subsequent requests. To ensure\n/// that a request never fails with a 401 (expired token), a buffer window exists during which the token\n/// may not be expired, but will still be refreshed.\nconst TOKEN_REFRESH_BUFFER: Duration = Duration::from_secs(120);\n\nconst X_AWS_EC2_METADATA_TOKEN_TTL_SECONDS: &str = \"x-aws-ec2-metadata-token-ttl-seconds\";\nconst X_AWS_EC2_METADATA_TOKEN: &str = \"x-aws-ec2-metadata-token\";\nconst IMDS_TOKEN_AUTH_SCHEME: AuthSchemeId = AuthSchemeId::new(X_AWS_EC2_METADATA_TOKEN);\n\n#[derive(Debug)]\nstruct TtlToken {\n    value: HeaderValue,\n    ttl: Duration,\n}\n\n/// IMDS Token\n#[derive(Clone)]\nstruct Token {\n    value: HeaderValue,\n    expiry: SystemTime,\n}\nimpl fmt::Debug for Token {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        f.debug_struct(\"Token\")\n            .field(\"value\", &\"** redacted **\")\n            .field(\"expiry\", &self.expiry)\n            .finish()\n    }\n}\n\n/// Token Runtime Plugin\n///\n/// This runtime plugin wires up the necessary components to load/cache a token\n/// when required and handle caching/expiry. This token will get attached to the\n/// request to IMDS on the `x-aws-ec2-metadata-token` header.\n#[derive(Debug)]\npub(super) struct TokenRuntimePlugin {\n    components: RuntimeComponentsBuilder,\n}\n\nimpl TokenRuntimePlugin {\n    pub(super) fn new(common_plugin: SharedRuntimePlugin, token_ttl: Duration) -> Self {\n        Self {\n            components: RuntimeComponentsBuilder::new(\"TokenRuntimePlugin\")\n                .with_auth_scheme(TokenAuthScheme::new())\n                .with_auth_scheme_option_resolver(Some(StaticAuthSchemeOptionResolver::new(vec![\n                    IMDS_TOKEN_AUTH_SCHEME,\n                ])))\n                // The TokenResolver has a cache of its own, so don't use identity caching\n                .with_identity_cache(Some(IdentityCache::no_cache()))\n                .with_identity_resolver(\n                    IMDS_TOKEN_AUTH_SCHEME,\n                    TokenResolver::new(common_plugin, token_ttl),\n                ),\n        }\n    }\n}\n\nimpl RuntimePlugin for TokenRuntimePlugin {\n    fn runtime_components(\n        &self,\n        _current_components: &RuntimeComponentsBuilder,\n    ) -> Cow<'_, RuntimeComponentsBuilder> {\n        Cow::Borrowed(&self.components)\n    }\n}\n\n#[derive(Debug)]\nstruct TokenResolverInner {\n    cache: ExpiringCache<Token, ImdsError>,\n    refresh: Operation<(), TtlToken, TokenError>,\n}\n\n#[derive(Clone, Debug)]\nstruct TokenResolver {\n    inner: Arc<TokenResolverInner>,\n}\n\nimpl TokenResolver {\n    fn new(common_plugin: SharedRuntimePlugin, token_ttl: Duration) -> Self {\n        Self {\n            inner: Arc::new(TokenResolverInner {\n                cache: ExpiringCache::new(TOKEN_REFRESH_BUFFER),\n                refresh: Operation::builder()\n                    .service_name(\"imds\")\n                    .operation_name(\"get-token\")\n                    .runtime_plugin(common_plugin)\n                    .no_auth()\n                    .with_connection_poisoning()\n                    .serializer(move |_| {\n                        Ok(http::Request::builder()\n                            .method(\"PUT\")\n                            .uri(Uri::from_static(\"/latest/api/token\"))\n                            .header(X_AWS_EC2_METADATA_TOKEN_TTL_SECONDS, token_ttl.as_secs())\n                            .body(SdkBody::empty())\n                            .expect(\"valid HTTP request\")\n                            .try_into()\n                            .unwrap())\n                    })\n                    .deserializer(move |response| {\n                        parse_token_response(response).map_err(OrchestratorError::operation)\n                    })\n                    .build(),\n            }),\n        }\n    }\n\n    async fn get_token(\n        &self,\n        time_source: SharedTimeSource,\n    ) -> Result<(Token, SystemTime), ImdsError> {\n        let result = self.inner.refresh.invoke(()).await;\n        let now = time_source.now();\n        result\n            .map(|token| {\n                let token = Token {\n                    value: token.value,\n                    expiry: now + token.ttl,\n                };\n                let expiry = token.expiry;\n                (token, expiry)\n            })\n            .map_err(ImdsError::failed_to_load_token)\n    }\n}\n\nfn parse_token_response(response: &HttpResponse) -> Result<TtlToken, TokenError> {\n    match response.status().as_u16() {\n        400 => return Err(TokenErrorKind::InvalidParameters.into()),\n        403 => return Err(TokenErrorKind::Forbidden.into()),\n        _ => {}\n    }\n    let mut value =\n        HeaderValue::from_bytes(response.body().bytes().expect(\"non-streaming response\"))\n            .map_err(|_| TokenErrorKind::InvalidToken)?;\n    value.set_sensitive(true);\n\n    let ttl: u64 = response\n        .headers()\n        .get(X_AWS_EC2_METADATA_TOKEN_TTL_SECONDS)\n        .ok_or(TokenErrorKind::NoTtl)?\n        .parse()\n        .map_err(|_parse_error| TokenErrorKind::InvalidTtl)?;\n    Ok(TtlToken {\n        value,\n        ttl: Duration::from_secs(ttl),\n    })\n}\n\nimpl ResolveIdentity for TokenResolver {\n    fn resolve_identity<'a>(\n        &'a self,\n        components: &'a RuntimeComponents,\n        _config_bag: &'a ConfigBag,\n    ) -> IdentityFuture<'a> {\n        let time_source = components\n            .time_source()\n            .expect(\"time source required for IMDS token caching\");\n        IdentityFuture::new(async {\n            let now = time_source.now();\n            let preloaded_token = self.inner.cache.yield_or_clear_if_expired(now).await;\n            let token = match preloaded_token {\n                Some(token) => {\n                    tracing::trace!(\n                        buffer_time=?TOKEN_REFRESH_BUFFER,\n                        expiration=?token.expiry,\n                        now=?now,\n                        \"loaded IMDS token from cache\");\n                    Ok(token)\n                }\n                None => {\n                    tracing::debug!(\"IMDS token cache miss\");\n                    self.inner\n                        .cache\n                        .get_or_load(|| async { self.get_token(time_source).await })\n                        .await\n                }\n            }?;\n\n            let expiry = token.expiry;\n            Ok(Identity::new(token, Some(expiry)))\n        })\n    }\n}\n\n#[derive(Debug)]\nstruct TokenAuthScheme {\n    signer: TokenSigner,\n}\n\nimpl TokenAuthScheme {\n    fn new() -> Self {\n        Self {\n            signer: TokenSigner,\n        }\n    }\n}\n\nimpl AuthScheme for TokenAuthScheme {\n    fn scheme_id(&self) -> AuthSchemeId {\n        IMDS_TOKEN_AUTH_SCHEME\n    }\n\n    fn identity_resolver(\n        &self,\n        identity_resolvers: &dyn GetIdentityResolver,\n    ) -> Option<SharedIdentityResolver> {\n        identity_resolvers.identity_resolver(IMDS_TOKEN_AUTH_SCHEME)\n    }\n\n    fn signer(&self) -> &dyn Sign {\n        &self.signer\n    }\n}\n\n#[derive(Debug)]\nstruct TokenSigner;\n\nimpl Sign for TokenSigner {\n    fn sign_http_request(\n        &self,\n        request: &mut HttpRequest,\n        identity: &Identity,\n        _auth_scheme_endpoint_config: AuthSchemeEndpointConfig<'_>,\n        _runtime_components: &RuntimeComponents,\n        _config_bag: &ConfigBag,\n    ) -> Result<(), BoxError> {\n        let token = identity.data::<Token>().expect(\"correct type\");\n        request\n            .headers_mut()\n            .append(X_AWS_EC2_METADATA_TOKEN, token.value.clone());\n        Ok(())\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/src/imds/client.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Raw IMDSv2 Client\n//!\n//! Client for direct access to IMDSv2.\n\nuse crate::imds::client::error::{BuildError, ImdsError, InnerImdsError, InvalidEndpointMode};\nuse crate::imds::client::token::TokenRuntimePlugin;\nuse crate::provider_config::ProviderConfig;\nuse crate::PKG_VERSION;\nuse aws_runtime::user_agent::{ApiMetadata, AwsUserAgent, UserAgentInterceptor};\nuse aws_smithy_runtime::client::metrics::MetricsRuntimePlugin;\nuse aws_smithy_runtime::client::orchestrator::operation::Operation;\nuse aws_smithy_runtime::client::retries::strategy::StandardRetryStrategy;\nuse aws_smithy_runtime_api::box_error::BoxError;\nuse aws_smithy_runtime_api::client::auth::AuthSchemeOptionResolverParams;\nuse aws_smithy_runtime_api::client::endpoint::{\n    EndpointFuture, EndpointResolverParams, ResolveEndpoint,\n};\nuse aws_smithy_runtime_api::client::interceptors::context::InterceptorContext;\nuse aws_smithy_runtime_api::client::orchestrator::{\n    HttpRequest, Metadata, OrchestratorError, SensitiveOutput,\n};\nuse aws_smithy_runtime_api::client::result::ConnectorError;\nuse aws_smithy_runtime_api::client::result::SdkError;\nuse aws_smithy_runtime_api::client::retries::classifiers::{\n    ClassifyRetry, RetryAction, SharedRetryClassifier,\n};\nuse aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder;\nuse aws_smithy_runtime_api::client::runtime_plugin::{RuntimePlugin, SharedRuntimePlugin};\nuse aws_smithy_types::body::SdkBody;\nuse aws_smithy_types::config_bag::{FrozenLayer, Layer};\nuse aws_smithy_types::endpoint::Endpoint;\nuse aws_smithy_types::retry::RetryConfig;\nuse aws_smithy_types::timeout::TimeoutConfig;\nuse aws_types::os_shim_internal::Env;\nuse http::Uri;\nuse std::borrow::Cow;\nuse std::error::Error as _;\nuse std::fmt;\nuse std::str::FromStr;\nuse std::sync::Arc;\nuse std::time::Duration;\n\npub mod error;\nmod token;\n\n// 6 hours\nconst DEFAULT_TOKEN_TTL: Duration = Duration::from_secs(21_600);\nconst DEFAULT_ATTEMPTS: u32 = 4;\nconst DEFAULT_CONNECT_TIMEOUT: Duration = Duration::from_secs(1);\nconst DEFAULT_READ_TIMEOUT: Duration = Duration::from_secs(1);\nconst DEFAULT_OPERATION_TIMEOUT: Duration = Duration::from_secs(30);\nconst DEFAULT_OPERATION_ATTEMPT_TIMEOUT: Duration = Duration::from_secs(10);\n\nfn user_agent() -> AwsUserAgent {\n    AwsUserAgent::new_from_environment(Env::real(), ApiMetadata::new(\"imds\", PKG_VERSION))\n}\n\n/// IMDSv2 Client\n///\n/// Client for IMDSv2. This client handles fetching tokens, retrying on failure, and token\n/// caching according to the specified token TTL.\n///\n/// _Note: This client ONLY supports IMDSv2. It will not fallback to IMDSv1. See\n/// [transitioning to IMDSv2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/configuring-instance-metadata-service.html#instance-metadata-transition-to-version-2)\n/// for more information._\n///\n/// **Note**: When running in a Docker container, all network requests will incur an additional hop. When combined with the default IMDS hop limit of 1, this will cause requests to IMDS to timeout! To fix this issue, you'll need to set the following instance metadata settings :\n/// ```txt\n/// amazonec2-metadata-token=required\n/// amazonec2-metadata-token-response-hop-limit=2\n/// ```\n///\n/// On an instance that is already running, these can be set with [ModifyInstanceMetadataOptions](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyInstanceMetadataOptions.html). On a new instance, these can be set with the `MetadataOptions` field on [RunInstances](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RunInstances.html).\n///\n/// For more information about IMDSv2 vs. IMDSv1 see [this guide](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/configuring-instance-metadata-service.html)\n///\n/// # Client Configuration\n/// The IMDS client can load configuration explicitly, via environment variables, or via\n/// `~/.aws/config`. It will first attempt to resolve an endpoint override. If no endpoint\n/// override exists, it will attempt to resolve an [`EndpointMode`]. If no\n/// [`EndpointMode`] override exists, it will fallback to [`IpV4`](EndpointMode::IpV4). An exhaustive\n/// list is below:\n///\n/// ## Endpoint configuration list\n/// 1. Explicit configuration of `Endpoint` via the [builder](Builder):\n/// ```no_run\n/// use aws_config::imds::client::Client;\n/// # async fn docs() {\n/// let client = Client::builder()\n///   .endpoint(\"http://customimds:456/\").expect(\"valid URI\")\n///   .build();\n/// # }\n/// ```\n///\n/// 2. The `AWS_EC2_METADATA_SERVICE_ENDPOINT` environment variable. Note: If this environment variable\n///    is set, it MUST contain a valid URI or client construction will fail.\n///\n/// 3. The `ec2_metadata_service_endpoint` field in `~/.aws/config`:\n/// ```ini\n/// [default]\n/// # ... other configuration\n/// ec2_metadata_service_endpoint = http://my-custom-endpoint:444\n/// ```\n///\n/// 4. An explicitly set endpoint mode:\n/// ```no_run\n/// use aws_config::imds::client::{Client, EndpointMode};\n/// # async fn docs() {\n/// let client = Client::builder().endpoint_mode(EndpointMode::IpV6).build();\n/// # }\n/// ```\n///\n/// 5. An [endpoint mode](EndpointMode) loaded from the `AWS_EC2_METADATA_SERVICE_ENDPOINT_MODE` environment\n///    variable. Valid values: `IPv4`, `IPv6`\n///\n/// 6. An [endpoint mode](EndpointMode) loaded from the `ec2_metadata_service_endpoint_mode` field in\n///    `~/.aws/config`:\n/// ```ini\n/// [default]\n/// # ... other configuration\n/// ec2_metadata_service_endpoint_mode = IPv4\n/// ```\n///\n/// 7. The default value of `http://169.254.169.254` will be used.\n///\n#[derive(Clone, Debug)]\npub struct Client {\n    operation: Operation<String, SensitiveString, InnerImdsError>,\n}\n\nimpl Client {\n    /// IMDS client builder\n    pub fn builder() -> Builder {\n        Builder::default()\n    }\n\n    /// Retrieve information from IMDS\n    ///\n    /// This method will handle loading and caching a session token, combining the `path` with the\n    /// configured IMDS endpoint, and retrying potential errors.\n    ///\n    /// For more information about IMDSv2 methods and functionality, see\n    /// [Instance metadata and user data](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html)\n    ///\n    /// # Examples\n    ///\n    /// ```no_run\n    /// use aws_config::imds::client::Client;\n    /// # async fn docs() {\n    /// let client = Client::builder().build();\n    /// let ami_id = client\n    ///   .get(\"/latest/meta-data/ami-id\")\n    ///   .await\n    ///   .expect(\"failure communicating with IMDS\");\n    /// # }\n    /// ```\n    pub async fn get(&self, path: impl Into<String>) -> Result<SensitiveString, ImdsError> {\n        self.operation\n            .invoke(path.into())\n            .await\n            .map_err(|err| match err {\n                SdkError::ConstructionFailure(_) if err.source().is_some() => {\n                    match err.into_source().map(|e| e.downcast::<ImdsError>()) {\n                        Ok(Ok(token_failure)) => *token_failure,\n                        Ok(Err(err)) => ImdsError::unexpected(err),\n                        Err(err) => ImdsError::unexpected(err),\n                    }\n                }\n                SdkError::ConstructionFailure(_) => ImdsError::unexpected(err),\n                SdkError::ServiceError(context) => match context.err() {\n                    InnerImdsError::InvalidUtf8 => {\n                        ImdsError::unexpected(\"IMDS returned invalid UTF-8\")\n                    }\n                    InnerImdsError::BadStatus => ImdsError::error_response(context.into_raw()),\n                },\n                // If the error source is an ImdsError, then we need to directly return that source.\n                // That way, the IMDS token provider's errors can become the top-level ImdsError.\n                // There is a unit test that checks the correct error is being extracted.\n                err @ SdkError::DispatchFailure(_) => match err.into_source() {\n                    Ok(source) => match source.downcast::<ConnectorError>() {\n                        Ok(source) => match source.into_source().downcast::<ImdsError>() {\n                            Ok(source) => *source,\n                            Err(err) => ImdsError::unexpected(err),\n                        },\n                        Err(err) => ImdsError::unexpected(err),\n                    },\n                    Err(err) => ImdsError::unexpected(err),\n                },\n                SdkError::TimeoutError(_) | SdkError::ResponseError(_) => ImdsError::io_error(err),\n                _ => ImdsError::unexpected(err),\n            })\n    }\n}\n\n/// New-type around `String` that doesn't emit the string value in the `Debug` impl.\n#[derive(Clone)]\npub struct SensitiveString(String);\n\nimpl fmt::Debug for SensitiveString {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        f.debug_tuple(\"SensitiveString\")\n            .field(&\"** redacted **\")\n            .finish()\n    }\n}\n\nimpl AsRef<str> for SensitiveString {\n    fn as_ref(&self) -> &str {\n        &self.0\n    }\n}\n\nimpl From<String> for SensitiveString {\n    fn from(value: String) -> Self {\n        Self(value)\n    }\n}\n\nimpl From<SensitiveString> for String {\n    fn from(value: SensitiveString) -> Self {\n        value.0\n    }\n}\n\n/// Runtime plugin that is used by both the IMDS client and the inner client that resolves\n/// the IMDS token and attaches it to requests. This runtime plugin marks the responses as\n/// sensitive, configures user agent headers, and sets up retries and timeouts.\n#[derive(Debug)]\nstruct ImdsCommonRuntimePlugin {\n    config: FrozenLayer,\n    components: RuntimeComponentsBuilder,\n}\n\nimpl ImdsCommonRuntimePlugin {\n    fn new(\n        config: &ProviderConfig,\n        endpoint_resolver: ImdsEndpointResolver,\n        retry_config: RetryConfig,\n        retry_classifier: SharedRetryClassifier,\n        timeout_config: TimeoutConfig,\n    ) -> Self {\n        let mut layer = Layer::new(\"ImdsCommonRuntimePlugin\");\n        layer.store_put(AuthSchemeOptionResolverParams::new(()));\n        layer.store_put(EndpointResolverParams::new(()));\n        layer.store_put(SensitiveOutput);\n        layer.store_put(retry_config);\n        layer.store_put(timeout_config);\n        layer.store_put(user_agent());\n\n        Self {\n            config: layer.freeze(),\n            components: RuntimeComponentsBuilder::new(\"ImdsCommonRuntimePlugin\")\n                .with_http_client(config.http_client())\n                .with_endpoint_resolver(Some(endpoint_resolver))\n                .with_interceptor(UserAgentInterceptor::new())\n                .with_retry_classifier(retry_classifier)\n                .with_retry_strategy(Some(StandardRetryStrategy::new()))\n                .with_time_source(Some(config.time_source()))\n                .with_sleep_impl(config.sleep_impl()),\n        }\n    }\n}\n\nimpl RuntimePlugin for ImdsCommonRuntimePlugin {\n    fn config(&self) -> Option<FrozenLayer> {\n        Some(self.config.clone())\n    }\n\n    fn runtime_components(\n        &self,\n        _current_components: &RuntimeComponentsBuilder,\n    ) -> Cow<'_, RuntimeComponentsBuilder> {\n        Cow::Borrowed(&self.components)\n    }\n}\n\n/// IMDSv2 Endpoint Mode\n///\n/// IMDS can be accessed in two ways:\n/// 1. Via the IpV4 endpoint: `http://169.254.169.254`\n/// 2. Via the Ipv6 endpoint: `http://[fd00:ec2::254]`\n#[derive(Debug, Clone)]\n#[non_exhaustive]\npub enum EndpointMode {\n    /// IpV4 mode: `http://169.254.169.254`\n    ///\n    /// This mode is the default unless otherwise specified.\n    IpV4,\n    /// IpV6 mode: `http://[fd00:ec2::254]`\n    IpV6,\n}\n\nimpl FromStr for EndpointMode {\n    type Err = InvalidEndpointMode;\n\n    fn from_str(value: &str) -> Result<Self, Self::Err> {\n        match value {\n            _ if value.eq_ignore_ascii_case(\"ipv4\") => Ok(EndpointMode::IpV4),\n            _ if value.eq_ignore_ascii_case(\"ipv6\") => Ok(EndpointMode::IpV6),\n            other => Err(InvalidEndpointMode::new(other.to_owned())),\n        }\n    }\n}\n\nimpl EndpointMode {\n    /// IMDS URI for this endpoint mode\n    fn endpoint(&self) -> Uri {\n        match self {\n            EndpointMode::IpV4 => Uri::from_static(\"http://169.254.169.254\"),\n            EndpointMode::IpV6 => Uri::from_static(\"http://[fd00:ec2::254]\"),\n        }\n    }\n}\n\n/// IMDSv2 Client Builder\n#[derive(Default, Debug, Clone)]\npub struct Builder {\n    max_attempts: Option<u32>,\n    endpoint: Option<EndpointSource>,\n    mode_override: Option<EndpointMode>,\n    token_ttl: Option<Duration>,\n    connect_timeout: Option<Duration>,\n    read_timeout: Option<Duration>,\n    operation_timeout: Option<Duration>,\n    operation_attempt_timeout: Option<Duration>,\n    config: Option<ProviderConfig>,\n    retry_classifier: Option<SharedRetryClassifier>,\n}\n\nimpl Builder {\n    /// Override the number of retries for fetching tokens & metadata\n    ///\n    /// By default, 4 attempts will be made.\n    pub fn max_attempts(mut self, max_attempts: u32) -> Self {\n        self.max_attempts = Some(max_attempts);\n        self\n    }\n\n    /// Configure generic options of the [`Client`]\n    ///\n    /// # Examples\n    /// ```no_run\n    /// # async fn test() {\n    /// use aws_config::imds::Client;\n    /// use aws_config::provider_config::ProviderConfig;\n    ///\n    /// let provider = Client::builder()\n    ///     .configure(&ProviderConfig::with_default_region().await)\n    ///     .build();\n    /// # }\n    /// ```\n    pub fn configure(mut self, provider_config: &ProviderConfig) -> Self {\n        self.config = Some(provider_config.clone());\n        self\n    }\n\n    /// Override the endpoint for the [`Client`]\n    ///\n    /// By default, the client will resolve an endpoint from the environment, AWS config, and endpoint mode.\n    ///\n    /// See [`Client`] for more information.\n    pub fn endpoint(mut self, endpoint: impl AsRef<str>) -> Result<Self, BoxError> {\n        let uri: Uri = endpoint.as_ref().parse()?;\n        self.endpoint = Some(EndpointSource::Explicit(uri));\n        Ok(self)\n    }\n\n    /// Override the endpoint mode for [`Client`]\n    ///\n    /// * When set to [`IpV4`](EndpointMode::IpV4), the endpoint will be `http://169.254.169.254`.\n    /// * When set to [`IpV6`](EndpointMode::IpV6), the endpoint will be `http://[fd00:ec2::254]`.\n    pub fn endpoint_mode(mut self, mode: EndpointMode) -> Self {\n        self.mode_override = Some(mode);\n        self\n    }\n\n    /// Override the time-to-live for the session token\n    ///\n    /// Requests to IMDS utilize a session token for authentication. By default, session tokens last\n    /// for 6 hours. When the TTL for the token expires, a new token must be retrieved from the\n    /// metadata service.\n    pub fn token_ttl(mut self, ttl: Duration) -> Self {\n        self.token_ttl = Some(ttl);\n        self\n    }\n\n    /// Override the connect timeout for IMDS\n    ///\n    /// This value defaults to 1 second\n    pub fn connect_timeout(mut self, timeout: Duration) -> Self {\n        self.connect_timeout = Some(timeout);\n        self\n    }\n\n    /// Override the read timeout for IMDS\n    ///\n    /// This value defaults to 1 second\n    pub fn read_timeout(mut self, timeout: Duration) -> Self {\n        self.read_timeout = Some(timeout);\n        self\n    }\n\n    /// Override the operation timeout for IMDS\n    ///\n    /// This value defaults to 1 second\n    pub fn operation_timeout(mut self, timeout: Duration) -> Self {\n        self.operation_timeout = Some(timeout);\n        self\n    }\n\n    /// Override the operation attempt timeout for IMDS\n    ///\n    /// This value defaults to 1 second\n    pub fn operation_attempt_timeout(mut self, timeout: Duration) -> Self {\n        self.operation_attempt_timeout = Some(timeout);\n        self\n    }\n\n    /// Override the retry classifier for IMDS\n    ///\n    /// This defaults to only retrying on server errors and 401s. The [ImdsResponseRetryClassifier] in this\n    /// module offers some configuration options and can be wrapped by[SharedRetryClassifier::new()] for use\n    /// here or you can create your own fully customized [SharedRetryClassifier].\n    pub fn retry_classifier(mut self, retry_classifier: SharedRetryClassifier) -> Self {\n        self.retry_classifier = Some(retry_classifier);\n        self\n    }\n\n    /* TODO(https://github.com/awslabs/aws-sdk-rust/issues/339): Support customizing the port explicitly */\n    /*\n    pub fn port(mut self, port: u32) -> Self {\n        self.port_override = Some(port);\n        self\n    }*/\n\n    /// Build an IMDSv2 Client\n    pub fn build(self) -> Client {\n        let config = self.config.unwrap_or_default();\n        let timeout_config = TimeoutConfig::builder()\n            .connect_timeout(self.connect_timeout.unwrap_or(DEFAULT_CONNECT_TIMEOUT))\n            .read_timeout(self.read_timeout.unwrap_or(DEFAULT_READ_TIMEOUT))\n            .operation_attempt_timeout(\n                self.operation_attempt_timeout\n                    .unwrap_or(DEFAULT_OPERATION_ATTEMPT_TIMEOUT),\n            )\n            .operation_timeout(self.operation_timeout.unwrap_or(DEFAULT_OPERATION_TIMEOUT))\n            .build();\n        let endpoint_source = self\n            .endpoint\n            .unwrap_or_else(|| EndpointSource::Env(config.clone()));\n        let endpoint_resolver = ImdsEndpointResolver {\n            endpoint_source: Arc::new(endpoint_source),\n            mode_override: self.mode_override,\n        };\n        let retry_config = RetryConfig::standard()\n            .with_max_attempts(self.max_attempts.unwrap_or(DEFAULT_ATTEMPTS));\n        let retry_classifier = self.retry_classifier.unwrap_or(SharedRetryClassifier::new(\n            ImdsResponseRetryClassifier::default(),\n        ));\n        let common_plugin = SharedRuntimePlugin::new(ImdsCommonRuntimePlugin::new(\n            &config,\n            endpoint_resolver,\n            retry_config,\n            retry_classifier,\n            timeout_config,\n        ));\n        let operation = Operation::builder()\n            .service_name(\"imds\")\n            .operation_name(\"get\")\n            .runtime_plugin(common_plugin.clone())\n            .runtime_plugin(TokenRuntimePlugin::new(\n                common_plugin,\n                self.token_ttl.unwrap_or(DEFAULT_TOKEN_TTL),\n            ))\n            .runtime_plugin(\n                MetricsRuntimePlugin::builder()\n                    .with_scope(\"aws_config::imds_credentials\")\n                    .with_time_source(config.time_source())\n                    .with_metadata(Metadata::new(\"get_credentials\", \"imds\"))\n                    .build()\n                    .expect(\"All required fields have been set\"),\n            )\n            .with_connection_poisoning()\n            .serializer(|path| {\n                Ok(HttpRequest::try_from(\n                    http::Request::builder()\n                        .uri(path)\n                        .body(SdkBody::empty())\n                        .expect(\"valid request\"),\n                )\n                .unwrap())\n            })\n            .deserializer(|response| {\n                if response.status().is_success() {\n                    std::str::from_utf8(response.body().bytes().expect(\"non-streaming response\"))\n                        .map(|data| SensitiveString::from(data.to_string()))\n                        .map_err(|_| OrchestratorError::operation(InnerImdsError::InvalidUtf8))\n                } else {\n                    Err(OrchestratorError::operation(InnerImdsError::BadStatus))\n                }\n            })\n            .build();\n        Client { operation }\n    }\n}\n\nmod env {\n    pub(super) const ENDPOINT: &str = \"AWS_EC2_METADATA_SERVICE_ENDPOINT\";\n    pub(super) const ENDPOINT_MODE: &str = \"AWS_EC2_METADATA_SERVICE_ENDPOINT_MODE\";\n}\n\nmod profile_keys {\n    pub(super) const ENDPOINT: &str = \"ec2_metadata_service_endpoint\";\n    pub(super) const ENDPOINT_MODE: &str = \"ec2_metadata_service_endpoint_mode\";\n}\n\n/// Endpoint Configuration Abstraction\n#[derive(Debug, Clone)]\nenum EndpointSource {\n    Explicit(Uri),\n    Env(ProviderConfig),\n}\n\nimpl EndpointSource {\n    async fn endpoint(&self, mode_override: Option<EndpointMode>) -> Result<Uri, BuildError> {\n        match self {\n            EndpointSource::Explicit(uri) => {\n                if mode_override.is_some() {\n                    tracing::warn!(endpoint = ?uri, mode = ?mode_override,\n                        \"Endpoint mode override was set in combination with an explicit endpoint. \\\n                        The mode override will be ignored.\")\n                }\n                Ok(uri.clone())\n            }\n            EndpointSource::Env(conf) => {\n                let env = conf.env();\n                // load an endpoint override from the environment\n                let profile = conf.profile().await;\n                let uri_override = if let Ok(uri) = env.get(env::ENDPOINT) {\n                    Some(Cow::Owned(uri))\n                } else {\n                    profile\n                        .and_then(|profile| profile.get(profile_keys::ENDPOINT))\n                        .map(Cow::Borrowed)\n                };\n                if let Some(uri) = uri_override {\n                    return Uri::try_from(uri.as_ref()).map_err(BuildError::invalid_endpoint_uri);\n                }\n\n                // if not, load a endpoint mode from the environment\n                let mode = if let Some(mode) = mode_override {\n                    mode\n                } else if let Ok(mode) = env.get(env::ENDPOINT_MODE) {\n                    mode.parse::<EndpointMode>()\n                        .map_err(BuildError::invalid_endpoint_mode)?\n                } else if let Some(mode) = profile.and_then(|p| p.get(profile_keys::ENDPOINT_MODE))\n                {\n                    mode.parse::<EndpointMode>()\n                        .map_err(BuildError::invalid_endpoint_mode)?\n                } else {\n                    EndpointMode::IpV4\n                };\n\n                Ok(mode.endpoint())\n            }\n        }\n    }\n}\n\n#[derive(Clone, Debug)]\nstruct ImdsEndpointResolver {\n    endpoint_source: Arc<EndpointSource>,\n    mode_override: Option<EndpointMode>,\n}\n\nimpl ResolveEndpoint for ImdsEndpointResolver {\n    fn resolve_endpoint<'a>(&'a self, _: &'a EndpointResolverParams) -> EndpointFuture<'a> {\n        EndpointFuture::new(async move {\n            self.endpoint_source\n                .endpoint(self.mode_override.clone())\n                .await\n                .map(|uri| Endpoint::builder().url(uri.to_string()).build())\n                .map_err(|err| err.into())\n        })\n    }\n}\n\n/// IMDS Response Retry Classifier\n///\n/// Possible status codes:\n/// - 200 (OK)\n/// - 400 (Missing or invalid parameters) **Not Retryable**\n/// - 401 (Unauthorized, expired token) **Retryable**\n/// - 403 (IMDS disabled): **Not Retryable**\n/// - 404 (Not found): **Not Retryable**\n/// - >=500 (server error): **Retryable**\n/// - Timeouts: Not retried by default, but this is configurable via [Self::with_retry_connect_timeouts()]\n#[derive(Clone, Debug, Default)]\n#[non_exhaustive]\npub struct ImdsResponseRetryClassifier {\n    retry_connect_timeouts: bool,\n}\n\nimpl ImdsResponseRetryClassifier {\n    /// Indicate whether the IMDS client should retry on connection timeouts\n    pub fn with_retry_connect_timeouts(mut self, retry_connect_timeouts: bool) -> Self {\n        self.retry_connect_timeouts = retry_connect_timeouts;\n        self\n    }\n}\n\nimpl ClassifyRetry for ImdsResponseRetryClassifier {\n    fn name(&self) -> &'static str {\n        \"ImdsResponseRetryClassifier\"\n    }\n\n    fn classify_retry(&self, ctx: &InterceptorContext) -> RetryAction {\n        if let Some(response) = ctx.response() {\n            let status = response.status();\n            match status {\n                _ if status.is_server_error() => RetryAction::server_error(),\n                // 401 indicates that the token has expired, this is retryable\n                _ if status.as_u16() == 401 => RetryAction::server_error(),\n                // This catch-all includes successful responses that fail to parse. These should not be retried.\n                _ => RetryAction::NoActionIndicated,\n            }\n        } else if self.retry_connect_timeouts {\n            RetryAction::server_error()\n        } else {\n            // This is the default behavior.\n            // Don't retry timeouts for IMDS, or else it will take ~30 seconds for the default\n            // credentials provider chain to fail to provide credentials.\n            // Also don't retry non-responses.\n            RetryAction::NoActionIndicated\n        }\n    }\n}\n\n#[cfg(test)]\npub(crate) mod test {\n    use crate::imds::client::{Client, EndpointMode, ImdsResponseRetryClassifier};\n    use crate::provider_config::ProviderConfig;\n    use aws_smithy_async::rt::sleep::TokioSleep;\n    use aws_smithy_async::test_util::{instant_time_and_sleep, InstantSleep};\n    use aws_smithy_http_client::test_util::{capture_request, ReplayEvent, StaticReplayClient};\n    use aws_smithy_runtime::test_util::capture_test_logs::capture_test_logs;\n    use aws_smithy_runtime_api::client::interceptors::context::{\n        Input, InterceptorContext, Output,\n    };\n    use aws_smithy_runtime_api::client::orchestrator::OrchestratorError;\n    use aws_smithy_runtime_api::client::orchestrator::{HttpRequest, HttpResponse};\n    use aws_smithy_runtime_api::client::result::ConnectorError;\n    use aws_smithy_runtime_api::client::retries::classifiers::{\n        ClassifyRetry, RetryAction, SharedRetryClassifier,\n    };\n    use aws_smithy_types::body::SdkBody;\n    use aws_smithy_types::error::display::DisplayErrorContext;\n    use aws_types::os_shim_internal::{Env, Fs};\n    use http::header::USER_AGENT;\n    use http::Uri;\n    use serde::Deserialize;\n    use std::collections::HashMap;\n    use std::error::Error;\n    use std::io;\n    use std::time::SystemTime;\n    use std::time::{Duration, UNIX_EPOCH};\n    use tracing_test::traced_test;\n\n    macro_rules! assert_full_error_contains {\n        ($err:expr, $contains:expr) => {\n            let err = $err;\n            let message = format!(\n                \"{}\",\n                aws_smithy_types::error::display::DisplayErrorContext(&err)\n            );\n            assert!(\n                message.contains($contains),\n                \"Error message '{message}' didn't contain text '{}'\",\n                $contains\n            );\n        };\n    }\n\n    const TOKEN_A: &str = \"AQAEAFTNrA4eEGx0AQgJ1arIq_Cc-t4tWt3fB0Hd8RKhXlKc5ccvhg==\";\n    const TOKEN_B: &str = \"alternatetoken==\";\n\n    /// Create a simple token request\n    pub(crate) fn token_request(base: &str, ttl: u32) -> HttpRequest {\n        http::Request::builder()\n            .uri(format!(\"{}/latest/api/token\", base))\n            .header(\"x-aws-ec2-metadata-token-ttl-seconds\", ttl)\n            .method(\"PUT\")\n            .body(SdkBody::empty())\n            .unwrap()\n            .try_into()\n            .unwrap()\n    }\n\n    /// Create a simple token response\n    pub(crate) fn token_response(ttl: u32, token: &'static str) -> HttpResponse {\n        HttpResponse::try_from(\n            http::Response::builder()\n                .status(200)\n                .header(\"X-aws-ec2-metadata-token-ttl-seconds\", ttl)\n                .body(SdkBody::from(token))\n                .unwrap(),\n        )\n        .unwrap()\n    }\n\n    /// Create a simple IMDS request\n    pub(crate) fn imds_request(path: &'static str, token: &str) -> HttpRequest {\n        http::Request::builder()\n            .uri(Uri::from_static(path))\n            .method(\"GET\")\n            .header(\"x-aws-ec2-metadata-token\", token)\n            .body(SdkBody::empty())\n            .unwrap()\n            .try_into()\n            .unwrap()\n    }\n\n    /// Create a simple IMDS response\n    pub(crate) fn imds_response(body: &'static str) -> HttpResponse {\n        HttpResponse::try_from(\n            http::Response::builder()\n                .status(200)\n                .body(SdkBody::from(body))\n                .unwrap(),\n        )\n        .unwrap()\n    }\n\n    /// Create an IMDS client with an underlying [StaticReplayClient]\n    pub(crate) fn make_imds_client(http_client: &StaticReplayClient) -> super::Client {\n        tokio::time::pause();\n        super::Client::builder()\n            .configure(\n                &ProviderConfig::no_configuration()\n                    .with_sleep_impl(InstantSleep::unlogged())\n                    .with_http_client(http_client.clone()),\n            )\n            .build()\n    }\n\n    fn mock_imds_client(events: Vec<ReplayEvent>) -> (Client, StaticReplayClient) {\n        let http_client = StaticReplayClient::new(events);\n        let client = make_imds_client(&http_client);\n        (client, http_client)\n    }\n\n    #[tokio::test]\n    async fn client_caches_token() {\n        let (client, http_client) = mock_imds_client(vec![\n            ReplayEvent::new(\n                token_request(\"http://169.254.169.254\", 21600),\n                token_response(21600, TOKEN_A),\n            ),\n            ReplayEvent::new(\n                imds_request(\"http://169.254.169.254/latest/metadata\", TOKEN_A),\n                imds_response(r#\"test-imds-output\"#),\n            ),\n            ReplayEvent::new(\n                imds_request(\"http://169.254.169.254/latest/metadata2\", TOKEN_A),\n                imds_response(\"output2\"),\n            ),\n        ]);\n        // load once\n        let metadata = client.get(\"/latest/metadata\").await.expect(\"failed\");\n        assert_eq!(\"test-imds-output\", metadata.as_ref());\n        // load again: the cached token should be used\n        let metadata = client.get(\"/latest/metadata2\").await.expect(\"failed\");\n        assert_eq!(\"output2\", metadata.as_ref());\n        http_client.assert_requests_match(&[]);\n    }\n\n    #[tokio::test]\n    async fn token_can_expire() {\n        let (_, http_client) = mock_imds_client(vec![\n            ReplayEvent::new(\n                token_request(\"http://[fd00:ec2::254]\", 600),\n                token_response(600, TOKEN_A),\n            ),\n            ReplayEvent::new(\n                imds_request(\"http://[fd00:ec2::254]/latest/metadata\", TOKEN_A),\n                imds_response(r#\"test-imds-output1\"#),\n            ),\n            ReplayEvent::new(\n                token_request(\"http://[fd00:ec2::254]\", 600),\n                token_response(600, TOKEN_B),\n            ),\n            ReplayEvent::new(\n                imds_request(\"http://[fd00:ec2::254]/latest/metadata\", TOKEN_B),\n                imds_response(r#\"test-imds-output2\"#),\n            ),\n        ]);\n        let (time_source, sleep) = instant_time_and_sleep(UNIX_EPOCH);\n        let client = super::Client::builder()\n            .configure(\n                &ProviderConfig::no_configuration()\n                    .with_http_client(http_client.clone())\n                    .with_time_source(time_source.clone())\n                    .with_sleep_impl(sleep),\n            )\n            .endpoint_mode(EndpointMode::IpV6)\n            .token_ttl(Duration::from_secs(600))\n            .build();\n\n        let resp1 = client.get(\"/latest/metadata\").await.expect(\"success\");\n        // now the cached credential has expired\n        time_source.advance(Duration::from_secs(600));\n        let resp2 = client.get(\"/latest/metadata\").await.expect(\"success\");\n        http_client.assert_requests_match(&[]);\n        assert_eq!(\"test-imds-output1\", resp1.as_ref());\n        assert_eq!(\"test-imds-output2\", resp2.as_ref());\n    }\n\n    /// Tokens are refreshed up to 120 seconds early to avoid using an expired token.\n    #[tokio::test]\n    async fn token_refresh_buffer() {\n        let _logs = capture_test_logs();\n        let (_, http_client) = mock_imds_client(vec![\n            ReplayEvent::new(\n                token_request(\"http://[fd00:ec2::254]\", 600),\n                token_response(600, TOKEN_A),\n            ),\n            // t = 0\n            ReplayEvent::new(\n                imds_request(\"http://[fd00:ec2::254]/latest/metadata\", TOKEN_A),\n                imds_response(r#\"test-imds-output1\"#),\n            ),\n            // t = 400 (no refresh)\n            ReplayEvent::new(\n                imds_request(\"http://[fd00:ec2::254]/latest/metadata\", TOKEN_A),\n                imds_response(r#\"test-imds-output2\"#),\n            ),\n            // t = 550 (within buffer)\n            ReplayEvent::new(\n                token_request(\"http://[fd00:ec2::254]\", 600),\n                token_response(600, TOKEN_B),\n            ),\n            ReplayEvent::new(\n                imds_request(\"http://[fd00:ec2::254]/latest/metadata\", TOKEN_B),\n                imds_response(r#\"test-imds-output3\"#),\n            ),\n        ]);\n        let (time_source, sleep) = instant_time_and_sleep(UNIX_EPOCH);\n        let client = super::Client::builder()\n            .configure(\n                &ProviderConfig::no_configuration()\n                    .with_sleep_impl(sleep)\n                    .with_http_client(http_client.clone())\n                    .with_time_source(time_source.clone()),\n            )\n            .endpoint_mode(EndpointMode::IpV6)\n            .token_ttl(Duration::from_secs(600))\n            .build();\n\n        tracing::info!(\"resp1 -----------------------------------------------------------\");\n        let resp1 = client.get(\"/latest/metadata\").await.expect(\"success\");\n        // now the cached credential has expired\n        time_source.advance(Duration::from_secs(400));\n        tracing::info!(\"resp2 -----------------------------------------------------------\");\n        let resp2 = client.get(\"/latest/metadata\").await.expect(\"success\");\n        time_source.advance(Duration::from_secs(150));\n        tracing::info!(\"resp3 -----------------------------------------------------------\");\n        let resp3 = client.get(\"/latest/metadata\").await.expect(\"success\");\n        http_client.assert_requests_match(&[]);\n        assert_eq!(\"test-imds-output1\", resp1.as_ref());\n        assert_eq!(\"test-imds-output2\", resp2.as_ref());\n        assert_eq!(\"test-imds-output3\", resp3.as_ref());\n    }\n\n    /// 500 error during the GET should be retried\n    #[tokio::test]\n    #[traced_test]\n    async fn retry_500() {\n        let (client, http_client) = mock_imds_client(vec![\n            ReplayEvent::new(\n                token_request(\"http://169.254.169.254\", 21600),\n                token_response(21600, TOKEN_A),\n            ),\n            ReplayEvent::new(\n                imds_request(\"http://169.254.169.254/latest/metadata\", TOKEN_A),\n                http::Response::builder()\n                    .status(500)\n                    .body(SdkBody::empty())\n                    .unwrap(),\n            ),\n            ReplayEvent::new(\n                imds_request(\"http://169.254.169.254/latest/metadata\", TOKEN_A),\n                imds_response(\"ok\"),\n            ),\n        ]);\n        assert_eq!(\n            \"ok\",\n            client\n                .get(\"/latest/metadata\")\n                .await\n                .expect(\"success\")\n                .as_ref()\n        );\n        http_client.assert_requests_match(&[]);\n\n        // all requests should have a user agent header\n        for request in http_client.actual_requests() {\n            assert!(request.headers().get(USER_AGENT).is_some());\n        }\n    }\n\n    /// 500 error during token acquisition should be retried\n    #[tokio::test]\n    #[traced_test]\n    async fn retry_token_failure() {\n        let (client, http_client) = mock_imds_client(vec![\n            ReplayEvent::new(\n                token_request(\"http://169.254.169.254\", 21600),\n                http::Response::builder()\n                    .status(500)\n                    .body(SdkBody::empty())\n                    .unwrap(),\n            ),\n            ReplayEvent::new(\n                token_request(\"http://169.254.169.254\", 21600),\n                token_response(21600, TOKEN_A),\n            ),\n            ReplayEvent::new(\n                imds_request(\"http://169.254.169.254/latest/metadata\", TOKEN_A),\n                imds_response(\"ok\"),\n            ),\n        ]);\n        assert_eq!(\n            \"ok\",\n            client\n                .get(\"/latest/metadata\")\n                .await\n                .expect(\"success\")\n                .as_ref()\n        );\n        http_client.assert_requests_match(&[]);\n    }\n\n    /// 401 error during metadata retrieval must be retried\n    #[tokio::test]\n    #[traced_test]\n    async fn retry_metadata_401() {\n        let (client, http_client) = mock_imds_client(vec![\n            ReplayEvent::new(\n                token_request(\"http://169.254.169.254\", 21600),\n                token_response(0, TOKEN_A),\n            ),\n            ReplayEvent::new(\n                imds_request(\"http://169.254.169.254/latest/metadata\", TOKEN_A),\n                http::Response::builder()\n                    .status(401)\n                    .body(SdkBody::empty())\n                    .unwrap(),\n            ),\n            ReplayEvent::new(\n                token_request(\"http://169.254.169.254\", 21600),\n                token_response(21600, TOKEN_B),\n            ),\n            ReplayEvent::new(\n                imds_request(\"http://169.254.169.254/latest/metadata\", TOKEN_B),\n                imds_response(\"ok\"),\n            ),\n        ]);\n        assert_eq!(\n            \"ok\",\n            client\n                .get(\"/latest/metadata\")\n                .await\n                .expect(\"success\")\n                .as_ref()\n        );\n        http_client.assert_requests_match(&[]);\n    }\n\n    /// 403 responses from IMDS during token acquisition MUST NOT be retried\n    #[tokio::test]\n    #[traced_test]\n    async fn no_403_retry() {\n        let (client, http_client) = mock_imds_client(vec![ReplayEvent::new(\n            token_request(\"http://169.254.169.254\", 21600),\n            http::Response::builder()\n                .status(403)\n                .body(SdkBody::empty())\n                .unwrap(),\n        )]);\n        let err = client.get(\"/latest/metadata\").await.expect_err(\"no token\");\n        assert_full_error_contains!(err, \"forbidden\");\n        http_client.assert_requests_match(&[]);\n    }\n\n    /// The classifier should return `None` when classifying a successful response.\n    #[test]\n    fn successful_response_properly_classified() {\n        let mut ctx = InterceptorContext::new(Input::doesnt_matter());\n        ctx.set_output_or_error(Ok(Output::doesnt_matter()));\n        ctx.set_response(imds_response(\"\").map(|_| SdkBody::empty()));\n        let classifier = ImdsResponseRetryClassifier::default();\n        assert_eq!(\n            RetryAction::NoActionIndicated,\n            classifier.classify_retry(&ctx)\n        );\n\n        // Emulate a failure to parse the response body (using an io error since it's easy to construct in a test)\n        let mut ctx = InterceptorContext::new(Input::doesnt_matter());\n        ctx.set_output_or_error(Err(OrchestratorError::connector(ConnectorError::io(\n            io::Error::new(io::ErrorKind::BrokenPipe, \"fail to parse\").into(),\n        ))));\n        assert_eq!(\n            RetryAction::NoActionIndicated,\n            classifier.classify_retry(&ctx)\n        );\n    }\n\n    /// User provided retry classifier works\n    #[tokio::test]\n    async fn user_provided_retry_classifier() {\n        #[derive(Clone, Debug)]\n        struct UserProvidedRetryClassifier;\n\n        impl ClassifyRetry for UserProvidedRetryClassifier {\n            fn name(&self) -> &'static str {\n                \"UserProvidedRetryClassifier\"\n            }\n\n            // Don't retry anything\n            fn classify_retry(&self, _ctx: &InterceptorContext) -> RetryAction {\n                RetryAction::RetryForbidden\n            }\n        }\n\n        let events = vec![\n            ReplayEvent::new(\n                token_request(\"http://169.254.169.254\", 21600),\n                token_response(0, TOKEN_A),\n            ),\n            ReplayEvent::new(\n                imds_request(\"http://169.254.169.254/latest/metadata\", TOKEN_A),\n                http::Response::builder()\n                    .status(401)\n                    .body(SdkBody::empty())\n                    .unwrap(),\n            ),\n            ReplayEvent::new(\n                token_request(\"http://169.254.169.254\", 21600),\n                token_response(21600, TOKEN_B),\n            ),\n            ReplayEvent::new(\n                imds_request(\"http://169.254.169.254/latest/metadata\", TOKEN_B),\n                imds_response(\"ok\"),\n            ),\n        ];\n        let http_client = StaticReplayClient::new(events);\n\n        let imds_client = super::Client::builder()\n            .configure(\n                &ProviderConfig::no_configuration()\n                    .with_sleep_impl(InstantSleep::unlogged())\n                    .with_http_client(http_client.clone()),\n            )\n            .retry_classifier(SharedRetryClassifier::new(UserProvidedRetryClassifier))\n            .build();\n\n        let res = imds_client\n            .get(\"/latest/metadata\")\n            .await\n            .expect_err(\"Client should error\");\n\n        // Assert that the operation errored on the initial 401 and did not retry and get\n        // the 200 (since the user provided retry classifier never retries)\n        assert_full_error_contains!(res, \"401\");\n    }\n\n    // since tokens are sent as headers, the tokens need to be valid header values\n    #[tokio::test]\n    async fn invalid_token() {\n        let (client, http_client) = mock_imds_client(vec![ReplayEvent::new(\n            token_request(\"http://169.254.169.254\", 21600),\n            token_response(21600, \"invalid\\nheader\\nvalue\\0\"),\n        )]);\n        let err = client.get(\"/latest/metadata\").await.expect_err(\"no token\");\n        assert_full_error_contains!(err, \"invalid token\");\n        http_client.assert_requests_match(&[]);\n    }\n\n    #[tokio::test]\n    async fn non_utf8_response() {\n        let (client, http_client) = mock_imds_client(vec![\n            ReplayEvent::new(\n                token_request(\"http://169.254.169.254\", 21600),\n                token_response(21600, TOKEN_A).map(SdkBody::from),\n            ),\n            ReplayEvent::new(\n                imds_request(\"http://169.254.169.254/latest/metadata\", TOKEN_A),\n                http::Response::builder()\n                    .status(200)\n                    .body(SdkBody::from(vec![0xA0, 0xA1]))\n                    .unwrap(),\n            ),\n        ]);\n        let err = client.get(\"/latest/metadata\").await.expect_err(\"no token\");\n        assert_full_error_contains!(err, \"invalid UTF-8\");\n        http_client.assert_requests_match(&[]);\n    }\n\n    // TODO(https://github.com/awslabs/aws-sdk-rust/issues/1117) This test is ignored on Windows because it uses Unix-style paths\n    #[cfg_attr(windows, ignore)]\n    /// Verify that the end-to-end real client has a 1-second connect timeout\n    #[tokio::test]\n    #[cfg(feature = \"default-https-client\")]\n    async fn one_second_connect_timeout() {\n        use crate::imds::client::ImdsError;\n        let client = Client::builder()\n            // 240.* can never be resolved\n            .endpoint(\"http://240.0.0.0\")\n            .expect(\"valid uri\")\n            .build();\n        let now = SystemTime::now();\n        let resp = client\n            .get(\"/latest/metadata\")\n            .await\n            .expect_err(\"240.0.0.0 will never resolve\");\n        match resp {\n            err @ ImdsError::FailedToLoadToken(_)\n                if format!(\"{}\", DisplayErrorContext(&err)).contains(\"timeout\") => {} // ok,\n            other => panic!(\n                \"wrong error, expected construction failure with TimedOutError inside: {}\",\n                DisplayErrorContext(&other)\n            ),\n        }\n        let time_elapsed = now.elapsed().unwrap();\n        assert!(\n            time_elapsed > Duration::from_secs(1),\n            \"time_elapsed should be greater than 1s but was {:?}\",\n            time_elapsed\n        );\n        assert!(\n            time_elapsed < Duration::from_secs(2),\n            \"time_elapsed should be less than 2s but was {:?}\",\n            time_elapsed\n        );\n    }\n\n    /// Retry classifier properly retries timeouts when configured to (meaning it takes ~30s to fail)\n    #[tokio::test]\n    async fn retry_connect_timeouts() {\n        let http_client = StaticReplayClient::new(vec![]);\n        let imds_client = super::Client::builder()\n            .retry_classifier(SharedRetryClassifier::new(\n                ImdsResponseRetryClassifier::default().with_retry_connect_timeouts(true),\n            ))\n            .configure(&ProviderConfig::no_configuration().with_http_client(http_client.clone()))\n            .operation_timeout(Duration::from_secs(1))\n            .endpoint(\"http://240.0.0.0\")\n            .expect(\"valid uri\")\n            .build();\n\n        let now = SystemTime::now();\n        let _res = imds_client\n            .get(\"/latest/metadata\")\n            .await\n            .expect_err(\"240.0.0.0 will never resolve\");\n        let time_elapsed: Duration = now.elapsed().unwrap();\n\n        assert!(\n            time_elapsed > Duration::from_secs(1),\n            \"time_elapsed should be greater than 1s but was {:?}\",\n            time_elapsed\n        );\n\n        assert!(\n            time_elapsed < Duration::from_secs(2),\n            \"time_elapsed should be less than 2s but was {:?}\",\n            time_elapsed\n        );\n    }\n\n    #[derive(Debug, Deserialize)]\n    struct ImdsConfigTest {\n        env: HashMap<String, String>,\n        fs: HashMap<String, String>,\n        endpoint_override: Option<String>,\n        mode_override: Option<String>,\n        result: Result<String, String>,\n        docs: String,\n    }\n\n    #[tokio::test]\n    async fn endpoint_config_tests() -> Result<(), Box<dyn Error>> {\n        let _logs = capture_test_logs();\n\n        let test_cases = std::fs::read_to_string(\"test-data/imds-config/imds-endpoint-tests.json\")?;\n        #[derive(Deserialize)]\n        struct TestCases {\n            tests: Vec<ImdsConfigTest>,\n        }\n\n        let test_cases: TestCases = serde_json::from_str(&test_cases)?;\n        let test_cases = test_cases.tests;\n        for test in test_cases {\n            check(test).await;\n        }\n        Ok(())\n    }\n\n    async fn check(test_case: ImdsConfigTest) {\n        let (http_client, watcher) = capture_request(None);\n        let provider_config = ProviderConfig::no_configuration()\n            .with_sleep_impl(TokioSleep::new())\n            .with_env(Env::from(test_case.env))\n            .with_fs(Fs::from_map(test_case.fs))\n            .with_http_client(http_client);\n        let mut imds_client = Client::builder().configure(&provider_config);\n        if let Some(endpoint_override) = test_case.endpoint_override {\n            imds_client = imds_client\n                .endpoint(endpoint_override)\n                .expect(\"invalid URI\");\n        }\n\n        if let Some(mode_override) = test_case.mode_override {\n            imds_client = imds_client.endpoint_mode(mode_override.parse().unwrap());\n        }\n\n        let imds_client = imds_client.build();\n        match &test_case.result {\n            Ok(uri) => {\n                // this request will fail, we just want to capture the endpoint configuration\n                let _ = imds_client.get(\"/hello\").await;\n                assert_eq!(&watcher.expect_request().uri().to_string(), uri);\n            }\n            Err(expected) => {\n                let err = imds_client.get(\"/hello\").await.expect_err(\"it should fail\");\n                let message = format!(\"{}\", DisplayErrorContext(&err));\n                assert!(\n                    message.contains(expected),\n                    \"{}\\nexpected error: {expected}\\nactual error: {message}\",\n                    test_case.docs\n                );\n            }\n        };\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/src/imds/credentials.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! IMDSv2 Credentials Provider\n//!\n//! # Important\n//! This credential provider will NOT fallback to IMDSv1. Ensure that IMDSv2 is enabled on your instances.\n\nuse super::client::error::ImdsError;\nuse crate::imds::{self, Client};\nuse crate::json_credentials::{parse_json_credentials, JsonCredentials, RefreshableCredentials};\nuse crate::provider_config::ProviderConfig;\nuse aws_credential_types::credential_feature::AwsCredentialFeature;\nuse aws_credential_types::provider::{self, error::CredentialsError, future, ProvideCredentials};\nuse aws_credential_types::Credentials;\nuse aws_smithy_async::time::SharedTimeSource;\nuse aws_types::os_shim_internal::Env;\nuse std::borrow::Cow;\nuse std::error::Error as StdError;\nuse std::fmt;\nuse std::sync::{Arc, RwLock};\nuse std::time::{Duration, SystemTime};\n\nconst CREDENTIAL_EXPIRATION_INTERVAL: Duration = Duration::from_secs(10 * 60);\nconst WARNING_FOR_EXTENDING_CREDENTIALS_EXPIRY: &str =\n    \"Attempting credential expiration extension due to a credential service availability issue. \\\n    A refresh of these credentials will be attempted again within the next\";\n\n#[derive(Debug)]\nstruct ImdsCommunicationError {\n    source: Box<dyn StdError + Send + Sync + 'static>,\n}\n\nimpl fmt::Display for ImdsCommunicationError {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        write!(f, \"could not communicate with IMDS\")\n    }\n}\n\nimpl StdError for ImdsCommunicationError {\n    fn source(&self) -> Option<&(dyn StdError + 'static)> {\n        Some(self.source.as_ref())\n    }\n}\n\n/// IMDSv2 Credentials Provider\n///\n/// _Note: This credentials provider will NOT fallback to the IMDSv1 flow._\n#[derive(Debug)]\npub struct ImdsCredentialsProvider {\n    client: Client,\n    env: Env,\n    profile: Option<String>,\n    time_source: SharedTimeSource,\n    last_retrieved_credentials: Arc<RwLock<Option<Credentials>>>,\n}\n\n/// Builder for [`ImdsCredentialsProvider`]\n#[derive(Default, Debug)]\npub struct Builder {\n    provider_config: Option<ProviderConfig>,\n    profile_override: Option<String>,\n    imds_override: Option<imds::Client>,\n    last_retrieved_credentials: Option<Credentials>,\n}\n\nimpl Builder {\n    /// Override the configuration used for this provider\n    pub fn configure(mut self, provider_config: &ProviderConfig) -> Self {\n        self.provider_config = Some(provider_config.clone());\n        self\n    }\n\n    /// Override the [instance profile](instance-profile) used for this provider.\n    ///\n    /// When retrieving IMDS credentials, a call must first be made to\n    /// `<IMDS_BASE_URL>/latest/meta-data/iam/security-credentials/`. This returns the instance\n    /// profile used. By setting this parameter, retrieving the profile is skipped\n    /// and the provided value is used instead.\n    ///\n    /// [instance-profile]: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html#ec2-instance-profile\n    pub fn profile(mut self, profile: impl Into<String>) -> Self {\n        self.profile_override = Some(profile.into());\n        self\n    }\n\n    /// Override the IMDS client used for this provider\n    ///\n    /// The IMDS client will be loaded and configured via `~/.aws/config` and environment variables,\n    /// however, if necessary the entire client may be provided directly.\n    ///\n    /// For more information about IMDS client configuration loading see [`imds::Client`]\n    pub fn imds_client(mut self, client: imds::Client) -> Self {\n        self.imds_override = Some(client);\n        self\n    }\n\n    #[allow(dead_code)]\n    #[cfg(test)]\n    fn last_retrieved_credentials(mut self, credentials: Credentials) -> Self {\n        self.last_retrieved_credentials = Some(credentials);\n        self\n    }\n\n    /// Create an [`ImdsCredentialsProvider`] from this builder.\n    pub fn build(self) -> ImdsCredentialsProvider {\n        let provider_config = self.provider_config.unwrap_or_default();\n        let env = provider_config.env();\n        let client = self\n            .imds_override\n            .unwrap_or_else(|| imds::Client::builder().configure(&provider_config).build());\n        ImdsCredentialsProvider {\n            client,\n            env,\n            profile: self.profile_override,\n            time_source: provider_config.time_source(),\n            last_retrieved_credentials: Arc::new(RwLock::new(self.last_retrieved_credentials)),\n        }\n    }\n}\n\nmod codes {\n    pub(super) const ASSUME_ROLE_UNAUTHORIZED_ACCESS: &str = \"AssumeRoleUnauthorizedAccess\";\n}\n\nimpl ProvideCredentials for ImdsCredentialsProvider {\n    fn provide_credentials<'a>(&'a self) -> future::ProvideCredentials<'a>\n    where\n        Self: 'a,\n    {\n        future::ProvideCredentials::new(self.credentials())\n    }\n\n    fn fallback_on_interrupt(&self) -> Option<Credentials> {\n        self.last_retrieved_credentials.read().unwrap().clone()\n    }\n}\n\nimpl ImdsCredentialsProvider {\n    /// Builder for [`ImdsCredentialsProvider`]\n    pub fn builder() -> Builder {\n        Builder::default()\n    }\n\n    fn imds_disabled(&self) -> bool {\n        match self.env.get(super::env::EC2_METADATA_DISABLED) {\n            Ok(value) => value.eq_ignore_ascii_case(\"true\"),\n            _ => false,\n        }\n    }\n\n    /// Retrieve the instance profile from IMDS\n    async fn get_profile_uncached(&self) -> Result<String, CredentialsError> {\n        match self\n            .client\n            .get(\"/latest/meta-data/iam/security-credentials/\")\n            .await\n        {\n            Ok(profile) => Ok(profile.as_ref().into()),\n            Err(ImdsError::ErrorResponse(context))\n                if context.response().status().as_u16() == 404 =>\n            {\n                tracing::warn!(\n                    \"received 404 from IMDS when loading profile information. \\\n                    Hint: This instance may not have an IAM role associated.\"\n                );\n                Err(CredentialsError::not_loaded(\"received 404 from IMDS\"))\n            }\n            Err(ImdsError::FailedToLoadToken(context)) if context.is_dispatch_failure() => {\n                Err(CredentialsError::not_loaded(ImdsCommunicationError {\n                    source: context.into_source().into(),\n                }))\n            }\n            Err(other) => Err(CredentialsError::provider_error(other)),\n        }\n    }\n\n    // Extend the cached expiration time if necessary\n    //\n    // This allows continued use of the credentials even when IMDS returns expired ones.\n    fn maybe_extend_expiration(&self, expiration: SystemTime) -> SystemTime {\n        let now = self.time_source.now();\n        // If credentials from IMDS are not stale, use them as they are.\n        if now < expiration {\n            return expiration;\n        }\n\n        let mut rng = fastrand::Rng::with_seed(\n            now.duration_since(SystemTime::UNIX_EPOCH)\n                .expect(\"now should be after UNIX EPOCH\")\n                .as_secs(),\n        );\n        // Calculate credentials' refresh offset with jitter, which should be less than 15 minutes\n        // the smallest amount of time credentials are valid for.\n        // Setting it to something longer than that may have the risk of the credentials expiring\n        // before the next refresh.\n        let refresh_offset = CREDENTIAL_EXPIRATION_INTERVAL + Duration::from_secs(rng.u64(0..=300));\n        let new_expiry = now + refresh_offset;\n\n        tracing::warn!(\n            \"{WARNING_FOR_EXTENDING_CREDENTIALS_EXPIRY} {:.2} minutes.\",\n            refresh_offset.as_secs_f64() / 60.0,\n        );\n\n        new_expiry\n    }\n\n    async fn retrieve_credentials(&self) -> provider::Result {\n        if self.imds_disabled() {\n            let err = format!(\n                \"IMDS disabled by {} env var set to `true`\",\n                super::env::EC2_METADATA_DISABLED\n            );\n            tracing::debug!(err);\n            return Err(CredentialsError::not_loaded(err));\n        }\n        tracing::debug!(\"loading credentials from IMDS\");\n        let profile: Cow<'_, str> = match &self.profile {\n            Some(profile) => profile.into(),\n            None => self.get_profile_uncached().await?.into(),\n        };\n        tracing::debug!(profile = %profile, \"loaded profile\");\n        let credentials = self\n            .client\n            .get(format!(\n                \"/latest/meta-data/iam/security-credentials/{profile}\",\n            ))\n            .await\n            .map_err(CredentialsError::provider_error)?;\n        match parse_json_credentials(credentials.as_ref()) {\n            Ok(JsonCredentials::RefreshableCredentials(RefreshableCredentials {\n                access_key_id,\n                secret_access_key,\n                session_token,\n                account_id,\n                expiration,\n                ..\n            })) => {\n                // TODO(IMDSv2.X): Use `account_id` once the design is finalized\n                let _ = account_id;\n                let expiration = self.maybe_extend_expiration(expiration);\n                let creds = Credentials::new(\n                    access_key_id,\n                    secret_access_key,\n                    Some(session_token.to_string()),\n                    expiration.into(),\n                    \"IMDSv2\",\n                );\n                *self.last_retrieved_credentials.write().unwrap() = Some(creds.clone());\n                Ok(creds)\n            }\n            Ok(JsonCredentials::Error { code, message })\n                if code == codes::ASSUME_ROLE_UNAUTHORIZED_ACCESS =>\n            {\n                Err(CredentialsError::invalid_configuration(format!(\n                    \"Incorrect IMDS/IAM configuration: [{code}] {message}. \\\n                        Hint: Does this role have a trust relationship with EC2?\",\n                )))\n            }\n            Ok(JsonCredentials::Error { code, message }) => Err(CredentialsError::provider_error(\n                format!(\"Error retrieving credentials from IMDS: {code} {message}\"),\n            )),\n            // got bad data from IMDS, should not occur during normal operation:\n            Err(invalid) => Err(CredentialsError::unhandled(invalid)),\n        }\n        .map(|mut creds| {\n            creds\n                .get_property_mut_or_default::<Vec<AwsCredentialFeature>>()\n                .push(AwsCredentialFeature::CredentialsImds);\n            creds\n        })\n    }\n\n    async fn credentials(&self) -> provider::Result {\n        match self.retrieve_credentials().await {\n            creds @ Ok(_) => creds,\n            // Any failure while retrieving credentials MUST NOT impede use of existing credentials.\n            err => match &*self.last_retrieved_credentials.read().unwrap() {\n                Some(creds) => Ok(creds.clone()),\n                _ => err,\n            },\n        }\n    }\n}\n\n#[cfg(test)]\nmod test {\n    use super::*;\n    use crate::imds::client::test::{\n        imds_request, imds_response, make_imds_client, token_request, token_response,\n    };\n    use crate::provider_config::ProviderConfig;\n    use aws_credential_types::credential_feature::AwsCredentialFeature;\n    use aws_credential_types::provider::ProvideCredentials;\n    use aws_smithy_async::test_util::instant_time_and_sleep;\n    use aws_smithy_http_client::test_util::{ReplayEvent, StaticReplayClient};\n    use aws_smithy_types::body::SdkBody;\n    use std::time::{Duration, UNIX_EPOCH};\n    use tracing_test::traced_test;\n\n    const TOKEN_A: &str = \"token_a\";\n\n    #[tokio::test]\n    async fn profile_is_not_cached() {\n        let http_client = StaticReplayClient::new(vec![\n            ReplayEvent::new(\n                token_request(\"http://169.254.169.254\", 21600),\n                token_response(21600, TOKEN_A),\n            ),\n            ReplayEvent::new(\n                imds_request(\"http://169.254.169.254/latest/meta-data/iam/security-credentials/\", TOKEN_A),\n                imds_response(r#\"profile-name\"#),\n            ),\n            ReplayEvent::new(\n                imds_request(\"http://169.254.169.254/latest/meta-data/iam/security-credentials/profile-name\", TOKEN_A),\n                imds_response(\"{\\n  \\\"Code\\\" : \\\"Success\\\",\\n  \\\"LastUpdated\\\" : \\\"2021-09-20T21:42:26Z\\\",\\n  \\\"Type\\\" : \\\"AWS-HMAC\\\",\\n  \\\"AccessKeyId\\\" : \\\"ASIARTEST\\\",\\n  \\\"SecretAccessKey\\\" : \\\"testsecret\\\",\\n  \\\"Token\\\" : \\\"testtoken\\\",\\n  \\\"Expiration\\\" : \\\"2021-09-21T04:16:53Z\\\"\\n}\"),\n            ),\n            ReplayEvent::new(\n                imds_request(\"http://169.254.169.254/latest/meta-data/iam/security-credentials/\", TOKEN_A),\n                imds_response(r#\"different-profile\"#),\n            ),\n            ReplayEvent::new(\n                imds_request(\"http://169.254.169.254/latest/meta-data/iam/security-credentials/different-profile\", TOKEN_A),\n                imds_response(\"{\\n  \\\"Code\\\" : \\\"Success\\\",\\n  \\\"LastUpdated\\\" : \\\"2021-09-20T21:42:26Z\\\",\\n  \\\"Type\\\" : \\\"AWS-HMAC\\\",\\n  \\\"AccessKeyId\\\" : \\\"ASIARTEST2\\\",\\n  \\\"SecretAccessKey\\\" : \\\"testsecret\\\",\\n  \\\"Token\\\" : \\\"testtoken\\\",\\n  \\\"Expiration\\\" : \\\"2021-09-21T04:16:53Z\\\"\\n}\"),\n            ),\n        ]);\n        let client = ImdsCredentialsProvider::builder()\n            .imds_client(make_imds_client(&http_client))\n            .configure(&ProviderConfig::no_configuration())\n            .build();\n        let creds1 = client.provide_credentials().await.expect(\"valid creds\");\n        let creds2 = client.provide_credentials().await.expect(\"valid creds\");\n        assert_eq!(creds1.access_key_id(), \"ASIARTEST\");\n        assert_eq!(creds2.access_key_id(), \"ASIARTEST2\");\n        http_client.assert_requests_match(&[]);\n    }\n\n    #[tokio::test]\n    #[traced_test]\n    async fn credentials_not_stale_should_be_used_as_they_are() {\n        let http_client = StaticReplayClient::new(vec![\n            ReplayEvent::new(\n                token_request(\"http://169.254.169.254\", 21600),\n                token_response(21600, TOKEN_A),\n            ),\n            ReplayEvent::new(\n                imds_request(\"http://169.254.169.254/latest/meta-data/iam/security-credentials/\", TOKEN_A),\n                imds_response(r#\"profile-name\"#),\n            ),\n            ReplayEvent::new(\n                imds_request(\"http://169.254.169.254/latest/meta-data/iam/security-credentials/profile-name\", TOKEN_A),\n                imds_response(\"{\\n  \\\"Code\\\" : \\\"Success\\\",\\n  \\\"LastUpdated\\\" : \\\"2021-09-20T21:42:26Z\\\",\\n  \\\"Type\\\" : \\\"AWS-HMAC\\\",\\n  \\\"AccessKeyId\\\" : \\\"ASIARTEST\\\",\\n  \\\"SecretAccessKey\\\" : \\\"testsecret\\\",\\n  \\\"Token\\\" : \\\"testtoken\\\",\\n  \\\"Expiration\\\" : \\\"2021-09-21T04:16:53Z\\\"\\n}\"),\n            ),\n        ]);\n\n        // set to 2021-09-21T04:16:50Z that makes returned credentials' expiry (2021-09-21T04:16:53Z)\n        // not stale\n        let time_of_request_to_fetch_credentials = UNIX_EPOCH + Duration::from_secs(1632197810);\n        let (time_source, sleep) = instant_time_and_sleep(time_of_request_to_fetch_credentials);\n\n        let provider_config = ProviderConfig::no_configuration()\n            .with_http_client(http_client.clone())\n            .with_sleep_impl(sleep)\n            .with_time_source(time_source);\n        let client = crate::imds::Client::builder()\n            .configure(&provider_config)\n            .build();\n        let provider = ImdsCredentialsProvider::builder()\n            .configure(&provider_config)\n            .imds_client(client)\n            .build();\n        let creds = provider.provide_credentials().await.expect(\"valid creds\");\n        // The expiry should be equal to what is originally set (==2021-09-21T04:16:53Z).\n        assert_eq!(\n            creds.expiry(),\n            UNIX_EPOCH.checked_add(Duration::from_secs(1632197813))\n        );\n        http_client.assert_requests_match(&[]);\n\n        // There should not be logs indicating credentials are extended for stability.\n        assert!(!logs_contain(WARNING_FOR_EXTENDING_CREDENTIALS_EXPIRY));\n    }\n    #[tokio::test]\n    #[traced_test]\n    async fn expired_credentials_should_be_extended() {\n        let http_client = StaticReplayClient::new(vec![\n                ReplayEvent::new(\n                    token_request(\"http://169.254.169.254\", 21600),\n                    token_response(21600, TOKEN_A),\n                ),\n                ReplayEvent::new(\n                    imds_request(\"http://169.254.169.254/latest/meta-data/iam/security-credentials/\", TOKEN_A),\n                    imds_response(r#\"profile-name\"#),\n                ),\n                ReplayEvent::new(\n                    imds_request(\"http://169.254.169.254/latest/meta-data/iam/security-credentials/profile-name\", TOKEN_A),\n                    imds_response(\"{\\n  \\\"Code\\\" : \\\"Success\\\",\\n  \\\"LastUpdated\\\" : \\\"2021-09-20T21:42:26Z\\\",\\n  \\\"Type\\\" : \\\"AWS-HMAC\\\",\\n  \\\"AccessKeyId\\\" : \\\"ASIARTEST\\\",\\n  \\\"SecretAccessKey\\\" : \\\"testsecret\\\",\\n  \\\"Token\\\" : \\\"testtoken\\\",\\n  \\\"Expiration\\\" : \\\"2021-09-21T04:16:53Z\\\"\\n}\"),\n                ),\n            ]);\n\n        // set to 2021-09-21T17:41:25Z that renders fetched credentials already expired (2021-09-21T04:16:53Z)\n        let time_of_request_to_fetch_credentials = UNIX_EPOCH + Duration::from_secs(1632246085);\n        let (time_source, sleep) = instant_time_and_sleep(time_of_request_to_fetch_credentials);\n\n        let provider_config = ProviderConfig::no_configuration()\n            .with_http_client(http_client.clone())\n            .with_sleep_impl(sleep)\n            .with_time_source(time_source);\n        let client = crate::imds::Client::builder()\n            .configure(&provider_config)\n            .build();\n        let provider = ImdsCredentialsProvider::builder()\n            .configure(&provider_config)\n            .imds_client(client)\n            .build();\n        let creds = provider.provide_credentials().await.expect(\"valid creds\");\n        assert!(creds.expiry().unwrap() > time_of_request_to_fetch_credentials);\n        http_client.assert_requests_match(&[]);\n\n        // We should inform customers that expired credentials are being used for stability.\n        assert!(logs_contain(WARNING_FOR_EXTENDING_CREDENTIALS_EXPIRY));\n    }\n\n    #[tokio::test]\n    #[cfg(feature = \"default-https-client\")]\n    async fn read_timeout_during_credentials_refresh_should_yield_last_retrieved_credentials() {\n        let client = crate::imds::Client::builder()\n            // 240.* can never be resolved\n            .endpoint(\"http://240.0.0.0\")\n            .unwrap()\n            .build();\n        let expected = aws_credential_types::Credentials::for_tests();\n        let provider = ImdsCredentialsProvider::builder()\n            .imds_client(client)\n            // seed fallback credentials for testing\n            .last_retrieved_credentials(expected.clone())\n            .build();\n        let actual = provider.provide_credentials().await;\n        assert_eq!(actual.unwrap(), expected);\n    }\n\n    #[tokio::test]\n    #[cfg(feature = \"default-https-client\")]\n    async fn read_timeout_during_credentials_refresh_should_error_without_last_retrieved_credentials(\n    ) {\n        let client = crate::imds::Client::builder()\n            // 240.* can never be resolved\n            .endpoint(\"http://240.0.0.0\")\n            .unwrap()\n            .build();\n        let provider = ImdsCredentialsProvider::builder()\n            .imds_client(client)\n            // no fallback credentials provided\n            .build();\n        let actual = provider.provide_credentials().await;\n        assert!(\n            matches!(actual, Err(CredentialsError::CredentialsNotLoaded(_))),\n            \"\\nexpected: Err(CredentialsError::CredentialsNotLoaded(_))\\nactual: {actual:?}\"\n        );\n    }\n\n    // TODO(https://github.com/awslabs/aws-sdk-rust/issues/1117) This test is ignored on Windows because it uses Unix-style paths\n    #[cfg_attr(windows, ignore)]\n    #[tokio::test]\n    #[cfg(feature = \"default-https-client\")]\n    async fn external_timeout_during_credentials_refresh_should_yield_last_retrieved_credentials() {\n        use aws_smithy_async::rt::sleep::AsyncSleep;\n        let client = crate::imds::Client::builder()\n            // 240.* can never be resolved\n            .endpoint(\"http://240.0.0.0\")\n            .unwrap()\n            .build();\n        let expected = aws_credential_types::Credentials::for_tests();\n        let provider = ImdsCredentialsProvider::builder()\n            .imds_client(client)\n            .configure(&ProviderConfig::no_configuration())\n            // seed fallback credentials for testing\n            .last_retrieved_credentials(expected.clone())\n            .build();\n        let sleeper = aws_smithy_async::rt::sleep::TokioSleep::new();\n        let timeout = aws_smithy_async::future::timeout::Timeout::new(\n            provider.provide_credentials(),\n            // make sure `sleeper.sleep` will be timed out first by setting a shorter duration than connect timeout\n            sleeper.sleep(std::time::Duration::from_millis(100)),\n        );\n        match timeout.await {\n            Ok(_) => panic!(\"provide_credentials completed before timeout future\"),\n            Err(_err) => match provider.fallback_on_interrupt() {\n                Some(actual) => assert_eq!(actual, expected),\n                None => panic!(\n                    \"provide_credentials timed out and no credentials returned from fallback_on_interrupt\"\n                ),\n            },\n        };\n    }\n\n    #[tokio::test]\n    async fn fallback_credentials_should_be_used_when_imds_returns_500_during_credentials_refresh()\n    {\n        let http_client = StaticReplayClient::new(vec![\n                // The next three request/response pairs will correspond to the first call to `provide_credentials`.\n                // During the call, it populates last_retrieved_credentials.\n                ReplayEvent::new(\n                    token_request(\"http://169.254.169.254\", 21600),\n                    token_response(21600, TOKEN_A),\n                ),\n                ReplayEvent::new(\n                    imds_request(\"http://169.254.169.254/latest/meta-data/iam/security-credentials/\", TOKEN_A),\n                    imds_response(r#\"profile-name\"#),\n                ),\n                ReplayEvent::new(\n                    imds_request(\"http://169.254.169.254/latest/meta-data/iam/security-credentials/profile-name\", TOKEN_A),\n                    imds_response(\"{\\n  \\\"Code\\\" : \\\"Success\\\",\\n  \\\"LastUpdated\\\" : \\\"2021-09-20T21:42:26Z\\\",\\n  \\\"Type\\\" : \\\"AWS-HMAC\\\",\\n  \\\"AccessKeyId\\\" : \\\"ASIARTEST\\\",\\n  \\\"SecretAccessKey\\\" : \\\"testsecret\\\",\\n  \\\"Token\\\" : \\\"testtoken\\\",\\n  \\\"Expiration\\\" : \\\"2021-09-21T04:16:53Z\\\"\\n}\"),\n                ),\n                // The following request/response pair corresponds to the second call to `provide_credentials`.\n                // During the call, IMDS returns response code 500.\n                ReplayEvent::new(\n                    imds_request(\"http://169.254.169.254/latest/meta-data/iam/security-credentials/\", TOKEN_A),\n                    http::Response::builder().status(500).body(SdkBody::empty()).unwrap(),\n                ),\n            ]);\n        let provider = ImdsCredentialsProvider::builder()\n            .imds_client(make_imds_client(&http_client))\n            .configure(&ProviderConfig::no_configuration())\n            .build();\n        let creds1 = provider.provide_credentials().await.expect(\"valid creds\");\n        assert_eq!(creds1.access_key_id(), \"ASIARTEST\");\n        // `creds1` should be returned as fallback credentials and assigned to `creds2`\n        let creds2 = provider.provide_credentials().await.expect(\"valid creds\");\n        assert_eq!(creds1, creds2);\n        http_client.assert_requests_match(&[]);\n    }\n\n    #[tokio::test]\n    async fn credentials_feature() {\n        let http_client = StaticReplayClient::new(vec![\n            ReplayEvent::new(\n                token_request(\"http://169.254.169.254\", 21600),\n                token_response(21600, TOKEN_A),\n            ),\n            ReplayEvent::new(\n                imds_request(\"http://169.254.169.254/latest/meta-data/iam/security-credentials/\", TOKEN_A),\n                imds_response(r#\"profile-name\"#),\n            ),\n            ReplayEvent::new(\n                imds_request(\"http://169.254.169.254/latest/meta-data/iam/security-credentials/profile-name\", TOKEN_A),\n                imds_response(\"{\\n  \\\"Code\\\" : \\\"Success\\\",\\n  \\\"LastUpdated\\\" : \\\"2021-09-20T21:42:26Z\\\",\\n  \\\"Type\\\" : \\\"AWS-HMAC\\\",\\n  \\\"AccessKeyId\\\" : \\\"ASIARTEST\\\",\\n  \\\"SecretAccessKey\\\" : \\\"testsecret\\\",\\n  \\\"Token\\\" : \\\"testtoken\\\",\\n  \\\"Expiration\\\" : \\\"2021-09-21T04:16:53Z\\\"\\n}\"),\n            ),\n            ReplayEvent::new(\n                imds_request(\"http://169.254.169.254/latest/meta-data/iam/security-credentials/\", TOKEN_A),\n                imds_response(r#\"different-profile\"#),\n            ),\n            ReplayEvent::new(\n                imds_request(\"http://169.254.169.254/latest/meta-data/iam/security-credentials/different-profile\", TOKEN_A),\n                imds_response(\"{\\n  \\\"Code\\\" : \\\"Success\\\",\\n  \\\"LastUpdated\\\" : \\\"2021-09-20T21:42:26Z\\\",\\n  \\\"Type\\\" : \\\"AWS-HMAC\\\",\\n  \\\"AccessKeyId\\\" : \\\"ASIARTEST2\\\",\\n  \\\"SecretAccessKey\\\" : \\\"testsecret\\\",\\n  \\\"Token\\\" : \\\"testtoken\\\",\\n  \\\"Expiration\\\" : \\\"2021-09-21T04:16:53Z\\\"\\n}\"),\n            ),\n        ]);\n        let client = ImdsCredentialsProvider::builder()\n            .imds_client(make_imds_client(&http_client))\n            .configure(&ProviderConfig::no_configuration())\n            .build();\n        let creds = client.provide_credentials().await.expect(\"valid creds\");\n        assert_eq!(\n            &vec![AwsCredentialFeature::CredentialsImds],\n            creds.get_property::<Vec<AwsCredentialFeature>>().unwrap()\n        );\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/src/imds/mod.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! IMDSv2 Client, credential, and region provider\n//!\n//! See [`client`] for more information.\npub mod client;\n\npub mod credentials;\npub mod region;\n\nmod env {\n    pub(crate) const EC2_METADATA_DISABLED: &str = \"AWS_EC2_METADATA_DISABLED\";\n}\n\n#[doc(inline)]\npub use client::Client;\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/src/imds/region.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! IMDS Region Provider\n//!\n//! Load region from IMDS from `/latest/meta-data/placement/region`\n//! This provider has a 5 second timeout.\n\nuse crate::imds::{self, Client};\nuse crate::meta::region::{future, ProvideRegion};\nuse crate::provider_config::ProviderConfig;\nuse aws_smithy_types::error::display::DisplayErrorContext;\nuse aws_types::os_shim_internal::Env;\nuse aws_types::region::Region;\nuse std::fmt::Debug;\nuse tracing::Instrument;\n\n/// IMDSv2 Region Provider\n///\n/// This provider is included in the default region chain, so it does not need to be used manually.\npub struct ImdsRegionProvider {\n    client: Client,\n    env: Env,\n}\n\nimpl Debug for ImdsRegionProvider {\n    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n        f.debug_struct(\"ImdsRegionProvider\")\n            .field(\"client\", &\"IMDS client truncated for readability\")\n            .field(\"env\", &self.env)\n            .finish()\n    }\n}\n\nconst REGION_PATH: &str = \"/latest/meta-data/placement/region\";\n\nimpl ImdsRegionProvider {\n    /// Builder for [`ImdsRegionProvider`]\n    pub fn builder() -> Builder {\n        Builder::default()\n    }\n\n    fn imds_disabled(&self) -> bool {\n        match self.env.get(super::env::EC2_METADATA_DISABLED) {\n            Ok(value) => value.eq_ignore_ascii_case(\"true\"),\n            _ => false,\n        }\n    }\n\n    /// Load a region from IMDS\n    ///\n    /// This provider uses the API `/latest/meta-data/placement/region`\n    pub async fn region(&self) -> Option<Region> {\n        if self.imds_disabled() {\n            tracing::debug!(\"not using IMDS to load region, IMDS is disabled\");\n            return None;\n        }\n        match self.client.get(REGION_PATH).await {\n            Ok(region) => {\n                tracing::debug!(region = %region.as_ref(), \"loaded region from IMDS\");\n                Some(Region::new(String::from(region)))\n            }\n            Err(err) => {\n                tracing::warn!(err = %DisplayErrorContext(&err), \"failed to load region from IMDS\");\n                None\n            }\n        }\n    }\n}\n\nimpl ProvideRegion for ImdsRegionProvider {\n    fn region(&self) -> future::ProvideRegion<'_> {\n        future::ProvideRegion::new(\n            self.region()\n                .instrument(tracing::debug_span!(\"imds_load_region\")),\n        )\n    }\n}\n\n/// Builder for [`ImdsRegionProvider`]\n#[derive(Debug, Default)]\npub struct Builder {\n    provider_config: Option<ProviderConfig>,\n    imds_client_override: Option<imds::Client>,\n}\n\nimpl Builder {\n    /// Set configuration options of the [`Builder`]\n    pub fn configure(self, provider_config: &ProviderConfig) -> Self {\n        Self {\n            provider_config: Some(provider_config.clone()),\n            ..self\n        }\n    }\n\n    /// Override the IMDS client used to load the region\n    pub fn imds_client(mut self, imds_client: imds::Client) -> Self {\n        self.imds_client_override = Some(imds_client);\n        self\n    }\n\n    /// Create an [`ImdsRegionProvider`] from this builder\n    pub fn build(self) -> ImdsRegionProvider {\n        let provider_config = self.provider_config.unwrap_or_default();\n        let client = self\n            .imds_client_override\n            .unwrap_or_else(|| imds::Client::builder().configure(&provider_config).build());\n        ImdsRegionProvider {\n            client,\n            env: provider_config.env(),\n        }\n    }\n}\n\n#[cfg(test)]\nmod test {\n    use crate::imds::client::test::{imds_request, imds_response, token_request, token_response};\n    use crate::imds::region::ImdsRegionProvider;\n    use crate::provider_config::ProviderConfig;\n    use aws_smithy_async::rt::sleep::TokioSleep;\n    use aws_smithy_http_client::test_util::{ReplayEvent, StaticReplayClient};\n    use aws_smithy_types::body::SdkBody;\n    use aws_types::region::Region;\n    use tracing_test::traced_test;\n\n    #[tokio::test]\n    async fn load_region() {\n        let http_client = StaticReplayClient::new(vec![\n            ReplayEvent::new(\n                token_request(\"http://169.254.169.254\", 21600),\n                token_response(21600, \"token\"),\n            ),\n            ReplayEvent::new(\n                imds_request(\n                    \"http://169.254.169.254/latest/meta-data/placement/region\",\n                    \"token\",\n                ),\n                imds_response(\"eu-west-1\"),\n            ),\n        ]);\n        let provider = ImdsRegionProvider::builder()\n            .configure(\n                &ProviderConfig::no_configuration()\n                    .with_http_client(http_client)\n                    .with_sleep_impl(TokioSleep::new()),\n            )\n            .build();\n        assert_eq!(\n            provider.region().await.expect(\"returns region\"),\n            Region::new(\"eu-west-1\")\n        );\n    }\n\n    #[traced_test]\n    #[tokio::test]\n    async fn no_region_imds_disabled() {\n        let http_client = StaticReplayClient::new(vec![ReplayEvent::new(\n            token_request(\"http://169.254.169.254\", 21600),\n            http::Response::builder()\n                .status(403)\n                .body(SdkBody::empty())\n                .unwrap(),\n        )]);\n        let provider = ImdsRegionProvider::builder()\n            .configure(\n                &ProviderConfig::no_configuration()\n                    .with_http_client(http_client)\n                    .with_sleep_impl(TokioSleep::new()),\n            )\n            .build();\n        assert_eq!(provider.region().await, None);\n        assert!(logs_contain(\"failed to load region from IMDS\"));\n        assert!(logs_contain(\"IMDS is disabled\"));\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/src/json_credentials.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nuse aws_smithy_json::deserialize::token::skip_value;\nuse aws_smithy_json::deserialize::{json_token_iter, EscapeError, Token};\nuse aws_smithy_types::date_time::Format;\nuse aws_smithy_types::DateTime;\nuse std::borrow::Cow;\nuse std::error::Error;\nuse std::fmt::{self, Display, Formatter};\nuse std::time::SystemTime;\n\n#[derive(Debug)]\npub(crate) enum InvalidJsonCredentials {\n    /// The response did not contain valid JSON\n    JsonError(Box<dyn Error + Send + Sync>),\n    /// The response was missing a required field\n    MissingField(&'static str),\n\n    /// A field was invalid\n    InvalidField {\n        field: &'static str,\n        err: Box<dyn Error + Send + Sync>,\n    },\n\n    /// Another unhandled error occurred\n    Other(Cow<'static, str>),\n}\n\nimpl From<EscapeError> for InvalidJsonCredentials {\n    fn from(err: EscapeError) -> Self {\n        InvalidJsonCredentials::JsonError(err.into())\n    }\n}\n\nimpl From<aws_smithy_json::deserialize::error::DeserializeError> for InvalidJsonCredentials {\n    fn from(err: aws_smithy_json::deserialize::error::DeserializeError) -> Self {\n        InvalidJsonCredentials::JsonError(err.into())\n    }\n}\n\nimpl Display for InvalidJsonCredentials {\n    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {\n        match self {\n            InvalidJsonCredentials::JsonError(json) => {\n                write!(f, \"invalid JSON in response: {json}\")\n            }\n            InvalidJsonCredentials::MissingField(field) => {\n                write!(f, \"Expected field `{field}` in response but it was missing\",)\n            }\n            InvalidJsonCredentials::Other(msg) => write!(f, \"{msg}\"),\n            InvalidJsonCredentials::InvalidField { field, err } => {\n                write!(f, \"Invalid field in response: `{field}`. {err}\")\n            }\n        }\n    }\n}\n\nimpl Error for InvalidJsonCredentials {}\n\n#[derive(PartialEq, Eq)]\npub(crate) struct RefreshableCredentials<'a> {\n    pub(crate) access_key_id: Cow<'a, str>,\n    pub(crate) secret_access_key: Cow<'a, str>,\n    pub(crate) session_token: Cow<'a, str>,\n    pub(crate) account_id: Option<Cow<'a, str>>,\n    pub(crate) expiration: SystemTime,\n}\n\nimpl fmt::Debug for RefreshableCredentials<'_> {\n    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {\n        let mut debug = f.debug_struct(\"RefreshableCredentials\");\n        debug\n            .field(\"access_key_id\", &self.access_key_id)\n            .field(\"secret_access_key\", &\"** redacted **\")\n            .field(\"session_token\", &\"** redacted **\");\n        if let Some(account_id) = &self.account_id {\n            debug.field(\"account_id\", account_id);\n        }\n        debug.field(\"expiration\", &self.expiration).finish()\n    }\n}\n\n#[non_exhaustive]\n#[derive(Debug, PartialEq, Eq)]\npub(crate) enum JsonCredentials<'a> {\n    RefreshableCredentials(RefreshableCredentials<'a>),\n    Error {\n        code: Cow<'a, str>,\n        message: Cow<'a, str>,\n    }, // TODO(https://github.com/awslabs/aws-sdk-rust/issues/340): Add support for static credentials:\n       //  {\n       //    \"AccessKeyId\" : \"MUA...\",\n       //    \"SecretAccessKey\" : \"/7PC5om....\"\n       //  }\n\n       // TODO(https://github.com/awslabs/aws-sdk-rust/issues/340): Add support for Assume role credentials:\n       //   {\n       //     // fields to construct STS client:\n       //     \"Region\": \"sts-region-name\",\n       //     \"AccessKeyId\" : \"MUA...\",\n       //     \"Expiration\" : \"2016-02-25T06:03:31Z\", // optional\n       //     \"SecretAccessKey\" : \"/7PC5om....\",\n       //     \"Token\" : \"AQoDY....=\", // optional\n       //     // fields controlling the STS role:\n       //     \"RoleArn\": \"...\", // required\n       //     \"RoleSessionName\": \"...\", // required\n       //     // and also: DurationSeconds, ExternalId, SerialNumber, TokenCode, Policy\n       //     ...\n       //   }\n}\n\n/// Deserialize an IMDS response from a string\n///\n/// There are two levels of error here: the top level distinguishes between a successfully parsed\n/// response from the credential provider vs. something invalid / unexpected. The inner error\n/// distinguishes between a successful response that contains credentials vs. an error with a code and\n/// error message.\n///\n/// Keys are case insensitive.\npub(crate) fn parse_json_credentials(\n    credentials_response: &str,\n) -> Result<JsonCredentials<'_>, InvalidJsonCredentials> {\n    let mut code = None;\n    let mut access_key_id = None;\n    let mut secret_access_key = None;\n    let mut session_token = None;\n    let mut account_id = None;\n    let mut expiration = None;\n    let mut message = None;\n    json_parse_loop(credentials_response.as_bytes(), |key, value| {\n        match (key, value) {\n            /*\n             \"Code\": \"Success\",\n             \"Type\": \"AWS-HMAC\",\n             \"AccessKeyId\" : \"accessKey\",\n             \"SecretAccessKey\" : \"secret\",\n             \"Token | SessionToken\" : \"token\",\n             \"AccountId\" : \"111122223333\",\n             \"Expiration | ExpiresAt\" : \"....\",\n             \"LastUpdated\" : \"2009-11-23T00:00:00Z\"\n            */\n            (key, Token::ValueString { value, .. }) if key.eq_ignore_ascii_case(\"Code\") => {\n                code = Some(value.to_unescaped()?);\n            }\n            (key, Token::ValueString { value, .. }) if key.eq_ignore_ascii_case(\"AccessKeyId\") => {\n                access_key_id = Some(value.to_unescaped()?);\n            }\n            (key, Token::ValueString { value, .. })\n                if key.eq_ignore_ascii_case(\"SecretAccessKey\") =>\n            {\n                secret_access_key = Some(value.to_unescaped()?);\n            }\n            (key, Token::ValueString { value, .. })\n                if key.eq_ignore_ascii_case(\"Token\")\n                    || key.eq_ignore_ascii_case(\"SessionToken\") =>\n            {\n                session_token = Some(value.to_unescaped()?);\n            }\n            (key, Token::ValueString { value, .. }) if key.eq_ignore_ascii_case(\"AccountId\") => {\n                account_id = Some(value.to_unescaped()?);\n            }\n            (key, Token::ValueString { value, .. })\n                if key.eq_ignore_ascii_case(\"Expiration\")\n                    || key.eq_ignore_ascii_case(\"ExpiresAt\") =>\n            {\n                expiration = Some(value.to_unescaped()?);\n            }\n\n            // Error case handling: message will be set\n            (key, Token::ValueString { value, .. }) if key.eq_ignore_ascii_case(\"Message\") => {\n                message = Some(value.to_unescaped()?);\n            }\n            _ => {}\n        };\n        Ok(())\n    })?;\n    match code {\n        // IMDS does not appear to reply with a `Code` missing, but documentation indicates it\n        // may be possible\n        None | Some(Cow::Borrowed(\"Success\")) => {\n            let access_key_id =\n                access_key_id.ok_or(InvalidJsonCredentials::MissingField(\"AccessKeyId\"))?;\n            let secret_access_key =\n                secret_access_key.ok_or(InvalidJsonCredentials::MissingField(\"SecretAccessKey\"))?;\n            let session_token =\n                session_token.ok_or(InvalidJsonCredentials::MissingField(\"Token\"))?;\n            let expiration =\n                expiration.ok_or(InvalidJsonCredentials::MissingField(\"Expiration\"))?;\n            let expiration = SystemTime::try_from(\n                DateTime::from_str(expiration.as_ref(), Format::DateTime).map_err(|err| {\n                    InvalidJsonCredentials::InvalidField {\n                        field: \"Expiration\",\n                        err: err.into(),\n                    }\n                })?,\n            )\n            .map_err(|_| {\n                InvalidJsonCredentials::Other(\n                    \"credential expiration time cannot be represented by a SystemTime\".into(),\n                )\n            })?;\n            Ok(JsonCredentials::RefreshableCredentials(\n                RefreshableCredentials {\n                    access_key_id,\n                    secret_access_key,\n                    session_token,\n                    account_id,\n                    expiration,\n                },\n            ))\n        }\n        Some(other) => Ok(JsonCredentials::Error {\n            code: other,\n            message: message.unwrap_or_else(|| \"no message\".into()),\n        }),\n    }\n}\n\npub(crate) fn json_parse_loop<'a>(\n    input: &'a [u8],\n    mut f: impl FnMut(Cow<'a, str>, &Token<'a>) -> Result<(), InvalidJsonCredentials>,\n) -> Result<(), InvalidJsonCredentials> {\n    let mut tokens = json_token_iter(input).peekable();\n    if !matches!(tokens.next().transpose()?, Some(Token::StartObject { .. })) {\n        return Err(InvalidJsonCredentials::JsonError(\n            \"expected a JSON document starting with `{`\".into(),\n        ));\n    }\n    loop {\n        match tokens.next().transpose()? {\n            Some(Token::EndObject { .. }) => break,\n            Some(Token::ObjectKey { key, .. }) => {\n                if let Some(Ok(token)) = tokens.peek() {\n                    let key = key.to_unescaped()?;\n                    f(key, token)?\n                }\n                skip_value(&mut tokens)?;\n            }\n            other => {\n                return Err(InvalidJsonCredentials::Other(\n                    format!(\"expected object key, found: {other:?}\").into(),\n                ));\n            }\n        }\n    }\n    if tokens.next().is_some() {\n        return Err(InvalidJsonCredentials::Other(\n            \"found more JSON tokens after completing parsing\".into(),\n        ));\n    }\n    Ok(())\n}\n\n#[cfg(test)]\nmod test {\n    use crate::json_credentials::{\n        parse_json_credentials, InvalidJsonCredentials, JsonCredentials, RefreshableCredentials,\n    };\n    use std::time::{Duration, UNIX_EPOCH};\n\n    #[test]\n    fn json_credentials_success_response() {\n        let response = r#\"\n        {\n          \"Code\" : \"Success\",\n          \"LastUpdated\" : \"2021-09-17T20:57:08Z\",\n          \"Type\" : \"AWS-HMAC\",\n          \"AccessKeyId\" : \"ASIARTEST\",\n          \"SecretAccessKey\" : \"xjtest\",\n          \"Token\" : \"IQote///test\",\n          \"AccountID\" : \"111122223333\",\n          \"Expiration\" : \"2021-09-18T03:31:56Z\"\n        }\"#;\n        let parsed = parse_json_credentials(response).expect(\"valid JSON\");\n        assert_eq!(\n            parsed,\n            JsonCredentials::RefreshableCredentials(RefreshableCredentials {\n                access_key_id: \"ASIARTEST\".into(),\n                secret_access_key: \"xjtest\".into(),\n                session_token: \"IQote///test\".into(),\n                account_id: Some(\"111122223333\".into()),\n                expiration: UNIX_EPOCH + Duration::from_secs(1631935916),\n            })\n        )\n    }\n\n    #[test]\n    fn json_credentials_invalid_json() {\n        let error = parse_json_credentials(\"404: not found\").expect_err(\"no json\");\n        match error {\n            InvalidJsonCredentials::JsonError(_) => {} // ok.\n            err => panic!(\"incorrect error: {:?}\", err),\n        }\n    }\n\n    #[test]\n    fn json_credentials_not_json_object() {\n        let error = parse_json_credentials(\"[1,2,3]\").expect_err(\"no json\");\n        match error {\n            InvalidJsonCredentials::JsonError(_) => {} // ok.\n            _ => panic!(\"incorrect error\"),\n        }\n    }\n\n    #[test]\n    fn json_credentials_missing_code() {\n        let resp = r#\"{\n            \"LastUpdated\" : \"2021-09-17T20:57:08Z\",\n            \"Type\" : \"AWS-HMAC\",\n            \"AccessKeyId\" : \"ASIARTEST\",\n            \"SecretAccessKey\" : \"xjtest\",\n            \"Token\" : \"IQote///test\",\n            \"AccountID\" : \"111122223333\",\n            \"Expiration\" : \"2021-09-18T03:31:56Z\"\n        }\"#;\n        let parsed = parse_json_credentials(resp).expect(\"code not required\");\n        assert_eq!(\n            parsed,\n            JsonCredentials::RefreshableCredentials(RefreshableCredentials {\n                access_key_id: \"ASIARTEST\".into(),\n                secret_access_key: \"xjtest\".into(),\n                session_token: \"IQote///test\".into(),\n                account_id: Some(\"111122223333\".into()),\n                expiration: UNIX_EPOCH + Duration::from_secs(1631935916),\n            })\n        )\n    }\n\n    #[test]\n    fn json_credentials_required_session_token() {\n        let resp = r#\"{\n            \"LastUpdated\" : \"2021-09-17T20:57:08Z\",\n            \"Type\" : \"AWS-HMAC\",\n            \"AccessKeyId\" : \"ASIARTEST\",\n            \"SecretAccessKey\" : \"xjtest\",\n            \"AccountID\" : \"111122223333\",\n            \"Expiration\" : \"2021-09-18T03:31:56Z\"\n        }\"#;\n        let parsed = parse_json_credentials(resp).expect_err(\"token missing\");\n        assert_eq!(\n            format!(\"{}\", parsed),\n            \"Expected field `Token` in response but it was missing\"\n        );\n    }\n\n    #[test]\n    fn json_credentials_missing_akid() {\n        let resp = r#\"{\n            \"Code\": \"Success\",\n            \"LastUpdated\" : \"2021-09-17T20:57:08Z\",\n            \"Type\" : \"AWS-HMAC\",\n            \"SecretAccessKey\" : \"xjtest\",\n            \"Token\" : \"IQote///test\",\n            \"AccountID\" : \"111122223333\",\n            \"Expiration\" : \"2021-09-18T03:31:56Z\"\n        }\"#;\n        match parse_json_credentials(resp).expect_err(\"no code\") {\n            InvalidJsonCredentials::MissingField(\"AccessKeyId\") => {} // ok\n            resp => panic!(\"incorrect json_credentials response: {:?}\", resp),\n        }\n    }\n\n    #[test]\n    fn json_credentials_error_response() {\n        let response = r#\"{\n          \"Code\" : \"AssumeRoleUnauthorizedAccess\",\n          \"Message\" : \"EC2 cannot assume the role integration-test.\",\n          \"LastUpdated\" : \"2021-09-17T20:46:56Z\"\n        }\"#;\n        let parsed = parse_json_credentials(response).expect(\"valid JSON\");\n        assert_eq!(\n            parsed,\n            JsonCredentials::Error {\n                code: \"AssumeRoleUnauthorizedAccess\".into(),\n                message: \"EC2 cannot assume the role integration-test.\".into(),\n            }\n        );\n    }\n\n    /// Validate the specific JSON response format sent by ECS\n    #[test]\n    fn json_credentials_ecs() {\n        // identical, but extra `RoleArn` field is present\n        let response = r#\"{\n            \"RoleArn\":\"arn:aws:iam::123456789:role/ecs-task-role\",\n            \"AccessKeyId\":\"ASIARTEST\",\n            \"SecretAccessKey\":\"SECRETTEST\",\n            \"Token\":\"tokenEaCXVzLXdlc3QtMiJGMEQCIHt47W18eF4dYfSlmKGiwuJnqmIS3LMXNYfODBCEhcnaAiAnuhGOpcdIDxin4QFzhtgaCR2MpcVqR8NFJdMgOt0/xyrnAwhhEAEaDDEzNDA5NTA2NTg1NiIM9M9GT+c5UfV/8r7PKsQDUa9xE9Eprz5N+jgxbFSD2aJR2iyXCcP9Q1cOh4fdZhyw2WNmq9XnIa2tkzrreiQ5R2t+kzergJHO1KRZPfesarfJ879aWJCSocsEKh7xXwwzTsVXrNo5eWkpwTh64q+Ksz15eoaBhtrvnGvPx6SmXv7SToi/DTHFafJlT/T9jITACZvZXSE9zfLka26Rna3rI4g0ugowha//j1f/c1XuKloqshpZvMKc561om9Y5fqBv1fRiS2KhetGTcmz3wUqNQAk8Dq9oINS7cCtdIO0atqCK69UaKeJ9uKY8mzY9dFWw2IrkpOoXmA9r955iU0NOz/95jVJiPZ/8aE8vb0t67gQfzBUCfky+mGSGWAfPRXQlFa5AEulCTHPd7IcTVCtasG033oKEKgB8QnTxvM2LaPlwaaHo7MHGYXeUKbn9NRKd8m1ShwmAlr4oKp1vQp6cPHDTsdTfPTzh/ZAjUPs+ljQbAwqXbPQdUUPpOk0vltY8k6Im9EA0pf80iUNoqrixpmPsR2hzI/ybUwdh+QhvCSBx+J8KHqF6X92u4qAVYIxLy/LGZKT9YC6Kr9Gywn+Ro+EK/xl3axHPzNpbjRDJnbW3HrMw5LmmiwY6pgGWgmD6IOq4QYUtu1uhaLQZyoI5o5PWn+d3kqqxifu8D0ykldB3lQGdlJ2rjKJjCdx8fce1SoXao9cc4hiwn39hUPuTqzVwv2zbzCKmNggIpXP6gqyRtUCakf6tI7ZwqTb2S8KF3t4ElIP8i4cPdNoI0JHSC+sT4LDPpUcX1CjGxfvo55mBHJedW3LXve8TRj4UckFXT1gLuTnzqPMrC5AHz4TAt+uv\",\n            \"AccountID\" : \"111122223333\",\n            \"Expiration\" : \"2009-02-13T23:31:30Z\"\n        }\"#;\n        let parsed = parse_json_credentials(response).expect(\"valid JSON\");\n        use std::borrow::Cow;\n        assert!(\n            matches!(\n                &parsed,\n                JsonCredentials::RefreshableCredentials(RefreshableCredentials{\n                    access_key_id: Cow::Borrowed(\"ASIARTEST\"),\n                    secret_access_key: Cow::Borrowed(\"SECRETTEST\"),\n                    session_token,\n                    account_id: Some(Cow::Borrowed(\"111122223333\")),\n                    expiration\n                }) if session_token.starts_with(\"token\") && *expiration == UNIX_EPOCH + Duration::from_secs(1234567890)\n            ),\n            \"{:?}\",\n            parsed\n        );\n    }\n\n    #[test]\n    fn case_insensitive_code_parsing() {\n        let response = r#\"{\n          \"code\" : \"AssumeRoleUnauthorizedAccess\",\n          \"message\" : \"EC2 cannot assume the role integration-test.\"\n        }\"#;\n        let parsed = parse_json_credentials(response).expect(\"valid JSON\");\n        assert_eq!(\n            parsed,\n            JsonCredentials::Error {\n                code: \"AssumeRoleUnauthorizedAccess\".into(),\n                message: \"EC2 cannot assume the role integration-test.\".into(),\n            }\n        );\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/src/lib.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/* Automatically managed default lints */\n#![cfg_attr(docsrs, feature(doc_cfg))]\n/* End of automatically managed default lints */\n#![allow(clippy::derive_partial_eq_without_eq)]\n#![warn(\n    missing_debug_implementations,\n    missing_docs,\n    rust_2018_idioms,\n    rustdoc::missing_crate_level_docs,\n    unreachable_pub\n)]\n// Allow disallowed methods in tests\n#![cfg_attr(test, allow(clippy::disallowed_methods))]\n\n//! `aws-config` provides implementations of region and credential resolution.\n//!\n//! These implementations can be used either via the default chain implementation\n//! [`from_env`]/[`ConfigLoader`] or ad-hoc individual credential and region providers.\n//!\n//! [`ConfigLoader`] can combine different configuration sources into an AWS shared-config:\n//! [`SdkConfig`]. `SdkConfig` can be used configure an AWS service client.\n//!\n//! # Examples\n//!\n//! Load default SDK configuration:\n//! ```no_run\n//! use aws_config::BehaviorVersion;\n//! mod aws_sdk_dynamodb {\n//! #   pub struct Client;\n//! #   impl Client {\n//! #     pub fn new(config: &aws_types::SdkConfig) -> Self { Client }\n//! #   }\n//! # }\n//! # async fn docs() {\n//! let config = aws_config::load_defaults(BehaviorVersion::v2023_11_09()).await;\n//! let client = aws_sdk_dynamodb::Client::new(&config);\n//! # }\n//! ```\n//!\n//! Load SDK configuration with a region override:\n//! ```no_run\n//! # mod aws_sdk_dynamodb {\n//! #   pub struct Client;\n//! #   impl Client {\n//! #     pub fn new(config: &aws_types::SdkConfig) -> Self { Client }\n//! #   }\n//! # }\n//! # async fn docs() {\n//! # use aws_config::meta::region::RegionProviderChain;\n//! let region_provider = RegionProviderChain::default_provider().or_else(\"us-east-1\");\n//! // Note: requires the `behavior-version-latest` feature enabled\n//! let config = aws_config::from_env().region(region_provider).load().await;\n//! let client = aws_sdk_dynamodb::Client::new(&config);\n//! # }\n//! ```\n//!\n//! Override configuration after construction of `SdkConfig`:\n//!\n//! ```no_run\n//! # use aws_credential_types::provider::ProvideCredentials;\n//! # use aws_types::SdkConfig;\n//! # mod aws_sdk_dynamodb {\n//! #   pub mod config {\n//! #     pub struct Builder;\n//! #     impl Builder {\n//! #       pub fn credentials_provider(\n//! #         self,\n//! #         credentials_provider: impl aws_credential_types::provider::ProvideCredentials + 'static) -> Self { self }\n//! #       pub fn build(self) -> Builder { self }\n//! #     }\n//! #     impl From<&aws_types::SdkConfig> for Builder {\n//! #       fn from(_: &aws_types::SdkConfig) -> Self {\n//! #           todo!()\n//! #       }\n//! #     }\n//! #   }\n//! #   pub struct Client;\n//! #   impl Client {\n//! #     pub fn from_conf(conf: config::Builder) -> Self { Client }\n//! #     pub fn new(config: &aws_types::SdkConfig) -> Self { Client }\n//! #   }\n//! # }\n//! # async fn docs() {\n//! # use aws_config::meta::region::RegionProviderChain;\n//! # fn custom_provider(base: &SdkConfig) -> impl ProvideCredentials {\n//! #   base.credentials_provider().unwrap().clone()\n//! # }\n//! let sdk_config = aws_config::load_defaults(aws_config::BehaviorVersion::latest()).await;\n//! let custom_credentials_provider = custom_provider(&sdk_config);\n//! let dynamo_config = aws_sdk_dynamodb::config::Builder::from(&sdk_config)\n//!   .credentials_provider(custom_credentials_provider)\n//!   .build();\n//! let client = aws_sdk_dynamodb::Client::from_conf(dynamo_config);\n//! # }\n//! ```\n\npub use aws_smithy_runtime_api::client::behavior_version::BehaviorVersion;\n// Re-export types from aws-types\npub use aws_types::{\n    app_name::{AppName, InvalidAppName},\n    region::Region,\n    SdkConfig,\n};\n/// Load default sources for all configuration with override support\npub use loader::ConfigLoader;\n\n/// Types for configuring identity caching.\npub mod identity {\n    pub use aws_smithy_runtime::client::identity::IdentityCache;\n    pub use aws_smithy_runtime::client::identity::LazyCacheBuilder;\n}\n\n#[allow(dead_code)]\nconst PKG_VERSION: &str = env!(\"CARGO_PKG_VERSION\");\n\nmod http_credential_provider;\nmod json_credentials;\n#[cfg(test)]\nmod test_case;\n\npub mod credential_process;\npub mod default_provider;\npub mod ecs;\nmod env_service_config;\npub mod environment;\npub mod imds;\n#[cfg(feature = \"credentials-login\")]\npub mod login;\npub mod meta;\npub mod profile;\npub mod provider_config;\npub mod retry;\nmod sensitive_command;\n#[cfg(feature = \"sso\")]\npub mod sso;\npub mod stalled_stream_protection;\npub mod sts;\npub mod timeout;\npub mod web_identity_token;\n\n/// Create a config loader with the _latest_ defaults.\n///\n/// This loader will always set [`BehaviorVersion::latest`].\n///\n/// For more information about default configuration, refer to the AWS SDKs and Tools [shared configuration documentation](https://docs.aws.amazon.com/sdkref/latest/guide/creds-config-files.html).\n///\n/// # Examples\n/// ```no_run\n/// # async fn create_config() {\n/// let config = aws_config::from_env().region(\"us-east-1\").load().await;\n/// # }\n/// ```\n#[cfg(feature = \"behavior-version-latest\")]\npub fn from_env() -> ConfigLoader {\n    ConfigLoader::default().behavior_version(BehaviorVersion::latest())\n}\n\n/// Load default configuration with the _latest_ defaults.\n///\n/// Convenience wrapper equivalent to `aws_config::load_defaults(BehaviorVersion::latest()).await`\n///\n/// For more information about default configuration, refer to the AWS SDKs and Tools [shared configuration documentation](https://docs.aws.amazon.com/sdkref/latest/guide/creds-config-files.html).\n#[cfg(feature = \"behavior-version-latest\")]\npub async fn load_from_env() -> SdkConfig {\n    from_env().load().await\n}\n\n/// Create a config loader with the _latest_ defaults.\n#[cfg(not(feature = \"behavior-version-latest\"))]\n#[deprecated(\n    note = \"Use the `aws_config::defaults` function. If you don't care about future default behavior changes, you can continue to use this function by enabling the `behavior-version-latest` feature. Doing so will make this deprecation notice go away.\"\n)]\npub fn from_env() -> ConfigLoader {\n    ConfigLoader::default().behavior_version(BehaviorVersion::latest())\n}\n\n/// Load default configuration with the _latest_ defaults.\n#[cfg(not(feature = \"behavior-version-latest\"))]\n#[deprecated(\n    note = \"Use the `aws_config::load_defaults` function. If you don't care about future default behavior changes, you can continue to use this function by enabling the `behavior-version-latest` feature. Doing so will make this deprecation notice go away.\"\n)]\npub async fn load_from_env() -> SdkConfig {\n    load_defaults(BehaviorVersion::latest()).await\n}\n\n/// Create a config loader with the defaults for the given behavior version.\n///\n/// For more information about default configuration, refer to the AWS SDKs and Tools [shared configuration documentation](https://docs.aws.amazon.com/sdkref/latest/guide/creds-config-files.html).\n///\n/// # Examples\n/// ```no_run\n/// # async fn create_config() {\n/// use aws_config::BehaviorVersion;\n/// let config = aws_config::defaults(BehaviorVersion::v2023_11_09())\n///     .region(\"us-east-1\")\n///     .load()\n///     .await;\n/// # }\n/// ```\npub fn defaults(version: BehaviorVersion) -> ConfigLoader {\n    ConfigLoader::default().behavior_version(version)\n}\n\n/// Load default configuration with the given behavior version.\n///\n/// Convenience wrapper equivalent to `aws_config::defaults(behavior_version).load().await`\n///\n/// For more information about default configuration, refer to the AWS SDKs and Tools [shared configuration documentation](https://docs.aws.amazon.com/sdkref/latest/guide/creds-config-files.html).\npub async fn load_defaults(version: BehaviorVersion) -> SdkConfig {\n    defaults(version).load().await\n}\n\nmod loader {\n    use crate::env_service_config::EnvServiceConfig;\n    use aws_credential_types::provider::{\n        token::{ProvideToken, SharedTokenProvider},\n        ProvideCredentials, SharedCredentialsProvider,\n    };\n    use aws_credential_types::Credentials;\n    use aws_smithy_async::rt::sleep::{default_async_sleep, AsyncSleep, SharedAsyncSleep};\n    use aws_smithy_async::time::{SharedTimeSource, TimeSource};\n    use aws_smithy_runtime::client::identity::IdentityCache;\n    use aws_smithy_runtime_api::client::auth::AuthSchemePreference;\n    use aws_smithy_runtime_api::client::behavior_version::BehaviorVersion;\n    use aws_smithy_runtime_api::client::http::HttpClient;\n    use aws_smithy_runtime_api::client::identity::{ResolveCachedIdentity, SharedIdentityCache};\n    use aws_smithy_runtime_api::client::stalled_stream_protection::StalledStreamProtectionConfig;\n    use aws_smithy_runtime_api::shared::IntoShared;\n    use aws_smithy_types::checksum_config::{\n        RequestChecksumCalculation, ResponseChecksumValidation,\n    };\n    use aws_smithy_types::retry::RetryConfig;\n    use aws_smithy_types::timeout::TimeoutConfig;\n    use aws_types::app_name::AppName;\n    use aws_types::docs_for;\n    use aws_types::endpoint_config::AccountIdEndpointMode;\n    use aws_types::origin::Origin;\n    use aws_types::os_shim_internal::{Env, Fs};\n    use aws_types::region::SigningRegionSet;\n    use aws_types::sdk_config::SharedHttpClient;\n    use aws_types::SdkConfig;\n\n    use crate::default_provider::{\n        account_id_endpoint_mode, app_name, auth_scheme_preference, checksums, credentials,\n        disable_request_compression, endpoint_url, ignore_configured_endpoint_urls as ignore_ep,\n        region, request_min_compression_size_bytes, retry_config, sigv4a_signing_region_set,\n        timeout_config, use_dual_stack, use_fips,\n    };\n    use crate::meta::region::ProvideRegion;\n    #[allow(deprecated)]\n    use crate::profile::profile_file::ProfileFiles;\n    use crate::provider_config::ProviderConfig;\n\n    #[derive(Default, Debug)]\n    enum TriStateOption<T> {\n        /// No option was set by the user. We can set up the default.\n        #[default]\n        NotSet,\n        /// The option was explicitly unset. Do not set up a default.\n        ExplicitlyUnset,\n        /// Use the given user provided option.\n        Set(T),\n    }\n\n    /// Load a cross-service [`SdkConfig`] from the environment\n    ///\n    /// This builder supports overriding individual components of the generated config. Overriding a component\n    /// will skip the standard resolution chain from **for that component**. For example,\n    /// if you override the region provider, _even if that provider returns None_, the default region provider\n    /// chain will not be used.\n    #[derive(Default, Debug)]\n    pub struct ConfigLoader {\n        app_name: Option<AppName>,\n        auth_scheme_preference: Option<AuthSchemePreference>,\n        sigv4a_signing_region_set: Option<SigningRegionSet>,\n        identity_cache: Option<SharedIdentityCache>,\n        credentials_provider: TriStateOption<SharedCredentialsProvider>,\n        token_provider: Option<SharedTokenProvider>,\n        account_id_endpoint_mode: Option<AccountIdEndpointMode>,\n        endpoint_url: Option<String>,\n        region: Option<Box<dyn ProvideRegion>>,\n        retry_config: Option<RetryConfig>,\n        sleep: Option<SharedAsyncSleep>,\n        timeout_config: Option<TimeoutConfig>,\n        provider_config: Option<ProviderConfig>,\n        http_client: Option<SharedHttpClient>,\n        profile_name_override: Option<String>,\n        #[allow(deprecated)]\n        profile_files_override: Option<ProfileFiles>,\n        use_fips: Option<bool>,\n        use_dual_stack: Option<bool>,\n        time_source: Option<SharedTimeSource>,\n        disable_request_compression: Option<bool>,\n        request_min_compression_size_bytes: Option<u32>,\n        stalled_stream_protection_config: Option<StalledStreamProtectionConfig>,\n        env: Option<Env>,\n        fs: Option<Fs>,\n        behavior_version: Option<BehaviorVersion>,\n        request_checksum_calculation: Option<RequestChecksumCalculation>,\n        response_checksum_validation: Option<ResponseChecksumValidation>,\n    }\n\n    impl ConfigLoader {\n        /// Sets the [`BehaviorVersion`] used to build [`SdkConfig`].\n        pub fn behavior_version(mut self, behavior_version: BehaviorVersion) -> Self {\n            self.behavior_version = Some(behavior_version);\n            self\n        }\n\n        /// Override the region used to build [`SdkConfig`].\n        ///\n        /// # Examples\n        /// ```no_run\n        /// # async fn create_config() {\n        /// use aws_types::region::Region;\n        /// let config = aws_config::from_env()\n        ///     .region(Region::new(\"us-east-1\"))\n        ///     .load().await;\n        /// # }\n        /// ```\n        pub fn region(mut self, region: impl ProvideRegion + 'static) -> Self {\n            self.region = Some(Box::new(region));\n            self\n        }\n\n        /// Override the retry_config used to build [`SdkConfig`].\n        ///\n        /// # Examples\n        /// ```no_run\n        /// # async fn create_config() {\n        /// use aws_config::retry::RetryConfig;\n        ///\n        /// let config = aws_config::from_env()\n        ///     .retry_config(RetryConfig::standard().with_max_attempts(2))\n        ///     .load()\n        ///     .await;\n        /// # }\n        /// ```\n        pub fn retry_config(mut self, retry_config: RetryConfig) -> Self {\n            self.retry_config = Some(retry_config);\n            self\n        }\n\n        /// Override the timeout config used to build [`SdkConfig`].\n        ///\n        /// This will be merged with timeouts coming from the timeout information provider, which\n        /// currently includes a default `CONNECT` timeout of `3.1s`.\n        ///\n        /// If you want to disable timeouts, use [`TimeoutConfig::disabled`]. If you want to disable\n        /// a specific timeout, use `TimeoutConfig::set_<type>(None)`.\n        ///\n        /// **Note: This only sets timeouts for calls to AWS services.** Timeouts for the credentials\n        /// provider chain are configured separately.\n        ///\n        /// # Examples\n        /// ```no_run\n        /// # use std::time::Duration;\n        /// # async fn create_config() {\n        /// use aws_config::timeout::TimeoutConfig;\n        ///\n        /// let config = aws_config::from_env()\n        ///    .timeout_config(\n        ///        TimeoutConfig::builder()\n        ///            .operation_timeout(Duration::from_secs(5))\n        ///            .build()\n        ///    )\n        ///    .load()\n        ///    .await;\n        /// # }\n        /// ```\n        pub fn timeout_config(mut self, timeout_config: TimeoutConfig) -> Self {\n            self.timeout_config = Some(timeout_config);\n            self\n        }\n\n        /// Override the sleep implementation for this [`ConfigLoader`].\n        ///\n        /// The sleep implementation is used to create timeout futures.\n        /// You generally won't need to change this unless you're using an async runtime other\n        /// than Tokio.\n        pub fn sleep_impl(mut self, sleep: impl AsyncSleep + 'static) -> Self {\n            // it's possible that we could wrapping an `Arc in an `Arc` and that's OK\n            self.sleep = Some(sleep.into_shared());\n            self\n        }\n\n        /// Set the time source used for tasks like signing requests.\n        ///\n        /// You generally won't need to change this unless you're compiling for a target\n        /// that can't provide a default, such as WASM, or unless you're writing a test against\n        /// the client that needs a fixed time.\n        pub fn time_source(mut self, time_source: impl TimeSource + 'static) -> Self {\n            self.time_source = Some(time_source.into_shared());\n            self\n        }\n\n        /// Override the [`HttpClient`] for this [`ConfigLoader`].\n        ///\n        /// The HTTP client will be used for both AWS services and credentials providers.\n        ///\n        /// If you wish to use a separate HTTP client for credentials providers when creating clients,\n        /// then override the HTTP client set with this function on the client-specific `Config`s.\n        pub fn http_client(mut self, http_client: impl HttpClient + 'static) -> Self {\n            self.http_client = Some(http_client.into_shared());\n            self\n        }\n\n        #[doc = docs_for!(auth_scheme_preference)]\n        ///\n        /// # Examples\n        /// ```no_run\n        /// # use aws_smithy_runtime_api::client::auth::AuthSchemeId;\n        /// # async fn create_config() {\n        /// let config = aws_config::from_env()\n        ///     // Favors a custom auth scheme over the SigV4 auth scheme.\n        ///     // Note: This will not result in an error, even if the custom scheme is missing from the resolved auth schemes.\n        ///     .auth_scheme_preference([AuthSchemeId::from(\"custom\"), aws_runtime::auth::sigv4::SCHEME_ID])\n        ///     .load()\n        ///     .await;\n        /// # }\n        /// ```\n        pub fn auth_scheme_preference(\n            mut self,\n            auth_scheme_preference: impl Into<AuthSchemePreference>,\n        ) -> Self {\n            self.auth_scheme_preference = Some(auth_scheme_preference.into());\n            self\n        }\n\n        #[doc = docs_for!(sigv4a_signing_region_set)]\n        pub fn sigv4a_signing_region_set(\n            mut self,\n            sigv4a_signing_region_set: impl Into<SigningRegionSet>,\n        ) -> Self {\n            self.sigv4a_signing_region_set = Some(sigv4a_signing_region_set.into());\n            self\n        }\n\n        /// Override the identity cache used to build [`SdkConfig`].\n        ///\n        /// The identity cache caches AWS credentials and SSO tokens. By default, a lazy cache is used\n        /// that will load credentials upon first request, cache them, and then reload them during\n        /// another request when they are close to expiring.\n        ///\n        /// # Examples\n        ///\n        /// Change a setting on the default lazy caching implementation:\n        /// ```no_run\n        /// use aws_config::identity::IdentityCache;\n        /// use std::time::Duration;\n        ///\n        /// # async fn create_config() {\n        /// let config = aws_config::from_env()\n        ///     .identity_cache(\n        ///         IdentityCache::lazy()\n        ///             // Change the load timeout to 10 seconds.\n        ///             // Note: there are other timeouts that could trigger if the load timeout is too long.\n        ///             .load_timeout(Duration::from_secs(10))\n        ///             .build()\n        ///     )\n        ///     .load()\n        ///     .await;\n        /// # }\n        /// ```\n        pub fn identity_cache(\n            mut self,\n            identity_cache: impl ResolveCachedIdentity + 'static,\n        ) -> Self {\n            self.identity_cache = Some(identity_cache.into_shared());\n            self\n        }\n\n        /// Override the credentials provider used to build [`SdkConfig`].\n        ///\n        /// # Examples\n        ///\n        /// Override the credentials provider but load the default value for region:\n        /// ```no_run\n        /// # use aws_credential_types::Credentials;\n        /// # fn create_my_credential_provider() -> Credentials {\n        /// #     Credentials::new(\"example\", \"example\", None, None, \"example\")\n        /// # }\n        /// # async fn create_config() {\n        /// let config = aws_config::from_env()\n        ///     .credentials_provider(create_my_credential_provider())\n        ///     .load()\n        ///     .await;\n        /// # }\n        /// ```\n        pub fn credentials_provider(\n            mut self,\n            credentials_provider: impl ProvideCredentials + 'static,\n        ) -> Self {\n            self.credentials_provider =\n                TriStateOption::Set(SharedCredentialsProvider::new(credentials_provider));\n            self\n        }\n\n        /// Don't use credentials to sign requests.\n        ///\n        /// Turning off signing with credentials is necessary in some cases, such as using\n        /// anonymous auth for S3, calling operations in STS that don't require a signature,\n        /// or using token-based auth.\n        ///\n        /// **Note**: For tests, e.g. with a service like DynamoDB Local, this is **not** what you\n        /// want. If credentials are disabled, requests cannot be signed. For these use cases, use\n        /// [`test_credentials`](Self::test_credentials).\n        ///\n        /// # Examples\n        ///\n        /// Turn off credentials in order to call a service without signing:\n        /// ```no_run\n        /// # async fn create_config() {\n        /// let config = aws_config::from_env()\n        ///     .no_credentials()\n        ///     .load()\n        ///     .await;\n        /// # }\n        /// ```\n        pub fn no_credentials(mut self) -> Self {\n            self.credentials_provider = TriStateOption::ExplicitlyUnset;\n            self\n        }\n\n        /// Set test credentials for use when signing requests\n        pub fn test_credentials(self) -> Self {\n            #[allow(unused_mut)]\n            let mut ret = self.credentials_provider(Credentials::for_tests());\n            #[cfg(feature = \"sso\")]\n            {\n                use aws_smithy_runtime_api::client::identity::http::Token;\n                ret = ret.token_provider(Token::for_tests());\n            }\n            ret\n        }\n\n        /// Ignore any environment variables on the host during config resolution\n        ///\n        /// This allows for testing in a reproducible environment that ensures any\n        /// environment variables from the host do not influence environment variable\n        /// resolution.\n        pub fn empty_test_environment(mut self) -> Self {\n            self.env = Some(Env::from_slice(&[]));\n            self\n        }\n\n        /// Override the access token provider used to build [`SdkConfig`].\n        ///\n        /// # Examples\n        ///\n        /// Override the token provider but load the default value for region:\n        /// ```no_run\n        /// # use aws_credential_types::Token;\n        /// # fn create_my_token_provider() -> Token {\n        /// #     Token::new(\"example\", None)\n        /// # }\n        /// # async fn create_config() {\n        /// let config = aws_config::from_env()\n        ///     .token_provider(create_my_token_provider())\n        ///     .load()\n        ///     .await;\n        /// # }\n        /// ```\n        pub fn token_provider(mut self, token_provider: impl ProvideToken + 'static) -> Self {\n            self.token_provider = Some(SharedTokenProvider::new(token_provider));\n            self\n        }\n\n        /// Override the name of the app used to build [`SdkConfig`].\n        ///\n        /// This _optional_ name is used to identify the application in the user agent header that\n        /// gets sent along with requests.\n        ///\n        /// The app name is selected from an ordered list of sources:\n        /// 1. This override.\n        /// 2. The value of the `AWS_SDK_UA_APP_ID` environment variable.\n        /// 3. Profile files from the key `sdk_ua_app_id`\n        ///\n        /// If none of those sources are set the value is `None` and it is not added to the user agent header.\n        ///\n        /// # Examples\n        /// ```no_run\n        /// # async fn create_config() {\n        /// use aws_config::AppName;\n        /// let config = aws_config::from_env()\n        ///     .app_name(AppName::new(\"my-app-name\").expect(\"valid app name\"))\n        ///     .load().await;\n        /// # }\n        /// ```\n        pub fn app_name(mut self, app_name: AppName) -> Self {\n            self.app_name = Some(app_name);\n            self\n        }\n\n        /// Provides the ability to programmatically override the profile files that get loaded by the SDK.\n        ///\n        /// The [`Default`] for `ProfileFiles` includes the default SDK config and credential files located in\n        /// `~/.aws/config` and `~/.aws/credentials` respectively.\n        ///\n        /// Any number of config and credential files may be added to the `ProfileFiles` file set, with the\n        /// only requirement being that there is at least one of each. Profile file locations will produce an\n        /// error if they don't exist, but the default config/credentials files paths are exempt from this validation.\n        ///\n        /// # Example: Using a custom profile file path\n        ///\n        /// ```no_run\n        /// use aws_config::profile::{ProfileFileCredentialsProvider, ProfileFileRegionProvider};\n        /// use aws_config::profile::profile_file::{ProfileFiles, ProfileFileKind};\n        ///\n        /// # async fn example() {\n        /// let profile_files = ProfileFiles::builder()\n        ///     .with_file(ProfileFileKind::Credentials, \"some/path/to/credentials-file\")\n        ///     .build();\n        /// let sdk_config = aws_config::from_env()\n        ///     .profile_files(profile_files)\n        ///     .load()\n        ///     .await;\n        /// # }\n        #[allow(deprecated)]\n        pub fn profile_files(mut self, profile_files: ProfileFiles) -> Self {\n            self.profile_files_override = Some(profile_files);\n            self\n        }\n\n        /// Override the profile name used by configuration providers\n        ///\n        /// Profile name is selected from an ordered list of sources:\n        /// 1. This override.\n        /// 2. The value of the `AWS_PROFILE` environment variable.\n        /// 3. `default`\n        ///\n        /// Each AWS profile has a name. For example, in the file below, the profiles are named\n        /// `dev`, `prod` and `staging`:\n        /// ```ini\n        /// [dev]\n        /// ec2_metadata_service_endpoint = http://my-custom-endpoint:444\n        ///\n        /// [staging]\n        /// ec2_metadata_service_endpoint = http://my-custom-endpoint:444\n        ///\n        /// [prod]\n        /// ec2_metadata_service_endpoint = http://my-custom-endpoint:444\n        /// ```\n        ///\n        /// See [Named profiles](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-profiles.html)\n        /// for more information about naming profiles.\n        ///\n        /// # Example: Using a custom profile name\n        ///\n        /// ```no_run\n        /// use aws_config::profile::{ProfileFileCredentialsProvider, ProfileFileRegionProvider};\n        ///\n        /// # async fn example() {\n        /// let sdk_config = aws_config::from_env()\n        ///     .profile_name(\"prod\")\n        ///     .load()\n        ///     .await;\n        /// # }\n        pub fn profile_name(mut self, profile_name: impl Into<String>) -> Self {\n            self.profile_name_override = Some(profile_name.into());\n            self\n        }\n\n        #[doc = docs_for!(account_id_endpoint_mode)]\n        pub fn account_id_endpoint_mode(\n            mut self,\n            account_id_endpoint_mode: AccountIdEndpointMode,\n        ) -> Self {\n            self.account_id_endpoint_mode = Some(account_id_endpoint_mode);\n            self\n        }\n\n        /// Override the endpoint URL used for **all** AWS services.\n        ///\n        /// This method will override the endpoint URL used for **all** AWS services. This primarily\n        /// exists to set a static endpoint for tools like `LocalStack`. When sending requests to\n        /// production AWS services, this method should only be used for service-specific behavior.\n        ///\n        /// When this method is used, the [`Region`](aws_types::region::Region) is only used for signing;\n        /// It is **not** used to route the request.\n        ///\n        /// # Examples\n        ///\n        /// Use a static endpoint for all services\n        /// ```no_run\n        /// # async fn create_config() {\n        /// let sdk_config = aws_config::from_env()\n        ///     .endpoint_url(\"http://localhost:1234\")\n        ///     .load()\n        ///     .await;\n        /// # }\n        pub fn endpoint_url(mut self, endpoint_url: impl Into<String>) -> Self {\n            self.endpoint_url = Some(endpoint_url.into());\n            self\n        }\n\n        #[doc = docs_for!(use_fips)]\n        pub fn use_fips(mut self, use_fips: bool) -> Self {\n            self.use_fips = Some(use_fips);\n            self\n        }\n\n        #[doc = docs_for!(use_dual_stack)]\n        pub fn use_dual_stack(mut self, use_dual_stack: bool) -> Self {\n            self.use_dual_stack = Some(use_dual_stack);\n            self\n        }\n\n        #[doc = docs_for!(disable_request_compression)]\n        pub fn disable_request_compression(mut self, disable_request_compression: bool) -> Self {\n            self.disable_request_compression = Some(disable_request_compression);\n            self\n        }\n\n        #[doc = docs_for!(request_min_compression_size_bytes)]\n        pub fn request_min_compression_size_bytes(mut self, size: u32) -> Self {\n            self.request_min_compression_size_bytes = Some(size);\n            self\n        }\n\n        /// Override the [`StalledStreamProtectionConfig`] used to build [`SdkConfig`].\n        ///\n        /// This configures stalled stream protection. When enabled, download streams\n        /// that stop (stream no data) for longer than a configured grace period will return an error.\n        ///\n        /// By default, streams that transmit less than one byte per-second for five seconds will\n        /// be cancelled.\n        ///\n        /// _Note_: When an override is provided, the default implementation is replaced.\n        ///\n        /// # Examples\n        /// ```no_run\n        /// # async fn create_config() {\n        /// use aws_config::stalled_stream_protection::StalledStreamProtectionConfig;\n        /// use std::time::Duration;\n        /// let config = aws_config::from_env()\n        ///     .stalled_stream_protection(\n        ///         StalledStreamProtectionConfig::enabled()\n        ///             .grace_period(Duration::from_secs(1))\n        ///             .build()\n        ///     )\n        ///     .load()\n        ///     .await;\n        /// # }\n        /// ```\n        pub fn stalled_stream_protection(\n            mut self,\n            stalled_stream_protection_config: StalledStreamProtectionConfig,\n        ) -> Self {\n            self.stalled_stream_protection_config = Some(stalled_stream_protection_config);\n            self\n        }\n\n        /// Set the checksum calculation strategy to use when making requests.\n        /// # Examples\n        /// ```\n        /// use aws_types::SdkConfig;\n        /// use aws_smithy_types::checksum_config::RequestChecksumCalculation;\n        /// let config = SdkConfig::builder().request_checksum_calculation(RequestChecksumCalculation::WhenSupported).build();\n        /// ```\n        pub fn request_checksum_calculation(\n            mut self,\n            request_checksum_calculation: RequestChecksumCalculation,\n        ) -> Self {\n            self.request_checksum_calculation = Some(request_checksum_calculation);\n            self\n        }\n\n        /// Set the checksum calculation strategy to use for responses.\n        /// # Examples\n        /// ```\n        /// use aws_types::SdkConfig;\n        /// use aws_smithy_types::checksum_config::ResponseChecksumValidation;\n        /// let config = SdkConfig::builder().response_checksum_validation(ResponseChecksumValidation::WhenSupported).build();\n        /// ```\n        pub fn response_checksum_validation(\n            mut self,\n            response_checksum_validation: ResponseChecksumValidation,\n        ) -> Self {\n            self.response_checksum_validation = Some(response_checksum_validation);\n            self\n        }\n\n        /// Load the default configuration chain\n        ///\n        /// If fields have been overridden during builder construction, the override values will be used.\n        ///\n        /// Otherwise, the default values for each field will be provided.\n        ///\n        /// NOTE: When an override is provided, the default implementation is **not** used as a fallback.\n        /// This means that if you provide a region provider that does not return a region, no region will\n        /// be set in the resulting [`SdkConfig`].\n        pub async fn load(self) -> SdkConfig {\n            let time_source = self.time_source.unwrap_or_default();\n\n            let sleep_impl = if self.sleep.is_some() {\n                self.sleep\n            } else {\n                if default_async_sleep().is_none() {\n                    tracing::warn!(\n                        \"An implementation of AsyncSleep was requested by calling default_async_sleep \\\n                         but no default was set.\n                         This happened when ConfigLoader::load was called during Config construction. \\\n                         You can fix this by setting a sleep_impl on the ConfigLoader before calling \\\n                         load or by enabling the rt-tokio feature\"\n                    );\n                }\n                default_async_sleep()\n            };\n\n            let conf = self\n                .provider_config\n                .unwrap_or_else(|| {\n                    let mut config = ProviderConfig::init(time_source.clone(), sleep_impl.clone())\n                        .with_fs(self.fs.unwrap_or_default())\n                        .with_env(self.env.unwrap_or_default());\n                    if let Some(http_client) = self.http_client.clone() {\n                        config = config.with_http_client(http_client);\n                    }\n                    config\n                })\n                .with_profile_config(self.profile_files_override, self.profile_name_override);\n\n            let use_fips = if let Some(use_fips) = self.use_fips {\n                Some(use_fips)\n            } else {\n                use_fips::use_fips_provider(&conf).await\n            };\n\n            let use_dual_stack = if let Some(use_dual_stack) = self.use_dual_stack {\n                Some(use_dual_stack)\n            } else {\n                use_dual_stack::use_dual_stack_provider(&conf).await\n            };\n\n            let conf = conf\n                .with_use_fips(use_fips)\n                .with_use_dual_stack(use_dual_stack);\n\n            let region = if let Some(provider) = self.region {\n                provider.region().await\n            } else {\n                region::Builder::default()\n                    .configure(&conf)\n                    .build()\n                    .region()\n                    .await\n            };\n            let conf = conf.with_region(region.clone());\n\n            let retry_config = if let Some(retry_config) = self.retry_config {\n                retry_config\n            } else {\n                retry_config::default_provider()\n                    .configure(&conf)\n                    .retry_config()\n                    .await\n            };\n\n            let app_name = if self.app_name.is_some() {\n                self.app_name\n            } else {\n                app_name::default_provider()\n                    .configure(&conf)\n                    .app_name()\n                    .await\n            };\n\n            let disable_request_compression = if self.disable_request_compression.is_some() {\n                self.disable_request_compression\n            } else {\n                disable_request_compression::disable_request_compression_provider(&conf).await\n            };\n\n            let request_min_compression_size_bytes =\n                if self.request_min_compression_size_bytes.is_some() {\n                    self.request_min_compression_size_bytes\n                } else {\n                    request_min_compression_size_bytes::request_min_compression_size_bytes_provider(\n                        &conf,\n                    )\n                    .await\n                };\n\n            let base_config = timeout_config::default_provider()\n                .configure(&conf)\n                .timeout_config()\n                .await;\n            let mut timeout_config = self\n                .timeout_config\n                .unwrap_or_else(|| TimeoutConfig::builder().build());\n            timeout_config.take_defaults_from(&base_config);\n\n            let credentials_provider = match self.credentials_provider {\n                TriStateOption::Set(provider) => Some(provider),\n                TriStateOption::NotSet => {\n                    let mut builder =\n                        credentials::DefaultCredentialsChain::builder().configure(conf.clone());\n                    builder.set_region(region.clone());\n                    Some(SharedCredentialsProvider::new(builder.build().await))\n                }\n                TriStateOption::ExplicitlyUnset => None,\n            };\n\n            let profiles = conf.profile().await;\n            let service_config = EnvServiceConfig {\n                env: conf.env(),\n                env_config_sections: profiles.cloned().unwrap_or_default(),\n            };\n            let mut builder = SdkConfig::builder()\n                .region(region.clone())\n                .retry_config(retry_config)\n                .timeout_config(timeout_config)\n                .time_source(time_source)\n                .service_config(service_config);\n\n            // If an endpoint URL is set programmatically, then our work is done.\n            let endpoint_url = if self.endpoint_url.is_some() {\n                builder.insert_origin(\"endpoint_url\", Origin::shared_config());\n                self.endpoint_url\n            } else {\n                // Otherwise, check to see if we should ignore EP URLs set in the environment.\n                let ignore_configured_endpoint_urls =\n                    ignore_ep::ignore_configured_endpoint_urls_provider(&conf)\n                        .await\n                        .unwrap_or_default();\n\n                if ignore_configured_endpoint_urls {\n                    // If yes, log a trace and return `None`.\n                    tracing::trace!(\n                        \"`ignore_configured_endpoint_urls` is set, any endpoint URLs configured in the environment will be ignored. \\\n                        NOTE: Endpoint URLs set programmatically WILL still be respected\"\n                    );\n                    None\n                } else {\n                    // Otherwise, attempt to resolve one.\n                    let (v, origin) = endpoint_url::endpoint_url_provider_with_origin(&conf).await;\n                    builder.insert_origin(\"endpoint_url\", origin);\n                    v\n                }\n            };\n\n            let token_provider = match self.token_provider {\n                Some(provider) => {\n                    builder.insert_origin(\"token_provider\", Origin::shared_config());\n                    Some(provider)\n                }\n                None => {\n                    #[cfg(feature = \"sso\")]\n                    {\n                        let mut builder =\n                            crate::default_provider::token::DefaultTokenChain::builder()\n                                .configure(conf.clone());\n                        builder.set_region(region);\n                        Some(SharedTokenProvider::new(builder.build().await))\n                    }\n                    #[cfg(not(feature = \"sso\"))]\n                    {\n                        None\n                    }\n                    // Not setting `Origin` in this arm, and that's good for now as long as we know\n                    // it's not programmatically set in the shared config.\n                    // We can consider adding `Origin::Default` if needed.\n                }\n            };\n\n            builder.set_endpoint_url(endpoint_url);\n            builder.set_behavior_version(self.behavior_version);\n            builder.set_http_client(self.http_client);\n            builder.set_app_name(app_name);\n\n            let identity_cache = match self.identity_cache {\n                None => match self.behavior_version {\n                    #[allow(deprecated)]\n                    Some(bv) if bv.is_at_least(BehaviorVersion::v2024_03_28()) => {\n                        Some(IdentityCache::lazy().build())\n                    }\n                    _ => None,\n                },\n                Some(user_cache) => Some(user_cache),\n            };\n\n            let request_checksum_calculation =\n                if let Some(request_checksum_calculation) = self.request_checksum_calculation {\n                    Some(request_checksum_calculation)\n                } else {\n                    checksums::request_checksum_calculation_provider(&conf).await\n                };\n\n            let response_checksum_validation =\n                if let Some(response_checksum_validation) = self.response_checksum_validation {\n                    Some(response_checksum_validation)\n                } else {\n                    checksums::response_checksum_validation_provider(&conf).await\n                };\n\n            let account_id_endpoint_mode =\n                if let Some(acccount_id_endpoint_mode) = self.account_id_endpoint_mode {\n                    Some(acccount_id_endpoint_mode)\n                } else {\n                    account_id_endpoint_mode::account_id_endpoint_mode_provider(&conf).await\n                };\n\n            let auth_scheme_preference =\n                if let Some(auth_scheme_preference) = self.auth_scheme_preference {\n                    builder.insert_origin(\"auth_scheme_preference\", Origin::shared_config());\n                    Some(auth_scheme_preference)\n                } else {\n                    auth_scheme_preference::auth_scheme_preference_provider(&conf).await\n                    // Not setting `Origin` in this arm, and that's good for now as long as we know\n                    // it's not programmatically set in the shared config.\n                };\n\n            let sigv4a_signing_region_set =\n                if let Some(sigv4a_signing_region_set) = self.sigv4a_signing_region_set {\n                    Some(sigv4a_signing_region_set)\n                } else {\n                    sigv4a_signing_region_set::sigv4a_signing_region_set_provider(&conf).await\n                };\n\n            builder.set_request_checksum_calculation(request_checksum_calculation);\n            builder.set_response_checksum_validation(response_checksum_validation);\n            builder.set_identity_cache(identity_cache);\n            builder.set_credentials_provider(credentials_provider);\n            builder.set_token_provider(token_provider);\n            builder.set_sleep_impl(sleep_impl);\n            builder.set_use_fips(use_fips);\n            builder.set_use_dual_stack(use_dual_stack);\n            builder.set_disable_request_compression(disable_request_compression);\n            builder.set_request_min_compression_size_bytes(request_min_compression_size_bytes);\n            builder.set_stalled_stream_protection(self.stalled_stream_protection_config);\n            builder.set_account_id_endpoint_mode(account_id_endpoint_mode);\n            builder.set_auth_scheme_preference(auth_scheme_preference);\n            builder.set_sigv4a_signing_region_set(sigv4a_signing_region_set);\n            builder.build()\n        }\n    }\n\n    #[cfg(test)]\n    impl ConfigLoader {\n        pub(crate) fn env(mut self, env: Env) -> Self {\n            self.env = Some(env);\n            self\n        }\n\n        pub(crate) fn fs(mut self, fs: Fs) -> Self {\n            self.fs = Some(fs);\n            self\n        }\n    }\n\n    #[cfg(test)]\n    mod test {\n        #[allow(deprecated)]\n        use crate::profile::profile_file::{ProfileFileKind, ProfileFiles};\n        use crate::test_case::{no_traffic_client, InstantSleep};\n        use crate::BehaviorVersion;\n        use crate::{defaults, ConfigLoader};\n        use aws_credential_types::provider::ProvideCredentials;\n        use aws_smithy_async::rt::sleep::TokioSleep;\n        use aws_smithy_http_client::test_util::{infallible_client_fn, NeverClient};\n        use aws_smithy_runtime::test_util::capture_test_logs::capture_test_logs;\n        use aws_types::app_name::AppName;\n        use aws_types::origin::Origin;\n        use aws_types::os_shim_internal::{Env, Fs};\n        use aws_types::sdk_config::{RequestChecksumCalculation, ResponseChecksumValidation};\n        use std::sync::atomic::{AtomicUsize, Ordering};\n        use std::sync::Arc;\n\n        #[tokio::test]\n        async fn provider_config_used() {\n            let (_guard, logs_rx) = capture_test_logs();\n            let env = Env::from_slice(&[\n                (\"AWS_MAX_ATTEMPTS\", \"10\"),\n                (\"AWS_REGION\", \"us-west-4\"),\n                (\"AWS_ACCESS_KEY_ID\", \"akid\"),\n                (\"AWS_SECRET_ACCESS_KEY\", \"secret\"),\n            ]);\n            let fs =\n                Fs::from_slice(&[(\"test_config\", \"[profile custom]\\nsdk-ua-app-id = correct\")]);\n            let loader = defaults(BehaviorVersion::latest())\n                .sleep_impl(TokioSleep::new())\n                .env(env)\n                .fs(fs)\n                .http_client(NeverClient::new())\n                .profile_name(\"custom\")\n                .profile_files(\n                    #[allow(deprecated)]\n                    ProfileFiles::builder()\n                        .with_file(\n                            #[allow(deprecated)]\n                            ProfileFileKind::Config,\n                            \"test_config\",\n                        )\n                        .build(),\n                )\n                .load()\n                .await;\n            assert_eq!(10, loader.retry_config().unwrap().max_attempts());\n            assert_eq!(\"us-west-4\", loader.region().unwrap().as_ref());\n            assert_eq!(\n                \"akid\",\n                loader\n                    .credentials_provider()\n                    .unwrap()\n                    .provide_credentials()\n                    .await\n                    .unwrap()\n                    .access_key_id(),\n            );\n            assert_eq!(Some(&AppName::new(\"correct\").unwrap()), loader.app_name());\n\n            let num_config_loader_logs = logs_rx.contents()\n                .lines()\n                // The logger uses fancy formatting, so we have to account for that.\n                .filter(|l| l.contains(\"config file loaded \\u{1b}[3mpath\\u{1b}[0m\\u{1b}[2m=\\u{1b}[0mSome(\\\"test_config\\\") \\u{1b}[3msize\\u{1b}[0m\\u{1b}[2m=\\u{1b}\"))\n                .count();\n\n            match num_config_loader_logs {\n                0 => panic!(\"no config file logs found!\"),\n                1 => (),\n                more => panic!(\"the config file was parsed more than once! (parsed {more})\",),\n            };\n        }\n\n        fn base_conf() -> ConfigLoader {\n            defaults(BehaviorVersion::latest())\n                .sleep_impl(InstantSleep)\n                .http_client(no_traffic_client())\n        }\n\n        #[tokio::test]\n        async fn test_origin_programmatic() {\n            let _ = tracing_subscriber::fmt::try_init();\n            let loader = base_conf()\n                .test_credentials()\n                .profile_name(\"custom\")\n                .profile_files(\n                    #[allow(deprecated)]\n                    ProfileFiles::builder()\n                        .with_contents(\n                            #[allow(deprecated)]\n                            ProfileFileKind::Config,\n                            \"[profile custom]\\nendpoint_url = http://localhost:8989\",\n                        )\n                        .build(),\n                )\n                .endpoint_url(\"http://localhost:1111\")\n                .load()\n                .await;\n            assert_eq!(Origin::shared_config(), loader.get_origin(\"endpoint_url\"));\n        }\n\n        #[tokio::test]\n        async fn test_origin_env() {\n            let _ = tracing_subscriber::fmt::try_init();\n            let env = Env::from_slice(&[(\"AWS_ENDPOINT_URL\", \"http://localhost:7878\")]);\n            let loader = base_conf()\n                .test_credentials()\n                .env(env)\n                .profile_name(\"custom\")\n                .profile_files(\n                    #[allow(deprecated)]\n                    ProfileFiles::builder()\n                        .with_contents(\n                            #[allow(deprecated)]\n                            ProfileFileKind::Config,\n                            \"[profile custom]\\nendpoint_url = http://localhost:8989\",\n                        )\n                        .build(),\n                )\n                .load()\n                .await;\n            assert_eq!(\n                Origin::shared_environment_variable(),\n                loader.get_origin(\"endpoint_url\")\n            );\n        }\n\n        #[tokio::test]\n        async fn test_origin_fs() {\n            let _ = tracing_subscriber::fmt::try_init();\n            let loader = base_conf()\n                .test_credentials()\n                .profile_name(\"custom\")\n                .profile_files(\n                    #[allow(deprecated)]\n                    ProfileFiles::builder()\n                        .with_contents(\n                            #[allow(deprecated)]\n                            ProfileFileKind::Config,\n                            \"[profile custom]\\nendpoint_url = http://localhost:8989\",\n                        )\n                        .build(),\n                )\n                .load()\n                .await;\n            assert_eq!(\n                Origin::shared_profile_file(),\n                loader.get_origin(\"endpoint_url\")\n            );\n        }\n\n        #[tokio::test]\n        async fn load_use_fips() {\n            let conf = base_conf().use_fips(true).load().await;\n            assert_eq!(Some(true), conf.use_fips());\n        }\n\n        #[tokio::test]\n        async fn load_dual_stack() {\n            let conf = base_conf().use_dual_stack(false).load().await;\n            assert_eq!(Some(false), conf.use_dual_stack());\n\n            let conf = base_conf().load().await;\n            assert_eq!(None, conf.use_dual_stack());\n        }\n\n        #[tokio::test]\n        async fn load_disable_request_compression() {\n            let conf = base_conf().disable_request_compression(true).load().await;\n            assert_eq!(Some(true), conf.disable_request_compression());\n\n            let conf = base_conf().load().await;\n            assert_eq!(None, conf.disable_request_compression());\n        }\n\n        #[tokio::test]\n        async fn load_request_min_compression_size_bytes() {\n            let conf = base_conf()\n                .request_min_compression_size_bytes(99)\n                .load()\n                .await;\n            assert_eq!(Some(99), conf.request_min_compression_size_bytes());\n\n            let conf = base_conf().load().await;\n            assert_eq!(None, conf.request_min_compression_size_bytes());\n        }\n\n        #[tokio::test]\n        async fn app_name() {\n            let app_name = AppName::new(\"my-app-name\").unwrap();\n            let conf = base_conf().app_name(app_name.clone()).load().await;\n            assert_eq!(Some(&app_name), conf.app_name());\n        }\n\n        #[tokio::test]\n        async fn request_checksum_calculation() {\n            let conf = base_conf()\n                .request_checksum_calculation(RequestChecksumCalculation::WhenRequired)\n                .load()\n                .await;\n            assert_eq!(\n                Some(RequestChecksumCalculation::WhenRequired),\n                conf.request_checksum_calculation()\n            );\n        }\n\n        #[tokio::test]\n        async fn response_checksum_validation() {\n            let conf = base_conf()\n                .response_checksum_validation(ResponseChecksumValidation::WhenRequired)\n                .load()\n                .await;\n            assert_eq!(\n                Some(ResponseChecksumValidation::WhenRequired),\n                conf.response_checksum_validation()\n            );\n        }\n\n        #[cfg(feature = \"default-https-client\")]\n        #[tokio::test]\n        async fn disable_default_credentials() {\n            let config = defaults(BehaviorVersion::latest())\n                .no_credentials()\n                .load()\n                .await;\n            assert!(config.credentials_provider().is_none());\n        }\n\n        #[cfg(feature = \"default-https-client\")]\n        #[tokio::test]\n        async fn identity_cache_defaulted() {\n            let config = defaults(BehaviorVersion::latest()).load().await;\n\n            assert!(config.identity_cache().is_some());\n        }\n\n        #[cfg(feature = \"default-https-client\")]\n        #[allow(deprecated)]\n        #[tokio::test]\n        async fn identity_cache_old_behavior_version() {\n            let config = defaults(BehaviorVersion::v2023_11_09()).load().await;\n\n            assert!(config.identity_cache().is_none());\n        }\n\n        #[tokio::test]\n        async fn connector_is_shared() {\n            let num_requests = Arc::new(AtomicUsize::new(0));\n            let movable = num_requests.clone();\n            let http_client = infallible_client_fn(move |_req| {\n                movable.fetch_add(1, Ordering::Relaxed);\n                http::Response::new(\"ok!\")\n            });\n            let config = defaults(BehaviorVersion::latest())\n                .fs(Fs::from_slice(&[]))\n                .env(Env::from_slice(&[]))\n                .http_client(http_client.clone())\n                .load()\n                .await;\n            config\n                .credentials_provider()\n                .unwrap()\n                .provide_credentials()\n                .await\n                .expect_err(\"did not expect credentials to be loaded—no traffic is allowed\");\n            let num_requests = num_requests.load(Ordering::Relaxed);\n            assert!(num_requests > 0, \"{}\", num_requests);\n        }\n\n        #[tokio::test]\n        async fn endpoint_urls_may_be_ignored_from_env() {\n            let fs = Fs::from_slice(&[(\n                \"test_config\",\n                \"[profile custom]\\nendpoint_url = http://profile\",\n            )]);\n            let env = Env::from_slice(&[(\"AWS_IGNORE_CONFIGURED_ENDPOINT_URLS\", \"true\")]);\n\n            let conf = base_conf().use_dual_stack(false).load().await;\n            assert_eq!(Some(false), conf.use_dual_stack());\n\n            let conf = base_conf().load().await;\n            assert_eq!(None, conf.use_dual_stack());\n\n            // Check that we get nothing back because the env said we should ignore endpoints\n            let config = base_conf()\n                .fs(fs.clone())\n                .env(env)\n                .profile_name(\"custom\")\n                .profile_files(\n                    #[allow(deprecated)]\n                    ProfileFiles::builder()\n                        .with_file(\n                            #[allow(deprecated)]\n                            ProfileFileKind::Config,\n                            \"test_config\",\n                        )\n                        .build(),\n                )\n                .load()\n                .await;\n            assert_eq!(None, config.endpoint_url());\n\n            // Check that without the env, we DO get something back\n            let config = base_conf()\n                .fs(fs)\n                .profile_name(\"custom\")\n                .profile_files(\n                    #[allow(deprecated)]\n                    ProfileFiles::builder()\n                        .with_file(\n                            #[allow(deprecated)]\n                            ProfileFileKind::Config,\n                            \"test_config\",\n                        )\n                        .build(),\n                )\n                .load()\n                .await;\n            assert_eq!(Some(\"http://profile\"), config.endpoint_url());\n        }\n\n        #[tokio::test]\n        async fn endpoint_urls_may_be_ignored_from_profile() {\n            let fs = Fs::from_slice(&[(\n                \"test_config\",\n                \"[profile custom]\\nignore_configured_endpoint_urls = true\",\n            )]);\n            let env = Env::from_slice(&[(\"AWS_ENDPOINT_URL\", \"http://environment\")]);\n\n            // Check that we get nothing back because the profile said we should ignore endpoints\n            let config = base_conf()\n                .fs(fs)\n                .env(env.clone())\n                .profile_name(\"custom\")\n                .profile_files(\n                    #[allow(deprecated)]\n                    ProfileFiles::builder()\n                        .with_file(\n                            #[allow(deprecated)]\n                            ProfileFileKind::Config,\n                            \"test_config\",\n                        )\n                        .build(),\n                )\n                .load()\n                .await;\n            assert_eq!(None, config.endpoint_url());\n\n            // Check that without the profile, we DO get something back\n            let config = base_conf().env(env).load().await;\n            assert_eq!(Some(\"http://environment\"), config.endpoint_url());\n        }\n\n        #[tokio::test]\n        async fn programmatic_endpoint_urls_may_not_be_ignored() {\n            let fs = Fs::from_slice(&[(\n                \"test_config\",\n                \"[profile custom]\\nignore_configured_endpoint_urls = true\",\n            )]);\n            let env = Env::from_slice(&[(\"AWS_IGNORE_CONFIGURED_ENDPOINT_URLS\", \"true\")]);\n\n            // Check that we get something back because we explicitly set the loader's endpoint URL\n            let config = base_conf()\n                .fs(fs)\n                .env(env)\n                .endpoint_url(\"http://localhost\")\n                .profile_name(\"custom\")\n                .profile_files(\n                    #[allow(deprecated)]\n                    ProfileFiles::builder()\n                        .with_file(\n                            #[allow(deprecated)]\n                            ProfileFileKind::Config,\n                            \"test_config\",\n                        )\n                        .build(),\n                )\n                .load()\n                .await;\n            assert_eq!(Some(\"http://localhost\"), config.endpoint_url());\n        }\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/src/login/cache.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::login::token::{LoginToken, LoginTokenError};\nuse crate::login::PROVIDER_NAME;\nuse aws_credential_types::Credentials;\nuse aws_runtime::fs_util::home_dir;\nuse aws_runtime::fs_util::Os;\nuse aws_smithy_json::deserialize::token::skip_value;\nuse aws_smithy_json::deserialize::{json_token_iter, Token};\nuse aws_smithy_json::serialize::JsonObjectWriter;\nuse aws_smithy_types::date_time::Format;\nuse aws_smithy_types::DateTime;\nuse aws_types::os_shim_internal::Env;\nuse aws_types::os_shim_internal::Fs;\nuse sha2::Digest;\nuse sha2::Sha256;\nuse std::path::Path;\nuse std::path::PathBuf;\nuse zeroize::Zeroizing;\n\nconst LOGIN_CACHE_DIRECTORY_ENV_VAR: &str = \"AWS_LOGIN_CACHE_DIRECTORY\";\n\n/// Get the cache directory for Login (Sign-In) tokens\nfn get_cache_dir(env: &Env) -> Result<PathBuf, LoginTokenError> {\n    match env.get(LOGIN_CACHE_DIRECTORY_ENV_VAR).ok() {\n        Some(cache_dir) => Ok(PathBuf::from(cache_dir)),\n        None => {\n            let home = home_dir(env, Os::real()).ok_or(LoginTokenError::NoHomeDirectory)?;\n            Ok(PathBuf::from(home).join(\".aws/login/cache\"))\n        }\n    }\n}\n\n/// Determine the cached token path for a login session identifier.\n///\n/// The `cache_dir` is the directory used for caching AWS Sign-In tokens\nfn cached_token_path(cache_dir: &Path, login_session: &str) -> PathBuf {\n    let login_sesion_sha256 = hex::encode(Sha256::digest(login_session.trim().as_bytes()));\n    let mut out = cache_dir.join(login_sesion_sha256);\n    out.set_extension(\"json\");\n    out\n}\n\n/// Load the token for `identifier` from `~/.aws/login/cache/<hashofidentifier>.json`\n///\n/// The `identifier` is the `login_session` ARN to load the token for\npub(super) async fn load_cached_token(\n    env: &Env,\n    fs: &Fs,\n    identifier: &str,\n) -> Result<LoginToken, LoginTokenError> {\n    let cache_dir = get_cache_dir(env)?;\n    let path = cached_token_path(&cache_dir, identifier);\n    let data =\n        Zeroizing::new(\n            fs.read_to_end(&path)\n                .await\n                .map_err(|source| LoginTokenError::IoError {\n                    what: \"read\",\n                    path,\n                    source,\n                })?,\n        );\n    parse_cached_token(&data)\n}\n\n/// Save the token for `identifier` to `~/.aws/login/cache/<hashofidentifier>.json`\n///\n/// The `identifier` is the `login_session` ARN to save the token for\npub(super) async fn save_cached_token(\n    env: &Env,\n    fs: &Fs,\n    identifier: &str,\n    token: &LoginToken,\n) -> Result<(), LoginTokenError> {\n    let cache_dir = get_cache_dir(env)?;\n    let path = cached_token_path(&cache_dir, identifier);\n\n    let expiration = DateTime::from(token.expires_at())\n        .fmt(Format::DateTime)\n        .map_err(|e| LoginTokenError::FailedToFormatDateTime { source: e.into() })?;\n\n    let mut out = Zeroizing::new(String::new());\n    let mut writer = JsonObjectWriter::new(&mut out);\n\n    // Write accessToken object\n    let mut access_token = writer.key(\"accessToken\").start_object();\n    access_token\n        .key(\"accessKeyId\")\n        .string(token.access_token.access_key_id());\n    access_token\n        .key(\"secretAccessKey\")\n        .string(token.access_token.secret_access_key());\n    access_token\n        .key(\"sessionToken\")\n        .string(token.access_token.session_token().expect(\"session token\"));\n    access_token.key(\"accountId\").string(\n        token\n            .access_token\n            .account_id()\n            .expect(\"account id\")\n            .as_str(),\n    );\n    access_token.key(\"expiresAt\").string(&expiration);\n    access_token.finish();\n\n    if let Some(token_type) = &token.token_type {\n        writer.key(\"tokenType\").string(token_type.as_str());\n    }\n\n    writer\n        .key(\"refreshToken\")\n        .string(token.refresh_token.as_str());\n    if let Some(identity_token) = &token.identity_token {\n        writer.key(\"idToken\").string(identity_token);\n    }\n    writer.key(\"clientId\").string(&token.client_id);\n    writer.key(\"dpopKey\").string(token.dpop_key.as_str());\n    writer.finish();\n\n    fs.write(&path, out.as_bytes())\n        .await\n        .map_err(|source| LoginTokenError::IoError {\n            what: \"write\",\n            path,\n            source,\n        })?;\n    Ok(())\n}\n\n/// Parse SSO token JSON from input\nfn parse_cached_token(cached_token_file_contents: &[u8]) -> Result<LoginToken, LoginTokenError> {\n    use LoginTokenError as Error;\n\n    /*\n        {\n          \"accessToken\": {\n            \"accessKeyId\": \"AKIAIOSFODNN7EXAMPLE\",\n            \"secretAccessKey\": \"wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY\",\n            \"sessionToken\": \"AQoEXAMPLEH4aoAH0gNCAPyJxz4BlCFFxWNE1OPTgk5TthT+FvwqnKwRcOIfrRh3c/LTo6UDdyJwOOvEVPvLXCrrrUtdnniCEXAMPLE/IvU1dYUg2RVAJBanLiHb4IgRmpRV3zrkuWJOgQs8IZZaIv2BXIa2R4OlgkBN9bkUDNCJiBeb/AXlzBBko7b15fjrBs2+cTQtpZ3CYWFXG8C5zqx37wnOE49mRl/+OtkIKGO7fAE\"\n            \"accountId\": \"012345678901\",\n            \"expiresAt\": \"2025-09-14T04:05:45Z\",\n          },\n          \"tokenType\": \"aws_sigv4\",\n          \"refreshToken\": \"<opaque string>\",\n          \"idToken\": \"eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.EkN-DOsnsuRjRO6BxXemmJDm3HbxrbRzXglbN2S4sOkopdU4IsDxTI8jO19W_A4K8ZPJijNLis4EZsHeY559a4DFOd50_OqgHs3UjpbCqhpuU5K_TGOj3pY-TJXSw\",\n          \"clientId\": \"arn:aws:signin:::devtools/same-device\",\n          \"dpopKey\": \"-----BEGIN EC PRIVATE KEY-----\\nMHcCAQEEIFDZHUzOG1Pzq+6F0mjMlOSp1syN9LRPBuHMoCFXTcXhoAoGCCqGSM49\\nAwEHoUQDQgAE9qhj+KtcdHj1kVgwxWWWw++tqoh7H7UHs7oXh8jBbgF47rrYGC+t\\ndjiIaHK3dBvvdE7MGj5HsepzLm3Kj91bqA==\\n-----END EC PRIVATE KEY-----\\n\"\n        }\n    */\n\n    let mut access_key_id = None;\n    let mut secret_access_key = None;\n    let mut session_token = None;\n    let mut account_id = None;\n    let mut expires_at = None;\n    let mut token_type = None;\n    let mut refresh_token = None;\n    let mut identity_token = None;\n    let mut client_id = None;\n    let mut dpop_key = None;\n\n    let mut tokens = json_token_iter(cached_token_file_contents).peekable();\n    if !matches!(tokens.next().transpose()?, Some(Token::StartObject { .. })) {\n        return Err(Error::other(\n            \"expected a JSON document starting with `{`\",\n            None,\n        ));\n    }\n\n    loop {\n        match tokens.next().transpose()? {\n            Some(Token::EndObject { .. }) => break,\n            Some(Token::ObjectKey { key, .. }) => {\n                let key = key.to_unescaped()?;\n\n                if let Some(Ok(token)) = tokens.peek() {\n                    if key.eq_ignore_ascii_case(\"accessToken\") {\n                        if let Token::StartObject { offset } = token {\n                            let start = offset.0;\n                            tokens.next(); // consume StartObject\n\n                            loop {\n                                match tokens.next().transpose()? {\n                                    Some(Token::EndObject { offset }) => {\n                                        let end = offset.0 + 1;\n                                        let access_token_json = std::str::from_utf8(\n                                            &cached_token_file_contents[start..end],\n                                        )\n                                        .map_err(|e| Error::JsonError(e.into()))?;\n\n                                        let creds =\n                                            crate::json_credentials::parse_json_credentials(\n                                                access_token_json,\n                                            )\n                                            .map_err(|e| Error::JsonError(Box::new(e)))?;\n\n                                        match creds {\n                                            crate::json_credentials::JsonCredentials::RefreshableCredentials(c) => {\n                                                access_key_id = Some(c.access_key_id.into_owned());\n                                                secret_access_key = Some(c.secret_access_key.into_owned());\n                                                session_token = Some(c.session_token.into_owned());\n                                                account_id = c.account_id.map(|a| a.into_owned());\n                                                expires_at = Some(c.expiration);\n                                            }\n                                            crate::json_credentials::JsonCredentials::Error { code, message } => {\n                                                return Err(Error::JsonError(format!(\"error parsing `accessToken`: {code} - {message}\").into()))\n                                            }\n                                        }\n                                        break;\n                                    }\n                                    Some(Token::StartObject { .. }) => {\n                                        return Err(Error::JsonError(\n                                            \"unexpected nested object in `accessToken`\".into(),\n                                        ));\n                                    }\n                                    None => {\n                                        return Err(Error::JsonError(\n                                            \"unexpected end of JSON parsing `accessToken`\".into(),\n                                        ))\n                                    }\n                                    _ => {}\n                                }\n                            }\n                            continue;\n                        }\n                    }\n\n                    match (key.as_ref(), token) {\n                        (k, Token::ValueString { value, .. })\n                            if k.eq_ignore_ascii_case(\"tokenType\") =>\n                        {\n                            token_type = Some(value.to_unescaped()?.into_owned());\n                        }\n                        (k, Token::ValueString { value, .. })\n                            if k.eq_ignore_ascii_case(\"refreshToken\") =>\n                        {\n                            refresh_token =\n                                Some(Zeroizing::new(value.to_unescaped()?.into_owned()));\n                        }\n                        (k, Token::ValueString { value, .. })\n                            if k.eq_ignore_ascii_case(\"idToken\") =>\n                        {\n                            identity_token = Some(value.to_unescaped()?.into_owned());\n                        }\n                        (k, Token::ValueString { value, .. })\n                            if k.eq_ignore_ascii_case(\"clientId\") =>\n                        {\n                            client_id = Some(value.to_unescaped()?.into_owned());\n                        }\n                        (k, Token::ValueString { value, .. })\n                            if k.eq_ignore_ascii_case(\"dpopKey\") =>\n                        {\n                            dpop_key =\n                                Some(Zeroizing::new(value.to_unescaped()?.replace(\"\\\\n\", \"\\n\")));\n                        }\n                        _ => {}\n                    }\n                }\n                skip_value(&mut tokens)?;\n            }\n            other => {\n                return Err(Error::other(\n                    format!(\"expected object key, found: {other:?}\"),\n                    None,\n                ));\n            }\n        }\n    }\n\n    let access_key_id = access_key_id.ok_or(Error::MissingField(\"accessKeyId\"))?;\n    let secret_access_key = secret_access_key.ok_or(Error::MissingField(\"secretAccessKey\"))?;\n    let session_token = session_token.ok_or(Error::MissingField(\"sessionToken\"))?;\n    let account_id = account_id.ok_or(Error::MissingField(\"accountId\"))?;\n    let client_id = client_id.ok_or(Error::MissingField(\"clientId\"))?;\n    let dpop_key = dpop_key.ok_or(Error::MissingField(\"dpopKey\"))?;\n    let refresh_token = refresh_token.ok_or(Error::MissingField(\"refreshToken\"))?;\n    let expires_at = expires_at.ok_or(Error::MissingField(\"expiresAt\"))?;\n\n    let credentials = Credentials::builder()\n        .access_key_id(access_key_id)\n        .secret_access_key(secret_access_key)\n        .session_token(session_token)\n        .account_id(account_id)\n        .provider_name(PROVIDER_NAME)\n        .expiry(expires_at)\n        .build();\n\n    Ok(LoginToken {\n        access_token: credentials,\n        token_type,\n        identity_token,\n        refresh_token,\n        client_id,\n        dpop_key,\n    })\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use std::time::Duration;\n\n    const TEST_CACHE_DIR: &str = \"/home/someuser/.aws/login/cache\";\n\n    #[cfg_attr(windows, ignore)]\n    #[test]\n    fn determine_correct_cache_filenames() {\n        let cache_dir = PathBuf::from(TEST_CACHE_DIR);\n        assert_eq!(\n            \"/home/someuser/.aws/login/cache/36db1d138ff460920374e4c3d8e01f53f9f73537e89c88d639f68393df0e2726.json\",\n            cached_token_path(&cache_dir, \"arn:aws:iam::0123456789012:user/Admin\").as_os_str()\n        );\n        assert_eq!(\n            \"/home/someuser/.aws/login/cache/36db1d138ff460920374e4c3d8e01f53f9f73537e89c88d639f68393df0e2726.json\",\n            cached_token_path(&cache_dir, \"  arn:aws:iam::0123456789012:user/Admin  \").as_os_str()\n        );\n        assert_eq!(\n            \"/home/someuser/.aws/login/cache/d19c78f768c6a12874de5f41d7f22cbb834ba205704102da0db20d8496efecb5.json\",\n            cached_token_path(&cache_dir, \"arn:aws:iam::000000000000:user/PowerUser\").as_os_str()\n        );\n    }\n\n    #[test]\n    fn parse_valid_token() {\n        let file_contents = r#\"{\n            \"accessToken\": {\n                \"accessKeyId\": \"AKIAIOSFODNN7EXAMPLE\",\n                \"secretAccessKey\": \"wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY\",\n                \"sessionToken\": \"session-token\",\n                \"accountId\": \"012345678901\",\n                \"expiresAt\": \"2021-12-25T21:30:00Z\"\n            },\n            \"tokenType\": \"aws_sigv4\",\n            \"refreshToken\": \"refresh-token-value\",\n            \"idToken\": \"identity-token-value\",\n            \"clientId\": \"arn:aws:signin:::devtools/same-device\",\n            \"dpopKey\": \"-----BEGIN EC PRIVATE KEY-----\\ntest\\n-----END EC PRIVATE KEY-----\\n\"\n        }\"#;\n        let token = parse_cached_token(file_contents.as_bytes()).expect(\"success\");\n        assert_eq!(\"AKIAIOSFODNN7EXAMPLE\", token.access_token.access_key_id());\n        assert_eq!(\n            \"012345678901\",\n            token.access_token.account_id().unwrap().as_str()\n        );\n        assert_eq!(\n            std::time::SystemTime::UNIX_EPOCH + Duration::from_secs(1640467800),\n            token.access_token.expiry().unwrap()\n        );\n        assert_eq!(\"refresh-token-value\", token.refresh_token.as_str());\n        assert_eq!(\n            Some(\"identity-token-value\"),\n            token.identity_token.as_deref()\n        );\n\n        assert_eq!(\n            \"arn:aws:signin:::devtools/same-device\",\n            token.client_id.as_str()\n        );\n        assert_eq!(\n            \"-----BEGIN EC PRIVATE KEY-----\\ntest\\n-----END EC PRIVATE KEY-----\\n\",\n            token.dpop_key.as_str()\n        );\n    }\n\n    #[test]\n    fn parse_missing_fields() {\n        // Missing accessToken\n        let token = br#\"{\n            \"tokenType\": \"aws_sigv4\",\n            \"clientId\": \"client\",\n            \"dpopKey\": \"key\"\n        }\"#;\n        let err = parse_cached_token(token).expect_err(\"missing accessToken\");\n        assert!(\n            matches!(err, LoginTokenError::MissingField(\"accessKeyId\")),\n            \"incorrect error: {:?}\",\n            err\n        );\n\n        // Missing clientId\n        let token = br#\"{\n            \"accessToken\": {\n                \"accessKeyId\": \"AKID\",\n                \"secretAccessKey\": \"SECRET\",\n                \"sessionToken\": \"TOKEN\",\n                \"accountId\": \"123456789012\",\n                \"expiresAt\": \"2021-12-25T21:30:00Z\"\n            },\n            \"tokenType\": \"aws_sigv4\",\n            \"dpopKey\": \"key\"\n        }\"#;\n        let err = parse_cached_token(token).expect_err(\"missing clientId\");\n        assert!(\n            matches!(err, LoginTokenError::MissingField(\"clientId\")),\n            \"incorrect error: {:?}\",\n            err\n        );\n\n        // Missing dpopKey\n        let token = br#\"{\n            \"accessToken\": {\n                \"accessKeyId\": \"AKID\",\n                \"secretAccessKey\": \"SECRET\",\n                \"sessionToken\": \"TOKEN\",\n                \"accountId\": \"123456789012\",\n                \"expiresAt\": \"2021-12-25T21:30:00Z\"\n            },\n            \"tokenType\": \"aws_sigv4\",\n            \"clientId\": \"client\"\n        }\"#;\n        let err = parse_cached_token(token).expect_err(\"missing dpopKey\");\n        assert!(\n            matches!(err, LoginTokenError::MissingField(\"dpopKey\")),\n            \"incorrect error: {:?}\",\n            err\n        );\n    }\n\n    #[tokio::test]\n    async fn load_token_from_cache() {\n        use std::collections::HashMap;\n        let token_json = r#\"{\n            \"accessToken\": {\n                \"accessKeyId\": \"AKIAIOSFODNN7EXAMPLE\",\n                \"secretAccessKey\": \"wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY\",\n                \"sessionToken\": \"session-token\",\n                \"accountId\": \"012345678901\",\n                \"expiresAt\": \"2021-12-25T21:30:00Z\"\n            },\n            \"tokenType\": \"aws_sigv4\",\n            \"refreshToken\": \"refresh-token-value\",\n            \"idToken\": \"identity-token-value\",\n            \"clientId\": \"arn:aws:signin:::devtools/same-device\",\n            \"dpopKey\": \"-----BEGIN EC PRIVATE KEY-----\\ntest\\n-----END EC PRIVATE KEY-----\\n\"\n        }\"#;\n\n        let env = Env::from_slice(&[(\"HOME\", \"/home/user\")]);\n        let fs = Fs::from_map(HashMap::from([(\n            \"/home/user/.aws/login/cache/36db1d138ff460920374e4c3d8e01f53f9f73537e89c88d639f68393df0e2726.json\".to_string(),\n            token_json.as_bytes().to_vec(),\n        )]));\n\n        let token = load_cached_token(&env, &fs, \"arn:aws:iam::0123456789012:user/Admin\")\n            .await\n            .expect(\"success\");\n\n        assert_eq!(\"AKIAIOSFODNN7EXAMPLE\", token.access_token.access_key_id());\n        assert_eq!(\n            \"012345678901\",\n            token.access_token.account_id().unwrap().as_str()\n        );\n        assert_eq!(\n            \"arn:aws:signin:::devtools/same-device\",\n            token.client_id.as_str()\n        );\n    }\n\n    #[tokio::test]\n    async fn error_on_missing_file() {\n        let err = load_cached_token(\n            &Env::from_slice(&[(\"HOME\", \"/home\")]),\n            &Fs::from_slice(&[]),\n            \"arn:aws:iam::123456789012:user/test\",\n        )\n        .await\n        .expect_err(\"should fail, file is missing\");\n        assert!(\n            matches!(err, LoginTokenError::IoError { .. }),\n            \"should be io error, got {:?}\",\n            err\n        );\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/src/login/dpop.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nuse crate::login::token::LoginTokenError;\nuse aws_sdk_signin::config::auth::Params;\nuse aws_smithy_json::serialize::JsonObjectWriter;\nuse aws_smithy_runtime_api::box_error::BoxError;\nuse aws_smithy_runtime_api::client::auth::{\n    AuthScheme, AuthSchemeEndpointConfig, AuthSchemeId, AuthSchemeOption, AuthSchemeOptionsFuture,\n    Sign,\n};\nuse aws_smithy_runtime_api::client::identity::{\n    Identity, IdentityCacheLocation, IdentityCachePartition, IdentityFuture, ResolveIdentity,\n    SharedIdentityResolver,\n};\nuse aws_smithy_runtime_api::client::orchestrator::HttpRequest;\nuse aws_smithy_runtime_api::client::runtime_components::{GetIdentityResolver, RuntimeComponents};\nuse aws_smithy_types::config_bag::ConfigBag;\nuse aws_smithy_types::Number;\nuse p256::ecdsa::signature::RandomizedSigner;\nuse p256::ecdsa::{Signature, SigningKey};\nuse p256::elliptic_curve::sec1::ToEncodedPoint;\nuse p256::SecretKey;\nuse rand::SeedableRng;\nuse std::sync::{Arc, LazyLock};\nuse std::time::SystemTime;\n\npub(super) struct Header {\n    pub x_b64: String,\n    pub y_b64: String,\n}\n\nimpl Header {\n    fn to_json(&self) -> String {\n        let mut header = String::new();\n        let mut writer = JsonObjectWriter::new(&mut header);\n        writer.key(\"typ\").string(\"dpop+jwt\");\n        writer.key(\"alg\").string(\"ES256\");\n        let mut jwk = writer.key(\"jwk\").start_object();\n        jwk.key(\"kty\").string(\"EC\");\n        jwk.key(\"x\").string(&self.x_b64);\n        jwk.key(\"y\").string(&self.y_b64);\n        jwk.key(\"crv\").string(\"P-256\");\n        jwk.finish();\n        writer.finish();\n        header\n    }\n}\n\npub(super) struct Payload {\n    pub jti: String,\n    pub iat: u64,\n    pub htu: String,\n}\n\nimpl Payload {\n    fn to_json(&self) -> String {\n        let mut payload = String::new();\n        let mut writer = JsonObjectWriter::new(&mut payload);\n        writer.key(\"jti\").string(&self.jti);\n        writer.key(\"htm\").string(\"POST\");\n        writer.key(\"htu\").string(&self.htu);\n        writer.key(\"iat\").number(Number::PosInt(self.iat));\n        writer.finish();\n        payload\n    }\n}\n\nfn header(private_key: &SecretKey) -> Result<Header, LoginTokenError> {\n    let public_key = private_key.public_key();\n    let point = public_key.to_encoded_point(false);\n\n    let x_bytes = point\n        .x()\n        .ok_or_else(|| LoginTokenError::other(\"invalid private key: x coordinate\", None))?;\n    let y_bytes = point\n        .y()\n        .ok_or_else(|| LoginTokenError::other(\"invalid private key: y coordinate\", None))?;\n\n    Ok(Header {\n        x_b64: base64_simd::URL_SAFE_NO_PAD.encode_to_string(x_bytes),\n        y_b64: base64_simd::URL_SAFE_NO_PAD.encode_to_string(y_bytes),\n    })\n}\n\npub(super) fn payload(jti: String, iat: u64, htu: &str) -> Payload {\n    Payload {\n        jti,\n        iat,\n        htu: htu.to_string(),\n    }\n}\n\nfn build_message(header: &Header, payload: &Payload) -> String {\n    let header_json = header.to_json();\n    let payload_json = payload.to_json();\n\n    let header_b64 = base64_simd::URL_SAFE_NO_PAD.encode_to_string(header_json.as_bytes());\n    let payload_b64 = base64_simd::URL_SAFE_NO_PAD.encode_to_string(payload_json.as_bytes());\n    format!(\"{header_b64}.{payload_b64}\")\n}\n\nfn sign(message: &str, private_key: &SecretKey) -> Result<String, LoginTokenError> {\n    let signing_key = SigningKey::from(private_key);\n    let mut rng = rand::rngs::StdRng::from_entropy();\n    let signature: Signature = signing_key.sign_with_rng(&mut rng, message.as_bytes());\n    let signature_b64 = base64_simd::URL_SAFE_NO_PAD.encode_to_string(signature.to_bytes());\n    Ok(format!(\"{message}.{signature_b64}\"))\n}\n\n/// Calculate DPoP HTTP header using the private key.\n///\n/// See [RFC 9449: OAuth 2.0 Demonstrating Proof of Possession (DPoP)](https://datatracker.ietf.org/doc/html/rfc9449)\npub(super) fn calculate(\n    private_key: &SecretKey,\n    endpoint: &str,\n    now: SystemTime,\n) -> Result<String, LoginTokenError> {\n    let header = header(private_key)?;\n    let jti = uuid::Uuid::new_v4().to_string();\n    let iat = now\n        .duration_since(SystemTime::UNIX_EPOCH)\n        .map_err(|e| LoginTokenError::other(\"system time before UNIX epoch\", Some(e.into())))?\n        .as_secs();\n    let payload = payload(jti, iat, endpoint);\n    let message = build_message(&header, &payload);\n    sign(&message, private_key)\n}\n\n/// Auth scheme ID for DPoP\nconst SCHEME_ID: AuthSchemeId = AuthSchemeId::new(\"dpop\");\n\n#[derive(Debug, Default)]\npub(super) struct DPoPAuthSchemeOptionResolver;\n\nimpl aws_sdk_signin::config::auth::ResolveAuthScheme for DPoPAuthSchemeOptionResolver {\n    fn resolve_auth_scheme<'a>(\n        &'a self,\n        _params: &'a Params,\n        _cfg: &'a ConfigBag,\n        _runtime_components: &'a RuntimeComponents,\n    ) -> AuthSchemeOptionsFuture<'a> {\n        let options = vec![AuthSchemeOption::builder()\n            .scheme_id(SCHEME_ID)\n            .build()\n            .expect(\"valid dpop auth option\")];\n        AuthSchemeOptionsFuture::ready(Ok(options))\n    }\n}\n\n/// DPoP auth scheme.\n#[derive(Debug)]\npub(super) struct DPoPAuthScheme {\n    signer: DPoPSigner,\n    private_key: Arc<SecretKey>,\n}\n\nimpl DPoPAuthScheme {\n    /// Creates a new `DPoPAuthScheme` that uses the given private key as the identity.\n    pub(super) fn new(private_key_pem: &str) -> Result<Self, LoginTokenError> {\n        let private_key = SecretKey::from_sec1_pem(private_key_pem)\n            .map(Arc::new)\n            .map_err(|e| LoginTokenError::other(\"invalid secret key\", Some(e.into())))?;\n        let signer = DPoPSigner;\n        Ok(Self {\n            signer,\n            private_key,\n        })\n    }\n}\n\nimpl AuthScheme for DPoPAuthScheme {\n    fn scheme_id(&self) -> AuthSchemeId {\n        SCHEME_ID\n    }\n\n    fn identity_resolver(\n        &self,\n        _identity_resolvers: &dyn GetIdentityResolver,\n    ) -> Option<SharedIdentityResolver> {\n        Some(SharedIdentityResolver::new(DPoPIdentityResolver(\n            self.private_key.clone(),\n        )))\n    }\n\n    fn signer(&self) -> &dyn Sign {\n        &self.signer\n    }\n}\n\n/// DPoP Signer calculates the DPoP header and \"signs\" the request with it\n#[derive(Debug, Default)]\nstruct DPoPSigner;\n\n/// DPoP identity resolver which yields the secret key to sign with\n///\n/// NOTE: We store the secret key on creation which avoids parsing the token file multiple times.\n#[derive(Debug)]\nstruct DPoPIdentityResolver(Arc<SecretKey>);\n\n// We override the cache partition because by default SharedIdentityResolver will claim a new\n// partition everytime it's created. We aren't caching this identity anyway so avoid claiming cache\n// partitions unnecessarily\nstatic DPOP_PCACHE_PARTITION: LazyLock<IdentityCachePartition> =\n    LazyLock::new(IdentityCachePartition::new);\n\nimpl ResolveIdentity for DPoPIdentityResolver {\n    fn resolve_identity<'a>(\n        &'a self,\n        _runtime_components: &'a RuntimeComponents,\n        _config_bag: &'a ConfigBag,\n    ) -> IdentityFuture<'a> {\n        let identity = Identity::new(DPoPPrivateKey(self.0.clone()), None);\n        IdentityFuture::ready(Ok(identity))\n    }\n\n    fn cache_location(&self) -> IdentityCacheLocation {\n        IdentityCacheLocation::IdentityResolver\n    }\n\n    fn cache_partition(&self) -> Option<IdentityCachePartition> {\n        Some(*DPOP_PCACHE_PARTITION)\n    }\n}\n\nimpl Sign for DPoPSigner {\n    fn sign_http_request(\n        &self,\n        request: &mut HttpRequest,\n        identity: &Identity,\n        _auth_scheme_endpoint_config: AuthSchemeEndpointConfig<'_>,\n        runtime_components: &RuntimeComponents,\n        _config_bag: &ConfigBag,\n    ) -> Result<(), BoxError> {\n        let private_key = identity\n            .data::<DPoPPrivateKey>()\n            .ok_or_else(|| LoginTokenError::WrongIdentityType(identity.clone()))?;\n\n        let endpoint = request.uri().to_string();\n        let now = runtime_components\n            .time_source()\n            .ok_or(\"A timesource must be provided\")?\n            .now();\n        let dpop_header = calculate(&private_key.0, &endpoint, now)?;\n        request.headers_mut().insert(\"dpop\", dpop_header);\n        Ok(())\n    }\n}\n\n#[derive(Debug)]\nstruct DPoPPrivateKey(Arc<SecretKey>);\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use std::time::Duration;\n\n    const TEST_KEY: &str = \"-----BEGIN EC PRIVATE KEY-----\\nMHcCAQEEIBMB/RwQERsVoqWRQG4zK8CnaAa5dfrpbm+9tFdBh3z4oAoGCCqGSM49\\nAwEHoUQDQgAEWb1VLi1EA2hJaTz4yYuxSELvY+1GAfL+8rUTCAdiFid87Bf6GY+s\\n2+1RpqDv0RpZiDIMCrZrsAh+RK9S3QCaGA==\\n-----END EC PRIVATE KEY-----\\n\";\n\n    #[test]\n    fn test_header_extracts_public_coordinates() {\n        let private_key = SecretKey::from_sec1_pem(TEST_KEY).unwrap();\n        let h = header(&private_key).unwrap();\n        assert_eq!(h.x_b64, \"Wb1VLi1EA2hJaTz4yYuxSELvY-1GAfL-8rUTCAdiFic\");\n        assert_eq!(h.y_b64, \"fOwX-hmPrNvtUaag79EaWYgyDAq2a7AIfkSvUt0Amhg\");\n    }\n\n    #[test]\n    fn test_build_message() {\n        let h = Header {\n            x_b64: \"test_x\".to_string(),\n            y_b64: \"test_y\".to_string(),\n        };\n        let p = payload(\n            \"test-jti\".to_string(),\n            1651516560,\n            \"https://example.com/token\",\n        );\n        let message = build_message(&h, &p);\n        let parts: Vec<&str> = message.split('.').collect();\n        assert_eq!(parts.len(), 2);\n\n        let header_json = String::from_utf8(\n            base64_simd::URL_SAFE_NO_PAD\n                .decode_to_vec(parts[0])\n                .unwrap(),\n        )\n        .unwrap();\n        assert!(header_json.contains(\"dpop+jwt\"));\n        assert!(header_json.contains(\"test_x\"));\n\n        let payload_json = String::from_utf8(\n            base64_simd::URL_SAFE_NO_PAD\n                .decode_to_vec(parts[1])\n                .unwrap(),\n        )\n        .unwrap();\n        assert!(payload_json.contains(\"test-jti\"));\n        assert!(payload_json.contains(\"https://example.com/token\"));\n    }\n\n    #[test]\n    fn test_calculate_valid_key() {\n        let endpoint = \"https://signin.aws.amazon.com/v1/token\";\n        let now = SystemTime::UNIX_EPOCH + Duration::from_secs(1651516560);\n\n        let private_key = SecretKey::from_sec1_pem(TEST_KEY).unwrap();\n        let result = calculate(&private_key, endpoint, now);\n        assert!(result.is_ok());\n\n        let dpop = result.unwrap();\n        let parts: Vec<&str> = dpop.split('.').collect();\n        assert_eq!(parts.len(), 3);\n    }\n\n    #[test]\n    fn test_calculate_invalid_key() {\n        let result = DPoPAuthScheme::new(\"invalid_key\");\n        assert!(result.is_err());\n        assert!(result\n            .unwrap_err()\n            .to_string()\n            .contains(\"invalid secret key\"));\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/src/login/token.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::login::PROVIDER_NAME;\nuse aws_credential_types::provider::error::CredentialsError;\nuse aws_credential_types::Credentials;\nuse aws_sdk_signin::types::CreateOAuth2TokenResponseBody;\nuse aws_smithy_json::deserialize::EscapeError;\nuse aws_smithy_runtime_api::client::identity::Identity;\nuse std::error::Error as StdError;\nuse std::fmt;\nuse std::path::PathBuf;\nuse std::time::{Duration, SystemTime};\nuse zeroize::Zeroizing;\n\n/// A login session token created by CLI and loaded from cache\n#[derive(Clone)]\npub(super) struct LoginToken {\n    pub(super) access_token: Credentials,\n    pub(super) token_type: Option<String>,\n    pub(super) identity_token: Option<String>,\n    pub(super) refresh_token: Zeroizing<String>,\n    pub(super) client_id: String,\n    pub(super) dpop_key: Zeroizing<String>,\n}\n\nimpl LoginToken {\n    pub(super) fn expires_at(&self) -> SystemTime {\n        self.access_token\n            .expiry()\n            .expect(\"sign-in token access token expected expiry\")\n    }\n\n    pub(super) fn from_refresh(\n        old_token: &LoginToken,\n        resp: CreateOAuth2TokenResponseBody,\n        now: SystemTime,\n    ) -> Self {\n        let access_token_output = resp.access_token().expect(\"accessToken in response\");\n        let expires_in = resp.expires_in();\n        let expiry = now + Duration::from_secs(expires_in as u64);\n\n        let mut credentials = Credentials::builder()\n            .access_key_id(access_token_output.access_key_id())\n            .secret_access_key(access_token_output.secret_access_key())\n            .session_token(access_token_output.session_token())\n            .provider_name(PROVIDER_NAME)\n            .expiry(expiry);\n        credentials.set_account_id(old_token.access_token.account_id().cloned());\n        let credentials = credentials.build();\n\n        Self {\n            access_token: credentials,\n            token_type: old_token.token_type.clone(),\n            identity_token: old_token.identity_token.clone(),\n            refresh_token: Zeroizing::new(resp.refresh_token().to_string()),\n            client_id: old_token.client_id.clone(),\n            dpop_key: old_token.dpop_key.clone(),\n        }\n    }\n}\n\nimpl fmt::Debug for LoginToken {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        f.debug_struct(\"CachedSsoToken\")\n            .field(\"access_token\", &self.access_token)\n            .field(\"token_type\", &self.token_type)\n            .field(\"identity_token\", &self.identity_token)\n            .field(\"refresh_token\", &self.refresh_token)\n            .field(\"client_id\", &self.client_id)\n            .field(\"dpop_key\", &\"** redacted **\")\n            .finish()\n    }\n}\n\n#[derive(Debug)]\npub(super) enum LoginTokenError {\n    FailedToFormatDateTime {\n        source: Box<dyn StdError + Send + Sync>,\n    },\n    IoError {\n        what: &'static str,\n        path: PathBuf,\n        source: std::io::Error,\n    },\n    JsonError(Box<dyn StdError + Send + Sync>),\n    MissingField(&'static str),\n    NoHomeDirectory,\n    ExpiredToken,\n    WrongIdentityType(Identity),\n    RefreshFailed {\n        message: Option<String>,\n        source: Box<dyn StdError + Send + Sync>,\n    },\n    Other {\n        message: String,\n        source: Option<Box<dyn StdError + Send + Sync>>,\n    },\n}\n\nimpl LoginTokenError {\n    pub(super) fn other(\n        message: impl Into<String>,\n        source: Option<Box<dyn StdError + Send + Sync>>,\n    ) -> Self {\n        Self::Other {\n            message: message.into(),\n            source,\n        }\n    }\n}\n\nimpl fmt::Display for LoginTokenError {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        match self {\n            Self::FailedToFormatDateTime { .. } => write!(f, \"failed to format date time\"),\n            Self::IoError { what, path, .. } => write!(f, \"failed to {what} `{}`\", path.display()),\n            Self::JsonError(_) => write!(f, \"invalid JSON in cached Login token file\"),\n            Self::MissingField(field) => {\n                write!(f, \"missing field `{field}` in cached Login token file\")\n            }\n            Self::NoHomeDirectory => write!(f, \"couldn't resolve a home directory\"),\n            Self::ExpiredToken => write!(f, \"cached Login token is expired\"),\n            Self::WrongIdentityType(identity) => {\n                write!(f, \"wrong identity type for Login. Expected DPoP private key but got `{identity:?}`\")\n            }\n            Self::RefreshFailed { message, .. } => {\n                if let Some(msg) = message {\n                    write!(f, \"failed to refresh cached Login token: {msg}\")\n                } else {\n                    write!(f, \"failed to refresh cached Login token\")\n                }\n            }\n            Self::Other { message, .. } => {\n                write!(f, \"failed to load cached Login token: {message}\")\n            }\n        }\n    }\n}\n\nimpl StdError for LoginTokenError {\n    fn source(&self) -> Option<&(dyn StdError + 'static)> {\n        match self {\n            LoginTokenError::FailedToFormatDateTime { source } => Some(source.as_ref()),\n            LoginTokenError::IoError { source, .. } => Some(source),\n            LoginTokenError::JsonError(source) => Some(source.as_ref()),\n            LoginTokenError::MissingField(_) => None,\n            LoginTokenError::NoHomeDirectory => None,\n            LoginTokenError::ExpiredToken => None,\n            LoginTokenError::WrongIdentityType(_) => None,\n            LoginTokenError::RefreshFailed { source, .. } => Some(source.as_ref()),\n            LoginTokenError::Other { source, .. } => match source {\n                Some(err) => Some(err.as_ref()),\n                None => None,\n            },\n        }\n    }\n}\n\nimpl From<EscapeError> for LoginTokenError {\n    fn from(err: EscapeError) -> Self {\n        Self::JsonError(err.into())\n    }\n}\n\nimpl From<aws_smithy_json::deserialize::error::DeserializeError> for LoginTokenError {\n    fn from(err: aws_smithy_json::deserialize::error::DeserializeError) -> Self {\n        Self::JsonError(err.into())\n    }\n}\n\nimpl From<LoginTokenError> for CredentialsError {\n    fn from(val: LoginTokenError) -> CredentialsError {\n        match val {\n            LoginTokenError::FailedToFormatDateTime { .. } => {\n                CredentialsError::invalid_configuration(val)\n            }\n            LoginTokenError::IoError { .. } => CredentialsError::unhandled(val),\n            LoginTokenError::JsonError(_) => CredentialsError::unhandled(val),\n            LoginTokenError::MissingField(_) => CredentialsError::invalid_configuration(val),\n            LoginTokenError::NoHomeDirectory => CredentialsError::unhandled(val),\n            LoginTokenError::ExpiredToken => CredentialsError::unhandled(val),\n            LoginTokenError::RefreshFailed { .. } => CredentialsError::provider_error(val),\n            LoginTokenError::WrongIdentityType(_) => CredentialsError::invalid_configuration(val),\n            LoginTokenError::Other { .. } => CredentialsError::unhandled(val),\n        }\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/src/login.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Credentials from an AWS Console session vended by AWS Sign-In.\n\nmod cache;\n/// Utils related to [RFC 9449: OAuth 2.0 Demonstrating Proof of Possession (DPoP)](https://datatracker.ietf.org/doc/html/rfc9449)\nmod dpop;\nmod token;\n\nuse crate::login::cache::{load_cached_token, save_cached_token};\nuse crate::login::token::{LoginToken, LoginTokenError};\nuse crate::provider_config::ProviderConfig;\nuse aws_credential_types::credential_feature::AwsCredentialFeature;\nuse aws_credential_types::provider;\nuse aws_credential_types::provider::future;\nuse aws_credential_types::provider::ProvideCredentials;\nuse aws_sdk_signin::config::Builder as SignInClientConfigBuilder;\nuse aws_sdk_signin::operation::create_o_auth2_token::CreateOAuth2TokenError;\nuse aws_sdk_signin::types::{CreateOAuth2TokenRequestBody, OAuth2ErrorCode};\nuse aws_sdk_signin::Client as SignInClient;\nuse aws_smithy_async::time::SharedTimeSource;\nuse aws_smithy_runtime::expiring_cache::ExpiringCache;\nuse aws_types::os_shim_internal::{Env, Fs};\nuse aws_types::SdkConfig;\nuse std::sync::Arc;\nuse std::sync::Mutex;\nuse std::time::Duration;\nuse std::time::SystemTime;\n\nconst REFRESH_BUFFER_TIME: Duration = Duration::from_secs(5 * 60 /* 5 minutes */);\nconst MIN_TIME_BETWEEN_REFRESH: Duration = Duration::from_secs(30);\npub(super) const PROVIDER_NAME: &str = \"Login\";\n\n/// AWS credentials provider vended by AWS Sign-In. This provider allows users to acquire and refresh\n/// AWS credentials that correspond to an AWS Console session.\n///\n/// See the [SDK developer guide](https://docs.aws.amazon.com/sdkref/latest/guide/access-login.html)\n/// for more information on getting started with console sessions and the AWS CLI.\n#[derive(Debug)]\npub struct LoginCredentialsProvider {\n    inner: Arc<Inner>,\n    token_cache: ExpiringCache<LoginToken, LoginTokenError>,\n}\n\n#[derive(Debug)]\nstruct Inner {\n    fs: Fs,\n    env: Env,\n    session_arn: String,\n    enabled_from_profile: bool,\n    sdk_config: SdkConfig,\n    time_source: SharedTimeSource,\n    last_refresh_attempt: Mutex<Option<SystemTime>>,\n}\n\nimpl LoginCredentialsProvider {\n    /// Create a new [`Builder`] for the given login session ARN.\n    ///\n    /// The `session_arn` argument should take the form an Amazon Resource Name (ARN) like\n    ///\n    /// ```text\n    /// arn:aws:iam::0123456789012:user/Admin\n    /// ```\n    pub fn builder(session_arn: impl Into<String>) -> Builder {\n        Builder {\n            session_arn: session_arn.into(),\n            provider_config: None,\n            enabled_from_profile: false,\n        }\n    }\n\n    async fn resolve_token(&self) -> Result<LoginToken, LoginTokenError> {\n        let token_cache = self.token_cache.clone();\n        if let Some(token) = token_cache\n            .yield_or_clear_if_expired(self.inner.time_source.now())\n            .await\n        {\n            tracing::debug!(\"using cached Login token\");\n            return Ok(token);\n        }\n\n        let inner = self.inner.clone();\n        let token = token_cache\n            .get_or_load(|| async move {\n                tracing::debug!(\"expiring cache asked for an updated Login token\");\n                let mut token =\n                    load_cached_token(&inner.env, &inner.fs, &inner.session_arn).await?;\n\n                tracing::debug!(\"loaded cached Login token\");\n\n                let now = inner.time_source.now();\n                let expired = token.expires_at() <= now;\n                let expires_soon = token.expires_at() - REFRESH_BUFFER_TIME <= now;\n                let last_refresh = *inner.last_refresh_attempt.lock().unwrap();\n                let min_time_passed = last_refresh\n                    .map(|lr| {\n                        now.duration_since(lr).expect(\"last_refresh is in the past\")\n                            >= MIN_TIME_BETWEEN_REFRESH\n                    })\n                    .unwrap_or(true);\n\n                let refreshable = min_time_passed;\n\n                tracing::debug!(\n                    expired = ?expired,\n                    expires_soon = ?expires_soon,\n                    min_time_passed = ?min_time_passed,\n                    refreshable = ?refreshable,\n                    will_refresh = ?(expires_soon && refreshable),\n                    \"cached Login token refresh decision\"\n                );\n\n                // Fail fast if the token has expired and we can't refresh it\n                if expired && !refreshable {\n                    tracing::debug!(\"cached Login token is expired and cannot be refreshed\");\n                    return Err(LoginTokenError::ExpiredToken);\n                }\n\n                // Refresh the token if it is going to expire soon\n                if expires_soon && refreshable {\n                    tracing::debug!(\"attempting to refresh Login token\");\n                    let refreshed_token = Self::refresh_cached_token(&inner, &token, now).await?;\n                    token = refreshed_token;\n                    *inner.last_refresh_attempt.lock().unwrap() = Some(now);\n                }\n\n                let expires_at = token.expires_at();\n                Ok((token, expires_at))\n            })\n            .await?;\n\n        Ok(token)\n    }\n\n    async fn refresh_cached_token(\n        inner: &Inner,\n        cached_token: &LoginToken,\n        now: SystemTime,\n    ) -> Result<LoginToken, LoginTokenError> {\n        let dpop_auth_scheme = dpop::DPoPAuthScheme::new(&cached_token.dpop_key)?;\n        let client_config = SignInClientConfigBuilder::from(&inner.sdk_config)\n            .auth_scheme_resolver(dpop::DPoPAuthSchemeOptionResolver)\n            .push_auth_scheme(dpop_auth_scheme)\n            .build();\n\n        let client = SignInClient::from_conf(client_config);\n\n        let resp = client\n            .create_o_auth2_token()\n            .token_input(\n                CreateOAuth2TokenRequestBody::builder()\n                    .client_id(&cached_token.client_id)\n                    .grant_type(\"refresh_token\")\n                    .refresh_token(cached_token.refresh_token.as_str())\n                    .build()\n                    .expect(\"valid CreateOAuth2TokenRequestBody\"),\n            )\n            .send()\n            .await\n            .map_err(|err| {\n                let service_err = err.into_service_error();\n                let message = match &service_err {\n                    CreateOAuth2TokenError::AccessDeniedException(e) => match e.error {\n                        OAuth2ErrorCode::InsufficientPermissions => Some(\"Unable to refresh credentials due to insufficient permissions. You may be missing permission for the 'CreateOAuth2Token' action.\".to_string()),\n                        OAuth2ErrorCode::TokenExpired => Some(\"Your session has expired. Please reauthenticate.\".to_string()),\n                        OAuth2ErrorCode::UserCredentialsChanged => Some(\"Unable to refresh credentials because of a change in your password. Please reauthenticate with your new password.\".to_string()),\n                        _ => None,\n                    }\n                    _ => None,\n                };\n\n                LoginTokenError::RefreshFailed {\n                    message,\n                    source: service_err.into(),\n                }\n            })?;\n\n        let token_output = resp.token_output.expect(\"valid token response\");\n        let new_token = LoginToken::from_refresh(cached_token, token_output, now);\n\n        match save_cached_token(&inner.env, &inner.fs, &inner.session_arn, &new_token).await {\n            Ok(_) => {}\n            Err(e) => tracing::warn!(\"failed to save refreshed Login token: {e}\"),\n        }\n        Ok(new_token)\n    }\n\n    async fn credentials(&self) -> provider::Result {\n        let token = self.resolve_token().await?;\n\n        let feat = match self.inner.enabled_from_profile {\n            true => AwsCredentialFeature::CredentialsProfileLogin,\n            false => AwsCredentialFeature::CredentialsProfile,\n        };\n\n        let mut creds = token.access_token;\n        creds\n            .get_property_mut_or_default::<Vec<AwsCredentialFeature>>()\n            .push(feat);\n        Ok(creds)\n    }\n}\n\nimpl ProvideCredentials for LoginCredentialsProvider {\n    fn provide_credentials<'a>(&'a self) -> future::ProvideCredentials<'a>\n    where\n        Self: 'a,\n    {\n        future::ProvideCredentials::new(self.credentials())\n    }\n}\n\n/// Builder for [`LoginCredentialsProvider`]\n#[derive(Debug)]\npub struct Builder {\n    session_arn: String,\n    provider_config: Option<ProviderConfig>,\n    enabled_from_profile: bool,\n}\n\nimpl Builder {\n    /// Override the configuration used for this provider\n    pub fn configure(mut self, provider_config: &ProviderConfig) -> Self {\n        self.provider_config = Some(provider_config.clone());\n        self\n    }\n\n    /// Set whether this provider was enabled via a profile.\n    /// Defaults to `false` (configured explicitly in user code).\n    pub(crate) fn enabled_from_profile(mut self, enabled: bool) -> Self {\n        self.enabled_from_profile = enabled;\n        self\n    }\n\n    /// Construct a [`LoginCredentialsProvider`] from the builder\n    pub fn build(self) -> LoginCredentialsProvider {\n        let provider_config = self.provider_config.unwrap_or_default();\n        let fs = provider_config.fs();\n        let env = provider_config.env();\n        let inner = Arc::new(Inner {\n            fs,\n            env,\n            session_arn: self.session_arn,\n            enabled_from_profile: self.enabled_from_profile,\n            sdk_config: provider_config.client_config(),\n            time_source: provider_config.time_source(),\n            last_refresh_attempt: Mutex::new(None),\n        });\n\n        LoginCredentialsProvider {\n            inner,\n            token_cache: ExpiringCache::new(REFRESH_BUFFER_TIME),\n        }\n    }\n}\n\n#[cfg(test)]\nmod test {\n    //! Test suite for LoginCredentialsProvider\n    //!\n    //! This test module reads test cases from `test-data/login-provider-test-cases.json`\n    //! and validates the behavior of the LoginCredentialsProvider against various scenarios\n    //! from the SEP.\n    use super::*;\n    use crate::provider_config::ProviderConfig;\n    use aws_credential_types::provider::ProvideCredentials;\n    use aws_sdk_signin::config::RuntimeComponents;\n    use aws_smithy_async::rt::sleep::TokioSleep;\n    use aws_smithy_async::time::{SharedTimeSource, StaticTimeSource};\n    use aws_smithy_runtime_api::client::{\n        http::{\n            HttpClient, HttpConnector, HttpConnectorFuture, HttpConnectorSettings,\n            SharedHttpConnector,\n        },\n        orchestrator::{HttpRequest, HttpResponse},\n    };\n    use aws_smithy_types::body::SdkBody;\n    use aws_types::os_shim_internal::{Env, Fs};\n    use aws_types::region::Region;\n    use serde::Deserialize;\n    use std::collections::HashMap;\n    use std::error::Error;\n    use std::time::{Duration, UNIX_EPOCH};\n\n    #[derive(Deserialize, Debug)]\n    #[serde(rename_all = \"camelCase\")]\n    struct LoginTestCase {\n        documentation: String,\n        config_contents: String,\n        cache_contents: HashMap<String, serde_json::Value>,\n        #[serde(default)]\n        mock_api_calls: Vec<MockApiCall>,\n        outcomes: Vec<Outcome>,\n    }\n\n    #[derive(Deserialize, Debug, Clone)]\n    #[serde(rename_all = \"camelCase\")]\n    struct MockApiCall {\n        #[serde(default)]\n        response: Option<MockResponse>,\n        #[serde(default)]\n        response_code: Option<u16>,\n    }\n\n    #[derive(Deserialize, Debug, Clone)]\n    #[serde(rename_all = \"camelCase\")]\n    struct MockResponse {\n        token_output: TokenOutput,\n    }\n\n    #[derive(Deserialize, Debug, Clone)]\n    #[serde(rename_all = \"camelCase\")]\n    struct TokenOutput {\n        access_token: AccessToken,\n        refresh_token: String,\n        expires_in: u64,\n    }\n\n    #[derive(Deserialize, Debug, Clone)]\n    #[serde(rename_all = \"camelCase\")]\n    struct AccessToken {\n        access_key_id: String,\n        secret_access_key: String,\n        session_token: String,\n    }\n\n    #[derive(Deserialize, Debug)]\n    #[serde(tag = \"result\")]\n    enum Outcome {\n        #[serde(rename = \"credentials\")]\n        Credentials {\n            #[serde(rename = \"accessKeyId\")]\n            access_key_id: String,\n            #[serde(rename = \"secretAccessKey\")]\n            secret_access_key: String,\n            #[serde(rename = \"sessionToken\")]\n            session_token: String,\n            #[serde(rename = \"accountId\")]\n            account_id: String,\n            #[serde(default, rename = \"expiresAt\")]\n            #[allow(dead_code)]\n            expires_at: Option<String>,\n        },\n        #[serde(rename = \"error\")]\n        Error,\n        #[serde(rename = \"cacheContents\")]\n        CacheContents(HashMap<String, serde_json::Value>),\n    }\n\n    impl LoginTestCase {\n        async fn check(&self) {\n            let session_arn = \"arn:aws:sts::012345678910:assumed-role/Admin/admin\";\n\n            // Fixed time for testing: 2025-11-19T00:00:00Z\n            let now = UNIX_EPOCH + Duration::from_secs(1763510400);\n            let time_source = SharedTimeSource::new(StaticTimeSource::new(now));\n\n            // Setup filesystem with cache and config contents\n            let mut fs_map = HashMap::new();\n            fs_map.insert(\n                \"/home/user/.aws/config\".to_string(),\n                self.config_contents.as_bytes().to_vec(),\n            );\n            for (filename, contents) in &self.cache_contents {\n                let path = format!(\"/home/user/.aws/login/cache/{}\", filename);\n                // Add tokenType if missing (required by cache parser)\n                let mut contents = contents.clone();\n                if !contents.as_object().unwrap().contains_key(\"tokenType\") {\n                    contents.as_object_mut().unwrap().insert(\n                        \"tokenType\".to_string(),\n                        serde_json::Value::String(\"aws_sigv4\".to_string()),\n                    );\n                }\n                let json = serde_json::to_string(&contents).expect(\"valid json\");\n                fs_map.insert(path, json.into_bytes());\n            }\n            let fs = Fs::from_map(fs_map);\n\n            let env = Env::from_slice(&[(\"HOME\", \"/home/user\")]);\n\n            // Setup mock HTTP client\n            let http_client = if self.mock_api_calls.is_empty() {\n                crate::test_case::no_traffic_client()\n            } else {\n                aws_smithy_runtime_api::client::http::SharedHttpClient::new(TestHttpClient::new(\n                    &self.mock_api_calls,\n                ))\n            };\n\n            let provider_config = ProviderConfig::empty()\n                .with_env(env.clone())\n                .with_fs(fs.clone())\n                .with_http_client(http_client)\n                .with_region(Some(Region::from_static(\"us-east-2\")))\n                .with_sleep_impl(TokioSleep::new())\n                .with_time_source(time_source);\n\n            let provider = LoginCredentialsProvider::builder(session_arn)\n                .configure(&provider_config)\n                .build();\n\n            // Call provider once and validate result against all outcomes\n            let result = dbg!(provider.provide_credentials().await);\n\n            for outcome in &self.outcomes {\n                match outcome {\n                    Outcome::Credentials {\n                        access_key_id,\n                        secret_access_key,\n                        session_token,\n                        account_id,\n                        expires_at: _,\n                    } => {\n                        let creds = result.as_ref().expect(\"credentials should succeed\");\n                        assert_eq!(access_key_id, creds.access_key_id());\n                        assert_eq!(secret_access_key, creds.secret_access_key());\n                        assert_eq!(session_token, creds.session_token().unwrap());\n                        assert_eq!(account_id, creds.account_id().unwrap().as_str());\n                    }\n                    Outcome::Error => {\n                        result.as_ref().expect_err(\"should fail\");\n                    }\n                    Outcome::CacheContents(expected_cache) => {\n                        // Verify cache was updated after provider call\n                        for (filename, expected) in expected_cache {\n                            let path = format!(\"/home/user/.aws/login/cache/{}\", filename);\n                            let actual = fs.read_to_end(&path).await.expect(\"cache file exists\");\n                            let actual: serde_json::Value =\n                                serde_json::from_slice(&actual).expect(\"valid json\");\n                            // Compare only the fields that matter (ignore formatting differences)\n                            assert_eq!(\n                                expected.get(\"accessToken\"),\n                                actual.get(\"accessToken\"),\n                                \"accessToken mismatch for {}\",\n                                filename\n                            );\n                            assert_eq!(\n                                expected.get(\"refreshToken\"),\n                                actual.get(\"refreshToken\"),\n                                \"refreshToken mismatch for {}\",\n                                filename\n                            );\n                        }\n                    }\n                }\n            }\n        }\n    }\n\n    #[derive(Debug, Clone)]\n    struct TestHttpClient {\n        inner: SharedHttpConnector,\n    }\n\n    impl TestHttpClient {\n        fn new(mock_calls: &[MockApiCall]) -> Self {\n            Self {\n                inner: SharedHttpConnector::new(TestHttpConnector {\n                    mock_calls: mock_calls.to_vec(),\n                }),\n            }\n        }\n    }\n\n    impl HttpClient for TestHttpClient {\n        fn http_connector(\n            &self,\n            _settings: &HttpConnectorSettings,\n            _components: &RuntimeComponents,\n        ) -> SharedHttpConnector {\n            self.inner.clone()\n        }\n    }\n\n    #[derive(Debug, Clone)]\n    struct TestHttpConnector {\n        mock_calls: Vec<MockApiCall>,\n    }\n\n    impl HttpConnector for TestHttpConnector {\n        fn call(&self, _request: HttpRequest) -> HttpConnectorFuture {\n            if let Some(mock) = self.mock_calls.first() {\n                if let Some(code) = mock.response_code {\n                    return HttpConnectorFuture::ready(Ok(HttpResponse::new(\n                        code.try_into().unwrap(),\n                        SdkBody::from(\"{\\\"error\\\":\\\"refresh_failed\\\"}\"),\n                    )));\n                }\n                if let Some(resp) = &mock.response {\n                    let body = format!(\n                        r#\"{{\n                            \"accessToken\": {{\n                                \"accessKeyId\": \"{}\",\n                                \"secretAccessKey\": \"{}\",\n                                \"sessionToken\": \"{}\"\n                            }},\n                            \"expiresIn\": {},\n                            \"refreshToken\": \"{}\"\n                        }}\"#,\n                        resp.token_output.access_token.access_key_id,\n                        resp.token_output.access_token.secret_access_key,\n                        resp.token_output.access_token.session_token,\n                        resp.token_output.expires_in,\n                        resp.token_output.refresh_token\n                    );\n                    return HttpConnectorFuture::ready(Ok(HttpResponse::new(\n                        200.try_into().unwrap(),\n                        SdkBody::from(body),\n                    )));\n                }\n            }\n            HttpConnectorFuture::ready(Ok(HttpResponse::new(\n                500.try_into().unwrap(),\n                SdkBody::from(\"{\\\"error\\\":\\\"no_mock\\\"}\"),\n            )))\n        }\n    }\n\n    #[tokio::test]\n    async fn run_login_tests() -> Result<(), Box<dyn Error>> {\n        let test_cases = std::fs::read_to_string(\"test-data/login-provider-test-cases.json\")?;\n        let test_cases: Vec<LoginTestCase> = serde_json::from_str(&test_cases)?;\n\n        for (idx, test) in test_cases.iter().enumerate() {\n            println!(\"Running test {}: {}\", idx, test.documentation);\n            test.check().await;\n        }\n        Ok(())\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/src/meta/credentials/chain.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_credential_types::{\n    provider::{self, error::CredentialsError, future, ProvideCredentials},\n    Credentials,\n};\nuse aws_smithy_types::error::display::DisplayErrorContext;\nuse std::borrow::Cow;\nuse std::fmt::Debug;\nuse tracing::Instrument;\n\n/// Credentials provider that checks a series of inner providers\n///\n/// Each provider will be evaluated in order:\n/// * If a provider returns valid [`Credentials`] they will be returned immediately.\n///   No other credential providers will be used.\n/// * Otherwise, if a provider returns [`CredentialsError::CredentialsNotLoaded`], the next provider will be checked.\n/// * Finally, if a provider returns any other error condition, an error will be returned immediately.\n///\n/// # Examples\n///\n/// ```no_run\n/// # fn example() {\n/// use aws_config::meta::credentials::CredentialsProviderChain;\n/// use aws_config::environment::credentials::EnvironmentVariableCredentialsProvider;\n/// use aws_config::profile::ProfileFileCredentialsProvider;\n///\n/// let provider = CredentialsProviderChain::first_try(\"Environment\", EnvironmentVariableCredentialsProvider::new())\n///     .or_else(\"Profile\", ProfileFileCredentialsProvider::builder().build());\n/// # }\n/// ```\npub struct CredentialsProviderChain {\n    providers: Vec<(Cow<'static, str>, Box<dyn ProvideCredentials>)>,\n}\n\nimpl Debug for CredentialsProviderChain {\n    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n        f.debug_struct(\"CredentialsProviderChain\")\n            .field(\n                \"providers\",\n                &self\n                    .providers\n                    .iter()\n                    .map(|provider| &provider.0)\n                    .collect::<Vec<&Cow<'static, str>>>(),\n            )\n            .finish()\n    }\n}\n\nimpl CredentialsProviderChain {\n    /// Create a `CredentialsProviderChain` that begins by evaluating this provider\n    pub fn first_try(\n        name: impl Into<Cow<'static, str>>,\n        provider: impl ProvideCredentials + 'static,\n    ) -> Self {\n        CredentialsProviderChain {\n            providers: vec![(name.into(), Box::new(provider))],\n        }\n    }\n\n    /// Add a fallback provider to the credentials provider chain\n    pub fn or_else(\n        mut self,\n        name: impl Into<Cow<'static, str>>,\n        provider: impl ProvideCredentials + 'static,\n    ) -> Self {\n        self.providers.push((name.into(), Box::new(provider)));\n        self\n    }\n\n    /// Add a fallback to the default provider chain\n    #[cfg(any(feature = \"default-https-client\", feature = \"rustls\"))]\n    pub async fn or_default_provider(self) -> Self {\n        self.or_else(\n            \"DefaultProviderChain\",\n            crate::default_provider::credentials::default_provider().await,\n        )\n    }\n\n    /// Creates a credential provider chain that starts with the default provider\n    #[cfg(any(feature = \"default-https-client\", feature = \"rustls\"))]\n    pub async fn default_provider() -> Self {\n        Self::first_try(\n            \"DefaultProviderChain\",\n            crate::default_provider::credentials::default_provider().await,\n        )\n    }\n\n    async fn credentials(&self) -> provider::Result {\n        for (name, provider) in &self.providers {\n            let span = tracing::debug_span!(\"credentials_provider_chain\", provider = %name);\n            match provider.provide_credentials().instrument(span).await {\n                Ok(credentials) => {\n                    tracing::debug!(provider = %name, \"loaded credentials\");\n                    return Ok(credentials);\n                }\n                Err(err @ CredentialsError::CredentialsNotLoaded(_)) => {\n                    tracing::debug!(provider = %name, context = %DisplayErrorContext(&err), \"provider in chain did not provide credentials\");\n                }\n                Err(err) => {\n                    tracing::warn!(provider = %name, error = %DisplayErrorContext(&err), \"provider failed to provide credentials\");\n                    return Err(err);\n                }\n            }\n        }\n        Err(CredentialsError::not_loaded(\n            \"no providers in chain provided credentials\",\n        ))\n    }\n}\n\nimpl ProvideCredentials for CredentialsProviderChain {\n    fn provide_credentials<'a>(&'a self) -> future::ProvideCredentials<'a>\n    where\n        Self: 'a,\n    {\n        future::ProvideCredentials::new(self.credentials())\n    }\n\n    fn fallback_on_interrupt(&self) -> Option<Credentials> {\n        for (_, provider) in &self.providers {\n            if let creds @ Some(_) = provider.fallback_on_interrupt() {\n                return creds;\n            }\n        }\n        None\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use std::time::Duration;\n\n    use aws_credential_types::{\n        credential_fn::provide_credentials_fn,\n        provider::{error::CredentialsError, future, ProvideCredentials},\n        Credentials,\n    };\n    use aws_smithy_async::future::timeout::Timeout;\n\n    use crate::meta::credentials::CredentialsProviderChain;\n\n    #[derive(Debug)]\n    struct FallbackCredentials(Credentials);\n\n    impl ProvideCredentials for FallbackCredentials {\n        fn provide_credentials<'a>(&'a self) -> future::ProvideCredentials<'a>\n        where\n            Self: 'a,\n        {\n            future::ProvideCredentials::new(async {\n                tokio::time::sleep(Duration::from_millis(200)).await;\n                Ok(self.0.clone())\n            })\n        }\n\n        fn fallback_on_interrupt(&self) -> Option<Credentials> {\n            Some(self.0.clone())\n        }\n    }\n\n    #[tokio::test]\n    async fn fallback_credentials_should_be_returned_from_provider2_on_timeout_while_provider2_was_providing_credentials(\n    ) {\n        let chain = CredentialsProviderChain::first_try(\n            \"provider1\",\n            provide_credentials_fn(|| async {\n                tokio::time::sleep(Duration::from_millis(200)).await;\n                Err(CredentialsError::not_loaded(\n                    \"no providers in chain provided credentials\",\n                ))\n            }),\n        )\n        .or_else(\"provider2\", FallbackCredentials(Credentials::for_tests()));\n\n        // Let the first call to `provide_credentials` succeed.\n        let expected = chain.provide_credentials().await.unwrap();\n\n        // Let the second call fail with an external timeout.\n        let timeout = Timeout::new(\n            chain.provide_credentials(),\n            tokio::time::sleep(Duration::from_millis(300)),\n        );\n        match timeout.await {\n            Ok(_) => panic!(\"provide_credentials completed before timeout future\"),\n            Err(_err) => match chain.fallback_on_interrupt() {\n                Some(actual) => assert_eq!(actual, expected),\n                None => panic!(\n                    \"provide_credentials timed out and no credentials returned from fallback_on_interrupt\"\n                ),\n            },\n        };\n    }\n\n    #[tokio::test]\n    async fn fallback_credentials_should_be_returned_from_provider2_on_timeout_while_provider1_was_providing_credentials(\n    ) {\n        let chain = CredentialsProviderChain::first_try(\n            \"provider1\",\n            provide_credentials_fn(|| async {\n                tokio::time::sleep(Duration::from_millis(200)).await;\n                Err(CredentialsError::not_loaded(\n                    \"no providers in chain provided credentials\",\n                ))\n            }),\n        )\n        .or_else(\"provider2\", FallbackCredentials(Credentials::for_tests()));\n\n        // Let the first call to `provide_credentials` succeed.\n        let expected = chain.provide_credentials().await.unwrap();\n\n        // Let the second call fail with an external timeout.\n        let timeout = Timeout::new(\n            chain.provide_credentials(),\n            tokio::time::sleep(Duration::from_millis(100)),\n        );\n        match timeout.await {\n            Ok(_) => panic!(\"provide_credentials completed before timeout future\"),\n            Err(_err) => match chain.fallback_on_interrupt() {\n                Some(actual) => assert_eq!(actual, expected),\n                None => panic!(\n                    \"provide_credentials timed out and no credentials returned from fallback_on_interrupt\"\n                ),\n            },\n        };\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/src/meta/credentials/mod.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Credential providers that augment an existing credentials providers to add functionality\n\nmod chain;\npub use chain::CredentialsProviderChain;\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/src/meta/mod.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Meta-providers that augment existing providers with new behavior\n\npub mod credentials;\npub mod region;\npub mod token;\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/src/meta/region.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Region providers that augment existing providers with new functionality\n\nuse aws_types::region::Region;\nuse std::borrow::Cow;\nuse std::fmt::Debug;\nuse tracing::Instrument;\n\n/// Load a region by selecting the first from a series of region providers.\n///\n/// # Examples\n///\n/// ```no_run\n/// # fn example() {\n/// use aws_types::region::Region;\n/// use std::env;\n/// use aws_config::meta::region::RegionProviderChain;\n///\n/// // region provider that first checks the `CUSTOM_REGION` environment variable,\n/// // then checks the default provider chain, then falls back to us-east-2\n/// let provider = RegionProviderChain::first_try(env::var(\"CUSTOM_REGION\").ok().map(Region::new))\n///     .or_default_provider()\n///     .or_else(Region::new(\"us-east-2\"));\n/// # }\n/// ```\n#[derive(Debug)]\npub struct RegionProviderChain {\n    providers: Vec<Box<dyn ProvideRegion>>,\n}\n\nimpl RegionProviderChain {\n    /// Load a region from the provider chain\n    ///\n    /// The first provider to return a non-optional region will be selected\n    pub async fn region(&self) -> Option<Region> {\n        for provider in &self.providers {\n            if let Some(region) = provider\n                .region()\n                .instrument(tracing::debug_span!(\"region_provider_chain\", provider = ?provider))\n                .await\n            {\n                return Some(region);\n            }\n        }\n        None\n    }\n\n    /// Create a default provider chain that starts by checking this provider.\n    pub fn first_try(provider: impl ProvideRegion + 'static) -> Self {\n        RegionProviderChain {\n            providers: vec![Box::new(provider)],\n        }\n    }\n\n    /// Add a fallback provider to the region provider chain.\n    pub fn or_else(mut self, fallback: impl ProvideRegion + 'static) -> Self {\n        self.providers.push(Box::new(fallback));\n        self\n    }\n\n    /// Create a region provider chain that starts by checking the default provider.\n    pub fn default_provider() -> Self {\n        Self::first_try(crate::default_provider::region::default_provider())\n    }\n\n    /// Fallback to the default provider\n    pub fn or_default_provider(mut self) -> Self {\n        self.providers\n            .push(Box::new(crate::default_provider::region::default_provider()));\n        self\n    }\n}\n\nimpl ProvideRegion for Option<Region> {\n    fn region(&self) -> future::ProvideRegion<'_> {\n        future::ProvideRegion::ready(self.clone())\n    }\n}\n\nimpl ProvideRegion for RegionProviderChain {\n    fn region(&self) -> future::ProvideRegion<'_> {\n        future::ProvideRegion::new(RegionProviderChain::region(self))\n    }\n}\n\n/// Future wrapper returned by [`ProvideRegion`]\n///\n/// Note: this module should only be used when implementing your own region providers.\npub mod future {\n    use std::future::Future;\n    use std::pin::Pin;\n    use std::task::{Context, Poll};\n\n    use aws_smithy_async::future::now_or_later::NowOrLater;\n\n    use aws_types::region::Region;\n\n    type BoxFuture<'a> = Pin<Box<dyn Future<Output = Option<Region>> + Send + 'a>>;\n    /// Future returned by [`ProvideRegion`](super::ProvideRegion)\n    ///\n    /// - When wrapping an already loaded region, use [`ready`](ProvideRegion::ready).\n    /// - When wrapping an asynchronously loaded region, use [`new`](ProvideRegion::new).\n    #[derive(Debug)]\n    pub struct ProvideRegion<'a>(NowOrLater<Option<Region>, BoxFuture<'a>>);\n    impl<'a> ProvideRegion<'a> {\n        /// A future that wraps the given future\n        pub fn new(future: impl Future<Output = Option<Region>> + Send + 'a) -> Self {\n            Self(NowOrLater::new(Box::pin(future)))\n        }\n\n        /// A future that resolves to a given region\n        pub fn ready(region: Option<Region>) -> Self {\n            Self(NowOrLater::ready(region))\n        }\n    }\n\n    impl Future for ProvideRegion<'_> {\n        type Output = Option<Region>;\n\n        fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {\n            Pin::new(&mut self.0).poll(cx)\n        }\n    }\n}\n\n/// Provide a [`Region`] to use with AWS requests\n///\n/// For most cases [`default_provider`](crate::default_provider::region::default_provider) will be the best option, implementing\n/// a standard provider chain.\npub trait ProvideRegion: Send + Sync + Debug {\n    /// Load a region from this provider\n    fn region(&self) -> future::ProvideRegion<'_>;\n}\n\nimpl ProvideRegion for Region {\n    fn region(&self) -> future::ProvideRegion<'_> {\n        future::ProvideRegion::ready(Some(self.clone()))\n    }\n}\n\nimpl ProvideRegion for &Region {\n    fn region(&self) -> future::ProvideRegion<'_> {\n        future::ProvideRegion::ready(Some((*self).clone()))\n    }\n}\n\nimpl ProvideRegion for Box<dyn ProvideRegion> {\n    fn region(&self) -> future::ProvideRegion<'_> {\n        self.as_ref().region()\n    }\n}\n\nimpl ProvideRegion for &'static str {\n    fn region(&self) -> future::ProvideRegion<'_> {\n        future::ProvideRegion::ready(Some(Region::new(Cow::Borrowed(*self))))\n    }\n}\n\n#[cfg(test)]\nmod test {\n    use crate::meta::region::RegionProviderChain;\n    use aws_types::region::Region;\n    use futures_util::FutureExt;\n\n    #[test]\n    fn provider_chain() {\n        let a = None;\n        let b = Some(Region::new(\"us-east-1\"));\n        let chain = RegionProviderChain::first_try(a).or_else(b);\n        assert_eq!(\n            chain.region().now_or_never().expect(\"ready\"),\n            Some(Region::new(\"us-east-1\"))\n        );\n    }\n\n    #[test]\n    fn empty_chain() {\n        let chain = RegionProviderChain::first_try(None).or_else(None);\n        assert_eq!(chain.region().now_or_never().expect(\"ready\"), None);\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/src/meta/token.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Token providers that augment existing token providers to add functionality\n\nuse aws_credential_types::provider::{\n    error::TokenError, future, token::ProvideToken, token::Result,\n};\nuse aws_smithy_types::error::display::DisplayErrorContext;\nuse std::borrow::Cow;\nuse tracing::Instrument;\n\n/// Access token provider that checks a series of inner providers.\n///\n/// Each provider will be evaluated in order:\n/// * If a provider returns valid [`Token`](aws_credential_types::Token) they will be returned immediately.\n///   No other token providers will be used.\n/// * Otherwise, if a provider returns [`TokenError::TokenNotLoaded`], the next provider will be checked.\n/// * Finally, if a provider returns any other error condition, an error will be returned immediately.\n///\n#[cfg_attr(\n    feature = \"sso\",\n    doc = r#\"\n# Examples\n\n```no_run\n# fn example() {\nuse aws_config::meta::token::TokenProviderChain;\nuse aws_config::profile::ProfileFileTokenProvider;\nuse aws_credential_types::Token;\n\nlet provider = TokenProviderChain::first_try(\"Profile\", ProfileFileTokenProvider::builder().build())\n    .or_else(\"Static\", Token::new(\"example\", None));\n# }\n```\n\"#\n)]\n#[derive(Debug)]\npub struct TokenProviderChain {\n    providers: Vec<(Cow<'static, str>, Box<dyn ProvideToken>)>,\n}\n\nimpl TokenProviderChain {\n    /// Create a `TokenProviderChain` that begins by evaluating this provider\n    pub fn first_try(\n        name: impl Into<Cow<'static, str>>,\n        provider: impl ProvideToken + 'static,\n    ) -> Self {\n        TokenProviderChain {\n            providers: vec![(name.into(), Box::new(provider))],\n        }\n    }\n\n    /// Add a fallback provider to the token provider chain\n    pub fn or_else(\n        mut self,\n        name: impl Into<Cow<'static, str>>,\n        provider: impl ProvideToken + 'static,\n    ) -> Self {\n        self.providers.push((name.into(), Box::new(provider)));\n        self\n    }\n\n    /// Add a fallback to the default provider chain\n    #[cfg(feature = \"sso\")]\n    pub async fn or_default_provider(self) -> Self {\n        self.or_else(\n            \"DefaultProviderChain\",\n            crate::default_provider::token::default_provider().await,\n        )\n    }\n\n    /// Creates a token provider chain that starts with the default provider\n    #[cfg(feature = \"sso\")]\n    pub async fn default_provider() -> Self {\n        Self::first_try(\n            \"DefaultProviderChain\",\n            crate::default_provider::token::default_provider().await,\n        )\n    }\n\n    async fn token(&self) -> Result {\n        for (name, provider) in &self.providers {\n            let span = tracing::debug_span!(\"token_provider_chain\", provider = %name);\n            match provider.provide_token().instrument(span).await {\n                Ok(credentials) => {\n                    tracing::debug!(provider = %name, \"loaded access token\");\n                    return Ok(credentials);\n                }\n                Err(err @ TokenError::TokenNotLoaded(_)) => {\n                    tracing::debug!(provider = %name, context = %DisplayErrorContext(&err), \"provider in chain did not provide an access token\");\n                }\n                Err(err) => {\n                    tracing::warn!(provider = %name, error = %DisplayErrorContext(&err), \"provider failed to provide an access token\");\n                    return Err(err);\n                }\n            }\n        }\n        Err(TokenError::not_loaded(\n            \"no providers in chain provided tokens\",\n        ))\n    }\n}\n\nimpl ProvideToken for TokenProviderChain {\n    fn provide_token<'a>(&'a self) -> future::ProvideToken<'a>\n    where\n        Self: 'a,\n    {\n        future::ProvideToken::new(self.token())\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/src/profile/credentials/exec.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse super::repr::{self, BaseProvider};\n#[cfg(feature = \"credentials-process\")]\nuse crate::credential_process::CredentialProcessProvider;\n#[cfg(feature = \"credentials-login\")]\nuse crate::login::LoginCredentialsProvider;\nuse crate::profile::credentials::ProfileFileError;\nuse crate::provider_config::ProviderConfig;\nuse crate::sts;\nuse crate::web_identity_token::{StaticConfiguration, WebIdentityTokenCredentialsProvider};\nuse aws_credential_types::provider::{\n    self, error::CredentialsError, ProvideCredentials, SharedCredentialsProvider,\n};\nuse aws_sdk_sts::config::Credentials;\nuse aws_sdk_sts::Client as StsClient;\nuse aws_smithy_async::time::SharedTimeSource;\nuse aws_types::SdkConfig;\nuse std::fmt::Debug;\nuse std::sync::Arc;\n\n#[derive(Debug)]\npub(super) struct AssumeRoleProvider {\n    role_arn: String,\n    external_id: Option<String>,\n    session_name: Option<String>,\n    time_source: SharedTimeSource,\n}\n\nimpl AssumeRoleProvider {\n    pub(super) async fn credentials(\n        &self,\n        input_credentials: Credentials,\n        sdk_config: &SdkConfig,\n    ) -> provider::Result {\n        let config = sdk_config\n            .to_builder()\n            .credentials_provider(SharedCredentialsProvider::new(input_credentials))\n            .build();\n        let client = StsClient::new(&config);\n        let session_name = &self.session_name.as_ref().cloned().unwrap_or_else(|| {\n            sts::util::default_session_name(\"assume-role-from-profile\", self.time_source.now())\n        });\n        let assume_role_output = client\n            .assume_role()\n            .role_arn(&self.role_arn)\n            .set_external_id(self.external_id.clone())\n            .role_session_name(session_name)\n            .send()\n            .await\n            .map_err(CredentialsError::provider_error)?;\n        sts::util::into_credentials(\n            assume_role_output.credentials,\n            assume_role_output.assumed_role_user,\n            \"AssumeRoleProvider\",\n        )\n    }\n}\n\n#[derive(Debug)]\npub(super) struct ProviderChain {\n    base: Arc<dyn ProvideCredentials>,\n    chain: Vec<AssumeRoleProvider>,\n}\n\nimpl ProviderChain {\n    pub(crate) fn base(&self) -> &dyn ProvideCredentials {\n        self.base.as_ref()\n    }\n\n    pub(crate) fn chain(&self) -> &[AssumeRoleProvider] {\n        self.chain.as_slice()\n    }\n}\n\nimpl ProviderChain {\n    pub(super) fn from_repr(\n        provider_config: &ProviderConfig,\n        repr: repr::ProfileChain<'_>,\n        factory: &named::NamedProviderFactory,\n    ) -> Result<Self, ProfileFileError> {\n        let base = match repr.base() {\n            BaseProvider::NamedSource(name) => {\n                factory\n                    .provider(name)\n                    .ok_or(ProfileFileError::UnknownProvider {\n                        name: name.to_string(),\n                    })?\n            }\n            BaseProvider::AccessKey(key) => Arc::new(key.clone()),\n            BaseProvider::CredentialProcess {\n                command_with_sensitive_args,\n                account_id,\n            } => {\n                #[cfg(feature = \"credentials-process\")]\n                {\n                    Arc::new({\n                        let mut builder = CredentialProcessProvider::builder()\n                            .command(command_with_sensitive_args.to_owned_string());\n                        builder.set_account_id(\n                            account_id.map(aws_credential_types::attributes::AccountId::from),\n                        );\n                        builder.build()\n                    })\n                }\n                #[cfg(not(feature = \"credentials-process\"))]\n                {\n                    let _ = (command_with_sensitive_args, account_id);\n                    Err(ProfileFileError::FeatureNotEnabled {\n                        feature: \"credentials-process\".into(),\n                        message: Some(\n                            \"In order to spawn a subprocess, the `credentials-process` feature must be enabled.\"\n                                .into(),\n                        ),\n                    })?\n                }\n            }\n            BaseProvider::LoginSession { login_session_arn } => {\n                #[cfg(feature = \"credentials-login\")]\n                {\n                    Arc::new({\n                        let builder = LoginCredentialsProvider::builder(*login_session_arn)\n                            .enabled_from_profile(true)\n                            .configure(provider_config);\n                        builder.build()\n                    })\n                }\n                #[cfg(not(feature = \"credentials-login\"))]\n                {\n                    let _ = login_session_arn;\n                    Err(ProfileFileError::FeatureNotEnabled {\n                        feature: \"credentials-login\".into(),\n                        message: Some(\n                            \"In order to use an active login session, the `credentials-login` feature must be enabled.\"\n                                .into(),\n                        ),\n                    })?\n                }\n            }\n            BaseProvider::WebIdentityTokenRole {\n                role_arn,\n                web_identity_token_file,\n                session_name,\n            } => {\n                let provider = WebIdentityTokenCredentialsProvider::builder()\n                    .static_configuration(StaticConfiguration {\n                        web_identity_token_file: web_identity_token_file.into(),\n                        role_arn: role_arn.to_string(),\n                        session_name: session_name.map(|sess| sess.to_string()).unwrap_or_else(\n                            || {\n                                sts::util::default_session_name(\n                                    \"web-identity-token-profile\",\n                                    provider_config.time_source().now(),\n                                )\n                            },\n                        ),\n                    })\n                    .configure(provider_config)\n                    .build();\n                Arc::new(provider)\n            }\n            #[allow(unused_variables)]\n            BaseProvider::Sso {\n                sso_account_id,\n                sso_region,\n                sso_role_name,\n                sso_start_url,\n                sso_session_name,\n            } => {\n                #[cfg(feature = \"sso\")]\n                {\n                    use crate::sso::{credentials::SsoProviderConfig, SsoCredentialsProvider};\n                    use aws_types::region::Region;\n\n                    let (Some(sso_account_id), Some(sso_role_name)) =\n                        (sso_account_id, sso_role_name)\n                    else {\n                        return Err(ProfileFileError::TokenProviderConfig {});\n                    };\n                    let sso_config = SsoProviderConfig {\n                        account_id: sso_account_id.to_string(),\n                        role_name: sso_role_name.to_string(),\n                        start_url: sso_start_url.to_string(),\n                        region: Region::new(sso_region.to_string()),\n                        session_name: sso_session_name.map(|s| s.to_string()),\n                    };\n                    Arc::new(SsoCredentialsProvider::new(provider_config, sso_config))\n                }\n                #[cfg(not(feature = \"sso\"))]\n                {\n                    Err(ProfileFileError::FeatureNotEnabled {\n                        feature: \"sso\".into(),\n                        message: None,\n                    })?\n                }\n            }\n        };\n        tracing::debug!(base = ?repr.base(), \"first credentials will be loaded from {:?}\", repr.base());\n        let chain = repr\n            .chain()\n            .iter()\n            .map(|role_arn| {\n                tracing::debug!(role_arn = ?role_arn, \"which will be used to assume a role\");\n                AssumeRoleProvider {\n                    role_arn: role_arn.role_arn.into(),\n                    external_id: role_arn.external_id.map(Into::into),\n                    session_name: role_arn.session_name.map(Into::into),\n                    time_source: provider_config.time_source(),\n                }\n            })\n            .collect();\n        Ok(ProviderChain { base, chain })\n    }\n}\n\npub(super) mod named {\n    use std::collections::HashMap;\n    use std::sync::Arc;\n\n    use aws_credential_types::provider::ProvideCredentials;\n    use std::borrow::Cow;\n\n    #[derive(Debug)]\n    pub(crate) struct NamedProviderFactory {\n        providers: HashMap<Cow<'static, str>, Arc<dyn ProvideCredentials>>,\n    }\n\n    fn lower_cow(mut input: Cow<'_, str>) -> Cow<'_, str> {\n        if !input.chars().all(|c| c.is_ascii_lowercase()) {\n            input.to_mut().make_ascii_lowercase();\n        }\n        input\n    }\n\n    impl NamedProviderFactory {\n        pub(crate) fn new(\n            providers: HashMap<Cow<'static, str>, Arc<dyn ProvideCredentials>>,\n        ) -> Self {\n            let providers = providers\n                .into_iter()\n                .map(|(k, v)| (lower_cow(k), v))\n                .collect();\n            Self { providers }\n        }\n\n        pub(crate) fn provider(&self, name: &str) -> Option<Arc<dyn ProvideCredentials>> {\n            self.providers.get(&lower_cow(Cow::Borrowed(name))).cloned()\n        }\n    }\n}\n\n#[cfg(test)]\nmod test {\n    use crate::profile::credentials::exec::named::NamedProviderFactory;\n    use crate::profile::credentials::exec::ProviderChain;\n    use crate::profile::credentials::repr::{BaseProvider, ProfileChain};\n    use crate::provider_config::ProviderConfig;\n    use crate::test_case::no_traffic_client;\n\n    use aws_credential_types::Credentials;\n    use std::collections::HashMap;\n    use std::sync::Arc;\n\n    #[test]\n    fn providers_case_insensitive() {\n        let mut base = HashMap::new();\n        base.insert(\n            \"Environment\".into(),\n            Arc::new(Credentials::for_tests()) as _,\n        );\n        let provider = NamedProviderFactory::new(base);\n        assert!(provider.provider(\"environment\").is_some());\n        assert!(provider.provider(\"envIROnment\").is_some());\n        assert!(provider.provider(\" envIROnment\").is_none());\n        assert!(provider.provider(\"Environment\").is_some());\n    }\n\n    #[test]\n    fn error_on_unknown_provider() {\n        let factory = NamedProviderFactory::new(HashMap::new());\n        let chain = ProviderChain::from_repr(\n            &ProviderConfig::empty().with_http_client(no_traffic_client()),\n            ProfileChain {\n                base: BaseProvider::NamedSource(\"floozle\"),\n                chain: vec![],\n            },\n            &factory,\n        );\n        let err = chain.expect_err(\"no source by that name\");\n        assert!(\n            format!(\"{}\", err).contains(\n                \"profile referenced `floozle` provider but that provider is not supported\"\n            ),\n            \"`{}` did not match expected error\",\n            err\n        );\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/src/profile/credentials/repr.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Flattened Representation of an AssumeRole chain\n//!\n//! Assume Role credentials in profile files can chain together credentials from multiple\n//! different providers with subsequent credentials being used to configure subsequent providers.\n//!\n//! This module can parse and resolve the profile chain into a flattened representation with\n//! 1-credential-per row (as opposed to a direct profile file representation which can combine\n//! multiple actions into the same profile).\n\nuse crate::profile::credentials::ProfileFileError;\nuse crate::profile::{Profile, ProfileSet};\nuse crate::sensitive_command::CommandWithSensitiveArgs;\nuse aws_credential_types::attributes::AccountId;\nuse aws_credential_types::Credentials;\n\n/// Chain of Profile Providers\n///\n/// Within a profile file, a chain of providers is produced. Starting with a base provider,\n/// subsequent providers use the credentials from previous providers to perform their task.\n///\n/// ProfileChain is a direct representation of the Profile. It can contain named providers\n/// that don't actually have implementations.\n#[derive(Debug)]\npub(crate) struct ProfileChain<'a> {\n    pub(crate) base: BaseProvider<'a>,\n    pub(crate) chain: Vec<RoleArn<'a>>,\n}\n\nimpl<'a> ProfileChain<'a> {\n    pub(crate) fn base(&self) -> &BaseProvider<'a> {\n        &self.base\n    }\n\n    pub(crate) fn chain(&self) -> &[RoleArn<'a>] {\n        self.chain.as_slice()\n    }\n}\n\n/// A base member of the profile chain\n///\n/// Base providers do not require input credentials to provide their own credentials,\n/// e.g. IMDS, ECS, Environment variables\n#[derive(Clone, Debug)]\n#[non_exhaustive]\npub(crate) enum BaseProvider<'a> {\n    /// A profile that specifies a named credential source\n    /// Eg: `credential_source = Ec2InstanceMetadata`\n    ///\n    /// The following profile produces two separate `ProfileProvider` rows:\n    /// 1. `BaseProvider::NamedSource(\"Ec2InstanceMetadata\")`\n    /// 2. `RoleArn { role_arn: \"...\", ... }\n    /// ```ini\n    /// [profile assume-role]\n    /// role_arn = arn:aws:iam::123456789:role/MyRole\n    /// credential_source = Ec2InstanceMetadata\n    /// ```\n    NamedSource(&'a str),\n\n    /// A profile with explicitly configured access keys\n    ///\n    /// Example\n    /// ```ini\n    /// [profile C]\n    /// aws_access_key_id = abc123\n    /// aws_secret_access_key = def456\n    /// ```\n    AccessKey(Credentials),\n\n    WebIdentityTokenRole {\n        role_arn: &'a str,\n        web_identity_token_file: &'a str,\n        session_name: Option<&'a str>,\n    },\n\n    /// An SSO Provider\n    Sso {\n        sso_session_name: Option<&'a str>,\n        sso_region: &'a str,\n        sso_start_url: &'a str,\n\n        // Credentials from SSO fields\n        sso_account_id: Option<&'a str>,\n        sso_role_name: Option<&'a str>,\n    },\n\n    /// A profile that specifies a `credential_process`\n    /// ```ini\n    /// [profile assume-role]\n    /// credential_process = /opt/bin/awscreds-custom --username helen\n    /// ```\n    CredentialProcess {\n        command_with_sensitive_args: CommandWithSensitiveArgs<&'a str>,\n        // The account ID that the credential process falls back to\n        // if the process execution result does not provide one.\n        account_id: Option<&'a str>,\n    },\n\n    /// A profile that specifies an active console session vended by AWS Sign-In.\n    /// ```ini\n    /// [profile console]\n    /// login_session = arn:aws:iam::0123456789012:user/Admin\n    /// ```\n    LoginSession { login_session_arn: &'a str },\n}\n\n/// A profile that specifies a role to assume\n///\n/// A RoleArn can only be created from either a profile with `source_profile`\n/// or one with `credential_source`.\n#[derive(Debug)]\npub(crate) struct RoleArn<'a> {\n    /// Role to assume\n    pub(crate) role_arn: &'a str,\n    /// external_id parameter to pass to the assume role provider\n    pub(crate) external_id: Option<&'a str>,\n\n    /// session name parameter to pass to the assume role provider\n    pub(crate) session_name: Option<&'a str>,\n}\n\n/// Resolve a ProfileChain from a ProfileSet or return an error\npub(crate) fn resolve_chain(\n    profile_set: &ProfileSet,\n) -> Result<ProfileChain<'_>, ProfileFileError> {\n    // If there are no profiles, allow flowing into the next provider\n    if profile_set.is_empty() {\n        return Err(ProfileFileError::NoProfilesDefined);\n    }\n\n    // If:\n    // - There is no explicit profile override\n    // - We're looking for the default profile (no configuration)\n    // - There is no default profile\n    // Then:\n    // - Treat this situation as if no profiles were defined\n    if profile_set.selected_profile() == \"default\" && profile_set.get_profile(\"default\").is_none() {\n        tracing::debug!(\"No default profile defined\");\n        return Err(ProfileFileError::NoProfilesDefined);\n    }\n    let mut source_profile_name = profile_set.selected_profile();\n    let mut visited_profiles = vec![];\n    let mut chain = vec![];\n    let base = loop {\n        // Get the next profile in the chain\n        let profile = profile_set.get_profile(source_profile_name).ok_or(\n            ProfileFileError::MissingProfile {\n                profile: source_profile_name.into(),\n                message: format!(\n                    \"could not find source profile {} referenced from {}\",\n                    source_profile_name,\n                    visited_profiles.last().unwrap_or(&\"the root profile\")\n                )\n                .into(),\n            },\n        )?;\n        // If the profile we just got is one we've already seen, we're in a loop and\n        // need to break out with a CredentialLoop error\n        if visited_profiles.contains(&source_profile_name) {\n            return Err(ProfileFileError::CredentialLoop {\n                profiles: visited_profiles\n                    .into_iter()\n                    .map(|s| s.to_string())\n                    .collect(),\n                next: source_profile_name.to_string(),\n            });\n        }\n        // otherwise, store the name of the profile in case we see it again later\n        visited_profiles.push(source_profile_name);\n        // After the first item in the chain, we will prioritize static credentials if they exist\n        if visited_profiles.len() > 1 {\n            let try_static = static_creds_from_profile(profile);\n            if let Ok(static_credentials) = try_static {\n                break BaseProvider::AccessKey(static_credentials);\n            }\n        }\n\n        let next_profile = {\n            // The existence of a `role_arn` is the only signal that multiple profiles will be chained.\n            // We check for one here and then process the profile accordingly as either a \"chain provider\"\n            // or a \"base provider\"\n            if let Some(role_provider) = role_arn_from_profile(profile) {\n                let next = chain_provider(profile)?;\n                chain.push(role_provider);\n                next\n            } else {\n                break base_provider(profile_set, profile).map_err(|err| {\n                    // It's possible for base_provider to return a `ProfileFileError::ProfileDidNotContainCredentials`\n                    // if we're still looking at the first provider we want to surface it. However,\n                    // if we're looking at any provider after the first we want to instead return a `ProfileFileError::InvalidCredentialSource`\n                    if visited_profiles.len() == 1 {\n                        err\n                    } else {\n                        ProfileFileError::InvalidCredentialSource {\n                            profile: profile.name().into(),\n                            message: format!(\"could not load source profile: {err}\").into(),\n                        }\n                    }\n                })?;\n            }\n        };\n\n        match next_profile {\n            NextProfile::SelfReference => {\n                // self referential profile, don't go through the loop because it will error\n                // on the infinite loop check. Instead, reload this profile as a base profile\n                // and exit.\n                break base_provider(profile_set, profile)?;\n            }\n            NextProfile::Named(name) => source_profile_name = name,\n        }\n    };\n    chain.reverse();\n    Ok(ProfileChain { base, chain })\n}\n\nmod role {\n    pub(super) const ROLE_ARN: &str = \"role_arn\";\n    pub(super) const EXTERNAL_ID: &str = \"external_id\";\n    pub(super) const SESSION_NAME: &str = \"role_session_name\";\n\n    pub(super) const CREDENTIAL_SOURCE: &str = \"credential_source\";\n    pub(super) const SOURCE_PROFILE: &str = \"source_profile\";\n}\n\nmod sso {\n    pub(super) const ACCOUNT_ID: &str = \"sso_account_id\";\n    pub(super) const REGION: &str = \"sso_region\";\n    pub(super) const ROLE_NAME: &str = \"sso_role_name\";\n    pub(super) const START_URL: &str = \"sso_start_url\";\n    pub(super) const SESSION_NAME: &str = \"sso_session\";\n}\n\nmod web_identity_token {\n    pub(super) const TOKEN_FILE: &str = \"web_identity_token_file\";\n}\n\nmod static_credentials {\n    pub(super) const AWS_ACCESS_KEY_ID: &str = \"aws_access_key_id\";\n    pub(super) const AWS_SECRET_ACCESS_KEY: &str = \"aws_secret_access_key\";\n    pub(super) const AWS_SESSION_TOKEN: &str = \"aws_session_token\";\n    pub(super) const AWS_ACCOUNT_ID: &str = \"aws_account_id\";\n}\n\nmod credential_process {\n    pub(super) const CREDENTIAL_PROCESS: &str = \"credential_process\";\n}\n\nmod login_session {\n    pub(super) const LOGIN_SESSION: &str = \"login_session\";\n}\n\nconst PROVIDER_NAME: &str = \"ProfileFile\";\n\nfn base_provider<'a>(\n    profile_set: &'a ProfileSet,\n    profile: &'a Profile,\n) -> Result<BaseProvider<'a>, ProfileFileError> {\n    // the profile must define either a `CredentialsSource` or a concrete set of access keys\n    match profile.get(role::CREDENTIAL_SOURCE) {\n        Some(source) => Ok(BaseProvider::NamedSource(source)),\n        None => web_identity_token_from_profile(profile)\n            .or_else(|| sso_from_profile(profile_set, profile).transpose())\n            .or_else(|| login_session_from_profile(profile))\n            .or_else(|| credential_process_from_profile(profile))\n            .unwrap_or_else(|| Ok(BaseProvider::AccessKey(static_creds_from_profile(profile)?))),\n    }\n}\n\nenum NextProfile<'a> {\n    SelfReference,\n    Named(&'a str),\n}\n\nfn chain_provider(profile: &Profile) -> Result<NextProfile<'_>, ProfileFileError> {\n    let (source_profile, credential_source) = (\n        profile.get(role::SOURCE_PROFILE),\n        profile.get(role::CREDENTIAL_SOURCE),\n    );\n    match (source_profile, credential_source) {\n        (Some(_), Some(_)) => Err(ProfileFileError::InvalidCredentialSource {\n            profile: profile.name().to_string(),\n            message: \"profile contained both source_profile and credential_source. \\\n                Only one or the other can be defined\"\n                .into(),\n        }),\n        (None, None) => Err(ProfileFileError::InvalidCredentialSource {\n            profile: profile.name().to_string(),\n            message:\n            \"profile must contain `source_profile` or `credential_source` but neither were defined\"\n                .into(),\n        }),\n        (Some(source_profile), None) if source_profile == profile.name() => {\n            Ok(NextProfile::SelfReference)\n        }\n        (Some(source_profile), None) => Ok(NextProfile::Named(source_profile)),\n        // we want to loop back into this profile and pick up the credential source\n        (None, Some(_credential_source)) => Ok(NextProfile::SelfReference),\n    }\n}\n\nfn role_arn_from_profile(profile: &Profile) -> Option<RoleArn<'_>> {\n    // Web Identity Tokens are root providers, not chained roles\n    if profile.get(web_identity_token::TOKEN_FILE).is_some() {\n        return None;\n    }\n    let role_arn = profile.get(role::ROLE_ARN)?;\n    let session_name = profile.get(role::SESSION_NAME);\n    let external_id = profile.get(role::EXTERNAL_ID);\n    Some(RoleArn {\n        role_arn,\n        external_id,\n        session_name,\n    })\n}\n\nfn sso_from_profile<'a>(\n    profile_set: &'a ProfileSet,\n    profile: &'a Profile,\n) -> Result<Option<BaseProvider<'a>>, ProfileFileError> {\n    /*\n    -- Sample without sso-session: --\n\n    [profile sample-profile]\n    sso_account_id = 012345678901\n    sso_region = us-east-1\n    sso_role_name = SampleRole\n    sso_start_url = https://d-abc123.awsapps.com/start-beta\n\n    -- Sample with sso-session: --\n\n    [profile sample-profile]\n    sso_session = dev\n    sso_account_id = 012345678901\n    sso_role_name = SampleRole\n\n    [sso-session dev]\n    sso_region = us-east-1\n    sso_start_url = https://d-abc123.awsapps.com/start-beta\n    */\n    let sso_account_id = profile.get(sso::ACCOUNT_ID);\n    let mut sso_region = profile.get(sso::REGION);\n    let sso_role_name = profile.get(sso::ROLE_NAME);\n    let mut sso_start_url = profile.get(sso::START_URL);\n    let sso_session_name = profile.get(sso::SESSION_NAME);\n    if [\n        sso_account_id,\n        sso_region,\n        sso_role_name,\n        sso_start_url,\n        sso_session_name,\n    ]\n    .iter()\n    .all(Option::is_none)\n    {\n        return Ok(None);\n    }\n\n    let invalid_sso_config = |s: &str| ProfileFileError::InvalidSsoConfig {\n        profile: profile.name().into(),\n        message: format!(\n            \"`{s}` can only be specified in the [sso-session] config when a session name is given\"\n        )\n        .into(),\n    };\n    if let Some(sso_session_name) = sso_session_name {\n        if sso_start_url.is_some() {\n            return Err(invalid_sso_config(sso::START_URL));\n        }\n        if sso_region.is_some() {\n            return Err(invalid_sso_config(sso::REGION));\n        }\n        if let Some(session) = profile_set.sso_session(sso_session_name) {\n            sso_start_url = session.get(sso::START_URL);\n            sso_region = session.get(sso::REGION);\n        } else {\n            return Err(ProfileFileError::MissingSsoSession {\n                profile: profile.name().into(),\n                sso_session: sso_session_name.into(),\n            });\n        }\n    }\n\n    let invalid_sso_creds = |left: &str, right: &str| ProfileFileError::InvalidSsoConfig {\n        profile: profile.name().into(),\n        message: format!(\"if `{left}` is set, then `{right}` must also be set\").into(),\n    };\n    match (sso_account_id, sso_role_name) {\n        (Some(_), Some(_)) | (None, None) => { /* good */ }\n        (Some(_), None) => return Err(invalid_sso_creds(sso::ACCOUNT_ID, sso::ROLE_NAME)),\n        (None, Some(_)) => return Err(invalid_sso_creds(sso::ROLE_NAME, sso::ACCOUNT_ID)),\n    }\n\n    let missing_field = |s| move || ProfileFileError::missing_field(profile, s);\n    let sso_region = sso_region.ok_or_else(missing_field(sso::REGION))?;\n    let sso_start_url = sso_start_url.ok_or_else(missing_field(sso::START_URL))?;\n    Ok(Some(BaseProvider::Sso {\n        sso_account_id,\n        sso_region,\n        sso_role_name,\n        sso_start_url,\n        sso_session_name,\n    }))\n}\n\nfn web_identity_token_from_profile(\n    profile: &Profile,\n) -> Option<Result<BaseProvider<'_>, ProfileFileError>> {\n    let session_name = profile.get(role::SESSION_NAME);\n    match (\n        profile.get(role::ROLE_ARN),\n        profile.get(web_identity_token::TOKEN_FILE),\n    ) {\n        (Some(role_arn), Some(token_file)) => Some(Ok(BaseProvider::WebIdentityTokenRole {\n            role_arn,\n            web_identity_token_file: token_file,\n            session_name,\n        })),\n        (None, None) => None,\n        (Some(_role_arn), None) => None,\n        (None, Some(_token_file)) => Some(Err(ProfileFileError::InvalidCredentialSource {\n            profile: profile.name().to_string(),\n            message: \"`web_identity_token_file` was specified but `role_arn` was missing\".into(),\n        })),\n    }\n}\n\n/// Load static credentials from a profile\n///\n/// Example:\n/// ```ini\n/// [profile B]\n/// aws_access_key_id = abc123\n/// aws_secret_access_key = def456\n/// ```\nfn static_creds_from_profile(profile: &Profile) -> Result<Credentials, ProfileFileError> {\n    use static_credentials::*;\n    let access_key = profile.get(AWS_ACCESS_KEY_ID);\n    let secret_key = profile.get(AWS_SECRET_ACCESS_KEY);\n    let session_token = profile.get(AWS_SESSION_TOKEN);\n    // If all three fields are missing return a `ProfileFileError::ProfileDidNotContainCredentials`\n    if let (None, None, None) = (access_key, secret_key, session_token) {\n        return Err(ProfileFileError::ProfileDidNotContainCredentials {\n            profile: profile.name().to_string(),\n        });\n    }\n    // Otherwise, check to make sure the access and secret keys are defined\n    let access_key = access_key.ok_or_else(|| ProfileFileError::InvalidCredentialSource {\n        profile: profile.name().to_string(),\n        message: \"profile missing aws_access_key_id\".into(),\n    })?;\n    let secret_key = secret_key.ok_or_else(|| ProfileFileError::InvalidCredentialSource {\n        profile: profile.name().to_string(),\n        message: \"profile missing aws_secret_access_key\".into(),\n    })?;\n    // There might not be an active session token so we don't error out if it's missing\n    let mut builder = Credentials::builder()\n        .access_key_id(access_key)\n        .secret_access_key(secret_key)\n        .provider_name(PROVIDER_NAME);\n    builder.set_session_token(session_token.map(String::from));\n    builder.set_account_id(profile.get(AWS_ACCOUNT_ID).map(AccountId::from));\n    Ok(builder.build())\n}\n\n/// Load credentials from `credential_process`\n///\n/// Example:\n/// ```ini\n/// [profile B]\n/// credential_process = /opt/bin/awscreds-custom --username helen\n/// ```\nfn credential_process_from_profile(\n    profile: &Profile,\n) -> Option<Result<BaseProvider<'_>, ProfileFileError>> {\n    let account_id = profile.get(static_credentials::AWS_ACCOUNT_ID);\n    profile\n        .get(credential_process::CREDENTIAL_PROCESS)\n        .map(|credential_process| {\n            Ok(BaseProvider::CredentialProcess {\n                command_with_sensitive_args: CommandWithSensitiveArgs::new(credential_process),\n                account_id,\n            })\n        })\n}\n\n/// Load credentials from `login_session`\n///\n/// Example:\n/// ```ini\n/// [profile console]\n/// login_session = arn:aws:iam::0123456789012:user/Admin\n/// ```\nfn login_session_from_profile(\n    profile: &Profile,\n) -> Option<Result<BaseProvider<'_>, ProfileFileError>> {\n    profile\n        .get(login_session::LOGIN_SESSION)\n        .map(|login_session_arn| Ok(BaseProvider::LoginSession { login_session_arn }))\n}\n\n#[cfg(test)]\nmod tests {\n\n    #[cfg(feature = \"test-util\")]\n    use super::ProfileChain;\n    use crate::profile::credentials::repr::BaseProvider;\n    use crate::sensitive_command::CommandWithSensitiveArgs;\n    use serde::Deserialize;\n    #[cfg(feature = \"test-util\")]\n    use std::collections::HashMap;\n\n    #[cfg(feature = \"test-util\")]\n    #[test]\n    fn run_test_cases() -> Result<(), Box<dyn std::error::Error>> {\n        let test_cases: Vec<TestCase> = serde_json::from_str(&std::fs::read_to_string(\n            \"./test-data/assume-role-tests.json\",\n        )?)?;\n        for test_case in test_cases {\n            print!(\"checking: {}...\", test_case.docs);\n            check(test_case);\n            println!(\"ok\")\n        }\n        Ok(())\n    }\n\n    #[cfg(feature = \"test-util\")]\n    fn check(test_case: TestCase) {\n        use super::resolve_chain;\n        use aws_runtime::env_config::property::Properties;\n        use aws_runtime::env_config::section::EnvConfigSections;\n        let source = EnvConfigSections::new(\n            test_case.input.profiles,\n            test_case.input.selected_profile,\n            test_case.input.sso_sessions,\n            Properties::new(),\n        );\n        let actual = resolve_chain(&source);\n        let expected = test_case.output;\n        match (expected, actual) {\n            (TestOutput::Error(s), Err(e)) => assert!(\n                format!(\"{}\", e).contains(&s),\n                \"expected\\n{}\\nto contain\\n{}\\n\",\n                e,\n                s\n            ),\n            (TestOutput::ProfileChain(expected), Ok(actual)) => {\n                assert_eq!(to_test_output(actual), expected)\n            }\n            (expected, actual) => panic!(\n                \"error/success mismatch. Expected:\\n {:?}\\nActual:\\n {:?}\",\n                &expected, actual\n            ),\n        }\n    }\n\n    #[derive(Deserialize)]\n    #[cfg(feature = \"test-util\")]\n    struct TestCase {\n        docs: String,\n        input: TestInput,\n        output: TestOutput,\n    }\n\n    #[derive(Deserialize)]\n    #[cfg(feature = \"test-util\")]\n    struct TestInput {\n        profiles: HashMap<String, HashMap<String, String>>,\n        selected_profile: String,\n        #[serde(default)]\n        sso_sessions: HashMap<String, HashMap<String, String>>,\n    }\n\n    #[cfg(feature = \"test-util\")]\n    fn to_test_output(profile_chain: ProfileChain<'_>) -> Vec<Provider> {\n        let mut output = vec![];\n        match profile_chain.base {\n            BaseProvider::NamedSource(name) => output.push(Provider::NamedSource(name.into())),\n            BaseProvider::AccessKey(creds) => output.push(Provider::AccessKey {\n                access_key_id: creds.access_key_id().into(),\n                secret_access_key: creds.secret_access_key().into(),\n                session_token: creds.session_token().map(|tok| tok.to_string()),\n                account_id: creds.account_id().map(|id| id.as_str().to_string()),\n            }),\n            BaseProvider::CredentialProcess {\n                command_with_sensitive_args,\n                account_id,\n            } => output.push(Provider::CredentialProcess {\n                command: command_with_sensitive_args.unredacted().into(),\n                account_id: account_id.map(|id| id.to_string()),\n            }),\n            BaseProvider::WebIdentityTokenRole {\n                role_arn,\n                web_identity_token_file,\n                session_name,\n            } => output.push(Provider::WebIdentityToken {\n                role_arn: role_arn.into(),\n                web_identity_token_file: web_identity_token_file.into(),\n                role_session_name: session_name.map(|sess| sess.to_string()),\n            }),\n            BaseProvider::Sso {\n                sso_region,\n                sso_start_url,\n                sso_session_name,\n                sso_account_id,\n                sso_role_name,\n            } => output.push(Provider::Sso {\n                sso_region: sso_region.into(),\n                sso_start_url: sso_start_url.into(),\n                sso_session: sso_session_name.map(|s| s.to_string()),\n                sso_account_id: sso_account_id.map(|s| s.to_string()),\n                sso_role_name: sso_role_name.map(|s| s.to_string()),\n            }),\n            BaseProvider::LoginSession { login_session_arn } => {\n                output.push(Provider::LoginSession {\n                    login_session_arn: login_session_arn.into(),\n                })\n            }\n        };\n        for role in profile_chain.chain {\n            output.push(Provider::AssumeRole {\n                role_arn: role.role_arn.into(),\n                external_id: role.external_id.map(ToString::to_string),\n                role_session_name: role.session_name.map(ToString::to_string),\n            })\n        }\n        output\n    }\n\n    #[derive(Deserialize, Debug, PartialEq, Eq)]\n    #[allow(dead_code)]\n    enum TestOutput {\n        ProfileChain(Vec<Provider>),\n        Error(String),\n    }\n\n    #[derive(Deserialize, Debug, Eq, PartialEq)]\n    #[allow(dead_code)]\n    enum Provider {\n        AssumeRole {\n            role_arn: String,\n            external_id: Option<String>,\n            role_session_name: Option<String>,\n        },\n        AccessKey {\n            access_key_id: String,\n            secret_access_key: String,\n            session_token: Option<String>,\n            account_id: Option<String>,\n        },\n        NamedSource(String),\n        CredentialProcess {\n            command: String,\n            account_id: Option<String>,\n        },\n        WebIdentityToken {\n            role_arn: String,\n            web_identity_token_file: String,\n            role_session_name: Option<String>,\n        },\n        Sso {\n            sso_region: String,\n            sso_start_url: String,\n            sso_session: Option<String>,\n\n            sso_account_id: Option<String>,\n            sso_role_name: Option<String>,\n        },\n        LoginSession {\n            login_session_arn: String,\n        },\n    }\n\n    #[test]\n    fn base_provider_process_credentials_args_redaction() {\n        assert_eq!(\n            r#\"CredentialProcess { command_with_sensitive_args: \"program\", account_id: None }\"#,\n            format!(\n                \"{:?}\",\n                BaseProvider::CredentialProcess {\n                    command_with_sensitive_args: CommandWithSensitiveArgs::new(\"program\"),\n                    account_id: None,\n                }\n            )\n        );\n        assert_eq!(\n            r#\"CredentialProcess { command_with_sensitive_args: \"program ** arguments redacted **\", account_id: None }\"#,\n            format!(\n                \"{:?}\",\n                BaseProvider::CredentialProcess {\n                    command_with_sensitive_args: CommandWithSensitiveArgs::new(\"program arg1 arg2\"),\n                    account_id: None\n                }\n            )\n        );\n        assert_eq!(\n            r#\"CredentialProcess { command_with_sensitive_args: \"program ** arguments redacted **\", account_id: None }\"#,\n            format!(\n                \"{:?}\",\n                BaseProvider::CredentialProcess {\n                    command_with_sensitive_args: CommandWithSensitiveArgs::new(\n                        \"program\\targ1 arg2\"\n                    ),\n                    account_id: None\n                }\n            )\n        );\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/src/profile/credentials.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Profile File Based Credential Providers\n//!\n//! Profile file based providers combine two pieces:\n//!\n//! 1. Parsing and resolution of the assume role chain\n//! 2. A user-modifiable hashmap of provider name to provider.\n//!\n//! Profile file based providers first determine the chain of providers that will be used to load\n//! credentials. After determining and validating this chain, a `Vec` of providers will be created.\n//!\n//! Each subsequent provider will provide boostrap providers to the next provider in order to load\n//! the final credentials.\n//!\n//! This module contains two sub modules:\n//! - `repr` which contains an abstract representation of a provider chain and the logic to\n//!   build it from `~/.aws/credentials` and `~/.aws/config`.\n//! - `exec` which contains a chain representation of providers to implement passing bootstrapped credentials\n//!   through a series of providers.\n\nuse crate::profile::cell::ErrorTakingOnceCell;\n#[allow(deprecated)]\nuse crate::profile::profile_file::ProfileFiles;\nuse crate::profile::Profile;\nuse crate::profile::ProfileFileLoadError;\nuse crate::provider_config::ProviderConfig;\nuse aws_credential_types::credential_feature::AwsCredentialFeature;\nuse aws_credential_types::{\n    provider::{self, error::CredentialsError, future, ProvideCredentials},\n    Credentials,\n};\nuse aws_smithy_types::error::display::DisplayErrorContext;\nuse std::borrow::Cow;\nuse std::collections::HashMap;\nuse std::error::Error;\nuse std::fmt::{Display, Formatter};\nuse std::sync::Arc;\nuse tracing::Instrument;\n\nmod exec;\npub(crate) mod repr;\n\n/// AWS Profile based credentials provider\n///\n/// This credentials provider will load credentials from `~/.aws/config` and `~/.aws/credentials`.\n/// The locations of these files are configurable via environment variables, see [below](#location-of-profile-files).\n///\n/// Generally, this will be constructed via the default provider chain, however, it can be manually\n/// constructed with the builder:\n/// ```rust,no_run\n/// use aws_config::profile::ProfileFileCredentialsProvider;\n/// let provider = ProfileFileCredentialsProvider::builder().build();\n/// ```\n///\n/// _Note: Profile providers, when called, will load and parse the profile from the file system\n/// only once. Parsed file contents will be cached indefinitely._\n///\n/// This provider supports several different credentials formats:\n/// ### Credentials defined explicitly within the file\n/// ```ini\n/// [default]\n/// aws_access_key_id = 123\n/// aws_secret_access_key = 456\n/// ```\n///\n/// ### Assume Role Credentials loaded from a credential source\n/// ```ini\n/// [default]\n/// role_arn = arn:aws:iam::123456789:role/RoleA\n/// credential_source = Environment\n/// ```\n///\n/// NOTE: Currently only the `Environment` credential source is supported although it is possible to\n/// provide custom sources:\n/// ```no_run\n/// use aws_credential_types::provider::{self, future, ProvideCredentials};\n/// use aws_config::profile::ProfileFileCredentialsProvider;\n/// #[derive(Debug)]\n/// struct MyCustomProvider;\n/// impl MyCustomProvider {\n///     async fn load_credentials(&self) -> provider::Result {\n///         todo!()\n///     }\n/// }\n///\n/// impl ProvideCredentials for MyCustomProvider {\n///   fn provide_credentials<'a>(&'a self) -> future::ProvideCredentials where Self: 'a {\n///         future::ProvideCredentials::new(self.load_credentials())\n///     }\n/// }\n/// # if cfg!(feature = \"default-https-client\") {\n/// let provider = ProfileFileCredentialsProvider::builder()\n///     .with_custom_provider(\"Custom\", MyCustomProvider)\n///     .build();\n/// }\n/// ```\n///\n/// ### Assume role credentials from a source profile\n/// ```ini\n/// [default]\n/// role_arn = arn:aws:iam::123456789:role/RoleA\n/// source_profile = base\n///\n/// [profile base]\n/// aws_access_key_id = 123\n/// aws_secret_access_key = 456\n/// ```\n///\n/// Other more complex configurations are possible, consult `test-data/assume-role-tests.json`.\n///\n/// ### Credentials loaded from an external process\n/// ```ini\n/// [default]\n/// credential_process = /opt/bin/awscreds-custom --username helen\n/// ```\n///\n/// An external process can be used to provide credentials.\n///\n/// ### Loading Credentials from SSO\n/// ```ini\n/// [default]\n/// sso_start_url = https://example.com/start\n/// sso_region = us-east-2\n/// sso_account_id = 123456789011\n/// sso_role_name = readOnly\n/// region = us-west-2\n/// ```\n///\n/// SSO can also be used as a source profile for assume role chains.\n///\n/// ### Credentials from a console session\n///\n/// An existing AWS Console session can be used to provide credentials.\n///\n/// ```ini\n/// [default]\n/// login_session = arn:aws:iam::0123456789012:user/Admin\n/// ```\n///\n#[doc = include_str!(\"location_of_profile_files.md\")]\n#[derive(Debug)]\npub struct ProfileFileCredentialsProvider {\n    config: Arc<Config>,\n    inner_provider: ErrorTakingOnceCell<ChainProvider, CredentialsError>,\n}\n\n#[derive(Debug)]\nstruct Config {\n    factory: exec::named::NamedProviderFactory,\n    provider_config: ProviderConfig,\n}\n\nimpl ProfileFileCredentialsProvider {\n    /// Builder for this credentials provider\n    pub fn builder() -> Builder {\n        Builder::default()\n    }\n\n    async fn load_credentials(&self) -> provider::Result {\n        // The inner provider needs to be cached across successive calls to load_credentials\n        // since the base providers can potentially have information cached in their instances.\n        // For example, the SsoCredentialsProvider maintains an in-memory expiring token cache.\n        let inner_provider = self\n            .inner_provider\n            .get_or_init(\n                {\n                    let config = self.config.clone();\n                    move || async move {\n                        match build_provider_chain(config.clone()).await {\n                            Ok(chain) => Ok(ChainProvider {\n                                config: config.clone(),\n                                chain: Some(Arc::new(chain)),\n                            }),\n                            Err(err) => match err {\n                                ProfileFileError::NoProfilesDefined\n                                | ProfileFileError::ProfileDidNotContainCredentials { .. } => {\n                                    Ok(ChainProvider {\n                                        config: config.clone(),\n                                        chain: None,\n                                    })\n                                }\n                                _ => Err(CredentialsError::invalid_configuration(format!(\n                                    \"ProfileFile provider could not be built: {}\",\n                                    &err\n                                ))),\n                            },\n                        }\n                    }\n                },\n                CredentialsError::unhandled(\n                    \"profile file credentials provider initialization error already taken\",\n                ),\n            )\n            .await?;\n        inner_provider.provide_credentials().await.map(|mut creds| {\n            creds\n                .get_property_mut_or_default::<Vec<AwsCredentialFeature>>()\n                .push(AwsCredentialFeature::CredentialsProfile);\n            creds\n        })\n    }\n}\n\nimpl ProvideCredentials for ProfileFileCredentialsProvider {\n    fn provide_credentials<'a>(&'a self) -> future::ProvideCredentials<'a>\n    where\n        Self: 'a,\n    {\n        future::ProvideCredentials::new(self.load_credentials())\n    }\n}\n\n/// An Error building a Credential source from an AWS Profile\n#[derive(Debug)]\n#[non_exhaustive]\npub enum ProfileFileError {\n    /// The profile was not a valid AWS profile\n    #[non_exhaustive]\n    InvalidProfile(ProfileFileLoadError),\n\n    /// No profiles existed (the profile was empty)\n    #[non_exhaustive]\n    NoProfilesDefined,\n\n    /// The profile did not contain any credential information\n    #[non_exhaustive]\n    ProfileDidNotContainCredentials {\n        /// The name of the profile\n        profile: String,\n    },\n\n    /// The profile contained an infinite loop of `source_profile` references\n    #[non_exhaustive]\n    CredentialLoop {\n        /// Vec of profiles leading to the loop\n        profiles: Vec<String>,\n        /// The next profile that caused the loop\n        next: String,\n    },\n\n    /// The profile was missing a credential source\n    #[non_exhaustive]\n    MissingCredentialSource {\n        /// The name of the profile\n        profile: String,\n        /// Error message\n        message: Cow<'static, str>,\n    },\n    /// The profile contained an invalid credential source\n    #[non_exhaustive]\n    InvalidCredentialSource {\n        /// The name of the profile\n        profile: String,\n        /// Error message\n        message: Cow<'static, str>,\n    },\n    /// The profile referred to a another profile by name that was not defined\n    #[non_exhaustive]\n    MissingProfile {\n        /// The name of the profile\n        profile: String,\n        /// Error message\n        message: Cow<'static, str>,\n    },\n    /// The profile referred to `credential_source` that was not defined\n    #[non_exhaustive]\n    UnknownProvider {\n        /// The name of the provider\n        name: String,\n    },\n\n    /// Feature not enabled\n    #[non_exhaustive]\n    FeatureNotEnabled {\n        /// The feature or comma delimited list of features that must be enabled\n        feature: Cow<'static, str>,\n        /// Additional information about the missing feature\n        message: Option<Cow<'static, str>>,\n    },\n\n    /// Missing sso-session section in config\n    #[non_exhaustive]\n    MissingSsoSession {\n        /// The name of the profile that specified `sso_session`\n        profile: String,\n        /// SSO session name\n        sso_session: String,\n    },\n\n    /// Invalid SSO configuration\n    #[non_exhaustive]\n    InvalidSsoConfig {\n        /// The name of the profile that the error originates in\n        profile: String,\n        /// Error message\n        message: Cow<'static, str>,\n    },\n\n    /// Profile is intended to be used in the token provider chain rather\n    /// than in the credentials chain.\n    #[non_exhaustive]\n    TokenProviderConfig {},\n}\n\nimpl ProfileFileError {\n    fn missing_field(profile: &Profile, field: &'static str) -> Self {\n        ProfileFileError::MissingProfile {\n            profile: profile.name().to_string(),\n            message: format!(\"`{field}` was missing\").into(),\n        }\n    }\n}\n\nimpl Error for ProfileFileError {\n    fn source(&self) -> Option<&(dyn Error + 'static)> {\n        match self {\n            ProfileFileError::InvalidProfile(err) => Some(err),\n            _ => None,\n        }\n    }\n}\n\nimpl Display for ProfileFileError {\n    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {\n        match self {\n            ProfileFileError::InvalidProfile(err) => {\n                write!(f, \"invalid profile: {err}\")\n            }\n            ProfileFileError::CredentialLoop { profiles, next } => write!(\n                f,\n                \"profile formed an infinite loop. first we loaded {profiles:?}, \\\n            then attempted to reload {next}\",\n            ),\n            ProfileFileError::MissingCredentialSource { profile, message } => {\n                write!(f, \"missing credential source in `{profile}`: {message}\")\n            }\n            ProfileFileError::InvalidCredentialSource { profile, message } => {\n                write!(f, \"invalid credential source in `{profile}`: {message}\")\n            }\n            ProfileFileError::MissingProfile { profile, message } => {\n                write!(f, \"profile `{profile}` was not defined: {message}\")\n            }\n            ProfileFileError::UnknownProvider { name } => write!(\n                f,\n                \"profile referenced `{name}` provider but that provider is not supported\",\n            ),\n            ProfileFileError::NoProfilesDefined => write!(f, \"No profiles were defined\"),\n            ProfileFileError::ProfileDidNotContainCredentials { profile } => write!(\n                f,\n                \"profile `{profile}` did not contain credential information\"\n            ),\n            ProfileFileError::FeatureNotEnabled { feature, message } => {\n                let message = message.as_deref().unwrap_or_default();\n                write!(\n                    f,\n                    \"This behavior requires following cargo feature(s) enabled: {feature}. {message}\",\n                )\n            }\n            ProfileFileError::MissingSsoSession {\n                profile,\n                sso_session,\n            } => {\n                write!(f, \"sso-session named `{sso_session}` (referenced by profile `{profile}`) was not found\")\n            }\n            ProfileFileError::InvalidSsoConfig { profile, message } => {\n                write!(f, \"profile `{profile}` has invalid SSO config: {message}\")\n            }\n            ProfileFileError::TokenProviderConfig { .. } => {\n                write!(\n                    f,\n                    \"selected profile will resolve an access token instead of credentials \\\n                     since it doesn't have `sso_account_id` and `sso_role_name` set. Specify both \\\n                     `sso_account_id` and `sso_role_name` to let this profile resolve credentials.\"\n                )\n            }\n        }\n    }\n}\n\n/// Builder for [`ProfileFileCredentialsProvider`]\n#[derive(Debug, Default)]\npub struct Builder {\n    provider_config: Option<ProviderConfig>,\n    profile_override: Option<String>,\n    #[allow(deprecated)]\n    profile_files: Option<ProfileFiles>,\n    custom_providers: HashMap<Cow<'static, str>, Arc<dyn ProvideCredentials>>,\n}\n\nimpl Builder {\n    /// Override the configuration for the [`ProfileFileCredentialsProvider`]\n    ///\n    /// # Examples\n    ///\n    /// ```no_run\n    /// # async fn test() {\n    /// use aws_config::profile::ProfileFileCredentialsProvider;\n    /// use aws_config::provider_config::ProviderConfig;\n    /// let provider = ProfileFileCredentialsProvider::builder()\n    ///     .configure(&ProviderConfig::with_default_region().await)\n    ///     .build();\n    /// # }\n    /// ```\n    pub fn configure(mut self, provider_config: &ProviderConfig) -> Self {\n        self.provider_config = Some(provider_config.clone());\n        self\n    }\n\n    /// Adds a custom credential source\n    ///\n    /// # Examples\n    ///\n    /// ```no_run\n    /// use aws_credential_types::provider::{self, future, ProvideCredentials};\n    /// use aws_config::profile::ProfileFileCredentialsProvider;\n    /// #[derive(Debug)]\n    /// struct MyCustomProvider;\n    /// impl MyCustomProvider {\n    ///     async fn load_credentials(&self) -> provider::Result {\n    ///         todo!()\n    ///     }\n    /// }\n    ///\n    /// impl ProvideCredentials for MyCustomProvider {\n    ///   fn provide_credentials<'a>(&'a self) -> future::ProvideCredentials where Self: 'a {\n    ///         future::ProvideCredentials::new(self.load_credentials())\n    ///     }\n    /// }\n    ///\n    /// # if cfg!(feature = \"rustls\") {\n    /// let provider = ProfileFileCredentialsProvider::builder()\n    ///     .with_custom_provider(\"Custom\", MyCustomProvider)\n    ///     .build();\n    /// # }\n    /// ```\n    pub fn with_custom_provider(\n        mut self,\n        name: impl Into<Cow<'static, str>>,\n        provider: impl ProvideCredentials + 'static,\n    ) -> Self {\n        self.custom_providers\n            .insert(name.into(), Arc::new(provider));\n        self\n    }\n\n    /// Override the profile name used by the [`ProfileFileCredentialsProvider`]\n    pub fn profile_name(mut self, profile_name: impl Into<String>) -> Self {\n        self.profile_override = Some(profile_name.into());\n        self\n    }\n\n    /// Set the profile file that should be used by the [`ProfileFileCredentialsProvider`]\n    #[allow(deprecated)]\n    pub fn profile_files(mut self, profile_files: ProfileFiles) -> Self {\n        self.profile_files = Some(profile_files);\n        self\n    }\n\n    /// Builds a [`ProfileFileCredentialsProvider`]\n    pub fn build(self) -> ProfileFileCredentialsProvider {\n        let build_span = tracing::debug_span!(\"build_profile_file_credentials_provider\");\n        let _enter = build_span.enter();\n        let conf = self\n            .provider_config\n            .unwrap_or_default()\n            .with_profile_config(self.profile_files, self.profile_override);\n        let mut named_providers = self.custom_providers.clone();\n        named_providers\n            .entry(\"Environment\".into())\n            .or_insert_with(|| {\n                Arc::new(crate::environment::credentials::EnvironmentVariableCredentialsProvider::new_with_env(\n                    conf.env(),\n                ))\n            });\n\n        named_providers\n            .entry(\"Ec2InstanceMetadata\".into())\n            .or_insert_with(|| {\n                Arc::new(\n                    crate::imds::credentials::ImdsCredentialsProvider::builder()\n                        .configure(&conf)\n                        .build(),\n                )\n            });\n\n        named_providers\n            .entry(\"EcsContainer\".into())\n            .or_insert_with(|| {\n                Arc::new(\n                    crate::ecs::EcsCredentialsProvider::builder()\n                        .configure(&conf)\n                        .build(),\n                )\n            });\n        let factory = exec::named::NamedProviderFactory::new(named_providers);\n\n        ProfileFileCredentialsProvider {\n            config: Arc::new(Config {\n                factory,\n                provider_config: conf,\n            }),\n            inner_provider: ErrorTakingOnceCell::new(),\n        }\n    }\n}\n\nasync fn build_provider_chain(\n    config: Arc<Config>,\n) -> Result<exec::ProviderChain, ProfileFileError> {\n    let profile_set = config\n        .provider_config\n        .try_profile()\n        .await\n        .map_err(|parse_err| ProfileFileError::InvalidProfile(parse_err.clone()))?;\n    let repr = repr::resolve_chain(profile_set)?;\n    tracing::info!(chain = ?repr, \"constructed abstract provider from config file\");\n    exec::ProviderChain::from_repr(&config.provider_config, repr, &config.factory)\n}\n\n#[derive(Debug)]\nstruct ChainProvider {\n    config: Arc<Config>,\n    chain: Option<Arc<exec::ProviderChain>>,\n}\n\nimpl ChainProvider {\n    async fn provide_credentials(&self) -> Result<Credentials, CredentialsError> {\n        // Can't borrow `self` across an await point, or else we lose `Send` on the returned future\n        let config = self.config.clone();\n        let chain = self.chain.clone();\n\n        if let Some(chain) = chain {\n            let mut creds = match chain\n                .base()\n                .provide_credentials()\n                .instrument(tracing::debug_span!(\"load_base_credentials\"))\n                .await\n            {\n                Ok(creds) => {\n                    tracing::info!(creds = ?creds, \"loaded base credentials\");\n                    creds\n                }\n                Err(e) => {\n                    tracing::warn!(error = %DisplayErrorContext(&e), \"failed to load base credentials\");\n                    return Err(CredentialsError::provider_error(e));\n                }\n            };\n\n            // we want to create `SdkConfig` _after_ we have resolved the profile or else\n            // we won't get things like `service_config()` set appropriately.\n            let sdk_config = config.provider_config.client_config();\n            for provider in chain.chain().iter() {\n                let next_creds = provider\n                    .credentials(creds, &sdk_config)\n                    .instrument(tracing::debug_span!(\"load_assume_role\", provider = ?provider))\n                    .await;\n                match next_creds {\n                    Ok(next_creds) => {\n                        tracing::info!(creds = ?next_creds, \"loaded assume role credentials\");\n                        creds = next_creds\n                    }\n                    Err(e) => {\n                        tracing::warn!(provider = ?provider, \"failed to load assume role credentials\");\n                        return Err(CredentialsError::provider_error(e));\n                    }\n                }\n            }\n            Ok(creds)\n        } else {\n            Err(CredentialsError::not_loaded_no_source())\n        }\n    }\n}\n\n#[cfg(test)]\nmod test {\n    use crate::profile::credentials::Builder;\n    use aws_credential_types::provider::ProvideCredentials;\n\n    macro_rules! make_test {\n        ($name: ident) => {\n            #[tokio::test]\n            async fn $name() {\n                let _ = crate::test_case::TestEnvironment::from_dir(\n                    concat!(\"./test-data/profile-provider/\", stringify!($name)),\n                    crate::test_case::test_credentials_provider(|config| async move {\n                        Builder::default()\n                            .configure(&config)\n                            .build()\n                            .provide_credentials()\n                            .await\n                    }),\n                )\n                .await\n                .unwrap()\n                .execute()\n                .await;\n            }\n        };\n    }\n\n    make_test!(e2e_assume_role);\n    make_test!(e2e_fips_and_dual_stack_sts);\n    make_test!(empty_config);\n    make_test!(retry_on_error);\n    make_test!(invalid_config);\n    make_test!(region_override);\n    // TODO(https://github.com/awslabs/aws-sdk-rust/issues/1117) This test is disabled on Windows because it uses Unix-style paths\n    #[cfg(all(feature = \"credentials-process\", not(windows)))]\n    make_test!(credential_process);\n    // TODO(https://github.com/awslabs/aws-sdk-rust/issues/1117) This test is disabled on Windows because it uses Unix-style paths\n    #[cfg(all(feature = \"credentials-process\", not(windows)))]\n    make_test!(credential_process_failure);\n    // TODO(https://github.com/awslabs/aws-sdk-rust/issues/1117) This test is disabled on Windows because it uses Unix-style paths\n    #[cfg(all(feature = \"credentials-process\", not(windows)))]\n    make_test!(credential_process_account_id_fallback);\n    #[cfg(feature = \"credentials-process\")]\n    make_test!(credential_process_invalid);\n    #[cfg(feature = \"sso\")]\n    make_test!(sso_credentials);\n    #[cfg(feature = \"sso\")]\n    make_test!(invalid_sso_credentials_config);\n    #[cfg(feature = \"sso\")]\n    make_test!(sso_override_global_env_url);\n    #[cfg(feature = \"sso\")]\n    make_test!(sso_token);\n\n    make_test!(assume_role_override_global_env_url);\n    make_test!(assume_role_override_service_env_url);\n    make_test!(assume_role_override_global_profile_url);\n    make_test!(assume_role_override_service_profile_url);\n}\n\n#[cfg(all(test, feature = \"sso\"))]\nmod sso_tests {\n    use crate::{profile::credentials::Builder, provider_config::ProviderConfig};\n    use aws_credential_types::credential_feature::AwsCredentialFeature;\n    use aws_credential_types::provider::ProvideCredentials;\n    use aws_sdk_sso::config::RuntimeComponents;\n    use aws_smithy_runtime_api::client::{\n        http::{\n            HttpClient, HttpConnector, HttpConnectorFuture, HttpConnectorSettings,\n            SharedHttpConnector,\n        },\n        orchestrator::{HttpRequest, HttpResponse},\n    };\n    use aws_smithy_types::body::SdkBody;\n    use aws_types::os_shim_internal::{Env, Fs};\n    use std::collections::HashMap;\n\n    #[derive(Debug)]\n    struct ClientInner {\n        expected_token: &'static str,\n    }\n    impl HttpConnector for ClientInner {\n        fn call(&self, request: HttpRequest) -> HttpConnectorFuture {\n            assert_eq!(\n                self.expected_token,\n                request.headers().get(\"x-amz-sso_bearer_token\").unwrap()\n            );\n            HttpConnectorFuture::ready(Ok(HttpResponse::new(\n                    200.try_into().unwrap(),\n                    SdkBody::from(\"{\\\"roleCredentials\\\":{\\\"accessKeyId\\\":\\\"ASIARTESTID\\\",\\\"secretAccessKey\\\":\\\"TESTSECRETKEY\\\",\\\"sessionToken\\\":\\\"TESTSESSIONTOKEN\\\",\\\"expiration\\\": 1651516560000}}\"),\n                )))\n        }\n    }\n    #[derive(Debug)]\n    struct Client {\n        inner: SharedHttpConnector,\n    }\n    impl Client {\n        fn new(expected_token: &'static str) -> Self {\n            Self {\n                inner: SharedHttpConnector::new(ClientInner { expected_token }),\n            }\n        }\n    }\n    impl HttpClient for Client {\n        fn http_connector(\n            &self,\n            _settings: &HttpConnectorSettings,\n            _components: &RuntimeComponents,\n        ) -> SharedHttpConnector {\n            self.inner.clone()\n        }\n    }\n\n    fn create_test_fs() -> Fs {\n        Fs::from_map({\n            let mut map = HashMap::new();\n            map.insert(\n                \"/home/.aws/config\".to_string(),\n                br#\"\n[profile default]\nsso_session = dev\nsso_account_id = 012345678901\nsso_role_name = SampleRole\nregion = us-east-1\n\n[sso-session dev]\nsso_region = us-east-1\nsso_start_url = https://d-abc123.awsapps.com/start\n                \"#\n                .to_vec(),\n            );\n            map.insert(\n                \"/home/.aws/sso/cache/34c6fceca75e456f25e7e99531e2425c6c1de443.json\".to_string(),\n                br#\"\n                {\n                    \"accessToken\": \"secret-access-token\",\n                    \"expiresAt\": \"2199-11-14T04:05:45Z\",\n                    \"refreshToken\": \"secret-refresh-token\",\n                    \"clientId\": \"ABCDEFG323242423121312312312312312\",\n                    \"clientSecret\": \"ABCDE123\",\n                    \"registrationExpiresAt\": \"2199-03-06T19:53:17Z\",\n                    \"region\": \"us-east-1\",\n                    \"startUrl\": \"https://d-abc123.awsapps.com/start\"\n                }\n                \"#\n                .to_vec(),\n            );\n            map\n        })\n    }\n\n    // TODO(https://github.com/awslabs/aws-sdk-rust/issues/1117) This test is ignored on Windows because it uses Unix-style paths\n    #[cfg_attr(windows, ignore)]\n    // In order to preserve the SSO token cache, the inner provider must only\n    // be created once, rather than once per credential resolution.\n    #[tokio::test]\n    async fn create_inner_provider_exactly_once() {\n        let fs = create_test_fs();\n\n        let provider_config = ProviderConfig::empty()\n            .with_fs(fs.clone())\n            .with_env(Env::from_slice(&[(\"HOME\", \"/home\")]))\n            .with_http_client(Client::new(\"secret-access-token\"));\n        let provider = Builder::default().configure(&provider_config).build();\n\n        let first_creds = provider.provide_credentials().await.unwrap();\n\n        // Write to the token cache with an access token that won't match the fake client's\n        // expected access token, and thus, won't return SSO credentials.\n        fs.write(\n            \"/home/.aws/sso/cache/34c6fceca75e456f25e7e99531e2425c6c1de443.json\",\n            r#\"\n            {\n                \"accessToken\": \"NEW!!secret-access-token\",\n                \"expiresAt\": \"2199-11-14T04:05:45Z\",\n                \"refreshToken\": \"secret-refresh-token\",\n                \"clientId\": \"ABCDEFG323242423121312312312312312\",\n                \"clientSecret\": \"ABCDE123\",\n                \"registrationExpiresAt\": \"2199-03-06T19:53:17Z\",\n                \"region\": \"us-east-1\",\n                \"startUrl\": \"https://d-abc123.awsapps.com/start\"\n            }\n            \"#,\n        )\n        .await\n        .unwrap();\n\n        // Loading credentials will still work since the SSOTokenProvider should have only\n        // been created once, and thus, the correct token is still in an in-memory cache.\n        let second_creds = provider\n            .provide_credentials()\n            .await\n            .expect(\"used cached token instead of loading from the file system\");\n        assert_eq!(first_creds, second_creds);\n\n        // Now create a new provider, which should use the new cached token value from the file system\n        // since it won't have the in-memory cache. We do this just to verify that the FS mutation above\n        // actually worked correctly.\n        let provider_config = ProviderConfig::empty()\n            .with_fs(fs.clone())\n            .with_env(Env::from_slice(&[(\"HOME\", \"/home\")]))\n            .with_http_client(Client::new(\"NEW!!secret-access-token\"));\n        let provider = Builder::default().configure(&provider_config).build();\n        let third_creds = provider.provide_credentials().await.unwrap();\n        assert_eq!(second_creds, third_creds);\n    }\n\n    #[cfg_attr(windows, ignore)]\n    #[tokio::test]\n    async fn credential_feature() {\n        let fs = create_test_fs();\n\n        let provider_config = ProviderConfig::empty()\n            .with_fs(fs.clone())\n            .with_env(Env::from_slice(&[(\"HOME\", \"/home\")]))\n            .with_http_client(Client::new(\"secret-access-token\"));\n        let provider = Builder::default().configure(&provider_config).build();\n\n        let creds = provider.provide_credentials().await.unwrap();\n\n        assert_eq!(\n            &vec![\n                AwsCredentialFeature::CredentialsSso,\n                AwsCredentialFeature::CredentialsProfile\n            ],\n            creds.get_property::<Vec<AwsCredentialFeature>>().unwrap()\n        )\n    }\n}\n\n#[cfg(all(test, feature = \"credentials-login\"))]\nmod login_tests {\n    use crate::provider_config::ProviderConfig;\n    use aws_credential_types::provider::error::CredentialsError;\n    use aws_credential_types::provider::ProvideCredentials;\n    use aws_sdk_signin::config::RuntimeComponents;\n    use aws_smithy_runtime_api::client::{\n        http::{\n            HttpClient, HttpConnector, HttpConnectorFuture, HttpConnectorSettings,\n            SharedHttpConnector,\n        },\n        orchestrator::{HttpRequest, HttpResponse},\n    };\n    use aws_smithy_types::body::SdkBody;\n    use aws_types::os_shim_internal::{Env, Fs};\n    use std::collections::HashMap;\n    use std::sync::atomic::{AtomicUsize, Ordering};\n    use std::sync::Arc;\n\n    #[derive(Debug, Clone)]\n    struct TestClientInner {\n        call_count: Arc<AtomicUsize>,\n        response: Option<&'static str>,\n    }\n\n    impl HttpConnector for TestClientInner {\n        fn call(&self, _request: HttpRequest) -> HttpConnectorFuture {\n            self.call_count.fetch_add(1, Ordering::SeqCst);\n            if let Some(response) = self.response {\n                HttpConnectorFuture::ready(Ok(HttpResponse::new(\n                    200.try_into().unwrap(),\n                    SdkBody::from(response),\n                )))\n            } else {\n                HttpConnectorFuture::ready(Ok(HttpResponse::new(\n                    500.try_into().unwrap(),\n                    SdkBody::from(\"{\\\"error\\\":\\\"server_error\\\"}\"),\n                )))\n            }\n        }\n    }\n\n    #[derive(Debug, Clone)]\n    struct TestClient {\n        inner: SharedHttpConnector,\n        call_count: Arc<AtomicUsize>,\n    }\n\n    impl TestClient {\n        fn new_success() -> Self {\n            let call_count = Arc::new(AtomicUsize::new(0));\n            let response = r#\"{\n                \"accessToken\": {\n                    \"accessKeyId\": \"ASIARTESTID\",\n                    \"secretAccessKey\": \"TESTSECRETKEY\",\n                    \"sessionToken\": \"TESTSESSIONTOKEN\"\n                },\n                \"expiresIn\": 3600,\n                \"refreshToken\": \"new-refresh-token\"\n            }\"#;\n            let inner = TestClientInner {\n                call_count: call_count.clone(),\n                response: Some(response),\n            };\n            Self {\n                inner: SharedHttpConnector::new(inner),\n                call_count,\n            }\n        }\n\n        fn new_error() -> Self {\n            let call_count = Arc::new(AtomicUsize::new(0));\n            let inner = TestClientInner {\n                call_count: call_count.clone(),\n                response: None,\n            };\n            Self {\n                inner: SharedHttpConnector::new(inner),\n                call_count,\n            }\n        }\n\n        fn call_count(&self) -> usize {\n            self.call_count.load(Ordering::SeqCst)\n        }\n    }\n\n    impl HttpClient for TestClient {\n        fn http_connector(\n            &self,\n            _settings: &HttpConnectorSettings,\n            _components: &RuntimeComponents,\n        ) -> SharedHttpConnector {\n            self.inner.clone()\n        }\n    }\n\n    fn create_test_fs_unexpired() -> Fs {\n        Fs::from_map({\n            let mut map = HashMap::new();\n            map.insert(\n                \"/home/.aws/config\".to_string(),\n                br#\"\n[profile default]\nlogin_session = arn:aws:iam::0123456789012:user/Admin\nregion = us-east-1\n                \"#\n                .to_vec(),\n            );\n            map.insert(\n                \"/home/.aws/login/cache/36db1d138ff460920374e4c3d8e01f53f9f73537e89c88d639f68393df0e2726.json\".to_string(),\n                br#\"{\n                    \"accessToken\": {\n                        \"accessKeyId\": \"AKIAIOSFODNN7EXAMPLE\",\n                        \"secretAccessKey\": \"wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY\",\n                        \"sessionToken\": \"session-token\",\n                        \"accountId\": \"012345678901\",\n                        \"expiresAt\": \"2199-12-25T21:30:00Z\"\n                    },\n                    \"tokenType\": \"aws_sigv4\",\n                    \"refreshToken\": \"refresh-token-value\",\n                    \"identityToken\": \"identity-token-value\",\n                    \"clientId\": \"aws:signin:::cli/same-device\",\n                    \"dpopKey\": \"-----BEGIN EC PRIVATE KEY-----\\nMHcCAQEEIFDZHUzOG1Pzq+6F0mjMlOSp1syN9LRPBuHMoCFXTcXhoAoGCCqGSM49\\nAwEHoUQDQgAE9qhj+KtcdHj1kVgwxWWWw++tqoh7H7UHs7oXh8jBbgF47rrYGC+t\\ndjiIaHK3dBvvdE7MGj5HsepzLm3Kj91bqA==\\n-----END EC PRIVATE KEY-----\\n\"\n                }\"#\n                .to_vec(),\n            );\n            map\n        })\n    }\n\n    fn create_test_fs_expired() -> Fs {\n        Fs::from_map({\n            let mut map = HashMap::new();\n            map.insert(\n                \"/home/.aws/config\".to_string(),\n                br#\"\n[profile default]\nlogin_session = arn:aws:iam::0123456789012:user/Admin\nregion = us-east-1\n                \"#\n                .to_vec(),\n            );\n            map.insert(\n                \"/home/.aws/login/cache/36db1d138ff460920374e4c3d8e01f53f9f73537e89c88d639f68393df0e2726.json\".to_string(),\n                br#\"{\n                    \"accessToken\": {\n                        \"accessKeyId\": \"AKIAIOSFODNN7EXAMPLE\",\n                        \"secretAccessKey\": \"wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY\",\n                        \"sessionToken\": \"session-token\",\n                        \"accountId\": \"012345678901\",\n                        \"expiresAt\": \"2020-01-01T00:00:00Z\"\n                    },\n                    \"tokenType\": \"aws_sigv4\",\n                    \"refreshToken\": \"refresh-token-value\",\n                    \"identityToken\": \"identity-token-value\",\n                    \"clientId\": \"aws:signin:::cli/same-device\",\n                    \"dpopKey\": \"-----BEGIN EC PRIVATE KEY-----\\nMHcCAQEEIFDZHUzOG1Pzq+6F0mjMlOSp1syN9LRPBuHMoCFXTcXhoAoGCCqGSM49\\nAwEHoUQDQgAE9qhj+KtcdHj1kVgwxWWWw++tqoh7H7UHs7oXh8jBbgF47rrYGC+t\\ndjiIaHK3dBvvdE7MGj5HsepzLm3Kj91bqA==\\n-----END EC PRIVATE KEY-----\\n\"\n                }\"#\n                .to_vec(),\n            );\n            map\n        })\n    }\n\n    #[cfg_attr(windows, ignore)]\n    #[tokio::test]\n    async fn unexpired_credentials_no_refresh() {\n        let client = TestClient::new_success();\n\n        let provider_config = ProviderConfig::empty()\n            .with_fs(create_test_fs_unexpired())\n            .with_env(Env::from_slice(&[(\"HOME\", \"/home\")]))\n            .with_http_client(client.clone())\n            .with_region(Some(aws_types::region::Region::new(\"us-east-1\")));\n\n        let provider = crate::profile::credentials::Builder::default()\n            .configure(&provider_config)\n            .build();\n\n        let creds = provider.provide_credentials().await.unwrap();\n        assert_eq!(\"AKIAIOSFODNN7EXAMPLE\", creds.access_key_id());\n        assert_eq!(0, client.call_count());\n    }\n\n    #[cfg_attr(windows, ignore)]\n    #[tokio::test]\n    async fn expired_credentials_trigger_refresh() {\n        let client = TestClient::new_success();\n\n        let provider_config = ProviderConfig::empty()\n            .with_fs(create_test_fs_expired())\n            .with_env(Env::from_slice(&[(\"HOME\", \"/home\")]))\n            .with_http_client(client.clone())\n            .with_region(Some(aws_types::region::Region::new(\"us-east-1\")));\n\n        let provider = crate::profile::credentials::Builder::default()\n            .configure(&provider_config)\n            .build();\n\n        let creds = provider.provide_credentials().await.unwrap();\n        assert_eq!(\"ASIARTESTID\", creds.access_key_id());\n        assert_eq!(1, client.call_count());\n    }\n\n    #[cfg_attr(windows, ignore)]\n    #[tokio::test]\n    async fn refresh_error_propagates() {\n        let client = TestClient::new_error();\n\n        let provider_config = ProviderConfig::empty()\n            .with_fs(create_test_fs_expired())\n            .with_env(Env::from_slice(&[(\"HOME\", \"/home\")]))\n            .with_http_client(client)\n            .with_region(Some(aws_types::region::Region::new(\"us-east-1\")));\n\n        let provider = crate::profile::credentials::Builder::default()\n            .configure(&provider_config)\n            .build();\n\n        let err = provider\n            .provide_credentials()\n            .await\n            .expect_err(\"should fail on refresh error\");\n\n        match &err {\n            CredentialsError::ProviderError(_) => {}\n            _ => panic!(\"wrong error type\"),\n        }\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/src/profile/location_of_profile_files.md",
    "content": "## Location of Profile Files\n* The location of the config file will be loaded from the `AWS_CONFIG_FILE` environment variable\nwith a fallback to `~/.aws/config`\n* The location of the credentials file will be loaded from the `AWS_SHARED_CREDENTIALS_FILE`\nenvironment variable with a fallback to `~/.aws/credentials`\n\nThe location of these files can also be customized programmatically using [`ProfileFiles`](crate::profile::profile_file::ProfileFiles).\n\n## Home directory resolution\nHome directory resolution is implemented to match the behavior of the CLI & Python. `~` is only\nused for home directory resolution when it:\n- Starts the path\n- Is followed immediately by `/` or a platform specific separator. (On windows, `~/` and `~\\` both\n  resolve to the home directory.\n\nWhen determining the home directory, the following environment variables are checked:\n- `HOME` on all platforms\n- `USERPROFILE` on Windows\n- The concatenation of `HOMEDRIVE` and `HOMEPATH` on Windows (`$HOMEDRIVE$HOMEPATH`)\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/src/profile/parser.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Code for parsing AWS profile config\n\nuse aws_runtime::env_config::file::EnvConfigFiles as ProfileFiles;\nuse aws_runtime::env_config::source;\nuse aws_types::os_shim_internal::{Env, Fs};\nuse std::borrow::Cow;\n\npub use aws_runtime::env_config::error::EnvConfigFileLoadError as ProfileFileLoadError;\npub use aws_runtime::env_config::parse::EnvConfigParseError as ProfileParseError;\npub use aws_runtime::env_config::property::Property;\npub use aws_runtime::env_config::section::{EnvConfigSections as ProfileSet, Profile};\n\n/// Read & parse AWS config files\n///\n/// Loads AWS config file from the filesystem, parses them, and converts them into a [`ProfileSet`](ProfileSet).\n///\n/// Although the basic behavior is straightforward, there are number of nuances to maintain backwards\n/// compatibility with other SDKs enumerated below.\n///\n#[doc = include_str!(\"location_of_profile_files.md\")]\n///\n/// ## Profile file syntax\n///\n/// Profile files have a form similar to `.ini` but with a several edge cases. These behaviors exist\n/// to match existing parser implementations, ensuring consistent behavior across AWS SDKs. These\n/// cases fully enumerated in `test-data/profile-parser-tests.json`.\n///\n/// ### The config file `~/.aws/config`\n/// ```ini\n/// # ~/.aws/config\n/// [profile default]\n/// key = value\n///\n/// # profiles must begin with `profile`\n/// [profile other]\n/// key = value2\n/// ```\n///\n/// ### The credentials file `~/.aws/credentials`\n/// The main difference is that in ~/.aws/credentials, profiles MUST NOT be prefixed with profile:\n/// ```ini\n/// [default]\n/// aws_access_key_id = 123\n///\n/// [other]\n/// aws_access_key_id = 456\n/// ```\npub async fn load(\n    fs: &Fs,\n    env: &Env,\n    profile_files: &ProfileFiles,\n    selected_profile_override: Option<Cow<'static, str>>,\n) -> Result<ProfileSet, ProfileFileLoadError> {\n    let mut source = source::load(env, fs, profile_files).await?;\n    if let Some(profile) = selected_profile_override {\n        source.profile = profile;\n    }\n\n    Ok(ProfileSet::parse(source)?)\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/src/profile/profile_file.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Re-exports for types since moved to the aws-runtime crate.\n\n/// Use aws_runtime::env_config::file::EnvConfigFiles instead.\n#[deprecated(\n    since = \"1.1.11\",\n    note = \"Use aws_runtime::env_config::file::EnvConfigFiles instead.\"\n)]\npub type ProfileFiles = aws_runtime::env_config::file::EnvConfigFiles;\n\n/// Use aws_runtime::env_config::file::Builder instead.\n#[deprecated(since = \"1.1.11\", note = \"Use aws_runtime::env_config::file::Builder.\")]\npub type Builder = aws_runtime::env_config::file::Builder;\n\n/// Use aws_runtime::env_config::file::EnvConfigFileKind instead.\n#[deprecated(\n    since = \"1.1.11\",\n    note = \"Use aws_runtime::env_config::file::EnvConfigFileKind.\"\n)]\npub type ProfileFileKind = aws_runtime::env_config::file::EnvConfigFileKind;\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/src/profile/region.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Load a region from an AWS profile\n\nuse crate::meta::region::{future, ProvideRegion};\n#[allow(deprecated)]\nuse crate::profile::profile_file::ProfileFiles;\nuse crate::profile::ProfileSet;\nuse crate::provider_config::ProviderConfig;\nuse aws_types::region::Region;\n\n/// Load a region from a profile file\n///\n/// This provider will attempt to load AWS shared configuration, then read the `region` property\n/// from the active profile.\n///\n#[doc = include_str!(\"location_of_profile_files.md\")]\n///\n/// # Examples\n///\n/// **Loads \"us-west-2\" as the region**\n/// ```ini\n/// [default]\n/// region = us-west-2\n/// ```\n///\n/// **Loads `us-east-1` as the region _if and only if_ the `AWS_PROFILE` environment variable is set\n/// to `other`.**\n///\n/// ```ini\n/// [profile other]\n/// region = us-east-1\n/// ```\n///\n/// This provider is part of the [default region provider chain](crate::default_provider::region).\n#[derive(Debug, Default)]\npub struct ProfileFileRegionProvider {\n    provider_config: ProviderConfig,\n}\n\n/// Builder for [ProfileFileRegionProvider]\n#[derive(Debug, Default)]\npub struct Builder {\n    config: Option<ProviderConfig>,\n    profile_override: Option<String>,\n    #[allow(deprecated)]\n    profile_files: Option<ProfileFiles>,\n}\n\nimpl Builder {\n    /// Override the configuration for this provider\n    pub fn configure(mut self, config: &ProviderConfig) -> Self {\n        self.config = Some(config.clone());\n        self\n    }\n\n    /// Override the profile name used by the [`ProfileFileRegionProvider`]\n    pub fn profile_name(mut self, profile_name: impl Into<String>) -> Self {\n        self.profile_override = Some(profile_name.into());\n        self\n    }\n\n    /// Set the profile file that should be used by the [`ProfileFileRegionProvider`]\n    #[allow(deprecated)]\n    pub fn profile_files(mut self, profile_files: ProfileFiles) -> Self {\n        self.profile_files = Some(profile_files);\n        self\n    }\n\n    /// Build a [ProfileFileRegionProvider] from this builder\n    pub fn build(self) -> ProfileFileRegionProvider {\n        let conf = self\n            .config\n            .unwrap_or_default()\n            .with_profile_config(self.profile_files, self.profile_override);\n        ProfileFileRegionProvider {\n            provider_config: conf,\n        }\n    }\n}\n\nimpl ProfileFileRegionProvider {\n    /// Create a new [ProfileFileRegionProvider]\n    ///\n    /// To override the selected profile, set the `AWS_PROFILE` environment variable or use the [`Builder`].\n    pub fn new() -> Self {\n        Self {\n            provider_config: ProviderConfig::default(),\n        }\n    }\n\n    /// [`Builder`] to construct a [`ProfileFileRegionProvider`]\n    pub fn builder() -> Builder {\n        Builder::default()\n    }\n\n    async fn region(&self) -> Option<Region> {\n        let profile_set = self.provider_config.profile().await?;\n\n        resolve_profile_chain_for_region(profile_set)\n    }\n}\n\nfn resolve_profile_chain_for_region(profile_set: &'_ ProfileSet) -> Option<Region> {\n    if profile_set.is_empty() {\n        return None;\n    }\n\n    let mut selected_profile = profile_set.selected_profile();\n    let mut visited_profiles = vec![];\n\n    loop {\n        let profile = profile_set.get_profile(selected_profile)?;\n        // Check to see if we're in a loop and return if that's true.\n        // Else, add the profile we're currently checking to our list of visited profiles.\n        if visited_profiles.contains(&selected_profile) {\n            return None;\n        } else {\n            visited_profiles.push(selected_profile);\n        }\n\n        // Attempt to get region and source_profile for current profile\n        let selected_profile_region = profile\n            .get(\"region\")\n            .map(|region| Region::new(region.to_owned()));\n        let source_profile = profile.get(\"source_profile\");\n\n        // Check to see what we got\n        match (selected_profile_region, source_profile) {\n            // Profile had a region specified, return it :D\n            (Some(region), _) => {\n                return Some(region);\n            }\n            // No region specified, source_profile is self-referential so we return to avoid infinite loop\n            (None, Some(source_profile)) if source_profile == selected_profile => {\n                return None;\n            }\n            // No region specified, no source_profile specified so we return empty-handed\n            (None, None) => {\n                return None;\n            }\n            // No region specified, check source profile for a region in next loop iteration\n            (None, Some(source_profile)) => {\n                selected_profile = source_profile;\n            }\n        }\n    }\n}\n\nimpl ProvideRegion for ProfileFileRegionProvider {\n    fn region(&self) -> future::ProvideRegion<'_> {\n        future::ProvideRegion::new(self.region())\n    }\n}\n\n#[cfg(test)]\nmod test {\n    use crate::profile::ProfileFileRegionProvider;\n    use crate::provider_config::ProviderConfig;\n    use crate::test_case::no_traffic_client;\n    use aws_types::os_shim_internal::{Env, Fs};\n    use aws_types::region::Region;\n    use futures_util::FutureExt;\n    use tracing_test::traced_test;\n\n    fn provider_config(dir_name: &str) -> ProviderConfig {\n        let fs = Fs::from_test_dir(format!(\"test-data/profile-provider/{}/fs\", dir_name), \"/\");\n        let env = Env::from_slice(&[(\"HOME\", \"/home\")]);\n        ProviderConfig::empty()\n            .with_fs(fs)\n            .with_env(env)\n            .with_http_client(no_traffic_client())\n    }\n\n    #[traced_test]\n    #[test]\n    fn load_region() {\n        let provider = ProfileFileRegionProvider::builder()\n            .configure(&provider_config(\"region_override\"))\n            .build();\n        assert_eq!(\n            provider.region().now_or_never().unwrap(),\n            Some(Region::from_static(\"us-east-1\"))\n        );\n    }\n\n    #[test]\n    fn load_region_env_profile_override() {\n        let conf = provider_config(\"region_override\").with_env(Env::from_slice(&[\n            (\"HOME\", \"/home\"),\n            (\"AWS_PROFILE\", \"base\"),\n        ]));\n        let provider = ProfileFileRegionProvider::builder()\n            .configure(&conf)\n            .build();\n        assert_eq!(\n            provider.region().now_or_never().unwrap(),\n            Some(Region::from_static(\"us-east-1\"))\n        );\n    }\n\n    #[test]\n    fn load_region_nonexistent_profile() {\n        let conf = provider_config(\"region_override\").with_env(Env::from_slice(&[\n            (\"HOME\", \"/home\"),\n            (\"AWS_PROFILE\", \"doesnotexist\"),\n        ]));\n        let provider = ProfileFileRegionProvider::builder()\n            .configure(&conf)\n            .build();\n        assert_eq!(provider.region().now_or_never().unwrap(), None);\n    }\n\n    #[test]\n    fn load_region_explicit_override() {\n        let conf = provider_config(\"region_override\");\n        let provider = ProfileFileRegionProvider::builder()\n            .configure(&conf)\n            .profile_name(\"base\")\n            .build();\n        assert_eq!(\n            provider.region().now_or_never().unwrap(),\n            Some(Region::from_static(\"us-east-1\"))\n        );\n    }\n\n    #[tokio::test]\n    async fn load_region_from_source_profile() {\n        let config = r#\"\n[profile credentials]\naws_access_key_id = test-access-key-id\naws_secret_access_key = test-secret-access-key\naws_session_token = test-session-token\nregion = us-east-1\n\n[profile needs-source]\nsource_profile = credentials\nrole_arn = arn:aws:iam::123456789012:role/test\n\"#\n        .trim();\n\n        let fs = Fs::from_slice(&[(\"test_config\", config)]);\n        let env = Env::from_slice(&[(\"AWS_CONFIG_FILE\", \"test_config\")]);\n        let provider_config = ProviderConfig::empty()\n            .with_fs(fs)\n            .with_env(env)\n            .with_http_client(no_traffic_client());\n\n        assert_eq!(\n            Some(Region::new(\"us-east-1\")),\n            ProfileFileRegionProvider::builder()\n                .profile_name(\"needs-source\")\n                .configure(&provider_config)\n                .build()\n                .region()\n                .await\n        );\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/src/profile/token.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Profile File Based Token Providers\n\nuse crate::profile::cell::ErrorTakingOnceCell;\n#[allow(deprecated)]\nuse crate::profile::profile_file::ProfileFiles;\nuse crate::profile::ProfileSet;\nuse crate::provider_config::ProviderConfig;\nuse crate::sso::SsoTokenProvider;\nuse aws_credential_types::provider::{\n    error::TokenError, future, token::ProvideToken, token::Result as TokenResult,\n};\nuse aws_types::{region::Region, SdkConfig};\n\nasync fn load_profile_set(provider_config: &ProviderConfig) -> Result<&ProfileSet, TokenError> {\n    provider_config\n        .try_profile()\n        .await\n        .map_err(|parse_err| TokenError::invalid_configuration(parse_err.clone()))\n}\n\nfn create_token_provider(\n    sdk_config: &SdkConfig,\n    provider_config: &ProviderConfig,\n    profile_set: &ProfileSet,\n) -> Result<SsoTokenProvider, TokenError> {\n    let repr = crate::profile::credentials::repr::resolve_chain(profile_set)\n        .map_err(TokenError::invalid_configuration)?;\n    match repr.base {\n        crate::profile::credentials::repr::BaseProvider::Sso {\n            sso_session_name,\n            sso_region,\n            sso_start_url,\n            ..\n        } => {\n            let mut builder = SsoTokenProvider::builder().configure(sdk_config);\n            builder.set_session_name(sso_session_name.map(|s| s.to_string()));\n            Ok(builder\n                .region(Region::new(sso_region.to_string()))\n                .start_url(sso_start_url)\n                .build_with(provider_config.env(), provider_config.fs()))\n        }\n        _ => Err(TokenError::not_loaded(\n            \"no sso-session configured in profile file\",\n        )),\n    }\n}\n\n/// AWS profile-based access token provider\n///\n/// This token provider loads SSO session config from `~/.aws/config`,\n/// and uses that config to resolve a cached SSO token from `~/.aws/sso/cache`.\n/// The AWS CLI can be used to establish the cached SSO token.\n///\n/// Generally, this provider is constructed via the default provider chain. However,\n/// it can also be manually constructed with the builder:\n/// ```rust,no_run\n/// use aws_config::profile::ProfileFileTokenProvider;\n/// let provider = ProfileFileTokenProvider::builder().build();\n/// ```\n/// _Note: this provider, when called, will load and parse the `~/.aws/config` file\n/// only once. Parsed file contents will be cached indefinitely._\n///\n/// This provider requires a profile with a `sso_session` configured. For example,\n/// ```ini\n/// [default]\n/// sso_session = example\n/// region = us-west-2\n///\n/// [sso-session example]\n/// sso_start_url = https://example.awsapps.com/start\n/// sso_region = us-west-2\n/// ```\n#[derive(Debug)]\npub struct ProfileFileTokenProvider {\n    sdk_config: SdkConfig,\n    provider_config: ProviderConfig,\n    inner_provider: ErrorTakingOnceCell<SsoTokenProvider, TokenError>,\n}\n\nimpl ProfileFileTokenProvider {\n    /// Builder for this token provider.\n    pub fn builder() -> Builder {\n        Builder::default()\n    }\n\n    async fn load_token(&self) -> TokenResult {\n        let inner_provider = self\n            .inner_provider\n            .get_or_init(\n                {\n                    let sdk_config = self.sdk_config.clone();\n                    let provider_config = self.provider_config.clone();\n                    move || async move {\n                        let profile_set = load_profile_set(&provider_config).await?;\n                        create_token_provider(&sdk_config, &provider_config, profile_set)\n                    }\n                },\n                TokenError::unhandled(\n                    \"profile file token provider initialization error already taken\",\n                ),\n            )\n            .await?;\n\n        inner_provider.provide_token().await\n    }\n}\n\nimpl ProvideToken for ProfileFileTokenProvider {\n    fn provide_token<'a>(&'a self) -> future::ProvideToken<'a>\n    where\n        Self: 'a,\n    {\n        future::ProvideToken::new(self.load_token())\n    }\n}\n\n/// Builder for [`ProfileFileTokenProvider`].\n#[derive(Debug, Default)]\npub struct Builder {\n    provider_config: Option<ProviderConfig>,\n    profile_override: Option<String>,\n    #[allow(deprecated)]\n    profile_files: Option<ProfileFiles>,\n}\n\nimpl Builder {\n    /// Override the configuration for the [`ProfileFileTokenProvider`]\n    pub(crate) fn configure(mut self, provider_config: &ProviderConfig) -> Self {\n        self.provider_config = Some(provider_config.clone());\n        self\n    }\n\n    /// Override the profile name used by the [`ProfileFileTokenProvider`]\n    pub fn profile_name(mut self, profile_name: impl Into<String>) -> Self {\n        self.profile_override = Some(profile_name.into());\n        self\n    }\n\n    /// Set the profile file that should be used by the [`ProfileFileTokenProvider`]\n    #[allow(deprecated)]\n    pub fn profile_files(mut self, profile_files: ProfileFiles) -> Self {\n        self.profile_files = Some(profile_files);\n        self\n    }\n\n    /// Builds a [`ProfileFileTokenProvider`]\n    pub fn build(self) -> ProfileFileTokenProvider {\n        let build_span = tracing::debug_span!(\"build_profile_token_provider\");\n        let _enter = build_span.enter();\n        let conf = self\n            .provider_config\n            .unwrap_or_default()\n            .with_profile_config(self.profile_files, self.profile_override);\n\n        ProfileFileTokenProvider {\n            sdk_config: conf.client_config(),\n            provider_config: conf,\n            inner_provider: ErrorTakingOnceCell::new(),\n        }\n    }\n}\n\n#[cfg(test)]\nmod test {\n    use aws_credential_types::provider::token::ProvideToken;\n\n    /// Test generation macro\n    ///\n    /// # Examples\n    /// **Run the test case in `test-data/default-token-provider-chain/test_name`\n    /// ```no_run\n    /// make_test!(test_name);\n    /// ```\n    ///\n    /// **Update (responses are replayed but new requests are recorded) the test case**:\n    /// ```no_run\n    /// make_test!(update: test_name)\n    /// ```\n    ///\n    /// **Run the test case against a real HTTPS connection:**\n    /// > Note: Be careful to remove sensitive information before committing. Always use a temporary\n    /// > AWS account when recording live traffic.\n    /// ```no_run\n    /// make_test!(live: test_name)\n    /// ```\n    macro_rules! make_test {\n        ($name:ident $(#[$m:meta])*) => {\n            make_test!($name, execute, $(#[$m])*);\n        };\n        (update: $name:ident) => {\n            make_test!($name, execute_and_update);\n        };\n        (live: $name:ident) => {\n            make_test!($name, execute_from_live_traffic);\n        };\n        ($name:ident, $func:ident, $(#[$m:meta])*) => {\n            make_test!($name, $func, std::convert::identity $(, #[$m])*);\n        };\n        ($name:ident, builder: $provider_config_builder:expr) => {\n            make_test!($name, execute, $provider_config_builder);\n        };\n        ($name:ident, $func:ident, $provider_config_builder:expr $(, #[$m:meta])*) => {\n            $(#[$m])*\n            #[tokio::test]\n            async fn $name() {\n                let _ = crate::test_case::TestEnvironment::from_dir(\n                    concat!(\n                        \"./test-data/default-token-provider-chain/\",\n                        stringify!($name)\n                    ),\n                    crate::test_case::test_token_provider(|config| {\n                        async move {\n                            crate::default_provider::token::Builder::default()\n                                .configure(config)\n                                .build()\n                                .await\n                                .provide_token()\n                                .await\n                        }\n                    }),\n                )\n                .await\n                .unwrap()\n                .map_provider_config($provider_config_builder)\n                .$func()\n                .await;\n            }\n        };\n    }\n\n    make_test!(profile_keys);\n    make_test!(profile_keys_case_insensitive);\n    make_test!(profile_name);\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/src/profile.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Load configuration from AWS Profiles\n//!\n//! AWS profiles are typically stored in `~/.aws/config` and `~/.aws/credentials`. For more details\n//! see the [`load`] function.\n\npub mod parser;\n\npub mod credentials;\npub mod profile_file;\npub mod region;\n\n#[cfg(feature = \"sso\")]\npub mod token;\n#[cfg(feature = \"sso\")]\n#[doc(inline)]\npub use token::ProfileFileTokenProvider;\n\n#[doc(inline)]\npub use aws_runtime::env_config::error::EnvConfigFileLoadError as ProfileFileLoadError;\n#[doc(inline)]\npub use aws_runtime::env_config::parse::EnvConfigParseError as ProfileParseError;\n#[doc(inline)]\npub use aws_runtime::env_config::property::Property;\n#[doc(inline)]\npub use aws_runtime::env_config::section::{EnvConfigSections as ProfileSet, Profile};\n#[doc(inline)]\npub use credentials::ProfileFileCredentialsProvider;\n#[doc(inline)]\npub use parser::load;\n#[doc(inline)]\npub use region::ProfileFileRegionProvider;\n\nmod cell {\n    use std::future::Future;\n    use std::sync::{Arc, Mutex};\n    use tokio::sync::OnceCell;\n\n    /// Once cell with a result where the error can be taken.\n    ///\n    /// The profile providers need to cache their inner provider value (specifically for SSO)\n    /// in order to preserve the SSO token cache. This wrapper around [`OnceCell`] allows\n    /// for initializing the inner provider once in a way that if it fails, the error can\n    /// be taken so that it doesn't need to implement `Clone`.\n    #[derive(Debug)]\n    pub(super) struct ErrorTakingOnceCell<T, E> {\n        cell: OnceCell<Result<Arc<T>, Mutex<E>>>,\n    }\n\n    impl<T, E> ErrorTakingOnceCell<T, E> {\n        pub(super) fn new() -> Self {\n            Self {\n                cell: OnceCell::new(),\n            }\n        }\n\n        pub(super) async fn get_or_init<F, Fut>(\n            &self,\n            init: F,\n            mut taken_error: E,\n        ) -> Result<Arc<T>, E>\n        where\n            F: FnOnce() -> Fut,\n            Fut: Future<Output = Result<T, E>>,\n        {\n            let init = || async move { (init)().await.map(Arc::new).map_err(Mutex::new) };\n            match self.cell.get_or_init(init).await {\n                Ok(value) => Ok(value.clone()),\n                Err(err) => {\n                    let mut locked = err.lock().unwrap();\n                    std::mem::swap(&mut *locked, &mut taken_error);\n                    Err(taken_error)\n                }\n            }\n        }\n    }\n\n    #[cfg(test)]\n    mod tests {\n        use crate::profile::cell::ErrorTakingOnceCell;\n        use std::sync::{\n            atomic::{AtomicUsize, Ordering},\n            Arc,\n        };\n\n        #[derive(Debug)]\n        enum Error {\n            InitError,\n            Taken,\n        }\n\n        #[tokio::test]\n        async fn taken_error() {\n            let cell = ErrorTakingOnceCell::new();\n            let calls = AtomicUsize::new(0);\n            let init = || async {\n                calls.fetch_add(1, Ordering::SeqCst);\n                Result::<String, _>::Err(Error::InitError)\n            };\n\n            let result = cell.get_or_init(init, Error::Taken).await;\n            assert!(matches!(result, Err(Error::InitError)));\n\n            let result = cell.get_or_init(init, Error::Taken).await;\n            assert!(matches!(result, Err(Error::Taken)));\n\n            let result = cell.get_or_init(init, Error::Taken).await;\n            assert!(matches!(result, Err(Error::Taken)));\n            assert_eq!(1, calls.load(Ordering::SeqCst));\n        }\n\n        #[tokio::test]\n        async fn value_initialized_once() {\n            let cell = ErrorTakingOnceCell::new();\n            let calls = AtomicUsize::new(0);\n            let init = || async {\n                calls.fetch_add(1, Ordering::SeqCst);\n                Result::<_, Error>::Ok(\"test\".to_string())\n            };\n\n            let original = cell.get_or_init(init, Error::Taken).await.unwrap();\n            let next = cell.get_or_init(init, Error::Taken).await.unwrap();\n            assert!(Arc::ptr_eq(&original, &next));\n            assert_eq!(1, calls.load(Ordering::SeqCst));\n        }\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/src/provider_config.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Configuration Options for Credential Providers\n\nuse crate::env_service_config::EnvServiceConfig;\nuse crate::profile;\n#[allow(deprecated)]\nuse crate::profile::profile_file::ProfileFiles;\nuse crate::profile::{ProfileFileLoadError, ProfileSet};\nuse aws_smithy_async::rt::sleep::{default_async_sleep, AsyncSleep, SharedAsyncSleep};\nuse aws_smithy_async::time::{SharedTimeSource, TimeSource};\nuse aws_smithy_runtime_api::client::http::HttpClient;\nuse aws_smithy_runtime_api::shared::IntoShared;\nuse aws_smithy_types::error::display::DisplayErrorContext;\nuse aws_smithy_types::retry::RetryConfig;\nuse aws_types::os_shim_internal::{Env, Fs};\nuse aws_types::region::Region;\nuse aws_types::sdk_config::SharedHttpClient;\nuse aws_types::SdkConfig;\nuse std::borrow::Cow;\nuse std::fmt::{Debug, Formatter};\nuse std::sync::Arc;\nuse tokio::sync::OnceCell;\n\n/// Configuration options for Credential Providers\n///\n/// Most credential providers builders offer a `configure` method which applies general provider configuration\n/// options.\n///\n/// To use a region from the default region provider chain use [`ProviderConfig::with_default_region`].\n/// Otherwise, use [`ProviderConfig::without_region`]. Note that some credentials providers require a region\n/// to be explicitly set.\n#[derive(Clone)]\npub struct ProviderConfig {\n    env: Env,\n    fs: Fs,\n    time_source: SharedTimeSource,\n    http_client: Option<SharedHttpClient>,\n    retry_config: Option<RetryConfig>,\n    sleep_impl: Option<SharedAsyncSleep>,\n    region: Option<Region>,\n    use_fips: Option<bool>,\n    use_dual_stack: Option<bool>,\n    /// An AWS profile created from `ProfileFiles` and a `profile_name`\n    parsed_profile: Arc<OnceCell<Result<ProfileSet, ProfileFileLoadError>>>,\n    /// A list of [std::path::Path]s to profile files\n    #[allow(deprecated)]\n    profile_files: ProfileFiles,\n    /// An override to use when constructing a `ProfileSet`\n    profile_name_override: Option<Cow<'static, str>>,\n}\n\nimpl Debug for ProviderConfig {\n    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {\n        f.debug_struct(\"ProviderConfig\")\n            .field(\"env\", &self.env)\n            .field(\"fs\", &self.fs)\n            .field(\"time_source\", &self.time_source)\n            .field(\"http_client\", &self.http_client)\n            .field(\"retry_config\", &self.retry_config)\n            .field(\"sleep_impl\", &self.sleep_impl)\n            .field(\"region\", &self.region)\n            .field(\"use_fips\", &self.use_fips)\n            .field(\"use_dual_stack\", &self.use_dual_stack)\n            .field(\"profile_name_override\", &self.profile_name_override)\n            .finish()\n    }\n}\n\nimpl Default for ProviderConfig {\n    fn default() -> Self {\n        Self {\n            env: Env::default(),\n            fs: Fs::default(),\n            time_source: SharedTimeSource::default(),\n            http_client: None,\n            retry_config: None,\n            sleep_impl: default_async_sleep(),\n            region: None,\n            use_fips: None,\n            use_dual_stack: None,\n            parsed_profile: Default::default(),\n            #[allow(deprecated)]\n            profile_files: ProfileFiles::default(),\n            profile_name_override: None,\n        }\n    }\n}\n\n#[cfg(test)]\nimpl ProviderConfig {\n    /// ProviderConfig with all configuration removed\n    ///\n    /// Unlike [`ProviderConfig::empty`] where `env` and `fs` will use their non-mocked implementations,\n    /// this method will use an empty mock environment and an empty mock file system.\n    pub fn no_configuration() -> Self {\n        use aws_smithy_async::time::StaticTimeSource;\n        use std::collections::HashMap;\n        use std::time::UNIX_EPOCH;\n        let fs = Fs::from_raw_map(HashMap::new());\n        let env = Env::from_slice(&[]);\n        Self {\n            parsed_profile: Default::default(),\n            #[allow(deprecated)]\n            profile_files: ProfileFiles::default(),\n            env,\n            fs,\n            time_source: SharedTimeSource::new(StaticTimeSource::new(UNIX_EPOCH)),\n            http_client: None,\n            retry_config: None,\n            sleep_impl: None,\n            region: None,\n            use_fips: None,\n            use_dual_stack: None,\n            profile_name_override: None,\n        }\n    }\n}\n\nimpl ProviderConfig {\n    /// Create a default provider config with the region unset.\n    ///\n    /// Using this option means that you may need to set a region manually.\n    ///\n    /// This constructor will use a default value for the HTTPS connector and Sleep implementation\n    /// when they are enabled as crate features which is usually the correct option. To construct\n    /// a `ProviderConfig` without these fields set, use [`ProviderConfig::empty`].\n    ///\n    ///\n    /// # Examples\n    /// ```no_run\n    /// # #[cfg(feature = \"default-https-client\")]\n    /// # fn example() {\n    /// use aws_config::provider_config::ProviderConfig;\n    /// use aws_sdk_sts::config::Region;\n    /// use aws_config::web_identity_token::WebIdentityTokenCredentialsProvider;\n    /// let conf = ProviderConfig::without_region().with_region(Some(Region::new(\"us-east-1\")));\n    ///\n    /// let credential_provider = WebIdentityTokenCredentialsProvider::builder().configure(&conf).build();\n    /// # }\n    /// ```\n    pub fn without_region() -> Self {\n        Self::default()\n    }\n\n    /// Constructs a ProviderConfig with no fields set\n    pub fn empty() -> Self {\n        ProviderConfig {\n            env: Env::default(),\n            fs: Fs::default(),\n            time_source: SharedTimeSource::default(),\n            http_client: None,\n            retry_config: None,\n            sleep_impl: None,\n            region: None,\n            use_fips: None,\n            use_dual_stack: None,\n            parsed_profile: Default::default(),\n            #[allow(deprecated)]\n            profile_files: ProfileFiles::default(),\n            profile_name_override: None,\n        }\n    }\n\n    /// Initializer for ConfigBag to avoid possibly setting incorrect defaults.\n    pub(crate) fn init(\n        time_source: SharedTimeSource,\n        sleep_impl: Option<SharedAsyncSleep>,\n    ) -> Self {\n        Self {\n            parsed_profile: Default::default(),\n            #[allow(deprecated)]\n            profile_files: ProfileFiles::default(),\n            env: Env::default(),\n            fs: Fs::default(),\n            time_source,\n            http_client: None,\n            retry_config: None,\n            sleep_impl,\n            region: None,\n            use_fips: None,\n            use_dual_stack: None,\n            profile_name_override: None,\n        }\n    }\n\n    /// Create a default provider config with the region region automatically loaded from the default chain.\n    ///\n    /// # Examples\n    /// ```no_run\n    /// # async fn test() {\n    /// use aws_config::provider_config::ProviderConfig;\n    /// use aws_sdk_sts::config::Region;\n    /// use aws_config::web_identity_token::WebIdentityTokenCredentialsProvider;\n    /// let conf = ProviderConfig::with_default_region().await;\n    /// let credential_provider = WebIdentityTokenCredentialsProvider::builder().configure(&conf).build();\n    /// }\n    /// ```\n    pub async fn with_default_region() -> Self {\n        Self::without_region().load_default_region().await\n    }\n\n    /// Attempt to get a representation of `SdkConfig` from this `ProviderConfig`.\n    ///\n    ///\n    /// **WARN**: Some options (e.g. `service_config`) can only be set if the profile has been\n    /// parsed already (e.g. by calling [`ProviderConfig::profile()`]). This is an\n    /// imperfect mapping and should be used sparingly.\n    pub(crate) fn client_config(&self) -> SdkConfig {\n        let profiles = self.parsed_profile.get().and_then(|v| v.as_ref().ok());\n        let service_config = EnvServiceConfig {\n            env: self.env(),\n            env_config_sections: profiles.cloned().unwrap_or_default(),\n        };\n\n        let mut builder = SdkConfig::builder()\n            .retry_config(\n                self.retry_config\n                    .as_ref()\n                    .map_or(RetryConfig::standard(), |config| config.clone()),\n            )\n            .region(self.region())\n            .time_source(self.time_source())\n            .use_fips(self.use_fips().unwrap_or_default())\n            .use_dual_stack(self.use_dual_stack().unwrap_or_default())\n            .service_config(service_config)\n            .behavior_version(crate::BehaviorVersion::latest());\n        builder.set_http_client(self.http_client.clone());\n        builder.set_sleep_impl(self.sleep_impl.clone());\n        builder.build()\n    }\n\n    // When all crate features are disabled, these accessors are unused\n\n    #[allow(dead_code)]\n    pub(crate) fn env(&self) -> Env {\n        self.env.clone()\n    }\n\n    #[allow(dead_code)]\n    pub(crate) fn fs(&self) -> Fs {\n        self.fs.clone()\n    }\n\n    #[allow(dead_code)]\n    pub(crate) fn time_source(&self) -> SharedTimeSource {\n        self.time_source.clone()\n    }\n\n    #[allow(dead_code)]\n    pub(crate) fn http_client(&self) -> Option<SharedHttpClient> {\n        self.http_client.clone()\n    }\n\n    #[allow(dead_code)]\n    pub(crate) fn retry_config(&self) -> Option<RetryConfig> {\n        self.retry_config.clone()\n    }\n\n    #[allow(dead_code)]\n    pub(crate) fn sleep_impl(&self) -> Option<SharedAsyncSleep> {\n        self.sleep_impl.clone()\n    }\n\n    #[allow(dead_code)]\n    pub(crate) fn region(&self) -> Option<Region> {\n        self.region.clone()\n    }\n\n    #[allow(dead_code)]\n    pub(crate) fn use_fips(&self) -> Option<bool> {\n        self.use_fips\n    }\n\n    #[allow(dead_code)]\n    pub(crate) fn use_dual_stack(&self) -> Option<bool> {\n        self.use_dual_stack\n    }\n\n    pub(crate) async fn try_profile(&self) -> Result<&ProfileSet, &ProfileFileLoadError> {\n        let parsed_profile = self\n            .parsed_profile\n            .get_or_init(|| async {\n                let profile = profile::load(\n                    &self.fs,\n                    &self.env,\n                    &self.profile_files,\n                    self.profile_name_override.clone(),\n                )\n                .await;\n                if let Err(err) = profile.as_ref() {\n                    tracing::warn!(err = %DisplayErrorContext(&err), \"failed to parse profile\")\n                }\n                profile\n            })\n            .await;\n        parsed_profile.as_ref()\n    }\n\n    pub(crate) async fn profile(&self) -> Option<&ProfileSet> {\n        self.try_profile().await.ok()\n    }\n\n    /// Override the region for the configuration\n    pub fn with_region(mut self, region: Option<Region>) -> Self {\n        self.region = region;\n        self\n    }\n\n    /// Override the `use_fips` setting.\n    ///\n    /// When set to `Some(true)`, credential providers configured with this\n    /// `ProviderConfig` (e.g., [`DefaultCredentialsChain`], `AssumeRoleProvider`,\n    /// `WebIdentityTokenCredentialsProvider`) will use FIPS-compliant endpoints.\n    ///\n    /// This is the `ProviderConfig` equivalent of\n    /// [`ConfigLoader::use_fips`](crate::ConfigLoader::use_fips). It is needed\n    /// when constructing a `ProviderConfig` directly (e.g., via\n    /// [`ProviderConfig::empty()`]) rather than going through the `ConfigLoader`.\n    ///\n    /// [`DefaultCredentialsChain`]: crate::default_provider::credentials::DefaultCredentialsChain\n    pub fn with_use_fips(mut self, use_fips: Option<bool>) -> Self {\n        self.use_fips = use_fips;\n        self\n    }\n\n    /// Override the `use_dual_stack` setting.\n    ///\n    /// When set to `Some(true)`, credential providers configured with this\n    /// `ProviderConfig` will use dual-stack endpoints.\n    ///\n    /// This is the `ProviderConfig` equivalent of\n    /// [`ConfigLoader::use_dual_stack`](crate::ConfigLoader::use_dual_stack).\n    pub fn with_use_dual_stack(mut self, use_dual_stack: Option<bool>) -> Self {\n        self.use_dual_stack = use_dual_stack;\n        self\n    }\n\n    pub(crate) fn with_profile_name(self, profile_name: String) -> Self {\n        let profile_files = self.profile_files.clone();\n        self.with_profile_config(Some(profile_files), Some(profile_name))\n    }\n\n    /// Override the profile file paths (`~/.aws/config` by default) and name (`default` by default)\n    #[allow(deprecated)]\n    pub(crate) fn with_profile_config(\n        self,\n        profile_files: Option<ProfileFiles>,\n        profile_name_override: Option<String>,\n    ) -> Self {\n        // if there is no override, then don't clear out `parsed_profile`.\n        if profile_files.is_none() && profile_name_override.is_none() {\n            return self;\n        }\n        ProviderConfig {\n            // clear out the profile since we need to reparse it\n            parsed_profile: Default::default(),\n            profile_files: profile_files.unwrap_or(self.profile_files),\n            profile_name_override: profile_name_override\n                .map(Cow::Owned)\n                .or(self.profile_name_override),\n            ..self\n        }\n    }\n\n    /// Use the [default region chain](crate::default_provider::region) to set the\n    /// region for this configuration\n    ///\n    /// Note: the `env` and `fs` already set on this provider will be used when loading the default region.\n    pub async fn load_default_region(self) -> Self {\n        use crate::default_provider::region::DefaultRegionChain;\n        let provider_chain = DefaultRegionChain::builder().configure(&self).build();\n        self.with_region(provider_chain.region().await)\n    }\n\n    pub(crate) fn with_fs(self, fs: Fs) -> Self {\n        ProviderConfig {\n            parsed_profile: Default::default(),\n            fs,\n            ..self\n        }\n    }\n\n    pub(crate) fn with_env(self, env: Env) -> Self {\n        ProviderConfig {\n            parsed_profile: Default::default(),\n            env,\n            ..self\n        }\n    }\n\n    /// Override the time source for this configuration\n    pub fn with_time_source(self, time_source: impl TimeSource + 'static) -> Self {\n        ProviderConfig {\n            time_source: time_source.into_shared(),\n            ..self\n        }\n    }\n\n    /// Override the HTTP client for this configuration\n    pub fn with_http_client(self, http_client: impl HttpClient + 'static) -> Self {\n        ProviderConfig {\n            http_client: Some(http_client.into_shared()),\n            ..self\n        }\n    }\n\n    /// Override the sleep implementation for this configuration\n    pub fn with_sleep_impl(self, sleep_impl: impl AsyncSleep + 'static) -> Self {\n        ProviderConfig {\n            sleep_impl: Some(sleep_impl.into_shared()),\n            ..self\n        }\n    }\n\n    /// Override the retry config for this configuration\n    pub fn with_retry_config(self, retry_config: RetryConfig) -> Self {\n        ProviderConfig {\n            retry_config: Some(retry_config),\n            ..self\n        }\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/src/retry.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Retry configuration\n\n// Re-export from aws-smithy-types\npub use aws_smithy_types::retry::ErrorKind;\npub use aws_smithy_types::retry::ProvideErrorKind;\npub use aws_smithy_types::retry::RetryConfig;\npub use aws_smithy_types::retry::RetryConfigBuilder;\npub use aws_smithy_types::retry::RetryKind;\npub use aws_smithy_types::retry::RetryMode;\n\n/// Errors for retry configuration\npub mod error {\n    use std::fmt;\n    use std::num::ParseIntError;\n\n    // Re-export from aws-smithy-types\n    pub use aws_smithy_types::retry::RetryModeParseError;\n\n    #[derive(Debug)]\n    pub(crate) enum RetryConfigErrorKind {\n        /// The configured retry mode wasn't recognized.\n        InvalidRetryMode {\n            /// Cause of the error.\n            source: RetryModeParseError,\n        },\n        /// Max attempts must be greater than zero.\n        MaxAttemptsMustNotBeZero,\n        /// The max attempts value couldn't be parsed to an integer.\n        FailedToParseMaxAttempts {\n            /// Cause of the error.\n            source: ParseIntError,\n        },\n    }\n\n    /// Failure to parse retry config from profile file or environment variable.\n    #[derive(Debug)]\n    pub struct RetryConfigError {\n        pub(crate) kind: RetryConfigErrorKind,\n    }\n\n    impl fmt::Display for RetryConfigError {\n        fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n            use RetryConfigErrorKind::*;\n            match &self.kind {\n                InvalidRetryMode { .. } => {\n                    write!(f, \"invalid retry configuration\")\n                }\n                MaxAttemptsMustNotBeZero => {\n                    write!(f, \"invalid configuration: It is invalid to set max attempts to 0. Unset it or set it to an integer greater than or equal to one.\")\n                }\n                FailedToParseMaxAttempts { .. } => {\n                    write!(f, \"failed to parse max attempts\",)\n                }\n            }\n        }\n    }\n\n    impl std::error::Error for RetryConfigError {\n        fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {\n            use RetryConfigErrorKind::*;\n            match &self.kind {\n                InvalidRetryMode { source, .. } => Some(source),\n                FailedToParseMaxAttempts { source, .. } => Some(source),\n                MaxAttemptsMustNotBeZero => None,\n            }\n        }\n    }\n\n    impl From<RetryConfigErrorKind> for RetryConfigError {\n        fn from(kind: RetryConfigErrorKind) -> Self {\n            Self { kind }\n        }\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/src/sensitive_command.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::fmt;\n\n#[derive(Clone)]\npub(crate) struct CommandWithSensitiveArgs<T>(T);\n\nimpl<T> CommandWithSensitiveArgs<T>\nwhere\n    T: AsRef<str>,\n{\n    pub(crate) fn new(value: T) -> Self {\n        Self(value)\n    }\n\n    #[allow(dead_code)]\n    pub(crate) fn to_owned_string(&self) -> CommandWithSensitiveArgs<String> {\n        CommandWithSensitiveArgs(self.0.as_ref().to_string())\n    }\n\n    #[allow(dead_code)]\n    pub(crate) fn unredacted(&self) -> &str {\n        self.0.as_ref()\n    }\n}\n\nimpl<T> fmt::Display for CommandWithSensitiveArgs<T>\nwhere\n    T: AsRef<str>,\n{\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        // Security: The arguments for command must be redacted since they can be sensitive\n        let command = self.0.as_ref();\n        match command.find(char::is_whitespace) {\n            Some(index) => write!(f, \"{} ** arguments redacted **\", &command[0..index]),\n            None => write!(f, \"{command}\"),\n        }\n    }\n}\n\nimpl<T> fmt::Debug for CommandWithSensitiveArgs<T>\nwhere\n    T: AsRef<str>,\n{\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        write!(f, \"{:?}\", format!(\"{}\", self))\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/src/sso/cache.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_runtime::fs_util::{home_dir, Os};\nuse aws_smithy_json::deserialize::token::skip_value;\nuse aws_smithy_json::deserialize::Token;\nuse aws_smithy_json::deserialize::{json_token_iter, EscapeError};\nuse aws_smithy_json::serialize::JsonObjectWriter;\nuse aws_smithy_types::date_time::{DateTimeFormatError, Format};\nuse aws_smithy_types::DateTime;\nuse aws_types::os_shim_internal::{Env, Fs};\nuse sha1::{Digest, Sha1};\nuse std::borrow::Cow;\nuse std::error::Error as StdError;\nuse std::fmt;\nuse std::path::PathBuf;\nuse std::time::SystemTime;\nuse zeroize::Zeroizing;\n\n#[cfg_attr(test, derive(Eq, PartialEq))]\n#[derive(Clone)]\npub(super) struct CachedSsoToken {\n    pub(super) access_token: Zeroizing<String>,\n    pub(super) client_id: Option<String>,\n    pub(super) client_secret: Option<Zeroizing<String>>,\n    pub(super) expires_at: SystemTime,\n    pub(super) refresh_token: Option<Zeroizing<String>>,\n    pub(super) region: Option<String>,\n    pub(super) registration_expires_at: Option<SystemTime>,\n    pub(super) start_url: Option<String>,\n}\n\nimpl CachedSsoToken {\n    /// True if the information required to refresh this token is present.\n    ///\n    /// The expiration times are not considered by this function.\n    pub(super) fn refreshable(&self) -> bool {\n        self.client_id.is_some()\n            && self.client_secret.is_some()\n            && self.refresh_token.is_some()\n            && self.registration_expires_at.is_some()\n    }\n}\n\nimpl fmt::Debug for CachedSsoToken {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        f.debug_struct(\"CachedSsoToken\")\n            .field(\"access_token\", &\"** redacted **\")\n            .field(\"client_id\", &self.client_id)\n            .field(\"client_secret\", &\"** redacted **\")\n            .field(\"expires_at\", &self.expires_at)\n            .field(\"refresh_token\", &\"** redacted **\")\n            .field(\"region\", &self.region)\n            .field(\"registration_expires_at\", &self.registration_expires_at)\n            .field(\"start_url\", &self.start_url)\n            .finish()\n    }\n}\n\n#[derive(Debug)]\npub(super) enum CachedSsoTokenError {\n    FailedToFormatDateTime {\n        source: Box<dyn StdError + Send + Sync>,\n    },\n    InvalidField {\n        field: &'static str,\n        source: Box<dyn StdError + Send + Sync>,\n    },\n    IoError {\n        what: &'static str,\n        path: PathBuf,\n        source: std::io::Error,\n    },\n    JsonError(Box<dyn StdError + Send + Sync>),\n    MissingField(&'static str),\n    NoHomeDirectory,\n    Other(Cow<'static, str>),\n}\n\nimpl fmt::Display for CachedSsoTokenError {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        match self {\n            Self::FailedToFormatDateTime { .. } => write!(f, \"failed to format date time\"),\n            Self::InvalidField { field, .. } => write!(\n                f,\n                \"invalid value for the `{field}` field in the cached SSO token file\"\n            ),\n            Self::IoError { what, path, .. } => write!(f, \"failed to {what} `{}`\", path.display()),\n            Self::JsonError(_) => write!(f, \"invalid JSON in cached SSO token file\"),\n            Self::MissingField(field) => {\n                write!(f, \"missing field `{field}` in cached SSO token file\")\n            }\n            Self::NoHomeDirectory => write!(f, \"couldn't resolve a home directory\"),\n            Self::Other(message) => f.write_str(message),\n        }\n    }\n}\n\nimpl StdError for CachedSsoTokenError {\n    fn source(&self) -> Option<&(dyn StdError + 'static)> {\n        match self {\n            Self::FailedToFormatDateTime { source } => Some(source.as_ref()),\n            Self::InvalidField { source, .. } => Some(source.as_ref()),\n            Self::IoError { source, .. } => Some(source),\n            Self::JsonError(source) => Some(source.as_ref()),\n            Self::MissingField(_) => None,\n            Self::NoHomeDirectory => None,\n            Self::Other(_) => None,\n        }\n    }\n}\n\nimpl From<EscapeError> for CachedSsoTokenError {\n    fn from(err: EscapeError) -> Self {\n        Self::JsonError(err.into())\n    }\n}\n\nimpl From<aws_smithy_json::deserialize::error::DeserializeError> for CachedSsoTokenError {\n    fn from(err: aws_smithy_json::deserialize::error::DeserializeError) -> Self {\n        Self::JsonError(err.into())\n    }\n}\n\nimpl From<DateTimeFormatError> for CachedSsoTokenError {\n    fn from(value: DateTimeFormatError) -> Self {\n        Self::FailedToFormatDateTime {\n            source: value.into(),\n        }\n    }\n}\n\n/// Determine the SSO cached token path for a given identifier.\n///\n/// The `identifier` is the `sso_start_url` for credentials providers, and `sso_session_name` for token providers.\nfn cached_token_path(identifier: &str, home: &str) -> PathBuf {\n    // hex::encode returns a lowercase string\n    let mut out = PathBuf::with_capacity(home.len() + \"/.aws/sso/cache\".len() + \".json\".len() + 40);\n    out.push(home);\n    out.push(\".aws/sso/cache\");\n    out.push(hex::encode(Sha1::digest(identifier.as_bytes())));\n    out.set_extension(\"json\");\n    out\n}\n\n/// Load the token for `identifier` from `~/.aws/sso/cache/<hashofidentifier>.json`\n///\n/// The `identifier` is the `sso_start_url` for credentials providers, and `sso_session_name` for token providers.\npub(super) async fn load_cached_token(\n    env: &Env,\n    fs: &Fs,\n    identifier: &str,\n) -> Result<CachedSsoToken, CachedSsoTokenError> {\n    let home = home_dir(env, Os::real()).ok_or(CachedSsoTokenError::NoHomeDirectory)?;\n    let path = cached_token_path(identifier, &home);\n    let data = Zeroizing::new(fs.read_to_end(&path).await.map_err(|source| {\n        CachedSsoTokenError::IoError {\n            what: \"read\",\n            path,\n            source,\n        }\n    })?);\n    parse_cached_token(&data)\n}\n\n/// Parse SSO token JSON from input\nfn parse_cached_token(\n    cached_token_file_contents: &[u8],\n) -> Result<CachedSsoToken, CachedSsoTokenError> {\n    use CachedSsoTokenError as Error;\n\n    let mut access_token = None;\n    let mut expires_at = None;\n    let mut client_id = None;\n    let mut client_secret = None;\n    let mut refresh_token = None;\n    let mut region = None;\n    let mut registration_expires_at = None;\n    let mut start_url = None;\n    json_parse_loop(cached_token_file_contents, |key, value| {\n        match (key, value) {\n            /*\n            // Required fields:\n            \"accessToken\": \"string\",\n            \"expiresAt\": \"2019-11-14T04:05:45Z\",\n\n            // Optional fields:\n            \"refreshToken\": \"string\",\n            \"clientId\": \"ABCDEFG323242423121312312312312312\",\n            \"clientSecret\": \"ABCDE123\",\n            \"registrationExpiresAt\": \"2022-03-06T19:53:17Z\",\n            \"region\": \"us-west-2\",\n            \"startUrl\": \"https://d-abc123.awsapps.com/start\"\n            */\n            (key, Token::ValueString { value, .. }) if key.eq_ignore_ascii_case(\"accessToken\") => {\n                access_token = Some(Zeroizing::new(value.to_unescaped()?.into_owned()));\n            }\n            (key, Token::ValueString { value, .. }) if key.eq_ignore_ascii_case(\"expiresAt\") => {\n                expires_at = Some(value.to_unescaped()?);\n            }\n            (key, Token::ValueString { value, .. }) if key.eq_ignore_ascii_case(\"clientId\") => {\n                client_id = Some(value.to_unescaped()?);\n            }\n            (key, Token::ValueString { value, .. }) if key.eq_ignore_ascii_case(\"clientSecret\") => {\n                client_secret = Some(Zeroizing::new(value.to_unescaped()?.into_owned()));\n            }\n            (key, Token::ValueString { value, .. }) if key.eq_ignore_ascii_case(\"refreshToken\") => {\n                refresh_token = Some(Zeroizing::new(value.to_unescaped()?.into_owned()));\n            }\n            (key, Token::ValueString { value, .. }) if key.eq_ignore_ascii_case(\"region\") => {\n                region = Some(value.to_unescaped()?.into_owned());\n            }\n            (key, Token::ValueString { value, .. })\n                if key.eq_ignore_ascii_case(\"registrationExpiresAt\") =>\n            {\n                registration_expires_at = Some(value.to_unescaped()?);\n            }\n            (key, Token::ValueString { value, .. }) if key.eq_ignore_ascii_case(\"startUrl\") => {\n                start_url = Some(value.to_unescaped()?.into_owned());\n            }\n            _ => {}\n        };\n        Ok(())\n    })?;\n\n    Ok(CachedSsoToken {\n        access_token: access_token.ok_or(Error::MissingField(\"accessToken\"))?,\n        expires_at: expires_at\n            .ok_or(Error::MissingField(\"expiresAt\"))\n            .and_then(|expires_at| {\n                DateTime::from_str(expires_at.as_ref(), Format::DateTime)\n                    .map_err(|err| Error::InvalidField { field: \"expiresAt\", source: err.into() })\n                    .and_then(|date_time| {\n                        SystemTime::try_from(date_time).map_err(|_| {\n                            Error::Other(\n                                \"SSO token expiration time cannot be represented by a SystemTime\"\n                                    .into(),\n                            )\n                        })\n                    })\n            })?,\n        client_id: client_id.map(Cow::into_owned),\n        client_secret,\n        refresh_token,\n        region,\n        registration_expires_at: Ok(registration_expires_at).and_then(|maybe_expires_at| {\n            if let Some(expires_at) = maybe_expires_at {\n                Some(\n                    DateTime::from_str(expires_at.as_ref(), Format::DateTime)\n                        .map_err(|err| Error::InvalidField { field: \"registrationExpiresAt\", source: err.into()})\n                        .and_then(|date_time| {\n                            SystemTime::try_from(date_time).map_err(|_| {\n                                Error::Other(\n                                    \"SSO registration expiration time cannot be represented by a SystemTime\"\n                                        .into(),\n                                )\n                            })\n                        }),\n                )\n                .transpose()\n            } else {\n                Ok(None)\n            }\n        })?,\n        start_url,\n    })\n}\n\nfn json_parse_loop<'a>(\n    input: &'a [u8],\n    mut f: impl FnMut(Cow<'a, str>, &Token<'a>) -> Result<(), CachedSsoTokenError>,\n) -> Result<(), CachedSsoTokenError> {\n    use CachedSsoTokenError as Error;\n    let mut tokens = json_token_iter(input).peekable();\n    if !matches!(tokens.next().transpose()?, Some(Token::StartObject { .. })) {\n        return Err(Error::Other(\n            \"expected a JSON document starting with `{`\".into(),\n        ));\n    }\n    loop {\n        match tokens.next().transpose()? {\n            Some(Token::EndObject { .. }) => break,\n            Some(Token::ObjectKey { key, .. }) => {\n                if let Some(Ok(token)) = tokens.peek() {\n                    let key = key.to_unescaped()?;\n                    f(key, token)?\n                }\n                skip_value(&mut tokens)?;\n            }\n            other => {\n                return Err(Error::Other(\n                    format!(\"expected object key, found: {other:?}\").into(),\n                ));\n            }\n        }\n    }\n    if tokens.next().is_some() {\n        return Err(Error::Other(\n            \"found more JSON tokens after completing parsing\".into(),\n        ));\n    }\n    Ok(())\n}\n\npub(super) async fn save_cached_token(\n    env: &Env,\n    fs: &Fs,\n    identifier: &str,\n    token: &CachedSsoToken,\n) -> Result<(), CachedSsoTokenError> {\n    let expires_at = DateTime::from(token.expires_at).fmt(Format::DateTime)?;\n    let registration_expires_at = token\n        .registration_expires_at\n        .map(|time| DateTime::from(time).fmt(Format::DateTime))\n        .transpose()?;\n\n    let mut out = Zeroizing::new(String::new());\n    let mut writer = JsonObjectWriter::new(&mut out);\n    writer.key(\"accessToken\").string(&token.access_token);\n    writer.key(\"expiresAt\").string(&expires_at);\n    if let Some(refresh_token) = &token.refresh_token {\n        writer.key(\"refreshToken\").string(refresh_token);\n    }\n    if let Some(client_id) = &token.client_id {\n        writer.key(\"clientId\").string(client_id);\n    }\n    if let Some(client_secret) = &token.client_secret {\n        writer.key(\"clientSecret\").string(client_secret);\n    }\n    if let Some(registration_expires_at) = registration_expires_at {\n        writer\n            .key(\"registrationExpiresAt\")\n            .string(&registration_expires_at);\n    }\n    if let Some(region) = &token.region {\n        writer.key(\"region\").string(region);\n    }\n    if let Some(start_url) = &token.start_url {\n        writer.key(\"startUrl\").string(start_url);\n    }\n    writer.finish();\n\n    let home = home_dir(env, Os::real()).ok_or(CachedSsoTokenError::NoHomeDirectory)?;\n    let path = cached_token_path(identifier, &home);\n    fs.write(&path, out.as_bytes())\n        .await\n        .map_err(|err| CachedSsoTokenError::IoError {\n            what: \"write\",\n            path,\n            source: err,\n        })?;\n    Ok(())\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use std::collections::HashMap;\n    use std::time::Duration;\n\n    #[test]\n    fn redact_fields_in_token_debug() {\n        let token = CachedSsoToken {\n            access_token: Zeroizing::new(\"!!SENSITIVE!!\".into()),\n            client_id: Some(\"clientid\".into()),\n            client_secret: Some(Zeroizing::new(\"!!SENSITIVE!!\".into())),\n            expires_at: SystemTime::now(),\n            refresh_token: Some(Zeroizing::new(\"!!SENSITIVE!!\".into())),\n            region: Some(\"region\".into()),\n            registration_expires_at: Some(SystemTime::now()),\n            start_url: Some(\"starturl\".into()),\n        };\n        let debug_str = format!(\"{:?}\", token);\n        assert!(!debug_str.contains(\"!!SENSITIVE!!\"), \"The `Debug` impl for `CachedSsoToken` isn't properly redacting sensitive fields: {debug_str}\");\n    }\n\n    // Valid token with all fields\n    #[test]\n    fn parse_valid_token() {\n        let file_contents = r#\"\n        {\n            \"startUrl\": \"https://d-123.awsapps.com/start\",\n            \"region\": \"us-west-2\",\n            \"accessToken\": \"cachedtoken\",\n            \"expiresAt\": \"2021-12-25T21:30:00Z\",\n            \"clientId\": \"clientid\",\n            \"clientSecret\": \"YSBzZWNyZXQ=\",\n            \"registrationExpiresAt\": \"2022-12-25T13:30:00Z\",\n            \"refreshToken\": \"cachedrefreshtoken\"\n        }\n        \"#;\n        let cached = parse_cached_token(file_contents.as_bytes()).expect(\"success\");\n        assert_eq!(\"cachedtoken\", cached.access_token.as_str());\n        assert_eq!(\n            SystemTime::UNIX_EPOCH + Duration::from_secs(1640467800),\n            cached.expires_at\n        );\n        assert_eq!(\"clientid\", cached.client_id.expect(\"client id is present\"));\n        assert_eq!(\n            \"YSBzZWNyZXQ=\",\n            cached\n                .client_secret\n                .expect(\"client secret is present\")\n                .as_str()\n        );\n        assert_eq!(\n            \"cachedrefreshtoken\",\n            cached\n                .refresh_token\n                .expect(\"refresh token is present\")\n                .as_str()\n        );\n        assert_eq!(\n            SystemTime::UNIX_EPOCH + Duration::from_secs(1671975000),\n            cached\n                .registration_expires_at\n                .expect(\"registration expiration is present\")\n        );\n        assert_eq!(\"us-west-2\", cached.region.expect(\"region is present\"));\n        assert_eq!(\n            \"https://d-123.awsapps.com/start\",\n            cached.start_url.expect(\"startUrl is present\")\n        );\n    }\n\n    // Minimal valid cached token\n    #[test]\n    fn parse_valid_token_with_optional_fields_absent() {\n        let file_contents = r#\"\n        {\n            \"accessToken\": \"cachedtoken\",\n            \"expiresAt\": \"2021-12-25T21:30:00Z\"\n        }\n        \"#;\n        let cached = parse_cached_token(file_contents.as_bytes()).expect(\"success\");\n        assert_eq!(\"cachedtoken\", cached.access_token.as_str());\n        assert_eq!(\n            SystemTime::UNIX_EPOCH + Duration::from_secs(1640467800),\n            cached.expires_at\n        );\n        assert!(cached.client_id.is_none());\n        assert!(cached.client_secret.is_none());\n        assert!(cached.refresh_token.is_none());\n        assert!(cached.registration_expires_at.is_none());\n    }\n\n    #[test]\n    fn parse_invalid_timestamp() {\n        let token = br#\"\n        {\n            \"accessToken\": \"base64string\",\n            \"expiresAt\": \"notatimestamp\",\n            \"region\": \"us-west-2\",\n            \"startUrl\": \"https://d-abc123.awsapps.com/start\"\n        }\"#;\n        let err = parse_cached_token(token).expect_err(\"invalid timestamp\");\n        let expected = \"invalid value for the `expiresAt` field in the cached SSO token file\";\n        let actual = format!(\"{err}\");\n        assert!(\n            actual.contains(expected),\n            \"expected error to contain `{expected}`, but was `{actual}`\",\n        );\n    }\n\n    #[test]\n    fn parse_missing_fields() {\n        // Token missing accessToken field\n        let token = br#\"\n        {\n            \"expiresAt\": \"notatimestamp\",\n            \"region\": \"us-west-2\",\n            \"startUrl\": \"https://d-abc123.awsapps.com/start\"\n        }\"#;\n        let err = parse_cached_token(token).expect_err(\"missing akid\");\n        assert!(\n            matches!(err, CachedSsoTokenError::MissingField(\"accessToken\")),\n            \"incorrect error: {:?}\",\n            err\n        );\n\n        // Token missing expiresAt field\n        let token = br#\"\n        {\n            \"accessToken\": \"akid\",\n            \"region\": \"us-west-2\",\n            \"startUrl\": \"https://d-abc123.awsapps.com/start\"\n        }\"#;\n        let err = parse_cached_token(token).expect_err(\"missing expiry\");\n        assert!(\n            matches!(err, CachedSsoTokenError::MissingField(\"expiresAt\")),\n            \"incorrect error: {:?}\",\n            err\n        );\n    }\n\n    #[tokio::test]\n    async fn gracefully_handle_missing_files() {\n        let err = load_cached_token(\n            &Env::from_slice(&[(\"HOME\", \"/home\")]),\n            &Fs::from_slice(&[]),\n            \"asdf\",\n        )\n        .await\n        .expect_err(\"should fail, file is missing\");\n        assert!(\n            matches!(err, CachedSsoTokenError::IoError { .. }),\n            \"should be io error, got {}\",\n            err\n        );\n    }\n\n    // TODO(https://github.com/awslabs/aws-sdk-rust/issues/1117) This test is ignored on Windows because it uses Unix-style paths\n    #[cfg_attr(windows, ignore)]\n    #[test]\n    fn determine_correct_cache_filenames() {\n        assert_eq!(\n            \"/home/someuser/.aws/sso/cache/d033e22ae348aeb5660fc2140aec35850c4da997.json\",\n            cached_token_path(\"admin\", \"/home/someuser\").as_os_str()\n        );\n        assert_eq!(\n            \"/home/someuser/.aws/sso/cache/75e4d41276d8bd17f85986fc6cccef29fd725ce3.json\",\n            cached_token_path(\"dev-scopes\", \"/home/someuser\").as_os_str()\n        );\n        assert_eq!(\n            \"/home/me/.aws/sso/cache/13f9d35043871d073ab260e020f0ffde092cb14b.json\",\n            cached_token_path(\"https://d-92671207e4.awsapps.com/start\", \"/home/me\").as_os_str(),\n        );\n        assert_eq!(\n            \"/home/me/.aws/sso/cache/13f9d35043871d073ab260e020f0ffde092cb14b.json\",\n            cached_token_path(\"https://d-92671207e4.awsapps.com/start\", \"/home/me/\").as_os_str(),\n        );\n    }\n\n    // TODO(https://github.com/awslabs/aws-sdk-rust/issues/1117) This test is ignored on Windows because it uses Unix-style paths\n    #[cfg_attr(windows, ignore)]\n    #[tokio::test]\n    async fn save_cached_token() {\n        let expires_at = SystemTime::UNIX_EPOCH + Duration::from_secs(50_000_000);\n        let reg_expires_at = SystemTime::UNIX_EPOCH + Duration::from_secs(100_000_000);\n        let token = CachedSsoToken {\n            access_token: Zeroizing::new(\"access-token\".into()),\n            client_id: Some(\"client-id\".into()),\n            client_secret: Some(Zeroizing::new(\"client-secret\".into())),\n            expires_at,\n            refresh_token: Some(Zeroizing::new(\"refresh-token\".into())),\n            region: Some(\"region\".into()),\n            registration_expires_at: Some(reg_expires_at),\n            start_url: Some(\"start-url\".into()),\n        };\n\n        let env = Env::from_slice(&[(\"HOME\", \"/home/user\")]);\n        let fs = Fs::from_map(HashMap::<_, Vec<u8>>::new());\n        super::save_cached_token(&env, &fs, \"test\", &token)\n            .await\n            .expect(\"success\");\n\n        let contents = fs\n            .read_to_end(\"/home/user/.aws/sso/cache/a94a8fe5ccb19ba61c4c0873d391e987982fbbd3.json\")\n            .await\n            .expect(\"correct file written\");\n        let contents_str = String::from_utf8(contents).expect(\"valid utf8\");\n        assert_eq!(\n            r#\"{\"accessToken\":\"access-token\",\"expiresAt\":\"1971-08-02T16:53:20Z\",\"refreshToken\":\"refresh-token\",\"clientId\":\"client-id\",\"clientSecret\":\"client-secret\",\"registrationExpiresAt\":\"1973-03-03T09:46:40Z\",\"region\":\"region\",\"startUrl\":\"start-url\"}\"#,\n            contents_str,\n        );\n    }\n\n    #[tokio::test]\n    async fn round_trip_token() {\n        let expires_at = SystemTime::UNIX_EPOCH + Duration::from_secs(50_000_000);\n        let reg_expires_at = SystemTime::UNIX_EPOCH + Duration::from_secs(100_000_000);\n        let original = CachedSsoToken {\n            access_token: Zeroizing::new(\"access-token\".into()),\n            client_id: Some(\"client-id\".into()),\n            client_secret: Some(Zeroizing::new(\"client-secret\".into())),\n            expires_at,\n            refresh_token: Some(Zeroizing::new(\"refresh-token\".into())),\n            region: Some(\"region\".into()),\n            registration_expires_at: Some(reg_expires_at),\n            start_url: Some(\"start-url\".into()),\n        };\n\n        let env = Env::from_slice(&[(\"HOME\", \"/home/user\")]);\n        let fs = Fs::from_map(HashMap::<_, Vec<u8>>::new());\n\n        super::save_cached_token(&env, &fs, \"test\", &original)\n            .await\n            .unwrap();\n\n        let roundtripped = load_cached_token(&env, &fs, \"test\").await.unwrap();\n        assert_eq!(original, roundtripped)\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/src/sso/credentials.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! SSO Credentials Provider\n//!\n//! This credentials provider enables loading credentials from `~/.aws/sso/cache`. For more information,\n//! see [Using AWS SSO Credentials](https://docs.aws.amazon.com/toolkit-for-vscode/latest/userguide/sso-credentials.html)\n//!\n//! This provider is included automatically when profiles are loaded.\n\nuse super::cache::load_cached_token;\nuse crate::identity::IdentityCache;\nuse crate::provider_config::ProviderConfig;\nuse crate::sso::SsoTokenProvider;\nuse aws_credential_types::credential_feature::AwsCredentialFeature;\nuse aws_credential_types::provider::{self, error::CredentialsError, future, ProvideCredentials};\nuse aws_credential_types::Credentials;\nuse aws_sdk_sso::types::RoleCredentials;\nuse aws_sdk_sso::Client as SsoClient;\nuse aws_smithy_async::time::SharedTimeSource;\nuse aws_smithy_types::DateTime;\nuse aws_types::os_shim_internal::{Env, Fs};\nuse aws_types::region::Region;\nuse aws_types::SdkConfig;\n\n/// SSO Credentials Provider\n///\n/// _Note: This provider is part of the default credentials chain and is integrated with the profile-file provider._\n///\n/// This credentials provider will use cached SSO tokens stored in `~/.aws/sso/cache/<hash>.json`.\n/// Two different values will be tried for `<hash>` in order:\n/// 1. The configured [`session_name`](Builder::session_name).\n/// 2. The configured [`start_url`](Builder::start_url).\n#[derive(Debug)]\npub struct SsoCredentialsProvider {\n    fs: Fs,\n    env: Env,\n    sso_provider_config: SsoProviderConfig,\n    sdk_config: SdkConfig,\n    token_provider: Option<SsoTokenProvider>,\n    time_source: SharedTimeSource,\n}\n\nimpl SsoCredentialsProvider {\n    /// Creates a builder for [`SsoCredentialsProvider`]\n    pub fn builder() -> Builder {\n        Builder::new()\n    }\n\n    pub(crate) fn new(\n        provider_config: &ProviderConfig,\n        sso_provider_config: SsoProviderConfig,\n    ) -> Self {\n        let fs = provider_config.fs();\n        let env = provider_config.env();\n\n        let token_provider = if let Some(session_name) = &sso_provider_config.session_name {\n            Some(\n                SsoTokenProvider::builder()\n                    .configure(&provider_config.client_config())\n                    .start_url(&sso_provider_config.start_url)\n                    .session_name(session_name)\n                    .region(sso_provider_config.region.clone())\n                    .build_with(env.clone(), fs.clone()),\n            )\n        } else {\n            None\n        };\n\n        SsoCredentialsProvider {\n            fs,\n            env,\n            sso_provider_config,\n            sdk_config: provider_config.client_config(),\n            token_provider,\n            time_source: provider_config.time_source(),\n        }\n    }\n\n    async fn credentials(&self) -> provider::Result {\n        load_sso_credentials(\n            &self.sso_provider_config,\n            &self.sdk_config,\n            self.token_provider.as_ref(),\n            &self.env,\n            &self.fs,\n            self.time_source.clone(),\n        )\n        .await\n        .map(|mut creds| {\n            creds\n                .get_property_mut_or_default::<Vec<AwsCredentialFeature>>()\n                .push(AwsCredentialFeature::CredentialsSso);\n            creds\n        })\n    }\n}\n\nimpl ProvideCredentials for SsoCredentialsProvider {\n    fn provide_credentials<'a>(&'a self) -> future::ProvideCredentials<'a>\n    where\n        Self: 'a,\n    {\n        future::ProvideCredentials::new(self.credentials())\n    }\n}\n\n/// Builder for [`SsoCredentialsProvider`]\n#[derive(Default, Debug, Clone)]\npub struct Builder {\n    provider_config: Option<ProviderConfig>,\n    account_id: Option<String>,\n    region: Option<Region>,\n    role_name: Option<String>,\n    start_url: Option<String>,\n    session_name: Option<String>,\n}\n\nimpl Builder {\n    /// Create a new builder for [`SsoCredentialsProvider`]\n    pub fn new() -> Self {\n        Self::default()\n    }\n\n    /// Override the configuration used for this provider\n    pub fn configure(mut self, provider_config: &ProviderConfig) -> Self {\n        self.provider_config = Some(provider_config.clone());\n        self\n    }\n\n    /// Set the account id used for SSO\n    ///\n    /// This is a required field.\n    pub fn account_id(mut self, account_id: impl Into<String>) -> Self {\n        self.account_id = Some(account_id.into());\n        self\n    }\n\n    /// Set the account id used for SSO\n    ///\n    /// This is a required field.\n    pub fn set_account_id(&mut self, account_id: Option<String>) -> &mut Self {\n        self.account_id = account_id;\n        self\n    }\n\n    /// Set the region used for SSO\n    ///\n    /// This is a required field.\n    pub fn region(mut self, region: Region) -> Self {\n        self.region = Some(region);\n        self\n    }\n\n    /// Set the region used for SSO\n    ///\n    /// This is a required field.\n    pub fn set_region(&mut self, region: Option<Region>) -> &mut Self {\n        self.region = region;\n        self\n    }\n\n    /// Set the role name used for SSO\n    ///\n    /// This is a required field.\n    pub fn role_name(mut self, role_name: impl Into<String>) -> Self {\n        self.role_name = Some(role_name.into());\n        self\n    }\n\n    /// Set the role name used for SSO\n    ///\n    /// This is a required field.\n    pub fn set_role_name(&mut self, role_name: Option<String>) -> &mut Self {\n        self.role_name = role_name;\n        self\n    }\n\n    /// Set the start URL used for SSO\n    ///\n    /// This is a required field.\n    pub fn start_url(mut self, start_url: impl Into<String>) -> Self {\n        self.start_url = Some(start_url.into());\n        self\n    }\n\n    /// Set the start URL used for SSO\n    ///\n    /// This is a required field.\n    pub fn set_start_url(&mut self, start_url: Option<String>) -> &mut Self {\n        self.start_url = start_url;\n        self\n    }\n\n    /// Set the session name used for SSO\n    pub fn session_name(mut self, session_name: impl Into<String>) -> Self {\n        self.session_name = Some(session_name.into());\n        self\n    }\n\n    /// Set the session name used for SSO\n    pub fn set_session_name(&mut self, session_name: Option<String>) -> &mut Self {\n        self.session_name = session_name;\n        self\n    }\n\n    /// Construct an SsoCredentialsProvider from the builder\n    ///\n    /// # Panics\n    /// This method will panic if the any of the following required fields are unset:\n    /// - [`start_url`](Self::start_url)\n    /// - [`role_name`](Self::role_name)\n    /// - [`account_id`](Self::account_id)\n    /// - [`region`](Self::region)\n    pub fn build(self) -> SsoCredentialsProvider {\n        let provider_config = self.provider_config.unwrap_or_default();\n        let sso_config = SsoProviderConfig {\n            account_id: self.account_id.expect(\"account_id must be set\"),\n            region: self.region.expect(\"region must be set\"),\n            role_name: self.role_name.expect(\"role_name must be set\"),\n            start_url: self.start_url.expect(\"start_url must be set\"),\n            session_name: self.session_name,\n        };\n        SsoCredentialsProvider::new(&provider_config, sso_config)\n    }\n}\n\n#[derive(Debug)]\npub(crate) struct SsoProviderConfig {\n    pub(crate) account_id: String,\n    pub(crate) role_name: String,\n    pub(crate) start_url: String,\n    pub(crate) region: Region,\n    pub(crate) session_name: Option<String>,\n}\n\nasync fn load_sso_credentials(\n    sso_provider_config: &SsoProviderConfig,\n    sdk_config: &SdkConfig,\n    token_provider: Option<&SsoTokenProvider>,\n    env: &Env,\n    fs: &Fs,\n    time_source: SharedTimeSource,\n) -> provider::Result {\n    let token = if let Some(token_provider) = token_provider {\n        token_provider\n            .resolve_token(time_source)\n            .await\n            .map_err(CredentialsError::provider_error)?\n    } else {\n        // Backwards compatible token loading that uses `start_url` instead of `session_name`\n        load_cached_token(env, fs, &sso_provider_config.start_url)\n            .await\n            .map_err(CredentialsError::provider_error)?\n    };\n\n    let config = sdk_config\n        .to_builder()\n        .region(sso_provider_config.region.clone())\n        .identity_cache(IdentityCache::no_cache())\n        .build();\n    // TODO(enableNewSmithyRuntimeCleanup): Use `customize().config_override()` to set the region instead of creating a new client once middleware is removed\n    let client = SsoClient::new(&config);\n    let resp = client\n        .get_role_credentials()\n        .role_name(&sso_provider_config.role_name)\n        .access_token(&*token.access_token)\n        .account_id(&sso_provider_config.account_id)\n        .send()\n        .await\n        .map_err(CredentialsError::provider_error)?;\n    let credentials: RoleCredentials = resp\n        .role_credentials\n        .ok_or_else(|| CredentialsError::unhandled(\"SSO did not return credentials\"))?;\n    let akid = credentials\n        .access_key_id\n        .ok_or_else(|| CredentialsError::unhandled(\"no access key id in response\"))?;\n    let secret_key = credentials\n        .secret_access_key\n        .ok_or_else(|| CredentialsError::unhandled(\"no secret key in response\"))?;\n    let expiration = DateTime::from_millis(credentials.expiration)\n        .try_into()\n        .map_err(|err| {\n            CredentialsError::unhandled(format!(\n                \"expiration could not be converted into a system time: {err}\",\n            ))\n        })?;\n    let mut builder = Credentials::builder()\n        .access_key_id(akid)\n        .secret_access_key(secret_key)\n        .account_id(&sso_provider_config.account_id)\n        .expiry(expiration)\n        .provider_name(\"SSO\");\n    builder.set_session_token(credentials.session_token);\n    Ok(builder.build())\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/src/sso/token.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! SSO Token Provider\n//!\n//! This token provider enables loading an access token from `~/.aws/sso/cache`. For more information,\n//! see [AWS Builder ID for developers](https://docs.aws.amazon.com/toolkit-for-vscode/latest/userguide/builder-id.html).\n//!\n//! This provider is included automatically when profiles are loaded.\n\nuse crate::identity::IdentityCache;\nuse crate::sso::cache::{\n    load_cached_token, save_cached_token, CachedSsoToken, CachedSsoTokenError,\n};\nuse aws_credential_types::provider::token::ProvideToken;\nuse aws_credential_types::provider::{\n    error::TokenError, future::ProvideToken as ProvideTokenFuture,\n};\nuse aws_sdk_ssooidc::error::DisplayErrorContext;\nuse aws_sdk_ssooidc::operation::create_token::CreateTokenOutput;\nuse aws_sdk_ssooidc::Client as SsoOidcClient;\nuse aws_smithy_async::time::SharedTimeSource;\nuse aws_smithy_runtime::expiring_cache::ExpiringCache;\nuse aws_smithy_runtime_api::client::identity::http::Token;\nuse aws_smithy_runtime_api::client::identity::{IdentityFuture, ResolveIdentity};\nuse aws_smithy_runtime_api::client::runtime_components::RuntimeComponents;\nuse aws_smithy_types::config_bag::ConfigBag;\nuse aws_types::os_shim_internal::{Env, Fs};\nuse aws_types::region::Region;\nuse aws_types::SdkConfig;\nuse std::error::Error as StdError;\nuse std::fmt;\nuse std::sync::{Arc, Mutex};\nuse std::time::{Duration, SystemTime};\nuse zeroize::Zeroizing;\n\nconst REFRESH_BUFFER_TIME: Duration = Duration::from_secs(5 * 60 /* 5 minutes */);\nconst MIN_TIME_BETWEEN_REFRESH: Duration = Duration::from_secs(30);\n\n/// SSO Token Provider\n///\n/// This token provider will use cached SSO tokens stored in `~/.aws/sso/cache/<hash>.json`.\n/// `<hash>` is computed based on the configured [`session_name`](Builder::session_name).\n///\n/// If possible, the cached token will be refreshed when it gets close to expiring.\n#[derive(Debug)]\npub struct SsoTokenProvider {\n    inner: Arc<Inner>,\n    token_cache: ExpiringCache<CachedSsoToken, SsoTokenProviderError>,\n}\n\n#[derive(Debug)]\nstruct Inner {\n    env: Env,\n    fs: Fs,\n    region: Region,\n    session_name: String,\n    start_url: String,\n    sdk_config: SdkConfig,\n    last_refresh_attempt: Mutex<Option<SystemTime>>,\n}\n\nimpl SsoTokenProvider {\n    /// Creates a `SsoTokenProvider` builder.\n    pub fn builder() -> Builder {\n        Default::default()\n    }\n\n    async fn refresh_cached_token(\n        inner: &Inner,\n        cached_token: &CachedSsoToken,\n        identifier: &str,\n        now: SystemTime,\n    ) -> Result<Option<CachedSsoToken>, SsoTokenProviderError> {\n        // TODO(enableNewSmithyRuntimeCleanup): Use `customize().config_override()` to set the region instead of creating a new client once middleware is removed\n        let config = inner\n            .sdk_config\n            .to_builder()\n            .region(Some(inner.region.clone()))\n            .identity_cache(IdentityCache::no_cache())\n            .build();\n        let client = SsoOidcClient::new(&config);\n        let resp = client\n            .create_token()\n            .grant_type(\"refresh_token\")\n            .client_id(\n                cached_token\n                    .client_id\n                    .as_ref()\n                    .expect(\"required for token refresh\")\n                    .clone(),\n            )\n            .client_secret(\n                cached_token\n                    .client_secret\n                    .as_ref()\n                    .expect(\"required for token refresh\")\n                    .as_str(),\n            )\n            .refresh_token(\n                cached_token\n                    .refresh_token\n                    .as_ref()\n                    .expect(\"required for token refresh\")\n                    .as_str(),\n            )\n            .send()\n            .await;\n        match resp {\n            Ok(CreateTokenOutput {\n                access_token: Some(access_token),\n                refresh_token,\n                expires_in,\n                ..\n            }) => {\n                let refreshed_token = CachedSsoToken {\n                    access_token: Zeroizing::new(access_token),\n                    client_id: cached_token.client_id.clone(),\n                    client_secret: cached_token.client_secret.clone(),\n                    expires_at: now\n                        + Duration::from_secs(\n                            u64::try_from(expires_in)\n                                .map_err(|_| SsoTokenProviderError::BadExpirationTimeFromSsoOidc)?,\n                        ),\n                    refresh_token: refresh_token\n                        .map(Zeroizing::new)\n                        .or_else(|| cached_token.refresh_token.clone()),\n                    region: Some(inner.region.to_string()),\n                    registration_expires_at: cached_token.registration_expires_at,\n                    start_url: Some(inner.start_url.clone()),\n                };\n                save_cached_token(&inner.env, &inner.fs, identifier, &refreshed_token).await?;\n                tracing::debug!(\"saved refreshed SSO token\");\n                Ok(Some(refreshed_token))\n            }\n            Ok(_) => {\n                tracing::debug!(\"SSO OIDC CreateToken responded without an access token\");\n                Ok(None)\n            }\n            Err(err) => {\n                tracing::debug!(\n                    \"call to SSO OIDC CreateToken for SSO token refresh failed: {}\",\n                    DisplayErrorContext(&err)\n                );\n                Ok(None)\n            }\n        }\n    }\n\n    pub(super) fn resolve_token(\n        &self,\n        time_source: SharedTimeSource,\n    ) -> impl std::future::Future<Output = Result<CachedSsoToken, TokenError>> + 'static {\n        let token_cache = self.token_cache.clone();\n        let inner = self.inner.clone();\n\n        async move {\n            if let Some(token) = token_cache\n                .yield_or_clear_if_expired(time_source.now())\n                .await\n            {\n                tracing::debug!(\"using cached SSO token\");\n                return Ok(token);\n            }\n            let token = token_cache\n                .get_or_load(|| async move {\n                    tracing::debug!(\"expiring cache asked for an updated SSO token\");\n                    let mut token =\n                        load_cached_token(&inner.env, &inner.fs, &inner.session_name).await?;\n                    tracing::debug!(\"loaded cached SSO token\");\n\n                    let now = time_source.now();\n                    let expired = token.expires_at <= now;\n                    let expires_soon = token.expires_at - REFRESH_BUFFER_TIME <= now;\n                    let last_refresh = *inner.last_refresh_attempt.lock().unwrap();\n                    let min_time_passed = last_refresh\n                        .map(|lr| {\n                            now.duration_since(lr).expect(\"last_refresh is in the past\")\n                                >= MIN_TIME_BETWEEN_REFRESH\n                        })\n                        .unwrap_or(true);\n                    let registration_expired = token\n                        .registration_expires_at\n                        .map(|t| t <= now)\n                        .unwrap_or(true);\n                    let refreshable =\n                        token.refreshable() && min_time_passed && !registration_expired;\n\n                    tracing::debug!(\n                        expired = ?expired,\n                        expires_soon = ?expires_soon,\n                        min_time_passed = ?min_time_passed,\n                        registration_expired = ?registration_expired,\n                        refreshable = ?refreshable,\n                        will_refresh = ?(expires_soon && refreshable),\n                        \"cached SSO token refresh decision\"\n                    );\n\n                    // Fail fast if the token has expired and we can't refresh it\n                    if expired && !refreshable {\n                        tracing::debug!(\"cached SSO token is expired and cannot be refreshed\");\n                        return Err(SsoTokenProviderError::ExpiredToken);\n                    }\n\n                    // Refresh the token if it is going to expire soon\n                    if expires_soon && refreshable {\n                        tracing::debug!(\"attempting to refresh SSO token\");\n                        if let Some(refreshed_token) =\n                            Self::refresh_cached_token(&inner, &token, &inner.session_name, now)\n                                .await?\n                        {\n                            token = refreshed_token;\n                        }\n                        *inner.last_refresh_attempt.lock().unwrap() = Some(now);\n                    }\n\n                    let expires_at = token.expires_at;\n                    Ok((token, expires_at))\n                })\n                .await\n                .map_err(TokenError::provider_error)?;\n\n            Ok(token)\n        }\n    }\n}\n\nimpl ProvideToken for SsoTokenProvider {\n    fn provide_token<'a>(&'a self) -> ProvideTokenFuture<'a>\n    where\n        Self: 'a,\n    {\n        let time_source = self\n            .inner\n            .sdk_config\n            .time_source()\n            .expect(\"a time source required by SsoTokenProvider\");\n        let token_future = self.resolve_token(time_source);\n        ProvideTokenFuture::new(Box::pin(async move {\n            let token = token_future.await?;\n            Ok(Token::new(\n                token.access_token.as_str(),\n                Some(token.expires_at),\n            ))\n        }))\n    }\n}\n\nimpl ResolveIdentity for SsoTokenProvider {\n    fn resolve_identity<'a>(\n        &'a self,\n        runtime_components: &'a RuntimeComponents,\n        config_bag: &'a ConfigBag,\n    ) -> IdentityFuture<'a> {\n        IdentityFuture::new(Box::pin(async move {\n            self.provide_token()\n                .await?\n                .resolve_identity(runtime_components, config_bag)\n                .await\n        }))\n    }\n}\n\n/// Builder for [`SsoTokenProvider`].\n#[derive(Debug, Default)]\npub struct Builder {\n    sdk_config: Option<SdkConfig>,\n    region: Option<Region>,\n    session_name: Option<String>,\n    start_url: Option<String>,\n}\n\nimpl Builder {\n    /// Creates a new builder for [`SsoTokenProvider`].\n    pub fn new() -> Self {\n        Default::default()\n    }\n\n    /// Override the configuration used for this provider\n    pub fn configure(mut self, sdk_config: &SdkConfig) -> Self {\n        self.sdk_config = Some(sdk_config.clone());\n        self\n    }\n\n    /// Sets the SSO region.\n    ///\n    /// This is a required field.\n    pub fn region(mut self, region: impl Into<Region>) -> Self {\n        self.region = Some(region.into());\n        self\n    }\n\n    /// Sets the SSO region.\n    ///\n    /// This is a required field.\n    pub fn set_region(&mut self, region: Option<Region>) -> &mut Self {\n        self.region = region;\n        self\n    }\n\n    /// Sets the SSO session name.\n    ///\n    /// This is a required field.\n    pub fn session_name(mut self, session_name: impl Into<String>) -> Self {\n        self.session_name = Some(session_name.into());\n        self\n    }\n\n    /// Sets the SSO session name.\n    ///\n    /// This is a required field.\n    pub fn set_session_name(&mut self, session_name: Option<String>) -> &mut Self {\n        self.session_name = session_name;\n        self\n    }\n\n    /// Sets the SSO start URL.\n    ///\n    /// This is a required field.\n    pub fn start_url(mut self, start_url: impl Into<String>) -> Self {\n        self.start_url = Some(start_url.into());\n        self\n    }\n\n    /// Sets the SSO start URL.\n    ///\n    /// This is a required field.\n    pub fn set_start_url(&mut self, start_url: Option<String>) -> &mut Self {\n        self.start_url = start_url;\n        self\n    }\n\n    /// Builds the [`SsoTokenProvider`].\n    ///\n    /// # Panics\n    ///\n    /// This will panic if any of the required fields are not given.\n    pub async fn build(mut self) -> SsoTokenProvider {\n        if self.sdk_config.is_none() {\n            self.sdk_config = Some(crate::load_defaults(crate::BehaviorVersion::latest()).await);\n        }\n        self.build_with(Env::real(), Fs::real())\n    }\n\n    pub(crate) fn build_with(self, env: Env, fs: Fs) -> SsoTokenProvider {\n        SsoTokenProvider {\n            inner: Arc::new(Inner {\n                env,\n                fs,\n                region: self.region.expect(\"region is required\"),\n                session_name: self.session_name.expect(\"session_name is required\"),\n                start_url: self.start_url.expect(\"start_url is required\"),\n                sdk_config: self.sdk_config.expect(\"sdk_config is required\"),\n                last_refresh_attempt: Mutex::new(None),\n            }),\n            token_cache: ExpiringCache::new(REFRESH_BUFFER_TIME),\n        }\n    }\n}\n\n#[derive(Debug)]\npub(super) enum SsoTokenProviderError {\n    BadExpirationTimeFromSsoOidc,\n    FailedToLoadToken {\n        source: Box<dyn StdError + Send + Sync>,\n    },\n    ExpiredToken,\n}\n\nimpl fmt::Display for SsoTokenProviderError {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        match self {\n            Self::BadExpirationTimeFromSsoOidc => {\n                f.write_str(\"SSO OIDC responded with a negative expiration duration\")\n            }\n            Self::ExpiredToken => f.write_str(\"the SSO token has expired and cannot be refreshed\"),\n            Self::FailedToLoadToken { .. } => f.write_str(\"failed to load the cached SSO token\"),\n        }\n    }\n}\n\nimpl StdError for SsoTokenProviderError {\n    fn cause(&self) -> Option<&dyn StdError> {\n        match self {\n            Self::BadExpirationTimeFromSsoOidc => None,\n            Self::ExpiredToken => None,\n            Self::FailedToLoadToken { source } => Some(source.as_ref()),\n        }\n    }\n}\n\nimpl From<CachedSsoTokenError> for SsoTokenProviderError {\n    fn from(source: CachedSsoTokenError) -> Self {\n        Self::FailedToLoadToken {\n            source: source.into(),\n        }\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use aws_sdk_sso::config::{AsyncSleep, SharedAsyncSleep};\n    use aws_smithy_async::rt::sleep::TokioSleep;\n    use aws_smithy_async::test_util::instant_time_and_sleep;\n    use aws_smithy_async::time::{StaticTimeSource, TimeSource};\n    use aws_smithy_http_client::test_util::{capture_request, ReplayEvent, StaticReplayClient};\n    use aws_smithy_runtime::{\n        assert_str_contains, test_util::capture_test_logs::capture_test_logs,\n    };\n    use aws_smithy_runtime_api::client::http::HttpClient;\n    use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder;\n    use aws_smithy_types::body::SdkBody;\n    use aws_smithy_types::date_time::Format;\n    use aws_smithy_types::retry::RetryConfig;\n    use aws_smithy_types::DateTime;\n\n    fn time(s: &str) -> SystemTime {\n        SystemTime::try_from(DateTime::from_str(s, Format::DateTime).unwrap()).unwrap()\n    }\n\n    struct TestHarness {\n        time_source: SharedTimeSource,\n        token_provider: SsoTokenProvider,\n        env: Env,\n        fs: Fs,\n    }\n\n    impl TestHarness {\n        fn new(\n            time_source: impl TimeSource + 'static,\n            sleep_impl: impl AsyncSleep + 'static,\n            http_client: impl HttpClient + 'static,\n            fs: Fs,\n        ) -> Self {\n            let env = Env::from_slice(&[(\"HOME\", \"/home/user\")]);\n            let time_source = SharedTimeSource::new(time_source);\n            let config = SdkConfig::builder()\n                .http_client(http_client)\n                .time_source(time_source.clone())\n                .sleep_impl(SharedAsyncSleep::new(sleep_impl))\n                // disable retry to simplify testing\n                .retry_config(RetryConfig::disabled())\n                .behavior_version(crate::BehaviorVersion::latest())\n                .build();\n            Self {\n                time_source,\n                token_provider: SsoTokenProvider::builder()\n                    .configure(&config)\n                    .session_name(\"test\")\n                    .region(Region::new(\"us-west-2\"))\n                    .start_url(\"https://d-123.awsapps.com/start\")\n                    .build_with(env.clone(), fs.clone()),\n                env,\n                fs,\n            }\n        }\n\n        async fn expect_sso_token(&self, value: &str, expires_at: &str) -> CachedSsoToken {\n            let token = self\n                .token_provider\n                .resolve_token(self.time_source.clone())\n                .await\n                .unwrap();\n            assert_eq!(value, token.access_token.as_str());\n            assert_eq!(time(expires_at), token.expires_at);\n            token\n        }\n\n        async fn expect_token(&self, value: &str, expires_at: &str) {\n            let runtime_components = RuntimeComponentsBuilder::for_tests()\n                .with_time_source(Some(self.time_source.clone()))\n                .build()\n                .unwrap();\n            let config_bag = ConfigBag::base();\n            let identity = self\n                .token_provider\n                .resolve_identity(&runtime_components, &config_bag)\n                .await\n                .unwrap();\n            let token = identity.data::<Token>().unwrap().clone();\n            assert_eq!(value, token.token());\n            assert_eq!(time(expires_at), identity.expiration().unwrap());\n        }\n\n        async fn expect_expired_token_err(&self) {\n            let err = DisplayErrorContext(\n                &self\n                    .token_provider\n                    .resolve_token(self.time_source.clone())\n                    .await\n                    .expect_err(\"expected failure\"),\n            )\n            .to_string();\n            assert_str_contains!(err, \"the SSO token has expired\");\n        }\n\n        fn last_refresh_attempt_time(&self) -> Option<String> {\n            self.token_provider\n                .inner\n                .last_refresh_attempt\n                .lock()\n                .unwrap()\n                .map(|time| {\n                    DateTime::try_from(time)\n                        .unwrap()\n                        .fmt(Format::DateTime)\n                        .unwrap()\n                })\n        }\n    }\n\n    // TODO(https://github.com/awslabs/aws-sdk-rust/issues/1117) This test is ignored on Windows because it uses Unix-style paths\n    #[cfg_attr(windows, ignore)]\n    #[tokio::test]\n    async fn use_unexpired_cached_token() {\n        let fs = Fs::from_slice(&[(\n            \"/home/user/.aws/sso/cache/a94a8fe5ccb19ba61c4c0873d391e987982fbbd3.json\",\n            r#\"\n            { \"accessToken\": \"some-token\",\n              \"expiresAt\": \"1975-01-01T00:00:00Z\" }\n            \"#,\n        )]);\n\n        let now = time(\"1974-12-25T00:00:00Z\");\n        let time_source = SharedTimeSource::new(StaticTimeSource::new(now));\n\n        let (conn, req_rx) = capture_request(None);\n        let harness = TestHarness::new(time_source, TokioSleep::new(), conn, fs);\n\n        harness\n            .expect_token(\"some-token\", \"1975-01-01T00:00:00Z\")\n            .await;\n        // it can't refresh this token\n        req_rx.expect_no_request();\n    }\n\n    // TODO(https://github.com/awslabs/aws-sdk-rust/issues/1117) This test is ignored on Windows because it uses Unix-style paths\n    #[cfg_attr(windows, ignore)]\n    #[tokio::test]\n    async fn expired_cached_token() {\n        let fs = Fs::from_slice(&[(\n            \"/home/user/.aws/sso/cache/a94a8fe5ccb19ba61c4c0873d391e987982fbbd3.json\",\n            r#\"\n            { \"accessToken\": \"some-token\",\n              \"expiresAt\": \"1999-12-15T00:00:00Z\" }\n            \"#,\n        )]);\n\n        let now = time(\"2023-01-01T00:00:00Z\");\n        let time_source = SharedTimeSource::new(StaticTimeSource::new(now));\n\n        let (conn, req_rx) = capture_request(None);\n        let harness = TestHarness::new(time_source, TokioSleep::new(), conn, fs);\n\n        harness.expect_expired_token_err().await;\n        // it can't refresh this token\n        req_rx.expect_no_request();\n    }\n\n    // TODO(https://github.com/awslabs/aws-sdk-rust/issues/1117) This test is ignored on Windows because it uses Unix-style paths\n    #[cfg_attr(windows, ignore)]\n    #[tokio::test]\n    async fn expired_token_and_expired_client_registration() {\n        let fs = Fs::from_slice(&[(\n            \"/home/user/.aws/sso/cache/a94a8fe5ccb19ba61c4c0873d391e987982fbbd3.json\",\n            r#\"\n            { \"startUrl\": \"https://d-123.awsapps.com/start\",\n              \"region\": \"us-west-2\",\n              \"accessToken\": \"cachedtoken\",\n              \"expiresAt\": \"2021-10-25T13:00:00Z\",\n              \"clientId\": \"clientid\",\n              \"clientSecret\": \"YSBzZWNyZXQ=\",\n              \"registrationExpiresAt\": \"2021-11-25T13:30:00Z\",\n              \"refreshToken\": \"cachedrefreshtoken\" }\n            \"#,\n        )]);\n\n        let now = time(\"2023-08-11T04:11:17Z\");\n        let time_source = SharedTimeSource::new(StaticTimeSource::new(now));\n\n        let (conn, req_rx) = capture_request(None);\n        let harness = TestHarness::new(time_source, TokioSleep::new(), conn, fs);\n\n        // the registration has expired, so the token can't be refreshed\n        harness.expect_expired_token_err().await;\n        req_rx.expect_no_request();\n    }\n\n    // TODO(https://github.com/awslabs/aws-sdk-rust/issues/1117) This test is ignored on Windows because it uses Unix-style paths\n    #[cfg_attr(windows, ignore)]\n    #[tokio::test]\n    async fn expired_token_refresh_with_refresh_token() {\n        let fs = Fs::from_slice(&[(\n            \"/home/user/.aws/sso/cache/a94a8fe5ccb19ba61c4c0873d391e987982fbbd3.json\",\n            r#\"\n            { \"startUrl\": \"https://d-123.awsapps.com/start\",\n              \"region\": \"us-west-2\",\n              \"accessToken\": \"cachedtoken\",\n              \"expiresAt\": \"2021-12-25T13:00:00Z\",\n              \"clientId\": \"clientid\",\n              \"clientSecret\": \"YSBzZWNyZXQ=\",\n              \"registrationExpiresAt\": \"2022-12-25T13:30:00Z\",\n              \"refreshToken\": \"cachedrefreshtoken\" }\n            \"#,\n        )]);\n\n        let now = time(\"2021-12-25T13:30:00Z\");\n        let time_source = SharedTimeSource::new(StaticTimeSource::new(now));\n\n        let (conn, req_rx) = capture_request(Some(\n            http::Response::builder()\n                .status(200)\n                .body(SdkBody::from(\n                    r#\"\n                    { \"tokenType\": \"Bearer\",\n                      \"accessToken\": \"newtoken\",\n                      \"expiresIn\": 28800,\n                      \"refreshToken\": \"newrefreshtoken\" }\n                    \"#,\n                ))\n                .unwrap(),\n        ));\n        let harness = TestHarness::new(time_source, TokioSleep::new(), conn, fs);\n\n        let returned_token = harness\n            .expect_sso_token(\"newtoken\", \"2021-12-25T21:30:00Z\")\n            .await;\n        let cached_token = load_cached_token(&harness.env, &harness.fs, \"test\")\n            .await\n            .unwrap();\n        assert_eq!(returned_token, cached_token);\n        assert_eq!(\n            \"newrefreshtoken\",\n            returned_token.refresh_token.unwrap().as_str()\n        );\n        assert_eq!(\n            \"https://d-123.awsapps.com/start\",\n            returned_token.start_url.unwrap()\n        );\n        assert_eq!(\"us-west-2\", returned_token.region.unwrap().to_string());\n        assert_eq!(\"clientid\", returned_token.client_id.unwrap());\n        assert_eq!(\n            \"YSBzZWNyZXQ=\",\n            returned_token.client_secret.unwrap().as_str()\n        );\n        assert_eq!(\n            SystemTime::UNIX_EPOCH + Duration::from_secs(1_671_975_000),\n            returned_token.registration_expires_at.unwrap()\n        );\n\n        let refresh_req = req_rx.expect_request();\n        let parsed_req: serde_json::Value =\n            serde_json::from_slice(refresh_req.body().bytes().unwrap()).unwrap();\n        let parsed_req = parsed_req.as_object().unwrap();\n        assert_eq!(\n            \"clientid\",\n            parsed_req.get(\"clientId\").unwrap().as_str().unwrap()\n        );\n        assert_eq!(\n            \"YSBzZWNyZXQ=\",\n            parsed_req.get(\"clientSecret\").unwrap().as_str().unwrap()\n        );\n        assert_eq!(\n            \"refresh_token\",\n            parsed_req.get(\"grantType\").unwrap().as_str().unwrap()\n        );\n        assert_eq!(\n            \"cachedrefreshtoken\",\n            parsed_req.get(\"refreshToken\").unwrap().as_str().unwrap()\n        );\n    }\n\n    // TODO(https://github.com/awslabs/aws-sdk-rust/issues/1117) This test is ignored on Windows because it uses Unix-style paths\n    #[cfg_attr(windows, ignore)]\n    #[tokio::test]\n    async fn expired_token_refresh_fails() {\n        let fs = Fs::from_slice(&[(\n            \"/home/user/.aws/sso/cache/a94a8fe5ccb19ba61c4c0873d391e987982fbbd3.json\",\n            r#\"\n            { \"startUrl\": \"https://d-123.awsapps.com/start\",\n              \"region\": \"us-west-2\",\n              \"accessToken\": \"cachedtoken\",\n              \"expiresAt\": \"2021-12-25T13:00:00Z\",\n              \"clientId\": \"clientid\",\n              \"clientSecret\": \"YSBzZWNyZXQ=\",\n              \"registrationExpiresAt\": \"2022-12-25T13:30:00Z\",\n              \"refreshToken\": \"cachedrefreshtoken\" }\n            \"#,\n        )]);\n\n        let now = time(\"2021-12-25T13:30:00Z\");\n        let time_source = SharedTimeSource::new(StaticTimeSource::new(now));\n\n        let (conn, req_rx) = capture_request(Some(\n            http::Response::builder()\n                .status(500)\n                .body(SdkBody::from(\"\"))\n                .unwrap(),\n        ));\n        let harness = TestHarness::new(time_source, TokioSleep::new(), conn, fs);\n\n        // it should return the previous token since refresh failed and it hasn't expired yet\n        let returned_token = harness\n            .expect_sso_token(\"cachedtoken\", \"2021-12-25T13:00:00Z\")\n            .await;\n        let cached_token = load_cached_token(&harness.env, &harness.fs, \"test\")\n            .await\n            .unwrap();\n        assert_eq!(returned_token, cached_token);\n\n        let _ = req_rx.expect_request();\n    }\n\n    // TODO(https://github.com/awslabs/aws-sdk-rust/issues/1117) This test is ignored on Windows because it uses Unix-style paths\n    #[cfg_attr(windows, ignore)]\n    // Expired token refresh without new refresh token\n    #[tokio::test]\n    async fn expired_token_refresh_without_new_refresh_token() {\n        let fs = Fs::from_slice(&[(\n            \"/home/user/.aws/sso/cache/a94a8fe5ccb19ba61c4c0873d391e987982fbbd3.json\",\n            r#\"\n            { \"startUrl\": \"https://d-123.awsapps.com/start\",\n              \"region\": \"us-west-2\",\n              \"accessToken\": \"cachedtoken\",\n              \"expiresAt\": \"2021-12-25T13:00:00Z\",\n              \"clientId\": \"clientid\",\n              \"clientSecret\": \"YSBzZWNyZXQ=\",\n              \"registrationExpiresAt\": \"2022-12-25T13:30:00Z\",\n              \"refreshToken\": \"cachedrefreshtoken\" }\n            \"#,\n        )]);\n\n        let now = time(\"2021-12-25T13:30:00Z\");\n        let time_source = SharedTimeSource::new(StaticTimeSource::new(now));\n\n        let (conn, req_rx) = capture_request(Some(\n            http::Response::builder()\n                .status(200)\n                .body(SdkBody::from(\n                    r#\"\n                    { \"tokenType\": \"Bearer\",\n                      \"accessToken\": \"newtoken\",\n                      \"expiresIn\": 28800 }\n                    \"#,\n                ))\n                .unwrap(),\n        ));\n        let harness = TestHarness::new(time_source, TokioSleep::new(), conn, fs);\n\n        let returned_token = harness\n            .expect_sso_token(\"newtoken\", \"2021-12-25T21:30:00Z\")\n            .await;\n        let cached_token = load_cached_token(&harness.env, &harness.fs, \"test\")\n            .await\n            .unwrap();\n        assert_eq!(returned_token, cached_token);\n        assert_eq!(\n            \"cachedrefreshtoken\",\n            returned_token.refresh_token.unwrap().as_str(),\n            \"it should have kept the old refresh token\"\n        );\n\n        let _ = req_rx.expect_request();\n    }\n\n    // TODO(https://github.com/awslabs/aws-sdk-rust/issues/1117) This test is ignored on Windows because it uses Unix-style paths\n    #[cfg_attr(windows, ignore)]\n    #[tokio::test]\n    async fn refresh_timings() {\n        let _logs = capture_test_logs();\n\n        let start_time = DateTime::from_str(\"2023-01-01T00:00:00Z\", Format::DateTime).unwrap();\n        let (time_source, sleep_impl) = instant_time_and_sleep(start_time.try_into().unwrap());\n        let shared_time_source = SharedTimeSource::new(time_source.clone());\n\n        let fs = Fs::from_slice(&[(\n            \"/home/user/.aws/sso/cache/a94a8fe5ccb19ba61c4c0873d391e987982fbbd3.json\",\n            r#\"\n            { \"startUrl\": \"https://d-123.awsapps.com/start\",\n              \"region\": \"us-west-2\",\n              \"accessToken\": \"first_token\",\n              \"_comment_expiresAt\": \"-------- Ten minutes after the start time: ------\",\n              \"expiresAt\": \"2023-01-01T00:10:00Z\",\n              \"clientId\": \"clientid\",\n              \"clientSecret\": \"YSBzZWNyZXQ=\",\n              \"registrationExpiresAt\": \"2023-01-02T12:00:00Z\",\n              \"refreshToken\": \"cachedrefreshtoken\" }\n            \"#,\n        )]);\n\n        let events = vec![\n            // First refresh attempt should fail\n            ReplayEvent::new(\n                http::Request::new(SdkBody::from(\"\")), // don't really care what the request looks like\n                http::Response::builder()\n                    .status(500)\n                    .body(SdkBody::from(\"\"))\n                    .unwrap(),\n            ),\n            // Second refresh attempt should also fail\n            ReplayEvent::new(\n                http::Request::new(SdkBody::from(\"\")), // don't really care what the request looks like\n                http::Response::builder()\n                    .status(500)\n                    .body(SdkBody::from(\"\"))\n                    .unwrap(),\n            ),\n            // Third refresh attempt will succeed\n            ReplayEvent::new(\n                http::Request::new(SdkBody::from(\"\")), // don't really care what the request looks like\n                http::Response::builder()\n                    .status(200)\n                    .body(SdkBody::from(\n                        r#\"\n                        { \"tokenType\": \"Bearer\",\n                          \"accessToken\": \"second_token\",\n                          \"expiresIn\": 28800 }\n                        \"#,\n                    ))\n                    .unwrap(),\n            ),\n        ];\n        let http_client = StaticReplayClient::new(events);\n        let harness = TestHarness::new(shared_time_source, sleep_impl, http_client, fs);\n\n        tracing::info!(\"test: first token retrieval should return the cached token\");\n        assert!(\n            harness.last_refresh_attempt_time().is_none(),\n            \"the last attempt time should start empty\"\n        );\n        harness\n            .expect_token(\"first_token\", \"2023-01-01T00:10:00Z\")\n            .await;\n        assert!(\n            harness.last_refresh_attempt_time().is_none(),\n            \"it shouldn't have tried to refresh, so the last refresh attempt time shouldn't be set\"\n        );\n\n        tracing::info!(\"test: advance 3 minutes\");\n        time_source.advance(Duration::from_secs(3 * 60));\n\n        tracing::info!(\"test: the token shouldn't get refreshed since it's not in the 5 minute buffer time yet\");\n        harness\n            .expect_token(\"first_token\", \"2023-01-01T00:10:00Z\")\n            .await;\n        assert!(\n            harness.last_refresh_attempt_time().is_none(),\n            \"it shouldn't have tried to refresh since the token isn't expiring soon\"\n        );\n\n        tracing::info!(\"test: advance 2 minutes\");\n        time_source.advance(Duration::from_secs(2 * 60));\n\n        tracing::info!(\n            \"test: the token will fail to refresh, and the old cached token will be returned\"\n        );\n        harness\n            .expect_token(\"first_token\", \"2023-01-01T00:10:00Z\")\n            .await;\n        assert_eq!(\n            Some(\"2023-01-01T00:05:00Z\"),\n            harness.last_refresh_attempt_time().as_deref(),\n            \"it should update the last refresh attempt time since the expiration time is soon\"\n        );\n\n        tracing::info!(\"test: advance 15 seconds\");\n        time_source.advance(Duration::from_secs(15));\n\n        tracing::info!(\n            \"test: the token will not refresh because the minimum time hasn't passed between attempts\"\n        );\n        harness\n            .expect_token(\"first_token\", \"2023-01-01T00:10:00Z\")\n            .await;\n\n        tracing::info!(\"test: advance 15 seconds\");\n        time_source.advance(Duration::from_secs(15));\n\n        tracing::info!(\n            \"test: the token will fail to refresh, and the old cached token will be returned\"\n        );\n        harness\n            .expect_token(\"first_token\", \"2023-01-01T00:10:00Z\")\n            .await;\n\n        tracing::info!(\"test: advance 30 seconds\");\n        time_source.advance(Duration::from_secs(30));\n\n        tracing::info!(\"test: the token will refresh successfully\");\n        harness\n            .expect_token(\"second_token\", \"2023-01-01T08:06:00Z\")\n            .await;\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/src/sso.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! SSO Credentials and Token providers\n\npub mod credentials;\n\npub use credentials::SsoCredentialsProvider;\n\npub mod token;\n\npub use token::SsoTokenProvider;\n\nmod cache;\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/src/stalled_stream_protection.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Stalled stream protection configuration\n\n// Re-export from aws-smithy-types\npub use aws_smithy_runtime_api::client::stalled_stream_protection::StalledStreamProtectionConfig;\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/src/sts/assume_role.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Assume credentials for a role through the AWS Security Token Service (STS).\n\nuse aws_credential_types::credential_feature::AwsCredentialFeature;\nuse aws_credential_types::provider::{\n    self, error::CredentialsError, future, ProvideCredentials, SharedCredentialsProvider,\n};\nuse aws_sdk_sts::operation::assume_role::builders::AssumeRoleFluentBuilder;\nuse aws_sdk_sts::operation::assume_role::AssumeRoleError;\nuse aws_sdk_sts::types::{PolicyDescriptorType, Tag};\nuse aws_sdk_sts::Client as StsClient;\nuse aws_smithy_runtime::client::identity::IdentityCache;\nuse aws_smithy_runtime_api::client::result::SdkError;\nuse aws_smithy_types::error::display::DisplayErrorContext;\nuse aws_types::region::Region;\nuse aws_types::SdkConfig;\nuse std::time::Duration;\nuse tracing::Instrument;\n\n/// Credentials provider that uses credentials provided by another provider to assume a role\n/// through the AWS Security Token Service (STS).\n///\n/// When asked to provide credentials, this provider will first invoke the inner credentials\n/// provider to get AWS credentials for STS. Then, it will call STS to get assumed credentials for\n/// the desired role.\n///\n/// # Examples\n/// Create an AssumeRoleProvider explicitly set to us-east-2 that utilizes the default credentials chain.\n/// ```no_run\n/// use aws_config::sts::AssumeRoleProvider;\n/// use aws_types::region::Region;\n/// # async fn docs() {\n/// let provider = AssumeRoleProvider::builder(\"arn:aws:iam::123456789012:role/demo\")\n///   .region(Region::from_static(\"us-east-2\"))\n///   .session_name(\"testAR\")\n///   .build().await;\n/// }\n/// ```\n///\n/// Create an AssumeRoleProvider from an explicitly configured base configuration.\n/// ```no_run\n/// use aws_config::sts::AssumeRoleProvider;\n/// use aws_types::region::Region;\n/// # async fn docs() {\n/// let conf = aws_config::from_env().use_fips(true).load().await;\n/// let provider = AssumeRoleProvider::builder(\"arn:aws:iam::123456789012:role/demo\")\n///   .configure(&conf)\n///   .session_name(\"testAR\")\n///   .build().await;\n/// }\n/// ```\n///\n/// Create an AssumeroleProvider that sources credentials from a provider credential provider:\n/// ```no_run\n/// use aws_config::sts::AssumeRoleProvider;\n/// use aws_types::region::Region;\n/// use aws_config::environment::EnvironmentVariableCredentialsProvider;\n/// # async fn docs() {\n/// let provider = AssumeRoleProvider::builder(\"arn:aws:iam::123456789012:role/demo\")\n///   .session_name(\"test-assume-role-session\")\n///   // only consider environment variables, explicitly.\n///   .build_from_provider(EnvironmentVariableCredentialsProvider::new()).await;\n/// }\n/// ```\n///\n#[derive(Debug)]\npub struct AssumeRoleProvider {\n    inner: Inner,\n}\n\n#[derive(Debug)]\nstruct Inner {\n    fluent_builder: AssumeRoleFluentBuilder,\n}\n\nimpl AssumeRoleProvider {\n    /// Build a new role-assuming provider for the given role.\n    ///\n    /// The `role` argument should take the form an Amazon Resource Name (ARN) like\n    ///\n    /// ```text\n    /// arn:aws:iam::123456789012:role/example\n    /// ```\n    pub fn builder(role: impl Into<String>) -> AssumeRoleProviderBuilder {\n        AssumeRoleProviderBuilder::new(role.into())\n    }\n}\n\n/// A builder for [`AssumeRoleProvider`].\n///\n/// Construct one through [`AssumeRoleProvider::builder`].\n#[derive(Debug)]\npub struct AssumeRoleProviderBuilder {\n    role_arn: String,\n    external_id: Option<String>,\n    session_name: Option<String>,\n    session_length: Option<Duration>,\n    policy: Option<String>,\n    policy_arns: Option<Vec<PolicyDescriptorType>>,\n    region_override: Option<Region>,\n    sdk_config: Option<SdkConfig>,\n    tags: Option<Vec<Tag>>,\n}\n\nimpl AssumeRoleProviderBuilder {\n    /// Start a new assume role builder for the given role.\n    ///\n    /// The `role` argument should take the form an Amazon Resource Name (ARN) like\n    ///\n    /// ```text\n    /// arn:aws:iam::123456789012:role/example\n    /// ```\n    pub fn new(role: impl Into<String>) -> Self {\n        Self {\n            role_arn: role.into(),\n            external_id: None,\n            session_name: None,\n            session_length: None,\n            policy: None,\n            policy_arns: None,\n            sdk_config: None,\n            region_override: None,\n            tags: None,\n        }\n    }\n\n    /// Set a unique identifier that might be required when you assume a role in another account.\n    ///\n    /// If the administrator of the account to which the role belongs provided you with an external\n    /// ID, then provide that value in this parameter. The value can be any string, such as a\n    /// passphrase or account number.\n    pub fn external_id(mut self, id: impl Into<String>) -> Self {\n        self.external_id = Some(id.into());\n        self\n    }\n\n    /// Set an identifier for the assumed role session.\n    ///\n    /// Use the role session name to uniquely identify a session when the same role is assumed by\n    /// different principals or for different reasons. In cross-account scenarios, the role session\n    /// name is visible to, and can be logged by the account that owns the role. The role session\n    /// name is also used in the ARN of the assumed role principal.\n    pub fn session_name(mut self, name: impl Into<String>) -> Self {\n        self.session_name = Some(name.into());\n        self\n    }\n\n    /// Set an IAM policy in JSON format that you want to use as an inline session policy.\n    ///\n    /// This parameter is optional\n    /// For more information, see\n    /// [policy](aws_sdk_sts::operation::assume_role::builders::AssumeRoleInputBuilder::policy_arns)\n    pub fn policy(mut self, policy: impl Into<String>) -> Self {\n        self.policy = Some(policy.into());\n        self\n    }\n\n    /// Set the Amazon Resource Names (ARNs) of the IAM managed policies that you want to use as managed session policies.\n    ///\n    /// This parameter is optional.\n    /// For more information, see\n    /// [policy_arns](aws_sdk_sts::operation::assume_role::builders::AssumeRoleInputBuilder::policy_arns)\n    pub fn policy_arns(mut self, policy_arns: Vec<String>) -> Self {\n        self.policy_arns = Some(\n            policy_arns\n                .into_iter()\n                .map(|arn| PolicyDescriptorType::builder().arn(arn).build())\n                .collect::<Vec<_>>(),\n        );\n        self\n    }\n\n    /// Set the expiration time of the role session.\n    ///\n    /// When unset, this value defaults to 1 hour.\n    ///\n    /// The value specified can range from 900 seconds (15 minutes) up to the maximum session duration\n    /// set for the role. The maximum session duration setting can have a value from 1 hour to 12 hours.\n    /// If you specify a value higher than this setting or the administrator setting (whichever is lower),\n    /// **you will be unable to assume the role**. For example, if you specify a session duration of 12 hours,\n    /// but your administrator set the maximum session duration to 6 hours, you cannot assume the role.\n    ///\n    /// For more information, see\n    /// [duration_seconds](aws_sdk_sts::operation::assume_role::builders::AssumeRoleInputBuilder::duration_seconds)\n    pub fn session_length(mut self, length: Duration) -> Self {\n        self.session_length = Some(length);\n        self\n    }\n\n    /// Set the region to assume the role in.\n    ///\n    /// This dictates which STS endpoint the AssumeRole action is invoked on. This will override\n    /// a region set from `.configure(...)`\n    pub fn region(mut self, region: Region) -> Self {\n        self.region_override = Some(region);\n        self\n    }\n\n    /// Set the session tags\n    ///\n    /// A list of session tags that you want to pass. Each session tag consists of a key name and an associated value.\n    /// For more information, see `[Tag]`.\n    pub fn tags<K, V>(mut self, tags: impl IntoIterator<Item = (K, V)>) -> Self\n    where\n        K: Into<String>,\n        V: Into<String>,\n    {\n        self.tags = Some(\n            tags.into_iter()\n                // Unwrap won't fail as both key and value are specified.\n                // Currently Tag does not have an infallible build method.\n                .map(|(k, v)| {\n                    Tag::builder()\n                        .key(k)\n                        .value(v)\n                        .build()\n                        .expect(\"this is unreachable: both k and v are set\")\n                })\n                .collect::<Vec<_>>(),\n        );\n        self\n    }\n\n    /// Sets the configuration used for this provider\n    ///\n    /// This enables overriding the connection used to communicate with STS in addition to other internal\n    /// fields like the time source and sleep implementation used for caching.\n    ///\n    /// If this field is not provided, configuration from [`crate::load_from_env()`] is used.\n    ///\n    /// # Examples\n    /// ```rust\n    /// # async fn docs() {\n    /// use aws_types::region::Region;\n    /// use aws_config::sts::AssumeRoleProvider;\n    /// let config = aws_config::from_env().region(Region::from_static(\"us-west-2\")).load().await;\n    /// let assume_role_provider = AssumeRoleProvider::builder(\"arn:aws:iam::123456789012:role/example\")\n    ///   .configure(&config)\n    ///   .build();\n    /// }\n    pub fn configure(mut self, conf: &SdkConfig) -> Self {\n        self.sdk_config = Some(conf.clone());\n        self\n    }\n\n    /// Build a credentials provider for this role.\n    ///\n    /// Base credentials will be used from the [`SdkConfig`] set via [`Self::configure`] or loaded\n    /// from [`aws_config::from_env`](crate::from_env) if `configure` was never called.\n    pub async fn build(self) -> AssumeRoleProvider {\n        let mut conf = match self.sdk_config {\n            Some(conf) => conf,\n            None => crate::load_defaults(crate::BehaviorVersion::latest()).await,\n        };\n        // ignore a identity cache set from SdkConfig\n        conf = conf\n            .into_builder()\n            .identity_cache(IdentityCache::no_cache())\n            .build();\n\n        // set a region override if one exists\n        if let Some(region) = self.region_override {\n            conf = conf.into_builder().region(region).build()\n        }\n\n        let config = aws_sdk_sts::config::Builder::from(&conf);\n\n        let time_source = conf.time_source().expect(\"A time source must be provided.\");\n\n        let session_name = self.session_name.unwrap_or_else(|| {\n            super::util::default_session_name(\"assume-role-provider\", time_source.now())\n        });\n\n        let sts_client = StsClient::from_conf(config.build());\n        let fluent_builder = sts_client\n            .assume_role()\n            .set_role_arn(Some(self.role_arn))\n            .set_external_id(self.external_id)\n            .set_role_session_name(Some(session_name))\n            .set_policy(self.policy)\n            .set_policy_arns(self.policy_arns)\n            .set_duration_seconds(self.session_length.map(|dur| dur.as_secs() as i32))\n            .set_tags(self.tags);\n\n        AssumeRoleProvider {\n            inner: Inner { fluent_builder },\n        }\n    }\n\n    /// Build a credentials provider for this role authorized by the given `provider`.\n    pub async fn build_from_provider(\n        mut self,\n        provider: impl ProvideCredentials + 'static,\n    ) -> AssumeRoleProvider {\n        let conf = match self.sdk_config {\n            Some(conf) => conf,\n            None => crate::load_defaults(crate::BehaviorVersion::latest()).await,\n        };\n        let conf = conf\n            .into_builder()\n            .credentials_provider(SharedCredentialsProvider::new(provider))\n            .build();\n        self.sdk_config = Some(conf);\n        self.build().await\n    }\n}\n\nimpl Inner {\n    async fn credentials(&self) -> provider::Result {\n        tracing::debug!(\"retrieving assumed credentials\");\n\n        let assumed = self.fluent_builder.clone().send().in_current_span().await;\n        let assumed = match assumed {\n            Ok(assumed) => {\n                tracing::debug!(\n                    access_key_id = ?assumed.credentials.as_ref().map(|c| &c.access_key_id),\n                    \"obtained assumed credentials\"\n                );\n                super::util::into_credentials(\n                    assumed.credentials,\n                    assumed.assumed_role_user,\n                    \"AssumeRoleProvider\",\n                )\n            }\n            Err(SdkError::ServiceError(ref context))\n                if matches!(\n                    context.err(),\n                    AssumeRoleError::RegionDisabledException(_)\n                        | AssumeRoleError::MalformedPolicyDocumentException(_)\n                ) =>\n            {\n                Err(CredentialsError::invalid_configuration(\n                    assumed.err().unwrap(),\n                ))\n            }\n            Err(SdkError::ServiceError(ref context)) => {\n                tracing::warn!(error = %DisplayErrorContext(context.err()), \"STS refused to grant assume role\");\n                Err(CredentialsError::provider_error(assumed.err().unwrap()))\n            }\n            Err(err) => Err(CredentialsError::provider_error(err)),\n        };\n\n        assumed.map(|mut creds| {\n            creds\n                .get_property_mut_or_default::<Vec<AwsCredentialFeature>>()\n                .push(AwsCredentialFeature::CredentialsStsAssumeRole);\n            creds\n        })\n    }\n}\n\nimpl ProvideCredentials for AssumeRoleProvider {\n    fn provide_credentials<'a>(&'a self) -> future::ProvideCredentials<'a>\n    where\n        Self: 'a,\n    {\n        future::ProvideCredentials::new(\n            self.inner\n                .credentials()\n                .instrument(tracing::debug_span!(\"assume_role\")),\n        )\n    }\n}\n\n#[cfg(test)]\nmod test {\n    use crate::sts::AssumeRoleProvider;\n    use aws_credential_types::credential_feature::AwsCredentialFeature;\n    use aws_credential_types::credential_fn::provide_credentials_fn;\n    use aws_credential_types::provider::{ProvideCredentials, SharedCredentialsProvider};\n    use aws_credential_types::Credentials;\n    use aws_smithy_async::rt::sleep::{SharedAsyncSleep, TokioSleep};\n    use aws_smithy_async::test_util::instant_time_and_sleep;\n    use aws_smithy_async::time::StaticTimeSource;\n    use aws_smithy_http_client::test_util::{capture_request, ReplayEvent, StaticReplayClient};\n    use aws_smithy_runtime::test_util::capture_test_logs::capture_test_logs;\n    use aws_smithy_runtime_api::client::behavior_version::BehaviorVersion;\n    use aws_smithy_types::body::SdkBody;\n    use aws_types::os_shim_internal::Env;\n    use aws_types::region::Region;\n    use aws_types::SdkConfig;\n    use http::header::AUTHORIZATION;\n    use std::time::{Duration, UNIX_EPOCH};\n\n    #[tokio::test]\n    async fn configures_session_length() {\n        let (http_client, request) = capture_request(None);\n        let sdk_config = SdkConfig::builder()\n            .sleep_impl(SharedAsyncSleep::new(TokioSleep::new()))\n            .time_source(StaticTimeSource::new(\n                UNIX_EPOCH + Duration::from_secs(1234567890 - 120),\n            ))\n            .http_client(http_client)\n            .region(Region::from_static(\"this-will-be-overridden\"))\n            .behavior_version(crate::BehaviorVersion::latest())\n            .build();\n        let provider = AssumeRoleProvider::builder(\"myrole\")\n            .configure(&sdk_config)\n            .region(Region::new(\"us-east-1\"))\n            .session_length(Duration::from_secs(1234567))\n            .build_from_provider(provide_credentials_fn(|| async {\n                Ok(Credentials::for_tests())\n            }))\n            .await;\n        let _ = dbg!(provider.provide_credentials().await);\n        let req = request.expect_request();\n        let str_body = std::str::from_utf8(req.body().bytes().unwrap()).unwrap();\n        assert!(str_body.contains(\"1234567\"), \"{}\", str_body);\n        assert_eq!(req.uri(), \"https://sts.us-east-1.amazonaws.com/\");\n    }\n\n    #[tokio::test]\n    async fn loads_region_from_sdk_config() {\n        let (http_client, request) = capture_request(None);\n        let sdk_config = SdkConfig::builder()\n            .behavior_version(crate::BehaviorVersion::latest())\n            .sleep_impl(SharedAsyncSleep::new(TokioSleep::new()))\n            .time_source(StaticTimeSource::new(\n                UNIX_EPOCH + Duration::from_secs(1234567890 - 120),\n            ))\n            .http_client(http_client)\n            .credentials_provider(SharedCredentialsProvider::new(provide_credentials_fn(\n                || async {\n                    panic!(\"don't call me — will be overridden\");\n                },\n            )))\n            .region(Region::from_static(\"us-west-2\"))\n            .build();\n        let provider = AssumeRoleProvider::builder(\"myrole\")\n            .configure(&sdk_config)\n            .session_length(Duration::from_secs(1234567))\n            .build_from_provider(provide_credentials_fn(|| async {\n                Ok(Credentials::for_tests())\n            }))\n            .await;\n        let _ = dbg!(provider.provide_credentials().await);\n        let req = request.expect_request();\n        assert_eq!(req.uri(), \"https://sts.us-west-2.amazonaws.com/\");\n    }\n\n    /// Test that `build()` where no provider is passed still works\n    #[tokio::test]\n    async fn build_method_from_sdk_config() {\n        let _guard = capture_test_logs();\n        let (http_client, request) = capture_request(Some(\n            http::Response::builder()\n                .status(404)\n                .body(SdkBody::from(\"\"))\n                .unwrap(),\n        ));\n        let conf = crate::defaults(BehaviorVersion::latest())\n            .env(Env::from_slice(&[\n                (\"AWS_ACCESS_KEY_ID\", \"123-key\"),\n                (\"AWS_SECRET_ACCESS_KEY\", \"456\"),\n                (\"AWS_REGION\", \"us-west-17\"),\n            ]))\n            .use_dual_stack(true)\n            .use_fips(true)\n            .time_source(StaticTimeSource::from_secs(1234567890))\n            .http_client(http_client)\n            .load()\n            .await;\n        let provider = AssumeRoleProvider::builder(\"role\")\n            .configure(&conf)\n            .build()\n            .await;\n        let _ = dbg!(provider.provide_credentials().await);\n        let req = request.expect_request();\n        let auth_header = req.headers().get(AUTHORIZATION).unwrap().to_string();\n        let expect = \"Credential=123-key/20090213/us-west-17/sts/aws4_request\";\n        assert!(\n            auth_header.contains(expect),\n            \"Expected header to contain {expect} but it was {auth_header}\"\n        );\n        // ensure that FIPS & DualStack are also respected\n        assert_eq!(\"https://sts-fips.us-west-17.api.aws/\", req.uri())\n    }\n\n    fn create_test_http_client() -> StaticReplayClient {\n        StaticReplayClient::new(vec![\n            ReplayEvent::new(http::Request::new(SdkBody::from(\"request body\")),\n            http::Response::builder().status(200).body(SdkBody::from(\n                \"<AssumeRoleResponse xmlns=\\\"https://sts.amazonaws.com/doc/2011-06-15/\\\">\\n  <AssumeRoleResult>\\n    <AssumedRoleUser>\\n      <AssumedRoleId>AROAR42TAWARILN3MNKUT:assume-role-from-profile-1632246085998</AssumedRoleId>\\n      <Arn>arn:aws:sts::130633740322:assumed-role/assume-provider-test/assume-role-from-profile-1632246085998</Arn>\\n    </AssumedRoleUser>\\n    <Credentials>\\n      <AccessKeyId>ASIARCORRECT</AccessKeyId>\\n      <SecretAccessKey>secretkeycorrect</SecretAccessKey>\\n      <SessionToken>tokencorrect</SessionToken>\\n      <Expiration>2009-02-13T23:31:30Z</Expiration>\\n    </Credentials>\\n  </AssumeRoleResult>\\n  <ResponseMetadata>\\n    <RequestId>d9d47248-fd55-4686-ad7c-0fb7cd1cddd7</RequestId>\\n  </ResponseMetadata>\\n</AssumeRoleResponse>\\n\"\n            )).unwrap()),\n            ReplayEvent::new(http::Request::new(SdkBody::from(\"request body\")),\n            http::Response::builder().status(200).body(SdkBody::from(\n                \"<AssumeRoleResponse xmlns=\\\"https://sts.amazonaws.com/doc/2011-06-15/\\\">\\n  <AssumeRoleResult>\\n    <AssumedRoleUser>\\n      <AssumedRoleId>AROAR42TAWARILN3MNKUT:assume-role-from-profile-1632246085998</AssumedRoleId>\\n      <Arn>arn:aws:sts::130633740322:assumed-role/assume-provider-test/assume-role-from-profile-1632246085998</Arn>\\n    </AssumedRoleUser>\\n    <Credentials>\\n      <AccessKeyId>ASIARCORRECT</AccessKeyId>\\n      <SecretAccessKey>TESTSECRET</SecretAccessKey>\\n      <SessionToken>tokencorrect</SessionToken>\\n      <Expiration>2009-02-13T23:33:30Z</Expiration>\\n    </Credentials>\\n  </AssumeRoleResult>\\n  <ResponseMetadata>\\n    <RequestId>c2e971c2-702d-4124-9b1f-1670febbea18</RequestId>\\n  </ResponseMetadata>\\n</AssumeRoleResponse>\\n\"\n            )).unwrap()),\n        ])\n    }\n\n    #[tokio::test]\n    async fn provider_does_not_cache_credentials_by_default() {\n        let http_client = create_test_http_client();\n\n        let (testing_time_source, sleep) = instant_time_and_sleep(\n            UNIX_EPOCH + Duration::from_secs(1234567890 - 120), // 1234567890 since UNIX_EPOCH is 2009-02-13T23:31:30Z\n        );\n\n        let sdk_config = SdkConfig::builder()\n            .sleep_impl(SharedAsyncSleep::new(sleep))\n            .time_source(testing_time_source.clone())\n            .http_client(http_client)\n            .behavior_version(crate::BehaviorVersion::latest())\n            .build();\n        let credentials_list = std::sync::Arc::new(std::sync::Mutex::new(vec![\n            Credentials::new(\n                \"test\",\n                \"test\",\n                None,\n                Some(UNIX_EPOCH + Duration::from_secs(1234567890 + 1)),\n                \"test\",\n            ),\n            Credentials::new(\n                \"test\",\n                \"test\",\n                None,\n                Some(UNIX_EPOCH + Duration::from_secs(1234567890 + 120)),\n                \"test\",\n            ),\n        ]));\n        let credentials_list_cloned = credentials_list.clone();\n        let provider = AssumeRoleProvider::builder(\"myrole\")\n            .configure(&sdk_config)\n            .region(Region::new(\"us-east-1\"))\n            .build_from_provider(provide_credentials_fn(move || {\n                let list = credentials_list.clone();\n                async move {\n                    let next = list.lock().unwrap().remove(0);\n                    Ok(next)\n                }\n            }))\n            .await;\n\n        let creds_first = provider\n            .provide_credentials()\n            .await\n            .expect(\"should return valid credentials\");\n\n        // After time has been advanced by 120 seconds, the first credentials _could_ still be valid\n        // if `LazyCredentialsCache` were used, but the provider uses `NoCredentialsCache` by default\n        // so the first credentials will not be used.\n        testing_time_source.advance(Duration::from_secs(120));\n\n        let creds_second = provider\n            .provide_credentials()\n            .await\n            .expect(\"should return the second credentials\");\n        assert_ne!(creds_first, creds_second);\n        assert!(credentials_list_cloned.lock().unwrap().is_empty());\n    }\n\n    #[tokio::test]\n    async fn credentials_feature() {\n        let http_client = create_test_http_client();\n\n        let (testing_time_source, sleep) = instant_time_and_sleep(\n            UNIX_EPOCH + Duration::from_secs(1234567890), // 1234567890 since UNIX_EPOCH is 2009-02-13T23:31:30Z\n        );\n\n        let sdk_config = SdkConfig::builder()\n            .sleep_impl(SharedAsyncSleep::new(sleep))\n            .time_source(testing_time_source.clone())\n            .http_client(http_client)\n            .behavior_version(crate::BehaviorVersion::latest())\n            .build();\n        let credentials = Credentials::new(\n            \"test\",\n            \"test\",\n            None,\n            Some(UNIX_EPOCH + Duration::from_secs(1234567890 + 1)),\n            \"test\",\n        );\n        let provider = AssumeRoleProvider::builder(\"myrole\")\n            .configure(&sdk_config)\n            .region(Region::new(\"us-east-1\"))\n            .build_from_provider(credentials)\n            .await;\n\n        let creds = provider\n            .provide_credentials()\n            .await\n            .expect(\"should return valid credentials\");\n\n        assert_eq!(\n            &vec![AwsCredentialFeature::CredentialsStsAssumeRole],\n            creds.get_property::<Vec<AwsCredentialFeature>>().unwrap()\n        )\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/src/sts/util.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_credential_types::attributes::AccountId;\nuse aws_credential_types::provider::{self, error::CredentialsError};\nuse aws_credential_types::Credentials as AwsCredentials;\nuse aws_sdk_sts::types::{AssumedRoleUser, Credentials as StsCredentials};\n\nuse std::time::{SystemTime, UNIX_EPOCH};\n\n/// Convert STS credentials to aws_auth::Credentials\npub(crate) fn into_credentials(\n    sts_credentials: Option<StsCredentials>,\n    assumed_role_user: Option<AssumedRoleUser>,\n    provider_name: &'static str,\n) -> provider::Result {\n    let sts_credentials = sts_credentials\n        .ok_or_else(|| CredentialsError::unhandled(\"STS credentials must be defined\"))?;\n    let expiration = SystemTime::try_from(sts_credentials.expiration).map_err(|_| {\n        CredentialsError::unhandled(\n            \"credential expiration time cannot be represented by a SystemTime\",\n        )\n    })?;\n    let mut builder = AwsCredentials::builder()\n        .access_key_id(sts_credentials.access_key_id)\n        .secret_access_key(sts_credentials.secret_access_key)\n        .session_token(sts_credentials.session_token)\n        .expiry(expiration)\n        .provider_name(provider_name);\n    if let Some(AssumedRoleUser { arn, .. }) = assumed_role_user {\n        builder.set_account_id(Some(parse_account_id(&arn)?));\n    }\n    Ok(builder.build())\n}\n\n/// Create a default STS session name\n///\n/// STS Assume Role providers MUST assign a name to their generated session. When a user does not\n/// provide a name for the session, the provider will choose a name composed of a base + a timestamp,\n/// e.g. `profile-file-provider-123456789`\npub(crate) fn default_session_name(base: &str, ts: SystemTime) -> String {\n    let now = ts.duration_since(UNIX_EPOCH).expect(\"post epoch\");\n    format!(\"{}-{}\", base, now.as_millis())\n}\n\n// A subset of functionality extracted from `endpoint_lib::arn::Arn::parse`.\n// `Arn` is `pub(crate)` within generated SDKs, making it inaccessible from `aws-config`.\n// As a result, a subset is inlined here, with less defensive verification\n// since it only deals with the string-form ARN returned by STS.\n//\n// TODO(https://github.com/smithy-lang/smithy-rs/issues/4090): Consider making a `pub` Arn parser\nfn parse_account_id(arn: &str) -> Result<AccountId, CredentialsError> {\n    let mut split = arn.splitn(6, ':');\n    let invalid_format =\n        || CredentialsError::unhandled(\"ARN must have 6 components delimited by `:`\");\n    let _arn = split.next().ok_or_else(invalid_format)?;\n    let _partition = split.next().ok_or_else(invalid_format)?;\n    let _service = split.next().ok_or_else(invalid_format)?;\n    let _region = split.next().ok_or_else(invalid_format)?;\n    let account_id = split.next().ok_or_else(invalid_format)?;\n\n    Ok(account_id.into())\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/src/sts.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Credential provider augmentation through the AWS Security Token Service (STS).\n\npub use assume_role::{AssumeRoleProvider, AssumeRoleProviderBuilder};\n\nmod assume_role;\npub(crate) mod util;\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/src/test_case.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::default_provider::use_dual_stack::use_dual_stack_provider;\nuse crate::default_provider::use_fips::use_fips_provider;\nuse crate::provider_config::ProviderConfig;\nuse aws_smithy_async::rt::sleep::{AsyncSleep, Sleep, TokioSleep};\nuse aws_smithy_http_client::test_util::dvr::{NetworkTraffic, RecordingClient, ReplayingClient};\nuse aws_smithy_runtime::test_util::capture_test_logs::capture_test_logs;\nuse aws_smithy_runtime_api::box_error::BoxError;\nuse aws_smithy_runtime_api::shared::IntoShared;\nuse aws_smithy_types::{date_time::Format, error::display::DisplayErrorContext, DateTime};\nuse aws_types::os_shim_internal::{Env, Fs};\nuse aws_types::sdk_config::SharedHttpClient;\nuse serde::Deserialize;\nuse std::collections::HashMap;\nuse std::error::Error;\nuse std::fmt::Debug;\nuse std::future::Future;\nuse std::path::{Path, PathBuf};\nuse std::pin::Pin;\nuse std::time::{Duration, UNIX_EPOCH};\n\nmod sealed {\n    /// Trait that provides secret values for a given test output type (credentials or tokens)\n    pub(crate) trait Secrets {\n        fn secrets(&self) -> Vec<String>;\n    }\n    impl Secrets for () {\n        fn secrets(&self) -> Vec<String> {\n            Vec::new()\n        }\n    }\n}\nuse sealed::Secrets;\n\n/// Test case credentials\n///\n/// Credentials for use in test cases. These implement Serialize/Deserialize and have a\n/// non-hidden debug implementation.\n#[derive(Deserialize, Debug, Eq, PartialEq)]\npub(crate) struct Credentials {\n    pub(crate) access_key_id: String,\n    pub(crate) secret_access_key: String,\n    pub(crate) session_token: Option<String>,\n    pub(crate) account_id: Option<String>,\n    pub(crate) expiry: Option<u64>,\n}\n\nimpl Secrets for Credentials {\n    fn secrets(&self) -> Vec<String> {\n        vec![self.secret_access_key.clone()]\n    }\n}\n\n/// Convert real credentials to test credentials\n///\n/// Comparing equality on real credentials works, but it's a pain because the Debug implementation\n/// hides the actual keys\nimpl From<&aws_credential_types::Credentials> for Credentials {\n    fn from(credentials: &aws_credential_types::Credentials) -> Self {\n        Self {\n            access_key_id: credentials.access_key_id().into(),\n            secret_access_key: credentials.secret_access_key().into(),\n            session_token: credentials.session_token().map(ToString::to_string),\n            account_id: credentials.account_id().map(|id| id.as_str().to_string()),\n            expiry: credentials\n                .expiry()\n                .map(|t| t.duration_since(UNIX_EPOCH).unwrap().as_secs()),\n        }\n    }\n}\n\nimpl From<aws_credential_types::Credentials> for Credentials {\n    fn from(credentials: aws_credential_types::Credentials) -> Self {\n        (&credentials).into()\n    }\n}\n\n/// Test case token\n///\n/// Token for use in test cases. These implement Serialize/Deserialize and have a\n/// non-hidden debug implementation.\n#[derive(Deserialize, Debug, Eq, PartialEq)]\n#[allow(dead_code)]\npub(crate) struct Token {\n    pub(crate) token: String,\n    pub(crate) expiration: Option<String>,\n}\n\nimpl Secrets for Token {\n    fn secrets(&self) -> Vec<String> {\n        vec![self.token.clone()]\n    }\n}\n\nimpl From<&aws_credential_types::Token> for Token {\n    fn from(value: &aws_credential_types::Token) -> Self {\n        Self {\n            token: value.token().into(),\n            expiration: value\n                .expiration()\n                .map(|s| DateTime::from(s).fmt(Format::DateTime).unwrap()),\n        }\n    }\n}\n\nimpl From<aws_credential_types::Token> for Token {\n    fn from(value: aws_credential_types::Token) -> Self {\n        Self::from(&value)\n    }\n}\n\n/// Connector which expects no traffic\npub(crate) fn no_traffic_client() -> SharedHttpClient {\n    ReplayingClient::new(Vec::new()).into_shared()\n}\n\n#[derive(Debug)]\npub(crate) struct InstantSleep;\nimpl AsyncSleep for InstantSleep {\n    fn sleep(&self, _duration: Duration) -> Sleep {\n        Sleep::new(std::future::ready(()))\n    }\n}\n\n#[derive(Deserialize, Debug)]\npub(crate) enum GenericTestResult<T> {\n    Ok(T),\n    ErrorContains(String),\n}\n\nimpl<O> GenericTestResult<O>\nwhere\n    O: PartialEq + Debug,\n{\n    #[track_caller]\n    pub(crate) fn assert_matches<E>(&self, result: Result<&O, &E>)\n    where\n        E: Error,\n    {\n        match (result, &self) {\n            (Ok(actual), GenericTestResult::Ok(expected)) => {\n                assert_eq!(expected, actual, \"incorrect result was returned\")\n            }\n            (Err(err), GenericTestResult::ErrorContains(substr)) => {\n                let message = format!(\"{}\", DisplayErrorContext(err));\n                assert!(\n                    message.contains(substr),\n                    \"`{message}` did not contain `{substr}`\"\n                );\n            }\n            (Err(actual_error), GenericTestResult::Ok(expected_creds)) => {\n                panic!(\n                    \"expected output ({:?}) but an error was returned: {}\",\n                    expected_creds,\n                    DisplayErrorContext(actual_error)\n                )\n            }\n            (Ok(output), GenericTestResult::ErrorContains(substr)) => panic!(\n                \"expected an error containing: `{}`, but a result was returned: {:?}\",\n                substr, output\n            ),\n        }\n    }\n}\n\n#[derive(Deserialize)]\npub(crate) struct Metadata<T> {\n    result: GenericTestResult<T>,\n    docs: String,\n    name: String,\n}\n\npub(crate) trait RunTestProvider {\n    type Output: for<'a> Deserialize<'a> + Secrets;\n    type Error;\n\n    fn run_provider(\n        &self,\n        provider_config: ProviderConfig,\n    ) -> Pin<Box<dyn Future<Output = Result<Self::Output, Self::Error>> + Send + 'static>>;\n}\n\ntype ResultFuture<O, E> = Pin<Box<dyn Future<Output = Result<O, E>> + Send + 'static>>;\npub(crate) struct StaticTestProvider<O, E> {\n    run_provider_fn: Box<dyn Fn(ProviderConfig) -> ResultFuture<O, E> + 'static>,\n}\nimpl<O, E> StaticTestProvider<O, E> {\n    pub(crate) fn new<F>(run_provider_fn: F) -> Self\n    where\n        F: Fn(ProviderConfig) -> ResultFuture<O, E> + 'static,\n    {\n        Self {\n            run_provider_fn: Box::new(run_provider_fn) as _,\n        }\n    }\n}\nimpl<O, E> RunTestProvider for StaticTestProvider<O, E>\nwhere\n    O: for<'a> Deserialize<'a> + Secrets,\n{\n    type Output = O;\n    type Error = E;\n\n    fn run_provider(\n        &self,\n        provider_config: ProviderConfig,\n    ) -> Pin<Box<dyn Future<Output = Result<Self::Output, Self::Error>> + Send + 'static>> {\n        (self.run_provider_fn)(provider_config)\n    }\n}\n\npub(crate) fn test_credentials_provider<F, Fut, E>(\n    run_provider_fn: F,\n) -> impl RunTestProvider<Output = Credentials, Error = E>\nwhere\n    F: Fn(ProviderConfig) -> Fut + Send + Clone + 'static,\n    Fut: Future<Output = Result<aws_credential_types::Credentials, E>> + Send,\n{\n    StaticTestProvider::<Credentials, E>::new(move |config| {\n        let run_provider_fn = run_provider_fn.clone();\n        Box::pin(async move { (run_provider_fn)(config).await.map(Into::into) })\n    })\n}\n\n#[cfg(feature = \"sso\")]\npub(crate) fn test_token_provider<F, Fut, E>(\n    run_provider_fn: F,\n) -> impl RunTestProvider<Output = Token, Error = E>\nwhere\n    F: Fn(ProviderConfig) -> Fut + Send + Clone + 'static,\n    Fut: Future<Output = Result<aws_credential_types::Token, E>> + Send,\n{\n    StaticTestProvider::<Token, E>::new(move |config| {\n        let run_provider_fn = run_provider_fn.clone();\n        Box::pin(async move { (run_provider_fn)(config).await.map(Into::into) })\n    })\n}\n\n/// Provider test environment\n///\n/// A provider test environment is a directory containing:\n/// - an `fs` directory. This is loaded into the test as if it was mounted at `/`\n/// - an `env.json` file containing environment variables\n/// - an  `http-traffic.json` file containing an http traffic log from [`dvr`](aws_smithy_runtime::client::http::test_utils::dvr)\n/// - a `test-case.json` file defining the expected output of the test\npub(crate) struct TestEnvironment<O, E> {\n    metadata: Metadata<O>,\n    base_dir: PathBuf,\n    http_client: ReplayingClient,\n    provider_config: ProviderConfig,\n    run_provider: Box<dyn RunTestProvider<Output = O, Error = E>>,\n}\n\nimpl<O, E> TestEnvironment<O, E>\nwhere\n    O: for<'a> Deserialize<'a>,\n{\n    pub(crate) async fn from_dir(\n        dir: impl AsRef<Path>,\n        run_provider: impl RunTestProvider<Output = O, Error = E> + 'static,\n    ) -> Result<Self, BoxError> {\n        let dir = dir.as_ref();\n        let env = std::fs::read_to_string(dir.join(\"env.json\"))\n            .map_err(|e| format!(\"failed to load env: {}\", e))?;\n        let env: HashMap<String, String> =\n            serde_json::from_str(&env).map_err(|e| format!(\"failed to parse env: {}\", e))?;\n        let env = Env::from(env);\n        let fs = Fs::from_test_dir(dir.join(\"fs\"), \"/\");\n        let network_traffic = std::fs::read_to_string(dir.join(\"http-traffic.json\"))\n            .map_err(|e| format!(\"failed to load http traffic: {}\", e))?;\n        let mut network_traffic: NetworkTraffic = serde_json::from_str(&network_traffic)?;\n        network_traffic.correct_content_lengths();\n\n        let metadata: Metadata<O> = serde_json::from_str(\n            &std::fs::read_to_string(dir.join(\"test-case.json\"))\n                .map_err(|e| format!(\"failed to load test case: {}\", e))?,\n        )?;\n        let http_client = ReplayingClient::new(network_traffic.events().clone());\n        let provider_config = ProviderConfig::empty()\n            .with_fs(fs.clone())\n            .with_env(env.clone())\n            .with_http_client(http_client.clone())\n            .with_sleep_impl(TokioSleep::new())\n            .load_default_region()\n            .await;\n\n        let use_dual_stack = use_dual_stack_provider(&provider_config).await;\n        let use_fips = use_fips_provider(&provider_config).await;\n        let provider_config = provider_config\n            .with_use_fips(use_fips)\n            .with_use_dual_stack(use_dual_stack);\n\n        Ok(Self {\n            base_dir: dir.into(),\n            metadata,\n            http_client,\n            provider_config,\n            run_provider: Box::new(run_provider),\n        })\n    }\n\n    pub(crate) fn map_provider_config<F>(mut self, provider_config_builder: F) -> Self\n    where\n        F: Fn(ProviderConfig) -> ProviderConfig,\n    {\n        self.provider_config = provider_config_builder(self.provider_config.clone());\n        self\n    }\n\n    pub(crate) fn provider_config(&self) -> &ProviderConfig {\n        &self.provider_config\n    }\n}\n\nimpl<O, E> TestEnvironment<O, E>\nwhere\n    O: for<'a> Deserialize<'a> + Secrets + PartialEq + Debug,\n    E: Error,\n{\n    #[cfg(feature = \"default-https-client\")]\n    #[allow(unused)]\n    /// Record a test case from live (remote) HTTPS traffic\n    ///\n    /// The `default_connector()` from the crate will be used\n    pub(crate) async fn execute_from_live_traffic(&self) {\n        // swap out the connector generated from `http-traffic.json` for a real connector:\n\n        use std::error::Error;\n        let live_connector = aws_smithy_http_client::default_connector(\n            &Default::default(),\n            self.provider_config.sleep_impl(),\n        )\n        .expect(\"feature gate on this function makes this always return Some\");\n\n        let live_client = RecordingClient::new(live_connector);\n        let config = self\n            .provider_config\n            .clone()\n            .with_http_client(live_client.clone());\n        let result = self.run_provider.run_provider(config).await;\n        std::fs::write(\n            self.base_dir.join(\"http-traffic-recorded.json\"),\n            serde_json::to_string(&live_client.network_traffic()).unwrap(),\n        )\n        .unwrap();\n        self.check_results(result.as_ref());\n    }\n\n    #[allow(dead_code)]\n    /// Execute the test suite & record a new traffic log\n    ///\n    /// A connector will be created with the factory, then request traffic will be recorded.\n    /// Response are generated from the existing http-traffic.json.\n    pub(crate) async fn execute_and_update(&self) {\n        let recording_client = RecordingClient::new(self.http_client.clone());\n        let config = self\n            .provider_config\n            .clone()\n            .with_http_client(recording_client.clone());\n        let result = self.run_provider.run_provider(config).await;\n        std::fs::write(\n            self.base_dir.join(\"http-traffic-recorded.json\"),\n            serde_json::to_string(&recording_client.network_traffic()).unwrap(),\n        )\n        .unwrap();\n        self.check_results(result.as_ref());\n    }\n\n    /// Execute a test case. Failures lead to panics.\n    pub(crate) async fn execute(&self) -> Result<O, E> {\n        let (_guard, rx) = capture_test_logs();\n        let result = self\n            .run_provider\n            .run_provider(self.provider_config.clone())\n            .await;\n        tokio::time::pause();\n        self.log_info();\n        self.check_results(result.as_ref());\n        // todo: validate bodies\n        match self\n            .http_client\n            .clone()\n            .validate(\n                &[\"CONTENT-TYPE\", \"x-aws-ec2-metadata-token\"],\n                |_expected, _actual| Ok(()),\n            )\n            .await\n        {\n            Ok(()) => {}\n            Err(e) => panic!(\"{}\", DisplayErrorContext(e.as_ref())),\n        }\n        if self\n            .provider_config\n            .env()\n            .get(\"EXPOSE_SECRETS_FOR_TESTS\")\n            .is_err()\n        {\n            let contents = rx.contents();\n            let leaking_lines = self.lines_with_secrets(&contents);\n            assert!(\n                leaking_lines.is_empty(),\n                \"secret was exposed\\n{:?}\\nSee the following log lines:\\n  {}\",\n                self.metadata.result,\n                leaking_lines.join(\"\\n  \")\n            );\n        }\n        result\n    }\n\n    fn log_info(&self) {\n        eprintln!(\"test case: {}. {}\", self.metadata.name, self.metadata.docs);\n    }\n\n    fn lines_with_secrets<'a>(&'a self, logs: &'a str) -> Vec<&'a str> {\n        logs.lines()\n            .filter(|l| self.contains_any_secrets(l))\n            .collect()\n    }\n\n    fn contains_any_secrets(&self, log_line: &str) -> bool {\n        assert!(log_line.lines().count() <= 1);\n        match &self.metadata.result {\n            // NOTE: we aren't currently erroring if the session token is leaked, that is in the canonical request among other things\n            GenericTestResult::Ok(output) => output\n                .secrets()\n                .iter()\n                .any(|secret| log_line.contains(secret)),\n            GenericTestResult::ErrorContains(_) => false,\n        }\n    }\n\n    #[track_caller]\n    fn check_results(&self, result: Result<&O, &E>)\n    where\n        O: PartialEq + Debug,\n        E: Error,\n    {\n        self.metadata.result.assert_matches(result);\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/src/timeout.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Timeout configuration\n\n// Re-export from aws-smithy-types\npub use aws_smithy_types::timeout::OperationTimeoutConfig;\npub use aws_smithy_types::timeout::TimeoutConfig;\npub use aws_smithy_types::timeout::TimeoutConfigBuilder;\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/src/web_identity_token.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Load Credentials from Web Identity Tokens\n//!\n//! Web identity tokens can be loaded from file. The path may be set in one of three ways:\n//! 1. [Environment Variables](#environment-variable-configuration)\n//! 2. [AWS profile](#aws-profile-configuration) defined in `~/.aws/config`\n//! 3. Static configuration via [`static_configuration`](Builder::static_configuration)\n//!\n//! _Note: [WebIdentityTokenCredentialsProvider] is part of the [default provider chain](crate::default_provider).\n//! Unless you need specific behavior or configuration overrides, it is recommended to use the\n//! default chain instead of using this provider directly. This client should be considered a \"low level\"\n//! client as it does not include caching or profile-file resolution when used in isolation._\n//!\n//! ## Environment Variable Configuration\n//! WebIdentityTokenCredentialProvider will load the following environment variables:\n//! - `AWS_WEB_IDENTITY_TOKEN_FILE`: **required**, location to find the token file containing a JWT token\n//! - `AWS_ROLE_ARN`: **required**, role ARN to assume\n//! - `AWS_ROLE_SESSION_NAME`: **optional**: Session name to use when assuming the role\n//!\n//! ## AWS Profile Configuration\n//! _Note: Configuration of the web identity token provider via a shared profile is only supported\n//! when using the [`ProfileFileCredentialsProvider`](crate::profile::credentials)._\n//!\n//! Web identity token credentials can be loaded from `~/.aws/config` in two ways:\n//! 1. Directly:\n//!   ```ini\n//!   [profile default]\n//!   role_arn = arn:aws:iam::1234567890123:role/RoleA\n//!   web_identity_token_file = /token.jwt\n//!   ```\n//!\n//! 2. As a source profile for another role:\n//!\n//!   ```ini\n//!   [profile default]\n//!   role_arn = arn:aws:iam::123456789:role/RoleA\n//!   source_profile = base\n//!\n//!   [profile base]\n//!   role_arn = arn:aws:iam::123456789012:role/s3-reader\n//!   web_identity_token_file = /token.jwt\n//!   ```\n//!\n//! # Examples\n//! Web Identity Token providers are part of the [default chain](crate::default_provider::credentials).\n//! However, they may be directly constructed if you don't want to use the default provider chain.\n//! Unless overridden with [`static_configuration`](Builder::static_configuration), the provider will\n//! load configuration from environment variables.\n//!\n//! ```no_run\n//! # async fn test() {\n//! use aws_config::web_identity_token::WebIdentityTokenCredentialsProvider;\n//! use aws_config::provider_config::ProviderConfig;\n//! let provider = WebIdentityTokenCredentialsProvider::builder()\n//!     .configure(&ProviderConfig::with_default_region().await)\n//!     .build();\n//! # }\n//! ```\n\nuse crate::provider_config::ProviderConfig;\nuse crate::sts;\nuse aws_credential_types::credential_feature::AwsCredentialFeature;\nuse aws_credential_types::provider::{self, error::CredentialsError, future, ProvideCredentials};\nuse aws_sdk_sts::{types::PolicyDescriptorType, Client as StsClient};\nuse aws_smithy_async::time::SharedTimeSource;\nuse aws_smithy_types::error::display::DisplayErrorContext;\nuse aws_types::os_shim_internal::{Env, Fs};\n\nuse std::borrow::Cow;\nuse std::path::{Path, PathBuf};\n\nconst ENV_VAR_TOKEN_FILE: &str = \"AWS_WEB_IDENTITY_TOKEN_FILE\";\nconst ENV_VAR_ROLE_ARN: &str = \"AWS_ROLE_ARN\";\nconst ENV_VAR_SESSION_NAME: &str = \"AWS_ROLE_SESSION_NAME\";\n\n/// Credential provider to load credentials from Web Identity Tokens\n///\n/// See Module documentation for more details\n#[derive(Debug)]\npub struct WebIdentityTokenCredentialsProvider {\n    source: Source,\n    time_source: SharedTimeSource,\n    fs: Fs,\n    sts_client: StsClient,\n    policy: Option<String>,\n    policy_arns: Option<Vec<PolicyDescriptorType>>,\n}\n\nimpl WebIdentityTokenCredentialsProvider {\n    /// Builder for this credentials provider\n    pub fn builder() -> Builder {\n        Builder::default()\n    }\n}\n\n#[derive(Debug)]\nenum Source {\n    Env(Env),\n    Static(StaticConfiguration),\n}\n\n/// Statically configured WebIdentityToken configuration\n#[derive(Debug, Clone)]\npub struct StaticConfiguration {\n    /// Location of the file containing the web identity token\n    pub web_identity_token_file: PathBuf,\n\n    /// RoleArn to assume\n    pub role_arn: String,\n\n    /// Session name to use when assuming the role\n    pub session_name: String,\n}\n\nimpl ProvideCredentials for WebIdentityTokenCredentialsProvider {\n    fn provide_credentials<'a>(&'a self) -> future::ProvideCredentials<'a>\n    where\n        Self: 'a,\n    {\n        future::ProvideCredentials::new(self.credentials())\n    }\n}\n\nimpl WebIdentityTokenCredentialsProvider {\n    fn source(&self) -> Result<Cow<'_, StaticConfiguration>, CredentialsError> {\n        match &self.source {\n            Source::Env(env) => {\n                let token_file = env.get(ENV_VAR_TOKEN_FILE).map_err(|_| {\n                    CredentialsError::not_loaded(format!(\"${ENV_VAR_TOKEN_FILE} was not set\"))\n                })?;\n                let role_arn = env.get(ENV_VAR_ROLE_ARN).map_err(|_| {\n                    CredentialsError::invalid_configuration(\n                        \"AWS_ROLE_ARN environment variable must be set\",\n                    )\n                })?;\n                let session_name = env.get(ENV_VAR_SESSION_NAME).unwrap_or_else(|_| {\n                    sts::util::default_session_name(\"web-identity-token\", self.time_source.now())\n                });\n                Ok(Cow::Owned(StaticConfiguration {\n                    web_identity_token_file: token_file.into(),\n                    role_arn,\n                    session_name,\n                }))\n            }\n            Source::Static(conf) => Ok(Cow::Borrowed(conf)),\n        }\n    }\n    async fn credentials(&self) -> provider::Result {\n        let conf = self.source()?;\n        load_credentials(\n            &self.fs,\n            &self.sts_client,\n            self.policy.clone(),\n            self.policy_arns.clone(),\n            &conf.web_identity_token_file,\n            &conf.role_arn,\n            &conf.session_name,\n        )\n        .await\n        .map(|mut creds| {\n            creds\n                .get_property_mut_or_default::<Vec<AwsCredentialFeature>>()\n                .push(AwsCredentialFeature::CredentialsProfileStsWebIdToken);\n            creds\n        })\n    }\n}\n\n/// Builder for [`WebIdentityTokenCredentialsProvider`].\n#[derive(Debug, Default)]\npub struct Builder {\n    source: Option<Source>,\n    config: Option<ProviderConfig>,\n    policy: Option<String>,\n    policy_arns: Option<Vec<PolicyDescriptorType>>,\n}\n\nimpl Builder {\n    /// Configure generic options of the [WebIdentityTokenCredentialsProvider]\n    ///\n    /// # Examples\n    /// ```no_run\n    /// # async fn test() {\n    /// use aws_config::web_identity_token::WebIdentityTokenCredentialsProvider;\n    /// use aws_config::provider_config::ProviderConfig;\n    /// let provider = WebIdentityTokenCredentialsProvider::builder()\n    ///     .configure(&ProviderConfig::with_default_region().await)\n    ///     .build();\n    /// # }\n    /// ```\n    pub fn configure(mut self, provider_config: &ProviderConfig) -> Self {\n        self.config = Some(provider_config.clone());\n        self\n    }\n\n    /// Configure this builder to use  [`StaticConfiguration`].\n    ///\n    /// WebIdentityToken providers load credentials from the file system. The file system path used\n    /// may either determine be loaded from environment variables (default), or via a statically\n    /// configured path.\n    pub fn static_configuration(mut self, config: StaticConfiguration) -> Self {\n        self.source = Some(Source::Static(config));\n        self\n    }\n\n    /// Set an IAM policy in JSON format that you want to use as an inline session policy.\n    ///\n    /// This parameter is optional\n    /// For more information, see\n    /// [policy](aws_sdk_sts::operation::assume_role::builders::AssumeRoleInputBuilder::policy_arns)\n    pub fn policy(mut self, policy: impl Into<String>) -> Self {\n        self.policy = Some(policy.into());\n        self\n    }\n\n    /// Set the Amazon Resource Names (ARNs) of the IAM managed policies that you want to use as managed session policies.\n    ///\n    /// This parameter is optional.\n    /// For more information, see\n    /// [policy_arns](aws_sdk_sts::operation::assume_role::builders::AssumeRoleInputBuilder::policy_arns)\n    pub fn policy_arns(mut self, policy_arns: Vec<String>) -> Self {\n        self.policy_arns = Some(\n            policy_arns\n                .into_iter()\n                .map(|arn| PolicyDescriptorType::builder().arn(arn).build())\n                .collect::<Vec<_>>(),\n        );\n        self\n    }\n\n    /// Build a [`WebIdentityTokenCredentialsProvider`]\n    ///\n    /// ## Panics\n    /// If no connector has been enabled via crate features and no connector has been provided via the\n    /// builder, this function will panic.\n    pub fn build(self) -> WebIdentityTokenCredentialsProvider {\n        let conf = self.config.unwrap_or_default();\n        let source = self.source.unwrap_or_else(|| Source::Env(conf.env()));\n        WebIdentityTokenCredentialsProvider {\n            source,\n            fs: conf.fs(),\n            sts_client: StsClient::new(&conf.client_config()),\n            time_source: conf.time_source(),\n            policy: self.policy,\n            policy_arns: self.policy_arns,\n        }\n    }\n}\n\nasync fn load_credentials(\n    fs: &Fs,\n    sts_client: &StsClient,\n    policy: Option<String>,\n    policy_arns: Option<Vec<PolicyDescriptorType>>,\n    token_file: impl AsRef<Path>,\n    role_arn: &str,\n    session_name: &str,\n) -> provider::Result {\n    let token = fs\n        .read_to_end(token_file)\n        .await\n        .map_err(CredentialsError::provider_error)?;\n    let token = String::from_utf8(token).map_err(|_utf_8_error| {\n        CredentialsError::unhandled(\"WebIdentityToken was not valid UTF-8\")\n    })?;\n\n    let resp = sts_client.assume_role_with_web_identity()\n        .role_arn(role_arn)\n        .role_session_name(session_name)\n        .set_policy(policy)\n        .set_policy_arns(policy_arns)\n        .web_identity_token(token)\n        .send()\n        .await\n        .map_err(|sdk_error| {\n            tracing::warn!(error = %DisplayErrorContext(&sdk_error), \"STS returned an error assuming web identity role\");\n            CredentialsError::provider_error(sdk_error)\n        })?;\n    sts::util::into_credentials(resp.credentials, resp.assumed_role_user, \"WebIdentityToken\")\n}\n\n#[cfg(test)]\nmod test {\n    use crate::provider_config::ProviderConfig;\n    use crate::test_case::no_traffic_client;\n    use crate::web_identity_token::{\n        Builder, ENV_VAR_ROLE_ARN, ENV_VAR_SESSION_NAME, ENV_VAR_TOKEN_FILE,\n    };\n    use aws_credential_types::provider::error::CredentialsError;\n    use aws_smithy_async::rt::sleep::TokioSleep;\n    use aws_smithy_types::error::display::DisplayErrorContext;\n    use aws_types::os_shim_internal::{Env, Fs};\n    use aws_types::region::Region;\n    use std::collections::HashMap;\n\n    #[tokio::test]\n    async fn unloaded_provider() {\n        // empty environment\n        let conf = ProviderConfig::empty()\n            .with_sleep_impl(TokioSleep::new())\n            .with_env(Env::from_slice(&[]))\n            .with_http_client(no_traffic_client())\n            .with_region(Some(Region::from_static(\"us-east-1\")));\n\n        let provider = Builder::default().configure(&conf).build();\n        let err = provider\n            .credentials()\n            .await\n            .expect_err(\"should fail, provider not loaded\");\n        match err {\n            CredentialsError::CredentialsNotLoaded { .. } => { /* ok */ }\n            _ => panic!(\"incorrect error variant\"),\n        }\n    }\n\n    #[tokio::test]\n    async fn missing_env_var() {\n        let env = Env::from_slice(&[(ENV_VAR_TOKEN_FILE, \"/token.jwt\")]);\n        let region = Some(Region::new(\"us-east-1\"));\n        let provider = Builder::default()\n            .configure(\n                &ProviderConfig::empty()\n                    .with_sleep_impl(TokioSleep::new())\n                    .with_region(region)\n                    .with_env(env)\n                    .with_http_client(no_traffic_client()),\n            )\n            .build();\n        let err = provider\n            .credentials()\n            .await\n            .expect_err(\"should fail, provider not loaded\");\n        assert!(\n            format!(\"{}\", DisplayErrorContext(&err)).contains(\"AWS_ROLE_ARN\"),\n            \"`{}` did not contain expected string\",\n            err\n        );\n        match err {\n            CredentialsError::InvalidConfiguration { .. } => { /* ok */ }\n            _ => panic!(\"incorrect error variant\"),\n        }\n    }\n\n    #[tokio::test]\n    async fn fs_missing_file() {\n        let env = Env::from_slice(&[\n            (ENV_VAR_TOKEN_FILE, \"/token.jwt\"),\n            (ENV_VAR_ROLE_ARN, \"arn:aws:iam::123456789123:role/test-role\"),\n            (ENV_VAR_SESSION_NAME, \"test-session\"),\n        ]);\n        let fs = Fs::from_raw_map(HashMap::new());\n        let provider = Builder::default()\n            .configure(\n                &ProviderConfig::empty()\n                    .with_sleep_impl(TokioSleep::new())\n                    .with_http_client(no_traffic_client())\n                    .with_region(Some(Region::new(\"us-east-1\")))\n                    .with_env(env)\n                    .with_fs(fs),\n            )\n            .build();\n        let err = provider.credentials().await.expect_err(\"no JWT token\");\n        match err {\n            CredentialsError::ProviderError { .. } => { /* ok */ }\n            _ => panic!(\"incorrect error variant\"),\n        }\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/assume-role-tests.json",
    "content": "[\n  {\n    \"docs\": \"basic test case, a role_arn backed by a static credential\",\n    \"input\": {\n      \"profiles\": {\n        \"A\": {\n          \"role_arn\": \"arn:aws:iam::123456789:role/RoleA\",\n          \"source_profile\": \"B\"\n        },\n        \"B\": {\n          \"aws_access_key_id\": \"abc123\",\n          \"aws_secret_access_key\": \"def456\",\n          \"aws_account_id\": \"123456789001\"\n        }\n      },\n      \"selected_profile\": \"A\"\n    },\n    \"output\": {\n      \"ProfileChain\": [\n        {\n          \"AccessKey\": {\n            \"access_key_id\": \"abc123\",\n            \"secret_access_key\": \"def456\",\n            \"account_id\": \"123456789001\"\n          }\n        },\n        {\n          \"AssumeRole\": {\n            \"role_arn\": \"arn:aws:iam::123456789:role/RoleA\"\n          }\n        }\n      ]\n    }\n  },\n  {\n    \"docs\": \"ignore explicit credentials when source profile is specified\",\n    \"input\": {\n      \"profiles\": {\n        \"A\": {\n          \"aws_access_key_id\": \"abc123\",\n          \"aws_secret_access_key\": \"def456\",\n          \"role_arn\": \"arn:aws:iam::123456789:role/RoleA\",\n          \"source_profile\": \"B\"\n        },\n        \"B\": {\n          \"aws_access_key_id\": \"ghi890\",\n          \"aws_secret_access_key\": \"jkl123\"\n        }\n      },\n      \"selected_profile\": \"A\"\n    },\n    \"output\": {\n      \"ProfileChain\": [\n        {\n          \"AccessKey\": {\n            \"access_key_id\": \"ghi890\",\n            \"secret_access_key\": \"jkl123\"\n          }\n        },\n        {\n          \"AssumeRole\": {\n            \"role_arn\": \"arn:aws:iam::123456789:role/RoleA\"\n          }\n        }\n      ]\n    }\n  },\n  {\n    \"docs\": \"load role_session_name for the AssumeRole provider\",\n    \"input\": {\n      \"profiles\": {\n        \"A\": {\n          \"role_arn\": \"arn:aws:iam::123456789:role/RoleA\",\n          \"role_session_name\": \"my_session_name\",\n          \"source_profile\": \"B\"\n        },\n        \"B\": {\n          \"aws_access_key_id\": \"abc123\",\n          \"aws_secret_access_key\": \"def456\"\n        }\n      },\n      \"selected_profile\": \"A\"\n    },\n    \"output\": {\n      \"ProfileChain\": [\n        {\n          \"AccessKey\": {\n            \"access_key_id\": \"abc123\",\n            \"secret_access_key\": \"def456\"\n          }\n        },\n        {\n          \"AssumeRole\": {\n            \"role_arn\": \"arn:aws:iam::123456789:role/RoleA\",\n            \"role_session_name\": \"my_session_name\"\n          }\n        }\n      ]\n    }\n  },\n  {\n    \"docs\": \"load external id for the AssumeRole provider\",\n    \"input\": {\n      \"profiles\": {\n        \"A\": {\n          \"role_arn\": \"arn:aws:iam::123456789:role/RoleA\",\n          \"external_id\": \"my_external_id\",\n          \"source_profile\": \"B\"\n        },\n        \"B\": {\n          \"aws_access_key_id\": \"abc123\",\n          \"aws_secret_access_key\": \"def456\"\n        }\n      },\n      \"selected_profile\": \"A\"\n    },\n    \"output\": {\n      \"ProfileChain\": [\n        {\n          \"AccessKey\": {\n            \"access_key_id\": \"abc123\",\n            \"secret_access_key\": \"def456\"\n          }\n        },\n        {\n          \"AssumeRole\": {\n            \"role_arn\": \"arn:aws:iam::123456789:role/RoleA\",\n            \"external_id\": \"my_external_id\"\n          }\n        }\n      ]\n    }\n  },\n  {\n    \"docs\": \"self referential profile (first load base creds, then use for the role)\",\n    \"input\": {\n      \"profiles\": {\n        \"A\": {\n          \"aws_access_key_id\": \"abc123\",\n          \"aws_secret_access_key\": \"def456\",\n          \"role_arn\": \"arn:aws:iam::123456789:role/RoleA\",\n          \"source_profile\": \"A\"\n        }\n      },\n      \"selected_profile\": \"A\"\n    },\n    \"output\": {\n      \"ProfileChain\": [\n        {\n          \"AccessKey\": {\n            \"access_key_id\": \"abc123\",\n            \"secret_access_key\": \"def456\"\n          }\n        },\n        {\n          \"AssumeRole\": {\n            \"role_arn\": \"arn:aws:iam::123456789:role/RoleA\"\n          }\n        }\n      ]\n    }\n  },\n  {\n    \"docs\": \"Load credentials from a credential_source\",\n    \"input\": {\n      \"profiles\": {\n        \"A\": {\n          \"role_arn\": \"arn:aws:iam::123456789:role/RoleA\",\n          \"credential_source\": \"Ec2InstanceMetadata\"\n        }\n      },\n      \"selected_profile\": \"A\"\n    },\n    \"output\": {\n      \"ProfileChain\": [\n        {\n          \"NamedSource\": \"Ec2InstanceMetadata\"\n        },\n        {\n          \"AssumeRole\": {\n            \"role_arn\": \"arn:aws:iam::123456789:role/RoleA\"\n          }\n        }\n      ]\n    }\n  },\n  {\n    \"docs\": \"role_arn without source source_profile\",\n    \"input\": {\n      \"profiles\": {\n        \"A\": {\n          \"role_arn\": \"arn:aws:iam::123456789:role/RoleA\"\n        }\n      },\n      \"selected_profile\": \"A\"\n    },\n    \"output\": {\n      \"Error\": \"profile must contain `source_profile`\"\n    }\n  },\n  {\n    \"docs\": \"source profile and credential source both present\",\n    \"input\": {\n      \"profiles\": {\n        \"A\": {\n          \"role_arn\": \"arn:aws:iam::123456789:role/RoleA\",\n          \"credential_source\": \"Environment\",\n          \"source_profile\": \"B\"\n        },\n        \"B\": {\n          \"aws_access_key_id\": \"!23\",\n          \"aws_secret_access_key\": \"456\"\n        }\n      },\n      \"selected_profile\": \"A\"\n    },\n    \"output\": {\n      \"Error\": \"profile contained both source_profile and credential_source\"\n    }\n  },\n  {\n    \"docs\": \"partial credentials error (missing secret)\",\n    \"input\": {\n      \"profiles\": {\n        \"A\": {\n          \"role_arn\": \"arn:foo\",\n          \"source_profile\": \"B\"\n        },\n        \"B\": {\n          \"aws_access_key_id\": \"abc123\"\n        }\n      },\n      \"selected_profile\": \"A\"\n    },\n    \"output\": {\n      \"Error\": \"profile missing aws_secret_access_key\"\n    }\n  },\n  {\n    \"docs\": \"partial credentials error (missing access key)\",\n    \"input\": {\n      \"profiles\": {\n        \"A\": {\n          \"role_arn\": \"arn:foo\",\n          \"source_profile\": \"B\"\n        },\n        \"B\": {\n          \"aws_secret_access_key\": \"abc123\"\n        }\n      },\n      \"selected_profile\": \"A\"\n    },\n    \"output\": {\n      \"Error\": \"profile missing aws_access_key_id\"\n    }\n  },\n  {\n    \"docs\": \"missing credentials error (empty source profile)\",\n    \"input\": {\n      \"profiles\": {\n        \"A\": {\n          \"role_arn\": \"arn:foo\",\n          \"source_profile\": \"B\"\n        },\n        \"B\": {}\n      },\n      \"selected_profile\": \"A\"\n    },\n    \"output\": {\n      \"Error\": \"profile `B` did not contain credential information\"\n    }\n  },\n  {\n    \"docs\": \"profile only contains configuration\",\n    \"input\": {\n      \"profiles\": {\n        \"A\": {\n          \"ec2_metadata_service_endpoint_mode\": \"IPv6\"\n        }\n      },\n      \"selected_profile\": \"A\"\n    },\n    \"output\": {\n      \"Error\": \"profile `A` did not contain credential information\"\n    }\n  },\n  {\n    \"docs\": \"missing source profile\",\n    \"input\": {\n      \"profiles\": {\n        \"A\": {\n          \"role_arn\": \"arn:foo\",\n          \"source_profile\": \"B\"\n        }\n      },\n      \"selected_profile\": \"A\"\n    },\n    \"output\": {\n      \"Error\": \"could not find source profile B referenced from A\"\n    }\n  },\n  {\n    \"docs\": \"missing root profile (should never happen in practice)\",\n    \"input\": {\n      \"profiles\": {\n      },\n      \"selected_profile\": \"A\"\n    },\n    \"output\": {\n      \"Error\": \"No profiles were defined\"\n    }\n  },\n  {\n    \"docs\": \"multiple chained assume role profiles\",\n    \"input\": {\n      \"profiles\": {\n        \"A\": {\n          \"role_arn\": \"arn:aws:iam::123456789:role/RoleA\",\n          \"source_profile\": \"B\"\n        },\n        \"B\": {\n          \"role_arn\": \"arn:aws:iam::123456789:role/RoleB\",\n          \"source_profile\": \"C\"\n        },\n        \"C\": {\n          \"aws_access_key_id\": \"mno456\",\n          \"aws_secret_access_key\": \"pqr789\"\n        }\n      },\n      \"selected_profile\": \"A\"\n    },\n    \"output\": {\n      \"ProfileChain\": [\n        {\n          \"AccessKey\": {\n            \"access_key_id\": \"mno456\",\n            \"secret_access_key\": \"pqr789\"\n          }\n        },\n        {\n          \"AssumeRole\": {\n            \"role_arn\": \"arn:aws:iam::123456789:role/RoleB\"\n          }\n        },\n        {\n          \"AssumeRole\": {\n            \"role_arn\": \"arn:aws:iam::123456789:role/RoleA\"\n          }\n        }\n      ]\n    }\n  },\n  {\n    \"docs\": \"chained assume role profiles with static credentials (ignore assume role when static credentials present)\",\n    \"input\": {\n      \"profiles\": {\n        \"A\": {\n          \"role_arn\": \"arn:aws:iam::123456789:role/RoleA\",\n          \"aws_access_key_id\": \"bug_if_returned\",\n          \"aws_secret_access_key\": \"bug_if_returned\",\n          \"source_profile\": \"B\"\n        },\n        \"B\": {\n          \"role_arn\": \"arn:aws:iam::123456789:role/RoleB\",\n          \"source_profile\": \"C\",\n          \"aws_access_key_id\": \"profile_b_key\",\n          \"aws_secret_access_key\": \"profile_b_secret\"\n        },\n        \"C\": {\n          \"aws_access_key_id\": \"bug_if_returned\",\n          \"aws_secret_access_key\": \"bug_if_returned\"\n        }\n      },\n      \"selected_profile\": \"A\"\n    },\n    \"output\": {\n      \"ProfileChain\": [\n        {\n          \"AccessKey\": {\n            \"access_key_id\": \"profile_b_key\",\n            \"secret_access_key\": \"profile_b_secret\"\n          }\n        },\n        {\n          \"AssumeRole\": {\n            \"role_arn\": \"arn:aws:iam::123456789:role/RoleA\"\n          }\n        }\n      ]\n    }\n  },\n  {\n    \"docs\": \"assume role profile infinite loop\",\n    \"input\": {\n      \"profiles\": {\n        \"A\": {\n          \"role_arn\": \"arn:aws:iam::123456789:role/RoleA\",\n          \"source_profile\": \"B\"\n        },\n        \"B\": {\n          \"role_arn\": \"arn:aws:iam::123456789:role/RoleB\",\n          \"source_profile\": \"A\"\n        }\n      },\n      \"selected_profile\": \"A\"\n    },\n    \"output\": {\n      \"Error\": \"profile formed an infinite loop\"\n    }\n  },\n  {\n    \"docs\": \"infinite loop with static credentials\",\n    \"input\": {\n      \"profiles\": {\n        \"A\": {\n          \"role_arn\": \"arn:aws:iam::123456789:role/RoleA\",\n          \"aws_access_key_id\": \"bug_if_returned\",\n          \"aws_secret_access_key\": \"bug_if_returned\",\n          \"source_profile\": \"B\"\n        },\n        \"B\": {\n          \"role_arn\": \"arn:aws:iam::123456789:role/RoleB\",\n          \"source_profile\": \"A\"\n        }\n      },\n      \"selected_profile\": \"A\"\n    },\n    \"output\": {\n      \"Error\": \"profile formed an infinite loop\"\n    }\n  },\n  {\n    \"docs\": \"web identity role\",\n    \"input\": {\n      \"profiles\": {\n        \"A\": {\n          \"role_arn\": \"arn:aws:iam::123456789:role/RoleA\",\n          \"web_identity_token_file\": \"/var/token.jwt\"\n        }\n      },\n      \"selected_profile\": \"A\"\n    },\n    \"output\": {\n      \"ProfileChain\": [\n        {\n          \"WebIdentityToken\": {\n            \"role_arn\": \"arn:aws:iam::123456789:role/RoleA\",\n            \"web_identity_token_file\": \"/var/token.jwt\"\n          }\n        }\n      ]\n    }\n  },\n  {\n    \"docs\": \"web identity role with session name\",\n    \"input\": {\n      \"profiles\": {\n        \"A\": {\n          \"role_arn\": \"arn:aws:iam::123456789:role/RoleA\",\n          \"web_identity_token_file\": \"/var/token.jwt\",\n          \"role_session_name\": \"some_session_name\"\n        }\n      },\n      \"selected_profile\": \"A\"\n    },\n    \"output\": {\n      \"ProfileChain\": [\n        {\n          \"WebIdentityToken\": {\n            \"role_arn\": \"arn:aws:iam::123456789:role/RoleA\",\n            \"web_identity_token_file\": \"/var/token.jwt\",\n            \"role_session_name\": \"some_session_name\"\n          }\n        }\n      ]\n    }\n  },\n  {\n    \"docs\": \"web identity role\",\n    \"input\": {\n      \"profiles\": {\n        \"A\": {\n          \"web_identity_token_file\": \"/var/token.jwt\"\n        }\n      },\n      \"selected_profile\": \"A\"\n    },\n    \"output\": {\n      \"Error\": \"`role_arn` was missing\"\n    }\n  },\n  {\n    \"docs\": \"web identity token as source profile\",\n    \"input\": {\n      \"profiles\": {\n        \"A\": {\n          \"role_arn\": \"arn:aws:iam::123456789:role/RoleA\",\n          \"source_profile\": \"B\"\n        },\n        \"B\": {\n          \"role_arn\": \"arn:aws:iam::123456789:role/RoleB\",\n          \"web_identity_token_file\": \"/var/token.jwt\",\n          \"role_session_name\": \"some_session_name\"\n        }\n      },\n      \"selected_profile\": \"A\"\n    },\n    \"output\": {\n      \"ProfileChain\": [\n        {\n          \"WebIdentityToken\": {\n            \"role_arn\": \"arn:aws:iam::123456789:role/RoleB\",\n            \"web_identity_token_file\": \"/var/token.jwt\",\n            \"role_session_name\": \"some_session_name\"\n          }\n        },\n        {\n          \"AssumeRole\": {\n            \"role_arn\": \"arn:aws:iam::123456789:role/RoleA\"\n          }\n        }\n      ]\n    }\n  },\n  {\n    \"docs\": \"SSO credentials profile selected\",\n    \"input\": {\n      \"selected_profile\": \"A\",\n      \"profiles\": {\n        \"A\": {\n          \"sso_account_id\": \"0123\",\n          \"sso_region\": \"us-east-7\",\n          \"sso_role_name\": \"testrole\",\n          \"sso_start_url\": \"https://foo.bar\"\n        }\n      }\n    },\n    \"output\": {\n      \"ProfileChain\": [\n        {\n          \"Sso\": {\n            \"sso_account_id\": \"0123\",\n            \"sso_region\": \"us-east-7\",\n            \"sso_role_name\": \"testrole\",\n            \"sso_start_url\": \"https://foo.bar\"\n          }\n        }\n      ]\n    }\n  },\n  {\n    \"docs\": \"invalid SSO credentials configuration: missing account ID\",\n    \"input\": {\n      \"selected_profile\": \"A\",\n      \"profiles\": {\n        \"A\": {\n          \"sso_region\": \"us-east-7\",\n          \"sso_role_name\": \"testrole\",\n          \"sso_start_url\": \"https://foo.bar\"\n        }\n      }\n    },\n    \"output\": {\n      \"Error\": \"if `sso_role_name` is set, then `sso_account_id` must also be set\"\n    }\n  },\n  {\n    \"docs\": \"invalid SSO credentials configuration: missing role name\",\n    \"input\": {\n      \"selected_profile\": \"A\",\n      \"profiles\": {\n        \"A\": {\n          \"sso_region\": \"us-east-7\",\n          \"sso_account_id\": \"012345678901\",\n          \"sso_start_url\": \"https://foo.bar\"\n        }\n      }\n    },\n    \"output\": {\n      \"Error\": \"if `sso_account_id` is set, then `sso_role_name` must also be set\"\n    }\n  },\n  {\n    \"docs\": \"invalid SSO token configuration: sso_region must be in sso-session\",\n    \"input\": {\n      \"selected_profile\": \"A\",\n      \"profiles\": {\n        \"A\": {\n          \"sso_session\": \"A\",\n          \"sso_region\": \"us-east-7\"\n        }\n      },\n      \"sso_sessions\": {\n        \"A\": {\n          \"sso_start_url\": \"https://foo.bar\"\n        }\n      }\n    },\n    \"output\": {\n      \"Error\": \"`sso_region` can only be specified in the [sso-session] config when a session name is given\"\n    }\n  },\n  {\n    \"docs\": \"SSO token profile selected\",\n    \"input\": {\n      \"selected_profile\": \"A\",\n      \"profiles\": {\n        \"A\": {\n          \"sso_session\": \"foo\"\n        }\n      },\n      \"sso_sessions\": {\n        \"foo\": {\n          \"sso_region\": \"us-east-7\",\n          \"sso_start_url\": \"https://foo.bar\"\n        }\n      }\n    },\n    \"output\": {\n      \"ProfileChain\": [\n        {\n          \"Sso\": {\n            \"sso_session\": \"foo\",\n            \"sso_region\": \"us-east-7\",\n            \"sso_start_url\": \"https://foo.bar\"\n          }\n        }\n      ]\n    }\n  },\n  {\n    \"docs\": \"invalid SSO token configuration: sso-session not found\",\n    \"input\": {\n      \"selected_profile\": \"A\",\n      \"profiles\": {\n        \"A\": {\n          \"sso_session\": \"oops\"\n        }\n      },\n      \"sso_sessions\": {\n      }\n    },\n    \"output\": {\n      \"Error\": \"sso-session named `oops` (referenced by profile `A`) was not found\"\n    }\n  }\n]\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/e2e_fips_and_dual_stack_sso/env.json",
    "content": "{\n  \"HOME\": \"/home\",\n  \"AWS_REGION\": \"us-west-2\",\n  \"AWS_PROFILE\": \"sso-test\",\n  \"AWS_USE_FIPS_ENDPOINT\": \"true\",\n  \"AWS_USE_DUALSTACK_ENDPOINT\": \"true\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/e2e_fips_and_dual_stack_sso/fs/home/.aws/config",
    "content": "[profile sso-test]\nsso_start_url = https://ssotest.awsapps.com/start\nsso_region = us-east-2\nsso_account_id = 123456789\nsso_role_name = MySsoRole\nregion = us-east-2\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/e2e_fips_and_dual_stack_sso/fs/home/.aws/sso/cache/dace00cba5f8355ec9d274ceb2bcebdfbeed0e12.json",
    "content": "{\n  \"accessToken\": \"a-token\",\n  \"expiresAt\": \"2080-10-16T03:56:45Z\",\n  \"startUrl\": \"https://ssotest.awsapps.com/start\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/e2e_fips_and_dual_stack_sso/http-traffic.json",
    "content": "{\n  \"events\": [\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Request\": {\n          \"request\": {\n            \"uri\": \"https://portal.sso-fips.us-east-2.api.aws/federation/credentials?account_id=123456789&role_name=MySsoRole\",\n            \"headers\": {\n              \"x-amz-sso_bearer_token\": [\n                \"a-token\"\n              ],\n              \"Host\": [\n                \"portal.sso-fips.us-east-2.api.aws\"\n              ]\n            },\n            \"method\": \"GET\"\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Response\": {\n          \"response\": {\n            \"Ok\": {\n              \"status\": 200,\n              \"version\": \"HTTP/1.1\",\n              \"headers\": {\n                \"Date\": [\n                  \"Mon, 03 Jan 2022 19:13:54 GMT\"\n                ],\n                \"Content-Type\": [\n                  \"application/json\"\n                ],\n                \"Content-Length\": [\n                  \"144\"\n                ],\n                \"Connection\": [\n                  \"keep-alive\"\n                ],\n                \"Access-Control-Expose-Headers\": [\n                  \"RequestId\"\n                ],\n                \"Cache-Control\": [\n                  \"no-cache\"\n                ],\n                \"RequestId\": [\n                  \"b339b807-25d1-474c-a476-b070e9f350e4\"\n                ],\n                \"Server\": [\n                  \"AWS SSO\"\n                ]\n              }\n            }\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"{\\\"roleCredentials\\\":{\\\"accessKeyId\\\":\\\"ASIARCORRECT\\\",\\\"secretAccessKey\\\":\\\"secretkeycorrect\\\",\\\"sessionToken\\\":\\\"tokencorrect\\\",\\\"expiration\\\":1234567890000}}\"\n          },\n          \"direction\": \"Response\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Response\"\n        }\n      }\n    }\n  ],\n  \"docs\": \"Load SSO credentials\",\n  \"version\": \"V0\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/e2e_fips_and_dual_stack_sso/test-case.json",
    "content": "{\n  \"name\": \"e2e_fips_and_dual_stack_sso\",\n  \"docs\": \"end to end SSO test with FIPS and dual stack enabled\",\n  \"result\": {\n    \"Ok\": {\n      \"access_key_id\": \"ASIARCORRECT\",\n      \"secret_access_key\": \"secretkeycorrect\",\n      \"session_token\": \"tokencorrect\",\n      \"account_id\": \"123456789\",\n      \"expiry\": 1234567890\n    }\n  }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/ecs_assume_role/env.json",
    "content": "{\n  \"HOME\": \"/home\",\n  \"AWS_CONTAINER_CREDENTIALS_RELATIVE_URI\": \"/v2/credentials/52b19262-e7aa-4f56-a1cd-b958dcde8f3b\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/ecs_assume_role/fs/home/.aws/config",
    "content": "[default]\nregion = us-east-1\nrole_arn = arn:aws:iam::130633740322:role/imds-chained-role-test\ncredential_source = EcsContainer\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/ecs_assume_role/http-traffic.json",
    "content": "{\n  \"events\": [\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Request\": {\n          \"request\": {\n            \"uri\": \"http://169.254.170.2/v2/credentials/52b19262-e7aa-4f56-a1cd-b958dcde8f3b\",\n            \"headers\": {\n              \"accept\": [\n                \"application/json\"\n              ]\n            },\n            \"method\": \"GET\"\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Response\": {\n          \"response\": {\n            \"Ok\": {\n              \"status\": 200,\n              \"version\": \"HTTP/1.1\",\n              \"headers\": {\n                \"content-type\": [\n                  \"application/json\"\n                ],\n                \"x-rate-limit-duration\": [\n                  \"1\"\n                ],\n                \"x-rate-limit-limit\": [\n                  \"40\"\n                ],\n                \"x-rate-limit-request-forwarded-for\": [\n                  \"\"\n                ],\n                \"x-rate-limit-request-remote-addr\": [\n                  \"169.254.172.2:35484\"\n                ],\n                \"date\": [\n                  \"Fri, 15 Oct 2021 15:23:49 GMT\"\n                ],\n                \"content-length\": [\n                  \"1231\"\n                ]\n              }\n            }\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"{\\\"RoleArn\\\":\\\"arn:aws:iam::123456789:role/ecs-task-role\\\",\\\"AccessKeyId\\\":\\\"ASIARTEST\\\",\\\"SecretAccessKey\\\":\\\"SECRETTEST\\\",\\\"Token\\\":\\\"tokenEaCXVzLXdlc3QtMiJGMEQCIHt47W18eF4dYfSlmKGiwuJnqmIS3LMXNYfODBCEhcnaAiAnuhGOpcdIDxin4QFzhtgaCR2MpcVqR8NFJdMgOt0/xyrnAwhhEAEaDDEzNDA5NTA2NTg1NiIM9M9GT+c5UfV/8r7PKsQDUa9xE9Eprz5N+jgxbFSD2aJR2iyXCcP9Q1cOh4fdZhyw2WNmq9XnIa2tkzrreiQ5R2t+kzergJHO1KRZPfesarfJ879aWJCSocsEKh7xXwwzTsVXrNo5eWkpwTh64q+Ksz15eoaBhtrvnGvPx6SmXv7SToi/DTHFafJlT/T9jITACZvZXSE9zfLka26Rna3rI4g0ugowha//j1f/c1XuKloqshpZvMKc561om9Y5fqBv1fRiS2KhetGTcmz3wUqNQAk8Dq9oINS7cCtdIO0atqCK69UaKeJ9uKY8mzY9dFWw2IrkpOoXmA9r955iU0NOz/95jVJiPZ/8aE8vb0t67gQfzBUCfky+mGSGWAfPRXQlFa5AEulCTHPd7IcTVCtasG033oKEKgB8QnTxvM2LaPlwaaHo7MHGYXeUKbn9NRKd8m1ShwmAlr4oKp1vQp6cPHDTsdTfPTzh/ZAjUPs+ljQbAwqXbPQdUUPpOk0vltY8k6Im9EA0pf80iUNoqrixpmPsR2hzI/ybUwdh+QhvCSBx+J8KHqF6X92u4qAVYIxLy/LGZKT9YC6Kr9Gywn+Ro+EK/xl3axHPzNpbjRDJnbW3HrMw5LmmiwY6pgGWgmD6IOq4QYUtu1uhaLQZyoI5o5PWn+d3kqqxifu8D0ykldB3lQGdlJ2rjKJjCdx8fce1SoXao9cc4hiwn39hUPuTqzVwv2zbzCKmNggIpXP6gqyRtUCakf6tI7ZwqTb2S8KF3t4ElIP8i4cPdNoI0JHSC+sT4LDPpUcX1CjGxfvo55mBHJedW3LXve8TRj4UckFXT1gLuTnzqPMrC5AHz4TAt+uv\\\",\\\"Expiration\\\" : \\\"2009-02-13T23:31:30Z\\\"}\"\n          },\n          \"direction\": \"Response\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Response\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 1,\n      \"action\": {\n        \"Request\": {\n          \"request\": {\n            \"uri\": \"https://sts.us-east-1.amazonaws.com/\",\n            \"headers\": {\n              \"x-amz-user-agent\": [\n                \"aws-sdk-rust/0.1.0 api/sts/0.0.18-alpha os/linux lang/rust/1.52.1\"\n              ],\n              \"x-amz-date\": [\n                \"20210921T174125Z\"\n              ],\n              \"content-type\": [\n                \"application/x-www-form-urlencoded\"\n              ],\n              \"authorization\": [\n                \"AWS4-HMAC-SHA256 Credential=ASIARSTSBASE/20210921/us-east-1/sts/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-date;x-amz-security-token;x-amz-user-agent, Signature=04b50dce4d88239e17186ec45aeeec13e8f04f7b3b04a03f152ef4cdc5f22c41\"\n              ],\n              \"user-agent\": [\n                \"aws-sdk-rust/0.1.0 os/linux lang/rust/1.52.1\"\n              ],\n              \"x-amz-security-token\": [\n                \"tokenbase\"\n              ],\n              \"content-length\": [\n                \"165\"\n              ]\n            },\n            \"method\": \"POST\"\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 1,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"Action=AssumeRole&Version=2011-06-15&RoleArn=arn%3Aaws%3Aiam%3A%3A130633740322%3Arole%2Fimds-chained-role-test&RoleSessionName=assume-role-from-profile-1632246085998\"\n          },\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 1,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 1,\n      \"action\": {\n        \"Response\": {\n          \"response\": {\n            \"Ok\": {\n              \"status\": 200,\n              \"version\": \"HTTP/1.1\",\n              \"headers\": {\n                \"x-amzn-requestid\": [\n                  \"d9d47248-fd55-4686-ad7c-0fb7cd1cddd7\"\n                ],\n                \"content-length\": [\n                  \"1557\"\n                ],\n                \"content-type\": [\n                  \"text/xml\"\n                ],\n                \"date\": [\n                  \"Tue, 21 Sep 2021 17:41:25 GMT\"\n                ]\n              }\n            }\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 1,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"<AssumeRoleResponse xmlns=\\\"https://sts.amazonaws.com/doc/2011-06-15/\\\">\\n  <AssumeRoleResult>\\n    <AssumedRoleUser>\\n      <AssumedRoleId>AROAR42TAWARILN3MNKUT:assume-role-from-profile-1632246085998</AssumedRoleId>\\n      <Arn>arn:aws:sts::130633740322:assumed-role/imds-chained-role-test/assume-role-from-profile-1632246085998</Arn>\\n    </AssumedRoleUser>\\n    <Credentials>\\n      <AccessKeyId>ASIARCORRECT</AccessKeyId>\\n      <SecretAccessKey>secretkeycorrect</SecretAccessKey>\\n      <SessionToken>tokencorrect</SessionToken>\\n      <Expiration>2021-09-21T18:41:26Z</Expiration>\\n    </Credentials>\\n  </AssumeRoleResult>\\n  <ResponseMetadata>\\n    <RequestId>d9d47248-fd55-4686-ad7c-0fb7cd1cddd7</RequestId>\\n  </ResponseMetadata>\\n</AssumeRoleResponse>\\n\"\n          },\n          \"direction\": \"Response\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 1,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Response\"\n        }\n      }\n    }\n  ],\n  \"docs\": \"IMDS role assumption\",\n  \"version\": \"V0\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/ecs_assume_role/test-case.json",
    "content": "{\n  \"name\": \"ecs-assume-role\",\n  \"docs\": \"load base creds from ECS then use those credentials to assume a role\",\n  \"result\": {\n    \"Ok\": {\n      \"access_key_id\": \"ASIARCORRECT\",\n      \"secret_access_key\": \"secretkeycorrect\",\n      \"session_token\": \"tokencorrect\",\n      \"account_id\": \"130633740322\",\n      \"expiry\": 1632249686\n    }\n  }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/ecs_credentials/env.json",
    "content": "{\n  \"HOME\": \"/home\",\n  \"AWS_REGION\": \"us-east-1\",\n  \"AWS_CONTAINER_CREDENTIALS_RELATIVE_URI\": \"/v2/credentials/52b19262-e7aa-4f56-a1cd-b958dcde8f3b\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/ecs_credentials/http-traffic.json",
    "content": "{\n  \"events\": [\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Request\": {\n          \"request\": {\n            \"uri\": \"http://169.254.170.2/v2/credentials/52b19262-e7aa-4f56-a1cd-b958dcde8f3b\",\n            \"headers\": {\n              \"accept\": [\n                \"application/json\"\n              ]\n            },\n            \"method\": \"GET\"\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Response\": {\n          \"response\": {\n            \"Ok\": {\n              \"status\": 200,\n              \"version\": \"HTTP/1.1\",\n              \"headers\": {\n                \"content-type\": [\n                  \"application/json\"\n                ],\n                \"x-rate-limit-duration\": [\n                  \"1\"\n                ],\n                \"x-rate-limit-limit\": [\n                  \"40\"\n                ],\n                \"x-rate-limit-request-forwarded-for\": [\n                  \"\"\n                ],\n                \"x-rate-limit-request-remote-addr\": [\n                  \"169.254.172.2:35484\"\n                ],\n                \"date\": [\n                  \"Fri, 15 Oct 2021 15:23:49 GMT\"\n                ],\n                \"content-length\": [\n                  \"1231\"\n                ]\n              }\n            }\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"{\\\"RoleArn\\\":\\\"arn:aws:iam::123456789:role/ecs-task-role\\\",\\\"AccessKeyId\\\":\\\"ASIARCORRECT\\\",\\\"SecretAccessKey\\\":\\\"secretkeycorrect\\\",\\\"Token\\\":\\\"tokencorrect\\\",\\\"AccountId\\\":\\\"012345678901\\\",\\\"Expiration\\\" : \\\"2009-02-13T23:31:30Z\\\"}\"\n          },\n          \"direction\": \"Response\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Response\"\n        }\n      }\n    }\n  ],\n  \"docs\": \"Load ECS credentials\",\n  \"version\": \"V0\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/ecs_credentials/test-case.json",
    "content": "{\n  \"name\": \"ecs-credentials\",\n  \"docs\": \"load credentials directly from ECS\",\n  \"result\": {\n    \"Ok\": {\n      \"access_key_id\": \"ASIARCORRECT\",\n      \"secret_access_key\": \"secretkeycorrect\",\n      \"session_token\": \"tokencorrect\",\n      \"account_id\": \"012345678901\",\n      \"expiry\": 1234567890\n    }\n  }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/ecs_credentials_invalid_profile/env.json",
    "content": "{\n  \"HOME\": \"/home\",\n  \"AWS_REGION\": \"us-east-1\",\n  \"AWS_CONTAINER_CREDENTIALS_RELATIVE_URI\": \"/v2/credentials/52b19262-e7aa-4f56-a1cd-b958dcde8f3b\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/ecs_credentials_invalid_profile/fs/home/.aws/config",
    "content": "# a profile that isn't the `default` profile\n[profile notdefault]\na = b\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/ecs_credentials_invalid_profile/http-traffic.json",
    "content": "{\n  \"events\": [\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Request\": {\n          \"request\": {\n            \"uri\": \"http://169.254.170.2/v2/credentials/52b19262-e7aa-4f56-a1cd-b958dcde8f3b\",\n            \"headers\": {\n              \"accept\": [\n                \"application/json\"\n              ]\n            },\n            \"method\": \"GET\"\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Response\": {\n          \"response\": {\n            \"Ok\": {\n              \"status\": 200,\n              \"version\": \"HTTP/1.1\",\n              \"headers\": {\n                \"content-type\": [\n                  \"application/json\"\n                ],\n                \"x-rate-limit-duration\": [\n                  \"1\"\n                ],\n                \"x-rate-limit-limit\": [\n                  \"40\"\n                ],\n                \"x-rate-limit-request-forwarded-for\": [\n                  \"\"\n                ],\n                \"x-rate-limit-request-remote-addr\": [\n                  \"169.254.172.2:35484\"\n                ],\n                \"date\": [\n                  \"Fri, 15 Oct 2021 15:23:49 GMT\"\n                ],\n                \"content-length\": [\n                  \"1231\"\n                ]\n              }\n            }\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"{\\\"RoleArn\\\":\\\"arn:aws:iam::123456789:role/ecs-task-role\\\",\\\"AccessKeyId\\\":\\\"ASIARCORRECT\\\",\\\"SecretAccessKey\\\":\\\"secretkeycorrect\\\",\\\"Token\\\":\\\"tokencorrect\\\",\\\"AccountId\\\":\\\"012345678901\\\",\\\"Expiration\\\" : \\\"2009-02-13T23:31:30Z\\\"}\"\n          },\n          \"direction\": \"Response\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Response\"\n        }\n      }\n    }\n  ],\n  \"docs\": \"Load ECS credentials\",\n  \"version\": \"V0\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/ecs_credentials_invalid_profile/test-case.json",
    "content": "{\n  \"name\": \"ecs-credentials\",\n  \"docs\": \"load credentials directly from ECS\",\n  \"result\": {\n    \"Ok\": {\n      \"access_key_id\": \"ASIARCORRECT\",\n      \"secret_access_key\": \"secretkeycorrect\",\n      \"session_token\": \"tokencorrect\",\n      \"account_id\": \"012345678901\",\n      \"expiry\": 1234567890\n    }\n  }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/eks_pod_identity_credentials/env.json",
    "content": "{\n  \"HOME\": \"/home\",\n  \"AWS_REGION\": \"us-east-1\",\n  \"AWS_CONTAINER_CREDENTIALS_FULL_URI\": \"http://169.254.170.23/v1/credentials\",\n  \"AWS_CONTAINER_AUTHORIZATION_TOKEN_FILE\": \"/token.jwt\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/eks_pod_identity_credentials/fs/token.jwt",
    "content": "sometoken"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/eks_pod_identity_credentials/http-traffic.json",
    "content": "{\n  \"events\": [\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Request\": {\n          \"request\": {\n            \"uri\": \"http://169.254.170.23/v1/credentials\",\n            \"headers\": {\n              \"accept\": [\n                \"application/json\"\n              ]\n            },\n            \"method\": \"GET\"\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Response\": {\n          \"response\": {\n            \"Ok\": {\n              \"status\": 200,\n              \"version\": \"HTTP/1.1\",\n              \"headers\": {\n                \"content-type\": [\n                  \"application/json\"\n                ],\n                \"x-rate-limit-duration\": [\n                  \"1\"\n                ],\n                \"x-rate-limit-limit\": [\n                  \"40\"\n                ],\n                \"x-rate-limit-request-forwarded-for\": [\n                  \"\"\n                ],\n                \"x-rate-limit-request-remote-addr\": [\n                  \"169.254.172.2:35484\"\n                ],\n                \"date\": [\n                  \"Fri, 15 Oct 2021 15:23:49 GMT\"\n                ],\n                \"content-length\": [\n                  \"1231\"\n                ]\n              }\n            }\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"{\\\"RoleArn\\\":\\\"arn:aws:iam::123456789:role/eks-pod-identity-role\\\",\\\"AccessKeyId\\\":\\\"ASIARCORRECT\\\",\\\"SecretAccessKey\\\":\\\"secretkeycorrect\\\",\\\"Token\\\":\\\"tokencorrect\\\",\\\"AccountId\\\":\\\"012345678901\\\",\\\"Expiration\\\" : \\\"2009-02-13T23:31:30Z\\\"}\"\n          },\n          \"direction\": \"Response\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Response\"\n        }\n      }\n    }\n  ],\n  \"docs\": \"Load EKS Pod Identity credentials\",\n  \"version\": \"V0\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/eks_pod_identity_credentials/test-case.json",
    "content": "{\n  \"name\": \"ecs-pod-identity-credentials\",\n  \"docs\": \"load credentials directly from EKS Pod Identity\",\n  \"result\": {\n    \"Ok\": {\n      \"access_key_id\": \"ASIARCORRECT\",\n      \"secret_access_key\": \"secretkeycorrect\",\n      \"session_token\": \"tokencorrect\",\n      \"account_id\": \"012345678901\",\n      \"expiry\": 1234567890\n    }\n  }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/eks_pod_identity_no_token_file/env.json",
    "content": "{\n  \"HOME\": \"/home\",\n  \"AWS_REGION\": \"us-east-1\",\n  \"AWS_CONTAINER_CREDENTIALS_FULL_URI\": \"http://169.254.170.23/v1/credentials\",\n  \"AWS_CONTAINER_AUTHORIZATION_TOKEN_FILE\": \"/token.jwt\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/eks_pod_identity_no_token_file/http-traffic.json",
    "content": "{\n  \"events\": [],\n  \"docs\": \"missing token file, no traffic\",\n  \"version\": \"V0\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/eks_pod_identity_no_token_file/test-case.json",
    "content": "{\n  \"name\": \"ecs-pod-identity-no-token-file\",\n  \"docs\": \"fail to load credentials from EKS Pod Identity without a token file\",\n  \"result\": {\n    \"ErrorContains\": \"No such file or directory (os error 2)\"\n  }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/environment_variables/env.json",
    "content": "{\n  \"HOME\": \"/home\",\n  \"AWS_ACCESS_KEY_ID\": \"foo\",\n  \"AWS_SECRET_ACCESS_KEY\": \"bar\",\n  \"AWS_ACCOUNT_ID\": \"123456789001\",\n  \"EXPOSE_SECRETS_FOR_TESTS\": \"\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/environment_variables/http-traffic.json",
    "content": "{\n  \"events\": [],\n  \"docs\": \"test case uses environment variables, no network requests\",\n  \"version\": \"V0\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/environment_variables/test-case.json",
    "content": "{\n    \"name\": \"environment_variables\",\n    \"docs\": \"credentials are sourced from environment\",\n    \"result\": {\n        \"Ok\": {\n            \"access_key_id\": \"foo\",\n            \"secret_access_key\": \"bar\",\n            \"account_id\": \"123456789001\"\n        }\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/environment_variables_blank/env.json",
    "content": "{\n  \"HOME\": \"/home\",\n  \"AWS_ACCESS_KEY_ID\": \" \",\n  \"AWS_SECRET_ACCESS_KEY\": \" \",\n  \"AWS_PROFILE\": \"some_profile\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/environment_variables_blank/fs/home/.aws/config",
    "content": "[default]\nregion = us-east-1\naws_access_key_id = incorrect_key\naws_secret_access_key = incorrect_secret\n\n[profile some_profile]\nregion = us-east-2\naws_access_key_id = correct_key\naws_secret_access_key = correct_secret\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/environment_variables_blank/http-traffic.json",
    "content": "{\n  \"events\": [],\n  \"docs\": \"test case uses static creds, no network requests\",\n  \"version\": \"V0\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/environment_variables_blank/test-case.json",
    "content": "{\n    \"name\": \"environment_variables_blank\",\n    \"docs\": \"verifies blank AWS_ACCESS_KEY_ID and AWS_SECRET_ACCESS_KEY are treated as missing\",\n    \"result\": {\n        \"Ok\": {\n            \"access_key_id\": \"correct_key\",\n            \"secret_access_key\": \"correct_secret\"\n        }\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/imds_assume_role/env.json",
    "content": "{\n  \"HOME\": \"/home\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/imds_assume_role/fs/home/.aws/config",
    "content": "[default]\nregion = us-east-1\nrole_arn = arn:aws:iam::130633740322:role/imds-chained-role-test\ncredential_source = Ec2InstanceMetadata\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/imds_assume_role/http-traffic.json",
    "content": "{\n    \"events\": [\n        {\n            \"connection_id\": 0,\n            \"action\": {\n                \"Request\": {\n                    \"request\": {\n                        \"uri\": \"http://169.254.169.254/latest/api/token\",\n                        \"headers\": {\n                            \"x-aws-ec2-metadata-token-ttl-seconds\": [\n                                \"21600\"\n                            ],\n                            \"x-amz-user-agent\": [\n                                \"aws-sdk-rust/0.1.0 api/imds/0.1.0 os/linux lang/rust/1.52.1\"\n                            ],\n                            \"user-agent\": [\n                                \"aws-sdk-rust/0.1.0 os/linux lang/rust/1.52.1\"\n                            ]\n                        },\n                        \"method\": \"PUT\"\n                    }\n                }\n            }\n        },\n        {\n            \"connection_id\": 0,\n            \"action\": {\n                \"Eof\": {\n                    \"ok\": true,\n                    \"direction\": \"Request\"\n                }\n            }\n        },\n        {\n            \"connection_id\": 0,\n            \"action\": {\n                \"Response\": {\n                    \"response\": {\n                        \"Ok\": {\n                            \"status\": 200,\n                            \"version\": \"HTTP/1.1\",\n                            \"headers\": {\n                                \"server\": [\n                                    \"EC2ws\"\n                                ],\n                                \"x-aws-ec2-metadata-token-ttl-seconds\": [\n                                    \"21600\"\n                                ],\n                                \"connection\": [\n                                    \"close\"\n                                ],\n                                \"content-length\": [\n                                    \"56\"\n                                ],\n                                \"content-type\": [\n                                    \"text/plain\"\n                                ],\n                                \"date\": [\n                                    \"Tue, 21 Sep 2021 17:41:25 GMT\"\n                                ]\n                            }\n                        }\n                    }\n                }\n            }\n        },\n        {\n            \"connection_id\": 0,\n            \"action\": {\n                \"Data\": {\n                    \"data\": {\n                        \"Utf8\": \"imdssesiontoken==\"\n                    },\n                    \"direction\": \"Response\"\n                }\n            }\n        },\n        {\n            \"connection_id\": 0,\n            \"action\": {\n                \"Eof\": {\n                    \"ok\": true,\n                    \"direction\": \"Response\"\n                }\n            }\n        },\n        {\n            \"connection_id\": 1,\n            \"action\": {\n                \"Request\": {\n                    \"request\": {\n                        \"uri\": \"http://169.254.169.254/latest/meta-data/iam/security-credentials/\",\n                        \"headers\": {\n                            \"x-aws-ec2-metadata-token\": [\n                                \"imdssesiontoken==\"\n                            ],\n                            \"user-agent\": [\n                                \"aws-sdk-rust/0.1.0 os/linux lang/rust/1.52.1\"\n                            ],\n                            \"x-amz-user-agent\": [\n                                \"aws-sdk-rust/0.1.0 api/imds/0.1.0 os/linux lang/rust/1.52.1\"\n                            ]\n                        },\n                        \"method\": \"GET\"\n                    }\n                }\n            }\n        },\n        {\n            \"connection_id\": 1,\n            \"action\": {\n                \"Eof\": {\n                    \"ok\": true,\n                    \"direction\": \"Request\"\n                }\n            }\n        },\n        {\n            \"connection_id\": 1,\n            \"action\": {\n                \"Response\": {\n                    \"response\": {\n                        \"Ok\": {\n                            \"status\": 200,\n                            \"version\": \"HTTP/1.1\",\n                            \"headers\": {\n                                \"content-type\": [\n                                    \"text/plain\"\n                                ],\n                                \"last-modified\": [\n                                    \"Tue, 21 Sep 2021 17:30:41 GMT\"\n                                ],\n                                \"connection\": [\n                                    \"close\"\n                                ],\n                                \"date\": [\n                                    \"Tue, 21 Sep 2021 17:41:25 GMT\"\n                                ],\n                                \"content-length\": [\n                                    \"21\"\n                                ],\n                                \"x-aws-ec2-metadata-token-ttl-seconds\": [\n                                    \"21600\"\n                                ],\n                                \"accept-ranges\": [\n                                    \"none\"\n                                ],\n                                \"server\": [\n                                    \"EC2ws\"\n                                ]\n                            }\n                        }\n                    }\n                }\n            }\n        },\n        {\n            \"connection_id\": 1,\n            \"action\": {\n                \"Data\": {\n                    \"data\": {\n                        \"Utf8\": \"imds-assume-role-test\"\n                    },\n                    \"direction\": \"Response\"\n                }\n            }\n        },\n        {\n            \"connection_id\": 1,\n            \"action\": {\n                \"Eof\": {\n                    \"ok\": true,\n                    \"direction\": \"Response\"\n                }\n            }\n        },\n        {\n            \"connection_id\": 2,\n            \"action\": {\n                \"Request\": {\n                    \"request\": {\n                        \"uri\": \"http://169.254.169.254/latest/meta-data/iam/security-credentials/imds-assume-role-test\",\n                        \"headers\": {\n                            \"user-agent\": [\n                                \"aws-sdk-rust/0.1.0 os/linux lang/rust/1.52.1\"\n                            ],\n                            \"x-aws-ec2-metadata-token\": [\n                                \"imdssesiontoken==\"\n                            ],\n                            \"x-amz-user-agent\": [\n                                \"aws-sdk-rust/0.1.0 api/imds/0.1.0 os/linux lang/rust/1.52.1\"\n                            ]\n                        },\n                        \"method\": \"GET\"\n                    }\n                }\n            }\n        },\n        {\n            \"connection_id\": 2,\n            \"action\": {\n                \"Eof\": {\n                    \"ok\": true,\n                    \"direction\": \"Request\"\n                }\n            }\n        },\n        {\n            \"connection_id\": 2,\n            \"action\": {\n                \"Response\": {\n                    \"response\": {\n                        \"Ok\": {\n                            \"status\": 200,\n                            \"version\": \"HTTP/1.1\",\n                            \"headers\": {\n                                \"connection\": [\n                                    \"close\"\n                                ],\n                                \"server\": [\n                                    \"EC2ws\"\n                                ],\n                                \"date\": [\n                                    \"Tue, 21 Sep 2021 17:41:25 GMT\"\n                                ],\n                                \"accept-ranges\": [\n                                    \"none\"\n                                ],\n                                \"x-aws-ec2-metadata-token-ttl-seconds\": [\n                                    \"21600\"\n                                ],\n                                \"last-modified\": [\n                                    \"Tue, 21 Sep 2021 17:30:41 GMT\"\n                                ],\n                                \"content-type\": [\n                                    \"text/plain\"\n                                ],\n                                \"content-length\": [\n                                    \"1322\"\n                                ]\n                            }\n                        }\n                    }\n                }\n            }\n        },\n        {\n            \"connection_id\": 2,\n            \"action\": {\n                \"Data\": {\n                    \"data\": {\n                        \"Utf8\": \"{\\n  \\\"Code\\\" : \\\"Success\\\",\\n  \\\"LastUpdated\\\" : \\\"2021-09-21T17:31:21Z\\\",\\n  \\\"Type\\\" : \\\"AWS-HMAC\\\",\\n  \\\"AccessKeyId\\\" : \\\"ASIARSTSBASE\\\",\\n  \\\"SecretAccessKey\\\" : \\\"secretbase\\\",\\n  \\\"Token\\\" : \\\"tokenbase\\\",\\n  \\\"Expiration\\\" : \\\"2021-09-21T23:33:13Z\\\"\\n}\"\n                    },\n                    \"direction\": \"Response\"\n                }\n            }\n        },\n        {\n            \"connection_id\": 2,\n            \"action\": {\n                \"Eof\": {\n                    \"ok\": true,\n                    \"direction\": \"Response\"\n                }\n            }\n        },\n        {\n            \"connection_id\": 3,\n            \"action\": {\n                \"Request\": {\n                    \"request\": {\n                        \"uri\": \"https://sts.us-east-1.amazonaws.com/\",\n                        \"headers\": {\n                            \"x-amz-user-agent\": [\n                                \"aws-sdk-rust/0.1.0 api/sts/0.0.18-alpha os/linux lang/rust/1.52.1\"\n                            ],\n                            \"x-amz-date\": [\n                                \"20210921T174125Z\"\n                            ],\n                            \"content-type\": [\n                                \"application/x-www-form-urlencoded\"\n                            ],\n                            \"authorization\": [\n                                \"AWS4-HMAC-SHA256 Credential=ASIARSTSBASE/20210921/us-east-1/sts/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-date;x-amz-security-token;x-amz-user-agent, Signature=04b50dce4d88239e17186ec45aeeec13e8f04f7b3b04a03f152ef4cdc5f22c41\"\n                            ],\n                            \"user-agent\": [\n                                \"aws-sdk-rust/0.1.0 os/linux lang/rust/1.52.1\"\n                            ],\n                            \"x-amz-security-token\": [\n                                \"tokenbase\"\n                            ],\n                            \"content-length\": [\n                                \"165\"\n                            ]\n                        },\n                        \"method\": \"POST\"\n                    }\n                }\n            }\n        },\n        {\n            \"connection_id\": 3,\n            \"action\": {\n                \"Data\": {\n                    \"data\": {\n                        \"Utf8\": \"Action=AssumeRole&Version=2011-06-15&RoleArn=arn%3Aaws%3Aiam%3A%3A130633740322%3Arole%2Fimds-chained-role-test&RoleSessionName=assume-role-from-profile-1632246085998\"\n                    },\n                    \"direction\": \"Request\"\n                }\n            }\n        },\n        {\n            \"connection_id\": 3,\n            \"action\": {\n                \"Eof\": {\n                    \"ok\": true,\n                    \"direction\": \"Request\"\n                }\n            }\n        },\n        {\n            \"connection_id\": 3,\n            \"action\": {\n                \"Response\": {\n                    \"response\": {\n                        \"Ok\": {\n                            \"status\": 200,\n                            \"version\": \"HTTP/1.1\",\n                            \"headers\": {\n                                \"x-amzn-requestid\": [\n                                    \"d9d47248-fd55-4686-ad7c-0fb7cd1cddd7\"\n                                ],\n                                \"content-length\": [\n                                    \"1557\"\n                                ],\n                                \"content-type\": [\n                                    \"text/xml\"\n                                ],\n                                \"date\": [\n                                    \"Tue, 21 Sep 2021 17:41:25 GMT\"\n                                ]\n                            }\n                        }\n                    }\n                }\n            }\n        },\n        {\n            \"connection_id\": 3,\n            \"action\": {\n                \"Data\": {\n                    \"data\": {\n                        \"Utf8\": \"<AssumeRoleResponse xmlns=\\\"https://sts.amazonaws.com/doc/2011-06-15/\\\">\\n  <AssumeRoleResult>\\n    <AssumedRoleUser>\\n      <AssumedRoleId>AROAR42TAWARILN3MNKUT:assume-role-from-profile-1632246085998</AssumedRoleId>\\n      <Arn>arn:aws:sts::130633740322:assumed-role/imds-chained-role-test/assume-role-from-profile-1632246085998</Arn>\\n    </AssumedRoleUser>\\n    <Credentials>\\n      <AccessKeyId>ASIARCORRECT</AccessKeyId>\\n      <SecretAccessKey>secretkeycorrect</SecretAccessKey>\\n      <SessionToken>tokencorrect</SessionToken>\\n      <Expiration>2021-09-21T18:41:26Z</Expiration>\\n    </Credentials>\\n  </AssumeRoleResult>\\n  <ResponseMetadata>\\n    <RequestId>d9d47248-fd55-4686-ad7c-0fb7cd1cddd7</RequestId>\\n  </ResponseMetadata>\\n</AssumeRoleResponse>\\n\"\n                    },\n                    \"direction\": \"Response\"\n                }\n            }\n        },\n        {\n            \"connection_id\": 3,\n            \"action\": {\n                \"Eof\": {\n                    \"ok\": true,\n                    \"direction\": \"Response\"\n                }\n            }\n        }\n    ],\n    \"docs\": \"IMDS role assumption\",\n    \"version\": \"V0\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/imds_assume_role/test-case.json",
    "content": "{\n  \"name\": \"imds-token-fail\",\n  \"docs\": \"acquires credentials via IMDS and uses them to assume a role\",\n  \"result\": {\n    \"Ok\": {\n      \"access_key_id\": \"ASIARCORRECT\",\n      \"secret_access_key\": \"secretkeycorrect\",\n      \"session_token\": \"tokencorrect\",\n      \"account_id\": \"130633740322\",\n      \"expiry\": 1632249686\n    }\n  }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/imds_config_with_no_creds/env.json",
    "content": "{\n  \"HOME\": \"/home\",\n  \"AWS_REGION\": \"us-east-1\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/imds_config_with_no_creds/fs/home/.aws/config",
    "content": "[default]\nmax_attempts = 1\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/imds_config_with_no_creds/http-traffic.json",
    "content": "{\n    \"events\": [\n        {\n            \"connection_id\": 0,\n            \"action\": {\n                \"Request\": {\n                    \"request\": {\n                        \"uri\": \"http://169.254.169.254/latest/api/token\",\n                        \"headers\": {\n                            \"x-amz-user-agent\": [\n                                \"aws-sdk-rust/0.1.0 api/imds/0.1.0 os/linux lang/rust/1.52.1\"\n                            ],\n                            \"user-agent\": [\n                                \"aws-sdk-rust/0.1.0 os/linux lang/rust/1.52.1\"\n                            ],\n                            \"x-aws-ec2-metadata-token-ttl-seconds\": [\n                                \"21600\"\n                            ]\n                        },\n                        \"method\": \"PUT\"\n                    }\n                }\n            }\n        },\n        {\n            \"connection_id\": 0,\n            \"action\": {\n                \"Eof\": {\n                    \"ok\": true,\n                    \"direction\": \"Request\"\n                }\n            }\n        },\n        {\n            \"connection_id\": 0,\n            \"action\": {\n                \"Response\": {\n                    \"response\": {\n                        \"Ok\": {\n                            \"status\": 200,\n                            \"version\": \"HTTP/1.1\",\n                            \"headers\": {\n                                \"x-aws-ec2-metadata-token-ttl-seconds\": [\n                                    \"21600\"\n                                ],\n                                \"content-type\": [\n                                    \"text/plain\"\n                                ],\n                                \"connection\": [\n                                    \"close\"\n                                ],\n                                \"server\": [\n                                    \"EC2ws\"\n                                ],\n                                \"content-length\": [\n                                    \"56\"\n                                ],\n                                \"date\": [\n                                    \"Mon, 20 Sep 2021 21:43:31 GMT\"\n                                ]\n                            }\n                        }\n                    }\n                }\n            }\n        },\n        {\n            \"connection_id\": 0,\n            \"action\": {\n                \"Data\": {\n                    \"data\": {\n                        \"Utf8\": \"AQAEAKQRRHnsX8GCPgYTGMShrFJkMhru3n-8Ul5Gzvzj-bpWKYZuiw==\"\n                    },\n                    \"direction\": \"Response\"\n                }\n            }\n        },\n        {\n            \"connection_id\": 0,\n            \"action\": {\n                \"Eof\": {\n                    \"ok\": true,\n                    \"direction\": \"Response\"\n                }\n            }\n        },\n        {\n            \"connection_id\": 1,\n            \"action\": {\n                \"Request\": {\n                    \"request\": {\n                        \"uri\": \"http://169.254.169.254/latest/meta-data/iam/security-credentials/\",\n                        \"headers\": {\n                            \"x-amz-user-agent\": [\n                                \"aws-sdk-rust/0.1.0 api/imds/0.1.0 os/linux lang/rust/1.52.1\"\n                            ],\n                            \"x-aws-ec2-metadata-token\": [\n                                \"AQAEAKQRRHnsX8GCPgYTGMShrFJkMhru3n-8Ul5Gzvzj-bpWKYZuiw==\"\n                            ],\n                            \"user-agent\": [\n                                \"aws-sdk-rust/0.1.0 os/linux lang/rust/1.52.1\"\n                            ]\n                        },\n                        \"method\": \"GET\"\n                    }\n                }\n            }\n        },\n        {\n            \"connection_id\": 1,\n            \"action\": {\n                \"Eof\": {\n                    \"ok\": true,\n                    \"direction\": \"Request\"\n                }\n            }\n        },\n        {\n            \"connection_id\": 1,\n            \"action\": {\n                \"Response\": {\n                    \"response\": {\n                        \"Ok\": {\n                            \"status\": 200,\n                            \"version\": \"HTTP/1.1\",\n                            \"headers\": {\n                                \"server\": [\n                                    \"EC2ws\"\n                                ],\n                                \"content-length\": [\n                                    \"21\"\n                                ],\n                                \"x-aws-ec2-metadata-token-ttl-seconds\": [\n                                    \"21600\"\n                                ],\n                                \"connection\": [\n                                    \"close\"\n                                ],\n                                \"last-modified\": [\n                                    \"Mon, 20 Sep 2021 21:41:54 GMT\"\n                                ],\n                                \"content-type\": [\n                                    \"text/plain\"\n                                ],\n                                \"date\": [\n                                    \"Mon, 20 Sep 2021 21:43:31 GMT\"\n                                ],\n                                \"accept-ranges\": [\n                                    \"none\"\n                                ]\n                            }\n                        }\n                    }\n                }\n            }\n        },\n        {\n            \"connection_id\": 1,\n            \"action\": {\n                \"Data\": {\n                    \"data\": {\n                        \"Utf8\": \"imds-assume-role-test\"\n                    },\n                    \"direction\": \"Response\"\n                }\n            }\n        },\n        {\n            \"connection_id\": 1,\n            \"action\": {\n                \"Eof\": {\n                    \"ok\": true,\n                    \"direction\": \"Response\"\n                }\n            }\n        },\n        {\n            \"connection_id\": 2,\n            \"action\": {\n                \"Request\": {\n                    \"request\": {\n                        \"uri\": \"http://169.254.169.254/latest/meta-data/iam/security-credentials/imds-assume-role-test\",\n                        \"headers\": {\n                            \"x-aws-ec2-metadata-token\": [\n                                \"AQAEAKQRRHnsX8GCPgYTGMShrFJkMhru3n-8Ul5Gzvzj-bpWKYZuiw==\"\n                            ],\n                            \"user-agent\": [\n                                \"aws-sdk-rust/0.1.0 os/linux lang/rust/1.52.1\"\n                            ],\n                            \"x-amz-user-agent\": [\n                                \"aws-sdk-rust/0.1.0 api/imds/0.1.0 os/linux lang/rust/1.52.1\"\n                            ]\n                        },\n                        \"method\": \"GET\"\n                    }\n                }\n            }\n        },\n        {\n            \"connection_id\": 2,\n            \"action\": {\n                \"Eof\": {\n                    \"ok\": true,\n                    \"direction\": \"Request\"\n                }\n            }\n        },\n        {\n            \"connection_id\": 2,\n            \"action\": {\n                \"Response\": {\n                    \"response\": {\n                        \"Ok\": {\n                            \"status\": 200,\n                            \"version\": \"HTTP/1.1\",\n                            \"headers\": {\n                                \"content-type\": [\n                                    \"text/plain\"\n                                ],\n                                \"server\": [\n                                    \"EC2ws\"\n                                ],\n                                \"content-length\": [\n                                    \"1322\"\n                                ],\n                                \"accept-ranges\": [\n                                    \"none\"\n                                ],\n                                \"date\": [\n                                    \"Mon, 20 Sep 2021 21:43:31 GMT\"\n                                ],\n                                \"connection\": [\n                                    \"close\"\n                                ],\n                                \"last-modified\": [\n                                    \"Mon, 20 Sep 2021 21:41:54 GMT\"\n                                ],\n                                \"x-aws-ec2-metadata-token-ttl-seconds\": [\n                                    \"21600\"\n                                ]\n                            }\n                        }\n                    }\n                }\n            }\n        },\n        {\n            \"connection_id\": 2,\n            \"action\": {\n                \"Data\": {\n                    \"data\": {\n                        \"Utf8\": \"{\\n  \\\"Code\\\" : \\\"Success\\\",\\n  \\\"LastUpdated\\\" : \\\"2021-09-20T21:42:26Z\\\",\\n  \\\"Type\\\" : \\\"AWS-HMAC\\\",\\n  \\\"AccessKeyId\\\" : \\\"ASIARTEST\\\",\\n  \\\"SecretAccessKey\\\" : \\\"testsecret\\\",\\n  \\\"Token\\\" : \\\"testtoken\\\",\\n  \\\"Expiration\\\" : \\\"2021-09-21T04:16:53Z\\\"\\n}\"\n                    },\n                    \"direction\": \"Response\"\n                }\n            }\n        },\n        {\n            \"connection_id\": 2,\n            \"action\": {\n                \"Eof\": {\n                    \"ok\": true,\n                    \"direction\": \"Response\"\n                }\n            }\n        }\n    ],\n    \"docs\": \"profile provider should hit IMDS if a profile contains config data but no credentials.\",\n    \"version\": \"V0\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/imds_config_with_no_creds/test-case.json",
    "content": "{\n  \"name\": \"imds-config-with-no-creds\",\n  \"docs\": \"profile provider should hit IMDS if a profile contains config data but no credentials.\",\n  \"result\": {\n    \"Ok\": {\n      \"access_key_id\": \"ASIARTEST\",\n      \"secret_access_key\": \"testsecret\",\n      \"session_token\": \"testtoken\",\n      \"expiry\": 1632197813\n    }\n  }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/imds_default_chain_error/env.json",
    "content": "{\n  \"HOME\": \"/home\",\n  \"AWS_REGION\": \"us-east-1\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/imds_default_chain_error/fs/home/.aws/config",
    "content": ""
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/imds_default_chain_error/http-traffic.json",
    "content": "{\n    \"events\": [\n        {\n            \"connection_id\": 0,\n            \"action\": {\n                \"Request\": {\n                    \"request\": {\n                        \"uri\": \"http://169.254.169.254/latest/api/token\",\n                        \"headers\": {\n                            \"user-agent\": [\n                                \"aws-sdk-rust/0.1.0 os/linux lang/rust/1.52.1\"\n                            ],\n                            \"x-aws-ec2-metadata-token-ttl-seconds\": [\n                                \"21600\"\n                            ],\n                            \"x-amz-user-agent\": [\n                                \"aws-sdk-rust/0.1.0 api/imds/0.1.0 os/linux lang/rust/1.52.1\"\n                            ]\n                        },\n                        \"method\": \"PUT\"\n                    }\n                }\n            }\n        },\n        {\n            \"connection_id\": 0,\n            \"action\": {\n                \"Eof\": {\n                    \"ok\": true,\n                    \"direction\": \"Request\"\n                }\n            }\n        },\n        {\n            \"connection_id\": 0,\n            \"action\": {\n                \"Response\": {\n                    \"response\": {\n                        \"Ok\": {\n                            \"status\": 200,\n                            \"version\": \"HTTP/1.1\",\n                            \"headers\": {\n                                \"content-type\": [\n                                    \"text/plain\"\n                                ],\n                                \"date\": [\n                                    \"Mon, 20 Sep 2021 20:51:52 GMT\"\n                                ],\n                                \"x-aws-ec2-metadata-token-ttl-seconds\": [\n                                    \"21600\"\n                                ],\n                                \"connection\": [\n                                    \"close\"\n                                ],\n                                \"server\": [\n                                    \"EC2ws\"\n                                ],\n                                \"content-length\": [\n                                    \"56\"\n                                ]\n                            }\n                        }\n                    }\n                }\n            }\n        },\n        {\n            \"connection_id\": 0,\n            \"action\": {\n                \"Data\": {\n                    \"data\": {\n                        \"Utf8\": \"faketoken\"\n                    },\n                    \"direction\": \"Response\"\n                }\n            }\n        },\n        {\n            \"connection_id\": 0,\n            \"action\": {\n                \"Eof\": {\n                    \"ok\": true,\n                    \"direction\": \"Response\"\n                }\n            }\n        },\n        {\n            \"connection_id\": 1,\n            \"action\": {\n                \"Request\": {\n                    \"request\": {\n                        \"uri\": \"http://169.254.169.254/latest/meta-data/iam/security-credentials/\",\n                        \"headers\": {\n                            \"user-agent\": [\n                                \"aws-sdk-rust/0.1.0 os/linux lang/rust/1.52.1\"\n                            ],\n                            \"x-amz-user-agent\": [\n                                \"aws-sdk-rust/0.1.0 api/imds/0.1.0 os/linux lang/rust/1.52.1\"\n                            ],\n                            \"x-aws-ec2-metadata-token\": [\n                               \"faketoken\"\n                            ]\n                        },\n                        \"method\": \"GET\"\n                    }\n                }\n            }\n        },\n        {\n            \"connection_id\": 1,\n            \"action\": {\n                \"Eof\": {\n                    \"ok\": true,\n                    \"direction\": \"Request\"\n                }\n            }\n        },\n        {\n            \"connection_id\": 1,\n            \"action\": {\n                \"Response\": {\n                    \"response\": {\n                        \"Ok\": {\n                            \"status\": 404,\n                            \"version\": \"HTTP/1.1\",\n                            \"headers\": {\n                                \"content-length\": [\n                                    \"339\"\n                                ],\n                                \"date\": [\n                                    \"Mon, 20 Sep 2021 20:51:52 GMT\"\n                                ],\n                                \"content-type\": [\n                                    \"text/html\"\n                                ],\n                                \"x-aws-ec2-metadata-token-ttl-seconds\": [\n                                    \"21600\"\n                                ],\n                                \"connection\": [\n                                    \"close\"\n                                ],\n                                \"server\": [\n                                    \"EC2ws\"\n                                ]\n                            }\n                        }\n                    }\n                }\n            }\n        },\n        {\n            \"connection_id\": 1,\n            \"action\": {\n                \"Data\": {\n                    \"data\": {\n                        \"Utf8\": \"<?xml version=\\\"1.0\\\" encoding=\\\"iso-8859-1\\\"?>\\n<!DOCTYPE html PUBLIC \\\"-//W3C//DTD XHTML 1.0 Transitional//EN\\\"\\n\\t\\t \\\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\\\">\\n<html xmlns=\\\"http://www.w3.org/1999/xhtml\\\" xml:lang=\\\"en\\\" lang=\\\"en\\\">\\n <head>\\n  <title>404 - Not Found</title>\\n </head>\\n <body>\\n  <h1>404 - Not Found</h1>\\n </body>\\n</html>\\n\"\n                    },\n                    \"direction\": \"Response\"\n                }\n            }\n        },\n        {\n            \"connection_id\": 1,\n            \"action\": {\n                \"Eof\": {\n                    \"ok\": true,\n                    \"direction\": \"Response\"\n                }\n            }\n        }\n    ],\n    \"docs\": \"live IMDS token retrieval\",\n    \"version\": \"V0\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/imds_default_chain_error/test-case.json",
    "content": "{\n  \"name\": \"imds-default-chain\",\n  \"docs\": \"IMDS isn't specifically configured but is loaded as part of the default chain. This has the exact same HTTP traffic as imds_no_iam_role, they are equivalent.\",\n  \"result\": {\n    \"ErrorContains\": \"the credential provider was not enabled\"\n  }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/imds_default_chain_retries/env.json",
    "content": "{\n  \"HOME\": \"/home\",\n  \"AWS_REGION\": \"us-east-1\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/imds_default_chain_retries/fs/home/.aws/config",
    "content": ""
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/imds_default_chain_retries/http-traffic.json",
    "content": "{\n    \"events\": [\n        {\n            \"connection_id\": 0,\n            \"action\": {\n                \"Request\": {\n                    \"request\": {\n                        \"uri\": \"http://169.254.169.254/latest/api/token\",\n                        \"headers\": {\n                            \"x-amz-user-agent\": [\n                                \"aws-sdk-rust/0.1.0 api/imds/0.1.0 os/linux lang/rust/1.52.1\"\n                            ],\n                            \"x-aws-ec2-metadata-token-ttl-seconds\": [\n                                \"21600\"\n                            ],\n                            \"user-agent\": [\n                                \"aws-sdk-rust/0.1.0 os/linux lang/rust/1.52.1\"\n                            ]\n                        },\n                        \"method\": \"PUT\"\n                    }\n                }\n            }\n        },\n        {\n            \"connection_id\": 0,\n            \"action\": {\n                \"Response\": {\n                    \"response\": {\n                        \"Ok\": {\n                            \"status\": 503,\n                            \"version\": \"HTTP/1.1\",\n                            \"headers\": {}\n                        }\n                    }\n                }\n            }\n        },\n        {\n            \"connection_id\": 0,\n            \"action\": {\n                \"Eof\": {\n                    \"ok\": true,\n                    \"direction\": \"Request\"\n                }\n            }\n        },\n        {\n            \"connection_id\": 0,\n            \"action\": {\n                \"Eof\": {\n                    \"ok\": true,\n                    \"direction\": \"Response\"\n                }\n            }\n        },\n        {\n            \"connection_id\": 1,\n            \"action\": {\n                \"Request\": {\n                    \"request\": {\n                        \"uri\": \"http://169.254.169.254/latest/api/token\",\n                        \"headers\": {\n                            \"x-aws-ec2-metadata-token-ttl-seconds\": [\n                                \"21600\"\n                            ],\n                            \"user-agent\": [\n                                \"aws-sdk-rust/0.1.0 os/linux lang/rust/1.52.1\"\n                            ],\n                            \"x-amz-user-agent\": [\n                                \"aws-sdk-rust/0.1.0 api/imds/0.1.0 os/linux lang/rust/1.52.1\"\n                            ]\n                        },\n                        \"method\": \"PUT\"\n                    }\n                }\n            }\n        },\n        {\n            \"connection_id\": 1,\n            \"action\": {\n                \"Eof\": {\n                    \"ok\": true,\n                    \"direction\": \"Request\"\n                }\n            }\n        },\n        {\n            \"connection_id\": 1,\n            \"action\": {\n                \"Response\": {\n                    \"response\": {\n                        \"Ok\": {\n                            \"status\": 200,\n                            \"version\": \"HTTP/1.1\",\n                            \"headers\": {\n                                \"x-aws-ec2-metadata-token-ttl-seconds\": [\n                                    \"21600\"\n                                ],\n                                \"server\": [\n                                    \"EC2ws\"\n                                ],\n                                \"content-type\": [\n                                    \"text/plain\"\n                                ],\n                                \"connection\": [\n                                    \"close\"\n                                ],\n                                \"content-length\": [\n                                    \"56\"\n                                ],\n                                \"date\": [\n                                    \"Tue, 21 Sep 2021 18:32:37 GMT\"\n                                ]\n                            }\n                        }\n                    }\n                }\n            }\n        },\n        {\n            \"connection_id\": 1,\n            \"action\": {\n                \"Data\": {\n                    \"data\": {\n                        \"Utf8\": \"imdstoken\"\n                    },\n                    \"direction\": \"Response\"\n                }\n            }\n        },\n        {\n            \"connection_id\": 1,\n            \"action\": {\n                \"Eof\": {\n                    \"ok\": true,\n                    \"direction\": \"Response\"\n                }\n            }\n        },\n        {\n            \"connection_id\": 2,\n            \"action\": {\n                \"Request\": {\n                    \"request\": {\n                        \"uri\": \"http://169.254.169.254/latest/meta-data/iam/security-credentials/\",\n                        \"headers\": {\n                            \"x-amz-user-agent\": [\n                                \"aws-sdk-rust/0.1.0 api/imds/0.1.0 os/linux lang/rust/1.52.1\"\n                            ],\n                            \"x-aws-ec2-metadata-token\": [\n                                \"imdstoken\"\n                            ],\n                            \"user-agent\": [\n                                \"aws-sdk-rust/0.1.0 os/linux lang/rust/1.52.1\"\n                            ]\n                        },\n                        \"method\": \"GET\"\n                    }\n                }\n            }\n        },\n        {\n            \"connection_id\": 2,\n            \"action\": {\n                \"Response\": {\n                    \"response\": {\n                        \"Ok\": {\n                            \"status\": 503,\n                            \"version\": \"HTTP/1.1\",\n                            \"headers\": {}\n                        }\n                    }\n                }\n            }\n        },\n        {\n            \"connection_id\": 2,\n            \"action\": {\n                \"Eof\": {\n                    \"ok\": true,\n                    \"direction\": \"Request\"\n                }\n            }\n        },\n        {\n            \"connection_id\": 2,\n            \"action\": {\n                \"Eof\": {\n                    \"ok\": true,\n                    \"direction\": \"Response\"\n                }\n            }\n        },\n        {\n            \"connection_id\": 3,\n            \"action\": {\n                \"Request\": {\n                    \"request\": {\n                        \"uri\": \"http://169.254.169.254/latest/meta-data/iam/security-credentials/\",\n                        \"headers\": {\n                            \"x-aws-ec2-metadata-token\": [\n                                \"imdstoken\"\n                            ],\n                            \"user-agent\": [\n                                \"aws-sdk-rust/0.1.0 os/linux lang/rust/1.52.1\"\n                            ],\n                            \"x-amz-user-agent\": [\n                                \"aws-sdk-rust/0.1.0 api/imds/0.1.0 os/linux lang/rust/1.52.1\"\n                            ]\n                        },\n                        \"method\": \"GET\"\n                    }\n                }\n            }\n        },\n        {\n            \"connection_id\": 3,\n            \"action\": {\n                \"Eof\": {\n                    \"ok\": true,\n                    \"direction\": \"Request\"\n                }\n            }\n        },\n        {\n            \"connection_id\": 3,\n            \"action\": {\n                \"Response\": {\n                    \"response\": {\n                        \"Ok\": {\n                            \"status\": 200,\n                            \"version\": \"HTTP/1.1\",\n                            \"headers\": {\n                                \"content-length\": [\n                                    \"21\"\n                                ],\n                                \"server\": [\n                                    \"EC2ws\"\n                                ],\n                                \"connection\": [\n                                    \"close\"\n                                ],\n                                \"accept-ranges\": [\n                                    \"none\"\n                                ],\n                                \"last-modified\": [\n                                    \"Tue, 21 Sep 2021 18:31:13 GMT\"\n                                ],\n                                \"date\": [\n                                    \"Tue, 21 Sep 2021 18:32:38 GMT\"\n                                ],\n                                \"content-type\": [\n                                    \"text/plain\"\n                                ],\n                                \"x-aws-ec2-metadata-token-ttl-seconds\": [\n                                    \"21599\"\n                                ]\n                            }\n                        }\n                    }\n                }\n            }\n        },\n        {\n            \"connection_id\": 3,\n            \"action\": {\n                \"Data\": {\n                    \"data\": {\n                        \"Utf8\": \"imds-assume-role-test\"\n                    },\n                    \"direction\": \"Response\"\n                }\n            }\n        },\n        {\n            \"connection_id\": 3,\n            \"action\": {\n                \"Eof\": {\n                    \"ok\": true,\n                    \"direction\": \"Response\"\n                }\n            }\n        },\n        {\n            \"connection_id\": 4,\n            \"action\": {\n                \"Request\": {\n                    \"request\": {\n                        \"uri\": \"http://169.254.169.254/latest/meta-data/iam/security-credentials/imds-assume-role-test\",\n                        \"headers\": {\n                            \"x-amz-user-agent\": [\n                                \"aws-sdk-rust/0.1.0 api/imds/0.1.0 os/linux lang/rust/1.52.1\"\n                            ],\n                            \"user-agent\": [\n                                \"aws-sdk-rust/0.1.0 os/linux lang/rust/1.52.1\"\n                            ],\n                            \"x-aws-ec2-metadata-token\": [\n                                \"imdstoken\"\n                            ]\n                        },\n                        \"method\": \"GET\"\n                    }\n                }\n            }\n        },\n        {\n            \"connection_id\": 4,\n            \"action\": {\n                \"Response\": {\n                    \"response\": {\n                        \"Ok\": {\n                            \"status\": 503,\n                            \"version\": \"HTTP/1.1\",\n                            \"headers\": {}\n                        }\n                    }\n                }\n            }\n        },\n        {\n            \"connection_id\": 4,\n            \"action\": {\n                \"Eof\": {\n                    \"ok\": true,\n                    \"direction\": \"Request\"\n                }\n            }\n        },\n        {\n            \"connection_id\": 4,\n            \"action\": {\n                \"Eof\": {\n                    \"ok\": true,\n                    \"direction\": \"Response\"\n                }\n            }\n        },\n        {\n            \"connection_id\": 5,\n            \"action\": {\n                \"Request\": {\n                    \"request\": {\n                        \"uri\": \"http://169.254.169.254/latest/meta-data/iam/security-credentials/imds-assume-role-test\",\n                        \"headers\": {\n                            \"user-agent\": [\n                                \"aws-sdk-rust/0.1.0 os/linux lang/rust/1.52.1\"\n                            ],\n                            \"x-amz-user-agent\": [\n                                \"aws-sdk-rust/0.1.0 api/imds/0.1.0 os/linux lang/rust/1.52.1\"\n                            ],\n                            \"x-aws-ec2-metadata-token\": [\n                                \"imdstoken\"\n                            ]\n                        },\n                        \"method\": \"GET\"\n                    }\n                }\n            }\n        },\n        {\n            \"connection_id\": 5,\n            \"action\": {\n                \"Eof\": {\n                    \"ok\": true,\n                    \"direction\": \"Request\"\n                }\n            }\n        },\n        {\n            \"connection_id\": 5,\n            \"action\": {\n                \"Response\": {\n                    \"response\": {\n                        \"Ok\": {\n                            \"status\": 200,\n                            \"version\": \"HTTP/1.1\",\n                            \"headers\": {\n                                \"content-length\": [\n                                    \"1322\"\n                                ],\n                                \"server\": [\n                                    \"EC2ws\"\n                                ],\n                                \"accept-ranges\": [\n                                    \"none\"\n                                ],\n                                \"last-modified\": [\n                                    \"Tue, 21 Sep 2021 18:31:13 GMT\"\n                                ],\n                                \"connection\": [\n                                    \"close\"\n                                ],\n                                \"x-aws-ec2-metadata-token-ttl-seconds\": [\n                                    \"21599\"\n                                ],\n                                \"content-type\": [\n                                    \"text/plain\"\n                                ],\n                                \"date\": [\n                                    \"Tue, 21 Sep 2021 18:32:38 GMT\"\n                                ]\n                            }\n                        }\n                    }\n                }\n            }\n        },\n        {\n            \"connection_id\": 5,\n            \"action\": {\n                \"Data\": {\n                    \"data\": {\n                        \"Utf8\": \"{\\n  \\\"Code\\\" : \\\"Success\\\",\\n  \\\"LastUpdated\\\" : \\\"2021-09-21T18:30:29Z\\\",\\n  \\\"Type\\\" : \\\"AWS-HMAC\\\",\\n  \\\"AccessKeyId\\\" : \\\"ASIARTEST\\\",\\n  \\\"SecretAccessKey\\\" : \\\"testsecret\\\",\\n  \\\"Token\\\" : \\\"testtoken\\\",\\n  \\\"Expiration\\\" : \\\"2021-09-22T00:35:06Z\\\"\\n}\"\n                    },\n                    \"direction\": \"Response\"\n                }\n            }\n        },\n        {\n            \"connection_id\": 5,\n            \"action\": {\n                \"Eof\": {\n                    \"ok\": true,\n                    \"direction\": \"Response\"\n                }\n            }\n        }\n    ],\n    \"docs\": \"IMDS request/response with retries\",\n    \"version\": \"V0\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/imds_default_chain_retries/test-case.json",
    "content": "{\n  \"name\": \"imds-default-chain\",\n  \"docs\": \"IMDS isn't specifically configured but is loaded as part of the default chain. This has the exact same HTTP traffic as imds_no_iam_role, they are equivalent.\",\n  \"result\": {\n    \"Ok\": {\n      \"access_key_id\": \"ASIARTEST\",\n      \"secret_access_key\": \"testsecret\",\n      \"session_token\": \"testtoken\",\n      \"expiry\": 1632270906\n    }\n  }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/imds_default_chain_success/env.json",
    "content": "{\n  \"HOME\": \"/home\",\n  \"AWS_REGION\": \"us-east-1\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/imds_default_chain_success/fs/home/.aws/config",
    "content": ""
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/imds_default_chain_success/http-traffic.json",
    "content": "{\n    \"events\": [\n        {\n            \"connection_id\": 0,\n            \"action\": {\n                \"Request\": {\n                    \"request\": {\n                        \"uri\": \"http://169.254.169.254/latest/api/token\",\n                        \"headers\": {\n                            \"x-amz-user-agent\": [\n                                \"aws-sdk-rust/0.1.0 api/imds/0.1.0 os/linux lang/rust/1.52.1\"\n                            ],\n                            \"user-agent\": [\n                                \"aws-sdk-rust/0.1.0 os/linux lang/rust/1.52.1\"\n                            ],\n                            \"x-aws-ec2-metadata-token-ttl-seconds\": [\n                                \"21600\"\n                            ]\n                        },\n                        \"method\": \"PUT\"\n                    }\n                }\n            }\n        },\n        {\n            \"connection_id\": 0,\n            \"action\": {\n                \"Eof\": {\n                    \"ok\": true,\n                    \"direction\": \"Request\"\n                }\n            }\n        },\n        {\n            \"connection_id\": 0,\n            \"action\": {\n                \"Response\": {\n                    \"response\": {\n                        \"Ok\": {\n                            \"status\": 200,\n                            \"version\": \"HTTP/1.1\",\n                            \"headers\": {\n                                \"x-aws-ec2-metadata-token-ttl-seconds\": [\n                                    \"21600\"\n                                ],\n                                \"content-type\": [\n                                    \"text/plain\"\n                                ],\n                                \"connection\": [\n                                    \"close\"\n                                ],\n                                \"server\": [\n                                    \"EC2ws\"\n                                ],\n                                \"content-length\": [\n                                    \"56\"\n                                ],\n                                \"date\": [\n                                    \"Mon, 20 Sep 2021 21:43:31 GMT\"\n                                ]\n                            }\n                        }\n                    }\n                }\n            }\n        },\n        {\n            \"connection_id\": 0,\n            \"action\": {\n                \"Data\": {\n                    \"data\": {\n                        \"Utf8\": \"AQAEAKQRRHnsX8GCPgYTGMShrFJkMhru3n-8Ul5Gzvzj-bpWKYZuiw==\"\n                    },\n                    \"direction\": \"Response\"\n                }\n            }\n        },\n        {\n            \"connection_id\": 0,\n            \"action\": {\n                \"Eof\": {\n                    \"ok\": true,\n                    \"direction\": \"Response\"\n                }\n            }\n        },\n        {\n            \"connection_id\": 1,\n            \"action\": {\n                \"Request\": {\n                    \"request\": {\n                        \"uri\": \"http://169.254.169.254/latest/meta-data/iam/security-credentials/\",\n                        \"headers\": {\n                            \"x-amz-user-agent\": [\n                                \"aws-sdk-rust/0.1.0 api/imds/0.1.0 os/linux lang/rust/1.52.1\"\n                            ],\n                            \"x-aws-ec2-metadata-token\": [\n                                \"AQAEAKQRRHnsX8GCPgYTGMShrFJkMhru3n-8Ul5Gzvzj-bpWKYZuiw==\"\n                            ],\n                            \"user-agent\": [\n                                \"aws-sdk-rust/0.1.0 os/linux lang/rust/1.52.1\"\n                            ]\n                        },\n                        \"method\": \"GET\"\n                    }\n                }\n            }\n        },\n        {\n            \"connection_id\": 1,\n            \"action\": {\n                \"Eof\": {\n                    \"ok\": true,\n                    \"direction\": \"Request\"\n                }\n            }\n        },\n        {\n            \"connection_id\": 1,\n            \"action\": {\n                \"Response\": {\n                    \"response\": {\n                        \"Ok\": {\n                            \"status\": 200,\n                            \"version\": \"HTTP/1.1\",\n                            \"headers\": {\n                                \"server\": [\n                                    \"EC2ws\"\n                                ],\n                                \"content-length\": [\n                                    \"21\"\n                                ],\n                                \"x-aws-ec2-metadata-token-ttl-seconds\": [\n                                    \"21600\"\n                                ],\n                                \"connection\": [\n                                    \"close\"\n                                ],\n                                \"last-modified\": [\n                                    \"Mon, 20 Sep 2021 21:41:54 GMT\"\n                                ],\n                                \"content-type\": [\n                                    \"text/plain\"\n                                ],\n                                \"date\": [\n                                    \"Mon, 20 Sep 2021 21:43:31 GMT\"\n                                ],\n                                \"accept-ranges\": [\n                                    \"none\"\n                                ]\n                            }\n                        }\n                    }\n                }\n            }\n        },\n        {\n            \"connection_id\": 1,\n            \"action\": {\n                \"Data\": {\n                    \"data\": {\n                        \"Utf8\": \"imds-assume-role-test\"\n                    },\n                    \"direction\": \"Response\"\n                }\n            }\n        },\n        {\n            \"connection_id\": 1,\n            \"action\": {\n                \"Eof\": {\n                    \"ok\": true,\n                    \"direction\": \"Response\"\n                }\n            }\n        },\n        {\n            \"connection_id\": 2,\n            \"action\": {\n                \"Request\": {\n                    \"request\": {\n                        \"uri\": \"http://169.254.169.254/latest/meta-data/iam/security-credentials/imds-assume-role-test\",\n                        \"headers\": {\n                            \"x-aws-ec2-metadata-token\": [\n                                \"AQAEAKQRRHnsX8GCPgYTGMShrFJkMhru3n-8Ul5Gzvzj-bpWKYZuiw==\"\n                            ],\n                            \"user-agent\": [\n                                \"aws-sdk-rust/0.1.0 os/linux lang/rust/1.52.1\"\n                            ],\n                            \"x-amz-user-agent\": [\n                                \"aws-sdk-rust/0.1.0 api/imds/0.1.0 os/linux lang/rust/1.52.1\"\n                            ]\n                        },\n                        \"method\": \"GET\"\n                    }\n                }\n            }\n        },\n        {\n            \"connection_id\": 2,\n            \"action\": {\n                \"Eof\": {\n                    \"ok\": true,\n                    \"direction\": \"Request\"\n                }\n            }\n        },\n        {\n            \"connection_id\": 2,\n            \"action\": {\n                \"Response\": {\n                    \"response\": {\n                        \"Ok\": {\n                            \"status\": 200,\n                            \"version\": \"HTTP/1.1\",\n                            \"headers\": {\n                                \"content-type\": [\n                                    \"text/plain\"\n                                ],\n                                \"server\": [\n                                    \"EC2ws\"\n                                ],\n                                \"content-length\": [\n                                    \"1322\"\n                                ],\n                                \"accept-ranges\": [\n                                    \"none\"\n                                ],\n                                \"date\": [\n                                    \"Mon, 20 Sep 2021 21:43:31 GMT\"\n                                ],\n                                \"connection\": [\n                                    \"close\"\n                                ],\n                                \"last-modified\": [\n                                    \"Mon, 20 Sep 2021 21:41:54 GMT\"\n                                ],\n                                \"x-aws-ec2-metadata-token-ttl-seconds\": [\n                                    \"21600\"\n                                ]\n                            }\n                        }\n                    }\n                }\n            }\n        },\n        {\n            \"connection_id\": 2,\n            \"action\": {\n                \"Data\": {\n                    \"data\": {\n                        \"Utf8\": \"{\\n  \\\"Code\\\" : \\\"Success\\\",\\n  \\\"LastUpdated\\\" : \\\"2021-09-20T21:42:26Z\\\",\\n  \\\"Type\\\" : \\\"AWS-HMAC\\\",\\n  \\\"AccessKeyId\\\" : \\\"ASIARTEST\\\",\\n  \\\"SecretAccessKey\\\" : \\\"testsecret\\\",\\n  \\\"Token\\\" : \\\"testtoken\\\",\\n  \\\"Expiration\\\" : \\\"2021-09-21T04:16:53Z\\\"\\n}\"\n                    },\n                    \"direction\": \"Response\"\n                }\n            }\n        },\n        {\n            \"connection_id\": 2,\n            \"action\": {\n                \"Eof\": {\n                    \"ok\": true,\n                    \"direction\": \"Response\"\n                }\n            }\n        }\n    ],\n    \"docs\": \"loading IMDs credentials via the default chain\",\n    \"version\": \"V0\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/imds_default_chain_success/test-case.json",
    "content": "{\n  \"name\": \"imds-default-chain\",\n  \"docs\": \"IMDS isn't specifically configured but is loaded as part of the default chain. This has the exact same HTTP traffic as imds_no_iam_role, they are equivalent.\",\n  \"result\": {\n    \"Ok\": {\n      \"access_key_id\": \"ASIARTEST\",\n      \"secret_access_key\": \"testsecret\",\n      \"session_token\": \"testtoken\",\n      \"expiry\": 1632197813\n    }\n  }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/imds_disabled/env.json",
    "content": "{\n  \"HOME\": \"/home\",\n  \"AWS_EC2_METADATA_DISABLED\": \"True\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/imds_disabled/http-traffic.json",
    "content": "{\n  \"events\": [ ], \"docs\": \"no network traffic\",\n  \"version\": \"V0\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/imds_disabled/test-case.json",
    "content": "{\n  \"name\": \"imds-disabled\",\n  \"docs\": \"when IMDS is disabled by an environment variable, it shouldn't be used as part of the default chain\",\n  \"result\": {\n    \"ErrorContains\": \"the credential provider was not enabled\"\n  }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/imds_no_iam_role/env.json",
    "content": "{\n  \"HOME\": \"/home\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/imds_no_iam_role/fs/home/.aws/config",
    "content": "[default]\nregion = us-east-1\nrole_arn = arn:aws:iam::123456789:role/integration-test\ncredential_source = Ec2InstanceMetadata\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/imds_no_iam_role/http-traffic.json",
    "content": "{\n    \"events\": [\n        {\n            \"connection_id\": 0,\n            \"action\": {\n                \"Request\": {\n                    \"request\": {\n                        \"uri\": \"http://169.254.169.254/latest/api/token\",\n                        \"headers\": {\n                            \"user-agent\": [\n                                \"aws-sdk-rust/0.1.0 os/linux lang/rust/1.52.1\"\n                            ],\n                            \"x-aws-ec2-metadata-token-ttl-seconds\": [\n                                \"21600\"\n                            ],\n                            \"x-amz-user-agent\": [\n                                \"aws-sdk-rust/0.1.0 api/imds/0.1.0 os/linux lang/rust/1.52.1\"\n                            ]\n                        },\n                        \"method\": \"PUT\"\n                    }\n                }\n            }\n        },\n        {\n            \"connection_id\": 0,\n            \"action\": {\n                \"Eof\": {\n                    \"ok\": true,\n                    \"direction\": \"Request\"\n                }\n            }\n        },\n        {\n            \"connection_id\": 0,\n            \"action\": {\n                \"Response\": {\n                    \"response\": {\n                        \"Ok\": {\n                            \"status\": 200,\n                            \"version\": \"HTTP/1.1\",\n                            \"headers\": {\n                                \"content-type\": [\n                                    \"text/plain\"\n                                ],\n                                \"date\": [\n                                    \"Mon, 20 Sep 2021 20:51:52 GMT\"\n                                ],\n                                \"x-aws-ec2-metadata-token-ttl-seconds\": [\n                                    \"21600\"\n                                ],\n                                \"connection\": [\n                                    \"close\"\n                                ],\n                                \"server\": [\n                                    \"EC2ws\"\n                                ],\n                                \"content-length\": [\n                                    \"56\"\n                                ]\n                            }\n                        }\n                    }\n                }\n            }\n        },\n        {\n            \"connection_id\": 0,\n            \"action\": {\n                \"Data\": {\n                    \"data\": {\n                        \"Utf8\": \"faketoken\"\n                    },\n                    \"direction\": \"Response\"\n                }\n            }\n        },\n        {\n            \"connection_id\": 0,\n            \"action\": {\n                \"Eof\": {\n                    \"ok\": true,\n                    \"direction\": \"Response\"\n                }\n            }\n        },\n        {\n            \"connection_id\": 1,\n            \"action\": {\n                \"Request\": {\n                    \"request\": {\n                        \"uri\": \"http://169.254.169.254/latest/meta-data/iam/security-credentials/\",\n                        \"headers\": {\n                            \"user-agent\": [\n                                \"aws-sdk-rust/0.1.0 os/linux lang/rust/1.52.1\"\n                            ],\n                            \"x-amz-user-agent\": [\n                                \"aws-sdk-rust/0.1.0 api/imds/0.1.0 os/linux lang/rust/1.52.1\"\n                            ],\n                            \"x-aws-ec2-metadata-token\": [\n                               \"faketoken\"\n                            ]\n                        },\n                        \"method\": \"GET\"\n                    }\n                }\n            }\n        },\n        {\n            \"connection_id\": 1,\n            \"action\": {\n                \"Eof\": {\n                    \"ok\": true,\n                    \"direction\": \"Request\"\n                }\n            }\n        },\n        {\n            \"connection_id\": 1,\n            \"action\": {\n                \"Response\": {\n                    \"response\": {\n                        \"Ok\": {\n                            \"status\": 404,\n                            \"version\": \"HTTP/1.1\",\n                            \"headers\": {\n                                \"content-length\": [\n                                    \"339\"\n                                ],\n                                \"date\": [\n                                    \"Mon, 20 Sep 2021 20:51:52 GMT\"\n                                ],\n                                \"content-type\": [\n                                    \"text/html\"\n                                ],\n                                \"x-aws-ec2-metadata-token-ttl-seconds\": [\n                                    \"21600\"\n                                ],\n                                \"connection\": [\n                                    \"close\"\n                                ],\n                                \"server\": [\n                                    \"EC2ws\"\n                                ]\n                            }\n                        }\n                    }\n                }\n            }\n        },\n        {\n            \"connection_id\": 1,\n            \"action\": {\n                \"Data\": {\n                    \"data\": {\n                        \"Utf8\": \"<?xml version=\\\"1.0\\\" encoding=\\\"iso-8859-1\\\"?>\\n<!DOCTYPE html PUBLIC \\\"-//W3C//DTD XHTML 1.0 Transitional//EN\\\"\\n\\t\\t \\\"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\\\">\\n<html xmlns=\\\"http://www.w3.org/1999/xhtml\\\" xml:lang=\\\"en\\\" lang=\\\"en\\\">\\n <head>\\n  <title>404 - Not Found</title>\\n </head>\\n <body>\\n  <h1>404 - Not Found</h1>\\n </body>\\n</html>\\n\"\n                    },\n                    \"direction\": \"Response\"\n                }\n            }\n        },\n        {\n            \"connection_id\": 1,\n            \"action\": {\n                \"Eof\": {\n                    \"ok\": true,\n                    \"direction\": \"Response\"\n                }\n            }\n        }\n    ],\n    \"docs\": \"live IMDS token retrieval\",\n    \"version\": \"V0\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/imds_no_iam_role/test-case.json",
    "content": "{\n  \"name\": \"imds-token-fail\",\n  \"docs\": \"attempts to acquire an IMDS token, but the instance doesn't have a role configured\",\n  \"result\": {\n    \"ErrorContains\": \"the credential provider was not enabled\"\n  }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/imds_token_fail/env.json",
    "content": "{\n  \"HOME\": \"/home\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/imds_token_fail/fs/home/.aws/config",
    "content": "[default]\nregion = us-east-1\nrole_arn = arn:aws:iam::123456789:role/integration-test\ncredential_source = Ec2InstanceMetadata\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/imds_token_fail/http-traffic.json",
    "content": "{\n  \"events\": [\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Request\": {\n          \"request\": {\n            \"uri\": \"http://169.254.169.254/latest/api/token\",\n            \"headers\": {\n              \"user-agent\": [\n                \"aws-sdk-rust/0.1.0 os/macos lang/rust/1.52.1\"\n              ],\n              \"x-amz-user-agent\": [\n                \"aws-sdk-rust/0.1.0 api/imds/0.1.0 os/macos lang/rust/1.52.1\"\n              ],\n              \"x-aws-ec2-metadata-token-ttl-seconds\": [\n                \"21600\"\n              ]\n            },\n            \"method\": \"PUT\"\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Response\": {\n          \"response\": {\n            \"Ok\": {\n              \"status\": 403,\n              \"version\": \"HTTP/1.1\",\n              \"headers\": {\n                \"content-type\": [\n                  \"text/xml\"\n                ]\n              }\n            }\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Response\"\n        }\n      }\n    }\n  ],\n  \"docs\": \"failed loading imds credentials. When attempting to retrieve an initial token, IMDS replies with 403, indicating the IMDS is disabled\",\n  \"version\": \"V0\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/imds_token_fail/test-case.json",
    "content": "{\n  \"name\": \"imds-token-fail\",\n  \"docs\": \"attempts to acquire an IMDS token, but a 403 is returned\",\n  \"result\": {\n    \"ErrorContains\": \"request forbidden: IMDS is disabled\"\n  }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/prefer_environment/env.json",
    "content": "{\n  \"HOME\": \"/home\",\n  \"AWS_ACCESS_KEY_ID\": \"correct_key\",\n  \"AWS_SECRET_ACCESS_KEY\": \"correct_secret\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/prefer_environment/fs/home/.aws/config",
    "content": "[default]\nregion = us-east-1\nrole_arn = arn:aws:iam::123456789:role/integration-test\nsource_profile = base\n\n[profile base]\nregion = us-east-1\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/prefer_environment/fs/home/.aws/credentials",
    "content": "[base]\naws_access_key_id = AKIAFAKE\naws_secret_access_key = FAKE\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/prefer_environment/http-traffic.json",
    "content": "{\n  \"events\": [ ], \"docs\": \"no network traffic\",\n  \"version\": \"V0\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/prefer_environment/test-case.json",
    "content": "{\n  \"name\": \"prefer environment\",\n  \"docs\": \"prefer environment variables over profile\",\n  \"result\": {\n    \"Ok\": {\n      \"access_key_id\": \"correct_key\",\n      \"secret_access_key\": \"correct_secret\"\n    }\n  }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/profile_name/env.json",
    "content": "{\n  \"HOME\": \"/home\",\n  \"AWS_PROFILE\": \"some-thing:long/the_one%only.foo@bar+\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/profile_name/fs/home/.aws/config",
    "content": "[default]\nregion = us-east-1\naws_access_key_id = incorrect_key\naws_secret_access_key = incorrect_secret\n\n[profile some-thing:long/the_one%only.foo@bar+]\nregion = us-east-2\naws_access_key_id = correct_key\naws_secret_access_key = correct_secret\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/profile_name/http-traffic.json",
    "content": "{\n  \"events\": [],\n  \"docs\": \"test case uses static creds, no network requests\",\n  \"version\": \"V0\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/profile_name/test-case.json",
    "content": "{\n    \"name\": \"profile_name\",\n    \"docs\": \"verifies allowed character set for profile names\",\n    \"result\": {\n        \"Ok\": {\n            \"access_key_id\": \"correct_key\",\n            \"secret_access_key\": \"correct_secret\"\n        }\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/profile_overrides_web_identity/env.json",
    "content": "{\n  \"AWS_ROLE_ARN\": \"arn:aws:iam::123456789:role/RoleB\",\n  \"AWS_WEB_IDENTITY_TOKEN_FILE\": \"/token.jwt\",\n  \"AWS_PROFILE\": \"A\",\n  \"HOME\": \"/home\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/profile_overrides_web_identity/fs/home/.aws/config",
    "content": "[profile A]\nrole_arn = arn:aws:iam::123456789:role/RoleA\ncredential_source = Environment\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/profile_overrides_web_identity/fs/token.jwt",
    "content": "shouldnotbeused\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/profile_overrides_web_identity/http-traffic.json",
    "content": "{\n  \"events\": [],\n  \"docs\": \"test case uses static creds, no network requests\",\n  \"version\": \"V0\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/profile_overrides_web_identity/test-case.json",
    "content": "{\n  \"name\": \"web identity profile no env\",\n  \"docs\": \"invalid configuration where web identity is used as a source profile but a key is missing. The missing key is in the environment, but that must not be used.\",\n  \"result\": {\n    \"ErrorContains\": \"provider was not enabled\"\n  }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/profile_static_keys/env.json",
    "content": "{\n  \"HOME\": \"/home\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/profile_static_keys/fs/home/.aws/config",
    "content": "[default]\nregion = us-east-1\naws_access_key_id = correct_key\naws_secret_access_key = correct_secret\n\n[profile secondary]\nregion = us-east-2\naws_access_key_id = correct_key_secondary\naws_secret_access_key = correct_secret_secondary\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/profile_static_keys/fs/home/.aws/credentials",
    "content": "[default]\naws_access_key_id = correct_key\naws_secret_access_key = correct_secret\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/profile_static_keys/http-traffic.json",
    "content": "{\n  \"events\": [],\n  \"docs\": \"test case uses static creds, no network requests\",\n  \"version\": \"V0\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/profile_static_keys/test-case.json",
    "content": "{\n  \"name\": \"profile_static_keys\",\n  \"docs\": \"load static keys from a profile\",\n  \"result\": {\n    \"Ok\": {\n      \"access_key_id\": \"correct_key\",\n      \"secret_access_key\": \"correct_secret\"\n    }\n  }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/profile_static_keys_case_insensitive/env.json",
    "content": "{\n  \"HOME\": \"/home\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/profile_static_keys_case_insensitive/fs/home/.aws/config",
    "content": "[default]\nregion = us-east-1\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/profile_static_keys_case_insensitive/fs/home/.aws/credentials",
    "content": "[default]\nAWS_ACCESS_KEY_ID = correct_key\nAWS_SECRET_ACCESS_KEY = correct_secret\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/profile_static_keys_case_insensitive/http-traffic.json",
    "content": "{\n  \"events\": [],\n  \"docs\": \"test case uses static creds, no network requests\",\n  \"version\": \"V0\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/profile_static_keys_case_insensitive/test-case.json",
    "content": "{\n  \"name\": \"profile_static_keys\",\n  \"docs\": \"load static keys from a profile\",\n  \"result\": {\n    \"Ok\": {\n      \"access_key_id\": \"correct_key\",\n      \"secret_access_key\": \"correct_secret\"\n    }\n  }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/sso_assume_role/env.json",
    "content": "{\n  \"HOME\": \"/home\",\n  \"AWS_REGION\": \"us-west-2\",\n  \"AWS_PROFILE\": \"sso-test\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/sso_assume_role/fs/home/.aws/config",
    "content": "[profile sso-test]\nsso_start_url = https://ssotest.awsapps.com/start\nsso_region = us-east-2\nsso_account_id = 123456789\nsso_role_name = MySsoRole\nregion = us-east-2\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/sso_assume_role/fs/home/.aws/sso/cache/dace00cba5f8355ec9d274ceb2bcebdfbeed0e12.json",
    "content": "{\n  \"accessToken\": \"a-token\",\n  \"expiresAt\": \"2080-10-16T03:56:45Z\",\n  \"startUrl\": \"https://ssotest.awsapps.com/start\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/sso_assume_role/http-traffic.json",
    "content": "{\n  \"events\": [\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Request\": {\n          \"request\": {\n            \"uri\": \"https://portal.sso.us-east-2.amazonaws.com/federation/credentials?account_id=123456789&role_name=MySsoRole\",\n            \"headers\": {\n              \"x-amz-sso_bearer_token\": [\n                \"a-token\"\n              ],\n              \"Host\": [\n                \"portal.sso.us-east-2.amazonaws.com\"\n              ]\n            },\n            \"method\": \"GET\"\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Response\": {\n          \"response\": {\n            \"Ok\": {\n              \"status\": 200,\n              \"version\": \"HTTP/1.1\",\n              \"headers\": {\n                \"Date\": [\n                  \"Mon, 03 Jan 2022 19:13:54 GMT\"\n                ],\n                \"Content-Type\": [\n                  \"application/json\"\n                ],\n                \"Content-Length\": [\n                  \"144\"\n                ],\n                \"Connection\": [\n                  \"keep-alive\"\n                ],\n                \"Access-Control-Expose-Headers\": [\n                  \"RequestId\"\n                ],\n                \"Cache-Control\": [\n                  \"no-cache\"\n                ],\n                \"RequestId\": [\n                  \"b339b807-25d1-474c-a476-b070e9f350e4\"\n                ],\n                \"Server\": [\n                  \"AWS SSO\"\n                ]\n              }\n            }\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"{\\\"roleCredentials\\\":{\\\"accessKeyId\\\":\\\"ASIARCORRECT\\\",\\\"secretAccessKey\\\":\\\"secretkeycorrect\\\",\\\"sessionToken\\\":\\\"tokencorrect\\\",\\\"expiration\\\":1234567890000}}\"\n          },\n          \"direction\": \"Response\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Response\"\n        }\n      }\n    }\n  ],\n  \"docs\": \"Load SSO credentials\",\n  \"version\": \"V0\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/sso_assume_role/test-case.json",
    "content": "{\n  \"name\": \"sso-role\",\n  \"docs\": \"load creds from SSO role\",\n  \"result\": {\n    \"Ok\": {\n      \"access_key_id\": \"ASIARCORRECT\",\n      \"secret_access_key\": \"secretkeycorrect\",\n      \"session_token\": \"tokencorrect\",\n      \"account_id\": \"123456789\",\n      \"expiry\": 1234567890\n    }\n  }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/sso_no_token_file/env.json",
    "content": "{\n  \"HOME\": \"/home\",\n  \"AWS_REGION\": \"us-west-2\",\n  \"AWS_PROFILE\": \"sso-test\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/sso_no_token_file/fs/home/.aws/config",
    "content": "[profile sso-test]\nsso_start_url = https://ssotest.awsapps.com/start\nsso_region = us-east-2\nsso_account_id = 123456789\nsso_role_name = MySsoRole\nregion = us-east-2\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/sso_no_token_file/fs/home/.aws/sso/cache/differenthashthatdoesntmatch.json",
    "content": "{\n  \"accessToken\": \"a-token\",\n  \"expiresAt\": \"2080-10-16T03:56:45Z\",\n  \"startUrl\": \"https://ssotest.awsapps.com/start\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/sso_no_token_file/http-traffic.json",
    "content": "{\n  \"events\": [],\n  \"docs\": \"missing token file, no traffic\",\n  \"version\": \"V0\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/sso_no_token_file/test-case.json",
    "content": "{\n  \"name\": \"sso-role\",\n  \"docs\": \"load creds from SSO role\",\n  \"result\": {\n    \"ErrorContains\": \"failed to read `/home/.aws/sso/cache/dace00cba5f8355ec9d274ceb2bcebdfbeed0e12.json`: No such file or directory (os error 2)\"\n  }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/sso_server_error/env.json",
    "content": "{\n  \"HOME\": \"/home\",\n  \"AWS_REGION\": \"us-west-2\",\n  \"AWS_PROFILE\": \"sso-test\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/sso_server_error/fs/home/.aws/config",
    "content": "[profile sso-test]\nsso_start_url = https://ssotest.awsapps.com/start\nsso_region = us-east-2\nsso_account_id = 123456789\nsso_role_name = MySsoRole\nregion = us-east-2\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/sso_server_error/fs/home/.aws/sso/cache/dace00cba5f8355ec9d274ceb2bcebdfbeed0e12.json",
    "content": "{\n  \"accessToken\": \"a-token\",\n  \"expiresAt\": \"2080-10-16T03:56:45Z\",\n  \"startUrl\": \"https://ssotest.awsapps.com/start\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/sso_server_error/http-traffic.json",
    "content": "{\n  \"events\": [\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Request\": {\n          \"request\": {\n            \"uri\": \"https://portal.sso.us-east-2.amazonaws.com/federation/credentials?account_id=123456789&role_name=MySsoRole\",\n            \"headers\": {\n              \"x-amz-sso_bearer_token\": [\n                \"a-token\"\n              ],\n              \"Host\": [\n                \"portal.sso.us-east-2.amazonaws.com\"\n              ]\n            },\n            \"method\": \"GET\"\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Response\": {\n          \"response\": {\n            \"Ok\": {\n              \"status\": 503,\n              \"version\": \"HTTP/1.1\",\n              \"headers\": {}\n            }\n          }\n        }\n      }\n  },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Response\"\n        }\n      }\n    }\n  ],\n  \"docs\": \"Server error prevents credentials from being loaded\",\n  \"version\": \"V0\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/sso_server_error/test-case.json",
    "content": "{\n  \"name\": \"sso-server-error\",\n  \"docs\": \"When calling GetRoleCredentials unsuccessfully, it does not find account ID, not to mention credentials themselves\",\n  \"result\": {\n    \"ErrorContains\": \"an error occurred while loading credentials\"\n  }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/web_identity_source_profile_no_env/env.json",
    "content": "{\n  \"HOME\": \"/home\",\n  \"AWS_ROLE_ARN\": \"arn:aws:iam::123456789:role/RoleB\",\n  \"AWS_PROFILE\": \"A\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/web_identity_source_profile_no_env/fs/home/.aws/config",
    "content": "[profile A]\nrole_arn = arn:aws:iam::123456789:role/RoleA\nsource_profile = B\n\n[profile B]\nweb_identity_token_file = /token.jwt\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/web_identity_source_profile_no_env/fs/token.jwt",
    "content": "sometoken\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/web_identity_source_profile_no_env/http-traffic.json",
    "content": "{\n  \"events\": [],\n  \"docs\": \"test case makes no network requests\",\n  \"version\": \"V0\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/web_identity_source_profile_no_env/test-case.json",
    "content": "{\n  \"name\": \"web identity profile no env\",\n  \"docs\": \"invalid configuration where web identity is used as a source profile but a key is missing. The missing key is in the environment, but that must not be used.\",\n  \"result\": {\n    \"ErrorContains\": \"`web_identity_token_file` was specified but `role_arn` was missing\"\n  }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/web_identity_token_env/env.json",
    "content": "{\n  \"AWS_WEB_IDENTITY_TOKEN_FILE\": \"/token.jwt\",\n  \"AWS_ROLE_ARN\": \"arn:aws:iam::123456789012:role/test-role\",\n  \"AWS_ROLE_SESSION_NAME\": \"test-session\",\n  \"AWS_REGION\": \"eu-west-1\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/web_identity_token_env/fs/token.jwt",
    "content": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJPbmxpbmUgSldUIEJ1aWxkZXIiLCJpYXQiOjE2MjkxNDM3NjEsImV4cCI6MTY2MDY3OTc2MSwiYXVkIjoid3d3LmV4YW1wbGUuY29tIiwic3ViIjoicnVzdC1zZGstdGVzdEBleGFtcGxlLmNvbSIsIlJvbGUiOiJTREsgVGVzdCJ9.Cx9Ko-ssGIJ5BM798_Jgo9f--lEsSNKCAjBxv-0qQQQ\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/web_identity_token_env/http-traffic.json",
    "content": "{\n  \"docs\": \"successful web identity role assumption (note: fake token)\",\n  \"version\": \"V0\",\n  \"events\": [\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Request\": {\n          \"request\": {\n            \"uri\": \"https://sts.eu-west-1.amazonaws.com/\",\n            \"headers\": {\n              \"content-type\": [\n                \"application/x-www-form-urlencoded\"\n              ],\n              \"content-length\": [\n                \"424\"\n              ],\n              \"x-amz-user-agent\": [\n                \"aws-sdk-rust/0.1.0 api/sts/0.0.15-alpha os/macos lang/rust/1.55.0-nightly\"\n              ],\n              \"user-agent\": [\n                \"aws-sdk-rust/0.1.0 os/macos lang/rust/1.55.0-nightly\"\n              ],\n              \"host\": [\n                \"sts.eu-west-1.amazonaws.com\"\n              ]\n            },\n            \"method\": \"POST\"\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"Action=AssumeRoleWithWebIdentity&Version=2011-06-15&RoleArn=arn%3Aaws%3Aiam%3A%3A123456789123%3Arole%2Ftest-role&RoleSessionName=test-session&WebIdentityToken=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJPbmxpbmUgSldUIEJ1aWxkZXIiLCJpYXQiOjE2MjkxNDM3NjEsImV4cCI6MTY2MDY3OTc2MSwiYXVkIjoid3d3LmV4YW1wbGUuY29tIiwic3ViIjoicnVzdC1zZGstdGVzdEBleGFtcGxlLmNvbSIsIlJvbGUiOiJTREsgVGVzdCJ9.Cx9Ko-ssGIJ5BM798_Jgo9f--lEsSNKCAjBxv-0qQQQ\"\n          },\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Response\": {\n          \"response\": {\n            \"Ok\": {\n              \"status\": 200,\n              \"version\": \"HTTP/1.1\",\n              \"headers\": {\n                \"date\": [\n                  \"Mon, 16 Aug 2021 19:52:53 GMT\"\n                ],\n                \"content-type\": [\n                  \"text/xml\"\n                ],\n                \"content-length\": [\n                  \"2208\"\n                ],\n                \"x-amzn-requestid\": [\n                  \"f874b1d6-2f3b-4834-907a-6a7c4b3b2d35\"\n                ],\n                \"vary\": [\n                  \"accept-encoding\"\n                ]\n              }\n            }\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"<AssumeRoleWithWebIdentityResponse xmlns=\\\"https://sts.amazonaws.com/doc/2011-06-15/\\\">\\n  <AssumeRoleWithWebIdentityResult>\\n    <Audience>my-cluster.sk1.us-west-2.eks.amazonaws.com</Audience>\\n    <AssumedRoleUser>\\n      <AssumedRoleId>AROARTEST:test-session</AssumedRoleId>\\n      <Arn>arn:aws:sts::123456789012:assumed-role/sdk-test/test-session</Arn>\\n    </AssumedRoleUser>\\n    <Provider>arn:aws:iam::123456789012:oidc-provider/s3-us-west-2.amazonaws.com/oidc-test-testbucket</Provider>\\n    <Credentials>\\n      <AccessKeyId>AKIDTEST</AccessKeyId>\\n      <SecretAccessKey>SECRETKEYTEST</SecretAccessKey>\\n      <SessionToken>SESSIONTOKEN_TEST</SessionToken>\\n      <Expiration>2021-08-16T20:52:53Z</Expiration>\\n    </Credentials>\\n    <SubjectFromWebIdentityToken>system:serviceaccount:default:default</SubjectFromWebIdentityToken>\\n  </AssumeRoleWithWebIdentityResult>\\n  <ResponseMetadata>\\n    <RequestId>f874b1d6-2f3b-4834-907a-6a7c4b3b2d35</RequestId>\\n  </ResponseMetadata>\\n</AssumeRoleWithWebIdentityResponse>\\n\"\n          },\n          \"direction\": \"Response\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Response\"\n        }\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/web_identity_token_env/test-case.json",
    "content": "{\n  \"name\": \"web-identity-token-env\",\n  \"docs\": \"Loads a web identity token configured via environment variables\",\n  \"result\": {\n    \"Ok\": {\n      \"access_key_id\": \"AKIDTEST\",\n      \"secret_access_key\": \"SECRETKEYTEST\",\n      \"session_token\": \"SESSIONTOKEN_TEST\",\n      \"account_id\": \"123456789012\",\n      \"expiry\": 1629147173\n    }\n  }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/web_identity_token_invalid_jwt/env.json",
    "content": "{\n  \"AWS_REGION\": \"us-east-1\",\n  \"AWS_PROFILE\": \"A\",\n  \"HOME\": \"/home\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/web_identity_token_invalid_jwt/fs/home/.aws/config",
    "content": "[profile A]\nrole_arn = arn:aws:iam::123456789:role/RoleA\nsource_profile = B\n[profile B]\nrole_arn = arn:aws:iam::123456789:role/RoleB\nweb_identity_token_file = /token.jwt\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/web_identity_token_invalid_jwt/fs/token.jwt",
    "content": "eyJhbGciOiJSUzI1NiIsImtpZCI6IjQxOTg5NTBhMWU0Y2U3YjIxZDRhYTBjNTRkM2EzNmFhZGI0ZWRiOTcifQ.eyJhdWQiOlsibXktY2x1c3Rlci5zazEudXMtd2VzdC0yLmVrcy5hbWF6b25hd3MuY29tIl0sImV4cCI6MTYyOTIyODE2MSwiaWF0IjoxNjI5MTQxNzYxLCJpc3MiOiJodHRwczovL3MzLXVzLXdlc3QtMi5hbWF6b25hd3MuY29tL29pZGMtdGVzdC10enpvdGJ3bXpud2ltdXJjYmtlYm5kcHhhaW1peGJrYyIsImt1YmVybmV0ZXMuaW8iOnsiYm91bmRPYmplY3RSZWYiOnsiYXBpVmVyc2lvbiI6InYxIiwia2luZCI6IlBvZCIsIm5hbWUiOiJteS1wb2QteHZmZyIsInVpZCI6ImZiZmRlMTZiLTYwNDYtNDZlNS1hZDAzLTVkYWRlMjRiYzBhMiJ9LCJzZXJ2aWNlQWNjb3VudFVJRCI6IjEwMTRmY2QzLTg2MDktNDgwOC05M2JkLWZiMDQzMzdkMjVjYiJ9LCJuYmYiOjE2MjkxNDE3NjEsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDpkZWZhdWx0OmRlZmF1bHQifQ.R3W4H0Lj-XQdY_PVJ8HGrCcb0__ouFcvgNxs_e--t-fVrPbuBqTyaG1on1RMQtI1SWyDviS85w_cPVi7F-0kSR93hWtZGtwO_iHmOJQzxD-MEgxyUgW9ZGakQAaxVeaV5981B3ejgcaDOFGwUw3PLCU8LZwy-AxKGfPXCqkK0aA\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/web_identity_token_invalid_jwt/http-traffic.json",
    "content": "{\n  \"docs\": \"web identity token request/response where the response is a assume role error\",\n  \"version\": \"V0\",\n  \"events\": [\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Request\": {\n          \"request\": {\n            \"uri\": \"https://sts.us-east-1.amazonaws.com/\",\n            \"headers\": {\n              \"host\": [\n                \"sts.us-east-1.amazonaws.com\"\n              ],\n              \"user-agent\": [\n                \"aws-sdk-rust/0.1.0 os/macos lang/rust/1.55.0-nightly\"\n              ],\n              \"content-type\": [\n                \"application/x-www-form-urlencoded\"\n              ],\n              \"x-amz-user-agent\": [\n                \"aws-sdk-rust/0.1.0 api/sts/0.0.15-alpha os/macos lang/rust/1.55.0-nightly\"\n              ],\n              \"content-length\": [\n                \"1016\"\n              ]\n            },\n            \"method\": \"POST\"\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"Action=AssumeRoleWithWebIdentity&Version=2011-06-15&RoleArn=arn%3Aaws%3Aiam%3A%3A123456789%3Arole%2FRoleB&RoleSessionName=web-identity-token-profile-1629229438294&WebIdentityToken=eyJhbGciOiJSUzI1NiIsImtpZCI6IjQxOTg5NTBhMWU0Y2U3YjIxZDRhYTBjNTRkM2EzNmFhZGI0ZWRiOTcifQ.eyJhdWQiOlsibXktY2x1c3Rlci5zazEudXMtd2VzdC0yLmVrcy5hbWF6b25hd3MuY29tIl0sImV4cCI6MTYyOTIyODE2MSwiaWF0IjoxNjI5MTQxNzYxLCJpc3MiOiJodHRwczovL3MzLXVzLXdlc3QtMi5hbWF6b25hd3MuY29tL29pZGMtdGVzdC10enpvdGJ3bXpud2ltdXJjYmtlYm5kcHhhaW1peGJrYyIsImt1YmVybmV0ZXMuaW8iOnsiYm91bmRPYmplY3RSZWYiOnsiYXBpVmVyc2lvbiI6InYxIiwia2luZCI6IlBvZCIsIm5hbWUiOiJteS1wb2QteHZmZyIsInVpZCI6ImZiZmRlMTZiLTYwNDYtNDZlNS1hZDAzLTVkYWRlMjRiYzBhMiJ9LCJzZXJ2aWNlQWNjb3VudFVJRCI6IjEwMTRmY2QzLTg2MDktNDgwOC05M2JkLWZiMDQzMzdkMjVjYiJ9LCJuYmYiOjE2MjkxNDE3NjEsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDpkZWZhdWx0OmRlZmF1bHQifQ.R3W4H0Lj-XQdY_PVJ8HGrCcb0__ouFcvgNxs_e--t-fVrPbuBqTyaG1on1RMQtI1SWyDviS85w_cPVi7F-0kSR93hWtZGtwO_iHmOJQzxD-MEgxyUgW9ZGakQAaxVeaV5981B3ejgcaDOFGwUw3PLCU8LZwy-AxKGfPXCqkK0aA%0A\"\n          },\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Response\": {\n          \"response\": {\n            \"Ok\": {\n              \"status\": 400,\n              \"version\": \"HTTP/1.1\",\n              \"headers\": {\n                \"content-type\": [\n                  \"text/xml\"\n                ],\n                \"x-amzn-requestid\": [\n                  \"5045ca91-d123-4749-9d66-00a3c906be6c\"\n                ],\n                \"content-length\": [\n                  \"381\"\n                ],\n                \"date\": [\n                  \"Tue, 17 Aug 2021 19:43:57 GMT\"\n                ],\n                \"connection\": [\n                  \"close\"\n                ]\n              }\n            }\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"<ErrorResponse xmlns=\\\"https://sts.amazonaws.com/doc/2011-06-15/\\\">\\n  <Error>\\n    <Type>Sender</Type>\\n    <Code>InvalidIdentityToken</Code>\\n    <Message>No OpenIDConnect provider found in your account for https://s3-us-west-2.amazonaws.com/oidc-test-tzzotbwmznwimurcbkebndpxaimixbkc</Message>\\n  </Error>\\n  <RequestId>5045ca91-d123-4749-9d66-00a3c906be6c</RequestId>\\n</ErrorResponse>\\n\"\n          },\n          \"direction\": \"Response\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Response\"\n        }\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/web_identity_token_invalid_jwt/test-case.json",
    "content": "{\n  \"name\": \"web identity token bad JWT\",\n  \"docs\": \"Loads a web identity token but the server replies that the token is invalid\",\n  \"result\": {\n    \"ErrorContains\": \"InvalidIdentityTokenException: No OpenIDConnect provider found in your account\"\n  }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/web_identity_token_profile/env.json",
    "content": "{\n  \"AWS_REGION\": \"us-east-1\",\n  \"AWS_PROFILE\": \"A\",\n  \"HOME\": \"/home\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/web_identity_token_profile/fs/home/.aws/config",
    "content": "[profile A]\nrole_arn = arn:aws:iam::1234567890123:role/RoleA\nweb_identity_token_file = /token.jwt\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/web_identity_token_profile/fs/token.jwt",
    "content": "sometoken\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/web_identity_token_profile/http-traffic.json",
    "content": "{\n  \"events\": [\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Request\": {\n          \"request\": {\n            \"uri\": \"https://sts.us-east-1.amazonaws.com/\",\n            \"headers\": {\n              \"user-agent\": [\n                \"aws-sdk-rust/0.1.0 os/macos lang/rust/1.55.0-nightly\"\n              ],\n              \"content-type\": [\n                \"application/x-www-form-urlencoded\"\n              ],\n              \"x-amz-user-agent\": [\n                \"aws-sdk-rust/0.1.0 api/sts/0.0.15-alpha os/macos lang/rust/1.55.0-nightly\"\n              ],\n              \"host\": [\n                \"sts.us-east-1.amazonaws.com\"\n              ],\n              \"content-length\": [\n                \"1023\"\n              ]\n            },\n            \"method\": \"POST\"\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"Action=AssumeRoleWithWebIdentity&Version=2011-06-15&RoleArn=arn%3Aaws%3Aiam%3A%3A134095065856%3Arole%2Fs3-reader&RoleSessionName=web-identity-token-profile-1629230104118&WebIdentityToken=eyJhbGciOiJSUzI1NiIsImtpZCI6IjQxOTg5NTBhMWU0Y2U3YjIxZDRhYTBjNTRkM2EzNmFhZGI0ZWRiOTcifQ.eyJhdWQiOlsibXktY2x1c3Rlci5zazEudXMtd2VzdC0yLmVrcy5hbWF6b25hd3MuY29tIl0sImV4cCI6MTYyOTMxNTkyMiwiaWF0IjoxNjI5MjI5NTIyLCJpc3MiOiJodHRwczovL3MzLXVzLXdlc3QtMi5hbWF6b25hd3MuY29tL29pZGMtdGVzdC1jZG1oZmpneHphdXh5eWZtcXBpemNxdXlmamlycmRvbyIsImt1YmVybmV0ZXMuaW8iOnsiYm91bmRPYmplY3RSZWYiOnsiYXBpVmVyc2lvbiI6InYxIiwia2luZCI6IlBvZCIsIm5hbWUiOiJteS1wb2QteHZmZyIsInVpZCI6IjBkMjY3OGUyLWQ5M2UtNGE1Mi1hOTMxLTAwMTRiM2VlZTAwYiJ9LCJzZXJ2aWNlQWNjb3VudFVJRCI6IjY2YzE4YjVmLTAwZDgtNDI5Yi1hOGUwLWU4NWMzMjM4NGIyYSJ9LCJuYmYiOjE2MjkyMjk1MjIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDpkZWZhdWx0OmRlZmF1bHQifQ.eAlxZBmTcw_VgMCznEKAg-hmJa_lJJd-pn1VY04sztezWvt1bmPCsD9K2B7aw1sJvu08zLq52PBrZmqHA6KIFChgZOCvVwf3K7l6QTkEEMRIkb_P2a16o9_2LQRhDgNWy2p2DxzcWgzZvRNyy87hsRzonBBY5Z3U56uTAZrgha0%0A\"\n          },\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Response\": {\n          \"response\": {\n            \"Ok\": {\n              \"status\": 200,\n              \"version\": \"HTTP/1.1\",\n              \"headers\": {\n                \"content-length\": [\n                  \"2300\"\n                ],\n                \"x-amzn-requestid\": [\n                  \"bcbd8b6a-8a55-4610-b2d7-455d198bc197\"\n                ],\n                \"vary\": [\n                  \"accept-encoding\"\n                ],\n                \"content-type\": [\n                  \"text/xml\"\n                ],\n                \"date\": [\n                  \"Tue, 17 Aug 2021 19:55:04 GMT\"\n                ]\n              }\n            }\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"<AssumeRoleWithWebIdentityResponse xmlns=\\\"https://sts.amazonaws.com/doc/2011-06-15/\\\">\\n  <AssumeRoleWithWebIdentityResult>\\n    <Audience>my-cluster.sk1.us-west-2.eks.amazonaws.com</Audience>\\n    <AssumedRoleUser>\\n      <AssumedRoleId>AROARABCDEFGHIJKLMNOP:web-identity-token-profile-1629230104118</AssumedRoleId>\\n      <Arn>arn:aws:sts::123456789012:assumed-role/s3-reader/web-identity-token-profile-1629230104118</Arn>\\n    </AssumedRoleUser>\\n    <Provider>arn:aws:iam::123456789012:oidc-provider/s3-us-west-2.amazonaws.com/oidc-test-cdmhfjgxzauxyyfmqpizcquyfjirrdoo</Provider>\\n    <Credentials>\\n      <AccessKeyId>ASIARABCDEFGHIJKLMNOP</AccessKeyId>\\n      <SecretAccessKey>TESTSECRET</SecretAccessKey>\\n      <SessionToken>TESTSESSIONTOKEN</SessionToken>\\n      <Expiration>2021-08-17T20:55:04Z</Expiration>\\n    </Credentials>\\n    <SubjectFromWebIdentityToken>system:serviceaccount:default:default</SubjectFromWebIdentityToken>\\n  </AssumeRoleWithWebIdentityResult>\\n  <ResponseMetadata>\\n    <RequestId>bcbd8b6a-8a55-4610-b2d7-455d198bc197</RequestId>\\n  </ResponseMetadata>\\n</AssumeRoleWithWebIdentityResponse>\\n\"\n          },\n          \"direction\": \"Response\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Response\"\n        }\n      }\n    }\n  ],\n  \"docs\": \"assume role web identity chained into standard assume role\",\n  \"version\": \"V0\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/web_identity_token_profile/test-case.json",
    "content": "{\n  \"name\": \"web-identity-token-profile\",\n  \"docs\": \"loads a web identity token as a direct key in the profile\",\n  \"result\": {\n    \"Ok\": {\n      \"access_key_id\": \"ASIARABCDEFGHIJKLMNOP\",\n      \"secret_access_key\": \"TESTSECRET\",\n      \"session_token\": \"TESTSESSIONTOKEN\",\n      \"account_id\": \"123456789012\",\n      \"expiry\": 1629233704\n    }\n  }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/web_identity_token_source_profile/env.json",
    "content": "{\n  \"AWS_REGION\": \"us-east-1\",\n  \"AWS_PROFILE\": \"A\",\n  \"HOME\": \"/home\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/web_identity_token_source_profile/fs/home/.aws/config",
    "content": "[profile A]\nrole_arn = arn:aws:iam::123456789:role/RoleA\nsource_profile = B\n[profile B]\nrole_arn = arn:aws:iam::123456789012:role/s3-reader\nweb_identity_token_file = /token.jwt\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/web_identity_token_source_profile/fs/token.jwt",
    "content": "sometoken\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/web_identity_token_source_profile/http-traffic.json",
    "content": "{\n  \"events\": [\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Request\": {\n          \"request\": {\n            \"uri\": \"https://sts.us-east-1.amazonaws.com/\",\n            \"headers\": {\n              \"user-agent\": [\n                \"aws-sdk-rust/0.1.0 os/macos lang/rust/1.55.0-nightly\"\n              ],\n              \"content-type\": [\n                \"application/x-www-form-urlencoded\"\n              ],\n              \"x-amz-user-agent\": [\n                \"aws-sdk-rust/0.1.0 api/sts/0.0.15-alpha os/macos lang/rust/1.55.0-nightly\"\n              ],\n              \"host\": [\n                \"sts.us-east-1.amazonaws.com\"\n              ],\n              \"content-length\": [\n                \"1023\"\n              ]\n            },\n            \"method\": \"POST\"\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"Action=AssumeRoleWithWebIdentity&Version=2011-06-15&RoleArn=arn%3Aaws%3Aiam%3A%3A134095065856%3Arole%2Fs3-reader&RoleSessionName=web-identity-token-profile-1629230104118&WebIdentityToken=eyJhbGciOiJSUzI1NiIsImtpZCI6IjQxOTg5NTBhMWU0Y2U3YjIxZDRhYTBjNTRkM2EzNmFhZGI0ZWRiOTcifQ.eyJhdWQiOlsibXktY2x1c3Rlci5zazEudXMtd2VzdC0yLmVrcy5hbWF6b25hd3MuY29tIl0sImV4cCI6MTYyOTMxNTkyMiwiaWF0IjoxNjI5MjI5NTIyLCJpc3MiOiJodHRwczovL3MzLXVzLXdlc3QtMi5hbWF6b25hd3MuY29tL29pZGMtdGVzdC1jZG1oZmpneHphdXh5eWZtcXBpemNxdXlmamlycmRvbyIsImt1YmVybmV0ZXMuaW8iOnsiYm91bmRPYmplY3RSZWYiOnsiYXBpVmVyc2lvbiI6InYxIiwia2luZCI6IlBvZCIsIm5hbWUiOiJteS1wb2QteHZmZyIsInVpZCI6IjBkMjY3OGUyLWQ5M2UtNGE1Mi1hOTMxLTAwMTRiM2VlZTAwYiJ9LCJzZXJ2aWNlQWNjb3VudFVJRCI6IjY2YzE4YjVmLTAwZDgtNDI5Yi1hOGUwLWU4NWMzMjM4NGIyYSJ9LCJuYmYiOjE2MjkyMjk1MjIsInN1YiI6InN5c3RlbTpzZXJ2aWNlYWNjb3VudDpkZWZhdWx0OmRlZmF1bHQifQ.eAlxZBmTcw_VgMCznEKAg-hmJa_lJJd-pn1VY04sztezWvt1bmPCsD9K2B7aw1sJvu08zLq52PBrZmqHA6KIFChgZOCvVwf3K7l6QTkEEMRIkb_P2a16o9_2LQRhDgNWy2p2DxzcWgzZvRNyy87hsRzonBBY5Z3U56uTAZrgha0%0A\"\n          },\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Response\": {\n          \"response\": {\n            \"Ok\": {\n              \"status\": 200,\n              \"version\": \"HTTP/1.1\",\n              \"headers\": {\n                \"content-length\": [\n                  \"2300\"\n                ],\n                \"x-amzn-requestid\": [\n                  \"bcbd8b6a-8a55-4610-b2d7-455d198bc197\"\n                ],\n                \"vary\": [\n                  \"accept-encoding\"\n                ],\n                \"content-type\": [\n                  \"text/xml\"\n                ],\n                \"date\": [\n                  \"Tue, 17 Aug 2021 19:55:04 GMT\"\n                ]\n              }\n            }\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"<AssumeRoleWithWebIdentityResponse xmlns=\\\"https://sts.amazonaws.com/doc/2011-06-15/\\\">\\n  <AssumeRoleWithWebIdentityResult>\\n    <Audience>my-cluster.sk1.us-west-2.eks.amazonaws.com</Audience>\\n    <AssumedRoleUser>\\n      <AssumedRoleId>AROARABCDEFGHIJKLMNOP:web-identity-token-profile-1629230104118</AssumedRoleId>\\n      <Arn>arn:aws:sts::123456789012:assumed-role/s3-reader/web-identity-token-profile-1629230104118</Arn>\\n    </AssumedRoleUser>\\n    <Provider>arn:aws:iam::123456789012:oidc-provider/s3-us-west-2.amazonaws.com/oidc-test-cdmhfjgxzauxyyfmqpizcquyfjirrdoo</Provider>\\n    <Credentials>\\n      <AccessKeyId>ASIARABCDEFGHIJKLMNOP</AccessKeyId>\\n      <SecretAccessKey>TESTSECRET</SecretAccessKey>\\n      <SessionToken>TESTSESSIONTOKEN</SessionToken>\\n      <Expiration>2021-08-17T20:55:04Z</Expiration>\\n    </Credentials>\\n    <SubjectFromWebIdentityToken>system:serviceaccount:default:default</SubjectFromWebIdentityToken>\\n  </AssumeRoleWithWebIdentityResult>\\n  <ResponseMetadata>\\n    <RequestId>bcbd8b6a-8a55-4610-b2d7-455d198bc197</RequestId>\\n  </ResponseMetadata>\\n</AssumeRoleWithWebIdentityResponse>\\n\"\n          },\n          \"direction\": \"Response\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Response\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 1,\n      \"action\": {\n        \"Request\": {\n          \"request\": {\n            \"uri\": \"https://sts.us-east-1.amazonaws.com/\",\n            \"headers\": {\n              \"host\": [\n                \"sts.us-east-1.amazonaws.com\"\n              ],\n              \"x-amz-user-agent\": [\n                \"aws-sdk-rust/0.1.0 api/sts/0.0.15-alpha os/macos lang/rust/1.55.0-nightly\"\n              ],\n              \"user-agent\": [\n                \"aws-sdk-rust/0.1.0 os/macos lang/rust/1.55.0-nightly\"\n              ],\n              \"content-type\": [\n                \"application/x-www-form-urlencoded\"\n              ],\n              \"authorization\": [\n                \"AWS4-HMAC-SHA256 Credential=ASIARABCDEFGHIJKLMNOP/20210817/us-east-1/sts/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-date;x-amz-security-token;x-amz-user-agent, Signature=76912544a9c89063e854be6de0874d48f6d0b845ab34471c11c51300460d0c40\"\n              ],\n              \"x-amz-security-token\": [\n                \"IQoJb3JpZ2luX2VjEFQaCXVzLWVhc3QtMSJHMEUCIBULwfcnV0uXBLgeQdjsmpMFsBMSulmXDoBTUZlI2FCUAiEA8sIiChNM6iwFH1lWHP1sJ4DTBB56Kww75rgxjyzP+1kq8QQIfRABGgwxMzQwOTUwNjU4NTYiDC7wp9wVlaO+bkVT0yrOBNn2tXCJLQcYot38/PxMmLxr00t6VkcgtAC5uBuZLTNOxv90Lt1WFQKJPFYc0uPySuFMIFgAaPqJZOoiNw0PqsifgGXytnEQvC3cXRJdzUfULLcg3hMh+xmZIz3Uz+j8GDbVZEBxCaSBQ9cwk/R3YM6BW1scLpGvLdv/fqHiUnBOW14/XsAQXXvKh/jjCLRfSjU//qtZ6z3qi2l0Nv2OfV4+MYx7MeGGaRrMic9ZIZnXh5Xk6xLLPGUZYMyVEFMYkaUBqja81f0Y1ENbfUNiKMgiRn4qvIUl7bivSqcJP/6yPcKzr3AvIbkpXo7miAL9TZ1wE+IP84zX9OXvGLj4Ri6f/gerzBtiyhTJu7am2WFp+VuI3SOixrOiawxZbGHQKekvz6GSzyCAE50QHnvjlrEjGLct0EoDX5RWWFlhndaNNxYzED+olvL3zTRdDhorA+64p7L5B/NzIJboKYPOoBzOoS15GBGAd82KrtKetZDLlwEj5cUpv468c/FpZhKxV/oQ93PXIWK0Z7Hl2GTifUepfYcfduvEd11GfECr4yGNA4nVNCTAg2TUBxJv0fZFcNPI+XAbuSIgjliUDWEj8ma81fDIMT0bISUR5QStZZcA8pFKyDagpc7CJxkbC3RGq/cvjWxjd/A2j6b4N27NG0GKaRzGQq2i+56OOGD7qHCO3vVFiVSOKYyoKE8UAEM9WfpPXpmDY+sgyYUOLVSjEfg4SinfI3mV7AgsmbBhyDgxDLbALe3XC03QdGn8ctJ5rcGM71lQVS6nYXhSIYGxMJio8IgGOpUBDcfdTwPwQ333opNF9SBnuuvzMPyp4xf8K0+KNDIPBGKrEQyzJOuhd8N0fvXquzGcsUvQ7hUYVp544kvBZKqQSqDMGFbzc28M7YxFh+36mNr+H9PDAccCdW4k6DxZ0xWmXnoOWg5GeWSKeslaEYWJijCbX3kgS+j1FNSc4yL3pNPTIn2kELHVNI4Xu2JnrfklII07TIE=\"\n              ],\n              \"x-amz-date\": [\n                \"20210817T195504Z\"\n              ],\n              \"content-length\": [\n                \"145\"\n              ]\n            },\n            \"method\": \"POST\"\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 1,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"Action=AssumeRole&Version=2011-06-15&RoleArn=arn%3Aaws%3Aiam%3A%3A123456789%3Arole%2FRoleA&RoleSessionName=assume-role-from-profile-1629230104880\"\n          },\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 1,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 1,\n      \"action\": {\n        \"Response\": {\n          \"response\": {\n            \"Ok\": {\n              \"status\": 200,\n              \"version\": \"HTTP/1.1\",\n              \"headers\": {\n                \"content-length\": [\n                  \"431\"\n                ],\n                \"content-type\": [\n                  \"text/xml\"\n                ],\n                \"x-amzn-requestid\": [\n                  \"a91154b8-3427-402d-8053-7c0ad696bbfd\"\n                ],\n                \"date\": [\n                  \"Tue, 17 Aug 2021 19:55:04 GMT\"\n                ]\n              }\n            }\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 1,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"<AssumeRoleResponse xmlns=\\\"https://sts.amazonaws.com/doc/2011-06-15/\\\">\\n  <AssumeRoleResult>\\n    <AssumedRoleUser>\\n      <AssumedRoleId>AROARABCDEFGHIJKLMNOP:assume-role-provider-session</AssumedRoleId>\\n      <Arn>arn:aws:sts::123456789012:assumed-role/integration-test/assume-role-provider-session</Arn>\\n    </AssumedRoleUser>\\n    <Credentials>\\n      <AccessKeyId>ASIARTESTID</AccessKeyId>\\n      <SecretAccessKey>TESTSECRETKEY</SecretAccessKey>\\n      <SessionToken>TESTSESSIONTOKEN</SessionToken>\\n      <Expiration>2021-08-05T19:58:02Z</Expiration>\\n    </Credentials>\\n  </AssumeRoleResult>\\n  <ResponseMetadata>\\n    <RequestId>c2e971c2-702d-4124-9b1f-1670febbea18</RequestId>\\n  </ResponseMetadata>\\n</AssumeRoleResponse>\\n\"\n          },\n          \"direction\": \"Response\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 1,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Response\"\n        }\n      }\n    }\n  ],\n  \"docs\": \"assume role web identity chained into standard assume role\",\n  \"version\": \"V0\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-credential-provider-chain/web_identity_token_source_profile/test-case.json",
    "content": "{\n  \"name\": \"web-identity-token-source-profile\",\n  \"docs\": \"loads a web identity token via `source_profile`\",\n  \"result\": {\n    \"Ok\": {\n      \"access_key_id\": \"ASIARTESTID\",\n      \"secret_access_key\": \"TESTSECRETKEY\",\n      \"session_token\": \"TESTSESSIONTOKEN\",\n      \"account_id\": \"123456789012\",\n      \"expiry\": 1628193482\n    }\n  }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-token-provider-chain/profile_keys/env.json",
    "content": "{\n    \"HOME\": \"/home\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-token-provider-chain/profile_keys/fs/home/.aws/config",
    "content": "[profile default]\nsso_session = test-sso\nregion=us-west-2\n\n[sso-session test-sso]\nsso_start_url = https://ssotest.awsapps.com/start\nsso_region = us-east-2\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-token-provider-chain/profile_keys/fs/home/.aws/sso/cache/d12208e38164f558a1d06c99432ab77dbb346c45.json",
    "content": "{\n  \"accessToken\": \"foobarbaz\",\n  \"expiresAt\": \"2080-10-16T03:56:45Z\",\n  \"startUrl\": \"https://ssotest.awsapps.com/start\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-token-provider-chain/profile_keys/http-traffic.json",
    "content": "{\n    \"version\": \"V0\",\n    \"docs\": \"Load a SSO bearer token from the default profile\",\n    \"events\": []\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-token-provider-chain/profile_keys/test-case.json",
    "content": "{\n  \"name\": \"profile_keys\",\n  \"docs\": \"Load a SSO bearer token from the default profile\",\n  \"result\": {\n    \"Ok\": {\n      \"token\": \"foobarbaz\",\n      \"expiration\": \"2080-10-16T03:56:45Z\"\n    }\n  }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-token-provider-chain/profile_keys_case_insensitive/env.json",
    "content": "{\n    \"HOME\": \"/home\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-token-provider-chain/profile_keys_case_insensitive/fs/home/.aws/config",
    "content": "[profile default]\nSSO_SESSION = test-sso\nREGION=us-west-2\n\n[sso-session test-sso]\nSSO_START_URL = https://ssotest.awsapps.com/start\nSSO_REGION = us-east-2\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-token-provider-chain/profile_keys_case_insensitive/fs/home/.aws/sso/cache/d12208e38164f558a1d06c99432ab77dbb346c45.json",
    "content": "{\n  \"accessToken\": \"foobarbaz\",\n  \"expiresAt\": \"2080-10-16T03:56:45Z\",\n  \"startUrl\": \"https://ssotest.awsapps.com/start\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-token-provider-chain/profile_keys_case_insensitive/http-traffic.json",
    "content": "{\n    \"version\": \"V0\",\n    \"docs\": \"Load a SSO bearer token from the default profile with case insensitive keys\",\n    \"events\": []\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-token-provider-chain/profile_keys_case_insensitive/test-case.json",
    "content": "{\n  \"name\": \"profile_keys_case_insensitive\",\n  \"docs\": \"Load a SSO bearer token from the default profile with case insensitive keys\",\n  \"result\": {\n    \"Ok\": {\n      \"token\": \"foobarbaz\",\n      \"expiration\": \"2080-10-16T03:56:45Z\"\n    }\n  }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-token-provider-chain/profile_name/env.json",
    "content": "{\n    \"HOME\": \"/home\",\n    \"AWS_PROFILE\": \"correct-sso\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-token-provider-chain/profile_name/fs/home/.aws/config",
    "content": "[profile incorrect-sso]\nsso_session = incorrect-sso\nregion=us-west-2\n\n[sso-session incorrect-sso]\nsso_start_url = https://incorrect-ssotest.awsapps.com/start\nsso_region = us-east-2\n\n[profile correct-sso]\nsso_session = correct-sso\nregion=us-west-2\n\n[sso-session correct-sso]\nsso_start_url = https://ssotest.awsapps.com/start\nsso_region = us-east-2\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-token-provider-chain/profile_name/fs/home/.aws/sso/cache/29faa2f70ab0f58f60e284d585d95865572f5cbd.json",
    "content": "{\n  \"accessToken\": \"foobarbaz\",\n  \"expiresAt\": \"2080-10-16T03:56:45Z\",\n  \"startUrl\": \"https://ssotest.awsapps.com/start\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-token-provider-chain/profile_name/http-traffic.json",
    "content": "{\n    \"version\": \"V0\",\n    \"docs\": \"Load a SSO bearer token from a profile named correct-sso\",\n    \"events\": []\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/default-token-provider-chain/profile_name/test-case.json",
    "content": "{\n  \"name\": \"profile_name\",\n  \"docs\": \"Load a SSO bearer token from a profile named correct-sso\",\n  \"result\": {\n    \"Ok\": {\n      \"token\": \"foobarbaz\",\n      \"expiration\": \"2080-10-16T03:56:45Z\"\n    }\n  }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/ecs-tests.json",
    "content": "{\n  \"tests\": [\n    {\n      \"docs\": \"all fields unset provider is not enabled\",\n      \"env\": {},\n      \"result\": {\n        \"ErrorContains\": \"No environment variables were set to configure ECS provider\"\n      }\n    },\n    {\n      \"docs\": \"relative URI\",\n      \"env\": {\n        \"AWS_CONTAINER_CREDENTIALS_RELATIVE_URI\": \"/credentials\"\n      },\n      \"result\": {\n        \"Ok\": \"http://169.254.170.2/credentials\"\n      }\n    },\n    {\n      \"docs\": \"invalid full uri\",\n      \"env\": {\n        \"AWS_CONTAINER_CREDENTIALS_FULL_URI\": \"/credentials\"\n      },\n      \"result\": {\n        \"ErrorContains\": \"URI did not specify a host\"\n      }\n    },\n    {\n      \"docs\": \"full uri HTTPS\",\n      \"env\": {\n        \"AWS_CONTAINER_CREDENTIALS_FULL_URI\": \"https://mypersonalsite/credentials\"\n      },\n      \"result\": {\n        \"Ok\": \"https://mypersonalsite/credentials\"\n      }\n    },\n    {\n      \"docs\": \"full uri HTTPS with port\",\n      \"env\": {\n        \"AWS_CONTAINER_CREDENTIALS_FULL_URI\": \"https://mypersonalsite:8080/credentials\"\n      },\n      \"result\": {\n        \"Ok\": \"https://mypersonalsite:8080/credentials\"\n      }\n    },\n    {\n      \"docs\": \"localhost\",\n      \"env\": {\n        \"AWS_CONTAINER_CREDENTIALS_FULL_URI\": \"http://localhost:8080/credentials\"\n      },\n      \"result\": {\n        \"Ok\": \"http://localhost:8080/credentials\"\n      }\n    },\n    {\n      \"docs\": \"ecs task role\",\n      \"env\": {\n        \"AWS_CONTAINER_CREDENTIALS_FULL_URI\": \"http://169.254.170.2/credentials\"\n      },\n      \"result\": {\n        \"Ok\": \"http://169.254.170.2/credentials\"\n      }\n    },\n    {\n      \"docs\": \"eks pod identity ipv4\",\n      \"env\": {\n        \"AWS_CONTAINER_CREDENTIALS_FULL_URI\": \"http://169.254.170.23/v1/credentials\"\n      },\n      \"result\": {\n        \"Ok\": \"http://169.254.170.23/v1/credentials\"\n      }\n    },\n    {\n      \"docs\": \"eks pod identity ipv6\",\n      \"env\": {\n        \"AWS_CONTAINER_CREDENTIALS_FULL_URI\": \"http://[fd00:ec2::23]/v1/credentials\"\n      },\n      \"result\": {\n        \"Ok\": \"http://[fd00:ec2::23]/v1/credentials\"\n      }\n    },\n    {\n      \"docs\": \"relative takes precedence over full\",\n      \"env\": {\n        \"AWS_CONTAINER_CREDENTIALS_FULL_URI\": \"http://localhost:8080/credentials\",\n        \"AWS_CONTAINER_CREDENTIALS_RELATIVE_URI\": \"/credentials\"\n      },\n      \"result\": {\n        \"Ok\": \"http://169.254.170.2/credentials\"\n      }\n    },\n    {\n      \"docs\": \"support query params\",\n      \"env\": {\n        \"AWS_CONTAINER_CREDENTIALS_RELATIVE_URI\": \"/credentials?a=1\"\n      },\n      \"result\": {\n        \"Ok\": \"http://169.254.170.2/credentials?a=1\"\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/imds-config/imds-endpoint-tests.json",
    "content": "{\n  \"tests\": [\n    {\n      \"docs\": \"all fields unset, default endpoint\",\n      \"env\": {},\n      \"fs\": {},\n      \"result\": {\n        \"Ok\": \"http://169.254.169.254/latest/api/token\"\n      }\n    },\n    {\n      \"docs\": \"environment variable endpoint override\",\n      \"env\": {\n        \"AWS_EC2_METADATA_SERVICE_ENDPOINT\": \"http://override:456\"\n      },\n      \"fs\": {},\n      \"result\": {\n        \"Ok\": \"http://override:456/latest/api/token\"\n      }\n    },\n    {\n      \"docs\": \"profile endpoint override\",\n      \"env\": {\n        \"AWS_CONFIG_FILE\": \"config\"\n      },\n      \"fs\": {\n        \"config\": \"[default]\\nec2_metadata_service_endpoint = http://override:456\"\n      },\n      \"result\": {\n        \"Ok\": \"http://override:456/latest/api/token\"\n      }\n    },\n    {\n      \"docs\": \"environment overrides profile\",\n      \"env\": {\n        \"AWS_CONFIG_FILE\": \"config\",\n        \"AWS_EC2_METADATA_SERVICE_ENDPOINT\": \"http://override:456\"\n      },\n      \"fs\": {\n        \"config\": \"[default]\\nec2_metadata_service_endpoint = http://wrong:456\"\n      },\n      \"result\": {\n        \"Ok\": \"http://override:456/latest/api/token\"\n      }\n    },\n    {\n      \"docs\": \"invalid endpoint mode override\",\n      \"env\": {\n        \"AWS_EC2_METADATA_SERVICE_ENDPOINT_MODE\": \"error\"\n      },\n      \"fs\": {\n      },\n      \"result\": {\n        \"Err\": \"`error` is not a valid endpoint mode\"\n      }\n    },\n    {\n      \"docs\": \"ipv4 endpoint\",\n      \"env\": {\n        \"AWS_EC2_METADATA_SERVICE_ENDPOINT_MODE\": \"IPv4\"\n      },\n      \"fs\": {\n      },\n      \"result\": {\n        \"Ok\": \"http://169.254.169.254/latest/api/token\"\n      }\n    },\n    {\n      \"docs\": \"ipv6 endpoint\",\n      \"env\": {\n        \"AWS_EC2_METADATA_SERVICE_ENDPOINT_MODE\": \"IPv6\"\n      },\n      \"fs\": {\n      },\n      \"result\": {\n        \"Ok\": \"http://[fd00:ec2::254]/latest/api/token\"\n      }\n    },\n    {\n      \"docs\": \"case insensitive endpoint\",\n      \"env\": {\n        \"AWS_EC2_METADATA_SERVICE_ENDPOINT_MODE\": \"ipV6\"\n      },\n      \"fs\": {\n      },\n      \"result\": {\n        \"Ok\": \"http://[fd00:ec2::254]/latest/api/token\"\n      }\n    },\n    {\n      \"docs\": \"ipv6 endpoint from config\",\n      \"env\": {\n        \"AWS_CONFIG_FILE\": \"config\"\n      },\n      \"fs\": {\n        \"config\": \"[default]\\nec2_metadata_service_endpoint_mode = IPv6\"\n      },\n      \"result\": {\n        \"Ok\": \"http://[fd00:ec2::254]/latest/api/token\"\n      }\n    },\n    {\n      \"docs\": \"invalid config endpoint mode\",\n      \"env\": {\n        \"AWS_CONFIG_FILE\": \"config\"\n      },\n      \"fs\": {\n        \"config\": \"[default]\\nec2_metadata_service_endpoint_mode = IPv7\"\n      },\n      \"result\": {\n        \"Err\": \"`IPv7` is not a valid endpoint mode\"\n      }\n    },\n    {\n      \"docs\": \"explicit endpoint override\",\n      \"env\": {\n        \"AWS_CONFIG_FILE\": \"config\"\n      },\n      \"fs\": {\n        \"config\": \"[default]\\nec2_metadata_service_endpoint_mode = IPv6\"\n      },\n      \"endpoint_override\": \"https://custom\",\n      \"result\": {\n        \"Ok\": \"https://custom/latest/api/token\"\n      }\n    },\n    {\n      \"docs\": \"explicit mode override\",\n      \"env\": {\n        \"AWS_CONFIG_FILE\": \"config\"\n      },\n      \"fs\": {\n        \"config\": \"[default]\\nec2_metadata_service_endpoint_mode = IPv4\"\n      },\n      \"mode_override\": \"IPv6\",\n      \"result\": {\n        \"Ok\": \"http://[fd00:ec2::254]/latest/api/token\"\n      }\n    },\n    {\n      \"docs\": \"invalid uri\",\n      \"env\": {\n        \"AWS_EC2_METADATA_SERVICE_ENDPOINT\": \"not a uri\"\n      },\n      \"fs\": {},\n      \"result\": {\n        \"Err\": \"invalid uri character\"\n      }\n    },\n    {\n      \"docs\": \"environment variable overrides endpoint mode override\",\n      \"env\": {\n        \"AWS_EC2_METADATA_SERVICE_ENDPOINT\": \"http://169.254.169.200\"\n      },\n      \"fs\": {},\n      \"mode_override\": \"IPv6\",\n      \"result\": {\n        \"Ok\": \"http://169.254.169.200/latest/api/token\"\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/login-provider-test-cases.json",
    "content": "[\n  {\n    \"documentation\": \"Success - Valid credentials are returned immediately\",\n    \"configContents\": \"[profile signin]\\nlogin_session = arn:aws:sts::012345678910:assumed-role/Admin/admin\\n\",\n    \"cacheContents\": {\n      \"4b0ba8f99f075c0633e122fd73346ce203a3faf18ea0310eb2d29df1bab2e255.json\": {\n        \"accessToken\": {\n          \"accessKeyId\": \"AKIAIOSFODNN7EXAMPLE\",\n          \"secretAccessKey\": \"wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY\",\n          \"sessionToken\": \"AQoEXAMPLEH4aoAH0gNCAPyJxz4BlCFFxWNE1OPTgk5TthT+FvwqnKwRcOIfrRh3c/LTo6UDdyJwOOvEVPvLXCrrrUtdnniCEXAMPLE/IvU1dYUg2RVAJBanLiHb4IgRmpRV3zrkuWJOgQs8IZZaIv2BXIa2R4OlgkBN9bkUDNCJiBeb/AXlzBBko7b15fjrBs2+cTQtpZ3CYWFXG8C5zqx37wnOE49mRl/+OtkIKGO7fAE\",\n          \"accountId\": \"012345678901\",\n          \"expiresAt\": \"3025-09-14T04:05:45Z\"\n        },\n        \"clientId\": \"arn:aws:signin:::devtools/same-device\",\n        \"refreshToken\": \"refresh_token\",\n        \"idToken\": \"eyJraWQiOiI1MzYxMjY2ZS1mNjI5LTQ0ZGQtOTA1My1jYzJkNTM1OTJiOTIiLCJ0eXAiOiJKV1QiLCJhbGciOiJFUzM4NCJ9.eyJzdWIiOiJhcm46YXdzOnN0czo6NzIxNzgxNjAzNzU1OmFzc3VtZWQtcm9sZVwvQWRtaW5cL3Nob3ZsaWEtSXNlbmdhcmQiLCJhdWQiOiJhcm46YXdzOnNpZ25pbjo6OmNsaVwvc2FtZS1kZXZpY2UiLCJpc3MiOiJodHRwczpcL1wvc2lnbmluLmF3cy5hbWF6b24uY29tXC9zaWduaW4iLCJzZXNzaW9uX2FybiI6ImFybjphd3M6c3RzOjo3MjE3ODE2MDM3NTU6YXNzdW1lZC1yb2xlXC9BZG1pblwvc2hvdmxpYS1Jc2VuZ2FyZCIsImV4cCI6MTc2MTE2Nzk0NiwiaWF0IjoxNzYxMTY3MDQ2fQ.EzySTg0K11hwQtIYtcBcnNMmX33F6XrVqXsk8WyTWjYcMQxaMnqXebLwBQBCRZha05hZiIZ5xPVCBIt7hZGyymurSfOL72cz69xHUH6u7rwu8vn10UKLHfyKLneKBlmJ\",\n        \"dpopKey\": \"-----BEGIN EC PRIVATE KEY-----\\nMHcCAQEEIPt/u8InPLpQeQLJTvVX+sNDzni8vMDMt3Liu+nMBigfoAoGCCqGSM49\\nAwEHoUQDQgAEILkGG7rNOnxiIJlMgimY1UPP8eDMFP0DAY6WGjngP4bvTAiUCQ/I\\nffut2379uP+OBCm2ovGpBOJRgrl1RspUOQ==\\n-----END EC PRIVATE KEY-----\\n\"\n      }\n    },\n    \"outcomes\": [\n      {\n        \"result\": \"credentials\",\n        \"accessKeyId\": \"AKIAIOSFODNN7EXAMPLE\",\n        \"secretAccessKey\": \"wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY\",\n        \"sessionToken\": \"AQoEXAMPLEH4aoAH0gNCAPyJxz4BlCFFxWNE1OPTgk5TthT+FvwqnKwRcOIfrRh3c/LTo6UDdyJwOOvEVPvLXCrrrUtdnniCEXAMPLE/IvU1dYUg2RVAJBanLiHb4IgRmpRV3zrkuWJOgQs8IZZaIv2BXIa2R4OlgkBN9bkUDNCJiBeb/AXlzBBko7b15fjrBs2+cTQtpZ3CYWFXG8C5zqx37wnOE49mRl/+OtkIKGO7fAE\",\n        \"accountId\": \"012345678901\",\n        \"expiresAt\": \"3025-09-14T04:05:45Z\"\n      }\n    ]\n  },\n  {\n    \"documentation\": \"Failure - No cache file\",\n    \"configContents\": \"[profile signin]\\nlogin_session = arn:aws:sts::012345678910:assumed-role/Admin/admin\\n\",\n    \"cacheContents\": {\n    },\n    \"outcomes\": [\n      {\n        \"result\": \"error\"\n      }\n    ]\n  },\n  {\n    \"documentation\": \"Failure - Missing accessToken\",\n    \"configContents\": \"[profile signin]\\nlogin_session = arn:aws:sts::012345678910:assumed-role/Admin/admin\\n\",\n    \"cacheContents\": {\n      \"4b0ba8f99f075c0633e122fd73346ce203a3faf18ea0310eb2d29df1bab2e255.json\": {\n        \"clientId\": \"arn:aws:signin:::devtools/same-device\",\n        \"refreshToken\": \"valid_refresh_token_456\",\n        \"idToken\": \"eyJraWQiOiI1MzYxMjY2ZS1mNjI5LTQ0ZGQtOTA1My1jYzJkNTM1OTJiOTIiLCJ0eXAiOiJKV1QiLCJhbGciOiJFUzM4NCJ9.eyJzdWIiOiJhcm46YXdzOnN0czo6NzIxNzgxNjAzNzU1OmFzc3VtZWQtcm9sZVwvQWRtaW5cL3Nob3ZsaWEtSXNlbmdhcmQiLCJhdWQiOiJhcm46YXdzOnNpZ25pbjo6OmNsaVwvc2FtZS1kZXZpY2UiLCJpc3MiOiJodHRwczpcL1wvc2lnbmluLmF3cy5hbWF6b24uY29tXC9zaWduaW4iLCJzZXNzaW9uX2FybiI6ImFybjphd3M6c3RzOjo3MjE3ODE2MDM3NTU6YXNzdW1lZC1yb2xlXC9BZG1pblwvc2hvdmxpYS1Jc2VuZ2FyZCIsImV4cCI6MTc2MTE2Nzk0NiwiaWF0IjoxNzYxMTY3MDQ2fQ.EzySTg0K11hwQtIYtcBcnNMmX33F6XrVqXsk8WyTWjYcMQxaMnqXebLwBQBCRZha05hZiIZ5xPVCBIt7hZGyymurSfOL72cz69xHUH6u7rwu8vn10UKLHfyKLneKBlmJ\",\n        \"dpopKey\": \"-----BEGIN EC PRIVATE KEY-----\\nMHcCAQEEIPt/u8InPLpQeQLJTvVX+sNDzni8vMDMt3Liu+nMBigfoAoGCCqGSM49\\nAwEHoUQDQgAEILkGG7rNOnxiIJlMgimY1UPP8eDMFP0DAY6WGjngP4bvTAiUCQ/I\\nffut2379uP+OBCm2ovGpBOJRgrl1RspUOQ==\\n-----END EC PRIVATE KEY-----\\n\"\n      }\n    },\n    \"outcomes\": [\n      {\n        \"result\": \"error\"\n      }\n    ]\n  },\n  {\n    \"documentation\": \"Failure - Missing refreshToken\",\n    \"configContents\": \"[profile signin]\\nlogin_session = arn:aws:sts::012345678910:assumed-role/Admin/admin\\n\",\n    \"cacheContents\": {\n      \"4b0ba8f99f075c0633e122fd73346ce203a3faf18ea0310eb2d29df1bab2e255.json\": {\n        \"accessToken\": {\n          \"accessKeyId\": \"AKIAIOSFODNN7EXAMPLE\",\n          \"secretAccessKey\": \"wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY\",\n          \"sessionToken\": \"AQoEXAMPLEH4aoAH0gNCAPyJxz4BlCFFxWNE1OPTgk5TthT+FvwqnKwRcOIfrRh3c/LTo6UDdyJwOOvEVPvLXCrrrUtdnniCEXAMPLE/IvU1dYUg2RVAJBanLiHb4IgRmpRV3zrkuWJOgQs8IZZaIv2BXIa2R4OlgkBN9bkUDNCJiBeb/AXlzBBko7b15fjrBs2+cTQtpZ3CYWFXG8C5zqx37wnOE49mRl/+OtkIKGO7fAE\",\n          \"accountId\": \"012345678901\",\n          \"expiresAt\": \"2020-01-01T00:00:00Z\"\n        },\n        \"clientId\": \"arn:aws:signin:::devtools/same-device\",\n        \"idToken\": \"eyJraWQiOiI1MzYxMjY2ZS1mNjI5LTQ0ZGQtOTA1My1jYzJkNTM1OTJiOTIiLCJ0eXAiOiJKV1QiLCJhbGciOiJFUzM4NCJ9.eyJzdWIiOiJhcm46YXdzOnN0czo6NzIxNzgxNjAzNzU1OmFzc3VtZWQtcm9sZVwvQWRtaW5cL3Nob3ZsaWEtSXNlbmdhcmQiLCJhdWQiOiJhcm46YXdzOnNpZ25pbjo6OmNsaVwvc2FtZS1kZXZpY2UiLCJpc3MiOiJodHRwczpcL1wvc2lnbmluLmF3cy5hbWF6b24uY29tXC9zaWduaW4iLCJzZXNzaW9uX2FybiI6ImFybjphd3M6c3RzOjo3MjE3ODE2MDM3NTU6YXNzdW1lZC1yb2xlXC9BZG1pblwvc2hvdmxpYS1Jc2VuZ2FyZCIsImV4cCI6MTc2MTE2Nzk0NiwiaWF0IjoxNzYxMTY3MDQ2fQ.EzySTg0K11hwQtIYtcBcnNMmX33F6XrVqXsk8WyTWjYcMQxaMnqXebLwBQBCRZha05hZiIZ5xPVCBIt7hZGyymurSfOL72cz69xHUH6u7rwu8vn10UKLHfyKLneKBlmJ\",\n        \"dpopKey\": \"-----BEGIN EC PRIVATE KEY-----\\nMHcCAQEEIPt/u8InPLpQeQLJTvVX+sNDzni8vMDMt3Liu+nMBigfoAoGCCqGSM49\\nAwEHoUQDQgAEILkGG7rNOnxiIJlMgimY1UPP8eDMFP0DAY6WGjngP4bvTAiUCQ/I\\nffut2379uP+OBCm2ovGpBOJRgrl1RspUOQ==\\n-----END EC PRIVATE KEY-----\\n\"\n      }\n    },\n    \"outcomes\": [\n      {\n        \"result\": \"error\"\n      }\n    ]\n  },\n  {\n    \"documentation\": \"Failure - Missing clientId in cache\",\n    \"configContents\": \"[profile signin]\\nlogin_session = arn:aws:sts::012345678910:assumed-role/Admin/admin\\n\",\n    \"cacheContents\": {\n      \"4b0ba8f99f075c0633e122fd73346ce203a3faf18ea0310eb2d29df1bab2e255.json\": {\n        \"accessToken\": {\n          \"accessKeyId\": \"AKIAIOSFODNN7EXAMPLE\",\n          \"secretAccessKey\": \"wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY\",\n          \"sessionToken\": \"AQoEXAMPLEH4aoAH0gNCAPyJxz4BlCFFxWNE1OPTgk5TthT+FvwqnKwRcOIfrRh3c/LTo6UDdyJwOOvEVPvLXCrrrUtdnniCEXAMPLE/IvU1dYUg2RVAJBanLiHb4IgRmpRV3zrkuWJOgQs8IZZaIv2BXIa2R4OlgkBN9bkUDNCJiBeb/AXlzBBko7b15fjrBs2+cTQtpZ3CYWFXG8C5zqx37wnOE49mRl/+OtkIKGO7fAE\",\n          \"accountId\": \"012345678901\",\n          \"expiresAt\": \"2020-01-01T00:00:00Z\"\n        },\n        \"refreshToken\": \"valid_refresh_token_789\",\n        \"idToken\": \"eyJraWQiOiI1MzYxMjY2ZS1mNjI5LTQ0ZGQtOTA1My1jYzJkNTM1OTJiOTIiLCJ0eXAiOiJKV1QiLCJhbGciOiJFUzM4NCJ9.eyJzdWIiOiJhcm46YXdzOnN0czo6NzIxNzgxNjAzNzU1OmFzc3VtZWQtcm9sZVwvQWRtaW5cL3Nob3ZsaWEtSXNlbmdhcmQiLCJhdWQiOiJhcm46YXdzOnNpZ25pbjo6OmNsaVwvc2FtZS1kZXZpY2UiLCJpc3MiOiJodHRwczpcL1wvc2lnbmluLmF3cy5hbWF6b24uY29tXC9zaWduaW4iLCJzZXNzaW9uX2FybiI6ImFybjphd3M6c3RzOjo3MjE3ODE2MDM3NTU6YXNzdW1lZC1yb2xlXC9BZG1pblwvc2hvdmxpYS1Jc2VuZ2FyZCIsImV4cCI6MTc2MTE2Nzk0NiwiaWF0IjoxNzYxMTY3MDQ2fQ.EzySTg0K11hwQtIYtcBcnNMmX33F6XrVqXsk8WyTWjYcMQxaMnqXebLwBQBCRZha05hZiIZ5xPVCBIt7hZGyymurSfOL72cz69xHUH6u7rwu8vn10UKLHfyKLneKBlmJ\",\n        \"dpopKey\": \"-----BEGIN EC PRIVATE KEY-----\\nMHcCAQEEIPt/u8InPLpQeQLJTvVX+sNDzni8vMDMt3Liu+nMBigfoAoGCCqGSM49\\nAwEHoUQDQgAEILkGG7rNOnxiIJlMgimY1UPP8eDMFP0DAY6WGjngP4bvTAiUCQ/I\\nffut2379uP+OBCm2ovGpBOJRgrl1RspUOQ==\\n-----END EC PRIVATE KEY-----\\n\"\n      }\n    },\n    \"outcomes\": [\n      {\n        \"result\": \"error\"\n      }\n    ]\n  },\n  {\n    \"documentation\": \"Failure - Missing dpopKey\",\n    \"configContents\": \"[profile signin]\\nlogin_session = arn:aws:sts::012345678910:assumed-role/Admin/admin\\n\",\n    \"cacheContents\": {\n      \"4b0ba8f99f075c0633e122fd73346ce203a3faf18ea0310eb2d29df1bab2e255.json\": {\n        \"accessToken\": {\n          \"accessKeyId\": \"AKIAIOSFODNN7EXAMPLE\",\n          \"secretAccessKey\": \"wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY\",\n          \"sessionToken\": \"AQoEXAMPLEH4aoAH0gNCAPyJxz4BlCFFxWNE1OPTgk5TthT+FvwqnKwRcOIfrRh3c/LTo6UDdyJwOOvEVPvLXCrrrUtdnniCEXAMPLE/IvU1dYUg2RVAJBanLiHb4IgRmpRV3zrkuWJOgQs8IZZaIv2BXIa2R4OlgkBN9bkUDNCJiBeb/AXlzBBko7b15fjrBs2+cTQtpZ3CYWFXG8C5zqx37wnOE49mRl/+OtkIKGO7fAE\",\n          \"accountId\": \"012345678901\",\n          \"expiresAt\": \"2020-01-01T00:00:00Z\"\n        },\n        \"clientId\": \"arn:aws:signin:::devtools/same-device\",\n        \"refreshToken\": \"valid_refresh_token_101112\",\n        \"idToken\": \"eyJraWQiOiI1MzYxMjY2ZS1mNjI5LTQ0ZGQtOTA1My1jYzJkNTM1OTJiOTIiLCJ0eXAiOiJKV1QiLCJhbGciOiJFUzM4NCJ9.eyJzdWIiOiJhcm46YXdzOnN0czo6NzIxNzgxNjAzNzU1OmFzc3VtZWQtcm9sZVwvQWRtaW5cL3Nob3ZsaWEtSXNlbmdhcmQiLCJhdWQiOiJhcm46YXdzOnNpZ25pbjo6OmNsaVwvc2FtZS1kZXZpY2UiLCJpc3MiOiJodHRwczpcL1wvc2lnbmluLmF3cy5hbWF6b24uY29tXC9zaWduaW4iLCJzZXNzaW9uX2FybiI6ImFybjphd3M6c3RzOjo3MjE3ODE2MDM3NTU6YXNzdW1lZC1yb2xlXC9BZG1pblwvc2hvdmxpYS1Jc2VuZ2FyZCIsImV4cCI6MTc2MTE2Nzk0NiwiaWF0IjoxNzYxMTY3MDQ2fQ.EzySTg0K11hwQtIYtcBcnNMmX33F6XrVqXsk8WyTWjYcMQxaMnqXebLwBQBCRZha05hZiIZ5xPVCBIt7hZGyymurSfOL72cz69xHUH6u7rwu8vn10UKLHfyKLneKBlmJ\"\n      }\n    },\n    \"outcomes\": [\n      {\n        \"result\": \"error\"\n      }\n    ]\n  },\n  {\n    \"documentation\": \"Success - Expired token triggers successful refresh\",\n    \"configContents\": \"[profile signin]\\nlogin_session = arn:aws:sts::012345678910:assumed-role/Admin/admin\\n\",\n    \"cacheContents\": {\n      \"4b0ba8f99f075c0633e122fd73346ce203a3faf18ea0310eb2d29df1bab2e255.json\": {\n        \"accessToken\": {\n          \"accessKeyId\": \"OLDEXPIREDKEY\",\n          \"secretAccessKey\": \"oldExpiredSecretKey\",\n          \"sessionToken\": \"oldExpiredSessionToken\",\n          \"accountId\": \"012345678901\",\n          \"expiresAt\": \"2020-01-01T00:00:00Z\"\n        },\n        \"clientId\": \"arn:aws:signin:::devtools/same-device\",\n        \"refreshToken\": \"valid_refresh_token\",\n        \"idToken\": \"eyJraWQiOiI1MzYxMjY2ZS1mNjI5LTQ0ZGQtOTA1My1jYzJkNTM1OTJiOTIiLCJ0eXAiOiJKV1QiLCJhbGciOiJFUzM4NCJ9.eyJzdWIiOiJhcm46YXdzOnN0czo6NzIxNzgxNjAzNzU1OmFzc3VtZWQtcm9sZVwvQWRtaW5cL3Nob3ZsaWEtSXNlbmdhcmQiLCJhdWQiOiJhcm46YXdzOnNpZ25pbjo6OmNsaVwvc2FtZS1kZXZpY2UiLCJpc3MiOiJodHRwczpcL1wvc2lnbmluLmF3cy5hbWF6b24uY29tXC9zaWduaW4iLCJzZXNzaW9uX2FybiI6ImFybjphd3M6c3RzOjo3MjE3ODE2MDM3NTU6YXNzdW1lZC1yb2xlXC9BZG1pblwvc2hvdmxpYS1Jc2VuZ2FyZCIsImV4cCI6MTc2MTE2Nzk0NiwiaWF0IjoxNzYxMTY3MDQ2fQ.EzySTg0K11hwQtIYtcBcnNMmX33F6XrVqXsk8WyTWjYcMQxaMnqXebLwBQBCRZha05hZiIZ5xPVCBIt7hZGyymurSfOL72cz69xHUH6u7rwu8vn10UKLHfyKLneKBlmJ\",\n        \"dpopKey\": \"-----BEGIN EC PRIVATE KEY-----\\nMHcCAQEEIPt/u8InPLpQeQLJTvVX+sNDzni8vMDMt3Liu+nMBigfoAoGCCqGSM49\\nAwEHoUQDQgAEILkGG7rNOnxiIJlMgimY1UPP8eDMFP0DAY6WGjngP4bvTAiUCQ/I\\nffut2379uP+OBCm2ovGpBOJRgrl1RspUOQ==\\n-----END EC PRIVATE KEY-----\\n\"\n      }\n    },\n    \"mockApiCalls\": [\n      {\n        \"request\": {\n          \"tokenInput\": {\n            \"clientId\": \"arn:aws:signin:::devtools/same-device\",\n            \"refreshToken\": \"valid_refresh_token\",\n            \"grantType\": \"refresh_token\"\n          }\n        },\n        \"response\": {\n          \"tokenOutput\": {\n            \"accessToken\": {\n              \"accessKeyId\": \"NEWREFRESHEDKEY\",\n              \"secretAccessKey\": \"newRefreshedSecretKey\",\n              \"sessionToken\": \"newRefreshedSessionToken\"\n            },\n            \"refreshToken\": \"new_refresh_token\",\n            \"expiresIn\": 900\n          }\n        }\n      }\n    ],\n    \"outcomes\": [\n      {\n        \"result\": \"credentials\",\n        \"accessKeyId\": \"NEWREFRESHEDKEY\",\n        \"secretAccessKey\": \"newRefreshedSecretKey\",\n        \"sessionToken\": \"newRefreshedSessionToken\",\n        \"accountId\": \"012345678901\",\n        \"expiresAt\": \"2025-11-19T00:15:00Z\"\n      },\n      {\n        \"result\": \"cacheContents\",\n        \"4b0ba8f99f075c0633e122fd73346ce203a3faf18ea0310eb2d29df1bab2e255.json\": {\n          \"accessToken\": {\n            \"accessKeyId\": \"NEWREFRESHEDKEY\",\n            \"secretAccessKey\": \"newRefreshedSecretKey\",\n            \"sessionToken\": \"newRefreshedSessionToken\",\n            \"accountId\": \"012345678901\",\n            \"expiresAt\": \"2025-11-19T00:15:00Z\"\n          },\n          \"clientId\": \"arn:aws:signin:::devtools/same-device\",\n          \"refreshToken\": \"new_refresh_token\",\n          \"idToken\": \"eyJraWQiOiI1MzYxMjY2ZS1mNjI5LTQ0ZGQtOTA1My1jYzJkNTM1OTJiOTIiLCJ0eXAiOiJKV1QiLCJhbGciOiJFUzM4NCJ9.eyJzdWIiOiJhcm46YXdzOnN0czo6NzIxNzgxNjAzNzU1OmFzc3VtZWQtcm9sZVwvQWRtaW5cL3Nob3ZsaWEtSXNlbmdhcmQiLCJhdWQiOiJhcm46YXdzOnNpZ25pbjo6OmNsaVwvc2FtZS1kZXZpY2UiLCJpc3MiOiJodHRwczpcL1wvc2lnbmluLmF3cy5hbWF6b24uY29tXC9zaWduaW4iLCJzZXNzaW9uX2FybiI6ImFybjphd3M6c3RzOjo3MjE3ODE2MDM3NTU6YXNzdW1lZC1yb2xlXC9BZG1pblwvc2hvdmxpYS1Jc2VuZ2FyZCIsImV4cCI6MTc2MTE2Nzk0NiwiaWF0IjoxNzYxMTY3MDQ2fQ.EzySTg0K11hwQtIYtcBcnNMmX33F6XrVqXsk8WyTWjYcMQxaMnqXebLwBQBCRZha05hZiIZ5xPVCBIt7hZGyymurSfOL72cz69xHUH6u7rwu8vn10UKLHfyKLneKBlmJ\",\n          \"dpopKey\": \"-----BEGIN EC PRIVATE KEY-----\\nMHcCAQEEIPt/u8InPLpQeQLJTvVX+sNDzni8vMDMt3Liu+nMBigfoAoGCCqGSM49\\nAwEHoUQDQgAEILkGG7rNOnxiIJlMgimY1UPP8eDMFP0DAY6WGjngP4bvTAiUCQ/I\\nffut2379uP+OBCm2ovGpBOJRgrl1RspUOQ==\\n-----END EC PRIVATE KEY-----\\n\"\n        }\n      }\n    ]\n  },\n  {\n    \"documentation\": \"Failure - Expired token triggers failed refresh\",\n    \"configContents\": \"[profile signin]\\nlogin_session = arn:aws:sts::012345678910:assumed-role/Admin/admin\\n\",\n    \"cacheContents\": {\n      \"4b0ba8f99f075c0633e122fd73346ce203a3faf18ea0310eb2d29df1bab2e255.json\": {\n        \"accessToken\": {\n          \"accessKeyId\": \"OLDEXPIREDKEY\",\n          \"secretAccessKey\": \"oldExpiredSecretKey\",\n          \"sessionToken\": \"oldExpiredSessionToken\",\n          \"accountId\": \"012345678901\",\n          \"expiresAt\": \"2020-01-01T00:00:00Z\"\n        },\n        \"clientId\": \"arn:aws:signin:::devtools/same-device\",\n        \"refreshToken\": \"expired_refresh_token\",\n        \"idToken\": \"eyJraWQiOiI1MzYxMjY2ZS1mNjI5LTQ0ZGQtOTA1My1jYzJkNTM1OTJiOTIiLCJ0eXAiOiJKV1QiLCJhbGciOiJFUzM4NCJ9.eyJzdWIiOiJhcm46YXdzOnN0czo6NzIxNzgxNjAzNzU1OmFzc3VtZWQtcm9sZVwvQWRtaW5cL3Nob3ZsaWEtSXNlbmdhcmQiLCJhdWQiOiJhcm46YXdzOnNpZ25pbjo6OmNsaVwvc2FtZS1kZXZpY2UiLCJpc3MiOiJodHRwczpcL1wvc2lnbmluLmF3cy5hbWF6b24uY29tXC9zaWduaW4iLCJzZXNzaW9uX2FybiI6ImFybjphd3M6c3RzOjo3MjE3ODE2MDM3NTU6YXNzdW1lZC1yb2xlXC9BZG1pblwvc2hvdmxpYS1Jc2VuZ2FyZCIsImV4cCI6MTc2MTE2Nzk0NiwiaWF0IjoxNzYxMTY3MDQ2fQ.EzySTg0K11hwQtIYtcBcnNMmX33F6XrVqXsk8WyTWjYcMQxaMnqXebLwBQBCRZha05hZiIZ5xPVCBIt7hZGyymurSfOL72cz69xHUH6u7rwu8vn10UKLHfyKLneKBlmJ\",\n        \"dpopKey\": \"-----BEGIN EC PRIVATE KEY-----\\nMHcCAQEEIPt/u8InPLpQeQLJTvVX+sNDzni8vMDMt3Liu+nMBigfoAoGCCqGSM49\\nAwEHoUQDQgAEILkGG7rNOnxiIJlMgimY1UPP8eDMFP0DAY6WGjngP4bvTAiUCQ/I\\nffut2379uP+OBCm2ovGpBOJRgrl1RspUOQ==\\n-----END EC PRIVATE KEY-----\\n\"\n      }\n    },\n    \"mockApiCalls\": [\n      {\n        \"request\": {\n          \"tokenInput\": {\n            \"clientId\": \"arn:aws:signin:::devtools/same-device\",\n            \"refreshToken\": \"expired_refresh_token\",\n            \"grantType\": \"refresh_token\"\n          }\n        },\n        \"responseCode\": 400\n      }\n    ],\n    \"outcomes\": [\n      {\n        \"result\": \"error\"\n      }\n    ]\n  }\n]"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/assume_role_override_global_env_url/env.json",
    "content": "{\n  \"HOME\": \"/home\",\n  \"AWS_ENDPOINT_URL\": \"http://aws.global-env-override\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/assume_role_override_global_env_url/fs/home/.aws/config",
    "content": "[default]\nregion = us-east-1\nrole_arn = arn:aws:iam::123456789:role/integration-test\nsource_profile = base\n\n[profile base]\nregion = us-east-1\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/assume_role_override_global_env_url/fs/home/.aws/credentials",
    "content": "[base]\naws_access_key_id = AKIAFAKE\naws_secret_access_key = FAKE\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/assume_role_override_global_env_url/http-traffic.json",
    "content": "{\n  \"events\": [\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Request\": {\n          \"request\": {\n            \"uri\": \"http://aws.global-env-override\",\n            \"headers\": {\n              \"content-type\": [\n                \"application/x-www-form-urlencoded\"\n              ],\n              \"authorization\": [\n                \"AWS4-HMAC-SHA256 Credential=AKIAFAKE/20210810/us-east-1/sts/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-date;x-amz-user-agent, Signature=cd5cb2aa1d20717ca17692bcbda711797ae9eb8bb1130690b021b3952b7ae56e\"\n              ],\n              \"user-agent\": [\n                \"aws-sdk-rust/0.1.0 os/macos lang/rust/1.55.0-nightly\"\n              ],\n              \"content-length\": [\n                \"146\"\n              ],\n              \"x-amz-date\": [\n                \"20210810T003833Z\"\n              ],\n              \"host\": [\n                \"aws.global-env-override\"\n              ],\n              \"x-amz-user-agent\": [\n                \"aws-sdk-rust/0.1.0 api/sts/0.0.14-alpha os/macos lang/rust/1.55.0-nightly\"\n              ]\n            },\n            \"method\": \"POST\"\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"Action=AssumeRole&Version=2011-06-15&RoleArn=arn%3Aaws%3Aiam%3A%3A123456789%3Arole%2Fintegration-test&RoleSessionName=assume-role-provider-session\"\n          },\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Response\": {\n          \"response\": {\n            \"Ok\": {\n              \"status\": 200,\n              \"version\": \"HTTP/1.1\",\n              \"headers\": {\n                \"date\": [\n                  \"Thu, 05 Aug 2021 18:58:02 GMT\"\n                ],\n                \"content-length\": [\n                  \"1491\"\n                ],\n                \"content-type\": [\n                  \"text/xml\"\n                ],\n                \"x-amzn-requestid\": [\n                  \"c2e971c2-702d-4124-9b1f-1670febbea18\"\n                ]\n              }\n            }\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"<AssumeRoleResponse xmlns=\\\"https://sts.amazonaws.com/doc/2011-06-15/\\\">\\n  <AssumeRoleResult>\\n    <AssumedRoleUser>\\n      <AssumedRoleId>AROARABCDEFGHIJKLMNOP:assume-role-provider-session</AssumedRoleId>\\n      <Arn>arn:aws:sts::123456789012:assumed-role/integration-test/assume-role-provider-session</Arn>\\n    </AssumedRoleUser>\\n    <Credentials>\\n      <AccessKeyId>ASIARTESTID</AccessKeyId>\\n      <SecretAccessKey>TESTSECRETKEY</SecretAccessKey>\\n      <SessionToken>TESTSESSIONTOKEN</SessionToken>\\n      <Expiration>2021-08-05T19:58:02Z</Expiration>\\n    </Credentials>\\n  </AssumeRoleResult>\\n  <ResponseMetadata>\\n    <RequestId>c2e971c2-702d-4124-9b1f-1670febbea18</RequestId>\\n  </ResponseMetadata>\\n</AssumeRoleResponse>\\n\"\n          },\n          \"direction\": \"Response\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Response\"\n        }\n      }\n    }\n  ],\n  \"docs\": \"standard request / response with STS\",\n  \"version\": \"V0\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/assume_role_override_global_env_url/test-case.json",
    "content": "{\n  \"name\": \"assume-role-override-global-env-url\",\n  \"docs\": \"override AWS_ENDPOINT_URL via environment\",\n  \"result\": {\n    \"Ok\": {\n      \"access_key_id\": \"ASIARTESTID\",\n      \"secret_access_key\": \"TESTSECRETKEY\",\n      \"session_token\": \"TESTSESSIONTOKEN\",\n      \"account_id\": \"123456789012\",\n      \"expiry\": 1628193482\n    }\n  }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/assume_role_override_global_profile_url/env.json",
    "content": "{\n  \"HOME\": \"/home\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/assume_role_override_global_profile_url/fs/home/.aws/config",
    "content": "[default]\nregion = us-east-1\nrole_arn = arn:aws:iam::123456789:role/integration-test\nsource_profile = base\nendpoint_url = http://aws.global-profile-override\n\n[profile base]\nregion = us-east-1\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/assume_role_override_global_profile_url/fs/home/.aws/credentials",
    "content": "[base]\naws_access_key_id = AKIAFAKE\naws_secret_access_key = FAKE\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/assume_role_override_global_profile_url/http-traffic.json",
    "content": "{\n  \"events\": [\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Request\": {\n          \"request\": {\n            \"uri\": \"http://aws.global-profile-override\",\n            \"headers\": {\n              \"content-type\": [\n                \"application/x-www-form-urlencoded\"\n              ],\n              \"authorization\": [\n                \"AWS4-HMAC-SHA256 Credential=AKIAFAKE/20210810/us-east-1/sts/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-date;x-amz-user-agent, Signature=cd5cb2aa1d20717ca17692bcbda711797ae9eb8bb1130690b021b3952b7ae56e\"\n              ],\n              \"user-agent\": [\n                \"aws-sdk-rust/0.1.0 os/macos lang/rust/1.55.0-nightly\"\n              ],\n              \"content-length\": [\n                \"146\"\n              ],\n              \"x-amz-date\": [\n                \"20210810T003833Z\"\n              ],\n              \"host\": [\n                \"aws.global-profile-override\"\n              ],\n              \"x-amz-user-agent\": [\n                \"aws-sdk-rust/0.1.0 api/sts/0.0.14-alpha os/macos lang/rust/1.55.0-nightly\"\n              ]\n            },\n            \"method\": \"POST\"\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"Action=AssumeRole&Version=2011-06-15&RoleArn=arn%3Aaws%3Aiam%3A%3A123456789%3Arole%2Fintegration-test&RoleSessionName=assume-role-provider-session\"\n          },\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Response\": {\n          \"response\": {\n            \"Ok\": {\n              \"status\": 200,\n              \"version\": \"HTTP/1.1\",\n              \"headers\": {\n                \"date\": [\n                  \"Thu, 05 Aug 2021 18:58:02 GMT\"\n                ],\n                \"content-length\": [\n                  \"1491\"\n                ],\n                \"content-type\": [\n                  \"text/xml\"\n                ],\n                \"x-amzn-requestid\": [\n                  \"c2e971c2-702d-4124-9b1f-1670febbea18\"\n                ]\n              }\n            }\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"<AssumeRoleResponse xmlns=\\\"https://sts.amazonaws.com/doc/2011-06-15/\\\">\\n  <AssumeRoleResult>\\n    <AssumedRoleUser>\\n      <AssumedRoleId>AROARABCDEFGHIJKLMNOP:assume-role-provider-session</AssumedRoleId>\\n      <Arn>arn:aws:sts::123456789012:assumed-role/integration-test/assume-role-provider-session</Arn>\\n    </AssumedRoleUser>\\n    <Credentials>\\n      <AccessKeyId>ASIARTESTID</AccessKeyId>\\n      <SecretAccessKey>TESTSECRETKEY</SecretAccessKey>\\n      <SessionToken>TESTSESSIONTOKEN</SessionToken>\\n      <Expiration>2021-08-05T19:58:02Z</Expiration>\\n    </Credentials>\\n  </AssumeRoleResult>\\n  <ResponseMetadata>\\n    <RequestId>c2e971c2-702d-4124-9b1f-1670febbea18</RequestId>\\n  </ResponseMetadata>\\n</AssumeRoleResponse>\\n\"\n          },\n          \"direction\": \"Response\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Response\"\n        }\n      }\n    }\n  ],\n  \"docs\": \"standard request / response with STS\",\n  \"version\": \"V0\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/assume_role_override_global_profile_url/test-case.json",
    "content": "{\n  \"name\": \"assume-role-override-global-profile-url\",\n  \"docs\": \"override endpoint_url via profile\",\n  \"result\": {\n    \"Ok\": {\n      \"access_key_id\": \"ASIARTESTID\",\n      \"secret_access_key\": \"TESTSECRETKEY\",\n      \"session_token\": \"TESTSESSIONTOKEN\",\n      \"account_id\": \"123456789012\",\n      \"expiry\": 1628193482\n    }\n  }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/assume_role_override_service_env_url/env.json",
    "content": "{\n  \"HOME\": \"/home\",\n  \"AWS_ENDPOINT_URL_STS\": \"http://aws.sts-env-override\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/assume_role_override_service_env_url/fs/home/.aws/config",
    "content": "[default]\nregion = us-east-1\nrole_arn = arn:aws:iam::123456789:role/integration-test\nsource_profile = base\n\n[profile base]\nregion = us-east-1\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/assume_role_override_service_env_url/fs/home/.aws/credentials",
    "content": "[base]\naws_access_key_id = AKIAFAKE\naws_secret_access_key = FAKE\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/assume_role_override_service_env_url/http-traffic.json",
    "content": "{\n  \"events\": [\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Request\": {\n          \"request\": {\n            \"uri\": \"http://aws.sts-env-override\",\n            \"headers\": {\n              \"content-type\": [\n                \"application/x-www-form-urlencoded\"\n              ],\n              \"authorization\": [\n                \"AWS4-HMAC-SHA256 Credential=AKIAFAKE/20210810/us-east-1/sts/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-date;x-amz-user-agent, Signature=cd5cb2aa1d20717ca17692bcbda711797ae9eb8bb1130690b021b3952b7ae56e\"\n              ],\n              \"user-agent\": [\n                \"aws-sdk-rust/0.1.0 os/macos lang/rust/1.55.0-nightly\"\n              ],\n              \"content-length\": [\n                \"146\"\n              ],\n              \"x-amz-date\": [\n                \"20210810T003833Z\"\n              ],\n              \"host\": [\n                \"aws.sts-env-override\"\n              ],\n              \"x-amz-user-agent\": [\n                \"aws-sdk-rust/0.1.0 api/sts/0.0.14-alpha os/macos lang/rust/1.55.0-nightly\"\n              ]\n            },\n            \"method\": \"POST\"\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"Action=AssumeRole&Version=2011-06-15&RoleArn=arn%3Aaws%3Aiam%3A%3A123456789%3Arole%2Fintegration-test&RoleSessionName=assume-role-provider-session\"\n          },\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Response\": {\n          \"response\": {\n            \"Ok\": {\n              \"status\": 200,\n              \"version\": \"HTTP/1.1\",\n              \"headers\": {\n                \"date\": [\n                  \"Thu, 05 Aug 2021 18:58:02 GMT\"\n                ],\n                \"content-length\": [\n                  \"1491\"\n                ],\n                \"content-type\": [\n                  \"text/xml\"\n                ],\n                \"x-amzn-requestid\": [\n                  \"c2e971c2-702d-4124-9b1f-1670febbea18\"\n                ]\n              }\n            }\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"<AssumeRoleResponse xmlns=\\\"https://sts.amazonaws.com/doc/2011-06-15/\\\">\\n  <AssumeRoleResult>\\n    <AssumedRoleUser>\\n      <AssumedRoleId>AROARABCDEFGHIJKLMNOP:assume-role-provider-session</AssumedRoleId>\\n      <Arn>arn:aws:sts::123456789012:assumed-role/integration-test/assume-role-provider-session</Arn>\\n    </AssumedRoleUser>\\n    <Credentials>\\n      <AccessKeyId>ASIARTESTID</AccessKeyId>\\n      <SecretAccessKey>TESTSECRETKEY</SecretAccessKey>\\n      <SessionToken>TESTSESSIONTOKEN</SessionToken>\\n      <Expiration>2021-08-05T19:58:02Z</Expiration>\\n    </Credentials>\\n  </AssumeRoleResult>\\n  <ResponseMetadata>\\n    <RequestId>c2e971c2-702d-4124-9b1f-1670febbea18</RequestId>\\n  </ResponseMetadata>\\n</AssumeRoleResponse>\\n\"\n          },\n          \"direction\": \"Response\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Response\"\n        }\n      }\n    }\n  ],\n  \"docs\": \"standard request / response with STS\",\n  \"version\": \"V0\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/assume_role_override_service_env_url/test-case.json",
    "content": "{\n  \"name\": \"assume-role-override-service-env-url\",\n  \"docs\": \"override AWS_ENDPOINT_URL_STS via environment\",\n  \"result\": {\n    \"Ok\": {\n      \"access_key_id\": \"ASIARTESTID\",\n      \"secret_access_key\": \"TESTSECRETKEY\",\n      \"session_token\": \"TESTSESSIONTOKEN\",\n      \"account_id\": \"123456789012\",\n      \"expiry\": 1628193482\n    }\n  }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/assume_role_override_service_profile_url/env.json",
    "content": "{\n  \"HOME\": \"/home\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/assume_role_override_service_profile_url/fs/home/.aws/config",
    "content": "[default]\nregion = us-east-1\nrole_arn = arn:aws:iam::123456789:role/integration-test\nsource_profile = base\nservices = test-urls\n\n[services test-urls]\nsts =\n    endpoint_url = http://aws.service-profile-override\n\n[profile base]\nregion = us-east-1\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/assume_role_override_service_profile_url/fs/home/.aws/credentials",
    "content": "[base]\naws_access_key_id = AKIAFAKE\naws_secret_access_key = FAKE\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/assume_role_override_service_profile_url/http-traffic.json",
    "content": "{\n  \"events\": [\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Request\": {\n          \"request\": {\n            \"uri\": \"http://aws.service-profile-override\",\n            \"headers\": {\n              \"content-type\": [\n                \"application/x-www-form-urlencoded\"\n              ],\n              \"authorization\": [\n                \"AWS4-HMAC-SHA256 Credential=AKIAFAKE/20210810/us-east-1/sts/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-date;x-amz-user-agent, Signature=cd5cb2aa1d20717ca17692bcbda711797ae9eb8bb1130690b021b3952b7ae56e\"\n              ],\n              \"user-agent\": [\n                \"aws-sdk-rust/0.1.0 os/macos lang/rust/1.55.0-nightly\"\n              ],\n              \"content-length\": [\n                \"146\"\n              ],\n              \"x-amz-date\": [\n                \"20210810T003833Z\"\n              ],\n              \"host\": [\n                \"http://aws.service-profile-override\"\n              ],\n              \"x-amz-user-agent\": [\n                \"aws-sdk-rust/0.1.0 api/sts/0.0.14-alpha os/macos lang/rust/1.55.0-nightly\"\n              ]\n            },\n            \"method\": \"POST\"\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"Action=AssumeRole&Version=2011-06-15&RoleArn=arn%3Aaws%3Aiam%3A%3A123456789%3Arole%2Fintegration-test&RoleSessionName=assume-role-provider-session\"\n          },\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Response\": {\n          \"response\": {\n            \"Ok\": {\n              \"status\": 200,\n              \"version\": \"HTTP/1.1\",\n              \"headers\": {\n                \"date\": [\n                  \"Thu, 05 Aug 2021 18:58:02 GMT\"\n                ],\n                \"content-length\": [\n                  \"1491\"\n                ],\n                \"content-type\": [\n                  \"text/xml\"\n                ],\n                \"x-amzn-requestid\": [\n                  \"c2e971c2-702d-4124-9b1f-1670febbea18\"\n                ]\n              }\n            }\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"<AssumeRoleResponse xmlns=\\\"https://sts.amazonaws.com/doc/2011-06-15/\\\">\\n  <AssumeRoleResult>\\n    <AssumedRoleUser>\\n      <AssumedRoleId>AROARABCDEFGHIJKLMNOP:assume-role-provider-session</AssumedRoleId>\\n      <Arn>arn:aws:sts::123456789012:assumed-role/integration-test/assume-role-provider-session</Arn>\\n    </AssumedRoleUser>\\n    <Credentials>\\n      <AccessKeyId>ASIARTESTID</AccessKeyId>\\n      <SecretAccessKey>TESTSECRETKEY</SecretAccessKey>\\n      <SessionToken>TESTSESSIONTOKEN</SessionToken>\\n      <Expiration>2021-08-05T19:58:02Z</Expiration>\\n    </Credentials>\\n  </AssumeRoleResult>\\n  <ResponseMetadata>\\n    <RequestId>c2e971c2-702d-4124-9b1f-1670febbea18</RequestId>\\n  </ResponseMetadata>\\n</AssumeRoleResponse>\\n\"\n          },\n          \"direction\": \"Response\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Response\"\n        }\n      }\n    }\n  ],\n  \"docs\": \"standard request / response with STS\",\n  \"version\": \"V0\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/assume_role_override_service_profile_url/test-case.json",
    "content": "{\n  \"name\": \"assume-role-override-service-profile-url\",\n  \"docs\": \"override endpoint_url via services section\",\n  \"result\": {\n    \"Ok\": {\n      \"access_key_id\": \"ASIARTESTID\",\n      \"secret_access_key\": \"TESTSECRETKEY\",\n      \"session_token\": \"TESTSESSIONTOKEN\",\n      \"account_id\": \"123456789012\",\n      \"expiry\": 1628193482\n    }\n  }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/credential_process/env.json",
    "content": "{\n  \"HOME\": \"/home\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/credential_process/fs/home/.aws/config",
    "content": "[default]\nsource_profile = base\n# these fake credentials are base64 encoded to prevent triggering the unit test that scans logs for secrets\ncredential_process = echo eyAiVmVyc2lvbiI6IDEsICJBY2Nlc3NLZXlJZCI6ICJBU0lBUlRFU1RJRCIsICJTZWNyZXRBY2Nlc3NLZXkiOiAiVEVTVFNFQ1JFVEtFWSIsICJTZXNzaW9uVG9rZW4iOiAiVEVTVFNFU1NJT05UT0tFTiIsICJBY2NvdW50SWQiOiAiMTIzNDU2Nzg5MDAyIiwgIkV4cGlyYXRpb24iOiAiMjAyMi0wNS0wMlQxODozNjowMCswMDowMCIgfQo= | base64 --decode\n# this account ID should be shadowed by the process output above\naws_account_id = 123456789001\n\n[profile base]\nregion = us-east-1\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/credential_process/fs/home/.aws/credentials",
    "content": "[base]\naws_access_key_id = AKIAFAKE\naws_secret_access_key = FAKE\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/credential_process/http-traffic.json",
    "content": "{\n  \"docs\": \"test case using credential_process\",\n  \"version\": \"V0\",\n  \"events\": []\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/credential_process/test-case.json",
    "content": "{\n  \"name\": \"credential_process\",\n  \"docs\": \"credential_process loads credentials from external process\",\n  \"result\": {\n    \"Ok\": {\n      \"access_key_id\": \"ASIARTESTID\",\n      \"secret_access_key\": \"TESTSECRETKEY\",\n      \"session_token\": \"TESTSESSIONTOKEN\",\n      \"account_id\": \"123456789002\",\n      \"expiry\": 1651516560\n    }\n  }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/credential_process_account_id_fallback/env.json",
    "content": "{\n  \"HOME\": \"/home\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/credential_process_account_id_fallback/fs/home/.aws/config",
    "content": "[default]\nsource_profile = base\n# this base64-encoded credentials, when decoded, do not contain account_id\ncredential_process = echo eyAiVmVyc2lvbiI6IDEsICJBY2Nlc3NLZXlJZCI6ICJBU0lBUlRFU1RJRCIsICJTZWNyZXRBY2Nlc3NLZXkiOiAiVEVTVFNFQ1JFVEtFWSIsICJTZXNzaW9uVG9rZW4iOiAiVEVTVFNFU1NJT05UT0tFTiIsICJFeHBpcmF0aW9uIjogIjIwMjItMDUtMDJUMTg6MzY6MDArMDA6MDAiIH0K | base64 --decode\n# this account ID should be used as fallback\naws_account_id = 123456789001\n\n[profile base]\nregion = us-east-1\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/credential_process_account_id_fallback/fs/home/.aws/credentials",
    "content": "[base]\naws_access_key_id = AKIAFAKE\naws_secret_access_key = FAKE\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/credential_process_account_id_fallback/http-traffic.json",
    "content": "{\n  \"docs\": \"test case uses credential process, no network requests\",\n  \"version\": \"V0\",\n  \"events\": []\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/credential_process_account_id_fallback/test-case.json",
    "content": "{\n  \"name\": \"credential-process-account-id-fallback\",\n  \"docs\": \"credential process loads credentials that lack the account ID, which is populated via config file\",\n  \"result\": {\n    \"Ok\": {\n      \"access_key_id\": \"ASIARTESTID\",\n      \"secret_access_key\": \"TESTSECRETKEY\",\n      \"session_token\": \"TESTSESSIONTOKEN\",\n      \"account_id\": \"123456789001\",\n      \"expiry\": 1651516560\n    }\n  }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/credential_process_failure/env.json",
    "content": "{\n  \"HOME\": \"/home\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/credential_process_failure/fs/home/.aws/config",
    "content": "[default]\nsource_profile = base\ncredential_process = exit 1\n\n[profile base]\nregion = us-east-1\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/credential_process_failure/fs/home/.aws/credentials",
    "content": "[base]\naws_access_key_id = AKIAFAKE\naws_secret_access_key = FAKE\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/credential_process_failure/http-traffic.json",
    "content": "{\n  \"docs\": \"test case using credential_process\",\n  \"version\": \"V0\",\n  \"events\": []\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/credential_process_failure/test-case.json",
    "content": "{\n  \"name\": \"credential_process_failure\",\n  \"docs\": \"credential_process handles the external process exiting with a non-zero exit code\",\n  \"result\": {\n    \"ErrorContains\": \"an error occurred while loading credentials: Error retrieving credentials: external process exited with code exit status: 1\"\n  }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/credential_process_invalid/env.json",
    "content": "{\n  \"HOME\": \"/home\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/credential_process_invalid/fs/home/.aws/config",
    "content": "[default]\nsource_profile = base\ncredential_process = echo 'invalid json'\n\n[profile base]\nregion = us-east-1\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/credential_process_invalid/fs/home/.aws/credentials",
    "content": "[base]\naws_access_key_id = AKIAFAKE\naws_secret_access_key = FAKE\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/credential_process_invalid/http-traffic.json",
    "content": "{\n  \"docs\": \"test case using credential_process\",\n  \"version\": \"V0\",\n  \"events\": []\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/credential_process_invalid/test-case.json",
    "content": "{\n  \"name\": \"credential_process_invalid\",\n  \"docs\": \"credential_process handles the external process returning invalid json\",\n  \"result\": {\n    \"ErrorContains\": \"Error retrieving credentials from external process, could not parse response: invalid JSON in response\"\n  }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/e2e_assume_role/env.json",
    "content": "{\n  \"HOME\": \"/home\",\n  \"AWS_ACCOUNT_ID\": \"123456789002\",\n  \"AWS_ACCESS_KEY_ID\": \"foo\",\n  \"AWS_SECRET_ACCESS_KEY\": \"bar\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/e2e_assume_role/fs/home/.aws/config",
    "content": "[default]\nregion = us-east-1\nrole_arn = arn:aws:iam::123456789:role/integration-test\nsource_profile = base\n\n[profile base]\nregion = us-east-1\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/e2e_assume_role/fs/home/.aws/credentials",
    "content": "[base]\naws_access_key_id = AKIAFAKE\naws_secret_access_key = FAKE\naws_account_id = 123456789001\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/e2e_assume_role/http-traffic.json",
    "content": "{\n  \"events\": [\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Request\": {\n          \"request\": {\n            \"uri\": \"https://sts.us-east-1.amazonaws.com/\",\n            \"headers\": {\n              \"content-type\": [\n                \"application/x-www-form-urlencoded\"\n              ],\n              \"authorization\": [\n                \"AWS4-HMAC-SHA256 Credential=AKIAFAKE/20210810/us-east-1/sts/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-date;x-amz-user-agent, Signature=cd5cb2aa1d20717ca17692bcbda711797ae9eb8bb1130690b021b3952b7ae56e\"\n              ],\n              \"user-agent\": [\n                \"aws-sdk-rust/0.1.0 os/macos lang/rust/1.55.0-nightly\"\n              ],\n              \"content-length\": [\n                \"146\"\n              ],\n              \"x-amz-date\": [\n                \"20210810T003833Z\"\n              ],\n              \"host\": [\n                \"sts.us-east-1.amazonaws.com\"\n              ],\n              \"x-amz-user-agent\": [\n                \"aws-sdk-rust/0.1.0 api/sts/0.0.14-alpha os/macos lang/rust/1.55.0-nightly\"\n              ]\n            },\n            \"method\": \"POST\"\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"Action=AssumeRole&Version=2011-06-15&RoleArn=arn%3Aaws%3Aiam%3A%3A123456789%3Arole%2Fintegration-test&RoleSessionName=assume-role-provider-session\"\n          },\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Response\": {\n          \"response\": {\n            \"Ok\": {\n              \"status\": 200,\n              \"version\": \"HTTP/1.1\",\n              \"headers\": {\n                \"date\": [\n                  \"Thu, 05 Aug 2021 18:58:02 GMT\"\n                ],\n                \"content-length\": [\n                  \"1491\"\n                ],\n                \"content-type\": [\n                  \"text/xml\"\n                ],\n                \"x-amzn-requestid\": [\n                  \"c2e971c2-702d-4124-9b1f-1670febbea18\"\n                ]\n              }\n            }\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"<AssumeRoleResponse xmlns=\\\"https://sts.amazonaws.com/doc/2011-06-15/\\\">\\n  <AssumeRoleResult>\\n    <AssumedRoleUser>\\n      <AssumedRoleId>AROARABCDEFGHIJKLMNOP:assume-role-provider-session</AssumedRoleId>\\n      <Arn>arn:aws:sts::123456789012:assumed-role/integration-test/assume-role-provider-session</Arn>\\n    </AssumedRoleUser>\\n    <Credentials>\\n      <AccessKeyId>ASIARTESTID</AccessKeyId>\\n      <SecretAccessKey>TESTSECRETKEY</SecretAccessKey>\\n      <SessionToken>TESTSESSIONTOKEN</SessionToken>\\n      <Expiration>2021-08-05T19:58:02Z</Expiration>\\n    </Credentials>\\n  </AssumeRoleResult>\\n  <ResponseMetadata>\\n    <RequestId>c2e971c2-702d-4124-9b1f-1670febbea18</RequestId>\\n  </ResponseMetadata>\\n</AssumeRoleResponse>\\n\"\n          },\n          \"direction\": \"Response\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Response\"\n        }\n      }\n    }\n  ],\n  \"docs\": \"standard request / response with STS\",\n  \"version\": \"V0\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/e2e_assume_role/test-case.json",
    "content": "{\n  \"name\": \"e2e-assume-role\",\n  \"docs\": \"end to end successful role assumption\",\n  \"result\": {\n    \"Ok\": {\n      \"access_key_id\": \"ASIARTESTID\",\n      \"secret_access_key\": \"TESTSECRETKEY\",\n      \"session_token\": \"TESTSESSIONTOKEN\",\n      \"account_id\": \"123456789012\",\n      \"expiry\": 1628193482\n    }\n  }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/e2e_fips_and_dual_stack_sts/env.json",
    "content": "{\n  \"HOME\": \"/home\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/e2e_fips_and_dual_stack_sts/fs/home/.aws/config",
    "content": "[default]\nregion = us-east-1\nrole_arn = arn:aws:iam::123456789:role/integration-test\nsource_profile = base\nuse_fips_endpoint = true\nuse_dualstack_endpoint = true\n\n[profile base]\nregion = us-east-1\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/e2e_fips_and_dual_stack_sts/fs/home/.aws/credentials",
    "content": "[base]\naws_access_key_id = AKIAFAKE\naws_secret_access_key = FAKE\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/e2e_fips_and_dual_stack_sts/http-traffic.json",
    "content": "{\n  \"events\": [\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Request\": {\n          \"request\": {\n            \"uri\": \"https://sts-fips.us-east-1.api.aws/\",\n            \"headers\": {\n              \"content-type\": [\n                \"application/x-www-form-urlencoded\"\n              ],\n              \"authorization\": [\n                \"AWS4-HMAC-SHA256 Credential=AKIAFAKE/20210810/us-east-1/sts/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-date;x-amz-user-agent, Signature=cd5cb2aa1d20717ca17692bcbda711797ae9eb8bb1130690b021b3952b7ae56e\"\n              ],\n              \"user-agent\": [\n                \"aws-sdk-rust/0.1.0 os/macos lang/rust/1.55.0-nightly\"\n              ],\n              \"content-length\": [\n                \"146\"\n              ],\n              \"x-amz-date\": [\n                \"20210810T003833Z\"\n              ],\n              \"host\": [\n                \"sts-fips.us-east-1.api.aws\"\n              ],\n              \"x-amz-user-agent\": [\n                \"aws-sdk-rust/0.1.0 api/sts/0.0.14-alpha os/macos lang/rust/1.55.0-nightly\"\n              ]\n            },\n            \"method\": \"POST\"\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"Action=AssumeRole&Version=2011-06-15&RoleArn=arn%3Aaws%3Aiam%3A%3A123456789%3Arole%2Fintegration-test&RoleSessionName=assume-role-provider-session\"\n          },\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Response\": {\n          \"response\": {\n            \"Ok\": {\n              \"status\": 200,\n              \"version\": \"HTTP/1.1\",\n              \"headers\": {\n                \"date\": [\n                  \"Thu, 05 Aug 2021 18:58:02 GMT\"\n                ],\n                \"content-length\": [\n                  \"1491\"\n                ],\n                \"content-type\": [\n                  \"text/xml\"\n                ],\n                \"x-amzn-requestid\": [\n                  \"c2e971c2-702d-4124-9b1f-1670febbea18\"\n                ]\n              }\n            }\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"<AssumeRoleResponse xmlns=\\\"https://sts.amazonaws.com/doc/2011-06-15/\\\">\\n  <AssumeRoleResult>\\n    <AssumedRoleUser>\\n      <AssumedRoleId>AROARABCDEFGHIJKLMNOP:assume-role-provider-session</AssumedRoleId>\\n      <Arn>arn:aws:sts::123456789012:assumed-role/integration-test/assume-role-provider-session</Arn>\\n    </AssumedRoleUser>\\n    <Credentials>\\n      <AccessKeyId>ASIARTESTID</AccessKeyId>\\n      <SecretAccessKey>TESTSECRETKEY</SecretAccessKey>\\n      <SessionToken>TESTSESSIONTOKEN</SessionToken>\\n      <Expiration>2021-08-05T19:58:02Z</Expiration>\\n    </Credentials>\\n  </AssumeRoleResult>\\n  <ResponseMetadata>\\n    <RequestId>c2e971c2-702d-4124-9b1f-1670febbea18</RequestId>\\n  </ResponseMetadata>\\n</AssumeRoleResponse>\\n\"\n          },\n          \"direction\": \"Response\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Response\"\n        }\n      }\n    }\n  ],\n  \"docs\": \"standard request / response with STS\",\n  \"version\": \"V0\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/e2e_fips_and_dual_stack_sts/test-case.json",
    "content": "{\n  \"name\": \"e2e_fips_and_dual_stack_sts\",\n  \"docs\": \"end to end STS role assumption test with FIPS and dual stack enabled\",\n  \"result\": {\n    \"Ok\": {\n      \"access_key_id\": \"ASIARTESTID\",\n      \"secret_access_key\": \"TESTSECRETKEY\",\n      \"session_token\": \"TESTSESSIONTOKEN\",\n      \"account_id\": \"123456789012\",\n      \"expiry\": 1628193482\n    }\n  }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/empty_config/env.json",
    "content": "{\n  \"HOME\": \"/home\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/empty_config/http-traffic.json",
    "content": "{\n  \"events\": [],\n  \"docs\": \"test case with an empty config file, leading to no network requests\",\n  \"version\": \"V0\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/empty_config/test-case.json",
    "content": "{\n  \"name\": \"empty-config\",\n  \"docs\": \"no config was defined\",\n  \"result\": {\n    \"ErrorContains\": \"the credential provider was not enabled\"\n  }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/invalid_config/env.json",
    "content": "{\n  \"HOME\": \"/home\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/invalid_config/fs/home/.aws/config",
    "content": "[default]\n= us-east-1\n\n[profile base]\nregion = us-east-1\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/invalid_config/http-traffic.json",
    "content": "{\n  \"events\": [],\n  \"docs\": \"test case with an invalid config file, leading to no network requests\",\n  \"version\": \"V0\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/invalid_config/test-case.json",
    "content": "{\n  \"name\": \"invalid-config\",\n  \"docs\": \"config was invalid\",\n  \"result\": {\n    \"ErrorContains\": \"could not parse profile file\"\n  }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/invalid_sso_credentials_config/env.json",
    "content": "{\n  \"HOME\": \"/home\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/invalid_sso_credentials_config/fs/home/.aws/config",
    "content": "[profile default]\nsso_session = dev\nregion = us-east-1\n\n[sso-session dev]\nsso_region = us-east-1\nsso_start_url = https://d-abc123.awsapps.com/start\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/invalid_sso_credentials_config/http-traffic.json",
    "content": "{\n  \"events\": [],\n  \"docs\": \"test case with an invalid config file, leading to no network requests\",\n  \"version\": \"V0\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/invalid_sso_credentials_config/test-case.json",
    "content": "{\n  \"name\": \"invalid-sso-credentials-config\",\n  \"docs\": \"config was invalid due to missing sso_account_id and sso_role_name\",\n  \"result\": {\n    \"ErrorContains\": \"selected profile will resolve an access token instead of credentials\"\n  }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/region_override/env.json",
    "content": "{\n  \"AWS_REGION\": \"us-east-2\",\n  \"HOME\": \"/home\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/region_override/fs/home/.aws/config",
    "content": "[default]\n# this region is overriden by the environment variable\nregion = us-east-1\nrole_arn = arn:aws:iam::123456789:role/integration-test\nsource_profile = base\n\n[profile base]\nregion = us-east-1\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/region_override/fs/home/.aws/credentials",
    "content": "[base]\naws_access_key_id = AKIAFAKE\naws_secret_access_key = FAKE\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/region_override/http-traffic.json",
    "content": "{\n  \"docs\": \"test case with the region manually overridden\",\n  \"version\": \"V0\",\n  \"events\": [\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Request\": {\n          \"request\": {\n            \"uri\": \"https://sts.us-east-2.amazonaws.com/\",\n            \"headers\": {\n              \"content-type\": [\n                \"application/x-www-form-urlencoded\"\n              ],\n              \"authorization\": [\n                \"AWS4-HMAC-SHA256 Credential=AKIAFAKE/20210810/us-east-1/sts/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-date;x-amz-user-agent, Signature=cd5cb2aa1d20717ca17692bcbda711797ae9eb8bb1130690b021b3952b7ae56e\"\n              ],\n              \"user-agent\": [\n                \"aws-sdk-rust/0.1.0 os/macos lang/rust/1.55.0-nightly\"\n              ],\n              \"content-length\": [\n                \"146\"\n              ],\n              \"x-amz-date\": [\n                \"20210810T003833Z\"\n              ],\n              \"host\": [\n                \"sts.us-east-2.amazonaws.com\"\n              ],\n              \"x-amz-user-agent\": [\n                \"aws-sdk-rust/0.1.0 api/sts/0.0.14-alpha os/macos lang/rust/1.55.0-nightly\"\n              ]\n            },\n            \"method\": \"POST\"\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"Action=AssumeRole&Version=2011-06-15&RoleArn=arn%3Aaws%3Aiam%3A%3A123456789%3Arole%2Fintegration-test&RoleSessionName=assume-role-provider-session\"\n          },\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Response\": {\n          \"response\": {\n            \"Ok\": {\n              \"status\": 200,\n              \"version\": \"HTTP/1.1\",\n              \"headers\": {\n                \"date\": [\n                  \"Thu, 05 Aug 2021 18:58:02 GMT\"\n                ],\n                \"content-length\": [\n                  \"1491\"\n                ],\n                \"content-type\": [\n                  \"text/xml\"\n                ],\n                \"x-amzn-requestid\": [\n                  \"c2e971c2-702d-4124-9b1f-1670febbea18\"\n                ]\n              }\n            }\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"<AssumeRoleResponse xmlns=\\\"https://sts.amazonaws.com/doc/2011-06-15/\\\">\\n  <AssumeRoleResult>\\n    <AssumedRoleUser>\\n      <AssumedRoleId>AROARABCDEFGHIJKLMNOP:assume-role-provider-session</AssumedRoleId>\\n      <Arn>arn:aws:sts::123456789012:assumed-role/integration-test/assume-role-provider-session</Arn>\\n    </AssumedRoleUser>\\n    <Credentials>\\n      <AccessKeyId>ASIARTESTID</AccessKeyId>\\n      <SecretAccessKey>TESTSECRETKEY</SecretAccessKey>\\n      <SessionToken>TESTSESSIONTOKEN</SessionToken>\\n      <Expiration>2021-08-05T19:58:02Z</Expiration>\\n    </Credentials>\\n  </AssumeRoleResult>\\n  <ResponseMetadata>\\n    <RequestId>c2e971c2-702d-4124-9b1f-1670febbea18</RequestId>\\n  </ResponseMetadata>\\n</AssumeRoleResponse>\\n\"\n          },\n          \"direction\": \"Response\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Response\"\n        }\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/region_override/test-case.json",
    "content": "{\n  \"name\": \"region-override\",\n  \"docs\": \"region is overridden externally, overriding the value set in the environment\",\n  \"result\": {\n    \"Ok\": {\n      \"access_key_id\": \"ASIARTESTID\",\n      \"secret_access_key\": \"TESTSECRETKEY\",\n      \"session_token\": \"TESTSESSIONTOKEN\",\n      \"account_id\": \"123456789012\",\n      \"expiry\": 1628193482\n    }\n  }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/retry_on_error/env.json",
    "content": "{\n  \"HOME\": \"/home\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/retry_on_error/fs/home/.aws/config",
    "content": "[default]\nregion = us-east-1\nrole_arn = arn:aws:iam::123456789:role/integration-test\nsource_profile = base\n\n[profile base]\nregion = us-east-1\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/retry_on_error/fs/home/.aws/credentials",
    "content": "[base]\naws_access_key_id = AKIAFAKE\naws_secret_access_key = FAKE\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/retry_on_error/http-traffic.json",
    "content": "{\n  \"docs\": \"Test case where the first request returns a 503 and the second request succeeds\",\n  \"events\": [\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Request\": {\n          \"request\": {\n            \"uri\": \"https://sts.us-east-1.amazonaws.com/\",\n            \"headers\": {\n              \"content-type\": [\n                \"application/x-www-form-urlencoded\"\n              ],\n              \"authorization\": [\n                \"AWS4-HMAC-SHA256 Credential=AKIAFAKE/20210810/us-east-1/sts/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-date;x-amz-user-agent, Signature=cd5cb2aa1d20717ca17692bcbda711797ae9eb8bb1130690b021b3952b7ae56e\"\n              ],\n              \"user-agent\": [\n                \"aws-sdk-rust/0.1.0 os/macos lang/rust/1.55.0-nightly\"\n              ],\n              \"content-length\": [\n                \"146\"\n              ],\n              \"x-amz-date\": [\n                \"20210810T003833Z\"\n              ],\n              \"host\": [\n                \"sts.us-east-1.amazonaws.com\"\n              ],\n              \"x-amz-user-agent\": [\n                \"aws-sdk-rust/0.1.0 api/sts/0.0.14-alpha os/macos lang/rust/1.55.0-nightly\"\n              ]\n            },\n            \"method\": \"POST\"\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"Action=AssumeRole&Version=2011-06-15&RoleArn=arn%3Aaws%3Aiam%3A%3A123456789%3Arole%2Fintegration-test&RoleSessionName=assume-role-provider-session\"\n          },\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Response\": {\n          \"response\": {\n            \"Ok\": {\n              \"status\": 503,\n              \"version\": \"HTTP/1.1\",\n              \"headers\": {\n                \"date\": [\n                  \"Thu, 05 Aug 2021 18:58:02 GMT\"\n                ],\n                \"content-length\": [\n                  \"0\"\n                ],\n                \"content-type\": [\n                  \"text/xml\"\n                ],\n                \"x-amzn-requestid\": [\n                  \"c2e971c2-702d-4124-9b1f-1670febbea18\"\n                ]\n              }\n            }\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Response\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 1,\n      \"action\": {\n        \"Request\": {\n          \"request\": {\n            \"uri\": \"https://sts.us-east-1.amazonaws.com/\",\n            \"headers\": {\n              \"content-type\": [\n                \"application/x-www-form-urlencoded\"\n              ],\n              \"authorization\": [\n                \"AWS4-HMAC-SHA256 Credential=AKIAFAKE/20210810/us-east-1/sts/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-date;x-amz-user-agent, Signature=cd5cb2aa1d20717ca17692bcbda711797ae9eb8bb1130690b021b3952b7ae56e\"\n              ],\n              \"user-agent\": [\n                \"aws-sdk-rust/0.1.0 os/macos lang/rust/1.55.0-nightly\"\n              ],\n              \"content-length\": [\n                \"146\"\n              ],\n              \"x-amz-date\": [\n                \"20210810T003833Z\"\n              ],\n              \"host\": [\n                \"sts.us-east-1.amazonaws.com\"\n              ],\n              \"x-amz-user-agent\": [\n                \"aws-sdk-rust/0.1.0 api/sts/0.0.14-alpha os/macos lang/rust/1.55.0-nightly\"\n              ]\n            },\n            \"method\": \"POST\"\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 1,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"Action=AssumeRole&Version=2011-06-15&RoleArn=arn%3Aaws%3Aiam%3A%3A123456789%3Arole%2Fintegration-test&RoleSessionName=assume-role-provider-session\"\n          },\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 1,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 1,\n      \"action\": {\n        \"Response\": {\n          \"response\": {\n            \"Ok\": {\n              \"status\": 200,\n              \"version\": \"HTTP/1.1\",\n              \"headers\": {\n                \"date\": [\n                  \"Thu, 05 Aug 2021 18:58:02 GMT\"\n                ],\n                \"content-length\": [\n                  \"1491\"\n                ],\n                \"content-type\": [\n                  \"text/xml\"\n                ],\n                \"x-amzn-requestid\": [\n                  \"c2e971c2-702d-4124-9b1f-1670febbea18\"\n                ]\n              }\n            }\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 1,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"<AssumeRoleResponse xmlns=\\\"https://sts.amazonaws.com/doc/2011-06-15/\\\">\\n  <AssumeRoleResult>\\n    <AssumedRoleUser>\\n      <AssumedRoleId>AROARABCDEFGHIJKLMNOP:assume-role-provider-session</AssumedRoleId>\\n      <Arn>arn:aws:sts::123456789012:assumed-role/integration-test/assume-role-provider-session</Arn>\\n    </AssumedRoleUser>\\n    <Credentials>\\n      <AccessKeyId>ASIARTESTID</AccessKeyId>\\n      <SecretAccessKey>TESTSECRETKEY</SecretAccessKey>\\n      <SessionToken>TESTSESSIONTOKEN</SessionToken>\\n      <Expiration>2021-08-05T19:58:02Z</Expiration>\\n    </Credentials>\\n  </AssumeRoleResult>\\n  <ResponseMetadata>\\n    <RequestId>c2e971c2-702d-4124-9b1f-1670febbea18</RequestId>\\n  </ResponseMetadata>\\n</AssumeRoleResponse>\\n\"\n          },\n          \"direction\": \"Response\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 1,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Response\"\n        }\n      }\n    }\n  ],\n  \"version\": \"V0\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/retry_on_error/test-case.json",
    "content": "{\n  \"name\": \"retry-on-error\",\n  \"docs\": \"end to end successful role assumption\",\n  \"result\": {\n    \"Ok\": {\n      \"access_key_id\": \"ASIARTESTID\",\n      \"secret_access_key\": \"TESTSECRETKEY\",\n      \"session_token\": \"TESTSESSIONTOKEN\",\n      \"account_id\": \"123456789012\",\n      \"expiry\": 1628193482\n    }\n  }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/sso_credentials/env.json",
    "content": "{\n  \"HOME\": \"/home\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/sso_credentials/fs/home/.aws/config",
    "content": "[profile default]\nsso_session = dev\nsso_account_id = 012345678901\nsso_role_name = SampleRole\nregion = us-east-1\n\n[sso-session dev]\nsso_region = us-east-1\nsso_start_url = https://d-abc123.awsapps.com/start\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/sso_credentials/fs/home/.aws/credentials",
    "content": ""
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/sso_credentials/fs/home/.aws/sso/cache/34c6fceca75e456f25e7e99531e2425c6c1de443.json",
    "content": "{\n    \"accessToken\": \"secret-access-token\",\n    \"expiresAt\": \"2199-11-14T04:05:45Z\",\n    \"refreshToken\": \"secret-refresh-token\",\n    \"clientId\": \"ABCDEFG323242423121312312312312312\",\n    \"clientSecret\": \"ABCDE123\",\n    \"registrationExpiresAt\": \"2199-03-06T19:53:17Z\",\n    \"region\": \"us-east-1\",\n    \"startUrl\": \"https://d-abc123.awsapps.com/start\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/sso_credentials/http-traffic.json",
    "content": "{\n  \"docs\": \"test case using sso credentials\",\n  \"version\": \"V0\",\n  \"events\": [\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Request\": {\n          \"request\": {\n            \"uri\": \"https://portal.sso.us-east-1.amazonaws.com/federation/credentials?role_name=SampleRole&account_id=012345678901\",\n            \"headers\": {\n              \"x-amz-sso_bearer_token\": [\n                \"secret-access-token\"\n              ],\n              \"host\": [\n                \"portal.sso.us-east-1.amazonaws.com\"\n              ]\n            },\n            \"method\": \"GET\"\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"\"\n          },\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Response\": {\n          \"response\": {\n            \"Ok\": {\n              \"status\": 200,\n              \"version\": \"HTTP/1.1\",\n              \"headers\": {\n                \"date\": [\n                  \"Thu, 05 Aug 2021 18:58:02 GMT\"\n                ],\n                \"content-length\": [\n                  \"1491\"\n                ],\n                \"content-type\": [\n                  \"text/xml\"\n                ],\n                \"x-amzn-requestid\": [\n                  \"c2e971c2-702d-4124-9b1f-1670febbea18\"\n                ]\n              }\n            }\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"{\\\"roleCredentials\\\":{\\\"accessKeyId\\\":\\\"ASIARTESTID\\\",\\\"secretAccessKey\\\":\\\"TESTSECRETKEY\\\",\\\"sessionToken\\\":\\\"TESTSESSIONTOKEN\\\",\\\"expiration\\\": 1651516560000}}\"\n          },\n          \"direction\": \"Response\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Response\"\n        }\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/sso_credentials/test-case.json",
    "content": "{\n  \"name\": \"sso_credentials\",\n  \"docs\": \"sso_credentials loads SSO credentials using a local SSO session\",\n  \"result\": {\n    \"Ok\": {\n      \"access_key_id\": \"ASIARTESTID\",\n      \"secret_access_key\": \"TESTSECRETKEY\",\n      \"session_token\": \"TESTSESSIONTOKEN\",\n      \"account_id\": \"012345678901\",\n      \"expiry\": 1651516560\n    }\n  }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/sso_override_global_env_url/env.json",
    "content": "{\n  \"HOME\": \"/home\",\n  \"AWS_ENDPOINT_URL\": \"http://aws.global-env-override\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/sso_override_global_env_url/fs/home/.aws/config",
    "content": "[profile default]\nsso_session = dev\nsso_account_id = 012345678901\nsso_role_name = SampleRole\nregion = us-east-1\n\n[sso-session dev]\nsso_region = us-east-1\nsso_start_url = https://d-abc123.awsapps.com/start\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/sso_override_global_env_url/fs/home/.aws/credentials",
    "content": ""
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/sso_override_global_env_url/fs/home/.aws/sso/cache/34c6fceca75e456f25e7e99531e2425c6c1de443.json",
    "content": "{\n    \"accessToken\": \"secret-access-token\",\n    \"expiresAt\": \"2199-11-14T04:05:45Z\",\n    \"refreshToken\": \"secret-refresh-token\",\n    \"clientId\": \"ABCDEFG323242423121312312312312312\",\n    \"clientSecret\": \"ABCDE123\",\n    \"registrationExpiresAt\": \"2199-03-06T19:53:17Z\",\n    \"region\": \"us-east-1\",\n    \"startUrl\": \"https://d-abc123.awsapps.com/start\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/sso_override_global_env_url/http-traffic.json",
    "content": "{\n  \"docs\": \"test case using sso credentials\",\n  \"version\": \"V0\",\n  \"events\": [\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Request\": {\n          \"request\": {\n            \"uri\": \"http://aws.global-env-override/federation/credentials?role_name=SampleRole&account_id=012345678901\",\n            \"headers\": {\n              \"x-amz-sso_bearer_token\": [\n                \"secret-access-token\"\n              ],\n              \"host\": [\n                \"aws.global-env-override\"\n              ]\n            },\n            \"method\": \"GET\"\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"\"\n          },\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Response\": {\n          \"response\": {\n            \"Ok\": {\n              \"status\": 200,\n              \"version\": \"HTTP/1.1\",\n              \"headers\": {\n                \"date\": [\n                  \"Thu, 05 Aug 2021 18:58:02 GMT\"\n                ],\n                \"content-length\": [\n                  \"1491\"\n                ],\n                \"content-type\": [\n                  \"text/xml\"\n                ],\n                \"x-amzn-requestid\": [\n                  \"c2e971c2-702d-4124-9b1f-1670febbea18\"\n                ]\n              }\n            }\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"{\\\"roleCredentials\\\":{\\\"accessKeyId\\\":\\\"ASIARTESTID\\\",\\\"secretAccessKey\\\":\\\"TESTSECRETKEY\\\",\\\"sessionToken\\\":\\\"TESTSESSIONTOKEN\\\",\\\"expiration\\\": 1651516560000}}\"\n          },\n          \"direction\": \"Response\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Response\"\n        }\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/sso_override_global_env_url/test-case.json",
    "content": "{\n  \"name\": \"sso_override_global_env_url\",\n  \"docs\": \"sso_credentials loads SSO credentials with global endpoint URL override from environment\",\n  \"result\": {\n    \"Ok\": {\n      \"access_key_id\": \"ASIARTESTID\",\n      \"secret_access_key\": \"TESTSECRETKEY\",\n      \"session_token\": \"TESTSESSIONTOKEN\",\n      \"account_id\": \"012345678901\",\n      \"expiry\": 1651516560\n    }\n  }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/sso_token/env.json",
    "content": "{\n  \"HOME\": \"/home\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/sso_token/fs/env.json",
    "content": "{\n  \"HOME\": \"/home\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/sso_token/fs/home/.aws/config",
    "content": "[profile default]\nsso_session = dev\nregion = us-east-1\n\n[sso-session dev]\nsso_region = us-east-1\nsso_start_url = https://d-abc123.awsapps.com/start\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/sso_token/fs/home/.aws/credentials",
    "content": ""
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/sso_token/fs/home/.aws/sso/cache/34c6fceca75e456f25e7e99531e2425c6c1de443.json",
    "content": "{\n    \"accessToken\": \"secret-access-token\",\n    \"expiresAt\": \"2199-11-14T04:05:45Z\",\n    \"refreshToken\": \"secret-refresh-token\",\n    \"clientId\": \"ABCDEFG323242423121312312312312312\",\n    \"clientSecret\": \"ABCDE123\",\n    \"registrationExpiresAt\": \"2199-03-06T19:53:17Z\",\n    \"region\": \"us-east-1\",\n    \"startUrl\": \"https://d-abc123.awsapps.com/start\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/sso_token/fs/http-traffic.json",
    "content": "{\n  \"docs\": \"test case using sso credentials\",\n  \"version\": \"V0\",\n  \"events\": [\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Request\": {\n          \"request\": {\n            \"uri\": \"https://portal.sso.us-east-1.amazonaws.com/federation/credentials?role_name=SampleRole&account_id=012345678901\",\n            \"headers\": {\n              \"x-amz-sso_bearer_token\": [\n                \"secret-access-token\"\n              ],\n              \"host\": [\n                \"portal.sso.us-east-1.amazonaws.com\"\n              ]\n            },\n            \"method\": \"GET\"\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"\"\n          },\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Response\": {\n          \"response\": {\n            \"Ok\": {\n              \"status\": 200,\n              \"version\": \"HTTP/1.1\",\n              \"headers\": {\n                \"date\": [\n                  \"Thu, 05 Aug 2021 18:58:02 GMT\"\n                ],\n                \"content-length\": [\n                  \"1491\"\n                ],\n                \"content-type\": [\n                  \"text/xml\"\n                ],\n                \"x-amzn-requestid\": [\n                  \"c2e971c2-702d-4124-9b1f-1670febbea18\"\n                ]\n              }\n            }\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"{\\\"roleCredentials\\\":{\\\"accessKeyId\\\":\\\"ASIARTESTID\\\",\\\"secretAccessKey\\\":\\\"TESTSECRETKEY\\\",\\\"sessionToken\\\":\\\"TESTSESSIONTOKEN\\\",\\\"expiration\\\": 1651516560000}}\"\n          },\n          \"direction\": \"Response\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Response\"\n        }\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/sso_token/fs/test-case.json",
    "content": "{\n  \"name\": \"sso_token\",\n  \"docs\": \"sso_token attempts to use an SSO access token (AWS Builder ID) through the credentials chain when it should go through the token provider chain\",\n  \"result\": {\n    \"ErrorContains\": \"foobaz\"\n  }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/sso_token/http-traffic.json",
    "content": "{\n  \"docs\": \"test case using sso token\",\n  \"version\": \"V0\",\n  \"events\": []\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-config/test-data/profile-provider/sso_token/test-case.json",
    "content": "{\n  \"name\": \"sso_token\",\n  \"docs\": \"sso_token loads a profile that doesn't have `sso_account_id` and `sso_role_name` fields, indicating that it's intended for the token provider chain in a service that uses SSO with an AWS Builder ID instead of credentials\",\n  \"result\": {\n    \"ErrorContains\": \"selected profile will resolve an access token instead of credentials\"\n  }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-credential-types/Cargo.toml",
    "content": "[package]\nname = \"aws-credential-types\"\nversion = \"1.2.14\"\nauthors = [\"AWS Rust SDK Team <aws-sdk-rust@amazon.com>\"]\ndescription = \"Types for AWS SDK credentials.\"\nedition = \"2021\"\nlicense = \"Apache-2.0\"\nrepository = \"https://github.com/smithy-lang/smithy-rs\"\nrust-version = \"1.91.1\"\n\n[features]\nhardcoded-credentials = []\ntest-util = [\"aws-smithy-runtime-api/test-util\"]\n\n[dependencies]\naws-smithy-async = { path = \"../../../rust-runtime/aws-smithy-async\" }\naws-smithy-types = { path = \"../../../rust-runtime/aws-smithy-types\" }\naws-smithy-runtime-api = { path = \"../../../rust-runtime/aws-smithy-runtime-api\", features = [\"client\", \"http-auth\"] }\nzeroize = \"1.7.0\"\n\n[dev-dependencies]\nasync-trait = \"0.1.74\" # used to test compatibility\naws-smithy-runtime-api = { path = \"../../../rust-runtime/aws-smithy-runtime-api\", features = [\"test-util\"] }\ntokio = { version = \"1.49.0\", features = [\"full\", \"test-util\", \"rt\"] }\n\n[package.metadata.docs.rs]\nall-features = true\ntargets = [\"x86_64-unknown-linux-gnu\"]\ncargo-args = [\"-Zunstable-options\", \"-Zrustdoc-scrape-examples\"]\nrustdoc-args = [\"--cfg\", \"docsrs\"]\n# End of docs.rs metadata\n\n[package.metadata.smithy-rs-release-tooling]\nstable = true\n"
  },
  {
    "path": "aws/rust-runtime/aws-credential-types/LICENSE",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n"
  },
  {
    "path": "aws/rust-runtime/aws-credential-types/README.md",
    "content": "# aws-credential-types\n\nThis crate provides types concerned with AWS SDK credentials including:\n* Traits for credentials providers and for credentials caching\n* An opaque struct representing credentials\n* Concrete implementations of credentials caching\n\n<!-- anchor_start:footer -->\nThis crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly.\n<!-- anchor_end:footer -->\n"
  },
  {
    "path": "aws/rust-runtime/aws-credential-types/additional-ci",
    "content": "#!/bin/bash\n#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\n\n# This script contains additional CI checks to run for this specific package\n\nset -e\n\necho \"### Checking for duplicate dependency versions in the normal dependency graph with all features enabled\"\ncargo tree -d --edges normal --all-features\n\necho \"### Testing every combination of features (excluding --all-features)\"\ncargo hack test --feature-powerset --exclude-all-features\n"
  },
  {
    "path": "aws/rust-runtime/aws-credential-types/external-types.toml",
    "content": "allowed_external_types = [\n    \"aws_smithy_async::rt::sleep::AsyncSleep\",\n    \"aws_smithy_async::rt::sleep::SharedAsyncSleep\",\n    \"aws_smithy_runtime_api::client::identity::ResolveIdentity\",\n    \"aws_smithy_runtime_api::client::identity::http::Token\",\n    \"aws_smithy_runtime_api::shared::FromUnshared\",\n    \"aws_smithy_types::config_bag::storable::Storable\",\n    \"aws_smithy_types::config_bag::storable::StoreReplace\",\n    \"aws_smithy_types::config_bag::storable::Storer\",\n]\n"
  },
  {
    "path": "aws/rust-runtime/aws-credential-types/src/attributes.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Types representing specific pieces of data contained within credentials or within token\n\n/// Type representing a unique identifier representing an AWS account.\n#[derive(Clone, Debug, Eq, PartialEq)]\npub struct AccountId {\n    inner: String,\n}\n\nimpl AccountId {\n    /// Return the string equivalent of this account id.\n    pub fn as_str(&self) -> &str {\n        &self.inner\n    }\n}\n\nimpl<T> From<T> for AccountId\nwhere\n    T: Into<String>,\n{\n    fn from(value: T) -> Self {\n        Self {\n            inner: value.into(),\n        }\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n\n    #[test]\n    fn account_id_creation() {\n        let expected = \"012345678901\";\n        assert_eq!(expected, AccountId::from(expected).as_str());\n        assert_eq!(expected, AccountId::from(String::from(expected)).as_str());\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-credential-types/src/credential_feature.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_smithy_types::config_bag::{Storable, StoreAppend};\n\n/// IDs for the credential related features that may be used in the AWS SDK\n#[non_exhaustive]\n#[derive(Clone, Debug, Eq, PartialEq)]\npub enum AwsCredentialFeature {\n    /// An operation where credential resolution resolved an account ID\n    ResolvedAccountId,\n    /// An operation called using credentials resolved from code, cli parameters, session object, or client instance\n    CredentialsCode,\n    /// An operation called using credentials resolved from environment variables\n    CredentialsEnvVars,\n    /// An operation called using credentials resolved from environment variables for assuming a role with STS using a web identity token\n    CredentialsEnvVarsStsWebIdToken,\n    /// An operation called using credentials resolved from STS using assume role\n    CredentialsStsAssumeRole,\n    /// An operation called using credentials resolved from STS using assume role with SAML\n    CredentialsStsAssumeRoleSaml,\n    /// An operation called using credentials resolved from STS using assume role with web identity\n    CredentialsStsAssumeRoleWebId,\n    /// An operation called using credentials resolved from STS using a federation token\n    CredentialsStsFederationToken,\n    /// An operation called using credentials resolved from STS using a session token\n    CredentialsStsSessionToken,\n    /// An operation called using credentials resolved from a config file(s) profile with static credentials\n    CredentialsProfile,\n    /// An operation called using credentials resolved from a source profile in a config file(s) profile\n    CredentialsProfileSourceProfile,\n    /// An operation called using credentials resolved from a named provider in a config file(s) profile\n    CredentialsProfileNamedProvider,\n    /// An operation called using credentials resolved from configuration for assuming a role with STS using web identity token in a config file(s) profile\n    CredentialsProfileStsWebIdToken,\n    /// An operation called using credentials resolved from an SSO session in a config file(s) profile\n    CredentialsProfileSso,\n    /// An operation called using credentials resolved from an SSO session\n    CredentialsSso,\n    /// An operation called using credentials resolved from a process in a config file(s) profile\n    CredentialsProfileProcess,\n    /// An operation called using credentials resolved from a process\n    CredentialsProcess,\n    /// An operation called using credentials resolved from an HTTP endpoint\n    CredentialsHttp,\n    /// An operation called using credentials resolved from the instance metadata service (IMDS)\n    CredentialsImds,\n    /// An operation called using a Bearer token resolved from service-specific environment variables\n    BearerServiceEnvVars,\n    /// An operation called using S3 Express bucket credentials\n    S3ExpressBucket,\n    /// An operation called using credentials resolved from a LoginCredentialsProvider configured via profile\n    CredentialsProfileLogin,\n    /// An operation called using credentials resolved from a LoginCredentialsProvider configured explicitly via code\n    CredentialsLogin,\n}\n\nimpl Storable for AwsCredentialFeature {\n    type Storer = StoreAppend<Self>;\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-credential-types/src/credential_fn.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Types that allow a credentials provider to be created from a closure\n\nuse std::fmt::{self, Debug, Formatter};\nuse std::future::Future;\nuse std::marker::PhantomData;\n\nuse crate::provider::{future, ProvideCredentials};\n\n/// A [`ProvideCredentials`] implemented by a closure.\n///\n/// See [`provide_credentials_fn`] for more details.\n#[derive(Copy, Clone)]\npub struct ProvideCredentialsFn<'c, T> {\n    f: T,\n    phantom: PhantomData<&'c T>,\n}\n\nimpl<T> Debug for ProvideCredentialsFn<'_, T> {\n    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {\n        write!(f, \"ProvideCredentialsFn\")\n    }\n}\n\nimpl<'c, T, F> ProvideCredentials for ProvideCredentialsFn<'c, T>\nwhere\n    T: Fn() -> F + Send + Sync + 'c,\n    F: Future<Output = crate::provider::Result> + Send + 'static,\n{\n    fn provide_credentials<'a>(&'a self) -> future::ProvideCredentials<'a>\n    where\n        Self: 'a,\n    {\n        future::ProvideCredentials::new((self.f)())\n    }\n}\n\n/// Returns a new credentials provider built with the given closure. This allows you\n/// to create an [`ProvideCredentials`] implementation from an async block that returns\n/// a [`crate::provider::Result`].\n///\n/// # Examples\n///\n/// ```no_run\n/// use aws_credential_types::Credentials;\n/// use aws_credential_types::credential_fn::provide_credentials_fn;\n///\n/// async fn load_credentials() -> Credentials {\n///     todo!()\n/// }\n///\n/// provide_credentials_fn(|| async {\n///     // Async process to retrieve credentials goes here\n///     let credentials = load_credentials().await;\n///     Ok(credentials)\n/// });\n/// ```\npub fn provide_credentials_fn<'c, T, F>(f: T) -> ProvideCredentialsFn<'c, T>\nwhere\n    T: Fn() -> F + Send + Sync + 'c,\n    F: Future<Output = crate::provider::Result> + Send + 'static,\n{\n    ProvideCredentialsFn {\n        f,\n        phantom: Default::default(),\n    }\n}\n\n#[cfg(test)]\nmod test {\n    use crate::credential_fn::provide_credentials_fn;\n    use crate::{provider::ProvideCredentials, Credentials};\n\n    fn assert_send_sync<T: Send + Sync>() {}\n\n    #[test]\n    fn creds_are_send_sync() {\n        assert_send_sync::<Credentials>()\n    }\n\n    // Test that the closure passed to `provide_credentials_fn` is allowed to borrow things\n    #[tokio::test]\n    async fn provide_credentials_fn_closure_can_borrow() {\n        fn check_is_str_ref(_input: &str) {}\n        async fn test_async_provider(input: String) -> crate::provider::Result {\n            Ok(Credentials::new(&input, &input, None, None, \"test\"))\n        }\n\n        let things_to_borrow = vec![\"one\".to_string(), \"two\".to_string()];\n\n        let mut providers = Vec::new();\n        for thing in &things_to_borrow {\n            let provider = provide_credentials_fn(move || {\n                check_is_str_ref(thing);\n                test_async_provider(thing.into())\n            });\n            providers.push(provider);\n        }\n\n        let (two, one) = (providers.pop().unwrap(), providers.pop().unwrap());\n        assert_eq!(\n            \"one\",\n            one.provide_credentials().await.unwrap().access_key_id()\n        );\n        assert_eq!(\n            \"two\",\n            two.provide_credentials().await.unwrap().access_key_id()\n        );\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-credential-types/src/credentials_impl.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_smithy_types::config_bag::Layer;\nuse aws_smithy_types::date_time::Format;\nuse aws_smithy_types::type_erasure::TypeErasedBox;\nuse std::any::{Any, TypeId};\nuse std::collections::HashMap;\nuse std::fmt;\nuse std::fmt::{Debug, Formatter};\nuse std::sync::Arc;\nuse std::time::{SystemTime, UNIX_EPOCH};\nuse zeroize::Zeroizing;\n\nuse aws_smithy_runtime_api::client::identity::Identity;\n\nuse crate::attributes::AccountId;\nuse crate::credential_feature::AwsCredentialFeature;\n\n/// AWS SDK Credentials\n///\n/// An opaque struct representing credentials that may be used in an AWS SDK, modeled on\n/// the [CRT credentials implementation](https://github.com/awslabs/aws-c-auth/blob/main/source/credentials.c).\n///\n/// When `Credentials` is dropped, its contents are zeroed in memory. Credentials uses an interior Arc to ensure\n/// that even when cloned, credentials don't exist in multiple memory locations.\npub struct Credentials(Arc<Inner>, HashMap<TypeId, TypeErasedBox>);\n\nimpl Clone for Credentials {\n    fn clone(&self) -> Self {\n        let mut new_map = HashMap::with_capacity(self.1.len());\n        for (k, v) in &self.1 {\n            new_map.insert(\n                *k,\n                v.try_clone()\n                    .expect(\"values are guaranteed to implement `Clone` via `set_property`\"),\n            );\n        }\n        Self(self.0.clone(), new_map)\n    }\n}\n\nimpl PartialEq for Credentials {\n    #[inline] // specified in the output of cargo expand of the original `#[derive(PartialEq)]`\n    fn eq(&self, other: &Credentials) -> bool {\n        self.0 == other.0\n    }\n}\n\nimpl Eq for Credentials {}\n\n#[derive(Clone, Eq, PartialEq)]\nstruct Inner {\n    access_key_id: Zeroizing<String>,\n    secret_access_key: Zeroizing<String>,\n    session_token: Zeroizing<Option<String>>,\n\n    /// Credential Expiry\n    ///\n    /// A SystemTime at which the credentials should no longer be used because they have expired.\n    /// The primary purpose of this value is to allow credentials to communicate to the caching\n    /// provider when they need to be refreshed.\n    ///\n    /// If these credentials never expire, this value will be set to `None`\n    expires_after: Option<SystemTime>,\n\n    // Optional piece of data to support account-based endpoints.\n    // https://docs.aws.amazon.com/sdkref/latest/guide/feature-account-endpoints.html\n    account_id: Option<AccountId>,\n\n    provider_name: &'static str,\n}\n\nimpl Debug for Credentials {\n    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {\n        let mut creds = f.debug_struct(\"Credentials\");\n        creds\n            .field(\"provider_name\", &self.0.provider_name)\n            .field(\"access_key_id\", &self.0.access_key_id.as_str())\n            .field(\"secret_access_key\", &\"** redacted **\");\n        if let Some(expiry) = self.expiry() {\n            if let Some(formatted) = expiry.duration_since(UNIX_EPOCH).ok().and_then(|dur| {\n                aws_smithy_types::DateTime::from_secs(dur.as_secs() as _)\n                    .fmt(Format::DateTime)\n                    .ok()\n            }) {\n                creds.field(\"expires_after\", &formatted);\n            } else {\n                creds.field(\"expires_after\", &expiry);\n            }\n        } else {\n            creds.field(\"expires_after\", &\"never\");\n        }\n        if let Some(account_id) = &self.0.account_id {\n            creds.field(\"account_id\", &account_id.as_str());\n        }\n        for (i, prop) in self.1.values().enumerate() {\n            creds.field(&format!(\"property_{i}\"), prop);\n        }\n        creds.finish()\n    }\n}\n\n#[cfg(feature = \"hardcoded-credentials\")]\nconst STATIC_CREDENTIALS: &str = \"Static\";\n\nimpl Credentials {\n    /// Returns builder for `Credentials`.\n    pub fn builder() -> CredentialsBuilder {\n        CredentialsBuilder::default()\n    }\n\n    /// Creates `Credentials`.\n    ///\n    /// This is intended to be used from a custom credentials provider implementation.\n    /// It is __NOT__ secure to hardcode credentials into your application.\n    pub fn new(\n        access_key_id: impl Into<String>,\n        secret_access_key: impl Into<String>,\n        session_token: Option<String>,\n        expires_after: Option<SystemTime>,\n        provider_name: &'static str,\n    ) -> Self {\n        Credentials(\n            Arc::new(Inner {\n                access_key_id: Zeroizing::new(access_key_id.into()),\n                secret_access_key: Zeroizing::new(secret_access_key.into()),\n                session_token: Zeroizing::new(session_token),\n                expires_after,\n                account_id: None,\n                provider_name,\n            }),\n            HashMap::new(),\n        )\n    }\n\n    /// Creates `Credentials` from hardcoded access key, secret key, and session token.\n    ///\n    /// _Note: In general, you should prefer to use the credential providers that come\n    /// with the AWS SDK to get credentials. It is __NOT__ secure to hardcode credentials\n    /// into your application. If you're writing a custom credentials provider, then\n    /// use [`Credentials::new`] instead of this._\n    ///\n    /// This function requires the `hardcoded-credentials` feature to be enabled.\n    ///\n    /// [`Credentials`] implement\n    /// [`ProvideCredentials`](crate::provider::ProvideCredentials) directly, so no custom provider\n    /// implementation is required when wiring these up to a client:\n    /// ```rust\n    /// use aws_credential_types::Credentials;\n    /// # mod service {\n    /// #     use aws_credential_types::provider::ProvideCredentials;\n    /// #     pub struct Config;\n    /// #     impl Config {\n    /// #        pub fn builder() -> Self {\n    /// #            Config\n    /// #        }\n    /// #        pub fn credentials_provider(self, provider: impl ProvideCredentials + 'static) -> Self {\n    /// #            self\n    /// #        }\n    /// #        pub fn build(self) -> Config { Config }\n    /// #     }\n    /// #     pub struct Client;\n    /// #     impl Client {\n    /// #        pub fn from_conf(config: Config) -> Self {\n    /// #            Client\n    /// #        }\n    /// #     }\n    /// # }\n    /// # use service::{Config, Client};\n    ///\n    /// let creds = Credentials::from_keys(\"akid\", \"secret_key\", None);\n    /// let config = Config::builder()\n    ///     .credentials_provider(creds)\n    ///     .build();\n    /// let client = Client::from_conf(config);\n    /// ```\n    #[cfg(feature = \"hardcoded-credentials\")]\n    pub fn from_keys(\n        access_key_id: impl Into<String>,\n        secret_access_key: impl Into<String>,\n        session_token: Option<String>,\n    ) -> Self {\n        Self::new(\n            access_key_id,\n            secret_access_key,\n            session_token,\n            None,\n            STATIC_CREDENTIALS,\n        )\n    }\n\n    /// Returns the access key ID.\n    pub fn access_key_id(&self) -> &str {\n        &self.0.access_key_id\n    }\n\n    /// Returns the secret access key.\n    pub fn secret_access_key(&self) -> &str {\n        &self.0.secret_access_key\n    }\n\n    /// Returns the time when the credentials will expire.\n    pub fn expiry(&self) -> Option<SystemTime> {\n        self.0.expires_after\n    }\n\n    /// Returns a mutable reference to the time when the credentials will expire.\n    pub fn expiry_mut(&mut self) -> &mut Option<SystemTime> {\n        &mut Arc::make_mut(&mut self.0).expires_after\n    }\n\n    /// Returns the account ID.\n    pub fn account_id(&self) -> Option<&AccountId> {\n        self.0.account_id.as_ref()\n    }\n\n    /// Returns the session token.\n    pub fn session_token(&self) -> Option<&str> {\n        self.0.session_token.as_deref()\n    }\n\n    /// Set arbitrary property for `Credentials`\n    #[doc(hidden)]\n    pub fn set_property<T: Any + Clone + Debug + Send + Sync + 'static>(&mut self, prop: T) {\n        self.1\n            .insert(TypeId::of::<T>(), TypeErasedBox::new_with_clone(prop));\n    }\n\n    /// Returns arbitrary property associated with this `Credentials`.\n    #[doc(hidden)]\n    pub fn get_property<T: Any + Debug + Send + Sync + 'static>(&self) -> Option<&T> {\n        self.1\n            .get(&TypeId::of::<T>())\n            .and_then(|b| b.downcast_ref())\n    }\n\n    /// Attempts to retrieve a mutable reference to property of a given type `T`.\n    #[doc(hidden)]\n    pub fn get_property_mut<T: Any + Debug + Send + Sync + 'static>(&mut self) -> Option<&mut T> {\n        self.1\n            .get_mut(&TypeId::of::<T>())\n            .and_then(|b| b.downcast_mut())\n    }\n\n    /// Returns a mutable reference to `T` if it is stored in the property, otherwise returns the\n    /// [`Default`] implementation of `T`.\n    #[doc(hidden)]\n    pub fn get_property_mut_or_default<T: Any + Clone + Debug + Default + Send + Sync + 'static>(\n        &mut self,\n    ) -> &mut T {\n        self.1\n            .entry(TypeId::of::<T>())\n            .or_insert_with(|| TypeErasedBox::new_with_clone(T::default()))\n            .downcast_mut()\n            .expect(\"typechecked\")\n    }\n}\n\n/// Builder for [`Credentials`]\n///\n/// Similar to [`Credentials::new`], the use of the builder is intended for a custom credentials provider implementation.\n/// It is __NOT__ secure to hardcode credentials into your application.\n#[derive(Default, Clone)]\n#[allow(missing_debug_implementations)] // for security reasons, and we can add manual `impl Debug` just like `Credentials`, if needed.\npub struct CredentialsBuilder {\n    access_key_id: Option<Zeroizing<String>>,\n    secret_access_key: Option<Zeroizing<String>>,\n    session_token: Zeroizing<Option<String>>,\n    expires_after: Option<SystemTime>,\n    account_id: Option<AccountId>,\n    provider_name: Option<&'static str>,\n}\n\nimpl CredentialsBuilder {\n    /// Set access key id for the builder.\n    pub fn access_key_id(mut self, access_key_id: impl Into<String>) -> Self {\n        self.access_key_id = Some(Zeroizing::new(access_key_id.into()));\n        self\n    }\n\n    /// Set secret access key for the builder.\n    pub fn secret_access_key(mut self, secret_access_key: impl Into<String>) -> Self {\n        self.secret_access_key = Some(Zeroizing::new(secret_access_key.into()));\n        self\n    }\n\n    /// Set session token for the builder.\n    pub fn session_token(mut self, session_token: impl Into<String>) -> Self {\n        self.set_session_token(Some(session_token.into()));\n        self\n    }\n\n    /// Set session token for the builder.\n    pub fn set_session_token(&mut self, session_token: Option<String>) {\n        self.session_token = Zeroizing::new(session_token);\n    }\n\n    /// Set expiry for the builder.\n    pub fn expiry(mut self, expiry: SystemTime) -> Self {\n        self.set_expiry(Some(expiry));\n        self\n    }\n\n    /// Set expiry for the builder.\n    pub fn set_expiry(&mut self, expiry: Option<SystemTime>) {\n        self.expires_after = expiry;\n    }\n\n    /// Set account ID for the builder.\n    pub fn account_id(mut self, account_id: impl Into<AccountId>) -> Self {\n        self.set_account_id(Some(account_id.into()));\n        self\n    }\n\n    /// Set account ID for the builder.\n    pub fn set_account_id(&mut self, account_id: Option<AccountId>) {\n        self.account_id = account_id;\n    }\n\n    /// Set provider name for the builder.\n    pub fn provider_name(mut self, provider_name: &'static str) -> Self {\n        self.provider_name = Some(provider_name);\n        self\n    }\n\n    /// Build [`Credentials`] from the builder.\n    pub fn build(self) -> Credentials {\n        Credentials(\n            Arc::new(Inner {\n                access_key_id: self\n                    .access_key_id\n                    .expect(\"required field `access_key_id` missing\"),\n                secret_access_key: self\n                    .secret_access_key\n                    .expect(\"required field `secret_access_key` missing\"),\n                session_token: self.session_token,\n                expires_after: self.expires_after,\n                account_id: self.account_id,\n                provider_name: self\n                    .provider_name\n                    .expect(\"required field `provider_name` missing\"),\n            }),\n            HashMap::new(),\n        )\n    }\n}\n\n#[cfg(feature = \"test-util\")]\nimpl Credentials {\n    /// Creates a test `Credentials` with no session token.\n    pub fn for_tests() -> Self {\n        Self::new(\n            \"ANOTREAL\",\n            \"notrealrnrELgWzOk3IfjzDKtFBhDby\",\n            None,\n            None,\n            \"test\",\n        )\n    }\n\n    /// Creates a test `Credentials` that include a session token.\n    pub fn for_tests_with_session_token() -> Self {\n        Self::new(\n            \"ANOTREAL\",\n            \"notrealrnrELgWzOk3IfjzDKtFBhDby\",\n            Some(\"notarealsessiontoken\".to_string()),\n            None,\n            \"test\",\n        )\n    }\n}\n\n#[cfg(feature = \"test-util\")]\nimpl CredentialsBuilder {\n    /// Creates a test `CredentialsBuilder` with the required fields:\n    /// `access_key_id`, `secret_access_key`, and `provider_name`.\n    pub fn for_tests() -> Self {\n        CredentialsBuilder::default()\n            .access_key_id(\"ANOTREAL\")\n            .secret_access_key(\"notrealrnrELgWzOk3IfjzDKtFBhDby\")\n            .provider_name(\"test\")\n    }\n}\n\nimpl From<Credentials> for Identity {\n    fn from(val: Credentials) -> Self {\n        let expiry = val.expiry();\n        let mut builder = if let Some(account_id) = val.account_id() {\n            Identity::builder().property(account_id.clone())\n        } else {\n            Identity::builder()\n        };\n\n        builder.set_expiration(expiry);\n\n        let features = val.get_property::<Vec<AwsCredentialFeature>>().cloned();\n        let has_account_id = val.account_id().is_some();\n\n        if features.is_some() || has_account_id {\n            let mut layer = Layer::new(\"IdentityResolutionFeatureIdTracking\");\n            if let Some(features) = features {\n                for feat in features {\n                    layer.store_append(feat);\n                }\n            }\n            if has_account_id {\n                layer.store_append(AwsCredentialFeature::ResolvedAccountId);\n            }\n            builder.set_property(layer.freeze());\n        }\n\n        builder.data(val).build().expect(\"set required fields\")\n    }\n}\n\n#[cfg(test)]\nmod test {\n    use crate::Credentials;\n    use std::time::{Duration, UNIX_EPOCH};\n\n    #[test]\n    fn debug_impl() {\n        let creds = Credentials::new(\n            \"akid\",\n            \"secret\",\n            Some(\"token\".into()),\n            Some(UNIX_EPOCH + Duration::from_secs(1234567890)),\n            \"debug tester\",\n        );\n        assert_eq!(\n            format!(\"{:?}\", creds),\n            r#\"Credentials { provider_name: \"debug tester\", access_key_id: \"akid\", secret_access_key: \"** redacted **\", expires_after: \"2009-02-13T23:31:30Z\" }\"#\n        );\n\n        // with account ID\n        let creds = Credentials::builder()\n            .access_key_id(\"akid\")\n            .secret_access_key(\"secret\")\n            .session_token(\"token\")\n            .expiry(UNIX_EPOCH + Duration::from_secs(1234567890))\n            .account_id(\"012345678901\")\n            .provider_name(\"debug tester\")\n            .build();\n        assert_eq!(\n            format!(\"{:?}\", creds),\n            r#\"Credentials { provider_name: \"debug tester\", access_key_id: \"akid\", secret_access_key: \"** redacted **\", expires_after: \"2009-02-13T23:31:30Z\", account_id: \"012345678901\" }\"#\n        );\n    }\n\n    #[cfg(feature = \"test-util\")]\n    #[test]\n    fn equality_ignores_properties() {\n        #[derive(Clone, Debug)]\n        struct Foo;\n        let mut creds1 = Credentials::for_tests_with_session_token();\n        creds1.set_property(crate::credential_feature::AwsCredentialFeature::CredentialsCode);\n\n        let mut creds2 = Credentials::for_tests_with_session_token();\n        creds2.set_property(Foo);\n\n        assert_eq!(creds1, creds2)\n    }\n\n    #[cfg(feature = \"test-util\")]\n    #[test]\n    fn identity_inherits_feature_properties() {\n        use crate::credential_feature::AwsCredentialFeature;\n        use aws_smithy_runtime_api::client::identity::Identity;\n        use aws_smithy_types::config_bag::FrozenLayer;\n\n        let mut creds = Credentials::for_tests_with_session_token();\n        let mut feature_props = vec![\n            AwsCredentialFeature::CredentialsCode,\n            AwsCredentialFeature::CredentialsStsSessionToken,\n        ];\n        creds.set_property(feature_props.clone());\n\n        let identity = Identity::from(creds);\n\n        let maybe_props = identity\n            .property::<FrozenLayer>()\n            .unwrap()\n            .load::<AwsCredentialFeature>()\n            .cloned()\n            .collect::<Vec<AwsCredentialFeature>>();\n\n        // The props get reversed when being popped out of the StoreAppend\n        feature_props.reverse();\n        assert_eq!(maybe_props, feature_props)\n    }\n\n    #[cfg(feature = \"test-util\")]\n    #[test]\n    fn from_credentials_adds_resolved_account_id_feature() {\n        use crate::credential_feature::AwsCredentialFeature;\n        use aws_smithy_runtime_api::client::identity::Identity;\n        use aws_smithy_types::config_bag::FrozenLayer;\n\n        let creds = Credentials::builder()\n            .access_key_id(\"test\")\n            .secret_access_key(\"test\")\n            .account_id(\"123456789012\")\n            .provider_name(\"test\")\n            .build();\n\n        let identity = Identity::from(creds);\n\n        let layer = identity.property::<FrozenLayer>().unwrap();\n        let features = layer\n            .load::<AwsCredentialFeature>()\n            .cloned()\n            .collect::<Vec<_>>();\n        assert!(features.contains(&AwsCredentialFeature::ResolvedAccountId));\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-credential-types/src/lib.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/* Automatically managed default lints */\n#![cfg_attr(docsrs, feature(doc_cfg))]\n/* End of automatically managed default lints */\n//! `aws-credential-types` provides types concerned with AWS SDK credentials including:\n//! * Traits for credentials providers and for credentials caching\n//! * An opaque struct representing credentials\n//! * Concrete implementations of credentials caching\n\n#![allow(clippy::derive_partial_eq_without_eq)]\n#![warn(\n    missing_debug_implementations,\n    missing_docs,\n    rust_2018_idioms,\n    rustdoc::missing_crate_level_docs,\n    unreachable_pub\n)]\n\npub mod attributes;\n#[doc(hidden)]\npub mod credential_feature;\npub mod credential_fn;\nmod credentials_impl;\npub mod provider;\npub mod token_fn;\n\npub use credentials_impl::{Credentials, CredentialsBuilder};\n\n/// AWS Access Token\n///\n/// This access token type is used to authenticate to AWS services that use HTTP Bearer\n/// Auth with an AWS Builder ID such as CodeCatalyst.\n///\n/// For more details on tokens, see: <https://oauth.net/2/access-tokens>\npub type Token = aws_smithy_runtime_api::client::identity::http::Token;\n"
  },
  {
    "path": "aws/rust-runtime/aws-credential-types/src/provider/credentials.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! AWS SDK Credentials\n//!\n//! ## Implementing your own credentials provider\n//!\n//! While for many use cases, using a built in credentials provider is sufficient, you may want to\n//! implement your own credential provider.\n//!\n//! ### With static credentials\n//!\n//! _Note: In general, you should prefer to use the credential providers that come\n//! with the AWS SDK to get credentials. It is __NOT__ secure to hardcode credentials\n//! into your application. Only use this approach if you really know what you're doing._\n//!\n#![cfg_attr(\n    feature = \"hardcoded-credentials\",\n    doc = r##\"\nSee [`Credentials::from_keys`] for an example on how to use static credentials.\n    \"##\n)]\n#![cfg_attr(\n    not(feature = \"hardcoded-credentials\"),\n    doc = r##\"\nEnable the `hardcoded-credentials` feature to be able to use `Credentials::from_keys` to\nconstruct credentials from hardcoded values.\n    \"##\n)]\n\n//!\n//! ### With dynamically loaded credentials\n//! If you are loading credentials dynamically, you can provide your own implementation of\n//! [`ProvideCredentials`]. Generally, this is best done by\n//! defining an inherent `async fn` on your structure, then calling that method directly from\n//! the trait implementation.\n//! ```rust\n//! use aws_credential_types::{\n//!     provider::{self, future, error::CredentialsError, ProvideCredentials},\n//!     Credentials,\n//! };\n//! #[derive(Debug)]\n//! struct SubprocessCredentialProvider;\n//!\n//! async fn invoke_command(command: &str) -> String {\n//!     // implementation elided...\n//!     # String::from(\"some credentials\")\n//! }\n//!\n//! /// Parse access key and secret from the first two lines of a string\n//! fn parse_credentials(creds: &str) -> provider::Result {\n//!     let mut lines = creds.lines();\n//!     let akid = lines.next().ok_or(CredentialsError::provider_error(\"invalid credentials\"))?;\n//!     let secret = lines.next().ok_or(CredentialsError::provider_error(\"invalid credentials\"))?;\n//!     Ok(Credentials::new(akid, secret, None, None, \"CustomCommand\"))\n//! }\n//!\n//! impl SubprocessCredentialProvider {\n//!     async fn load_credentials(&self) -> provider::Result {\n//!         let creds = invoke_command(\"load-credentials.py\").await;\n//!         parse_credentials(&creds)\n//!     }\n//! }\n//!\n//! impl ProvideCredentials for SubprocessCredentialProvider {\n//!     fn provide_credentials<'a>(&'a self) -> future::ProvideCredentials<'a> where Self: 'a {\n//!         future::ProvideCredentials::new(self.load_credentials())\n//!     }\n//! }\n//! ```\n\nuse crate::Credentials;\nuse aws_smithy_runtime_api::client::identity::{\n    Identity, IdentityCachePartition, IdentityFuture, ResolveIdentity,\n};\nuse aws_smithy_runtime_api::client::runtime_components::RuntimeComponents;\nuse aws_smithy_types::config_bag::{ConfigBag, Storable, StoreReplace};\nuse std::sync::Arc;\n\n/// Result type for credential providers.\npub type Result = std::result::Result<Credentials, super::error::CredentialsError>;\n\n/// Asynchronous Credentials Provider\npub trait ProvideCredentials: Send + Sync + std::fmt::Debug {\n    /// Returns a future that provides credentials.\n    fn provide_credentials<'a>(&'a self) -> super::future::ProvideCredentials<'a>\n    where\n        Self: 'a;\n\n    /// Returns fallback credentials.\n    ///\n    /// This method should be used as a fallback plan, i.e., when\n    /// a call to `provide_credentials` is interrupted and its future\n    /// fails to complete.\n    ///\n    /// The fallback credentials should be set aside and ready to be returned\n    /// immediately. Therefore, the user should NOT go fetch new credentials\n    /// within this method, which might cause a long-running operation.\n    fn fallback_on_interrupt(&self) -> Option<Credentials> {\n        None\n    }\n}\n\nimpl ProvideCredentials for Credentials {\n    fn provide_credentials<'a>(&'a self) -> super::future::ProvideCredentials<'a>\n    where\n        Self: 'a,\n    {\n        super::future::ProvideCredentials::ready(Ok(self.clone()))\n    }\n}\n\nimpl ProvideCredentials for Arc<dyn ProvideCredentials> {\n    fn provide_credentials<'a>(&'a self) -> super::future::ProvideCredentials<'a>\n    where\n        Self: 'a,\n    {\n        self.as_ref().provide_credentials()\n    }\n}\n\n/// Credentials Provider wrapper that may be shared\n///\n/// Newtype wrapper around ProvideCredentials that implements Clone using an internal\n/// Arc.\n#[derive(Clone, Debug)]\npub struct SharedCredentialsProvider(Arc<dyn ProvideCredentials>, IdentityCachePartition);\n\nimpl SharedCredentialsProvider {\n    /// Create a new SharedCredentials provider from `ProvideCredentials`\n    ///\n    /// The given provider will be wrapped in an internal `Arc`. If your\n    /// provider is already in an `Arc`, use `SharedCredentialsProvider::from(provider)` instead.\n    pub fn new(provider: impl ProvideCredentials + 'static) -> Self {\n        Self(Arc::new(provider), IdentityCachePartition::new())\n    }\n}\n\nimpl AsRef<dyn ProvideCredentials> for SharedCredentialsProvider {\n    fn as_ref(&self) -> &(dyn ProvideCredentials + 'static) {\n        self.0.as_ref()\n    }\n}\n\nimpl From<Arc<dyn ProvideCredentials>> for SharedCredentialsProvider {\n    fn from(provider: Arc<dyn ProvideCredentials>) -> Self {\n        SharedCredentialsProvider(provider, IdentityCachePartition::new())\n    }\n}\n\nimpl ProvideCredentials for SharedCredentialsProvider {\n    fn provide_credentials<'a>(&'a self) -> super::future::ProvideCredentials<'a>\n    where\n        Self: 'a,\n    {\n        self.0.provide_credentials()\n    }\n}\n\nimpl Storable for SharedCredentialsProvider {\n    type Storer = StoreReplace<SharedCredentialsProvider>;\n}\n\nimpl ResolveIdentity for SharedCredentialsProvider {\n    fn resolve_identity<'a>(\n        &'a self,\n        _runtime_components: &'a RuntimeComponents,\n        _config_bag: &'a ConfigBag,\n    ) -> IdentityFuture<'a> {\n        IdentityFuture::new(async move { Ok(self.provide_credentials().await?.into()) })\n    }\n\n    fn fallback_on_interrupt(&self) -> Option<Identity> {\n        ProvideCredentials::fallback_on_interrupt(self).map(|creds| creds.into())\n    }\n\n    fn cache_partition(&self) -> Option<IdentityCachePartition> {\n        Some(self.1)\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use aws_smithy_runtime_api::client::{\n        identity::SharedIdentityResolver, runtime_components::RuntimeComponentsBuilder,\n    };\n\n    use crate::attributes::AccountId;\n\n    use super::*;\n\n    #[test]\n    fn reuses_cache_partition() {\n        let creds = Credentials::new(\"AKID\", \"SECRET\", None, None, \"test\");\n        let provider = SharedCredentialsProvider::new(creds);\n        let partition = provider.cache_partition();\n        assert!(partition.is_some());\n\n        let identity_resolver = SharedIdentityResolver::new(provider);\n        let identity_partition = identity_resolver.cache_partition();\n\n        assert!(partition.unwrap() == identity_partition);\n    }\n\n    #[tokio::test]\n    async fn account_id_can_be_retrieved_from_identity() {\n        let expected_account_id = \"012345678901\";\n        let creds = Credentials::builder()\n            .access_key_id(\"AKID\")\n            .secret_access_key(\"SECRET\")\n            .account_id(expected_account_id)\n            .provider_name(\"test\")\n            .build();\n        let provider = SharedCredentialsProvider::new(creds);\n        let identity = provider\n            .resolve_identity(\n                &RuntimeComponentsBuilder::for_tests().build().unwrap(),\n                &ConfigBag::base(),\n            )\n            .await\n            .unwrap();\n        let actual = identity.property::<AccountId>().unwrap();\n        assert_eq!(expected_account_id, actual.as_str());\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-credential-types/src/provider/error.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Credentials provider errors\n\nuse std::error::Error;\nuse std::fmt;\nuse std::time::Duration;\n\n/// Details for [`CredentialsError::CredentialsNotLoaded`]\n#[derive(Debug)]\npub struct CredentialsNotLoaded {\n    source: Option<Box<dyn Error + Send + Sync + 'static>>,\n}\n\n/// Details for [`CredentialsError::ProviderTimedOut`] or [`TokenError::ProviderTimedOut`]\n#[derive(Debug)]\npub struct ProviderTimedOut {\n    timeout_duration: Duration,\n}\n\nimpl ProviderTimedOut {\n    /// Returns the maximum allowed timeout duration that was exceeded\n    pub fn timeout_duration(&self) -> Duration {\n        self.timeout_duration\n    }\n}\n\n/// Details for [`CredentialsError::InvalidConfiguration`] or [`TokenError::InvalidConfiguration`]\n#[derive(Debug)]\npub struct InvalidConfiguration {\n    source: Box<dyn Error + Send + Sync + 'static>,\n}\n\n/// Details for [`CredentialsError::ProviderError`] or [`TokenError::ProviderError`]\n#[derive(Debug)]\npub struct ProviderError {\n    source: Box<dyn Error + Send + Sync + 'static>,\n}\n\n/// Details for [`CredentialsError::Unhandled`] or [`TokenError::Unhandled`]\n#[derive(Debug)]\npub struct Unhandled {\n    source: Box<dyn Error + Send + Sync + 'static>,\n}\n\n/// Error returned when credentials failed to load.\n#[derive(Debug)]\n#[non_exhaustive]\npub enum CredentialsError {\n    /// No credentials were available for this provider\n    CredentialsNotLoaded(CredentialsNotLoaded),\n\n    /// Loading credentials from this provider exceeded the maximum allowed duration\n    ProviderTimedOut(ProviderTimedOut),\n\n    /// The provider was given an invalid configuration\n    ///\n    /// For example:\n    /// - syntax error in ~/.aws/config\n    /// - assume role profile that forms an infinite loop\n    InvalidConfiguration(InvalidConfiguration),\n\n    /// The provider experienced an error during credential resolution\n    ///\n    /// This may include errors like a 503 from STS or a file system error when attempting to\n    /// read a configuration file.\n    ProviderError(ProviderError),\n\n    /// An unexpected error occurred during credential resolution\n    ///\n    /// If the error is something that can occur during expected usage of a provider, `ProviderError`\n    /// should be returned instead. Unhandled is reserved for exceptional cases, for example:\n    /// - Returned data not UTF-8\n    /// - A provider returns data that is missing required fields\n    Unhandled(Unhandled),\n}\n\nimpl CredentialsError {\n    /// The credentials provider did not provide credentials\n    ///\n    /// This error indicates the credentials provider was not enable or no configuration was set.\n    /// This contrasts with [`invalid_configuration`](CredentialsError::InvalidConfiguration), indicating\n    /// that the provider was configured in some way, but certain settings were invalid.\n    pub fn not_loaded(source: impl Into<Box<dyn Error + Send + Sync + 'static>>) -> Self {\n        CredentialsError::CredentialsNotLoaded(CredentialsNotLoaded {\n            source: Some(source.into()),\n        })\n    }\n\n    /// The credentials provider did not provide credentials\n    ///\n    /// This error indicates the credentials provider was not enable or no configuration was set.\n    /// This contrasts with [`invalid_configuration`](CredentialsError::InvalidConfiguration), indicating\n    /// that the provider was configured in some way, but certain settings were invalid.\n    pub fn not_loaded_no_source() -> Self {\n        CredentialsError::CredentialsNotLoaded(CredentialsNotLoaded { source: None })\n    }\n\n    /// An unexpected error occurred loading credentials from this provider\n    ///\n    /// Unhandled errors should not occur during normal operation and should be reserved for exceptional\n    /// cases, such as a JSON API returning an output that was not parseable as JSON.\n    pub fn unhandled(source: impl Into<Box<dyn Error + Send + Sync + 'static>>) -> Self {\n        Self::Unhandled(Unhandled {\n            source: source.into(),\n        })\n    }\n\n    /// The credentials provider returned an error\n    ///\n    /// Provider errors may occur during normal use of a credentials provider, e.g. a 503 when\n    /// retrieving credentials from IMDS.\n    pub fn provider_error(source: impl Into<Box<dyn Error + Send + Sync + 'static>>) -> Self {\n        Self::ProviderError(ProviderError {\n            source: source.into(),\n        })\n    }\n\n    /// The provided configuration for a provider was invalid\n    pub fn invalid_configuration(\n        source: impl Into<Box<dyn Error + Send + Sync + 'static>>,\n    ) -> Self {\n        Self::InvalidConfiguration(InvalidConfiguration {\n            source: source.into(),\n        })\n    }\n\n    /// The credentials provider did not provide credentials within an allotted duration\n    pub fn provider_timed_out(timeout_duration: Duration) -> Self {\n        Self::ProviderTimedOut(ProviderTimedOut { timeout_duration })\n    }\n}\n\nimpl fmt::Display for CredentialsError {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        match self {\n            CredentialsError::CredentialsNotLoaded(_) => {\n                write!(f, \"the credential provider was not enabled\")\n            }\n            CredentialsError::ProviderTimedOut(details) => write!(\n                f,\n                \"credentials provider timed out after {} seconds\",\n                details.timeout_duration.as_secs()\n            ),\n            CredentialsError::InvalidConfiguration(_) => {\n                write!(f, \"the credentials provider was not properly configured\")\n            }\n            CredentialsError::ProviderError(_) => {\n                write!(f, \"an error occurred while loading credentials\")\n            }\n            CredentialsError::Unhandled(_) => {\n                write!(f, \"unexpected credentials error\")\n            }\n        }\n    }\n}\n\nimpl Error for CredentialsError {\n    fn source(&self) -> Option<&(dyn Error + 'static)> {\n        match self {\n            CredentialsError::CredentialsNotLoaded(details) => {\n                details.source.as_ref().map(|s| s.as_ref() as _)\n            }\n            CredentialsError::ProviderTimedOut(_) => None,\n            CredentialsError::InvalidConfiguration(details) => Some(details.source.as_ref() as _),\n            CredentialsError::ProviderError(details) => Some(details.source.as_ref() as _),\n            CredentialsError::Unhandled(details) => Some(details.source.as_ref() as _),\n        }\n    }\n}\n\n/// Details for [`TokenError::TokenNotLoaded`]\n#[derive(Debug)]\npub struct TokenNotLoaded {\n    source: Box<dyn Error + Send + Sync + 'static>,\n}\n\n/// Error returned when an access token provider fails to provide an access token.\n#[derive(Debug)]\npub enum TokenError {\n    /// This provider couldn't provide a token.\n    TokenNotLoaded(TokenNotLoaded),\n\n    /// Loading a token from this provider exceeded the maximum allowed time.\n    ProviderTimedOut(ProviderTimedOut),\n\n    /// The provider was given invalid configuration.\n    ///\n    /// For example, a syntax error in `~/.aws/config`.\n    InvalidConfiguration(InvalidConfiguration),\n\n    /// The provider experienced an error during credential resolution.\n    ProviderError(ProviderError),\n\n    /// An unexpected error occurred during token resolution.\n    ///\n    /// If the error is something that can occur during expected usage of a provider, `ProviderError`\n    /// should be returned instead. Unhandled is reserved for exceptional cases, for example:\n    /// - Returned data not UTF-8\n    /// - A provider returns data that is missing required fields\n    Unhandled(Unhandled),\n}\n\nimpl TokenError {\n    /// The access token provider couldn't provide a token.\n    ///\n    /// This error indicates the token provider was not enable or no configuration was set.\n    /// This contrasts with [`invalid_configuration`](TokenError::InvalidConfiguration), indicating\n    /// that the provider was configured in some way, but certain settings were invalid.\n    pub fn not_loaded(source: impl Into<Box<dyn Error + Send + Sync + 'static>>) -> Self {\n        TokenError::TokenNotLoaded(TokenNotLoaded {\n            source: source.into(),\n        })\n    }\n\n    /// An unexpected error occurred loading an access token from this provider.\n    ///\n    /// Unhandled errors should not occur during normal operation and should be reserved for exceptional\n    /// cases, such as a JSON API returning an output that was not parseable as JSON.\n    pub fn unhandled(source: impl Into<Box<dyn Error + Send + Sync + 'static>>) -> Self {\n        Self::Unhandled(Unhandled {\n            source: source.into(),\n        })\n    }\n\n    /// The access token provider returned an error.\n    pub fn provider_error(source: impl Into<Box<dyn Error + Send + Sync + 'static>>) -> Self {\n        Self::ProviderError(ProviderError {\n            source: source.into(),\n        })\n    }\n\n    /// The provided configuration for a provider was invalid.\n    pub fn invalid_configuration(\n        source: impl Into<Box<dyn Error + Send + Sync + 'static>>,\n    ) -> Self {\n        Self::InvalidConfiguration(InvalidConfiguration {\n            source: source.into(),\n        })\n    }\n\n    /// The access token provider did not provide a token within an allotted amount of time.\n    pub fn provider_timed_out(timeout_duration: Duration) -> Self {\n        Self::ProviderTimedOut(ProviderTimedOut { timeout_duration })\n    }\n}\n\nimpl fmt::Display for TokenError {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        match self {\n            TokenError::TokenNotLoaded(_) => {\n                write!(f, \"the access token provider was not enabled\")\n            }\n            TokenError::ProviderTimedOut(details) => write!(\n                f,\n                \"access token provider timed out after {} seconds\",\n                details.timeout_duration.as_secs()\n            ),\n            TokenError::InvalidConfiguration(_) => {\n                write!(f, \"the access token provider was not properly configured\")\n            }\n            TokenError::ProviderError(_) => {\n                write!(f, \"an error occurred while loading an access token\")\n            }\n            TokenError::Unhandled(_) => {\n                write!(f, \"unexpected access token providererror\")\n            }\n        }\n    }\n}\n\nimpl Error for TokenError {\n    fn source(&self) -> Option<&(dyn Error + 'static)> {\n        match self {\n            TokenError::TokenNotLoaded(details) => Some(details.source.as_ref() as _),\n            TokenError::ProviderTimedOut(_) => None,\n            TokenError::InvalidConfiguration(details) => Some(details.source.as_ref() as _),\n            TokenError::ProviderError(details) => Some(details.source.as_ref() as _),\n            TokenError::Unhandled(details) => Some(details.source.as_ref() as _),\n        }\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-credential-types/src/provider/future.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Convenience `ProvideCredentials` struct that implements the `ProvideCredentials` trait.\n\nuse crate::provider::token::Result as TokenResult;\nuse crate::provider::Result as CredsResult;\nuse aws_smithy_async::future::now_or_later::NowOrLater;\nuse std::future::Future;\nuse std::pin::Pin;\nuse std::task::{Context, Poll};\n\ntype BoxFuture<'a, T> = Pin<Box<dyn Future<Output = T> + Send + 'a>>;\n\n/// Future new-type that `ProvideCredentials::provide_credentials` must return.\n#[derive(Debug)]\npub struct ProvideCredentials<'a>(NowOrLater<CredsResult, BoxFuture<'a, CredsResult>>);\n\nimpl<'a> ProvideCredentials<'a> {\n    /// Creates a `ProvideCredentials` struct from a future.\n    pub fn new(future: impl Future<Output = CredsResult> + Send + 'a) -> Self {\n        ProvideCredentials(NowOrLater::new(Box::pin(future)))\n    }\n\n    /// Creates a `ProvideCredentials` struct from a resolved credentials value.\n    pub fn ready(credentials: CredsResult) -> Self {\n        ProvideCredentials(NowOrLater::ready(credentials))\n    }\n}\n\nimpl Future for ProvideCredentials<'_> {\n    type Output = CredsResult;\n\n    fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {\n        Pin::new(&mut self.0).poll(cx)\n    }\n}\n\n/// Future new-type that `ProvideToken::provide_token` must return.\n#[derive(Debug)]\npub struct ProvideToken<'a>(NowOrLater<TokenResult, BoxFuture<'a, TokenResult>>);\n\nimpl<'a> ProvideToken<'a> {\n    /// Creates a `ProvideToken` struct from a future.\n    pub fn new(future: impl Future<Output = TokenResult> + Send + 'a) -> Self {\n        ProvideToken(NowOrLater::new(Box::pin(future)))\n    }\n\n    /// Creates a `ProvideToken` struct from a resolved credentials value.\n    pub fn ready(credentials: TokenResult) -> Self {\n        ProvideToken(NowOrLater::ready(credentials))\n    }\n}\n\nimpl Future for ProvideToken<'_> {\n    type Output = TokenResult;\n\n    fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {\n        Pin::new(&mut self.0).poll(cx)\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-credential-types/src/provider/token.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! AWS Access Tokens for SSO\n//!\n//! When authenticating with an AWS Builder ID, single sign-on (SSO) will provide\n//! an access token that can then be used to authenticate with services such as\n//! Code Catalyst.\n//!\n//! This module provides the [`ProvideToken`] trait that is used to configure\n//! token providers in the SDK config.\n\nuse crate::{provider::error::TokenError, provider::future, Token};\nuse aws_smithy_runtime_api::client::{\n    identity::{IdentityCachePartition, IdentityFuture, ResolveIdentity},\n    runtime_components::RuntimeComponents,\n};\nuse aws_smithy_runtime_api::impl_shared_conversions;\nuse aws_smithy_types::config_bag::ConfigBag;\nuse std::sync::Arc;\n\n/// Result type for token providers\npub type Result = std::result::Result<Token, TokenError>;\n\n/// Access Token Provider\npub trait ProvideToken: Send + Sync + std::fmt::Debug {\n    /// Returns a future that provides an access token.\n    fn provide_token<'a>(&'a self) -> future::ProvideToken<'a>\n    where\n        Self: 'a;\n}\n\nimpl ProvideToken for Token {\n    fn provide_token<'a>(&'a self) -> future::ProvideToken<'a>\n    where\n        Self: 'a,\n    {\n        future::ProvideToken::ready(Ok(self.clone()))\n    }\n}\n\n/// Access token provider wrapper that may be shared.\n///\n/// Newtype wrapper around [`ProvideToken`] that implements `Clone` using an internal `Arc`.\n#[derive(Clone, Debug)]\npub struct SharedTokenProvider(Arc<dyn ProvideToken>, IdentityCachePartition);\n\nimpl SharedTokenProvider {\n    /// Create a new [`SharedTokenProvider`] from [`ProvideToken`].\n    ///\n    /// The given provider will be wrapped in an internal `Arc`. If your\n    /// provider is already in an `Arc`, use `SharedTokenProvider::from(provider)` instead.\n    pub fn new(provider: impl ProvideToken + 'static) -> Self {\n        Self(Arc::new(provider), IdentityCachePartition::new())\n    }\n}\n\nimpl AsRef<dyn ProvideToken> for SharedTokenProvider {\n    fn as_ref(&self) -> &(dyn ProvideToken + 'static) {\n        self.0.as_ref()\n    }\n}\n\nimpl From<Arc<dyn ProvideToken>> for SharedTokenProvider {\n    fn from(provider: Arc<dyn ProvideToken>) -> Self {\n        SharedTokenProvider(provider, IdentityCachePartition::new())\n    }\n}\n\nimpl ProvideToken for SharedTokenProvider {\n    fn provide_token<'a>(&'a self) -> future::ProvideToken<'a>\n    where\n        Self: 'a,\n    {\n        self.0.provide_token()\n    }\n}\n\nimpl ResolveIdentity for SharedTokenProvider {\n    fn resolve_identity<'a>(\n        &'a self,\n        _runtime_components: &'a RuntimeComponents,\n        _config_bag: &'a ConfigBag,\n    ) -> IdentityFuture<'a> {\n        IdentityFuture::new(async move { Ok(self.provide_token().await?.into()) })\n    }\n\n    fn cache_partition(&self) -> Option<IdentityCachePartition> {\n        Some(self.1)\n    }\n}\n\nimpl_shared_conversions!(convert SharedTokenProvider from ProvideToken using SharedTokenProvider::new);\n\n#[cfg(test)]\nmod tests {\n    use aws_smithy_runtime_api::client::identity::SharedIdentityResolver;\n\n    use super::*;\n\n    #[test]\n    fn reuses_cache_partition() {\n        let token = Token::new(\"token\", None);\n        let provider = SharedTokenProvider::new(token);\n        let partition = provider.cache_partition();\n        assert!(partition.is_some());\n\n        let identity_resolver = SharedIdentityResolver::new(provider);\n        let identity_partition = identity_resolver.cache_partition();\n\n        assert!(partition.unwrap() == identity_partition);\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-credential-types/src/provider.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! AWS SDK Credentials\n//!\n//! ## Implementing your own credentials provider\n//!\n//! While for many use cases, using a built in credentials provider is sufficient, you may want to\n//! implement your own credential provider.\n//!\n//! ### With static credentials\n//!\n//! _Note: In general, you should prefer to use the credential providers that come\n//! with the AWS SDK to get credentials. It is __NOT__ secure to hardcode credentials\n//! into your application. Only use this approach if you really know what you're doing._\n//!\n#![cfg_attr(\n    feature = \"hardcoded-credentials\",\n    doc = r##\"\nSee [`Credentials::from_keys`](crate::Credentials::from_keys) for an example on how to use static credentials.\n    \"##\n)]\n#![cfg_attr(\n    not(feature = \"hardcoded-credentials\"),\n    doc = r##\"\nEnable the `hardcoded-credentials` feature to be able to use `Credentials::from_keys` to\nconstruct credentials from hardcoded values.\n    \"##\n)]\n\n//!\n//! ### With dynamically loaded credentials\n//! If you are loading credentials dynamically, you can provide your own implementation of\n//! [`ProvideCredentials`]. Generally, this is best done by\n//! defining an inherent `async fn` on your structure, then calling that method directly from\n//! the trait implementation.\n//! ```rust\n//! use aws_credential_types::{\n//!     provider::{self, future, error::CredentialsError, ProvideCredentials},\n//!     Credentials,\n//! };\n//! #[derive(Debug)]\n//! struct SubprocessCredentialProvider;\n//!\n//! async fn invoke_command(command: &str) -> String {\n//!     // implementation elided...\n//!     # String::from(\"some credentials\")\n//! }\n//!\n//! /// Parse access key and secret from the first two lines of a string\n//! fn parse_credentials(creds: &str) -> provider::Result {\n//!     let mut lines = creds.lines();\n//!     let akid = lines.next().ok_or(CredentialsError::provider_error(\"invalid credentials\"))?;\n//!     let secret = lines.next().ok_or(CredentialsError::provider_error(\"invalid credentials\"))?;\n//!     Ok(Credentials::new(akid, secret, None, None, \"CustomCommand\"))\n//! }\n//!\n//! impl SubprocessCredentialProvider {\n//!     async fn load_credentials(&self) -> provider::Result {\n//!         let creds = invoke_command(\"load-credentials.py\").await;\n//!         parse_credentials(&creds)\n//!     }\n//! }\n//!\n//! impl ProvideCredentials for SubprocessCredentialProvider {\n//!     fn provide_credentials<'a>(&'a self) -> future::ProvideCredentials<'a> where Self: 'a {\n//!         future::ProvideCredentials::new(self.load_credentials())\n//!     }\n//! }\n//! ```\n\nmod credentials;\npub mod error;\npub mod future;\npub mod token;\n\npub use credentials::{ProvideCredentials, Result, SharedCredentialsProvider};\n"
  },
  {
    "path": "aws/rust-runtime/aws-credential-types/src/token_fn.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Types that allow an access token provider to be created from a closure\n\nuse crate::provider::{future, token::ProvideToken};\nuse std::fmt::{self, Debug, Formatter};\nuse std::future::Future;\nuse std::marker::PhantomData;\n\n/// A [`ProvideToken`] implemented by a closure.\n///\n/// See [`provide_token_fn`] for more details.\n#[derive(Copy, Clone)]\npub struct ProvideTokenFn<'c, T> {\n    f: T,\n    phantom: PhantomData<&'c T>,\n}\n\nimpl<T> Debug for ProvideTokenFn<'_, T> {\n    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {\n        write!(f, \"ProvideTokenFn\")\n    }\n}\n\nimpl<'c, T, F> ProvideToken for ProvideTokenFn<'c, T>\nwhere\n    T: Fn() -> F + Send + Sync + 'c,\n    F: Future<Output = crate::provider::token::Result> + Send + 'static,\n{\n    fn provide_token<'a>(&'a self) -> future::ProvideToken<'a>\n    where\n        Self: 'a,\n    {\n        future::ProvideToken::new((self.f)())\n    }\n}\n\n/// Returns a new token provider built with the given closure. This allows you\n/// to create an [`ProvideToken`] implementation from an async block that returns\n/// a [`crate::provider::token::Result`].\n///\n/// # Examples\n///\n/// ```no_run\n/// use aws_credential_types::Token;\n/// use aws_credential_types::token_fn::provide_token_fn;\n///\n/// async fn load_token() -> Token {\n///     todo!()\n/// }\n///\n/// provide_token_fn(|| async {\n///     // Async process to retrieve a token goes here\n///     let token = load_token().await;\n///     Ok(token)\n/// });\n/// ```\npub fn provide_token_fn<'c, T, F>(f: T) -> ProvideTokenFn<'c, T>\nwhere\n    T: Fn() -> F + Send + Sync + 'c,\n    F: Future<Output = crate::provider::token::Result> + Send + 'static,\n{\n    ProvideTokenFn {\n        f,\n        phantom: Default::default(),\n    }\n}\n\n#[cfg(test)]\nmod test {\n    use super::*;\n    use crate::Token;\n\n    fn assert_send_sync<T: Send + Sync>() {}\n\n    #[test]\n    fn creds_are_send_sync() {\n        assert_send_sync::<Token>()\n    }\n\n    // Test that the closure passed to `provide_token_fn` is allowed to borrow things\n    #[tokio::test]\n    async fn provide_token_fn_closure_can_borrow() {\n        fn check_is_str_ref(_input: &str) {}\n        async fn test_async_provider(input: String) -> crate::provider::token::Result {\n            Ok(Token::new(input, None))\n        }\n\n        let things_to_borrow = vec![\"one\".to_string(), \"two\".to_string()];\n\n        let mut providers = Vec::new();\n        for thing in &things_to_borrow {\n            let provider = provide_token_fn(move || {\n                check_is_str_ref(thing);\n                test_async_provider(thing.into())\n            });\n            providers.push(provider);\n        }\n\n        let (two, one) = (providers.pop().unwrap(), providers.pop().unwrap());\n        assert_eq!(\"one\", one.provide_token().await.unwrap().token());\n        assert_eq!(\"two\", two.provide_token().await.unwrap().token());\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-inlineable/Cargo.toml",
    "content": "[package]\nname = \"aws-inlineable\"\nversion = \"0.1.0\"\nauthors = [\"AWS Rust SDK Team <aws-sdk-rust@amazon.com>\", \"Russell Cohen <rcoh@amazon.com>\"]\ndescription = \"\"\"\nThe modules of this crate are intended to be inlined directly into the SDK as needed. The dependencies here\nare to allow this crate to be compilable and testable in isolation, no client code actually takes these dependencies.\n\"\"\"\nedition = \"2021\"\nlicense = \"Apache-2.0\"\npublish = false\nrepository = \"https://github.com/smithy-lang/smithy-rs\"\nrust-version = \"1.91.1\"\n\n[features]\nhttp-1x = [\"aws-smithy-runtime-api/http-1x\"]\n\n[dependencies]\naws-credential-types = { path = \"../aws-credential-types\" }\naws-runtime = { path = \"../aws-runtime\", features = [\"http-1x\"] }\naws-sigv4 = { path = \"../aws-sigv4\" }\naws-types = { path = \"../aws-types\" }\naws-smithy-async = { path = \"../../../rust-runtime/aws-smithy-async\", features = [\"rt-tokio\"] }\naws-smithy-checksums = { path = \"../../../rust-runtime/aws-smithy-checksums\" }\naws-smithy-http = { path = \"../../../rust-runtime/aws-smithy-http\" }\naws-smithy-observability = { path = \"../../../rust-runtime/aws-smithy-observability\" }\naws-smithy-runtime = { path = \"../../../rust-runtime/aws-smithy-runtime\", features = [\"client\"] }\naws-smithy-runtime-api = { path = \"../../../rust-runtime/aws-smithy-runtime-api\", features = [\"client\", \"http-1x\", \"http-02x\"] }\naws-smithy-types = { path = \"../../../rust-runtime/aws-smithy-types\", features = [\"http-body-0-4-x\", \"http-body-1-x\"] }\nbytes = \"1.11.1\"\nfastrand = \"2.3.0\"\nhex = \"0.4.3\"\nhttp = \"0.2.12\"\nhttp-body = \"0.4.6\"\nhttp-1x = { package = \"http\", version = \"1.3.1\" }\nhttp-body-1x = { package = \"http-body\", version = \"1.0.1\" }\nhttp-body-util = \"0.1.3\"\nhmac = \"0.13\"\nlru = \"0.16.3\"\nring = \"0.17.5\"\nsha2 = \"0.11\"\ntokio = \"1.49.0\"\ntracing = \"0.1.44\"\nurl = \"2.5.4\"\n\n\n[dev-dependencies]\naws-credential-types = { path = \"../aws-credential-types\", features = [\"test-util\"] }\naws-smithy-async = { path = \"../../../rust-runtime/aws-smithy-async\", features = [\"test-util\"] }\naws-smithy-http = { path = \"../../../rust-runtime/aws-smithy-http\", features = [\"rt-tokio\"] }\naws-smithy-runtime-api = { path = \"../../../rust-runtime/aws-smithy-runtime-api\", features = [\"test-util\"] }\ntempfile = \"3.16.0\"\ntokio = { version = \"1.49.0\", features = [\"macros\", \"rt\", \"io-util\"] }\ntracing-subscriber = { version = \"0.3.19\", features = [\"env-filter\"] }\ntracing-test = { version = \"0.2\", features = [\"no-env-filter\"] }\n\n[package.metadata.docs.rs]\nall-features = true\ntargets = [\"x86_64-unknown-linux-gnu\"]\ncargo-args = [\"-Zunstable-options\", \"-Zrustdoc-scrape-examples\"]\nrustdoc-args = [\"--cfg\", \"docsrs\"]\n# End of docs.rs metadata\n"
  },
  {
    "path": "aws/rust-runtime/aws-inlineable/LICENSE",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n"
  },
  {
    "path": "aws/rust-runtime/aws-inlineable/README.md",
    "content": "# aws-inlineable\n\nThis is not a \"real\" crate, but instead a collection of Rust files which can be automatically copied into generated\nSDKs. This exists to facilitate writing complex snippets of code that can be tested with normal testing machinery\nwithout needing to create and publish an entire additional crate.\n\n<!-- anchor_start:footer -->\nThis crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly.\n<!-- anchor_end:footer -->\n"
  },
  {
    "path": "aws/rust-runtime/aws-inlineable/external-types.toml",
    "content": "allowed_external_types = [\n    \"aws_types::*\",\n    \"aws_credential_types::*\",\n    \"aws_smithy_http::*\",\n    \"aws_smithy_runtime_api::*\",\n\n    \"http::error::Error\",\n    \"http::header::map::HeaderMap\",\n    \"http::header::value::HeaderValue\",\n    \"http::method::Method\",\n    \"http::request::Request\",\n    \"http::uri::Uri\",\n]\n"
  },
  {
    "path": "aws/rust-runtime/aws-inlineable/src/account_id_endpoint.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_runtime::sdk_feature::AwsSdkFeature;\nuse aws_smithy_runtime_api::{\n    box_error::BoxError,\n    client::interceptors::{\n        context::BeforeSerializationInterceptorContextRef, dyn_dispatch_hint, Intercept,\n    },\n};\nuse aws_smithy_types::config_bag::ConfigBag;\nuse aws_types::endpoint_config::AccountIdEndpointMode;\n\n// Interceptor that tracks AWS SDK features for the account based endpoints.\n#[derive(Debug, Default)]\npub(crate) struct AccountIdEndpointFeatureTrackerInterceptor;\n\n#[dyn_dispatch_hint]\nimpl Intercept for AccountIdEndpointFeatureTrackerInterceptor {\n    fn name(&self) -> &'static str {\n        \"AccountIdEndpointFeatureTrackerInterceptor\"\n    }\n\n    fn read_before_execution(\n        &self,\n        _context: &BeforeSerializationInterceptorContextRef<'_>,\n        cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        match cfg\n            .load::<AccountIdEndpointMode>()\n            .cloned()\n            .unwrap_or_default()\n        {\n            AccountIdEndpointMode::Preferred => {\n                cfg.interceptor_state()\n                    .store_append(AwsSdkFeature::AccountIdModePreferred);\n            }\n            AccountIdEndpointMode::Required => {\n                cfg.interceptor_state()\n                    .store_append(AwsSdkFeature::AccountIdModeRequired);\n            }\n            AccountIdEndpointMode::Disabled => {\n                cfg.interceptor_state()\n                    .store_append(AwsSdkFeature::AccountIdModeDisabled);\n            }\n            otherwise => {\n                ::tracing::warn!(\n                    \"Attempted to track an SDK feature for `{otherwise:?}`, which is not recognized in the current version of the SDK. \\\n                    Consider upgrading to the latest version to ensure that it is properly tracked.\"\n                );\n            }\n        }\n\n        Ok(())\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-inlineable/src/apigateway_interceptors.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n#![allow(dead_code)]\n\nuse aws_smithy_runtime_api::box_error::BoxError;\nuse aws_smithy_runtime_api::client::interceptors::context::BeforeTransmitInterceptorContextMut;\nuse aws_smithy_runtime_api::client::interceptors::{dyn_dispatch_hint, Intercept};\nuse aws_smithy_runtime_api::client::runtime_components::RuntimeComponents;\nuse aws_smithy_types::config_bag::ConfigBag;\nuse http_1x::header::ACCEPT;\nuse http_1x::HeaderValue;\n\n/// Interceptor that adds an Accept header to API Gateway requests.\n#[derive(Debug, Default)]\npub(crate) struct AcceptHeaderInterceptor {\n    _priv: (),\n}\n\n#[dyn_dispatch_hint]\nimpl Intercept for AcceptHeaderInterceptor {\n    fn name(&self) -> &'static str {\n        \"AcceptHeaderInterceptor\"\n    }\n\n    fn modify_before_signing(\n        &self,\n        context: &mut BeforeTransmitInterceptorContextMut<'_>,\n        _runtime_components: &RuntimeComponents,\n        _cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        context\n            .request_mut()\n            .headers_mut()\n            .insert(ACCEPT, HeaderValue::from_static(\"application/json\"));\n        Ok(())\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-inlineable/src/aws_chunked.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n#![allow(dead_code)]\n\nuse std::fmt;\n\nuse aws_runtime::{\n    auth::PayloadSigningOverride,\n    content_encoding::{\n        header::X_AMZ_TRAILER_SIGNATURE, header_value::AWS_CHUNKED, AwsChunkedBody,\n        AwsChunkedBodyOptions, DeferredSigner,\n    },\n};\nuse aws_smithy_runtime_api::{\n    box_error::BoxError,\n    client::{\n        interceptors::{\n            context::BeforeTransmitInterceptorContextMut, dyn_dispatch_hint, Intercept,\n        },\n        runtime_components::RuntimeComponents,\n        runtime_plugin::RuntimePlugin,\n    },\n    http::Request,\n};\nuse aws_smithy_types::{\n    body::SdkBody,\n    config_bag::{ConfigBag, FrozenLayer, Layer, Storable, StoreReplace},\n    error::operation::BuildError,\n};\nuse http_1x::{header, HeaderValue};\nuse http_body_1x::Body;\n\nconst X_AMZ_DECODED_CONTENT_LENGTH: &str = \"x-amz-decoded-content-length\";\nconst TRAILER_SEPARATOR: &[u8] = b\":\";\nconst SIGNATURE_VALUE_LENGTH: usize = 64;\nconst MIN_CHUNK_SIZE_BYTE: usize = 8192;\n\n/// Chunk size configuration for aws-chunked encoding.\n#[derive(Clone, Copy, Debug)]\npub(crate) enum ChunkSize {\n    /// Use the specified chunk size in bytes.\n    Configured(usize),\n    /// Disable chunking by using the entire content-length as a single chunk.\n    DisableChunking,\n}\n\nimpl Storable for ChunkSize {\n    type Storer = StoreReplace<Self>;\n}\n\n/// Runtime plugin for configuring chunk size.\n#[derive(Debug)]\npub(crate) struct ChunkSizeRuntimePlugin {\n    chunk_size: ChunkSize,\n}\n\nimpl ChunkSizeRuntimePlugin {\n    pub(crate) fn new(chunk_size: ChunkSize) -> Self {\n        Self { chunk_size }\n    }\n}\n\nimpl RuntimePlugin for ChunkSizeRuntimePlugin {\n    fn config(&self) -> Option<FrozenLayer> {\n        let mut cfg = Layer::new(\"chunk_size\");\n        cfg.store_put(self.chunk_size);\n        Some(cfg.freeze())\n    }\n}\n\n/// Errors related to constructing aws-chunked encoded HTTP requests.\n#[derive(Debug)]\nenum Error {\n    UnsizedRequestBody,\n    ChunkSizeTooSmall { min: usize, actual: usize },\n}\n\nimpl fmt::Display for Error {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        match self {\n            Self::UnsizedRequestBody => write!(\n                f,\n                \"Only request bodies with a known size can be aws-chunked encoded.\"\n            ),\n            Self::ChunkSizeTooSmall { min, actual } => write!(\n                f,\n                \"Chunk size must be at least {min} bytes, but {actual} was provided.\"\n            ),\n        }\n    }\n}\n\nimpl std::error::Error for Error {}\n\n#[derive(Debug)]\npub(crate) struct AwsChunkedContentEncodingInterceptor;\n\n#[dyn_dispatch_hint]\nimpl Intercept for AwsChunkedContentEncodingInterceptor {\n    fn name(&self) -> &'static str {\n        \"AwsChunkedContentEncodingInterceptor\"\n    }\n\n    fn modify_before_signing(\n        &self,\n        context: &mut BeforeTransmitInterceptorContextMut<'_>,\n        _runtime_components: &RuntimeComponents,\n        cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        if must_not_use_chunked_encoding(context.request(), cfg) {\n            tracing::debug!(\n                \"short-circuiting modify_before_signing because chunked encoding must not be used\"\n            );\n            return Ok(());\n        }\n\n        let original_body_size = if let Some(size) = context\n            .request()\n            .headers()\n            .get(header::CONTENT_LENGTH)\n            .and_then(|s| s.parse::<u64>().ok())\n            .or_else(|| context.request().body().size_hint().exact())\n        {\n            size\n        } else {\n            return Err(BuildError::other(Error::UnsizedRequestBody))?;\n        };\n\n        let sign_during_encoding = context.request().uri().starts_with(\"http:\");\n        let chunked_body_options =\n            create_chunked_body_options(sign_during_encoding, original_body_size, cfg)\n                .map_err(BuildError::other)?;\n\n        let request = context.request_mut();\n        // For for aws-chunked encoding, `x-amz-decoded-content-length` must be set to the original body size.\n        request.headers_mut().insert(\n            header::HeaderName::from_static(X_AMZ_DECODED_CONTENT_LENGTH),\n            HeaderValue::from(original_body_size),\n        );\n        // Other than `x-amz-decoded-content-length`, either `content-length` or `transfer-encoding`\n        // must be set, but not both. For uses cases we support, we know the original body size and\n        // can calculate the encoded size, so we set `content-length`.\n        request.headers_mut().insert(\n            header::CONTENT_LENGTH,\n            HeaderValue::from(chunked_body_options.encoded_length()),\n        );\n        // Setting `content-length` above means we must unset `transfer-encoding`.\n        request.headers_mut().remove(header::TRANSFER_ENCODING);\n        request.headers_mut().append(\n            header::CONTENT_ENCODING,\n            HeaderValue::from_str(AWS_CHUNKED)\n                .map_err(BuildError::other)\n                .expect(\"\\\"aws-chunked\\\" will always be a valid HeaderValue\"),\n        );\n\n        cfg.interceptor_state().store_put(chunked_body_options);\n\n        if sign_during_encoding {\n            let (signer, sender) = DeferredSigner::new();\n            cfg.interceptor_state().store_put(signer);\n            cfg.interceptor_state().store_put(sender);\n            cfg.interceptor_state()\n                .store_put(PayloadSigningOverride::StreamingSignedPayloadTrailer);\n        } else {\n            cfg.interceptor_state()\n                .store_put(PayloadSigningOverride::StreamingUnsignedPayloadTrailer);\n        }\n\n        Ok(())\n    }\n\n    fn modify_before_transmit(\n        &self,\n        ctx: &mut BeforeTransmitInterceptorContextMut<'_>,\n        _runtime_components: &RuntimeComponents,\n        cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        if must_not_use_chunked_encoding(ctx.request(), cfg) {\n            tracing::debug!(\n                \"short-circuiting modify_before_transmit because chunked encoding must not be used\"\n            );\n            return Ok(());\n        }\n\n        let request = ctx.request_mut();\n\n        let mut body = {\n            let body = std::mem::replace(request.body_mut(), SdkBody::taken());\n            let opt = cfg\n                .get_mut_from_interceptor_state::<AwsChunkedBodyOptions>()\n                .ok_or_else(|| {\n                    BuildError::other(\"AwsChunkedBodyOptions missing from config bag\")\n                })?;\n            let aws_chunked_body_options = std::mem::take(opt);\n            let signer = cfg\n                .get_mut_from_interceptor_state::<DeferredSigner>()\n                .map(|s| std::mem::replace(s, DeferredSigner::empty()));\n\n            body.map(move |body| {\n                let body = AwsChunkedBody::new(body, aws_chunked_body_options.clone());\n                let body = if let Some(signer) = &signer {\n                    body.with_signer(signer.clone())\n                } else {\n                    body\n                };\n                SdkBody::from_body_1_x(body)\n            })\n        };\n\n        std::mem::swap(request.body_mut(), &mut body);\n\n        Ok(())\n    }\n}\n\n// Determine if chunked encoding must not be used; returns true when any of the following is true:\n// - If the body is in-memory\n// - If chunked encoding is disabled via `AwsChunkedBodyOptions`\nfn must_not_use_chunked_encoding(request: &Request, cfg: &ConfigBag) -> bool {\n    match (request.body().bytes(), cfg.load::<AwsChunkedBodyOptions>()) {\n        (Some(_), _) => true,\n        (_, Some(options)) if options.disabled() => true,\n        _ => false,\n    }\n}\n\nfn create_chunked_body_options(\n    sign_during_encoding: bool,\n    original_body_size: u64,\n    cfg: &mut ConfigBag,\n) -> Result<AwsChunkedBodyOptions, Error> {\n    let mut chunked_body_options = if let Some(chunked_body_options) =\n        cfg.get_mut_from_interceptor_state::<AwsChunkedBodyOptions>()\n    {\n        let chunked_body_options = std::mem::take(chunked_body_options);\n        chunked_body_options.with_stream_length(original_body_size)\n    } else {\n        AwsChunkedBodyOptions::default().with_stream_length(original_body_size)\n    };\n\n    // Check if user specified a ChunkSize via .customize().chunk_size()\n    if let Some(user_chunk_size) = cfg.load::<ChunkSize>() {\n        match user_chunk_size {\n            ChunkSize::Configured(size) => {\n                chunked_body_options = chunked_body_options.with_chunk_size(*size);\n            }\n            ChunkSize::DisableChunking => {\n                chunked_body_options =\n                    chunked_body_options.with_chunk_size(original_body_size as usize);\n            }\n        }\n    }\n\n    // Validate chunk size\n    let chunk_size = chunked_body_options.chunk_size();\n    if chunk_size < MIN_CHUNK_SIZE_BYTE {\n        return Err(Error::ChunkSizeTooSmall {\n            min: MIN_CHUNK_SIZE_BYTE,\n            actual: chunk_size,\n        });\n    }\n\n    let chunked_body_options = chunked_body_options.signed_chunked_encoding(sign_during_encoding);\n\n    let chunked_body_options = if sign_during_encoding && !chunked_body_options.is_trailer_empty() {\n        // When signing during aws-chunked encoding, append the length for the trailer signature.\n        chunked_body_options.with_trailer_len(\n            (X_AMZ_TRAILER_SIGNATURE.len() + TRAILER_SEPARATOR.len() + SIGNATURE_VALUE_LENGTH)\n                as u64,\n        )\n    } else {\n        chunked_body_options\n    };\n\n    Ok(chunked_body_options)\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use aws_smithy_runtime_api::client::interceptors::context::{\n        BeforeTransmitInterceptorContextMut, Input, InterceptorContext,\n    };\n    use aws_smithy_runtime_api::client::orchestrator::HttpRequest;\n    use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder;\n    use aws_smithy_types::byte_stream::ByteStream;\n    use bytes::BytesMut;\n    use http_body_util::BodyExt;\n    use std::io::Write;\n    use tempfile::NamedTempFile;\n\n    #[tokio::test]\n    async fn test_aws_chunked_body_is_retryable() {\n        let mut file = NamedTempFile::new().unwrap();\n\n        for i in 0..10000 {\n            let line = format!(\"This is a large file created for testing purposes {}\", i);\n            file.as_file_mut().write_all(line.as_bytes()).unwrap();\n        }\n\n        let stream_length = file.as_file().metadata().unwrap().len();\n        let request = HttpRequest::new(\n            ByteStream::read_from()\n                .path(&file)\n                .buffer_size(1024)\n                .build()\n                .await\n                .unwrap()\n                .into_inner(),\n        );\n\n        // ensure original SdkBody is retryable\n        assert!(request.body().try_clone().is_some());\n\n        let interceptor = AwsChunkedContentEncodingInterceptor;\n        let mut cfg = ConfigBag::base();\n        cfg.interceptor_state()\n            .store_put(AwsChunkedBodyOptions::default().with_stream_length(stream_length));\n        let runtime_components = RuntimeComponentsBuilder::for_tests().build().unwrap();\n        let mut ctx = InterceptorContext::new(Input::doesnt_matter());\n        ctx.enter_serialization_phase();\n        let _ = ctx.take_input();\n        ctx.set_request(request);\n        ctx.enter_before_transmit_phase();\n        let mut ctx: BeforeTransmitInterceptorContextMut<'_> = (&mut ctx).into();\n        interceptor\n            .modify_before_transmit(&mut ctx, &runtime_components, &mut cfg)\n            .unwrap();\n\n        // ensure wrapped SdkBody is retryable\n        let mut body = ctx.request().body().try_clone().expect(\"body is retryable\");\n\n        let mut body_data = BytesMut::new();\n        while let Some(Ok(frame)) = body.frame().await {\n            if frame.is_data() {\n                let data = frame.into_data().unwrap();\n                body_data.extend_from_slice(&data);\n            }\n        }\n        let body_str = std::str::from_utf8(&body_data).unwrap();\n        let expected = \"This is a large file created for testing purposes 9999\\r\\n0\\r\\n\\r\\n\";\n        assert!(\n            body_str.ends_with(expected),\n            \"expected '{body_str}' to end with '{expected}'\"\n        );\n    }\n\n    #[tokio::test]\n    async fn test_deferred_signer_and_payload_override_when_not_over_tls() {\n        let mut file = NamedTempFile::new().unwrap();\n        file.as_file_mut().write_all(b\"test data\").unwrap();\n\n        let stream_length = file.as_file().metadata().unwrap().len();\n        let mut request = HttpRequest::new(streaming_body(&file).await);\n        *request.uri_mut() = http_1x::Uri::from_static(\"http://example.com\").into();\n\n        let interceptor = AwsChunkedContentEncodingInterceptor;\n        let mut cfg = ConfigBag::base();\n        cfg.interceptor_state()\n            .store_put(AwsChunkedBodyOptions::default().with_stream_length(stream_length));\n        let runtime_components = RuntimeComponentsBuilder::for_tests().build().unwrap();\n        let mut ctx = InterceptorContext::new(Input::doesnt_matter());\n        ctx.enter_serialization_phase();\n        let _ = ctx.take_input();\n        ctx.set_request(request);\n        ctx.enter_before_transmit_phase();\n        let mut ctx: BeforeTransmitInterceptorContextMut<'_> = (&mut ctx).into();\n        interceptor\n            .modify_before_signing(&mut ctx, &runtime_components, &mut cfg)\n            .unwrap();\n\n        assert!(cfg.load::<DeferredSigner>().is_some());\n        assert!(matches!(\n            cfg.load::<PayloadSigningOverride>(),\n            Some(&PayloadSigningOverride::StreamingSignedPayloadTrailer)\n        ));\n    }\n\n    #[tokio::test]\n    async fn test_short_circuit_modify_before_signing() {\n        let mut ctx = InterceptorContext::new(Input::doesnt_matter());\n        ctx.enter_serialization_phase();\n        let _ = ctx.take_input();\n        let request = HttpRequest::new(SdkBody::from(\n            \"in-memory body, must not use chunked encoding\",\n        ));\n        ctx.set_request(request);\n        ctx.enter_before_transmit_phase();\n        let mut ctx: BeforeTransmitInterceptorContextMut<'_> = (&mut ctx).into();\n\n        let runtime_components = RuntimeComponentsBuilder::for_tests().build().unwrap();\n\n        let mut cfg = ConfigBag::base();\n        cfg.interceptor_state()\n            .store_put(AwsChunkedBodyOptions::default());\n\n        let interceptor = AwsChunkedContentEncodingInterceptor;\n        interceptor\n            .modify_before_signing(&mut ctx, &runtime_components, &mut cfg)\n            .unwrap();\n\n        let request = ctx.request();\n        assert!(request.headers().get(header::CONTENT_ENCODING).is_none());\n        assert!(request\n            .headers()\n            .get(header::HeaderName::from_static(\n                X_AMZ_DECODED_CONTENT_LENGTH\n            ))\n            .is_none());\n    }\n\n    #[tokio::test]\n    async fn test_short_circuit_modify_before_transmit() {\n        let mut ctx = InterceptorContext::new(Input::doesnt_matter());\n        ctx.enter_serialization_phase();\n        let _ = ctx.take_input();\n        let request = HttpRequest::new(SdkBody::from(\n            \"in-memory body, must not use chunked encoding\",\n        ));\n        ctx.set_request(request);\n        ctx.enter_before_transmit_phase();\n        let mut ctx: BeforeTransmitInterceptorContextMut<'_> = (&mut ctx).into();\n\n        let runtime_components = RuntimeComponentsBuilder::for_tests().build().unwrap();\n\n        let mut cfg = ConfigBag::base();\n        // Don't need to set the stream length properly because we expect the body won't be wrapped by `AwsChunkedBody`.\n        cfg.interceptor_state()\n            .store_put(AwsChunkedBodyOptions::default());\n\n        let interceptor = AwsChunkedContentEncodingInterceptor;\n        interceptor\n            .modify_before_transmit(&mut ctx, &runtime_components, &mut cfg)\n            .unwrap();\n\n        let mut body = ctx.request().body().try_clone().expect(\"body is retryable\");\n\n        let mut body_data = BytesMut::new();\n        while let Some(Ok(frame)) = body.frame().await {\n            if frame.is_data() {\n                let data = frame.into_data().unwrap();\n                body_data.extend_from_slice(&data);\n            }\n        }\n        let body_str = std::str::from_utf8(&body_data).unwrap();\n        // Also implies that `assert!(!body_str.ends_with(\"0\\r\\n\\r\\n\"));`, i.e., shouldn't see chunked encoding epilogue.\n        assert_eq!(\"in-memory body, must not use chunked encoding\", body_str);\n    }\n\n    #[test]\n    fn test_must_not_use_chunked_encoding_with_in_memory_body() {\n        let request = HttpRequest::new(SdkBody::from(\"test body\"));\n        let cfg = ConfigBag::base();\n\n        assert!(must_not_use_chunked_encoding(&request, &cfg));\n    }\n\n    async fn streaming_body(path: impl AsRef<std::path::Path>) -> SdkBody {\n        let file = path.as_ref();\n        ByteStream::read_from()\n            .path(&file)\n            .build()\n            .await\n            .unwrap()\n            .into_inner()\n    }\n\n    #[tokio::test]\n    async fn test_must_not_use_chunked_encoding_with_disabled_option() {\n        let file = NamedTempFile::new().unwrap();\n        let request = HttpRequest::new(streaming_body(&file).await);\n        let mut cfg = ConfigBag::base();\n        cfg.interceptor_state()\n            .store_put(AwsChunkedBodyOptions::disable_chunked_encoding());\n\n        assert!(must_not_use_chunked_encoding(&request, &cfg));\n    }\n\n    #[tokio::test]\n    async fn test_chunked_encoding_is_used() {\n        let file = NamedTempFile::new().unwrap();\n        let request = HttpRequest::new(streaming_body(&file).await);\n        let cfg = ConfigBag::base();\n\n        assert!(!must_not_use_chunked_encoding(&request, &cfg));\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-inlineable/src/dsql_auth_token.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Code related to creating signed URLs for logging in to DSQL.\n\nuse aws_credential_types::provider::{ProvideCredentials, SharedCredentialsProvider};\nuse aws_sigv4::http_request;\nuse aws_sigv4::http_request::{SignableBody, SignableRequest, SigningSettings};\nuse aws_sigv4::sign::v4;\nuse aws_smithy_runtime_api::box_error::BoxError;\nuse aws_smithy_runtime_api::client::identity::Identity;\nuse aws_types::region::Region;\nuse std::fmt;\nuse std::fmt::Debug;\nuse std::time::Duration;\n\nconst ACTION: &str = \"DbConnect\";\nconst ACTION_ADMIN: &str = \"DbConnectAdmin\";\nconst SERVICE: &str = \"dsql\";\n\n/// A signer that generates an auth token for a database.\n///\n/// ## Example\n///\n/// ```ignore\n/// use crate::auth_token::{AuthTokenGenerator, Config};\n///\n/// #[tokio::main]\n/// async fn main() {\n///    let cfg = aws_config::load_defaults(BehaviorVersion::latest()).await;\n///    let generator = AuthTokenGenerator::new(\n///        Config::builder()\n///            .hostname(\"peccy.dsql.us-east-1.on.aws\")\n///            .build()\n///            .expect(\"cfg is valid\"),\n///    );\n///    let token = generator.db_connect_admin_auth_token(&cfg).await.unwrap();\n///    println!(\"{token}\");\n/// }\n/// ```\n#[derive(Debug)]\npub struct AuthTokenGenerator {\n    config: Config,\n}\n\n/// An auth token usable as a password for a DSQL database.\n///\n/// This struct can be converted into a `&str` by calling `as_str`\n/// or converted into a `String` by calling `to_string()`.\n#[derive(Clone, Debug, PartialEq, Eq)]\npub struct AuthToken {\n    inner: String,\n}\n\nimpl AuthToken {\n    /// Return the auth token as a `&str`.\n    #[must_use]\n    pub fn as_str(&self) -> &str {\n        &self.inner\n    }\n}\n\nimpl fmt::Display for AuthToken {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        write!(f, \"{}\", self.inner)\n    }\n}\n\nimpl AuthTokenGenerator {\n    /// Given a `Config`, create a new DSQL database login URL signer.\n    pub fn new(config: Config) -> Self {\n        Self { config }\n    }\n\n    /// Return a signed URL usable as an auth token.\n    pub async fn db_connect_auth_token(\n        &self,\n        config: &aws_types::sdk_config::SdkConfig,\n    ) -> Result<AuthToken, BoxError> {\n        self.inner(config, ACTION).await\n    }\n\n    /// Return a signed URL usable as an admin auth token.\n    pub async fn db_connect_admin_auth_token(\n        &self,\n        config: &aws_types::sdk_config::SdkConfig,\n    ) -> Result<AuthToken, BoxError> {\n        self.inner(config, ACTION_ADMIN).await\n    }\n\n    async fn inner(\n        &self,\n        config: &aws_types::sdk_config::SdkConfig,\n        action: &str,\n    ) -> Result<AuthToken, BoxError> {\n        let credentials = self\n            .config\n            .credentials()\n            .or(config.credentials_provider())\n            .ok_or(\"credentials are required to create a signed URL for DSQL\")?\n            .provide_credentials()\n            .await?;\n        let identity: Identity = credentials.into();\n        let region = self\n            .config\n            .region()\n            .or(config.region())\n            .ok_or(\"a region is required\")?;\n        let time = config.time_source().ok_or(\"a time source is required\")?;\n\n        let mut signing_settings = SigningSettings::default();\n        signing_settings.expires_in =\n            Some(Duration::from_secs(self.config.expires_in().unwrap_or(900)));\n        signing_settings.signature_location = http_request::SignatureLocation::QueryParams;\n\n        let signing_params = v4::SigningParams::builder()\n            .identity(&identity)\n            .region(region.as_ref())\n            .name(SERVICE)\n            .time(time.now())\n            .settings(signing_settings)\n            .build()?;\n\n        let url = format!(\"https://{}/?Action={}\", self.config.hostname(), action);\n        let signable_request =\n            SignableRequest::new(\"GET\", &url, std::iter::empty(), SignableBody::Bytes(&[]))\n                .expect(\"signable request\");\n\n        let (signing_instructions, _signature) =\n            http_request::sign(signable_request, &signing_params.into())?.into_parts();\n\n        let mut url = url::Url::parse(&url).unwrap();\n        for (name, value) in signing_instructions.params() {\n            url.query_pairs_mut().append_pair(name, value);\n        }\n        let inner = url.to_string().split_off(\"https://\".len());\n\n        Ok(AuthToken { inner })\n    }\n}\n\n/// Configuration for a DSQL auth URL signer.\n#[derive(Debug, Clone)]\npub struct Config {\n    /// The AWS credentials to sign requests with.\n    ///\n    /// Uses the default credential provider chain if not specified.\n    credentials: Option<SharedCredentialsProvider>,\n\n    /// The hostname of the database to connect to.\n    hostname: String,\n\n    /// The region the database is located in. Uses the region inferred from the runtime if omitted.\n    region: Option<Region>,\n\n    /// The number of seconds the signed URL should be valid for.\n    expires_in: Option<u64>,\n}\n\nimpl Config {\n    /// Create a new `SignerConfigBuilder`.\n    pub fn builder() -> ConfigBuilder {\n        ConfigBuilder::default()\n    }\n\n    /// The AWS credentials to sign requests with.\n    pub fn credentials(&self) -> Option<SharedCredentialsProvider> {\n        self.credentials.clone()\n    }\n\n    /// The hostname of the database to connect to.\n    pub fn hostname(&self) -> &str {\n        &self.hostname\n    }\n\n    /// The region to sign requests with.\n    pub fn region(&self) -> Option<&Region> {\n        self.region.as_ref()\n    }\n\n    /// The number of seconds the signed URL should be valid for.\n    pub fn expires_in(&self) -> Option<u64> {\n        self.expires_in\n    }\n}\n\n/// A builder for [`Config`]s.\n#[derive(Debug, Default)]\npub struct ConfigBuilder {\n    /// The AWS credentials to create the auth token with.\n    ///\n    /// Uses the default credential provider chain if not specified.\n    credentials: Option<SharedCredentialsProvider>,\n\n    /// The hostname of the database to connect to.\n    hostname: Option<String>,\n\n    /// The region the database is located in. Uses the region inferred from the runtime if omitted.\n    region: Option<Region>,\n\n    /// The number of seconds the auth token should be valid for.\n    expires_in: Option<u64>,\n}\n\nimpl ConfigBuilder {\n    /// The AWS credentials to create the auth token with.\n    ///\n    /// Uses the default credential provider chain if not specified.\n    pub fn credentials(mut self, credentials: impl ProvideCredentials + 'static) -> Self {\n        self.credentials = Some(SharedCredentialsProvider::new(credentials));\n        self\n    }\n\n    /// The hostname of the database to connect to.\n    pub fn hostname(mut self, hostname: impl Into<String>) -> Self {\n        self.hostname = Some(hostname.into());\n        self\n    }\n\n    /// The region the database is located in.\n    pub fn region(mut self, region: Region) -> Self {\n        self.region = Some(region);\n        self\n    }\n\n    /// The number of seconds the signed URL should be valid for.\n    ///\n    /// Maxes out at 900 seconds.\n    pub fn expires_in(mut self, expires_in: u64) -> Self {\n        self.expires_in = Some(expires_in);\n        self\n    }\n\n    /// Consume this builder, returning an error if required fields are missing.\n    /// Otherwise, return a new `SignerConfig`.\n    pub fn build(self) -> Result<Config, BoxError> {\n        Ok(Config {\n            credentials: self.credentials,\n            hostname: self.hostname.ok_or(\"A hostname is required\")?,\n            region: self.region,\n            expires_in: self.expires_in,\n        })\n    }\n}\n\n#[cfg(test)]\nmod test {\n    use super::{AuthTokenGenerator, Config};\n    use aws_credential_types::provider::SharedCredentialsProvider;\n    use aws_credential_types::Credentials;\n    use aws_smithy_async::test_util::ManualTimeSource;\n    use aws_types::region::Region;\n    use aws_types::SdkConfig;\n    use std::time::{Duration, UNIX_EPOCH};\n\n    #[tokio::test]\n    async fn signing_works() {\n        let time_source = ManualTimeSource::new(UNIX_EPOCH + Duration::from_secs(1724716800));\n        let sdk_config = SdkConfig::builder()\n            .credentials_provider(SharedCredentialsProvider::new(Credentials::new(\n                \"akid\", \"secret\", None, None, \"test\",\n            )))\n            .time_source(time_source)\n            .build();\n        let signer = AuthTokenGenerator::new(\n            Config::builder()\n                .hostname(\"peccy.dsql.us-east-1.on.aws\")\n                .region(Region::new(\"us-east-1\"))\n                .expires_in(450)\n                .build()\n                .unwrap(),\n        );\n\n        let signed_url = signer.db_connect_auth_token(&sdk_config).await.unwrap();\n        assert_eq!(signed_url.as_str(), \"peccy.dsql.us-east-1.on.aws/?Action=DbConnect&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=akid%2F20240827%2Fus-east-1%2Fdsql%2Faws4_request&X-Amz-Date=20240827T000000Z&X-Amz-Expires=450&X-Amz-SignedHeaders=host&X-Amz-Signature=f5f2ad764ca5df44045d4ab6ccecba0eef941b0007e5765885a0b6ed3702a3f8\");\n    }\n\n    #[tokio::test]\n    async fn signing_works_admin() {\n        let time_source = ManualTimeSource::new(UNIX_EPOCH + Duration::from_secs(1724716800));\n        let sdk_config = SdkConfig::builder()\n            .credentials_provider(SharedCredentialsProvider::new(Credentials::new(\n                \"akid\", \"secret\", None, None, \"test\",\n            )))\n            .time_source(time_source)\n            .build();\n        let signer = AuthTokenGenerator::new(\n            Config::builder()\n                .hostname(\"peccy.dsql.us-east-1.on.aws\")\n                .region(Region::new(\"us-east-1\"))\n                .expires_in(450)\n                .build()\n                .unwrap(),\n        );\n\n        let signed_url = signer\n            .db_connect_admin_auth_token(&sdk_config)\n            .await\n            .unwrap();\n        assert_eq!(signed_url.as_str(), \"peccy.dsql.us-east-1.on.aws/?Action=DbConnectAdmin&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=akid%2F20240827%2Fus-east-1%2Fdsql%2Faws4_request&X-Amz-Date=20240827T000000Z&X-Amz-Expires=450&X-Amz-SignedHeaders=host&X-Amz-Signature=267cf8d04d84444f7a62d5bdb40c44bfc6cb13dd6c64fa7f772df6bbaa90fff1\");\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-inlineable/src/endpoint_auth.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::borrow::Cow;\n\nuse aws_smithy_runtime_api::{\n    box_error::BoxError,\n    client::{\n        auth::{AuthSchemeId, AuthSchemeOption},\n        endpoint::{EndpointResolverParams, ResolveEndpoint},\n        runtime_components::RuntimeComponents,\n    },\n};\nuse aws_smithy_types::config_bag::ConfigBag;\n\npub(crate) async fn resolve_endpoint_based_auth_scheme_options<'a>(\n    modeled_auth_scheme_options: &'a [AuthSchemeOption],\n    cfg: &'a ConfigBag,\n    runtime_components: &'a RuntimeComponents,\n) -> Result<Vec<AuthSchemeOption>, BoxError> {\n    let endpoint_params = cfg\n        .load::<EndpointResolverParams>()\n        .expect(\"endpoint resolver params must be set\");\n\n    tracing::debug!(endpoint_params = ?endpoint_params, \"resolving endpoint for auth scheme selection\");\n\n    let endpoint = runtime_components\n        .endpoint_resolver()\n        .resolve_endpoint(endpoint_params)\n        .await?;\n\n    let mut endpoint_auth_scheme_ids = Vec::new();\n\n    // Note that we're not constructing the `properties` for `endpoint_auth_schemes` here—only collecting\n    // auth scheme IDs but not properties. This is because, at this stage, we're only determining which auth schemes will be candidates.\n    // Any `authSchemes` list properties that influence the signing context will be extracted later\n    // in `AuthSchemeEndpointConfig`, and passed by the orchestrator to the signer's `sign_http_request` method.\n    if let Some(aws_smithy_types::Document::Array(endpoint_auth_schemes)) =\n        endpoint.properties().get(\"authSchemes\")\n    {\n        for endpoint_auth_scheme in endpoint_auth_schemes {\n            let scheme_id_str = endpoint_auth_scheme\n                .as_object()\n                .and_then(|object| object.get(\"name\"))\n                .and_then(aws_smithy_types::Document::as_string);\n            if let Some(scheme_id_str) = scheme_id_str {\n                endpoint_auth_scheme_ids\n                    .push(AuthSchemeId::from(Cow::Owned(scheme_id_str.to_owned())));\n            }\n        }\n    }\n\n    Ok(merge_auth_scheme_options(\n        modeled_auth_scheme_options,\n        endpoint_auth_scheme_ids,\n    ))\n}\n\n// Returns a list of merged auth scheme options from `modeled_auth_scheme_options` and `endpoint_auth_scheme_ids`,\n// copying properties from the modeled auth scheme options into the endpoint auth scheme options as they are built.\n//\n// Note: We only extract properties from the modeled auth schemes. Pulling properties from the endpoint auth schemes\n// would result in duplication; they would be added here and again in the `extract_operation_config` function during signing.\nfn merge_auth_scheme_options(\n    modeled_auth_scheme_options: &[AuthSchemeOption],\n    endpoint_auth_scheme_ids: Vec<AuthSchemeId>,\n) -> Vec<AuthSchemeOption> {\n    let (common_auth_scheme_options, model_only_auth_scheme_options): (Vec<_>, Vec<_>) =\n        modeled_auth_scheme_options\n            .iter()\n            .partition(|auth_scheme_option| {\n                endpoint_auth_scheme_ids.contains(auth_scheme_option.scheme_id())\n            });\n\n    let mut endpoint_auth_scheme_options = endpoint_auth_scheme_ids\n        .into_iter()\n        .map(|id| {\n            let modelded = common_auth_scheme_options\n                .iter()\n                .find(|opt| opt.scheme_id() == &id)\n                .cloned();\n            let mut builder = AuthSchemeOption::builder().scheme_id(id);\n            builder.set_properties(modelded.and_then(|m| m.properties()));\n            builder.build().unwrap()\n        })\n        .collect::<Vec<_>>();\n\n    endpoint_auth_scheme_options.extend(model_only_auth_scheme_options.into_iter().cloned());\n\n    endpoint_auth_scheme_options\n}\n\n#[cfg(test)]\nmod tests {\n    use aws_runtime::auth::PayloadSigningOverride;\n    use aws_smithy_types::config_bag::Layer;\n\n    use super::*;\n\n    fn into_auth_scheme_ids<const N: usize>(strs: [&'static str; N]) -> Vec<AuthSchemeId> {\n        strs.into_iter().map(AuthSchemeId::from).collect::<Vec<_>>()\n    }\n\n    fn into_auth_scheme_options<const N: usize>(strs: [&'static str; N]) -> Vec<AuthSchemeOption> {\n        strs.into_iter()\n            .map(|s| AuthSchemeOption::from(AuthSchemeId::from(s)))\n            .collect::<Vec<_>>()\n    }\n\n    #[test]\n    fn merge_auth_scheme_options_basic() {\n        let modeled_auth_scheme_options =\n            into_auth_scheme_options([\"schemeA\", \"schemeX\", \"schemeB\", \"schemeY\"]);\n        let endpoint_auth_scheme_ids = into_auth_scheme_ids([\"schemeY\", \"schemeX\"]);\n        let expected = [\"schemeY\", \"schemeX\", \"schemeA\", \"schemeB\"];\n        let actual =\n            merge_auth_scheme_options(&modeled_auth_scheme_options, endpoint_auth_scheme_ids);\n        assert_eq!(\n            expected.to_vec(),\n            actual\n                .iter()\n                .map(|opt| opt.scheme_id().inner())\n                .collect::<Vec<_>>()\n        );\n    }\n\n    #[test]\n    fn merge_auth_scheme_options_preserving_modeled_auth_properties() {\n        let mut modeled_auth_scheme_options =\n            into_auth_scheme_options([\"schemeA\", \"schemeX\", \"schemeB\"]);\n        modeled_auth_scheme_options.push(\n            AuthSchemeOption::builder()\n                .scheme_id(AuthSchemeId::new(\"schemeY\"))\n                .properties({\n                    let mut layer = Layer::new(\"TestAuthSchemeProperties\");\n                    layer.store_put(PayloadSigningOverride::unsigned_payload());\n                    layer.freeze()\n                })\n                .build()\n                .unwrap(),\n        );\n        let endpoint_auth_scheme_ids = into_auth_scheme_ids([\"schemeY\", \"schemeX\"]);\n        let expected = [\"schemeY\", \"schemeX\", \"schemeA\", \"schemeB\"];\n        let actual =\n            merge_auth_scheme_options(&modeled_auth_scheme_options, endpoint_auth_scheme_ids);\n        assert_eq!(\n            expected.to_vec(),\n            actual\n                .iter()\n                .map(|opt| opt.scheme_id().inner())\n                .collect::<Vec<_>>()\n        );\n        let prop = actual.first().unwrap().properties().unwrap();\n        assert!(matches!(\n            prop.load::<PayloadSigningOverride>().unwrap(),\n            PayloadSigningOverride::UnsignedPayload\n        ));\n    }\n\n    #[test]\n    fn merge_auth_scheme_options_with_empty_endpoint_auth_scheme_options() {\n        let expected = [\"schemeA\", \"schemeX\", \"schemeB\", \"schemeY\"];\n        let modeled_auth_scheme_options = into_auth_scheme_options(expected);\n        let endpoint_auth_scheme_ids = Vec::new();\n        let actual =\n            merge_auth_scheme_options(&modeled_auth_scheme_options, endpoint_auth_scheme_ids);\n        assert_eq!(\n            expected.to_vec(),\n            actual\n                .iter()\n                .map(|opt| opt.scheme_id().inner())\n                .collect::<Vec<_>>()\n        );\n    }\n\n    #[test]\n    fn merge_auth_scheme_options_should_also_include_those_only_in_endpoint_auth_scheme_options() {\n        let modeled_auth_scheme_ids =\n            into_auth_scheme_options([\"schemeA\", \"schemeX\", \"schemeB\", \"schemeY\"]);\n        let endpoint_auth_scheme_ids = into_auth_scheme_ids([\"schemeY\", \"schemeZ\"]);\n        let expected = [\"schemeY\", \"schemeZ\", \"schemeA\", \"schemeX\", \"schemeB\"];\n        let actual = merge_auth_scheme_options(&modeled_auth_scheme_ids, endpoint_auth_scheme_ids);\n        assert_eq!(\n            expected.to_vec(),\n            actual\n                .iter()\n                .map(|opt| opt.scheme_id().inner())\n                .collect::<Vec<_>>()\n        );\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-inlineable/src/endpoint_discovery.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Maintain a cache of discovered endpoints\n\nuse aws_smithy_async::future::BoxFuture;\nuse aws_smithy_async::rt::sleep::{AsyncSleep, SharedAsyncSleep};\nuse aws_smithy_async::time::SharedTimeSource;\nuse aws_smithy_runtime_api::box_error::BoxError;\nuse aws_smithy_runtime_api::client::endpoint::{\n    EndpointFuture, EndpointResolverParams, ResolveEndpoint,\n};\nuse aws_smithy_types::endpoint::Endpoint;\nuse std::fmt::{Debug, Formatter};\nuse std::future::Future;\nuse std::sync::{Arc, Mutex};\nuse std::time::{Duration, SystemTime};\nuse tokio::sync::oneshot::error::TryRecvError;\nuse tokio::sync::oneshot::{Receiver, Sender};\n\n/// Endpoint reloader\n#[must_use]\npub struct ReloadEndpoint {\n    loader: Box<dyn Fn() -> BoxFuture<'static, (Endpoint, SystemTime), BoxError> + Send + Sync>,\n    endpoint: Arc<Mutex<Option<ExpiringEndpoint>>>,\n    error: Arc<Mutex<Option<BoxError>>>,\n    rx: Receiver<()>,\n    sleep: SharedAsyncSleep,\n    time: SharedTimeSource,\n}\n\nimpl Debug for ReloadEndpoint {\n    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {\n        f.debug_struct(\"ReloadEndpoint\").finish()\n    }\n}\n\nimpl ReloadEndpoint {\n    /// Reload the endpoint once\n    pub async fn reload_once(&self) {\n        match (self.loader)().await {\n            Ok((endpoint, expiry)) => {\n                tracing::debug!(\"caching resolved endpoint: {:?}\", (&endpoint, &expiry));\n                *self.endpoint.lock().unwrap() = Some(ExpiringEndpoint { endpoint, expiry })\n            }\n            Err(err) => *self.error.lock().unwrap() = Some(err),\n        }\n    }\n\n    /// An infinite loop task that will reload the endpoint\n    ///\n    /// This task will terminate when the corresponding [`Client`](crate::Client) is dropped.\n    pub async fn reload_task(mut self) {\n        loop {\n            match self.rx.try_recv() {\n                Ok(_) | Err(TryRecvError::Closed) => break,\n                _ => {}\n            }\n            self.reload_increment(self.time.now()).await;\n            self.sleep.sleep(Duration::from_secs(60)).await;\n        }\n    }\n\n    async fn reload_increment(&self, now: SystemTime) {\n        let should_reload = self\n            .endpoint\n            .lock()\n            .unwrap()\n            .as_ref()\n            .map(|e| e.is_expired(now))\n            .unwrap_or(true);\n        if should_reload {\n            tracing::debug!(\"reloading endpoint, previous endpoint was expired\");\n            self.reload_once().await;\n        }\n    }\n}\n\n#[derive(Debug, Clone)]\npub(crate) struct EndpointCache {\n    error: Arc<Mutex<Option<BoxError>>>,\n    endpoint: Arc<Mutex<Option<ExpiringEndpoint>>>,\n    // When the sender is dropped, this allows the reload loop to stop\n    _drop_guard: Arc<Sender<()>>,\n}\n\nimpl ResolveEndpoint for EndpointCache {\n    fn resolve_endpoint<'a>(&'a self, _params: &'a EndpointResolverParams) -> EndpointFuture<'a> {\n        self.resolve_endpoint()\n    }\n}\n\n#[derive(Debug)]\nstruct ExpiringEndpoint {\n    endpoint: Endpoint,\n    expiry: SystemTime,\n}\n\nimpl ExpiringEndpoint {\n    fn is_expired(&self, now: SystemTime) -> bool {\n        tracing::debug!(expiry = ?self.expiry, now = ?now, delta = ?self.expiry.duration_since(now), \"checking expiry status of endpoint\");\n        match self.expiry.duration_since(now) {\n            Err(_) => true,\n            Ok(t) => t < Duration::from_secs(120),\n        }\n    }\n}\n\npub(crate) async fn create_cache<F>(\n    loader_fn: impl Fn() -> F + Send + Sync + 'static,\n    sleep: SharedAsyncSleep,\n    time: SharedTimeSource,\n) -> Result<(EndpointCache, ReloadEndpoint), BoxError>\nwhere\n    F: Future<Output = Result<(Endpoint, SystemTime), BoxError>> + Send + 'static,\n{\n    let error_holder = Arc::new(Mutex::new(None));\n    let endpoint_holder = Arc::new(Mutex::new(None));\n    let (tx, rx) = tokio::sync::oneshot::channel();\n    let cache = EndpointCache {\n        error: error_holder.clone(),\n        endpoint: endpoint_holder.clone(),\n        _drop_guard: Arc::new(tx),\n    };\n    let reloader = ReloadEndpoint {\n        loader: Box::new(move || Box::pin((loader_fn)()) as _),\n        endpoint: endpoint_holder,\n        error: error_holder,\n        rx,\n        sleep,\n        time,\n    };\n    tracing::debug!(\"populating initial endpoint discovery cache\");\n    reloader.reload_once().await;\n    // if we didn't successfully get an endpoint, bail out so the client knows\n    // configuration failed to work\n    cache.resolve_endpoint().await?;\n    Ok((cache, reloader))\n}\n\nimpl EndpointCache {\n    fn resolve_endpoint(&self) -> EndpointFuture<'_> {\n        tracing::trace!(\"resolving endpoint from endpoint discovery cache\");\n        let ep = self\n            .endpoint\n            .lock()\n            .unwrap()\n            .as_ref()\n            .map(|e| e.endpoint.clone())\n            .ok_or_else(|| {\n                let error: Option<BoxError> = self.error.lock().unwrap().take();\n                error.unwrap_or_else(|| \"Failed to resolve endpoint\".into())\n            });\n        EndpointFuture::ready(ep)\n    }\n}\n\n#[cfg(test)]\nmod test {\n    use crate::endpoint_discovery::create_cache;\n    use aws_smithy_async::rt::sleep::{SharedAsyncSleep, TokioSleep};\n    use aws_smithy_async::test_util::controlled_time_and_sleep;\n    use aws_smithy_async::time::{SharedTimeSource, SystemTimeSource, TimeSource};\n    use aws_smithy_types::endpoint::Endpoint;\n    use std::sync::atomic::{AtomicUsize, Ordering};\n    use std::sync::Arc;\n    use std::time::{Duration, UNIX_EPOCH};\n    use tokio::time::timeout;\n\n    fn check_send_v<T: Send>(t: T) -> T {\n        t\n    }\n\n    #[tokio::test]\n    #[allow(unused_must_use)]\n    async fn check_traits() {\n        let (cache, reloader) = create_cache(\n            || async {\n                Ok((\n                    Endpoint::builder().url(\"http://foo.com\").build(),\n                    SystemTimeSource::new().now(),\n                ))\n            },\n            SharedAsyncSleep::new(TokioSleep::new()),\n            SharedTimeSource::new(SystemTimeSource::new()),\n        )\n        .await\n        .unwrap();\n        check_send_v(reloader.reload_task());\n        check_send_v(cache);\n    }\n\n    #[tokio::test]\n    async fn erroring_endpoint_always_reloaded() {\n        let expiry = UNIX_EPOCH + Duration::from_secs(123456789);\n        let ct = Arc::new(AtomicUsize::new(0));\n        let (cache, reloader) = create_cache(\n            move || {\n                let shared_ct = ct.clone();\n                shared_ct.fetch_add(1, Ordering::AcqRel);\n                async move {\n                    Ok((\n                        Endpoint::builder()\n                            .url(format!(\"http://foo.com/{shared_ct:?}\"))\n                            .build(),\n                        expiry,\n                    ))\n                }\n            },\n            SharedAsyncSleep::new(TokioSleep::new()),\n            SharedTimeSource::new(SystemTimeSource::new()),\n        )\n        .await\n        .expect(\"returns an endpoint\");\n        assert_eq!(\n            cache.resolve_endpoint().await.expect(\"ok\").url(),\n            \"http://foo.com/1\"\n        );\n        // 120 second buffer\n        reloader\n            .reload_increment(expiry - Duration::from_secs(240))\n            .await;\n        assert_eq!(\n            cache.resolve_endpoint().await.expect(\"ok\").url(),\n            \"http://foo.com/1\"\n        );\n\n        reloader.reload_increment(expiry).await;\n        assert_eq!(\n            cache.resolve_endpoint().await.expect(\"ok\").url(),\n            \"http://foo.com/2\"\n        );\n    }\n\n    #[tokio::test]\n    async fn test_advance_of_task() {\n        let expiry = UNIX_EPOCH + Duration::from_secs(123456789);\n        // expires in 8 minutes\n        let (time, sleep, mut gate) = controlled_time_and_sleep(expiry - Duration::from_secs(239));\n        let ct = Arc::new(AtomicUsize::new(0));\n        let (cache, reloader) = create_cache(\n            move || {\n                let shared_ct = ct.clone();\n                shared_ct.fetch_add(1, Ordering::AcqRel);\n                async move {\n                    Ok((\n                        Endpoint::builder()\n                            .url(format!(\"http://foo.com/{shared_ct:?}\"))\n                            .build(),\n                        expiry,\n                    ))\n                }\n            },\n            SharedAsyncSleep::new(sleep.clone()),\n            SharedTimeSource::new(time.clone()),\n        )\n        .await\n        .expect(\"first load success\");\n        let reload_task = tokio::spawn(reloader.reload_task());\n        assert!(!reload_task.is_finished());\n        // expiry occurs after 2 sleeps\n        // t = 0\n        assert_eq!(\n            gate.expect_sleep().await.duration(),\n            Duration::from_secs(60)\n        );\n        assert_eq!(\n            cache.resolve_endpoint().await.unwrap().url(),\n            \"http://foo.com/1\"\n        );\n        // t = 60\n\n        let sleep = gate.expect_sleep().await;\n        // we're still holding the drop guard, so we haven't expired yet.\n        assert_eq!(\n            cache.resolve_endpoint().await.unwrap().url(),\n            \"http://foo.com/1\"\n        );\n        assert_eq!(sleep.duration(), Duration::from_secs(60));\n        sleep.allow_progress();\n        // t = 120\n\n        let sleep = gate.expect_sleep().await;\n        assert_eq!(\n            cache.resolve_endpoint().await.unwrap().url(),\n            \"http://foo.com/2\"\n        );\n        sleep.allow_progress();\n\n        let sleep = gate.expect_sleep().await;\n        drop(cache);\n        sleep.allow_progress();\n\n        timeout(Duration::from_secs(1), reload_task)\n            .await\n            .expect(\"task finishes successfully\")\n            .expect(\"finishes\");\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-inlineable/src/glacier_interceptors.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n// This code is referenced in generated code, so the compiler doesn't realize it is used.\n#![allow(dead_code)]\n\nuse std::fmt;\nuse std::marker::PhantomData;\n\nuse bytes::Bytes;\nuse http_1x::header::HeaderValue;\nuse ring::digest::{Context, Digest, SHA256};\n\nuse aws_runtime::auth::SigV4OperationSigningConfig;\nuse aws_sigv4::http_request::SignableBody;\nuse aws_smithy_runtime_api::box_error::BoxError;\nuse aws_smithy_runtime_api::client::interceptors::context::{\n    BeforeSerializationInterceptorContextMut, BeforeTransmitInterceptorContextMut,\n};\nuse aws_smithy_runtime_api::client::interceptors::{dyn_dispatch_hint, Intercept};\nuse aws_smithy_runtime_api::client::orchestrator::{HttpRequest, LoadedRequestBody};\nuse aws_smithy_runtime_api::client::runtime_components::RuntimeComponents;\nuse aws_smithy_types::byte_stream;\nuse aws_smithy_types::config_bag::ConfigBag;\n\n/// The default account ID when none is set on an input\nconst DEFAULT_ACCOUNT_ID: &str = \"-\";\n\nconst TREE_HASH_HEADER: &str = \"x-amz-sha256-tree-hash\";\nconst X_AMZ_CONTENT_SHA256: &str = \"x-amz-content-sha256\";\nconst API_VERSION_HEADER: &str = \"x-amz-glacier-version\";\n\n/// Adds an account ID autofill method to generated input structs\n///\n/// Some Glacier operations have an account ID field that needs to get defaulted to `-` if not set.\n/// This trait is implemented via codegen customization for those operation inputs so that\n/// the [`GlacierAccountIdAutofillInterceptor`] can do this defaulting.\npub(crate) trait GlacierAccountId: fmt::Debug {\n    /// Returns a mutable reference to the account ID field\n    fn account_id_mut(&mut self) -> &mut Option<String>;\n\n    /// Autofills the account ID with the default if not set\n    fn autofill_account_id(&mut self) {\n        let account_id = self.account_id_mut();\n        if account_id.as_deref().unwrap_or_default().is_empty() {\n            *account_id = Some(DEFAULT_ACCOUNT_ID.into());\n        }\n    }\n}\n\n/// Autofills account ID input fields with a default if no value is set\n#[derive(Debug)]\npub(crate) struct GlacierAccountIdAutofillInterceptor<I> {\n    _phantom: PhantomData<I>,\n}\n\nimpl<I> GlacierAccountIdAutofillInterceptor<I> {\n    /// Constructs a new [`GlacierAccountIdAutofillInterceptor`]\n    pub(crate) fn new() -> Self {\n        Self {\n            _phantom: Default::default(),\n        }\n    }\n}\n\n#[dyn_dispatch_hint]\nimpl<I: GlacierAccountId + Send + Sync + 'static> Intercept\n    for GlacierAccountIdAutofillInterceptor<I>\n{\n    fn name(&self) -> &'static str {\n        \"GlacierAccountIdAutofillInterceptor\"\n    }\n\n    fn modify_before_serialization(\n        &self,\n        context: &mut BeforeSerializationInterceptorContextMut<'_>,\n        _runtime_components: &RuntimeComponents,\n        _cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        let erased_input = context.input_mut();\n        let input: &mut I = erased_input\n            .downcast_mut()\n            .expect(\"typechecked at registration\");\n        input.autofill_account_id();\n        Ok(())\n    }\n}\n\n/// Attaches the `x-amz-glacier-version` header to the request\n#[derive(Debug)]\npub(crate) struct GlacierApiVersionInterceptor {\n    api_version: &'static str,\n}\n\nimpl GlacierApiVersionInterceptor {\n    /// Constructs a new [`GlacierApiVersionInterceptor`] with the given API version.\n    pub(crate) fn new(api_version: &'static str) -> Self {\n        Self { api_version }\n    }\n}\n\n#[dyn_dispatch_hint]\nimpl Intercept for GlacierApiVersionInterceptor {\n    fn name(&self) -> &'static str {\n        \"GlacierApiVersionInterceptor\"\n    }\n\n    fn modify_before_signing(\n        &self,\n        context: &mut BeforeTransmitInterceptorContextMut<'_>,\n        _runtime_components: &RuntimeComponents,\n        _cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        context.request_mut().headers_mut().insert(\n            API_VERSION_HEADER,\n            HeaderValue::from_static(self.api_version),\n        );\n        Ok(())\n    }\n}\n\n/// Adds a glacier tree hash checksum to the HTTP Request\n#[derive(Debug, Default)]\npub(crate) struct GlacierTreeHashHeaderInterceptor {\n    _priv: (),\n}\n\n#[dyn_dispatch_hint]\nimpl Intercept for GlacierTreeHashHeaderInterceptor {\n    fn name(&self) -> &'static str {\n        \"GlacierTreeHashHeaderInterceptor\"\n    }\n\n    fn modify_before_serialization(\n        &self,\n        _context: &mut BeforeSerializationInterceptorContextMut<'_>,\n        _runtime_components: &RuntimeComponents,\n        cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        // Request the request body to be loaded into memory immediately after serialization\n        // so that it can be checksummed before signing and transmit\n        cfg.interceptor_state()\n            .store_put(LoadedRequestBody::Requested);\n        Ok(())\n    }\n\n    fn modify_before_retry_loop(\n        &self,\n        context: &mut BeforeTransmitInterceptorContextMut<'_>,\n        _runtime_components: &RuntimeComponents,\n        cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        let maybe_loaded_body = cfg.load::<LoadedRequestBody>();\n        if let Some(LoadedRequestBody::Loaded(body)) = maybe_loaded_body {\n            let content_sha256 = add_checksum_treehash(context.request_mut(), body)?;\n\n            // Override the signing payload with this precomputed hash\n            let mut signing_config = cfg\n                .load::<SigV4OperationSigningConfig>()\n                .ok_or(\"SigV4OperationSigningConfig not found\")?\n                .clone();\n            signing_config.signing_options.payload_override =\n                Some(SignableBody::Precomputed(content_sha256));\n            cfg.interceptor_state().store_put(signing_config);\n        } else {\n            return Err(\n                \"the request body wasn't loaded into memory before the retry loop, \\\n                so the Glacier tree hash header can't be computed\"\n                    .into(),\n            );\n        }\n        Ok(())\n    }\n}\n\n/// Adds a glacier tree hash checksum to the HTTP Request\n///\n/// This handles two cases:\n/// 1. A body which is retryable: the body will be streamed through a digest calculator, limiting memory usage.\n/// 2. A body which is not retryable: the body will be converted into `Bytes`, then streamed through a digest calculator.\n///\n/// The actual checksum algorithm will first compute a SHA256 checksum for each 1MB chunk. Then, a tree\n/// will be assembled, recursively pairing neighboring chunks and computing their combined checksum. The 1 leftover\n/// chunk (if it exists) is paired at the end.\n///\n/// See <https://docs.aws.amazon.com/amazonglacier/latest/dev/checksum-calculations.html> for more information.\nfn add_checksum_treehash(\n    request: &mut HttpRequest,\n    body: &Bytes,\n) -> Result<String, byte_stream::error::Error> {\n    let (full_body, hashes) = compute_hashes(body, MEGABYTE)?;\n    let tree_hash = hex::encode(compute_hash_tree(hashes));\n    let complete_hash = hex::encode(full_body);\n    if !request.headers().contains_key(TREE_HASH_HEADER) {\n        request.headers_mut().insert(TREE_HASH_HEADER, tree_hash);\n    }\n    if !request.headers().contains_key(X_AMZ_CONTENT_SHA256) {\n        request\n            .headers_mut()\n            .insert(X_AMZ_CONTENT_SHA256, complete_hash.clone());\n    }\n    Ok(complete_hash)\n}\n\nconst MEGABYTE: usize = 1024 * 1024;\nfn compute_hashes(\n    body: &Bytes,\n    chunk_size: usize,\n) -> Result<(Digest, Vec<Digest>), byte_stream::error::Error> {\n    let mut hashes = Vec::new();\n    let mut full_body = Context::new(&SHA256);\n    for chunk in body.chunks(chunk_size) {\n        let mut local = Context::new(&SHA256);\n        local.update(chunk);\n        hashes.push(local.finish());\n\n        full_body.update(chunk);\n    }\n    if hashes.is_empty() {\n        hashes.push(Context::new(&SHA256).finish())\n    }\n    Ok((full_body.finish(), hashes))\n}\n\n/// Compute the glacier tree hash for a vector of hashes.\n///\n/// Adjacent hashes are combined into a single hash. This process occurs recursively until only 1 hash remains.\n///\n/// See <https://docs.aws.amazon.com/amazonglacier/latest/dev/checksum-calculations.html> for more information.\nfn compute_hash_tree(mut hashes: Vec<Digest>) -> Digest {\n    assert!(\n        !hashes.is_empty(),\n        \"even an empty file will produce a digest. this function assumes that hashes is non-empty\"\n    );\n    while hashes.len() > 1 {\n        let next = hashes.chunks(2).map(|chunk| match *chunk {\n            [left, right] => {\n                let mut ctx = Context::new(&SHA256);\n                ctx.update(left.as_ref());\n                ctx.update(right.as_ref());\n                ctx.finish()\n            }\n            [last] => last,\n            _ => unreachable!(),\n        });\n        hashes = next.collect();\n    }\n    hashes[0]\n}\n\n#[cfg(test)]\nmod account_id_autofill_tests {\n    use aws_smithy_runtime_api::client::interceptors::context::{Input, InterceptorContext};\n    use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder;\n\n    use super::*;\n\n    #[test]\n    fn autofill_account_id() {\n        #[derive(Debug)]\n        struct SomeInput {\n            account_id: Option<String>,\n        }\n        impl GlacierAccountId for SomeInput {\n            fn account_id_mut(&mut self) -> &mut Option<String> {\n                &mut self.account_id\n            }\n        }\n\n        let rc = RuntimeComponentsBuilder::for_tests().build().unwrap();\n        let mut cfg = ConfigBag::base();\n        let mut context = InterceptorContext::new(Input::erase(SomeInput { account_id: None }));\n        let mut context = BeforeSerializationInterceptorContextMut::from(&mut context);\n        let interceptor = GlacierAccountIdAutofillInterceptor::<SomeInput>::new();\n        interceptor\n            .modify_before_serialization(&mut context, &rc, &mut cfg)\n            .expect(\"success\");\n        assert_eq!(\n            DEFAULT_ACCOUNT_ID,\n            context\n                .input()\n                .downcast_ref::<SomeInput>()\n                .unwrap()\n                .account_id\n                .as_ref()\n                .expect(\"it is set now\")\n        );\n    }\n}\n\n#[cfg(test)]\nmod api_version_tests {\n    use aws_smithy_runtime_api::client::interceptors::context::{Input, InterceptorContext};\n    use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder;\n\n    use super::*;\n\n    #[test]\n    fn api_version_interceptor() {\n        let rc = RuntimeComponentsBuilder::for_tests().build().unwrap();\n        let mut cfg = ConfigBag::base();\n        let mut context = InterceptorContext::new(Input::doesnt_matter());\n        context.set_request(HttpRequest::empty());\n        let mut context = BeforeTransmitInterceptorContextMut::from(&mut context);\n\n        let interceptor = GlacierApiVersionInterceptor::new(\"some-version\");\n        interceptor\n            .modify_before_signing(&mut context, &rc, &mut cfg)\n            .expect(\"success\");\n\n        assert_eq!(\n            \"some-version\",\n            context\n                .request()\n                .headers()\n                .get(API_VERSION_HEADER)\n                .expect(\"header set\")\n        );\n    }\n}\n\n#[cfg(test)]\nmod treehash_checksum_tests {\n    use super::*;\n\n    #[test]\n    fn compute_digests() {\n        {\n            let body = Bytes::from_static(b\"1234\");\n            let hashes = compute_hashes(&body, 1).expect(\"succeeds\").1;\n            assert_eq!(hashes.len(), 4);\n        }\n        {\n            let body = Bytes::from_static(b\"1234\");\n            let hashes = compute_hashes(&body, 2).expect(\"succeeds\").1;\n            assert_eq!(hashes.len(), 2);\n        }\n        {\n            let body = Bytes::from_static(b\"12345\");\n            let hashes = compute_hashes(&body, 3).expect(\"succeeds\").1;\n            assert_eq!(hashes.len(), 2);\n        }\n        {\n            let body = Bytes::from_static(b\"11221122\");\n            let hashes = compute_hashes(&body, 2).expect(\"succeeds\").1;\n            assert_eq!(hashes[0].as_ref(), hashes[2].as_ref());\n        }\n    }\n\n    #[test]\n    fn empty_body_computes_digest() {\n        let body = Bytes::from_static(b\"\");\n        let (_, hashes) = compute_hashes(&body, 2).expect(\"succeeds\");\n        assert_eq!(hashes.len(), 1);\n    }\n\n    #[test]\n    fn compute_tree_digest() {\n        macro_rules! hash {\n            ($($inp:expr),*) => {\n                {\n                    let mut ctx = ring::digest::Context::new(&ring::digest::SHA256);\n                    $(\n                        ctx.update($inp.as_ref());\n                    )*\n                    ctx.finish()\n                }\n            }\n        }\n        let body = Bytes::from_static(b\"1234567891011\");\n        let (complete, hashes) = compute_hashes(&body, 3).expect(\"succeeds\");\n        assert_eq!(hashes.len(), 5);\n        assert_eq!(complete.as_ref(), hash!(\"1234567891011\").as_ref());\n        let final_digest = compute_hash_tree(hashes);\n        let expected_digest = hash!(\n            hash!(\n                hash!(hash!(\"123\"), hash!(\"456\")),\n                hash!(hash!(\"789\"), hash!(\"101\"))\n            ),\n            hash!(\"1\")\n        );\n        assert_eq!(expected_digest.as_ref(), final_digest.as_ref());\n    }\n\n    #[test]\n    fn hash_value_test() {\n        // the test data consists of an 11 byte sequence, repeated. Since the sequence length is\n        // relatively prime with 1 megabyte, we can ensure that chunks will all have different hashes.\n        let base_seq = b\"01245678912\";\n        let total_size = MEGABYTE * 101 + 500;\n        let mut test_data = vec![];\n        while test_data.len() < total_size {\n            test_data.extend_from_slice(base_seq)\n        }\n        let test_data = Bytes::from(test_data);\n\n        let mut http_req = HttpRequest::empty();\n\n        add_checksum_treehash(&mut http_req, &test_data).expect(\"should succeed\");\n        // hash value verified with AWS CLI\n        assert_eq!(\n            http_req.headers().get(TREE_HASH_HEADER).unwrap(),\n            \"3d417484359fc9f5a3bafd576dc47b8b2de2bf2d4fdac5aa2aff768f2210d386\"\n        );\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-inlineable/src/http_request_checksum.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n#![allow(dead_code)]\n\n//! Interceptor for handling Smithy `@httpChecksum` request checksumming with AWS SigV4\n\nuse crate::presigning::PresigningMarker;\nuse aws_runtime::content_encoding::AwsChunkedBodyOptions;\nuse aws_smithy_checksums::body::calculate;\nuse aws_smithy_checksums::body::ChecksumCache;\nuse aws_smithy_checksums::http::HttpChecksum;\nuse aws_smithy_checksums::ChecksumAlgorithm;\nuse aws_smithy_runtime::client::sdk_feature::SmithySdkFeature;\nuse aws_smithy_runtime_api::box_error::BoxError;\nuse aws_smithy_runtime_api::client::interceptors::context::{\n    BeforeSerializationInterceptorContextMut, BeforeTransmitInterceptorContextMut, Input,\n};\nuse aws_smithy_runtime_api::client::interceptors::{dyn_dispatch_hint, Intercept};\nuse aws_smithy_runtime_api::client::runtime_components::RuntimeComponents;\nuse aws_smithy_runtime_api::http::Request;\nuse aws_smithy_types::body::SdkBody;\nuse aws_smithy_types::checksum_config::RequestChecksumCalculation;\nuse aws_smithy_types::config_bag::{ConfigBag, Storable, StoreReplace};\nuse http_1x::{HeaderMap, HeaderName};\nuse std::str::FromStr;\nuse std::sync::atomic::AtomicBool;\nuse std::sync::atomic::Ordering;\nuse std::sync::Arc;\nuse std::{fmt, mem};\n\n/// Errors related to constructing checksum-validated HTTP requests\n#[derive(Debug)]\npub(crate) enum Error {\n    ChecksumHeadersAreUnsupportedForStreamingBody,\n}\n\nimpl fmt::Display for Error {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        match self {\n            Self::ChecksumHeadersAreUnsupportedForStreamingBody => write!(\n                f,\n                \"Checksum header insertion is only supported for non-streaming HTTP bodies. \\\n                   To checksum validate a streaming body, the checksums must be sent as trailers.\"\n            ),\n        }\n    }\n}\n\nimpl std::error::Error for Error {}\n\n#[derive(Debug, Default, Clone)]\nstruct RequestChecksumInterceptorState {\n    /// The checksum algorithm to calculate\n    checksum_algorithm: Option<String>,\n    /// This value is set in the model on the `httpChecksum` trait\n    request_checksum_required: bool,\n    calculate_checksum: Arc<AtomicBool>,\n    checksum_cache: ChecksumCache,\n}\n\nimpl RequestChecksumInterceptorState {\n    fn checksum_algorithm(&self) -> Option<ChecksumAlgorithm> {\n        self.checksum_algorithm\n            .as_ref()\n            .and_then(|s| ChecksumAlgorithm::from_str(s.as_str()).ok())\n    }\n\n    fn calculate_checksum(&self) -> bool {\n        self.calculate_checksum.load(Ordering::SeqCst)\n    }\n}\n\nimpl Storable for RequestChecksumInterceptorState {\n    type Storer = StoreReplace<Self>;\n}\n\ntype CustomDefaultFn = Box<\n    dyn Fn(Option<ChecksumAlgorithm>, &ConfigBag) -> Option<ChecksumAlgorithm>\n        + Send\n        + Sync\n        + 'static,\n>;\n\npub(crate) struct DefaultRequestChecksumOverride {\n    custom_default: CustomDefaultFn,\n}\nimpl fmt::Debug for DefaultRequestChecksumOverride {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        f.debug_struct(\"DefaultRequestChecksumOverride\").finish()\n    }\n}\nimpl Storable for DefaultRequestChecksumOverride {\n    type Storer = StoreReplace<Self>;\n}\nimpl DefaultRequestChecksumOverride {\n    pub(crate) fn new<F>(custom_default: F) -> Self\n    where\n        F: Fn(Option<ChecksumAlgorithm>, &ConfigBag) -> Option<ChecksumAlgorithm>\n            + Send\n            + Sync\n            + 'static,\n    {\n        Self {\n            custom_default: Box::new(custom_default),\n        }\n    }\n    pub(crate) fn custom_default(\n        &self,\n        original: Option<ChecksumAlgorithm>,\n        config_bag: &ConfigBag,\n    ) -> Option<ChecksumAlgorithm> {\n        (self.custom_default)(original, config_bag)\n    }\n}\n\npub(crate) struct RequestChecksumInterceptor<AP, CM> {\n    algorithm_provider: AP,\n    checksum_mutator: CM,\n}\n\nimpl<AP, CM> fmt::Debug for RequestChecksumInterceptor<AP, CM> {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        f.debug_struct(\"RequestChecksumInterceptor\").finish()\n    }\n}\n\nimpl<AP, CM> RequestChecksumInterceptor<AP, CM> {\n    pub(crate) fn new(algorithm_provider: AP, checksum_mutator: CM) -> Self {\n        Self {\n            algorithm_provider,\n            checksum_mutator,\n        }\n    }\n}\n\n#[dyn_dispatch_hint]\nimpl<AP, CM> Intercept for RequestChecksumInterceptor<AP, CM>\nwhere\n    AP: Fn(&Input) -> (Option<String>, bool) + Send + Sync,\n    CM: Fn(&mut Request, &ConfigBag) -> Result<bool, BoxError> + Send + Sync,\n{\n    fn name(&self) -> &'static str {\n        \"RequestChecksumInterceptor\"\n    }\n\n    fn modify_before_serialization(\n        &self,\n        context: &mut BeforeSerializationInterceptorContextMut<'_>,\n        _runtime_components: &RuntimeComponents,\n        cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        let (checksum_algorithm, request_checksum_required) =\n            (self.algorithm_provider)(context.input());\n\n        cfg.interceptor_state()\n            .store_put(RequestChecksumInterceptorState {\n                checksum_algorithm,\n                request_checksum_required,\n                checksum_cache: ChecksumCache::new(),\n                calculate_checksum: Arc::new(AtomicBool::new(false)),\n            });\n\n        Ok(())\n    }\n\n    /// Setup state for calculating checksum and setting UA features\n    fn modify_before_retry_loop(\n        &self,\n        context: &mut BeforeTransmitInterceptorContextMut<'_>,\n        _runtime_components: &RuntimeComponents,\n        cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        let user_set_checksum_value = (self.checksum_mutator)(context.request_mut(), cfg)\n            .expect(\"Checksum header mutation should not fail\");\n        let is_presigned = cfg.load::<PresigningMarker>().is_some();\n\n        // If the user manually set a checksum header or if this is a presigned request, we short circuit\n        if user_set_checksum_value || is_presigned {\n            // Disable aws-chunked encoding since either the user has set a custom checksum\n            cfg.interceptor_state()\n                .store_put(AwsChunkedBodyOptions::disable_chunked_encoding());\n\n            return Ok(());\n        }\n\n        let state = cfg\n            .get_mut_from_interceptor_state::<RequestChecksumInterceptorState>()\n            .expect(\"set in `read_before_serialization`\");\n\n        // If the algorithm fails to parse it is not one we support and we error\n        let checksum_algorithm = state\n            .checksum_algorithm\n            .clone()\n            .map(|s| ChecksumAlgorithm::from_str(s.as_str()))\n            .transpose()?;\n\n        let mut state = std::mem::take(state);\n\n        if calculate_checksum(cfg, &state) {\n            state.calculate_checksum.store(true, Ordering::Release);\n\n            // If a checksum override is set in the ConfigBag we use that instead (currently only used by S3Express)\n            // If we have made it this far without a checksum being set we set the default (currently Crc32)\n            let checksum_algorithm =\n                incorporate_custom_default(checksum_algorithm, cfg).unwrap_or_default();\n            state.checksum_algorithm = Some(checksum_algorithm.as_str().to_owned());\n\n            // NOTE: We have to do this in modify_before_retry_loop since UA interceptor also runs\n            // in modify_before_signing but is registered before this interceptor (client level vs operation level).\n            track_metric_for_selected_checksum_algorithm(cfg, &checksum_algorithm);\n        } else {\n            // No checksum calculation needed so disable aws-chunked encoding\n            cfg.interceptor_state()\n                .store_put(AwsChunkedBodyOptions::disable_chunked_encoding());\n        }\n\n        cfg.interceptor_state().store_put(state);\n        Ok(())\n    }\n\n    /// Calculate a checksum and modify the request to do either of the following:\n    /// - include the checksum as a header for signing with in-memory request bodies.\n    /// - include the checksum as a trailer for streaming request bodies.\n    fn modify_before_signing(\n        &self,\n        context: &mut BeforeTransmitInterceptorContextMut<'_>,\n        _runtime_components: &RuntimeComponents,\n        cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        let state = cfg\n            .load::<RequestChecksumInterceptorState>()\n            .expect(\"set in `read_before_serialization`\");\n\n        if !state.calculate_checksum() {\n            return Ok(());\n        }\n\n        let checksum_algorithm = state\n            .checksum_algorithm()\n            .expect(\"set in `modify_before_retry_loop`\");\n        let mut checksum = checksum_algorithm.into_impl();\n\n        match context.request().body().bytes() {\n            Some(data) => {\n                tracing::debug!(\"applying {checksum_algorithm:?} of the request body as a header\");\n                checksum.update(data);\n\n                for (hdr_name, hdr_value) in\n                    get_or_cache_headers(checksum.headers(), &state.checksum_cache).iter()\n                {\n                    context\n                        .request_mut()\n                        .headers_mut()\n                        .insert(hdr_name.clone(), hdr_value.clone());\n                }\n            }\n            None => {\n                tracing::debug!(\"applying {checksum_algorithm:?} of the request body as a trailer\");\n                context.request_mut().headers_mut().insert(\n                    HeaderName::from_static(\"x-amz-trailer\"),\n                    checksum.header_name(),\n                );\n\n                // Take checksum header into account for `AwsChunkedBodyOptions`'s trailer length\n                let trailer_len = HttpChecksum::size(checksum.as_ref());\n                let chunked_body_options =\n                    AwsChunkedBodyOptions::default().with_trailer_len(trailer_len);\n                cfg.interceptor_state().store_put(chunked_body_options);\n            }\n        }\n\n        Ok(())\n    }\n\n    fn modify_before_transmit(\n        &self,\n        ctx: &mut BeforeTransmitInterceptorContextMut<'_>,\n        _runtime_components: &RuntimeComponents,\n        cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        if ctx.request().body().bytes().is_some() {\n            // Nothing to do for non-streaming bodies since the checksum was added to the the header\n            // in `modify_before_signing` and signing has already been done by the time this hook is called.\n            return Ok(());\n        }\n\n        let state = cfg\n            .load::<RequestChecksumInterceptorState>()\n            .expect(\"set in `read_before_serialization`\");\n\n        if !state.calculate_checksum() {\n            return Ok(());\n        }\n\n        let request = ctx.request_mut();\n\n        let mut body = {\n            let body = mem::replace(request.body_mut(), SdkBody::taken());\n\n            let checksum_algorithm = state\n                .checksum_algorithm()\n                .expect(\"set in `modify_before_retry_loop`\");\n            let checksum_cache = state.checksum_cache.clone();\n\n            body.map(move |body| {\n                let checksum = checksum_algorithm.into_impl();\n                let body =\n                    calculate::ChecksumBody::new(body, checksum).with_cache(checksum_cache.clone());\n\n                SdkBody::from_body_1_x(body)\n            })\n        };\n\n        mem::swap(request.body_mut(), &mut body);\n\n        Ok(())\n    }\n}\n\nfn incorporate_custom_default(\n    checksum: Option<ChecksumAlgorithm>,\n    cfg: &ConfigBag,\n) -> Option<ChecksumAlgorithm> {\n    match cfg.load::<DefaultRequestChecksumOverride>() {\n        Some(checksum_override) => checksum_override.custom_default(checksum, cfg),\n        None => checksum,\n    }\n}\n\nfn get_or_cache_headers(\n    calculated_headers: HeaderMap,\n    checksum_cache: &ChecksumCache,\n) -> HeaderMap {\n    if let Some(cached_headers) = checksum_cache.get() {\n        if cached_headers != calculated_headers {\n            tracing::warn!(cached = ?cached_headers, calculated = ?calculated_headers, \"calculated checksum differs from cached checksum!\");\n        }\n        cached_headers\n    } else {\n        checksum_cache.set(calculated_headers.clone());\n        calculated_headers\n    }\n}\n\n// Determine if we actually calculate the checksum\nfn calculate_checksum(cfg: &mut ConfigBag, state: &RequestChecksumInterceptorState) -> bool {\n    // This value is set by the user on the SdkConfig to indicate their preference\n    // We provide a default here for users that use a client config instead of the SdkConfig\n    let request_checksum_calculation = cfg\n        .load::<RequestChecksumCalculation>()\n        .unwrap_or(&RequestChecksumCalculation::WhenSupported);\n\n    // If the user setting is WhenSupported (the default) we always calculate it (because this interceptor\n    // isn't added if it isn't supported). If it is WhenRequired we only calculate it if the checksum\n    // is marked required on the trait.\n    match request_checksum_calculation {\n        RequestChecksumCalculation::WhenRequired => {\n            cfg.interceptor_state()\n                .store_append(SmithySdkFeature::FlexibleChecksumsReqWhenRequired);\n            state.request_checksum_required\n        }\n        RequestChecksumCalculation::WhenSupported => {\n            cfg.interceptor_state()\n                .store_append(SmithySdkFeature::FlexibleChecksumsReqWhenSupported);\n            true\n        }\n        unsupported => {\n            tracing::warn!(\n                more_info = \"Unsupported value of RequestChecksumCalculation when setting user-agent metrics\",\n                unsupported = ?unsupported\n            );\n            true\n        }\n    }\n}\n\n// Set the user-agent metric for the selected checksum algorithm\nfn track_metric_for_selected_checksum_algorithm(\n    cfg: &mut ConfigBag,\n    checksum_algorithm: &ChecksumAlgorithm,\n) {\n    match checksum_algorithm {\n        ChecksumAlgorithm::Crc32 => {\n            cfg.interceptor_state()\n                .store_append(SmithySdkFeature::FlexibleChecksumsReqCrc32);\n        }\n        ChecksumAlgorithm::Crc32c => {\n            cfg.interceptor_state()\n                .store_append(SmithySdkFeature::FlexibleChecksumsReqCrc32c);\n        }\n        ChecksumAlgorithm::Crc64Nvme => {\n            cfg.interceptor_state()\n                .store_append(SmithySdkFeature::FlexibleChecksumsReqCrc64);\n        }\n        #[allow(deprecated)]\n        ChecksumAlgorithm::Md5 => {\n            tracing::warn!(more_info = \"Unsupported ChecksumAlgorithm MD5 set\");\n        }\n        ChecksumAlgorithm::Sha1 => {\n            cfg.interceptor_state()\n                .store_append(SmithySdkFeature::FlexibleChecksumsReqSha1);\n        }\n        ChecksumAlgorithm::Sha256 => {\n            cfg.interceptor_state()\n                .store_append(SmithySdkFeature::FlexibleChecksumsReqSha256);\n        }\n        unsupported => tracing::warn!(\n                more_info = \"Unsupported value of ChecksumAlgorithm detected when setting user-agent metrics\",\n                unsupported = ?unsupported),\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use aws_smithy_checksums::ChecksumAlgorithm;\n    use aws_smithy_runtime_api::client::interceptors::context::{\n        BeforeTransmitInterceptorContextMut, InterceptorContext,\n    };\n    use aws_smithy_runtime_api::client::orchestrator::HttpRequest;\n    use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder;\n    use aws_smithy_types::base64;\n    use aws_smithy_types::byte_stream::ByteStream;\n    use bytes::BytesMut;\n    use http_body_util::BodyExt;\n    use tempfile::NamedTempFile;\n\n    fn create_test_interceptor() -> RequestChecksumInterceptor<\n        impl Fn(&Input) -> (Option<String>, bool) + Send + Sync,\n        impl Fn(&mut Request, &ConfigBag) -> Result<bool, BoxError> + Send + Sync,\n    > {\n        fn algo(_: &Input) -> (Option<String>, bool) {\n            (Some(\"crc32\".to_string()), false)\n        }\n        fn mutator(_: &mut Request, _: &ConfigBag) -> Result<bool, BoxError> {\n            Ok(false)\n        }\n        RequestChecksumInterceptor::new(algo, mutator)\n    }\n\n    #[tokio::test]\n    async fn test_checksum_body_is_retryable() {\n        use std::io::Write;\n        let mut file = NamedTempFile::new().unwrap();\n        let algorithm_str = \"crc32c\";\n        let checksum_algorithm: ChecksumAlgorithm = algorithm_str.parse().unwrap();\n\n        let mut crc32c_checksum = checksum_algorithm.into_impl();\n        for i in 0..10000 {\n            let line = format!(\"This is a large file created for testing purposes {}\", i);\n            file.as_file_mut().write_all(line.as_bytes()).unwrap();\n            crc32c_checksum.update(line.as_bytes());\n        }\n        let crc32c_checksum = crc32c_checksum.finalize();\n\n        let request = HttpRequest::new(\n            ByteStream::read_from()\n                .path(&file)\n                .buffer_size(1024)\n                .build()\n                .await\n                .unwrap()\n                .into_inner(),\n        );\n\n        // ensure original SdkBody is retryable\n        assert!(request.body().try_clone().is_some());\n\n        let interceptor = create_test_interceptor();\n        let mut cfg = ConfigBag::base();\n        cfg.interceptor_state()\n            .store_put(RequestChecksumInterceptorState {\n                checksum_algorithm: Some(algorithm_str.to_string()),\n                calculate_checksum: Arc::new(AtomicBool::new(true)),\n                ..Default::default()\n            });\n        let runtime_components = RuntimeComponentsBuilder::for_tests().build().unwrap();\n        let mut ctx = InterceptorContext::new(Input::doesnt_matter());\n        ctx.enter_serialization_phase();\n        let _ = ctx.take_input();\n        ctx.set_request(request);\n        ctx.enter_before_transmit_phase();\n        let mut ctx: BeforeTransmitInterceptorContextMut<'_> = (&mut ctx).into();\n        interceptor\n            .modify_before_transmit(&mut ctx, &runtime_components, &mut cfg)\n            .unwrap();\n\n        // ensure wrapped SdkBody is retryable\n        let mut body = ctx.request().body().try_clone().expect(\"body is retryable\");\n\n        let mut body_data = BytesMut::new();\n        let mut header_value = None;\n        while let Some(Ok(frame)) = body.frame().await {\n            if frame.is_data() {\n                let data = frame.into_data().unwrap();\n                body_data.extend_from_slice(&data);\n            } else {\n                let trailers = frame.into_trailers().unwrap();\n                if let Some(hv) = trailers.get(\"x-amz-checksum-crc32c\") {\n                    header_value = Some(hv.to_str().unwrap().to_owned());\n                }\n            }\n        }\n        let body_str = std::str::from_utf8(&body_data).unwrap();\n        let expected = format!(\"This is a large file created for testing purposes 9999\");\n        assert!(\n            body_str.ends_with(&expected),\n            \"expected '{body_str}' to end with '{expected}'\"\n        );\n        let expected_checksum = base64::encode(&crc32c_checksum);\n        assert_eq!(\n            header_value.as_ref(),\n            Some(&expected_checksum),\n            \"expected checksum '{header_value:?}' to match '{expected_checksum}'\"\n        );\n\n        let collected_body = body.collect().await.unwrap();\n        while let Some(trailer) = collected_body.trailers() {\n            if let Some(header_value) = trailer.get(\"x-amz-checksum-crc32c\") {\n                let header_value = header_value.to_str().unwrap();\n                assert_eq!(\n                    header_value, expected_checksum,\n                    \"expected checksum '{header_value}' to match '{expected_checksum}'\"\n                );\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-inlineable/src/http_response_checksum.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n#![allow(dead_code)]\n\n//! Interceptor for handling Smithy `@httpChecksum` response checksumming\n\nuse aws_smithy_checksums::ChecksumAlgorithm;\nuse aws_smithy_runtime::client::sdk_feature::SmithySdkFeature;\nuse aws_smithy_runtime_api::box_error::BoxError;\nuse aws_smithy_runtime_api::client::interceptors::context::{\n    BeforeDeserializationInterceptorContextMut, BeforeSerializationInterceptorContextMut, Input,\n};\nuse aws_smithy_runtime_api::client::interceptors::{dyn_dispatch_hint, Intercept};\nuse aws_smithy_runtime_api::client::runtime_components::RuntimeComponents;\nuse aws_smithy_runtime_api::http::Headers;\nuse aws_smithy_types::body::SdkBody;\nuse aws_smithy_types::checksum_config::ResponseChecksumValidation;\nuse aws_smithy_types::config_bag::{ConfigBag, Layer, Storable, StoreReplace};\nuse std::{fmt, mem};\n\n#[derive(Debug)]\nstruct ResponseChecksumInterceptorState {\n    validation_enabled: bool,\n}\nimpl Storable for ResponseChecksumInterceptorState {\n    type Storer = StoreReplace<Self>;\n}\n\npub(crate) struct ResponseChecksumInterceptor<VE, CM> {\n    response_algorithms: &'static [&'static str],\n    validation_enabled: VE,\n    checksum_mutator: CM,\n}\n\nimpl<VE, CM> fmt::Debug for ResponseChecksumInterceptor<VE, CM> {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        f.debug_struct(\"ResponseChecksumInterceptor\")\n            .field(\"response_algorithms\", &self.response_algorithms)\n            .finish()\n    }\n}\n\nimpl<VE, CM> ResponseChecksumInterceptor<VE, CM> {\n    pub(crate) fn new(\n        response_algorithms: &'static [&'static str],\n        validation_enabled: VE,\n        checksum_mutator: CM,\n    ) -> Self {\n        Self {\n            response_algorithms,\n            validation_enabled,\n            checksum_mutator,\n        }\n    }\n}\n\n#[dyn_dispatch_hint]\nimpl<VE, CM> Intercept for ResponseChecksumInterceptor<VE, CM>\nwhere\n    VE: Fn(&Input) -> bool + Send + Sync,\n    CM: Fn(&mut Input, &ConfigBag) -> Result<(), BoxError> + Send + Sync,\n{\n    fn name(&self) -> &'static str {\n        \"ResponseChecksumInterceptor\"\n    }\n\n    fn modify_before_serialization(\n        &self,\n        context: &mut BeforeSerializationInterceptorContextMut<'_>,\n        _runtime_components: &RuntimeComponents,\n        cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        (self.checksum_mutator)(context.input_mut(), cfg)?;\n        let validation_enabled = (self.validation_enabled)(context.input());\n\n        let mut layer = Layer::new(\"ResponseChecksumInterceptor\");\n        layer.store_put(ResponseChecksumInterceptorState { validation_enabled });\n        cfg.push_layer(layer);\n\n        let response_checksum_validation = cfg\n            .load::<ResponseChecksumValidation>()\n            .unwrap_or(&ResponseChecksumValidation::WhenSupported);\n\n        // Set the user-agent feature metric for the response checksum config\n        match response_checksum_validation {\n            ResponseChecksumValidation::WhenSupported => {\n                cfg.interceptor_state()\n                    .store_append(SmithySdkFeature::FlexibleChecksumsResWhenSupported);\n            }\n            ResponseChecksumValidation::WhenRequired => {\n                cfg.interceptor_state()\n                    .store_append(SmithySdkFeature::FlexibleChecksumsResWhenRequired);\n            }\n            unsupported => tracing::warn!(\n                more_info = \"Unsupported value of ResponseChecksumValidation when setting user-agent metrics\",\n                unsupported = ?unsupported),\n        };\n\n        Ok(())\n    }\n\n    fn modify_before_deserialization(\n        &self,\n        context: &mut BeforeDeserializationInterceptorContextMut<'_>,\n        _runtime_components: &RuntimeComponents,\n        cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        let state = cfg\n            .load::<ResponseChecksumInterceptorState>()\n            .expect(\"set in `read_before_serialization`\");\n\n        // This value is set by the user on the SdkConfig to indicate their preference\n        // We provide a default here for users that use a client config instead of the SdkConfig\n        let response_checksum_validation = cfg\n            .load::<ResponseChecksumValidation>()\n            .unwrap_or(&ResponseChecksumValidation::WhenSupported);\n\n        // If validation has not been explicitly enabled we check the ResponseChecksumValidation\n        // from the SdkConfig. If it is WhenSupported (or unknown) we enable validation and if it\n        // is WhenRequired we leave it disabled since there is no way to indicate that a response\n        // checksum is required.\n        let validation_enabled = if !state.validation_enabled {\n            match response_checksum_validation {\n                ResponseChecksumValidation::WhenRequired => false,\n                ResponseChecksumValidation::WhenSupported => true,\n                _ => true,\n            }\n        } else {\n            true\n        };\n\n        if validation_enabled {\n            let response = context.response_mut();\n            let maybe_checksum_headers = check_headers_for_precalculated_checksum(\n                response.headers(),\n                self.response_algorithms,\n            );\n\n            if let Some((checksum_algorithm, precalculated_checksum)) = maybe_checksum_headers {\n                let mut body = SdkBody::taken();\n                mem::swap(&mut body, response.body_mut());\n\n                let mut body = wrap_body_with_checksum_validator(\n                    body,\n                    checksum_algorithm,\n                    precalculated_checksum,\n                );\n                mem::swap(&mut body, response.body_mut());\n            }\n        }\n\n        Ok(())\n    }\n}\n\n/// Given an `SdkBody`, a `aws_smithy_checksums::ChecksumAlgorithm`, and a pre-calculated checksum,\n/// return an `SdkBody` where the body will processed with the checksum algorithm and checked\n/// against the pre-calculated checksum.\npub(crate) fn wrap_body_with_checksum_validator(\n    body: SdkBody,\n    checksum_algorithm: ChecksumAlgorithm,\n    precalculated_checksum: bytes::Bytes,\n) -> SdkBody {\n    use aws_smithy_checksums::body::validate;\n\n    body.map(move |body: SdkBody| {\n        SdkBody::from_body_1_x(validate::ChecksumBody::new(\n            body,\n            checksum_algorithm.into_impl(),\n            precalculated_checksum.clone(),\n        ))\n    })\n}\n\n/// Given a `HeaderMap`, extract any checksum included in the headers as `Some(Bytes)`.\n/// If no checksum header is set, return `None`. If multiple checksum headers are set, the one that\n/// is fastest to compute will be chosen.\npub(crate) fn check_headers_for_precalculated_checksum(\n    headers: &Headers,\n    response_algorithms: &[&str],\n) -> Option<(ChecksumAlgorithm, bytes::Bytes)> {\n    let checksum_algorithms_to_check =\n        aws_smithy_checksums::http::CHECKSUM_ALGORITHMS_IN_PRIORITY_ORDER\n            .into_iter()\n            // Process list of algorithms, from fastest to slowest, that may have been used to checksum\n            // the response body, ignoring any that aren't marked as supported algorithms by the model.\n            .flat_map(|algo| {\n                // For loop is necessary b/c the compiler doesn't infer the correct lifetimes for iter().find()\n                for res_algo in response_algorithms {\n                    if algo.eq_ignore_ascii_case(res_algo) {\n                        return Some(algo);\n                    }\n                }\n\n                None\n            });\n\n    for checksum_algorithm in checksum_algorithms_to_check {\n        let checksum_algorithm: ChecksumAlgorithm = checksum_algorithm.parse().expect(\n            \"CHECKSUM_ALGORITHMS_IN_PRIORITY_ORDER only contains valid checksum algorithm names\",\n        );\n        if let Some(base64_encoded_precalculated_checksum) =\n            headers.get(checksum_algorithm.into_impl().header_name())\n        {\n            // S3 needs special handling for checksums of objects uploaded with `MultiPartUpload`.\n            if is_part_level_checksum(base64_encoded_precalculated_checksum) {\n                tracing::warn!(\n                      more_info = \"See https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html#large-object-checksums for more information.\",\n                      \"This checksum is a part-level checksum which can't be validated by the Rust SDK. Disable checksum validation for this request to fix this warning.\",\n                  );\n\n                return None;\n            }\n\n            let precalculated_checksum = match aws_smithy_types::base64::decode(\n                base64_encoded_precalculated_checksum,\n            ) {\n                Ok(decoded_checksum) => decoded_checksum.into(),\n                Err(_) => {\n                    tracing::error!(\"Checksum received from server could not be base64 decoded. No checksum validation will be performed.\");\n                    return None;\n                }\n            };\n\n            return Some((checksum_algorithm, precalculated_checksum));\n        }\n    }\n\n    None\n}\n\nfn is_part_level_checksum(checksum: &str) -> bool {\n    let mut found_number = false;\n    let mut found_dash = false;\n\n    for ch in checksum.chars().rev() {\n        // this could be bad\n        if ch.is_ascii_digit() {\n            found_number = true;\n            continue;\n        }\n\n        // We saw a number first followed by the dash, yup, it's a part-level checksum\n        if found_number && ch == '-' {\n            if found_dash {\n                // Found a second dash?? This isn't a part-level checksum.\n                return false;\n            }\n\n            found_dash = true;\n            continue;\n        }\n\n        break;\n    }\n\n    found_number && found_dash\n}\n\n#[cfg(test)]\nmod tests {\n    use super::{is_part_level_checksum, wrap_body_with_checksum_validator};\n    use aws_smithy_types::body::SdkBody;\n    use aws_smithy_types::byte_stream::ByteStream;\n    use aws_smithy_types::error::display::DisplayErrorContext;\n    use bytes::Bytes;\n\n    #[tokio::test]\n    async fn test_build_checksum_validated_body_works() {\n        let checksum_algorithm = \"crc32\".parse().unwrap();\n        let input_text = \"Hello world\";\n        let precalculated_checksum = Bytes::from_static(&[0x8b, 0xd6, 0x9e, 0x52]);\n        let body = ByteStream::new(SdkBody::from(input_text));\n\n        let body = body.map(move |sdk_body| {\n            wrap_body_with_checksum_validator(\n                sdk_body,\n                checksum_algorithm,\n                precalculated_checksum.clone(),\n            )\n        });\n\n        let mut validated_body = Vec::new();\n        if let Err(e) = tokio::io::copy(&mut body.into_async_read(), &mut validated_body).await {\n            tracing::error!(\"{}\", DisplayErrorContext(&e));\n            panic!(\"checksum validation has failed\");\n        };\n        let body = std::str::from_utf8(&validated_body).unwrap();\n\n        assert_eq!(input_text, body);\n    }\n\n    #[test]\n    fn test_is_multipart_object_checksum() {\n        // These ARE NOT part-level checksums\n        assert!(!is_part_level_checksum(\"abcd\"));\n        assert!(!is_part_level_checksum(\"abcd=\"));\n        assert!(!is_part_level_checksum(\"abcd==\"));\n        assert!(!is_part_level_checksum(\"1234\"));\n        assert!(!is_part_level_checksum(\"1234=\"));\n        assert!(!is_part_level_checksum(\"1234==\"));\n        // These ARE part-level checksums\n        assert!(is_part_level_checksum(\"abcd-1\"));\n        assert!(is_part_level_checksum(\"abcd=-12\"));\n        assert!(is_part_level_checksum(\"abcd12-134\"));\n        assert!(is_part_level_checksum(\"abcd==-10000\"));\n        // These are gibberish and shouldn't be regarded as a part-level checksum\n        assert!(!is_part_level_checksum(\"\"));\n        assert!(!is_part_level_checksum(\"Spaces? In my header values?\"));\n        assert!(!is_part_level_checksum(\"abcd==-134!#{!#\"));\n        assert!(!is_part_level_checksum(\"abcd==-\"));\n        assert!(!is_part_level_checksum(\"abcd==--11\"));\n        assert!(!is_part_level_checksum(\"abcd==-AA\"));\n    }\n\n    #[test]\n    fn part_level_checksum_detection_works() {\n        let a_real_checksum = is_part_level_checksum(\"C9A5A6878D97B48CC965C1E41859F034-14\");\n        assert!(a_real_checksum);\n        let close_but_not_quite = is_part_level_checksum(\"a4-\");\n        assert!(!close_but_not_quite);\n        let backwards = is_part_level_checksum(\"14-C9A5A6878D97B48CC965C1E41859F034\");\n        assert!(!backwards);\n        let double_dash = is_part_level_checksum(\"C9A5A6878D97B48CC965C1E41859F03-4-14\");\n        assert!(!double_dash);\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-inlineable/src/lib.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/* Automatically managed default lints */\n#![cfg_attr(docsrs, feature(doc_cfg))]\n/* End of automatically managed default lints */\n//! Collection of modules that get conditionally included directly into the code generated\n//! SDK service crates. For example, when generating S3, the `s3_errors` module will get copied\n//! into the generated S3 crate to support the code generator.\n//!\n//! This is _NOT_ intended to be an actual crate. It is a cargo project to solely to aid\n//! with local development of the SDK.\n\n#![allow(clippy::derive_partial_eq_without_eq)]\n#![warn(\n    missing_docs,\n    rustdoc::missing_crate_level_docs,\n    missing_debug_implementations,\n    rust_2018_idioms,\n    unreachable_pub\n)]\n\n/// Supporting code for the account based endpoints.\n#[allow(dead_code)]\npub mod account_id_endpoint;\n\n/// Supporting code for tracking observability features (tracing/metrics).\n#[allow(dead_code)]\npub mod observability_feature;\n\n/// Supporting code for the aws-chunked content encoding.\npub mod aws_chunked;\n\n/// Supporting code to determine auth scheme options based on the `authSchemes` endpoint list property.\n#[allow(dead_code)]\npub mod endpoint_auth;\n\n/// Interceptors for API Gateway\npub mod apigateway_interceptors;\n\n/// Support types required for adding presigning to an operation in a generated service.\npub mod presigning;\n\n/// Presigning interceptors\npub mod presigning_interceptors;\n\n// This module uses module paths that assume the target crate to which it is copied, e.g.\n// `crate::config::endpoint::Params`. If included into `aws-inlineable`, this module would\n// fail to compile.\n// pub mod s3_express;\n\n/// Special logic for extracting request IDs from S3's responses.\n#[allow(dead_code)]\npub mod s3_request_id;\n\n/// Glacier-specific behavior\npub mod glacier_interceptors;\n\n/// Strip prefixes from IDs returned by Route53 operations when those IDs are used to construct requests\npub mod route53_resource_id_preprocessor;\n\npub mod http_request_checksum;\npub mod http_response_checksum;\n\n#[allow(dead_code)]\npub mod endpoint_discovery;\n\n// This module is symlinked in from the smithy-rs rust-runtime inlineables so that\n// the `presigning_interceptors` module can refer to it.\nmod serialization_settings;\n\n/// Parse the Expires and ExpiresString fields correctly\n#[allow(dead_code)]\npub mod s3_expires_interceptor;\n\n// just so docs work\n#[allow(dead_code)]\n/// allow docs to work\n#[derive(Debug)]\npub struct Client;\n\npub mod dsql_auth_token;\npub mod rds_auth_token;\n"
  },
  {
    "path": "aws/rust-runtime/aws-inlineable/src/observability_feature.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_smithy_runtime::client::sdk_feature::SmithySdkFeature;\nuse aws_smithy_runtime_api::{\n    box_error::BoxError,\n    client::interceptors::{\n        context::BeforeSerializationInterceptorContextRef, dyn_dispatch_hint, Intercept,\n    },\n};\nuse aws_smithy_types::config_bag::ConfigBag;\n\n// Interceptor that tracks Smithy SDK features for observability (tracing/metrics).\n#[derive(Debug, Default)]\npub(crate) struct ObservabilityFeatureTrackerInterceptor;\n\n#[dyn_dispatch_hint]\nimpl Intercept for ObservabilityFeatureTrackerInterceptor {\n    fn name(&self) -> &'static str {\n        \"ObservabilityFeatureTrackerInterceptor\"\n    }\n\n    fn read_before_execution(\n        &self,\n        _context: &BeforeSerializationInterceptorContextRef<'_>,\n        cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        // Check if an OpenTelemetry meter provider is configured via the global provider\n        if let Ok(telemetry_provider) = aws_smithy_observability::global::get_telemetry_provider() {\n            let meter_provider = telemetry_provider.meter_provider();\n\n            // Use provider_name() to detect OpenTelemetry without importing the otel crate.\n            if meter_provider.provider_name() == \"AwsSmithyObservabilityOtelProvider\" {\n                cfg.interceptor_state()\n                    .store_append(SmithySdkFeature::ObservabilityOtelMetrics);\n            }\n        }\n\n        Ok(())\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-inlineable/src/presigning.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n// TODO(https://github.com/smithy-lang/smithy-rs/issues/2902): Code generate this documentation so that service-specific examples can be added.\n//! Presigned request types and configuration.\n//!\n//! The [`Client`](crate::Client) is used to create presigned requests. They are made\n//! by calling `.presigned()` instead of `.send()` on an operation, and require a\n//! [`PresigningConfig`](crate::presigning::PresigningConfig) to provide an expiration time.\n//!\n//! Only operations that support presigning have the `presigned()` method on them.\n\nuse aws_smithy_runtime_api::box_error::BoxError;\nuse aws_smithy_runtime_api::client::orchestrator::HttpRequest;\nuse aws_smithy_types::body::SdkBody;\nuse aws_smithy_types::config_bag::{Storable, StoreReplace};\nuse std::fmt;\nuse std::time::{Duration, SystemTime};\n\nconst ONE_WEEK: Duration = Duration::from_secs(604800);\n\n/// Presigning config values required for creating a presigned request.\n#[non_exhaustive]\n#[derive(Debug, Clone)]\npub struct PresigningConfig {\n    start_time: SystemTime,\n    expires_in: Duration,\n}\n\nimpl PresigningConfig {\n    /// Creates a `PresigningConfig` with the given `expires_in` duration.\n    ///\n    /// The `expires_in` duration is the total amount of time the presigned request should\n    /// be valid for. Other config values are defaulted.\n    ///\n    /// Credential expiration time takes priority over the `expires_in` value.\n    /// If the credentials used to sign the request expire before the presigned request is\n    /// set to expire, then the presigned request will become invalid.\n    pub fn expires_in(expires_in: Duration) -> Result<PresigningConfig, PresigningConfigError> {\n        Self::builder().expires_in(expires_in).build()\n    }\n\n    /// Creates a new builder for creating a `PresigningConfig`.\n    pub fn builder() -> PresigningConfigBuilder {\n        PresigningConfigBuilder::default()\n    }\n\n    /// Returns the amount of time the presigned request should be valid for.\n    pub fn expires(&self) -> Duration {\n        self.expires_in\n    }\n\n    /// Returns the start time. The presigned request will be valid between this and the end\n    /// time produced by adding the `expires()` value to it.\n    pub fn start_time(&self) -> SystemTime {\n        self.start_time\n    }\n}\n\n#[derive(Debug)]\nenum ErrorKind {\n    /// Presigned requests cannot be valid for longer than one week.\n    ExpiresInDurationTooLong,\n\n    /// The `PresigningConfig` builder requires a value for `expires_in`.\n    ExpiresInRequired,\n}\n\n/// `PresigningConfig` build errors.\n#[derive(Debug)]\npub struct PresigningConfigError {\n    kind: ErrorKind,\n}\n\nimpl std::error::Error for PresigningConfigError {}\n\nimpl fmt::Display for PresigningConfigError {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        match self.kind {\n            ErrorKind::ExpiresInDurationTooLong => {\n                write!(f, \"`expires_in` must be no longer than one week\")\n            }\n            ErrorKind::ExpiresInRequired => write!(f, \"`expires_in` is required\"),\n        }\n    }\n}\n\nimpl From<ErrorKind> for PresigningConfigError {\n    fn from(kind: ErrorKind) -> Self {\n        Self { kind }\n    }\n}\n\n/// Builder used to create `PresigningConfig`.\n#[non_exhaustive]\n#[derive(Default, Debug)]\npub struct PresigningConfigBuilder {\n    start_time: Option<SystemTime>,\n    expires_in: Option<Duration>,\n}\n\nimpl PresigningConfigBuilder {\n    /// Sets the start time for the presigned request.\n    ///\n    /// The request will start to be valid at this time, and will cease to be valid after\n    /// the end time, which can be determined by adding the `expires_in` duration to this\n    /// start time. If not specified, this will default to the current time.\n    ///\n    /// Optional.\n    pub fn start_time(mut self, start_time: SystemTime) -> Self {\n        self.set_start_time(Some(start_time));\n        self\n    }\n\n    /// Sets the start time for the presigned request.\n    ///\n    /// The request will start to be valid at this time, and will cease to be valid after\n    /// the end time, which can be determined by adding the `expires_in` duration to this\n    /// start time. If not specified, this will default to the current time.\n    ///\n    /// Optional.\n    pub fn set_start_time(&mut self, start_time: Option<SystemTime>) {\n        self.start_time = start_time;\n    }\n\n    /// Sets how long the request should be valid after the `start_time` (which defaults\n    /// to the current time).\n    ///\n    /// Credential expiration time takes priority over the `expires_in` value.\n    /// If the credentials used to sign the request expire before the presigned request is\n    /// set to expire, then the presigned request will become invalid.\n    ///\n    /// Required.\n    pub fn expires_in(mut self, expires_in: Duration) -> Self {\n        self.set_expires_in(Some(expires_in));\n        self\n    }\n\n    /// Sets how long the request should be valid after the `start_time` (which defaults\n    /// to the current time).\n    ///\n    /// Credential expiration time takes priority over the `expires_in` value.\n    /// If the credentials used to sign the request expire before the presigned request is\n    /// set to expire, then the presigned request will become invalid.\n    ///\n    /// Required.\n    pub fn set_expires_in(&mut self, expires_in: Option<Duration>) {\n        self.expires_in = expires_in;\n    }\n\n    /// Builds the `PresigningConfig`. This will error if `expires_in` is not\n    /// given, or if it's longer than one week.\n    pub fn build(self) -> Result<PresigningConfig, PresigningConfigError> {\n        let expires_in = self.expires_in.ok_or(ErrorKind::ExpiresInRequired)?;\n        if expires_in > ONE_WEEK {\n            return Err(ErrorKind::ExpiresInDurationTooLong.into());\n        }\n        Ok(PresigningConfig {\n            start_time: self.start_time.unwrap_or_else(\n                // This usage is OK—customers can easily override this.\n                #[allow(clippy::disallowed_methods)]\n                SystemTime::now,\n            ),\n            expires_in,\n        })\n    }\n}\n\n/// Represents a presigned request. This only includes the HTTP request method, URI, and headers.\n///\n/// **This struct has conversion convenience functions:**\n///\n/// - [`PresignedRequest::make_http_02x_request<B>`][Self::make_http_02x_request] returns an [`http::Request<B>`](https://docs.rs/http/0.2.6/http/request/struct.Request.html)\n/// - [`PresignedRequest::into`](#impl-From<PresignedRequest>) returns an [`http::request::Builder`](https://docs.rs/http/0.2.6/http/request/struct.Builder.html)\n#[non_exhaustive]\npub struct PresignedRequest {\n    http_request: HttpRequest,\n}\n\nimpl Clone for PresignedRequest {\n    fn clone(&self) -> Self {\n        Self {\n            http_request: match self.http_request.try_clone() {\n                Some(body) => body,\n                None => {\n                    unreachable!(\n                        \"during construction, we replaced the body with `SdkBody::empty()`\"\n                    )\n                }\n            },\n        }\n    }\n}\n\nimpl PresignedRequest {\n    #[allow(dead_code)]\n    pub(crate) fn new(inner: HttpRequest) -> Result<Self, BoxError> {\n        // throw out the body so we're sure it's cloneable\n        let http_request = inner.map(|_body| SdkBody::empty());\n        // this should never fail, a presigned request should always be convertible, but better to\n        // protect against this potential panic\n        let _ = http_request\n            .try_clone()\n            .expect(\"must be cloneable, body is empty\")\n            .try_into_http1x()?;\n        Ok(Self { http_request })\n    }\n\n    /// Returns the HTTP request method.\n    pub fn method(&self) -> &str {\n        self.http_request.method()\n    }\n\n    /// Returns the HTTP request URI.\n    pub fn uri(&self) -> &str {\n        self.http_request.uri()\n    }\n\n    /// Returns any HTTP headers that need to go along with the request, except for `Host`,\n    /// which should be sent based on the endpoint in the URI by the HTTP client rather than\n    /// added directly.\n    pub fn headers(&self) -> impl Iterator<Item = (&str, &str)> {\n        self.http_request.headers().iter()\n    }\n\n    /// Given a body, produce an `http::Request` from this `PresignedRequest`\n    #[deprecated = \"Prefer the `make_http_1x_request()` instead by enabling the `http-1x` feature.\"]\n    #[allow(deprecated)]\n    pub fn make_http_02x_request<B>(&self, body: B) -> http::Request<B> {\n        self.clone().into_http_02x_request(body)\n    }\n\n    /// Converts this `PresignedRequest` directly into an `http` request.\n    #[deprecated = \"Prefer the `into_http_1x_request` instead by enabling the `http-1x` feature.\"]\n    pub fn into_http_02x_request<B>(self, body: B) -> http::Request<B> {\n        self.http_request\n            .try_into_http02x()\n            .expect(\"constructor validated convertibility\")\n            .map(|_req| body)\n    }\n\n    /// Given a body, produce an `http_1x::Request` from this `PresignedRequest`\n    pub fn make_http_1x_request<B>(&self, body: B) -> http_1x::Request<B> {\n        self.clone().into_http_1x_request(body)\n    }\n\n    /// Converts this `PresignedRequest` directly into an `http_1x` request.\n    pub fn into_http_1x_request<B>(self, body: B) -> http_1x::Request<B> {\n        self.http_request\n            .try_into_http1x()\n            .expect(\"constructor validated convertibility\")\n            .map(|_req| body)\n    }\n}\n\nimpl fmt::Debug for PresignedRequest {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        f.debug_struct(\"PresignedRequest\")\n            .field(\"method\", &self.method())\n            .field(\"uri\", &self.uri())\n            .field(\"headers\", self.http_request.headers())\n            .finish()\n    }\n}\n\n/// A marker struct to be stored in the ConfigBag allowing other interceptors to know that\n/// the current request is Presigned\n#[derive(Debug)]\npub(crate) struct PresigningMarker;\n\nimpl Storable for PresigningMarker {\n    type Storer = StoreReplace<Self>;\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-inlineable/src/presigning_interceptors.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n#![allow(dead_code)]\n\nuse crate::presigning::{PresigningConfig, PresigningMarker};\nuse crate::serialization_settings::HeaderSerializationSettings;\nuse aws_runtime::auth::{HttpSignatureType, SigV4OperationSigningConfig};\nuse aws_runtime::invocation_id::InvocationIdInterceptor;\nuse aws_runtime::request_info::RequestInfoInterceptor;\nuse aws_runtime::user_agent::UserAgentInterceptor;\nuse aws_sigv4::http_request::SignableBody;\nuse aws_smithy_async::time::{SharedTimeSource, StaticTimeSource};\nuse aws_smithy_runtime::client::retries::strategy::NeverRetryStrategy;\nuse aws_smithy_runtime_api::box_error::BoxError;\nuse aws_smithy_runtime_api::client::interceptors::context::{\n    BeforeSerializationInterceptorContextMut, BeforeTransmitInterceptorContextMut,\n};\nuse aws_smithy_runtime_api::client::interceptors::{\n    disable_interceptor, dyn_dispatch_hint, Intercept, SharedInterceptor,\n};\nuse aws_smithy_runtime_api::client::retries::SharedRetryStrategy;\nuse aws_smithy_runtime_api::client::runtime_components::{\n    RuntimeComponents, RuntimeComponentsBuilder,\n};\nuse aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugin;\nuse aws_smithy_types::config_bag::{ConfigBag, FrozenLayer, Layer};\nuse std::borrow::Cow;\n\n/// Interceptor that tells the SigV4 signer to add the signature to query params,\n/// and sets the request expiration time from the presigning config.\n#[derive(Debug)]\npub(crate) struct SigV4PresigningInterceptor {\n    config: PresigningConfig,\n    payload_override: SignableBody<'static>,\n}\n\nimpl SigV4PresigningInterceptor {\n    pub(crate) fn new(config: PresigningConfig, payload_override: SignableBody<'static>) -> Self {\n        Self {\n            config,\n            payload_override,\n        }\n    }\n}\n\n#[dyn_dispatch_hint]\nimpl Intercept for SigV4PresigningInterceptor {\n    fn name(&self) -> &'static str {\n        \"SigV4PresigningInterceptor\"\n    }\n\n    fn modify_before_serialization(\n        &self,\n        _context: &mut BeforeSerializationInterceptorContextMut<'_>,\n        _runtime_components: &RuntimeComponents,\n        cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        cfg.interceptor_state()\n            .store_put::<HeaderSerializationSettings>(\n                HeaderSerializationSettings::new()\n                    .omit_default_content_length()\n                    .omit_default_content_type(),\n            );\n\n        cfg.interceptor_state().store_put(PresigningMarker);\n        Ok(())\n    }\n\n    fn modify_before_signing(\n        &self,\n        _context: &mut BeforeTransmitInterceptorContextMut<'_>,\n        _runtime_components: &RuntimeComponents,\n        cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        if let Some(mut config) = cfg.load::<SigV4OperationSigningConfig>().cloned() {\n            config.signing_options.expires_in = Some(self.config.expires());\n            config.signing_options.signature_type = HttpSignatureType::HttpRequestQueryParams;\n            config.signing_options.payload_override = Some(self.payload_override.clone());\n            cfg.interceptor_state()\n                .store_put::<SigV4OperationSigningConfig>(config);\n            Ok(())\n        } else {\n            Err(\n                \"SigV4 presigning requires the SigV4OperationSigningConfig to be in the config bag. \\\n                This is a bug. Please file an issue.\".into(),\n            )\n        }\n    }\n}\n\n/// Runtime plugin that registers the SigV4PresigningInterceptor.\n#[derive(Debug)]\npub(crate) struct SigV4PresigningRuntimePlugin {\n    runtime_components: RuntimeComponentsBuilder,\n}\n\nimpl SigV4PresigningRuntimePlugin {\n    pub(crate) fn new(config: PresigningConfig, payload_override: SignableBody<'static>) -> Self {\n        let time_source = SharedTimeSource::new(StaticTimeSource::new(config.start_time()));\n        Self {\n            runtime_components: RuntimeComponentsBuilder::new(\"SigV4PresigningRuntimePlugin\")\n                .with_interceptor(SharedInterceptor::permanent(\n                    SigV4PresigningInterceptor::new(config, payload_override),\n                ))\n                .with_retry_strategy(Some(SharedRetryStrategy::new(NeverRetryStrategy::new())))\n                .with_time_source(Some(time_source)),\n        }\n    }\n}\n\nimpl RuntimePlugin for SigV4PresigningRuntimePlugin {\n    fn config(&self) -> Option<FrozenLayer> {\n        let mut layer = Layer::new(\"Presigning\");\n        layer.store_put(disable_interceptor::<InvocationIdInterceptor>(\"presigning\"));\n        layer.store_put(disable_interceptor::<RequestInfoInterceptor>(\"presigning\"));\n        layer.store_put(disable_interceptor::<UserAgentInterceptor>(\"presigning\"));\n        Some(layer.freeze())\n    }\n\n    fn runtime_components(\n        &self,\n        _: &RuntimeComponentsBuilder,\n    ) -> Cow<'_, RuntimeComponentsBuilder> {\n        Cow::Borrowed(&self.runtime_components)\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-inlineable/src/rds_auth_token.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Code related to creating signed URLs for logging in to RDS.\n//!\n//! For more information, see <https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.IAMDBAuth.Connecting.html>\n\nuse aws_credential_types::provider::{ProvideCredentials, SharedCredentialsProvider};\nuse aws_sigv4::http_request;\nuse aws_sigv4::http_request::{SignableBody, SignableRequest, SigningSettings};\nuse aws_sigv4::sign::v4;\nuse aws_smithy_runtime_api::box_error::BoxError;\nuse aws_smithy_runtime_api::client::identity::Identity;\nuse aws_types::region::Region;\nuse std::fmt;\nuse std::fmt::Debug;\nuse std::time::Duration;\n\nconst ACTION: &str = \"connect\";\nconst SERVICE: &str = \"rds-db\";\n\n/// A signer that generates an auth token for a database.\n///\n/// ## Example\n///\n/// ```ignore\n/// use crate::auth_token::{AuthTokenGenerator, Config};\n///\n/// #[tokio::main]\n/// async fn main() {\n///    let cfg = aws_config::load_defaults(BehaviorVersion::latest()).await;\n///    let generator = AuthTokenGenerator::new(\n///        Config::builder()\n///            .hostname(\"zhessler-test-db.cp7a4mblr2ig.us-east-1.rds.amazonaws.com\")\n///            .port(5432)\n///            .username(\"zhessler\")\n///            .build()\n///            .expect(\"cfg is valid\"),\n///    );\n///    let token = generator.auth_token(&cfg).await.unwrap();\n///    println!(\"{token}\");\n/// }\n/// ```\n#[derive(Debug)]\npub struct AuthTokenGenerator {\n    config: Config,\n}\n\n/// An auth token usable as a password for an RDS database.\n///\n/// This struct can be converted into a `&str` using the `Deref` trait or by calling `to_string()`.\n#[derive(Clone, Debug, PartialEq, Eq)]\npub struct AuthToken {\n    inner: String,\n}\n\nimpl AuthToken {\n    /// Return the auth token as a `&str`.\n    #[must_use]\n    pub fn as_str(&self) -> &str {\n        &self.inner\n    }\n}\n\nimpl fmt::Display for AuthToken {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        write!(f, \"{}\", self.inner)\n    }\n}\n\nimpl AuthTokenGenerator {\n    /// Given a `Config`, create a new RDS database login URL signer.\n    pub fn new(config: Config) -> Self {\n        Self { config }\n    }\n\n    /// Return a signed URL usable as an auth token.\n    pub async fn auth_token(\n        &self,\n        config: &aws_types::sdk_config::SdkConfig,\n    ) -> Result<AuthToken, BoxError> {\n        let credentials = self\n            .config\n            .credentials()\n            .or(config.credentials_provider())\n            .ok_or(\"credentials are required to create a signed URL for RDS\")?\n            .provide_credentials()\n            .await?;\n        let identity: Identity = credentials.into();\n        let region = self\n            .config\n            .region()\n            .or(config.region())\n            .cloned()\n            .unwrap_or_else(|| Region::new(\"us-east-1\"));\n        let time = config.time_source().ok_or(\"a time source is required\")?;\n\n        let mut signing_settings = SigningSettings::default();\n        signing_settings.expires_in = Some(Duration::from_secs(\n            self.config.expires_in().unwrap_or(900).min(900),\n        ));\n        signing_settings.signature_location = http_request::SignatureLocation::QueryParams;\n\n        let signing_params = v4::SigningParams::builder()\n            .identity(&identity)\n            .region(region.as_ref())\n            .name(SERVICE)\n            .time(time.now())\n            .settings(signing_settings)\n            .build()?;\n\n        let url = format!(\n            \"https://{}:{}/?Action={}&DBUser={}\",\n            self.config.hostname(),\n            self.config.port(),\n            ACTION,\n            self.config.username()\n        );\n        let signable_request =\n            SignableRequest::new(\"GET\", &url, std::iter::empty(), SignableBody::empty())\n                .expect(\"signable request\");\n\n        let (signing_instructions, _signature) =\n            http_request::sign(signable_request, &signing_params.into())?.into_parts();\n\n        let mut url = url::Url::parse(&url).unwrap();\n        for (name, value) in signing_instructions.params() {\n            url.query_pairs_mut().append_pair(name, value);\n        }\n        let inner = url.to_string().split_off(\"https://\".len());\n\n        Ok(AuthToken { inner })\n    }\n}\n\n/// Configuration for an RDS auth URL signer.\n#[derive(Debug, Clone)]\npub struct Config {\n    /// The AWS credentials to sign requests with.\n    ///\n    /// Uses the default credential provider chain if not specified.\n    credentials: Option<SharedCredentialsProvider>,\n\n    /// The hostname of the database to connect to.\n    hostname: String,\n\n    /// The port number the database is listening on.\n    port: u64,\n\n    /// The region the database is located in. Uses the region inferred from the runtime if omitted.\n    region: Option<Region>,\n\n    /// The username to login as.\n    username: String,\n\n    /// The number of seconds the signed URL should be valid for.\n    ///\n    /// Maxes at 900 seconds.\n    expires_in: Option<u64>,\n}\n\nimpl Config {\n    /// Create a new `SignerConfigBuilder`.\n    pub fn builder() -> ConfigBuilder {\n        ConfigBuilder::default()\n    }\n\n    /// The AWS credentials to sign requests with.\n    pub fn credentials(&self) -> Option<SharedCredentialsProvider> {\n        self.credentials.clone()\n    }\n\n    /// The hostname of the database to connect to.\n    pub fn hostname(&self) -> &str {\n        &self.hostname\n    }\n\n    /// The port number the database is listening on.\n    pub fn port(&self) -> u64 {\n        self.port\n    }\n\n    /// The region to sign requests with.\n    pub fn region(&self) -> Option<&Region> {\n        self.region.as_ref()\n    }\n\n    /// The DB username to login as.\n    pub fn username(&self) -> &str {\n        &self.username\n    }\n\n    /// The number of seconds the signed URL should be valid for.\n    ///\n    /// Maxes out at 900 seconds.\n    pub fn expires_in(&self) -> Option<u64> {\n        self.expires_in\n    }\n}\n\n/// A builder for [`Config`]s.\n#[derive(Debug, Default)]\npub struct ConfigBuilder {\n    /// The AWS credentials to create the auth token with.\n    ///\n    /// Uses the default credential provider chain if not specified.\n    credentials: Option<SharedCredentialsProvider>,\n\n    /// The hostname of the database to connect to.\n    hostname: Option<String>,\n\n    /// The port number the database is listening on.\n    port: Option<u64>,\n\n    /// The region the database is located in. Uses the region inferred from the runtime if omitted.\n    region: Option<Region>,\n\n    /// The database username to login as.\n    username: Option<String>,\n\n    /// The number of seconds the auth token should be valid for.\n    expires_in: Option<u64>,\n}\n\nimpl ConfigBuilder {\n    /// The AWS credentials to create the auth token with.\n    ///\n    /// Uses the default credential provider chain if not specified.\n    pub fn credentials(mut self, credentials: impl ProvideCredentials + 'static) -> Self {\n        self.credentials = Some(SharedCredentialsProvider::new(credentials));\n        self\n    }\n\n    /// The hostname of the database to connect to.\n    pub fn hostname(mut self, hostname: impl Into<String>) -> Self {\n        self.hostname = Some(hostname.into());\n        self\n    }\n\n    /// The port number the database is listening on.\n    pub fn port(mut self, port: u64) -> Self {\n        self.port = Some(port);\n        self\n    }\n\n    /// The region the database is located in. Uses the region inferred from the runtime if omitted.\n    pub fn region(mut self, region: Region) -> Self {\n        self.region = Some(region);\n        self\n    }\n\n    /// The database username to login as.\n    pub fn username(mut self, username: impl Into<String>) -> Self {\n        self.username = Some(username.into());\n        self\n    }\n\n    /// The number of seconds the signed URL should be valid for.\n    ///\n    /// Maxes out at 900 seconds.\n    pub fn expires_in(mut self, expires_in: u64) -> Self {\n        self.expires_in = Some(expires_in);\n        self\n    }\n\n    /// Consume this builder, returning an error if required fields are missing.\n    /// Otherwise, return a new `SignerConfig`.\n    pub fn build(self) -> Result<Config, BoxError> {\n        Ok(Config {\n            credentials: self.credentials,\n            hostname: self.hostname.ok_or(\"A hostname is required\")?,\n            port: self.port.ok_or(\"a port is required\")?,\n            region: self.region,\n            username: self.username.ok_or(\"a username is required\")?,\n            expires_in: self.expires_in,\n        })\n    }\n}\n\n#[cfg(test)]\nmod test {\n    use super::{AuthTokenGenerator, Config};\n    use aws_credential_types::provider::SharedCredentialsProvider;\n    use aws_credential_types::Credentials;\n    use aws_smithy_async::test_util::ManualTimeSource;\n    use aws_types::region::Region;\n    use aws_types::SdkConfig;\n    use std::time::{Duration, UNIX_EPOCH};\n\n    #[tokio::test]\n    async fn signing_works() {\n        let time_source = ManualTimeSource::new(UNIX_EPOCH + Duration::from_secs(1724709600));\n        let sdk_config = SdkConfig::builder()\n            .credentials_provider(SharedCredentialsProvider::new(Credentials::new(\n                \"akid\", \"secret\", None, None, \"test\",\n            )))\n            .time_source(time_source)\n            .build();\n        let signer = AuthTokenGenerator::new(\n            Config::builder()\n                .hostname(\"prod-instance.us-east-1.rds.amazonaws.com\")\n                .port(3306)\n                .region(Region::new(\"us-east-1\"))\n                .username(\"peccy\")\n                .build()\n                .unwrap(),\n        );\n\n        let signed_url = signer.auth_token(&sdk_config).await.unwrap();\n        assert_eq!(signed_url.as_str(), \"prod-instance.us-east-1.rds.amazonaws.com:3306/?Action=connect&DBUser=peccy&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=akid%2F20240826%2Fus-east-1%2Frds-db%2Faws4_request&X-Amz-Date=20240826T220000Z&X-Amz-Expires=900&X-Amz-SignedHeaders=host&X-Amz-Signature=dd0cba843009474347af724090233265628ace491ea17ce3eb3da098b983ad89\");\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-inlineable/src/route53_resource_id_preprocessor.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n#![allow(dead_code)]\n\nuse aws_smithy_runtime_api::box_error::BoxError;\nuse aws_smithy_runtime_api::client::interceptors::context::BeforeSerializationInterceptorContextMut;\nuse aws_smithy_runtime_api::client::interceptors::{dyn_dispatch_hint, Intercept};\nuse aws_smithy_runtime_api::client::runtime_components::RuntimeComponents;\nuse aws_smithy_types::config_bag::ConfigBag;\nuse std::fmt;\nuse std::marker::PhantomData;\n\n// This function is only used to strip prefixes from resource IDs at the time they're passed as\n// input to a request. Resource IDs returned in responses may or may not include a prefix.\n/// Strip the resource type prefix from resource ID return\nfn trim_resource_id(resource_id: &mut Option<String>) {\n    const PREFIXES: &[&str] = &[\n        \"/hostedzone/\",\n        \"hostedzone/\",\n        \"/change/\",\n        \"change/\",\n        \"/delegationset/\",\n        \"delegationset/\",\n    ];\n\n    for prefix in PREFIXES {\n        if let Some(id) = resource_id\n            .as_deref()\n            .unwrap_or_default()\n            .strip_prefix(prefix)\n        {\n            *resource_id = Some(id.to_string());\n            return;\n        }\n    }\n}\n\npub(crate) struct Route53ResourceIdInterceptor<G, T>\nwhere\n    G: for<'a> Fn(&'a mut T) -> &'a mut Option<String>,\n{\n    get_mut_resource_id: G,\n    _phantom: PhantomData<T>,\n}\n\nimpl<G, T> fmt::Debug for Route53ResourceIdInterceptor<G, T>\nwhere\n    G: for<'a> Fn(&'a mut T) -> &'a mut Option<String>,\n{\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        f.debug_struct(\"Route53ResourceIdInterceptor\").finish()\n    }\n}\n\nimpl<G, T> Route53ResourceIdInterceptor<G, T>\nwhere\n    G: for<'a> Fn(&'a mut T) -> &'a mut Option<String>,\n{\n    pub(crate) fn new(get_mut_resource_id: G) -> Self {\n        Self {\n            get_mut_resource_id,\n            _phantom: Default::default(),\n        }\n    }\n}\n\n#[dyn_dispatch_hint]\nimpl<G, T> Intercept for Route53ResourceIdInterceptor<G, T>\nwhere\n    G: for<'a> Fn(&'a mut T) -> &'a mut Option<String> + Send + Sync,\n    T: fmt::Debug + Send + Sync + 'static,\n{\n    fn name(&self) -> &'static str {\n        \"Route53ResourceIdInterceptor\"\n    }\n\n    fn modify_before_serialization(\n        &self,\n        context: &mut BeforeSerializationInterceptorContextMut<'_>,\n        _runtime_components: &RuntimeComponents,\n        _cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        let input: &mut T = context.input_mut().downcast_mut().expect(\"correct type\");\n        let field = (self.get_mut_resource_id)(input);\n        trim_resource_id(field);\n        Ok(())\n    }\n}\n\n#[cfg(test)]\nmod test {\n    use super::trim_resource_id;\n\n    #[test]\n    fn does_not_change_regular_zones() {\n        struct OperationInput {\n            resource: Option<String>,\n        }\n\n        let mut operation = OperationInput {\n            resource: Some(\"Z0441723226OZ66S5ZCNZ\".to_string()),\n        };\n        trim_resource_id(&mut operation.resource);\n        assert_eq!(\n            &operation.resource.unwrap_or_default(),\n            \"Z0441723226OZ66S5ZCNZ\"\n        );\n    }\n\n    #[test]\n    fn sanitizes_prefixed_zone() {\n        struct OperationInput {\n            change_id: Option<String>,\n        }\n\n        let mut operation = OperationInput {\n            change_id: Some(\"/change/Z0441723226OZ66S5ZCNZ\".to_string()),\n        };\n        trim_resource_id(&mut operation.change_id);\n        assert_eq!(\n            &operation.change_id.unwrap_or_default(),\n            \"Z0441723226OZ66S5ZCNZ\"\n        );\n    }\n\n    #[test]\n    fn allow_no_leading_slash() {\n        struct OperationInput {\n            hosted_zone: Option<String>,\n        }\n\n        let mut operation = OperationInput {\n            hosted_zone: Some(\"hostedzone/Z0441723226OZ66S5ZCNZ\".to_string()),\n        };\n        trim_resource_id(&mut operation.hosted_zone);\n        assert_eq!(\n            &operation.hosted_zone.unwrap_or_default(),\n            \"Z0441723226OZ66S5ZCNZ\"\n        );\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-inlineable/src/s3_expires_interceptor.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_smithy_runtime_api::box_error::BoxError;\nuse aws_smithy_runtime_api::client::interceptors::context::BeforeDeserializationInterceptorContextMut;\nuse aws_smithy_runtime_api::client::interceptors::{dyn_dispatch_hint, Intercept};\nuse aws_smithy_runtime_api::client::runtime_components::RuntimeComponents;\nuse aws_smithy_types::config_bag::ConfigBag;\nuse aws_smithy_types::date_time::{DateTime, Format};\n\n/// An interceptor to implement custom parsing logic for S3's `Expires` header. This\n/// intercaptor copies the value of the `Expires` header to a (synthetically added)\n/// `ExpiresString` header. It also attempts to parse the header as an `HttpDate`, if\n/// that parsing fails the header is removed so the `Expires` field in the final output\n/// will be `None`.\n#[derive(Debug)]\npub(crate) struct S3ExpiresInterceptor;\nconst EXPIRES: &str = \"Expires\";\nconst EXPIRES_STRING: &str = \"ExpiresString\";\n\n#[dyn_dispatch_hint]\nimpl Intercept for S3ExpiresInterceptor {\n    fn name(&self) -> &'static str {\n        \"S3ExpiresInterceptor\"\n    }\n\n    fn modify_before_deserialization(\n        &self,\n        context: &mut BeforeDeserializationInterceptorContextMut<'_>,\n        _: &RuntimeComponents,\n        _: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        let headers = context.response_mut().headers_mut();\n\n        if headers.contains_key(EXPIRES) {\n            let expires_header = headers.get(EXPIRES).unwrap().to_string();\n\n            // If the Expires header fails to parse to an HttpDate we remove the header so\n            // it is parsed to None. We use HttpDate since that is the SEP defined default\n            // if no other format is specified in the model.\n            if DateTime::from_str(&expires_header, Format::HttpDate).is_err() {\n                tracing::debug!(\n                    \"Failed to parse the header `{EXPIRES}` = \\\"{expires_header}\\\" as an HttpDate. The raw string value can found in `{EXPIRES_STRING}`.\"\n                );\n                headers.remove(EXPIRES);\n            }\n\n            // Regardless of parsing success we copy the value of the Expires header to the\n            // ExpiresString header.\n            headers.insert(EXPIRES_STRING, expires_header);\n        }\n\n        Ok(())\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-inlineable/src/s3_express.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/// Supporting code for S3 Express auth\npub(crate) mod auth {\n    use aws_runtime::auth::sigv4::SigV4Signer;\n    use aws_smithy_runtime_api::client::auth::{AuthScheme, AuthSchemeId, Sign};\n    use aws_smithy_runtime_api::client::identity::SharedIdentityResolver;\n    use aws_smithy_runtime_api::client::runtime_components::GetIdentityResolver;\n\n    /// Auth scheme ID for S3 Express.\n    pub(crate) const SCHEME_ID: AuthSchemeId = AuthSchemeId::new(\"sigv4-s3express\");\n\n    /// S3 Express auth scheme.\n    #[derive(Debug, Default)]\n    pub(crate) struct S3ExpressAuthScheme {\n        signer: SigV4Signer,\n    }\n\n    impl S3ExpressAuthScheme {\n        /// Creates a new `S3ExpressAuthScheme`.\n        pub(crate) fn new() -> Self {\n            Default::default()\n        }\n    }\n\n    impl AuthScheme for S3ExpressAuthScheme {\n        fn scheme_id(&self) -> AuthSchemeId {\n            SCHEME_ID\n        }\n\n        fn identity_resolver(\n            &self,\n            identity_resolvers: &dyn GetIdentityResolver,\n        ) -> Option<SharedIdentityResolver> {\n            identity_resolvers.identity_resolver(self.scheme_id())\n        }\n\n        fn signer(&self) -> &dyn Sign {\n            &self.signer\n        }\n    }\n}\n\n/// Supporting code for S3 Express identity cache\npub(crate) mod identity_cache {\n    use aws_credential_types::Credentials;\n    use aws_smithy_async::time::SharedTimeSource;\n    use aws_smithy_runtime::expiring_cache::ExpiringCache;\n    use aws_smithy_runtime_api::box_error::BoxError;\n    use aws_smithy_runtime_api::client::identity::Identity;\n    use aws_smithy_types::DateTime;\n    use fastrand::Rng;\n    use hmac::KeyInit;\n    use hmac::{digest::FixedOutput, Hmac, Mac};\n    use lru::LruCache;\n    use sha2::Sha256;\n    use std::fmt;\n    use std::future::Future;\n    use std::hash::Hash;\n    use std::num::NonZeroUsize;\n    use std::sync::Mutex;\n    use std::time::{Duration, SystemTime};\n\n    pub(crate) const DEFAULT_MAX_CACHE_CAPACITY: usize = 100;\n    pub(crate) const DEFAULT_BUFFER_TIME: Duration = Duration::from_secs(10);\n\n    #[derive(Clone, Eq, PartialEq, Hash)]\n    pub(crate) struct CacheKey(String);\n\n    /// The caching implementation for S3 Express identity.\n    ///\n    /// While customers can either disable S3 Express itself or provide a custom S3 Express identity\n    /// provider, configuring S3 Express identity cache is not supported. Thus, this is _the_\n    /// implementation of S3 Express identity cache.\n    pub(crate) struct S3ExpressIdentityCache {\n        inner: Mutex<LruCache<CacheKey, ExpiringCache<Identity, BoxError>>>,\n        time_source: SharedTimeSource,\n        buffer_time: Duration,\n        random_bytes: [u8; 64],\n    }\n\n    impl fmt::Debug for S3ExpressIdentityCache {\n        fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n            let (size, capacity) = {\n                let cache = self.inner.lock().unwrap();\n                (cache.len(), cache.cap())\n            };\n            write!(\n                f,\n                \"S3ExpressIdentityCache {{ time_source: {:?}, buffer_time: {:?} }}, with size/capacity: {}/{}\",\n                self.time_source, &self.buffer_time, size, capacity,\n            )\n        }\n    }\n\n    impl S3ExpressIdentityCache {\n        pub(crate) fn new(\n            capacity: usize,\n            time_source: SharedTimeSource,\n            buffer_time: Duration,\n        ) -> Self {\n            // It'd be nice to use a cryptographically secure random generator but not necessary.\n            // The cache is memory only and randomization here is mostly to obfuscate the key and\n            // make it reasonable length.\n            let mut rng = Rng::default();\n            let mut random_bytes = [0u8; 64];\n            rng.fill(&mut random_bytes);\n            Self {\n                inner: Mutex::new(LruCache::new(NonZeroUsize::new(capacity).unwrap())),\n                time_source,\n                buffer_time,\n                random_bytes,\n            }\n        }\n\n        pub(crate) fn key(&self, bucket_name: &str, creds: &Credentials) -> CacheKey {\n            CacheKey({\n                let mut mac = Hmac::<Sha256>::new_from_slice(self.random_bytes.as_slice())\n                    .expect(\"should be created from random 64 bytes\");\n                let input = format!(\"{}{}\", creds.access_key_id(), creds.secret_access_key());\n                mac.update(input.as_ref());\n                let mut inner = hex::encode(mac.finalize_fixed());\n                inner.push_str(bucket_name);\n                inner\n            })\n        }\n\n        pub(crate) async fn get_or_load<F, Fut>(\n            &self,\n            key: CacheKey,\n            loader: F,\n        ) -> Result<Identity, BoxError>\n        where\n            F: FnOnce() -> Fut,\n            Fut: Future<Output = Result<(Identity, SystemTime), BoxError>>,\n        {\n            let expiring_cache = {\n                let mut inner = self.inner.lock().unwrap();\n                inner\n                    .get_or_insert_mut(key, || ExpiringCache::new(self.buffer_time))\n                    .clone()\n            };\n\n            let now = self.time_source.now();\n\n            match expiring_cache.yield_or_clear_if_expired(now).await {\n                Some(identity) => {\n                    tracing::debug!(\n                        buffer_time=?self.buffer_time,\n                        cached_expiration=?identity.expiration(),\n                        now=?now,\n                        \"loaded identity from cache\"\n                    );\n                    Ok(identity)\n                }\n                None => {\n                    let start_time = self.time_source.now();\n                    let identity = expiring_cache.get_or_load(loader).await?;\n                    let expiration = identity\n                        .expiration()\n                        .ok_or(\"SessionCredentials` always has expiration\")?;\n                    let printable = DateTime::from(expiration);\n                    tracing::info!(\n                        new_expiration=%printable,\n                        valid_for=?expiration.duration_since(self.time_source.now()).unwrap_or_default(),\n                        \"identity cache miss occurred; added new identity (took {:?})\",\n                        self.time_source.now().duration_since(start_time).unwrap_or_default()\n                    );\n                    Ok(identity)\n                }\n            }\n        }\n    }\n\n    #[cfg(test)]\n    mod tests {\n        use super::*;\n        use aws_smithy_async::rt::sleep::TokioSleep;\n        use aws_smithy_async::test_util::ManualTimeSource;\n        use aws_smithy_runtime_api::client::identity::http::Token;\n        use aws_smithy_runtime_api::client::identity::{\n            IdentityFuture, ResolveIdentity, SharedIdentityResolver,\n        };\n        use aws_smithy_runtime_api::client::runtime_components::{\n            RuntimeComponents, RuntimeComponentsBuilder,\n        };\n        use aws_smithy_runtime_api::shared::IntoShared;\n        use aws_smithy_types::config_bag::ConfigBag;\n        use futures_util::stream::FuturesUnordered;\n        use std::sync::Arc;\n        use std::time::{Duration, SystemTime, UNIX_EPOCH};\n        use tracing::info;\n\n        fn epoch_secs(secs: u64) -> SystemTime {\n            SystemTime::UNIX_EPOCH + Duration::from_secs(secs)\n        }\n\n        fn identity_expiring_in(expired_secs: u64) -> Identity {\n            let expiration = Some(epoch_secs(expired_secs));\n            Identity::new(Token::new(\"test\", expiration), expiration)\n        }\n\n        fn test_identity_resolver(\n            load_list: Vec<Result<Identity, BoxError>>,\n        ) -> SharedIdentityResolver {\n            #[derive(Debug)]\n            struct Resolver(Mutex<Vec<Result<Identity, BoxError>>>);\n            impl ResolveIdentity for Resolver {\n                fn resolve_identity<'a>(\n                    &'a self,\n                    _: &'a RuntimeComponents,\n                    _config_bag: &'a ConfigBag,\n                ) -> IdentityFuture<'a> {\n                    let mut list = self.0.lock().unwrap();\n                    if list.len() > 0 {\n                        let next = list.remove(0);\n                        info!(\"refreshing the identity to {:?}\", next);\n                        IdentityFuture::ready(next)\n                    } else {\n                        drop(list);\n                        panic!(\"no more identities\")\n                    }\n                }\n            }\n\n            SharedIdentityResolver::new(Resolver(Mutex::new(load_list)))\n        }\n\n        async fn load(\n            identity_resolver: SharedIdentityResolver,\n            runtime_components: &RuntimeComponents,\n        ) -> Result<(Identity, SystemTime), BoxError> {\n            let identity = identity_resolver\n                .resolve_identity(&runtime_components, &ConfigBag::base())\n                .await\n                .unwrap();\n            Ok((identity.clone(), identity.expiration().unwrap()))\n        }\n\n        async fn expect_identity<F, Fut>(\n            expired_secs: u64,\n            sut: &S3ExpressIdentityCache,\n            key: CacheKey,\n            loader: F,\n        ) where\n            F: FnOnce() -> Fut,\n            Fut: Future<Output = Result<(Identity, SystemTime), BoxError>>,\n        {\n            let identity = sut.get_or_load(key, loader).await.unwrap();\n            assert_eq!(Some(epoch_secs(expired_secs)), identity.expiration());\n        }\n\n        #[tokio::test]\n        async fn reload_expired_test_identity() {\n            let time = ManualTimeSource::new(UNIX_EPOCH);\n            let runtime_components = RuntimeComponentsBuilder::for_tests()\n                .with_time_source(Some(time.clone()))\n                .with_sleep_impl(Some(TokioSleep::new()))\n                .build()\n                .unwrap();\n\n            let sut =\n                S3ExpressIdentityCache::new(1, time.clone().into_shared(), DEFAULT_BUFFER_TIME);\n\n            let identity_resolver = test_identity_resolver(vec![\n                Ok(identity_expiring_in(1000)),\n                Ok(identity_expiring_in(2000)),\n            ]);\n\n            let key = sut.key(\n                \"test-bucket--usw2-az1--x-s3\",\n                &Credentials::for_tests_with_session_token(),\n            );\n\n            // First call to the cache, populating a cache entry.\n            expect_identity(1000, &sut, key.clone(), || {\n                let identity_resolver = identity_resolver.clone();\n                let runtime_components = runtime_components.clone();\n                async move { load(identity_resolver, &runtime_components).await }\n            })\n            .await;\n\n            // Testing for a cache hit by advancing time such that the updated time is before the expiration of the first identity\n            // i.e. 500 < 1000.\n            time.set_time(epoch_secs(500));\n\n            expect_identity(1000, &sut, key.clone(), || async move {\n                panic!(\"new identity should not be loaded\")\n            })\n            .await;\n\n            // Testing for a cache miss by advancing time such that the updated time is now after the expiration of the first identity\n            // and before the expiration of the second identity i.e. 1000 < 1500 && 1500 < 2000.\n            time.set_time(epoch_secs(1500));\n\n            expect_identity(2000, &sut, key, || async move {\n                load(identity_resolver, &runtime_components).await\n            })\n            .await;\n        }\n\n        #[test]\n        fn load_contention() {\n            let rt = tokio::runtime::Builder::new_multi_thread()\n                .enable_time()\n                .worker_threads(16)\n                .build()\n                .unwrap();\n\n            let time = ManualTimeSource::new(epoch_secs(0));\n            let runtime_components = RuntimeComponentsBuilder::for_tests()\n                .with_time_source(Some(time.clone()))\n                .with_sleep_impl(Some(TokioSleep::new()))\n                .build()\n                .unwrap();\n\n            let number_of_buckets = 4;\n            let sut = Arc::new(S3ExpressIdentityCache::new(\n                number_of_buckets,\n                time.clone().into_shared(),\n                DEFAULT_BUFFER_TIME,\n            ));\n\n            // Nested for loops below advance time by 200 in total, and each identity has the expiration\n            // such that no matter what order async tasks are executed, it never expires.\n            let safe_expiration = number_of_buckets as u64 * 50 + DEFAULT_BUFFER_TIME.as_secs() + 1;\n            let identity_resolver = test_identity_resolver(vec![\n                Ok(identity_expiring_in(safe_expiration)),\n                Ok(identity_expiring_in(safe_expiration)),\n                Ok(identity_expiring_in(safe_expiration)),\n                Ok(identity_expiring_in(safe_expiration)),\n            ]);\n\n            let mut tasks = Vec::new();\n            for i in 0..number_of_buckets {\n                let key = sut.key(\n                    &format!(\"test-bucket-{i}-usw2-az1--x-s3\"),\n                    &Credentials::for_tests_with_session_token(),\n                );\n                for _ in 0..50 {\n                    let sut = sut.clone();\n                    let key = key.clone();\n                    let identity_resolver = identity_resolver.clone();\n                    let time = time.clone();\n                    let runtime_components = runtime_components.clone();\n                    tasks.push(rt.spawn(async move {\n                        let now = time.advance(Duration::from_secs(1));\n                        let identity: Identity = sut\n                            .get_or_load(key, || async move {\n                                load(identity_resolver, &runtime_components).await\n                            })\n                            .await\n                            .unwrap();\n\n                        assert!(\n                            identity.expiration().unwrap() >= now,\n                            \"{:?} >= {:?}\",\n                            identity.expiration(),\n                            now\n                        );\n                    }));\n                }\n            }\n            let tasks = tasks.into_iter().collect::<FuturesUnordered<_>>();\n            for task in tasks {\n                rt.block_on(task).unwrap();\n            }\n        }\n\n        #[tokio::test]\n        async fn identity_fetch_triggered_by_lru_eviction() {\n            let time = ManualTimeSource::new(UNIX_EPOCH);\n            let runtime_components = RuntimeComponentsBuilder::for_tests()\n                .with_time_source(Some(time.clone()))\n                .with_sleep_impl(Some(TokioSleep::new()))\n                .build()\n                .unwrap();\n\n            // Create a cache of size 2.\n            let sut = S3ExpressIdentityCache::new(2, time.into_shared(), DEFAULT_BUFFER_TIME);\n\n            let identity_resolver = test_identity_resolver(vec![\n                Ok(identity_expiring_in(1000)),\n                Ok(identity_expiring_in(2000)),\n                Ok(identity_expiring_in(3000)),\n                Ok(identity_expiring_in(4000)),\n            ]);\n\n            let [key1, key2, key3] = [1, 2, 3].map(|i| {\n                sut.key(\n                    &format!(\"test-bucket-{i}--usw2-az1--x-s3\"),\n                    &Credentials::for_tests_with_session_token(),\n                )\n            });\n\n            // This should pupulate a cache entry for `key1`.\n            expect_identity(1000, &sut, key1.clone(), || {\n                let identity_resolver = identity_resolver.clone();\n                let runtime_components = runtime_components.clone();\n                async move { load(identity_resolver, &runtime_components).await }\n            })\n            .await;\n            // This immediate next call for `key1` should be a cache hit.\n            expect_identity(1000, &sut, key1.clone(), || async move {\n                panic!(\"new identity should not be loaded\")\n            })\n            .await;\n\n            // This should pupulate a cache entry for `key2`.\n            expect_identity(2000, &sut, key2, || {\n                let identity_resolver = identity_resolver.clone();\n                let runtime_components = runtime_components.clone();\n                async move { load(identity_resolver, &runtime_components).await }\n            })\n            .await;\n\n            // This should pupulate a cache entry for `key3`, but evicting a cache entry for `key1` because the cache is full.\n            expect_identity(3000, &sut, key3.clone(), || {\n                let identity_resolver = identity_resolver.clone();\n                let runtime_components = runtime_components.clone();\n                async move { load(identity_resolver, &runtime_components).await }\n            })\n            .await;\n\n            // Attempt to get an identity for `key1` should end up fetching a new one since its cache entry has been evicted.\n            // This fetch should now evict a cache entry for `key2`.\n            expect_identity(4000, &sut, key1, || async move {\n                load(identity_resolver, &runtime_components).await\n            })\n            .await;\n\n            // A cache entry for `key3` should still exist in the cache.\n            expect_identity(3000, &sut, key3, || async move {\n                panic!(\"new identity should not be loaded\")\n            })\n            .await;\n        }\n    }\n}\n/// Supporting code for S3 Express identity provider\npub(crate) mod identity_provider {\n    use std::time::{Duration, SystemTime};\n\n    use crate::s3_express::identity_cache::S3ExpressIdentityCache;\n    use crate::types::SessionCredentials;\n    use aws_credential_types::credential_feature::AwsCredentialFeature;\n    use aws_credential_types::provider::error::CredentialsError;\n    use aws_credential_types::Credentials;\n    use aws_smithy_async::time::{SharedTimeSource, TimeSource};\n    use aws_smithy_runtime_api::box_error::BoxError;\n    use aws_smithy_runtime_api::client::endpoint::EndpointResolverParams;\n    use aws_smithy_runtime_api::client::identity::{\n        Identity, IdentityCacheLocation, IdentityFuture, ResolveCachedIdentity, ResolveIdentity,\n    };\n    use aws_smithy_runtime_api::client::interceptors::SharedInterceptor;\n    use aws_smithy_runtime_api::client::runtime_components::{\n        GetIdentityResolver, RuntimeComponents,\n    };\n    use aws_smithy_runtime_api::shared::IntoShared;\n    use aws_smithy_types::config_bag::ConfigBag;\n\n    use super::identity_cache::{DEFAULT_BUFFER_TIME, DEFAULT_MAX_CACHE_CAPACITY};\n\n    #[derive(Debug)]\n    pub(crate) struct DefaultS3ExpressIdentityProvider {\n        behavior_version: crate::config::BehaviorVersion,\n        cache: S3ExpressIdentityCache,\n    }\n\n    impl TryFrom<SessionCredentials> for Credentials {\n        type Error = BoxError;\n\n        fn try_from(session_creds: SessionCredentials) -> Result<Self, Self::Error> {\n            Ok(Credentials::new(\n                session_creds.access_key_id,\n                session_creds.secret_access_key,\n                Some(session_creds.session_token),\n                Some(SystemTime::try_from(session_creds.expiration).map_err(|_| {\n                    CredentialsError::unhandled(\n                        \"credential expiration time cannot be represented by a SystemTime\",\n                    )\n                })?),\n                \"s3express\",\n            ))\n        }\n    }\n\n    impl DefaultS3ExpressIdentityProvider {\n        pub(crate) fn builder() -> Builder {\n            Builder::default()\n        }\n\n        async fn identity<'a>(\n            &'a self,\n            runtime_components: &'a RuntimeComponents,\n            config_bag: &'a ConfigBag,\n        ) -> Result<Identity, BoxError> {\n            let bucket_name = self.bucket_name(config_bag)?;\n\n            let sigv4_identity_resolver = runtime_components\n                .identity_resolver(aws_runtime::auth::sigv4::SCHEME_ID)\n                .ok_or(\"identity resolver for sigv4 should be set for S3\")?;\n            let aws_identity = runtime_components\n                .identity_cache()\n                .resolve_cached_identity(sigv4_identity_resolver, runtime_components, config_bag)\n                .await?;\n\n            let credentials = aws_identity.data::<Credentials>().ok_or(\n                \"wrong identity type for SigV4. Expected AWS credentials but got `{identity:?}\",\n            )?;\n\n            let key = self.cache.key(bucket_name, credentials);\n            self.cache\n                .get_or_load(key, || async move {\n                    let creds = self\n                        .express_session_credentials(bucket_name, runtime_components, config_bag)\n                        .await?;\n                    let mut data = Credentials::try_from(creds)?;\n                    data.get_property_mut_or_default::<Vec<AwsCredentialFeature>>()\n                        .push(AwsCredentialFeature::S3ExpressBucket);\n                    let expiry = data.expiry().unwrap();\n                    Ok((Identity::from(data), expiry))\n                })\n                .await\n        }\n\n        fn bucket_name<'a>(&'a self, config_bag: &'a ConfigBag) -> Result<&'a str, BoxError> {\n            let params = config_bag\n                .load::<EndpointResolverParams>()\n                .expect(\"endpoint resolver params must be set\");\n            let params = params\n                .get::<crate::config::endpoint::Params>()\n                .expect(\"`Params` should be wrapped in `EndpointResolverParams`\");\n            params\n                .bucket()\n                .ok_or(\"A bucket was not set in endpoint params\".into())\n        }\n\n        async fn express_session_credentials<'a>(\n            &'a self,\n            bucket_name: &'a str,\n            runtime_components: &'a RuntimeComponents,\n            config_bag: &'a ConfigBag,\n        ) -> Result<SessionCredentials, BoxError> {\n            let mut config_builder = crate::config::Builder::from_config_bag(config_bag)\n                .behavior_version(self.behavior_version);\n\n            // inherits all runtime components from a current S3 operation but clears out\n            // out interceptors configured for that operation\n            let mut rc_builder = runtime_components.to_builder();\n            rc_builder.set_interceptors(std::iter::empty::<SharedInterceptor>());\n            config_builder.runtime_components = rc_builder;\n\n            let client = crate::Client::from_conf(config_builder.build());\n            let response = client.create_session().bucket(bucket_name).send().await?;\n\n            response\n                .credentials\n                .ok_or(\"no session credentials in response\".into())\n        }\n    }\n\n    #[derive(Default)]\n    pub(crate) struct Builder {\n        behavior_version: Option<crate::config::BehaviorVersion>,\n        time_source: Option<SharedTimeSource>,\n        buffer_time: Option<Duration>,\n    }\n\n    impl Builder {\n        pub(crate) fn behavior_version(\n            mut self,\n            behavior_version: crate::config::BehaviorVersion,\n        ) -> Self {\n            self.set_behavior_version(Some(behavior_version));\n            self\n        }\n        pub(crate) fn set_behavior_version(\n            &mut self,\n            behavior_version: Option<crate::config::BehaviorVersion>,\n        ) -> &mut Self {\n            self.behavior_version = behavior_version;\n            self\n        }\n        pub(crate) fn time_source(mut self, time_source: impl TimeSource + 'static) -> Self {\n            self.set_time_source(time_source.into_shared());\n            self\n        }\n        pub(crate) fn set_time_source(&mut self, time_source: SharedTimeSource) -> &mut Self {\n            self.time_source = Some(time_source.into_shared());\n            self\n        }\n        #[allow(dead_code)]\n        pub(crate) fn buffer_time(mut self, buffer_time: Duration) -> Self {\n            self.set_buffer_time(Some(buffer_time));\n            self\n        }\n        #[allow(dead_code)]\n        pub(crate) fn set_buffer_time(&mut self, buffer_time: Option<Duration>) -> &mut Self {\n            self.buffer_time = buffer_time;\n            self\n        }\n        pub(crate) fn build(self) -> DefaultS3ExpressIdentityProvider {\n            DefaultS3ExpressIdentityProvider {\n                behavior_version: self\n                    .behavior_version\n                    .expect(\"required field `behavior_version` should be set\"),\n                cache: S3ExpressIdentityCache::new(\n                    DEFAULT_MAX_CACHE_CAPACITY,\n                    self.time_source.unwrap_or_default(),\n                    self.buffer_time.unwrap_or(DEFAULT_BUFFER_TIME),\n                ),\n            }\n        }\n    }\n\n    impl ResolveIdentity for DefaultS3ExpressIdentityProvider {\n        fn resolve_identity<'a>(\n            &'a self,\n            runtime_components: &'a RuntimeComponents,\n            config_bag: &'a ConfigBag,\n        ) -> IdentityFuture<'a> {\n            IdentityFuture::new(async move { self.identity(runtime_components, config_bag).await })\n        }\n\n        fn cache_location(&self) -> IdentityCacheLocation {\n            IdentityCacheLocation::IdentityResolver\n        }\n    }\n\n    #[cfg(test)]\n    mod tests {\n        use super::*;\n        use aws_credential_types::credential_feature::AwsCredentialFeature;\n        use aws_credential_types::Credentials;\n\n        // Helper function to create test runtime components with SigV4 identity resolver\n        fn create_test_runtime_components(\n            base_credentials: Credentials,\n        ) -> aws_smithy_runtime_api::client::runtime_components::RuntimeComponents {\n            use aws_credential_types::provider::SharedCredentialsProvider;\n            use aws_smithy_runtime::client::http::test_util::infallible_client_fn;\n            use aws_smithy_runtime::client::orchestrator::endpoints::StaticUriEndpointResolver;\n            use aws_smithy_runtime::client::retries::strategy::NeverRetryStrategy;\n            use aws_smithy_runtime_api::client::auth::static_resolver::StaticAuthSchemeOptionResolver;\n            use aws_smithy_runtime_api::client::identity::SharedIdentityResolver;\n            use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder;\n            use aws_smithy_types::body::SdkBody;\n\n            let sigv4_resolver =\n                SharedIdentityResolver::new(SharedCredentialsProvider::new(base_credentials));\n\n            // Create a simple auth scheme option resolver for testing\n            let auth_option_resolver =\n                StaticAuthSchemeOptionResolver::new(vec![aws_runtime::auth::sigv4::SCHEME_ID]);\n\n            let http_client = infallible_client_fn(|_req| {\n                http::Response::builder()\n                    .status(200)\n                    .body(SdkBody::from(\n                        r#\"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n                        <CreateSessionResult>\n                            <Credentials>\n                                <AccessKeyId>session_access_key</AccessKeyId>\n                                <SecretAccessKey>session_secret_key</SecretAccessKey>\n                                <SessionToken>session_token</SessionToken>\n                                <Expiration>2025-01-01T00:00:00Z</Expiration>\n                            </Credentials>\n                        </CreateSessionResult>\"#,\n                    ))\n                    .unwrap()\n            });\n\n            RuntimeComponentsBuilder::for_tests()\n                .with_identity_resolver(aws_runtime::auth::sigv4::SCHEME_ID, sigv4_resolver)\n                .with_http_client(Some(http_client))\n                .with_time_source(Some(aws_smithy_async::time::SystemTimeSource::new()))\n                .with_retry_strategy(Some(NeverRetryStrategy::new()))\n                .with_auth_scheme_option_resolver(Some(auth_option_resolver))\n                .with_endpoint_resolver(Some(StaticUriEndpointResolver::http_localhost(8080)))\n                .build()\n                .unwrap()\n        }\n\n        // Helper function to create config bag with minimal S3 Express bucket parameters\n        fn create_test_config_bag(bucket_name: &str) -> aws_smithy_types::config_bag::ConfigBag {\n            use aws_smithy_runtime_api::client::endpoint::EndpointResolverParams;\n            use aws_smithy_runtime_api::client::stalled_stream_protection::StalledStreamProtectionConfig;\n            use aws_smithy_types::config_bag::{ConfigBag, Layer};\n\n            let mut config_bag = ConfigBag::base();\n            let mut layer = Layer::new(\"test\");\n\n            let endpoint_params = EndpointResolverParams::new(\n                crate::config::endpoint::Params::builder()\n                    .bucket(bucket_name)\n                    .build()\n                    .unwrap(),\n            );\n            layer.store_put(endpoint_params);\n\n            layer.store_put(StalledStreamProtectionConfig::disabled());\n\n            layer.store_put(crate::config::Region::new(\"us-west-2\"));\n\n            config_bag.push_layer(layer);\n\n            config_bag\n        }\n\n        #[test]\n        fn test_session_credentials_conversion() {\n            let session_creds = SessionCredentials::builder()\n                .access_key_id(\"test_access_key\")\n                .secret_access_key(\"test_secret_key\")\n                .session_token(\"test_session_token\")\n                .expiration(aws_smithy_types::DateTime::from_secs(1000))\n                .build()\n                .expect(\"valid session credentials\");\n\n            let credentials =\n                Credentials::try_from(session_creds).expect(\"conversion should succeed\");\n\n            assert_eq!(credentials.access_key_id(), \"test_access_key\");\n            assert_eq!(credentials.secret_access_key(), \"test_secret_key\");\n            assert_eq!(credentials.session_token(), Some(\"test_session_token\"));\n        }\n\n        #[tokio::test]\n        async fn test_identity_provider_embeds_s3express_feature() {\n            let bucket_name = \"test-bucket--usw2-az1--x-s3\";\n\n            // Use helper functions to set up test components\n            let base_credentials = Credentials::for_tests();\n            let runtime_components = create_test_runtime_components(base_credentials);\n            let config_bag = create_test_config_bag(bucket_name);\n\n            // Create the identity provider\n            let provider = DefaultS3ExpressIdentityProvider::builder()\n                .behavior_version(crate::config::BehaviorVersion::latest())\n                .time_source(aws_smithy_async::time::SystemTimeSource::new())\n                .build();\n\n            // Call identity() and verify the S3ExpressBucket feature is present\n            let identity = provider\n                .identity(&runtime_components, &config_bag)\n                .await\n                .expect(\"identity() should succeed\");\n\n            let credentials = identity\n                .data::<Credentials>()\n                .expect(\"Identity should contain Credentials\");\n            let features = credentials\n                .get_property::<Vec<AwsCredentialFeature>>()\n                .expect(\"Credentials should have features\");\n            assert!(\n                features.contains(&AwsCredentialFeature::S3ExpressBucket),\n                \"S3ExpressBucket feature should be present in Credentials' property field\"\n            );\n\n            let identity_layer = identity\n                .property::<aws_smithy_types::config_bag::FrozenLayer>()\n                .expect(\"Identity should have a property layer\");\n            let identity_features: Vec<AwsCredentialFeature> = identity_layer\n                .load::<AwsCredentialFeature>()\n                .cloned()\n                .collect();\n            assert!(\n                identity_features.contains(&AwsCredentialFeature::S3ExpressBucket),\n                \"S3ExpressBucket feature should be present in Identity's property field\"\n            );\n        }\n    }\n}\n\n/// Supporting code for S3 Express runtime plugin\npub(crate) mod runtime_plugin {\n    use std::borrow::Cow;\n\n    use aws_runtime::auth::SigV4SessionTokenNameOverride;\n    use aws_sigv4::http_request::{SignatureLocation, SigningSettings};\n    use aws_smithy_runtime_api::{\n        box_error::BoxError,\n        client::{runtime_components::RuntimeComponentsBuilder, runtime_plugin::RuntimePlugin},\n    };\n    use aws_smithy_types::config_bag::{ConfigBag, FrozenLayer, Layer};\n    use aws_types::os_shim_internal::Env;\n\n    mod env {\n        pub(super) const S3_DISABLE_EXPRESS_SESSION_AUTH: &str =\n            \"AWS_S3_DISABLE_EXPRESS_SESSION_AUTH\";\n    }\n\n    #[derive(Debug)]\n    pub(crate) struct S3ExpressRuntimePlugin {\n        config: FrozenLayer,\n        runtime_components_builder: RuntimeComponentsBuilder,\n    }\n\n    impl S3ExpressRuntimePlugin {\n        // `new` will be called as `additional_client_plugins` within `base_client_runtime_plugins`.\n        // This guarantees that `new` receives a fully constructed service config, with required\n        // runtime components registered with `RuntimeComponents`.\n        pub(crate) fn new(service_config: crate::config::Config) -> Self {\n            Self::new_with(service_config, Env::real())\n        }\n\n        fn new_with(service_config: crate::config::Config, env: Env) -> Self {\n            Self {\n                config: config(\n                    service_config\n                        .config\n                        .load::<crate::config::DisableS3ExpressSessionAuth>()\n                        .cloned(),\n                    env,\n                ),\n                runtime_components_builder: runtime_components_builder(service_config),\n            }\n        }\n    }\n\n    fn config(\n        disable_s3_express_session_token: Option<crate::config::DisableS3ExpressSessionAuth>,\n        env: Env,\n    ) -> FrozenLayer {\n        let mut layer = Layer::new(\"S3ExpressRuntimePlugin\");\n        if disable_s3_express_session_token.is_none() {\n            match env.get(env::S3_DISABLE_EXPRESS_SESSION_AUTH) {\n                Ok(value)\n                    if value.eq_ignore_ascii_case(\"true\")\n                        || value.eq_ignore_ascii_case(\"false\") =>\n                {\n                    let value = value\n                        .to_lowercase()\n                        .parse::<bool>()\n                        .expect(\"just checked to be a bool-valued string\");\n                    layer.store_or_unset(Some(crate::config::DisableS3ExpressSessionAuth(value)));\n                }\n                Ok(value) => {\n                    tracing::warn!(\n                        \"environment variable `{}` ignored since it only accepts either `true` or `false` (case-insensitive), but got `{}`.\",\n                        env::S3_DISABLE_EXPRESS_SESSION_AUTH,\n                        value\n                    )\n                }\n                _ => {\n                    // TODO(aws-sdk-rust#1073): Transfer a value of\n                    //  `s3_disable_express_session_auth` from a profile file to `layer`\n                }\n            }\n        }\n\n        let session_token_name_override = SigV4SessionTokenNameOverride::new(\n            |settings: &SigningSettings, cfg: &ConfigBag| {\n                // Not configured for S3 express, use the original session token name override\n                if !crate::s3_express::utils::for_s3_express(cfg) {\n                    return Ok(settings.session_token_name_override);\n                }\n\n                let session_token_name_override = Some(match settings.signature_location {\n                SignatureLocation::Headers => \"x-amz-s3session-token\",\n                SignatureLocation::QueryParams => \"X-Amz-S3session-Token\",\n                _ => {\n                    return Err(BoxError::from(\n                        \"`SignatureLocation` adds a new variant, which needs to be handled in a separate match arm\",\n                    ))\n                }\n            });\n                Ok(session_token_name_override)\n            },\n        );\n        layer.store_or_unset(Some(session_token_name_override));\n\n        layer.freeze()\n    }\n\n    fn runtime_components_builder(\n        service_config: crate::config::Config,\n    ) -> RuntimeComponentsBuilder {\n        match (\n            service_config\n                .runtime_components\n                .identity_resolver(&super::auth::SCHEME_ID),\n            service_config\n                .runtime_components\n                .identity_resolver(&aws_runtime::auth::sigv4::SCHEME_ID),\n        ) {\n            (None, Some(_)) => RuntimeComponentsBuilder::new(\"S3ExpressRuntimePlugin\")\n                .with_identity_resolver(\n                    super::auth::SCHEME_ID,\n                    super::identity_provider::DefaultS3ExpressIdentityProvider::builder()\n                        .time_source(\n                            service_config\n                                .runtime_components\n                                .time_source()\n                                .expect(\"should be set in `service_config`\"),\n                        )\n                        .behavior_version(\n                            service_config\n                                .behavior_version\n                                .expect(\"should be set in `service_config`\"),\n                        )\n                        .build(),\n                ),\n            _ => RuntimeComponentsBuilder::new(\"S3ExpressRuntimePlugin\"),\n        }\n    }\n\n    impl RuntimePlugin for S3ExpressRuntimePlugin {\n        fn config(&self) -> Option<FrozenLayer> {\n            Some(self.config.clone())\n        }\n\n        fn runtime_components(\n            &self,\n            _: &RuntimeComponentsBuilder,\n        ) -> Cow<'_, RuntimeComponentsBuilder> {\n            Cow::Borrowed(&self.runtime_components_builder)\n        }\n    }\n\n    #[cfg(test)]\n    mod tests {\n        use super::*;\n        use aws_credential_types::Credentials;\n        use aws_smithy_runtime_api::client::identity::ResolveIdentity;\n\n        #[test]\n        fn disable_option_set_from_service_client_should_take_the_highest_precedence() {\n            // Disable option is set from service client.\n            let disable_s3_express_session_token = crate::config::DisableS3ExpressSessionAuth(true);\n\n            // An environment variable says the session auth is _not_ disabled,\n            // but it will be overruled by what is in `layer`.\n            let actual = config(\n                Some(disable_s3_express_session_token),\n                Env::from_slice(&[(super::env::S3_DISABLE_EXPRESS_SESSION_AUTH, \"false\")]),\n            );\n\n            // A config layer from this runtime plugin should not provide\n            // a new `DisableS3ExpressSessionAuth` if the disable option is set from service client.\n            assert!(actual\n                .load::<crate::config::DisableS3ExpressSessionAuth>()\n                .is_none());\n        }\n\n        #[test]\n        fn disable_option_set_from_env_should_take_the_second_highest_precedence() {\n            // Disable option is set from environment variable.\n            let actual = config(\n                None,\n                Env::from_slice(&[(super::env::S3_DISABLE_EXPRESS_SESSION_AUTH, \"true\")]),\n            );\n\n            // The config layer should provide `DisableS3ExpressSessionAuth` from the environment variable.\n            assert!(\n                actual\n                    .load::<crate::config::DisableS3ExpressSessionAuth>()\n                    .unwrap()\n                    .0\n            );\n        }\n\n        #[should_panic]\n        #[test]\n        fn disable_option_set_from_profile_file_should_take_the_lowest_precedence() {\n            todo!(\"TODO(aws-sdk-rust#1073): Implement profile file test\")\n        }\n\n        #[test]\n        fn disable_option_should_be_unspecified_if_unset() {\n            // Disable option is not set anywhere.\n            let actual = config(None, Env::from_slice(&[]));\n\n            // The config layer should not provide `DisableS3ExpressSessionAuth` when it's not configured.\n            assert!(actual\n                .load::<crate::config::DisableS3ExpressSessionAuth>()\n                .is_none());\n        }\n\n        #[test]\n        fn s3_express_runtime_plugin_should_set_default_identity_resolver() {\n            // Config has SigV4 credentials provider, so S3 Express identity resolver should be set.\n            let config = crate::Config::builder()\n                .behavior_version_latest()\n                .time_source(aws_smithy_async::time::SystemTimeSource::new())\n                .credentials_provider(Credentials::for_tests())\n                .build();\n\n            let actual = runtime_components_builder(config);\n            // The runtime plugin should provide a default S3 Express identity resolver.\n            assert!(actual\n                .identity_resolver(&crate::s3_express::auth::SCHEME_ID)\n                .is_some());\n        }\n\n        #[test]\n        fn s3_express_plugin_should_not_set_default_identity_resolver_without_sigv4_counterpart() {\n            // Config does not have SigV4 credentials provider.\n            let config = crate::Config::builder()\n                .behavior_version_latest()\n                .time_source(aws_smithy_async::time::SystemTimeSource::new())\n                .build();\n\n            let actual = runtime_components_builder(config);\n            // The runtime plugin should not provide S3 Express identity resolver without SigV4 credentials.\n            assert!(actual\n                .identity_resolver(&crate::s3_express::auth::SCHEME_ID)\n                .is_none());\n        }\n\n        #[tokio::test]\n        async fn s3_express_plugin_should_not_set_default_identity_resolver_if_user_provided() {\n            // User provides a custom S3 Express credentials provider.\n            let expected_access_key_id = \"expected acccess key ID\";\n            let config = crate::Config::builder()\n                .behavior_version_latest()\n                .credentials_provider(Credentials::for_tests())\n                .express_credentials_provider(Credentials::new(\n                    expected_access_key_id,\n                    \"secret\",\n                    None,\n                    None,\n                    \"test express credentials provider\",\n                ))\n                .time_source(aws_smithy_async::time::SystemTimeSource::new())\n                .build();\n\n            // The runtime plugin should not override the user-provided identity resolver.\n            let runtime_components_builder = runtime_components_builder(config.clone());\n            assert!(runtime_components_builder\n                .identity_resolver(&crate::s3_express::auth::SCHEME_ID)\n                .is_none());\n\n            // The user-provided identity resolver should be used.\n            let express_identity_resolver = config\n                .runtime_components\n                .identity_resolver(&crate::s3_express::auth::SCHEME_ID)\n                .unwrap();\n            let creds = express_identity_resolver\n                .resolve_identity(\n                    &RuntimeComponentsBuilder::for_tests().build().unwrap(),\n                    &ConfigBag::base(),\n                )\n                .await\n                .unwrap();\n\n            assert_eq!(\n                expected_access_key_id,\n                creds.data::<Credentials>().unwrap().access_key_id()\n            );\n        }\n    }\n}\n\npub(crate) mod checksum {\n    use crate::http_request_checksum::DefaultRequestChecksumOverride;\n    use aws_smithy_checksums::ChecksumAlgorithm;\n    use aws_smithy_types::config_bag::ConfigBag;\n\n    pub(crate) fn provide_default_checksum_algorithm(\n    ) -> crate::http_request_checksum::DefaultRequestChecksumOverride {\n        fn _provide_default_checksum_algorithm(\n            original_checksum: Option<ChecksumAlgorithm>,\n            cfg: &ConfigBag,\n        ) -> Option<ChecksumAlgorithm> {\n            // S3 does not have the `ChecksumAlgorithm::Md5`, therefore customers cannot set it\n            // from outside.\n            if original_checksum != Some(ChecksumAlgorithm::Md5) {\n                return original_checksum;\n            }\n\n            if crate::s3_express::utils::for_s3_express(cfg) {\n                // S3 Express requires setting the default checksum algorithm to CRC-32\n                Some(ChecksumAlgorithm::Crc32)\n            } else {\n                original_checksum\n            }\n        }\n        DefaultRequestChecksumOverride::new(_provide_default_checksum_algorithm)\n    }\n}\n\npub(crate) mod utils {\n    use aws_smithy_types::{config_bag::ConfigBag, Document};\n\n    pub(crate) fn for_s3_express(cfg: &ConfigBag) -> bool {\n        // logic borrowed from aws_smithy_runtime::client::orchestrator::auth::extract_endpoint_auth_scheme_config\n        let endpoint = cfg\n            .load::<crate::config::endpoint::Endpoint>()\n            .expect(\"endpoint added to config bag by endpoint orchestrator\");\n\n        let auth_schemes = match endpoint.properties().get(\"authSchemes\") {\n            Some(Document::Array(schemes)) => schemes,\n            _ => return false,\n        };\n        auth_schemes.iter().any(|doc| {\n            let config_scheme_id = doc\n                .as_object()\n                .and_then(|object| object.get(\"name\"))\n                .and_then(Document::as_string);\n            config_scheme_id == Some(crate::s3_express::auth::SCHEME_ID.as_str())\n        })\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-inlineable/src/s3_request_id.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_smithy_runtime_api::client::result::SdkError;\nuse aws_smithy_runtime_api::http::{Headers, Response};\nuse aws_smithy_types::error::metadata::{Builder as ErrorMetadataBuilder, ErrorMetadata};\n\nconst EXTENDED_REQUEST_ID: &str = \"s3_extended_request_id\";\n\n/// Trait to retrieve the S3-specific extended request ID\n///\n/// Read more at <https://aws.amazon.com/premiumsupport/knowledge-center/s3-request-id-values/>.\npub trait RequestIdExt {\n    /// Returns the S3 Extended Request ID necessary when contacting AWS Support.\n    fn extended_request_id(&self) -> Option<&str>;\n}\n\nimpl<E> RequestIdExt for SdkError<E, Response> {\n    fn extended_request_id(&self) -> Option<&str> {\n        match self {\n            Self::ResponseError(err) => err.raw().headers().extended_request_id(),\n            Self::ServiceError(err) => err.raw().headers().extended_request_id(),\n            _ => None,\n        }\n    }\n}\n\nimpl RequestIdExt for ErrorMetadata {\n    fn extended_request_id(&self) -> Option<&str> {\n        self.extra(EXTENDED_REQUEST_ID)\n    }\n}\n\nimpl<B> RequestIdExt for Response<B> {\n    fn extended_request_id(&self) -> Option<&str> {\n        self.headers().extended_request_id()\n    }\n}\n\nimpl RequestIdExt for Headers {\n    fn extended_request_id(&self) -> Option<&str> {\n        self.get(\"x-amz-id-2\")\n    }\n}\n\nimpl<O, E> RequestIdExt for Result<O, E>\nwhere\n    O: RequestIdExt,\n    E: RequestIdExt,\n{\n    fn extended_request_id(&self) -> Option<&str> {\n        match self {\n            Ok(ok) => ok.extended_request_id(),\n            Err(err) => err.extended_request_id(),\n        }\n    }\n}\n\n/// Applies the extended request ID to a generic error builder\npub(crate) fn apply_extended_request_id(\n    builder: ErrorMetadataBuilder,\n    headers: &Headers,\n) -> ErrorMetadataBuilder {\n    if let Some(extended_request_id) = headers.extended_request_id() {\n        builder.custom(EXTENDED_REQUEST_ID, extended_request_id)\n    } else {\n        builder\n    }\n}\n\n#[cfg(test)]\nmod test {\n    use super::*;\n    use aws_smithy_runtime_api::client::result::SdkError;\n    use aws_smithy_types::body::SdkBody;\n\n    #[test]\n    fn handle_missing_header() {\n        let resp =\n            Response::try_from(http_1x::Response::builder().status(400).body(\"\").unwrap()).unwrap();\n        let mut builder = ErrorMetadata::builder().message(\"123\");\n        builder = apply_extended_request_id(builder, resp.headers());\n        assert_eq!(builder.build().extended_request_id(), None);\n    }\n\n    #[test]\n    fn test_extended_request_id_sdk_error() {\n        let without_extended_request_id = || {\n            Response::try_from(http_1x::Response::builder().body(SdkBody::empty()).unwrap())\n                .unwrap()\n        };\n        let with_extended_request_id = || {\n            Response::try_from(\n                http_1x::Response::builder()\n                    .header(\"x-amz-id-2\", \"some-request-id\")\n                    .body(SdkBody::empty())\n                    .unwrap(),\n            )\n            .unwrap()\n        };\n        assert_eq!(\n            None,\n            SdkError::<(), _>::response_error(\"test\", without_extended_request_id())\n                .extended_request_id()\n        );\n        assert_eq!(\n            Some(\"some-request-id\"),\n            SdkError::<(), _>::response_error(\"test\", with_extended_request_id())\n                .extended_request_id()\n        );\n        assert_eq!(\n            None,\n            SdkError::service_error((), without_extended_request_id()).extended_request_id()\n        );\n        assert_eq!(\n            Some(\"some-request-id\"),\n            SdkError::service_error((), with_extended_request_id()).extended_request_id()\n        );\n    }\n\n    #[test]\n    fn test_extract_extended_request_id() {\n        let mut headers = Headers::new();\n        assert_eq!(None, headers.extended_request_id());\n\n        headers.append(\"x-amz-id-2\", \"some-request-id\");\n        assert_eq!(Some(\"some-request-id\"), headers.extended_request_id());\n    }\n\n    #[test]\n    fn test_apply_extended_request_id() {\n        let mut headers = Headers::new();\n        assert_eq!(\n            ErrorMetadata::builder().build(),\n            apply_extended_request_id(ErrorMetadata::builder(), &headers).build(),\n        );\n\n        headers.append(\"x-amz-id-2\", \"some-request-id\");\n        assert_eq!(\n            ErrorMetadata::builder()\n                .custom(EXTENDED_REQUEST_ID, \"some-request-id\")\n                .build(),\n            apply_extended_request_id(ErrorMetadata::builder(), &headers).build(),\n        );\n    }\n\n    #[test]\n    fn test_error_metadata_extended_request_id_impl() {\n        let err = ErrorMetadata::builder()\n            .custom(EXTENDED_REQUEST_ID, \"some-request-id\")\n            .build();\n        assert_eq!(Some(\"some-request-id\"), err.extended_request_id());\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-inlineable/src/serialization_settings.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n#![allow(dead_code)]\n\nuse aws_smithy_http::header::set_request_header_if_absent;\nuse aws_smithy_types::config_bag::{Storable, StoreReplace};\nuse http_1x::header::{HeaderName, CONTENT_LENGTH, CONTENT_TYPE};\n\n/// Configuration for how default protocol headers are serialized\n#[derive(Clone, Debug, Default)]\npub(crate) struct HeaderSerializationSettings {\n    omit_default_content_length: bool,\n    omit_default_content_type: bool,\n}\n\nimpl HeaderSerializationSettings {\n    /// Creates new [`HeaderSerializationSettings`]\n    pub(crate) fn new() -> Self {\n        Default::default()\n    }\n\n    /// Omit the default `Content-Length` header during serialization\n    pub(crate) fn omit_default_content_length(self) -> Self {\n        Self {\n            omit_default_content_length: true,\n            ..self\n        }\n    }\n\n    /// Omit the default `Content-Type` header during serialization\n    pub(crate) fn omit_default_content_type(self) -> Self {\n        Self {\n            omit_default_content_type: true,\n            ..self\n        }\n    }\n\n    /// Returns true if the given default header name should be serialized\n    fn include_header(&self, header: &HeaderName) -> bool {\n        (!self.omit_default_content_length || header != CONTENT_LENGTH)\n            && (!self.omit_default_content_type || header != CONTENT_TYPE)\n    }\n\n    /// Sets a default header on the given request builder if it should be serialized\n    pub(crate) fn set_default_header(\n        &self,\n        mut request: http_1x::request::Builder,\n        header_name: HeaderName,\n        value: &str,\n    ) -> http_1x::request::Builder {\n        if self.include_header(&header_name) {\n            request = set_request_header_if_absent(request, header_name, value);\n        }\n        request\n    }\n}\n\nimpl Storable for HeaderSerializationSettings {\n    type Storer = StoreReplace<Self>;\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n\n    #[test]\n    fn test_include_header() {\n        let settings = HeaderSerializationSettings::default();\n        assert!(settings.include_header(&CONTENT_LENGTH));\n        assert!(settings.include_header(&CONTENT_TYPE));\n\n        let settings = HeaderSerializationSettings::default().omit_default_content_length();\n        assert!(!settings.include_header(&CONTENT_LENGTH));\n        assert!(settings.include_header(&CONTENT_TYPE));\n\n        let settings = HeaderSerializationSettings::default().omit_default_content_type();\n        assert!(settings.include_header(&CONTENT_LENGTH));\n        assert!(!settings.include_header(&CONTENT_TYPE));\n\n        let settings = HeaderSerializationSettings::default()\n            .omit_default_content_type()\n            .omit_default_content_length();\n        assert!(!settings.include_header(&CONTENT_LENGTH));\n        assert!(!settings.include_header(&CONTENT_TYPE));\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-runtime/Cargo.toml",
    "content": "[package]\nname = \"aws-runtime\"\nversion = \"1.7.3\"\nauthors = [\"AWS Rust SDK Team <aws-sdk-rust@amazon.com>\"]\ndescription = \"Runtime support code for the AWS SDK. This crate isn't intended to be used directly.\"\nedition = \"2021\"\nlicense = \"Apache-2.0\"\nrepository = \"https://github.com/smithy-lang/smithy-rs\"\nrust-version = \"1.91.1\"\n\n[features]\nevent-stream = [\"dep:aws-smithy-eventstream\", \"aws-sigv4/sign-eventstream\"]\nhttp-02x = [\"dep:http-02x\", \"dep:http-body-04x\"]\nhttp-1x = []\ntest-util = [\"dep:regex-lite\"]\nsigv4a = [\"aws-sigv4/sigv4a\"]\n\n[dependencies]\naws-credential-types = { path = \"../aws-credential-types\" }\n# TODO(httpRefactor): Remove the http0-compat feature\naws-sigv4 = { path = \"../aws-sigv4\", features = [\"http0-compat\"] }\naws-smithy-async = { path = \"../../../rust-runtime/aws-smithy-async\" }\naws-smithy-eventstream = { path = \"../../../rust-runtime/aws-smithy-eventstream\", optional = true }\naws-smithy-http = { path = \"../../../rust-runtime/aws-smithy-http\" }\naws-smithy-runtime = { path = \"../../../rust-runtime/aws-smithy-runtime\", features = [\"client\" ] }\naws-smithy-runtime-api = { path = \"../../../rust-runtime/aws-smithy-runtime-api\", features = [\"client\", \"http-1x\"] }\naws-smithy-types = { path = \"../../../rust-runtime/aws-smithy-types\", features = [\"http-body-1-x\"]}\naws-types = { path = \"../aws-types\" }\nbytes = \"1.11.1\"\nbytes-utils = \"0.1.2\"\nfastrand = \"2.3.0\"\nhttp-02x = { package = \"http\", version = \"0.2.12\", optional = true}\nhttp-body-04x = { package = \"http-body\", version = \"0.4.6\", optional = true}\nhttp-1x = { package = \"http\", version = \"1.3.1\"}\nhttp-body-1x = { package = \"http-body\", version = \"1.0.1\"}\npercent-encoding = \"2.3.1\"\npin-project-lite = \"0.2.14\"\nregex-lite = { version = \"0.1.5\", optional = true }\ntracing = \"0.1.44\"\nuuid = { version = \"1\" }\n\n[dev-dependencies]\narbitrary = \"1.3\"\naws-credential-types = { path = \"../aws-credential-types\", features = [\"test-util\"] }\naws-smithy-async = { path = \"../../../rust-runtime/aws-smithy-async\", features = [\"test-util\"] }\naws-smithy-protocol-test = { path = \"../../../rust-runtime/aws-smithy-protocol-test\" }\naws-smithy-runtime-api = { path = \"../../../rust-runtime/aws-smithy-runtime-api\", features = [\"test-util\", \"http-1x\"] }\naws-smithy-types = { path = \"../../../rust-runtime/aws-smithy-types\", features = [\"test-util\"] }\nbytes-utils = \"0.1.2\"\nconvert_case = \"0.6.0\"\nfutures-util = { version = \"0.3.29\", default-features = false }\nhttp-body-util = \"0.1.3\"\nproptest = \"1.2\"\nserde = { version = \"1\", features = [\"derive\"]}\nserde_json = \"1\"\ntokio = { version = \"1.49.0\", features = [\"macros\", \"rt\", \"time\"] }\ntracing-subscriber = { version = \"0.3.17\", features = [\"env-filter\"] }\ntracing-test = \"0.2.4\"\n\n[package.metadata.docs.rs]\nall-features = true\ntargets = [\"x86_64-unknown-linux-gnu\"]\ncargo-args = [\"-Zunstable-options\", \"-Zrustdoc-scrape-examples\"]\nrustdoc-args = [\"--cfg\", \"docsrs\"]\n# End of docs.rs metadata\n\n[package.metadata.smithy-rs-release-tooling]\nstable = true\n"
  },
  {
    "path": "aws/rust-runtime/aws-runtime/LICENSE",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n"
  },
  {
    "path": "aws/rust-runtime/aws-runtime/README.md",
    "content": "aws-runtime\n===========\n\nRuntime support code for the AWS SDK. This crate isn't intended to be used directly.\n\n<!-- anchor_start:footer -->\nThis crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly.\n<!-- anchor_end:footer -->\n"
  },
  {
    "path": "aws/rust-runtime/aws-runtime/additional-ci",
    "content": "#!/bin/bash\n#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\n\n# This script contains additional CI checks to run for this specific package\n\nset -e\n\necho \"### Testing every combination of features (excluding --all-features)\"\ncargo hack test --feature-powerset --exclude-all-features\n"
  },
  {
    "path": "aws/rust-runtime/aws-runtime/external-types.toml",
    "content": "allowed_external_types = [\n    \"aws_sigv4::*\",\n    \"aws_smithy_types::*\",\n    \"aws_smithy_runtime_api::*\",\n    \"aws_types::*\",\n    \"bytes::bytes::Bytes\",\n\n    # Used by the aws-chunked implementation\n    \"http_body::Body\",\n]\n"
  },
  {
    "path": "aws/rust-runtime/aws-runtime/src/auth/sigv4.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::auth::{\n    self, extract_endpoint_auth_scheme_signing_name, extract_endpoint_auth_scheme_signing_options,\n    extract_endpoint_auth_scheme_signing_region, PayloadSigningOverride,\n    SigV4OperationSigningConfig, SigV4SessionTokenNameOverride, SigV4SigningError,\n};\nuse crate::content_encoding::{DeferredSignerSender, SignChunk};\nuse aws_credential_types::Credentials;\nuse aws_sigv4::http_request::{\n    sign, SignableBody, SignableRequest, SigningError, SigningParams, SigningSettings,\n};\nuse aws_sigv4::sign::v4::{self, sign_chunk, sign_trailer};\nuse aws_smithy_async::time::{SharedTimeSource, StaticTimeSource};\nuse aws_smithy_runtime_api::box_error::BoxError;\nuse aws_smithy_runtime_api::client::auth::{\n    AuthScheme, AuthSchemeEndpointConfig, AuthSchemeId, Sign,\n};\nuse aws_smithy_runtime_api::client::identity::{Identity, SharedIdentityResolver};\nuse aws_smithy_runtime_api::client::orchestrator::HttpRequest;\nuse aws_smithy_runtime_api::client::runtime_components::{GetIdentityResolver, RuntimeComponents};\nuse aws_smithy_runtime_api::http::Headers;\nuse aws_smithy_types::config_bag::ConfigBag;\nuse aws_types::region::SigningRegion;\nuse aws_types::SigningName;\nuse bytes::Bytes;\nuse std::borrow::Cow;\nuse std::time::SystemTime;\n\nconst EXPIRATION_WARNING: &str = \"Presigned request will expire before the given \\\n        `expires_in` duration because the credentials used to sign it will expire first.\";\n\n/// Auth scheme ID for SigV4.\npub const SCHEME_ID: AuthSchemeId = AuthSchemeId::new(\"sigv4\");\n\n/// SigV4 auth scheme.\n#[derive(Debug, Default)]\npub struct SigV4AuthScheme {\n    signer: SigV4Signer,\n}\n\nimpl SigV4AuthScheme {\n    /// Creates a new `SigV4AuthScheme`.\n    pub fn new() -> Self {\n        Default::default()\n    }\n}\n\nimpl AuthScheme for SigV4AuthScheme {\n    fn scheme_id(&self) -> AuthSchemeId {\n        SCHEME_ID\n    }\n\n    fn identity_resolver(\n        &self,\n        identity_resolvers: &dyn GetIdentityResolver,\n    ) -> Option<SharedIdentityResolver> {\n        identity_resolvers.identity_resolver(self.scheme_id())\n    }\n\n    fn signer(&self) -> &dyn Sign {\n        &self.signer\n    }\n}\n\n/// SigV4 signer.\n#[derive(Debug, Default)]\npub struct SigV4Signer;\n\nimpl SigV4Signer {\n    /// Creates a new signer instance.\n    pub fn new() -> Self {\n        Self\n    }\n\n    fn settings(operation_config: &SigV4OperationSigningConfig) -> SigningSettings {\n        super::settings(operation_config)\n    }\n\n    fn signing_params<'a>(\n        settings: SigningSettings,\n        identity: &'a Identity,\n        operation_config: &'a SigV4OperationSigningConfig,\n        request_timestamp: SystemTime,\n    ) -> Result<v4::SigningParams<'a, SigningSettings>, SigV4SigningError> {\n        let creds = identity\n            .data::<Credentials>()\n            .ok_or_else(|| SigV4SigningError::WrongIdentityType(identity.clone()))?;\n\n        if let Some(expires_in) = settings.expires_in {\n            if let Some(creds_expires_time) = creds.expiry() {\n                let presigned_expires_time = request_timestamp + expires_in;\n                if presigned_expires_time > creds_expires_time {\n                    tracing::warn!(EXPIRATION_WARNING);\n                }\n            }\n        }\n\n        Ok(v4::SigningParams::builder()\n            .identity(identity)\n            .region(\n                operation_config\n                    .region\n                    .as_ref()\n                    .ok_or(SigV4SigningError::MissingSigningRegion)?\n                    .as_ref(),\n            )\n            .name(\n                operation_config\n                    .name\n                    .as_ref()\n                    .ok_or(SigV4SigningError::MissingSigningName)?\n                    .as_ref(),\n            )\n            .time(request_timestamp)\n            .settings(settings)\n            .build()\n            .expect(\"all required fields set\"))\n    }\n\n    fn extract_operation_config<'a>(\n        auth_scheme_endpoint_config: AuthSchemeEndpointConfig<'a>,\n        config_bag: &'a ConfigBag,\n    ) -> Result<Cow<'a, SigV4OperationSigningConfig>, SigV4SigningError> {\n        let operation_config = config_bag\n            .load::<SigV4OperationSigningConfig>()\n            .ok_or(SigV4SigningError::MissingOperationSigningConfig)?;\n\n        let name = extract_endpoint_auth_scheme_signing_name(&auth_scheme_endpoint_config)?\n            .or(config_bag.load::<SigningName>().cloned());\n\n        let region = extract_endpoint_auth_scheme_signing_region(&auth_scheme_endpoint_config)?\n            .or(config_bag.load::<SigningRegion>().cloned());\n\n        let signing_options = extract_endpoint_auth_scheme_signing_options(\n            &auth_scheme_endpoint_config,\n            &operation_config.signing_options,\n        )?;\n\n        match (region, name, signing_options) {\n            (None, None, Cow::Borrowed(_)) => Ok(Cow::Borrowed(operation_config)),\n            (region, name, signing_options) => {\n                let mut operation_config = operation_config.clone();\n                operation_config.region = region.or(operation_config.region);\n                operation_config.name = name.or(operation_config.name);\n                operation_config.signing_options = match signing_options {\n                    Cow::Owned(opts) => opts,\n                    Cow::Borrowed(_) => operation_config.signing_options,\n                };\n                Ok(Cow::Owned(operation_config))\n            }\n        }\n    }\n}\n\nimpl Sign for SigV4Signer {\n    fn sign_http_request(\n        &self,\n        request: &mut HttpRequest,\n        identity: &Identity,\n        auth_scheme_endpoint_config: AuthSchemeEndpointConfig<'_>,\n        runtime_components: &RuntimeComponents,\n        config_bag: &ConfigBag,\n    ) -> Result<(), BoxError> {\n        if identity.data::<Credentials>().is_none() {\n            return Err(SigV4SigningError::WrongIdentityType(identity.clone()).into());\n        };\n\n        let operation_config =\n            Self::extract_operation_config(auth_scheme_endpoint_config, config_bag)?;\n        let request_time = runtime_components.time_source().unwrap_or_default().now();\n\n        let settings = if let Some(session_token_name_override) =\n            config_bag.load::<SigV4SessionTokenNameOverride>()\n        {\n            let mut settings = Self::settings(&operation_config);\n            let name_override = session_token_name_override.name_override(&settings, config_bag)?;\n            settings.session_token_name_override = name_override;\n            settings\n        } else {\n            Self::settings(&operation_config)\n        };\n\n        let chunk_signer_sender = config_bag.load::<DeferredSignerSender>();\n\n        // `sender_and_settings` needs to include a cloned `settings` to satisfy Rust's borrow checker\n        let (signing_params, sender_and_settings) = if let Some(signer_sender) = chunk_signer_sender\n        {\n            // Clone settings since we'll need it later for the message signer\n            let signing_params =\n                Self::signing_params(settings.clone(), identity, &operation_config, request_time)?;\n            (signing_params, Some((signer_sender, settings)))\n        } else {\n            // Move settings since we won't need it later\n            let signing_params =\n                Self::signing_params(settings, identity, &operation_config, request_time)?;\n            (signing_params, None)\n        };\n\n        let (signing_instructions, _signature) = {\n            // A body that is already in memory can be signed directly. A body that is not in memory\n            // (any sort of streaming body or presigned request) will be signed via UNSIGNED-PAYLOAD.\n            let mut signable_body = operation_config\n                .signing_options\n                .payload_override\n                .as_ref()\n                // the payload_override is a cheap clone because it contains either a\n                // reference or a short checksum (we're not cloning the entire body)\n                .cloned()\n                .unwrap_or_else(|| {\n                    request\n                        .body()\n                        .bytes()\n                        .map(SignableBody::Bytes)\n                        .unwrap_or(SignableBody::UnsignedPayload)\n                });\n\n            // Sometimes it's necessary to override the payload signing scheme.\n            // If an override exists then fetch and apply it.\n            if let Some(payload_signing_override) = config_bag.load::<PayloadSigningOverride>() {\n                tracing::trace!(\n                    \"payload signing was overridden, now set to {payload_signing_override:?}\"\n                );\n                signable_body = payload_signing_override.clone().to_signable_body();\n            }\n\n            let signable_request = SignableRequest::new(\n                request.method(),\n                request.uri(),\n                request.headers().iter(),\n                signable_body,\n            )?;\n            sign(signable_request, &SigningParams::V4(signing_params))?\n        }\n        .into_parts();\n\n        if let Some((signer_sender, settings)) = sender_and_settings {\n            let time_source = StaticTimeSource::new(request_time).into();\n            let region = operation_config\n                .region\n                .clone()\n                .expect(\"`Self::signing_params` above would have errored, if region was missing\");\n            let name = operation_config\n                .name\n                .clone()\n                .expect(\"`Self::signing_params` above would have errored, if name was missing\");\n            signer_sender\n                .send(Box::new(SigV4MessageSigner::new(\n                    _signature.clone(),\n                    identity.clone(),\n                    region,\n                    name,\n                    time_source,\n                    settings,\n                )) as _)\n                .expect(\"failed to send deferred signer\");\n        };\n\n        // If this is an event stream operation, set up the event stream signer\n        #[cfg(feature = \"event-stream\")]\n        {\n            use crate::auth::sigv4::SigV4MessageSigner;\n            use aws_smithy_eventstream::frame::DeferredSignerSender;\n\n            if let Some(signer_sender) = config_bag.load::<DeferredSignerSender>() {\n                let time_source = runtime_components.time_source().unwrap_or_default();\n                let region = operation_config.region.clone().expect(\n                    \"`Self::signing_params` above would have errored, if region was missing\",\n                );\n                let name = operation_config\n                    .name\n                    .clone()\n                    .expect(\"`Self::signing_params` above would have errored, if name was missing\");\n                signer_sender\n                    .send(Box::new(SigV4MessageSigner::new(\n                        _signature,\n                        identity.clone(),\n                        region,\n                        name,\n                        time_source,\n                        (),\n                    )) as _)\n                    .expect(\"failed to send deferred signer\");\n            }\n        }\n        auth::apply_signing_instructions(signing_instructions, request)?;\n        Ok(())\n    }\n}\n\n#[derive(Debug)]\npub(crate) struct SigV4MessageSigner<S> {\n    running_signature: String,\n    identity: Identity,\n    signing_region: SigningRegion,\n    signing_name: SigningName,\n    time: SharedTimeSource,\n    signing_settings: S,\n}\n\nimpl<S> SigV4MessageSigner<S>\nwhere\n    S: Clone + Default,\n{\n    pub(crate) fn new(\n        running_signature: String,\n        identity: Identity,\n        signing_region: SigningRegion,\n        signing_name: SigningName,\n        time: SharedTimeSource,\n        signing_settings: S,\n    ) -> Self {\n        Self {\n            running_signature,\n            identity,\n            signing_region,\n            signing_name,\n            time,\n            signing_settings,\n        }\n    }\n\n    fn signing_params(&self) -> v4::SigningParams<'_, S> {\n        let builder = v4::SigningParams::builder()\n            .identity(&self.identity)\n            .region(self.signing_region.as_ref())\n            .name(self.signing_name.as_ref())\n            .time(self.time.now())\n            .settings(self.signing_settings.clone());\n        builder.build().unwrap()\n    }\n}\n\nimpl SignChunk for SigV4MessageSigner<SigningSettings> {\n    fn chunk_signature(&mut self, chunk: &Bytes) -> Result<String, SigningError> {\n        let params = self.signing_params();\n        let (_, signature) = sign_chunk(chunk, &self.running_signature, &params)?.into_parts();\n        self.running_signature = signature.clone();\n        Ok(signature)\n    }\n\n    fn trailer_signature(&mut self, trailing_headers: &Headers) -> Result<String, SigningError> {\n        let params = self.signing_params();\n        let (_, signature) =\n            sign_trailer(trailing_headers, &self.running_signature, &params)?.into_parts();\n        self.running_signature = signature.clone();\n        Ok(signature)\n    }\n}\n\n#[cfg(feature = \"event-stream\")]\nmod event_stream {\n    use crate::auth::sigv4::SigV4MessageSigner;\n    use aws_sigv4::event_stream::{sign_empty_message, sign_message};\n    use aws_smithy_eventstream::frame::{SignMessage, SignMessageError};\n    use aws_smithy_types::event_stream::Message;\n\n    impl SignMessage for SigV4MessageSigner<()> {\n        fn sign(&mut self, message: Message) -> Result<Message, SignMessageError> {\n            let (signed_message, signature) = {\n                let params = self.signing_params();\n                sign_message(&message, &self.running_signature, &params)?.into_parts()\n            };\n            self.running_signature = signature;\n            Ok(signed_message)\n        }\n\n        fn sign_empty(&mut self) -> Option<Result<Message, SignMessageError>> {\n            let (signed_message, signature) = {\n                let params = self.signing_params();\n                sign_empty_message(&self.running_signature, &params)\n                    .ok()?\n                    .into_parts()\n            };\n            self.running_signature = signature;\n            Some(Ok(signed_message))\n        }\n    }\n\n    #[cfg(test)]\n    mod tests {\n        use crate::auth::sigv4::SigV4MessageSigner;\n        use aws_credential_types::Credentials;\n        use aws_smithy_async::time::SharedTimeSource;\n        use aws_smithy_eventstream::frame::SignMessage;\n        use aws_smithy_types::event_stream::{HeaderValue, Message};\n\n        use aws_types::region::Region;\n        use aws_types::region::SigningRegion;\n        use aws_types::SigningName;\n        use std::time::{Duration, UNIX_EPOCH};\n\n        fn check_send_sync<T: Send + Sync>(value: T) -> T {\n            value\n        }\n\n        #[test]\n        fn sign_message() {\n            let region = Region::new(\"us-east-1\");\n            let mut signer = check_send_sync(SigV4MessageSigner::new(\n                \"initial-signature\".into(),\n                Credentials::for_tests_with_session_token().into(),\n                SigningRegion::from(region),\n                SigningName::from_static(\"transcribe\"),\n                SharedTimeSource::new(UNIX_EPOCH + Duration::new(1611160427, 0)),\n                (),\n            ));\n            let mut signatures = Vec::new();\n            for _ in 0..5 {\n                let signed = signer\n                    .sign(Message::new(&b\"identical message\"[..]))\n                    .unwrap();\n                if let HeaderValue::ByteArray(signature) = signed\n                    .headers()\n                    .iter()\n                    .find(|h| h.name().as_str() == \":chunk-signature\")\n                    .unwrap()\n                    .value()\n                {\n                    signatures.push(signature.clone());\n                } else {\n                    panic!(\"failed to get the :chunk-signature\")\n                }\n            }\n            for i in 1..signatures.len() {\n                assert_ne!(signatures[i - 1], signatures[i]);\n            }\n        }\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use crate::auth::{HttpSignatureType, SigningOptions};\n    use aws_credential_types::Credentials;\n    use aws_sigv4::http_request::SigningSettings;\n    use aws_smithy_types::config_bag::Layer;\n    use aws_smithy_types::Document;\n    use aws_types::region::SigningRegion;\n    use aws_types::SigningName;\n    use std::collections::HashMap;\n    use std::time::{Duration, SystemTime};\n    use tracing_test::traced_test;\n\n    #[test]\n    #[traced_test]\n    fn expiration_warning() {\n        let now = SystemTime::UNIX_EPOCH + Duration::from_secs(1000);\n        let creds_expire_in = Duration::from_secs(100);\n\n        let mut settings = SigningSettings::default();\n        settings.expires_in = Some(creds_expire_in - Duration::from_secs(10));\n\n        let identity = Credentials::new(\n            \"test-access-key\",\n            \"test-secret-key\",\n            Some(\"test-session-token\".into()),\n            Some(now + creds_expire_in),\n            \"test\",\n        )\n        .into();\n        let operation_config = SigV4OperationSigningConfig {\n            region: Some(SigningRegion::from_static(\"test\")),\n            name: Some(SigningName::from_static(\"test\")),\n            signing_options: SigningOptions {\n                double_uri_encode: true,\n                content_sha256_header: true,\n                normalize_uri_path: true,\n                omit_session_token: true,\n                signature_type: HttpSignatureType::HttpRequestHeaders,\n                signing_optional: false,\n                expires_in: None,\n                payload_override: None,\n            },\n            ..Default::default()\n        };\n        SigV4Signer::signing_params(settings, &identity, &operation_config, now).unwrap();\n        assert!(!logs_contain(EXPIRATION_WARNING));\n\n        let mut settings = SigningSettings::default();\n        settings.expires_in = Some(creds_expire_in + Duration::from_secs(10));\n\n        SigV4Signer::signing_params(settings, &identity, &operation_config, now).unwrap();\n        assert!(logs_contain(EXPIRATION_WARNING));\n    }\n\n    #[test]\n    fn endpoint_config_overrides_region_and_service() {\n        let mut layer = Layer::new(\"test\");\n        layer.store_put(SigV4OperationSigningConfig {\n            region: Some(SigningRegion::from_static(\"override-this-region\")),\n            name: Some(SigningName::from_static(\"override-this-name\")),\n            ..Default::default()\n        });\n        let config = Document::Object({\n            let mut out = HashMap::new();\n            out.insert(\"name\".to_string(), \"sigv4\".to_string().into());\n            out.insert(\n                \"signingName\".to_string(),\n                \"qldb-override\".to_string().into(),\n            );\n            out.insert(\n                \"signingRegion\".to_string(),\n                \"us-east-override\".to_string().into(),\n            );\n            out\n        });\n        let config = AuthSchemeEndpointConfig::from(Some(&config));\n\n        let cfg = ConfigBag::of_layers(vec![layer]);\n        let result = SigV4Signer::extract_operation_config(config, &cfg).expect(\"success\");\n\n        assert_eq!(\n            result.region,\n            Some(SigningRegion::from_static(\"us-east-override\"))\n        );\n        assert_eq!(result.name, Some(SigningName::from_static(\"qldb-override\")));\n        assert!(matches!(result, Cow::Owned(_)));\n    }\n\n    #[test]\n    fn endpoint_config_supports_fallback_when_region_or_service_are_unset() {\n        let mut layer = Layer::new(\"test\");\n        layer.store_put(SigV4OperationSigningConfig {\n            region: Some(SigningRegion::from_static(\"us-east-1\")),\n            name: Some(SigningName::from_static(\"qldb\")),\n            ..Default::default()\n        });\n        let cfg = ConfigBag::of_layers(vec![layer]);\n        let config = AuthSchemeEndpointConfig::empty();\n\n        let result = SigV4Signer::extract_operation_config(config, &cfg).expect(\"success\");\n\n        assert_eq!(result.region, Some(SigningRegion::from_static(\"us-east-1\")));\n        assert_eq!(result.name, Some(SigningName::from_static(\"qldb\")));\n        assert!(matches!(result, Cow::Borrowed(_)));\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-runtime/src/auth/sigv4a.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::auth::{\n    apply_signing_instructions, extract_endpoint_auth_scheme_signing_name,\n    extract_endpoint_auth_scheme_signing_options, SigV4OperationSigningConfig, SigV4SigningError,\n};\nuse aws_credential_types::Credentials;\nuse aws_sigv4::http_request::{sign, SignableBody, SignableRequest, SigningSettings};\nuse aws_sigv4::sign::v4a;\nuse aws_smithy_runtime_api::box_error::BoxError;\nuse aws_smithy_runtime_api::client::auth::{\n    AuthScheme, AuthSchemeEndpointConfig, AuthSchemeId, Sign,\n};\nuse aws_smithy_runtime_api::client::identity::{Identity, SharedIdentityResolver};\nuse aws_smithy_runtime_api::client::orchestrator::HttpRequest;\nuse aws_smithy_runtime_api::client::runtime_components::{GetIdentityResolver, RuntimeComponents};\nuse aws_smithy_types::config_bag::ConfigBag;\nuse aws_types::region::{Region, SigningRegionSet};\nuse aws_types::SigningName;\nuse std::borrow::Cow;\nuse std::time::SystemTime;\n\nconst EXPIRATION_WARNING: &str = \"Presigned request will expire before the given \\\n        `expires_in` duration because the credentials used to sign it will expire first.\";\n\n/// Auth scheme ID for SigV4a.\npub const SCHEME_ID: AuthSchemeId = AuthSchemeId::new(\"sigv4a\");\n\n/// SigV4a auth scheme.\n#[derive(Debug, Default)]\npub struct SigV4aAuthScheme {\n    signer: SigV4aSigner,\n}\n\nimpl SigV4aAuthScheme {\n    /// Creates a new `SigV4aHttpAuthScheme`.\n    pub fn new() -> Self {\n        Default::default()\n    }\n}\n\nimpl AuthScheme for SigV4aAuthScheme {\n    fn scheme_id(&self) -> AuthSchemeId {\n        SCHEME_ID\n    }\n\n    fn identity_resolver(\n        &self,\n        identity_resolvers: &dyn GetIdentityResolver,\n    ) -> Option<SharedIdentityResolver> {\n        identity_resolvers.identity_resolver(self.scheme_id())\n    }\n\n    fn signer(&self) -> &dyn Sign {\n        &self.signer\n    }\n}\n\n/// SigV4a HTTP request signer.\n#[derive(Debug, Default)]\n#[non_exhaustive]\npub struct SigV4aSigner;\n\nimpl SigV4aSigner {\n    /// Creates a new signer instance.\n    pub fn new() -> Self {\n        Self\n    }\n\n    fn settings(operation_config: &SigV4OperationSigningConfig) -> SigningSettings {\n        super::settings(operation_config)\n    }\n\n    fn signing_params<'a>(\n        settings: SigningSettings,\n        identity: &'a Identity,\n        operation_config: &'a SigV4OperationSigningConfig,\n        request_timestamp: SystemTime,\n    ) -> Result<v4a::SigningParams<'a, SigningSettings>, SigV4SigningError> {\n        if let Some(expires_in) = settings.expires_in {\n            if let Some(identity_expiration) = identity.expiration() {\n                let presigned_expires_time = request_timestamp + expires_in;\n                if presigned_expires_time > identity_expiration {\n                    tracing::warn!(EXPIRATION_WARNING);\n                }\n            }\n        }\n\n        Ok(v4a::SigningParams::builder()\n            .identity(identity)\n            .region_set(\n                operation_config\n                    .region_set\n                    .as_ref()\n                    .ok_or(SigV4SigningError::MissingSigningRegionSet)?\n                    .as_ref(),\n            )\n            .name(\n                operation_config\n                    .name\n                    .as_ref()\n                    .ok_or(SigV4SigningError::MissingSigningName)?\n                    .as_ref(),\n            )\n            .time(request_timestamp)\n            .settings(settings)\n            .build()\n            .expect(\"all required fields set\"))\n    }\n\n    fn extract_operation_config<'a>(\n        auth_scheme_endpoint_config: AuthSchemeEndpointConfig<'a>,\n        config_bag: &'a ConfigBag,\n    ) -> Result<Cow<'a, SigV4OperationSigningConfig>, SigV4SigningError> {\n        let operation_config = config_bag\n            .load::<SigV4OperationSigningConfig>()\n            .ok_or(SigV4SigningError::MissingOperationSigningConfig)?;\n\n        let name = extract_endpoint_auth_scheme_signing_name(&auth_scheme_endpoint_config)?\n            .or(config_bag.load::<SigningName>().cloned());\n\n        let region_set = config_bag\n            .load::<SigningRegionSet>()\n            .cloned()\n            .or(extract_endpoint_auth_scheme_signing_region_set(\n                &auth_scheme_endpoint_config,\n            )?)\n            .or(config_bag\n                .load::<Region>()\n                .cloned()\n                .map(SigningRegionSet::from));\n\n        let signing_options = extract_endpoint_auth_scheme_signing_options(\n            &auth_scheme_endpoint_config,\n            &operation_config.signing_options,\n        )?;\n\n        match (region_set, name, signing_options) {\n            (None, None, Cow::Borrowed(_)) => Ok(Cow::Borrowed(operation_config)),\n            (region_set, name, signing_options) => {\n                let mut operation_config = operation_config.clone();\n                operation_config.region_set = region_set.or(operation_config.region_set);\n                operation_config.name = name.or(operation_config.name);\n                operation_config.signing_options = match signing_options {\n                    Cow::Owned(opts) => opts,\n                    Cow::Borrowed(_) => operation_config.signing_options,\n                };\n                Ok(Cow::Owned(operation_config))\n            }\n        }\n    }\n}\n\nfn extract_endpoint_auth_scheme_signing_region_set(\n    endpoint_config: &AuthSchemeEndpointConfig<'_>,\n) -> Result<Option<SigningRegionSet>, SigV4SigningError> {\n    use aws_smithy_types::Document::Array;\n    use SigV4SigningError::BadTypeInEndpointAuthSchemeConfig as UnexpectedType;\n\n    match super::extract_field_from_endpoint_config(\"signingRegionSet\", endpoint_config) {\n        Some(Array(docs)) => {\n            // The service defines the region set as a string array. Here, we convert it to a comma separated list.\n            let region_set: SigningRegionSet =\n                docs.iter().filter_map(|doc| doc.as_string()).collect();\n\n            Ok(Some(region_set))\n        }\n        None => Ok(None),\n        _it => Err(UnexpectedType(\"signingRegionSet\")),\n    }\n}\n\nimpl Sign for SigV4aSigner {\n    fn sign_http_request(\n        &self,\n        request: &mut HttpRequest,\n        identity: &Identity,\n        auth_scheme_endpoint_config: AuthSchemeEndpointConfig<'_>,\n        runtime_components: &RuntimeComponents,\n        config_bag: &ConfigBag,\n    ) -> Result<(), BoxError> {\n        let operation_config =\n            Self::extract_operation_config(auth_scheme_endpoint_config, config_bag)?;\n        let request_time = runtime_components.time_source().unwrap_or_default().now();\n\n        if identity.data::<Credentials>().is_none() {\n            return Err(SigV4SigningError::WrongIdentityType(identity.clone()).into());\n        }\n\n        let settings = Self::settings(&operation_config);\n        let signing_params =\n            Self::signing_params(settings, identity, &operation_config, request_time)?;\n\n        let (signing_instructions, _signature) = {\n            // A body that is already in memory can be signed directly. A body that is not in memory\n            // (any sort of streaming body or presigned request) will be signed via UNSIGNED-PAYLOAD.\n            let signable_body = operation_config\n                .signing_options\n                .payload_override\n                .as_ref()\n                // the payload_override is a cheap clone because it contains either a\n                // reference or a short checksum (we're not cloning the entire body)\n                .cloned()\n                .unwrap_or_else(|| {\n                    request\n                        .body()\n                        .bytes()\n                        .map(SignableBody::Bytes)\n                        .unwrap_or(SignableBody::UnsignedPayload)\n                });\n\n            let signable_request = SignableRequest::new(\n                request.method(),\n                request.uri().to_string(),\n                request.headers().iter(),\n                signable_body,\n            )?;\n            sign(signable_request, &signing_params.into())?\n        }\n        .into_parts();\n\n        apply_signing_instructions(signing_instructions, request)?;\n        Ok(())\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::{SigV4OperationSigningConfig, SigV4aSigner, EXPIRATION_WARNING};\n    use crate::auth::{HttpSignatureType, SigningOptions};\n    use aws_credential_types::Credentials;\n    use aws_sigv4::http_request::SigningSettings;\n    use aws_smithy_runtime_api::client::auth::AuthSchemeEndpointConfig;\n    use aws_smithy_types::config_bag::{ConfigBag, Layer};\n    use aws_smithy_types::Document;\n    use aws_types::region::{Region, SigningRegionSet};\n    use aws_types::SigningName;\n    use std::borrow::Cow;\n    use std::collections::HashMap;\n    use std::time::{Duration, SystemTime};\n    use tracing_test::traced_test;\n\n    #[test]\n    #[traced_test]\n    fn expiration_warning() {\n        let now = SystemTime::UNIX_EPOCH + Duration::from_secs(1000);\n        let creds_expire_in = Duration::from_secs(100);\n\n        let mut settings = SigningSettings::default();\n        settings.expires_in = Some(creds_expire_in - Duration::from_secs(10));\n\n        let identity = Credentials::new(\n            \"test-access-key\",\n            \"test-secret-key\",\n            Some(\"test-session-token\".into()),\n            Some(now + creds_expire_in),\n            \"test\",\n        )\n        .into();\n        let operation_config = SigV4OperationSigningConfig {\n            region_set: Some(\"test\".into()),\n            name: Some(SigningName::from_static(\"test\")),\n            signing_options: SigningOptions {\n                double_uri_encode: true,\n                content_sha256_header: true,\n                normalize_uri_path: true,\n                omit_session_token: true,\n                signature_type: HttpSignatureType::HttpRequestHeaders,\n                signing_optional: false,\n                expires_in: None,\n                payload_override: None,\n            },\n            ..Default::default()\n        };\n        SigV4aSigner::signing_params(settings, &identity, &operation_config, now).unwrap();\n        assert!(!logs_contain(EXPIRATION_WARNING));\n\n        let mut settings = SigningSettings::default();\n        settings.expires_in = Some(creds_expire_in + Duration::from_secs(10));\n\n        SigV4aSigner::signing_params(settings, &identity, &operation_config, now).unwrap();\n        assert!(logs_contain(EXPIRATION_WARNING));\n    }\n\n    #[test]\n    fn endpoint_config_overrides_region_and_service() {\n        let mut layer = Layer::new(\"test\");\n        layer.store_put(SigV4OperationSigningConfig {\n            region_set: Some(\"test\".into()),\n            name: Some(SigningName::from_static(\"override-this-service\")),\n            ..Default::default()\n        });\n        let config = Document::Object({\n            let mut out = HashMap::new();\n            out.insert(\"name\".to_owned(), \"sigv4a\".to_owned().into());\n            out.insert(\"signingName\".to_owned(), \"qldb-override\".to_owned().into());\n            out.insert(\n                \"signingRegionSet\".to_string(),\n                Document::Array(vec![\"us-east-override\".to_string().into()]),\n            );\n            out\n        });\n        let config = AuthSchemeEndpointConfig::from(Some(&config));\n\n        let cfg = ConfigBag::of_layers(vec![layer]);\n        let result = SigV4aSigner::extract_operation_config(config, &cfg).expect(\"success\");\n\n        assert_eq!(result.region_set, Some(\"us-east-override\".into()));\n        assert_eq!(result.name, Some(SigningName::from_static(\"qldb-override\")));\n        assert!(matches!(result, Cow::Owned(_)));\n    }\n\n    #[test]\n    fn endpoint_config_supports_fallback_when_region_or_service_are_unset() {\n        let mut layer = Layer::new(\"test\");\n        layer.store_put(SigV4OperationSigningConfig {\n            region_set: Some(\"us-east-1\".into()),\n            name: Some(SigningName::from_static(\"qldb\")),\n            ..Default::default()\n        });\n        let cfg = ConfigBag::of_layers(vec![layer]);\n        let config = AuthSchemeEndpointConfig::empty();\n\n        let result = SigV4aSigner::extract_operation_config(config, &cfg).expect(\"success\");\n\n        assert_eq!(result.region_set, Some(\"us-east-1\".into()));\n        assert_eq!(result.name, Some(SigningName::from_static(\"qldb\")));\n        assert!(matches!(result, Cow::Borrowed(_)));\n    }\n\n    #[test]\n    fn user_config_wins_over_endpoint_rules() {\n        let mut layer = Layer::new(\"test\");\n        layer.store_put(SigV4OperationSigningConfig::default());\n        layer.store_put(SigningRegionSet::from(\"*\"));\n        let config = Document::Object({\n            let mut out = HashMap::new();\n            out.insert(\"name\".to_owned(), \"sigv4a\".to_owned().into());\n            out.insert(\n                \"signingRegionSet\".to_string(),\n                Document::Array(vec![\"us-west-2\".to_string().into()]),\n            );\n            out\n        });\n        let config = AuthSchemeEndpointConfig::from(Some(&config));\n\n        let cfg = ConfigBag::of_layers(vec![layer]);\n        let result = SigV4aSigner::extract_operation_config(config, &cfg).expect(\"success\");\n\n        assert_eq!(result.region_set, Some(\"*\".into()));\n    }\n\n    #[test]\n    fn endpoint_rules_used_when_no_user_config() {\n        let mut layer = Layer::new(\"test\");\n        layer.store_put(SigV4OperationSigningConfig::default());\n        let config = Document::Object({\n            let mut out = HashMap::new();\n            out.insert(\"name\".to_owned(), \"sigv4a\".to_owned().into());\n            out.insert(\n                \"signingRegionSet\".to_string(),\n                Document::Array(vec![\"*\".to_string().into()]),\n            );\n            out\n        });\n        let config = AuthSchemeEndpointConfig::from(Some(&config));\n\n        let cfg = ConfigBag::of_layers(vec![layer]);\n        let result = SigV4aSigner::extract_operation_config(config, &cfg).expect(\"success\");\n\n        assert_eq!(result.region_set, Some(\"*\".into()));\n    }\n\n    #[test]\n    fn falls_back_to_client_region_when_nothing_configured() {\n        let mut layer = Layer::new(\"test\");\n        layer.store_put(SigV4OperationSigningConfig::default());\n        layer.store_put(Region::new(\"us-west-2\"));\n        let config = AuthSchemeEndpointConfig::empty();\n\n        let cfg = ConfigBag::of_layers(vec![layer]);\n        let result = SigV4aSigner::extract_operation_config(config, &cfg).expect(\"success\");\n\n        assert_eq!(result.region_set, Some(\"us-west-2\".into()));\n    }\n\n    #[test]\n    fn endpoint_rules_win_over_client_region_when_no_user_config() {\n        let mut layer = Layer::new(\"test\");\n        layer.store_put(SigV4OperationSigningConfig::default());\n        layer.store_put(Region::new(\"us-west-2\"));\n        let config = Document::Object({\n            let mut out = HashMap::new();\n            out.insert(\"name\".to_owned(), \"sigv4a\".to_owned().into());\n            out.insert(\n                \"signingRegionSet\".to_string(),\n                Document::Array(vec![\"*\".to_string().into()]),\n            );\n            out\n        });\n        let config = AuthSchemeEndpointConfig::from(Some(&config));\n\n        let cfg = ConfigBag::of_layers(vec![layer]);\n        let result = SigV4aSigner::extract_operation_config(config, &cfg).expect(\"success\");\n\n        assert_eq!(result.region_set, Some(\"*\".into()));\n    }\n\n    #[test]\n    fn user_config_wins_over_both_endpoint_and_region() {\n        let mut layer = Layer::new(\"test\");\n        layer.store_put(SigV4OperationSigningConfig::default());\n        layer.store_put(SigningRegionSet::from(\"eu-west-1\"));\n        layer.store_put(Region::new(\"us-west-2\"));\n        let config = Document::Object({\n            let mut out = HashMap::new();\n            out.insert(\"name\".to_owned(), \"sigv4a\".to_owned().into());\n            out.insert(\n                \"signingRegionSet\".to_string(),\n                Document::Array(vec![\"*\".to_string().into()]),\n            );\n            out\n        });\n        let config = AuthSchemeEndpointConfig::from(Some(&config));\n\n        let cfg = ConfigBag::of_layers(vec![layer]);\n        let result = SigV4aSigner::extract_operation_config(config, &cfg).expect(\"success\");\n\n        assert_eq!(result.region_set, Some(\"eu-west-1\".into()));\n    }\n\n    #[test]\n    fn region_set_is_none_when_nothing_is_configured() {\n        let mut layer = Layer::new(\"test\");\n        layer.store_put(SigV4OperationSigningConfig::default());\n        let config = AuthSchemeEndpointConfig::empty();\n\n        let cfg = ConfigBag::of_layers(vec![layer]);\n        let result = SigV4aSigner::extract_operation_config(config, &cfg).expect(\"success\");\n\n        assert_eq!(result.region_set, None);\n    }\n\n    #[test]\n    fn multi_region_endpoint_rules_preserved() {\n        let mut layer = Layer::new(\"test\");\n        layer.store_put(SigV4OperationSigningConfig::default());\n        let config = Document::Object({\n            let mut out = HashMap::new();\n            out.insert(\"name\".to_owned(), \"sigv4a\".to_owned().into());\n            out.insert(\n                \"signingRegionSet\".to_string(),\n                Document::Array(vec![\n                    \"us-east-1\".to_string().into(),\n                    \"eu-west-1\".to_string().into(),\n                ]),\n            );\n            out\n        });\n        let config = AuthSchemeEndpointConfig::from(Some(&config));\n\n        let cfg = ConfigBag::of_layers(vec![layer]);\n        let result = SigV4aSigner::extract_operation_config(config, &cfg).expect(\"success\");\n\n        assert_eq!(result.region_set, Some(\"us-east-1,eu-west-1\".into()));\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-runtime/src/auth.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_sigv4::http_request::{\n    PayloadChecksumKind, PercentEncodingMode, SessionTokenMode, SignableBody, SignatureLocation,\n    SigningInstructions, SigningSettings, UriPathNormalizationMode,\n};\nuse aws_smithy_runtime_api::box_error::BoxError;\nuse aws_smithy_runtime_api::client::auth::AuthSchemeEndpointConfig;\nuse aws_smithy_runtime_api::client::identity::Identity;\nuse aws_smithy_runtime_api::client::orchestrator::HttpRequest;\nuse aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugin;\nuse aws_smithy_types::config_bag::{ConfigBag, FrozenLayer, Layer, Storable, StoreReplace};\nuse aws_smithy_types::Document;\nuse aws_types::region::{Region, SigningRegion, SigningRegionSet};\nuse aws_types::SigningName;\nuse std::borrow::Cow;\nuse std::error::Error as StdError;\nuse std::fmt;\nuse std::time::Duration;\n\n/// Auth implementations for SigV4.\npub mod sigv4;\n\n#[cfg(feature = \"sigv4a\")]\n/// Auth implementations for SigV4a.\npub mod sigv4a;\n\n/// Type of SigV4 signature.\n#[derive(Debug, Eq, PartialEq, Clone, Copy)]\npub enum HttpSignatureType {\n    /// A signature for a full http request should be computed, with header updates applied to the signing result.\n    HttpRequestHeaders,\n\n    /// A signature for a full http request should be computed, with query param updates applied to the signing result.\n    ///\n    /// This is typically used for presigned URLs.\n    HttpRequestQueryParams,\n}\n\n/// Signing options for SigV4.\n#[derive(Clone, Debug, Eq, PartialEq)]\n#[non_exhaustive]\npub struct SigningOptions {\n    /// Apply URI encoding twice.\n    pub double_uri_encode: bool,\n    /// Apply a SHA-256 payload checksum.\n    pub content_sha256_header: bool,\n    /// Normalize the URI path before signing.\n    pub normalize_uri_path: bool,\n    /// Omit the session token from the signature.\n    pub omit_session_token: bool,\n    /// Optional override for the payload to be used in signing.\n    pub payload_override: Option<SignableBody<'static>>,\n    /// Signature type.\n    pub signature_type: HttpSignatureType,\n    /// Whether or not the signature is optional.\n    pub signing_optional: bool,\n    /// Optional expiration (for presigning)\n    pub expires_in: Option<Duration>,\n}\n\nimpl Default for SigningOptions {\n    fn default() -> Self {\n        Self {\n            double_uri_encode: true,\n            content_sha256_header: false,\n            normalize_uri_path: true,\n            omit_session_token: false,\n            payload_override: None,\n            signature_type: HttpSignatureType::HttpRequestHeaders,\n            signing_optional: false,\n            expires_in: None,\n        }\n    }\n}\n\npub(crate) type SessionTokenNameOverrideFn = Box<\n    dyn Fn(&SigningSettings, &ConfigBag) -> Result<Option<&'static str>, BoxError>\n        + Send\n        + Sync\n        + 'static,\n>;\n\n/// Custom config that provides the alternative session token name for [`SigningSettings`]\npub struct SigV4SessionTokenNameOverride {\n    name_override: SessionTokenNameOverrideFn,\n}\n\nimpl SigV4SessionTokenNameOverride {\n    /// Creates a new `SigV4SessionTokenNameOverride`\n    pub fn new<F>(name_override: F) -> Self\n    where\n        F: Fn(&SigningSettings, &ConfigBag) -> Result<Option<&'static str>, BoxError>\n            + Send\n            + Sync\n            + 'static,\n    {\n        Self {\n            name_override: Box::new(name_override),\n        }\n    }\n\n    /// Provides a session token name override\n    pub fn name_override(\n        &self,\n        settings: &SigningSettings,\n        config_bag: &ConfigBag,\n    ) -> Result<Option<&'static str>, BoxError> {\n        (self.name_override)(settings, config_bag)\n    }\n}\n\nimpl fmt::Debug for SigV4SessionTokenNameOverride {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        f.debug_struct(\"SessionTokenNameOverride\").finish()\n    }\n}\n\nimpl Storable for SigV4SessionTokenNameOverride {\n    type Storer = StoreReplace<Self>;\n}\n\n/// SigV4 signing configuration for an operation\n///\n/// Although these fields MAY be customized on a per request basis, they are generally static\n/// for a given operation\n#[derive(Clone, Debug, Default, PartialEq, Eq)]\npub struct SigV4OperationSigningConfig {\n    /// AWS region to sign for.\n    ///\n    /// For an up-to-date list of AWS regions, see <https://docs.aws.amazon.com/general/latest/gr/rande.html>\n    pub region: Option<SigningRegion>,\n    /// AWS region set to sign for.\n    ///\n    /// A comma-separated list of AWS regions. Examples include typical AWS regions as well as 'wildcard' regions\n    pub region_set: Option<SigningRegionSet>,\n    /// AWS service to sign for.\n    pub name: Option<SigningName>,\n    /// Signing options.\n    pub signing_options: SigningOptions,\n}\n\n// TODO(AuthRefactoring): Consider implementing a dedicated struct, similar to `MergeTimeoutConfig`, that allows\n// us to implement a custom merge logic for `impl Store`, enabling fold-style merging of `SigV4OperationSigningConfig`.\nimpl Storable for SigV4OperationSigningConfig {\n    type Storer = StoreReplace<Self>;\n}\n\nfn settings(operation_config: &SigV4OperationSigningConfig) -> SigningSettings {\n    let mut settings = SigningSettings::default();\n    settings.percent_encoding_mode = if operation_config.signing_options.double_uri_encode {\n        PercentEncodingMode::Double\n    } else {\n        PercentEncodingMode::Single\n    };\n    settings.payload_checksum_kind = if operation_config.signing_options.content_sha256_header {\n        PayloadChecksumKind::XAmzSha256\n    } else {\n        PayloadChecksumKind::NoHeader\n    };\n    settings.uri_path_normalization_mode = if operation_config.signing_options.normalize_uri_path {\n        UriPathNormalizationMode::Enabled\n    } else {\n        UriPathNormalizationMode::Disabled\n    };\n    settings.session_token_mode = if operation_config.signing_options.omit_session_token {\n        SessionTokenMode::Exclude\n    } else {\n        SessionTokenMode::Include\n    };\n    settings.signature_location = match operation_config.signing_options.signature_type {\n        HttpSignatureType::HttpRequestHeaders => SignatureLocation::Headers,\n        HttpSignatureType::HttpRequestQueryParams => SignatureLocation::QueryParams,\n    };\n    settings.expires_in = operation_config.signing_options.expires_in;\n    settings\n}\n\n#[derive(Debug)]\nenum SigV4SigningError {\n    MissingOperationSigningConfig,\n    MissingSigningRegion,\n    #[cfg(feature = \"sigv4a\")]\n    MissingSigningRegionSet,\n    MissingSigningName,\n    WrongIdentityType(Identity),\n    BadTypeInEndpointAuthSchemeConfig(&'static str),\n}\n\nimpl fmt::Display for SigV4SigningError {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        use SigV4SigningError::*;\n        let mut w = |s| f.write_str(s);\n        match self {\n            MissingOperationSigningConfig => w(\"missing operation signing config\"),\n            MissingSigningRegion => w(\"missing signing region\"),\n            #[cfg(feature = \"sigv4a\")]\n            MissingSigningRegionSet => w(\"missing signing region set\"),\n            MissingSigningName => w(\"missing signing name\"),\n            WrongIdentityType(identity) => {\n                write!(f, \"wrong identity type for SigV4/sigV4a. Expected AWS credentials but got `{identity:?}`\")\n            }\n            BadTypeInEndpointAuthSchemeConfig(field_name) => {\n                write!(\n                    f,\n                    \"unexpected type for `{field_name}` in endpoint auth scheme config\",\n                )\n            }\n        }\n    }\n}\n\nimpl StdError for SigV4SigningError {}\n\nfn extract_endpoint_auth_scheme_signing_name(\n    endpoint_config: &AuthSchemeEndpointConfig<'_>,\n) -> Result<Option<SigningName>, SigV4SigningError> {\n    match extract_field_from_endpoint_config(\"signingName\", endpoint_config) {\n        Some(Document::String(s)) => Ok(Some(SigningName::from(s.to_string()))),\n        None => Ok(None),\n        _ => Err(SigV4SigningError::BadTypeInEndpointAuthSchemeConfig(\n            \"signingName\",\n        )),\n    }\n}\n\nfn extract_endpoint_auth_scheme_signing_region(\n    endpoint_config: &AuthSchemeEndpointConfig<'_>,\n) -> Result<Option<SigningRegion>, SigV4SigningError> {\n    match extract_field_from_endpoint_config(\"signingRegion\", endpoint_config) {\n        Some(Document::String(s)) => Ok(Some(SigningRegion::from(Region::new(s.clone())))),\n        None => Ok(None),\n        _ => Err(SigV4SigningError::BadTypeInEndpointAuthSchemeConfig(\n            \"signingRegion\",\n        )),\n    }\n}\n\n// Extract `SigningOptions` from the given `AuthSchemeEndpointConfig`\n//\n// The implementation may need to be extended in the future to support additional fields\n// of the `authSchemes` endpoint list property.\nfn extract_endpoint_auth_scheme_signing_options<'a>(\n    endpoint_config: &AuthSchemeEndpointConfig<'_>,\n    signing_options: &'a SigningOptions,\n) -> Result<Cow<'a, SigningOptions>, SigV4SigningError> {\n    let double_uri_encode =\n        match extract_field_from_endpoint_config(\"disableDoubleEncoding\", endpoint_config) {\n            Some(Document::Bool(b)) => Some(!b),\n            None => None,\n            _ => {\n                return Err(SigV4SigningError::BadTypeInEndpointAuthSchemeConfig(\n                    \"disableDoubleEncoding\",\n                ))\n            }\n        };\n    let normalize_uri_path =\n        match extract_field_from_endpoint_config(\"disableNormalizePath\", endpoint_config) {\n            Some(Document::Bool(b)) => Some(!b),\n            None => None,\n            _ => {\n                return Err(SigV4SigningError::BadTypeInEndpointAuthSchemeConfig(\n                    \"disableNormalizePath\",\n                ))\n            }\n        };\n    match (double_uri_encode, normalize_uri_path) {\n        (None, None) => Ok(Cow::Borrowed(signing_options)),\n        (double_uri_encode, normalize_uri_path) => {\n            let mut signing_options = signing_options.clone();\n            signing_options.double_uri_encode =\n                double_uri_encode.unwrap_or(signing_options.double_uri_encode);\n            signing_options.normalize_uri_path =\n                normalize_uri_path.unwrap_or(signing_options.normalize_uri_path);\n            Ok(Cow::Owned(signing_options))\n        }\n    }\n}\n\nfn extract_field_from_endpoint_config<'a>(\n    field_name: &'static str,\n    endpoint_config: &'a AuthSchemeEndpointConfig<'_>,\n) -> Option<&'a Document> {\n    endpoint_config\n        .as_document()\n        .and_then(Document::as_object)\n        .and_then(|config| config.get(field_name))\n}\n\nfn apply_signing_instructions(\n    instructions: SigningInstructions,\n    request: &mut HttpRequest,\n) -> Result<(), BoxError> {\n    let (new_headers, new_query) = instructions.into_parts();\n    for header in new_headers.into_iter() {\n        let mut value = http_1x::HeaderValue::from_str(header.value()).unwrap();\n        value.set_sensitive(header.sensitive());\n        request.headers_mut().insert(header.name(), value);\n    }\n\n    if !new_query.is_empty() {\n        let mut query = aws_smithy_http::query_writer::QueryWriter::new_from_string(request.uri())?;\n        for (name, value) in new_query {\n            query.insert(name, &value);\n        }\n        request.set_uri(query.build_uri())?;\n    }\n    Ok(())\n}\n\n/// When present in the config bag, this type will signal that the default\n/// payload signing should be overridden.\n#[non_exhaustive]\n#[derive(Clone, Debug)]\npub enum PayloadSigningOverride {\n    /// An unsigned payload\n    ///\n    /// UnsignedPayload is used for streaming requests where the contents of the body cannot be\n    /// known prior to signing\n    UnsignedPayload,\n\n    /// A precomputed body checksum. The checksum should be a SHA256 checksum of the body,\n    /// lowercase hex encoded. Eg:\n    /// `e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855`\n    Precomputed(String),\n\n    /// Set when a streaming body has checksum trailers.\n    StreamingUnsignedPayloadTrailer,\n\n    /// Set when a signed streaming body has checksum trailers\n    StreamingSignedPayloadTrailer,\n}\n\nimpl PayloadSigningOverride {\n    /// Create a payload signing override that will prevent the payload from\n    /// being signed.\n    pub fn unsigned_payload() -> Self {\n        Self::UnsignedPayload\n    }\n\n    /// Convert this type into the type used by the signer to determine how a\n    /// request body should be signed.\n    pub fn to_signable_body(self) -> SignableBody<'static> {\n        match self {\n            Self::UnsignedPayload => SignableBody::UnsignedPayload,\n            Self::Precomputed(checksum) => SignableBody::Precomputed(checksum),\n            Self::StreamingUnsignedPayloadTrailer => SignableBody::StreamingUnsignedPayloadTrailer,\n            Self::StreamingSignedPayloadTrailer => SignableBody::StreamingSignedPayloadTrailer,\n        }\n    }\n}\n\nimpl Storable for PayloadSigningOverride {\n    type Storer = StoreReplace<Self>;\n}\n\n/// A runtime plugin that, when set, will override how the signer signs request payloads.\n#[derive(Debug)]\npub struct PayloadSigningOverrideRuntimePlugin {\n    inner: FrozenLayer,\n}\n\nimpl PayloadSigningOverrideRuntimePlugin {\n    /// Create a new runtime plugin that will force the signer to skip signing\n    /// the request payload when signing an HTTP request.\n    pub fn unsigned() -> Self {\n        let mut layer = Layer::new(\"PayloadSigningOverrideRuntimePlugin\");\n        layer.store_put(PayloadSigningOverride::UnsignedPayload);\n\n        Self {\n            inner: layer.freeze(),\n        }\n    }\n}\n\nimpl RuntimePlugin for PayloadSigningOverrideRuntimePlugin {\n    fn config(&self) -> Option<FrozenLayer> {\n        Some(self.inner.clone())\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-runtime/src/content_encoding/body/http_body_0_x.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse bytes::Bytes;\nuse std::pin::Pin;\nuse std::task::{Context, Poll};\n\nuse crate::content_encoding::body::{AwsChunkedBody, AwsChunkedBodyError, AwsChunkedBodyState};\nuse crate::content_encoding::{CHUNK_TERMINATOR, CRLF, TRAILER_SEPARATOR};\n\nimpl<Inner> http_body_04x::Body for AwsChunkedBody<Inner>\nwhere\n    Inner: http_body_04x::Body<Data = Bytes, Error = aws_smithy_types::body::Error>,\n{\n    type Data = Bytes;\n    type Error = aws_smithy_types::body::Error;\n\n    fn poll_data(\n        self: Pin<&mut Self>,\n        cx: &mut Context<'_>,\n    ) -> Poll<Option<Result<Self::Data, Self::Error>>> {\n        tracing::trace!(state = ?self.state, \"polling AwsChunkedBody\");\n        let mut this = self.project();\n\n        use AwsChunkedBodyState::*;\n        match *this.state {\n            WritingChunk => {\n                if this.options.stream_length == 0 {\n                    // If the stream is empty, we skip to writing trailers after writing the CHUNK_TERMINATOR.\n                    *this.state = WritingTrailers;\n                    tracing::trace!(\"stream is empty, writing chunk terminator\");\n                    Poll::Ready(Some(Ok(Bytes::from([CHUNK_TERMINATOR].concat()))))\n                } else {\n                    *this.state = WritingChunkData;\n                    // A chunk must be prefixed by chunk size in hexadecimal\n                    let chunk_size = format!(\"{:X?}{CRLF}\", this.options.stream_length);\n                    tracing::trace!(%chunk_size, \"writing chunk size\");\n                    let chunk_size = Bytes::from(chunk_size);\n                    Poll::Ready(Some(Ok(chunk_size)))\n                }\n            }\n            WritingChunkData => match this.inner.poll_data(cx) {\n                Poll::Ready(Some(Ok(data))) => {\n                    tracing::trace!(len = data.len(), \"writing chunk data\");\n                    *this.inner_body_bytes_read_so_far += data.len();\n                    Poll::Ready(Some(Ok(data)))\n                }\n                Poll::Ready(None) => {\n                    let actual_stream_length = *this.inner_body_bytes_read_so_far as u64;\n                    let expected_stream_length = this.options.stream_length;\n                    if actual_stream_length != expected_stream_length {\n                        let err = Box::new(AwsChunkedBodyError::StreamLengthMismatch {\n                            actual: actual_stream_length,\n                            expected: expected_stream_length,\n                        });\n                        return Poll::Ready(Some(Err(err)));\n                    };\n\n                    tracing::trace!(\"no more chunk data, writing CRLF and chunk terminator\");\n                    *this.state = WritingTrailers;\n                    // Since we wrote chunk data, we end it with a CRLF and since we only write\n                    // a single chunk, we write the CHUNK_TERMINATOR immediately after\n                    Poll::Ready(Some(Ok(Bytes::from([CRLF, CHUNK_TERMINATOR].concat()))))\n                }\n                Poll::Ready(Some(Err(e))) => Poll::Ready(Some(Err(e))),\n                Poll::Pending => Poll::Pending,\n            },\n            WritingTrailers => {\n                return match this.inner.poll_trailers(cx) {\n                    Poll::Ready(Ok(trailers)) => {\n                        *this.state = Closed;\n                        let expected_length = total_rendered_length_of_trailers(trailers.as_ref());\n                        let actual_length = this.options.total_trailer_length();\n\n                        if expected_length != actual_length {\n                            let err = AwsChunkedBodyError::ReportedTrailerLengthMismatch {\n                                actual: actual_length,\n                                expected: expected_length,\n                            };\n                            return Poll::Ready(Some(Err(err.into())));\n                        }\n\n                        let mut trailers =\n                            trailers_as_aws_chunked_bytes(trailers, actual_length + 1);\n                        // Insert the final CRLF to close the body\n                        trailers.extend_from_slice(CRLF.as_bytes());\n\n                        Poll::Ready(Some(Ok(trailers.into())))\n                    }\n                    Poll::Pending => Poll::Pending,\n                    Poll::Ready(Err(e)) => Poll::Ready(Some(Err(e))),\n                };\n            }\n            Closed => Poll::Ready(None),\n            ref otherwise => {\n                unreachable!(\n                    \"invalid state {otherwise:?} for `poll_data` in http-02x; this is a bug\"\n                )\n            }\n        }\n    }\n\n    fn poll_trailers(\n        self: Pin<&mut Self>,\n        _cx: &mut Context<'_>,\n    ) -> Poll<Result<Option<http_02x::HeaderMap<http_02x::HeaderValue>>, Self::Error>> {\n        // Trailers were already appended to the body because of the content encoding scheme\n        Poll::Ready(Ok(None))\n    }\n\n    fn is_end_stream(&self) -> bool {\n        self.state == AwsChunkedBodyState::Closed\n    }\n\n    fn size_hint(&self) -> http_body_04x::SizeHint {\n        http_body_04x::SizeHint::with_exact(self.options.encoded_length())\n    }\n}\n\n/// Writes trailers out into a `string` and then converts that `String` to a `Bytes` before\n/// returning.\n///\n/// - Trailer names are separated by a single colon only, no space.\n/// - Trailer names with multiple values will be written out one line per value, with the name\n///   appearing on each line.\nfn trailers_as_aws_chunked_bytes(\n    trailer_map: Option<http_02x::HeaderMap>,\n    estimated_length: u64,\n) -> bytes::BytesMut {\n    if let Some(trailer_map) = trailer_map {\n        let mut current_header_name = None;\n        let mut trailers =\n            bytes::BytesMut::with_capacity(estimated_length.try_into().unwrap_or_default());\n\n        for (header_name, header_value) in trailer_map.into_iter() {\n            // When a header has multiple values, the name only comes up in iteration the first time\n            // we see it. Therefore, we need to keep track of the last name we saw and fall back to\n            // it when `header_name == None`.\n            current_header_name = header_name.or(current_header_name);\n\n            // In practice, this will always exist, but `if let` is nicer than unwrap\n            if let Some(header_name) = current_header_name.as_ref() {\n                trailers.extend_from_slice(header_name.as_ref());\n                trailers.extend_from_slice(TRAILER_SEPARATOR);\n                trailers.extend_from_slice(header_value.as_bytes());\n                trailers.extend_from_slice(CRLF.as_bytes());\n            }\n        }\n\n        trailers\n    } else {\n        bytes::BytesMut::new()\n    }\n}\n\n/// Given an optional `HeaderMap`, calculate the total number of bytes required to represent the\n/// `HeaderMap`. If no `HeaderMap` is given as input, return 0.\n///\n/// - Trailer names are separated by a single colon only, no space.\n/// - Trailer names with multiple values will be written out one line per value, with the name\n///   appearing on each line.\nfn total_rendered_length_of_trailers(trailer_map: Option<&http_02x::HeaderMap>) -> u64 {\n    match trailer_map {\n        Some(trailer_map) => trailer_map\n            .iter()\n            .map(|(trailer_name, trailer_value)| {\n                trailer_name.as_str().len()\n                    + TRAILER_SEPARATOR.len()\n                    + trailer_value.len()\n                    + CRLF.len()\n            })\n            .sum::<usize>() as u64,\n        None => 0,\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::{total_rendered_length_of_trailers, trailers_as_aws_chunked_bytes};\n    use crate::content_encoding::{AwsChunkedBody, AwsChunkedBodyOptions, CHUNK_TERMINATOR, CRLF};\n\n    use aws_smithy_types::body::SdkBody;\n    use bytes::{Buf, Bytes};\n    use bytes_utils::SegmentedBuf;\n    use http_02x::{HeaderMap, HeaderValue};\n    use http_body_04x::{Body, SizeHint};\n    use pin_project_lite::pin_project;\n\n    use std::io::Read;\n    use std::pin::Pin;\n    use std::task::{Context, Poll};\n    use std::time::Duration;\n\n    pin_project! {\n        struct SputteringBody {\n            parts: Vec<Option<Bytes>>,\n            cursor: usize,\n            delay_in_millis: u64,\n        }\n    }\n\n    impl SputteringBody {\n        fn len(&self) -> usize {\n            self.parts.iter().flatten().map(|b| b.len()).sum()\n        }\n    }\n\n    impl Body for SputteringBody {\n        type Data = Bytes;\n        type Error = aws_smithy_types::body::Error;\n\n        fn poll_data(\n            self: Pin<&mut Self>,\n            cx: &mut Context<'_>,\n        ) -> Poll<Option<Result<Self::Data, Self::Error>>> {\n            if self.cursor == self.parts.len() {\n                return Poll::Ready(None);\n            }\n\n            let this = self.project();\n            let delay_in_millis = *this.delay_in_millis;\n            let next_part = this.parts.get_mut(*this.cursor).unwrap().take();\n\n            match next_part {\n                None => {\n                    *this.cursor += 1;\n                    let waker = cx.waker().clone();\n                    tokio::spawn(async move {\n                        tokio::time::sleep(Duration::from_millis(delay_in_millis)).await;\n                        waker.wake();\n                    });\n                    Poll::Pending\n                }\n                Some(data) => {\n                    *this.cursor += 1;\n                    Poll::Ready(Some(Ok(data)))\n                }\n            }\n        }\n\n        fn poll_trailers(\n            self: Pin<&mut Self>,\n            _cx: &mut Context<'_>,\n        ) -> Poll<Result<Option<HeaderMap<HeaderValue>>, Self::Error>> {\n            Poll::Ready(Ok(None))\n        }\n\n        fn is_end_stream(&self) -> bool {\n            false\n        }\n\n        fn size_hint(&self) -> SizeHint {\n            SizeHint::new()\n        }\n    }\n\n    #[tokio::test]\n    async fn test_aws_chunked_encoding() {\n        let test_fut = async {\n            let input_str = \"Hello world\";\n            let opts = AwsChunkedBodyOptions::new(input_str.len() as u64, Vec::new());\n            let mut body = AwsChunkedBody::new(SdkBody::from(input_str), opts);\n\n            let mut output = SegmentedBuf::new();\n            while let Some(buf) = body.data().await {\n                output.push(buf.unwrap());\n            }\n\n            let mut actual_output = String::new();\n            output\n                .reader()\n                .read_to_string(&mut actual_output)\n                .expect(\"Doesn't cause IO errors\");\n\n            let expected_output = \"B\\r\\nHello world\\r\\n0\\r\\n\\r\\n\";\n\n            assert_eq!(expected_output, actual_output);\n            assert!(\n                body.trailers()\n                    .await\n                    .expect(\"no errors occurred during trailer polling\")\n                    .is_none(),\n                \"aws-chunked encoded bodies don't have normal HTTP trailers\"\n            );\n\n            // You can insert a `tokio::time::sleep` here to verify the timeout works as intended\n        };\n\n        let timeout_duration = Duration::from_secs(3);\n        if tokio::time::timeout(timeout_duration, test_fut)\n            .await\n            .is_err()\n        {\n            panic!(\"test_aws_chunked_encoding timed out after {timeout_duration:?}\");\n        }\n    }\n\n    #[tokio::test]\n    async fn test_aws_chunked_encoding_sputtering_body() {\n        let test_fut = async {\n            let input = SputteringBody {\n                parts: vec![\n                    Some(Bytes::from_static(b\"chunk 1, \")),\n                    None,\n                    Some(Bytes::from_static(b\"chunk 2, \")),\n                    Some(Bytes::from_static(b\"chunk 3, \")),\n                    None,\n                    None,\n                    Some(Bytes::from_static(b\"chunk 4, \")),\n                    Some(Bytes::from_static(b\"chunk 5, \")),\n                    Some(Bytes::from_static(b\"chunk 6\")),\n                ],\n                cursor: 0,\n                delay_in_millis: 500,\n            };\n            let opts = AwsChunkedBodyOptions::new(input.len() as u64, Vec::new());\n            let mut body = AwsChunkedBody::new(input, opts);\n\n            let mut output = SegmentedBuf::new();\n            while let Some(buf) = body.data().await {\n                output.push(buf.unwrap());\n            }\n\n            let mut actual_output = String::new();\n            output\n                .reader()\n                .read_to_string(&mut actual_output)\n                .expect(\"Doesn't cause IO errors\");\n\n            let expected_output =\n                \"34\\r\\nchunk 1, chunk 2, chunk 3, chunk 4, chunk 5, chunk 6\\r\\n0\\r\\n\\r\\n\";\n\n            assert_eq!(expected_output, actual_output);\n            assert!(\n                body.trailers()\n                    .await\n                    .expect(\"no errors occurred during trailer polling\")\n                    .is_none(),\n                \"aws-chunked encoded bodies don't have normal HTTP trailers\"\n            );\n        };\n\n        let timeout_duration = Duration::from_secs(3);\n        if tokio::time::timeout(timeout_duration, test_fut)\n            .await\n            .is_err()\n        {\n            panic!(\n                \"test_aws_chunked_encoding_sputtering_body timed out after {timeout_duration:?}\"\n            );\n        }\n    }\n\n    #[tokio::test]\n    #[should_panic = \"called `Result::unwrap()` on an `Err` value: ReportedTrailerLengthMismatch { actual: 44, expected: 0 }\"]\n    async fn test_aws_chunked_encoding_incorrect_trailer_length_panic() {\n        let input_str = \"Hello world\";\n        // Test body has no trailers, so this length is incorrect and will trigger an assert panic\n        // When the panic occurs, it will actually expect a length of 44. This is because, when using\n        // aws-chunked encoding, each trailer will end with a CRLF which is 2 bytes long.\n        let wrong_trailer_len = 42;\n        let opts = AwsChunkedBodyOptions::new(input_str.len() as u64, vec![wrong_trailer_len]);\n        let mut body = AwsChunkedBody::new(SdkBody::from(input_str), opts);\n\n        // We don't care about the body contents but we have to read it all before checking for trailers\n        while let Some(buf) = body.data().await {\n            drop(buf.unwrap());\n        }\n\n        assert!(\n            body.trailers()\n                .await\n                .expect(\"no errors occurred during trailer polling\")\n                .is_none(),\n            \"aws-chunked encoded bodies don't have normal HTTP trailers\"\n        );\n    }\n\n    #[tokio::test]\n    async fn test_aws_chunked_encoding_empty_body() {\n        let input_str = \"\";\n        let opts = AwsChunkedBodyOptions::new(input_str.len() as u64, Vec::new());\n        let mut body = AwsChunkedBody::new(SdkBody::from(input_str), opts);\n\n        let mut output = SegmentedBuf::new();\n        while let Some(buf) = body.data().await {\n            output.push(buf.unwrap());\n        }\n\n        let mut actual_output = String::new();\n        output\n            .reader()\n            .read_to_string(&mut actual_output)\n            .expect(\"Doesn't cause IO errors\");\n\n        let expected_output = [CHUNK_TERMINATOR, CRLF].concat();\n\n        assert_eq!(expected_output, actual_output);\n        assert!(\n            body.trailers()\n                .await\n                .expect(\"no errors occurred during trailer polling\")\n                .is_none(),\n            \"aws-chunked encoded bodies don't have normal HTTP trailers\"\n        );\n    }\n\n    #[tokio::test]\n    async fn test_total_rendered_length_of_trailers() {\n        let mut trailers = HeaderMap::new();\n\n        trailers.insert(\"empty_value\", HeaderValue::from_static(\"\"));\n\n        trailers.insert(\"single_value\", HeaderValue::from_static(\"value 1\"));\n\n        trailers.insert(\"two_values\", HeaderValue::from_static(\"value 1\"));\n        trailers.append(\"two_values\", HeaderValue::from_static(\"value 2\"));\n\n        trailers.insert(\"three_values\", HeaderValue::from_static(\"value 1\"));\n        trailers.append(\"three_values\", HeaderValue::from_static(\"value 2\"));\n        trailers.append(\"three_values\", HeaderValue::from_static(\"value 3\"));\n\n        let trailers = Some(trailers);\n        let actual_length = total_rendered_length_of_trailers(trailers.as_ref());\n        let expected_length = (trailers_as_aws_chunked_bytes(trailers, actual_length).len()) as u64;\n\n        assert_eq!(expected_length, actual_length);\n    }\n\n    #[tokio::test]\n    async fn test_total_rendered_length_of_empty_trailers() {\n        let trailers = Some(HeaderMap::new());\n        let actual_length = total_rendered_length_of_trailers(trailers.as_ref());\n        let expected_length = (trailers_as_aws_chunked_bytes(trailers, actual_length).len()) as u64;\n\n        assert_eq!(expected_length, actual_length);\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-runtime/src/content_encoding/body/http_body_1_x.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse bytes::{Buf, Bytes, BytesMut};\nuse std::pin::Pin;\nuse std::task::{Context, Poll};\n\nuse crate::content_encoding::body::{AwsChunkedBody, AwsChunkedBodyError, AwsChunkedBodyState};\nuse crate::content_encoding::{\n    header, SignChunk, CHUNK_SIGNATURE_BEGIN_RAW, CHUNK_TERMINATOR_RAW, CRLF_RAW, TRAILER_SEPARATOR,\n};\nuse aws_sigv4::http_request::SigningError;\nuse aws_smithy_runtime_api::http::Headers;\n\nmacro_rules! signer_mut {\n    ($this:expr) => {\n        $this\n            .signer\n            .as_mut()\n            .get_mut()\n            .as_mut()\n            .expect(\"signer must be set\")\n            .0\n            .as_mut()\n    };\n}\n\nimpl<Inner> http_body_1x::Body for AwsChunkedBody<Inner>\nwhere\n    Inner: http_body_1x::Body<Data = Bytes, Error = aws_smithy_types::body::Error>,\n{\n    type Data = Bytes;\n    type Error = aws_smithy_types::body::Error;\n\n    fn is_end_stream(&self) -> bool {\n        self.state == AwsChunkedBodyState::Closed\n    }\n\n    fn size_hint(&self) -> http_body_1x::SizeHint {\n        http_body_1x::SizeHint::with_exact(self.options.encoded_length())\n    }\n\n    fn poll_frame(\n        self: Pin<&mut Self>,\n        cx: &mut Context<'_>,\n    ) -> Poll<Option<Result<http_body_1x::Frame<Self::Data>, Self::Error>>> {\n        tracing::trace!(state = ?self.state, \"polling AwsChunkedBody\");\n        let mut this = self.project();\n        let chunk_size = this.options.chunk_size();\n\n        use AwsChunkedBodyState::*;\n        match *this.state {\n            WritingChunk => {\n                while !this.chunk_buffer.is_eos() {\n                    if this.chunk_buffer.remaining() >= chunk_size {\n                        let buf = this.chunk_buffer.buffered();\n                        let chunk_bytes = buf.copy_to_bytes(chunk_size);\n                        let chunk = if this.options.is_signed {\n                            let signer = signer_mut!(this);\n                            signed_encoded_chunk(signer, chunk_bytes).map_err(|e| {\n                                Box::new(AwsChunkedBodyError::FailedToSign { source: e })\n                            })?\n                        } else {\n                            unsigned_encoded_chunk(chunk_bytes)\n                        };\n                        *this.inner_body_bytes_read_so_far += chunk_size;\n                        tracing::trace!(\"writing chunk data: {:#?}\", chunk);\n                        return Poll::Ready(Some(Ok(http_body_1x::Frame::data(chunk))));\n                    }\n\n                    match Self::buffer_next_chunk(\n                        this.inner.as_mut(),\n                        this.chunk_buffer.as_mut(),\n                        this.buffered_trailing_headers.as_mut(),\n                        cx,\n                    ) {\n                        Poll::Ready(Ok(true)) => continue,\n                        Poll::Ready(Ok(false)) => break,\n                        Poll::Ready(Err(e)) => return Poll::Ready(Some(Err(e))),\n                        Poll::Pending => return Poll::Pending,\n                    }\n                }\n\n                if this.chunk_buffer.remaining() > 0 {\n                    let bytes_len_to_read =\n                        std::cmp::min(this.chunk_buffer.remaining(), chunk_size);\n                    let buf = this.chunk_buffer.buffered();\n                    let chunk_bytes = buf.copy_to_bytes(bytes_len_to_read);\n                    let chunk = if this.options.is_signed {\n                        let signer = signer_mut!(this);\n                        signed_encoded_chunk(signer, chunk_bytes).map_err(|e| {\n                            Box::new(AwsChunkedBodyError::FailedToSign { source: e })\n                        })?\n                    } else {\n                        unsigned_encoded_chunk(chunk_bytes)\n                    };\n                    *this.inner_body_bytes_read_so_far += bytes_len_to_read;\n                    tracing::trace!(\"remaining chunk data: {:#?}\", chunk);\n                    return Poll::Ready(Some(Ok(http_body_1x::Frame::data(chunk))));\n                }\n\n                debug_assert!(this.chunk_buffer.remaining() == 0);\n\n                // We exhausted the body data, now check if the length is correct\n                if let Err(poll_stream_len_err) = check_for_stream_length_mismatch(\n                    *this.inner_body_bytes_read_so_far as u64,\n                    this.options.stream_length,\n                ) {\n                    return poll_stream_len_err;\n                }\n\n                if this.options.is_signed {\n                    *this.state = WritingZeroSizedSignedChunk;\n                } else {\n                    *this.state = PollingTrailers;\n                }\n                // Inner future has already returned `Ready` - no active waker.\n                // Wake explicitly to ensure the task gets polled again.\n                cx.waker().wake_by_ref();\n                Poll::Pending\n            }\n            WritingZeroSizedSignedChunk => {\n                let signer = signer_mut!(this);\n                let zero_sized_chunk = signed_encoded_chunk(signer, Bytes::new())\n                    .map_err(|e| Box::new(AwsChunkedBodyError::FailedToSign { source: e }))?;\n                if this.buffered_trailing_headers.is_some() {\n                    *this.state = PollingTrailers;\n                    let mut zero_sized_chunk = BytesMut::from(&zero_sized_chunk[..]);\n                    debug_assert!(zero_sized_chunk.ends_with(b\"\\r\\n\\r\\n\"));\n                    // For trailing checksum, we do not want the second CRLF as the checksum is appended in-between two CRLFs\n                    zero_sized_chunk.truncate(zero_sized_chunk.len() - 2);\n                    let zero_sized_chunk = zero_sized_chunk.freeze();\n                    tracing::trace!(\"writing zero sized signed chunk: {:#?}\", zero_sized_chunk);\n                    Poll::Ready(Some(Ok(http_body_1x::Frame::data(zero_sized_chunk))))\n                } else {\n                    *this.state = Closed;\n                    tracing::trace!(\n                        \"writing zero sized signed chunk without trailer: {:#?}\",\n                        zero_sized_chunk\n                    );\n                    Poll::Ready(Some(Ok(http_body_1x::Frame::data(zero_sized_chunk))))\n                }\n            }\n            PollingTrailers => match this.inner.as_mut().poll_frame(cx) {\n                Poll::Ready(Some(Ok(frame))) => {\n                    let trailers = frame.into_trailers().ok();\n                    if let Some(trailers) = trailers {\n                        match this.buffered_trailing_headers.as_mut().get_mut() {\n                            Some(existing) => existing.extend(trailers),\n                            None => {\n                                *this.buffered_trailing_headers.as_mut().get_mut() = Some(trailers)\n                            }\n                        }\n                    }\n                    // Inner future has already returned `Ready` - no active waker.\n                    // Wake explicitly to ensure the task gets polled again.\n                    cx.waker().wake_by_ref();\n                    Poll::Pending\n                }\n                Poll::Ready(Some(Err(err))) => {\n                    tracing::error!(error = ?err, \"error polling inner\");\n                    Poll::Ready(Some(Err(err)))\n                }\n                Poll::Ready(None) => {\n                    *this.state = WritingTrailers;\n                    // Inner future has already returned `Ready` - no active waker.\n                    // Wake explicitly to ensure the task gets polled again.\n                    cx.waker().wake_by_ref();\n                    Poll::Pending\n                }\n                Poll::Pending => Poll::Pending,\n            },\n            WritingTrailers => {\n                let mut final_chunk = if this.options.is_signed {\n                    BytesMut::new()\n                } else {\n                    BytesMut::from(CHUNK_TERMINATOR_RAW)\n                };\n\n                let trailer_bytes = if let Some(mut trailer) = this.buffered_trailing_headers.take()\n                {\n                    let mut trailer_bytes = BytesMut::new();\n                    let trailer = if this.options.is_signed && !trailer.is_empty() {\n                        let signer = signer_mut!(this);\n                        let signature = signer\n                            .trailer_signature(&Headers::try_from(trailer.clone())?)\n                            .map_err(|e| {\n                                Box::new(AwsChunkedBodyError::FailedToSign { source: e })\n                            })?;\n                        trailer.insert(\n                            http_1x::header::HeaderName::from_static(\n                                header::X_AMZ_TRAILER_SIGNATURE,\n                            ),\n                            http_1x::header::HeaderValue::from_str(&signature).unwrap(),\n                        );\n                        trailer\n                    } else {\n                        trailer\n                    };\n\n                    let actual_length: u64 = total_rendered_length_of_trailers(Some(&trailer));\n                    let expected_length = this.options.total_trailer_length();\n                    if expected_length != actual_length {\n                        let err = AwsChunkedBodyError::ReportedTrailerLengthMismatch {\n                            actual: actual_length,\n                            expected: expected_length,\n                        };\n                        return Poll::Ready(Some(Err(err.into())));\n                    }\n\n                    trailer_bytes = trailers_as_aws_chunked_bytes(Some(&trailer), trailer_bytes);\n                    trailer_bytes.freeze()\n                } else {\n                    Bytes::new()\n                };\n\n                *this.state = Closed;\n\n                if final_chunk.is_empty() && trailer_bytes.is_empty() {\n                    // Case for signed aws-chunked encoding with no trailers\n                    return Poll::Ready(None);\n                }\n\n                final_chunk.extend_from_slice(&trailer_bytes);\n                final_chunk.extend_from_slice(CRLF_RAW);\n\n                tracing::trace!(\"final chunk: {:#?}\", final_chunk);\n                Poll::Ready(Some(Ok(http_body_1x::Frame::data(final_chunk.freeze()))))\n            }\n            Closed => Poll::Ready(None),\n            #[allow(unreachable_patterns)]\n            // needed when cargo feature `http-02x` is enabled, bringing in an unused enum `WritingChunkData`\n            ref otherwise => {\n                unreachable!(\n                    \"invalid state {otherwise:?} for `poll_frame` in http-1x; this is a bug\"\n                )\n            }\n        }\n    }\n}\n\nfn signed_encoded_chunk(\n    signer: &mut (dyn SignChunk + Send + Sync),\n    chunk_bytes: Bytes,\n) -> Result<Bytes, SigningError> {\n    let chunk_size = format!(\"{:X}\", chunk_bytes.len());\n    let mut chunk = BytesMut::new();\n    chunk.extend_from_slice(chunk_size.as_bytes());\n    chunk.extend_from_slice(CHUNK_SIGNATURE_BEGIN_RAW);\n    chunk.extend_from_slice(signer.chunk_signature(&chunk_bytes)?.as_bytes());\n    chunk.extend_from_slice(CRLF_RAW);\n    chunk.extend_from_slice(&chunk_bytes);\n    chunk.extend_from_slice(CRLF_RAW);\n    Ok(chunk.freeze())\n}\n\nfn unsigned_encoded_chunk(chunk_bytes: Bytes) -> Bytes {\n    let chunk_size = format!(\"{:X}\", chunk_bytes.len());\n    let mut chunk = BytesMut::new();\n    chunk.extend_from_slice(chunk_size.as_bytes());\n    chunk.extend_from_slice(CRLF_RAW);\n    chunk.extend_from_slice(&chunk_bytes);\n    chunk.extend_from_slice(CRLF_RAW);\n    chunk.freeze()\n}\n\n/// Writes trailers out into a byte array `buffer`.\n///\n/// - Trailer names are separated by a single colon only, no space.\n/// - Trailer names with multiple values will be written out one line per value, with the name\n///   appearing on each line.\nfn trailers_as_aws_chunked_bytes(\n    trailer_map: Option<&http_1x::HeaderMap>,\n    mut buffer: BytesMut,\n) -> BytesMut {\n    if let Some(trailer_map) = trailer_map {\n        let mut current_header_name: Option<http_1x::header::HeaderName> = None;\n\n        for (header_name, header_value) in trailer_map.clone().into_iter() {\n            // When a header has multiple values, the name only comes up in iteration the first time\n            // we see it. Therefore, we need to keep track of the last name we saw and fall back to\n            // it when `header_name == None`.\n            current_header_name = header_name.or(current_header_name);\n\n            // In practice, this will always exist, but `if let` is nicer than unwrap\n            if let Some(header_name) = current_header_name.as_ref() {\n                buffer.extend_from_slice(header_name.as_ref());\n                buffer.extend_from_slice(TRAILER_SEPARATOR);\n                buffer.extend_from_slice(header_value.as_bytes());\n                buffer.extend_from_slice(CRLF_RAW);\n            }\n        }\n\n        buffer\n    } else {\n        buffer\n    }\n}\n\n/// Given an optional `HeaderMap`, calculate the total number of bytes required to represent the\n/// `HeaderMap`. If no `HeaderMap` is given as input, return 0.\n///\n/// - Trailer names are separated by a single colon only, no space.\n/// - Trailer names with multiple values will be written out one line per value, with the name\n///   appearing on each line.\nfn total_rendered_length_of_trailers(trailer_map: Option<&http_1x::HeaderMap>) -> u64 {\n    match trailer_map {\n        Some(trailer_map) => trailer_map\n            .iter()\n            .map(|(trailer_name, trailer_value)| {\n                trailer_name.as_str().len()\n                    + TRAILER_SEPARATOR.len()\n                    + trailer_value.len()\n                    + CRLF_RAW.len()\n            })\n            .sum::<usize>() as u64,\n        None => 0,\n    }\n}\n\n/// This is an ugly return type, but in practice it just returns `Ok(())` if the values match\n/// and `Err(Poll::Ready(Some(Err(AwsChunkedBodyError::StreamLengthMismatch))))` if they don't\n#[allow(clippy::type_complexity)]\nfn check_for_stream_length_mismatch(\n    actual_stream_length: u64,\n    expected_stream_length: u64,\n) -> Result<(), Poll<Option<Result<http_body_1x::Frame<Bytes>, aws_smithy_types::body::Error>>>> {\n    if actual_stream_length != expected_stream_length {\n        let err = Box::new(AwsChunkedBodyError::StreamLengthMismatch {\n            actual: actual_stream_length,\n            expected: expected_stream_length,\n        });\n        return Err(Poll::Ready(Some(Err(err))));\n    };\n\n    Ok(())\n}\n\n#[cfg(test)]\nmod tests {\n    use super::{total_rendered_length_of_trailers, trailers_as_aws_chunked_bytes};\n    use crate::content_encoding::{\n        AwsChunkedBody, AwsChunkedBodyOptions, CHUNK_TERMINATOR_RAW, CRLF_RAW,\n        DEFAULT_CHUNK_SIZE_BYTE,\n    };\n\n    use aws_smithy_types::body::SdkBody;\n    use bytes::{Buf, Bytes, BytesMut};\n    use bytes_utils::SegmentedBuf;\n    use http_1x::{HeaderMap, HeaderValue};\n    use http_body_1x::{Body, Frame, SizeHint};\n    use http_body_util::BodyExt;\n    use pin_project_lite::pin_project;\n\n    use std::io::Read;\n    use std::pin::Pin;\n    use std::task::{Context, Poll};\n    use std::time::Duration;\n\n    pin_project! {\n        struct SputteringBody {\n            parts: Vec<Option<Bytes>>,\n            cursor: usize,\n            delay_in_millis: u64,\n        }\n    }\n\n    impl SputteringBody {\n        fn len(&self) -> usize {\n            self.parts.iter().flatten().map(|b| b.len()).sum()\n        }\n    }\n\n    impl Body for SputteringBody {\n        type Data = Bytes;\n        type Error = aws_smithy_types::body::Error;\n\n        fn poll_frame(\n            self: Pin<&mut Self>,\n            cx: &mut Context<'_>,\n        ) -> Poll<Option<Result<Frame<Self::Data>, Self::Error>>> {\n            if self.cursor == self.parts.len() {\n                return Poll::Ready(None);\n            }\n\n            let this = self.project();\n            let delay_in_millis = *this.delay_in_millis;\n            let next_part = this.parts.get_mut(*this.cursor).unwrap().take();\n\n            match next_part {\n                None => {\n                    *this.cursor += 1;\n                    let waker = cx.waker().clone();\n                    tokio::spawn(async move {\n                        tokio::time::sleep(Duration::from_millis(delay_in_millis)).await;\n                        waker.wake();\n                    });\n                    Poll::Pending\n                }\n                Some(data) => {\n                    *this.cursor += 1;\n                    let frame = Frame::data(data);\n                    Poll::Ready(Some(Ok(frame)))\n                }\n            }\n        }\n\n        fn is_end_stream(&self) -> bool {\n            false\n        }\n\n        fn size_hint(&self) -> SizeHint {\n            SizeHint::new()\n        }\n    }\n\n    // Custom body that returns data and trailers\n    pin_project! {\n        struct TestBodyWithTrailers {\n            data: Option<Bytes>,\n            trailers: Option<HeaderMap>,\n        }\n    }\n\n    impl Body for TestBodyWithTrailers {\n        type Data = Bytes;\n        type Error = aws_smithy_types::body::Error;\n\n        fn poll_frame(\n            self: Pin<&mut Self>,\n            _cx: &mut Context<'_>,\n        ) -> Poll<Option<Result<http_body_1x::Frame<Self::Data>, Self::Error>>> {\n            let this = self.project();\n\n            if let Some(data) = this.data.take() {\n                return Poll::Ready(Some(Ok(http_body_1x::Frame::data(data))));\n            }\n\n            if let Some(trailers) = this.trailers.take() {\n                return Poll::Ready(Some(Ok(http_body_1x::Frame::trailers(trailers))));\n            }\n\n            Poll::Ready(None)\n        }\n    }\n\n    #[tokio::test]\n    async fn test_aws_chunked_encoding() {\n        let test_fut = async {\n            let input_str = \"Hello world\";\n            let opts = AwsChunkedBodyOptions::new(input_str.len() as u64, vec![]);\n            let mut body = AwsChunkedBody::new(SdkBody::from(input_str), opts);\n\n            let mut output: SegmentedBuf<Bytes> = SegmentedBuf::new();\n            while let Some(Ok(buf)) = body.frame().await {\n                output.push(buf.into_data().unwrap());\n            }\n\n            let mut actual_output = String::new();\n            output\n                .reader()\n                .read_to_string(&mut actual_output)\n                .expect(\"Doesn't cause IO errors\");\n\n            let expected_output = \"B\\r\\nHello world\\r\\n0\\r\\n\\r\\n\";\n\n            assert_eq!(expected_output, actual_output);\n\n            // You can insert a `tokio::time::sleep` here to verify the timeout works as intended\n        };\n\n        let timeout_duration = Duration::from_secs(3);\n        if tokio::time::timeout(timeout_duration, test_fut)\n            .await\n            .is_err()\n        {\n            panic!(\"test_aws_chunked_encoding timed out after {timeout_duration:?}\");\n        }\n    }\n\n    #[tokio::test]\n    async fn test_aws_chunked_encoding_sputtering_body() {\n        let test_fut = async {\n            let input = SputteringBody {\n                parts: vec![\n                    Some(Bytes::from_static(b\"chunk 1, \")),\n                    None,\n                    Some(Bytes::from_static(b\"chunk 2, \")),\n                    Some(Bytes::from_static(b\"chunk 3, \")),\n                    None,\n                    None,\n                    Some(Bytes::from_static(b\"chunk 4, \")),\n                    Some(Bytes::from_static(b\"chunk 5, \")),\n                    Some(Bytes::from_static(b\"chunk 6\")),\n                ],\n                cursor: 0,\n                delay_in_millis: 500,\n            };\n            let opts = AwsChunkedBodyOptions::new(input.len() as u64, vec![]);\n            let mut body = AwsChunkedBody::new(input, opts);\n\n            let mut output: SegmentedBuf<Bytes> = SegmentedBuf::new();\n            while let Some(Ok(buf)) = body.frame().await {\n                output.push(buf.into_data().unwrap());\n            }\n\n            let mut actual_output = String::new();\n            output\n                .reader()\n                .read_to_string(&mut actual_output)\n                .expect(\"Doesn't cause IO errors\");\n\n            let expected_output =\n                \"34\\r\\nchunk 1, chunk 2, chunk 3, chunk 4, chunk 5, chunk 6\\r\\n0\\r\\n\\r\\n\";\n\n            assert_eq!(expected_output, actual_output);\n        };\n\n        let timeout_duration = Duration::from_secs(3);\n        if tokio::time::timeout(timeout_duration, test_fut)\n            .await\n            .is_err()\n        {\n            panic!(\n                \"test_aws_chunked_encoding_sputtering_body timed out after {timeout_duration:?}\"\n            );\n        }\n    }\n\n    #[tokio::test]\n    async fn test_aws_chunked_encoding_incorrect_trailer_length_panic() {\n        let input_str = \"Hello world\";\n        // Test body has no trailers, so this length is incorrect and will trigger an assert panic\n        // When the panic occurs, it will actually expect a length of 44. This is because, when using\n        // aws-chunked encoding, each trailer will end with a CRLF which is 2 bytes long.\n        let wrong_trailer_len = 42;\n        let opts = AwsChunkedBodyOptions::new(input_str.len() as u64, vec![wrong_trailer_len]);\n        let mut body = AwsChunkedBody::new(SdkBody::from(input_str), opts);\n\n        // We don't care about the body contents but we have to read it all before checking for trailers\n        while let Some(Ok(frame)) = body.frame().await {\n            assert!(!frame.is_trailers());\n        }\n    }\n\n    #[tokio::test]\n    async fn test_aws_chunked_encoding_empty_body() {\n        let input_str = \"\";\n        let opts = AwsChunkedBodyOptions::new(input_str.len() as u64, vec![]);\n        let mut body = AwsChunkedBody::new(SdkBody::from(input_str), opts);\n\n        let mut output: SegmentedBuf<Bytes> = SegmentedBuf::new();\n        while let Some(Ok(frame)) = body.frame().await {\n            output.push(frame.into_data().unwrap());\n        }\n\n        let mut actual_output = String::new();\n        output\n            .reader()\n            .read_to_string(&mut actual_output)\n            .expect(\"Doesn't cause IO errors\");\n\n        let actual_output = std::str::from_utf8(actual_output.as_bytes()).unwrap();\n        let expected_output = [CHUNK_TERMINATOR_RAW, CRLF_RAW].concat();\n        let expected_output = std::str::from_utf8(&expected_output).unwrap();\n\n        assert_eq!(expected_output, actual_output);\n    }\n\n    #[tokio::test]\n    async fn test_total_rendered_length_of_trailers() {\n        let mut trailers = HeaderMap::new();\n\n        trailers.insert(\"empty_value\", HeaderValue::from_static(\"\"));\n\n        trailers.insert(\"single_value\", HeaderValue::from_static(\"value 1\"));\n\n        trailers.insert(\"two_values\", HeaderValue::from_static(\"value 1\"));\n        trailers.append(\"two_values\", HeaderValue::from_static(\"value 2\"));\n\n        trailers.insert(\"three_values\", HeaderValue::from_static(\"value 1\"));\n        trailers.append(\"three_values\", HeaderValue::from_static(\"value 2\"));\n        trailers.append(\"three_values\", HeaderValue::from_static(\"value 3\"));\n\n        let trailers = Some(&trailers);\n        let actual_length = total_rendered_length_of_trailers(trailers);\n        let buf = BytesMut::with_capacity(actual_length as usize);\n        let expected_length = (trailers_as_aws_chunked_bytes(trailers, buf).len()) as u64;\n\n        assert_eq!(expected_length, actual_length);\n    }\n\n    #[tokio::test]\n    async fn test_total_rendered_length_of_empty_trailers() {\n        let header_map = HeaderMap::new();\n        let trailers = Some(&header_map);\n        let actual_length = total_rendered_length_of_trailers(trailers);\n        let buf = BytesMut::with_capacity(actual_length as usize);\n        let expected_length = (trailers_as_aws_chunked_bytes(trailers, buf).len()) as u64;\n\n        assert_eq!(expected_length, actual_length);\n    }\n\n    #[tokio::test]\n    async fn test_poll_frame_with_default_chunk_size() {\n        let test_data = Bytes::from(\"1234567890123456789012345\");\n        let body = SdkBody::from(test_data.clone());\n        let options = AwsChunkedBodyOptions::new(test_data.len() as u64, vec![]);\n        let mut chunked_body = AwsChunkedBody::new(body, options);\n\n        let mut data_frames: Vec<Bytes> = Vec::new();\n        while let Some(frame) = chunked_body.frame().await.transpose().unwrap() {\n            if let Ok(data) = frame.into_data() {\n                data_frames.push(data);\n            }\n        }\n\n        assert_eq!(data_frames.len(), 2); // Data fits in one chunk, plus the final chunk\n        assert_eq!(\n            Bytes::from_static(b\"19\\r\\n1234567890123456789012345\\r\\n\"),\n            data_frames[0]\n        );\n        assert_eq!(Bytes::from_static(b\"0\\r\\n\\r\\n\"), data_frames[1]);\n    }\n\n    #[tokio::test]\n    async fn test_poll_frame_with_custom_chunk_size() {\n        let test_data = Bytes::from(\"1234567890123456789012345\");\n        let body = SdkBody::from(test_data.clone());\n        let options =\n            AwsChunkedBodyOptions::new(test_data.len() as u64, vec![]).with_chunk_size(10);\n        let mut chunked_body = AwsChunkedBody::new(body, options);\n\n        let mut data_frames: Vec<Bytes> = Vec::new();\n        while let Some(frame) = chunked_body.frame().await.transpose().unwrap() {\n            if let Ok(data) = frame.into_data() {\n                data_frames.push(data);\n            }\n        }\n\n        assert_eq!(4, data_frames.len()); // 25 bytes / 10 = 2.5 so 3 chunks, plus the final chunk\n        assert_eq!(Bytes::from_static(b\"A\\r\\n1234567890\\r\\n\"), data_frames[0]);\n        assert_eq!(Bytes::from_static(b\"A\\r\\n1234567890\\r\\n\"), data_frames[1]);\n        assert_eq!(Bytes::from_static(b\"5\\r\\n12345\\r\\n\"), data_frames[2]);\n        assert_eq!(Bytes::from_static(b\"0\\r\\n\\r\\n\"), data_frames[3]);\n    }\n\n    #[tokio::test]\n    async fn test_poll_frame_with_trailers() {\n        let data = Bytes::from(\"1234567890123456789012345\");\n        let stream_len = data.len() as u64;\n        let mut trailers = HeaderMap::new();\n        trailers.insert(\"x-amz-checksum-crc32\", HeaderValue::from_static(\"78DeVw==\"));\n        let body = TestBodyWithTrailers {\n            data: Some(data),\n            trailers: Some(trailers),\n        };\n        let options = AwsChunkedBodyOptions::new(stream_len, vec![29]).with_chunk_size(10);\n        let mut chunked_body = AwsChunkedBody::new(body, options);\n\n        let mut data_frames: Vec<Bytes> = Vec::new();\n        while let Some(frame) = chunked_body.frame().await.transpose().unwrap() {\n            if let Ok(data) = frame.into_data() {\n                data_frames.push(data);\n            }\n        }\n\n        assert_eq!(4, data_frames.len()); // 25 bytes / 10 = 2.5 so 3 chunks, plus the final chunk\n        assert_eq!(Bytes::from_static(b\"A\\r\\n1234567890\\r\\n\"), data_frames[0]);\n        assert_eq!(Bytes::from_static(b\"A\\r\\n1234567890\\r\\n\"), data_frames[1]);\n        assert_eq!(Bytes::from_static(b\"5\\r\\n12345\\r\\n\"), data_frames[2]);\n        assert_eq!(\n            Bytes::from_static(b\"0\\r\\nx-amz-checksum-crc32:78DeVw==\\r\\n\\r\\n\"),\n            data_frames[3]\n        );\n    }\n\n    // Testing scenario derived from https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-streaming.html\n    #[tokio::test]\n    async fn test_aws_chunked_body_poll_frame_with_signer() {\n        use crate::auth::sigv4::SigV4MessageSigner;\n        use aws_credential_types::Credentials;\n        use aws_sigv4::http_request::SigningSettings;\n        use aws_smithy_async::time::{SharedTimeSource, StaticTimeSource};\n        use aws_types::region::SigningRegion;\n        use aws_types::SigningName;\n        use std::time::{Duration, UNIX_EPOCH};\n\n        // 65KB of 'a' characters\n        let data = \"a\".repeat(65 * 1024);\n        let stream_len = data.len() as u64;\n        let inner_body = SdkBody::from(data);\n\n        // `StaticTimeSource` for 20130524T000000Z\n        let time = StaticTimeSource::new(UNIX_EPOCH + Duration::from_secs(1369353600));\n        let shared_time = SharedTimeSource::from(time);\n\n        let credentials = Credentials::new(\n            \"AKIAIOSFODNN7EXAMPLE\",\n            \"wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY\",\n            None,\n            None,\n            \"test\",\n        );\n\n        let seed_signature =\n            \"4f232c4386841ef735655705268965c44a0e4690baa4adea153f7db9fa80a0a9\".to_owned();\n        let signer = SigV4MessageSigner::new(\n            seed_signature,\n            credentials.into(),\n            SigningRegion::from_static(\"us-east-1\"),\n            SigningName::from_static(\"s3\"),\n            shared_time,\n            SigningSettings::default(),\n        );\n\n        let opt = AwsChunkedBodyOptions::new(stream_len, vec![]).signed_chunked_encoding(true);\n        let mut chunked_body = AwsChunkedBody::new(inner_body, opt).with_signer(signer);\n\n        let mut data_frames: Vec<Bytes> = Vec::new();\n        while let Some(frame) = chunked_body.frame().await.transpose().unwrap() {\n            if let Ok(data) = frame.into_data() {\n                data_frames.push(data);\n            }\n        }\n\n        assert_eq!(3, data_frames.len()); // 64 KB, 1 KB, and the final chunk with 0 bytes of chunk data.\n        assert!(data_frames[0].starts_with(b\"10000;chunk-signature=ad80c730a21e5b8d04586a2213dd63b9a0e99e0e2307b0ade35a65485a288648\\r\\n\"));\n        assert!(data_frames[1].starts_with(b\"400;chunk-signature=0055627c9e194cb4542bae2aa5492e3c1575bbb81b612b7d234b86a503ef5497\\r\\n\"));\n        assert_eq!(data_frames[2], Bytes::from_static(b\"0;chunk-signature=b6c6ea8a5354eaf15b3cb7646744f4275b71ea724fed81ceb9323e279d449df9\\r\\n\\r\\n\"));\n    }\n\n    // Testing scenario derived from https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-streaming-trailers.html\n    #[tokio::test]\n    async fn test_aws_chunked_body_poll_frame_with_signer_and_trailers() {\n        use crate::auth::sigv4::SigV4MessageSigner;\n        use aws_credential_types::Credentials;\n        use aws_sigv4::http_request::SigningSettings;\n        use aws_smithy_async::time::{SharedTimeSource, StaticTimeSource};\n        use aws_types::region::SigningRegion;\n        use aws_types::SigningName;\n        use std::time::{Duration, UNIX_EPOCH};\n\n        // 65KB of 'a' characters\n        let data = \"a\".repeat(65 * 1024);\n        let stream_len = data.len() as u64;\n\n        // Set trailers with x-amz-checksum-crc32c header\n        let mut trailers = HeaderMap::new();\n        trailers.insert(\n            \"x-amz-checksum-crc32c\",\n            HeaderValue::from_static(\"sOO8/Q==\"),\n        );\n\n        let inner_body = TestBodyWithTrailers {\n            data: Some(Bytes::from(data)),\n            trailers: Some(trailers),\n        };\n\n        // `StaticTimeSource` for 20130524T000000Z\n        let time = StaticTimeSource::new(UNIX_EPOCH + Duration::from_secs(1369353600));\n        let shared_time = SharedTimeSource::from(time);\n\n        let credentials = Credentials::new(\n            \"AKIAIOSFODNN7EXAMPLE\",\n            \"wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY\",\n            None,\n            None,\n            \"test\",\n        );\n\n        let seed_signature =\n            \"106e2a8a18243abcf37539882f36619c00e2dfc72633413f02d3b74544bfeb8e\".to_owned();\n        let signer = SigV4MessageSigner::new(\n            seed_signature,\n            credentials.into(),\n            SigningRegion::from_static(\"us-east-1\"),\n            SigningName::from_static(\"s3\"),\n            shared_time,\n            SigningSettings::default(),\n        );\n\n        let opt =\n            AwsChunkedBodyOptions::new(stream_len, vec![30, 88]).signed_chunked_encoding(true);\n        let mut chunked_body = AwsChunkedBody::new(inner_body, opt).with_signer(signer);\n\n        let mut data_frames: Vec<Bytes> = Vec::new();\n        while let Some(frame) = chunked_body.frame().await.transpose().unwrap() {\n            if let Ok(data) = frame.into_data() {\n                data_frames.push(data);\n            }\n        }\n\n        assert_eq!(4, data_frames.len()); // 64 KB, 1 KB, 0 bytes of chunk data, and the trailer chunk.\n        assert!(data_frames[0].starts_with(b\"10000;chunk-signature=b474d8862b1487a5145d686f57f013e54db672cee1c953b3010fb58501ef5aa2\\r\\n\"));\n        assert!(data_frames[1].starts_with(b\"400;chunk-signature=1c1344b170168f8e65b41376b44b20fe354e373826ccbbe2c1d40a8cae51e5c7\\r\\n\"));\n        assert_eq!(data_frames[2], Bytes::from_static(b\"0;chunk-signature=2ca2aba2005185cf7159c6277faf83795951dd77a3a99e6e65d5c9f85863f992\\r\\n\"));\n        assert_eq!(data_frames[3], Bytes::from_static(b\"x-amz-checksum-crc32c:sOO8/Q==\\r\\nx-amz-trailer-signature:d81f82fc3505edab99d459891051a732e8730629a2e4a59689829ca17fe2e435\\r\\n\\r\\n\"));\n    }\n\n    #[test]\n    fn test_unsigned_encoded_length_with_no_trailer() {\n        {\n            let options = AwsChunkedBodyOptions::new(10, vec![]);\n            /*\n             A\\r\\n\n             10 bytes of data\\r\\n\n             0\\r\\n\n             \\r\\n\n             -------------------------------------------------------------\n             1 (A) + 2 (\\r\\n) +\n             10 (data) + 2 (\\r\\n) +\n             1 (0) + 2 (\\r\\n) +\n             2 (\\r\\n)\n\n                = 20 total bytes\n            */\n            assert_eq!(options.encoded_length(), 20);\n        }\n        {\n            let options = AwsChunkedBodyOptions::new((DEFAULT_CHUNK_SIZE_BYTE + 10) as u64, vec![]);\n            /*\n             10000\\r\\n\n             65536 bytes of data\\r\\n\n             A\\r\\n\n             10 bytes of data\\r\\n\n             0\\r\\n\n             \\r\\n\n             -------------------------------------------------------------\n             5 (10000) + 2 (\\r\\n) +\n             65536 (data) + 2 (\\r\\n) +\n             1 (A) + 2 (\\r\\n) +\n             10 (data) + 2 (\\r\\n) +\n             1 (0) + 2 (\\r\\n) +\n             2 (\\r\\n)\n\n                = 65565 total bytes\n            */\n            assert_eq!(options.encoded_length(), 65565);\n        }\n    }\n\n    #[test]\n    fn test_unsigned_encoded_length_with_trailer() {\n        let options = AwsChunkedBodyOptions::new(10, vec![30]);\n        /*\n            A\\r\\n\n            10 bytes of data\\r\\n\n            0\\r\\n\n            x-amz-checksum-crc32c:sOO8/Q==\\r\\n\n            \\r\\n\n            -------------------------------------------------------------\n            1 (A) + 2 (\\r\\n) +\n            10 (data) + 2 (\\r\\n) +\n            1 (0) + 2 (\\r\\n) +\n            21 (x-amz-checksum-crc32c) + 1 (:) + 8 (sOO8/Q==) + 2 (\\r\\n) +\n            2 (\\r\\n)\n\n                = 52 total bytes\n        */\n        assert_eq!(options.encoded_length(), 52);\n    }\n\n    #[test]\n    fn test_signed_encoded_length_with_no_trailer() {\n        {\n            let options = AwsChunkedBodyOptions::new(10, vec![]).signed_chunked_encoding(true);\n            /*\n             A;chunk-signature=<signature>\\r\\n\n             10 bytes of data\\r\\n\n             0;chunk-signature=<signature>\\r\\n\n             \\r\\n\n             -------------------------------------------------------------\n             1 (A) + 17 (;chunk-signature=) + 64 (signature) + 2 (\\r\\n) +\n             10 (data) + 2 (\\r\\n) +\n             1 (0) + 17 (;chunk-signature) + 64 (signature) + 2 (\\r\\n) +\n             2 (\\r\\n)\n\n                = 182 total bytes\n            */\n            assert_eq!(options.encoded_length(), 182);\n        }\n        {\n            let options = AwsChunkedBodyOptions::new((DEFAULT_CHUNK_SIZE_BYTE + 10) as u64, vec![])\n                .signed_chunked_encoding(true);\n            /*\n             10000;chunk-signature=<signature>\\r\\n\n             65536 bytes of data\\r\\n\n             A;chunk-signature=<signature>\\r\\n\n             10 bytes of data\\r\\n\n             0;chunk-signature=<signature>\\r\\n\n             \\r\\n\n             -------------------------------------------------------------\n             5 (10000) + 17 (;chunk-signature=) + 64 (signature) + 2 (\\r\\n) +\n             65536 (data) + 2 (\\r\\n) +\n             1 (A) + 17 (;chunk-signature=) + 64 (signature) + 2 (\\r\\n) +\n             10 (data) + 2 (\\r\\n) +\n             1 (0) + 17 (;chunk-signature) + 64 (signature) + 2 (\\r\\n) +\n             2 (\\r\\n)\n\n                = 65808 total bytes\n            */\n            assert_eq!(options.encoded_length(), 65808);\n        }\n    }\n\n    #[test]\n    fn test_signed_encoded_length_with_trailer() {\n        let options = AwsChunkedBodyOptions::new(10, vec![30, 88]).signed_chunked_encoding(true);\n        /*\n            A;chunk-signature=<signature>\\r\\n\n            10 bytes of data\\r\\n\n            0;chunk-signature=<signature>\\r\\n\n            x-amz-checksum-crc32c:sOO8/Q==\\r\\n\n            x-amz-trailer-signature:<signature>\\r\\n\n            \\r\\n\n            -------------------------------------------------------------\n            1 (A) + 17 (;chunk-signature=) + 64 (signature) + 2 (\\r\\n) +\n            10 (data) + 2 (\\r\\n) +\n            1 (0) + 17 (;chunk-signature) + 64 (signature) + 2 (\\r\\n) +\n            21 (x-amz-checksum-crc32c) + 1 (:) + 8 (sOO8/Q==) + 2 (\\r\\n) +\n            23 (x-amz-trailer-signature) + 1 (:) + 64 (signature) + 2 (\\r\\n) +\n            2 (\\r\\n)\n\n                = 304 total bytes\n        */\n        assert_eq!(options.encoded_length(), 304);\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-runtime/src/content_encoding/body.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n#[cfg(feature = \"http-02x\")]\nmod http_body_0_x;\n\nmod http_body_1_x;\n\nuse crate::content_encoding::{AwsChunkedBodyOptions, SignChunk};\nuse aws_sigv4::http_request::SigningError;\nuse bytes::{Buf, Bytes};\nuse bytes_utils::SegmentedBuf;\nuse pin_project_lite::pin_project;\nuse std::pin::Pin;\nuse std::task::{Context, Poll};\n\n#[derive(Debug)]\npub(super) enum ChunkBuf {\n    /// Nothing has been buffered yet.\n    Empty,\n    /// Some data has been buffered.\n    /// The SegmentedBuf will automatically purge when it reads off the end of a chunk boundary.\n    Partial(SegmentedBuf<Bytes>),\n    /// The end of the stream has been reached, but there may still be some buffered data.\n    EosPartial(SegmentedBuf<Bytes>),\n    /// An exception terminated this stream.\n    Terminated,\n}\n\nimpl ChunkBuf {\n    /// Return true if there's more buffered data.\n    pub(super) fn remaining(&self) -> usize {\n        match self {\n            ChunkBuf::Empty | ChunkBuf::Terminated => 0,\n            ChunkBuf::Partial(segments) | ChunkBuf::EosPartial(segments) => segments.remaining(),\n        }\n    }\n\n    /// Return true if the stream has ended.\n    pub(super) fn is_eos(&self) -> bool {\n        matches!(self, ChunkBuf::EosPartial(_) | ChunkBuf::Terminated)\n    }\n\n    /// Return a mutable reference to the underlying buffered data.\n    pub(super) fn buffered(&mut self) -> &mut SegmentedBuf<Bytes> {\n        match self {\n            ChunkBuf::Empty => panic!(\"buffer must be populated before reading; this is a bug\"),\n            ChunkBuf::Partial(segmented) => segmented,\n            ChunkBuf::EosPartial(segmented) => segmented,\n            ChunkBuf::Terminated => panic!(\"buffer has been terminated; this is a bug\"),\n        }\n    }\n\n    /// Return a `ChunkBuf` that has reached end of stream.\n    pub(super) fn ended(self) -> Self {\n        match self {\n            ChunkBuf::Empty => ChunkBuf::EosPartial(SegmentedBuf::new()),\n            ChunkBuf::Partial(segmented) => ChunkBuf::EosPartial(segmented),\n            ChunkBuf::EosPartial(_) => panic!(\"already end of stream; this is a bug\"),\n            ChunkBuf::Terminated => panic!(\"stream terminated; this is a bug\"),\n        }\n    }\n}\n\n#[derive(Debug, PartialEq, Eq)]\npub(super) enum AwsChunkedBodyState {\n    /// Write out the chunk data.\n    WritingChunk,\n    #[cfg(feature = \"http-02x\")]\n    /// Write out the next chunk of data. Multiple polls of the inner body may need to occur before\n    /// all data is written out.\n    WritingChunkData,\n    /// Write out a zero-sized signed chunk.\n    WritingZeroSizedSignedChunk,\n    /// Buffer all trailers from the inner body, which avoids assuming trailing headers fit in a single frame.\n    PollingTrailers,\n    /// Write out all trailers associated with this `AwsChunkedBody` and then transition into the\n    /// `Closed` state.\n    WritingTrailers,\n    /// This is the final state. Write out the body terminator and then remain in this state.\n    Closed,\n}\n\npin_project! {\n    /// A request body compatible with `Content-Encoding: aws-chunked`.\n    ///\n    /// See [SigV4 streaming](https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-streaming.html)\n    /// and [streaming trailers](https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-streaming-trailers.html).\n    #[derive(Debug)]\n    pub struct AwsChunkedBody<InnerBody> {\n        #[pin]\n        pub(super) inner: InnerBody,\n        #[pin]\n        pub(super) state: AwsChunkedBodyState,\n        pub(super) options: AwsChunkedBodyOptions,\n        pub(super) inner_body_bytes_read_so_far: usize,\n        #[pin]\n        pub(super) chunk_buffer: ChunkBuf,\n        #[pin]\n        pub(super) buffered_trailing_headers: Option<http_1x::HeaderMap>,\n        #[pin]\n        pub(super) signer: Option<std::panic::AssertUnwindSafe<Box<dyn SignChunk + Send + Sync>>>,\n    }\n}\n\nimpl<Inner> AwsChunkedBody<Inner> {\n    /// Wrap the given body in an outer body compatible with `Content-Encoding: aws-chunked`\n    pub fn new(body: Inner, options: AwsChunkedBodyOptions) -> Self {\n        Self {\n            inner: body,\n            state: AwsChunkedBodyState::WritingChunk,\n            options,\n            inner_body_bytes_read_so_far: 0,\n            chunk_buffer: ChunkBuf::Empty,\n            buffered_trailing_headers: None,\n            signer: None,\n        }\n    }\n\n    /// Set signer for signing chunks and trailers.\n    #[allow(private_bounds)] // Until we support chunk signing for a custom signer, the trait does not need to be public\n    pub fn with_signer<S>(mut self, signer: S) -> Self\n    where\n        S: SignChunk + Send + Sync + 'static,\n    {\n        self.signer = Some(std::panic::AssertUnwindSafe(Box::new(signer)));\n        self\n    }\n\n    // Buffer the next chunk from the inner body into the provided `chunk_buffer`, and return\n    // whether or not it should continue reading from `inner`.\n    //\n    // If it has exhausted data frames and started polling trailers, the buffered trailer will be\n    // pushed into `buffered_trailing_headers`, immediately marking the `chunk_buffer` as `eos`.\n    pub(super) fn buffer_next_chunk(\n        inner: Pin<&mut Inner>,\n        mut chunk_buffer: Pin<&mut ChunkBuf>,\n        mut buffered_trailing_headers: Pin<&mut Option<http_1x::HeaderMap>>,\n        cx: &mut Context<'_>,\n    ) -> Poll<Result<bool, aws_smithy_types::body::Error>>\n    where\n        Inner: http_body_1x::Body<Data = Bytes, Error = aws_smithy_types::body::Error>,\n    {\n        match inner.poll_frame(cx) {\n            Poll::Ready(Some(Ok(frame))) => {\n                if frame.is_data() {\n                    let data = frame.into_data().expect(\"just checked to be data\");\n                    match chunk_buffer.as_mut().get_mut() {\n                        ChunkBuf::Empty => {\n                            let mut buf = SegmentedBuf::new();\n                            buf.push(data);\n                            *chunk_buffer.as_mut().get_mut() = ChunkBuf::Partial(buf);\n                        }\n                        ChunkBuf::Partial(buf) => buf.push(data),\n                        ChunkBuf::EosPartial(_) | ChunkBuf::Terminated => {\n                            panic!(\"cannot buffer more data after the stream has ended or been terminated; this is a bug\")\n                        }\n                    }\n                    Poll::Ready(Ok(true))\n                } else {\n                    let buf = chunk_buffer.as_mut().get_mut();\n                    *buf = std::mem::replace(buf, ChunkBuf::Empty).ended();\n                    *buffered_trailing_headers.as_mut().get_mut() = frame.into_trailers().ok();\n                    Poll::Ready(Ok(false))\n                }\n            }\n            Poll::Ready(Some(Err(e))) => {\n                *chunk_buffer.as_mut().get_mut() = ChunkBuf::Terminated;\n                Poll::Ready(Err(e))\n            }\n            Poll::Ready(None) => Poll::Ready(Ok(false)),\n            Poll::Pending => Poll::Pending,\n        }\n    }\n}\n\n#[derive(Debug)]\npub(super) enum AwsChunkedBodyError {\n    /// Error that occurs when the sum of `trailer_lengths` set when creating an `AwsChunkedBody` is\n    /// not equal to the actual length of the trailers returned by the inner `http_body::Body`\n    /// implementor. These trailer lengths are necessary in order to correctly calculate the total\n    /// size of the body for setting the content length header.\n    ReportedTrailerLengthMismatch { actual: u64, expected: u64 },\n    /// Error that occurs when the `stream_length` set when creating an `AwsChunkedBody` is not\n    /// equal to the actual length of the body returned by the inner `http_body::Body` implementor.\n    /// `stream_length` must be correct in order to set an accurate content length header.\n    StreamLengthMismatch { actual: u64, expected: u64 },\n    /// Error that occurs when signing a chunk fails.\n    FailedToSign { source: SigningError },\n}\n\nimpl std::fmt::Display for AwsChunkedBodyError {\n    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n        match self {\n            Self::ReportedTrailerLengthMismatch { actual, expected } => {\n                write!(f, \"When creating this AwsChunkedBody, length of trailers was reported as {expected}. However, when double checking during trailer encoding, length was found to be {actual} instead.\")\n            }\n            Self::StreamLengthMismatch { actual, expected } => {\n                write!(f, \"When creating this AwsChunkedBody, stream length was reported as {expected}. However, when double checking during body encoding, length was found to be {actual} instead.\")\n            }\n            Self::FailedToSign { source } => {\n                write!(f, \"Signing error during aws-chunked encoding: {source}\")\n            }\n        }\n    }\n}\n\nimpl std::error::Error for AwsChunkedBodyError {}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n\n    #[test]\n    fn test_aws_chunked_body_is_unwind_safe_and_ref_unwind_safe() {\n        fn assert_unwind_safe<T: std::panic::UnwindSafe>() {}\n        fn assert_ref_unwind_safe<T: std::panic::RefUnwindSafe>() {}\n\n        assert_unwind_safe::<AwsChunkedBody<()>>();\n        assert_ref_unwind_safe::<AwsChunkedBody<()>>();\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-runtime/src/content_encoding/options.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_smithy_types::config_bag::{Storable, StoreReplace};\n\nuse super::{\n    CHUNK_SIGNATURE_BEGIN, CHUNK_TERMINATOR, CRLF, DEFAULT_CHUNK_SIZE_BYTE, SIGNATURE_LENGTH,\n};\n\n/// Options used when constructing an [`AwsChunkedBody`](super::AwsChunkedBody).\n#[derive(Clone, Debug, Default)]\n#[non_exhaustive]\npub struct AwsChunkedBodyOptions {\n    /// The total size of the stream.\n    pub(crate) stream_length: u64,\n    /// The length of each trailer sent within an `AwsChunkedBody`. Necessary in\n    /// order to correctly calculate the total size of the body accurately.\n    pub(crate) trailer_lengths: Vec<u64>,\n    /// Whether the aws-chunked encoding is disabled. This could occur, for instance,\n    /// if a user specifies a custom checksum, rendering aws-chunked encoding unnecessary.\n    pub(crate) disabled: bool,\n    /// Whether chunks and trailer are signed.\n    pub(crate) is_signed: bool,\n    /// The size of each chunk in bytes.\n    /// None means use default (64 KiB)\n    pub(crate) chunk_size: Option<usize>,\n}\n\nimpl Storable for AwsChunkedBodyOptions {\n    type Storer = StoreReplace<Self>;\n}\n\nimpl AwsChunkedBodyOptions {\n    /// Create a new [`AwsChunkedBodyOptions`].\n    pub fn new(stream_length: u64, trailer_lengths: Vec<u64>) -> Self {\n        Self {\n            stream_length,\n            trailer_lengths,\n            disabled: false,\n            is_signed: false,\n            chunk_size: None,\n        }\n    }\n\n    /// Set the chunk size for aws-chunked encoding.\n    ///\n    /// This allows customizing the size of each chunk when using aws-chunked encoding.\n    /// The chunk size is validated by the interceptor (minimum 8 KiB).\n    pub fn with_chunk_size(mut self, chunk_size: usize) -> Self {\n        self.chunk_size = Some(chunk_size);\n        self\n    }\n\n    /// Get the chunk size that will be used for aws-chunked encoding.\n    ///\n    /// Returns the configured chunk size, or the default if not set.\n    pub fn chunk_size(&self) -> usize {\n        self.chunk_size.unwrap_or(DEFAULT_CHUNK_SIZE_BYTE)\n    }\n\n    pub(super) fn total_trailer_length(&self) -> u64 {\n        self.trailer_lengths.iter().sum::<u64>()\n            // We need to account for a CRLF after each trailer name/value pair\n            + (self.trailer_lengths.len() * CRLF.len()) as u64\n    }\n\n    /// Set the stream length in the options\n    pub fn with_stream_length(mut self, stream_length: u64) -> Self {\n        self.stream_length = stream_length;\n        self\n    }\n\n    /// Append a trailer length to the options\n    pub fn with_trailer_len(mut self, trailer_len: u64) -> Self {\n        self.trailer_lengths.push(trailer_len);\n        self\n    }\n\n    /// Return whether there are no trailers\n    pub fn is_trailer_empty(&self) -> bool {\n        self.trailer_lengths.is_empty()\n    }\n\n    /// Create a new [`AwsChunkedBodyOptions`] with aws-chunked encoding disabled.\n    ///\n    /// When the option is disabled, the body must not be wrapped in an `AwsChunkedBody`.\n    pub fn disable_chunked_encoding() -> Self {\n        Self {\n            disabled: true,\n            ..Default::default()\n        }\n    }\n\n    /// Return whether aws-chunked encoding is disabled.\n    pub fn disabled(&self) -> bool {\n        self.disabled\n    }\n\n    /// Set whether to use signed chunked encoding\n    pub fn signed_chunked_encoding(mut self, is_signed: bool) -> Self {\n        self.is_signed = is_signed;\n        self\n    }\n\n    /// Return the length of the body after `aws-chunked` encoding is applied\n    pub fn encoded_length(&self) -> u64 {\n        if self.is_signed {\n            self.signed_encoded_length()\n        } else {\n            self.unsigned_encoded_length()\n        }\n    }\n\n    fn signed_encoded_length(&self) -> u64 {\n        let number_of_data_chunks = self.stream_length / self.chunk_size() as u64;\n        let remaining_data_chunk = self.stream_length % self.chunk_size() as u64;\n\n        let mut length = number_of_data_chunks\n            * get_signed_chunk_bytes_length(self.chunk_size() as u64)\n            + if remaining_data_chunk > 0 {\n                get_signed_chunk_bytes_length(remaining_data_chunk)\n            } else {\n                0\n            };\n\n        // End chunk\n        length += get_signed_chunk_bytes_length(0);\n\n        length -= CRLF.len() as u64; // The last CRLF is not needed for 0-sized signed chunk\n\n        // Trailers\n        for len in self.trailer_lengths.iter() {\n            length += len + CRLF.len() as u64;\n        }\n\n        // Encoding terminator\n        length += CRLF.len() as u64;\n\n        length\n    }\n\n    fn unsigned_encoded_length(&self) -> u64 {\n        let number_of_data_chunks = self.stream_length / self.chunk_size() as u64;\n        let remaining_data_chunk = self.stream_length % self.chunk_size() as u64;\n\n        let mut length = number_of_data_chunks\n            * get_unsigned_chunk_bytes_length(self.chunk_size() as u64)\n            + if remaining_data_chunk > 0 {\n                get_unsigned_chunk_bytes_length(remaining_data_chunk)\n            } else {\n                0\n            };\n\n        // End chunk\n        length += CHUNK_TERMINATOR.len() as u64;\n\n        // Trailers\n        for len in self.trailer_lengths.iter() {\n            length += len + CRLF.len() as u64;\n        }\n\n        // Encoding terminator\n        length += CRLF.len() as u64;\n\n        length\n    }\n}\n\nfn int_log16<T>(mut i: T) -> u64\nwhere\n    T: std::ops::DivAssign + PartialOrd + From<u8> + Copy,\n{\n    let mut len = 0;\n    let zero = T::from(0);\n    let sixteen = T::from(16);\n\n    // Handle an edge case where 0 is passed in, which still requires 1 hex digit to represent\n    if i == zero {\n        return 1;\n    }\n\n    while i > zero {\n        i /= sixteen;\n        len += 1;\n    }\n\n    len\n}\n\n// Return the length of a signed chunk:\n//\n// A signed chunk looks like:\n// 10000;chunk-signature=b474d8862b1487a5145d686f57f013e54db672cee1c953b3010fb58501ef5aa2\\r\\n\n// <65536-bytes>\\r\\n\nfn get_signed_chunk_bytes_length(payload_length: u64) -> u64 {\n    let hex_repr_len = int_log16(payload_length);\n    hex_repr_len\n        + CHUNK_SIGNATURE_BEGIN.len() as u64\n        + SIGNATURE_LENGTH as u64\n        + CRLF.len() as u64\n        + payload_length\n        + CRLF.len() as u64\n}\n\n// Return the length of an unsigned chunk:\n//\n// An unsigned chunk looks like:\n// 10000\\r\\n\n// <65536-bytes>\\r\\n\nfn get_unsigned_chunk_bytes_length(payload_length: u64) -> u64 {\n    let hex_repr_len = int_log16(payload_length);\n    hex_repr_len + CRLF.len() as u64 + payload_length + CRLF.len() as u64\n}\n\n#[cfg(test)]\nmod tests {\n    use super::int_log16;\n\n    #[test]\n    fn test_int_log16() {\n        assert_eq!(int_log16(0u64), 1); // 0x0\n        assert_eq!(int_log16(1u64), 1); // 0x1\n        assert_eq!(int_log16(15u64), 1); // 0xF\n        assert_eq!(int_log16(16u64), 2); // 0x10\n        assert_eq!(int_log16(255u64), 2); // 0xFF\n        assert_eq!(int_log16(256u64), 3); // 0x100\n        assert_eq!(int_log16(4095u64), 3); // 0xFFF\n        assert_eq!(int_log16(4096u64), 4); // 0x1000\n        assert_eq!(int_log16(65535u64), 4); // 0xFFFF\n        assert_eq!(int_log16(65536u64), 5); // 0x10000\n        assert_eq!(int_log16(1048575u64), 5); // 0xFFFFF\n        assert_eq!(int_log16(1048576u64), 6); // 0x100000\n        assert_eq!(int_log16(u64::MAX), 16); // 0xFFFFFFFFFFFFFFFF\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-runtime/src/content_encoding/sign.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_sigv4::http_request::SigningError;\nuse aws_smithy_runtime_api::http::Headers;\nuse aws_smithy_types::config_bag::{Storable, StoreReplace};\nuse bytes::Bytes;\nuse std::sync::{mpsc, Arc, Mutex};\n\n// Trait for signing chunks and trailers\n//\n// Trait methods take `&mut self`` because they keep track of running signature as they sign each chunk.\npub(crate) trait SignChunk: std::fmt::Debug {\n    fn chunk_signature(&mut self, chunk: &Bytes) -> Result<String, SigningError>;\n\n    fn trailer_signature(&mut self, trailing_headers: &Headers) -> Result<String, SigningError>;\n}\n\n/// Deferred chunk signer that allows a signer to be wired up later.\n///\n/// Signing chunks and trailers occurs after HTTP request signing and requires\n/// signing context from the initial HTTP signature operation.\n///\n/// This signer establishes an MPSC channel with a sender placed in the request\n/// configuration. The HTTP signer implementation retrieves the sender from the\n/// config and sends an actual signing implementation with the required context.\n#[derive(Clone, Debug)]\n#[allow(clippy::type_complexity)]\npub struct DeferredSigner {\n    // The outer `Arc` enables cloning `DeferredSigner`, making `AwsChunkedBody` retryable.\n    // The inner trait objects are boxed to enable calling mutable trait methods.\n    signer: Arc<Mutex<Option<Box<dyn SignChunk + Send + Sync>>>>,\n    rx: Arc<Mutex<Option<mpsc::Receiver<Box<dyn SignChunk + Send + Sync>>>>>,\n}\n\nimpl Storable for DeferredSigner {\n    type Storer = StoreReplace<Self>;\n}\n\nimpl DeferredSigner {\n    /// Create a new `DeferredSigner` and its associated sender.\n    pub fn new() -> (Self, DeferredSignerSender) {\n        let (tx, rx) = mpsc::channel();\n        (\n            Self {\n                signer: Default::default(),\n                rx: Arc::new(Mutex::new(Some(rx))),\n            },\n            DeferredSignerSender { tx: Mutex::new(tx) },\n        )\n    }\n\n    /// Create an empty `DeferredSigner`, typically used as a placeholder for `std::mem::replace`\n    pub fn empty() -> Self {\n        Self {\n            rx: Default::default(),\n            signer: Default::default(),\n        }\n    }\n\n    fn acquire(&self) -> Box<dyn SignChunk + Send + Sync> {\n        let mut rx = self.rx.lock().unwrap();\n        rx.take()\n            .and_then(|receiver| receiver.try_recv().ok())\n            .expect(\"signer should be available\")\n    }\n}\n\n/// A sender placed in the config bag to wire up a signer for signing chunks and trailers.\n#[derive(Debug)]\npub struct DeferredSignerSender {\n    tx: Mutex<mpsc::Sender<Box<dyn SignChunk + Send + Sync>>>,\n}\n\nimpl DeferredSignerSender {\n    pub(crate) fn send(\n        &self,\n        signer: Box<dyn SignChunk + Send + Sync>,\n    ) -> Result<(), mpsc::SendError<Box<dyn SignChunk + Send + Sync>>> {\n        self.tx.lock().unwrap().send(signer)\n    }\n}\n\nimpl Storable for DeferredSignerSender {\n    type Storer = StoreReplace<Self>;\n}\n\nimpl SignChunk for DeferredSigner {\n    fn chunk_signature(&mut self, chunk: &Bytes) -> Result<String, SigningError> {\n        let mut signer = self.signer.lock().unwrap();\n        let signer = signer.get_or_insert_with(|| self.acquire());\n        signer.chunk_signature(chunk)\n    }\n\n    fn trailer_signature(&mut self, trailing_headers: &Headers) -> Result<String, SigningError> {\n        let mut signer = self.signer.lock().unwrap();\n        let signer = signer.get_or_insert_with(|| self.acquire());\n        signer.trailer_signature(trailing_headers)\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-runtime/src/content_encoding.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nmod body;\nmod options;\nmod sign;\n\npub use body::AwsChunkedBody;\npub use options::AwsChunkedBodyOptions;\npub(crate) use sign::SignChunk;\npub use sign::{DeferredSigner, DeferredSignerSender};\n\nconst CRLF: &str = \"\\r\\n\";\nconst CRLF_RAW: &[u8] = b\"\\r\\n\";\n\nconst CHUNK_SIGNATURE_BEGIN: &str = \";chunk-signature=\";\nconst CHUNK_SIGNATURE_BEGIN_RAW: &[u8] = b\";chunk-signature=\";\n\nconst CHUNK_TERMINATOR: &str = \"0\\r\\n\";\nconst CHUNK_TERMINATOR_RAW: &[u8] = b\"0\\r\\n\";\n\nconst TRAILER_SEPARATOR: &[u8] = b\":\";\n\nconst DEFAULT_CHUNK_SIZE_BYTE: usize = 64 * 1024; // 64 KB\n\nconst SIGNATURE_LENGTH: usize = 64;\n\n/// Content encoding header name constants\npub mod header {\n    /// Header name denoting \"x-amz-trailer-signature\"\n    pub const X_AMZ_TRAILER_SIGNATURE: &str = \"x-amz-trailer-signature\";\n}\n\n/// Content encoding header value constants\npub mod header_value {\n    /// Header value denoting \"aws-chunked\" encoding\n    pub const AWS_CHUNKED: &str = \"aws-chunked\";\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-runtime/src/env_config/error.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Errors related to AWS profile config files\n\nuse crate::env_config::parse::EnvConfigParseError;\nuse std::error::Error;\nuse std::fmt::{Display, Formatter};\nuse std::path::PathBuf;\nuse std::sync::Arc;\n\n/// Failed to read or parse the profile file(s)\n#[derive(Debug, Clone)]\npub enum EnvConfigFileLoadError {\n    /// The profile could not be parsed\n    #[non_exhaustive]\n    ParseError(EnvConfigParseError),\n\n    /// Attempt to read the AWS config file (`~/.aws/config` by default) failed with a filesystem error.\n    #[non_exhaustive]\n    CouldNotReadFile(CouldNotReadConfigFile),\n}\n\nimpl Display for EnvConfigFileLoadError {\n    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {\n        match self {\n            EnvConfigFileLoadError::ParseError(_err) => {\n                write!(f, \"could not parse profile file\")\n            }\n            EnvConfigFileLoadError::CouldNotReadFile(err) => {\n                write!(f, \"could not read file `{}`\", err.path.display())\n            }\n        }\n    }\n}\n\nimpl Error for EnvConfigFileLoadError {\n    fn source(&self) -> Option<&(dyn Error + 'static)> {\n        match self {\n            EnvConfigFileLoadError::ParseError(err) => Some(err),\n            EnvConfigFileLoadError::CouldNotReadFile(details) => Some(&details.cause),\n        }\n    }\n}\n\nimpl From<EnvConfigParseError> for EnvConfigFileLoadError {\n    fn from(err: EnvConfigParseError) -> Self {\n        EnvConfigFileLoadError::ParseError(err)\n    }\n}\n\n/// An error encountered while reading the AWS config file\n#[derive(Debug, Clone)]\npub struct CouldNotReadConfigFile {\n    pub(crate) path: PathBuf,\n    pub(crate) cause: Arc<std::io::Error>,\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-runtime/src/env_config/file.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Config structs to programmatically customize the profile files that get loaded\n\nuse std::fmt;\nuse std::path::PathBuf;\n\n/// Provides the ability to programmatically override the profile files that get loaded by the SDK.\n///\n/// The [`Default`] for `EnvConfigFiles` includes the default SDK config and credential files located in\n/// `~/.aws/config` and `~/.aws/credentials` respectively.\n///\n/// Any number of config and credential files may be added to the `EnvConfigFiles` file set, with the\n/// only requirement being that there is at least one of them. Custom file locations that are added\n/// will produce errors if they don't exist, while the default config/credentials files paths are\n/// allowed to not exist even if they're included.\n///\n/// # Example: Using a custom profile file path\n///\n/// ```no_run,ignore\n/// use aws_runtime::env_config::file::{EnvConfigFiles, SharedConfigFileKind};\n/// use std::sync::Arc;\n///\n/// # async fn example() {\n/// let profile_files = EnvConfigFiles::builder()\n///     .with_file(SharedConfigFileKind::Credentials, \"some/path/to/credentials-file\")\n///     .build();\n/// let sdk_config = aws_config::from_env()\n///     .profile_files(profile_files)\n///     .load()\n///     .await;\n/// # }\n/// ```\n#[derive(Clone, Debug)]\npub struct EnvConfigFiles {\n    pub(crate) files: Vec<EnvConfigFile>,\n}\n\nimpl EnvConfigFiles {\n    /// Returns a builder to create `EnvConfigFiles`\n    pub fn builder() -> Builder {\n        Builder::new()\n    }\n}\n\nimpl Default for EnvConfigFiles {\n    fn default() -> Self {\n        Self {\n            files: vec![\n                EnvConfigFile::Default(EnvConfigFileKind::Config),\n                EnvConfigFile::Default(EnvConfigFileKind::Credentials),\n            ],\n        }\n    }\n}\n\n/// Profile file type (config or credentials)\n#[derive(Copy, Clone, Debug)]\npub enum EnvConfigFileKind {\n    /// The SDK config file that typically resides in `~/.aws/config`\n    Config,\n    /// The SDK credentials file that typically resides in `~/.aws/credentials`\n    Credentials,\n}\n\nimpl EnvConfigFileKind {\n    pub(crate) fn default_path(&self) -> &'static str {\n        match &self {\n            EnvConfigFileKind::Credentials => \"~/.aws/credentials\",\n            EnvConfigFileKind::Config => \"~/.aws/config\",\n        }\n    }\n\n    pub(crate) fn override_environment_variable(&self) -> &'static str {\n        match &self {\n            EnvConfigFileKind::Config => \"AWS_CONFIG_FILE\",\n            EnvConfigFileKind::Credentials => \"AWS_SHARED_CREDENTIALS_FILE\",\n        }\n    }\n}\n\n/// A single config file within a [`EnvConfigFiles`] file set.\n#[derive(Clone)]\npub(crate) enum EnvConfigFile {\n    /// One of the default profile files (config or credentials in their default locations)\n    Default(EnvConfigFileKind),\n    /// A profile file at a custom location\n    FilePath {\n        kind: EnvConfigFileKind,\n        path: PathBuf,\n    },\n    /// The direct contents of a profile file\n    FileContents {\n        kind: EnvConfigFileKind,\n        contents: String,\n    },\n}\n\nimpl fmt::Debug for EnvConfigFile {\n    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n        match self {\n            Self::Default(kind) => f.debug_tuple(\"Default\").field(kind).finish(),\n            Self::FilePath { kind, path } => f\n                .debug_struct(\"FilePath\")\n                .field(\"kind\", kind)\n                .field(\"path\", path)\n                .finish(),\n            // Security: Redact the file contents since they may have credentials in them\n            Self::FileContents { kind, contents: _ } => f\n                .debug_struct(\"FileContents\")\n                .field(\"kind\", kind)\n                .field(\"contents\", &\"** redacted **\")\n                .finish(),\n        }\n    }\n}\n\n/// Builder for [`EnvConfigFiles`].\n#[derive(Clone, Default, Debug)]\npub struct Builder {\n    with_config: bool,\n    with_credentials: bool,\n    custom_sources: Vec<EnvConfigFile>,\n}\n\nimpl Builder {\n    /// Creates a new builder instance.\n    pub fn new() -> Self {\n        Default::default()\n    }\n\n    /// Include the default SDK config file in the list of profile files to be loaded.\n    ///\n    /// The default SDK config typically resides in `~/.aws/config`. When this flag is enabled,\n    /// this config file will be included in the profile files that get loaded in the built\n    /// [`EnvConfigFiles`] file set.\n    ///\n    /// This flag defaults to `false` when using the builder to construct [`EnvConfigFiles`].\n    pub fn include_default_config_file(mut self, include_default_config_file: bool) -> Self {\n        self.with_config = include_default_config_file;\n        self\n    }\n\n    /// Include the default SDK credentials file in the list of profile files to be loaded.\n    ///\n    /// The default SDK credentials typically reside in `~/.aws/credentials`. When this flag is enabled,\n    /// this credentials file will be included in the profile files that get loaded in the built\n    /// [`EnvConfigFiles`] file set.\n    ///\n    /// This flag defaults to `false` when using the builder to construct [`EnvConfigFiles`].\n    pub fn include_default_credentials_file(\n        mut self,\n        include_default_credentials_file: bool,\n    ) -> Self {\n        self.with_credentials = include_default_credentials_file;\n        self\n    }\n\n    /// Include a custom `file` in the list of profile files to be loaded.\n    ///\n    /// The `kind` informs the parser how to treat the file. If it's intended to be like\n    /// the SDK credentials file typically in `~/.aws/config`, then use [`EnvConfigFileKind::Config`].\n    /// Otherwise, use [`EnvConfigFileKind::Credentials`].\n    pub fn with_file(mut self, kind: EnvConfigFileKind, file: impl Into<PathBuf>) -> Self {\n        self.custom_sources.push(EnvConfigFile::FilePath {\n            kind,\n            path: file.into(),\n        });\n        self\n    }\n\n    /// Include custom file `contents` in the list of profile files to be loaded.\n    ///\n    /// The `kind` informs the parser how to treat the file. If it's intended to be like\n    /// the SDK credentials file typically in `~/.aws/config`, then use [`EnvConfigFileKind::Config`].\n    /// Otherwise, use [`EnvConfigFileKind::Credentials`].\n    pub fn with_contents(mut self, kind: EnvConfigFileKind, contents: impl Into<String>) -> Self {\n        self.custom_sources.push(EnvConfigFile::FileContents {\n            kind,\n            contents: contents.into(),\n        });\n        self\n    }\n\n    /// Build the [`EnvConfigFiles`] file set.\n    pub fn build(self) -> EnvConfigFiles {\n        let mut files = self.custom_sources;\n        if self.with_credentials {\n            files.insert(0, EnvConfigFile::Default(EnvConfigFileKind::Credentials));\n        }\n        if self.with_config {\n            files.insert(0, EnvConfigFile::Default(EnvConfigFileKind::Config));\n        }\n        if files.is_empty() {\n            panic!(\"At least one profile file must be included in the `EnvConfigFiles` file set.\");\n        }\n        EnvConfigFiles { files }\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n\n    #[test]\n    fn redact_file_contents_in_profile_file_debug() {\n        let shared_config_file = EnvConfigFile::FileContents {\n            kind: EnvConfigFileKind::Config,\n            contents: \"sensitive_contents\".into(),\n        };\n        let debug = format!(\"{shared_config_file:?}\");\n        assert!(!debug.contains(\"sensitive_contents\"));\n        assert!(debug.contains(\"** redacted **\"));\n    }\n\n    #[test]\n    fn build_correctly_orders_default_config_credentials() {\n        let shared_config_files = EnvConfigFiles::builder()\n            .with_file(EnvConfigFileKind::Config, \"foo\")\n            .include_default_credentials_file(true)\n            .include_default_config_file(true)\n            .build();\n        assert_eq!(3, shared_config_files.files.len());\n        assert!(matches!(\n            shared_config_files.files[0],\n            EnvConfigFile::Default(EnvConfigFileKind::Config)\n        ));\n        assert!(matches!(\n            shared_config_files.files[1],\n            EnvConfigFile::Default(EnvConfigFileKind::Credentials)\n        ));\n        assert!(matches!(\n            shared_config_files.files[2],\n            EnvConfigFile::FilePath {\n                kind: EnvConfigFileKind::Config,\n                path: _\n            }\n        ));\n    }\n\n    #[test]\n    #[should_panic]\n    fn empty_builder_panics() {\n        EnvConfigFiles::builder().build();\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-runtime/src/env_config/normalize.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::env_config::file::EnvConfigFileKind;\nuse crate::env_config::parse::{RawProfileSet, WHITESPACE};\nuse crate::env_config::property::{PropertiesKey, Property};\nuse crate::env_config::section::{EnvConfigSections, Profile, Section, SsoSession};\nuse std::borrow::Cow;\nuse std::collections::HashMap;\n\nconst DEFAULT: &str = \"default\";\nconst PROFILE_PREFIX: &str = \"profile\";\nconst SSO_SESSION_PREFIX: &str = \"sso-session\";\n\n/// Any section like `[<prefix> <suffix>]` or `[<suffix-only>]`\n#[derive(Eq, PartialEq, Hash, Debug)]\nstruct SectionPair<'a> {\n    prefix: Option<Cow<'a, str>>,\n    suffix: Cow<'a, str>,\n}\n\nimpl SectionPair<'_> {\n    fn is_unprefixed_default(&self) -> bool {\n        self.prefix.is_none() && self.suffix == DEFAULT\n    }\n\n    fn is_prefixed_default(&self) -> bool {\n        self.prefix.as_deref() == Some(PROFILE_PREFIX) && self.suffix == DEFAULT\n    }\n\n    fn parse(input: &str) -> SectionPair<'_> {\n        let input = input.trim_matches(WHITESPACE);\n        match input.split_once(WHITESPACE) {\n            // Something like `[profile name]`\n            Some((prefix, suffix)) => SectionPair {\n                prefix: Some(prefix.trim().into()),\n                suffix: suffix.trim().into(),\n            },\n            // Either `[profile-name]` or `[default]`\n            None => SectionPair {\n                prefix: None,\n                suffix: input.trim().into(),\n            },\n        }\n    }\n\n    /// Validate a SectionKey for a given file key\n    ///\n    /// 1. `name` must ALWAYS be a valid identifier\n    /// 2. For Config files, the profile must either be `default` or it must have a profile prefix\n    /// 3. For credentials files, the profile name MUST NOT have a profile prefix\n    /// 4. Only config files can have sections other than `profile` sections\n    fn valid_for(self, kind: EnvConfigFileKind) -> Result<Self, String> {\n        match kind {\n            EnvConfigFileKind::Config => match (&self.prefix, &self.suffix) {\n                (Some(prefix), suffix) => {\n                    if validate_identifier(suffix).is_ok() {\n                        Ok(self)\n                    } else {\n                        Err(format!(\"section [{prefix} {suffix}] ignored; `{suffix}` is not a valid identifier\"))\n                    }\n                }\n                (None, suffix) => {\n                    if self.is_unprefixed_default() {\n                        Ok(self)\n                    } else {\n                        Err(format!(\"profile [{suffix}] ignored; sections in the AWS config file (other than [default]) must have a prefix i.e. [profile my-profile]\"))\n                    }\n                }\n            },\n            EnvConfigFileKind::Credentials => match (&self.prefix, &self.suffix) {\n                (Some(prefix), suffix) => {\n                    if prefix == PROFILE_PREFIX {\n                        Err(format!(\"profile `{suffix}` ignored because credential profiles must NOT begin with `profile`\"))\n                    } else {\n                        Err(format!(\"section [{prefix} {suffix}] ignored; config must be in the AWS config file rather than the credentials file\"))\n                    }\n                }\n                (None, suffix) => {\n                    if validate_identifier(suffix).is_ok() {\n                        Ok(self)\n                    } else {\n                        Err(format!(\n                            \"profile [{suffix}] ignored because `{suffix}` is not a valid identifier\",\n                        ))\n                    }\n                }\n            },\n        }\n    }\n}\n\n/// Normalize a raw profile into a `MergedProfile`\n///\n/// This function follows the following rules, codified in the tests & the reference Java implementation\n/// - When the profile is a config file, strip `profile` and trim whitespace (`profile foo` => `foo`)\n/// - Profile names are validated (see `validate_profile_name`)\n/// - A profile named `profile default` takes priority over a profile named `default`.\n/// - Profiles with identical names are merged\npub(super) fn merge_in(\n    base: &mut EnvConfigSections,\n    raw_profile_set: RawProfileSet<'_>,\n    kind: EnvConfigFileKind,\n) {\n    // parse / validate sections\n    let validated_sections = raw_profile_set\n        .into_iter()\n        .map(|(section_key, properties)| {\n            (SectionPair::parse(section_key).valid_for(kind), properties)\n        });\n\n    // remove invalid profiles & emit a warning\n    // valid_sections contains only valid profiles, but it may contain `[profile default]` and `[default]`\n    // which must be filtered later\n    let valid_sections = validated_sections\n        .filter_map(|(section_key, properties)| match section_key {\n            Ok(section_key) => Some((section_key, properties)),\n            Err(err_str) => {\n                tracing::warn!(\"{err_str}\");\n                None\n            }\n        })\n        .collect::<Vec<_>>();\n    // if a `[profile default]` exists then we should ignore `[default]`\n    let ignore_unprefixed_default = valid_sections\n        .iter()\n        .any(|(section_key, _)| section_key.is_prefixed_default());\n\n    for (section_key, raw_profile) in valid_sections {\n        // When normalizing profiles, profiles should be merged. However, `[profile default]` and\n        // `[default]` are considered two separate profiles. Furthermore, `[profile default]` fully\n        // replaces any contents of `[default]`!\n        if ignore_unprefixed_default && section_key.is_unprefixed_default() {\n            tracing::warn!(\"profile `[default]` ignored because `[profile default]` was found which takes priority\");\n            continue;\n        }\n        let section: &mut dyn Section = match (\n            section_key.prefix.as_deref(),\n            section_key.suffix.as_ref(),\n        ) {\n            (Some(PROFILE_PREFIX), DEFAULT) | (None, DEFAULT) => base\n                .profiles\n                .entry(DEFAULT.to_string())\n                .or_insert_with(|| Profile::new(\"default\", Default::default())),\n            (Some(PROFILE_PREFIX), name) | (None, name) => base\n                .profiles\n                .entry(name.to_string())\n                .or_insert_with(|| Profile::new(name.to_string(), Default::default())),\n            (Some(SSO_SESSION_PREFIX), name) => base\n                .sso_sessions\n                .entry(name.to_string())\n                .or_insert_with(|| SsoSession::new(name.to_string(), Default::default())),\n            (Some(prefix), suffix) => {\n                for (sub_properties_group_name, raw_sub_properties) in &raw_profile {\n                    match validate_identifier(sub_properties_group_name.as_ref())\n                        .map(ToOwned::to_owned)\n                    {\n                        Ok(sub_properties_group_name) => parse_sub_properties(raw_sub_properties)\n                            .for_each(|(sub_property_name, sub_property_value)| {\n                                if let Ok(key) = PropertiesKey::builder()\n                                    .section_key(prefix)\n                                    .section_name(suffix)\n                                    .property_name(&sub_properties_group_name)\n                                    .sub_property_name(sub_property_name)\n                                    .build()\n                                {\n                                    base.other_sections.insert(key, sub_property_value);\n                                }\n                            }),\n                        Err(_) => {\n                            tracing::warn!(\"`[{prefix} {suffix}].{sub_properties_group_name}` \\\n                            ignored because `{sub_properties_group_name}` was not a valid identifier\");\n                        }\n                    }\n                }\n\n                continue;\n            }\n        };\n        merge_into_base(section, raw_profile)\n    }\n}\n\nfn merge_into_base(target: &mut dyn Section, profile: HashMap<Cow<'_, str>, Cow<'_, str>>) {\n    for (k, v) in profile {\n        match validate_identifier(k.as_ref()) {\n            Ok(k) => {\n                target.insert(k.to_owned(), Property::new(k.to_owned(), v.into()));\n            }\n            Err(_) => {\n                tracing::warn!(profile = %target.name(), key = ?k, \"key ignored because `{k}` was not a valid identifier\");\n            }\n        }\n    }\n}\n\n/// Validate that a string is a valid identifier\n///\n/// Identifiers must match `[A-Za-z0-9_\\-/.%@:\\+]+`\nfn validate_identifier(input: &str) -> Result<&str, ()> {\n    input\n        .chars()\n        .all(|ch| {\n            ch.is_ascii_alphanumeric() || ['_', '-', '/', '.', '%', '@', ':', '+'].contains(&ch)\n        })\n        .then_some(input)\n        .ok_or(())\n}\n\nfn parse_sub_properties(sub_properties_str: &str) -> impl Iterator<Item = (String, String)> + '_ {\n    sub_properties_str\n        .split('\\n')\n        .filter(|line| !line.is_empty())\n        .filter_map(|line| {\n            if let Some((key, value)) = line.split_once('=') {\n                let key = key.trim_matches(WHITESPACE).to_owned();\n                let value = value.trim_matches(WHITESPACE).to_owned();\n                Some((key, value))\n            } else {\n                tracing::warn!(\"`{line}` ignored because it is not a valid sub-property\");\n                None\n            }\n        })\n}\n\n#[cfg(test)]\nmod tests {\n    use crate::env_config::file::EnvConfigFileKind;\n    use crate::env_config::normalize::{merge_in, validate_identifier, SectionPair};\n    use crate::env_config::parse::RawProfileSet;\n    use crate::env_config::section::{EnvConfigSections, Section};\n    use std::borrow::Cow;\n    use std::collections::HashMap;\n    use tracing_test::traced_test;\n\n    #[test]\n    fn section_key_parsing() {\n        assert_eq!(\n            SectionPair {\n                prefix: None,\n                suffix: \"default\".into()\n            },\n            SectionPair::parse(\"default\"),\n        );\n        assert_eq!(\n            SectionPair {\n                prefix: None,\n                suffix: \"default\".into()\n            },\n            SectionPair::parse(\"   default \"),\n        );\n        assert_eq!(\n            SectionPair {\n                prefix: Some(\"profile\".into()),\n                suffix: \"default\".into()\n            },\n            SectionPair::parse(\"profile default\"),\n        );\n        assert_eq!(\n            SectionPair {\n                prefix: Some(\"profile\".into()),\n                suffix: \"default\".into()\n            },\n            SectionPair::parse(\" profile   default \"),\n        );\n\n        assert_eq!(\n            SectionPair {\n                suffix: \"name\".into(),\n                prefix: Some(\"profile\".into())\n            },\n            SectionPair::parse(\"profile name\"),\n        );\n        assert_eq!(\n            SectionPair {\n                suffix: \"name\".into(),\n                prefix: None\n            },\n            SectionPair::parse(\"name\"),\n        );\n        assert_eq!(\n            SectionPair {\n                suffix: \"name\".into(),\n                prefix: Some(\"profile\".into())\n            },\n            SectionPair::parse(\"profile\\tname\"),\n        );\n        assert_eq!(\n            SectionPair {\n                suffix: \"name\".into(),\n                prefix: Some(\"profile\".into())\n            },\n            SectionPair::parse(\"profile     name  \"),\n        );\n        assert_eq!(\n            SectionPair {\n                suffix: \"profilename\".into(),\n                prefix: None\n            },\n            SectionPair::parse(\"profilename\"),\n        );\n        assert_eq!(\n            SectionPair {\n                suffix: \"whitespace\".into(),\n                prefix: None\n            },\n            SectionPair::parse(\"   whitespace   \"),\n        );\n\n        assert_eq!(\n            SectionPair {\n                prefix: Some(\"sso-session\".into()),\n                suffix: \"foo\".into()\n            },\n            SectionPair::parse(\"sso-session foo\"),\n        );\n        assert_eq!(\n            SectionPair {\n                prefix: Some(\"sso-session\".into()),\n                suffix: \"foo\".into()\n            },\n            SectionPair::parse(\"sso-session\\tfoo \"),\n        );\n        assert_eq!(\n            SectionPair {\n                suffix: \"sso-sessionfoo\".into(),\n                prefix: None\n            },\n            SectionPair::parse(\"sso-sessionfoo\"),\n        );\n        assert_eq!(\n            SectionPair {\n                suffix: \"sso-session\".into(),\n                prefix: None\n            },\n            SectionPair::parse(\"sso-session \"),\n        );\n    }\n\n    #[test]\n    fn test_validate_identifier() {\n        assert_eq!(\n            Ok(\"some-thing:long/the_one%only.foo@bar+\"),\n            validate_identifier(\"some-thing:long/the_one%only.foo@bar+\")\n        );\n        assert_eq!(Err(()), validate_identifier(\"foo!bar\"));\n    }\n\n    #[test]\n    #[traced_test]\n    fn ignored_key_generates_warning() {\n        let mut profile: RawProfileSet<'_> = HashMap::new();\n        profile.insert(\"default\", {\n            let mut out = HashMap::new();\n            out.insert(Cow::Borrowed(\"invalid key\"), \"value\".into());\n            out\n        });\n        let mut base = EnvConfigSections::default();\n        merge_in(&mut base, profile, EnvConfigFileKind::Config);\n        assert!(base\n            .get_profile(\"default\")\n            .expect(\"contains default profile\")\n            .is_empty());\n        assert!(logs_contain(\n            \"key ignored because `invalid key` was not a valid identifier\"\n        ));\n    }\n\n    #[test]\n    #[traced_test]\n    fn invalid_profile_generates_warning() {\n        let mut profile: RawProfileSet<'_> = HashMap::new();\n        profile.insert(\"foo\", HashMap::new());\n        merge_in(\n            &mut EnvConfigSections::default(),\n            profile,\n            EnvConfigFileKind::Config,\n        );\n        assert!(logs_contain(\"profile [foo] ignored\"));\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-runtime/src/env_config/parse.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Profile file parsing\n//!\n//! This file implements profile file parsing at a very literal level. Prior to actually being used,\n//! profiles must be normalized into a canonical form. Constructions that will eventually be\n//! deemed invalid are accepted during parsing such as:\n//! - keys that are invalid identifiers: `a b = c`\n//! - profiles with invalid names\n//! - profile name normalization (`profile foo` => `foo`)\n\nuse crate::env_config::source::File;\nuse std::borrow::Cow;\nuse std::collections::HashMap;\nuse std::error::Error;\nuse std::fmt::{self, Display, Formatter};\n\n/// A set of profiles that still carries a reference to the underlying data\npub(super) type RawProfileSet<'a> = HashMap<&'a str, HashMap<Cow<'a, str>, Cow<'a, str>>>;\n\n/// Characters considered to be whitespace by the spec\n///\n/// Profile parsing is actually quite strict about what is and is not whitespace, so use this instead\n/// of `.is_whitespace()` / `.trim()`\npub(crate) const WHITESPACE: &[char] = &[' ', '\\t'];\nconst COMMENT: &[char] = &['#', ';'];\n\n/// Location for use during error reporting\n#[derive(Clone, Debug, Eq, PartialEq)]\nstruct Location {\n    line_number: usize,\n    path: String,\n}\n\n/// An error encountered while parsing a profile\n#[derive(Debug, Clone)]\npub struct EnvConfigParseError {\n    /// Location where this error occurred\n    location: Location,\n\n    /// Error message\n    message: String,\n}\n\nimpl Display for EnvConfigParseError {\n    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {\n        write!(\n            f,\n            \"error parsing {} on line {}:\\n  {}\",\n            self.location.path, self.location.line_number, self.message\n        )\n    }\n}\n\nimpl Error for EnvConfigParseError {}\n\n/// Validate that a line represents a valid subproperty\n///\n/// - Sub-properties looks like regular properties (`k=v`) that are nested within an existing property.\n/// - Sub-properties must be validated for compatibility with other SDKs, but they are not actually\n///   parsed into structured data.\nfn validate_subproperty(value: &str, location: Location) -> Result<(), EnvConfigParseError> {\n    if value.trim_matches(WHITESPACE).is_empty() {\n        Ok(())\n    } else {\n        parse_property_line(value)\n            .map_err(|err| err.into_error(\"sub-property\", location))\n            .map(|_| ())\n    }\n}\n\nfn is_empty_line(line: &str) -> bool {\n    line.trim_matches(WHITESPACE).is_empty()\n}\n\nfn is_comment_line(line: &str) -> bool {\n    line.starts_with(COMMENT)\n}\n\n/// Parser for profile files\nstruct Parser<'a> {\n    /// In-progress profile representation\n    data: RawProfileSet<'a>,\n\n    /// Parser state\n    state: State<'a>,\n\n    /// Parser source location\n    ///\n    /// Location is tracked to facilitate error reporting\n    location: Location,\n}\n\nenum State<'a> {\n    Starting,\n    ReadingProfile {\n        profile: &'a str,\n        property: Option<Cow<'a, str>>,\n        is_subproperty: bool,\n    },\n}\n\n/// Parse `file` into a `RawProfileSet`\npub(super) fn parse_profile_file(file: &File) -> Result<RawProfileSet<'_>, EnvConfigParseError> {\n    let mut parser = Parser {\n        data: HashMap::new(),\n        state: State::Starting,\n        location: Location {\n            line_number: 0,\n            path: file.path.clone().unwrap_or_default(),\n        },\n    };\n    parser.parse_profile(&file.contents)?;\n    Ok(parser.data)\n}\n\nimpl<'a> Parser<'a> {\n    /// Parse `file` containing profile data into `self.data`.\n    fn parse_profile(&mut self, file: &'a str) -> Result<(), EnvConfigParseError> {\n        for (line_number, line) in file.lines().enumerate() {\n            self.location.line_number = line_number + 1; // store a 1-indexed line number\n            if is_empty_line(line) || is_comment_line(line) {\n                continue;\n            }\n            if line.starts_with('[') {\n                self.read_profile_line(line)?;\n            } else if line.starts_with(WHITESPACE) {\n                self.read_property_continuation(line)?;\n            } else {\n                self.read_property_line(line)?;\n            }\n        }\n        Ok(())\n    }\n\n    /// Parse a property line like `a = b`\n    ///\n    /// A property line is only valid when we're within a profile definition, `[profile foo]`\n    fn read_property_line(&mut self, line: &'a str) -> Result<(), EnvConfigParseError> {\n        let location = &self.location;\n        let (current_profile, name) = match &self.state {\n            State::Starting => return Err(self.make_error(\"Expected a profile definition\")),\n            State::ReadingProfile { profile, .. } => (\n                self.data.get_mut(*profile).expect(\"profile must exist\"),\n                profile,\n            ),\n        };\n        let (k, v) = parse_property_line(line)\n            .map_err(|err| err.into_error(\"property\", location.clone()))?;\n        self.state = State::ReadingProfile {\n            profile: name,\n            property: Some(k.clone()),\n            is_subproperty: v.is_empty(),\n        };\n        current_profile.insert(k, v.into());\n        Ok(())\n    }\n\n    /// Create a location-tagged error message\n    fn make_error(&self, message: &str) -> EnvConfigParseError {\n        EnvConfigParseError {\n            location: self.location.clone(),\n            message: message.into(),\n        }\n    }\n\n    /// Parse the lines of a property after the first line.\n    ///\n    /// This is triggered by lines that start with whitespace.\n    fn read_property_continuation(&mut self, line: &'a str) -> Result<(), EnvConfigParseError> {\n        let current_property = match &self.state {\n            State::Starting => return Err(self.make_error(\"Expected a profile definition\")),\n            State::ReadingProfile {\n                profile,\n                property: Some(property),\n                is_subproperty,\n            } => {\n                if *is_subproperty {\n                    validate_subproperty(line, self.location.clone())?;\n                }\n                self.data\n                    .get_mut(*profile)\n                    .expect(\"profile must exist\")\n                    .get_mut(property.as_ref())\n                    .expect(\"property must exist\")\n            }\n            State::ReadingProfile {\n                profile: _,\n                property: None,\n                ..\n            } => return Err(self.make_error(\"Expected a property definition, found continuation\")),\n        };\n        let line = line.trim_matches(WHITESPACE);\n        let current_property = current_property.to_mut();\n        current_property.push('\\n');\n        current_property.push_str(line);\n        Ok(())\n    }\n\n    fn read_profile_line(&mut self, line: &'a str) -> Result<(), EnvConfigParseError> {\n        let line = prepare_line(line, false);\n        let profile_name = line\n            .strip_prefix('[')\n            .ok_or_else(|| self.make_error(\"Profile definition must start with '['\"))?\n            .strip_suffix(']')\n            .ok_or_else(|| self.make_error(\"Profile definition must end with ']'\"))?;\n        if !self.data.contains_key(profile_name) {\n            self.data.insert(profile_name, Default::default());\n        }\n        self.state = State::ReadingProfile {\n            profile: profile_name,\n            property: None,\n            is_subproperty: false,\n        };\n        Ok(())\n    }\n}\n\n/// Error encountered while parsing a property\n#[derive(Debug, Eq, PartialEq)]\nenum PropertyError {\n    NoEquals,\n    NoName,\n}\n\nimpl PropertyError {\n    fn into_error(self, ctx: &str, location: Location) -> EnvConfigParseError {\n        let mut ctx = ctx.to_string();\n        match self {\n            PropertyError::NoName => {\n                ctx.get_mut(0..1).unwrap().make_ascii_uppercase();\n                EnvConfigParseError {\n                    location,\n                    message: format!(\"{ctx} did not have a name\"),\n                }\n            }\n            PropertyError::NoEquals => EnvConfigParseError {\n                location,\n                message: format!(\"Expected an '=' sign defining a {ctx}\"),\n            },\n        }\n    }\n}\n\n/// Parse a property line into a key-value pair\nfn parse_property_line(line: &str) -> Result<(Cow<'_, str>, &str), PropertyError> {\n    let line = prepare_line(line, true);\n    let (k, v) = line.split_once('=').ok_or(PropertyError::NoEquals)?;\n    let k = k.trim_matches(WHITESPACE);\n    let v = v.trim_matches(WHITESPACE);\n    if k.is_empty() {\n        return Err(PropertyError::NoName);\n    }\n    // We don't want to blindly use `alloc::str::to_ascii_lowercase` because it\n    // always allocates. Instead, we check for uppercase ascii letters. Then,\n    // we only allocate in the case that there ARE letters that need to be\n    // lower-cased.\n    Ok((to_ascii_lowercase(k), v))\n}\n\npub(crate) fn to_ascii_lowercase(s: &str) -> Cow<'_, str> {\n    if s.bytes().any(|b| b.is_ascii_uppercase()) {\n        Cow::Owned(s.to_ascii_lowercase())\n    } else {\n        Cow::Borrowed(s)\n    }\n}\n\n/// Prepare a line for parsing\n///\n/// Because leading whitespace is significant, this method should only be called after determining\n/// whether a line represents a property (no whitespace) or a sub-property (whitespace).\n/// This function preprocesses a line to simplify parsing:\n/// 1. Strip leading and trailing whitespace\n/// 2. Remove trailing comments\n///\n/// Depending on context, comment characters may need to be preceded by whitespace to be considered\n/// comments.\nfn prepare_line(line: &str, comments_need_whitespace: bool) -> &str {\n    let line = line.trim_matches(WHITESPACE);\n    let mut prev_char_whitespace = false;\n    let mut comment_idx = None;\n    for (idx, chr) in line.char_indices() {\n        if (COMMENT.contains(&chr)) && (prev_char_whitespace || !comments_need_whitespace) {\n            comment_idx = Some(idx);\n            break;\n        }\n        prev_char_whitespace = chr.is_whitespace();\n    }\n    comment_idx\n        .map(|idx| &line[..idx])\n        .unwrap_or(line)\n        // trimming the comment might result in more whitespace that needs to be handled\n        .trim_matches(WHITESPACE)\n}\n\n#[cfg(test)]\nmod test {\n    use super::{parse_profile_file, prepare_line, Location};\n    use crate::env_config::file::EnvConfigFileKind;\n    use crate::env_config::parse::{parse_property_line, PropertyError};\n    use crate::env_config::source::File;\n    use std::borrow::Cow;\n\n    // most test cases covered by the JSON test suite\n\n    #[test]\n    fn property_parsing() {\n        fn ok<'a>(key: &'a str, value: &'a str) -> Result<(Cow<'a, str>, &'a str), PropertyError> {\n            Ok((Cow::Borrowed(key), value))\n        }\n\n        assert_eq!(parse_property_line(\"a = b\"), ok(\"a\", \"b\"));\n        assert_eq!(parse_property_line(\"a=b\"), ok(\"a\", \"b\"));\n        assert_eq!(parse_property_line(\"a = b \"), ok(\"a\", \"b\"));\n        assert_eq!(parse_property_line(\" a = b \"), ok(\"a\", \"b\"));\n        assert_eq!(parse_property_line(\" a = b 🐱 \"), ok(\"a\", \"b 🐱\"));\n        assert_eq!(parse_property_line(\"a b\"), Err(PropertyError::NoEquals));\n        assert_eq!(parse_property_line(\"= b\"), Err(PropertyError::NoName));\n        assert_eq!(parse_property_line(\"a =    \"), ok(\"a\", \"\"));\n        assert_eq!(\n            parse_property_line(\"something_base64=aGVsbG8gZW50aHVzaWFzdGljIHJlYWRlcg==\"),\n            ok(\"something_base64\", \"aGVsbG8gZW50aHVzaWFzdGljIHJlYWRlcg==\")\n        );\n\n        assert_eq!(parse_property_line(\"ABc = DEF\"), ok(\"abc\", \"DEF\"));\n    }\n\n    #[test]\n    fn prepare_line_strips_comments() {\n        assert_eq!(\n            prepare_line(\"name = value # Comment with # sign\", true),\n            \"name = value\"\n        );\n\n        assert_eq!(\n            prepare_line(\"name = value#Comment # sign\", true),\n            \"name = value#Comment\"\n        );\n\n        assert_eq!(\n            prepare_line(\"name = value#Comment # sign\", false),\n            \"name = value\"\n        );\n    }\n\n    #[test]\n    fn error_line_numbers() {\n        let file = File {\n            kind: EnvConfigFileKind::Config,\n            path: Some(\"~/.aws/config\".into()),\n            contents: \"[default\\nk=v\".into(),\n        };\n        let err = parse_profile_file(&file).expect_err(\"parsing should fail\");\n        assert_eq!(err.message, \"Profile definition must end with ']'\");\n        assert_eq!(\n            err.location,\n            Location {\n                path: \"~/.aws/config\".into(),\n                line_number: 1\n            }\n        )\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-runtime/src/env_config/property.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Sections within an AWS config profile.\n\nuse std::collections::HashMap;\nuse std::fmt;\n\n/// Key-Value property pair\n#[derive(Debug, Clone, Eq, PartialEq)]\npub struct Property {\n    key: String,\n    value: String,\n}\n\nimpl Property {\n    /// Value of this property\n    pub fn value(&self) -> &str {\n        &self.value\n    }\n\n    /// Name of this property\n    pub fn key(&self) -> &str {\n        &self.key\n    }\n\n    /// Creates a new property\n    pub fn new(key: String, value: String) -> Self {\n        Property { key, value }\n    }\n}\n\ntype SectionKey = String;\ntype SectionName = String;\ntype PropertyName = String;\ntype SubPropertyName = String;\ntype PropertyValue = String;\n\n/// A key for to a property value.\n///\n/// ```txt\n/// # An example AWS profile config section with properties and sub-properties\n/// [section-key section-name]\n/// property-name = property-value\n/// property-name =\n///   sub-property-name = property-value\n/// ```\n#[derive(Clone, Debug, PartialEq, Eq, Hash)]\npub struct PropertiesKey {\n    section_key: SectionKey,\n    section_name: SectionName,\n    property_name: PropertyName,\n    sub_property_name: Option<SubPropertyName>,\n}\n\nimpl PropertiesKey {\n    /// Create a new [`PropertiesKeyBuilder`].\n    pub fn builder() -> PropertiesKeyBuilder {\n        Default::default()\n    }\n}\n\nimpl fmt::Display for PropertiesKey {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        let PropertiesKey {\n            section_key,\n            section_name,\n            property_name,\n            sub_property_name,\n        } = self;\n        match sub_property_name {\n            Some(sub_property_name) => {\n                write!(\n                    f,\n                    \"[{section_key} {section_name}].{property_name}.{sub_property_name}\"\n                )\n            }\n            None => {\n                write!(f, \"[{section_key} {section_name}].{property_name}\")\n            }\n        }\n    }\n}\n\n/// Builder for [`PropertiesKey`]s.\n#[derive(Debug, Default)]\npub struct PropertiesKeyBuilder {\n    section_key: Option<SectionKey>,\n    section_name: Option<SectionName>,\n    property_name: Option<PropertyName>,\n    sub_property_name: Option<SubPropertyName>,\n}\n\nimpl PropertiesKeyBuilder {\n    /// Set the section key for this builder.\n    pub fn section_key(mut self, section_key: impl Into<String>) -> Self {\n        self.section_key = Some(section_key.into());\n        self\n    }\n\n    /// Set the section name for this builder.\n    pub fn section_name(mut self, section_name: impl Into<String>) -> Self {\n        self.section_name = Some(section_name.into());\n        self\n    }\n\n    /// Set the property name for this builder.\n    pub fn property_name(mut self, property_name: impl Into<String>) -> Self {\n        self.property_name = Some(property_name.into());\n        self\n    }\n\n    /// Set the sub-property name for this builder.\n    pub fn sub_property_name(mut self, sub_property_name: impl Into<String>) -> Self {\n        self.sub_property_name = Some(sub_property_name.into());\n        self\n    }\n\n    /// Build this builder. If all required fields are set,\n    /// `Ok(PropertiesKey)` is returned. Otherwise, an error is returned.\n    pub fn build(self) -> Result<PropertiesKey, String> {\n        Ok(PropertiesKey {\n            section_key: self\n                .section_key\n                .ok_or(\"A section_key is required\".to_owned())?,\n            section_name: self\n                .section_name\n                .ok_or(\"A section_name is required\".to_owned())?,\n            property_name: self\n                .property_name\n                .ok_or(\"A property_name is required\".to_owned())?,\n            sub_property_name: self.sub_property_name,\n        })\n    }\n}\n\n/// A map of [`PropertiesKey`]s to property values.\n#[derive(Clone, Debug, Default, PartialEq, Eq)]\npub struct Properties {\n    inner: HashMap<PropertiesKey, PropertyValue>,\n}\n\n#[allow(dead_code)]\nimpl Properties {\n    /// Create a new empty [`Properties`].\n    pub fn new() -> Self {\n        Default::default()\n    }\n\n    #[cfg(test)]\n    pub(crate) fn new_from_slice(slice: &[(PropertiesKey, PropertyValue)]) -> Self {\n        let mut properties = Self::new();\n        for (key, value) in slice {\n            properties.insert(key.clone(), value.clone());\n        }\n        properties\n    }\n\n    /// Insert a new key/value pair into this map.\n    pub fn insert(&mut self, properties_key: PropertiesKey, value: PropertyValue) {\n        let _ = self\n            .inner\n            // If we don't clone then we don't get to log a useful warning for a value getting overwritten.\n            .entry(properties_key.clone())\n            .and_modify(|v| {\n                tracing::trace!(\"overwriting {properties_key}: was {v}, now {value}\");\n                v.clone_from(&value);\n            })\n            .or_insert(value);\n    }\n\n    /// Given a [`PropertiesKey`], return the corresponding value, if any.\n    pub fn get(&self, properties_key: &PropertiesKey) -> Option<&PropertyValue> {\n        self.inner.get(properties_key)\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-runtime/src/env_config/section.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Sections within an AWS config profile.\n\nuse crate::env_config::normalize;\nuse crate::env_config::parse::{parse_profile_file, EnvConfigParseError};\nuse crate::env_config::property::{Properties, Property};\nuse crate::env_config::source::Source;\nuse std::borrow::Cow;\nuse std::collections::HashMap;\n\n/// Represents a top-level section (e.g., `[profile name]`) in a config file.\npub(crate) trait Section {\n    /// The name of this section\n    fn name(&self) -> &str;\n\n    /// Returns all the properties in this section\n    #[allow(dead_code)]\n    fn properties(&self) -> &HashMap<String, Property>;\n\n    /// Returns a reference to the property named `name`\n    fn get(&self, name: &str) -> Option<&str>;\n\n    /// True if there are no properties in this section.\n    #[allow(dead_code)]\n    fn is_empty(&self) -> bool;\n\n    /// Insert a property into a section\n    fn insert(&mut self, name: String, value: Property);\n}\n\n#[derive(Debug, Clone, Eq, PartialEq)]\npub(super) struct SectionInner {\n    pub(super) name: String,\n    pub(super) properties: HashMap<String, Property>,\n}\n\nimpl Section for SectionInner {\n    fn name(&self) -> &str {\n        &self.name\n    }\n\n    fn properties(&self) -> &HashMap<String, Property> {\n        &self.properties\n    }\n\n    fn get(&self, name: &str) -> Option<&str> {\n        self.properties\n            .get(name.to_ascii_lowercase().as_str())\n            .map(|prop| prop.value())\n    }\n\n    fn is_empty(&self) -> bool {\n        self.properties.is_empty()\n    }\n\n    fn insert(&mut self, name: String, value: Property) {\n        self.properties.insert(name.to_ascii_lowercase(), value);\n    }\n}\n\n/// An individual configuration profile\n///\n/// An AWS config may be composed of a multiple named profiles within a [`EnvConfigSections`].\n#[derive(Debug, Clone, Eq, PartialEq)]\npub struct Profile(SectionInner);\n\nimpl Profile {\n    /// Create a new profile\n    pub fn new(name: impl Into<String>, properties: HashMap<String, Property>) -> Self {\n        Self(SectionInner {\n            name: name.into(),\n            properties,\n        })\n    }\n\n    /// The name of this profile\n    pub fn name(&self) -> &str {\n        self.0.name()\n    }\n\n    /// Returns a reference to the property named `name`\n    pub fn get(&self, name: &str) -> Option<&str> {\n        self.0.get(name)\n    }\n}\n\nimpl Section for Profile {\n    fn name(&self) -> &str {\n        self.0.name()\n    }\n\n    fn properties(&self) -> &HashMap<String, Property> {\n        self.0.properties()\n    }\n\n    fn get(&self, name: &str) -> Option<&str> {\n        self.0.get(name)\n    }\n\n    fn is_empty(&self) -> bool {\n        self.0.is_empty()\n    }\n\n    fn insert(&mut self, name: String, value: Property) {\n        self.0.insert(name, value)\n    }\n}\n\n/// A `[sso-session name]` section in the config.\n#[derive(Debug, Clone, Eq, PartialEq)]\npub struct SsoSession(SectionInner);\n\nimpl SsoSession {\n    /// Create a new SSO session section.\n    pub(super) fn new(name: impl Into<String>, properties: HashMap<String, Property>) -> Self {\n        Self(SectionInner {\n            name: name.into(),\n            properties,\n        })\n    }\n\n    /// Returns a reference to the property named `name`\n    pub fn get(&self, name: &str) -> Option<&str> {\n        self.0.get(name)\n    }\n}\n\nimpl Section for SsoSession {\n    fn name(&self) -> &str {\n        self.0.name()\n    }\n\n    fn properties(&self) -> &HashMap<String, Property> {\n        self.0.properties()\n    }\n\n    fn get(&self, name: &str) -> Option<&str> {\n        self.0.get(name)\n    }\n\n    fn is_empty(&self) -> bool {\n        self.0.is_empty()\n    }\n\n    fn insert(&mut self, name: String, value: Property) {\n        self.0.insert(name, value)\n    }\n}\n\n/// A top-level configuration source containing multiple named profiles\n#[derive(Debug, Eq, Clone, PartialEq)]\npub struct EnvConfigSections {\n    pub(crate) profiles: HashMap<String, Profile>,\n    pub(crate) selected_profile: Cow<'static, str>,\n    pub(crate) sso_sessions: HashMap<String, SsoSession>,\n    pub(crate) other_sections: Properties,\n}\n\nimpl Default for EnvConfigSections {\n    fn default() -> Self {\n        Self {\n            profiles: Default::default(),\n            selected_profile: \"default\".into(),\n            sso_sessions: Default::default(),\n            other_sections: Default::default(),\n        }\n    }\n}\n\nimpl EnvConfigSections {\n    /// Create a new Profile set directly from a HashMap\n    ///\n    /// This method creates a ProfileSet directly from a hashmap with no normalization for test purposes.\n    #[cfg(any(test, feature = \"test-util\"))]\n    pub fn new(\n        profiles: HashMap<String, HashMap<String, String>>,\n        selected_profile: impl Into<Cow<'static, str>>,\n        sso_sessions: HashMap<String, HashMap<String, String>>,\n        other_sections: Properties,\n    ) -> Self {\n        let mut base = EnvConfigSections {\n            selected_profile: selected_profile.into(),\n            ..Default::default()\n        };\n        for (name, profile) in profiles {\n            base.profiles.insert(\n                name.clone(),\n                Profile::new(\n                    name,\n                    profile\n                        .into_iter()\n                        .map(|(k, v)| (k.clone(), Property::new(k, v)))\n                        .collect(),\n                ),\n            );\n        }\n        for (name, session) in sso_sessions {\n            base.sso_sessions.insert(\n                name.clone(),\n                SsoSession::new(\n                    name,\n                    session\n                        .into_iter()\n                        .map(|(k, v)| (k.clone(), Property::new(k, v)))\n                        .collect(),\n                ),\n            );\n        }\n        base.other_sections = other_sections;\n        base\n    }\n\n    /// Retrieves a key-value pair from the currently selected profile\n    pub fn get(&self, key: &str) -> Option<&str> {\n        self.profiles\n            .get(self.selected_profile.as_ref())\n            .and_then(|profile| profile.get(key))\n    }\n\n    /// Retrieves a named profile from the profile set\n    pub fn get_profile(&self, profile_name: &str) -> Option<&Profile> {\n        self.profiles.get(profile_name)\n    }\n\n    /// Returns the name of the currently selected profile\n    pub fn selected_profile(&self) -> &str {\n        self.selected_profile.as_ref()\n    }\n\n    /// Returns true if no profiles are contained in this profile set\n    pub fn is_empty(&self) -> bool {\n        self.profiles.is_empty()\n    }\n\n    /// Returns the names of the profiles in this config\n    pub fn profiles(&self) -> impl Iterator<Item = &str> {\n        self.profiles.keys().map(String::as_ref)\n    }\n\n    /// Returns the names of the SSO sessions in this config\n    pub fn sso_sessions(&self) -> impl Iterator<Item = &str> {\n        self.sso_sessions.keys().map(String::as_ref)\n    }\n\n    /// Retrieves a named SSO session from the config\n    pub fn sso_session(&self, name: &str) -> Option<&SsoSession> {\n        self.sso_sessions.get(name)\n    }\n\n    /// Returns a struct allowing access to other sections in the profile config\n    pub fn other_sections(&self) -> &Properties {\n        &self.other_sections\n    }\n\n    /// Given a [`Source`] of profile config, parse and merge them into a `EnvConfigSections`.\n    pub fn parse(source: Source) -> Result<Self, EnvConfigParseError> {\n        let mut base = EnvConfigSections {\n            selected_profile: source.profile,\n            ..Default::default()\n        };\n\n        for file in source.files {\n            normalize::merge_in(&mut base, parse_profile_file(&file)?, file.kind);\n        }\n        Ok(base)\n    }\n}\n\n#[cfg(test)]\nmod test {\n    use super::EnvConfigSections;\n    use crate::env_config::file::EnvConfigFileKind;\n    use crate::env_config::section::Section;\n    use crate::env_config::source::{File, Source};\n    use arbitrary::{Arbitrary, Unstructured};\n    use serde::Deserialize;\n    use std::collections::HashMap;\n    use std::error::Error;\n    use std::fs;\n    use tracing_test::traced_test;\n\n    /// Run all tests from `test-data/profile-parser-tests.json`\n    ///\n    /// These represent the bulk of the test cases and reach 100% coverage of the parser.\n    #[test]\n    #[traced_test]\n    fn run_tests() -> Result<(), Box<dyn Error>> {\n        let tests = fs::read_to_string(\"test-data/profile-parser-tests.json\")?;\n        let tests: ParserTests = serde_json::from_str(&tests)?;\n        for (i, test) in tests.tests.into_iter().enumerate() {\n            eprintln!(\"test: {}\", i);\n            check(test);\n        }\n        Ok(())\n    }\n\n    #[test]\n    fn empty_source_empty_profile() {\n        let source = make_source(ParserInput {\n            config_file: Some(\"\".to_string()),\n            credentials_file: Some(\"\".to_string()),\n        });\n\n        let profile_set = EnvConfigSections::parse(source).expect(\"empty profiles are valid\");\n        assert!(profile_set.is_empty());\n    }\n\n    #[test]\n    fn profile_names_are_exposed() {\n        let source = make_source(ParserInput {\n            config_file: Some(\"[profile foo]\\n[profile bar]\".to_string()),\n            credentials_file: Some(\"\".to_string()),\n        });\n\n        let profile_set = EnvConfigSections::parse(source).expect(\"profiles loaded\");\n\n        let mut profile_names: Vec<_> = profile_set.profiles().collect();\n        profile_names.sort();\n        assert_eq!(profile_names, vec![\"bar\", \"foo\"]);\n    }\n\n    /// Run all tests from the fuzzing corpus to validate coverage\n    #[test]\n    #[ignore]\n    fn run_fuzz_tests() -> Result<(), Box<dyn Error>> {\n        let fuzz_corpus = fs::read_dir(\"fuzz/corpus/profile-parser\")?\n            .map(|res| res.map(|entry| entry.path()))\n            .collect::<Result<Vec<_>, _>>()?;\n        for file in fuzz_corpus {\n            let raw = fs::read(file)?;\n            let mut unstructured = Unstructured::new(&raw);\n            let (conf, creds): (Option<&str>, Option<&str>) =\n                Arbitrary::arbitrary(&mut unstructured)?;\n            let profile_source = Source {\n                files: vec![\n                    File {\n                        kind: EnvConfigFileKind::Config,\n                        path: Some(\"~/.aws/config\".to_string()),\n                        contents: conf.unwrap_or_default().to_string(),\n                    },\n                    File {\n                        kind: EnvConfigFileKind::Credentials,\n                        path: Some(\"~/.aws/credentials\".to_string()),\n                        contents: creds.unwrap_or_default().to_string(),\n                    },\n                ],\n                profile: \"default\".into(),\n            };\n            // don't care if parse fails, just don't panic\n            let _ = EnvConfigSections::parse(profile_source);\n        }\n\n        Ok(())\n    }\n\n    // for test comparison purposes, flatten a profile into a hashmap\n    #[derive(Debug)]\n    struct FlattenedProfileSet {\n        profiles: HashMap<String, HashMap<String, String>>,\n        sso_sessions: HashMap<String, HashMap<String, String>>,\n    }\n    fn flatten(config: EnvConfigSections) -> FlattenedProfileSet {\n        FlattenedProfileSet {\n            profiles: flatten_sections(config.profiles.values().map(|p| p as _)),\n            sso_sessions: flatten_sections(config.sso_sessions.values().map(|s| s as _)),\n        }\n    }\n    fn flatten_sections<'a>(\n        sections: impl Iterator<Item = &'a dyn Section>,\n    ) -> HashMap<String, HashMap<String, String>> {\n        sections\n            .map(|section| {\n                (\n                    section.name().to_string(),\n                    section\n                        .properties()\n                        .values()\n                        .map(|prop| (prop.key().to_owned(), prop.value().to_owned()))\n                        .collect(),\n                )\n            })\n            .collect()\n    }\n\n    fn make_source(input: ParserInput) -> Source {\n        Source {\n            files: vec![\n                File {\n                    kind: EnvConfigFileKind::Config,\n                    path: Some(\"~/.aws/config\".to_string()),\n                    contents: input.config_file.unwrap_or_default(),\n                },\n                File {\n                    kind: EnvConfigFileKind::Credentials,\n                    path: Some(\"~/.aws/credentials\".to_string()),\n                    contents: input.credentials_file.unwrap_or_default(),\n                },\n            ],\n            profile: \"default\".into(),\n        }\n    }\n\n    // wrapper to generate nicer errors during test failure\n    fn check(test_case: ParserTest) {\n        let copy = test_case.clone();\n        let parsed = EnvConfigSections::parse(make_source(test_case.input));\n        let res = match (parsed.map(flatten), &test_case.output) {\n            (\n                Ok(FlattenedProfileSet {\n                    profiles: actual_profiles,\n                    sso_sessions: actual_sso_sessions,\n                }),\n                ParserOutput::Config {\n                    profiles,\n                    sso_sessions,\n                },\n            ) => {\n                if profiles != &actual_profiles {\n                    Err(format!(\n                        \"mismatched profiles:\\nExpected: {profiles:#?}\\nActual: {actual_profiles:#?}\",\n                    ))\n                } else if sso_sessions != &actual_sso_sessions {\n                    Err(format!(\n                        \"mismatched sso_sessions:\\nExpected: {sso_sessions:#?}\\nActual: {actual_sso_sessions:#?}\",\n                    ))\n                } else {\n                    Ok(())\n                }\n            }\n            (Err(msg), ParserOutput::ErrorContaining(substr)) => {\n                if format!(\"{}\", msg).contains(substr) {\n                    Ok(())\n                } else {\n                    Err(format!(\"Expected {} to contain {}\", msg, substr))\n                }\n            }\n            (Ok(output), ParserOutput::ErrorContaining(err)) => Err(format!(\n                \"expected an error: {err} but parse succeeded:\\n{output:#?}\",\n            )),\n            (Err(err), ParserOutput::Config { .. }) => {\n                Err(format!(\"Expected to succeed but got: {}\", err))\n            }\n        };\n        if let Err(e) = res {\n            eprintln!(\"Test case failed: {:#?}\", copy);\n            eprintln!(\"failure: {}\", e);\n            panic!(\"test failed\")\n        }\n    }\n\n    #[derive(Deserialize, Debug)]\n    #[serde(rename_all = \"camelCase\")]\n    struct ParserTests {\n        tests: Vec<ParserTest>,\n    }\n\n    #[derive(Deserialize, Debug, Clone)]\n    #[serde(rename_all = \"camelCase\")]\n    struct ParserTest {\n        _name: String,\n        input: ParserInput,\n        output: ParserOutput,\n    }\n\n    #[derive(Deserialize, Debug, Clone)]\n    #[serde(rename_all = \"camelCase\")]\n    enum ParserOutput {\n        Config {\n            profiles: HashMap<String, HashMap<String, String>>,\n            #[serde(default)]\n            sso_sessions: HashMap<String, HashMap<String, String>>,\n        },\n        ErrorContaining(String),\n    }\n\n    #[derive(Deserialize, Debug, Clone)]\n    #[serde(rename_all = \"camelCase\")]\n    struct ParserInput {\n        config_file: Option<String>,\n        credentials_file: Option<String>,\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-runtime/src/env_config/source.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Code for handling in-memory sources of profile data\n\nuse super::error::{CouldNotReadConfigFile, EnvConfigFileLoadError};\nuse crate::env_config::file::{EnvConfigFile, EnvConfigFileKind, EnvConfigFiles};\nuse crate::fs_util::{home_dir, Os};\nuse aws_smithy_types::error::display::DisplayErrorContext;\nuse aws_types::os_shim_internal;\nuse std::borrow::Cow;\nuse std::io::ErrorKind;\nuse std::path::{Component, Path, PathBuf};\nuse std::sync::Arc;\nuse tracing::{warn, Instrument};\nconst HOME_EXPANSION_FAILURE_WARNING: &str =\n    \"home directory expansion was requested (via `~` character) for the profile \\\n     config file path, but no home directory could be determined\";\n\n#[derive(Debug)]\n/// In-memory source of profile data\npub struct Source {\n    /// Profile file sources\n    pub(crate) files: Vec<File>,\n\n    /// Profile to use\n    ///\n    /// Overridden via `$AWS_PROFILE`, defaults to `default`\n    pub profile: Cow<'static, str>,\n}\n\n#[derive(Debug)]\n/// In-memory configuration file\npub struct File {\n    pub(crate) kind: EnvConfigFileKind,\n    pub(crate) path: Option<String>,\n    pub(crate) contents: String,\n}\n\n/// Load a [`Source`] from a given environment and filesystem.\npub async fn load(\n    proc_env: &os_shim_internal::Env,\n    fs: &os_shim_internal::Fs,\n    profile_files: &EnvConfigFiles,\n) -> Result<Source, EnvConfigFileLoadError> {\n    let home = home_dir(proc_env, Os::real());\n\n    let mut files = Vec::new();\n    for file in &profile_files.files {\n        let file = load_config_file(file, &home, fs, proc_env)\n            .instrument(tracing::debug_span!(\"load_config_file\", file = ?file))\n            .await?;\n        files.push(file);\n    }\n\n    Ok(Source {\n        files,\n        profile: proc_env\n            .get(\"AWS_PROFILE\")\n            .map(Cow::Owned)\n            .unwrap_or(Cow::Borrowed(\"default\")),\n    })\n}\n\nfn file_contents_to_string(path: &Path, contents: Vec<u8>) -> String {\n    // if the file is not valid utf-8, log a warning and use an empty file instead\n    match String::from_utf8(contents) {\n        Ok(contents) => contents,\n        Err(e) => {\n            tracing::warn!(path = ?path, error = %DisplayErrorContext(&e), \"config file did not contain utf-8 encoded data\");\n            Default::default()\n        }\n    }\n}\n\n/// Loads an AWS Config file\n///\n/// Both the default & the overriding patterns may contain `~/` which MUST be expanded to the users\n/// home directory in a platform-aware way (see [`expand_home`]).\n///\n/// Arguments:\n/// * `kind`: The type of config file to load\n/// * `home_directory`: Home directory to use during home directory expansion\n/// * `fs`: Filesystem abstraction\n/// * `environment`: Process environment abstraction\nasync fn load_config_file(\n    source: &EnvConfigFile,\n    home_directory: &Option<String>,\n    fs: &os_shim_internal::Fs,\n    environment: &os_shim_internal::Env,\n) -> Result<File, EnvConfigFileLoadError> {\n    let (path, kind, contents) = match source {\n        EnvConfigFile::Default(kind) => {\n            let (path_is_default, path) = environment\n                .get(kind.override_environment_variable())\n                .map(|p| (false, Cow::Owned(p)))\n                .ok()\n                .unwrap_or_else(|| (true, kind.default_path().into()));\n            let expanded = expand_home(path.as_ref(), path_is_default, home_directory);\n            if path != expanded.to_string_lossy() {\n                tracing::debug!(before = ?path, after = ?expanded, \"home directory expanded\");\n            }\n            // read the data at the specified path\n            // if the path does not exist, log a warning but pretend it was actually an empty file\n            let data = match fs.read_to_end(&expanded).await {\n                Ok(data) => data,\n                Err(e) => {\n                    // Important: The default config/credentials files MUST NOT return an error\n                    match e.kind() {\n                        ErrorKind::NotFound if path == kind.default_path() => {\n                            tracing::debug!(path = %path, \"config file not found\")\n                        }\n                        ErrorKind::NotFound if path != kind.default_path() => {\n                            // in the case where the user overrode the path with an environment variable,\n                            // log more loudly than the case where the default path was missing\n                            tracing::warn!(path = %path, env = %kind.override_environment_variable(), \"config file overridden via environment variable not found\")\n                        }\n                        _other => {\n                            tracing::warn!(path = %path, error = %DisplayErrorContext(&e), \"failed to read config file\")\n                        }\n                    };\n                    Default::default()\n                }\n            };\n            let contents = file_contents_to_string(&expanded, data);\n            (Some(Cow::Owned(expanded)), kind, contents)\n        }\n        EnvConfigFile::FilePath { kind, path } => {\n            let data = match fs.read_to_end(&path).await {\n                Ok(data) => data,\n                Err(e) => {\n                    return Err(EnvConfigFileLoadError::CouldNotReadFile(\n                        CouldNotReadConfigFile {\n                            path: path.clone(),\n                            cause: Arc::new(e),\n                        },\n                    ))\n                }\n            };\n            (\n                Some(Cow::Borrowed(path)),\n                kind,\n                file_contents_to_string(path, data),\n            )\n        }\n        EnvConfigFile::FileContents { kind, contents } => (None, kind, contents.clone()),\n    };\n    tracing::debug!(path = ?path, size = ?contents.len(), \"config file loaded\");\n    Ok(File {\n        kind: *kind,\n        // lossy is OK here, the name of this file is just for debugging purposes\n        path: path.map(|p| p.to_string_lossy().into()),\n        contents,\n    })\n}\n\nfn expand_home(\n    path: impl AsRef<Path>,\n    path_is_default: bool,\n    home_dir: &Option<String>,\n) -> PathBuf {\n    let path = path.as_ref();\n    let mut components = path.components();\n    let start = components.next();\n    match start {\n        None => path.into(), // empty path,\n        Some(Component::Normal(s)) if s == \"~\" => {\n            // do homedir replacement\n            let path = match home_dir {\n                Some(dir) => {\n                    tracing::debug!(home = ?dir, path = ?path, \"performing home directory substitution\");\n                    dir.clone()\n                }\n                None => {\n                    // Only log a warning if the path was explicitly set by the customer.\n                    if !path_is_default {\n                        warn!(HOME_EXPANSION_FAILURE_WARNING);\n                    }\n                    // if we can't determine the home directory, just leave it as `~`\n                    \"~\".into()\n                }\n            };\n            let mut path: PathBuf = path.into();\n            // rewrite the path using system-specific path separators\n            for component in components {\n                path.push(component);\n            }\n            path\n        }\n        // Finally, handle the case where it doesn't begin with some version of `~/`:\n        // NOTE: in this case we aren't performing path rewriting. This is correct because\n        // this path comes from an environment variable on the target\n        // platform, so in that case, the separators should already be correct.\n        _other => path.into(),\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use crate::env_config::error::EnvConfigFileLoadError;\n    use crate::env_config::file::{EnvConfigFile, EnvConfigFileKind, EnvConfigFiles};\n    use crate::env_config::source::{\n        expand_home, load, load_config_file, HOME_EXPANSION_FAILURE_WARNING,\n    };\n    use aws_types::os_shim_internal::{Env, Fs};\n    use futures_util::future::FutureExt;\n    use serde::Deserialize;\n    use std::collections::HashMap;\n    use std::error::Error;\n    use std::fs;\n    use tracing_test::traced_test;\n\n    #[test]\n    fn only_expand_home_prefix() {\n        // ~ is only expanded as a single component (currently)\n        let path = \"~aws/config\";\n        assert_eq!(\n            expand_home(path, false, &None).to_str().unwrap(),\n            \"~aws/config\"\n        );\n    }\n\n    #[derive(Deserialize, Debug)]\n    #[serde(rename_all = \"camelCase\")]\n    struct SourceTests {\n        tests: Vec<TestCase>,\n    }\n\n    #[derive(Deserialize, Debug)]\n    #[serde(rename_all = \"camelCase\")]\n    struct TestCase {\n        name: String,\n        environment: HashMap<String, String>,\n        platform: String,\n        profile: Option<String>,\n        config_location: String,\n        credentials_location: String,\n    }\n\n    /// Run all tests from file-location-tests.json\n    #[test]\n    fn run_tests() -> Result<(), Box<dyn Error>> {\n        let tests = fs::read_to_string(\"test-data/file-location-tests.json\")?;\n        let tests: SourceTests = serde_json::from_str(&tests)?;\n        for (i, test) in tests.tests.into_iter().enumerate() {\n            eprintln!(\"test: {}\", i);\n            check(test)\n                .now_or_never()\n                .expect(\"these futures should never poll\");\n        }\n        Ok(())\n    }\n\n    #[traced_test]\n    #[test]\n    fn logs_produced_default() {\n        let env = Env::from_slice(&[(\"HOME\", \"/user/name\")]);\n        let mut fs = HashMap::new();\n        fs.insert(\n            \"/user/name/.aws/config\".to_string(),\n            \"[default]\\nregion = us-east-1\",\n        );\n\n        let fs = Fs::from_map(fs);\n\n        let _src = load(&env, &fs, &Default::default()).now_or_never();\n        assert!(logs_contain(\"config file loaded\"));\n        assert!(logs_contain(\"performing home directory substitution\"));\n    }\n\n    #[traced_test]\n    #[test]\n    fn load_config_file_should_not_emit_warning_when_path_not_explicitly_set() {\n        let env = Env::from_slice(&[]);\n        let fs = Fs::from_slice(&[]);\n\n        let _src = load_config_file(\n            &EnvConfigFile::Default(EnvConfigFileKind::Config),\n            &None,\n            &fs,\n            &env,\n        )\n        .now_or_never();\n        assert!(!logs_contain(HOME_EXPANSION_FAILURE_WARNING));\n    }\n\n    #[traced_test]\n    #[test]\n    fn load_config_file_should_emit_warning_when_path_explicitly_set() {\n        let env = Env::from_slice(&[(\"AWS_CONFIG_FILE\", \"~/some/path\")]);\n        let fs = Fs::from_slice(&[]);\n\n        let _src = load_config_file(\n            &EnvConfigFile::Default(EnvConfigFileKind::Config),\n            &None,\n            &fs,\n            &env,\n        )\n        .now_or_never();\n        assert!(logs_contain(HOME_EXPANSION_FAILURE_WARNING));\n    }\n\n    async fn check(test_case: TestCase) {\n        let fs = Fs::real();\n        let env = Env::from(test_case.environment);\n        let platform_matches = (cfg!(windows) && test_case.platform == \"windows\")\n            || (!cfg!(windows) && test_case.platform != \"windows\");\n        if platform_matches {\n            let source = load(&env, &fs, &Default::default()).await.unwrap();\n            if let Some(expected_profile) = test_case.profile {\n                assert_eq!(source.profile, expected_profile, \"{}\", &test_case.name);\n            }\n            assert_eq!(\n                source.files[0].path,\n                Some(test_case.config_location),\n                \"{}\",\n                &test_case.name\n            );\n            assert_eq!(\n                source.files[1].path,\n                Some(test_case.credentials_location),\n                \"{}\",\n                &test_case.name\n            )\n        } else {\n            println!(\n                \"NOTE: ignoring test case for {} which does not apply to our platform: \\n  {}\",\n                &test_case.platform, &test_case.name\n            )\n        }\n    }\n\n    #[test]\n    #[cfg_attr(windows, ignore)]\n    fn test_expand_home() {\n        let path = \"~/.aws/config\";\n        assert_eq!(\n            expand_home(path, false, &Some(\"/user/foo\".to_string()))\n                .to_str()\n                .unwrap(),\n            \"/user/foo/.aws/config\"\n        );\n    }\n\n    #[test]\n    fn expand_home_no_home() {\n        // there is an edge case around expansion when no home directory exists\n        // if no home directory can be determined, leave the path as is\n        if !cfg!(windows) {\n            assert_eq!(\n                expand_home(\"~/config\", false, &None).to_str().unwrap(),\n                \"~/config\"\n            )\n        } else {\n            assert_eq!(\n                expand_home(\"~/config\", false, &None).to_str().unwrap(),\n                \"~\\\\config\"\n            )\n        }\n    }\n\n    /// Test that a linux oriented path expands on windows\n    #[test]\n    #[cfg_attr(not(windows), ignore)]\n    fn test_expand_home_windows() {\n        let path = \"~/.aws/config\";\n        assert_eq!(\n            expand_home(path, true, &Some(\"C:\\\\Users\\\\name\".to_string()),)\n                .to_str()\n                .unwrap(),\n            \"C:\\\\Users\\\\name\\\\.aws\\\\config\"\n        );\n    }\n\n    #[tokio::test]\n    async fn programmatically_set_credentials_file_contents() {\n        let contents = \"[default]\\n\\\n            aws_access_key_id = AKIAFAKE\\n\\\n            aws_secret_access_key = FAKE\\n\\\n            \";\n        let env = Env::from_slice(&[]);\n        let fs = Fs::from_slice(&[]);\n        let profile_files = EnvConfigFiles::builder()\n            .with_contents(EnvConfigFileKind::Credentials, contents)\n            .build();\n        let source = load(&env, &fs, &profile_files).await.unwrap();\n        assert_eq!(1, source.files.len());\n        assert_eq!(\"default\", source.profile);\n        assert_eq!(contents, source.files[0].contents);\n    }\n\n    #[tokio::test]\n    async fn programmatically_set_credentials_file_path() {\n        let contents = \"[default]\\n\\\n            aws_access_key_id = AKIAFAKE\\n\\\n            aws_secret_access_key = FAKE\\n\\\n            \";\n        let mut fs = HashMap::new();\n        fs.insert(\n            \"/custom/path/to/credentials\".to_string(),\n            contents.to_string(),\n        );\n\n        let fs = Fs::from_map(fs);\n        let env = Env::from_slice(&[]);\n        let profile_files = EnvConfigFiles::builder()\n            .with_file(\n                EnvConfigFileKind::Credentials,\n                \"/custom/path/to/credentials\",\n            )\n            .build();\n        let source = load(&env, &fs, &profile_files).await.unwrap();\n        assert_eq!(1, source.files.len());\n        assert_eq!(\"default\", source.profile);\n        assert_eq!(contents, source.files[0].contents);\n    }\n\n    // TODO(https://github.com/awslabs/aws-sdk-rust/issues/1117) This test is ignored on Windows because it uses Unix-style paths\n    #[tokio::test]\n    #[cfg_attr(windows, ignore)]\n    async fn programmatically_include_default_files() {\n        let config_contents = \"[default]\\nregion = us-east-1\";\n        let credentials_contents = \"[default]\\n\\\n            aws_access_key_id = AKIAFAKE\\n\\\n            aws_secret_access_key = FAKE\\n\\\n            \";\n        let custom_contents = \"[profile some-profile]\\n\\\n            aws_access_key_id = AKIAFAKEOTHER\\n\\\n            aws_secret_access_key = FAKEOTHER\\n\\\n            \";\n        let mut fs = HashMap::new();\n        fs.insert(\n            \"/user/name/.aws/config\".to_string(),\n            config_contents.to_string(),\n        );\n        fs.insert(\n            \"/user/name/.aws/credentials\".to_string(),\n            credentials_contents.to_string(),\n        );\n\n        let fs = Fs::from_map(fs);\n        let env = Env::from_slice(&[(\"HOME\", \"/user/name\")]);\n        let profile_files = EnvConfigFiles::builder()\n            .with_contents(EnvConfigFileKind::Config, custom_contents)\n            .include_default_credentials_file(true)\n            .include_default_config_file(true)\n            .build();\n        let source = load(&env, &fs, &profile_files).await.unwrap();\n        assert_eq!(3, source.files.len());\n        assert_eq!(\"default\", source.profile);\n        assert_eq!(config_contents, source.files[0].contents);\n        assert_eq!(credentials_contents, source.files[1].contents);\n        assert_eq!(custom_contents, source.files[2].contents);\n    }\n\n    #[tokio::test]\n    async fn default_files_must_not_error() {\n        let custom_contents = \"[profile some-profile]\\n\\\n            aws_access_key_id = AKIAFAKEOTHER\\n\\\n            aws_secret_access_key = FAKEOTHER\\n\\\n            \";\n\n        let fs = Fs::from_slice(&[]);\n        let env = Env::from_slice(&[(\"HOME\", \"/user/name\")]);\n        let profile_files = EnvConfigFiles::builder()\n            .with_contents(EnvConfigFileKind::Config, custom_contents)\n            .include_default_credentials_file(true)\n            .include_default_config_file(true)\n            .build();\n        let source = load(&env, &fs, &profile_files).await.unwrap();\n        assert_eq!(3, source.files.len());\n        assert_eq!(\"default\", source.profile);\n        assert_eq!(\"\", source.files[0].contents);\n        assert_eq!(\"\", source.files[1].contents);\n        assert_eq!(custom_contents, source.files[2].contents);\n    }\n\n    #[tokio::test]\n    async fn misconfigured_programmatic_custom_profile_path_must_error() {\n        let fs = Fs::from_slice(&[]);\n        let env = Env::from_slice(&[]);\n        let profile_files = EnvConfigFiles::builder()\n            .with_file(EnvConfigFileKind::Config, \"definitely-doesnt-exist\")\n            .build();\n        assert!(matches!(\n            load(&env, &fs, &profile_files).await,\n            Err(EnvConfigFileLoadError::CouldNotReadFile(_))\n        ));\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-runtime/src/env_config.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::env_config::property::PropertiesKey;\nuse crate::env_config::section::EnvConfigSections;\nuse aws_types::origin::Origin;\nuse aws_types::os_shim_internal::Env;\nuse aws_types::service_config::ServiceConfigKey;\nuse std::borrow::Cow;\nuse std::error::Error;\nuse std::fmt;\n\npub mod error;\npub mod file;\nmod normalize;\npub mod parse;\npub mod property;\npub mod section;\npub mod source;\n\n/// Given a key, access to the environment, and a validator, return a config value if one was set.\npub fn get_service_env_config<'a, T, E>(\n    key: ServiceConfigKey<'a>,\n    env: &'a Env,\n    shared_config_sections: Option<&'a EnvConfigSections>,\n    validator: impl Fn(&str) -> Result<T, E>,\n) -> Result<Option<T>, EnvConfigError<E>>\nwhere\n    E: Error + Send + Sync + 'static,\n{\n    EnvConfigValue::default()\n        .env(key.env())\n        .profile(key.profile())\n        .service_id(key.service_id())\n        .validate(env, shared_config_sections, validator)\n}\n\n#[derive(Debug)]\nenum Location<'a> {\n    Environment,\n    Profile { name: Cow<'a, str> },\n}\n\nimpl fmt::Display for Location<'_> {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        match self {\n            Location::Environment => write!(f, \"environment variable\"),\n            Location::Profile { name } => write!(f, \"profile (`{name}`)\"),\n        }\n    }\n}\n\n#[derive(Debug)]\nenum Scope<'a> {\n    Global,\n    Service { service_id: Cow<'a, str> },\n}\n\nimpl fmt::Display for Scope<'_> {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        match self {\n            Scope::Global => write!(f, \"global\"),\n            Scope::Service { service_id } => write!(f, \"service-specific (`{service_id}`)\"),\n        }\n    }\n}\n\n/// The source that env config was derived from.\n///\n/// Includes:\n///\n/// - Whether some config came from a config file or an env var.\n/// - The key used to identify the config value.\n///\n/// Only used when displaying config-extraction errors.\n#[derive(Debug)]\npub struct EnvConfigSource<'a> {\n    key: Cow<'a, str>,\n    location: Location<'a>,\n    scope: Scope<'a>,\n}\n\n#[allow(clippy::from_over_into)]\nimpl Into<Origin> for &EnvConfigSource<'_> {\n    fn into(self) -> Origin {\n        match (&self.scope, &self.location) {\n            (Scope::Global, Location::Environment) => Origin::shared_environment_variable(),\n            (Scope::Global, Location::Profile { .. }) => Origin::shared_profile_file(),\n            (Scope::Service { .. }, Location::Environment) => {\n                Origin::service_environment_variable()\n            }\n            (Scope::Service { .. }, Location::Profile { .. }) => Origin::service_profile_file(),\n        }\n    }\n}\n\nimpl<'a> EnvConfigSource<'a> {\n    pub(crate) fn global_from_env(key: Cow<'a, str>) -> Self {\n        Self {\n            key,\n            location: Location::Environment,\n            scope: Scope::Global,\n        }\n    }\n\n    pub(crate) fn global_from_profile(key: Cow<'a, str>, profile_name: Cow<'a, str>) -> Self {\n        Self {\n            key,\n            location: Location::Profile { name: profile_name },\n            scope: Scope::Global,\n        }\n    }\n\n    pub(crate) fn service_from_env(key: Cow<'a, str>, service_id: Cow<'a, str>) -> Self {\n        Self {\n            key,\n            location: Location::Environment,\n            scope: Scope::Service { service_id },\n        }\n    }\n\n    pub(crate) fn service_from_profile(\n        key: Cow<'a, str>,\n        profile_name: Cow<'a, str>,\n        service_id: Cow<'a, str>,\n    ) -> Self {\n        Self {\n            key,\n            location: Location::Profile { name: profile_name },\n            scope: Scope::Service { service_id },\n        }\n    }\n}\n\nimpl fmt::Display for EnvConfigSource<'_> {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        write!(f, \"{} {} key: `{}`\", self.scope, self.location, self.key)\n    }\n}\n\n/// An error occurred when resolving config from a user's environment.\n#[derive(Debug)]\npub struct EnvConfigError<E = Box<dyn Error>> {\n    property_source: String,\n    err: E,\n}\n\nimpl<E> EnvConfigError<E> {\n    /// Return a reference to the inner error wrapped by this error.\n    pub fn err(&self) -> &E {\n        &self.err\n    }\n}\n\nimpl<E: fmt::Display> fmt::Display for EnvConfigError<E> {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        write!(f, \"{}. source: {}\", self.err, self.property_source)\n    }\n}\n\nimpl<E: Error> Error for EnvConfigError<E> {\n    fn source(&self) -> Option<&(dyn Error + 'static)> {\n        self.err.source()\n    }\n}\n\n/// Environment config values are config values sourced from a user's environment variables or profile file.\n///\n/// `EnvConfigValue` will first look in the environment, then the AWS profile. They track the\n/// provenance of properties so that unified validation errors can be created.\n#[derive(Default, Debug)]\npub struct EnvConfigValue<'a> {\n    environment_variable: Option<Cow<'a, str>>,\n    profile_key: Option<Cow<'a, str>>,\n    service_id: Option<Cow<'a, str>>,\n}\n\nimpl<'a> EnvConfigValue<'a> {\n    /// Create a new `EnvConfigValue`\n    pub fn new() -> Self {\n        Self::default()\n    }\n\n    /// Set the environment variable to read\n    pub fn env(mut self, key: &'a str) -> Self {\n        self.environment_variable = Some(Cow::Borrowed(key));\n        self\n    }\n\n    /// Set the profile key to read\n    pub fn profile(mut self, key: &'a str) -> Self {\n        self.profile_key = Some(Cow::Borrowed(key));\n        self\n    }\n\n    /// Set the service id to check for service config\n    pub fn service_id(mut self, service_id: &'a str) -> Self {\n        self.service_id = Some(Cow::Borrowed(service_id));\n        self\n    }\n\n    /// Load the value from the env or profile files, validating with `validator`\n    pub fn validate<T, E: Error + Send + Sync + 'static>(\n        self,\n        env: &Env,\n        profiles: Option<&EnvConfigSections>,\n        validator: impl Fn(&str) -> Result<T, E>,\n    ) -> Result<Option<T>, EnvConfigError<E>> {\n        let value = self.load(env, profiles);\n        value\n            .map(|(v, ctx)| {\n                validator(v.as_ref()).map_err(|err| EnvConfigError {\n                    property_source: format!(\"{ctx}\"),\n                    err,\n                })\n            })\n            .transpose()\n    }\n\n    /// Load the value from the env or profile files, validating with `validator`\n    ///\n    /// This version of the function will also return the origin of the config.\n    pub fn validate_and_return_origin<T, E: Error + Send + Sync + 'static>(\n        self,\n        env: &Env,\n        profiles: Option<&EnvConfigSections>,\n        validator: impl Fn(&str) -> Result<T, E>,\n    ) -> Result<(Option<T>, Origin), EnvConfigError<E>> {\n        let value = self.load(env, profiles);\n        match value {\n            Some((v, ctx)) => {\n                let origin: Origin = (&ctx).into();\n                validator(v.as_ref())\n                    .map_err(|err| EnvConfigError {\n                        property_source: format!(\"{ctx}\"),\n                        err,\n                    })\n                    .map(|value| (Some(value), origin))\n            }\n            None => Ok((None, Origin::unknown())),\n        }\n    }\n\n    /// Load the value from the environment\n    pub fn load(\n        &self,\n        env: &'a Env,\n        profiles: Option<&'a EnvConfigSections>,\n    ) -> Option<(Cow<'a, str>, EnvConfigSource<'a>)> {\n        let env_value = self.environment_variable.as_ref().and_then(|env_var| {\n            // Check for a service-specific env var first\n            let service_config =\n                get_service_config_from_env(env, self.service_id.clone(), env_var.clone());\n            // Then check for a global env var\n            let global_config = env.get(env_var).ok().map(|value| {\n                (\n                    Cow::Owned(value),\n                    EnvConfigSource::global_from_env(env_var.clone()),\n                )\n            });\n\n            if let Some(v) = service_config {\n                tracing::trace!(\"(service env) {env_var} = {v:?}\");\n                Some(v)\n            } else if let Some(v) = global_config {\n                tracing::trace!(\"(global env) {env_var} = {v:?}\");\n                Some(v)\n            } else {\n                tracing::trace!(\"(env) no value set for {env_var}\");\n                None\n            }\n        });\n\n        let profile_value = match (profiles, self.profile_key.as_ref()) {\n            (Some(profiles), Some(profile_key)) => {\n                // Check for a service-specific profile key first\n                let service_config = get_service_config_from_profile(\n                    profiles,\n                    self.service_id.clone(),\n                    profile_key.clone(),\n                );\n                let global_config = profiles.get(profile_key.as_ref()).map(|value| {\n                    (\n                        Cow::Borrowed(value),\n                        EnvConfigSource::global_from_profile(\n                            profile_key.clone(),\n                            Cow::Owned(profiles.selected_profile().to_owned()),\n                        ),\n                    )\n                });\n\n                if let Some(v) = service_config {\n                    tracing::trace!(\"(service profile) {profile_key} = {v:?}\");\n                    Some(v)\n                } else if let Some(v) = global_config {\n                    tracing::trace!(\"(global profile) {profile_key} = {v:?}\");\n                    Some(v)\n                } else {\n                    tracing::trace!(\"(service profile) no value set for {profile_key}\");\n                    None\n                }\n            }\n            _ => None,\n        };\n\n        env_value.or(profile_value)\n    }\n}\n\nfn get_service_config_from_env<'a>(\n    env: &'a Env,\n    service_id: Option<Cow<'a, str>>,\n    env_var: Cow<'a, str>,\n) -> Option<(Cow<'a, str>, EnvConfigSource<'a>)> {\n    let service_id = service_id?;\n    let env_case_service_id = format_service_id_for_env(service_id.clone());\n    let service_specific_env_key = format!(\"{env_var}_{env_case_service_id}\");\n    let env_var = env.get(&service_specific_env_key).ok()?;\n    let env_var: Cow<'_, str> = Cow::Owned(env_var);\n    let source = EnvConfigSource::service_from_env(env_var.clone(), service_id);\n\n    Some((env_var, source))\n}\n\nconst SERVICES: &str = \"services\";\n\nfn get_service_config_from_profile<'a>(\n    profile: &EnvConfigSections,\n    service_id: Option<Cow<'a, str>>,\n    profile_key: Cow<'a, str>,\n) -> Option<(Cow<'a, str>, EnvConfigSource<'a>)> {\n    let service_id = service_id?.clone();\n    let profile_case_service_id = format_service_id_for_profile(service_id.clone());\n    let services_section_name = profile.get(SERVICES)?;\n    let properties_key = PropertiesKey::builder()\n        .section_key(SERVICES)\n        .section_name(services_section_name)\n        .property_name(profile_case_service_id)\n        .sub_property_name(profile_key.clone())\n        .build()\n        .ok()?;\n    let value = profile.other_sections().get(&properties_key)?;\n    let profile_name = Cow::Owned(profile.selected_profile().to_owned());\n    let source = EnvConfigSource::service_from_profile(profile_key, profile_name, service_id);\n\n    Some((Cow::Owned(value.to_owned()), source))\n}\n\nfn format_service_id_for_env(service_id: impl AsRef<str>) -> String {\n    service_id.as_ref().to_uppercase().replace(' ', \"_\")\n}\n\nfn format_service_id_for_profile(service_id: impl AsRef<str>) -> String {\n    service_id.as_ref().to_lowercase().replace(' ', \"-\")\n}\n\n#[cfg(test)]\nmod test {\n    use crate::env_config::property::{Properties, PropertiesKey};\n    use crate::env_config::section::EnvConfigSections;\n    use aws_types::os_shim_internal::Env;\n    use std::borrow::Cow;\n    use std::collections::HashMap;\n    use std::num::ParseIntError;\n\n    use super::EnvConfigValue;\n\n    fn validate_some_key(s: &str) -> Result<i32, ParseIntError> {\n        s.parse()\n    }\n\n    fn new_prop_key(\n        section_key: impl Into<String>,\n        section_name: impl Into<String>,\n        property_name: impl Into<String>,\n        sub_property_name: Option<impl Into<String>>,\n    ) -> PropertiesKey {\n        let mut builder = PropertiesKey::builder()\n            .section_key(section_key)\n            .section_name(section_name)\n            .property_name(property_name);\n\n        if let Some(sub_property_name) = sub_property_name {\n            builder = builder.sub_property_name(sub_property_name);\n        }\n\n        builder.build().unwrap()\n    }\n\n    #[tokio::test]\n    async fn test_service_config_multiple_services() {\n        let env = Env::from_slice(&[\n            (\"AWS_CONFIG_FILE\", \"config\"),\n            (\"AWS_SOME_KEY\", \"1\"),\n            (\"AWS_SOME_KEY_SERVICE\", \"2\"),\n            (\"AWS_SOME_KEY_ANOTHER_SERVICE\", \"3\"),\n        ]);\n        let profiles = EnvConfigSections::new(\n            HashMap::from([(\n                \"default\".to_owned(),\n                HashMap::from([\n                    (\"some_key\".to_owned(), \"4\".to_owned()),\n                    (\"services\".to_owned(), \"dev\".to_owned()),\n                ]),\n            )]),\n            Cow::Borrowed(\"default\"),\n            HashMap::new(),\n            Properties::new_from_slice(&[\n                (\n                    new_prop_key(\"services\", \"dev\", \"service\", Some(\"some_key\")),\n                    \"5\".to_string(),\n                ),\n                (\n                    new_prop_key(\"services\", \"dev\", \"another_service\", Some(\"some_key\")),\n                    \"6\".to_string(),\n                ),\n            ]),\n        );\n        let profiles = Some(&profiles);\n        let global_from_env = EnvConfigValue::new()\n            .env(\"AWS_SOME_KEY\")\n            .profile(\"some_key\")\n            .validate(&env, profiles, validate_some_key)\n            .expect(\"config resolution succeeds\");\n        assert_eq!(Some(1), global_from_env);\n\n        let service_from_env = EnvConfigValue::new()\n            .env(\"AWS_SOME_KEY\")\n            .profile(\"some_key\")\n            .service_id(\"service\")\n            .validate(&env, profiles, validate_some_key)\n            .expect(\"config resolution succeeds\");\n        assert_eq!(Some(2), service_from_env);\n\n        let other_service_from_env = EnvConfigValue::new()\n            .env(\"AWS_SOME_KEY\")\n            .profile(\"some_key\")\n            .service_id(\"another_service\")\n            .validate(&env, profiles, validate_some_key)\n            .expect(\"config resolution succeeds\");\n        assert_eq!(Some(3), other_service_from_env);\n\n        let global_from_profile = EnvConfigValue::new()\n            .profile(\"some_key\")\n            .validate(&env, profiles, validate_some_key)\n            .expect(\"config resolution succeeds\");\n        assert_eq!(Some(4), global_from_profile);\n\n        let service_from_profile = EnvConfigValue::new()\n            .profile(\"some_key\")\n            .service_id(\"service\")\n            .validate(&env, profiles, validate_some_key)\n            .expect(\"config resolution succeeds\");\n        assert_eq!(Some(5), service_from_profile);\n\n        let service_from_profile = EnvConfigValue::new()\n            .profile(\"some_key\")\n            .service_id(\"another_service\")\n            .validate(&env, profiles, validate_some_key)\n            .expect(\"config resolution succeeds\");\n        assert_eq!(Some(6), service_from_profile);\n    }\n\n    #[tokio::test]\n    async fn test_service_config_precedence() {\n        let env = Env::from_slice(&[\n            (\"AWS_CONFIG_FILE\", \"config\"),\n            (\"AWS_SOME_KEY\", \"1\"),\n            (\"AWS_SOME_KEY_S3\", \"2\"),\n        ]);\n\n        let profiles = EnvConfigSections::new(\n            HashMap::from([(\n                \"default\".to_owned(),\n                HashMap::from([\n                    (\"some_key\".to_owned(), \"3\".to_owned()),\n                    (\"services\".to_owned(), \"dev\".to_owned()),\n                ]),\n            )]),\n            Cow::Borrowed(\"default\"),\n            HashMap::new(),\n            Properties::new_from_slice(&[(\n                new_prop_key(\"services\", \"dev\", \"s3\", Some(\"some_key\")),\n                \"4\".to_string(),\n            )]),\n        );\n        let profiles = Some(&profiles);\n        let global_from_env = EnvConfigValue::new()\n            .env(\"AWS_SOME_KEY\")\n            .profile(\"some_key\")\n            .validate(&env, profiles, validate_some_key)\n            .expect(\"config resolution succeeds\");\n        assert_eq!(Some(1), global_from_env);\n\n        let service_from_env = EnvConfigValue::new()\n            .env(\"AWS_SOME_KEY\")\n            .profile(\"some_key\")\n            .service_id(\"s3\")\n            .validate(&env, profiles, validate_some_key)\n            .expect(\"config resolution succeeds\");\n        assert_eq!(Some(2), service_from_env);\n\n        let global_from_profile = EnvConfigValue::new()\n            .profile(\"some_key\")\n            .validate(&env, profiles, validate_some_key)\n            .expect(\"config resolution succeeds\");\n        assert_eq!(Some(3), global_from_profile);\n\n        let service_from_profile = EnvConfigValue::new()\n            .profile(\"some_key\")\n            .service_id(\"s3\")\n            .validate(&env, profiles, validate_some_key)\n            .expect(\"config resolution succeeds\");\n        assert_eq!(Some(4), service_from_profile);\n    }\n\n    #[tokio::test]\n    async fn test_multiple_services() {\n        let env = Env::from_slice(&[\n            (\"AWS_CONFIG_FILE\", \"config\"),\n            (\"AWS_SOME_KEY\", \"1\"),\n            (\"AWS_SOME_KEY_S3\", \"2\"),\n            (\"AWS_SOME_KEY_EC2\", \"3\"),\n        ]);\n\n        let profiles = EnvConfigSections::new(\n            HashMap::from([(\n                \"default\".to_owned(),\n                HashMap::from([\n                    (\"some_key\".to_owned(), \"4\".to_owned()),\n                    (\"services\".to_owned(), \"dev\".to_owned()),\n                ]),\n            )]),\n            Cow::Borrowed(\"default\"),\n            HashMap::new(),\n            Properties::new_from_slice(&[\n                (\n                    new_prop_key(\"services\", \"dev-wrong\", \"s3\", Some(\"some_key\")),\n                    \"998\".into(),\n                ),\n                (\n                    new_prop_key(\"services\", \"dev-wrong\", \"ec2\", Some(\"some_key\")),\n                    \"999\".into(),\n                ),\n                (\n                    new_prop_key(\"services\", \"dev\", \"s3\", Some(\"some_key\")),\n                    \"5\".into(),\n                ),\n                (\n                    new_prop_key(\"services\", \"dev\", \"ec2\", Some(\"some_key\")),\n                    \"6\".into(),\n                ),\n            ]),\n        );\n        let profiles = Some(&profiles);\n        let global_from_env = EnvConfigValue::new()\n            .env(\"AWS_SOME_KEY\")\n            .profile(\"some_key\")\n            .validate(&env, profiles, validate_some_key)\n            .expect(\"config resolution succeeds\");\n        assert_eq!(Some(1), global_from_env);\n\n        let service_from_env = EnvConfigValue::new()\n            .env(\"AWS_SOME_KEY\")\n            .profile(\"some_key\")\n            .service_id(\"s3\")\n            .validate(&env, profiles, validate_some_key)\n            .expect(\"config resolution succeeds\");\n        assert_eq!(Some(2), service_from_env);\n\n        let service_from_env = EnvConfigValue::new()\n            .env(\"AWS_SOME_KEY\")\n            .profile(\"some_key\")\n            .service_id(\"ec2\")\n            .validate(&env, profiles, validate_some_key)\n            .expect(\"config resolution succeeds\");\n        assert_eq!(Some(3), service_from_env);\n\n        let global_from_profile = EnvConfigValue::new()\n            .profile(\"some_key\")\n            .validate(&env, profiles, validate_some_key)\n            .expect(\"config resolution succeeds\");\n        assert_eq!(Some(4), global_from_profile);\n\n        let service_from_profile = EnvConfigValue::new()\n            .profile(\"some_key\")\n            .service_id(\"s3\")\n            .validate(&env, profiles, validate_some_key)\n            .expect(\"config resolution succeeds\");\n        assert_eq!(Some(5), service_from_profile);\n\n        let service_from_profile = EnvConfigValue::new()\n            .profile(\"some_key\")\n            .service_id(\"ec2\")\n            .validate(&env, profiles, validate_some_key)\n            .expect(\"config resolution succeeds\");\n        assert_eq!(Some(6), service_from_profile);\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-runtime/src/fs_util.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_types::os_shim_internal;\n\n/// An operating system, like Windows or Linux\n#[derive(Debug, Copy, Clone, Eq, PartialEq)]\n#[non_exhaustive]\npub enum Os {\n    /// A Windows-based operating system\n    Windows,\n    /// Any Unix-based operating system\n    Unix,\n}\n\nimpl Os {\n    /// Returns the current operating system\n    pub fn real() -> Self {\n        match std::env::consts::OS {\n            \"windows\" => Os::Windows,\n            _ => Os::Unix,\n        }\n    }\n}\n\n/// Resolve a home directory given a set of environment variables\npub fn home_dir(env_var: &os_shim_internal::Env, os: Os) -> Option<String> {\n    if let Ok(home) = env_var.get(\"HOME\") {\n        tracing::debug!(src = \"HOME\", \"loaded home directory\");\n        return Some(home);\n    }\n\n    if os == Os::Windows {\n        if let Ok(home) = env_var.get(\"USERPROFILE\") {\n            tracing::debug!(src = \"USERPROFILE\", \"loaded home directory\");\n            return Some(home);\n        }\n\n        let home_drive = env_var.get(\"HOMEDRIVE\");\n        let home_path = env_var.get(\"HOMEPATH\");\n        tracing::debug!(src = \"HOMEDRIVE/HOMEPATH\", \"loaded home directory\");\n        if let (Ok(mut drive), Ok(path)) = (home_drive, home_path) {\n            drive.push_str(&path);\n            return Some(drive);\n        }\n    }\n    None\n}\n\n#[cfg(test)]\nmod test {\n    use super::{home_dir, Os};\n    use aws_types::os_shim_internal::Env;\n\n    #[test]\n    fn homedir_profile_only_windows() {\n        // windows specific variables should only be considered when the platform is windows\n        let env = Env::from_slice(&[(\"USERPROFILE\", \"C:\\\\Users\\\\name\")]);\n        assert_eq!(\n            home_dir(&env, Os::Windows),\n            Some(\"C:\\\\Users\\\\name\".to_string())\n        );\n        assert_eq!(home_dir(&env, Os::Unix), None);\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-runtime/src/invocation_id.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::fmt::Debug;\nuse std::sync::{Arc, Mutex};\n\nuse fastrand::Rng;\nuse http_1x::{HeaderName, HeaderValue};\n\nuse aws_smithy_runtime_api::box_error::BoxError;\nuse aws_smithy_runtime_api::client::interceptors::context::BeforeTransmitInterceptorContextMut;\nuse aws_smithy_runtime_api::client::interceptors::{dyn_dispatch_hint, Intercept};\nuse aws_smithy_runtime_api::client::runtime_components::RuntimeComponents;\nuse aws_smithy_types::config_bag::{ConfigBag, Storable, StoreReplace};\n#[cfg(feature = \"test-util\")]\npub use test_util::{NoInvocationIdGenerator, PredefinedInvocationIdGenerator};\n\n#[allow(clippy::declare_interior_mutable_const)] // we will never mutate this\nconst AMZ_SDK_INVOCATION_ID: HeaderName = HeaderName::from_static(\"amz-sdk-invocation-id\");\n\n/// A generator for returning new invocation IDs on demand.\npub trait InvocationIdGenerator: Debug + Send + Sync {\n    /// Call this function to receive a new [`InvocationId`] or an error explaining why one couldn't\n    /// be provided.\n    fn generate(&self) -> Result<Option<InvocationId>, BoxError>;\n}\n\n/// Dynamic dispatch implementation of [`InvocationIdGenerator`]\n#[derive(Clone, Debug)]\npub struct SharedInvocationIdGenerator(Arc<dyn InvocationIdGenerator>);\n\nimpl SharedInvocationIdGenerator {\n    /// Creates a new [`SharedInvocationIdGenerator`].\n    pub fn new(gen: impl InvocationIdGenerator + 'static) -> Self {\n        Self(Arc::new(gen))\n    }\n}\n\nimpl InvocationIdGenerator for SharedInvocationIdGenerator {\n    fn generate(&self) -> Result<Option<InvocationId>, BoxError> {\n        self.0.generate()\n    }\n}\n\nimpl Storable for SharedInvocationIdGenerator {\n    type Storer = StoreReplace<Self>;\n}\n\n/// An invocation ID generator that uses random UUIDs for the invocation ID.\n#[derive(Debug, Default)]\npub struct DefaultInvocationIdGenerator {\n    rng: Mutex<Rng>,\n}\n\nimpl DefaultInvocationIdGenerator {\n    /// Creates a new [`DefaultInvocationIdGenerator`].\n    pub fn new() -> Self {\n        Default::default()\n    }\n\n    /// Creates a [`DefaultInvocationIdGenerator`] with the given seed.\n    pub fn with_seed(seed: u64) -> Self {\n        Self {\n            rng: Mutex::new(Rng::with_seed(seed)),\n        }\n    }\n}\n\nimpl InvocationIdGenerator for DefaultInvocationIdGenerator {\n    fn generate(&self) -> Result<Option<InvocationId>, BoxError> {\n        let mut rng = self.rng.lock().unwrap();\n        let mut random_bytes = [0u8; 16];\n        rng.fill(&mut random_bytes);\n\n        let id = uuid::Builder::from_random_bytes(random_bytes).into_uuid();\n        Ok(Some(InvocationId::new(id.to_string())))\n    }\n}\n\n/// This interceptor generates a UUID and attaches it to all request attempts made as part of this operation.\n#[non_exhaustive]\n#[derive(Debug, Default)]\npub struct InvocationIdInterceptor {\n    default: DefaultInvocationIdGenerator,\n}\n\nimpl InvocationIdInterceptor {\n    /// Creates a new `InvocationIdInterceptor`\n    pub fn new() -> Self {\n        Self::default()\n    }\n}\n\n#[dyn_dispatch_hint]\nimpl Intercept for InvocationIdInterceptor {\n    fn name(&self) -> &'static str {\n        \"InvocationIdInterceptor\"\n    }\n\n    fn modify_before_retry_loop(\n        &self,\n        _ctx: &mut BeforeTransmitInterceptorContextMut<'_>,\n        _runtime_components: &RuntimeComponents,\n        cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        let gen = cfg\n            .load::<SharedInvocationIdGenerator>()\n            .map(|gen| gen as &dyn InvocationIdGenerator)\n            .unwrap_or(&self.default);\n        if let Some(id) = gen.generate()? {\n            cfg.interceptor_state().store_put::<InvocationId>(id);\n        }\n\n        Ok(())\n    }\n\n    fn modify_before_transmit(\n        &self,\n        ctx: &mut BeforeTransmitInterceptorContextMut<'_>,\n        _runtime_components: &RuntimeComponents,\n        cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        let headers = ctx.request_mut().headers_mut();\n        if let Some(id) = cfg.load::<InvocationId>() {\n            headers.append(AMZ_SDK_INVOCATION_ID, id.0.clone());\n        }\n        Ok(())\n    }\n}\n\n/// InvocationId provides a consistent ID across retries\n#[derive(Debug, Clone, PartialEq, Eq)]\npub struct InvocationId(HeaderValue);\n\nimpl InvocationId {\n    /// Create an invocation ID with the given value.\n    ///\n    /// # Panics\n    /// This constructor will panic if the given invocation ID is not a valid HTTP header value.\n    pub fn new(invocation_id: String) -> Self {\n        Self(\n            HeaderValue::try_from(invocation_id)\n                .expect(\"invocation ID must be a valid HTTP header value\"),\n        )\n    }\n}\n\nimpl Storable for InvocationId {\n    type Storer = StoreReplace<Self>;\n}\n\n#[cfg(feature = \"test-util\")]\nmod test_util {\n    use super::*;\n\n    impl InvocationId {\n        /// Create a new invocation ID from a `&'static str`.\n        pub fn new_from_str(uuid: &'static str) -> Self {\n            InvocationId(HeaderValue::from_static(uuid))\n        }\n    }\n\n    /// A \"generator\" that returns [`InvocationId`]s from a predefined list.\n    #[derive(Debug)]\n    pub struct PredefinedInvocationIdGenerator {\n        pre_generated_ids: Arc<Mutex<Vec<InvocationId>>>,\n    }\n\n    impl PredefinedInvocationIdGenerator {\n        /// Given a `Vec<InvocationId>`, create a new [`PredefinedInvocationIdGenerator`].\n        pub fn new(mut invocation_ids: Vec<InvocationId>) -> Self {\n            // We're going to pop ids off of the end of the list, so we need to reverse the list or else\n            // we'll be popping the ids in reverse order, confusing the poor test writer.\n            invocation_ids.reverse();\n\n            Self {\n                pre_generated_ids: Arc::new(Mutex::new(invocation_ids)),\n            }\n        }\n    }\n\n    impl InvocationIdGenerator for PredefinedInvocationIdGenerator {\n        fn generate(&self) -> Result<Option<InvocationId>, BoxError> {\n            Ok(Some(\n                self.pre_generated_ids\n                    .lock()\n                    .expect(\"this will never be under contention\")\n                    .pop()\n                    .expect(\"testers will provide enough invocation IDs\"),\n            ))\n        }\n    }\n\n    /// A \"generator\" that always returns `None`.\n    #[derive(Debug, Default)]\n    pub struct NoInvocationIdGenerator;\n\n    impl NoInvocationIdGenerator {\n        /// Create a new [`NoInvocationIdGenerator`].\n        pub fn new() -> Self {\n            Self\n        }\n    }\n\n    impl InvocationIdGenerator for NoInvocationIdGenerator {\n        fn generate(&self) -> Result<Option<InvocationId>, BoxError> {\n            Ok(None)\n        }\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use aws_smithy_runtime_api::client::interceptors::context::{\n        BeforeTransmitInterceptorContextMut, Input, InterceptorContext,\n    };\n    use aws_smithy_runtime_api::client::interceptors::Intercept;\n    use aws_smithy_runtime_api::client::orchestrator::HttpRequest;\n    use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder;\n    use aws_smithy_types::config_bag::ConfigBag;\n\n    use super::*;\n\n    fn expect_header<'a>(\n        context: &'a BeforeTransmitInterceptorContextMut<'_>,\n        header_name: &str,\n    ) -> &'a str {\n        context.request().headers().get(header_name).unwrap()\n    }\n\n    #[test]\n    fn default_id_generator() {\n        let rc = RuntimeComponentsBuilder::for_tests().build().unwrap();\n        let mut ctx = InterceptorContext::new(Input::doesnt_matter());\n        ctx.enter_serialization_phase();\n        ctx.set_request(HttpRequest::empty());\n        let _ = ctx.take_input();\n        ctx.enter_before_transmit_phase();\n\n        let mut cfg = ConfigBag::base();\n        let interceptor = InvocationIdInterceptor::new();\n        let mut ctx = Into::into(&mut ctx);\n        interceptor\n            .modify_before_retry_loop(&mut ctx, &rc, &mut cfg)\n            .unwrap();\n        interceptor\n            .modify_before_transmit(&mut ctx, &rc, &mut cfg)\n            .unwrap();\n\n        let expected = cfg.load::<InvocationId>().expect(\"invocation ID was set\");\n        let header = expect_header(&ctx, \"amz-sdk-invocation-id\");\n        assert_eq!(expected.0, header, \"the invocation ID in the config bag must match the invocation ID in the request header\");\n        // UUID should include 32 chars and 4 dashes\n        assert_eq!(header.len(), 36);\n    }\n\n    #[cfg(feature = \"test-util\")]\n    #[test]\n    fn custom_id_generator() {\n        use aws_smithy_types::config_bag::Layer;\n        let rc = RuntimeComponentsBuilder::for_tests().build().unwrap();\n        let mut ctx = InterceptorContext::new(Input::doesnt_matter());\n        ctx.enter_serialization_phase();\n        ctx.set_request(HttpRequest::empty());\n        let _ = ctx.take_input();\n        ctx.enter_before_transmit_phase();\n\n        let mut cfg = ConfigBag::base();\n        let mut layer = Layer::new(\"test\");\n        layer.store_put(SharedInvocationIdGenerator::new(\n            PredefinedInvocationIdGenerator::new(vec![InvocationId::new(\n                \"the-best-invocation-id\".into(),\n            )]),\n        ));\n        cfg.push_layer(layer);\n\n        let interceptor = InvocationIdInterceptor::new();\n        let mut ctx = Into::into(&mut ctx);\n        interceptor\n            .modify_before_retry_loop(&mut ctx, &rc, &mut cfg)\n            .unwrap();\n        interceptor\n            .modify_before_transmit(&mut ctx, &rc, &mut cfg)\n            .unwrap();\n\n        let header = expect_header(&ctx, \"amz-sdk-invocation-id\");\n        assert_eq!(\"the-best-invocation-id\", header);\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-runtime/src/lib.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/* Automatically managed default lints */\n#![cfg_attr(docsrs, feature(doc_cfg))]\n/* End of automatically managed default lints */\n//! Runtime support code for the AWS SDK. This crate isn't intended to be used directly.\n\n#![warn(\n    missing_docs,\n    rustdoc::missing_crate_level_docs,\n    missing_debug_implementations,\n    rust_2018_idioms,\n    unreachable_pub\n)]\n\n/// Supporting code for authentication in the AWS SDK.\npub mod auth;\n\n/// AWS-specific content-encoding tools for http-02x and http-1x\npub mod content_encoding;\n\n/// Supporting code for recursion detection in the AWS SDK.\npub mod recursion_detection;\n\n/// Supporting code for user agent headers in the AWS SDK.\npub mod user_agent;\n\n/// Supporting code for retry behavior specific to the AWS SDK.\npub mod retries;\n\n/// Supporting code for invocation ID headers in the AWS SDK.\npub mod invocation_id;\n\n/// Supporting code for request metadata headers in the AWS SDK.\npub mod request_info;\n\n/// AWS SDK feature identifies.\n#[doc(hidden)]\npub mod sdk_feature;\n\n/// Interceptor that determines the clock skew between the client and service.\npub mod service_clock_skew;\n\n/// Filesystem utilities\npub mod fs_util;\n\n/// Supporting code for parsing AWS config values set in a user's environment or\n/// in a shared config file.\npub mod env_config;\n"
  },
  {
    "path": "aws/rust-runtime/aws-runtime/src/recursion_detection.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_smithy_runtime_api::box_error::BoxError;\nuse aws_smithy_runtime_api::client::interceptors::context::BeforeTransmitInterceptorContextMut;\nuse aws_smithy_runtime_api::client::interceptors::{dyn_dispatch_hint, Intercept};\nuse aws_smithy_runtime_api::client::runtime_components::RuntimeComponents;\nuse aws_smithy_types::config_bag::ConfigBag;\nuse aws_types::os_shim_internal::Env;\nuse http_1x::HeaderValue;\nuse percent_encoding::{percent_encode, CONTROLS};\nuse std::borrow::Cow;\n\nconst TRACE_ID_HEADER: &str = \"x-amzn-trace-id\";\n\nmod env {\n    pub(super) const LAMBDA_FUNCTION_NAME: &str = \"AWS_LAMBDA_FUNCTION_NAME\";\n    pub(super) const TRACE_ID: &str = \"_X_AMZN_TRACE_ID\";\n}\n\n/// Recursion Detection Interceptor\n///\n/// This interceptor inspects the value of the `AWS_LAMBDA_FUNCTION_NAME` and `_X_AMZN_TRACE_ID` environment\n/// variables to detect if the request is being invoked in a Lambda function. If it is, the `X-Amzn-Trace-Id` header\n/// will be set. This enables downstream services to prevent accidentally infinitely recursive invocations spawned\n/// from Lambda.\n#[non_exhaustive]\n#[derive(Debug, Default)]\npub struct RecursionDetectionInterceptor {\n    env: Env,\n}\n\nimpl RecursionDetectionInterceptor {\n    /// Creates a new `RecursionDetectionInterceptor`\n    pub fn new() -> Self {\n        Self::default()\n    }\n}\n\n#[dyn_dispatch_hint]\nimpl Intercept for RecursionDetectionInterceptor {\n    fn name(&self) -> &'static str {\n        \"RecursionDetectionInterceptor\"\n    }\n\n    fn modify_before_signing(\n        &self,\n        context: &mut BeforeTransmitInterceptorContextMut<'_>,\n        _runtime_components: &RuntimeComponents,\n        _cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        let request = context.request_mut();\n        if request.headers().contains_key(TRACE_ID_HEADER) {\n            return Ok(());\n        }\n\n        if let (Ok(_function_name), Ok(trace_id)) = (\n            self.env.get(env::LAMBDA_FUNCTION_NAME),\n            self.env.get(env::TRACE_ID),\n        ) {\n            request\n                .headers_mut()\n                .insert(TRACE_ID_HEADER, encode_header(trace_id.as_bytes()));\n        }\n        Ok(())\n    }\n}\n\n/// Encodes a byte slice as a header.\n///\n/// ASCII control characters are percent encoded which ensures that all byte sequences are valid headers\nfn encode_header(value: &[u8]) -> HeaderValue {\n    let value: Cow<'_, str> = percent_encode(value, CONTROLS).into();\n    HeaderValue::from_bytes(value.as_bytes()).expect(\"header is encoded, header must be valid\")\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use aws_smithy_protocol_test::{assert_ok, validate_headers};\n    use aws_smithy_runtime_api::client::interceptors::context::{Input, InterceptorContext};\n    use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder;\n    use aws_smithy_types::body::SdkBody;\n    use aws_types::os_shim_internal::Env;\n    use http_1x::HeaderValue;\n    use proptest::{prelude::*, proptest};\n    use serde::Deserialize;\n    use std::collections::HashMap;\n\n    proptest! {\n        #[test]\n        fn header_encoding_never_panics(s in any::<Vec<u8>>()) {\n            encode_header(&s);\n        }\n    }\n\n    #[test]\n    fn every_char() {\n        let buff = (0..=255).collect::<Vec<u8>>();\n        assert_eq!(\n            encode_header(&buff),\n            HeaderValue::from_static(\n                r##\"%00%01%02%03%04%05%06%07%08%09%0A%0B%0C%0D%0E%0F%10%11%12%13%14%15%16%17%18%19%1A%1B%1C%1D%1E%1F !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~%7F%80%81%82%83%84%85%86%87%88%89%8A%8B%8C%8D%8E%8F%90%91%92%93%94%95%96%97%98%99%9A%9B%9C%9D%9E%9F%A0%A1%A2%A3%A4%A5%A6%A7%A8%A9%AA%AB%AC%AD%AE%AF%B0%B1%B2%B3%B4%B5%B6%B7%B8%B9%BA%BB%BC%BD%BE%BF%C0%C1%C2%C3%C4%C5%C6%C7%C8%C9%CA%CB%CC%CD%CE%CF%D0%D1%D2%D3%D4%D5%D6%D7%D8%D9%DA%DB%DC%DD%DE%DF%E0%E1%E2%E3%E4%E5%E6%E7%E8%E9%EA%EB%EC%ED%EE%EF%F0%F1%F2%F3%F4%F5%F6%F7%F8%F9%FA%FB%FC%FD%FE%FF\"##\n            )\n        );\n    }\n\n    #[test]\n    fn run_tests() {\n        let test_cases: Vec<TestCase> =\n            serde_json::from_str(include_str!(\"../test-data/recursion-detection.json\"))\n                .expect(\"invalid test case\");\n        for test_case in test_cases {\n            check(test_case)\n        }\n    }\n\n    #[derive(Deserialize)]\n    #[serde(rename_all = \"camelCase\")]\n    struct TestCase {\n        env: HashMap<String, String>,\n        request_headers_before: Vec<String>,\n        request_headers_after: Vec<String>,\n    }\n\n    impl TestCase {\n        fn env(&self) -> Env {\n            Env::from(self.env.clone())\n        }\n\n        /// Headers on the input request\n        fn request_headers_before(&self) -> impl Iterator<Item = (&str, &str)> {\n            Self::split_headers(&self.request_headers_before)\n        }\n\n        /// Headers on the output request\n        fn request_headers_after(&self) -> impl Iterator<Item = (&str, &str)> {\n            Self::split_headers(&self.request_headers_after)\n        }\n\n        /// Split text headers on `: `\n        fn split_headers(headers: &[String]) -> impl Iterator<Item = (&str, &str)> {\n            headers\n                .iter()\n                .map(|header| header.split_once(\": \").expect(\"header must contain :\"))\n        }\n    }\n\n    fn check(test_case: TestCase) {\n        let rc = RuntimeComponentsBuilder::for_tests().build().unwrap();\n        let env = test_case.env();\n        let mut request = http_1x::Request::builder();\n        for (name, value) in test_case.request_headers_before() {\n            request = request.header(name, value);\n        }\n        let request = request\n            .body(SdkBody::empty())\n            .expect(\"must be valid\")\n            .try_into()\n            .unwrap();\n        let mut context = InterceptorContext::new(Input::doesnt_matter());\n        context.enter_serialization_phase();\n        context.set_request(request);\n        let _ = context.take_input();\n        context.enter_before_transmit_phase();\n        let mut config = ConfigBag::base();\n\n        let mut ctx = Into::into(&mut context);\n        RecursionDetectionInterceptor { env }\n            .modify_before_signing(&mut ctx, &rc, &mut config)\n            .expect(\"interceptor must succeed\");\n        let mutated_request = context.request().expect(\"request is set\");\n        for (name, _) in mutated_request.headers() {\n            assert_eq!(\n                mutated_request.headers().get_all(name).count(),\n                1,\n                \"No duplicated headers\"\n            )\n        }\n        assert_ok(validate_headers(\n            mutated_request.headers(),\n            test_case.request_headers_after(),\n        ))\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-runtime/src/request_info.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::service_clock_skew::ServiceClockSkew;\nuse aws_smithy_async::time::TimeSource;\nuse aws_smithy_runtime_api::box_error::BoxError;\nuse aws_smithy_runtime_api::client::interceptors::context::BeforeTransmitInterceptorContextMut;\nuse aws_smithy_runtime_api::client::interceptors::{dyn_dispatch_hint, Intercept};\nuse aws_smithy_runtime_api::client::retries::RequestAttempts;\nuse aws_smithy_runtime_api::client::runtime_components::RuntimeComponents;\nuse aws_smithy_types::config_bag::ConfigBag;\nuse aws_smithy_types::date_time::Format;\nuse aws_smithy_types::retry::RetryConfig;\nuse aws_smithy_types::timeout::TimeoutConfig;\nuse aws_smithy_types::DateTime;\nuse http_1x::{HeaderName, HeaderValue};\nuse std::borrow::Cow;\nuse std::time::Duration;\n\n#[allow(clippy::declare_interior_mutable_const)] // we will never mutate this\nconst AMZ_SDK_REQUEST: HeaderName = HeaderName::from_static(\"amz-sdk-request\");\n\n/// Generates and attaches a request header that communicates request-related metadata.\n/// Examples include:\n///\n/// - When the client will time out this request.\n/// - How many times the request has been retried.\n/// - The maximum number of retries that the client will attempt.\n#[non_exhaustive]\n#[derive(Debug, Default)]\npub struct RequestInfoInterceptor {}\n\nimpl RequestInfoInterceptor {\n    /// Creates a new `RequestInfoInterceptor`\n    pub fn new() -> Self {\n        RequestInfoInterceptor {}\n    }\n}\n\nimpl RequestInfoInterceptor {\n    fn build_attempts_pair(\n        &self,\n        cfg: &ConfigBag,\n    ) -> Option<(Cow<'static, str>, Cow<'static, str>)> {\n        let request_attempts = cfg\n            .load::<RequestAttempts>()\n            .map(|r_a| r_a.attempts())\n            .unwrap_or(0);\n        let request_attempts = request_attempts.to_string();\n        Some((Cow::Borrowed(\"attempt\"), Cow::Owned(request_attempts)))\n    }\n\n    fn build_max_attempts_pair(\n        &self,\n        cfg: &ConfigBag,\n    ) -> Option<(Cow<'static, str>, Cow<'static, str>)> {\n        if let Some(retry_config) = cfg.load::<RetryConfig>() {\n            let max_attempts = retry_config.max_attempts().to_string();\n            Some((Cow::Borrowed(\"max\"), Cow::Owned(max_attempts)))\n        } else {\n            None\n        }\n    }\n\n    fn build_ttl_pair(\n        &self,\n        cfg: &ConfigBag,\n        timesource: impl TimeSource,\n    ) -> Option<(Cow<'static, str>, Cow<'static, str>)> {\n        let timeout_config = cfg.load::<TimeoutConfig>()?;\n        let socket_read = timeout_config.read_timeout()?;\n        let estimated_skew: Duration = cfg.load::<ServiceClockSkew>().cloned()?.into();\n        let current_time = timesource.now();\n        let ttl = current_time.checked_add(socket_read + estimated_skew)?;\n        let mut timestamp = DateTime::from(ttl);\n        // Set subsec_nanos to 0 so that the formatted `DateTime` won't have fractional seconds.\n        timestamp.set_subsec_nanos(0);\n        let mut formatted_timestamp = timestamp\n            .fmt(Format::DateTime)\n            .expect(\"the resulting DateTime will always be valid\");\n\n        // Remove dashes and colons\n        formatted_timestamp = formatted_timestamp\n            .chars()\n            .filter(|&c| c != '-' && c != ':')\n            .collect();\n\n        Some((Cow::Borrowed(\"ttl\"), Cow::Owned(formatted_timestamp)))\n    }\n}\n\n#[dyn_dispatch_hint]\nimpl Intercept for RequestInfoInterceptor {\n    fn name(&self) -> &'static str {\n        \"RequestInfoInterceptor\"\n    }\n\n    fn modify_before_transmit(\n        &self,\n        context: &mut BeforeTransmitInterceptorContextMut<'_>,\n        runtime_components: &RuntimeComponents,\n        cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        let mut pairs = RequestPairs::new();\n        if let Some(pair) = self.build_ttl_pair(\n            cfg,\n            runtime_components\n                .time_source()\n                .ok_or(\"A timesource must be provided\")?,\n        ) {\n            pairs = pairs.with_pair(pair);\n        }\n        if let Some(pair) = self.build_attempts_pair(cfg) {\n            pairs = pairs.with_pair(pair);\n        }\n        if let Some(pair) = self.build_max_attempts_pair(cfg) {\n            pairs = pairs.with_pair(pair);\n        }\n\n        let headers = context.request_mut().headers_mut();\n        headers.insert(AMZ_SDK_REQUEST, pairs.try_into_header_value()?);\n\n        Ok(())\n    }\n}\n\n/// A builder for creating a `RequestPairs` header value. `RequestPairs` is used to generate a\n/// retry information header that is sent with every request. The information conveyed by this\n/// header allows services to anticipate whether a client will time out or retry a request.\n#[derive(Default, Debug)]\nstruct RequestPairs {\n    inner: Vec<(Cow<'static, str>, Cow<'static, str>)>,\n}\n\nimpl RequestPairs {\n    /// Creates a new `RequestPairs` builder.\n    fn new() -> Self {\n        Default::default()\n    }\n\n    /// Adds a pair to the `RequestPairs` builder.\n    /// Only strings that can be converted to header values are considered valid.\n    fn with_pair(\n        mut self,\n        pair: (impl Into<Cow<'static, str>>, impl Into<Cow<'static, str>>),\n    ) -> Self {\n        let pair = (pair.0.into(), pair.1.into());\n        self.inner.push(pair);\n        self\n    }\n\n    /// Converts the `RequestPairs` builder into a `HeaderValue`.\n    fn try_into_header_value(self) -> Result<HeaderValue, BoxError> {\n        self.try_into()\n    }\n}\n\nimpl TryFrom<RequestPairs> for HeaderValue {\n    type Error = BoxError;\n\n    fn try_from(value: RequestPairs) -> Result<Self, BoxError> {\n        let mut pairs = String::new();\n        for (key, value) in value.inner {\n            if !pairs.is_empty() {\n                pairs.push_str(\"; \");\n            }\n\n            pairs.push_str(&key);\n            pairs.push('=');\n            pairs.push_str(&value);\n            continue;\n        }\n        HeaderValue::from_str(&pairs).map_err(Into::into)\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::RequestInfoInterceptor;\n    use crate::request_info::RequestPairs;\n    use aws_smithy_runtime_api::client::interceptors::context::Input;\n    use aws_smithy_runtime_api::client::interceptors::context::InterceptorContext;\n    use aws_smithy_runtime_api::client::interceptors::Intercept;\n    use aws_smithy_runtime_api::client::orchestrator::HttpRequest;\n    use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder;\n    use aws_smithy_types::config_bag::{ConfigBag, Layer};\n    use aws_smithy_types::retry::RetryConfig;\n    use aws_smithy_types::timeout::TimeoutConfig;\n\n    use http_1x::HeaderValue;\n    use std::time::Duration;\n\n    fn expect_header<'a>(context: &'a InterceptorContext, header_name: &str) -> &'a str {\n        context\n            .request()\n            .expect(\"request is set\")\n            .headers()\n            .get(header_name)\n            .unwrap()\n    }\n\n    #[test]\n    fn test_request_pairs_for_initial_attempt() {\n        let rc = RuntimeComponentsBuilder::for_tests().build().unwrap();\n        let mut context = InterceptorContext::new(Input::doesnt_matter());\n        context.enter_serialization_phase();\n        context.set_request(HttpRequest::empty());\n\n        let mut layer = Layer::new(\"test\");\n        layer.store_put(RetryConfig::standard());\n        layer.store_put(\n            TimeoutConfig::builder()\n                .read_timeout(Duration::from_secs(30))\n                .build(),\n        );\n        let mut config = ConfigBag::of_layers(vec![layer]);\n\n        let _ = context.take_input();\n        context.enter_before_transmit_phase();\n        let interceptor = RequestInfoInterceptor::new();\n        let mut ctx = (&mut context).into();\n        interceptor\n            .modify_before_transmit(&mut ctx, &rc, &mut config)\n            .unwrap();\n\n        assert_eq!(\n            expect_header(&context, \"amz-sdk-request\"),\n            \"attempt=0; max=3\"\n        );\n    }\n\n    #[test]\n    fn test_header_value_from_request_pairs_supports_all_valid_characters() {\n        // The list of valid characters is defined by an internal-only spec.\n        let rp = RequestPairs::new()\n            .with_pair((\"allowed-symbols\", \"!#$&'*+-.^_`|~\"))\n            .with_pair((\"allowed-digits\", \"01234567890\"))\n            .with_pair((\n                \"allowed-characters\",\n                \"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\",\n            ))\n            .with_pair((\"allowed-whitespace\", \" \\t\"));\n        let _header_value: HeaderValue = rp\n            .try_into()\n            .expect(\"request pairs can be converted into valid header value.\");\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-runtime/src/retries/classifiers.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_smithy_runtime_api::client::interceptors::context::InterceptorContext;\nuse aws_smithy_runtime_api::client::orchestrator::OrchestratorError;\nuse aws_smithy_runtime_api::client::retries::classifiers::{\n    ClassifyRetry, RetryAction, RetryClassifierPriority, RetryReason,\n};\nuse aws_smithy_types::error::metadata::ProvideErrorMetadata;\nuse aws_smithy_types::retry::ErrorKind;\nuse std::borrow::Cow;\nuse std::error::Error as StdError;\nuse std::marker::PhantomData;\n\n/// AWS error codes that represent throttling errors.\npub const THROTTLING_ERRORS: &[&str] = &[\n    \"Throttling\",\n    \"ThrottlingException\",\n    \"ThrottledException\",\n    \"RequestThrottledException\",\n    \"TooManyRequestsException\",\n    \"ProvisionedThroughputExceededException\",\n    \"TransactionInProgressException\",\n    \"RequestLimitExceeded\",\n    \"BandwidthLimitExceeded\",\n    \"LimitExceededException\",\n    \"RequestThrottled\",\n    \"SlowDown\",\n    \"PriorRequestNotComplete\",\n    \"EC2ThrottledException\",\n];\n\n/// AWS error codes that represent transient errors.\npub const TRANSIENT_ERRORS: &[&str] = &[\"RequestTimeout\", \"RequestTimeoutException\"];\n\n/// A retry classifier for determining if the response sent by an AWS service requires a retry.\n#[derive(Debug)]\npub struct AwsErrorCodeClassifier<E> {\n    throttling_errors: Cow<'static, [&'static str]>,\n    transient_errors: Cow<'static, [&'static str]>,\n    _inner: PhantomData<E>,\n}\n\nimpl<E> Default for AwsErrorCodeClassifier<E> {\n    fn default() -> Self {\n        Self {\n            throttling_errors: THROTTLING_ERRORS.into(),\n            transient_errors: TRANSIENT_ERRORS.into(),\n            _inner: PhantomData,\n        }\n    }\n}\n\n/// Builder for [`AwsErrorCodeClassifier`]\n#[derive(Debug)]\npub struct AwsErrorCodeClassifierBuilder<E> {\n    throttling_errors: Option<Cow<'static, [&'static str]>>,\n    transient_errors: Option<Cow<'static, [&'static str]>>,\n    _inner: PhantomData<E>,\n}\n\nimpl<E> AwsErrorCodeClassifierBuilder<E> {\n    /// Set `transient_errors` for the builder\n    pub fn transient_errors(\n        mut self,\n        transient_errors: impl Into<Cow<'static, [&'static str]>>,\n    ) -> Self {\n        self.transient_errors = Some(transient_errors.into());\n        self\n    }\n\n    /// Build a new [`AwsErrorCodeClassifier`]\n    pub fn build(self) -> AwsErrorCodeClassifier<E> {\n        AwsErrorCodeClassifier {\n            throttling_errors: self.throttling_errors.unwrap_or(THROTTLING_ERRORS.into()),\n            transient_errors: self.transient_errors.unwrap_or(TRANSIENT_ERRORS.into()),\n            _inner: self._inner,\n        }\n    }\n}\n\nimpl<E> AwsErrorCodeClassifier<E> {\n    /// Create a new [`AwsErrorCodeClassifier`]\n    pub fn new() -> Self {\n        Self::default()\n    }\n\n    /// Return a builder that can create a new [`AwsErrorCodeClassifier`]\n    pub fn builder() -> AwsErrorCodeClassifierBuilder<E> {\n        AwsErrorCodeClassifierBuilder {\n            throttling_errors: None,\n            transient_errors: None,\n            _inner: PhantomData,\n        }\n    }\n}\n\nimpl<E> ClassifyRetry for AwsErrorCodeClassifier<E>\nwhere\n    E: StdError + ProvideErrorMetadata + Send + Sync + 'static,\n{\n    fn classify_retry(&self, ctx: &InterceptorContext) -> RetryAction {\n        // Check for a result\n        let output_or_error = ctx.output_or_error();\n        // Check for an error\n        let error = match output_or_error {\n            Some(Ok(_)) | None => return RetryAction::NoActionIndicated,\n            Some(Err(err)) => err,\n        };\n\n        let retry_after = ctx\n            .response()\n            .and_then(|res| res.headers().get(\"x-amz-retry-after\"))\n            .and_then(|header| header.parse::<u64>().ok())\n            .map(std::time::Duration::from_millis);\n\n        let error_code = OrchestratorError::as_operation_error(error)\n            .and_then(|err| err.downcast_ref::<E>())\n            .and_then(|err| err.code());\n\n        if let Some(error_code) = error_code {\n            if self.throttling_errors.contains(&error_code) {\n                return RetryAction::RetryIndicated(RetryReason::RetryableError {\n                    kind: ErrorKind::ThrottlingError,\n                    retry_after,\n                });\n            }\n            if self.transient_errors.contains(&error_code) {\n                return RetryAction::RetryIndicated(RetryReason::RetryableError {\n                    kind: ErrorKind::TransientError,\n                    retry_after,\n                });\n            }\n        };\n\n        debug_assert!(\n            retry_after.is_none(),\n            \"retry_after should be None if the error wasn't an identifiable AWS error\"\n        );\n\n        RetryAction::NoActionIndicated\n    }\n\n    fn name(&self) -> &'static str {\n        \"AWS Error Code\"\n    }\n\n    fn priority(&self) -> RetryClassifierPriority {\n        RetryClassifierPriority::run_before(\n            RetryClassifierPriority::modeled_as_retryable_classifier(),\n        )\n    }\n}\n\n#[cfg(test)]\nmod test {\n    use crate::retries::classifiers::AwsErrorCodeClassifier;\n    use aws_smithy_runtime_api::client::interceptors::context::InterceptorContext;\n    use aws_smithy_runtime_api::client::interceptors::context::{Error, Input};\n    use aws_smithy_runtime_api::client::orchestrator::OrchestratorError;\n    use aws_smithy_runtime_api::client::retries::classifiers::{ClassifyRetry, RetryAction};\n    use aws_smithy_types::body::SdkBody;\n    use aws_smithy_types::error::metadata::ProvideErrorMetadata;\n    use aws_smithy_types::error::ErrorMetadata;\n    use aws_smithy_types::retry::ErrorKind;\n    use std::fmt;\n    use std::time::Duration;\n\n    #[derive(Debug)]\n    struct CodedError {\n        metadata: ErrorMetadata,\n    }\n\n    impl CodedError {\n        fn new(code: &'static str) -> Self {\n            Self {\n                metadata: ErrorMetadata::builder().code(code).build(),\n            }\n        }\n    }\n\n    impl fmt::Display for CodedError {\n        fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n            write!(f, \"Coded Error\")\n        }\n    }\n\n    impl std::error::Error for CodedError {}\n\n    impl ProvideErrorMetadata for CodedError {\n        fn meta(&self) -> &ErrorMetadata {\n            &self.metadata\n        }\n    }\n\n    #[test]\n    fn classify_by_error_code() {\n        let policy = AwsErrorCodeClassifier::<CodedError>::new();\n        let mut ctx = InterceptorContext::new(Input::doesnt_matter());\n        ctx.set_output_or_error(Err(OrchestratorError::operation(Error::erase(\n            CodedError::new(\"Throttling\"),\n        ))));\n\n        assert_eq!(policy.classify_retry(&ctx), RetryAction::throttling_error());\n\n        let mut ctx = InterceptorContext::new(Input::doesnt_matter());\n        ctx.set_output_or_error(Err(OrchestratorError::operation(Error::erase(\n            CodedError::new(\"RequestTimeout\"),\n        ))));\n        assert_eq!(policy.classify_retry(&ctx), RetryAction::transient_error())\n    }\n\n    #[test]\n    fn classify_generic() {\n        let policy = AwsErrorCodeClassifier::<ErrorMetadata>::new();\n        let err = ErrorMetadata::builder().code(\"SlowDown\").build();\n        let test_response = http_1x::Response::new(\"OK\").map(SdkBody::from);\n\n        let mut ctx = InterceptorContext::new(Input::doesnt_matter());\n        ctx.set_response(test_response.try_into().unwrap());\n        ctx.set_output_or_error(Err(OrchestratorError::operation(Error::erase(err))));\n\n        assert_eq!(policy.classify_retry(&ctx), RetryAction::throttling_error());\n    }\n\n    #[test]\n    fn test_retry_after_header() {\n        let policy = AwsErrorCodeClassifier::<ErrorMetadata>::new();\n        let err = ErrorMetadata::builder().code(\"SlowDown\").build();\n        let res = http_1x::Response::builder()\n            .header(\"x-amz-retry-after\", \"5000\")\n            .body(\"retry later\")\n            .unwrap()\n            .map(SdkBody::from);\n        let mut ctx = InterceptorContext::new(Input::doesnt_matter());\n        ctx.set_response(res.try_into().unwrap());\n        ctx.set_output_or_error(Err(OrchestratorError::operation(Error::erase(err))));\n\n        assert_eq!(\n            policy.classify_retry(&ctx),\n            RetryAction::retryable_error_with_explicit_delay(\n                ErrorKind::ThrottlingError,\n                Duration::from_secs(5)\n            )\n        );\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-runtime/src/retries.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/// Classifiers that can inspect a response and determine if it should be retried.\npub mod classifiers;\n"
  },
  {
    "path": "aws/rust-runtime/aws-runtime/src/sdk_feature.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/// Note: This code originally lived in the `aws-runtime` crate. It was moved here to avoid circular dependencies\n/// This module is re-exported in `aws-runtime`, and so even though this is a pre-1.0 crate, this module should not\n/// have any breaking changes\nuse aws_smithy_types::config_bag::{Storable, StoreAppend};\n\n/// IDs for the features that may be used in the AWS SDK\n#[non_exhaustive]\n#[derive(Clone, Debug, Eq, PartialEq)]\npub enum AwsSdkFeature {\n    /// An operation called with account ID mode set to preferred\n    AccountIdModePreferred,\n    /// An operation called with account ID mode set to disabled\n    AccountIdModeDisabled,\n    /// An operation called with account ID mode set to required\n    AccountIdModeRequired,\n    /// Indicates that an operation was called by the S3 Transfer Manager\n    S3Transfer,\n    /// Calling an SSO-OIDC operation as part of the SSO login flow, when using the OAuth2.0 device code grant\n    SsoLoginDevice,\n    /// Calling an SSO-OIDC operation as part of the SSO login flow, when using the OAuth2.0 authorization code grant\n    SsoLoginAuth,\n    /// Indicates that a custom endpoint URL was configured\n    EndpointOverride,\n}\n\nimpl Storable for AwsSdkFeature {\n    type Storer = StoreAppend<Self>;\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-runtime/src/service_clock_skew.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_smithy_runtime_api::box_error::BoxError;\nuse aws_smithy_runtime_api::client::interceptors::context::BeforeDeserializationInterceptorContextMut;\nuse aws_smithy_runtime_api::client::interceptors::{dyn_dispatch_hint, Intercept};\nuse aws_smithy_runtime_api::client::runtime_components::RuntimeComponents;\nuse aws_smithy_types::config_bag::{ConfigBag, Storable, StoreReplace};\nuse aws_smithy_types::date_time::Format;\nuse aws_smithy_types::DateTime;\nuse std::time::Duration;\n\n/// Amount of clock skew between the client and the service.\n#[derive(Debug, Clone)]\n#[non_exhaustive]\npub(crate) struct ServiceClockSkew {\n    inner: Duration,\n}\n\nimpl ServiceClockSkew {\n    fn new(inner: Duration) -> Self {\n        Self { inner }\n    }\n}\n\nimpl Storable for ServiceClockSkew {\n    type Storer = StoreReplace<Self>;\n}\n\nimpl From<ServiceClockSkew> for Duration {\n    fn from(skew: ServiceClockSkew) -> Duration {\n        skew.inner\n    }\n}\n\n/// Interceptor that determines the clock skew between the client and service.\n#[derive(Debug, Default)]\n#[non_exhaustive]\npub struct ServiceClockSkewInterceptor;\n\nimpl ServiceClockSkewInterceptor {\n    /// Creates a new `ServiceClockSkewInterceptor`.\n    pub fn new() -> Self {\n        Self::default()\n    }\n}\n\nfn calculate_skew(time_sent: DateTime, time_received: DateTime) -> Duration {\n    let skew = (time_sent.as_secs_f64() - time_received.as_secs_f64()).max(0.0);\n    Duration::from_secs_f64(skew)\n}\n\nfn extract_time_sent_from_response(\n    ctx: &mut BeforeDeserializationInterceptorContextMut<'_>,\n) -> Result<DateTime, BoxError> {\n    let date_header = ctx\n        .response()\n        .headers()\n        .get(\"date\")\n        .ok_or(\"Response from server does not include a `date` header\")?;\n    DateTime::from_str(date_header, Format::HttpDate).map_err(Into::into)\n}\n\n#[dyn_dispatch_hint]\nimpl Intercept for ServiceClockSkewInterceptor {\n    fn name(&self) -> &'static str {\n        \"ServiceClockSkewInterceptor\"\n    }\n\n    fn modify_before_deserialization(\n        &self,\n        ctx: &mut BeforeDeserializationInterceptorContextMut<'_>,\n        runtime_components: &RuntimeComponents,\n        cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        let time_received = DateTime::from(\n            runtime_components\n                .time_source()\n                .ok_or(\"a time source is required (service clock skew)\")?\n                .now(),\n        );\n        let time_sent = match extract_time_sent_from_response(ctx) {\n            Ok(time_sent) => time_sent,\n            Err(e) => {\n                // We don't want to fail a request for this because 1xx and 5xx responses and\n                // responses from servers with no clock may omit this header. We still log it at the\n                // trace level to aid in debugging.\n                tracing::trace!(\"failed to calculate clock skew of service from response: {e}. Ignoring this error...\",);\n                return Ok(());\n            }\n        };\n        let skew = ServiceClockSkew::new(calculate_skew(time_sent, time_received));\n        cfg.interceptor_state().store_put(skew);\n        Ok(())\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-runtime/src/user_agent/interceptor.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::borrow::Cow;\nuse std::fmt;\n\nuse http_1x::header::{HeaderName, HeaderValue, InvalidHeaderValue, USER_AGENT};\n\nuse aws_credential_types::credential_feature::AwsCredentialFeature;\nuse aws_smithy_runtime::client::sdk_feature::SmithySdkFeature;\nuse aws_smithy_runtime_api::box_error::BoxError;\nuse aws_smithy_runtime_api::client::http::HttpClient;\nuse aws_smithy_runtime_api::client::interceptors::context::{\n    BeforeTransmitInterceptorContextMut, BeforeTransmitInterceptorContextRef,\n};\nuse aws_smithy_runtime_api::client::interceptors::{dyn_dispatch_hint, Intercept};\nuse aws_smithy_runtime_api::client::runtime_components::RuntimeComponents;\nuse aws_smithy_types::config_bag::ConfigBag;\nuse aws_types::app_name::AppName;\nuse aws_types::os_shim_internal::Env;\n\nuse crate::sdk_feature::AwsSdkFeature;\nuse crate::user_agent::metrics::ProvideBusinessMetric;\nuse crate::user_agent::{AdditionalMetadata, ApiMetadata, AwsUserAgent, InvalidMetadataValue};\n\nmacro_rules! add_metrics_unique {\n    ($features:expr, $ua:expr, $added:expr) => {\n        for feature in $features {\n            if let Some(m) = feature.provide_business_metric() {\n                if !$added.contains(&m) {\n                    $added.insert(m.clone());\n                    $ua.add_business_metric(m);\n                }\n            }\n        }\n    };\n}\n\nmacro_rules! add_metrics_unique_reverse {\n    ($features:expr, $ua:expr, $added:expr) => {\n        let mut unique_metrics = Vec::new();\n        for feature in $features {\n            if let Some(m) = feature.provide_business_metric() {\n                if !$added.contains(&m) {\n                    $added.insert(m.clone());\n                    unique_metrics.push(m);\n                }\n            }\n        }\n        for m in unique_metrics.into_iter().rev() {\n            $ua.add_business_metric(m);\n        }\n    };\n}\n\n#[allow(clippy::declare_interior_mutable_const)] // we will never mutate this\nconst X_AMZ_USER_AGENT: HeaderName = HeaderName::from_static(\"x-amz-user-agent\");\n\n#[derive(Debug)]\nenum UserAgentInterceptorError {\n    MissingApiMetadata,\n    InvalidHeaderValue(InvalidHeaderValue),\n    InvalidMetadataValue(InvalidMetadataValue),\n}\n\nimpl std::error::Error for UserAgentInterceptorError {\n    fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {\n        match self {\n            Self::InvalidHeaderValue(source) => Some(source),\n            Self::InvalidMetadataValue(source) => Some(source),\n            Self::MissingApiMetadata => None,\n        }\n    }\n}\n\nimpl fmt::Display for UserAgentInterceptorError {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        f.write_str(match self {\n            Self::InvalidHeaderValue(_) => \"AwsUserAgent generated an invalid HTTP header value. This is a bug. Please file an issue.\",\n            Self::InvalidMetadataValue(_) => \"AwsUserAgent generated an invalid metadata value. This is a bug. Please file an issue.\",\n            Self::MissingApiMetadata => \"The UserAgentInterceptor requires ApiMetadata to be set before the request is made. This is a bug. Please file an issue.\",\n        })\n    }\n}\n\nimpl From<InvalidHeaderValue> for UserAgentInterceptorError {\n    fn from(err: InvalidHeaderValue) -> Self {\n        UserAgentInterceptorError::InvalidHeaderValue(err)\n    }\n}\n\nimpl From<InvalidMetadataValue> for UserAgentInterceptorError {\n    fn from(err: InvalidMetadataValue) -> Self {\n        UserAgentInterceptorError::InvalidMetadataValue(err)\n    }\n}\n\n/// Generates and attaches the AWS SDK's user agent to a HTTP request\n#[non_exhaustive]\n#[derive(Debug, Default)]\npub struct UserAgentInterceptor;\n\nimpl UserAgentInterceptor {\n    /// Creates a new `UserAgentInterceptor`\n    pub fn new() -> Self {\n        UserAgentInterceptor\n    }\n}\n\nfn header_values(\n    ua: &AwsUserAgent,\n) -> Result<(HeaderValue, HeaderValue), UserAgentInterceptorError> {\n    // Pay attention to the extremely subtle difference between ua_header and aws_ua_header below...\n    Ok((\n        HeaderValue::try_from(ua.ua_header())?,\n        HeaderValue::try_from(ua.aws_ua_header())?,\n    ))\n}\n\n#[dyn_dispatch_hint]\nimpl Intercept for UserAgentInterceptor {\n    fn name(&self) -> &'static str {\n        \"UserAgentInterceptor\"\n    }\n\n    fn read_after_serialization(\n        &self,\n        _context: &BeforeTransmitInterceptorContextRef<'_>,\n        _runtime_components: &RuntimeComponents,\n        cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        // Allow for overriding the user agent by an earlier interceptor (so, for example,\n        // tests can use `AwsUserAgent::for_tests()`) by attempting to grab one out of the\n        // config bag before creating one.\n        if cfg.load::<AwsUserAgent>().is_some() {\n            return Ok(());\n        }\n\n        let api_metadata = cfg\n            .load::<ApiMetadata>()\n            .ok_or(UserAgentInterceptorError::MissingApiMetadata)?;\n        let mut ua = AwsUserAgent::new_from_environment(Env::real(), api_metadata.clone());\n\n        let maybe_app_name = cfg.load::<AppName>();\n        if let Some(app_name) = maybe_app_name {\n            ua.set_app_name(app_name.clone());\n        }\n\n        cfg.interceptor_state().store_put(ua);\n\n        Ok(())\n    }\n\n    fn modify_before_signing(\n        &self,\n        context: &mut BeforeTransmitInterceptorContextMut<'_>,\n        runtime_components: &RuntimeComponents,\n        cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        let mut ua = cfg\n            .load::<AwsUserAgent>()\n            .expect(\"`AwsUserAgent should have been created in `read_before_execution`\")\n            .clone();\n\n        let mut added_metrics = std::collections::HashSet::new();\n\n        add_metrics_unique!(cfg.load::<SmithySdkFeature>(), &mut ua, &mut added_metrics);\n        add_metrics_unique!(cfg.load::<AwsSdkFeature>(), &mut ua, &mut added_metrics);\n        // The order we emit credential features matters.\n        // Reverse to preserve emission order since StoreAppend pops backwards.\n        add_metrics_unique_reverse!(\n            cfg.load::<AwsCredentialFeature>(),\n            &mut ua,\n            &mut added_metrics\n        );\n\n        let maybe_connector_metadata = runtime_components\n            .http_client()\n            .and_then(|c| c.connector_metadata());\n        if let Some(connector_metadata) = maybe_connector_metadata {\n            let am = AdditionalMetadata::new(Cow::Owned(connector_metadata.to_string()))?;\n            ua.add_additional_metadata(am);\n        }\n\n        let headers = context.request_mut().headers_mut();\n        let (user_agent, x_amz_user_agent) = header_values(&ua)?;\n        headers.append(USER_AGENT, user_agent);\n        headers.append(X_AMZ_USER_AGENT, x_amz_user_agent);\n        Ok(())\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use aws_smithy_runtime_api::client::interceptors::context::{Input, InterceptorContext};\n    use aws_smithy_runtime_api::client::interceptors::Intercept;\n    use aws_smithy_runtime_api::client::orchestrator::HttpRequest;\n    use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder;\n    use aws_smithy_types::config_bag::{ConfigBag, Layer};\n    use aws_smithy_types::error::display::DisplayErrorContext;\n\n    fn expect_header<'a>(context: &'a InterceptorContext, header_name: &str) -> &'a str {\n        context\n            .request()\n            .expect(\"request is set\")\n            .headers()\n            .get(header_name)\n            .unwrap()\n    }\n\n    fn context() -> InterceptorContext {\n        let mut context = InterceptorContext::new(Input::doesnt_matter());\n        context.enter_serialization_phase();\n        context.set_request(HttpRequest::empty());\n        let _ = context.take_input();\n        context.enter_before_transmit_phase();\n        context\n    }\n\n    #[test]\n    fn test_overridden_ua() {\n        let rc = RuntimeComponentsBuilder::for_tests().build().unwrap();\n        let mut context = context();\n\n        let mut layer = Layer::new(\"test\");\n        layer.store_put(AwsUserAgent::for_tests());\n        layer.store_put(ApiMetadata::new(\"unused\", \"unused\"));\n        let mut cfg = ConfigBag::of_layers(vec![layer]);\n\n        let interceptor = UserAgentInterceptor::new();\n        let mut ctx = Into::into(&mut context);\n        interceptor\n            .modify_before_signing(&mut ctx, &rc, &mut cfg)\n            .unwrap();\n\n        let header = expect_header(&context, \"user-agent\");\n        assert_eq!(AwsUserAgent::for_tests().ua_header(), header);\n        assert!(!header.contains(\"unused\"));\n\n        assert_eq!(\n            AwsUserAgent::for_tests().aws_ua_header(),\n            expect_header(&context, \"x-amz-user-agent\")\n        );\n    }\n\n    #[test]\n    fn test_default_ua() {\n        let rc = RuntimeComponentsBuilder::for_tests().build().unwrap();\n        let mut context = context();\n\n        let api_metadata = ApiMetadata::new(\"some-service\", \"some-version\");\n        let mut layer = Layer::new(\"test\");\n        layer.store_put(api_metadata.clone());\n        let mut config = ConfigBag::of_layers(vec![layer]);\n\n        let interceptor = UserAgentInterceptor::new();\n        let ctx = Into::into(&context);\n        interceptor\n            .read_after_serialization(&ctx, &rc, &mut config)\n            .unwrap();\n        let mut ctx = Into::into(&mut context);\n        interceptor\n            .modify_before_signing(&mut ctx, &rc, &mut config)\n            .unwrap();\n\n        let expected_ua = AwsUserAgent::new_from_environment(Env::real(), api_metadata);\n        assert!(\n            expected_ua.aws_ua_header().contains(\"some-service\"),\n            \"precondition\"\n        );\n        assert_eq!(\n            expected_ua.ua_header(),\n            expect_header(&context, \"user-agent\")\n        );\n        assert_eq!(\n            expected_ua.aws_ua_header(),\n            expect_header(&context, \"x-amz-user-agent\")\n        );\n    }\n\n    #[test]\n    fn test_modify_before_signing_no_duplicate_metrics() {\n        let rc = RuntimeComponentsBuilder::for_tests().build().unwrap();\n        let mut context = context();\n\n        let api_metadata = ApiMetadata::new(\"test-service\", \"1.0\");\n        let mut layer = Layer::new(\"test\");\n        layer.store_put(api_metadata);\n        // Duplicate features\n        layer.store_append(SmithySdkFeature::Waiter);\n        layer.store_append(SmithySdkFeature::Waiter);\n        layer.store_append(AwsSdkFeature::S3Transfer);\n        layer.store_append(AwsSdkFeature::S3Transfer);\n        layer.store_append(AwsCredentialFeature::CredentialsCode);\n        layer.store_append(AwsCredentialFeature::CredentialsCode);\n        let mut config = ConfigBag::of_layers(vec![layer]);\n\n        let interceptor = UserAgentInterceptor::new();\n        let ctx = Into::into(&context);\n        interceptor\n            .read_after_serialization(&ctx, &rc, &mut config)\n            .unwrap();\n        let mut ctx = Into::into(&mut context);\n        interceptor\n            .modify_before_signing(&mut ctx, &rc, &mut config)\n            .unwrap();\n\n        let aws_ua_header = expect_header(&context, \"x-amz-user-agent\");\n        let metrics_section = aws_ua_header.split(\" m/\").nth(1).unwrap();\n        let waiter_count = metrics_section.matches(\"B\").count();\n        let s3_transfer_count = metrics_section.matches(\"G\").count();\n        let credentials_code_count = metrics_section.matches(\"e\").count();\n        assert_eq!(\n            1, waiter_count,\n            \"Waiter metric should appear only once, but found {waiter_count} occurrences in: {aws_ua_header}\",\n        );\n        assert_eq!(1, s3_transfer_count, \"S3Transfer metric should appear only once, but found {s3_transfer_count} occurrences in metrics section: {aws_ua_header}\");\n        assert_eq!(1, credentials_code_count, \"CredentialsCode metric should appear only once, but found {credentials_code_count} occurrences in metrics section: {aws_ua_header}\");\n    }\n\n    #[test]\n    fn test_metrics_order_preserved() {\n        use aws_credential_types::credential_feature::AwsCredentialFeature;\n\n        let rc = RuntimeComponentsBuilder::for_tests().build().unwrap();\n        let mut context = context();\n\n        let api_metadata = ApiMetadata::new(\"test-service\", \"1.0\");\n        let mut layer = Layer::new(\"test\");\n        layer.store_put(api_metadata);\n        layer.store_append(AwsCredentialFeature::CredentialsCode);\n        layer.store_append(AwsCredentialFeature::CredentialsEnvVars);\n        layer.store_append(AwsCredentialFeature::CredentialsProfile);\n        let mut config = ConfigBag::of_layers(vec![layer]);\n\n        let interceptor = UserAgentInterceptor::new();\n        let ctx = Into::into(&context);\n        interceptor\n            .read_after_serialization(&ctx, &rc, &mut config)\n            .unwrap();\n        let mut ctx = Into::into(&mut context);\n        interceptor\n            .modify_before_signing(&mut ctx, &rc, &mut config)\n            .unwrap();\n\n        let aws_ua_header = expect_header(&context, \"x-amz-user-agent\");\n        let metrics_section = aws_ua_header.split(\" m/\").nth(1).unwrap();\n\n        assert_eq!(\n            metrics_section, \"e,g,n\",\n            \"AwsCredentialFeature metrics should preserve order\"\n        );\n    }\n\n    #[test]\n    fn test_app_name() {\n        let rc = RuntimeComponentsBuilder::for_tests().build().unwrap();\n        let mut context = context();\n\n        let api_metadata = ApiMetadata::new(\"some-service\", \"some-version\");\n        let mut layer = Layer::new(\"test\");\n        layer.store_put(api_metadata);\n        layer.store_put(AppName::new(\"my_awesome_app\").unwrap());\n        let mut config = ConfigBag::of_layers(vec![layer]);\n\n        let interceptor = UserAgentInterceptor::new();\n        let ctx = Into::into(&context);\n        interceptor\n            .read_after_serialization(&ctx, &rc, &mut config)\n            .unwrap();\n        let mut ctx = Into::into(&mut context);\n        interceptor\n            .modify_before_signing(&mut ctx, &rc, &mut config)\n            .unwrap();\n\n        let app_value = \"app/my_awesome_app\";\n        let header = expect_header(&context, \"user-agent\");\n        assert!(\n            !header.contains(app_value),\n            \"expected `{header}` to not contain `{app_value}`\"\n        );\n\n        let header = expect_header(&context, \"x-amz-user-agent\");\n        assert!(\n            header.contains(app_value),\n            \"expected `{header}` to contain `{app_value}`\"\n        );\n    }\n\n    #[test]\n    fn test_api_metadata_missing() {\n        let rc = RuntimeComponentsBuilder::for_tests().build().unwrap();\n        let context = context();\n        let mut config = ConfigBag::base();\n\n        let interceptor = UserAgentInterceptor::new();\n        let ctx = Into::into(&context);\n\n        let error = format!(\n            \"{}\",\n            DisplayErrorContext(\n                &*interceptor\n                    .read_after_serialization(&ctx, &rc, &mut config)\n                    .expect_err(\"it should error\")\n            )\n        );\n        assert!(\n            error.contains(\"This is a bug\"),\n            \"`{error}` should contain message `This is a bug`\"\n        );\n    }\n\n    #[test]\n    fn test_api_metadata_missing_with_ua_override() {\n        let rc = RuntimeComponentsBuilder::for_tests().build().unwrap();\n        let mut context = context();\n\n        let mut layer = Layer::new(\"test\");\n        layer.store_put(AwsUserAgent::for_tests());\n        let mut config = ConfigBag::of_layers(vec![layer]);\n\n        let interceptor = UserAgentInterceptor::new();\n        let mut ctx = Into::into(&mut context);\n\n        interceptor\n            .modify_before_signing(&mut ctx, &rc, &mut config)\n            .expect(\"it should succeed\");\n\n        let header = expect_header(&context, \"user-agent\");\n        assert_eq!(AwsUserAgent::for_tests().ua_header(), header);\n        assert!(!header.contains(\"unused\"));\n\n        assert_eq!(\n            AwsUserAgent::for_tests().aws_ua_header(),\n            expect_header(&context, \"x-amz-user-agent\")\n        );\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-runtime/src/user_agent/metrics.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::sdk_feature::AwsSdkFeature;\nuse aws_credential_types::credential_feature::AwsCredentialFeature;\nuse aws_smithy_runtime::client::sdk_feature::SmithySdkFeature;\nuse std::borrow::Cow;\nuse std::collections::HashMap;\nuse std::fmt;\nuse std::sync::LazyLock;\n\nconst MAX_COMMA_SEPARATED_METRICS_VALUES_LENGTH: usize = 1024;\n#[allow(dead_code)]\nconst MAX_METRICS_ID_NUMBER: usize = 350;\n\nmacro_rules! iterable_enum {\n    ($docs:tt, $enum_name:ident, $( $variant:ident ),*) => {\n        #[derive(Clone, Debug, Eq, Hash, PartialEq)]\n        #[non_exhaustive]\n        #[doc = $docs]\n        #[allow(missing_docs)] // for variants, not for the Enum itself\n        pub enum $enum_name {\n            $( $variant ),*\n        }\n\n        #[allow(dead_code)]\n        impl $enum_name {\n            pub(crate) fn iter() -> impl Iterator<Item = &'static $enum_name> {\n                const VARIANTS: &[$enum_name] = &[\n                    $( $enum_name::$variant ),*\n                ];\n                VARIANTS.iter()\n            }\n        }\n    };\n}\n\nstruct Base64Iterator {\n    current: Vec<usize>,\n    base64_chars: Vec<char>,\n}\n\nimpl Base64Iterator {\n    #[allow(dead_code)]\n    fn new() -> Self {\n        Base64Iterator {\n            current: vec![0], // Start with the first character\n            base64_chars: (b'A'..=b'Z') // 'A'-'Z'\n                .chain(b'a'..=b'z') // 'a'-'z'\n                .chain(b'0'..=b'9') // '0'-'9'\n                .chain([b'+', b'-']) // '+' and '-'\n                .map(|c| c as char)\n                .collect(),\n        }\n    }\n\n    fn increment(&mut self) {\n        let mut i = 0;\n        while i < self.current.len() {\n            self.current[i] += 1;\n            if self.current[i] < self.base64_chars.len() {\n                // The value at current position hasn't reached 64\n                return;\n            }\n            self.current[i] = 0;\n            i += 1;\n        }\n        self.current.push(0); // Add new digit if all positions overflowed\n    }\n}\n\nimpl Iterator for Base64Iterator {\n    type Item = String;\n\n    fn next(&mut self) -> Option<Self::Item> {\n        if self.current.is_empty() {\n            return None; // No more items\n        }\n\n        // Convert the current indices to characters\n        let result: String = self\n            .current\n            .iter()\n            .rev()\n            .map(|&idx| self.base64_chars[idx])\n            .collect();\n\n        // Increment to the next value\n        self.increment();\n        Some(result)\n    }\n}\n\npub(super) static FEATURE_ID_TO_METRIC_VALUE: LazyLock<HashMap<BusinessMetric, Cow<'static, str>>> =\n    LazyLock::new(|| {\n        let mut m = HashMap::new();\n        for (metric, value) in BusinessMetric::iter()\n            .cloned()\n            .zip(Base64Iterator::new())\n            .take(MAX_METRICS_ID_NUMBER)\n        {\n            m.insert(metric, Cow::Owned(value));\n        }\n        m\n    });\n\niterable_enum!(\n    \"Enumerates human readable identifiers for the features tracked by metrics\",\n    BusinessMetric,\n    ResourceModel,\n    Waiter,\n    Paginator,\n    RetryModeLegacy,\n    RetryModeStandard,\n    RetryModeAdaptive,\n    S3Transfer,\n    S3CryptoV1n,\n    S3CryptoV2,\n    S3ExpressBucket,\n    S3AccessGrants,\n    GzipRequestCompression,\n    ProtocolRpcV2Cbor,\n    EndpointOverride,\n    AccountIdEndpoint,\n    AccountIdModePreferred,\n    AccountIdModeDisabled,\n    AccountIdModeRequired,\n    Sigv4aSigning,\n    ResolvedAccountId,\n    FlexibleChecksumsReqCrc32,\n    FlexibleChecksumsReqCrc32c,\n    FlexibleChecksumsReqCrc64,\n    FlexibleChecksumsReqSha1,\n    FlexibleChecksumsReqSha256,\n    FlexibleChecksumsReqWhenSupported,\n    FlexibleChecksumsReqWhenRequired,\n    FlexibleChecksumsResWhenSupported,\n    FlexibleChecksumsResWhenRequired,\n    DdbMapper,\n    CredentialsCode,\n    CredentialsJvmSystemProperties,\n    CredentialsEnvVars,\n    CredentialsEnvVarsStsWebIdToken,\n    CredentialsStsAssumeRole,\n    CredentialsStsAssumeRoleSaml,\n    CredentialsStsAssumeRoleWebId,\n    CredentialsStsFederationToken,\n    CredentialsStsSessionToken,\n    CredentialsProfile,\n    CredentialsProfileSourceProfile,\n    CredentialsProfileNamedProvider,\n    CredentialsProfileStsWebIdToken,\n    CredentialsProfileSso,\n    CredentialsSso,\n    CredentialsProfileSsoLegacy,\n    CredentialsSsoLegacy,\n    CredentialsProfileProcess,\n    CredentialsProcess,\n    CredentialsBoto2ConfigFile,\n    CredentialsAwsSdkStore,\n    CredentialsHttp,\n    CredentialsImds,\n    SsoLoginDevice,\n    SsoLoginAuth,\n    BearerServiceEnvVars,\n    ObservabilityTracing,\n    ObservabilityMetrics,\n    ObservabilityOtelTracing,\n    ObservabilityOtelMetrics,\n    CredentialsCognito,\n    S3TransferUploadDirectory,\n    S3TransferDownloadDirectory,\n    CliV1ToV2MigrationDebugMode,\n    LoginSameDevice,\n    LoginCrossDevice,\n    CredentialsProfileLogin,\n    CredentialsLogin\n);\n\npub(crate) trait ProvideBusinessMetric {\n    fn provide_business_metric(&self) -> Option<BusinessMetric>;\n}\n\nimpl ProvideBusinessMetric for SmithySdkFeature {\n    fn provide_business_metric(&self) -> Option<BusinessMetric> {\n        use SmithySdkFeature::*;\n        match self {\n            Waiter => Some(BusinessMetric::Waiter),\n            Paginator => Some(BusinessMetric::Paginator),\n            GzipRequestCompression => Some(BusinessMetric::GzipRequestCompression),\n            ProtocolRpcV2Cbor => Some(BusinessMetric::ProtocolRpcV2Cbor),\n            RetryModeStandard => Some(BusinessMetric::RetryModeStandard),\n            RetryModeAdaptive => Some(BusinessMetric::RetryModeAdaptive),\n            FlexibleChecksumsReqCrc32 => Some(BusinessMetric::FlexibleChecksumsReqCrc32),\n            FlexibleChecksumsReqCrc32c => Some(BusinessMetric::FlexibleChecksumsReqCrc32c),\n            FlexibleChecksumsReqCrc64 => Some(BusinessMetric::FlexibleChecksumsReqCrc64),\n            FlexibleChecksumsReqSha1 => Some(BusinessMetric::FlexibleChecksumsReqSha1),\n            FlexibleChecksumsReqSha256 => Some(BusinessMetric::FlexibleChecksumsReqSha256),\n            FlexibleChecksumsReqWhenSupported => {\n                Some(BusinessMetric::FlexibleChecksumsReqWhenSupported)\n            }\n            FlexibleChecksumsReqWhenRequired => {\n                Some(BusinessMetric::FlexibleChecksumsReqWhenRequired)\n            }\n            FlexibleChecksumsResWhenSupported => {\n                Some(BusinessMetric::FlexibleChecksumsResWhenSupported)\n            }\n            FlexibleChecksumsResWhenRequired => {\n                Some(BusinessMetric::FlexibleChecksumsResWhenRequired)\n            }\n            ObservabilityOtelMetrics => Some(BusinessMetric::ObservabilityOtelMetrics),\n            otherwise => {\n                // This may occur if a customer upgrades only the `aws-smithy-runtime-api` crate\n                // while continuing to use an outdated version of an SDK crate or the `aws-runtime`\n                // crate.\n                tracing::warn!(\n                    \"Attempted to provide `BusinessMetric` for `{otherwise:?}`, which is not recognized in the current version of the `aws-runtime` crate. \\\n                    Consider upgrading to the latest version to ensure that all tracked features are properly reported in your metrics.\"\n                );\n                None\n            }\n        }\n    }\n}\n\nimpl ProvideBusinessMetric for AwsSdkFeature {\n    fn provide_business_metric(&self) -> Option<BusinessMetric> {\n        use AwsSdkFeature::*;\n        match self {\n            AccountIdModePreferred => Some(BusinessMetric::AccountIdModePreferred),\n            AccountIdModeDisabled => Some(BusinessMetric::AccountIdModeDisabled),\n            AccountIdModeRequired => Some(BusinessMetric::AccountIdModeRequired),\n            S3Transfer => Some(BusinessMetric::S3Transfer),\n            SsoLoginDevice => Some(BusinessMetric::SsoLoginDevice),\n            SsoLoginAuth => Some(BusinessMetric::SsoLoginAuth),\n            EndpointOverride => Some(BusinessMetric::EndpointOverride),\n        }\n    }\n}\n\nimpl ProvideBusinessMetric for AwsCredentialFeature {\n    fn provide_business_metric(&self) -> Option<BusinessMetric> {\n        use AwsCredentialFeature::*;\n        match self {\n            ResolvedAccountId => Some(BusinessMetric::ResolvedAccountId),\n            CredentialsCode => Some(BusinessMetric::CredentialsCode),\n            CredentialsEnvVars => Some(BusinessMetric::CredentialsEnvVars),\n            CredentialsEnvVarsStsWebIdToken => {\n                Some(BusinessMetric::CredentialsEnvVarsStsWebIdToken)\n            }\n            CredentialsStsAssumeRole => Some(BusinessMetric::CredentialsStsAssumeRole),\n            CredentialsStsAssumeRoleSaml => Some(BusinessMetric::CredentialsStsAssumeRoleSaml),\n            CredentialsStsAssumeRoleWebId => Some(BusinessMetric::CredentialsStsAssumeRoleWebId),\n            CredentialsStsFederationToken => Some(BusinessMetric::CredentialsStsFederationToken),\n            CredentialsStsSessionToken => Some(BusinessMetric::CredentialsStsSessionToken),\n            CredentialsProfile => Some(BusinessMetric::CredentialsProfile),\n            CredentialsProfileSourceProfile => {\n                Some(BusinessMetric::CredentialsProfileSourceProfile)\n            }\n            CredentialsProfileNamedProvider => {\n                Some(BusinessMetric::CredentialsProfileNamedProvider)\n            }\n            CredentialsProfileStsWebIdToken => {\n                Some(BusinessMetric::CredentialsProfileStsWebIdToken)\n            }\n            CredentialsProfileSso => Some(BusinessMetric::CredentialsProfileSso),\n            CredentialsSso => Some(BusinessMetric::CredentialsSso),\n            CredentialsProfileProcess => Some(BusinessMetric::CredentialsProfileProcess),\n            CredentialsProcess => Some(BusinessMetric::CredentialsProcess),\n            CredentialsHttp => Some(BusinessMetric::CredentialsHttp),\n            CredentialsImds => Some(BusinessMetric::CredentialsImds),\n            BearerServiceEnvVars => Some(BusinessMetric::BearerServiceEnvVars),\n            S3ExpressBucket => Some(BusinessMetric::S3ExpressBucket),\n            CredentialsProfileLogin => Some(BusinessMetric::CredentialsProfileLogin),\n            CredentialsLogin => Some(BusinessMetric::CredentialsLogin),\n            otherwise => {\n                // This may occur if a customer upgrades only the `aws-smithy-runtime-api` crate\n                // while continuing to use an outdated version of an SDK crate or the `aws-credential-types`\n                // crate.\n                tracing::warn!(\n                    \"Attempted to provide `BusinessMetric` for `{otherwise:?}`, which is not recognized in the current version of the `aws-runtime` crate. \\\n                    Consider upgrading to the latest version to ensure that all tracked features are properly reported in your metrics.\"\n                );\n                None\n            }\n        }\n    }\n}\n\n#[derive(Clone, Debug, Default)]\npub(super) struct BusinessMetrics(Vec<BusinessMetric>);\n\nimpl BusinessMetrics {\n    pub(super) fn push(&mut self, metric: BusinessMetric) {\n        self.0.push(metric);\n    }\n\n    pub(super) fn is_empty(&self) -> bool {\n        self.0.is_empty()\n    }\n}\n\nfn drop_unfinished_metrics_to_fit(csv: &str, max_len: usize) -> Cow<'_, str> {\n    if csv.len() <= max_len {\n        Cow::Borrowed(csv)\n    } else {\n        let truncated = &csv[..max_len];\n        if let Some(pos) = truncated.rfind(',') {\n            Cow::Owned(truncated[..pos].to_owned())\n        } else {\n            Cow::Owned(truncated.to_owned())\n        }\n    }\n}\n\nimpl fmt::Display for BusinessMetrics {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        // business-metrics = \"m/\" metric_id *(comma metric_id)\n        let metrics_values = self\n            .0\n            .iter()\n            .map(|feature_id| {\n                FEATURE_ID_TO_METRIC_VALUE\n                    .get(feature_id)\n                    .expect(\"{feature_id:?} should be found in `FEATURE_ID_TO_METRIC_VALUE`\")\n                    .clone()\n            })\n            .collect::<Vec<_>>()\n            .join(\",\");\n\n        let metrics_values = drop_unfinished_metrics_to_fit(\n            &metrics_values,\n            MAX_COMMA_SEPARATED_METRICS_VALUES_LENGTH,\n        );\n\n        write!(f, \"m/{metrics_values}\")\n    }\n}\n#[cfg(test)]\nmod tests {\n    use crate::user_agent::metrics::{\n        drop_unfinished_metrics_to_fit, Base64Iterator, FEATURE_ID_TO_METRIC_VALUE,\n        MAX_METRICS_ID_NUMBER,\n    };\n    use crate::user_agent::BusinessMetric;\n    use convert_case::{Boundary, Case, Casing};\n    use std::collections::HashMap;\n    use std::fmt::{Display, Formatter};\n\n    impl Display for BusinessMetric {\n        fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {\n            f.write_str(\n                &format!(\"{:?}\", self)\n                    .as_str()\n                    .from_case(Case::Pascal)\n                    .with_boundaries(&[Boundary::DigitUpper, Boundary::LowerUpper])\n                    .to_case(Case::ScreamingSnake),\n            )\n        }\n    }\n\n    #[test]\n    fn feature_id_to_metric_value() {\n        const EXPECTED: &str = include_str!(\"test_data/feature_id_to_metric_value.json\");\n\n        let expected: HashMap<&str, &str> = serde_json::from_str(EXPECTED).unwrap();\n        assert_eq!(expected.len(), FEATURE_ID_TO_METRIC_VALUE.len());\n\n        for (feature_id, metric_value) in &*FEATURE_ID_TO_METRIC_VALUE {\n            let expected = expected.get(format!(\"{feature_id}\").as_str());\n            assert_eq!(\n                expected.unwrap_or_else(|| panic!(\"Expected {feature_id} to have value `{metric_value}` but it was `{expected:?}` instead.\")),\n                metric_value,\n            );\n        }\n    }\n\n    #[test]\n    fn test_base64_iter() {\n        // 350 is the max number of metric IDs we support for now\n        let ids: Vec<String> = Base64Iterator::new().take(MAX_METRICS_ID_NUMBER).collect();\n        assert_eq!(\"A\", ids[0]);\n        assert_eq!(\"Z\", ids[25]);\n        assert_eq!(\"a\", ids[26]);\n        assert_eq!(\"z\", ids[51]);\n        assert_eq!(\"0\", ids[52]);\n        assert_eq!(\"9\", ids[61]);\n        assert_eq!(\"+\", ids[62]);\n        assert_eq!(\"-\", ids[63]);\n        assert_eq!(\"AA\", ids[64]);\n        assert_eq!(\"AB\", ids[65]);\n        assert_eq!(\"A-\", ids[127]);\n        assert_eq!(\"BA\", ids[128]);\n        assert_eq!(\"Ed\", ids[349]);\n    }\n\n    #[test]\n    fn test_drop_unfinished_metrics_to_fit() {\n        let csv = \"A,10BC,E\";\n        assert_eq!(\"A\", drop_unfinished_metrics_to_fit(csv, 5));\n\n        let csv = \"A10B,CE\";\n        assert_eq!(\"A10B\", drop_unfinished_metrics_to_fit(csv, 5));\n\n        let csv = \"A10BC,E\";\n        assert_eq!(\"A10BC\", drop_unfinished_metrics_to_fit(csv, 5));\n\n        let csv = \"A10BCE\";\n        assert_eq!(\"A10BC\", drop_unfinished_metrics_to_fit(csv, 5));\n\n        let csv = \"A\";\n        assert_eq!(\"A\", drop_unfinished_metrics_to_fit(csv, 5));\n\n        let csv = \"A,B\";\n        assert_eq!(\"A,B\", drop_unfinished_metrics_to_fit(csv, 5));\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-runtime/src/user_agent/test_data/feature_id_to_metric_value.json",
    "content": "{\n  \"RESOURCE_MODEL\": \"A\",\n  \"WAITER\": \"B\",\n  \"PAGINATOR\": \"C\",\n  \"RETRY_MODE_LEGACY\": \"D\",\n  \"RETRY_MODE_STANDARD\": \"E\",\n  \"RETRY_MODE_ADAPTIVE\": \"F\",\n  \"S3_TRANSFER\": \"G\",\n  \"S3_CRYPTO_V1N\": \"H\",\n  \"S3_CRYPTO_V2\": \"I\",\n  \"S3_EXPRESS_BUCKET\": \"J\",\n  \"S3_ACCESS_GRANTS\": \"K\",\n  \"GZIP_REQUEST_COMPRESSION\": \"L\",\n  \"PROTOCOL_RPC_V2_CBOR\": \"M\",\n  \"ENDPOINT_OVERRIDE\": \"N\",\n  \"ACCOUNT_ID_ENDPOINT\": \"O\",\n  \"ACCOUNT_ID_MODE_PREFERRED\": \"P\",\n  \"ACCOUNT_ID_MODE_DISABLED\": \"Q\",\n  \"ACCOUNT_ID_MODE_REQUIRED\": \"R\",\n  \"SIGV4A_SIGNING\": \"S\",\n  \"RESOLVED_ACCOUNT_ID\": \"T\",\n  \"FLEXIBLE_CHECKSUMS_REQ_CRC32\": \"U\",\n  \"FLEXIBLE_CHECKSUMS_REQ_CRC32C\": \"V\",\n  \"FLEXIBLE_CHECKSUMS_REQ_CRC64\": \"W\",\n  \"FLEXIBLE_CHECKSUMS_REQ_SHA1\": \"X\",\n  \"FLEXIBLE_CHECKSUMS_REQ_SHA256\": \"Y\",\n  \"FLEXIBLE_CHECKSUMS_REQ_WHEN_SUPPORTED\": \"Z\",\n  \"FLEXIBLE_CHECKSUMS_REQ_WHEN_REQUIRED\": \"a\",\n  \"FLEXIBLE_CHECKSUMS_RES_WHEN_SUPPORTED\": \"b\",\n  \"FLEXIBLE_CHECKSUMS_RES_WHEN_REQUIRED\": \"c\",\n  \"DDB_MAPPER\": \"d\",\n  \"CREDENTIALS_CODE\": \"e\",\n  \"CREDENTIALS_JVM_SYSTEM_PROPERTIES\": \"f\",\n  \"CREDENTIALS_ENV_VARS\": \"g\",\n  \"CREDENTIALS_ENV_VARS_STS_WEB_ID_TOKEN\": \"h\",\n  \"CREDENTIALS_STS_ASSUME_ROLE\": \"i\",\n  \"CREDENTIALS_STS_ASSUME_ROLE_SAML\": \"j\",\n  \"CREDENTIALS_STS_ASSUME_ROLE_WEB_ID\": \"k\",\n  \"CREDENTIALS_STS_FEDERATION_TOKEN\": \"l\",\n  \"CREDENTIALS_STS_SESSION_TOKEN\": \"m\",\n  \"CREDENTIALS_PROFILE\": \"n\",\n  \"CREDENTIALS_PROFILE_SOURCE_PROFILE\": \"o\",\n  \"CREDENTIALS_PROFILE_NAMED_PROVIDER\": \"p\",\n  \"CREDENTIALS_PROFILE_STS_WEB_ID_TOKEN\": \"q\",\n  \"CREDENTIALS_PROFILE_SSO\": \"r\",\n  \"CREDENTIALS_SSO\": \"s\",\n  \"CREDENTIALS_PROFILE_SSO_LEGACY\": \"t\",\n  \"CREDENTIALS_SSO_LEGACY\": \"u\",\n  \"CREDENTIALS_PROFILE_PROCESS\": \"v\",\n  \"CREDENTIALS_PROCESS\": \"w\",\n  \"CREDENTIALS_BOTO2_CONFIG_FILE\": \"x\",\n  \"CREDENTIALS_AWS_SDK_STORE\": \"y\",\n  \"CREDENTIALS_HTTP\": \"z\",\n  \"CREDENTIALS_IMDS\": \"0\",\n  \"SSO_LOGIN_DEVICE\": \"1\",\n  \"SSO_LOGIN_AUTH\": \"2\",\n  \"BEARER_SERVICE_ENV_VARS\": \"3\",\n  \"OBSERVABILITY_TRACING\" : \"4\",\n  \"OBSERVABILITY_METRICS\" : \"5\",\n  \"OBSERVABILITY_OTEL_TRACING\" : \"6\",\n  \"OBSERVABILITY_OTEL_METRICS\" : \"7\",\n  \"CREDENTIALS_COGNITO\" : \"8\",\n  \"S3_TRANSFER_UPLOAD_DIRECTORY\" : \"9\",\n  \"S3_TRANSFER_DOWNLOAD_DIRECTORY\": \"+\",\n  \"CLI_V1_TO_V2_MIGRATION_DEBUG_MODE\" : \"-\",\n  \"LOGIN_SAME_DEVICE\" : \"AA\",\n  \"LOGIN_CROSS_DEVICE\" : \"AB\",\n  \"CREDENTIALS_PROFILE_LOGIN\": \"AC\",\n  \"CREDENTIALS_LOGIN\": \"AD\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-runtime/src/user_agent/test_util.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Utilities for testing the User-Agent header\n\nuse regex_lite::Regex;\nuse std::sync::LazyLock;\n\n// regular expression pattern for base64 numeric values\n#[allow(dead_code)]\nstatic RE: LazyLock<Regex> = LazyLock::new(|| Regex::new(r\"m/([A-Za-z0-9+/=_,-]+)\").unwrap());\n\n/// Helper function to check metric values in user agent\nfn check_ua_metric_values(user_agent: &str, values: &[&str], should_contain: bool) {\n    match extract_ua_values(user_agent) {\n        Some(metrics) => {\n            let mut problematic_values = vec![];\n\n            for value in values.iter() {\n                let contains = metrics.contains(value);\n                if (should_contain && !contains) || (!should_contain && contains) {\n                    problematic_values.push(value);\n                }\n            }\n\n            if !problematic_values.is_empty() {\n                if should_contain {\n                    panic!(\"metric values {problematic_values:?} not found in `{user_agent}`\");\n                } else {\n                    panic!(\n                        \"metric values {problematic_values:?} unexpectedly found in `{user_agent}`\"\n                    );\n                }\n            }\n        }\n        None => {\n            if should_contain {\n                panic!(\"the pattern for business-metrics `m/(metric_id) *(comma metric_id)` not found in `{user_agent}`\");\n            }\n            // For \"does not contain\", no metrics pattern means the assertion passes\n        }\n    }\n}\n\n/// Asserts `user_agent` contains all metric values `values`\n///\n/// Refer to the end of the parent module file `user_agent.rs` for the complete ABNF specification\n/// of `business-metrics`.\npub fn assert_ua_contains_metric_values(user_agent: &str, values: &[&str]) {\n    check_ua_metric_values(user_agent, values, true);\n}\n\n/// Asserts `user_agent` does NOT contain any of the metric values `values`\n///\n/// Refer to the end of the parent module file `user_agent.rs` for the complete ABNF specification\n/// of `business-metrics`.\npub fn assert_ua_does_not_contain_metric_values(user_agent: &str, values: &[&str]) {\n    check_ua_metric_values(user_agent, values, false);\n}\n\n/// Extract the metric values from the `user_agent` string\npub fn extract_ua_values(user_agent: &str) -> Option<Vec<&str>> {\n    RE.find(user_agent).map(|matched| {\n        matched\n            .as_str()\n            .strip_prefix(\"m/\")\n            .expect(\"prefix `m/` is guaranteed to exist by regex match\")\n            .split(',')\n            .collect()\n    })\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n\n    #[test]\n    fn test_assert_ua_contains_metric_values() {\n        assert_ua_contains_metric_values(\"m/A\", &[]);\n        assert_ua_contains_metric_values(\"m/A\", &[\"A\"]);\n        assert_ua_contains_metric_values(\" m/A\", &[\"A\"]);\n        assert_ua_contains_metric_values(\"m/A \", &[\"A\"]);\n        assert_ua_contains_metric_values(\" m/A \", &[\"A\"]);\n        assert_ua_contains_metric_values(\"m/A,B\", &[\"B\"]);\n        assert_ua_contains_metric_values(\"m/A,B\", &[\"A\", \"B\"]);\n        assert_ua_contains_metric_values(\"m/A,B\", &[\"B\", \"A\"]);\n        assert_ua_contains_metric_values(\"m/A,B,C\", &[\"B\"]);\n        assert_ua_contains_metric_values(\"m/A,B,C\", &[\"B\", \"C\"]);\n        assert_ua_contains_metric_values(\"m/A,B,C\", &[\"A\", \"B\", \"C\"]);\n        assert_ua_contains_metric_values(\"m/A,B,C,AA\", &[\"AA\"]);\n        assert_ua_contains_metric_values(\"m/A,B,C=,AA\", &[\"C=\"]);\n        assert_ua_contains_metric_values(\n            \"aws-sdk-rust/0.123.test api/test-service/0.123 os/windows/XPSP3 lang/rust/1.50.0 m/A\",\n            &[\"A\"],\n        );\n        assert_ua_contains_metric_values(\n            \"aws-sdk-rust/0.123.test api/test-service/0.123 os/windows/XPSP3 lang/rust/1.50.0 m/A md/http#capture-request-handler\",\n            &[\"A\"]\n        );\n    }\n\n    #[test]\n    #[should_panic(expected = \"the pattern for business-metrics\")]\n    fn empty_ua_fails_assert() {\n        assert_ua_contains_metric_values(\"\", &[\"A\"]);\n    }\n\n    #[test]\n    #[should_panic(expected = \"the pattern for business-metrics\")]\n    fn invalid_business_metrics_pattern_fails_assert() {\n        assert_ua_contains_metric_values(\"mA\", &[\"A\"]);\n    }\n\n    #[test]\n    #[should_panic(expected = \"the pattern for business-metrics\")]\n    fn another_invalid_business_metrics_pattern_fails_assert() {\n        assert_ua_contains_metric_values(\"m/\", &[\"A\"]);\n    }\n\n    #[test]\n    #[should_panic(expected = \"metric values [\\\"\\\"] not found in `m/A`\")]\n    fn empty_metric_value_fails_assert() {\n        assert_ua_contains_metric_values(\"m/A\", &[\"\"]);\n    }\n\n    #[test]\n    #[should_panic(expected = \"metric values [\\\"A\\\"] not found in `m/AA`\")]\n    fn business_metrics_do_not_contain_given_metric_value() {\n        assert_ua_contains_metric_values(\"m/AA\", &[\"A\"]);\n    }\n\n    #[test]\n    #[should_panic(expected = \"the pattern for business-metrics\")]\n    fn ua_containing_no_business_metrics_fails_assert() {\n        assert_ua_contains_metric_values(\n            \"aws-sdk-rust/0.123.test api/test-service/0.123 os/windows/XPSP3 lang/rust/1.50.0\",\n            &[\"A\"],\n        );\n    }\n\n    #[test]\n    #[should_panic(expected = \"the pattern for business-metrics\")]\n    fn ua_containing_invalid_business_metrics_fails_assert() {\n        assert_ua_contains_metric_values(\n            \"aws-sdk-rust/0.123.test api/test-service/0.123 os/windows/XPSP3 lang/rust/1.50.0 mA\",\n            &[\"A\"],\n        );\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-runtime/src/user_agent.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_smithy_types::config_bag::{Storable, StoreReplace};\nuse aws_types::app_name::AppName;\nuse aws_types::build_metadata::{OsFamily, BUILD_METADATA};\nuse aws_types::os_shim_internal::Env;\nuse std::borrow::Cow;\nuse std::error::Error;\nuse std::fmt;\n\nmod interceptor;\nmod metrics;\n#[cfg(feature = \"test-util\")]\npub mod test_util;\n\nconst USER_AGENT_VERSION: &str = \"2.1\";\n\nuse crate::user_agent::metrics::BusinessMetrics;\npub use interceptor::UserAgentInterceptor;\npub use metrics::BusinessMetric;\n\n/// AWS User Agent\n///\n/// Ths struct should be inserted into the [`ConfigBag`](aws_smithy_types::config_bag::ConfigBag)\n/// during operation construction. The `UserAgentInterceptor` reads `AwsUserAgent`\n/// from the config bag and sets the `User-Agent` and `x-amz-user-agent` headers.\n#[derive(Clone, Debug)]\npub struct AwsUserAgent {\n    sdk_metadata: SdkMetadata,\n    ua_metadata: UaMetadata,\n    api_metadata: ApiMetadata,\n    os_metadata: OsMetadata,\n    language_metadata: LanguageMetadata,\n    exec_env_metadata: Option<ExecEnvMetadata>,\n    business_metrics: BusinessMetrics,\n    framework_metadata: Vec<FrameworkMetadata>,\n    app_name: Option<AppName>,\n    build_env_additional_metadata: Option<AdditionalMetadata>,\n    additional_metadata: Vec<AdditionalMetadata>,\n}\n\nimpl AwsUserAgent {\n    /// Load a User Agent configuration from the environment\n    ///\n    /// This utilizes [`BUILD_METADATA`](const@aws_types::build_metadata::BUILD_METADATA) from `aws_types`\n    /// to capture the Rust version & target platform. `ApiMetadata` provides\n    /// the version & name of the specific service.\n    pub fn new_from_environment(env: Env, api_metadata: ApiMetadata) -> Self {\n        let build_metadata = &BUILD_METADATA;\n        let sdk_metadata = SdkMetadata {\n            name: \"rust\",\n            version: build_metadata.core_pkg_version,\n        };\n        let ua_metadata = UaMetadata {\n            version: USER_AGENT_VERSION,\n        };\n        let os_metadata = OsMetadata {\n            os_family: &build_metadata.os_family,\n            version: None,\n        };\n        let exec_env_metadata = env\n            .get(\"AWS_EXECUTION_ENV\")\n            .ok()\n            .map(|name| ExecEnvMetadata { name });\n\n        // Retrieve additional metadata at compile-time from the AWS_SDK_RUST_BUILD_UA_METADATA env var\n        let build_env_additional_metadata = option_env!(\"AWS_SDK_RUST_BUILD_UA_METADATA\")\n            .and_then(|value| AdditionalMetadata::new(value).ok());\n\n        AwsUserAgent {\n            sdk_metadata,\n            ua_metadata,\n            api_metadata,\n            os_metadata,\n            language_metadata: LanguageMetadata {\n                lang: \"rust\",\n                version: BUILD_METADATA.rust_version,\n                extras: Default::default(),\n            },\n            exec_env_metadata,\n            framework_metadata: Default::default(),\n            business_metrics: Default::default(),\n            app_name: Default::default(),\n            build_env_additional_metadata,\n            additional_metadata: Default::default(),\n        }\n    }\n\n    /// For test purposes, construct an environment-independent User Agent\n    ///\n    /// Without this, running CI on a different platform would produce different user agent strings\n    pub fn for_tests() -> Self {\n        Self {\n            sdk_metadata: SdkMetadata {\n                name: \"rust\",\n                version: \"0.123.test\",\n            },\n            ua_metadata: UaMetadata { version: \"0.1\" },\n            api_metadata: ApiMetadata {\n                service_id: \"test-service\".into(),\n                version: \"0.123\",\n            },\n            os_metadata: OsMetadata {\n                os_family: &OsFamily::Windows,\n                version: Some(\"XPSP3\".to_string()),\n            },\n            language_metadata: LanguageMetadata {\n                lang: \"rust\",\n                version: \"1.50.0\",\n                extras: Default::default(),\n            },\n            exec_env_metadata: None,\n            business_metrics: Default::default(),\n            framework_metadata: Vec::new(),\n            app_name: None,\n            build_env_additional_metadata: None,\n            additional_metadata: Vec::new(),\n        }\n    }\n\n    #[deprecated(\n        since = \"1.4.0\",\n        note = \"This is a no-op; use `with_business_metric` instead.\"\n    )]\n    #[allow(unused_mut)]\n    #[allow(deprecated)]\n    #[doc(hidden)]\n    /// Adds feature metadata to the user agent.\n    pub fn with_feature_metadata(mut self, _metadata: FeatureMetadata) -> Self {\n        self\n    }\n\n    #[deprecated(\n        since = \"1.4.0\",\n        note = \"This is a no-op; use `add_business_metric` instead.\"\n    )]\n    #[allow(deprecated)]\n    #[allow(unused_mut)]\n    #[doc(hidden)]\n    /// Adds feature metadata to the user agent.\n    pub fn add_feature_metadata(&mut self, _metadata: FeatureMetadata) -> &mut Self {\n        self\n    }\n\n    #[deprecated(\n        since = \"1.4.0\",\n        note = \"This is a no-op; use `with_business_metric` instead.\"\n    )]\n    #[allow(deprecated)]\n    #[allow(unused_mut)]\n    #[doc(hidden)]\n    /// Adds config metadata to the user agent.\n    pub fn with_config_metadata(mut self, _metadata: ConfigMetadata) -> Self {\n        self\n    }\n\n    #[deprecated(\n        since = \"1.4.0\",\n        note = \"This is a no-op; use `add_business_metric` instead.\"\n    )]\n    #[allow(deprecated)]\n    #[allow(unused_mut)]\n    #[doc(hidden)]\n    /// Adds config metadata to the user agent.\n    pub fn add_config_metadata(&mut self, _metadata: ConfigMetadata) -> &mut Self {\n        self\n    }\n\n    #[doc(hidden)]\n    /// Adds business metric to the user agent.\n    pub fn with_business_metric(mut self, metric: BusinessMetric) -> Self {\n        self.business_metrics.push(metric);\n        self\n    }\n\n    #[doc(hidden)]\n    /// Adds business metric to the user agent.\n    pub fn add_business_metric(&mut self, metric: BusinessMetric) -> &mut Self {\n        self.business_metrics.push(metric);\n        self\n    }\n\n    #[doc(hidden)]\n    /// Adds framework metadata to the user agent.\n    pub fn with_framework_metadata(mut self, metadata: FrameworkMetadata) -> Self {\n        self.framework_metadata.push(metadata);\n        self\n    }\n\n    #[doc(hidden)]\n    /// Adds framework metadata to the user agent.\n    pub fn add_framework_metadata(&mut self, metadata: FrameworkMetadata) -> &mut Self {\n        self.framework_metadata.push(metadata);\n        self\n    }\n\n    /// Adds additional metadata to the user agent.\n    pub fn with_additional_metadata(mut self, metadata: AdditionalMetadata) -> Self {\n        self.additional_metadata.push(metadata);\n        self\n    }\n\n    /// Adds additional metadata to the user agent.\n    pub fn add_additional_metadata(&mut self, metadata: AdditionalMetadata) -> &mut Self {\n        self.additional_metadata.push(metadata);\n        self\n    }\n\n    /// Sets the app name for the user agent.\n    pub fn with_app_name(mut self, app_name: AppName) -> Self {\n        self.app_name = Some(app_name);\n        self\n    }\n\n    /// Sets the app name for the user agent.\n    pub fn set_app_name(&mut self, app_name: AppName) -> &mut Self {\n        self.app_name = Some(app_name);\n        self\n    }\n\n    /// Generate a new-style user agent style header\n    ///\n    /// This header should be set at `x-amz-user-agent`\n    pub fn aws_ua_header(&self) -> String {\n        /*\n        ABNF for the user agent (see the bottom of the file for complete ABNF):\n        ua-string = sdk-metadata RWS\n                    ua-metadata RWS\n                    [api-metadata RWS]\n                    os-metadata RWS\n                    language-metadata RWS\n                    [env-metadata RWS]\n                        ; ordering is not strictly required in the following section\n                    [business-metrics]\n                    [appId]\n                    *(framework-metadata RWS)\n        */\n        let mut ua_value = String::new();\n        use std::fmt::Write;\n        // unwrap calls should never fail because string formatting will always succeed.\n        write!(ua_value, \"{} \", &self.sdk_metadata).unwrap();\n        write!(ua_value, \"{} \", &self.ua_metadata).unwrap();\n        write!(ua_value, \"{} \", &self.api_metadata).unwrap();\n        write!(ua_value, \"{} \", &self.os_metadata).unwrap();\n        write!(ua_value, \"{} \", &self.language_metadata).unwrap();\n        if let Some(ref env_meta) = self.exec_env_metadata {\n            write!(ua_value, \"{env_meta} \").unwrap();\n        }\n        if !self.business_metrics.is_empty() {\n            write!(ua_value, \"{} \", &self.business_metrics).unwrap()\n        }\n        for framework in &self.framework_metadata {\n            write!(ua_value, \"{framework} \").unwrap();\n        }\n        for additional_metadata in &self.additional_metadata {\n            write!(ua_value, \"{additional_metadata} \").unwrap();\n        }\n        if let Some(app_name) = &self.app_name {\n            write!(ua_value, \"app/{app_name}\").unwrap();\n        }\n        if let Some(additional_metadata) = &self.build_env_additional_metadata {\n            write!(ua_value, \"{additional_metadata}\").unwrap();\n        }\n        if ua_value.ends_with(' ') {\n            ua_value.truncate(ua_value.len() - 1);\n        }\n        ua_value\n    }\n\n    /// Generate an old-style User-Agent header for backward compatibility\n    ///\n    /// This header is intended to be set at `User-Agent`\n    pub fn ua_header(&self) -> String {\n        let mut ua_value = String::new();\n        use std::fmt::Write;\n        write!(ua_value, \"{} \", &self.sdk_metadata).unwrap();\n        write!(ua_value, \"{} \", &self.os_metadata).unwrap();\n        write!(ua_value, \"{}\", &self.language_metadata).unwrap();\n        ua_value\n    }\n}\n\nimpl Storable for AwsUserAgent {\n    type Storer = StoreReplace<Self>;\n}\n\n#[derive(Clone, Copy, Debug)]\nstruct SdkMetadata {\n    name: &'static str,\n    version: &'static str,\n}\n\nimpl fmt::Display for SdkMetadata {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        write!(f, \"aws-sdk-{}/{}\", self.name, self.version)\n    }\n}\n\n#[derive(Clone, Copy, Debug)]\nstruct UaMetadata {\n    version: &'static str,\n}\n\nimpl fmt::Display for UaMetadata {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        write!(f, \"ua/{}\", self.version)\n    }\n}\n\n/// Metadata about the client that's making the call.\n#[derive(Clone, Debug)]\npub struct ApiMetadata {\n    service_id: Cow<'static, str>,\n    version: &'static str,\n}\n\nimpl ApiMetadata {\n    /// Creates new `ApiMetadata`.\n    pub const fn new(service_id: &'static str, version: &'static str) -> Self {\n        Self {\n            service_id: Cow::Borrowed(service_id),\n            version,\n        }\n    }\n}\n\nimpl fmt::Display for ApiMetadata {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        write!(f, \"api/{}/{}\", self.service_id, self.version)\n    }\n}\n\nimpl Storable for ApiMetadata {\n    type Storer = StoreReplace<Self>;\n}\n\n/// Error for when an user agent metadata doesn't meet character requirements.\n///\n/// Metadata may only have alphanumeric characters and any of these characters:\n/// ```text\n/// !#$%&'*+-.^_`|~\n/// ```\n/// Spaces are not allowed.\n#[derive(Debug)]\n#[non_exhaustive]\npub struct InvalidMetadataValue;\n\nimpl Error for InvalidMetadataValue {}\n\nimpl fmt::Display for InvalidMetadataValue {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        write!(\n            f,\n            \"User agent metadata can only have alphanumeric characters, or any of \\\n             '!' |  '#' |  '$' |  '%' |  '&' |  '\\\\'' |  '*' |  '+' |  '-' | \\\n             '.' |  '^' |  '_' |  '`' |  '|' |  '~'\"\n        )\n    }\n}\n\nfn validate_metadata(value: Cow<'static, str>) -> Result<Cow<'static, str>, InvalidMetadataValue> {\n    fn valid_character(c: char) -> bool {\n        match c {\n            _ if c.is_ascii_alphanumeric() => true,\n            '!' | '#' | '$' | '%' | '&' | '\\'' | '*' | '+' | '-' | '.' | '^' | '_' | '`' | '|'\n            | '~' => true,\n            _ => false,\n        }\n    }\n    if !value.chars().all(valid_character) {\n        return Err(InvalidMetadataValue);\n    }\n    Ok(value)\n}\n\n#[doc(hidden)]\n/// Additional metadata that can be bundled with framework or feature metadata.\n#[derive(Clone, Debug)]\n#[non_exhaustive]\npub struct AdditionalMetadata {\n    value: Cow<'static, str>,\n}\n\nimpl AdditionalMetadata {\n    /// Creates `AdditionalMetadata`.\n    ///\n    /// This will result in `InvalidMetadataValue` if the given value isn't alphanumeric or\n    /// has characters other than the following:\n    /// ```text\n    /// !#$%&'*+-.^_`|~\n    /// ```\n    pub fn new(value: impl Into<Cow<'static, str>>) -> Result<Self, InvalidMetadataValue> {\n        Ok(Self {\n            value: validate_metadata(value.into())?,\n        })\n    }\n}\n\nimpl fmt::Display for AdditionalMetadata {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        // additional-metadata = \"md/\" ua-pair\n        write!(f, \"md/{}\", self.value)\n    }\n}\n\n#[derive(Clone, Debug, Default)]\nstruct AdditionalMetadataList(Vec<AdditionalMetadata>);\n\nimpl AdditionalMetadataList {\n    fn push(&mut self, metadata: AdditionalMetadata) {\n        self.0.push(metadata);\n    }\n}\n\nimpl fmt::Display for AdditionalMetadataList {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        for metadata in &self.0 {\n            write!(f, \" {metadata}\")?;\n        }\n        Ok(())\n    }\n}\n\n#[deprecated(since = \"1.4.0\", note = \"Replaced by `BusinessMetric`.\")]\n#[doc(hidden)]\n/// Metadata about a feature that is being used in the SDK.\n#[derive(Clone, Debug)]\n#[non_exhaustive]\npub struct FeatureMetadata {\n    name: Cow<'static, str>,\n    version: Option<Cow<'static, str>>,\n    additional: AdditionalMetadataList,\n}\n\n#[allow(deprecated)]\nimpl FeatureMetadata {\n    /// Creates `FeatureMetadata`.\n    ///\n    /// This will result in `InvalidMetadataValue` if the given value isn't alphanumeric or\n    /// has characters other than the following:\n    /// ```text\n    /// !#$%&'*+-.^_`|~\n    /// ```\n    pub fn new(\n        name: impl Into<Cow<'static, str>>,\n        version: Option<Cow<'static, str>>,\n    ) -> Result<Self, InvalidMetadataValue> {\n        Ok(Self {\n            name: validate_metadata(name.into())?,\n            version: version.map(validate_metadata).transpose()?,\n            additional: Default::default(),\n        })\n    }\n\n    /// Bundles additional arbitrary metadata with this feature metadata.\n    pub fn with_additional(mut self, metadata: AdditionalMetadata) -> Self {\n        self.additional.push(metadata);\n        self\n    }\n}\n\n#[allow(deprecated)]\nimpl fmt::Display for FeatureMetadata {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        // feat-metadata = \"ft/\" name [\"/\" version] *(RWS additional-metadata)\n        if let Some(version) = &self.version {\n            write!(f, \"ft/{}/{}{}\", self.name, version, self.additional)\n        } else {\n            write!(f, \"ft/{}{}\", self.name, self.additional)\n        }\n    }\n}\n\n#[deprecated(since = \"1.4.0\", note = \"Replaced by `BusinessMetric`.\")]\n#[doc(hidden)]\n/// Metadata about a config value that is being used in the SDK.\n#[derive(Clone, Debug)]\n#[non_exhaustive]\npub struct ConfigMetadata {\n    config: Cow<'static, str>,\n    value: Option<Cow<'static, str>>,\n}\n\n#[allow(deprecated)]\nimpl ConfigMetadata {\n    /// Creates `ConfigMetadata`.\n    ///\n    /// This will result in `InvalidMetadataValue` if the given value isn't alphanumeric or\n    /// has characters other than the following:\n    /// ```text\n    /// !#$%&'*+-.^_`|~\n    /// ```\n    pub fn new(\n        config: impl Into<Cow<'static, str>>,\n        value: Option<Cow<'static, str>>,\n    ) -> Result<Self, InvalidMetadataValue> {\n        Ok(Self {\n            config: validate_metadata(config.into())?,\n            value: value.map(validate_metadata).transpose()?,\n        })\n    }\n}\n\n#[allow(deprecated)]\nimpl fmt::Display for ConfigMetadata {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        // config-metadata = \"cfg/\" config [\"/\" value]\n        if let Some(value) = &self.value {\n            write!(f, \"cfg/{}/{}\", self.config, value)\n        } else {\n            write!(f, \"cfg/{}\", self.config)\n        }\n    }\n}\n\n#[doc(hidden)]\n/// Metadata about a software framework that is being used with the SDK.\n#[derive(Clone, Debug)]\n#[non_exhaustive]\npub struct FrameworkMetadata {\n    name: Cow<'static, str>,\n    version: Option<Cow<'static, str>>,\n    additional: AdditionalMetadataList,\n}\n\nimpl FrameworkMetadata {\n    /// Creates `FrameworkMetadata`.\n    ///\n    /// This will result in `InvalidMetadataValue` if the given value isn't alphanumeric or\n    /// has characters other than the following:\n    /// ```text\n    /// !#$%&'*+-.^_`|~\n    /// ```\n    pub fn new(\n        name: impl Into<Cow<'static, str>>,\n        version: Option<Cow<'static, str>>,\n    ) -> Result<Self, InvalidMetadataValue> {\n        Ok(Self {\n            name: validate_metadata(name.into())?,\n            version: version.map(validate_metadata).transpose()?,\n            additional: Default::default(),\n        })\n    }\n\n    /// Bundles additional arbitrary metadata with this framework metadata.\n    pub fn with_additional(mut self, metadata: AdditionalMetadata) -> Self {\n        self.additional.push(metadata);\n        self\n    }\n}\n\nimpl fmt::Display for FrameworkMetadata {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        // framework-metadata = \"lib/\" name [\"/\" version] *(RWS additional-metadata)\n        if let Some(version) = &self.version {\n            write!(f, \"lib/{}/{}{}\", self.name, version, self.additional)\n        } else {\n            write!(f, \"lib/{}{}\", self.name, self.additional)\n        }\n    }\n}\n\n#[derive(Clone, Debug)]\nstruct OsMetadata {\n    os_family: &'static OsFamily,\n    version: Option<String>,\n}\n\nimpl fmt::Display for OsMetadata {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        let os_family = match self.os_family {\n            OsFamily::Windows => \"windows\",\n            OsFamily::Linux => \"linux\",\n            OsFamily::Macos => \"macos\",\n            OsFamily::Android => \"android\",\n            OsFamily::Ios => \"ios\",\n            OsFamily::Other => \"other\",\n        };\n        write!(f, \"os/{os_family}\")?;\n        if let Some(ref version) = self.version {\n            write!(f, \"/{version}\")?;\n        }\n        Ok(())\n    }\n}\n\n#[derive(Clone, Debug)]\nstruct LanguageMetadata {\n    lang: &'static str,\n    version: &'static str,\n    extras: AdditionalMetadataList,\n}\nimpl fmt::Display for LanguageMetadata {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        // language-metadata = \"lang/\" language \"/\" version *(RWS additional-metadata)\n        write!(f, \"lang/{}/{}{}\", self.lang, self.version, self.extras)\n    }\n}\n\n#[derive(Clone, Debug)]\nstruct ExecEnvMetadata {\n    name: String,\n}\nimpl fmt::Display for ExecEnvMetadata {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        write!(f, \"exec-env/{}\", &self.name)\n    }\n}\n\n#[cfg(test)]\nmod test {\n    use super::*;\n    use aws_types::app_name::AppName;\n    use aws_types::build_metadata::OsFamily;\n    use aws_types::os_shim_internal::Env;\n    use std::borrow::Cow;\n\n    fn make_deterministic(ua: &mut AwsUserAgent) {\n        // hard code some variable things for a deterministic test\n        ua.sdk_metadata.version = \"0.1\";\n        ua.ua_metadata.version = \"0.1\";\n        ua.language_metadata.version = \"1.50.0\";\n        ua.os_metadata.os_family = &OsFamily::Macos;\n        ua.os_metadata.version = Some(\"1.15\".to_string());\n    }\n\n    #[test]\n    fn generate_a_valid_ua() {\n        let api_metadata = ApiMetadata {\n            service_id: \"dynamodb\".into(),\n            version: \"123\",\n        };\n        let mut ua = AwsUserAgent::new_from_environment(Env::from_slice(&[]), api_metadata);\n        make_deterministic(&mut ua);\n        assert_eq!(\n            ua.aws_ua_header(),\n            \"aws-sdk-rust/0.1 ua/0.1 api/dynamodb/123 os/macos/1.15 lang/rust/1.50.0\"\n        );\n        assert_eq!(\n            ua.ua_header(),\n            \"aws-sdk-rust/0.1 os/macos/1.15 lang/rust/1.50.0\"\n        );\n    }\n\n    #[test]\n    fn generate_a_valid_ua_with_execution_env() {\n        let api_metadata = ApiMetadata {\n            service_id: \"dynamodb\".into(),\n            version: \"123\",\n        };\n        let mut ua = AwsUserAgent::new_from_environment(\n            Env::from_slice(&[(\"AWS_EXECUTION_ENV\", \"lambda\")]),\n            api_metadata,\n        );\n        make_deterministic(&mut ua);\n        assert_eq!(\n            ua.aws_ua_header(),\n            \"aws-sdk-rust/0.1 ua/0.1 api/dynamodb/123 os/macos/1.15 lang/rust/1.50.0 exec-env/lambda\"\n        );\n        assert_eq!(\n            ua.ua_header(),\n            \"aws-sdk-rust/0.1 os/macos/1.15 lang/rust/1.50.0\"\n        );\n    }\n\n    #[test]\n    fn generate_a_valid_ua_with_frameworks() {\n        let api_metadata = ApiMetadata {\n            service_id: \"dynamodb\".into(),\n            version: \"123\",\n        };\n        let mut ua = AwsUserAgent::new_from_environment(Env::from_slice(&[]), api_metadata)\n            .with_framework_metadata(\n                FrameworkMetadata::new(\"some-framework\", Some(Cow::Borrowed(\"1.3\")))\n                    .unwrap()\n                    .with_additional(AdditionalMetadata::new(\"something\").unwrap()),\n            )\n            .with_framework_metadata(FrameworkMetadata::new(\"other\", None).unwrap());\n        make_deterministic(&mut ua);\n        assert_eq!(\n            ua.aws_ua_header(),\n            \"aws-sdk-rust/0.1 ua/0.1 api/dynamodb/123 os/macos/1.15 lang/rust/1.50.0 lib/some-framework/1.3 md/something lib/other\"\n        );\n        assert_eq!(\n            ua.ua_header(),\n            \"aws-sdk-rust/0.1 os/macos/1.15 lang/rust/1.50.0\"\n        );\n    }\n\n    #[test]\n    fn generate_a_valid_ua_with_app_name() {\n        let api_metadata = ApiMetadata {\n            service_id: \"dynamodb\".into(),\n            version: \"123\",\n        };\n        let mut ua = AwsUserAgent::new_from_environment(Env::from_slice(&[]), api_metadata)\n            .with_app_name(AppName::new(\"my_app\").unwrap());\n        make_deterministic(&mut ua);\n        assert_eq!(\n            ua.aws_ua_header(),\n            \"aws-sdk-rust/0.1 ua/0.1 api/dynamodb/123 os/macos/1.15 lang/rust/1.50.0 app/my_app\"\n        );\n        assert_eq!(\n            ua.ua_header(),\n            \"aws-sdk-rust/0.1 os/macos/1.15 lang/rust/1.50.0\"\n        );\n    }\n\n    #[test]\n    fn generate_a_valid_ua_with_build_env_additional_metadata() {\n        let mut ua = AwsUserAgent::for_tests();\n        ua.build_env_additional_metadata = Some(AdditionalMetadata::new(\"asdf\").unwrap());\n        assert_eq!(\n            ua.aws_ua_header(),\n            \"aws-sdk-rust/0.123.test ua/0.1 api/test-service/0.123 os/windows/XPSP3 lang/rust/1.50.0 md/asdf\"\n        );\n        assert_eq!(\n            ua.ua_header(),\n            \"aws-sdk-rust/0.123.test os/windows/XPSP3 lang/rust/1.50.0\"\n        );\n    }\n\n    #[test]\n    fn generate_a_valid_ua_with_business_metrics() {\n        // single metric ID\n        {\n            let ua = AwsUserAgent::for_tests().with_business_metric(BusinessMetric::ResourceModel);\n            assert_eq!(\n                ua.aws_ua_header(),\n                \"aws-sdk-rust/0.123.test ua/0.1 api/test-service/0.123 os/windows/XPSP3 lang/rust/1.50.0 m/A\"\n            );\n            assert_eq!(\n                ua.ua_header(),\n                \"aws-sdk-rust/0.123.test os/windows/XPSP3 lang/rust/1.50.0\"\n            );\n        }\n        // multiple metric IDs\n        {\n            let ua = AwsUserAgent::for_tests()\n                .with_business_metric(BusinessMetric::RetryModeAdaptive)\n                .with_business_metric(BusinessMetric::S3Transfer)\n                .with_business_metric(BusinessMetric::S3ExpressBucket);\n            assert_eq!(\n                ua.aws_ua_header(),\n                \"aws-sdk-rust/0.123.test ua/0.1 api/test-service/0.123 os/windows/XPSP3 lang/rust/1.50.0 m/F,G,J\"\n            );\n            assert_eq!(\n                ua.ua_header(),\n                \"aws-sdk-rust/0.123.test os/windows/XPSP3 lang/rust/1.50.0\"\n            );\n        }\n    }\n}\n\n/*\nAppendix: User Agent ABNF\nsdk-ua-header                 = \"x-amz-user-agent:\" OWS ua-string OWS\nua-pair                       = ua-name [\"/\" ua-value]\nua-name                       = token\nua-value                      = token\nversion                       = token\nname                          = token\nservice-id                    = token\nsdk-name                      = java / ruby / php / dotnet / python / cli / kotlin / rust / js / cpp / go / go-v2\nos-family                     = windows / linux / macos / android / ios / other\nconfig                        = retry-mode\nadditional-metadata           = \"md/\" ua-pair\nsdk-metadata                  = \"aws-sdk-\" sdk-name \"/\" version\napi-metadata                  = \"api/\" service-id \"/\" version\nos-metadata                   = \"os/\" os-family [\"/\" version]\nlanguage-metadata             = \"lang/\" language \"/\" version *(RWS additional-metadata)\nenv-metadata                  = \"exec-env/\" name\nframework-metadata            = \"lib/\" name [\"/\" version] *(RWS additional-metadata)\napp-id                        = \"app/\" name\nbuild-env-additional-metadata = \"md/\" value\nua-metadata                   = \"ua/2.1\"\nbusiness-metrics              = \"m/\" metric_id *(comma metric_id)\nmetric_id                     = 1*m_char\nm_char                        = DIGIT / ALPHA / \"+\" / \"-\"\ncomma                         = \",\"\nua-string                     = sdk-metadata RWS\n                                ua-metadata RWS\n                                [api-metadata RWS]\n                                os-metadata RWS\n                                language-metadata RWS\n                                [env-metadata RWS]\n                                       ; ordering is not strictly required in the following section\n                                [business-metrics]\n                                [app-id]\n                                [build-env-additional-metadata]\n                                *(framework-metadata RWS)\n\n# New metadata field might be added in the future and they must follow this format\nprefix               = token\nmetadata             = prefix \"/\" ua-pair\n\n# token, RWS and OWS are defined in [RFC 7230](https://tools.ietf.org/html/rfc7230)\nOWS            = *( SP / HTAB )\n               ; optional whitespace\nRWS            = 1*( SP / HTAB )\n               ; required whitespace\ntoken          = 1*tchar\ntchar          = \"!\" / \"#\" / \"$\" / \"%\" / \"&\" / \"'\" / \"*\" / \"+\" / \"-\" / \".\" /\n                 \"^\" / \"_\" / \"`\" / \"|\" / \"~\" / DIGIT / ALPHA\n*/\n"
  },
  {
    "path": "aws/rust-runtime/aws-runtime/test-data/file-location-tests.json",
    "content": "{\n  \"description\": [\n    \"These are test descriptions that specify which files and profiles should be loaded based on the specified environment \",\n    \"variables.\",\n    \"See 'file-location-tests.schema.json' for a description of this file's structure.\"\n  ],\n\n  \"tests\": [\n    {\n      \"name\": \"User home is loaded from $HOME with highest priority on non-windows platforms.\",\n      \"environment\": {\n        \"HOME\": \"/home/user\",\n        \"USERPROFILE\": \"ignored\",\n        \"HOMEDRIVE\": \"ignored\",\n        \"HOMEPATH\": \"ignored\"\n      },\n      \"platform\": \"linux\",\n      \"profile\": \"default\",\n      \"configLocation\": \"/home/user/.aws/config\",\n      \"credentialsLocation\": \"/home/user/.aws/credentials\"\n    },\n\n    {\n      \"name\": \"User home is loaded from $HOME with highest priority on windows platforms.\",\n      \"environment\": {\n        \"HOME\": \"C:\\\\users\\\\user\",\n        \"USERPROFILE\": \"ignored\",\n        \"HOMEDRIVE\": \"ignored\",\n        \"HOMEPATH\": \"ignored\"\n      },\n      \"platform\": \"windows\",\n      \"profile\": \"default\",\n      \"configLocation\": \"C:\\\\users\\\\user\\\\.aws\\\\config\",\n      \"credentialsLocation\": \"C:\\\\users\\\\user\\\\.aws\\\\credentials\"\n    },\n\n    {\n      \"name\": \"User home is loaded from $USERPROFILE on windows platforms when $HOME is not set.\",\n      \"environment\": {\n        \"USERPROFILE\": \"C:\\\\users\\\\user\",\n        \"HOMEDRIVE\": \"ignored\",\n        \"HOMEPATH\": \"ignored\"\n      },\n      \"platform\": \"windows\",\n      \"profile\": \"default\",\n      \"configLocation\": \"C:\\\\users\\\\user\\\\.aws\\\\config\",\n      \"credentialsLocation\": \"C:\\\\users\\\\user\\\\.aws\\\\credentials\"\n    },\n\n    {\n      \"name\": \"User home is loaded from $HOMEDRIVE$HOMEPATH on windows platforms when $HOME and $USERPROFILE are not set.\",\n      \"environment\": {\n        \"HOMEDRIVE\": \"C:\",\n        \"HOMEPATH\": \"\\\\users\\\\user\"\n      },\n      \"platform\": \"windows\",\n      \"profile\": \"default\",\n      \"configLocation\": \"C:\\\\users\\\\user\\\\.aws\\\\config\",\n      \"credentialsLocation\": \"C:\\\\users\\\\user\\\\.aws\\\\credentials\"\n    },\n\n    {\n      \"name\": \"The default config location can be overridden by the user on non-windows platforms.\",\n      \"environment\": {\n        \"AWS_CONFIG_FILE\": \"/other/path/config\",\n        \"HOME\": \"/home/user\"\n      },\n      \"platform\": \"linux\",\n      \"configLocation\": \"/other/path/config\",\n      \"credentialsLocation\": \"/home/user/.aws/credentials\"\n    },\n\n    {\n      \"name\": \"The default credentials location can be overridden by the user on non-windows platforms.\",\n      \"environment\": {\n        \"AWS_SHARED_CREDENTIALS_FILE\": \"/other/path/credentials\",\n        \"HOME\": \"/home/user\"\n      },\n      \"platform\": \"linux\",\n      \"profile\": \"default\",\n      \"configLocation\": \"/home/user/.aws/config\",\n      \"credentialsLocation\": \"/other/path/credentials\"\n    },\n\n    {\n      \"name\": \"The default credentials location can be overridden by the user on windows platforms.\",\n      \"environment\": {\n        \"AWS_CONFIG_FILE\": \"C:\\\\other\\\\path\\\\config\",\n        \"HOME\": \"C:\\\\users\\\\user\"\n      },\n      \"platform\": \"windows\",\n      \"profile\": \"default\",\n      \"configLocation\": \"C:\\\\other\\\\path\\\\config\",\n      \"credentialsLocation\": \"C:\\\\users\\\\user\\\\.aws\\\\credentials\"\n    },\n\n    {\n      \"name\": \"The default credentials location can be overridden by the user on windows platforms.\",\n      \"environment\": {\n        \"AWS_SHARED_CREDENTIALS_FILE\": \"C:\\\\other\\\\path\\\\credentials\",\n        \"HOME\": \"C:\\\\users\\\\user\"\n      },\n      \"platform\": \"windows\",\n      \"profile\": \"default\",\n      \"configLocation\": \"C:\\\\users\\\\user\\\\.aws\\\\config\",\n      \"credentialsLocation\": \"C:\\\\other\\\\path\\\\credentials\"\n    },\n\n    {\n      \"name\": \"The default profile can be overridden via environment variable.\",\n      \"environment\": {\n        \"AWS_PROFILE\": \"other\",\n        \"HOME\": \"/home/user\"\n      },\n      \"platform\": \"linux\",\n      \"profile\": \"other\",\n      \"configLocation\": \"/home/user/.aws/config\",\n      \"credentialsLocation\": \"/home/user/.aws/credentials\"\n    }\n  ]\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-runtime/test-data/profile-parser-tests.json",
    "content": "{\n  \"description\": [\n    \"These are test descriptions that describe how to convert a raw configuration and credentials file into an \",\n    \"in-memory representation of the profile file.\",\n    \"See 'parser-tests.schema.json' for a description of this file's structure.\"\n  ],\n  \"tests\": [\n    {\n      \"name\": \"Empty files have no profiles.\",\n      \"input\": {\n        \"configFile\": \"\"\n      },\n      \"output\": {\n        \"config\": {\n          \"profiles\": {}\n        }\n      }\n    },\n    {\n      \"name\": \"Empty profiles have no properties.\",\n      \"input\": {\n        \"configFile\": \"[profile foo]\"\n      },\n      \"output\": {\n        \"config\": {\n          \"profiles\": {\n            \"foo\": {}\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"Profile names support alphanumeric characters and - / . % @ _ : +\",\n      \"input\": {\n        \"configFile\": \"[profile some-thing:long/the_one%only.foo@bar+]\\n[profile foo!bar]\"\n      },\n      \"output\": {\n        \"config\": {\n          \"profiles\": {\n            \"some-thing:long/the_one%only.foo@bar+\": {}\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"Profile definitions must end with brackets.\",\n      \"input\": {\n        \"configFile\": \"[profile foo\"\n      },\n      \"output\": {\n        \"errorContaining\": \"Profile definition must end with ']'\"\n      }\n    },\n    {\n      \"name\": \"Profile names should be trimmed.\",\n      \"input\": {\n        \"configFile\": \"[profile \\tfoo \\t]\"\n      },\n      \"output\": {\n        \"config\": {\n          \"profiles\": {\n            \"foo\": {}\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"Tabs can separate profile names from profile prefix.\",\n      \"input\": {\n        \"configFile\": \"[profile\\tfoo]\"\n      },\n      \"output\": {\n        \"config\": {\n          \"profiles\": {\n            \"foo\": {}\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"Properties must be defined in a profile.\",\n      \"input\": {\n        \"configFile\": \"name = value\"\n      },\n      \"output\": {\n        \"errorContaining\": \"Expected a profile definition\"\n      }\n    },\n    {\n      \"name\": \"Profiles can contain properties.\",\n      \"input\": {\n        \"configFile\": \"[profile foo]\\nname = value\"\n      },\n      \"output\": {\n        \"config\": {\n          \"profiles\": {\n            \"foo\": {\n              \"name\": \"value\"\n            }\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"Windows style line endings are supported.\",\n      \"input\": {\n        \"configFile\": \"[profile foo]\\r\\nname = value\"\n      },\n      \"output\": {\n        \"config\": {\n          \"profiles\": {\n            \"foo\": {\n              \"name\": \"value\"\n            }\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"Equals signs are supported in property values.\",\n      \"input\": {\n        \"configFile\": \"[profile foo]\\nname = val=ue\"\n      },\n      \"output\": {\n        \"config\": {\n          \"profiles\": {\n            \"foo\": {\n              \"name\": \"val=ue\"\n            }\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"Unicode characters are supported in property values.\",\n      \"input\": {\n        \"configFile\": \"[profile foo]\\nname = ðŸ˜‚\"\n      },\n      \"output\": {\n        \"config\": {\n          \"profiles\": {\n            \"foo\": {\n              \"name\": \"ðŸ˜‚\"\n            }\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"Profiles can contain multiple properties.\",\n      \"input\": {\n        \"configFile\": \"[profile foo]\\nname = value\\nname2 = value2\"\n      },\n      \"output\": {\n        \"config\": {\n          \"profiles\": {\n            \"foo\": {\n              \"name\": \"value\",\n              \"name2\": \"value2\"\n            }\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"Profiles can contain multiple properties.\",\n      \"input\": {\n        \"configFile\": \"[profile foo]\\nname = value\\nname2 = value2\"\n      },\n      \"output\": {\n        \"config\": {\n          \"profiles\": {\n            \"foo\": {\n              \"name\": \"value\",\n              \"name2\": \"value2\"\n            }\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"Property keys and values are trimmed.\",\n      \"input\": {\n        \"configFile\": \"[profile foo]\\nname \\t=  \\tvalue \\t\"\n      },\n      \"output\": {\n        \"config\": {\n          \"profiles\": {\n            \"foo\": {\n              \"name\": \"value\"\n            }\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"Property values can be empty.\",\n      \"input\": {\n        \"configFile\": \"[profile foo]\\nname =\"\n      },\n      \"output\": {\n        \"config\": {\n          \"profiles\": {\n            \"foo\": {\n              \"name\": \"\"\n            }\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"Property key cannot be empty.\",\n      \"input\": {\n        \"configFile\": \"[profile foo]\\n= value\"\n      },\n      \"output\": {\n        \"errorContaining\": \"Property did not have a name\"\n      }\n    },\n    {\n      \"name\": \"Property definitions must contain an equals sign.\",\n      \"input\": {\n        \"configFile\": \"[profile foo]\\nkey : value\"\n      },\n      \"output\": {\n        \"errorContaining\": \"Expected an '=' sign defining a property\"\n      }\n    },\n    {\n      \"name\": \"Multiple profiles can be empty.\",\n      \"input\": {\n        \"configFile\": \"[profile foo]\\n[profile bar]\"\n      },\n      \"output\": {\n        \"config\": {\n          \"profiles\": {\n            \"foo\": {},\n            \"bar\": {}\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"Multiple profiles can have properties.\",\n      \"input\": {\n        \"configFile\": \"[profile foo]\\nname = value\\n[profile bar]\\nname2 = value2\"\n      },\n      \"output\": {\n        \"config\": {\n          \"profiles\": {\n            \"foo\": {\n              \"name\": \"value\"\n            },\n            \"bar\": {\n              \"name2\": \"value2\"\n            }\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"Blank lines are ignored.\",\n      \"input\": {\n        \"configFile\": \"\\t \\n[profile foo]\\n\\t\\n \\nname = value\\n\\t \\n[profile bar]\\n \\t\"\n      },\n      \"output\": {\n        \"config\": {\n          \"profiles\": {\n            \"foo\": {\n              \"name\": \"value\"\n            },\n            \"bar\": {}\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"Pound sign comments are ignored.\",\n      \"input\": {\n        \"configFile\": \"# Comment\\n[profile foo] # Comment\\nname = value # Comment with # sign\"\n      },\n      \"output\": {\n        \"config\": {\n          \"profiles\": {\n            \"foo\": {\n              \"name\": \"value\"\n            }\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"Semicolon sign comments are ignored.\",\n      \"input\": {\n        \"configFile\": \"; Comment\\n[profile foo] ; Comment\\nname = value ; Comment with ; sign\"\n      },\n      \"output\": {\n        \"config\": {\n          \"profiles\": {\n            \"foo\": {\n              \"name\": \"value\"\n            }\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"All comment types can be used together.\",\n      \"input\": {\n        \"configFile\": \"# Comment\\n[profile foo] ; Comment\\nname = value # Comment with ; sign\"\n      },\n      \"output\": {\n        \"config\": {\n          \"profiles\": {\n            \"foo\": {\n              \"name\": \"value\"\n            }\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"Comments can be empty.\",\n      \"input\": {\n        \"configFile\": \";\\n[profile foo];\\nname = value ;\\n\"\n      },\n      \"output\": {\n        \"config\": {\n          \"profiles\": {\n            \"foo\": {\n              \"name\": \"value\"\n            }\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"Comments can be adjacent to profile names.\",\n      \"input\": {\n        \"configFile\": \"[profile foo]; Adjacent semicolons\\n[profile bar]# Adjacent pound signs\"\n      },\n      \"output\": {\n        \"config\": {\n          \"profiles\": {\n            \"foo\": {},\n            \"bar\": {}\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"Comments adjacent to values are included in the value.\",\n      \"input\": {\n        \"configFile\": \"[profile foo]\\nname = value; Adjacent semicolons\\nname2 = value# Adjacent pound signs\"\n      },\n      \"output\": {\n        \"config\": {\n          \"profiles\": {\n            \"foo\": {\n              \"name\": \"value; Adjacent semicolons\",\n              \"name2\": \"value# Adjacent pound signs\"\n            }\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"Property values can be continued on the next line.\",\n      \"input\": {\n        \"configFile\": \"[profile foo]\\nname = value\\n -continued\"\n      },\n      \"output\": {\n        \"config\": {\n          \"profiles\": {\n            \"foo\": {\n              \"name\": \"value\\n-continued\"\n            }\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"Property values can be continued with multiple lines.\",\n      \"input\": {\n        \"configFile\": \"[profile foo]\\nname = value\\n -continued\\n -and-continued\"\n      },\n      \"output\": {\n        \"config\": {\n          \"profiles\": {\n            \"foo\": {\n              \"name\": \"value\\n-continued\\n-and-continued\"\n            }\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"Continuations are trimmed.\",\n      \"input\": {\n        \"configFile\": \"[profile foo]\\nname = value\\n \\t -continued \\t \"\n      },\n      \"output\": {\n        \"config\": {\n          \"profiles\": {\n            \"foo\": {\n              \"name\": \"value\\n-continued\"\n            }\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"Continuation values include pound comments.\",\n      \"input\": {\n        \"configFile\": \"[profile foo]\\nname = value\\n -continued # Comment\"\n      },\n      \"output\": {\n        \"config\": {\n          \"profiles\": {\n            \"foo\": {\n              \"name\": \"value\\n-continued # Comment\"\n            }\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"Continuation values include semicolon comments.\",\n      \"input\": {\n        \"configFile\": \"[profile foo]\\nname = value\\n -continued ; Comment\"\n      },\n      \"output\": {\n        \"config\": {\n          \"profiles\": {\n            \"foo\": {\n              \"name\": \"value\\n-continued ; Comment\"\n            }\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"Continuations cannot be used outside of a profile.\",\n      \"input\": {\n        \"configFile\": \" -continued\"\n      },\n      \"output\": {\n        \"errorContaining\": \"Expected a profile definition\"\n      }\n    },\n    {\n      \"name\": \"Continuations cannot be used outside of a property.\",\n      \"input\": {\n        \"configFile\": \"[profile foo]\\n -continued\"\n      },\n      \"output\": {\n        \"errorContaining\": \"Expected a property definition\"\n      }\n    },\n    {\n      \"name\": \"Continuations reset with profile definitions.\",\n      \"input\": {\n        \"configFile\": \"[profile foo]\\nname = value\\n[profile foo]\\n -continued\"\n      },\n      \"output\": {\n        \"errorContaining\": \"Expected a property definition\"\n      }\n    },\n    {\n      \"name\": \"Duplicate profiles in the same file merge properties.\",\n      \"input\": {\n        \"configFile\": \"[profile foo]\\nname = value\\n[profile foo]\\nname2 = value2\"\n      },\n      \"output\": {\n        \"config\": {\n          \"profiles\": {\n            \"foo\": {\n              \"name\": \"value\",\n              \"name2\": \"value2\"\n            }\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"Duplicate properties in a profile use the last one defined.\",\n      \"input\": {\n        \"configFile\": \"[profile foo]\\nname = value\\nname = value2\"\n      },\n      \"output\": {\n        \"config\": {\n          \"profiles\": {\n            \"foo\": {\n              \"name\": \"value2\"\n            }\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"Duplicate properties in duplicate profiles use the last one defined.\",\n      \"input\": {\n        \"configFile\": \"[profile foo]\\nname = value\\n[profile foo]\\nname = value2\"\n      },\n      \"output\": {\n        \"config\": {\n          \"profiles\": {\n            \"foo\": {\n              \"name\": \"value2\"\n            }\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"Duplicate properties in duplicate profiles use the last one defined (case insensitive).\",\n      \"input\": {\n        \"configFile\": \"[profile foo]\\nName = value\\n[profile foo]\\nname = value2\"\n      },\n      \"output\": {\n        \"config\": {\n          \"profiles\": {\n            \"foo\": {\n              \"name\": \"value2\"\n            }\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"Default profile with profile prefix overrides default profile without prefix when profile prefix is first.\",\n      \"input\": {\n        \"configFile\": \"[profile default]\\nname = value\\n[default]\\nname2 = value2\"\n      },\n      \"output\": {\n        \"config\": {\n          \"profiles\": {\n            \"default\": {\n              \"name\": \"value\"\n            }\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"Default profile with profile prefix overrides default profile without prefix when profile prefix is last.\",\n      \"input\": {\n        \"configFile\": \"[default]\\nname2 = value2\\n[profile default]\\nname = value\"\n      },\n      \"output\": {\n        \"config\": {\n          \"profiles\": {\n            \"default\": {\n              \"name\": \"value\"\n            }\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"Invalid profile names are ignored.\",\n      \"input\": {\n        \"configFile\": \"[profile in valid]\\nname = value\",\n        \"credentialsFile\": \"[in valid 2]\\nname2 = value2\"\n      },\n      \"output\": {\n        \"config\": {\n          \"profiles\": {}\n        }\n      }\n    },\n    {\n      \"name\": \"Invalid property names are ignored.\",\n      \"input\": {\n        \"configFile\": \"[profile foo]\\nin valid = value\"\n      },\n      \"output\": {\n        \"config\": {\n          \"profiles\": {\n            \"foo\": {}\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"All valid profile name characters are supported.\",\n      \"input\": {\n        \"configFile\": \"[profile ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_]\"\n      },\n      \"output\": {\n        \"config\": {\n          \"profiles\": {\n            \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_\": {}\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"All valid property name characters are supported.\",\n      \"input\": {\n        \"configFile\": \"[profile foo]\\nABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_ = value\"\n      },\n      \"output\": {\n        \"config\": {\n          \"profiles\": {\n            \"foo\": {\n              \"abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz0123456789-_\": \"value\"\n            }\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"Properties can have sub-properties.\",\n      \"input\": {\n        \"configFile\": \"[profile foo]\\ns3 =\\n name = value\"\n      },\n      \"output\": {\n        \"config\": {\n          \"profiles\": {\n            \"foo\": {\n              \"s3\": \"\\nname = value\"\n            }\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"Invalid sub-property definitions cause an error.\",\n      \"input\": {\n        \"configFile\": \"[profile foo]\\ns3 =\\n invalid\"\n      },\n      \"output\": {\n        \"errorContaining\": \"Expected an '=' sign defining a sub-property\"\n      }\n    },\n    {\n      \"name\": \"Sub-property definitions can have an empty value.\",\n      \"input\": {\n        \"configFile\": \"[profile foo]\\ns3 =\\n name =\"\n      },\n      \"output\": {\n        \"config\": {\n          \"profiles\": {\n            \"foo\": {\n              \"s3\": \"\\nname =\"\n            }\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"Sub-property definitions cannot have an empty name.\",\n      \"input\": {\n        \"configFile\": \"[profile foo]\\ns3 =\\n = value\"\n      },\n      \"output\": {\n        \"errorContaining\": \"Sub-property did not have a name\"\n      }\n    },\n    {\n      \"name\": \"Sub-property definitions can have an invalid name.\",\n      \"input\": {\n        \"configFile\": \"[profile foo]\\ns3 =\\n in valid = value\"\n      },\n      \"output\": {\n        \"config\": {\n          \"profiles\": {\n            \"foo\": {\n              \"s3\": \"\\nin valid = value\"\n            }\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"Sub-properties can have blank lines that are ignored\",\n      \"input\": {\n        \"configFile\": \"[profile foo]\\ns3 =\\n name = value\\n\\t \\n name2 = value2\"\n      },\n      \"output\": {\n        \"config\": {\n          \"profiles\": {\n            \"foo\": {\n              \"s3\": \"\\nname = value\\nname2 = value2\"\n            }\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"Profiles duplicated in multiple files are merged.\",\n      \"input\": {\n        \"configFile\": \"[profile foo]\\nname = value\",\n        \"credentialsFile\": \"[foo]\\nname2 = value2\"\n      },\n      \"output\": {\n        \"config\": {\n          \"profiles\": {\n            \"foo\": {\n              \"name\": \"value\",\n              \"name2\": \"value2\"\n            }\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"Default profiles with mixed prefixes in the config file ignore the one without prefix when merging.\",\n      \"input\": {\n        \"configFile\": \"[profile default]\\nname = value\\n[default]\\nname2 = value2\\n[profile default]\\nname3 = value3\"\n      },\n      \"output\": {\n        \"config\": {\n          \"profiles\": {\n            \"default\": {\n              \"name\": \"value\",\n              \"name3\": \"value3\"\n            }\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"Default profiles with mixed prefixes merge with credentials\",\n      \"input\": {\n        \"configFile\": \"[profile default]\\nname = value\\n[default]\\nname2 = value2\\n[profile default]\\nname3 = value3\",\n        \"credentialsFile\": \"[default]\\nsecret=foo\"\n      },\n      \"output\": {\n        \"config\": {\n          \"profiles\": {\n            \"default\": {\n              \"name\": \"value\",\n              \"name3\": \"value3\",\n              \"secret\": \"foo\"\n            }\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"Duplicate properties between files uses credentials property.\",\n      \"input\": {\n        \"configFile\": \"[profile foo]\\nname = value\",\n        \"credentialsFile\": \"[foo]\\nname = value2\"\n      },\n      \"output\": {\n        \"config\": {\n          \"profiles\": {\n            \"foo\": {\n              \"name\": \"value2\"\n            }\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"Config profiles without prefix are ignored.\",\n      \"input\": {\n        \"configFile\": \"[foo]\\nname = value\"\n      },\n      \"output\": {\n        \"config\": {\n          \"profiles\": {}\n        }\n      }\n    },\n    {\n      \"name\": \"Credentials profiles with prefix are ignored.\",\n      \"input\": {\n        \"credentialsFile\": \"[profile foo]\\nname = value\"\n      },\n      \"output\": {\n        \"config\": {\n          \"profiles\": {}\n        }\n      }\n    },\n    {\n      \"name\": \"Comment characters adjacent to profile decls\",\n      \"input\": {\n        \"configFile\": \"[profile foo]; semicolon\\n[profile bar]# pound\"\n      },\n      \"output\": {\n        \"config\": {\n          \"profiles\": {\n            \"foo\": {},\n            \"bar\": {}\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"Invalid continuation\",\n      \"input\": {\n        \"configFile\": \"[profile foo]\\nname = value\\n[profile foo]\\n -continued\"\n      },\n      \"output\": {\n        \"errorContaining\": \"Expected a property definition, found continuation\"\n      }\n    },\n    {\n      \"name\": \"sneaky profile name\",\n      \"input\": {\n        \"configFile\": \"[profilefoo]\\nname = value\\n[profile bar]\"\n      },\n      \"output\": {\n        \"config\": {\n          \"profiles\": {\n            \"bar\": {}\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"profile name with extra whitespace\",\n      \"input\": {\n        \"configFile\": \"[   profile foo    ]\\nname = value\\n[profile bar]\"\n      },\n      \"output\": {\n        \"config\": {\n          \"profiles\": {\n            \"bar\": {},\n            \"foo\": {\n              \"name\": \"value\"\n            }\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"profile name with extra whitespace in credentials\",\n      \"input\": {\n        \"credentialsFile\": \"[   foo    ]\\nname = value\\n[profile bar]\"\n      },\n      \"output\": {\n        \"config\": {\n          \"profiles\": {\n            \"foo\": {\n              \"name\": \"value\"\n            }\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"properties from an invalid profile name are ignored\",\n      \"input\": {\n        \"configFile\": \"[profile foo]\\nname = value\\n[profile in valid]\\nx = 1\\n[profile bar]\\nname = value2\"\n      },\n      \"output\": {\n        \"config\": {\n          \"profiles\": {\n            \"bar\": {\n              \"name\": \"value2\"\n            },\n            \"foo\": {\n              \"name\": \"value\"\n            }\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"sso-session with properties\",\n      \"input\": {\n        \"configFile\": \"[sso-session foo]\\nname = value\\n[profile bar]\"\n      },\n      \"output\": {\n        \"config\": {\n          \"profiles\": {\n            \"bar\": {}\n          },\n          \"sso_sessions\": {\n            \"foo\": {\n              \"name\": \"value\"\n            }\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"sso-session without the space before the name is a profile\",\n      \"input\": {\n        \"credentialsFile\": \"[sso-sessionfoo]\\nname = value\\n[bar]\"\n      },\n      \"output\": {\n        \"config\": {\n          \"profiles\": {\n            \"sso-sessionfoo\": { \"name\": \"value\" },\n            \"bar\": {}\n          },\n          \"sso_sessions\": {\n          }\n        }\n      }\n    },\n    {\n      \"name\": \"A typo'd sso-session will be ignored\",\n      \"input\": {\n        \"configFile\": \"[sso-sesion foo]\\nname = value\\n[profile bar]\"\n      },\n      \"output\": {\n        \"config\": {\n          \"profiles\": {\n            \"bar\": {}\n          },\n          \"sso_sessions\": {\n          }\n        }\n      }\n    }\n  ]\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-runtime/test-data/recursion-detection.json",
    "content": "[\n  {\n    \"env\": {},\n    \"requestHeadersBefore\": [],\n    \"requestHeadersAfter\": [],\n    \"description\": [\n      \"The AWS_LAMBDA_FUNCTION_NAME and _X_AMZN_TRACE_ID environment variables are not set.\",\n      \"There should be no X-Amzn-Trace-Id header sent.\"\n    ]\n  },\n  {\n    \"env\": {\n      \"AWS_LAMBDA_FUNCTION_NAME\": \"some-function\",\n      \"_X_AMZN_TRACE_ID\": \"Root=1-5759e988-bd862e3fe1be46a994272793;Parent=53995c3f42cd8ad8;Sampled=1;lineage=a87bd80c:0,68fd508a:5,c512fbe3:2\"\n    },\n    \"requestHeadersBefore\": [],\n    \"requestHeadersAfter\": [\n      \"X-Amzn-Trace-Id: Root=1-5759e988-bd862e3fe1be46a994272793;Parent=53995c3f42cd8ad8;Sampled=1;lineage=a87bd80c:0,68fd508a:5,c512fbe3:2\"\n    ],\n    \"description\": [\n      \"AWS_LAMBDA_FUNCTION_NAME is set, and\",\n      \"_X_AMZN_TRACE_ID is set to \\\"Root=1-5759e988-bd862e3fe1be46a994272793;Parent=53995c3f42cd8ad8;Sampled=1;lineage=a87bd80c:0,68fd508a:5,c512fbe3:2\\\".\",\n      \"The X-Amzn-Trace-Id header should be sent with that value.\"\n    ]\n  },\n  {\n    \"env\": {\n      \"_X_AMZN_TRACE_ID\": \"Root=1-5759e988-bd862e3fe1be46a994272793;Parent=53995c3f42cd8ad8;Sampled=1;lineage=a87bd80c:0,68fd508a:5,c512fbe3:2\"\n    },\n    \"requestHeadersBefore\": [],\n    \"requestHeadersAfter\": [],\n    \"description\": [\n      \"AWS_LAMBDA_FUNCTION_NAME is NOT set, and\",\n      \"_X_AMZN_TRACE_ID is set to \\\"Root=1-5759e988-bd862e3fe1be46a994272793;Parent=53995c3f42cd8ad8;Sampled=1;lineage=a87bd80c:0,68fd508a:5,c512fbe3:2\\\".\",\n      \"The X-Amzn-Trace-Id header should NOT be sent with that value.\"\n    ]\n  },\n  {\n    \"env\": {\n      \"AWS_LAMBDA_FUNCTION_NAME\": \"some-function\",\n      \"_X_AMZN_TRACE_ID\": \"EnvValue\"\n    },\n    \"requestHeadersBefore\": [\n      \"X-Amzn-Trace-Id: OriginalValue\"\n    ],\n    \"requestHeadersAfter\": [\n      \"X-Amzn-Trace-Id: OriginalValue\"\n    ],\n    \"desciption\": [\n      \"AWS_LAMBDA_FUNCTION_NAME is set, and\",\n      \"_X_AMZN_TRACE_ID is set to \\\"EnvValue\\\",\",\n      \"but the X-Amzn-Trace-Id header is already set on the request.\",\n      \"The X-Amzn-Trace-Id header should keep its original value.\"\n    ]\n  },\n  {\n    \"env\": {\n      \"AWS_LAMBDA_FUNCTION_NAME\": \"some-function\",\n      \"_X_AMZN_TRACE_ID\": \"first\\nsecond¼\\t\"\n    },\n    \"requestHeadersBefore\": [],\n    \"requestHeadersAfter\": [\n      \"X-Amzn-Trace-Id: first%0Asecond%C2%BC%09\"\n    ],\n    \"description\": [\n      \"AWS_LAMBDA_FUNCTION_NAME is set, and\",\n      \"_X_AMZN_TRACE_ID has ASCII control characters in it.\",\n      \"The X-Amzn-Trace-Id header is added with the control characters percent encoded.\"\n    ]\n  }\n]\n"
  },
  {
    "path": "aws/rust-runtime/aws-runtime-api/Cargo.toml",
    "content": "[package]\nname = \"aws-runtime-api\"\nversion = \"1.1.12\"\nauthors = [\"AWS Rust SDK Team <aws-sdk-rust@amazon.com>\"]\ndescription = \"Runtime support code for the AWS SDK. This isn't intended to be used directly.\"\nedition = \"2021\"\nlicense = \"Apache-2.0\"\nrepository = \"https://github.com/smithy-lang/smithy-rs\"\nrust-version = \"1.91.1\"\n\n[dependencies]\n\n[package.metadata.docs.rs]\nall-features = true\ntargets = [\"x86_64-unknown-linux-gnu\"]\ncargo-args = [\"-Zunstable-options\", \"-Zrustdoc-scrape-examples\"]\nrustdoc-args = [\"--cfg\", \"docsrs\"]\n# End of docs.rs metadata\n\n# make sure to keep crate stability in sync with the second element of the following tuple in\n# buildSrc/src/main/kotlin/CrateSet.kt:\n#  Crate(\"aws-runtime-api\", STABLE_VERSION_PROP_NAME),\n[package.metadata.smithy-rs-release-tooling]\nstable = true\n"
  },
  {
    "path": "aws/rust-runtime/aws-runtime-api/LICENSE",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n"
  },
  {
    "path": "aws/rust-runtime/aws-runtime-api/README.md",
    "content": "aws-runtime-api\n===============\n\nRuntime support code for the AWS SDK. This crate isn't intended to be used directly.\n\n<!-- anchor_start:footer -->\nThis crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly.\n<!-- anchor_end:footer -->\n"
  },
  {
    "path": "aws/rust-runtime/aws-runtime-api/external-types.toml",
    "content": "allowed_external_types = [\n]\n"
  },
  {
    "path": "aws/rust-runtime/aws-runtime-api/src/lib.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/* Automatically managed default lints */\n#![cfg_attr(docsrs, feature(doc_cfg))]\n/* End of automatically managed default lints */\n//! Runtime support code for the AWS SDK. This crate isn't intended to be used directly.\n\n#![warn(\n    missing_docs,\n    rustdoc::missing_crate_level_docs,\n    missing_debug_implementations,\n    rust_2018_idioms,\n    unreachable_pub\n)]\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/Cargo.toml",
    "content": "[package]\nname = \"aws-sigv4\"\nversion = \"1.4.3\"\nauthors = [\"AWS Rust SDK Team <aws-sdk-rust@amazon.com>\", \"David Barsky <me@davidbarsky.com>\"]\ndescription = \"SigV4 signer for HTTP requests and Event Stream messages.\"\nedition = \"2021\"\nexclude = [\"aws-sig-v4-test-suite/*\"]\nlicense = \"Apache-2.0\"\nrepository = \"https://github.com/smithy-lang/smithy-rs\"\nrust-version = \"1.91.1\"\n\n[features]\ndefault = [\"sign-http\", \"http1\"]\nhttp0-compat = [\"dep:http0\"]\nhttp1 = [\"dep:http\"]\nsign-http = [\"dep:http0\", \"dep:percent-encoding\", \"dep:form_urlencoded\"]\nsign-eventstream = [\"dep:aws-smithy-eventstream\"]\nsigv4a = [\"dep:p256\", \"dep:crypto-bigint\", \"dep:subtle\", \"dep:zeroize\", \"dep:ring\"]\n\n[dependencies]\naws-credential-types = { path = \"../aws-credential-types\" }\naws-smithy-eventstream = { path = \"../../../rust-runtime/aws-smithy-eventstream\", optional = true }\naws-smithy-http = { path = \"../../../rust-runtime/aws-smithy-http\" }\naws-smithy-runtime-api = { path = \"../../../rust-runtime/aws-smithy-runtime-api\", features = [\"client\"] }\naws-smithy-types = { path = \"../../../rust-runtime/aws-smithy-types\" }\nbytes = \"1.11.1\"\nform_urlencoded = { version = \"1.2.1\", optional = true }\nhex = \"0.4.3\"\nhmac = \"0.13\"\nhttp0 = { package = \"http\" , version = \"0.2.12\", optional = true }\nhttp = { version = \"1.3.1\", optional = true }\np256 = { version = \"0.11\", features = [\"ecdsa\"], optional = true }\npercent-encoding = { version = \"2.3.1\", optional = true }\nring = { version = \"0.17.5\", optional = true }\nsha2 = \"0.11\"\ncrypto-bigint = { version = \"0.5.4\", optional = true }\nsubtle = { version = \"2.5.0\", optional = true }\ntime = \"0.3.5\"\ntracing = \"0.1.44\"\nzeroize = { version = \"^1.7.0\", optional = true }\n\n[dev-dependencies]\naws-credential-types = { path = \"../aws-credential-types\", features = [\"test-util\", \"hardcoded-credentials\"] }\naws-smithy-runtime-api = { path = \"../../../rust-runtime/aws-smithy-runtime-api\", features = [\"client\", \"test-util\"] }\nbytes = \"1.11.1\"\nhex-literal = \"0.4.1\"\nhttparse = \"1.10.1\"\npretty_assertions = \"1.3\"\nproptest = \"1.2\"\nserde = \"1.0.180\"\nserde_derive = \"1.0.180\"\nserde_json = \"1.0.104\"\ntime = { version = \"0.3.5\", features = [\"parsing\"] }\n\ncriterion = \"0.5\"\n\n[target.'cfg(not(any(target_arch = \"powerpc\", target_arch = \"powerpc64\")))'.dev-dependencies]\nring = \"0.17.5\"\n\n[[bench]]\nname = \"hmac\"\nharness = false\n\n[[bench]]\nname = \"sigv4a\"\nharness = false\nrequired-features = [\"sigv4a\"]\n\n[package.metadata.docs.rs]\nall-features = true\ntargets = [\"x86_64-unknown-linux-gnu\"]\ncargo-args = [\"-Zunstable-options\", \"-Zrustdoc-scrape-examples\"]\nrustdoc-args = [\"--cfg\", \"docsrs\"]\n# End of docs.rs metadata\n\n[package.metadata.smithy-rs-release-tooling]\nstable = true\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/LICENSE",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/README.md",
    "content": "# aws-sigv4\n\nLow-level SigV4 request signing implementations.\n\n<!-- anchor_start:footer -->\nThis crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly.\n<!-- anchor_end:footer -->\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/README.md",
    "content": "# AWS SigV4 and SigV4A Signing Test Suite\n\nThis test suite is taken from the [CRT test suite](https://github.com/awslabs/aws-c-auth/tree/v0.9.0/tests/aws-signing-test-suite).\n\nWe added the following changes:\n\n* Migrated old format tests `double-url-encode` and `double-encode-path` not in the new suite as we use these in many tests."
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/double-encode-path/header-canonical-request.txt",
    "content": "POST\n/test/%40connections/JBDvjfGEIAMCERw%253D\n\nhost:tj9n5r0m12.execute-api.us-east-1.amazonaws.com\nx-amz-date:20210511T154045Z\n\nhost;x-amz-date\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/double-encode-path/header-signed-request.txt",
    "content": "POST /test/@connections/JBDvjfGEIAMCERw%3D HTTP/1.1\nX-amz-date:20150830T123600Z\nAuthorization:AWS4-HMAC-SHA256 Credential=ANOTREAL/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=57d157672191bac40bae387e48bbe14b15303c001fdbb01f4abf295dccb09705\nHost:tj9n5r0m12.execute-api.us-east-1.amazonaws.com\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/double-encode-path/request.txt",
    "content": "POST /test/@connections/JBDvjfGEIAMCERw%3D HTTP/1.1\nHost:tj9n5r0m12.execute-api.us-east-1.amazonaws.com\nX-amz-date:20150830T123600Z\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/double-url-encode/header-canonical-request.txt",
    "content": "POST\n/2015-03-31/functions/arn%253Aaws%253Alambda%253Aus-west-2%253A892717189312%253Afunction%253Amy-rusty-fun/invocations\n\nhost:lambda.us-east-2.amazonaws.com\nx-amz-date:20210511T154045Z\n\nhost;x-amz-date\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/double-url-encode/header-signed-request.txt",
    "content": "POST /2015-03-31/functions/arn%3Aaws%3Alambda%3Aus-west-2%3A892717189312%3Afunction%3Amy-rusty-fun/invocations\nHost:lambda.us-east-2.amazonaws.com\nX-Amz-Date:20210511T154045Z\nAuthorization: AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20210511/us-east-2/lambda/aws4_request, SignedHeaders=host;x-amz-date, Signature=4b93abbcc68be32bd64c18e2c71150660ab4c29bbd6c32a383a7517a88fc1804\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/double-url-encode/header-string-to-sign.txt",
    "content": "AWS4-HMAC-SHA256\n20210511T154045Z\n20210511/us-east-2/lambda/aws4_request\n684dbb3c92a8b6b1e452e23e523c1ea941c713a4c13500bb9f3bdad1e19afaf7\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/double-url-encode/request.txt",
    "content": "POST /2015-03-31/functions/arn%3Aaws%3Alambda%3Aus-west-2%3A892717189312%3Afunction%3Amy-rusty-fun/invocations HTTP/1.1\nHost:lambda.us-east-2.amazonaws.com\nX-Amz-Date:20210511T154045Z\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-header-key-duplicate/context.json",
    "content": "{\n    \"credentials\": {\n        \"access_key_id\": \"AKIDEXAMPLE\",\n        \"secret_access_key\": \"wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY\"\n    },\n    \"expiration_in_seconds\": 3600,\n    \"normalize\": true,\n    \"region\": \"us-east-1\",\n    \"service\": \"service\",\n    \"sign_body\": false,\n    \"timestamp\": \"2015-08-30T12:36:00Z\"\n}"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-header-key-duplicate/header-canonical-request.txt",
    "content": "GET\n/\n\nhost:example.amazonaws.com\nmy-header1:value2,value2,value1\nx-amz-date:20150830T123600Z\n\nhost;my-header1;x-amz-date\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-header-key-duplicate/header-signature.txt",
    "content": "c9d5ea9f3f72853aea855b47ea873832890dbdd183b4468f858259531a5138ea"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-header-key-duplicate/header-signed-request.txt",
    "content": "GET / HTTP/1.1\nHost:example.amazonaws.com\nMy-Header1:value2\nMy-Header1:value2\nMy-Header1:value1\nX-Amz-Date:20150830T123600Z\nAuthorization:AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;my-header1;x-amz-date, Signature=c9d5ea9f3f72853aea855b47ea873832890dbdd183b4468f858259531a5138ea\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-header-key-duplicate/header-string-to-sign.txt",
    "content": "AWS4-HMAC-SHA256\n20150830T123600Z\n20150830/us-east-1/service/aws4_request\ndc7f04a3abfde8d472b0ab1a418b741b7c67174dad1551b4117b15527fbe966c"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-header-key-duplicate/query-canonical-request.txt",
    "content": "GET\n/\nX-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fus-east-1%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host%3Bmy-header1\nhost:example.amazonaws.com\nmy-header1:value2,value2,value1\n\nhost;my-header1\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-header-key-duplicate/query-signature.txt",
    "content": "3349ee0b81b4b589da0ff28a395c3591e04de515651dd74f298fa992d1507a97"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-header-key-duplicate/query-signed-request.txt",
    "content": "GET /?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fus-east-1%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-SignedHeaders=host%3Bmy-header1&X-Amz-Expires=3600&X-Amz-Signature=3349ee0b81b4b589da0ff28a395c3591e04de515651dd74f298fa992d1507a97 HTTP/1.1\nHost:example.amazonaws.com\nMy-Header1:value2\nMy-Header1:value2\nMy-Header1:value1\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-header-key-duplicate/query-string-to-sign.txt",
    "content": "AWS4-HMAC-SHA256\n20150830T123600Z\n20150830/us-east-1/service/aws4_request\nfe8b58fb44117d598520befc07c144a5699c661a8db78f9ce4caee1655dec813"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-header-key-duplicate/request.txt",
    "content": "GET / HTTP/1.1\nHost:example.amazonaws.com\nMy-Header1:value2\nMy-Header1:value2\nMy-Header1:value1\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-header-value-multiline/context.json",
    "content": "{\n    \"credentials\": {\n        \"access_key_id\": \"AKIDEXAMPLE\",\n        \"secret_access_key\": \"wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY\"\n    },\n    \"expiration_in_seconds\": 3600,\n    \"normalize\": true,\n    \"region\": \"us-east-1\",\n    \"service\": \"service\",\n    \"sign_body\": false,\n    \"timestamp\": \"2015-08-30T12:36:00Z\"\n}"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-header-value-multiline/header-canonical-request.txt",
    "content": "GET\n/\n\nhost:example.amazonaws.com\nmy-header1:value1 value2 value3\nx-amz-date:20150830T123600Z\n\nhost;my-header1;x-amz-date\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-header-value-multiline/header-signature.txt",
    "content": "cfd34249e4b1c8d6b91ef74165d41a32e5fab3306300901bb65a51a73575eefd"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-header-value-multiline/header-signed-request.txt",
    "content": "GET / HTTP/1.1\nHost:example.amazonaws.com\nMy-Header1:value1\n  value2\n     value3\nX-Amz-Date:20150830T123600Z\nAuthorization:AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;my-header1;x-amz-date, Signature=cfd34249e4b1c8d6b91ef74165d41a32e5fab3306300901bb65a51a73575eefd\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-header-value-multiline/header-string-to-sign.txt",
    "content": "AWS4-HMAC-SHA256\n20150830T123600Z\n20150830/us-east-1/service/aws4_request\ne99419459a677bc11de234014be3c4e72c1ea5b454ceb58b613061f5d7a162e8"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-header-value-multiline/query-canonical-request.txt",
    "content": "GET\n/\nX-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fus-east-1%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host%3Bmy-header1\nhost:example.amazonaws.com\nmy-header1:value1 value2 value3\n\nhost;my-header1\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-header-value-multiline/query-signature.txt",
    "content": "e6f5def831211aca02987a44b96826706278c7bc078112ae0263659c5b2f2d56"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-header-value-multiline/query-signed-request.txt",
    "content": "GET /?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fus-east-1%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-SignedHeaders=host%3Bmy-header1&X-Amz-Expires=3600&X-Amz-Signature=e6f5def831211aca02987a44b96826706278c7bc078112ae0263659c5b2f2d56 HTTP/1.1\nHost:example.amazonaws.com\nMy-Header1:value1\n  value2\n     value3\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-header-value-multiline/query-string-to-sign.txt",
    "content": "AWS4-HMAC-SHA256\n20150830T123600Z\n20150830/us-east-1/service/aws4_request\n0e73c10e35324b4d215da4bb70be61d13a3d30d569be4ed6e8fd8948965341ca"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-header-value-multiline/request.txt",
    "content": "GET / HTTP/1.1\nHost:example.amazonaws.com\nMy-Header1:value1\n  value2\n     value3\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-header-value-order/context.json",
    "content": "{\n    \"credentials\": {\n        \"access_key_id\": \"AKIDEXAMPLE\",\n        \"secret_access_key\": \"wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY\"\n    },\n    \"expiration_in_seconds\": 3600,\n    \"normalize\": true,\n    \"region\": \"us-east-1\",\n    \"service\": \"service\",\n    \"sign_body\": false,\n    \"timestamp\": \"2015-08-30T12:36:00Z\"\n}"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-header-value-order/header-canonical-request.txt",
    "content": "GET\n/\n\nhost:example.amazonaws.com\nmy-header1:value4,value1,value3,value2\nx-amz-date:20150830T123600Z\n\nhost;my-header1;x-amz-date\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-header-value-order/header-signature.txt",
    "content": "08c7e5a9acfcfeb3ab6b2185e75ce8b1deb5e634ec47601a50643f830c755c01"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-header-value-order/header-signed-request.txt",
    "content": "GET / HTTP/1.1\nHost:example.amazonaws.com\nMy-Header1:value4\nMy-Header1:value1\nMy-Header1:value3\nMy-Header1:value2\nX-Amz-Date:20150830T123600Z\nAuthorization:AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;my-header1;x-amz-date, Signature=08c7e5a9acfcfeb3ab6b2185e75ce8b1deb5e634ec47601a50643f830c755c01\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-header-value-order/header-string-to-sign.txt",
    "content": "AWS4-HMAC-SHA256\n20150830T123600Z\n20150830/us-east-1/service/aws4_request\n31ce73cd3f3d9f66977ad3dd957dc47af14df92fcd8509f59b349e9137c58b86"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-header-value-order/query-canonical-request.txt",
    "content": "GET\n/\nX-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fus-east-1%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host%3Bmy-header1\nhost:example.amazonaws.com\nmy-header1:value4,value1,value3,value2\n\nhost;my-header1\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-header-value-order/query-signature.txt",
    "content": "313720e71ca6202fdcfa9b20f88de01a4eb0638a83c833b1c184359a4eda864e"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-header-value-order/query-signed-request.txt",
    "content": "GET /?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fus-east-1%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-SignedHeaders=host%3Bmy-header1&X-Amz-Expires=3600&X-Amz-Signature=313720e71ca6202fdcfa9b20f88de01a4eb0638a83c833b1c184359a4eda864e HTTP/1.1\nHost:example.amazonaws.com\nMy-Header1:value4\nMy-Header1:value1\nMy-Header1:value3\nMy-Header1:value2\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-header-value-order/query-string-to-sign.txt",
    "content": "AWS4-HMAC-SHA256\n20150830T123600Z\n20150830/us-east-1/service/aws4_request\nf4d3f13084ba7664111670ce26458291d3e0c620acd9384f8cd6b60d8e83423e"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-header-value-order/request.txt",
    "content": "GET / HTTP/1.1\nHost:example.amazonaws.com\nMy-Header1:value4\nMy-Header1:value1\nMy-Header1:value3\nMy-Header1:value2\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-header-value-trim/context.json",
    "content": "{\n    \"credentials\": {\n        \"access_key_id\": \"AKIDEXAMPLE\",\n        \"secret_access_key\": \"wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY\"\n    },\n    \"expiration_in_seconds\": 3600,\n    \"normalize\": true,\n    \"region\": \"us-east-1\",\n    \"service\": \"service\",\n    \"sign_body\": false,\n    \"timestamp\": \"2015-08-30T12:36:00Z\"\n}"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-header-value-trim/header-canonical-request.txt",
    "content": "GET\n/\n\nhost:example.amazonaws.com\nmy-header1:value1\nmy-header2:\"a b c\"\nx-amz-date:20150830T123600Z\n\nhost;my-header1;my-header2;x-amz-date\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-header-value-trim/header-signature.txt",
    "content": "acc3ed3afb60bb290fc8d2dd0098b9911fcaa05412b367055dee359757a9c736"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-header-value-trim/header-signed-request.txt",
    "content": "GET / HTTP/1.1\nHost:example.amazonaws.com\nMy-Header1: value1\nMy-Header2: \"a   b   c\"\nX-Amz-Date:20150830T123600Z\nAuthorization:AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;my-header1;my-header2;x-amz-date, Signature=acc3ed3afb60bb290fc8d2dd0098b9911fcaa05412b367055dee359757a9c736\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-header-value-trim/header-string-to-sign.txt",
    "content": "AWS4-HMAC-SHA256\n20150830T123600Z\n20150830/us-east-1/service/aws4_request\na726db9b0df21c14f559d0a978e563112acb1b9e05476f0a6a1c7d68f28605c7"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-header-value-trim/query-canonical-request.txt",
    "content": "GET\n/\nX-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fus-east-1%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host%3Bmy-header1%3Bmy-header2\nhost:example.amazonaws.com\nmy-header1:value1\nmy-header2:\"a b c\"\n\nhost;my-header1;my-header2\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-header-value-trim/query-signature.txt",
    "content": "e7bb0fd515e125e1aec2ecc4c0c17484fb06f6846b927c35e46005dd3df3acd4"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-header-value-trim/query-signed-request.txt",
    "content": "GET /?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fus-east-1%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-SignedHeaders=host%3Bmy-header1%3Bmy-header2&X-Amz-Expires=3600&X-Amz-Signature=e7bb0fd515e125e1aec2ecc4c0c17484fb06f6846b927c35e46005dd3df3acd4 HTTP/1.1\nHost:example.amazonaws.com\nMy-Header1: value1\nMy-Header2: \"a   b   c\"\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-header-value-trim/query-string-to-sign.txt",
    "content": "AWS4-HMAC-SHA256\n20150830T123600Z\n20150830/us-east-1/service/aws4_request\n84c9e353b6161b689210977f93b93e6a7182f9ecb2ceae8af8c3d86b080a88ae"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-header-value-trim/request.txt",
    "content": "GET / HTTP/1.1\nHost:example.amazonaws.com\nMy-Header1: value1\nMy-Header2: \"a   b   c\"\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-relative-normalized/context.json",
    "content": "{\n    \"credentials\": {\n        \"access_key_id\": \"AKIDEXAMPLE\",\n        \"secret_access_key\": \"wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY\"\n    },\n    \"expiration_in_seconds\": 3600,\n    \"normalize\": true,\n    \"region\": \"us-east-1\",\n    \"service\": \"service\",\n    \"sign_body\": false,\n    \"timestamp\": \"2015-08-30T12:36:00Z\"\n}"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-relative-normalized/header-canonical-request.txt",
    "content": "GET\n/\n\nhost:example.amazonaws.com\nx-amz-date:20150830T123600Z\n\nhost;x-amz-date\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-relative-normalized/header-signature.txt",
    "content": "5fa00fa31553b73ebf1942676e86291e8372ff2a2260956d9b8aae1d763fbf31"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-relative-normalized/header-signed-request.txt",
    "content": "GET /example/.. HTTP/1.1\nHost:example.amazonaws.com\nX-Amz-Date:20150830T123600Z\nAuthorization:AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=5fa00fa31553b73ebf1942676e86291e8372ff2a2260956d9b8aae1d763fbf31\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-relative-normalized/header-string-to-sign.txt",
    "content": "AWS4-HMAC-SHA256\n20150830T123600Z\n20150830/us-east-1/service/aws4_request\nbb579772317eb040ac9ed261061d46c1f17a8133879d6129b6e1c25292927e63"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-relative-normalized/query-canonical-request.txt",
    "content": "GET\n/\nX-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fus-east-1%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host\nhost:example.amazonaws.com\n\nhost\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-relative-normalized/query-signature.txt",
    "content": "e93c787ed7f371d5c6b165c1b38ede9550f4dce4144713e844b25b7192d3865d"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-relative-normalized/query-signed-request.txt",
    "content": "GET /example/..?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fus-east-1%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Signature=e93c787ed7f371d5c6b165c1b38ede9550f4dce4144713e844b25b7192d3865d HTTP/1.1\nHost:example.amazonaws.com\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-relative-normalized/query-string-to-sign.txt",
    "content": "AWS4-HMAC-SHA256\n20150830T123600Z\n20150830/us-east-1/service/aws4_request\nbb7705b4aa3cb8e8f5e1e0b3d4c0b64030797a313c8ceee43e33117cc43eadc5"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-relative-normalized/request.txt",
    "content": "GET /example/.. HTTP/1.1\nHost:example.amazonaws.com\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-relative-relative-normalized/context.json",
    "content": "{\n    \"credentials\": {\n        \"access_key_id\": \"AKIDEXAMPLE\",\n        \"secret_access_key\": \"wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY\"\n    },\n    \"expiration_in_seconds\": 3600,\n    \"normalize\": true,\n    \"region\": \"us-east-1\",\n    \"service\": \"service\",\n    \"sign_body\": false,\n    \"timestamp\": \"2015-08-30T12:36:00Z\"\n}"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-relative-relative-normalized/header-canonical-request.txt",
    "content": "GET\n/\n\nhost:example.amazonaws.com\nx-amz-date:20150830T123600Z\n\nhost;x-amz-date\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-relative-relative-normalized/header-signature.txt",
    "content": "5fa00fa31553b73ebf1942676e86291e8372ff2a2260956d9b8aae1d763fbf31"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-relative-relative-normalized/header-signed-request.txt",
    "content": "GET /example1/example2/../.. HTTP/1.1\nHost:example.amazonaws.com\nX-Amz-Date:20150830T123600Z\nAuthorization:AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=5fa00fa31553b73ebf1942676e86291e8372ff2a2260956d9b8aae1d763fbf31\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-relative-relative-normalized/header-string-to-sign.txt",
    "content": "AWS4-HMAC-SHA256\n20150830T123600Z\n20150830/us-east-1/service/aws4_request\nbb579772317eb040ac9ed261061d46c1f17a8133879d6129b6e1c25292927e63"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-relative-relative-normalized/query-canonical-request.txt",
    "content": "GET\n/\nX-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fus-east-1%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host\nhost:example.amazonaws.com\n\nhost\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-relative-relative-normalized/query-signature.txt",
    "content": "e93c787ed7f371d5c6b165c1b38ede9550f4dce4144713e844b25b7192d3865d"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-relative-relative-normalized/query-signed-request.txt",
    "content": "GET /example1/example2/../..?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fus-east-1%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Signature=e93c787ed7f371d5c6b165c1b38ede9550f4dce4144713e844b25b7192d3865d HTTP/1.1\nHost:example.amazonaws.com\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-relative-relative-normalized/query-string-to-sign.txt",
    "content": "AWS4-HMAC-SHA256\n20150830T123600Z\n20150830/us-east-1/service/aws4_request\nbb7705b4aa3cb8e8f5e1e0b3d4c0b64030797a313c8ceee43e33117cc43eadc5"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-relative-relative-normalized/request.txt",
    "content": "GET /example1/example2/../.. HTTP/1.1\nHost:example.amazonaws.com\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-relative-relative-unnormalized/context.json",
    "content": "{\n    \"credentials\": {\n        \"access_key_id\": \"AKIDEXAMPLE\",\n        \"secret_access_key\": \"wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY\"\n    },\n    \"expiration_in_seconds\": 3600,\n    \"normalize\": false,\n    \"region\": \"us-east-1\",\n    \"service\": \"service\",\n    \"sign_body\": false,\n    \"timestamp\": \"2015-08-30T12:36:00Z\"\n}"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-relative-relative-unnormalized/header-canonical-request.txt",
    "content": "GET\n/example1/example2/../..\n\nhost:example.amazonaws.com\nx-amz-date:20150830T123600Z\n\nhost;x-amz-date\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-relative-relative-unnormalized/header-signature.txt",
    "content": "dc33e0856fd4baca4d7aa2146c38958283844764f38c74252a333df5e613003b"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-relative-relative-unnormalized/header-signed-request.txt",
    "content": "GET /example1/example2/../.. HTTP/1.1\nHost:example.amazonaws.com\nX-Amz-Date:20150830T123600Z\nAuthorization:AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=dc33e0856fd4baca4d7aa2146c38958283844764f38c74252a333df5e613003b\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-relative-relative-unnormalized/header-string-to-sign.txt",
    "content": "AWS4-HMAC-SHA256\n20150830T123600Z\n20150830/us-east-1/service/aws4_request\n76115030c0f3ff06c20fdff5ceb6d5e0b835a1743e00b94fea7c7f381269437b"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-relative-relative-unnormalized/query-canonical-request.txt",
    "content": "GET\n/example1/example2/../..\nX-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fus-east-1%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host\nhost:example.amazonaws.com\n\nhost\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-relative-relative-unnormalized/query-signature.txt",
    "content": "b45db0bfd1cf15003493b733e33aa208dd981bd0e63037a6ed953f71d2118a16"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-relative-relative-unnormalized/query-signed-request.txt",
    "content": "GET /example1/example2/../..?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fus-east-1%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Signature=b45db0bfd1cf15003493b733e33aa208dd981bd0e63037a6ed953f71d2118a16 HTTP/1.1\nHost:example.amazonaws.com\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-relative-relative-unnormalized/query-string-to-sign.txt",
    "content": "AWS4-HMAC-SHA256\n20150830T123600Z\n20150830/us-east-1/service/aws4_request\n13b7758115ec070fe36a7ae9d754154ad73f6ee9a5eac022494857d0e7effc18"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-relative-relative-unnormalized/request.txt",
    "content": "GET /example1/example2/../.. HTTP/1.1\nHost:example.amazonaws.com\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-relative-unnormalized/context.json",
    "content": "{\n    \"credentials\": {\n        \"access_key_id\": \"AKIDEXAMPLE\",\n        \"secret_access_key\": \"wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY\"\n    },\n    \"expiration_in_seconds\": 3600,\n    \"normalize\": false,\n    \"region\": \"us-east-1\",\n    \"service\": \"service\",\n    \"sign_body\": false,\n    \"timestamp\": \"2015-08-30T12:36:00Z\"\n}"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-relative-unnormalized/header-canonical-request.txt",
    "content": "GET\n/example/..\n\nhost:example.amazonaws.com\nx-amz-date:20150830T123600Z\n\nhost;x-amz-date\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-relative-unnormalized/header-signature.txt",
    "content": "eca7ead57bb5aa5c8e28007acd4ff04e1ff9a0ff3b237ec1554a184887ff9282"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-relative-unnormalized/header-signed-request.txt",
    "content": "GET /example/.. HTTP/1.1\nHost:example.amazonaws.com\nX-Amz-Date:20150830T123600Z\nAuthorization:AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=eca7ead57bb5aa5c8e28007acd4ff04e1ff9a0ff3b237ec1554a184887ff9282\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-relative-unnormalized/header-string-to-sign.txt",
    "content": "AWS4-HMAC-SHA256\n20150830T123600Z\n20150830/us-east-1/service/aws4_request\n0511f456aa502b456d135fcb9d749374a55228f9dbeedda1eacf659e05b0615b"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-relative-unnormalized/query-canonical-request.txt",
    "content": "GET\n/example/..\nX-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fus-east-1%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host\nhost:example.amazonaws.com\n\nhost\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-relative-unnormalized/query-signature.txt",
    "content": "cbcb213b928a077e43275df47b500f1dfaa864ab3f5a18f6b95f4ff0938167ee"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-relative-unnormalized/query-signed-request.txt",
    "content": "GET /example/..?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fus-east-1%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Signature=cbcb213b928a077e43275df47b500f1dfaa864ab3f5a18f6b95f4ff0938167ee HTTP/1.1\nHost:example.amazonaws.com\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-relative-unnormalized/query-string-to-sign.txt",
    "content": "AWS4-HMAC-SHA256\n20150830T123600Z\n20150830/us-east-1/service/aws4_request\n6e02e2dba21d6f269bae339b86ff27a4b7bbc9d88c482abccbfbf8a49d602482"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-relative-unnormalized/request.txt",
    "content": "GET /example/.. HTTP/1.1\nHost:example.amazonaws.com\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-slash-dot-slash-normalized/context.json",
    "content": "{\n    \"credentials\": {\n        \"access_key_id\": \"AKIDEXAMPLE\",\n        \"secret_access_key\": \"wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY\"\n    },\n    \"expiration_in_seconds\": 3600,\n    \"normalize\": true,\n    \"region\": \"us-east-1\",\n    \"service\": \"service\",\n    \"sign_body\": false,\n    \"timestamp\": \"2015-08-30T12:36:00Z\"\n}"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-slash-dot-slash-normalized/header-canonical-request.txt",
    "content": "GET\n/\n\nhost:example.amazonaws.com\nx-amz-date:20150830T123600Z\n\nhost;x-amz-date\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-slash-dot-slash-normalized/header-signature.txt",
    "content": "5fa00fa31553b73ebf1942676e86291e8372ff2a2260956d9b8aae1d763fbf31"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-slash-dot-slash-normalized/header-signed-request.txt",
    "content": "GET /./ HTTP/1.1\nHost:example.amazonaws.com\nX-Amz-Date:20150830T123600Z\nAuthorization:AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=5fa00fa31553b73ebf1942676e86291e8372ff2a2260956d9b8aae1d763fbf31\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-slash-dot-slash-normalized/header-string-to-sign.txt",
    "content": "AWS4-HMAC-SHA256\n20150830T123600Z\n20150830/us-east-1/service/aws4_request\nbb579772317eb040ac9ed261061d46c1f17a8133879d6129b6e1c25292927e63"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-slash-dot-slash-normalized/query-canonical-request.txt",
    "content": "GET\n/\nX-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fus-east-1%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host\nhost:example.amazonaws.com\n\nhost\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-slash-dot-slash-normalized/query-signature.txt",
    "content": "e93c787ed7f371d5c6b165c1b38ede9550f4dce4144713e844b25b7192d3865d"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-slash-dot-slash-normalized/query-signed-request.txt",
    "content": "GET /./?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fus-east-1%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Signature=e93c787ed7f371d5c6b165c1b38ede9550f4dce4144713e844b25b7192d3865d HTTP/1.1\nHost:example.amazonaws.com\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-slash-dot-slash-normalized/query-string-to-sign.txt",
    "content": "AWS4-HMAC-SHA256\n20150830T123600Z\n20150830/us-east-1/service/aws4_request\nbb7705b4aa3cb8e8f5e1e0b3d4c0b64030797a313c8ceee43e33117cc43eadc5"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-slash-dot-slash-normalized/request.txt",
    "content": "GET /./ HTTP/1.1\nHost:example.amazonaws.com\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-slash-dot-slash-unnormalized/context.json",
    "content": "{\n    \"credentials\": {\n        \"access_key_id\": \"AKIDEXAMPLE\",\n        \"secret_access_key\": \"wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY\"\n    },\n    \"expiration_in_seconds\": 3600,\n    \"normalize\": false,\n    \"region\": \"us-east-1\",\n    \"service\": \"service\",\n    \"sign_body\": false,\n    \"timestamp\": \"2015-08-30T12:36:00Z\"\n}"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-slash-dot-slash-unnormalized/header-canonical-request.txt",
    "content": "GET\n/./\n\nhost:example.amazonaws.com\nx-amz-date:20150830T123600Z\n\nhost;x-amz-date\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-slash-dot-slash-unnormalized/header-signature.txt",
    "content": "68714168e6557f8f2de0ef956fc24dc2593a4bd2961f8df51898d8a134695145"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-slash-dot-slash-unnormalized/header-signed-request.txt",
    "content": "GET /./ HTTP/1.1\nHost:example.amazonaws.com\nX-Amz-Date:20150830T123600Z\nAuthorization:AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=68714168e6557f8f2de0ef956fc24dc2593a4bd2961f8df51898d8a134695145\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-slash-dot-slash-unnormalized/header-string-to-sign.txt",
    "content": "AWS4-HMAC-SHA256\n20150830T123600Z\n20150830/us-east-1/service/aws4_request\nd67825e2268bd77a97c7688b8d72c31a3c1855b309808505ba0a9747d2465aa7"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-slash-dot-slash-unnormalized/query-canonical-request.txt",
    "content": "GET\n/./\nX-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fus-east-1%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host\nhost:example.amazonaws.com\n\nhost\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-slash-dot-slash-unnormalized/query-signature.txt",
    "content": "a9b13e8f3484d9505bf1a6f347219f8f35b0fe8f128ceea597efc146a3dfe90c"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-slash-dot-slash-unnormalized/query-signed-request.txt",
    "content": "GET /./?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fus-east-1%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Signature=a9b13e8f3484d9505bf1a6f347219f8f35b0fe8f128ceea597efc146a3dfe90c HTTP/1.1\nHost:example.amazonaws.com\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-slash-dot-slash-unnormalized/query-string-to-sign.txt",
    "content": "AWS4-HMAC-SHA256\n20150830T123600Z\n20150830/us-east-1/service/aws4_request\n21b2da17873f30c1a7410efdc271738b318ccc2c9c6fbe1289fc242aeb1a8ae1"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-slash-dot-slash-unnormalized/request.txt",
    "content": "GET /./ HTTP/1.1\nHost:example.amazonaws.com\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-slash-normalized/context.json",
    "content": "{\n    \"credentials\": {\n        \"access_key_id\": \"AKIDEXAMPLE\",\n        \"secret_access_key\": \"wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY\"\n    },\n    \"expiration_in_seconds\": 3600,\n    \"normalize\": true,\n    \"region\": \"us-east-1\",\n    \"service\": \"service\",\n    \"sign_body\": false,\n    \"timestamp\": \"2015-08-30T12:36:00Z\"\n}"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-slash-normalized/header-canonical-request.txt",
    "content": "GET\n/\n\nhost:example.amazonaws.com\nx-amz-date:20150830T123600Z\n\nhost;x-amz-date\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-slash-normalized/header-signature.txt",
    "content": "5fa00fa31553b73ebf1942676e86291e8372ff2a2260956d9b8aae1d763fbf31"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-slash-normalized/header-signed-request.txt",
    "content": "GET // HTTP/1.1\nHost:example.amazonaws.com\nX-Amz-Date:20150830T123600Z\nAuthorization:AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=5fa00fa31553b73ebf1942676e86291e8372ff2a2260956d9b8aae1d763fbf31\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-slash-normalized/header-string-to-sign.txt",
    "content": "AWS4-HMAC-SHA256\n20150830T123600Z\n20150830/us-east-1/service/aws4_request\nbb579772317eb040ac9ed261061d46c1f17a8133879d6129b6e1c25292927e63"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-slash-normalized/query-canonical-request.txt",
    "content": "GET\n/\nX-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fus-east-1%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host\nhost:example.amazonaws.com\n\nhost\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-slash-normalized/query-signature.txt",
    "content": "e93c787ed7f371d5c6b165c1b38ede9550f4dce4144713e844b25b7192d3865d"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-slash-normalized/query-signed-request.txt",
    "content": "GET //?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fus-east-1%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Signature=e93c787ed7f371d5c6b165c1b38ede9550f4dce4144713e844b25b7192d3865d HTTP/1.1\nHost:example.amazonaws.com\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-slash-normalized/query-string-to-sign.txt",
    "content": "AWS4-HMAC-SHA256\n20150830T123600Z\n20150830/us-east-1/service/aws4_request\nbb7705b4aa3cb8e8f5e1e0b3d4c0b64030797a313c8ceee43e33117cc43eadc5"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-slash-normalized/request.txt",
    "content": "GET // HTTP/1.1\nHost:example.amazonaws.com\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-slash-pointless-dot-normalized/context.json",
    "content": "{\n    \"credentials\": {\n        \"access_key_id\": \"AKIDEXAMPLE\",\n        \"secret_access_key\": \"wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY\"\n    },\n    \"expiration_in_seconds\": 3600,\n    \"normalize\": true,\n    \"region\": \"us-east-1\",\n    \"service\": \"service\",\n    \"sign_body\": false,\n    \"timestamp\": \"2015-08-30T12:36:00Z\"\n}"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-slash-pointless-dot-normalized/header-canonical-request.txt",
    "content": "GET\n/example\n\nhost:example.amazonaws.com\nx-amz-date:20150830T123600Z\n\nhost;x-amz-date\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-slash-pointless-dot-normalized/header-signature.txt",
    "content": "ef75d96142cf21edca26f06005da7988e4f8dc83a165a80865db7089db637ec5"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-slash-pointless-dot-normalized/header-signed-request.txt",
    "content": "GET /./example HTTP/1.1\nHost:example.amazonaws.com\nX-Amz-Date:20150830T123600Z\nAuthorization:AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=ef75d96142cf21edca26f06005da7988e4f8dc83a165a80865db7089db637ec5\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-slash-pointless-dot-normalized/header-string-to-sign.txt",
    "content": "AWS4-HMAC-SHA256\n20150830T123600Z\n20150830/us-east-1/service/aws4_request\n214d50c111a8edc4819da6a636336472c916b5240f51e9a51b5c3305180cf702"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-slash-pointless-dot-normalized/query-canonical-request.txt",
    "content": "GET\n/example\nX-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fus-east-1%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host\nhost:example.amazonaws.com\n\nhost\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-slash-pointless-dot-normalized/query-signature.txt",
    "content": "35034b1a0bdd969f346975386daf8aedfd4976573b8348cf4f67eaa41c5857de"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-slash-pointless-dot-normalized/query-signed-request.txt",
    "content": "GET /./example?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fus-east-1%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Signature=35034b1a0bdd969f346975386daf8aedfd4976573b8348cf4f67eaa41c5857de HTTP/1.1\nHost:example.amazonaws.com\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-slash-pointless-dot-normalized/query-string-to-sign.txt",
    "content": "AWS4-HMAC-SHA256\n20150830T123600Z\n20150830/us-east-1/service/aws4_request\n88dd73bb06de69cb042dbb82cadbb4fce1a2623615d94520c271614abf94e738"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-slash-pointless-dot-normalized/request.txt",
    "content": "GET /./example HTTP/1.1\nHost:example.amazonaws.com\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-slash-pointless-dot-unnormalized/context.json",
    "content": "{\n    \"credentials\": {\n        \"access_key_id\": \"AKIDEXAMPLE\",\n        \"secret_access_key\": \"wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY\"\n    },\n    \"expiration_in_seconds\": 3600,\n    \"normalize\": false,\n    \"region\": \"us-east-1\",\n    \"service\": \"service\",\n    \"sign_body\": false,\n    \"timestamp\": \"2015-08-30T12:36:00Z\"\n}"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-slash-pointless-dot-unnormalized/header-canonical-request.txt",
    "content": "GET\n/./example\n\nhost:example.amazonaws.com\nx-amz-date:20150830T123600Z\n\nhost;x-amz-date\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-slash-pointless-dot-unnormalized/header-signature.txt",
    "content": "beb03f223f7deae4146464f06e29eebbee9c8afbe15c290cf07aa8b119e14cff"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-slash-pointless-dot-unnormalized/header-signed-request.txt",
    "content": "GET /./example HTTP/1.1\nHost:example.amazonaws.com\nX-Amz-Date:20150830T123600Z\nAuthorization:AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=beb03f223f7deae4146464f06e29eebbee9c8afbe15c290cf07aa8b119e14cff\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-slash-pointless-dot-unnormalized/header-string-to-sign.txt",
    "content": "AWS4-HMAC-SHA256\n20150830T123600Z\n20150830/us-east-1/service/aws4_request\n73895e0e829507e28e39fd24669aedc2434a8e179e547e3c075b42921f952cdb"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-slash-pointless-dot-unnormalized/query-canonical-request.txt",
    "content": "GET\n/./example\nX-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fus-east-1%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host\nhost:example.amazonaws.com\n\nhost\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-slash-pointless-dot-unnormalized/query-signature.txt",
    "content": "72b11f16d9530b18204bfb71f2d6ab085894c0ed8d352730a6e76234c58b5e10"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-slash-pointless-dot-unnormalized/query-signed-request.txt",
    "content": "GET /./example?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fus-east-1%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Signature=72b11f16d9530b18204bfb71f2d6ab085894c0ed8d352730a6e76234c58b5e10 HTTP/1.1\nHost:example.amazonaws.com\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-slash-pointless-dot-unnormalized/query-string-to-sign.txt",
    "content": "AWS4-HMAC-SHA256\n20150830T123600Z\n20150830/us-east-1/service/aws4_request\ncb23444939471187ac1f0fb25d437337af0d5f48b5ae0ede5baa3727c8c6af92"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-slash-pointless-dot-unnormalized/request.txt",
    "content": "GET /./example HTTP/1.1\nHost:example.amazonaws.com\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-slash-unnormalized/context.json",
    "content": "{\n    \"credentials\": {\n        \"access_key_id\": \"AKIDEXAMPLE\",\n        \"secret_access_key\": \"wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY\"\n    },\n    \"expiration_in_seconds\": 3600,\n    \"normalize\": false,\n    \"region\": \"us-east-1\",\n    \"service\": \"service\",\n    \"sign_body\": false,\n    \"timestamp\": \"2015-08-30T12:36:00Z\"\n}"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-slash-unnormalized/header-canonical-request.txt",
    "content": "GET\n//\n\nhost:example.amazonaws.com\nx-amz-date:20150830T123600Z\n\nhost;x-amz-date\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-slash-unnormalized/header-signature.txt",
    "content": "c88bcd3d312d75078c0cd961d6deae3f4c754924b01669efcfcb439fd5e5b76e"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-slash-unnormalized/header-signed-request.txt",
    "content": "GET // HTTP/1.1\nHost:example.amazonaws.com\nX-Amz-Date:20150830T123600Z\nAuthorization:AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=c88bcd3d312d75078c0cd961d6deae3f4c754924b01669efcfcb439fd5e5b76e\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-slash-unnormalized/header-string-to-sign.txt",
    "content": "AWS4-HMAC-SHA256\n20150830T123600Z\n20150830/us-east-1/service/aws4_request\n80cb39203d058af815de2b79250ff56e1b73eb9b4718c86556cdc6f150c5d209"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-slash-unnormalized/query-canonical-request.txt",
    "content": "GET\n//\nX-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fus-east-1%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host\nhost:example.amazonaws.com\n\nhost\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-slash-unnormalized/query-signature.txt",
    "content": "b2a9542809db687769200f56a844a03f2bd0291d6eb90232d5101c6a579446cd"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-slash-unnormalized/query-signed-request.txt",
    "content": "GET //?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fus-east-1%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Signature=b2a9542809db687769200f56a844a03f2bd0291d6eb90232d5101c6a579446cd HTTP/1.1\nHost:example.amazonaws.com\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-slash-unnormalized/query-string-to-sign.txt",
    "content": "AWS4-HMAC-SHA256\n20150830T123600Z\n20150830/us-east-1/service/aws4_request\ne10a01494cafa1f2207c4de80c69b7a36d6f2d282aa63ee64a5ca50e175cf730"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-slash-unnormalized/request.txt",
    "content": "GET // HTTP/1.1\nHost:example.amazonaws.com\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-slashes-normalized/context.json",
    "content": "{\n    \"credentials\": {\n        \"access_key_id\": \"AKIDEXAMPLE\",\n        \"secret_access_key\": \"wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY\"\n    },\n    \"expiration_in_seconds\": 3600,\n    \"normalize\": true,\n    \"region\": \"us-east-1\",\n    \"service\": \"service\",\n    \"sign_body\": false,\n    \"timestamp\": \"2015-08-30T12:36:00Z\"\n}"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-slashes-normalized/header-canonical-request.txt",
    "content": "GET\n/example/\n\nhost:example.amazonaws.com\nx-amz-date:20150830T123600Z\n\nhost;x-amz-date\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-slashes-normalized/header-signature.txt",
    "content": "9a624bd73a37c9a373b5312afbebe7a714a789de108f0bdfe846570885f57e84"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-slashes-normalized/header-signed-request.txt",
    "content": "GET //example// HTTP/1.1\nHost:example.amazonaws.com\nX-Amz-Date:20150830T123600Z\nAuthorization:AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=9a624bd73a37c9a373b5312afbebe7a714a789de108f0bdfe846570885f57e84\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-slashes-normalized/header-string-to-sign.txt",
    "content": "AWS4-HMAC-SHA256\n20150830T123600Z\n20150830/us-east-1/service/aws4_request\ncb96b4ac96d501f7c5c15bc6d67b3035061cfced4af6585ad927f7e6c985c015"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-slashes-normalized/query-canonical-request.txt",
    "content": "GET\n/example/\nX-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fus-east-1%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host\nhost:example.amazonaws.com\n\nhost\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-slashes-normalized/query-signature.txt",
    "content": "c1834e8fb0307243711f0f907f6ab7311ed300d87f13792d7ee4da89ab93e082"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-slashes-normalized/query-signed-request.txt",
    "content": "GET //example//?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fus-east-1%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Signature=c1834e8fb0307243711f0f907f6ab7311ed300d87f13792d7ee4da89ab93e082 HTTP/1.1\nHost:example.amazonaws.com\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-slashes-normalized/query-string-to-sign.txt",
    "content": "AWS4-HMAC-SHA256\n20150830T123600Z\n20150830/us-east-1/service/aws4_request\n1a3e3fe19998c62136ed2ff9c8531973a46d4a21b336f58e8fcad185ec64d642"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-slashes-normalized/request.txt",
    "content": "GET //example// HTTP/1.1\nHost:example.amazonaws.com\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-slashes-unnormalized/context.json",
    "content": "{\n    \"credentials\": {\n        \"access_key_id\": \"AKIDEXAMPLE\",\n        \"secret_access_key\": \"wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY\"\n    },\n    \"expiration_in_seconds\": 3600,\n    \"normalize\": false,\n    \"region\": \"us-east-1\",\n    \"service\": \"service\",\n    \"sign_body\": false,\n    \"timestamp\": \"2015-08-30T12:36:00Z\"\n}"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-slashes-unnormalized/header-canonical-request.txt",
    "content": "GET\n//example//\n\nhost:example.amazonaws.com\nx-amz-date:20150830T123600Z\n\nhost;x-amz-date\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-slashes-unnormalized/header-signature.txt",
    "content": "87cca117541a147f6df867677d98a7d80dff226d2bfca9e4ffa899665623c7e5"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-slashes-unnormalized/header-signed-request.txt",
    "content": "GET //example// HTTP/1.1\nHost:example.amazonaws.com\nX-Amz-Date:20150830T123600Z\nAuthorization:AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=87cca117541a147f6df867677d98a7d80dff226d2bfca9e4ffa899665623c7e5\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-slashes-unnormalized/header-string-to-sign.txt",
    "content": "AWS4-HMAC-SHA256\n20150830T123600Z\n20150830/us-east-1/service/aws4_request\n528ec3105ee1f34ab014bb0a1a45da0ed2742a4fea3555149e5b4d5d201eb240"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-slashes-unnormalized/query-canonical-request.txt",
    "content": "GET\n//example//\nX-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fus-east-1%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host\nhost:example.amazonaws.com\n\nhost\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-slashes-unnormalized/query-signature.txt",
    "content": "822a5a9ba28072c5ab2bb4a6307d0c88276d40e49fec6b724c03fb4d4ba60fc2"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-slashes-unnormalized/query-signed-request.txt",
    "content": "GET //example//?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fus-east-1%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Signature=822a5a9ba28072c5ab2bb4a6307d0c88276d40e49fec6b724c03fb4d4ba60fc2 HTTP/1.1\nHost:example.amazonaws.com\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-slashes-unnormalized/query-string-to-sign.txt",
    "content": "AWS4-HMAC-SHA256\n20150830T123600Z\n20150830/us-east-1/service/aws4_request\n82241114f9a6320f054333c890952474aa7a0069d28a4326c3a8d95bbecc69ee"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-slashes-unnormalized/request.txt",
    "content": "GET //example// HTTP/1.1\nHost:example.amazonaws.com\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-space-normalized/context.json",
    "content": "{\n    \"credentials\": {\n        \"access_key_id\": \"AKIDEXAMPLE\",\n        \"secret_access_key\": \"wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY\"\n    },\n    \"expiration_in_seconds\": 3600,\n    \"normalize\": true,\n    \"region\": \"us-east-1\",\n    \"service\": \"service\",\n    \"sign_body\": false,\n    \"timestamp\": \"2015-08-30T12:36:00Z\"\n}"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-space-normalized/header-canonical-request.txt",
    "content": "GET\n/example%20space/\n\nhost:example.amazonaws.com\nx-amz-date:20150830T123600Z\n\nhost;x-amz-date\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-space-normalized/header-signature.txt",
    "content": "652487583200325589f1fba4c7e578f72c47cb61beeca81406b39ddec1366741"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-space-normalized/header-signed-request.txt",
    "content": "GET /example space/ HTTP/1.1\nHost:example.amazonaws.com\nX-Amz-Date:20150830T123600Z\nAuthorization:AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=652487583200325589f1fba4c7e578f72c47cb61beeca81406b39ddec1366741\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-space-normalized/header-string-to-sign.txt",
    "content": "AWS4-HMAC-SHA256\n20150830T123600Z\n20150830/us-east-1/service/aws4_request\n63ee75631ed7234ae61b5f736dfc7754cdccfedbff4b5128a915706ee9390d86"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-space-normalized/query-canonical-request.txt",
    "content": "GET\n/example%20space/\nX-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fus-east-1%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host\nhost:example.amazonaws.com\n\nhost\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-space-normalized/query-signature.txt",
    "content": "7a1f416954786484c9824d93c1f26ef64acb9b1b6c9154d08c9f07d0e394abf6"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-space-normalized/query-signed-request.txt",
    "content": "GET /example space/?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fus-east-1%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Signature=7a1f416954786484c9824d93c1f26ef64acb9b1b6c9154d08c9f07d0e394abf6 HTTP/1.1\nHost:example.amazonaws.com\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-space-normalized/query-string-to-sign.txt",
    "content": "AWS4-HMAC-SHA256\n20150830T123600Z\n20150830/us-east-1/service/aws4_request\ncc3dd817bd405e51225826ec4934a96d065d6af5b6b0163c7a5abbd26a84519e"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-space-normalized/request.txt",
    "content": "GET /example%20space/ HTTP/1.1\nHost:example.amazonaws.com\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-space-unnormalized/context.json",
    "content": "{\n    \"credentials\": {\n        \"access_key_id\": \"AKIDEXAMPLE\",\n        \"secret_access_key\": \"wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY\"\n    },\n    \"expiration_in_seconds\": 3600,\n    \"normalize\": false,\n    \"region\": \"us-east-1\",\n    \"service\": \"service\",\n    \"sign_body\": false,\n    \"timestamp\": \"2015-08-30T12:36:00Z\"\n}"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-space-unnormalized/header-canonical-request.txt",
    "content": "GET\n/example%20space/\n\nhost:example.amazonaws.com\nx-amz-date:20150830T123600Z\n\nhost;x-amz-date\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-space-unnormalized/header-signature.txt",
    "content": "652487583200325589f1fba4c7e578f72c47cb61beeca81406b39ddec1366741"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-space-unnormalized/header-signed-request.txt",
    "content": "GET /example space/ HTTP/1.1\nHost:example.amazonaws.com\nX-Amz-Date:20150830T123600Z\nAuthorization:AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=652487583200325589f1fba4c7e578f72c47cb61beeca81406b39ddec1366741\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-space-unnormalized/header-string-to-sign.txt",
    "content": "AWS4-HMAC-SHA256\n20150830T123600Z\n20150830/us-east-1/service/aws4_request\n63ee75631ed7234ae61b5f736dfc7754cdccfedbff4b5128a915706ee9390d86"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-space-unnormalized/query-canonical-request.txt",
    "content": "GET\n/example%20space/\nX-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fus-east-1%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host\nhost:example.amazonaws.com\n\nhost\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-space-unnormalized/query-signature.txt",
    "content": "7a1f416954786484c9824d93c1f26ef64acb9b1b6c9154d08c9f07d0e394abf6"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-space-unnormalized/query-signed-request.txt",
    "content": "GET /example space/?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fus-east-1%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Signature=7a1f416954786484c9824d93c1f26ef64acb9b1b6c9154d08c9f07d0e394abf6 HTTP/1.1\nHost:example.amazonaws.com\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-space-unnormalized/query-string-to-sign.txt",
    "content": "AWS4-HMAC-SHA256\n20150830T123600Z\n20150830/us-east-1/service/aws4_request\ncc3dd817bd405e51225826ec4934a96d065d6af5b6b0163c7a5abbd26a84519e"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-space-unnormalized/request.txt",
    "content": "GET /example space/ HTTP/1.1\nHost:example.amazonaws.com\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-unreserved/context.json",
    "content": "{\n    \"credentials\": {\n        \"access_key_id\": \"AKIDEXAMPLE\",\n        \"secret_access_key\": \"wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY\"\n    },\n    \"expiration_in_seconds\": 3600,\n    \"normalize\": true,\n    \"region\": \"us-east-1\",\n    \"service\": \"service\",\n    \"sign_body\": false,\n    \"timestamp\": \"2015-08-30T12:36:00Z\"\n}"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-unreserved/header-canonical-request.txt",
    "content": "GET\n/-._~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\n\nhost:example.amazonaws.com\nx-amz-date:20150830T123600Z\n\nhost;x-amz-date\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-unreserved/header-signature.txt",
    "content": "07ef7494c76fa4850883e2b006601f940f8a34d404d0cfa977f52a65bbf5f24f"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-unreserved/header-signed-request.txt",
    "content": "GET /-._~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz HTTP/1.1\nHost:example.amazonaws.com\nX-Amz-Date:20150830T123600Z\nAuthorization:AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=07ef7494c76fa4850883e2b006601f940f8a34d404d0cfa977f52a65bbf5f24f\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-unreserved/header-string-to-sign.txt",
    "content": "AWS4-HMAC-SHA256\n20150830T123600Z\n20150830/us-east-1/service/aws4_request\n6a968768eefaa713e2a6b16b589a8ea192661f098f37349f4e2c0082757446f9"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-unreserved/query-canonical-request.txt",
    "content": "GET\n/-._~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\nX-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fus-east-1%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host\nhost:example.amazonaws.com\n\nhost\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-unreserved/query-signature.txt",
    "content": "95968482db1b9e0fadef6efc1bd24689f77c77d9ef56919c96a28cc92e0d6005"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-unreserved/query-signed-request.txt",
    "content": "GET /-._~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fus-east-1%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Signature=95968482db1b9e0fadef6efc1bd24689f77c77d9ef56919c96a28cc92e0d6005 HTTP/1.1\nHost:example.amazonaws.com\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-unreserved/query-string-to-sign.txt",
    "content": "AWS4-HMAC-SHA256\n20150830T123600Z\n20150830/us-east-1/service/aws4_request\n3134f2fbc6ef58f34b74b01643a159bfccbc121ea4288a4b75e65bc805d08219"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-unreserved/request.txt",
    "content": "GET /-._~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz HTTP/1.1\nHost:example.amazonaws.com\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-utf8/context.json",
    "content": "{\n    \"credentials\": {\n        \"access_key_id\": \"AKIDEXAMPLE\",\n        \"secret_access_key\": \"wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY\"\n    },\n    \"expiration_in_seconds\": 3600,\n    \"normalize\": true,\n    \"region\": \"us-east-1\",\n    \"service\": \"service\",\n    \"sign_body\": false,\n    \"timestamp\": \"2015-08-30T12:36:00Z\"\n}"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-utf8/header-canonical-request.txt",
    "content": "GET\n/%E1%88%B4\n\nhost:example.amazonaws.com\nx-amz-date:20150830T123600Z\n\nhost;x-amz-date\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-utf8/header-signature.txt",
    "content": "8318018e0b0f223aa2bbf98705b62bb787dc9c0e678f255a891fd03141be5d85"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-utf8/header-signed-request.txt",
    "content": "GET /ሴ HTTP/1.1\nHost:example.amazonaws.com\nX-Amz-Date:20150830T123600Z\nAuthorization:AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=8318018e0b0f223aa2bbf98705b62bb787dc9c0e678f255a891fd03141be5d85\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-utf8/header-string-to-sign.txt",
    "content": "AWS4-HMAC-SHA256\n20150830T123600Z\n20150830/us-east-1/service/aws4_request\n2a0a97d02205e45ce2e994789806b19270cfbbb0921b278ccf58f5249ac42102"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-utf8/query-canonical-request.txt",
    "content": "GET\n/%E1%88%B4\nX-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fus-east-1%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host\nhost:example.amazonaws.com\n\nhost\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-utf8/query-signature.txt",
    "content": "10eae3f14a260bd3911cc6d008d3c576d143b05b62f09782a7a4b37f52178e44"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-utf8/query-signed-request.txt",
    "content": "GET /ሴ?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fus-east-1%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Signature=10eae3f14a260bd3911cc6d008d3c576d143b05b62f09782a7a4b37f52178e44 HTTP/1.1\nHost:example.amazonaws.com\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-utf8/query-string-to-sign.txt",
    "content": "AWS4-HMAC-SHA256\n20150830T123600Z\n20150830/us-east-1/service/aws4_request\nd8f78e05d0d9bb1c16ae1e60ed405de76cfb8fdcd3e414ffe65fad563b996d66"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-utf8/request.txt",
    "content": "GET /ሴ HTTP/1.1\nHost:example.amazonaws.com\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-vanilla/context.json",
    "content": "{\n    \"credentials\": {\n        \"access_key_id\": \"AKIDEXAMPLE\",\n        \"secret_access_key\": \"wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY\"\n    },\n    \"expiration_in_seconds\": 3600,\n    \"normalize\": true,\n    \"region\": \"us-east-1\",\n    \"service\": \"service\",\n    \"sign_body\": false,\n    \"timestamp\": \"2015-08-30T12:36:00Z\"\n}"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-vanilla/header-canonical-request.txt",
    "content": "GET\n/\n\nhost:example.amazonaws.com\nx-amz-date:20150830T123600Z\n\nhost;x-amz-date\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-vanilla/header-signature.txt",
    "content": "5fa00fa31553b73ebf1942676e86291e8372ff2a2260956d9b8aae1d763fbf31"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-vanilla/header-signed-request.txt",
    "content": "GET / HTTP/1.1\nHost:example.amazonaws.com\nX-Amz-Date:20150830T123600Z\nAuthorization:AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=5fa00fa31553b73ebf1942676e86291e8372ff2a2260956d9b8aae1d763fbf31\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-vanilla/header-string-to-sign.txt",
    "content": "AWS4-HMAC-SHA256\n20150830T123600Z\n20150830/us-east-1/service/aws4_request\nbb579772317eb040ac9ed261061d46c1f17a8133879d6129b6e1c25292927e63"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-vanilla/query-canonical-request.txt",
    "content": "GET\n/\nX-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fus-east-1%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host\nhost:example.amazonaws.com\n\nhost\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-vanilla/query-signature.txt",
    "content": "e93c787ed7f371d5c6b165c1b38ede9550f4dce4144713e844b25b7192d3865d"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-vanilla/query-signed-request.txt",
    "content": "GET /?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fus-east-1%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Signature=e93c787ed7f371d5c6b165c1b38ede9550f4dce4144713e844b25b7192d3865d HTTP/1.1\nHost:example.amazonaws.com\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-vanilla/query-string-to-sign.txt",
    "content": "AWS4-HMAC-SHA256\n20150830T123600Z\n20150830/us-east-1/service/aws4_request\nbb7705b4aa3cb8e8f5e1e0b3d4c0b64030797a313c8ceee43e33117cc43eadc5"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-vanilla/request.txt",
    "content": "GET / HTTP/1.1\nHost:example.amazonaws.com\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-vanilla-empty-query-key/context.json",
    "content": "{\n    \"credentials\": {\n        \"access_key_id\": \"AKIDEXAMPLE\",\n        \"secret_access_key\": \"wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY\"\n    },\n    \"expiration_in_seconds\": 3600,\n    \"normalize\": true,\n    \"region\": \"us-east-1\",\n    \"service\": \"service\",\n    \"sign_body\": false,\n    \"timestamp\": \"2015-08-30T12:36:00Z\"\n}"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-vanilla-empty-query-key/header-canonical-request.txt",
    "content": "GET\n/\nParam1=value1\nhost:example.amazonaws.com\nx-amz-date:20150830T123600Z\n\nhost;x-amz-date\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-vanilla-empty-query-key/header-signature.txt",
    "content": "a67d582fa61cc504c4bae71f336f98b97f1ea3c7a6bfe1b6e45aec72011b9aeb"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-vanilla-empty-query-key/header-signed-request.txt",
    "content": "GET /?Param1=value1 HTTP/1.1\nHost:example.amazonaws.com\nX-Amz-Date:20150830T123600Z\nAuthorization:AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=a67d582fa61cc504c4bae71f336f98b97f1ea3c7a6bfe1b6e45aec72011b9aeb\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-vanilla-empty-query-key/header-string-to-sign.txt",
    "content": "AWS4-HMAC-SHA256\n20150830T123600Z\n20150830/us-east-1/service/aws4_request\n1e24db194ed7d0eec2de28d7369675a243488e08526e8c1c73571282f7c517ab"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-vanilla-empty-query-key/query-canonical-request.txt",
    "content": "GET\n/\nParam1=value1&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fus-east-1%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host\nhost:example.amazonaws.com\n\nhost\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-vanilla-empty-query-key/query-signature.txt",
    "content": "49096700cbbaa5753443850f40df10f904fc2fdb544dc9512203cc77c471a9de"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-vanilla-empty-query-key/query-signed-request.txt",
    "content": "GET /?Param1=value1&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fus-east-1%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Signature=49096700cbbaa5753443850f40df10f904fc2fdb544dc9512203cc77c471a9de HTTP/1.1\nHost:example.amazonaws.com\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-vanilla-empty-query-key/query-string-to-sign.txt",
    "content": "AWS4-HMAC-SHA256\n20150830T123600Z\n20150830/us-east-1/service/aws4_request\n74828b608f939673ed5a839190452a943b0178760f258da766209b21f8ca3f86"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-vanilla-empty-query-key/request.txt",
    "content": "GET /?Param1=value1 HTTP/1.1\nHost:example.amazonaws.com\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-vanilla-query/context.json",
    "content": "{\n    \"credentials\": {\n        \"access_key_id\": \"AKIDEXAMPLE\",\n        \"secret_access_key\": \"wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY\"\n    },\n    \"expiration_in_seconds\": 3600,\n    \"normalize\": true,\n    \"region\": \"us-east-1\",\n    \"service\": \"service\",\n    \"sign_body\": false,\n    \"timestamp\": \"2015-08-30T12:36:00Z\"\n}"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-vanilla-query/header-canonical-request.txt",
    "content": "GET\n/\n\nhost:example.amazonaws.com\nx-amz-date:20150830T123600Z\n\nhost;x-amz-date\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-vanilla-query/header-signature.txt",
    "content": "5fa00fa31553b73ebf1942676e86291e8372ff2a2260956d9b8aae1d763fbf31"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-vanilla-query/header-signed-request.txt",
    "content": "GET / HTTP/1.1\nHost:example.amazonaws.com\nX-Amz-Date:20150830T123600Z\nAuthorization:AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=5fa00fa31553b73ebf1942676e86291e8372ff2a2260956d9b8aae1d763fbf31\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-vanilla-query/header-string-to-sign.txt",
    "content": "AWS4-HMAC-SHA256\n20150830T123600Z\n20150830/us-east-1/service/aws4_request\nbb579772317eb040ac9ed261061d46c1f17a8133879d6129b6e1c25292927e63"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-vanilla-query/query-canonical-request.txt",
    "content": "GET\n/\nX-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fus-east-1%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host\nhost:example.amazonaws.com\n\nhost\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-vanilla-query/query-signature.txt",
    "content": "e93c787ed7f371d5c6b165c1b38ede9550f4dce4144713e844b25b7192d3865d"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-vanilla-query/query-signed-request.txt",
    "content": "GET /?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fus-east-1%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Signature=e93c787ed7f371d5c6b165c1b38ede9550f4dce4144713e844b25b7192d3865d HTTP/1.1\nHost:example.amazonaws.com\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-vanilla-query/query-string-to-sign.txt",
    "content": "AWS4-HMAC-SHA256\n20150830T123600Z\n20150830/us-east-1/service/aws4_request\nbb7705b4aa3cb8e8f5e1e0b3d4c0b64030797a313c8ceee43e33117cc43eadc5"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-vanilla-query/request.txt",
    "content": "GET / HTTP/1.1\nHost:example.amazonaws.com\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-vanilla-query-order-encoded/context.json",
    "content": "{\n    \"credentials\": {\n        \"access_key_id\": \"AKIDEXAMPLE\",\n        \"secret_access_key\": \"wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY\"\n    },\n    \"expiration_in_seconds\": 3600,\n    \"normalize\": true,\n    \"region\": \"us-east-1\",\n    \"service\": \"service\",\n    \"sign_body\": false,\n    \"timestamp\": \"2015-08-30T12:36:00Z\"\n}"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-vanilla-query-order-encoded/header-canonical-request.txt",
    "content": "GET\n/\n%E1%88%B4=Value1&Param=Value2&Param-3=Value3\nhost:example.amazonaws.com\nx-amz-date:20150830T123600Z\n\nhost;x-amz-date\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-vanilla-query-order-encoded/header-signature.txt",
    "content": "371d3713e185cc334048618a97f809c9ffe339c62934c032af5a0e595648fcac"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-vanilla-query-order-encoded/header-signed-request.txt",
    "content": "GET /?Param-3=Value3&Param=Value2&%E1%88%B4=Value1 HTTP/1.1\nHost:example.amazonaws.com\nX-Amz-Date:20150830T123600Z\nAuthorization:AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=371d3713e185cc334048618a97f809c9ffe339c62934c032af5a0e595648fcac\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-vanilla-query-order-encoded/header-string-to-sign.txt",
    "content": "AWS4-HMAC-SHA256\n20150830T123600Z\n20150830/us-east-1/service/aws4_request\n868294f5c38bd141c4972a373a76654f1418a8e4fc18b2e7903ae45e8ae0ec71"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-vanilla-query-order-encoded/query-canonical-request.txt",
    "content": "GET\n/\n%E1%88%B4=Value1&Param=Value2&Param-3=Value3&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fus-east-1%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host\nhost:example.amazonaws.com\n\nhost\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-vanilla-query-order-encoded/query-signature.txt",
    "content": "c5f1848ceec943ac2ca68ee720460c23aaae30a2300586597ada94c4a65e4787"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-vanilla-query-order-encoded/query-signed-request.txt",
    "content": "GET /?Param-3=Value3&Param=Value2&%E1%88%B4=Value1&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fus-east-1%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Signature=c5f1848ceec943ac2ca68ee720460c23aaae30a2300586597ada94c4a65e4787 HTTP/1.1\nHost:example.amazonaws.com\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-vanilla-query-order-encoded/query-string-to-sign.txt",
    "content": "AWS4-HMAC-SHA256\n20150830T123600Z\n20150830/us-east-1/service/aws4_request\n9808d6cdc8245c74e705c68350fc6a62b91778cdd613890e5d177998c02c6f53"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-vanilla-query-order-encoded/request.txt",
    "content": "GET /?Param-3=Value3&Param=Value2&%E1%88%B4=Value1 HTTP/1.1\nHost:example.amazonaws.com\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-vanilla-query-order-key-case/context.json",
    "content": "{\n    \"credentials\": {\n        \"access_key_id\": \"AKIDEXAMPLE\",\n        \"secret_access_key\": \"wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY\"\n    },\n    \"expiration_in_seconds\": 3600,\n    \"normalize\": true,\n    \"region\": \"us-east-1\",\n    \"service\": \"service\",\n    \"sign_body\": false,\n    \"timestamp\": \"2015-08-30T12:36:00Z\"\n}"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-vanilla-query-order-key-case/header-canonical-request.txt",
    "content": "GET\n/\nParam1=value1&Param2=value2\nhost:example.amazonaws.com\nx-amz-date:20150830T123600Z\n\nhost;x-amz-date\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-vanilla-query-order-key-case/header-signature.txt",
    "content": "b97d918cfa904a5beff61c982a1b6f458b799221646efd99d3219ec94cdf2500"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-vanilla-query-order-key-case/header-signed-request.txt",
    "content": "GET /?Param2=value2&Param1=value1 HTTP/1.1\nHost:example.amazonaws.com\nX-Amz-Date:20150830T123600Z\nAuthorization:AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=b97d918cfa904a5beff61c982a1b6f458b799221646efd99d3219ec94cdf2500\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-vanilla-query-order-key-case/header-string-to-sign.txt",
    "content": "AWS4-HMAC-SHA256\n20150830T123600Z\n20150830/us-east-1/service/aws4_request\n816cd5b414d056048ba4f7c5386d6e0533120fb1fcfa93762cf0fc39e2cf19e0"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-vanilla-query-order-key-case/query-canonical-request.txt",
    "content": "GET\n/\nParam1=value1&Param2=value2&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fus-east-1%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host\nhost:example.amazonaws.com\n\nhost\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-vanilla-query-order-key-case/query-signature.txt",
    "content": "86012e2c9ad4d77369f5d81c11f75158aae4f895a085212cc6d3f923d300bed5"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-vanilla-query-order-key-case/query-signed-request.txt",
    "content": "GET /?Param2=value2&Param1=value1&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fus-east-1%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Signature=86012e2c9ad4d77369f5d81c11f75158aae4f895a085212cc6d3f923d300bed5 HTTP/1.1\nHost:example.amazonaws.com\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-vanilla-query-order-key-case/query-string-to-sign.txt",
    "content": "AWS4-HMAC-SHA256\n20150830T123600Z\n20150830/us-east-1/service/aws4_request\nb82878ecb2ab7ad194b9fe79b2946c2a36ee1627a219408089b2d774c1a0cedb"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-vanilla-query-order-key-case/request.txt",
    "content": "GET /?Param2=value2&Param1=value1 HTTP/1.1\nHost:example.amazonaws.com\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-vanilla-query-unreserved/context.json",
    "content": "{\n    \"credentials\": {\n        \"access_key_id\": \"AKIDEXAMPLE\",\n        \"secret_access_key\": \"wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY\"\n    },\n    \"expiration_in_seconds\": 3600,\n    \"normalize\": true,\n    \"region\": \"us-east-1\",\n    \"service\": \"service\",\n    \"sign_body\": false,\n    \"timestamp\": \"2015-08-30T12:36:00Z\"\n}"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-vanilla-query-unreserved/header-canonical-request.txt",
    "content": "GET\n/\n-._~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz=-._~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\nhost:example.amazonaws.com\nx-amz-date:20150830T123600Z\n\nhost;x-amz-date\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-vanilla-query-unreserved/header-signature.txt",
    "content": "9c3e54bfcdf0b19771a7f523ee5669cdf59bc7cc0884027167c21bb143a40197"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-vanilla-query-unreserved/header-signed-request.txt",
    "content": "GET /?-._~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz=-._~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz HTTP/1.1\nHost:example.amazonaws.com\nX-Amz-Date:20150830T123600Z\nAuthorization:AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=9c3e54bfcdf0b19771a7f523ee5669cdf59bc7cc0884027167c21bb143a40197\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-vanilla-query-unreserved/header-string-to-sign.txt",
    "content": "AWS4-HMAC-SHA256\n20150830T123600Z\n20150830/us-east-1/service/aws4_request\nc30d4703d9f799439be92736156d47ccfb2d879ddf56f5befa6d1d6aab979177"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-vanilla-query-unreserved/query-canonical-request.txt",
    "content": "GET\n/\n-._~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz=-._~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fus-east-1%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host\nhost:example.amazonaws.com\n\nhost\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-vanilla-query-unreserved/query-signature.txt",
    "content": "8e76a88a7433637b12778d5592799b29ad21ecd6cf6325051c21d86f0acda2bf"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-vanilla-query-unreserved/query-signed-request.txt",
    "content": "GET /?-._~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz=-._~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fus-east-1%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Signature=8e76a88a7433637b12778d5592799b29ad21ecd6cf6325051c21d86f0acda2bf HTTP/1.1\nHost:example.amazonaws.com\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-vanilla-query-unreserved/query-string-to-sign.txt",
    "content": "AWS4-HMAC-SHA256\n20150830T123600Z\n20150830/us-east-1/service/aws4_request\nc77f27ef2b499fbfee3f0b3c88bba7057b2b31ee9b62047078a5e0d6be91fd58"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-vanilla-query-unreserved/request.txt",
    "content": "GET /?-._~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz=-._~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz HTTP/1.1\nHost:example.amazonaws.com\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-vanilla-utf8-query/context.json",
    "content": "{\n    \"credentials\": {\n        \"access_key_id\": \"AKIDEXAMPLE\",\n        \"secret_access_key\": \"wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY\"\n    },\n    \"expiration_in_seconds\": 3600,\n    \"normalize\": true,\n    \"region\": \"us-east-1\",\n    \"service\": \"service\",\n    \"sign_body\": false,\n    \"timestamp\": \"2015-08-30T12:36:00Z\"\n}"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-vanilla-utf8-query/header-canonical-request.txt",
    "content": "GET\n/\n%E1%88%B4=bar\nhost:example.amazonaws.com\nx-amz-date:20150830T123600Z\n\nhost;x-amz-date\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-vanilla-utf8-query/header-signature.txt",
    "content": "2cdec8eed098649ff3a119c94853b13c643bcf08f8b0a1d91e12c9027818dd04"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-vanilla-utf8-query/header-signed-request.txt",
    "content": "GET /?ሴ=bar HTTP/1.1\nHost:example.amazonaws.com\nX-Amz-Date:20150830T123600Z\nAuthorization:AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=2cdec8eed098649ff3a119c94853b13c643bcf08f8b0a1d91e12c9027818dd04\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-vanilla-utf8-query/header-string-to-sign.txt",
    "content": "AWS4-HMAC-SHA256\n20150830T123600Z\n20150830/us-east-1/service/aws4_request\neb30c5bed55734080471a834cc727ae56beb50e5f39d1bff6d0d38cb192a7073"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-vanilla-utf8-query/query-canonical-request.txt",
    "content": "GET\n/\n%E1%88%B4=bar&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fus-east-1%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host\nhost:example.amazonaws.com\n\nhost\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-vanilla-utf8-query/query-signature.txt",
    "content": "0bdd809b1519ac4f0c1dc3540e2cc46bd0c7f778eda408b2ebf3b913d21ff600"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-vanilla-utf8-query/query-signed-request.txt",
    "content": "GET /?ሴ=bar&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fus-east-1%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Signature=0bdd809b1519ac4f0c1dc3540e2cc46bd0c7f778eda408b2ebf3b913d21ff600 HTTP/1.1\nHost:example.amazonaws.com\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-vanilla-utf8-query/query-string-to-sign.txt",
    "content": "AWS4-HMAC-SHA256\n20150830T123600Z\n20150830/us-east-1/service/aws4_request\nb2e8ae8e48ec880defebc6f6dc1d9fbc9f1856b33146f2943060ca71a50a7a77"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-vanilla-utf8-query/request.txt",
    "content": "GET /?ሴ=bar HTTP/1.1\nHost:example.amazonaws.com\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-vanilla-with-session-token/context.json",
    "content": "{\n    \"credentials\": {\n        \"access_key_id\": \"AKIDEXAMPLE\",\n        \"secret_access_key\": \"wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY\",\n        \"token\": \"6e86291e8372ff2a2260956d9b8aae1d763fbf315fa00fa31553b73ebf194267\"\n    },\n    \"expiration_in_seconds\": 3600,\n    \"normalize\": true,\n    \"region\": \"us-east-1\",\n    \"service\": \"service\",\n    \"sign_body\": false,\n    \"timestamp\": \"2015-08-30T12:36:00Z\"\n}"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-vanilla-with-session-token/header-canonical-request.txt",
    "content": "GET\n/\n\nhost:example.amazonaws.com\nx-amz-date:20150830T123600Z\nx-amz-security-token:6e86291e8372ff2a2260956d9b8aae1d763fbf315fa00fa31553b73ebf194267\n\nhost;x-amz-date;x-amz-security-token\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-vanilla-with-session-token/header-signature.txt",
    "content": "07ec1639c89043aa0e3e2de82b96708f198cceab042d4a97044c66dd9f74e7f8"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-vanilla-with-session-token/header-signed-request.txt",
    "content": "GET / HTTP/1.1\nHost:example.amazonaws.com\nX-Amz-Security-Token:6e86291e8372ff2a2260956d9b8aae1d763fbf315fa00fa31553b73ebf194267\nX-Amz-Date:20150830T123600Z\nAuthorization:AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date;x-amz-security-token, Signature=07ec1639c89043aa0e3e2de82b96708f198cceab042d4a97044c66dd9f74e7f8\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-vanilla-with-session-token/header-string-to-sign.txt",
    "content": "AWS4-HMAC-SHA256\n20150830T123600Z\n20150830/us-east-1/service/aws4_request\n067b36aa60031588cea4a4cde1f21215227a047690c72247f1d70b32fbbfad2b"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-vanilla-with-session-token/query-canonical-request.txt",
    "content": "GET\n/\nX-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fus-east-1%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Security-Token=6e86291e8372ff2a2260956d9b8aae1d763fbf315fa00fa31553b73ebf194267&X-Amz-SignedHeaders=host\nhost:example.amazonaws.com\n\nhost\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-vanilla-with-session-token/query-signature.txt",
    "content": "7ff2b50b376cb4d151970630573d6291dc128cc5c2a12ffb237f73cc53f67b6c"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-vanilla-with-session-token/query-signed-request.txt",
    "content": "GET /?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fus-east-1%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Security-Token=6e86291e8372ff2a2260956d9b8aae1d763fbf315fa00fa31553b73ebf194267&X-Amz-Signature=7ff2b50b376cb4d151970630573d6291dc128cc5c2a12ffb237f73cc53f67b6c HTTP/1.1\nHost:example.amazonaws.com\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-vanilla-with-session-token/query-string-to-sign.txt",
    "content": "AWS4-HMAC-SHA256\n20150830T123600Z\n20150830/us-east-1/service/aws4_request\ncb30434103085aa9e73780fc60dc9a9df818fd2a7b1de12a9f6f4d791f898761"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/get-vanilla-with-session-token/request.txt",
    "content": "GET / HTTP/1.1\nHost:example.amazonaws.com\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-header-key-case/context.json",
    "content": "{\n    \"credentials\": {\n        \"access_key_id\": \"AKIDEXAMPLE\",\n        \"secret_access_key\": \"wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY\"\n    },\n    \"expiration_in_seconds\": 3600,\n    \"normalize\": true,\n    \"region\": \"us-east-1\",\n    \"service\": \"service\",\n    \"sign_body\": false,\n    \"timestamp\": \"2015-08-30T12:36:00Z\"\n}"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-header-key-case/header-canonical-request.txt",
    "content": "POST\n/\n\nhost:example.amazonaws.com\nx-amz-date:20150830T123600Z\n\nhost;x-amz-date\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-header-key-case/header-signature.txt",
    "content": "5da7c1a2acd57cee7505fc6676e4e544621c30862966e37dddb68e92efbe5d6b"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-header-key-case/header-signed-request.txt",
    "content": "POST / HTTP/1.1\nHost:example.amazonaws.com\nX-Amz-Date:20150830T123600Z\nAuthorization:AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=5da7c1a2acd57cee7505fc6676e4e544621c30862966e37dddb68e92efbe5d6b\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-header-key-case/header-string-to-sign.txt",
    "content": "AWS4-HMAC-SHA256\n20150830T123600Z\n20150830/us-east-1/service/aws4_request\n553f88c9e4d10fc9e109e2aeb65f030801b70c2f6468faca261d401ae622fc87"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-header-key-case/query-canonical-request.txt",
    "content": "POST\n/\nX-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fus-east-1%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host\nhost:example.amazonaws.com\n\nhost\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-header-key-case/query-signature.txt",
    "content": "2ce6e6d2e0cf2f9d1b55fafec88cd20574c31dc2e7631979f71ba2310083e95b"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-header-key-case/query-signed-request.txt",
    "content": "POST /?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fus-east-1%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Signature=2ce6e6d2e0cf2f9d1b55fafec88cd20574c31dc2e7631979f71ba2310083e95b HTTP/1.1\nHost:example.amazonaws.com\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-header-key-case/query-string-to-sign.txt",
    "content": "AWS4-HMAC-SHA256\n20150830T123600Z\n20150830/us-east-1/service/aws4_request\nd27fc6fe1afc1d88b248c5ae9194ec0943a693dd6d81d8d815c88a369eb0471e"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-header-key-case/request.txt",
    "content": "POST / HTTP/1.1\nHost:example.amazonaws.com\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-header-key-sort/context.json",
    "content": "{\n    \"credentials\": {\n        \"access_key_id\": \"AKIDEXAMPLE\",\n        \"secret_access_key\": \"wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY\"\n    },\n    \"expiration_in_seconds\": 3600,\n    \"normalize\": true,\n    \"region\": \"us-east-1\",\n    \"service\": \"service\",\n    \"sign_body\": false,\n    \"timestamp\": \"2015-08-30T12:36:00Z\"\n}"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-header-key-sort/header-canonical-request.txt",
    "content": "POST\n/\n\nhost:example.amazonaws.com\nmy-header1:value1\nx-amz-date:20150830T123600Z\n\nhost;my-header1;x-amz-date\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-header-key-sort/header-signature.txt",
    "content": "c5410059b04c1ee005303aed430f6e6645f61f4dc9e1461ec8f8916fdf18852c"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-header-key-sort/header-signed-request.txt",
    "content": "POST / HTTP/1.1\nHost:example.amazonaws.com\nMy-Header1:value1\nX-Amz-Date:20150830T123600Z\nAuthorization:AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;my-header1;x-amz-date, Signature=c5410059b04c1ee005303aed430f6e6645f61f4dc9e1461ec8f8916fdf18852c\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-header-key-sort/header-string-to-sign.txt",
    "content": "AWS4-HMAC-SHA256\n20150830T123600Z\n20150830/us-east-1/service/aws4_request\n9368318c2967cf6de74404b30c65a91e8f6253e0a8659d6d5319f1a812f87d65"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-header-key-sort/query-canonical-request.txt",
    "content": "POST\n/\nX-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fus-east-1%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host%3Bmy-header1\nhost:example.amazonaws.com\nmy-header1:value1\n\nhost;my-header1\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-header-key-sort/query-signature.txt",
    "content": "c09d07e0d55871f10f2a6d350d994acf6825a3cae70673d7def55616e6119dd7"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-header-key-sort/query-signed-request.txt",
    "content": "POST /?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fus-east-1%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-SignedHeaders=host%3Bmy-header1&X-Amz-Expires=3600&X-Amz-Signature=c09d07e0d55871f10f2a6d350d994acf6825a3cae70673d7def55616e6119dd7 HTTP/1.1\nHost:example.amazonaws.com\nMy-Header1:value1\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-header-key-sort/query-string-to-sign.txt",
    "content": "AWS4-HMAC-SHA256\n20150830T123600Z\n20150830/us-east-1/service/aws4_request\n1295ed77e4ef8b18b32815e493e0b0f78ee47615c0ecbebfec7c75709eb58c88"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-header-key-sort/request.txt",
    "content": "POST / HTTP/1.1\nHost:example.amazonaws.com\nMy-Header1:value1\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-header-value-case/context.json",
    "content": "{\n    \"credentials\": {\n        \"access_key_id\": \"AKIDEXAMPLE\",\n        \"secret_access_key\": \"wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY\"\n    },\n    \"expiration_in_seconds\": 3600,\n    \"normalize\": true,\n    \"region\": \"us-east-1\",\n    \"service\": \"service\",\n    \"sign_body\": false,\n    \"timestamp\": \"2015-08-30T12:36:00Z\"\n}"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-header-value-case/header-canonical-request.txt",
    "content": "POST\n/\n\nhost:example.amazonaws.com\nmy-header1:VALUE1\nx-amz-date:20150830T123600Z\n\nhost;my-header1;x-amz-date\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-header-value-case/header-signature.txt",
    "content": "cdbc9802e29d2942e5e10b5bccfdd67c5f22c7c4e8ae67b53629efa58b974b7d"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-header-value-case/header-signed-request.txt",
    "content": "POST / HTTP/1.1\nHost:example.amazonaws.com\nMy-Header1:VALUE1\nX-Amz-Date:20150830T123600Z\nAuthorization:AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;my-header1;x-amz-date, Signature=cdbc9802e29d2942e5e10b5bccfdd67c5f22c7c4e8ae67b53629efa58b974b7d\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-header-value-case/header-string-to-sign.txt",
    "content": "AWS4-HMAC-SHA256\n20150830T123600Z\n20150830/us-east-1/service/aws4_request\nd51ced243e649e3de6ef63afbbdcbca03131a21a7103a1583706a64618606a93"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-header-value-case/query-canonical-request.txt",
    "content": "POST\n/\nX-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fus-east-1%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host%3Bmy-header1\nhost:example.amazonaws.com\nmy-header1:VALUE1\n\nhost;my-header1\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-header-value-case/query-signature.txt",
    "content": "0698bc9e4f7f9139065ba2909c0e99da257e8e2a42492a097bcd46d792391fed"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-header-value-case/query-signed-request.txt",
    "content": "POST /?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fus-east-1%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-SignedHeaders=host%3Bmy-header1&X-Amz-Expires=3600&X-Amz-Signature=0698bc9e4f7f9139065ba2909c0e99da257e8e2a42492a097bcd46d792391fed HTTP/1.1\nHost:example.amazonaws.com\nMy-Header1:VALUE1\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-header-value-case/query-string-to-sign.txt",
    "content": "AWS4-HMAC-SHA256\n20150830T123600Z\n20150830/us-east-1/service/aws4_request\n9d4d1de88f0149695a91a01275fc72dc00fb50bdc78e424f012ec860d5f8c41d"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-header-value-case/request.txt",
    "content": "POST / HTTP/1.1\nHost:example.amazonaws.com\nMy-Header1:VALUE1\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-sts-header-after/context.json",
    "content": "{\n    \"credentials\": {\n        \"access_key_id\": \"AKIDEXAMPLE\",\n        \"secret_access_key\": \"wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY\",\n        \"token\": \"AQoDYXdzEPT//////////wEXAMPLEtc764bNrC9SAPBSM22wDOk4x4HIZ8j4FZTwdQWLWsKWHGBuFqwAeMicRXmxfpSPfIeoIYRqTflfKD8YUuwthAx7mSEI/qkPpKPi/kMcGdQrmGdeehM4IC1NtBmUpp2wUE8phUZampKsburEDy0KPkyQDYwT7WZ0wq5VSXDvp75YU9HFvlRd8Tx6q6fE8YQcHNVXAkiY9q6d+xo0rKwT38xVqr7ZD0u0iPPkUL64lIZbqBAz+scqKmlzm8FDrypNC9Yjc8fPOLn9FX9KSYvKTr4rvx3iSIlTJabIQwj2ICCR/oLxBA==\"\n    },\n    \"expiration_in_seconds\": 3600,\n    \"normalize\": true,\n    \"region\": \"us-east-1\",\n    \"service\": \"service\",\n    \"sign_body\": false,\n    \"timestamp\": \"2015-08-30T12:36:00Z\",\n    \"omit_session_token\": true\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-sts-header-after/header-canonical-request.txt",
    "content": "POST\n/\n\nhost:example.amazonaws.com\nx-amz-date:20150830T123600Z\n\nhost;x-amz-date\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-sts-header-after/header-signature.txt",
    "content": "5da7c1a2acd57cee7505fc6676e4e544621c30862966e37dddb68e92efbe5d6b"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-sts-header-after/header-signed-request.txt",
    "content": "POST / HTTP/1.1\nHost:example.amazonaws.com\nX-Amz-Security-Token:AQoDYXdzEPT//////////wEXAMPLEtc764bNrC9SAPBSM22wDOk4x4HIZ8j4FZTwdQWLWsKWHGBuFqwAeMicRXmxfpSPfIeoIYRqTflfKD8YUuwthAx7mSEI/qkPpKPi/kMcGdQrmGdeehM4IC1NtBmUpp2wUE8phUZampKsburEDy0KPkyQDYwT7WZ0wq5VSXDvp75YU9HFvlRd8Tx6q6fE8YQcHNVXAkiY9q6d+xo0rKwT38xVqr7ZD0u0iPPkUL64lIZbqBAz+scqKmlzm8FDrypNC9Yjc8fPOLn9FX9KSYvKTr4rvx3iSIlTJabIQwj2ICCR/oLxBA==\nX-Amz-Date:20150830T123600Z\nAuthorization:AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=5da7c1a2acd57cee7505fc6676e4e544621c30862966e37dddb68e92efbe5d6b\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-sts-header-after/header-string-to-sign.txt",
    "content": "AWS4-HMAC-SHA256\n20150830T123600Z\n20150830/us-east-1/service/aws4_request\n553f88c9e4d10fc9e109e2aeb65f030801b70c2f6468faca261d401ae622fc87"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-sts-header-after/query-canonical-request.txt",
    "content": "POST\n/\nX-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fus-east-1%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host\nhost:example.amazonaws.com\n\nhost\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-sts-header-after/query-signature.txt",
    "content": "2ce6e6d2e0cf2f9d1b55fafec88cd20574c31dc2e7631979f71ba2310083e95b"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-sts-header-after/query-signed-request.txt",
    "content": "POST /?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fus-east-1%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Security-Token=AQoDYXdzEPT%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEXAMPLEtc764bNrC9SAPBSM22wDOk4x4HIZ8j4FZTwdQWLWsKWHGBuFqwAeMicRXmxfpSPfIeoIYRqTflfKD8YUuwthAx7mSEI%2FqkPpKPi%2FkMcGdQrmGdeehM4IC1NtBmUpp2wUE8phUZampKsburEDy0KPkyQDYwT7WZ0wq5VSXDvp75YU9HFvlRd8Tx6q6fE8YQcHNVXAkiY9q6d%2Bxo0rKwT38xVqr7ZD0u0iPPkUL64lIZbqBAz%2BscqKmlzm8FDrypNC9Yjc8fPOLn9FX9KSYvKTr4rvx3iSIlTJabIQwj2ICCR%2FoLxBA%3D%3D&X-Amz-Signature=2ce6e6d2e0cf2f9d1b55fafec88cd20574c31dc2e7631979f71ba2310083e95b HTTP/1.1\nHost:example.amazonaws.com\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-sts-header-after/query-string-to-sign.txt",
    "content": "AWS4-HMAC-SHA256\n20150830T123600Z\n20150830/us-east-1/service/aws4_request\nd27fc6fe1afc1d88b248c5ae9194ec0943a693dd6d81d8d815c88a369eb0471e"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-sts-header-after/request.txt",
    "content": "POST / HTTP/1.1\nHost:example.amazonaws.com\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-sts-header-before/context.json",
    "content": "{\n    \"credentials\": {\n        \"access_key_id\": \"AKIDEXAMPLE\",\n        \"secret_access_key\": \"wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY\",\n        \"token\": \"AQoDYXdzEPT//////////wEXAMPLEtc764bNrC9SAPBSM22wDOk4x4HIZ8j4FZTwdQWLWsKWHGBuFqwAeMicRXmxfpSPfIeoIYRqTflfKD8YUuwthAx7mSEI/qkPpKPi/kMcGdQrmGdeehM4IC1NtBmUpp2wUE8phUZampKsburEDy0KPkyQDYwT7WZ0wq5VSXDvp75YU9HFvlRd8Tx6q6fE8YQcHNVXAkiY9q6d+xo0rKwT38xVqr7ZD0u0iPPkUL64lIZbqBAz+scqKmlzm8FDrypNC9Yjc8fPOLn9FX9KSYvKTr4rvx3iSIlTJabIQwj2ICCR/oLxBA==\"\n    },\n    \"expiration_in_seconds\": 3600,\n    \"normalize\": true,\n    \"region\": \"us-east-1\",\n    \"service\": \"service\",\n    \"sign_body\": false,\n    \"timestamp\": \"2015-08-30T12:36:00Z\",\n    \"omit_session_token\": false\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-sts-header-before/header-canonical-request.txt",
    "content": "POST\n/\n\nhost:example.amazonaws.com\nx-amz-date:20150830T123600Z\nx-amz-security-token:AQoDYXdzEPT//////////wEXAMPLEtc764bNrC9SAPBSM22wDOk4x4HIZ8j4FZTwdQWLWsKWHGBuFqwAeMicRXmxfpSPfIeoIYRqTflfKD8YUuwthAx7mSEI/qkPpKPi/kMcGdQrmGdeehM4IC1NtBmUpp2wUE8phUZampKsburEDy0KPkyQDYwT7WZ0wq5VSXDvp75YU9HFvlRd8Tx6q6fE8YQcHNVXAkiY9q6d+xo0rKwT38xVqr7ZD0u0iPPkUL64lIZbqBAz+scqKmlzm8FDrypNC9Yjc8fPOLn9FX9KSYvKTr4rvx3iSIlTJabIQwj2ICCR/oLxBA==\n\nhost;x-amz-date;x-amz-security-token\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-sts-header-before/header-signature.txt",
    "content": "85d96828115b5dc0cfc3bd16ad9e210dd772bbebba041836c64533a82be05ead"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-sts-header-before/header-signed-request.txt",
    "content": "POST / HTTP/1.1\nHost:example.amazonaws.com\nX-Amz-Security-Token:AQoDYXdzEPT//////////wEXAMPLEtc764bNrC9SAPBSM22wDOk4x4HIZ8j4FZTwdQWLWsKWHGBuFqwAeMicRXmxfpSPfIeoIYRqTflfKD8YUuwthAx7mSEI/qkPpKPi/kMcGdQrmGdeehM4IC1NtBmUpp2wUE8phUZampKsburEDy0KPkyQDYwT7WZ0wq5VSXDvp75YU9HFvlRd8Tx6q6fE8YQcHNVXAkiY9q6d+xo0rKwT38xVqr7ZD0u0iPPkUL64lIZbqBAz+scqKmlzm8FDrypNC9Yjc8fPOLn9FX9KSYvKTr4rvx3iSIlTJabIQwj2ICCR/oLxBA==\nX-Amz-Date:20150830T123600Z\nAuthorization:AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date;x-amz-security-token, Signature=85d96828115b5dc0cfc3bd16ad9e210dd772bbebba041836c64533a82be05ead\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-sts-header-before/header-string-to-sign.txt",
    "content": "AWS4-HMAC-SHA256\n20150830T123600Z\n20150830/us-east-1/service/aws4_request\nc237e1b440d4c63c32ca95b5b99481081cb7b13c7e40434868e71567c1a882f6"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-sts-header-before/query-canonical-request.txt",
    "content": "POST\n/\nX-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fus-east-1%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Security-Token=AQoDYXdzEPT%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEXAMPLEtc764bNrC9SAPBSM22wDOk4x4HIZ8j4FZTwdQWLWsKWHGBuFqwAeMicRXmxfpSPfIeoIYRqTflfKD8YUuwthAx7mSEI%2FqkPpKPi%2FkMcGdQrmGdeehM4IC1NtBmUpp2wUE8phUZampKsburEDy0KPkyQDYwT7WZ0wq5VSXDvp75YU9HFvlRd8Tx6q6fE8YQcHNVXAkiY9q6d%2Bxo0rKwT38xVqr7ZD0u0iPPkUL64lIZbqBAz%2BscqKmlzm8FDrypNC9Yjc8fPOLn9FX9KSYvKTr4rvx3iSIlTJabIQwj2ICCR%2FoLxBA%3D%3D&X-Amz-SignedHeaders=host\nhost:example.amazonaws.com\n\nhost\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-sts-header-before/query-signature.txt",
    "content": "46c2e3c63c1dbe7d39f8ada16fe7f001c1f56c5791441565323677f96308871c"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-sts-header-before/query-signed-request.txt",
    "content": "POST /?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fus-east-1%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Security-Token=AQoDYXdzEPT%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEXAMPLEtc764bNrC9SAPBSM22wDOk4x4HIZ8j4FZTwdQWLWsKWHGBuFqwAeMicRXmxfpSPfIeoIYRqTflfKD8YUuwthAx7mSEI%2FqkPpKPi%2FkMcGdQrmGdeehM4IC1NtBmUpp2wUE8phUZampKsburEDy0KPkyQDYwT7WZ0wq5VSXDvp75YU9HFvlRd8Tx6q6fE8YQcHNVXAkiY9q6d%2Bxo0rKwT38xVqr7ZD0u0iPPkUL64lIZbqBAz%2BscqKmlzm8FDrypNC9Yjc8fPOLn9FX9KSYvKTr4rvx3iSIlTJabIQwj2ICCR%2FoLxBA%3D%3D&X-Amz-Signature=46c2e3c63c1dbe7d39f8ada16fe7f001c1f56c5791441565323677f96308871c HTTP/1.1\nHost:example.amazonaws.com\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-sts-header-before/query-string-to-sign.txt",
    "content": "AWS4-HMAC-SHA256\n20150830T123600Z\n20150830/us-east-1/service/aws4_request\n37f7ba7a2ec89e8b29a0d637bcc70d8e8d0fdba854ddfc5bc06a12398cfe8605"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-sts-header-before/request.txt",
    "content": "POST / HTTP/1.1\nHost:example.amazonaws.com\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-vanilla/context.json",
    "content": "{\n    \"credentials\": {\n        \"access_key_id\": \"AKIDEXAMPLE\",\n        \"secret_access_key\": \"wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY\"\n    },\n    \"expiration_in_seconds\": 3600,\n    \"normalize\": true,\n    \"region\": \"us-east-1\",\n    \"service\": \"service\",\n    \"sign_body\": false,\n    \"timestamp\": \"2015-08-30T12:36:00Z\"\n}"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-vanilla/header-canonical-request.txt",
    "content": "POST\n/\n\nhost:example.amazonaws.com\nx-amz-date:20150830T123600Z\n\nhost;x-amz-date\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-vanilla/header-signature.txt",
    "content": "5da7c1a2acd57cee7505fc6676e4e544621c30862966e37dddb68e92efbe5d6b"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-vanilla/header-signed-request.txt",
    "content": "POST / HTTP/1.1\nHost:example.amazonaws.com\nX-Amz-Date:20150830T123600Z\nAuthorization:AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=5da7c1a2acd57cee7505fc6676e4e544621c30862966e37dddb68e92efbe5d6b\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-vanilla/header-string-to-sign.txt",
    "content": "AWS4-HMAC-SHA256\n20150830T123600Z\n20150830/us-east-1/service/aws4_request\n553f88c9e4d10fc9e109e2aeb65f030801b70c2f6468faca261d401ae622fc87"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-vanilla/query-canonical-request.txt",
    "content": "POST\n/\nX-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fus-east-1%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host\nhost:example.amazonaws.com\n\nhost\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-vanilla/query-signature.txt",
    "content": "2ce6e6d2e0cf2f9d1b55fafec88cd20574c31dc2e7631979f71ba2310083e95b"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-vanilla/query-signed-request.txt",
    "content": "POST /?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fus-east-1%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Signature=2ce6e6d2e0cf2f9d1b55fafec88cd20574c31dc2e7631979f71ba2310083e95b HTTP/1.1\nHost:example.amazonaws.com\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-vanilla/query-string-to-sign.txt",
    "content": "AWS4-HMAC-SHA256\n20150830T123600Z\n20150830/us-east-1/service/aws4_request\nd27fc6fe1afc1d88b248c5ae9194ec0943a693dd6d81d8d815c88a369eb0471e"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-vanilla/request.txt",
    "content": "POST / HTTP/1.1\nHost:example.amazonaws.com\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-vanilla-empty-query-value/context.json",
    "content": "{\n    \"credentials\": {\n        \"access_key_id\": \"AKIDEXAMPLE\",\n        \"secret_access_key\": \"wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY\"\n    },\n    \"expiration_in_seconds\": 3600,\n    \"normalize\": true,\n    \"region\": \"us-east-1\",\n    \"service\": \"service\",\n    \"sign_body\": false,\n    \"timestamp\": \"2015-08-30T12:36:00Z\"\n}"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-vanilla-empty-query-value/header-canonical-request.txt",
    "content": "POST\n/\nParam1=value1\nhost:example.amazonaws.com\nx-amz-date:20150830T123600Z\n\nhost;x-amz-date\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-vanilla-empty-query-value/header-signature.txt",
    "content": "28038455d6de14eafc1f9222cf5aa6f1a96197d7deb8263271d420d138af7f11"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-vanilla-empty-query-value/header-signed-request.txt",
    "content": "POST /?Param1=value1 HTTP/1.1\nHost:example.amazonaws.com\nX-Amz-Date:20150830T123600Z\nAuthorization:AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=28038455d6de14eafc1f9222cf5aa6f1a96197d7deb8263271d420d138af7f11\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-vanilla-empty-query-value/header-string-to-sign.txt",
    "content": "AWS4-HMAC-SHA256\n20150830T123600Z\n20150830/us-east-1/service/aws4_request\n9d659678c1756bb3113e2ce898845a0a79dbbc57b740555917687f1b3340fbbd"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-vanilla-empty-query-value/query-canonical-request.txt",
    "content": "POST\n/\nParam1=value1&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fus-east-1%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host\nhost:example.amazonaws.com\n\nhost\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-vanilla-empty-query-value/query-signature.txt",
    "content": "a9ef26247f293bffe40eeff86a0480ba8c14d31503b2e0c3399e3a16bf1a3682"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-vanilla-empty-query-value/query-signed-request.txt",
    "content": "POST /?Param1=value1&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fus-east-1%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Signature=a9ef26247f293bffe40eeff86a0480ba8c14d31503b2e0c3399e3a16bf1a3682 HTTP/1.1\nHost:example.amazonaws.com\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-vanilla-empty-query-value/query-string-to-sign.txt",
    "content": "AWS4-HMAC-SHA256\n20150830T123600Z\n20150830/us-east-1/service/aws4_request\n98241d1c6f938789d34b92e16e08b7fc8fdaa774c5437ba30d505eedae43dd2b"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-vanilla-empty-query-value/request.txt",
    "content": "POST /?Param1=value1 HTTP/1.1\nHost:example.amazonaws.com\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-vanilla-query/context.json",
    "content": "{\n    \"credentials\": {\n        \"access_key_id\": \"AKIDEXAMPLE\",\n        \"secret_access_key\": \"wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY\"\n    },\n    \"expiration_in_seconds\": 3600,\n    \"normalize\": true,\n    \"region\": \"us-east-1\",\n    \"service\": \"service\",\n    \"sign_body\": false,\n    \"timestamp\": \"2015-08-30T12:36:00Z\"\n}"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-vanilla-query/header-canonical-request.txt",
    "content": "POST\n/\nParam1=value1\nhost:example.amazonaws.com\nx-amz-date:20150830T123600Z\n\nhost;x-amz-date\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-vanilla-query/header-signature.txt",
    "content": "28038455d6de14eafc1f9222cf5aa6f1a96197d7deb8263271d420d138af7f11"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-vanilla-query/header-signed-request.txt",
    "content": "POST /?Param1=value1 HTTP/1.1\nHost:example.amazonaws.com\nX-Amz-Date:20150830T123600Z\nAuthorization:AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=host;x-amz-date, Signature=28038455d6de14eafc1f9222cf5aa6f1a96197d7deb8263271d420d138af7f11\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-vanilla-query/header-string-to-sign.txt",
    "content": "AWS4-HMAC-SHA256\n20150830T123600Z\n20150830/us-east-1/service/aws4_request\n9d659678c1756bb3113e2ce898845a0a79dbbc57b740555917687f1b3340fbbd"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-vanilla-query/query-canonical-request.txt",
    "content": "POST\n/\nParam1=value1&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fus-east-1%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host\nhost:example.amazonaws.com\n\nhost\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-vanilla-query/query-signature.txt",
    "content": "a9ef26247f293bffe40eeff86a0480ba8c14d31503b2e0c3399e3a16bf1a3682"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-vanilla-query/query-signed-request.txt",
    "content": "POST /?Param1=value1&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fus-east-1%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Signature=a9ef26247f293bffe40eeff86a0480ba8c14d31503b2e0c3399e3a16bf1a3682 HTTP/1.1\nHost:example.amazonaws.com\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-vanilla-query/query-string-to-sign.txt",
    "content": "AWS4-HMAC-SHA256\n20150830T123600Z\n20150830/us-east-1/service/aws4_request\n98241d1c6f938789d34b92e16e08b7fc8fdaa774c5437ba30d505eedae43dd2b"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-vanilla-query/request.txt",
    "content": "POST /?Param1=value1 HTTP/1.1\nHost:example.amazonaws.com\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-x-www-form-urlencoded/context.json",
    "content": "{\n    \"credentials\": {\n        \"access_key_id\": \"AKIDEXAMPLE\",\n        \"secret_access_key\": \"wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY\"\n    },\n    \"expiration_in_seconds\": 3600,\n    \"normalize\": true,\n    \"region\": \"us-east-1\",\n    \"service\": \"service\",\n    \"sign_body\": true,\n    \"timestamp\": \"2015-08-30T12:36:00Z\"\n}"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-x-www-form-urlencoded/header-canonical-request.txt",
    "content": "POST\n/\n\ncontent-length:13\ncontent-type:application/x-www-form-urlencoded\nhost:example.amazonaws.com\nx-amz-content-sha256:9095672bbd1f56dfc5b65f3e153adc8731a4a654192329106275f4c7b24d0b6e\nx-amz-date:20150830T123600Z\n\ncontent-length;content-type;host;x-amz-content-sha256;x-amz-date\n9095672bbd1f56dfc5b65f3e153adc8731a4a654192329106275f4c7b24d0b6e"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-x-www-form-urlencoded/header-signature.txt",
    "content": "d3875051da38690788ef43de4db0d8f280229d82040bfac253562e56c3f20e0b"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-x-www-form-urlencoded/header-signed-request.txt",
    "content": "POST / HTTP/1.1\nContent-Type:application/x-www-form-urlencoded\nHost:example.amazonaws.com\nContent-Length:13\nX-Amz-Date:20150830T123600Z\nx-amz-content-sha256:9095672bbd1f56dfc5b65f3e153adc8731a4a654192329106275f4c7b24d0b6e\nAuthorization:AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-content-sha256;x-amz-date, Signature=d3875051da38690788ef43de4db0d8f280229d82040bfac253562e56c3f20e0b\n\nParam1=value1"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-x-www-form-urlencoded/header-string-to-sign.txt",
    "content": "AWS4-HMAC-SHA256\n20150830T123600Z\n20150830/us-east-1/service/aws4_request\nb1edd1d03544c25390e32085d55b57acc9a3961bb59415ff86c45c3d89d16cfb"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-x-www-form-urlencoded/query-canonical-request.txt",
    "content": "POST\n/\nX-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fus-east-1%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=content-length%3Bcontent-type%3Bhost\ncontent-length:13\ncontent-type:application/x-www-form-urlencoded\nhost:example.amazonaws.com\n\ncontent-length;content-type;host\n9095672bbd1f56dfc5b65f3e153adc8731a4a654192329106275f4c7b24d0b6e"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-x-www-form-urlencoded/query-signature.txt",
    "content": "89a40deed0f26f9461242825a082d2222717248abc7ab41f552ad84a94ad46e9"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-x-www-form-urlencoded/query-signed-request.txt",
    "content": "POST /?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fus-east-1%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-SignedHeaders=content-length%3Bcontent-type%3Bhost&X-Amz-Expires=3600&X-Amz-Signature=89a40deed0f26f9461242825a082d2222717248abc7ab41f552ad84a94ad46e9 HTTP/1.1\nContent-Type:application/x-www-form-urlencoded\nHost:example.amazonaws.com\nContent-Length:13\n\nParam1=value1"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-x-www-form-urlencoded/query-string-to-sign.txt",
    "content": "AWS4-HMAC-SHA256\n20150830T123600Z\n20150830/us-east-1/service/aws4_request\nee5059a7c437165a28d0e775e6498be428761255d657d8c04cb1baa41de6514c"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-x-www-form-urlencoded/request.txt",
    "content": "POST / HTTP/1.1\nContent-Type:application/x-www-form-urlencoded\nHost:example.amazonaws.com\nContent-Length:13\n\nParam1=value1"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-x-www-form-urlencoded-parameters/context.json",
    "content": "{\n    \"credentials\": {\n        \"access_key_id\": \"AKIDEXAMPLE\",\n        \"secret_access_key\": \"wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY\"\n    },\n    \"expiration_in_seconds\": 3600,\n    \"normalize\": true,\n    \"region\": \"us-east-1\",\n    \"service\": \"service\",\n    \"sign_body\": true,\n    \"timestamp\": \"2015-08-30T12:36:00Z\"\n}"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-x-www-form-urlencoded-parameters/header-canonical-request.txt",
    "content": "POST\n/\n\ncontent-length:13\ncontent-type:application/x-www-form-urlencoded; charset=utf-8\nhost:example.amazonaws.com\nx-amz-content-sha256:9095672bbd1f56dfc5b65f3e153adc8731a4a654192329106275f4c7b24d0b6e\nx-amz-date:20150830T123600Z\n\ncontent-length;content-type;host;x-amz-content-sha256;x-amz-date\n9095672bbd1f56dfc5b65f3e153adc8731a4a654192329106275f4c7b24d0b6e"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-x-www-form-urlencoded-parameters/header-signature.txt",
    "content": "328d1b9eaadca9f5818ef05e8392801e091653bafec24fcab71e7344e7f51422"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-x-www-form-urlencoded-parameters/header-signed-request.txt",
    "content": "POST / HTTP/1.1\nContent-Type:application/x-www-form-urlencoded; charset=utf-8\nHost:example.amazonaws.com\nContent-Length:13\nX-Amz-Date:20150830T123600Z\nx-amz-content-sha256:9095672bbd1f56dfc5b65f3e153adc8731a4a654192329106275f4c7b24d0b6e\nAuthorization:AWS4-HMAC-SHA256 Credential=AKIDEXAMPLE/20150830/us-east-1/service/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-content-sha256;x-amz-date, Signature=328d1b9eaadca9f5818ef05e8392801e091653bafec24fcab71e7344e7f51422\n\nParam1=value1"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-x-www-form-urlencoded-parameters/header-string-to-sign.txt",
    "content": "AWS4-HMAC-SHA256\n20150830T123600Z\n20150830/us-east-1/service/aws4_request\na89f1a5b53e37702ee6363ce1da3ce8f54386f3c8f352ae652153c2982a0bc4d"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-x-www-form-urlencoded-parameters/query-canonical-request.txt",
    "content": "POST\n/\nX-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fus-east-1%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=content-length%3Bcontent-type%3Bhost\ncontent-length:13\ncontent-type:application/x-www-form-urlencoded; charset=utf-8\nhost:example.amazonaws.com\n\ncontent-length;content-type;host\n9095672bbd1f56dfc5b65f3e153adc8731a4a654192329106275f4c7b24d0b6e"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-x-www-form-urlencoded-parameters/query-signature.txt",
    "content": "0dbeb9b026c7b6675f266b8427efec9b4fa8b1f6ef1477d717aea231106eab4d"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-x-www-form-urlencoded-parameters/query-signed-request.txt",
    "content": "POST /?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fus-east-1%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-SignedHeaders=content-length%3Bcontent-type%3Bhost&X-Amz-Expires=3600&X-Amz-Signature=0dbeb9b026c7b6675f266b8427efec9b4fa8b1f6ef1477d717aea231106eab4d HTTP/1.1\nContent-Type:application/x-www-form-urlencoded; charset=utf-8\nHost:example.amazonaws.com\nContent-Length:13\n\nParam1=value1"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-x-www-form-urlencoded-parameters/query-string-to-sign.txt",
    "content": "AWS4-HMAC-SHA256\n20150830T123600Z\n20150830/us-east-1/service/aws4_request\n32192353b8ae6d857fac1c71cda066e6af2d3a3127ea7ac1fee22621ab4f05dc"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4/post-x-www-form-urlencoded-parameters/request.txt",
    "content": "POST / HTTP/1.1\nContent-Type:application/x-www-form-urlencoded; charset=utf-8\nHost:example.amazonaws.com\nContent-Length:13\n\nParam1=value1"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-header-key-duplicate/context.json",
    "content": "{\n    \"credentials\": {\n        \"access_key_id\": \"AKIDEXAMPLE\",\n        \"secret_access_key\": \"wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY\"\n    },\n    \"expiration_in_seconds\": 3600,\n    \"normalize\": true,\n    \"region\": \"us-east-1\",\n    \"service\": \"service\",\n    \"sign_body\": false,\n    \"timestamp\": \"2015-08-30T12:36:00Z\"\n}"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-header-key-duplicate/header-canonical-request.txt",
    "content": "GET\n/\n\nhost:example.amazonaws.com\nmy-header1:value2,value2,value1\nx-amz-date:20150830T123600Z\nx-amz-region-set:us-east-1\n\nhost;my-header1;x-amz-date;x-amz-region-set\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-header-key-duplicate/header-signature.txt",
    "content": "304502204862ad283a21f883fc12f1156a6f3fcdbba13d1847e58aa5eb37c666477ea06b022100ee439fac0a975c9a6605b1fa44ad7b654a1f8ac6e868e4e1069a1b3aa35d8113"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-header-key-duplicate/header-signed-request.txt",
    "content": "GET / HTTP/1.1\nHost:example.amazonaws.com\nMy-Header1:value2\nMy-Header1:value2\nMy-Header1:value1\nX-Amz-Date:20150830T123600Z\nX-Amz-Region-Set:us-east-1\nAuthorization:AWS4-ECDSA-P256-SHA256 Credential=AKIDEXAMPLE/20150830/service/aws4_request, SignedHeaders=host;my-header1;x-amz-date;x-amz-region-set, Signature=30450220331da6dfebb0d19e5e161b1efa389ccb83cadb60bc71f6791ef71ac6054c44de0221008588b7d5c9f7a79ca9c02a02efbd0f540cda242a64ca1452aa914e050b517724\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-header-key-duplicate/header-string-to-sign.txt",
    "content": "AWS4-ECDSA-P256-SHA256\n20150830T123600Z\n20150830/service/aws4_request\n30f1f7b639b7fd5982a0f700e6d23bf7bb24f2f1d9e1314005bf22130da61cdf"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-header-key-duplicate/public-key.json",
    "content": "{\n  \"X\":\"b6618f6a65740a99e650b33b6b4b5bd0d43b176d721a3edfea7e7d2d56d936b1\",\n  \"Y\":\"865ed22a7eadc9c5cb9d2cbaca1b3699139fedc5043dc6661864218330c8e518\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-header-key-duplicate/query-canonical-request.txt",
    "content": "GET\n/\nX-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host%3Bmy-header1\nhost:example.amazonaws.com\nmy-header1:value2,value2,value1\n\nhost;my-header1\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-header-key-duplicate/query-signature.txt",
    "content": "3045022100e1e03fa80218cb464404dc4badbdf443f5f5bb504840a2b3803565a28be0388d022063399d4fb8b974906e87a8d67bf7e95334d9dc620817ef92eb2bc6affb1c6a10"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-header-key-duplicate/query-signed-request.txt",
    "content": "GET /?X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-SignedHeaders=host%3Bmy-header1&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-Signature=3045022100b6fa5712e476c23f411995e85747f62e9a25bdd718aac8692b3744dba106e1720220331a1e84a25e69c1ef07e63b3b76e1e78100f2ee020a3e66f127240901468912 HTTP/1.1\nHost:example.amazonaws.com\nMy-Header1:value2\nMy-Header1:value2\nMy-Header1:value1\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-header-key-duplicate/query-string-to-sign.txt",
    "content": "AWS4-ECDSA-P256-SHA256\n20150830T123600Z\n20150830/service/aws4_request\na6e21a0099c98cbb4ec73928a08e8b116dfd634c471a8c03c4007b5258b664ea"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-header-key-duplicate/request.txt",
    "content": "GET / HTTP/1.1\nHost:example.amazonaws.com\nMy-Header1:value2\nMy-Header1:value2\nMy-Header1:value1\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-header-value-multiline/context.json",
    "content": "{\n    \"credentials\": {\n        \"access_key_id\": \"AKIDEXAMPLE\",\n        \"secret_access_key\": \"wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY\"\n    },\n    \"expiration_in_seconds\": 3600,\n    \"normalize\": true,\n    \"region\": \"us-east-1\",\n    \"service\": \"service\",\n    \"sign_body\": false,\n    \"timestamp\": \"2015-08-30T12:36:00Z\"\n}"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-header-value-multiline/header-canonical-request.txt",
    "content": "GET\n/\n\nhost:example.amazonaws.com\nmy-header1:value1 value2 value3\nx-amz-date:20150830T123600Z\nx-amz-region-set:us-east-1\n\nhost;my-header1;x-amz-date;x-amz-region-set\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-header-value-multiline/header-signature.txt",
    "content": "304502206a2d7c3572ebcb9a1f34e5fa744250c3fb2f403a0a7e4b0bc196286846a996a8022100d94aacba36ff453394df27966e9cccd7c6065457b6fe828aebe107307cc5e8e9"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-header-value-multiline/header-signed-request.txt",
    "content": "GET / HTTP/1.1\nHost:example.amazonaws.com\nMy-Header1:value1\n  value2\n     value3\nX-Amz-Date:20150830T123600Z\nX-Amz-Region-Set:us-east-1\nAuthorization:AWS4-ECDSA-P256-SHA256 Credential=AKIDEXAMPLE/20150830/service/aws4_request, SignedHeaders=host;my-header1;x-amz-date;x-amz-region-set, Signature=3045022060b9f2f480a395bf34aa42074697f923c2355e26970987461ce904a6a2eeef52022100fc7ef73838bbfba208a8cf8f3edbe1c8879be7853b677f492db93c30df6fbe02\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-header-value-multiline/header-string-to-sign.txt",
    "content": "AWS4-ECDSA-P256-SHA256\n20150830T123600Z\n20150830/service/aws4_request\n3579d4751dd7db30860b89a17b53647c70fd8363ec485836dbf68cfd22313398"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-header-value-multiline/public-key.json",
    "content": "{\n  \"X\":\"b6618f6a65740a99e650b33b6b4b5bd0d43b176d721a3edfea7e7d2d56d936b1\",\n  \"Y\":\"865ed22a7eadc9c5cb9d2cbaca1b3699139fedc5043dc6661864218330c8e518\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-header-value-multiline/query-canonical-request.txt",
    "content": "GET\n/\nX-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host%3Bmy-header1\nhost:example.amazonaws.com\nmy-header1:value1 value2 value3\n\nhost;my-header1\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-header-value-multiline/query-signature.txt",
    "content": "30450220159829015456fd111a27c4e0d6a555da894aefd23c96c5eb915b94bf6788499a022100fd48a0b97d1c32a11ee33873f87953a3ef410978f226b4a708acb9e582828fde"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-header-value-multiline/query-signed-request.txt",
    "content": "GET /?X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-SignedHeaders=host%3Bmy-header1&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-Signature=3045022039c91f52792bd02ebcd8959326e022c60a8a7f4febed58dbea23cb295df8dc9e022100b95d4fcdd93090a54badb5ccb0ec5d38e7b20ff81204f48ceda327b9b155c14d HTTP/1.1\nHost:example.amazonaws.com\nMy-Header1:value1\n  value2\n     value3\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-header-value-multiline/query-string-to-sign.txt",
    "content": "AWS4-ECDSA-P256-SHA256\n20150830T123600Z\n20150830/service/aws4_request\n960c3db8a6ce71c62c4bc13e5f2a72231a8f1a644d52e688ac1524ecd4b09643"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-header-value-multiline/request.txt",
    "content": "GET / HTTP/1.1\nHost:example.amazonaws.com\nMy-Header1:value1\n  value2\n     value3\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-header-value-order/context.json",
    "content": "{\n    \"credentials\": {\n        \"access_key_id\": \"AKIDEXAMPLE\",\n        \"secret_access_key\": \"wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY\"\n    },\n    \"expiration_in_seconds\": 3600,\n    \"normalize\": true,\n    \"region\": \"us-east-1\",\n    \"service\": \"service\",\n    \"sign_body\": false,\n    \"timestamp\": \"2015-08-30T12:36:00Z\"\n}"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-header-value-order/header-canonical-request.txt",
    "content": "GET\n/\n\nhost:example.amazonaws.com\nmy-header1:value4,value1,value3,value2\nx-amz-date:20150830T123600Z\nx-amz-region-set:us-east-1\n\nhost;my-header1;x-amz-date;x-amz-region-set\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-header-value-order/header-signature.txt",
    "content": "3045022005e72f83b232f1fa01d7344267d44a46fa4c193bc3d0ad256e89f92a561eb8fa022100c62a85a22a6018463df69c97da07cd189185dadeede293c659e15514cd28a0c9"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-header-value-order/header-signed-request.txt",
    "content": "GET / HTTP/1.1\nHost:example.amazonaws.com\nMy-Header1:value4\nMy-Header1:value1\nMy-Header1:value3\nMy-Header1:value2\nX-Amz-Date:20150830T123600Z\nX-Amz-Region-Set:us-east-1\nAuthorization:AWS4-ECDSA-P256-SHA256 Credential=AKIDEXAMPLE/20150830/service/aws4_request, SignedHeaders=host;my-header1;x-amz-date;x-amz-region-set, Signature=304402203410301a4cfc805996d0ac5305374d7cdff4e2564fcbd6f6cfed73b227966046022046e36b2ede1f78d2b68ea4534ae59da3de089e58f67ae08490411dfabd77f36e\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-header-value-order/header-string-to-sign.txt",
    "content": "AWS4-ECDSA-P256-SHA256\n20150830T123600Z\n20150830/service/aws4_request\ne1c3b5d34632ffff080330b3bc31906c8988bf1683f4af689ef3f1811952df36"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-header-value-order/public-key.json",
    "content": "{\n  \"X\":\"b6618f6a65740a99e650b33b6b4b5bd0d43b176d721a3edfea7e7d2d56d936b1\",\n  \"Y\":\"865ed22a7eadc9c5cb9d2cbaca1b3699139fedc5043dc6661864218330c8e518\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-header-value-order/query-canonical-request.txt",
    "content": "GET\n/\nX-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host%3Bmy-header1\nhost:example.amazonaws.com\nmy-header1:value4,value1,value3,value2\n\nhost;my-header1\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-header-value-order/query-signature.txt",
    "content": "3045022044e0c722f2d02673c326d0ac38aae57e2877e158b700de702e5dd082be680f65022100841bb5007fb5ece1078add2bf38e84f1b7ea13e67b935d1fd021014eedee46a4"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-header-value-order/query-signed-request.txt",
    "content": "GET /?X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-SignedHeaders=host%3Bmy-header1&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-Signature=304402200c9f3470f63b573d7c7b8838d3acd8c527e4e5c3b990050c786f074107b12cf70220021b788568d7947e6ad6044e7cc6488dcdb4ff08f15e162ebd2537cc292ed168 HTTP/1.1\nHost:example.amazonaws.com\nMy-Header1:value4\nMy-Header1:value1\nMy-Header1:value3\nMy-Header1:value2\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-header-value-order/query-string-to-sign.txt",
    "content": "AWS4-ECDSA-P256-SHA256\n20150830T123600Z\n20150830/service/aws4_request\ne2bf35ea25a1943bf52cfc8348c787db8fd8ca642dc9f2b9443939c2fb0d3c54"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-header-value-order/request.txt",
    "content": "GET / HTTP/1.1\nHost:example.amazonaws.com\nMy-Header1:value4\nMy-Header1:value1\nMy-Header1:value3\nMy-Header1:value2\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-header-value-trim/context.json",
    "content": "{\n    \"credentials\": {\n        \"access_key_id\": \"AKIDEXAMPLE\",\n        \"secret_access_key\": \"wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY\"\n    },\n    \"expiration_in_seconds\": 3600,\n    \"normalize\": true,\n    \"region\": \"us-east-1\",\n    \"service\": \"service\",\n    \"sign_body\": false,\n    \"timestamp\": \"2015-08-30T12:36:00Z\"\n}"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-header-value-trim/header-canonical-request.txt",
    "content": "GET\n/\n\nhost:example.amazonaws.com\nmy-header1:value1\nmy-header2:\"a b c\"\nx-amz-date:20150830T123600Z\nx-amz-region-set:us-east-1\n\nhost;my-header1;my-header2;x-amz-date;x-amz-region-set\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-header-value-trim/header-signature.txt",
    "content": "3046022100f05cfb8a9a49ee4540c49ed27e612ddd1a2d168512bad65a96cdf8378254a4bd022100a3eb663e6734125d467fc00d5a41dc6bf476ec167d5c20657ff3135c8b4f7815"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-header-value-trim/header-signed-request.txt",
    "content": "GET / HTTP/1.1\nHost:example.amazonaws.com\nMy-Header1: value1\nMy-Header2: \"a   b   c\"\nX-Amz-Date:20150830T123600Z\nX-Amz-Region-Set:us-east-1\nAuthorization:AWS4-ECDSA-P256-SHA256 Credential=AKIDEXAMPLE/20150830/service/aws4_request, SignedHeaders=host;my-header1;my-header2;x-amz-date;x-amz-region-set, Signature=3046022100ce72c874a80cea45e3c5b7cbe76178f8577870e1f97ee1730f57cff45c3d398b022100e4ea7b870335abab5ca57fa740d20b3c5aba2739cf96dd7fa671fc11cf6c3341\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-header-value-trim/header-string-to-sign.txt",
    "content": "AWS4-ECDSA-P256-SHA256\n20150830T123600Z\n20150830/service/aws4_request\n18b43001be9b531ebdd8202144dbd7630ea8a35bc328a7d0e561dda03a876095"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-header-value-trim/public-key.json",
    "content": "{\n  \"X\":\"b6618f6a65740a99e650b33b6b4b5bd0d43b176d721a3edfea7e7d2d56d936b1\",\n  \"Y\":\"865ed22a7eadc9c5cb9d2cbaca1b3699139fedc5043dc6661864218330c8e518\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-header-value-trim/query-canonical-request.txt",
    "content": "GET\n/\nX-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host%3Bmy-header1%3Bmy-header2\nhost:example.amazonaws.com\nmy-header1:value1\nmy-header2:\"a b c\"\n\nhost;my-header1;my-header2\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-header-value-trim/query-signature.txt",
    "content": "3045022100a765fa4e0a2c5d56292cc9aa654332858bcbb2af27b8c488157113f2c084776b02206145afa6dbb99993e499863fa36e592b94ddaeefbd778a473348204f26c15547"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-header-value-trim/query-signed-request.txt",
    "content": "GET /?X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-SignedHeaders=host%3Bmy-header1%3Bmy-header2&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-Signature=304502210085dc6b963562f7d443e0c35819c752a39ab744a6a8820ec4718a2aaf6d9acbae02202053d5ec6fcd892c09ce485b169b94590f805a05348ade664bbe3e06a7c62edb HTTP/1.1\nHost:example.amazonaws.com\nMy-Header1: value1\nMy-Header2: \"a   b   c\"\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-header-value-trim/query-string-to-sign.txt",
    "content": "AWS4-ECDSA-P256-SHA256\n20150830T123600Z\n20150830/service/aws4_request\n4f92ebcf5f0844588e443a2243fafdb64319c6d1ad913c07686129b9991326a3"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-header-value-trim/request.txt",
    "content": "GET / HTTP/1.1\nHost:example.amazonaws.com\nMy-Header1: value1\nMy-Header2: \"a   b   c\"\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-relative-normalized/context.json",
    "content": "{\n    \"credentials\": {\n        \"access_key_id\": \"AKIDEXAMPLE\",\n        \"secret_access_key\": \"wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY\"\n    },\n    \"expiration_in_seconds\": 3600,\n    \"normalize\": true,\n    \"region\": \"us-east-1\",\n    \"service\": \"service\",\n    \"sign_body\": false,\n    \"timestamp\": \"2015-08-30T12:36:00Z\"\n}"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-relative-normalized/header-canonical-request.txt",
    "content": "GET\n/\n\nhost:example.amazonaws.com\nx-amz-date:20150830T123600Z\nx-amz-region-set:us-east-1\n\nhost;x-amz-date;x-amz-region-set\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-relative-normalized/header-signature.txt",
    "content": "3045022002e5e766e09de198957182589c9abe3e7ccd00a8fc6d7bbaf5f0a2c10660d16a022100e6b0835731cd5b72d5abb50e5821d90f5f713339697eb65cf40d34a3facfdbb8"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-relative-normalized/header-signed-request.txt",
    "content": "GET /example/.. HTTP/1.1\nHost:example.amazonaws.com\nX-Amz-Date:20150830T123600Z\nX-Amz-Region-Set:us-east-1\nAuthorization:AWS4-ECDSA-P256-SHA256 Credential=AKIDEXAMPLE/20150830/service/aws4_request, SignedHeaders=host;x-amz-date;x-amz-region-set, Signature=304402206ccd591952cdb4a0a002217788234c80eac520f890b0a6ea07b98044f08ba10e0220733126caf0347f7df89773f79b9fae2648ca786e67a7d88ec296d66452da4bec\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-relative-normalized/header-string-to-sign.txt",
    "content": "AWS4-ECDSA-P256-SHA256\n20150830T123600Z\n20150830/service/aws4_request\ncf59db423e841c8b7e3444158185aa261b724a5c27cbe762676f3eed19f4dc02"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-relative-normalized/public-key.json",
    "content": "{\n  \"X\":\"b6618f6a65740a99e650b33b6b4b5bd0d43b176d721a3edfea7e7d2d56d936b1\",\n  \"Y\":\"865ed22a7eadc9c5cb9d2cbaca1b3699139fedc5043dc6661864218330c8e518\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-relative-normalized/query-canonical-request.txt",
    "content": "GET\n/\nX-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host\nhost:example.amazonaws.com\n\nhost\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-relative-normalized/query-signature.txt",
    "content": "304402200ef7c6ac7bfaaddbf4df3a4b03ab2e4e24e992d305fa133ef0f6c826ad9850e602203ef21f22e239cd1971310c404c80d6e50c5cd06eae1452695ae762d1a9a51c90"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-relative-normalized/query-signed-request.txt",
    "content": "GET /example/..?X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-Signature=3045022100be82e63cce1729590924a36bd6902036fe392d1b6196cffc2bf9620c8c5488b40220029a31d7cbb60816e40c0a00a53520db7d7928296b4236c2d0ada59c08b85bc4 HTTP/1.1\nHost:example.amazonaws.com\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-relative-normalized/query-string-to-sign.txt",
    "content": "AWS4-ECDSA-P256-SHA256\n20150830T123600Z\n20150830/service/aws4_request\n890c4ed28c1a1ac10b5862719b537afbe392e987dc1aab1efa16fe7de41d3c81"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-relative-normalized/request.txt",
    "content": "GET /example/.. HTTP/1.1\nHost:example.amazonaws.com\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-relative-relative-normalized/context.json",
    "content": "{\n    \"credentials\": {\n        \"access_key_id\": \"AKIDEXAMPLE\",\n        \"secret_access_key\": \"wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY\"\n    },\n    \"expiration_in_seconds\": 3600,\n    \"normalize\": true,\n    \"region\": \"us-east-1\",\n    \"service\": \"service\",\n    \"sign_body\": false,\n    \"timestamp\": \"2015-08-30T12:36:00Z\"\n}"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-relative-relative-normalized/header-canonical-request.txt",
    "content": "GET\n/\n\nhost:example.amazonaws.com\nx-amz-date:20150830T123600Z\nx-amz-region-set:us-east-1\n\nhost;x-amz-date;x-amz-region-set\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-relative-relative-normalized/header-signature.txt",
    "content": "3046022100ea029ea1e7b8715f67cd33b8536e013e53e9c7bcd109770f29a4a28767bb2212022100c95a298283c130266a4c8457590d8c047205b4aef9266b85deeb90e5c73e5caa"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-relative-relative-normalized/header-signed-request.txt",
    "content": "GET /example1/example2/../.. HTTP/1.1\nHost:example.amazonaws.com\nX-Amz-Date:20150830T123600Z\nX-Amz-Region-Set:us-east-1\nAuthorization:AWS4-ECDSA-P256-SHA256 Credential=AKIDEXAMPLE/20150830/service/aws4_request, SignedHeaders=host;x-amz-date;x-amz-region-set, Signature=304402203edb747d59fe32db47529b2e5e02c9276759b7c43ad9e36ff62d52b8dbeb00e3022007f99e8601938b893fe6dcbac9259fec2f3797b0e3d74fd66d59b09e83b8c1d4\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-relative-relative-normalized/header-string-to-sign.txt",
    "content": "AWS4-ECDSA-P256-SHA256\n20150830T123600Z\n20150830/service/aws4_request\ncf59db423e841c8b7e3444158185aa261b724a5c27cbe762676f3eed19f4dc02"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-relative-relative-normalized/public-key.json",
    "content": "{\n  \"X\":\"b6618f6a65740a99e650b33b6b4b5bd0d43b176d721a3edfea7e7d2d56d936b1\",\n  \"Y\":\"865ed22a7eadc9c5cb9d2cbaca1b3699139fedc5043dc6661864218330c8e518\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-relative-relative-normalized/query-canonical-request.txt",
    "content": "GET\n/\nX-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host\nhost:example.amazonaws.com\n\nhost\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-relative-relative-normalized/query-signature.txt",
    "content": "304402200afc56cdc43e814e44408999f2fb2fe0f8992877345b09e402b28fb2063e4987022035cdba28f5462e9034f45fc5f879bd2305943f9a1830b0f7fbe6468658ba52c1"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-relative-relative-normalized/query-signed-request.txt",
    "content": "GET /example1/example2/../..?X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-Signature=304502202eec946a96e06beaaf22963e2051d0f9200ffdcbe9e179761a0c324142cd5291022100af3d0044ff5a67452342aa457aa7d5646f5f834a9458b147ba4152bb658f0727 HTTP/1.1\nHost:example.amazonaws.com\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-relative-relative-normalized/query-string-to-sign.txt",
    "content": "AWS4-ECDSA-P256-SHA256\n20150830T123600Z\n20150830/service/aws4_request\n890c4ed28c1a1ac10b5862719b537afbe392e987dc1aab1efa16fe7de41d3c81"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-relative-relative-normalized/request.txt",
    "content": "GET /example1/example2/../.. HTTP/1.1\nHost:example.amazonaws.com\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-relative-relative-unnormalized/context.json",
    "content": "{\n    \"credentials\": {\n        \"access_key_id\": \"AKIDEXAMPLE\",\n        \"secret_access_key\": \"wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY\"\n    },\n    \"expiration_in_seconds\": 3600,\n    \"normalize\": false,\n    \"region\": \"us-east-1\",\n    \"service\": \"service\",\n    \"sign_body\": false,\n    \"timestamp\": \"2015-08-30T12:36:00Z\"\n}"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-relative-relative-unnormalized/header-canonical-request.txt",
    "content": "GET\n/example1/example2/../..\n\nhost:example.amazonaws.com\nx-amz-date:20150830T123600Z\nx-amz-region-set:us-east-1\n\nhost;x-amz-date;x-amz-region-set\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-relative-relative-unnormalized/header-signature.txt",
    "content": "30450221009bf86ef8b148904a938fcc5a050aa99cb99cb6a3436a62badfef1b82977d95c4022053e3c11e10fb302a2c39c253b066530404ee5fcca63bf962facd8d072817a69d"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-relative-relative-unnormalized/header-signed-request.txt",
    "content": "GET /example1/example2/../.. HTTP/1.1\nHost:example.amazonaws.com\nX-Amz-Date:20150830T123600Z\nX-Amz-Region-Set:us-east-1\nAuthorization:AWS4-ECDSA-P256-SHA256 Credential=AKIDEXAMPLE/20150830/service/aws4_request, SignedHeaders=host;x-amz-date;x-amz-region-set, Signature=304402205651d45d4f377407303dba0775405efa77683821adff20c0256b94d10710de5b022053fa72420652c55327876c5105da6770cb482f55533e1b0bd7d15fa75f570e46\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-relative-relative-unnormalized/header-string-to-sign.txt",
    "content": "AWS4-ECDSA-P256-SHA256\n20150830T123600Z\n20150830/service/aws4_request\n7bad1fab948577ec4e860ff2bb06ce9b69f0dd60eb8a9ad7c016b584254f9b5b"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-relative-relative-unnormalized/public-key.json",
    "content": "{\n  \"X\":\"b6618f6a65740a99e650b33b6b4b5bd0d43b176d721a3edfea7e7d2d56d936b1\",\n  \"Y\":\"865ed22a7eadc9c5cb9d2cbaca1b3699139fedc5043dc6661864218330c8e518\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-relative-relative-unnormalized/query-canonical-request.txt",
    "content": "GET\n/example1/example2/../..\nX-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host\nhost:example.amazonaws.com\n\nhost\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-relative-relative-unnormalized/query-signature.txt",
    "content": "3046022100a11cd4cae39a6b3553651f9c6360898278d90a3cb8f736184ff6bdb8564decbc022100d86a34623cc34890750a7fe8a30948638f6dace0e558c3ff82a0cf6256067503"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-relative-relative-unnormalized/query-signed-request.txt",
    "content": "GET /example1/example2/../..?X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-Signature=3046022100dfbb77a9369c87af1e00ef8b4da3761849080372576a86e0d1ae0363b135f8f6022100fac80ba02cc33852349f6b19b8fc066724557186b1efe82421e73fb85bfbddef HTTP/1.1\nHost:example.amazonaws.com\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-relative-relative-unnormalized/query-string-to-sign.txt",
    "content": "AWS4-ECDSA-P256-SHA256\n20150830T123600Z\n20150830/service/aws4_request\n504892d7f7262dd98d79ab7f3bb6f918cd59d491aacb2d76450f6e065479b31a"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-relative-relative-unnormalized/request.txt",
    "content": "GET /example1/example2/../.. HTTP/1.1\nHost:example.amazonaws.com\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-relative-unnormalized/context.json",
    "content": "{\n    \"credentials\": {\n        \"access_key_id\": \"AKIDEXAMPLE\",\n        \"secret_access_key\": \"wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY\"\n    },\n    \"expiration_in_seconds\": 3600,\n    \"normalize\": false,\n    \"region\": \"us-east-1\",\n    \"service\": \"service\",\n    \"sign_body\": false,\n    \"timestamp\": \"2015-08-30T12:36:00Z\"\n}"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-relative-unnormalized/header-canonical-request.txt",
    "content": "GET\n/example/..\n\nhost:example.amazonaws.com\nx-amz-date:20150830T123600Z\nx-amz-region-set:us-east-1\n\nhost;x-amz-date;x-amz-region-set\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-relative-unnormalized/header-signature.txt",
    "content": "3045022100a85167a37a2c6aea42ef9dcb0dcaeaf85ca4ef1a4d8ffea5be550dbd4573471902202193760e5e6bb1ee4aff836769b9739f4563e06749bcaa7553ec1d1377aa5a6d"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-relative-unnormalized/header-signed-request.txt",
    "content": "GET /example/.. HTTP/1.1\nHost:example.amazonaws.com\nX-Amz-Date:20150830T123600Z\nX-Amz-Region-Set:us-east-1\nAuthorization:AWS4-ECDSA-P256-SHA256 Credential=AKIDEXAMPLE/20150830/service/aws4_request, SignedHeaders=host;x-amz-date;x-amz-region-set, Signature=304402201430c834d8a89aca13ebd785da338950559f71ab29f1b7d7b4ad6b090de1a09702206c8d6089b75105d6fc5df5374bbb8abbc33b78951c95b90f9f6c25a657b58ce6\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-relative-unnormalized/header-string-to-sign.txt",
    "content": "AWS4-ECDSA-P256-SHA256\n20150830T123600Z\n20150830/service/aws4_request\nc859b5032f2ebd5df0285ff633b495b0e6e962e5adb94731c95e8e993a9a8213"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-relative-unnormalized/public-key.json",
    "content": "{\n  \"X\":\"b6618f6a65740a99e650b33b6b4b5bd0d43b176d721a3edfea7e7d2d56d936b1\",\n  \"Y\":\"865ed22a7eadc9c5cb9d2cbaca1b3699139fedc5043dc6661864218330c8e518\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-relative-unnormalized/query-canonical-request.txt",
    "content": "GET\n/example/..\nX-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host\nhost:example.amazonaws.com\n\nhost\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-relative-unnormalized/query-signature.txt",
    "content": "3045022074d05647e395d4bf3d751953c7242ee27dd16fbae3f604a272d3acc3d72ba5fb022100ddccd95ac05f60f10d5e95c5847b49018bbfa1084361bf338964408cc2162fff"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-relative-unnormalized/query-signed-request.txt",
    "content": "GET /example/..?X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-Signature=3045022029b3d53b5fdc8a5c0f769c2cf41221d06b6f88e941e92e11c47009b2f768908c022100b979fc4142576a3328bf28172fcd71d47556f06d90a55a2f19c7b0f9b946c7f2 HTTP/1.1\nHost:example.amazonaws.com\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-relative-unnormalized/query-string-to-sign.txt",
    "content": "AWS4-ECDSA-P256-SHA256\n20150830T123600Z\n20150830/service/aws4_request\nbbbb3668f996906ebb2c96ebdc2418af99656315adaf647989ab336c88fb516e"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-relative-unnormalized/request.txt",
    "content": "GET /example/.. HTTP/1.1\nHost:example.amazonaws.com\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slash-dot-slash-normalized/context.json",
    "content": "{\n    \"credentials\": {\n        \"access_key_id\": \"AKIDEXAMPLE\",\n        \"secret_access_key\": \"wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY\"\n    },\n    \"expiration_in_seconds\": 3600,\n    \"normalize\": true,\n    \"region\": \"us-east-1\",\n    \"service\": \"service\",\n    \"sign_body\": false,\n    \"timestamp\": \"2015-08-30T12:36:00Z\"\n}"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slash-dot-slash-normalized/header-canonical-request.txt",
    "content": "GET\n/\n\nhost:example.amazonaws.com\nx-amz-date:20150830T123600Z\nx-amz-region-set:us-east-1\n\nhost;x-amz-date;x-amz-region-set\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slash-dot-slash-normalized/header-signature.txt",
    "content": "3045022100e8ed39e8b964e06162ab1cddbff57c449a9b72e2d052a7a3e12a116ae30185ee022003e6eb0fddbaa586225b26877ab145e05a08ac418ef7c966e5daef258b70cbfc"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slash-dot-slash-normalized/header-signed-request.txt",
    "content": "GET /./ HTTP/1.1\nHost:example.amazonaws.com\nX-Amz-Date:20150830T123600Z\nX-Amz-Region-Set:us-east-1\nAuthorization:AWS4-ECDSA-P256-SHA256 Credential=AKIDEXAMPLE/20150830/service/aws4_request, SignedHeaders=host;x-amz-date;x-amz-region-set, Signature=304502207665172b8612dbbd2c1f3c722c52b7b8dac2cdc5203d86252e21d9610018b153022100c548f3f0c23beeb388f8c8138ce1e883e2cdf2be1d7c5d7c15d4e565bfd6b0dd\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slash-dot-slash-normalized/header-string-to-sign.txt",
    "content": "AWS4-ECDSA-P256-SHA256\n20150830T123600Z\n20150830/service/aws4_request\ncf59db423e841c8b7e3444158185aa261b724a5c27cbe762676f3eed19f4dc02"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slash-dot-slash-normalized/public-key.json",
    "content": "{\n  \"X\":\"b6618f6a65740a99e650b33b6b4b5bd0d43b176d721a3edfea7e7d2d56d936b1\",\n  \"Y\":\"865ed22a7eadc9c5cb9d2cbaca1b3699139fedc5043dc6661864218330c8e518\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slash-dot-slash-normalized/query-canonical-request.txt",
    "content": "GET\n/\nX-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host\nhost:example.amazonaws.com\n\nhost\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slash-dot-slash-normalized/query-signature.txt",
    "content": "3046022100ea775dcca84dbada39eb9e7d55183c31d7294d1826d965c2ade1730bd20ac7cb022100aaab5325eed9bb3f93814af0fd0170893cbeeff052d0bb554f91a394fd2f5135"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slash-dot-slash-normalized/query-signed-request.txt",
    "content": "GET /./?X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-Signature=3046022100d44a1214b0389964d48bf1ea73df6649f6dbd213421986ce9c2fae6397c9a866022100e54a0895ed71289a7b38282fbbf57ab4bdf6558bec6bff5b05c0d2b1a4f9b7e2 HTTP/1.1\nHost:example.amazonaws.com\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slash-dot-slash-normalized/query-string-to-sign.txt",
    "content": "AWS4-ECDSA-P256-SHA256\n20150830T123600Z\n20150830/service/aws4_request\n890c4ed28c1a1ac10b5862719b537afbe392e987dc1aab1efa16fe7de41d3c81"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slash-dot-slash-normalized/request.txt",
    "content": "GET /./ HTTP/1.1\nHost:example.amazonaws.com\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slash-dot-slash-unnormalized/context.json",
    "content": "{\n    \"credentials\": {\n        \"access_key_id\": \"AKIDEXAMPLE\",\n        \"secret_access_key\": \"wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY\"\n    },\n    \"expiration_in_seconds\": 3600,\n    \"normalize\": false,\n    \"region\": \"us-east-1\",\n    \"service\": \"service\",\n    \"sign_body\": false,\n    \"timestamp\": \"2015-08-30T12:36:00Z\"\n}"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slash-dot-slash-unnormalized/header-canonical-request.txt",
    "content": "GET\n/./\n\nhost:example.amazonaws.com\nx-amz-date:20150830T123600Z\nx-amz-region-set:us-east-1\n\nhost;x-amz-date;x-amz-region-set\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slash-dot-slash-unnormalized/header-signature.txt",
    "content": "30450220430660fe6e8e04ee055a2c56476dcf95c00b3efca267823134664f90a23fdc0f022100f188106c83e13a89e6a487f24d23522520f7a15c40e3aacd0c32284da42c2f5a"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slash-dot-slash-unnormalized/header-signed-request.txt",
    "content": "GET /./ HTTP/1.1\nHost:example.amazonaws.com\nX-Amz-Date:20150830T123600Z\nX-Amz-Region-Set:us-east-1\nAuthorization:AWS4-ECDSA-P256-SHA256 Credential=AKIDEXAMPLE/20150830/service/aws4_request, SignedHeaders=host;x-amz-date;x-amz-region-set, Signature=3044022049aaa02168ac9666a94f42238be0a02a7a244b74d6e16bdf64aac7ce8e21e44d02206b9be50186bdd4ee9191c0dd5ccff7e990365bb3b56430653f6fa49a68dbf596\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slash-dot-slash-unnormalized/header-string-to-sign.txt",
    "content": "AWS4-ECDSA-P256-SHA256\n20150830T123600Z\n20150830/service/aws4_request\na14dce0217a32357c623c3db790988b6b5aa1494a527158b06d3ca4444561a4b"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slash-dot-slash-unnormalized/public-key.json",
    "content": "{\n  \"X\":\"b6618f6a65740a99e650b33b6b4b5bd0d43b176d721a3edfea7e7d2d56d936b1\",\n  \"Y\":\"865ed22a7eadc9c5cb9d2cbaca1b3699139fedc5043dc6661864218330c8e518\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slash-dot-slash-unnormalized/query-canonical-request.txt",
    "content": "GET\n/./\nX-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host\nhost:example.amazonaws.com\n\nhost\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slash-dot-slash-unnormalized/query-signature.txt",
    "content": "304402207999228e5213710741e030ffa7dfa83ce3676384c5df044431bc854488a08abd0220248ff8a956bbcbc641c0ec4a7853774f44112b1571f861fc5aebf78282fd7e63"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slash-dot-slash-unnormalized/query-signed-request.txt",
    "content": "GET /./?X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-Signature=304502210089daa43b189bd9fba8fc67a3b03b4dce6e29e0aff0bd40a6ce7df7e0c8f890e1022016592a48b323a176064eecf203863be8e3de057d3ff0d7736c121a9cf88ccb85 HTTP/1.1\nHost:example.amazonaws.com\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slash-dot-slash-unnormalized/query-string-to-sign.txt",
    "content": "AWS4-ECDSA-P256-SHA256\n20150830T123600Z\n20150830/service/aws4_request\n0d146fed00cdf50d7a87864583b7a33ca75322aab46b0a2d204f5d0c13440917"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slash-dot-slash-unnormalized/request.txt",
    "content": "GET /./ HTTP/1.1\nHost:example.amazonaws.com\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slash-normalized/context.json",
    "content": "{\n    \"credentials\": {\n        \"access_key_id\": \"AKIDEXAMPLE\",\n        \"secret_access_key\": \"wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY\"\n    },\n    \"expiration_in_seconds\": 3600,\n    \"normalize\": true,\n    \"region\": \"us-east-1\",\n    \"service\": \"service\",\n    \"sign_body\": false,\n    \"timestamp\": \"2015-08-30T12:36:00Z\"\n}"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slash-normalized/header-canonical-request.txt",
    "content": "GET\n/\n\nhost:example.amazonaws.com\nx-amz-date:20150830T123600Z\nx-amz-region-set:us-east-1\n\nhost;x-amz-date;x-amz-region-set\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slash-normalized/header-signature.txt",
    "content": "304602210084a7310186a866f81dbe8e546f6931dd7c61586d30664d5c11f5904836f72cfd022100c7d80abdccceb1cbcdbbda8b4f3f0ae1ac6229dce800b21ba8298c582fa96a1c"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slash-normalized/header-signed-request.txt",
    "content": "GET // HTTP/1.1\nHost:example.amazonaws.com\nX-Amz-Date:20150830T123600Z\nX-Amz-Region-Set:us-east-1\nAuthorization:AWS4-ECDSA-P256-SHA256 Credential=AKIDEXAMPLE/20150830/service/aws4_request, SignedHeaders=host;x-amz-date;x-amz-region-set, Signature=304502207c7fe2e91cdbe4529569d58fc3727507375cff81a56cfa26b387895ab6cdbb25022100d38e283efa5ff27d88f10e7367493b1dc49050ba9474531e4acb3ee30fac3739\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slash-normalized/header-string-to-sign.txt",
    "content": "AWS4-ECDSA-P256-SHA256\n20150830T123600Z\n20150830/service/aws4_request\ncf59db423e841c8b7e3444158185aa261b724a5c27cbe762676f3eed19f4dc02"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slash-normalized/public-key.json",
    "content": "{\n  \"X\":\"b6618f6a65740a99e650b33b6b4b5bd0d43b176d721a3edfea7e7d2d56d936b1\",\n  \"Y\":\"865ed22a7eadc9c5cb9d2cbaca1b3699139fedc5043dc6661864218330c8e518\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slash-normalized/query-canonical-request.txt",
    "content": "GET\n/\nX-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host\nhost:example.amazonaws.com\n\nhost\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slash-normalized/query-signature.txt",
    "content": "3045022100b1c08ec4e9a6313f2de7bd8ce726845ea7a3cc636a21ab7258a3067836a6601b02206b76d7a9845bfb683eb30d126a1dc4657e8b64762d4bfb976da9fa132c4a9bd7"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slash-normalized/query-signed-request.txt",
    "content": "GET //?X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-Signature=304402207e412e67f6164f6f3bdae2cc5af21bc5747106274a61a531b61275846a81a4f6022036260958080b0447f67df63ba3dbda6fe97dbffe54073491dc884ae4da43c83e HTTP/1.1\nHost:example.amazonaws.com\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slash-normalized/query-string-to-sign.txt",
    "content": "AWS4-ECDSA-P256-SHA256\n20150830T123600Z\n20150830/service/aws4_request\n890c4ed28c1a1ac10b5862719b537afbe392e987dc1aab1efa16fe7de41d3c81"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slash-normalized/request.txt",
    "content": "GET // HTTP/1.1\nHost:example.amazonaws.com\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slash-pointless-dot-normalized/context.json",
    "content": "{\n    \"credentials\": {\n        \"access_key_id\": \"AKIDEXAMPLE\",\n        \"secret_access_key\": \"wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY\"\n    },\n    \"expiration_in_seconds\": 3600,\n    \"normalize\": true,\n    \"region\": \"us-east-1\",\n    \"service\": \"service\",\n    \"sign_body\": false,\n    \"timestamp\": \"2015-08-30T12:36:00Z\"\n}"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slash-pointless-dot-normalized/header-canonical-request.txt",
    "content": "GET\n/example\n\nhost:example.amazonaws.com\nx-amz-date:20150830T123600Z\nx-amz-region-set:us-east-1\n\nhost;x-amz-date;x-amz-region-set\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slash-pointless-dot-normalized/header-signature.txt",
    "content": "304502206b0f9b99fe4e4b3bbcb69dd6ca076c847e676161b6fb4cd2bc776f357ece3d07022100fafc5606c7b1a45aa6ce6a7a3a68b07875315b8f952f9a192a420e407e8d1cef"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slash-pointless-dot-normalized/header-signed-request.txt",
    "content": "GET /./example HTTP/1.1\nHost:example.amazonaws.com\nX-Amz-Date:20150830T123600Z\nX-Amz-Region-Set:us-east-1\nAuthorization:AWS4-ECDSA-P256-SHA256 Credential=AKIDEXAMPLE/20150830/service/aws4_request, SignedHeaders=host;x-amz-date;x-amz-region-set, Signature=30460221008cb5fa4d42bdd0c293d58ce748128be3a41693d25cfd701e281bf0c0bc28f41a022100b863217c8f05146ff1b4282706bc78781b1425c2d36a09127116e852e31fc974\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slash-pointless-dot-normalized/header-string-to-sign.txt",
    "content": "AWS4-ECDSA-P256-SHA256\n20150830T123600Z\n20150830/service/aws4_request\n823cb165e35e124f862c99c89a46414c24e3800f149377591e35a4848317e825"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slash-pointless-dot-normalized/public-key.json",
    "content": "{\n  \"X\":\"b6618f6a65740a99e650b33b6b4b5bd0d43b176d721a3edfea7e7d2d56d936b1\",\n  \"Y\":\"865ed22a7eadc9c5cb9d2cbaca1b3699139fedc5043dc6661864218330c8e518\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slash-pointless-dot-normalized/query-canonical-request.txt",
    "content": "GET\n/example\nX-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host\nhost:example.amazonaws.com\n\nhost\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slash-pointless-dot-normalized/query-signature.txt",
    "content": "3045022004b3d54ffdc33558a93c158a156ef1b50963d051e58ecb88b6809629d6b93860022100d88f70cb68de54e8abc628cb2325bcb32fab1a207d482010955f844812ad5174"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slash-pointless-dot-normalized/query-signed-request.txt",
    "content": "GET /./example?X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-Signature=3045022100ae36c4ce9d4e0026419e57d4cac9d2d4fd487f2aa3e8520ef43d1d4b8b0e96f002202a4b135ab4cb49cc35dd756dd40f02ce96271d32f2f5ae2d671ccf535139a4b3 HTTP/1.1\nHost:example.amazonaws.com\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slash-pointless-dot-normalized/query-string-to-sign.txt",
    "content": "AWS4-ECDSA-P256-SHA256\n20150830T123600Z\n20150830/service/aws4_request\n0cc67a8acfed5946b645794c649dd98d3485728119cdf17d38985ba0ff55abca"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slash-pointless-dot-normalized/request.txt",
    "content": "GET /./example HTTP/1.1\nHost:example.amazonaws.com\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slash-pointless-dot-unnormalized/context.json",
    "content": "{\n    \"credentials\": {\n        \"access_key_id\": \"AKIDEXAMPLE\",\n        \"secret_access_key\": \"wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY\"\n    },\n    \"expiration_in_seconds\": 3600,\n    \"normalize\": false,\n    \"region\": \"us-east-1\",\n    \"service\": \"service\",\n    \"sign_body\": false,\n    \"timestamp\": \"2015-08-30T12:36:00Z\"\n}"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slash-pointless-dot-unnormalized/header-canonical-request.txt",
    "content": "GET\n/./example\n\nhost:example.amazonaws.com\nx-amz-date:20150830T123600Z\nx-amz-region-set:us-east-1\n\nhost;x-amz-date;x-amz-region-set\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slash-pointless-dot-unnormalized/header-signature.txt",
    "content": "3044022056618e95bf64058b8174e9e52790352380946d9a0a4ab332b530a63f497a80800220105ebcd6c6ee9b034157d21e7c81fdfb72ca640961cee9b49de82e5c1f80ac5e"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slash-pointless-dot-unnormalized/header-signed-request.txt",
    "content": "GET /./example HTTP/1.1\nHost:example.amazonaws.com\nX-Amz-Date:20150830T123600Z\nX-Amz-Region-Set:us-east-1\nAuthorization:AWS4-ECDSA-P256-SHA256 Credential=AKIDEXAMPLE/20150830/service/aws4_request, SignedHeaders=host;x-amz-date;x-amz-region-set, Signature=30460221009e2c768ae9904c3d04eba53cfbb7460034029fb1f169b51f82623cc53ae25dc7022100bfe47ecde858ad9ae3311bba5a4fd45fcacdb1795cc6825f0939e5d929a464bf\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slash-pointless-dot-unnormalized/header-string-to-sign.txt",
    "content": "AWS4-ECDSA-P256-SHA256\n20150830T123600Z\n20150830/service/aws4_request\n407314cdff397462b2458ba1860907adefcbb73fd630ddbd3de7300d2f773804"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slash-pointless-dot-unnormalized/public-key.json",
    "content": "{\n  \"X\":\"b6618f6a65740a99e650b33b6b4b5bd0d43b176d721a3edfea7e7d2d56d936b1\",\n  \"Y\":\"865ed22a7eadc9c5cb9d2cbaca1b3699139fedc5043dc6661864218330c8e518\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slash-pointless-dot-unnormalized/query-canonical-request.txt",
    "content": "GET\n/./example\nX-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host\nhost:example.amazonaws.com\n\nhost\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slash-pointless-dot-unnormalized/query-signature.txt",
    "content": "304502202c31415712324143f4f20aebbd0f8a2fd4fcdd49d68ac95cd6815db3c0e6407b022100cb46cb62bbd024da2e29445c3378a32057b68b272fb2a08c79bfdcbc398505f3"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slash-pointless-dot-unnormalized/query-signed-request.txt",
    "content": "GET /./example?X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-Signature=304602210090227b15d2fecbf2acbaf7db1e17d678ee26f351546b2a4b29ca288b094f0056022100c1b386398e19ea14bd93082062eef901365946ca05dcb166a8bc9ca5c9d1dfec HTTP/1.1\nHost:example.amazonaws.com\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slash-pointless-dot-unnormalized/query-string-to-sign.txt",
    "content": "AWS4-ECDSA-P256-SHA256\n20150830T123600Z\n20150830/service/aws4_request\nefbe4f47c2acbb53fbfd0be6846cfa35a48c21f3f800e741278dae7b721302b4"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slash-pointless-dot-unnormalized/request.txt",
    "content": "GET /./example HTTP/1.1\nHost:example.amazonaws.com\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slash-unnormalized/context.json",
    "content": "{\n    \"credentials\": {\n        \"access_key_id\": \"AKIDEXAMPLE\",\n        \"secret_access_key\": \"wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY\"\n    },\n    \"expiration_in_seconds\": 3600,\n    \"normalize\": false,\n    \"region\": \"us-east-1\",\n    \"service\": \"service\",\n    \"sign_body\": false,\n    \"timestamp\": \"2015-08-30T12:36:00Z\"\n}"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slash-unnormalized/header-canonical-request.txt",
    "content": "GET\n//\n\nhost:example.amazonaws.com\nx-amz-date:20150830T123600Z\nx-amz-region-set:us-east-1\n\nhost;x-amz-date;x-amz-region-set\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slash-unnormalized/header-signature.txt",
    "content": "3046022100fee7e772befdf85d3f9871798d5e08e93ad3f5d5d408b41387ba55714244809b0221008268d33835753dcdbd0a4d149d902eed071c41b70c230ecf56e0120a0f7d72a1"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slash-unnormalized/header-signed-request.txt",
    "content": "GET // HTTP/1.1\nHost:example.amazonaws.com\nX-Amz-Date:20150830T123600Z\nX-Amz-Region-Set:us-east-1\nAuthorization:AWS4-ECDSA-P256-SHA256 Credential=AKIDEXAMPLE/20150830/service/aws4_request, SignedHeaders=host;x-amz-date;x-amz-region-set, Signature=3045022061f03990d40a274470a1621b6e12b64452083a61218be77e48132a965da27377022100cdff18369b7361b1e33bd6cb5b216cdf88d390121447d442f59ccf84eb6489f7\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slash-unnormalized/header-string-to-sign.txt",
    "content": "AWS4-ECDSA-P256-SHA256\n20150830T123600Z\n20150830/service/aws4_request\nfc8f42c7ce50ba8830a34b16d9fb478170176d78c81339e8d7e31d4baa9ec9f4"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slash-unnormalized/public-key.json",
    "content": "{\n  \"X\":\"b6618f6a65740a99e650b33b6b4b5bd0d43b176d721a3edfea7e7d2d56d936b1\",\n  \"Y\":\"865ed22a7eadc9c5cb9d2cbaca1b3699139fedc5043dc6661864218330c8e518\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slash-unnormalized/query-canonical-request.txt",
    "content": "GET\n//\nX-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host\nhost:example.amazonaws.com\n\nhost\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slash-unnormalized/query-signature.txt",
    "content": "3045022100abcadf84ed6f4bf5c19df3220b13e370ef093e5e7a5a5093c1a796a3de7804710220568ec0dafd60aa764002ce2ac7c89f403b47142dc7e0e48ded1691929488c88e"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slash-unnormalized/query-signed-request.txt",
    "content": "GET //?X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-Signature=3046022100a3e0b71f92af44f8b58e94018ab4b3fddca86cacabaf94d4a100ab94f06c3bbf022100a6f920a313d8d01da331c95d6b12b4d51d90cad487a4a82c20eb5bb373d5f4d2 HTTP/1.1\nHost:example.amazonaws.com\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slash-unnormalized/query-string-to-sign.txt",
    "content": "AWS4-ECDSA-P256-SHA256\n20150830T123600Z\n20150830/service/aws4_request\n633e0570a745c18cc22e43af8be65cfed3e7173061ec403353734bdfae90e0b6"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slash-unnormalized/request.txt",
    "content": "GET // HTTP/1.1\nHost:example.amazonaws.com\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slashes-normalized/context.json",
    "content": "{\n    \"credentials\": {\n        \"access_key_id\": \"AKIDEXAMPLE\",\n        \"secret_access_key\": \"wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY\"\n    },\n    \"expiration_in_seconds\": 3600,\n    \"normalize\": true,\n    \"region\": \"us-east-1\",\n    \"service\": \"service\",\n    \"sign_body\": false,\n    \"timestamp\": \"2015-08-30T12:36:00Z\"\n}"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slashes-normalized/header-canonical-request.txt",
    "content": "GET\n/example/\n\nhost:example.amazonaws.com\nx-amz-date:20150830T123600Z\nx-amz-region-set:us-east-1\n\nhost;x-amz-date;x-amz-region-set\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slashes-normalized/header-signature.txt",
    "content": "304402205dd203fd6b973e5fb088569ec27db1e267ef4a728f177e88fcc65f299255c0ab02206da878f40c64094595aa4e808849b69025f1c9b9f4be0f0e6ab8cd7a04e81d77"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slashes-normalized/header-signed-request.txt",
    "content": "GET //example// HTTP/1.1\nHost:example.amazonaws.com\nX-Amz-Date:20150830T123600Z\nX-Amz-Region-Set:us-east-1\nAuthorization:AWS4-ECDSA-P256-SHA256 Credential=AKIDEXAMPLE/20150830/service/aws4_request, SignedHeaders=host;x-amz-date;x-amz-region-set, Signature=304402203d34870fcc77b0f5a3f6d440cd1cecb75c7e534cfbcc68f60743d308ae92fef602200f9fbaacc5010b9a7e046b1b5ae58764bd32c24c47ef65b63ad9ff756c478e4d\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slashes-normalized/header-string-to-sign.txt",
    "content": "AWS4-ECDSA-P256-SHA256\n20150830T123600Z\n20150830/service/aws4_request\nea6c9c4bc1e85b94f2579cebbc85a84c3f8eaa055c006697555f074dd68509a6"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slashes-normalized/public-key.json",
    "content": "{\n  \"X\":\"b6618f6a65740a99e650b33b6b4b5bd0d43b176d721a3edfea7e7d2d56d936b1\",\n  \"Y\":\"865ed22a7eadc9c5cb9d2cbaca1b3699139fedc5043dc6661864218330c8e518\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slashes-normalized/query-canonical-request.txt",
    "content": "GET\n/example/\nX-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host\nhost:example.amazonaws.com\n\nhost\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slashes-normalized/query-signature.txt",
    "content": "3045022100dfd2281b396d138207f0e58889bd6cc4d95ffd8d64e6f37ef2a9f2a15cab6944022060d05a747cd4e3c49cb50bf58d834ae917cd1ebd1524a352fb64f4d54f9ba279"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slashes-normalized/query-signed-request.txt",
    "content": "GET //example//?X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-Signature=3045022100ec452ebb2ae12447edb19c7c1824c5b5921650498ed70c3366d9bce4875f0095022007c29a38626d79722aa8f8882ea96003eaf2a135c4bed3394f24a068fded99f1 HTTP/1.1\nHost:example.amazonaws.com\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slashes-normalized/query-string-to-sign.txt",
    "content": "AWS4-ECDSA-P256-SHA256\n20150830T123600Z\n20150830/service/aws4_request\nab3f7b8af0ce16e0faf508160fb13d890874992d74f36214ae9eec7437361f2b"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slashes-normalized/request.txt",
    "content": "GET //example// HTTP/1.1\nHost:example.amazonaws.com\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slashes-unnormalized/context.json",
    "content": "{\n    \"credentials\": {\n        \"access_key_id\": \"AKIDEXAMPLE\",\n        \"secret_access_key\": \"wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY\"\n    },\n    \"expiration_in_seconds\": 3600,\n    \"normalize\": false,\n    \"region\": \"us-east-1\",\n    \"service\": \"service\",\n    \"sign_body\": false,\n    \"timestamp\": \"2015-08-30T12:36:00Z\"\n}"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slashes-unnormalized/header-canonical-request.txt",
    "content": "GET\n//example//\n\nhost:example.amazonaws.com\nx-amz-date:20150830T123600Z\nx-amz-region-set:us-east-1\n\nhost;x-amz-date;x-amz-region-set\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slashes-unnormalized/header-signature.txt",
    "content": "3044022039ccb6afb5f0b574cfc8fec2e9158269bbe28f9e5747acc032d1ea17617f8b2002204933ee3e4ad4ec425c90593a68db99fcece29ae45906dec40c2204290cedf8bd"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slashes-unnormalized/header-signed-request.txt",
    "content": "GET //example// HTTP/1.1\nHost:example.amazonaws.com\nX-Amz-Date:20150830T123600Z\nX-Amz-Region-Set:us-east-1\nAuthorization:AWS4-ECDSA-P256-SHA256 Credential=AKIDEXAMPLE/20150830/service/aws4_request, SignedHeaders=host;x-amz-date;x-amz-region-set, Signature=304502202450e5abfccb424d5a0e2d5d1a084e76abc5290ae567a97f5174bfed575fd519022100a5e743040a2bdd3cd7889070e1d190d5782e7591a715370f9bea04dc2702dbab\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slashes-unnormalized/header-string-to-sign.txt",
    "content": "AWS4-ECDSA-P256-SHA256\n20150830T123600Z\n20150830/service/aws4_request\nbf8c459a6a7f3879f55bff41e4dca65f69df4628456904e47f83013c0deb7276"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slashes-unnormalized/public-key.json",
    "content": "{\n  \"X\":\"b6618f6a65740a99e650b33b6b4b5bd0d43b176d721a3edfea7e7d2d56d936b1\",\n  \"Y\":\"865ed22a7eadc9c5cb9d2cbaca1b3699139fedc5043dc6661864218330c8e518\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slashes-unnormalized/query-canonical-request.txt",
    "content": "GET\n//example//\nX-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host\nhost:example.amazonaws.com\n\nhost\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slashes-unnormalized/query-signature.txt",
    "content": "3045022100fa1d3e99997a184d59e23fb8bfeca08a5f94f2e7b89b0320d11deacab3593f0f022009c0785ec02c5dda370a3eb714feb51e3b0d56df674571bf7146bf8277897e65"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slashes-unnormalized/query-signed-request.txt",
    "content": "GET //example//?X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-Signature=3046022100b3e1640be9e64cd28d1ff4a1f157e9f3c751545d6e0a1f1c4e380fee08e8745b022100d9b667f2d38600993703f88b246b53ebb85faecfaf2de27cf39e43957e90d492 HTTP/1.1\nHost:example.amazonaws.com\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slashes-unnormalized/query-string-to-sign.txt",
    "content": "AWS4-ECDSA-P256-SHA256\n20150830T123600Z\n20150830/service/aws4_request\n660b4a6f0bd53b287cefb21cdf69c1574303de44d2e9f7759b5379b428b70157"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-slashes-unnormalized/request.txt",
    "content": "GET //example// HTTP/1.1\nHost:example.amazonaws.com\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-space-normalized/context.json",
    "content": "{\n    \"credentials\": {\n        \"access_key_id\": \"AKIDEXAMPLE\",\n        \"secret_access_key\": \"wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY\"\n    },\n    \"expiration_in_seconds\": 3600,\n    \"normalize\": true,\n    \"region\": \"us-east-1\",\n    \"service\": \"service\",\n    \"sign_body\": false,\n    \"timestamp\": \"2015-08-30T12:36:00Z\"\n}"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-space-normalized/header-canonical-request.txt",
    "content": "GET\n/example%20space/\n\nhost:example.amazonaws.com\nx-amz-date:20150830T123600Z\nx-amz-region-set:us-east-1\n\nhost;x-amz-date;x-amz-region-set\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-space-normalized/header-signature.txt",
    "content": "304502202292b4f0e4f1495b9ceb3b77349efeffdce42cb5461f810db3983005c1e772ca022100b4b6175661196a82f5b59968315517e1ffdde58d2e3eba10d3bfe171cde625c4"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-space-normalized/header-signed-request.txt",
    "content": "GET /example space/ HTTP/1.1\nHost:example.amazonaws.com\nX-Amz-Date:20150830T123600Z\nX-Amz-Region-Set:us-east-1\nAuthorization:AWS4-ECDSA-P256-SHA256 Credential=AKIDEXAMPLE/20150830/service/aws4_request, SignedHeaders=host;x-amz-date;x-amz-region-set, Signature=3046022100e8e0ec99a8d287073e078543fdbdeba108cdef097a52c7556874076072350200022100e59d9e0f48209bea00faa47d485d850eb72747db83927a2a43b5ebab5ca2b545\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-space-normalized/header-string-to-sign.txt",
    "content": "AWS4-ECDSA-P256-SHA256\n20150830T123600Z\n20150830/service/aws4_request\n1bbd1a746b47d963b21f6e6783c689c038162ccc3f8a69abeda218a178ee4d19"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-space-normalized/public-key.json",
    "content": "{\n  \"X\":\"b6618f6a65740a99e650b33b6b4b5bd0d43b176d721a3edfea7e7d2d56d936b1\",\n  \"Y\":\"865ed22a7eadc9c5cb9d2cbaca1b3699139fedc5043dc6661864218330c8e518\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-space-normalized/query-canonical-request.txt",
    "content": "GET\n/example%20space/\nX-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host\nhost:example.amazonaws.com\n\nhost\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-space-normalized/query-signature.txt",
    "content": "3045022100fc068fdda7586bec9ac9ed341e7a81bf1e1f8c60fee6e22165868ecac62e404d02200620b5d68b9be75210336618fc0a884439ce1ae93085adb03e27f1ce7ca4912e"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-space-normalized/query-signed-request.txt",
    "content": "GET /example space/?X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-Signature=304402200bc73964284c5a0367aec4bc4c3e80c7425388c8f5ac963a3e0cc9437549bd2b022077b25c48bed62c31f1cc4bf78d56089953806d8132ccebf23907c9b4445db86c HTTP/1.1\nHost:example.amazonaws.com\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-space-normalized/query-string-to-sign.txt",
    "content": "AWS4-ECDSA-P256-SHA256\n20150830T123600Z\n20150830/service/aws4_request\n6a2f4ddc0e28ca4b91abed80c45ad628fc63d8a4cd9c443869d5dd6cf07235ed"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-space-normalized/request.txt",
    "content": "GET /example space/ HTTP/1.1\nHost:example.amazonaws.com\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-space-unnormalized/context.json",
    "content": "{\n    \"credentials\": {\n        \"access_key_id\": \"AKIDEXAMPLE\",\n        \"secret_access_key\": \"wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY\"\n    },\n    \"expiration_in_seconds\": 3600,\n    \"normalize\": false,\n    \"region\": \"us-east-1\",\n    \"service\": \"service\",\n    \"sign_body\": false,\n    \"timestamp\": \"2015-08-30T12:36:00Z\"\n}"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-space-unnormalized/header-canonical-request.txt",
    "content": "GET\n/example%20space/\n\nhost:example.amazonaws.com\nx-amz-date:20150830T123600Z\nx-amz-region-set:us-east-1\n\nhost;x-amz-date;x-amz-region-set\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-space-unnormalized/header-signature.txt",
    "content": "3046022100881d1dce37131cd3248fa4cfb63f050e8985c3de5a58f654a8b263d52ad576180221009316e13742504474cf33631bb5f2fa89f4990c911ad317be831a6de015cf4054"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-space-unnormalized/header-signed-request.txt",
    "content": "GET /example space/ HTTP/1.1\nHost:example.amazonaws.com\nX-Amz-Date:20150830T123600Z\nX-Amz-Region-Set:us-east-1\nAuthorization:AWS4-ECDSA-P256-SHA256 Credential=AKIDEXAMPLE/20150830/service/aws4_request, SignedHeaders=host;x-amz-date;x-amz-region-set, Signature=3046022100a26695d793a8e7d2ed2a3495402e9b4bf8e5b05e767d303f57d9515f617ebae5022100c4b89f5648567c08b6d173b6d733f5c012bb615cd38039109f64db56efecc851\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-space-unnormalized/header-string-to-sign.txt",
    "content": "AWS4-ECDSA-P256-SHA256\n20150830T123600Z\n20150830/service/aws4_request\n1bbd1a746b47d963b21f6e6783c689c038162ccc3f8a69abeda218a178ee4d19"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-space-unnormalized/public-key.json",
    "content": "{\n  \"X\":\"b6618f6a65740a99e650b33b6b4b5bd0d43b176d721a3edfea7e7d2d56d936b1\",\n  \"Y\":\"865ed22a7eadc9c5cb9d2cbaca1b3699139fedc5043dc6661864218330c8e518\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-space-unnormalized/query-canonical-request.txt",
    "content": "GET\n/example%20space/\nX-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host\nhost:example.amazonaws.com\n\nhost\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-space-unnormalized/query-signature.txt",
    "content": "304502201825fe5d62f321a740cbe590ce0c0c17045eed9acbbbd574d3cefbec349d06c5022100bcd482f85374b24d9f1f5000d2de7e12a4e0c8f5277e73d29c41ecc45390e731"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-space-unnormalized/query-signed-request.txt",
    "content": "GET /example space/?X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-Signature=304402207c82fe84466237eda8666f893df1d96a82da91509bb11252d82af8744bb2155702200405ec0f65fd883703a556c6d7d74cfb36a2cbbd3dabd884957809e6c6856325 HTTP/1.1\nHost:example.amazonaws.com\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-space-unnormalized/query-string-to-sign.txt",
    "content": "AWS4-ECDSA-P256-SHA256\n20150830T123600Z\n20150830/service/aws4_request\n6a2f4ddc0e28ca4b91abed80c45ad628fc63d8a4cd9c443869d5dd6cf07235ed"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-space-unnormalized/request.txt",
    "content": "GET /example space/ HTTP/1.1\nHost:example.amazonaws.com\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-unreserved/context.json",
    "content": "{\n    \"credentials\": {\n        \"access_key_id\": \"AKIDEXAMPLE\",\n        \"secret_access_key\": \"wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY\"\n    },\n    \"expiration_in_seconds\": 3600,\n    \"normalize\": true,\n    \"region\": \"us-east-1\",\n    \"service\": \"service\",\n    \"sign_body\": false,\n    \"timestamp\": \"2015-08-30T12:36:00Z\"\n}"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-unreserved/header-canonical-request.txt",
    "content": "GET\n/-._~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\n\nhost:example.amazonaws.com\nx-amz-date:20150830T123600Z\nx-amz-region-set:us-east-1\n\nhost;x-amz-date;x-amz-region-set\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-unreserved/header-signature.txt",
    "content": "304502204303d34750ced762f4e5af2c61ba70c9f5830d8a5c7fc418a02823d61673ca32022100c26cf8f38007155cb8bd3e684697063ad8f421a91be796d78b14b126e25d3680"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-unreserved/header-signed-request.txt",
    "content": "GET /-._~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz HTTP/1.1\nHost:example.amazonaws.com\nX-Amz-Date:20150830T123600Z\nX-Amz-Region-Set:us-east-1\nAuthorization:AWS4-ECDSA-P256-SHA256 Credential=AKIDEXAMPLE/20150830/service/aws4_request, SignedHeaders=host;x-amz-date;x-amz-region-set, Signature=304402206a228bcbe26141c2c5065525b98ea00b793470e04e655006269f740e320215930220160015e35502fa89a96f5fed59981af0896b60ecea6a68606a0be368bca73f2c\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-unreserved/header-string-to-sign.txt",
    "content": "AWS4-ECDSA-P256-SHA256\n20150830T123600Z\n20150830/service/aws4_request\nb48c0f7d7cdaa2cd05e4b789c913063becd96ccace5296a334c950040e58bcac"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-unreserved/public-key.json",
    "content": "{\n  \"X\":\"b6618f6a65740a99e650b33b6b4b5bd0d43b176d721a3edfea7e7d2d56d936b1\",\n  \"Y\":\"865ed22a7eadc9c5cb9d2cbaca1b3699139fedc5043dc6661864218330c8e518\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-unreserved/query-canonical-request.txt",
    "content": "GET\n/-._~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\nX-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host\nhost:example.amazonaws.com\n\nhost\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-unreserved/query-signature.txt",
    "content": "3045022100a8e6e2918ceb211f77810150d828be217af238ca95db6f88264d668ffacefb8b02204122d651c775a3ed8f40f3bfe37a2c8fec28cd53027b599eddd7115e06ca4bb0"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-unreserved/query-signed-request.txt",
    "content": "GET /-._~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz?X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-Signature=3046022100e9480cf54bfa566c6225af6986818e36a79525af244316551c55f902494d774f0221008f15178ec18c589b3704ccfc9cd7daa410f148407f75bc5777afcca28470cfbb HTTP/1.1\nHost:example.amazonaws.com\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-unreserved/query-string-to-sign.txt",
    "content": "AWS4-ECDSA-P256-SHA256\n20150830T123600Z\n20150830/service/aws4_request\na967a5035e5dc574f94fb9f0de0faf9d56e889c26d9a65d7d0a15d89690280d1"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-unreserved/request.txt",
    "content": "GET /-._~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz HTTP/1.1\nHost:example.amazonaws.com\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-utf8/context.json",
    "content": "{\n    \"credentials\": {\n        \"access_key_id\": \"AKIDEXAMPLE\",\n        \"secret_access_key\": \"wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY\"\n    },\n    \"expiration_in_seconds\": 3600,\n    \"normalize\": true,\n    \"region\": \"us-east-1\",\n    \"service\": \"service\",\n    \"sign_body\": false,\n    \"timestamp\": \"2015-08-30T12:36:00Z\"\n}"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-utf8/header-canonical-request.txt",
    "content": "GET\n/%E1%88%B4\n\nhost:example.amazonaws.com\nx-amz-date:20150830T123600Z\nx-amz-region-set:us-east-1\n\nhost;x-amz-date;x-amz-region-set\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-utf8/header-signature.txt",
    "content": "3044022009b73628ce2929e224b781c591bdc93fc3381cef5f63992eefb82a286276fa0902203cbc6071d1be7b8c91ec0a04b921881c48cbea2a0a86481f6fa7a983e36190c0"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-utf8/header-signed-request.txt",
    "content": "GET /ሴ HTTP/1.1\nHost:example.amazonaws.com\nX-Amz-Date:20150830T123600Z\nX-Amz-Region-Set:us-east-1\nAuthorization:AWS4-ECDSA-P256-SHA256 Credential=AKIDEXAMPLE/20150830/service/aws4_request, SignedHeaders=host;x-amz-date;x-amz-region-set, Signature=304502210082c462efc22f340d7d20b19e0c9b38400e9395bedd9269e01e959ef915ca2846022050d38df1572786ef8befe01d888335c15b0f17fb1d795858fa3cb79e060ba375\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-utf8/header-string-to-sign.txt",
    "content": "AWS4-ECDSA-P256-SHA256\n20150830T123600Z\n20150830/service/aws4_request\n7c8a7084825e715f0e217a7470ce3611bcfedb5b70329d9b36bba5cefd39c11a"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-utf8/public-key.json",
    "content": "{\n  \"X\":\"b6618f6a65740a99e650b33b6b4b5bd0d43b176d721a3edfea7e7d2d56d936b1\",\n  \"Y\":\"865ed22a7eadc9c5cb9d2cbaca1b3699139fedc5043dc6661864218330c8e518\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-utf8/query-canonical-request.txt",
    "content": "GET\n/%E1%88%B4\nX-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host\nhost:example.amazonaws.com\n\nhost\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-utf8/query-signature.txt",
    "content": "30460221008cf2ac3d46b7529fe7b73add56626a546fc9372b458e197dbd355198465e0918022100c059b86e01bd11d31c5fe19ee7c73fe3b8058ad2cebe2fe74c779c4a6a95684a"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-utf8/query-signed-request.txt",
    "content": "GET /ሴ?X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-Signature=3045022100a6a54a9d29f463be9ee0822246866fdbf4d71ab2f0c1dd70da52bd3d4539ce6802204fb18b4ddab0e97af74ecb42e33d6d2f2ac2ae0cee9509f649506f1cd2954899 HTTP/1.1\nHost:example.amazonaws.com\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-utf8/query-string-to-sign.txt",
    "content": "AWS4-ECDSA-P256-SHA256\n20150830T123600Z\n20150830/service/aws4_request\nb77c78c8276c5eac930db70b21b69b34d0c2560e1a963ab28e28481ef6a4ff66"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-utf8/request.txt",
    "content": "GET /ሴ HTTP/1.1\nHost:example.amazonaws.com\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla/canonical-request.txt",
    "content": "GET\n/\n\nhost:example.amazonaws.com\nx-amz-date:20150830T123600Z\nx-amz-region-set:us-east-1\n\nhost;x-amz-date;x-amz-region-set\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla/context.json",
    "content": "{\n    \"credentials\": {\n        \"access_key_id\": \"AKIDEXAMPLE\",\n        \"secret_access_key\": \"wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY\"\n    },\n    \"expiration_in_seconds\": 3600,\n    \"normalize\": true,\n    \"region\": \"us-east-1\",\n    \"service\": \"service\",\n    \"sign_body\": false,\n    \"timestamp\": \"2015-08-30T12:36:00Z\"\n}"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla/header-canonical-request.txt",
    "content": "GET\n/\n\nhost:example.amazonaws.com\nx-amz-date:20150830T123600Z\nx-amz-region-set:us-east-1\n\nhost;x-amz-date;x-amz-region-set\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla/header-signature.txt",
    "content": "3045022018b4e277d0281864beb51d3600e23f88510ea5031d68ddfbb68614b82a5eb7d2022100effb9c5f22ed9ef3ae0ab243d21f06bce82365bbb79529a07b6888c343ae5f8c"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla/header-signed-request.txt",
    "content": "GET / HTTP/1.1\nHost:example.amazonaws.com\nX-Amz-Date:20150830T123600Z\nX-Amz-Region-Set:us-east-1\nAuthorization:AWS4-ECDSA-P256-SHA256 Credential=AKIDEXAMPLE/20150830/service/aws4_request, SignedHeaders=host;x-amz-date;x-amz-region-set, Signature=3046022100fddaaf816a31e30d04973875b13bc27b98da10907a3a1872fd5819a221334abc022100de2ee81d83b54f31efc82834de07e6cd4d5c6f25bfa08e0f29a15bb0977c343e\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla/header-string-to-sign.txt",
    "content": "AWS4-ECDSA-P256-SHA256\n20150830T123600Z\n20150830/service/aws4_request\ncf59db423e841c8b7e3444158185aa261b724a5c27cbe762676f3eed19f4dc02"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla/public-key.json",
    "content": "{\n  \"X\":\"b6618f6a65740a99e650b33b6b4b5bd0d43b176d721a3edfea7e7d2d56d936b1\",\n  \"Y\":\"865ed22a7eadc9c5cb9d2cbaca1b3699139fedc5043dc6661864218330c8e518\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla/query-canonical-request.txt",
    "content": "GET\n/\nX-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host\nhost:example.amazonaws.com\n\nhost\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla/query-signature.txt",
    "content": "3045022100b3246f8e1442dd58e73292ae1294720c3256ee58f6cea50f3a3f83b4a4b0331a0220329693f7745c9008a5887c0529ceccb0fae4e16d707b712ea66acdbaf963769a"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla/query-signed-request.txt",
    "content": "GET /?X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-Signature=3045022100a28466db6c76223d5aa6ed436a8451b30e21ba0a076e7f2f943dd1f3d2816249022049e4b3746929cd2a2cb7b7984dbe0f5d40a300e7d9a7a7f1307c196b6f96b61a HTTP/1.1\nHost:example.amazonaws.com\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla/query-string-to-sign.txt",
    "content": "AWS4-ECDSA-P256-SHA256\n20150830T123600Z\n20150830/service/aws4_request\n890c4ed28c1a1ac10b5862719b537afbe392e987dc1aab1efa16fe7de41d3c81"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla/request.txt",
    "content": "GET / HTTP/1.1\nHost:example.amazonaws.com\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla/string-to-sign.txt",
    "content": "AWS4-ECDSA-P256-SHA256\n20150830T123600Z\n20150830/service/aws4_request\ncf59db423e841c8b7e3444158185aa261b724a5c27cbe762676f3eed19f4dc02"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla-empty-query-key/context.json",
    "content": "{\n    \"credentials\": {\n        \"access_key_id\": \"AKIDEXAMPLE\",\n        \"secret_access_key\": \"wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY\"\n    },\n    \"expiration_in_seconds\": 3600,\n    \"normalize\": true,\n    \"region\": \"us-east-1\",\n    \"service\": \"service\",\n    \"sign_body\": false,\n    \"timestamp\": \"2015-08-30T12:36:00Z\"\n}"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla-empty-query-key/header-canonical-request.txt",
    "content": "GET\n/\nParam1=value1\nhost:example.amazonaws.com\nx-amz-date:20150830T123600Z\nx-amz-region-set:us-east-1\n\nhost;x-amz-date;x-amz-region-set\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla-empty-query-key/header-signature.txt",
    "content": "3044022075e5fe54105695e4af6f5b59ff39f4f1d84de3bfdd546a6b9212936a78e743ac02204f25f3b9826688eb9743088f426eabd6b306432fd2c4c5c5aa2bbb9058267542"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla-empty-query-key/header-signed-request.txt",
    "content": "GET /?Param1=value1 HTTP/1.1\nHost:example.amazonaws.com\nX-Amz-Date:20150830T123600Z\nX-Amz-Region-Set:us-east-1\nAuthorization:AWS4-ECDSA-P256-SHA256 Credential=AKIDEXAMPLE/20150830/service/aws4_request, SignedHeaders=host;x-amz-date;x-amz-region-set, Signature=304502210093d40fe05684ddadfadfafc4b8565d18ca94d590fc897577224bf09696bbde6102206f12bb5e2503781303cf6880c0a2136d4b820221eb9d6ac5ad61378b16b8ea5d\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla-empty-query-key/header-string-to-sign.txt",
    "content": "AWS4-ECDSA-P256-SHA256\n20150830T123600Z\n20150830/service/aws4_request\n894f4237e92aae973c992da1d1f39d7a5913a23e9f7cbcf085e9550685eb498a"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla-empty-query-key/public-key.json",
    "content": "{\n  \"X\":\"b6618f6a65740a99e650b33b6b4b5bd0d43b176d721a3edfea7e7d2d56d936b1\",\n  \"Y\":\"865ed22a7eadc9c5cb9d2cbaca1b3699139fedc5043dc6661864218330c8e518\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla-empty-query-key/query-canonical-request.txt",
    "content": "GET\n/\nParam1=value1&X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host\nhost:example.amazonaws.com\n\nhost\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla-empty-query-key/query-signature.txt",
    "content": "30460221009a9e99aefe8effed47320e6e9f54cb943e2f72ce638ed7aae2a6711240304b82022100a90e99f053dd51912a6993299229e19aebbd81e68d4d24a1bdedcc6717c9f456"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla-empty-query-key/query-signed-request.txt",
    "content": "GET /?Param1=value1&X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-Signature=3046022100d0e421c8dcfbc809d91211cb4588940f6567729d5f9542803c4121704ec85bf70221009bc7b39b796dc0b4436a08d0320e2e89a2a47724432a1060029a55ae05dc2e83 HTTP/1.1\nHost:example.amazonaws.com\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla-empty-query-key/query-string-to-sign.txt",
    "content": "AWS4-ECDSA-P256-SHA256\n20150830T123600Z\n20150830/service/aws4_request\n07551f1d699afeb50d6811a527ab7b0270b60448ea27d8cbccb9750d68287b3f"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla-empty-query-key/request.txt",
    "content": "GET /?Param1=value1 HTTP/1.1\nHost:example.amazonaws.com\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla-query/context.json",
    "content": "{\n    \"credentials\": {\n        \"access_key_id\": \"AKIDEXAMPLE\",\n        \"secret_access_key\": \"wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY\"\n    },\n    \"expiration_in_seconds\": 3600,\n    \"normalize\": true,\n    \"region\": \"us-east-1\",\n    \"service\": \"service\",\n    \"sign_body\": false,\n    \"timestamp\": \"2015-08-30T12:36:00Z\"\n}"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla-query/header-canonical-request.txt",
    "content": "GET\n/\n\nhost:example.amazonaws.com\nx-amz-date:20150830T123600Z\nx-amz-region-set:us-east-1\n\nhost;x-amz-date;x-amz-region-set\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla-query/header-signature.txt",
    "content": "304402202f36c5363f01990fac07fb18efd255fb82fa3807a8a84946f0b5ac2b71ac96f5022068a86869075a8ca0fe4f875f6a07af6df16538f156dba648c9a96b7c3d687924"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla-query/header-signed-request.txt",
    "content": "GET / HTTP/1.1\nHost:example.amazonaws.com\nX-Amz-Date:20150830T123600Z\nX-Amz-Region-Set:us-east-1\nAuthorization:AWS4-ECDSA-P256-SHA256 Credential=AKIDEXAMPLE/20150830/service/aws4_request, SignedHeaders=host;x-amz-date;x-amz-region-set, Signature=304502201f8540fba7741deef60d162a2cf5a8abece28db296174e82420ae6790d93b8af022100d3109ac9ec7995b9e976efa2c54b278d3fab0737e3c73483771773d2061d8f3f\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla-query/header-string-to-sign.txt",
    "content": "AWS4-ECDSA-P256-SHA256\n20150830T123600Z\n20150830/service/aws4_request\ncf59db423e841c8b7e3444158185aa261b724a5c27cbe762676f3eed19f4dc02"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla-query/public-key.json",
    "content": "{\n  \"X\":\"b6618f6a65740a99e650b33b6b4b5bd0d43b176d721a3edfea7e7d2d56d936b1\",\n  \"Y\":\"865ed22a7eadc9c5cb9d2cbaca1b3699139fedc5043dc6661864218330c8e518\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla-query/query-canonical-request.txt",
    "content": "GET\n/\nX-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host\nhost:example.amazonaws.com\n\nhost\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla-query/query-signature.txt",
    "content": "304402203840161a4739cd19b33c2186657554e140b84ce1fe9021074f154410b97ffad002200606f4430d72826616b2cd47590fcee42bbf23cb0287458389a43f9e6edd897d"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla-query/query-signed-request.txt",
    "content": "GET /?X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-Signature=304502210081f33b59ccf8c4a729d3e3f6ac355cfb6bb0f9c507b180ed7eb2756202cfe220022074f44519d0f1da1d20737fec456ac86aa876379e4531633c14972b88bc268eb7 HTTP/1.1\nHost:example.amazonaws.com\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla-query/query-string-to-sign.txt",
    "content": "AWS4-ECDSA-P256-SHA256\n20150830T123600Z\n20150830/service/aws4_request\n890c4ed28c1a1ac10b5862719b537afbe392e987dc1aab1efa16fe7de41d3c81"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla-query/request.txt",
    "content": "GET / HTTP/1.1\nHost:example.amazonaws.com\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla-query-order-encoded/context.json",
    "content": "{\n    \"credentials\": {\n        \"access_key_id\": \"AKIDEXAMPLE\",\n        \"secret_access_key\": \"wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY\"\n    },\n    \"expiration_in_seconds\": 3600,\n    \"normalize\": true,\n    \"region\": \"us-east-1\",\n    \"service\": \"service\",\n    \"sign_body\": false,\n    \"timestamp\": \"2015-08-30T12:36:00Z\"\n}"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla-query-order-encoded/header-canonical-request.txt",
    "content": "GET\n/\n%E1%88%B4=Value1&Param=Value2&Param-3=Value3\nhost:example.amazonaws.com\nx-amz-date:20150830T123600Z\nx-amz-region-set:us-east-1\n\nhost;x-amz-date;x-amz-region-set\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla-query-order-encoded/header-signature.txt",
    "content": "304402201c9d8aa856d87542e2fc29ccb3841bf604d7582a8ab2ca8e6c9e21c98693f35502207052f84ecd1dc8b6468a536e9d1bdc990cf14bae8142c1cc945f15bcf0e87613"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla-query-order-encoded/header-signed-request.txt",
    "content": "GET /?Param-3=Value3&Param=Value2&%E1%88%B4=Value1 HTTP/1.1\nHost:example.amazonaws.com\nX-Amz-Date:20150830T123600Z\nX-Amz-Region-Set:us-east-1\nAuthorization:AWS4-ECDSA-P256-SHA256 Credential=AKIDEXAMPLE/20150830/service/aws4_request, SignedHeaders=host;x-amz-date;x-amz-region-set, Signature=3045022100cef3137947f52af13fe5591d4ddcff0260176e7b2a668b43ac8f0cba2e489fe502203b4fe53c9fe3e8925643fe0e4c3ec0b3ea6262917bf7300d2e2abb399078e6de\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla-query-order-encoded/header-string-to-sign.txt",
    "content": "AWS4-ECDSA-P256-SHA256\n20150830T123600Z\n20150830/service/aws4_request\n55568a29040b287c72015a5ab482d9aaceeb1e9881f3bc946378bc3d6079f6a5"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla-query-order-encoded/public-key.json",
    "content": "{\n  \"X\":\"b6618f6a65740a99e650b33b6b4b5bd0d43b176d721a3edfea7e7d2d56d936b1\",\n  \"Y\":\"865ed22a7eadc9c5cb9d2cbaca1b3699139fedc5043dc6661864218330c8e518\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla-query-order-encoded/query-canonical-request.txt",
    "content": "GET\n/\n%E1%88%B4=Value1&Param=Value2&Param-3=Value3&X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host\nhost:example.amazonaws.com\n\nhost\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla-query-order-encoded/query-signature.txt",
    "content": "3046022100dcc853d7fbd59ceebd1ac57d404b979a7252cf88c79dcc6d58167902750235fd022100ffa98128e35b03aa434287165980f78533e9e6dfc80373cea82b047f4f0554ee"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla-query-order-encoded/query-signed-request.txt",
    "content": "GET /?Param-3=Value3&Param=Value2&%E1%88%B4=Value1&X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-Signature=3046022100a1244805f7fd13f1c5f4824fe85052857f2c5b6820829562e3853715966a4f7102210091a4e9e79fd79fc7d4d580061730822d3228d15d584b7c5c16a4c490690740c5 HTTP/1.1\nHost:example.amazonaws.com\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla-query-order-encoded/query-string-to-sign.txt",
    "content": "AWS4-ECDSA-P256-SHA256\n20150830T123600Z\n20150830/service/aws4_request\n56d9ab07692614338f2aa44f1018ad4102b19305fba8b83383d2d7c6ca816614"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla-query-order-encoded/request.txt",
    "content": "GET /?Param-3=Value3&Param=Value2&%E1%88%B4=Value1 HTTP/1.1\nHost:example.amazonaws.com\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla-query-order-key-case/context.json",
    "content": "{\n    \"credentials\": {\n        \"access_key_id\": \"AKIDEXAMPLE\",\n        \"secret_access_key\": \"wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY\"\n    },\n    \"expiration_in_seconds\": 3600,\n    \"normalize\": true,\n    \"region\": \"us-east-1\",\n    \"service\": \"service\",\n    \"sign_body\": false,\n    \"timestamp\": \"2015-08-30T12:36:00Z\"\n}"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla-query-order-key-case/header-canonical-request.txt",
    "content": "GET\n/\nParam1=value1&Param2=value2\nhost:example.amazonaws.com\nx-amz-date:20150830T123600Z\nx-amz-region-set:us-east-1\n\nhost;x-amz-date;x-amz-region-set\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla-query-order-key-case/header-signature.txt",
    "content": "3045022100b342b0d62487d235a5baf82e970102670a8d7af34c61f086125d204a90724d9e022070304e846de3de228c57e528b61f4addfdb5fa788a8a452e483c6a286d8803f5"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla-query-order-key-case/header-signed-request.txt",
    "content": "GET /?Param2=value2&Param1=value1 HTTP/1.1\nHost:example.amazonaws.com\nX-Amz-Date:20150830T123600Z\nX-Amz-Region-Set:us-east-1\nAuthorization:AWS4-ECDSA-P256-SHA256 Credential=AKIDEXAMPLE/20150830/service/aws4_request, SignedHeaders=host;x-amz-date;x-amz-region-set, Signature=30450220394fa0699225f403514cb4db03b7c479f64c5f9864bf520b871bb23a054d6517022100d4445c909fc62a43c6c485a8582621e0e14c6ef1e4218072bc2dcaffc1188f18\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla-query-order-key-case/header-string-to-sign.txt",
    "content": "AWS4-ECDSA-P256-SHA256\n20150830T123600Z\n20150830/service/aws4_request\ncc07b29e0d0f0b2d6aa296621a5608fd9c2271159b9b2f737f682704ebb96482"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla-query-order-key-case/public-key.json",
    "content": "{\n  \"X\":\"b6618f6a65740a99e650b33b6b4b5bd0d43b176d721a3edfea7e7d2d56d936b1\",\n  \"Y\":\"865ed22a7eadc9c5cb9d2cbaca1b3699139fedc5043dc6661864218330c8e518\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla-query-order-key-case/query-canonical-request.txt",
    "content": "GET\n/\nParam1=value1&Param2=value2&X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host\nhost:example.amazonaws.com\n\nhost\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla-query-order-key-case/query-signature.txt",
    "content": "304402207c976c47b1bcf7333ad10fcf78498bb14a368a6cd8f58703d47c9e91c4468c13022059a3715bafae9410271bf3355ccd0bbc622fe90f3c0168203d83323297789de5"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla-query-order-key-case/query-signed-request.txt",
    "content": "GET /?Param2=value2&Param1=value1&X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-Signature=304402202cbada4314f8da2b9dfa447db936428ad13f522f007110427e5c6c4dbf93762f02205ad19e24495835a7242c546eeec3dbdfcd538361fd9a67f99610a8adab3411e9 HTTP/1.1\nHost:example.amazonaws.com\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla-query-order-key-case/query-string-to-sign.txt",
    "content": "AWS4-ECDSA-P256-SHA256\n20150830T123600Z\n20150830/service/aws4_request\nc688584c3dbae2868c4911c825239f2c9375e66b9962f21db60b9b2fcd75bf45"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla-query-order-key-case/request.txt",
    "content": "GET /?Param2=value2&Param1=value1 HTTP/1.1\nHost:example.amazonaws.com\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla-query-unreserved/context.json",
    "content": "{\n    \"credentials\": {\n        \"access_key_id\": \"AKIDEXAMPLE\",\n        \"secret_access_key\": \"wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY\"\n    },\n    \"expiration_in_seconds\": 3600,\n    \"normalize\": true,\n    \"region\": \"us-east-1\",\n    \"service\": \"service\",\n    \"sign_body\": false,\n    \"timestamp\": \"2015-08-30T12:36:00Z\"\n}"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla-query-unreserved/header-canonical-request.txt",
    "content": "GET\n/\n-._~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz=-._~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\nhost:example.amazonaws.com\nx-amz-date:20150830T123600Z\nx-amz-region-set:us-east-1\n\nhost;x-amz-date;x-amz-region-set\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla-query-unreserved/header-signature.txt",
    "content": "3045022100ce7ae9d07bea650598803710644006d47de14a884d0777abd71ccf76164a36c70220256f34ad94c5cb1291a05f7680c2a0068c51d2a31a4e2fe2100d4a58197565ed"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla-query-unreserved/header-signed-request.txt",
    "content": "GET /?-._~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz=-._~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz HTTP/1.1\nHost:example.amazonaws.com\nX-Amz-Date:20150830T123600Z\nX-Amz-Region-Set:us-east-1\nAuthorization:AWS4-ECDSA-P256-SHA256 Credential=AKIDEXAMPLE/20150830/service/aws4_request, SignedHeaders=host;x-amz-date;x-amz-region-set, Signature=30450220023b0ce37b4e3f7fe6b6e155dab72846b461d22ff4820f019a07afef476f61ee022100f985e993037270cc48ac905b360046d077770a2b28aa829ea909430b1b3ed8aa\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla-query-unreserved/header-string-to-sign.txt",
    "content": "AWS4-ECDSA-P256-SHA256\n20150830T123600Z\n20150830/service/aws4_request\n377b8a3e195894659b84cd1c475dc8a3663a663360a349430c0c3b82bd82b77b"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla-query-unreserved/public-key.json",
    "content": "{\n  \"X\":\"b6618f6a65740a99e650b33b6b4b5bd0d43b176d721a3edfea7e7d2d56d936b1\",\n  \"Y\":\"865ed22a7eadc9c5cb9d2cbaca1b3699139fedc5043dc6661864218330c8e518\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla-query-unreserved/query-canonical-request.txt",
    "content": "GET\n/\n-._~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz=-._~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz&X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host\nhost:example.amazonaws.com\n\nhost\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla-query-unreserved/query-signature.txt",
    "content": "30450220720698c40b04f1a2e1f94e91ed9a59f8b2a2e70cb55e6dd245d0aec039cad6ea022100b2076666b780735e1ddabf773f141ff49f8df3686ffb6c4c7798ba22470e3819"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla-query-unreserved/query-signed-request.txt",
    "content": "GET /?-._~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz=-._~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz&X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-Signature=3046022100fa0918db3b6088ebabc41b614c1e60820cf46a58a5e939bf27ab43869e60133e022100f2b594597c9f6266cae0f17de30e2776827431f7cb63224530cf7718f38df0b0 HTTP/1.1\nHost:example.amazonaws.com\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla-query-unreserved/query-string-to-sign.txt",
    "content": "AWS4-ECDSA-P256-SHA256\n20150830T123600Z\n20150830/service/aws4_request\n5d8923c620c699f856a35a6eb8dd786fd4c8c6ab0a35c552caeb5b648989433f"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla-query-unreserved/request.txt",
    "content": "GET /?-._~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz=-._~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz HTTP/1.1\nHost:example.amazonaws.com\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla-utf8-query/context.json",
    "content": "{\n    \"credentials\": {\n        \"access_key_id\": \"AKIDEXAMPLE\",\n        \"secret_access_key\": \"wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY\"\n    },\n    \"expiration_in_seconds\": 3600,\n    \"normalize\": true,\n    \"region\": \"us-east-1\",\n    \"service\": \"service\",\n    \"sign_body\": false,\n    \"timestamp\": \"2015-08-30T12:36:00Z\"\n}"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla-utf8-query/header-canonical-request.txt",
    "content": "GET\n/\n%E1%88%B4=bar\nhost:example.amazonaws.com\nx-amz-date:20150830T123600Z\nx-amz-region-set:us-east-1\n\nhost;x-amz-date;x-amz-region-set\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla-utf8-query/header-signature.txt",
    "content": "3046022100b47fe24b090d857f34597a58a4e8acd0ea9639462e606af7e1fa1e2c3fae1d630221008ce7f870adf7d2c06f299da0c9870402b027c6a50ff027881655a664ff294cc3"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla-utf8-query/header-signed-request.txt",
    "content": "GET /?ሴ=bar HTTP/1.1\nHost:example.amazonaws.com\nX-Amz-Date:20150830T123600Z\nX-Amz-Region-Set:us-east-1\nAuthorization:AWS4-ECDSA-P256-SHA256 Credential=AKIDEXAMPLE/20150830/service/aws4_request, SignedHeaders=host;x-amz-date;x-amz-region-set, Signature=304502206e0b9d70bb0413a557946314e04739d721c9f301d452c072590edfdcb9320572022100846f242fb0346c8c56c76a6f0e70c521d7ac02742f09c2e7b5253f1e9afe5a44\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla-utf8-query/header-string-to-sign.txt",
    "content": "AWS4-ECDSA-P256-SHA256\n20150830T123600Z\n20150830/service/aws4_request\nb27131d754045e85823698b1fe3fc9694c17b16d97f4c43cef2359a1233c7b76"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla-utf8-query/public-key.json",
    "content": "{\n  \"X\":\"b6618f6a65740a99e650b33b6b4b5bd0d43b176d721a3edfea7e7d2d56d936b1\",\n  \"Y\":\"865ed22a7eadc9c5cb9d2cbaca1b3699139fedc5043dc6661864218330c8e518\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla-utf8-query/query-canonical-request.txt",
    "content": "GET\n/\n%E1%88%B4=bar&X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host\nhost:example.amazonaws.com\n\nhost\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla-utf8-query/query-signature.txt",
    "content": "3044022076d8b03a19db63abc106c50f13487d5363f1eac2c77bc4eda764eadba8f84c6502205c0aa76554ba223a97958be9ff34aca35d84cb7b8c7ba698793ead9e6788e241"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla-utf8-query/query-signed-request.txt",
    "content": "GET /?ሴ=bar&X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-Signature=3046022100d0001873de6d6746a050e3dff894b0fbccce0bbe7fad8e4c0960761d053a695b022100fb8f5d77ebb1854be7a8e1ea56428aba3a2f3bf23211e1049a2fa18b56784b63 HTTP/1.1\nHost:example.amazonaws.com\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla-utf8-query/query-string-to-sign.txt",
    "content": "AWS4-ECDSA-P256-SHA256\n20150830T123600Z\n20150830/service/aws4_request\ne22d57192c68232f914afff959b8aa1027756098f879c7d4d7615a2469f85c1f"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla-utf8-query/request.txt",
    "content": "GET /?ሴ=bar HTTP/1.1\nHost:example.amazonaws.com\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla-with-session-token/context.json",
    "content": "{\n    \"credentials\": {\n        \"access_key_id\": \"AKIDEXAMPLE\",\n        \"secret_access_key\": \"wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY\",\n        \"token\": \"6e86291e8372ff2a2260956d9b8aae1d763fbf315fa00fa31553b73ebf194267\"\n    },\n    \"expiration_in_seconds\": 3600,\n    \"normalize\": true,\n    \"region\": \"us-east-1\",\n    \"service\": \"service\",\n    \"sign_body\": false,\n    \"timestamp\": \"2015-08-30T12:36:00Z\"\n}"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla-with-session-token/header-canonical-request.txt",
    "content": "GET\n/\n\nhost:example.amazonaws.com\nx-amz-date:20150830T123600Z\nx-amz-region-set:us-east-1\nx-amz-security-token:6e86291e8372ff2a2260956d9b8aae1d763fbf315fa00fa31553b73ebf194267\n\nhost;x-amz-date;x-amz-region-set;x-amz-security-token\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla-with-session-token/header-signature.txt",
    "content": "3044022035c6bc9a8cab8a434bd8bd1cc3b6f1401842f530f1537722ad10d72a1577f8c80220101352fe0720715efbab80f82edb133175f0b61cad85daf943ad615852f9ae10"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla-with-session-token/header-signed-request.txt",
    "content": "GET / HTTP/1.1\nHost:example.amazonaws.com\nX-Amz-Security-Token:6e86291e8372ff2a2260956d9b8aae1d763fbf315fa00fa31553b73ebf194267\nX-Amz-Date:20150830T123600Z\nX-Amz-Region-Set:us-east-1\nAuthorization:AWS4-ECDSA-P256-SHA256 Credential=AKIDEXAMPLE/20150830/service/aws4_request, SignedHeaders=host;x-amz-date;x-amz-region-set;x-amz-security-token, Signature=30450221008f4516c8850ed9eb29502658d1f0e0f6cabc11a44963c558efd1dd8e9fb084a0022032e47df89ad1a5b4e2b82d3a68dbe31d6ef8e1ea8c3815b2097538c4695d184e\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla-with-session-token/header-string-to-sign.txt",
    "content": "AWS4-ECDSA-P256-SHA256\n20150830T123600Z\n20150830/service/aws4_request\n79893373104239a0547df489af395ec3c1b8873a8601f07f11ffd3f1ac557e7d"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla-with-session-token/public-key.json",
    "content": "{\n  \"X\":\"b6618f6a65740a99e650b33b6b4b5bd0d43b176d721a3edfea7e7d2d56d936b1\",\n  \"Y\":\"865ed22a7eadc9c5cb9d2cbaca1b3699139fedc5043dc6661864218330c8e518\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla-with-session-token/query-canonical-request.txt",
    "content": "GET\n/\nX-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-Security-Token=6e86291e8372ff2a2260956d9b8aae1d763fbf315fa00fa31553b73ebf194267&X-Amz-SignedHeaders=host\nhost:example.amazonaws.com\n\nhost\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla-with-session-token/query-signature.txt",
    "content": "3046022100d51f7ae1ac1b6b3db6c40f69aafb4306f81cdd2d87a85f69b2c4cb8fd057cf21022100cdb787a698c3f53d961f5b6279a0ff246097f50c874bcbf7a249bf4c0f118fb3"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla-with-session-token/query-signed-request.txt",
    "content": "GET /?X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Security-Token=6e86291e8372ff2a2260956d9b8aae1d763fbf315fa00fa31553b73ebf194267&X-Amz-Region-Set=us-east-1&X-Amz-Signature=304502207cdbb61908b9d4cf6c84e03ff7dac10a9a4637784d335a7d8bf1d1a6931bc3ba022100ee78b054e5441b71ab155632174df6b68bdaa00eabf939bf0c7299e1367e02a4 HTTP/1.1\nHost:example.amazonaws.com\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla-with-session-token/query-string-to-sign.txt",
    "content": "AWS4-ECDSA-P256-SHA256\n20150830T123600Z\n20150830/service/aws4_request\n496062b4c2ed2175fe08ad084158783fa8d013c694542af721d49b25d1ebd390"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/get-vanilla-with-session-token/request.txt",
    "content": "GET / HTTP/1.1\nHost:example.amazonaws.com\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-header-key-case/context.json",
    "content": "{\n    \"credentials\": {\n        \"access_key_id\": \"AKIDEXAMPLE\",\n        \"secret_access_key\": \"wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY\"\n    },\n    \"expiration_in_seconds\": 3600,\n    \"normalize\": true,\n    \"region\": \"us-east-1\",\n    \"service\": \"service\",\n    \"sign_body\": false,\n    \"timestamp\": \"2015-08-30T12:36:00Z\"\n}"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-header-key-case/header-canonical-request.txt",
    "content": "POST\n/\n\nhost:example.amazonaws.com\nx-amz-date:20150830T123600Z\nx-amz-region-set:us-east-1\n\nhost;x-amz-date;x-amz-region-set\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-header-key-case/header-signature.txt",
    "content": "3044022025397839d55c2147eead39170f5b1758c9f9fb4ccbcda4c8612a23df8e90c13d022079f5fc1377201691a11be43def8be12fe882e998589317508ff67b8dbe982722"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-header-key-case/header-signed-request.txt",
    "content": "POST / HTTP/1.1\nHost:example.amazonaws.com\nX-Amz-Date:20150830T123600Z\nX-Amz-Region-Set:us-east-1\nAuthorization:AWS4-ECDSA-P256-SHA256 Credential=AKIDEXAMPLE/20150830/service/aws4_request, SignedHeaders=host;x-amz-date;x-amz-region-set, Signature=304602210081bb2a93eae5cce843abe0e7cac2f0e4cecdd0a79cb8d60e5b9dc4c8e8906b61022100e18c8119f50b8218da995ada62080d88ff75d2f02309c3685a02dfb9a83b103f\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-header-key-case/header-string-to-sign.txt",
    "content": "AWS4-ECDSA-P256-SHA256\n20150830T123600Z\n20150830/service/aws4_request\n806a9b01b76472cc6b66fff02630726d55f8b4ada6d2fd9b36eb0d710e215861"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-header-key-case/public-key.json",
    "content": "{\n  \"X\":\"b6618f6a65740a99e650b33b6b4b5bd0d43b176d721a3edfea7e7d2d56d936b1\",\n  \"Y\":\"865ed22a7eadc9c5cb9d2cbaca1b3699139fedc5043dc6661864218330c8e518\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-header-key-case/query-canonical-request.txt",
    "content": "POST\n/\nX-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host\nhost:example.amazonaws.com\n\nhost\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-header-key-case/query-signature.txt",
    "content": "304402204afe4ce8de62e37853d0cb8a00f9601532fdeca89d6d8591c72d5bbf728bee2f02202feb0d8e680cab063e0c3c9090c0483f400511678ce83169ddce3e6d040f9ed8"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-header-key-case/query-signed-request.txt",
    "content": "POST /?X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-Signature=3044022100ebd5c442df864cd1fdd76e9d6e7548cac7ebaed57a93bcb3ac92af37ad5797fc021f1c4887de85feca28098f1dbab7fddaadb08a08564131881b0b5d151b4a2c77 HTTP/1.1\nHost:example.amazonaws.com\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-header-key-case/query-string-to-sign.txt",
    "content": "AWS4-ECDSA-P256-SHA256\n20150830T123600Z\n20150830/service/aws4_request\n192546340393592ef9baaa24656f55ed91288110e7514b50f0a3f79bb761a29c"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-header-key-case/request.txt",
    "content": "POST / HTTP/1.1\nHost:example.amazonaws.com\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-header-key-sort/context.json",
    "content": "{\n    \"credentials\": {\n        \"access_key_id\": \"AKIDEXAMPLE\",\n        \"secret_access_key\": \"wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY\"\n    },\n    \"expiration_in_seconds\": 3600,\n    \"normalize\": true,\n    \"region\": \"us-east-1\",\n    \"service\": \"service\",\n    \"sign_body\": false,\n    \"timestamp\": \"2015-08-30T12:36:00Z\"\n}"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-header-key-sort/header-canonical-request.txt",
    "content": "POST\n/\n\nhost:example.amazonaws.com\nmy-header1:value1\nx-amz-date:20150830T123600Z\nx-amz-region-set:us-east-1\n\nhost;my-header1;x-amz-date;x-amz-region-set\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-header-key-sort/header-signature.txt",
    "content": "304502210097752f8c9953078cbb6b370471cb7029aea9517d59fb835d8befce66a91e6c4a022043a8c62681ff76e6cbaaeaed2fff2fcfee8efceebb7bd9e562ecd5a08b2c563f"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-header-key-sort/header-signed-request.txt",
    "content": "POST / HTTP/1.1\nHost:example.amazonaws.com\nMy-Header1:value1\nX-Amz-Date:20150830T123600Z\nX-Amz-Region-Set:us-east-1\nAuthorization:AWS4-ECDSA-P256-SHA256 Credential=AKIDEXAMPLE/20150830/service/aws4_request, SignedHeaders=host;my-header1;x-amz-date;x-amz-region-set, Signature=3046022100a5dc03771b33997d8eeb15d639cb7bdef2aff78a4a59c7996070e5f94fe149780221009a732061539208209ba0ae6755bef956c258a0c0ac6a6916489486efde21cfeb\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-header-key-sort/header-string-to-sign.txt",
    "content": "AWS4-ECDSA-P256-SHA256\n20150830T123600Z\n20150830/service/aws4_request\nb92b1e85236a12f9d118f85fb6686c83b0e83fb3428f8d4da3cc9acb2851fcfa"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-header-key-sort/public-key.json",
    "content": "{\n  \"X\":\"b6618f6a65740a99e650b33b6b4b5bd0d43b176d721a3edfea7e7d2d56d936b1\",\n  \"Y\":\"865ed22a7eadc9c5cb9d2cbaca1b3699139fedc5043dc6661864218330c8e518\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-header-key-sort/query-canonical-request.txt",
    "content": "POST\n/\nX-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host%3Bmy-header1\nhost:example.amazonaws.com\nmy-header1:value1\n\nhost;my-header1\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-header-key-sort/query-signature.txt",
    "content": "304502204f2a31513c9bea5c92dd8045e226dc1db150f768e60b538cacce157c623873dc022100ab5d654ce3c7b917656cec2cf58a3689159e89deed5241ca21e19a40173674c4"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-header-key-sort/query-signed-request.txt",
    "content": "POST /?X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-SignedHeaders=host%3Bmy-header1&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-Signature=30450220398bbd17824da156cc02e783348c16e8c04d46d1ae6b31dec9422d8054193380022100f05d3e4f7ed4eed55e950488ed7c53975cdbb4713ec4a2c0af9351ab8fdc9a48 HTTP/1.1\nHost:example.amazonaws.com\nMy-Header1:value1\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-header-key-sort/query-string-to-sign.txt",
    "content": "AWS4-ECDSA-P256-SHA256\n20150830T123600Z\n20150830/service/aws4_request\n336638ab840d4785edc7db35ab9c036bc15ffb2dc1a4e05b04f3a7cd7407593f"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-header-key-sort/request.txt",
    "content": "POST / HTTP/1.1\nHost:example.amazonaws.com\nMy-Header1:value1\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-header-value-case/context.json",
    "content": "{\n    \"credentials\": {\n        \"access_key_id\": \"AKIDEXAMPLE\",\n        \"secret_access_key\": \"wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY\"\n    },\n    \"expiration_in_seconds\": 3600,\n    \"normalize\": true,\n    \"region\": \"us-east-1\",\n    \"service\": \"service\",\n    \"sign_body\": false,\n    \"timestamp\": \"2015-08-30T12:36:00Z\"\n}"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-header-value-case/header-canonical-request.txt",
    "content": "POST\n/\n\nhost:example.amazonaws.com\nmy-header1:VALUE1\nx-amz-date:20150830T123600Z\nx-amz-region-set:us-east-1\n\nhost;my-header1;x-amz-date;x-amz-region-set\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-header-value-case/header-signature.txt",
    "content": "304402207b3baf259f5d29f13511eb4c9b236045c43168ca70369ed639611f4bff9eb6490220465e922e8b19146de9c70147440f4ee80a3318f0c756c8050dbfd641e6ff0456"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-header-value-case/header-signed-request.txt",
    "content": "POST / HTTP/1.1\nHost:example.amazonaws.com\nMy-Header1:VALUE1\nX-Amz-Date:20150830T123600Z\nX-Amz-Region-Set:us-east-1\nAuthorization:AWS4-ECDSA-P256-SHA256 Credential=AKIDEXAMPLE/20150830/service/aws4_request, SignedHeaders=host;my-header1;x-amz-date;x-amz-region-set, Signature=3045022100c72dd4d54c45d3eb30858c6227e9512f41b7379b7c685e39e0cd39a793d7ee3102205c900d330270e31d2f7b5138fb3d791b6743f6f3b9ffbc34a4adcc8307591b11\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-header-value-case/header-string-to-sign.txt",
    "content": "AWS4-ECDSA-P256-SHA256\n20150830T123600Z\n20150830/service/aws4_request\n7de5a74bc45fb5c8a90faada2ab9538e69e4a5eb7f330f62387715669cecd492"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-header-value-case/public-key.json",
    "content": "{\n  \"X\":\"b6618f6a65740a99e650b33b6b4b5bd0d43b176d721a3edfea7e7d2d56d936b1\",\n  \"Y\":\"865ed22a7eadc9c5cb9d2cbaca1b3699139fedc5043dc6661864218330c8e518\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-header-value-case/query-canonical-request.txt",
    "content": "POST\n/\nX-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host%3Bmy-header1\nhost:example.amazonaws.com\nmy-header1:VALUE1\n\nhost;my-header1\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-header-value-case/query-signature.txt",
    "content": "30450221009895446cb62cfb2dbb5e943baa12cad86c9d903bcfdb400f7e24391566709d8002205a12b1179a7d3569a8dfbfb8c15d0ad2e5e816aff6b2ee0c3deaf0e89fcbea80"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-header-value-case/query-signed-request.txt",
    "content": "POST /?X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-SignedHeaders=host%3Bmy-header1&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-Signature=304402205ed45a0daa4ef3d554ea401f8d2e4f434c77dd8dfd4a15d08786faf9d6fdedf50220501f847d3159358f7823190dfffebaa16ce5b3868921c06b255f7dc3c742d9ff HTTP/1.1\nHost:example.amazonaws.com\nMy-Header1:VALUE1\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-header-value-case/query-string-to-sign.txt",
    "content": "AWS4-ECDSA-P256-SHA256\n20150830T123600Z\n20150830/service/aws4_request\n949fb555e05d3289760ff0f0566ad73a69ed865000d9843b93a15b916dbc8b6f"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-header-value-case/request.txt",
    "content": "POST / HTTP/1.1\nHost:example.amazonaws.com\nMy-Header1:VALUE1\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-sts-header-after/context.json",
    "content": "{\n    \"credentials\": {\n        \"access_key_id\": \"AKIDEXAMPLE\",\n        \"secret_access_key\": \"wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY\",\n        \"token\": \"AQoDYXdzEPT//////////wEXAMPLEtc764bNrC9SAPBSM22wDOk4x4HIZ8j4FZTwdQWLWsKWHGBuFqwAeMicRXmxfpSPfIeoIYRqTflfKD8YUuwthAx7mSEI/qkPpKPi/kMcGdQrmGdeehM4IC1NtBmUpp2wUE8phUZampKsburEDy0KPkyQDYwT7WZ0wq5VSXDvp75YU9HFvlRd8Tx6q6fE8YQcHNVXAkiY9q6d+xo0rKwT38xVqr7ZD0u0iPPkUL64lIZbqBAz+scqKmlzm8FDrypNC9Yjc8fPOLn9FX9KSYvKTr4rvx3iSIlTJabIQwj2ICCR/oLxBA==\"\n    },\n    \"expiration_in_seconds\": 3600,\n    \"normalize\": true,\n    \"region\": \"us-east-1\",\n    \"service\": \"service\",\n    \"sign_body\": false,\n    \"timestamp\": \"2015-08-30T12:36:00Z\",\n    \"omit_session_token\": true\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-sts-header-after/header-canonical-request.txt",
    "content": "POST\n/\n\nhost:example.amazonaws.com\nx-amz-date:20150830T123600Z\nx-amz-region-set:us-east-1\n\nhost;x-amz-date;x-amz-region-set\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-sts-header-after/header-signature.txt",
    "content": "3045022005936b1139f85e06856778dc6fefa39c534143129dca2e0a40d1c910d42f12f1022100b97f90927755775d36f57803214c2268a051914bbdab196c071ec24462f6baae"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-sts-header-after/header-signed-request.txt",
    "content": "POST / HTTP/1.1\nHost:example.amazonaws.com\nX-Amz-Security-Token:AQoDYXdzEPT//////////wEXAMPLEtc764bNrC9SAPBSM22wDOk4x4HIZ8j4FZTwdQWLWsKWHGBuFqwAeMicRXmxfpSPfIeoIYRqTflfKD8YUuwthAx7mSEI/qkPpKPi/kMcGdQrmGdeehM4IC1NtBmUpp2wUE8phUZampKsburEDy0KPkyQDYwT7WZ0wq5VSXDvp75YU9HFvlRd8Tx6q6fE8YQcHNVXAkiY9q6d+xo0rKwT38xVqr7ZD0u0iPPkUL64lIZbqBAz+scqKmlzm8FDrypNC9Yjc8fPOLn9FX9KSYvKTr4rvx3iSIlTJabIQwj2ICCR/oLxBA==\nX-Amz-Date:20150830T123600Z\nX-Amz-Region-Set:us-east-1\nAuthorization:AWS4-ECDSA-P256-SHA256 Credential=AKIDEXAMPLE/20150830/service/aws4_request, SignedHeaders=host;x-amz-date;x-amz-region-set, Signature=3045022100f7866e35aa214de4541aa33326aa9b5e9a409b72c9185c7a2e2d246ebb5a25a80220642e809f3d016fb3674364776c2ffadf7e7f8da94c36538a4715fa9425b52ed8\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-sts-header-after/header-string-to-sign.txt",
    "content": "AWS4-ECDSA-P256-SHA256\n20150830T123600Z\n20150830/service/aws4_request\n806a9b01b76472cc6b66fff02630726d55f8b4ada6d2fd9b36eb0d710e215861"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-sts-header-after/public-key.json",
    "content": "{\n  \"X\":\"b6618f6a65740a99e650b33b6b4b5bd0d43b176d721a3edfea7e7d2d56d936b1\",\n  \"Y\":\"865ed22a7eadc9c5cb9d2cbaca1b3699139fedc5043dc6661864218330c8e518\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-sts-header-after/query-canonical-request.txt",
    "content": "POST\n/\nX-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host\nhost:example.amazonaws.com\n\nhost\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-sts-header-after/query-signature.txt",
    "content": "3046022100f7c89084cbc2c276f6cbc02a6f6b353e2fb3538d02ed31f819324acf0f49cd0b022100823e6714c97899ea16d7f409989b250a911e6930112f8c73cf7d8c660bf2ed2f"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-sts-header-after/query-signed-request.txt",
    "content": "POST /?X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Security-Token=AQoDYXdzEPT%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEXAMPLEtc764bNrC9SAPBSM22wDOk4x4HIZ8j4FZTwdQWLWsKWHGBuFqwAeMicRXmxfpSPfIeoIYRqTflfKD8YUuwthAx7mSEI%2FqkPpKPi%2FkMcGdQrmGdeehM4IC1NtBmUpp2wUE8phUZampKsburEDy0KPkyQDYwT7WZ0wq5VSXDvp75YU9HFvlRd8Tx6q6fE8YQcHNVXAkiY9q6d%2Bxo0rKwT38xVqr7ZD0u0iPPkUL64lIZbqBAz%2BscqKmlzm8FDrypNC9Yjc8fPOLn9FX9KSYvKTr4rvx3iSIlTJabIQwj2ICCR%2FoLxBA%3D%3D&X-Amz-Region-Set=us-east-1&X-Amz-Signature=304402204360bb65fe763c79526141ae439e4198190b7ffc048551a63c60b428bebc4c43022064a9d5c1f476566aea41fa60adfadc952164c53460553b2d1ae161d2f9b665f7 HTTP/1.1\nHost:example.amazonaws.com\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-sts-header-after/query-string-to-sign.txt",
    "content": "AWS4-ECDSA-P256-SHA256\n20150830T123600Z\n20150830/service/aws4_request\n192546340393592ef9baaa24656f55ed91288110e7514b50f0a3f79bb761a29c"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-sts-header-after/request.txt",
    "content": "POST / HTTP/1.1\nHost:example.amazonaws.com\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-sts-header-before/context.json",
    "content": "{\n    \"credentials\": {\n        \"access_key_id\": \"AKIDEXAMPLE\",\n        \"secret_access_key\": \"wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY\",\n        \"token\": \"AQoDYXdzEPT//////////wEXAMPLEtc764bNrC9SAPBSM22wDOk4x4HIZ8j4FZTwdQWLWsKWHGBuFqwAeMicRXmxfpSPfIeoIYRqTflfKD8YUuwthAx7mSEI/qkPpKPi/kMcGdQrmGdeehM4IC1NtBmUpp2wUE8phUZampKsburEDy0KPkyQDYwT7WZ0wq5VSXDvp75YU9HFvlRd8Tx6q6fE8YQcHNVXAkiY9q6d+xo0rKwT38xVqr7ZD0u0iPPkUL64lIZbqBAz+scqKmlzm8FDrypNC9Yjc8fPOLn9FX9KSYvKTr4rvx3iSIlTJabIQwj2ICCR/oLxBA==\"\n    },\n    \"expiration_in_seconds\": 3600,\n    \"normalize\": true,\n    \"region\": \"us-east-1\",\n    \"service\": \"service\",\n    \"sign_body\": false,\n    \"timestamp\": \"2015-08-30T12:36:00Z\",\n    \"omit_session_token\": false\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-sts-header-before/header-canonical-request.txt",
    "content": "POST\n/\n\nhost:example.amazonaws.com\nx-amz-date:20150830T123600Z\nx-amz-region-set:us-east-1\nx-amz-security-token:AQoDYXdzEPT//////////wEXAMPLEtc764bNrC9SAPBSM22wDOk4x4HIZ8j4FZTwdQWLWsKWHGBuFqwAeMicRXmxfpSPfIeoIYRqTflfKD8YUuwthAx7mSEI/qkPpKPi/kMcGdQrmGdeehM4IC1NtBmUpp2wUE8phUZampKsburEDy0KPkyQDYwT7WZ0wq5VSXDvp75YU9HFvlRd8Tx6q6fE8YQcHNVXAkiY9q6d+xo0rKwT38xVqr7ZD0u0iPPkUL64lIZbqBAz+scqKmlzm8FDrypNC9Yjc8fPOLn9FX9KSYvKTr4rvx3iSIlTJabIQwj2ICCR/oLxBA==\n\nhost;x-amz-date;x-amz-region-set;x-amz-security-token\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-sts-header-before/header-signature.txt",
    "content": "30450221009cf93687a6055c287c68f881d4a907a6c99eef88b9c908e33e15740ec5a75e43022072df645db08e18ba4cd7436b3d67691792815a353d48113c7c444bb67c630e50"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-sts-header-before/header-signed-request.txt",
    "content": "POST / HTTP/1.1\nHost:example.amazonaws.com\nX-Amz-Security-Token:AQoDYXdzEPT//////////wEXAMPLEtc764bNrC9SAPBSM22wDOk4x4HIZ8j4FZTwdQWLWsKWHGBuFqwAeMicRXmxfpSPfIeoIYRqTflfKD8YUuwthAx7mSEI/qkPpKPi/kMcGdQrmGdeehM4IC1NtBmUpp2wUE8phUZampKsburEDy0KPkyQDYwT7WZ0wq5VSXDvp75YU9HFvlRd8Tx6q6fE8YQcHNVXAkiY9q6d+xo0rKwT38xVqr7ZD0u0iPPkUL64lIZbqBAz+scqKmlzm8FDrypNC9Yjc8fPOLn9FX9KSYvKTr4rvx3iSIlTJabIQwj2ICCR/oLxBA==\nX-Amz-Date:20150830T123600Z\nX-Amz-Region-Set:us-east-1\nAuthorization:AWS4-ECDSA-P256-SHA256 Credential=AKIDEXAMPLE/20150830/service/aws4_request, SignedHeaders=host;x-amz-date;x-amz-region-set;x-amz-security-token, Signature=3045022035115ac58fb923b0894e63eabf5864858c27f504b34bd707b569b2d6ee6a9c2e02210080ed7d2f3b7d52b4243890c596379ecd2066e9a1ac183d546ba07955ed5db306\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-sts-header-before/header-string-to-sign.txt",
    "content": "AWS4-ECDSA-P256-SHA256\n20150830T123600Z\n20150830/service/aws4_request\n964c15d46a67b327b877c02d680c81cb75df04e85144142e190da565ff0d029f"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-sts-header-before/public-key.json",
    "content": "{\n  \"X\":\"b6618f6a65740a99e650b33b6b4b5bd0d43b176d721a3edfea7e7d2d56d936b1\",\n  \"Y\":\"865ed22a7eadc9c5cb9d2cbaca1b3699139fedc5043dc6661864218330c8e518\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-sts-header-before/query-canonical-request.txt",
    "content": "POST\n/\nX-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-Security-Token=AQoDYXdzEPT%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEXAMPLEtc764bNrC9SAPBSM22wDOk4x4HIZ8j4FZTwdQWLWsKWHGBuFqwAeMicRXmxfpSPfIeoIYRqTflfKD8YUuwthAx7mSEI%2FqkPpKPi%2FkMcGdQrmGdeehM4IC1NtBmUpp2wUE8phUZampKsburEDy0KPkyQDYwT7WZ0wq5VSXDvp75YU9HFvlRd8Tx6q6fE8YQcHNVXAkiY9q6d%2Bxo0rKwT38xVqr7ZD0u0iPPkUL64lIZbqBAz%2BscqKmlzm8FDrypNC9Yjc8fPOLn9FX9KSYvKTr4rvx3iSIlTJabIQwj2ICCR%2FoLxBA%3D%3D&X-Amz-SignedHeaders=host\nhost:example.amazonaws.com\n\nhost\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-sts-header-before/query-signature.txt",
    "content": "304402203a4d2e9bd05ccf8b1e5834f2bb5ab81ea3b1dfbeb84388f07ab3b61ab519332a02204db83afae56ac4e713f631cd15268605d7b36119e672458d86df0cfcb68fe836"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-sts-header-before/query-signed-request.txt",
    "content": "POST /?X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Security-Token=AQoDYXdzEPT%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEXAMPLEtc764bNrC9SAPBSM22wDOk4x4HIZ8j4FZTwdQWLWsKWHGBuFqwAeMicRXmxfpSPfIeoIYRqTflfKD8YUuwthAx7mSEI%2FqkPpKPi%2FkMcGdQrmGdeehM4IC1NtBmUpp2wUE8phUZampKsburEDy0KPkyQDYwT7WZ0wq5VSXDvp75YU9HFvlRd8Tx6q6fE8YQcHNVXAkiY9q6d%2Bxo0rKwT38xVqr7ZD0u0iPPkUL64lIZbqBAz%2BscqKmlzm8FDrypNC9Yjc8fPOLn9FX9KSYvKTr4rvx3iSIlTJabIQwj2ICCR%2FoLxBA%3D%3D&X-Amz-Region-Set=us-east-1&X-Amz-Signature=304402207e41aee2d6ea2a3868b3dea7b04caeb14d23ee696a76b93467213cd18467cbf502202a05e108d8feb197a62b4ea4b8a9d11aa4dc92bcfaf6e5fe185efac4bafd0802 HTTP/1.1\nHost:example.amazonaws.com\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-sts-header-before/query-string-to-sign.txt",
    "content": "AWS4-ECDSA-P256-SHA256\n20150830T123600Z\n20150830/service/aws4_request\nc3a8ba26c461df46b5010b756fb8644fd922a2aea95d77b56295e5e4d3bb155f"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-sts-header-before/request.txt",
    "content": "POST / HTTP/1.1\nHost:example.amazonaws.com\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-vanilla/context.json",
    "content": "{\n    \"credentials\": {\n        \"access_key_id\": \"AKIDEXAMPLE\",\n        \"secret_access_key\": \"wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY\"\n    },\n    \"expiration_in_seconds\": 3600,\n    \"normalize\": true,\n    \"region\": \"us-east-1\",\n    \"service\": \"service\",\n    \"sign_body\": false,\n    \"timestamp\": \"2015-08-30T12:36:00Z\"\n}"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-vanilla/header-canonical-request.txt",
    "content": "POST\n/\n\nhost:example.amazonaws.com\nx-amz-date:20150830T123600Z\nx-amz-region-set:us-east-1\n\nhost;x-amz-date;x-amz-region-set\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-vanilla/header-signature.txt",
    "content": "3044022051fe398025aafbfc21d054bc78e5edfb96c9acb7fd272795565181d757815e4702202e7b8d2b92324290b1d95f8b0fc5e333bb8b5e333f6160bcab39d7258156d224"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-vanilla/header-signed-request.txt",
    "content": "POST / HTTP/1.1\nHost:example.amazonaws.com\nX-Amz-Date:20150830T123600Z\nX-Amz-Region-Set:us-east-1\nAuthorization:AWS4-ECDSA-P256-SHA256 Credential=AKIDEXAMPLE/20150830/service/aws4_request, SignedHeaders=host;x-amz-date;x-amz-region-set, Signature=3044022020e04d83be1fc4c7669eb2530c48444ff2ef65e73ab6d4084ba89b886b70d01a0220570df05bd3ba39ccd96a3e831ed8757fbb516baa603d78eaed3ccc95d50a2abb\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-vanilla/header-string-to-sign.txt",
    "content": "AWS4-ECDSA-P256-SHA256\n20150830T123600Z\n20150830/service/aws4_request\n806a9b01b76472cc6b66fff02630726d55f8b4ada6d2fd9b36eb0d710e215861"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-vanilla/public-key.json",
    "content": "{\n  \"X\":\"b6618f6a65740a99e650b33b6b4b5bd0d43b176d721a3edfea7e7d2d56d936b1\",\n  \"Y\":\"865ed22a7eadc9c5cb9d2cbaca1b3699139fedc5043dc6661864218330c8e518\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-vanilla/query-canonical-request.txt",
    "content": "POST\n/\nX-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host\nhost:example.amazonaws.com\n\nhost\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-vanilla/query-signature.txt",
    "content": "30440220158b75ce84ef2d97a0b287759f9104b9e093ef3a912a84bd78d30274d08c10c4022064fb9961da1d951aba42455df5752c3e3fa8055cd053b59ad53b140d54f6aafd"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-vanilla/query-signed-request.txt",
    "content": "POST /?X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-Signature=3044022034768b9f03c61ee7f93b1e23198ff08923345e32f25e662afa5794997f00ebb102205813497325d50d374e486a3fce997e02ae9610a8eb81af01128103dd9d2d997d HTTP/1.1\nHost:example.amazonaws.com\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-vanilla/query-string-to-sign.txt",
    "content": "AWS4-ECDSA-P256-SHA256\n20150830T123600Z\n20150830/service/aws4_request\n192546340393592ef9baaa24656f55ed91288110e7514b50f0a3f79bb761a29c"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-vanilla/request.txt",
    "content": "POST / HTTP/1.1\nHost:example.amazonaws.com\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-vanilla-empty-query-value/context.json",
    "content": "{\n    \"credentials\": {\n        \"access_key_id\": \"AKIDEXAMPLE\",\n        \"secret_access_key\": \"wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY\"\n    },\n    \"expiration_in_seconds\": 3600,\n    \"normalize\": true,\n    \"region\": \"us-east-1\",\n    \"service\": \"service\",\n    \"sign_body\": false,\n    \"timestamp\": \"2015-08-30T12:36:00Z\"\n}"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-vanilla-empty-query-value/header-canonical-request.txt",
    "content": "POST\n/\nParam1=value1\nhost:example.amazonaws.com\nx-amz-date:20150830T123600Z\nx-amz-region-set:us-east-1\n\nhost;x-amz-date;x-amz-region-set\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-vanilla-empty-query-value/header-signature.txt",
    "content": "3045022077e142d360c6c3d6768c94c89856f6de0e4fe088328ed0a2324d78ffb73570f1022100ed84c9cd071b43d78f2d70cc1694b3ea807638c648d29a2c401cf3301b34e081"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-vanilla-empty-query-value/header-signed-request.txt",
    "content": "POST /?Param1=value1 HTTP/1.1\nHost:example.amazonaws.com\nX-Amz-Date:20150830T123600Z\nX-Amz-Region-Set:us-east-1\nAuthorization:AWS4-ECDSA-P256-SHA256 Credential=AKIDEXAMPLE/20150830/service/aws4_request, SignedHeaders=host;x-amz-date;x-amz-region-set, Signature=304402203129b52c7149bcf5761f83d023986576af5846b9e9f11050651639f9e24c9ebd02200f7e2f6c2aed2bbb76580e50d32e8aa09dc65f7544cdb169b4a690a2a248efd3\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-vanilla-empty-query-value/header-string-to-sign.txt",
    "content": "AWS4-ECDSA-P256-SHA256\n20150830T123600Z\n20150830/service/aws4_request\n502dea2656f02eea10bd05eeec315ea1a6686ed2861176e1670b2d67e17b2f36"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-vanilla-empty-query-value/public-key.json",
    "content": "{\n  \"X\":\"b6618f6a65740a99e650b33b6b4b5bd0d43b176d721a3edfea7e7d2d56d936b1\",\n  \"Y\":\"865ed22a7eadc9c5cb9d2cbaca1b3699139fedc5043dc6661864218330c8e518\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-vanilla-empty-query-value/query-canonical-request.txt",
    "content": "POST\n/\nParam1=value1&X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host\nhost:example.amazonaws.com\n\nhost\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-vanilla-empty-query-value/query-signature.txt",
    "content": "3045022100df7ad6c7c07d989d8bf5bdc3953a5992ceb0e0acb40c8fba0fdb2e12b1003a0e022002a3b1109182bf60285df0b581ce2d8c6665215d7c0ae4bc32a43a30bad21626"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-vanilla-empty-query-value/query-signed-request.txt",
    "content": "POST /?Param1=value1&X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-Signature=3045022025fbe60840e867e12ed08dde14cb7b65da87de27afd012fd2bef96c7bc5b6bfe022100ab6eaea845c3d8b65b39d4506cdd36232f10dae092ddd4d54f887d2f979821d9 HTTP/1.1\nHost:example.amazonaws.com\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-vanilla-empty-query-value/query-string-to-sign.txt",
    "content": "AWS4-ECDSA-P256-SHA256\n20150830T123600Z\n20150830/service/aws4_request\nb9ec8df7b378fbee58903f5c54bd50e80a4d2d5aa9532583910ce771e42574fe"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-vanilla-empty-query-value/request.txt",
    "content": "POST /?Param1=value1 HTTP/1.1\nHost:example.amazonaws.com\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-vanilla-query/context.json",
    "content": "{\n    \"credentials\": {\n        \"access_key_id\": \"AKIDEXAMPLE\",\n        \"secret_access_key\": \"wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY\"\n    },\n    \"expiration_in_seconds\": 3600,\n    \"normalize\": true,\n    \"region\": \"us-east-1\",\n    \"service\": \"service\",\n    \"sign_body\": false,\n    \"timestamp\": \"2015-08-30T12:36:00Z\"\n}"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-vanilla-query/header-canonical-request.txt",
    "content": "POST\n/\nParam1=value1\nhost:example.amazonaws.com\nx-amz-date:20150830T123600Z\nx-amz-region-set:us-east-1\n\nhost;x-amz-date;x-amz-region-set\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-vanilla-query/header-signature.txt",
    "content": "3046022100b876f1bd2e85da20227bf515463de11ed5334e78e559bf814ce39c6a500af453022100a0a4797c60fda7bca3af5ae71680853b0c4e401d3da0821e3266062ff3463275"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-vanilla-query/header-signed-request.txt",
    "content": "POST /?Param1=value1 HTTP/1.1\nHost:example.amazonaws.com\nX-Amz-Date:20150830T123600Z\nX-Amz-Region-Set:us-east-1\nAuthorization:AWS4-ECDSA-P256-SHA256 Credential=AKIDEXAMPLE/20150830/service/aws4_request, SignedHeaders=host;x-amz-date;x-amz-region-set, Signature=304402202785ef1eddce96aa4f4cb359f00fcb1155fa7f679b4af8949a8ea097381543fc02205a9719949fcc5452e690dcd2426318aa17d87aa67c68fdd66f815ae2d3591b49\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-vanilla-query/header-string-to-sign.txt",
    "content": "AWS4-ECDSA-P256-SHA256\n20150830T123600Z\n20150830/service/aws4_request\n502dea2656f02eea10bd05eeec315ea1a6686ed2861176e1670b2d67e17b2f36"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-vanilla-query/public-key.json",
    "content": "{\n  \"X\":\"b6618f6a65740a99e650b33b6b4b5bd0d43b176d721a3edfea7e7d2d56d936b1\",\n  \"Y\":\"865ed22a7eadc9c5cb9d2cbaca1b3699139fedc5043dc6661864218330c8e518\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-vanilla-query/query-canonical-request.txt",
    "content": "POST\n/\nParam1=value1&X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=host\nhost:example.amazonaws.com\n\nhost\ne3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-vanilla-query/query-signature.txt",
    "content": "304402206c9877a31b4f7d0118d45b1e1ac58ed605f2d7ded4005d59c86ac7331737097302201772085759c0ab0ecbf67a85128823319866ee7118945cf569dd17f678aafce5"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-vanilla-query/query-signed-request.txt",
    "content": "POST /?Param1=value1&X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-SignedHeaders=host&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-Signature=304402207a361da47ef99ca9b92f2a8d5f8f0214a9580491aa78413733200307498bae3d02207072a6f2a774fa336cc5fb84daf553f70ed1867f2e35563e3a24fdf4a329713d HTTP/1.1\nHost:example.amazonaws.com\n\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-vanilla-query/query-string-to-sign.txt",
    "content": "AWS4-ECDSA-P256-SHA256\n20150830T123600Z\n20150830/service/aws4_request\nb9ec8df7b378fbee58903f5c54bd50e80a4d2d5aa9532583910ce771e42574fe"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-vanilla-query/request.txt",
    "content": "POST /?Param1=value1 HTTP/1.1\nHost:example.amazonaws.com\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-x-www-form-urlencoded/context.json",
    "content": "{\n    \"credentials\": {\n        \"access_key_id\": \"AKIDEXAMPLE\",\n        \"secret_access_key\": \"wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY\"\n    },\n    \"expiration_in_seconds\": 3600,\n    \"normalize\": true,\n    \"region\": \"us-east-1\",\n    \"service\": \"service\",\n    \"sign_body\": true,\n    \"timestamp\": \"2015-08-30T12:36:00Z\"\n}"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-x-www-form-urlencoded/header-canonical-request.txt",
    "content": "POST\n/\n\ncontent-length:13\ncontent-type:application/x-www-form-urlencoded\nhost:example.amazonaws.com\nx-amz-content-sha256:9095672bbd1f56dfc5b65f3e153adc8731a4a654192329106275f4c7b24d0b6e\nx-amz-date:20150830T123600Z\nx-amz-region-set:us-east-1\n\ncontent-length;content-type;host;x-amz-content-sha256;x-amz-date;x-amz-region-set\n9095672bbd1f56dfc5b65f3e153adc8731a4a654192329106275f4c7b24d0b6e"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-x-www-form-urlencoded/header-signature.txt",
    "content": "304402202dc0a1ca6ca9308bece143f48201f2500761a242ba6efc7857e1ba01a022e843022053f570cb5adf521df2f6732b5077becd86bc2073b30e9d48c2057851902c1c0e"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-x-www-form-urlencoded/header-signed-request.txt",
    "content": "POST / HTTP/1.1\nContent-Type:application/x-www-form-urlencoded\nHost:example.amazonaws.com\nContent-Length:13\nX-Amz-Date:20150830T123600Z\nX-Amz-Region-Set:us-east-1\nx-amz-content-sha256:9095672bbd1f56dfc5b65f3e153adc8731a4a654192329106275f4c7b24d0b6e\nAuthorization:AWS4-ECDSA-P256-SHA256 Credential=AKIDEXAMPLE/20150830/service/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-content-sha256;x-amz-date;x-amz-region-set, Signature=3045022100955bbc0f0b9d4284719808642167f7d5ea4a72f8c296b75b442898c8b81cd7e502202425fb97620fa9a20344d22b248dd00db07524fc39b5ad77533e00b277331241\n\nParam1=value1"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-x-www-form-urlencoded/header-string-to-sign.txt",
    "content": "AWS4-ECDSA-P256-SHA256\n20150830T123600Z\n20150830/service/aws4_request\nba7fa291aefad463b308fdc89b33d852aea9fbcfa151d820117bd8189066cb91"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-x-www-form-urlencoded/public-key.json",
    "content": "{\n  \"X\":\"b6618f6a65740a99e650b33b6b4b5bd0d43b176d721a3edfea7e7d2d56d936b1\",\n  \"Y\":\"865ed22a7eadc9c5cb9d2cbaca1b3699139fedc5043dc6661864218330c8e518\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-x-www-form-urlencoded/query-canonical-request.txt",
    "content": "POST\n/\nX-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=content-length%3Bcontent-type%3Bhost\ncontent-length:13\ncontent-type:application/x-www-form-urlencoded\nhost:example.amazonaws.com\n\ncontent-length;content-type;host\n9095672bbd1f56dfc5b65f3e153adc8731a4a654192329106275f4c7b24d0b6e"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-x-www-form-urlencoded/query-signature.txt",
    "content": "304402205e21d399153f879b0f32c38742d12941299467bfdc213224cc76a97acffd6ec6022035a9be37a38c19e98e5cfc536fabe885e82fbf999081234b364cab5cacff8733"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-x-www-form-urlencoded/query-signed-request.txt",
    "content": "POST /?X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-SignedHeaders=content-length%3Bcontent-type%3Bhost&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-Signature=30450221008d8a6aa0bc3f651e6c14c52e9e24dbca58964641c9cb6e55169f9dc74766ae3d022016126756ce1523ac972f66f6bf6e981f44572d3c8916f1f43d428fb2caa0e1ea HTTP/1.1\nContent-Type:application/x-www-form-urlencoded\nHost:example.amazonaws.com\nContent-Length:13\n\nParam1=value1"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-x-www-form-urlencoded/query-string-to-sign.txt",
    "content": "AWS4-ECDSA-P256-SHA256\n20150830T123600Z\n20150830/service/aws4_request\n4e4122984d30d13170a298ece62cc30f8da12578fb3b482616b1f11036b13934"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-x-www-form-urlencoded/request.txt",
    "content": "POST / HTTP/1.1\nContent-Type:application/x-www-form-urlencoded\nHost:example.amazonaws.com\nContent-Length:13\n\nParam1=value1"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-x-www-form-urlencoded-parameters/context.json",
    "content": "{\n    \"credentials\": {\n        \"access_key_id\": \"AKIDEXAMPLE\",\n        \"secret_access_key\": \"wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY\"\n    },\n    \"expiration_in_seconds\": 3600,\n    \"normalize\": true,\n    \"region\": \"us-east-1\",\n    \"service\": \"service\",\n    \"sign_body\": true,\n    \"timestamp\": \"2015-08-30T12:36:00Z\"\n}"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-x-www-form-urlencoded-parameters/header-canonical-request.txt",
    "content": "POST\n/\n\ncontent-length:13\ncontent-type:application/x-www-form-urlencoded; charset=utf-8\nhost:example.amazonaws.com\nx-amz-content-sha256:9095672bbd1f56dfc5b65f3e153adc8731a4a654192329106275f4c7b24d0b6e\nx-amz-date:20150830T123600Z\nx-amz-region-set:us-east-1\n\ncontent-length;content-type;host;x-amz-content-sha256;x-amz-date;x-amz-region-set\n9095672bbd1f56dfc5b65f3e153adc8731a4a654192329106275f4c7b24d0b6e"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-x-www-form-urlencoded-parameters/header-signature.txt",
    "content": "3045022100eaa8151b5a6e60d9c52dfa60d186a304d0226984aa9ed21f2913267cdfd365c902203bfd4e6dfea58e68d3cb892939f3a00ac91e80c8df69828aefa1e48245928678"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-x-www-form-urlencoded-parameters/header-signed-request.txt",
    "content": "POST / HTTP/1.1\nContent-Type:application/x-www-form-urlencoded; charset=utf-8\nHost:example.amazonaws.com\nContent-Length:13\nX-Amz-Date:20150830T123600Z\nX-Amz-Region-Set:us-east-1\nx-amz-content-sha256:9095672bbd1f56dfc5b65f3e153adc8731a4a654192329106275f4c7b24d0b6e\nAuthorization:AWS4-ECDSA-P256-SHA256 Credential=AKIDEXAMPLE/20150830/service/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-content-sha256;x-amz-date;x-amz-region-set, Signature=3045022100c016dc61cbd380cf8160711320957071f5c122ef69164d56d02f79daf51a0603022043e3313aa2f6b46285cc89dfe5616ccc74c810a3d7ea25b76ee1ca496f7facba\n\nParam1=value1"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-x-www-form-urlencoded-parameters/header-string-to-sign.txt",
    "content": "AWS4-ECDSA-P256-SHA256\n20150830T123600Z\n20150830/service/aws4_request\nbcdb9ab3050c0bb18c5e9eb60e6eb1aaaf00907920065569a99b0c51278639b5"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-x-www-form-urlencoded-parameters/public-key.json",
    "content": "{\n  \"X\":\"b6618f6a65740a99e650b33b6b4b5bd0d43b176d721a3edfea7e7d2d56d936b1\",\n  \"Y\":\"865ed22a7eadc9c5cb9d2cbaca1b3699139fedc5043dc6661864218330c8e518\"\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-x-www-form-urlencoded-parameters/query-canonical-request.txt",
    "content": "POST\n/\nX-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-SignedHeaders=content-length%3Bcontent-type%3Bhost\ncontent-length:13\ncontent-type:application/x-www-form-urlencoded; charset=utf-8\nhost:example.amazonaws.com\n\ncontent-length;content-type;host\n9095672bbd1f56dfc5b65f3e153adc8731a4a654192329106275f4c7b24d0b6e"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-x-www-form-urlencoded-parameters/query-signature.txt",
    "content": "3046022100dcfa462c480d85707221a690323639df78fb10eb2f4913abcfc4eec215c39fb8022100bad863cf9d951963fc2d8068a2887742d553283e5086f644e3ca9ff8b262e13c"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-x-www-form-urlencoded-parameters/query-signed-request.txt",
    "content": "POST /?X-Amz-Algorithm=AWS4-ECDSA-P256-SHA256&X-Amz-Credential=AKIDEXAMPLE%2F20150830%2Fservice%2Faws4_request&X-Amz-Date=20150830T123600Z&X-Amz-SignedHeaders=content-length%3Bcontent-type%3Bhost&X-Amz-Expires=3600&X-Amz-Region-Set=us-east-1&X-Amz-Signature=30450220128d491ccca3f9a7988d00454d2210dd884d7990ca2cb844d4968c8fa9e937f8022100b3668dd440d8206074460567cee98691f66412fe5a83d8e32c601e1331f2ec2b HTTP/1.1\nContent-Type:application/x-www-form-urlencoded; charset=utf-8\nHost:example.amazonaws.com\nContent-Length:13\n\nParam1=value1"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-x-www-form-urlencoded-parameters/query-string-to-sign.txt",
    "content": "AWS4-ECDSA-P256-SHA256\n20150830T123600Z\n20150830/service/aws4_request\nd4dab970413a0459d2a3bb644b278e96e85f2f6ac8fa09a74bbd6a269ec3dd82"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/aws-signing-test-suite/v4a/post-x-www-form-urlencoded-parameters/request.txt",
    "content": "POST / HTTP/1.1\nContent-Type:application/x-www-form-urlencoded; charset=utf-8\nHost:example.amazonaws.com\nContent-Length:13\n\nParam1=value1"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/benches/hmac.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse criterion::{criterion_group, criterion_main, Criterion};\nuse hmac::digest::FixedOutput;\nuse hmac::{Hmac, KeyInit, Mac};\n#[cfg(not(any(target_arch = \"powerpc\", target_arch = \"powerpc64\")))]\nuse ring::hmac::{sign, Context, Key, HMAC_SHA256};\nuse sha2::Sha256;\n\npub fn hmac(c: &mut Criterion) {\n    c.bench_function(\"hmac\", |b| {\n        b.iter(|| {\n            let mut mac = Hmac::<Sha256>::new_from_slice(b\"secret\").unwrap();\n\n            mac.update(b\"hello, world\");\n            mac.finalize_fixed()\n        })\n    });\n}\n\n#[cfg(not(any(target_arch = \"powerpc\", target_arch = \"powerpc64\")))]\npub fn ring_multipart(c: &mut Criterion) {\n    c.bench_function(\"ring_multipart\", |b| {\n        b.iter(|| {\n            let k = Key::new(HMAC_SHA256, b\"secret\");\n            let mut ctx = Context::with_key(&k);\n\n            for slice in [\"hello\", \", \", \"world\"] {\n                ctx.update(slice.as_ref());\n            }\n\n            ctx.sign()\n        })\n    });\n}\n\n#[cfg(not(any(target_arch = \"powerpc\", target_arch = \"powerpc64\")))]\npub fn ring_one_shot(c: &mut Criterion) {\n    c.bench_function(\"ring_one_shot\", |b| {\n        b.iter(|| {\n            let k = Key::new(HMAC_SHA256, b\"secret\");\n\n            sign(&k, b\"hello, world\")\n        })\n    });\n}\n\n#[cfg(not(any(target_arch = \"powerpc\", target_arch = \"powerpc64\")))]\ncriterion_group! {\n    name = benches;\n\n    config = Criterion::default();\n\n    targets = hmac, ring_multipart, ring_one_shot\n}\n\n#[cfg(any(target_arch = \"powerpc\", target_arch = \"powerpc64\"))]\ncriterion_group! {\n    name = benches;\n\n    config = Criterion::default();\n\n    targets = hmac\n}\n\ncriterion_main!(benches);\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/benches/sigv4a.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_sigv4::sign::v4a;\nuse criterion::{criterion_group, criterion_main, Criterion};\nuse std::hint::black_box;\n\npub fn generate_signing_key(c: &mut Criterion) {\n    c.bench_function(\"generate_signing_key\", |b| {\n        b.iter(|| {\n            let _ = v4a::generate_signing_key(\n                black_box(\"AKIAIOSFODNN7EXAMPLE\"),\n                black_box(\"wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY\"),\n            );\n        })\n    });\n}\n\ncriterion_group! {\n    name = benches;\n\n    config = Criterion::default();\n\n    targets = generate_signing_key\n}\n\ncriterion_main!(benches);\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/external-types.toml",
    "content": "allowed_external_types = [\n    # TODO(https://github.com/smithy-lang/smithy-rs/issues/1193): Once tooling permits it, only allow the following types in the `http0-compat` feature\n    \"http::request::Request\",\n    # TODO(https://github.com/smithy-lang/smithy-rs/issues/1193): Once tooling permits it, only allow the following types in the `event-stream` feature\n    \"aws_smithy_types::event_stream::Message\",\n    \"aws_smithy_runtime_api::client::identity::Identity\",\n    \"aws_smithy_runtime_api::http::headers::Headers\",\n    \"bytes::bytes::Bytes\"\n]\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/src/date_time.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n// Some of the functions in this file are unused when disabling certain features\n#![allow(dead_code)]\n\nuse std::time::SystemTime;\nuse time::{OffsetDateTime, Time};\n\n/// Truncates the subseconds from the given `SystemTime` to zero.\npub(crate) fn truncate_subsecs(time: SystemTime) -> SystemTime {\n    let date_time = OffsetDateTime::from(time);\n    let time = date_time.time();\n    date_time\n        .replace_time(\n            Time::from_hms(time.hour(), time.minute(), time.second()).expect(\"was already a time\"),\n        )\n        .into()\n}\n\n/// Formats a `SystemTime` in `YYYYMMDD` format.\npub(crate) fn format_date(time: SystemTime) -> String {\n    let time = OffsetDateTime::from(time);\n    format!(\n        \"{:04}{:02}{:02}\",\n        time.year(),\n        u8::from(time.month()),\n        time.day()\n    )\n}\n\n/// Formats a `SystemTime` in `YYYYMMDD'T'HHMMSS'Z'` format.\npub(crate) fn format_date_time(time: SystemTime) -> String {\n    let time = OffsetDateTime::from(time);\n    format!(\n        \"{:04}{:02}{:02}T{:02}{:02}{:02}Z\",\n        time.year(),\n        u8::from(time.month()),\n        time.day(),\n        time.hour(),\n        time.minute(),\n        time.second()\n    )\n}\n\n/// Parse functions that are only needed for unit tests.\n#[cfg(test)]\npub(crate) mod test_parsers {\n    use std::{borrow::Cow, error::Error, fmt, time::SystemTime};\n    use time::format_description;\n    use time::{Date, PrimitiveDateTime, Time};\n\n    const DATE_TIME_FORMAT: &str = \"[year][month][day]T[hour][minute][second]Z\";\n    const DATE_FORMAT: &str = \"[year][month][day]\";\n\n    /// Parses `YYYYMMDD'T'HHMMSS'Z'` formatted dates into a `SystemTime`.\n    pub(crate) fn parse_date_time(date_time_str: &str) -> Result<SystemTime, ParseError> {\n        let date_time = PrimitiveDateTime::parse(\n            date_time_str,\n            &format_description::parse(DATE_TIME_FORMAT).unwrap(),\n        )\n        .map_err(|err| ParseError(err.to_string().into()))?\n        .assume_utc();\n        Ok(date_time.into())\n    }\n\n    /// Parses `YYYYMMDD` formatted dates into a `SystemTime`.\n    pub(crate) fn parse_date(date_str: &str) -> Result<SystemTime, ParseError> {\n        let date_time = PrimitiveDateTime::new(\n            Date::parse(date_str, &format_description::parse(DATE_FORMAT).unwrap())\n                .map_err(|err| ParseError(err.to_string().into()))?,\n            Time::from_hms(0, 0, 0).unwrap(),\n        )\n        .assume_utc();\n        Ok(date_time.into())\n    }\n\n    #[derive(Debug)]\n    pub(crate) struct ParseError(Cow<'static, str>);\n\n    impl fmt::Display for ParseError {\n        fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n            write!(f, \"failed to parse time: {}\", self.0)\n        }\n    }\n\n    impl Error for ParseError {}\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use crate::date_time::test_parsers::{parse_date, parse_date_time};\n    use time::format_description::well_known::Rfc3339;\n\n    // TODO(https://github.com/smithy-lang/smithy-rs/issues/1857)\n    #[cfg(not(any(target_arch = \"powerpc\", target_arch = \"x86\")))]\n    #[test]\n    fn date_format() {\n        let time: SystemTime = OffsetDateTime::parse(\"2039-02-04T23:01:09.104Z\", &Rfc3339)\n            .unwrap()\n            .into();\n        assert_eq!(\"20390204\", format_date(time));\n        let time: SystemTime = OffsetDateTime::parse(\"0100-01-02T00:00:00.000Z\", &Rfc3339)\n            .unwrap()\n            .into();\n        assert_eq!(\"01000102\", format_date(time));\n    }\n\n    // TODO(https://github.com/smithy-lang/smithy-rs/issues/1857)\n    #[cfg(not(any(target_arch = \"powerpc\", target_arch = \"x86\")))]\n    #[test]\n    fn date_time_format() {\n        let time: SystemTime = OffsetDateTime::parse(\"2039-02-04T23:01:09.104Z\", &Rfc3339)\n            .unwrap()\n            .into();\n        assert_eq!(\"20390204T230109Z\", format_date_time(time));\n        let time: SystemTime = OffsetDateTime::parse(\"0100-01-02T00:00:00.000Z\", &Rfc3339)\n            .unwrap()\n            .into();\n        assert_eq!(\"01000102T000000Z\", format_date_time(time));\n    }\n\n    #[test]\n    fn date_time_roundtrip() {\n        let time = parse_date_time(\"20150830T123600Z\").unwrap();\n        assert_eq!(\"20150830T123600Z\", format_date_time(time));\n    }\n\n    #[test]\n    fn date_roundtrip() {\n        let time = parse_date(\"20150830\").unwrap();\n        assert_eq!(\"20150830\", format_date(time));\n    }\n\n    // TODO(https://github.com/smithy-lang/smithy-rs/issues/1857)\n    #[cfg(not(any(target_arch = \"powerpc\", target_arch = \"x86\")))]\n    #[test]\n    fn test_truncate_subsecs() {\n        let time: SystemTime = OffsetDateTime::parse(\"2039-02-04T23:01:09.104Z\", &Rfc3339)\n            .unwrap()\n            .into();\n        let expected: SystemTime = OffsetDateTime::parse(\"2039-02-04T23:01:09.000Z\", &Rfc3339)\n            .unwrap()\n            .into();\n        assert_eq!(expected, truncate_subsecs(time));\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/src/event_stream.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Utilities to sign Event Stream messages.\n//!\n//! # Example: Signing an event stream message\n//!\n//! ```rust\n//! use aws_sigv4::event_stream::sign_message;\n//! use aws_smithy_types::event_stream::{Header, HeaderValue, Message};\n//! use std::time::SystemTime;\n//! use aws_credential_types::Credentials;\n//! use aws_smithy_runtime_api::client::identity::Identity;\n//! use aws_sigv4::sign::v4;\n//!\n//! // The `last_signature` argument is the previous message's signature, or\n//! // the signature of the initial HTTP request if a message hasn't been signed yet.\n//! let last_signature = \"example298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\";\n//!\n//! let message_to_sign = Message::new(&b\"example\"[..]).add_header(Header::new(\n//!     \"some-header\",\n//!     HeaderValue::String(\"value\".into()),\n//! ));\n//!\n//! let identity = Credentials::new(\n//!     \"AKIDEXAMPLE\",\n//!     \"wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY\",\n//!     None,\n//!     None,\n//!     \"hardcoded-credentials\"\n//! ).into();\n//! let params = v4::SigningParams::builder()\n//!     .identity(&identity)\n//!     .region(\"us-east-1\")\n//!     .name(\"exampleservice\")\n//!     .time(SystemTime::now())\n//!     .settings(())\n//!     .build()\n//!     .unwrap();\n//!\n//! // Use the returned `signature` to sign the next message.\n//! let (signed, signature) = sign_message(&message_to_sign, &last_signature, &params)\n//!     .expect(\"signing should succeed\")\n//!     .into_parts();\n//! ```\n\nuse crate::date_time::{format_date, format_date_time, truncate_subsecs};\nuse crate::http_request::SigningError;\nuse crate::sign::v4::{calculate_signature, generate_signing_key, sha256_hex_string};\nuse crate::SigningOutput;\nuse aws_credential_types::Credentials;\nuse aws_smithy_eventstream::frame::{write_headers_to, write_message_to};\nuse aws_smithy_types::event_stream::{Header, HeaderValue, Message};\nuse bytes::Bytes;\nuse std::io::Write;\nuse std::time::SystemTime;\n\n/// Event stream signing parameters\npub type SigningParams<'a> = crate::sign::v4::SigningParams<'a, ()>;\n\n/// Creates a string to sign for an Event Stream message.\nfn calculate_string_to_sign(\n    message_payload: &[u8],\n    last_signature: &str,\n    time: SystemTime,\n    params: &SigningParams<'_>,\n) -> Vec<u8> {\n    // Event Stream string to sign format is documented here:\n    // https://docs.aws.amazon.com/transcribe/latest/dg/how-streaming.html\n    let date_time_str = format_date_time(time);\n    let date_str = format_date(time);\n\n    let mut sts: Vec<u8> = Vec::new();\n    writeln!(sts, \"AWS4-HMAC-SHA256-PAYLOAD\").unwrap();\n    writeln!(sts, \"{date_time_str}\").unwrap();\n    writeln!(\n        sts,\n        \"{}/{}/{}/aws4_request\",\n        date_str, params.region, params.name\n    )\n    .unwrap();\n    writeln!(sts, \"{last_signature}\").unwrap();\n\n    let date_header = Header::new(\":date\", HeaderValue::Timestamp(time.into()));\n    let mut date_buffer = Vec::new();\n    write_headers_to(&[date_header], &mut date_buffer).unwrap();\n    writeln!(sts, \"{}\", sha256_hex_string(&date_buffer)).unwrap();\n    write!(sts, \"{}\", sha256_hex_string(message_payload)).unwrap();\n    sts\n}\n\n/// Signs an Event Stream message with the given `credentials`.\n///\n/// Each message's signature incorporates the signature of the previous message (`last_signature`).\n/// The very first message incorporates the signature of the top-level request\n/// for both HTTP 2 and WebSocket.\npub fn sign_message<'a>(\n    message: &'a Message,\n    last_signature: &'a str,\n    params: &'a SigningParams<'a>,\n) -> Result<SigningOutput<Message>, SigningError> {\n    let message_payload = {\n        let mut payload = Vec::new();\n        write_message_to(message, &mut payload).unwrap();\n        payload\n    };\n    sign_payload(Some(message_payload), last_signature, params)\n}\n\n/// Returns a signed empty message\n///\n/// Empty signed event stream messages differ from normal signed event stream\n/// in that the payload is 0-bytes rather than a nested message. There is no way\n/// to create a signed empty message using [`sign_message`].\npub fn sign_empty_message<'a>(\n    last_signature: &'a str,\n    params: &'a SigningParams<'a>,\n) -> Result<SigningOutput<Message>, SigningError> {\n    sign_payload(None, last_signature, params)\n}\n\nfn sign_payload<'a>(\n    message_payload: Option<Vec<u8>>,\n    last_signature: &'a str,\n    params: &'a SigningParams<'a>,\n) -> Result<SigningOutput<Message>, SigningError> {\n    // Truncate the sub-seconds up front since the timestamp written to the signed message header\n    // needs to exactly match the string formatted timestamp, which doesn't include sub-seconds.\n    let time = truncate_subsecs(params.time);\n    let creds = params\n        .identity\n        .data::<Credentials>()\n        .ok_or_else(SigningError::unsupported_identity_type)?;\n\n    let signing_key =\n        generate_signing_key(creds.secret_access_key(), time, params.region, params.name);\n    let string_to_sign = calculate_string_to_sign(\n        message_payload.as_ref().map(|v| &v[..]).unwrap_or(&[]),\n        last_signature,\n        time,\n        params,\n    );\n    let signature = calculate_signature(signing_key, &string_to_sign);\n    tracing::trace!(canonical_request = ?message_payload, string_to_sign = ?string_to_sign, \"calculated signing parameters\");\n\n    // Generate the signed wrapper event frame\n    Ok(SigningOutput::new(\n        Message::new(message_payload.map(Bytes::from).unwrap_or_default())\n            .add_header(Header::new(\n                \":chunk-signature\",\n                HeaderValue::ByteArray(hex::decode(&signature).unwrap().into()),\n            ))\n            .add_header(Header::new(\":date\", HeaderValue::Timestamp(time.into()))),\n        signature,\n    ))\n}\n\n#[cfg(test)]\nmod tests {\n    use crate::event_stream::{calculate_string_to_sign, sign_message, SigningParams};\n    use crate::sign::v4::sha256_hex_string;\n    use aws_credential_types::Credentials;\n    use aws_smithy_eventstream::frame::write_message_to;\n    use aws_smithy_types::event_stream::{Header, HeaderValue, Message};\n    use std::time::{Duration, UNIX_EPOCH};\n\n    #[test]\n    fn string_to_sign() {\n        let message_to_sign = Message::new(&b\"test payload\"[..]).add_header(Header::new(\n            \"some-header\",\n            HeaderValue::String(\"value\".into()),\n        ));\n        let mut message_payload = Vec::new();\n        write_message_to(&message_to_sign, &mut message_payload).unwrap();\n\n        let params = SigningParams {\n            identity: &Credentials::for_tests().into(),\n            region: \"us-east-1\",\n            name: \"testservice\",\n            time: (UNIX_EPOCH + Duration::new(123_456_789_u64, 1234u32)),\n            settings: (),\n        };\n\n        let expected = \"\\\n            AWS4-HMAC-SHA256-PAYLOAD\\n\\\n            19731129T213309Z\\n\\\n            19731129/us-east-1/testservice/aws4_request\\n\\\n            be1f8c7d79ef8e1abc5254a2c70e4da3bfaf4f07328f527444e1fc6ea67273e2\\n\\\n            0c0e3b3bf66b59b976181bd7d401927bbd624107303c713fd1e5f3d3c8dd1b1e\\n\\\n            f2eba0f2e95967ee9fbc6db5e678d2fd599229c0d04b11e4fc8e0f2a02a806c6\\\n        \";\n\n        let last_signature = sha256_hex_string(b\"last message sts\");\n        assert_eq!(\n            expected,\n            std::str::from_utf8(&calculate_string_to_sign(\n                &message_payload,\n                &last_signature,\n                params.time,\n                &params\n            ))\n            .unwrap()\n        );\n    }\n\n    #[test]\n    fn sign() {\n        let message_to_sign = Message::new(&b\"test payload\"[..]).add_header(Header::new(\n            \"some-header\",\n            HeaderValue::String(\"value\".into()),\n        ));\n        let params = SigningParams {\n            identity: &Credentials::for_tests().into(),\n            region: \"us-east-1\",\n            name: \"testservice\",\n            time: (UNIX_EPOCH + Duration::new(123_456_789_u64, 1234u32)),\n            settings: (),\n        };\n\n        let last_signature = sha256_hex_string(b\"last message sts\");\n        let (signed, signature) = sign_message(&message_to_sign, &last_signature, &params)\n            .unwrap()\n            .into_parts();\n        assert_eq!(\":chunk-signature\", signed.headers()[0].name().as_str());\n        if let HeaderValue::ByteArray(bytes) = signed.headers()[0].value() {\n            assert_eq!(signature, hex::encode(bytes));\n        } else {\n            panic!(\"expected byte array for :chunk-signature header\");\n        }\n        assert_eq!(\":date\", signed.headers()[1].name().as_str());\n        if let HeaderValue::Timestamp(value) = signed.headers()[1].value() {\n            assert_eq!(123_456_789_i64, value.secs());\n            // The subseconds should have been truncated off\n            assert_eq!(0, value.subsec_nanos());\n        } else {\n            panic!(\"expected timestamp for :date header\");\n        }\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/src/http_request/canonical_request/sigv4a.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npub(crate) mod header {\n    pub(crate) const X_AMZ_REGION_SET: &str = \"x-amz-region-set\";\n}\n\npub(crate) mod param {\n    pub(crate) const X_AMZ_REGION_SET: &str = \"X-Amz-Region-Set\";\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/src/http_request/canonical_request.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::date_time::{format_date, format_date_time};\nuse crate::http_request::error::CanonicalRequestError;\nuse crate::http_request::settings::SessionTokenMode;\nuse crate::http_request::settings::UriPathNormalizationMode;\nuse crate::http_request::sign::SignableRequest;\nuse crate::http_request::uri_path_normalization::normalize_uri_path;\nuse crate::http_request::url_escape::percent_encode_path;\nuse crate::http_request::{PayloadChecksumKind, SignableBody, SignatureLocation, SigningParams};\nuse crate::http_request::{PercentEncodingMode, SigningSettings};\nuse crate::sign::v4::{sha256_hex_string, HMAC_SHA256};\nuse crate::SignatureVersion;\nuse aws_smithy_http::query_writer::QueryWriter;\nuse http::header::{AsHeaderName, HeaderName, HOST};\nuse http::uri::{Port, Scheme};\nuse http::{HeaderMap, HeaderValue, Uri};\nuse std::borrow::Cow;\nuse std::cmp::Ordering;\nuse std::fmt;\nuse std::str::FromStr;\nuse std::time::SystemTime;\n\n#[cfg(feature = \"sigv4a\")]\npub(crate) mod sigv4a;\n\npub(crate) mod header {\n    pub(crate) const X_AMZ_CONTENT_SHA_256: &str = \"x-amz-content-sha256\";\n    pub(crate) const X_AMZ_DATE: &str = \"x-amz-date\";\n    pub(crate) const X_AMZ_SECURITY_TOKEN: &str = \"x-amz-security-token\";\n    pub(crate) const X_AMZ_USER_AGENT: &str = \"x-amz-user-agent\";\n    pub(crate) const X_AMZ_CHECKSUM_MODE: &str = \"x-amz-checksum-mode\";\n}\n\npub(crate) mod param {\n    pub(crate) const X_AMZ_ALGORITHM: &str = \"X-Amz-Algorithm\";\n    pub(crate) const X_AMZ_CREDENTIAL: &str = \"X-Amz-Credential\";\n    pub(crate) const X_AMZ_DATE: &str = \"X-Amz-Date\";\n    pub(crate) const X_AMZ_EXPIRES: &str = \"X-Amz-Expires\";\n    pub(crate) const X_AMZ_SECURITY_TOKEN: &str = \"X-Amz-Security-Token\";\n    pub(crate) const X_AMZ_SIGNED_HEADERS: &str = \"X-Amz-SignedHeaders\";\n    pub(crate) const X_AMZ_SIGNATURE: &str = \"X-Amz-Signature\";\n}\n\nconst UNSIGNED_PAYLOAD: &str = \"UNSIGNED-PAYLOAD\";\nconst STREAMING_UNSIGNED_PAYLOAD_TRAILER: &str = \"STREAMING-UNSIGNED-PAYLOAD-TRAILER\";\nconst STREAMING_SIGNED_PAYLOAD_TRAILER: &str = \"STREAMING-AWS4-HMAC-SHA256-PAYLOAD-TRAILER\";\n\n#[derive(Debug, PartialEq)]\npub(crate) struct HeaderValues<'a> {\n    pub(crate) content_sha256: Cow<'a, str>,\n    pub(crate) date_time: String,\n    pub(crate) security_token: Option<&'a str>,\n    pub(crate) signed_headers: SignedHeaders,\n    #[cfg(feature = \"sigv4a\")]\n    pub(crate) region_set: Option<&'a str>,\n}\n\n#[derive(Debug, PartialEq)]\npub(crate) struct QueryParamValues<'a> {\n    pub(crate) algorithm: &'static str,\n    pub(crate) content_sha256: Cow<'a, str>,\n    pub(crate) credential: String,\n    pub(crate) date_time: String,\n    pub(crate) expires: String,\n    pub(crate) security_token: Option<&'a str>,\n    pub(crate) signed_headers: SignedHeaders,\n    #[cfg(feature = \"sigv4a\")]\n    pub(crate) region_set: Option<&'a str>,\n}\n\n#[derive(Debug, PartialEq)]\npub(crate) enum SignatureValues<'a> {\n    Headers(HeaderValues<'a>),\n    QueryParams(QueryParamValues<'a>),\n}\n\nimpl<'a> SignatureValues<'a> {\n    pub(crate) fn signed_headers(&self) -> &SignedHeaders {\n        match self {\n            SignatureValues::Headers(values) => &values.signed_headers,\n            SignatureValues::QueryParams(values) => &values.signed_headers,\n        }\n    }\n\n    fn content_sha256(&self) -> &str {\n        match self {\n            SignatureValues::Headers(values) => &values.content_sha256,\n            SignatureValues::QueryParams(values) => &values.content_sha256,\n        }\n    }\n\n    pub(crate) fn as_headers(&self) -> Option<&HeaderValues<'_>> {\n        match self {\n            SignatureValues::Headers(values) => Some(values),\n            _ => None,\n        }\n    }\n\n    #[allow(clippy::result_large_err)]\n    /*\n       QueryParams(QueryParamValues<'a>),\n       --------------------------------- the largest variant contains at least 192 bytes\n\n       Suppressing the Clippy warning, as the variant above is always returned wrapped in `Ok`.\n    */\n    pub(crate) fn into_query_params(self) -> Result<QueryParamValues<'a>, Self> {\n        match self {\n            SignatureValues::QueryParams(values) => Ok(values),\n            _ => Err(self),\n        }\n    }\n}\n\n#[derive(Debug, PartialEq)]\npub(crate) struct CanonicalRequest<'a> {\n    pub(crate) method: &'a str,\n    pub(crate) path: Cow<'a, str>,\n    pub(crate) params: Option<String>,\n    pub(crate) headers: HeaderMap,\n    pub(crate) values: SignatureValues<'a>,\n}\n\nimpl CanonicalRequest<'_> {\n    /// Construct a CanonicalRequest from a [`SignableRequest`] and [`SigningParams`].\n    ///\n    /// The returned canonical request includes information required for signing as well\n    /// as query parameters or header values that go along with the signature in a request.\n    ///\n    /// ## Behavior\n    ///\n    /// There are several settings which alter signing behavior:\n    /// - If a `security_token` is provided as part of the credentials it will be included in the signed headers\n    /// - If `settings.percent_encoding_mode` specifies double encoding, `%` in the URL will be re-encoded as `%25`\n    /// - If `settings.payload_checksum_kind` is XAmzSha256, add a x-amz-content-sha256 with the body\n    ///   checksum. This is the same checksum used as the \"payload_hash\" in the canonical request\n    /// - If `settings.session_token_mode` specifies X-Amz-Security-Token to be\n    ///   included before calculating the signature, add it, otherwise omit it.\n    /// - `settings.signature_location` determines where the signature will be placed in a request,\n    ///   and also alters the kinds of signing values that go along with it in the request.\n    pub(crate) fn from<'b>(\n        req: &'b SignableRequest<'b>,\n        params: &'b SigningParams<'b>,\n    ) -> Result<CanonicalRequest<'b>, CanonicalRequestError> {\n        let creds = params\n            .credentials()\n            .map_err(|_| CanonicalRequestError::unsupported_identity_type())?;\n        // Path encoding: if specified, re-encode % as %25\n        // Set method and path into CanonicalRequest\n        let path = req.uri().path();\n        let path = match params.settings().uri_path_normalization_mode {\n            UriPathNormalizationMode::Enabled => normalize_uri_path(path),\n            UriPathNormalizationMode::Disabled => Cow::Borrowed(path),\n        };\n        let path = match params.settings().percent_encoding_mode {\n            // The string is already URI encoded, we don't need to encode everything again, just `%`\n            PercentEncodingMode::Double => Cow::Owned(percent_encode_path(&path)),\n            PercentEncodingMode::Single => path,\n        };\n        let payload_hash = Self::payload_hash(req.body());\n\n        let date_time = format_date_time(*params.time());\n        let (signed_headers, canonical_headers) =\n            Self::headers(req, params, &payload_hash, &date_time)?;\n        let signed_headers = SignedHeaders::new(signed_headers);\n\n        let security_token = match params.settings().session_token_mode {\n            SessionTokenMode::Include => creds.session_token(),\n            SessionTokenMode::Exclude => None,\n        };\n\n        let values = match params.settings().signature_location {\n            SignatureLocation::Headers => SignatureValues::Headers(HeaderValues {\n                content_sha256: payload_hash,\n                date_time,\n                security_token,\n                signed_headers,\n                #[cfg(feature = \"sigv4a\")]\n                region_set: params.region_set(),\n            }),\n            SignatureLocation::QueryParams => {\n                let credential = match params {\n                    SigningParams::V4(params) => {\n                        format!(\n                            \"{}/{}/{}/{}/aws4_request\",\n                            creds.access_key_id(),\n                            format_date(params.time),\n                            params.region,\n                            params.name,\n                        )\n                    }\n                    #[cfg(feature = \"sigv4a\")]\n                    SigningParams::V4a(params) => {\n                        format!(\n                            \"{}/{}/{}/aws4_request\",\n                            creds.access_key_id(),\n                            format_date(params.time),\n                            params.name,\n                        )\n                    }\n                };\n\n                SignatureValues::QueryParams(QueryParamValues {\n                    algorithm: params.algorithm(),\n                    content_sha256: payload_hash,\n                    credential,\n                    date_time,\n                    expires: params\n                        .settings()\n                        .expires_in\n                        .expect(\"presigning requires expires_in\")\n                        .as_secs()\n                        .to_string(),\n                    security_token,\n                    signed_headers,\n                    #[cfg(feature = \"sigv4a\")]\n                    region_set: params.region_set(),\n                })\n            }\n        };\n\n        let creq = CanonicalRequest {\n            method: req.method(),\n            path,\n            params: Self::params(req.uri(), &values, params.settings()),\n            headers: canonical_headers,\n            values,\n        };\n        Ok(creq)\n    }\n\n    fn headers(\n        req: &SignableRequest<'_>,\n        params: &SigningParams<'_>,\n        payload_hash: &str,\n        date_time: &str,\n    ) -> Result<(Vec<CanonicalHeaderName>, HeaderMap), CanonicalRequestError> {\n        // Header computation:\n        // The canonical request will include headers not present in the input. We need to clone and\n        // normalize the headers from the original request and add:\n        // - host\n        // - x-amz-date\n        // - x-amz-security-token (if provided)\n        // - x-amz-content-sha256 (if requested by signing settings)\n        let mut canonical_headers = HeaderMap::with_capacity(req.headers().len());\n        for (name, value) in req.headers().iter() {\n            // Header names and values need to be normalized according to Step 4 of https://docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html\n            // Using append instead of insert means this will not clobber headers that have the same lowercased name\n            canonical_headers.append(\n                HeaderName::from_str(&name.to_lowercase())?,\n                normalize_header_value(value)?,\n            );\n        }\n\n        Self::insert_host_header(&mut canonical_headers, req.uri());\n\n        let token_header_name = params\n            .settings()\n            .session_token_name_override\n            .unwrap_or(header::X_AMZ_SECURITY_TOKEN);\n\n        if params.settings().signature_location == SignatureLocation::Headers {\n            let creds = params\n                .credentials()\n                .map_err(|_| CanonicalRequestError::unsupported_identity_type())?;\n            Self::insert_date_header(&mut canonical_headers, date_time);\n\n            if let Some(security_token) = creds.session_token() {\n                let mut sec_header = HeaderValue::from_str(security_token)?;\n                sec_header.set_sensitive(true);\n                canonical_headers.insert(token_header_name, sec_header);\n            }\n\n            if params.settings().payload_checksum_kind == PayloadChecksumKind::XAmzSha256 {\n                let header = HeaderValue::from_str(payload_hash)?;\n                canonical_headers.insert(header::X_AMZ_CONTENT_SHA_256, header);\n            }\n\n            #[cfg(feature = \"sigv4a\")]\n            if let Some(region_set) = params.region_set() {\n                let header = HeaderValue::from_str(region_set)?;\n                canonical_headers.insert(sigv4a::header::X_AMZ_REGION_SET, header);\n            }\n        }\n\n        let mut signed_headers = Vec::with_capacity(canonical_headers.len());\n        for name in canonical_headers.keys() {\n            if let Some(excluded_headers) = params.settings().excluded_headers.as_ref() {\n                if excluded_headers.iter().any(|it| name.as_str() == it) {\n                    continue;\n                }\n            }\n\n            if params.settings().session_token_mode == SessionTokenMode::Exclude\n                && name == HeaderName::from_static(token_header_name)\n            {\n                continue;\n            }\n\n            if params.settings().signature_location == SignatureLocation::QueryParams {\n                // The X-Amz-User-Agent and x-amz-checksum-mode headers should not be signed if this is for a presigned URL\n                if name == HeaderName::from_static(header::X_AMZ_USER_AGENT)\n                    || name == HeaderName::from_static(header::X_AMZ_CHECKSUM_MODE)\n                {\n                    continue;\n                }\n            }\n            signed_headers.push(CanonicalHeaderName(name.clone()));\n        }\n\n        Ok((signed_headers, canonical_headers))\n    }\n\n    fn payload_hash<'b>(body: &'b SignableBody<'b>) -> Cow<'b, str> {\n        // Payload hash computation\n        //\n        // Based on the input body, set the payload_hash of the canonical request:\n        // Either:\n        // - compute a hash\n        // - use the precomputed hash\n        // - use `UnsignedPayload`\n        // - use `UnsignedPayload` for streaming requests\n        // - use `StreamingUnsignedPayloadTrailer` for streaming requests with trailers\n        // - use `StreamingSignedPayloadTrailer` for streaming requests with trailers\n        match body {\n            SignableBody::Bytes(data) => Cow::Owned(sha256_hex_string(data)),\n            SignableBody::Precomputed(digest) => Cow::Borrowed(digest.as_str()),\n            SignableBody::UnsignedPayload => Cow::Borrowed(UNSIGNED_PAYLOAD),\n            SignableBody::StreamingUnsignedPayloadTrailer => {\n                Cow::Borrowed(STREAMING_UNSIGNED_PAYLOAD_TRAILER)\n            }\n            SignableBody::StreamingSignedPayloadTrailer => {\n                Cow::Borrowed(STREAMING_SIGNED_PAYLOAD_TRAILER)\n            }\n        }\n    }\n\n    fn params(\n        uri: &Uri,\n        values: &SignatureValues<'_>,\n        settings: &SigningSettings,\n    ) -> Option<String> {\n        let mut params: Vec<(Cow<'_, str>, Cow<'_, str>)> =\n            form_urlencoded::parse(uri.query().unwrap_or_default().as_bytes()).collect();\n        fn add_param<'a>(params: &mut Vec<(Cow<'a, str>, Cow<'a, str>)>, k: &'a str, v: &'a str) {\n            params.push((Cow::Borrowed(k), Cow::Borrowed(v)));\n        }\n\n        if let SignatureValues::QueryParams(values) = values {\n            add_param(&mut params, param::X_AMZ_DATE, &values.date_time);\n            add_param(&mut params, param::X_AMZ_EXPIRES, &values.expires);\n\n            #[cfg(feature = \"sigv4a\")]\n            if let Some(regions) = values.region_set {\n                add_param(&mut params, sigv4a::param::X_AMZ_REGION_SET, regions);\n            }\n\n            add_param(&mut params, param::X_AMZ_ALGORITHM, values.algorithm);\n            add_param(&mut params, param::X_AMZ_CREDENTIAL, &values.credential);\n            add_param(\n                &mut params,\n                param::X_AMZ_SIGNED_HEADERS,\n                values.signed_headers.as_str(),\n            );\n\n            if let Some(security_token) = values.security_token {\n                add_param(\n                    &mut params,\n                    settings\n                        .session_token_name_override\n                        .unwrap_or(param::X_AMZ_SECURITY_TOKEN),\n                    security_token,\n                );\n            }\n        }\n\n        // Sort on the _encoded_ key/value pairs\n        let mut params: Vec<(String, String)> = params\n            .into_iter()\n            .map(|x| {\n                use aws_smithy_http::query::fmt_string;\n                let enc_k = fmt_string(&x.0);\n                let enc_v = fmt_string(&x.1);\n                (enc_k, enc_v)\n            })\n            .collect();\n\n        params.sort();\n\n        let mut query = QueryWriter::new(uri);\n        query.clear_params();\n        for (key, value) in params {\n            query.insert_encoded(&key, &value);\n        }\n\n        let query = query.build_query();\n        if query.is_empty() {\n            None\n        } else {\n            Some(query)\n        }\n    }\n\n    fn insert_host_header(\n        canonical_headers: &mut HeaderMap<HeaderValue>,\n        uri: &Uri,\n    ) -> HeaderValue {\n        match canonical_headers.get(&HOST) {\n            Some(header) => header.clone(),\n            None => {\n                let port = uri.port();\n                let scheme = uri.scheme();\n                let authority = uri\n                    .authority()\n                    .expect(\"request uri authority must be set for signing\")\n                    .as_str();\n                let host = uri\n                    .host()\n                    .expect(\"request uri host must be set for signing\");\n\n                // Check if port is default (80 for HTTP, 443 for HTTPS) and if so exclude it from the\n                // Host header when signing since RFC 2616 indicates that the default port should not be\n                // sent in the Host header (and Hyper strips default ports if they are present)\n                // https://datatracker.ietf.org/doc/html/rfc2616#section-14.23\n                // https://github.com/awslabs/aws-sdk-rust/issues/1244\n                let header_value = if is_port_scheme_default(scheme, port) {\n                    host\n                } else {\n                    authority\n                };\n\n                let header = HeaderValue::try_from(header_value)\n                    .expect(\"endpoint must contain valid header characters\");\n                canonical_headers.insert(HOST, header.clone());\n                header\n            }\n        }\n    }\n\n    fn insert_date_header(\n        canonical_headers: &mut HeaderMap<HeaderValue>,\n        date_time: &str,\n    ) -> HeaderValue {\n        let x_amz_date = HeaderName::from_static(header::X_AMZ_DATE);\n        let date_header = HeaderValue::try_from(date_time).expect(\"date is valid header value\");\n        canonical_headers.insert(x_amz_date, date_header.clone());\n        date_header\n    }\n\n    fn header_values_for(&self, key: impl AsHeaderName) -> String {\n        let values: Vec<&str> = self\n            .headers\n            .get_all(key)\n            .into_iter()\n            .map(|value| {\n                std::str::from_utf8(value.as_bytes())\n                    .expect(\"SDK request header values are valid UTF-8\")\n            })\n            .collect();\n        values.join(\",\")\n    }\n}\n\nimpl fmt::Display for CanonicalRequest<'_> {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        writeln!(f, \"{}\", self.method)?;\n        writeln!(f, \"{}\", self.path)?;\n        writeln!(f, \"{}\", self.params.as_deref().unwrap_or(\"\"))?;\n        // write out _all_ the headers\n        for header in &self.values.signed_headers().headers {\n            write!(f, \"{}:\", header.0.as_str())?;\n            writeln!(f, \"{}\", self.header_values_for(&header.0))?;\n        }\n        writeln!(f)?;\n        // write out the signed headers\n        writeln!(f, \"{}\", self.values.signed_headers().as_str())?;\n        write!(f, \"{}\", self.values.content_sha256())?;\n        Ok(())\n    }\n}\n\n/// Removes excess spaces before and after a given byte string, and converts multiple sequential\n/// spaces to a single space e.g. \"  Some  example   text  \" -> \"Some example text\".\n///\n/// This function ONLY affects spaces and not other kinds of whitespace.\nfn trim_all(text: &str) -> Cow<'_, str> {\n    let text = text.trim_matches(' ');\n    let requires_filter = text\n        .chars()\n        .zip(text.chars().skip(1))\n        .any(|(a, b)| a == ' ' && b == ' ');\n    if !requires_filter {\n        Cow::Borrowed(text)\n    } else {\n        // The normal trim function will trim non-breaking spaces and other various whitespace chars.\n        // S3 ONLY trims spaces so we use trim_matches to trim spaces only\n        Cow::Owned(\n            text.chars()\n                // Filter out consecutive spaces\n                .zip(text.chars().skip(1).chain(std::iter::once('!')))\n                .filter(|(a, b)| *a != ' ' || *b != ' ')\n                .map(|(a, _)| a)\n                .collect(),\n        )\n    }\n}\n\n/// Works just like [trim_all] but acts on HeaderValues instead of bytes.\n/// Will ensure that the underlying bytes are valid UTF-8.\nfn normalize_header_value(header_value: &str) -> Result<HeaderValue, CanonicalRequestError> {\n    let trimmed_value = trim_all(header_value);\n    HeaderValue::from_str(&trimmed_value).map_err(CanonicalRequestError::from)\n}\n\n#[inline]\nfn is_port_scheme_default(scheme: Option<&Scheme>, port: Option<Port<&str>>) -> bool {\n    if let (Some(scheme), Some(port)) = (scheme, port) {\n        return [(\"http\", \"80\"), (\"https\", \"443\")].contains(&(scheme.as_str(), port.as_str()));\n    }\n\n    false\n}\n\n#[derive(Debug, PartialEq, Default)]\npub(crate) struct SignedHeaders {\n    headers: Vec<CanonicalHeaderName>,\n    formatted: String,\n}\n\nimpl SignedHeaders {\n    fn new(mut headers: Vec<CanonicalHeaderName>) -> Self {\n        headers.sort();\n        let formatted = Self::fmt(&headers);\n        SignedHeaders { headers, formatted }\n    }\n\n    fn fmt(headers: &[CanonicalHeaderName]) -> String {\n        let mut value = String::new();\n        let mut iter = headers.iter().peekable();\n        while let Some(next) = iter.next() {\n            value += next.0.as_str();\n            if iter.peek().is_some() {\n                value.push(';');\n            }\n        }\n        value\n    }\n\n    pub(crate) fn as_str(&self) -> &str {\n        &self.formatted\n    }\n}\n\nimpl fmt::Display for SignedHeaders {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        write!(f, \"{}\", self.formatted)\n    }\n}\n\n#[derive(Debug, PartialEq, Eq, Clone)]\nstruct CanonicalHeaderName(HeaderName);\n\nimpl PartialOrd for CanonicalHeaderName {\n    fn partial_cmp(&self, other: &Self) -> Option<Ordering> {\n        Some(self.cmp(other))\n    }\n}\n\nimpl Ord for CanonicalHeaderName {\n    fn cmp(&self, other: &Self) -> Ordering {\n        self.0.as_str().cmp(other.0.as_str())\n    }\n}\n\n#[derive(PartialEq, Debug, Clone)]\npub(crate) struct SigningScope<'a> {\n    pub(crate) time: SystemTime,\n    pub(crate) region: &'a str,\n    pub(crate) service: &'a str,\n}\n\nimpl SigningScope<'_> {\n    pub(crate) fn v4a_display(&self) -> String {\n        format!(\"{}/{}/aws4_request\", format_date(self.time), self.service)\n    }\n}\n\nimpl fmt::Display for SigningScope<'_> {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        write!(\n            f,\n            \"{}/{}/{}/aws4_request\",\n            format_date(self.time),\n            self.region,\n            self.service\n        )\n    }\n}\n\n#[derive(PartialEq, Debug, Clone)]\npub(crate) struct StringToSign<'a> {\n    pub(crate) algorithm: &'static str,\n    pub(crate) scope: SigningScope<'a>,\n    pub(crate) time: SystemTime,\n    pub(crate) region: &'a str,\n    pub(crate) service: &'a str,\n    pub(crate) hashed_creq: &'a str,\n    signature_version: SignatureVersion,\n}\n\nimpl<'a> StringToSign<'a> {\n    pub(crate) fn new_v4(\n        time: SystemTime,\n        region: &'a str,\n        service: &'a str,\n        hashed_creq: &'a str,\n    ) -> Self {\n        let scope = SigningScope {\n            time,\n            region,\n            service,\n        };\n        Self {\n            algorithm: HMAC_SHA256,\n            scope,\n            time,\n            region,\n            service,\n            hashed_creq,\n            signature_version: SignatureVersion::V4,\n        }\n    }\n\n    #[cfg(feature = \"sigv4a\")]\n    pub(crate) fn new_v4a(\n        time: SystemTime,\n        region_set: &'a str,\n        service: &'a str,\n        hashed_creq: &'a str,\n    ) -> Self {\n        use crate::sign::v4a::ECDSA_256;\n\n        let scope = SigningScope {\n            time,\n            region: region_set,\n            service,\n        };\n        Self {\n            algorithm: ECDSA_256,\n            scope,\n            time,\n            region: region_set,\n            service,\n            hashed_creq,\n            signature_version: SignatureVersion::V4a,\n        }\n    }\n}\n\nimpl fmt::Display for StringToSign<'_> {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        write!(\n            f,\n            \"{}\\n{}\\n{}\\n{}\",\n            self.algorithm,\n            format_date_time(self.time),\n            match self.signature_version {\n                SignatureVersion::V4 => self.scope.to_string(),\n                SignatureVersion::V4a => self.scope.v4a_display(),\n            },\n            self.hashed_creq\n        )\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use crate::date_time::test_parsers::parse_date_time;\n    use crate::http_request::canonical_request::{\n        normalize_header_value, trim_all, CanonicalRequest, SigningScope, StringToSign,\n    };\n    use crate::http_request::test;\n    use crate::http_request::test::SigningSuiteTest;\n    use crate::http_request::{\n        PayloadChecksumKind, SessionTokenMode, SignableBody, SignableRequest, SignatureLocation,\n        SigningParams, SigningSettings,\n    };\n    use crate::sign::v4;\n    use crate::sign::v4::sha256_hex_string;\n    use aws_credential_types::Credentials;\n    use aws_smithy_http::query_writer::QueryWriter;\n    use aws_smithy_runtime_api::client::identity::Identity;\n    use http::{HeaderValue, Uri};\n    use pretty_assertions::assert_eq;\n    use proptest::{prelude::*, proptest};\n    use std::borrow::Cow;\n    use std::time::Duration;\n\n    fn signing_params(identity: &Identity, settings: SigningSettings) -> SigningParams<'_> {\n        v4::signing_params::Builder::default()\n            .identity(identity)\n            .region(\"test-region\")\n            .name(\"testservicename\")\n            .time(parse_date_time(\"20210511T154045Z\").unwrap())\n            .settings(settings)\n            .build()\n            .unwrap()\n            .into()\n    }\n\n    #[test]\n    fn test_repeated_header() {\n        let test = test::SigningSuiteTest::v4(\"get-vanilla-query-order-key-case\");\n        let mut req = test.request();\n        req.headers.push((\n            \"x-amz-object-attributes\".to_string(),\n            \"Checksum\".to_string(),\n        ));\n        req.headers.push((\n            \"x-amz-object-attributes\".to_string(),\n            \"ObjectSize\".to_string(),\n        ));\n        let req = SignableRequest::from(&req);\n        let settings = SigningSettings {\n            payload_checksum_kind: PayloadChecksumKind::XAmzSha256,\n            session_token_mode: SessionTokenMode::Exclude,\n            ..Default::default()\n        };\n        let identity = Credentials::for_tests().into();\n        let signing_params = signing_params(&identity, settings);\n        let creq = CanonicalRequest::from(&req, &signing_params).unwrap();\n\n        assert_eq!(\n            creq.values.signed_headers().to_string(),\n            \"host;x-amz-content-sha256;x-amz-date;x-amz-object-attributes\"\n        );\n        assert_eq!(\n            creq.header_values_for(\"x-amz-object-attributes\"),\n            \"Checksum,ObjectSize\",\n        );\n    }\n\n    #[test]\n    fn test_host_header_properly_handles_ports() {\n        fn host_header_test_setup(endpoint: String) -> String {\n            let test = SigningSuiteTest::v4(\"get-vanilla\");\n            let mut req = test.request();\n            req.uri = endpoint;\n            let req = SignableRequest::from(&req);\n            let settings = SigningSettings {\n                payload_checksum_kind: PayloadChecksumKind::XAmzSha256,\n                session_token_mode: SessionTokenMode::Exclude,\n                ..Default::default()\n            };\n            let identity = Credentials::for_tests().into();\n            let signing_params = signing_params(&identity, settings);\n            let creq = CanonicalRequest::from(&req, &signing_params).unwrap();\n            creq.header_values_for(\"host\")\n        }\n\n        // HTTP request with 80 port should not be signed with that port\n        let http_80_host_header = host_header_test_setup(\"http://localhost:80\".into());\n        assert_eq!(http_80_host_header, \"localhost\",);\n\n        // HTTP request with non-80 port should be signed with that port\n        let http_1234_host_header = host_header_test_setup(\"http://localhost:1234\".into());\n        assert_eq!(http_1234_host_header, \"localhost:1234\",);\n\n        // HTTPS request with 443 port should not be signed with that port\n        let https_443_host_header = host_header_test_setup(\"https://localhost:443\".into());\n        assert_eq!(https_443_host_header, \"localhost\",);\n\n        // HTTPS request with non-443 port should be signed with that port\n        let https_1234_host_header = host_header_test_setup(\"https://localhost:1234\".into());\n        assert_eq!(https_1234_host_header, \"localhost:1234\",);\n    }\n\n    #[test]\n    fn test_set_xamz_sha_256() {\n        let test = SigningSuiteTest::v4(\"get-vanilla-query-order-key-case\");\n        let req = test.request();\n        let req = SignableRequest::from(&req);\n        let settings = SigningSettings {\n            payload_checksum_kind: PayloadChecksumKind::XAmzSha256,\n            session_token_mode: SessionTokenMode::Exclude,\n            ..Default::default()\n        };\n        let identity = Credentials::for_tests().into();\n        let mut signing_params = signing_params(&identity, settings);\n        let creq = CanonicalRequest::from(&req, &signing_params).unwrap();\n        assert_eq!(\n            creq.values.content_sha256(),\n            \"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\"\n        );\n        // assert that the sha256 header was added\n        assert_eq!(\n            creq.values.signed_headers().as_str(),\n            \"host;x-amz-content-sha256;x-amz-date\"\n        );\n\n        signing_params.set_payload_checksum_kind(PayloadChecksumKind::NoHeader);\n        let creq = CanonicalRequest::from(&req, &signing_params).unwrap();\n        assert_eq!(creq.values.signed_headers().as_str(), \"host;x-amz-date\");\n    }\n\n    #[test]\n    fn test_unsigned_payload() {\n        let test = SigningSuiteTest::v4(\"get-vanilla-query-order-key-case\");\n        let mut req = test.request();\n        req.set_body(SignableBody::UnsignedPayload);\n        let req: SignableRequest<'_> = SignableRequest::from(&req);\n\n        let settings = SigningSettings {\n            payload_checksum_kind: PayloadChecksumKind::XAmzSha256,\n            ..Default::default()\n        };\n        let identity = Credentials::for_tests().into();\n        let signing_params = signing_params(&identity, settings);\n        let creq = CanonicalRequest::from(&req, &signing_params).unwrap();\n        assert_eq!(creq.values.content_sha256(), \"UNSIGNED-PAYLOAD\");\n        assert!(creq.to_string().ends_with(\"UNSIGNED-PAYLOAD\"));\n    }\n\n    #[test]\n    fn test_precomputed_payload() {\n        let payload_hash = \"44ce7dd67c959e0d3524ffac1771dfbba87d2b6b4b4e99e42034a8b803f8b072\";\n        let test = SigningSuiteTest::v4(\"get-vanilla-query-order-key-case\");\n        let mut req = test.request();\n        req.set_body(SignableBody::Precomputed(String::from(payload_hash)));\n        let req = SignableRequest::from(&req);\n        let settings = SigningSettings {\n            payload_checksum_kind: PayloadChecksumKind::XAmzSha256,\n            ..Default::default()\n        };\n        let identity = Credentials::for_tests().into();\n        let signing_params = signing_params(&identity, settings);\n        let creq = CanonicalRequest::from(&req, &signing_params).unwrap();\n        assert_eq!(creq.values.content_sha256(), payload_hash);\n        assert!(creq.to_string().ends_with(payload_hash));\n    }\n\n    #[test]\n    fn test_generate_scope() {\n        let expected = \"20150830/us-east-1/iam/aws4_request\\n\";\n        let scope = SigningScope {\n            time: parse_date_time(\"20150830T123600Z\").unwrap(),\n            region: \"us-east-1\",\n            service: \"iam\",\n        };\n        assert_eq!(format!(\"{}\\n\", scope), expected);\n    }\n\n    #[test]\n    fn test_string_to_sign() {\n        let time = parse_date_time(\"20150830T123600Z\").unwrap();\n        let test = SigningSuiteTest::v4(\"get-vanilla-query-order-key-case\");\n        let creq = test.canonical_request(SignatureLocation::Headers);\n        let expected_sts = test.string_to_sign(SignatureLocation::Headers);\n        let encoded = sha256_hex_string(creq.as_bytes());\n\n        let actual = StringToSign::new_v4(time, \"us-east-1\", \"service\", &encoded);\n        assert_eq!(expected_sts, actual.to_string());\n    }\n\n    #[test]\n    fn test_digest_of_canonical_request() {\n        let test = SigningSuiteTest::v4(\"get-vanilla-query-order-key-case\");\n        let creq = test.canonical_request(SignatureLocation::Headers);\n        let expected = \"816cd5b414d056048ba4f7c5386d6e0533120fb1fcfa93762cf0fc39e2cf19e0\";\n        let actual = sha256_hex_string(creq.as_bytes());\n        assert_eq!(expected, actual);\n    }\n\n    #[test]\n    fn test_double_url_encode_path() {\n        let test = SigningSuiteTest::v4(\"double-encode-path\");\n        let req = test.request();\n        let req = SignableRequest::from(&req);\n        let identity = Credentials::for_tests().into();\n        let signing_params = signing_params(&identity, SigningSettings::default());\n        let creq = CanonicalRequest::from(&req, &signing_params).unwrap();\n\n        let expected = test.canonical_request(SignatureLocation::Headers);\n        let actual = format!(\"{}\", creq);\n        assert_eq!(actual, expected);\n    }\n\n    #[test]\n    fn test_double_url_encode() {\n        let test = SigningSuiteTest::v4(\"double-url-encode\");\n        let req = test.request();\n        let req = SignableRequest::from(&req);\n        let identity = Credentials::for_tests().into();\n        let signing_params = signing_params(&identity, SigningSettings::default());\n        let creq = CanonicalRequest::from(&req, &signing_params).unwrap();\n        let expected = test.canonical_request(SignatureLocation::Headers);\n        let actual = format!(\"{}\", creq);\n        assert_eq!(actual, expected);\n    }\n\n    #[test]\n    fn test_tilde_in_uri() {\n        let req = http::Request::builder()\n            .uri(\"https://s3.us-east-1.amazonaws.com/my-bucket?list-type=2&prefix=~objprefix&single&k=&unreserved=-_.~\").body(\"\").unwrap().into();\n        let req = SignableRequest::from(&req);\n        let identity = Credentials::for_tests().into();\n        let signing_params = signing_params(&identity, SigningSettings::default());\n        let creq = CanonicalRequest::from(&req, &signing_params).unwrap();\n        assert_eq!(\n            Some(\"k=&list-type=2&prefix=~objprefix&single=&unreserved=-_.~\"),\n            creq.params.as_deref(),\n        );\n    }\n\n    #[test]\n    fn test_signing_urls_with_percent_encoded_query_strings() {\n        let all_printable_ascii_chars: String = (32u8..127).map(char::from).collect();\n        let uri = Uri::from_static(\"https://s3.us-east-1.amazonaws.com/my-bucket\");\n\n        let mut query_writer = QueryWriter::new(&uri);\n        query_writer.insert(\"list-type\", \"2\");\n        query_writer.insert(\"prefix\", &all_printable_ascii_chars);\n\n        let req = http::Request::builder()\n            .uri(query_writer.build_uri())\n            .body(\"\")\n            .unwrap()\n            .into();\n        let req = SignableRequest::from(&req);\n        let identity = Credentials::for_tests().into();\n        let signing_params = signing_params(&identity, SigningSettings::default());\n        let creq = CanonicalRequest::from(&req, &signing_params).unwrap();\n\n        let expected = \"list-type=2&prefix=%20%21%22%23%24%25%26%27%28%29%2A%2B%2C-.%2F0123456789%3A%3B%3C%3D%3E%3F%40ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5C%5D%5E_%60abcdefghijklmnopqrstuvwxyz%7B%7C%7D~\";\n        let actual = creq.params.unwrap();\n        assert_eq!(expected, actual);\n    }\n\n    #[test]\n    fn test_omit_session_token() {\n        let test = SigningSuiteTest::v4(\"get-vanilla-query-order-key-case\");\n        let req = test.request();\n        let req = SignableRequest::from(&req);\n        let settings = SigningSettings {\n            session_token_mode: SessionTokenMode::Include,\n            ..Default::default()\n        };\n        let identity = Credentials::for_tests_with_session_token().into();\n        let mut signing_params = signing_params(&identity, settings);\n\n        let creq = CanonicalRequest::from(&req, &signing_params).unwrap();\n        assert_eq!(\n            creq.values.signed_headers().as_str(),\n            \"host;x-amz-date;x-amz-security-token\"\n        );\n        assert_eq!(\n            creq.headers.get(\"x-amz-security-token\").unwrap(),\n            \"notarealsessiontoken\"\n        );\n\n        signing_params.set_session_token_mode(SessionTokenMode::Exclude);\n        let creq = CanonicalRequest::from(&req, &signing_params).unwrap();\n        assert_eq!(\n            creq.headers.get(\"x-amz-security-token\").unwrap(),\n            \"notarealsessiontoken\"\n        );\n        assert_eq!(creq.values.signed_headers().as_str(), \"host;x-amz-date\");\n    }\n\n    // It should exclude authorization, user-agent, x-amzn-trace-id, and transfer-encoding headers from presigning\n    #[test]\n    fn non_presigning_header_exclusion() {\n        let request = http::Request::builder()\n            .uri(\"https://some-endpoint.some-region.amazonaws.com\")\n            .header(\"authorization\", \"test-authorization\")\n            .header(\"content-type\", \"application/xml\")\n            .header(\"content-length\", \"0\")\n            .header(\"user-agent\", \"test-user-agent\")\n            .header(\"x-amzn-trace-id\", \"test-trace-id\")\n            .header(\"x-amz-user-agent\", \"test-user-agent\")\n            .header(\"transfer-encoding\", \"chunked\")\n            .body(\"\")\n            .unwrap()\n            .into();\n        let request = SignableRequest::from(&request);\n\n        let settings = SigningSettings {\n            signature_location: SignatureLocation::Headers,\n            ..Default::default()\n        };\n\n        let identity = Credentials::for_tests().into();\n        let signing_params = signing_params(&identity, settings);\n        let canonical = CanonicalRequest::from(&request, &signing_params).unwrap();\n\n        let values = canonical.values.as_headers().unwrap();\n        assert_eq!(\n            \"content-length;content-type;host;x-amz-date;x-amz-user-agent\",\n            values.signed_headers.as_str()\n        );\n    }\n\n    // It should exclude authorization, user-agent, x-amz-user-agent, x-amzn-trace-id, and transfer-encoding headers from presigning\n    #[test]\n    fn presigning_header_exclusion() {\n        let request = http::Request::builder()\n            .uri(\"https://some-endpoint.some-region.amazonaws.com\")\n            .header(\"authorization\", \"test-authorization\")\n            .header(\"content-type\", \"application/xml\")\n            .header(\"content-length\", \"0\")\n            .header(\"user-agent\", \"test-user-agent\")\n            .header(\"x-amzn-trace-id\", \"test-trace-id\")\n            .header(\"x-amz-user-agent\", \"test-user-agent\")\n            .header(\"transfer-encoding\", \"chunked\")\n            .body(\"\")\n            .unwrap()\n            .into();\n        let request = SignableRequest::from(&request);\n\n        let settings = SigningSettings {\n            signature_location: SignatureLocation::QueryParams,\n            expires_in: Some(Duration::from_secs(30)),\n            ..Default::default()\n        };\n\n        let identity = Credentials::for_tests().into();\n        let signing_params = signing_params(&identity, settings);\n        let canonical = CanonicalRequest::from(&request, &signing_params).unwrap();\n\n        let values = canonical.values.into_query_params().unwrap();\n        assert_eq!(\n            \"content-length;content-type;host\",\n            values.signed_headers.as_str()\n        );\n    }\n\n    #[allow(clippy::ptr_arg)] // The proptest macro requires this arg to be a Vec instead of a slice.\n    fn valid_input(input: &Vec<String>) -> bool {\n        [\n            \"content-length\".to_owned(),\n            \"content-type\".to_owned(),\n            \"host\".to_owned(),\n        ]\n        .iter()\n        .all(|element| !input.contains(element))\n    }\n\n    proptest! {\n        #[test]\n        fn presigning_header_exclusion_with_explicit_exclusion_list_specified(\n            excluded_headers in prop::collection::vec(\"[a-z]{1,20}\", 1..10).prop_filter(\n                \"`excluded_headers` should pass the `valid_input` check\",\n                valid_input,\n            )\n        ) {\n            let mut request_builder = http::Request::builder()\n                .uri(\"https://some-endpoint.some-region.amazonaws.com\")\n                .header(\"content-type\", \"application/xml\")\n                .header(\"content-length\", \"0\");\n            for key in &excluded_headers {\n                request_builder = request_builder.header(key, \"value\");\n            }\n            let request = request_builder.body(\"\").unwrap().into();\n\n            let request = SignableRequest::from(&request);\n\n            let settings = SigningSettings {\n                signature_location: SignatureLocation::QueryParams,\n                expires_in: Some(Duration::from_secs(30)),\n                excluded_headers: Some(\n                    excluded_headers\n                        .into_iter()\n                        .map(std::borrow::Cow::Owned)\n                        .collect(),\n                ),\n                ..Default::default()\n            };\n\n        let identity = Credentials::for_tests().into();\n        let signing_params = signing_params(&identity, settings);\n            let canonical = CanonicalRequest::from(&request, &signing_params).unwrap();\n\n            let values = canonical.values.into_query_params().unwrap();\n            assert_eq!(\n                \"content-length;content-type;host\",\n                values.signed_headers.as_str()\n            );\n        }\n    }\n\n    #[test]\n    fn test_trim_all_handles_spaces_correctly() {\n        assert_eq!(Cow::Borrowed(\"don't touch me\"), trim_all(\"don't touch me\"));\n        assert_eq!(\"trim left\", trim_all(\"   trim left\"));\n        assert_eq!(\"trim right\", trim_all(\"trim right \"));\n        assert_eq!(\"trim both\", trim_all(\"   trim both  \"));\n        assert_eq!(\"\", trim_all(\" \"));\n        assert_eq!(\"\", trim_all(\"  \"));\n        assert_eq!(\"a b\", trim_all(\" a   b \"));\n        assert_eq!(\"Some example text\", trim_all(\"  Some  example   text  \"));\n    }\n\n    #[test]\n    fn test_trim_all_ignores_other_forms_of_whitespace() {\n        // \\xA0 is a non-breaking space character\n        assert_eq!(\n            \"\\t\\u{A0}Some\\u{A0} example \\u{A0}text\\u{A0}\\n\",\n            trim_all(\"\\t\\u{A0}Some\\u{A0}     example   \\u{A0}text\\u{A0}\\n\")\n        );\n    }\n\n    #[test]\n    fn trim_spaces_works_on_single_characters() {\n        assert_eq!(trim_all(\"2\").as_ref(), \"2\");\n    }\n\n    proptest! {\n        #[test]\n        fn test_trim_all_doesnt_elongate_strings(s in \".*\") {\n            assert!(trim_all(&s).len() <= s.len())\n        }\n\n        #[test]\n        fn test_normalize_header_value_works_on_valid_header_value(v in (\".*\")) {\n            assert_eq!(normalize_header_value(&v).is_ok(), HeaderValue::from_str(&v).is_ok());\n        }\n\n        #[test]\n        fn test_trim_all_does_nothing_when_there_are_no_spaces(s in \"[^ ]*\") {\n            assert_eq!(trim_all(&s).as_ref(), s);\n        }\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/src/http_request/error.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse http::header::{InvalidHeaderName, InvalidHeaderValue};\nuse http::uri::InvalidUri;\nuse std::error::Error;\nuse std::fmt;\n\n#[derive(Debug)]\nenum SigningErrorKind {\n    FailedToCreateCanonicalRequest { source: CanonicalRequestError },\n    UnsupportedIdentityType,\n}\n\n/// Error signing request\n#[derive(Debug)]\npub struct SigningError {\n    kind: SigningErrorKind,\n}\n\nimpl SigningError {\n    pub(crate) fn unsupported_identity_type() -> Self {\n        Self {\n            kind: SigningErrorKind::UnsupportedIdentityType,\n        }\n    }\n}\n\nimpl fmt::Display for SigningError {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        match self.kind {\n            SigningErrorKind::FailedToCreateCanonicalRequest { .. } => {\n                write!(f, \"failed to create canonical request\")\n            }\n            SigningErrorKind::UnsupportedIdentityType => {\n                write!(f, \"only 'AWS credentials' are supported for signing\")\n            }\n        }\n    }\n}\n\nimpl Error for SigningError {\n    fn source(&self) -> Option<&(dyn Error + 'static)> {\n        match &self.kind {\n            SigningErrorKind::FailedToCreateCanonicalRequest { source } => Some(source),\n            SigningErrorKind::UnsupportedIdentityType => None,\n        }\n    }\n}\n\nimpl From<CanonicalRequestError> for SigningError {\n    fn from(source: CanonicalRequestError) -> Self {\n        Self {\n            kind: SigningErrorKind::FailedToCreateCanonicalRequest { source },\n        }\n    }\n}\n\n#[derive(Debug)]\nenum CanonicalRequestErrorKind {\n    InvalidHeaderName { source: InvalidHeaderName },\n    InvalidHeaderValue { source: InvalidHeaderValue },\n    InvalidUri { source: InvalidUri },\n    UnsupportedIdentityType,\n}\n\n#[derive(Debug)]\npub(crate) struct CanonicalRequestError {\n    kind: CanonicalRequestErrorKind,\n}\n\nimpl fmt::Display for CanonicalRequestError {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        use CanonicalRequestErrorKind::*;\n        match self.kind {\n            InvalidHeaderName { .. } => write!(f, \"invalid header name\"),\n            InvalidHeaderValue { .. } => write!(f, \"invalid header value\"),\n            InvalidUri { .. } => write!(f, \"the uri was invalid\"),\n            UnsupportedIdentityType => {\n                write!(f, \"only AWS credentials are supported for signing\")\n            }\n        }\n    }\n}\n\nimpl Error for CanonicalRequestError {\n    fn source(&self) -> Option<&(dyn Error + 'static)> {\n        use CanonicalRequestErrorKind::*;\n        match &self.kind {\n            InvalidHeaderName { source } => Some(source),\n            InvalidHeaderValue { source } => Some(source),\n            InvalidUri { source } => Some(source),\n            UnsupportedIdentityType => None,\n        }\n    }\n}\n\nimpl CanonicalRequestError {\n    pub(crate) fn unsupported_identity_type() -> Self {\n        Self {\n            kind: CanonicalRequestErrorKind::UnsupportedIdentityType,\n        }\n    }\n}\n\nimpl From<InvalidHeaderName> for CanonicalRequestError {\n    fn from(source: InvalidHeaderName) -> Self {\n        Self {\n            kind: CanonicalRequestErrorKind::InvalidHeaderName { source },\n        }\n    }\n}\n\nimpl From<InvalidHeaderValue> for CanonicalRequestError {\n    fn from(source: InvalidHeaderValue) -> Self {\n        Self {\n            kind: CanonicalRequestErrorKind::InvalidHeaderValue { source },\n        }\n    }\n}\n\nimpl From<InvalidUri> for CanonicalRequestError {\n    fn from(source: InvalidUri) -> Self {\n        Self {\n            kind: CanonicalRequestErrorKind::InvalidUri { source },\n        }\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/src/http_request/settings.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse http::header::{AUTHORIZATION, TRANSFER_ENCODING, USER_AGENT};\nuse std::borrow::Cow;\nuse std::time::Duration;\n\nconst HEADER_NAME_X_RAY_TRACE_ID: &str = \"x-amzn-trace-id\";\n\n/// HTTP-specific signing settings\n#[derive(Clone, Debug, PartialEq)]\n#[non_exhaustive]\npub struct SigningSettings {\n    /// Specifies how to encode the request URL when signing. Some services do not decode\n    /// the path prior to checking the signature, requiring clients to actually _double-encode_\n    /// the URI in creating the canonical request in order to pass a signature check.\n    pub percent_encoding_mode: PercentEncodingMode,\n\n    /// Add an additional checksum header\n    pub payload_checksum_kind: PayloadChecksumKind,\n\n    /// Where to put the signature\n    pub signature_location: SignatureLocation,\n\n    /// For presigned requests, how long the presigned request is valid for\n    pub expires_in: Option<Duration>,\n\n    /// Headers that should be excluded from the signing process\n    pub excluded_headers: Option<Vec<Cow<'static, str>>>,\n\n    /// Specifies whether the absolute path component of the URI should be normalized during signing.\n    pub uri_path_normalization_mode: UriPathNormalizationMode,\n\n    /// Some services require X-Amz-Security-Token to be included in the\n    /// canonical request. Other services require only it to be added after\n    /// calculating the signature.\n    pub session_token_mode: SessionTokenMode,\n\n    /// Some services require an alternative session token header or query param instead of\n    /// `x-amz-security-token` or `X-Amz-Security-Token`.\n    pub session_token_name_override: Option<&'static str>,\n}\n\n/// HTTP payload checksum type\n#[non_exhaustive]\n#[derive(Clone, Copy, Debug, Eq, PartialEq)]\npub enum PayloadChecksumKind {\n    /// Add x-amz-checksum-sha256 to the canonical request\n    ///\n    /// This setting is required for S3\n    XAmzSha256,\n\n    /// Do not add an additional header when creating the canonical request\n    ///\n    /// This is \"normal mode\" and will work for services other than S3\n    NoHeader,\n}\n\n/// Config value to specify how to encode the request URL when signing.\n///\n/// We assume the URI will be encoded _once_ prior to transmission. Some services\n/// do not decode the path prior to checking the signature, requiring clients to actually\n/// _double-encode_ the URI in creating the canonical request in order to pass a signature check.\n#[non_exhaustive]\n#[derive(Clone, Copy, Debug, Eq, PartialEq)]\npub enum PercentEncodingMode {\n    /// Re-encode the resulting URL (e.g. %30 becomes `%2530)\n    Double,\n\n    /// Take the resulting URL as-is\n    Single,\n}\n\n/// Config value to specify whether the canonical request's URI path should be normalized.\n/// <https://docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html>\n///\n/// URI path normalization is performed based on <https://www.rfc-editor.org/rfc/rfc3986>.\n#[non_exhaustive]\n#[derive(Clone, Copy, Debug, Eq, PartialEq)]\npub enum UriPathNormalizationMode {\n    /// Normalize the URI path according to RFC3986\n    Enabled,\n\n    /// Don't normalize the URI path (S3, for example, rejects normalized paths in some instances)\n    Disabled,\n}\n\nimpl From<bool> for UriPathNormalizationMode {\n    fn from(value: bool) -> Self {\n        if value {\n            UriPathNormalizationMode::Enabled\n        } else {\n            UriPathNormalizationMode::Disabled\n        }\n    }\n}\n\n/// Config value to specify whether X-Amz-Security-Token should be part of the canonical request.\n/// <http://docs.aws.amazon.com/general/latest/gr/sigv4-add-signature-to-request.html#temporary-security-credentials>\n#[non_exhaustive]\n#[derive(Clone, Copy, Debug, Eq, PartialEq)]\npub enum SessionTokenMode {\n    /// Include in the canonical request before calculating the signature.\n    Include,\n\n    /// Exclude in the canonical request.\n    Exclude,\n}\n\nimpl Default for SigningSettings {\n    fn default() -> Self {\n        // Headers that are potentially altered by proxies or as a part of standard service operations.\n        // Reference:\n        // Go SDK: <https://github.com/aws/aws-sdk-go/blob/v1.44.289/aws/signer/v4/v4.go#L92>\n        // Java SDK: <https://github.com/aws/aws-sdk-java-v2/blob/master/core/auth/src/main/java/software/amazon/awssdk/auth/signer/internal/AbstractAws4Signer.java#L70>\n        // JS SDK: <https://github.com/aws/aws-sdk-js/blob/master/lib/signers/v4.js#L191>\n        // There is no single source of truth for these available, so this uses the minimum common set of the excluded options.\n        // Instantiate this every time, because SigningSettings takes a Vec (which cannot be const);\n        let excluded_headers = Some(\n            [\n                // This header is calculated as part of the signing process, so if it's present, discard it\n                Cow::Borrowed(AUTHORIZATION.as_str()),\n                // Changes when sent by proxy\n                Cow::Borrowed(USER_AGENT.as_str()),\n                // Changes based on the request from the client\n                Cow::Borrowed(HEADER_NAME_X_RAY_TRACE_ID),\n                // Hop by hop header, can be erased by Cloudfront\n                Cow::Borrowed(TRANSFER_ENCODING.as_str()),\n            ]\n            .to_vec(),\n        );\n        Self {\n            percent_encoding_mode: PercentEncodingMode::Double,\n            payload_checksum_kind: PayloadChecksumKind::NoHeader,\n            signature_location: SignatureLocation::Headers,\n            expires_in: None,\n            excluded_headers,\n            uri_path_normalization_mode: UriPathNormalizationMode::Enabled,\n            session_token_mode: SessionTokenMode::Include,\n            session_token_name_override: None,\n        }\n    }\n}\n\n/// Where to place signing values in the HTTP request\n#[non_exhaustive]\n#[derive(Copy, Clone, Debug, Eq, PartialEq)]\npub enum SignatureLocation {\n    /// Place the signature in the request headers\n    Headers,\n    /// Place the signature in the request query parameters\n    QueryParams,\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/src/http_request/sign.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse super::error::SigningError;\nuse super::{PayloadChecksumKind, SignatureLocation};\nuse crate::http_request::canonical_request::header;\nuse crate::http_request::canonical_request::param;\nuse crate::http_request::canonical_request::{CanonicalRequest, StringToSign};\nuse crate::http_request::error::CanonicalRequestError;\nuse crate::http_request::SigningParams;\nuse crate::sign::v4;\n#[cfg(feature = \"sigv4a\")]\nuse crate::sign::v4a;\nuse crate::{SignatureVersion, SigningOutput};\nuse http::Uri;\nuse std::borrow::Cow;\nuse std::fmt::{Debug, Formatter};\nuse std::str;\n\nconst LOG_SIGNABLE_BODY: &str = \"LOG_SIGNABLE_BODY\";\n\n/// Represents all of the information necessary to sign an HTTP request.\n#[derive(Debug)]\n#[non_exhaustive]\npub struct SignableRequest<'a> {\n    method: &'a str,\n    uri: Uri,\n    headers: Vec<(&'a str, &'a str)>,\n    body: SignableBody<'a>,\n}\n\nimpl<'a> SignableRequest<'a> {\n    /// Creates a new `SignableRequest`.\n    ///\n    /// NOTE: The `uri` is expected to already in encoded form.\n    pub fn new(\n        method: &'a str,\n        uri: impl Into<Cow<'a, str>>,\n        headers: impl Iterator<Item = (&'a str, &'a str)>,\n        body: SignableBody<'a>,\n    ) -> Result<Self, SigningError> {\n        let uri = uri\n            .into()\n            .parse()\n            .map_err(|e| SigningError::from(CanonicalRequestError::from(e)))?;\n        let headers = headers.collect();\n        Ok(Self {\n            method,\n            uri,\n            headers,\n            body,\n        })\n    }\n\n    /// Returns the signable URI\n    pub(crate) fn uri(&self) -> &Uri {\n        &self.uri\n    }\n\n    /// Returns the signable HTTP method\n    pub(crate) fn method(&self) -> &str {\n        self.method\n    }\n\n    /// Returns the request headers\n    pub(crate) fn headers(&self) -> &[(&str, &str)] {\n        self.headers.as_slice()\n    }\n\n    /// Returns the signable body\n    pub fn body(&self) -> &SignableBody<'_> {\n        &self.body\n    }\n}\n\n/// A signable HTTP request body\n#[derive(Clone, Eq, PartialEq)]\n#[non_exhaustive]\npub enum SignableBody<'a> {\n    /// A body composed of a slice of bytes\n    Bytes(&'a [u8]),\n\n    /// An unsigned payload\n    ///\n    /// UnsignedPayload is used for streaming requests where the contents of the body cannot be\n    /// known prior to signing\n    UnsignedPayload,\n\n    /// A precomputed body checksum. The checksum should be a SHA256 checksum of the body,\n    /// lowercase hex encoded. Eg:\n    /// `e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855`\n    Precomputed(String),\n\n    /// Set when an unsigned streaming body has checksum trailers.\n    StreamingUnsignedPayloadTrailer,\n\n    /// Set when a signed streaming body has checksum trailers.\n    StreamingSignedPayloadTrailer,\n}\n\n/// Formats the value using the given formatter. To print the body data, set the environment variable `LOG_SIGNABLE_BODY=true`.\nimpl Debug for SignableBody<'_> {\n    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {\n        let should_log_signable_body = std::env::var(LOG_SIGNABLE_BODY)\n            .map(|v| v.eq_ignore_ascii_case(\"true\"))\n            .unwrap_or_default();\n        match self {\n            Self::Bytes(arg0) => {\n                if should_log_signable_body {\n                    f.debug_tuple(\"Bytes\").field(arg0).finish()\n                } else {\n                    let redacted = format!(\"** REDACTED **. To print {body_size} bytes of raw data, set environment variable `LOG_SIGNABLE_BODY=true`\", body_size = arg0.len());\n                    f.debug_tuple(\"Bytes\").field(&redacted).finish()\n                }\n            }\n            Self::UnsignedPayload => write!(f, \"UnsignedPayload\"),\n            Self::Precomputed(arg0) => f.debug_tuple(\"Precomputed\").field(arg0).finish(),\n            Self::StreamingUnsignedPayloadTrailer => {\n                write!(f, \"StreamingUnsignedPayloadTrailer\")\n            }\n            Self::StreamingSignedPayloadTrailer => {\n                write!(f, \"StreamingSignedPayloadTrailer\")\n            }\n        }\n    }\n}\n\nimpl SignableBody<'_> {\n    /// Create a new empty signable body\n    pub fn empty() -> SignableBody<'static> {\n        SignableBody::Bytes(&[])\n    }\n}\n\n/// Instructions for applying a signature to an HTTP request.\n#[derive(Debug)]\npub struct SigningInstructions {\n    headers: Vec<Header>,\n    params: Vec<(&'static str, Cow<'static, str>)>,\n}\n\n/// Header representation for use in [`SigningInstructions`]\npub struct Header {\n    key: &'static str,\n    value: String,\n    sensitive: bool,\n}\n\nimpl Debug for Header {\n    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {\n        let mut fmt = f.debug_struct(\"Header\");\n        fmt.field(\"key\", &self.key);\n        let value = if self.sensitive {\n            \"** REDACTED **\"\n        } else {\n            &self.value\n        };\n        fmt.field(\"value\", &value);\n        fmt.finish()\n    }\n}\n\nimpl Header {\n    /// The name of this header\n    pub fn name(&self) -> &'static str {\n        self.key\n    }\n\n    /// The value of this header\n    pub fn value(&self) -> &str {\n        &self.value\n    }\n\n    /// Whether this header has a sensitive value\n    pub fn sensitive(&self) -> bool {\n        self.sensitive\n    }\n}\n\nimpl SigningInstructions {\n    fn new(headers: Vec<Header>, params: Vec<(&'static str, Cow<'static, str>)>) -> Self {\n        Self { headers, params }\n    }\n\n    /// Returns the headers and query params that should be applied to this request\n    pub fn into_parts(self) -> (Vec<Header>, Vec<(&'static str, Cow<'static, str>)>) {\n        (self.headers, self.params)\n    }\n\n    /// Returns a reference to the headers that should be added to the request.\n    pub fn headers(&self) -> impl Iterator<Item = (&str, &str)> {\n        self.headers\n            .iter()\n            .map(|header| (header.key, header.value.as_str()))\n    }\n\n    /// Returns a reference to the query parameters that should be added to the request.\n    pub fn params(&self) -> &[(&str, Cow<'static, str>)] {\n        self.params.as_slice()\n    }\n\n    #[cfg(any(feature = \"http0-compat\", test))]\n    /// Applies the instructions to the given `request`.\n    pub fn apply_to_request_http0x<B>(self, request: &mut http0::Request<B>) {\n        let (new_headers, new_query) = self.into_parts();\n        for header in new_headers.into_iter() {\n            let mut value = http0::HeaderValue::from_str(&header.value).unwrap();\n            value.set_sensitive(header.sensitive);\n            request.headers_mut().insert(header.key, value);\n        }\n\n        if !new_query.is_empty() {\n            let mut query = aws_smithy_http::query_writer::QueryWriter::new_from_string(\n                &request.uri().to_string(),\n            )\n            .expect(\"unreachable: URI is valid\");\n            for (name, value) in new_query {\n                query.insert(name, &value);\n            }\n            let query_uri = query.build_uri().to_string();\n            let query_http0 = query_uri.parse::<http0::Uri>().expect(\"URI is valid\");\n            *request.uri_mut() = query_http0;\n        }\n    }\n\n    #[cfg(any(feature = \"http1\", test))]\n    /// Applies the instructions to the given `request`.\n    pub fn apply_to_request_http1x<B>(self, request: &mut http::Request<B>) {\n        // TODO(https://github.com/smithy-lang/smithy-rs/issues/3367): Update query writer to reduce\n        // allocations\n        let (new_headers, new_query) = self.into_parts();\n        for header in new_headers.into_iter() {\n            let mut value = http::HeaderValue::from_str(&header.value).unwrap();\n            value.set_sensitive(header.sensitive);\n            request.headers_mut().insert(header.key, value);\n        }\n\n        if !new_query.is_empty() {\n            let mut query = aws_smithy_http::query_writer::QueryWriter::new_from_string(\n                &request.uri().to_string(),\n            )\n            .expect(\"unreachable: URI is valid\");\n            for (name, value) in new_query {\n                query.insert(name, &value);\n            }\n            *request.uri_mut() = query\n                .build_uri()\n                .to_string()\n                .parse()\n                .expect(\"unreachable: URI is valid\");\n        }\n    }\n}\n\n/// Produces a signature for the given `request` and returns instructions\n/// that can be used to apply that signature to an HTTP request.\npub fn sign<'a>(\n    request: SignableRequest<'a>,\n    params: &'a SigningParams<'a>,\n) -> Result<SigningOutput<SigningInstructions>, SigningError> {\n    tracing::trace!(request = ?request, params = ?params, \"signing request\");\n    match params.settings().signature_location {\n        SignatureLocation::Headers => {\n            let (signing_headers, signature) =\n                calculate_signing_headers(&request, params)?.into_parts();\n            Ok(SigningOutput::new(\n                SigningInstructions::new(signing_headers, vec![]),\n                signature,\n            ))\n        }\n        SignatureLocation::QueryParams => {\n            let (params, signature) = calculate_signing_params(&request, params)?;\n            Ok(SigningOutput::new(\n                SigningInstructions::new(vec![], params),\n                signature,\n            ))\n        }\n    }\n}\n\ntype CalculatedParams = Vec<(&'static str, Cow<'static, str>)>;\n\nfn calculate_signing_params<'a>(\n    request: &'a SignableRequest<'a>,\n    params: &'a SigningParams<'a>,\n) -> Result<(CalculatedParams, String), SigningError> {\n    let creds = params.credentials()?;\n    let creq = CanonicalRequest::from(request, params)?;\n    let encoded_creq = &v4::sha256_hex_string(creq.to_string().as_bytes());\n\n    let (signature, string_to_sign) = match params {\n        SigningParams::V4(params) => {\n            let string_to_sign =\n                StringToSign::new_v4(params.time, params.region, params.name, encoded_creq)\n                    .to_string();\n            let signing_key = v4::generate_signing_key(\n                creds.secret_access_key(),\n                params.time,\n                params.region,\n                params.name,\n            );\n            let signature = v4::calculate_signature(signing_key, string_to_sign.as_bytes());\n            (signature, string_to_sign)\n        }\n        #[cfg(feature = \"sigv4a\")]\n        SigningParams::V4a(params) => {\n            let string_to_sign =\n                StringToSign::new_v4a(params.time, params.region_set, params.name, encoded_creq)\n                    .to_string();\n\n            let secret_key =\n                v4a::generate_signing_key(creds.access_key_id(), creds.secret_access_key());\n            let signature = v4a::calculate_signature(&secret_key, string_to_sign.as_bytes());\n            (signature, string_to_sign)\n        }\n    };\n    tracing::trace!(canonical_request = %creq, string_to_sign = %string_to_sign, \"calculated signing parameters\");\n\n    let values = creq.values.into_query_params().expect(\"signing with query\");\n    let mut signing_params = vec![\n        (param::X_AMZ_ALGORITHM, Cow::Borrowed(values.algorithm)),\n        (param::X_AMZ_CREDENTIAL, Cow::Owned(values.credential)),\n        (param::X_AMZ_DATE, Cow::Owned(values.date_time)),\n        (param::X_AMZ_EXPIRES, Cow::Owned(values.expires)),\n        (\n            param::X_AMZ_SIGNED_HEADERS,\n            Cow::Owned(values.signed_headers.as_str().into()),\n        ),\n        (param::X_AMZ_SIGNATURE, Cow::Owned(signature.clone())),\n    ];\n\n    #[cfg(feature = \"sigv4a\")]\n    if let Some(region_set) = params.region_set() {\n        if params.signature_version() == SignatureVersion::V4a {\n            signing_params.push((\n                crate::http_request::canonical_request::sigv4a::param::X_AMZ_REGION_SET,\n                Cow::Owned(region_set.to_owned()),\n            ));\n        }\n    }\n\n    if let Some(security_token) = creds.session_token() {\n        signing_params.push((\n            params\n                .settings()\n                .session_token_name_override\n                .unwrap_or(param::X_AMZ_SECURITY_TOKEN),\n            Cow::Owned(security_token.to_string()),\n        ));\n    }\n\n    Ok((signing_params, signature))\n}\n\n/// Calculates the signature headers that need to get added to the given `request`.\n///\n/// `request` MUST NOT contain any of the following headers:\n/// - x-amz-date\n/// - x-amz-content-sha-256\n/// - x-amz-security-token\nfn calculate_signing_headers<'a>(\n    request: &'a SignableRequest<'a>,\n    params: &'a SigningParams<'a>,\n) -> Result<SigningOutput<Vec<Header>>, SigningError> {\n    let creds = params.credentials()?;\n\n    // Step 1: https://docs.aws.amazon.com/en_pv/general/latest/gr/sigv4-create-canonical-request.html.\n    let creq = CanonicalRequest::from(request, params)?;\n    // Step 2: https://docs.aws.amazon.com/en_pv/general/latest/gr/sigv4-create-string-to-sign.html.\n    let encoded_creq = v4::sha256_hex_string(creq.to_string().as_bytes());\n    tracing::trace!(canonical_request = %creq);\n    let mut headers = vec![];\n\n    let signature = match params {\n        SigningParams::V4(params) => {\n            let sts = StringToSign::new_v4(\n                params.time,\n                params.region,\n                params.name,\n                encoded_creq.as_str(),\n            );\n\n            // Step 3: https://docs.aws.amazon.com/en_pv/general/latest/gr/sigv4-calculate-signature.html\n            let signing_key = v4::generate_signing_key(\n                creds.secret_access_key(),\n                params.time,\n                params.region,\n                params.name,\n            );\n            let signature = v4::calculate_signature(signing_key, sts.to_string().as_bytes());\n\n            // Step 4: https://docs.aws.amazon.com/en_pv/general/latest/gr/sigv4-add-signature-to-request.html\n            let values = creq.values.as_headers().expect(\"signing with headers\");\n            add_header(&mut headers, header::X_AMZ_DATE, &values.date_time, false);\n            headers.push(Header {\n                key: \"authorization\",\n                value: build_authorization_header(\n                    creds.access_key_id(),\n                    &creq,\n                    sts,\n                    &signature,\n                    SignatureVersion::V4,\n                ),\n                sensitive: false,\n            });\n            if params.settings.payload_checksum_kind == PayloadChecksumKind::XAmzSha256 {\n                add_header(\n                    &mut headers,\n                    header::X_AMZ_CONTENT_SHA_256,\n                    &values.content_sha256,\n                    false,\n                );\n            }\n\n            if let Some(security_token) = creds.session_token() {\n                add_header(\n                    &mut headers,\n                    params\n                        .settings\n                        .session_token_name_override\n                        .unwrap_or(header::X_AMZ_SECURITY_TOKEN),\n                    security_token,\n                    true,\n                );\n            }\n            signature\n        }\n        #[cfg(feature = \"sigv4a\")]\n        SigningParams::V4a(params) => {\n            let sts = StringToSign::new_v4a(\n                params.time,\n                params.region_set,\n                params.name,\n                encoded_creq.as_str(),\n            );\n\n            let signing_key =\n                v4a::generate_signing_key(creds.access_key_id(), creds.secret_access_key());\n            let signature = v4a::calculate_signature(&signing_key, sts.to_string().as_bytes());\n\n            let values = creq.values.as_headers().expect(\"signing with headers\");\n            add_header(&mut headers, header::X_AMZ_DATE, &values.date_time, false);\n            add_header(\n                &mut headers,\n                crate::http_request::canonical_request::sigv4a::header::X_AMZ_REGION_SET,\n                params.region_set,\n                false,\n            );\n\n            headers.push(Header {\n                key: \"authorization\",\n                value: build_authorization_header(\n                    creds.access_key_id(),\n                    &creq,\n                    sts,\n                    &signature,\n                    SignatureVersion::V4a,\n                ),\n                sensitive: false,\n            });\n            if params.settings.payload_checksum_kind == PayloadChecksumKind::XAmzSha256 {\n                add_header(\n                    &mut headers,\n                    header::X_AMZ_CONTENT_SHA_256,\n                    &values.content_sha256,\n                    false,\n                );\n            }\n\n            if let Some(security_token) = creds.session_token() {\n                add_header(\n                    &mut headers,\n                    header::X_AMZ_SECURITY_TOKEN,\n                    security_token,\n                    true,\n                );\n            }\n            signature\n        }\n    };\n\n    Ok(SigningOutput::new(headers, signature))\n}\n\nfn add_header(map: &mut Vec<Header>, key: &'static str, value: &str, sensitive: bool) {\n    map.push(Header {\n        key,\n        value: value.to_string(),\n        sensitive,\n    });\n}\n\n// add signature to authorization header\n// Authorization: algorithm Credential=access key ID/credential scope, SignedHeaders=SignedHeaders, Signature=signature\nfn build_authorization_header(\n    access_key: &str,\n    creq: &CanonicalRequest<'_>,\n    sts: StringToSign<'_>,\n    signature: &str,\n    signature_version: SignatureVersion,\n) -> String {\n    let scope = match signature_version {\n        SignatureVersion::V4 => sts.scope.to_string(),\n        SignatureVersion::V4a => sts.scope.v4a_display(),\n    };\n    format!(\n        \"{} Credential={}/{}, SignedHeaders={}, Signature={}\",\n        sts.algorithm,\n        access_key,\n        scope,\n        creq.values.signed_headers().as_str(),\n        signature\n    )\n}\n#[cfg(test)]\nmod tests {\n    use crate::date_time::test_parsers::parse_date_time;\n    use crate::http_request::sign::{add_header, SignableRequest};\n    use crate::http_request::test::SigningSuiteTest;\n    use crate::http_request::{\n        sign, SessionTokenMode, SignableBody, SignatureLocation, SigningInstructions,\n        SigningSettings,\n    };\n    use crate::sign::v4;\n    use aws_credential_types::Credentials;\n    use http::{HeaderValue, Request};\n    use pretty_assertions::assert_eq;\n    use proptest::proptest;\n    use std::borrow::Cow;\n    use std::iter;\n\n    macro_rules! assert_req_eq {\n        (http: $expected:expr, $actual:expr) => {\n            let mut expected = ($expected).map(|_b|\"body\");\n            let mut actual = ($actual).map(|_b|\"body\");\n            make_headers_comparable(&mut expected);\n            make_headers_comparable(&mut actual);\n            assert_eq!(format!(\"{:?}\", expected), format!(\"{:?}\", actual));\n        };\n        ($expected:tt, $actual:tt) => {\n            assert_req_eq!(http: ($expected).as_http_request(), $actual);\n        };\n    }\n\n    pub(crate) fn make_headers_comparable<B>(request: &mut Request<B>) {\n        for (_name, value) in request.headers_mut() {\n            value.set_sensitive(false);\n        }\n    }\n\n    // Sigv4A suite tests\n    #[cfg(feature = \"sigv4a\")]\n    mod v4a_suite {\n        use crate::http_request::test::v4a::run_test_suite_v4a;\n\n        #[test]\n        fn test_get_header_key_duplicate() {\n            run_test_suite_v4a(\"get-header-key-duplicate\")\n        }\n\n        #[test]\n        #[ignore = \"httpparse doesn't support parsing multiline headers since they are deprecated in RFC7230\"]\n        fn test_get_header_value_multiline() {\n            run_test_suite_v4a(\"get-header-value-multiline\")\n        }\n\n        #[test]\n        fn test_get_header_value_order() {\n            run_test_suite_v4a(\"get-header-value-order\")\n        }\n\n        #[test]\n        fn test_get_header_value_trim() {\n            run_test_suite_v4a(\"get-header-value-trim\");\n        }\n\n        #[test]\n        fn test_get_relative_normalized() {\n            run_test_suite_v4a(\"get-relative-normalized\");\n        }\n\n        #[test]\n        fn test_get_relative_relative_normalized() {\n            run_test_suite_v4a(\"get-relative-relative-normalized\");\n        }\n\n        #[test]\n        fn test_get_relative_relative_unnormalized() {\n            run_test_suite_v4a(\"get-relative-relative-unnormalized\");\n        }\n\n        #[test]\n        fn test_get_relative_unnormalized() {\n            run_test_suite_v4a(\"get-relative-unnormalized\");\n        }\n\n        #[test]\n        fn test_get_slash_dot_slash_normalized() {\n            run_test_suite_v4a(\"get-slash-dot-slash-normalized\");\n        }\n\n        #[test]\n        fn test_get_slash_dot_slash_unnormalized() {\n            run_test_suite_v4a(\"get-slash-dot-slash-unnormalized\");\n        }\n\n        #[test]\n        fn test_get_slash_normalized() {\n            run_test_suite_v4a(\"get-slash-normalized\");\n        }\n\n        #[test]\n        fn test_get_slash_pointless_dot_normalized() {\n            run_test_suite_v4a(\"get-slash-pointless-dot-normalized\");\n        }\n\n        #[test]\n        fn test_get_slash_pointless_dot_unnormalized() {\n            run_test_suite_v4a(\"get-slash-pointless-dot-unnormalized\");\n        }\n\n        #[test]\n        fn test_get_slash_unnormalized() {\n            run_test_suite_v4a(\"get-slash-unnormalized\");\n        }\n\n        #[test]\n        fn test_get_slashes_normalized() {\n            run_test_suite_v4a(\"get-slashes-normalized\");\n        }\n\n        #[test]\n        fn test_get_slashes_unnormalized() {\n            run_test_suite_v4a(\"get-slashes-unnormalized\");\n        }\n\n        #[test]\n        #[ignore = \"relies on single encode of path segments\"]\n        // rely on single encoding of path segments, i.e. string-to-sign contains %20 for spaces rather than %25%20 as it should.\n        // skipped until we add control over double_uri_encode in context.json\n        fn test_get_space_normalized() {\n            run_test_suite_v4a(\"get-space-normalized\");\n        }\n\n        #[test]\n        #[ignore = \"httpparse fails on unencoded spaces in path\"]\n        // the input request has unencoded space ' ' in the path which fails to parse\n        fn test_get_space_unnormalized() {\n            run_test_suite_v4a(\"get-space-unnormalized\");\n        }\n\n        #[test]\n        fn test_get_unreserved() {\n            run_test_suite_v4a(\"get-unreserved\");\n        }\n\n        #[test]\n        #[ignore = \"httparse fails on invalid uri character\"]\n        // relies on /ሴ canonicalized as /%E1%88%B4 when it should be /%25%E1%25%88%25%B4\n        fn test_get_utf8() {\n            run_test_suite_v4a(\"get-utf8\");\n        }\n\n        #[test]\n        fn test_get_vanilla() {\n            run_test_suite_v4a(\"get-vanilla\");\n        }\n\n        #[test]\n        fn test_get_vanilla_empty_query_key() {\n            run_test_suite_v4a(\"get-vanilla-empty-query-key\");\n        }\n\n        #[test]\n        fn test_get_vanilla_query() {\n            run_test_suite_v4a(\"get-vanilla-query\");\n        }\n\n        #[test]\n        fn test_get_vanilla_query_order_encoded() {\n            run_test_suite_v4a(\"get-vanilla-query-order-encoded\");\n        }\n\n        #[test]\n        fn test_get_vanilla_query_order_key_case() {\n            run_test_suite_v4a(\"get-vanilla-query-order-key-case\");\n        }\n\n        #[test]\n        fn test_get_vanilla_query_unreserved() {\n            run_test_suite_v4a(\"get-vanilla-query-unreserved\");\n        }\n\n        #[test]\n        #[ignore = \"httparse fails on invalid uri character\"]\n        // relies on /ሴ canonicalized as /%E1%88%B4 when it should be /%25%E1%25%88%25%B4\n        fn test_get_vanilla_utf8_query() {\n            run_test_suite_v4a(\"get-vanilla-utf8-query\");\n        }\n\n        #[test]\n        fn test_get_vanilla_with_session_token() {\n            run_test_suite_v4a(\"get-vanilla-with-session-token\")\n        }\n\n        #[test]\n        fn test_post_header_key_case() {\n            run_test_suite_v4a(\"post-header-key-case\");\n        }\n\n        #[test]\n        fn test_post_header_key_sort() {\n            run_test_suite_v4a(\"post-header-key-sort\");\n        }\n\n        #[test]\n        fn test_post_header_value_case() {\n            run_test_suite_v4a(\"post-header-value-case\");\n        }\n\n        #[test]\n        fn test_post_sts_header_after() {\n            run_test_suite_v4a(\"post-sts-header-after\");\n        }\n\n        #[test]\n        fn test_post_sts_header_before() {\n            run_test_suite_v4a(\"post-sts-header-before\");\n        }\n\n        #[test]\n        fn test_post_vanilla() {\n            run_test_suite_v4a(\"post-vanilla\");\n        }\n\n        #[test]\n        fn test_post_vanilla_empty_query_value() {\n            run_test_suite_v4a(\"post-vanilla-empty-query-value\");\n        }\n\n        #[test]\n        fn test_post_vanilla_query() {\n            run_test_suite_v4a(\"post-vanilla-query\");\n        }\n\n        #[test]\n        fn test_post_x_www_form_urlencoded() {\n            run_test_suite_v4a(\"post-x-www-form-urlencoded\");\n        }\n\n        #[test]\n        fn test_post_x_www_form_urlencoded_parameters() {\n            run_test_suite_v4a(\"post-x-www-form-urlencoded-parameters\");\n        }\n    }\n\n    #[test]\n    fn test_sign_url_escape() {\n        let test = SigningSuiteTest::v4(\"double-encode-path\");\n        let settings = SigningSettings::default();\n        let identity = &Credentials::for_tests().into();\n        let params = v4::SigningParams {\n            identity,\n            region: \"us-east-1\",\n            name: \"service\",\n            time: parse_date_time(\"20150830T123600Z\").unwrap(),\n            settings,\n        }\n        .into();\n\n        let original = test.request();\n        let signable = SignableRequest::from(&original);\n        let out = sign(signable, &params).unwrap();\n        assert_eq!(\n            \"57d157672191bac40bae387e48bbe14b15303c001fdbb01f4abf295dccb09705\",\n            out.signature\n        );\n\n        let mut signed = original.as_http_request();\n        out.output.apply_to_request_http1x(&mut signed);\n\n        let expected = test.signed_request(SignatureLocation::Headers);\n        assert_req_eq!(expected, signed);\n    }\n\n    #[test]\n    fn test_sign_headers_utf8() {\n        let settings = SigningSettings::default();\n        let identity = &Credentials::for_tests().into();\n        let params = v4::SigningParams {\n            identity,\n            region: \"us-east-1\",\n            name: \"service\",\n            time: parse_date_time(\"20150830T123600Z\").unwrap(),\n            settings,\n        }\n        .into();\n\n        let original = http::Request::builder()\n            .uri(\"https://some-endpoint.some-region.amazonaws.com\")\n            .header(\"some-header\", HeaderValue::from_str(\"テスト\").unwrap())\n            .body(\"\")\n            .unwrap()\n            .into();\n        let signable = SignableRequest::from(&original);\n        let out = sign(signable, &params).unwrap();\n        assert_eq!(\n            \"55e16b31f9bde5fd04f9d3b780dd2b5e5f11a5219001f91a8ca9ec83eaf1618f\",\n            out.signature\n        );\n\n        let mut signed = original.as_http_request();\n        out.output.apply_to_request_http1x(&mut signed);\n\n        let expected = http::Request::builder()\n            .uri(\"https://some-endpoint.some-region.amazonaws.com\")\n            .header(\"some-header\", HeaderValue::from_str(\"テスト\").unwrap())\n            .header(\n                \"x-amz-date\",\n                HeaderValue::from_str(\"20150830T123600Z\").unwrap(),\n            )\n            .header(\n                \"authorization\",\n                HeaderValue::from_str(\n                    \"AWS4-HMAC-SHA256 \\\n                        Credential=ANOTREAL/20150830/us-east-1/service/aws4_request, \\\n                        SignedHeaders=host;some-header;x-amz-date, \\\n                        Signature=55e16b31f9bde5fd04f9d3b780dd2b5e5f11a5219001f91a8ca9ec83eaf1618f\",\n                )\n                .unwrap(),\n            )\n            .body(\"\")\n            .unwrap();\n        assert_req_eq!(http: expected, signed);\n    }\n\n    #[test]\n    fn test_sign_headers_excluding_session_token() {\n        let settings = SigningSettings {\n            session_token_mode: SessionTokenMode::Exclude,\n            ..Default::default()\n        };\n        let identity = &Credentials::for_tests_with_session_token().into();\n        let params = v4::SigningParams {\n            identity,\n            region: \"us-east-1\",\n            name: \"service\",\n            time: parse_date_time(\"20150830T123600Z\").unwrap(),\n            settings,\n        }\n        .into();\n\n        let original = http::Request::builder()\n            .uri(\"https://some-endpoint.some-region.amazonaws.com\")\n            .body(\"\")\n            .unwrap()\n            .into();\n        let out_without_session_token = sign(SignableRequest::from(&original), &params).unwrap();\n\n        let out_with_session_token_but_excluded =\n            sign(SignableRequest::from(&original), &params).unwrap();\n        assert_eq!(\n            \"ab32de057edf094958d178b3c91f3c8d5c296d526b11da991cd5773d09cea560\",\n            out_with_session_token_but_excluded.signature\n        );\n        assert_eq!(\n            out_with_session_token_but_excluded.signature,\n            out_without_session_token.signature\n        );\n\n        let mut signed = original.as_http_request();\n        out_with_session_token_but_excluded\n            .output\n            .apply_to_request_http1x(&mut signed);\n\n        let expected = http::Request::builder()\n            .uri(\"https://some-endpoint.some-region.amazonaws.com\")\n            .header(\n                \"x-amz-date\",\n                HeaderValue::from_str(\"20150830T123600Z\").unwrap(),\n            )\n            .header(\n                \"authorization\",\n                HeaderValue::from_str(\n                    \"AWS4-HMAC-SHA256 \\\n                        Credential=ANOTREAL/20150830/us-east-1/service/aws4_request, \\\n                        SignedHeaders=host;x-amz-date, \\\n                        Signature=ab32de057edf094958d178b3c91f3c8d5c296d526b11da991cd5773d09cea560\",\n                )\n                .unwrap(),\n            )\n            .header(\n                \"x-amz-security-token\",\n                HeaderValue::from_str(\"notarealsessiontoken\").unwrap(),\n            )\n            .body(b\"\")\n            .unwrap();\n        assert_req_eq!(http: expected, signed);\n    }\n\n    #[test]\n    fn test_sign_headers_space_trimming() {\n        let settings = SigningSettings::default();\n        let identity = &Credentials::for_tests().into();\n        let params = v4::SigningParams {\n            identity,\n            region: \"us-east-1\",\n            name: \"service\",\n            time: parse_date_time(\"20150830T123600Z\").unwrap(),\n            settings,\n        }\n        .into();\n\n        let original = http::Request::builder()\n            .uri(\"https://some-endpoint.some-region.amazonaws.com\")\n            .header(\n                \"some-header\",\n                HeaderValue::from_str(\"  test  test   \").unwrap(),\n            )\n            .body(\"\")\n            .unwrap()\n            .into();\n        let signable = SignableRequest::from(&original);\n        let out = sign(signable, &params).unwrap();\n        assert_eq!(\n            \"244f2a0db34c97a528f22715fe01b2417b7750c8a95c7fc104a3c48d81d84c08\",\n            out.signature\n        );\n\n        let mut signed = original.as_http_request();\n        out.output.apply_to_request_http1x(&mut signed);\n\n        let expected = http::Request::builder()\n            .uri(\"https://some-endpoint.some-region.amazonaws.com\")\n            .header(\n                \"some-header\",\n                HeaderValue::from_str(\"  test  test   \").unwrap(),\n            )\n            .header(\n                \"x-amz-date\",\n                HeaderValue::from_str(\"20150830T123600Z\").unwrap(),\n            )\n            .header(\n                \"authorization\",\n                HeaderValue::from_str(\n                    \"AWS4-HMAC-SHA256 \\\n                        Credential=ANOTREAL/20150830/us-east-1/service/aws4_request, \\\n                        SignedHeaders=host;some-header;x-amz-date, \\\n                        Signature=244f2a0db34c97a528f22715fe01b2417b7750c8a95c7fc104a3c48d81d84c08\",\n                )\n                .unwrap(),\n            )\n            .body(\"\")\n            .unwrap();\n        assert_req_eq!(http: expected, signed);\n    }\n\n    proptest! {\n        #[test]\n        // Only byte values between 32 and 255 (inclusive) are permitted, excluding byte 127, for\n        // [HeaderValue](https://docs.rs/http/latest/http/header/struct.HeaderValue.html#method.from_bytes).\n        fn test_sign_headers_no_panic(\n            header in \".*\"\n        ) {\n            let settings = SigningSettings::default();\n        let identity = &Credentials::for_tests().into();\n        let params = v4::SigningParams {\n            identity,\n                region: \"us-east-1\",\n                name: \"foo\",\n                time: std::time::SystemTime::UNIX_EPOCH,\n                settings,\n            }.into();\n\n            let req = SignableRequest::new(\n                \"GET\",\n                \"https://foo.com\",\n                iter::once((\"x-sign-me\", header.as_str())),\n                SignableBody::Bytes(&[])\n            );\n\n            if let Ok(req) = req {\n                // The test considered a pass if the creation of `creq` does not panic.\n                let _creq = crate::http_request::sign(req, &params);\n            }\n        }\n    }\n\n    #[test]\n    fn apply_signing_instructions_headers() {\n        let mut headers = vec![];\n        add_header(&mut headers, \"some-header\", \"foo\", false);\n        add_header(&mut headers, \"some-other-header\", \"bar\", false);\n        let instructions = SigningInstructions::new(headers, vec![]);\n\n        let mut request = http::Request::builder()\n            .uri(\"https://some-endpoint.some-region.amazonaws.com\")\n            .body(\"\")\n            .unwrap();\n\n        instructions.apply_to_request_http1x(&mut request);\n\n        let get_header = |n: &str| request.headers().get(n).unwrap().to_str().unwrap();\n        assert_eq!(\"foo\", get_header(\"some-header\"));\n        assert_eq!(\"bar\", get_header(\"some-other-header\"));\n    }\n\n    #[test]\n    fn apply_signing_instructions_query_params() {\n        let params = vec![\n            (\"some-param\", Cow::Borrowed(\"f&o?o\")),\n            (\"some-other-param?\", Cow::Borrowed(\"bar\")),\n        ];\n        let instructions = SigningInstructions::new(vec![], params);\n\n        let mut request = http::Request::builder()\n            .uri(\"https://some-endpoint.some-region.amazonaws.com/some/path\")\n            .body(\"\")\n            .unwrap();\n\n        instructions.apply_to_request_http1x(&mut request);\n\n        assert_eq!(\n            \"/some/path?some-param=f%26o%3Fo&some-other-param%3F=bar\",\n            request.uri().path_and_query().unwrap().to_string()\n        );\n    }\n\n    #[test]\n    fn apply_signing_instructions_query_params_http_1x() {\n        let params = vec![\n            (\"some-param\", Cow::Borrowed(\"f&o?o\")),\n            (\"some-other-param?\", Cow::Borrowed(\"bar\")),\n        ];\n        let instructions = SigningInstructions::new(vec![], params);\n\n        let mut request = http::Request::builder()\n            .uri(\"https://some-endpoint.some-region.amazonaws.com/some/path\")\n            .body(\"\")\n            .unwrap();\n\n        instructions.apply_to_request_http1x(&mut request);\n\n        assert_eq!(\n            \"/some/path?some-param=f%26o%3Fo&some-other-param%3F=bar\",\n            request.uri().path_and_query().unwrap().to_string()\n        );\n    }\n\n    #[test]\n    fn test_debug_signable_body() {\n        let sut = SignableBody::Bytes(b\"hello signable body\");\n        assert_eq!(\n            \"Bytes(\\\"** REDACTED **. To print 19 bytes of raw data, set environment variable `LOG_SIGNABLE_BODY=true`\\\")\",\n            format!(\"{sut:?}\")\n        );\n\n        let sut = SignableBody::UnsignedPayload;\n        assert_eq!(\"UnsignedPayload\", format!(\"{sut:?}\"));\n\n        let sut = SignableBody::Precomputed(\"precomputed\".to_owned());\n        assert_eq!(\"Precomputed(\\\"precomputed\\\")\", format!(\"{sut:?}\"));\n\n        let sut = SignableBody::StreamingUnsignedPayloadTrailer;\n        assert_eq!(\"StreamingUnsignedPayloadTrailer\", format!(\"{sut:?}\"));\n    }\n\n    // v4 test suite\n    mod v4_suite {\n        use crate::http_request::test::run_test_suite_v4;\n\n        #[test]\n        fn test_get_header_key_duplicate() {\n            run_test_suite_v4(\"get-header-key-duplicate\");\n        }\n\n        #[test]\n        #[ignore = \"httpparse doesn't support parsing multiline headers since they are deprecated in RFC7230\"]\n        fn test_get_header_value_multiline() {\n            run_test_suite_v4(\"get-header-value-multiline\");\n        }\n\n        #[test]\n        fn test_get_header_value_order() {\n            run_test_suite_v4(\"get-header-value-order\");\n        }\n\n        #[test]\n        fn test_get_header_value_trim() {\n            run_test_suite_v4(\"get-header-value-trim\");\n        }\n\n        #[test]\n        fn test_get_relative_normalized() {\n            run_test_suite_v4(\"get-relative-normalized\");\n        }\n\n        #[test]\n        fn test_get_relative_relative_normalized() {\n            run_test_suite_v4(\"get-relative-relative-normalized\");\n        }\n\n        #[test]\n        fn test_get_relative_relative_unnormalized() {\n            run_test_suite_v4(\"get-relative-relative-unnormalized\");\n        }\n\n        #[test]\n        fn test_get_relative_unnormalized() {\n            run_test_suite_v4(\"get-relative-unnormalized\");\n        }\n\n        #[test]\n        fn test_get_slash_dot_slash_normalized() {\n            run_test_suite_v4(\"get-slash-dot-slash-normalized\");\n        }\n\n        #[test]\n        fn test_get_slash_dot_slash_unnormalized() {\n            run_test_suite_v4(\"get-slash-dot-slash-unnormalized\");\n        }\n\n        #[test]\n        fn test_get_slash_normalized() {\n            run_test_suite_v4(\"get-slash-normalized\");\n        }\n\n        #[test]\n        fn test_get_slash_pointless_dot_normalized() {\n            run_test_suite_v4(\"get-slash-pointless-dot-normalized\");\n        }\n\n        #[test]\n        fn test_get_slash_pointless_dot_unnormalized() {\n            run_test_suite_v4(\"get-slash-pointless-dot-unnormalized\");\n        }\n\n        #[test]\n        fn test_get_slash_unnormalized() {\n            run_test_suite_v4(\"get-slash-unnormalized\");\n        }\n\n        #[test]\n        fn test_get_slashes_normalized() {\n            run_test_suite_v4(\"get-slashes-normalized\");\n        }\n\n        #[test]\n        fn test_get_slashes_unnormalized() {\n            run_test_suite_v4(\"get-slashes-unnormalized\");\n        }\n\n        #[test]\n        #[ignore = \"relies on single encode of path segments\"]\n        // rely on single encoding of path segments, i.e. string-to-sign contains %20 for spaces rather than %25%20 as it should.\n        // skipped until we add control over double_uri_encode in context.json\n        fn test_get_space_normalized() {\n            run_test_suite_v4(\"get-space-normalized\");\n        }\n\n        #[test]\n        #[ignore = \"httpparse fails on unencoded spaces in path\"]\n        // the input request has unencoded space ' ' in the path which fails to parse\n        fn test_get_space_unnormalized() {\n            run_test_suite_v4(\"get-space-unnormalized\");\n        }\n\n        #[test]\n        fn test_get_unreserved() {\n            run_test_suite_v4(\"get-unreserved\");\n        }\n\n        #[test]\n        #[ignore = \"httparse fails on invalid uri character\"]\n        // relies on /ሴ canonicalized as /%E1%88%B4 when it should be /%25%E1%25%88%25%B4\n        fn test_get_utf8() {\n            run_test_suite_v4(\"get-utf8\");\n        }\n\n        #[test]\n        fn test_get_vanilla() {\n            run_test_suite_v4(\"get-vanilla\");\n        }\n\n        #[test]\n        fn test_get_vanilla_empty_query_key() {\n            run_test_suite_v4(\"get-vanilla-empty-query-key\");\n        }\n\n        #[test]\n        fn test_get_vanilla_query() {\n            run_test_suite_v4(\"get-vanilla-query\");\n        }\n\n        #[test]\n        fn test_get_vanilla_query_order_encoded() {\n            run_test_suite_v4(\"get-vanilla-query-order-encoded\");\n        }\n\n        #[test]\n        fn test_get_vanilla_query_order_key_case() {\n            run_test_suite_v4(\"get-vanilla-query-order-key-case\");\n        }\n\n        #[test]\n        fn test_get_vanilla_query_unreserved() {\n            run_test_suite_v4(\"get-vanilla-query-unreserved\");\n        }\n\n        #[test]\n        #[ignore = \"httparse fails on invalid uri character\"]\n        // relies on /ሴ canonicalized as /%E1%88%B4 when it should be /%25%E1%25%88%25%B4\n        fn test_get_vanilla_utf8_query() {\n            run_test_suite_v4(\"get-vanilla-utf8-query\");\n        }\n\n        #[test]\n        fn test_get_vanilla_with_session_token() {\n            run_test_suite_v4(\"get-vanilla-with-session-token\");\n        }\n\n        #[test]\n        fn test_post_header_key_case() {\n            run_test_suite_v4(\"post-header-key-case\");\n        }\n\n        #[test]\n        fn test_post_header_key_sort() {\n            run_test_suite_v4(\"post-header-key-sort\");\n        }\n\n        #[test]\n        fn test_post_header_value_case() {\n            run_test_suite_v4(\"post-header-value-case\");\n        }\n\n        #[test]\n        fn test_post_sts_header_after() {\n            run_test_suite_v4(\"post-sts-header-after\");\n        }\n\n        #[test]\n        fn test_post_sts_header_before() {\n            run_test_suite_v4(\"post-sts-header-before\");\n        }\n\n        #[test]\n        fn test_post_vanilla() {\n            run_test_suite_v4(\"post-vanilla\");\n        }\n\n        #[test]\n        fn test_post_vanilla_empty_query_value() {\n            run_test_suite_v4(\"post-vanilla-empty-query-value\");\n        }\n\n        #[test]\n        fn test_post_vanilla_query() {\n            run_test_suite_v4(\"post-vanilla-query\");\n        }\n\n        #[test]\n        fn test_post_x_www_form_urlencoded() {\n            run_test_suite_v4(\"post-x-www-form-urlencoded\");\n        }\n\n        #[test]\n        fn test_post_x_www_form_urlencoded_parameters() {\n            run_test_suite_v4(\"post-x-www-form-urlencoded-parameters\");\n        }\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/src/http_request/test.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Functions shared between the tests of several modules.\n\nuse crate::http_request::canonical_request::{CanonicalRequest, StringToSign};\nuse crate::http_request::{\n    PayloadChecksumKind, SessionTokenMode, SignableBody, SignableRequest, SignatureLocation,\n    SigningSettings,\n};\nuse aws_credential_types::Credentials;\nuse aws_smithy_runtime_api::client::identity::Identity;\nuse http::Uri;\nuse std::borrow::Cow;\nuse std::error::Error as StdError;\nuse std::time::{Duration, SystemTime};\nuse time::format_description::well_known::Rfc3339;\nuse time::OffsetDateTime;\n\n/// Common test suite collection\n#[derive(Debug, Clone, Copy, Eq, PartialEq)]\nenum Collection {\n    V4,\n    V4A,\n}\n\n/// A test from the common CRT test suite\n#[derive(Debug, Clone)]\npub(crate) struct SigningSuiteTest {\n    test_name: &'static str,\n    collection: Collection,\n}\n\nimpl SigningSuiteTest {\n    /// Create a new test from the V4 test suite\n    pub(crate) fn v4(test_name: &'static str) -> Self {\n        Self {\n            test_name,\n            collection: Collection::V4,\n        }\n    }\n\n    /// Create a new test from the V4a test suite\n    pub(crate) fn v4a(test_name: &'static str) -> Self {\n        Self {\n            test_name,\n            collection: Collection::V4A,\n        }\n    }\n\n    /// Get the path to a file in this test suite directory\n    fn path(&self, filename: &str) -> String {\n        let dir = match self.collection {\n            Collection::V4 => \"v4\",\n            Collection::V4A => \"v4a\",\n        };\n        format!(\"aws-signing-test-suite/{dir}/{}/{filename}\", self.test_name)\n    }\n\n    /// Get the HTTP request for the test\n    pub(crate) fn request(&self) -> TestRequest {\n        test_parsed_request(&self.path(\"request.txt\"))\n    }\n\n    /// Get the signed HTTP request for the test\n    pub(crate) fn signed_request(&self, signature_location: SignatureLocation) -> TestRequest {\n        match signature_location {\n            SignatureLocation::QueryParams => {\n                test_parsed_request(&self.path(\"query-signed-request.txt\"))\n            }\n            SignatureLocation::Headers => {\n                test_parsed_request(&self.path(\"header-signed-request.txt\"))\n            }\n        }\n    }\n\n    /// Get the canonical request for the test\n    pub(crate) fn canonical_request(&self, signature_location: SignatureLocation) -> String {\n        match signature_location {\n            SignatureLocation::QueryParams => read(&self.path(\"query-canonical-request.txt\")),\n            SignatureLocation::Headers => read(&self.path(\"header-canonical-request.txt\")),\n        }\n    }\n\n    /// Get the string to sign for the test\n    pub(crate) fn string_to_sign(&self, signature_location: SignatureLocation) -> String {\n        match signature_location {\n            SignatureLocation::QueryParams => read(&self.path(\"query-string-to-sign.txt\")),\n            SignatureLocation::Headers => read(&self.path(\"header-string-to-sign.txt\")),\n        }\n    }\n\n    /// Get the signature for the test\n    pub(crate) fn signature(&self, signature_location: SignatureLocation) -> String {\n        match signature_location {\n            SignatureLocation::QueryParams => read(&self.path(\"query-signature.txt\")),\n            SignatureLocation::Headers => read(&self.path(\"header-signature.txt\")),\n        }\n    }\n\n    /// Get the test context for the test\n    pub(crate) fn context(&self) -> TestContext {\n        let context = read(&self.path(\"context.json\"));\n        let tc_builder: TestContextBuilder = serde_json::from_str(&context).unwrap();\n        tc_builder.build()\n    }\n}\n\nfn test_parsed_request(path: &str) -> TestRequest {\n    match parse_request(read(path).as_bytes()) {\n        Ok(parsed) => parsed,\n        Err(err) => panic!(\"Failed to parse {}: {}\", path, err),\n    }\n}\n\nfn new_v4_signing_params_from_context(\n    test_context: &'_ TestContext,\n    signature_location: SignatureLocation,\n) -> crate::http_request::SigningParams<'_> {\n    let mut params = crate::sign::v4::SigningParams::from(test_context);\n    params.settings.signature_location = signature_location;\n    params.into()\n}\n\n/// Run the given test from the v4 suite for both header and query\n/// signature locations\npub(crate) fn run_test_suite_v4(test_name: &'static str) {\n    run_v4_test(test_name, SignatureLocation::Headers);\n    run_v4_test(test_name, SignatureLocation::QueryParams);\n}\n\nfn assert_uri_eq(expected: &Uri, actual: &Uri) {\n    assert_eq!(expected.scheme(), actual.scheme());\n    assert_eq!(expected.authority(), actual.authority());\n    assert_eq!(expected.path(), actual.path());\n\n    // query params may be out of order\n    let mut expected_params: Vec<(Cow<'_, str>, Cow<'_, str>)> =\n        form_urlencoded::parse(expected.query().unwrap_or_default().as_bytes()).collect();\n    expected_params.sort();\n\n    let mut actual_params: Vec<(Cow<'_, str>, Cow<'_, str>)> =\n        form_urlencoded::parse(actual.query().unwrap_or_default().as_bytes()).collect();\n    actual_params.sort();\n\n    assert_eq!(expected_params, actual_params);\n}\n\nfn assert_requests_eq(expected: TestRequest, actual: http::Request<&str>) {\n    let expected = expected.as_http_request();\n    let actual = actual;\n    assert_eq!(expected.method(), actual.method());\n    assert_eq!(\n        expected.headers().len(),\n        actual.headers().len(),\n        \"extra or missing headers\"\n    );\n    assert_eq!(expected.headers(), actual.headers(), \"headers mismatch\");\n    assert_uri_eq(expected.uri(), actual.uri());\n    assert_eq!(*expected.body(), *actual.body(), \"body mismatch\");\n}\n\n/// Run the given test from the v4 suite for the given signature location\npub(crate) fn run_v4_test(test_name: &'static str, signature_location: SignatureLocation) {\n    let test = SigningSuiteTest::v4(test_name);\n    let tc = test.context();\n    let params = new_v4_signing_params_from_context(&tc, signature_location);\n\n    let req = test.request();\n    let expected_creq = test.canonical_request(signature_location);\n    let signable_req = SignableRequest::from(&req);\n    let actual_creq = CanonicalRequest::from(&signable_req, &params).unwrap();\n\n    // check canonical request\n    assert_eq!(\n        expected_creq,\n        actual_creq.to_string(),\n        \"canonical request didn't match (signature location: {signature_location:?})\"\n    );\n\n    let expected_string_to_sign = test.string_to_sign(signature_location);\n    let hashed_creq = &crate::sign::v4::sha256_hex_string(actual_creq.to_string().as_bytes());\n    let actual_string_to_sign = StringToSign::new_v4(\n        *params.time(),\n        params.region().unwrap(),\n        params.name(),\n        hashed_creq,\n    )\n    .to_string();\n\n    // check string to sign\n    assert_eq!(\n        expected_string_to_sign, actual_string_to_sign,\n        \"'string to sign' didn't match (signature location: {signature_location:?})\"\n    );\n\n    let out = crate::http_request::sign(signable_req, &params).unwrap();\n    let mut signed = req.as_http_request();\n    out.output.apply_to_request_http1x(&mut signed);\n\n    // check signature\n    assert_eq!(\n        test.signature(signature_location),\n        out.signature,\n        \"signature didn't match (signature location: {signature_location:?})\"\n    );\n\n    let expected = test.signed_request(signature_location);\n    assert_requests_eq(expected, signed);\n}\n\n/// Test suite context.json\npub(crate) struct TestContext {\n    pub(crate) identity: Identity,\n    pub(crate) expiration_in_seconds: u64,\n    pub(crate) normalize: bool,\n    pub(crate) region: String,\n    pub(crate) service: String,\n    pub(crate) timestamp: String,\n    pub(crate) omit_session_token: bool,\n    pub(crate) sign_body: bool,\n}\n\n// Serde has limitations requiring this odd workaround.\n// See https://github.com/serde-rs/serde/issues/368 for more info.\nfn return_true() -> bool {\n    true\n}\n\n#[derive(serde_derive::Deserialize)]\npub(crate) struct TestContextBuilder {\n    credentials: TestContextCreds,\n    expiration_in_seconds: u64,\n    normalize: bool,\n    region: String,\n    service: String,\n    timestamp: String,\n    #[serde(default)]\n    omit_session_token: bool,\n    #[serde(default = \"return_true\")]\n    sign_body: bool,\n}\n\nimpl TestContextBuilder {\n    pub(crate) fn build(self) -> TestContext {\n        let identity = Identity::new(\n            Credentials::from_keys(\n                &self.credentials.access_key_id,\n                &self.credentials.secret_access_key,\n                self.credentials.token.clone(),\n            ),\n            Some(SystemTime::UNIX_EPOCH + Duration::from_secs(self.expiration_in_seconds)),\n        );\n\n        TestContext {\n            identity,\n            expiration_in_seconds: self.expiration_in_seconds,\n            normalize: self.normalize,\n            region: self.region,\n            service: self.service,\n            timestamp: self.timestamp,\n            omit_session_token: self.omit_session_token,\n            sign_body: self.sign_body,\n        }\n    }\n}\n\n#[derive(serde_derive::Deserialize)]\npub(crate) struct TestContextCreds {\n    access_key_id: String,\n    secret_access_key: String,\n    token: Option<String>,\n}\n\nimpl<'a> From<&'a TestContext> for crate::sign::v4::SigningParams<'a, SigningSettings> {\n    fn from(tc: &'a TestContext) -> Self {\n        crate::sign::v4::SigningParams {\n            identity: &tc.identity,\n            region: &tc.region,\n            name: &tc.service,\n            time: OffsetDateTime::parse(&tc.timestamp, &Rfc3339)\n                .unwrap()\n                .into(),\n            settings: SigningSettings {\n                // payload_checksum_kind: PayloadChecksumKind::XAmzSha256,\n                expires_in: Some(Duration::from_secs(tc.expiration_in_seconds)),\n                uri_path_normalization_mode: tc.normalize.into(),\n                session_token_mode: if tc.omit_session_token {\n                    SessionTokenMode::Exclude\n                } else {\n                    SessionTokenMode::Include\n                },\n                payload_checksum_kind: if tc.sign_body {\n                    PayloadChecksumKind::XAmzSha256\n                } else {\n                    PayloadChecksumKind::NoHeader\n                },\n                ..Default::default()\n            },\n        }\n    }\n}\n\n#[cfg(feature = \"sigv4a\")]\npub(crate) mod v4a {\n    use super::*;\n    use crate::http_request::{\n        sign, PayloadChecksumKind, SessionTokenMode, SignatureLocation, SigningSettings,\n    };\n    use crate::sign::v4a;\n    use p256::ecdsa::signature::{Signature, Verifier};\n    use p256::ecdsa::{DerSignature, SigningKey};\n    use std::time::Duration;\n    use time::format_description::well_known::Rfc3339;\n    use time::OffsetDateTime;\n\n    fn new_v4a_signing_params_from_context(\n        test_context: &'_ TestContext,\n        signature_location: SignatureLocation,\n    ) -> crate::http_request::SigningParams<'_> {\n        let mut params = crate::sign::v4a::SigningParams::from(test_context);\n        params.settings.signature_location = signature_location;\n        params.into()\n    }\n\n    pub(crate) fn run_test_suite_v4a(test_name: &'static str) {\n        run_v4a_test(test_name, SignatureLocation::Headers);\n        run_v4a_test(test_name, SignatureLocation::QueryParams);\n    }\n\n    pub(crate) fn run_v4a_test(test_name: &'static str, signature_location: SignatureLocation) {\n        let test = SigningSuiteTest::v4a(test_name);\n        let tc = test.context();\n        let params = new_v4a_signing_params_from_context(&tc, signature_location);\n\n        let req = test.request();\n        let expected_creq = test.canonical_request(signature_location);\n        let signable_req = SignableRequest::from(&req);\n        let actual_creq = CanonicalRequest::from(&signable_req, &params).unwrap();\n\n        assert_eq!(\n            expected_creq,\n            actual_creq.to_string(),\n            \"canonical request didn't match (signature location: {signature_location:?})\"\n        );\n\n        let expected_string_to_sign = test.string_to_sign(signature_location);\n        let hashed_creq = &crate::sign::v4::sha256_hex_string(actual_creq.to_string().as_bytes());\n        let actual_string_to_sign = StringToSign::new_v4a(\n            *params.time(),\n            params.region_set().unwrap(),\n            params.name(),\n            hashed_creq,\n        )\n        .to_string();\n\n        assert_eq!(\n            expected_string_to_sign, actual_string_to_sign,\n            \"'string to sign' didn't match (signature location: {signature_location:?})\"\n        );\n\n        let out = sign(signable_req, &params).unwrap();\n        // Sigv4a signatures are non-deterministic, so we can't compare the signature directly.\n        out.output\n            .apply_to_request_http1x(&mut req.as_http_request());\n\n        let creds = params.credentials().unwrap();\n        let signing_key =\n            v4a::generate_signing_key(creds.access_key_id(), creds.secret_access_key());\n        let sig = DerSignature::from_bytes(&hex::decode(out.signature).unwrap()).unwrap();\n        let sig = sig\n            .try_into()\n            .expect(\"DER-style signatures are always convertible into fixed-size signatures\");\n\n        let signing_key = SigningKey::from_bytes(signing_key.as_ref()).unwrap();\n        let peer_public_key = signing_key.verifying_key();\n        let sts = actual_string_to_sign.as_bytes();\n        peer_public_key.verify(sts, &sig).unwrap();\n        // TODO(sigv4a) - use public.key.json as verifying key?\n    }\n\n    impl<'a> From<&'a TestContext> for crate::sign::v4a::SigningParams<'a, SigningSettings> {\n        fn from(tc: &'a TestContext) -> Self {\n            crate::sign::v4a::SigningParams {\n                identity: &tc.identity,\n                region_set: &tc.region,\n                name: &tc.service,\n                time: OffsetDateTime::parse(&tc.timestamp, &Rfc3339)\n                    .unwrap()\n                    .into(),\n                settings: SigningSettings {\n                    // payload_checksum_kind: PayloadChecksumKind::XAmzSha256,\n                    expires_in: Some(Duration::from_secs(tc.expiration_in_seconds)),\n                    uri_path_normalization_mode: tc.normalize.into(),\n                    session_token_mode: if tc.omit_session_token {\n                        SessionTokenMode::Exclude\n                    } else {\n                        SessionTokenMode::Include\n                    },\n                    payload_checksum_kind: if tc.sign_body {\n                        PayloadChecksumKind::XAmzSha256\n                    } else {\n                        PayloadChecksumKind::NoHeader\n                    },\n                    ..Default::default()\n                },\n            }\n        }\n    }\n\n    #[test]\n    fn test_parse() {\n        let req = SigningSuiteTest::v4a(\"post-header-key-case\").request();\n        assert_eq!(req.method, \"POST\");\n        assert_eq!(req.uri, \"https://example.amazonaws.com/\");\n        assert!(req.headers.is_empty());\n    }\n\n    #[test]\n    fn test_read_query_params() {\n        let req = SigningSuiteTest::v4a(\"get-header-value-trim\").request();\n        assert_eq!(req.method, \"GET\");\n        assert_eq!(req.uri, \"https://example.amazonaws.com/\");\n        assert!(!req.headers.is_empty());\n    }\n}\n\nfn read(path: &str) -> String {\n    println!(\"Loading `{}` for test case...\", path);\n    let v = {\n        match std::fs::read_to_string(path) {\n            // This replacement is necessary for tests to pass on Windows, as reading the\n            // test snapshots from the file system results in CRLF line endings being inserted.\n            Ok(value) => value.replace(\"\\r\\n\", \"\\n\"),\n            Err(err) => {\n                panic!(\"failed to load test case `{}`: {}\", path, err);\n            }\n        }\n    };\n\n    v.trim().to_string()\n}\n\npub(crate) struct TestRequest {\n    pub(crate) uri: String,\n    pub(crate) method: String,\n    pub(crate) headers: Vec<(String, String)>,\n    pub(crate) body: TestSignedBody,\n}\n\npub(crate) enum TestSignedBody {\n    Signable(SignableBody<'static>),\n    Bytes(Vec<u8>),\n}\n\nimpl TestSignedBody {\n    fn as_signable_body(&self) -> SignableBody<'_> {\n        match self {\n            TestSignedBody::Signable(data) => data.clone(),\n            TestSignedBody::Bytes(data) => SignableBody::Bytes(data.as_slice()),\n        }\n    }\n}\n\nimpl TestRequest {\n    pub(crate) fn set_body(&mut self, body: SignableBody<'static>) {\n        self.body = TestSignedBody::Signable(body);\n    }\n\n    pub(crate) fn as_http_request(&self) -> http::Request<&'static str> {\n        let mut builder = http::Request::builder()\n            .uri(&self.uri)\n            .method(http::Method::from_bytes(self.method.as_bytes()).unwrap());\n        for (k, v) in &self.headers {\n            builder = builder.header(k, v);\n        }\n        builder.body(\"body\").unwrap()\n    }\n}\n\nimpl<B: AsRef<[u8]>> From<http0::Request<B>> for TestRequest {\n    fn from(value: http0::Request<B>) -> Self {\n        let invalid = value\n            .headers()\n            .values()\n            .find(|h| std::str::from_utf8(h.as_bytes()).is_err());\n        if let Some(invalid) = invalid {\n            panic!(\"invalid header: {:?}\", invalid);\n        }\n        Self {\n            uri: value.uri().to_string(),\n            method: value.method().to_string(),\n            headers: value\n                .headers()\n                .iter()\n                .map(|(k, v)| {\n                    (\n                        k.to_string(),\n                        String::from_utf8(v.as_bytes().to_vec()).unwrap(),\n                    )\n                })\n                .collect::<Vec<_>>(),\n            body: TestSignedBody::Bytes(value.body().as_ref().to_vec()),\n        }\n    }\n}\n\nimpl<B: AsRef<[u8]>> From<http::Request<B>> for TestRequest {\n    fn from(value: http::Request<B>) -> Self {\n        let invalid = value\n            .headers()\n            .values()\n            .find(|h| std::str::from_utf8(h.as_bytes()).is_err());\n        if let Some(invalid) = invalid {\n            panic!(\"invalid header: {:?}\", invalid);\n        }\n        Self {\n            uri: value.uri().to_string(),\n            method: value.method().to_string(),\n            headers: value\n                .headers()\n                .iter()\n                .map(|(k, v)| {\n                    (\n                        k.to_string(),\n                        String::from_utf8(v.as_bytes().to_vec()).unwrap(),\n                    )\n                })\n                .collect::<Vec<_>>(),\n            body: TestSignedBody::Bytes(value.body().as_ref().to_vec()),\n        }\n    }\n}\n\nimpl<'a> From<&'a TestRequest> for SignableRequest<'a> {\n    fn from(request: &'a TestRequest) -> SignableRequest<'a> {\n        SignableRequest::new(\n            &request.method,\n            &request.uri,\n            request\n                .headers\n                .iter()\n                .map(|(k, v)| (k.as_str(), v.as_str())),\n            request.body.as_signable_body(),\n        )\n        .expect(\"URI MUST be valid\")\n    }\n}\n\nfn parse_request(s: &[u8]) -> Result<TestRequest, Box<dyn StdError + Send + Sync + 'static>> {\n    let mut headers = [httparse::EMPTY_HEADER; 64];\n    // httparse 1.5 requires two trailing newlines to head the header section.\n    let mut with_newline = Vec::from(s);\n    with_newline.push(b'\\n');\n    let mut req = httparse::Request::new(&mut headers);\n    let status = req.parse(&with_newline).unwrap();\n\n    let body = if status.is_complete() {\n        let body_offset = status.unwrap();\n        // ignore the newline we added, take from original\n        &s[body_offset..]\n    } else {\n        &[]\n    };\n\n    let mut uri_builder = Uri::builder().scheme(\"https\");\n    if let Some(path) = req.path {\n        uri_builder = uri_builder.path_and_query(path);\n    }\n\n    let mut headers = vec![];\n    for header in req.headers {\n        let name = header.name.to_lowercase();\n        if name == \"host\" {\n            uri_builder = uri_builder.authority(header.value);\n        } else if !name.is_empty() {\n            headers.push((\n                header.name.to_string(),\n                std::str::from_utf8(header.value)?.to_string(),\n            ));\n        }\n    }\n\n    Ok(TestRequest {\n        uri: uri_builder.build()?.to_string(),\n        method: req.method.unwrap().to_string(),\n        headers,\n        body: TestSignedBody::Bytes(Vec::from(body)),\n    })\n}\n\n#[test]\nfn test_parse_headers() {\n    let buf = b\"Host:example.amazonaws.com\\nX-Amz-Date:20150830T123600Z\\n\\nblah blah\";\n    let mut headers = [httparse::EMPTY_HEADER; 4];\n    assert_eq!(\n        httparse::parse_headers(buf, &mut headers),\n        Ok(httparse::Status::Complete((\n            56,\n            &[\n                httparse::Header {\n                    name: \"Host\",\n                    value: b\"example.amazonaws.com\",\n                },\n                httparse::Header {\n                    name: \"X-Amz-Date\",\n                    value: b\"20150830T123600Z\",\n                }\n            ][..]\n        )))\n    );\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/src/http_request/uri_path_normalization.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::borrow::Cow;\n\n// Normalize `uri_path` according to\n// https://docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html\npub(super) fn normalize_uri_path(uri_path: &str) -> Cow<'_, str> {\n    // If the absolute path is empty, use a forward slash (/).\n    if uri_path.is_empty() {\n        return Cow::Borrowed(\"/\");\n    }\n\n    // The canonical URI is the URI-encoded version of the _absolute_ path component of the URI.\n    let result = if uri_path.starts_with('/') {\n        Cow::Borrowed(uri_path)\n    } else {\n        Cow::Owned(format!(\"/{uri_path}\"))\n    };\n\n    if !(result.contains('.') || result.contains(\"//\")) {\n        return result;\n    }\n\n    Cow::Owned(normalize_path_segment(&result))\n}\n\n// Implement 5.2.4. Remove Dot Segments in https://www.rfc-editor.org/rfc/rfc3986\n//\n// The function assumes that `uri_path` is an absolute path,\n// starting with a forward slash.\nfn normalize_path_segment(uri_path: &str) -> String {\n    let number_of_slashes = uri_path.matches('/').count();\n    let mut normalized: Vec<&str> = Vec::with_capacity(number_of_slashes + 1);\n\n    for segment in uri_path.split('/') {\n        match segment {\n            // Segments that are empty or contain only a single period should not be preserved\n            \"\" | \".\" => {}\n            \"..\" => {\n                normalized.pop();\n            }\n            otherwise => normalized.push(otherwise),\n        }\n    }\n\n    let mut result = normalized.join(\"/\");\n\n    // Even though `uri_path` starts with a `/`, that may not be the case for `result`.\n    // An example of this is `uri_path` being \"/../foo\" where the corresponding `result`\n    // will be \"foo\".\n    if !result.starts_with('/') {\n        result.insert(0, '/');\n    }\n\n    // If `uri_path` is \"/foo/bar/.\", normalizing it should be \"/foo/bar/\". However,\n    // the logic so far only makes `result` \"/foo/bar\", without the trailing slash.\n    // The condition below ensures that the trailing slash is appended to `result`\n    // if `uri_path` ends with a slash (per the RFC) but `result` does not.\n    if ends_with_slash(uri_path) && !result.ends_with('/') {\n        result.push('/');\n    }\n\n    result\n}\n\nfn ends_with_slash(uri_path: &str) -> bool {\n    // These are all translated to \"/\" per 2.B and 2.C in section 5.2.4 in RFC 3986.\n    [\"/\", \"/.\", \"/./\", \"/..\", \"/../\"]\n        .iter()\n        .any(|s| uri_path.ends_with(s))\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n\n    #[test]\n    fn normalize_uri_path_should_not_modify_input_containing_just_a_forward_slash() {\n        assert_eq!(normalize_uri_path(\"/\"), Cow::<'_, str>::Borrowed(\"/\"));\n    }\n\n    #[test]\n    fn normalize_uri_path_should_add_a_forward_slash_when_input_is_empty() {\n        assert_eq!(\n            normalize_uri_path(\"\"),\n            Cow::<'_, str>::Owned(\"/\".to_owned())\n        );\n    }\n\n    #[test]\n    fn normalize_uri_path_should_not_modify_single_non_dot_segment_starting_with_a_single_forward_slash(\n    ) {\n        assert_eq!(normalize_uri_path(\"/foo\"), Cow::Borrowed(\"/foo\"));\n    }\n\n    #[test]\n    fn normalize_uri_path_should_prepend_forward_slash_when_input_is_relative() {\n        assert_eq!(\n            normalize_uri_path(\"foo\"),\n            Cow::<'_, str>::Owned(\"/foo\".to_owned())\n        );\n    }\n\n    #[test]\n    fn normalize_uri_path_should_not_modify_multiple_non_dot_segments_starting_with_a_single_forward_slash(\n    ) {\n        assert_eq!(normalize_uri_path(\"/foo/bar\"), Cow::Borrowed(\"/foo/bar\"));\n    }\n\n    #[test]\n    fn normalize_uri_path_should_not_modify_multiple_non_dot_segments_with_a_trailing_forward_slash(\n    ) {\n        assert_eq!(normalize_uri_path(\"/foo/bar/\"), Cow::Borrowed(\"/foo/bar/\"));\n    }\n\n    // 2.A in https://www.rfc-editor.org/rfc/rfc3986#section-5.2.4\n    #[test]\n    fn normalize_uri_path_should_remove_a_leading_dot_from_input() {\n        // The expected value is \"/\" rather than \"\" because if the absolute path is empty,\n        // we use a forward slash.\n        assert_eq!(\n            normalize_uri_path(\"./\"),\n            Cow::<'_, str>::Owned(\"/\".to_owned())\n        );\n\n        assert_eq!(\n            normalize_uri_path(\"./foo\"),\n            Cow::<'_, str>::Owned(\"/foo\".to_owned())\n        );\n    }\n\n    // 2.A in https://www.rfc-editor.org/rfc/rfc3986#section-5.2.4\n    #[test]\n    fn normalize_uri_path_should_remove_leading_double_dots_from_input() {\n        // The expected value is \"/\" rather than \"\" because if the absolute path is empty,\n        // we use a forward slash.\n        assert_eq!(\n            normalize_uri_path(\"../\"),\n            Cow::<'_, str>::Owned(\"/\".to_owned())\n        );\n\n        assert_eq!(\n            normalize_uri_path(\"../foo\"),\n            Cow::<'_, str>::Owned(\"/foo\".to_owned())\n        );\n    }\n\n    // 2.B in https://www.rfc-editor.org/rfc/rfc3986#section-5.2.4\n    #[test]\n    fn normalize_uri_path_should_remove_a_singel_dot_from_input() {\n        assert_eq!(\n            normalize_uri_path(\"/.\"),\n            Cow::<'_, str>::Owned(\"/\".to_owned())\n        );\n        assert_eq!(\n            normalize_uri_path(\"/./\"),\n            Cow::<'_, str>::Owned(\"/\".to_owned())\n        );\n        assert_eq!(\n            normalize_uri_path(\"/./foo\"),\n            Cow::<'_, str>::Owned(\"/foo\".to_owned())\n        );\n        assert_eq!(\n            normalize_uri_path(\"/foo/bar/.\"),\n            Cow::<'_, str>::Owned(\"/foo/bar/\".to_owned())\n        );\n        assert_eq!(\n            normalize_uri_path(\"/foo/bar/./\"),\n            Cow::<'_, str>::Owned(\"/foo/bar/\".to_owned())\n        );\n        assert_eq!(\n            normalize_uri_path(\"/foo/./bar/./\"),\n            Cow::<'_, str>::Owned(\"/foo/bar/\".to_owned())\n        );\n    }\n\n    // 2.C in https://www.rfc-editor.org/rfc/rfc3986#section-5.2.4\n    #[test]\n    fn normalize_uri_path_should_remove_double_dots_from_input() {\n        assert_eq!(\n            normalize_uri_path(\"/..\"),\n            Cow::<'_, str>::Owned(\"/\".to_owned())\n        );\n        assert_eq!(\n            normalize_uri_path(\"/../\"),\n            Cow::<'_, str>::Owned(\"/\".to_owned())\n        );\n        assert_eq!(\n            normalize_uri_path(\"/../foo\"),\n            Cow::<'_, str>::Owned(\"/foo\".to_owned())\n        );\n        assert_eq!(\n            normalize_uri_path(\"/foo/bar/..\"),\n            Cow::<'_, str>::Owned(\"/foo/\".to_owned())\n        );\n        assert_eq!(\n            normalize_uri_path(\"/foo/bar/../\"),\n            Cow::<'_, str>::Owned(\"/foo/\".to_owned())\n        );\n        assert_eq!(\n            normalize_uri_path(\"/foo/../bar/../\"),\n            Cow::<'_, str>::Owned(\"/\".to_owned())\n        );\n    }\n\n    // 2.D in https://www.rfc-editor.org/rfc/rfc3986#section-5.2.4\n    #[test]\n    fn normalize_uri_path_should_replace_a_dot_segment_with_a_forward_slash() {\n        assert_eq!(\n            normalize_uri_path(\".\"),\n            Cow::<'_, str>::Owned(\"/\".to_owned())\n        );\n        assert_eq!(\n            normalize_uri_path(\"..\"),\n            Cow::<'_, str>::Owned(\"/\".to_owned())\n        );\n    }\n\n    // Page 34 in https://www.rfc-editor.org/rfc/rfc3986\n    #[test]\n    fn normalize_uri_path_should_behave_as_expected_against_examples_in_rfc() {\n        assert_eq!(\n            normalize_uri_path(\"/a/b/c/./../../g\"),\n            Cow::<'_, str>::Owned(\"/a/g\".to_owned())\n        );\n        // The expected value will be absolutized.\n        assert_eq!(\n            normalize_uri_path(\"mid/content=5/../6\"),\n            Cow::<'_, str>::Owned(\"/mid/6\".to_owned())\n        );\n    }\n\n    // The CRT does this so I figured we should too. - Zelda\n    #[test]\n    fn normalize_uri_path_should_merge_multiple_subsequent_slashes_into_one() {\n        assert_eq!(\n            normalize_uri_path(\"//foo//\"),\n            Cow::<'_, str>::Owned(\"/foo/\".to_owned())\n        );\n    }\n\n    #[test]\n    fn normalize_uri_path_should_not_remove_dot_when_surrounded_by_percent_encoded_forward_slashes()\n    {\n        assert_eq!(\n            normalize_uri_path(\"/foo%2F.%2Fbar\"),\n            Cow::<'_, str>::Borrowed(\"/foo%2F.%2Fbar\")\n        );\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/src/http_request/url_escape.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_smithy_http::label;\n\npub(super) fn percent_encode_path(value: &str) -> String {\n    label::fmt_string(value, label::EncodingStrategy::Greedy)\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/src/http_request.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Utilities to sign HTTP requests.\n//!\n//! # Example: Signing an HTTP request\n//!\n//! **Note**: This requires `http0-compat` to be enabled.\n//!\n//! ```rust\n//! # use aws_credential_types::Credentials;\n//! use aws_smithy_runtime_api::client::identity::Identity;\n//! # use aws_sigv4::http_request::SignableBody;\n//! #[cfg(feature = \"http1\")]\n//! fn test() -> Result<(), aws_sigv4::http_request::SigningError> {\n//! use aws_sigv4::http_request::{sign, SigningSettings, SigningParams, SignableRequest};\n//! use aws_sigv4::sign::v4;\n//! use http0;\n//! use std::time::SystemTime;\n//!\n//! // Set up information and settings for the signing\n//! // You can obtain credentials from `SdkConfig`.\n//! let identity = Credentials::new(\n//!     \"AKIDEXAMPLE\",\n//!     \"wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY\",\n//!     None,\n//!     None,\n//!     \"hardcoded-credentials\"\n//! ).into();\n//! let signing_settings = SigningSettings::default();\n//! let signing_params = v4::SigningParams::builder()\n//!     .identity(&identity)\n//!     .region(\"us-east-1\")\n//!     .name(\"exampleservice\")\n//!     .time(SystemTime::now())\n//!     .settings(signing_settings)\n//!     .build()\n//!     .unwrap()\n//!     .into();\n//! // Convert the HTTP request into a signable request\n//! let signable_request = SignableRequest::new(\n//!     \"GET\",\n//!     \"https://some-endpoint.some-region.amazonaws.com\",\n//!     std::iter::empty(),\n//!     SignableBody::Bytes(&[])\n//! ).expect(\"signable request\");\n//!\n//! let mut my_req = http::Request::new(\"...\");\n//! // Sign and then apply the signature to the request\n//! let (signing_instructions, _signature) = sign(signable_request, &signing_params)?.into_parts();\n//! signing_instructions.apply_to_request_http1x(&mut my_req);\n//! # Ok(())\n//! # }\n//! ```\n\nmod canonical_request;\nmod error;\nmod settings;\nmod sign;\nmod uri_path_normalization;\nmod url_escape;\n\n#[cfg(test)]\npub(crate) mod test;\n\nuse crate::sign::v4;\n#[cfg(feature = \"sigv4a\")]\nuse crate::sign::v4a;\nuse crate::SignatureVersion;\nuse aws_credential_types::Credentials;\npub use error::SigningError;\npub use settings::{\n    PayloadChecksumKind, PercentEncodingMode, SessionTokenMode, SignatureLocation, SigningSettings,\n    UriPathNormalizationMode,\n};\npub use sign::{sign, SignableBody, SignableRequest, SigningInstructions};\nuse std::time::SystemTime;\n\n// Individual Debug impls are responsible for redacting sensitive fields.\n#[derive(Debug)]\n#[non_exhaustive]\n/// Parameters for signing an HTTP request.\npub enum SigningParams<'a> {\n    /// Sign with the SigV4 algorithm\n    V4(v4::SigningParams<'a, SigningSettings>),\n    #[cfg(feature = \"sigv4a\")]\n    /// Sign with the SigV4a algorithm\n    V4a(v4a::SigningParams<'a, SigningSettings>),\n}\n\nimpl<'a> From<v4::SigningParams<'a, SigningSettings>> for SigningParams<'a> {\n    fn from(value: v4::SigningParams<'a, SigningSettings>) -> Self {\n        Self::V4(value)\n    }\n}\n\n#[cfg(feature = \"sigv4a\")]\nimpl<'a> From<v4a::SigningParams<'a, SigningSettings>> for SigningParams<'a> {\n    fn from(value: v4a::SigningParams<'a, SigningSettings>) -> Self {\n        Self::V4a(value)\n    }\n}\n\nimpl SigningParams<'_> {\n    /// Return the credentials within the signing params.\n    pub(crate) fn credentials(&self) -> Result<&Credentials, SigningError> {\n        let identity = match self {\n            Self::V4(v4::SigningParams { identity, .. }) => identity,\n            #[cfg(feature = \"sigv4a\")]\n            Self::V4a(v4a::SigningParams { identity, .. }) => identity,\n        };\n\n        identity\n            .data::<Credentials>()\n            .ok_or_else(SigningError::unsupported_identity_type)\n    }\n\n    /// If the signing params are for SigV4, return the region. Otherwise, return `None`.\n    pub fn region(&self) -> Option<&str> {\n        match self {\n            SigningParams::V4(v4::SigningParams { region, .. }) => Some(region),\n            #[allow(unreachable_patterns)]\n            _ => None,\n        }\n    }\n\n    #[cfg(feature = \"sigv4a\")]\n    /// If the signing params are for SigV4a, return the region set. Otherwise, return `None`.\n    pub fn region_set(&self) -> Option<&str> {\n        match self {\n            SigningParams::V4a(v4a::SigningParams { region_set, .. }) => Some(region_set),\n            _ => None,\n        }\n    }\n\n    /// Return a reference to the settings held by the signing params.\n    pub fn settings(&self) -> &SigningSettings {\n        match self {\n            Self::V4(v4::SigningParams { settings, .. }) => settings,\n            #[cfg(feature = \"sigv4a\")]\n            Self::V4a(v4a::SigningParams { settings, .. }) => settings,\n        }\n    }\n\n    /// Return a mutable reference to the settings held by the signing params.\n    pub fn settings_mut(&mut self) -> &mut SigningSettings {\n        match self {\n            Self::V4(v4::SigningParams { settings, .. }) => settings,\n            #[cfg(feature = \"sigv4a\")]\n            Self::V4a(v4a::SigningParams { settings, .. }) => settings,\n        }\n    }\n\n    #[cfg(test)]\n    /// Set the [`PayloadChecksumKind`] for the signing params.\n    pub fn set_payload_checksum_kind(&mut self, kind: PayloadChecksumKind) {\n        let settings = self.settings_mut();\n\n        settings.payload_checksum_kind = kind;\n    }\n\n    #[cfg(test)]\n    /// Set the [`SessionTokenMode`] for the signing params.\n    pub fn set_session_token_mode(&mut self, mode: SessionTokenMode) {\n        let settings = self.settings_mut();\n\n        settings.session_token_mode = mode;\n    }\n\n    /// Return a reference to the time in the signing params.\n    pub fn time(&self) -> &SystemTime {\n        match self {\n            Self::V4(v4::SigningParams { time, .. }) => time,\n            #[cfg(feature = \"sigv4a\")]\n            Self::V4a(v4a::SigningParams { time, .. }) => time,\n        }\n    }\n\n    /// Return a reference to the name in the signing params.\n    pub fn name(&self) -> &str {\n        match self {\n            Self::V4(v4::SigningParams { name, .. }) => name,\n            #[cfg(feature = \"sigv4a\")]\n            Self::V4a(v4a::SigningParams { name, .. }) => name,\n        }\n    }\n\n    /// Return the name of the configured signing algorithm.\n    pub fn algorithm(&self) -> &'static str {\n        match self {\n            Self::V4(params) => params.algorithm(),\n            #[cfg(feature = \"sigv4a\")]\n            Self::V4a(params) => params.algorithm(),\n        }\n    }\n\n    /// Return the name of the signing scheme\n    pub fn signature_version(&self) -> SignatureVersion {\n        match self {\n            Self::V4(..) => SignatureVersion::V4,\n            #[cfg(feature = \"sigv4a\")]\n            Self::V4a(..) => SignatureVersion::V4a,\n        }\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/src/lib.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/* Automatically managed default lints */\n#![cfg_attr(docsrs, feature(doc_cfg))]\n/* End of automatically managed default lints */\n//! Provides functions for calculating Sigv4 signing keys, signatures, and\n//! optional utilities for signing HTTP requests and Event Stream messages.\n\n#![allow(clippy::derive_partial_eq_without_eq)]\n#![warn(\n    missing_docs,\n    rustdoc::missing_crate_level_docs,\n    missing_debug_implementations,\n    rust_2018_idioms,\n    unreachable_pub\n)]\n\nuse std::fmt;\n\npub mod sign;\n\nmod date_time;\n\n#[cfg(feature = \"sign-eventstream\")]\npub mod event_stream;\n\n#[cfg(feature = \"sign-http\")]\npub mod http_request;\n\n/// The version of the signing algorithm to use\n#[derive(Debug, Eq, PartialEq, Copy, Clone)]\n#[non_exhaustive]\npub enum SignatureVersion {\n    /// The SigV4 signing algorithm.\n    V4,\n    /// The SigV4a signing algorithm.\n    V4a,\n}\n\nimpl fmt::Display for SignatureVersion {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        match self {\n            SignatureVersion::V4 => write!(f, \"SigV4\"),\n            SignatureVersion::V4a => write!(f, \"SigV4a\"),\n        }\n    }\n}\n\n/// Container for the signed output and the signature.\n///\n/// This is returned by signing functions, and the signed output will be\n/// different based on what is being signed (for example, an event stream\n/// message, or an HTTP request).\n#[derive(Debug)]\npub struct SigningOutput<T> {\n    output: T,\n    signature: String,\n}\n\nimpl<T> SigningOutput<T> {\n    /// Creates a new [`SigningOutput`]\n    pub fn new(output: T, signature: String) -> Self {\n        Self { output, signature }\n    }\n\n    /// Returns the signed output\n    pub fn output(&self) -> &T {\n        &self.output\n    }\n\n    /// Returns the signature as a lowercase hex string\n    pub fn signature(&self) -> &str {\n        &self.signature\n    }\n\n    /// Decomposes the `SigningOutput` into a tuple of the signed output and the signature\n    pub fn into_parts(self) -> (T, String) {\n        (self.output, self.signature)\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/src/sign/v4.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::{\n    date_time::{format_date, format_date_time},\n    http_request::SigningError,\n    SigningOutput,\n};\nuse aws_credential_types::Credentials;\nuse aws_smithy_runtime_api::{client::identity::Identity, http::Headers};\nuse bytes::Bytes;\nuse hmac::{digest::FixedOutput, Hmac, KeyInit, Mac};\nuse sha2::{Digest, Sha256};\nuse std::time::SystemTime;\n\n/// HashedPayload = Lowercase(HexEncode(Hash(requestPayload)))\n#[allow(dead_code)] // Unused when compiling without certain features\npub(crate) fn sha256_hex_string(bytes: impl AsRef<[u8]>) -> String {\n    let mut hasher = Sha256::new();\n    hasher.update(bytes);\n    hex::encode(hasher.finalize_fixed())\n}\n\n/// Calculates a Sigv4 signature\npub fn calculate_signature(signing_key: impl AsRef<[u8]>, string_to_sign: &[u8]) -> String {\n    let mut mac = Hmac::<Sha256>::new_from_slice(signing_key.as_ref())\n        .expect(\"HMAC can take key of any size\");\n    mac.update(string_to_sign);\n    hex::encode(mac.finalize_fixed())\n}\n\n/// Generates a signing key for Sigv4\npub fn generate_signing_key(\n    secret: &str,\n    time: SystemTime,\n    region: &str,\n    service: &str,\n) -> impl AsRef<[u8]> {\n    // kSecret = your secret access key\n    // kDate = HMAC(\"AWS4\" + kSecret, Date)\n    // kRegion = HMAC(kDate, Region)\n    // kService = HMAC(kRegion, Service)\n    // kSigning = HMAC(kService, \"aws4_request\")\n\n    let secret = format!(\"AWS4{secret}\");\n    let mut mac =\n        Hmac::<Sha256>::new_from_slice(secret.as_ref()).expect(\"HMAC can take key of any size\");\n    mac.update(format_date(time).as_bytes());\n    let tag = mac.finalize_fixed();\n\n    // sign region\n    let mut mac = Hmac::<Sha256>::new_from_slice(&tag).expect(\"HMAC can take key of any size\");\n    mac.update(region.as_bytes());\n    let tag = mac.finalize_fixed();\n\n    // sign service\n    let mut mac = Hmac::<Sha256>::new_from_slice(&tag).expect(\"HMAC can take key of any size\");\n    mac.update(service.as_bytes());\n    let tag = mac.finalize_fixed();\n\n    // sign request\n    let mut mac = Hmac::<Sha256>::new_from_slice(&tag).expect(\"HMAC can take key of any size\");\n    mac.update(\"aws4_request\".as_bytes());\n    mac.finalize_fixed()\n}\n\n/// Parameters to use when signing.\n#[derive(Debug)]\n#[non_exhaustive]\npub struct SigningParams<'a, S> {\n    /// The identity to use when signing a request\n    pub(crate) identity: &'a Identity,\n\n    /// Region to sign for.\n    pub(crate) region: &'a str,\n    /// Service Name to sign for.\n    ///\n    /// NOTE: Endpoint resolution rules may specify a name that differs from the typical service name.\n    pub(crate) name: &'a str,\n    /// Timestamp to use in the signature (should be `SystemTime::now()` unless testing).\n    pub(crate) time: SystemTime,\n\n    /// Additional signing settings. These differ between HTTP and Event Stream.\n    pub(crate) settings: S,\n}\n\npub(crate) const HMAC_SHA256: &str = \"AWS4-HMAC-SHA256\";\nconst HMAC_SHA256_PAYLOAD: &str = \"AWS4-HMAC-SHA256-PAYLOAD\";\nconst HMAC_SHA256_TRAILER: &str = \"AWS4-HMAC-SHA256-TRAILER\";\n\nimpl<S> SigningParams<'_, S> {\n    /// Returns the region that will be used to sign SigV4 requests\n    pub fn region(&self) -> &str {\n        self.region\n    }\n\n    /// Returns the signing name that will be used to sign requests\n    pub fn name(&self) -> &str {\n        self.name\n    }\n\n    /// Return the name of the algorithm used to sign requests\n    pub fn algorithm(&self) -> &'static str {\n        HMAC_SHA256\n    }\n}\n\nimpl<'a, S: Default> SigningParams<'a, S> {\n    /// Returns a builder that can create new `SigningParams`.\n    pub fn builder() -> signing_params::Builder<'a, S> {\n        Default::default()\n    }\n}\n\n/// Builder and error for creating [`SigningParams`]\npub mod signing_params {\n    use super::SigningParams;\n    use aws_smithy_runtime_api::client::identity::Identity;\n    use std::error::Error;\n    use std::fmt;\n    use std::time::SystemTime;\n\n    /// [`SigningParams`] builder error\n    #[derive(Debug)]\n    pub struct BuildError {\n        reason: &'static str,\n    }\n    impl BuildError {\n        fn new(reason: &'static str) -> Self {\n            Self { reason }\n        }\n    }\n\n    impl fmt::Display for BuildError {\n        fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n            write!(f, \"{}\", self.reason)\n        }\n    }\n\n    impl Error for BuildError {}\n\n    /// Builder that can create new [`SigningParams`]\n    #[derive(Debug, Default)]\n    pub struct Builder<'a, S> {\n        identity: Option<&'a Identity>,\n        region: Option<&'a str>,\n        name: Option<&'a str>,\n        time: Option<SystemTime>,\n        settings: Option<S>,\n    }\n\n    impl<'a, S> Builder<'a, S> {\n        builder_methods!(\n            set_identity,\n            identity,\n            &'a Identity,\n            \"Sets the identity (required)\",\n            set_region,\n            region,\n            &'a str,\n            \"Sets the region (required)\",\n            set_name,\n            name,\n            &'a str,\n            \"Sets the name (required)\",\n            set_time,\n            time,\n            SystemTime,\n            \"Sets the time to be used in the signature (required)\",\n            set_settings,\n            settings,\n            S,\n            \"Sets additional signing settings (required)\"\n        );\n\n        /// Builds an instance of [`SigningParams`]. Will yield a [`BuildError`] if\n        /// a required argument was not given.\n        pub fn build(self) -> Result<SigningParams<'a, S>, BuildError> {\n            Ok(SigningParams {\n                identity: self\n                    .identity\n                    .ok_or_else(|| BuildError::new(\"identity is required\"))?,\n                region: self\n                    .region\n                    .ok_or_else(|| BuildError::new(\"region is required\"))?,\n                name: self\n                    .name\n                    .ok_or_else(|| BuildError::new(\"name is required\"))?,\n                time: self\n                    .time\n                    .ok_or_else(|| BuildError::new(\"time is required\"))?,\n                settings: self\n                    .settings\n                    .ok_or_else(|| BuildError::new(\"settings are required\"))?,\n            })\n        }\n    }\n}\n\n/// Signs `chunk` with the given `running_signature` and `params`.\n///\n/// See [signature calculation details](https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-streaming.html#sigv4-chunked-body-definition).\npub fn sign_chunk<'a, S>(\n    chunk: &Bytes,\n    running_signature: &'a str,\n    params: &'a SigningParams<'a, S>,\n) -> Result<SigningOutput<()>, SigningError> {\n    let payload_hash = format!(\"{}\\n{}\", sha256_hex_string([]), sha256_hex_string(chunk));\n    sign_streaming_payload(\n        HMAC_SHA256_PAYLOAD,\n        running_signature,\n        params,\n        &payload_hash,\n    )\n}\n\n/// Signs trailing headers with the given `running_signature` and `params`.\n///\n/// See [signature calculation details](https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-streaming-trailers.html#example-signature-calculations-trailing-header).\npub fn sign_trailer<'a, S>(\n    headers: &'a Headers,\n    running_signature: &'a str,\n    params: &'a SigningParams<'a, S>,\n) -> Result<SigningOutput<()>, SigningError> {\n    fn canonical_headers(headers: &Headers) -> Vec<u8> {\n        let mut sorted_headers: Vec<_> = headers.iter().collect();\n        sorted_headers.sort_by_key(|(name, _)| name.to_lowercase());\n        let mut buf = Vec::with_capacity(sorted_headers.len());\n        for (name, value) in sorted_headers.iter() {\n            buf.extend_from_slice(name.to_lowercase().as_bytes());\n            buf.extend_from_slice(b\":\");\n            buf.extend_from_slice(value.trim().as_bytes());\n            buf.extend_from_slice(b\"\\n\");\n        }\n        buf\n    }\n\n    let payload_hash = sha256_hex_string(canonical_headers(headers));\n    sign_streaming_payload(\n        HMAC_SHA256_TRAILER,\n        running_signature,\n        params,\n        &payload_hash,\n    )\n}\n\nfn sign_streaming_payload<'a, S>(\n    algorithm: &str,\n    running_signature: &'a str,\n    params: &'a SigningParams<'a, S>,\n    payload_hash: &str,\n) -> Result<SigningOutput<()>, SigningError> {\n    let creds = params\n        .identity\n        .data::<Credentials>()\n        .expect(\"identity must contain credentials\");\n\n    let signing_key = generate_signing_key(\n        creds.secret_access_key(),\n        params.time,\n        params.region,\n        params.name,\n    );\n\n    let scope = format!(\n        \"{}/{}/{}/aws4_request\",\n        format_date(params.time),\n        params.region,\n        params.name\n    );\n\n    let string_to_sign = format!(\n        \"{}\\n{}\\n{}\\n{}\\n{}\",\n        algorithm,\n        format_date_time(params.time),\n        scope,\n        running_signature,\n        payload_hash,\n    );\n\n    let signature = calculate_signature(signing_key, string_to_sign.as_bytes());\n    Ok(SigningOutput::new((), signature))\n}\n\n#[cfg(test)]\nmod tests {\n    use super::{calculate_signature, generate_signing_key, sha256_hex_string};\n    use crate::date_time::test_parsers::parse_date_time;\n\n    #[test]\n    fn test_signature_calculation() {\n        let secret = \"wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY\";\n        let creq = r#\"AWS4-HMAC-SHA256\n20150830T123600Z\n20150830/us-east-1/iam/aws4_request\nf536975d06c0309214f805bb90ccff089219ecd68b2577efef23edd43b7e1a59\"#;\n        let time = parse_date_time(\"20150830T123600Z\").unwrap();\n\n        let derived_key = generate_signing_key(secret, time, \"us-east-1\", \"iam\");\n        let signature = calculate_signature(derived_key, creq.as_bytes());\n\n        let expected = \"5d672d79c15b13162d9279b0855cfba6789a8edb4c82c400e06b5924a6f2b5d7\";\n        assert_eq!(expected, &signature);\n    }\n\n    #[test]\n    fn sign_payload_empty_string() {\n        let expected = \"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\";\n        let actual = sha256_hex_string([]);\n        assert_eq!(expected, actual);\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/src/sign/v4a.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_smithy_runtime_api::client::identity::Identity;\nuse bytes::{BufMut, BytesMut};\nuse crypto_bigint::{CheckedAdd, CheckedSub, Encoding, U256};\nuse p256::ecdsa::signature::Signer;\nuse p256::ecdsa::{Signature, SigningKey};\nuse std::io::Write;\nuse std::sync::LazyLock;\nuse std::time::SystemTime;\nuse zeroize::Zeroizing;\n\nconst ALGORITHM: &[u8] = b\"AWS4-ECDSA-P256-SHA256\";\nstatic BIG_N_MINUS_2: LazyLock<U256> = LazyLock::new(|| {\n    // The N value from section 3.2.1.3 of https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-186.pdf\n    // Used as the N value for the algorithm described in section A.2.2 of https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-5.pdf\n    // *(Basically a prime number blessed by the NSA for use in p256)*\n    const ORDER: U256 =\n        U256::from_be_hex(\"ffffffff00000000ffffffffffffffffbce6faada7179e84f3b9cac2fc632551\");\n    ORDER.checked_sub(&U256::from(2u32)).unwrap()\n});\n\n/// Calculates a Sigv4a signature\npub fn calculate_signature(signing_key: impl AsRef<[u8]>, string_to_sign: &[u8]) -> String {\n    let signing_key = SigningKey::from_bytes(signing_key.as_ref()).unwrap();\n    let signature: Signature = signing_key.sign(string_to_sign);\n    // This conversion sucks but we have to do it afaict. Because we also use\n    // the HMAC crate, we have to use a compatible (and therefore older) version\n    // of the p256 crate. That older version requires us to convert between\n    // signature types instead of using DER-encoded signatures directly.\n    let signature = signature.to_der();\n    hex::encode(signature.as_ref())\n}\n\n/// Generates a signing key for Sigv4a signing.\npub fn generate_signing_key(access_key: &str, secret_access_key: &str) -> impl AsRef<[u8]> {\n    // Capacity is the secret access key length plus the length of \"AWS4A\"\n    let mut input_key = Zeroizing::new(Vec::with_capacity(secret_access_key.len() + 5));\n    write!(input_key, \"AWS4A{secret_access_key}\").unwrap();\n\n    // Capacity is the access key length plus the counter byte\n    let mut kdf_context = Zeroizing::new(Vec::with_capacity(access_key.len() + 1));\n    let mut counter = Zeroizing::new(1u8);\n    let key = loop {\n        write!(kdf_context, \"{access_key}\").unwrap();\n        kdf_context.push(*counter);\n\n        let mut fis = ALGORITHM.to_vec();\n        fis.push(0);\n        fis.append(&mut kdf_context);\n        fis.put_i32(256);\n\n        let key = ring::hmac::Key::new(ring::hmac::HMAC_SHA256, &input_key);\n\n        let mut buf = BytesMut::new();\n        buf.put_i32(1);\n        buf.put_slice(&fis);\n        let tag = ring::hmac::sign(&key, &buf);\n        let tag = &tag.as_ref()[0..32];\n\n        let k0 = U256::from_be_bytes(tag.try_into().expect(\"convert to [u8; 32]\"));\n\n        // It would be more secure for this to be a constant time comparison, but because this\n        // is for client usage, that's not as big a deal.\n        if k0 <= *BIG_N_MINUS_2 {\n            let pk = k0\n                .checked_add(&U256::ONE)\n                .expect(\"k0 is always less than U256::MAX\");\n            let d = Zeroizing::new(pk.to_be_bytes());\n            break SigningKey::from_bytes(d.as_ref()).unwrap();\n        }\n\n        *counter = counter\n            .checked_add(1)\n            .expect(\"counter will never get to 255\");\n    };\n\n    key.to_bytes()\n}\n\n/// Parameters to use when signing.\n#[derive(Debug)]\n#[non_exhaustive]\npub struct SigningParams<'a, S> {\n    /// The identity to use when signing a request\n    pub(crate) identity: &'a Identity,\n\n    /// Region set to sign for.\n    pub(crate) region_set: &'a str,\n    /// Service Name to sign for.\n    ///\n    /// NOTE: Endpoint resolution rules may specify a name that differs from the typical service name.\n    pub(crate) name: &'a str,\n    /// Timestamp to use in the signature (should be `SystemTime::now()` unless testing).\n    pub(crate) time: SystemTime,\n\n    /// Additional signing settings. These differ between HTTP and Event Stream.\n    pub(crate) settings: S,\n}\n\npub(crate) const ECDSA_256: &str = \"AWS4-ECDSA-P256-SHA256\";\n\nimpl<S> SigningParams<'_, S> {\n    /// Returns the region that will be used to sign SigV4a requests\n    pub fn region_set(&self) -> &str {\n        self.region_set\n    }\n\n    /// Returns the service name that will be used to sign requests\n    pub fn name(&self) -> &str {\n        self.name\n    }\n\n    /// Return the name of the algorithm used to sign requests\n    pub fn algorithm(&self) -> &'static str {\n        ECDSA_256\n    }\n}\n\nimpl<'a, S: Default> SigningParams<'a, S> {\n    /// Returns a builder that can create new `SigningParams`.\n    pub fn builder() -> signing_params::Builder<'a, S> {\n        Default::default()\n    }\n}\n\n/// Builder and error for creating [`SigningParams`]\npub mod signing_params {\n    use super::SigningParams;\n    use aws_smithy_runtime_api::client::identity::Identity;\n    use std::error::Error;\n    use std::fmt;\n    use std::time::SystemTime;\n\n    /// [`SigningParams`] builder error\n    #[derive(Debug)]\n    pub struct BuildError {\n        reason: &'static str,\n    }\n    impl BuildError {\n        fn new(reason: &'static str) -> Self {\n            Self { reason }\n        }\n    }\n\n    impl fmt::Display for BuildError {\n        fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n            write!(f, \"{}\", self.reason)\n        }\n    }\n\n    impl Error for BuildError {}\n\n    /// Builder that can create new [`SigningParams`]\n    #[derive(Debug, Default)]\n    pub struct Builder<'a, S> {\n        identity: Option<&'a Identity>,\n        region_set: Option<&'a str>,\n        name: Option<&'a str>,\n        time: Option<SystemTime>,\n        settings: Option<S>,\n    }\n\n    impl<'a, S> Builder<'a, S> {\n        builder_methods!(\n            set_identity,\n            identity,\n            &'a Identity,\n            \"Sets the identity (required)\",\n            set_region_set,\n            region_set,\n            &'a str,\n            \"Sets the region set (required)\",\n            set_name,\n            name,\n            &'a str,\n            \"Sets the name (required)\",\n            set_time,\n            time,\n            SystemTime,\n            \"Sets the time to be used in the signature (required)\",\n            set_settings,\n            settings,\n            S,\n            \"Sets additional signing settings (required)\"\n        );\n\n        /// Builds an instance of [`SigningParams`]. Will yield a [`BuildError`] if\n        /// a required argument was not given.\n        pub fn build(self) -> Result<SigningParams<'a, S>, BuildError> {\n            Ok(SigningParams {\n                identity: self\n                    .identity\n                    .ok_or_else(|| BuildError::new(\"identity is required\"))?,\n                region_set: self\n                    .region_set\n                    .ok_or_else(|| BuildError::new(\"region_set is required\"))?,\n                name: self\n                    .name\n                    .ok_or_else(|| BuildError::new(\"name is required\"))?,\n                time: self\n                    .time\n                    .ok_or_else(|| BuildError::new(\"time is required\"))?,\n                settings: self\n                    .settings\n                    .ok_or_else(|| BuildError::new(\"settings are required\"))?,\n            })\n        }\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-sigv4/src/sign.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Functions to create signing keys and calculate signatures.\n\n// macro lifted from aws-smithy-runtime-api—eventually just inline these and delete macro.\nmacro_rules! builder_methods {\n    ($fn_name:ident, $arg_name:ident, $ty:ty, $doc:literal, $($tail:tt)+) => {\n        builder_methods!($fn_name, $arg_name, $ty, $doc);\n        builder_methods!($($tail)+);\n    };\n    ($fn_name:ident, $arg_name:ident, $ty:ty, $doc:literal) => {\n        #[doc = $doc]\n        pub fn $fn_name(&mut self, $arg_name: Option<$ty>) -> &mut Self {\n            self.$arg_name = $arg_name;\n            self\n        }\n\n        #[doc = $doc]\n        pub fn $arg_name(mut self, $arg_name: $ty) -> Self {\n            self.$arg_name = Some($arg_name);\n            self\n        }\n    };\n}\n\n/// Support for Sigv4 signing\npub mod v4;\n\n/// Support for Sigv4a signing\n#[cfg(feature = \"sigv4a\")]\npub mod v4a;\n"
  },
  {
    "path": "aws/rust-runtime/aws-types/Cargo.toml",
    "content": "[package]\nname = \"aws-types\"\nversion = \"1.3.15\"\nauthors = [\"AWS Rust SDK Team <aws-sdk-rust@amazon.com>\", \"Russell Cohen <rcoh@amazon.com>\"]\ndescription = \"Cross-service types for the AWS SDK.\"\nedition = \"2021\"\nlicense = \"Apache-2.0\"\nrepository = \"https://github.com/smithy-lang/smithy-rs\"\nrust-version = \"1.91.1\"\n\n[features]\n# This feature is to be used only for doc comments\nexamples = [\"dep:hyper-rustls\", \"aws-smithy-runtime/client\", \"aws-smithy-runtime/connector-hyper-0-14-x\", \"aws-smithy-runtime/tls-rustls\"]\n\n[dependencies]\naws-credential-types = { path = \"../aws-credential-types\" }\naws-smithy-async = { path = \"../../../rust-runtime/aws-smithy-async\" }\naws-smithy-types = { path = \"../../../rust-runtime/aws-smithy-types\" }\naws-smithy-runtime = { path = \"../../../rust-runtime/aws-smithy-runtime\", optional = true }\naws-smithy-runtime-api = { path = \"../../../rust-runtime/aws-smithy-runtime-api\", features = [\"client\"] }\ntracing = \"0.1.44\"\n# cargo does not support optional test dependencies, so to completely disable rustls\n# we need to add the webpki-roots feature here.\n# https://github.com/rust-lang/cargo/issues/1596\nhyper-rustls = { version = \"0.24.2\", optional = true, default-features = false, features = [\"http2\", \"webpki-roots\"] }\n\n[dev-dependencies]\nhttp = \"0.2.4\"\ntempfile = \"3.16.0\"\ntracing-test = \"0.2.5\"\ntokio = { version = \"1\", features = [\"rt\", \"macros\"] }\naws-smithy-runtime-api = { path = \"../../../rust-runtime/aws-smithy-runtime-api\", features = [\"http-02x\"] }\naws-smithy-runtime = { path = \"../../../rust-runtime/aws-smithy-runtime\", features = [\"client\"] }\n\n[build-dependencies]\nrustc_version = \"0.4.0\"\n\n[package.metadata.docs.rs]\nall-features = true\ntargets = [\"x86_64-unknown-linux-gnu\"]\ncargo-args = [\"-Zunstable-options\", \"-Zrustdoc-scrape-examples\"]\nrustdoc-args = [\"--cfg\", \"docsrs\"]\n# End of docs.rs metadata\n\n# make sure to keep crate stability in sync with the second element of the following tuple in\n# buildSrc/src/main/kotlin/CrateSet.kt:\n#  Crate(\"aws-types\", STABLE_VERSION_PROP_NAME),\n[package.metadata.smithy-rs-release-tooling]\nstable = true\n\n[package.metadata.cargo-udeps.ignore]\n# used only in doc strings\nnormal = [\"aws-smithy-runtime\", \"hyper-rustls\"]\ndevelopment = [\"aws-smithy-runtime\"]\n"
  },
  {
    "path": "aws/rust-runtime/aws-types/LICENSE",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n"
  },
  {
    "path": "aws/rust-runtime/aws-types/README.md",
    "content": "# aws-types\n\nCross-service types for AWS SDKs. Generally, types in this module will be re-exported by either specific service clients\nor [`aws-config`](https://crates.io/crates/aws-config).\n\n<!-- anchor_start:footer -->\nThis crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly.\n<!-- anchor_end:footer -->\n"
  },
  {
    "path": "aws/rust-runtime/aws-types/additional-ci",
    "content": "#!/bin/bash\n#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\n\n# This script contains additional CI checks to run for this specific package\n\nset -e\n\necho \"### Checking for duplicate dependency versions in the normal dependency graph with all features enabled\"\ncargo tree -d --edges normal --all-features\n"
  },
  {
    "path": "aws/rust-runtime/aws-types/build.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nextern crate rustc_version;\n\nuse std::env;\nuse std::fs::File;\nuse std::io::Write;\nuse std::path::Path;\n\nfn generate_build_vars(output_path: &Path) {\n    let rust_version = rustc_version::version().expect(\"Could not retrieve rustc version\");\n    let mut f =\n        File::create(output_path.join(\"build_env.rs\")).expect(\"Could not create build environment\");\n    f.write_all(format!(\"const RUST_VERSION: &str = \\\"{rust_version}\\\";\").as_bytes())\n        .expect(\"Unable to write rust version\");\n    f.flush().expect(\"failed to flush\");\n}\n\nfn main() {\n    let out_dir = env::var_os(\"OUT_DIR\").expect(\"OUT_DIR not specified\");\n    let out_path = Path::new(&out_dir).to_owned();\n\n    generate_build_vars(&out_path);\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-types/external-types.toml",
    "content": "allowed_external_types = [\n    \"aws_credential_types::provider::credentials::SharedCredentialsProvider\",\n    \"aws_credential_types::provider::token::SharedTokenProvider\",\n    \"aws_smithy_async::rt::sleep::AsyncSleep\",\n    \"aws_smithy_async::rt::sleep::SharedAsyncSleep\",\n    \"aws_smithy_async::time::SharedTimeSource\",\n    \"aws_smithy_async::time::TimeSource\",\n    \"aws_smithy_runtime_api::client::auth::AuthSchemePreference\",\n    \"aws_smithy_runtime_api::client::behavior_version::BehaviorVersion\",\n    \"aws_smithy_runtime_api::client::http::HttpClient\",\n    \"aws_smithy_runtime_api::client::http::SharedHttpClient\",\n    \"aws_smithy_runtime_api::client::identity::ResolveCachedIdentity\",\n    \"aws_smithy_runtime_api::client::identity::SharedIdentityCache\",\n    \"aws_smithy_runtime_api::client::stalled_stream_protection::StalledStreamProtectionConfig\",\n    \"aws_smithy_runtime_api::http::headers::Headers\",\n    \"aws_smithy_types::checksum_config::ResponseChecksumValidation\",\n    \"aws_smithy_types::checksum_config::RequestChecksumCalculation\",\n    \"aws_smithy_types::config_bag::storable::Storable\",\n    \"aws_smithy_types::config_bag::storable::StoreReplace\",\n    \"aws_smithy_types::error::metadata::Builder\",\n    \"aws_smithy_types::retry::RetryConfig\",\n    \"aws_smithy_types::timeout::TimeoutConfig\",\n]\n"
  },
  {
    "path": "aws/rust-runtime/aws-types/src/app_name.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! New-type for a configurable app name.\n\nuse aws_smithy_types::config_bag::{Storable, StoreReplace};\nuse std::borrow::Cow;\nuse std::error::Error;\nuse std::fmt;\nuse std::sync::atomic::{AtomicBool, Ordering};\n\nstatic APP_NAME_LEN_RECOMMENDATION_WARN_EMITTED: AtomicBool = AtomicBool::new(false);\n\n/// App name that can be configured with an AWS SDK client to become part of the user agent string.\n///\n/// This name is used to identify the application in the user agent that gets sent along with requests.\n///\n/// The name may only have alphanumeric characters and any of these characters:\n/// ```text\n/// !#$%&'*+-.^_`|~\n/// ```\n/// Spaces are not allowed.\n///\n/// App names are recommended to be no more than 50 characters.\n#[derive(Clone, Debug, PartialEq, Eq)]\npub struct AppName(Cow<'static, str>);\n\nimpl AsRef<str> for AppName {\n    fn as_ref(&self) -> &str {\n        &self.0\n    }\n}\n\nimpl fmt::Display for AppName {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        write!(f, \"{}\", self.0)\n    }\n}\n\nimpl Storable for AppName {\n    type Storer = StoreReplace<AppName>;\n}\n\nimpl AppName {\n    /// Creates a new app name.\n    ///\n    /// This will return an `InvalidAppName` error if the given name doesn't meet the\n    /// character requirements. See [`AppName`] for details on these requirements.\n    pub fn new(app_name: impl Into<Cow<'static, str>>) -> Result<Self, InvalidAppName> {\n        let app_name = app_name.into();\n\n        if app_name.is_empty() {\n            return Err(InvalidAppName);\n        }\n        fn valid_character(c: char) -> bool {\n            match c {\n                _ if c.is_ascii_alphanumeric() => true,\n                '!' | '#' | '$' | '%' | '&' | '\\'' | '*' | '+' | '-' | '.' | '^' | '_' | '`'\n                | '|' | '~' => true,\n                _ => false,\n            }\n        }\n        if !app_name.chars().all(valid_character) {\n            return Err(InvalidAppName);\n        }\n        if app_name.len() > 50 {\n            if let Ok(false) = APP_NAME_LEN_RECOMMENDATION_WARN_EMITTED.compare_exchange(\n                false,\n                true,\n                Ordering::Acquire,\n                Ordering::Relaxed,\n            ) {\n                tracing::warn!(\n                    \"The `app_name` set when configuring the SDK client is recommended \\\n                     to have no more than 50 characters.\"\n                )\n            }\n        }\n        Ok(Self(app_name))\n    }\n}\n\n/// Error for when an app name doesn't meet character requirements.\n///\n/// See [`AppName`] for details on these requirements.\n#[derive(Debug)]\n#[non_exhaustive]\npub struct InvalidAppName;\n\nimpl Error for InvalidAppName {}\n\nimpl fmt::Display for InvalidAppName {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        write!(\n            f,\n            \"The app name can only have alphanumeric characters, or any of \\\n             '!' |  '#' |  '$' |  '%' |  '&' |  '\\\\'' |  '*' |  '+' |  '-' | \\\n             '.' |  '^' |  '_' |  '`' |  '|' |  '~'\"\n        )\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::AppName;\n    use crate::app_name::APP_NAME_LEN_RECOMMENDATION_WARN_EMITTED;\n    use std::sync::atomic::Ordering;\n\n    #[test]\n    fn validation() {\n        assert!(AppName::new(\"asdf1234ASDF!#$%&'*+-.^_`|~\").is_ok());\n        assert!(AppName::new(\"foo bar\").is_err());\n        assert!(AppName::new(\"🚀\").is_err());\n        assert!(AppName::new(\"\").is_err());\n    }\n\n    #[tracing_test::traced_test]\n    #[test]\n    fn log_warn_once() {\n        // Pre-condition: make sure we start in the expected state of having never logged this\n        assert!(!APP_NAME_LEN_RECOMMENDATION_WARN_EMITTED.load(Ordering::Relaxed));\n\n        // Verify a short app name doesn't log\n        AppName::new(\"not-long\").unwrap();\n        assert!(!logs_contain(\n            \"is recommended to have no more than 50 characters\"\n        ));\n        assert!(!APP_NAME_LEN_RECOMMENDATION_WARN_EMITTED.load(Ordering::Relaxed));\n\n        // Verify a long app name logs\n        AppName::new(\"greaterthanfiftycharactersgreaterthanfiftycharacters\").unwrap();\n        assert!(logs_contain(\n            \"is recommended to have no more than 50 characters\"\n        ));\n        assert!(APP_NAME_LEN_RECOMMENDATION_WARN_EMITTED.load(Ordering::Relaxed));\n\n        // Now verify it only logs once ever\n\n        // HACK: there's no way to reset tracing-test, so just\n        // reach into its internals and clear it manually\n        tracing_test::internal::global_buf().lock().unwrap().clear();\n\n        AppName::new(\"greaterthanfiftycharactersgreaterthanfiftycharacters\").unwrap();\n        assert!(!logs_contain(\n            \"is recommended to have no more than 50 characters\"\n        ));\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-types/src/build_metadata.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Metadata type used by all service SDKs to provide information about the environment the SDK was compiled for.\n\ninclude!(concat!(env!(\"OUT_DIR\"), \"/build_env.rs\"));\n\n/// Metadata about the environment the SDK was compiled for.\n#[derive(Debug)]\npub struct BuildMetadata {\n    /// Which version of Rust was used to compile the SDK.\n    pub rust_version: &'static str,\n    /// The version number of the `aws-types` crate compiled with the SDK.\n    pub core_pkg_version: &'static str,\n    /// The OS the SDK was compiled for.\n    pub os_family: OsFamily,\n}\n\n/// Operating system family that the SDK can be compiled for\n#[derive(PartialEq, Eq, Clone, Debug)]\npub enum OsFamily {\n    /// Microsoft Windows\n    Windows,\n    /// Linux\n    Linux,\n    /// Apple MacOS\n    Macos,\n    /// Google Android\n    Android,\n    /// Apple iOS\n    Ios,\n    /// A different family of operating system\n    Other,\n}\n\n/// Check the current OS against a list of options\n///\n/// You can't directly inspect the value of a `cfg` param. Instead, you need to check if the param\n/// is set to a specific value. This macro simplifies checking the current OS family.\n///\n/// Usage:\n/// ```ignore\n/// let os = get_os_family!(target_os: (\"linux\", OsFamily::Windows), (\"android\", OsFamily::Android));\n/// ```\nmacro_rules! get_os_family {\n    ($i:ident : $(($s:expr, $t:expr)),+) => (\n        { const fn __getcfg() -> OsFamily { $( if cfg!($i=$s) { return $t; } );+ OsFamily::Other } __getcfg()  }\n    )\n}\n\nimpl OsFamily {\n    /// Returns the OS family this crate was compiled for.\n    pub const fn from_env() -> Self {\n        // values from https://doc.rust-lang.org/reference/conditional-compilation.html#target_os\n        get_os_family!(target_os:\n            (\"windows\", OsFamily::Windows),\n            (\"macos\", OsFamily::Macos),\n            (\"ios\", OsFamily::Ios),\n            (\"linux\", OsFamily::Linux),\n            (\"android\", OsFamily::Android)\n        )\n    }\n}\n\nimpl From<&str> for OsFamily {\n    fn from(s: &str) -> Self {\n        match s {\n            \"windows\" => OsFamily::Windows,\n            \"macos\" => OsFamily::Macos,\n            \"ios\" => OsFamily::Ios,\n            \"linux\" => OsFamily::Linux,\n            \"android\" => OsFamily::Android,\n            _ => OsFamily::Other,\n        }\n    }\n}\n\n/// Constant build metadata for this crate.\npub const BUILD_METADATA: BuildMetadata = BuildMetadata {\n    rust_version: RUST_VERSION,\n    core_pkg_version: env!(\"CARGO_PKG_VERSION\"),\n    os_family: OsFamily::from_env(),\n};\n\n#[cfg(test)]\nmod test {\n    use crate::build_metadata::{OsFamily, BUILD_METADATA};\n\n    #[test]\n    fn valid_build_metadata() {\n        let meta = &BUILD_METADATA;\n        // obviously a slightly brittle test. Will be a small update for Rust 2.0 and GA :-)\n        assert!(meta.rust_version.starts_with(\"1.\"));\n        // In our release process towards GA, the package version could either be 0. or 1.\n        // so we need to make this `assert!` more flexible.\n        assert!(meta.core_pkg_version.starts_with(\"0.\") || meta.core_pkg_version.starts_with(\"1.\"));\n        // quick sanity check that we're parsing common platforms correctly\n        if cfg!(target_os = \"linux\") {\n            assert_eq!(meta.os_family, OsFamily::Linux);\n        }\n        if cfg!(target_os = \"macos\") {\n            assert_eq!(meta.os_family, OsFamily::Macos);\n        }\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-types/src/endpoint_config.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Newtypes for endpoint-related parameters\n//!\n//! Parameters require newtypes so they have distinct types when stored in layers in config bag.\n\nuse std::fmt;\nuse std::str::FromStr;\n\nuse aws_smithy_types::config_bag::{Storable, StoreReplace};\n\n/// Newtype for `use_fips`\n#[derive(Clone, Debug)]\npub struct UseFips(pub bool);\nimpl Storable for UseFips {\n    type Storer = StoreReplace<UseFips>;\n}\n\n/// Newtype for `use_dual_stack`\n#[derive(Clone, Debug)]\npub struct UseDualStack(pub bool);\nimpl Storable for UseDualStack {\n    type Storer = StoreReplace<UseDualStack>;\n}\n\n/// Newtype for `endpoint_url`\n#[derive(Clone, Debug)]\npub struct EndpointUrl(pub String);\nimpl Storable for EndpointUrl {\n    type Storer = StoreReplace<EndpointUrl>;\n}\n\nconst PREFERRED: &str = \"preferred\";\nconst DISABLED: &str = \"disabled\";\nconst REQUIRED: &str = \"required\";\n\n/// Setting to control the account ID-based routing behavior.\n#[non_exhaustive]\n#[derive(Debug, Clone, PartialEq, Eq, Default)]\npub enum AccountIdEndpointMode {\n    /// The endpoint should include account ID if available.\n    #[default]\n    Preferred,\n    /// A resolved endpoint does not include account ID.\n    Disabled,\n    /// The endpoint must include account ID. If the account ID isn't available, the SDK throws an error.\n    Required,\n}\n\nimpl AccountIdEndpointMode {\n    fn all_variants() -> [AccountIdEndpointMode; 3] {\n        use AccountIdEndpointMode::*;\n        [Preferred, Disabled, Required]\n    }\n}\n\nimpl Storable for AccountIdEndpointMode {\n    type Storer = StoreReplace<Self>;\n}\n\nimpl fmt::Display for AccountIdEndpointMode {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> std::fmt::Result {\n        use AccountIdEndpointMode::*;\n        write!(\n            f,\n            \"{}\",\n            match self {\n                Preferred => \"preferred\",\n                Disabled => \"disabled\",\n                Required => \"required\",\n            }\n        )\n    }\n}\n\nimpl FromStr for AccountIdEndpointMode {\n    type Err = AccountIdEndpointModeParseError;\n\n    fn from_str(mode_str: &str) -> Result<Self, Self::Err> {\n        if mode_str.eq_ignore_ascii_case(PREFERRED) {\n            Ok(Self::Preferred)\n        } else if mode_str.eq_ignore_ascii_case(DISABLED) {\n            Ok(Self::Disabled)\n        } else if mode_str.eq_ignore_ascii_case(REQUIRED) {\n            Ok(Self::Required)\n        } else {\n            Err(AccountIdEndpointModeParseError::new(mode_str))\n        }\n    }\n}\n\n/// Error encountered when failing to parse a string into [`AccountIdEndpointMode`].\n#[derive(Debug)]\npub struct AccountIdEndpointModeParseError {\n    mode_string: String,\n}\n\nimpl AccountIdEndpointModeParseError {\n    fn new(mode_string: impl Into<String>) -> Self {\n        Self {\n            mode_string: mode_string.into(),\n        }\n    }\n}\n\nimpl fmt::Display for AccountIdEndpointModeParseError {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        write!(\n            f,\n            \"error parsing string `{}` as `AccountIdEndpointMode`, valid options are: {:#?}\",\n            self.mode_string,\n            AccountIdEndpointMode::all_variants().map(|mode| mode.to_string())\n        )\n    }\n}\n\nimpl std::error::Error for AccountIdEndpointModeParseError {}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n\n    #[test]\n    fn parse_ok_account_id_endpoint_mode() {\n        assert_eq!(\n            AccountIdEndpointMode::Preferred,\n            AccountIdEndpointMode::from_str(\"preferred\").unwrap()\n        );\n        assert_eq!(\n            AccountIdEndpointMode::Disabled,\n            AccountIdEndpointMode::from_str(\"disabled\").unwrap()\n        );\n        assert_eq!(\n            AccountIdEndpointMode::Required,\n            AccountIdEndpointMode::from_str(\"required\").unwrap()\n        );\n    }\n\n    #[test]\n    fn parse_err_account_id_endpoint_mode() {\n        let err = AccountIdEndpointMode::from_str(\"invalid\").err().unwrap();\n        assert_eq!(\n            r#\"error parsing string `invalid` as `AccountIdEndpointMode`, valid options are: [\n    \"preferred\",\n    \"disabled\",\n    \"required\",\n]\"#,\n            format!(\"{err}\")\n        );\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-types/src/lib.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/* Automatically managed default lints */\n#![cfg_attr(docsrs, feature(doc_cfg))]\n/* End of automatically managed default lints */\n//! Cross-service types for the AWS SDK.\n\n#![allow(clippy::derive_partial_eq_without_eq)]\n#![warn(\n    missing_docs,\n    rustdoc::missing_crate_level_docs,\n    missing_debug_implementations,\n    rust_2018_idioms,\n    unreachable_pub\n)]\n\npub mod app_name;\npub mod build_metadata;\npub mod endpoint_config;\npub mod origin;\npub mod os_shim_internal;\npub mod region;\npub mod request_id;\npub mod sdk_config;\npub mod service_config;\n\npub use sdk_config::SdkConfig;\n\nuse aws_smithy_types::config_bag::{Storable, StoreReplace};\nuse std::borrow::Cow;\n\n/// The name of the service used to sign this request\n///\n/// Generally, user code should never interact with `SigningName` directly\n#[derive(Clone, Debug, PartialEq, Eq)]\npub struct SigningName(Cow<'static, str>);\nimpl AsRef<str> for SigningName {\n    fn as_ref(&self) -> &str {\n        &self.0\n    }\n}\n\nimpl SigningName {\n    /// Creates a `SigningName` from a static str.\n    pub fn from_static(name: &'static str) -> Self {\n        SigningName(Cow::Borrowed(name))\n    }\n}\n\nimpl From<String> for SigningName {\n    fn from(name: String) -> Self {\n        SigningName(Cow::Owned(name))\n    }\n}\n\nimpl From<&'static str> for SigningName {\n    fn from(name: &'static str) -> Self {\n        Self::from_static(name)\n    }\n}\n\nimpl Storable for SigningName {\n    type Storer = StoreReplace<Self>;\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-types/src/origin.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Types for tracking the origin of config values.\n\nuse std::cmp::Ordering;\nuse std::fmt;\n\n/// A type for tracking the origin of config values.\n#[derive(Debug, Clone, Copy, PartialEq, PartialOrd)]\n#[non_exhaustive]\npub struct Origin {\n    inner: Inner,\n}\n\nimpl fmt::Display for Origin {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        use Inner::*;\n\n        match self.inner {\n            Imds => write!(f, \"IMDS\"),\n            ProfileFile(Kind::Shared) => write!(f, \"shared profile file\"),\n            ProfileFile(Kind::Service) => write!(f, \"service profile file\"),\n            EnvironmentVariable(Kind::Shared) => write!(f, \"shared environment variable\"),\n            EnvironmentVariable(Kind::Service) => write!(f, \"service environment variable\"),\n            Programmatic(Kind::Shared) => write!(f, \"shared client\"),\n            Programmatic(Kind::Service) => write!(f, \"service client\"),\n            Unknown => write!(f, \"unknown\"),\n        }\n    }\n}\n\nimpl Origin {\n    /// The origin is unknown.\n    pub fn unknown() -> Self {\n        Self {\n            inner: Inner::Unknown,\n        }\n    }\n\n    /// Set with IMDS.\n    pub fn imds() -> Self {\n        Self { inner: Inner::Imds }\n    }\n\n    /// Set on a shared config struct.\n    pub fn shared_config() -> Self {\n        Self {\n            inner: Inner::Programmatic(Kind::Shared),\n        }\n    }\n\n    /// Set on a service config struct.\n    pub fn service_config() -> Self {\n        Self {\n            inner: Inner::Programmatic(Kind::Service),\n        }\n    }\n\n    /// Set by an environment variable.\n    pub fn shared_environment_variable() -> Self {\n        Self {\n            inner: Inner::EnvironmentVariable(Kind::Shared),\n        }\n    }\n\n    /// Set by a service-specific environment variable.\n    pub fn service_environment_variable() -> Self {\n        Self {\n            inner: Inner::EnvironmentVariable(Kind::Service),\n        }\n    }\n\n    /// Set in a profile file.\n    pub fn shared_profile_file() -> Self {\n        Self {\n            inner: Inner::ProfileFile(Kind::Shared),\n        }\n    }\n\n    /// Service-specific, set in a profile file.\n    pub fn service_profile_file() -> Self {\n        Self {\n            inner: Inner::ProfileFile(Kind::Service),\n        }\n    }\n\n    /// Return true if the origin was set programmatically i.e. on an `SdkConfig` or service `Config`.\n    pub fn is_client_config(&self) -> bool {\n        matches!(\n            self,\n            Origin {\n                inner: Inner::Programmatic(..),\n                ..\n            }\n        )\n    }\n}\n\nimpl Default for Origin {\n    fn default() -> Self {\n        Self::unknown()\n    }\n}\n\n#[derive(Debug, Clone, Copy)]\nenum Inner {\n    Imds,\n    ProfileFile(Kind),\n    EnvironmentVariable(Kind),\n    Programmatic(Kind),\n    Unknown,\n}\n\nimpl Inner {\n    pub(self) fn is_unknown(&self) -> bool {\n        matches!(self, Inner::Unknown)\n    }\n}\n\n// Unknown is like NaN. It's not equal to anything, not even itself.\nimpl PartialEq for Inner {\n    fn eq(&self, other: &Self) -> bool {\n        use Inner::*;\n\n        match (self, other) {\n            (Imds, Imds) => true,\n            (Programmatic(a), Programmatic(b)) => a == b,\n            (EnvironmentVariable(a), EnvironmentVariable(b)) => a == b,\n            (ProfileFile(a), ProfileFile(b)) => a == b,\n            _ => false,\n        }\n    }\n}\n\nimpl PartialOrd for Inner {\n    fn partial_cmp(&self, other: &Self) -> Option<Ordering> {\n        use Inner::*;\n\n        if self.is_unknown() || other.is_unknown() {\n            return None;\n        }\n\n        match self {\n            // IMDS is the lowest priority\n            Imds => Some(Ordering::Less),\n            // ProfileFile is the second-lowest priority\n            ProfileFile(kind) => match other {\n                Imds => Some(Ordering::Greater),\n                ProfileFile(other_kind) => kind.partial_cmp(other_kind),\n                _ => Some(Ordering::Less),\n            },\n            // EnvironmentVariable is the second-highest priority\n            EnvironmentVariable(kind) => match other {\n                Imds | ProfileFile(_) => Some(Ordering::Greater),\n                EnvironmentVariable(other_kind) => kind.partial_cmp(other_kind),\n                _ => Some(Ordering::Less),\n            },\n            // Programmatic is the highest priority\n            Programmatic(kind) => match other {\n                Imds | EnvironmentVariable(_) | ProfileFile(_) => Some(Ordering::Greater),\n                Programmatic(other_kind) => kind.partial_cmp(other_kind),\n                _ => unreachable!(\n                    \"When we have something higher than programmatic we can update this case.\"\n                ),\n            },\n            _ => unreachable!(),\n        }\n    }\n}\n\n#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd)]\nenum Kind {\n    Shared,\n    Service,\n}\n\n#[cfg(test)]\nmod test {\n    use super::Origin;\n\n    #[test]\n    fn test_precedence_low_to_high() {\n        // Lowest to highest precedence\n        let list = [\n            Origin::imds(),\n            Origin::shared_profile_file(),\n            Origin::service_profile_file(),\n            Origin::shared_environment_variable(),\n            Origin::service_environment_variable(),\n            Origin::shared_config(),\n            Origin::service_config(),\n        ];\n\n        for window in list.windows(2) {\n            let &[a, b] = window else { unreachable!() };\n            assert!(a < b);\n        }\n    }\n\n    #[test]\n    fn test_precedence_high_to_low() {\n        // Highest to lowest precedence\n        let list = [\n            Origin::service_config(),\n            Origin::shared_config(),\n            Origin::service_environment_variable(),\n            Origin::shared_environment_variable(),\n            Origin::service_profile_file(),\n            Origin::shared_profile_file(),\n            Origin::imds(),\n        ];\n\n        for window in list.windows(2) {\n            let &[a, b] = window else { unreachable!() };\n            assert!(a > b);\n        }\n    }\n\n    #[test]\n    fn test_unknown_is_not_equal() {\n        assert_ne!(Origin::unknown(), Origin::imds());\n        assert_ne!(Origin::unknown(), Origin::shared_config());\n        assert_ne!(Origin::unknown(), Origin::service_config());\n        assert_ne!(Origin::unknown(), Origin::shared_environment_variable());\n        assert_ne!(Origin::unknown(), Origin::service_environment_variable());\n        assert_ne!(Origin::unknown(), Origin::shared_profile_file());\n        assert_ne!(Origin::unknown(), Origin::service_profile_file());\n        assert_ne!(Origin::unknown(), Origin::unknown());\n    }\n\n    #[test]\n    fn test_self_equality() {\n        assert_eq!(Origin::imds(), Origin::imds());\n        assert_eq!(Origin::shared_config(), Origin::shared_config());\n        assert_eq!(Origin::service_config(), Origin::service_config());\n        assert_eq!(\n            Origin::shared_environment_variable(),\n            Origin::shared_environment_variable()\n        );\n        assert_eq!(\n            Origin::service_environment_variable(),\n            Origin::service_environment_variable()\n        );\n        assert_eq!(Origin::shared_profile_file(), Origin::shared_profile_file());\n        assert_eq!(\n            Origin::service_profile_file(),\n            Origin::service_profile_file()\n        );\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-types/src/os_shim_internal.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Abstractions for testing code that interacts with the operating system:\n//! - Reading environment variables\n//! - Reading from the file system\n\nuse std::collections::HashMap;\nuse std::env::VarError;\nuse std::ffi::OsString;\nuse std::fmt::Debug;\nuse std::path::{Path, PathBuf};\nuse std::sync::{Arc, Mutex};\n\nuse crate::os_shim_internal::fs::Fake;\n\n/// File system abstraction\n///\n/// Simple abstraction enabling in-memory mocking of the file system\n///\n/// # Examples\n/// Construct a file system which delegates to `std::fs`:\n/// ```rust\n/// let fs = aws_types::os_shim_internal::Fs::real();\n/// ```\n///\n/// Construct an in-memory file system for testing:\n/// ```rust\n/// use std::collections::HashMap;\n/// let fs = aws_types::os_shim_internal::Fs::from_map({\n///     let mut map = HashMap::new();\n///     map.insert(\"/home/.aws/config\".to_string(), \"[default]\\nregion = us-east-1\");\n///     map\n/// });\n/// ```\n#[derive(Clone, Debug)]\npub struct Fs(fs::Inner);\n\nimpl Default for Fs {\n    fn default() -> Self {\n        Fs::real()\n    }\n}\n\nimpl Fs {\n    /// Create `Fs` representing a real file system.\n    pub fn real() -> Self {\n        Fs(fs::Inner::Real)\n    }\n\n    /// Create `Fs` from a map of `OsString` to `Vec<u8>`.\n    pub fn from_raw_map(fs: HashMap<OsString, Vec<u8>>) -> Self {\n        Fs(fs::Inner::Fake(Arc::new(Fake::MapFs(Mutex::new(fs)))))\n    }\n\n    /// Create `Fs` from a map of `String` to `Vec<u8>`.\n    pub fn from_map(data: HashMap<String, impl Into<Vec<u8>>>) -> Self {\n        let fs = data\n            .into_iter()\n            .map(|(k, v)| (k.into(), v.into()))\n            .collect();\n        Self::from_raw_map(fs)\n    }\n\n    /// Create a test filesystem rooted in real files\n    ///\n    /// Creates a test filesystem from the contents of `test_directory` rooted into `namespaced_to`.\n    ///\n    /// Example:\n    /// Given:\n    /// ```bash\n    /// $ ls\n    /// ./my-test-dir/aws-config\n    /// ./my-test-dir/aws-config/config\n    /// $ cat ./my-test-dir/aws-config/config\n    /// test-config\n    /// ```\n    /// ```rust,no_run\n    /// # async fn docs() {\n    /// use aws_types::os_shim_internal::{Env, Fs};\n    /// let env = Env::from_slice(&[(\"HOME\", \"/Users/me\")]);\n    /// let fs = Fs::from_test_dir(\"my-test-dir/aws-config\", \"/Users/me/.aws/config\");\n    /// assert_eq!(fs.read_to_end(\"/Users/me/.aws/config\").await.unwrap(), b\"test-config\");\n    /// # }\n    pub fn from_test_dir(\n        test_directory: impl Into<PathBuf>,\n        namespaced_to: impl Into<PathBuf>,\n    ) -> Self {\n        Self(fs::Inner::Fake(Arc::new(Fake::NamespacedFs {\n            real_path: test_directory.into(),\n            namespaced_to: namespaced_to.into(),\n        })))\n    }\n\n    /// Create a fake process environment from a slice of tuples.\n    ///\n    /// # Examples\n    /// ```rust\n    /// # async fn example() {\n    /// use aws_types::os_shim_internal::Fs;\n    /// let mock_fs = Fs::from_slice(&[\n    ///     (\"config\", \"[default]\\nretry_mode = \\\"standard\\\"\"),\n    /// ]);\n    /// assert_eq!(mock_fs.read_to_end(\"config\").await.unwrap(), b\"[default]\\nretry_mode = \\\"standard\\\"\");\n    /// # }\n    /// ```\n    pub fn from_slice<'a>(files: &[(&'a str, &'a str)]) -> Self {\n        let fs: HashMap<String, Vec<u8>> = files\n            .iter()\n            .map(|(k, v)| {\n                let k = (*k).to_owned();\n                let v = v.as_bytes().to_vec();\n                (k, v)\n            })\n            .collect();\n\n        Self::from_map(fs)\n    }\n\n    /// Read the entire contents of a file\n    ///\n    /// _Note: This function is currently `async` primarily for forward compatibility. Currently,\n    /// this function does not use Tokio (or any other runtime) to perform IO, the IO is performed\n    /// directly within the function._\n    pub async fn read_to_end(&self, path: impl AsRef<Path>) -> std::io::Result<Vec<u8>> {\n        use fs::Inner;\n        let path = path.as_ref();\n        match &self.0 {\n            // TODO(https://github.com/awslabs/aws-sdk-rust/issues/867): Use async IO below\n            Inner::Real => std::fs::read(path),\n            Inner::Fake(fake) => match fake.as_ref() {\n                Fake::MapFs(fs) => fs\n                    .lock()\n                    .unwrap()\n                    .get(path.as_os_str())\n                    .cloned()\n                    .ok_or_else(|| std::io::ErrorKind::NotFound.into()),\n                Fake::NamespacedFs {\n                    real_path,\n                    namespaced_to,\n                } => {\n                    let actual_path = path\n                        .strip_prefix(namespaced_to)\n                        .map_err(|_| std::io::Error::from(std::io::ErrorKind::NotFound))?;\n                    std::fs::read(real_path.join(actual_path))\n                }\n            },\n        }\n    }\n\n    /// Write a slice as the entire contents of a file.\n    ///\n    /// This is equivalent to `std::fs::write`.\n    pub async fn write(\n        &self,\n        path: impl AsRef<Path>,\n        contents: impl AsRef<[u8]>,\n    ) -> std::io::Result<()> {\n        use fs::Inner;\n        match &self.0 {\n            // TODO(https://github.com/awslabs/aws-sdk-rust/issues/867): Use async IO below\n            Inner::Real => {\n                std::fs::write(&path, contents)?;\n\n                #[cfg(unix)]\n                {\n                    use std::os::unix::fs::PermissionsExt;\n                    std::fs::set_permissions(path, std::fs::Permissions::from_mode(0o600))?;\n                }\n            }\n            Inner::Fake(fake) => match fake.as_ref() {\n                Fake::MapFs(fs) => {\n                    fs.lock()\n                        .unwrap()\n                        .insert(path.as_ref().as_os_str().into(), contents.as_ref().to_vec());\n                }\n                Fake::NamespacedFs {\n                    real_path,\n                    namespaced_to,\n                } => {\n                    let actual_path = path\n                        .as_ref()\n                        .strip_prefix(namespaced_to)\n                        .map_err(|_| std::io::Error::from(std::io::ErrorKind::NotFound))?;\n                    std::fs::write(real_path.join(actual_path), contents)?;\n                }\n            },\n        }\n        Ok(())\n    }\n}\n\nmod fs {\n    use std::collections::HashMap;\n    use std::ffi::OsString;\n    use std::path::PathBuf;\n    use std::sync::{Arc, Mutex};\n\n    #[derive(Clone, Debug)]\n    pub(super) enum Inner {\n        Real,\n        Fake(Arc<Fake>),\n    }\n\n    #[derive(Debug)]\n    pub(super) enum Fake {\n        MapFs(Mutex<HashMap<OsString, Vec<u8>>>),\n        NamespacedFs {\n            real_path: PathBuf,\n            namespaced_to: PathBuf,\n        },\n    }\n}\n\n/// Environment variable abstraction\n///\n/// Environment variables are global to a process, and, as such, are difficult to test with a multi-\n/// threaded test runner like Rust's. This enables loading environment variables either from the\n/// actual process environment ([`std::env::var`]) or from a hash map.\n///\n/// Process environments are cheap to clone:\n/// - Faked process environments are wrapped in an internal Arc\n/// - Real process environments are pointer-sized\n#[derive(Clone, Debug)]\npub struct Env(env::Inner);\n\nimpl Default for Env {\n    fn default() -> Self {\n        Self::real()\n    }\n}\n\nimpl Env {\n    /// Retrieve a value for the given `k` and return `VarError` is that key is not present.\n    pub fn get(&self, k: &str) -> Result<String, VarError> {\n        use env::Inner;\n        match &self.0 {\n            Inner::Real => std::env::var(k),\n            Inner::Fake(map) => map.get(k).cloned().ok_or(VarError::NotPresent),\n        }\n    }\n\n    /// Create a fake process environment from a slice of tuples.\n    ///\n    /// # Examples\n    /// ```rust\n    /// use aws_types::os_shim_internal::Env;\n    /// let mock_env = Env::from_slice(&[\n    ///     (\"HOME\", \"/home/myname\"),\n    ///     (\"AWS_REGION\", \"us-west-2\")\n    /// ]);\n    /// assert_eq!(mock_env.get(\"HOME\").unwrap(), \"/home/myname\");\n    /// ```\n    pub fn from_slice<'a>(vars: &[(&'a str, &'a str)]) -> Self {\n        let map: HashMap<_, _> = vars\n            .iter()\n            .map(|(k, v)| (k.to_string(), v.to_string()))\n            .collect();\n        Self::from(map)\n    }\n\n    /// Create a process environment that uses the real process environment\n    ///\n    /// Calls will be delegated to [`std::env::var`].\n    pub fn real() -> Self {\n        Self(env::Inner::Real)\n    }\n}\n\nimpl From<HashMap<String, String>> for Env {\n    fn from(hash_map: HashMap<String, String>) -> Self {\n        Self(env::Inner::Fake(Arc::new(hash_map)))\n    }\n}\n\nmod env {\n    use std::collections::HashMap;\n    use std::sync::Arc;\n\n    #[derive(Clone, Debug)]\n    pub(super) enum Inner {\n        Real,\n        Fake(Arc<HashMap<String, String>>),\n    }\n}\n\n#[cfg(test)]\nmod test {\n    use std::env::VarError;\n\n    use crate::os_shim_internal::{Env, Fs};\n\n    #[test]\n    fn env_works() {\n        let env = Env::from_slice(&[(\"FOO\", \"BAR\")]);\n        assert_eq!(env.get(\"FOO\").unwrap(), \"BAR\");\n        assert_eq!(\n            env.get(\"OTHER\").expect_err(\"no present\"),\n            VarError::NotPresent\n        )\n    }\n\n    #[tokio::test]\n    async fn fs_from_test_dir_works() {\n        let fs = Fs::from_test_dir(\".\", \"/users/test-data\");\n        let _ = fs\n            .read_to_end(\"/users/test-data/Cargo.toml\")\n            .await\n            .expect(\"file exists\");\n\n        let _ = fs\n            .read_to_end(\"doesntexist\")\n            .await\n            .expect_err(\"file doesnt exists\");\n    }\n\n    #[tokio::test]\n    async fn fs_round_trip_file_with_real() {\n        let temp = tempfile::tempdir().unwrap();\n        let path = temp.path().join(\"test-file\");\n\n        let fs = Fs::real();\n        fs.read_to_end(&path)\n            .await\n            .expect_err(\"file doesn't exist yet\");\n\n        fs.write(&path, b\"test\").await.expect(\"success\");\n\n        let result = fs.read_to_end(&path).await.expect(\"success\");\n        assert_eq!(b\"test\", &result[..]);\n    }\n\n    #[cfg(unix)]\n    #[tokio::test]\n    async fn real_fs_write_sets_owner_only_permissions_on_unix() {\n        use std::os::unix::fs::PermissionsExt;\n\n        let dir = tempfile::tempdir().expect(\"create temp dir\");\n        let path = dir.path().join(\"secret.txt\");\n        let fs = Fs::real();\n\n        fs.write(&path, b\"sensitive\").await.expect(\"write succeeds\");\n\n        let mode = std::fs::metadata(&path)\n            .expect(\"metadata\")\n            .permissions()\n            .mode()\n            & 0o777; // mask off file type bits, keep only permission bits\n        assert_eq!(mode, 0o600, \"file should be owner read/write only\");\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-types/src/region.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Region type for determining the endpoint to send requests to.\n\nuse aws_smithy_types::config_bag::{Storable, StoreReplace};\nuse std::borrow::Cow;\nuse std::fmt::{Display, Formatter};\n\n/// The region to send requests to.\n///\n/// The region MUST be specified on a request. It may be configured globally or on a\n/// per-client basis unless otherwise noted. A full list of regions is found in the\n/// \"Regions and Endpoints\" document.\n///\n/// See <http://docs.aws.amazon.com/general/latest/gr/rande.html> for\n/// information on AWS regions.\n#[derive(Clone, Debug, PartialEq, Eq, Hash)]\npub struct Region(\n    // Regions are almost always known statically. However, as an escape hatch for when they\n    // are not, allow for an owned region\n    Cow<'static, str>,\n);\n\nimpl AsRef<str> for Region {\n    fn as_ref(&self) -> &str {\n        &self.0\n    }\n}\n\nimpl Display for Region {\n    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {\n        write!(f, \"{}\", self.0)\n    }\n}\n\nimpl Storable for Region {\n    type Storer = StoreReplace<Region>;\n}\n\nimpl Region {\n    /// Creates a new `Region` from the given string.\n    pub fn new(region: impl Into<Cow<'static, str>>) -> Self {\n        Self(region.into())\n    }\n\n    /// Const function that creates a new `Region` from a static str.\n    pub const fn from_static(region: &'static str) -> Self {\n        Self(Cow::Borrowed(region))\n    }\n}\n\n/// The region to use when signing requests\n///\n/// Generally, user code will not need to interact with `SigningRegion`. See `[Region](crate::Region)`.\n#[derive(Clone, Debug, PartialEq, Eq)]\npub struct SigningRegion(Cow<'static, str>);\n\nimpl AsRef<str> for SigningRegion {\n    fn as_ref(&self) -> &str {\n        &self.0\n    }\n}\n\nimpl From<Region> for SigningRegion {\n    fn from(inp: Region) -> Self {\n        SigningRegion(inp.0)\n    }\n}\n\nimpl From<&'static str> for SigningRegion {\n    fn from(region: &'static str) -> Self {\n        Self::from_static(region)\n    }\n}\n\nimpl SigningRegion {\n    /// Creates a `SigningRegion` from a static str.\n    pub const fn from_static(region: &'static str) -> Self {\n        SigningRegion(Cow::Borrowed(region))\n    }\n}\n\nimpl Storable for SigningRegion {\n    type Storer = StoreReplace<Self>;\n}\n\n// The region set to use when signing Sigv4a requests\n///\n/// Generally, user code will not need to interact with `SigningRegionSet`. See `[Region](crate::Region)`.\n#[derive(Clone, Debug, PartialEq, Eq)]\npub struct SigningRegionSet(Cow<'static, str>);\n\nimpl From<Region> for SigningRegionSet {\n    fn from(inp: Region) -> Self {\n        SigningRegionSet(inp.0)\n    }\n}\n\nimpl From<&'static str> for SigningRegionSet {\n    fn from(region: &'static str) -> Self {\n        SigningRegionSet(Cow::Borrowed(region))\n    }\n}\n\nimpl<'a> FromIterator<&'a str> for SigningRegionSet {\n    fn from_iter<T: IntoIterator<Item = &'a str>>(iter: T) -> Self {\n        let mut s = String::new();\n        let mut iter = iter.into_iter();\n\n        if let Some(region) = iter.next() {\n            s.push_str(region);\n        }\n\n        // If more than one region is present in the iter, separate remaining regions with commas\n        for region in iter {\n            s.push(',');\n            s.push_str(region);\n        }\n\n        SigningRegionSet(Cow::Owned(s))\n    }\n}\n\nimpl Storable for SigningRegionSet {\n    type Storer = StoreReplace<Self>;\n}\n\nimpl AsRef<str> for SigningRegionSet {\n    fn as_ref(&self) -> &str {\n        self.0.as_ref()\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-types/src/request_id.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! AWS-specific request ID support\n\nuse aws_smithy_runtime_api::client::result::SdkError;\nuse aws_smithy_runtime_api::http::Headers;\nuse aws_smithy_runtime_api::http::Response;\nuse aws_smithy_types::error::metadata::{Builder as ErrorMetadataBuilder, ErrorMetadata};\n\n/// Constant for the [`ErrorMetadata`] extra field that contains the request ID\nconst AWS_REQUEST_ID: &str = \"aws_request_id\";\n\n/// Implementers add a function to return an AWS request ID\npub trait RequestId {\n    /// Returns the request ID, or `None` if the service could not be reached.\n    fn request_id(&self) -> Option<&str>;\n}\n\nimpl<E> RequestId for SdkError<E, Response> {\n    fn request_id(&self) -> Option<&str> {\n        match self {\n            Self::ResponseError(err) => err.raw().headers().request_id(),\n            Self::ServiceError(err) => err.raw().headers().request_id(),\n            _ => None,\n        }\n    }\n}\n\nimpl RequestId for ErrorMetadata {\n    fn request_id(&self) -> Option<&str> {\n        self.extra(AWS_REQUEST_ID)\n    }\n}\n\nimpl<B> RequestId for Response<B> {\n    fn request_id(&self) -> Option<&str> {\n        self.headers().request_id()\n    }\n}\n\nimpl RequestId for Headers {\n    fn request_id(&self) -> Option<&str> {\n        self.get(\"x-amzn-requestid\")\n            .or(self.get(\"x-amz-request-id\"))\n    }\n}\n\nimpl<O, E> RequestId for Result<O, E>\nwhere\n    O: RequestId,\n    E: RequestId,\n{\n    fn request_id(&self) -> Option<&str> {\n        match self {\n            Ok(ok) => ok.request_id(),\n            Err(err) => err.request_id(),\n        }\n    }\n}\n\n/// Applies a request ID to a generic error builder\npub fn apply_request_id(builder: ErrorMetadataBuilder, headers: &Headers) -> ErrorMetadataBuilder {\n    if let Some(request_id) = headers.request_id() {\n        builder.custom(AWS_REQUEST_ID, request_id)\n    } else {\n        builder\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use crate::request_id::{apply_request_id, RequestId, AWS_REQUEST_ID};\n    use aws_smithy_runtime_api::client::orchestrator::HttpResponse;\n    use aws_smithy_runtime_api::client::result::SdkError;\n    use aws_smithy_runtime_api::http::Headers;\n    use aws_smithy_types::body::SdkBody;\n    use aws_smithy_types::error::ErrorMetadata;\n    use http::{HeaderValue, Response};\n\n    #[test]\n    fn test_request_id_sdk_error() {\n        let without_request_id =\n            || HttpResponse::try_from(Response::builder().body(SdkBody::empty()).unwrap()).unwrap();\n        let with_request_id = || {\n            HttpResponse::try_from(\n                Response::builder()\n                    .header(\n                        \"x-amzn-requestid\",\n                        HeaderValue::from_static(\"some-request-id\"),\n                    )\n                    .body(SdkBody::empty())\n                    .unwrap(),\n            )\n            .unwrap()\n        };\n        assert_eq!(\n            None,\n            SdkError::<(), _>::response_error(\"test\", without_request_id()).request_id()\n        );\n        assert_eq!(\n            Some(\"some-request-id\"),\n            SdkError::<(), _>::response_error(\"test\", with_request_id()).request_id()\n        );\n        assert_eq!(\n            None,\n            SdkError::service_error((), without_request_id()).request_id()\n        );\n        assert_eq!(\n            Some(\"some-request-id\"),\n            SdkError::service_error((), with_request_id()).request_id()\n        );\n    }\n\n    #[test]\n    fn test_extract_request_id() {\n        let mut headers = Headers::new();\n        assert_eq!(None, headers.request_id());\n\n        headers.append(\n            \"x-amzn-requestid\",\n            HeaderValue::from_static(\"some-request-id\"),\n        );\n        assert_eq!(Some(\"some-request-id\"), headers.request_id());\n\n        headers.append(\n            \"x-amz-request-id\",\n            HeaderValue::from_static(\"other-request-id\"),\n        );\n        assert_eq!(Some(\"some-request-id\"), headers.request_id());\n\n        headers.remove(\"x-amzn-requestid\");\n        assert_eq!(Some(\"other-request-id\"), headers.request_id());\n    }\n\n    #[test]\n    fn test_apply_request_id() {\n        let mut headers = Headers::new();\n        assert_eq!(\n            ErrorMetadata::builder().build(),\n            apply_request_id(ErrorMetadata::builder(), &headers).build(),\n        );\n\n        headers.append(\n            \"x-amzn-requestid\",\n            HeaderValue::from_static(\"some-request-id\"),\n        );\n        assert_eq!(\n            ErrorMetadata::builder()\n                .custom(AWS_REQUEST_ID, \"some-request-id\")\n                .build(),\n            apply_request_id(ErrorMetadata::builder(), &headers).build(),\n        );\n    }\n\n    #[test]\n    fn test_error_metadata_request_id_impl() {\n        let err = ErrorMetadata::builder()\n            .custom(AWS_REQUEST_ID, \"some-request-id\")\n            .build();\n        assert_eq!(Some(\"some-request-id\"), err.request_id());\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-types/src/sdk_config.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n#![deny(missing_docs)]\n\n//! AWS Shared Config\n//!\n//! This module contains a shared configuration representation that is agnostic from a specific service.\n\nuse crate::app_name::AppName;\nuse crate::docs_for;\nuse crate::endpoint_config::AccountIdEndpointMode;\nuse crate::origin::Origin;\nuse crate::region::{Region, SigningRegionSet};\nuse crate::service_config::LoadServiceConfig;\nuse aws_credential_types::provider::token::SharedTokenProvider;\npub use aws_credential_types::provider::SharedCredentialsProvider;\nuse aws_smithy_async::rt::sleep::AsyncSleep;\npub use aws_smithy_async::rt::sleep::SharedAsyncSleep;\npub use aws_smithy_async::time::{SharedTimeSource, TimeSource};\nuse aws_smithy_runtime_api::client::auth::AuthSchemePreference;\nuse aws_smithy_runtime_api::client::behavior_version::BehaviorVersion;\nuse aws_smithy_runtime_api::client::http::HttpClient;\npub use aws_smithy_runtime_api::client::http::SharedHttpClient;\nuse aws_smithy_runtime_api::client::identity::{ResolveCachedIdentity, SharedIdentityCache};\npub use aws_smithy_runtime_api::client::stalled_stream_protection::StalledStreamProtectionConfig;\nuse aws_smithy_runtime_api::shared::IntoShared;\npub use aws_smithy_types::checksum_config::{\n    RequestChecksumCalculation, ResponseChecksumValidation,\n};\npub use aws_smithy_types::retry::RetryConfig;\npub use aws_smithy_types::timeout::TimeoutConfig;\nuse std::collections::HashMap;\nuse std::sync::Arc;\n\n/// Unified docstrings to keep crates in sync. Not intended for public use\npub mod unified_docs {\n    /// A macro that generates docs for selected fields of `SdkConfig`.\n    #[macro_export]\n    macro_rules! docs_for {\n        (use_fips) => {\n\"When true, send this request to the FIPS-compliant regional endpoint.\n\nIf no FIPS-compliant endpoint can be determined, dispatching the request will return an error.\"\n        };\n        (use_dual_stack) => {\n\"When true, send this request to the dual-stack endpoint.\n\nIf no dual-stack endpoint is available the request MAY return an error.\n\n**Note**: Some services do not offer dual-stack as a configurable parameter (e.g. Code Catalyst). For\nthese services, this setting has no effect\"\n        };\n        (time_source) => {\n\"The time source use to use for this client.\n\nThis only needs to be required for creating deterministic tests or platforms where `SystemTime::now()` is not supported.\"};\n        (disable_request_compression) => {\n\"When `true`, disable request compression. Defaults to `false`.\n\n**Only some services support request compression.** For services\nthat don't support request compression, this setting does nothing.\n\" };\n        (request_min_compression_size_bytes) => {\n\"The minimum size of request that should be compressed. Defaults to `10240` bytes.\n\nWhen a request body's size is lower than this, request compression will be skipped.\nThis is useful for request bodies because, for small request bodies, compression may actually increase their size.\n\n**Only some services support request compression.** For services\nthat don't support request compression, this setting does nothing.\n\" };\n        (account_id_endpoint_mode) => {\n\"Controls the account ID-based routing behavior.\n\nBy default, the routing behavior is set to `preferred`.\nCustomers can adjust this setting to other values to switch between different routing patterns or temporarily disable the feature.\n\nSee the developer guide on [account-based endpoints](https://docs.aws.amazon.com/sdkref/latest/guide/feature-account-endpoints.html)\nfor more information.\n\nFor services that do not use the account-based endpoints, this setting does nothing.\n\" };\n        (auth_scheme_preference) => {\n\"Set the auth scheme preference for an auth scheme resolver\n(typically the default auth scheme resolver).\n\nEach operation has a predefined order of auth schemes, as determined by the service,\nfor auth scheme resolution. By using the auth scheme preference, customers\ncan reorder the schemes resolved by the auth scheme resolver.\n\nThe preference list is intended as a hint rather than a strict override.\nAny schemes not present in the originally resolved auth schemes will be ignored.\n\" };\n        (sigv4a_signing_region_set) => {\n\"Set the signing region set for SigV4a authentication.\n\nWhen using SigV4a (asymmetric) signing, this specifies which regions the request\nsignature is valid for. Use `*` for a universal signature valid in all regions.\n\" };\n    }\n}\n\n/// AWS Shared Configuration\n#[derive(Debug, Clone)]\npub struct SdkConfig {\n    app_name: Option<AppName>,\n    auth_scheme_preference: Option<AuthSchemePreference>,\n    sigv4a_signing_region_set: Option<SigningRegionSet>,\n    identity_cache: Option<SharedIdentityCache>,\n    credentials_provider: Option<SharedCredentialsProvider>,\n    token_provider: Option<SharedTokenProvider>,\n    region: Option<Region>,\n    account_id_endpoint_mode: Option<AccountIdEndpointMode>,\n    endpoint_url: Option<String>,\n    retry_config: Option<RetryConfig>,\n    sleep_impl: Option<SharedAsyncSleep>,\n    time_source: Option<SharedTimeSource>,\n    timeout_config: Option<TimeoutConfig>,\n    stalled_stream_protection_config: Option<StalledStreamProtectionConfig>,\n    http_client: Option<SharedHttpClient>,\n    use_fips: Option<bool>,\n    use_dual_stack: Option<bool>,\n    behavior_version: Option<BehaviorVersion>,\n    service_config: Option<Arc<dyn LoadServiceConfig>>,\n    config_origins: HashMap<&'static str, Origin>,\n    disable_request_compression: Option<bool>,\n    request_min_compression_size_bytes: Option<u32>,\n    request_checksum_calculation: Option<RequestChecksumCalculation>,\n    response_checksum_validation: Option<ResponseChecksumValidation>,\n}\n\n/// Builder for AWS Shared Configuration\n///\n/// _Important:_ Using the `aws-config` crate to configure the SDK is preferred to invoking this\n/// builder directly. Using this builder directly won't pull in any AWS recommended default\n/// configuration values.\n#[derive(Debug, Default)]\npub struct Builder {\n    app_name: Option<AppName>,\n    auth_scheme_preference: Option<AuthSchemePreference>,\n    sigv4a_signing_region_set: Option<SigningRegionSet>,\n    identity_cache: Option<SharedIdentityCache>,\n    credentials_provider: Option<SharedCredentialsProvider>,\n    token_provider: Option<SharedTokenProvider>,\n    region: Option<Region>,\n    account_id_endpoint_mode: Option<AccountIdEndpointMode>,\n    endpoint_url: Option<String>,\n    retry_config: Option<RetryConfig>,\n    sleep_impl: Option<SharedAsyncSleep>,\n    time_source: Option<SharedTimeSource>,\n    timeout_config: Option<TimeoutConfig>,\n    stalled_stream_protection_config: Option<StalledStreamProtectionConfig>,\n    http_client: Option<SharedHttpClient>,\n    use_fips: Option<bool>,\n    use_dual_stack: Option<bool>,\n    behavior_version: Option<BehaviorVersion>,\n    service_config: Option<Arc<dyn LoadServiceConfig>>,\n    config_origins: HashMap<&'static str, Origin>,\n    disable_request_compression: Option<bool>,\n    request_min_compression_size_bytes: Option<u32>,\n    request_checksum_calculation: Option<RequestChecksumCalculation>,\n    response_checksum_validation: Option<ResponseChecksumValidation>,\n}\n\nimpl Builder {\n    /// Set the region for the builder\n    ///\n    /// # Examples\n    /// ```rust\n    /// use aws_types::SdkConfig;\n    /// use aws_types::region::Region;\n    /// let config = SdkConfig::builder().region(Region::new(\"us-east-1\")).build();\n    /// ```\n    pub fn region(mut self, region: impl Into<Option<Region>>) -> Self {\n        self.set_region(region);\n        self\n    }\n\n    /// Set the region for the builder\n    ///\n    /// # Examples\n    /// ```rust\n    /// fn region_override() -> Option<Region> {\n    ///     // ...\n    ///     # None\n    /// }\n    /// use aws_types::SdkConfig;\n    /// use aws_types::region::Region;\n    /// let mut builder = SdkConfig::builder();\n    /// if let Some(region) = region_override() {\n    ///     builder.set_region(region);\n    /// }\n    /// let config = builder.build();\n    /// ```\n    pub fn set_region(&mut self, region: impl Into<Option<Region>>) -> &mut Self {\n        self.region = region.into();\n        self\n    }\n\n    #[doc = docs_for!(account_id_endpoint_mode)]\n    pub fn account_id_endpoint_mode(\n        mut self,\n        account_id_endpoint_mode: AccountIdEndpointMode,\n    ) -> Self {\n        self.set_account_id_endpoint_mode(Some(account_id_endpoint_mode));\n        self\n    }\n\n    #[doc = docs_for!(account_id_endpoint_mode)]\n    pub fn set_account_id_endpoint_mode(\n        &mut self,\n        account_id_endpoint_mode: Option<AccountIdEndpointMode>,\n    ) -> &mut Self {\n        self.account_id_endpoint_mode = account_id_endpoint_mode;\n        self\n    }\n\n    /// Set the endpoint URL to use when making requests.\n    /// # Examples\n    /// ```\n    /// use aws_types::SdkConfig;\n    /// let config = SdkConfig::builder().endpoint_url(\"http://localhost:8080\").build();\n    /// ```\n    pub fn endpoint_url(mut self, endpoint_url: impl Into<String>) -> Self {\n        self.set_endpoint_url(Some(endpoint_url.into()));\n        self\n    }\n\n    /// Set the endpoint URL to use when making requests.\n    pub fn set_endpoint_url(&mut self, endpoint_url: Option<String>) -> &mut Self {\n        self.endpoint_url = endpoint_url;\n        self\n    }\n\n    /// Set the checksum calculation strategy to use when making requests.\n    /// # Examples\n    /// ```\n    /// use aws_types::SdkConfig;\n    /// use aws_smithy_types::checksum_config::RequestChecksumCalculation;\n    /// let config = SdkConfig::builder().request_checksum_calculation(RequestChecksumCalculation::WhenSupported).build();\n    /// ```\n    pub fn request_checksum_calculation(\n        mut self,\n        request_checksum_calculation: RequestChecksumCalculation,\n    ) -> Self {\n        self.set_request_checksum_calculation(Some(request_checksum_calculation));\n        self\n    }\n\n    /// Set the checksum calculation strategy to use when making requests.\n    pub fn set_request_checksum_calculation(\n        &mut self,\n        request_checksum_calculation: Option<RequestChecksumCalculation>,\n    ) -> &mut Self {\n        self.request_checksum_calculation = request_checksum_calculation;\n        self\n    }\n\n    /// Set the checksum calculation strategy to use for responses.\n    /// # Examples\n    /// ```\n    /// use aws_types::SdkConfig;\n    /// use aws_smithy_types::checksum_config::ResponseChecksumValidation;\n    /// let config = SdkConfig::builder().response_checksum_validation(ResponseChecksumValidation::WhenSupported).build();\n    /// ```\n    pub fn response_checksum_validation(\n        mut self,\n        response_checksum_validation: ResponseChecksumValidation,\n    ) -> Self {\n        self.set_response_checksum_validation(Some(response_checksum_validation));\n        self\n    }\n\n    /// Set the checksum calculation strategy to use for responses.\n    pub fn set_response_checksum_validation(\n        &mut self,\n        response_checksum_validation: Option<ResponseChecksumValidation>,\n    ) -> &mut Self {\n        self.response_checksum_validation = response_checksum_validation;\n        self\n    }\n\n    /// Set the retry_config for the builder\n    ///\n    /// _Note:_ Retries require a sleep implementation in order to work. When enabling retry, make\n    /// sure to set one with [Self::sleep_impl] or [Self::set_sleep_impl].\n    ///\n    /// # Examples\n    /// ```rust\n    /// use aws_types::SdkConfig;\n    /// use aws_smithy_types::retry::RetryConfig;\n    ///\n    /// let retry_config = RetryConfig::standard().with_max_attempts(5);\n    /// let config = SdkConfig::builder().retry_config(retry_config).build();\n    /// ```\n    pub fn retry_config(mut self, retry_config: RetryConfig) -> Self {\n        self.set_retry_config(Some(retry_config));\n        self\n    }\n\n    /// Set the retry_config for the builder\n    ///\n    /// _Note:_ Retries require a sleep implementation in order to work. When enabling retry, make\n    /// sure to set one with [Self::sleep_impl] or [Self::set_sleep_impl].\n    ///\n    /// # Examples\n    /// ```rust\n    /// use aws_types::sdk_config::{SdkConfig, Builder};\n    /// use aws_smithy_types::retry::RetryConfig;\n    ///\n    /// fn disable_retries(builder: &mut Builder) {\n    ///     let retry_config = RetryConfig::standard().with_max_attempts(1);\n    ///     builder.set_retry_config(Some(retry_config));\n    /// }\n    ///\n    /// let mut builder = SdkConfig::builder();\n    /// disable_retries(&mut builder);\n    /// ```\n    pub fn set_retry_config(&mut self, retry_config: Option<RetryConfig>) -> &mut Self {\n        self.retry_config = retry_config;\n        self\n    }\n\n    /// Set the [`TimeoutConfig`] for the builder\n    ///\n    /// _Note:_ Timeouts require a sleep implementation in order to work.\n    /// When enabling timeouts, be sure to set one with [Self::sleep_impl] or\n    /// [Self::set_sleep_impl].\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # use std::time::Duration;\n    /// use aws_types::SdkConfig;\n    /// use aws_smithy_types::timeout::TimeoutConfig;\n    ///\n    /// let timeout_config = TimeoutConfig::builder()\n    ///     .operation_attempt_timeout(Duration::from_secs(2))\n    ///     .operation_timeout(Duration::from_secs(5))\n    ///     .build();\n    /// let config = SdkConfig::builder()\n    ///     .timeout_config(timeout_config)\n    ///     .build();\n    /// ```\n    pub fn timeout_config(mut self, timeout_config: TimeoutConfig) -> Self {\n        self.set_timeout_config(Some(timeout_config));\n        self\n    }\n\n    /// Set the [`TimeoutConfig`] for the builder\n    ///\n    /// _Note:_ Timeouts require a sleep implementation in order to work.\n    /// When enabling timeouts, be sure to set one with [Self::sleep_impl] or\n    /// [Self::set_sleep_impl].\n    ///\n    /// # Examples\n    /// ```rust\n    /// # use std::time::Duration;\n    /// use aws_types::sdk_config::{SdkConfig, Builder};\n    /// use aws_smithy_types::timeout::TimeoutConfig;\n    ///\n    /// fn set_preferred_timeouts(builder: &mut Builder) {\n    ///     let timeout_config = TimeoutConfig::builder()\n    ///         .operation_attempt_timeout(Duration::from_secs(2))\n    ///         .operation_timeout(Duration::from_secs(5))\n    ///         .build();\n    ///     builder.set_timeout_config(Some(timeout_config));\n    /// }\n    ///\n    /// let mut builder = SdkConfig::builder();\n    /// set_preferred_timeouts(&mut builder);\n    /// let config = builder.build();\n    /// ```\n    pub fn set_timeout_config(&mut self, timeout_config: Option<TimeoutConfig>) -> &mut Self {\n        self.timeout_config = timeout_config;\n        self\n    }\n\n    /// Set the sleep implementation for the builder.\n    ///\n    /// The sleep implementation is used to create timeout futures.\n    ///\n    /// _Note:_ If you're using the Tokio runtime, a `TokioSleep` implementation is available in\n    /// the `aws-smithy-async` crate.\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// use aws_smithy_async::rt::sleep::{AsyncSleep, SharedAsyncSleep, Sleep};\n    /// use aws_types::SdkConfig;\n    ///\n    /// ##[derive(Debug)]\n    /// pub struct ForeverSleep;\n    ///\n    /// impl AsyncSleep for ForeverSleep {\n    ///     fn sleep(&self, duration: std::time::Duration) -> Sleep {\n    ///         Sleep::new(std::future::pending())\n    ///     }\n    /// }\n    ///\n    /// let sleep_impl = SharedAsyncSleep::new(ForeverSleep);\n    /// let config = SdkConfig::builder().sleep_impl(sleep_impl).build();\n    /// ```\n    pub fn sleep_impl(mut self, sleep_impl: impl AsyncSleep + 'static) -> Self {\n        self.set_sleep_impl(Some(sleep_impl.into_shared()));\n        self\n    }\n\n    /// Set the sleep implementation for the builder. The sleep implementation is used to create\n    /// timeout futures.\n    ///\n    /// _Note:_ If you're using the Tokio runtime, a `TokioSleep` implementation is available in\n    /// the `aws-smithy-async` crate.\n    ///\n    /// # Examples\n    /// ```rust\n    /// # use aws_smithy_async::rt::sleep::{AsyncSleep, SharedAsyncSleep, Sleep};\n    /// # use aws_types::sdk_config::{Builder, SdkConfig};\n    /// #[derive(Debug)]\n    /// pub struct ForeverSleep;\n    ///\n    /// impl AsyncSleep for ForeverSleep {\n    ///     fn sleep(&self, duration: std::time::Duration) -> Sleep {\n    ///         Sleep::new(std::future::pending())\n    ///     }\n    /// }\n    ///\n    /// fn set_never_ending_sleep_impl(builder: &mut Builder) {\n    ///     let sleep_impl = SharedAsyncSleep::new(ForeverSleep);\n    ///     builder.set_sleep_impl(Some(sleep_impl));\n    /// }\n    ///\n    /// let mut builder = SdkConfig::builder();\n    /// set_never_ending_sleep_impl(&mut builder);\n    /// let config = builder.build();\n    /// ```\n    pub fn set_sleep_impl(&mut self, sleep_impl: Option<SharedAsyncSleep>) -> &mut Self {\n        self.sleep_impl = sleep_impl;\n        self\n    }\n\n    /// Set the identity cache for caching credentials and SSO tokens.\n    ///\n    /// The default identity cache will wait until the first request that requires authentication\n    /// to load an identity. Once the identity is loaded, it is cached until shortly before it\n    /// expires.\n    ///\n    /// # Examples\n    /// Disabling identity caching:\n    /// ```rust\n    /// # use aws_types::SdkConfig;\n    /// use aws_smithy_runtime::client::identity::IdentityCache;\n    /// let config = SdkConfig::builder()\n    ///     .identity_cache(IdentityCache::no_cache())\n    ///     .build();\n    /// ```\n    /// Changing settings on the default cache implementation:\n    /// ```rust\n    /// # use aws_types::SdkConfig;\n    /// use aws_smithy_runtime::client::identity::IdentityCache;\n    /// use std::time::Duration;\n    ///\n    /// let config = SdkConfig::builder()\n    ///     .identity_cache(\n    ///         IdentityCache::lazy()\n    ///             .load_timeout(Duration::from_secs(10))\n    ///             .build()\n    ///     )\n    ///     .build();\n    /// ```\n    pub fn identity_cache(mut self, cache: impl ResolveCachedIdentity + 'static) -> Self {\n        self.set_identity_cache(Some(cache.into_shared()));\n        self\n    }\n\n    /// Set the identity cache for caching credentials and SSO tokens.\n    ///\n    /// The default identity cache will wait until the first request that requires authentication\n    /// to load an identity. Once the identity is loaded, it is cached until shortly before it\n    /// expires.\n    ///\n    /// # Examples\n    /// ```rust\n    /// # use aws_types::SdkConfig;\n    /// use aws_smithy_runtime::client::identity::IdentityCache;\n    ///\n    /// fn override_identity_cache() -> bool {\n    ///   // ...\n    ///   # true\n    /// }\n    ///\n    /// let mut builder = SdkConfig::builder();\n    /// if override_identity_cache() {\n    ///     builder.set_identity_cache(Some(IdentityCache::lazy().build()));\n    /// }\n    /// let config = builder.build();\n    /// ```\n    pub fn set_identity_cache(&mut self, cache: Option<SharedIdentityCache>) -> &mut Self {\n        self.identity_cache = cache;\n        self\n    }\n\n    /// Set the credentials provider for the builder\n    ///\n    /// # Examples\n    /// ```rust\n    /// use aws_credential_types::provider::{ProvideCredentials, SharedCredentialsProvider};\n    /// use aws_types::SdkConfig;\n    /// fn make_provider() -> impl ProvideCredentials {\n    ///   // ...\n    ///   # use aws_credential_types::Credentials;\n    ///   # Credentials::new(\"test\", \"test\", None, None, \"example\")\n    /// }\n    ///\n    /// let config = SdkConfig::builder()\n    ///     .credentials_provider(SharedCredentialsProvider::new(make_provider()))\n    ///     .build();\n    /// ```\n    pub fn credentials_provider(mut self, provider: SharedCredentialsProvider) -> Self {\n        self.set_credentials_provider(Some(provider));\n        self\n    }\n\n    /// Set the credentials provider for the builder\n    ///\n    /// # Examples\n    /// ```rust\n    /// use aws_credential_types::provider::{ProvideCredentials, SharedCredentialsProvider};\n    /// use aws_types::SdkConfig;\n    /// fn make_provider() -> impl ProvideCredentials {\n    ///   // ...\n    ///   # use aws_credential_types::Credentials;\n    ///   # Credentials::new(\"test\", \"test\", None, None, \"example\")\n    /// }\n    ///\n    /// fn override_provider() -> bool {\n    ///   // ...\n    ///   # true\n    /// }\n    ///\n    /// let mut builder = SdkConfig::builder();\n    /// if override_provider() {\n    ///     builder.set_credentials_provider(Some(SharedCredentialsProvider::new(make_provider())));\n    /// }\n    /// let config = builder.build();\n    /// ```\n    pub fn set_credentials_provider(\n        &mut self,\n        provider: Option<SharedCredentialsProvider>,\n    ) -> &mut Self {\n        self.credentials_provider = provider;\n        self\n    }\n\n    /// Set the bearer auth token provider for the builder\n    ///\n    /// # Examples\n    /// ```rust\n    /// use aws_credential_types::provider::token::{ProvideToken, SharedTokenProvider};\n    /// use aws_types::SdkConfig;\n    ///\n    /// fn make_provider() -> impl ProvideToken {\n    ///   // ...\n    ///   # aws_credential_types::Token::new(\"example\", None)\n    /// }\n    ///\n    /// let config = SdkConfig::builder()\n    ///     .token_provider(SharedTokenProvider::new(make_provider()))\n    ///     .build();\n    /// ```\n    pub fn token_provider(mut self, provider: SharedTokenProvider) -> Self {\n        self.set_token_provider(Some(provider));\n        self\n    }\n\n    /// Set the bearer auth token provider for the builder\n    ///\n    /// # Examples\n    /// ```rust\n    /// use aws_credential_types::provider::token::{ProvideToken, SharedTokenProvider};\n    /// use aws_types::SdkConfig;\n    ///\n    /// fn make_provider() -> impl ProvideToken {\n    ///   // ...\n    ///   # aws_credential_types::Token::new(\"example\", None)\n    /// }\n    ///\n    /// fn override_provider() -> bool {\n    ///   // ...\n    ///   # true\n    /// }\n    ///\n    /// let mut builder = SdkConfig::builder();\n    /// if override_provider() {\n    ///     builder.set_token_provider(Some(SharedTokenProvider::new(make_provider())));\n    /// }\n    /// let config = builder.build();\n    /// ```\n    pub fn set_token_provider(&mut self, provider: Option<SharedTokenProvider>) -> &mut Self {\n        self.token_provider = provider;\n        self\n    }\n\n    /// Sets the name of the app that is using the client.\n    ///\n    /// This _optional_ name is used to identify the application in the user agent that\n    /// gets sent along with requests.\n    pub fn app_name(mut self, app_name: AppName) -> Self {\n        self.set_app_name(Some(app_name));\n        self\n    }\n\n    /// Sets the name of the app that is using the client.\n    ///\n    /// This _optional_ name is used to identify the application in the user agent that\n    /// gets sent along with requests.\n    pub fn set_app_name(&mut self, app_name: Option<AppName>) -> &mut Self {\n        self.app_name = app_name;\n        self\n    }\n\n    /// Sets the HTTP client to use when making requests.\n    ///\n    /// ## Examples\n    /// ```no_run\n    /// # #[cfg(feature = \"examples\")]\n    /// # fn example() {\n    /// use aws_types::sdk_config::{SdkConfig, TimeoutConfig};\n    /// use aws_smithy_runtime::client::http::hyper_014::HyperClientBuilder;\n    /// use std::time::Duration;\n    ///\n    /// // Create a connector that will be used to establish TLS connections\n    /// let tls_connector = hyper_rustls::HttpsConnectorBuilder::new()\n    ///     .with_webpki_roots()\n    ///     .https_only()\n    ///     .enable_http1()\n    ///     .enable_http2()\n    ///     .build();\n    /// // Create a HTTP client that uses the TLS connector. This client is\n    /// // responsible for creating and caching a HttpConnector when given HttpConnectorSettings.\n    /// // This hyper client will create HttpConnectors backed by hyper and the tls_connector.\n    /// let http_client = HyperClientBuilder::new().build(tls_connector);\n    /// let sdk_config = SdkConfig::builder()\n    ///     .http_client(http_client)\n    ///     // Connect/read timeouts are passed to the HTTP client when servicing a request\n    ///     .timeout_config(\n    ///         TimeoutConfig::builder()\n    ///             .connect_timeout(Duration::from_secs(5))\n    ///             .build()\n    ///     )\n    ///     .build();\n    /// # }\n    /// ```\n    pub fn http_client(mut self, http_client: impl HttpClient + 'static) -> Self {\n        self.set_http_client(Some(http_client.into_shared()));\n        self\n    }\n\n    /// Sets the HTTP client to use when making requests.\n    ///\n    /// ## Examples\n    /// ```no_run\n    /// # #[cfg(feature = \"examples\")]\n    /// # fn example() {\n    /// use aws_types::sdk_config::{Builder, SdkConfig, TimeoutConfig};\n    /// use aws_smithy_runtime::client::http::hyper_014::HyperClientBuilder;\n    /// use std::time::Duration;\n    ///\n    /// fn override_http_client(builder: &mut Builder) {\n    ///     // Create a connector that will be used to establish TLS connections\n    ///     let tls_connector = hyper_rustls::HttpsConnectorBuilder::new()\n    ///         .with_webpki_roots()\n    ///         .https_only()\n    ///         .enable_http1()\n    ///         .enable_http2()\n    ///         .build();\n    ///     // Create a HTTP client that uses the TLS connector. This client is\n    ///     // responsible for creating and caching a HttpConnector when given HttpConnectorSettings.\n    ///     // This hyper client will create HttpConnectors backed by hyper and the tls_connector.\n    ///     let http_client = HyperClientBuilder::new().build(tls_connector);\n    ///\n    ///     builder.set_http_client(Some(http_client));\n    /// }\n    ///\n    /// let mut builder = SdkConfig::builder();\n    /// override_http_client(&mut builder);\n    /// let config = builder.build();\n    /// # }\n    /// ```\n    pub fn set_http_client(&mut self, http_client: Option<SharedHttpClient>) -> &mut Self {\n        self.http_client = http_client;\n        self\n    }\n\n    #[doc = docs_for!(use_fips)]\n    pub fn use_fips(mut self, use_fips: bool) -> Self {\n        self.set_use_fips(Some(use_fips));\n        self\n    }\n\n    #[doc = docs_for!(use_fips)]\n    pub fn set_use_fips(&mut self, use_fips: Option<bool>) -> &mut Self {\n        self.use_fips = use_fips;\n        self\n    }\n\n    #[doc = docs_for!(use_dual_stack)]\n    pub fn use_dual_stack(mut self, use_dual_stack: bool) -> Self {\n        self.set_use_dual_stack(Some(use_dual_stack));\n        self\n    }\n\n    #[doc = docs_for!(use_dual_stack)]\n    pub fn set_use_dual_stack(&mut self, use_dual_stack: Option<bool>) -> &mut Self {\n        self.use_dual_stack = use_dual_stack;\n        self\n    }\n\n    #[doc = docs_for!(time_source)]\n    pub fn time_source(mut self, time_source: impl TimeSource + 'static) -> Self {\n        self.set_time_source(Some(SharedTimeSource::new(time_source)));\n        self\n    }\n\n    #[doc = docs_for!(time_source)]\n    pub fn set_time_source(&mut self, time_source: Option<SharedTimeSource>) -> &mut Self {\n        self.time_source = time_source;\n        self\n    }\n\n    #[doc = docs_for!(disable_request_compression)]\n    pub fn disable_request_compression(mut self, disable_request_compression: bool) -> Self {\n        self.set_disable_request_compression(Some(disable_request_compression));\n        self\n    }\n\n    #[doc = docs_for!(disable_request_compression)]\n    pub fn set_disable_request_compression(\n        &mut self,\n        disable_request_compression: Option<bool>,\n    ) -> &mut Self {\n        self.disable_request_compression = disable_request_compression;\n        self\n    }\n\n    #[doc = docs_for!(request_min_compression_size_bytes)]\n    pub fn request_min_compression_size_bytes(\n        mut self,\n        request_min_compression_size_bytes: u32,\n    ) -> Self {\n        self.set_request_min_compression_size_bytes(Some(request_min_compression_size_bytes));\n        self\n    }\n\n    #[doc = docs_for!(request_min_compression_size_bytes)]\n    pub fn set_request_min_compression_size_bytes(\n        &mut self,\n        request_min_compression_size_bytes: Option<u32>,\n    ) -> &mut Self {\n        self.request_min_compression_size_bytes = request_min_compression_size_bytes;\n        self\n    }\n\n    /// Sets the [`BehaviorVersion`] for the [`SdkConfig`]\n    pub fn behavior_version(mut self, behavior_version: BehaviorVersion) -> Self {\n        self.set_behavior_version(Some(behavior_version));\n        self\n    }\n\n    /// Sets the [`BehaviorVersion`] for the [`SdkConfig`]\n    pub fn set_behavior_version(&mut self, behavior_version: Option<BehaviorVersion>) -> &mut Self {\n        self.behavior_version = behavior_version;\n        self\n    }\n\n    /// Sets the service config provider for the [`SdkConfig`].\n    ///\n    /// This provider is used when creating a service-specific config from an\n    /// `SdkConfig` and provides access to config defined in the environment\n    /// which would otherwise be inaccessible.\n    pub fn service_config(mut self, service_config: impl LoadServiceConfig + 'static) -> Self {\n        self.set_service_config(Some(service_config));\n        self\n    }\n\n    /// Sets the service config provider for the [`SdkConfig`].\n    ///\n    /// This provider is used when creating a service-specific config from an\n    /// `SdkConfig` and provides access to config defined in the environment\n    /// which would otherwise be inaccessible.\n    pub fn set_service_config(\n        &mut self,\n        service_config: Option<impl LoadServiceConfig + 'static>,\n    ) -> &mut Self {\n        self.service_config = service_config.map(|it| Arc::new(it) as Arc<dyn LoadServiceConfig>);\n        self\n    }\n\n    #[doc = docs_for!(auth_scheme_preference)]\n    pub fn auth_scheme_preference(\n        mut self,\n        auth_scheme_preference: impl Into<AuthSchemePreference>,\n    ) -> Self {\n        self.set_auth_scheme_preference(Some(auth_scheme_preference));\n        self\n    }\n\n    #[doc = docs_for!(auth_scheme_preference)]\n    pub fn set_auth_scheme_preference(\n        &mut self,\n        auth_scheme_preference: Option<impl Into<AuthSchemePreference>>,\n    ) -> &mut Self {\n        self.auth_scheme_preference = auth_scheme_preference.map(|pref| pref.into());\n        self\n    }\n\n    #[doc = docs_for!(sigv4a_signing_region_set)]\n    pub fn sigv4a_signing_region_set(\n        mut self,\n        sigv4a_signing_region_set: impl Into<SigningRegionSet>,\n    ) -> Self {\n        self.set_sigv4a_signing_region_set(Some(sigv4a_signing_region_set));\n        self\n    }\n\n    #[doc = docs_for!(sigv4a_signing_region_set)]\n    pub fn set_sigv4a_signing_region_set(\n        &mut self,\n        sigv4a_signing_region_set: Option<impl Into<SigningRegionSet>>,\n    ) -> &mut Self {\n        self.sigv4a_signing_region_set = sigv4a_signing_region_set.map(|v| v.into());\n        self\n    }\n\n    /// Set the origin of a setting.\n    ///\n    /// This is used internally to understand how to merge config structs while\n    /// respecting precedence of origins.\n    pub fn insert_origin(&mut self, setting: &'static str, origin: Origin) {\n        self.config_origins.insert(setting, origin);\n    }\n\n    /// Build a [`SdkConfig`] from this builder.\n    pub fn build(self) -> SdkConfig {\n        SdkConfig {\n            app_name: self.app_name,\n            auth_scheme_preference: self.auth_scheme_preference,\n            sigv4a_signing_region_set: self.sigv4a_signing_region_set,\n            identity_cache: self.identity_cache,\n            credentials_provider: self.credentials_provider,\n            token_provider: self.token_provider,\n            region: self.region,\n            account_id_endpoint_mode: self.account_id_endpoint_mode,\n            endpoint_url: self.endpoint_url,\n            retry_config: self.retry_config,\n            sleep_impl: self.sleep_impl,\n            timeout_config: self.timeout_config,\n            http_client: self.http_client,\n            use_fips: self.use_fips,\n            use_dual_stack: self.use_dual_stack,\n            time_source: self.time_source,\n            behavior_version: self.behavior_version,\n            stalled_stream_protection_config: self.stalled_stream_protection_config,\n            service_config: self.service_config,\n            config_origins: self.config_origins,\n            disable_request_compression: self.disable_request_compression,\n            request_min_compression_size_bytes: self.request_min_compression_size_bytes,\n            request_checksum_calculation: self.request_checksum_calculation,\n            response_checksum_validation: self.response_checksum_validation,\n        }\n    }\n}\n\nimpl Builder {\n    /// Set the [`StalledStreamProtectionConfig`] to configure protection for stalled streams.\n    ///\n    /// This configures stalled stream protection. When enabled, download streams\n    /// that stall (stream no data) for longer than a configured grace period will return an error.\n    ///\n    /// _Note:_ Stalled stream protection requires both a sleep implementation and a time source\n    /// in order to work. When enabling stalled stream protection, make sure to set\n    /// - A sleep impl with [Self::sleep_impl] or [Self::set_sleep_impl].\n    /// - A time source with [Self::time_source] or [Self::set_time_source].\n    ///\n    /// # Examples\n    /// ```rust\n    /// use std::time::Duration;\n    /// use aws_types::SdkConfig;\n    /// pub use aws_smithy_runtime_api::client::stalled_stream_protection::StalledStreamProtectionConfig;\n    ///\n    /// let stalled_stream_protection_config = StalledStreamProtectionConfig::enabled()\n    ///     .grace_period(Duration::from_secs(1))\n    ///     .build();\n    /// let config = SdkConfig::builder()\n    ///     .stalled_stream_protection(stalled_stream_protection_config)\n    ///     .build();\n    /// ```\n    pub fn stalled_stream_protection(\n        mut self,\n        stalled_stream_protection_config: StalledStreamProtectionConfig,\n    ) -> Self {\n        self.set_stalled_stream_protection(Some(stalled_stream_protection_config));\n        self\n    }\n\n    /// Set the [`StalledStreamProtectionConfig`] to configure protection for stalled streams.\n    ///\n    /// This configures stalled stream protection. When enabled, download streams\n    /// that stall (stream no data) for longer than a configured grace period will return an error.\n    ///\n    /// By default, streams that transmit less than one byte per-second for five seconds will\n    /// be cancelled.\n    ///\n    /// _Note:_ Stalled stream protection requires both a sleep implementation and a time source\n    /// in order to work. When enabling stalled stream protection, make sure to set\n    /// - A sleep impl with [Self::sleep_impl] or [Self::set_sleep_impl].\n    /// - A time source with [Self::time_source] or [Self::set_time_source].\n    ///\n    /// # Examples\n    /// ```rust\n    /// use std::time::Duration;\n    /// use aws_types::sdk_config::{SdkConfig, Builder};\n    /// pub use aws_smithy_runtime_api::client::stalled_stream_protection::StalledStreamProtectionConfig;\n    ///\n    /// fn set_stalled_stream_protection(builder: &mut Builder) {\n    ///     let stalled_stream_protection_config = StalledStreamProtectionConfig::enabled()\n    ///         .grace_period(Duration::from_secs(1))\n    ///         .build();\n    ///     builder.set_stalled_stream_protection(Some(stalled_stream_protection_config));\n    /// }\n    ///\n    /// let mut builder = SdkConfig::builder();\n    /// set_stalled_stream_protection(&mut builder);\n    /// let config = builder.build();\n    /// ```\n    pub fn set_stalled_stream_protection(\n        &mut self,\n        stalled_stream_protection_config: Option<StalledStreamProtectionConfig>,\n    ) -> &mut Self {\n        self.stalled_stream_protection_config = stalled_stream_protection_config;\n        self\n    }\n}\n\nimpl SdkConfig {\n    /// Configured region\n    pub fn region(&self) -> Option<&Region> {\n        self.region.as_ref()\n    }\n\n    /// Configured account ID endpoint mode\n    pub fn account_id_endpoint_mode(&self) -> Option<&AccountIdEndpointMode> {\n        self.account_id_endpoint_mode.as_ref()\n    }\n\n    /// Configured auth scheme preference\n    pub fn auth_scheme_preference(&self) -> Option<&AuthSchemePreference> {\n        self.auth_scheme_preference.as_ref()\n    }\n\n    /// Configured SigV4a signing region set\n    pub fn sigv4a_signing_region_set(&self) -> Option<&SigningRegionSet> {\n        self.sigv4a_signing_region_set.as_ref()\n    }\n\n    /// Configured endpoint URL\n    pub fn endpoint_url(&self) -> Option<&str> {\n        self.endpoint_url.as_deref()\n    }\n\n    /// Configured retry config\n    pub fn retry_config(&self) -> Option<&RetryConfig> {\n        self.retry_config.as_ref()\n    }\n\n    /// Configured timeout config\n    pub fn timeout_config(&self) -> Option<&TimeoutConfig> {\n        self.timeout_config.as_ref()\n    }\n\n    /// Configured sleep implementation\n    pub fn sleep_impl(&self) -> Option<SharedAsyncSleep> {\n        self.sleep_impl.clone()\n    }\n\n    /// Configured identity cache\n    pub fn identity_cache(&self) -> Option<SharedIdentityCache> {\n        self.identity_cache.clone()\n    }\n\n    /// Configured credentials provider\n    pub fn credentials_provider(&self) -> Option<SharedCredentialsProvider> {\n        self.credentials_provider.clone()\n    }\n\n    /// Configured bearer auth token provider\n    pub fn token_provider(&self) -> Option<SharedTokenProvider> {\n        self.token_provider.clone()\n    }\n\n    /// Configured time source\n    pub fn time_source(&self) -> Option<SharedTimeSource> {\n        self.time_source.clone()\n    }\n\n    /// Configured app name\n    pub fn app_name(&self) -> Option<&AppName> {\n        self.app_name.as_ref()\n    }\n\n    /// Configured HTTP client\n    pub fn http_client(&self) -> Option<SharedHttpClient> {\n        self.http_client.clone()\n    }\n\n    /// Use FIPS endpoints\n    pub fn use_fips(&self) -> Option<bool> {\n        self.use_fips\n    }\n\n    /// Use dual-stack endpoint\n    pub fn use_dual_stack(&self) -> Option<bool> {\n        self.use_dual_stack\n    }\n\n    /// When true, request compression is disabled.\n    pub fn disable_request_compression(&self) -> Option<bool> {\n        self.disable_request_compression\n    }\n\n    /// Configured checksum request behavior.\n    pub fn request_checksum_calculation(&self) -> Option<RequestChecksumCalculation> {\n        self.request_checksum_calculation\n    }\n\n    /// Configured checksum response behavior.\n    pub fn response_checksum_validation(&self) -> Option<ResponseChecksumValidation> {\n        self.response_checksum_validation\n    }\n\n    /// Configured minimum request compression size.\n    pub fn request_min_compression_size_bytes(&self) -> Option<u32> {\n        self.request_min_compression_size_bytes\n    }\n\n    /// Configured stalled stream protection\n    pub fn stalled_stream_protection(&self) -> Option<StalledStreamProtectionConfig> {\n        self.stalled_stream_protection_config.clone()\n    }\n\n    /// Behavior version configured for this client\n    pub fn behavior_version(&self) -> Option<BehaviorVersion> {\n        self.behavior_version\n    }\n\n    /// Return an immutable reference to the service config provider configured for this client.\n    pub fn service_config(&self) -> Option<&dyn LoadServiceConfig> {\n        self.service_config.as_deref()\n    }\n\n    /// Config builder\n    ///\n    /// _Important:_ Using the `aws-config` crate to configure the SDK is preferred to invoking this\n    /// builder directly. Using this builder directly won't pull in any AWS recommended default\n    /// configuration values.\n    pub fn builder() -> Builder {\n        Builder::default()\n    }\n\n    /// Convert this [`SdkConfig`] into a [`Builder`] by cloning it first\n    pub fn to_builder(&self) -> Builder {\n        self.clone().into_builder()\n    }\n\n    /// Get the origin of a setting.\n    ///\n    /// This is used internally to understand how to merge config structs while\n    /// respecting precedence of origins.\n    pub fn get_origin(&self, setting: &'static str) -> Origin {\n        self.config_origins\n            .get(setting)\n            .cloned()\n            .unwrap_or_default()\n    }\n\n    /// Convert this [`SdkConfig`] back to a builder to enable modification\n    pub fn into_builder(self) -> Builder {\n        Builder {\n            app_name: self.app_name,\n            auth_scheme_preference: self.auth_scheme_preference,\n            sigv4a_signing_region_set: self.sigv4a_signing_region_set,\n            identity_cache: self.identity_cache,\n            credentials_provider: self.credentials_provider,\n            token_provider: self.token_provider,\n            region: self.region,\n            account_id_endpoint_mode: self.account_id_endpoint_mode,\n            endpoint_url: self.endpoint_url,\n            retry_config: self.retry_config,\n            sleep_impl: self.sleep_impl,\n            time_source: self.time_source,\n            timeout_config: self.timeout_config,\n            http_client: self.http_client,\n            use_fips: self.use_fips,\n            use_dual_stack: self.use_dual_stack,\n            behavior_version: self.behavior_version,\n            stalled_stream_protection_config: self.stalled_stream_protection_config,\n            service_config: self.service_config,\n            config_origins: self.config_origins,\n            disable_request_compression: self.disable_request_compression,\n            request_min_compression_size_bytes: self.request_min_compression_size_bytes,\n            request_checksum_calculation: self.request_checksum_calculation,\n            response_checksum_validation: self.response_checksum_validation,\n        }\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/aws-types/src/service_config.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Code for extracting service config from the user's environment.\n\nuse std::fmt;\n\n/// A struct used with the [`LoadServiceConfig`] trait to extract service config from the user's environment.\n// [profile active-profile]\n// services = dev\n//\n// [services dev]\n// service-id =\n//   config-key = config-value\n#[derive(Clone, Debug, PartialEq, Eq, Hash)]\npub struct ServiceConfigKey<'a> {\n    service_id: &'a str,\n    profile: &'a str,\n    env: &'a str,\n}\n\nimpl<'a> ServiceConfigKey<'a> {\n    /// Create a new [`ServiceConfigKey`] builder struct.\n    pub fn builder() -> builder::Builder<'a> {\n        Default::default()\n    }\n    /// Get the service ID.\n    pub fn service_id(&self) -> &'a str {\n        self.service_id\n    }\n    /// Get the profile key.\n    pub fn profile(&self) -> &'a str {\n        self.profile\n    }\n    /// Get the environment key.\n    pub fn env(&self) -> &'a str {\n        self.env\n    }\n}\n\npub mod builder {\n    //! Builder for [`ServiceConfigKey`].\n\n    use super::ServiceConfigKey;\n    use std::fmt;\n\n    /// Builder for [`ServiceConfigKey`].\n    #[derive(Default, Debug)]\n    pub struct Builder<'a> {\n        service_id: Option<&'a str>,\n        profile: Option<&'a str>,\n        env: Option<&'a str>,\n    }\n\n    impl<'a> Builder<'a> {\n        /// Set the service ID.\n        pub fn service_id(mut self, service_id: &'a str) -> Self {\n            self.service_id = Some(service_id);\n            self\n        }\n\n        /// Set the profile key.\n        pub fn profile(mut self, profile: &'a str) -> Self {\n            self.profile = Some(profile);\n            self\n        }\n\n        /// Set the environment key.\n        pub fn env(mut self, env: &'a str) -> Self {\n            self.env = Some(env);\n            self\n        }\n\n        /// Build the [`ServiceConfigKey`].\n        ///\n        /// Returns an error if any of the required fields are missing.\n        pub fn build(self) -> Result<ServiceConfigKey<'a>, Error> {\n            Ok(ServiceConfigKey {\n                service_id: self.service_id.ok_or_else(Error::missing_service_id)?,\n                profile: self.profile.ok_or_else(Error::missing_profile)?,\n                env: self.env.ok_or_else(Error::missing_env)?,\n            })\n        }\n    }\n\n    #[allow(clippy::enum_variant_names)]\n    #[derive(Debug)]\n    enum ErrorKind {\n        MissingServiceId,\n        MissingProfile,\n        MissingEnv,\n    }\n\n    impl fmt::Display for ErrorKind {\n        fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n            match self {\n                ErrorKind::MissingServiceId => write!(f, \"missing required service-id\"),\n                ErrorKind::MissingProfile => write!(f, \"missing required active profile name\"),\n                ErrorKind::MissingEnv => write!(f, \"missing required environment variable name\"),\n            }\n        }\n    }\n\n    /// Error type for [`ServiceConfigKey::builder`]\n    #[derive(Debug)]\n    pub struct Error {\n        kind: ErrorKind,\n    }\n\n    impl fmt::Display for Error {\n        fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n            write!(f, \"couldn't build a ServiceEnvConfigKey: {}\", self.kind)\n        }\n    }\n\n    impl std::error::Error for Error {}\n\n    impl Error {\n        /// Create a new \"missing service ID\" error\n        pub fn missing_service_id() -> Self {\n            Self {\n                kind: ErrorKind::MissingServiceId,\n            }\n        }\n        /// Create a new \"missing profile key\" error\n        pub fn missing_profile() -> Self {\n            Self {\n                kind: ErrorKind::MissingProfile,\n            }\n        }\n        /// Create a new \"missing env key\" error\n        pub fn missing_env() -> Self {\n            Self {\n                kind: ErrorKind::MissingEnv,\n            }\n        }\n    }\n}\n\n/// Implementers of this trait can provide service config defined in a user's environment.\npub trait LoadServiceConfig: fmt::Debug + Send + Sync {\n    /// Given a [`ServiceConfigKey`], return the value associated with it.\n    fn load_config(&self, key: ServiceConfigKey<'_>) -> Option<String>;\n}\n"
  },
  {
    "path": "aws/rust-runtime/build.gradle.kts",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nplugins {\n    id(\"smithy-rs.kotlin-conventions\")\n    id(\"smithy-rs.publishing-conventions\")\n}\n\ndescription = \"AWS SDK Rust Runtime\"\nextra[\"displayName\"] = \"Smithy :: Rust :: AWS SDK Rust Runtime\"\nextra[\"moduleName\"] = \"software.amazon.smithy.rust.aws.runtime\"\n\ntasks.jar {\n    from(\"./\") {\n        include(\"aws-inlineable/src/*.rs\")\n        include(\"aws-inlineable/Cargo.toml\")\n    }\n}\n"
  },
  {
    "path": "aws/rust-runtime/clippy.toml",
    "content": "# this file is named `clippy-root.toml` so it isn't picked up automagically. Clippy\n# will search up the filesystem for a clippy.toml and this causes problems with tools.\ndisallowed-methods = [\n    # fully qualified function/method name:\n    \"std::time::SystemTime::now\",\n    \"std::time::SystemTime::elapsed\",\n    \"std::time::Instant::now\",\n    \"std::time::Instant::elapsed\"\n]\n"
  },
  {
    "path": "aws/sdk/.gitignore",
    "content": "smithy-build.json\n"
  },
  {
    "path": "aws/sdk/README.md",
    "content": "AWS SDK Generator\n=================\n\nThis directory contains a gradle project to generate an AWS SDK. It uses the Smithy Build Plugin combined with the customizations specified in `aws/codegen-aws-sdk` to generate an AWS SDK from Smithy models.\n\n`build.gradle.kts` will generate a `smithy-build.json` dynamically from all models in the `models` directory.\n\nUsage\n-----\n\nGenerate an SDK:\n`./gradlew :aws:sdk:assemble`\n\nGenerate, compile, and test an SDK:\n`./gradlew :aws:sdk:check`\n\nRun an SDK example:\n`./gradlew :aws:sdk:runExample --example dynamo-helloworld`\n\nControlling service generation\n------------------------------\n\nYou can use gradle properties to opt/out of generating specific services:\n```bash\n# Generate only S3,EC2\n# sts, sso, ssooidc, and signin must be included, as they are internally used by S3 and EC2\n./gradlew -Paws.services=+s3,+ec2,+sts,+sso,+ssooidc,+signin :aws:sdk:assemble\n\n# Generate all AWS services using models from the aws-sdk-rust repo\n./gradlew \\\n  -Paws.sdk.models.path=<absolute path to the aws-sdk-rust repo>/aws-models \\\n  :aws:sdk:assemble\n\n# Generate only S3 from using the model from the aws-sdk-rust repo\n# sts, sso, ssooidc, and signin must be included, as they are internally used by S3\n./gradlew \\\n  -Paws.sdk.models.path=<absolute path to the aws-sdk-rust repo>/aws-models \\\n  -Paws.services=+s3,+sts,+sso,+ssooidc,+signin \\\n  :aws:sdk:assemble\n\n# Start with a clean slate\n./gradlew aws:sdk:clean\n```\n\nThe generation logic is as follows:\n1. If `aws.sdk.models.path` is specified, take models from that path. Otherwise take them from the local `aws-models` directory.\n2. Reference the `aws.services` property to determine which models to include/exclude, based on the service module names.\n\nDebugging with IntelliJ\n-----------------------\n\nThe easiest way to debug codegen is to attach a remote debugger to the Gradle daemon and then run `aws:sdk:assemble`.\nTo do this:\n\n1. Temporarily modify the root `gradle.properties` file to have the following:\n```\norg.gradle.jvmargs=-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=localhost:5006\n```\n2. Run `./gradlew --stop` to kill any Gradle daemons that are running without that property.\n3. Configure IntelliJ to remote debug on port 5006 (or whichever port was configured above).\n4. Run `./gradlew aws:sdk:assemble` (with any additional properties to limit the services generated)\n5. It will hang on \"Starting Daemon\". This is because the Gradle daemon is waiting for a remote debugger\n   to start up. Attaching IntelliJ's debugger will make the build proceed, but now you can stop execution\n   on breakpoints and examine values.\n"
  },
  {
    "path": "aws/sdk/aws-models/README.md",
    "content": "This directory contains a snapshot of a small subset of AWS service models to test the code generator against.\nThese were carefully selected to exercise every Smithy AWS protocol:\n\n - `@awsJson1_0`: dynamodb\n - `@awsJson1_1`: config\n - `@awsQuery`: sts\n - `@ec2Query`: ec2\n - `@restJson1`: polly\n - `@restXml`: s3\n - Allow-listed Event Stream: transcribestreaming\n\nAll other services in this directory not listed above have integration tests that need to run in CI.\n\nWhen generating the full SDK for releases, the models in [awslabs/aws-sdk-rust]'s `aws-models` directory are used.\n\n[awslabs/aws-sdk-rust]: https://github.com/awslabs/aws-sdk-rust\n"
  },
  {
    "path": "aws/sdk/aws-models/bedrock-runtime.json",
    "content": "{\n    \"smithy\": \"2.0\",\n    \"shapes\": {\n        \"com.amazonaws.bedrockruntime#AccessDeniedException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#NonBlankString\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The request is denied because you do not have sufficient permissions to perform the requested action. For troubleshooting this error, see <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/userguide/troubleshooting-api-error-codes.html#ts-access-denied\\\">AccessDeniedException</a> in the Amazon Bedrock User Guide</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 403\n            }\n        },\n        \"com.amazonaws.bedrockruntime#AccountId\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#pattern\": \"^[0-9]{12}$\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#AdditionalModelResponseFieldPaths\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"smithy.api#String\",\n                \"traits\": {\n                    \"smithy.api#length\": {\n                        \"min\": 1,\n                        \"max\": 256\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"max\": 10\n                }\n            }\n        },\n        \"com.amazonaws.bedrockruntime#AmazonBedrockFrontendService\": {\n            \"type\": \"service\",\n            \"version\": \"2023-09-30\",\n            \"resources\": [\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#AsyncInvokeResource\"\n                },\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailResource\"\n                },\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#InferenceResource\"\n                },\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#TokenizerResource\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#service\": {\n                    \"sdkId\": \"Bedrock Runtime\",\n                    \"endpointPrefix\": \"bedrock-runtime\",\n                    \"cloudTrailEventSource\": \"bedrock.amazonaws.com\"\n                },\n                \"aws.auth#sigv4\": {\n                    \"name\": \"bedrock\"\n                },\n                \"aws.protocols#restJson1\": {\n                    \"http\": [\n                        \"h2\",\n                        \"http/1.1\"\n                    ],\n                    \"eventStreamHttp\": [\n                        \"h2\",\n                        \"http/1.1\"\n                    ]\n                },\n                \"smithy.api#auth\": [\n                    \"aws.auth#sigv4\",\n                    \"smithy.api#httpBearerAuth\"\n                ],\n                \"smithy.api#documentation\": \"<p>Describes the API operations for running inference using Amazon Bedrock models.</p>\",\n                \"smithy.api#httpBearerAuth\": {},\n                \"smithy.api#title\": \"Amazon Bedrock Runtime\",\n                \"smithy.rules#endpointRuleSet\": {\n                    \"version\": \"1.0\",\n                    \"parameters\": {\n                        \"Region\": {\n                            \"builtIn\": \"AWS::Region\",\n                            \"required\": false,\n                            \"documentation\": \"The AWS region used to dispatch the request.\",\n                            \"type\": \"String\"\n                        },\n                        \"UseDualStack\": {\n                            \"builtIn\": \"AWS::UseDualStack\",\n                            \"required\": true,\n                            \"default\": false,\n                            \"documentation\": \"When true, use the dual-stack endpoint. If the configured endpoint does not support dual-stack, dispatching the request MAY return an error.\",\n                            \"type\": \"Boolean\"\n                        },\n                        \"UseFIPS\": {\n                            \"builtIn\": \"AWS::UseFIPS\",\n                            \"required\": true,\n                            \"default\": false,\n                            \"documentation\": \"When true, send this request to the FIPS-compliant regional endpoint. If the configured endpoint does not have a FIPS compliant endpoint, dispatching the request will return an error.\",\n                            \"type\": \"Boolean\"\n                        },\n                        \"Endpoint\": {\n                            \"builtIn\": \"SDK::Endpoint\",\n                            \"required\": false,\n                            \"documentation\": \"Override the endpoint used to send this request\",\n                            \"type\": \"String\"\n                        }\n                    },\n                    \"rules\": [\n                        {\n                            \"conditions\": [\n                                {\n                                    \"fn\": \"isSet\",\n                                    \"argv\": [\n                                        {\n                                            \"ref\": \"Endpoint\"\n                                        }\n                                    ]\n                                }\n                            ],\n                            \"rules\": [\n                                {\n                                    \"conditions\": [\n                                        {\n                                            \"fn\": \"booleanEquals\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"UseFIPS\"\n                                                },\n                                                true\n                                            ]\n                                        }\n                                    ],\n                                    \"error\": \"Invalid Configuration: FIPS and custom endpoint are not supported\",\n                                    \"type\": \"error\"\n                                },\n                                {\n                                    \"conditions\": [],\n                                    \"rules\": [\n                                        {\n                                            \"conditions\": [\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseDualStack\"\n                                                        },\n                                                        true\n                                                    ]\n                                                }\n                                            ],\n                                            \"error\": \"Invalid Configuration: Dualstack and custom endpoint are not supported\",\n                                            \"type\": \"error\"\n                                        },\n                                        {\n                                            \"conditions\": [],\n                                            \"endpoint\": {\n                                                \"url\": {\n                                                    \"ref\": \"Endpoint\"\n                                                },\n                                                \"properties\": {},\n                                                \"headers\": {}\n                                            },\n                                            \"type\": \"endpoint\"\n                                        }\n                                    ],\n                                    \"type\": \"tree\"\n                                }\n                            ],\n                            \"type\": \"tree\"\n                        },\n                        {\n                            \"conditions\": [],\n                            \"rules\": [\n                                {\n                                    \"conditions\": [\n                                        {\n                                            \"fn\": \"isSet\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"Region\"\n                                                }\n                                            ]\n                                        }\n                                    ],\n                                    \"rules\": [\n                                        {\n                                            \"conditions\": [\n                                                {\n                                                    \"fn\": \"aws.partition\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"Region\"\n                                                        }\n                                                    ],\n                                                    \"assign\": \"PartitionResult\"\n                                                }\n                                            ],\n                                            \"rules\": [\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"UseFIPS\"\n                                                                },\n                                                                true\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"UseDualStack\"\n                                                                },\n                                                                true\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"rules\": [\n                                                        {\n                                                            \"conditions\": [\n                                                                {\n                                                                    \"fn\": \"booleanEquals\",\n                                                                    \"argv\": [\n                                                                        true,\n                                                                        {\n                                                                            \"fn\": \"getAttr\",\n                                                                            \"argv\": [\n                                                                                {\n                                                                                    \"ref\": \"PartitionResult\"\n                                                                                },\n                                                                                \"supportsFIPS\"\n                                                                            ]\n                                                                        }\n                                                                    ]\n                                                                },\n                                                                {\n                                                                    \"fn\": \"booleanEquals\",\n                                                                    \"argv\": [\n                                                                        true,\n                                                                        {\n                                                                            \"fn\": \"getAttr\",\n                                                                            \"argv\": [\n                                                                                {\n                                                                                    \"ref\": \"PartitionResult\"\n                                                                                },\n                                                                                \"supportsDualStack\"\n                                                                            ]\n                                                                        }\n                                                                    ]\n                                                                }\n                                                            ],\n                                                            \"rules\": [\n                                                                {\n                                                                    \"conditions\": [],\n                                                                    \"rules\": [\n                                                                        {\n                                                                            \"conditions\": [],\n                                                                            \"endpoint\": {\n                                                                                \"url\": \"https://bedrock-runtime-fips.{Region}.{PartitionResult#dualStackDnsSuffix}\",\n                                                                                \"properties\": {},\n                                                                                \"headers\": {}\n                                                                            },\n                                                                            \"type\": \"endpoint\"\n                                                                        }\n                                                                    ],\n                                                                    \"type\": \"tree\"\n                                                                }\n                                                            ],\n                                                            \"type\": \"tree\"\n                                                        },\n                                                        {\n                                                            \"conditions\": [],\n                                                            \"error\": \"FIPS and DualStack are enabled, but this partition does not support one or both\",\n                                                            \"type\": \"error\"\n                                                        }\n                                                    ],\n                                                    \"type\": \"tree\"\n                                                },\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"UseFIPS\"\n                                                                },\n                                                                true\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"rules\": [\n                                                        {\n                                                            \"conditions\": [\n                                                                {\n                                                                    \"fn\": \"booleanEquals\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"fn\": \"getAttr\",\n                                                                            \"argv\": [\n                                                                                {\n                                                                                    \"ref\": \"PartitionResult\"\n                                                                                },\n                                                                                \"supportsFIPS\"\n                                                                            ]\n                                                                        },\n                                                                        true\n                                                                    ]\n                                                                }\n                                                            ],\n                                                            \"rules\": [\n                                                                {\n                                                                    \"conditions\": [],\n                                                                    \"rules\": [\n                                                                        {\n                                                                            \"conditions\": [],\n                                                                            \"endpoint\": {\n                                                                                \"url\": \"https://bedrock-runtime-fips.{Region}.{PartitionResult#dnsSuffix}\",\n                                                                                \"properties\": {},\n                                                                                \"headers\": {}\n                                                                            },\n                                                                            \"type\": \"endpoint\"\n                                                                        }\n                                                                    ],\n                                                                    \"type\": \"tree\"\n                                                                }\n                                                            ],\n                                                            \"type\": \"tree\"\n                                                        },\n                                                        {\n                                                            \"conditions\": [],\n                                                            \"error\": \"FIPS is enabled but this partition does not support FIPS\",\n                                                            \"type\": \"error\"\n                                                        }\n                                                    ],\n                                                    \"type\": \"tree\"\n                                                },\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"UseDualStack\"\n                                                                },\n                                                                true\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"rules\": [\n                                                        {\n                                                            \"conditions\": [\n                                                                {\n                                                                    \"fn\": \"booleanEquals\",\n                                                                    \"argv\": [\n                                                                        true,\n                                                                        {\n                                                                            \"fn\": \"getAttr\",\n                                                                            \"argv\": [\n                                                                                {\n                                                                                    \"ref\": \"PartitionResult\"\n                                                                                },\n                                                                                \"supportsDualStack\"\n                                                                            ]\n                                                                        }\n                                                                    ]\n                                                                }\n                                                            ],\n                                                            \"rules\": [\n                                                                {\n                                                                    \"conditions\": [],\n                                                                    \"rules\": [\n                                                                        {\n                                                                            \"conditions\": [],\n                                                                            \"endpoint\": {\n                                                                                \"url\": \"https://bedrock-runtime.{Region}.{PartitionResult#dualStackDnsSuffix}\",\n                                                                                \"properties\": {},\n                                                                                \"headers\": {}\n                                                                            },\n                                                                            \"type\": \"endpoint\"\n                                                                        }\n                                                                    ],\n                                                                    \"type\": \"tree\"\n                                                                }\n                                                            ],\n                                                            \"type\": \"tree\"\n                                                        },\n                                                        {\n                                                            \"conditions\": [],\n                                                            \"error\": \"DualStack is enabled but this partition does not support DualStack\",\n                                                            \"type\": \"error\"\n                                                        }\n                                                    ],\n                                                    \"type\": \"tree\"\n                                                },\n                                                {\n                                                    \"conditions\": [],\n                                                    \"rules\": [\n                                                        {\n                                                            \"conditions\": [],\n                                                            \"endpoint\": {\n                                                                \"url\": \"https://bedrock-runtime.{Region}.{PartitionResult#dnsSuffix}\",\n                                                                \"properties\": {},\n                                                                \"headers\": {}\n                                                            },\n                                                            \"type\": \"endpoint\"\n                                                        }\n                                                    ],\n                                                    \"type\": \"tree\"\n                                                }\n                                            ],\n                                            \"type\": \"tree\"\n                                        }\n                                    ],\n                                    \"type\": \"tree\"\n                                },\n                                {\n                                    \"conditions\": [],\n                                    \"error\": \"Invalid Configuration: Missing Region\",\n                                    \"type\": \"error\"\n                                }\n                            ],\n                            \"type\": \"tree\"\n                        }\n                    ]\n                },\n                \"smithy.rules#endpointTests\": {\n                    \"testCases\": [\n                        {\n                            \"documentation\": \"For region us-east-1 with FIPS enabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://bedrock-runtime-fips.us-east-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://bedrock-runtime-fips.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-1 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://bedrock-runtime.us-east-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://bedrock-runtime.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-north-1 with FIPS enabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://bedrock-runtime-fips.cn-north-1.api.amazonwebservices.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-north-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-north-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://bedrock-runtime-fips.cn-north-1.amazonaws.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-north-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-north-1 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://bedrock-runtime.cn-north-1.api.amazonwebservices.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-north-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-north-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://bedrock-runtime.cn-north-1.amazonaws.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-north-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-east-1 with FIPS enabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://bedrock-runtime-fips.us-gov-east-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-east-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://bedrock-runtime-fips.us-gov-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-east-1 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://bedrock-runtime.us-gov-east-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://bedrock-runtime.us-gov-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-iso-east-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://bedrock-runtime-fips.us-iso-east-1.c2s.ic.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-iso-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-iso-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://bedrock-runtime.us-iso-east-1.c2s.ic.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-iso-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-isob-east-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://bedrock-runtime-fips.us-isob-east-1.sc2s.sgov.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-isob-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-isob-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://bedrock-runtime.us-isob-east-1.sc2s.sgov.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-isob-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For custom endpoint with region set and fips disabled and dualstack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://example.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"For custom endpoint with region not set and fips disabled and dualstack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://example.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"For custom endpoint with fips enabled and dualstack disabled\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: FIPS and custom endpoint are not supported\"\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false,\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"For custom endpoint with fips disabled and dualstack enabled\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: Dualstack and custom endpoint are not supported\"\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true,\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"Missing region\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: Missing Region\"\n                            }\n                        }\n                    ],\n                    \"version\": \"1.0\"\n                }\n            }\n        },\n        \"com.amazonaws.bedrockruntime#AnyToolChoice\": {\n            \"type\": \"structure\",\n            \"members\": {},\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The model must request at least one tool (no text is generated). For example, <code>{\\\"any\\\" : {}}</code>.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#ApplyGuardrail\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.bedrockruntime#ApplyGuardrailRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.bedrockruntime#ApplyGuardrailResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#AccessDeniedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#InternalServerException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#ServiceQuotaExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#ServiceUnavailableException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#ThrottlingException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The action to apply a guardrail.</p> <p>For troubleshooting some of the common errors you might encounter when using the <code>ApplyGuardrail</code> API, see <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/userguide/troubleshooting-api-error-codes.html\\\">Troubleshooting Amazon Bedrock API Error Codes</a> in the Amazon Bedrock User Guide</p>\",\n                \"smithy.api#http\": {\n                    \"code\": 200,\n                    \"method\": \"POST\",\n                    \"uri\": \"/guardrail/{guardrailIdentifier}/version/{guardrailVersion}/apply\"\n                }\n            }\n        },\n        \"com.amazonaws.bedrockruntime#ApplyGuardrailRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"guardrailIdentifier\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailIdentifier\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The guardrail identifier used in the request to apply the guardrail.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"guardrailVersion\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailVersion\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The guardrail version used in the request to apply the guardrail.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"source\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailContentSource\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The source of data used in the request to apply the guardrail.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"content\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailContentBlockList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The content details used in the request to apply the guardrail.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"outputScope\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailOutputScope\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the scope of the output that you get in the response. Set to <code>FULL</code> to return the entire output, including any detected and non-detected entries in the response for enhanced debugging.</p> <p>Note that the full output scope doesn't apply to word filters or regex in sensitive information filters. It does apply to all other filtering policies, including sensitive information with filters that can detect personally identifiable information (PII).</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.bedrockruntime#ApplyGuardrailResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"usage\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailUsage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The usage details in the response from the guardrail.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"action\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailAction\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The action taken in the response from the guardrail.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"actionReason\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The reason for the action taken when harmful content is detected.</p>\"\n                    }\n                },\n                \"outputs\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailOutputContentList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The output details in the response from the guardrail.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"assessments\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailAssessmentList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The assessment details in the response from the guardrail.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"guardrailCoverage\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailCoverage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The guardrail coverage details in the apply guardrail response.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.bedrockruntime#AsyncInvokeArn\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 2048\n                },\n                \"smithy.api#pattern\": \"^arn:[a-z0-9\\\\-]+:bedrock:[a-z0-9\\\\-]*:[0-9]*:(provisioned-model|foundation-model)/.+$\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#AsyncInvokeIdempotencyToken\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 256\n                },\n                \"smithy.api#pattern\": \"^[!-~]*$\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#AsyncInvokeIdentifier\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 256\n                },\n                \"smithy.api#pattern\": \"^[a-zA-Z_\\\\.\\\\-/0-9:]+$\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#AsyncInvokeMessage\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"max\": 2048\n                },\n                \"smithy.api#sensitive\": {}\n            }\n        },\n        \"com.amazonaws.bedrockruntime#AsyncInvokeOutputDataConfig\": {\n            \"type\": \"union\",\n            \"members\": {\n                \"s3OutputDataConfig\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#AsyncInvokeS3OutputDataConfig\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A storage location for the output data in an S3 bucket</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Asynchronous invocation output data settings.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#AsyncInvokeResource\": {\n            \"type\": \"resource\",\n            \"operations\": [\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#GetAsyncInvoke\"\n                },\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#ListAsyncInvokes\"\n                },\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#StartAsyncInvoke\"\n                }\n            ]\n        },\n        \"com.amazonaws.bedrockruntime#AsyncInvokeS3OutputDataConfig\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"s3Uri\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#S3Uri\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An object URI starting with <code>s3://</code>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"kmsKeyId\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#KmsKeyId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A KMS encryption key ID.</p>\"\n                    }\n                },\n                \"bucketOwner\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If the bucket belongs to another AWS account, specify that account's ID.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Asynchronous invocation output data settings.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#AsyncInvokeStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"IN_PROGRESS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"InProgress\"\n                    }\n                },\n                \"COMPLETED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Completed\"\n                    }\n                },\n                \"FAILED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Failed\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.bedrockruntime#AsyncInvokeSummaries\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.bedrockruntime#AsyncInvokeSummary\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#AsyncInvokeSummary\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"invocationArn\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#InvocationArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The invocation's ARN.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"modelArn\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#AsyncInvokeArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The invoked model's ARN.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"clientRequestToken\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#AsyncInvokeIdempotencyToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The invocation's idempotency token.</p>\"\n                    }\n                },\n                \"status\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#AsyncInvokeStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The invocation's status.</p>\"\n                    }\n                },\n                \"failureMessage\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#AsyncInvokeMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An error message.</p>\"\n                    }\n                },\n                \"submitTime\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>When the invocation was submitted.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"lastModifiedTime\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>When the invocation was last modified.</p>\"\n                    }\n                },\n                \"endTime\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>When the invocation ended.</p>\"\n                    }\n                },\n                \"outputDataConfig\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#AsyncInvokeOutputDataConfig\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The invocation's output data settings.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A summary of an asynchronous invocation.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#AutoToolChoice\": {\n            \"type\": \"structure\",\n            \"members\": {},\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The Model automatically decides if a tool should be called or whether to generate text instead. For example, <code>{\\\"auto\\\" : {}}</code>.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#AutomatedReasoningRuleIdentifier\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"max\": 12\n                },\n                \"smithy.api#pattern\": \"^[a-z0-9]{12}$\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#BidirectionalInputPayloadPart\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"bytes\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#PartBody\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The audio content for the bidirectional input.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Payload content for the bidirectional input. The input is an audio stream.</p>\",\n                \"smithy.api#sensitive\": {}\n            }\n        },\n        \"com.amazonaws.bedrockruntime#BidirectionalOutputPayloadPart\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"bytes\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#PartBody\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The speech output of the bidirectional stream.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Output from the bidirectional stream. The output is speech and a text transcription.</p>\",\n                \"smithy.api#sensitive\": {}\n            }\n        },\n        \"com.amazonaws.bedrockruntime#Body\": {\n            \"type\": \"blob\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"max\": 25000000\n                },\n                \"smithy.api#sensitive\": {}\n            }\n        },\n        \"com.amazonaws.bedrockruntime#CachePointBlock\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"type\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#CachePointType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the type of cache point within the CachePointBlock.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Defines a section of content to be cached for reuse in subsequent API calls.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#CachePointType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"DEFAULT\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"default\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.bedrockruntime#Citation\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"title\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The title or identifier of the source document being cited.</p>\"\n                    }\n                },\n                \"sourceContent\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#CitationSourceContentList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The specific content from the source document that was referenced or cited in the generated response.</p>\"\n                    }\n                },\n                \"location\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#CitationLocation\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The precise location within the source document where the cited content can be found, including character positions, page numbers, or chunk identifiers.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains information about a citation that references a specific source document. Citations provide traceability between the model's generated response and the source documents that informed that response.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#CitationGeneratedContent\": {\n            \"type\": \"union\",\n            \"members\": {\n                \"text\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The text content that was generated by the model and is supported by the associated citation.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the generated text content that corresponds to or is supported by a citation from a source document.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#CitationGeneratedContentList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.bedrockruntime#CitationGeneratedContent\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#CitationLocation\": {\n            \"type\": \"union\",\n            \"members\": {\n                \"documentChar\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#DocumentCharLocation\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The character-level location within the document where the cited content is found.</p>\"\n                    }\n                },\n                \"documentPage\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#DocumentPageLocation\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The page-level location within the document where the cited content is found.</p>\"\n                    }\n                },\n                \"documentChunk\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#DocumentChunkLocation\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The chunk-level location within the document where the cited content is found, typically used for documents that have been segmented into logical chunks.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Specifies the precise location within a source document where cited content can be found. This can include character-level positions, page numbers, or document chunks depending on the document type and indexing method.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#CitationSourceContent\": {\n            \"type\": \"union\",\n            \"members\": {\n                \"text\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The text content from the source document that is being cited.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the actual text content from a source document that is being cited or referenced in the model's response.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#CitationSourceContentDelta\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"text\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An incremental update to the text content from the source document that is being cited.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains incremental updates to the source content text during streaming responses, allowing clients to build up the cited content progressively.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#CitationSourceContentList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.bedrockruntime#CitationSourceContent\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#CitationSourceContentListDelta\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.bedrockruntime#CitationSourceContentDelta\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#Citations\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.bedrockruntime#Citation\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#CitationsConfig\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"enabled\": {\n                    \"target\": \"smithy.api#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies whether document citations should be included in the model's response. When set to true, the model can generate citations that reference the source documents used to inform the response.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Configuration settings for enabling and controlling document citations in Converse API responses. When enabled, the model can include citation information that links generated content back to specific source documents.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#CitationsContentBlock\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"content\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#CitationGeneratedContentList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The generated content that is supported by the associated citations.</p>\"\n                    }\n                },\n                \"citations\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#Citations\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An array of citations that reference the source documents used to generate the associated content.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A content block that contains both generated text and associated citation information. This block type is returned when document citations are enabled, providing traceability between the generated content and the source documents that informed the response.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#CitationsDelta\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"title\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The title or identifier of the source document being cited.</p>\"\n                    }\n                },\n                \"sourceContent\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#CitationSourceContentListDelta\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The specific content from the source document that was referenced or cited in the generated response.</p>\"\n                    }\n                },\n                \"location\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#CitationLocation\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the precise location within a source document where cited content can be found. This can include character-level positions, page numbers, or document chunks depending on the document type and indexing method.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains incremental updates to citation information during streaming responses. This allows clients to build up citation data progressively as the response is generated.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#ConflictException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#NonBlankString\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Error occurred because of a conflict while performing an operation.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.bedrockruntime#ContentBlock\": {\n            \"type\": \"union\",\n            \"members\": {\n                \"text\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Text to include in the message.</p>\"\n                    }\n                },\n                \"image\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#ImageBlock\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Image to include in the message. </p> <note> <p>This field is only supported by Anthropic Claude 3 models.</p> </note>\"\n                    }\n                },\n                \"document\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#DocumentBlock\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A document to include in the message.</p>\"\n                    }\n                },\n                \"video\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#VideoBlock\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Video to include in the message. </p>\"\n                    }\n                },\n                \"toolUse\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#ToolUseBlock\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Information about a tool use request from a model.</p>\"\n                    }\n                },\n                \"toolResult\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#ToolResultBlock\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The result for a tool request that a model makes.</p>\"\n                    }\n                },\n                \"guardContent\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailConverseContentBlock\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Contains the content to assess with the guardrail. If you don't specify <code>guardContent</code> in a call to the Converse API, the guardrail (if passed in the Converse API) assesses the entire message.</p> <p>For more information, see <i>Use a guardrail with the Converse API</i> in the <i>Amazon Bedrock User Guide</i>. </p>\"\n                    }\n                },\n                \"cachePoint\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#CachePointBlock\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>CachePoint to include in the message.</p>\"\n                    }\n                },\n                \"reasoningContent\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#ReasoningContentBlock\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Contains content regarding the reasoning that is carried out by the model. Reasoning refers to a Chain of Thought (CoT) that the model generates to enhance the accuracy of its final response.</p>\"\n                    }\n                },\n                \"citationsContent\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#CitationsContentBlock\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A content block that contains both generated text and associated citation information, providing traceability between the response and source documents.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A block of content for a message that you pass to, or receive from, a model with the <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_Converse.html\\\">Converse</a> or <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_ConverseStream.html\\\">ConverseStream</a> API operations.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#ContentBlockDelta\": {\n            \"type\": \"union\",\n            \"members\": {\n                \"text\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The content text.</p>\"\n                    }\n                },\n                \"toolUse\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#ToolUseBlockDelta\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Information about a tool that the model is requesting to use.</p>\"\n                    }\n                },\n                \"reasoningContent\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#ReasoningContentBlockDelta\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Contains content regarding the reasoning that is carried out by the model. Reasoning refers to a Chain of Thought (CoT) that the model generates to enhance the accuracy of its final response.</p>\"\n                    }\n                },\n                \"citation\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#CitationsDelta\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Incremental citation information that is streamed as part of the response generation process.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A block of content in a streaming response.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#ContentBlockDeltaEvent\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"delta\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#ContentBlockDelta\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The delta for a content block delta event.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"contentBlockIndex\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#NonNegativeInteger\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The block index for a content block delta event. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The content block delta event.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#ContentBlockStart\": {\n            \"type\": \"union\",\n            \"members\": {\n                \"toolUse\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#ToolUseBlockStart\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Information about a tool that the model is requesting to use.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Content block start information.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#ContentBlockStartEvent\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"start\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#ContentBlockStart\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Start information about a content block start event. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"contentBlockIndex\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#NonNegativeInteger\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The index for a content block start event.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Content block start event.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#ContentBlockStopEvent\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"contentBlockIndex\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#NonNegativeInteger\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The index for a content block.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A content block stop event.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#ContentBlocks\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.bedrockruntime#ContentBlock\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#ConversationRole\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"USER\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"user\"\n                    }\n                },\n                \"ASSISTANT\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"assistant\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.bedrockruntime#ConversationalModelId\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 2048\n                },\n                \"smithy.api#pattern\": \"^(arn:aws(-[^:]+)?:bedrock:[a-z0-9-]{1,20}:(([0-9]{12}:custom-model/[a-z0-9-]{1,63}[.]{1}[a-z0-9-]{1,63}/[a-z0-9]{12})|(:foundation-model/[a-z0-9-]{1,63}[.]{1}[a-z0-9-]{1,63}([.:]?[a-z0-9-]{1,63}))|([0-9]{12}:imported-model/[a-z0-9]{12})|([0-9]{12}:provisioned-model/[a-z0-9]{12})|([0-9]{12}:custom-model-deployment/[a-z0-9]{12})|([0-9]{12}:(inference-profile|application-inference-profile)/[a-zA-Z0-9-:.]+)))|([a-z0-9-]{1,63}[.]{1}[a-z0-9-]{1,63}([.:]?[a-z0-9-]{1,63}))|(([0-9a-zA-Z][_-]?)+)|([a-zA-Z0-9-:.]+)|(^(arn:aws(-[^:]+)?:bedrock:[a-z0-9-]{1,20}:[0-9]{12}:prompt/[0-9a-zA-Z]{10}(?::[0-9]{1,5})?))$|(^arn:aws:sagemaker:[a-z0-9-]+:[0-9]{12}:endpoint/[a-zA-Z0-9-]+$)|(^arn:aws(-[^:]+)?:bedrock:([0-9a-z-]{1,20}):([0-9]{12}):(default-)?prompt-router/[a-zA-Z0-9-:.]+$)$\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#Converse\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.bedrockruntime#ConverseRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.bedrockruntime#ConverseResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#AccessDeniedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#InternalServerException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#ModelErrorException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#ModelNotReadyException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#ModelTimeoutException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#ServiceUnavailableException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#ThrottlingException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Sends messages to the specified Amazon Bedrock model. <code>Converse</code> provides a consistent interface that works with all models that support messages. This allows you to write code once and use it with different models. If a model has unique inference parameters, you can also pass those unique parameters to the model.</p> <p>Amazon Bedrock doesn't store any text, images, or documents that you provide as content. The data is only used to generate the response.</p> <p>You can submit a prompt by including it in the <code>messages</code> field, specifying the <code>modelId</code> of a foundation model or inference profile to run inference on it, and including any other fields that are relevant to your use case.</p> <p>You can also submit a prompt from Prompt management by specifying the ARN of the prompt version and including a map of variables to values in the <code>promptVariables</code> field. You can append more messages to the prompt by using the <code>messages</code> field. If you use a prompt from Prompt management, you can't include the following fields in the request: <code>additionalModelRequestFields</code>, <code>inferenceConfig</code>, <code>system</code>, or <code>toolConfig</code>. Instead, these fields must be defined through Prompt management. For more information, see <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/userguide/prompt-management-use.html\\\">Use a prompt from Prompt management</a>.</p> <p>For information about the Converse API, see <i>Use the Converse API</i> in the <i>Amazon Bedrock User Guide</i>. To use a guardrail, see <i>Use a guardrail with the Converse API</i> in the <i>Amazon Bedrock User Guide</i>. To use a tool with a model, see <i>Tool use (Function calling)</i> in the <i>Amazon Bedrock User Guide</i> </p> <p>For example code, see <i>Converse API examples</i> in the <i>Amazon Bedrock User Guide</i>. </p> <p>This operation requires permission for the <code>bedrock:InvokeModel</code> action. </p> <important> <p>To deny all inference access to resources that you specify in the modelId field, you need to deny access to the <code>bedrock:InvokeModel</code> and <code>bedrock:InvokeModelWithResponseStream</code> actions. Doing this also denies access to the resource through the base inference actions (<a href=\\\"https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_InvokeModel.html\\\">InvokeModel</a> and <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_InvokeModelWithResponseStream.html\\\">InvokeModelWithResponseStream</a>). For more information see <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/userguide/security_iam_id-based-policy-examples.html#security_iam_id-based-policy-examples-deny-inference\\\">Deny access for inference on specific models</a>. </p> </important> <p>For troubleshooting some of the common errors you might encounter when using the <code>Converse</code> API, see <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/userguide/troubleshooting-api-error-codes.html\\\">Troubleshooting Amazon Bedrock API Error Codes</a> in the Amazon Bedrock User Guide</p>\",\n                \"smithy.api#http\": {\n                    \"code\": 200,\n                    \"method\": \"POST\",\n                    \"uri\": \"/model/{modelId}/converse\"\n                }\n            }\n        },\n        \"com.amazonaws.bedrockruntime#ConverseMetrics\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"latencyMs\": {\n                    \"target\": \"smithy.api#Long\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The latency of the call to <code>Converse</code>, in milliseconds. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Metrics for a call to <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_Converse.html\\\">Converse</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#ConverseOutput\": {\n            \"type\": \"union\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#Message\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The message that the model generates.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The output from a call to <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_Converse.html\\\">Converse</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#ConverseRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"modelId\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#ConversationalModelId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the model or throughput with which to run inference, or the prompt resource to use in inference. The value depends on the resource that you use:</p> <ul> <li> <p>If you use a base model, specify the model ID or its ARN. For a list of model IDs for base models, see <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/userguide/model-ids.html#model-ids-arns\\\">Amazon Bedrock base model IDs (on-demand throughput)</a> in the Amazon Bedrock User Guide.</p> </li> <li> <p>If you use an inference profile, specify the inference profile ID or its ARN. For a list of inference profile IDs, see <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/userguide/cross-region-inference-support.html\\\">Supported Regions and models for cross-region inference</a> in the Amazon Bedrock User Guide.</p> </li> <li> <p>If you use a provisioned model, specify the ARN of the Provisioned Throughput. For more information, see <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/userguide/prov-thru-use.html\\\">Run inference using a Provisioned Throughput</a> in the Amazon Bedrock User Guide.</p> </li> <li> <p>If you use a custom model, first purchase Provisioned Throughput for it. Then specify the ARN of the resulting provisioned model. For more information, see <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/userguide/model-customization-use.html\\\">Use a custom model in Amazon Bedrock</a> in the Amazon Bedrock User Guide.</p> </li> <li> <p>To include a prompt that was defined in <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/userguide/prompt-management.html\\\">Prompt management</a>, specify the ARN of the prompt version to use.</p> </li> </ul> <p>The Converse API doesn't support <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/userguide/model-customization-import-model.html\\\">imported models</a>.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"messages\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#Messages\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The messages that you want to send to the model.</p>\"\n                    }\n                },\n                \"system\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#SystemContentBlocks\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A prompt that provides instructions or context to the model about the task it should perform, or the persona it should adopt during the conversation.</p>\"\n                    }\n                },\n                \"inferenceConfig\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#InferenceConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Inference parameters to pass to the model. <code>Converse</code> and <code>ConverseStream</code> support a base set of inference parameters. If you need to pass additional parameters that the model supports, use the <code>additionalModelRequestFields</code> request field.</p>\"\n                    }\n                },\n                \"toolConfig\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#ToolConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Configuration information for the tools that the model can use when generating a response. </p> <p>For information about models that support tool use, see <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/userguide/conversation-inference.html#conversation-inference-supported-models-features\\\">Supported models and model features</a>.</p>\"\n                    }\n                },\n                \"guardrailConfig\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Configuration information for a guardrail that you want to use in the request. If you include <code>guardContent</code> blocks in the <code>content</code> field in the <code>messages</code> field, the guardrail operates only on those messages. If you include no <code>guardContent</code> blocks, the guardrail operates on all messages in the request body and in any included prompt resource.</p>\"\n                    }\n                },\n                \"additionalModelRequestFields\": {\n                    \"target\": \"smithy.api#Document\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Additional inference parameters that the model supports, beyond the base set of inference parameters that <code>Converse</code> and <code>ConverseStream</code> support in the <code>inferenceConfig</code> field. For more information, see <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/userguide/model-parameters.html\\\">Model parameters</a>.</p>\"\n                    }\n                },\n                \"promptVariables\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#PromptVariableMap\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Contains a map of variables in a prompt from Prompt management to objects containing the values to fill in for them when running model invocation. This field is ignored if you don't specify a prompt resource in the <code>modelId</code> field.</p>\"\n                    }\n                },\n                \"additionalModelResponseFieldPaths\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#AdditionalModelResponseFieldPaths\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Additional model parameters field paths to return in the response. <code>Converse</code> and <code>ConverseStream</code> return the requested fields as a JSON Pointer object in the <code>additionalModelResponseFields</code> field. The following is example JSON for <code>additionalModelResponseFieldPaths</code>.</p> <p> <code>[ \\\"/stop_sequence\\\" ]</code> </p> <p>For information about the JSON Pointer syntax, see the <a href=\\\"https://datatracker.ietf.org/doc/html/rfc6901\\\">Internet Engineering Task Force (IETF)</a> documentation.</p> <p> <code>Converse</code> and <code>ConverseStream</code> reject an empty JSON Pointer or incorrectly structured JSON Pointer with a <code>400</code> error code. if the JSON Pointer is valid, but the requested field is not in the model response, it is ignored by <code>Converse</code>.</p>\",\n                        \"smithy.api#length\": {\n                            \"max\": 10\n                        }\n                    }\n                },\n                \"requestMetadata\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#RequestMetadata\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Key-value pairs that you can use to filter invocation logs.</p>\"\n                    }\n                },\n                \"performanceConfig\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#PerformanceConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Model performance settings for the request.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.bedrockruntime#ConverseResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"output\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#ConverseOutput\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The result from the call to <code>Converse</code>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"stopReason\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#StopReason\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The reason why the model stopped generating output.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"usage\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#TokenUsage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The total number of tokens used in the call to <code>Converse</code>. The total includes the tokens input to the model and the tokens generated by the model.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"metrics\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#ConverseMetrics\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Metrics for the call to <code>Converse</code>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"additionalModelResponseFields\": {\n                    \"target\": \"smithy.api#Document\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Additional fields in the response that are unique to the model. </p>\"\n                    }\n                },\n                \"trace\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#ConverseTrace\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A trace object that contains information about the Guardrail behavior.</p>\"\n                    }\n                },\n                \"performanceConfig\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#PerformanceConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Model performance settings for the request.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.bedrockruntime#ConverseStream\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.bedrockruntime#ConverseStreamRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.bedrockruntime#ConverseStreamResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#AccessDeniedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#InternalServerException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#ModelErrorException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#ModelNotReadyException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#ModelTimeoutException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#ServiceUnavailableException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#ThrottlingException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Sends messages to the specified Amazon Bedrock model and returns the response in a stream. <code>ConverseStream</code> provides a consistent API that works with all Amazon Bedrock models that support messages. This allows you to write code once and use it with different models. Should a model have unique inference parameters, you can also pass those unique parameters to the model. </p> <p>To find out if a model supports streaming, call <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/APIReference/API_GetFoundationModel.html\\\">GetFoundationModel</a> and check the <code>responseStreamingSupported</code> field in the response.</p> <note> <p>The CLI doesn't support streaming operations in Amazon Bedrock, including <code>ConverseStream</code>.</p> </note> <p>Amazon Bedrock doesn't store any text, images, or documents that you provide as content. The data is only used to generate the response.</p> <p>You can submit a prompt by including it in the <code>messages</code> field, specifying the <code>modelId</code> of a foundation model or inference profile to run inference on it, and including any other fields that are relevant to your use case.</p> <p>You can also submit a prompt from Prompt management by specifying the ARN of the prompt version and including a map of variables to values in the <code>promptVariables</code> field. You can append more messages to the prompt by using the <code>messages</code> field. If you use a prompt from Prompt management, you can't include the following fields in the request: <code>additionalModelRequestFields</code>, <code>inferenceConfig</code>, <code>system</code>, or <code>toolConfig</code>. Instead, these fields must be defined through Prompt management. For more information, see <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/userguide/prompt-management-use.html\\\">Use a prompt from Prompt management</a>.</p> <p>For information about the Converse API, see <i>Use the Converse API</i> in the <i>Amazon Bedrock User Guide</i>. To use a guardrail, see <i>Use a guardrail with the Converse API</i> in the <i>Amazon Bedrock User Guide</i>. To use a tool with a model, see <i>Tool use (Function calling)</i> in the <i>Amazon Bedrock User Guide</i> </p> <p>For example code, see <i>Conversation streaming example</i> in the <i>Amazon Bedrock User Guide</i>. </p> <p>This operation requires permission for the <code>bedrock:InvokeModelWithResponseStream</code> action.</p> <important> <p>To deny all inference access to resources that you specify in the modelId field, you need to deny access to the <code>bedrock:InvokeModel</code> and <code>bedrock:InvokeModelWithResponseStream</code> actions. Doing this also denies access to the resource through the base inference actions (<a href=\\\"https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_InvokeModel.html\\\">InvokeModel</a> and <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_InvokeModelWithResponseStream.html\\\">InvokeModelWithResponseStream</a>). For more information see <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/userguide/security_iam_id-based-policy-examples.html#security_iam_id-based-policy-examples-deny-inference\\\">Deny access for inference on specific models</a>. </p> </important> <p>For troubleshooting some of the common errors you might encounter when using the <code>ConverseStream</code> API, see <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/userguide/troubleshooting-api-error-codes.html\\\">Troubleshooting Amazon Bedrock API Error Codes</a> in the Amazon Bedrock User Guide</p>\",\n                \"smithy.api#http\": {\n                    \"code\": 200,\n                    \"method\": \"POST\",\n                    \"uri\": \"/model/{modelId}/converse-stream\"\n                }\n            }\n        },\n        \"com.amazonaws.bedrockruntime#ConverseStreamMetadataEvent\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"usage\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#TokenUsage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Usage information for the conversation stream event.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"metrics\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#ConverseStreamMetrics\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The metrics for the conversation stream metadata event.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"trace\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#ConverseStreamTrace\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The trace object in the response from <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_ConverseStream.html\\\">ConverseStream</a> that contains information about the guardrail behavior.</p>\"\n                    }\n                },\n                \"performanceConfig\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#PerformanceConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Model performance configuration metadata for the conversation stream event.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A conversation stream metadata event.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#ConverseStreamMetrics\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"latencyMs\": {\n                    \"target\": \"smithy.api#Long\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The latency for the streaming request, in milliseconds.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Metrics for the stream.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#ConverseStreamOutput\": {\n            \"type\": \"union\",\n            \"members\": {\n                \"messageStart\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#MessageStartEvent\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Message start information.</p>\"\n                    }\n                },\n                \"contentBlockStart\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#ContentBlockStartEvent\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Start information for a content block.</p>\"\n                    }\n                },\n                \"contentBlockDelta\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#ContentBlockDeltaEvent\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The messages output content block delta.</p>\"\n                    }\n                },\n                \"contentBlockStop\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#ContentBlockStopEvent\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Stop information for a content block.</p>\"\n                    }\n                },\n                \"messageStop\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#MessageStopEvent\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Message stop information.</p>\"\n                    }\n                },\n                \"metadata\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#ConverseStreamMetadataEvent\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Metadata for the converse output stream.</p>\"\n                    }\n                },\n                \"internalServerException\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#InternalServerException\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An internal server error occurred. Retry your request.</p>\"\n                    }\n                },\n                \"modelStreamErrorException\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#ModelStreamErrorException\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A streaming error occurred. Retry your request.</p>\"\n                    }\n                },\n                \"validationException\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#ValidationException\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The input fails to satisfy the constraints specified by <i>Amazon Bedrock</i>. For troubleshooting this error, see <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/userguide/troubleshooting-api-error-codes.html#ts-validation-error\\\">ValidationError</a> in the Amazon Bedrock User Guide</p>\"\n                    }\n                },\n                \"throttlingException\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#ThrottlingException\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Your request was denied due to exceeding the account quotas for <i>Amazon Bedrock</i>. For troubleshooting this error, see <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/userguide/troubleshooting-api-error-codes.html#ts-throttling-exception\\\">ThrottlingException</a> in the Amazon Bedrock User Guide</p>\"\n                    }\n                },\n                \"serviceUnavailableException\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#ServiceUnavailableException\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The service isn't currently available. For troubleshooting this error, see <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/userguide/troubleshooting-api-error-codes.html#ts-service-unavailable\\\">ServiceUnavailable</a> in the Amazon Bedrock User Guide</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The messages output stream</p>\",\n                \"smithy.api#streaming\": {}\n            }\n        },\n        \"com.amazonaws.bedrockruntime#ConverseStreamRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"modelId\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#ConversationalModelId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the model or throughput with which to run inference, or the prompt resource to use in inference. The value depends on the resource that you use:</p> <ul> <li> <p>If you use a base model, specify the model ID or its ARN. For a list of model IDs for base models, see <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/userguide/model-ids.html#model-ids-arns\\\">Amazon Bedrock base model IDs (on-demand throughput)</a> in the Amazon Bedrock User Guide.</p> </li> <li> <p>If you use an inference profile, specify the inference profile ID or its ARN. For a list of inference profile IDs, see <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/userguide/cross-region-inference-support.html\\\">Supported Regions and models for cross-region inference</a> in the Amazon Bedrock User Guide.</p> </li> <li> <p>If you use a provisioned model, specify the ARN of the Provisioned Throughput. For more information, see <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/userguide/prov-thru-use.html\\\">Run inference using a Provisioned Throughput</a> in the Amazon Bedrock User Guide.</p> </li> <li> <p>If you use a custom model, first purchase Provisioned Throughput for it. Then specify the ARN of the resulting provisioned model. For more information, see <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/userguide/model-customization-use.html\\\">Use a custom model in Amazon Bedrock</a> in the Amazon Bedrock User Guide.</p> </li> <li> <p>To include a prompt that was defined in <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/userguide/prompt-management.html\\\">Prompt management</a>, specify the ARN of the prompt version to use.</p> </li> </ul> <p>The Converse API doesn't support <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/userguide/model-customization-import-model.html\\\">imported models</a>.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"messages\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#Messages\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The messages that you want to send to the model.</p>\"\n                    }\n                },\n                \"system\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#SystemContentBlocks\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A prompt that provides instructions or context to the model about the task it should perform, or the persona it should adopt during the conversation.</p>\"\n                    }\n                },\n                \"inferenceConfig\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#InferenceConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Inference parameters to pass to the model. <code>Converse</code> and <code>ConverseStream</code> support a base set of inference parameters. If you need to pass additional parameters that the model supports, use the <code>additionalModelRequestFields</code> request field.</p>\"\n                    }\n                },\n                \"toolConfig\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#ToolConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Configuration information for the tools that the model can use when generating a response.</p> <p>For information about models that support streaming tool use, see <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/userguide/conversation-inference.html#conversation-inference-supported-models-features\\\">Supported models and model features</a>.</p>\"\n                    }\n                },\n                \"guardrailConfig\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailStreamConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Configuration information for a guardrail that you want to use in the request. If you include <code>guardContent</code> blocks in the <code>content</code> field in the <code>messages</code> field, the guardrail operates only on those messages. If you include no <code>guardContent</code> blocks, the guardrail operates on all messages in the request body and in any included prompt resource.</p>\"\n                    }\n                },\n                \"additionalModelRequestFields\": {\n                    \"target\": \"smithy.api#Document\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Additional inference parameters that the model supports, beyond the base set of inference parameters that <code>Converse</code> and <code>ConverseStream</code> support in the <code>inferenceConfig</code> field. For more information, see <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/userguide/model-parameters.html\\\">Model parameters</a>.</p>\"\n                    }\n                },\n                \"promptVariables\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#PromptVariableMap\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Contains a map of variables in a prompt from Prompt management to objects containing the values to fill in for them when running model invocation. This field is ignored if you don't specify a prompt resource in the <code>modelId</code> field.</p>\"\n                    }\n                },\n                \"additionalModelResponseFieldPaths\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#AdditionalModelResponseFieldPaths\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Additional model parameters field paths to return in the response. <code>Converse</code> and <code>ConverseStream</code> return the requested fields as a JSON Pointer object in the <code>additionalModelResponseFields</code> field. The following is example JSON for <code>additionalModelResponseFieldPaths</code>.</p> <p> <code>[ \\\"/stop_sequence\\\" ]</code> </p> <p>For information about the JSON Pointer syntax, see the <a href=\\\"https://datatracker.ietf.org/doc/html/rfc6901\\\">Internet Engineering Task Force (IETF)</a> documentation.</p> <p> <code>Converse</code> and <code>ConverseStream</code> reject an empty JSON Pointer or incorrectly structured JSON Pointer with a <code>400</code> error code. if the JSON Pointer is valid, but the requested field is not in the model response, it is ignored by <code>Converse</code>.</p>\",\n                        \"smithy.api#length\": {\n                            \"max\": 10\n                        }\n                    }\n                },\n                \"requestMetadata\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#RequestMetadata\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Key-value pairs that you can use to filter invocation logs.</p>\"\n                    }\n                },\n                \"performanceConfig\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#PerformanceConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Model performance settings for the request.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.bedrockruntime#ConverseStreamResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"stream\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#ConverseStreamOutput\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The output stream that the model generated.</p>\",\n                        \"smithy.api#httpPayload\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.bedrockruntime#ConverseStreamTrace\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"guardrail\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailTraceAssessment\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The guardrail trace object. </p>\"\n                    }\n                },\n                \"promptRouter\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#PromptRouterTrace\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The request's prompt router.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The trace object in a response from <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_ConverseStream.html\\\">ConverseStream</a>. Currently, you can only trace guardrails.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#ConverseTokensRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"messages\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#Messages\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An array of messages to count tokens for.</p>\"\n                    }\n                },\n                \"system\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#SystemContentBlocks\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The system content blocks to count tokens for. System content provides instructions or context to the model about how it should behave or respond. The token count will include any system content provided.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The inputs from a <code>Converse</code> API request for token counting.</p> <p>This structure mirrors the input format for the <code>Converse</code> operation, allowing you to count tokens for conversation-based inference requests.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#ConverseTrace\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"guardrail\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailTraceAssessment\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The guardrail trace object. </p>\"\n                    }\n                },\n                \"promptRouter\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#PromptRouterTrace\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The request's prompt router.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The trace object in a response from <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_Converse.html\\\">Converse</a>. Currently, you can only trace guardrails.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#CountTokens\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.bedrockruntime#CountTokensRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.bedrockruntime#CountTokensResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#AccessDeniedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#InternalServerException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#ServiceUnavailableException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#ThrottlingException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns the token count for a given inference request. This operation helps you estimate token usage before sending requests to foundation models by returning the token count that would be used if the same input were sent to the model in an inference request.</p> <p>Token counting is model-specific because different models use different tokenization strategies. The token count returned by this operation will match the token count that would be charged if the same input were sent to the model in an <code>InvokeModel</code> or <code>Converse</code> request.</p> <p>You can use this operation to:</p> <ul> <li> <p>Estimate costs before sending inference requests.</p> </li> <li> <p>Optimize prompts to fit within token limits.</p> </li> <li> <p>Plan for token usage in your applications.</p> </li> </ul> <p>This operation accepts the same input formats as <code>InvokeModel</code> and <code>Converse</code>, allowing you to count tokens for both raw text inputs and structured conversation formats.</p> <p>The following operations are related to <code>CountTokens</code>:</p> <ul> <li> <p> <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/API/API_runtime_InvokeModel.html\\\">InvokeModel</a> - Sends inference requests to foundation models</p> </li> <li> <p> <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/API/API_runtime_Converse.html\\\">Converse</a> - Sends conversation-based inference requests to foundation models</p> </li> </ul>\",\n                \"smithy.api#http\": {\n                    \"code\": 200,\n                    \"method\": \"POST\",\n                    \"uri\": \"/model/{modelId}/count-tokens\"\n                },\n                \"smithy.api#readonly\": {}\n            }\n        },\n        \"com.amazonaws.bedrockruntime#CountTokensInput\": {\n            \"type\": \"union\",\n            \"members\": {\n                \"invokeModel\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#InvokeModelTokensRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An <code>InvokeModel</code> request for which to count tokens. Use this field when you want to count tokens for a raw text input that would be sent to the <code>InvokeModel</code> operation.</p>\"\n                    }\n                },\n                \"converse\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#ConverseTokensRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A <code>Converse</code> request for which to count tokens. Use this field when you want to count tokens for a conversation-based input that would be sent to the <code>Converse</code> operation.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The input value for token counting. The value should be either an <code>InvokeModel</code> or <code>Converse</code> request body. </p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#CountTokensRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"modelId\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#FoundationModelVersionIdentifier\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The unique identifier or ARN of the foundation model to use for token counting. Each model processes tokens differently, so the token count is specific to the model you specify.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"input\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#CountTokensInput\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The input for which to count tokens. The structure of this parameter depends on whether you're counting tokens for an <code>InvokeModel</code> or <code>Converse</code> request:</p> <ul> <li> <p>For <code>InvokeModel</code> requests, provide the request body in the <code>invokeModel</code> field</p> </li> <li> <p>For <code>Converse</code> requests, provide the messages and system content in the <code>converse</code> field</p> </li> </ul> <p>The input format must be compatible with the model specified in the <code>modelId</code> parameter.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.bedrockruntime#CountTokensResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"inputTokens\": {\n                    \"target\": \"smithy.api#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of tokens in the provided input according to the specified model's tokenization rules. This count represents the number of input tokens that would be processed if the same input were sent to the model in an inference request. Use this value to estimate costs and ensure your inputs stay within model token limits.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.bedrockruntime#DocumentBlock\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"format\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#DocumentFormat\",\n                    \"traits\": {\n                        \"smithy.api#addedDefault\": {},\n                        \"smithy.api#default\": \"txt\",\n                        \"smithy.api#documentation\": \"<p>The format of a document, or its extension.</p>\"\n                    }\n                },\n                \"name\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A name for the document. The name can only contain the following characters:</p> <ul> <li> <p>Alphanumeric characters</p> </li> <li> <p>Whitespace characters (no more than one in a row)</p> </li> <li> <p>Hyphens</p> </li> <li> <p>Parentheses</p> </li> <li> <p>Square brackets</p> </li> </ul> <note> <p>This field is vulnerable to prompt injections, because the model might inadvertently interpret it as instructions. Therefore, we recommend that you specify a neutral name.</p> </note>\",\n                        \"smithy.api#length\": {\n                            \"min\": 1,\n                            \"max\": 200\n                        },\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"source\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#DocumentSource\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Contains the content of the document.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"context\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Contextual information about how the document should be processed or interpreted by the model when generating citations.</p>\"\n                    }\n                },\n                \"citations\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#CitationsConfig\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Configuration settings that control how citations should be generated for this specific document.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A document to include in a message.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#DocumentCharLocation\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"documentIndex\": {\n                    \"target\": \"smithy.api#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The index of the document within the array of documents provided in the request.</p>\",\n                        \"smithy.api#range\": {\n                            \"min\": 0\n                        }\n                    }\n                },\n                \"start\": {\n                    \"target\": \"smithy.api#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The starting character position of the cited content within the document.</p>\",\n                        \"smithy.api#range\": {\n                            \"min\": 0\n                        }\n                    }\n                },\n                \"end\": {\n                    \"target\": \"smithy.api#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ending character position of the cited content within the document.</p>\",\n                        \"smithy.api#range\": {\n                            \"min\": 0\n                        }\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Specifies a character-level location within a document, providing precise positioning information for cited content using start and end character indices.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#DocumentChunkLocation\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"documentIndex\": {\n                    \"target\": \"smithy.api#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The index of the document within the array of documents provided in the request.</p>\",\n                        \"smithy.api#range\": {\n                            \"min\": 0\n                        }\n                    }\n                },\n                \"start\": {\n                    \"target\": \"smithy.api#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The starting chunk identifier or index of the cited content within the document.</p>\",\n                        \"smithy.api#range\": {\n                            \"min\": 0\n                        }\n                    }\n                },\n                \"end\": {\n                    \"target\": \"smithy.api#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ending chunk identifier or index of the cited content within the document.</p>\",\n                        \"smithy.api#range\": {\n                            \"min\": 0\n                        }\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Specifies a chunk-level location within a document, providing positioning information for cited content using logical document segments or chunks.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#DocumentContentBlock\": {\n            \"type\": \"union\",\n            \"members\": {\n                \"text\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The text content of the document.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the actual content of a document that can be processed by the model and potentially cited in the response.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#DocumentContentBlocks\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.bedrockruntime#DocumentContentBlock\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#DocumentFormat\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"PDF\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"pdf\"\n                    }\n                },\n                \"CSV\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"csv\"\n                    }\n                },\n                \"DOC\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"doc\"\n                    }\n                },\n                \"DOCX\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"docx\"\n                    }\n                },\n                \"XLS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"xls\"\n                    }\n                },\n                \"XLSX\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"xlsx\"\n                    }\n                },\n                \"HTML\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"html\"\n                    }\n                },\n                \"TXT\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"txt\"\n                    }\n                },\n                \"MD\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"md\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.bedrockruntime#DocumentPageLocation\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"documentIndex\": {\n                    \"target\": \"smithy.api#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The index of the document within the array of documents provided in the request.</p>\",\n                        \"smithy.api#range\": {\n                            \"min\": 0\n                        }\n                    }\n                },\n                \"start\": {\n                    \"target\": \"smithy.api#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The starting page number of the cited content within the document.</p>\",\n                        \"smithy.api#range\": {\n                            \"min\": 0\n                        }\n                    }\n                },\n                \"end\": {\n                    \"target\": \"smithy.api#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ending page number of the cited content within the document.</p>\",\n                        \"smithy.api#range\": {\n                            \"min\": 0\n                        }\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Specifies a page-level location within a document, providing positioning information for cited content using page numbers.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#DocumentSource\": {\n            \"type\": \"union\",\n            \"members\": {\n                \"bytes\": {\n                    \"target\": \"smithy.api#Blob\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The raw bytes for the document. If you use an Amazon Web Services SDK, you don't need to encode the bytes in base64.</p>\",\n                        \"smithy.api#length\": {\n                            \"min\": 1\n                        }\n                    }\n                },\n                \"s3Location\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#S3Location\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The location of a document object in an Amazon S3 bucket. To see which models support S3 uploads, see <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/userguide/conversation-inference-supported-models-features.html\\\">Supported models and features for Converse</a>.</p>\"\n                    }\n                },\n                \"text\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The text content of the document source.</p>\"\n                    }\n                },\n                \"content\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#DocumentContentBlocks\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The structured content of the document source, which may include various content blocks such as text, images, or other document elements.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the content of a document.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#FoundationModelVersionIdentifier\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#documentation\": \"ARN or ID of a Bedrock model\",\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 256\n                },\n                \"smithy.api#pattern\": \"^[a-zA-Z_\\\\.\\\\-/0-9:]+$\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GetAsyncInvoke\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.bedrockruntime#GetAsyncInvokeRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.bedrockruntime#GetAsyncInvokeResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#AccessDeniedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#InternalServerException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#ThrottlingException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Retrieve information about an asynchronous invocation.</p>\",\n                \"smithy.api#http\": {\n                    \"code\": 200,\n                    \"method\": \"GET\",\n                    \"uri\": \"/async-invoke/{invocationArn}\"\n                },\n                \"smithy.api#readonly\": {}\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GetAsyncInvokeRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"invocationArn\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#InvocationArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The invocation's ARN.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GetAsyncInvokeResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"invocationArn\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#InvocationArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The invocation's ARN.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"modelArn\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#AsyncInvokeArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The invocation's model ARN.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"clientRequestToken\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#AsyncInvokeIdempotencyToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The invocation's idempotency token.</p>\"\n                    }\n                },\n                \"status\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#AsyncInvokeStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The invocation's status.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"failureMessage\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#AsyncInvokeMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An error message.</p>\"\n                    }\n                },\n                \"submitTime\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>When the invocation request was submitted.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"lastModifiedTime\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The invocation's last modified time.</p>\"\n                    }\n                },\n                \"endTime\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>When the invocation ended.</p>\"\n                    }\n                },\n                \"outputDataConfig\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#AsyncInvokeOutputDataConfig\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Output data settings.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailAction\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"NONE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"NONE\"\n                    }\n                },\n                \"GUARDRAIL_INTERVENED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"GUARDRAIL_INTERVENED\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailAssessment\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"topicPolicy\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailTopicPolicyAssessment\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The topic policy.</p>\"\n                    }\n                },\n                \"contentPolicy\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailContentPolicyAssessment\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The content policy.</p>\"\n                    }\n                },\n                \"wordPolicy\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailWordPolicyAssessment\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The word policy.</p>\"\n                    }\n                },\n                \"sensitiveInformationPolicy\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailSensitiveInformationPolicyAssessment\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The sensitive information policy.</p>\"\n                    }\n                },\n                \"contextualGroundingPolicy\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailContextualGroundingPolicyAssessment\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The contextual grounding policy used for the guardrail assessment.</p>\"\n                    }\n                },\n                \"automatedReasoningPolicy\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailAutomatedReasoningPolicyAssessment\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The automated reasoning policy assessment results, including logical validation findings for the input content.</p>\"\n                    }\n                },\n                \"invocationMetrics\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailInvocationMetrics\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The invocation metrics for the guardrail assessment.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A behavior assessment of the guardrail policies used in a call to the Converse API. </p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailAssessmentList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.bedrockruntime#GuardrailAssessment\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailAssessmentListMap\": {\n            \"type\": \"map\",\n            \"key\": {\n                \"target\": \"smithy.api#String\"\n            },\n            \"value\": {\n                \"target\": \"com.amazonaws.bedrockruntime#GuardrailAssessmentList\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailAssessmentMap\": {\n            \"type\": \"map\",\n            \"key\": {\n                \"target\": \"smithy.api#String\"\n            },\n            \"value\": {\n                \"target\": \"com.amazonaws.bedrockruntime#GuardrailAssessment\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailAutomatedReasoningDifferenceScenarioList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.bedrockruntime#GuardrailAutomatedReasoningScenario\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"max\": 2\n                }\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailAutomatedReasoningFinding\": {\n            \"type\": \"union\",\n            \"members\": {\n                \"valid\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailAutomatedReasoningValidFinding\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Contains the result when the automated reasoning evaluation determines that the claims in the input are logically valid and definitively true based on the provided premises and policy rules.</p>\"\n                    }\n                },\n                \"invalid\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailAutomatedReasoningInvalidFinding\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Contains the result when the automated reasoning evaluation determines that the claims in the input are logically invalid and contradict the established premises or policy rules.</p>\"\n                    }\n                },\n                \"satisfiable\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailAutomatedReasoningSatisfiableFinding\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Contains the result when the automated reasoning evaluation determines that the claims in the input could be either true or false depending on additional assumptions not provided in the input context.</p>\"\n                    }\n                },\n                \"impossible\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailAutomatedReasoningImpossibleFinding\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Contains the result when the automated reasoning evaluation determines that no valid logical conclusions can be drawn due to contradictions in the premises or policy rules themselves.</p>\"\n                    }\n                },\n                \"translationAmbiguous\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailAutomatedReasoningTranslationAmbiguousFinding\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Contains the result when the automated reasoning evaluation detects that the input has multiple valid logical interpretations, requiring additional context or clarification to proceed with validation.</p>\"\n                    }\n                },\n                \"tooComplex\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailAutomatedReasoningTooComplexFinding\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Contains the result when the automated reasoning evaluation cannot process the input due to its complexity or volume exceeding the system's processing capacity for logical analysis.</p>\"\n                    }\n                },\n                \"noTranslations\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailAutomatedReasoningNoTranslationsFinding\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Contains the result when the automated reasoning evaluation cannot extract any relevant logical information from the input that can be validated against the policy rules.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents a logical validation result from automated reasoning policy evaluation. The finding indicates whether claims in the input are logically valid, invalid, satisfiable, impossible, or have other logical issues.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailAutomatedReasoningFindingList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.bedrockruntime#GuardrailAutomatedReasoningFinding\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailAutomatedReasoningImpossibleFinding\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"translation\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailAutomatedReasoningTranslation\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The logical translation of the input that this finding evaluates.</p>\"\n                    }\n                },\n                \"contradictingRules\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailAutomatedReasoningRuleList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The automated reasoning policy rules that contradict the claims and/or premises in the input.</p>\"\n                    }\n                },\n                \"logicWarning\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailAutomatedReasoningLogicWarning\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indication of a logic issue with the translation without needing to consider the automated reasoning policy rules.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Indicates that no valid claims can be made due to logical contradictions in the premises or rules.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailAutomatedReasoningInputTextReference\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"text\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailAutomatedReasoningStatementNaturalLanguageContent\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The specific text from the original input that this reference points to.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>References a portion of the original input text that corresponds to logical elements.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailAutomatedReasoningInputTextReferenceList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.bedrockruntime#GuardrailAutomatedReasoningInputTextReference\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailAutomatedReasoningInvalidFinding\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"translation\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailAutomatedReasoningTranslation\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The logical translation of the input that this finding invalidates.</p>\"\n                    }\n                },\n                \"contradictingRules\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailAutomatedReasoningRuleList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The automated reasoning policy rules that contradict the claims in the input.</p>\"\n                    }\n                },\n                \"logicWarning\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailAutomatedReasoningLogicWarning\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indication of a logic issue with the translation without needing to consider the automated reasoning policy rules.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Indicates that the claims are logically false and contradictory to the established rules or premises.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailAutomatedReasoningLogicWarning\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"type\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailAutomatedReasoningLogicWarningType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The category of the detected logical issue, such as statements that are always true or always false.</p>\"\n                    }\n                },\n                \"premises\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailAutomatedReasoningStatementList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The logical statements that serve as premises under which the claims are validated.</p>\"\n                    }\n                },\n                \"claims\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailAutomatedReasoningStatementList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The logical statements that are validated while assuming the policy and premises.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Identifies logical issues in the translated statements that exist independent of any policy rules, such as statements that are always true or always false.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailAutomatedReasoningLogicWarningType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ALWAYS_FALSE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ALWAYS_FALSE\"\n                    }\n                },\n                \"ALWAYS_TRUE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ALWAYS_TRUE\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailAutomatedReasoningNoTranslationsFinding\": {\n            \"type\": \"structure\",\n            \"members\": {},\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Indicates that no relevant logical information could be extracted from the input for validation.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailAutomatedReasoningPoliciesProcessed\": {\n            \"type\": \"integer\"\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailAutomatedReasoningPolicyAssessment\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"findings\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailAutomatedReasoningFindingList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>List of logical validation results produced by evaluating the input content against automated reasoning policies.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the results of automated reasoning policy evaluation, including logical findings about the validity of claims made in the input content.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailAutomatedReasoningPolicyUnitsProcessed\": {\n            \"type\": \"integer\"\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailAutomatedReasoningPolicyVersionArn\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"max\": 2048\n                },\n                \"smithy.api#pattern\": \"^arn:aws(-[^:]+)?:bedrock:[a-z0-9-]{1,20}:[0-9]{12}:automated-reasoning-policy/[a-z0-9]{12}(:([1-9][0-9]{0,11}))?$\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailAutomatedReasoningRule\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"identifier\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#AutomatedReasoningRuleIdentifier\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The unique identifier of the automated reasoning rule.</p>\"\n                    }\n                },\n                \"policyVersionArn\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailAutomatedReasoningPolicyVersionArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the automated reasoning policy version that contains this rule.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>References a specific automated reasoning policy rule that was applied during evaluation.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailAutomatedReasoningRuleList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.bedrockruntime#GuardrailAutomatedReasoningRule\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailAutomatedReasoningSatisfiableFinding\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"translation\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailAutomatedReasoningTranslation\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The logical translation of the input that this finding evaluates.</p>\"\n                    }\n                },\n                \"claimsTrueScenario\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailAutomatedReasoningScenario\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An example scenario demonstrating how the claims could be logically true.</p>\"\n                    }\n                },\n                \"claimsFalseScenario\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailAutomatedReasoningScenario\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An example scenario demonstrating how the claims could be logically false.</p>\"\n                    }\n                },\n                \"logicWarning\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailAutomatedReasoningLogicWarning\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indication of a logic issue with the translation without needing to consider the automated reasoning policy rules.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Indicates that the claims could be either true or false depending on additional assumptions not provided in the input.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailAutomatedReasoningScenario\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"statements\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailAutomatedReasoningStatementList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>List of logical assignments and statements that define this scenario.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents a logical scenario where claims can be evaluated as true or false, containing specific logical assignments.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailAutomatedReasoningStatement\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"logic\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailAutomatedReasoningStatementLogicContent\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The formal logical representation of the statement.</p>\"\n                    }\n                },\n                \"naturalLanguage\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailAutomatedReasoningStatementNaturalLanguageContent\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The natural language explanation of the logical statement.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A logical statement that includes both formal logic representation and natural language explanation.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailAutomatedReasoningStatementList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.bedrockruntime#GuardrailAutomatedReasoningStatement\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailAutomatedReasoningStatementLogicContent\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"max\": 1000\n                },\n                \"smithy.api#sensitive\": {}\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailAutomatedReasoningStatementNaturalLanguageContent\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"max\": 1000\n                },\n                \"smithy.api#sensitive\": {}\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailAutomatedReasoningTooComplexFinding\": {\n            \"type\": \"structure\",\n            \"members\": {},\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Indicates that the input exceeds the processing capacity due to the volume or complexity of the logical information.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailAutomatedReasoningTranslation\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"premises\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailAutomatedReasoningStatementList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The logical statements that serve as the foundation or assumptions for the claims.</p>\"\n                    }\n                },\n                \"claims\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailAutomatedReasoningStatementList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The logical statements that are being validated against the premises and policy rules.</p>\"\n                    }\n                },\n                \"untranslatedPremises\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailAutomatedReasoningInputTextReferenceList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>References to portions of the original input text that correspond to the premises but could not be fully translated.</p>\"\n                    }\n                },\n                \"untranslatedClaims\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailAutomatedReasoningInputTextReferenceList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>References to portions of the original input text that correspond to the claims but could not be fully translated.</p>\"\n                    }\n                },\n                \"confidence\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailAutomatedReasoningTranslationConfidence\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A confidence score between 0 and 1 indicating how certain the system is about the logical translation.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the logical translation of natural language input into formal logical statements, including premises, claims, and confidence scores.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailAutomatedReasoningTranslationAmbiguousFinding\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"options\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailAutomatedReasoningTranslationOptionList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Different logical interpretations that were detected during translation of the input.</p>\"\n                    }\n                },\n                \"differenceScenarios\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailAutomatedReasoningDifferenceScenarioList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Scenarios showing how the different translation options differ in meaning.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Indicates that the input has multiple valid logical interpretations, requiring additional context or clarification.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailAutomatedReasoningTranslationConfidence\": {\n            \"type\": \"double\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 0,\n                    \"max\": 1\n                }\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailAutomatedReasoningTranslationList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.bedrockruntime#GuardrailAutomatedReasoningTranslation\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailAutomatedReasoningTranslationOption\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"translations\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailAutomatedReasoningTranslationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Example translations that provide this possible interpretation of the input.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents one possible logical interpretation of ambiguous input content.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailAutomatedReasoningTranslationOptionList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.bedrockruntime#GuardrailAutomatedReasoningTranslationOption\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"max\": 2\n                }\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailAutomatedReasoningValidFinding\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"translation\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailAutomatedReasoningTranslation\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The logical translation of the input that this finding validates.</p>\"\n                    }\n                },\n                \"claimsTrueScenario\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailAutomatedReasoningScenario\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An example scenario demonstrating how the claims are logically true.</p>\"\n                    }\n                },\n                \"supportingRules\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailAutomatedReasoningRuleList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The automated reasoning policy rules that support why this result is considered valid.</p>\"\n                    }\n                },\n                \"logicWarning\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailAutomatedReasoningLogicWarning\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indication of a logic issue with the translation without needing to consider the automated reasoning policy rules.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Indicates that the claims are definitively true and logically implied by the premises, with no possible alternative interpretations.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"guardrailIdentifier\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailIdentifier\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The identifier for the guardrail.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"guardrailVersion\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailVersion\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The version of the guardrail.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"trace\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailTrace\",\n                    \"traits\": {\n                        \"smithy.api#default\": \"disabled\",\n                        \"smithy.api#documentation\": \"<p>The trace behavior for the guardrail.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Configuration information for a guardrail that you use with the <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_Converse.html\\\">Converse</a> operation.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailContentBlock\": {\n            \"type\": \"union\",\n            \"members\": {\n                \"text\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailTextBlock\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Text within content block to be evaluated by the guardrail.</p>\"\n                    }\n                },\n                \"image\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailImageBlock\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Image within guardrail content block to be evaluated by the guardrail.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The content block to be evaluated by the guardrail.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailContentBlockList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.bedrockruntime#GuardrailContentBlock\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailContentFilter\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"type\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailContentFilterType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The guardrail type.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"confidence\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailContentFilterConfidence\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The guardrail confidence.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"filterStrength\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailContentFilterStrength\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The filter strength setting for the guardrail content filter.</p>\"\n                    }\n                },\n                \"action\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailContentPolicyAction\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The guardrail action.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"detected\": {\n                    \"target\": \"smithy.api#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether content that breaches the guardrail configuration is detected.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The content filter for a guardrail.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailContentFilterConfidence\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"NONE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"NONE\"\n                    }\n                },\n                \"LOW\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"LOW\"\n                    }\n                },\n                \"MEDIUM\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"MEDIUM\"\n                    }\n                },\n                \"HIGH\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"HIGH\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailContentFilterList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.bedrockruntime#GuardrailContentFilter\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailContentFilterStrength\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"NONE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"NONE\"\n                    }\n                },\n                \"LOW\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"LOW\"\n                    }\n                },\n                \"MEDIUM\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"MEDIUM\"\n                    }\n                },\n                \"HIGH\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"HIGH\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailContentFilterType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"INSULTS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"INSULTS\"\n                    }\n                },\n                \"HATE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"HATE\"\n                    }\n                },\n                \"SEXUAL\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"SEXUAL\"\n                    }\n                },\n                \"VIOLENCE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"VIOLENCE\"\n                    }\n                },\n                \"MISCONDUCT\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"MISCONDUCT\"\n                    }\n                },\n                \"PROMPT_ATTACK\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"PROMPT_ATTACK\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailContentPolicyAction\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"BLOCKED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"BLOCKED\"\n                    }\n                },\n                \"NONE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"NONE\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailContentPolicyAssessment\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"filters\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailContentFilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The content policy filters.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>An assessment of a content policy for a guardrail.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailContentPolicyImageUnitsProcessed\": {\n            \"type\": \"integer\"\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailContentPolicyUnitsProcessed\": {\n            \"type\": \"integer\"\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailContentQualifier\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"GROUNDING_SOURCE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"grounding_source\"\n                    }\n                },\n                \"QUERY\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"query\"\n                    }\n                },\n                \"GUARD_CONTENT\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"guard_content\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailContentQualifierList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.bedrockruntime#GuardrailContentQualifier\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailContentSource\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"INPUT\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"INPUT\"\n                    }\n                },\n                \"OUTPUT\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"OUTPUT\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailContextualGroundingFilter\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"type\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailContextualGroundingFilterType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The contextual grounding filter type.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"threshold\": {\n                    \"target\": \"smithy.api#Double\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The threshold used by contextual grounding filter to determine whether the content is grounded or not.</p>\",\n                        \"smithy.api#range\": {\n                            \"min\": 0,\n                            \"max\": 1\n                        },\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"score\": {\n                    \"target\": \"smithy.api#Double\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The score generated by contextual grounding filter.</p>\",\n                        \"smithy.api#range\": {\n                            \"min\": 0,\n                            \"max\": 1\n                        },\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"action\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailContextualGroundingPolicyAction\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The action performed by the guardrails contextual grounding filter.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"detected\": {\n                    \"target\": \"smithy.api#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether content that fails the contextual grounding evaluation (grounding or relevance score less than the corresponding threshold) was detected.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The details for the guardrails contextual grounding filter.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailContextualGroundingFilterType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"GROUNDING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"GROUNDING\"\n                    }\n                },\n                \"RELEVANCE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"RELEVANCE\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailContextualGroundingFilters\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.bedrockruntime#GuardrailContextualGroundingFilter\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailContextualGroundingPolicyAction\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"BLOCKED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"BLOCKED\"\n                    }\n                },\n                \"NONE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"NONE\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailContextualGroundingPolicyAssessment\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"filters\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailContextualGroundingFilters\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The filter details for the guardrails contextual grounding filter.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The policy assessment details for the guardrails contextual grounding filter.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailContextualGroundingPolicyUnitsProcessed\": {\n            \"type\": \"integer\"\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailConverseContentBlock\": {\n            \"type\": \"union\",\n            \"members\": {\n                \"text\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailConverseTextBlock\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The text to guard.</p>\"\n                    }\n                },\n                \"image\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailConverseImageBlock\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Image within converse content block to be evaluated by the guardrail.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p/> <p>A content block for selective guarding with the <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_Converse.html\\\">Converse</a> or <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_ConverseStream.html\\\">ConverseStream</a> API operations. </p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailConverseContentQualifier\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"GROUNDING_SOURCE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"grounding_source\"\n                    }\n                },\n                \"QUERY\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"query\"\n                    }\n                },\n                \"GUARD_CONTENT\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"guard_content\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailConverseContentQualifierList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.bedrockruntime#GuardrailConverseContentQualifier\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailConverseImageBlock\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"format\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailConverseImageFormat\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The format details for the image type of the guardrail converse image block.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"source\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailConverseImageSource\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The image source (image bytes) of the guardrail converse image block.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>An image block that contains images that you want to assess with a guardrail.</p>\",\n                \"smithy.api#sensitive\": {}\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailConverseImageFormat\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"PNG\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"png\"\n                    }\n                },\n                \"JPEG\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"jpeg\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailConverseImageSource\": {\n            \"type\": \"union\",\n            \"members\": {\n                \"bytes\": {\n                    \"target\": \"smithy.api#Blob\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The raw image bytes for the image.</p>\",\n                        \"smithy.api#length\": {\n                            \"min\": 1\n                        }\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The image source (image bytes) of the guardrail converse image source.</p>\",\n                \"smithy.api#sensitive\": {}\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailConverseTextBlock\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"text\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The text that you want to guard.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"qualifiers\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailConverseContentQualifierList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The qualifier details for the guardrails contextual grounding filter.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A text block that contains text that you want to assess with a guardrail. For more information, see <a>GuardrailConverseContentBlock</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailCoverage\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"textCharacters\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailTextCharactersCoverage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The text characters of the guardrail coverage details.</p>\"\n                    }\n                },\n                \"images\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailImageCoverage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The guardrail coverage for images (the number of images that guardrails guarded).</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The action of the guardrail coverage details.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailCustomWord\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"match\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The match for the custom word.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"action\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailWordPolicyAction\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The action for the custom word.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"detected\": {\n                    \"target\": \"smithy.api#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether custom word content that breaches the guardrail configuration is detected.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A custom word configured in a guardrail.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailCustomWordList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.bedrockruntime#GuardrailCustomWord\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailIdentifier\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"max\": 2048\n                },\n                \"smithy.api#pattern\": \"^(([a-z0-9]+)|(arn:aws(-[^:]+)?:bedrock:[a-z0-9-]{1,20}:[0-9]{12}:guardrail/[a-z0-9]+))$\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailImageBlock\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"format\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailImageFormat\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The format details for the file type of the image blocked by the guardrail.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"source\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailImageSource\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The image source (image bytes) details of the image blocked by the guardrail.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contain an image which user wants guarded. This block is accepted by the guardrails independent API.</p>\",\n                \"smithy.api#sensitive\": {}\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailImageCoverage\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"guarded\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#ImagesGuarded\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The count (integer) of images guardrails guarded.</p>\"\n                    }\n                },\n                \"total\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#ImagesTotal\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Represents the total number of images (integer) that were in the request (guarded and unguarded).</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The details of the guardrail image coverage.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailImageFormat\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"PNG\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"png\"\n                    }\n                },\n                \"JPEG\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"jpeg\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailImageSource\": {\n            \"type\": \"union\",\n            \"members\": {\n                \"bytes\": {\n                    \"target\": \"smithy.api#Blob\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The bytes details of the guardrail image source. Object used in independent api.</p>\",\n                        \"smithy.api#length\": {\n                            \"min\": 1\n                        }\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The image source (image bytes) of the guardrail image source. Object used in independent api.</p>\",\n                \"smithy.api#sensitive\": {}\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailInvocationMetrics\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"guardrailProcessingLatency\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailProcessingLatency\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The processing latency details for the guardrail invocation metrics.</p>\"\n                    }\n                },\n                \"usage\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailUsage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The usage details for the guardrail invocation metrics.</p>\"\n                    }\n                },\n                \"guardrailCoverage\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailCoverage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The coverage details for the guardrail invocation metrics.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The invocation metrics for the guardrail.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailManagedWord\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"match\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The match for the managed word.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"type\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailManagedWordType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type for the managed word.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"action\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailWordPolicyAction\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The action for the managed word.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"detected\": {\n                    \"target\": \"smithy.api#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether managed word content that breaches the guardrail configuration is detected.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A managed word configured in a guardrail.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailManagedWordList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.bedrockruntime#GuardrailManagedWord\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailManagedWordType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"PROFANITY\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"PROFANITY\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailOutputContent\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"text\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailOutputText\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The specific text for the output content produced by the guardrail.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The output content produced by the guardrail.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailOutputContentList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.bedrockruntime#GuardrailOutputContent\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailOutputScope\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"INTERVENTIONS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"INTERVENTIONS\"\n                    }\n                },\n                \"FULL\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"FULL\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailOutputText\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailPiiEntityFilter\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"match\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The PII entity filter match.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"type\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailPiiEntityType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The PII entity filter type.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"action\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailSensitiveInformationPolicyAction\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The PII entity filter action.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"detected\": {\n                    \"target\": \"smithy.api#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether personally identifiable information (PII) that breaches the guardrail configuration is detected.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A Personally Identifiable Information (PII) entity configured in a guardrail.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailPiiEntityFilterList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.bedrockruntime#GuardrailPiiEntityFilter\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailPiiEntityType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ADDRESS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ADDRESS\"\n                    }\n                },\n                \"AGE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AGE\"\n                    }\n                },\n                \"AWS_ACCESS_KEY\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS_ACCESS_KEY\"\n                    }\n                },\n                \"AWS_SECRET_KEY\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS_SECRET_KEY\"\n                    }\n                },\n                \"CA_HEALTH_NUMBER\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"CA_HEALTH_NUMBER\"\n                    }\n                },\n                \"CA_SOCIAL_INSURANCE_NUMBER\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"CA_SOCIAL_INSURANCE_NUMBER\"\n                    }\n                },\n                \"CREDIT_DEBIT_CARD_CVV\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"CREDIT_DEBIT_CARD_CVV\"\n                    }\n                },\n                \"CREDIT_DEBIT_CARD_EXPIRY\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"CREDIT_DEBIT_CARD_EXPIRY\"\n                    }\n                },\n                \"CREDIT_DEBIT_CARD_NUMBER\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"CREDIT_DEBIT_CARD_NUMBER\"\n                    }\n                },\n                \"DRIVER_ID\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DRIVER_ID\"\n                    }\n                },\n                \"EMAIL\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"EMAIL\"\n                    }\n                },\n                \"INTERNATIONAL_BANK_ACCOUNT_NUMBER\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"INTERNATIONAL_BANK_ACCOUNT_NUMBER\"\n                    }\n                },\n                \"IP_ADDRESS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"IP_ADDRESS\"\n                    }\n                },\n                \"LICENSE_PLATE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"LICENSE_PLATE\"\n                    }\n                },\n                \"MAC_ADDRESS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"MAC_ADDRESS\"\n                    }\n                },\n                \"NAME\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"NAME\"\n                    }\n                },\n                \"PASSWORD\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"PASSWORD\"\n                    }\n                },\n                \"PHONE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"PHONE\"\n                    }\n                },\n                \"PIN\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"PIN\"\n                    }\n                },\n                \"SWIFT_CODE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"SWIFT_CODE\"\n                    }\n                },\n                \"UK_NATIONAL_HEALTH_SERVICE_NUMBER\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"UK_NATIONAL_HEALTH_SERVICE_NUMBER\"\n                    }\n                },\n                \"UK_NATIONAL_INSURANCE_NUMBER\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"UK_NATIONAL_INSURANCE_NUMBER\"\n                    }\n                },\n                \"UK_UNIQUE_TAXPAYER_REFERENCE_NUMBER\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"UK_UNIQUE_TAXPAYER_REFERENCE_NUMBER\"\n                    }\n                },\n                \"URL\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"URL\"\n                    }\n                },\n                \"USERNAME\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"USERNAME\"\n                    }\n                },\n                \"US_BANK_ACCOUNT_NUMBER\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"US_BANK_ACCOUNT_NUMBER\"\n                    }\n                },\n                \"US_BANK_ROUTING_NUMBER\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"US_BANK_ROUTING_NUMBER\"\n                    }\n                },\n                \"US_INDIVIDUAL_TAX_IDENTIFICATION_NUMBER\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"US_INDIVIDUAL_TAX_IDENTIFICATION_NUMBER\"\n                    }\n                },\n                \"US_PASSPORT_NUMBER\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"US_PASSPORT_NUMBER\"\n                    }\n                },\n                \"US_SOCIAL_SECURITY_NUMBER\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"US_SOCIAL_SECURITY_NUMBER\"\n                    }\n                },\n                \"VEHICLE_IDENTIFICATION_NUMBER\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"VEHICLE_IDENTIFICATION_NUMBER\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailProcessingLatency\": {\n            \"type\": \"long\"\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailRegexFilter\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"name\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The regex filter name.</p>\"\n                    }\n                },\n                \"match\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The regesx filter match.</p>\"\n                    }\n                },\n                \"regex\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The regex query.</p>\"\n                    }\n                },\n                \"action\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailSensitiveInformationPolicyAction\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The region filter action.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"detected\": {\n                    \"target\": \"smithy.api#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether custom regex entities that breach the guardrail configuration are detected.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A Regex filter configured in a guardrail.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailRegexFilterList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.bedrockruntime#GuardrailRegexFilter\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailResource\": {\n            \"type\": \"resource\",\n            \"operations\": [\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#ApplyGuardrail\"\n                }\n            ]\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailSensitiveInformationPolicyAction\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ANONYMIZED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ANONYMIZED\"\n                    }\n                },\n                \"BLOCKED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"BLOCKED\"\n                    }\n                },\n                \"NONE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"NONE\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailSensitiveInformationPolicyAssessment\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"piiEntities\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailPiiEntityFilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The PII entities in the assessment.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"regexes\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailRegexFilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The regex queries in the assessment.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The assessment for aPersonally Identifiable Information (PII) policy. </p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailSensitiveInformationPolicyFreeUnitsProcessed\": {\n            \"type\": \"integer\"\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailSensitiveInformationPolicyUnitsProcessed\": {\n            \"type\": \"integer\"\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailStreamConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"guardrailIdentifier\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailIdentifier\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The identifier for the guardrail.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"guardrailVersion\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailVersion\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The version of the guardrail.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"trace\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailTrace\",\n                    \"traits\": {\n                        \"smithy.api#default\": \"disabled\",\n                        \"smithy.api#documentation\": \"<p>The trace behavior for the guardrail.</p>\"\n                    }\n                },\n                \"streamProcessingMode\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailStreamProcessingMode\",\n                    \"traits\": {\n                        \"smithy.api#default\": \"sync\",\n                        \"smithy.api#documentation\": \"<p>The processing mode. </p> <p>The processing mode. For more information, see <i>Configure streaming response behavior</i> in the <i>Amazon Bedrock User Guide</i>. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Configuration information for a guardrail that you use with the <a>ConverseStream</a> action. </p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailStreamProcessingMode\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"SYNC\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"sync\"\n                    }\n                },\n                \"ASYNC\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"async\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailTextBlock\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"text\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The input text details to be evaluated by the guardrail.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"qualifiers\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailContentQualifierList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The qualifiers describing the text block.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The text block to be evaluated by the guardrail.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailTextCharactersCoverage\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"guarded\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#TextCharactersGuarded\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The text characters that were guarded by the guardrail coverage.</p>\"\n                    }\n                },\n                \"total\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#TextCharactersTotal\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The total text characters by the guardrail coverage.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The guardrail coverage for the text characters.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailTopic\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"name\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name for the guardrail.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"type\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailTopicType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type behavior that the guardrail should perform when the model detects the topic.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"action\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailTopicPolicyAction\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The action the guardrail should take when it intervenes on a topic.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"detected\": {\n                    \"target\": \"smithy.api#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether topic content that breaches the guardrail configuration is detected.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about a topic guardrail.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailTopicList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.bedrockruntime#GuardrailTopic\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailTopicPolicyAction\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"BLOCKED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"BLOCKED\"\n                    }\n                },\n                \"NONE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"NONE\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailTopicPolicyAssessment\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"topics\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailTopicList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The topics in the assessment.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A behavior assessment of a topic policy.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailTopicPolicyUnitsProcessed\": {\n            \"type\": \"integer\"\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailTopicType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"DENY\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DENY\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailTrace\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ENABLED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"enabled\"\n                    }\n                },\n                \"DISABLED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"disabled\"\n                    }\n                },\n                \"ENABLED_FULL\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"enabled_full\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailTraceAssessment\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"modelOutput\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#ModelOutputs\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The output from the model.</p>\"\n                    }\n                },\n                \"inputAssessment\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailAssessmentMap\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The input assessment.</p>\"\n                    }\n                },\n                \"outputAssessments\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailAssessmentListMap\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>the output assessments.</p>\"\n                    }\n                },\n                \"actionReason\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Provides the reason for the action taken when harmful content is detected.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A Top level guardrail trace object. For more information, see <a>ConverseTrace</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailUsage\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"topicPolicyUnits\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailTopicPolicyUnitsProcessed\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The topic policy units processed by the guardrail.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"contentPolicyUnits\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailContentPolicyUnitsProcessed\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The content policy units processed by the guardrail.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"wordPolicyUnits\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailWordPolicyUnitsProcessed\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The word policy units processed by the guardrail.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"sensitiveInformationPolicyUnits\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailSensitiveInformationPolicyUnitsProcessed\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The sensitive information policy units processed by the guardrail.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"sensitiveInformationPolicyFreeUnits\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailSensitiveInformationPolicyFreeUnitsProcessed\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The sensitive information policy free units processed by the guardrail.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"contextualGroundingPolicyUnits\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailContextualGroundingPolicyUnitsProcessed\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The contextual grounding policy units processed by the guardrail.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"contentPolicyImageUnits\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailContentPolicyImageUnitsProcessed\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The content policy image units processed by the guardrail.</p>\"\n                    }\n                },\n                \"automatedReasoningPolicyUnits\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailAutomatedReasoningPolicyUnitsProcessed\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of text units processed by the automated reasoning policy.</p>\"\n                    }\n                },\n                \"automatedReasoningPolicies\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailAutomatedReasoningPoliciesProcessed\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of automated reasoning policies that were processed during the guardrail evaluation.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The details on the use of the guardrail.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailVersion\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#pattern\": \"^(([1-9][0-9]{0,7})|(DRAFT))$\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailWordPolicyAction\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"BLOCKED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"BLOCKED\"\n                    }\n                },\n                \"NONE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"NONE\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailWordPolicyAssessment\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"customWords\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailCustomWordList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Custom words in the assessment.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"managedWordLists\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailManagedWordList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Managed word lists in the assessment.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The word policy assessment.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#GuardrailWordPolicyUnitsProcessed\": {\n            \"type\": \"integer\"\n        },\n        \"com.amazonaws.bedrockruntime#ImageBlock\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"format\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#ImageFormat\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The format of the image.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"source\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#ImageSource\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The source for the image.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Image content for a message.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#ImageFormat\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"PNG\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"png\"\n                    }\n                },\n                \"JPEG\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"jpeg\"\n                    }\n                },\n                \"GIF\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"gif\"\n                    }\n                },\n                \"WEBP\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"webp\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.bedrockruntime#ImageSource\": {\n            \"type\": \"union\",\n            \"members\": {\n                \"bytes\": {\n                    \"target\": \"smithy.api#Blob\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The raw image bytes for the image. If you use an AWS SDK, you don't need to encode the image bytes in base64.</p>\",\n                        \"smithy.api#length\": {\n                            \"min\": 1\n                        }\n                    }\n                },\n                \"s3Location\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#S3Location\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The location of an image object in an Amazon S3 bucket. To see which models support S3 uploads, see <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/userguide/conversation-inference-supported-models-features.html\\\">Supported models and features for Converse</a>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The source for an image.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#ImagesGuarded\": {\n            \"type\": \"integer\"\n        },\n        \"com.amazonaws.bedrockruntime#ImagesTotal\": {\n            \"type\": \"integer\"\n        },\n        \"com.amazonaws.bedrockruntime#InferenceConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"maxTokens\": {\n                    \"target\": \"smithy.api#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of tokens to allow in the generated response. The default value is the maximum allowed value for the model that you are using. For more information, see <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/userguide/model-parameters.html\\\">Inference parameters for foundation models</a>. </p>\",\n                        \"smithy.api#range\": {\n                            \"min\": 1\n                        }\n                    }\n                },\n                \"temperature\": {\n                    \"target\": \"smithy.api#Float\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The likelihood of the model selecting higher-probability options while generating a response. A lower value makes the model more likely to choose higher-probability options, while a higher value makes the model more likely to choose lower-probability options.</p> <p>The default value is the default value for the model that you are using. For more information, see <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/userguide/model-parameters.html\\\">Inference parameters for foundation models</a>. </p>\",\n                        \"smithy.api#range\": {\n                            \"min\": 0,\n                            \"max\": 1\n                        }\n                    }\n                },\n                \"topP\": {\n                    \"target\": \"smithy.api#Float\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The percentage of most-likely candidates that the model considers for the next token. For example, if you choose a value of 0.8 for <code>topP</code>, the model selects from the top 80% of the probability distribution of tokens that could be next in the sequence.</p> <p>The default value is the default value for the model that you are using. For more information, see <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/userguide/model-parameters.html\\\">Inference parameters for foundation models</a>. </p>\",\n                        \"smithy.api#range\": {\n                            \"min\": 0,\n                            \"max\": 1\n                        }\n                    }\n                },\n                \"stopSequences\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#NonEmptyStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of stop sequences. A stop sequence is a sequence of characters that causes the model to stop generating the response. </p>\",\n                        \"smithy.api#length\": {\n                            \"max\": 2500\n                        }\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Base inference parameters to pass to a model in a call to <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_Converse.html\\\">Converse</a> or <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_ConverseStream.html\\\">ConverseStream</a>. For more information, see <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/userguide/model-parameters.html\\\">Inference parameters for foundation models</a>.</p> <p>If you need to pass additional parameters that the model supports, use the <code>additionalModelRequestFields</code> request field in the call to <code>Converse</code> or <code>ConverseStream</code>. For more information, see <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/userguide/model-parameters.html\\\">Model parameters</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#InferenceResource\": {\n            \"type\": \"resource\",\n            \"operations\": [\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#Converse\"\n                },\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#ConverseStream\"\n                },\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#InvokeModel\"\n                },\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#InvokeModelWithBidirectionalStream\"\n                },\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#InvokeModelWithResponseStream\"\n                }\n            ]\n        },\n        \"com.amazonaws.bedrockruntime#InternalServerException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#NonBlankString\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>An internal server error occurred. For troubleshooting this error, see <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/userguide/troubleshooting-api-error-codes.html#ts-internal-failure\\\">InternalFailure</a> in the Amazon Bedrock User Guide</p>\",\n                \"smithy.api#error\": \"server\",\n                \"smithy.api#httpError\": 500\n            }\n        },\n        \"com.amazonaws.bedrockruntime#InvocationArn\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 2048\n                },\n                \"smithy.api#pattern\": \"^arn:aws(-[^:]+)?:bedrock:[a-z0-9-]{1,20}:[0-9]{12}:async-invoke/[a-z0-9]{12}$\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#InvokeModel\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.bedrockruntime#InvokeModelRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.bedrockruntime#InvokeModelResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#AccessDeniedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#InternalServerException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#ModelErrorException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#ModelNotReadyException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#ModelTimeoutException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#ServiceQuotaExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#ServiceUnavailableException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#ThrottlingException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Invokes the specified Amazon Bedrock model to run inference using the prompt and inference parameters provided in the request body. You use model inference to generate text, images, and embeddings.</p> <p>For example code, see <i>Invoke model code examples</i> in the <i>Amazon Bedrock User Guide</i>. </p> <p>This operation requires permission for the <code>bedrock:InvokeModel</code> action.</p> <important> <p>To deny all inference access to resources that you specify in the modelId field, you need to deny access to the <code>bedrock:InvokeModel</code> and <code>bedrock:InvokeModelWithResponseStream</code> actions. Doing this also denies access to the resource through the Converse API actions (<a href=\\\"https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_Converse.html\\\">Converse</a> and <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_ConverseStream.html\\\">ConverseStream</a>). For more information see <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/userguide/security_iam_id-based-policy-examples.html#security_iam_id-based-policy-examples-deny-inference\\\">Deny access for inference on specific models</a>. </p> </important> <p>For troubleshooting some of the common errors you might encounter when using the <code>InvokeModel</code> API, see <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/userguide/troubleshooting-api-error-codes.html\\\">Troubleshooting Amazon Bedrock API Error Codes</a> in the Amazon Bedrock User Guide</p>\",\n                \"smithy.api#http\": {\n                    \"code\": 200,\n                    \"method\": \"POST\",\n                    \"uri\": \"/model/{modelId}/invoke\"\n                }\n            }\n        },\n        \"com.amazonaws.bedrockruntime#InvokeModelIdentifier\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 2048\n                },\n                \"smithy.api#pattern\": \"^(arn:aws(-[^:]+)?:bedrock:[a-z0-9-]{1,20}:(([0-9]{12}:custom-model/[a-z0-9-]{1,63}[.]{1}[a-z0-9-]{1,63}/[a-z0-9]{12})|(:foundation-model/[a-z0-9-]{1,63}[.]{1}[a-z0-9-]{1,63}([.:]?[a-z0-9-]{1,63}))|([0-9]{12}:imported-model/[a-z0-9]{12})|([0-9]{12}:provisioned-model/[a-z0-9]{12})|([0-9]{12}:custom-model-deployment/[a-z0-9]{12})|([0-9]{12}:(inference-profile|application-inference-profile)/[a-zA-Z0-9-:.]+)))|([a-z0-9-]{1,63}[.]{1}[a-z0-9-]{1,63}([.:]?[a-z0-9-]{1,63}))|(([0-9a-zA-Z][_-]?)+)|([a-zA-Z0-9-:.]+)$|(^(arn:aws(-[^:]+)?:bedrock:[a-z0-9-]{1,20}:[0-9]{12}:prompt/[0-9a-zA-Z]{10}(?::[0-9]{1,5})?))$|(^arn:aws:sagemaker:[a-z0-9-]+:[0-9]{12}:endpoint/[a-zA-Z0-9-]+$)|(^arn:aws(-[^:]+)?:bedrock:([0-9a-z-]{1,20}):([0-9]{12}):(default-)?prompt-router/[a-zA-Z0-9-:.]+$)$\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#InvokeModelRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"body\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#Body\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The prompt and inference parameters in the format specified in the <code>contentType</code> in the header. You must provide the body in JSON format. To see the format and content of the request and response bodies for different models, refer to <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/userguide/model-parameters.html\\\">Inference parameters</a>. For more information, see <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/userguide/api-methods-run.html\\\">Run inference</a> in the Bedrock User Guide.</p>\",\n                        \"smithy.api#httpPayload\": {}\n                    }\n                },\n                \"contentType\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#MimeType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The MIME type of the input data in the request. You must specify <code>application/json</code>.</p>\",\n                        \"smithy.api#httpHeader\": \"Content-Type\"\n                    }\n                },\n                \"accept\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#MimeType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The desired MIME type of the inference body in the response. The default value is <code>application/json</code>.</p>\",\n                        \"smithy.api#httpHeader\": \"Accept\"\n                    }\n                },\n                \"modelId\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#InvokeModelIdentifier\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The unique identifier of the model to invoke to run inference.</p> <p>The <code>modelId</code> to provide depends on the type of model or throughput that you use:</p> <ul> <li> <p>If you use a base model, specify the model ID or its ARN. For a list of model IDs for base models, see <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/userguide/model-ids.html#model-ids-arns\\\">Amazon Bedrock base model IDs (on-demand throughput)</a> in the Amazon Bedrock User Guide.</p> </li> <li> <p>If you use an inference profile, specify the inference profile ID or its ARN. For a list of inference profile IDs, see <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/userguide/cross-region-inference-support.html\\\">Supported Regions and models for cross-region inference</a> in the Amazon Bedrock User Guide.</p> </li> <li> <p>If you use a provisioned model, specify the ARN of the Provisioned Throughput. For more information, see <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/userguide/prov-thru-use.html\\\">Run inference using a Provisioned Throughput</a> in the Amazon Bedrock User Guide.</p> </li> <li> <p>If you use a custom model, specify the ARN of the custom model deployment (for on-demand inference) or the ARN of your provisioned model (for Provisioned Throughput). For more information, see <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/userguide/model-customization-use.html\\\">Use a custom model in Amazon Bedrock</a> in the Amazon Bedrock User Guide.</p> </li> <li> <p>If you use an <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/userguide/model-customization-import-model.html\\\">imported model</a>, specify the ARN of the imported model. You can get the model ARN from a successful call to <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/APIReference/API_CreateModelImportJob.html\\\">CreateModelImportJob</a> or from the Imported models page in the Amazon Bedrock console.</p> </li> </ul>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"trace\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#Trace\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies whether to enable or disable the Bedrock trace. If enabled, you can see the full Bedrock trace.</p>\",\n                        \"smithy.api#httpHeader\": \"X-Amzn-Bedrock-Trace\"\n                    }\n                },\n                \"guardrailIdentifier\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailIdentifier\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The unique identifier of the guardrail that you want to use. If you don't provide a value, no guardrail is applied to the invocation.</p> <p>An error will be thrown in the following situations.</p> <ul> <li> <p>You don't provide a guardrail identifier but you specify the <code>amazon-bedrock-guardrailConfig</code> field in the request body.</p> </li> <li> <p>You enable the guardrail but the <code>contentType</code> isn't <code>application/json</code>.</p> </li> <li> <p>You provide a guardrail identifier, but <code>guardrailVersion</code> isn't specified.</p> </li> </ul>\",\n                        \"smithy.api#httpHeader\": \"X-Amzn-Bedrock-GuardrailIdentifier\"\n                    }\n                },\n                \"guardrailVersion\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailVersion\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The version number for the guardrail. The value can also be <code>DRAFT</code>.</p>\",\n                        \"smithy.api#httpHeader\": \"X-Amzn-Bedrock-GuardrailVersion\"\n                    }\n                },\n                \"performanceConfigLatency\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#PerformanceConfigLatency\",\n                    \"traits\": {\n                        \"smithy.api#default\": \"standard\",\n                        \"smithy.api#documentation\": \"<p>Model performance settings for the request.</p>\",\n                        \"smithy.api#httpHeader\": \"X-Amzn-Bedrock-PerformanceConfig-Latency\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.bedrockruntime#InvokeModelResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"body\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#Body\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Inference response from the model in the format specified in the <code>contentType</code> header. To see the format and content of the request and response bodies for different models, refer to <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/userguide/model-parameters.html\\\">Inference parameters</a>.</p>\",\n                        \"smithy.api#httpPayload\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"contentType\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#MimeType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The MIME type of the inference result.</p>\",\n                        \"smithy.api#httpHeader\": \"Content-Type\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"performanceConfigLatency\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#PerformanceConfigLatency\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Model performance settings for the request.</p>\",\n                        \"smithy.api#httpHeader\": \"X-Amzn-Bedrock-PerformanceConfig-Latency\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.bedrockruntime#InvokeModelTokensRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"body\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#Body\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The request body to count tokens for, formatted according to the model's expected input format. To learn about the input format for different models, see <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/userguide/model-parameters.html\\\">Model inference parameters and responses</a>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The body of an <code>InvokeModel</code> API request for token counting. This structure mirrors the input format for the <code>InvokeModel</code> operation, allowing you to count tokens for raw text inference requests.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#InvokeModelWithBidirectionalStream\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.bedrockruntime#InvokeModelWithBidirectionalStreamRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.bedrockruntime#InvokeModelWithBidirectionalStreamResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#AccessDeniedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#InternalServerException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#ModelErrorException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#ModelNotReadyException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#ModelStreamErrorException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#ModelTimeoutException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#ServiceQuotaExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#ServiceUnavailableException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#ThrottlingException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Invoke the specified Amazon Bedrock model to run inference using the bidirectional stream. The response is returned in a stream that remains open for 8 minutes. A single session can contain multiple prompts and responses from the model. The prompts to the model are provided as audio files and the model's responses are spoken back to the user and transcribed.</p> <p>It is possible for users to interrupt the model's response with a new prompt, which will halt the response speech. The model will retain contextual awareness of the conversation while pivoting to respond to the new prompt.</p>\",\n                \"smithy.api#http\": {\n                    \"code\": 200,\n                    \"method\": \"POST\",\n                    \"uri\": \"/model/{modelId}/invoke-with-bidirectional-stream\"\n                }\n            }\n        },\n        \"com.amazonaws.bedrockruntime#InvokeModelWithBidirectionalStreamInput\": {\n            \"type\": \"union\",\n            \"members\": {\n                \"chunk\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#BidirectionalInputPayloadPart\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The audio chunk that is used as input for the invocation step.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Payload content, the speech chunk, for the bidirectional input of the invocation step.</p>\",\n                \"smithy.api#streaming\": {}\n            }\n        },\n        \"com.amazonaws.bedrockruntime#InvokeModelWithBidirectionalStreamOutput\": {\n            \"type\": \"union\",\n            \"members\": {\n                \"chunk\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#BidirectionalOutputPayloadPart\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The speech chunk that was provided as output from the invocation step.</p>\"\n                    }\n                },\n                \"internalServerException\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#InternalServerException\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The request encountered an unknown internal error.</p>\"\n                    }\n                },\n                \"modelStreamErrorException\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#ModelStreamErrorException\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The request encountered an error with the model stream.</p>\"\n                    }\n                },\n                \"validationException\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#ValidationException\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The input fails to satisfy the constraints specified by an Amazon Web Services service.</p>\"\n                    }\n                },\n                \"throttlingException\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#ThrottlingException\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The request was denied due to request throttling.</p>\"\n                    }\n                },\n                \"modelTimeoutException\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#ModelTimeoutException\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The connection was closed because a request was not received within the timeout period.</p>\"\n                    }\n                },\n                \"serviceUnavailableException\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#ServiceUnavailableException\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The request has failed due to a temporary failure of the server.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Output from the bidirectional stream that was used for model invocation.</p>\",\n                \"smithy.api#streaming\": {}\n            }\n        },\n        \"com.amazonaws.bedrockruntime#InvokeModelWithBidirectionalStreamRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"modelId\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#InvokeModelIdentifier\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The model ID or ARN of the model ID to use. Currently, only <code>amazon.nova-sonic-v1:0</code> is supported.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"body\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#InvokeModelWithBidirectionalStreamInput\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The prompt and inference parameters in the format specified in the <code>BidirectionalInputPayloadPart</code> in the header. You must provide the body in JSON format. To see the format and content of the request and response bodies for different models, refer to <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/userguide/model-parameters.html\\\">Inference parameters</a>. For more information, see <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/userguide/api-methods-run.html\\\">Run inference</a> in the Bedrock User Guide.</p>\",\n                        \"smithy.api#httpPayload\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.bedrockruntime#InvokeModelWithBidirectionalStreamResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"body\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#InvokeModelWithBidirectionalStreamOutput\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Streaming response from the model in the format specified by the <code>BidirectionalOutputPayloadPart</code> header.</p>\",\n                        \"smithy.api#httpPayload\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.bedrockruntime#InvokeModelWithResponseStream\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.bedrockruntime#InvokeModelWithResponseStreamRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.bedrockruntime#InvokeModelWithResponseStreamResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#AccessDeniedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#InternalServerException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#ModelErrorException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#ModelNotReadyException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#ModelStreamErrorException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#ModelTimeoutException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#ServiceQuotaExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#ServiceUnavailableException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#ThrottlingException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Invoke the specified Amazon Bedrock model to run inference using the prompt and inference parameters provided in the request body. The response is returned in a stream.</p> <p>To see if a model supports streaming, call <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/APIReference/API_GetFoundationModel.html\\\">GetFoundationModel</a> and check the <code>responseStreamingSupported</code> field in the response.</p> <note> <p>The CLI doesn't support streaming operations in Amazon Bedrock, including <code>InvokeModelWithResponseStream</code>.</p> </note> <p>For example code, see <i>Invoke model with streaming code example</i> in the <i>Amazon Bedrock User Guide</i>. </p> <p>This operation requires permissions to perform the <code>bedrock:InvokeModelWithResponseStream</code> action. </p> <important> <p>To deny all inference access to resources that you specify in the modelId field, you need to deny access to the <code>bedrock:InvokeModel</code> and <code>bedrock:InvokeModelWithResponseStream</code> actions. Doing this also denies access to the resource through the Converse API actions (<a href=\\\"https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_Converse.html\\\">Converse</a> and <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_ConverseStream.html\\\">ConverseStream</a>). For more information see <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/userguide/security_iam_id-based-policy-examples.html#security_iam_id-based-policy-examples-deny-inference\\\">Deny access for inference on specific models</a>. </p> </important> <p>For troubleshooting some of the common errors you might encounter when using the <code>InvokeModelWithResponseStream</code> API, see <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/userguide/troubleshooting-api-error-codes.html\\\">Troubleshooting Amazon Bedrock API Error Codes</a> in the Amazon Bedrock User Guide</p>\",\n                \"smithy.api#http\": {\n                    \"code\": 200,\n                    \"method\": \"POST\",\n                    \"uri\": \"/model/{modelId}/invoke-with-response-stream\"\n                }\n            }\n        },\n        \"com.amazonaws.bedrockruntime#InvokeModelWithResponseStreamRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"body\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#Body\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The prompt and inference parameters in the format specified in the <code>contentType</code> in the header. You must provide the body in JSON format. To see the format and content of the request and response bodies for different models, refer to <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/userguide/model-parameters.html\\\">Inference parameters</a>. For more information, see <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/userguide/api-methods-run.html\\\">Run inference</a> in the Bedrock User Guide.</p>\",\n                        \"smithy.api#httpPayload\": {}\n                    }\n                },\n                \"contentType\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#MimeType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The MIME type of the input data in the request. You must specify <code>application/json</code>.</p>\",\n                        \"smithy.api#httpHeader\": \"Content-Type\"\n                    }\n                },\n                \"accept\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#MimeType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The desired MIME type of the inference body in the response. The default value is <code>application/json</code>.</p>\",\n                        \"smithy.api#httpHeader\": \"X-Amzn-Bedrock-Accept\"\n                    }\n                },\n                \"modelId\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#InvokeModelIdentifier\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The unique identifier of the model to invoke to run inference.</p> <p>The <code>modelId</code> to provide depends on the type of model or throughput that you use:</p> <ul> <li> <p>If you use a base model, specify the model ID or its ARN. For a list of model IDs for base models, see <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/userguide/model-ids.html#model-ids-arns\\\">Amazon Bedrock base model IDs (on-demand throughput)</a> in the Amazon Bedrock User Guide.</p> </li> <li> <p>If you use an inference profile, specify the inference profile ID or its ARN. For a list of inference profile IDs, see <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/userguide/cross-region-inference-support.html\\\">Supported Regions and models for cross-region inference</a> in the Amazon Bedrock User Guide.</p> </li> <li> <p>If you use a provisioned model, specify the ARN of the Provisioned Throughput. For more information, see <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/userguide/prov-thru-use.html\\\">Run inference using a Provisioned Throughput</a> in the Amazon Bedrock User Guide.</p> </li> <li> <p>If you use a custom model, specify the ARN of the custom model deployment (for on-demand inference) or the ARN of your provisioned model (for Provisioned Throughput). For more information, see <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/userguide/model-customization-use.html\\\">Use a custom model in Amazon Bedrock</a> in the Amazon Bedrock User Guide.</p> </li> <li> <p>If you use an <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/userguide/model-customization-import-model.html\\\">imported model</a>, specify the ARN of the imported model. You can get the model ARN from a successful call to <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/APIReference/API_CreateModelImportJob.html\\\">CreateModelImportJob</a> or from the Imported models page in the Amazon Bedrock console.</p> </li> </ul>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"trace\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#Trace\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies whether to enable or disable the Bedrock trace. If enabled, you can see the full Bedrock trace.</p>\",\n                        \"smithy.api#httpHeader\": \"X-Amzn-Bedrock-Trace\"\n                    }\n                },\n                \"guardrailIdentifier\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailIdentifier\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The unique identifier of the guardrail that you want to use. If you don't provide a value, no guardrail is applied to the invocation.</p> <p>An error is thrown in the following situations.</p> <ul> <li> <p>You don't provide a guardrail identifier but you specify the <code>amazon-bedrock-guardrailConfig</code> field in the request body.</p> </li> <li> <p>You enable the guardrail but the <code>contentType</code> isn't <code>application/json</code>.</p> </li> <li> <p>You provide a guardrail identifier, but <code>guardrailVersion</code> isn't specified.</p> </li> </ul>\",\n                        \"smithy.api#httpHeader\": \"X-Amzn-Bedrock-GuardrailIdentifier\"\n                    }\n                },\n                \"guardrailVersion\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailVersion\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The version number for the guardrail. The value can also be <code>DRAFT</code>.</p>\",\n                        \"smithy.api#httpHeader\": \"X-Amzn-Bedrock-GuardrailVersion\"\n                    }\n                },\n                \"performanceConfigLatency\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#PerformanceConfigLatency\",\n                    \"traits\": {\n                        \"smithy.api#default\": \"standard\",\n                        \"smithy.api#documentation\": \"<p>Model performance settings for the request.</p>\",\n                        \"smithy.api#httpHeader\": \"X-Amzn-Bedrock-PerformanceConfig-Latency\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.bedrockruntime#InvokeModelWithResponseStreamResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"body\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#ResponseStream\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Inference response from the model in the format specified by the <code>contentType</code> header. To see the format and content of this field for different models, refer to <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/userguide/model-parameters.html\\\">Inference parameters</a>.</p>\",\n                        \"smithy.api#httpPayload\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"contentType\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#MimeType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The MIME type of the inference result.</p>\",\n                        \"smithy.api#httpHeader\": \"X-Amzn-Bedrock-Content-Type\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"performanceConfigLatency\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#PerformanceConfigLatency\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Model performance settings for the request.</p>\",\n                        \"smithy.api#httpHeader\": \"X-Amzn-Bedrock-PerformanceConfig-Latency\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.bedrockruntime#InvokedModelId\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#pattern\": \"^(arn:aws(-[^:]+)?:bedrock:[a-z0-9-]{1,20}::foundation-model/[a-z0-9-]{1,63}[.]{1}[a-z0-9-]{1,63}([a-z0-9-]{1,63}[.]){0,2}[a-z0-9-]{1,63}([:][a-z0-9-]{1,63}){0,2})|(arn:aws(|-us-gov|-cn|-iso|-iso-b):bedrock:(|[0-9a-z-]{1,20}):(|[0-9]{12}):inference-profile/[a-zA-Z0-9-:.]+)$\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#KmsKeyId\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 2048\n                },\n                \"smithy.api#pattern\": \"^arn:aws(-[^:]+)?:kms:[a-zA-Z0-9-]*:[0-9]{12}:((key/[a-zA-Z0-9-]{36})|(alias/[a-zA-Z0-9-_/]+))$\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#ListAsyncInvokes\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.bedrockruntime#ListAsyncInvokesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.bedrockruntime#ListAsyncInvokesResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#AccessDeniedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#InternalServerException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#ThrottlingException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Lists asynchronous invocations.</p>\",\n                \"smithy.api#http\": {\n                    \"code\": 200,\n                    \"method\": \"GET\",\n                    \"uri\": \"/async-invoke\"\n                },\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"nextToken\",\n                    \"outputToken\": \"nextToken\",\n                    \"pageSize\": \"maxResults\",\n                    \"items\": \"asyncInvokeSummaries\"\n                },\n                \"smithy.api#readonly\": {}\n            }\n        },\n        \"com.amazonaws.bedrockruntime#ListAsyncInvokesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"submitTimeAfter\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Include invocations submitted after this time.</p>\",\n                        \"smithy.api#httpQuery\": \"submitTimeAfter\"\n                    }\n                },\n                \"submitTimeBefore\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Include invocations submitted before this time.</p>\",\n                        \"smithy.api#httpQuery\": \"submitTimeBefore\"\n                    }\n                },\n                \"statusEquals\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#AsyncInvokeStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Filter invocations by status.</p>\",\n                        \"smithy.api#httpQuery\": \"statusEquals\"\n                    }\n                },\n                \"maxResults\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#MaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of invocations to return in one page of results.</p>\",\n                        \"smithy.api#httpQuery\": \"maxResults\"\n                    }\n                },\n                \"nextToken\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#PaginationToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify the pagination token from a previous request to retrieve the next page of results.</p>\",\n                        \"smithy.api#httpQuery\": \"nextToken\"\n                    }\n                },\n                \"sortBy\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#SortAsyncInvocationBy\",\n                    \"traits\": {\n                        \"smithy.api#default\": \"SubmissionTime\",\n                        \"smithy.api#documentation\": \"<p>How to sort the response.</p>\",\n                        \"smithy.api#httpQuery\": \"sortBy\"\n                    }\n                },\n                \"sortOrder\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#SortOrder\",\n                    \"traits\": {\n                        \"smithy.api#default\": \"Descending\",\n                        \"smithy.api#documentation\": \"<p>The sorting order for the response.</p>\",\n                        \"smithy.api#httpQuery\": \"sortOrder\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.bedrockruntime#ListAsyncInvokesResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"nextToken\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#PaginationToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify the pagination token from a previous request to retrieve the next page of results.</p>\"\n                    }\n                },\n                \"asyncInvokeSummaries\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#AsyncInvokeSummaries\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of invocation summaries.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.bedrockruntime#MaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.bedrockruntime#Message\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"role\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#ConversationRole\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The role that the message plays in the message.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"content\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#ContentBlocks\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The message content. Note the following restrictions:</p> <ul> <li> <p>You can include up to 20 images. Each image's size, height, and width must be no more than 3.75 MB, 8000 px, and 8000 px, respectively.</p> </li> <li> <p>You can include up to five documents. Each document's size must be no more than 4.5 MB.</p> </li> <li> <p>If you include a <code>ContentBlock</code> with a <code>document</code> field in the array, you must also include a <code>ContentBlock</code> with a <code>text</code> field.</p> </li> <li> <p>You can only include images and documents if the <code>role</code> is <code>user</code>.</p> </li> </ul>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A message input, or returned from, a call to <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_Converse.html\\\">Converse</a> or <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_ConverseStream.html\\\">ConverseStream</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#MessageStartEvent\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"role\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#ConversationRole\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The role for the message.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The start of a message.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#MessageStopEvent\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"stopReason\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#StopReason\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The reason why the model stopped generating output.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"additionalModelResponseFields\": {\n                    \"target\": \"smithy.api#Document\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The additional model response fields.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The stop event for a message.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#Messages\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.bedrockruntime#Message\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#MimeType\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.bedrockruntime#ModelErrorException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#NonBlankString\"\n                },\n                \"originalStatusCode\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#StatusCode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The original status code.</p>\"\n                    }\n                },\n                \"resourceName\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#NonBlankString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The resource name.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The request failed due to an error while processing the model.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 424\n            }\n        },\n        \"com.amazonaws.bedrockruntime#ModelInputPayload\": {\n            \"type\": \"document\",\n            \"traits\": {\n                \"smithy.api#sensitive\": {}\n            }\n        },\n        \"com.amazonaws.bedrockruntime#ModelNotReadyException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#NonBlankString\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The model specified in the request is not ready to serve inference requests. The AWS SDK will automatically retry the operation up to 5 times. For information about configuring automatic retries, see <a href=\\\"https://docs.aws.amazon.com/sdkref/latest/guide/feature-retry-behavior.html\\\">Retry behavior</a> in the <i>AWS SDKs and Tools</i> reference guide.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 429,\n                \"smithy.api#retryable\": {}\n            }\n        },\n        \"com.amazonaws.bedrockruntime#ModelOutputs\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.bedrockruntime#GuardrailOutputText\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#ModelStreamErrorException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#NonBlankString\"\n                },\n                \"originalStatusCode\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#StatusCode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The original status code.</p>\"\n                    }\n                },\n                \"originalMessage\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#NonBlankString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The original message.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>An error occurred while streaming the response. Retry your request.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 424\n            }\n        },\n        \"com.amazonaws.bedrockruntime#ModelTimeoutException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#NonBlankString\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The request took too long to process. Processing time exceeded the model timeout length.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 408\n            }\n        },\n        \"com.amazonaws.bedrockruntime#NonBlankString\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#pattern\": \"^[\\\\s\\\\S]*$\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#NonEmptyString\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1\n                }\n            }\n        },\n        \"com.amazonaws.bedrockruntime#NonEmptyStringList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.bedrockruntime#NonEmptyString\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#NonNegativeInteger\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 0\n                }\n            }\n        },\n        \"com.amazonaws.bedrockruntime#PaginationToken\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 2048\n                },\n                \"smithy.api#pattern\": \"^\\\\S*$\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#PartBody\": {\n            \"type\": \"blob\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"max\": 1000000\n                },\n                \"smithy.api#sensitive\": {}\n            }\n        },\n        \"com.amazonaws.bedrockruntime#PayloadPart\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"bytes\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#PartBody\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Base64-encoded bytes of payload data.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Payload content included in the response.</p>\",\n                \"smithy.api#sensitive\": {}\n            }\n        },\n        \"com.amazonaws.bedrockruntime#PerformanceConfigLatency\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"STANDARD\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"standard\"\n                    }\n                },\n                \"OPTIMIZED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"optimized\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.bedrockruntime#PerformanceConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"latency\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#PerformanceConfigLatency\",\n                    \"traits\": {\n                        \"smithy.api#default\": \"standard\",\n                        \"smithy.api#documentation\": \"<p>To use a latency-optimized version of the model, set to <code>optimized</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Performance settings for a model.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#PromptRouterTrace\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"invokedModelId\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#InvokedModelId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the invoked model.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A prompt router trace.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#PromptVariableMap\": {\n            \"type\": \"map\",\n            \"key\": {\n                \"target\": \"smithy.api#String\"\n            },\n            \"value\": {\n                \"target\": \"com.amazonaws.bedrockruntime#PromptVariableValues\"\n            },\n            \"traits\": {\n                \"smithy.api#sensitive\": {}\n            }\n        },\n        \"com.amazonaws.bedrockruntime#PromptVariableValues\": {\n            \"type\": \"union\",\n            \"members\": {\n                \"text\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The text value that the variable maps to.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains a map of variables in a prompt from Prompt management to an object containing the values to fill in for them when running model invocation. For more information, see <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/userguide/prompt-management-how.html\\\">How Prompt management works</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#ReasoningContentBlock\": {\n            \"type\": \"union\",\n            \"members\": {\n                \"reasoningText\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#ReasoningTextBlock\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The reasoning that the model used to return the output.</p>\"\n                    }\n                },\n                \"redactedContent\": {\n                    \"target\": \"smithy.api#Blob\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The content in the reasoning that was encrypted by the model provider for safety reasons. The encryption doesn't affect the quality of responses.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains content regarding the reasoning that is carried out by the model with respect to the content in the content block. Reasoning refers to a Chain of Thought (CoT) that the model generates to enhance the accuracy of its final response.</p>\",\n                \"smithy.api#sensitive\": {}\n            }\n        },\n        \"com.amazonaws.bedrockruntime#ReasoningContentBlockDelta\": {\n            \"type\": \"union\",\n            \"members\": {\n                \"text\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The reasoning that the model used to return the output.</p>\"\n                    }\n                },\n                \"redactedContent\": {\n                    \"target\": \"smithy.api#Blob\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The content in the reasoning that was encrypted by the model provider for safety reasons. The encryption doesn't affect the quality of responses.</p>\"\n                    }\n                },\n                \"signature\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A token that verifies that the reasoning text was generated by the model. If you pass a reasoning block back to the API in a multi-turn conversation, include the text and its signature unmodified.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains content regarding the reasoning that is carried out by the model with respect to the content in the content block. Reasoning refers to a Chain of Thought (CoT) that the model generates to enhance the accuracy of its final response.</p>\",\n                \"smithy.api#sensitive\": {}\n            }\n        },\n        \"com.amazonaws.bedrockruntime#ReasoningTextBlock\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"text\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The reasoning that the model used to return the output.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"signature\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A token that verifies that the reasoning text was generated by the model. If you pass a reasoning block back to the API in a multi-turn conversation, include the text and its signature unmodified.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the reasoning that the model used to return the output.</p>\",\n                \"smithy.api#sensitive\": {}\n            }\n        },\n        \"com.amazonaws.bedrockruntime#RequestMetadata\": {\n            \"type\": \"map\",\n            \"key\": {\n                \"target\": \"smithy.api#String\",\n                \"traits\": {\n                    \"smithy.api#length\": {\n                        \"min\": 1,\n                        \"max\": 256\n                    },\n                    \"smithy.api#pattern\": \"^[a-zA-Z0-9\\\\s:_@$#=/+,-.]{1,256}$\"\n                }\n            },\n            \"value\": {\n                \"target\": \"smithy.api#String\",\n                \"traits\": {\n                    \"smithy.api#length\": {\n                        \"min\": 0,\n                        \"max\": 256\n                    },\n                    \"smithy.api#pattern\": \"^[a-zA-Z0-9\\\\s:_@$#=/+,-.]{0,256}$\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 16\n                },\n                \"smithy.api#sensitive\": {}\n            }\n        },\n        \"com.amazonaws.bedrockruntime#ResourceNotFoundException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#NonBlankString\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The specified resource ARN was not found. For troubleshooting this error, see <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/userguide/troubleshooting-api-error-codes.html#ts-resource-not-found\\\">ResourceNotFound</a> in the Amazon Bedrock User Guide</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 404\n            }\n        },\n        \"com.amazonaws.bedrockruntime#ResponseStream\": {\n            \"type\": \"union\",\n            \"members\": {\n                \"chunk\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#PayloadPart\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Content included in the response.</p>\"\n                    }\n                },\n                \"internalServerException\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#InternalServerException\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An internal server error occurred. Retry your request.</p>\"\n                    }\n                },\n                \"modelStreamErrorException\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#ModelStreamErrorException\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An error occurred while streaming the response. Retry your request.</p>\"\n                    }\n                },\n                \"validationException\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#ValidationException\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Input validation failed. Check your request parameters and retry the request.</p>\"\n                    }\n                },\n                \"throttlingException\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#ThrottlingException\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Your request was throttled because of service-wide limitations. Resubmit your request later or in a different region. You can also purchase <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/userguide/prov-throughput.html\\\">Provisioned Throughput</a> to increase the rate or number of tokens you can process.</p>\"\n                    }\n                },\n                \"modelTimeoutException\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#ModelTimeoutException\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The request took too long to process. Processing time exceeded the model timeout length.</p>\"\n                    }\n                },\n                \"serviceUnavailableException\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#ServiceUnavailableException\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The service isn't available. Try again later.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Definition of content in the response stream.</p>\",\n                \"smithy.api#streaming\": {}\n            }\n        },\n        \"com.amazonaws.bedrockruntime#S3Location\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"uri\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#S3Uri\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An object URI starting with <code>s3://</code>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"bucketOwner\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If the bucket belongs to another AWS account, specify that account's ID.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A storage location in an Amazon S3 bucket.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#S3Uri\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 1024\n                },\n                \"smithy.api#pattern\": \"^s3://[a-z0-9][\\\\.\\\\-a-z0-9]{1,61}[a-z0-9](/.*)?$\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#ServiceQuotaExceededException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#NonBlankString\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Your request exceeds the service quota for your account. You can view your quotas at <a href=\\\"https://docs.aws.amazon.com/servicequotas/latest/userguide/gs-request-quota.html\\\">Viewing service quotas</a>. You can resubmit your request later.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.bedrockruntime#ServiceUnavailableException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#NonBlankString\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The service isn't currently available. For troubleshooting this error, see <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/userguide/troubleshooting-api-error-codes.html#ts-service-unavailable\\\">ServiceUnavailable</a> in the Amazon Bedrock User Guide</p>\",\n                \"smithy.api#error\": \"server\",\n                \"smithy.api#httpError\": 503\n            }\n        },\n        \"com.amazonaws.bedrockruntime#SortAsyncInvocationBy\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"SUBMISSION_TIME\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"SubmissionTime\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.bedrockruntime#SortOrder\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ASCENDING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Ascending\"\n                    }\n                },\n                \"DESCENDING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Descending\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.bedrockruntime#SpecificToolChoice\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"name\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#ToolName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the tool that the model must request. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The model must request a specific tool. For example, <code>{\\\"tool\\\" : {\\\"name\\\" : \\\"Your tool name\\\"}}</code>.</p> <note> <p>This field is only supported by Anthropic Claude 3 models.</p> </note>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#StartAsyncInvoke\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.bedrockruntime#StartAsyncInvokeRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.bedrockruntime#StartAsyncInvokeResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#AccessDeniedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#ConflictException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#InternalServerException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#ServiceQuotaExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#ServiceUnavailableException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#ThrottlingException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Starts an asynchronous invocation.</p> <p>This operation requires permission for the <code>bedrock:InvokeModel</code> action.</p> <important> <p>To deny all inference access to resources that you specify in the modelId field, you need to deny access to the <code>bedrock:InvokeModel</code> and <code>bedrock:InvokeModelWithResponseStream</code> actions. Doing this also denies access to the resource through the Converse API actions (<a href=\\\"https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_Converse.html\\\">Converse</a> and <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_ConverseStream.html\\\">ConverseStream</a>). For more information see <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/userguide/security_iam_id-based-policy-examples.html#security_iam_id-based-policy-examples-deny-inference\\\">Deny access for inference on specific models</a>. </p> </important>\",\n                \"smithy.api#http\": {\n                    \"code\": 200,\n                    \"method\": \"POST\",\n                    \"uri\": \"/async-invoke\"\n                },\n                \"smithy.api#idempotent\": {}\n            }\n        },\n        \"com.amazonaws.bedrockruntime#StartAsyncInvokeRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"clientRequestToken\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#AsyncInvokeIdempotencyToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify idempotency token to ensure that requests are not duplicated.</p>\",\n                        \"smithy.api#idempotencyToken\": {}\n                    }\n                },\n                \"modelId\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#AsyncInvokeIdentifier\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The model to invoke.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"modelInput\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#ModelInputPayload\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Input to send to the model.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"outputDataConfig\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#AsyncInvokeOutputDataConfig\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Where to store the output.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"tags\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#TagList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Tags to apply to the invocation.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.bedrockruntime#StartAsyncInvokeResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"invocationArn\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#InvocationArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the invocation.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.bedrockruntime#StatusCode\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 100,\n                    \"max\": 599\n                }\n            }\n        },\n        \"com.amazonaws.bedrockruntime#StopReason\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"END_TURN\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"end_turn\"\n                    }\n                },\n                \"TOOL_USE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"tool_use\"\n                    }\n                },\n                \"MAX_TOKENS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"max_tokens\"\n                    }\n                },\n                \"STOP_SEQUENCE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"stop_sequence\"\n                    }\n                },\n                \"GUARDRAIL_INTERVENED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"guardrail_intervened\"\n                    }\n                },\n                \"CONTENT_FILTERED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"content_filtered\"\n                    }\n                },\n                \"MODEL_CONTEXT_WINDOW_EXCEEDED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"model_context_window_exceeded\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.bedrockruntime#SystemContentBlock\": {\n            \"type\": \"union\",\n            \"members\": {\n                \"text\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#NonEmptyString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A system prompt for the model. </p>\"\n                    }\n                },\n                \"guardContent\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#GuardrailConverseContentBlock\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A content block to assess with the guardrail. Use with the <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_Converse.html\\\">Converse</a> or <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/APIReference/API_runtime_ConverseStream.html\\\">ConverseStream</a> API operations. </p> <p>For more information, see <i>Use a guardrail with the Converse API</i> in the <i>Amazon Bedrock User Guide</i>.</p>\"\n                    }\n                },\n                \"cachePoint\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#CachePointBlock\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>CachePoint to include in the system prompt.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A system content block.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#SystemContentBlocks\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.bedrockruntime#SystemContentBlock\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#Tag\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"key\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#TagKey\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tag's key.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"value\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#TagValue\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tag's value.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A tag.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#TagKey\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 128\n                },\n                \"smithy.api#pattern\": \"^[a-zA-Z0-9\\\\s._:/=+@-]*$\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#TagList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.bedrockruntime#Tag\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 200\n                }\n            }\n        },\n        \"com.amazonaws.bedrockruntime#TagValue\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 256\n                },\n                \"smithy.api#pattern\": \"^[a-zA-Z0-9\\\\s._:/=+@-]*$\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#TextCharactersGuarded\": {\n            \"type\": \"integer\"\n        },\n        \"com.amazonaws.bedrockruntime#TextCharactersTotal\": {\n            \"type\": \"integer\"\n        },\n        \"com.amazonaws.bedrockruntime#ThrottlingException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#NonBlankString\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Your request was denied due to exceeding the account quotas for <i>Amazon Bedrock</i>. For troubleshooting this error, see <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/userguide/troubleshooting-api-error-codes.html#ts-throttling-exception\\\">ThrottlingException</a> in the Amazon Bedrock User Guide</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 429\n            }\n        },\n        \"com.amazonaws.bedrockruntime#Timestamp\": {\n            \"type\": \"timestamp\",\n            \"traits\": {\n                \"smithy.api#timestampFormat\": \"date-time\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#TokenUsage\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"inputTokens\": {\n                    \"target\": \"smithy.api#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of tokens sent in the request to the model.</p>\",\n                        \"smithy.api#range\": {\n                            \"min\": 0\n                        },\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"outputTokens\": {\n                    \"target\": \"smithy.api#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of tokens that the model generated for the request.</p>\",\n                        \"smithy.api#range\": {\n                            \"min\": 0\n                        },\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"totalTokens\": {\n                    \"target\": \"smithy.api#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The total of input tokens and tokens generated by the model.</p>\",\n                        \"smithy.api#range\": {\n                            \"min\": 0\n                        },\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"cacheReadInputTokens\": {\n                    \"target\": \"smithy.api#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of input tokens read from the cache for the request.</p>\",\n                        \"smithy.api#range\": {\n                            \"min\": 0\n                        }\n                    }\n                },\n                \"cacheWriteInputTokens\": {\n                    \"target\": \"smithy.api#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of input tokens written to the cache for the request.</p>\",\n                        \"smithy.api#range\": {\n                            \"min\": 0\n                        }\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The tokens used in a message API inference call. </p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#TokenizerResource\": {\n            \"type\": \"resource\",\n            \"operations\": [\n                {\n                    \"target\": \"com.amazonaws.bedrockruntime#CountTokens\"\n                }\n            ]\n        },\n        \"com.amazonaws.bedrockruntime#Tool\": {\n            \"type\": \"union\",\n            \"members\": {\n                \"toolSpec\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#ToolSpecification\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The specfication for the tool.</p>\"\n                    }\n                },\n                \"cachePoint\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#CachePointBlock\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>CachePoint to include in the tool configuration.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about a tool that you can use with the Converse API. For more information, see <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/userguide/tool-use.html\\\">Tool use (function calling)</a> in the Amazon Bedrock User Guide.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#ToolChoice\": {\n            \"type\": \"union\",\n            \"members\": {\n                \"auto\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#AutoToolChoice\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>(Default). The Model automatically decides if a tool should be called or whether to generate text instead. </p>\"\n                    }\n                },\n                \"any\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#AnyToolChoice\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The model must request at least one tool (no text is generated).</p>\"\n                    }\n                },\n                \"tool\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#SpecificToolChoice\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Model must request the specified tool. Only supported by Anthropic Claude 3 models. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Determines which tools the model should request in a call to <code>Converse</code> or <code>ConverseStream</code>. <code>ToolChoice</code> is only supported by Anthropic Claude 3 models and by Mistral AI Mistral Large.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#ToolConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"tools\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#Tools\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An array of tools that you want to pass to a model.</p>\",\n                        \"smithy.api#length\": {\n                            \"min\": 1\n                        },\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"toolChoice\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#ToolChoice\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If supported by model, forces the model to request a tool.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Configuration information for the tools that you pass to a model. For more information, see <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/userguide/tool-use.html\\\">Tool use (function calling)</a> in the Amazon Bedrock User Guide.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#ToolInputSchema\": {\n            \"type\": \"union\",\n            \"members\": {\n                \"json\": {\n                    \"target\": \"smithy.api#Document\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The JSON schema for the tool. For more information, see <a href=\\\"https://json-schema.org/understanding-json-schema/reference\\\">JSON Schema Reference</a>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The schema for the tool. The top level schema type must be <code>object</code>. </p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#ToolName\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 64\n                },\n                \"smithy.api#pattern\": \"^[a-zA-Z0-9_-]+$\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#ToolResultBlock\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"toolUseId\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#ToolUseId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the tool request that this is the result for.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"content\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#ToolResultContentBlocks\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The content for tool result content block.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"status\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#ToolResultStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The status for the tool result content block.</p> <note> <p>This field is only supported Anthropic Claude 3 models.</p> </note>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A tool result block that contains the results for a tool request that the model previously made.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#ToolResultContentBlock\": {\n            \"type\": \"union\",\n            \"members\": {\n                \"json\": {\n                    \"target\": \"smithy.api#Document\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A tool result that is JSON format data.</p>\"\n                    }\n                },\n                \"text\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A tool result that is text.</p>\"\n                    }\n                },\n                \"image\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#ImageBlock\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A tool result that is an image.</p> <note> <p>This field is only supported by Anthropic Claude 3 models.</p> </note>\"\n                    }\n                },\n                \"document\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#DocumentBlock\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A tool result that is a document.</p>\"\n                    }\n                },\n                \"video\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#VideoBlock\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A tool result that is video.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The tool result content block.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#ToolResultContentBlocks\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.bedrockruntime#ToolResultContentBlock\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#ToolResultStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"SUCCESS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"success\"\n                    }\n                },\n                \"ERROR\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"error\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.bedrockruntime#ToolSpecification\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"name\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#ToolName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name for the tool.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"description\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#NonEmptyString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The description for the tool.</p>\"\n                    }\n                },\n                \"inputSchema\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#ToolInputSchema\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The input schema for the tool in JSON format.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The specification for the tool.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#ToolUseBlock\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"toolUseId\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#ToolUseId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID for the tool request.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"name\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#ToolName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the tool that the model wants to use.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"input\": {\n                    \"target\": \"smithy.api#Document\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The input to pass to the tool. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A tool use content block. Contains information about a tool that the model is requesting be run., The model uses the result from the tool to generate a response. </p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#ToolUseBlockDelta\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"input\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The input for a requested tool.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The delta for a tool use block.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#ToolUseBlockStart\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"toolUseId\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#ToolUseId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID for the tool request.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"name\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#ToolName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the tool that the model is requesting to use.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The start of a tool use block.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#ToolUseId\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 64\n                },\n                \"smithy.api#pattern\": \"^[a-zA-Z0-9_-]+$\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#Tools\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.bedrockruntime#Tool\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#Trace\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ENABLED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ENABLED\"\n                    }\n                },\n                \"DISABLED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DISABLED\"\n                    }\n                },\n                \"ENABLED_FULL\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ENABLED_FULL\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.bedrockruntime#ValidationException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#NonBlankString\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The input fails to satisfy the constraints specified by <i>Amazon Bedrock</i>. For troubleshooting this error, see <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/userguide/troubleshooting-api-error-codes.html#ts-validation-error\\\">ValidationError</a> in the Amazon Bedrock User Guide</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.bedrockruntime#VideoBlock\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"format\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#VideoFormat\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The block's format.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"source\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#VideoSource\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The block's source.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A video block.</p>\"\n            }\n        },\n        \"com.amazonaws.bedrockruntime#VideoFormat\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"MKV\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"mkv\"\n                    }\n                },\n                \"MOV\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"mov\"\n                    }\n                },\n                \"MP4\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"mp4\"\n                    }\n                },\n                \"WEBM\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"webm\"\n                    }\n                },\n                \"FLV\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"flv\"\n                    }\n                },\n                \"MPEG\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"mpeg\"\n                    }\n                },\n                \"MPG\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"mpg\"\n                    }\n                },\n                \"WMV\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"wmv\"\n                    }\n                },\n                \"THREE_GP\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"three_gp\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.bedrockruntime#VideoSource\": {\n            \"type\": \"union\",\n            \"members\": {\n                \"bytes\": {\n                    \"target\": \"smithy.api#Blob\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Video content encoded in base64.</p>\",\n                        \"smithy.api#length\": {\n                            \"min\": 1\n                        }\n                    }\n                },\n                \"s3Location\": {\n                    \"target\": \"com.amazonaws.bedrockruntime#S3Location\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The location of a video object in an Amazon S3 bucket. To see which models support S3 uploads, see <a href=\\\"https://docs.aws.amazon.com/bedrock/latest/userguide/conversation-inference-supported-models-features.html\\\">Supported models and features for Converse</a>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A video source. You can upload a smaller video as a base64-encoded string as long as the encoded file is less than 25MB. You can also transfer videos up to 1GB in size from an S3 bucket.</p>\"\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "aws/sdk/aws-models/cloudwatch-logs.json",
    "content": "{\n    \"smithy\": \"2.0\",\n    \"metadata\": {\n        \"suppressions\": [\n            {\n                \"id\": \"HttpMethodSemantics\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"HttpResponseCodeSemantics\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"PaginatedTrait\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"HttpHeaderTrait\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"HttpUriConflict\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"Service\",\n                \"namespace\": \"*\"\n            }\n        ]\n    },\n    \"shapes\": {\n        \"com.amazonaws.cloudwatchlogs#AccessDeniedException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Message\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>You don't have sufficient permissions to perform this action.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#AccessPolicy\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#AccountId\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 12,\n                    \"max\": 12\n                },\n                \"smithy.api#pattern\": \"^\\\\d{12}$\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#AccountIds\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#AccountId\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 20\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#AccountPolicies\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#AccountPolicy\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#AccountPolicy\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"policyName\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#PolicyName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the account policy.</p>\"\n                    }\n                },\n                \"policyDocument\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#AccountPolicyDocument\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The policy document for this account policy.</p>\\n         <p>The JSON specified in <code>policyDocument</code> can be up to 30,720 characters.</p>\"\n                    }\n                },\n                \"lastUpdatedTime\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time that this policy was most recently updated.</p>\"\n                    }\n                },\n                \"policyType\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#PolicyType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of policy for this account policy.</p>\"\n                    }\n                },\n                \"scope\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Scope\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The scope of the account policy.</p>\"\n                    }\n                },\n                \"selectionCriteria\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#SelectionCriteria\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The log group selection criteria that is used for this policy.</p>\"\n                    }\n                },\n                \"accountId\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID that the policy applies to.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A structure that contains information about one CloudWatch Logs account policy.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#AccountPolicyDocument\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.cloudwatchlogs#AddKeyEntries\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#AddKeyEntry\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 5\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#AddKeyEntry\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"key\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Key\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The key of the new entry to be added to the log event</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"value\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#AddKeyValue\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The value of the new entry to be added to the log event</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"overwriteIfExists\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#OverwriteIfExists\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Specifies whether to overwrite the value if the key already exists in the log event. If\\n      you omit this, the default is <code>false</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This object defines one key that will be added with the <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CloudWatch-Logs-Transformation.html#CloudWatch-Logs-Transformation-addKey\\\"> addKeys</a> processor.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#AddKeyValue\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 256\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#AddKeys\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"entries\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#AddKeyEntries\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An array of objects, where each object contains the information about one key to add to\\n      the log event. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This processor adds new key-value pairs to the log event. </p>\\n         <p>For more information about this processor including examples, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CloudWatch-Logs-Transformation.html#CloudWatch-Logs-Transformation-addKeys\\\"> addKeys</a> in the <i>CloudWatch Logs User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#AllowedActionForAllowVendedLogsDeliveryForResource\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.cloudwatchlogs#AllowedFieldDelimiters\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#FieldDelimiter\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#AllowedFields\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#RecordField\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#AmazonResourceName\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 1011\n                },\n                \"smithy.api#pattern\": \"^[\\\\w+=/:,.@-]*$\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#Anomalies\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#Anomaly\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#Anomaly\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"anomalyId\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#AnomalyId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The unique ID that CloudWatch Logs assigned to this anomaly.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"patternId\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#PatternId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the pattern used to help identify this anomaly.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"anomalyDetectorArn\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#AnomalyDetectorArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the anomaly detector that identified this anomaly.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"patternString\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#PatternString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The pattern used to help identify this anomaly, in string format.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"patternRegex\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#PatternRegex\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The pattern used to help identify this anomaly, in regular expression format.</p>\"\n                    }\n                },\n                \"priority\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Priority\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The priority level of this anomaly, as determined by CloudWatch Logs. Priority is\\n      computed based on log severity labels such as <code>FATAL</code> and <code>ERROR</code> and\\n      the amount of deviation from the baseline. Possible values are <code>HIGH</code>,\\n        <code>MEDIUM</code>, and <code>LOW</code>.</p>\"\n                    }\n                },\n                \"firstSeen\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#EpochMillis\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The date and time when the anomaly detector first saw this anomaly. It is specified as\\n      epoch time, which is the number of seconds since <code>January 1, 1970, 00:00:00\\n      UTC</code>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"lastSeen\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#EpochMillis\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The date and time when the anomaly detector most recently saw this anomaly. It is\\n      specified as epoch time, which is the number of seconds since <code>January 1, 1970, 00:00:00\\n        UTC</code>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"description\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Description\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A human-readable description of the anomaly. This description is generated by CloudWatch Logs.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"active\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies whether this anomaly is still ongoing.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"state\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#State\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates the current state of this anomaly. If it is still being treated as an anomaly,\\n      the value is <code>Active</code>. If you have suppressed this anomaly by using the <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_UpdateAnomaly.html\\\">UpdateAnomaly</a> operation, the value is <code>Suppressed</code>. If this behavior is\\n      now considered to be normal, the value is <code>Baseline</code>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"histogram\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Histogram\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A map showing times when the anomaly detector ran, and the number of occurrences of this\\n      anomaly that were detected at each of those runs. The times are specified in epoch time, which\\n      is the number of seconds since <code>January 1, 1970, 00:00:00 UTC</code>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"logSamples\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogSamples\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An array of sample log event messages that are considered to be part of this\\n      anomaly.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"patternTokens\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#PatternTokens\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An array of structures where each structure contains information about one token that\\n      makes up the pattern.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"logGroupArnList\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogGroupArnList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An array of ARNS of the log groups that contained log events considered to be part of this\\n      anomaly.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"suppressed\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether this anomaly is currently suppressed. To suppress an anomaly, use <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_UpdateAnomaly.html\\\">UpdateAnomaly</a>.</p>\"\n                    }\n                },\n                \"suppressedDate\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#EpochMillis\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>If the anomaly is suppressed, this indicates when it was suppressed.</p>\"\n                    }\n                },\n                \"suppressedUntil\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#EpochMillis\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>If the anomaly is suppressed, this indicates when the suppression will end. If this value\\n      is <code>0</code>, the anomaly was suppressed with no expiration, with the\\n        <code>INFINITE</code> value.</p>\"\n                    }\n                },\n                \"isPatternLevelSuppression\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If this anomaly is suppressed, this field is <code>true</code> if the suppression is\\n      because the pattern is suppressed. If <code>false</code>, then only this particular anomaly is\\n      suppressed.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This structure represents one anomaly that has been found by a logs anomaly\\n      detector.</p>\\n         <p>For more information about patterns and anomalies, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_CreateLogAnomalyDetector.html\\\">CreateLogAnomalyDetector</a>. </p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#AnomalyDetector\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"anomalyDetectorArn\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#AnomalyDetectorArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the anomaly detector.</p>\"\n                    }\n                },\n                \"detectorName\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DetectorName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the anomaly detector.</p>\"\n                    }\n                },\n                \"logGroupArnList\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogGroupArnList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of the ARNs of the log groups that this anomaly detector watches.</p>\"\n                    }\n                },\n                \"evaluationFrequency\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#EvaluationFrequency\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies how often the anomaly detector runs and look for anomalies.</p>\"\n                    }\n                },\n                \"filterPattern\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#FilterPattern\"\n                },\n                \"anomalyDetectorStatus\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#AnomalyDetectorStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the current status of the anomaly detector. To pause an anomaly detector, use\\n      the <code>enabled</code> parameter in the <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_UpdateLogAnomalyDetector.html\\\">UpdateLogAnomalyDetector</a> operation.</p>\"\n                    }\n                },\n                \"kmsKeyId\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#KmsKeyId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the KMS key assigned to this anomaly detector, if any.</p>\"\n                    }\n                },\n                \"creationTimeStamp\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#EpochMillis\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The date and time when this anomaly detector was created.</p>\"\n                    }\n                },\n                \"lastModifiedTimeStamp\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#EpochMillis\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The date and time when this anomaly detector was most recently modified.</p>\"\n                    }\n                },\n                \"anomalyVisibilityTime\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#AnomalyVisibilityTime\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of days used as the life cycle of anomalies. After this time, anomalies are\\n      automatically baselined and the anomaly detector model will treat new occurrences of similar\\n      event as normal. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains information about one anomaly detector in the account.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#AnomalyDetectorArn\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1\n                },\n                \"smithy.api#pattern\": \"^[\\\\w#+=/:,.@-]*$\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#AnomalyDetectorStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"INITIALIZING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"INITIALIZING\"\n                    }\n                },\n                \"TRAINING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"TRAINING\"\n                    }\n                },\n                \"ANALYZING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ANALYZING\"\n                    }\n                },\n                \"FAILED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"FAILED\"\n                    }\n                },\n                \"DELETED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DELETED\"\n                    }\n                },\n                \"PAUSED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"PAUSED\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#AnomalyDetectors\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#AnomalyDetector\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#AnomalyId\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 36,\n                    \"max\": 36\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#AnomalyVisibilityTime\": {\n            \"type\": \"long\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 7,\n                    \"max\": 90\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#ApplyOnTransformedLogs\": {\n            \"type\": \"boolean\",\n            \"traits\": {\n                \"smithy.api#default\": false\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#Arn\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.cloudwatchlogs#AssociateKmsKey\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#AssociateKmsKeyRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#OperationAbortedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Associates the specified KMS key with either one log group in the\\n      account, or with all stored CloudWatch Logs query insights results in the\\n      account.</p>\\n         <p>When you use <code>AssociateKmsKey</code>, you specify either the\\n        <code>logGroupName</code> parameter or the <code>resourceIdentifier</code> parameter. You\\n      can't specify both of those parameters in the same operation.</p>\\n         <ul>\\n            <li>\\n               <p>Specify the <code>logGroupName</code> parameter to cause log events ingested into that\\n          log group to be encrypted with that key. Only the log events ingested after the key is\\n          associated are encrypted with that key.</p>\\n               <p>Associating a KMS key with a log group overrides any existing\\n          associations between the log group and a KMS key. After a KMS key is associated with a log group, all newly ingested data for the log group\\n          is encrypted using the KMS key. This association is stored as long as the\\n          data encrypted with the KMS key is still within CloudWatch Logs. This\\n          enables CloudWatch Logs to decrypt this data whenever it is requested.</p>\\n               <p>Associating a key with a log group does not cause the results of queries of that log\\n          group to be encrypted with that key. To have query results encrypted with a KMS key, you must use an <code>AssociateKmsKey</code> operation with the\\n            <code>resourceIdentifier</code> parameter that specifies a <code>query-result</code>\\n          resource. </p>\\n            </li>\\n            <li>\\n               <p>Specify the <code>resourceIdentifier</code> parameter with a <code>query-result</code>\\n          resource, to use that key to encrypt the stored results of all future <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_StartQuery.html\\\">StartQuery</a> operations in the account. The response from a <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_GetQueryResults.html\\\">GetQueryResults</a> operation will still return the query results in plain\\n          text.</p>\\n               <p>Even if you have not associated a key with your query results, the query results are\\n          encrypted when stored, using the default CloudWatch Logs method.</p>\\n               <p>If you run a query from a monitoring account that queries logs in a source account,\\n          the query results key from the monitoring account, if any, is used.</p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>If you delete the key that is used to encrypt log events or log group query results,\\n        then all the associated stored log events or query results that were encrypted with that key\\n        will be unencryptable and unusable.</p>\\n         </important>\\n         <note>\\n            <p>CloudWatch Logs supports only symmetric KMS keys. Do not associate an\\n        asymmetric KMS key with your log group or query results. For more\\n        information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/symmetric-asymmetric.html\\\">Using Symmetric and Asymmetric\\n          Keys</a>.</p>\\n         </note>\\n         <p>It can take up to 5 minutes for this operation to take effect.</p>\\n         <p>If you attempt to associate a KMS key with a log group but the KMS key does not exist or the KMS key is disabled, you receive an\\n        <code>InvalidParameterException</code> error. </p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#AssociateKmsKeyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"logGroupName\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogGroupName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the log group.</p>\\n         <p>In your <code>AssociateKmsKey</code> operation, you must specify either the\\n        <code>resourceIdentifier</code> parameter or the <code>logGroup</code> parameter, but you\\n      can't specify both.</p>\"\n                    }\n                },\n                \"kmsKeyId\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#KmsKeyId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the KMS key to use when encrypting log\\n      data. This must be a symmetric KMS key. For more information, see <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html#arn-syntax-kms\\\">Amazon Resource Names</a> and <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/symmetric-asymmetric.html\\\">Using Symmetric and Asymmetric\\n        Keys</a>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"resourceIdentifier\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ResourceIdentifier\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the target for this operation. You must specify one of the following:</p>\\n         <ul>\\n            <li>\\n               <p>Specify the following ARN to have future <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_GetQueryResults.html\\\">GetQueryResults</a> operations in this account encrypt the results with the\\n          specified KMS key. Replace <i>REGION</i> and\\n            <i>ACCOUNT_ID</i> with your Region and account ID.</p>\\n               <p>\\n                  <code>arn:aws:logs:<i>REGION</i>:<i>ACCOUNT_ID</i>:query-result:*</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Specify the ARN of a log group to have CloudWatch Logs use the KMS key to encrypt log events that are ingested and stored by that log\\n          group. The log group ARN must be in the following format. Replace\\n            <i>REGION</i> and <i>ACCOUNT_ID</i> with your Region and\\n          account ID.</p>\\n               <p>\\n                  <code>arn:aws:logs:<i>REGION</i>:<i>ACCOUNT_ID</i>:log-group:<i>LOG_GROUP_NAME</i>\\n                  </code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>In your <code>AssociateKmsKey</code> operation, you must specify either the\\n        <code>resourceIdentifier</code> parameter or the <code>logGroup</code> parameter, but you\\n      can't specify both.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#Baseline\": {\n            \"type\": \"boolean\"\n        },\n        \"com.amazonaws.cloudwatchlogs#Boolean\": {\n            \"type\": \"boolean\"\n        },\n        \"com.amazonaws.cloudwatchlogs#CSV\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"quoteCharacter\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#QuoteCharacter\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The character used used as a text qualifier for a single column of data. If you omit this,\\n      the double quotation mark <code>\\\"</code> character is used.</p>\"\n                    }\n                },\n                \"delimiter\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Delimiter\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The character used to separate each column in the original comma-separated value log\\n      event. If you omit this, the processor looks for the comma <code>,</code> character as the\\n      delimiter.</p>\"\n                    }\n                },\n                \"columns\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Columns\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An array of names to use for the columns in the transformed log event.</p>\\n         <p>If you omit this, default column names (<code>[column_1, column_2 ...]</code>) are\\n      used.</p>\"\n                    }\n                },\n                \"source\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Source\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The path to the field in the log event that has the comma separated values to be parsed.\\n      If you omit this value, the whole log message is processed.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The <code>CSV</code> processor parses comma-separated values (CSV) from the log events\\n      into columns.</p>\\n         <p>For more information about this processor including examples, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CloudWatch-Logs-Transformation.html#CloudWatch-Logs-Transformation-csv\\\"> csv</a> in the <i>CloudWatch Logs User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#CancelExportTask\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#CancelExportTaskRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InvalidOperationException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Cancels the specified export task.</p>\\n         <p>The task must be in the <code>PENDING</code> or <code>RUNNING</code> state.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#CancelExportTaskRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"taskId\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ExportTaskId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the export task.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#ClientToken\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 36,\n                    \"max\": 128\n                },\n                \"smithy.api#pattern\": \"^\\\\S{36,128}$\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#CollectionRetentionDays\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 30\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#Column\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 128\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#Columns\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#Column\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 100\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#ConfigurationTemplate\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"service\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Service\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A string specifying which service this configuration template applies to. For more\\n      information about supported services see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/AWS-logs-and-resource-policy.html\\\">Enable logging from\\n          Amazon Web Services services.</a>.</p>\"\n                    }\n                },\n                \"logType\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A string specifying which log type this configuration template applies to.</p>\"\n                    }\n                },\n                \"resourceType\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ResourceType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A string specifying which resource type this configuration template applies to.</p>\"\n                    }\n                },\n                \"deliveryDestinationType\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DeliveryDestinationType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A string specifying which destination type this configuration template applies to.</p>\"\n                    }\n                },\n                \"defaultDeliveryConfigValues\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ConfigurationTemplateDeliveryConfigValues\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A mapping that displays the default value of each property within a delivery's\\n      configuration, if it is not specified in the request.</p>\"\n                    }\n                },\n                \"allowedFields\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#AllowedFields\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The allowed fields that a caller can use in the <code>recordFields</code> parameter of a\\n        <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_CreateDelivery.html\\\">CreateDelivery</a> or <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_UpdateDeliveryConfiguration.html\\\">UpdateDeliveryConfiguration</a> operation.</p>\"\n                    }\n                },\n                \"allowedOutputFormats\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#OutputFormats\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The list of delivery destination output formats that are supported by this log\\n      source.</p>\"\n                    }\n                },\n                \"allowedActionForAllowVendedLogsDeliveryForResource\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#AllowedActionForAllowVendedLogsDeliveryForResource\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The action permissions that a caller needs to have to be able to successfully create a\\n      delivery source on the desired resource type when calling <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutDeliverySource.html\\\">PutDeliverySource</a>.</p>\"\n                    }\n                },\n                \"allowedFieldDelimiters\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#AllowedFieldDelimiters\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The valid values that a caller can use as field delimiters when calling <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_CreateDelivery.html\\\">CreateDelivery</a> or <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_UpdateDeliveryConfiguration.html\\\">UpdateDeliveryConfiguration</a> on a delivery that delivers in <code>Plain</code>,\\n        <code>W3C</code>, or <code>Raw</code> format.</p>\"\n                    }\n                },\n                \"allowedSuffixPathFields\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#RecordFields\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The list of variable fields that can be used in the suffix path of a delivery that\\n      delivers to an S3 bucket.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A structure containing information about the deafult settings and available settings that\\n      you can use to configure a <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_Delivery.html\\\">delivery</a> or a\\n        <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_DeliveryDestination.html\\\">delivery\\n        destination</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#ConfigurationTemplateDeliveryConfigValues\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"recordFields\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#RecordFields\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The default record fields that will be delivered when a list of record fields is not\\n      provided in a <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_CreateDelivery.html\\\">CreateDelivery</a> operation.</p>\"\n                    }\n                },\n                \"fieldDelimiter\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#FieldDelimiter\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The default field delimiter that is used in a <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_CreateDelivery.html\\\">CreateDelivery</a> operation when the field delimiter is not specified in that\\n      operation. The field delimiter is used only when the final output delivery is in\\n        <code>Plain</code>, <code>W3C</code>, or <code>Raw</code> format.</p>\"\n                    }\n                },\n                \"s3DeliveryConfiguration\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#S3DeliveryConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The delivery parameters that are used when you create a delivery to a delivery destination\\n      that is an S3 Bucket.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This structure contains the default values that are used for each configuration parameter\\n      when you use <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_CreateDelivery.html\\\">CreateDelivery</a> to create a deliver under the current service type, resource type,\\n      and log type.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#ConfigurationTemplates\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#ConfigurationTemplate\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#ConflictException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Message\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This operation attempted to create a resource that already exists.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#CopyValue\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"entries\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#CopyValueEntries\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An array of <code>CopyValueEntry</code> objects, where each object contains the\\n      information about one field value to copy. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This processor copies values within a log event. You can also use this processor to add\\n      metadata to log events by copying the values of the following metadata keys into the log\\n      events: <code>@logGroupName</code>, <code>@logGroupStream</code>, <code>@accountId</code>,\\n        <code>@regionName</code>. </p>\\n         <p>For more information about this processor including examples, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CloudWatch-Logs-Transformation.html#CloudWatch-Logs-Transformation-copyValue\\\"> copyValue</a> in the <i>CloudWatch Logs User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#CopyValueEntries\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#CopyValueEntry\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 5\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#CopyValueEntry\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"source\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Source\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The key to copy.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"target\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Target\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The key of the field to copy the value to.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"overwriteIfExists\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#OverwriteIfExists\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Specifies whether to overwrite the value if the destination key already exists. If you\\n      omit this, the default is <code>false</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This object defines one value to be copied with the <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CloudWatch-Logs-Transformation.html#CloudWatch-Logs-Transformation-copoyValue\\\"> copyValue</a> processor.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#Count\": {\n            \"type\": \"long\",\n            \"traits\": {\n                \"smithy.api#default\": 0\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#CreateDelivery\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#CreateDeliveryRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#CreateDeliveryResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#AccessDeniedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ConflictException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceQuotaExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ThrottlingException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates a <i>delivery</i>. A delivery is a connection between a logical\\n        <i>delivery source</i> and a logical <i>delivery destination</i>\\n      that you have already created.</p>\\n         <p>Only some Amazon Web Services services support being configured as a delivery source using\\n      this operation. These services are listed as <b>Supported [V2\\n        Permissions]</b> in the table at <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/AWS-logs-and-resource-policy.html\\\">Enabling logging from\\n          Amazon Web Services services.</a>\\n         </p>\\n         <p>A delivery destination can represent a log group in CloudWatch Logs, an Amazon S3 bucket, a delivery stream in Firehose, or X-Ray.</p>\\n         <p>To configure logs delivery between a supported Amazon Web Services service and a\\n      destination, you must do the following:</p>\\n         <ul>\\n            <li>\\n               <p>Create a delivery source, which is a logical object that represents the resource that\\n          is actually sending the logs. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutDeliverySource.html\\\">PutDeliverySource</a>.</p>\\n            </li>\\n            <li>\\n               <p>Create a <i>delivery destination</i>, which is a logical object that\\n          represents the actual delivery destination. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutDeliveryDestination.html\\\">PutDeliveryDestination</a>.</p>\\n            </li>\\n            <li>\\n               <p>If you are delivering logs cross-account, you must use <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutDeliveryDestinationPolicy.html\\\">PutDeliveryDestinationPolicy</a> in the destination account to assign an IAM policy to the destination. This policy allows delivery to that destination.\\n        </p>\\n            </li>\\n            <li>\\n               <p>Use <code>CreateDelivery</code> to create a <i>delivery</i> by pairing\\n          exactly one delivery source and one delivery destination. </p>\\n            </li>\\n         </ul>\\n         <p>You can configure a single delivery source to send logs to multiple destinations by\\n      creating multiple deliveries. You can also create multiple deliveries to configure multiple\\n      delivery sources to send logs to the same delivery destination.</p>\\n         <p>To update an existing delivery configuration, use <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_UpdateDeliveryConfiguration.html\\\">UpdateDeliveryConfiguration</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#CreateDeliveryRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"deliverySourceName\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DeliverySourceName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the delivery source to use for this delivery.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"deliveryDestinationArn\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Arn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the delivery destination to use for this delivery.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"recordFields\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#RecordFields\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The list of record fields to be delivered to the destination, in order. If the delivery's\\n      log source has mandatory fields, they must be included in this list.</p>\"\n                    }\n                },\n                \"fieldDelimiter\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#FieldDelimiter\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The field delimiter to use between record fields when the final output format of a\\n      delivery is in <code>Plain</code>, <code>W3C</code>, or <code>Raw</code> format.</p>\"\n                    }\n                },\n                \"s3DeliveryConfiguration\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#S3DeliveryConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>This structure contains parameters that are valid only when the delivery's delivery\\n      destination is an S3 bucket.</p>\"\n                    }\n                },\n                \"tags\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Tags\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An optional list of key-value pairs to associate with the resource.</p>\\n         <p>For more information about tagging, see <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html\\\">Tagging Amazon Web Services resources</a>\\n         </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#CreateDeliveryResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"delivery\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Delivery\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A structure that contains information about the delivery that you just created.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#CreateExportTask\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#CreateExportTaskRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#CreateExportTaskResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#OperationAbortedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ResourceAlreadyExistsException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates an export task so that you can efficiently export data from a log group to an\\n      Amazon S3 bucket. When you perform a <code>CreateExportTask</code> operation, you must use\\n      credentials that have permission to write to the S3 bucket that you specify as the\\n      destination.</p>\\n         <p>Exporting log data to S3 buckets that are encrypted by KMS is supported.\\n      Exporting log data to Amazon S3 buckets that have S3 Object Lock enabled with a\\n      retention period is also supported.</p>\\n         <p>Exporting to S3 buckets that are encrypted with AES-256 is supported. </p>\\n         <p>This is an asynchronous call. If all the required information is provided, this\\n      operation initiates an export task and responds with the ID of the task. After the task has\\n      started, you can use <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_DescribeExportTasks.html\\\">DescribeExportTasks</a> to get the status of the export task. Each account can only\\n      have one active (<code>RUNNING</code> or <code>PENDING</code>) export task at a time. To\\n      cancel an export task, use <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_CancelExportTask.html\\\">CancelExportTask</a>.</p>\\n         <p>You can export logs from multiple log groups or multiple time ranges to the same S3\\n      bucket. To separate log data for each export task, specify a prefix to be used as the Amazon\\n      S3 key prefix for all exported objects.</p>\\n         <note>\\n            <p>We recommend that you don't regularly export to Amazon S3 as a way to\\n        continuously archive your logs. For that use case, we instead recommend that you use\\n        subscriptions. For more information about subscriptions, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/Subscriptions.html\\\">Real-time processing of log data\\n          with subscriptions</a>.</p>\\n         </note>\\n         <note>\\n            <p>Time-based sorting on chunks of log data inside an exported file is not guaranteed. You\\n        can sort the exported log field data by using Linux utilities.</p>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#CreateExportTaskRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"taskName\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ExportTaskName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the export task.</p>\"\n                    }\n                },\n                \"logGroupName\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogGroupName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the log group.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"logStreamNamePrefix\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogStreamName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Export only log streams that match the provided prefix. If you don't specify a value,\\n      no prefix filter is applied.</p>\"\n                    }\n                },\n                \"from\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The start time of the range for the request, expressed as the number of milliseconds\\n      after <code>Jan 1, 1970 00:00:00 UTC</code>. Events with a timestamp earlier than this time\\n      are not exported.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"to\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The end time of the range for the request, expressed as the number of milliseconds\\n      after <code>Jan 1, 1970 00:00:00 UTC</code>. Events with a timestamp later than this time are\\n      not exported.</p>\\n         <p>You must specify a time that is not earlier than when this log group was created.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"destination\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ExportDestinationBucket\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of S3 bucket for the exported log data. The bucket must be in the same Amazon Web Services Region.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"destinationPrefix\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ExportDestinationPrefix\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The prefix used as the start of the key for every object exported. If you don't specify\\n      a value, the default is <code>exportedlogs</code>.</p>\\n         <p>The length of this parameter must comply with the S3 object key name length limits. The\\n      object key name is a sequence of Unicode characters with UTF-8 encoding, and can be up to\\n      1,024 bytes.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#CreateExportTaskResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"taskId\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ExportTaskId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the export task.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#CreateLogAnomalyDetector\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#CreateLogAnomalyDetectorRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#CreateLogAnomalyDetectorResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#OperationAbortedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates an <i>anomaly detector</i> that regularly scans one or more log\\n      groups and look for patterns and anomalies in the logs.</p>\\n         <p>An anomaly detector can help surface issues by automatically discovering anomalies in your\\n      log event traffic. An anomaly detector uses machine learning algorithms to scan log events and\\n      find <i>patterns</i>. A pattern is a shared text structure that recurs among\\n      your log fields. Patterns provide a useful tool for analyzing large sets of logs because a\\n      large number of log events can often be compressed into a few patterns.</p>\\n         <p>The anomaly detector uses pattern recognition to find <code>anomalies</code>, which are\\n      unusual log events. It uses the <code>evaluationFrequency</code> to compare current log events\\n      and patterns with trained baselines. </p>\\n         <p>Fields within a pattern are called <i>tokens</i>. Fields that vary within a\\n      pattern, such as a request ID or timestamp, are referred to as <i>dynamic\\n        tokens</i> and represented by <code><*></code>. </p>\\n         <p>The following is an example of a pattern:</p>\\n         <p>\\n            <code>[INFO] Request time: <*> ms</code>\\n         </p>\\n         <p>This pattern represents log events like <code>[INFO] Request time: 327 ms</code> and other\\n      similar log events that differ only by the number, in this csse 327. When the pattern is\\n      displayed, the different numbers are replaced by <code><*></code>\\n         </p>\\n         <note>\\n            <p>Any parts of log events that are masked as sensitive data are not scanned for anomalies.\\n        For more information about masking sensitive data, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/mask-sensitive-log-data.html\\\">Help protect sensitive log\\n          data with masking</a>. </p>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#CreateLogAnomalyDetectorRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"logGroupArnList\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogGroupArnList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An array containing the ARN of the log group that this anomaly detector will watch. You\\n      can specify only one log group ARN.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"detectorName\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DetectorName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A name for this anomaly detector.</p>\"\n                    }\n                },\n                \"evaluationFrequency\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#EvaluationFrequency\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies how often the anomaly detector is to run and look for anomalies. Set this value\\n      according to the frequency that the log group receives new logs. For example, if the log group\\n      receives new log events every 10 minutes, then 15 minutes might be a good setting for\\n        <code>evaluationFrequency</code> .</p>\"\n                    }\n                },\n                \"filterPattern\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#FilterPattern\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>You can use this parameter to limit the anomaly detection model to examine only log events\\n      that match the pattern you specify here. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/FilterAndPatternSyntax.html\\\">Filter and Pattern\\n        Syntax</a>.</p>\"\n                    }\n                },\n                \"kmsKeyId\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DetectorKmsKeyArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Optionally assigns a KMS key to secure this anomaly detector and its\\n      findings. If a key is assigned, the anomalies found and the model used by this detector are\\n      encrypted at rest with the key. If a key is assigned to an anomaly detector, a user must have\\n      permissions for both this key and for the anomaly detector to retrieve information about the\\n      anomalies that it finds.</p>\\n         <p> Make sure the value provided is a valid KMS key ARN. For more information\\n      about using a KMS key and to see the required IAM policy, see\\n        <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/LogsAnomalyDetection-KMS.html\\\">Use a KMS key with an anomaly detector</a>.</p>\"\n                    }\n                },\n                \"anomalyVisibilityTime\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#AnomalyVisibilityTime\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of days to have visibility on an anomaly. After this time period has elapsed\\n      for an anomaly, it will be automatically baselined and the anomaly detector will treat new\\n      occurrences of a similar anomaly as normal. Therefore, if you do not correct the cause of an\\n      anomaly during the time period specified in <code>anomalyVisibilityTime</code>, it will be\\n      considered normal going forward and will not be detected as an anomaly.</p>\"\n                    }\n                },\n                \"tags\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Tags\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An optional list of key-value pairs to associate with the resource.</p>\\n         <p>For more information about tagging, see <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html\\\">Tagging Amazon Web Services resources</a>\\n         </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#CreateLogAnomalyDetectorResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"anomalyDetectorArn\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#AnomalyDetectorArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the log anomaly detector that you just created.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#CreateLogGroup\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#CreateLogGroupRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#OperationAbortedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ResourceAlreadyExistsException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates a log group with the specified name. You can create up to 1,000,000 log groups\\n      per Region per account.</p>\\n         <p>You must use the following guidelines when naming a log group:</p>\\n         <ul>\\n            <li>\\n               <p>Log group names must be unique within a Region for an Amazon Web Services\\n          account.</p>\\n            </li>\\n            <li>\\n               <p>Log group names can be between 1 and 512 characters long.</p>\\n            </li>\\n            <li>\\n               <p>Log group names consist of the following characters: a-z, A-Z, 0-9, '_'\\n          (underscore), '-' (hyphen), '/' (forward slash), '.' (period), and '#' (number\\n          sign)</p>\\n            </li>\\n            <li>\\n               <p>Log group names can't start with the string <code>aws/</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>When you create a log group, by default the log events in the log group do not expire.\\n      To set a retention policy so that events expire and are deleted after a specified time, use\\n        <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutRetentionPolicy.html\\\">PutRetentionPolicy</a>.</p>\\n         <p>If you associate an KMS key with the log group, ingested data is\\n      encrypted using the KMS key. This association is stored as long as the data\\n      encrypted with the KMS key is still within CloudWatch Logs. This enables\\n        CloudWatch Logs to decrypt this data whenever it is requested.</p>\\n         <p>If you attempt to associate a KMS key with the log group but the KMS key does not exist or the KMS key is disabled, you receive an\\n        <code>InvalidParameterException</code> error. </p>\\n         <important>\\n            <p>CloudWatch Logs supports only symmetric KMS keys. Do not associate an\\n        asymmetric KMS key with your log group. For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/symmetric-asymmetric.html\\\">Using\\n          Symmetric and Asymmetric Keys</a>.</p>\\n         </important>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#CreateLogGroupRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"logGroupName\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogGroupName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A name for the log group.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"kmsKeyId\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#KmsKeyId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the KMS key to use when encrypting log\\n      data. For more information, see <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html#arn-syntax-kms\\\">Amazon Resource\\n        Names</a>.</p>\"\n                    }\n                },\n                \"tags\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Tags\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The key-value pairs to use for the tags.</p>\\n         <p>You can grant users access to certain log groups while preventing them from accessing\\n      other log groups. To do so, tag your groups and use IAM policies that refer to\\n      those tags. To assign tags when you create a log group, you must have either the\\n        <code>logs:TagResource</code> or <code>logs:TagLogGroup</code> permission. For more\\n      information about tagging, see <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html\\\">Tagging Amazon Web Services resources</a>. For\\n      more information about using tags to control access, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_tags.html\\\">Controlling access to Amazon Web Services\\n        resources using tags</a>.</p>\"\n                    }\n                },\n                \"logGroupClass\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogGroupClass\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter to specify the log group class for this log group. There are three\\n      classes:</p>\\n         <ul>\\n            <li>\\n               <p>The <code>Standard</code> log class supports all CloudWatch Logs features.</p>\\n            </li>\\n            <li>\\n               <p>The <code>Infrequent Access</code> log class supports a subset of CloudWatch Logs\\n          features and incurs lower costs.</p>\\n            </li>\\n            <li>\\n               <p>Use the <code>Delivery</code> log class only for delivering Lambda\\n          logs to store in Amazon S3 or Amazon Data Firehose. Log events in log groups in\\n          the Delivery class are kept in CloudWatch Logs for only one day. This log class doesn't\\n          offer rich CloudWatch Logs capabilities such as CloudWatch Logs Insights\\n          queries.</p>\\n            </li>\\n         </ul>\\n         <p>If you omit this parameter, the default of <code>STANDARD</code> is used.</p>\\n         <important>\\n            <p>The value of <code>logGroupClass</code> can't be changed after a log group is\\n        created.</p>\\n         </important>\\n         <p>For details about the features supported by each class, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CloudWatch_Logs_Log_Classes.html\\\">Log classes</a>\\n         </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#CreateLogStream\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#CreateLogStreamRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ResourceAlreadyExistsException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates a log stream for the specified log group. A log stream is a sequence of log\\n      events that originate from a single source, such as an application instance or a resource that\\n      is being monitored.</p>\\n         <p>There is no limit on the number of log streams that you can create for a log group.\\n      There is a limit of 50 TPS on <code>CreateLogStream</code> operations, after which\\n      transactions are throttled.</p>\\n         <p>You must use the following guidelines when naming a log stream:</p>\\n         <ul>\\n            <li>\\n               <p>Log stream names must be unique within the log group.</p>\\n            </li>\\n            <li>\\n               <p>Log stream names can be between 1 and 512 characters long.</p>\\n            </li>\\n            <li>\\n               <p>Don't use ':' (colon) or '*' (asterisk) characters.</p>\\n            </li>\\n         </ul>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#CreateLogStreamRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"logGroupName\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogGroupName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the log group.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"logStreamName\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogStreamName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the log stream.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DashboardViewerPrincipals\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#Arn\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#Data\": {\n            \"type\": \"blob\"\n        },\n        \"com.amazonaws.cloudwatchlogs#DataAlreadyAcceptedException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"expectedSequenceToken\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#SequenceToken\"\n                },\n                \"message\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Message\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The event was already logged.</p>\\n         <important>\\n            <p>\\n               <code>PutLogEvents</code> actions are now always accepted and never return\\n          <code>DataAlreadyAcceptedException</code> regardless of whether a given batch of log\\n        events has already been accepted. </p>\\n         </important>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DataProtectionPolicyDocument\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.cloudwatchlogs#DataProtectionStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ACTIVATED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ACTIVATED\"\n                    }\n                },\n                \"DELETED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DELETED\"\n                    }\n                },\n                \"ARCHIVED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ARCHIVED\"\n                    }\n                },\n                \"DISABLED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DISABLED\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DateTimeConverter\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"source\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Source\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The key to apply the date conversion to.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"target\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Target\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The JSON field to store the result in.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"targetFormat\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#TargetFormat\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The datetime format to use for the converted data in the target field.</p>\\n         <p>If you omit this, the default of <code> yyyy-MM-dd'T'HH:mm:ss.SSS'Z</code> is used.</p>\"\n                    }\n                },\n                \"matchPatterns\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#MatchPatterns\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of patterns to match against the <code>source</code> field.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"sourceTimezone\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#SourceTimezone\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time zone of the source field. If you omit this, the default used is the UTC\\n      zone.</p>\"\n                    }\n                },\n                \"targetTimezone\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#TargetTimezone\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time zone of the target field. If you omit this, the default used is the UTC\\n      zone.</p>\"\n                    }\n                },\n                \"locale\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Locale\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The locale of the source field. If you omit this, the default of <code>locale.ROOT</code>\\n      is used.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This processor converts a datetime string into a format that you specify. </p>\\n         <p>For more information about this processor including examples, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CloudWatch-Logs-Transformation.html#CloudWatch-Logs-Transformation-datetimeConverter\\\"> datetimeConverter</a> in the <i>CloudWatch Logs User\\n      Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#Days\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The number of days to retain the log events in the specified log group. Possible values\\n      are: 1, 3, 5, 7, 14, 30, 60, 90, 120, 150, 180, 365, 400, 545, 731, 1096, 1827, 2192, 2557,\\n      2922, 3288, and 3653.</p>\\n         <p>To set a log group so that its log events do not expire, use <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_DeleteRetentionPolicy.html\\\">DeleteRetentionPolicy</a>. </p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DefaultValue\": {\n            \"type\": \"double\"\n        },\n        \"com.amazonaws.cloudwatchlogs#DeleteAccountPolicy\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#DeleteAccountPolicyRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#OperationAbortedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes a CloudWatch Logs account policy. This stops the account-wide policy from\\n      applying to log groups in the account. If you delete a data protection policy or subscription\\n      filter policy, any log-group level policies of those types remain in effect.</p>\\n         <p>To use this operation, you must be signed on with the correct permissions depending on the\\n      type of policy that you are deleting.</p>\\n         <ul>\\n            <li>\\n               <p>To delete a data protection policy, you must have the\\n            <code>logs:DeleteDataProtectionPolicy</code> and <code>logs:DeleteAccountPolicy</code>\\n          permissions.</p>\\n            </li>\\n            <li>\\n               <p>To delete a subscription filter policy, you must have the\\n            <code>logs:DeleteSubscriptionFilter</code> and <code>logs:DeleteAccountPolicy</code>\\n          permissions.</p>\\n            </li>\\n            <li>\\n               <p>To delete a transformer policy, you must have the <code>logs:DeleteTransformer</code>\\n          and <code>logs:DeleteAccountPolicy</code> permissions.</p>\\n            </li>\\n            <li>\\n               <p>To delete a field index policy, you must have the <code>logs:DeleteIndexPolicy</code>\\n          and <code>logs:DeleteAccountPolicy</code> permissions.</p>\\n            </li>\\n         </ul>\\n         <p>If you delete a field index policy, the indexing of the log events that happened before\\n      you deleted the policy will still be used for up to 30 days to improve CloudWatch Logs\\n      Insights queries.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DeleteAccountPolicyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"policyName\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#PolicyName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the policy to delete.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"policyType\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#PolicyType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of policy to delete.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DeleteDataProtectionPolicy\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#DeleteDataProtectionPolicyRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#OperationAbortedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the data protection policy from the specified log group. </p>\\n         <p>For more information about data protection policies, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutDataProtectionPolicy.html\\\">PutDataProtectionPolicy</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DeleteDataProtectionPolicyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"logGroupIdentifier\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogGroupIdentifier\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name or ARN of the log group that you want to delete the data protection policy\\n      for.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DeleteDelivery\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#DeleteDeliveryRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ConflictException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceQuotaExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ThrottlingException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes a <i>delivery</i>. A delivery is a connection between a logical\\n        <i>delivery source</i> and a logical <i>delivery\\n      destination</i>. Deleting a delivery only deletes the connection between the delivery\\n      source and delivery destination. It does not delete the delivery destination or the delivery\\n      source.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DeleteDeliveryDestination\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#DeleteDeliveryDestinationRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ConflictException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceQuotaExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ThrottlingException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes a <i>delivery destination</i>. A delivery is a connection between a\\n      logical <i>delivery source</i> and a logical <i>delivery\\n        destination</i>.</p>\\n         <p>You can't delete a delivery destination if any current deliveries are associated with it.\\n      To find whether any deliveries are associated with this delivery destination, use the <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_DescribeDeliveries.html\\\">DescribeDeliveries</a> operation and check the <code>deliveryDestinationArn</code>\\n      field in the results.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DeleteDeliveryDestinationPolicy\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#DeleteDeliveryDestinationPolicyRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ConflictException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes a delivery destination policy. For more information about these policies, see\\n        <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutDeliveryDestinationPolicy.html\\\">PutDeliveryDestinationPolicy</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DeleteDeliveryDestinationPolicyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"deliveryDestinationName\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DeliveryDestinationName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the delivery destination that you want to delete the policy for.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DeleteDeliveryDestinationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"name\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DeliveryDestinationName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the delivery destination that you want to delete. You can find a list of\\n      delivery destination names by using the <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_DescribeDeliveryDestinations.html\\\">DescribeDeliveryDestinations</a> operation.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DeleteDeliveryRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"id\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DeliveryId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The unique ID of the delivery to delete. You can find the ID of a delivery with the <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_DescribeDeliveries.html\\\">DescribeDeliveries</a> operation.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DeleteDeliverySource\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#DeleteDeliverySourceRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ConflictException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceQuotaExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ThrottlingException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes a <i>delivery source</i>. A delivery is a connection between a\\n      logical <i>delivery source</i> and a logical <i>delivery\\n        destination</i>.</p>\\n         <p>You can't delete a delivery source if any current deliveries are associated with it. To\\n      find whether any deliveries are associated with this delivery source, use the <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_DescribeDeliveries.html\\\">DescribeDeliveries</a> operation and check the <code>deliverySourceName</code> field in\\n      the results.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DeleteDeliverySourceRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"name\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DeliverySourceName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the delivery source that you want to delete.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DeleteDestination\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#DeleteDestinationRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#OperationAbortedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the specified destination, and eventually disables all the subscription filters\\n      that publish to it. This operation does not delete the physical resource encapsulated by the\\n      destination.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DeleteDestinationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"destinationName\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DestinationName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the destination.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DeleteIndexPolicy\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#DeleteIndexPolicyRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#DeleteIndexPolicyResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#OperationAbortedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes a log-group level field index policy that was applied to a single log group. The\\n      indexing of the log events that happened before you delete the policy will still be used for\\n      as many as 30 days to improve CloudWatch Logs Insights queries.</p>\\n         <p>You can't use this operation to delete an account-level index policy. Instead, use <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_DeleteAccountPolicy.html\\\">DeletAccountPolicy</a>.</p>\\n         <p>If you delete a log-group level field index policy and there is an account-level field\\n      index policy, in a few minutes the log group begins using that account-wide policy to index\\n      new incoming log events. </p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DeleteIndexPolicyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"logGroupIdentifier\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogGroupIdentifier\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The log group to delete the index policy for. You can specify either the name or the ARN\\n      of the log group.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DeleteIndexPolicyResponse\": {\n            \"type\": \"structure\",\n            \"members\": {},\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DeleteIntegration\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#DeleteIntegrationRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#DeleteIntegrationResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the integration between CloudWatch Logs and OpenSearch Service. If your\\n      integration has active vended logs dashboards, you must specify <code>true</code> for the\\n        <code>force</code> parameter, otherwise the operation will fail. If you delete the\\n      integration by setting <code>force</code> to <code>true</code>, all your vended logs\\n      dashboards powered by OpenSearch Service will be deleted and the data that was on them will no\\n      longer be accessible.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DeleteIntegrationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"integrationName\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#IntegrationName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the integration to delete. To find the name of your integration, use <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_ListIntegrations.html\\\">ListIntegrations</a>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"force\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Force\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Specify <code>true</code> to force the deletion of the integration even if vended logs\\n      dashboards currently exist.</p>\\n         <p>The default is <code>false</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DeleteIntegrationResponse\": {\n            \"type\": \"structure\",\n            \"members\": {},\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DeleteKeys\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"withKeys\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DeleteWithKeys\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The list of keys to delete.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This processor deletes entries from a log event. These entries are key-value pairs. </p>\\n         <p>For more information about this processor including examples, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CloudWatch-Logs-Transformation.html#CloudWatch-Logs-Transformation-deleteKeys\\\"> deleteKeys</a> in the <i>CloudWatch Logs User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DeleteLogAnomalyDetector\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#DeleteLogAnomalyDetectorRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#OperationAbortedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the specified CloudWatch Logs anomaly detector.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DeleteLogAnomalyDetectorRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"anomalyDetectorArn\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#AnomalyDetectorArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the anomaly detector to delete. You can find the ARNs of log anomaly detectors\\n      in your account by using the <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_ListLogAnomalyDetectors.html\\\">ListLogAnomalyDetectors</a> operation.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DeleteLogGroup\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#DeleteLogGroupRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#OperationAbortedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the specified log group and permanently deletes all the archived log events\\n      associated with the log group.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DeleteLogGroupRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"logGroupName\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogGroupName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the log group.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DeleteLogStream\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#DeleteLogStreamRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#OperationAbortedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the specified log stream and permanently deletes all the archived log events\\n      associated with the log stream.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DeleteLogStreamRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"logGroupName\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogGroupName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the log group.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"logStreamName\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogStreamName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the log stream.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DeleteMetricFilter\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#DeleteMetricFilterRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#OperationAbortedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the specified metric filter.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DeleteMetricFilterRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"logGroupName\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogGroupName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the log group.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"filterName\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#FilterName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the metric filter.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DeleteQueryDefinition\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#DeleteQueryDefinitionRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#DeleteQueryDefinitionResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes a saved CloudWatch Logs Insights query definition. A query definition contains\\n      details about a saved CloudWatch Logs Insights query.</p>\\n         <p>Each <code>DeleteQueryDefinition</code> operation can delete one query definition.</p>\\n         <p>You must have the <code>logs:DeleteQueryDefinition</code> permission to be able to perform\\n      this operation.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DeleteQueryDefinitionRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"queryDefinitionId\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#QueryId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the query definition that you want to delete. You can use <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_DescribeQueryDefinitions.html\\\">DescribeQueryDefinitions</a> to retrieve the IDs of your saved query\\n      definitions.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DeleteQueryDefinitionResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"success\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Success\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>A value of TRUE indicates that the operation succeeded. FALSE indicates that the operation\\n      failed.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DeleteResourcePolicy\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#DeleteResourcePolicyRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#OperationAbortedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes a resource policy from this account. This revokes the access of the identities\\n      in that policy to put log events to this account.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DeleteResourcePolicyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"policyName\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#PolicyName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the policy to be revoked. This parameter is required.</p>\"\n                    }\n                },\n                \"resourceArn\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Arn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the CloudWatch Logs resource for which the resource policy needs to be\\n      deleted</p>\"\n                    }\n                },\n                \"expectedRevisionId\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ExpectedRevisionId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The expected revision ID of the resource policy. Required when deleting a resource-scoped\\n      policy to prevent concurrent modifications.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DeleteRetentionPolicy\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#DeleteRetentionPolicyRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#OperationAbortedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the specified retention policy.</p>\\n         <p>Log events do not expire if they belong to log groups without a retention\\n      policy.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DeleteRetentionPolicyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"logGroupName\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogGroupName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the log group.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DeleteSubscriptionFilter\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#DeleteSubscriptionFilterRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#OperationAbortedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the specified subscription filter.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DeleteSubscriptionFilterRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"logGroupName\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogGroupName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the log group.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"filterName\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#FilterName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the subscription filter.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DeleteTransformer\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#DeleteTransformerRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InvalidOperationException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#OperationAbortedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the log transformer for the specified log group. As soon as you do this, the\\n      transformation of incoming log events according to that transformer stops. If this account has\\n      an account-level transformer that applies to this log group, the log group begins using that\\n      account-level transformer when this log-group level transformer is deleted.</p>\\n         <p>After you delete a transformer, be sure to edit any metric filters or subscription filters\\n      that relied on the transformed versions of the log events.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DeleteTransformerRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"logGroupIdentifier\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogGroupIdentifier\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify either the name or ARN of the log group to delete the transformer for. If the log\\n      group is in a source account and you are using a monitoring account, you must use the log\\n      group ARN.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DeleteWithKeys\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#WithKey\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 5\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#Delimiter\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 2\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#Deliveries\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#Delivery\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#Delivery\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"id\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DeliveryId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The unique ID that identifies this delivery in your account.</p>\"\n                    }\n                },\n                \"arn\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Arn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) that uniquely identifies this delivery.</p>\"\n                    }\n                },\n                \"deliverySourceName\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DeliverySourceName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the delivery source that is associated with this delivery.</p>\"\n                    }\n                },\n                \"deliveryDestinationArn\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Arn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the delivery destination that is associated with this delivery.</p>\"\n                    }\n                },\n                \"deliveryDestinationType\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DeliveryDestinationType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Displays whether the delivery destination associated with this delivery is CloudWatch Logs, Amazon S3, Firehose, or X-Ray.</p>\"\n                    }\n                },\n                \"recordFields\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#RecordFields\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The record fields used in this delivery.</p>\"\n                    }\n                },\n                \"fieldDelimiter\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#FieldDelimiter\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The field delimiter that is used between record fields when the final output format of a\\n      delivery is in <code>Plain</code>, <code>W3C</code>, or <code>Raw</code> format.</p>\"\n                    }\n                },\n                \"s3DeliveryConfiguration\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#S3DeliveryConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>This structure contains delivery configurations that apply only when the delivery\\n      destination resource is an S3 bucket.</p>\"\n                    }\n                },\n                \"tags\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Tags\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags that have been assigned to this delivery.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This structure contains information about one <i>delivery</i> in your\\n      account. </p>\\n         <p>A delivery is a connection between a logical <i>delivery source</i> and a\\n      logical <i>delivery destination</i>.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_CreateDelivery.html\\\">CreateDelivery</a>.</p>\\n         <p>To update an existing delivery configuration, use <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_UpdateDeliveryConfiguration.html\\\">UpdateDeliveryConfiguration</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DeliveryDestination\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"name\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DeliveryDestinationName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of this delivery destination.</p>\"\n                    }\n                },\n                \"arn\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Arn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) that uniquely identifies this delivery destination.</p>\"\n                    }\n                },\n                \"deliveryDestinationType\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DeliveryDestinationType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Displays whether this delivery destination is CloudWatch Logs, Amazon S3,\\n        Firehose, or X-Ray.</p>\"\n                    }\n                },\n                \"outputFormat\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#OutputFormat\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The format of the logs that are sent to this delivery destination. </p>\"\n                    }\n                },\n                \"deliveryDestinationConfiguration\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DeliveryDestinationConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A structure that contains the ARN of the Amazon Web Services resource that will receive the\\n      logs.</p>\"\n                    }\n                },\n                \"tags\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Tags\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags that have been assigned to this delivery destination.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This structure contains information about one <i>delivery destination</i> in\\n      your account. A delivery destination is an Amazon Web Services resource that represents an\\n        Amazon Web Services service that logs can be sent to. CloudWatch Logs, Amazon S3,\\n        Firehose, and X-Ray are supported as delivery destinations.</p>\\n         <p>To configure logs delivery between a supported Amazon Web Services service and a\\n      destination, you must do the following:</p>\\n         <ul>\\n            <li>\\n               <p>Create a delivery source, which is a logical object that represents the resource that\\n          is actually sending the logs. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutDeliverySource.html\\\">PutDeliverySource</a>.</p>\\n            </li>\\n            <li>\\n               <p>Create a <i>delivery destination</i>, which is a logical object that\\n          represents the actual delivery destination. </p>\\n            </li>\\n            <li>\\n               <p>If you are delivering logs cross-account, you must use <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutDeliveryDestinationPolicy.html\\\">PutDeliveryDestinationPolicy</a> in the destination account to assign an IAM policy to the destination. This policy allows delivery to that destination.\\n        </p>\\n            </li>\\n            <li>\\n               <p>Create a <i>delivery</i> by pairing exactly one delivery source and one\\n          delivery destination. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_CreateDelivery.html\\\">CreateDelivery</a>.</p>\\n            </li>\\n         </ul>\\n         <p>You can configure a single delivery source to send logs to multiple destinations by\\n      creating multiple deliveries. You can also create multiple deliveries to configure multiple\\n      delivery sources to send logs to the same delivery destination.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DeliveryDestinationConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"destinationResourceArn\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Arn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the Amazon Web Services destination that this delivery destination represents.\\n      That Amazon Web Services destination can be a log group in CloudWatch Logs, an Amazon S3 bucket, or a delivery stream in Firehose.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A structure that contains information about one logs delivery destination.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DeliveryDestinationName\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 60\n                },\n                \"smithy.api#pattern\": \"^[\\\\w-]*$\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DeliveryDestinationPolicy\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 51200\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DeliveryDestinationType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"S3\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"S3\"\n                    }\n                },\n                \"CWL\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"CWL\"\n                    }\n                },\n                \"FH\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"FH\"\n                    }\n                },\n                \"XRAY\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"XRAY\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DeliveryDestinationTypes\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#DeliveryDestinationType\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 4\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DeliveryDestinations\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#DeliveryDestination\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DeliveryId\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 64\n                },\n                \"smithy.api#pattern\": \"^[0-9A-Za-z]+$\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DeliverySource\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"name\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DeliverySourceName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The unique name of the delivery source.</p>\"\n                    }\n                },\n                \"arn\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Arn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) that uniquely identifies this delivery source.</p>\"\n                    }\n                },\n                \"resourceArns\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ResourceArns\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>This array contains the ARN of the Amazon Web Services resource that sends logs and is\\n      represented by this delivery source. Currently, only one ARN can be in the array.</p>\"\n                    }\n                },\n                \"service\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Service\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services service that is sending logs.</p>\"\n                    }\n                },\n                \"logType\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of log that the source is sending. For valid values for this parameter, see the\\n      documentation for the source service.</p>\"\n                    }\n                },\n                \"tags\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Tags\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags that have been assigned to this delivery source.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This structure contains information about one <i>delivery source</i> in your\\n      account. A delivery source is an Amazon Web Services resource that sends logs to an Amazon Web Services destination. The destination can be CloudWatch Logs, Amazon S3, or\\n        Firehose.</p>\\n         <p>Only some Amazon Web Services services support being configured as a delivery source. These\\n      services are listed as <b>Supported [V2 Permissions]</b> in the\\n      table at <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/AWS-logs-and-resource-policy.html\\\">Enabling logging from\\n          Amazon Web Services services.</a>\\n         </p>\\n         <p>To configure logs delivery between a supported Amazon Web Services service and a\\n      destination, you must do the following:</p>\\n         <ul>\\n            <li>\\n               <p>Create a delivery source, which is a logical object that represents the resource that\\n          is actually sending the logs. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutDeliverySource.html\\\">PutDeliverySource</a>.</p>\\n            </li>\\n            <li>\\n               <p>Create a <i>delivery destination</i>, which is a logical object that\\n          represents the actual delivery destination. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutDeliveryDestination.html\\\">PutDeliveryDestination</a>.</p>\\n            </li>\\n            <li>\\n               <p>If you are delivering logs cross-account, you must use <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutDeliveryDestinationPolicy.html\\\">PutDeliveryDestinationPolicy</a> in the destination account to assign an IAM policy to the destination. This policy allows delivery to that destination.\\n        </p>\\n            </li>\\n            <li>\\n               <p>Create a <i>delivery</i> by pairing exactly one delivery source and one\\n          delivery destination. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_CreateDelivery.html\\\">CreateDelivery</a>.</p>\\n            </li>\\n         </ul>\\n         <p>You can configure a single delivery source to send logs to multiple destinations by\\n      creating multiple deliveries. You can also create multiple deliveries to configure multiple\\n      delivery sources to send logs to the same delivery destination.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DeliverySourceName\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 60\n                },\n                \"smithy.api#pattern\": \"^[\\\\w-]*$\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DeliverySources\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#DeliverySource\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DeliverySuffixPath\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 256\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#Descending\": {\n            \"type\": \"boolean\"\n        },\n        \"com.amazonaws.cloudwatchlogs#DescribeAccountPolicies\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#DescribeAccountPoliciesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#DescribeAccountPoliciesResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#OperationAbortedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns a list of all CloudWatch Logs account policies in the account.</p>\\n         <p>To use this operation, you must be signed on with the correct permissions depending on the\\n      type of policy that you are retrieving information for.</p>\\n         <ul>\\n            <li>\\n               <p>To see data protection policies, you must have the\\n            <code>logs:GetDataProtectionPolicy</code> and <code>logs:DescribeAccountPolicies</code>\\n          permissions.</p>\\n            </li>\\n            <li>\\n               <p>To see subscription filter policies, you must have the\\n            <code>logs:DescribeSubscriptionFilters</code> and\\n            <code>logs:DescribeAccountPolicies</code> permissions.</p>\\n            </li>\\n            <li>\\n               <p>To see transformer policies, you must have the <code>logs:GetTransformer</code> and\\n            <code>logs:DescribeAccountPolicies</code> permissions.</p>\\n            </li>\\n            <li>\\n               <p>To see field index policies, you must have the <code>logs:DescribeIndexPolicies</code>\\n          and <code>logs:DescribeAccountPolicies</code> permissions.</p>\\n            </li>\\n         </ul>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DescribeAccountPoliciesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"policyType\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#PolicyType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter to limit the returned policies to only the policies that match the\\n      policy type that you specify.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"policyName\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#PolicyName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter to limit the returned policies to only the policy with the name that\\n      you specify.</p>\"\n                    }\n                },\n                \"accountIdentifiers\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#AccountIds\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If you are using an account that is set up as a monitoring account for CloudWatch\\n      unified cross-account observability, you can use this to specify the account ID of a source\\n      account. If you do, the operation returns the account policy for the specified account.\\n      Currently, you can specify only one account ID in this parameter.</p>\\n         <p>If you omit this parameter, only the policy in the current account is returned.</p>\"\n                    }\n                },\n                \"nextToken\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next set of items to return. (You received this token from a previous\\n      call.)</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DescribeAccountPoliciesResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"accountPolicies\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#AccountPolicies\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An array of structures that contain information about the CloudWatch Logs account\\n      policies that match the specified filters.</p>\"\n                    }\n                },\n                \"nextToken\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token to use when requesting the next set of items. The token expires after 24\\n      hours.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DescribeConfigurationTemplates\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#DescribeConfigurationTemplatesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#DescribeConfigurationTemplatesResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ThrottlingException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Use this operation to return the valid and default values that are used when creating\\n      delivery sources, delivery destinations, and deliveries. For more information about\\n      deliveries, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_CreateDelivery.html\\\">CreateDelivery</a>.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"nextToken\",\n                    \"outputToken\": \"nextToken\",\n                    \"items\": \"configurationTemplates\",\n                    \"pageSize\": \"limit\"\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DescribeConfigurationTemplatesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"service\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Service\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter to filter the response to include only the configuration templates that\\n      apply to the Amazon Web Services service that you specify here.</p>\"\n                    }\n                },\n                \"logTypes\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogTypes\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter to filter the response to include only the configuration templates that\\n      apply to the log types that you specify here.</p>\"\n                    }\n                },\n                \"resourceTypes\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ResourceTypes\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter to filter the response to include only the configuration templates that\\n      apply to the resource types that you specify here.</p>\"\n                    }\n                },\n                \"deliveryDestinationTypes\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DeliveryDestinationTypes\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter to filter the response to include only the configuration templates that\\n      apply to the delivery destination types that you specify here.</p>\"\n                    }\n                },\n                \"nextToken\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#NextToken\"\n                },\n                \"limit\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DescribeLimit\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter to limit the number of configuration templates that are returned in the\\n      response.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DescribeConfigurationTemplatesResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"configurationTemplates\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ConfigurationTemplates\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An array of objects, where each object describes one configuration template that matches\\n      the filters that you specified in the request.</p>\"\n                    }\n                },\n                \"nextToken\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#NextToken\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DescribeDeliveries\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#DescribeDeliveriesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#DescribeDeliveriesResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceQuotaExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ThrottlingException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Retrieves a list of the deliveries that have been created in the account.</p>\\n         <p>A <i>delivery</i> is a connection between a <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutDeliverySource.html\\\">\\n               <i>delivery\\n          source</i>\\n            </a> and a <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutDeliveryDestination.html\\\">\\n               <i>delivery destination</i>\\n            </a>.</p>\\n         <p>A delivery source represents an Amazon Web Services resource that sends logs to an logs\\n      delivery destination. The destination can be CloudWatch Logs, Amazon S3, Firehose or X-Ray. Only some Amazon Web Services services support being\\n      configured as a delivery source. These services are listed in <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/AWS-logs-and-resource-policy.html\\\">Enable logging from\\n          Amazon Web Services services.</a>\\n         </p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"nextToken\",\n                    \"outputToken\": \"nextToken\",\n                    \"items\": \"deliveries\",\n                    \"pageSize\": \"limit\"\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DescribeDeliveriesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"nextToken\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#NextToken\"\n                },\n                \"limit\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DescribeLimit\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Optionally specify the maximum number of deliveries to return in the response.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DescribeDeliveriesResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"deliveries\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Deliveries\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An array of structures. Each structure contains information about one delivery in the\\n      account.</p>\"\n                    }\n                },\n                \"nextToken\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#NextToken\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DescribeDeliveryDestinations\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#DescribeDeliveryDestinationsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#DescribeDeliveryDestinationsResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceQuotaExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ThrottlingException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Retrieves a list of the delivery destinations that have been created in the\\n      account.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"nextToken\",\n                    \"outputToken\": \"nextToken\",\n                    \"items\": \"deliveryDestinations\",\n                    \"pageSize\": \"limit\"\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DescribeDeliveryDestinationsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"nextToken\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#NextToken\"\n                },\n                \"limit\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DescribeLimit\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Optionally specify the maximum number of delivery destinations to return in the\\n      response.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DescribeDeliveryDestinationsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"deliveryDestinations\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DeliveryDestinations\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An array of structures. Each structure contains information about one delivery destination\\n      in the account.</p>\"\n                    }\n                },\n                \"nextToken\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#NextToken\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DescribeDeliverySources\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#DescribeDeliverySourcesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#DescribeDeliverySourcesResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceQuotaExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ThrottlingException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Retrieves a list of the delivery sources that have been created in the account.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"nextToken\",\n                    \"outputToken\": \"nextToken\",\n                    \"items\": \"deliverySources\",\n                    \"pageSize\": \"limit\"\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DescribeDeliverySourcesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"nextToken\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#NextToken\"\n                },\n                \"limit\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DescribeLimit\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Optionally specify the maximum number of delivery sources to return in the\\n      response.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DescribeDeliverySourcesResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"deliverySources\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DeliverySources\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An array of structures. Each structure contains information about one delivery source in\\n      the account.</p>\"\n                    }\n                },\n                \"nextToken\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#NextToken\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DescribeDestinations\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#DescribeDestinationsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#DescribeDestinationsResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Lists all your destinations. The results are ASCII-sorted by destination\\n      name.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"nextToken\",\n                    \"outputToken\": \"nextToken\",\n                    \"items\": \"destinations\",\n                    \"pageSize\": \"limit\"\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DescribeDestinationsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DestinationNamePrefix\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DestinationName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The prefix to match. If you don't specify a value, no prefix filter is\\n      applied.</p>\"\n                    }\n                },\n                \"nextToken\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next set of items to return. (You received this token from a previous\\n      call.)</p>\"\n                    }\n                },\n                \"limit\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DescribeLimit\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of items returned. If you don't specify a value, the default maximum\\n      value of 50 items is used.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DescribeDestinationsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"destinations\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Destinations\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The destinations.</p>\"\n                    }\n                },\n                \"nextToken\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#NextToken\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DescribeExportTasks\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#DescribeExportTasksRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#DescribeExportTasksResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Lists the specified export tasks. You can list all your export tasks or filter the\\n      results based on task ID or task status.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DescribeExportTasksRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"taskId\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ExportTaskId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the export task. Specifying a task ID filters the results to one or zero\\n      export tasks.</p>\"\n                    }\n                },\n                \"statusCode\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ExportTaskStatusCode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The status code of the export task. Specifying a status code filters the results to\\n      zero or more export tasks.</p>\"\n                    }\n                },\n                \"nextToken\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next set of items to return. (You received this token from a previous\\n      call.)</p>\"\n                    }\n                },\n                \"limit\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DescribeLimit\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of items returned. If you don't specify a value, the default is up\\n      to 50 items.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DescribeExportTasksResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"exportTasks\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ExportTasks\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The export tasks.</p>\"\n                    }\n                },\n                \"nextToken\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#NextToken\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DescribeFieldIndexes\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#DescribeFieldIndexesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#DescribeFieldIndexesResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#OperationAbortedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns a list of custom and default field indexes which are discovered in log data. For\\n      more information about field index policies, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutIndexPolicy.html\\\">PutIndexPolicy</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DescribeFieldIndexesLogGroupIdentifiers\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#LogGroupIdentifier\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 100\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DescribeFieldIndexesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"logGroupIdentifiers\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DescribeFieldIndexesLogGroupIdentifiers\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An array containing the names or ARNs of the log groups that you want to retrieve field\\n      indexes for.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"nextToken\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#NextToken\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DescribeFieldIndexesResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"fieldIndexes\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#FieldIndexes\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An array containing the field index information.</p>\"\n                    }\n                },\n                \"nextToken\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#NextToken\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DescribeIndexPolicies\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#DescribeIndexPoliciesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#DescribeIndexPoliciesResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#OperationAbortedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns the field index policies of the specified log group. For more information about\\n      field index policies, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutIndexPolicy.html\\\">PutIndexPolicy</a>.</p>\\n         <p>If a specified log group has a log-group level index policy, that policy is returned by\\n      this operation.</p>\\n         <p>If a specified log group doesn't have a log-group level index policy, but an account-wide\\n      index policy applies to it, that account-wide policy is returned by this operation.</p>\\n         <p>To find information about only account-level policies, use <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_DescribeAccountPolicies.html\\\">DescribeAccountPolicies</a> instead.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DescribeIndexPoliciesLogGroupIdentifiers\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#LogGroupIdentifier\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 1\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DescribeIndexPoliciesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"logGroupIdentifiers\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DescribeIndexPoliciesLogGroupIdentifiers\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An array containing the name or ARN of the log group that you want to retrieve field index\\n      policies for.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"nextToken\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#NextToken\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DescribeIndexPoliciesResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"indexPolicies\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#IndexPolicies\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An array containing the field index policies.</p>\"\n                    }\n                },\n                \"nextToken\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#NextToken\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DescribeLimit\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 50\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DescribeLogGroups\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#DescribeLogGroupsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#DescribeLogGroupsResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns information about log groups. You can return all your log groups or filter the\\n      results by prefix. The results are ASCII-sorted by log group name.</p>\\n         <p>CloudWatch Logs doesn't support IAM policies that control access to the\\n        <code>DescribeLogGroups</code> action by using the\\n          <code>aws:ResourceTag/<i>key-name</i>\\n            </code> condition key. Other CloudWatch\\n      Logs actions do support the use of the\\n        <code>aws:ResourceTag/<i>key-name</i>\\n            </code> condition key to control access.\\n      For more information about using tags to control access, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_tags.html\\\">Controlling access to Amazon Web Services\\n        resources using tags</a>.</p>\\n         <p>If you are using CloudWatch cross-account observability, you can use this operation\\n      in a monitoring account and view data from the linked source accounts. For more information,\\n      see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-Unified-Cross-Account.html\\\">CloudWatch cross-account observability</a>.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"nextToken\",\n                    \"outputToken\": \"nextToken\",\n                    \"items\": \"logGroups\",\n                    \"pageSize\": \"limit\"\n                },\n                \"smithy.test#smokeTests\": [\n                    {\n                        \"id\": \"DescribeLogGroupsSuccess\",\n                        \"params\": {},\n                        \"vendorParams\": {\n                            \"region\": \"us-west-2\"\n                        },\n                        \"vendorParamsShape\": \"aws.test#AwsVendorParams\",\n                        \"expect\": {\n                            \"success\": {}\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DescribeLogGroupsLogGroupIdentifiers\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#LogGroupIdentifier\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 50\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DescribeLogGroupsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"accountIdentifiers\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#AccountIds\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>When <code>includeLinkedAccounts</code> is set to <code>true</code>, use this parameter to\\n      specify the list of accounts to search. You can specify as many as 20 account IDs in the\\n      array. </p>\"\n                    }\n                },\n                \"logGroupNamePrefix\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogGroupName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The prefix to match.</p>\\n         <note>\\n            <p>\\n               <code>logGroupNamePrefix</code> and <code>logGroupNamePattern</code> are mutually exclusive.\\n        Only one of these parameters can be passed. </p>\\n         </note>\"\n                    }\n                },\n                \"logGroupNamePattern\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogGroupNamePattern\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If you specify a string for this parameter, the operation returns only log groups that\\n      have names that match the string based on a case-sensitive substring search. For example, if\\n      you specify <code>DataLogs</code>, log groups named <code>DataLogs</code>,\\n        <code>aws/DataLogs</code>, and <code>GroupDataLogs</code> would match, but\\n        <code>datalogs</code>, <code>Data/log/s</code> and <code>Groupdata</code> would not\\n      match.</p>\\n         <p>If you specify <code>logGroupNamePattern</code> in your request, then only\\n        <code>arn</code>, <code>creationTime</code>, and <code>logGroupName</code> are included in\\n      the response. </p>\\n         <note>\\n            <p>\\n               <code>logGroupNamePattern</code> and <code>logGroupNamePrefix</code> are mutually exclusive.\\n        Only one of these parameters can be passed. </p>\\n         </note>\"\n                    }\n                },\n                \"nextToken\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next set of items to return. (You received this token from a previous\\n      call.)</p>\"\n                    }\n                },\n                \"limit\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DescribeLimit\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of items returned. If you don't specify a value, the default is up\\n      to 50 items.</p>\"\n                    }\n                },\n                \"includeLinkedAccounts\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#IncludeLinkedAccounts\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If you are using a monitoring account, set this to <code>true</code> to have the operation\\n      return log groups in the accounts listed in <code>accountIdentifiers</code>.</p>\\n         <p>If this parameter is set to <code>true</code> and <code>accountIdentifiers</code> contains\\n      a null value, the operation returns all log groups in the monitoring account and all log\\n      groups in all source accounts that are linked to the monitoring account. </p>\\n         <p>The default for this parameter is <code>false</code>.</p>\"\n                    }\n                },\n                \"logGroupClass\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogGroupClass\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter to limit the results to only those log groups in the specified log\\n      group class. If you omit this parameter, log groups of all classes can be returned.</p>\\n         <p>Specifies the log group class for this log group. There are three classes:</p>\\n         <ul>\\n            <li>\\n               <p>The <code>Standard</code> log class supports all CloudWatch Logs features.</p>\\n            </li>\\n            <li>\\n               <p>The <code>Infrequent Access</code> log class supports a subset of CloudWatch Logs\\n          features and incurs lower costs.</p>\\n            </li>\\n            <li>\\n               <p>Use the <code>Delivery</code> log class only for delivering Lambda\\n          logs to store in Amazon S3 or Amazon Data Firehose. Log events in log groups in\\n          the Delivery class are kept in CloudWatch Logs for only one day. This log class doesn't\\n          offer rich CloudWatch Logs capabilities such as CloudWatch Logs Insights\\n          queries.</p>\\n            </li>\\n         </ul>\\n         <p>For details about the features supported by each class, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CloudWatch_Logs_Log_Classes.html\\\">Log classes</a>\\n         </p>\"\n                    }\n                },\n                \"logGroupIdentifiers\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DescribeLogGroupsLogGroupIdentifiers\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this array to filter the list of log groups returned. If you specify this parameter,\\n      the only other filter that you can choose to specify is\\n      <code>includeLinkedAccounts</code>.</p>\\n         <p>If you are using this operation in a monitoring account, you can specify the ARNs of log\\n      groups in source accounts and in the monitoring account itself. If you are using this\\n      operation in an account that is not a cross-account monitoring account, you can specify only\\n      log group names in the same account as the operation.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DescribeLogGroupsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"logGroups\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogGroups\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An array of structures, where each structure contains the information about one log\\n      group.</p>\"\n                    }\n                },\n                \"nextToken\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#NextToken\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DescribeLogStreams\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#DescribeLogStreamsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#DescribeLogStreamsResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Lists the log streams for the specified log group. You can list all the log streams or\\n      filter the results by prefix. You can also control how the results are ordered.</p>\\n         <p>You can specify the log group to search by using either <code>logGroupIdentifier</code> or\\n        <code>logGroupName</code>. You must include one of these two parameters, but you can't\\n      include both. </p>\\n         <p>This operation has a limit of 25 transactions per second, after which transactions are\\n      throttled.</p>\\n         <p>If you are using CloudWatch cross-account observability, you can use this operation\\n      in a monitoring account and view data from the linked source accounts. For more information,\\n      see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-Unified-Cross-Account.html\\\">CloudWatch cross-account observability</a>.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"nextToken\",\n                    \"outputToken\": \"nextToken\",\n                    \"items\": \"logStreams\",\n                    \"pageSize\": \"limit\"\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DescribeLogStreamsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"logGroupName\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogGroupName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the log group.</p>\\n         <note>\\n            <p> You must include either <code>logGroupIdentifier</code> or <code>logGroupName</code>,\\n        but not both. </p>\\n         </note>\"\n                    }\n                },\n                \"logGroupIdentifier\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogGroupIdentifier\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify either the name or ARN of the log group to view. If the log group is in a source\\n      account and you are using a monitoring account, you must use the log group ARN.</p>\\n         <note>\\n            <p> You must include either <code>logGroupIdentifier</code> or <code>logGroupName</code>,\\n        but not both. </p>\\n         </note>\"\n                    }\n                },\n                \"logStreamNamePrefix\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogStreamName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The prefix to match.</p>\\n         <p>If <code>orderBy</code> is <code>LastEventTime</code>, you cannot specify this\\n      parameter.</p>\"\n                    }\n                },\n                \"orderBy\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#OrderBy\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If the value is <code>LogStreamName</code>, the results are ordered by log stream name.\\n      If the value is <code>LastEventTime</code>, the results are ordered by the event time. The\\n      default value is <code>LogStreamName</code>.</p>\\n         <p>If you order the results by event time, you cannot specify the\\n        <code>logStreamNamePrefix</code> parameter.</p>\\n         <p>\\n            <code>lastEventTimestamp</code> represents the time of the most recent log event in the\\n      log stream in CloudWatch Logs. This number is expressed as the number of milliseconds after\\n        <code>Jan 1, 1970 00:00:00 UTC</code>. <code>lastEventTimestamp</code> updates on an\\n      eventual consistency basis. It typically updates in less than an hour from ingestion, but in\\n      rare situations might take longer.</p>\"\n                    }\n                },\n                \"descending\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Descending\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If the value is true, results are returned in descending order. If the value is to\\n      false, results are returned in ascending order. The default value is false.</p>\"\n                    }\n                },\n                \"nextToken\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next set of items to return. (You received this token from a previous\\n      call.)</p>\"\n                    }\n                },\n                \"limit\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DescribeLimit\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of items returned. If you don't specify a value, the default is up\\n      to 50 items.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DescribeLogStreamsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"logStreams\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogStreams\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The log streams.</p>\"\n                    }\n                },\n                \"nextToken\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#NextToken\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DescribeMetricFilters\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#DescribeMetricFiltersRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#DescribeMetricFiltersResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Lists the specified metric filters. You can list all of the metric filters or filter\\n      the results by log name, prefix, metric name, or metric namespace. The results are\\n      ASCII-sorted by filter name.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"nextToken\",\n                    \"outputToken\": \"nextToken\",\n                    \"items\": \"metricFilters\",\n                    \"pageSize\": \"limit\"\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DescribeMetricFiltersRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"logGroupName\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogGroupName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the log group.</p>\"\n                    }\n                },\n                \"filterNamePrefix\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#FilterName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The prefix to match. CloudWatch Logs uses the value that you set here only if you also\\n      include the <code>logGroupName</code> parameter in your request.</p>\"\n                    }\n                },\n                \"nextToken\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next set of items to return. (You received this token from a previous\\n      call.)</p>\"\n                    }\n                },\n                \"limit\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DescribeLimit\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of items returned. If you don't specify a value, the default is up\\n      to 50 items.</p>\"\n                    }\n                },\n                \"metricName\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#MetricName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Filters results to include only those with the specified metric name. If you include\\n      this parameter in your request, you must also include the <code>metricNamespace</code>\\n      parameter.</p>\"\n                    }\n                },\n                \"metricNamespace\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#MetricNamespace\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Filters results to include only those in the specified namespace. If you include this\\n      parameter in your request, you must also include the <code>metricName</code>\\n      parameter.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DescribeMetricFiltersResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"metricFilters\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#MetricFilters\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The metric filters.</p>\"\n                    }\n                },\n                \"nextToken\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#NextToken\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DescribeQueries\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#DescribeQueriesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#DescribeQueriesResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns a list of CloudWatch Logs Insights queries that are scheduled, running, or have\\n      been run recently in this account. You can request all queries or limit it to queries of a\\n      specific log group or queries with a certain status.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DescribeQueriesMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DescribeQueriesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"logGroupName\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogGroupName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Limits the returned queries to only those for the specified log group.</p>\"\n                    }\n                },\n                \"status\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#QueryStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Limits the returned queries to only those that have the specified status. Valid values are\\n        <code>Cancelled</code>, <code>Complete</code>, <code>Failed</code>, <code>Running</code>,\\n      and <code>Scheduled</code>.</p>\"\n                    }\n                },\n                \"maxResults\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DescribeQueriesMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Limits the number of returned queries to the specified number.</p>\"\n                    }\n                },\n                \"nextToken\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#NextToken\"\n                },\n                \"queryLanguage\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#QueryLanguage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Limits the returned queries to only the queries that use the specified query\\n      language.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DescribeQueriesResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"queries\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#QueryInfoList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The list of queries that match the request.</p>\"\n                    }\n                },\n                \"nextToken\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#NextToken\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DescribeQueryDefinitions\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#DescribeQueryDefinitionsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#DescribeQueryDefinitionsResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This operation returns a paginated list of your saved CloudWatch Logs Insights query\\n      definitions. You can retrieve query definitions from the current account or from a source\\n      account that is linked to the current account.</p>\\n         <p>You can use the <code>queryDefinitionNamePrefix</code> parameter to limit the results to\\n      only the query definitions that have names that start with a certain string.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DescribeQueryDefinitionsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"queryLanguage\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#QueryLanguage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The query language used for this query. For more information about the query languages\\n      that CloudWatch Logs supports, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CWL_AnalyzeLogData_Languages.html\\\">Supported query\\n        languages</a>.</p>\"\n                    }\n                },\n                \"queryDefinitionNamePrefix\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#QueryDefinitionName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter to filter your results to only the query definitions that have names\\n      that start with the prefix you specify.</p>\"\n                    }\n                },\n                \"maxResults\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#QueryListMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Limits the number of returned query definitions to the specified number.</p>\"\n                    }\n                },\n                \"nextToken\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#NextToken\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DescribeQueryDefinitionsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"queryDefinitions\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#QueryDefinitionList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The list of query definitions that match your request.</p>\"\n                    }\n                },\n                \"nextToken\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#NextToken\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DescribeResourcePolicies\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#DescribeResourcePoliciesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#DescribeResourcePoliciesResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Lists the resource policies in this account.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DescribeResourcePoliciesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"nextToken\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#NextToken\"\n                },\n                \"limit\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DescribeLimit\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of resource policies to be displayed with one call of this\\n      API.</p>\"\n                    }\n                },\n                \"resourceArn\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Arn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the CloudWatch Logs resource for which to query the resource policy.</p>\"\n                    }\n                },\n                \"policyScope\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#PolicyScope\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the scope of the resource policy. Valid values are <code>ACCOUNT</code> or\\n        <code>RESOURCE</code>. When not specified, defaults to <code>ACCOUNT</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DescribeResourcePoliciesResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"resourcePolicies\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ResourcePolicies\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The resource policies that exist in this account.</p>\"\n                    }\n                },\n                \"nextToken\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#NextToken\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DescribeSubscriptionFilters\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#DescribeSubscriptionFiltersRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#DescribeSubscriptionFiltersResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Lists the subscription filters for the specified log group. You can list all the\\n      subscription filters or filter the results by prefix. The results are ASCII-sorted by filter\\n      name.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"nextToken\",\n                    \"outputToken\": \"nextToken\",\n                    \"items\": \"subscriptionFilters\",\n                    \"pageSize\": \"limit\"\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DescribeSubscriptionFiltersRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"logGroupName\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogGroupName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the log group.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"filterNamePrefix\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#FilterName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The prefix to match. If you don't specify a value, no prefix filter is\\n      applied.</p>\"\n                    }\n                },\n                \"nextToken\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next set of items to return. (You received this token from a previous\\n      call.)</p>\"\n                    }\n                },\n                \"limit\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DescribeLimit\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of items returned. If you don't specify a value, the default is up\\n      to 50 items.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DescribeSubscriptionFiltersResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"subscriptionFilters\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#SubscriptionFilters\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The subscription filters.</p>\"\n                    }\n                },\n                \"nextToken\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#NextToken\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#Description\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#Destination\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"destinationName\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DestinationName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the destination.</p>\"\n                    }\n                },\n                \"targetArn\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#TargetArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the physical target where the log events are\\n      delivered (for example, a Kinesis stream).</p>\"\n                    }\n                },\n                \"roleArn\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#RoleArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A role for impersonation, used when delivering log events to the target.</p>\"\n                    }\n                },\n                \"accessPolicy\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#AccessPolicy\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An IAM policy document that governs which Amazon Web Services accounts can create\\n      subscription filters against this destination.</p>\"\n                    }\n                },\n                \"arn\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Arn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of this destination.</p>\"\n                    }\n                },\n                \"creationTime\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The creation time of the destination, expressed as the number of milliseconds after Jan\\n      1, 1970 00:00:00 UTC.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents a cross-account destination that receives subscription log events.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DestinationArn\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DestinationField\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 128\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DestinationName\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 512\n                },\n                \"smithy.api#pattern\": \"^[^:*]*$\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#Destinations\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#Destination\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DetectorKmsKeyArn\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 256\n                },\n                \"smithy.api#pattern\": \"^arn:aws[a-z\\\\-]*:kms:[-a-z0-9]*:[0-9]*:key/[-a-z0-9]*$\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DetectorName\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#Dimensions\": {\n            \"type\": \"map\",\n            \"key\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#DimensionsKey\"\n            },\n            \"value\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#DimensionsValue\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DimensionsKey\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 255\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DimensionsValue\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 255\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DisassociateKmsKey\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#DisassociateKmsKeyRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#OperationAbortedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Disassociates the specified KMS key from the specified log group or\\n      from all CloudWatch Logs Insights query results in the account.</p>\\n         <p>When you use <code>DisassociateKmsKey</code>, you specify either the\\n        <code>logGroupName</code> parameter or the <code>resourceIdentifier</code> parameter. You\\n      can't specify both of those parameters in the same operation.</p>\\n         <ul>\\n            <li>\\n               <p>Specify the <code>logGroupName</code> parameter to stop using the KMS key to encrypt future log events ingested and stored in the log group.\\n          Instead, they will be encrypted with the default CloudWatch Logs method. The log events\\n          that were ingested while the key was associated with the log group are still encrypted\\n          with that key. Therefore, CloudWatch Logs will need permissions for the key whenever\\n          that data is accessed.</p>\\n            </li>\\n            <li>\\n               <p>Specify the <code>resourceIdentifier</code> parameter with the\\n            <code>query-result</code> resource to stop using the KMS key to\\n          encrypt the results of all future <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_StartQuery.html\\\">StartQuery</a>\\n          operations in the account. They will instead be encrypted with the default CloudWatch Logs method. The results from queries that ran while the key was associated with\\n          the account are still encrypted with that key. Therefore, CloudWatch Logs will need\\n          permissions for the key whenever that data is accessed.</p>\\n            </li>\\n         </ul>\\n         <p>It can take up to 5 minutes for this operation to take effect.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DisassociateKmsKeyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"logGroupName\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogGroupName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the log group.</p>\\n         <p>In your <code>DisassociateKmsKey</code> operation, you must specify either the\\n        <code>resourceIdentifier</code> parameter or the <code>logGroup</code> parameter, but you\\n      can't specify both.</p>\"\n                    }\n                },\n                \"resourceIdentifier\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ResourceIdentifier\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the target for this operation. You must specify one of the following:</p>\\n         <ul>\\n            <li>\\n               <p>Specify the ARN of a log group to stop having CloudWatch Logs use the KMS key to encrypt log events that are ingested and stored by that log\\n          group. After you run this operation, CloudWatch Logs encrypts ingested log events with\\n          the default CloudWatch Logs method. The log group ARN must be in the following format.\\n          Replace <i>REGION</i> and <i>ACCOUNT_ID</i> with your Region\\n          and account ID.</p>\\n               <p>\\n                  <code>arn:aws:logs:<i>REGION</i>:<i>ACCOUNT_ID</i>:log-group:<i>LOG_GROUP_NAME</i>\\n                  </code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Specify the following ARN to stop using this key to encrypt the results of future\\n            <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_StartQuery.html\\\">StartQuery</a>\\n          operations in this account. Replace <i>REGION</i> and\\n            <i>ACCOUNT_ID</i> with your Region and account ID.</p>\\n               <p>\\n                  <code>arn:aws:logs:<i>REGION</i>:<i>ACCOUNT_ID</i>:query-result:*</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>In your <code>DisssociateKmsKey</code> operation, you must specify either the\\n        <code>resourceIdentifier</code> parameter or the <code>logGroup</code> parameter, but you\\n      can't specify both.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#Distribution\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"Random\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Random\"\n                    }\n                },\n                \"ByLogStream\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ByLogStream\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The method used to distribute log data to the destination, which can be either random\\n      or grouped by log stream.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#DynamicTokenPosition\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#default\": 0\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#EmitSystemFields\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#SystemField\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#EncryptionKey\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 256\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#Entity\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"keyAttributes\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#EntityKeyAttributes\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The attributes of the entity which identify the specific entity, as a list of key-value\\n      pairs. Entities with the same <code>keyAttributes</code> are considered to be the same\\n      entity.</p>\\n         <p>There are five allowed attributes (key names): <code>Type</code>,\\n        <code>ResourceType</code>, <code>Identifier</code>\\n            <code>Name</code>, and <code>Environment</code>.</p>\\n         <p>For details about how to use the key attributes, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/adding-your-own-related-telemetry.html\\\">How to add\\n        related information to telemetry</a> in the <i>CloudWatch User\\n        Guide</i>.</p>\"\n                    }\n                },\n                \"attributes\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#EntityAttributes\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Additional attributes of the entity that are not used to specify the identity of the\\n      entity. A list of key-value pairs.</p>\\n         <p>For details about how to use the attributes, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/adding-your-own-related-telemetry.html\\\">How to add\\n        related information to telemetry</a> in the <i>CloudWatch User\\n        Guide</i>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The entity associated with the log events in a <code>PutLogEvents</code> call.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#EntityAttributes\": {\n            \"type\": \"map\",\n            \"key\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#EntityAttributesKey\"\n            },\n            \"value\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#EntityAttributesValue\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 10\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#EntityAttributesKey\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 256\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#EntityAttributesValue\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 512\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#EntityKeyAttributes\": {\n            \"type\": \"map\",\n            \"key\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#EntityKeyAttributesKey\"\n            },\n            \"value\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#EntityKeyAttributesValue\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 2,\n                    \"max\": 4\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#EntityKeyAttributesKey\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 32\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#EntityKeyAttributesValue\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 512\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#EntityRejectionErrorType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"INVALID_ENTITY\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"InvalidEntity\"\n                    }\n                },\n                \"INVALID_TYPE_VALUE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"InvalidTypeValue\"\n                    }\n                },\n                \"INVALID_KEY_ATTRIBUTE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"InvalidKeyAttributes\"\n                    }\n                },\n                \"INVALID_ATTRIBUTES\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"InvalidAttributes\"\n                    }\n                },\n                \"ENTITY_SIZE_TOO_LARGE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"EntitySizeTooLarge\"\n                    }\n                },\n                \"UNSUPPORTED_LOG_GROUP_TYPE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"UnsupportedLogGroupType\"\n                    }\n                },\n                \"MISSING_REQUIRED_FIELDS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"MissingRequiredFields\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#Enumerations\": {\n            \"type\": \"map\",\n            \"key\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#TokenString\"\n            },\n            \"value\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#TokenValue\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#EpochMillis\": {\n            \"type\": \"long\",\n            \"traits\": {\n                \"smithy.api#default\": 0,\n                \"smithy.api#range\": {\n                    \"min\": 0\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#EvaluationFrequency\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ONE_MIN\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ONE_MIN\"\n                    }\n                },\n                \"FIVE_MIN\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"FIVE_MIN\"\n                    }\n                },\n                \"TEN_MIN\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"TEN_MIN\"\n                    }\n                },\n                \"FIFTEEN_MIN\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"FIFTEEN_MIN\"\n                    }\n                },\n                \"THIRTY_MIN\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"THIRTY_MIN\"\n                    }\n                },\n                \"ONE_HOUR\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ONE_HOUR\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#EventId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.cloudwatchlogs#EventMessage\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#EventNumber\": {\n            \"type\": \"long\",\n            \"traits\": {\n                \"smithy.api#default\": 0\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#EventSource\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"CLOUD_TRAIL\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"CloudTrail\"\n                    }\n                },\n                \"ROUTE53_RESOLVER\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Route53Resolver\"\n                    }\n                },\n                \"VPC_FLOW\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"VPCFlow\"\n                    }\n                },\n                \"EKS_AUDIT\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"EKSAudit\"\n                    }\n                },\n                \"AWSWAF\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWSWAF\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#EventsLimit\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 10000\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#ExpectedRevisionId\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#ExportDestinationBucket\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 512\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#ExportDestinationPrefix\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.cloudwatchlogs#ExportTask\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"taskId\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ExportTaskId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the export task.</p>\"\n                    }\n                },\n                \"taskName\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ExportTaskName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the export task.</p>\"\n                    }\n                },\n                \"logGroupName\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogGroupName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the log group from which logs data was exported.</p>\"\n                    }\n                },\n                \"from\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The start time, expressed as the number of milliseconds after <code>Jan 1, 1970\\n        00:00:00 UTC</code>. Events with a timestamp before this time are not exported.</p>\"\n                    }\n                },\n                \"to\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The end time, expressed as the number of milliseconds after <code>Jan 1, 1970 00:00:00\\n        UTC</code>. Events with a timestamp later than this time are not exported.</p>\"\n                    }\n                },\n                \"destination\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ExportDestinationBucket\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the S3 bucket to which the log data was exported.</p>\"\n                    }\n                },\n                \"destinationPrefix\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ExportDestinationPrefix\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The prefix that was used as the start of Amazon S3 key for every object\\n      exported.</p>\"\n                    }\n                },\n                \"status\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ExportTaskStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The status of the export task.</p>\"\n                    }\n                },\n                \"executionInfo\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ExportTaskExecutionInfo\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Execution information about the export task.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents an export task.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#ExportTaskExecutionInfo\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"creationTime\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The creation time of the export task, expressed as the number of milliseconds after\\n        <code>Jan 1, 1970 00:00:00 UTC</code>.</p>\"\n                    }\n                },\n                \"completionTime\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The completion time of the export task, expressed as the number of milliseconds after\\n        <code>Jan 1, 1970 00:00:00 UTC</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents the status of an export task.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#ExportTaskId\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 512\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#ExportTaskName\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 512\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#ExportTaskStatus\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"code\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ExportTaskStatusCode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The status code of the export task.</p>\"\n                    }\n                },\n                \"message\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ExportTaskStatusMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The status message related to the status code.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents the status of an export task.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#ExportTaskStatusCode\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"CANCELLED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"CANCELLED\"\n                    }\n                },\n                \"COMPLETED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"COMPLETED\"\n                    }\n                },\n                \"FAILED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"FAILED\"\n                    }\n                },\n                \"PENDING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"PENDING\"\n                    }\n                },\n                \"PENDING_CANCEL\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"PENDING_CANCEL\"\n                    }\n                },\n                \"RUNNING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"RUNNING\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#ExportTaskStatusMessage\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.cloudwatchlogs#ExportTasks\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#ExportTask\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#ExtractedValues\": {\n            \"type\": \"map\",\n            \"key\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#Token\"\n            },\n            \"value\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#Value\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#Field\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.cloudwatchlogs#FieldDelimiter\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 5\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#FieldHeader\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 64\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#FieldIndex\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"logGroupIdentifier\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogGroupIdentifier\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If this field index appears in an index policy that applies only to a single log group,\\n      the ARN of that log group is displayed here.</p>\"\n                    }\n                },\n                \"fieldIndexName\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#FieldIndexName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The string that this field index matches.</p>\"\n                    }\n                },\n                \"lastScanTime\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The most recent time that CloudWatch Logs scanned ingested log events to search for\\n      this field index to improve the speed of future CloudWatch Logs Insights queries that\\n      search for this field index.</p>\"\n                    }\n                },\n                \"firstEventTime\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time and date of the earliest log event that matches this field index, after the index\\n      policy that contains it was created. </p>\"\n                    }\n                },\n                \"lastEventTime\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time and date of the most recent log event that matches this field index. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This structure describes one log event field that is used as an index in at least one\\n      index policy in this account.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#FieldIndexName\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 512\n                },\n                \"smithy.api#pattern\": \"^[\\\\.\\\\-_/#A-Za-z0-9]+$\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#FieldIndexes\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#FieldIndex\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#FieldSelectionCriteria\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 2000\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#FieldsData\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"data\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Data\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The actual log data content returned in the streaming response. This contains the fields\\n      and values of the log event in a structured format that can be parsed and processed by the\\n      client.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A structure containing the extracted fields from a log event. These fields are extracted\\n      based on the log format and can be used for structured querying and analysis.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#FilterCount\": {\n            \"type\": \"integer\"\n        },\n        \"com.amazonaws.cloudwatchlogs#FilterLogEvents\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#FilterLogEventsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#FilterLogEventsResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Lists log events from the specified log group. You can list all the log events or\\n      filter the results using one or more of the following:</p>\\n         <ul>\\n            <li>\\n               <p>A filter pattern</p>\\n            </li>\\n            <li>\\n               <p>A time range</p>\\n            </li>\\n            <li>\\n               <p>The log stream name, or a log stream name prefix that matches multiple log\\n          streams</p>\\n            </li>\\n         </ul>\\n         <p>You must have the <code>logs:FilterLogEvents</code> permission to perform this\\n      operation.</p>\\n         <p>You can specify the log group to search by using either <code>logGroupIdentifier</code> or\\n        <code>logGroupName</code>. You must include one of these two parameters, but you can't\\n      include both. </p>\\n         <p>\\n            <code>FilterLogEvents</code> is a paginated operation. Each page returned can contain up\\n      to 1 MB of log events or up to 10,000 log events. A returned page might only be partially\\n      full, or even empty. For example, if the result of a query would return 15,000 log events, the\\n      first page isn't guaranteed to have 10,000 log events even if they all fit into 1 MB.</p>\\n         <p>Partially full or empty pages don't necessarily mean that pagination is finished. If the\\n      results include a <code>nextToken</code>, there might be more log events available. You can\\n      return these additional log events by providing the nextToken in a subsequent\\n        <code>FilterLogEvents</code> operation. If the results don't include a\\n        <code>nextToken</code>, then pagination is finished. </p>\\n         <p>Specifying the <code>limit</code> parameter only guarantees that a single page doesn't\\n      return more log events than the specified limit, but it might return fewer events than the\\n      limit. This is the expected API behavior.</p>\\n         <p>The returned log events are sorted by event timestamp, the timestamp when the event was\\n      ingested by CloudWatch Logs, and the ID of the <code>PutLogEvents</code> request.</p>\\n         <p>If you are using CloudWatch cross-account observability, you can use this operation\\n      in a monitoring account and view data from the linked source accounts. For more information,\\n      see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-Unified-Cross-Account.html\\\">CloudWatch cross-account observability</a>.</p>\\n         <note>\\n            <p>If you are using <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CloudWatch-Logs-Transformation.html\\\">log\\n          transformation</a>, the <code>FilterLogEvents</code> operation returns only the\\n        original versions of log events, before they were transformed. To view the transformed\\n        versions, you must use a <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/AnalyzingLogData.html\\\">CloudWatch Logs\\n        query.</a>\\n            </p>\\n         </note>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"nextToken\",\n                    \"outputToken\": \"nextToken\",\n                    \"pageSize\": \"limit\"\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#FilterLogEventsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"logGroupName\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogGroupName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the log group to search.</p>\\n         <note>\\n            <p> You must include either <code>logGroupIdentifier</code> or <code>logGroupName</code>,\\n        but not both. </p>\\n         </note>\"\n                    }\n                },\n                \"logGroupIdentifier\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogGroupIdentifier\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify either the name or ARN of the log group to view log events from. If the log group\\n      is in a source account and you are using a monitoring account, you must use the log group\\n      ARN.</p>\\n         <note>\\n            <p> You must include either <code>logGroupIdentifier</code> or <code>logGroupName</code>,\\n        but not both. </p>\\n         </note>\"\n                    }\n                },\n                \"logStreamNames\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InputLogStreamNames\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Filters the results to only logs from the log streams in this list.</p>\\n         <p>If you specify a value for both <code>logStreamNames</code> and\\n        <code>logStreamNamePrefix</code>, the action returns an\\n        <code>InvalidParameterException</code> error.</p>\"\n                    }\n                },\n                \"logStreamNamePrefix\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogStreamName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Filters the results to include only events from log streams that have names starting with\\n      this prefix.</p>\\n         <p>If you specify a value for both <code>logStreamNamePrefix</code> and\\n        <code>logStreamNames</code>, the action returns an <code>InvalidParameterException</code>\\n      error.</p>\"\n                    }\n                },\n                \"startTime\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The start of the time range, expressed as the number of milliseconds after <code>Jan 1,\\n        1970 00:00:00 UTC</code>. Events with a timestamp before this time are not\\n      returned.</p>\"\n                    }\n                },\n                \"endTime\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The end of the time range, expressed as the number of milliseconds after <code>Jan 1,\\n        1970 00:00:00 UTC</code>. Events with a timestamp later than this time are not\\n      returned.</p>\"\n                    }\n                },\n                \"filterPattern\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#FilterPattern\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The filter pattern to use. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/FilterAndPatternSyntax.html\\\">Filter and Pattern\\n        Syntax</a>.</p>\\n         <p>If not provided, all the events are matched.</p>\"\n                    }\n                },\n                \"nextToken\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next set of events to return. (You received this token from a\\n      previous call.)</p>\"\n                    }\n                },\n                \"limit\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#EventsLimit\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of events to return. The default is 10,000 events.</p>\"\n                    }\n                },\n                \"interleaved\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Interleaved\",\n                    \"traits\": {\n                        \"smithy.api#deprecated\": {\n                            \"message\": \"Starting on June 17, 2019, this parameter will be ignored and the value will be assumed to be true. The response from this operation will always interleave events from multiple log streams within a log group.\"\n                        },\n                        \"smithy.api#documentation\": \"<p>If the value is true, the operation attempts to provide responses that contain events\\n      from multiple log streams within the log group, interleaved in a single response. If the value\\n      is false, all the matched log events in the first log stream are searched first, then those in\\n      the next log stream, and so on.</p>\\n         <p>\\n            <b>Important</b> As of June 17, 2019, this parameter is\\n      ignored and the value is assumed to be true. The response from this operation always\\n      interleaves events from multiple log streams within a log group.</p>\"\n                    }\n                },\n                \"unmask\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Unmask\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Specify <code>true</code> to display the log event fields with all sensitive data unmasked\\n      and visible. The default is <code>false</code>.</p>\\n         <p>To use this operation with this parameter, you must be signed into an account with the\\n        <code>logs:Unmask</code> permission.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#FilterLogEventsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"events\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#FilteredLogEvents\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The matched events.</p>\"\n                    }\n                },\n                \"searchedLogStreams\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#SearchedLogStreams\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>\\n            <b>Important</b> As of May 15, 2020, this parameter is no longer\\n      supported. This parameter returns an empty list.</p>\\n         <p>Indicates which log streams have been searched and whether each has been searched\\n      completely.</p>\"\n                    }\n                },\n                \"nextToken\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token to use when requesting the next set of items. The token expires after 24\\n      hours.</p>\\n         <p>If the results don't include a <code>nextToken</code>, then pagination is finished.\\n    </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#FilterName\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 512\n                },\n                \"smithy.api#pattern\": \"^[^:*]*$\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#FilterPattern\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A symbolic description of how CloudWatch Logs should interpret the data in each log\\n      event. For example, a log event can contain timestamps, IP addresses, strings, and so on. You\\n      use the filter pattern to specify what to look for in the log event message.</p>\",\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 1024\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#FilteredLogEvent\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"logStreamName\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogStreamName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the log stream to which this event belongs.</p>\"\n                    }\n                },\n                \"timestamp\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time the event occurred, expressed as the number of milliseconds after <code>Jan 1,\\n        1970 00:00:00 UTC</code>.</p>\"\n                    }\n                },\n                \"message\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#EventMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The data contained in the log event.</p>\"\n                    }\n                },\n                \"ingestionTime\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time the event was ingested, expressed as the number of milliseconds after\\n        <code>Jan 1, 1970 00:00:00 UTC</code>.</p>\"\n                    }\n                },\n                \"eventId\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#EventId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the event.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents a matched event.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#FilteredLogEvents\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#FilteredLogEvent\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#Flatten\": {\n            \"type\": \"boolean\",\n            \"traits\": {\n                \"smithy.api#default\": false\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#FlattenedElement\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"FIRST\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"first\"\n                    }\n                },\n                \"LAST\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"last\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#Force\": {\n            \"type\": \"boolean\",\n            \"traits\": {\n                \"smithy.api#default\": false\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#ForceUpdate\": {\n            \"type\": \"boolean\"\n        },\n        \"com.amazonaws.cloudwatchlogs#FromKey\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 128\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#GetDataProtectionPolicy\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#GetDataProtectionPolicyRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#GetDataProtectionPolicyResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#OperationAbortedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns information about a log group data protection policy.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#GetDataProtectionPolicyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"logGroupIdentifier\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogGroupIdentifier\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name or ARN of the log group that contains the data protection policy that you want to\\n      see.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#GetDataProtectionPolicyResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"logGroupIdentifier\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogGroupIdentifier\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The log group name or ARN that you specified in your request.</p>\"\n                    }\n                },\n                \"policyDocument\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DataProtectionPolicyDocument\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The data protection policy document for this log group.</p>\"\n                    }\n                },\n                \"lastUpdatedTime\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time that this policy was most recently updated.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#GetDelivery\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#GetDeliveryRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#GetDeliveryResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceQuotaExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ThrottlingException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns complete information about one logical <i>delivery</i>. A delivery\\n      is a connection between a <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutDeliverySource.html\\\">\\n               <i>delivery\\n          source</i>\\n            </a> and a <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutDeliveryDestination.html\\\">\\n               <i>delivery destination</i>\\n            </a>.</p>\\n         <p>A delivery source represents an Amazon Web Services resource that sends logs to an logs\\n      delivery destination. The destination can be CloudWatch Logs, Amazon S3, or Firehose. Only some Amazon Web Services services support being configured as a delivery\\n      source. These services are listed in <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/AWS-logs-and-resource-policy.html\\\">Enable logging from\\n          Amazon Web Services services.</a>\\n         </p>\\n         <p>You need to specify the delivery <code>id</code> in this operation. You can find the IDs\\n      of the deliveries in your account with the <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_DescribeDeliveries.html\\\">DescribeDeliveries</a> operation.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#GetDeliveryDestination\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#GetDeliveryDestinationRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#GetDeliveryDestinationResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceQuotaExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ThrottlingException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Retrieves complete information about one delivery destination.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#GetDeliveryDestinationPolicy\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#GetDeliveryDestinationPolicyRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#GetDeliveryDestinationPolicyResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Retrieves the delivery destination policy assigned to the delivery destination that you\\n      specify. For more information about delivery destinations and their policies, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutDeliveryDestinationPolicy.html\\\">PutDeliveryDestinationPolicy</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#GetDeliveryDestinationPolicyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"deliveryDestinationName\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DeliveryDestinationName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the delivery destination that you want to retrieve the policy of.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#GetDeliveryDestinationPolicyResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"policy\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Policy\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IAM policy for this delivery destination.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#GetDeliveryDestinationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"name\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DeliveryDestinationName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the delivery destination that you want to retrieve.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#GetDeliveryDestinationResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"deliveryDestination\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DeliveryDestination\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A structure containing information about the delivery destination.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#GetDeliveryRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"id\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DeliveryId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the delivery that you want to retrieve.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#GetDeliveryResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"delivery\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Delivery\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A structure that contains information about the delivery.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#GetDeliverySource\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#GetDeliverySourceRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#GetDeliverySourceResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceQuotaExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ThrottlingException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Retrieves complete information about one delivery source.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#GetDeliverySourceRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"name\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DeliverySourceName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the delivery source that you want to retrieve.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#GetDeliverySourceResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"deliverySource\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DeliverySource\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A structure containing information about the delivery source.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#GetIntegration\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#GetIntegrationRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#GetIntegrationResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns information about one integration between CloudWatch Logs and OpenSearch Service. </p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#GetIntegrationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"integrationName\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#IntegrationName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the integration that you want to find information about. To find the name of\\n      your integration, use <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_ListIntegrations.html\\\">ListIntegrations</a>\\n         </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#GetIntegrationResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"integrationName\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#IntegrationName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the integration.</p>\"\n                    }\n                },\n                \"integrationType\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#IntegrationType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of integration. Integrations with OpenSearch Service have the type\\n        <code>OPENSEARCH</code>.</p>\"\n                    }\n                },\n                \"integrationStatus\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#IntegrationStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The current status of this integration.</p>\"\n                    }\n                },\n                \"integrationDetails\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#IntegrationDetails\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A structure that contains information about the integration configuration. For an\\n      integration with OpenSearch Service, this includes information about OpenSearch Service\\n      resources such as the collection, the workspace, and policies.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#GetLogAnomalyDetector\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#GetLogAnomalyDetectorRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#GetLogAnomalyDetectorResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#OperationAbortedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Retrieves information about the log anomaly detector that you specify. The KMS key ARN detected is valid.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#GetLogAnomalyDetectorRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"anomalyDetectorArn\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#AnomalyDetectorArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the anomaly detector to retrieve information about. You can find the ARNs of\\n      log anomaly detectors in your account by using the <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_ListLogAnomalyDetectors.html\\\">ListLogAnomalyDetectors</a> operation.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#GetLogAnomalyDetectorResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"detectorName\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DetectorName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the log anomaly detector</p>\"\n                    }\n                },\n                \"logGroupArnList\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogGroupArnList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An array of structures, where each structure contains the ARN of a log group associated\\n      with this anomaly detector.</p>\"\n                    }\n                },\n                \"evaluationFrequency\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#EvaluationFrequency\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies how often the anomaly detector runs and look for anomalies. Set this value\\n      according to the frequency that the log group receives new logs. For example, if the log group\\n      receives new log events every 10 minutes, then setting <code>evaluationFrequency</code> to\\n        <code>FIFTEEN_MIN</code> might be appropriate.</p>\"\n                    }\n                },\n                \"filterPattern\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#FilterPattern\"\n                },\n                \"anomalyDetectorStatus\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#AnomalyDetectorStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies whether the anomaly detector is currently active. To change its status, use the\\n        <code>enabled</code> parameter in the <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_UpdateLogAnomalyDetector.html\\\">UpdateLogAnomalyDetector</a> operation.</p>\"\n                    }\n                },\n                \"kmsKeyId\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#KmsKeyId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the KMS key assigned to this anomaly detector, if any.</p>\"\n                    }\n                },\n                \"creationTimeStamp\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#EpochMillis\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The date and time when this anomaly detector was created.</p>\"\n                    }\n                },\n                \"lastModifiedTimeStamp\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#EpochMillis\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The date and time when this anomaly detector was most recently modified.</p>\"\n                    }\n                },\n                \"anomalyVisibilityTime\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#AnomalyVisibilityTime\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of days used as the life cycle of anomalies. After this time, anomalies are\\n      automatically baselined and the anomaly detector model will treat new occurrences of similar\\n      event as normal. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#GetLogEvents\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#GetLogEventsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#GetLogEventsResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Lists log events from the specified log stream. You can list all of the log events or\\n      filter using a time range.</p>\\n         <p>\\n            <code>GetLogEvents</code> is a paginated operation. Each page returned can contain up to 1\\n      MB of log events or up to 10,000 log events. A returned page might only be partially full, or\\n      even empty. For example, if the result of a query would return 15,000 log events, the first\\n      page isn't guaranteed to have 10,000 log events even if they all fit into 1 MB.</p>\\n         <p>Partially full or empty pages don't necessarily mean that pagination is finished. As long\\n      as the <code>nextBackwardToken</code> or <code>nextForwardToken</code> returned is NOT equal\\n      to the <code>nextToken</code> that you passed into the API call, there might be more log\\n      events available. The token that you use depends on the direction you want to move in along\\n      the log stream. The returned tokens are never null.</p>\\n         <note>\\n            <p>If you set <code>startFromHead</code> to <code>true</code> and you don’t include\\n          <code>endTime</code> in your request, you can end up in a situation where the pagination\\n        doesn't terminate. This can happen when the new log events are being added to the target log\\n        streams faster than they are being read. This situation is a good use case for the CloudWatch Logs\\n        <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CloudWatchLogs_LiveTail.html\\\">Live Tail</a> feature.</p>\\n         </note>\\n         <p>If you are using CloudWatch cross-account observability, you can use this operation\\n      in a monitoring account and view data from the linked source accounts. For more information,\\n      see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-Unified-Cross-Account.html\\\">CloudWatch cross-account observability</a>.</p>\\n         <p>You can specify the log group to search by using either <code>logGroupIdentifier</code> or\\n        <code>logGroupName</code>. You must include one of these two parameters, but you can't\\n      include both. </p>\\n         <note>\\n            <p>If you are using <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CloudWatch-Logs-Transformation.html\\\">log\\n          transformation</a>, the <code>GetLogEvents</code> operation returns only the original\\n        versions of log events, before they were transformed. To view the transformed versions, you\\n        must use a <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/AnalyzingLogData.html\\\">CloudWatch Logs\\n        query.</a>\\n            </p>\\n         </note>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"nextToken\",\n                    \"outputToken\": \"nextForwardToken\",\n                    \"items\": \"events\",\n                    \"pageSize\": \"limit\"\n                },\n                \"smithy.test#smokeTests\": [\n                    {\n                        \"id\": \"GetLogEventsFailure\",\n                        \"params\": {\n                            \"logGroupName\": \"fakegroup\",\n                            \"logStreamName\": \"fakestream\"\n                        },\n                        \"vendorParams\": {\n                            \"region\": \"us-west-2\"\n                        },\n                        \"vendorParamsShape\": \"aws.test#AwsVendorParams\",\n                        \"expect\": {\n                            \"failure\": {}\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#GetLogEventsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"logGroupName\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogGroupName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the log group.</p>\\n         <note>\\n            <p> You must include either <code>logGroupIdentifier</code> or <code>logGroupName</code>,\\n        but not both. </p>\\n         </note>\"\n                    }\n                },\n                \"logGroupIdentifier\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogGroupIdentifier\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify either the name or ARN of the log group to view events from. If the log group is\\n      in a source account and you are using a monitoring account, you must use the log group\\n      ARN.</p>\\n         <note>\\n            <p> You must include either <code>logGroupIdentifier</code> or <code>logGroupName</code>,\\n        but not both. </p>\\n         </note>\"\n                    }\n                },\n                \"logStreamName\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogStreamName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the log stream.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"startTime\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The start of the time range, expressed as the number of milliseconds after <code>Jan 1,\\n        1970 00:00:00 UTC</code>. Events with a timestamp equal to this time or later than this time\\n      are included. Events with a timestamp earlier than this time are not included.</p>\"\n                    }\n                },\n                \"endTime\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The end of the time range, expressed as the number of milliseconds after <code>Jan 1,\\n        1970 00:00:00 UTC</code>. Events with a timestamp equal to or later than this time are not\\n      included.</p>\"\n                    }\n                },\n                \"nextToken\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next set of items to return. (You received this token from a previous\\n      call.)</p>\"\n                    }\n                },\n                \"limit\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#EventsLimit\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of log events returned. If you don't specify a limit, the default is\\n      as many log events as can fit in a response size of 1 MB (up to 10,000 log events).</p>\"\n                    }\n                },\n                \"startFromHead\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#StartFromHead\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If the value is true, the earliest log events are returned first. If the value is\\n      false, the latest log events are returned first. The default value is false.</p>\\n         <p>If you are using a previous <code>nextForwardToken</code> value as the\\n        <code>nextToken</code> in this operation, you must specify <code>true</code> for\\n        <code>startFromHead</code>.</p>\"\n                    }\n                },\n                \"unmask\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Unmask\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Specify <code>true</code> to display the log event fields with all sensitive data unmasked\\n      and visible. The default is <code>false</code>.</p>\\n         <p>To use this operation with this parameter, you must be signed into an account with the\\n        <code>logs:Unmask</code> permission.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#GetLogEventsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"events\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#OutputLogEvents\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The events.</p>\"\n                    }\n                },\n                \"nextForwardToken\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next set of items in the forward direction. The token expires after\\n      24 hours. If you have reached the end of the stream, it returns the same token you passed\\n      in.</p>\"\n                    }\n                },\n                \"nextBackwardToken\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next set of items in the backward direction. The token expires after\\n      24 hours. This token is not null. If you have reached the end of the stream, it returns the\\n      same token you passed in.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#GetLogGroupFields\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#GetLogGroupFieldsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#GetLogGroupFieldsResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns a list of the fields that are included in log events in the specified log group.\\n      Includes the percentage of log events that contain each field. The search is limited to a time\\n      period that you specify.</p>\\n         <p>You can specify the log group to search by using either <code>logGroupIdentifier</code> or\\n        <code>logGroupName</code>. You must specify one of these parameters, but you can't specify\\n      both. </p>\\n         <p>In the results, fields that start with <code>@</code> are fields generated by CloudWatch\\n      Logs. For example, <code>@timestamp</code> is the timestamp of each log event. For more\\n      information about the fields that are generated by CloudWatch logs, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CWL_AnalyzeLogData-discoverable-fields.html\\\">Supported\\n        Logs and Discovered Fields</a>.</p>\\n         <p>The response results are sorted by the frequency percentage, starting with the highest\\n      percentage.</p>\\n         <p>If you are using CloudWatch cross-account observability, you can use this operation\\n      in a monitoring account and view data from the linked source accounts. For more information,\\n      see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-Unified-Cross-Account.html\\\">CloudWatch cross-account observability</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#GetLogGroupFieldsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"logGroupName\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogGroupName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the log group to search.</p>\\n         <note>\\n            <p> You must include either <code>logGroupIdentifier</code> or <code>logGroupName</code>,\\n        but not both. </p>\\n         </note>\"\n                    }\n                },\n                \"time\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time to set as the center of the query. If you specify <code>time</code>, the 8\\n      minutes before and 8 minutes after this time are searched. If you omit <code>time</code>, the\\n      most recent 15 minutes up to the current time are searched.</p>\\n         <p>The <code>time</code> value is specified as epoch time, which is the number of seconds\\n      since <code>January 1, 1970, 00:00:00 UTC</code>.</p>\"\n                    }\n                },\n                \"logGroupIdentifier\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogGroupIdentifier\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify either the name or ARN of the log group to view. If the log group is in a source\\n      account and you are using a monitoring account, you must specify the ARN.</p>\\n         <note>\\n            <p> You must include either <code>logGroupIdentifier</code> or <code>logGroupName</code>,\\n        but not both. </p>\\n         </note>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#GetLogGroupFieldsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"logGroupFields\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogGroupFieldList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The array of fields found in the query. Each object in the array contains the name of the\\n      field, along with the percentage of time it appeared in the log events that were\\n      queried.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#GetLogObject\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#GetLogObjectRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#GetLogObjectResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#AccessDeniedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InvalidOperationException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ResourceNotFoundException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Retrieves a large logging object (LLO) and streams it back. This API is used to fetch the\\n      content of large portions of log events that have been ingested through the\\n      PutOpenTelemetryLogs API. When log events contain fields that would cause the total event size\\n      to exceed 1MB, CloudWatch Logs automatically processes up to 10 fields, starting with the\\n      largest fields. Each field is truncated as needed to keep the total event size as close to 1MB\\n      as possible. The excess portions are stored as Large Log Objects (LLOs) and these fields are\\n      processed separately and LLO reference system fields (in the format\\n        <code>@ptr.$[path.to.field]</code>) are added. The path in the reference field reflects the\\n      original JSON structure where the large field was located. For example, this could be\\n        <code>@ptr.$['input']['message']</code>, <code>@ptr.$['AAA']['BBB']['CCC']['DDD']</code>,\\n        <code>@ptr.$['AAA']</code>, or any other path matching your log structure.</p>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"streaming-\"\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#GetLogObjectRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"unmask\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Unmask\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>A boolean flag that indicates whether to unmask sensitive log data. When set to true, any\\n      masked or redacted data in the log object will be displayed in its original form. Default is\\n      false.</p>\"\n                    }\n                },\n                \"logObjectPointer\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogObjectPointer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A pointer to the specific log object to retrieve. This is a required parameter that\\n      uniquely identifies the log object within CloudWatch Logs. The pointer is typically obtained\\n      from a previous query or filter operation.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The parameters for the GetLogObject operation.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#GetLogObjectResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"fieldStream\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#GetLogObjectResponseStream\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A stream of structured log data returned by the GetLogObject operation. This stream\\n      contains log events with their associated metadata and extracted fields.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The response from the GetLogObject operation.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#GetLogObjectResponseStream\": {\n            \"type\": \"union\",\n            \"members\": {\n                \"fields\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#FieldsData\"\n                },\n                \"InternalStreamingException\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InternalStreamingException\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An internal error occurred during the streaming of log data. This exception is thrown when\\n      there's an issue with the internal streaming mechanism used by the GetLogObject\\n      operation.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A stream of structured log data returned by the GetLogObject operation. This stream\\n      contains log events with their associated metadata and extracted fields.</p>\",\n                \"smithy.api#streaming\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#GetLogRecord\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#GetLogRecordRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#GetLogRecordResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Retrieves all of the fields and values of a single log event. All fields are retrieved,\\n      even if the original query that produced the <code>logRecordPointer</code> retrieved only a\\n      subset of fields. Fields are returned as field name/field value pairs.</p>\\n         <p>The full unparsed log event is returned within <code>@message</code>.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#GetLogRecordRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"logRecordPointer\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogRecordPointer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The pointer corresponding to the log event record you want to retrieve. You get this from\\n      the response of a <code>GetQueryResults</code> operation. In that response, the value of the\\n        <code>@ptr</code> field for a log event is the value to use as <code>logRecordPointer</code>\\n      to retrieve that complete log event record.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"unmask\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Unmask\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Specify <code>true</code> to display the log event fields with all sensitive data unmasked\\n      and visible. The default is <code>false</code>.</p>\\n         <p>To use this operation with this parameter, you must be signed into an account with the\\n        <code>logs:Unmask</code> permission.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#GetLogRecordResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"logRecord\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogRecord\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The requested log event, as a JSON string.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#GetQueryResults\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#GetQueryResultsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#GetQueryResultsResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns the results from the specified query.</p>\\n         <p>Only the fields requested in the query are returned, along with a <code>@ptr</code> field,\\n      which is the identifier for the log record. You can use the value of <code>@ptr</code> in a\\n        <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_GetLogRecord.html\\\">GetLogRecord</a>\\n      operation to get the full log record.</p>\\n         <p>\\n            <code>GetQueryResults</code> does not start running a query. To run a query, use <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_StartQuery.html\\\">StartQuery</a>. For more information about how long results of previous queries are\\n      available, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/cloudwatch_limits_cwl.html\\\">CloudWatch Logs\\n        quotas</a>.</p>\\n         <p>If the value of the <code>Status</code> field in the output is <code>Running</code>, this\\n      operation returns only partial results. If you see a value of <code>Scheduled</code> or\\n        <code>Running</code> for the status, you can retry the operation later to see the final\\n      results. </p>\\n         <p>If you are using CloudWatch cross-account observability, you can use this operation\\n      in a monitoring account to start queries in linked source accounts. For more information, see\\n        <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-Unified-Cross-Account.html\\\">CloudWatch cross-account observability</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#GetQueryResultsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"queryId\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#QueryId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID number of the query.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#GetQueryResultsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"queryLanguage\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#QueryLanguage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The query language used for this query. For more information about the query languages\\n      that CloudWatch Logs supports, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CWL_AnalyzeLogData_Languages.html\\\">Supported query\\n        languages</a>.</p>\"\n                    }\n                },\n                \"results\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#QueryResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The log events that matched the query criteria during the most recent time it ran.</p>\\n         <p>The <code>results</code> value is an array of arrays. Each log event is one object in the\\n      top-level array. Each of these log event objects is an array of\\n        <code>field</code>/<code>value</code> pairs.</p>\"\n                    }\n                },\n                \"statistics\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#QueryStatistics\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Includes the number of log events scanned by the query, the number of log events that\\n      matched the query criteria, and the total number of bytes in the scanned log events. These\\n      values reflect the full raw results of the query.</p>\"\n                    }\n                },\n                \"status\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#QueryStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The status of the most recent running of the query. Possible values are\\n        <code>Cancelled</code>, <code>Complete</code>, <code>Failed</code>, <code>Running</code>,\\n        <code>Scheduled</code>, <code>Timeout</code>, and <code>Unknown</code>.</p>\\n         <p>Queries time out after 60 minutes of runtime. To avoid having your queries time out,\\n      reduce the time range being searched or partition your query into a number of queries.</p>\"\n                    }\n                },\n                \"encryptionKey\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#EncryptionKey\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If you associated an KMS key with the CloudWatch Logs Insights\\n      query results in this account, this field displays the ARN of the key that's used to encrypt\\n      the query results when <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_StartQuery.html\\\">StartQuery</a> stores\\n      them.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#GetTransformer\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#GetTransformerRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#GetTransformerResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InvalidOperationException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns the information about the log transformer associated with this log group.</p>\\n         <p>This operation returns data only for transformers created at the log group level. To get\\n      information for an account-level transformer, use <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_DescribeAccountPolicies.html\\\">DescribeAccountPolicies</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#GetTransformerRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"logGroupIdentifier\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogGroupIdentifier\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify either the name or ARN of the log group to return transformer information for. If\\n      the log group is in a source account and you are using a monitoring account, you must use the\\n      log group ARN.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#GetTransformerResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"logGroupIdentifier\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogGroupIdentifier\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the log group that you specified in your request.</p>\"\n                    }\n                },\n                \"creationTime\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The creation time of the transformer, expressed as the number of milliseconds after Jan\\n      1, 1970 00:00:00 UTC.</p>\"\n                    }\n                },\n                \"lastModifiedTime\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time when this transformer was most recently modified, expressed as the\\n      number of milliseconds after Jan 1, 1970 00:00:00 UTC.</p>\"\n                    }\n                },\n                \"transformerConfig\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Processors\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>This sructure contains the configuration of the requested transformer.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#Grok\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"source\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Source\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The path to the field in the log event that you want to parse. If you omit this value, the\\n      whole log message is parsed.</p>\"\n                    }\n                },\n                \"match\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#GrokMatch\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The grok pattern to match against the log event. For a list of supported grok patterns,\\n      see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CloudWatch-Logs-Transformation-Processors.html#Grok-Patterns\\\">Supported grok patterns</a>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This processor uses pattern matching to parse and structure unstructured data. This\\n      processor can also extract fields from log messages.</p>\\n         <p>For more information about this processor including examples, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CloudWatch-Logs-Transformation-Processors.html#CloudWatch-Logs-Transformation-Grok\\\">grok</a> in the <i>CloudWatch Logs User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#GrokMatch\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 512\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#Histogram\": {\n            \"type\": \"map\",\n            \"key\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#Time\"\n            },\n            \"value\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#Count\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#IncludeLinkedAccounts\": {\n            \"type\": \"boolean\"\n        },\n        \"com.amazonaws.cloudwatchlogs#IndexPolicies\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#IndexPolicy\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#IndexPolicy\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"logGroupIdentifier\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogGroupIdentifier\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the log group that this index policy applies to.</p>\"\n                    }\n                },\n                \"lastUpdateTime\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time that this index policy was most recently updated.</p>\"\n                    }\n                },\n                \"policyDocument\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#PolicyDocument\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The policy document for this index policy, in JSON format.</p>\"\n                    }\n                },\n                \"policyName\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#PolicyName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of this policy. Responses about log group-level field index policies don't have\\n      this field, because those policies don't have names.</p>\"\n                    }\n                },\n                \"source\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#IndexSource\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>This field indicates whether this is an account-level index policy or an index policy that\\n      applies only to a single log group.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This structure contains information about one field index policy in this account.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#IndexSource\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ACCOUNT\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ACCOUNT\"\n                    }\n                },\n                \"LOG_GROUP\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"LOG_GROUP\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#InferredTokenName\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#InheritedProperties\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#InheritedProperty\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#InheritedProperty\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ACCOUNT_DATA_PROTECTION\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ACCOUNT_DATA_PROTECTION\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#InputLogEvent\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"timestamp\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time the event occurred, expressed as the number of milliseconds after <code>Jan 1,\\n        1970 00:00:00 UTC</code>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"message\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#EventMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The raw event message. Each log event can be no larger than 1 MB.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents a log event, which is a record of activity that was recorded by the\\n      application or resource being monitored.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#InputLogEvents\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#InputLogEvent\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 10000\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#InputLogStreamNames\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#LogStreamName\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 100\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#Integer\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#default\": 0\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#IntegrationDetails\": {\n            \"type\": \"union\",\n            \"members\": {\n                \"openSearchIntegrationDetails\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#OpenSearchIntegrationDetails\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>This structure contains complete information about one integration between CloudWatch Logs and OpenSearch Service.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This structure contains information about the integration configuration. For an\\n      integration with OpenSearch Service, this includes information about OpenSearch Service\\n      resources such as the collection, the workspace, and policies.</p>\\n         <p>This structure is returned by a <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_GetIntegration.html\\\">GetIntegration</a> operation.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#IntegrationName\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 50\n                },\n                \"smithy.api#pattern\": \"^[\\\\.\\\\-_/#A-Za-z0-9]+$\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#IntegrationNamePrefix\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 50\n                },\n                \"smithy.api#pattern\": \"^[\\\\.\\\\-_/#A-Za-z0-9]+$\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#IntegrationStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"PROVISIONING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"PROVISIONING\"\n                    }\n                },\n                \"ACTIVE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ACTIVE\"\n                    }\n                },\n                \"FAILED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"FAILED\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#IntegrationStatusMessage\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#IntegrationSummaries\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#IntegrationSummary\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#IntegrationSummary\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"integrationName\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#IntegrationName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of this integration.</p>\"\n                    }\n                },\n                \"integrationType\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#IntegrationType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of integration. Integrations with OpenSearch Service have the type\\n        <code>OPENSEARCH</code>.</p>\"\n                    }\n                },\n                \"integrationStatus\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#IntegrationStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The current status of this integration.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This structure contains information about one CloudWatch Logs integration. This\\n      structure is returned by a <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_ListIntegrations.html\\\">ListIntegrations</a> operation.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#IntegrationType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"OPENSEARCH\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"OPENSEARCH\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#Interleaved\": {\n            \"type\": \"boolean\"\n        },\n        \"com.amazonaws.cloudwatchlogs#InternalStreamingException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Message\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>An internal error occurred during the streaming of log data. This exception is thrown when\\n      there's an issue with the internal streaming mechanism used by the GetLogObject\\n      operation.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#InvalidOperationException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Message\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The operation is not valid on the specified resource.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#InvalidParameterException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Message\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A parameter is specified incorrectly.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#InvalidSequenceTokenException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"expectedSequenceToken\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#SequenceToken\"\n                },\n                \"message\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Message\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The sequence token is not valid. You can get the correct sequence token in the\\n        <code>expectedSequenceToken</code> field in the <code>InvalidSequenceTokenException</code>\\n      message. </p>\\n         <important>\\n            <p>\\n               <code>PutLogEvents</code> actions are now always accepted and never return\\n          <code>InvalidSequenceTokenException</code> regardless of receiving an invalid sequence\\n        token. </p>\\n         </important>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#IsSampled\": {\n            \"type\": \"boolean\",\n            \"traits\": {\n                \"smithy.api#default\": false\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#Key\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 128\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#KeyPrefix\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 128\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#KeyValueDelimiter\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 128\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#KmsKeyId\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 256\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#LimitExceededException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Message\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>You have reached the maximum number of resources that can be created.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#ListAnomalies\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#ListAnomaliesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#ListAnomaliesResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#OperationAbortedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns a list of anomalies that log anomaly detectors have found. For details about the\\n      structure format of each anomaly object that is returned, see the example in this\\n      section.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"nextToken\",\n                    \"outputToken\": \"nextToken\",\n                    \"items\": \"anomalies\",\n                    \"pageSize\": \"limit\"\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#ListAnomaliesLimit\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 50\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#ListAnomaliesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"anomalyDetectorArn\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#AnomalyDetectorArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this to optionally limit the results to only the anomalies found by a certain anomaly\\n      detector.</p>\"\n                    }\n                },\n                \"suppressionState\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#SuppressionState\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>You can specify this parameter if you want to the operation to return only anomalies that\\n      are currently either suppressed or unsuppressed.</p>\"\n                    }\n                },\n                \"limit\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ListAnomaliesLimit\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of items to return. If you don't specify a value, the default\\n      maximum value of 50 items is used.</p>\"\n                    }\n                },\n                \"nextToken\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#NextToken\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#ListAnomaliesResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"anomalies\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Anomalies\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An array of structures, where each structure contains information about one anomaly that a\\n      log anomaly detector has found.</p>\"\n                    }\n                },\n                \"nextToken\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#NextToken\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#ListIntegrations\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#ListIntegrationsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#ListIntegrationsResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns a list of integrations between CloudWatch Logs and other services in this\\n      account. Currently, only one integration can be created in an account, and this integration\\n      must be with OpenSearch Service.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#ListIntegrationsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"integrationNamePrefix\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#IntegrationNamePrefix\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>To limit the results to integrations that start with a certain name prefix, specify that\\n      name prefix here.</p>\"\n                    }\n                },\n                \"integrationType\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#IntegrationType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>To limit the results to integrations of a certain type, specify that type here.</p>\"\n                    }\n                },\n                \"integrationStatus\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#IntegrationStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>To limit the results to integrations with a certain status, specify that status\\n      here.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#ListIntegrationsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"integrationSummaries\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#IntegrationSummaries\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An array, where each object in the array contains information about one CloudWatch Logs\\n      integration in this account. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#ListLimit\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#ListLogAnomalyDetectors\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#ListLogAnomalyDetectorsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#ListLogAnomalyDetectorsResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#OperationAbortedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Retrieves a list of the log anomaly detectors in the account.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"nextToken\",\n                    \"outputToken\": \"nextToken\",\n                    \"items\": \"anomalyDetectors\",\n                    \"pageSize\": \"limit\"\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#ListLogAnomalyDetectorsLimit\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 50\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#ListLogAnomalyDetectorsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"filterLogGroupArn\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogGroupArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this to optionally filter the results to only include anomaly detectors that are\\n      associated with the specified log group.</p>\"\n                    }\n                },\n                \"limit\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ListLogAnomalyDetectorsLimit\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of items to return. If you don't specify a value, the default\\n      maximum value of 50 items is used.</p>\"\n                    }\n                },\n                \"nextToken\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#NextToken\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#ListLogAnomalyDetectorsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"anomalyDetectors\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#AnomalyDetectors\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An array of structures, where each structure in the array contains information about one\\n      anomaly detector.</p>\"\n                    }\n                },\n                \"nextToken\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#NextToken\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#ListLogGroups\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#ListLogGroupsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#ListLogGroupsResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns a list of log groups in the Region in your account. If you are performing this\\n      action in a monitoring account, you can choose to also return log groups from source accounts\\n      that are linked to the monitoring account. For more information about using cross-account\\n      observability to set up monitoring accounts and source accounts, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-Unified-Cross-Account.html\\\">\\n        CloudWatch cross-account observability</a>.</p>\\n         <p>You can optionally filter the list by log group class and by using regular expressions in\\n      your request to match strings in the log group names.</p>\\n         <p>This operation is paginated. By default, your first use of this operation returns 50\\n      results, and includes a token to use in a subsequent operation to return more results.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#ListLogGroupsForQuery\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#ListLogGroupsForQueryRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#ListLogGroupsForQueryResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#AccessDeniedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns a list of the log groups that were analyzed during a single CloudWatch Logs\\n      Insights query. This can be useful for queries that use log group name prefixes or the\\n        <code>filterIndex</code> command, because the log groups are dynamically selected in these\\n      cases.</p>\\n         <p>For more information about field indexes, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CloudWatchLogs-Field-Indexing.html\\\">Create field indexes\\n        to improve query performance and reduce costs</a>.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"nextToken\",\n                    \"outputToken\": \"nextToken\",\n                    \"items\": \"logGroupIdentifiers\",\n                    \"pageSize\": \"maxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#ListLogGroupsForQueryMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 50,\n                    \"max\": 500\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#ListLogGroupsForQueryRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"queryId\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#QueryId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the query to use. This query ID is from the response to your <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_StartQuery.html\\\">StartQuery</a> operation.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"nextToken\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#NextToken\"\n                },\n                \"maxResults\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ListLogGroupsForQueryMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Limits the number of returned log groups to the specified number.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#ListLogGroupsForQueryResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"logGroupIdentifiers\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogGroupIdentifiers\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An array of the names and ARNs of the log groups that were processed in the query.</p>\"\n                    }\n                },\n                \"nextToken\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#NextToken\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#ListLogGroupsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"logGroupNamePattern\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogGroupNameRegexPattern\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter to limit the returned log groups to only those with names that match\\n      the pattern that you specify. This parameter is a regular expression that can match prefixes\\n      and substrings, and supports wildcard matching and matching multiple patterns, as in the\\n      following examples. </p>\\n         <ul>\\n            <li>\\n               <p>Use <code>^</code> to match log group names by prefix.</p>\\n            </li>\\n            <li>\\n               <p>For a substring match, specify the string to match. All matches are case\\n          sensitive</p>\\n            </li>\\n            <li>\\n               <p>To match multiple patterns, separate them with a <code>|</code> as in the example\\n            <code>^/aws/lambda|discovery</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>You can specify as many as five different regular expression patterns in this field, each\\n      of which must be between 3 and 24 characters. You can include the <code>^</code> symbol as\\n      many as five times, and include the <code>|</code> symbol as many as four times.</p>\"\n                    }\n                },\n                \"logGroupClass\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogGroupClass\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter to limit the results to only those log groups in the specified log\\n      group class. If you omit this parameter, log groups of all classes can be returned.</p>\"\n                    }\n                },\n                \"includeLinkedAccounts\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#IncludeLinkedAccounts\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If you are using a monitoring account, set this to <code>true</code> to have the operation\\n      return log groups in the accounts listed in <code>accountIdentifiers</code>.</p>\\n         <p>If this parameter is set to <code>true</code> and <code>accountIdentifiers</code> contains\\n      a null value, the operation returns all log groups in the monitoring account and all log\\n      groups in all source accounts that are linked to the monitoring account. </p>\\n         <p>The default for this parameter is <code>false</code>.</p>\"\n                    }\n                },\n                \"accountIdentifiers\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#AccountIds\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>When <code>includeLinkedAccounts</code> is set to <code>true</code>, use this parameter to\\n      specify the list of accounts to search. You can specify as many as 20 account IDs in the\\n      array.</p>\"\n                    }\n                },\n                \"nextToken\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#NextToken\"\n                },\n                \"limit\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ListLimit\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of log groups to return. If you omit this parameter, the default is\\n      up to 50 log groups.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#ListLogGroupsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"logGroups\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogGroupSummaries\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An array of structures, where each structure contains the information about one log\\n      group.</p>\"\n                    }\n                },\n                \"nextToken\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#NextToken\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#ListTagsForResource\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#ListTagsForResourceRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#ListTagsForResourceResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Displays the tags associated with a CloudWatch Logs resource. Currently, log groups and\\n      destinations support tagging.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#ListTagsForResourceRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"resourceArn\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#AmazonResourceName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the resource that you want to view tags for.</p>\\n         <p>The ARN format of a log group is\\n          <code>arn:aws:logs:<i>Region</i>:<i>account-id</i>:log-group:<i>log-group-name</i>\\n            </code>\\n         </p>\\n         <p>The ARN format of a destination is\\n          <code>arn:aws:logs:<i>Region</i>:<i>account-id</i>:destination:<i>destination-name</i>\\n            </code>\\n         </p>\\n         <p>For more information about ARN format, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/iam-access-control-overview-cwl.html\\\">CloudWatch Logs\\n        resources and operations</a>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#ListTagsForResourceResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"tags\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Tags\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The list of tags associated with the requested resource.></p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#ListTagsLogGroup\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#ListTagsLogGroupRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#ListTagsLogGroupResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#deprecated\": {\n                    \"message\": \"Please use the generic tagging API ListTagsForResource\"\n                },\n                \"smithy.api#documentation\": \"<important>\\n            <p>The ListTagsLogGroup operation is on the path to deprecation. We recommend that you use\\n          <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_ListTagsForResource.html\\\">ListTagsForResource</a> instead.</p>\\n         </important>\\n         <p>Lists the tags for the specified log group.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#ListTagsLogGroupRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"logGroupName\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogGroupName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the log group.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#deprecated\": {\n                    \"message\": \"Please use the generic tagging API model ListTagsForResourceRequest and ListTagsForResourceResponse\"\n                },\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#ListTagsLogGroupResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"tags\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Tags\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags for the log group.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#deprecated\": {\n                    \"message\": \"Please use the generic tagging API model ListTagsForResourceRequest and ListTagsForResourceResponse\"\n                },\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#ListToMap\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"source\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Source\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The key in the log event that has a list of objects that will be converted to a\\n      map.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"key\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Key\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The key of the field to be extracted as keys in the generated map</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"valueKey\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ValueKey\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If this is specified, the values that you specify in this parameter will be extracted from\\n      the <code>source</code> objects and put into the values of the generated map. Otherwise,\\n      original objects in the source list will be put into the values of the generated map.</p>\"\n                    }\n                },\n                \"target\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Target\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The key of the field that will hold the generated map </p>\"\n                    }\n                },\n                \"flatten\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Flatten\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>A Boolean value to indicate whether the list will be flattened into single items. Specify\\n        <code>true</code> to flatten the list. The default is <code>false</code>\\n         </p>\"\n                    }\n                },\n                \"flattenedElement\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#FlattenedElement\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If you set <code>flatten</code> to <code>true</code>, use <code>flattenedElement</code> to\\n      specify which element, <code>first</code> or <code>last</code>, to keep. </p>\\n         <p>You must specify this parameter if <code>flatten</code> is <code>true</code>\\n         </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This processor takes a list of objects that contain key fields, and converts them into a\\n      map of target keys.</p>\\n         <p>For more information about this processor including examples, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CloudWatch-Logs-Transformation-Processors.html#CloudWatch-Logs-Transformation-listToMap\\\"> listToMap</a> in the <i>CloudWatch Logs User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#LiveTailSessionLogEvent\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"logStreamName\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogStreamName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the log stream that ingested this log event.</p>\"\n                    }\n                },\n                \"logGroupIdentifier\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogGroupIdentifier\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name or ARN of the log group that ingested this log event.</p>\"\n                    }\n                },\n                \"message\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#EventMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The log event message text.</p>\"\n                    }\n                },\n                \"timestamp\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The timestamp specifying when this log event was created.</p>\"\n                    }\n                },\n                \"ingestionTime\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The timestamp specifying when this log event was ingested into the log group.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This object contains the information for one log event returned in a Live Tail\\n      stream.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#LiveTailSessionMetadata\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"sampled\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#IsSampled\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>If this is <code>true</code>, then more than 500 log events matched the request for this\\n      update, and the <code>sessionResults</code> includes a sample of 500 of those events.</p>\\n         <p>If this is <code>false</code>, then 500 or fewer log events matched the request for this\\n      update, so no sampling was necessary. In this case, the <code>sessionResults</code> array\\n      includes all log events that matched your request during this time.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This object contains the metadata for one <code>LiveTailSessionUpdate</code> structure. It\\n      indicates whether that update includes only a sample of 500 log events out of a larger number\\n      of ingested log events, or if it contains all of the matching log events ingested during that\\n      second of time.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#LiveTailSessionResults\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#LiveTailSessionLogEvent\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#LiveTailSessionStart\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"requestId\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#RequestId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The unique ID generated by CloudWatch Logs to identify this Live Tail session\\n      request.</p>\"\n                    }\n                },\n                \"sessionId\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#SessionId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The unique ID generated by CloudWatch Logs to identify this Live Tail session.</p>\"\n                    }\n                },\n                \"logGroupIdentifiers\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#StartLiveTailLogGroupIdentifiers\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An array of the names and ARNs of the log groups included in this Live Tail\\n      session.</p>\"\n                    }\n                },\n                \"logStreamNames\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InputLogStreamNames\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If your StartLiveTail operation request included a <code>logStreamNames</code> parameter\\n      that filtered the session to only include certain log streams, these streams are listed\\n      here.</p>\"\n                    }\n                },\n                \"logStreamNamePrefixes\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InputLogStreamNames\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If your StartLiveTail operation request included a <code>logStreamNamePrefixes</code>\\n      parameter that filtered the session to only include log streams that have names that start\\n      with certain prefixes, these prefixes are listed here.</p>\"\n                    }\n                },\n                \"logEventFilterPattern\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#FilterPattern\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An optional pattern to filter the results to include only log events that match the\\n      pattern. For example, a filter pattern of <code>error 404</code> displays only log events that\\n      include both <code>error</code> and <code>404</code>.</p>\\n         <p>For more information about filter pattern syntax, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/FilterAndPatternSyntax.html\\\">Filter and Pattern\\n        Syntax</a>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This object contains information about this Live Tail session, including the log groups\\n      included and the log stream filters, if any.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#LiveTailSessionUpdate\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"sessionMetadata\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LiveTailSessionMetadata\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>This object contains the session metadata for a Live Tail session.</p>\"\n                    }\n                },\n                \"sessionResults\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LiveTailSessionResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An array, where each member of the array includes the information for one log event in the\\n      Live Tail session.</p>\\n         <p>A <code>sessionResults</code> array can include as many as 500 log events. If the number\\n      of log events matching the request exceeds 500 per second, the log events are sampled down to\\n      500 log events to be included in each <code>sessionUpdate</code> structure.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This object contains the log events and metadata for a Live Tail session.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#Locale\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#LogEvent\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"timestamp\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time stamp of the log event.</p>\"\n                    }\n                },\n                \"message\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#EventMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The message content of the log event.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This structure contains the information for one sample log event that is associated with\\n      an anomaly found by a log anomaly detector.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#LogEventIndex\": {\n            \"type\": \"integer\"\n        },\n        \"com.amazonaws.cloudwatchlogs#LogGroup\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"logGroupName\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogGroupName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the log group.</p>\"\n                    }\n                },\n                \"creationTime\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The creation time of the log group, expressed as the number of milliseconds after Jan\\n      1, 1970 00:00:00 UTC.</p>\"\n                    }\n                },\n                \"retentionInDays\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Days\"\n                },\n                \"metricFilterCount\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#FilterCount\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of metric filters.</p>\"\n                    }\n                },\n                \"arn\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Arn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the log group. This version of the ARN includes a\\n      trailing <code>:*</code> after the log group name. </p>\\n         <p>Use this version to refer to the ARN in IAM policies when specifying\\n      permissions for most API actions. The exception is when specifying permissions for <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_TagResource.html\\\">TagResource</a>, <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_UntagResource.html\\\">UntagResource</a>,\\n      and <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_ListTagsForResource.html\\\">ListTagsForResource</a>. The permissions for those three actions require the ARN\\n      version that doesn't include a trailing <code>:*</code>.</p>\"\n                    }\n                },\n                \"storedBytes\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#StoredBytes\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of bytes stored.</p>\"\n                    }\n                },\n                \"kmsKeyId\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#KmsKeyId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the KMS key to use when\\n      encrypting log data.</p>\"\n                    }\n                },\n                \"dataProtectionStatus\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DataProtectionStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Displays whether this log group has a protection policy, or whether it had one in the\\n      past. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutDataProtectionPolicy.html\\\">PutDataProtectionPolicy</a>.</p>\"\n                    }\n                },\n                \"inheritedProperties\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InheritedProperties\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Displays all the properties that this log group has inherited from account-level\\n      settings.</p>\"\n                    }\n                },\n                \"logGroupClass\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogGroupClass\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>This specifies the log group class for this log group. There are three classes:</p>\\n         <ul>\\n            <li>\\n               <p>The <code>Standard</code> log class supports all CloudWatch Logs features.</p>\\n            </li>\\n            <li>\\n               <p>The <code>Infrequent Access</code> log class supports a subset of CloudWatch Logs\\n          features and incurs lower costs.</p>\\n            </li>\\n            <li>\\n               <p>Use the <code>Delivery</code> log class only for delivering Lambda\\n          logs to store in Amazon S3 or Amazon Data Firehose. Log events in log groups in\\n          the Delivery class are kept in CloudWatch Logs for only one day. This log class doesn't\\n          offer rich CloudWatch Logs capabilities such as CloudWatch Logs Insights\\n          queries.</p>\\n            </li>\\n         </ul>\\n         <p>For details about the features supported by the Standard and Infrequent Access classes,\\n      see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CloudWatch_Logs_Log_Classes.html\\\">Log classes</a>\\n         </p>\"\n                    }\n                },\n                \"logGroupArn\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Arn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the log group. This version of the ARN doesn't\\n      include a trailing <code>:*</code> after the log group name. </p>\\n         <p>Use this version to refer to the ARN in the following situations:</p>\\n         <ul>\\n            <li>\\n               <p>In the <code>logGroupIdentifier</code> input field in many CloudWatch Logs\\n          APIs.</p>\\n            </li>\\n            <li>\\n               <p>In the <code>resourceArn</code> field in tagging APIs</p>\\n            </li>\\n            <li>\\n               <p>In IAM policies, when specifying permissions for <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_TagResource.html\\\">TagResource</a>, <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_UntagResource.html\\\">UntagResource</a>, and <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_ListTagsForResource.html\\\">ListTagsForResource</a>.</p>\\n            </li>\\n         </ul>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents a log group.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#LogGroupArn\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 2048\n                },\n                \"smithy.api#pattern\": \"^[\\\\w#+=/:,.@-]*$\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#LogGroupArnList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#LogGroupArn\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#LogGroupClass\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"STANDARD\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"STANDARD\"\n                    }\n                },\n                \"INFREQUENT_ACCESS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"INFREQUENT_ACCESS\"\n                    }\n                },\n                \"DELIVERY\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DELIVERY\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#LogGroupField\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"name\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Field\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of a log field.</p>\"\n                    }\n                },\n                \"percent\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Percentage\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The percentage of log events queried that contained the field.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The fields contained in log events found by a <code>GetLogGroupFields</code> operation,\\n      along with the percentage of queried log events in which each field appears.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#LogGroupFieldList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#LogGroupField\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#LogGroupIdentifier\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 2048\n                },\n                \"smithy.api#pattern\": \"^[\\\\w#+=/:,.@-]*$\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#LogGroupIdentifiers\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#LogGroupIdentifier\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#LogGroupName\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 512\n                },\n                \"smithy.api#pattern\": \"^[\\\\.\\\\-_/#A-Za-z0-9]+$\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#LogGroupNamePattern\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 512\n                },\n                \"smithy.api#pattern\": \"^[\\\\.\\\\-_/#A-Za-z0-9]*$\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#LogGroupNameRegexPattern\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 3,\n                    \"max\": 129\n                },\n                \"smithy.api#pattern\": \"^(\\\\^?[\\\\.\\\\-_\\\\/#A-Za-z0-9]{3,24})(\\\\|\\\\^?[\\\\.\\\\-_\\\\/#A-Za-z0-9]{3,24}){0,4}$\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#LogGroupNames\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#LogGroupName\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#LogGroupSummaries\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#LogGroupSummary\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#LogGroupSummary\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"logGroupName\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogGroupName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the log group.</p>\"\n                    }\n                },\n                \"logGroupArn\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Arn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the log group.</p>\"\n                    }\n                },\n                \"logGroupClass\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogGroupClass\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The log group class for this log group. For details about the features supported by each\\n      log group class, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CloudWatch_Logs_Log_Classes.html\\\">Log classes</a>\\n         </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This structure contains information about one log group in your account.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#LogGroups\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#LogGroup\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#LogObjectPointer\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 512\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#LogRecord\": {\n            \"type\": \"map\",\n            \"key\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#Field\"\n            },\n            \"value\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#Value\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#LogRecordPointer\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.cloudwatchlogs#LogSamples\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#LogEvent\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#LogStream\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"logStreamName\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogStreamName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the log stream.</p>\"\n                    }\n                },\n                \"creationTime\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The creation time of the stream, expressed as the number of milliseconds after\\n        <code>Jan 1, 1970 00:00:00 UTC</code>.</p>\"\n                    }\n                },\n                \"firstEventTimestamp\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time of the first event, expressed as the number of milliseconds after <code>Jan 1,\\n        1970 00:00:00 UTC</code>.</p>\"\n                    }\n                },\n                \"lastEventTimestamp\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time of the most recent log event in the log stream in CloudWatch Logs. This number\\n      is expressed as the number of milliseconds after <code>Jan 1, 1970 00:00:00 UTC</code>. The\\n        <code>lastEventTime</code> value updates on an eventual consistency basis. It typically\\n      updates in less than an hour from ingestion, but in rare situations might take\\n      longer.</p>\"\n                    }\n                },\n                \"lastIngestionTime\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ingestion time, expressed as the number of milliseconds after <code>Jan 1, 1970\\n        00:00:00 UTC</code> The <code>lastIngestionTime</code> value updates on an eventual\\n      consistency basis. It typically updates in less than an hour after ingestion, but in rare\\n      situations might take longer.</p>\"\n                    }\n                },\n                \"uploadSequenceToken\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#SequenceToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The sequence token.</p>\\n         <important>\\n            <p>The sequence token is now ignored in <code>PutLogEvents</code> actions.\\n          <code>PutLogEvents</code> actions are always accepted regardless of receiving an invalid\\n        sequence token. You don't need to obtain <code>uploadSequenceToken</code> to use a\\n          <code>PutLogEvents</code> action.</p>\\n         </important>\"\n                    }\n                },\n                \"arn\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Arn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the log stream.</p>\"\n                    }\n                },\n                \"storedBytes\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#StoredBytes\",\n                    \"traits\": {\n                        \"smithy.api#deprecated\": {\n                            \"message\": \"Starting on June 17, 2019, this parameter will be deprecated for log streams, and will be reported as zero. This change applies only to log streams. The storedBytes parameter for log groups is not affected.\"\n                        },\n                        \"smithy.api#documentation\": \"<p>The number of bytes stored.</p>\\n         <p>\\n            <b>Important:</b> As of June 17, 2019, this parameter is no\\n      longer supported for log streams, and is always reported as zero. This change applies only to\\n      log streams. The <code>storedBytes</code> parameter for log groups is not affected.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents a log stream, which is a sequence of log events from a single emitter of\\n      logs.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#LogStreamName\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 512\n                },\n                \"smithy.api#pattern\": \"^[^:*]*$\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#LogStreamSearchedCompletely\": {\n            \"type\": \"boolean\"\n        },\n        \"com.amazonaws.cloudwatchlogs#LogStreams\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#LogStream\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#LogType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 255\n                },\n                \"smithy.api#pattern\": \"^[\\\\w]*$\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#LogTypes\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#LogType\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 10\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#Logs_20140328\": {\n            \"type\": \"service\",\n            \"version\": \"2014-03-28\",\n            \"operations\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#AssociateKmsKey\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#CancelExportTask\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#CreateDelivery\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#CreateExportTask\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#CreateLogAnomalyDetector\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#CreateLogGroup\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#CreateLogStream\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DeleteAccountPolicy\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DeleteDataProtectionPolicy\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DeleteDelivery\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DeleteDeliveryDestination\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DeleteDeliveryDestinationPolicy\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DeleteDeliverySource\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DeleteDestination\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DeleteIndexPolicy\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DeleteIntegration\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DeleteLogAnomalyDetector\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DeleteLogGroup\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DeleteLogStream\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DeleteMetricFilter\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DeleteQueryDefinition\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DeleteResourcePolicy\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DeleteRetentionPolicy\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DeleteSubscriptionFilter\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DeleteTransformer\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DescribeAccountPolicies\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DescribeConfigurationTemplates\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DescribeDeliveries\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DescribeDeliveryDestinations\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DescribeDeliverySources\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DescribeDestinations\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DescribeExportTasks\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DescribeFieldIndexes\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DescribeIndexPolicies\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DescribeLogGroups\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DescribeLogStreams\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DescribeMetricFilters\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DescribeQueries\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DescribeQueryDefinitions\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DescribeResourcePolicies\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DescribeSubscriptionFilters\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DisassociateKmsKey\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#FilterLogEvents\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#GetDataProtectionPolicy\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#GetDelivery\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#GetDeliveryDestination\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#GetDeliveryDestinationPolicy\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#GetDeliverySource\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#GetIntegration\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#GetLogAnomalyDetector\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#GetLogEvents\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#GetLogGroupFields\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#GetLogObject\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#GetLogRecord\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#GetQueryResults\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#GetTransformer\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ListAnomalies\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ListIntegrations\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ListLogAnomalyDetectors\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ListLogGroups\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ListLogGroupsForQuery\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ListTagsForResource\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ListTagsLogGroup\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#PutAccountPolicy\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#PutDataProtectionPolicy\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#PutDeliveryDestination\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#PutDeliveryDestinationPolicy\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#PutDeliverySource\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#PutDestination\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#PutDestinationPolicy\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#PutIndexPolicy\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#PutIntegration\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#PutLogEvents\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#PutMetricFilter\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#PutQueryDefinition\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#PutResourcePolicy\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#PutRetentionPolicy\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#PutSubscriptionFilter\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#PutTransformer\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#StartLiveTail\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#StartQuery\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#StopQuery\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#TagLogGroup\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#TagResource\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#TestMetricFilter\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#TestTransformer\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#UntagLogGroup\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#UntagResource\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#UpdateAnomaly\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#UpdateDeliveryConfiguration\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#UpdateLogAnomalyDetector\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#service\": {\n                    \"sdkId\": \"CloudWatch Logs\",\n                    \"arnNamespace\": \"logs\",\n                    \"cloudFormationName\": \"Logs\",\n                    \"cloudTrailEventSource\": \"logs.amazonaws.com\",\n                    \"docId\": \"logs-2014-03-28\",\n                    \"endpointPrefix\": \"logs\"\n                },\n                \"aws.auth#sigv4\": {\n                    \"name\": \"logs\"\n                },\n                \"aws.protocols#awsJson1_1\": {},\n                \"smithy.api#documentation\": \"<p>You can use Amazon CloudWatch Logs to monitor, store, and access your log files from\\n      EC2 instances, CloudTrail, and other sources. You can then retrieve the associated\\n      log data from CloudWatch Logs using the CloudWatch console. Alternatively, you can use\\n      CloudWatch Logs commands in the Amazon Web Services CLI, CloudWatch Logs API, or CloudWatch\\n      Logs SDK.</p>\\n         <p>You can use CloudWatch Logs to:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <b>Monitor logs from EC2 instances in real time</b>: You\\n          can use CloudWatch Logs to monitor applications and systems using log data. For example,\\n          CloudWatch Logs can track the number of errors that occur in your application logs. Then,\\n          it can send you a notification whenever the rate of errors exceeds a threshold that you\\n          specify. CloudWatch Logs uses your log data for monitoring so no code changes are\\n          required. For example, you can monitor application logs for specific literal terms (such\\n          as \\\"NullReferenceException\\\"). You can also count the number of occurrences of a literal\\n          term at a particular position in log data (such as \\\"404\\\" status codes in an Apache access\\n          log). When the term you are searching for is found, CloudWatch Logs reports the data to a\\n          CloudWatch metric that you specify.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>Monitor CloudTrail logged events</b>: You\\n          can create alarms in CloudWatch and receive notifications of particular API activity as\\n          captured by CloudTrail. You can use the notification to perform troubleshooting.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>Archive log data</b>: You can use CloudWatch Logs to\\n          store your log data in highly durable storage. You can change the log retention setting so\\n          that any log events earlier than this setting are automatically deleted. The CloudWatch\\n          Logs agent helps to quickly send both rotated and non-rotated log data off of a host and\\n          into the log service. You can then access the raw log data when you need it.</p>\\n            </li>\\n         </ul>\",\n                \"smithy.api#title\": \"Amazon CloudWatch Logs\",\n                \"smithy.api#xmlNamespace\": {\n                    \"uri\": \"http://monitoring.amazonaws.com/doc/2014-03-28/\"\n                },\n                \"smithy.rules#endpointRuleSet\": {\n                    \"version\": \"1.0\",\n                    \"parameters\": {\n                        \"Region\": {\n                            \"builtIn\": \"AWS::Region\",\n                            \"required\": false,\n                            \"documentation\": \"The AWS region used to dispatch the request.\",\n                            \"type\": \"String\"\n                        },\n                        \"UseDualStack\": {\n                            \"builtIn\": \"AWS::UseDualStack\",\n                            \"required\": true,\n                            \"default\": false,\n                            \"documentation\": \"When true, use the dual-stack endpoint. If the configured endpoint does not support dual-stack, dispatching the request MAY return an error.\",\n                            \"type\": \"Boolean\"\n                        },\n                        \"UseFIPS\": {\n                            \"builtIn\": \"AWS::UseFIPS\",\n                            \"required\": true,\n                            \"default\": false,\n                            \"documentation\": \"When true, send this request to the FIPS-compliant regional endpoint. If the configured endpoint does not have a FIPS compliant endpoint, dispatching the request will return an error.\",\n                            \"type\": \"Boolean\"\n                        },\n                        \"Endpoint\": {\n                            \"builtIn\": \"SDK::Endpoint\",\n                            \"required\": false,\n                            \"documentation\": \"Override the endpoint used to send this request\",\n                            \"type\": \"String\"\n                        }\n                    },\n                    \"rules\": [\n                        {\n                            \"conditions\": [\n                                {\n                                    \"fn\": \"isSet\",\n                                    \"argv\": [\n                                        {\n                                            \"ref\": \"Endpoint\"\n                                        }\n                                    ]\n                                }\n                            ],\n                            \"rules\": [\n                                {\n                                    \"conditions\": [\n                                        {\n                                            \"fn\": \"booleanEquals\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"UseFIPS\"\n                                                },\n                                                true\n                                            ]\n                                        }\n                                    ],\n                                    \"error\": \"Invalid Configuration: FIPS and custom endpoint are not supported\",\n                                    \"type\": \"error\"\n                                },\n                                {\n                                    \"conditions\": [\n                                        {\n                                            \"fn\": \"booleanEquals\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"UseDualStack\"\n                                                },\n                                                true\n                                            ]\n                                        }\n                                    ],\n                                    \"error\": \"Invalid Configuration: Dualstack and custom endpoint are not supported\",\n                                    \"type\": \"error\"\n                                },\n                                {\n                                    \"conditions\": [],\n                                    \"endpoint\": {\n                                        \"url\": {\n                                            \"ref\": \"Endpoint\"\n                                        },\n                                        \"properties\": {},\n                                        \"headers\": {}\n                                    },\n                                    \"type\": \"endpoint\"\n                                }\n                            ],\n                            \"type\": \"tree\"\n                        },\n                        {\n                            \"conditions\": [\n                                {\n                                    \"fn\": \"isSet\",\n                                    \"argv\": [\n                                        {\n                                            \"ref\": \"Region\"\n                                        }\n                                    ]\n                                }\n                            ],\n                            \"rules\": [\n                                {\n                                    \"conditions\": [\n                                        {\n                                            \"fn\": \"aws.partition\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"Region\"\n                                                }\n                                            ],\n                                            \"assign\": \"PartitionResult\"\n                                        }\n                                    ],\n                                    \"rules\": [\n                                        {\n                                            \"conditions\": [\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseFIPS\"\n                                                        },\n                                                        true\n                                                    ]\n                                                },\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseDualStack\"\n                                                        },\n                                                        true\n                                                    ]\n                                                }\n                                            ],\n                                            \"rules\": [\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                true,\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"PartitionResult\"\n                                                                        },\n                                                                        \"supportsFIPS\"\n                                                                    ]\n                                                                }\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                true,\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"PartitionResult\"\n                                                                        },\n                                                                        \"supportsDualStack\"\n                                                                    ]\n                                                                }\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"rules\": [\n                                                        {\n                                                            \"conditions\": [],\n                                                            \"endpoint\": {\n                                                                \"url\": \"https://logs-fips.{Region}.{PartitionResult#dualStackDnsSuffix}\",\n                                                                \"properties\": {},\n                                                                \"headers\": {}\n                                                            },\n                                                            \"type\": \"endpoint\"\n                                                        }\n                                                    ],\n                                                    \"type\": \"tree\"\n                                                },\n                                                {\n                                                    \"conditions\": [],\n                                                    \"error\": \"FIPS and DualStack are enabled, but this partition does not support one or both\",\n                                                    \"type\": \"error\"\n                                                }\n                                            ],\n                                            \"type\": \"tree\"\n                                        },\n                                        {\n                                            \"conditions\": [\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseFIPS\"\n                                                        },\n                                                        true\n                                                    ]\n                                                }\n                                            ],\n                                            \"rules\": [\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"PartitionResult\"\n                                                                        },\n                                                                        \"supportsFIPS\"\n                                                                    ]\n                                                                },\n                                                                true\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"rules\": [\n                                                        {\n                                                            \"conditions\": [\n                                                                {\n                                                                    \"fn\": \"stringEquals\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"Region\"\n                                                                        },\n                                                                        \"us-gov-east-1\"\n                                                                    ]\n                                                                }\n                                                            ],\n                                                            \"endpoint\": {\n                                                                \"url\": \"https://logs.us-gov-east-1.amazonaws.com\",\n                                                                \"properties\": {},\n                                                                \"headers\": {}\n                                                            },\n                                                            \"type\": \"endpoint\"\n                                                        },\n                                                        {\n                                                            \"conditions\": [\n                                                                {\n                                                                    \"fn\": \"stringEquals\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"Region\"\n                                                                        },\n                                                                        \"us-gov-west-1\"\n                                                                    ]\n                                                                }\n                                                            ],\n                                                            \"endpoint\": {\n                                                                \"url\": \"https://logs.us-gov-west-1.amazonaws.com\",\n                                                                \"properties\": {},\n                                                                \"headers\": {}\n                                                            },\n                                                            \"type\": \"endpoint\"\n                                                        },\n                                                        {\n                                                            \"conditions\": [],\n                                                            \"endpoint\": {\n                                                                \"url\": \"https://logs-fips.{Region}.{PartitionResult#dnsSuffix}\",\n                                                                \"properties\": {},\n                                                                \"headers\": {}\n                                                            },\n                                                            \"type\": \"endpoint\"\n                                                        }\n                                                    ],\n                                                    \"type\": \"tree\"\n                                                },\n                                                {\n                                                    \"conditions\": [],\n                                                    \"error\": \"FIPS is enabled but this partition does not support FIPS\",\n                                                    \"type\": \"error\"\n                                                }\n                                            ],\n                                            \"type\": \"tree\"\n                                        },\n                                        {\n                                            \"conditions\": [\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseDualStack\"\n                                                        },\n                                                        true\n                                                    ]\n                                                }\n                                            ],\n                                            \"rules\": [\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                true,\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"PartitionResult\"\n                                                                        },\n                                                                        \"supportsDualStack\"\n                                                                    ]\n                                                                }\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"rules\": [\n                                                        {\n                                                            \"conditions\": [],\n                                                            \"endpoint\": {\n                                                                \"url\": \"https://logs.{Region}.{PartitionResult#dualStackDnsSuffix}\",\n                                                                \"properties\": {},\n                                                                \"headers\": {}\n                                                            },\n                                                            \"type\": \"endpoint\"\n                                                        }\n                                                    ],\n                                                    \"type\": \"tree\"\n                                                },\n                                                {\n                                                    \"conditions\": [],\n                                                    \"error\": \"DualStack is enabled but this partition does not support DualStack\",\n                                                    \"type\": \"error\"\n                                                }\n                                            ],\n                                            \"type\": \"tree\"\n                                        },\n                                        {\n                                            \"conditions\": [],\n                                            \"endpoint\": {\n                                                \"url\": \"https://logs.{Region}.{PartitionResult#dnsSuffix}\",\n                                                \"properties\": {},\n                                                \"headers\": {}\n                                            },\n                                            \"type\": \"endpoint\"\n                                        }\n                                    ],\n                                    \"type\": \"tree\"\n                                }\n                            ],\n                            \"type\": \"tree\"\n                        },\n                        {\n                            \"conditions\": [],\n                            \"error\": \"Invalid Configuration: Missing Region\",\n                            \"type\": \"error\"\n                        }\n                    ]\n                },\n                \"smithy.rules#endpointTests\": {\n                    \"testCases\": [\n                        {\n                            \"documentation\": \"For region af-south-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://logs.af-south-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"af-south-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://logs.ap-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-northeast-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://logs.ap-northeast-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-northeast-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-northeast-2 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://logs.ap-northeast-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-northeast-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-northeast-3 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://logs.ap-northeast-3.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-northeast-3\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-south-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://logs.ap-south-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-south-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-southeast-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://logs.ap-southeast-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-southeast-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-southeast-2 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://logs.ap-southeast-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-southeast-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-southeast-3 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://logs.ap-southeast-3.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-southeast-3\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ca-central-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://logs.ca-central-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ca-central-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-central-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://logs.eu-central-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-central-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-north-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://logs.eu-north-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-north-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-south-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://logs.eu-south-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-south-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-west-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://logs.eu-west-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-west-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-west-2 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://logs.eu-west-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-west-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-west-3 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://logs.eu-west-3.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-west-3\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region me-south-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://logs.me-south-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"me-south-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region sa-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://logs.sa-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"sa-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://logs.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://logs-fips.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-2 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://logs.us-east-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-2 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://logs-fips.us-east-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-2\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-west-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://logs.us-west-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-west-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-west-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://logs-fips.us-west-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-west-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-west-2 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://logs.us-west-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-west-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-west-2 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://logs-fips.us-west-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-west-2\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-1 with FIPS enabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://logs-fips.us-east-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-1 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://logs.us-east-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-north-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://logs.cn-north-1.amazonaws.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-north-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-northwest-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://logs.cn-northwest-1.amazonaws.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-northwest-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-north-1 with FIPS enabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://logs-fips.cn-north-1.api.amazonwebservices.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-north-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-north-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://logs-fips.cn-north-1.amazonaws.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-north-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-north-1 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://logs.cn-north-1.api.amazonwebservices.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-north-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://logs.us-gov-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-east-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://logs.us-gov-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-west-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://logs.us-gov-west-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-west-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-west-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://logs.us-gov-west-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-west-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-east-1 with FIPS enabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://logs-fips.us-gov-east-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-east-1 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://logs.us-gov-east-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-iso-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://logs.us-iso-east-1.c2s.ic.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-iso-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-iso-west-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://logs.us-iso-west-1.c2s.ic.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-iso-west-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-iso-east-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://logs-fips.us-iso-east-1.c2s.ic.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-iso-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-isob-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://logs.us-isob-east-1.sc2s.sgov.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-isob-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-isob-east-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://logs-fips.us-isob-east-1.sc2s.sgov.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-isob-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For custom endpoint with region set and fips disabled and dualstack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://example.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"For custom endpoint with region not set and fips disabled and dualstack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://example.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"For custom endpoint with fips enabled and dualstack disabled\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: FIPS and custom endpoint are not supported\"\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false,\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"For custom endpoint with fips disabled and dualstack enabled\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: Dualstack and custom endpoint are not supported\"\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true,\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"Missing region\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: Missing Region\"\n                            }\n                        }\n                    ],\n                    \"version\": \"1.0\"\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#LowerCaseString\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"withKeys\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LowerCaseStringWithKeys\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The array caontaining the keys of the fields to convert to lowercase.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This processor converts a string to lowercase.</p>\\n         <p>For more information about this processor including examples, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CloudWatch-Logs-Transformation.html#CloudWatch-Logs-Transformation-lowerCaseString\\\"> lowerCaseString</a> in the <i>CloudWatch Logs User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#LowerCaseStringWithKeys\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#WithKey\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 10\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#MalformedQueryException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"queryCompileError\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#QueryCompileError\"\n                },\n                \"message\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Message\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The query string is not valid. Details about this error are displayed in a\\n        <code>QueryCompileError</code> object. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_QueryCompileError.html\\\">QueryCompileError</a>.</p>\\n         <p>For more information about valid query syntax, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CWL_QuerySyntax.html\\\">CloudWatch Logs Insights Query\\n        Syntax</a>.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#MatchPattern\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#MatchPatterns\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#MatchPattern\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 5\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#Message\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.cloudwatchlogs#MetricFilter\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"filterName\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#FilterName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the metric filter.</p>\"\n                    }\n                },\n                \"filterPattern\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#FilterPattern\"\n                },\n                \"metricTransformations\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#MetricTransformations\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The metric transformations.</p>\"\n                    }\n                },\n                \"creationTime\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The creation time of the metric filter, expressed as the number of milliseconds after\\n        <code>Jan 1, 1970 00:00:00 UTC</code>.</p>\"\n                    }\n                },\n                \"logGroupName\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogGroupName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the log group.</p>\"\n                    }\n                },\n                \"applyOnTransformedLogs\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ApplyOnTransformedLogs\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>This parameter is valid only for log groups that have an active log transformer. For more\\n      information about log transformers, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutTransformer.html\\\">PutTransformer</a>.</p>\\n         <p>If this value is <code>true</code>, the metric filter is applied on the transformed\\n      version of the log events instead of the original ingested log events.</p>\"\n                    }\n                },\n                \"fieldSelectionCriteria\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#FieldSelectionCriteria\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The filter expression that specifies which log events are processed by this metric filter based on system fields. Returns the <code>fieldSelectionCriteria</code> value if it was specified when the metric filter was created.</p>\"\n                    }\n                },\n                \"emitSystemFieldDimensions\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#EmitSystemFields\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The list of system fields that are emitted as additional dimensions in the generated metrics. Returns the <code>emitSystemFieldDimensions</code> value if it was specified when the metric filter was created.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Metric filters express how CloudWatch Logs would extract metric observations from\\n      ingested log events and transform them into metric data in a CloudWatch metric.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#MetricFilterMatchRecord\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"eventNumber\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#EventNumber\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The event number.</p>\"\n                    }\n                },\n                \"eventMessage\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#EventMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The raw event data.</p>\"\n                    }\n                },\n                \"extractedValues\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ExtractedValues\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The values extracted from the event data by the filter.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents a matched event.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#MetricFilterMatches\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#MetricFilterMatchRecord\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#MetricFilters\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#MetricFilter\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#MetricName\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The name of the CloudWatch metric to which the monitored log information should be\\n      published. For example, you might publish to a metric named ErrorCount.</p>\",\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 255\n                },\n                \"smithy.api#pattern\": \"^[^:*$]*$\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#MetricNamespace\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 255\n                },\n                \"smithy.api#pattern\": \"^[^:*$]*$\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#MetricTransformation\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"metricName\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#MetricName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the CloudWatch metric.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"metricNamespace\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#MetricNamespace\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A custom namespace to contain your metric in CloudWatch. Use namespaces to group\\n      together metrics that are similar. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/cloudwatch_concepts.html#Namespace\\\">Namespaces</a>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"metricValue\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#MetricValue\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The value to publish to the CloudWatch metric when a filter pattern matches a log\\n      event.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"defaultValue\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DefaultValue\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>(Optional) The value to emit when a filter pattern does not match a log event. This\\n      value can be null.</p>\"\n                    }\n                },\n                \"dimensions\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Dimensions\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The fields to use as dimensions for the metric. One metric filter can include as many as\\n      three dimensions.</p>\\n         <important>\\n            <p>Metrics extracted from log events are charged as custom metrics. To prevent unexpected\\n        high charges, do not specify high-cardinality fields such as <code>IPAddress</code> or\\n          <code>requestID</code> as dimensions. Each different value found for a dimension is\\n        treated as a separate metric and accrues charges as a separate custom metric. </p>\\n            <p>CloudWatch Logs disables a metric filter if it generates 1000 different name/value\\n        pairs for your specified dimensions within a certain amount of time. This helps to prevent\\n        accidental high charges.</p>\\n            <p>You can also set up a billing alarm to alert you if your charges are higher than\\n        expected. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/monitor_estimated_charges_with_cloudwatch.html\\\">\\n          Creating a Billing Alarm to Monitor Your Estimated Amazon Web Services Charges</a>.\\n      </p>\\n         </important>\"\n                    }\n                },\n                \"unit\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#StandardUnit\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The unit to assign to the metric. If you omit this, the unit is set as\\n      <code>None</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Indicates how to transform ingested log events to metric data in a CloudWatch\\n      metric.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#MetricTransformations\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#MetricTransformation\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 1\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#MetricValue\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The value to publish to the CloudWatch metric. For example, if you're counting the\\n      occurrences of a term like <code>Error</code>, the value is <code>1</code> for each\\n      occurrence. If you're counting the bytes transferred, the value is the value in the log\\n      event.</p>\",\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 100\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#MoveKeyEntries\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#MoveKeyEntry\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 5\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#MoveKeyEntry\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"source\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Source\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The key to move.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"target\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Target\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The key to move to.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"overwriteIfExists\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#OverwriteIfExists\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Specifies whether to overwrite the value if the destination key already exists. If you\\n      omit this, the default is <code>false</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This object defines one key that will be moved with the <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CloudWatch-Logs-Transformation.html#CloudWatch-Logs-Transformation-moveKey\\\"> moveKey</a> processor.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#MoveKeys\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"entries\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#MoveKeyEntries\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An array of objects, where each object contains the information about one key to move.\\n    </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This processor moves a key from one field to another. The original key is deleted.</p>\\n         <p>For more information about this processor including examples, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CloudWatch-Logs-Transformation.html#CloudWatch-Logs-Transformation-moveKeys\\\"> moveKeys</a> in the <i>CloudWatch Logs User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#NextToken\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The token for the next set of items to return. The token expires after 24\\n      hours.</p>\",\n                \"smithy.api#length\": {\n                    \"min\": 1\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#NonMatchValue\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 128\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#OCSFVersion\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"V1_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"V1.1\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#OpenSearchApplication\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"applicationEndpoint\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#OpenSearchApplicationEndpoint\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The endpoint of the application.</p>\"\n                    }\n                },\n                \"applicationArn\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Arn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the application.</p>\"\n                    }\n                },\n                \"applicationId\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#OpenSearchApplicationId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the application.</p>\"\n                    }\n                },\n                \"status\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#OpenSearchResourceStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>This structure contains information about the status of this OpenSearch Service\\n      resource.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This structure contains information about the OpenSearch Service application used for this\\n      integration. An OpenSearch Service application is the web application created by the\\n      integration with CloudWatch Logs. It hosts the vended logs dashboards.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#OpenSearchApplicationEndpoint\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 1024\n                },\n                \"smithy.api#pattern\": \"^https://[\\\\.\\\\-_/#:A-Za-z0-9]+\\\\.com$\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#OpenSearchApplicationId\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 256\n                },\n                \"smithy.api#pattern\": \"^[\\\\.\\\\-_/#A-Za-z0-9]+$\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#OpenSearchCollection\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"collectionEndpoint\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#OpenSearchCollectionEndpoint\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The endpoint of the collection.</p>\"\n                    }\n                },\n                \"collectionArn\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Arn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the collection.</p>\"\n                    }\n                },\n                \"status\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#OpenSearchResourceStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>This structure contains information about the status of this OpenSearch Service\\n      resource.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This structure contains information about the OpenSearch Service collection used for this\\n      integration. An OpenSearch Service collection is a logical grouping of one or more indexes\\n      that represent an analytics workload. For more information, see <a href=\\\"https://docs.aws.amazon.com/opensearch-service/latest/developerguide/serverless-collections.html\\\">Creating and\\n        managing OpenSearch Service Serverless collections</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#OpenSearchCollectionEndpoint\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 1024\n                },\n                \"smithy.api#pattern\": \"^https://[\\\\.\\\\-_/#:A-Za-z0-9]+\\\\.com$\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#OpenSearchDataAccessPolicy\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"policyName\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#OpenSearchPolicyName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the data access policy.</p>\"\n                    }\n                },\n                \"status\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#OpenSearchResourceStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>This structure contains information about the status of this OpenSearch Service\\n      resource.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This structure contains information about the OpenSearch Service data access policy used\\n      for this integration. The access policy defines the access controls for the collection. This\\n      data access policy was automatically created as part of the integration setup. For more\\n      information about OpenSearch Service data access policies, see <a href=\\\"https://docs.aws.amazon.com/opensearch-service/latest/developerguide/serverless-data-access.html\\\">Data access\\n        control for Amazon OpenSearch Serverless</a> in the OpenSearch Service Developer\\n      Guide.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#OpenSearchDataSource\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"dataSourceName\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#OpenSearchDataSourceName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the OpenSearch Service data source.</p>\"\n                    }\n                },\n                \"status\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#OpenSearchResourceStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>This structure contains information about the status of this OpenSearch Service\\n      resource.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This structure contains information about the OpenSearch Service data source used for this\\n      integration. This data source was created as part of the integration setup. An OpenSearch Service data source defines the source and destination for OpenSearch Service queries. It\\n      includes the role required to execute queries and write to collections.</p>\\n         <p>For more information about OpenSearch Service data sources , see <a href=\\\"https://docs.aws.amazon.com/opensearch-service/latest/developerguide/direct-query-s3-creating.html\\\">Creating\\n          OpenSearch Service data source integrations with Amazon S3.</a>\\n         </p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#OpenSearchDataSourceName\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 256\n                },\n                \"smithy.api#pattern\": \"^[\\\\.\\\\-_/#A-Za-z0-9]+$\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#OpenSearchEncryptionPolicy\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"policyName\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#OpenSearchPolicyName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the encryption policy.</p>\"\n                    }\n                },\n                \"status\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#OpenSearchResourceStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>This structure contains information about the status of this OpenSearch Service\\n      resource.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This structure contains information about the OpenSearch Service encryption policy used\\n      for this integration. The encryption policy was created automatically when you created the\\n      integration. For more information, see <a href=\\\"https://docs.aws.amazon.com/opensearch-service/latest/developerguide/serverless-encryption.html#serverless-encryption-policies\\\">Encryption policies</a> in the OpenSearch Service Developer Guide. </p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#OpenSearchIntegrationDetails\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"dataSource\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#OpenSearchDataSource\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>This structure contains information about the OpenSearch Service data source used for this\\n      integration. This data source was created as part of the integration setup. An OpenSearch Service data source defines the source and destination for OpenSearch Service queries. It\\n      includes the role required to execute queries and write to collections.</p>\\n         <p>For more information about OpenSearch Service data sources , see <a href=\\\"https://docs.aws.amazon.com/opensearch-service/latest/developerguide/direct-query-s3-creating.html\\\">Creating\\n          OpenSearch Service data source integrations with Amazon S3.</a>\\n         </p>\"\n                    }\n                },\n                \"application\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#OpenSearchApplication\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>This structure contains information about the OpenSearch Service application used for this\\n      integration. An OpenSearch Service application is the web application that was created by the\\n      integration with CloudWatch Logs. It hosts the vended logs dashboards.</p>\"\n                    }\n                },\n                \"collection\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#OpenSearchCollection\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>This structure contains information about the OpenSearch Service collection used for this\\n      integration. This collection was created as part of the integration setup. An OpenSearch Service collection is a logical grouping of one or more indexes that represent an analytics\\n      workload. For more information, see <a href=\\\"https://docs.aws.amazon.com/opensearch-service/latest/developerguide/serverless-collections.html\\\">Creating and\\n        managing OpenSearch Service Serverless collections</a>.</p>\"\n                    }\n                },\n                \"workspace\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#OpenSearchWorkspace\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>This structure contains information about the OpenSearch Service workspace used for this\\n      integration. An OpenSearch Service workspace is the collection of dashboards along with other\\n        OpenSearch Service tools. This workspace was created automatically as part of the\\n      integration setup. For more information, see <a href=\\\"https://docs.aws.amazon.com/opensearch-service/latest/developerguide/application.html\\\">Centralized OpenSearch user\\n        interface (Dashboards) with OpenSearch Service</a>.</p>\"\n                    }\n                },\n                \"encryptionPolicy\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#OpenSearchEncryptionPolicy\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>This structure contains information about the OpenSearch Service encryption policy used\\n      for this integration. The encryption policy was created automatically when you created the\\n      integration. For more information, see <a href=\\\"https://docs.aws.amazon.com/opensearch-service/latest/developerguide/serverless-encryption.html#serverless-encryption-policies\\\">Encryption policies</a> in the OpenSearch Service Developer Guide. </p>\"\n                    }\n                },\n                \"networkPolicy\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#OpenSearchNetworkPolicy\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>This structure contains information about the OpenSearch Service network policy used for\\n      this integration. The network policy assigns network access settings to collections. For more\\n      information, see <a href=\\\"https://docs.aws.amazon.com/opensearch-service/latest/developerguide/serverless-network.html#serverless-network-policies\\\">Network policies</a> in the OpenSearch Service Developer Guide.</p>\"\n                    }\n                },\n                \"accessPolicy\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#OpenSearchDataAccessPolicy\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>This structure contains information about the OpenSearch Service data access policy used\\n      for this integration. The access policy defines the access controls for the collection. This\\n      data access policy was automatically created as part of the integration setup. For more\\n      information about OpenSearch Service data access policies, see <a href=\\\"https://docs.aws.amazon.com/opensearch-service/latest/developerguide/serverless-data-access.html\\\">Data access\\n        control for Amazon OpenSearch Serverless</a> in the OpenSearch Service Developer\\n      Guide.</p>\"\n                    }\n                },\n                \"lifecyclePolicy\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#OpenSearchLifecyclePolicy\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>This structure contains information about the OpenSearch Service data lifecycle policy\\n      used for this integration. The lifecycle policy determines the lifespan of the data in the\\n      collection. It was automatically created as part of the integration setup.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/opensearch-service/latest/developerguide/serverless-lifecycle.html\\\">Using data\\n        lifecycle policies with OpenSearch Service Serverless</a> in the OpenSearch Service\\n      Developer Guide.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This structure contains complete information about one CloudWatch Logs integration.\\n      This structure is returned by a <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_GetIntegration.html\\\">GetIntegration</a> operation.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#OpenSearchLifecyclePolicy\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"policyName\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#OpenSearchPolicyName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the lifecycle policy.</p>\"\n                    }\n                },\n                \"status\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#OpenSearchResourceStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>This structure contains information about the status of this OpenSearch Service\\n      resource.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This structure contains information about the OpenSearch Service data lifecycle policy\\n      used for this integration. The lifecycle policy determines the lifespan of the data in the\\n      collection. It was automatically created as part of the integration setup.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/opensearch-service/latest/developerguide/serverless-lifecycle.html\\\">Using data\\n        lifecycle policies with OpenSearch Service Serverless</a> in the OpenSearch Service\\n      Developer Guide.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#OpenSearchNetworkPolicy\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"policyName\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#OpenSearchPolicyName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the network policy.</p>\"\n                    }\n                },\n                \"status\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#OpenSearchResourceStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>This structure contains information about the status of this OpenSearch Service\\n      resource.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This structure contains information about the OpenSearch Service network policy used for\\n      this integration. The network policy assigns network access settings to collections. For more\\n      information, see <a href=\\\"https://docs.aws.amazon.com/opensearch-service/latest/developerguide/serverless-network.html#serverless-network-policies\\\">Network policies</a> in the OpenSearch Service Developer Guide.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#OpenSearchPolicyName\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 256\n                },\n                \"smithy.api#pattern\": \"^[\\\\.\\\\-_/#A-Za-z0-9]+$\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#OpenSearchResourceConfig\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"kmsKeyArn\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Arn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>To have the vended dashboard data encrypted with KMS instead of the CloudWatch Logs default encryption method, specify the ARN of the KMS key that you\\n      want to use.</p>\"\n                    }\n                },\n                \"dataSourceRoleArn\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Arn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify the ARN of an IAM role that CloudWatch Logs will use to create\\n      the integration. This role must have the permissions necessary to access the OpenSearch Service collection to be able to create the dashboards. For more information about the permissions\\n      needed, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/OpenSearch-Dashboards-CreateRole.html\\\">Permissions that\\n        the integration needs</a> in the CloudWatch Logs User Guide.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"dashboardViewerPrincipals\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DashboardViewerPrincipals\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify the ARNs of IAM roles and IAM users who you want to\\n      grant permission to for viewing the dashboards.</p>\\n         <important>\\n            <p>In addition to specifying these users here, you must also grant them the <b>CloudWatchOpenSearchDashboardAccess</b>\\n        IAM policy. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/OpenSearch-Dashboards-UserRoles.html\\\">IAM policies for\\n          users</a>.</p>\\n         </important>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"applicationArn\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Arn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If you want to use an existing OpenSearch Service application for your integration with\\n        OpenSearch Service, specify it here. If you omit this, a new application will be\\n      created.</p>\"\n                    }\n                },\n                \"retentionDays\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#CollectionRetentionDays\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify how many days that you want the data derived by OpenSearch Service to be retained\\n      in the index that the dashboard refers to. This also sets the maximum time period that you can\\n      choose when viewing data in the dashboard. Choosing a longer time frame will incur additional\\n      costs. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This structure contains configuration details about an integration between CloudWatch Logs and OpenSearch Service.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#OpenSearchResourceStatus\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"status\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#OpenSearchResourceStatusType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The current status of this resource.</p>\"\n                    }\n                },\n                \"statusMessage\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#IntegrationStatusMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A message with additional information about the status of this resource.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This structure contains information about the status of an OpenSearch Service\\n      resource.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#OpenSearchResourceStatusType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ACTIVE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ACTIVE\"\n                    }\n                },\n                \"NOT_FOUND\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"NOT_FOUND\"\n                    }\n                },\n                \"ERROR\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ERROR\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#OpenSearchWorkspace\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"workspaceId\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#OpenSearchWorkspaceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of this workspace.</p>\"\n                    }\n                },\n                \"status\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#OpenSearchResourceStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>This structure contains information about the status of an OpenSearch Service\\n      resource.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This structure contains information about the OpenSearch Service workspace used for this\\n      integration. An OpenSearch Service workspace is the collection of dashboards along with other\\n        OpenSearch Service tools. This workspace was created automatically as part of the\\n      integration setup. For more information, see <a href=\\\"https://docs.aws.amazon.com/opensearch-service/latest/developerguide/application.html\\\">Centralized OpenSearch user\\n        interface (Dashboards) with OpenSearch Service</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#OpenSearchWorkspaceId\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 256\n                },\n                \"smithy.api#pattern\": \"^[\\\\.\\\\-_/#A-Za-z0-9]+$\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#OperationAbortedException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Message\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Multiple concurrent requests to update the same resource were in conflict.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#OrderBy\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"LogStreamName\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"LogStreamName\"\n                    }\n                },\n                \"LastEventTime\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"LastEventTime\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#OutputFormat\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"JSON\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"json\"\n                    }\n                },\n                \"PLAIN\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"plain\"\n                    }\n                },\n                \"W3C\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"w3c\"\n                    }\n                },\n                \"RAW\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"raw\"\n                    }\n                },\n                \"PARQUET\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"parquet\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#OutputFormats\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#OutputFormat\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#OutputLogEvent\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"timestamp\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time the event occurred, expressed as the number of milliseconds after <code>Jan 1,\\n        1970 00:00:00 UTC</code>.</p>\"\n                    }\n                },\n                \"message\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#EventMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The data contained in the log event.</p>\"\n                    }\n                },\n                \"ingestionTime\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time the event was ingested, expressed as the number of milliseconds after\\n        <code>Jan 1, 1970 00:00:00 UTC</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents a log event.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#OutputLogEvents\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#OutputLogEvent\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#OverwriteIfExists\": {\n            \"type\": \"boolean\",\n            \"traits\": {\n                \"smithy.api#default\": false\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#ParseCloudfront\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"source\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Source\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Omit this parameter and the whole log message will be processed by this processor. No\\n      other value than <code>@message</code> is allowed for <code>source</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This processor parses CloudFront vended logs, extract fields, and convert them into\\n      JSON format. Encoded field values are decoded. Values that are integers and doubles are\\n      treated as such. For more information about this processor including examples, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CloudWatch-Logs-Transformation.html#CloudWatch-Logs-Transformation-parseCloudfront\\\"> parseCloudfront</a>\\n         </p>\\n         <p>For more information about CloudFront log format, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/AccessLogs.html\\\"> Configure and use standard\\n        logs (access logs)</a>.</p>\\n         <p>If you use this processor, it must be the first processor in your transformer.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#ParseJSON\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"source\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Source\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Path to the field in the log event that will be parsed. Use dot notation to access child\\n      fields. For example, <code>store.book</code>\\n         </p>\"\n                    }\n                },\n                \"destination\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DestinationField\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The location to put the parsed key value pair into. If you omit this parameter, it is\\n      placed under the root node.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This processor parses log events that are in JSON format. It can extract JSON key-value\\n      pairs and place them under a destination that you specify.</p>\\n         <p>Additionally, because you must have at least one parse-type processor in a transformer,\\n      you can use <code>ParseJSON</code> as that processor for JSON-format logs, so that you can\\n      also apply other processors, such as mutate processors, to these logs.</p>\\n         <p>For more information about this processor including examples, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CloudWatch-Logs-Transformation.html#CloudWatch-Logs-Transformation-parseJSON\\\"> parseJSON</a> in the <i>CloudWatch Logs User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#ParseKeyValue\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"source\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Source\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Path to the field in the log event that will be parsed. Use dot notation to access child\\n      fields. For example, <code>store.book</code>\\n         </p>\"\n                    }\n                },\n                \"destination\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DestinationField\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The destination field to put the extracted key-value pairs into</p>\"\n                    }\n                },\n                \"fieldDelimiter\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ParserFieldDelimiter\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The field delimiter string that is used between key-value pairs in the original log\\n      events. If you omit this, the ampersand <code>&</code> character is used.</p>\"\n                    }\n                },\n                \"keyValueDelimiter\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#KeyValueDelimiter\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The delimiter string to use between the key and value in each pair in the transformed log\\n      event.</p>\\n         <p> If you omit this, the equal <code>=</code> character is used.</p>\"\n                    }\n                },\n                \"keyPrefix\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#KeyPrefix\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If you want to add a prefix to all transformed keys, specify it here.</p>\"\n                    }\n                },\n                \"nonMatchValue\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#NonMatchValue\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A value to insert into the value field in the result, when a key-value pair is not\\n      successfully split.</p>\"\n                    }\n                },\n                \"overwriteIfExists\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#OverwriteIfExists\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Specifies whether to overwrite the value if the destination key already exists. If you\\n      omit this, the default is <code>false</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This processor parses a specified field in the original log event into key-value pairs. </p>\\n         <p>For more information about this processor including examples, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CloudWatch-Logs-Transformation.html#CloudWatch-Logs-Transformation-parseKeyValue\\\"> parseKeyValue</a> in the <i>CloudWatch Logs User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#ParsePostgres\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"source\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Source\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Omit this parameter and the whole log message will be processed by this processor. No\\n      other value than <code>@message</code> is allowed for <code>source</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Use this processor to parse RDS for PostgreSQL vended logs, extract fields, and\\n      and convert them into a JSON format. This processor always processes the entire log event\\n      message. For more information about this processor including examples, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CloudWatch-Logs-Transformation.html#CloudWatch-Logs-Transformation-parsePostGres\\\"> parsePostGres</a>.</p>\\n         <p>For more information about RDS for PostgreSQL log format, see <a href=\\\"https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_LogAccess.Concepts.PostgreSQL.html#USER_LogAccess.Concepts.PostgreSQL.Log_Format.log-line-prefix\\\">\\n        RDS for PostgreSQL database log filesTCP flag sequence</a>.</p>\\n         <important>\\n            <p>If you use this processor, it must be the first processor in your transformer.</p>\\n         </important>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#ParseRoute53\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"source\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Source\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Omit this parameter and the whole log message will be processed by this processor. No\\n      other value than <code>@message</code> is allowed for <code>source</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Use this processor to parse Route 53 vended logs, extract fields, and and\\n      convert them into a JSON format. This processor always processes the entire log event message.\\n      For more information about this processor including examples, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CloudWatch-Logs-Transformation.html#CloudWatch-Logs-Transformation-parseRoute53\\\"> parseRoute53</a>.</p>\\n         <important>\\n            <p>If you use this processor, it must be the first processor in your transformer.</p>\\n         </important>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#ParseToOCSF\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"source\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Source\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The path to the field in the log event that you want to parse. If you omit this value, the\\n      whole log message is parsed.</p>\"\n                    }\n                },\n                \"eventSource\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#EventSource\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify the service or process that produces the log events that will be converted with\\n      this processor.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ocsfVersion\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#OCSFVersion\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify which version of the OCSF schema to use for the transformed log events.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This processor converts logs into <a href=\\\"https://ocsf.io\\\">Open Cybersecurity Schema\\n        Framework (OCSF)</a> events.</p>\\n         <p>For more information about this processor including examples, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CloudWatch-Logs-Transformation.html#CloudWatch-Logs-Transformation-parseToOCSF\\\"> parseToOSCF</a> in the <i>CloudWatch Logs User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#ParseVPC\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"source\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Source\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Omit this parameter and the whole log message will be processed by this processor. No\\n      other value than <code>@message</code> is allowed for <code>source</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Use this processor to parse Amazon VPC vended logs, extract fields, and and\\n      convert them into a JSON format. This processor always processes the entire log event\\n      message.</p>\\n         <p>This processor doesn't support custom log formats, such as NAT gateway logs. For more\\n      information about custom log formats in Amazon VPC, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/userguide/flow-logs-records-examples.html#flow-log-example-tcp-flag\\\">\\n        parseVPC</a> For more information about this processor including examples, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CloudWatch-Logs-Transformation.html#CloudWatch-Logs-Transformation-parseVPC\\\"> parseVPC</a>.</p>\\n         <important>\\n            <p>If you use this processor, it must be the first processor in your transformer.</p>\\n         </important>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#ParseWAF\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"source\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Source\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Omit this parameter and the whole log message will be processed by this processor. No\\n      other value than <code>@message</code> is allowed for <code>source</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Use this processor to parse WAF vended logs, extract fields, and and\\n      convert them into a JSON format. This processor always processes the entire log event message.\\n      For more information about this processor including examples, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CloudWatch-Logs-Transformation.html#CloudWatch-Logs-Transformation-parsePostGres\\\"> parseWAF</a>.</p>\\n         <p>For more information about WAF log format, see <a href=\\\"https://docs.aws.amazon.com/waf/latest/developerguide/logging-examples.html\\\"> Log examples for web ACL\\n        traffic</a>.</p>\\n         <important>\\n            <p>If you use this processor, it must be the first processor in your transformer.</p>\\n         </important>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#ParserFieldDelimiter\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 128\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#PatternId\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 32,\n                    \"max\": 32\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#PatternRegex\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#PatternString\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#PatternToken\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"dynamicTokenPosition\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DynamicTokenPosition\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>For a dynamic token, this indicates where in the pattern that this token appears, related\\n      to other dynamic tokens. The dynamic token that appears first has a value of <code>1</code>,\\n      the one that appears second is <code>2</code>, and so on.</p>\"\n                    }\n                },\n                \"isDynamic\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies whether this is a dynamic token.</p>\"\n                    }\n                },\n                \"tokenString\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#TokenString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The string represented by this token. If this is a dynamic token, the value will be\\n        <code><*></code>\\n         </p>\"\n                    }\n                },\n                \"enumerations\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Enumerations\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Contains the values found for a dynamic token, and the number of times each value was\\n      found.</p>\"\n                    }\n                },\n                \"inferredTokenName\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InferredTokenName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A name that CloudWatch Logs assigned to this dynamic token to make the pattern more\\n      readable. The string part of the <code>inferredTokenName</code> gives you a clearer idea of\\n      the content of this token. The number part of the <code>inferredTokenName</code> shows where\\n      in the pattern this token appears, compared to other dynamic tokens. CloudWatch Logs\\n      assigns the string part of the name based on analyzing the content of the log events that\\n      contain it.</p>\\n         <p>For example, an inferred token name of <code>IPAddress-3</code> means that the token\\n      represents an IP address, and this token is the third dynamic token in the pattern.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A structure that contains information about one pattern token related to an\\n      anomaly.</p>\\n         <p>For more information about patterns and tokens, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_CreateLogAnomalyDetector.html\\\">CreateLogAnomalyDetector</a>. </p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#PatternTokens\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#PatternToken\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#Percentage\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#default\": 0,\n                \"smithy.api#range\": {\n                    \"min\": 0,\n                    \"max\": 100\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#Policy\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"deliveryDestinationPolicy\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DeliveryDestinationPolicy\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The contents of the delivery destination policy.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A structure that contains information about one delivery destination policy.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#PolicyDocument\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 5120\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#PolicyName\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.cloudwatchlogs#PolicyScope\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ACCOUNT\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ACCOUNT\"\n                    }\n                },\n                \"RESOURCE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"RESOURCE\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#PolicyType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"DATA_PROTECTION_POLICY\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DATA_PROTECTION_POLICY\"\n                    }\n                },\n                \"SUBSCRIPTION_FILTER_POLICY\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"SUBSCRIPTION_FILTER_POLICY\"\n                    }\n                },\n                \"FIELD_INDEX_POLICY\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"FIELD_INDEX_POLICY\"\n                    }\n                },\n                \"TRANSFORMER_POLICY\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"TRANSFORMER_POLICY\"\n                    }\n                },\n                \"METRIC_EXTRACTION_POLICY\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"METRIC_EXTRACTION_POLICY\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#Priority\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#Processor\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"addKeys\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#AddKeys\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter to include the <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CloudWatch-Logs-Transformation.html#CloudWatch-Logs-Transformation-addKeys\\\"> addKeys</a> processor in your transformer.</p>\"\n                    }\n                },\n                \"copyValue\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#CopyValue\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter to include the <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CloudWatch-Logs-Transformation.html#CloudWatch-Logs-Transformation-copyValue\\\"> copyValue</a> processor in your transformer.</p>\"\n                    }\n                },\n                \"csv\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#CSV\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter to include the <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CloudWatch-Logs-Transformation.html#CloudWatch-Logs-Transformation-CSV\\\"> CSV</a> processor in your transformer.</p>\"\n                    }\n                },\n                \"dateTimeConverter\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DateTimeConverter\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter to include the <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CloudWatch-Logs-Transformation.html#CloudWatch-Logs-Transformation-datetimeConverter\\\"> datetimeConverter</a> processor in your transformer.</p>\"\n                    }\n                },\n                \"deleteKeys\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DeleteKeys\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter to include the <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CloudWatch-Logs-Transformation.html#CloudWatch-Logs-Transformation-deleteKeys\\\"> deleteKeys</a> processor in your transformer.</p>\"\n                    }\n                },\n                \"grok\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Grok\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter to include the <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CloudWatch-Logs-Transformation.html#CloudWatch-Logs-Transformation-grok\\\"> grok</a> processor in your transformer.</p>\"\n                    }\n                },\n                \"listToMap\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ListToMap\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter to include the <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CloudWatch-Logs-Transformation.html#CloudWatch-Logs-Transformation-listToMap\\\"> listToMap</a> processor in your transformer.</p>\"\n                    }\n                },\n                \"lowerCaseString\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LowerCaseString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter to include the <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CloudWatch-Logs-Transformation.html#CloudWatch-Logs-Transformation-lowerCaseString\\\"> lowerCaseString</a> processor in your transformer.</p>\"\n                    }\n                },\n                \"moveKeys\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#MoveKeys\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter to include the <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CloudWatch-Logs-Transformation.html#CloudWatch-Logs-Transformation-moveKeys\\\"> moveKeys</a> processor in your transformer.</p>\"\n                    }\n                },\n                \"parseCloudfront\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ParseCloudfront\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter to include the <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CloudWatch-Logs-Transformation.html#CloudWatch-Logs-Transformation-parseCloudfront\\\"> parseCloudfront</a> processor in your transformer.</p>\\n         <p>If you use this processor, it must be the first processor in your transformer.</p>\"\n                    }\n                },\n                \"parseJSON\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ParseJSON\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter to include the <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CloudWatch-Logs-Transformation.html#CloudWatch-Logs-Transformation-parseJSON\\\"> parseJSON</a> processor in your transformer.</p>\"\n                    }\n                },\n                \"parseKeyValue\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ParseKeyValue\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter to include the <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CloudWatch-Logs-Transformation.html#CloudWatch-Logs-Transformation-parseKeyValue\\\"> parseKeyValue</a> processor in your transformer.</p>\"\n                    }\n                },\n                \"parseRoute53\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ParseRoute53\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter to include the <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CloudWatch-Logs-Transformation.html#CloudWatch-Logs-Transformation-parseRoute53\\\"> parseRoute53</a> processor in your transformer.</p>\\n         <p>If you use this processor, it must be the first processor in your transformer.</p>\"\n                    }\n                },\n                \"parseToOCSF\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ParseToOCSF\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter to convert logs into Open Cybersecurity Schema (OCSF) format.</p>\"\n                    }\n                },\n                \"parsePostgres\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ParsePostgres\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter to include the <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CloudWatch-Logs-Transformation.html#CloudWatch-Logs-Transformation-parsePostGres\\\"> parsePostGres</a> processor in your transformer.</p>\\n         <p>If you use this processor, it must be the first processor in your transformer.</p>\"\n                    }\n                },\n                \"parseVPC\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ParseVPC\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter to include the <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CloudWatch-Logs-Transformation.html#CloudWatch-Logs-Transformation-parseVPC\\\"> parseVPC</a> processor in your transformer.</p>\\n         <p>If you use this processor, it must be the first processor in your transformer.</p>\"\n                    }\n                },\n                \"parseWAF\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ParseWAF\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter to include the <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CloudWatch-Logs-Transformation.html#CloudWatch-Logs-Transformation-parseWAF\\\"> parseWAF</a> processor in your transformer.</p>\\n         <p>If you use this processor, it must be the first processor in your transformer.</p>\"\n                    }\n                },\n                \"renameKeys\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#RenameKeys\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter to include the <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CloudWatch-Logs-Transformation.html#CloudWatch-Logs-Transformation-renameKeys\\\"> renameKeys</a> processor in your transformer.</p>\"\n                    }\n                },\n                \"splitString\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#SplitString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter to include the <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CloudWatch-Logs-Transformation.html#CloudWatch-Logs-Transformation-splitString\\\"> splitString</a> processor in your transformer.</p>\"\n                    }\n                },\n                \"substituteString\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#SubstituteString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter to include the <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CloudWatch-Logs-Transformation.html#CloudWatch-Logs-Transformation-substituteString\\\"> substituteString</a> processor in your transformer.</p>\"\n                    }\n                },\n                \"trimString\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#TrimString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter to include the <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CloudWatch-Logs-Transformation.html#CloudWatch-Logs-Transformation-trimString\\\"> trimString</a> processor in your transformer.</p>\"\n                    }\n                },\n                \"typeConverter\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#TypeConverter\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter to include the <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CloudWatch-Logs-Transformation.html#CloudWatch-Logs-Transformation-typeConverter\\\"> typeConverter</a> processor in your transformer.</p>\"\n                    }\n                },\n                \"upperCaseString\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#UpperCaseString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter to include the <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CloudWatch-Logs-Transformation.html#CloudWatch-Logs-Transformation-upperCaseString\\\"> upperCaseString</a> processor in your transformer.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This structure contains the information about one processor in a log transformer.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#Processors\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#Processor\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 20\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#PutAccountPolicy\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#PutAccountPolicyRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#PutAccountPolicyResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#OperationAbortedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates an account-level data protection policy, subscription filter policy, field index\\n      policy, transformer policy, or metric extraction policy that applies to all log groups or a\\n      subset of log groups in the account.</p>\\n         <p>To use this operation, you must be signed on with the correct permissions depending on the\\n      type of policy that you are creating.</p>\\n         <ul>\\n            <li>\\n               <p>To create a data protection policy, you must have the\\n            <code>logs:PutDataProtectionPolicy</code> and <code>logs:PutAccountPolicy</code>\\n          permissions.</p>\\n            </li>\\n            <li>\\n               <p>To create a subscription filter policy, you must have the\\n            <code>logs:PutSubscriptionFilter</code> and <code>logs:PutAccountPolicy</code>\\n          permissions.</p>\\n            </li>\\n            <li>\\n               <p>To create a transformer policy, you must have the <code>logs:PutTransformer</code> and\\n            <code>logs:PutAccountPolicy</code> permissions.</p>\\n            </li>\\n            <li>\\n               <p>To create a field index policy, you must have the <code>logs:PutIndexPolicy</code> and\\n            <code>logs:PutAccountPolicy</code> permissions.</p>\\n            </li>\\n            <li>\\n               <p>To create a metric extraction policy, you must have the\\n            <code>logs:PutMetricExtractionPolicy</code> and <code>logs:PutAccountPolicy</code>\\n          permissions.</p>\\n            </li>\\n         </ul>\\n         <p>\\n            <b>Data protection policy</b>\\n         </p>\\n         <p>A data protection policy can help safeguard sensitive data that's ingested by your log\\n      groups by auditing and masking the sensitive log data. Each account can have only one\\n      account-level data protection policy.</p>\\n         <important>\\n            <p>Sensitive data is detected and masked when it is ingested into a log group. When you set\\n        a data protection policy, log events ingested into the log groups before that time are not\\n        masked.</p>\\n         </important>\\n         <p>If you use <code>PutAccountPolicy</code> to create a data protection policy for your whole\\n      account, it applies to both existing log groups and all log groups that are created later in\\n      this account. The account-level policy is applied to existing log groups with eventual\\n      consistency. It might take up to 5 minutes before sensitive data in existing log groups begins\\n      to be masked.</p>\\n         <p>By default, when a user views a log event that includes masked data, the sensitive data is\\n      replaced by asterisks. A user who has the <code>logs:Unmask</code> permission can use a <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_GetLogEvents.html\\\">GetLogEvents</a> or <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_FilterLogEvents.html\\\">FilterLogEvents</a> operation with the <code>unmask</code> parameter set to\\n        <code>true</code> to view the unmasked log events. Users with the <code>logs:Unmask</code>\\n      can also view unmasked data in the CloudWatch Logs console by running a CloudWatch Logs\\n      Insights query with the <code>unmask</code> query command.</p>\\n         <p>For more information, including a list of types of data that can be audited and masked,\\n      see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/mask-sensitive-log-data.html\\\">Protect sensitive log data\\n        with masking</a>.</p>\\n         <p>To use the <code>PutAccountPolicy</code> operation for a data protection policy, you must\\n      be signed on with the <code>logs:PutDataProtectionPolicy</code> and\\n        <code>logs:PutAccountPolicy</code> permissions.</p>\\n         <p>The <code>PutAccountPolicy</code> operation applies to all log groups in the account. You\\n      can use <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutDataProtectionPolicy.html\\\">PutDataProtectionPolicy</a> to create a data protection policy that applies to just one\\n      log group. If a log group has its own data protection policy and the account also has an\\n      account-level data protection policy, then the two policies are cumulative. Any sensitive term\\n      specified in either policy is masked.</p>\\n         <p>\\n            <b>Subscription filter policy</b>\\n         </p>\\n         <p>A subscription filter policy sets up a real-time feed of log events from CloudWatch Logs to other Amazon Web Services services. Account-level subscription filter policies apply to\\n      both existing log groups and log groups that are created later in this account. Supported\\n      destinations are Kinesis Data Streams, Firehose, and Lambda. When log\\n      events are sent to the receiving service, they are Base64 encoded and compressed with the GZIP\\n      format.</p>\\n         <p>The following destinations are supported for subscription filters:</p>\\n         <ul>\\n            <li>\\n               <p>An Kinesis Data Streams data stream in the same account as the subscription policy, for\\n          same-account delivery.</p>\\n            </li>\\n            <li>\\n               <p>An Firehose data stream in the same account as the subscription policy, for\\n          same-account delivery.</p>\\n            </li>\\n            <li>\\n               <p>A Lambda function in the same account as the subscription policy, for\\n          same-account delivery.</p>\\n            </li>\\n            <li>\\n               <p>A logical destination in a different account created with <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutDestination.html\\\">PutDestination</a>, for cross-account delivery. Kinesis Data Streams and Firehose are supported as logical destinations.</p>\\n            </li>\\n         </ul>\\n         <p>Each account can have one account-level subscription filter policy per Region. If you are\\n      updating an existing filter, you must specify the correct name in <code>PolicyName</code>. To\\n      perform a <code>PutAccountPolicy</code> subscription filter operation for any destination\\n      except a Lambda function, you must also have the <code>iam:PassRole</code>\\n      permission.</p>\\n         <p>\\n            <b>Transformer policy</b>\\n         </p>\\n         <p>Creates or updates a <i>log transformer policy</i> for your account. You use\\n      log transformers to transform log events into a different format, making them easier for you\\n      to process and analyze. You can also transform logs from different sources into standardized\\n      formats that contain relevant, source-specific information. After you have created a\\n      transformer, CloudWatch Logs performs this transformation at the time of log ingestion. You\\n      can then refer to the transformed versions of the logs during operations such as querying with\\n        CloudWatch Logs Insights or creating metric filters or subscription filters.</p>\\n         <p>You can also use a transformer to copy metadata from metadata keys into the log events\\n      themselves. This metadata can include log group name, log stream name, account ID and\\n      Region.</p>\\n         <p>A transformer for a log group is a series of processors, where each processor applies one\\n      type of transformation to the log events ingested into this log group. For more information\\n      about the available processors to use in a transformer, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CloudWatch-Logs-Transformation.html#CloudWatch-Logs-Transformation-Processors\\\"> Processors that you can use</a>.</p>\\n         <p>Having log events in standardized format enables visibility across your applications for\\n      your log analysis, reporting, and alarming needs. CloudWatch Logs provides transformation\\n      for common log types with out-of-the-box transformation templates for major Amazon Web Services\\n      log sources such as VPC flow logs, Lambda, and Amazon RDS. You can use\\n      pre-built transformation templates or create custom transformation policies.</p>\\n         <p>You can create transformers only for the log groups in the Standard log class.</p>\\n         <p>You can have one account-level transformer policy that applies to all log groups in the\\n      account. Or you can create as many as 20 account-level transformer policies that are each\\n      scoped to a subset of log groups with the <code>selectionCriteria</code> parameter. If you\\n      have multiple account-level transformer policies with selection criteria, no two of them can\\n      use the same or overlapping log group name prefixes. For example, if you have one policy\\n      filtered to log groups that start with <code>my-log</code>, you can't have another field index\\n      policy filtered to <code>my-logpprod</code> or <code>my-logging</code>.</p>\\n         <p>CloudWatch Logs provides default field indexes for all log groups in the Standard log\\n      class. Default field indexes are automatically available for the following fields: </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>@aws.region</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>@aws.account</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>@source.log</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>traceId</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>Default field indexes are in addition to any custom field indexes you define within your\\n      policy. Default field indexes are not counted towards your field index quota. </p>\\n         <p>You can also set up a transformer at the log-group level. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutTransformer.html\\\">PutTransformer</a>. If there is both a log-group level transformer created with\\n        <code>PutTransformer</code> and an account-level transformer that could apply to the same\\n      log group, the log group uses only the log-group level transformer. It ignores the\\n      account-level transformer.</p>\\n         <p>\\n            <b>Field index policy</b>\\n         </p>\\n         <p>You can use field index policies to create indexes on fields found in log events in the\\n      log group. Creating field indexes can help lower the scan volume for CloudWatch Logs\\n      Insights queries that reference those fields, because these queries attempt to skip the\\n      processing of log events that are known to not match the indexed field. Good fields to index\\n      are fields that you often need to query for and fields or values that match only a small\\n      fraction of the total log events. Common examples of indexes include request ID, session ID,\\n      user IDs, or instance IDs. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CloudWatchLogs-Field-Indexing.html\\\">Create field indexes\\n        to improve query performance and reduce costs</a>\\n         </p>\\n         <p>To find the fields that are in your log group events, use the <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_GetLogGroupFields.html\\\">GetLogGroupFields</a> operation.</p>\\n         <p>For example, suppose you have created a field index for <code>requestId</code>. Then, any\\n        CloudWatch Logs Insights query on that log group that includes <code>requestId =\\n          <i>value</i>\\n            </code> or <code>requestId in [<i>value</i>,\\n          <i>value</i>, ...]</code> will attempt to process only the log events where\\n      the indexed field matches the specified value.</p>\\n         <p>Matches of log events to the names of indexed fields are case-sensitive. For example, an\\n      indexed field of <code>RequestId</code> won't match a log event containing\\n        <code>requestId</code>.</p>\\n         <p>You can have one account-level field index policy that applies to all log groups in the\\n      account. Or you can create as many as 20 account-level field index policies that are each\\n      scoped to a subset of log groups with the <code>selectionCriteria</code> parameter. If you\\n      have multiple account-level index policies with selection criteria, no two of them can use the\\n      same or overlapping log group name prefixes. For example, if you have one policy filtered to\\n      log groups that start with <code>my-log</code>, you can't have another field index policy\\n      filtered to <code>my-logpprod</code> or <code>my-logging</code>.</p>\\n         <p>If you create an account-level field index policy in a monitoring account in cross-account\\n      observability, the policy is applied only to the monitoring account and not to any source\\n      accounts.</p>\\n         <p>If you want to create a field index policy for a single log group, you can use <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutIndexPolicy.html\\\">PutIndexPolicy</a> instead of <code>PutAccountPolicy</code>. If you do so, that log\\n      group will use only that log-group level policy, and will ignore the account-level policy that\\n      you create with <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutAccountPolicy.html\\\">PutAccountPolicy</a>.</p>\\n         <p>\\n            <b>Metric extraction policy</b>\\n         </p>\\n         <p>A metric extraction policy controls whether CloudWatch Metrics can be created through the\\n      Embedded Metrics Format (EMF) for log groups in your account. By default, EMF metric creation\\n      is enabled for all log groups. You can use metric extraction policies to disable EMF metric\\n      creation for your entire account or specific log groups.</p>\\n         <p>When a policy disables EMF metric creation for a log group, log events in the EMF format\\n      are still ingested, but no CloudWatch Metrics are created from them.</p>\\n         <important>\\n            <p>Creating a policy disables metrics for AWS features that use EMF to create metrics, such\\n        as CloudWatch Container Insights and CloudWatch Application Signals. To prevent turning off\\n        those features by accident, we recommend that you exclude the underlying log-groups through\\n        a selection-criteria such as <code>LogGroupNamePrefix NOT IN [\\\"/aws/containerinsights\\\",\\n          \\\"/aws/ecs/containerinsights\\\", \\\"/aws/application-signals/data\\\"]</code>.</p>\\n         </important>\\n         <p>Each account can have either one account-level metric extraction policy that applies to\\n      all log groups, or up to 5 policies that are each scoped to a subset of log groups with the\\n        <code>selectionCriteria</code> parameter. The selection criteria supports filtering by\\n        <code>LogGroupName</code> and <code>LogGroupNamePrefix</code> using the operators\\n        <code>IN</code> and <code>NOT IN</code>. You can specify up to 50 values in each\\n        <code>IN</code> or <code>NOT IN</code> list.</p>\\n         <p>The selection criteria can be specified in these formats:</p>\\n         <p>\\n            <code>LogGroupName IN [\\\"log-group-1\\\", \\\"log-group-2\\\"]</code>\\n         </p>\\n         <p>\\n            <code>LogGroupNamePrefix NOT IN [\\\"/aws/prefix1\\\", \\\"/aws/prefix2\\\"]</code>\\n         </p>\\n         <p>If you have multiple account-level metric extraction policies with selection criteria, no\\n      two of them can have overlapping criteria. For example, if you have one policy with selection\\n      criteria <code>LogGroupNamePrefix IN [\\\"my-log\\\"]</code>, you can't have another metric\\n      extraction policy with selection criteria <code>LogGroupNamePrefix IN [\\\"/my-log-prod\\\"]</code>\\n      or <code>LogGroupNamePrefix IN [\\\"/my-logging\\\"]</code>, as the set of log groups matching these\\n      prefixes would be a subset of the log groups matching the first policy's prefix, creating an\\n      overlap.</p>\\n         <p>When using <code>NOT IN</code>, only one policy with this operator is allowed per\\n      account.</p>\\n         <p>When combining policies with <code>IN</code> and <code>NOT IN</code> operators, the\\n      overlap check ensures that policies don't have conflicting effects. Two policies with\\n        <code>IN</code> and <code>NOT IN</code> operators do not overlap if and only if every value\\n      in the <code>IN </code>policy is completely contained within some value in the <code>NOT\\n        IN</code> policy. For example:</p>\\n         <ul>\\n            <li>\\n               <p>If you have a <code>NOT IN</code> policy for prefix <code>\\\"/aws/lambda\\\"</code>, you\\n          can create an <code>IN</code> policy for the exact log group name\\n            <code>\\\"/aws/lambda/function1\\\"</code> because the set of log groups matching\\n            <code>\\\"/aws/lambda/function1\\\"</code> is a subset of the log groups matching\\n            <code>\\\"/aws/lambda\\\"</code>.</p>\\n            </li>\\n            <li>\\n               <p>If you have a <code>NOT IN</code> policy for prefix <code>\\\"/aws/lambda\\\"</code>, you\\n          cannot create an <code>IN</code> policy for prefix <code>\\\"/aws\\\"</code> because the set of\\n          log groups matching <code>\\\"/aws\\\"</code> is not a subset of the log groups matching\\n            <code>\\\"/aws/lambda\\\"</code>.</p>\\n            </li>\\n         </ul>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#PutAccountPolicyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"policyName\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#PolicyName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A name for the policy. This must be unique within the account.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"policyDocument\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#AccountPolicyDocument\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify the policy, in JSON.</p>\\n         <p>\\n            <b>Data protection policy</b>\\n         </p>\\n         <p>A data protection policy must include two JSON blocks:</p>\\n         <ul>\\n            <li>\\n               <p>The first block must include both a <code>DataIdentifer</code> array and an\\n            <code>Operation</code> property with an <code>Audit</code> action. The\\n            <code>DataIdentifer</code> array lists the types of sensitive data that you want to\\n          mask. For more information about the available options, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/mask-sensitive-log-data-types.html\\\">Types of data that\\n            you can mask</a>.</p>\\n               <p>The <code>Operation</code> property with an <code>Audit</code> action is required to\\n          find the sensitive data terms. This <code>Audit</code> action must contain a\\n            <code>FindingsDestination</code> object. You can optionally use that\\n            <code>FindingsDestination</code> object to list one or more destinations to send audit\\n          findings to. If you specify destinations such as log groups, Firehose streams,\\n          and S3 buckets, they must already exist.</p>\\n            </li>\\n            <li>\\n               <p>The second block must include both a <code>DataIdentifer</code> array and an\\n            <code>Operation</code> property with an <code>Deidentify</code> action. The\\n            <code>DataIdentifer</code> array must exactly match the <code>DataIdentifer</code> array\\n          in the first block of the policy.</p>\\n               <p>The <code>Operation</code> property with the <code>Deidentify</code> action is what\\n          actually masks the data, and it must contain the <code> \\\"MaskConfig\\\": {}</code> object.\\n          The <code> \\\"MaskConfig\\\": {}</code> object must be empty.</p>\\n            </li>\\n         </ul>\\n         <p>For an example data protection policy, see the <b>Examples</b>\\n      section on this page.</p>\\n         <important>\\n            <p>The contents of the two <code>DataIdentifer</code> arrays must match exactly.</p>\\n         </important>\\n         <p>In addition to the two JSON blocks, the <code>policyDocument</code> can also include\\n        <code>Name</code>, <code>Description</code>, and <code>Version</code> fields. The\\n        <code>Name</code> is different than the operation's <code>policyName</code> parameter, and\\n      is used as a dimension when CloudWatch Logs reports audit findings metrics to CloudWatch.</p>\\n         <p>The JSON specified in <code>policyDocument</code> can be up to 30,720 characters\\n      long.</p>\\n         <p>\\n            <b>Subscription filter policy</b>\\n         </p>\\n         <p>A subscription filter policy can include the following attributes in a JSON block:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <b>DestinationArn</b> The ARN of the destination to deliver\\n          log events to. Supported destinations are:</p>\\n               <ul>\\n                  <li>\\n                     <p>An Kinesis Data Streams data stream in the same account as the subscription policy,\\n              for same-account delivery.</p>\\n                  </li>\\n                  <li>\\n                     <p>An Firehose data stream in the same account as the subscription policy,\\n              for same-account delivery.</p>\\n                  </li>\\n                  <li>\\n                     <p>A Lambda function in the same account as the subscription policy, for\\n              same-account delivery.</p>\\n                  </li>\\n                  <li>\\n                     <p>A logical destination in a different account created with <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutDestination.html\\\">PutDestination</a>, for cross-account delivery. Kinesis Data Streams and Firehose are supported as logical destinations.</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>RoleArn</b> The ARN of an IAM role that grants CloudWatch\\n          Logs permissions to deliver ingested log events to the destination stream. You don't need\\n          to provide the ARN when you are working with a logical destination for cross-account\\n          delivery.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>FilterPattern</b> A filter pattern for subscribing to\\n          a filtered stream of log events.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>Distribution</b> The method used to distribute log data\\n          to the destination. By default, log data is grouped by log stream, but the grouping can be\\n          set to <code>Random</code> for a more even distribution. This property is only applicable\\n          when the destination is an Kinesis Data Streams data stream.</p>\\n            </li>\\n         </ul>\\n         <p>\\n            <b>Transformer policy</b>\\n         </p>\\n         <p>A transformer policy must include one JSON block with the array of processors and their\\n      configurations. For more information about available processors, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CloudWatch-Logs-Transformation.html#CloudWatch-Logs-Transformation-Processors\\\"> Processors that you can use</a>. </p>\\n         <p>\\n            <b>Field index policy</b>\\n         </p>\\n         <p>A field index filter policy can include the following attribute in a JSON block:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <b>Fields</b> The array of field indexes to create.</p>\\n            </li>\\n         </ul>\\n         <p>It must contain at least one field index.</p>\\n         <p>The following is an example of an index policy document that creates two indexes,\\n        <code>RequestId</code> and <code>TransactionId</code>.</p>\\n         <p>\\n            <code>\\\"policyDocument\\\": \\\"{ \\\\\\\"Fields\\\\\\\": [ \\\\\\\"RequestId\\\\\\\", \\\\\\\"TransactionId\\\\\\\" ]\\n      }\\\"</code>\\n         </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"policyType\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#PolicyType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of policy that you're creating or updating.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"scope\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Scope\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Currently the only valid value for this parameter is <code>ALL</code>, which specifies\\n      that the data protection policy applies to all log groups in the account. If you omit this\\n      parameter, the default of <code>ALL</code> is used.</p>\"\n                    }\n                },\n                \"selectionCriteria\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#SelectionCriteria\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter to apply the new policy to a subset of log groups in the\\n      account.</p>\\n         <p>Specifying <code>selectionCriteria</code> is valid only when you specify\\n        <code>SUBSCRIPTION_FILTER_POLICY</code>, <code>FIELD_INDEX_POLICY</code> or\\n        <code>TRANSFORMER_POLICY</code>for <code>policyType</code>.</p>\\n         <p>If <code>policyType</code> is <code>SUBSCRIPTION_FILTER_POLICY</code>, the only supported\\n        <code>selectionCriteria</code> filter is <code>LogGroupName NOT IN []</code>\\n         </p>\\n         <p>If <code>policyType</code> is <code>FIELD_INDEX_POLICY</code> or\\n        <code>TRANSFORMER_POLICY</code>, the only supported <code>selectionCriteria</code> filter is\\n        <code>LogGroupNamePrefix</code>\\n         </p>\\n         <p>The <code>selectionCriteria</code> string can be up to 25KB in length. The length is\\n      determined by using its UTF-8 bytes.</p>\\n         <p>Using the <code>selectionCriteria</code> parameter with\\n        <code>SUBSCRIPTION_FILTER_POLICY</code> is useful to help prevent infinite loops. For more\\n      information, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/Subscriptions-recursion-prevention.html\\\">Log recursion\\n        prevention</a>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#PutAccountPolicyResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"accountPolicy\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#AccountPolicy\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The account policy that you created.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#PutDataProtectionPolicy\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#PutDataProtectionPolicyRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#PutDataProtectionPolicyResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#OperationAbortedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates a data protection policy for the specified log group. A data protection policy can\\n      help safeguard sensitive data that's ingested by the log group by auditing and masking the\\n      sensitive log data.</p>\\n         <important>\\n            <p>Sensitive data is detected and masked when it is ingested into the log group. When you\\n        set a data protection policy, log events ingested into the log group before that time are\\n        not masked.</p>\\n         </important>\\n         <p>By default, when a user views a log event that includes masked data, the sensitive data is\\n      replaced by asterisks. A user who has the <code>logs:Unmask</code> permission can use a <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_GetLogEvents.html\\\">GetLogEvents</a> or <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_FilterLogEvents.html\\\">FilterLogEvents</a> operation with the <code>unmask</code> parameter set to\\n        <code>true</code> to view the unmasked log events. Users with the <code>logs:Unmask</code>\\n      can also view unmasked data in the CloudWatch Logs console by running a CloudWatch Logs\\n      Insights query with the <code>unmask</code> query command.</p>\\n         <p>For more information, including a list of types of data that can be audited and masked,\\n      see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/mask-sensitive-log-data.html\\\">Protect sensitive log data\\n        with masking</a>.</p>\\n         <p>The <code>PutDataProtectionPolicy</code> operation applies to only the specified log\\n      group. You can also use <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutAccountPolicy.html\\\">PutAccountPolicy</a> to create an account-level data protection policy that applies to\\n      all log groups in the account, including both existing log groups and log groups that are\\n      created level. If a log group has its own data protection policy and the account also has an\\n      account-level data protection policy, then the two policies are cumulative. Any sensitive term\\n      specified in either policy is masked.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#PutDataProtectionPolicyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"logGroupIdentifier\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogGroupIdentifier\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify either the log group name or log group ARN.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"policyDocument\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DataProtectionPolicyDocument\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify the data protection policy, in JSON.</p>\\n         <p>This policy must include two JSON blocks:</p>\\n         <ul>\\n            <li>\\n               <p>The first block must include both a <code>DataIdentifer</code> array and an\\n            <code>Operation</code> property with an <code>Audit</code> action. The\\n            <code>DataIdentifer</code> array lists the types of sensitive data that you want to\\n          mask. For more information about the available options, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/mask-sensitive-log-data-types.html\\\">Types of data that\\n            you can mask</a>.</p>\\n               <p>The <code>Operation</code> property with an <code>Audit</code> action is required to\\n          find the sensitive data terms. This <code>Audit</code> action must contain a\\n            <code>FindingsDestination</code> object. You can optionally use that\\n            <code>FindingsDestination</code> object to list one or more destinations to send audit\\n          findings to. If you specify destinations such as log groups, Firehose streams,\\n          and S3 buckets, they must already exist.</p>\\n            </li>\\n            <li>\\n               <p>The second block must include both a <code>DataIdentifer</code> array and an\\n            <code>Operation</code> property with an <code>Deidentify</code> action. The\\n            <code>DataIdentifer</code> array must exactly match the <code>DataIdentifer</code> array\\n          in the first block of the policy.</p>\\n               <p>The <code>Operation</code> property with the <code>Deidentify</code> action is what\\n          actually masks the data, and it must contain the <code> \\\"MaskConfig\\\": {}</code> object.\\n          The <code> \\\"MaskConfig\\\": {}</code> object must be empty.</p>\\n            </li>\\n         </ul>\\n         <p>For an example data protection policy, see the <b>Examples</b>\\n      section on this page.</p>\\n         <important>\\n            <p>The contents of the two <code>DataIdentifer</code> arrays must match exactly.</p>\\n         </important>\\n         <p>In addition to the two JSON blocks, the <code>policyDocument</code> can also include\\n        <code>Name</code>, <code>Description</code>, and <code>Version</code> fields. The\\n        <code>Name</code> is used as a dimension when CloudWatch Logs reports audit findings\\n      metrics to CloudWatch.</p>\\n         <p>The JSON specified in <code>policyDocument</code> can be up to 30,720 characters.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#PutDataProtectionPolicyResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"logGroupIdentifier\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogGroupIdentifier\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The log group name or ARN that you specified in your request.</p>\"\n                    }\n                },\n                \"policyDocument\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DataProtectionPolicyDocument\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The data protection policy used for this log group.</p>\"\n                    }\n                },\n                \"lastUpdatedTime\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time that this policy was most recently updated.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#PutDeliveryDestination\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#PutDeliveryDestinationRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#PutDeliveryDestinationResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ConflictException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceQuotaExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ThrottlingException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates or updates a logical <i>delivery destination</i>. A delivery\\n      destination is an Amazon Web Services resource that represents an Amazon Web Services service\\n      that logs can be sent to. CloudWatch Logs, Amazon S3, and Firehose are\\n      supported as logs delivery destinations and X-Ray as the trace delivery\\n      destination.</p>\\n         <p>To configure logs delivery between a supported Amazon Web Services service and a\\n      destination, you must do the following:</p>\\n         <ul>\\n            <li>\\n               <p>Create a delivery source, which is a logical object that represents the resource that\\n          is actually sending the logs. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutDeliverySource.html\\\">PutDeliverySource</a>.</p>\\n            </li>\\n            <li>\\n               <p>Use <code>PutDeliveryDestination</code> to create a <i>delivery\\n            destination</i> in the same account of the actual delivery destination. The\\n          delivery destination that you create is a logical object that represents the actual\\n          delivery destination. </p>\\n            </li>\\n            <li>\\n               <p>If you are delivering logs cross-account, you must use <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutDeliveryDestinationPolicy.html\\\">PutDeliveryDestinationPolicy</a> in the destination account to assign an IAM policy to the destination. This policy allows delivery to that destination.\\n        </p>\\n            </li>\\n            <li>\\n               <p>Use <code>CreateDelivery</code> to create a <i>delivery</i> by pairing\\n          exactly one delivery source and one delivery destination. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_CreateDelivery.html\\\">CreateDelivery</a>. </p>\\n            </li>\\n         </ul>\\n         <p>You can configure a single delivery source to send logs to multiple destinations by\\n      creating multiple deliveries. You can also create multiple deliveries to configure multiple\\n      delivery sources to send logs to the same delivery destination.</p>\\n         <p>Only some Amazon Web Services services support being configured as a delivery source. These\\n      services are listed as <b>Supported [V2 Permissions]</b> in the\\n      table at <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/AWS-logs-and-resource-policy.html\\\">Enabling logging from\\n          Amazon Web Services services.</a>\\n         </p>\\n         <p>If you use this operation to update an existing delivery destination, all the current\\n      delivery destination parameters are overwritten with the new parameter values that you\\n      specify.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#PutDeliveryDestinationPolicy\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#PutDeliveryDestinationPolicyRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#PutDeliveryDestinationPolicyResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ConflictException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates and assigns an IAM policy that grants permissions to CloudWatch Logs to deliver logs cross-account to a specified destination in this account. To\\n      configure the delivery of logs from an Amazon Web Services service in another account to a logs\\n      delivery destination in the current account, you must do the following:</p>\\n         <ul>\\n            <li>\\n               <p>Create a delivery source, which is a logical object that represents the resource that\\n          is actually sending the logs. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutDeliverySource.html\\\">PutDeliverySource</a>.</p>\\n            </li>\\n            <li>\\n               <p>Create a <i>delivery destination</i>, which is a logical object that\\n          represents the actual delivery destination. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutDeliveryDestination.html\\\">PutDeliveryDestination</a>.</p>\\n            </li>\\n            <li>\\n               <p>Use this operation in the destination account to assign an IAM policy\\n          to the destination. This policy allows delivery to that destination. </p>\\n            </li>\\n            <li>\\n               <p>Create a <i>delivery</i> by pairing exactly one delivery source and one\\n          delivery destination. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_CreateDelivery.html\\\">CreateDelivery</a>.</p>\\n            </li>\\n         </ul>\\n         <p>Only some Amazon Web Services services support being configured as a delivery source. These\\n      services are listed as <b>Supported [V2 Permissions]</b> in the\\n      table at <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/AWS-logs-and-resource-policy.html\\\">Enabling logging from\\n          Amazon Web Services services.</a>\\n         </p>\\n         <p>The contents of the policy must include two statements. One statement enables general logs\\n      delivery, and the other allows delivery to the chosen destination. See the examples for the\\n      needed policies.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#PutDeliveryDestinationPolicyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"deliveryDestinationName\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DeliveryDestinationName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the delivery destination to assign this policy to.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"deliveryDestinationPolicy\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DeliveryDestinationPolicy\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The contents of the policy.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#PutDeliveryDestinationPolicyResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"policy\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Policy\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The contents of the policy that you just created.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#PutDeliveryDestinationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"name\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DeliveryDestinationName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A name for this delivery destination. This name must be unique for all delivery\\n      destinations in your account.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"outputFormat\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#OutputFormat\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The format for the logs that this delivery destination will receive.</p>\"\n                    }\n                },\n                \"deliveryDestinationConfiguration\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DeliveryDestinationConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A structure that contains the ARN of the Amazon Web Services resource that will receive the\\n      logs.</p>\\n         <note>\\n            <p>\\n               <code>deliveryDestinationConfiguration</code> is required for CloudWatch Logs,\\n          Amazon S3, Firehose log delivery destinations and not required for\\n          X-Ray trace delivery destinations. <code>deliveryDestinationType</code> is\\n        needed for X-Ray trace delivery destinations but not required for other logs\\n        delivery destinations.</p>\\n         </note>\"\n                    }\n                },\n                \"deliveryDestinationType\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DeliveryDestinationType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of delivery destination. This parameter specifies the target service where log\\n      data will be delivered. Valid values include:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>S3</code> - Amazon S3 for long-term storage and analytics</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>CWL</code> - CloudWatch Logs for centralized log management</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>FH</code> - Amazon Kinesis Data Firehose for real-time data streaming</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>XRAY</code> - Amazon Web Services\\n          X-Ray for distributed tracing and application monitoring</p>\\n            </li>\\n         </ul>\\n         <p>The delivery destination type determines the format and configuration options available\\n      for log delivery.</p>\"\n                    }\n                },\n                \"tags\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Tags\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An optional list of key-value pairs to associate with the resource.</p>\\n         <p>For more information about tagging, see <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html\\\">Tagging Amazon Web Services resources</a>\\n         </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#PutDeliveryDestinationResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"deliveryDestination\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DeliveryDestination\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A structure containing information about the delivery destination that you just created or\\n      updated.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#PutDeliverySource\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#PutDeliverySourceRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#PutDeliverySourceResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ConflictException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceQuotaExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ThrottlingException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates or updates a logical <i>delivery source</i>. A delivery source\\n      represents an Amazon Web Services resource that sends logs to an logs delivery destination. The\\n      destination can be CloudWatch Logs, Amazon S3, Firehose or X-Ray for sending traces.</p>\\n         <p>To configure logs delivery between a delivery destination and an Amazon Web Services\\n      service that is supported as a delivery source, you must do the following:</p>\\n         <ul>\\n            <li>\\n               <p>Use <code>PutDeliverySource</code> to create a delivery source, which is a logical\\n          object that represents the resource that is actually sending the logs. </p>\\n            </li>\\n            <li>\\n               <p>Use <code>PutDeliveryDestination</code> to create a <i>delivery\\n            destination</i>, which is a logical object that represents the actual delivery\\n          destination. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutDeliveryDestination.html\\\">PutDeliveryDestination</a>.</p>\\n            </li>\\n            <li>\\n               <p>If you are delivering logs cross-account, you must use <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutDeliveryDestinationPolicy.html\\\">PutDeliveryDestinationPolicy</a> in the destination account to assign an IAM policy to the destination. This policy allows delivery to that destination.\\n        </p>\\n            </li>\\n            <li>\\n               <p>Use <code>CreateDelivery</code> to create a <i>delivery</i> by pairing\\n          exactly one delivery source and one delivery destination. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_CreateDelivery.html\\\">CreateDelivery</a>. </p>\\n            </li>\\n         </ul>\\n         <p>You can configure a single delivery source to send logs to multiple destinations by\\n      creating multiple deliveries. You can also create multiple deliveries to configure multiple\\n      delivery sources to send logs to the same delivery destination.</p>\\n         <p>Only some Amazon Web Services services support being configured as a delivery source. These\\n      services are listed as <b>Supported [V2 Permissions]</b> in the\\n      table at <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/AWS-logs-and-resource-policy.html\\\">Enabling logging from\\n          Amazon Web Services services.</a>\\n         </p>\\n         <p>If you use this operation to update an existing delivery source, all the current delivery\\n      source parameters are overwritten with the new parameter values that you specify.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#PutDeliverySourceRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"name\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DeliverySourceName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A name for this delivery source. This name must be unique for all delivery sources in your\\n      account.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"resourceArn\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Arn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the Amazon Web Services resource that is generating and sending logs. For\\n      example,\\n        <code>arn:aws:workmail:us-east-1:123456789012:organization/m-1234EXAMPLEabcd1234abcd1234abcd1234</code>\\n         </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"logType\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Defines the type of log that the source is sending.</p>\\n         <ul>\\n            <li>\\n               <p>For Amazon Bedrock, the valid value is <code>APPLICATION_LOGS</code> and\\n            <code>TRACES</code>.</p>\\n            </li>\\n            <li>\\n               <p>For CloudFront, the valid value is <code>ACCESS_LOGS</code>.</p>\\n            </li>\\n            <li>\\n               <p>For Amazon CodeWhisperer, the valid value is <code>EVENT_LOGS</code>.</p>\\n            </li>\\n            <li>\\n               <p>For Elemental MediaPackage, the valid values are <code>EGRESS_ACCESS_LOGS</code> and\\n            <code>INGRESS_ACCESS_LOGS</code>.</p>\\n            </li>\\n            <li>\\n               <p>For Elemental MediaTailor, the valid values are <code>AD_DECISION_SERVER_LOGS</code>,\\n            <code>MANIFEST_SERVICE_LOGS</code>, and <code>TRANSCODE_LOGS</code>.</p>\\n            </li>\\n            <li>\\n               <p>For Entity Resolution, the valid value is <code>WORKFLOW_LOGS</code>.</p>\\n            </li>\\n            <li>\\n               <p>For IAM Identity Center, the valid value is\\n          <code>ERROR_LOGS</code>.</p>\\n            </li>\\n            <li>\\n               <p>For PCS, the valid values are <code>PCS_SCHEDULER_LOGS</code> and\\n            <code>PCS_JOBCOMP_LOGS</code>.</p>\\n            </li>\\n            <li>\\n               <p>For Amazon Q, the valid value is <code>EVENT_LOGS</code>.</p>\\n            </li>\\n            <li>\\n               <p>For Amazon SES mail manager, the valid values are <code>APPLICATION_LOG</code>\\n          and <code>TRAFFIC_POLICY_DEBUG_LOGS</code>.</p>\\n            </li>\\n            <li>\\n               <p>For Amazon WorkMail, the valid values are <code>ACCESS_CONTROL_LOGS</code>,\\n            <code>AUTHENTICATION_LOGS</code>, <code>WORKMAIL_AVAILABILITY_PROVIDER_LOGS</code>,\\n            <code>WORKMAIL_MAILBOX_ACCESS_LOGS</code>, and\\n            <code>WORKMAIL_PERSONAL_ACCESS_TOKEN_LOGS</code>.</p>\\n            </li>\\n            <li>\\n               <p>For Amazon VPC Route Server, the valid value is\\n          <code>EVENT_LOGS</code>.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"tags\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Tags\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An optional list of key-value pairs to associate with the resource.</p>\\n         <p>For more information about tagging, see <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html\\\">Tagging Amazon Web Services resources</a>\\n         </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#PutDeliverySourceResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"deliverySource\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DeliverySource\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A structure containing information about the delivery source that was just created or\\n      updated.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#PutDestination\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#PutDestinationRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#PutDestinationResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#OperationAbortedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates or updates a destination. This operation is used only to create destinations\\n      for cross-account subscriptions.</p>\\n         <p>A destination encapsulates a physical resource (such as an Amazon Kinesis stream). With\\n      a destination, you can subscribe to a real-time stream of log events for a different account,\\n      ingested using <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutLogEvents.html\\\">PutLogEvents</a>.</p>\\n         <p>Through an access policy, a destination controls what is written to it. By default,\\n        <code>PutDestination</code> does not set any access policy with the destination, which means\\n      a cross-account user cannot call <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutSubscriptionFilter.html\\\">PutSubscriptionFilter</a> against this destination. To enable this, the destination\\n      owner must call <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutDestinationPolicy.html\\\">PutDestinationPolicy</a> after <code>PutDestination</code>.</p>\\n         <p>To perform a <code>PutDestination</code> operation, you must also have the\\n        <code>iam:PassRole</code> permission.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#PutDestinationPolicy\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#PutDestinationPolicyRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#OperationAbortedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates or updates an access policy associated with an existing destination. An access\\n      policy is an <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/policies_overview.html\\\">IAM\\n        policy document</a> that is used to authorize claims to register a subscription filter\\n      against a given destination.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#PutDestinationPolicyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"destinationName\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DestinationName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A name for an existing destination.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"accessPolicy\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#AccessPolicy\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An IAM policy document that authorizes cross-account users to deliver their log events\\n      to the associated destination. This can be up to 5120 bytes.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"forceUpdate\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ForceUpdate\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify true if you are updating an existing destination policy to grant permission to an\\n      organization ID instead of granting permission to individual Amazon Web Services accounts.\\n      Before you update a destination policy this way, you must first update the subscription\\n      filters in the accounts that send logs to this destination. If you do not, the subscription\\n      filters might stop working. By specifying <code>true</code> for <code>forceUpdate</code>, you\\n      are affirming that you have already updated the subscription filters. For more information,\\n      see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/Cross-Account-Log_Subscription-Update.html\\\"> Updating an\\n        existing cross-account subscription</a>\\n         </p>\\n         <p>If you omit this parameter, the default of <code>false</code> is used.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#PutDestinationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"destinationName\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DestinationName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A name for the destination.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"targetArn\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#TargetArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of an Amazon Kinesis stream to which to deliver matching log events.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"roleArn\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#RoleArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of an IAM role that grants CloudWatch Logs permissions to call the Amazon\\n      Kinesis <code>PutRecord</code> operation on the destination stream.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"tags\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Tags\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An optional list of key-value pairs to associate with the resource.</p>\\n         <p>For more information about tagging, see <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html\\\">Tagging Amazon Web Services resources</a>\\n         </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#PutDestinationResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"destination\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Destination\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The destination.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#PutIndexPolicy\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#PutIndexPolicyRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#PutIndexPolicyResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#OperationAbortedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates or updates a <i>field index policy</i> for the specified log group.\\n      Only log groups in the Standard log class support field index policies. For more information\\n      about log classes, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CloudWatch_Logs_Log_Classes.html\\\">Log\\n      classes</a>.</p>\\n         <p>You can use field index policies to create <i>field indexes</i> on fields\\n      found in log events in the log group. Creating field indexes speeds up and lowers the costs\\n      for CloudWatch Logs Insights queries that reference those field indexes, because these\\n      queries attempt to skip the processing of log events that are known to not match the indexed\\n      field. Good fields to index are fields that you often need to query for and fields or values\\n      that match only a small fraction of the total log events. Common examples of indexes include\\n      request ID, session ID, userID, and instance IDs. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CloudWatchLogs-Field-Indexing.html\\\">Create field indexes to improve query performance and reduce costs</a>.</p>\\n         <p>To find the fields that are in your log group events, use the <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_GetLogGroupFields.html\\\">GetLogGroupFields</a> operation.</p>\\n         <p>For example, suppose you have created a field index for <code>requestId</code>. Then, any\\n        CloudWatch Logs Insights query on that log group that includes <code>requestId =\\n          <i>value</i>\\n            </code> or <code>requestId IN [<i>value</i>,\\n          <i>value</i>, ...]</code> will process fewer log events to reduce costs, and\\n      have improved performance.</p>\\n         <p>CloudWatch Logs provides default field indexes for all log groups in the Standard log\\n      class. Default field indexes are automatically available for the following fields: </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>@aws.region</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>@aws.account</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>@source.log</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>traceId</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>Default field indexes are in addition to any custom field indexes you define within your\\n      policy. Default field indexes are not counted towards your field index quota. </p>\\n         <p>Each index policy has the following quotas and restrictions:</p>\\n         <ul>\\n            <li>\\n               <p>As many as 20 fields can be included in the policy.</p>\\n            </li>\\n            <li>\\n               <p>Each field name can include as many as 100 characters.</p>\\n            </li>\\n         </ul>\\n         <p>Matches of log events to the names of indexed fields are case-sensitive. For example, a\\n      field index of <code>RequestId</code> won't match a log event containing\\n        <code>requestId</code>.</p>\\n         <p>Log group-level field index policies created with <code>PutIndexPolicy</code> override\\n      account-level field index policies created with <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutAccountPolicy.html\\\">PutAccountPolicy</a>. If you use <code>PutIndexPolicy</code> to create a field index\\n      policy for a log group, that log group uses only that policy. The log group ignores any\\n      account-wide field index policy that you might have created.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#PutIndexPolicyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"logGroupIdentifier\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogGroupIdentifier\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify either the log group name or log group ARN to apply this field index policy to. If\\n      you specify an ARN, use the format\\n        arn:aws:logs:<i>region</i>:<i>account-id</i>:log-group:<i>log_group_name</i>\\n      Don't include an * at the end.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"policyDocument\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#PolicyDocument\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The index policy document, in JSON format. The following is an example of an index policy\\n      document that creates two indexes, <code>RequestId</code> and\\n      <code>TransactionId</code>.</p>\\n         <p>\\n            <code>\\\"policyDocument\\\": \\\"{ \\\"Fields\\\": [ \\\"RequestId\\\", \\\"TransactionId\\\" ] }\\\"</code>\\n         </p>\\n         <p>The policy document must include at least one field index. For more information about the\\n      fields that can be included and other restrictions, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CloudWatchLogs-Field-Indexing-Syntax.html\\\">Field index\\n        syntax and quotas</a>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#PutIndexPolicyResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"indexPolicy\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#IndexPolicy\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The index policy that you just created or updated.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#PutIntegration\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#PutIntegrationRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#PutIntegrationResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates an integration between CloudWatch Logs and another service in this account.\\n      Currently, only integrations with OpenSearch Service are supported, and currently you can have\\n      only one integration in your account.</p>\\n         <p>Integrating with OpenSearch Service makes it possible for you to create curated vended\\n      logs dashboards, powered by OpenSearch Service analytics. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CloudWatchLogs-OpenSearch-Dashboards.html\\\">Vended log\\n        dashboards powered by Amazon OpenSearch Service</a>.</p>\\n         <p>You can use this operation only to create a new integration. You can't modify an existing\\n      integration.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#PutIntegrationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"integrationName\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#IntegrationName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A name for the integration.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"resourceConfig\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ResourceConfig\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A structure that contains configuration information for the integration that you are\\n      creating.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"integrationType\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#IntegrationType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of integration. Currently, the only supported type is\\n      <code>OPENSEARCH</code>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#PutIntegrationResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"integrationName\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#IntegrationName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the integration that you just created.</p>\"\n                    }\n                },\n                \"integrationStatus\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#IntegrationStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The status of the integration that you just created.</p>\\n         <p>After you create an integration, it takes a few minutes to complete. During this time,\\n      you'll see the status as <code>PROVISIONING</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#PutLogEvents\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#PutLogEventsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#PutLogEventsResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DataAlreadyAcceptedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InvalidSequenceTokenException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#UnrecognizedClientException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Uploads a batch of log events to the specified log stream.</p>\\n         <important>\\n            <p>The sequence token is now ignored in <code>PutLogEvents</code> actions.\\n          <code>PutLogEvents</code> actions are always accepted and never return\\n          <code>InvalidSequenceTokenException</code> or <code>DataAlreadyAcceptedException</code>\\n        even if the sequence token is not valid. You can use parallel <code>PutLogEvents</code>\\n        actions on the same log stream. </p>\\n         </important>\\n         <p>The batch of events must satisfy the following constraints:</p>\\n         <ul>\\n            <li>\\n               <p>The maximum batch size is 1,048,576 bytes. This size is calculated as the sum of\\n          all event messages in UTF-8, plus 26 bytes for each log event.</p>\\n            </li>\\n            <li>\\n               <p>Events more than 2 hours in the future are rejected while processing remaining\\n          valid events.</p>\\n            </li>\\n            <li>\\n               <p>Events older than 14 days or preceding the log group's retention period are\\n          rejected while processing remaining valid events.</p>\\n            </li>\\n            <li>\\n               <p>The log events in the batch must be in chronological order by their timestamp. The\\n          timestamp is the time that the event occurred, expressed as the number of milliseconds\\n          after <code>Jan 1, 1970 00:00:00 UTC</code>. (In Amazon Web Services Tools for PowerShell\\n          and the Amazon Web Services SDK for .NET, the timestamp is specified in .NET format:\\n            <code>yyyy-mm-ddThh:mm:ss</code>. For example, <code>2017-09-15T13:45:30</code>.)\\n        </p>\\n            </li>\\n            <li>\\n               <p> A batch of log events in a single request must be in a chronological order.\\n          Otherwise, the operation fails.</p>\\n            </li>\\n            <li>\\n               <p>Each log event can be no larger than 1 MB.</p>\\n            </li>\\n            <li>\\n               <p>The maximum number of log events in a batch is 10,000.</p>\\n            </li>\\n            <li>\\n               <p>For valid events (within 14 days in the past to 2 hours in future), the time span\\n          in a single batch cannot exceed 24 hours. Otherwise, the operation fails.</p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>The quota of five requests per second per log stream has been removed. Instead,\\n          <code>PutLogEvents</code> actions are throttled based on a per-second per-account quota.\\n        You can request an increase to the per-second throttling quota by using the Service Quotas service.</p>\\n         </important>\\n         <p>If a call to <code>PutLogEvents</code> returns \\\"UnrecognizedClientException\\\" the most\\n      likely cause is a non-valid Amazon Web Services access key ID or secret key. </p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#PutLogEventsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"logGroupName\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogGroupName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the log group.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"logStreamName\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogStreamName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the log stream.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"logEvents\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InputLogEvents\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The log events.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"sequenceToken\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#SequenceToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The sequence token obtained from the response of the previous <code>PutLogEvents</code>\\n      call.</p>\\n         <important>\\n            <p>The <code>sequenceToken</code> parameter is now ignored in <code>PutLogEvents</code>\\n        actions. <code>PutLogEvents</code> actions are now accepted and never return\\n          <code>InvalidSequenceTokenException</code> or <code>DataAlreadyAcceptedException</code>\\n        even if the sequence token is not valid.</p>\\n         </important>\"\n                    }\n                },\n                \"entity\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Entity\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The entity associated with the log events.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#PutLogEventsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"nextSequenceToken\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#SequenceToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The next sequence token.</p>\\n         <important>\\n            <p>This field has been deprecated.</p>\\n            <p>The sequence token is now ignored in <code>PutLogEvents</code> actions.\\n          <code>PutLogEvents</code> actions are always accepted even if the sequence token is not\\n        valid. You can use parallel <code>PutLogEvents</code> actions on the same log stream and you\\n        do not need to wait for the response of a previous <code>PutLogEvents</code> action to\\n        obtain the <code>nextSequenceToken</code> value.</p>\\n         </important>\"\n                    }\n                },\n                \"rejectedLogEventsInfo\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#RejectedLogEventsInfo\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The rejected events.</p>\"\n                    }\n                },\n                \"rejectedEntityInfo\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#RejectedEntityInfo\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Information about why the entity is rejected when calling <code>PutLogEvents</code>. Only\\n      returned when the entity is rejected.</p>\\n         <note>\\n            <p>When the entity is rejected, the events may still be accepted.</p>\\n         </note>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#PutMetricFilter\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#PutMetricFilterRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InvalidOperationException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#OperationAbortedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates or updates a metric filter and associates it with the specified log group. With\\n      metric filters, you can configure rules to extract metric data from log events ingested\\n      through <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutLogEvents.html\\\">PutLogEvents</a>.</p>\\n         <p>The maximum number of metric filters that can be associated with a log group is\\n      100.</p>\\n         <p>Using regular expressions in filter patterns is supported. For these filters, there is a\\n      quota of two regular expression patterns within a single filter pattern. There is also a quota\\n      of five regular expression patterns per log group. For more information about using regular\\n      expressions in filter patterns, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/FilterAndPatternSyntax.html\\\"> Filter pattern syntax for\\n        metric filters, subscription filters, filter log events, and Live Tail</a>.</p>\\n         <p>When you create a metric filter, you can also optionally assign a unit and dimensions to\\n      the metric that is created.</p>\\n         <important>\\n            <p>Metrics extracted from log events are charged as custom metrics. To prevent unexpected\\n        high charges, do not specify high-cardinality fields such as <code>IPAddress</code> or\\n          <code>requestID</code> as dimensions. Each different value found for a dimension is\\n        treated as a separate metric and accrues charges as a separate custom metric. </p>\\n            <p>CloudWatch Logs might disable a metric filter if it generates 1,000 different\\n        name/value pairs for your specified dimensions within one hour.</p>\\n            <p>You can also set up a billing alarm to alert you if your charges are higher than\\n        expected. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/monitor_estimated_charges_with_cloudwatch.html\\\">\\n          Creating a Billing Alarm to Monitor Your Estimated Amazon Web Services Charges</a>.\\n      </p>\\n         </important>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#PutMetricFilterRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"logGroupName\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogGroupName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the log group.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"filterName\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#FilterName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A name for the metric filter.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"filterPattern\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#FilterPattern\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A filter pattern for extracting metric data out of ingested log events.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"metricTransformations\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#MetricTransformations\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A collection of information that defines how metric data gets emitted.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"applyOnTransformedLogs\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ApplyOnTransformedLogs\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>This parameter is valid only for log groups that have an active log transformer. For more\\n      information about log transformers, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutTransformer.html\\\">PutTransformer</a>.</p>\\n         <p>If the log group uses either a log-group level or account-level transformer, and you\\n      specify <code>true</code>, the metric filter will be applied on the transformed version of the\\n      log events instead of the original ingested log events.</p>\"\n                    }\n                },\n                \"fieldSelectionCriteria\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#FieldSelectionCriteria\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A filter expression that specifies which log events should be processed by this metric filter based on system fields such as source account and source region. Uses selection criteria syntax with operators like <code>=</code>, <code>!=</code>, <code>AND</code>, <code>OR</code>, <code>IN</code>, <code>NOT IN</code>. Example: <code>@aws.region = \\\"us-east-1\\\"</code> or <code>@aws.account IN [\\\"123456789012\\\", \\\"987654321098\\\"]</code>. Maximum length: 2000 characters.</p>\"\n                    }\n                },\n                \"emitSystemFieldDimensions\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#EmitSystemFields\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of system fields to emit as additional dimensions in the generated metrics. Valid values are <code>@aws.account</code> and <code>@aws.region</code>. These dimensions help identify the source of centralized log data and count toward the total dimension limit for metric filters.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#PutQueryDefinition\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#PutQueryDefinitionRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#PutQueryDefinitionResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates or updates a query definition for CloudWatch Logs Insights. For more information,\\n      see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/AnalyzingLogData.html\\\">Analyzing Log Data with CloudWatch Logs Insights</a>.</p>\\n         <p>To update a query definition, specify its <code>queryDefinitionId</code> in your request.\\n      The values of <code>name</code>, <code>queryString</code>, and <code>logGroupNames</code> are\\n      changed to the values that you specify in your update operation. No current values are\\n      retained from the current query definition. For example, imagine updating a current query\\n      definition that includes log groups. If you don't specify the <code>logGroupNames</code>\\n      parameter in your update operation, the query definition changes to contain no log\\n      groups.</p>\\n         <p>You must have the <code>logs:PutQueryDefinition</code> permission to be able to perform\\n      this operation.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#PutQueryDefinitionRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"queryLanguage\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#QueryLanguage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify the query language to use for this query. The options are Logs Insights QL,\\n      OpenSearch PPL, and OpenSearch SQL. For more information about the query languages that\\n        CloudWatch Logs supports, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CWL_AnalyzeLogData_Languages.html\\\">Supported query\\n        languages</a>.</p>\"\n                    }\n                },\n                \"name\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#QueryDefinitionName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A name for the query definition. If you are saving numerous query definitions, we\\n      recommend that you name them. This way, you can find the ones you want by using the first part\\n      of the name as a filter in the <code>queryDefinitionNamePrefix</code> parameter of <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_DescribeQueryDefinitions.html\\\">DescribeQueryDefinitions</a>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"queryDefinitionId\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#QueryId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If you are updating a query definition, use this parameter to specify the ID of the query\\n      definition that you want to update. You can use <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_DescribeQueryDefinitions.html\\\">DescribeQueryDefinitions</a> to retrieve the IDs of your saved query\\n      definitions.</p>\\n         <p>If you are creating a query definition, do not specify this parameter. CloudWatch\\n      generates a unique ID for the new query definition and include it in the response to this\\n      operation.</p>\"\n                    }\n                },\n                \"logGroupNames\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogGroupNames\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter to include specific log groups as part of your query definition. If\\n      your query uses the OpenSearch Service query language, you specify the log group names inside\\n      the <code>querystring</code> instead of here.</p>\\n         <p>If you are updating an existing query definition for the Logs Insights QL or OpenSearch Service PPL and you omit this parameter, then the updated definition will contain no log\\n      groups.</p>\"\n                    }\n                },\n                \"queryString\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#QueryDefinitionString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The query string to use for this definition. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CWL_QuerySyntax.html\\\">CloudWatch Logs\\n        Insights Query Syntax</a>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"clientToken\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ClientToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Used as an idempotency token, to avoid returning an exception if the service receives the\\n      same request twice because of a network error.</p>\",\n                        \"smithy.api#idempotencyToken\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#PutQueryDefinitionResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"queryDefinitionId\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#QueryId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the query definition.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#PutResourcePolicy\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#PutResourcePolicyRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#PutResourcePolicyResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#OperationAbortedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates or updates a resource policy allowing other Amazon Web Services services to put\\n      log events to this account, such as Amazon Route 53. An account can have up to 10 resource\\n      policies per Amazon Web Services Region.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#PutResourcePolicyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"policyName\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#PolicyName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Name of the new policy. This parameter is required.</p>\"\n                    }\n                },\n                \"policyDocument\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#PolicyDocument\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Details of the new policy, including the identity of the principal that is enabled to\\n      put logs to this account. This is formatted as a JSON string. This parameter is\\n      required.</p>\\n         <p>The following example creates a resource policy enabling the Route 53 service to put\\n      DNS query logs in to the specified log group. Replace <code>\\\"logArn\\\"</code> with the ARN of\\n      your CloudWatch Logs resource, such as a log group or log stream.</p>\\n         <p>CloudWatch Logs also supports <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn\\\">aws:SourceArn</a> and <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount\\\">aws:SourceAccount</a> condition context keys.</p>\\n         <p>In the example resource policy, you would replace the value of <code>SourceArn</code> with\\n      the resource making the call from Route 53 to CloudWatch Logs. You would also\\n      replace the value of <code>SourceAccount</code> with the Amazon Web Services account ID making\\n      that call.</p>\\n         <p></p>\\n         <p>\\n            <code>{ \\\"Version\\\": \\\"2012-10-17\\\", \\\"Statement\\\": [ { \\\"Sid\\\": \\\"Route53LogsToCloudWatchLogs\\\",\\n        \\\"Effect\\\": \\\"Allow\\\", \\\"Principal\\\": { \\\"Service\\\": [ \\\"route53.amazonaws.com\\\" ] }, \\\"Action\\\":\\n        \\\"logs:PutLogEvents\\\", \\\"Resource\\\": \\\"logArn\\\", \\\"Condition\\\": { \\\"ArnLike\\\": { \\\"aws:SourceArn\\\":\\n        \\\"myRoute53ResourceArn\\\" }, \\\"StringEquals\\\": { \\\"aws:SourceAccount\\\": \\\"myAwsAccountId\\\" } } } ]\\n        }</code>\\n         </p>\"\n                    }\n                },\n                \"resourceArn\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Arn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the CloudWatch Logs resource to which the resource policy needs to be added\\n      or attached. Currently only supports LogGroup ARN.</p>\"\n                    }\n                },\n                \"expectedRevisionId\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ExpectedRevisionId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The expected revision ID of the resource policy. Required when <code>resourceArn</code> is\\n      provided to prevent concurrent modifications. Use <code>null</code> when creating a resource\\n      policy for the first time.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#PutResourcePolicyResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"resourcePolicy\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ResourcePolicy\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The new policy.</p>\"\n                    }\n                },\n                \"revisionId\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ExpectedRevisionId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The revision ID of the created or updated resource policy. Only returned for\\n      resource-scoped policies.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#PutRetentionPolicy\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#PutRetentionPolicyRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#OperationAbortedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Sets the retention of the specified log group. With a retention policy, you can\\n      configure the number of days for which to retain log events in the specified log\\n      group.</p>\\n         <note>\\n            <p>CloudWatch Logs doesn't immediately delete log events when they reach their retention\\n        setting. It typically takes up to 72 hours after that before log events are deleted, but in\\n        rare situations might take longer.</p>\\n            <p>To illustrate, imagine that you change a log group to have a longer retention setting\\n        when it contains log events that are past the expiration date, but haven't been deleted.\\n        Those log events will take up to 72 hours to be deleted after the new retention date is\\n        reached. To make sure that log data is deleted permanently, keep a log group at its lower\\n        retention setting until 72 hours after the previous retention period ends. Alternatively,\\n        wait to change the retention setting until you confirm that the earlier log events are\\n        deleted. </p>\\n            <p>When log events reach their retention setting they are marked for deletion. After they\\n        are marked for deletion, they do not add to your archival storage costs anymore, even if\\n        they are not actually deleted until later. These log events marked for deletion are also not\\n        included when you use an API to retrieve the <code>storedBytes</code> value to see how many\\n        bytes a log group is storing.</p>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#PutRetentionPolicyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"logGroupName\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogGroupName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the log group.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"retentionInDays\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Days\",\n                    \"traits\": {\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#PutSubscriptionFilter\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#PutSubscriptionFilterRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InvalidOperationException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#OperationAbortedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates or updates a subscription filter and associates it with the specified log\\n      group. With subscription filters, you can subscribe to a real-time stream of log events\\n      ingested through <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutLogEvents.html\\\">PutLogEvents</a>\\n      and have them delivered to a specific destination. When log events are sent to the receiving\\n      service, they are Base64 encoded and compressed with the GZIP format.</p>\\n         <p>The following destinations are supported for subscription filters:</p>\\n         <ul>\\n            <li>\\n               <p>An Amazon Kinesis data stream belonging to the same account as the subscription\\n          filter, for same-account delivery.</p>\\n            </li>\\n            <li>\\n               <p>A logical destination created with <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutDestination.html\\\">PutDestination</a> that belongs to a different account, for cross-account delivery.\\n          We currently support Kinesis Data Streams and Firehose as logical\\n          destinations.</p>\\n            </li>\\n            <li>\\n               <p>An Amazon Kinesis Data Firehose delivery stream that belongs to the same account as\\n          the subscription filter, for same-account delivery.</p>\\n            </li>\\n            <li>\\n               <p>An Lambda function that belongs to the same account as the\\n          subscription filter, for same-account delivery.</p>\\n            </li>\\n         </ul>\\n         <p>Each log group can have up to two subscription filters associated with it. If you are\\n      updating an existing filter, you must specify the correct name in <code>filterName</code>. </p>\\n         <p>Using regular expressions in filter patterns is supported. For these filters, there is a\\n      quotas of quota of two regular expression patterns within a single filter pattern. There is\\n      also a quota of five regular expression patterns per log group. For more information about\\n      using regular expressions in filter patterns, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/FilterAndPatternSyntax.html\\\"> Filter pattern syntax for\\n        metric filters, subscription filters, filter log events, and Live Tail</a>.</p>\\n         <p>To perform a <code>PutSubscriptionFilter</code> operation for any destination except a\\n        Lambda function, you must also have the <code>iam:PassRole</code>\\n      permission.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#PutSubscriptionFilterRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"logGroupName\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogGroupName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the log group.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"filterName\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#FilterName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A name for the subscription filter. If you are updating an existing filter, you must\\n      specify the correct name in <code>filterName</code>. To find the name of the filter currently\\n      associated with a log group, use <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_DescribeSubscriptionFilters.html\\\">DescribeSubscriptionFilters</a>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"filterPattern\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#FilterPattern\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A filter pattern for subscribing to a filtered stream of log events.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"destinationArn\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DestinationArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the destination to deliver matching log events to. Currently, the supported\\n      destinations are:</p>\\n         <ul>\\n            <li>\\n               <p>An Amazon Kinesis stream belonging to the same account as the subscription filter,\\n          for same-account delivery.</p>\\n            </li>\\n            <li>\\n               <p>A logical destination (specified using an ARN) belonging to a different account,\\n          for cross-account delivery.</p>\\n               <p>If you're setting up a cross-account subscription, the destination must have an IAM\\n          policy associated with it. The IAM policy must allow the sender to send logs to the\\n          destination. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutDestinationPolicy.html\\\">PutDestinationPolicy</a>.</p>\\n            </li>\\n            <li>\\n               <p>A Kinesis Data Firehose delivery stream belonging to the same account as the\\n          subscription filter, for same-account delivery.</p>\\n            </li>\\n            <li>\\n               <p>A Lambda function belonging to the same account as the subscription\\n          filter, for same-account delivery.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"roleArn\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#RoleArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of an IAM role that grants CloudWatch Logs permissions to deliver ingested log\\n      events to the destination stream. You don't need to provide the ARN when you are working with\\n      a logical destination for cross-account delivery.</p>\"\n                    }\n                },\n                \"distribution\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Distribution\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The method used to distribute log data to the destination. By default, log data is\\n      grouped by log stream, but the grouping can be set to random for a more even distribution.\\n      This property is only applicable when the destination is an Amazon Kinesis data stream.\\n    </p>\"\n                    }\n                },\n                \"applyOnTransformedLogs\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ApplyOnTransformedLogs\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>This parameter is valid only for log groups that have an active log transformer. For more\\n      information about log transformers, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutTransformer.html\\\">PutTransformer</a>.</p>\\n         <p>If the log group uses either a log-group level or account-level transformer, and you\\n      specify <code>true</code>, the subscription filter will be applied on the transformed version\\n      of the log events instead of the original ingested log events.</p>\"\n                    }\n                },\n                \"fieldSelectionCriteria\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#FieldSelectionCriteria\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A filter expression that specifies which log events should be processed by this subscription filter based on system fields such as source account and source region. Uses selection criteria syntax with operators like <code>=</code>, <code>!=</code>, <code>AND</code>, <code>OR</code>, <code>IN</code>, <code>NOT IN</code>. Example: <code>@aws.region NOT IN [\\\"cn-north-1\\\"]</code> or <code>@aws.account = \\\"123456789012\\\" AND @aws.region = \\\"us-east-1\\\"</code>. Maximum length: 2000 characters.</p>\"\n                    }\n                },\n                \"emitSystemFields\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#EmitSystemFields\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of system fields to include in the log events sent to the subscription destination. Valid values are <code>@aws.account</code> and <code>@aws.region</code>. These fields provide source information for centralized log data in the forwarded payload.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#PutTransformer\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#PutTransformerRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InvalidOperationException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#OperationAbortedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates or updates a <i>log transformer</i> for a single log group. You use\\n      log transformers to transform log events into a different format, making them easier for you\\n      to process and analyze. You can also transform logs from different sources into standardized\\n      formats that contains relevant, source-specific information.</p>\\n         <p>After you have created a transformer, CloudWatch Logs performs the transformations at\\n      the time of log ingestion. You can then refer to the transformed versions of the logs during\\n      operations such as querying with CloudWatch Logs Insights or creating metric filters or\\n      subscription filers.</p>\\n         <p>You can also use a transformer to copy metadata from metadata keys into the log events\\n      themselves. This metadata can include log group name, log stream name, account ID and\\n      Region.</p>\\n         <p>A transformer for a log group is a series of processors, where each processor applies one\\n      type of transformation to the log events ingested into this log group. The processors work one\\n      after another, in the order that you list them, like a pipeline. For more information about\\n      the available processors to use in a transformer, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CloudWatch-Logs-Transformation.html#CloudWatch-Logs-Transformation-Processors\\\"> Processors that you can use</a>.</p>\\n         <p>Having log events in standardized format enables visibility across your applications for\\n      your log analysis, reporting, and alarming needs. CloudWatch Logs provides transformation\\n      for common log types with out-of-the-box transformation templates for major Amazon Web Services\\n      log sources such as VPC flow logs, Lambda, and Amazon RDS. You can use\\n      pre-built transformation templates or create custom transformation policies.</p>\\n         <p>You can create transformers only for the log groups in the Standard log class.</p>\\n         <p>You can also set up a transformer at the account level. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutAccountPolicy.html\\\">PutAccountPolicy</a>. If there is both a log-group level transformer created with\\n        <code>PutTransformer</code> and an account-level transformer that could apply to the same\\n      log group, the log group uses only the log-group level transformer. It ignores the\\n      account-level transformer.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#PutTransformerRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"logGroupIdentifier\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogGroupIdentifier\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify either the name or ARN of the log group to create the transformer for. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"transformerConfig\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Processors\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>This structure contains the configuration of this log transformer. A log transformer is an\\n      array of processors, where each processor applies one type of transformation to the log events\\n      that are ingested.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#QueryCharOffset\": {\n            \"type\": \"integer\"\n        },\n        \"com.amazonaws.cloudwatchlogs#QueryCompileError\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"location\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#QueryCompileErrorLocation\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Reserved.</p>\"\n                    }\n                },\n                \"message\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Message\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Reserved.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Reserved.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#QueryCompileErrorLocation\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"startCharOffset\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#QueryCharOffset\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Reserved.</p>\"\n                    }\n                },\n                \"endCharOffset\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#QueryCharOffset\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Reserved.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Reserved.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#QueryDefinition\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"queryLanguage\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#QueryLanguage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The query language used for this query. For more information about the query languages\\n      that CloudWatch Logs supports, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CWL_AnalyzeLogData_Languages.html\\\">Supported query\\n        languages</a>.</p>\"\n                    }\n                },\n                \"queryDefinitionId\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#QueryId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The unique ID of the query definition.</p>\"\n                    }\n                },\n                \"name\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#QueryDefinitionName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the query definition.</p>\"\n                    }\n                },\n                \"queryString\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#QueryDefinitionString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The query string to use for this definition. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CWL_QuerySyntax.html\\\">CloudWatch Logs\\n        Insights Query Syntax</a>.</p>\"\n                    }\n                },\n                \"lastModified\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date that the query definition was most recently modified.</p>\"\n                    }\n                },\n                \"logGroupNames\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogGroupNames\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If this query definition contains a list of log groups that it is limited to, that list\\n      appears here.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This structure contains details about a saved CloudWatch Logs Insights query\\n      definition.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#QueryDefinitionList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#QueryDefinition\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#QueryDefinitionName\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 255\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#QueryDefinitionString\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 10000\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#QueryId\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 256\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#QueryInfo\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"queryLanguage\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#QueryLanguage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The query language used for this query. For more information about the query languages\\n      that CloudWatch Logs supports, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CWL_AnalyzeLogData_Languages.html\\\">Supported query\\n        languages</a>.</p>\"\n                    }\n                },\n                \"queryId\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#QueryId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The unique ID number of this query.</p>\"\n                    }\n                },\n                \"queryString\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#QueryString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The query string used in this query.</p>\"\n                    }\n                },\n                \"status\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#QueryStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The status of this query. Possible values are <code>Cancelled</code>,\\n        <code>Complete</code>, <code>Failed</code>, <code>Running</code>, <code>Scheduled</code>,\\n      and <code>Unknown</code>.</p>\"\n                    }\n                },\n                \"createTime\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time that this query was created.</p>\"\n                    }\n                },\n                \"logGroupName\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogGroupName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the log group scanned by this query.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about one CloudWatch Logs Insights query that matches the request in a\\n        <code>DescribeQueries</code> operation. </p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#QueryInfoList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#QueryInfo\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#QueryLanguage\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"CWLI\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"CWLI\"\n                    }\n                },\n                \"SQL\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"SQL\"\n                    }\n                },\n                \"PPL\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"PPL\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#QueryListMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#QueryResults\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#ResultRows\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#QueryStatistics\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"recordsMatched\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#StatsValue\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The number of log events that matched the query string.</p>\"\n                    }\n                },\n                \"recordsScanned\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#StatsValue\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The total number of log events scanned during the query.</p>\"\n                    }\n                },\n                \"estimatedRecordsSkipped\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#StatsValue\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>An estimate of the number of log events that were skipped when processing this query,\\n      because the query contained an indexed field. Skipping these entries lowers query costs and\\n      improves the query performance time. For more information about field indexes, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutIndexPolicy.html\\\">PutIndexPolicy</a>.</p>\"\n                    }\n                },\n                \"bytesScanned\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#StatsValue\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The total number of bytes in the log events scanned during the query.</p>\"\n                    }\n                },\n                \"estimatedBytesSkipped\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#StatsValue\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>An estimate of the number of bytes in the log events that were skipped when processing\\n      this query, because the query contained an indexed field. Skipping these entries lowers query\\n      costs and improves the query performance time. For more information about field indexes, see\\n        <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutIndexPolicy.html\\\">PutIndexPolicy</a>.</p>\"\n                    }\n                },\n                \"logGroupsScanned\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#StatsValue\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The number of log groups that were scanned by this query.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the number of log events scanned by the query, the number of log events that\\n      matched the query criteria, and the total number of bytes in the log events that were\\n      scanned.</p>\\n         <p>If the query involved log groups that have field index policies, the estimated number of\\n      skipped log events and the total bytes of those skipped log events are included. Using field\\n      indexes to skip log events in queries reduces scan volume and improves performance. For more\\n      information, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CloudWatchLogs-Field-Indexing.html\\\">Create field indexes\\n        to improve query performance and reduce scan volume</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#QueryStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"Scheduled\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Scheduled\"\n                    }\n                },\n                \"Running\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Running\"\n                    }\n                },\n                \"Complete\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Complete\"\n                    }\n                },\n                \"Failed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Failed\"\n                    }\n                },\n                \"Cancelled\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Cancelled\"\n                    }\n                },\n                \"Timeout\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Timeout\"\n                    }\n                },\n                \"Unknown\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Unknown\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#QueryString\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 10000\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#QuoteCharacter\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 1\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#RecordField\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"name\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#FieldHeader\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name to use when specifying this record field in a <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_CreateDelivery.html\\\">CreateDelivery</a> or <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_UpdateDeliveryConfiguration.html\\\">UpdateDeliveryConfiguration</a> operation. </p>\"\n                    }\n                },\n                \"mandatory\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If this is <code>true</code>, the record field must be present in the\\n        <code>recordFields</code> parameter provided to a <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_CreateDelivery.html\\\">CreateDelivery</a> or <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_UpdateDeliveryConfiguration.html\\\">UpdateDeliveryConfiguration</a> operation.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A structure that represents a valid record field header and whether it is\\n      mandatory.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#RecordFields\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#FieldHeader\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 128\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#RejectedEntityInfo\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"errorType\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#EntityRejectionErrorType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of error that caused the rejection of the entity when calling\\n        <code>PutLogEvents</code>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>If an entity is rejected when a <code>PutLogEvents</code> request was made, this includes\\n      details about the reason for the rejection.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#RejectedLogEventsInfo\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"tooNewLogEventStartIndex\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogEventIndex\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The index of the first log event that is too new. This field is inclusive.</p>\"\n                    }\n                },\n                \"tooOldLogEventEndIndex\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogEventIndex\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The index of the last log event that is too old. This field is exclusive.</p>\"\n                    }\n                },\n                \"expiredLogEventEndIndex\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogEventIndex\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The expired log events.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents the rejected events.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#RenameKeyEntries\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#RenameKeyEntry\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 5\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#RenameKeyEntry\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"key\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Key\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The key to rename</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"renameTo\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#RenameTo\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The string to use for the new key name</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"overwriteIfExists\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#OverwriteIfExists\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Specifies whether to overwrite the existing value if the destination key already exists.\\n      The default is <code>false</code>\\n         </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This object defines one key that will be renamed with the <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CloudWatch-Logs-Transformation.html#CloudWatch-Logs-Transformation-renameKey\\\"> renameKey</a> processor.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#RenameKeys\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"entries\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#RenameKeyEntries\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An array of <code>RenameKeyEntry</code> objects, where each object contains the\\n      information about a single key to rename. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Use this processor to rename keys in a log event.</p>\\n         <p>For more information about this processor including examples, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CloudWatch-Logs-Transformation.html#CloudWatch-Logs-Transformation-renameKeys\\\"> renameKeys</a> in the <i>CloudWatch Logs User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#RenameTo\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 128\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#RequestId\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 256\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#ResourceAlreadyExistsException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Message\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The specified resource already exists.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#ResourceArns\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#Arn\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#ResourceConfig\": {\n            \"type\": \"union\",\n            \"members\": {\n                \"openSearchResourceConfig\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#OpenSearchResourceConfig\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>This structure contains configuration details about an integration between CloudWatch Logs and OpenSearch Service.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This structure contains configuration details about an integration between CloudWatch Logs and another entity.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#ResourceIdentifier\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 2048\n                },\n                \"smithy.api#pattern\": \"^[\\\\w+=/:,.@\\\\-\\\\*]*$\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#ResourceNotFoundException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Message\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The specified resource does not exist.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#ResourcePolicies\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#ResourcePolicy\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#ResourcePolicy\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"policyName\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#PolicyName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the resource policy.</p>\"\n                    }\n                },\n                \"policyDocument\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#PolicyDocument\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The details of the policy.</p>\"\n                    }\n                },\n                \"lastUpdatedTime\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Timestamp showing when this policy was last updated, expressed as the number of\\n      milliseconds after <code>Jan 1, 1970 00:00:00 UTC</code>.</p>\"\n                    }\n                },\n                \"policyScope\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#PolicyScope\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies scope of the resource policy. Valid values are ACCOUNT or RESOURCE.</p>\"\n                    }\n                },\n                \"resourceArn\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Arn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the CloudWatch Logs resource to which the resource policy is attached. Only\\n      populated for resource-scoped policies.</p>\"\n                    }\n                },\n                \"revisionId\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ExpectedRevisionId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The revision ID of the resource policy. Only populated for resource-scoped\\n      policies.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A policy enabling one or more entities to put logs to a log group in this\\n      account.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#ResourceType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 255\n                },\n                \"smithy.api#pattern\": \"^[\\\\w-_]*$\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#ResourceTypes\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#ResourceType\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 10\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#ResultField\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"field\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Field\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The log event field.</p>\"\n                    }\n                },\n                \"value\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Value\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The value of this field.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains one field from one log event returned by a CloudWatch Logs Insights query, along\\n      with the value of that field.</p>\\n         <p>For more information about the fields that are generated by CloudWatch logs, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CWL_AnalyzeLogData-discoverable-fields.html\\\">Supported\\n        Logs and Discovered Fields</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#ResultRows\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#ResultField\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#RoleArn\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#S3DeliveryConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"suffixPath\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DeliverySuffixPath\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>This string allows re-configuring the S3 object prefix to contain either static or\\n      variable sections. The valid variables to use in the suffix path will vary by each log source.\\n      To find the values supported for the suffix path for each log source, use the <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_DescribeConfigurationTemplates.html\\\">DescribeConfigurationTemplates</a> operation and check the\\n        <code>allowedSuffixPathFields</code> field in the response.</p>\"\n                    }\n                },\n                \"enableHiveCompatiblePath\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>This parameter causes the S3 objects that contain delivered logs to use a prefix structure\\n      that allows for integration with Apache Hive.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This structure contains delivery configurations that apply only when the delivery\\n      destination resource is an S3 bucket.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#Scope\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ALL\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ALL\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#SearchedLogStream\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"logStreamName\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogStreamName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the log stream.</p>\"\n                    }\n                },\n                \"searchedCompletely\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogStreamSearchedCompletely\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether all the events in this log stream were searched.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents the search status of a log stream.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#SearchedLogStreams\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#SearchedLogStream\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#SelectionCriteria\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.cloudwatchlogs#SequenceToken\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#Service\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 255\n                },\n                \"smithy.api#pattern\": \"^[\\\\w_-]*$\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#ServiceQuotaExceededException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Message\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This request exceeds a service quota.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Message\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The service cannot complete the request.</p>\",\n                \"smithy.api#error\": \"server\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#SessionId\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 256\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#SessionStreamingException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Message\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This exception is returned if an unknown error occurs during a Live Tail session.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#SessionTimeoutException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Message\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This exception is returned in a Live Tail stream when the Live Tail session times out.\\n      Live Tail sessions time out after three hours.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#Source\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 128\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#SourceTimezone\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#SplitString\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"entries\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#SplitStringEntries\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An array of <code>SplitStringEntry</code> objects, where each object contains the\\n      information about one field to split. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Use this processor to split a field into an array of strings using a delimiting\\n      character.</p>\\n         <p>For more information about this processor including examples, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CloudWatch-Logs-Transformation.html#CloudWatch-Logs-Transformation-splitString\\\"> splitString</a> in the <i>CloudWatch Logs User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#SplitStringDelimiter\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 128\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#SplitStringEntries\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#SplitStringEntry\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 10\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#SplitStringEntry\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"source\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Source\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The key of the field to split.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"delimiter\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#SplitStringDelimiter\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The separator characters to split the string entry on.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This object defines one log field that will be split with the <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CloudWatch-Logs-Transformation.html#CloudWatch-Logs-Transformation-splitString\\\"> splitString</a> processor.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#StandardUnit\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"Seconds\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Seconds\"\n                    }\n                },\n                \"Microseconds\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Microseconds\"\n                    }\n                },\n                \"Milliseconds\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Milliseconds\"\n                    }\n                },\n                \"Bytes\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Bytes\"\n                    }\n                },\n                \"Kilobytes\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Kilobytes\"\n                    }\n                },\n                \"Megabytes\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Megabytes\"\n                    }\n                },\n                \"Gigabytes\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Gigabytes\"\n                    }\n                },\n                \"Terabytes\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Terabytes\"\n                    }\n                },\n                \"Bits\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Bits\"\n                    }\n                },\n                \"Kilobits\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Kilobits\"\n                    }\n                },\n                \"Megabits\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Megabits\"\n                    }\n                },\n                \"Gigabits\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Gigabits\"\n                    }\n                },\n                \"Terabits\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Terabits\"\n                    }\n                },\n                \"Percent\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Percent\"\n                    }\n                },\n                \"Count\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Count\"\n                    }\n                },\n                \"BytesSecond\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Bytes/Second\"\n                    }\n                },\n                \"KilobytesSecond\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Kilobytes/Second\"\n                    }\n                },\n                \"MegabytesSecond\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Megabytes/Second\"\n                    }\n                },\n                \"GigabytesSecond\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Gigabytes/Second\"\n                    }\n                },\n                \"TerabytesSecond\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Terabytes/Second\"\n                    }\n                },\n                \"BitsSecond\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Bits/Second\"\n                    }\n                },\n                \"KilobitsSecond\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Kilobits/Second\"\n                    }\n                },\n                \"MegabitsSecond\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Megabits/Second\"\n                    }\n                },\n                \"GigabitsSecond\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Gigabits/Second\"\n                    }\n                },\n                \"TerabitsSecond\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Terabits/Second\"\n                    }\n                },\n                \"CountSecond\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Count/Second\"\n                    }\n                },\n                \"None\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"None\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#StartFromHead\": {\n            \"type\": \"boolean\"\n        },\n        \"com.amazonaws.cloudwatchlogs#StartLiveTail\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#StartLiveTailRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#StartLiveTailResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#AccessDeniedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InvalidOperationException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ResourceNotFoundException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Starts a Live Tail streaming session for one or more log groups. A Live Tail session\\n      returns a stream of log events that have been recently ingested in the log groups. For more\\n      information, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CloudWatchLogs_LiveTail.html\\\">Use Live Tail to view logs\\n        in near real time</a>. </p>\\n         <p>The response to this operation is a response stream, over which the server sends live log\\n      events and the client receives them.</p>\\n         <p>The following objects are sent over the stream:</p>\\n         <ul>\\n            <li>\\n               <p>A single <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_LiveTailSessionStart.html\\\">LiveTailSessionStart</a> object is sent at the start of the session.</p>\\n            </li>\\n            <li>\\n               <p>Every second, a <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_LiveTailSessionUpdate.html\\\">LiveTailSessionUpdate</a> object is sent. Each of these objects contains an array\\n          of the actual log events.</p>\\n               <p>If no new log events were ingested in the past second, the\\n            <code>LiveTailSessionUpdate</code> object will contain an empty array.</p>\\n               <p>The array of log events contained in a <code>LiveTailSessionUpdate</code> can include\\n          as many as 500 log events. If the number of log events matching the request exceeds 500\\n          per second, the log events are sampled down to 500 log events to be included in each\\n            <code>LiveTailSessionUpdate</code> object.</p>\\n               <p>If your client consumes the log events slower than the server produces them, CloudWatch Logs buffers up to 10 <code>LiveTailSessionUpdate</code> events or 5000 log\\n          events, after which it starts dropping the oldest events.</p>\\n            </li>\\n            <li>\\n               <p>A <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_StartLiveTailResponseStream.html#CWL-Type-StartLiveTailResponseStream-SessionStreamingException\\\">SessionStreamingException</a> object is returned if an unknown error occurs on the\\n          server side.</p>\\n            </li>\\n            <li>\\n               <p>A <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_StartLiveTailResponseStream.html#CWL-Type-StartLiveTailResponseStream-SessionTimeoutException\\\">SessionTimeoutException</a> object is returned when the session times out, after it\\n          has been kept open for three hours.</p>\\n            </li>\\n         </ul>\\n         <note>\\n            <p>The <code>StartLiveTail</code> API routes requests to\\n            <code>streaming-logs.<i>Region</i>.amazonaws.com</code> using SDK host\\n        prefix injection. VPC endpoint support is not available for this API.</p>\\n         </note>\\n         <important>\\n            <p>You can end a session before it times out by closing the session stream or by closing\\n        the client that is receiving the stream. The session also ends if the established connection\\n        between the client and the server breaks.</p>\\n         </important>\\n         <p>For examples of using an SDK to start a Live Tail session, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/example_cloudwatch-logs_StartLiveTail_section.html\\\"> Start\\n        a Live Tail session using an Amazon Web Services SDK</a>.</p>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"streaming-\"\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#StartLiveTailLogGroupIdentifiers\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#LogGroupIdentifier\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 10\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#StartLiveTailRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"logGroupIdentifiers\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#StartLiveTailLogGroupIdentifiers\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An array where each item in the array is a log group to include in the Live Tail\\n      session.</p>\\n         <p>Specify each log group by its ARN. </p>\\n         <p>If you specify an ARN, the ARN can't end with an asterisk (*).</p>\\n         <note>\\n            <p> You can include up to 10 log groups.</p>\\n         </note>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"logStreamNames\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InputLogStreamNames\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If you specify this parameter, then only log events in the log streams that you specify\\n      here are included in the Live Tail session.</p>\\n         <p>If you specify this field, you can't also specify the <code>logStreamNamePrefixes</code>\\n      field.</p>\\n         <note>\\n            <p>You can specify this parameter only if you specify only one log group in\\n          <code>logGroupIdentifiers</code>.</p>\\n         </note>\"\n                    }\n                },\n                \"logStreamNamePrefixes\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InputLogStreamNames\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If you specify this parameter, then only log events in the log streams that have names\\n      that start with the prefixes that you specify here are included in the Live Tail\\n      session.</p>\\n         <p>If you specify this field, you can't also specify the <code>logStreamNames</code>\\n      field.</p>\\n         <note>\\n            <p>You can specify this parameter only if you specify only one log group in\\n          <code>logGroupIdentifiers</code>.</p>\\n         </note>\"\n                    }\n                },\n                \"logEventFilterPattern\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#FilterPattern\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An optional pattern to use to filter the results to include only log events that match the\\n      pattern. For example, a filter pattern of <code>error 404</code> causes only log events that\\n      include both <code>error</code> and <code>404</code> to be included in the Live Tail\\n      stream.</p>\\n         <p>Regular expression filter patterns are supported.</p>\\n         <p>For more information about filter pattern syntax, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/FilterAndPatternSyntax.html\\\">Filter and Pattern\\n        Syntax</a>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#StartLiveTailResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"responseStream\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#StartLiveTailResponseStream\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An object that includes the stream returned by your request. It can include both log\\n      events and exceptions.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#StartLiveTailResponseStream\": {\n            \"type\": \"union\",\n            \"members\": {\n                \"sessionStart\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LiveTailSessionStart\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>This object contains information about this Live Tail session, including the log groups\\n      included and the log stream filters, if any.</p>\"\n                    }\n                },\n                \"sessionUpdate\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LiveTailSessionUpdate\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>This object contains the log events and session metadata.</p>\"\n                    }\n                },\n                \"SessionTimeoutException\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#SessionTimeoutException\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>This exception is returned in the stream when the Live Tail session times out. Live Tail\\n      sessions time out after three hours.</p>\"\n                    }\n                },\n                \"SessionStreamingException\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#SessionStreamingException\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>This exception is returned if an unknown error occurs.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This object includes the stream returned by your <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_StartLiveTail.html\\\">StartLiveTail</a>\\n      request.</p>\",\n                \"smithy.api#streaming\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#StartQuery\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#StartQueryRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#StartQueryResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#MalformedQueryException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Starts a query of one or more log groups using CloudWatch Logs Insights. You specify\\n      the log groups and time range to query and the query string to use.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CWL_QuerySyntax.html\\\">CloudWatch Logs Insights Query\\n        Syntax</a>.</p>\\n         <p>After you run a query using <code>StartQuery</code>, the query results are stored by\\n        CloudWatch Logs. You can use <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_GetQueryResults.html\\\">GetQueryResults</a> to retrieve the results of a query, using the <code>queryId</code>\\n      that <code>StartQuery</code> returns. </p>\\n         <note>\\n            <p>To specify the log groups to query, a <code>StartQuery</code> operation must include one\\n        of the following:</p>\\n            <ul>\\n               <li>\\n                  <p>Either exactly one of the following parameters: <code>logGroupName</code>,\\n              <code>logGroupNames</code>, or <code>logGroupIdentifiers</code>\\n                  </p>\\n               </li>\\n               <li>\\n                  <p>Or the <code>queryString</code> must include a <code>SOURCE</code> command to select\\n            log groups for the query. The <code>SOURCE</code> command can select log groups based on\\n            log group name prefix, account ID, and log class.\\n            </p>\\n                  <p>For more information about the <code>SOURCE</code> command, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CWL_QuerySyntax-Source.html\\\">SOURCE</a>.</p>\\n               </li>\\n            </ul>\\n         </note>\\n         <p>If you have associated a KMS key with the query results in this\\n      account, then <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_StartQuery.html\\\">StartQuery</a> uses\\n      that key to encrypt the results when it stores them. If no key is associated with query\\n      results, the query results are encrypted with the default CloudWatch Logs encryption\\n      method.</p>\\n         <p>Queries time out after 60 minutes of runtime. If your queries are timing out, reduce the\\n      time range being searched or partition your query into a number of queries.</p>\\n         <p>If you are using CloudWatch cross-account observability, you can use this operation\\n      in a monitoring account to start a query in a linked source account. For more information, see\\n        <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-Unified-Cross-Account.html\\\">CloudWatch cross-account observability</a>. For a cross-account <code>StartQuery</code>\\n      operation, the query definition must be defined in the monitoring account.</p>\\n         <p>You can have up to 30 concurrent CloudWatch Logs insights queries, including queries\\n      that have been added to dashboards. </p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#StartQueryRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"queryLanguage\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#QueryLanguage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify the query language to use for this query. The options are Logs Insights QL,\\n      OpenSearch PPL, and OpenSearch SQL. For more information about the query languages that\\n        CloudWatch Logs supports, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CWL_AnalyzeLogData_Languages.html\\\">Supported query\\n        languages</a>.</p>\"\n                    }\n                },\n                \"logGroupName\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogGroupName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The log group on which to perform the query.</p>\\n         <note>\\n            <p>A <code>StartQuery</code> operation must include exactly one of the following\\n        parameters: <code>logGroupName</code>, <code>logGroupNames</code>, or\\n          <code>logGroupIdentifiers</code>. The exception is queries using the OpenSearch Service\\n        SQL query language, where you specify the log group names inside the\\n          <code>querystring</code> instead of here.</p>\\n         </note>\"\n                    }\n                },\n                \"logGroupNames\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogGroupNames\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The list of log groups to be queried. You can include up to 50 log groups.</p>\\n         <note>\\n            <p>A <code>StartQuery</code> operation must include exactly one of the following\\n        parameters: <code>logGroupName</code>, <code>logGroupNames</code>, or\\n          <code>logGroupIdentifiers</code>. The exception is queries using the OpenSearch Service\\n        SQL query language, where you specify the log group names inside the\\n          <code>querystring</code> instead of here.</p>\\n         </note>\"\n                    }\n                },\n                \"logGroupIdentifiers\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogGroupIdentifiers\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The list of log groups to query. You can include up to 50 log groups.</p>\\n         <p>You can specify them by the log group name or ARN. If a log group that you're querying is\\n      in a source account and you're using a monitoring account, you must specify the ARN of the log\\n      group here. The query definition must also be defined in the monitoring account.</p>\\n         <p>If you specify an ARN, use the format\\n        arn:aws:logs:<i>region</i>:<i>account-id</i>:log-group:<i>log_group_name</i>\\n      Don't include an * at the end.</p>\\n         <p>A <code>StartQuery</code> operation must include exactly one of the following parameters:\\n        <code>logGroupName</code>, <code>logGroupNames</code>, or <code>logGroupIdentifiers</code>.\\n      The exception is queries using the OpenSearch Service SQL query language, where you specify\\n      the log group names inside the <code>querystring</code> instead of here. </p>\"\n                    }\n                },\n                \"startTime\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The beginning of the time range to query. The range is inclusive, so the specified start\\n      time is included in the query. Specified as epoch time, the number of seconds since\\n        <code>January 1, 1970, 00:00:00 UTC</code>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"endTime\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The end of the time range to query. The range is inclusive, so the specified end time is\\n      included in the query. Specified as epoch time, the number of seconds since <code>January 1,\\n        1970, 00:00:00 UTC</code>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"queryString\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#QueryString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The query string to use. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CWL_QuerySyntax.html\\\">CloudWatch Logs Insights Query\\n        Syntax</a>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"limit\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#EventsLimit\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of log events to return in the query. If the query string uses the\\n        <code>fields</code> command, only the specified fields and their values are returned. The\\n      default is 10,000.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#StartQueryResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"queryId\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#QueryId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The unique ID of the query. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#State\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"Active\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Active\"\n                    }\n                },\n                \"Suppressed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Suppressed\"\n                    }\n                },\n                \"Baseline\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Baseline\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#StatsValue\": {\n            \"type\": \"double\",\n            \"traits\": {\n                \"smithy.api#default\": 0\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#StopQuery\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#StopQueryRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#StopQueryResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Stops a CloudWatch Logs Insights query that is in progress. If the query has already\\n      ended, the operation returns an error indicating that the specified query is not\\n      running.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#StopQueryRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"queryId\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#QueryId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID number of the query to stop. To find this ID number, use\\n        <code>DescribeQueries</code>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#StopQueryResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"success\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Success\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>This is true if the query was stopped by the <code>StopQuery</code> operation.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#StoredBytes\": {\n            \"type\": \"long\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 0\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#SubscriptionFilter\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"filterName\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#FilterName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the subscription filter.</p>\"\n                    }\n                },\n                \"logGroupName\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogGroupName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the log group.</p>\"\n                    }\n                },\n                \"filterPattern\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#FilterPattern\"\n                },\n                \"destinationArn\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DestinationArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the destination.</p>\"\n                    }\n                },\n                \"roleArn\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#RoleArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                },\n                \"distribution\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Distribution\"\n                },\n                \"applyOnTransformedLogs\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ApplyOnTransformedLogs\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>This parameter is valid only for log groups that have an active log transformer. For more\\n      information about log transformers, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutTransformer.html\\\">PutTransformer</a>.</p>\\n         <p>If this value is <code>true</code>, the subscription filter is applied on the transformed\\n      version of the log events instead of the original ingested log events.</p>\"\n                    }\n                },\n                \"creationTime\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The creation time of the subscription filter, expressed as the number of milliseconds\\n      after <code>Jan 1, 1970 00:00:00 UTC</code>.</p>\"\n                    }\n                },\n                \"fieldSelectionCriteria\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#FieldSelectionCriteria\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The filter expression that specifies which log events are processed by this subscription filter based on system fields. Returns the <code>fieldSelectionCriteria</code> value if it was specified when the subscription filter was created.</p>\"\n                    }\n                },\n                \"emitSystemFields\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#EmitSystemFields\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The list of system fields that are included in the log events sent to the subscription destination. Returns the <code>emitSystemFields</code> value if it was specified when the subscription filter was created.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents a subscription filter.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#SubscriptionFilters\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#SubscriptionFilter\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#SubstituteString\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"entries\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#SubstituteStringEntries\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An array of objects, where each object contains the information about one key to match and\\n      replace. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This processor matches a key’s value against a regular expression and replaces all matches\\n      with a replacement string.</p>\\n         <p>For more information about this processor including examples, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CloudWatch-Logs-Transformation.html#CloudWatch-Logs-Transformation-substituteString\\\"> substituteString</a> in the <i>CloudWatch Logs User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#SubstituteStringEntries\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#SubstituteStringEntry\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 10\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#SubstituteStringEntry\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"source\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Source\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The key to modify</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"from\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#FromKey\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The regular expression string to be replaced. Special regex characters such as [ and ]\\n      must be escaped using \\\\\\\\ when using double quotes and with \\\\ when using single quotes. For\\n      more information, see <a href=\\\"https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/regex/Pattern.html\\\"> Class Pattern</a> on the Oracle web site.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"to\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ToKey\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The string to be substituted for each match of <code>from</code>\\n         </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This object defines one log field key that will be replaced using the <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CloudWatch-Logs-Transformation.html#CloudWatch-Logs-Transformation-substituteString\\\"> substituteString</a> processor.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#Success\": {\n            \"type\": \"boolean\",\n            \"traits\": {\n                \"smithy.api#default\": false\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#SuppressionPeriod\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"value\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Integer\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>Specifies the number of seconds, minutes or hours to suppress this anomaly. There is no\\n      maximum.</p>\"\n                    }\n                },\n                \"suppressionUnit\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#SuppressionUnit\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies whether the value of <code>value</code> is in seconds, minutes, or hours.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>If you are suppressing an anomaly temporariliy, this structure defines how long the\\n      suppression period is to be.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#SuppressionState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"SUPPRESSED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"SUPPRESSED\"\n                    }\n                },\n                \"UNSUPPRESSED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"UNSUPPRESSED\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#SuppressionType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"LIMITED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"LIMITED\"\n                    }\n                },\n                \"INFINITE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"INFINITE\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#SuppressionUnit\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"SECONDS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"SECONDS\"\n                    }\n                },\n                \"MINUTES\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"MINUTES\"\n                    }\n                },\n                \"HOURS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"HOURS\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#SystemField\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.cloudwatchlogs#TagKey\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 128\n                },\n                \"smithy.api#pattern\": \"^([\\\\p{L}\\\\p{Z}\\\\p{N}_.:/=+\\\\-@]+)$\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#TagKeyList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#TagKey\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 50\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#TagList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#TagKey\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#TagLogGroup\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#TagLogGroupRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ResourceNotFoundException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#deprecated\": {\n                    \"message\": \"Please use the generic tagging API TagResource\"\n                },\n                \"smithy.api#documentation\": \"<important>\\n            <p>The TagLogGroup operation is on the path to deprecation. We recommend that you use\\n          <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_TagResource.html\\\">TagResource</a>\\n        instead.</p>\\n         </important>\\n         <p>Adds or updates the specified tags for the specified log group.</p>\\n         <p>To list the tags for a log group, use <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_ListTagsForResource.html\\\">ListTagsForResource</a>. To remove tags, use <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_UntagResource.html\\\">UntagResource</a>.</p>\\n         <p>For more information about tags, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/Working-with-log-groups-and-streams.html#log-group-tagging\\\">Tag Log Groups in Amazon CloudWatch Logs</a> in the <i>Amazon CloudWatch Logs\\n        User Guide</i>.</p>\\n         <p>CloudWatch Logs doesn't support IAM policies that prevent users from assigning specified\\n      tags to log groups using the <code>aws:Resource/<i>key-name</i>\\n            </code> or\\n        <code>aws:TagKeys</code> condition keys. For more information about using tags to control\\n      access, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_tags.html\\\">Controlling access to Amazon Web Services resources using tags</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#TagLogGroupRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"logGroupName\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogGroupName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the log group.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"tags\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Tags\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The key-value pairs to use for the tags.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#deprecated\": {\n                    \"message\": \"Please use the generic tagging API model TagResourceRequest\"\n                },\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#TagResource\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#TagResourceRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#TooManyTagsException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Assigns one or more tags (key-value pairs) to the specified CloudWatch Logs resource.\\n      Currently, the only CloudWatch Logs resources that can be tagged are log groups and\\n      destinations. </p>\\n         <p>Tags can help you organize and categorize your resources. You can also use them to scope\\n      user permissions by granting a user permission to access or change only resources with certain\\n      tag values.</p>\\n         <p>Tags don't have any semantic meaning to Amazon Web Services and are interpreted strictly as\\n      strings of characters.</p>\\n         <p>You can use the <code>TagResource</code> action with a resource that already has tags. If\\n      you specify a new tag key for the alarm, this tag is appended to the list of tags associated\\n      with the alarm. If you specify a tag key that is already associated with the alarm, the new\\n      tag value that you specify replaces the previous value for that tag.</p>\\n         <p>You can associate as many as 50 tags with a CloudWatch Logs resource.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#TagResourceRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"resourceArn\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#AmazonResourceName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the resource that you're adding tags to.</p>\\n         <p>The ARN format of a log group is\\n          <code>arn:aws:logs:<i>Region</i>:<i>account-id</i>:log-group:<i>log-group-name</i>\\n            </code>\\n         </p>\\n         <p>The ARN format of a destination is\\n          <code>arn:aws:logs:<i>Region</i>:<i>account-id</i>:destination:<i>destination-name</i>\\n            </code>\\n         </p>\\n         <p>For more information about ARN format, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/iam-access-control-overview-cwl.html\\\">CloudWatch Logs\\n        resources and operations</a>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"tags\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Tags\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The list of key-value pairs to associate with the resource.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#TagValue\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 256\n                },\n                \"smithy.api#pattern\": \"^([\\\\p{L}\\\\p{Z}\\\\p{N}_.:/=+\\\\-@]*)$\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#Tags\": {\n            \"type\": \"map\",\n            \"key\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#TagKey\"\n            },\n            \"value\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#TagValue\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 50\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#Target\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 128\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#TargetArn\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#TargetFormat\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 64\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#TargetTimezone\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#TestEventMessages\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#EventMessage\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 50\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#TestMetricFilter\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#TestMetricFilterRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#TestMetricFilterResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Tests the filter pattern of a metric filter against a sample of log event messages. You\\n      can use this operation to validate the correctness of a metric filter pattern.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#TestMetricFilterRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"filterPattern\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#FilterPattern\",\n                    \"traits\": {\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"logEventMessages\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#TestEventMessages\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The log event messages to test.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#TestMetricFilterResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"matches\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#MetricFilterMatches\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The matched events.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#TestTransformer\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#TestTransformerRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#TestTransformerResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InvalidOperationException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Use this operation to test a log transformer. You enter the transformer configuration and\\n      a set of log events to test with. The operation responds with an array that includes the\\n      original log events and the transformed versions.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#TestTransformerRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"transformerConfig\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Processors\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>This structure contains the configuration of this log transformer that you want to test. A\\n      log transformer is an array of processors, where each processor applies one type of\\n      transformation to the log events that are ingested.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"logEventMessages\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#TestEventMessages\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An array of the raw log events that you want to use to test this transformer.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#TestTransformerResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"transformedLogs\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#TransformedLogs\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An array where each member of the array includes both the original version and the\\n      transformed version of one of the log events that you input.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#ThrottlingException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Message\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The request was throttled because of quota limits.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#Time\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#Timestamp\": {\n            \"type\": \"long\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 0\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#ToKey\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 128\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#Token\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.cloudwatchlogs#TokenString\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#TokenValue\": {\n            \"type\": \"long\",\n            \"traits\": {\n                \"smithy.api#default\": 0\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#TooManyTagsException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Message\"\n                },\n                \"resourceName\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#AmazonResourceName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the resource.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A resource can have no more than 50 tags.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#TransformedEventMessage\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#TransformedLogRecord\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"eventNumber\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#EventNumber\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The event number.</p>\"\n                    }\n                },\n                \"eventMessage\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#EventMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The original log event message before it was transformed.</p>\"\n                    }\n                },\n                \"transformedEventMessage\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#TransformedEventMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The log event message after being transformed.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This structure contains information for one log event that has been processed by a log\\n      transformer.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#TransformedLogs\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#TransformedLogRecord\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#TrimString\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"withKeys\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#TrimStringWithKeys\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The array containing the keys of the fields to trim.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Use this processor to remove leading and trailing whitespace.</p>\\n         <p>For more information about this processor including examples, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CloudWatch-Logs-Transformation.html#CloudWatch-Logs-Transformation-trimString\\\"> trimString</a> in the <i>CloudWatch Logs User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#TrimStringWithKeys\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#WithKey\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 10\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#Type\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"BOOLEAN\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"boolean\"\n                    }\n                },\n                \"INTEGER\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"integer\"\n                    }\n                },\n                \"DOUBLE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"double\"\n                    }\n                },\n                \"STRING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"string\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#TypeConverter\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"entries\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#TypeConverterEntries\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An array of <code>TypeConverterEntry</code> objects, where each object contains the\\n      information about one field to change the type of. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Use this processor to convert a value type associated with the specified key to the\\n      specified type. It's a casting processor that changes the types of the specified fields.\\n      Values can be converted into one of the following datatypes: <code>integer</code>,\\n        <code>double</code>, <code>string</code> and <code>boolean</code>. </p>\\n         <p>For more information about this processor including examples, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CloudWatch-Logs-Transformation.html#CloudWatch-Logs-Transformation-trimString\\\"> trimString</a> in the <i>CloudWatch Logs User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#TypeConverterEntries\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#TypeConverterEntry\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 5\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#TypeConverterEntry\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"key\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Key\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The key with the value that is to be converted to a different type.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"type\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Type\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type to convert the field value to. Valid values are <code>integer</code>,\\n        <code>double</code>, <code>string</code> and <code>boolean</code>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This object defines one value type that will be converted using the <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CloudWatch-Logs-Transformation.html#CloudWatch-Logs-Transformation-typeConverter\\\"> typeConverter</a> processor.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#Unmask\": {\n            \"type\": \"boolean\",\n            \"traits\": {\n                \"smithy.api#default\": false\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#UnrecognizedClientException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Message\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The most likely cause is an Amazon Web Services access key ID or secret key that's not\\n      valid.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#UntagLogGroup\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#UntagLogGroupRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ResourceNotFoundException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#deprecated\": {\n                    \"message\": \"Please use the generic tagging API UntagResource\"\n                },\n                \"smithy.api#documentation\": \"<important>\\n            <p>The UntagLogGroup operation is on the path to deprecation. We recommend that you use\\n          <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_UntagResource.html\\\">UntagResource</a> instead.</p>\\n         </important>\\n         <p>Removes the specified tags from the specified log group.</p>\\n         <p>To list the tags for a log group, use <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_ListTagsForResource.html\\\">ListTagsForResource</a>. To add tags, use <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_TagResource.html\\\">TagResource</a>.</p>\\n         <p>When using IAM policies to control tag management for CloudWatch Logs log groups, the\\n      condition keys <code>aws:Resource/key-name</code> and <code>aws:TagKeys</code> cannot be used\\n      to restrict which tags users can assign. </p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#UntagLogGroupRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"logGroupName\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#LogGroupName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the log group.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"tags\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#TagList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tag keys. The corresponding tags are removed from the log group.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#deprecated\": {\n                    \"message\": \"Please use the generic tagging API model UntagResourceRequest\"\n                },\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#UntagResource\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#UntagResourceRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Removes one or more tags from the specified resource.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#UntagResourceRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"resourceArn\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#AmazonResourceName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the CloudWatch Logs resource that you're removing tags from.</p>\\n         <p>The ARN format of a log group is\\n          <code>arn:aws:logs:<i>Region</i>:<i>account-id</i>:log-group:<i>log-group-name</i>\\n            </code>\\n         </p>\\n         <p>The ARN format of a destination is\\n          <code>arn:aws:logs:<i>Region</i>:<i>account-id</i>:destination:<i>destination-name</i>\\n            </code>\\n         </p>\\n         <p>For more information about ARN format, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/iam-access-control-overview-cwl.html\\\">CloudWatch Logs\\n        resources and operations</a>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"tagKeys\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#TagKeyList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The list of tag keys to remove from the resource.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#UpdateAnomaly\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#UpdateAnomalyRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#OperationAbortedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Use this operation to <i>suppress</i> anomaly detection for a specified\\n      anomaly or pattern. If you suppress an anomaly, CloudWatch Logs won't report new\\n      occurrences of that anomaly and won't update that anomaly with new data. If you suppress a\\n      pattern, CloudWatch Logs won't report any anomalies related to that pattern.</p>\\n         <p>You must specify either <code>anomalyId</code> or <code>patternId</code>, but you can't\\n      specify both parameters in the same operation.</p>\\n         <p>If you have previously used this operation to suppress detection of a pattern or anomaly,\\n      you can use it again to cause CloudWatch Logs to end the suppression. To do this, use this\\n      operation and specify the anomaly or pattern to stop suppressing, and omit the\\n        <code>suppressionType</code> and <code>suppressionPeriod</code> parameters.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#UpdateAnomalyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"anomalyId\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#AnomalyId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If you are suppressing or unsuppressing an anomaly, specify its unique ID here. You can\\n      find anomaly IDs by using the <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_ListAnomalies.html\\\">ListAnomalies</a>\\n      operation.</p>\"\n                    }\n                },\n                \"patternId\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#PatternId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If you are suppressing or unsuppressing an pattern, specify its unique ID here. You can\\n      find pattern IDs by using the <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_ListAnomalies.html\\\">ListAnomalies</a>\\n      operation.</p>\"\n                    }\n                },\n                \"anomalyDetectorArn\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#AnomalyDetectorArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the anomaly detector that this operation is to act on.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"suppressionType\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#SuppressionType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this to specify whether the suppression to be temporary or infinite. If you specify\\n        <code>LIMITED</code>, you must also specify a <code>suppressionPeriod</code>. If you specify\\n        <code>INFINITE</code>, any value for <code>suppressionPeriod</code> is ignored. </p>\"\n                    }\n                },\n                \"suppressionPeriod\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#SuppressionPeriod\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If you are temporarily suppressing an anomaly or pattern, use this structure to specify\\n      how long the suppression is to last.</p>\"\n                    }\n                },\n                \"baseline\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Baseline\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Set this to <code>true</code> to prevent CloudWatch Logs from displaying this behavior\\n      as an anomaly in the future. The behavior is then treated as baseline behavior. However, if\\n      similar but more severe occurrences of this behavior occur in the future, those will still be\\n      reported as anomalies. </p>\\n         <p>The default is <code>false</code>\\n         </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#UpdateDeliveryConfiguration\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#UpdateDeliveryConfigurationRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#UpdateDeliveryConfigurationResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#AccessDeniedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ConflictException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ThrottlingException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Use this operation to update the configuration of a <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_Delivery.html\\\">delivery</a> to change\\n      either the S3 path pattern or the format of the delivered logs. You can't use this operation\\n      to change the source or destination of the delivery.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#UpdateDeliveryConfigurationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"id\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#DeliveryId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the delivery to be updated by this request.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"recordFields\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#RecordFields\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The list of record fields to be delivered to the destination, in order. If the delivery's\\n      log source has mandatory fields, they must be included in this list.</p>\"\n                    }\n                },\n                \"fieldDelimiter\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#FieldDelimiter\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The field delimiter to use between record fields when the final output format of a\\n      delivery is in <code>Plain</code>, <code>W3C</code>, or <code>Raw</code> format.</p>\"\n                    }\n                },\n                \"s3DeliveryConfiguration\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#S3DeliveryConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>This structure contains parameters that are valid only when the delivery's delivery\\n      destination is an S3 bucket.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#UpdateDeliveryConfigurationResponse\": {\n            \"type\": \"structure\",\n            \"members\": {},\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#UpdateLogAnomalyDetector\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#UpdateLogAnomalyDetectorRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#OperationAbortedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Updates an existing log anomaly detector.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#UpdateLogAnomalyDetectorRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"anomalyDetectorArn\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#AnomalyDetectorArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the anomaly detector that you want to update.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"evaluationFrequency\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#EvaluationFrequency\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies how often the anomaly detector runs and look for anomalies. Set this value\\n      according to the frequency that the log group receives new logs. For example, if the log group\\n      receives new log events every 10 minutes, then setting <code>evaluationFrequency</code> to\\n        <code>FIFTEEN_MIN</code> might be appropriate.</p>\"\n                    }\n                },\n                \"filterPattern\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#FilterPattern\"\n                },\n                \"anomalyVisibilityTime\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#AnomalyVisibilityTime\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of days to use as the life cycle of anomalies. After this time, anomalies are\\n      automatically baselined and the anomaly detector model will treat new occurrences of similar\\n      event as normal. Therefore, if you do not correct the cause of an anomaly during this time, it\\n      will be considered normal going forward and will not be detected.</p>\"\n                    }\n                },\n                \"enabled\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter to pause or restart the anomaly detector. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#UpperCaseString\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"withKeys\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#UpperCaseStringWithKeys\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The array of containing the keys of the field to convert to uppercase.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This processor converts a string field to uppercase.</p>\\n         <p>For more information about this processor including examples, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CloudWatch-Logs-Transformation.html#CloudWatch-Logs-Transformation-upperCaseString\\\"> upperCaseString</a> in the <i>CloudWatch Logs User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#UpperCaseStringWithKeys\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.cloudwatchlogs#WithKey\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 10\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#ValidationException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.cloudwatchlogs#Message\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>One of the parameters for the request is not valid.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#Value\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.cloudwatchlogs#ValueKey\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 128\n                }\n            }\n        },\n        \"com.amazonaws.cloudwatchlogs#WithKey\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "aws/sdk/aws-models/codecatalyst.json",
    "content": "{\n    \"smithy\": \"2.0\",\n    \"shapes\": {\n        \"com.amazonaws.codecatalyst#AccessDeniedException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The request was denied because you don't have sufficient access to perform this action. Verify that you are a member of a role that allows this action.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 403\n            }\n        },\n        \"com.amazonaws.codecatalyst#AccessToken\": {\n            \"type\": \"resource\",\n            \"identifiers\": {\n                \"accessTokenId\": {\n                    \"target\": \"com.amazonaws.codecatalyst#AccessTokenId\"\n                }\n            },\n            \"create\": {\n                \"target\": \"com.amazonaws.codecatalyst#CreateAccessToken\"\n            },\n            \"delete\": {\n                \"target\": \"com.amazonaws.codecatalyst#DeleteAccessToken\"\n            },\n            \"list\": {\n                \"target\": \"com.amazonaws.codecatalyst#ListAccessTokens\"\n            }\n        },\n        \"com.amazonaws.codecatalyst#AccessTokenId\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 36\n                }\n            }\n        },\n        \"com.amazonaws.codecatalyst#AccessTokenName\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 100\n                }\n            }\n        },\n        \"com.amazonaws.codecatalyst#AccessTokenSecret\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 4000\n                },\n                \"smithy.api#sensitive\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#AccessTokenSummaries\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.codecatalyst#AccessTokenSummary\"\n            }\n        },\n        \"com.amazonaws.codecatalyst#AccessTokenSummary\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"id\": {\n                    \"target\": \"com.amazonaws.codecatalyst#AccessTokenId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The system-generated ID of the personal access token.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#resourceIdentifier\": \"accessTokenId\"\n                    }\n                },\n                \"name\": {\n                    \"target\": \"com.amazonaws.codecatalyst#AccessTokenName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The friendly name of the personal access token.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"expiresTime\": {\n                    \"target\": \"com.amazonaws.codecatalyst#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time when the personal access token will expire, in coordinated universal time (UTC) timestamp format as specified in <a href=\\\"https://www.rfc-editor.org/rfc/rfc3339#section-5.6\\\">RFC 3339</a>.</p>\",\n                        \"smithy.api#timestampFormat\": \"date-time\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about a specified personal access token (PAT).</p>\"\n            }\n        },\n        \"com.amazonaws.codecatalyst#ClientToken\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 1024\n                }\n            }\n        },\n        \"com.amazonaws.codecatalyst#CodeCatalyst\": {\n            \"type\": \"service\",\n            \"version\": \"2022-09-28\",\n            \"operations\": [\n                {\n                    \"target\": \"com.amazonaws.codecatalyst#GetUserDetails\"\n                },\n                {\n                    \"target\": \"com.amazonaws.codecatalyst#VerifySession\"\n                }\n            ],\n            \"resources\": [\n                {\n                    \"target\": \"com.amazonaws.codecatalyst#AccessToken\"\n                },\n                {\n                    \"target\": \"com.amazonaws.codecatalyst#Space\"\n                }\n            ],\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.codecatalyst#AccessDeniedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.codecatalyst#ConflictException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.codecatalyst#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.codecatalyst#ServiceQuotaExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.codecatalyst#ThrottlingException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.codecatalyst#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#service\": {\n                    \"sdkId\": \"CodeCatalyst\",\n                    \"endpointPrefix\": \"codecatalyst\"\n                },\n                \"aws.protocols#restJson1\": {},\n                \"smithy.api#documentation\": \"<p>Welcome to the Amazon CodeCatalyst API reference. This reference provides descriptions of operations and data types for Amazon CodeCatalyst. You can use the Amazon CodeCatalyst \\n      API to work with the following objects. </p>\\n         <p>Spaces, by calling the following:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a>DeleteSpace</a>, which deletes a space.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>GetSpace</a>, which returns information about a space.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>GetSubscription</a>, which returns information about the Amazon Web Services account used for billing purposes \\n        and the billing plan for the space.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>ListSpaces</a>, which retrieves a list of spaces.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>UpdateSpace</a>, which changes one or more values for a space.</p>\\n            </li>\\n         </ul>\\n         <p>Projects, by calling the following:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a>CreateProject</a> which creates a project in a specified space.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>GetProject</a>, which returns information about a project.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>ListProjects</a>, which retrieves a list of projects in a space.</p>\\n            </li>\\n         </ul>\\n         <p>Users, by calling the following:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a>GetUserDetails</a>, which returns information about a user in Amazon CodeCatalyst.</p>\\n            </li>\\n         </ul>\\n         <p>Source repositories, by calling the following:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a>CreateSourceRepository</a>, which creates an empty Git-based source repository in a specified project.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>CreateSourceRepositoryBranch</a>, which creates a branch in a specified repository where you can work on code.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>DeleteSourceRepository</a>, which deletes a source repository.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>GetSourceRepository</a>, which returns information about a source repository.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>GetSourceRepositoryCloneUrls</a>, which returns information about the URLs that can be used with a Git client to clone a source\\n        repository.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>ListSourceRepositories</a>, which retrieves a list of source repositories in a project.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>ListSourceRepositoryBranches</a>, which retrieves a list of branches in a source repository.</p>\\n            </li>\\n         </ul>\\n         <p>Dev Environments and the Amazon Web Services Toolkits, by calling the following:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a>CreateDevEnvironment</a>, which creates a Dev Environment, \\n       where you can quickly work on the code stored in the source repositories of your project.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>DeleteDevEnvironment</a>, which deletes a Dev Environment.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>GetDevEnvironment</a>, which returns information about a Dev Environment.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>ListDevEnvironments</a>, which retrieves a list of Dev Environments in a project.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>ListDevEnvironmentSessions</a>, which retrieves a list of active Dev Environment sessions in a project.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>StartDevEnvironment</a>, which starts a specified Dev Environment and puts it into an active state.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>StartDevEnvironmentSession</a>, which starts a session to a specified Dev Environment.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>StopDevEnvironment</a>, which stops a specified Dev Environment and puts it into an stopped state.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>StopDevEnvironmentSession</a>, which stops a session for a specified Dev Environment.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>UpdateDevEnvironment</a>, which changes one or more values for a Dev Environment.</p>\\n            </li>\\n         </ul>\\n         <p>Workflows, by calling the following:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a>GetWorkflow</a>, which returns information about a workflow.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>GetWorkflowRun</a>, which returns information about a specified run of a workflow.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>ListWorkflowRuns</a>, which retrieves a list of runs of a specified workflow.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>ListWorkflows</a>, which retrieves a list of workflows in a specified project.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>StartWorkflowRun</a>, which starts a run of a specified workflow.</p>\\n            </li>\\n         </ul>\\n         <p>Security, activity, and resource management in Amazon CodeCatalyst, by calling the following:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a>CreateAccessToken</a>, which creates a personal access token (PAT) for the current user.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>DeleteAccessToken</a>, which deletes a specified personal access token (PAT).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>ListAccessTokens</a>, which lists all personal access tokens (PATs) associated with a user.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>ListEventLogs</a>, which retrieves a list of events that occurred during a specified time period in a space.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>VerifySession</a>, which verifies whether the calling user has a valid Amazon CodeCatalyst login and session.</p>\\n            </li>\\n         </ul>\\n         <note>\\n            <p>If you are using the Amazon CodeCatalyst APIs with an SDK or the CLI, you must configure your computer to work with Amazon CodeCatalyst and single sign-on (SSO).\\n        For more information, see <a href=\\\"https://docs.aws.amazon.com/codecatalyst/latest/userguide/set-up-cli.html\\\">Setting up to use the CLI with Amazon CodeCatalyst</a>\\n      and the SSO documentation for your SDK.</p>\\n         </note>\",\n                \"smithy.api#httpBearerAuth\": {},\n                \"smithy.api#title\": \"Amazon CodeCatalyst\",\n                \"smithy.rules#endpointRuleSet\": {\n                    \"version\": \"1.0\",\n                    \"parameters\": {\n                        \"UseFIPS\": {\n                            \"builtIn\": \"AWS::UseFIPS\",\n                            \"required\": true,\n                            \"default\": false,\n                            \"documentation\": \"When true, send this request to the FIPS-compliant regional endpoint. If the configured endpoint does not have a FIPS compliant endpoint, dispatching the request will return an error.\",\n                            \"type\": \"Boolean\"\n                        },\n                        \"Region\": {\n                            \"builtIn\": \"AWS::Region\",\n                            \"required\": false,\n                            \"documentation\": \"The AWS region used to dispatch the request.\",\n                            \"type\": \"String\"\n                        },\n                        \"Endpoint\": {\n                            \"builtIn\": \"SDK::Endpoint\",\n                            \"required\": false,\n                            \"documentation\": \"Override the endpoint used to send this request\",\n                            \"type\": \"String\"\n                        }\n                    },\n                    \"rules\": [\n                        {\n                            \"conditions\": [\n                                {\n                                    \"fn\": \"isSet\",\n                                    \"argv\": [\n                                        {\n                                            \"ref\": \"Endpoint\"\n                                        }\n                                    ]\n                                }\n                            ],\n                            \"endpoint\": {\n                                \"url\": {\n                                    \"ref\": \"Endpoint\"\n                                },\n                                \"properties\": {},\n                                \"headers\": {}\n                            },\n                            \"type\": \"endpoint\"\n                        },\n                        {\n                            \"conditions\": [\n                                {\n                                    \"fn\": \"not\",\n                                    \"argv\": [\n                                        {\n                                            \"fn\": \"isSet\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"Region\"\n                                                }\n                                            ]\n                                        }\n                                    ]\n                                },\n                                {\n                                    \"fn\": \"aws.partition\",\n                                    \"argv\": [\n                                        \"us-west-2\"\n                                    ],\n                                    \"assign\": \"PartitionResult\"\n                                }\n                            ],\n                            \"rules\": [\n                                {\n                                    \"conditions\": [\n                                        {\n                                            \"fn\": \"booleanEquals\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"UseFIPS\"\n                                                },\n                                                true\n                                            ]\n                                        }\n                                    ],\n                                    \"rules\": [\n                                        {\n                                            \"conditions\": [\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"fn\": \"getAttr\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"PartitionResult\"\n                                                                },\n                                                                \"supportsFIPS\"\n                                                            ]\n                                                        },\n                                                        false\n                                                    ]\n                                                }\n                                            ],\n                                            \"error\": \"Partition does not support FIPS.\",\n                                            \"type\": \"error\"\n                                        },\n                                        {\n                                            \"conditions\": [],\n                                            \"endpoint\": {\n                                                \"url\": \"https://codecatalyst-fips.global.{PartitionResult#dualStackDnsSuffix}\",\n                                                \"properties\": {},\n                                                \"headers\": {}\n                                            },\n                                            \"type\": \"endpoint\"\n                                        }\n                                    ],\n                                    \"type\": \"tree\"\n                                },\n                                {\n                                    \"conditions\": [],\n                                    \"endpoint\": {\n                                        \"url\": \"https://codecatalyst.global.{PartitionResult#dualStackDnsSuffix}\",\n                                        \"properties\": {},\n                                        \"headers\": {}\n                                    },\n                                    \"type\": \"endpoint\"\n                                }\n                            ],\n                            \"type\": \"tree\"\n                        },\n                        {\n                            \"conditions\": [\n                                {\n                                    \"fn\": \"isSet\",\n                                    \"argv\": [\n                                        {\n                                            \"ref\": \"Region\"\n                                        }\n                                    ]\n                                },\n                                {\n                                    \"fn\": \"aws.partition\",\n                                    \"argv\": [\n                                        {\n                                            \"ref\": \"Region\"\n                                        }\n                                    ],\n                                    \"assign\": \"PartitionResult\"\n                                }\n                            ],\n                            \"rules\": [\n                                {\n                                    \"conditions\": [\n                                        {\n                                            \"fn\": \"booleanEquals\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"UseFIPS\"\n                                                },\n                                                true\n                                            ]\n                                        }\n                                    ],\n                                    \"rules\": [\n                                        {\n                                            \"conditions\": [\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"fn\": \"getAttr\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"PartitionResult\"\n                                                                },\n                                                                \"supportsFIPS\"\n                                                            ]\n                                                        },\n                                                        false\n                                                    ]\n                                                }\n                                            ],\n                                            \"error\": \"Partition does not support FIPS.\",\n                                            \"type\": \"error\"\n                                        },\n                                        {\n                                            \"conditions\": [],\n                                            \"endpoint\": {\n                                                \"url\": \"https://codecatalyst-fips.global.{PartitionResult#dualStackDnsSuffix}\",\n                                                \"properties\": {},\n                                                \"headers\": {}\n                                            },\n                                            \"type\": \"endpoint\"\n                                        }\n                                    ],\n                                    \"type\": \"tree\"\n                                },\n                                {\n                                    \"conditions\": [],\n                                    \"endpoint\": {\n                                        \"url\": \"https://codecatalyst.global.{PartitionResult#dualStackDnsSuffix}\",\n                                        \"properties\": {},\n                                        \"headers\": {}\n                                    },\n                                    \"type\": \"endpoint\"\n                                }\n                            ],\n                            \"type\": \"tree\"\n                        }\n                    ]\n                },\n                \"smithy.rules#endpointTests\": {\n                    \"version\": \"1\",\n                    \"testCases\": [\n                        {\n                            \"documentation\": \"Override endpoint\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://test.codecatalyst.global.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Endpoint\": \"https://test.codecatalyst.global.api.aws\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"Default endpoint (region not set)\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://codecatalyst.global.api.aws\"\n                                }\n                            },\n                            \"params\": {}\n                        },\n                        {\n                            \"documentation\": \"Default FIPS endpoint (region not set)\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://codecatalyst-fips.global.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"Default endpoint (region: aws-global)\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://codecatalyst.global.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"aws-global\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"Default FIPS endpoint (region: aws-global)\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://codecatalyst-fips.global.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"aws-global\",\n                                \"UseFIPS\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"Default endpoint for a valid home region (region: us-west-2)\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://codecatalyst.global.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-west-2\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"Default FIPS endpoint for a valid home region (region: us-west-2)\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://codecatalyst-fips.global.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-west-2\",\n                                \"UseFIPS\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"Default endpoint for an unavailable home region (region: us-east-1)\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://codecatalyst.global.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"Default FIPS endpoint for an unavailable home region (region: us-east-1)\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://codecatalyst-fips.global.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": true\n                            }\n                        }\n                    ]\n                }\n            }\n        },\n        \"com.amazonaws.codecatalyst#ComparisonOperator\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#enum\": [\n                    {\n                        \"name\": \"EQUALS\",\n                        \"value\": \"EQ\"\n                    },\n                    {\n                        \"name\": \"GREATER_THAN\",\n                        \"value\": \"GT\"\n                    },\n                    {\n                        \"name\": \"GREATER_THAN_OR_EQUALS\",\n                        \"value\": \"GE\"\n                    },\n                    {\n                        \"name\": \"LESS_THAN\",\n                        \"value\": \"LT\"\n                    },\n                    {\n                        \"name\": \"LESS_THAN_OR_EQUALS\",\n                        \"value\": \"LE\"\n                    },\n                    {\n                        \"name\": \"BEGINS_WITH\",\n                        \"value\": \"BEGINS_WITH\"\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.codecatalyst#ConflictException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The request was denied because the requested operation would cause a conflict with the current state of a service resource associated with the request. \\n       Another user might have updated the resource. Reload, make sure you have the latest data, and then try again.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 409\n            }\n        },\n        \"com.amazonaws.codecatalyst#CreateAccessToken\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.codecatalyst#CreateAccessTokenRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.codecatalyst#CreateAccessTokenResponse\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates a personal access token (PAT) for the current user. A personal access token (PAT) is similar to a password. \\n      It is associated with your user identity for use across all spaces and projects in Amazon CodeCatalyst. You use PATs to access CodeCatalyst \\n      from resources that include integrated development environments (IDEs) and Git-based source repositories.  \\n      PATs represent you in Amazon CodeCatalyst and you can manage them in your user settings.For more information, see \\n      <a href=\\\"https://docs.aws.amazon.com/codecatalyst/latest/userguide/ipa-tokens-keys.html\\\">Managing personal access tokens in Amazon CodeCatalyst</a>.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"PUT\",\n                    \"uri\": \"/v1/accessTokens\",\n                    \"code\": 201\n                }\n            }\n        },\n        \"com.amazonaws.codecatalyst#CreateAccessTokenRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"name\": {\n                    \"target\": \"com.amazonaws.codecatalyst#AccessTokenName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The friendly name of the personal access token.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"expiresTime\": {\n                    \"target\": \"com.amazonaws.codecatalyst#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time the personal access token expires, in coordinated universal time (UTC) timestamp format as specified in <a href=\\\"https://www.rfc-editor.org/rfc/rfc3339#section-5.6\\\">RFC 3339</a>.</p>\",\n                        \"smithy.api#timestampFormat\": \"date-time\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#CreateAccessTokenResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"secret\": {\n                    \"target\": \"com.amazonaws.codecatalyst#AccessTokenSecret\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The secret value of the personal access token.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"name\": {\n                    \"target\": \"com.amazonaws.codecatalyst#AccessTokenName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The friendly name of the personal access token.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"expiresTime\": {\n                    \"target\": \"com.amazonaws.codecatalyst#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time the personal access token expires, in coordinated universal time (UTC) timestamp format as specified in <a href=\\\"https://www.rfc-editor.org/rfc/rfc3339#section-5.6\\\">RFC 3339</a>. If not specified, the default is one year from creation.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#timestampFormat\": \"date-time\"\n                    }\n                },\n                \"accessTokenId\": {\n                    \"target\": \"com.amazonaws.codecatalyst#AccessTokenId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The system-generated unique ID of the access token.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#CreateDevEnvironment\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.codecatalyst#CreateDevEnvironmentRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.codecatalyst#CreateDevEnvironmentResponse\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates a Dev Environment in Amazon CodeCatalyst, a cloud-based development environment that you can use to quickly work on the code stored \\n      in the source repositories of your project.       </p>\\n         <note>\\n            <p>When created in the Amazon CodeCatalyst console, by default a Dev Environment is configured to have a 2 core processor, 4GB of RAM, and 16GB of persistent storage. None of these\\n      defaults apply to a Dev Environment created programmatically.</p>\\n         </note>\",\n                \"smithy.api#http\": {\n                    \"method\": \"PUT\",\n                    \"uri\": \"/v1/spaces/{spaceName}/projects/{projectName}/devEnvironments\",\n                    \"code\": 201\n                },\n                \"smithy.api#idempotent\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#CreateDevEnvironmentRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"spaceName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the space.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"projectName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the project in the space.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"repositories\": {\n                    \"target\": \"com.amazonaws.codecatalyst#RepositoriesInput\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The source repository that contains the branch to clone into the Dev Environment. </p>\"\n                    }\n                },\n                \"clientToken\": {\n                    \"target\": \"com.amazonaws.codecatalyst#ClientToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A user-specified idempotency token.  Idempotency ensures that an API request completes only once. \\n       With an idempotent request, if the original request completes successfully, the subsequent retries return the result from the original successful request and have no additional effect.</p>\"\n                    }\n                },\n                \"alias\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The user-defined alias for a Dev Environment.</p>\",\n                        \"smithy.api#length\": {\n                            \"min\": 1,\n                            \"max\": 128\n                        },\n                        \"smithy.api#pattern\": \"^[a-zA-Z0-9]+(?:[-_\\\\.][a-zA-Z0-9]+)*$\"\n                    }\n                },\n                \"ides\": {\n                    \"target\": \"com.amazonaws.codecatalyst#IdeConfigurationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Information about the integrated development environment (IDE) configured for a\\n      Dev Environment.</p>\\n         <note>\\n            <p>An IDE is required to create a Dev Environment. For Dev Environment creation, this field\\n        contains configuration information and must be provided. </p>\\n         </note>\"\n                    }\n                },\n                \"instanceType\": {\n                    \"target\": \"com.amazonaws.codecatalyst#InstanceType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon EC2 instace type to use for the Dev Environment. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"inactivityTimeoutMinutes\": {\n                    \"target\": \"com.amazonaws.codecatalyst#InactivityTimeoutMinutes\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The amount of time the Dev Environment will run without any activity detected before stopping, in minutes. Only whole integers are allowed. Dev Environments consume compute minutes when running.</p>\"\n                    }\n                },\n                \"persistentStorage\": {\n                    \"target\": \"com.amazonaws.codecatalyst#PersistentStorageConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Information about the amount of storage allocated to the Dev Environment. </p>\\n         <note>\\n            <p>By default, a Dev Environment is configured to have 16GB of persistent storage when created from the Amazon CodeCatalyst console, but there is no default when programmatically\\n        creating a Dev Environment. \\n        Valid values for persistent storage are based on memory sizes in 16GB increments. Valid\\n        values are 16, 32, and 64.</p>\\n         </note>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"vpcConnectionName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the connection that will be used to connect to Amazon VPC, if any.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#CreateDevEnvironmentResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"spaceName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the space.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"projectName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the project in the space.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"id\": {\n                    \"target\": \"com.amazonaws.codecatalyst#Uuid\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The system-generated unique ID of the Dev Environment. </p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#resourceIdentifier\": \"devEnvironmentId\"\n                    }\n                },\n                \"vpcConnectionName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the connection used to connect to Amazon VPC used when the Dev Environment was created, if any.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#CreateProject\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.codecatalyst#CreateProjectRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.codecatalyst#CreateProjectResponse\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates a project in a specified space.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"PUT\",\n                    \"uri\": \"/v1/spaces/{spaceName}/projects\",\n                    \"code\": 201\n                },\n                \"smithy.api#idempotent\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#CreateProjectRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"spaceName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the space.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"displayName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#ProjectDisplayName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The friendly name of the project that will be displayed to users.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"description\": {\n                    \"target\": \"com.amazonaws.codecatalyst#ProjectDescription\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The description of the project. This description will be displayed to all users of the project. We recommend providing a brief description of the project and its intended purpose.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#CreateProjectResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"spaceName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the space.</p>\"\n                    }\n                },\n                \"name\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the project in the space.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#resourceIdentifier\": \"projectName\"\n                    }\n                },\n                \"displayName\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The friendly name of the project.</p>\"\n                    }\n                },\n                \"description\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The description of the project.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#CreateSourceRepository\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.codecatalyst#CreateSourceRepositoryRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.codecatalyst#CreateSourceRepositoryResponse\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates an empty Git-based source repository in a specified project. The repository is\\n      created with an initial empty commit with a default branch named <code>main</code>.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"PUT\",\n                    \"uri\": \"/v1/spaces/{spaceName}/projects/{projectName}/sourceRepositories/{name}\",\n                    \"code\": 201\n                },\n                \"smithy.api#idempotent\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#CreateSourceRepositoryBranch\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.codecatalyst#CreateSourceRepositoryBranchRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.codecatalyst#CreateSourceRepositoryBranchResponse\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates a branch in a specified source repository in Amazon CodeCatalyst. </p>\\n         <note>\\n            <p>This API only creates a branch in a source repository hosted in Amazon CodeCatalyst. You cannot use this API to create a branch in a linked repository.</p>\\n         </note>\",\n                \"smithy.api#http\": {\n                    \"method\": \"PUT\",\n                    \"uri\": \"/v1/spaces/{spaceName}/projects/{projectName}/sourceRepositories/{sourceRepositoryName}/branches/{name}\",\n                    \"code\": 201\n                },\n                \"smithy.api#idempotent\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#CreateSourceRepositoryBranchRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"spaceName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the space.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"projectName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the project in the space.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"sourceRepositoryName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#SourceRepositoryNameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the repository where you want to create a branch.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"name\": {\n                    \"target\": \"com.amazonaws.codecatalyst#SourceRepositoryBranchString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name for the branch you're creating.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {},\n                        \"smithy.api#resourceIdentifier\": \"sourceRepositoryBranchName\"\n                    }\n                },\n                \"headCommitId\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The commit ID in an existing branch from which you want to create the new branch.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#CreateSourceRepositoryBranchResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ref\": {\n                    \"target\": \"com.amazonaws.codecatalyst#SourceRepositoryBranchRefString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Git reference name of the branch.</p>\"\n                    }\n                },\n                \"name\": {\n                    \"target\": \"com.amazonaws.codecatalyst#SourceRepositoryBranchString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the newly created branch.</p>\"\n                    }\n                },\n                \"lastUpdatedTime\": {\n                    \"target\": \"com.amazonaws.codecatalyst#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time the branch was last updated, in coordinated universal time (UTC) timestamp format as specified in <a href=\\\"https://www.rfc-editor.org/rfc/rfc3339#section-5.6\\\">RFC 3339</a>.</p>\",\n                        \"smithy.api#timestampFormat\": \"date-time\"\n                    }\n                },\n                \"headCommitId\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The commit ID of the tip of the newly created branch.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#CreateSourceRepositoryRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"spaceName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the space.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"projectName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the project in the space.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"name\": {\n                    \"target\": \"com.amazonaws.codecatalyst#SourceRepositoryNameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the source repository. For more information about name requirements, see <a href=\\\"https://docs.aws.amazon.com/codecatalyst/latest/userguide/source-quotas.html\\\">Quotas for source repositories</a>.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {},\n                        \"smithy.api#resourceIdentifier\": \"sourceRepositoryName\"\n                    }\n                },\n                \"description\": {\n                    \"target\": \"com.amazonaws.codecatalyst#SourceRepositoryDescriptionString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The description of the source repository.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#CreateSourceRepositoryResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"spaceName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the space.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"projectName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the project in the space.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"name\": {\n                    \"target\": \"com.amazonaws.codecatalyst#SourceRepositoryNameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the source repository.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"description\": {\n                    \"target\": \"com.amazonaws.codecatalyst#SourceRepositoryDescriptionString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The description of the source repository.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#DeleteAccessToken\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.codecatalyst#DeleteAccessTokenRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.codecatalyst#DeleteAccessTokenResponse\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes a specified personal access token (PAT). A personal access token can only be deleted by the user who created it.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"DELETE\",\n                    \"uri\": \"/v1/accessTokens/{id}\",\n                    \"code\": 200\n                },\n                \"smithy.api#idempotent\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#DeleteAccessTokenRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"id\": {\n                    \"target\": \"com.amazonaws.codecatalyst#AccessTokenId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the personal access token to delete. You can find the IDs of all PATs associated with your Amazon Web Services Builder ID in a space by calling <a>ListAccessTokens</a>.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {},\n                        \"smithy.api#resourceIdentifier\": \"accessTokenId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#DeleteAccessTokenResponse\": {\n            \"type\": \"structure\",\n            \"members\": {},\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#DeleteDevEnvironment\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.codecatalyst#DeleteDevEnvironmentRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.codecatalyst#DeleteDevEnvironmentResponse\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes a Dev Environment.  </p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"DELETE\",\n                    \"uri\": \"/v1/spaces/{spaceName}/projects/{projectName}/devEnvironments/{id}\",\n                    \"code\": 200\n                },\n                \"smithy.api#idempotent\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#DeleteDevEnvironmentRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"spaceName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the space.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"projectName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the project in the space.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"id\": {\n                    \"target\": \"com.amazonaws.codecatalyst#Uuid\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The system-generated unique ID of the Dev Environment you want to delete. To retrieve a list of Dev Environment IDs, use <a>ListDevEnvironments</a>.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {},\n                        \"smithy.api#resourceIdentifier\": \"devEnvironmentId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#DeleteDevEnvironmentResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"spaceName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the space.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"projectName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the project in the space.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"id\": {\n                    \"target\": \"com.amazonaws.codecatalyst#Uuid\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The system-generated unique ID of the deleted Dev Environment. </p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#resourceIdentifier\": \"devEnvironmentId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#DeleteProject\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.codecatalyst#DeleteProjectRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.codecatalyst#DeleteProjectResponse\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes a project in a space.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"DELETE\",\n                    \"uri\": \"/v1/spaces/{spaceName}/projects/{name}\",\n                    \"code\": 200\n                },\n                \"smithy.api#idempotent\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#DeleteProjectRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"spaceName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the space.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"name\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the project in the space. To retrieve a list of project names, use <a>ListProjects</a>.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {},\n                        \"smithy.api#resourceIdentifier\": \"projectName\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#DeleteProjectResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"spaceName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the space.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"name\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the project in the space.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#resourceIdentifier\": \"projectName\"\n                    }\n                },\n                \"displayName\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The friendly name displayed to users of the project in Amazon CodeCatalyst.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#DeleteSourceRepository\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.codecatalyst#DeleteSourceRepositoryRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.codecatalyst#DeleteSourceRepositoryResponse\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes a source repository in Amazon CodeCatalyst. You cannot use this API to delete a linked repository. It can only be used to delete a Amazon CodeCatalyst source repository.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"DELETE\",\n                    \"uri\": \"/v1/spaces/{spaceName}/projects/{projectName}/sourceRepositories/{name}\",\n                    \"code\": 200\n                },\n                \"smithy.api#idempotent\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#DeleteSourceRepositoryRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"spaceName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the space.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"projectName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the project in the space.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"name\": {\n                    \"target\": \"com.amazonaws.codecatalyst#SourceRepositoryNameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the source repository.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {},\n                        \"smithy.api#resourceIdentifier\": \"sourceRepositoryName\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#DeleteSourceRepositoryResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"spaceName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the space.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"projectName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the project in the space.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"name\": {\n                    \"target\": \"com.amazonaws.codecatalyst#SourceRepositoryNameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the repository.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#DeleteSpace\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.codecatalyst#DeleteSpaceRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.codecatalyst#DeleteSpaceResponse\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes a space.</p>\\n         <important>\\n            <p>Deleting a space cannot be undone. Additionally, since space names must be unique across Amazon CodeCatalyst, you cannot reuse names of deleted spaces.</p>\\n         </important>\",\n                \"smithy.api#http\": {\n                    \"method\": \"DELETE\",\n                    \"uri\": \"/v1/spaces/{name}\",\n                    \"code\": 200\n                },\n                \"smithy.api#idempotent\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#DeleteSpaceRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"name\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the space.  To retrieve a list of space names, use <a>ListSpaces</a>.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {},\n                        \"smithy.api#resourceIdentifier\": \"spaceName\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#DeleteSpaceResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"name\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the space.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#resourceIdentifier\": \"spaceName\"\n                    }\n                },\n                \"displayName\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The friendly name of the space displayed to users of the space in Amazon CodeCatalyst.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#DevEnvironment\": {\n            \"type\": \"resource\",\n            \"identifiers\": {\n                \"spaceName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\"\n                },\n                \"projectName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\"\n                },\n                \"devEnvironmentId\": {\n                    \"target\": \"com.amazonaws.codecatalyst#Uuid\"\n                }\n            },\n            \"create\": {\n                \"target\": \"com.amazonaws.codecatalyst#CreateDevEnvironment\"\n            },\n            \"read\": {\n                \"target\": \"com.amazonaws.codecatalyst#GetDevEnvironment\"\n            },\n            \"update\": {\n                \"target\": \"com.amazonaws.codecatalyst#UpdateDevEnvironment\"\n            },\n            \"delete\": {\n                \"target\": \"com.amazonaws.codecatalyst#DeleteDevEnvironment\"\n            },\n            \"operations\": [\n                {\n                    \"target\": \"com.amazonaws.codecatalyst#ListDevEnvironmentSessions\"\n                },\n                {\n                    \"target\": \"com.amazonaws.codecatalyst#StartDevEnvironment\"\n                },\n                {\n                    \"target\": \"com.amazonaws.codecatalyst#StartDevEnvironmentSession\"\n                },\n                {\n                    \"target\": \"com.amazonaws.codecatalyst#StopDevEnvironment\"\n                },\n                {\n                    \"target\": \"com.amazonaws.codecatalyst#StopDevEnvironmentSession\"\n                }\n            ]\n        },\n        \"com.amazonaws.codecatalyst#DevEnvironmentAccessDetails\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"streamUrl\": {\n                    \"target\": \"com.amazonaws.codecatalyst#SensitiveString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The URL used to send commands to and from the Dev Environment.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"tokenValue\": {\n                    \"target\": \"com.amazonaws.codecatalyst#SensitiveString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An encrypted token value that contains session and caller information used to authenticate the connection.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about connection details for a Dev Environment.</p>\",\n                \"smithy.api#sensitive\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#DevEnvironmentRepositorySummaries\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.codecatalyst#DevEnvironmentRepositorySummary\"\n            }\n        },\n        \"com.amazonaws.codecatalyst#DevEnvironmentRepositorySummary\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"repositoryName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#SourceRepositoryNameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the source repository.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"branchName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#SourceRepositoryBranchString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the branch in a source repository cloned into the Dev Environment. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about the source repsitory for a Dev Environment. </p>\"\n            }\n        },\n        \"com.amazonaws.codecatalyst#DevEnvironmentSessionConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"sessionType\": {\n                    \"target\": \"com.amazonaws.codecatalyst#DevEnvironmentSessionType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of the session.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"executeCommandSessionConfiguration\": {\n                    \"target\": \"com.amazonaws.codecatalyst#ExecuteCommandSessionConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Information about optional commands that will be run on the Dev Environment when the SSH session begins.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about the configuration of a Dev Environment session.</p>\"\n            }\n        },\n        \"com.amazonaws.codecatalyst#DevEnvironmentSessionSummary\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"spaceName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the space.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"projectName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the project in the space.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"devEnvironmentId\": {\n                    \"target\": \"com.amazonaws.codecatalyst#Uuid\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The system-generated unique ID of the Dev Environment.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#resourceIdentifier\": \"devEnvironmentId\"\n                    }\n                },\n                \"startedTime\": {\n                    \"target\": \"com.amazonaws.codecatalyst#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time the session started, in coordinated universal time (UTC) timestamp format as specified in <a href=\\\"https://www.rfc-editor.org/rfc/rfc3339#section-5.6\\\">RFC 3339</a>\\n         </p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#timestampFormat\": \"date-time\"\n                    }\n                },\n                \"id\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The system-generated unique ID of the Dev Environment session.</p>\",\n                        \"smithy.api#length\": {\n                            \"min\": 1,\n                            \"max\": 96\n                        },\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about active sessions for a Dev Environment.</p>\"\n            }\n        },\n        \"com.amazonaws.codecatalyst#DevEnvironmentSessionType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#enum\": [\n                    {\n                        \"name\": \"SSM\",\n                        \"value\": \"SSM\"\n                    },\n                    {\n                        \"name\": \"SSH\",\n                        \"value\": \"SSH\"\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.codecatalyst#DevEnvironmentSessionsSummaryList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.codecatalyst#DevEnvironmentSessionSummary\"\n            }\n        },\n        \"com.amazonaws.codecatalyst#DevEnvironmentStatus\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#enum\": [\n                    {\n                        \"name\": \"PENDING\",\n                        \"value\": \"PENDING\"\n                    },\n                    {\n                        \"name\": \"RUNNING\",\n                        \"value\": \"RUNNING\"\n                    },\n                    {\n                        \"name\": \"STARTING\",\n                        \"value\": \"STARTING\"\n                    },\n                    {\n                        \"name\": \"STOPPING\",\n                        \"value\": \"STOPPING\"\n                    },\n                    {\n                        \"name\": \"STOPPED\",\n                        \"value\": \"STOPPED\"\n                    },\n                    {\n                        \"name\": \"FAILED\",\n                        \"value\": \"FAILED\"\n                    },\n                    {\n                        \"name\": \"DELETING\",\n                        \"value\": \"DELETING\"\n                    },\n                    {\n                        \"name\": \"DELETED\",\n                        \"value\": \"DELETED\"\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.codecatalyst#DevEnvironmentSummary\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"spaceName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the space.</p>\"\n                    }\n                },\n                \"projectName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the project in the space.</p>\"\n                    }\n                },\n                \"id\": {\n                    \"target\": \"com.amazonaws.codecatalyst#Uuid\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The system-generated unique ID for the Dev Environment. </p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#resourceIdentifier\": \"devEnvironmentId\"\n                    }\n                },\n                \"lastUpdatedTime\": {\n                    \"target\": \"com.amazonaws.codecatalyst#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time when the Dev Environment was last updated, in coordinated universal time (UTC) timestamp format as specified in <a href=\\\"https://www.rfc-editor.org/rfc/rfc3339#section-5.6\\\">RFC 3339</a>.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#timestampFormat\": \"date-time\"\n                    }\n                },\n                \"creatorId\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The system-generated unique ID of the user who created the Dev Environment. </p>\",\n                        \"smithy.api#length\": {\n                            \"max\": 1024\n                        },\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"status\": {\n                    \"target\": \"com.amazonaws.codecatalyst#DevEnvironmentStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The status of the Dev Environment. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"statusReason\": {\n                    \"target\": \"com.amazonaws.codecatalyst#StatusReason\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The reason for the status.</p>\"\n                    }\n                },\n                \"repositories\": {\n                    \"target\": \"com.amazonaws.codecatalyst#DevEnvironmentRepositorySummaries\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Information about the repositories that will be cloned into the Dev Environment. If no rvalue is specified, no repository is cloned.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"alias\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The user-specified alias for the Dev Environment.</p>\",\n                        \"smithy.api#length\": {\n                            \"max\": 128\n                        }\n                    }\n                },\n                \"ides\": {\n                    \"target\": \"com.amazonaws.codecatalyst#Ides\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Information about the integrated development environment (IDE) configured for a Dev Environment.</p>\"\n                    }\n                },\n                \"instanceType\": {\n                    \"target\": \"com.amazonaws.codecatalyst#InstanceType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon EC2 instace type used for the Dev Environment. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"inactivityTimeoutMinutes\": {\n                    \"target\": \"com.amazonaws.codecatalyst#InactivityTimeoutMinutes\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The amount of time the Dev Environment will run without any activity detected before stopping, in minutes. Dev Environments consume compute minutes when running.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"persistentStorage\": {\n                    \"target\": \"com.amazonaws.codecatalyst#PersistentStorage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Information about the configuration of persistent storage for the Dev Environment.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"vpcConnectionName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the connection used to connect to Amazon VPC used when the Dev Environment was created, if any.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about a Dev Environment. </p>\"\n            }\n        },\n        \"com.amazonaws.codecatalyst#DevEnvironmentSummaryList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.codecatalyst#DevEnvironmentSummary\"\n            }\n        },\n        \"com.amazonaws.codecatalyst#EmailAddress\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"email\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The email address.</p>\"\n                    }\n                },\n                \"verified\": {\n                    \"target\": \"smithy.api#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Whether the email address has been verified.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about an email address.</p>\"\n            }\n        },\n        \"com.amazonaws.codecatalyst#EventLogEntries\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.codecatalyst#EventLogEntry\"\n            }\n        },\n        \"com.amazonaws.codecatalyst#EventLogEntry\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"id\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The system-generated unique ID of the event.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"eventName\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the event.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"eventType\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of the event.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"eventCategory\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The category for the event.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"eventSource\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The source of the event.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"eventTime\": {\n                    \"target\": \"com.amazonaws.codecatalyst#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time the event took place, in coordinated universal time (UTC) timestamp format as specified in <a href=\\\"https://www.rfc-editor.org/rfc/rfc3339#section-5.6\\\">RFC 3339</a>.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#timestampFormat\": \"date-time\"\n                    }\n                },\n                \"operationType\": {\n                    \"target\": \"com.amazonaws.codecatalyst#OperationType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of the event.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"userIdentity\": {\n                    \"target\": \"com.amazonaws.codecatalyst#UserIdentity\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The system-generated unique ID of the user whose actions are recorded in the event.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"projectInformation\": {\n                    \"target\": \"com.amazonaws.codecatalyst#ProjectInformation\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Information about the project where the event occurred.</p>\"\n                    }\n                },\n                \"requestId\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The system-generated unique ID of the request.</p>\"\n                    }\n                },\n                \"requestPayload\": {\n                    \"target\": \"com.amazonaws.codecatalyst#EventPayload\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Information about the payload of the request.</p>\"\n                    }\n                },\n                \"responsePayload\": {\n                    \"target\": \"com.amazonaws.codecatalyst#EventPayload\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Information about the payload of the response, if any.</p>\"\n                    }\n                },\n                \"errorCode\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The code of the error, if any.</p>\"\n                    }\n                },\n                \"sourceIpAddress\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IP address of the user whose actions are recorded in the event.</p>\"\n                    }\n                },\n                \"userAgent\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The user agent whose actions are recorded in the event.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about an entry in an event log of Amazon CodeCatalyst activity.</p>\"\n            }\n        },\n        \"com.amazonaws.codecatalyst#EventLogResource\": {\n            \"type\": \"resource\",\n            \"identifiers\": {\n                \"spaceName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\"\n                },\n                \"eventLogId\": {\n                    \"target\": \"smithy.api#String\"\n                }\n            },\n            \"list\": {\n                \"target\": \"com.amazonaws.codecatalyst#ListEventLogs\"\n            }\n        },\n        \"com.amazonaws.codecatalyst#EventPayload\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"contentType\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of content in the event payload.</p>\"\n                    }\n                },\n                \"data\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The data included in the event payload.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about the payload of an event recording Amazon CodeCatalyst activity.</p>\"\n            }\n        },\n        \"com.amazonaws.codecatalyst#ExecuteCommandSessionConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"command\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The command used at the beginning of the SSH session to a Dev Environment.</p>\",\n                        \"smithy.api#length\": {\n                            \"min\": 1,\n                            \"max\": 255\n                        },\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"arguments\": {\n                    \"target\": \"com.amazonaws.codecatalyst#ExecuteCommandSessionConfigurationArguments\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An array of arguments containing arguments and members.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about the commands that will be run on a Dev Environment when an SSH session begins.</p>\"\n            }\n        },\n        \"com.amazonaws.codecatalyst#ExecuteCommandSessionConfigurationArguments\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"smithy.api#String\",\n                \"traits\": {\n                    \"smithy.api#length\": {\n                        \"min\": 1,\n                        \"max\": 255\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.codecatalyst#Filter\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"key\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A key that can be used to sort results.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"values\": {\n                    \"target\": \"com.amazonaws.codecatalyst#StringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The values of the key.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"comparisonOperator\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The operator used to compare the fields.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about a filter used to limit results of a query.</p>\"\n            }\n        },\n        \"com.amazonaws.codecatalyst#FilterKey\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#enum\": [\n                    {\n                        \"name\": \"HAS_ACCESS_TO\",\n                        \"value\": \"hasAccessTo\"\n                    },\n                    {\n                        \"name\": \"NAME\",\n                        \"value\": \"name\"\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.codecatalyst#Filters\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.codecatalyst#Filter\"\n            }\n        },\n        \"com.amazonaws.codecatalyst#GetDevEnvironment\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.codecatalyst#GetDevEnvironmentRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.codecatalyst#GetDevEnvironmentResponse\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns information about a Dev Environment for a source repository in a project. Dev Environments are specific to the user who creates them.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/v1/spaces/{spaceName}/projects/{projectName}/devEnvironments/{id}\",\n                    \"code\": 200\n                },\n                \"smithy.api#readonly\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#GetDevEnvironmentRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"spaceName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the space.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"projectName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the project in the space.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"id\": {\n                    \"target\": \"com.amazonaws.codecatalyst#Uuid\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The system-generated unique ID of the Dev Environment for which you want to view information. To retrieve a list of Dev Environment IDs, use <a>ListDevEnvironments</a>.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {},\n                        \"smithy.api#resourceIdentifier\": \"devEnvironmentId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#GetDevEnvironmentResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"spaceName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the space.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"projectName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the project in the space.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"id\": {\n                    \"target\": \"com.amazonaws.codecatalyst#Uuid\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The system-generated unique ID of the Dev Environment. </p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#resourceIdentifier\": \"devEnvironmentId\"\n                    }\n                },\n                \"lastUpdatedTime\": {\n                    \"target\": \"com.amazonaws.codecatalyst#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time when the Dev Environment was last updated, in coordinated universal time (UTC) timestamp format as specified in <a href=\\\"https://www.rfc-editor.org/rfc/rfc3339#section-5.6\\\">RFC 3339</a>.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#timestampFormat\": \"date-time\"\n                    }\n                },\n                \"creatorId\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The system-generated unique ID of the user who created the Dev Environment. </p>\",\n                        \"smithy.api#length\": {\n                            \"max\": 1024\n                        },\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"status\": {\n                    \"target\": \"com.amazonaws.codecatalyst#DevEnvironmentStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The current status of the Dev Environment.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"statusReason\": {\n                    \"target\": \"com.amazonaws.codecatalyst#StatusReason\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The reason for the status.</p>\"\n                    }\n                },\n                \"repositories\": {\n                    \"target\": \"com.amazonaws.codecatalyst#DevEnvironmentRepositorySummaries\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The source repository that contains the branch cloned into the Dev Environment. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"alias\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The user-specified alias for the Dev Environment. </p>\",\n                        \"smithy.api#length\": {\n                            \"max\": 128\n                        }\n                    }\n                },\n                \"ides\": {\n                    \"target\": \"com.amazonaws.codecatalyst#Ides\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Information about the integrated development environment (IDE) configured for the Dev Environment. </p>\"\n                    }\n                },\n                \"instanceType\": {\n                    \"target\": \"com.amazonaws.codecatalyst#InstanceType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon EC2 instace type to use for the Dev Environment. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"inactivityTimeoutMinutes\": {\n                    \"target\": \"com.amazonaws.codecatalyst#InactivityTimeoutMinutes\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The amount of time the Dev Environment will run without any activity detected before stopping, in minutes.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"persistentStorage\": {\n                    \"target\": \"com.amazonaws.codecatalyst#PersistentStorage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Information about the amount of storage allocated to the Dev Environment.  By default, a Dev Environment is configured to have 16GB of persistent storage.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"vpcConnectionName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the connection used to connect to Amazon VPC used when the Dev Environment was created, if any.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#GetProject\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.codecatalyst#GetProjectRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.codecatalyst#GetProjectResponse\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns information about a project.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/v1/spaces/{spaceName}/projects/{name}\",\n                    \"code\": 200\n                },\n                \"smithy.api#readonly\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#GetProjectRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"spaceName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the space.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"name\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the project in the space.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {},\n                        \"smithy.api#resourceIdentifier\": \"projectName\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#GetProjectResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"spaceName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the space.</p>\"\n                    }\n                },\n                \"name\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the project in the space.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"displayName\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The friendly name of the project displayed to users in Amazon CodeCatalyst.</p>\"\n                    }\n                },\n                \"description\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The description of the project.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#GetSourceRepository\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.codecatalyst#GetSourceRepositoryRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.codecatalyst#GetSourceRepositoryResponse\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns information about a source repository.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/v1/spaces/{spaceName}/projects/{projectName}/sourceRepositories/{name}\",\n                    \"code\": 200\n                },\n                \"smithy.api#readonly\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#GetSourceRepositoryCloneUrls\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.codecatalyst#GetSourceRepositoryCloneUrlsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.codecatalyst#GetSourceRepositoryCloneUrlsResponse\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns information about the URLs that can be used with a Git client to clone a source\\n      repository.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/v1/spaces/{spaceName}/projects/{projectName}/sourceRepositories/{sourceRepositoryName}/cloneUrls\",\n                    \"code\": 200\n                },\n                \"smithy.api#readonly\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#GetSourceRepositoryCloneUrlsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"spaceName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the space.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"projectName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the project in the space.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"sourceRepositoryName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#SourceRepositoryNameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the source repository.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#GetSourceRepositoryCloneUrlsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"https\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The HTTPS URL to use when cloning the source repository.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#GetSourceRepositoryRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"spaceName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the space.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"projectName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the project in the space.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"name\": {\n                    \"target\": \"com.amazonaws.codecatalyst#SourceRepositoryNameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the source repository.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {},\n                        \"smithy.api#resourceIdentifier\": \"sourceRepositoryName\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#GetSourceRepositoryResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"spaceName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the space.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"projectName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the project in the space.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"name\": {\n                    \"target\": \"com.amazonaws.codecatalyst#SourceRepositoryNameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the source repository.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"description\": {\n                    \"target\": \"com.amazonaws.codecatalyst#SourceRepositoryDescriptionString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The description of the source repository.</p>\"\n                    }\n                },\n                \"lastUpdatedTime\": {\n                    \"target\": \"com.amazonaws.codecatalyst#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time the source repository was last updated, in coordinated universal time (UTC) timestamp format as specified in <a href=\\\"https://www.rfc-editor.org/rfc/rfc3339#section-5.6\\\">RFC 3339</a>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"createdTime\": {\n                    \"target\": \"com.amazonaws.codecatalyst#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time the source repository was created, in coordinated universal time (UTC) timestamp format as specified in <a href=\\\"https://www.rfc-editor.org/rfc/rfc3339#section-5.6\\\">RFC 3339</a>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#GetSpace\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.codecatalyst#GetSpaceRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.codecatalyst#GetSpaceResponse\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns information about an space.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/v1/spaces/{name}\",\n                    \"code\": 200\n                },\n                \"smithy.api#readonly\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#GetSpaceRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"name\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the space.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {},\n                        \"smithy.api#resourceIdentifier\": \"spaceName\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#GetSpaceResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"name\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the space.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"regionName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#RegionString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services Region where the space exists.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"displayName\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The friendly name of the space displayed to users.</p>\"\n                    }\n                },\n                \"description\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The description of the space.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#GetSubscription\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.codecatalyst#GetSubscriptionRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.codecatalyst#GetSubscriptionResponse\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns information about the Amazon Web Services account used for billing purposes \\n      and the billing plan for the space.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/v1/spaces/{spaceName}/subscription\",\n                    \"code\": 200\n                },\n                \"smithy.api#readonly\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#GetSubscriptionRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"spaceName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the space.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#GetSubscriptionResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"subscriptionType\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of the billing plan for the space.</p>\"\n                    }\n                },\n                \"awsAccountName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The display name of the Amazon Web Services account used for billing for the space.</p>\"\n                    }\n                },\n                \"pendingSubscriptionType\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of the billing plan that the space will be changed to at the start of the next billing cycle. This applies\\n    only to changes that reduce the functionality available for the space. Billing plan changes that increase functionality\\n    are applied immediately. For more information, see <a href=\\\"https://codecatalyst.aws/explore/pricing\\\">Pricing</a>.</p>\"\n                    }\n                },\n                \"pendingSubscriptionStartTime\": {\n                    \"target\": \"com.amazonaws.codecatalyst#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The day and time the pending change will be applied to the space, in coordinated universal time (UTC) timestamp format as specified in <a href=\\\"https://www.rfc-editor.org/rfc/rfc3339#section-5.6\\\">RFC 3339</a>.</p>\",\n                        \"smithy.api#timestampFormat\": \"date-time\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#GetUserDetails\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.codecatalyst#GetUserDetailsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.codecatalyst#GetUserDetailsResponse\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns information about a user. </p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/userDetails\",\n                    \"code\": 200\n                },\n                \"smithy.api#readonly\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#GetUserDetailsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"id\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The system-generated unique ID of the user. </p>\",\n                        \"smithy.api#httpQuery\": \"id\",\n                        \"smithy.api#length\": {\n                            \"min\": 1,\n                            \"max\": 256\n                        }\n                    }\n                },\n                \"userName\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the user as displayed in Amazon CodeCatalyst.</p>\",\n                        \"smithy.api#httpQuery\": \"userName\",\n                        \"smithy.api#length\": {\n                            \"min\": 3,\n                            \"max\": 100\n                        },\n                        \"smithy.api#pattern\": \"^[a-zA-Z0-9_.-]{3,100}$\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#GetUserDetailsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"userId\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The system-generated unique ID of the user.</p>\"\n                    }\n                },\n                \"userName\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the user as displayed in Amazon CodeCatalyst.</p>\"\n                    }\n                },\n                \"displayName\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The friendly name displayed for the user in Amazon CodeCatalyst.</p>\"\n                    }\n                },\n                \"primaryEmail\": {\n                    \"target\": \"com.amazonaws.codecatalyst#EmailAddress\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The email address provided by the user when they signed up.</p>\"\n                    }\n                },\n                \"version\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p/>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#GetWorkflow\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.codecatalyst#GetWorkflowRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.codecatalyst#GetWorkflowResponse\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns information about a workflow.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/v1/spaces/{spaceName}/projects/{projectName}/workflows/{id}\",\n                    \"code\": 200\n                },\n                \"smithy.api#readonly\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#GetWorkflowRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"spaceName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the space.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"id\": {\n                    \"target\": \"com.amazonaws.codecatalyst#Uuid\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the workflow. To rerieve a list of workflow IDs, use <a>ListWorkflows</a>.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {},\n                        \"smithy.api#resourceIdentifier\": \"workflowId\"\n                    }\n                },\n                \"projectName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the project in the space.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#length\": {\n                            \"min\": 1\n                        },\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#GetWorkflowResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"spaceName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the space.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"projectName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the project in the space.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"id\": {\n                    \"target\": \"com.amazonaws.codecatalyst#Uuid\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the workflow.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#resourceIdentifier\": \"workflowId\"\n                    }\n                },\n                \"name\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the workflow.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"sourceRepositoryName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#SourceRepositoryNameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the source repository where the workflow YAML is stored.</p>\"\n                    }\n                },\n                \"sourceBranchName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#SourceRepositoryBranchString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the branch that contains the workflow YAML.</p>\"\n                    }\n                },\n                \"definition\": {\n                    \"target\": \"com.amazonaws.codecatalyst#WorkflowDefinition\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Information about the workflow definition file for the workflow.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"createdTime\": {\n                    \"target\": \"com.amazonaws.codecatalyst#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time the workflow was created, in coordinated universal time (UTC) timestamp format as specified in <a href=\\\"https://www.rfc-editor.org/rfc/rfc3339#section-5.6\\\">RFC 3339</a>\\n         </p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#timestampFormat\": \"date-time\"\n                    }\n                },\n                \"lastUpdatedTime\": {\n                    \"target\": \"com.amazonaws.codecatalyst#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time the workflow was last updated, in coordinated universal time (UTC) timestamp format as specified in <a href=\\\"https://www.rfc-editor.org/rfc/rfc3339#section-5.6\\\">RFC 3339</a>\\n         </p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#timestampFormat\": \"date-time\"\n                    }\n                },\n                \"runMode\": {\n                    \"target\": \"com.amazonaws.codecatalyst#WorkflowRunMode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The behavior to use when multiple workflows occur at the same time. For more information, see \\n      <a href=\\\"https://docs.aws.amazon.com/codecatalyst/latest/userguide/workflows-configure-runs.html\\\">https://docs.aws.amazon.com/codecatalyst/latest/userguide/workflows-configure-runs.html</a> in the Amazon CodeCatalyst User Guide.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"status\": {\n                    \"target\": \"com.amazonaws.codecatalyst#WorkflowStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The status of the workflow.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#GetWorkflowRun\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.codecatalyst#GetWorkflowRunRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.codecatalyst#GetWorkflowRunResponse\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns information about a specified run of a workflow.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/v1/spaces/{spaceName}/projects/{projectName}/workflowRuns/{id}\",\n                    \"code\": 200\n                },\n                \"smithy.api#readonly\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#GetWorkflowRunRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"spaceName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the space.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"id\": {\n                    \"target\": \"com.amazonaws.codecatalyst#Uuid\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the workflow run. To retrieve a list of workflow run IDs, use <a>ListWorkflowRuns</a>.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {},\n                        \"smithy.api#resourceIdentifier\": \"workflowRunId\"\n                    }\n                },\n                \"projectName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the project in the space.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#length\": {\n                            \"min\": 1\n                        },\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#GetWorkflowRunResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"spaceName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the space.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"projectName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the project in the space.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"id\": {\n                    \"target\": \"com.amazonaws.codecatalyst#Uuid\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the workflow run.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#resourceIdentifier\": \"workflowRunId\"\n                    }\n                },\n                \"workflowId\": {\n                    \"target\": \"com.amazonaws.codecatalyst#Uuid\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the workflow.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"status\": {\n                    \"target\": \"com.amazonaws.codecatalyst#WorkflowRunStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The status of the workflow run.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"statusReasons\": {\n                    \"target\": \"com.amazonaws.codecatalyst#WorkflowRunStatusReasons\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Information about the reasons for the status of the workflow run.</p>\"\n                    }\n                },\n                \"startTime\": {\n                    \"target\": \"com.amazonaws.codecatalyst#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time the workflow run began, in coordinated universal time (UTC) timestamp format as specified in <a href=\\\"https://www.rfc-editor.org/rfc/rfc3339#section-5.6\\\">RFC 3339</a>\\n         </p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#timestampFormat\": \"date-time\"\n                    }\n                },\n                \"endTime\": {\n                    \"target\": \"com.amazonaws.codecatalyst#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time the workflow run ended, in coordinated universal time (UTC) timestamp format as specified in <a href=\\\"https://www.rfc-editor.org/rfc/rfc3339#section-5.6\\\">RFC 3339</a>.</p>\",\n                        \"smithy.api#timestampFormat\": \"date-time\"\n                    }\n                },\n                \"lastUpdatedTime\": {\n                    \"target\": \"com.amazonaws.codecatalyst#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time the workflow run status was last updated, in coordinated universal time (UTC) timestamp format as specified in <a href=\\\"https://www.rfc-editor.org/rfc/rfc3339#section-5.6\\\">RFC 3339</a>\\n         </p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#timestampFormat\": \"date-time\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#Ide\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"runtime\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A link to the IDE runtime image.</p>\",\n                        \"smithy.api#length\": {\n                            \"min\": 1,\n                            \"max\": 400\n                        }\n                    }\n                },\n                \"name\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the IDE.</p>\",\n                        \"smithy.api#length\": {\n                            \"min\": 1,\n                            \"max\": 128\n                        }\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about an integrated development environment (IDE) used in a Dev Environment.</p>\"\n            }\n        },\n        \"com.amazonaws.codecatalyst#IdeConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"runtime\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A link to the IDE runtime image. </p>\\n         <note>\\n            <p>This parameter is not required for <code>VSCode</code>.</p>\\n         </note>\",\n                        \"smithy.api#length\": {\n                            \"min\": 1,\n                            \"max\": 400\n                        }\n                    }\n                },\n                \"name\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the IDE. Valid values include <code>Cloud9</code>, <code>IntelliJ</code>, <code>PyCharm</code>, <code>GoLand</code>, and <code>VSCode</code>.</p>\",\n                        \"smithy.api#length\": {\n                            \"min\": 1,\n                            \"max\": 128\n                        }\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about the configuration of an integrated development environment (IDE) for a Dev Environment.</p>\"\n            }\n        },\n        \"com.amazonaws.codecatalyst#IdeConfigurationList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.codecatalyst#IdeConfiguration\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 1\n                }\n            }\n        },\n        \"com.amazonaws.codecatalyst#Ides\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.codecatalyst#Ide\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 1\n                }\n            }\n        },\n        \"com.amazonaws.codecatalyst#InactivityTimeoutMinutes\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#default\": 0,\n                \"smithy.api#range\": {\n                    \"min\": 0,\n                    \"max\": 1200\n                }\n            }\n        },\n        \"com.amazonaws.codecatalyst#InstanceType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#enum\": [\n                    {\n                        \"name\": \"DEV_STANDARD1_SMALL\",\n                        \"value\": \"dev.standard1.small\"\n                    },\n                    {\n                        \"name\": \"DEV_STANDARD1_MEDIUM\",\n                        \"value\": \"dev.standard1.medium\"\n                    },\n                    {\n                        \"name\": \"DEV_STANDARD1_LARGE\",\n                        \"value\": \"dev.standard1.large\"\n                    },\n                    {\n                        \"name\": \"DEV_STANDARD1_XLARGE\",\n                        \"value\": \"dev.standard1.xlarge\"\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.codecatalyst#ListAccessTokens\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.codecatalyst#ListAccessTokensRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.codecatalyst#ListAccessTokensResponse\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Lists all personal access tokens (PATs) associated with the user who calls the API. You can only list PATs associated with your Amazon Web Services Builder ID.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"POST\",\n                    \"uri\": \"/v1/accessTokens\",\n                    \"code\": 200\n                },\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"nextToken\",\n                    \"outputToken\": \"nextToken\",\n                    \"pageSize\": \"maxResults\",\n                    \"items\": \"items\"\n                },\n                \"smithy.api#readonly\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#ListAccessTokensRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"maxResults\": {\n                    \"target\": \"smithy.api#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to show in a single call to this API. If the number of results is larger than the number you specified, the response will include a <code>NextToken</code> element, which you can use to obtain additional results.</p>\",\n                        \"smithy.api#range\": {\n                            \"max\": 10\n                        }\n                    }\n                },\n                \"nextToken\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A token returned from a call to this API to indicate the next batch of results to return, if any.</p>\",\n                        \"smithy.api#length\": {\n                            \"min\": 1,\n                            \"max\": 10000\n                        }\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#ListAccessTokensResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"items\": {\n                    \"target\": \"com.amazonaws.codecatalyst#AccessTokenSummaries\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of personal access tokens (PATs) associated with the calling user identity.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"nextToken\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A token returned from a call to this API to indicate the next batch of results to return, if any.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#ListDevEnvironmentSessions\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.codecatalyst#ListDevEnvironmentSessionsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.codecatalyst#ListDevEnvironmentSessionsResponse\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Retrieves a list of active sessions for a Dev Environment in a project.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"POST\",\n                    \"uri\": \"/v1/spaces/{spaceName}/projects/{projectName}/devEnvironments/{devEnvironmentId}/sessions\",\n                    \"code\": 200\n                },\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"nextToken\",\n                    \"outputToken\": \"nextToken\",\n                    \"pageSize\": \"maxResults\",\n                    \"items\": \"items\"\n                },\n                \"smithy.api#readonly\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#ListDevEnvironmentSessionsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"spaceName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the space.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"projectName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the project in the space.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"devEnvironmentId\": {\n                    \"target\": \"com.amazonaws.codecatalyst#Uuid\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The system-generated unique ID of the Dev Environment.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {},\n                        \"smithy.api#resourceIdentifier\": \"devEnvironmentId\"\n                    }\n                },\n                \"nextToken\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A token returned from a call to this API to indicate the next batch of results to return, if any.</p>\",\n                        \"smithy.api#length\": {\n                            \"min\": 1,\n                            \"max\": 10000\n                        }\n                    }\n                },\n                \"maxResults\": {\n                    \"target\": \"smithy.api#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to show in a single call to this API. If the number of results is larger than the number you specified, the response will include a <code>NextToken</code> element, which you can use to obtain additional results.</p>\",\n                        \"smithy.api#range\": {\n                            \"min\": 1,\n                            \"max\": 200\n                        }\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#ListDevEnvironmentSessionsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"items\": {\n                    \"target\": \"com.amazonaws.codecatalyst#DevEnvironmentSessionsSummaryList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Information about each session retrieved in the list.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"nextToken\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A token returned from a call to this API to indicate the next batch of results to return, if any.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#ListDevEnvironments\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.codecatalyst#ListDevEnvironmentsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.codecatalyst#ListDevEnvironmentsResponse\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Retrieves a list of Dev Environments in a project.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"POST\",\n                    \"uri\": \"/v1/spaces/{spaceName}/devEnvironments\",\n                    \"code\": 200\n                },\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"nextToken\",\n                    \"outputToken\": \"nextToken\",\n                    \"pageSize\": \"maxResults\",\n                    \"items\": \"items\"\n                },\n                \"smithy.api#readonly\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#ListDevEnvironmentsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"spaceName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the space.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"projectName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the project in the space.</p>\"\n                    }\n                },\n                \"filters\": {\n                    \"target\": \"com.amazonaws.codecatalyst#Filters\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Information about filters to apply to narrow the results returned in the list.</p>\"\n                    }\n                },\n                \"nextToken\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A token returned from a call to this API to indicate the next batch of results to return, if any.</p>\",\n                        \"smithy.api#length\": {\n                            \"min\": 1,\n                            \"max\": 10000\n                        }\n                    }\n                },\n                \"maxResults\": {\n                    \"target\": \"smithy.api#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to show in a single call to this API. If the number of results is larger than the number you specified, the response will include a <code>NextToken</code> element, which you can use to obtain additional results.</p>\",\n                        \"smithy.api#range\": {\n                            \"min\": 1,\n                            \"max\": 50\n                        }\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#ListDevEnvironmentsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"items\": {\n                    \"target\": \"com.amazonaws.codecatalyst#DevEnvironmentSummaryList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Information about the Dev Environments in a project.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"nextToken\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A token returned from a call to this API to indicate the next batch of results to return, if any.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#ListEventLogs\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.codecatalyst#ListEventLogsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.codecatalyst#ListEventLogsResponse\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Retrieves a list of events that occurred during a specific time in a space. You can\\n      use these events to audit user and system activity in a space. For more information, see\\n        <a href=\\\"https://docs.aws.amazon.com/codecatalyst/latest/userguide/ipa-monitoring.html\\\">Monitoring</a> in the <i>Amazon CodeCatalyst User Guide</i>.</p>\\n         <note>\\n            <p>ListEventLogs guarantees events for the last 30 days in a given space. You can also\\n        view and retrieve a list of management events over the last 90 days for Amazon CodeCatalyst in the\\n          CloudTrail console by viewing Event history, or by creating a trail to create\\n        and maintain a record of events that extends past 90 days. For more information, see <a href=\\\"https://docs.aws.amazon.com/awscloudtrail/latest/userguide/view-cloudtrail-events.html\\\">Working with CloudTrail Event History</a> and <a href=\\\"https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-getting-started.html\\\">Working with\\n          CloudTrail trails</a>.</p>\\n         </note>\",\n                \"smithy.api#http\": {\n                    \"method\": \"POST\",\n                    \"uri\": \"/v1/spaces/{spaceName}/eventLogs\",\n                    \"code\": 200\n                },\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"nextToken\",\n                    \"outputToken\": \"nextToken\",\n                    \"pageSize\": \"maxResults\",\n                    \"items\": \"items\"\n                },\n                \"smithy.api#readonly\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#ListEventLogsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"spaceName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the space.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"startTime\": {\n                    \"target\": \"com.amazonaws.codecatalyst#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time when you want to start retrieving events, in coordinated universal time (UTC) timestamp format as specified in <a href=\\\"https://www.rfc-editor.org/rfc/rfc3339#section-5.6\\\">RFC 3339</a>.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#timestampFormat\": \"date-time\"\n                    }\n                },\n                \"endTime\": {\n                    \"target\": \"com.amazonaws.codecatalyst#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time after which you do not want any events retrieved, in coordinated universal time (UTC) timestamp format as specified in <a href=\\\"https://www.rfc-editor.org/rfc/rfc3339#section-5.6\\\">RFC 3339</a>.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#timestampFormat\": \"date-time\"\n                    }\n                },\n                \"eventName\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the event.</p>\"\n                    }\n                },\n                \"nextToken\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A token returned from a call to this API to indicate the next batch of results to return, if any.</p>\",\n                        \"smithy.api#length\": {\n                            \"min\": 1,\n                            \"max\": 10000\n                        }\n                    }\n                },\n                \"maxResults\": {\n                    \"target\": \"smithy.api#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to show in a single call to this API. If the number of results is larger than the number you specified, the response will include a <code>NextToken</code> element, which you can use to obtain additional results.</p>\",\n                        \"smithy.api#range\": {\n                            \"min\": 1,\n                            \"max\": 250\n                        }\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#ListEventLogsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"nextToken\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A token returned from a call to this API to indicate the next batch of results to return, if any.</p>\"\n                    }\n                },\n                \"items\": {\n                    \"target\": \"com.amazonaws.codecatalyst#EventLogEntries\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Information about each event retrieved in the list.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#ListProjects\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.codecatalyst#ListProjectsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.codecatalyst#ListProjectsResponse\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Retrieves a list of projects.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"POST\",\n                    \"uri\": \"/v1/spaces/{spaceName}/projects\",\n                    \"code\": 200\n                },\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"nextToken\",\n                    \"outputToken\": \"nextToken\",\n                    \"pageSize\": \"maxResults\",\n                    \"items\": \"items\"\n                },\n                \"smithy.api#readonly\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#ListProjectsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"spaceName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the space.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"nextToken\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A token returned from a call to this API to indicate the next batch of results to return, if any.</p>\",\n                        \"smithy.api#length\": {\n                            \"min\": 1,\n                            \"max\": 10000\n                        }\n                    }\n                },\n                \"maxResults\": {\n                    \"target\": \"smithy.api#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to show in a single call to this API. If the number of results is larger than the number you specified, the response will include a <code>NextToken</code> element, which you can use to obtain additional results.</p>\",\n                        \"smithy.api#range\": {\n                            \"min\": 1,\n                            \"max\": 100\n                        }\n                    }\n                },\n                \"filters\": {\n                    \"target\": \"com.amazonaws.codecatalyst#ProjectListFilters\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Information about filters to apply to narrow the results returned in the list.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#ListProjectsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"nextToken\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A token returned from a call to this API to indicate the next batch of results to return, if any.</p>\"\n                    }\n                },\n                \"items\": {\n                    \"target\": \"com.amazonaws.codecatalyst#ProjectSummaries\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Information about the projects.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#ListSourceRepositories\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.codecatalyst#ListSourceRepositoriesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.codecatalyst#ListSourceRepositoriesResponse\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Retrieves a list of source repositories in a project.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"POST\",\n                    \"uri\": \"/v1/spaces/{spaceName}/projects/{projectName}/sourceRepositories\",\n                    \"code\": 200\n                },\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"nextToken\",\n                    \"outputToken\": \"nextToken\",\n                    \"pageSize\": \"maxResults\",\n                    \"items\": \"items\"\n                },\n                \"smithy.api#readonly\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#ListSourceRepositoriesItem\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"id\": {\n                    \"target\": \"com.amazonaws.codecatalyst#SourceRepositoryIdString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The system-generated unique ID of the source repository.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"name\": {\n                    \"target\": \"com.amazonaws.codecatalyst#SourceRepositoryNameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the source repository.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"description\": {\n                    \"target\": \"com.amazonaws.codecatalyst#SourceRepositoryDescriptionString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The description of the repository, if any.</p>\"\n                    }\n                },\n                \"lastUpdatedTime\": {\n                    \"target\": \"com.amazonaws.codecatalyst#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time the source repository was last updated, in coordinated universal time (UTC) timestamp format as specified in <a href=\\\"https://www.rfc-editor.org/rfc/rfc3339#section-5.6\\\">RFC 3339</a>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"createdTime\": {\n                    \"target\": \"com.amazonaws.codecatalyst#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time the source repository was created, in coordinated universal time (UTC) timestamp format as specified in <a href=\\\"https://www.rfc-editor.org/rfc/rfc3339#section-5.6\\\">RFC 3339</a>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about a source repository returned in a list of source repositories.</p>\"\n            }\n        },\n        \"com.amazonaws.codecatalyst#ListSourceRepositoriesItems\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.codecatalyst#ListSourceRepositoriesItem\"\n            }\n        },\n        \"com.amazonaws.codecatalyst#ListSourceRepositoriesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"spaceName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the space.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"projectName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the project in the space.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"nextToken\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A token returned from a call to this API to indicate the next batch of results to return, if any.</p>\",\n                        \"smithy.api#length\": {\n                            \"min\": 1,\n                            \"max\": 10000\n                        }\n                    }\n                },\n                \"maxResults\": {\n                    \"target\": \"smithy.api#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to show in a single call to this API. If the number of results is larger than the number you specified, the response will include a <code>NextToken</code> element, which you can use to obtain additional results.</p>\",\n                        \"smithy.api#range\": {\n                            \"min\": 1,\n                            \"max\": 200\n                        }\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#ListSourceRepositoriesResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"items\": {\n                    \"target\": \"com.amazonaws.codecatalyst#ListSourceRepositoriesItems\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Information about the source repositories.</p>\"\n                    }\n                },\n                \"nextToken\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A token returned from a call to this API to indicate the next batch of results to return, if any.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#ListSourceRepositoryBranches\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.codecatalyst#ListSourceRepositoryBranchesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.codecatalyst#ListSourceRepositoryBranchesResponse\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Retrieves a list of branches in a specified source repository.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"POST\",\n                    \"uri\": \"/v1/spaces/{spaceName}/projects/{projectName}/sourceRepositories/{sourceRepositoryName}/branches\",\n                    \"code\": 200\n                },\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"nextToken\",\n                    \"outputToken\": \"nextToken\",\n                    \"pageSize\": \"maxResults\",\n                    \"items\": \"items\"\n                },\n                \"smithy.api#readonly\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#ListSourceRepositoryBranchesItem\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ref\": {\n                    \"target\": \"com.amazonaws.codecatalyst#SourceRepositoryBranchRefString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Git reference name of the branch.</p>\"\n                    }\n                },\n                \"name\": {\n                    \"target\": \"com.amazonaws.codecatalyst#SourceRepositoryBranchString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the branch.</p>\"\n                    }\n                },\n                \"lastUpdatedTime\": {\n                    \"target\": \"com.amazonaws.codecatalyst#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time the branch was last updated, in coordinated universal time (UTC) timestamp format as specified in <a href=\\\"https://www.rfc-editor.org/rfc/rfc3339#section-5.6\\\">RFC 3339</a>.</p>\",\n                        \"smithy.api#timestampFormat\": \"date-time\"\n                    }\n                },\n                \"headCommitId\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The commit ID of the tip of the branch at the time of the request, also known as the head commit.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about a branch of a source repository returned in a list of branches.</p>\"\n            }\n        },\n        \"com.amazonaws.codecatalyst#ListSourceRepositoryBranchesItems\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.codecatalyst#ListSourceRepositoryBranchesItem\"\n            }\n        },\n        \"com.amazonaws.codecatalyst#ListSourceRepositoryBranchesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"spaceName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the space.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"projectName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the project in the space.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"sourceRepositoryName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#SourceRepositoryNameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the source repository.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"nextToken\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A token returned from a call to this API to indicate the next batch of results to return, if any.</p>\",\n                        \"smithy.api#length\": {\n                            \"min\": 1,\n                            \"max\": 10000\n                        }\n                    }\n                },\n                \"maxResults\": {\n                    \"target\": \"smithy.api#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to show in a single call to this API. If the number of results is larger than the number you specified, the response will include a <code>NextToken</code> element, which you can use to obtain additional results.</p>\",\n                        \"smithy.api#range\": {\n                            \"min\": 1,\n                            \"max\": 50\n                        }\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#ListSourceRepositoryBranchesResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"nextToken\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A token returned from a call to this API to indicate the next batch of results to return, if any.</p>\"\n                    }\n                },\n                \"items\": {\n                    \"target\": \"com.amazonaws.codecatalyst#ListSourceRepositoryBranchesItems\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Information about the source branches.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#ListSpaces\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.codecatalyst#ListSpacesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.codecatalyst#ListSpacesResponse\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Retrieves a list of spaces.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"POST\",\n                    \"uri\": \"/v1/spaces\",\n                    \"code\": 200\n                },\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"nextToken\",\n                    \"outputToken\": \"nextToken\",\n                    \"items\": \"items\"\n                },\n                \"smithy.api#readonly\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#ListSpacesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"nextToken\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A token returned from a call to this API to indicate the next batch of results to return, if any.</p>\",\n                        \"smithy.api#length\": {\n                            \"min\": 1,\n                            \"max\": 10000\n                        }\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#ListSpacesResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"nextToken\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A token returned from a call to this API to indicate the next batch of results to return, if any.</p>\"\n                    }\n                },\n                \"items\": {\n                    \"target\": \"com.amazonaws.codecatalyst#SpaceSummaries\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Information about the spaces. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#ListWorkflowRuns\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.codecatalyst#ListWorkflowRunsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.codecatalyst#ListWorkflowRunsResponse\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Retrieves a list of workflow runs of a specified workflow.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"POST\",\n                    \"uri\": \"/v1/spaces/{spaceName}/projects/{projectName}/workflowRuns\",\n                    \"code\": 200\n                },\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"nextToken\",\n                    \"outputToken\": \"nextToken\",\n                    \"pageSize\": \"maxResults\",\n                    \"items\": \"items\"\n                },\n                \"smithy.api#readonly\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#ListWorkflowRunsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"spaceName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the space.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"workflowId\": {\n                    \"target\": \"com.amazonaws.codecatalyst#Uuid\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the workflow. To retrieve a list of workflow IDs, use <a>ListWorkflows</a>.</p>\",\n                        \"smithy.api#httpQuery\": \"workflowId\"\n                    }\n                },\n                \"projectName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the project in the space.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#length\": {\n                            \"min\": 1\n                        },\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"nextToken\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A token returned from a call to this API to indicate the next batch of results to return, if any.</p>\",\n                        \"smithy.api#httpQuery\": \"nextToken\",\n                        \"smithy.api#length\": {\n                            \"min\": 1,\n                            \"max\": 2048\n                        }\n                    }\n                },\n                \"maxResults\": {\n                    \"target\": \"smithy.api#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to show in a single call to this API. If the number of results is larger than the number you specified, the response will include a <code>NextToken</code> element, which you can use to obtain additional results.</p>\",\n                        \"smithy.api#httpQuery\": \"maxResults\",\n                        \"smithy.api#range\": {\n                            \"min\": 1,\n                            \"max\": 50\n                        }\n                    }\n                },\n                \"sortBy\": {\n                    \"target\": \"com.amazonaws.codecatalyst#WorkflowRunSortCriteriaList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Information used to sort the items in the returned list.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#ListWorkflowRunsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"nextToken\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A token returned from a call to this API to indicate the next batch of results to return, if any.</p>\"\n                    }\n                },\n                \"items\": {\n                    \"target\": \"com.amazonaws.codecatalyst#WorkflowRunSummaries\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Information about the runs of a workflow.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#ListWorkflows\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.codecatalyst#ListWorkflowsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.codecatalyst#ListWorkflowsResponse\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Retrieves a list of workflows in a specified project.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"POST\",\n                    \"uri\": \"/v1/spaces/{spaceName}/projects/{projectName}/workflows\",\n                    \"code\": 200\n                },\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"nextToken\",\n                    \"outputToken\": \"nextToken\",\n                    \"pageSize\": \"maxResults\",\n                    \"items\": \"items\"\n                },\n                \"smithy.api#readonly\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#ListWorkflowsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"spaceName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the space.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#length\": {\n                            \"min\": 1\n                        },\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"projectName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the project in the space.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"nextToken\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A token returned from a call to this API to indicate the next batch of results to return, if any.</p>\",\n                        \"smithy.api#httpQuery\": \"nextToken\",\n                        \"smithy.api#length\": {\n                            \"min\": 1,\n                            \"max\": 2048\n                        }\n                    }\n                },\n                \"maxResults\": {\n                    \"target\": \"smithy.api#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to show in a single call to this API. If the number of results is larger than the number you specified, the response will include a <code>NextToken</code> element, which you can use to obtain additional results.</p>\",\n                        \"smithy.api#httpQuery\": \"maxResults\",\n                        \"smithy.api#range\": {\n                            \"min\": 1,\n                            \"max\": 100\n                        }\n                    }\n                },\n                \"sortBy\": {\n                    \"target\": \"com.amazonaws.codecatalyst#WorkflowSortCriteriaList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Information used to sort the items in the returned list.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#ListWorkflowsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"nextToken\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A token returned from a call to this API to indicate the next batch of results to return, if any.</p>\"\n                    }\n                },\n                \"items\": {\n                    \"target\": \"com.amazonaws.codecatalyst#WorkflowSummaries\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Information about the workflows in a project.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#NameString\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 3,\n                    \"max\": 63\n                },\n                \"smithy.api#pattern\": \"^[a-zA-Z0-9]+(?:[-_\\\\.][a-zA-Z0-9]+)*$\"\n            }\n        },\n        \"com.amazonaws.codecatalyst#OperationType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#enum\": [\n                    {\n                        \"name\": \"READONLY\",\n                        \"value\": \"READONLY\"\n                    },\n                    {\n                        \"name\": \"MUTATION\",\n                        \"value\": \"MUTATION\"\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.codecatalyst#PersistentStorage\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"sizeInGiB\": {\n                    \"target\": \"smithy.api#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The size of the persistent storage in gigabytes (specifically GiB).</p>\\n         <note>\\n            <p>Valid values for storage are based on memory sizes in 16GB increments. Valid values are\\n        16, 32, and 64.</p>\\n         </note>\",\n                        \"smithy.api#range\": {\n                            \"min\": 0,\n                            \"max\": 64\n                        },\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about the persistent storage for a Dev Environment.</p>\"\n            }\n        },\n        \"com.amazonaws.codecatalyst#PersistentStorageConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"sizeInGiB\": {\n                    \"target\": \"smithy.api#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The size of the persistent storage in gigabytes (specifically GiB).</p>\\n         <note>\\n            <p>Valid values for storage are based on memory sizes in 16GB increments. Valid values are\\n        16, 32, and 64.</p>\\n         </note>\",\n                        \"smithy.api#range\": {\n                            \"min\": 0,\n                            \"max\": 64\n                        },\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about the configuration of persistent storage for a Dev Environment. </p>\"\n            }\n        },\n        \"com.amazonaws.codecatalyst#Project\": {\n            \"type\": \"resource\",\n            \"identifiers\": {\n                \"spaceName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\"\n                },\n                \"projectName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\"\n                }\n            },\n            \"create\": {\n                \"target\": \"com.amazonaws.codecatalyst#CreateProject\"\n            },\n            \"read\": {\n                \"target\": \"com.amazonaws.codecatalyst#GetProject\"\n            },\n            \"update\": {\n                \"target\": \"com.amazonaws.codecatalyst#UpdateProject\"\n            },\n            \"delete\": {\n                \"target\": \"com.amazonaws.codecatalyst#DeleteProject\"\n            },\n            \"list\": {\n                \"target\": \"com.amazonaws.codecatalyst#ListProjects\"\n            },\n            \"resources\": [\n                {\n                    \"target\": \"com.amazonaws.codecatalyst#DevEnvironment\"\n                },\n                {\n                    \"target\": \"com.amazonaws.codecatalyst#SourceRepository\"\n                },\n                {\n                    \"target\": \"com.amazonaws.codecatalyst#Workflow\"\n                },\n                {\n                    \"target\": \"com.amazonaws.codecatalyst#WorkflowRun\"\n                }\n            ]\n        },\n        \"com.amazonaws.codecatalyst#ProjectDescription\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 200\n                },\n                \"smithy.api#pattern\": \"^[a-zA-Z0-9]+(?:[-_a-zA-Z0-9.,;:/\\\\+=?&$% \\n\\t\\r])*$\"\n            }\n        },\n        \"com.amazonaws.codecatalyst#ProjectDisplayName\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 3,\n                    \"max\": 63\n                },\n                \"smithy.api#pattern\": \"^[a-zA-Z0-9]+(?:[-_\\\\. ][a-zA-Z0-9]+)*$\"\n            }\n        },\n        \"com.amazonaws.codecatalyst#ProjectInformation\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"name\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the project in the space.</p>\"\n                    }\n                },\n                \"projectId\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The system-generated unique ID of the project.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about a project in a space.</p>\"\n            }\n        },\n        \"com.amazonaws.codecatalyst#ProjectListFilter\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"key\": {\n                    \"target\": \"com.amazonaws.codecatalyst#FilterKey\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A key that can be used to sort results.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"values\": {\n                    \"target\": \"com.amazonaws.codecatalyst#StringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The values of the key.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"comparisonOperator\": {\n                    \"target\": \"com.amazonaws.codecatalyst#ComparisonOperator\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The operator used to compare the fields.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>nformation about the filter used to narrow the results returned in a list of projects.</p>\"\n            }\n        },\n        \"com.amazonaws.codecatalyst#ProjectListFilters\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.codecatalyst#ProjectListFilter\"\n            }\n        },\n        \"com.amazonaws.codecatalyst#ProjectSummaries\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.codecatalyst#ProjectSummary\"\n            }\n        },\n        \"com.amazonaws.codecatalyst#ProjectSummary\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"name\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the project in the space.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"displayName\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The friendly name displayed to users of the project in Amazon CodeCatalyst.</p>\"\n                    }\n                },\n                \"description\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The description of the project.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about a project.</p>\"\n            }\n        },\n        \"com.amazonaws.codecatalyst#RegionString\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 3,\n                    \"max\": 16\n                },\n                \"smithy.api#pattern\": \"^(us(?:-gov)?|af|ap|ca|cn|eu|sa)-(central|(?:north|south)?(?:east|west)?)-(\\\\d+)$\"\n            }\n        },\n        \"com.amazonaws.codecatalyst#RepositoriesInput\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.codecatalyst#RepositoryInput\"\n            }\n        },\n        \"com.amazonaws.codecatalyst#RepositoryInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"repositoryName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#SourceRepositoryNameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the source repository.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"branchName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#SourceRepositoryBranchString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the branch in a source repository.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about a repository that will be cloned to a Dev Environment.</p>\"\n            }\n        },\n        \"com.amazonaws.codecatalyst#ResourceNotFoundException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The request was denied because the specified resource was not found. Verify that the spelling is correct and that you have access to the resource.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 404\n            }\n        },\n        \"com.amazonaws.codecatalyst#SensitiveString\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#sensitive\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#ServiceQuotaExceededException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The request was denied because one or more resources has reached its limits for the tier the space belongs to. Either reduce\\n      the number of resources, or change the tier if applicable.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 402\n            }\n        },\n        \"com.amazonaws.codecatalyst#SourceRepository\": {\n            \"type\": \"resource\",\n            \"identifiers\": {\n                \"spaceName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\"\n                },\n                \"projectName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\"\n                },\n                \"sourceRepositoryName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#SourceRepositoryNameString\"\n                }\n            },\n            \"put\": {\n                \"target\": \"com.amazonaws.codecatalyst#CreateSourceRepository\"\n            },\n            \"read\": {\n                \"target\": \"com.amazonaws.codecatalyst#GetSourceRepository\"\n            },\n            \"delete\": {\n                \"target\": \"com.amazonaws.codecatalyst#DeleteSourceRepository\"\n            },\n            \"list\": {\n                \"target\": \"com.amazonaws.codecatalyst#ListSourceRepositories\"\n            },\n            \"operations\": [\n                {\n                    \"target\": \"com.amazonaws.codecatalyst#GetSourceRepositoryCloneUrls\"\n                }\n            ],\n            \"resources\": [\n                {\n                    \"target\": \"com.amazonaws.codecatalyst#SourceRepositoryBranch\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#noReplace\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#SourceRepositoryBranch\": {\n            \"type\": \"resource\",\n            \"identifiers\": {\n                \"spaceName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\"\n                },\n                \"projectName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\"\n                },\n                \"sourceRepositoryName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#SourceRepositoryNameString\"\n                },\n                \"sourceRepositoryBranchName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#SourceRepositoryBranchString\"\n                }\n            },\n            \"put\": {\n                \"target\": \"com.amazonaws.codecatalyst#CreateSourceRepositoryBranch\"\n            },\n            \"list\": {\n                \"target\": \"com.amazonaws.codecatalyst#ListSourceRepositoryBranches\"\n            },\n            \"traits\": {\n                \"smithy.api#noReplace\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#SourceRepositoryBranchRefString\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 255\n                }\n            }\n        },\n        \"com.amazonaws.codecatalyst#SourceRepositoryBranchString\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 100\n                }\n            }\n        },\n        \"com.amazonaws.codecatalyst#SourceRepositoryDescriptionString\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 255\n                }\n            }\n        },\n        \"com.amazonaws.codecatalyst#SourceRepositoryIdString\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#pattern\": \"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$\"\n            }\n        },\n        \"com.amazonaws.codecatalyst#SourceRepositoryNameString\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 100\n                },\n                \"smithy.api#pattern\": \"^(?!.*[.]git$)[\\\\w\\\\-.]*$\"\n            }\n        },\n        \"com.amazonaws.codecatalyst#Space\": {\n            \"type\": \"resource\",\n            \"identifiers\": {\n                \"spaceName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\"\n                }\n            },\n            \"read\": {\n                \"target\": \"com.amazonaws.codecatalyst#GetSpace\"\n            },\n            \"update\": {\n                \"target\": \"com.amazonaws.codecatalyst#UpdateSpace\"\n            },\n            \"delete\": {\n                \"target\": \"com.amazonaws.codecatalyst#DeleteSpace\"\n            },\n            \"list\": {\n                \"target\": \"com.amazonaws.codecatalyst#ListSpaces\"\n            },\n            \"operations\": [\n                {\n                    \"target\": \"com.amazonaws.codecatalyst#ListDevEnvironments\"\n                }\n            ],\n            \"resources\": [\n                {\n                    \"target\": \"com.amazonaws.codecatalyst#EventLogResource\"\n                },\n                {\n                    \"target\": \"com.amazonaws.codecatalyst#Project\"\n                },\n                {\n                    \"target\": \"com.amazonaws.codecatalyst#Subscription\"\n                }\n            ]\n        },\n        \"com.amazonaws.codecatalyst#SpaceDescription\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 200\n                },\n                \"smithy.api#pattern\": \"^[a-zA-Z0-9]+(?:[-_a-zA-Z0-9.,;:/\\\\+=?&$% \\n\\t\\r])*$\"\n            }\n        },\n        \"com.amazonaws.codecatalyst#SpaceSummaries\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.codecatalyst#SpaceSummary\"\n            }\n        },\n        \"com.amazonaws.codecatalyst#SpaceSummary\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"name\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the space.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"regionName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#RegionString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services Region\\n      where the space exists.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"displayName\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The friendly name of the space displayed to users.</p>\"\n                    }\n                },\n                \"description\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The description of the space.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about an space.</p>\"\n            }\n        },\n        \"com.amazonaws.codecatalyst#StartDevEnvironment\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.codecatalyst#StartDevEnvironmentRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.codecatalyst#StartDevEnvironmentResponse\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Starts a specified Dev Environment and puts it into an active state. </p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"PUT\",\n                    \"uri\": \"/v1/spaces/{spaceName}/projects/{projectName}/devEnvironments/{id}/start\",\n                    \"code\": 200\n                },\n                \"smithy.api#idempotent\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#StartDevEnvironmentRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"spaceName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the space.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"projectName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the project in the space.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"id\": {\n                    \"target\": \"com.amazonaws.codecatalyst#Uuid\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The system-generated unique ID of the Dev Environment. </p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {},\n                        \"smithy.api#resourceIdentifier\": \"devEnvironmentId\"\n                    }\n                },\n                \"ides\": {\n                    \"target\": \"com.amazonaws.codecatalyst#IdeConfigurationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Information about the integrated development environment (IDE) configured for a Dev Environment. </p>\"\n                    }\n                },\n                \"instanceType\": {\n                    \"target\": \"com.amazonaws.codecatalyst#InstanceType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon EC2 instace type to use for the Dev Environment. </p>\"\n                    }\n                },\n                \"inactivityTimeoutMinutes\": {\n                    \"target\": \"com.amazonaws.codecatalyst#InactivityTimeoutMinutes\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The amount of time the Dev Environment will run without any activity detected before stopping, in minutes. Only whole integers are allowed. Dev Environments consume compute minutes when running.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#StartDevEnvironmentResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"spaceName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the space.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"projectName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the project in the space.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"id\": {\n                    \"target\": \"com.amazonaws.codecatalyst#Uuid\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The system-generated unique ID of the Dev Environment. </p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#resourceIdentifier\": \"devEnvironmentId\"\n                    }\n                },\n                \"status\": {\n                    \"target\": \"com.amazonaws.codecatalyst#DevEnvironmentStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The status of the Dev Environment. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#StartDevEnvironmentSession\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.codecatalyst#StartDevEnvironmentSessionRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.codecatalyst#StartDevEnvironmentSessionResponse\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Starts a session for a specified Dev Environment.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"PUT\",\n                    \"uri\": \"/v1/spaces/{spaceName}/projects/{projectName}/devEnvironments/{id}/session\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.codecatalyst#StartDevEnvironmentSessionRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"spaceName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the space.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"projectName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the project in the space.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"id\": {\n                    \"target\": \"com.amazonaws.codecatalyst#Uuid\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The system-generated unique ID of the Dev Environment.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {},\n                        \"smithy.api#resourceIdentifier\": \"devEnvironmentId\"\n                    }\n                },\n                \"sessionConfiguration\": {\n                    \"target\": \"com.amazonaws.codecatalyst#DevEnvironmentSessionConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#StartDevEnvironmentSessionResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"accessDetails\": {\n                    \"target\": \"com.amazonaws.codecatalyst#DevEnvironmentAccessDetails\",\n                    \"traits\": {\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"sessionId\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The system-generated unique ID of the Dev Environment session.</p>\",\n                        \"smithy.api#length\": {\n                            \"min\": 1,\n                            \"max\": 96\n                        }\n                    }\n                },\n                \"spaceName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the space.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"projectName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the project in the space.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"id\": {\n                    \"target\": \"com.amazonaws.codecatalyst#Uuid\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The system-generated unique ID of the Dev Environment.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#resourceIdentifier\": \"devEnvironmentId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#StartWorkflowRun\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.codecatalyst#StartWorkflowRunRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.codecatalyst#StartWorkflowRunResponse\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Begins a run of a specified workflow.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"PUT\",\n                    \"uri\": \"/v1/spaces/{spaceName}/projects/{projectName}/workflowRuns\",\n                    \"code\": 200\n                },\n                \"smithy.api#idempotent\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#StartWorkflowRunRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"spaceName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the space.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#length\": {\n                            \"min\": 1\n                        },\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"projectName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the project in the space.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#length\": {\n                            \"min\": 1\n                        },\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"workflowId\": {\n                    \"target\": \"com.amazonaws.codecatalyst#Uuid\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The system-generated unique ID of the workflow. To retrieve a list of workflow IDs, use <a>ListWorkflows</a>.</p>\",\n                        \"smithy.api#httpQuery\": \"workflowId\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"clientToken\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A user-specified idempotency token.  Idempotency ensures that an API request completes only once. \\n       With an idempotent request, if the original request completes successfully, the subsequent retries return the result from the original successful request and have no additional effect.</p>\",\n                        \"smithy.api#idempotencyToken\": {},\n                        \"smithy.api#length\": {\n                            \"min\": 1,\n                            \"max\": 64\n                        },\n                        \"smithy.api#pattern\": \"^[a-zA-Z0-9]+(?:[-_\\\\.][a-zA-Z0-9]+)*$\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#StartWorkflowRunResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"spaceName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the space.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"projectName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the project in the space.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"id\": {\n                    \"target\": \"com.amazonaws.codecatalyst#Uuid\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The system-generated unique ID of the workflow run.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"workflowId\": {\n                    \"target\": \"com.amazonaws.codecatalyst#Uuid\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The system-generated unique ID of the workflow.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#StatusReason\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"max\": 1024\n                }\n            }\n        },\n        \"com.amazonaws.codecatalyst#StopDevEnvironment\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.codecatalyst#StopDevEnvironmentRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.codecatalyst#StopDevEnvironmentResponse\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Pauses a specified Dev Environment and places it in a non-running state. Stopped Dev Environments do not consume compute minutes.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"PUT\",\n                    \"uri\": \"/v1/spaces/{spaceName}/projects/{projectName}/devEnvironments/{id}/stop\",\n                    \"code\": 200\n                },\n                \"smithy.api#idempotent\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#StopDevEnvironmentRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"spaceName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the space.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"projectName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the project in the space.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"id\": {\n                    \"target\": \"com.amazonaws.codecatalyst#Uuid\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The system-generated unique ID of the Dev Environment. </p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {},\n                        \"smithy.api#resourceIdentifier\": \"devEnvironmentId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#StopDevEnvironmentResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"spaceName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the space.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"projectName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the project in the space.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"id\": {\n                    \"target\": \"com.amazonaws.codecatalyst#Uuid\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The system-generated unique ID of the Dev Environment. </p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#resourceIdentifier\": \"devEnvironmentId\"\n                    }\n                },\n                \"status\": {\n                    \"target\": \"com.amazonaws.codecatalyst#DevEnvironmentStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The status of the Dev Environment. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#StopDevEnvironmentSession\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.codecatalyst#StopDevEnvironmentSessionRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.codecatalyst#StopDevEnvironmentSessionResponse\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Stops a session for a specified Dev Environment.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"DELETE\",\n                    \"uri\": \"/v1/spaces/{spaceName}/projects/{projectName}/devEnvironments/{id}/session/{sessionId}\",\n                    \"code\": 200\n                },\n                \"smithy.api#idempotent\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#StopDevEnvironmentSessionRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"spaceName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the space.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"projectName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the project in the space.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"id\": {\n                    \"target\": \"com.amazonaws.codecatalyst#Uuid\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The system-generated unique ID of the Dev Environment. To obtain this ID, use <a>ListDevEnvironments</a>.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {},\n                        \"smithy.api#resourceIdentifier\": \"devEnvironmentId\"\n                    }\n                },\n                \"sessionId\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The system-generated unique ID of the Dev Environment session. This ID is returned by <a>StartDevEnvironmentSession</a>.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#length\": {\n                            \"min\": 1,\n                            \"max\": 96\n                        },\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#StopDevEnvironmentSessionResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"spaceName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the space.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"projectName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the project in the space.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"id\": {\n                    \"target\": \"com.amazonaws.codecatalyst#Uuid\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The system-generated unique ID of the Dev Environment.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#resourceIdentifier\": \"devEnvironmentId\"\n                    }\n                },\n                \"sessionId\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The system-generated unique ID of the Dev Environment session.</p>\",\n                        \"smithy.api#length\": {\n                            \"min\": 1,\n                            \"max\": 96\n                        },\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#StringList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"smithy.api#String\"\n            }\n        },\n        \"com.amazonaws.codecatalyst#Subscription\": {\n            \"type\": \"resource\",\n            \"identifiers\": {\n                \"spaceName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\"\n                }\n            },\n            \"read\": {\n                \"target\": \"com.amazonaws.codecatalyst#GetSubscription\"\n            }\n        },\n        \"com.amazonaws.codecatalyst#ThrottlingException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The request was denied due to request throttling.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 429,\n                \"smithy.api#retryable\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#Timestamp\": {\n            \"type\": \"timestamp\",\n            \"traits\": {\n                \"smithy.api#timestampFormat\": \"date-time\"\n            }\n        },\n        \"com.amazonaws.codecatalyst#UpdateDevEnvironment\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.codecatalyst#UpdateDevEnvironmentRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.codecatalyst#UpdateDevEnvironmentResponse\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Changes one or more values for a Dev Environment. Updating certain values of the Dev Environment will cause a restart.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"PATCH\",\n                    \"uri\": \"/v1/spaces/{spaceName}/projects/{projectName}/devEnvironments/{id}\",\n                    \"code\": 200\n                },\n                \"smithy.api#idempotent\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#UpdateDevEnvironmentRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"spaceName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the space.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"projectName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the project in the space.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"id\": {\n                    \"target\": \"com.amazonaws.codecatalyst#Uuid\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The system-generated unique ID of the Dev Environment. </p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {},\n                        \"smithy.api#resourceIdentifier\": \"devEnvironmentId\"\n                    }\n                },\n                \"alias\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The user-specified alias for the Dev Environment. Changing this value will not cause a restart.</p>\",\n                        \"smithy.api#length\": {\n                            \"max\": 128\n                        },\n                        \"smithy.api#pattern\": \"^$|^[a-zA-Z0-9]+(?:[-_\\\\.][a-zA-Z0-9]+)*$\"\n                    }\n                },\n                \"ides\": {\n                    \"target\": \"com.amazonaws.codecatalyst#IdeConfigurationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Information about the integrated development environment (IDE) configured for a Dev Environment.</p>\"\n                    }\n                },\n                \"instanceType\": {\n                    \"target\": \"com.amazonaws.codecatalyst#InstanceType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon EC2 instace type to use for the Dev Environment. </p>\\n         <note>\\n            <p>Changing this value will cause a restart of the Dev Environment if it is running.</p>\\n         </note>\"\n                    }\n                },\n                \"inactivityTimeoutMinutes\": {\n                    \"target\": \"com.amazonaws.codecatalyst#InactivityTimeoutMinutes\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The amount of time the Dev Environment will run without any activity detected before stopping, in minutes. \\n      Only whole integers are allowed. Dev Environments consume compute minutes when running.</p>\\n         <note>\\n            <p>Changing this value will cause a restart of the Dev Environment if it is running.</p>\\n         </note>\"\n                    }\n                },\n                \"clientToken\": {\n                    \"target\": \"com.amazonaws.codecatalyst#ClientToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A user-specified idempotency token.  Idempotency ensures that an API request completes only once. \\n       With an idempotent request, if the original request completes successfully, the subsequent retries return the result from the original successful request and have no additional effect.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#UpdateDevEnvironmentResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"id\": {\n                    \"target\": \"com.amazonaws.codecatalyst#Uuid\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The system-generated unique ID of the Dev Environment. </p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#resourceIdentifier\": \"devEnvironmentId\"\n                    }\n                },\n                \"spaceName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the space.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"projectName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the project in the space.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"alias\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The user-specified alias for the Dev Environment.</p>\",\n                        \"smithy.api#length\": {\n                            \"min\": 1,\n                            \"max\": 128\n                        },\n                        \"smithy.api#pattern\": \"^[a-zA-Z0-9]+(?:[-_\\\\.][a-zA-Z0-9]+)*$\"\n                    }\n                },\n                \"ides\": {\n                    \"target\": \"com.amazonaws.codecatalyst#IdeConfigurationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Information about the integrated development environment (IDE) configured for the Dev Environment.</p>\"\n                    }\n                },\n                \"instanceType\": {\n                    \"target\": \"com.amazonaws.codecatalyst#InstanceType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon EC2 instace type to use for the Dev Environment. </p>\"\n                    }\n                },\n                \"inactivityTimeoutMinutes\": {\n                    \"target\": \"com.amazonaws.codecatalyst#InactivityTimeoutMinutes\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The amount of time the Dev Environment will run without any activity detected before stopping, in minutes. </p>\"\n                    }\n                },\n                \"clientToken\": {\n                    \"target\": \"com.amazonaws.codecatalyst#ClientToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A user-specified idempotency token.  Idempotency ensures that an API request completes only once. \\n       With an idempotent request, if the original request completes successfully, the subsequent retries return the result from the original successful request and have no additional effect.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#UpdateProject\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.codecatalyst#UpdateProjectRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.codecatalyst#UpdateProjectResponse\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Changes one or more values for a project.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"PATCH\",\n                    \"uri\": \"/v1/spaces/{spaceName}/projects/{name}\",\n                    \"code\": 200\n                },\n                \"smithy.api#idempotent\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#UpdateProjectRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"spaceName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the space.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"name\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the project.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {},\n                        \"smithy.api#resourceIdentifier\": \"projectName\"\n                    }\n                },\n                \"description\": {\n                    \"target\": \"com.amazonaws.codecatalyst#ProjectDescription\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The description of the project.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#UpdateProjectResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"spaceName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the space.</p>\"\n                    }\n                },\n                \"name\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the project.</p>\"\n                    }\n                },\n                \"displayName\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The friendly name of the project displayed to users in Amazon CodeCatalyst.</p>\"\n                    }\n                },\n                \"description\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The description of the project.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#UpdateSpace\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.codecatalyst#UpdateSpaceRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.codecatalyst#UpdateSpaceResponse\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Changes one or more values for a space.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"PATCH\",\n                    \"uri\": \"/v1/spaces/{name}\",\n                    \"code\": 200\n                },\n                \"smithy.api#idempotent\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#UpdateSpaceRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"name\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the space.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {},\n                        \"smithy.api#resourceIdentifier\": \"spaceName\"\n                    }\n                },\n                \"description\": {\n                    \"target\": \"com.amazonaws.codecatalyst#SpaceDescription\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The description of the space.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#UpdateSpaceResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"name\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the space.</p>\"\n                    }\n                },\n                \"displayName\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The friendly name of the space displayed to users in Amazon CodeCatalyst.</p>\"\n                    }\n                },\n                \"description\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The description of the space.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#UserIdentity\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"userType\": {\n                    \"target\": \"com.amazonaws.codecatalyst#UserType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The role assigned to the user in a Amazon CodeCatalyst space or project when the event occurred.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"principalId\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the Amazon CodeCatalyst service principal.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"userName\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The display name of the user in Amazon CodeCatalyst.</p>\"\n                    }\n                },\n                \"awsAccountId\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account number of the user in Amazon Web Services, if any.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about a user whose activity is recorded in an event for a space.</p>\"\n            }\n        },\n        \"com.amazonaws.codecatalyst#UserType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#enum\": [\n                    {\n                        \"name\": \"USER\",\n                        \"value\": \"USER\"\n                    },\n                    {\n                        \"name\": \"AWS_ACCOUNT\",\n                        \"value\": \"AWS_ACCOUNT\"\n                    },\n                    {\n                        \"name\": \"UNKNOWN\",\n                        \"value\": \"UNKNOWN\"\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.codecatalyst#Uuid\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#pattern\": \"^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$\"\n            }\n        },\n        \"com.amazonaws.codecatalyst#ValidationException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The request was denied because an input failed to satisfy the constraints specified by the service. Check the spelling and input requirements, and then try again.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.codecatalyst#VerifySession\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.codecatalyst#VerifySessionResponse\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Verifies whether the calling user has a valid Amazon CodeCatalyst login and session.  If successful, this returns the ID of the user in Amazon CodeCatalyst.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/session\",\n                    \"code\": 200\n                },\n                \"smithy.api#readonly\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#VerifySessionResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"identity\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The system-generated unique ID of the user in Amazon CodeCatalyst.</p>\",\n                        \"smithy.api#length\": {\n                            \"min\": 1,\n                            \"max\": 256\n                        }\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.codecatalyst#Workflow\": {\n            \"type\": \"resource\",\n            \"identifiers\": {\n                \"spaceName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\"\n                },\n                \"projectName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\"\n                },\n                \"workflowId\": {\n                    \"target\": \"com.amazonaws.codecatalyst#Uuid\"\n                }\n            },\n            \"read\": {\n                \"target\": \"com.amazonaws.codecatalyst#GetWorkflow\"\n            },\n            \"list\": {\n                \"target\": \"com.amazonaws.codecatalyst#ListWorkflows\"\n            }\n        },\n        \"com.amazonaws.codecatalyst#WorkflowDefinition\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"path\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The path to the workflow definition file stored in the source repository for the project, including the file name.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about a workflow definition file.</p>\"\n            }\n        },\n        \"com.amazonaws.codecatalyst#WorkflowDefinitionSummary\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"path\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The path to the workflow definition file stored in the source repository for the project, including the file name.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about a workflow definition.</p>\"\n            }\n        },\n        \"com.amazonaws.codecatalyst#WorkflowRun\": {\n            \"type\": \"resource\",\n            \"identifiers\": {\n                \"spaceName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\"\n                },\n                \"projectName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#NameString\"\n                },\n                \"workflowRunId\": {\n                    \"target\": \"com.amazonaws.codecatalyst#Uuid\"\n                }\n            },\n            \"create\": {\n                \"target\": \"com.amazonaws.codecatalyst#StartWorkflowRun\"\n            },\n            \"read\": {\n                \"target\": \"com.amazonaws.codecatalyst#GetWorkflowRun\"\n            },\n            \"list\": {\n                \"target\": \"com.amazonaws.codecatalyst#ListWorkflowRuns\"\n            }\n        },\n        \"com.amazonaws.codecatalyst#WorkflowRunMode\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#enum\": [\n                    {\n                        \"name\": \"QUEUED\",\n                        \"value\": \"QUEUED\"\n                    },\n                    {\n                        \"name\": \"PARALLEL\",\n                        \"value\": \"PARALLEL\"\n                    },\n                    {\n                        \"name\": \"SUPERSEDED\",\n                        \"value\": \"SUPERSEDED\"\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.codecatalyst#WorkflowRunSortCriteria\": {\n            \"type\": \"structure\",\n            \"members\": {},\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information used to sort workflow runs in the returned list.</p>\"\n            }\n        },\n        \"com.amazonaws.codecatalyst#WorkflowRunSortCriteriaList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.codecatalyst#WorkflowRunSortCriteria\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"max\": 1\n                }\n            }\n        },\n        \"com.amazonaws.codecatalyst#WorkflowRunStatus\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#enum\": [\n                    {\n                        \"name\": \"SUCCEEDED\",\n                        \"value\": \"SUCCEEDED\"\n                    },\n                    {\n                        \"name\": \"FAILED\",\n                        \"value\": \"FAILED\"\n                    },\n                    {\n                        \"name\": \"STOPPED\",\n                        \"value\": \"STOPPED\"\n                    },\n                    {\n                        \"name\": \"SUPERSEDED\",\n                        \"value\": \"SUPERSEDED\"\n                    },\n                    {\n                        \"name\": \"CANCELLED\",\n                        \"value\": \"CANCELLED\"\n                    },\n                    {\n                        \"name\": \"NOT_RUN\",\n                        \"value\": \"NOT_RUN\"\n                    },\n                    {\n                        \"name\": \"VALIDATING\",\n                        \"value\": \"VALIDATING\"\n                    },\n                    {\n                        \"name\": \"PROVISIONING\",\n                        \"value\": \"PROVISIONING\"\n                    },\n                    {\n                        \"name\": \"IN_PROGRESS\",\n                        \"value\": \"IN_PROGRESS\"\n                    },\n                    {\n                        \"name\": \"STOPPING\",\n                        \"value\": \"STOPPING\"\n                    },\n                    {\n                        \"name\": \"ABANDONED\",\n                        \"value\": \"ABANDONED\"\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.codecatalyst#WorkflowRunStatusReason\": {\n            \"type\": \"structure\",\n            \"members\": {},\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about the status of a workflow run.</p>\"\n            }\n        },\n        \"com.amazonaws.codecatalyst#WorkflowRunStatusReasons\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.codecatalyst#WorkflowRunStatusReason\"\n            }\n        },\n        \"com.amazonaws.codecatalyst#WorkflowRunSummaries\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.codecatalyst#WorkflowRunSummary\"\n            }\n        },\n        \"com.amazonaws.codecatalyst#WorkflowRunSummary\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"id\": {\n                    \"target\": \"com.amazonaws.codecatalyst#Uuid\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The system-generated unique ID of the workflow run.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#resourceIdentifier\": \"workflowRunId\"\n                    }\n                },\n                \"workflowId\": {\n                    \"target\": \"com.amazonaws.codecatalyst#Uuid\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The system-generated unique ID of the workflow.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"workflowName\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the workflow.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"status\": {\n                    \"target\": \"com.amazonaws.codecatalyst#WorkflowRunStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The status of the workflow run.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"statusReasons\": {\n                    \"target\": \"com.amazonaws.codecatalyst#WorkflowRunStatusReasons\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The reasons for the workflow run status.</p>\"\n                    }\n                },\n                \"startTime\": {\n                    \"target\": \"com.amazonaws.codecatalyst#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time the workflow run began, in coordinated universal time (UTC) timestamp format as specified in <a href=\\\"https://www.rfc-editor.org/rfc/rfc3339#section-5.6\\\">RFC 3339</a>.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#timestampFormat\": \"date-time\"\n                    }\n                },\n                \"endTime\": {\n                    \"target\": \"com.amazonaws.codecatalyst#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time the workflow run ended, in coordinated universal time (UTC) timestamp format as specified in <a href=\\\"https://www.rfc-editor.org/rfc/rfc3339#section-5.6\\\">RFC 3339</a>\\n         </p>\",\n                        \"smithy.api#timestampFormat\": \"date-time\"\n                    }\n                },\n                \"lastUpdatedTime\": {\n                    \"target\": \"com.amazonaws.codecatalyst#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time the workflow was last updated, in coordinated universal time (UTC) timestamp format as specified in <a href=\\\"https://www.rfc-editor.org/rfc/rfc3339#section-5.6\\\">RFC 3339</a>\\n         </p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#timestampFormat\": \"date-time\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about a workflow run.</p>\"\n            }\n        },\n        \"com.amazonaws.codecatalyst#WorkflowSortCriteria\": {\n            \"type\": \"structure\",\n            \"members\": {},\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information used to sort workflows in the returned list.</p>\"\n            }\n        },\n        \"com.amazonaws.codecatalyst#WorkflowSortCriteriaList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.codecatalyst#WorkflowSortCriteria\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"max\": 1\n                }\n            }\n        },\n        \"com.amazonaws.codecatalyst#WorkflowStatus\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#enum\": [\n                    {\n                        \"name\": \"INVALID\",\n                        \"value\": \"INVALID\"\n                    },\n                    {\n                        \"name\": \"ACTIVE\",\n                        \"value\": \"ACTIVE\"\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.codecatalyst#WorkflowSummaries\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.codecatalyst#WorkflowSummary\"\n            }\n        },\n        \"com.amazonaws.codecatalyst#WorkflowSummary\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"id\": {\n                    \"target\": \"com.amazonaws.codecatalyst#Uuid\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The system-generated unique ID of a workflow.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#resourceIdentifier\": \"workflowId\"\n                    }\n                },\n                \"name\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the workflow.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"sourceRepositoryName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#SourceRepositoryNameString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the source repository where the workflow definition file is stored.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"sourceBranchName\": {\n                    \"target\": \"com.amazonaws.codecatalyst#SourceRepositoryBranchString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the branch of the source repository where the workflow definition file is stored.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"definition\": {\n                    \"target\": \"com.amazonaws.codecatalyst#WorkflowDefinitionSummary\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Information about the workflow definition file.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"createdTime\": {\n                    \"target\": \"com.amazonaws.codecatalyst#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time the workflow was created, in coordinated universal time (UTC) timestamp format as specified in <a href=\\\"https://www.rfc-editor.org/rfc/rfc3339#section-5.6\\\">RFC 3339</a>\\n         </p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#timestampFormat\": \"date-time\"\n                    }\n                },\n                \"lastUpdatedTime\": {\n                    \"target\": \"com.amazonaws.codecatalyst#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time the workflow was last updated, in coordinated universal time (UTC) timestamp format as specified in <a href=\\\"https://www.rfc-editor.org/rfc/rfc3339#section-5.6\\\">RFC 3339</a>\\n         </p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#timestampFormat\": \"date-time\"\n                    }\n                },\n                \"runMode\": {\n                    \"target\": \"com.amazonaws.codecatalyst#WorkflowRunMode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The run mode of the workflow.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"status\": {\n                    \"target\": \"com.amazonaws.codecatalyst#WorkflowStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The status of the workflow.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about a workflow.</p>\"\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "aws/sdk/aws-models/config-service.json",
    "content": "{\n    \"smithy\": \"2.0\",\n    \"metadata\": {\n        \"suppressions\": [\n            {\n                \"id\": \"HttpMethodSemantics\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"HttpResponseCodeSemantics\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"PaginatedTrait\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"HttpHeaderTrait\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"HttpUriConflict\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"Service\",\n                \"namespace\": \"*\"\n            }\n        ]\n    },\n    \"shapes\": {\n        \"com.amazonaws.configservice#ARN\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.configservice#AccountAggregationSource\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountIds\": {\n                    \"target\": \"com.amazonaws.configservice#AccountAggregationSourceAccountList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The 12-digit account ID of the account being aggregated.\\n\\t\\t</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"AllAwsRegions\": {\n                    \"target\": \"com.amazonaws.configservice#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>If true, aggregate existing Config regions and future\\n\\t\\t\\tregions.</p>\"\n                    }\n                },\n                \"AwsRegions\": {\n                    \"target\": \"com.amazonaws.configservice#AggregatorRegionList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The source regions being aggregated.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A collection of accounts and regions.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#AccountAggregationSourceAccountList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#AccountId\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1\n                }\n            }\n        },\n        \"com.amazonaws.configservice#AccountAggregationSourceList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#AccountAggregationSource\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 1\n                }\n            }\n        },\n        \"com.amazonaws.configservice#AccountId\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#pattern\": \"^\\\\d{12}$\"\n            }\n        },\n        \"com.amazonaws.configservice#AggregateComplianceByConfigRule\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConfigRuleName\": {\n                    \"target\": \"com.amazonaws.configservice#ConfigRuleName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the Config rule.</p>\"\n                    }\n                },\n                \"Compliance\": {\n                    \"target\": \"com.amazonaws.configservice#Compliance\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether an Amazon Web Services resource or Config rule is\\n\\t\\t\\tcompliant and provides the number of contributors that affect the\\n\\t\\t\\tcompliance.</p>\"\n                    }\n                },\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.configservice#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The 12-digit account ID of the source account.</p>\"\n                    }\n                },\n                \"AwsRegion\": {\n                    \"target\": \"com.amazonaws.configservice#AwsRegion\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The source region from where the data is aggregated.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Indicates whether an Config rule is compliant based on\\n\\t\\t\\taccount ID, region, compliance, and rule name.</p>\\n         <p>A rule is compliant if all of the resources that the rule\\n\\t\\t\\tevaluated comply with it. It is noncompliant if any of these\\n\\t\\t\\tresources do not comply.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#AggregateComplianceByConfigRuleList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#AggregateComplianceByConfigRule\"\n            }\n        },\n        \"com.amazonaws.configservice#AggregateComplianceByConformancePack\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConformancePackName\": {\n                    \"target\": \"com.amazonaws.configservice#ConformancePackName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the conformance pack.</p>\"\n                    }\n                },\n                \"Compliance\": {\n                    \"target\": \"com.amazonaws.configservice#AggregateConformancePackCompliance\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The compliance status of the conformance pack.</p>\"\n                    }\n                },\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.configservice#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The 12-digit Amazon Web Services account ID of the source account.</p>\"\n                    }\n                },\n                \"AwsRegion\": {\n                    \"target\": \"com.amazonaws.configservice#AwsRegion\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The source Amazon Web Services Region from where the data is aggregated.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Provides aggregate compliance of the conformance pack. Indicates whether a conformance pack is compliant based on the name of the conformance pack, account ID, and region.</p>\\n         <p>A conformance pack is compliant if all of the rules in a conformance packs are compliant. It is noncompliant if any of the rules are not compliant.\\n\\t\\t\\tThe compliance status of a conformance pack is INSUFFICIENT_DATA only if all rules within a conformance pack cannot be evaluated due to insufficient data.\\n\\t\\t\\tIf some of the rules in a conformance pack are compliant but the compliance status of other rules in that same conformance pack is INSUFFICIENT_DATA, the conformance pack shows \\n\\t\\t\\tcompliant.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#AggregateComplianceByConformancePackList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#AggregateComplianceByConformancePack\"\n            }\n        },\n        \"com.amazonaws.configservice#AggregateComplianceCount\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"GroupName\": {\n                    \"target\": \"com.amazonaws.configservice#StringWithCharLimit256\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The 12-digit account ID or region based on the GroupByKey\\n\\t\\t\\tvalue.</p>\"\n                    }\n                },\n                \"ComplianceSummary\": {\n                    \"target\": \"com.amazonaws.configservice#ComplianceSummary\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of compliant and noncompliant Config\\n\\t\\t\\trules.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns the number of compliant and noncompliant rules for one\\n\\t\\t\\tor more accounts and regions in an aggregator.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#AggregateComplianceCountList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#AggregateComplianceCount\"\n            }\n        },\n        \"com.amazonaws.configservice#AggregateConformancePackCompliance\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ComplianceType\": {\n                    \"target\": \"com.amazonaws.configservice#ConformancePackComplianceType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The compliance status of the conformance pack.</p>\"\n                    }\n                },\n                \"CompliantRuleCount\": {\n                    \"target\": \"com.amazonaws.configservice#Integer\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The number of compliant Config Rules.</p>\"\n                    }\n                },\n                \"NonCompliantRuleCount\": {\n                    \"target\": \"com.amazonaws.configservice#Integer\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The number of noncompliant Config Rules.</p>\"\n                    }\n                },\n                \"TotalRuleCount\": {\n                    \"target\": \"com.amazonaws.configservice#Integer\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>Total number of compliant rules, noncompliant rules, and the rules that do not have any applicable resources to evaluate upon resulting in insufficient data.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Provides the number of compliant and noncompliant rules within a conformance pack.\\n\\t\\t\\tAlso provides the compliance status of the conformance pack and the total rule count which includes compliant rules, noncompliant rules, and rules that cannot be evaluated due to insufficient data.</p>\\n         <p>A conformance pack is compliant if all of the rules in a conformance packs are compliant. It is noncompliant if any of the rules are not compliant.\\n\\t\\t\\tThe compliance status of a conformance pack is INSUFFICIENT_DATA only if all rules within a conformance pack cannot be evaluated due to insufficient data.\\n\\t\\t\\tIf some of the rules in a conformance pack are compliant but the compliance status of other rules in that same conformance pack is INSUFFICIENT_DATA, the conformance pack shows compliant.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#AggregateConformancePackComplianceCount\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CompliantConformancePackCount\": {\n                    \"target\": \"com.amazonaws.configservice#Integer\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>Number of compliant conformance packs.</p>\"\n                    }\n                },\n                \"NonCompliantConformancePackCount\": {\n                    \"target\": \"com.amazonaws.configservice#Integer\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>Number of noncompliant conformance packs.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The number of conformance packs that are compliant and noncompliant.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#AggregateConformancePackComplianceFilters\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConformancePackName\": {\n                    \"target\": \"com.amazonaws.configservice#ConformancePackName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the conformance pack.</p>\"\n                    }\n                },\n                \"ComplianceType\": {\n                    \"target\": \"com.amazonaws.configservice#ConformancePackComplianceType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The compliance status of the conformance pack.</p>\"\n                    }\n                },\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.configservice#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The 12-digit Amazon Web Services account ID of the source account.</p>\"\n                    }\n                },\n                \"AwsRegion\": {\n                    \"target\": \"com.amazonaws.configservice#AwsRegion\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The source Amazon Web Services Region from where the data is aggregated.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Filters the conformance packs based on an account ID, region, compliance type, and the name of the conformance pack.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#AggregateConformancePackComplianceSummary\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ComplianceSummary\": {\n                    \"target\": \"com.amazonaws.configservice#AggregateConformancePackComplianceCount\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Returns an <code>AggregateConformancePackComplianceCount</code> object. </p>\"\n                    }\n                },\n                \"GroupName\": {\n                    \"target\": \"com.amazonaws.configservice#StringWithCharLimit256\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Groups the result based on Amazon Web Services account ID or Amazon Web Services Region.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Provides a summary of compliance based on either account ID or region. </p>\"\n            }\n        },\n        \"com.amazonaws.configservice#AggregateConformancePackComplianceSummaryFilters\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.configservice#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The 12-digit Amazon Web Services account ID of the source account.</p>\"\n                    }\n                },\n                \"AwsRegion\": {\n                    \"target\": \"com.amazonaws.configservice#AwsRegion\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The source Amazon Web Services Region from where the data is aggregated.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Filters the results based on account ID and region. </p>\"\n            }\n        },\n        \"com.amazonaws.configservice#AggregateConformancePackComplianceSummaryGroupKey\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ACCOUNT_ID\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ACCOUNT_ID\"\n                    }\n                },\n                \"AWS_REGION\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS_REGION\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.configservice#AggregateConformancePackComplianceSummaryList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#AggregateConformancePackComplianceSummary\"\n            }\n        },\n        \"com.amazonaws.configservice#AggregateEvaluationResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"EvaluationResultIdentifier\": {\n                    \"target\": \"com.amazonaws.configservice#EvaluationResultIdentifier\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Uniquely identifies the evaluation result.</p>\"\n                    }\n                },\n                \"ComplianceType\": {\n                    \"target\": \"com.amazonaws.configservice#ComplianceType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The resource compliance status.</p>\\n         <p>For the <code>AggregationEvaluationResult</code> data type, Config supports only the <code>COMPLIANT</code> and\\n\\t\\t\\t\\t<code>NON_COMPLIANT</code>. Config does not support the\\n\\t\\t\\t\\t<code>NOT_APPLICABLE</code> and <code>INSUFFICIENT_DATA</code>\\n\\t\\t\\tvalue.</p>\"\n                    }\n                },\n                \"ResultRecordedTime\": {\n                    \"target\": \"com.amazonaws.configservice#Date\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time when Config recorded the aggregate evaluation\\n\\t\\t\\tresult.</p>\"\n                    }\n                },\n                \"ConfigRuleInvokedTime\": {\n                    \"target\": \"com.amazonaws.configservice#Date\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time when the Config rule evaluated the Amazon Web Services\\n\\t\\t\\tresource.</p>\"\n                    }\n                },\n                \"Annotation\": {\n                    \"target\": \"com.amazonaws.configservice#StringWithCharLimit256\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Supplementary information about how the agrregate evaluation\\n\\t\\t\\tdetermined the compliance.</p>\"\n                    }\n                },\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.configservice#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The 12-digit account ID of the source account.</p>\"\n                    }\n                },\n                \"AwsRegion\": {\n                    \"target\": \"com.amazonaws.configservice#AwsRegion\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The source region from where the data is aggregated.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The details of an Config evaluation for an account ID and\\n\\t\\t\\tregion in an aggregator. Provides the Amazon Web Services resource that was\\n\\t\\t\\tevaluated, the compliance of the resource, related time stamps, and\\n\\t\\t\\tsupplementary information. </p>\"\n            }\n        },\n        \"com.amazonaws.configservice#AggregateEvaluationResultList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#AggregateEvaluationResult\"\n            }\n        },\n        \"com.amazonaws.configservice#AggregateResourceIdentifier\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SourceAccountId\": {\n                    \"target\": \"com.amazonaws.configservice#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The 12-digit account ID of the source account.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"SourceRegion\": {\n                    \"target\": \"com.amazonaws.configservice#AwsRegion\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The source region where data is aggregated.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ResourceId\": {\n                    \"target\": \"com.amazonaws.configservice#ResourceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the Amazon Web Services resource.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ResourceType\": {\n                    \"target\": \"com.amazonaws.configservice#ResourceType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of the Amazon Web Services resource.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ResourceName\": {\n                    \"target\": \"com.amazonaws.configservice#ResourceName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the Amazon Web Services resource.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The details that identify a resource that is collected by Config aggregator, including the resource type, ID, (if available) the custom resource name, the source account, and source region.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#AggregatedSourceStatus\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SourceId\": {\n                    \"target\": \"com.amazonaws.configservice#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The source account ID or an organization.</p>\"\n                    }\n                },\n                \"SourceType\": {\n                    \"target\": \"com.amazonaws.configservice#AggregatedSourceType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The source account or an organization.</p>\"\n                    }\n                },\n                \"AwsRegion\": {\n                    \"target\": \"com.amazonaws.configservice#AwsRegion\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The region authorized to collect aggregated data.</p>\"\n                    }\n                },\n                \"LastUpdateStatus\": {\n                    \"target\": \"com.amazonaws.configservice#AggregatedSourceStatusType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Filters the last updated status type.</p>\\n         <ul>\\n            <li>\\n               <p>Valid value FAILED indicates errors while moving\\n\\t\\t\\t\\t\\tdata.</p>\\n            </li>\\n            <li>\\n               <p>Valid value SUCCEEDED indicates the data was\\n\\t\\t\\t\\t\\tsuccessfully moved.</p>\\n            </li>\\n            <li>\\n               <p>Valid value OUTDATED indicates the data is not the most\\n\\t\\t\\t\\t\\trecent.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"LastUpdateTime\": {\n                    \"target\": \"com.amazonaws.configservice#Date\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time of the last update.</p>\"\n                    }\n                },\n                \"LastErrorCode\": {\n                    \"target\": \"com.amazonaws.configservice#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The error code that Config returned when the source account\\n\\t\\t\\taggregation last failed.</p>\"\n                    }\n                },\n                \"LastErrorMessage\": {\n                    \"target\": \"com.amazonaws.configservice#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The message indicating that the source account aggregation\\n\\t\\t\\tfailed due to an error.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The current sync status between the source and the aggregator\\n\\t\\t\\taccount.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#AggregatedSourceStatusList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#AggregatedSourceStatus\"\n            }\n        },\n        \"com.amazonaws.configservice#AggregatedSourceStatusType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"FAILED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"FAILED\"\n                    }\n                },\n                \"SUCCEEDED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"SUCCEEDED\"\n                    }\n                },\n                \"OUTDATED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"OUTDATED\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.configservice#AggregatedSourceStatusTypeList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#AggregatedSourceStatusType\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1\n                }\n            }\n        },\n        \"com.amazonaws.configservice#AggregatedSourceType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ACCOUNT\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ACCOUNT\"\n                    }\n                },\n                \"ORGANIZATION\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ORGANIZATION\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.configservice#AggregationAuthorization\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AggregationAuthorizationArn\": {\n                    \"target\": \"com.amazonaws.configservice#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the aggregation\\n\\t\\t\\tobject.</p>\"\n                    }\n                },\n                \"AuthorizedAccountId\": {\n                    \"target\": \"com.amazonaws.configservice#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The 12-digit account ID of the account authorized to aggregate\\n\\t\\t\\tdata.</p>\"\n                    }\n                },\n                \"AuthorizedAwsRegion\": {\n                    \"target\": \"com.amazonaws.configservice#AwsRegion\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The region authorized to collect aggregated data.</p>\"\n                    }\n                },\n                \"CreationTime\": {\n                    \"target\": \"com.amazonaws.configservice#Date\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time stamp when the aggregation authorization was\\n\\t\\t\\tcreated.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>An object that represents the authorizations granted to\\n\\t\\t\\taggregator accounts and regions.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#AggregationAuthorizationList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#AggregationAuthorization\"\n            }\n        },\n        \"com.amazonaws.configservice#AggregatorFilterResourceType\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Type\": {\n                    \"target\": \"com.amazonaws.configservice#AggregatorFilterType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of resource type filter to apply. <code>INCLUDE</code> specifies that the list of resource types in the <code>Value</code> field will be aggregated and no other resource types will be filtered.</p>\"\n                    }\n                },\n                \"Value\": {\n                    \"target\": \"com.amazonaws.configservice#ResourceTypeValueList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Comma-separate list of resource types to filter your aggregated configuration recorders.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>An object to filter the configuration recorders based on the resource types in scope for recording.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#AggregatorFilterServicePrincipal\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Type\": {\n                    \"target\": \"com.amazonaws.configservice#AggregatorFilterType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of service principal filter to apply. <code>INCLUDE</code> specifies that the list of service principals in the <code>Value</code> field will be aggregated and no other service principals will be filtered.</p>\"\n                    }\n                },\n                \"Value\": {\n                    \"target\": \"com.amazonaws.configservice#ServicePrincipalValueList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Comma-separated list of service principals for the linked Amazon Web Services services to filter your aggregated service-linked configuration recorders.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>An object to filter service-linked configuration recorders in an aggregator based on the linked Amazon Web Services service.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#AggregatorFilterType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"INCLUDE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"INCLUDE\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.configservice#AggregatorFilters\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ResourceType\": {\n                    \"target\": \"com.amazonaws.configservice#AggregatorFilterResourceType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An object to filter the configuration recorders based on the resource types in scope for recording.</p>\"\n                    }\n                },\n                \"ServicePrincipal\": {\n                    \"target\": \"com.amazonaws.configservice#AggregatorFilterServicePrincipal\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An object to filter service-linked configuration recorders in an aggregator based on the linked Amazon Web Services service.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>An object to filter the data you specify for an aggregator.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#AggregatorRegionList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#String\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1\n                }\n            }\n        },\n        \"com.amazonaws.configservice#AllSupported\": {\n            \"type\": \"boolean\",\n            \"traits\": {\n                \"smithy.api#default\": false\n            }\n        },\n        \"com.amazonaws.configservice#AmazonResourceName\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.configservice#Annotation\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 256\n                }\n            }\n        },\n        \"com.amazonaws.configservice#AssociateResourceTypes\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#AssociateResourceTypesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.configservice#AssociateResourceTypesResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#ConflictException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#NoSuchConfigurationRecorderException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Adds all resource types specified in the <code>ResourceTypes</code> list to the <a href=\\\"https://docs.aws.amazon.com/config/latest/APIReference/API_RecordingGroup.html\\\">RecordingGroup</a> of specified configuration recorder and includes those resource types when recording.</p>\\n         <p>For this operation, the specified configuration recorder must use a <a href=\\\"https://docs.aws.amazon.com/config/latest/APIReference/API_RecordingStrategy.html\\\">RecordingStrategy</a> that is either <code>INCLUSION_BY_RESOURCE_TYPES</code> or <code>EXCLUSION_BY_RESOURCE_TYPES</code>.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#AssociateResourceTypesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConfigurationRecorderArn\": {\n                    \"target\": \"com.amazonaws.configservice#AmazonResourceName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the specified configuration recorder.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ResourceTypes\": {\n                    \"target\": \"com.amazonaws.configservice#ResourceTypeList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The list of resource types you want to add to the recording group of the specified configuration recorder.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#AssociateResourceTypesResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConfigurationRecorder\": {\n                    \"target\": \"com.amazonaws.configservice#ConfigurationRecorder\",\n                    \"traits\": {\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.configservice#AutoRemediationAttemptSeconds\": {\n            \"type\": \"long\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 2678000\n                }\n            }\n        },\n        \"com.amazonaws.configservice#AutoRemediationAttempts\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 25\n                }\n            }\n        },\n        \"com.amazonaws.configservice#AvailabilityZone\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.configservice#AwsRegion\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 64\n                }\n            }\n        },\n        \"com.amazonaws.configservice#BaseConfigurationItem\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"version\": {\n                    \"target\": \"com.amazonaws.configservice#Version\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The version number of the resource configuration.</p>\"\n                    }\n                },\n                \"accountId\": {\n                    \"target\": \"com.amazonaws.configservice#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The 12-digit Amazon Web Services account ID associated with the resource.</p>\"\n                    }\n                },\n                \"configurationItemCaptureTime\": {\n                    \"target\": \"com.amazonaws.configservice#ConfigurationItemCaptureTime\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time when the recording of configuration changes was initiated for the resource.</p>\"\n                    }\n                },\n                \"configurationItemStatus\": {\n                    \"target\": \"com.amazonaws.configservice#ConfigurationItemStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The configuration item status. Valid values include:</p>\\n         <ul>\\n            <li>\\n               <p>OK – The resource configuration has been updated.</p>\\n            </li>\\n            <li>\\n               <p>ResourceDiscovered – The resource was newly discovered.</p>\\n            </li>\\n            <li>\\n               <p>ResourceNotRecorded – The resource was discovered, but its configuration was not recorded since the recorder doesn't record resources of this type.</p>\\n            </li>\\n            <li>\\n               <p>ResourceDeleted – The resource was deleted</p>\\n            </li>\\n            <li>\\n               <p>ResourceDeletedNotRecorded – The resource was deleted, but its configuration was not recorded since the recorder doesn't record resources of this type.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"configurationStateId\": {\n                    \"target\": \"com.amazonaws.configservice#ConfigurationStateId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An identifier that indicates the ordering of the configuration\\n\\t\\t\\titems of a resource.</p>\"\n                    }\n                },\n                \"arn\": {\n                    \"target\": \"com.amazonaws.configservice#ARN\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the resource.</p>\"\n                    }\n                },\n                \"resourceType\": {\n                    \"target\": \"com.amazonaws.configservice#ResourceType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of Amazon Web Services resource.</p>\"\n                    }\n                },\n                \"resourceId\": {\n                    \"target\": \"com.amazonaws.configservice#ResourceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the resource (for example., sg-xxxxxx).</p>\"\n                    }\n                },\n                \"resourceName\": {\n                    \"target\": \"com.amazonaws.configservice#ResourceName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The custom name of the resource, if available.</p>\"\n                    }\n                },\n                \"awsRegion\": {\n                    \"target\": \"com.amazonaws.configservice#AwsRegion\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The region where the resource resides.</p>\"\n                    }\n                },\n                \"availabilityZone\": {\n                    \"target\": \"com.amazonaws.configservice#AvailabilityZone\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Availability Zone associated with the resource.</p>\"\n                    }\n                },\n                \"resourceCreationTime\": {\n                    \"target\": \"com.amazonaws.configservice#ResourceCreationTime\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time stamp when the resource was created.</p>\"\n                    }\n                },\n                \"configuration\": {\n                    \"target\": \"com.amazonaws.configservice#Configuration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A JSON-encoded string that contains the contents for the resource configuration. This string needs to be deserialized using <code>json.loads()</code> before you can access the contents.\\n</p>\"\n                    }\n                },\n                \"supplementaryConfiguration\": {\n                    \"target\": \"com.amazonaws.configservice#SupplementaryConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A string to string map that contains additional contents for the resource configuration.Config returns this field for certain\\n\\t\\t\\tresource types to supplement the information returned for the\\n\\t\\t\\t<code>configuration</code> field.</p>\\n         <p>This string needs to be deserialized using <code>json.loads()</code> before you can access the contents.</p>\"\n                    }\n                },\n                \"recordingFrequency\": {\n                    \"target\": \"com.amazonaws.configservice#RecordingFrequency\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The recording frequency that Config uses to record configuration changes for the resource.</p>\\n         <note>\\n            <p>This field only appears in the API response when <code>DAILY</code> recording is enabled for a resource type.\\n\\t\\t\\t\\tIf this field is not present, <code>CONTINUOUS</code> recording is enabled for that resource type. For more information on daily recording and continuous recording, see <a href=\\\"https://docs.aws.amazon.com/config/latest/developerguide/select-resources.html#select-resources-recording-frequency\\\">Recording Frequency</a> in the <i>Config\\n\\t\\t\\t\\t\\t\\tDeveloper Guide</i>.</p>\\n         </note>\"\n                    }\n                },\n                \"configurationItemDeliveryTime\": {\n                    \"target\": \"com.amazonaws.configservice#ConfigurationItemDeliveryTime\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time when configuration changes for the resource were delivered.</p>\\n         <note>\\n            <p>This field is optional and is not guaranteed to be present in a configuration item  (CI). If you are using daily recording,\\n\\t\\t\\tthis field will be populated. However, if you are using continuous recording,\\n\\t\\t\\tthis field will be omitted since the delivery time is instantaneous as the CI is available right away. For more information on daily recording and continuous recording, see <a href=\\\"https://docs.aws.amazon.com/config/latest/developerguide/select-resources.html#select-resources-recording-frequency\\\">Recording Frequency</a> in the <i>Config\\n\\t\\t\\t\\t\\tDeveloper Guide</i>.</p>\\n         </note>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The detailed configurations of a specified resource.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#BaseConfigurationItems\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#BaseConfigurationItem\"\n            }\n        },\n        \"com.amazonaws.configservice#BaseResourceId\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 768\n                }\n            }\n        },\n        \"com.amazonaws.configservice#BatchGetAggregateResourceConfig\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#BatchGetAggregateResourceConfigRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.configservice#BatchGetAggregateResourceConfigResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#NoSuchConfigurationAggregatorException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns the current configuration items for resources that are present in your Config aggregator. The operation also returns a list of resources that are not processed in the current request. \\n\\t\\t\\tIf there are no unprocessed resources, the operation returns an empty <code>unprocessedResourceIdentifiers</code> list. </p>\\n         <note>\\n            <ul>\\n               <li>\\n                  <p>The API does not return results for deleted resources.</p>\\n               </li>\\n               <li>\\n                  <p> The API does not return tags and relationships.</p>\\n               </li>\\n            </ul>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.configservice#BatchGetAggregateResourceConfigRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConfigurationAggregatorName\": {\n                    \"target\": \"com.amazonaws.configservice#ConfigurationAggregatorName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the configuration aggregator.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ResourceIdentifiers\": {\n                    \"target\": \"com.amazonaws.configservice#ResourceIdentifiersList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of aggregate ResourceIdentifiers objects. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#BatchGetAggregateResourceConfigResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"BaseConfigurationItems\": {\n                    \"target\": \"com.amazonaws.configservice#BaseConfigurationItems\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list that contains the current configuration of one or more resources.</p>\"\n                    }\n                },\n                \"UnprocessedResourceIdentifiers\": {\n                    \"target\": \"com.amazonaws.configservice#UnprocessedResourceIdentifierList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of resource identifiers that were not processed with current scope. The list is empty if all the resources are processed.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.configservice#BatchGetResourceConfig\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#BatchGetResourceConfigRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.configservice#BatchGetResourceConfigResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#NoAvailableConfigurationRecorderException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns the <code>BaseConfigurationItem</code> for one or more requested resources.\\n\\t\\t\\tThe operation also returns a list of resources that are\\n\\t\\t\\tnot processed in the current request. If there are no unprocessed\\n\\t\\t\\tresources, the operation returns an empty unprocessedResourceKeys\\n\\t\\t\\tlist. </p>\\n         <note>\\n            <ul>\\n               <li>\\n                  <p>The API does not return results for deleted\\n\\t\\t\\t\\t\\t\\tresources.</p>\\n               </li>\\n               <li>\\n                  <p> The API does not return any tags for the requested\\n\\t\\t\\t\\t\\t\\tresources. This information is filtered out of the\\n\\t\\t\\t\\t\\t\\tsupplementaryConfiguration section of the API\\n\\t\\t\\t\\t\\t\\tresponse.</p>\\n               </li>\\n            </ul>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.configservice#BatchGetResourceConfigRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"resourceKeys\": {\n                    \"target\": \"com.amazonaws.configservice#ResourceKeys\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of resource keys to be processed with the current\\n\\t\\t\\trequest. Each element in the list consists of the resource type and\\n\\t\\t\\tresource ID.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#BatchGetResourceConfigResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"baseConfigurationItems\": {\n                    \"target\": \"com.amazonaws.configservice#BaseConfigurationItems\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list that contains the current configuration of one or more\\n\\t\\t\\tresources.</p>\"\n                    }\n                },\n                \"unprocessedResourceKeys\": {\n                    \"target\": \"com.amazonaws.configservice#ResourceKeys\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of resource keys that were not processed with the\\n\\t\\t\\tcurrent response. The unprocessesResourceKeys value is in the same\\n\\t\\t\\tform as ResourceKeys, so the value can be directly provided to a\\n\\t\\t\\tsubsequent BatchGetResourceConfig operation.\\n\\t\\t\\t\\n\\t\\t\\tIf there are no unprocessed resource keys, the response contains an\\n\\t\\t\\tempty unprocessedResourceKeys list. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.configservice#Boolean\": {\n            \"type\": \"boolean\",\n            \"traits\": {\n                \"smithy.api#default\": false\n            }\n        },\n        \"com.amazonaws.configservice#ChannelName\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 256\n                }\n            }\n        },\n        \"com.amazonaws.configservice#ChronologicalOrder\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"Reverse\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Reverse\"\n                    }\n                },\n                \"Forward\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Forward\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.configservice#ClientToken\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 64,\n                    \"max\": 256\n                }\n            }\n        },\n        \"com.amazonaws.configservice#Compliance\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ComplianceType\": {\n                    \"target\": \"com.amazonaws.configservice#ComplianceType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether an Amazon Web Services resource or Config rule is\\n\\t\\t\\tcompliant.</p>\\n         <p>A resource is compliant if it complies with all of the Config rules that evaluate it. A resource is noncompliant if it does\\n\\t\\t\\tnot comply with one or more of these rules.</p>\\n         <p>A rule is compliant if all of the resources that the rule\\n\\t\\t\\tevaluates comply with it. A rule is noncompliant if any of these\\n\\t\\t\\tresources do not comply.</p>\\n         <p>Config returns the <code>INSUFFICIENT_DATA</code> value\\n\\t\\t\\twhen no evaluation results are available for the Amazon Web Services resource or Config rule.</p>\\n         <p>For the <code>Compliance</code> data type, Config supports\\n\\t\\t\\tonly <code>COMPLIANT</code>, <code>NON_COMPLIANT</code>, and\\n\\t\\t\\t\\t<code>INSUFFICIENT_DATA</code> values. Config does not\\n\\t\\t\\tsupport the <code>NOT_APPLICABLE</code> value for the\\n\\t\\t\\t\\t<code>Compliance</code> data type.</p>\"\n                    }\n                },\n                \"ComplianceContributorCount\": {\n                    \"target\": \"com.amazonaws.configservice#ComplianceContributorCount\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of Amazon Web Services resources or Config rules that cause a\\n\\t\\t\\tresult of <code>NON_COMPLIANT</code>, up to a maximum\\n\\t\\t\\tnumber.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Indicates whether an Amazon Web Services resource or Config rule is\\n\\t\\t\\tcompliant and provides the number of contributors that affect the\\n\\t\\t\\tcompliance.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#ComplianceByConfigRule\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConfigRuleName\": {\n                    \"target\": \"com.amazonaws.configservice#StringWithCharLimit64\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the Config rule.</p>\"\n                    }\n                },\n                \"Compliance\": {\n                    \"target\": \"com.amazonaws.configservice#Compliance\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether the Config rule is compliant.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Indicates whether an Config rule is compliant. A rule is\\n\\t\\t\\tcompliant if all of the resources that the rule evaluated comply\\n\\t\\t\\twith it. A rule is noncompliant if any of these resources do not\\n\\t\\t\\tcomply.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#ComplianceByConfigRules\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#ComplianceByConfigRule\"\n            }\n        },\n        \"com.amazonaws.configservice#ComplianceByResource\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ResourceType\": {\n                    \"target\": \"com.amazonaws.configservice#StringWithCharLimit256\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of the Amazon Web Services resource that was evaluated.</p>\"\n                    }\n                },\n                \"ResourceId\": {\n                    \"target\": \"com.amazonaws.configservice#BaseResourceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the Amazon Web Services resource that was evaluated.</p>\"\n                    }\n                },\n                \"Compliance\": {\n                    \"target\": \"com.amazonaws.configservice#Compliance\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether the Amazon Web Services resource complies with all of the Config rules that evaluated it.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Indicates whether an Amazon Web Services resource that is evaluated according\\n\\t\\t\\tto one or more Config rules is compliant. A resource is\\n\\t\\t\\tcompliant if it complies with all of the rules that evaluate it. A\\n\\t\\t\\tresource is noncompliant if it does not comply with one or more of\\n\\t\\t\\tthese rules.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#ComplianceByResources\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#ComplianceByResource\"\n            }\n        },\n        \"com.amazonaws.configservice#ComplianceContributorCount\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CappedCount\": {\n                    \"target\": \"com.amazonaws.configservice#Integer\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The number of Amazon Web Services resources or Config rules responsible for\\n\\t\\t\\tthe current compliance of the item.</p>\"\n                    }\n                },\n                \"CapExceeded\": {\n                    \"target\": \"com.amazonaws.configservice#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Indicates whether the maximum count is reached.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The number of Amazon Web Services resources or Config rules responsible for\\n\\t\\t\\tthe current compliance of the item, up to a maximum\\n\\t\\t\\tnumber.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#ComplianceResourceTypes\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#StringWithCharLimit256\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 100\n                }\n            }\n        },\n        \"com.amazonaws.configservice#ComplianceScore\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.configservice#ComplianceSummariesByResourceType\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#ComplianceSummaryByResourceType\"\n            }\n        },\n        \"com.amazonaws.configservice#ComplianceSummary\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CompliantResourceCount\": {\n                    \"target\": \"com.amazonaws.configservice#ComplianceContributorCount\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of Config rules or Amazon Web Services resources that are\\n\\t\\t\\tcompliant, up to a maximum of 25 for rules and 100 for\\n\\t\\t\\tresources.</p>\"\n                    }\n                },\n                \"NonCompliantResourceCount\": {\n                    \"target\": \"com.amazonaws.configservice#ComplianceContributorCount\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of Config rules or Amazon Web Services resources that are\\n\\t\\t\\tnoncompliant, up to a maximum of 25 for rules and 100 for\\n\\t\\t\\tresources.</p>\"\n                    }\n                },\n                \"ComplianceSummaryTimestamp\": {\n                    \"target\": \"com.amazonaws.configservice#Date\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time that Config created the compliance\\n\\t\\t\\tsummary.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The number of Config rules or Amazon Web Services resources that are\\n\\t\\t\\tcompliant and noncompliant.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#ComplianceSummaryByResourceType\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ResourceType\": {\n                    \"target\": \"com.amazonaws.configservice#StringWithCharLimit256\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of Amazon Web Services resource.</p>\"\n                    }\n                },\n                \"ComplianceSummary\": {\n                    \"target\": \"com.amazonaws.configservice#ComplianceSummary\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of Amazon Web Services resources that are compliant or noncompliant,\\n\\t\\t\\tup to a maximum of 100 for each.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The number of Amazon Web Services resources of a specific type that are\\n\\t\\t\\tcompliant or noncompliant, up to a maximum of 100 for\\n\\t\\t\\teach.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#ComplianceType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"Compliant\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"COMPLIANT\"\n                    }\n                },\n                \"Non_Compliant\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"NON_COMPLIANT\"\n                    }\n                },\n                \"Not_Applicable\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"NOT_APPLICABLE\"\n                    }\n                },\n                \"Insufficient_Data\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"INSUFFICIENT_DATA\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.configservice#ComplianceTypes\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#ComplianceType\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 3\n                }\n            }\n        },\n        \"com.amazonaws.configservice#ConfigExportDeliveryInfo\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"lastStatus\": {\n                    \"target\": \"com.amazonaws.configservice#DeliveryStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Status of the last attempted delivery.</p>\"\n                    }\n                },\n                \"lastErrorCode\": {\n                    \"target\": \"com.amazonaws.configservice#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The error code from the last attempted delivery.</p>\"\n                    }\n                },\n                \"lastErrorMessage\": {\n                    \"target\": \"com.amazonaws.configservice#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The error message from the last attempted delivery.</p>\"\n                    }\n                },\n                \"lastAttemptTime\": {\n                    \"target\": \"com.amazonaws.configservice#Date\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time of the last attempted delivery.</p>\"\n                    }\n                },\n                \"lastSuccessfulTime\": {\n                    \"target\": \"com.amazonaws.configservice#Date\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time of the last successful delivery.</p>\"\n                    }\n                },\n                \"nextDeliveryTime\": {\n                    \"target\": \"com.amazonaws.configservice#Date\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time that the next delivery occurs.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Provides status of the delivery of the snapshot or the\\n\\t\\t\\tconfiguration history to the specified Amazon S3 bucket. Also\\n\\t\\t\\tprovides the status of notifications about the Amazon S3 delivery to\\n\\t\\t\\tthe specified Amazon SNS topic.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#ConfigRule\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConfigRuleName\": {\n                    \"target\": \"com.amazonaws.configservice#ConfigRuleName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name that you assign to the Config rule. The name is\\n\\t\\t\\trequired if you are adding a new rule.</p>\"\n                    }\n                },\n                \"ConfigRuleArn\": {\n                    \"target\": \"com.amazonaws.configservice#StringWithCharLimit256\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the Config\\n\\t\\t\\trule.</p>\"\n                    }\n                },\n                \"ConfigRuleId\": {\n                    \"target\": \"com.amazonaws.configservice#StringWithCharLimit64\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the Config rule.</p>\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.configservice#EmptiableStringWithCharLimit256\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The description that you provide for the Config\\n\\t\\t\\trule.</p>\"\n                    }\n                },\n                \"Scope\": {\n                    \"target\": \"com.amazonaws.configservice#Scope\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Defines which resources can trigger an evaluation for the rule.\\n\\t\\t\\tThe scope can include one or more resource types, a combination of\\n\\t\\t\\tone resource type and one resource ID, or a combination of a tag key\\n\\t\\t\\tand value. Specify a scope to constrain the resources that can\\n\\t\\t\\ttrigger an evaluation for the rule. If you do not specify a scope,\\n\\t\\t\\tevaluations are triggered when any resource in the recording group\\n\\t\\t\\tchanges.</p>\"\n                    }\n                },\n                \"Source\": {\n                    \"target\": \"com.amazonaws.configservice#Source\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Provides the rule owner (<code>Amazon Web Services</code> for managed rules, <code>CUSTOM_POLICY</code> for Custom Policy rules, and <code>CUSTOM_LAMBDA</code> for Custom Lambda rules), the rule identifier,\\n\\t\\t\\tand the notifications that cause the function to evaluate your Amazon Web Services\\n\\t\\t\\tresources.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"InputParameters\": {\n                    \"target\": \"com.amazonaws.configservice#StringWithCharLimit1024\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A string, in JSON format, that is passed to the Config rule\\n\\t\\t\\tLambda function.</p>\"\n                    }\n                },\n                \"MaximumExecutionFrequency\": {\n                    \"target\": \"com.amazonaws.configservice#MaximumExecutionFrequency\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum frequency with which Config runs evaluations\\n\\t\\t\\tfor a rule. You can specify a value for\\n\\t\\t\\t\\t<code>MaximumExecutionFrequency</code> when:</p>\\n         <ul>\\n            <li>\\n               <p>This is for an Config managed rule that is triggered at\\n\\t\\t\\t\\t\\ta periodic frequency.</p>\\n            </li>\\n            <li>\\n               <p>Your custom rule is triggered when Config delivers\\n\\t\\t\\t\\t\\tthe configuration snapshot. For more information, see <a>ConfigSnapshotDeliveryProperties</a>.</p>\\n            </li>\\n         </ul>\\n         <note>\\n            <p>By default, rules with a periodic trigger are evaluated\\n\\t\\t\\t\\tevery 24 hours. To change the frequency, specify a valid value\\n\\t\\t\\t\\tfor the <code>MaximumExecutionFrequency</code>\\n\\t\\t\\t\\tparameter.</p>\\n         </note>\"\n                    }\n                },\n                \"ConfigRuleState\": {\n                    \"target\": \"com.amazonaws.configservice#ConfigRuleState\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether the Config rule is active or is currently\\n\\t\\t\\tbeing deleted by Config. It can also indicate the evaluation\\n\\t\\t\\tstatus for the Config rule.</p>\\n         <p>Config sets the state of the rule to\\n\\t\\t\\t\\t<code>EVALUATING</code> temporarily after you use the\\n\\t\\t\\t\\t<code>StartConfigRulesEvaluation</code> request to evaluate your\\n\\t\\t\\tresources against the Config rule.</p>\\n         <p>Config sets the state of the rule to\\n\\t\\t\\t\\t<code>DELETING_RESULTS</code> temporarily after you use the\\n\\t\\t\\t\\t<code>DeleteEvaluationResults</code> request to delete the\\n\\t\\t\\tcurrent evaluation results for the Config rule.</p>\\n         <p>Config temporarily sets the state of a rule to\\n\\t\\t\\t\\t<code>DELETING</code> after you use the\\n\\t\\t\\t\\t<code>DeleteConfigRule</code> request to delete the rule. After\\n\\t\\t\\tConfig deletes the rule, the rule and all of its evaluations are\\n\\t\\t\\terased and are no longer available.</p>\"\n                    }\n                },\n                \"CreatedBy\": {\n                    \"target\": \"com.amazonaws.configservice#StringWithCharLimit256\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Service principal name of the service that created the\\n\\t\\t\\trule.</p>\\n         <note>\\n            <p>The field is populated only if the service-linked rule is\\n\\t\\t\\t\\tcreated by a service. The field is empty if you create your own\\n\\t\\t\\t\\trule.</p>\\n         </note>\"\n                    }\n                },\n                \"EvaluationModes\": {\n                    \"target\": \"com.amazonaws.configservice#EvaluationModes\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The modes the Config rule can be evaluated in. The valid values are distinct objects. By default, the value is Detective evaluation mode only.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Config rules evaluate the configuration settings of your Amazon Web Services resources. A rule can run when Config detects a configuration change to\\n\\t\\t\\tan Amazon Web Services resource or at a periodic frequency that you choose (for\\n\\t\\t\\texample, every 24 hours). There are two types of rules: <i>Config Managed Rules</i> and <i>Config Custom Rules</i>.</p>\\n         <p>Config Managed Rules are predefined,\\n\\t\\t\\t\\tcustomizable rules created by Config. For a list of managed rules, see\\n\\t\\t\\t\\t<a href=\\\"https://docs.aws.amazon.com/config/latest/developerguide/managed-rules-by-aws-config.html\\\">List of Config\\n\\t\\t\\t\\t\\tManaged Rules</a>.</p>\\n         <p>Config Custom Rules are rules that you create from scratch. There are two ways to create Config custom rules: with Lambda functions\\n\\t\\t\\t\\t(<a href=\\\"https://docs.aws.amazon.com/config/latest/developerguide/gettingstarted-concepts.html#gettingstarted-concepts-function\\\"> Lambda Developer Guide</a>) and with Guard (<a href=\\\"https://github.com/aws-cloudformation/cloudformation-guard\\\">Guard GitHub\\n\\t\\t\\t\\t\\t\\tRepository</a>), a policy-as-code language.\\n\\t\\t\\t\\t\\n\\t\\t\\t\\tConfig custom rules created with Lambda\\n\\t\\t\\t\\tare called <i>Config Custom Lambda Rules</i> and Config custom rules created with\\n\\t\\t\\t\\tGuard are called <i>Config Custom Policy Rules</i>.</p>\\n         <p>For more information about developing and using Config\\n\\t\\t\\trules, see <a href=\\\"https://docs.aws.amazon.com/config/latest/developerguide/evaluate-config.html\\\">Evaluating Resource with Config Rules</a>\\n\\t\\t\\tin the <i>Config Developer Guide</i>.</p>\\n         <note>\\n            <p>You can use the Amazon Web Services CLI and Amazon Web Services SDKs if you want to create\\n\\t\\t\\t\\ta rule that triggers evaluations for your resources when Config delivers the configuration snapshot. For more\\n\\t\\t\\t\\tinformation, see <a>ConfigSnapshotDeliveryProperties</a>.</p>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.configservice#ConfigRuleComplianceFilters\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConfigRuleName\": {\n                    \"target\": \"com.amazonaws.configservice#ConfigRuleName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the Config rule.</p>\"\n                    }\n                },\n                \"ComplianceType\": {\n                    \"target\": \"com.amazonaws.configservice#ComplianceType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The rule compliance status.</p>\\n         <p>For the <code>ConfigRuleComplianceFilters</code> data type, Config supports only <code>COMPLIANT</code> and\\n\\t\\t\\t\\t<code>NON_COMPLIANT</code>. Config does not support the\\n\\t\\t\\t\\t<code>NOT_APPLICABLE</code> and the\\n\\t\\t\\t\\t<code>INSUFFICIENT_DATA</code> values.</p>\"\n                    }\n                },\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.configservice#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The 12-digit account ID of the source account.\\n\\t\\t\\t</p>\"\n                    }\n                },\n                \"AwsRegion\": {\n                    \"target\": \"com.amazonaws.configservice#AwsRegion\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The source region where the data is aggregated.\\n\\t\\t\\t</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Filters the compliance results based on account ID, region,\\n\\t\\t\\tcompliance type, and rule name.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#ConfigRuleComplianceSummaryFilters\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.configservice#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The 12-digit account ID of the source account.</p>\"\n                    }\n                },\n                \"AwsRegion\": {\n                    \"target\": \"com.amazonaws.configservice#AwsRegion\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The source region where the data is aggregated.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Filters the results based on the account IDs and\\n\\t\\t\\tregions.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#ConfigRuleComplianceSummaryGroupKey\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ACCOUNT_ID\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ACCOUNT_ID\"\n                    }\n                },\n                \"AWS_REGION\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS_REGION\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.configservice#ConfigRuleEvaluationStatus\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConfigRuleName\": {\n                    \"target\": \"com.amazonaws.configservice#ConfigRuleName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the Config rule.</p>\"\n                    }\n                },\n                \"ConfigRuleArn\": {\n                    \"target\": \"com.amazonaws.configservice#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the Config\\n\\t\\t\\trule.</p>\"\n                    }\n                },\n                \"ConfigRuleId\": {\n                    \"target\": \"com.amazonaws.configservice#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the Config rule.</p>\"\n                    }\n                },\n                \"LastSuccessfulInvocationTime\": {\n                    \"target\": \"com.amazonaws.configservice#Date\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time that Config last successfully invoked the Config rule to evaluate your Amazon Web Services resources.</p>\"\n                    }\n                },\n                \"LastFailedInvocationTime\": {\n                    \"target\": \"com.amazonaws.configservice#Date\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time that Config last failed to invoke the Config\\n\\t\\t\\trule to evaluate your Amazon Web Services resources.</p>\"\n                    }\n                },\n                \"LastSuccessfulEvaluationTime\": {\n                    \"target\": \"com.amazonaws.configservice#Date\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time that Config last successfully evaluated your Amazon Web Services\\n\\t\\t\\tresources against the rule.</p>\"\n                    }\n                },\n                \"LastFailedEvaluationTime\": {\n                    \"target\": \"com.amazonaws.configservice#Date\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time that Config last failed to evaluate your Amazon Web Services\\n\\t\\t\\tresources against the rule.</p>\"\n                    }\n                },\n                \"FirstActivatedTime\": {\n                    \"target\": \"com.amazonaws.configservice#Date\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time that you first activated the Config\\n\\t\\t\\trule.</p>\"\n                    }\n                },\n                \"LastDeactivatedTime\": {\n                    \"target\": \"com.amazonaws.configservice#Date\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time that you last turned off the Config rule.</p>\"\n                    }\n                },\n                \"LastErrorCode\": {\n                    \"target\": \"com.amazonaws.configservice#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The error code that Config returned when the rule last\\n\\t\\t\\tfailed.</p>\"\n                    }\n                },\n                \"LastErrorMessage\": {\n                    \"target\": \"com.amazonaws.configservice#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The error message that Config returned when the rule last\\n\\t\\t\\tfailed.</p>\"\n                    }\n                },\n                \"FirstEvaluationStarted\": {\n                    \"target\": \"com.amazonaws.configservice#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Indicates whether Config has evaluated your resources\\n\\t\\t\\tagainst the rule at least once.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>true</code> - Config has evaluated your Amazon Web Services\\n\\t\\t\\t\\t\\tresources against the rule at least once.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>false</code> - Config has not finished evaluating your Amazon Web Services resources against the\\n\\t\\t\\t\\t\\trule\\n\\t\\t\\t\\t\\tat least once.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"LastDebugLogDeliveryStatus\": {\n                    \"target\": \"com.amazonaws.configservice#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The status of the last attempted delivery of a debug log for your Config Custom Policy rules. Either <code>Successful</code> or <code>Failed</code>.</p>\"\n                    }\n                },\n                \"LastDebugLogDeliveryStatusReason\": {\n                    \"target\": \"com.amazonaws.configservice#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The reason Config was not able to deliver a debug log. This is for the last\\n\\t\\t\\tfailed attempt to retrieve a debug log for your Config Custom Policy rules.</p>\"\n                    }\n                },\n                \"LastDebugLogDeliveryTime\": {\n                    \"target\": \"com.amazonaws.configservice#Date\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time Config last attempted to deliver a debug log for your Config Custom Policy rules.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Status information for your Config Managed rules and Config Custom Policy rules. The\\n\\t\\t\\tstatus includes information such as the last time the rule ran, the\\n\\t\\t\\tlast time it failed, and the related error for the last\\n\\t\\t\\tfailure.</p>\\n         <p>This operation does not return status information about Config Custom Lambda rules.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#ConfigRuleEvaluationStatusList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#ConfigRuleEvaluationStatus\"\n            }\n        },\n        \"com.amazonaws.configservice#ConfigRuleName\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 128\n                },\n                \"smithy.api#pattern\": \"\\\\S\"\n            }\n        },\n        \"com.amazonaws.configservice#ConfigRuleNames\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#ConfigRuleName\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 25\n                }\n            }\n        },\n        \"com.amazonaws.configservice#ConfigRuleState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ACTIVE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ACTIVE\"\n                    }\n                },\n                \"DELETING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DELETING\"\n                    }\n                },\n                \"DELETING_RESULTS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DELETING_RESULTS\"\n                    }\n                },\n                \"EVALUATING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"EVALUATING\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.configservice#ConfigRules\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#ConfigRule\"\n            }\n        },\n        \"com.amazonaws.configservice#ConfigSnapshotDeliveryProperties\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"deliveryFrequency\": {\n                    \"target\": \"com.amazonaws.configservice#MaximumExecutionFrequency\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The frequency with which Config delivers configuration\\n\\t\\t\\tsnapshots.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Provides options for how often Config delivers\\n\\t\\t\\tconfiguration snapshots to the Amazon S3 bucket in your delivery\\n\\t\\t\\tchannel.</p>\\n         <p>The frequency for a rule that triggers evaluations for your\\n\\t\\t\\tresources when Config delivers the configuration snapshot is set\\n\\t\\t\\tby one of two values, depending on which is less frequent:</p>\\n         <ul>\\n            <li>\\n               <p>The value for the <code>deliveryFrequency</code>\\n\\t\\t\\t\\t\\tparameter within the delivery channel configuration, which\\n\\t\\t\\t\\t\\tsets how often Config delivers configuration snapshots.\\n\\t\\t\\t\\t\\tThis value also sets how often Config invokes\\n\\t\\t\\t\\t\\tevaluations for Config rules.</p>\\n            </li>\\n            <li>\\n               <p>The value for the\\n\\t\\t\\t\\t\\t\\t<code>MaximumExecutionFrequency</code> parameter, which\\n\\t\\t\\t\\t\\tsets the maximum frequency with which Config invokes\\n\\t\\t\\t\\t\\tevaluations for the rule. For more information, see <a>ConfigRule</a>.</p>\\n            </li>\\n         </ul>\\n         <p>If the <code>deliveryFrequency</code> value is less frequent\\n\\t\\t\\tthan the <code>MaximumExecutionFrequency</code> value for a rule,\\n\\t\\t\\tConfig invokes the rule only as often as the\\n\\t\\t\\t\\t<code>deliveryFrequency</code> value.</p>\\n         <ol>\\n            <li>\\n               <p>For example, you want your rule to run evaluations when\\n\\t\\t\\t\\t\\tConfig delivers the configuration snapshot.</p>\\n            </li>\\n            <li>\\n               <p>You specify the <code>MaximumExecutionFrequency</code>\\n\\t\\t\\t\\t\\tvalue for <code>Six_Hours</code>. </p>\\n            </li>\\n            <li>\\n               <p>You then specify the delivery channel\\n\\t\\t\\t\\t\\t\\t<code>deliveryFrequency</code> value for\\n\\t\\t\\t\\t\\t\\t<code>TwentyFour_Hours</code>.</p>\\n            </li>\\n            <li>\\n               <p>Because the value for <code>deliveryFrequency</code> is\\n\\t\\t\\t\\t\\tless frequent than <code>MaximumExecutionFrequency</code>,\\n\\t\\t\\t\\t\\tConfig invokes evaluations for the rule every 24 hours.\\n\\t\\t\\t\\t</p>\\n            </li>\\n         </ol>\\n         <p>You should set the <code>MaximumExecutionFrequency</code> value\\n\\t\\t\\tto be at least as frequent as the <code>deliveryFrequency</code>\\n\\t\\t\\tvalue. You can view the <code>deliveryFrequency</code> value by\\n\\t\\t\\tusing the <code>DescribeDeliveryChannnels</code> action.</p>\\n         <p>To update the <code>deliveryFrequency</code> with which Config delivers your configuration snapshots, use the\\n\\t\\t\\t\\t<code>PutDeliveryChannel</code> action.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#ConfigStreamDeliveryInfo\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"lastStatus\": {\n                    \"target\": \"com.amazonaws.configservice#DeliveryStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Status of the last attempted delivery.</p>\\n         <p>\\n            <b>Note</b> Providing an SNS topic on a\\n\\t\\t\\t\\t<a href=\\\"https://docs.aws.amazon.com/config/latest/APIReference/API_DeliveryChannel.html\\\">DeliveryChannel</a> for Config is optional. If the SNS\\n\\t\\t\\tdelivery is turned off, the last status will be <b>Not_Applicable</b>.</p>\"\n                    }\n                },\n                \"lastErrorCode\": {\n                    \"target\": \"com.amazonaws.configservice#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The error code from the last attempted delivery.</p>\"\n                    }\n                },\n                \"lastErrorMessage\": {\n                    \"target\": \"com.amazonaws.configservice#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The error message from the last attempted delivery.</p>\"\n                    }\n                },\n                \"lastStatusChangeTime\": {\n                    \"target\": \"com.amazonaws.configservice#Date\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time from the last status change.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A list that contains the status of the delivery of the\\n\\t\\t\\tconfiguration stream notification to the Amazon SNS topic.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#Configuration\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.configservice#ConfigurationAggregator\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConfigurationAggregatorName\": {\n                    \"target\": \"com.amazonaws.configservice#ConfigurationAggregatorName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the aggregator.</p>\"\n                    }\n                },\n                \"ConfigurationAggregatorArn\": {\n                    \"target\": \"com.amazonaws.configservice#ConfigurationAggregatorArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the aggregator.</p>\"\n                    }\n                },\n                \"AccountAggregationSources\": {\n                    \"target\": \"com.amazonaws.configservice#AccountAggregationSourceList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Provides a list of source accounts and regions to be\\n\\t\\t\\taggregated.</p>\"\n                    }\n                },\n                \"OrganizationAggregationSource\": {\n                    \"target\": \"com.amazonaws.configservice#OrganizationAggregationSource\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Provides an organization and list of regions to be\\n\\t\\t\\taggregated.</p>\"\n                    }\n                },\n                \"CreationTime\": {\n                    \"target\": \"com.amazonaws.configservice#Date\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time stamp when the configuration aggregator was\\n\\t\\t\\tcreated.</p>\"\n                    }\n                },\n                \"LastUpdatedTime\": {\n                    \"target\": \"com.amazonaws.configservice#Date\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time of the last update.</p>\"\n                    }\n                },\n                \"CreatedBy\": {\n                    \"target\": \"com.amazonaws.configservice#StringWithCharLimit256\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Amazon Web Services service that created the configuration aggregator.</p>\"\n                    }\n                },\n                \"AggregatorFilters\": {\n                    \"target\": \"com.amazonaws.configservice#AggregatorFilters\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An object to filter the data you specify for an aggregator.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The details about the configuration aggregator, including\\n\\t\\t\\tinformation about source accounts, regions, and metadata of the\\n\\t\\t\\taggregator. </p>\"\n            }\n        },\n        \"com.amazonaws.configservice#ConfigurationAggregatorArn\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#pattern\": \"^arn:aws[a-z\\\\-]*:config:[a-z\\\\-\\\\d]+:\\\\d+:config-aggregator/config-aggregator-[a-z\\\\d]+$\"\n            }\n        },\n        \"com.amazonaws.configservice#ConfigurationAggregatorList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#ConfigurationAggregator\"\n            }\n        },\n        \"com.amazonaws.configservice#ConfigurationAggregatorName\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 256\n                },\n                \"smithy.api#pattern\": \"^[\\\\w\\\\-]+$\"\n            }\n        },\n        \"com.amazonaws.configservice#ConfigurationAggregatorNameList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#ConfigurationAggregatorName\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 10\n                }\n            }\n        },\n        \"com.amazonaws.configservice#ConfigurationItem\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"version\": {\n                    \"target\": \"com.amazonaws.configservice#Version\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The version number of the resource configuration.</p>\"\n                    }\n                },\n                \"accountId\": {\n                    \"target\": \"com.amazonaws.configservice#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The 12-digit Amazon Web Services account ID associated with the\\n\\t\\t\\tresource.</p>\"\n                    }\n                },\n                \"configurationItemCaptureTime\": {\n                    \"target\": \"com.amazonaws.configservice#ConfigurationItemCaptureTime\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time when the recording of configuration changes was\\n\\t\\t\\tinitiated for the resource.</p>\"\n                    }\n                },\n                \"configurationItemStatus\": {\n                    \"target\": \"com.amazonaws.configservice#ConfigurationItemStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The configuration item status. Valid values include:</p>\\n         <ul>\\n            <li>\\n               <p>OK – The resource configuration has been updated</p>\\n            </li>\\n            <li>\\n               <p>ResourceDiscovered – The resource was newly discovered</p>\\n            </li>\\n            <li>\\n               <p>ResourceNotRecorded – The resource was discovered but its configuration was not recorded since the recorder doesn't record resources of this type</p>\\n            </li>\\n            <li>\\n               <p>ResourceDeleted – The resource was deleted</p>\\n            </li>\\n            <li>\\n               <p>ResourceDeletedNotRecorded – The resource was deleted but its configuration was not recorded since the recorder doesn't  record resources of this type</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"configurationStateId\": {\n                    \"target\": \"com.amazonaws.configservice#ConfigurationStateId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An identifier that indicates the ordering of the configuration\\n\\t\\t\\titems of a resource.</p>\"\n                    }\n                },\n                \"configurationItemMD5Hash\": {\n                    \"target\": \"com.amazonaws.configservice#ConfigurationItemMD5Hash\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Unique MD5 hash that represents the configuration item's\\n\\t\\t\\tstate.</p>\\n         <p>You can use MD5 hash to compare the states of two or more\\n\\t\\t\\tconfiguration items that are associated with the same\\n\\t\\t\\tresource.</p>\"\n                    }\n                },\n                \"arn\": {\n                    \"target\": \"com.amazonaws.configservice#ARN\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Amazon Resource Name (ARN) associated with the resource.</p>\"\n                    }\n                },\n                \"resourceType\": {\n                    \"target\": \"com.amazonaws.configservice#ResourceType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of Amazon Web Services resource.</p>\"\n                    }\n                },\n                \"resourceId\": {\n                    \"target\": \"com.amazonaws.configservice#ResourceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the resource (for example,\\n\\t\\t\\t<code>sg-xxxxxx</code>).</p>\"\n                    }\n                },\n                \"resourceName\": {\n                    \"target\": \"com.amazonaws.configservice#ResourceName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The custom name of the resource, if available.</p>\"\n                    }\n                },\n                \"awsRegion\": {\n                    \"target\": \"com.amazonaws.configservice#AwsRegion\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The region where the resource resides.</p>\"\n                    }\n                },\n                \"availabilityZone\": {\n                    \"target\": \"com.amazonaws.configservice#AvailabilityZone\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Availability Zone associated with the resource.</p>\"\n                    }\n                },\n                \"resourceCreationTime\": {\n                    \"target\": \"com.amazonaws.configservice#ResourceCreationTime\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time stamp when the resource was created.</p>\"\n                    }\n                },\n                \"tags\": {\n                    \"target\": \"com.amazonaws.configservice#Tags\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A mapping of key value tags associated with the\\n\\t\\t\\tresource.</p>\"\n                    }\n                },\n                \"relatedEvents\": {\n                    \"target\": \"com.amazonaws.configservice#RelatedEventList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of CloudTrail event IDs.</p>\\n         <p>A populated field indicates that the current configuration was\\n\\t\\t\\tinitiated by the events recorded in the CloudTrail log. For more\\n\\t\\t\\tinformation about CloudTrail, see <a href=\\\"https://docs.aws.amazon.com/awscloudtrail/latest/userguide/what_is_cloud_trail_top_level.html\\\">What Is CloudTrail</a>.</p>\\n         <p>An empty field indicates that the current configuration was not\\n\\t\\t\\tinitiated by any event. As of Version 1.3, the relatedEvents field is empty. \\n\\t\\t\\tYou can access the <a href=\\\"https://docs.aws.amazon.com/awscloudtrail/latest/APIReference/API_LookupEvents.html\\\">LookupEvents API</a> in the <i>CloudTrail API Reference</i> to retrieve the events for the resource.</p>\"\n                    }\n                },\n                \"relationships\": {\n                    \"target\": \"com.amazonaws.configservice#RelationshipList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of related Amazon Web Services resources.</p>\"\n                    }\n                },\n                \"configuration\": {\n                    \"target\": \"com.amazonaws.configservice#Configuration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A JSON-encoded string that contains the contents for the resource configuration. This string needs to be deserialized using <code>json.loads()</code> before you can access the contents.</p>\"\n                    }\n                },\n                \"supplementaryConfiguration\": {\n                    \"target\": \"com.amazonaws.configservice#SupplementaryConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A string to string map that contains additional contents for the resource configuration.Config returns this field for certain\\n\\t\\t\\tresource types to supplement the information returned for the\\n\\t\\t\\t<code>configuration</code> field.</p>\\n         <p>This string to string map needs to be deserialized using <code>json.loads()</code> before you can accessing the contents.</p>\"\n                    }\n                },\n                \"recordingFrequency\": {\n                    \"target\": \"com.amazonaws.configservice#RecordingFrequency\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The recording frequency that Config uses to record configuration changes for the resource.</p>\\n         <note>\\n            <p>This field only appears in the API response when <code>DAILY</code> recording is enabled for a resource type.\\n\\t\\t\\t\\tIf this field is not present, <code>CONTINUOUS</code> recording is enabled for that resource type. For more information on daily recording and continuous recording, see <a href=\\\"https://docs.aws.amazon.com/config/latest/developerguide/select-resources.html#select-resources-recording-frequency\\\">Recording Frequency</a> in the <i>Config\\n\\t\\t\\t\\t\\t\\tDeveloper Guide</i>.</p>\\n         </note>\"\n                    }\n                },\n                \"configurationItemDeliveryTime\": {\n                    \"target\": \"com.amazonaws.configservice#ConfigurationItemDeliveryTime\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time when configuration changes for the resource were delivered.</p>\\n         <note>\\n            <p>This field is optional and is not guaranteed to be present in a configuration item  (CI). If you are using daily recording,\\n\\t\\t\\tthis field will be populated. However, if you are using continuous recording,\\n\\t\\t\\tthis field will be omitted since the delivery time is instantaneous as the CI is available right away.</p>\\n            <p>For more information on daily recording and continuous recording, see <a href=\\\"https://docs.aws.amazon.com/config/latest/developerguide/select-resources.html#select-resources-recording-frequency\\\">Recording Frequency</a> in the <i>Config\\n\\t\\t\\t\\t\\tDeveloper Guide</i>.</p>\\n         </note>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A list that contains detailed configurations of a specified\\n\\t\\t\\tresource.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#ConfigurationItemCaptureTime\": {\n            \"type\": \"timestamp\"\n        },\n        \"com.amazonaws.configservice#ConfigurationItemDeliveryTime\": {\n            \"type\": \"timestamp\"\n        },\n        \"com.amazonaws.configservice#ConfigurationItemList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#ConfigurationItem\"\n            }\n        },\n        \"com.amazonaws.configservice#ConfigurationItemMD5Hash\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.configservice#ConfigurationItemStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"OK\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"OK\"\n                    }\n                },\n                \"ResourceDiscovered\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ResourceDiscovered\"\n                    }\n                },\n                \"ResourceNotRecorded\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ResourceNotRecorded\"\n                    }\n                },\n                \"ResourceDeleted\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ResourceDeleted\"\n                    }\n                },\n                \"ResourceDeletedNotRecorded\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ResourceDeletedNotRecorded\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.configservice#ConfigurationRecorder\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"arn\": {\n                    \"target\": \"com.amazonaws.configservice#AmazonResourceName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the specified configuration recorder.</p>\"\n                    }\n                },\n                \"name\": {\n                    \"target\": \"com.amazonaws.configservice#RecorderName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the configuration recorder.</p>\\n         <p>For customer managed configuration recorders, Config automatically assigns the name of \\\"default\\\" when creating a configuration recorder if you do not specify a name at creation time.</p>\\n         <p>For service-linked configuration recorders, Config automatically assigns a name that has the prefix \\\"<code>AWSConfigurationRecorderFor</code>\\\" to a new service-linked configuration recorder.</p>\\n         <note>\\n            <p>\\n               <b>Changing the name of a configuration recorder</b>\\n            </p>\\n            <p>To change the name of the customer managed configuration recorder, you must delete it and create a new customer managed configuration recorder with a new name.</p>\\n            <p>You cannot change the name of a service-linked configuration recorder.</p>\\n         </note>\"\n                    }\n                },\n                \"roleARN\": {\n                    \"target\": \"com.amazonaws.configservice#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the IAM role assumed by Config and used by the specified configuration recorder.</p>\\n         <note>\\n            <p>\\n               <b>The server will reject a request without a defined <code>roleARN</code> for the configuration recorder</b>\\n            </p>\\n            <p>While the API model does not require this field, the server will reject a request without a defined <code>roleARN</code> for the configuration recorder.</p>\\n            <p>\\n               <b>Policies and compliance results</b>\\n            </p>\\n            <p>\\n               <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html\\\">IAM policies</a>\\n\\t\\t\\t\\tand <a href=\\\"https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies.html\\\">other policies managed in Organizations</a>\\n\\t\\t\\t\\tcan impact whether Config\\n\\t\\t\\t\\thas permissions to record configuration changes for your resources. Additionally, rules directly evaluate the configuration of a resource and rules don't take into account these policies when running evaluations.\\n\\t\\t\\t\\tMake sure that the policies in effect align with how you intend to use Config.</p>\\n            <p>\\n               <b>Keep Minimum Permisions When Reusing an IAM role</b>\\n            </p>\\n            <p>If you use an Amazon Web Services service that uses Config, such as Security Hub or\\n\\t\\t\\t\\tControl Tower, and an IAM role has already been created, make sure that the\\n\\t\\t\\t\\tIAM role that you use when setting up Config keeps the same minimum\\n\\t\\t\\t\\tpermissions as the pre-existing IAM role. You must do this to ensure that the\\n\\t\\t\\t\\tother Amazon Web Services service continues to run as expected. </p>\\n            <p>For example, if Control Tower has an IAM role that allows Config to read\\n\\t\\t\\t\\tS3 objects, make sure that the same permissions are granted\\n\\t\\t\\t\\tto the IAM role you use when setting up Config. Otherwise, it may\\n\\t\\t\\t\\tinterfere with how Control Tower operates.</p>\\n            <p>\\n               <b>The service-linked IAM role for Config must be used for service-linked configuration recorders</b>\\n            </p>\\n            <p>For service-linked configuration recorders, you must use the service-linked IAM role for Config: <a href=\\\"https://docs.aws.amazon.com/config/latest/developerguide/using-service-linked-roles.html\\\">AWSServiceRoleForConfig</a>.</p>\\n         </note>\"\n                    }\n                },\n                \"recordingGroup\": {\n                    \"target\": \"com.amazonaws.configservice#RecordingGroup\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies which resource types are in scope for the configuration recorder to record.</p>\\n         <note>\\n            <p>\\n               <b> High Number of Config Evaluations</b>\\n            </p>\\n            <p>You might notice increased activity in your account during your initial month recording with Config when compared to subsequent months. During the\\n\\t\\t\\t\\tinitial bootstrapping process, Config runs evaluations on all the resources in your account that you have selected\\n\\t\\t\\t\\tfor Config to record.</p>\\n            <p>If you are running ephemeral workloads, you may see increased activity from Config as it records configuration changes associated with creating and deleting these\\n\\t\\t\\t\\ttemporary resources. An <i>ephemeral workload</i> is a temporary use of computing resources that are loaded\\n\\t\\t\\t\\tand run when needed. Examples include Amazon Elastic Compute Cloud (Amazon EC2)\\n\\t\\t\\t\\tSpot Instances, Amazon EMR jobs, and Auto Scaling.</p>\\n            <p>If you want to avoid the increased activity from running ephemeral workloads, you can set up the configuration recorder to exclude these resource types from being recorded, or run these types of workloads in a separate account with Config turned off to avoid\\n\\t\\t\\t\\tincreased configuration recording and rule evaluations.</p>\\n         </note>\"\n                    }\n                },\n                \"recordingMode\": {\n                    \"target\": \"com.amazonaws.configservice#RecordingMode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the default recording frequency for the configuration recorder.\\n\\t\\t\\t\\n\\t\\t\\tConfig supports <i>Continuous recording</i> and <i>Daily recording</i>.</p>\\n         <ul>\\n            <li>\\n               <p>Continuous recording allows you to record configuration changes continuously whenever a change occurs.</p>\\n            </li>\\n            <li>\\n               <p>Daily recording allows you to receive a configuration item (CI) representing the most recent state of your resources over the last 24-hour period, only if it’s different from the previous CI recorded.\\n\\t\\t\\t</p>\\n            </li>\\n         </ul>\\n         <note>\\n            <p>\\n               <b>Some resource types require continuous recording</b>\\n            </p>\\n            <p>Firewall Manager depends on continuous recording to monitor your resources. If you are using Firewall Manager,\\n\\t\\t\\tit is recommended that you set the recording frequency to Continuous.</p>\\n         </note>\\n         <p>You can also override the recording frequency for specific resource types.</p>\"\n                    }\n                },\n                \"recordingScope\": {\n                    \"target\": \"com.amazonaws.configservice#RecordingScope\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies whether the <a href=\\\"https://docs.aws.amazon.com/config/latest/APIReference/API_ConfigurationItem.html\\\">ConfigurationItems</a> in scope for the specified configuration recorder are recorded for free (<code>INTERNAL</code>) or if it impacts the costs to your bill (<code>PAID</code>).</p>\"\n                    }\n                },\n                \"servicePrincipal\": {\n                    \"target\": \"com.amazonaws.configservice#ServicePrincipal\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>For service-linked configuration recorders, specifies the linked Amazon Web Services service for the configuration recorder.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Records configuration changes to the resource types in scope.</p>\\n         <p>For more information about the configuration recorder,\\n\\t\\t\\tsee <a href=\\\"https://docs.aws.amazon.com/config/latest/developerguide/stop-start-recorder.html\\\">\\n               <b>Working with the Configuration Recorder</b>\\n            </a> in the <i>Config Developer Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#ConfigurationRecorderFilter\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"filterName\": {\n                    \"target\": \"com.amazonaws.configservice#ConfigurationRecorderFilterName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the type of filter. Currently, only <code>recordingScope</code> is supported.</p>\"\n                    }\n                },\n                \"filterValue\": {\n                    \"target\": \"com.amazonaws.configservice#ConfigurationRecorderFilterValues\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The value of the filter. For <code>recordingScope</code>, valid values include: <code>INTERNAL</code> and <code>PAID</code>.</p>\\n         <p>\\n            <code>INTERNAL</code> indicates that the <a href=\\\"https://docs.aws.amazon.com/config/latest/APIReference/API_ConfigurationItem.html\\\">ConfigurationItems</a> in scope for the configuration recorder are recorded for free.</p>\\n         <p>\\n            <code>PAID</code> indicates that the <a href=\\\"https://docs.aws.amazon.com/config/latest/APIReference/API_ConfigurationItem.html\\\">ConfigurationItems</a> in scope for the configuration recorder impact the costs to your bill.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Filters configuration recorders by recording scope.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#ConfigurationRecorderFilterList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#ConfigurationRecorderFilter\"\n            }\n        },\n        \"com.amazonaws.configservice#ConfigurationRecorderFilterName\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"RecordingScope\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"recordingScope\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.configservice#ConfigurationRecorderFilterValue\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#pattern\": \"^[0-9a-zA-Z\\\\\\\\*\\\\\\\\.\\\\\\\\\\\\/\\\\\\\\?-]*$\"\n            }\n        },\n        \"com.amazonaws.configservice#ConfigurationRecorderFilterValues\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#ConfigurationRecorderFilterValue\"\n            }\n        },\n        \"com.amazonaws.configservice#ConfigurationRecorderList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#ConfigurationRecorder\"\n            }\n        },\n        \"com.amazonaws.configservice#ConfigurationRecorderNameList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#RecorderName\"\n            }\n        },\n        \"com.amazonaws.configservice#ConfigurationRecorderStatus\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"arn\": {\n                    \"target\": \"com.amazonaws.configservice#AmazonResourceName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the configuration recorder.</p>\"\n                    }\n                },\n                \"name\": {\n                    \"target\": \"com.amazonaws.configservice#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the configuration recorder.</p>\"\n                    }\n                },\n                \"lastStartTime\": {\n                    \"target\": \"com.amazonaws.configservice#Date\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time the recorder was last started.</p>\"\n                    }\n                },\n                \"lastStopTime\": {\n                    \"target\": \"com.amazonaws.configservice#Date\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time the recorder was last stopped.</p>\"\n                    }\n                },\n                \"recording\": {\n                    \"target\": \"com.amazonaws.configservice#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Specifies whether or not the recorder is currently\\n\\t\\t\\trecording.</p>\"\n                    }\n                },\n                \"lastStatus\": {\n                    \"target\": \"com.amazonaws.configservice#RecorderStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The status of the latest recording event processed by the recorder.</p>\"\n                    }\n                },\n                \"lastErrorCode\": {\n                    \"target\": \"com.amazonaws.configservice#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The latest error code from when the recorder last failed.</p>\"\n                    }\n                },\n                \"lastErrorMessage\": {\n                    \"target\": \"com.amazonaws.configservice#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The latest error message from when the recorder last failed.</p>\"\n                    }\n                },\n                \"lastStatusChangeTime\": {\n                    \"target\": \"com.amazonaws.configservice#Date\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time of the latest change in status of an recording event processed by the recorder.</p>\"\n                    }\n                },\n                \"servicePrincipal\": {\n                    \"target\": \"com.amazonaws.configservice#ServicePrincipal\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>For service-linked configuration recorders, the service principal of the linked Amazon Web Services service.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The current status of the configuration recorder.</p>\\n         <p>For a detailed status of recording events over time, add your Config events to CloudWatch metrics and use CloudWatch metrics.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#ConfigurationRecorderStatusList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#ConfigurationRecorderStatus\"\n            }\n        },\n        \"com.amazonaws.configservice#ConfigurationRecorderSummaries\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#ConfigurationRecorderSummary\"\n            }\n        },\n        \"com.amazonaws.configservice#ConfigurationRecorderSummary\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"arn\": {\n                    \"target\": \"com.amazonaws.configservice#AmazonResourceName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the configuration recorder.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"name\": {\n                    \"target\": \"com.amazonaws.configservice#RecorderName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the configuration recorder.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"servicePrincipal\": {\n                    \"target\": \"com.amazonaws.configservice#ServicePrincipal\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>For service-linked configuration recorders, indicates which Amazon Web Services service the configuration recorder is linked to.</p>\"\n                    }\n                },\n                \"recordingScope\": {\n                    \"target\": \"com.amazonaws.configservice#RecordingScope\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether the <a href=\\\"https://docs.aws.amazon.com/config/latest/APIReference/API_ConfigurationItem.html\\\">ConfigurationItems</a> in scope for the configuration recorder are recorded for free (<code>INTERNAL</code>) or if you are charged a service fee for recording (<code>PAID</code>).</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A summary of a configuration recorder, including the <code>arn</code>, <code>name</code>, <code>servicePrincipal</code>, and <code>recordingScope</code>.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#ConfigurationStateId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.configservice#ConflictException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.configservice#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Error executing the command</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>For <a href=\\\"https://docs.aws.amazon.com/config/latest/APIReference/API_PutServiceLinkedConfigurationRecorder.html\\\">PutServiceLinkedConfigurationRecorder</a>, you cannot create a service-linked recorder because a service-linked recorder already exists for the specified service.</p>\\n         <p>For <a href=\\\"https://docs.aws.amazon.com/config/latest/APIReference/API_DeleteServiceLinkedConfigurationRecorder.html\\\">DeleteServiceLinkedConfigurationRecorder</a>, you cannot delete the service-linked recorder because it is currently in use by the linked Amazon Web Services service.</p>\\n         <p>For <a href=\\\"https://docs.aws.amazon.com/config/latest/APIReference/API_DeleteDeliveryChannel.html\\\">DeleteDeliveryChannel</a>, you cannot delete the specified delivery channel because the customer managed configuration recorder is running. Use the <a href=\\\"https://docs.aws.amazon.com/config/latest/APIReference/API_StopConfigurationRecorder.html\\\">StopConfigurationRecorder</a> operation to stop the customer managed configuration\\n\\t\\t\\trecorder.</p>\\n         <p>For <a href=\\\"https://docs.aws.amazon.com/config/latest/APIReference/API_AssociateResourceTypes.html\\\">AssociateResourceTypes</a> and <a href=\\\"https://docs.aws.amazon.com/config/latest/APIReference/API_DisassociateResourceTypes.html\\\">DisassociateResourceTypes</a>, one of the following errors:</p>\\n         <ul>\\n            <li>\\n               <p>For service-linked configuration recorders, the configuration recorder is not in use by the service. No association or dissociation of resource types is permitted.</p>\\n            </li>\\n            <li>\\n               <p>For service-linked configuration recorders, your requested change to the configuration recorder has been denied by its linked Amazon Web Services service.</p>\\n            </li>\\n         </ul>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.configservice#ConformancePackArn\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 2048\n                }\n            }\n        },\n        \"com.amazonaws.configservice#ConformancePackComplianceFilters\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConfigRuleNames\": {\n                    \"target\": \"com.amazonaws.configservice#ConformancePackConfigRuleNames\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Filters the results by Config rule names.</p>\"\n                    }\n                },\n                \"ComplianceType\": {\n                    \"target\": \"com.amazonaws.configservice#ConformancePackComplianceType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Filters the results by compliance.</p>\\n         <p>The allowed values are <code>COMPLIANT</code> and <code>NON_COMPLIANT</code>. <code>INSUFFICIENT_DATA</code> is not supported.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Filters the conformance pack by compliance types and Config rule names.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#ConformancePackComplianceResourceIds\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#StringWithCharLimit256\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 5\n                }\n            }\n        },\n        \"com.amazonaws.configservice#ConformancePackComplianceScore\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Score\": {\n                    \"target\": \"com.amazonaws.configservice#ComplianceScore\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Compliance score for the conformance pack. Conformance packs with no evaluation results will have a compliance score of <code>INSUFFICIENT_DATA</code>.</p>\"\n                    }\n                },\n                \"ConformancePackName\": {\n                    \"target\": \"com.amazonaws.configservice#ConformancePackName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the conformance pack.</p>\"\n                    }\n                },\n                \"LastUpdatedTime\": {\n                    \"target\": \"com.amazonaws.configservice#LastUpdatedTime\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time that the conformance pack compliance score was last updated.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A compliance score is the percentage of the number of compliant rule-resource combinations in a conformance pack compared to the number of total possible rule-resource combinations in the conformance pack.\\n\\t\\t\\tThis metric provides you with a high-level view of the compliance state of your conformance packs. You can use it to identify, investigate, and understand\\n\\t\\t\\tthe level of compliance in your conformance packs.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#ConformancePackComplianceScores\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#ConformancePackComplianceScore\"\n            }\n        },\n        \"com.amazonaws.configservice#ConformancePackComplianceScoresFilters\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConformancePackNames\": {\n                    \"target\": \"com.amazonaws.configservice#ConformancePackNameFilter\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The names of the conformance packs whose compliance scores you want to include in the conformance pack compliance score result set.\\n\\t\\t\\tYou can include up to 25 conformance packs in the <code>ConformancePackNames</code> array of strings, each with a character limit of 256 characters for the conformance pack name.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A list of filters to apply to the conformance pack compliance score result set. </p>\"\n            }\n        },\n        \"com.amazonaws.configservice#ConformancePackComplianceSummary\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConformancePackName\": {\n                    \"target\": \"com.amazonaws.configservice#ConformancePackName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the conformance pack name.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ConformancePackComplianceStatus\": {\n                    \"target\": \"com.amazonaws.configservice#ConformancePackComplianceType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The status of the conformance pack.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Summary includes the name and status of the conformance pack.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#ConformancePackComplianceSummaryList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#ConformancePackComplianceSummary\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 5\n                }\n            }\n        },\n        \"com.amazonaws.configservice#ConformancePackComplianceType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"COMPLIANT\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"COMPLIANT\"\n                    }\n                },\n                \"NON_COMPLIANT\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"NON_COMPLIANT\"\n                    }\n                },\n                \"INSUFFICIENT_DATA\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"INSUFFICIENT_DATA\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.configservice#ConformancePackConfigRuleNames\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#StringWithCharLimit64\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 10\n                }\n            }\n        },\n        \"com.amazonaws.configservice#ConformancePackDetail\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConformancePackName\": {\n                    \"target\": \"com.amazonaws.configservice#ConformancePackName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Name of the conformance pack.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ConformancePackArn\": {\n                    \"target\": \"com.amazonaws.configservice#ConformancePackArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Amazon Resource Name (ARN) of the conformance pack.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ConformancePackId\": {\n                    \"target\": \"com.amazonaws.configservice#ConformancePackId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>ID of the conformance pack.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DeliveryS3Bucket\": {\n                    \"target\": \"com.amazonaws.configservice#DeliveryS3Bucket\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the Amazon S3 bucket where Config stores conformance pack templates. </p>\\n         <note>\\n            <p>This field is optional.</p>\\n         </note>\"\n                    }\n                },\n                \"DeliveryS3KeyPrefix\": {\n                    \"target\": \"com.amazonaws.configservice#DeliveryS3KeyPrefix\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The prefix for the Amazon S3 bucket.</p>\\n         <note>\\n            <p>This field is optional.</p>\\n         </note>\"\n                    }\n                },\n                \"ConformancePackInputParameters\": {\n                    \"target\": \"com.amazonaws.configservice#ConformancePackInputParameters\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of <code>ConformancePackInputParameter</code> objects.</p>\"\n                    }\n                },\n                \"LastUpdateRequestedTime\": {\n                    \"target\": \"com.amazonaws.configservice#Date\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The last time a conformation pack update was requested. </p>\"\n                    }\n                },\n                \"CreatedBy\": {\n                    \"target\": \"com.amazonaws.configservice#StringWithCharLimit256\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services service that created the conformance pack.</p>\"\n                    }\n                },\n                \"TemplateSSMDocumentDetails\": {\n                    \"target\": \"com.amazonaws.configservice#TemplateSSMDocumentDetails\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An object that contains the name or Amazon Resource Name (ARN) of the Amazon Web Services Systems Manager document (SSM document) and the version of the SSM document that is used to create a conformance pack.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns details of a conformance pack. A conformance pack is a collection of Config rules and remediation actions that can be easily deployed in an account and a region.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#ConformancePackDetailList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#ConformancePackDetail\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 25\n                }\n            }\n        },\n        \"com.amazonaws.configservice#ConformancePackEvaluationFilters\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConfigRuleNames\": {\n                    \"target\": \"com.amazonaws.configservice#ConformancePackConfigRuleNames\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Filters the results by Config rule names.</p>\"\n                    }\n                },\n                \"ComplianceType\": {\n                    \"target\": \"com.amazonaws.configservice#ConformancePackComplianceType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Filters the results by compliance.</p>\\n         <p>The allowed values are <code>COMPLIANT</code> and <code>NON_COMPLIANT</code>. <code>INSUFFICIENT_DATA</code> is not supported.</p>\"\n                    }\n                },\n                \"ResourceType\": {\n                    \"target\": \"com.amazonaws.configservice#StringWithCharLimit256\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Filters the results by the resource type (for example, <code>\\\"AWS::EC2::Instance\\\"</code>). </p>\"\n                    }\n                },\n                \"ResourceIds\": {\n                    \"target\": \"com.amazonaws.configservice#ConformancePackComplianceResourceIds\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Filters the results by resource IDs.</p>\\n         <note>\\n            <p>This is valid only when you provide resource type. If there is no resource type, you will see an error.</p>\\n         </note>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Filters a conformance pack by Config rule names, compliance types, Amazon Web Services resource types, and resource IDs.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#ConformancePackEvaluationResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ComplianceType\": {\n                    \"target\": \"com.amazonaws.configservice#ConformancePackComplianceType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The compliance type. The allowed values are <code>COMPLIANT</code> and <code>NON_COMPLIANT</code>. <code>INSUFFICIENT_DATA</code> is not supported.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"EvaluationResultIdentifier\": {\n                    \"target\": \"com.amazonaws.configservice#EvaluationResultIdentifier\",\n                    \"traits\": {\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ConfigRuleInvokedTime\": {\n                    \"target\": \"com.amazonaws.configservice#Date\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time when Config rule evaluated Amazon Web Services resource.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ResultRecordedTime\": {\n                    \"target\": \"com.amazonaws.configservice#Date\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time when Config recorded the evaluation result. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Annotation\": {\n                    \"target\": \"com.amazonaws.configservice#Annotation\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Supplementary information about how the evaluation determined the compliance. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The details of a conformance pack evaluation. Provides Config rule and Amazon Web Services resource type that was evaluated, the compliance of the conformance pack, related time stamps, and supplementary information. </p>\"\n            }\n        },\n        \"com.amazonaws.configservice#ConformancePackId\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 1024\n                }\n            }\n        },\n        \"com.amazonaws.configservice#ConformancePackInputParameter\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ParameterName\": {\n                    \"target\": \"com.amazonaws.configservice#ParameterName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One part of a key-value pair.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ParameterValue\": {\n                    \"target\": \"com.amazonaws.configservice#ParameterValue\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Another part of the key-value pair. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Input parameters in the form of key-value pairs for the conformance pack, both of which you define. \\n\\t\\t\\tKeys can have a maximum character length of 255 characters, and values can have a maximum length of 4096 characters.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#ConformancePackInputParameters\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#ConformancePackInputParameter\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 60\n                }\n            }\n        },\n        \"com.amazonaws.configservice#ConformancePackName\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 256\n                },\n                \"smithy.api#pattern\": \"^[a-zA-Z][-a-zA-Z0-9]*$\"\n            }\n        },\n        \"com.amazonaws.configservice#ConformancePackNameFilter\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#ConformancePackName\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 25\n                }\n            }\n        },\n        \"com.amazonaws.configservice#ConformancePackNamesList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#ConformancePackName\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 25\n                }\n            }\n        },\n        \"com.amazonaws.configservice#ConformancePackNamesToSummarizeList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#ConformancePackName\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 5\n                }\n            }\n        },\n        \"com.amazonaws.configservice#ConformancePackRuleCompliance\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConfigRuleName\": {\n                    \"target\": \"com.amazonaws.configservice#ConfigRuleName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Name of the Config rule.</p>\"\n                    }\n                },\n                \"ComplianceType\": {\n                    \"target\": \"com.amazonaws.configservice#ConformancePackComplianceType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Compliance of the Config rule.</p>\"\n                    }\n                },\n                \"Controls\": {\n                    \"target\": \"com.amazonaws.configservice#ControlsList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Controls for the conformance pack. A control is a process to prevent or detect problems while meeting objectives.\\n\\t\\t\\tA control can align with a specific compliance regime or map to internal controls defined by an organization.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Compliance information of one or more Config rules within a conformance pack. You can filter using Config rule names and compliance types.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#ConformancePackRuleComplianceList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#ConformancePackRuleCompliance\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.configservice#ConformancePackRuleEvaluationResultsList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#ConformancePackEvaluationResult\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 100\n                }\n            }\n        },\n        \"com.amazonaws.configservice#ConformancePackState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"CREATE_IN_PROGRESS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"CREATE_IN_PROGRESS\"\n                    }\n                },\n                \"CREATE_COMPLETE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"CREATE_COMPLETE\"\n                    }\n                },\n                \"CREATE_FAILED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"CREATE_FAILED\"\n                    }\n                },\n                \"DELETE_IN_PROGRESS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DELETE_IN_PROGRESS\"\n                    }\n                },\n                \"DELETE_FAILED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DELETE_FAILED\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.configservice#ConformancePackStatusDetail\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConformancePackName\": {\n                    \"target\": \"com.amazonaws.configservice#ConformancePackName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Name of the conformance pack.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ConformancePackId\": {\n                    \"target\": \"com.amazonaws.configservice#ConformancePackId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>ID of the conformance pack.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ConformancePackArn\": {\n                    \"target\": \"com.amazonaws.configservice#ConformancePackArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Amazon Resource Name (ARN) of comformance pack.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ConformancePackState\": {\n                    \"target\": \"com.amazonaws.configservice#ConformancePackState\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates deployment status of conformance pack.</p>\\n         <p>Config sets the state of the conformance pack to:</p>\\n         <ul>\\n            <li>\\n               <p>CREATE_IN_PROGRESS when a conformance pack creation is in progress for an account.</p>\\n            </li>\\n            <li>\\n               <p>CREATE_COMPLETE when a conformance pack has been successfully created in your account.</p>\\n            </li>\\n            <li>\\n               <p>CREATE_FAILED when a conformance pack creation failed in your account.</p>\\n            </li>\\n            <li>\\n               <p>DELETE_IN_PROGRESS when a conformance pack deletion is in progress. </p>\\n            </li>\\n            <li>\\n               <p>DELETE_FAILED when a conformance pack deletion failed in your account.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"StackArn\": {\n                    \"target\": \"com.amazonaws.configservice#StackArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Amazon Resource Name (ARN) of CloudFormation stack. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ConformancePackStatusReason\": {\n                    \"target\": \"com.amazonaws.configservice#ConformancePackStatusReason\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The reason of conformance pack creation failure.</p>\"\n                    }\n                },\n                \"LastUpdateRequestedTime\": {\n                    \"target\": \"com.amazonaws.configservice#Date\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Last time when conformation pack creation and update was requested.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"LastUpdateCompletedTime\": {\n                    \"target\": \"com.amazonaws.configservice#Date\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Last time when conformation pack creation and update was successful.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Status details of a conformance pack.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#ConformancePackStatusDetailsList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#ConformancePackStatusDetail\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 25\n                }\n            }\n        },\n        \"com.amazonaws.configservice#ConformancePackStatusReason\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 2000\n                }\n            }\n        },\n        \"com.amazonaws.configservice#ConformancePackTemplateValidationException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.configservice#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Error executing the command</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>You have specified a template that is not valid or supported.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.configservice#ControlsList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#StringWithCharLimit128\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 20\n                }\n            }\n        },\n        \"com.amazonaws.configservice#CosmosPageLimit\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#default\": 0,\n                \"smithy.api#range\": {\n                    \"min\": 0,\n                    \"max\": 100\n                }\n            }\n        },\n        \"com.amazonaws.configservice#CustomPolicyDetails\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PolicyRuntime\": {\n                    \"target\": \"com.amazonaws.configservice#PolicyRuntime\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The runtime system for your Config Custom Policy rule. Guard is a policy-as-code language that allows you to write policies that are enforced by Config Custom Policy rules. For more information about Guard, see the <a href=\\\"https://github.com/aws-cloudformation/cloudformation-guard\\\">Guard GitHub\\n\\t\\t\\t\\t\\tRepository</a>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"PolicyText\": {\n                    \"target\": \"com.amazonaws.configservice#PolicyText\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The policy definition containing the logic for your Config Custom Policy rule.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"EnableDebugLogDelivery\": {\n                    \"target\": \"com.amazonaws.configservice#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>The boolean expression for enabling debug logging for your Config Custom Policy rule. The default value is <code>false</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Provides the runtime system, policy definition, and whether debug logging enabled. You can\\n\\t\\t\\tspecify the following CustomPolicyDetails parameter values \\n\\t\\t\\tonly\\n\\t\\t\\tfor Config Custom Policy rules.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#Date\": {\n            \"type\": \"timestamp\"\n        },\n        \"com.amazonaws.configservice#DebugLogDeliveryAccounts\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#AccountId\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.configservice#DeleteAggregationAuthorization\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#DeleteAggregationAuthorizationRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidParameterValueException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the authorization granted to the specified\\n\\t\\t\\tconfiguration aggregator account in a specified region.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#DeleteAggregationAuthorizationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AuthorizedAccountId\": {\n                    \"target\": \"com.amazonaws.configservice#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The 12-digit account ID of the account authorized to aggregate\\n\\t\\t\\tdata.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"AuthorizedAwsRegion\": {\n                    \"target\": \"com.amazonaws.configservice#AwsRegion\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The region authorized to collect aggregated data.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#DeleteConfigRule\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#DeleteConfigRuleRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#NoSuchConfigRuleException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#ResourceInUseException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the specified Config rule and all of its evaluation\\n\\t\\t\\tresults.</p>\\n         <p>Config sets the state of a rule to <code>DELETING</code>\\n\\t\\t\\tuntil the deletion is complete. You cannot update a rule while it is\\n\\t\\t\\tin this state. If you make a <code>PutConfigRule</code> or\\n\\t\\t\\t\\t<code>DeleteConfigRule</code> request for the rule, you will\\n\\t\\t\\treceive a <code>ResourceInUseException</code>.</p>\\n         <p>You can check the state of a rule by using the\\n\\t\\t\\t\\t<code>DescribeConfigRules</code> request.</p>\\n         <note>\\n            <p>\\n               <b>Recommendation: Consider excluding the <code>AWS::Config::ResourceCompliance</code> resource type from recording before deleting rules</b>\\n            </p>\\n            <p>Deleting rules creates configuration items (CIs) for <code>AWS::Config::ResourceCompliance</code>\\n\\t\\t\\t\\tthat can affect your costs for the configuration recorder. If you are deleting rules which evaluate a large number of resource types,\\n\\t\\t\\t\\tthis can lead to a spike in the number of CIs recorded.</p>\\n            <p>To avoid the associated costs, you can opt to disable recording \\n\\t\\t\\t\\tfor the <code>AWS::Config::ResourceCompliance</code> resource type before deleting rules, and re-enable recording after the rules have been deleted.</p>\\n            <p>However, since deleting rules is an asynchronous process, it might take an hour or more to complete. During the time\\n\\t\\t\\t\\twhen recording is disabled for <code>AWS::Config::ResourceCompliance</code>, rule evaluations will not be recorded in the associated resource’s history.</p>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.configservice#DeleteConfigRuleRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConfigRuleName\": {\n                    \"target\": \"com.amazonaws.configservice#ConfigRuleName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the Config rule that you want to\\n\\t\\t\\tdelete.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p></p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#DeleteConfigurationAggregator\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#DeleteConfigurationAggregatorRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#NoSuchConfigurationAggregatorException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the specified configuration aggregator and the\\n\\t\\t\\taggregated data associated with the aggregator.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#DeleteConfigurationAggregatorRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConfigurationAggregatorName\": {\n                    \"target\": \"com.amazonaws.configservice#ConfigurationAggregatorName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the configuration aggregator.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#DeleteConfigurationRecorder\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#DeleteConfigurationRecorderRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#NoSuchConfigurationRecorderException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#UnmodifiableEntityException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the customer managed configuration recorder.</p>\\n         <p>This operation does not delete the configuration information that\\n\\t\\t\\twas previously recorded. You will be able to access the previously\\n\\t\\t\\trecorded information by using the\\n\\t\\t\\t<a href=\\\"https://docs.aws.amazon.com/config/latest/APIReference/API_GetResourceConfigHistory.html\\\">GetResourceConfigHistory</a> operation, but you will not\\n\\t\\t\\tbe able to access this information in the Config console until\\n\\t\\t\\tyou have created a new customer managed configuration recorder.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#DeleteConfigurationRecorderRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConfigurationRecorderName\": {\n                    \"target\": \"com.amazonaws.configservice#RecorderName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the customer managed configuration recorder that you want to delete. You can\\n\\t\\t\\tretrieve the name of your configuration recorders by using the <a href=\\\"https://docs.aws.amazon.com/config/latest/APIReference/API_DescribeConfigurationRecorders.html\\\">DescribeConfigurationRecorders</a> operation.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The request object for the\\n\\t\\t\\t\\t<code>DeleteConfigurationRecorder</code> operation.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#DeleteConformancePack\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#DeleteConformancePackRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#NoSuchConformancePackException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#ResourceInUseException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the specified conformance pack and all the Config rules, remediation actions, and all evaluation results within that \\n\\t\\t\\tconformance pack.</p>\\n         <p>Config sets the conformance pack to <code>DELETE_IN_PROGRESS</code> until the deletion is complete. \\n\\t\\t\\tYou cannot update a conformance pack while it is in this state.</p>\\n         <note>\\n            <p>\\n               <b>Recommendation: Consider excluding the <code>AWS::Config::ResourceCompliance</code> resource type from recording before deleting rules</b>\\n            </p>\\n            <p>Deleting rules creates configuration items (CIs) for <code>AWS::Config::ResourceCompliance</code>\\n\\t\\t\\t\\tthat can affect your costs for the configuration recorder. If you are deleting rules which evaluate a large number of resource types,\\n\\t\\t\\t\\tthis can lead to a spike in the number of CIs recorded.</p>\\n            <p>To avoid the associated costs, you can opt to disable recording \\n\\t\\t\\t\\tfor the <code>AWS::Config::ResourceCompliance</code> resource type before deleting rules, and re-enable recording after the rules have been deleted.</p>\\n            <p>However, since deleting rules is an asynchronous process, it might take an hour or more to complete. During the time\\n\\t\\t\\t\\twhen recording is disabled for <code>AWS::Config::ResourceCompliance</code>, rule evaluations will not be recorded in the associated resource’s history.</p>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.configservice#DeleteConformancePackRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConformancePackName\": {\n                    \"target\": \"com.amazonaws.configservice#ConformancePackName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Name of the conformance pack you want to delete.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#DeleteDeliveryChannel\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#DeleteDeliveryChannelRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#LastDeliveryChannelDeleteFailedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#NoSuchDeliveryChannelException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the delivery channel.</p>\\n         <p>Before you can delete the delivery channel, you must stop the customer managed configuration recorder. You can use the <a>StopConfigurationRecorder</a> operation to stop the customer managed configuration recorder.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#DeleteDeliveryChannelRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DeliveryChannelName\": {\n                    \"target\": \"com.amazonaws.configservice#ChannelName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the delivery channel that you want to delete.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The input for the <a>DeleteDeliveryChannel</a>\\n\\t\\t\\taction. The action accepts the following data, in JSON format.\\n\\t\\t</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#DeleteEvaluationResults\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#DeleteEvaluationResultsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.configservice#DeleteEvaluationResultsResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#NoSuchConfigRuleException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#ResourceInUseException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the evaluation results for the specified Config\\n\\t\\t\\trule. You can specify one Config rule per request. After you\\n\\t\\t\\tdelete the evaluation results, you can call the <a>StartConfigRulesEvaluation</a> API to start evaluating\\n\\t\\t\\tyour Amazon Web Services resources against the rule.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#DeleteEvaluationResultsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConfigRuleName\": {\n                    \"target\": \"com.amazonaws.configservice#StringWithCharLimit64\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the Config rule for which you want to delete\\n\\t\\t\\tthe evaluation results.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p></p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#DeleteEvaluationResultsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {},\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The output when you delete the evaluation results for the\\n\\t\\t\\tspecified Config rule.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.configservice#DeleteOrganizationConfigRule\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#DeleteOrganizationConfigRuleRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#NoSuchOrganizationConfigRuleException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#OrganizationAccessDeniedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#ResourceInUseException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the specified organization Config rule and all of its evaluation results from all member accounts in that organization. </p>\\n         <p>Only a management account and a delegated administrator account can delete an organization Config rule.\\n\\t\\tWhen calling this API with a delegated administrator, you must ensure Organizations \\n\\t\\t\\t<code>ListDelegatedAdministrator</code> permissions are added.</p>\\n         <p>Config sets the state of a rule to DELETE_IN_PROGRESS until the deletion is complete. \\n\\t\\t\\tYou cannot update a rule while it is in this state.</p>\\n         <note>\\n            <p>\\n               <b>Recommendation: Consider excluding the <code>AWS::Config::ResourceCompliance</code> resource type from recording before deleting rules</b>\\n            </p>\\n            <p>Deleting rules creates configuration items (CIs) for <code>AWS::Config::ResourceCompliance</code>\\n\\t\\t\\t\\tthat can affect your costs for the configuration recorder. If you are deleting rules which evaluate a large number of resource types,\\n\\t\\t\\t\\tthis can lead to a spike in the number of CIs recorded.</p>\\n            <p>To avoid the associated costs, you can opt to disable recording \\n\\t\\t\\t\\tfor the <code>AWS::Config::ResourceCompliance</code> resource type before deleting rules, and re-enable recording after the rules have been deleted.</p>\\n            <p>However, since deleting rules is an asynchronous process, it might take an hour or more to complete. During the time\\n\\t\\t\\t\\twhen recording is disabled for <code>AWS::Config::ResourceCompliance</code>, rule evaluations will not be recorded in the associated resource’s history.</p>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.configservice#DeleteOrganizationConfigRuleRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"OrganizationConfigRuleName\": {\n                    \"target\": \"com.amazonaws.configservice#OrganizationConfigRuleName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of organization Config rule that you want to delete.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#DeleteOrganizationConformancePack\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#DeleteOrganizationConformancePackRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#NoSuchOrganizationConformancePackException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#OrganizationAccessDeniedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#ResourceInUseException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the specified organization conformance pack and all of the Config rules and remediation actions from\\n\\t\\t\\tall member accounts in that organization. </p>\\n         <p> Only a management account or a delegated administrator account can delete an organization conformance pack.\\n\\tWhen calling this API with a delegated administrator, you must ensure Organizations \\n\\t\\t<code>ListDelegatedAdministrator</code> permissions are added.</p>\\n         <p>Config sets the state of a conformance pack to DELETE_IN_PROGRESS until the deletion is complete. \\n\\t\\t\\t\\tYou cannot update a conformance pack while it is in this state. </p>\\n         <note>\\n            <p>\\n               <b>Recommendation: Consider excluding the <code>AWS::Config::ResourceCompliance</code> resource type from recording before deleting rules</b>\\n            </p>\\n            <p>Deleting rules creates configuration items (CIs) for <code>AWS::Config::ResourceCompliance</code>\\n\\t\\t\\t\\tthat can affect your costs for the configuration recorder. If you are deleting rules which evaluate a large number of resource types,\\n\\t\\t\\t\\tthis can lead to a spike in the number of CIs recorded.</p>\\n            <p>To avoid the associated costs, you can opt to disable recording \\n\\t\\t\\t\\tfor the <code>AWS::Config::ResourceCompliance</code> resource type before deleting rules, and re-enable recording after the rules have been deleted.</p>\\n            <p>However, since deleting rules is an asynchronous process, it might take an hour or more to complete. During the time\\n\\t\\t\\t\\twhen recording is disabled for <code>AWS::Config::ResourceCompliance</code>, rule evaluations will not be recorded in the associated resource’s history.</p>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.configservice#DeleteOrganizationConformancePackRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"OrganizationConformancePackName\": {\n                    \"target\": \"com.amazonaws.configservice#OrganizationConformancePackName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of organization conformance pack that you want to delete.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#DeletePendingAggregationRequest\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#DeletePendingAggregationRequestRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidParameterValueException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes pending authorization requests for a specified\\n\\t\\t\\taggregator account in a specified region.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#DeletePendingAggregationRequestRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RequesterAccountId\": {\n                    \"target\": \"com.amazonaws.configservice#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The 12-digit account ID of the account requesting to aggregate\\n\\t\\t\\tdata.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"RequesterAwsRegion\": {\n                    \"target\": \"com.amazonaws.configservice#AwsRegion\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The region requesting to aggregate data.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#DeleteRemediationConfiguration\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#DeleteRemediationConfigurationRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.configservice#DeleteRemediationConfigurationResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#InsufficientPermissionsException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#NoSuchRemediationConfigurationException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#RemediationInProgressException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the remediation configuration.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#DeleteRemediationConfigurationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConfigRuleName\": {\n                    \"target\": \"com.amazonaws.configservice#ConfigRuleName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the Config rule for which you want to delete remediation configuration.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ResourceType\": {\n                    \"target\": \"com.amazonaws.configservice#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of a resource.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#DeleteRemediationConfigurationResponse\": {\n            \"type\": \"structure\",\n            \"members\": {},\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.configservice#DeleteRemediationExceptions\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#DeleteRemediationExceptionsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.configservice#DeleteRemediationExceptionsResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#NoSuchRemediationExceptionException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes one or more remediation exceptions mentioned in the resource keys.</p>\\n         <note>\\n            <p>Config generates a remediation exception when a problem occurs executing a remediation action to a specific resource. \\n\\t\\t\\tRemediation exceptions blocks auto-remediation until the exception is cleared.</p>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.configservice#DeleteRemediationExceptionsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConfigRuleName\": {\n                    \"target\": \"com.amazonaws.configservice#ConfigRuleName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the Config rule for which you want to delete remediation exception configuration.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ResourceKeys\": {\n                    \"target\": \"com.amazonaws.configservice#RemediationExceptionResourceKeys\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An exception list of resource exception keys to be processed with the current request. Config adds exception for each resource key. For example, Config adds 3 exceptions for 3 resource keys. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#DeleteRemediationExceptionsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"FailedBatches\": {\n                    \"target\": \"com.amazonaws.configservice#FailedDeleteRemediationExceptionsBatches\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Returns a list of failed delete remediation exceptions batch objects. Each object in the batch consists of a list of failed items and failure messages.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.configservice#DeleteResourceConfig\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#DeleteResourceConfigRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#NoRunningConfigurationRecorderException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Records the configuration state for a custom resource that has been deleted.  This API records a new ConfigurationItem with a ResourceDeleted status. You can retrieve the ConfigurationItems recorded for this resource in your Config History.\\n\\t\\t\\t </p>\"\n            }\n        },\n        \"com.amazonaws.configservice#DeleteResourceConfigRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ResourceType\": {\n                    \"target\": \"com.amazonaws.configservice#ResourceTypeString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of the resource.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ResourceId\": {\n                    \"target\": \"com.amazonaws.configservice#ResourceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Unique identifier of the resource.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#DeleteRetentionConfiguration\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#DeleteRetentionConfigurationRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#NoSuchRetentionConfigurationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the retention configuration.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#DeleteRetentionConfigurationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RetentionConfigurationName\": {\n                    \"target\": \"com.amazonaws.configservice#RetentionConfigurationName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the retention configuration to delete.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#DeleteServiceLinkedConfigurationRecorder\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#DeleteServiceLinkedConfigurationRecorderRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.configservice#DeleteServiceLinkedConfigurationRecorderResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#ConflictException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#NoSuchConfigurationRecorderException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes an existing service-linked configuration recorder.</p>\\n         <p>This operation does not delete the configuration information that was previously recorded. You will be able to access the previously\\n\\t\\t\\trecorded information by using the\\n\\t\\t\\t<a href=\\\"https://docs.aws.amazon.com/config/latest/APIReference/API_GetResourceConfigHistory.html\\\">GetResourceConfigHistory</a> operation, but you will not\\n\\t\\t\\tbe able to access this information in the Config console until\\n\\t\\t\\tyou have created a new service-linked configuration recorder for the same service.</p>\\n         <note>\\n            <p>\\n               <b>The recording scope determines if you receive configuration items</b>\\n            </p>\\n            <p>The recording scope is set by the service that is linked to the configuration recorder and determines whether you receive configuration items (CIs) in the delivery channel. If the recording scope is internal, you will not receive CIs in the delivery channel.</p>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.configservice#DeleteServiceLinkedConfigurationRecorderRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ServicePrincipal\": {\n                    \"target\": \"com.amazonaws.configservice#ServicePrincipal\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The service principal of the Amazon Web Services service for the service-linked configuration recorder that you want to delete.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#DeleteServiceLinkedConfigurationRecorderResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Arn\": {\n                    \"target\": \"com.amazonaws.configservice#AmazonResourceName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the specified configuration recorder.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Name\": {\n                    \"target\": \"com.amazonaws.configservice#RecorderName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the specified configuration recorder.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.configservice#DeleteStoredQuery\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#DeleteStoredQueryRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.configservice#DeleteStoredQueryResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the stored query for a single Amazon Web Services account and a single Amazon Web Services Region.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#DeleteStoredQueryRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"QueryName\": {\n                    \"target\": \"com.amazonaws.configservice#QueryName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the query that you want to delete.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#DeleteStoredQueryResponse\": {\n            \"type\": \"structure\",\n            \"members\": {},\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.configservice#DeliverConfigSnapshot\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#DeliverConfigSnapshotRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.configservice#DeliverConfigSnapshotResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#NoAvailableConfigurationRecorderException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#NoRunningConfigurationRecorderException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#NoSuchDeliveryChannelException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Schedules delivery of a configuration snapshot to the Amazon S3\\n\\t\\t\\tbucket in the specified delivery channel. After the delivery has\\n\\t\\t\\tstarted, Config sends the following notifications using an\\n\\t\\t\\tAmazon SNS topic that you have specified.</p>\\n         <ul>\\n            <li>\\n               <p>Notification of the start of the delivery.</p>\\n            </li>\\n            <li>\\n               <p>Notification of the completion of the delivery, if the\\n\\t\\t\\t\\t\\tdelivery was successfully completed.</p>\\n            </li>\\n            <li>\\n               <p>Notification of delivery failure, if the delivery\\n\\t\\t\\t\\t\\tfailed.</p>\\n            </li>\\n         </ul>\"\n            }\n        },\n        \"com.amazonaws.configservice#DeliverConfigSnapshotRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"deliveryChannelName\": {\n                    \"target\": \"com.amazonaws.configservice#ChannelName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the delivery channel through which the snapshot is\\n\\t\\t\\tdelivered.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The input for the <a>DeliverConfigSnapshot</a>\\n\\t\\t\\taction.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#DeliverConfigSnapshotResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"configSnapshotId\": {\n                    \"target\": \"com.amazonaws.configservice#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the snapshot that is being created.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The output for the <a>DeliverConfigSnapshot</a>\\n\\t\\t\\taction, in JSON format.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.configservice#DeliveryChannel\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"name\": {\n                    \"target\": \"com.amazonaws.configservice#ChannelName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the delivery channel. By default, Config\\n\\t\\t\\tassigns the name \\\"default\\\" when creating the delivery channel. To\\n\\t\\t\\tchange the delivery channel name, you must use the\\n\\t\\t\\tDeleteDeliveryChannel action to delete your current delivery\\n\\t\\t\\tchannel, and then you must use the PutDeliveryChannel command to\\n\\t\\t\\tcreate a delivery channel that has the desired name.</p>\"\n                    }\n                },\n                \"s3BucketName\": {\n                    \"target\": \"com.amazonaws.configservice#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the Amazon S3 bucket to which Config delivers\\n\\t\\t\\tconfiguration snapshots and configuration history files.</p>\\n         <p>If you specify a bucket that belongs to another Amazon Web Services account,\\n\\t\\t\\tthat bucket must have policies that grant access permissions to Config. For more information, see <a href=\\\"https://docs.aws.amazon.com/config/latest/developerguide/s3-bucket-policy.html\\\">Permissions for the Amazon S3 Bucket</a> in the <i>Config\\n\\t\\t\\tDeveloper Guide</i>.</p>\"\n                    }\n                },\n                \"s3KeyPrefix\": {\n                    \"target\": \"com.amazonaws.configservice#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The prefix for the specified Amazon S3 bucket.</p>\"\n                    }\n                },\n                \"s3KmsKeyArn\": {\n                    \"target\": \"com.amazonaws.configservice#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the Key Management Service (KMS ) KMS key (KMS key) used to encrypt objects delivered by Config.\\n\\t\\t\\tMust belong to the same Region as the destination S3 bucket.</p>\"\n                    }\n                },\n                \"snsTopicARN\": {\n                    \"target\": \"com.amazonaws.configservice#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the Amazon SNS topic to which\\n\\t\\t\\tConfig sends notifications about configuration\\n\\t\\t\\tchanges.</p>\\n         <p>If you choose a topic from another account, the topic must have\\n\\t\\t\\tpolicies that grant access permissions to Config. For more\\n\\t\\t\\tinformation, see <a href=\\\"https://docs.aws.amazon.com/config/latest/developerguide/sns-topic-policy.html\\\">Permissions for the Amazon SNS Topic</a> in the <i>Config\\n\\t\\t\\tDeveloper Guide</i>.</p>\"\n                    }\n                },\n                \"configSnapshotDeliveryProperties\": {\n                    \"target\": \"com.amazonaws.configservice#ConfigSnapshotDeliveryProperties\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The options for how often Config delivers configuration\\n\\t\\t\\tsnapshots to the Amazon S3 bucket.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The channel through which Config delivers notifications and\\n\\t\\t\\tupdated configuration states.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#DeliveryChannelList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#DeliveryChannel\"\n            }\n        },\n        \"com.amazonaws.configservice#DeliveryChannelNameList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#ChannelName\"\n            }\n        },\n        \"com.amazonaws.configservice#DeliveryChannelStatus\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"name\": {\n                    \"target\": \"com.amazonaws.configservice#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the delivery channel.</p>\"\n                    }\n                },\n                \"configSnapshotDeliveryInfo\": {\n                    \"target\": \"com.amazonaws.configservice#ConfigExportDeliveryInfo\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list containing the status of the delivery of the snapshot to\\n\\t\\t\\tthe specified Amazon S3 bucket.</p>\"\n                    }\n                },\n                \"configHistoryDeliveryInfo\": {\n                    \"target\": \"com.amazonaws.configservice#ConfigExportDeliveryInfo\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list that contains the status of the delivery of the\\n\\t\\t\\tconfiguration history to the specified Amazon S3 bucket.</p>\"\n                    }\n                },\n                \"configStreamDeliveryInfo\": {\n                    \"target\": \"com.amazonaws.configservice#ConfigStreamDeliveryInfo\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list containing the status of the delivery of the\\n\\t\\t\\tconfiguration stream notification to the specified Amazon SNS\\n\\t\\t\\ttopic.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The status of a specified delivery channel.</p>\\n         <p>Valid values: <code>Success</code> | <code>Failure</code>\\n         </p>\"\n            }\n        },\n        \"com.amazonaws.configservice#DeliveryChannelStatusList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#DeliveryChannelStatus\"\n            }\n        },\n        \"com.amazonaws.configservice#DeliveryS3Bucket\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 63\n                }\n            }\n        },\n        \"com.amazonaws.configservice#DeliveryS3KeyPrefix\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 1024\n                }\n            }\n        },\n        \"com.amazonaws.configservice#DeliveryStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"Success\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Success\"\n                    }\n                },\n                \"Failure\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Failure\"\n                    }\n                },\n                \"Not_Applicable\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Not_Applicable\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.configservice#DescribeAggregateComplianceByConfigRules\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#DescribeAggregateComplianceByConfigRulesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.configservice#DescribeAggregateComplianceByConfigRulesResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidLimitException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidNextTokenException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#NoSuchConfigurationAggregatorException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns a list of compliant and noncompliant rules with the\\n\\t\\t\\tnumber of resources for compliant and noncompliant rules. Does not display rules that do not have compliance results. \\n\\t\\t\\t</p>\\n         <note>\\n            <p>The results can return an empty result page, but if you\\n\\t\\t\\t\\thave a <code>nextToken</code>, the results are displayed on the next\\n\\t\\t\\t\\tpage.</p>\\n         </note>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"pageSize\": \"Limit\"\n                }\n            }\n        },\n        \"com.amazonaws.configservice#DescribeAggregateComplianceByConfigRulesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConfigurationAggregatorName\": {\n                    \"target\": \"com.amazonaws.configservice#ConfigurationAggregatorName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the configuration aggregator.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.configservice#ConfigRuleComplianceFilters\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Filters the results by ConfigRuleComplianceFilters object.\\n\\t\\t</p>\"\n                    }\n                },\n                \"Limit\": {\n                    \"target\": \"com.amazonaws.configservice#GroupByAPILimit\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The maximum number of evaluation results returned on each page.\\n\\t\\t\\tThe default is\\n\\t\\t\\tmaximum.\\n\\t\\t\\tIf you specify 0, Config uses the default.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.configservice#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>nextToken</code> string returned on a previous page that you use\\n\\t\\t\\tto get the next page of results in a paginated response.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#DescribeAggregateComplianceByConfigRulesResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AggregateComplianceByConfigRules\": {\n                    \"target\": \"com.amazonaws.configservice#AggregateComplianceByConfigRuleList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Returns a list of AggregateComplianceByConfigRule\\n\\t\\t\\tobject.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.configservice#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>nextToken</code> string returned on a previous page that you use\\n\\t\\t\\tto get the next page of results in a paginated response.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.configservice#DescribeAggregateComplianceByConformancePacks\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#DescribeAggregateComplianceByConformancePacksRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.configservice#DescribeAggregateComplianceByConformancePacksResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidLimitException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidNextTokenException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#NoSuchConfigurationAggregatorException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns a list of the existing and deleted conformance packs and their associated compliance status with the count of compliant and noncompliant Config rules within each \\n\\t\\t\\tconformance pack. Also returns the total rule count which includes compliant rules, noncompliant rules, and rules that cannot be evaluated due to insufficient data.</p>\\n         <note>\\n            <p>The results can return an empty result page, but if you have a <code>nextToken</code>, the results are displayed on the next page.</p>\\n         </note>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"AggregateComplianceByConformancePacks\",\n                    \"pageSize\": \"Limit\"\n                }\n            }\n        },\n        \"com.amazonaws.configservice#DescribeAggregateComplianceByConformancePacksRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConfigurationAggregatorName\": {\n                    \"target\": \"com.amazonaws.configservice#ConfigurationAggregatorName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the configuration aggregator.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.configservice#AggregateConformancePackComplianceFilters\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Filters the result by <code>AggregateConformancePackComplianceFilters</code> object.</p>\"\n                    }\n                },\n                \"Limit\": {\n                    \"target\": \"com.amazonaws.configservice#Limit\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The maximum number of conformance packs compliance details returned on each page. The default is maximum. If you specify 0, Config uses the default. </p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.configservice#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>nextToken</code> string returned on a previous page that you use to get the next page of results in a paginated response.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#DescribeAggregateComplianceByConformancePacksResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AggregateComplianceByConformancePacks\": {\n                    \"target\": \"com.amazonaws.configservice#AggregateComplianceByConformancePackList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Returns the <code>AggregateComplianceByConformancePack</code> object.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.configservice#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>nextToken</code> string returned on a previous page that you use to get the next page of results in a paginated response.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.configservice#DescribeAggregationAuthorizations\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#DescribeAggregationAuthorizationsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.configservice#DescribeAggregationAuthorizationsResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidLimitException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidNextTokenException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidParameterValueException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns a list of authorizations granted to various aggregator\\n\\t\\t\\taccounts and regions.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"AggregationAuthorizations\",\n                    \"pageSize\": \"Limit\"\n                }\n            }\n        },\n        \"com.amazonaws.configservice#DescribeAggregationAuthorizationsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Limit\": {\n                    \"target\": \"com.amazonaws.configservice#Limit\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The maximum number of AggregationAuthorizations returned on\\n\\t\\t\\teach page. The default is maximum. If you specify 0, Config uses\\n\\t\\t\\tthe default.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.configservice#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>nextToken</code> string returned on a previous page that you use\\n\\t\\t\\tto get the next page of results in a paginated response.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#DescribeAggregationAuthorizationsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AggregationAuthorizations\": {\n                    \"target\": \"com.amazonaws.configservice#AggregationAuthorizationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Returns a list of authorizations granted to various aggregator\\n\\t\\t\\taccounts and regions.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.configservice#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>nextToken</code> string returned on a previous page that you use\\n\\t\\t\\tto get the next page of results in a paginated response.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.configservice#DescribeComplianceByConfigRule\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#DescribeComplianceByConfigRuleRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.configservice#DescribeComplianceByConfigRuleResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidNextTokenException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#NoSuchConfigRuleException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Indicates whether the specified Config rules are compliant.\\n\\t\\t\\tIf a rule is noncompliant, this operation returns the number of Amazon Web Services\\n\\t\\t\\tresources that do not comply with the rule.</p>\\n         <p>A rule is compliant if all of the evaluated resources comply\\n\\t\\t\\twith it. It is noncompliant if any of these resources do not\\n\\t\\t\\tcomply.</p>\\n         <p>If Config has no current evaluation results for the rule,\\n\\t\\t\\tit returns <code>INSUFFICIENT_DATA</code>. This result might\\n\\t\\t\\tindicate one of the following conditions:</p>\\n         <ul>\\n            <li>\\n               <p>Config has never invoked an evaluation for the\\n\\t\\t\\t\\t\\trule. To check whether it has, use the\\n\\t\\t\\t\\t\\t\\t<code>DescribeConfigRuleEvaluationStatus</code> action\\n\\t\\t\\t\\t\\tto get the <code>LastSuccessfulInvocationTime</code> and\\n\\t\\t\\t\\t\\t\\t<code>LastFailedInvocationTime</code>.</p>\\n            </li>\\n            <li>\\n               <p>The rule's Lambda function is failing to send\\n\\t\\t\\t\\t\\tevaluation results to Config. Verify that the role you\\n\\t\\t\\t\\t\\tassigned to your configuration recorder includes the\\n\\t\\t\\t\\t\\t\\t<code>config:PutEvaluations</code> permission. If the\\n\\t\\t\\t\\t\\trule is a custom rule, verify that the Lambda execution\\n\\t\\t\\t\\t\\trole includes the <code>config:PutEvaluations</code>\\n\\t\\t\\t\\t\\tpermission.</p>\\n            </li>\\n            <li>\\n               <p>The rule's Lambda function has returned\\n\\t\\t\\t\\t\\t\\t<code>NOT_APPLICABLE</code> for all evaluation results.\\n\\t\\t\\t\\t\\tThis can occur if the resources were deleted or removed from\\n\\t\\t\\t\\t\\tthe rule's scope.</p>\\n            </li>\\n         </ul>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"ComplianceByConfigRules\"\n                }\n            }\n        },\n        \"com.amazonaws.configservice#DescribeComplianceByConfigRuleRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConfigRuleNames\": {\n                    \"target\": \"com.amazonaws.configservice#ConfigRuleNames\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify one or more Config rule names to filter the results\\n\\t\\t\\tby rule.</p>\"\n                    }\n                },\n                \"ComplianceTypes\": {\n                    \"target\": \"com.amazonaws.configservice#ComplianceTypes\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Filters the results by compliance.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.configservice#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>nextToken</code> string returned on a previous page\\n\\t\\t\\tthat you use to get the next page of results in a paginated\\n\\t\\t\\tresponse.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p></p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#DescribeComplianceByConfigRuleResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ComplianceByConfigRules\": {\n                    \"target\": \"com.amazonaws.configservice#ComplianceByConfigRules\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether each of the specified Config rules is\\n\\t\\t\\tcompliant.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.configservice#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The string that you use in a subsequent request to get the next\\n\\t\\t\\tpage of results in a paginated response.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p></p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.configservice#DescribeComplianceByResource\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#DescribeComplianceByResourceRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.configservice#DescribeComplianceByResourceResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidNextTokenException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidParameterValueException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Indicates whether the specified Amazon Web Services resources are compliant. If\\n\\t\\t\\ta resource is noncompliant, this operation returns the number of Config rules that the resource does not comply with.</p>\\n         <p>A resource is compliant if it complies with all the Config\\n\\t\\t\\trules that evaluate it. It is noncompliant if it does not comply\\n\\t\\t\\twith one or more of these rules.</p>\\n         <p>If Config has no current evaluation results for the\\n\\t\\t\\tresource, it returns <code>INSUFFICIENT_DATA</code>. This result\\n\\t\\t\\tmight indicate one of the following conditions about the rules that\\n\\t\\t\\tevaluate the resource:</p>\\n         <ul>\\n            <li>\\n               <p>Config has never invoked an evaluation for the\\n\\t\\t\\t\\t\\trule. To check whether it has, use the\\n\\t\\t\\t\\t\\t\\t<code>DescribeConfigRuleEvaluationStatus</code> action\\n\\t\\t\\t\\t\\tto get the <code>LastSuccessfulInvocationTime</code> and\\n\\t\\t\\t\\t\\t\\t<code>LastFailedInvocationTime</code>.</p>\\n            </li>\\n            <li>\\n               <p>The rule's Lambda function is failing to send\\n\\t\\t\\t\\t\\tevaluation results to Config. Verify that the role that\\n\\t\\t\\t\\t\\tyou assigned to your configuration recorder includes the\\n\\t\\t\\t\\t\\t\\t<code>config:PutEvaluations</code> permission. If the\\n\\t\\t\\t\\t\\trule is a custom rule, verify that the Lambda execution\\n\\t\\t\\t\\t\\trole includes the <code>config:PutEvaluations</code>\\n\\t\\t\\t\\t\\tpermission.</p>\\n            </li>\\n            <li>\\n               <p>The rule's Lambda function has returned\\n\\t\\t\\t\\t\\t\\t<code>NOT_APPLICABLE</code> for all evaluation results.\\n\\t\\t\\t\\t\\tThis can occur if the resources were deleted or removed from\\n\\t\\t\\t\\t\\tthe rule's scope.</p>\\n            </li>\\n         </ul>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"ComplianceByResources\",\n                    \"pageSize\": \"Limit\"\n                }\n            }\n        },\n        \"com.amazonaws.configservice#DescribeComplianceByResourceRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ResourceType\": {\n                    \"target\": \"com.amazonaws.configservice#StringWithCharLimit256\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The types of Amazon Web Services resources for which you want compliance\\n\\t\\t\\tinformation (for example, <code>AWS::EC2::Instance</code>). For this operation, you can specify that the resource type is an Amazon Web Services account by\\n\\t\\t\\tspecifying <code>AWS::::Account</code>.</p>\"\n                    }\n                },\n                \"ResourceId\": {\n                    \"target\": \"com.amazonaws.configservice#BaseResourceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the Amazon Web Services resource for which you want compliance\\n\\t\\t\\tinformation. You can specify only one resource ID. If you specify a\\n\\t\\t\\tresource ID, you must also specify a type for\\n\\t\\t\\t\\t<code>ResourceType</code>.</p>\"\n                    }\n                },\n                \"ComplianceTypes\": {\n                    \"target\": \"com.amazonaws.configservice#ComplianceTypes\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Filters the results by compliance.</p>\"\n                    }\n                },\n                \"Limit\": {\n                    \"target\": \"com.amazonaws.configservice#Limit\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The maximum number of evaluation results returned on each page.\\n\\t\\t\\tThe default is 10. You cannot specify a number greater than 100. If\\n\\t\\t\\tyou specify 0, Config uses the default.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.configservice#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>nextToken</code> string returned on a previous page\\n\\t\\t\\tthat you use to get the next page of results in a paginated\\n\\t\\t\\tresponse.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p></p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#DescribeComplianceByResourceResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ComplianceByResources\": {\n                    \"target\": \"com.amazonaws.configservice#ComplianceByResources\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether the specified Amazon Web Services resource complies with all\\n\\t\\t\\tof the Config rules that evaluate it.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.configservice#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The string that you use in a subsequent request to get the next\\n\\t\\t\\tpage of results in a paginated response.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p></p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.configservice#DescribeConfigRuleEvaluationStatus\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#DescribeConfigRuleEvaluationStatusRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.configservice#DescribeConfigRuleEvaluationStatusResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidNextTokenException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#NoSuchConfigRuleException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns status information for each of your Config managed rules. The status includes information such as the last time Config invoked the rule, the last time Config failed to invoke\\n\\t\\t\\tthe rule, and the related error for the last failure.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"ConfigRulesEvaluationStatus\",\n                    \"pageSize\": \"Limit\"\n                }\n            }\n        },\n        \"com.amazonaws.configservice#DescribeConfigRuleEvaluationStatusRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConfigRuleNames\": {\n                    \"target\": \"com.amazonaws.configservice#ConfigRuleNames\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the Config managed rules for which you want\\n\\t\\t\\tstatus information. If you do not specify any names, Config\\n\\t\\t\\treturns status information for all Config managed rules that you\\n\\t\\t\\tuse.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.configservice#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>nextToken</code> string returned on a previous page\\n\\t\\t\\tthat you use to get the next page of results in a paginated\\n\\t\\t\\tresponse.</p>\"\n                    }\n                },\n                \"Limit\": {\n                    \"target\": \"com.amazonaws.configservice#RuleLimit\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The number of rule evaluation results that you want\\n\\t\\t\\treturned.</p>\\n         <p>This parameter is required if the rule limit for your account\\n\\t\\t\\tis more than the default of 1000 rules.</p>\\n         <p>For information about requesting a rule limit increase, see\\n\\t\\t\\t\\t<a href=\\\"http://docs.aws.amazon.com/general/latest/gr/aws_service_limits.html#limits_config\\\">Config Limits</a> in the <i>Amazon Web Services General\\n\\t\\t\\t\\tReference Guide</i>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p></p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#DescribeConfigRuleEvaluationStatusResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConfigRulesEvaluationStatus\": {\n                    \"target\": \"com.amazonaws.configservice#ConfigRuleEvaluationStatusList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Status information about your Config managed rules.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.configservice#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The string that you use in a subsequent request to get the next\\n\\t\\t\\tpage of results in a paginated response.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p></p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.configservice#DescribeConfigRules\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#DescribeConfigRulesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.configservice#DescribeConfigRulesResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidNextTokenException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#NoSuchConfigRuleException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns details about your Config rules.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"ConfigRules\"\n                }\n            }\n        },\n        \"com.amazonaws.configservice#DescribeConfigRulesFilters\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"EvaluationMode\": {\n                    \"target\": \"com.amazonaws.configservice#EvaluationMode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The mode of an evaluation. The valid values are Detective or Proactive.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns a filtered list of Detective or Proactive Config rules. By default, if the filter is not defined, this API returns an unfiltered list. For more information on Detective or Proactive Config rules,\\n\\t\\t\\tsee <a href=\\\"https://docs.aws.amazon.com/config/latest/developerguide/evaluate-config-rules.html\\\">\\n               <b>Evaluation Mode</b>\\n            </a> in the <i>Config Developer Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#DescribeConfigRulesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConfigRuleNames\": {\n                    \"target\": \"com.amazonaws.configservice#ConfigRuleNames\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The names of the Config rules for which you want details.\\n\\t\\t\\tIf you do not specify any names, Config returns details for all\\n\\t\\t\\tyour rules.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.configservice#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>nextToken</code> string returned on a previous page\\n\\t\\t\\tthat you use to get the next page of results in a paginated\\n\\t\\t\\tresponse.</p>\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.configservice#DescribeConfigRulesFilters\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Returns a list of Detective or Proactive Config rules. By default, this API returns an unfiltered list. For more information on Detective or Proactive Config rules,\\n\\t\\t\\tsee <a href=\\\"https://docs.aws.amazon.com/config/latest/developerguide/evaluate-config-rules.html\\\">\\n               <b>Evaluation Mode</b>\\n            </a> in the <i>Config Developer Guide</i>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p></p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#DescribeConfigRulesResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConfigRules\": {\n                    \"target\": \"com.amazonaws.configservice#ConfigRules\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The details about your Config rules.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.configservice#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The string that you use in a subsequent request to get the next\\n\\t\\t\\tpage of results in a paginated response.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p></p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.configservice#DescribeConfigurationAggregatorSourcesStatus\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#DescribeConfigurationAggregatorSourcesStatusRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.configservice#DescribeConfigurationAggregatorSourcesStatusResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidLimitException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidNextTokenException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#NoSuchConfigurationAggregatorException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns status information for sources within an aggregator.\\n\\t\\t\\tThe status includes information about the last time Config verified authorization between the source account and an aggregator account. In case of a failure, the status contains the related error code or message. </p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"AggregatedSourceStatusList\",\n                    \"pageSize\": \"Limit\"\n                }\n            }\n        },\n        \"com.amazonaws.configservice#DescribeConfigurationAggregatorSourcesStatusRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConfigurationAggregatorName\": {\n                    \"target\": \"com.amazonaws.configservice#ConfigurationAggregatorName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the configuration aggregator.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"UpdateStatus\": {\n                    \"target\": \"com.amazonaws.configservice#AggregatedSourceStatusTypeList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Filters the status type.</p>\\n         <ul>\\n            <li>\\n               <p>Valid value FAILED indicates errors while moving\\n\\t\\t\\t\\t\\tdata.</p>\\n            </li>\\n            <li>\\n               <p>Valid value SUCCEEDED indicates the data was\\n\\t\\t\\t\\t\\tsuccessfully moved.</p>\\n            </li>\\n            <li>\\n               <p>Valid value OUTDATED indicates the data is not the most\\n\\t\\t\\t\\t\\trecent.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.configservice#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>nextToken</code> string returned on a previous page that you use\\n\\t\\t\\tto get the next page of results in a paginated response.</p>\"\n                    }\n                },\n                \"Limit\": {\n                    \"target\": \"com.amazonaws.configservice#Limit\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The maximum number of AggregatorSourceStatus returned on each\\n\\t\\t\\tpage. The default is maximum. If you specify 0, Config uses the\\n\\t\\t\\tdefault.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#DescribeConfigurationAggregatorSourcesStatusResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AggregatedSourceStatusList\": {\n                    \"target\": \"com.amazonaws.configservice#AggregatedSourceStatusList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Returns an AggregatedSourceStatus object.\\n\\t\\t\\t</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.configservice#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>nextToken</code> string returned on a previous page that you use\\n\\t\\t\\tto get the next page of results in a paginated response.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.configservice#DescribeConfigurationAggregators\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#DescribeConfigurationAggregatorsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.configservice#DescribeConfigurationAggregatorsResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidLimitException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidNextTokenException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#NoSuchConfigurationAggregatorException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns the details of one or more configuration aggregators.\\n\\t\\t\\tIf the configuration aggregator is not specified, this operation\\n\\t\\t\\treturns the details for all the configuration aggregators associated\\n\\t\\t\\twith the account. </p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"ConfigurationAggregators\",\n                    \"pageSize\": \"Limit\"\n                }\n            }\n        },\n        \"com.amazonaws.configservice#DescribeConfigurationAggregatorsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConfigurationAggregatorNames\": {\n                    \"target\": \"com.amazonaws.configservice#ConfigurationAggregatorNameList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the configuration aggregators.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.configservice#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>nextToken</code> string returned on a previous page that you use\\n\\t\\t\\tto get the next page of results in a paginated response.</p>\"\n                    }\n                },\n                \"Limit\": {\n                    \"target\": \"com.amazonaws.configservice#Limit\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The maximum number of configuration aggregators returned on\\n\\t\\t\\teach page. The default is maximum. If you specify 0, Config uses\\n\\t\\t\\tthe default.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#DescribeConfigurationAggregatorsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConfigurationAggregators\": {\n                    \"target\": \"com.amazonaws.configservice#ConfigurationAggregatorList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Returns a ConfigurationAggregators object.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.configservice#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>nextToken</code> string returned on a previous page that you use\\n\\t\\t\\tto get the next page of results in a paginated response.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.configservice#DescribeConfigurationRecorderStatus\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#DescribeConfigurationRecorderStatusRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.configservice#DescribeConfigurationRecorderStatusResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#NoSuchConfigurationRecorderException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns the current status of the configuration\\n\\t\\t\\trecorder you specify as well as the status of the last recording event for the configuration recorders.</p>\\n         <p>For a detailed status of recording events over time, add your Config events to Amazon CloudWatch metrics and use CloudWatch metrics.</p>\\n         <p>If a configuration recorder is not specified, this operation returns the status for the customer managed configuration recorder configured for the\\n\\t\\t\\taccount, if applicable.</p>\\n         <note>\\n            <p>When making a request to this operation, you can only specify one configuration recorder.</p>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.configservice#DescribeConfigurationRecorderStatusRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConfigurationRecorderNames\": {\n                    \"target\": \"com.amazonaws.configservice#ConfigurationRecorderNameList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the configuration recorder. If the name is not\\n\\t\\t\\tspecified, the operation returns the status for the customer managed configuration recorder configured for the\\n\\t\\t\\taccount, if applicable.</p>\\n         <note>\\n            <p>When making a request to this operation, you can only specify one configuration recorder.</p>\\n         </note>\"\n                    }\n                },\n                \"ServicePrincipal\": {\n                    \"target\": \"com.amazonaws.configservice#ServicePrincipal\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>For service-linked configuration recorders, you can use the service principal of the linked Amazon Web Services service to specify the configuration recorder.</p>\"\n                    }\n                },\n                \"Arn\": {\n                    \"target\": \"com.amazonaws.configservice#AmazonResourceName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the configuration recorder that you want to specify.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The input for the <a>DescribeConfigurationRecorderStatus</a>\\n\\t\\t\\taction.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#DescribeConfigurationRecorderStatusResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConfigurationRecordersStatus\": {\n                    \"target\": \"com.amazonaws.configservice#ConfigurationRecorderStatusList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list that contains status of the specified\\n\\t\\t\\trecorders.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The output for the <a>DescribeConfigurationRecorderStatus</a> action, in JSON\\n\\t\\t\\tformat.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.configservice#DescribeConfigurationRecorders\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#DescribeConfigurationRecordersRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.configservice#DescribeConfigurationRecordersResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#NoSuchConfigurationRecorderException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns details for the configuration recorder you specify.</p>\\n         <p>If a configuration recorder is not specified, this operation returns details for the customer managed configuration recorder configured for the\\n\\t\\t\\taccount, if applicable.</p>\\n         <note>\\n            <p>When making a request to this operation, you can only specify one configuration recorder.</p>\\n         </note>\",\n                \"smithy.test#smokeTests\": [\n                    {\n                        \"id\": \"DescribeConfigurationRecordersSuccess\",\n                        \"params\": {},\n                        \"vendorParams\": {\n                            \"region\": \"us-west-2\"\n                        },\n                        \"vendorParamsShape\": \"aws.test#AwsVendorParams\",\n                        \"expect\": {\n                            \"success\": {}\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.configservice#DescribeConfigurationRecordersRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConfigurationRecorderNames\": {\n                    \"target\": \"com.amazonaws.configservice#ConfigurationRecorderNameList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of names of the configuration recorders that you want to specify.</p>\\n         <note>\\n            <p>When making a request to this operation, you can only specify one configuration recorder.</p>\\n         </note>\"\n                    }\n                },\n                \"ServicePrincipal\": {\n                    \"target\": \"com.amazonaws.configservice#ServicePrincipal\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>For service-linked configuration recorders, you can use the service principal of the linked Amazon Web Services service to specify the configuration recorder.</p>\"\n                    }\n                },\n                \"Arn\": {\n                    \"target\": \"com.amazonaws.configservice#AmazonResourceName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the configuration recorder that you want to specify.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The input for the <a>DescribeConfigurationRecorders</a> action.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#DescribeConfigurationRecordersResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConfigurationRecorders\": {\n                    \"target\": \"com.amazonaws.configservice#ConfigurationRecorderList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list that contains the descriptions of the specified\\n\\t\\t\\tconfiguration recorders.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The output for the <a>DescribeConfigurationRecorders</a> action.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.configservice#DescribeConformancePackCompliance\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#DescribeConformancePackComplianceRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.configservice#DescribeConformancePackComplianceResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidLimitException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidNextTokenException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#NoSuchConfigRuleInConformancePackException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#NoSuchConformancePackException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns compliance details for each rule in that conformance pack.</p>\\n         <note>\\n            <p>You must provide exact rule names.</p>\\n         </note>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"pageSize\": \"Limit\"\n                }\n            }\n        },\n        \"com.amazonaws.configservice#DescribeConformancePackComplianceLimit\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#default\": 0,\n                \"smithy.api#range\": {\n                    \"min\": 0,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.configservice#DescribeConformancePackComplianceRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConformancePackName\": {\n                    \"target\": \"com.amazonaws.configservice#ConformancePackName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Name of the conformance pack.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.configservice#ConformancePackComplianceFilters\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A <code>ConformancePackComplianceFilters</code> object.</p>\"\n                    }\n                },\n                \"Limit\": {\n                    \"target\": \"com.amazonaws.configservice#DescribeConformancePackComplianceLimit\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The maximum number of Config rules within a conformance pack are returned on each page.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.configservice#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>nextToken</code> string returned in a previous request that you use to request the next page of results in a paginated response.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#DescribeConformancePackComplianceResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConformancePackName\": {\n                    \"target\": \"com.amazonaws.configservice#ConformancePackName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Name of the conformance pack.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ConformancePackRuleComplianceList\": {\n                    \"target\": \"com.amazonaws.configservice#ConformancePackRuleComplianceList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Returns a list of <code>ConformancePackRuleCompliance</code> objects.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.configservice#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>nextToken</code> string returned in a previous request that you use to request the next page of results in a paginated response.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.configservice#DescribeConformancePackStatus\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#DescribeConformancePackStatusRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.configservice#DescribeConformancePackStatusResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidLimitException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidNextTokenException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidParameterValueException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Provides one or more conformance packs deployment status.</p>\\n         <note>\\n            <p>If there are no conformance packs then you will see an empty result.</p>\\n         </note>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"ConformancePackStatusDetails\",\n                    \"pageSize\": \"Limit\"\n                }\n            }\n        },\n        \"com.amazonaws.configservice#DescribeConformancePackStatusRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConformancePackNames\": {\n                    \"target\": \"com.amazonaws.configservice#ConformancePackNamesList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Comma-separated list of conformance pack names.</p>\"\n                    }\n                },\n                \"Limit\": {\n                    \"target\": \"com.amazonaws.configservice#PageSizeLimit\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The maximum number of conformance packs status returned on each page.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.configservice#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>nextToken</code> string returned in a previous request that you use to request the next page of results in a paginated response.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#DescribeConformancePackStatusResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConformancePackStatusDetails\": {\n                    \"target\": \"com.amazonaws.configservice#ConformancePackStatusDetailsList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of <code>ConformancePackStatusDetail</code> objects.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.configservice#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>nextToken</code> string returned in a previous request that you use to request the next page of results in a paginated response.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.configservice#DescribeConformancePacks\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#DescribeConformancePacksRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.configservice#DescribeConformancePacksResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidLimitException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidNextTokenException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#NoSuchConformancePackException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns a list of one or more conformance packs.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"ConformancePackDetails\",\n                    \"pageSize\": \"Limit\"\n                }\n            }\n        },\n        \"com.amazonaws.configservice#DescribeConformancePacksRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConformancePackNames\": {\n                    \"target\": \"com.amazonaws.configservice#ConformancePackNamesList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Comma-separated list of conformance pack names for which you want details. If you do not specify any names, Config returns details for all your conformance packs. </p>\"\n                    }\n                },\n                \"Limit\": {\n                    \"target\": \"com.amazonaws.configservice#PageSizeLimit\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The maximum number of conformance packs returned on each page.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.configservice#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>nextToken</code> string returned in a previous request that you use to request the next page of results in a paginated response.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#DescribeConformancePacksResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConformancePackDetails\": {\n                    \"target\": \"com.amazonaws.configservice#ConformancePackDetailList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Returns a list of <code>ConformancePackDetail</code> objects.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.configservice#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>nextToken</code> string returned in a previous request that you use to request the next page of results in a paginated response.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.configservice#DescribeDeliveryChannelStatus\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#DescribeDeliveryChannelStatusRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.configservice#DescribeDeliveryChannelStatusResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#NoSuchDeliveryChannelException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns the current status of the specified delivery channel.\\n\\t\\t\\tIf a delivery channel is not specified, this operation returns the\\n\\t\\t\\tcurrent status of all delivery channels associated with the\\n\\t\\t\\taccount.</p>\\n         <note>\\n            <p>Currently, you can specify only one delivery channel per\\n\\t\\t\\t\\tregion in your account.</p>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.configservice#DescribeDeliveryChannelStatusRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DeliveryChannelNames\": {\n                    \"target\": \"com.amazonaws.configservice#DeliveryChannelNameList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of delivery channel names.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The input for the <a>DeliveryChannelStatus</a>\\n\\t\\t\\taction.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#DescribeDeliveryChannelStatusResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DeliveryChannelsStatus\": {\n                    \"target\": \"com.amazonaws.configservice#DeliveryChannelStatusList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list that contains the status of a specified delivery\\n\\t\\t\\tchannel.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The output for the <a>DescribeDeliveryChannelStatus</a> action.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.configservice#DescribeDeliveryChannels\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#DescribeDeliveryChannelsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.configservice#DescribeDeliveryChannelsResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#NoSuchDeliveryChannelException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns details about the specified delivery channel. If a\\n\\t\\t\\tdelivery channel is not specified, this operation returns the details\\n\\t\\t\\tof all delivery channels associated with the account.</p>\\n         <note>\\n            <p>Currently, you can specify only one delivery channel per\\n\\t\\t\\t\\tregion in your account.</p>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.configservice#DescribeDeliveryChannelsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DeliveryChannelNames\": {\n                    \"target\": \"com.amazonaws.configservice#DeliveryChannelNameList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of delivery channel names.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The input for the <a>DescribeDeliveryChannels</a>\\n\\t\\t\\taction.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#DescribeDeliveryChannelsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DeliveryChannels\": {\n                    \"target\": \"com.amazonaws.configservice#DeliveryChannelList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list that contains the descriptions of the specified delivery\\n\\t\\t\\tchannel.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The output for the <a>DescribeDeliveryChannels</a>\\n\\t\\t\\taction.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.configservice#DescribeOrganizationConfigRuleStatuses\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#DescribeOrganizationConfigRuleStatusesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.configservice#DescribeOrganizationConfigRuleStatusesResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidLimitException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidNextTokenException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#NoSuchOrganizationConfigRuleException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#OrganizationAccessDeniedException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Provides organization Config rule deployment status for an organization.</p>\\n         <note>\\n            <p>The status is not considered successful until organization Config rule is successfully deployed in all the member \\n\\t\\t\\taccounts with an exception of excluded accounts.</p>\\n            <p>When you specify the limit and the next token, you receive a paginated response.\\n\\t\\t\\tLimit and next token are not applicable if you specify organization Config rule names. \\n\\t\\t\\tIt is only applicable, when you request all the organization Config rules.</p>\\n         </note>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"OrganizationConfigRuleStatuses\",\n                    \"pageSize\": \"Limit\"\n                }\n            }\n        },\n        \"com.amazonaws.configservice#DescribeOrganizationConfigRuleStatusesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"OrganizationConfigRuleNames\": {\n                    \"target\": \"com.amazonaws.configservice#OrganizationConfigRuleNames\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The names of organization Config rules for which you want status details. If you do not specify any names, Config returns details for all your organization Config rules.</p>\"\n                    }\n                },\n                \"Limit\": {\n                    \"target\": \"com.amazonaws.configservice#CosmosPageLimit\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The maximum number of <code>OrganizationConfigRuleStatuses</code> returned on each page. If you do no specify a number, Config uses the default. The default is 100.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.configservice#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>nextToken</code> string returned on a previous page that you use to get the next page of results in a paginated response. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#DescribeOrganizationConfigRuleStatusesResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"OrganizationConfigRuleStatuses\": {\n                    \"target\": \"com.amazonaws.configservice#OrganizationConfigRuleStatuses\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of <code>OrganizationConfigRuleStatus</code> objects.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.configservice#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>nextToken</code> string returned on a previous page that you use to get the next page of results in a paginated response. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.configservice#DescribeOrganizationConfigRules\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#DescribeOrganizationConfigRulesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.configservice#DescribeOrganizationConfigRulesResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidLimitException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidNextTokenException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#NoSuchOrganizationConfigRuleException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#OrganizationAccessDeniedException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns a list of organization Config rules. </p>\\n         <note>\\n            <p>When you specify the limit and the next token, you receive a paginated response.</p>\\n            <p>Limit and next token are not applicable if you specify organization Config rule names. \\n\\t\\t\\tIt is only applicable, when you request all the organization Config rules.</p>\\n            <p>\\n               <i>For accounts within an organization</i>\\n            </p>\\n            <p>If you deploy an organizational rule or conformance pack in an organization\\n\\t\\t\\t\\tadministrator account, and then establish a delegated administrator and deploy an\\n\\t\\t\\t\\torganizational rule or conformance pack in the delegated administrator account, you\\n\\t\\t\\t\\twon't be able to see the organizational rule or conformance pack in the organization\\n\\t\\t\\t\\tadministrator account from the delegated administrator account or see the organizational\\n\\t\\t\\t\\trule or conformance pack in the delegated administrator account from organization\\n\\t\\t\\t\\tadministrator account. The <code>DescribeOrganizationConfigRules</code> and \\n\\t\\t\\t\\t<code>DescribeOrganizationConformancePacks</code> APIs can only see and interact with\\n\\t\\t\\t\\tthe organization-related resource that were deployed from within the account calling\\n\\t\\t\\t\\tthose APIs.</p>\\n         </note>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"OrganizationConfigRules\",\n                    \"pageSize\": \"Limit\"\n                }\n            }\n        },\n        \"com.amazonaws.configservice#DescribeOrganizationConfigRulesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"OrganizationConfigRuleNames\": {\n                    \"target\": \"com.amazonaws.configservice#OrganizationConfigRuleNames\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The names of organization Config rules for which you want details. If you do not specify any names, Config returns details for all your organization Config rules.</p>\"\n                    }\n                },\n                \"Limit\": {\n                    \"target\": \"com.amazonaws.configservice#CosmosPageLimit\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The maximum number of organization Config rules returned on each page. If you do no specify a number, Config uses the default. The default is 100.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.configservice#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>nextToken</code> string returned on a previous page that you use to get the next page of results in a paginated response. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#DescribeOrganizationConfigRulesResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"OrganizationConfigRules\": {\n                    \"target\": \"com.amazonaws.configservice#OrganizationConfigRules\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Returns a list of <code>OrganizationConfigRule</code> objects.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.configservice#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>nextToken</code> string returned on a previous page that you use to get the next page of results in a paginated response. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.configservice#DescribeOrganizationConformancePackStatuses\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#DescribeOrganizationConformancePackStatusesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.configservice#DescribeOrganizationConformancePackStatusesResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidLimitException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidNextTokenException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#NoSuchOrganizationConformancePackException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#OrganizationAccessDeniedException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Provides organization conformance pack deployment status for an organization. </p>\\n         <note>\\n            <p>The status is not considered successful until organization conformance pack is successfully \\n\\t\\t\\t\\tdeployed in all the member accounts with an exception of excluded accounts.</p>\\n            <p>When you specify the limit and the next token, you receive a paginated response. \\n\\t\\t\\t\\tLimit and next token are not applicable if you specify organization conformance pack names. \\n\\t\\t\\t\\tThey are only applicable, when you request all the organization conformance packs.</p>\\n         </note>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"OrganizationConformancePackStatuses\",\n                    \"pageSize\": \"Limit\"\n                }\n            }\n        },\n        \"com.amazonaws.configservice#DescribeOrganizationConformancePackStatusesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"OrganizationConformancePackNames\": {\n                    \"target\": \"com.amazonaws.configservice#OrganizationConformancePackNames\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The names of organization conformance packs for which you want status details. \\n\\t\\t\\tIf you do not specify any names, Config returns details for all your organization conformance packs. </p>\"\n                    }\n                },\n                \"Limit\": {\n                    \"target\": \"com.amazonaws.configservice#CosmosPageLimit\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The maximum number of OrganizationConformancePackStatuses returned on each page. \\n\\t\\t\\tIf you do no specify a number, Config uses the default. The default is 100. </p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.configservice#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The nextToken string returned on a previous page that you use to get the next page of results in a paginated response. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#DescribeOrganizationConformancePackStatusesResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"OrganizationConformancePackStatuses\": {\n                    \"target\": \"com.amazonaws.configservice#OrganizationConformancePackStatuses\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of <code>OrganizationConformancePackStatus</code> objects. </p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.configservice#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The nextToken string returned on a previous page that you use to get the next page of results in a paginated response. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.configservice#DescribeOrganizationConformancePacks\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#DescribeOrganizationConformancePacksRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.configservice#DescribeOrganizationConformancePacksResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidLimitException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidNextTokenException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#NoSuchOrganizationConformancePackException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#OrganizationAccessDeniedException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns a list of organization conformance packs. </p>\\n         <note>\\n            <p>When you specify the limit and the next token, you receive a paginated response. </p>\\n            <p>Limit and next token are not applicable if you specify organization conformance packs names. They are only applicable,\\n\\t\\t\\twhen you request all the organization conformance packs. </p>\\n            <p>\\n               <i>For accounts within an organization</i>\\n            </p>\\n            <p>If you deploy an organizational rule or conformance pack in an organization\\n\\t\\t\\t\\tadministrator account, and then establish a delegated administrator and deploy an\\n\\t\\t\\t\\torganizational rule or conformance pack in the delegated administrator account, you\\n\\t\\t\\t\\twon't be able to see the organizational rule or conformance pack in the organization\\n\\t\\t\\t\\tadministrator account from the delegated administrator account or see the organizational\\n\\t\\t\\t\\trule or conformance pack in the delegated administrator account from organization\\n\\t\\t\\t\\tadministrator account. The <code>DescribeOrganizationConfigRules</code> and \\n\\t\\t\\t\\t<code>DescribeOrganizationConformancePacks</code> APIs can only see and interact with\\n\\t\\t\\t\\tthe organization-related resource that were deployed from within the account calling\\n\\t\\t\\t\\tthose APIs.</p>\\n         </note>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"OrganizationConformancePacks\",\n                    \"pageSize\": \"Limit\"\n                }\n            }\n        },\n        \"com.amazonaws.configservice#DescribeOrganizationConformancePacksRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"OrganizationConformancePackNames\": {\n                    \"target\": \"com.amazonaws.configservice#OrganizationConformancePackNames\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name that you assign to an organization conformance pack.</p>\"\n                    }\n                },\n                \"Limit\": {\n                    \"target\": \"com.amazonaws.configservice#CosmosPageLimit\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The maximum number of organization config packs returned on each page. If you do no specify a\\n\\t\\t\\tnumber, Config uses the default. The default is 100.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.configservice#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The nextToken string returned on a previous page that you use to get the next page of results in a\\n\\t\\t\\tpaginated response.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#DescribeOrganizationConformancePacksResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"OrganizationConformancePacks\": {\n                    \"target\": \"com.amazonaws.configservice#OrganizationConformancePacks\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Returns a list of OrganizationConformancePacks objects.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.configservice#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The nextToken string returned on a previous page that you use to get the next page of results in a\\n\\t\\t\\tpaginated response.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.configservice#DescribePendingAggregationRequests\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#DescribePendingAggregationRequestsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.configservice#DescribePendingAggregationRequestsResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidLimitException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidNextTokenException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidParameterValueException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns a list of all pending aggregation requests.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"PendingAggregationRequests\",\n                    \"pageSize\": \"Limit\"\n                }\n            }\n        },\n        \"com.amazonaws.configservice#DescribePendingAggregationRequestsLimit\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#default\": 0,\n                \"smithy.api#range\": {\n                    \"min\": 0,\n                    \"max\": 20\n                }\n            }\n        },\n        \"com.amazonaws.configservice#DescribePendingAggregationRequestsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Limit\": {\n                    \"target\": \"com.amazonaws.configservice#DescribePendingAggregationRequestsLimit\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The maximum number of evaluation results returned on each page.\\n\\t\\t\\tThe default is maximum. If you specify 0, Config uses the\\n\\t\\t\\tdefault.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.configservice#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>nextToken</code> string returned on a previous page that you use\\n\\t\\t\\tto get the next page of results in a paginated response.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#DescribePendingAggregationRequestsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PendingAggregationRequests\": {\n                    \"target\": \"com.amazonaws.configservice#PendingAggregationRequestList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Returns a PendingAggregationRequests object.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.configservice#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>nextToken</code> string returned on a previous page that you use\\n\\t\\t\\tto get the next page of results in a paginated response.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.configservice#DescribeRemediationConfigurations\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#DescribeRemediationConfigurationsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.configservice#DescribeRemediationConfigurationsResponse\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns the details of one or more remediation configurations.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#DescribeRemediationConfigurationsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConfigRuleNames\": {\n                    \"target\": \"com.amazonaws.configservice#ConfigRuleNames\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of Config rule names of remediation configurations for which you want details. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#DescribeRemediationConfigurationsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RemediationConfigurations\": {\n                    \"target\": \"com.amazonaws.configservice#RemediationConfigurations\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Returns a remediation configuration object.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.configservice#DescribeRemediationExceptions\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#DescribeRemediationExceptionsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.configservice#DescribeRemediationExceptionsResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidNextTokenException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidParameterValueException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns the details of one or more remediation exceptions. A detailed view of a remediation exception for a set of resources that includes an explanation of an exception and the time when the exception will be deleted. \\n\\t\\t\\tWhen you specify the limit and the next token, you receive a paginated response. </p>\\n         <note>\\n            <p>Config generates a remediation exception when a problem occurs executing a remediation action to a specific resource. \\n\\t\\t\\t\\tRemediation exceptions blocks auto-remediation until the exception is cleared.</p>\\n            <p>When you specify the limit and the next token, you receive a paginated response. </p>\\n            <p>Limit and next token are not applicable if you request resources in batch. It is only applicable, when you request all resources.</p>\\n         </note>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"pageSize\": \"Limit\"\n                }\n            }\n        },\n        \"com.amazonaws.configservice#DescribeRemediationExceptionsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConfigRuleName\": {\n                    \"target\": \"com.amazonaws.configservice#ConfigRuleName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the Config rule.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ResourceKeys\": {\n                    \"target\": \"com.amazonaws.configservice#RemediationExceptionResourceKeys\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An exception list of resource exception keys to be processed with the current request. Config adds exception for each resource key. For example, Config adds 3 exceptions for 3 resource keys. </p>\"\n                    }\n                },\n                \"Limit\": {\n                    \"target\": \"com.amazonaws.configservice#Limit\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The maximum number of RemediationExceptionResourceKey returned on each page. The default is 25. If you specify 0, Config uses the default.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.configservice#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>nextToken</code> string returned in a previous request that you use to request the next page of results in a paginated response.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#DescribeRemediationExceptionsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RemediationExceptions\": {\n                    \"target\": \"com.amazonaws.configservice#RemediationExceptions\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Returns a list of remediation exception objects.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.configservice#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>nextToken</code> string returned in a previous request that you use to request the next page of results in a paginated response.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.configservice#DescribeRemediationExecutionStatus\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#DescribeRemediationExecutionStatusRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.configservice#DescribeRemediationExecutionStatusResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidNextTokenException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#NoSuchRemediationConfigurationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Provides a detailed view of a Remediation Execution for a set of resources including state, timestamps for when steps for the remediation execution occur, and any error messages for steps that have failed. \\n\\t\\t\\tWhen you specify the limit and the next token, you receive a paginated response.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"RemediationExecutionStatuses\",\n                    \"pageSize\": \"Limit\"\n                }\n            }\n        },\n        \"com.amazonaws.configservice#DescribeRemediationExecutionStatusRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConfigRuleName\": {\n                    \"target\": \"com.amazonaws.configservice#ConfigRuleName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the Config rule.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ResourceKeys\": {\n                    \"target\": \"com.amazonaws.configservice#ResourceKeys\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of resource keys to be processed with the current request. Each element in the list consists of the resource type and resource ID. </p>\"\n                    }\n                },\n                \"Limit\": {\n                    \"target\": \"com.amazonaws.configservice#Limit\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The maximum number of RemediationExecutionStatuses returned on each page. The default is maximum. If you specify 0, Config uses the default. </p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.configservice#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>nextToken</code> string returned on a previous page that you use to get the next page of results in a paginated response.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#DescribeRemediationExecutionStatusResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RemediationExecutionStatuses\": {\n                    \"target\": \"com.amazonaws.configservice#RemediationExecutionStatuses\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Returns a list of remediation execution statuses objects.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.configservice#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>nextToken</code> string returned on a previous page that you use to get the next page of results in a paginated response.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.configservice#DescribeRetentionConfigurations\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#DescribeRetentionConfigurationsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.configservice#DescribeRetentionConfigurationsResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidNextTokenException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#NoSuchRetentionConfigurationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns the details of one or more retention configurations. If\\n\\t\\t\\tthe retention configuration name is not specified, this operation\\n\\t\\t\\treturns the details for all the retention configurations for that\\n\\t\\t\\taccount.</p>\\n         <note>\\n            <p>Currently, Config supports only one retention\\n\\t\\t\\t\\tconfiguration per region in your account.</p>\\n         </note>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"RetentionConfigurations\"\n                }\n            }\n        },\n        \"com.amazonaws.configservice#DescribeRetentionConfigurationsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RetentionConfigurationNames\": {\n                    \"target\": \"com.amazonaws.configservice#RetentionConfigurationNameList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of names of retention configurations for which you want\\n\\t\\t\\tdetails. If you do not specify a name, Config returns details\\n\\t\\t\\tfor all the retention configurations for that account.</p>\\n         <note>\\n            <p>Currently, Config supports only one retention\\n\\t\\t\\t\\tconfiguration per region in your account.</p>\\n         </note>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.configservice#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>nextToken</code> string returned on a previous page\\n\\t\\t\\tthat you use to get the next page of results in a paginated\\n\\t\\t\\tresponse. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#DescribeRetentionConfigurationsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RetentionConfigurations\": {\n                    \"target\": \"com.amazonaws.configservice#RetentionConfigurationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Returns a retention configuration object.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.configservice#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>nextToken</code> string returned on a previous page\\n\\t\\t\\tthat you use to get the next page of results in a paginated\\n\\t\\t\\tresponse. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.configservice#Description\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 256\n                }\n            }\n        },\n        \"com.amazonaws.configservice#DisassociateResourceTypes\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#DisassociateResourceTypesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.configservice#DisassociateResourceTypesResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#ConflictException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#NoSuchConfigurationRecorderException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Removes all resource types specified in the <code>ResourceTypes</code> list from the <a href=\\\"https://docs.aws.amazon.com/config/latest/APIReference/API_RecordingGroup.html\\\">RecordingGroup</a> of configuration recorder and excludes these resource types when recording.</p>\\n         <p>For this operation, the configuration recorder must use a <a href=\\\"https://docs.aws.amazon.com/config/latest/APIReference/API_RecordingStrategy.html\\\">RecordingStrategy</a> that is either <code>INCLUSION_BY_RESOURCE_TYPES</code> or <code>EXCLUSION_BY_RESOURCE_TYPES</code>.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#DisassociateResourceTypesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConfigurationRecorderArn\": {\n                    \"target\": \"com.amazonaws.configservice#AmazonResourceName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the specified configuration recorder.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ResourceTypes\": {\n                    \"target\": \"com.amazonaws.configservice#ResourceTypeList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The list of resource types you want to remove from the recording group of the specified configuration recorder.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#DisassociateResourceTypesResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConfigurationRecorder\": {\n                    \"target\": \"com.amazonaws.configservice#ConfigurationRecorder\",\n                    \"traits\": {\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.configservice#DiscoveredResourceIdentifierList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#AggregateResourceIdentifier\"\n            }\n        },\n        \"com.amazonaws.configservice#EarlierTime\": {\n            \"type\": \"timestamp\"\n        },\n        \"com.amazonaws.configservice#EmptiableStringWithCharLimit256\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 256\n                }\n            }\n        },\n        \"com.amazonaws.configservice#ErrorMessage\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.configservice#Evaluation\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ComplianceResourceType\": {\n                    \"target\": \"com.amazonaws.configservice#StringWithCharLimit256\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of Amazon Web Services resource that was evaluated.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ComplianceResourceId\": {\n                    \"target\": \"com.amazonaws.configservice#BaseResourceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the Amazon Web Services resource that was evaluated.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ComplianceType\": {\n                    \"target\": \"com.amazonaws.configservice#ComplianceType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether the Amazon Web Services resource complies with the Config\\n\\t\\t\\trule that it was evaluated against.</p>\\n         <p>For the <code>Evaluation</code> data type, Config supports\\n\\t\\t\\tonly the <code>COMPLIANT</code>, <code>NON_COMPLIANT</code>, and\\n\\t\\t\\t\\t<code>NOT_APPLICABLE</code> values. Config does not support\\n\\t\\t\\tthe <code>INSUFFICIENT_DATA</code> value for this data\\n\\t\\t\\ttype.</p>\\n         <p>Similarly, Config does not accept\\n\\t\\t\\t\\t<code>INSUFFICIENT_DATA</code> as the value for\\n\\t\\t\\t\\t<code>ComplianceType</code> from a <code>PutEvaluations</code>\\n\\t\\t\\trequest. For example, an Lambda function for a custom Config\\n\\t\\t\\trule cannot pass an <code>INSUFFICIENT_DATA</code> value to Config.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Annotation\": {\n                    \"target\": \"com.amazonaws.configservice#StringWithCharLimit256\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Supplementary information about how the evaluation determined\\n\\t\\t\\tthe compliance.</p>\"\n                    }\n                },\n                \"OrderingTimestamp\": {\n                    \"target\": \"com.amazonaws.configservice#OrderingTimestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time of the event in Config that triggered the\\n\\t\\t\\tevaluation. For event-based evaluations, the time indicates when Config created the configuration item that triggered the evaluation.\\n\\t\\t\\tFor periodic evaluations, the time indicates when Config\\n\\t\\t\\ttriggered the evaluation at the frequency that you specified (for\\n\\t\\t\\texample, every 24 hours).</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Identifies an Amazon Web Services resource and indicates whether it complies\\n\\t\\t\\twith the Config rule that it was evaluated against.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#EvaluationContext\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"EvaluationContextIdentifier\": {\n                    \"target\": \"com.amazonaws.configservice#EvaluationContextIdentifier\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A unique EvaluationContextIdentifier ID for an EvaluationContext.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Use EvaluationContext to group independently initiated proactive resource evaluations. For example, CFN Stack. \\n\\t\\t\\tIf you want to check just a resource definition, you do not need to provide evaluation context.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#EvaluationContextIdentifier\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 128\n                }\n            }\n        },\n        \"com.amazonaws.configservice#EvaluationMode\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"DETECTIVE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DETECTIVE\"\n                    }\n                },\n                \"PROACTIVE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"PROACTIVE\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.configservice#EvaluationModeConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Mode\": {\n                    \"target\": \"com.amazonaws.configservice#EvaluationMode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The mode of an evaluation. The valid values are Detective or Proactive.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The configuration object for Config rule evaluation mode. The supported valid values are Detective or Proactive.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#EvaluationModes\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#EvaluationModeConfiguration\"\n            }\n        },\n        \"com.amazonaws.configservice#EvaluationResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"EvaluationResultIdentifier\": {\n                    \"target\": \"com.amazonaws.configservice#EvaluationResultIdentifier\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Uniquely identifies the evaluation result.</p>\"\n                    }\n                },\n                \"ComplianceType\": {\n                    \"target\": \"com.amazonaws.configservice#ComplianceType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether the Amazon Web Services resource complies with the Config\\n\\t\\t\\trule that evaluated it.</p>\\n         <p>For the <code>EvaluationResult</code> data type, Config\\n\\t\\t\\tsupports only the <code>COMPLIANT</code>,\\n\\t\\t\\t<code>NON_COMPLIANT</code>, and <code>NOT_APPLICABLE</code> values.\\n\\t\\t\\tConfig does not support the <code>INSUFFICIENT_DATA</code> value\\n\\t\\t\\tfor the <code>EvaluationResult</code> data type.</p>\"\n                    }\n                },\n                \"ResultRecordedTime\": {\n                    \"target\": \"com.amazonaws.configservice#Date\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time when Config recorded the evaluation\\n\\t\\t\\tresult.</p>\"\n                    }\n                },\n                \"ConfigRuleInvokedTime\": {\n                    \"target\": \"com.amazonaws.configservice#Date\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time when the Config rule evaluated the Amazon Web Services\\n\\t\\t\\tresource.</p>\"\n                    }\n                },\n                \"Annotation\": {\n                    \"target\": \"com.amazonaws.configservice#StringWithCharLimit256\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Supplementary information about how the evaluation determined\\n\\t\\t\\tthe compliance.</p>\"\n                    }\n                },\n                \"ResultToken\": {\n                    \"target\": \"com.amazonaws.configservice#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An encrypted token that associates an evaluation with an Config rule. The token identifies the rule, the Amazon Web Services resource being\\n\\t\\t\\tevaluated, and the event that triggered the evaluation.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The details of an Config evaluation. Provides the Amazon Web Services\\n\\t\\t\\tresource that was evaluated, the compliance of the resource, related\\n\\t\\t\\ttime stamps, and supplementary information.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#EvaluationResultIdentifier\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"EvaluationResultQualifier\": {\n                    \"target\": \"com.amazonaws.configservice#EvaluationResultQualifier\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Identifies an Config rule used to evaluate an Amazon Web Services resource,\\n\\t\\t\\tand provides the type and ID of the evaluated resource.</p>\"\n                    }\n                },\n                \"OrderingTimestamp\": {\n                    \"target\": \"com.amazonaws.configservice#Date\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time of the event that triggered the evaluation of your Amazon Web Services\\n\\t\\t\\tresources. The time can indicate when Config delivered a\\n\\t\\t\\tconfiguration item change notification, or it can indicate when Config delivered the configuration snapshot, depending on which\\n\\t\\t\\tevent triggered the evaluation.</p>\"\n                    }\n                },\n                \"ResourceEvaluationId\": {\n                    \"target\": \"com.amazonaws.configservice#ResourceEvaluationId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A Unique ID for an evaluation result.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Uniquely identifies an evaluation result.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#EvaluationResultQualifier\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConfigRuleName\": {\n                    \"target\": \"com.amazonaws.configservice#ConfigRuleName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the Config rule that was used in the\\n\\t\\t\\tevaluation.</p>\"\n                    }\n                },\n                \"ResourceType\": {\n                    \"target\": \"com.amazonaws.configservice#StringWithCharLimit256\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of Amazon Web Services resource that was evaluated.</p>\"\n                    }\n                },\n                \"ResourceId\": {\n                    \"target\": \"com.amazonaws.configservice#BaseResourceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the evaluated Amazon Web Services resource.</p>\"\n                    }\n                },\n                \"EvaluationMode\": {\n                    \"target\": \"com.amazonaws.configservice#EvaluationMode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The mode of an evaluation. The valid values are Detective or Proactive.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Identifies an Config rule that evaluated an Amazon Web Services resource,\\n\\t\\t\\tand provides the type and ID of the resource that the rule\\n\\t\\t\\tevaluated.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#EvaluationResults\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#EvaluationResult\"\n            }\n        },\n        \"com.amazonaws.configservice#EvaluationStatus\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Status\": {\n                    \"target\": \"com.amazonaws.configservice#ResourceEvaluationStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The status of an execution. The valid values are In_Progress, Succeeded or Failed. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"FailureReason\": {\n                    \"target\": \"com.amazonaws.configservice#StringWithCharLimit1024\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An explanation for failed execution status.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns status details of an evaluation.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#EvaluationTimeout\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#default\": 0,\n                \"smithy.api#range\": {\n                    \"min\": 0,\n                    \"max\": 3600\n                }\n            }\n        },\n        \"com.amazonaws.configservice#Evaluations\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#Evaluation\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 100\n                }\n            }\n        },\n        \"com.amazonaws.configservice#EventSource\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"Aws_Config\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"aws.config\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.configservice#ExcludedAccounts\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#AccountId\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.configservice#ExclusionByResourceTypes\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"resourceTypes\": {\n                    \"target\": \"com.amazonaws.configservice#ResourceTypeList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A comma-separated list of resource types to exclude from recording by the configuration\\n\\t\\t\\trecorder.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Specifies whether the configuration recorder excludes certain resource types from being recorded.\\n\\t\\t\\tUse the <code>resourceTypes</code> field to enter a comma-separated list of resource types you want to exclude from recording.</p>\\n         <p>By default, when Config adds support for a new resource type in the Region where you set up the configuration recorder,\\n\\t\\t\\tincluding global resource types, Config starts recording resources of that type automatically.</p>\\n         <note>\\n            <p>\\n               <b>How to use the exclusion recording strategy </b>\\n            </p>\\n            <p>To use this option, you must set the <code>useOnly</code>\\n\\t\\t\\t\\tfield of <a href=\\\"https://docs.aws.amazon.com/config/latest/APIReference/API_RecordingStrategy.html\\\">RecordingStrategy</a>\\n\\t\\t\\t\\tto <code>EXCLUSION_BY_RESOURCE_TYPES</code>.</p>\\n            <p>Config will then record configuration changes for all supported resource types, except the resource types that you specify to exclude from being recorded.</p>\\n            <p>\\n               <b>Global resource types and the exclusion recording strategy </b>\\n            </p>\\n            <p>Unless specifically listed as exclusions,\\n\\t\\t\\t\\t<code>AWS::RDS::GlobalCluster</code> will be recorded automatically in all supported  Config Regions were the configuration recorder is enabled.</p>\\n            <p>IAM users, groups, roles, and customer managed policies will be recorded in the Region where you set up the configuration recorder if that is a Region where Config was available before February 2022.\\n\\t\\t\\t\\tYou cannot be record the global IAM resouce types in Regions supported by Config after February 2022. For a list of those Regions,\\n\\t\\t\\t\\tsee <a href=\\\"https://docs.aws.amazon.com/config/latest/developerguide/select-resources.html#select-resources-all\\\">Recording Amazon Web Services Resources | Global Resources</a>.</p>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.configservice#ExecutionControls\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SsmControls\": {\n                    \"target\": \"com.amazonaws.configservice#SsmControls\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A SsmControls object.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The controls that Config uses for executing remediations.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#Expression\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 4096\n                }\n            }\n        },\n        \"com.amazonaws.configservice#ExternalEvaluation\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ComplianceResourceType\": {\n                    \"target\": \"com.amazonaws.configservice#StringWithCharLimit256\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The evaluated compliance resource type. Config accepts <code>AWS::::Account</code> resource type.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ComplianceResourceId\": {\n                    \"target\": \"com.amazonaws.configservice#BaseResourceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The evaluated compliance resource ID. Config accepts only Amazon Web Services account ID.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ComplianceType\": {\n                    \"target\": \"com.amazonaws.configservice#ComplianceType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The compliance of the Amazon Web Services resource. The valid values are <code>COMPLIANT, NON_COMPLIANT, </code> and <code>NOT_APPLICABLE</code>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Annotation\": {\n                    \"target\": \"com.amazonaws.configservice#StringWithCharLimit256\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Supplementary information about the reason of compliance. For example, this task was completed on a specific date.</p>\"\n                    }\n                },\n                \"OrderingTimestamp\": {\n                    \"target\": \"com.amazonaws.configservice#OrderingTimestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time when the compliance was recorded. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Identifies an Amazon Web Services resource and indicates whether it complies with the Config rule that it was evaluated against.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#FailedDeleteRemediationExceptionsBatch\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"FailureMessage\": {\n                    \"target\": \"com.amazonaws.configservice#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Returns a failure message for delete remediation exception. For example, Config creates an exception due to an internal error.</p>\"\n                    }\n                },\n                \"FailedItems\": {\n                    \"target\": \"com.amazonaws.configservice#RemediationExceptionResourceKeys\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Returns remediation exception resource key object of the failed items.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>List of each of the failed delete remediation exceptions with specific reasons.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#FailedDeleteRemediationExceptionsBatches\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#FailedDeleteRemediationExceptionsBatch\"\n            }\n        },\n        \"com.amazonaws.configservice#FailedRemediationBatch\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"FailureMessage\": {\n                    \"target\": \"com.amazonaws.configservice#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Returns a failure message. For example, the resource is already compliant.</p>\"\n                    }\n                },\n                \"FailedItems\": {\n                    \"target\": \"com.amazonaws.configservice#RemediationConfigurations\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Returns remediation configurations of the failed items.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>List of each of the failed remediations with specific reasons.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#FailedRemediationBatches\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#FailedRemediationBatch\"\n            }\n        },\n        \"com.amazonaws.configservice#FailedRemediationExceptionBatch\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"FailureMessage\": {\n                    \"target\": \"com.amazonaws.configservice#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Returns a failure message. For example, the auto-remediation has failed.</p>\"\n                    }\n                },\n                \"FailedItems\": {\n                    \"target\": \"com.amazonaws.configservice#RemediationExceptions\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Returns remediation exception resource key object of the failed items.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>List of each of the failed remediation exceptions with specific reasons.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#FailedRemediationExceptionBatches\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#FailedRemediationExceptionBatch\"\n            }\n        },\n        \"com.amazonaws.configservice#FieldInfo\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Name\": {\n                    \"target\": \"com.amazonaws.configservice#FieldName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Name of the field.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Details about the fields such as name of the field.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#FieldInfoList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#FieldInfo\"\n            }\n        },\n        \"com.amazonaws.configservice#FieldName\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.configservice#GetAggregateComplianceDetailsByConfigRule\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#GetAggregateComplianceDetailsByConfigRuleRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.configservice#GetAggregateComplianceDetailsByConfigRuleResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidLimitException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidNextTokenException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#NoSuchConfigurationAggregatorException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns the evaluation results for the specified Config\\n\\t\\t\\trule for a specific resource in a rule. The results indicate which\\n\\t\\t\\tAmazon Web Services resources were evaluated by the rule, when each resource was\\n\\t\\t\\tlast evaluated, and whether each resource complies with the rule. </p>\\n         <note>\\n            <p>The results can return an empty result page. But if you\\n\\t\\t\\t\\thave a <code>nextToken</code>, the results are displayed on the next\\n\\t\\t\\t\\tpage.</p>\\n         </note>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"AggregateEvaluationResults\",\n                    \"pageSize\": \"Limit\"\n                }\n            }\n        },\n        \"com.amazonaws.configservice#GetAggregateComplianceDetailsByConfigRuleRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConfigurationAggregatorName\": {\n                    \"target\": \"com.amazonaws.configservice#ConfigurationAggregatorName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the configuration aggregator.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ConfigRuleName\": {\n                    \"target\": \"com.amazonaws.configservice#ConfigRuleName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the Config rule for which you want compliance\\n\\t\\t\\tinformation.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.configservice#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The 12-digit account ID of the source account.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"AwsRegion\": {\n                    \"target\": \"com.amazonaws.configservice#AwsRegion\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The source region from where the data is aggregated.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ComplianceType\": {\n                    \"target\": \"com.amazonaws.configservice#ComplianceType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The resource compliance status.</p>\\n         <note>\\n            <p>For the\\n\\t\\t\\t\\t\\t<code>GetAggregateComplianceDetailsByConfigRuleRequest</code>\\n\\t\\t\\t\\tdata type, Config supports only the <code>COMPLIANT</code>\\n\\t\\t\\t\\tand <code>NON_COMPLIANT</code>. Config does not support the\\n\\t\\t\\t\\t\\t<code>NOT_APPLICABLE</code> and\\n\\t\\t\\t\\t\\t<code>INSUFFICIENT_DATA</code> values.</p>\\n         </note>\"\n                    }\n                },\n                \"Limit\": {\n                    \"target\": \"com.amazonaws.configservice#Limit\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The maximum number of evaluation results returned on each page.\\n\\t\\t\\tThe default is 50. You cannot specify a number greater than 100. If\\n\\t\\t\\tyou specify 0, Config uses the default.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.configservice#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>nextToken</code> string returned on a previous page that you use\\n\\t\\t\\tto get the next page of results in a paginated response.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#GetAggregateComplianceDetailsByConfigRuleResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AggregateEvaluationResults\": {\n                    \"target\": \"com.amazonaws.configservice#AggregateEvaluationResultList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Returns an AggregateEvaluationResults object.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.configservice#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>nextToken</code> string returned on a previous page that you use\\n\\t\\t\\tto get the next page of results in a paginated response.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.configservice#GetAggregateConfigRuleComplianceSummary\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#GetAggregateConfigRuleComplianceSummaryRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.configservice#GetAggregateConfigRuleComplianceSummaryResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidLimitException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidNextTokenException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#NoSuchConfigurationAggregatorException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns the number of compliant and noncompliant rules for one\\n\\t\\t\\tor more accounts and regions in an aggregator.</p>\\n         <note>\\n            <p>The results can return an empty result page, but if you\\n\\t\\t\\t\\thave a nextToken, the results are displayed on the next\\n\\t\\t\\t\\tpage.</p>\\n         </note>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"pageSize\": \"Limit\"\n                }\n            }\n        },\n        \"com.amazonaws.configservice#GetAggregateConfigRuleComplianceSummaryRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConfigurationAggregatorName\": {\n                    \"target\": \"com.amazonaws.configservice#ConfigurationAggregatorName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the configuration aggregator.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.configservice#ConfigRuleComplianceSummaryFilters\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Filters the results based on the\\n\\t\\t\\tConfigRuleComplianceSummaryFilters object.</p>\"\n                    }\n                },\n                \"GroupByKey\": {\n                    \"target\": \"com.amazonaws.configservice#ConfigRuleComplianceSummaryGroupKey\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Groups the result based on ACCOUNT_ID or AWS_REGION.</p>\"\n                    }\n                },\n                \"Limit\": {\n                    \"target\": \"com.amazonaws.configservice#GroupByAPILimit\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The maximum number of evaluation results returned on each page.\\n\\t\\t\\tThe default is 1000. You cannot specify a number greater than 1000.\\n\\t\\t\\tIf you specify 0, Config uses the default.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.configservice#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>nextToken</code> string returned on a previous page that you use\\n\\t\\t\\tto get the next page of results in a paginated response.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#GetAggregateConfigRuleComplianceSummaryResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"GroupByKey\": {\n                    \"target\": \"com.amazonaws.configservice#StringWithCharLimit256\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Groups the result based on ACCOUNT_ID or AWS_REGION.</p>\"\n                    }\n                },\n                \"AggregateComplianceCounts\": {\n                    \"target\": \"com.amazonaws.configservice#AggregateComplianceCountList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Returns a list of AggregateComplianceCounts object.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.configservice#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>nextToken</code> string returned on a previous page that you use\\n\\t\\t\\tto get the next page of results in a paginated response.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.configservice#GetAggregateConformancePackComplianceSummary\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#GetAggregateConformancePackComplianceSummaryRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.configservice#GetAggregateConformancePackComplianceSummaryResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidLimitException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidNextTokenException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#NoSuchConfigurationAggregatorException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns the count of compliant and noncompliant conformance packs across all Amazon Web Services accounts and Amazon Web Services Regions in an aggregator. You can filter based on Amazon Web Services account ID or Amazon Web Services Region.</p>\\n         <note>\\n            <p>The results can return an empty result page, but if you have a nextToken, the results are displayed on the next page.</p>\\n         </note>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"pageSize\": \"Limit\"\n                }\n            }\n        },\n        \"com.amazonaws.configservice#GetAggregateConformancePackComplianceSummaryRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConfigurationAggregatorName\": {\n                    \"target\": \"com.amazonaws.configservice#ConfigurationAggregatorName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the configuration aggregator.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.configservice#AggregateConformancePackComplianceSummaryFilters\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Filters the results based on the <code>AggregateConformancePackComplianceSummaryFilters</code> object.</p>\"\n                    }\n                },\n                \"GroupByKey\": {\n                    \"target\": \"com.amazonaws.configservice#AggregateConformancePackComplianceSummaryGroupKey\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Groups the result based on Amazon Web Services account ID or Amazon Web Services Region.</p>\"\n                    }\n                },\n                \"Limit\": {\n                    \"target\": \"com.amazonaws.configservice#Limit\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The maximum number of results returned on each page. The default is maximum. If you specify 0, Config uses the default.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.configservice#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>nextToken</code> string returned on a previous page that you use to get the next page of results in a paginated response.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#GetAggregateConformancePackComplianceSummaryResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AggregateConformancePackComplianceSummaries\": {\n                    \"target\": \"com.amazonaws.configservice#AggregateConformancePackComplianceSummaryList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Returns a list of <code>AggregateConformancePackComplianceSummary</code> object.</p>\"\n                    }\n                },\n                \"GroupByKey\": {\n                    \"target\": \"com.amazonaws.configservice#StringWithCharLimit256\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Groups the result based on Amazon Web Services account ID or Amazon Web Services Region.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.configservice#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>nextToken</code> string returned on a previous page that you use to get the next page of results in a paginated response.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.configservice#GetAggregateDiscoveredResourceCounts\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#GetAggregateDiscoveredResourceCountsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.configservice#GetAggregateDiscoveredResourceCountsResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidLimitException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidNextTokenException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#NoSuchConfigurationAggregatorException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns the resource counts across accounts and regions that are present in your Config aggregator. You can request the resource counts by providing filters and GroupByKey.</p>\\n         <p>For example, if the input contains accountID 12345678910 and region us-east-1 in filters, the API returns the count of resources in account ID 12345678910 and region us-east-1.\\n\\t\\t\\tIf the input contains ACCOUNT_ID as a GroupByKey, the API returns resource counts for all source accounts that are present in your aggregator.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"pageSize\": \"Limit\"\n                }\n            }\n        },\n        \"com.amazonaws.configservice#GetAggregateDiscoveredResourceCountsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConfigurationAggregatorName\": {\n                    \"target\": \"com.amazonaws.configservice#ConfigurationAggregatorName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the configuration aggregator.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.configservice#ResourceCountFilters\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Filters the results based on the <code>ResourceCountFilters</code> object.</p>\"\n                    }\n                },\n                \"GroupByKey\": {\n                    \"target\": \"com.amazonaws.configservice#ResourceCountGroupKey\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The key to group the resource counts.</p>\"\n                    }\n                },\n                \"Limit\": {\n                    \"target\": \"com.amazonaws.configservice#GroupByAPILimit\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The maximum number of <a>GroupedResourceCount</a> objects returned on each page. The default is 1000. You cannot specify a number greater than 1000. If you specify 0, Config uses the default.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.configservice#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>nextToken</code> string returned on a previous page that you use to get the next page of results in a paginated response. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#GetAggregateDiscoveredResourceCountsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TotalDiscoveredResources\": {\n                    \"target\": \"com.amazonaws.configservice#Long\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The total number of resources that are present in an aggregator with the filters that you provide.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"GroupByKey\": {\n                    \"target\": \"com.amazonaws.configservice#StringWithCharLimit256\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The key passed into the request object. If <code>GroupByKey</code> is not provided, the result will be empty.</p>\"\n                    }\n                },\n                \"GroupedResourceCounts\": {\n                    \"target\": \"com.amazonaws.configservice#GroupedResourceCountList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Returns a list of GroupedResourceCount objects.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.configservice#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>nextToken</code> string returned on a previous page that you use to get the next page of results in a paginated response.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.configservice#GetAggregateResourceConfig\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#GetAggregateResourceConfigRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.configservice#GetAggregateResourceConfigResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#NoSuchConfigurationAggregatorException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#OversizedConfigurationItemException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#ResourceNotDiscoveredException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns configuration item that is aggregated for your specific resource in a specific source account and region.</p>\\n         <note>\\n            <p>The API does not return results for deleted resources.</p>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.configservice#GetAggregateResourceConfigRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConfigurationAggregatorName\": {\n                    \"target\": \"com.amazonaws.configservice#ConfigurationAggregatorName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the configuration aggregator.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ResourceIdentifier\": {\n                    \"target\": \"com.amazonaws.configservice#AggregateResourceIdentifier\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An object that identifies aggregate resource.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#GetAggregateResourceConfigResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConfigurationItem\": {\n                    \"target\": \"com.amazonaws.configservice#ConfigurationItem\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Returns a <code>ConfigurationItem</code> object.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.configservice#GetComplianceDetailsByConfigRule\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#GetComplianceDetailsByConfigRuleRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.configservice#GetComplianceDetailsByConfigRuleResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidNextTokenException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#NoSuchConfigRuleException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns the evaluation results for the specified Config\\n\\t\\t\\trule. The results indicate which Amazon Web Services resources were evaluated by the\\n\\t\\t\\trule, when each resource was last evaluated, and whether each\\n\\t\\t\\tresource complies with the rule.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"EvaluationResults\",\n                    \"pageSize\": \"Limit\"\n                }\n            }\n        },\n        \"com.amazonaws.configservice#GetComplianceDetailsByConfigRuleRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConfigRuleName\": {\n                    \"target\": \"com.amazonaws.configservice#StringWithCharLimit64\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the Config rule for which you want compliance\\n\\t\\t\\tinformation.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ComplianceTypes\": {\n                    \"target\": \"com.amazonaws.configservice#ComplianceTypes\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Filters the results by compliance.</p>\\n         <p>\\n            <code>INSUFFICIENT_DATA</code> is a valid <code>ComplianceType</code> that is returned when an Config rule cannot be evaluated. However, <code>INSUFFICIENT_DATA</code> cannot be used as a <code>ComplianceType</code> for filtering results.</p>\"\n                    }\n                },\n                \"Limit\": {\n                    \"target\": \"com.amazonaws.configservice#Limit\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The maximum number of evaluation results returned on each page.\\n\\t\\t\\tThe default is 10. You cannot specify a number greater than 100. If\\n\\t\\t\\tyou specify 0, Config uses the default.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.configservice#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>nextToken</code> string returned on a previous page\\n\\t\\t\\tthat you use to get the next page of results in a paginated\\n\\t\\t\\tresponse.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p></p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#GetComplianceDetailsByConfigRuleResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"EvaluationResults\": {\n                    \"target\": \"com.amazonaws.configservice#EvaluationResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether the Amazon Web Services resource complies with the specified\\n\\t\\t\\tConfig rule.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.configservice#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The string that you use in a subsequent request to get the next\\n\\t\\t\\tpage of results in a paginated response.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p></p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.configservice#GetComplianceDetailsByResource\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#GetComplianceDetailsByResourceRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.configservice#GetComplianceDetailsByResourceResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidParameterValueException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns the evaluation results for the specified Amazon Web Services resource.\\n\\t\\t\\tThe results indicate which Config rules were used to evaluate\\n\\t\\t\\tthe resource, when each rule was last invoked, and whether the resource\\n\\t\\t\\tcomplies with each rule.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"EvaluationResults\"\n                }\n            }\n        },\n        \"com.amazonaws.configservice#GetComplianceDetailsByResourceRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ResourceType\": {\n                    \"target\": \"com.amazonaws.configservice#StringWithCharLimit256\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of the Amazon Web Services resource for which you want compliance\\n\\t\\t\\tinformation.</p>\"\n                    }\n                },\n                \"ResourceId\": {\n                    \"target\": \"com.amazonaws.configservice#BaseResourceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the Amazon Web Services resource for which you want compliance\\n\\t\\t\\tinformation.</p>\"\n                    }\n                },\n                \"ComplianceTypes\": {\n                    \"target\": \"com.amazonaws.configservice#ComplianceTypes\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Filters the results by compliance.</p>\\n         <p>\\n            <code>INSUFFICIENT_DATA</code> is a valid <code>ComplianceType</code> that is returned when an Config rule cannot be evaluated. However, <code>INSUFFICIENT_DATA</code> cannot be used as a <code>ComplianceType</code> for filtering results.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.configservice#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>nextToken</code> string returned on a previous page\\n\\t\\t\\tthat you use to get the next page of results in a paginated\\n\\t\\t\\tresponse.</p>\"\n                    }\n                },\n                \"ResourceEvaluationId\": {\n                    \"target\": \"com.amazonaws.configservice#ResourceEvaluationId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The unique ID of Amazon Web Services resource execution for which you want to retrieve evaluation results. </p>\\n         <note>\\n            <p>You need to only provide either a <code>ResourceEvaluationID</code> or a <code>ResourceID </code>and <code>ResourceType</code>.</p>\\n         </note>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p></p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#GetComplianceDetailsByResourceResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"EvaluationResults\": {\n                    \"target\": \"com.amazonaws.configservice#EvaluationResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether the specified Amazon Web Services resource complies each Config rule.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.configservice#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The string that you use in a subsequent request to get the next\\n\\t\\t\\tpage of results in a paginated response.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p></p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.configservice#GetComplianceSummaryByConfigRule\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.configservice#GetComplianceSummaryByConfigRuleResponse\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns the number of Config rules that are compliant and\\n\\t\\t\\tnoncompliant, up to a maximum of 25 for each.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#GetComplianceSummaryByConfigRuleResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ComplianceSummary\": {\n                    \"target\": \"com.amazonaws.configservice#ComplianceSummary\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of Config rules that are compliant and the\\n\\t\\t\\tnumber that are noncompliant, up to a maximum of 25 for\\n\\t\\t\\teach.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p></p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.configservice#GetComplianceSummaryByResourceType\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#GetComplianceSummaryByResourceTypeRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.configservice#GetComplianceSummaryByResourceTypeResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidParameterValueException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns the number of resources that are compliant and the\\n\\t\\t\\tnumber that are noncompliant. You can specify one or more resource\\n\\t\\t\\ttypes to get these numbers for each resource type. The maximum\\n\\t\\t\\tnumber returned is 100.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#GetComplianceSummaryByResourceTypeRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ResourceTypes\": {\n                    \"target\": \"com.amazonaws.configservice#ResourceTypes\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify one or more resource types to get the number of\\n\\t\\t\\tresources that are compliant and the number that are noncompliant\\n\\t\\t\\tfor each resource type.</p>\\n         <p>For this request, you can specify an Amazon Web Services resource type such as\\n\\t\\t\\t\\t<code>AWS::EC2::Instance</code>. You can specify that the\\n\\t\\t\\tresource type is an Amazon Web Services account by specifying\\n\\t\\t\\t\\t<code>AWS::::Account</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p></p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#GetComplianceSummaryByResourceTypeResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ComplianceSummariesByResourceType\": {\n                    \"target\": \"com.amazonaws.configservice#ComplianceSummariesByResourceType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of resources that are compliant and the number that\\n\\t\\t\\tare noncompliant. If one or more resource types were provided with\\n\\t\\t\\tthe request, the numbers are returned for each resource type. The\\n\\t\\t\\tmaximum number returned is 100.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p></p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.configservice#GetConformancePackComplianceDetails\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#GetConformancePackComplianceDetailsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.configservice#GetConformancePackComplianceDetailsResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidLimitException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidNextTokenException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#NoSuchConfigRuleInConformancePackException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#NoSuchConformancePackException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns compliance details of a conformance pack for all Amazon Web Services resources that are monitered by conformance pack.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"pageSize\": \"Limit\"\n                }\n            }\n        },\n        \"com.amazonaws.configservice#GetConformancePackComplianceDetailsLimit\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#default\": 0,\n                \"smithy.api#range\": {\n                    \"min\": 0,\n                    \"max\": 100\n                }\n            }\n        },\n        \"com.amazonaws.configservice#GetConformancePackComplianceDetailsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConformancePackName\": {\n                    \"target\": \"com.amazonaws.configservice#ConformancePackName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Name of the conformance pack.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.configservice#ConformancePackEvaluationFilters\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A <code>ConformancePackEvaluationFilters</code> object.</p>\"\n                    }\n                },\n                \"Limit\": {\n                    \"target\": \"com.amazonaws.configservice#GetConformancePackComplianceDetailsLimit\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The maximum number of evaluation results returned on each page. If you do no specify a number, Config uses the default. The default is 100.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.configservice#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>nextToken</code> string returned in a previous request that you use to request the next page of results in a paginated response.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#GetConformancePackComplianceDetailsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConformancePackName\": {\n                    \"target\": \"com.amazonaws.configservice#ConformancePackName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Name of the conformance pack.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ConformancePackRuleEvaluationResults\": {\n                    \"target\": \"com.amazonaws.configservice#ConformancePackRuleEvaluationResultsList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Returns a list of <code>ConformancePackEvaluationResult</code> objects.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.configservice#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>nextToken</code> string returned in a previous request that you use to request the next page of results in a paginated response.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.configservice#GetConformancePackComplianceSummary\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#GetConformancePackComplianceSummaryRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.configservice#GetConformancePackComplianceSummaryResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidLimitException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidNextTokenException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#NoSuchConformancePackException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns compliance details for the conformance pack based on the cumulative compliance results of all the rules in that conformance pack.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"ConformancePackComplianceSummaryList\",\n                    \"pageSize\": \"Limit\"\n                }\n            }\n        },\n        \"com.amazonaws.configservice#GetConformancePackComplianceSummaryRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConformancePackNames\": {\n                    \"target\": \"com.amazonaws.configservice#ConformancePackNamesToSummarizeList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Names of conformance packs.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Limit\": {\n                    \"target\": \"com.amazonaws.configservice#PageSizeLimit\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The maximum number of conformance packs returned on each page.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.configservice#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The nextToken string returned on a previous page that you use to get the next page of results in a paginated response.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#GetConformancePackComplianceSummaryResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConformancePackComplianceSummaryList\": {\n                    \"target\": \"com.amazonaws.configservice#ConformancePackComplianceSummaryList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of <code>ConformancePackComplianceSummary</code> objects. </p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.configservice#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The nextToken string returned on a previous page that you use to get the next page of results in a paginated response.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.configservice#GetCustomRulePolicy\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#GetCustomRulePolicyRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.configservice#GetCustomRulePolicyResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#NoSuchConfigRuleException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns the policy definition containing the logic for your Config Custom Policy rule.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#GetCustomRulePolicyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConfigRuleName\": {\n                    \"target\": \"com.amazonaws.configservice#ConfigRuleName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of your Config Custom Policy rule.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#GetCustomRulePolicyResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PolicyText\": {\n                    \"target\": \"com.amazonaws.configservice#PolicyText\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The policy definition containing the logic for your Config Custom Policy rule.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.configservice#GetDiscoveredResourceCounts\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#GetDiscoveredResourceCountsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.configservice#GetDiscoveredResourceCountsResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidLimitException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidNextTokenException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns the resource types, the number of each resource type,\\n\\t\\t\\tand the total number of resources that Config is recording in\\n\\t\\t\\tthis region for your Amazon Web Services account. </p>\\n         <p class=\\\"title\\\">\\n            <b>Example</b>\\n         </p>\\n         <ol>\\n            <li>\\n               <p>Config is recording three resource types in the US\\n\\t\\t\\t\\t\\tEast (Ohio) Region for your account: 25 EC2 instances, 20\\n\\t\\t\\t\\t\\tIAM users, and 15 S3 buckets.</p>\\n            </li>\\n            <li>\\n               <p>You make a call to the\\n\\t\\t\\t\\t\\t\\t<code>GetDiscoveredResourceCounts</code> action and\\n\\t\\t\\t\\t\\tspecify that you want all resource types. </p>\\n            </li>\\n            <li>\\n               <p>Config returns the following:</p>\\n               <ul>\\n                  <li>\\n                     <p>The resource types (EC2 instances, IAM users,\\n\\t\\t\\t\\t\\t\\t\\tand S3 buckets).</p>\\n                  </li>\\n                  <li>\\n                     <p>The number of each resource type (25, 20, and\\n\\t\\t\\t\\t\\t\\t\\t15).</p>\\n                  </li>\\n                  <li>\\n                     <p>The total number of all resources\\n\\t\\t\\t\\t\\t\\t\\t(60).</p>\\n                  </li>\\n               </ul>\\n            </li>\\n         </ol>\\n         <p>The response is paginated. By default, Config lists 100\\n\\t\\t\\t\\t<a>ResourceCount</a> objects on each page. You can\\n\\t\\t\\tcustomize this number with the <code>limit</code> parameter. The\\n\\t\\t\\tresponse includes a <code>nextToken</code> string. To get the next\\n\\t\\t\\tpage of results, run the request again and specify the string for\\n\\t\\t\\tthe <code>nextToken</code> parameter.</p>\\n         <note>\\n            <p>If you make a call to the <a>GetDiscoveredResourceCounts</a> action, you might\\n\\t\\t\\t\\tnot immediately receive resource counts in the following\\n\\t\\t\\t\\tsituations:</p>\\n            <ul>\\n               <li>\\n                  <p>You are a new Config customer.</p>\\n               </li>\\n               <li>\\n                  <p>You just enabled resource recording.</p>\\n               </li>\\n            </ul>\\n            <p>It might take a few minutes for Config to record and\\n\\t\\t\\t\\tcount your resources. Wait a few minutes and then retry the\\n\\t\\t\\t\\t\\t<a>GetDiscoveredResourceCounts</a> action.\\n\\t\\t\\t</p>\\n         </note>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"nextToken\",\n                    \"outputToken\": \"nextToken\",\n                    \"pageSize\": \"limit\"\n                }\n            }\n        },\n        \"com.amazonaws.configservice#GetDiscoveredResourceCountsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"resourceTypes\": {\n                    \"target\": \"com.amazonaws.configservice#ResourceTypes\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The comma-separated list that specifies the resource types that\\n\\t\\t\\tyou want Config to return (for example,\\n\\t\\t\\t\\t<code>\\\"AWS::EC2::Instance\\\"</code>,\\n\\t\\t\\t<code>\\\"AWS::IAM::User\\\"</code>).</p>\\n         <p>If a value for <code>resourceTypes</code> is not specified, Config returns all resource types that Config is recording in\\n\\t\\t\\tthe region for your account.</p>\\n         <note>\\n            <p>If the configuration recorder is turned off, Config\\n\\t\\t\\t\\treturns an empty list of <a>ResourceCount</a>\\n\\t\\t\\t\\tobjects. If the configuration recorder is not recording a\\n\\t\\t\\t\\tspecific resource type (for example, S3 buckets), that resource\\n\\t\\t\\t\\ttype is not returned in the list of <a>ResourceCount</a> objects.</p>\\n         </note>\"\n                    }\n                },\n                \"limit\": {\n                    \"target\": \"com.amazonaws.configservice#Limit\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The maximum number of <a>ResourceCount</a> objects\\n\\t\\t\\treturned on each page. The default is 100. You cannot specify a\\n\\t\\t\\tnumber greater than 100. If you specify 0, Config uses the\\n\\t\\t\\tdefault.</p>\"\n                    }\n                },\n                \"nextToken\": {\n                    \"target\": \"com.amazonaws.configservice#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>nextToken</code> string returned on a previous page\\n\\t\\t\\tthat you use to get the next page of results in a paginated\\n\\t\\t\\tresponse.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#GetDiscoveredResourceCountsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"totalDiscoveredResources\": {\n                    \"target\": \"com.amazonaws.configservice#Long\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The total number of resources that Config is recording in\\n\\t\\t\\tthe region for your account. If you specify resource types in the\\n\\t\\t\\trequest, Config returns only the total number of resources for\\n\\t\\t\\tthose resource types.</p>\\n         <p class=\\\"title\\\">\\n            <b>Example</b>\\n         </p>\\n         <ol>\\n            <li>\\n               <p>Config is recording three resource types in the US\\n\\t\\t\\t\\t\\tEast (Ohio) Region for your account: 25 EC2 instances, 20\\n\\t\\t\\t\\t\\tIAM users, and 15 S3 buckets, for a total of 60\\n\\t\\t\\t\\t\\tresources.</p>\\n            </li>\\n            <li>\\n               <p>You make a call to the\\n\\t\\t\\t\\t\\t\\t<code>GetDiscoveredResourceCounts</code> action and\\n\\t\\t\\t\\t\\tspecify the resource type,\\n\\t\\t\\t\\t\\t\\t<code>\\\"AWS::EC2::Instances\\\"</code>, in the\\n\\t\\t\\t\\t\\trequest.</p>\\n            </li>\\n            <li>\\n               <p>Config returns 25 for\\n\\t\\t\\t\\t\\t\\t<code>totalDiscoveredResources</code>.</p>\\n            </li>\\n         </ol>\"\n                    }\n                },\n                \"resourceCounts\": {\n                    \"target\": \"com.amazonaws.configservice#ResourceCounts\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The list of <code>ResourceCount</code> objects. Each object is\\n\\t\\t\\tlisted in descending order by the number of resources.</p>\"\n                    }\n                },\n                \"nextToken\": {\n                    \"target\": \"com.amazonaws.configservice#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The string that you use in a subsequent request to get the next\\n\\t\\t\\tpage of results in a paginated response.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.configservice#GetOrganizationConfigRuleDetailedStatus\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#GetOrganizationConfigRuleDetailedStatusRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.configservice#GetOrganizationConfigRuleDetailedStatusResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidLimitException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidNextTokenException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#NoSuchOrganizationConfigRuleException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#OrganizationAccessDeniedException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns detailed status for each member account within an organization for a given organization Config rule.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"OrganizationConfigRuleDetailedStatus\",\n                    \"pageSize\": \"Limit\"\n                }\n            }\n        },\n        \"com.amazonaws.configservice#GetOrganizationConfigRuleDetailedStatusRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"OrganizationConfigRuleName\": {\n                    \"target\": \"com.amazonaws.configservice#OrganizationConfigRuleName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of your organization Config rule for which you want status details for member accounts.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.configservice#StatusDetailFilters\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A <code>StatusDetailFilters</code> object.</p>\"\n                    }\n                },\n                \"Limit\": {\n                    \"target\": \"com.amazonaws.configservice#CosmosPageLimit\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The maximum number of <code>OrganizationConfigRuleDetailedStatus</code> returned on each page. If you do not specify a number, Config uses the default. The default is 100.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.configservice#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>nextToken</code> string returned on a previous page that you use to get the next page of results in a paginated response. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#GetOrganizationConfigRuleDetailedStatusResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"OrganizationConfigRuleDetailedStatus\": {\n                    \"target\": \"com.amazonaws.configservice#OrganizationConfigRuleDetailedStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of <code>MemberAccountStatus</code> objects.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.configservice#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>nextToken</code> string returned on a previous page that you use to get the next page of results in a paginated response. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.configservice#GetOrganizationConformancePackDetailedStatus\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#GetOrganizationConformancePackDetailedStatusRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.configservice#GetOrganizationConformancePackDetailedStatusResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidLimitException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidNextTokenException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#NoSuchOrganizationConformancePackException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#OrganizationAccessDeniedException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns detailed status for each member account within an organization for a given organization conformance pack.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"OrganizationConformancePackDetailedStatuses\",\n                    \"pageSize\": \"Limit\"\n                }\n            }\n        },\n        \"com.amazonaws.configservice#GetOrganizationConformancePackDetailedStatusRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"OrganizationConformancePackName\": {\n                    \"target\": \"com.amazonaws.configservice#OrganizationConformancePackName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of organization conformance pack for which you want status details for member accounts.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.configservice#OrganizationResourceDetailedStatusFilters\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An <code>OrganizationResourceDetailedStatusFilters</code> object.</p>\"\n                    }\n                },\n                \"Limit\": {\n                    \"target\": \"com.amazonaws.configservice#CosmosPageLimit\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The maximum number of <code>OrganizationConformancePackDetailedStatuses</code> returned on each page. \\n\\t\\t\\tIf you do not specify a number, Config uses the default. The default is 100. </p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.configservice#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The nextToken string returned on a previous page that you use to get the next page of results in a paginated response. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#GetOrganizationConformancePackDetailedStatusResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"OrganizationConformancePackDetailedStatuses\": {\n                    \"target\": \"com.amazonaws.configservice#OrganizationConformancePackDetailedStatuses\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of <code>OrganizationConformancePackDetailedStatus</code> objects. </p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.configservice#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The nextToken string returned on a previous page that you use to get the next page of results in a paginated response. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.configservice#GetOrganizationCustomRulePolicy\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#GetOrganizationCustomRulePolicyRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.configservice#GetOrganizationCustomRulePolicyResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#NoSuchOrganizationConfigRuleException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#OrganizationAccessDeniedException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns the policy definition containing the logic for your organization Config Custom Policy rule.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#GetOrganizationCustomRulePolicyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"OrganizationConfigRuleName\": {\n                    \"target\": \"com.amazonaws.configservice#OrganizationConfigRuleName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of your organization Config Custom Policy rule. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#GetOrganizationCustomRulePolicyResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PolicyText\": {\n                    \"target\": \"com.amazonaws.configservice#PolicyText\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The policy definition containing the logic for your organization Config Custom Policy rule.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.configservice#GetResourceConfigHistory\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#GetResourceConfigHistoryRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.configservice#GetResourceConfigHistoryResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidLimitException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidNextTokenException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidTimeRangeException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#NoAvailableConfigurationRecorderException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#ResourceNotDiscoveredException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<important>\\n            <p>For accurate reporting on the compliance status, you must record the <code>AWS::Config::ResourceCompliance</code> resource type.</p>\\n            <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/config/latest/developerguide/select-resources.html\\\">Recording Amazon Web Services Resources</a> in the <i>Config Resources Developer Guide</i>.</p>\\n         </important>\\n         <p>Returns a list of configurations items (CIs) for the specified resource.</p>\\n         <p>\\n            <b>Contents</b>\\n         </p>\\n         <p>The list contains details about each state of the resource\\n\\t\\t\\tduring the specified time interval. If you specified a retention\\n\\t\\t\\tperiod to retain your CIs between a\\n\\t\\t\\tminimum of 30 days and a maximum of 7 years (2557 days), Config\\n\\t\\t\\treturns the CIs for the specified\\n\\t\\t\\tretention period. </p>\\n         <p>\\n            <b>Pagination</b>\\n         </p>\\n         <p>The response is paginated. By default, Config returns a\\n\\t\\t\\tlimit of 10 configuration items per page. You can customize this\\n\\t\\t\\tnumber with the <code>limit</code> parameter. The response includes\\n\\t\\t\\ta <code>nextToken</code> string. To get the next page of results,\\n\\t\\t\\trun the request again and specify the string for the\\n\\t\\t\\t\\t<code>nextToken</code> parameter.</p>\\n         <note>\\n            <p>Each call to the API is limited to span a duration of seven\\n\\t\\t\\t\\tdays. It is likely that the number of records returned is\\n\\t\\t\\t\\tsmaller than the specified <code>limit</code>. In such cases,\\n\\t\\t\\t\\tyou can make another call, using the\\n\\t\\t\\t\\t<code>nextToken</code>.</p>\\n         </note>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"nextToken\",\n                    \"outputToken\": \"nextToken\",\n                    \"items\": \"configurationItems\",\n                    \"pageSize\": \"limit\"\n                }\n            }\n        },\n        \"com.amazonaws.configservice#GetResourceConfigHistoryRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"resourceType\": {\n                    \"target\": \"com.amazonaws.configservice#ResourceType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The resource type.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"resourceId\": {\n                    \"target\": \"com.amazonaws.configservice#ResourceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the resource (for example.,\\n\\t\\t\\t<code>sg-xxxxxx</code>).</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"laterTime\": {\n                    \"target\": \"com.amazonaws.configservice#LaterTime\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The chronologically latest time in the time range for which the history requested. If not specified,\\n\\t\\t\\tcurrent time is taken.</p>\"\n                    }\n                },\n                \"earlierTime\": {\n                    \"target\": \"com.amazonaws.configservice#EarlierTime\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The chronologically earliest time in the time range for which the history requested. If not\\n\\t\\t\\tspecified, the action returns paginated results that contain\\n\\t\\t\\tconfiguration items that start when the first configuration item was\\n\\t\\t\\trecorded.</p>\"\n                    }\n                },\n                \"chronologicalOrder\": {\n                    \"target\": \"com.amazonaws.configservice#ChronologicalOrder\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The chronological order for configuration items listed. By\\n\\t\\t\\tdefault, the results are listed in reverse chronological\\n\\t\\t\\torder.</p>\"\n                    }\n                },\n                \"limit\": {\n                    \"target\": \"com.amazonaws.configservice#Limit\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The maximum number of configuration items returned on each\\n\\t\\t\\tpage. The default is 10. You cannot specify a number greater than\\n\\t\\t\\t100. If you specify 0, Config uses the default.</p>\"\n                    }\n                },\n                \"nextToken\": {\n                    \"target\": \"com.amazonaws.configservice#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>nextToken</code> string returned on a previous page\\n\\t\\t\\tthat you use to get the next page of results in a paginated\\n\\t\\t\\tresponse.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The input for the <a>GetResourceConfigHistory</a>\\n\\t\\t\\taction.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#GetResourceConfigHistoryResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"configurationItems\": {\n                    \"target\": \"com.amazonaws.configservice#ConfigurationItemList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An array of <code>ConfigurationItems</code> Objects. Contatins the configuration history for one or more\\n\\t\\t\\tresources.</p>\"\n                    }\n                },\n                \"nextToken\": {\n                    \"target\": \"com.amazonaws.configservice#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The string that you use in a subsequent request to get the next\\n\\t\\t\\tpage of results in a paginated response.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The output for the <a>GetResourceConfigHistory</a>\\n\\t\\t\\taction.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.configservice#GetResourceEvaluationSummary\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#GetResourceEvaluationSummaryRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.configservice#GetResourceEvaluationSummaryResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#ResourceNotFoundException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns a summary of resource evaluation for the specified resource evaluation ID from the proactive rules that were run. \\n\\t\\t\\tThe results indicate which evaluation context was used to evaluate the rules, which resource details were evaluated,\\n\\t\\t\\tthe evaluation mode that was run, and whether the resource details comply with the configuration of the proactive rules. </p>\\n         <note>\\n            <p>To see additional information about the evaluation result, such as which rule flagged a resource as NON_COMPLIANT, use the <a href=\\\"https://docs.aws.amazon.com/config/latest/APIReference/API_GetComplianceDetailsByResource.html\\\">GetComplianceDetailsByResource</a> API.\\n\\t\\t\\tFor more information, see the  <a href=\\\"https://docs.aws.amazon.com/config/latest/APIReference/API_GetResourceEvaluationSummary.html#API_GetResourceEvaluationSummary_Examples\\\">Examples</a> section.</p>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.configservice#GetResourceEvaluationSummaryRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ResourceEvaluationId\": {\n                    \"target\": \"com.amazonaws.configservice#ResourceEvaluationId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The unique <code>ResourceEvaluationId</code> of Amazon Web Services resource execution for which you want to retrieve the evaluation summary.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#GetResourceEvaluationSummaryResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ResourceEvaluationId\": {\n                    \"target\": \"com.amazonaws.configservice#ResourceEvaluationId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The unique <code>ResourceEvaluationId</code> of Amazon Web Services resource execution for which you want to retrieve the evaluation summary.</p>\"\n                    }\n                },\n                \"EvaluationMode\": {\n                    \"target\": \"com.amazonaws.configservice#EvaluationMode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Lists results of the mode that you requested to retrieve the resource evaluation summary. The valid values are Detective or Proactive.</p>\"\n                    }\n                },\n                \"EvaluationStatus\": {\n                    \"target\": \"com.amazonaws.configservice#EvaluationStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Returns an <code>EvaluationStatus</code> object.</p>\"\n                    }\n                },\n                \"EvaluationStartTimestamp\": {\n                    \"target\": \"com.amazonaws.configservice#Date\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The start timestamp when Config rule starts evaluating compliance for the provided resource details.</p>\"\n                    }\n                },\n                \"Compliance\": {\n                    \"target\": \"com.amazonaws.configservice#ComplianceType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The compliance status of the resource evaluation summary.</p>\"\n                    }\n                },\n                \"EvaluationContext\": {\n                    \"target\": \"com.amazonaws.configservice#EvaluationContext\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Returns an <code>EvaluationContext</code> object.</p>\"\n                    }\n                },\n                \"ResourceDetails\": {\n                    \"target\": \"com.amazonaws.configservice#ResourceDetails\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Returns a <code>ResourceDetails</code> object.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.configservice#GetStoredQuery\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#GetStoredQueryRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.configservice#GetStoredQueryResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns the details of a specific stored query.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#GetStoredQueryRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"QueryName\": {\n                    \"target\": \"com.amazonaws.configservice#QueryName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the query.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#GetStoredQueryResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"StoredQuery\": {\n                    \"target\": \"com.amazonaws.configservice#StoredQuery\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Returns a <code>StoredQuery</code> object.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.configservice#GroupByAPILimit\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#default\": 0,\n                \"smithy.api#range\": {\n                    \"min\": 0,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.configservice#GroupedResourceCount\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"GroupName\": {\n                    \"target\": \"com.amazonaws.configservice#StringWithCharLimit256\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the group that can be region, account ID, or resource type. For example, region1, region2 if the region was chosen as <code>GroupByKey</code>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ResourceCount\": {\n                    \"target\": \"com.amazonaws.configservice#Long\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The number of resources in the group.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The count of resources that are grouped by the group name.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#GroupedResourceCountList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#GroupedResourceCount\"\n            }\n        },\n        \"com.amazonaws.configservice#IdempotentParameterMismatch\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.configservice#String\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Using the same client token with one or more different parameters. Specify a new client token with the parameter changes and try again.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.configservice#IncludeGlobalResourceTypes\": {\n            \"type\": \"boolean\",\n            \"traits\": {\n                \"smithy.api#default\": false\n            }\n        },\n        \"com.amazonaws.configservice#InsufficientDeliveryPolicyException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.configservice#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Error executing the command</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Your Amazon S3 bucket policy does not allow Config to\\n\\t\\t\\twrite to it.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.configservice#InsufficientPermissionsException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.configservice#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Error executing the command</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Indicates one of the following errors:</p>\\n         <ul>\\n            <li>\\n               <p>For <a href=\\\"https://docs.aws.amazon.com/config/latest/APIReference/API_PutConfigRule.html\\\">PutConfigRule</a>, the rule cannot be created because the IAM role assigned to Config lacks permissions to perform the config:Put* action.</p>\\n            </li>\\n            <li>\\n               <p>For <a href=\\\"https://docs.aws.amazon.com/config/latest/APIReference/API_PutConfigRule.html\\\">PutConfigRule</a>, the Lambda function cannot be invoked. Check the function ARN, and check the function's permissions.</p>\\n            </li>\\n            <li>\\n               <p>For <a href=\\\"https://docs.aws.amazon.com/config/latest/APIReference/API_PutOrganizationConfigRule.html\\\">PutOrganizationConfigRule</a>, organization Config rule cannot be created because you do not have permissions to call IAM <code>GetRole</code> action or create a service-linked role.</p>\\n            </li>\\n            <li>\\n               <p>For <a href=\\\"https://docs.aws.amazon.com/config/latest/APIReference/API_PutConformancePack.html\\\">PutConformancePack</a> and <a href=\\\"https://docs.aws.amazon.com/config/latest/APIReference/API_PutOrganizationConformancePack.html\\\">PutOrganizationConformancePack</a>, a conformance pack cannot be created because you do not have the following permissions: </p>\\n               <ul>\\n                  <li>\\n                     <p>You do not have permission to call IAM <code>GetRole</code> action or create a service-linked role.</p>\\n                  </li>\\n                  <li>\\n                     <p>You do not have permission to read Amazon S3 bucket or call SSM:GetDocument.</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <p>For <a href=\\\"https://docs.aws.amazon.com/config/latest/APIReference/API_PutServiceLinkedConfigurationRecorder.html\\\">PutServiceLinkedConfigurationRecorder</a>, a service-linked configuration recorder cannot be created because you do not have the following permissions: IAM <code>CreateServiceLinkedRole</code>.</p>\\n            </li>\\n         </ul>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.configservice#Integer\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#default\": 0\n            }\n        },\n        \"com.amazonaws.configservice#InvalidConfigurationRecorderNameException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.configservice#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Error executing the command</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The configuration recorder name is not valid. The prefix \\\"<code>AWSConfigurationRecorderFor</code>\\\" is reserved for service-linked configuration recorders.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.configservice#InvalidDeliveryChannelNameException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.configservice#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Error executing the command</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The specified delivery channel name is not valid.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.configservice#InvalidExpressionException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.configservice#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Error executing the command</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The syntax of the query is incorrect.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.configservice#InvalidLimitException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.configservice#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Error executing the command</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The specified limit is outside the allowable range.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.configservice#InvalidNextTokenException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.configservice#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Error executing the command</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The specified next token is not valid. Specify the\\n\\t\\t\\t\\t<code>nextToken</code> string that was returned in the previous\\n\\t\\t\\tresponse to get the next page of results.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.configservice#InvalidParameterValueException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.configservice#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Error executing the command</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>One or more of the specified parameters are not valid. Verify\\n\\t\\t\\tthat your parameters are valid and try again.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.configservice#InvalidRecordingGroupException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.configservice#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Error executing the command</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>One of the following errors:</p>\\n         <ul>\\n            <li>\\n               <p>You have provided a combination of parameter values that is not valid. For example:</p>\\n               <ul>\\n                  <li>\\n                     <p>Setting the <code>allSupported</code> field of <a href=\\\"https://docs.aws.amazon.com/config/latest/APIReference/API_RecordingGroup.html\\\">RecordingGroup</a> to <code>true</code>,\\n\\t\\t\\t\\t\\t\\tbut providing a non-empty list for the <code>resourceTypes</code>field of <a href=\\\"https://docs.aws.amazon.com/config/latest/APIReference/API_RecordingGroup.html\\\">RecordingGroup</a>.</p>\\n                  </li>\\n                  <li>\\n                     <p>Setting the <code>allSupported</code> field of <a href=\\\"https://docs.aws.amazon.com/config/latest/APIReference/API_RecordingGroup.html\\\">RecordingGroup</a> to <code>true</code>, but also setting the <code>useOnly</code> field of <a href=\\\"https://docs.aws.amazon.com/config/latest/APIReference/API_RecordingStrategy.html\\\">RecordingStrategy</a> to <code>EXCLUSION_BY_RESOURCE_TYPES</code>.</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <p>Every parameter is either null, false, or empty.</p>\\n            </li>\\n            <li>\\n               <p>You have reached the limit of the number of resource types you can provide for the recording group.</p>\\n            </li>\\n            <li>\\n               <p>You have provided resource types or a recording strategy that are not valid.</p>\\n            </li>\\n         </ul>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.configservice#InvalidResultTokenException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.configservice#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Error executing the command</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The specified <code>ResultToken</code> is not valid.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.configservice#InvalidRoleException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.configservice#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Error executing the command</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>You have provided a null or empty Amazon Resource Name (ARN) for the IAM role assumed by Config and used by the customer managed configuration recorder.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.configservice#InvalidS3KeyPrefixException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.configservice#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Error executing the command</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The specified Amazon S3 key prefix is not valid.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.configservice#InvalidS3KmsKeyArnException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.configservice#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Error executing the command</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The specified Amazon KMS Key ARN is not valid.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.configservice#InvalidSNSTopicARNException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.configservice#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Error executing the command</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The specified Amazon SNS topic does not exist.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.configservice#InvalidTimeRangeException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.configservice#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Error executing the command</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The specified time range is not valid. The earlier time is not\\n\\t\\t\\tchronologically before the later time.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.configservice#LastDeliveryChannelDeleteFailedException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.configservice#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Error executing the command</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>You cannot delete the delivery channel you specified because the customer managed configuration recorder is running.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.configservice#LastUpdatedTime\": {\n            \"type\": \"timestamp\"\n        },\n        \"com.amazonaws.configservice#LaterTime\": {\n            \"type\": \"timestamp\"\n        },\n        \"com.amazonaws.configservice#Limit\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#default\": 0,\n                \"smithy.api#range\": {\n                    \"min\": 0,\n                    \"max\": 100\n                }\n            }\n        },\n        \"com.amazonaws.configservice#LimitExceededException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.configservice#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Error executing the command</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>For <code>PutServiceLinkedConfigurationRecorder</code> API, this exception\\n\\t\\t\\tis thrown if the number of service-linked roles in the account exceeds the limit.</p>\\n         <p>For <code>StartConfigRulesEvaluation</code> API, this exception\\n\\t\\t\\tis thrown if an evaluation is in progress or if you call the <a>StartConfigRulesEvaluation</a> API more than once per\\n\\t\\t\\tminute.</p>\\n         <p>For <code>PutConfigurationAggregator</code> API, this exception\\n\\t\\t\\tis thrown if the number of accounts and aggregators exceeds the\\n\\t\\t\\tlimit.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.configservice#ListAggregateDiscoveredResources\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#ListAggregateDiscoveredResourcesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.configservice#ListAggregateDiscoveredResourcesResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidLimitException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidNextTokenException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#NoSuchConfigurationAggregatorException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Accepts a resource type and returns a list of resource identifiers that are aggregated for a specific resource type across accounts and regions. \\n\\t\\t\\tA resource identifier includes the resource type, ID, (if available) the custom resource name, source account, and source region. \\n\\t\\t\\tYou can narrow the results to include only resources that have specific resource IDs, or a resource name, or source account ID, or source region.</p>\\n         <p>For example, if the input consists of accountID 12345678910 and the region is us-east-1 for resource type <code>AWS::EC2::Instance</code> then the API returns all the EC2 instance identifiers of accountID 12345678910 and region us-east-1.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"ResourceIdentifiers\",\n                    \"pageSize\": \"Limit\"\n                }\n            }\n        },\n        \"com.amazonaws.configservice#ListAggregateDiscoveredResourcesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConfigurationAggregatorName\": {\n                    \"target\": \"com.amazonaws.configservice#ConfigurationAggregatorName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the configuration aggregator. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ResourceType\": {\n                    \"target\": \"com.amazonaws.configservice#ResourceType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of resources that you want Config to list in the response.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.configservice#ResourceFilters\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Filters the results based on the <code>ResourceFilters</code> object.</p>\"\n                    }\n                },\n                \"Limit\": {\n                    \"target\": \"com.amazonaws.configservice#Limit\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The maximum number of resource identifiers returned on each page. You cannot specify a number greater than 100. If you specify 0, Config uses the default.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.configservice#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>nextToken</code> string returned on a previous page that you use to get the next page of results in a paginated response.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#ListAggregateDiscoveredResourcesResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ResourceIdentifiers\": {\n                    \"target\": \"com.amazonaws.configservice#DiscoveredResourceIdentifierList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Returns a list of <code>ResourceIdentifiers</code> objects.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.configservice#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>nextToken</code> string returned on a previous page that you use to get the next page of results in a paginated response.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.configservice#ListConfigurationRecorders\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#ListConfigurationRecordersRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.configservice#ListConfigurationRecordersResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns a list of configuration recorders depending on the filters you specify.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"ConfigurationRecorderSummaries\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.configservice#ListConfigurationRecordersRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.configservice#ConfigurationRecorderFilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Filters the results based on a list of <code>ConfigurationRecorderFilter</code> objects that you specify.</p>\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.configservice#MaxResults\",\n                    \"traits\": {\n                        \"smithy.api#default\": null,\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to include in the response.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.configservice#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>NextToken</code> string returned on a previous page that you use to get the next page of results in a paginated response.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#ListConfigurationRecordersResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConfigurationRecorderSummaries\": {\n                    \"target\": \"com.amazonaws.configservice#ConfigurationRecorderSummaries\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of <code>ConfigurationRecorderSummary</code> objects that includes.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.configservice#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>NextToken</code> string returned on a previous page that you use to get the next page of results in a paginated response.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.configservice#ListConformancePackComplianceScores\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#ListConformancePackComplianceScoresRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.configservice#ListConformancePackComplianceScoresResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidLimitException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidNextTokenException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidParameterValueException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns a list of conformance pack compliance scores. \\n\\t\\t\\tA compliance score is the percentage of the number of compliant rule-resource combinations in a conformance pack compared to the number of total possible rule-resource combinations in the conformance pack.\\n\\t\\t\\tThis metric provides you with a high-level view of the compliance state of your conformance packs. You can use it to identify, investigate, and understand\\n\\t\\t\\tthe level of compliance in your conformance packs.</p>\\n         <note>\\n            <p>Conformance packs with no evaluation results will have a compliance score of <code>INSUFFICIENT_DATA</code>.</p>\\n         </note>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"pageSize\": \"Limit\"\n                }\n            }\n        },\n        \"com.amazonaws.configservice#ListConformancePackComplianceScoresRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.configservice#ConformancePackComplianceScoresFilters\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Filters the results based on the <code>ConformancePackComplianceScoresFilters</code>.</p>\"\n                    }\n                },\n                \"SortOrder\": {\n                    \"target\": \"com.amazonaws.configservice#SortOrder\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Determines the order in which conformance pack compliance scores are sorted. Either in ascending or descending order.</p>\\n         <p>By default, conformance pack compliance scores are sorted in alphabetical order by name of the conformance pack. Conformance pack compliance scores are sorted in reverse alphabetical order if you enter <code>DESCENDING</code>.</p>\\n         <p>You can sort conformance pack compliance scores by the numerical value of the compliance score by entering <code>SCORE</code> in the <code>SortBy</code> action. When compliance scores are sorted by <code>SCORE</code>, conformance packs with a compliance score of <code>INSUFFICIENT_DATA</code> will be last when sorting by ascending order and first when sorting by descending order.</p>\"\n                    }\n                },\n                \"SortBy\": {\n                    \"target\": \"com.amazonaws.configservice#SortBy\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Sorts your conformance pack compliance scores in either ascending or descending order, depending on <code>SortOrder</code>.</p>\\n         <p>By default, conformance pack compliance scores are sorted in alphabetical order by name of the conformance pack.\\n\\t\\t\\tEnter <code>SCORE</code>, to sort conformance pack compliance scores by the numerical value of the compliance score.</p>\"\n                    }\n                },\n                \"Limit\": {\n                    \"target\": \"com.amazonaws.configservice#PageSizeLimit\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The maximum number of conformance pack compliance scores returned on each page.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.configservice#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>nextToken</code> string in a prior request that you can use to get the paginated response for the next set of conformance pack compliance scores.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#ListConformancePackComplianceScoresResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.configservice#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>nextToken</code> string that you can use to get the next page of results in a paginated response.</p>\"\n                    }\n                },\n                \"ConformancePackComplianceScores\": {\n                    \"target\": \"com.amazonaws.configservice#ConformancePackComplianceScores\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of <code>ConformancePackComplianceScore</code> objects.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.configservice#ListDiscoveredResources\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#ListDiscoveredResourcesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.configservice#ListDiscoveredResourcesResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidLimitException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidNextTokenException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#NoAvailableConfigurationRecorderException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns a list of resource\\n\\t\\t\\tresource identifiers for the specified resource types for the resources of that type. A <i>resource identifier</i>\\n\\t\\t\\tincludes the resource type, ID, and (if available) the custom\\n\\t\\t\\tresource name.</p>\\n         <p>The results consist of resources that Config has\\n\\t\\t\\t<i>discovered</i>, including those that Config is not currently\\n\\t\\t\\trecording. You can narrow the results to include only resources that\\n\\t\\t\\thave specific resource IDs or a resource name.</p>\\n         <note>\\n            <p>You can specify either resource IDs or a resource name, but\\n\\t\\t\\t\\tnot both, in the same request.</p>\\n         </note>\\n         <important>\\n            <p>\\n               <i>CloudFormation stack recording behavior in Config</i>\\n            </p>\\n            <p>When a CloudFormation stack fails to create (for example, it enters the <code>ROLLBACK_FAILED</code> state), \\n\\t\\t\\t\\tConfig does not record a configuration item (CI) for that stack. Configuration items are only recorded for stacks that reach \\n\\t\\t\\t\\tthe following states:</p>\\n            <ul>\\n               <li>\\n                  <p>\\n                     <code>CREATE_COMPLETE</code>\\n                  </p>\\n               </li>\\n               <li>\\n                  <p>\\n                     <code>UPDATE_COMPLETE</code>\\n                  </p>\\n               </li>\\n               <li>\\n                  <p>\\n                     <code>UPDATE_ROLLBACK_COMPLETE</code>\\n                  </p>\\n               </li>\\n               <li>\\n                  <p>\\n                     <code>UPDATE_ROLLBACK_FAILED</code>\\n                  </p>\\n               </li>\\n               <li>\\n                  <p>\\n                     <code>DELETE_FAILED</code>\\n                  </p>\\n               </li>\\n               <li>\\n                  <p>\\n                     <code>DELETE_COMPLETE</code>\\n                  </p>\\n               </li>\\n            </ul>\\n            <p>Because no CI is created for a failed stack creation, you won't see configuration history \\n\\t\\t\\t\\tfor that stack in Config, even after the stack is deleted. This helps make sure that Config only \\n\\t\\t\\t\\ttracks resources that were successfully provisioned.</p>\\n         </important>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"nextToken\",\n                    \"outputToken\": \"nextToken\",\n                    \"items\": \"resourceIdentifiers\",\n                    \"pageSize\": \"limit\"\n                }\n            }\n        },\n        \"com.amazonaws.configservice#ListDiscoveredResourcesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"resourceType\": {\n                    \"target\": \"com.amazonaws.configservice#ResourceType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of resources that you want Config to list in the\\n\\t\\t\\tresponse.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"resourceIds\": {\n                    \"target\": \"com.amazonaws.configservice#ResourceIdList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of only those resources that you want Config to\\n\\t\\t\\tlist in the response. If you do not specify this parameter, Config lists all resources of the specified type that it has\\n\\t\\t\\tdiscovered. You can list a minimum of 1 resourceID and a maximum of 20 resourceIds.</p>\"\n                    }\n                },\n                \"resourceName\": {\n                    \"target\": \"com.amazonaws.configservice#ResourceName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The custom name of only those resources that you want Config to list in the response. If you do not specify this\\n\\t\\t\\tparameter, Config lists all resources of the specified type that\\n\\t\\t\\tit has discovered.</p>\"\n                    }\n                },\n                \"limit\": {\n                    \"target\": \"com.amazonaws.configservice#Limit\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The maximum number of resource identifiers returned on each\\n\\t\\t\\tpage. The default is 100. You cannot specify a number greater than\\n\\t\\t\\t100. If you specify 0, Config uses the default.</p>\"\n                    }\n                },\n                \"includeDeletedResources\": {\n                    \"target\": \"com.amazonaws.configservice#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Specifies whether Config includes deleted resources in the\\n\\t\\t\\tresults. By default, deleted resources are not included.</p>\"\n                    }\n                },\n                \"nextToken\": {\n                    \"target\": \"com.amazonaws.configservice#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>nextToken</code> string returned on a previous page\\n\\t\\t\\tthat you use to get the next page of results in a paginated\\n\\t\\t\\tresponse.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p></p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#ListDiscoveredResourcesResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"resourceIdentifiers\": {\n                    \"target\": \"com.amazonaws.configservice#ResourceIdentifierList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The details that identify a resource that is discovered by Config, including the resource type, ID, and (if available) the\\n\\t\\t\\tcustom resource name.</p>\"\n                    }\n                },\n                \"nextToken\": {\n                    \"target\": \"com.amazonaws.configservice#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The string that you use in a subsequent request to get the next\\n\\t\\t\\tpage of results in a paginated response.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p></p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.configservice#ListResourceEvaluations\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#ListResourceEvaluationsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.configservice#ListResourceEvaluationsResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidNextTokenException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidTimeRangeException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns a list of proactive resource evaluations.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"ResourceEvaluations\",\n                    \"pageSize\": \"Limit\"\n                }\n            }\n        },\n        \"com.amazonaws.configservice#ListResourceEvaluationsPageItemLimit\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#default\": 0,\n                \"smithy.api#range\": {\n                    \"min\": 0,\n                    \"max\": 100\n                }\n            }\n        },\n        \"com.amazonaws.configservice#ListResourceEvaluationsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.configservice#ResourceEvaluationFilters\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Returns a <code>ResourceEvaluationFilters</code> object.</p>\"\n                    }\n                },\n                \"Limit\": {\n                    \"target\": \"com.amazonaws.configservice#ListResourceEvaluationsPageItemLimit\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The maximum number of evaluations returned on each page. The default is 10. \\n\\t\\t\\tYou cannot specify a number greater than 100. If you specify 0, Config uses the default.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.configservice#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>nextToken</code> string returned on a previous page that you use to get the next page of results in a paginated response.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#ListResourceEvaluationsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ResourceEvaluations\": {\n                    \"target\": \"com.amazonaws.configservice#ResourceEvaluations\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Returns a <code>ResourceEvaluations</code> object.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.configservice#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>nextToken</code> string returned on a previous page that you use to get the next page of results in a paginated response.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.configservice#ListStoredQueries\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#ListStoredQueriesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.configservice#ListStoredQueriesResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidNextTokenException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Lists the stored queries for a single Amazon Web Services account and a single Amazon Web Services Region. The default is 100. </p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.configservice#ListStoredQueriesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.configservice#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The nextToken string returned in a previous request that you use to request the next page of results in a paginated response.</p>\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.configservice#Limit\",\n                    \"traits\": {\n                        \"smithy.api#default\": null,\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to be returned with a single call.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#ListStoredQueriesResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"StoredQueryMetadata\": {\n                    \"target\": \"com.amazonaws.configservice#StoredQueryMetadataList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of <code>StoredQueryMetadata</code> objects.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.configservice#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If the previous paginated request didn't return all of the remaining results, the response object's <code>NextToken</code> parameter value is set to a token. \\n\\t\\t\\tTo retrieve the next set of results, call this operation again and assign that token to the request object's <code>NextToken</code> parameter. \\n\\t\\t\\tIf there are no remaining results, the previous response object's <code>NextToken</code> parameter is set to <code>null</code>. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.configservice#ListTagsForResource\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#ListTagsForResourceRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.configservice#ListTagsForResourceResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidLimitException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidNextTokenException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>List the tags for Config resource.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"Tags\",\n                    \"pageSize\": \"Limit\"\n                }\n            }\n        },\n        \"com.amazonaws.configservice#ListTagsForResourceRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ResourceArn\": {\n                    \"target\": \"com.amazonaws.configservice#AmazonResourceName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) that identifies the resource for which to list the tags. The following resources are supported:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>ConfigurationRecorder</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ConfigRule</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>OrganizationConfigRule</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ConformancePack</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>OrganizationConformancePack</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ConfigurationAggregator</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>AggregationAuthorization</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>StoredQuery</code>\\n               </p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Limit\": {\n                    \"target\": \"com.amazonaws.configservice#Limit\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The maximum number of tags returned on each page. The limit maximum is 50. You cannot specify a number greater than 50. If you specify 0, Config uses the default. </p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.configservice#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>nextToken</code> string returned on a previous page that you use to get the next page of results in a paginated response. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#ListTagsForResourceResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.configservice#TagList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags for the resource.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.configservice#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>nextToken</code> string returned on a previous page that you use to get the next page of results in a paginated response. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.configservice#Long\": {\n            \"type\": \"long\",\n            \"traits\": {\n                \"smithy.api#default\": 0\n            }\n        },\n        \"com.amazonaws.configservice#MaxActiveResourcesExceededException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.configservice#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Error executing the command</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>You have reached the limit of active custom resource types in your account. There is a limit of 100,000.\\n\\t\\t\\tDelete unused resources using <a href=\\\"https://docs.aws.amazon.com/config/latest/APIReference/API_DeleteResourceConfig.html\\\">DeleteResourceConfig</a>\\n            <code></code>.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.configservice#MaxNumberOfConfigRulesExceededException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.configservice#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Error executing the command</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Failed to add the Config rule because the account already\\n\\t\\t\\tcontains the maximum number of 1000 rules. Consider deleting any\\n\\t\\t\\tdeactivated rules before you add new rules.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.configservice#MaxNumberOfConfigurationRecordersExceededException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.configservice#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Error executing the command</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>You have reached the limit of the number of configuration recorders you can\\n\\t\\t\\tcreate.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.configservice#MaxNumberOfConformancePacksExceededException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.configservice#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Error executing the command</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>You have reached the limit of the number of conformance packs you can create in an account. For more information, see <a href=\\\"https://docs.aws.amazon.com/config/latest/developerguide/configlimits.html\\\">\\n               <b>Service Limits</b>\\n            </a> in the <i>Config Developer Guide</i>.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.configservice#MaxNumberOfDeliveryChannelsExceededException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.configservice#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Error executing the command</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>You have reached the limit of the number of delivery channels\\n\\t\\t\\tyou can create.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.configservice#MaxNumberOfOrganizationConfigRulesExceededException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.configservice#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Error executing the command</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>You have reached the limit of the number of organization Config rules you can create. For more information, see see <a href=\\\"https://docs.aws.amazon.com/config/latest/developerguide/configlimits.html\\\">\\n               <b>Service Limits</b>\\n            </a> in the <i>Config Developer Guide</i>.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.configservice#MaxNumberOfOrganizationConformancePacksExceededException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.configservice#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Error executing the command</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>You have reached the limit of the number of organization conformance packs you can create in an account. For more information, see <a href=\\\"https://docs.aws.amazon.com/config/latest/developerguide/configlimits.html\\\">\\n               <b>Service Limits</b>\\n            </a> in the <i>Config Developer Guide</i>.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.configservice#MaxNumberOfRetentionConfigurationsExceededException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.configservice#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Error executing the command</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Failed to add the retention configuration because a retention configuration with that name already exists.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.configservice#MaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#default\": 0,\n                \"smithy.api#range\": {\n                    \"min\": 0,\n                    \"max\": 20\n                }\n            }\n        },\n        \"com.amazonaws.configservice#MaximumExecutionFrequency\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"One_Hour\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"One_Hour\"\n                    }\n                },\n                \"Three_Hours\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Three_Hours\"\n                    }\n                },\n                \"Six_Hours\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Six_Hours\"\n                    }\n                },\n                \"Twelve_Hours\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Twelve_Hours\"\n                    }\n                },\n                \"TwentyFour_Hours\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"TwentyFour_Hours\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.configservice#MemberAccountRuleStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"CREATE_SUCCESSFUL\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"CREATE_SUCCESSFUL\"\n                    }\n                },\n                \"CREATE_IN_PROGRESS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"CREATE_IN_PROGRESS\"\n                    }\n                },\n                \"CREATE_FAILED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"CREATE_FAILED\"\n                    }\n                },\n                \"DELETE_SUCCESSFUL\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DELETE_SUCCESSFUL\"\n                    }\n                },\n                \"DELETE_FAILED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DELETE_FAILED\"\n                    }\n                },\n                \"DELETE_IN_PROGRESS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DELETE_IN_PROGRESS\"\n                    }\n                },\n                \"UPDATE_SUCCESSFUL\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"UPDATE_SUCCESSFUL\"\n                    }\n                },\n                \"UPDATE_IN_PROGRESS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"UPDATE_IN_PROGRESS\"\n                    }\n                },\n                \"UPDATE_FAILED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"UPDATE_FAILED\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.configservice#MemberAccountStatus\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.configservice#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The 12-digit account ID of a member account.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ConfigRuleName\": {\n                    \"target\": \"com.amazonaws.configservice#StringWithCharLimit64\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of Config rule deployed in the member account.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"MemberAccountRuleStatus\": {\n                    \"target\": \"com.amazonaws.configservice#MemberAccountRuleStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates deployment status for Config rule in the member account.\\n\\t\\t\\tWhen management account calls <code>PutOrganizationConfigRule</code> action for the first time, Config rule status is created in the member account. \\n\\t\\t\\tWhen management account calls <code>PutOrganizationConfigRule</code> action for the second time, Config rule status is updated in the member account.   \\n\\t\\t\\tConfig rule status is deleted when the management account deletes <code>OrganizationConfigRule</code> and disables service access for <code>config-multiaccountsetup.amazonaws.com</code>. \\n\\t\\t</p>\\n         <p> Config sets the state of the rule to:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>CREATE_SUCCESSFUL</code> when Config rule has been created in the member account. </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>CREATE_IN_PROGRESS</code> when Config rule is being created in the member account.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>CREATE_FAILED</code> when Config rule creation has failed in the member account.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>DELETE_FAILED</code> when Config rule deletion has failed in the member account.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>DELETE_IN_PROGRESS</code> when Config rule is being deleted in the member account.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>DELETE_SUCCESSFUL</code> when Config rule has been deleted in the member account. </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>UPDATE_SUCCESSFUL</code> when Config rule has been updated in the member account.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>UPDATE_IN_PROGRESS</code> when Config rule is being updated in the member account.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>UPDATE_FAILED</code> when Config rule deletion has failed in the member account.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ErrorCode\": {\n                    \"target\": \"com.amazonaws.configservice#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An error code that is returned when Config rule creation or deletion failed in the member account.</p>\"\n                    }\n                },\n                \"ErrorMessage\": {\n                    \"target\": \"com.amazonaws.configservice#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An error message indicating that Config rule account creation or deletion has failed due to an error in the member account.</p>\"\n                    }\n                },\n                \"LastUpdateTime\": {\n                    \"target\": \"com.amazonaws.configservice#Date\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The timestamp of the last status update.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Organization Config rule creation or deletion status in each member account. This includes the name of the rule, the status, error code and error message when the rule creation or deletion failed.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#MessageType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ConfigurationItemChangeNotification\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ConfigurationItemChangeNotification\"\n                    }\n                },\n                \"ConfigurationSnapshotDeliveryCompleted\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ConfigurationSnapshotDeliveryCompleted\"\n                    }\n                },\n                \"ScheduledNotification\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ScheduledNotification\"\n                    }\n                },\n                \"OversizedConfigurationItemChangeNotification\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"OversizedConfigurationItemChangeNotification\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.configservice#Name\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.configservice#NextToken\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.configservice#NoAvailableConfigurationRecorderException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.configservice#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Error executing the command</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>There are no customer managed configuration recorders available to record your resources. Use the <a href=\\\"https://docs.aws.amazon.com/config/latest/APIReference/API_PutConfigurationRecorder.html\\\">PutConfigurationRecorder</a> operation to create the customer managed configuration\\n\\t\\t\\trecorder.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.configservice#NoAvailableDeliveryChannelException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.configservice#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Error executing the command</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>There is no delivery channel available to record\\n\\t\\t\\tconfigurations.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.configservice#NoAvailableOrganizationException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.configservice#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Error executing the command</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Organization is no longer available.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.configservice#NoRunningConfigurationRecorderException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.configservice#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Error executing the command</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>There is no configuration recorder running.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.configservice#NoSuchBucketException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.configservice#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Error executing the command</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The specified Amazon S3 bucket does not exist.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.configservice#NoSuchConfigRuleException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.configservice#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Error executing the command</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The Config rule in the request is not valid. Verify that the rule is an Config Process Check rule, that the rule name is correct, and that valid Amazon Resouce Names (ARNs) are used before trying again.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.configservice#NoSuchConfigRuleInConformancePackException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.configservice#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Error executing the command</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Config rule that you passed in the filter does not exist.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.configservice#NoSuchConfigurationAggregatorException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.configservice#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Error executing the command</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>You have specified a configuration aggregator that does not exist.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.configservice#NoSuchConfigurationRecorderException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.configservice#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Error executing the command</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>You have specified a configuration recorder that does not\\n\\t\\t\\texist.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.configservice#NoSuchConformancePackException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.configservice#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Error executing the command</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>You specified one or more conformance packs that do not exist.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.configservice#NoSuchDeliveryChannelException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.configservice#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Error executing the command</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>You have specified a delivery channel that does not\\n\\t\\t\\texist.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.configservice#NoSuchOrganizationConfigRuleException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.configservice#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Error executing the command</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The Config rule in the request is not valid. Verify that the rule is an organization Config Process Check rule, that the rule name is correct, and that valid Amazon Resouce Names (ARNs) are used before trying again.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.configservice#NoSuchOrganizationConformancePackException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.configservice#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Error executing the command</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Config organization conformance pack that you passed in the filter does not exist.</p>\\n         <p>For DeleteOrganizationConformancePack, you tried to delete an organization conformance pack that does not exist.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.configservice#NoSuchRemediationConfigurationException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.configservice#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Error executing the command</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>You specified an Config rule without a remediation configuration.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.configservice#NoSuchRemediationExceptionException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.configservice#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Error executing the command</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>You tried to delete a remediation exception that does not exist.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.configservice#NoSuchRetentionConfigurationException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.configservice#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Error executing the command</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>You have specified a retention configuration that does not exist.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.configservice#OrderingTimestamp\": {\n            \"type\": \"timestamp\"\n        },\n        \"com.amazonaws.configservice#OrganizationAccessDeniedException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.configservice#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Error executing the command</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>For <code>PutConfigurationAggregator</code> API, you can see this exception for the following reasons:</p>\\n         <ul>\\n            <li>\\n               <p>No permission to call <code>EnableAWSServiceAccess</code> API</p>\\n            </li>\\n            <li>\\n               <p>The configuration aggregator cannot be updated because your Amazon Web Services Organization management account or the delegated administrator role changed. \\n\\t\\t\\t\\tDelete this aggregator and create a new one with the current Amazon Web Services Organization.</p>\\n            </li>\\n            <li>\\n               <p>The configuration aggregator is associated with a previous Amazon Web Services Organization and Config cannot aggregate data with current Amazon Web Services Organization. \\n\\t\\t\\t\\tDelete this aggregator and create a new one with the current Amazon Web Services Organization.</p>\\n            </li>\\n            <li>\\n               <p>You are not a registered delegated administrator for Config with permissions to call <code>ListDelegatedAdministrators</code> API. \\n\\t\\t\\tEnsure that the management account registers delagated administrator for Config service principal name before the delegated administrator creates an aggregator.</p>\\n            </li>\\n         </ul>\\n         <p>For all <code>OrganizationConfigRule</code> and <code>OrganizationConformancePack</code> APIs, Config throws an exception if APIs are called from member accounts. All APIs must be called from organization management account.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.configservice#OrganizationAggregationSource\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RoleArn\": {\n                    \"target\": \"com.amazonaws.configservice#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>ARN of the IAM role used to retrieve Amazon Web Services Organization details\\n\\t\\t\\tassociated with the aggregator account.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"AwsRegions\": {\n                    \"target\": \"com.amazonaws.configservice#AggregatorRegionList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The source regions being aggregated.</p>\"\n                    }\n                },\n                \"AllAwsRegions\": {\n                    \"target\": \"com.amazonaws.configservice#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>If true, aggregate existing Config regions and future\\n\\t\\t\\tregions.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This object contains regions to set up the aggregator and an IAM\\n\\t\\t\\trole to retrieve organization details.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#OrganizationAllFeaturesNotEnabledException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.configservice#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Error executing the command</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Config resource cannot be created because your organization does not have all features enabled.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.configservice#OrganizationConfigRule\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"OrganizationConfigRuleName\": {\n                    \"target\": \"com.amazonaws.configservice#OrganizationConfigRuleName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name that you assign to organization Config rule.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"OrganizationConfigRuleArn\": {\n                    \"target\": \"com.amazonaws.configservice#StringWithCharLimit256\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Amazon Resource Name (ARN) of organization Config rule.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"OrganizationManagedRuleMetadata\": {\n                    \"target\": \"com.amazonaws.configservice#OrganizationManagedRuleMetadata\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An <code>OrganizationManagedRuleMetadata</code> object.</p>\"\n                    }\n                },\n                \"OrganizationCustomRuleMetadata\": {\n                    \"target\": \"com.amazonaws.configservice#OrganizationCustomRuleMetadata\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An <code>OrganizationCustomRuleMetadata</code> object.</p>\"\n                    }\n                },\n                \"ExcludedAccounts\": {\n                    \"target\": \"com.amazonaws.configservice#ExcludedAccounts\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A comma-separated list of accounts excluded from organization Config rule.</p>\"\n                    }\n                },\n                \"LastUpdateTime\": {\n                    \"target\": \"com.amazonaws.configservice#Date\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The timestamp of the last update.</p>\"\n                    }\n                },\n                \"OrganizationCustomPolicyRuleMetadata\": {\n                    \"target\": \"com.amazonaws.configservice#OrganizationCustomPolicyRuleMetadataNoPolicy\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An\\n\\t\\t\\tobject that specifies metadata for your organization's Config Custom Policy rule. The metadata includes the runtime system in use, which accounts have\\n\\t\\t\\tdebug logging enabled, and other custom rule metadata, such as resource type, resource\\n\\t\\t\\tID of Amazon Web Services resource, and organization trigger types that initiate Config to evaluate Amazon Web Services resources against a rule.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>An organization Config rule that has information about Config rules that Config creates in member accounts.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#OrganizationConfigRuleDetailedStatus\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#MemberAccountStatus\"\n            }\n        },\n        \"com.amazonaws.configservice#OrganizationConfigRuleName\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 64\n                },\n                \"smithy.api#pattern\": \"^[A-Za-z0-9-_]+$\"\n            }\n        },\n        \"com.amazonaws.configservice#OrganizationConfigRuleNames\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#StringWithCharLimit64\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 25\n                }\n            }\n        },\n        \"com.amazonaws.configservice#OrganizationConfigRuleStatus\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"OrganizationConfigRuleName\": {\n                    \"target\": \"com.amazonaws.configservice#OrganizationConfigRuleName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name that you assign to organization Config rule.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"OrganizationRuleStatus\": {\n                    \"target\": \"com.amazonaws.configservice#OrganizationRuleStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates deployment status of an organization Config rule. \\n\\t\\t\\tWhen management account calls PutOrganizationConfigRule action for the first time, Config rule status is created in all the member accounts. \\n\\t\\t\\tWhen management account calls PutOrganizationConfigRule action for the second time, Config rule status is updated in all the member accounts. Additionally, Config rule status is updated when one or more member accounts join or leave an organization.   \\n\\t\\t\\tConfig rule status is deleted when the management account deletes OrganizationConfigRule in all the member accounts and disables service access for <code>config-multiaccountsetup.amazonaws.com</code>.</p>\\n         <p>Config sets the state of the rule to:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>CREATE_SUCCESSFUL</code> when an organization Config rule has been successfully created in all the member accounts. </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>CREATE_IN_PROGRESS</code> when an organization Config rule creation is in progress.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>CREATE_FAILED</code> when an organization Config rule creation failed in one or more member accounts within that organization.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>DELETE_FAILED</code> when an organization Config rule deletion failed in one or more member accounts within that organization.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>DELETE_IN_PROGRESS</code> when an organization Config rule deletion is in progress.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>DELETE_SUCCESSFUL</code> when an organization Config rule has been successfully deleted from all the member accounts.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>UPDATE_SUCCESSFUL</code> when an organization Config rule has been successfully updated in all the member accounts.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>UPDATE_IN_PROGRESS</code> when an organization Config rule update is in progress.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>UPDATE_FAILED</code> when an organization Config rule update failed in one or more member accounts within that organization.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ErrorCode\": {\n                    \"target\": \"com.amazonaws.configservice#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An error code that is returned when organization Config rule creation or deletion has failed.</p>\"\n                    }\n                },\n                \"ErrorMessage\": {\n                    \"target\": \"com.amazonaws.configservice#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An error message indicating that organization Config rule creation or deletion failed due to an error.</p>\"\n                    }\n                },\n                \"LastUpdateTime\": {\n                    \"target\": \"com.amazonaws.configservice#Date\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The timestamp of the last update.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns the status for an organization Config rule in an organization.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#OrganizationConfigRuleStatuses\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#OrganizationConfigRuleStatus\"\n            }\n        },\n        \"com.amazonaws.configservice#OrganizationConfigRuleTriggerType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"CONFIGURATION_ITEM_CHANGE_NOTIFICATION\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ConfigurationItemChangeNotification\"\n                    }\n                },\n                \"OVERSIZED_CONFIGURATION_ITEM_CHANGE_NOTIFCATION\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"OversizedConfigurationItemChangeNotification\"\n                    }\n                },\n                \"SCHEDULED_NOTIFICATION\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ScheduledNotification\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.configservice#OrganizationConfigRuleTriggerTypeNoSN\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"CONFIGURATION_ITEM_CHANGE_NOTIFICATION\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ConfigurationItemChangeNotification\"\n                    }\n                },\n                \"OVERSIZED_CONFIGURATION_ITEM_CHANGE_NOTIFCATION\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"OversizedConfigurationItemChangeNotification\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.configservice#OrganizationConfigRuleTriggerTypeNoSNs\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#OrganizationConfigRuleTriggerTypeNoSN\"\n            }\n        },\n        \"com.amazonaws.configservice#OrganizationConfigRuleTriggerTypes\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#OrganizationConfigRuleTriggerType\"\n            }\n        },\n        \"com.amazonaws.configservice#OrganizationConfigRules\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#OrganizationConfigRule\"\n            }\n        },\n        \"com.amazonaws.configservice#OrganizationConformancePack\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"OrganizationConformancePackName\": {\n                    \"target\": \"com.amazonaws.configservice#OrganizationConformancePackName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name you assign to an organization conformance pack.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"OrganizationConformancePackArn\": {\n                    \"target\": \"com.amazonaws.configservice#StringWithCharLimit256\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Amazon Resource Name (ARN) of organization conformance pack.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DeliveryS3Bucket\": {\n                    \"target\": \"com.amazonaws.configservice#DeliveryS3Bucket\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the Amazon S3 bucket where Config stores conformance pack templates.  </p>\\n         <note>\\n            <p>This field is optional.</p>\\n         </note>\"\n                    }\n                },\n                \"DeliveryS3KeyPrefix\": {\n                    \"target\": \"com.amazonaws.configservice#DeliveryS3KeyPrefix\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Any folder structure you want to add to an Amazon S3 bucket.</p>\\n         <note>\\n            <p>This field is optional.</p>\\n         </note>\"\n                    }\n                },\n                \"ConformancePackInputParameters\": {\n                    \"target\": \"com.amazonaws.configservice#ConformancePackInputParameters\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of <code>ConformancePackInputParameter</code> objects.</p>\"\n                    }\n                },\n                \"ExcludedAccounts\": {\n                    \"target\": \"com.amazonaws.configservice#ExcludedAccounts\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A comma-separated list of accounts excluded from organization conformance pack.</p>\"\n                    }\n                },\n                \"LastUpdateTime\": {\n                    \"target\": \"com.amazonaws.configservice#Date\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Last time when organization conformation pack was updated.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>An organization conformance pack that has information about conformance packs that Config creates in member accounts. </p>\"\n            }\n        },\n        \"com.amazonaws.configservice#OrganizationConformancePackDetailedStatus\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.configservice#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The 12-digit account ID of a member account.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ConformancePackName\": {\n                    \"target\": \"com.amazonaws.configservice#StringWithCharLimit256\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of conformance pack deployed in the member account.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Status\": {\n                    \"target\": \"com.amazonaws.configservice#OrganizationResourceDetailedStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates deployment status for conformance pack in a member account.\\n\\t\\t\\tWhen management account calls <code>PutOrganizationConformancePack</code> action for the first time, conformance pack status is created in the member account. \\n\\t\\t\\tWhen management account calls <code>PutOrganizationConformancePack</code> action for the second time, conformance pack status is updated in the member account.   \\n\\t\\t\\tConformance pack status is deleted when the management account deletes <code>OrganizationConformancePack</code> and disables service access for <code>config-multiaccountsetup.amazonaws.com</code>. \\n\\t\\t</p>\\n         <p> Config sets the state of the conformance pack to:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>CREATE_SUCCESSFUL</code> when conformance pack has been created in the member account. </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>CREATE_IN_PROGRESS</code> when conformance pack is being created in the member account.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>CREATE_FAILED</code> when conformance pack creation has failed in the member account.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>DELETE_FAILED</code> when conformance pack deletion has failed in the member account.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>DELETE_IN_PROGRESS</code> when conformance pack is being deleted in the member account.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>DELETE_SUCCESSFUL</code> when conformance pack has been deleted in the member account. </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>UPDATE_SUCCESSFUL</code> when conformance pack has been updated in the member account.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>UPDATE_IN_PROGRESS</code> when conformance pack is being updated in the member account.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>UPDATE_FAILED</code> when conformance pack deletion has failed in the member account.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ErrorCode\": {\n                    \"target\": \"com.amazonaws.configservice#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An error code that is returned when conformance pack creation or \\n\\t\\t\\tdeletion failed in the member account. </p>\"\n                    }\n                },\n                \"ErrorMessage\": {\n                    \"target\": \"com.amazonaws.configservice#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An error message indicating that conformance pack account creation or deletion \\n\\t\\t\\thas failed due to an error in the member account. </p>\"\n                    }\n                },\n                \"LastUpdateTime\": {\n                    \"target\": \"com.amazonaws.configservice#Date\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The timestamp of the last status update.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Organization conformance pack creation or deletion status in each member account. \\n\\t\\t\\tThis includes the name of the conformance pack, the status, error code and error message \\n\\t\\t\\twhen the conformance pack creation or deletion failed. </p>\"\n            }\n        },\n        \"com.amazonaws.configservice#OrganizationConformancePackDetailedStatuses\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#OrganizationConformancePackDetailedStatus\"\n            }\n        },\n        \"com.amazonaws.configservice#OrganizationConformancePackName\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 128\n                },\n                \"smithy.api#pattern\": \"^[a-zA-Z][-a-zA-Z0-9]*$\"\n            }\n        },\n        \"com.amazonaws.configservice#OrganizationConformancePackNames\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#OrganizationConformancePackName\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 25\n                }\n            }\n        },\n        \"com.amazonaws.configservice#OrganizationConformancePackStatus\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"OrganizationConformancePackName\": {\n                    \"target\": \"com.amazonaws.configservice#OrganizationConformancePackName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name that you assign to organization conformance pack.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Status\": {\n                    \"target\": \"com.amazonaws.configservice#OrganizationResourceStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates deployment status of an organization conformance pack. \\n\\t\\t\\tWhen management account calls PutOrganizationConformancePack for the first time, \\n\\t\\t\\tconformance pack status is created in all the member accounts. \\n\\t\\t\\tWhen management account calls PutOrganizationConformancePack for the second time, \\n\\t\\t\\tconformance pack status is updated in all the member accounts. \\n\\t\\t\\tAdditionally, conformance pack status is updated when one or more member accounts join or leave an \\n\\t\\t\\torganization.   \\n\\t\\t\\tConformance pack status is deleted when the management account deletes \\n\\t\\t\\tOrganizationConformancePack in all the member accounts and disables service \\n\\t\\t\\taccess for <code>config-multiaccountsetup.amazonaws.com</code>.</p>\\n         <p>Config sets the state of the conformance pack to:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>CREATE_SUCCESSFUL</code> when an organization conformance pack has been successfully created in all the member accounts. </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>CREATE_IN_PROGRESS</code> when an organization conformance pack creation is in progress.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>CREATE_FAILED</code> when an organization conformance pack creation failed in one or more member accounts within that organization.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>DELETE_FAILED</code> when an organization conformance pack deletion failed in one or more member accounts within that organization.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>DELETE_IN_PROGRESS</code> when an organization conformance pack deletion is in progress.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>DELETE_SUCCESSFUL</code> when an organization conformance pack has been successfully deleted from all the member accounts.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>UPDATE_SUCCESSFUL</code> when an organization conformance pack has been successfully updated in all the member accounts.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>UPDATE_IN_PROGRESS</code> when an organization conformance pack update is in progress.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>UPDATE_FAILED</code> when an organization conformance pack update failed in one or more member accounts within that organization.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ErrorCode\": {\n                    \"target\": \"com.amazonaws.configservice#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An error code that is returned when organization conformance pack creation or deletion has failed in a member account. </p>\"\n                    }\n                },\n                \"ErrorMessage\": {\n                    \"target\": \"com.amazonaws.configservice#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An error message indicating that organization conformance pack creation or deletion failed due to an error. </p>\"\n                    }\n                },\n                \"LastUpdateTime\": {\n                    \"target\": \"com.amazonaws.configservice#Date\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The timestamp of the last update.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns the status for an organization conformance pack in an organization.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#OrganizationConformancePackStatuses\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#OrganizationConformancePackStatus\"\n            }\n        },\n        \"com.amazonaws.configservice#OrganizationConformancePackTemplateValidationException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.configservice#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Error executing the command</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>You have specified a template that is not valid or supported.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.configservice#OrganizationConformancePacks\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#OrganizationConformancePack\"\n            }\n        },\n        \"com.amazonaws.configservice#OrganizationCustomPolicyRuleMetadata\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Description\": {\n                    \"target\": \"com.amazonaws.configservice#StringWithCharLimit256Min0\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The description that you provide for your organization Config Custom Policy rule.</p>\"\n                    }\n                },\n                \"OrganizationConfigRuleTriggerTypes\": {\n                    \"target\": \"com.amazonaws.configservice#OrganizationConfigRuleTriggerTypeNoSNs\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of notification that initiates Config to run an evaluation for a rule.\\n\\t\\t\\tFor Config Custom Policy rules, Config supports change-initiated notification types:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>ConfigurationItemChangeNotification</code> - Initiates an evaluation when Config delivers a configuration item as a result of a resource\\n\\t\\t\\t\\t\\tchange.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>OversizedConfigurationItemChangeNotification</code> - Initiates an evaluation when\\n\\t\\t\\t\\t\\t\\tConfig delivers an oversized configuration item. Config may generate this notification type when a resource changes and the\\n\\t\\t\\t\\t\\tnotification exceeds the maximum size allowed by Amazon SNS.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"InputParameters\": {\n                    \"target\": \"com.amazonaws.configservice#StringWithCharLimit2048\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A string, in JSON format, that is passed to your organization Config Custom Policy rule.</p>\"\n                    }\n                },\n                \"MaximumExecutionFrequency\": {\n                    \"target\": \"com.amazonaws.configservice#MaximumExecutionFrequency\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum frequency with which Config runs evaluations for a rule. Your\\n\\t\\t\\tConfig Custom Policy rule is triggered when Config delivers\\n\\t\\t\\tthe configuration snapshot. For more information, see <a>ConfigSnapshotDeliveryProperties</a>.</p>\"\n                    }\n                },\n                \"ResourceTypesScope\": {\n                    \"target\": \"com.amazonaws.configservice#ResourceTypesScope\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of the Amazon Web Services resource that was evaluated.</p>\"\n                    }\n                },\n                \"ResourceIdScope\": {\n                    \"target\": \"com.amazonaws.configservice#StringWithCharLimit768\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the Amazon Web Services resource that was evaluated.</p>\"\n                    }\n                },\n                \"TagKeyScope\": {\n                    \"target\": \"com.amazonaws.configservice#StringWithCharLimit128\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One part of a key-value pair that make up a tag. A key is a general label that acts like a category for more specific tag values.</p>\"\n                    }\n                },\n                \"TagValueScope\": {\n                    \"target\": \"com.amazonaws.configservice#StringWithCharLimit256\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The optional part of a key-value pair that make up a tag. A value acts as a descriptor within a tag category (key).</p>\"\n                    }\n                },\n                \"PolicyRuntime\": {\n                    \"target\": \"com.amazonaws.configservice#PolicyRuntime\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The runtime system for your organization Config Custom Policy rules. Guard is a policy-as-code language that allows you to write policies that are enforced by Config Custom Policy rules. For more information about Guard, see the <a href=\\\"https://github.com/aws-cloudformation/cloudformation-guard\\\">Guard GitHub\\n\\t\\t\\tRepository</a>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"PolicyText\": {\n                    \"target\": \"com.amazonaws.configservice#PolicyText\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The policy definition containing the logic for your organization Config Custom Policy rule.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DebugLogDeliveryAccounts\": {\n                    \"target\": \"com.amazonaws.configservice#DebugLogDeliveryAccounts\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of accounts that you can enable debug logging for your organization Config Custom Policy rule. List is null when debug logging is enabled for all accounts.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>An\\n\\t\\t\\tobject that specifies metadata for your organization's Config Custom Policy rule. The metadata includes the runtime system in use, which accounts have\\n\\t\\t\\tdebug logging enabled, and other custom rule metadata, such as resource type, resource\\n\\t\\t\\tID of Amazon Web Services resource, and organization trigger types that initiate Config to evaluate Amazon Web Services resources against a rule.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#OrganizationCustomPolicyRuleMetadataNoPolicy\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Description\": {\n                    \"target\": \"com.amazonaws.configservice#StringWithCharLimit256Min0\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The description that you provide for your organization Config Custom Policy rule.</p>\"\n                    }\n                },\n                \"OrganizationConfigRuleTriggerTypes\": {\n                    \"target\": \"com.amazonaws.configservice#OrganizationConfigRuleTriggerTypeNoSNs\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of notification that triggers Config to run an evaluation for a rule.\\n\\t\\t\\tFor Config Custom Policy rules, Config supports change\\n\\t\\t\\ttriggered notification types:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>ConfigurationItemChangeNotification</code> - Triggers an evaluation when Config delivers a configuration item as a result of a resource change.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>OversizedConfigurationItemChangeNotification</code> - Triggers an evaluation when Config delivers an oversized configuration item. \\n\\t\\t\\t\\tConfig may generate this notification type when a resource changes and the notification exceeds the maximum size allowed by Amazon SNS.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"InputParameters\": {\n                    \"target\": \"com.amazonaws.configservice#StringWithCharLimit2048\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A string, in JSON format, that is passed to your organization Config Custom Policy rule.</p>\"\n                    }\n                },\n                \"MaximumExecutionFrequency\": {\n                    \"target\": \"com.amazonaws.configservice#MaximumExecutionFrequency\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum frequency with which Config runs evaluations for a rule. Your\\n\\t\\t\\tConfig Custom Policy rule is triggered when Config delivers\\n\\t\\t\\tthe configuration snapshot. For more information, see <a>ConfigSnapshotDeliveryProperties</a>.</p>\"\n                    }\n                },\n                \"ResourceTypesScope\": {\n                    \"target\": \"com.amazonaws.configservice#ResourceTypesScope\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of the Amazon Web Services resource that was evaluated.</p>\"\n                    }\n                },\n                \"ResourceIdScope\": {\n                    \"target\": \"com.amazonaws.configservice#StringWithCharLimit768\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the Amazon Web Services resource that was evaluated.</p>\"\n                    }\n                },\n                \"TagKeyScope\": {\n                    \"target\": \"com.amazonaws.configservice#StringWithCharLimit128\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One part of a key-value pair that make up a tag. A key is a general label that acts like a category for more specific tag values.</p>\"\n                    }\n                },\n                \"TagValueScope\": {\n                    \"target\": \"com.amazonaws.configservice#StringWithCharLimit256\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The optional part of a key-value pair that make up a tag. A value acts as a descriptor within a tag category (key).</p>\"\n                    }\n                },\n                \"PolicyRuntime\": {\n                    \"target\": \"com.amazonaws.configservice#PolicyRuntime\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The runtime system for your organization Config Custom Policy rules. Guard is a policy-as-code language that allows you to write policies that are enforced by Config Custom Policy rules. For more information about Guard, see the <a href=\\\"https://github.com/aws-cloudformation/cloudformation-guard\\\">Guard GitHub\\n\\t\\t\\tRepository</a>.</p>\"\n                    }\n                },\n                \"DebugLogDeliveryAccounts\": {\n                    \"target\": \"com.amazonaws.configservice#DebugLogDeliveryAccounts\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of accounts that you can enable debug logging for your organization Config Custom Policy rule. List is null when debug logging is enabled for all accounts.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p> metadata for your organization Config Custom Policy rule including the runtime system in use, which accounts have debug logging enabled, and\\n\\t\\t\\tother custom rule metadata such as resource type, resource ID of Amazon Web Services\\n\\t\\t\\tresource, and organization trigger types that trigger Config to evaluate\\n\\t\\t\\t\\tAmazon Web Services resources against a rule.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#OrganizationCustomRuleMetadata\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Description\": {\n                    \"target\": \"com.amazonaws.configservice#StringWithCharLimit256Min0\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The description that you provide for your organization Config rule.</p>\"\n                    }\n                },\n                \"LambdaFunctionArn\": {\n                    \"target\": \"com.amazonaws.configservice#StringWithCharLimit256\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The lambda function ARN.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"OrganizationConfigRuleTriggerTypes\": {\n                    \"target\": \"com.amazonaws.configservice#OrganizationConfigRuleTriggerTypes\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of notification that triggers Config to run an evaluation for a rule. You can specify the following notification types:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>ConfigurationItemChangeNotification</code> - Triggers an evaluation when Config delivers a configuration item as a result of a resource change.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>OversizedConfigurationItemChangeNotification</code> - Triggers an evaluation when Config delivers an oversized configuration item. \\n\\t\\t\\t         \\tConfig may generate this notification type when a resource changes and the notification exceeds the maximum size allowed by Amazon SNS.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ScheduledNotification</code> - Triggers a periodic evaluation at the frequency specified for <code>MaximumExecutionFrequency</code>.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"InputParameters\": {\n                    \"target\": \"com.amazonaws.configservice#StringWithCharLimit2048\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A string, in JSON format, that is passed to your organization Config rule Lambda function.</p>\"\n                    }\n                },\n                \"MaximumExecutionFrequency\": {\n                    \"target\": \"com.amazonaws.configservice#MaximumExecutionFrequency\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum frequency with which Config runs evaluations for a rule. \\n\\t\\t\\tYour custom rule is triggered when Config delivers the configuration snapshot. For more information, see <a>ConfigSnapshotDeliveryProperties</a>.</p>\\n         <note>\\n            <p>By default, rules with a periodic trigger are evaluated every 24 hours. To change the frequency, specify a valid \\n\\t\\t\\tvalue for the <code>MaximumExecutionFrequency</code> parameter.</p>\\n         </note>\"\n                    }\n                },\n                \"ResourceTypesScope\": {\n                    \"target\": \"com.amazonaws.configservice#ResourceTypesScope\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of the Amazon Web Services resource that was evaluated.</p>\"\n                    }\n                },\n                \"ResourceIdScope\": {\n                    \"target\": \"com.amazonaws.configservice#StringWithCharLimit768\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the Amazon Web Services resource that was evaluated.</p>\"\n                    }\n                },\n                \"TagKeyScope\": {\n                    \"target\": \"com.amazonaws.configservice#StringWithCharLimit128\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One part of a key-value pair that make up a tag. \\n\\t\\t\\tA key is a general label that acts like a category for more specific tag values. </p>\"\n                    }\n                },\n                \"TagValueScope\": {\n                    \"target\": \"com.amazonaws.configservice#StringWithCharLimit256\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The optional part of a key-value pair that make up a tag. \\n\\t\\t\\tA value acts as a descriptor within a tag category (key). </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>An object that specifies organization custom rule metadata such as resource type, resource ID of Amazon Web Services resource, Lambda function ARN, \\n\\t\\t\\tand organization trigger types that trigger Config to evaluate your Amazon Web Services resources against a rule. \\n\\t\\t\\tIt also provides the frequency with which you want Config to run evaluations for the rule if the trigger type is periodic.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#OrganizationManagedRuleMetadata\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Description\": {\n                    \"target\": \"com.amazonaws.configservice#StringWithCharLimit256Min0\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The description that you provide for your organization Config rule.</p>\"\n                    }\n                },\n                \"RuleIdentifier\": {\n                    \"target\": \"com.amazonaws.configservice#StringWithCharLimit256\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>For organization config managed rules, a predefined identifier from a\\n\\t\\t\\tlist. For example, <code>IAM_PASSWORD_POLICY</code> is a managed\\n\\t\\t\\trule. To reference a managed rule, see <a href=\\\"https://docs.aws.amazon.com/config/latest/developerguide/evaluate-config_use-managed-rules.html\\\">Using Config managed rules</a>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"InputParameters\": {\n                    \"target\": \"com.amazonaws.configservice#StringWithCharLimit2048\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A string, in JSON format, that is passed to your organization Config rule Lambda function.</p>\"\n                    }\n                },\n                \"MaximumExecutionFrequency\": {\n                    \"target\": \"com.amazonaws.configservice#MaximumExecutionFrequency\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum frequency with which Config runs evaluations for a rule. This is for an Config managed rule that is triggered at a periodic frequency.</p>\\n         <note>\\n            <p>By default, rules with a periodic trigger are evaluated every 24 hours. To change the frequency, specify a valid \\n\\t\\t\\tvalue for the <code>MaximumExecutionFrequency</code> parameter.</p>\\n         </note>\"\n                    }\n                },\n                \"ResourceTypesScope\": {\n                    \"target\": \"com.amazonaws.configservice#ResourceTypesScope\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of the Amazon Web Services resource that was evaluated.</p>\"\n                    }\n                },\n                \"ResourceIdScope\": {\n                    \"target\": \"com.amazonaws.configservice#StringWithCharLimit768\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the Amazon Web Services resource that was evaluated.</p>\"\n                    }\n                },\n                \"TagKeyScope\": {\n                    \"target\": \"com.amazonaws.configservice#StringWithCharLimit128\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One part of a key-value pair that make up a tag. \\n\\t\\t\\tA key is a general label that acts like a category for more specific tag values. </p>\"\n                    }\n                },\n                \"TagValueScope\": {\n                    \"target\": \"com.amazonaws.configservice#StringWithCharLimit256\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The optional part of a key-value pair that make up a tag. \\n\\t\\t\\tA value acts as a descriptor within a tag category (key).</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>An object that specifies organization managed rule metadata such as resource type and ID of Amazon Web Services resource along with the rule identifier. \\n\\t\\t\\tIt also provides the frequency with which you want Config to run evaluations for the rule if the trigger type is periodic.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#OrganizationResourceDetailedStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"CREATE_SUCCESSFUL\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"CREATE_SUCCESSFUL\"\n                    }\n                },\n                \"CREATE_IN_PROGRESS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"CREATE_IN_PROGRESS\"\n                    }\n                },\n                \"CREATE_FAILED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"CREATE_FAILED\"\n                    }\n                },\n                \"DELETE_SUCCESSFUL\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DELETE_SUCCESSFUL\"\n                    }\n                },\n                \"DELETE_FAILED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DELETE_FAILED\"\n                    }\n                },\n                \"DELETE_IN_PROGRESS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DELETE_IN_PROGRESS\"\n                    }\n                },\n                \"UPDATE_SUCCESSFUL\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"UPDATE_SUCCESSFUL\"\n                    }\n                },\n                \"UPDATE_IN_PROGRESS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"UPDATE_IN_PROGRESS\"\n                    }\n                },\n                \"UPDATE_FAILED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"UPDATE_FAILED\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.configservice#OrganizationResourceDetailedStatusFilters\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.configservice#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The 12-digit account ID of the member account within an organization.</p>\"\n                    }\n                },\n                \"Status\": {\n                    \"target\": \"com.amazonaws.configservice#OrganizationResourceDetailedStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates deployment status for conformance pack in a member account.\\n\\t\\t\\tWhen management account calls <code>PutOrganizationConformancePack</code> action for the first time, conformance pack status is created in the member account. \\n\\t\\t\\tWhen management account calls <code>PutOrganizationConformancePack</code> action for the second time, conformance pack status is updated in the member account.   \\n\\t\\t\\tConformance pack status is deleted when the management account deletes <code>OrganizationConformancePack</code> and disables service access for <code>config-multiaccountsetup.amazonaws.com</code>. \\n\\t\\t</p>\\n         <p> Config sets the state of the conformance pack to:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>CREATE_SUCCESSFUL</code> when conformance pack has been created in the member account. </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>CREATE_IN_PROGRESS</code> when conformance pack is being created in the member account.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>CREATE_FAILED</code> when conformance pack creation has failed in the member account.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>DELETE_FAILED</code> when conformance pack deletion has failed in the member account.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>DELETE_IN_PROGRESS</code> when conformance pack is being deleted in the member account.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>DELETE_SUCCESSFUL</code> when conformance pack has been deleted in the member account. </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>UPDATE_SUCCESSFUL</code> when conformance pack has been updated in the member account.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>UPDATE_IN_PROGRESS</code> when conformance pack is being updated in the member account.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>UPDATE_FAILED</code> when conformance pack deletion has failed in the member account.</p>\\n            </li>\\n         </ul>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Status filter object to filter results based on specific member account ID or status type for an organization conformance pack.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#OrganizationResourceStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"CREATE_SUCCESSFUL\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"CREATE_SUCCESSFUL\"\n                    }\n                },\n                \"CREATE_IN_PROGRESS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"CREATE_IN_PROGRESS\"\n                    }\n                },\n                \"CREATE_FAILED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"CREATE_FAILED\"\n                    }\n                },\n                \"DELETE_SUCCESSFUL\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DELETE_SUCCESSFUL\"\n                    }\n                },\n                \"DELETE_FAILED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DELETE_FAILED\"\n                    }\n                },\n                \"DELETE_IN_PROGRESS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DELETE_IN_PROGRESS\"\n                    }\n                },\n                \"UPDATE_SUCCESSFUL\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"UPDATE_SUCCESSFUL\"\n                    }\n                },\n                \"UPDATE_IN_PROGRESS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"UPDATE_IN_PROGRESS\"\n                    }\n                },\n                \"UPDATE_FAILED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"UPDATE_FAILED\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.configservice#OrganizationRuleStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"CREATE_SUCCESSFUL\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"CREATE_SUCCESSFUL\"\n                    }\n                },\n                \"CREATE_IN_PROGRESS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"CREATE_IN_PROGRESS\"\n                    }\n                },\n                \"CREATE_FAILED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"CREATE_FAILED\"\n                    }\n                },\n                \"DELETE_SUCCESSFUL\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DELETE_SUCCESSFUL\"\n                    }\n                },\n                \"DELETE_FAILED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DELETE_FAILED\"\n                    }\n                },\n                \"DELETE_IN_PROGRESS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DELETE_IN_PROGRESS\"\n                    }\n                },\n                \"UPDATE_SUCCESSFUL\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"UPDATE_SUCCESSFUL\"\n                    }\n                },\n                \"UPDATE_IN_PROGRESS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"UPDATE_IN_PROGRESS\"\n                    }\n                },\n                \"UPDATE_FAILED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"UPDATE_FAILED\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.configservice#OversizedConfigurationItemException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.configservice#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Error executing the command</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The configuration item size is outside the allowable range.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.configservice#Owner\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"Custom_Lambda\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"CUSTOM_LAMBDA\"\n                    }\n                },\n                \"Aws\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS\"\n                    }\n                },\n                \"Custom_Policy\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"CUSTOM_POLICY\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.configservice#PageSizeLimit\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#default\": 0,\n                \"smithy.api#range\": {\n                    \"min\": 0,\n                    \"max\": 20\n                }\n            }\n        },\n        \"com.amazonaws.configservice#ParameterName\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 255\n                }\n            }\n        },\n        \"com.amazonaws.configservice#ParameterValue\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 4096\n                }\n            }\n        },\n        \"com.amazonaws.configservice#PendingAggregationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RequesterAccountId\": {\n                    \"target\": \"com.amazonaws.configservice#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The 12-digit account ID of the account requesting to aggregate\\n\\t\\t\\tdata.</p>\"\n                    }\n                },\n                \"RequesterAwsRegion\": {\n                    \"target\": \"com.amazonaws.configservice#AwsRegion\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The region requesting to aggregate data. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>An object that represents the account ID and region of an\\n\\t\\t\\taggregator account that is requesting authorization but is not yet\\n\\t\\t\\tauthorized.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#PendingAggregationRequestList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#PendingAggregationRequest\"\n            }\n        },\n        \"com.amazonaws.configservice#Percentage\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 100\n                }\n            }\n        },\n        \"com.amazonaws.configservice#PolicyRuntime\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 64\n                },\n                \"smithy.api#pattern\": \"^guard\\\\-2\\\\.x\\\\.x$\"\n            }\n        },\n        \"com.amazonaws.configservice#PolicyText\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 10000\n                }\n            }\n        },\n        \"com.amazonaws.configservice#PutAggregationAuthorization\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#PutAggregationAuthorizationRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.configservice#PutAggregationAuthorizationResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidParameterValueException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Authorizes the aggregator account and region to collect data\\n\\t\\t\\tfrom the source account and region. </p>\\n         <note>\\n            <p>\\n               <b>Tags are added at creation and cannot be updated with this operation</b>\\n            </p>\\n            <p>\\n               <code>PutAggregationAuthorization</code> is an idempotent API. Subsequent requests won’t create a duplicate resource if one was already created. If a following request has different <code>tags</code> values,\\n\\t\\t\\tConfig will ignore these differences and treat it as an idempotent request of the previous. In this case, <code>tags</code> will not be updated, even if they are different.</p>\\n            <p>Use <a href=\\\"https://docs.aws.amazon.com/config/latest/APIReference/API_TagResource.html\\\">TagResource</a> and <a href=\\\"https://docs.aws.amazon.com/config/latest/APIReference/API_UntagResource.html\\\">UntagResource</a> to update tags after creation.</p>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.configservice#PutAggregationAuthorizationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AuthorizedAccountId\": {\n                    \"target\": \"com.amazonaws.configservice#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The 12-digit account ID of the account authorized to aggregate data.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"AuthorizedAwsRegion\": {\n                    \"target\": \"com.amazonaws.configservice#AwsRegion\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The region authorized to collect aggregated data.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.configservice#TagsList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An array of tag object.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#PutAggregationAuthorizationResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AggregationAuthorization\": {\n                    \"target\": \"com.amazonaws.configservice#AggregationAuthorization\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Returns an AggregationAuthorization object.\\n\\t\\t\\t\\n\\t\\t</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.configservice#PutConfigRule\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#PutConfigRuleRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#InsufficientPermissionsException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#MaxNumberOfConfigRulesExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#NoAvailableConfigurationRecorderException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#ResourceInUseException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Adds or updates an Config rule to evaluate if your\\n\\t\\t\\tAmazon Web Services resources comply with your desired configurations. For information on how many Config rules you can have per account, \\n\\t\\t\\tsee <a href=\\\"https://docs.aws.amazon.com/config/latest/developerguide/configlimits.html\\\">\\n               <b>Service Limits</b>\\n            </a> in the <i>Config Developer Guide</i>.</p>\\n         <p>There are two types of rules: <i>Config Managed Rules</i> and <i>Config Custom Rules</i>.\\n\\t\\t\\tYou can use <code>PutConfigRule</code> to create both Config Managed Rules and  Config Custom Rules.</p>\\n         <p>Config Managed Rules are predefined,\\n\\t\\t\\tcustomizable rules created by Config. For a list of managed rules, see\\n\\t\\t\\t<a href=\\\"https://docs.aws.amazon.com/config/latest/developerguide/managed-rules-by-aws-config.html\\\">List of Config\\n\\t\\t\\t\\tManaged Rules</a>. If you are adding an Config managed rule, you must specify the\\n\\t\\t\\trule's identifier for the <code>SourceIdentifier</code> key.</p>\\n         <p>Config Custom Rules are rules that you create from scratch. There are two ways to create Config custom rules: with Lambda functions\\n\\t\\t\\t(<a href=\\\"https://docs.aws.amazon.com/config/latest/developerguide/gettingstarted-concepts.html#gettingstarted-concepts-function\\\"> Lambda Developer Guide</a>) and with Guard (<a href=\\\"https://github.com/aws-cloudformation/cloudformation-guard\\\">Guard GitHub\\n\\t\\t\\t\\t\\tRepository</a>), a policy-as-code language.\\n\\t\\t\\t\\n\\t\\t\\tConfig custom rules created with Lambda\\n\\t\\t\\tare called <i>Config Custom Lambda Rules</i> and Config custom rules created with\\n\\t\\t\\tGuard are called <i>Config Custom Policy Rules</i>.</p>\\n         <p>If you are adding a new Config Custom Lambda rule,\\n\\t\\t\\tyou first need to create an Lambda function that the rule invokes to evaluate\\n\\t\\t\\tyour resources. When you use <code>PutConfigRule</code> to add a Custom Lambda rule to Config, you must specify the Amazon Resource\\n\\t\\t\\tName (ARN) that Lambda assigns to the function. You specify the ARN\\n\\t\\t\\tin the <code>SourceIdentifier</code> key. This key is part of the\\n\\t\\t\\t<code>Source</code> object, which is part of the\\n\\t\\t\\t<code>ConfigRule</code> object. </p>\\n         <p>For any new Config rule that you add, specify the\\n\\t\\t\\t\\t<code>ConfigRuleName</code> in the <code>ConfigRule</code>\\n\\t\\t\\tobject. Do not specify the <code>ConfigRuleArn</code> or the\\n\\t\\t\\t<code>ConfigRuleId</code>. These values are generated by Config for new rules.</p>\\n         <p>If you are updating a rule that you added previously, you can\\n\\t\\t\\tspecify the rule by <code>ConfigRuleName</code>,\\n\\t\\t\\t\\t<code>ConfigRuleId</code>, or <code>ConfigRuleArn</code> in the\\n\\t\\t\\t\\t<code>ConfigRule</code> data type that you use in this\\n\\t\\t\\trequest.</p>\\n         <p>For more information about developing and using Config\\n\\t\\t\\trules, see <a href=\\\"https://docs.aws.amazon.com/config/latest/developerguide/evaluate-config.html\\\">Evaluating Resources with Config Rules</a>\\n\\t\\t\\tin the <i>Config Developer Guide</i>.</p>\\n         <note>\\n            <p>\\n               <b>Tags are added at creation and cannot be updated with this operation</b>\\n            </p>\\n            <p>\\n               <code>PutConfigRule</code> is an idempotent API. Subsequent requests won’t create a duplicate resource if one was already created. If a following request has different <code>tags</code> values,\\n\\t\\t\\tConfig will ignore these differences and treat it as an idempotent request of the previous. In this case, <code>tags</code> will not be updated, even if they are different.</p>\\n            <p>Use <a href=\\\"https://docs.aws.amazon.com/config/latest/APIReference/API_TagResource.html\\\">TagResource</a> and <a href=\\\"https://docs.aws.amazon.com/config/latest/APIReference/API_UntagResource.html\\\">UntagResource</a> to update tags after creation.</p>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.configservice#PutConfigRuleRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConfigRule\": {\n                    \"target\": \"com.amazonaws.configservice#ConfigRule\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The rule that you want to add to your account.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.configservice#TagsList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An array of tag object.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#PutConfigurationAggregator\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#PutConfigurationAggregatorRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.configservice#PutConfigurationAggregatorResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidRoleException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#NoAvailableOrganizationException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#OrganizationAccessDeniedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#OrganizationAllFeaturesNotEnabledException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates and updates the configuration aggregator with the\\n\\t\\t\\tselected source accounts and regions. The source account can be\\n\\t\\t\\tindividual account(s) or an organization.</p>\\n         <p>\\n            <code>accountIds</code> that are passed will be replaced with existing accounts.\\n\\t\\t\\tIf you want to add additional accounts into the aggregator, call <code>DescribeConfigurationAggregators</code> to get the previous accounts and then append new ones.</p>\\n         <note>\\n            <p>Config should be enabled in source accounts and regions\\n\\t\\t\\t\\tyou want to aggregate.</p>\\n            <p>If your source type is an organization, you must be signed in to the management account or a registered delegated administrator and all the features must be enabled in your organization. \\n\\t\\t\\t\\tIf the caller is a management account, Config calls <code>EnableAwsServiceAccess</code> API to enable integration between Config and Organizations.\\n\\t\\t\\t\\tIf the caller is a registered delegated administrator, Config calls <code>ListDelegatedAdministrators</code> API to verify whether the caller is a valid delegated administrator.</p>\\n            <p>To register a delegated administrator, see <a href=\\\"https://docs.aws.amazon.com/config/latest/developerguide/set-up-aggregator-cli.html#register-a-delegated-administrator-cli\\\">Register a Delegated Administrator</a> in the <i>Config developer guide</i>. </p>\\n         </note>\\n         <note>\\n            <p>\\n               <b>Tags are added at creation and cannot be updated with this operation</b>\\n            </p>\\n            <p>\\n               <code>PutConfigurationAggregator</code> is an idempotent API. Subsequent requests won’t create a duplicate resource if one was already created. If a following request has different <code>tags</code> values,\\n\\t\\t\\tConfig will ignore these differences and treat it as an idempotent request of the previous. In this case, <code>tags</code> will not be updated, even if they are different.</p>\\n            <p>Use <a href=\\\"https://docs.aws.amazon.com/config/latest/APIReference/API_TagResource.html\\\">TagResource</a> and <a href=\\\"https://docs.aws.amazon.com/config/latest/APIReference/API_UntagResource.html\\\">UntagResource</a> to update tags after creation.</p>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.configservice#PutConfigurationAggregatorRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConfigurationAggregatorName\": {\n                    \"target\": \"com.amazonaws.configservice#ConfigurationAggregatorName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the configuration aggregator.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"AccountAggregationSources\": {\n                    \"target\": \"com.amazonaws.configservice#AccountAggregationSourceList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of AccountAggregationSource object.\\n\\t\\t\\t\\n\\t\\t</p>\"\n                    }\n                },\n                \"OrganizationAggregationSource\": {\n                    \"target\": \"com.amazonaws.configservice#OrganizationAggregationSource\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An OrganizationAggregationSource object.</p>\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.configservice#TagsList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An array of tag object.</p>\"\n                    }\n                },\n                \"AggregatorFilters\": {\n                    \"target\": \"com.amazonaws.configservice#AggregatorFilters\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An object to filter configuration recorders in an aggregator. Either <code>ResourceType</code> or <code>ServicePrincipal</code> is required.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#PutConfigurationAggregatorResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConfigurationAggregator\": {\n                    \"target\": \"com.amazonaws.configservice#ConfigurationAggregator\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Returns a ConfigurationAggregator object.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.configservice#PutConfigurationRecorder\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#PutConfigurationRecorderRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidConfigurationRecorderNameException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidRecordingGroupException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidRoleException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#MaxNumberOfConfigurationRecordersExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#UnmodifiableEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates or updates the customer managed configuration recorder.</p>\\n         <p>You can use this operation to create a new customer managed configuration recorder or to update the <code>roleARN</code> and the <code>recordingGroup</code> for an existing customer managed configuration recorder.</p>\\n         <p>To start the customer managed configuration recorder and begin recording configuration changes for the resource types you specify,\\n\\t\\t\\tuse the <a href=\\\"https://docs.aws.amazon.com/config/latest/APIReference/API_StartConfigurationRecorder.html\\\">StartConfigurationRecorder</a> operation.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/config/latest/developerguide/stop-start-recorder.html\\\">\\n               <b>Working with the Configuration Recorder</b>\\n            </a> in the <i>Config Developer Guide</i>.</p>\\n         <note>\\n            <p>\\n               <b>One customer managed configuration recorder per account per Region</b>\\n            </p>\\n            <p>You can create only one customer managed configuration recorder for each account for each Amazon Web Services Region.</p>\\n            <p>\\n               <b>Default is to record all supported resource types, excluding the global IAM resource types</b>\\n            </p>\\n            <p>If you have not specified values for the <code>recordingGroup</code> field, the default for the customer managed configuration recorder is to record all supported resource\\n\\t\\t\\t\\ttypes, excluding the global IAM resource types: <code>AWS::IAM::Group</code>, <code>AWS::IAM::Policy</code>, <code>AWS::IAM::Role</code>, and <code>AWS::IAM::User</code>.</p>\\n            <p>\\n               <b>Tags are added at creation and cannot be updated</b>\\n            </p>\\n            <p>\\n               <code>PutConfigurationRecorder</code> is an idempotent API. Subsequent requests won’t create a duplicate resource if one was already created. If a following request has different tags values,\\n\\t\\t\\t\\tConfig will ignore these differences and treat it as an idempotent request of the previous. In this case, tags will not be updated, even if they are different.</p>\\n            <p>Use <a href=\\\"https://docs.aws.amazon.com/config/latest/APIReference/API_TagResource.html\\\">TagResource</a> and <a href=\\\"https://docs.aws.amazon.com/config/latest/APIReference/API_UntagResource.html\\\">UntagResource</a> to update tags after creation.</p>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.configservice#PutConfigurationRecorderRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConfigurationRecorder\": {\n                    \"target\": \"com.amazonaws.configservice#ConfigurationRecorder\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An object for the configuration recorder. A configuration recorder records configuration changes for the resource types in scope.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.configservice#TagsList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags for the customer managed configuration recorder. Each tag consists of a key and an optional value, both of which you define.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The input for the <a>PutConfigurationRecorder</a>\\n\\t\\t\\taction.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#PutConformancePack\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#PutConformancePackRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.configservice#PutConformancePackResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#ConformancePackTemplateValidationException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#InsufficientPermissionsException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#MaxNumberOfConformancePacksExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#ResourceInUseException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates or updates a conformance pack. A conformance pack is a collection of Config rules that can be easily deployed in an account and a region and across an organization.\\n\\t\\t\\tFor information on how many conformance packs you can have per account, \\n\\t\\t\\tsee <a href=\\\"https://docs.aws.amazon.com/config/latest/developerguide/configlimits.html\\\">\\n               <b>Service Limits</b>\\n            </a> in the <i>Config Developer Guide</i>.</p>\\n         <important>\\n            <p>When you use <code>PutConformancePack</code> to deploy conformance packs in your account,\\n\\t\\t\\t\\tthe operation can create Config rules and remediation actions without\\n\\t\\t\\t\\trequiring <code>config:PutConfigRule</code> or\\n\\t\\t\\t\\t\\t<code>config:PutRemediationConfigurations</code> permissions in your account IAM\\n\\t\\t\\t\\tpolicies.</p>\\n            <p>This API uses the <code>AWSServiceRoleForConfigConforms</code> service-linked role in your\\n\\t\\t\\t\\taccount to create conformance pack resources. This service-linked role includes the\\n\\t\\t\\t\\tpermissions to create Config rules and remediation configurations, even\\n\\t\\t\\t\\tif your account IAM policies explicitly deny these actions.</p>\\n         </important>\\n         <p>This API creates a service-linked role <code>AWSServiceRoleForConfigConforms</code> in your account. \\n\\t\\tThe service-linked role is created only when the role does not exist in your account. </p>\\n         <note>\\n            <p>You must specify only one of the follow parameters: <code>TemplateS3Uri</code>, <code>TemplateBody</code> or <code>TemplateSSMDocumentDetails</code>.</p>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.configservice#PutConformancePackRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConformancePackName\": {\n                    \"target\": \"com.amazonaws.configservice#ConformancePackName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The unique name of the conformance pack you want to deploy.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TemplateS3Uri\": {\n                    \"target\": \"com.amazonaws.configservice#TemplateS3Uri\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The location of the file containing the template body (<code>s3://bucketname/prefix</code>). The uri must point to a conformance pack template (max size: 300 KB) that is located in an Amazon S3 bucket in the same Region as the conformance pack. </p>\\n         <note>\\n            <p>You must have access to read Amazon S3 bucket.\\n\\t\\t\\tIn addition, in order to ensure a successful deployment, the template object must not be in an <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage-class-intro.html\\\">archived storage class</a> if this parameter is passed.</p>\\n         </note>\"\n                    }\n                },\n                \"TemplateBody\": {\n                    \"target\": \"com.amazonaws.configservice#TemplateBody\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A string that contains the full conformance pack template body. The structure containing the template body has a minimum length of 1 byte and a maximum length of 51,200 bytes.</p>\\n         <note>\\n            <p>You can use a YAML template with two resource types: Config rule (<code>AWS::Config::ConfigRule</code>) and remediation action (<code>AWS::Config::RemediationConfiguration</code>).</p>\\n         </note>\"\n                    }\n                },\n                \"DeliveryS3Bucket\": {\n                    \"target\": \"com.amazonaws.configservice#DeliveryS3Bucket\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the Amazon S3 bucket where Config stores conformance pack templates.</p>\\n         <note>\\n            <p>This field is optional.</p>\\n         </note>\"\n                    }\n                },\n                \"DeliveryS3KeyPrefix\": {\n                    \"target\": \"com.amazonaws.configservice#DeliveryS3KeyPrefix\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The prefix for the Amazon S3 bucket. </p>\\n         <note>\\n            <p>This field is optional.</p>\\n         </note>\"\n                    }\n                },\n                \"ConformancePackInputParameters\": {\n                    \"target\": \"com.amazonaws.configservice#ConformancePackInputParameters\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of <code>ConformancePackInputParameter</code> objects.</p>\"\n                    }\n                },\n                \"TemplateSSMDocumentDetails\": {\n                    \"target\": \"com.amazonaws.configservice#TemplateSSMDocumentDetails\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An object of type <code>TemplateSSMDocumentDetails</code>, which contains the name or the Amazon Resource Name (ARN) of the Amazon Web Services Systems Manager document (SSM document) and the version of the SSM document that is used to create a conformance pack.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#PutConformancePackResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConformancePackArn\": {\n                    \"target\": \"com.amazonaws.configservice#ConformancePackArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>ARN of the conformance pack.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.configservice#PutDeliveryChannel\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#PutDeliveryChannelRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#InsufficientDeliveryPolicyException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidDeliveryChannelNameException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidS3KeyPrefixException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidS3KmsKeyArnException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidSNSTopicARNException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#MaxNumberOfDeliveryChannelsExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#NoAvailableConfigurationRecorderException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#NoSuchBucketException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates or updates a delivery channel to deliver configuration\\n\\t\\t\\tinformation and other compliance information.</p>\\n         <p>You can use this operation to create a new delivery channel or to update the Amazon S3 bucket and the\\n\\t\\t\\tAmazon SNS topic of an existing delivery channel.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/config/latest/developerguide/manage-delivery-channel.html\\\">\\n               <b>Working with the Delivery Channel</b>\\n            </a> in the <i>Config Developer Guide.</i>\\n         </p>\\n         <note>\\n            <p>\\n               <b>One delivery channel per account per Region</b>\\n            </p>\\n            <p>You can have only one delivery channel for each account for each Amazon Web Services Region.</p>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.configservice#PutDeliveryChannelRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DeliveryChannel\": {\n                    \"target\": \"com.amazonaws.configservice#DeliveryChannel\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An object for the delivery channel. A delivery channel sends notifications and updated configuration states.\\n\\t\\t</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The input for the <a>PutDeliveryChannel</a>\\n\\t\\t\\taction.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#PutEvaluations\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#PutEvaluationsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.configservice#PutEvaluationsResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidResultTokenException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#NoSuchConfigRuleException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Used by an Lambda function to deliver evaluation results to\\n\\t\\t\\tConfig. This operation is required in every Lambda function\\n\\t\\t\\tthat is invoked by an Config rule.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#PutEvaluationsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Evaluations\": {\n                    \"target\": \"com.amazonaws.configservice#Evaluations\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The assessments that the Lambda function performs. Each\\n\\t\\t\\tevaluation identifies an Amazon Web Services resource and indicates whether it\\n\\t\\t\\tcomplies with the Config rule that invokes the Lambda\\n\\t\\t\\tfunction.</p>\"\n                    }\n                },\n                \"ResultToken\": {\n                    \"target\": \"com.amazonaws.configservice#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An encrypted token that associates an evaluation with an Config rule. Identifies the rule and the event that triggered the\\n\\t\\t\\tevaluation.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TestMode\": {\n                    \"target\": \"com.amazonaws.configservice#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Use this parameter to specify a test run for\\n\\t\\t\\t<code>PutEvaluations</code>. You can verify whether your Lambda function will deliver evaluation results to Config. No\\n\\t\\t\\tupdates occur to your existing evaluations, and evaluation results\\n\\t\\t\\tare not sent to Config.</p>\\n         <note>\\n            <p>When <code>TestMode</code> is <code>true</code>,\\n\\t\\t\\t\\t\\t<code>PutEvaluations</code> doesn't require a valid value\\n\\t\\t\\t\\tfor the <code>ResultToken</code> parameter, but the value cannot\\n\\t\\t\\t\\tbe null.</p>\\n         </note>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p></p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#PutEvaluationsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"FailedEvaluations\": {\n                    \"target\": \"com.amazonaws.configservice#Evaluations\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Requests that failed because of a client or server\\n\\t\\t\\terror.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p></p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.configservice#PutExternalEvaluation\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#PutExternalEvaluationRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.configservice#PutExternalEvaluationResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#NoSuchConfigRuleException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Add or updates the evaluations for process checks.\\t\\t\\n\\t\\t\\tThis API checks if the rule is a process check when the name of the Config rule is provided.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#PutExternalEvaluationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConfigRuleName\": {\n                    \"target\": \"com.amazonaws.configservice#ConfigRuleName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the Config rule.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ExternalEvaluation\": {\n                    \"target\": \"com.amazonaws.configservice#ExternalEvaluation\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An <code>ExternalEvaluation</code> object that provides details about compliance.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#PutExternalEvaluationResponse\": {\n            \"type\": \"structure\",\n            \"members\": {},\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.configservice#PutOrganizationConfigRule\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#PutOrganizationConfigRuleRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.configservice#PutOrganizationConfigRuleResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#InsufficientPermissionsException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#MaxNumberOfOrganizationConfigRulesExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#NoAvailableOrganizationException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#OrganizationAccessDeniedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#OrganizationAllFeaturesNotEnabledException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#ResourceInUseException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Adds or updates an Config rule for your entire organization to evaluate if your Amazon Web Services resources comply with your \\n\\t\\t\\tdesired configurations. For information on how many organization Config rules you can have per account, \\n\\t\\t\\tsee <a href=\\\"https://docs.aws.amazon.com/config/latest/developerguide/configlimits.html\\\">\\n               <b>Service Limits</b>\\n            </a> in the <i>Config Developer Guide</i>.</p>\\n         <p> Only a management account and a delegated administrator can create or update an organization Config rule.\\n\\t\\tWhen calling this API with a delegated administrator, you must ensure Organizations \\n\\t\\t<code>ListDelegatedAdministrator</code> permissions are added. An organization can have up to 3 delegated administrators.</p>\\n         <p>This API enables organization service access through the <code>EnableAWSServiceAccess</code> action and creates a service-linked \\n\\t\\t\\trole <code>AWSServiceRoleForConfigMultiAccountSetup</code> in the management or delegated administrator account of your organization. \\n\\t\\t\\tThe service-linked role is created only when the role does not exist in the caller account. \\n\\t\\t\\tConfig verifies the existence of role with <code>GetRole</code> action.</p>\\n         <p>To use this API with delegated administrator, register a delegated administrator by calling Amazon Web Services Organization\\n\\t\\t\\t<code>register-delegated-administrator</code> for <code>config-multiaccountsetup.amazonaws.com</code>. </p>\\n         <p>There are two types of rules: <i>Config Managed Rules</i> and <i>Config Custom Rules</i>. \\n\\t\\t\\tYou can use <code>PutOrganizationConfigRule</code> to create both Config Managed Rules and Config Custom Rules.</p>\\n         <p>Config Managed Rules are predefined,\\n\\t\\t\\tcustomizable rules created by Config. For a list of managed rules, see\\n\\t\\t\\t<a href=\\\"https://docs.aws.amazon.com/config/latest/developerguide/managed-rules-by-aws-config.html\\\">List of Config\\n\\t\\t\\t\\tManaged Rules</a>. If you are adding an Config managed rule, you must specify the rule's identifier for the <code>RuleIdentifier</code> key.</p>\\n         <p>Config Custom Rules are rules that you create from scratch. There are two ways to create Config custom rules: with Lambda functions\\n\\t\\t\\t(<a href=\\\"https://docs.aws.amazon.com/config/latest/developerguide/gettingstarted-concepts.html#gettingstarted-concepts-function\\\"> Lambda Developer Guide</a>) and with Guard (<a href=\\\"https://github.com/aws-cloudformation/cloudformation-guard\\\">Guard GitHub\\n\\t\\t\\t\\t\\tRepository</a>), a policy-as-code language.\\n\\t\\t\\t\\n\\t\\t\\tConfig custom rules created with Lambda\\n\\t\\t\\tare called <i>Config Custom Lambda Rules</i> and Config custom rules created with\\n\\t\\t\\tGuard are called <i>Config Custom Policy Rules</i>.</p>\\n         <p>If you are adding a new Config Custom Lambda rule, you first need to create an Lambda function in the management account or a delegated \\n\\t\\tadministrator that the rule invokes to evaluate your resources. You also need to create an IAM role in the managed account that can be assumed by the Lambda function.\\n\\t\\tWhen you use <code>PutOrganizationConfigRule</code> to add a Custom Lambda rule to Config, you must \\n\\t\\t\\tspecify the Amazon Resource Name (ARN) that Lambda assigns to the function.</p>\\n         <note>\\n            <p>Prerequisite: Ensure you call <code>EnableAllFeatures</code> API to enable all features in an organization.</p>\\n            <p>Make sure to specify one of either <code>OrganizationCustomPolicyRuleMetadata</code> for Custom Policy rules, <code>OrganizationCustomRuleMetadata</code> for Custom Lambda rules, or <code>OrganizationManagedRuleMetadata</code> for managed rules.</p>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.configservice#PutOrganizationConfigRuleRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"OrganizationConfigRuleName\": {\n                    \"target\": \"com.amazonaws.configservice#OrganizationConfigRuleName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name that you assign to an organization Config rule.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"OrganizationManagedRuleMetadata\": {\n                    \"target\": \"com.amazonaws.configservice#OrganizationManagedRuleMetadata\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An <code>OrganizationManagedRuleMetadata</code> object. This object specifies organization\\n\\t\\t\\tmanaged rule metadata such as resource type and ID of Amazon Web Services resource along with the rule identifier.\\n\\t\\t\\tIt also provides the frequency with which you want Config to run evaluations for the rule if the trigger type is periodic.</p>\"\n                    }\n                },\n                \"OrganizationCustomRuleMetadata\": {\n                    \"target\": \"com.amazonaws.configservice#OrganizationCustomRuleMetadata\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An <code>OrganizationCustomRuleMetadata</code> object. This object specifies organization custom rule metadata such as resource type,\\n\\t\\t\\tresource ID of Amazon Web Services resource, Lambda function ARN, and organization trigger types that trigger Config to evaluate your Amazon Web Services resources against a rule.\\n\\t\\t\\tIt also provides the frequency with which you want Config to run evaluations for the rule if the trigger type is periodic.</p>\"\n                    }\n                },\n                \"ExcludedAccounts\": {\n                    \"target\": \"com.amazonaws.configservice#ExcludedAccounts\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A comma-separated list of accounts that you want to exclude from an organization Config rule.</p>\"\n                    }\n                },\n                \"OrganizationCustomPolicyRuleMetadata\": {\n                    \"target\": \"com.amazonaws.configservice#OrganizationCustomPolicyRuleMetadata\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An <code>OrganizationCustomPolicyRuleMetadata</code> object. This object specifies metadata for your organization's Config Custom Policy rule. The metadata includes the runtime system in use, which accounts have debug\\n\\t\\t\\tlogging enabled, and other custom rule metadata, such as resource type, resource ID of\\n\\t\\t\\tAmazon Web Services resource, and organization trigger types that initiate Config to evaluate Amazon Web Services resources against a rule.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#PutOrganizationConfigRuleResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"OrganizationConfigRuleArn\": {\n                    \"target\": \"com.amazonaws.configservice#StringWithCharLimit256\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of an organization Config rule.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.configservice#PutOrganizationConformancePack\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#PutOrganizationConformancePackRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.configservice#PutOrganizationConformancePackResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#InsufficientPermissionsException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#MaxNumberOfOrganizationConformancePacksExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#NoAvailableOrganizationException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#OrganizationAccessDeniedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#OrganizationAllFeaturesNotEnabledException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#OrganizationConformancePackTemplateValidationException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#ResourceInUseException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deploys conformance packs across member accounts in an Amazon Web Services Organization. For information on how many organization conformance packs and how many Config rules you can have per account, \\n\\t\\t\\tsee <a href=\\\"https://docs.aws.amazon.com/config/latest/developerguide/configlimits.html\\\">\\n               <b>Service Limits</b>\\n            </a> in the <i>Config Developer Guide</i>.</p>\\n         <p>Only a management account and a delegated administrator can call this API. \\n\\t\\t\\tWhen calling this API with a delegated administrator, you must ensure Organizations \\n\\t\\t\\t<code>ListDelegatedAdministrator</code> permissions are added. An organization can have up to 3 delegated administrators.</p>\\n         <important>\\n            <p>When you use <code>PutOrganizationConformancePack</code> to deploy conformance packs across\\n\\t\\t\\t\\tmember accounts, the operation can create Config rules and remediation\\n\\t\\t\\t\\tactions without requiring <code>config:PutConfigRule</code> or\\n\\t\\t\\t\\t\\t<code>config:PutRemediationConfigurations</code> permissions in member account\\n\\t\\t\\t\\tIAM policies.</p>\\n            <p>This API uses the <code>AWSServiceRoleForConfigConforms</code> service-linked role in each\\n\\t\\t\\t\\tmember account to create conformance pack resources. This service-linked role\\n\\t\\t\\t\\tincludes the permissions to create Config rules and remediation\\n\\t\\t\\t\\tconfigurations, even if member account IAM policies explicitly deny these\\n\\t\\t\\t\\tactions.</p>\\n         </important>\\n         <p>This API enables organization service access for <code>config-multiaccountsetup.amazonaws.com</code>\\n\\t\\t\\tthrough the <code>EnableAWSServiceAccess</code> action and creates a \\n\\t\\t\\tservice-linked role <code>AWSServiceRoleForConfigMultiAccountSetup</code> in the management or delegated administrator account of your organization. \\n\\t\\t\\tThe service-linked role is created only when the role does not exist in the caller account. \\n\\t\\t\\tTo use this API with delegated administrator, register a delegated administrator by calling Amazon Web Services Organization \\n\\t\\t\\t<code>register-delegate-admin</code> for <code>config-multiaccountsetup.amazonaws.com</code>.</p>\\n         <note>\\n            <p>Prerequisite: Ensure you call <code>EnableAllFeatures</code> API to enable all features in an organization.</p>\\n            <p>You must specify either the <code>TemplateS3Uri</code> or the <code>TemplateBody</code> parameter, but not both. \\n\\t\\t\\tIf you provide both Config uses the <code>TemplateS3Uri</code> parameter and ignores the <code>TemplateBody</code> parameter.</p>\\n            <p>Config sets the state of a conformance pack to CREATE_IN_PROGRESS and UPDATE_IN_PROGRESS until the conformance pack is created or updated.  \\n\\t\\t\\t\\tYou cannot update a conformance pack while it is in this state.</p>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.configservice#PutOrganizationConformancePackRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"OrganizationConformancePackName\": {\n                    \"target\": \"com.amazonaws.configservice#OrganizationConformancePackName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Name of the organization conformance pack you want to create.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TemplateS3Uri\": {\n                    \"target\": \"com.amazonaws.configservice#TemplateS3Uri\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Location of file containing the template body. The uri must point to the conformance pack template\\n\\t\\t\\t(max size: 300 KB).</p>\\n         <note>\\n            <p>You must have access to read Amazon S3 bucket.\\n\\t\\t\\tIn addition, in order to ensure a successful deployment, the template object must not be in an <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage-class-intro.html\\\">archived storage class</a> if this parameter is passed.</p>\\n         </note>\"\n                    }\n                },\n                \"TemplateBody\": {\n                    \"target\": \"com.amazonaws.configservice#TemplateBody\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A string that contains the full conformance pack template body. Structure containing the template body\\n\\t\\t\\twith a minimum length of 1 byte and a maximum length of 51,200 bytes.</p>\"\n                    }\n                },\n                \"DeliveryS3Bucket\": {\n                    \"target\": \"com.amazonaws.configservice#DeliveryS3Bucket\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the Amazon S3 bucket where Config stores conformance pack templates.</p>\\n         <note>\\n            <p>This field is optional. If used, it must be prefixed with <code>awsconfigconforms</code>.</p>\\n         </note>\"\n                    }\n                },\n                \"DeliveryS3KeyPrefix\": {\n                    \"target\": \"com.amazonaws.configservice#DeliveryS3KeyPrefix\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The prefix for the Amazon S3 bucket.</p>\\n         <note>\\n            <p>This field is optional.</p>\\n         </note>\"\n                    }\n                },\n                \"ConformancePackInputParameters\": {\n                    \"target\": \"com.amazonaws.configservice#ConformancePackInputParameters\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of <code>ConformancePackInputParameter</code> objects.</p>\"\n                    }\n                },\n                \"ExcludedAccounts\": {\n                    \"target\": \"com.amazonaws.configservice#ExcludedAccounts\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of Amazon Web Services accounts to be excluded from an organization conformance pack while deploying a conformance pack.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#PutOrganizationConformancePackResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"OrganizationConformancePackArn\": {\n                    \"target\": \"com.amazonaws.configservice#StringWithCharLimit256\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>ARN of the organization conformance pack.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.configservice#PutRemediationConfigurations\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#PutRemediationConfigurationsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.configservice#PutRemediationConfigurationsResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#InsufficientPermissionsException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidParameterValueException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Adds or updates the remediation configuration with a specific Config rule with the \\n\\t\\t\\tselected target or action. \\n\\t\\t\\tThe API creates the <code>RemediationConfiguration</code> object for the Config rule. \\n\\t\\tThe Config rule must already exist for you to add a remediation configuration. \\n\\t\\tThe target (SSM document) must exist and have permissions to use the target. </p>\\n         <note>\\n            <p>\\n               <b>Be aware of backward incompatible changes</b>\\n            </p>\\n            <p>If you make backward incompatible changes to the SSM document, \\n\\t\\t\\tyou must call this again to ensure the remediations can run.</p>\\n            <p>This API does not support adding remediation configurations for service-linked Config Rules such as Organization Config rules, \\n\\t\\t\\t\\tthe rules deployed by conformance packs, and rules deployed by Amazon Web Services Security Hub.</p>\\n         </note>\\n         <note>\\n            <p>\\n               <b>Required fields</b>\\n            </p>\\n            <p>For manual remediation configuration, you need to provide a value for <code>automationAssumeRole</code> or use a value in the <code>assumeRole</code>field  to remediate your resources. The SSM automation document can use either as long as it maps to a valid parameter.</p>\\n            <p>However, for automatic remediation configuration, the only valid <code>assumeRole</code> field value is <code>AutomationAssumeRole</code> and you need to provide a value for <code>AutomationAssumeRole</code> to remediate your resources.</p>\\n         </note>\\n         <note>\\n            <p>\\n               <b>Auto remediation can be initiated even for compliant resources</b>\\n            </p>\\n            <p>If you enable auto remediation for a specific Config rule using the <a href=\\\"https://docs.aws.amazon.com/config/latest/APIReference/emAPI_PutRemediationConfigurations.html\\\">PutRemediationConfigurations</a> API or the Config console,\\n\\t\\t\\t\\tit initiates the remediation process for all non-compliant resources for that specific rule.\\n\\t\\t\\t\\tThe auto remediation process relies on the compliance data snapshot which is captured on a periodic basis.\\n\\t\\t\\t\\tAny non-compliant resource that is updated between the snapshot schedule will continue to be remediated based on the last known compliance data snapshot.</p>\\n            <p>This means that in some cases auto remediation can be initiated even for compliant resources, since the bootstrap processor uses a database that can have stale evaluation results based on the last known compliance data snapshot.</p>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.configservice#PutRemediationConfigurationsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RemediationConfigurations\": {\n                    \"target\": \"com.amazonaws.configservice#RemediationConfigurations\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of remediation configuration objects.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#PutRemediationConfigurationsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"FailedBatches\": {\n                    \"target\": \"com.amazonaws.configservice#FailedRemediationBatches\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Returns a list of failed remediation batch objects.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.configservice#PutRemediationExceptions\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#PutRemediationExceptionsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.configservice#PutRemediationExceptionsResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#InsufficientPermissionsException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidParameterValueException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A remediation exception is when a specified resource is no longer considered for auto-remediation. \\n\\t\\t\\tThis API adds a new exception or updates an existing exception for a specified resource with a specified Config rule. </p>\\n         <note>\\n            <p>\\n               <b>Exceptions block auto remediation</b>\\n            </p>\\n            <p>Config generates a remediation exception when a problem occurs running a remediation action for a specified resource. \\n\\t\\t\\tRemediation exceptions blocks auto-remediation until the exception is cleared.</p>\\n         </note>\\n         <note>\\n            <p>\\n               <b>Manual remediation is recommended when placing an exception</b>\\n            </p>\\n            <p>When placing an exception on an Amazon Web Services resource, it is recommended that remediation is set as manual remediation until\\n\\t\\t\\tthe given Config rule for the specified resource evaluates the resource as <code>NON_COMPLIANT</code>.\\n\\t\\t\\tOnce the resource has been evaluated as <code>NON_COMPLIANT</code>, you can add remediation exceptions and change the remediation type back from Manual to Auto if you want to use auto-remediation.\\n\\t\\t\\tOtherwise, using auto-remediation before a <code>NON_COMPLIANT</code> evaluation result can delete resources before the exception is applied.</p>\\n         </note>\\n         <note>\\n            <p>\\n               <b>Exceptions can only be performed on non-compliant resources</b>\\n            </p>\\n            <p>Placing an exception can only be performed on resources that are <code>NON_COMPLIANT</code>.\\n\\t\\t\\tIf you use this API for <code>COMPLIANT</code> resources or resources that are <code>NOT_APPLICABLE</code>, a remediation exception will not be generated.\\n\\t\\t\\tFor more information on the conditions that initiate the possible Config evaluation results,\\n\\t\\t\\tsee <a href=\\\"https://docs.aws.amazon.com/config/latest/developerguide/config-concepts.html#aws-config-rules\\\">Concepts | Config  Rules</a> in the <i>Config Developer Guide</i>.</p>\\n         </note>\\n         <note>\\n            <p>\\n               <b>Exceptions cannot be placed on service-linked remediation actions</b>\\n            </p>\\n            <p>You cannot place an exception on service-linked remediation actions, such as remediation actions put by an organizational conformance pack.</p>\\n         </note>\\n         <note>\\n            <p>\\n               <b>Auto remediation can be initiated even for compliant resources</b>\\n            </p>\\n            <p>If you enable auto remediation for a specific Config rule using the <a href=\\\"https://docs.aws.amazon.com/config/latest/APIReference/emAPI_PutRemediationConfigurations.html\\\">PutRemediationConfigurations</a> API or the Config console,\\n\\t\\t\\t\\tit initiates the remediation process for all non-compliant resources for that specific rule.\\n\\t\\t\\t\\tThe auto remediation process relies on the compliance data snapshot which is captured on a periodic basis.\\n\\t\\t\\t\\tAny non-compliant resource that is updated between the snapshot schedule will continue to be remediated based on the last known compliance data snapshot.</p>\\n            <p>This means that in some cases auto remediation can be initiated even for compliant resources, since the bootstrap processor uses a database that can have stale evaluation results based on the last known compliance data snapshot.</p>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.configservice#PutRemediationExceptionsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConfigRuleName\": {\n                    \"target\": \"com.amazonaws.configservice#ConfigRuleName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the Config rule for which you want to create remediation exception.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ResourceKeys\": {\n                    \"target\": \"com.amazonaws.configservice#RemediationExceptionResourceKeys\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An exception list of resource exception keys to be processed with the current request. Config adds exception for each resource key. For example, Config adds 3 exceptions for 3 resource keys. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Message\": {\n                    \"target\": \"com.amazonaws.configservice#StringWithCharLimit1024\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The message contains an explanation of the exception.</p>\"\n                    }\n                },\n                \"ExpirationTime\": {\n                    \"target\": \"com.amazonaws.configservice#Date\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The exception is automatically deleted after the expiration date.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#PutRemediationExceptionsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"FailedBatches\": {\n                    \"target\": \"com.amazonaws.configservice#FailedRemediationExceptionBatches\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Returns a list of failed remediation exceptions batch objects. Each object in the batch consists of a list of failed items and failure messages.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.configservice#PutResourceConfig\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#PutResourceConfigRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#InsufficientPermissionsException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#MaxActiveResourcesExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#NoRunningConfigurationRecorderException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Records the configuration state for the resource provided in the request.\\n\\t\\t\\t \\n\\t\\t\\tThe configuration state of a resource is represented in Config as Configuration Items. \\n\\t\\t\\tOnce this API records the configuration item, you can retrieve the list of configuration items for the custom resource type using existing Config APIs. </p>\\n         <note>\\n            <p>The custom resource type must be registered with CloudFormation. This API accepts the configuration item registered with CloudFormation.</p>\\n            <p>When you call this API, Config only stores configuration state of the resource provided in the request. This API does not change or remediate the configuration of the resource.\\n\\t\\t\\t\\t</p>\\n            <p>Write-only schema properites are not recorded as part of the published configuration item.</p>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.configservice#PutResourceConfigRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ResourceType\": {\n                    \"target\": \"com.amazonaws.configservice#ResourceTypeString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of the resource. The custom resource type must be registered with CloudFormation. </p>\\n         <note>\\n            <p>You cannot use the organization names “amzn”, “amazon”, “alexa”, “custom” with custom resource types. It is the first part of the ResourceType up to the first ::.</p>\\n         </note>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"SchemaVersionId\": {\n                    \"target\": \"com.amazonaws.configservice#SchemaVersionId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Version of the schema registered for the ResourceType in CloudFormation.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ResourceId\": {\n                    \"target\": \"com.amazonaws.configservice#ResourceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Unique identifier of the resource.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ResourceName\": {\n                    \"target\": \"com.amazonaws.configservice#ResourceName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Name of the resource.</p>\"\n                    }\n                },\n                \"Configuration\": {\n                    \"target\": \"com.amazonaws.configservice#Configuration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The configuration object of the resource in valid JSON format. It must match the schema registered with CloudFormation.</p>\\n         <note>\\n            <p>The configuration JSON must not exceed 64 KB.</p>\\n         </note>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.configservice#Tags\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Tags associated with the resource.</p>\\n         <note>\\n            <p>This field is not to be confused with the Amazon Web Services-wide tag feature for Amazon Web Services resources.\\n\\t\\t\\tTags for <code>PutResourceConfig</code> are tags that you supply for the configuration items of your custom resources.</p>\\n         </note>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#PutRetentionConfiguration\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#PutRetentionConfigurationRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.configservice#PutRetentionConfigurationResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#MaxNumberOfRetentionConfigurationsExceededException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates and updates the retention configuration with details\\n\\t\\t\\tabout retention period (number of days) that Config stores your\\n\\t\\t\\thistorical information. The API creates the\\n\\t\\t\\t\\t<code>RetentionConfiguration</code> object and names the object\\n\\t\\t\\tas <b>default</b>. When you have a\\n\\t\\t\\t\\t<code>RetentionConfiguration</code> object named <b>default</b>, calling the API modifies the\\n\\t\\t\\tdefault object. </p>\\n         <note>\\n            <p>Currently, Config supports only one retention\\n\\t\\t\\t\\tconfiguration per region in your account.</p>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.configservice#PutRetentionConfigurationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RetentionPeriodInDays\": {\n                    \"target\": \"com.amazonaws.configservice#RetentionPeriodInDays\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Number of days Config stores your historical\\n\\t\\t\\tinformation.</p>\\n         <note>\\n            <p>Currently, only applicable to the configuration item\\n\\t\\t\\t\\thistory.</p>\\n         </note>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#PutRetentionConfigurationResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RetentionConfiguration\": {\n                    \"target\": \"com.amazonaws.configservice#RetentionConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Returns a retention configuration object.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.configservice#PutServiceLinkedConfigurationRecorder\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#PutServiceLinkedConfigurationRecorderRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.configservice#PutServiceLinkedConfigurationRecorderResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#ConflictException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#InsufficientPermissionsException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates a service-linked configuration recorder that is linked to a specific Amazon Web Services service based on the <code>ServicePrincipal</code> you specify.</p>\\n         <p>The configuration recorder's <code>name</code>, <code>recordingGroup</code>, <code>recordingMode</code>, and <code>recordingScope</code> is set by the service that is linked to the configuration recorder.</p>\\n         <p>For more information and a list of supported services/service principals, see <a href=\\\"https://docs.aws.amazon.com/config/latest/developerguide/stop-start-recorder.html\\\">\\n               <b>Working with the Configuration Recorder</b>\\n            </a> in the <i>Config Developer Guide</i>.</p>\\n         <p>This API creates a service-linked role <code>AWSServiceRoleForConfig</code> in your account. The service-linked role is created only when the role does not exist in your account.</p>\\n         <note>\\n            <p>\\n               <b>The recording scope determines if you receive configuration items</b>\\n            </p>\\n            <p>The recording scope is set by the service that is linked to the configuration recorder and determines whether you receive configuration items (CIs) in the delivery channel. If the recording scope is internal, you will not receive CIs in the delivery channel.</p>\\n            <p>\\n               <b>Tags are added at creation and cannot be updated with this operation</b>\\n            </p>\\n            <p>Use <a href=\\\"https://docs.aws.amazon.com/config/latest/APIReference/API_TagResource.html\\\">TagResource</a> and <a href=\\\"https://docs.aws.amazon.com/config/latest/APIReference/API_UntagResource.html\\\">UntagResource</a> to update tags after creation.</p>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.configservice#PutServiceLinkedConfigurationRecorderRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ServicePrincipal\": {\n                    \"target\": \"com.amazonaws.configservice#ServicePrincipal\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The service principal of the Amazon Web Services service for the service-linked configuration recorder that you want to create.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.configservice#TagsList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags for a service-linked configuration recorder. Each tag consists of a key and an optional value, both of which you define.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#PutServiceLinkedConfigurationRecorderResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Arn\": {\n                    \"target\": \"com.amazonaws.configservice#AmazonResourceName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the specified configuration recorder.</p>\"\n                    }\n                },\n                \"Name\": {\n                    \"target\": \"com.amazonaws.configservice#RecorderName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the specified configuration recorder.</p>\\n         <p>For service-linked configuration recorders, Config automatically assigns a name that has the prefix \\\"<code>AWSConfigurationRecorderFor</code>\\\" to the new service-linked configuration recorder.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.configservice#PutStoredQuery\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#PutStoredQueryRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.configservice#PutStoredQueryResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#ResourceConcurrentModificationException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#TooManyTagsException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Saves a new query or updates an existing saved query. The <code>QueryName</code> must be unique for a single Amazon Web Services account and a single Amazon Web Services Region.\\n\\t\\t\\tYou can create upto 300 queries in a single Amazon Web Services account and a single Amazon Web Services Region.</p>\\n         <note>\\n            <p>\\n               <b>Tags are added at creation and cannot be updated</b>\\n            </p>\\n            <p>\\n               <code>PutStoredQuery</code> is an idempotent API. Subsequent requests won’t create a duplicate resource if one was already created. If a following request has different <code>tags</code> values,\\n\\t\\t\\tConfig will ignore these differences and treat it as an idempotent request of the previous. In this case, <code>tags</code> will not be updated, even if they are different.</p>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.configservice#PutStoredQueryRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"StoredQuery\": {\n                    \"target\": \"com.amazonaws.configservice#StoredQuery\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of <code>StoredQuery</code> objects. \\n\\t\\t\\tThe mandatory fields are <code>QueryName</code> and <code>Expression</code>.</p>\\n         <note>\\n            <p>When you are creating a query, you must provide a query name and an expression. \\n\\t\\t\\tWhen you are updating a query, you must provide a query name but updating the description is optional.</p>\\n         </note>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.configservice#TagsList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of <code>Tags</code> object.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#PutStoredQueryResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"QueryArn\": {\n                    \"target\": \"com.amazonaws.configservice#QueryArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Amazon Resource Name (ARN) of the query. \\n\\t\\t\\tFor example, arn:partition:service:region:account-id:resource-type/resource-name/resource-id.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.configservice#QueryArn\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 500\n                },\n                \"smithy.api#pattern\": \"^arn:aws[a-z\\\\-]*:config:[a-z\\\\-\\\\d]+:\\\\d+:stored-query/[a-zA-Z0-9-_]+/query-[a-zA-Z\\\\d-_/]+$\"\n            }\n        },\n        \"com.amazonaws.configservice#QueryDescription\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 256\n                },\n                \"smithy.api#pattern\": \"^[\\\\s\\\\S]*$\"\n            }\n        },\n        \"com.amazonaws.configservice#QueryExpression\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 4096\n                },\n                \"smithy.api#pattern\": \"^[\\\\s\\\\S]*$\"\n            }\n        },\n        \"com.amazonaws.configservice#QueryId\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 36\n                },\n                \"smithy.api#pattern\": \"^\\\\S+$\"\n            }\n        },\n        \"com.amazonaws.configservice#QueryInfo\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SelectFields\": {\n                    \"target\": \"com.amazonaws.configservice#FieldInfoList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Returns a <code>FieldInfo</code> object.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Details about the query.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#QueryName\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 64\n                },\n                \"smithy.api#pattern\": \"^[a-zA-Z0-9-_]+$\"\n            }\n        },\n        \"com.amazonaws.configservice#RecorderName\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 256\n                }\n            }\n        },\n        \"com.amazonaws.configservice#RecorderStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"Pending\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Pending\"\n                    }\n                },\n                \"Success\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Success\"\n                    }\n                },\n                \"Failure\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Failure\"\n                    }\n                },\n                \"NotApplicable\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"NotApplicable\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.configservice#RecordingFrequency\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"CONTINUOUS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"CONTINUOUS\"\n                    }\n                },\n                \"DAILY\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DAILY\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.configservice#RecordingGroup\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"allSupported\": {\n                    \"target\": \"com.amazonaws.configservice#AllSupported\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Specifies whether Config records configuration changes for all supported resource types, excluding the global IAM resource types.</p>\\n         <p>If you set this field to <code>true</code>, when Config\\n\\t\\t\\tadds support for a new resource type, Config starts recording resources of that type automatically.</p>\\n         <p>If you set this field to <code>true</code>,\\n\\t\\t\\tyou cannot enumerate specific resource types to record in the <code>resourceTypes</code> field of <a href=\\\"https://docs.aws.amazon.com/config/latest/APIReference/API_RecordingGroup.html\\\">RecordingGroup</a>, or to exclude in the <code>resourceTypes</code> field of <a href=\\\"https://docs.aws.amazon.com/config/latest/APIReference/API_ExclusionByResourceTypes.html\\\">ExclusionByResourceTypes</a>.</p>\\n         <note>\\n            <p>\\n               <b>Region availability</b>\\n            </p>\\n            <p>Check <a href=\\\"https://docs.aws.amazon.com/config/latest/developerguide/what-is-resource-config-coverage.html\\\">Resource Coverage by Region Availability</a>\\n\\t\\t\\t\\tto see if a resource type is supported in the Amazon Web Services Region where you set up Config.</p>\\n         </note>\"\n                    }\n                },\n                \"includeGlobalResourceTypes\": {\n                    \"target\": \"com.amazonaws.configservice#IncludeGlobalResourceTypes\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>This option is a bundle which only applies to the global IAM resource types:\\n\\t\\t\\tIAM users, groups, roles, and customer managed policies. These global IAM resource types can only be recorded\\n\\t\\t\\tby Config in Regions where Config was available before February 2022.\\n\\t\\t\\tYou cannot be record the global IAM resouce types in Regions supported by Config after February 2022. For a list of those Regions,\\n\\t\\t\\tsee <a href=\\\"https://docs.aws.amazon.com/config/latest/developerguide/select-resources.html#select-resources-all\\\">Recording Amazon Web Services Resources | Global Resources</a>.</p>\\n         <important>\\n            <p>\\n               <b>Aurora global clusters are recorded in all enabled Regions</b>\\n            </p>\\n            <p>The <code>AWS::RDS::GlobalCluster</code> resource type will be recorded in all supported Config Regions where the configuration recorder is enabled, even if <code>includeGlobalResourceTypes</code> is set<code>false</code>.\\n\\t\\t\\t\\tThe <code>includeGlobalResourceTypes</code> option is a bundle which only applies to IAM users, groups, roles, and customer managed policies.\\n\\t\\t\\t</p>\\n            <p>If you do not want to record <code>AWS::RDS::GlobalCluster</code> in all enabled Regions, use one of the following recording strategies:</p>\\n            <ol>\\n               <li>\\n                  <p>\\n                     <b>Record all current and future resource types with exclusions</b> (<code>EXCLUSION_BY_RESOURCE_TYPES</code>), or</p>\\n               </li>\\n               <li>\\n                  <p>\\n                     <b>Record specific resource types</b> (<code>INCLUSION_BY_RESOURCE_TYPES</code>).</p>\\n               </li>\\n            </ol>\\n            <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/config/latest/developerguide/select-resources.html#select-resources-all\\\">Selecting Which Resources are Recorded</a> in the <i>Config developer guide</i>.</p>\\n         </important>\\n         <important>\\n            <p>\\n               <b>includeGlobalResourceTypes and the exclusion recording strategy</b>\\n            </p>\\n            <p>The <code>includeGlobalResourceTypes</code> field has no impact on the <code>EXCLUSION_BY_RESOURCE_TYPES</code> recording strategy.\\n\\t\\t\\t\\tThis means that the global IAM resource types (IAM users, groups, roles, and customer managed policies) will\\n\\t\\t\\t\\tnot be automatically added as exclusions for <code>exclusionByResourceTypes</code> when <code>includeGlobalResourceTypes</code> is set to <code>false</code>.</p>\\n            <p>The <code>includeGlobalResourceTypes</code> field should only be used to modify the <code>AllSupported</code> field, as the default for\\n\\t\\t\\t\\tthe <code>AllSupported</code> field is to record configuration changes for all supported resource types excluding the global\\n\\t\\t\\t\\tIAM resource types. To include the global IAM resource types when <code>AllSupported</code> is set to <code>true</code>, make sure to set <code>includeGlobalResourceTypes</code> to <code>true</code>.</p>\\n            <p>To exclude the global IAM resource types for the <code>EXCLUSION_BY_RESOURCE_TYPES</code> recording strategy, you need to manually add them to the <code>resourceTypes</code> field of <code>exclusionByResourceTypes</code>.</p>\\n         </important>\\n         <note>\\n            <p>\\n               <b>Required and optional fields</b>\\n            </p>\\n            <p>Before you set this field to <code>true</code>,\\n\\t\\t\\tset the <code>allSupported</code> field of <a href=\\\"https://docs.aws.amazon.com/config/latest/APIReference/API_RecordingGroup.html\\\">RecordingGroup</a> to\\n\\t\\t\\t<code>true</code>. Optionally, you can set the <code>useOnly</code> field of <a href=\\\"https://docs.aws.amazon.com/config/latest/APIReference/API_RecordingStrategy.html\\\">RecordingStrategy</a> to <code>ALL_SUPPORTED_RESOURCE_TYPES</code>.</p>\\n         </note>\\n         <note>\\n            <p>\\n               <b>Overriding fields</b>\\n            </p>\\n            <p>If you set this field to <code>false</code> but list global IAM resource types in the <code>resourceTypes</code> field of <a href=\\\"https://docs.aws.amazon.com/config/latest/APIReference/API_RecordingGroup.html\\\">RecordingGroup</a>,\\n\\t\\t\\tConfig will still record configuration changes for those specified resource types <i>regardless</i> of if you set the <code>includeGlobalResourceTypes</code> field to false.</p>\\n            <p>If you do not want to record configuration changes to the global IAM resource types (IAM users, groups, roles, and customer managed policies), make sure to not list them in the <code>resourceTypes</code> field\\n\\t\\t\\tin addition to setting the <code>includeGlobalResourceTypes</code> field to false.</p>\\n         </note>\"\n                    }\n                },\n                \"resourceTypes\": {\n                    \"target\": \"com.amazonaws.configservice#ResourceTypeList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A comma-separated list that specifies which resource types Config\\n\\t\\t\\trecords.</p>\\n         <p>For a list of valid <code>resourceTypes</code> values, see the\\n\\t\\t\\t\\t<b>Resource Type Value</b> column in\\n\\t\\t\\t\\t<a href=\\\"https://docs.aws.amazon.com/config/latest/developerguide/resource-config-reference.html#supported-resources\\\">Supported Amazon Web Services resource Types</a> in the <i>Config developer guide</i>.</p>\\n         <note>\\n            <p>\\n               <b>Required and optional fields</b>\\n            </p>\\n            <p>Optionally, you can set the <code>useOnly</code> field of <a href=\\\"https://docs.aws.amazon.com/config/latest/APIReference/API_RecordingStrategy.html\\\">RecordingStrategy</a> to <code>INCLUSION_BY_RESOURCE_TYPES</code>.</p>\\n            <p>To record all configuration changes,\\n\\t\\t\\t\\tset the <code>allSupported</code> field of <a href=\\\"https://docs.aws.amazon.com/config/latest/APIReference/API_RecordingGroup.html\\\">RecordingGroup</a> to\\n\\t\\t\\t\\t<code>true</code>, and either omit this field or don't specify any resource types in this field. If you set the <code>allSupported</code> field to <code>false</code> and specify values for <code>resourceTypes</code>,\\n\\t\\t\\t\\twhen Config adds support for a new type of resource,\\n\\t\\t\\t\\tit will not record resources of that type unless you manually add that type to your recording group.</p>\\n         </note>\\n         <note>\\n            <p>\\n               <b>Region availability</b>\\n            </p>\\n            <p>Before specifying a resource type for Config to track,\\n\\t\\t\\t\\tcheck <a href=\\\"https://docs.aws.amazon.com/config/latest/developerguide/what-is-resource-config-coverage.html\\\">Resource Coverage by Region Availability</a>\\n\\t\\t\\t\\tto see if the resource type is supported in the Amazon Web Services Region where you set up Config.\\n\\t\\t\\t\\tIf a resource type is supported by Config in at least one Region,\\n\\t\\t\\t\\tyou can enable the recording of that resource type in all Regions supported by Config,\\n\\t\\t\\t\\teven if the specified resource type is not supported in the Amazon Web Services Region where you set up Config.</p>\\n         </note>\"\n                    }\n                },\n                \"exclusionByResourceTypes\": {\n                    \"target\": \"com.amazonaws.configservice#ExclusionByResourceTypes\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An object that specifies how Config excludes resource types from being recorded by the configuration recorder.</p>\\n         <note>\\n            <p>\\n               <b>Required fields</b>\\n            </p>\\n            <p>To use this option, you must set the <code>useOnly</code> field of <a href=\\\"https://docs.aws.amazon.com/config/latest/APIReference/API_RecordingStrategy.html\\\">RecordingStrategy</a> to <code>EXCLUSION_BY_RESOURCE_TYPES</code>.</p>\\n         </note>\"\n                    }\n                },\n                \"recordingStrategy\": {\n                    \"target\": \"com.amazonaws.configservice#RecordingStrategy\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An object that specifies the recording strategy for the configuration recorder.</p>\\n         <ul>\\n            <li>\\n               <p>If you set the <code>useOnly</code> field of <a href=\\\"https://docs.aws.amazon.com/config/latest/APIReference/API_RecordingStrategy.html\\\">RecordingStrategy</a> to <code>ALL_SUPPORTED_RESOURCE_TYPES</code>, Config records configuration changes for all supported resource types, excluding the global IAM resource types. You also must set the <code>allSupported</code> field of <a href=\\\"https://docs.aws.amazon.com/config/latest/APIReference/API_RecordingGroup.html\\\">RecordingGroup</a> to <code>true</code>. When Config adds support for a new resource type, Config automatically starts recording resources of that type.</p>\\n            </li>\\n            <li>\\n               <p>If you set the <code>useOnly</code> field of <a href=\\\"https://docs.aws.amazon.com/config/latest/APIReference/API_RecordingStrategy.html\\\">RecordingStrategy</a> to <code>INCLUSION_BY_RESOURCE_TYPES</code>, Config records configuration changes for only the resource types you specify in the <code>resourceTypes</code> field of <a href=\\\"https://docs.aws.amazon.com/config/latest/APIReference/API_RecordingGroup.html\\\">RecordingGroup</a>.</p>\\n            </li>\\n            <li>\\n               <p>If you set the <code>useOnly</code> field of <a href=\\\"https://docs.aws.amazon.com/config/latest/APIReference/API_RecordingStrategy.html\\\">RecordingStrategy</a> to <code>EXCLUSION_BY_RESOURCE_TYPES</code>, Config records configuration changes for all supported resource types\\n\\t\\t\\t\\texcept the resource types that you specify to exclude from being recorded in the <code>resourceTypes</code> field of <a href=\\\"https://docs.aws.amazon.com/config/latest/APIReference/API_ExclusionByResourceTypes.html\\\">ExclusionByResourceTypes</a>.</p>\\n            </li>\\n         </ul>\\n         <note>\\n            <p>\\n               <b>Required and optional fields</b>\\n            </p>\\n            <p>The <code>recordingStrategy</code> field is optional when you set the\\n\\t\\t\\t<code>allSupported</code> field of <a href=\\\"https://docs.aws.amazon.com/config/latest/APIReference/API_RecordingGroup.html\\\">RecordingGroup</a> to <code>true</code>.</p>\\n            <p>The <code>recordingStrategy</code> field is optional when you list resource types in the\\n\\t\\t\\t\\t<code>resourceTypes</code> field of <a href=\\\"https://docs.aws.amazon.com/config/latest/APIReference/API_RecordingGroup.html\\\">RecordingGroup</a>.</p>\\n            <p>The <code>recordingStrategy</code> field is required if you list resource types to exclude from recording in the <code>resourceTypes</code> field of <a href=\\\"https://docs.aws.amazon.com/config/latest/APIReference/API_ExclusionByResourceTypes.html\\\">ExclusionByResourceTypes</a>.</p>\\n         </note>\\n         <note>\\n            <p>\\n               <b>Overriding fields</b>\\n            </p>\\n            <p>If you choose <code>EXCLUSION_BY_RESOURCE_TYPES</code> for the recording strategy, the <code>exclusionByResourceTypes</code> field will override other properties in the request.</p>\\n            <p>For example, even if you set <code>includeGlobalResourceTypes</code> to false, global IAM resource types will still be automatically\\n\\t\\t\\trecorded in this option unless those resource types are specifically listed as exclusions in the <code>resourceTypes</code> field of <code>exclusionByResourceTypes</code>.</p>\\n         </note>\\n         <note>\\n            <p>\\n               <b>Global resources types and the resource exclusion recording strategy</b>\\n            </p>\\n            <p>By default, if you choose the <code>EXCLUSION_BY_RESOURCE_TYPES</code> recording strategy,\\n\\t\\t\\twhen Config adds support for a new resource type in the Region where you set up the configuration recorder, including global resource types,\\n\\t\\t\\tConfig starts recording resources of that type automatically.</p>\\n            <p>Unless specifically listed as exclusions,\\n\\t\\t\\t\\t<code>AWS::RDS::GlobalCluster</code> will be recorded automatically in all supported Config Regions were the configuration recorder is enabled.</p>\\n            <p>IAM users, groups, roles, and customer managed policies will be recorded in the Region where you set up the configuration recorder if that is a Region where Config  was available before February 2022.\\n\\t\\t\\t\\tYou cannot be record the global IAM resouce types in Regions supported by Config after February 2022. For a list of those Regions,\\n\\t\\t\\t\\tsee <a href=\\\"https://docs.aws.amazon.com/config/latest/developerguide/select-resources.html#select-resources-all\\\">Recording Amazon Web Services Resources | Global Resources</a>.</p>\\n         </note>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Specifies which resource types Config\\n\\t\\t\\trecords for configuration changes. By default, Config records configuration changes for all current and future supported resource types in the Amazon Web Services Region where you have enabled Config,\\n\\t\\t\\texcluding the global IAM resource types: IAM users, groups, roles, and customer managed policies.</p>\\n         <p>In the recording group, you specify whether you want to record all supported current and future supported resource types or to include or exclude specific resources types.\\n\\t\\t\\tFor a list of supported resource types, see <a href=\\\"https://docs.aws.amazon.com/config/latest/developerguide/resource-config-reference.html#supported-resources\\\">Supported Resource Types</a> in the <i>Config developer guide</i>.</p>\\n         <p>If you don't want Config to record all current and future supported resource types (excluding the global IAM resource types), use one of the following recording strategies:</p>\\n         <ol>\\n            <li>\\n               <p>\\n                  <b>Record all current and future resource types with exclusions</b> (<code>EXCLUSION_BY_RESOURCE_TYPES</code>), or</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>Record specific resource types</b> (<code>INCLUSION_BY_RESOURCE_TYPES</code>).</p>\\n            </li>\\n         </ol>\\n         <p>If you use the recording strategy to <b>Record all current and future resource types</b> (<code>ALL_SUPPORTED_RESOURCE_TYPES</code>),\\n\\t\\t\\tyou can use the flag <code>includeGlobalResourceTypes</code> to include the global IAM resource types in your recording.</p>\\n         <important>\\n            <p>\\n               <b>Aurora global clusters are recorded in all enabled Regions</b>\\n            </p>\\n            <p>The <code>AWS::RDS::GlobalCluster</code> resource type\\n\\t\\t\\t\\twill be recorded in all supported Config Regions where the configuration recorder is enabled.</p>\\n            <p>If you do not want to record <code>AWS::RDS::GlobalCluster</code> in all enabled Regions, use the <code>EXCLUSION_BY_RESOURCE_TYPES</code> or <code>INCLUSION_BY_RESOURCE_TYPES</code> recording strategy.</p>\\n         </important>\"\n            }\n        },\n        \"com.amazonaws.configservice#RecordingMode\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"recordingFrequency\": {\n                    \"target\": \"com.amazonaws.configservice#RecordingFrequency\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The default recording frequency that Config uses to record configuration changes.</p>\\n         <important>\\n            <p>Daily recording cannot be specified for the following resource types:</p>\\n            <ul>\\n               <li>\\n                  <p>\\n                     <code>AWS::Config::ResourceCompliance</code>\\n                  </p>\\n               </li>\\n               <li>\\n                  <p>\\n                     <code>AWS::Config::ConformancePackCompliance</code>\\n                  </p>\\n               </li>\\n               <li>\\n                  <p>\\n                     <code>AWS::Config::ConfigurationRecorder</code>\\n                  </p>\\n               </li>\\n            </ul>\\n            <p>For the <b>allSupported</b> (<code>ALL_SUPPORTED_RESOURCE_TYPES</code>) recording strategy, these resource types will be set to Continuous recording.</p>\\n         </important>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"recordingModeOverrides\": {\n                    \"target\": \"com.amazonaws.configservice#RecordingModeOverrides\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An array of <code>recordingModeOverride</code> objects for you to specify your overrides for the recording mode.\\n\\t\\t\\tThe <code>recordingModeOverride</code> object in the <code>recordingModeOverrides</code> array consists of three fields: a <code>description</code>, the new <code>recordingFrequency</code>, and an array of <code>resourceTypes</code> to override.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Specifies the default recording frequency that Config uses to record configuration changes.\\n\\t\\t\\t\\n\\t\\t\\tConfig supports <i>Continuous recording</i> and <i>Daily recording</i>.</p>\\n         <ul>\\n            <li>\\n               <p>Continuous recording allows you to record configuration changes continuously whenever a change occurs.</p>\\n            </li>\\n            <li>\\n               <p>Daily recording allows you to receive a configuration item (CI) representing the most recent state of your resources over the last 24-hour period, only if it’s different from the previous CI recorded.\\n\\t\\t\\t</p>\\n            </li>\\n         </ul>\\n         <note>\\n            <p>Firewall Manager depends on continuous recording to monitor your resources. If you are using Firewall Manager,\\n\\t\\t\\tit is recommended that you set the recording frequency to Continuous.</p>\\n         </note>\\n         <p>You can also override the recording frequency for specific resource types.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#RecordingModeOverride\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"description\": {\n                    \"target\": \"com.amazonaws.configservice#Description\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A description that you provide for the override.</p>\"\n                    }\n                },\n                \"resourceTypes\": {\n                    \"target\": \"com.amazonaws.configservice#RecordingModeResourceTypesList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A comma-separated list that specifies which resource types Config\\n\\t\\t\\tincludes in the override.</p>\\n         <important>\\n            <p>Daily recording cannot be specified for the following resource types:</p>\\n            <ul>\\n               <li>\\n                  <p>\\n                     <code>AWS::Config::ResourceCompliance</code>\\n                  </p>\\n               </li>\\n               <li>\\n                  <p>\\n                     <code>AWS::Config::ConformancePackCompliance</code>\\n                  </p>\\n               </li>\\n               <li>\\n                  <p>\\n                     <code>AWS::Config::ConfigurationRecorder</code>\\n                  </p>\\n               </li>\\n            </ul>\\n         </important>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"recordingFrequency\": {\n                    \"target\": \"com.amazonaws.configservice#RecordingFrequency\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The recording frequency that will be applied to all the resource types specified in the override.</p>\\n         <ul>\\n            <li>\\n               <p>Continuous recording allows you to record configuration changes continuously whenever a change occurs.</p>\\n            </li>\\n            <li>\\n               <p>Daily recording allows you to receive a configuration item (CI) representing the most recent state of your resources over the last 24-hour period, only if it’s different from the previous CI recorded.\\n\\t\\t\\t</p>\\n            </li>\\n         </ul>\\n         <note>\\n            <p>Firewall Manager depends on continuous recording to monitor your resources. If you are using Firewall Manager,\\n\\t\\t\\tit is recommended that you set the recording frequency to Continuous.</p>\\n         </note>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>An object for you to specify your overrides for the recording mode.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#RecordingModeOverrides\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#RecordingModeOverride\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 1\n                }\n            }\n        },\n        \"com.amazonaws.configservice#RecordingModeResourceTypesList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#ResourceType\"\n            }\n        },\n        \"com.amazonaws.configservice#RecordingScope\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"INTERNAL\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"INTERNAL\"\n                    }\n                },\n                \"PAID\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"PAID\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.configservice#RecordingStrategy\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"useOnly\": {\n                    \"target\": \"com.amazonaws.configservice#RecordingStrategyType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The recording strategy for the configuration recorder.</p>\\n         <ul>\\n            <li>\\n               <p>If you set this option to <code>ALL_SUPPORTED_RESOURCE_TYPES</code>, Config records configuration changes for all supported resource types, excluding the global IAM resource types.\\n\\t\\t\\t\\tYou also must set the <code>allSupported</code> field of <a href=\\\"https://docs.aws.amazon.com/config/latest/APIReference/API_RecordingGroup.html\\\">RecordingGroup</a> to <code>true</code>.\\n\\t\\t\\t\\tWhen Config adds support for a new resource type, Config automatically starts recording resources of that type. For a list of supported resource types,\\n\\t\\t\\t\\tsee <a href=\\\"https://docs.aws.amazon.com/config/latest/developerguide/resource-config-reference.html#supported-resources\\\">Supported Resource Types</a> in the <i>Config developer guide</i>.</p>\\n            </li>\\n            <li>\\n               <p>If you set this option to <code>INCLUSION_BY_RESOURCE_TYPES</code>, Config records\\n\\t\\t\\t\\t\\tconfiguration changes for only the resource types that you specify in the\\n\\t\\t\\t\\t\\t\\t<code>resourceTypes</code> field of <a href=\\\"https://docs.aws.amazon.com/config/latest/APIReference/API_RecordingGroup.html\\\">RecordingGroup</a>.</p>\\n            </li>\\n            <li>\\n               <p>If you set this option to <code>EXCLUSION_BY_RESOURCE_TYPES</code>, Config records\\n\\t\\t\\t\\t\\tconfiguration changes for all supported resource types, except the resource\\n\\t\\t\\t\\t\\ttypes that you specify to exclude from being recorded in the\\n\\t\\t\\t\\t\\t\\t<code>resourceTypes</code> field of <a href=\\\"https://docs.aws.amazon.com/config/latest/APIReference/API_ExclusionByResourceTypes.html\\\">ExclusionByResourceTypes</a>.</p>\\n            </li>\\n         </ul>\\n         <note>\\n            <p>\\n               <b>Required and optional fields</b>\\n            </p>\\n            <p>The <code>recordingStrategy</code> field is optional when you set the\\n\\t\\t\\t<code>allSupported</code> field of <a href=\\\"https://docs.aws.amazon.com/config/latest/APIReference/API_RecordingGroup.html\\\">RecordingGroup</a> to <code>true</code>.</p>\\n            <p>The <code>recordingStrategy</code> field is optional when you list resource types in the\\n\\t\\t\\t\\t<code>resourceTypes</code> field of <a href=\\\"https://docs.aws.amazon.com/config/latest/APIReference/API_RecordingGroup.html\\\">RecordingGroup</a>.</p>\\n            <p>The <code>recordingStrategy</code> field is required if you list resource types to exclude from recording in the <code>resourceTypes</code> field of <a href=\\\"https://docs.aws.amazon.com/config/latest/APIReference/API_ExclusionByResourceTypes.html\\\">ExclusionByResourceTypes</a>.</p>\\n         </note>\\n         <note>\\n            <p>\\n               <b>Overriding fields</b>\\n            </p>\\n            <p>If you choose <code>EXCLUSION_BY_RESOURCE_TYPES</code> for the recording strategy, the <code>exclusionByResourceTypes</code> field will override other properties in the request.</p>\\n            <p>For example, even if you set <code>includeGlobalResourceTypes</code> to false, global IAM resource types will still be automatically\\n\\t\\t\\trecorded in this option unless those resource types are specifically listed as exclusions in the <code>resourceTypes</code> field of <code>exclusionByResourceTypes</code>.</p>\\n         </note>\\n         <note>\\n            <p>\\n               <b>Global resource types and the exclusion recording strategy</b>\\n            </p>\\n            <p>By default, if you choose the <code>EXCLUSION_BY_RESOURCE_TYPES</code> recording strategy,\\n\\t\\t\\t\\twhen Config adds support for a new resource type in the Region where you set up the configuration recorder, including global resource types,\\n\\t\\t\\t\\tConfig starts recording resources of that type automatically.</p>\\n            <p>Unless specifically listed as exclusions,\\n\\t\\t\\t\\t<code>AWS::RDS::GlobalCluster</code> will be recorded automatically in all supported Config Regions were the configuration recorder is enabled.</p>\\n            <p>IAM users, groups, roles, and customer managed policies will be recorded in the Region where you set up the configuration recorder if that is a Region where Config was available before February 2022.\\n\\t\\t\\t\\tYou cannot be record the global IAM resouce types in Regions supported by Config after February 2022. This list where you cannot record the global IAM resource types includes the following Regions:</p>\\n            <ul>\\n               <li>\\n                  <p>Asia Pacific (Hyderabad)</p>\\n               </li>\\n               <li>\\n                  <p>Asia Pacific (Melbourne)</p>\\n               </li>\\n               <li>\\n                  <p>Canada West (Calgary)</p>\\n               </li>\\n               <li>\\n                  <p>Europe (Spain)</p>\\n               </li>\\n               <li>\\n                  <p>Europe (Zurich)</p>\\n               </li>\\n               <li>\\n                  <p>Israel (Tel Aviv)</p>\\n               </li>\\n               <li>\\n                  <p>Middle East (UAE)</p>\\n               </li>\\n            </ul>\\n         </note>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Specifies the recording strategy of the configuration recorder.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#RecordingStrategyType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ALL_SUPPORTED_RESOURCE_TYPES\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ALL_SUPPORTED_RESOURCE_TYPES\"\n                    }\n                },\n                \"INCLUSION_BY_RESOURCE_TYPES\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"INCLUSION_BY_RESOURCE_TYPES\"\n                    }\n                },\n                \"EXCLUSION_BY_RESOURCE_TYPES\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"EXCLUSION_BY_RESOURCE_TYPES\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.configservice#ReevaluateConfigRuleNames\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#ConfigRuleName\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 25\n                }\n            }\n        },\n        \"com.amazonaws.configservice#RelatedEvent\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.configservice#RelatedEventList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#RelatedEvent\"\n            }\n        },\n        \"com.amazonaws.configservice#Relationship\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"resourceType\": {\n                    \"target\": \"com.amazonaws.configservice#ResourceType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The resource type of the related resource.</p>\"\n                    }\n                },\n                \"resourceId\": {\n                    \"target\": \"com.amazonaws.configservice#ResourceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the related resource (for example,\\n\\t\\t\\t\\t<code>sg-xxxxxx</code>).</p>\"\n                    }\n                },\n                \"resourceName\": {\n                    \"target\": \"com.amazonaws.configservice#ResourceName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The custom name of the related resource, if\\n\\t\\t\\tavailable.</p>\"\n                    }\n                },\n                \"relationshipName\": {\n                    \"target\": \"com.amazonaws.configservice#RelationshipName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of relationship with the related resource.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The relationship of the related resource to the main\\n\\t\\t\\tresource.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#RelationshipList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#Relationship\"\n            }\n        },\n        \"com.amazonaws.configservice#RelationshipName\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.configservice#RemediationConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConfigRuleName\": {\n                    \"target\": \"com.amazonaws.configservice#ConfigRuleName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the Config rule.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TargetType\": {\n                    \"target\": \"com.amazonaws.configservice#RemediationTargetType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of the target. Target executes remediation. For example, SSM document.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TargetId\": {\n                    \"target\": \"com.amazonaws.configservice#StringWithCharLimit256\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Target ID is the name of the SSM document.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TargetVersion\": {\n                    \"target\": \"com.amazonaws.configservice#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Version of the target. For example, version of the SSM document.</p>\\n         <note>\\n            <p>If you make backward incompatible changes to the SSM document, \\n\\t\\t\\tyou must call PutRemediationConfiguration API again to ensure the remediations can run.</p>\\n         </note>\"\n                    }\n                },\n                \"Parameters\": {\n                    \"target\": \"com.amazonaws.configservice#RemediationParameters\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An object of the RemediationParameterValue.</p>\"\n                    }\n                },\n                \"ResourceType\": {\n                    \"target\": \"com.amazonaws.configservice#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of a resource. </p>\"\n                    }\n                },\n                \"Automatic\": {\n                    \"target\": \"com.amazonaws.configservice#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>The remediation is triggered automatically.</p>\"\n                    }\n                },\n                \"ExecutionControls\": {\n                    \"target\": \"com.amazonaws.configservice#ExecutionControls\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An ExecutionControls object.</p>\"\n                    }\n                },\n                \"MaximumAutomaticAttempts\": {\n                    \"target\": \"com.amazonaws.configservice#AutoRemediationAttempts\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of failed attempts for auto-remediation. If you do not select a number, the default is 5.</p>\\n         <p>For example, if you specify MaximumAutomaticAttempts as 5 with RetryAttemptSeconds as 50 seconds, \\n\\t\\t\\t\\n\\t\\t\\tConfig will put a RemediationException on your behalf for the failing resource after the 5th failed attempt within 50 seconds.</p>\"\n                    }\n                },\n                \"RetryAttemptSeconds\": {\n                    \"target\": \"com.amazonaws.configservice#AutoRemediationAttemptSeconds\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Time window to determine whether or not to add a remediation exception to prevent infinite remediation attempts.\\n\\t\\t\\tIf <code>MaximumAutomaticAttempts</code> remediation attempts have been made under <code>RetryAttemptSeconds</code>, a remediation exception will be added to the resource.\\n\\t\\t\\tIf you do not select a number, the default is 60 seconds.\\n\\t\\t</p>\\n         <p>For example, if you specify <code>RetryAttemptSeconds</code> as 50 seconds and <code>MaximumAutomaticAttempts</code> as 5, \\n\\t\\t\\tConfig will run auto-remediations 5 times within 50 seconds before adding a remediation exception to the resource.</p>\"\n                    }\n                },\n                \"Arn\": {\n                    \"target\": \"com.amazonaws.configservice#StringWithCharLimit1024\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Amazon Resource Name (ARN) of remediation configuration.</p>\"\n                    }\n                },\n                \"CreatedByService\": {\n                    \"target\": \"com.amazonaws.configservice#StringWithCharLimit1024\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Name of the service that owns the service-linked rule, if applicable.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>An object that represents the details about the remediation configuration that includes the remediation action, parameters, and data to execute the action.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#RemediationConfigurations\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#RemediationConfiguration\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 25\n                }\n            }\n        },\n        \"com.amazonaws.configservice#RemediationException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConfigRuleName\": {\n                    \"target\": \"com.amazonaws.configservice#ConfigRuleName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the Config rule.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ResourceType\": {\n                    \"target\": \"com.amazonaws.configservice#StringWithCharLimit256\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of a resource.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ResourceId\": {\n                    \"target\": \"com.amazonaws.configservice#StringWithCharLimit1024\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the resource (for example., sg-xxxxxx).</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Message\": {\n                    \"target\": \"com.amazonaws.configservice#StringWithCharLimit1024\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An explanation of an remediation exception.</p>\"\n                    }\n                },\n                \"ExpirationTime\": {\n                    \"target\": \"com.amazonaws.configservice#Date\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time when the remediation exception will be deleted.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>An object that represents the details about the remediation exception. The details include the rule name, an explanation of an exception, the time when the exception will be deleted, the resource ID, and resource type. </p>\"\n            }\n        },\n        \"com.amazonaws.configservice#RemediationExceptionResourceKey\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ResourceType\": {\n                    \"target\": \"com.amazonaws.configservice#StringWithCharLimit256\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of a resource.</p>\"\n                    }\n                },\n                \"ResourceId\": {\n                    \"target\": \"com.amazonaws.configservice#StringWithCharLimit1024\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the resource (for example., sg-xxxxxx).</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The details that identify a resource within Config, including the resource type and resource ID. </p>\"\n            }\n        },\n        \"com.amazonaws.configservice#RemediationExceptionResourceKeys\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#RemediationExceptionResourceKey\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 100\n                }\n            }\n        },\n        \"com.amazonaws.configservice#RemediationExceptions\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#RemediationException\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 25\n                }\n            }\n        },\n        \"com.amazonaws.configservice#RemediationExecutionState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"QUEUED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"QUEUED\"\n                    }\n                },\n                \"IN_PROGRESS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"IN_PROGRESS\"\n                    }\n                },\n                \"SUCCEEDED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"SUCCEEDED\"\n                    }\n                },\n                \"FAILED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"FAILED\"\n                    }\n                },\n                \"UNKNOWN\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"UNKNOWN\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.configservice#RemediationExecutionStatus\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ResourceKey\": {\n                    \"target\": \"com.amazonaws.configservice#ResourceKey\"\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.configservice#RemediationExecutionState\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>ENUM of the values.</p>\"\n                    }\n                },\n                \"StepDetails\": {\n                    \"target\": \"com.amazonaws.configservice#RemediationExecutionSteps\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Details of every step.</p>\"\n                    }\n                },\n                \"InvocationTime\": {\n                    \"target\": \"com.amazonaws.configservice#Date\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Start time when the remediation was executed.</p>\"\n                    }\n                },\n                \"LastUpdatedTime\": {\n                    \"target\": \"com.amazonaws.configservice#Date\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time when the remediation execution was last updated.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Provides details of the current status of the invoked remediation action for that resource.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#RemediationExecutionStatuses\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#RemediationExecutionStatus\"\n            }\n        },\n        \"com.amazonaws.configservice#RemediationExecutionStep\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Name\": {\n                    \"target\": \"com.amazonaws.configservice#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The details of the step.</p>\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.configservice#RemediationExecutionStepState\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The valid status of the step.</p>\"\n                    }\n                },\n                \"ErrorMessage\": {\n                    \"target\": \"com.amazonaws.configservice#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An error message if the step was interrupted during execution.</p>\"\n                    }\n                },\n                \"StartTime\": {\n                    \"target\": \"com.amazonaws.configservice#Date\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time when the step started.</p>\"\n                    }\n                },\n                \"StopTime\": {\n                    \"target\": \"com.amazonaws.configservice#Date\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time when the step stopped.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Name of the step from the SSM document.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#RemediationExecutionStepState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"SUCCEEDED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"SUCCEEDED\"\n                    }\n                },\n                \"PENDING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"PENDING\"\n                    }\n                },\n                \"FAILED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"FAILED\"\n                    }\n                },\n                \"IN_PROGRESS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"IN_PROGRESS\"\n                    }\n                },\n                \"EXITED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"EXITED\"\n                    }\n                },\n                \"UNKNOWN\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"UNKNOWN\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.configservice#RemediationExecutionSteps\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#RemediationExecutionStep\"\n            }\n        },\n        \"com.amazonaws.configservice#RemediationInProgressException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.configservice#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Error executing the command</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Remediation action is in progress. You can either cancel execution in Amazon Web Services Systems Manager or wait and try again later. </p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.configservice#RemediationParameterValue\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ResourceValue\": {\n                    \"target\": \"com.amazonaws.configservice#ResourceValue\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The value is dynamic and changes at run-time.</p>\"\n                    }\n                },\n                \"StaticValue\": {\n                    \"target\": \"com.amazonaws.configservice#StaticValue\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The value is static and does not change at run-time.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The value is either a dynamic (resource) value or a static value. You must select either a dynamic value or a static value.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#RemediationParameters\": {\n            \"type\": \"map\",\n            \"key\": {\n                \"target\": \"com.amazonaws.configservice#StringWithCharLimit256\"\n            },\n            \"value\": {\n                \"target\": \"com.amazonaws.configservice#RemediationParameterValue\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 25\n                }\n            }\n        },\n        \"com.amazonaws.configservice#RemediationTargetType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"SSM_DOCUMENT\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"SSM_DOCUMENT\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.configservice#ResourceConcurrentModificationException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.configservice#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Two users are trying to modify the same query at the same time. Wait for a moment and try again.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.configservice#ResourceConfiguration\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 51200\n                }\n            }\n        },\n        \"com.amazonaws.configservice#ResourceConfigurationSchemaType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"CFN_RESOURCE_SCHEMA\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"CFN_RESOURCE_SCHEMA\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.configservice#ResourceCount\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"resourceType\": {\n                    \"target\": \"com.amazonaws.configservice#ResourceType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The resource type (for example,\\n\\t\\t\\t\\t<code>\\\"AWS::EC2::Instance\\\"</code>).</p>\"\n                    }\n                },\n                \"count\": {\n                    \"target\": \"com.amazonaws.configservice#Long\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The number of resources.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>An object that contains the resource type and the number of\\n\\t\\t\\tresources.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#ResourceCountFilters\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ResourceType\": {\n                    \"target\": \"com.amazonaws.configservice#ResourceType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of the Amazon Web Services resource.</p>\"\n                    }\n                },\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.configservice#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The 12-digit ID of the account.</p>\"\n                    }\n                },\n                \"Region\": {\n                    \"target\": \"com.amazonaws.configservice#AwsRegion\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The region where the account is located.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Filters the resource count based on account ID, region, and resource type.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#ResourceCountGroupKey\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"RESOURCE_TYPE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"RESOURCE_TYPE\"\n                    }\n                },\n                \"ACCOUNT_ID\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ACCOUNT_ID\"\n                    }\n                },\n                \"AWS_REGION\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS_REGION\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.configservice#ResourceCounts\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#ResourceCount\"\n            }\n        },\n        \"com.amazonaws.configservice#ResourceCreationTime\": {\n            \"type\": \"timestamp\"\n        },\n        \"com.amazonaws.configservice#ResourceDeletionTime\": {\n            \"type\": \"timestamp\"\n        },\n        \"com.amazonaws.configservice#ResourceDetails\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ResourceId\": {\n                    \"target\": \"com.amazonaws.configservice#BaseResourceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A unique resource ID for an evaluation.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ResourceType\": {\n                    \"target\": \"com.amazonaws.configservice#StringWithCharLimit256\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of resource being evaluated.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ResourceConfiguration\": {\n                    \"target\": \"com.amazonaws.configservice#ResourceConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The resource definition to be evaluated as per the resource configuration schema type.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ResourceConfigurationSchemaType\": {\n                    \"target\": \"com.amazonaws.configservice#ResourceConfigurationSchemaType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The schema type of the resource configuration.</p>\\n         <note>\\n            <p>You can find the\\n\\t\\t\\t<a href=\\\"https://docs.aws.amazon.com/cloudformation-cli/latest/userguide/resource-type-schema.html\\\">Resource type schema</a>, or <code>CFN_RESOURCE_SCHEMA</code>, in \\\"<i>Amazon Web Services public extensions</i>\\\" within the CloudFormation registry or with the following CLI commmand:\\n\\t\\t\\t<code>aws cloudformation describe-type --type-name \\\"AWS::S3::Bucket\\\" --type RESOURCE</code>.</p>\\n            <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/registry.html#registry-view\\\">Managing extensions through the CloudFormation registry</a>\\n\\t\\t\\t\\tand <a href=\\\"https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-template-resource-type-ref.html\\\">Amazon Web Services resource and property types reference</a> in the CloudFormation User Guide.</p>\\n         </note>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns information about the resource being evaluated.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#ResourceEvaluation\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ResourceEvaluationId\": {\n                    \"target\": \"com.amazonaws.configservice#ResourceEvaluationId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ResourceEvaluationId of a evaluation.</p>\"\n                    }\n                },\n                \"EvaluationMode\": {\n                    \"target\": \"com.amazonaws.configservice#EvaluationMode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The mode of an evaluation. The valid values are Detective or Proactive.</p>\"\n                    }\n                },\n                \"EvaluationStartTimestamp\": {\n                    \"target\": \"com.amazonaws.configservice#Date\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The starting time of an execution.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns details of a resource evaluation.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#ResourceEvaluationFilters\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"EvaluationMode\": {\n                    \"target\": \"com.amazonaws.configservice#EvaluationMode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Filters all resource evaluations results based on an evaluation mode.</p>\\n         <important>\\n            <p>Currently, <code>DECTECTIVE</code> is not supported as a valid value. Ignore other documentation stating otherwise.</p>\\n         </important>\"\n                    }\n                },\n                \"TimeWindow\": {\n                    \"target\": \"com.amazonaws.configservice#TimeWindow\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Returns a <code>TimeWindow</code> object.</p>\"\n                    }\n                },\n                \"EvaluationContextIdentifier\": {\n                    \"target\": \"com.amazonaws.configservice#EvaluationContextIdentifier\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Filters evaluations for a given infrastructure deployment. For example: CFN Stack.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns details of a resource evaluation based on the selected filter.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#ResourceEvaluationId\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 128\n                }\n            }\n        },\n        \"com.amazonaws.configservice#ResourceEvaluationStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"IN_PROGRESS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"IN_PROGRESS\"\n                    }\n                },\n                \"FAILED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"FAILED\"\n                    }\n                },\n                \"SUCCEEDED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"SUCCEEDED\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.configservice#ResourceEvaluations\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#ResourceEvaluation\"\n            }\n        },\n        \"com.amazonaws.configservice#ResourceFilters\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.configservice#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The 12-digit source account ID.</p>\"\n                    }\n                },\n                \"ResourceId\": {\n                    \"target\": \"com.amazonaws.configservice#ResourceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the resource.</p>\"\n                    }\n                },\n                \"ResourceName\": {\n                    \"target\": \"com.amazonaws.configservice#ResourceName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the resource.</p>\"\n                    }\n                },\n                \"Region\": {\n                    \"target\": \"com.amazonaws.configservice#AwsRegion\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The source region.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Filters the results by resource account ID, region, resource ID, and resource name.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#ResourceId\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 768\n                }\n            }\n        },\n        \"com.amazonaws.configservice#ResourceIdList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#ResourceId\"\n            }\n        },\n        \"com.amazonaws.configservice#ResourceIdentifier\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"resourceType\": {\n                    \"target\": \"com.amazonaws.configservice#ResourceType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of resource.</p>\"\n                    }\n                },\n                \"resourceId\": {\n                    \"target\": \"com.amazonaws.configservice#ResourceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the resource (for example,\\n\\t\\t\\t<code>sg-xxxxxx</code>).</p>\"\n                    }\n                },\n                \"resourceName\": {\n                    \"target\": \"com.amazonaws.configservice#ResourceName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The custom name of the resource (if available).</p>\"\n                    }\n                },\n                \"resourceDeletionTime\": {\n                    \"target\": \"com.amazonaws.configservice#ResourceDeletionTime\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time that the resource was deleted.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The details that identify a resource that is discovered by Config, including the resource type, ID, and (if available) the\\n\\t\\t\\tcustom resource name.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#ResourceIdentifierList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#ResourceIdentifier\"\n            }\n        },\n        \"com.amazonaws.configservice#ResourceIdentifiersList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#AggregateResourceIdentifier\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 100\n                }\n            }\n        },\n        \"com.amazonaws.configservice#ResourceInUseException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.configservice#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Error executing the command</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>You see this exception in the following cases: </p>\\n         <ul>\\n            <li>\\n               <p>For DeleteConfigRule, Config is deleting this rule. Try your request again later.</p>\\n            </li>\\n            <li>\\n               <p>For DeleteConfigRule, the rule is deleting your evaluation results. Try your request again later.</p>\\n            </li>\\n            <li>\\n               <p>For DeleteConfigRule, a remediation action is associated with the rule and Config cannot delete this rule. Delete the remediation action associated with the rule before deleting the rule and try your request again later.</p>\\n            </li>\\n            <li>\\n               <p>For PutConfigOrganizationRule, organization Config rule deletion is in progress. Try your request again later.</p>\\n            </li>\\n            <li>\\n               <p>For DeleteOrganizationConfigRule, organization Config rule creation is in progress. Try your request again later.</p>\\n            </li>\\n            <li>\\n               <p>For PutConformancePack and PutOrganizationConformancePack, a conformance pack creation, update, and deletion is in progress. Try your request again later.</p>\\n            </li>\\n            <li>\\n               <p>For DeleteConformancePack, a conformance pack creation, update, and deletion is in progress. Try your request again later.</p>\\n            </li>\\n         </ul>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.configservice#ResourceKey\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"resourceType\": {\n                    \"target\": \"com.amazonaws.configservice#ResourceType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The resource type.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"resourceId\": {\n                    \"target\": \"com.amazonaws.configservice#ResourceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the resource (for example., sg-xxxxxx). </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The details that identify a resource within Config, including\\n\\t\\t\\tthe resource type and resource ID.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#ResourceKeys\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#ResourceKey\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 100\n                }\n            }\n        },\n        \"com.amazonaws.configservice#ResourceName\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.configservice#ResourceNotDiscoveredException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.configservice#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Error executing the command</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>You have specified a resource that is either unknown or has not\\n\\t\\t\\tbeen discovered.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.configservice#ResourceNotFoundException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.configservice#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Error executing the command</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>You have specified a resource that does not exist.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.configservice#ResourceType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"CustomerGateway\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::EC2::CustomerGateway\"\n                    }\n                },\n                \"EIP\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::EC2::EIP\"\n                    }\n                },\n                \"Host\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::EC2::Host\"\n                    }\n                },\n                \"Instance\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::EC2::Instance\"\n                    }\n                },\n                \"InternetGateway\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::EC2::InternetGateway\"\n                    }\n                },\n                \"NetworkAcl\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::EC2::NetworkAcl\"\n                    }\n                },\n                \"NetworkInterface\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::EC2::NetworkInterface\"\n                    }\n                },\n                \"RouteTable\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::EC2::RouteTable\"\n                    }\n                },\n                \"SecurityGroup\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::EC2::SecurityGroup\"\n                    }\n                },\n                \"Subnet\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::EC2::Subnet\"\n                    }\n                },\n                \"Trail\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::CloudTrail::Trail\"\n                    }\n                },\n                \"Volume\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::EC2::Volume\"\n                    }\n                },\n                \"VPC\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::EC2::VPC\"\n                    }\n                },\n                \"VPNConnection\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::EC2::VPNConnection\"\n                    }\n                },\n                \"VPNGateway\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::EC2::VPNGateway\"\n                    }\n                },\n                \"RegisteredHAInstance\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::EC2::RegisteredHAInstance\"\n                    }\n                },\n                \"NatGateway\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::EC2::NatGateway\"\n                    }\n                },\n                \"EgressOnlyInternetGateway\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::EC2::EgressOnlyInternetGateway\"\n                    }\n                },\n                \"VPCEndpoint\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::EC2::VPCEndpoint\"\n                    }\n                },\n                \"VPCEndpointService\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::EC2::VPCEndpointService\"\n                    }\n                },\n                \"FlowLog\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::EC2::FlowLog\"\n                    }\n                },\n                \"VPCPeeringConnection\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::EC2::VPCPeeringConnection\"\n                    }\n                },\n                \"Domain\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Elasticsearch::Domain\"\n                    }\n                },\n                \"Group\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::IAM::Group\"\n                    }\n                },\n                \"Policy\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::IAM::Policy\"\n                    }\n                },\n                \"Role\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::IAM::Role\"\n                    }\n                },\n                \"User\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::IAM::User\"\n                    }\n                },\n                \"LoadBalancerV2\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::ElasticLoadBalancingV2::LoadBalancer\"\n                    }\n                },\n                \"Certificate\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::ACM::Certificate\"\n                    }\n                },\n                \"DBInstance\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::RDS::DBInstance\"\n                    }\n                },\n                \"DBSubnetGroup\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::RDS::DBSubnetGroup\"\n                    }\n                },\n                \"DBSecurityGroup\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::RDS::DBSecurityGroup\"\n                    }\n                },\n                \"DBSnapshot\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::RDS::DBSnapshot\"\n                    }\n                },\n                \"DBCluster\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::RDS::DBCluster\"\n                    }\n                },\n                \"DBClusterSnapshot\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::RDS::DBClusterSnapshot\"\n                    }\n                },\n                \"EventSubscription\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::RDS::EventSubscription\"\n                    }\n                },\n                \"Bucket\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::S3::Bucket\"\n                    }\n                },\n                \"AccountPublicAccessBlock\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::S3::AccountPublicAccessBlock\"\n                    }\n                },\n                \"Cluster\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Redshift::Cluster\"\n                    }\n                },\n                \"ClusterSnapshot\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Redshift::ClusterSnapshot\"\n                    }\n                },\n                \"ClusterParameterGroup\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Redshift::ClusterParameterGroup\"\n                    }\n                },\n                \"ClusterSecurityGroup\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Redshift::ClusterSecurityGroup\"\n                    }\n                },\n                \"ClusterSubnetGroup\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Redshift::ClusterSubnetGroup\"\n                    }\n                },\n                \"RedshiftEventSubscription\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Redshift::EventSubscription\"\n                    }\n                },\n                \"ManagedInstanceInventory\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::SSM::ManagedInstanceInventory\"\n                    }\n                },\n                \"Alarm\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::CloudWatch::Alarm\"\n                    }\n                },\n                \"Stack\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::CloudFormation::Stack\"\n                    }\n                },\n                \"LoadBalancer\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::ElasticLoadBalancing::LoadBalancer\"\n                    }\n                },\n                \"AutoScalingGroup\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::AutoScaling::AutoScalingGroup\"\n                    }\n                },\n                \"LaunchConfiguration\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::AutoScaling::LaunchConfiguration\"\n                    }\n                },\n                \"ScalingPolicy\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::AutoScaling::ScalingPolicy\"\n                    }\n                },\n                \"ScheduledAction\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::AutoScaling::ScheduledAction\"\n                    }\n                },\n                \"Table\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::DynamoDB::Table\"\n                    }\n                },\n                \"Project\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::CodeBuild::Project\"\n                    }\n                },\n                \"RateBasedRule\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::WAF::RateBasedRule\"\n                    }\n                },\n                \"Rule\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::WAF::Rule\"\n                    }\n                },\n                \"RuleGroup\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::WAF::RuleGroup\"\n                    }\n                },\n                \"WebACL\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::WAF::WebACL\"\n                    }\n                },\n                \"RegionalRateBasedRule\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::WAFRegional::RateBasedRule\"\n                    }\n                },\n                \"RegionalRule\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::WAFRegional::Rule\"\n                    }\n                },\n                \"RegionalRuleGroup\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::WAFRegional::RuleGroup\"\n                    }\n                },\n                \"RegionalWebACL\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::WAFRegional::WebACL\"\n                    }\n                },\n                \"Distribution\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::CloudFront::Distribution\"\n                    }\n                },\n                \"StreamingDistribution\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::CloudFront::StreamingDistribution\"\n                    }\n                },\n                \"Function\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Lambda::Function\"\n                    }\n                },\n                \"NetworkFirewallFirewall\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::NetworkFirewall::Firewall\"\n                    }\n                },\n                \"NetworkFirewallFirewallPolicy\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::NetworkFirewall::FirewallPolicy\"\n                    }\n                },\n                \"NetworkFirewallRuleGroup\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::NetworkFirewall::RuleGroup\"\n                    }\n                },\n                \"Application\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::ElasticBeanstalk::Application\"\n                    }\n                },\n                \"ApplicationVersion\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::ElasticBeanstalk::ApplicationVersion\"\n                    }\n                },\n                \"Environment\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::ElasticBeanstalk::Environment\"\n                    }\n                },\n                \"WebACLV2\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::WAFv2::WebACL\"\n                    }\n                },\n                \"RuleGroupV2\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::WAFv2::RuleGroup\"\n                    }\n                },\n                \"IPSetV2\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::WAFv2::IPSet\"\n                    }\n                },\n                \"RegexPatternSetV2\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::WAFv2::RegexPatternSet\"\n                    }\n                },\n                \"ManagedRuleSetV2\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::WAFv2::ManagedRuleSet\"\n                    }\n                },\n                \"EncryptionConfig\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::XRay::EncryptionConfig\"\n                    }\n                },\n                \"AssociationCompliance\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::SSM::AssociationCompliance\"\n                    }\n                },\n                \"PatchCompliance\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::SSM::PatchCompliance\"\n                    }\n                },\n                \"Protection\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Shield::Protection\"\n                    }\n                },\n                \"RegionalProtection\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::ShieldRegional::Protection\"\n                    }\n                },\n                \"ConformancePackCompliance\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Config::ConformancePackCompliance\"\n                    }\n                },\n                \"ResourceCompliance\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Config::ResourceCompliance\"\n                    }\n                },\n                \"Stage\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::ApiGateway::Stage\"\n                    }\n                },\n                \"RestApi\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::ApiGateway::RestApi\"\n                    }\n                },\n                \"StageV2\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::ApiGatewayV2::Stage\"\n                    }\n                },\n                \"Api\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::ApiGatewayV2::Api\"\n                    }\n                },\n                \"Pipeline\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::CodePipeline::Pipeline\"\n                    }\n                },\n                \"CloudFormationProvisionedProduct\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::ServiceCatalog::CloudFormationProvisionedProduct\"\n                    }\n                },\n                \"CloudFormationProduct\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::ServiceCatalog::CloudFormationProduct\"\n                    }\n                },\n                \"Portfolio\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::ServiceCatalog::Portfolio\"\n                    }\n                },\n                \"Queue\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::SQS::Queue\"\n                    }\n                },\n                \"Key\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::KMS::Key\"\n                    }\n                },\n                \"QLDBLedger\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::QLDB::Ledger\"\n                    }\n                },\n                \"Secret\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::SecretsManager::Secret\"\n                    }\n                },\n                \"Topic\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::SNS::Topic\"\n                    }\n                },\n                \"FileData\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::SSM::FileData\"\n                    }\n                },\n                \"BackupPlan\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Backup::BackupPlan\"\n                    }\n                },\n                \"BackupSelection\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Backup::BackupSelection\"\n                    }\n                },\n                \"BackupVault\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Backup::BackupVault\"\n                    }\n                },\n                \"BackupRecoveryPoint\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Backup::RecoveryPoint\"\n                    }\n                },\n                \"ECRRepository\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::ECR::Repository\"\n                    }\n                },\n                \"ECSCluster\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::ECS::Cluster\"\n                    }\n                },\n                \"ECSService\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::ECS::Service\"\n                    }\n                },\n                \"ECSTaskDefinition\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::ECS::TaskDefinition\"\n                    }\n                },\n                \"EFSAccessPoint\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::EFS::AccessPoint\"\n                    }\n                },\n                \"EFSFileSystem\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::EFS::FileSystem\"\n                    }\n                },\n                \"EKSCluster\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::EKS::Cluster\"\n                    }\n                },\n                \"OpenSearchDomain\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::OpenSearch::Domain\"\n                    }\n                },\n                \"TransitGateway\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::EC2::TransitGateway\"\n                    }\n                },\n                \"KinesisStream\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Kinesis::Stream\"\n                    }\n                },\n                \"KinesisStreamConsumer\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Kinesis::StreamConsumer\"\n                    }\n                },\n                \"CodeDeployApplication\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::CodeDeploy::Application\"\n                    }\n                },\n                \"CodeDeployDeploymentConfig\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::CodeDeploy::DeploymentConfig\"\n                    }\n                },\n                \"CodeDeployDeploymentGroup\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::CodeDeploy::DeploymentGroup\"\n                    }\n                },\n                \"LaunchTemplate\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::EC2::LaunchTemplate\"\n                    }\n                },\n                \"ECRPublicRepository\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::ECR::PublicRepository\"\n                    }\n                },\n                \"GuardDutyDetector\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::GuardDuty::Detector\"\n                    }\n                },\n                \"EMRSecurityConfiguration\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::EMR::SecurityConfiguration\"\n                    }\n                },\n                \"SageMakerCodeRepository\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::SageMaker::CodeRepository\"\n                    }\n                },\n                \"Route53ResolverResolverEndpoint\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Route53Resolver::ResolverEndpoint\"\n                    }\n                },\n                \"Route53ResolverResolverRule\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Route53Resolver::ResolverRule\"\n                    }\n                },\n                \"Route53ResolverResolverRuleAssociation\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Route53Resolver::ResolverRuleAssociation\"\n                    }\n                },\n                \"DMSReplicationSubnetGroup\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::DMS::ReplicationSubnetGroup\"\n                    }\n                },\n                \"DMSEventSubscription\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::DMS::EventSubscription\"\n                    }\n                },\n                \"MSKCluster\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::MSK::Cluster\"\n                    }\n                },\n                \"StepFunctionsActivity\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::StepFunctions::Activity\"\n                    }\n                },\n                \"WorkSpacesWorkspace\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::WorkSpaces::Workspace\"\n                    }\n                },\n                \"WorkSpacesConnectionAlias\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::WorkSpaces::ConnectionAlias\"\n                    }\n                },\n                \"SageMakerModel\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::SageMaker::Model\"\n                    }\n                },\n                \"ListenerV2\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::ElasticLoadBalancingV2::Listener\"\n                    }\n                },\n                \"StepFunctionsStateMachine\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::StepFunctions::StateMachine\"\n                    }\n                },\n                \"BatchJobQueue\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Batch::JobQueue\"\n                    }\n                },\n                \"BatchComputeEnvironment\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Batch::ComputeEnvironment\"\n                    }\n                },\n                \"AccessAnalyzerAnalyzer\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::AccessAnalyzer::Analyzer\"\n                    }\n                },\n                \"AthenaWorkGroup\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Athena::WorkGroup\"\n                    }\n                },\n                \"AthenaDataCatalog\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Athena::DataCatalog\"\n                    }\n                },\n                \"DetectiveGraph\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Detective::Graph\"\n                    }\n                },\n                \"GlobalAcceleratorAccelerator\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::GlobalAccelerator::Accelerator\"\n                    }\n                },\n                \"GlobalAcceleratorEndpointGroup\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::GlobalAccelerator::EndpointGroup\"\n                    }\n                },\n                \"GlobalAcceleratorListener\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::GlobalAccelerator::Listener\"\n                    }\n                },\n                \"TransitGatewayAttachment\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::EC2::TransitGatewayAttachment\"\n                    }\n                },\n                \"TransitGatewayRouteTable\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::EC2::TransitGatewayRouteTable\"\n                    }\n                },\n                \"DMSCertificate\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::DMS::Certificate\"\n                    }\n                },\n                \"AppConfigApplication\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::AppConfig::Application\"\n                    }\n                },\n                \"AppSyncGraphQLApi\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::AppSync::GraphQLApi\"\n                    }\n                },\n                \"DataSyncLocationSMB\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::DataSync::LocationSMB\"\n                    }\n                },\n                \"DataSyncLocationFSxLustre\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::DataSync::LocationFSxLustre\"\n                    }\n                },\n                \"DataSyncLocationS3\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::DataSync::LocationS3\"\n                    }\n                },\n                \"DataSyncLocationEFS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::DataSync::LocationEFS\"\n                    }\n                },\n                \"DataSyncTask\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::DataSync::Task\"\n                    }\n                },\n                \"DataSyncLocationNFS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::DataSync::LocationNFS\"\n                    }\n                },\n                \"NetworkInsightsAccessScopeAnalysis\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::EC2::NetworkInsightsAccessScopeAnalysis\"\n                    }\n                },\n                \"EKSFargateProfile\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::EKS::FargateProfile\"\n                    }\n                },\n                \"GlueJob\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Glue::Job\"\n                    }\n                },\n                \"GuardDutyThreatIntelSet\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::GuardDuty::ThreatIntelSet\"\n                    }\n                },\n                \"GuardDutyIPSet\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::GuardDuty::IPSet\"\n                    }\n                },\n                \"SageMakerWorkteam\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::SageMaker::Workteam\"\n                    }\n                },\n                \"SageMakerNotebookInstanceLifecycleConfig\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::SageMaker::NotebookInstanceLifecycleConfig\"\n                    }\n                },\n                \"ServiceDiscoveryService\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::ServiceDiscovery::Service\"\n                    }\n                },\n                \"ServiceDiscoveryPublicDnsNamespace\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::ServiceDiscovery::PublicDnsNamespace\"\n                    }\n                },\n                \"SESContactList\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::SES::ContactList\"\n                    }\n                },\n                \"SESConfigurationSet\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::SES::ConfigurationSet\"\n                    }\n                },\n                \"Route53HostedZone\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Route53::HostedZone\"\n                    }\n                },\n                \"IoTEventsInput\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::IoTEvents::Input\"\n                    }\n                },\n                \"IoTEventsDetectorModel\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::IoTEvents::DetectorModel\"\n                    }\n                },\n                \"IoTEventsAlarmModel\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::IoTEvents::AlarmModel\"\n                    }\n                },\n                \"ServiceDiscoveryHttpNamespace\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::ServiceDiscovery::HttpNamespace\"\n                    }\n                },\n                \"EventsEventBus\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Events::EventBus\"\n                    }\n                },\n                \"ImageBuilderContainerRecipe\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::ImageBuilder::ContainerRecipe\"\n                    }\n                },\n                \"ImageBuilderDistributionConfiguration\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::ImageBuilder::DistributionConfiguration\"\n                    }\n                },\n                \"ImageBuilderInfrastructureConfiguration\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::ImageBuilder::InfrastructureConfiguration\"\n                    }\n                },\n                \"DataSyncLocationObjectStorage\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::DataSync::LocationObjectStorage\"\n                    }\n                },\n                \"DataSyncLocationHDFS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::DataSync::LocationHDFS\"\n                    }\n                },\n                \"GlueClassifier\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Glue::Classifier\"\n                    }\n                },\n                \"Route53RecoveryReadinessCell\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Route53RecoveryReadiness::Cell\"\n                    }\n                },\n                \"Route53RecoveryReadinessReadinessCheck\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Route53RecoveryReadiness::ReadinessCheck\"\n                    }\n                },\n                \"ECRRegistryPolicy\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::ECR::RegistryPolicy\"\n                    }\n                },\n                \"BackupReportPlan\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Backup::ReportPlan\"\n                    }\n                },\n                \"LightsailCertificate\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Lightsail::Certificate\"\n                    }\n                },\n                \"RUMAppMonitor\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::RUM::AppMonitor\"\n                    }\n                },\n                \"EventsEndpoint\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Events::Endpoint\"\n                    }\n                },\n                \"SESReceiptRuleSet\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::SES::ReceiptRuleSet\"\n                    }\n                },\n                \"EventsArchive\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Events::Archive\"\n                    }\n                },\n                \"EventsApiDestination\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Events::ApiDestination\"\n                    }\n                },\n                \"LightsailDisk\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Lightsail::Disk\"\n                    }\n                },\n                \"FISExperimentTemplate\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::FIS::ExperimentTemplate\"\n                    }\n                },\n                \"DataSyncLocationFSxWindows\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::DataSync::LocationFSxWindows\"\n                    }\n                },\n                \"SESReceiptFilter\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::SES::ReceiptFilter\"\n                    }\n                },\n                \"GuardDutyFilter\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::GuardDuty::Filter\"\n                    }\n                },\n                \"SESTemplate\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::SES::Template\"\n                    }\n                },\n                \"AmazonMQBroker\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::AmazonMQ::Broker\"\n                    }\n                },\n                \"AppConfigEnvironment\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::AppConfig::Environment\"\n                    }\n                },\n                \"AppConfigConfigurationProfile\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::AppConfig::ConfigurationProfile\"\n                    }\n                },\n                \"Cloud9EnvironmentEC2\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Cloud9::EnvironmentEC2\"\n                    }\n                },\n                \"EventSchemasRegistry\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::EventSchemas::Registry\"\n                    }\n                },\n                \"EventSchemasRegistryPolicy\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::EventSchemas::RegistryPolicy\"\n                    }\n                },\n                \"EventSchemasDiscoverer\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::EventSchemas::Discoverer\"\n                    }\n                },\n                \"FraudDetectorLabel\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::FraudDetector::Label\"\n                    }\n                },\n                \"FraudDetectorEntityType\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::FraudDetector::EntityType\"\n                    }\n                },\n                \"FraudDetectorVariable\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::FraudDetector::Variable\"\n                    }\n                },\n                \"FraudDetectorOutcome\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::FraudDetector::Outcome\"\n                    }\n                },\n                \"IoTAuthorizer\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::IoT::Authorizer\"\n                    }\n                },\n                \"IoTSecurityProfile\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::IoT::SecurityProfile\"\n                    }\n                },\n                \"IoTRoleAlias\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::IoT::RoleAlias\"\n                    }\n                },\n                \"IoTDimension\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::IoT::Dimension\"\n                    }\n                },\n                \"IoTAnalyticsDatastore\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::IoTAnalytics::Datastore\"\n                    }\n                },\n                \"LightsailBucket\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Lightsail::Bucket\"\n                    }\n                },\n                \"LightsailStaticIp\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Lightsail::StaticIp\"\n                    }\n                },\n                \"MediaPackagePackagingGroup\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::MediaPackage::PackagingGroup\"\n                    }\n                },\n                \"Route53RecoveryReadinessRecoveryGroup\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Route53RecoveryReadiness::RecoveryGroup\"\n                    }\n                },\n                \"ResilienceHubResiliencyPolicy\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::ResilienceHub::ResiliencyPolicy\"\n                    }\n                },\n                \"TransferWorkflow\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Transfer::Workflow\"\n                    }\n                },\n                \"EKSIdentityProviderConfig\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::EKS::IdentityProviderConfig\"\n                    }\n                },\n                \"EKSAddon\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::EKS::Addon\"\n                    }\n                },\n                \"GlueMLTransform\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Glue::MLTransform\"\n                    }\n                },\n                \"IoTPolicy\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::IoT::Policy\"\n                    }\n                },\n                \"IoTMitigationAction\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::IoT::MitigationAction\"\n                    }\n                },\n                \"IoTTwinMakerWorkspace\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::IoTTwinMaker::Workspace\"\n                    }\n                },\n                \"IoTTwinMakerEntity\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::IoTTwinMaker::Entity\"\n                    }\n                },\n                \"IoTAnalyticsDataset\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::IoTAnalytics::Dataset\"\n                    }\n                },\n                \"IoTAnalyticsPipeline\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::IoTAnalytics::Pipeline\"\n                    }\n                },\n                \"IoTAnalyticsChannel\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::IoTAnalytics::Channel\"\n                    }\n                },\n                \"IoTSiteWiseDashboard\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::IoTSiteWise::Dashboard\"\n                    }\n                },\n                \"IoTSiteWiseProject\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::IoTSiteWise::Project\"\n                    }\n                },\n                \"IoTSiteWisePortal\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::IoTSiteWise::Portal\"\n                    }\n                },\n                \"IoTSiteWiseAssetModel\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::IoTSiteWise::AssetModel\"\n                    }\n                },\n                \"IVSChannel\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::IVS::Channel\"\n                    }\n                },\n                \"IVSRecordingConfiguration\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::IVS::RecordingConfiguration\"\n                    }\n                },\n                \"IVSPlaybackKeyPair\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::IVS::PlaybackKeyPair\"\n                    }\n                },\n                \"KinesisAnalyticsV2Application\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::KinesisAnalyticsV2::Application\"\n                    }\n                },\n                \"RDSGlobalCluster\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::RDS::GlobalCluster\"\n                    }\n                },\n                \"S3MultiRegionAccessPoint\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::S3::MultiRegionAccessPoint\"\n                    }\n                },\n                \"DeviceFarmTestGridProject\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::DeviceFarm::TestGridProject\"\n                    }\n                },\n                \"BudgetsBudgetsAction\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Budgets::BudgetsAction\"\n                    }\n                },\n                \"LexBot\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Lex::Bot\"\n                    }\n                },\n                \"CodeGuruReviewerRepositoryAssociation\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::CodeGuruReviewer::RepositoryAssociation\"\n                    }\n                },\n                \"IoTCustomMetric\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::IoT::CustomMetric\"\n                    }\n                },\n                \"Route53ResolverFirewallDomainList\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Route53Resolver::FirewallDomainList\"\n                    }\n                },\n                \"RoboMakerRobotApplicationVersion\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::RoboMaker::RobotApplicationVersion\"\n                    }\n                },\n                \"EC2TrafficMirrorSession\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::EC2::TrafficMirrorSession\"\n                    }\n                },\n                \"IoTSiteWiseGateway\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::IoTSiteWise::Gateway\"\n                    }\n                },\n                \"LexBotAlias\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Lex::BotAlias\"\n                    }\n                },\n                \"LookoutMetricsAlert\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::LookoutMetrics::Alert\"\n                    }\n                },\n                \"IoTAccountAuditConfiguration\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::IoT::AccountAuditConfiguration\"\n                    }\n                },\n                \"EC2TrafficMirrorTarget\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::EC2::TrafficMirrorTarget\"\n                    }\n                },\n                \"S3StorageLens\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::S3::StorageLens\"\n                    }\n                },\n                \"IoTScheduledAudit\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::IoT::ScheduledAudit\"\n                    }\n                },\n                \"EventsConnection\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Events::Connection\"\n                    }\n                },\n                \"EventSchemasSchema\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::EventSchemas::Schema\"\n                    }\n                },\n                \"MediaPackagePackagingConfiguration\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::MediaPackage::PackagingConfiguration\"\n                    }\n                },\n                \"KinesisVideoSignalingChannel\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::KinesisVideo::SignalingChannel\"\n                    }\n                },\n                \"AppStreamDirectoryConfig\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::AppStream::DirectoryConfig\"\n                    }\n                },\n                \"LookoutVisionProject\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::LookoutVision::Project\"\n                    }\n                },\n                \"Route53RecoveryControlCluster\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Route53RecoveryControl::Cluster\"\n                    }\n                },\n                \"Route53RecoveryControlSafetyRule\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Route53RecoveryControl::SafetyRule\"\n                    }\n                },\n                \"Route53RecoveryControlControlPanel\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Route53RecoveryControl::ControlPanel\"\n                    }\n                },\n                \"Route53RecoveryControlRoutingControl\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Route53RecoveryControl::RoutingControl\"\n                    }\n                },\n                \"Route53RecoveryReadinessResourceSet\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Route53RecoveryReadiness::ResourceSet\"\n                    }\n                },\n                \"RoboMakerSimulationApplication\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::RoboMaker::SimulationApplication\"\n                    }\n                },\n                \"RoboMakerRobotApplication\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::RoboMaker::RobotApplication\"\n                    }\n                },\n                \"HealthLakeFHIRDatastore\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::HealthLake::FHIRDatastore\"\n                    }\n                },\n                \"PinpointSegment\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Pinpoint::Segment\"\n                    }\n                },\n                \"PinpointApplicationSettings\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Pinpoint::ApplicationSettings\"\n                    }\n                },\n                \"EventsRule\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Events::Rule\"\n                    }\n                },\n                \"EC2DHCPOptions\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::EC2::DHCPOptions\"\n                    }\n                },\n                \"EC2NetworkInsightsPath\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::EC2::NetworkInsightsPath\"\n                    }\n                },\n                \"EC2TrafficMirrorFilter\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::EC2::TrafficMirrorFilter\"\n                    }\n                },\n                \"EC2IPAM\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::EC2::IPAM\"\n                    }\n                },\n                \"IoTTwinMakerScene\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::IoTTwinMaker::Scene\"\n                    }\n                },\n                \"NetworkManagerTransitGatewayRegistration\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::NetworkManager::TransitGatewayRegistration\"\n                    }\n                },\n                \"CustomerProfilesDomain\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::CustomerProfiles::Domain\"\n                    }\n                },\n                \"AutoScalingWarmPool\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::AutoScaling::WarmPool\"\n                    }\n                },\n                \"ConnectPhoneNumber\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Connect::PhoneNumber\"\n                    }\n                },\n                \"AppConfigDeploymentStrategy\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::AppConfig::DeploymentStrategy\"\n                    }\n                },\n                \"AppFlowFlow\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::AppFlow::Flow\"\n                    }\n                },\n                \"AuditManagerAssessment\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::AuditManager::Assessment\"\n                    }\n                },\n                \"CloudWatchMetricStream\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::CloudWatch::MetricStream\"\n                    }\n                },\n                \"DeviceFarmInstanceProfile\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::DeviceFarm::InstanceProfile\"\n                    }\n                },\n                \"DeviceFarmProject\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::DeviceFarm::Project\"\n                    }\n                },\n                \"EC2EC2Fleet\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::EC2::EC2Fleet\"\n                    }\n                },\n                \"EC2SubnetRouteTableAssociation\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::EC2::SubnetRouteTableAssociation\"\n                    }\n                },\n                \"ECRPullThroughCacheRule\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::ECR::PullThroughCacheRule\"\n                    }\n                },\n                \"GroundStationConfig\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::GroundStation::Config\"\n                    }\n                },\n                \"ImageBuilderImagePipeline\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::ImageBuilder::ImagePipeline\"\n                    }\n                },\n                \"IoTFleetMetric\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::IoT::FleetMetric\"\n                    }\n                },\n                \"IoTWirelessServiceProfile\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::IoTWireless::ServiceProfile\"\n                    }\n                },\n                \"NetworkManagerDevice\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::NetworkManager::Device\"\n                    }\n                },\n                \"NetworkManagerGlobalNetwork\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::NetworkManager::GlobalNetwork\"\n                    }\n                },\n                \"NetworkManagerLink\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::NetworkManager::Link\"\n                    }\n                },\n                \"NetworkManagerSite\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::NetworkManager::Site\"\n                    }\n                },\n                \"PanoramaPackage\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Panorama::Package\"\n                    }\n                },\n                \"PinpointApp\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Pinpoint::App\"\n                    }\n                },\n                \"RedshiftScheduledAction\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Redshift::ScheduledAction\"\n                    }\n                },\n                \"Route53ResolverFirewallRuleGroupAssociation\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Route53Resolver::FirewallRuleGroupAssociation\"\n                    }\n                },\n                \"SageMakerAppImageConfig\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::SageMaker::AppImageConfig\"\n                    }\n                },\n                \"SageMakerImage\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::SageMaker::Image\"\n                    }\n                },\n                \"ECSTaskSet\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::ECS::TaskSet\"\n                    }\n                },\n                \"CassandraKeyspace\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Cassandra::Keyspace\"\n                    }\n                },\n                \"SignerSigningProfile\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Signer::SigningProfile\"\n                    }\n                },\n                \"AmplifyApp\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Amplify::App\"\n                    }\n                },\n                \"AppMeshVirtualNode\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::AppMesh::VirtualNode\"\n                    }\n                },\n                \"AppMeshVirtualService\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::AppMesh::VirtualService\"\n                    }\n                },\n                \"AppRunnerVpcConnector\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::AppRunner::VpcConnector\"\n                    }\n                },\n                \"AppStreamApplication\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::AppStream::Application\"\n                    }\n                },\n                \"CodeArtifactRepository\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::CodeArtifact::Repository\"\n                    }\n                },\n                \"EC2PrefixList\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::EC2::PrefixList\"\n                    }\n                },\n                \"EC2SpotFleet\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::EC2::SpotFleet\"\n                    }\n                },\n                \"EvidentlyProject\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Evidently::Project\"\n                    }\n                },\n                \"ForecastDataset\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Forecast::Dataset\"\n                    }\n                },\n                \"IAMSAMLProvider\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::IAM::SAMLProvider\"\n                    }\n                },\n                \"IAMServerCertificate\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::IAM::ServerCertificate\"\n                    }\n                },\n                \"PinpointCampaign\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Pinpoint::Campaign\"\n                    }\n                },\n                \"PinpointInAppTemplate\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Pinpoint::InAppTemplate\"\n                    }\n                },\n                \"SageMakerDomain\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::SageMaker::Domain\"\n                    }\n                },\n                \"TransferAgreement\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Transfer::Agreement\"\n                    }\n                },\n                \"TransferConnector\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Transfer::Connector\"\n                    }\n                },\n                \"KinesisFirehoseDeliveryStream\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::KinesisFirehose::DeliveryStream\"\n                    }\n                },\n                \"AmplifyBranch\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Amplify::Branch\"\n                    }\n                },\n                \"AppIntegrationsEventIntegration\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::AppIntegrations::EventIntegration\"\n                    }\n                },\n                \"AppMeshRoute\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::AppMesh::Route\"\n                    }\n                },\n                \"AthenaPreparedStatement\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Athena::PreparedStatement\"\n                    }\n                },\n                \"EC2IPAMScope\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::EC2::IPAMScope\"\n                    }\n                },\n                \"EvidentlyLaunch\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Evidently::Launch\"\n                    }\n                },\n                \"ForecastDatasetGroup\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Forecast::DatasetGroup\"\n                    }\n                },\n                \"GreengrassV2ComponentVersion\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::GreengrassV2::ComponentVersion\"\n                    }\n                },\n                \"GroundStationMissionProfile\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::GroundStation::MissionProfile\"\n                    }\n                },\n                \"MediaConnectFlowEntitlement\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::MediaConnect::FlowEntitlement\"\n                    }\n                },\n                \"MediaConnectFlowVpcInterface\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::MediaConnect::FlowVpcInterface\"\n                    }\n                },\n                \"MediaTailorPlaybackConfiguration\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::MediaTailor::PlaybackConfiguration\"\n                    }\n                },\n                \"MSKConfiguration\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::MSK::Configuration\"\n                    }\n                },\n                \"PersonalizeDataset\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Personalize::Dataset\"\n                    }\n                },\n                \"PersonalizeSchema\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Personalize::Schema\"\n                    }\n                },\n                \"PersonalizeSolution\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Personalize::Solution\"\n                    }\n                },\n                \"PinpointEmailTemplate\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Pinpoint::EmailTemplate\"\n                    }\n                },\n                \"PinpointEventStream\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Pinpoint::EventStream\"\n                    }\n                },\n                \"ResilienceHubApp\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::ResilienceHub::App\"\n                    }\n                },\n                \"ACMPCACertificateAuthority\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::ACMPCA::CertificateAuthority\"\n                    }\n                },\n                \"AppConfigHostedConfigurationVersion\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::AppConfig::HostedConfigurationVersion\"\n                    }\n                },\n                \"AppMeshVirtualGateway\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::AppMesh::VirtualGateway\"\n                    }\n                },\n                \"AppMeshVirtualRouter\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::AppMesh::VirtualRouter\"\n                    }\n                },\n                \"AppRunnerService\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::AppRunner::Service\"\n                    }\n                },\n                \"CustomerProfilesObjectType\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::CustomerProfiles::ObjectType\"\n                    }\n                },\n                \"DMSEndpoint\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::DMS::Endpoint\"\n                    }\n                },\n                \"EC2CapacityReservation\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::EC2::CapacityReservation\"\n                    }\n                },\n                \"EC2ClientVpnEndpoint\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::EC2::ClientVpnEndpoint\"\n                    }\n                },\n                \"KendraIndex\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Kendra::Index\"\n                    }\n                },\n                \"KinesisVideoStream\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::KinesisVideo::Stream\"\n                    }\n                },\n                \"LogsDestination\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Logs::Destination\"\n                    }\n                },\n                \"PinpointEmailChannel\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Pinpoint::EmailChannel\"\n                    }\n                },\n                \"S3AccessPoint\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::S3::AccessPoint\"\n                    }\n                },\n                \"NetworkManagerCustomerGatewayAssociation\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::NetworkManager::CustomerGatewayAssociation\"\n                    }\n                },\n                \"NetworkManagerLinkAssociation\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::NetworkManager::LinkAssociation\"\n                    }\n                },\n                \"IoTWirelessMulticastGroup\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::IoTWireless::MulticastGroup\"\n                    }\n                },\n                \"PersonalizeDatasetGroup\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Personalize::DatasetGroup\"\n                    }\n                },\n                \"IoTTwinMakerComponentType\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::IoTTwinMaker::ComponentType\"\n                    }\n                },\n                \"CodeBuildReportGroup\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::CodeBuild::ReportGroup\"\n                    }\n                },\n                \"SageMakerFeatureGroup\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::SageMaker::FeatureGroup\"\n                    }\n                },\n                \"MSKBatchScramSecret\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::MSK::BatchScramSecret\"\n                    }\n                },\n                \"AppStreamStack\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::AppStream::Stack\"\n                    }\n                },\n                \"IoTJobTemplate\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::IoT::JobTemplate\"\n                    }\n                },\n                \"IoTWirelessFuotaTask\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::IoTWireless::FuotaTask\"\n                    }\n                },\n                \"IoTProvisioningTemplate\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::IoT::ProvisioningTemplate\"\n                    }\n                },\n                \"InspectorV2Filter\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::InspectorV2::Filter\"\n                    }\n                },\n                \"Route53ResolverResolverQueryLoggingConfigAssociation\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Route53Resolver::ResolverQueryLoggingConfigAssociation\"\n                    }\n                },\n                \"ServiceDiscoveryInstance\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::ServiceDiscovery::Instance\"\n                    }\n                },\n                \"TransferCertificate\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Transfer::Certificate\"\n                    }\n                },\n                \"MediaConnectFlowSource\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::MediaConnect::FlowSource\"\n                    }\n                },\n                \"APSRuleGroupsNamespace\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::APS::RuleGroupsNamespace\"\n                    }\n                },\n                \"CodeGuruProfilerProfilingGroup\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::CodeGuruProfiler::ProfilingGroup\"\n                    }\n                },\n                \"Route53ResolverResolverQueryLoggingConfig\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Route53Resolver::ResolverQueryLoggingConfig\"\n                    }\n                },\n                \"BatchSchedulingPolicy\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Batch::SchedulingPolicy\"\n                    }\n                },\n                \"ACMPCACertificateAuthorityActivation\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::ACMPCA::CertificateAuthorityActivation\"\n                    }\n                },\n                \"AppMeshGatewayRoute\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::AppMesh::GatewayRoute\"\n                    }\n                },\n                \"AppMeshMesh\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::AppMesh::Mesh\"\n                    }\n                },\n                \"ConnectInstance\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Connect::Instance\"\n                    }\n                },\n                \"ConnectQuickConnect\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Connect::QuickConnect\"\n                    }\n                },\n                \"EC2CarrierGateway\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::EC2::CarrierGateway\"\n                    }\n                },\n                \"EC2IPAMPool\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::EC2::IPAMPool\"\n                    }\n                },\n                \"EC2TransitGatewayConnect\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::EC2::TransitGatewayConnect\"\n                    }\n                },\n                \"EC2TransitGatewayMulticastDomain\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::EC2::TransitGatewayMulticastDomain\"\n                    }\n                },\n                \"ECSCapacityProvider\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::ECS::CapacityProvider\"\n                    }\n                },\n                \"IAMInstanceProfile\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::IAM::InstanceProfile\"\n                    }\n                },\n                \"IoTCACertificate\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::IoT::CACertificate\"\n                    }\n                },\n                \"IoTTwinMakerSyncJob\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::IoTTwinMaker::SyncJob\"\n                    }\n                },\n                \"KafkaConnectConnector\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::KafkaConnect::Connector\"\n                    }\n                },\n                \"LambdaCodeSigningConfig\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Lambda::CodeSigningConfig\"\n                    }\n                },\n                \"NetworkManagerConnectPeer\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::NetworkManager::ConnectPeer\"\n                    }\n                },\n                \"ResourceExplorer2Index\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::ResourceExplorer2::Index\"\n                    }\n                },\n                \"AppStreamFleet\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::AppStream::Fleet\"\n                    }\n                },\n                \"CognitoUserPool\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Cognito::UserPool\"\n                    }\n                },\n                \"CognitoUserPoolClient\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Cognito::UserPoolClient\"\n                    }\n                },\n                \"CognitoUserPoolGroup\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Cognito::UserPoolGroup\"\n                    }\n                },\n                \"EC2NetworkInsightsAccessScope\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::EC2::NetworkInsightsAccessScope\"\n                    }\n                },\n                \"EC2NetworkInsightsAnalysis\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::EC2::NetworkInsightsAnalysis\"\n                    }\n                },\n                \"GrafanaWorkspace\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Grafana::Workspace\"\n                    }\n                },\n                \"GroundStationDataflowEndpointGroup\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::GroundStation::DataflowEndpointGroup\"\n                    }\n                },\n                \"ImageBuilderImageRecipe\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::ImageBuilder::ImageRecipe\"\n                    }\n                },\n                \"KMSAlias\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::KMS::Alias\"\n                    }\n                },\n                \"M2Environment\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::M2::Environment\"\n                    }\n                },\n                \"QuickSightDataSource\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::QuickSight::DataSource\"\n                    }\n                },\n                \"QuickSightTemplate\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::QuickSight::Template\"\n                    }\n                },\n                \"QuickSightTheme\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::QuickSight::Theme\"\n                    }\n                },\n                \"RDSOptionGroup\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::RDS::OptionGroup\"\n                    }\n                },\n                \"RedshiftEndpointAccess\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Redshift::EndpointAccess\"\n                    }\n                },\n                \"Route53ResolverFirewallRuleGroup\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Route53Resolver::FirewallRuleGroup\"\n                    }\n                },\n                \"SSMDocument\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::SSM::Document\"\n                    }\n                },\n                \"AppConfigExtensionAssociation\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::AppConfig::ExtensionAssociation\"\n                    }\n                },\n                \"AppIntegrationsApplication\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::AppIntegrations::Application\"\n                    }\n                },\n                \"AppSyncApiCache\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::AppSync::ApiCache\"\n                    }\n                },\n                \"BedrockGuardrail\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Bedrock::Guardrail\"\n                    }\n                },\n                \"BedrockKnowledgeBase\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Bedrock::KnowledgeBase\"\n                    }\n                },\n                \"CognitoIdentityPool\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Cognito::IdentityPool\"\n                    }\n                },\n                \"ConnectRule\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Connect::Rule\"\n                    }\n                },\n                \"ConnectUser\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Connect::User\"\n                    }\n                },\n                \"EC2ClientVpnTargetNetworkAssociation\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::EC2::ClientVpnTargetNetworkAssociation\"\n                    }\n                },\n                \"EC2EIPAssociation\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::EC2::EIPAssociation\"\n                    }\n                },\n                \"EC2IPAMResourceDiscovery\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::EC2::IPAMResourceDiscovery\"\n                    }\n                },\n                \"EC2IPAMResourceDiscoveryAssociation\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::EC2::IPAMResourceDiscoveryAssociation\"\n                    }\n                },\n                \"EC2InstanceConnectEndpoint\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::EC2::InstanceConnectEndpoint\"\n                    }\n                },\n                \"EC2SnapshotBlockPublicAccess\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::EC2::SnapshotBlockPublicAccess\"\n                    }\n                },\n                \"EC2VPCBlockPublicAccessExclusion\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::EC2::VPCBlockPublicAccessExclusion\"\n                    }\n                },\n                \"EC2VPCBlockPublicAccessOptions\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::EC2::VPCBlockPublicAccessOptions\"\n                    }\n                },\n                \"EC2VPCEndpointConnectionNotification\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::EC2::VPCEndpointConnectionNotification\"\n                    }\n                },\n                \"EC2VPNConnectionRoute\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::EC2::VPNConnectionRoute\"\n                    }\n                },\n                \"EvidentlySegment\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Evidently::Segment\"\n                    }\n                },\n                \"IAMOIDCProvider\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::IAM::OIDCProvider\"\n                    }\n                },\n                \"InspectorV2Activation\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::InspectorV2::Activation\"\n                    }\n                },\n                \"MSKClusterPolicy\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::MSK::ClusterPolicy\"\n                    }\n                },\n                \"MSKVpcConnection\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::MSK::VpcConnection\"\n                    }\n                },\n                \"MediaConnectGateway\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::MediaConnect::Gateway\"\n                    }\n                },\n                \"MemoryDBSubnetGroup\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::MemoryDB::SubnetGroup\"\n                    }\n                },\n                \"OpenSearchServerlessCollection\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::OpenSearchServerless::Collection\"\n                    }\n                },\n                \"OpenSearchServerlessVpcEndpoint\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::OpenSearchServerless::VpcEndpoint\"\n                    }\n                },\n                \"RedshiftEndpointAuthorization\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Redshift::EndpointAuthorization\"\n                    }\n                },\n                \"Route53ProfilesProfile\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Route53Profiles::Profile\"\n                    }\n                },\n                \"S3StorageLensGroup\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::S3::StorageLensGroup\"\n                    }\n                },\n                \"S3ExpressBucketPolicy\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::S3Express::BucketPolicy\"\n                    }\n                },\n                \"S3ExpressDirectoryBucket\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::S3Express::DirectoryBucket\"\n                    }\n                },\n                \"SageMakerInferenceExperiment\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::SageMaker::InferenceExperiment\"\n                    }\n                },\n                \"SecurityHubStandard\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::SecurityHub::Standard\"\n                    }\n                },\n                \"TransferProfile\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS::Transfer::Profile\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.configservice#ResourceTypeList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#ResourceType\"\n            }\n        },\n        \"com.amazonaws.configservice#ResourceTypeString\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 196\n                }\n            }\n        },\n        \"com.amazonaws.configservice#ResourceTypeValue\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 256\n                },\n                \"smithy.api#pattern\": \"^[a-zA-Z0-9]{2,64}::[a-zA-Z0-9]{2,64}::[a-zA-Z0-9]{2,64}$\"\n            }\n        },\n        \"com.amazonaws.configservice#ResourceTypeValueList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#ResourceTypeValue\"\n            }\n        },\n        \"com.amazonaws.configservice#ResourceTypes\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#StringWithCharLimit256\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 20\n                }\n            }\n        },\n        \"com.amazonaws.configservice#ResourceTypesScope\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#StringWithCharLimit256\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 100\n                }\n            }\n        },\n        \"com.amazonaws.configservice#ResourceValue\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Value\": {\n                    \"target\": \"com.amazonaws.configservice#ResourceValueType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The value is a resource ID.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The dynamic value of the resource.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#ResourceValueType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"RESOURCE_ID\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"RESOURCE_ID\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.configservice#Results\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#String\"\n            }\n        },\n        \"com.amazonaws.configservice#RetentionConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Name\": {\n                    \"target\": \"com.amazonaws.configservice#RetentionConfigurationName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the retention configuration object.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"RetentionPeriodInDays\": {\n                    \"target\": \"com.amazonaws.configservice#RetentionPeriodInDays\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Number of days Config stores your historical information.</p>\\n         <note>\\n            <p>Currently, only applicable to the configuration item history.</p>\\n         </note>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>An object with the name of the retention configuration and the retention period in days. The object stores the configuration for data retention in Config.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#RetentionConfigurationList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#RetentionConfiguration\"\n            }\n        },\n        \"com.amazonaws.configservice#RetentionConfigurationName\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 256\n                },\n                \"smithy.api#pattern\": \"^[\\\\w\\\\-]+$\"\n            }\n        },\n        \"com.amazonaws.configservice#RetentionConfigurationNameList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#RetentionConfigurationName\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 1\n                }\n            }\n        },\n        \"com.amazonaws.configservice#RetentionPeriodInDays\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 30,\n                    \"max\": 2557\n                }\n            }\n        },\n        \"com.amazonaws.configservice#RuleLimit\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#default\": 0,\n                \"smithy.api#range\": {\n                    \"min\": 0,\n                    \"max\": 50\n                }\n            }\n        },\n        \"com.amazonaws.configservice#SSMDocumentName\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#pattern\": \"^[a-zA-Z0-9_\\\\-.:/]{3,200}$\"\n            }\n        },\n        \"com.amazonaws.configservice#SSMDocumentVersion\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#pattern\": \"^([$]LATEST|[$]DEFAULT|^[1-9][0-9]*$)$\"\n            }\n        },\n        \"com.amazonaws.configservice#SchemaVersionId\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 128\n                },\n                \"smithy.api#pattern\": \"^[A-Za-z0-9-]+$\"\n            }\n        },\n        \"com.amazonaws.configservice#Scope\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ComplianceResourceTypes\": {\n                    \"target\": \"com.amazonaws.configservice#ComplianceResourceTypes\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The resource types of only those Amazon Web Services resources that you want to\\n\\t\\t\\ttrigger an evaluation for the rule. You can only specify one type if\\n\\t\\t\\tyou also specify a resource ID for\\n\\t\\t\\t<code>ComplianceResourceId</code>.</p>\"\n                    }\n                },\n                \"TagKey\": {\n                    \"target\": \"com.amazonaws.configservice#StringWithCharLimit128\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tag key that is applied to only those Amazon Web Services resources that\\n\\t\\t\\tyou want to trigger an evaluation for the rule.</p>\"\n                    }\n                },\n                \"TagValue\": {\n                    \"target\": \"com.amazonaws.configservice#StringWithCharLimit256\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tag value applied to only those Amazon Web Services resources that you want\\n\\t\\t\\tto trigger an evaluation for the rule. If you specify a value for\\n\\t\\t\\t\\t<code>TagValue</code>, you must also specify a value for\\n\\t\\t\\t\\t<code>TagKey</code>.</p>\"\n                    }\n                },\n                \"ComplianceResourceId\": {\n                    \"target\": \"com.amazonaws.configservice#BaseResourceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the only Amazon Web Services resource that you want to trigger an\\n\\t\\t\\tevaluation for the rule. If you specify a resource ID, you must\\n\\t\\t\\tspecify one resource type for\\n\\t\\t\\t<code>ComplianceResourceTypes</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Defines which resources trigger an evaluation for an Config\\n\\t\\t\\trule. The scope can include one or more resource types, a\\n\\t\\t\\tcombination of a tag key and value, or a combination of one resource\\n\\t\\t\\ttype and one resource ID. Specify a scope to constrain which\\n\\t\\t\\tresources trigger an evaluation for a rule. Otherwise, evaluations\\n\\t\\t\\tfor the rule are triggered when any resource in your recording group\\n\\t\\t\\tchanges in configuration.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#SelectAggregateResourceConfig\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#SelectAggregateResourceConfigRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.configservice#SelectAggregateResourceConfigResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidExpressionException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidLimitException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidNextTokenException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#NoSuchConfigurationAggregatorException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Accepts a structured query language (SQL) SELECT command and an aggregator to query configuration state of Amazon Web Services resources across multiple accounts and regions, \\n\\t\\t\\tperforms the corresponding search, and returns resource configurations matching the properties.</p>\\n         <p>For more information about query components, see the \\n\\t\\t\\t<a href=\\\"https://docs.aws.amazon.com/config/latest/developerguide/query-components.html\\\">\\n               <b>Query Components</b>\\n            </a> section in the <i>Config Developer Guide</i>.</p>\\n         <note>\\n            <p>If you run an aggregation query (i.e., using <code>GROUP BY</code> or using aggregate functions such as <code>COUNT</code>; e.g., <code>SELECT resourceId, COUNT(*) WHERE resourceType = 'AWS::IAM::Role' GROUP BY resourceId</code>)\\n\\t\\t\\t\\tand do not specify the <code>MaxResults</code> or the <code>Limit</code> query parameters, the default page size is set to 500.</p>\\n            <p>If you run a non-aggregation query (i.e., not using <code>GROUP BY</code> or aggregate function; e.g., <code>SELECT * WHERE resourceType = 'AWS::IAM::Role'</code>)\\n\\t\\t\\t\\tand do not specify the <code>MaxResults</code> or the <code>Limit</code> query parameters, the default page size is set to 25.</p>\\n         </note>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"Results\",\n                    \"pageSize\": \"Limit\"\n                }\n            }\n        },\n        \"com.amazonaws.configservice#SelectAggregateResourceConfigRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Expression\": {\n                    \"target\": \"com.amazonaws.configservice#Expression\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The SQL query SELECT command. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ConfigurationAggregatorName\": {\n                    \"target\": \"com.amazonaws.configservice#ConfigurationAggregatorName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the configuration aggregator.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Limit\": {\n                    \"target\": \"com.amazonaws.configservice#Limit\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The maximum number of query results returned on each page. </p>\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.configservice#Limit\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The maximum number of query results returned on each page. Config also allows the Limit request parameter.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.configservice#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The nextToken string returned in a previous request that you use to request the next page of results in a paginated response. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#SelectAggregateResourceConfigResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Results\": {\n                    \"target\": \"com.amazonaws.configservice#Results\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Returns the results for the SQL query.</p>\"\n                    }\n                },\n                \"QueryInfo\": {\n                    \"target\": \"com.amazonaws.configservice#QueryInfo\"\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.configservice#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The nextToken string returned in a previous request that you use to request the next page of results in a paginated response. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.configservice#SelectResourceConfig\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#SelectResourceConfigRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.configservice#SelectResourceConfigResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidExpressionException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidLimitException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidNextTokenException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Accepts a structured query language (SQL) <code>SELECT</code> command, performs the corresponding search, and returns resource configurations matching the properties.</p>\\n         <p>For more information about query components, see the \\n\\t\\t\\t<a href=\\\"https://docs.aws.amazon.com/config/latest/developerguide/query-components.html\\\">\\n               <b>Query Components</b>\\n            </a> section in the <i>Config Developer Guide</i>.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"Results\",\n                    \"pageSize\": \"Limit\"\n                }\n            }\n        },\n        \"com.amazonaws.configservice#SelectResourceConfigRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Expression\": {\n                    \"target\": \"com.amazonaws.configservice#Expression\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The SQL query <code>SELECT</code> command.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Limit\": {\n                    \"target\": \"com.amazonaws.configservice#Limit\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The maximum number of query results returned on each page. </p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.configservice#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>nextToken</code> string returned in a previous request that you use to request the next page of results in a paginated response. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#SelectResourceConfigResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Results\": {\n                    \"target\": \"com.amazonaws.configservice#Results\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Returns the results for the SQL query.</p>\"\n                    }\n                },\n                \"QueryInfo\": {\n                    \"target\": \"com.amazonaws.configservice#QueryInfo\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Returns the <code>QueryInfo</code> object.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.configservice#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>nextToken</code> string returned in a previous request that you use to request the next page of results in a paginated response. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.configservice#ServicePrincipal\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 128\n                },\n                \"smithy.api#pattern\": \"^[\\\\w+=,.@-]+$\"\n            }\n        },\n        \"com.amazonaws.configservice#ServicePrincipalValue\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 128\n                },\n                \"smithy.api#pattern\": \"^[\\\\w+=,.@-]+$\"\n            }\n        },\n        \"com.amazonaws.configservice#ServicePrincipalValueList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#ServicePrincipalValue\"\n            }\n        },\n        \"com.amazonaws.configservice#SortBy\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"SCORE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"SCORE\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.configservice#SortOrder\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ASCENDING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ASCENDING\"\n                    }\n                },\n                \"DESCENDING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DESCENDING\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.configservice#Source\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Owner\": {\n                    \"target\": \"com.amazonaws.configservice#Owner\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether Amazon Web Services or the customer owns and manages the Config rule.</p>\\n         <p>Config Managed Rules are predefined rules owned by Amazon Web Services. For more information, see <a href=\\\"https://docs.aws.amazon.com/config/latest/developerguide/evaluate-config_use-managed-rules.html\\\">Config Managed Rules</a> in the <i>Config developer guide</i>.</p>\\n         <p>Config Custom Rules are rules that you can develop either with Guard (<code>CUSTOM_POLICY</code>) or Lambda (<code>CUSTOM_LAMBDA</code>). For more information, see <a href=\\\"https://docs.aws.amazon.com/config/latest/developerguide/evaluate-config_develop-rules.html\\\">Config Custom Rules </a> in the <i>Config developer guide</i>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"SourceIdentifier\": {\n                    \"target\": \"com.amazonaws.configservice#StringWithCharLimit256\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>For Config Managed rules, a predefined identifier from a\\n\\t\\t\\tlist. For example, <code>IAM_PASSWORD_POLICY</code> is a managed\\n\\t\\t\\trule. To reference a managed rule, see <a href=\\\"https://docs.aws.amazon.com/config/latest/developerguide/managed-rules-by-aws-config.html\\\">List of Config Managed Rules</a>.</p>\\n         <p>For Config Custom Lambda rules, the identifier is the Amazon Resource Name\\n\\t\\t\\t(ARN) of the rule's Lambda function, such as\\n\\t\\t\\t<code>arn:aws:lambda:us-east-2:123456789012:function:custom_rule_name</code>.</p>\\n         <p>For Config Custom Policy rules, this field will be ignored.</p>\"\n                    }\n                },\n                \"SourceDetails\": {\n                    \"target\": \"com.amazonaws.configservice#SourceDetails\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Provides the source and the message types that cause Config to evaluate your Amazon Web Services resources against a rule. It also provides the frequency with which you want Config to run evaluations for the rule if the trigger type is periodic.</p>\\n         <p>If the owner is set to <code>CUSTOM_POLICY</code>, the only acceptable values for the Config rule trigger message type are <code>ConfigurationItemChangeNotification</code> and <code>OversizedConfigurationItemChangeNotification</code>.</p>\"\n                    }\n                },\n                \"CustomPolicyDetails\": {\n                    \"target\": \"com.amazonaws.configservice#CustomPolicyDetails\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Provides the runtime system, policy definition, and whether debug logging is enabled. Required when owner is set to <code>CUSTOM_POLICY</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Provides the CustomPolicyDetails, the rule owner (<code>Amazon Web Services</code> for managed rules, <code>CUSTOM_POLICY</code> for Custom Policy rules, and <code>CUSTOM_LAMBDA</code> for Custom Lambda rules), the rule\\n\\t\\t\\tidentifier, and the events that cause the evaluation of your Amazon Web Services\\n\\t\\t\\tresources.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#SourceDetail\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"EventSource\": {\n                    \"target\": \"com.amazonaws.configservice#EventSource\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The source of the event, such as an Amazon Web Services service, that triggers\\n\\t\\t\\tConfig to evaluate your Amazon Web Services resources.</p>\"\n                    }\n                },\n                \"MessageType\": {\n                    \"target\": \"com.amazonaws.configservice#MessageType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of notification that triggers Config to run an\\n\\t\\t\\tevaluation for a rule. You can specify the following notification\\n\\t\\t\\ttypes:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>ConfigurationItemChangeNotification</code> - Triggers\\n\\t\\t\\t\\t\\tan evaluation when Config delivers a configuration item\\n\\t\\t\\t\\t\\tas a result of a resource change.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>OversizedConfigurationItemChangeNotification</code>\\n\\t\\t\\t\\t\\t- Triggers an evaluation when Config delivers an\\n\\t\\t\\t\\t\\toversized configuration item. Config may generate this\\n\\t\\t\\t\\t\\tnotification type when a resource changes and the\\n\\t\\t\\t\\t\\tnotification exceeds the maximum size allowed by Amazon\\n\\t\\t\\t\\t\\tSNS.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ScheduledNotification</code> - Triggers a\\n\\t\\t\\t\\t\\tperiodic evaluation at the frequency specified for\\n\\t\\t\\t\\t\\t\\t<code>MaximumExecutionFrequency</code>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ConfigurationSnapshotDeliveryCompleted</code> -\\n\\t\\t\\t\\t\\tTriggers a periodic evaluation when Config delivers a\\n\\t\\t\\t\\t\\tconfiguration snapshot.</p>\\n            </li>\\n         </ul>\\n         <p>If you want your custom rule to be triggered by configuration\\n\\t\\t\\tchanges, specify two SourceDetail objects, one for\\n\\t\\t\\t\\t<code>ConfigurationItemChangeNotification</code> and one for\\n\\t\\t\\t\\t<code>OversizedConfigurationItemChangeNotification</code>.</p>\"\n                    }\n                },\n                \"MaximumExecutionFrequency\": {\n                    \"target\": \"com.amazonaws.configservice#MaximumExecutionFrequency\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The frequency at which you want Config to run evaluations\\n\\t\\t\\tfor a custom rule with a periodic trigger. If you specify a value\\n\\t\\t\\tfor <code>MaximumExecutionFrequency</code>, then\\n\\t\\t\\t\\t<code>MessageType</code> must use the\\n\\t\\t\\t\\t<code>ScheduledNotification</code> value.</p>\\n         <note>\\n            <p>By default, rules with a periodic trigger are evaluated\\n\\t\\t\\t\\tevery 24 hours. To change the frequency, specify a valid value\\n\\t\\t\\t\\tfor the <code>MaximumExecutionFrequency</code>\\n\\t\\t\\t\\tparameter.</p>\\n            <p>Based on the valid value you choose, Config runs\\n\\t\\t\\t\\tevaluations once for each valid value. For example, if you\\n\\t\\t\\t\\tchoose <code>Three_Hours</code>, Config runs evaluations\\n\\t\\t\\t\\tonce every three hours. In this case, <code>Three_Hours</code>\\n\\t\\t\\t\\tis the frequency of this rule. </p>\\n         </note>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Provides the source and the message types that trigger Config to evaluate your Amazon Web Services resources against a rule. It also\\n\\t\\t\\tprovides the frequency with which you want Config to run\\n\\t\\t\\tevaluations for the rule if the trigger type is periodic. You can\\n\\t\\t\\tspecify the parameter values for <code>SourceDetail</code> only for\\n\\t\\t\\tcustom rules. </p>\"\n            }\n        },\n        \"com.amazonaws.configservice#SourceDetails\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#SourceDetail\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 25\n                }\n            }\n        },\n        \"com.amazonaws.configservice#SsmControls\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConcurrentExecutionRatePercentage\": {\n                    \"target\": \"com.amazonaws.configservice#Percentage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum percentage of remediation actions allowed to run in parallel on the non-compliant resources for that specific rule. You can specify a percentage, such as 10%. The default value is 10. </p>\"\n                    }\n                },\n                \"ErrorPercentage\": {\n                    \"target\": \"com.amazonaws.configservice#Percentage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The percentage of errors that are allowed before SSM stops running automations on non-compliant resources for that specific rule.\\n\\t\\t\\tYou can specify a percentage of errors, for example 10%. If you do not specifiy a percentage, the default is 50%. \\n\\t\\t\\tFor example, if you set the ErrorPercentage to 40% for 10 non-compliant resources, then SSM stops running the automations when the fifth error is received. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Amazon Web Services Systems Manager (SSM) specific remediation controls.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#StackArn\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 2048\n                }\n            }\n        },\n        \"com.amazonaws.configservice#StarlingDoveService\": {\n            \"type\": \"service\",\n            \"version\": \"2014-11-12\",\n            \"operations\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#AssociateResourceTypes\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#BatchGetAggregateResourceConfig\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#BatchGetResourceConfig\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#DeleteAggregationAuthorization\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#DeleteConfigRule\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#DeleteConfigurationAggregator\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#DeleteConfigurationRecorder\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#DeleteConformancePack\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#DeleteDeliveryChannel\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#DeleteEvaluationResults\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#DeleteOrganizationConfigRule\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#DeleteOrganizationConformancePack\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#DeletePendingAggregationRequest\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#DeleteRemediationConfiguration\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#DeleteRemediationExceptions\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#DeleteResourceConfig\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#DeleteRetentionConfiguration\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#DeleteServiceLinkedConfigurationRecorder\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#DeleteStoredQuery\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#DeliverConfigSnapshot\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#DescribeAggregateComplianceByConfigRules\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#DescribeAggregateComplianceByConformancePacks\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#DescribeAggregationAuthorizations\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#DescribeComplianceByConfigRule\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#DescribeComplianceByResource\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#DescribeConfigRuleEvaluationStatus\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#DescribeConfigRules\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#DescribeConfigurationAggregators\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#DescribeConfigurationAggregatorSourcesStatus\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#DescribeConfigurationRecorders\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#DescribeConfigurationRecorderStatus\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#DescribeConformancePackCompliance\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#DescribeConformancePacks\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#DescribeConformancePackStatus\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#DescribeDeliveryChannels\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#DescribeDeliveryChannelStatus\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#DescribeOrganizationConfigRules\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#DescribeOrganizationConfigRuleStatuses\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#DescribeOrganizationConformancePacks\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#DescribeOrganizationConformancePackStatuses\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#DescribePendingAggregationRequests\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#DescribeRemediationConfigurations\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#DescribeRemediationExceptions\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#DescribeRemediationExecutionStatus\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#DescribeRetentionConfigurations\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#DisassociateResourceTypes\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#GetAggregateComplianceDetailsByConfigRule\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#GetAggregateConfigRuleComplianceSummary\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#GetAggregateConformancePackComplianceSummary\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#GetAggregateDiscoveredResourceCounts\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#GetAggregateResourceConfig\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#GetComplianceDetailsByConfigRule\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#GetComplianceDetailsByResource\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#GetComplianceSummaryByConfigRule\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#GetComplianceSummaryByResourceType\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#GetConformancePackComplianceDetails\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#GetConformancePackComplianceSummary\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#GetCustomRulePolicy\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#GetDiscoveredResourceCounts\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#GetOrganizationConfigRuleDetailedStatus\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#GetOrganizationConformancePackDetailedStatus\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#GetOrganizationCustomRulePolicy\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#GetResourceConfigHistory\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#GetResourceEvaluationSummary\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#GetStoredQuery\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#ListAggregateDiscoveredResources\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#ListConfigurationRecorders\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#ListConformancePackComplianceScores\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#ListDiscoveredResources\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#ListResourceEvaluations\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#ListStoredQueries\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#ListTagsForResource\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#PutAggregationAuthorization\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#PutConfigRule\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#PutConfigurationAggregator\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#PutConfigurationRecorder\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#PutConformancePack\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#PutDeliveryChannel\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#PutEvaluations\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#PutExternalEvaluation\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#PutOrganizationConfigRule\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#PutOrganizationConformancePack\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#PutRemediationConfigurations\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#PutRemediationExceptions\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#PutResourceConfig\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#PutRetentionConfiguration\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#PutServiceLinkedConfigurationRecorder\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#PutStoredQuery\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#SelectAggregateResourceConfig\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#SelectResourceConfig\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#StartConfigRulesEvaluation\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#StartConfigurationRecorder\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#StartRemediationExecution\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#StartResourceEvaluation\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#StopConfigurationRecorder\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#TagResource\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#UntagResource\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#service\": {\n                    \"sdkId\": \"Config Service\",\n                    \"arnNamespace\": \"config\",\n                    \"cloudFormationName\": \"Config\",\n                    \"cloudTrailEventSource\": \"configservice.amazonaws.com\",\n                    \"docId\": \"config-2014-11-12\",\n                    \"endpointPrefix\": \"config\"\n                },\n                \"aws.auth#sigv4\": {\n                    \"name\": \"config\"\n                },\n                \"aws.protocols#awsJson1_1\": {},\n                \"smithy.api#documentation\": \"<fullname>Config</fullname>\\n         <p>Config provides a way to keep track of the configurations\\n\\t\\t\\tof all the Amazon Web Services resources associated with your Amazon Web Services account. You can\\n\\t\\t\\tuse Config to get the current and historical configurations of\\n\\t\\t\\teach Amazon Web Services resource and also to get information about the relationship\\n\\t\\t\\tbetween the resources. An Amazon Web Services resource can be an Amazon Compute\\n\\t\\t\\tCloud (Amazon EC2) instance, an Elastic Block Store (EBS) volume, an\\n\\t\\t\\telastic network Interface (ENI), or a security group. For a complete\\n\\t\\t\\tlist of resources currently supported by Config, see <a href=\\\"https://docs.aws.amazon.com/config/latest/developerguide/resource-config-reference.html#supported-resources\\\">Supported Amazon Web Services resources</a>.</p>\\n         <p>You can access and manage Config through the Amazon Web Services Management\\n\\t\\t\\tConsole, the Amazon Web Services Command Line Interface (Amazon Web Services CLI), the Config\\n\\t\\t\\tAPI, or the Amazon Web Services SDKs for Config. This reference guide contains\\n\\t\\t\\tdocumentation for the Config API and the Amazon Web Services CLI commands that\\n\\t\\t\\tyou can use to manage Config. The Config API uses the\\n\\t\\t\\tSignature Version 4 protocol for signing requests. For more\\n\\t\\t\\tinformation about how to sign a request with this protocol, see\\n\\t\\t\\t\\t<a href=\\\"https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html\\\">Signature\\n\\t\\t\\t\\tVersion 4 Signing Process</a>. For detailed information\\n\\t\\t\\tabout Config features and their associated actions or commands,\\n\\t\\t\\tas well as how to work with Amazon Web Services Management Console, see <a href=\\\"https://docs.aws.amazon.com/config/latest/developerguide/WhatIsConfig.html\\\">What Is Config</a> in the <i>Config Developer\\n\\t\\t\\t\\tGuide</i>.</p>\",\n                \"smithy.api#title\": \"AWS Config\",\n                \"smithy.api#xmlNamespace\": {\n                    \"uri\": \"http://config.amazonaws.com/doc/2014-11-12/\"\n                },\n                \"smithy.rules#endpointRuleSet\": {\n                    \"version\": \"1.0\",\n                    \"parameters\": {\n                        \"Region\": {\n                            \"builtIn\": \"AWS::Region\",\n                            \"required\": false,\n                            \"documentation\": \"The AWS region used to dispatch the request.\",\n                            \"type\": \"String\"\n                        },\n                        \"UseDualStack\": {\n                            \"builtIn\": \"AWS::UseDualStack\",\n                            \"required\": true,\n                            \"default\": false,\n                            \"documentation\": \"When true, use the dual-stack endpoint. If the configured endpoint does not support dual-stack, dispatching the request MAY return an error.\",\n                            \"type\": \"Boolean\"\n                        },\n                        \"UseFIPS\": {\n                            \"builtIn\": \"AWS::UseFIPS\",\n                            \"required\": true,\n                            \"default\": false,\n                            \"documentation\": \"When true, send this request to the FIPS-compliant regional endpoint. If the configured endpoint does not have a FIPS compliant endpoint, dispatching the request will return an error.\",\n                            \"type\": \"Boolean\"\n                        },\n                        \"Endpoint\": {\n                            \"builtIn\": \"SDK::Endpoint\",\n                            \"required\": false,\n                            \"documentation\": \"Override the endpoint used to send this request\",\n                            \"type\": \"String\"\n                        }\n                    },\n                    \"rules\": [\n                        {\n                            \"conditions\": [\n                                {\n                                    \"fn\": \"isSet\",\n                                    \"argv\": [\n                                        {\n                                            \"ref\": \"Endpoint\"\n                                        }\n                                    ]\n                                }\n                            ],\n                            \"rules\": [\n                                {\n                                    \"conditions\": [\n                                        {\n                                            \"fn\": \"booleanEquals\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"UseFIPS\"\n                                                },\n                                                true\n                                            ]\n                                        }\n                                    ],\n                                    \"error\": \"Invalid Configuration: FIPS and custom endpoint are not supported\",\n                                    \"type\": \"error\"\n                                },\n                                {\n                                    \"conditions\": [\n                                        {\n                                            \"fn\": \"booleanEquals\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"UseDualStack\"\n                                                },\n                                                true\n                                            ]\n                                        }\n                                    ],\n                                    \"error\": \"Invalid Configuration: Dualstack and custom endpoint are not supported\",\n                                    \"type\": \"error\"\n                                },\n                                {\n                                    \"conditions\": [],\n                                    \"endpoint\": {\n                                        \"url\": {\n                                            \"ref\": \"Endpoint\"\n                                        },\n                                        \"properties\": {},\n                                        \"headers\": {}\n                                    },\n                                    \"type\": \"endpoint\"\n                                }\n                            ],\n                            \"type\": \"tree\"\n                        },\n                        {\n                            \"conditions\": [\n                                {\n                                    \"fn\": \"isSet\",\n                                    \"argv\": [\n                                        {\n                                            \"ref\": \"Region\"\n                                        }\n                                    ]\n                                }\n                            ],\n                            \"rules\": [\n                                {\n                                    \"conditions\": [\n                                        {\n                                            \"fn\": \"aws.partition\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"Region\"\n                                                }\n                                            ],\n                                            \"assign\": \"PartitionResult\"\n                                        }\n                                    ],\n                                    \"rules\": [\n                                        {\n                                            \"conditions\": [\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseFIPS\"\n                                                        },\n                                                        true\n                                                    ]\n                                                },\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseDualStack\"\n                                                        },\n                                                        true\n                                                    ]\n                                                }\n                                            ],\n                                            \"rules\": [\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                true,\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"PartitionResult\"\n                                                                        },\n                                                                        \"supportsFIPS\"\n                                                                    ]\n                                                                }\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                true,\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"PartitionResult\"\n                                                                        },\n                                                                        \"supportsDualStack\"\n                                                                    ]\n                                                                }\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"rules\": [\n                                                        {\n                                                            \"conditions\": [],\n                                                            \"endpoint\": {\n                                                                \"url\": \"https://config-fips.{Region}.{PartitionResult#dualStackDnsSuffix}\",\n                                                                \"properties\": {},\n                                                                \"headers\": {}\n                                                            },\n                                                            \"type\": \"endpoint\"\n                                                        }\n                                                    ],\n                                                    \"type\": \"tree\"\n                                                },\n                                                {\n                                                    \"conditions\": [],\n                                                    \"error\": \"FIPS and DualStack are enabled, but this partition does not support one or both\",\n                                                    \"type\": \"error\"\n                                                }\n                                            ],\n                                            \"type\": \"tree\"\n                                        },\n                                        {\n                                            \"conditions\": [\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseFIPS\"\n                                                        },\n                                                        true\n                                                    ]\n                                                }\n                                            ],\n                                            \"rules\": [\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"PartitionResult\"\n                                                                        },\n                                                                        \"supportsFIPS\"\n                                                                    ]\n                                                                },\n                                                                true\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"rules\": [\n                                                        {\n                                                            \"conditions\": [\n                                                                {\n                                                                    \"fn\": \"stringEquals\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"fn\": \"getAttr\",\n                                                                            \"argv\": [\n                                                                                {\n                                                                                    \"ref\": \"PartitionResult\"\n                                                                                },\n                                                                                \"name\"\n                                                                            ]\n                                                                        },\n                                                                        \"aws-us-gov\"\n                                                                    ]\n                                                                }\n                                                            ],\n                                                            \"endpoint\": {\n                                                                \"url\": \"https://config.{Region}.amazonaws.com\",\n                                                                \"properties\": {},\n                                                                \"headers\": {}\n                                                            },\n                                                            \"type\": \"endpoint\"\n                                                        },\n                                                        {\n                                                            \"conditions\": [],\n                                                            \"endpoint\": {\n                                                                \"url\": \"https://config-fips.{Region}.{PartitionResult#dnsSuffix}\",\n                                                                \"properties\": {},\n                                                                \"headers\": {}\n                                                            },\n                                                            \"type\": \"endpoint\"\n                                                        }\n                                                    ],\n                                                    \"type\": \"tree\"\n                                                },\n                                                {\n                                                    \"conditions\": [],\n                                                    \"error\": \"FIPS is enabled but this partition does not support FIPS\",\n                                                    \"type\": \"error\"\n                                                }\n                                            ],\n                                            \"type\": \"tree\"\n                                        },\n                                        {\n                                            \"conditions\": [\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseDualStack\"\n                                                        },\n                                                        true\n                                                    ]\n                                                }\n                                            ],\n                                            \"rules\": [\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                true,\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"PartitionResult\"\n                                                                        },\n                                                                        \"supportsDualStack\"\n                                                                    ]\n                                                                }\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"rules\": [\n                                                        {\n                                                            \"conditions\": [],\n                                                            \"endpoint\": {\n                                                                \"url\": \"https://config.{Region}.{PartitionResult#dualStackDnsSuffix}\",\n                                                                \"properties\": {},\n                                                                \"headers\": {}\n                                                            },\n                                                            \"type\": \"endpoint\"\n                                                        }\n                                                    ],\n                                                    \"type\": \"tree\"\n                                                },\n                                                {\n                                                    \"conditions\": [],\n                                                    \"error\": \"DualStack is enabled but this partition does not support DualStack\",\n                                                    \"type\": \"error\"\n                                                }\n                                            ],\n                                            \"type\": \"tree\"\n                                        },\n                                        {\n                                            \"conditions\": [],\n                                            \"endpoint\": {\n                                                \"url\": \"https://config.{Region}.{PartitionResult#dnsSuffix}\",\n                                                \"properties\": {},\n                                                \"headers\": {}\n                                            },\n                                            \"type\": \"endpoint\"\n                                        }\n                                    ],\n                                    \"type\": \"tree\"\n                                }\n                            ],\n                            \"type\": \"tree\"\n                        },\n                        {\n                            \"conditions\": [],\n                            \"error\": \"Invalid Configuration: Missing Region\",\n                            \"type\": \"error\"\n                        }\n                    ]\n                },\n                \"smithy.rules#endpointTests\": {\n                    \"testCases\": [\n                        {\n                            \"documentation\": \"For region af-south-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://config.af-south-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"af-south-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://config.ap-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-northeast-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://config.ap-northeast-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-northeast-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-northeast-2 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://config.ap-northeast-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-northeast-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-northeast-3 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://config.ap-northeast-3.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-northeast-3\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-south-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://config.ap-south-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-south-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-southeast-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://config.ap-southeast-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-southeast-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-southeast-2 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://config.ap-southeast-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-southeast-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-southeast-3 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://config.ap-southeast-3.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-southeast-3\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ca-central-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://config.ca-central-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ca-central-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-central-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://config.eu-central-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-central-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-north-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://config.eu-north-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-north-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-south-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://config.eu-south-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-south-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-west-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://config.eu-west-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-west-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-west-2 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://config.eu-west-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-west-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-west-3 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://config.eu-west-3.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-west-3\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region me-south-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://config.me-south-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"me-south-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region sa-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://config.sa-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"sa-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://config.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://config-fips.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-2 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://config.us-east-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-2 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://config-fips.us-east-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-2\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-west-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://config.us-west-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-west-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-west-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://config-fips.us-west-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-west-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-west-2 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://config.us-west-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-west-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-west-2 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://config-fips.us-west-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-west-2\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-1 with FIPS enabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://config-fips.us-east-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-1 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://config.us-east-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-north-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://config.cn-north-1.amazonaws.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-north-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-northwest-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://config.cn-northwest-1.amazonaws.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-northwest-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-north-1 with FIPS enabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://config-fips.cn-north-1.api.amazonwebservices.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-north-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-north-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://config-fips.cn-north-1.amazonaws.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-north-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-north-1 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://config.cn-north-1.api.amazonwebservices.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-north-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://config.us-gov-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-east-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://config.us-gov-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-west-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://config.us-gov-west-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-west-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-west-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://config.us-gov-west-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-west-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-east-1 with FIPS enabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://config-fips.us-gov-east-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-east-1 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://config.us-gov-east-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-iso-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://config.us-iso-east-1.c2s.ic.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-iso-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-iso-west-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://config.us-iso-west-1.c2s.ic.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-iso-west-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-iso-east-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://config-fips.us-iso-east-1.c2s.ic.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-iso-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-isob-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://config.us-isob-east-1.sc2s.sgov.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-isob-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-isob-east-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://config-fips.us-isob-east-1.sc2s.sgov.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-isob-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For custom endpoint with region set and fips disabled and dualstack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://example.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"For custom endpoint with region not set and fips disabled and dualstack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://example.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"For custom endpoint with fips enabled and dualstack disabled\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: FIPS and custom endpoint are not supported\"\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false,\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"For custom endpoint with fips disabled and dualstack enabled\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: Dualstack and custom endpoint are not supported\"\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true,\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"Missing region\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: Missing Region\"\n                            }\n                        }\n                    ],\n                    \"version\": \"1.0\"\n                }\n            }\n        },\n        \"com.amazonaws.configservice#StartConfigRulesEvaluation\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#StartConfigRulesEvaluationRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.configservice#StartConfigRulesEvaluationResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#NoSuchConfigRuleException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#ResourceInUseException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Runs an on-demand evaluation for the specified Config rules\\n\\t\\t\\tagainst the last known configuration state of the resources. Use\\n\\t\\t\\t\\t<code>StartConfigRulesEvaluation</code> when you want to test\\n\\t\\t\\tthat a rule you updated is working as expected.\\n\\t\\t\\t\\t<code>StartConfigRulesEvaluation</code> does not re-record the\\n\\t\\t\\tlatest configuration state for your resources. It re-runs an\\n\\t\\t\\tevaluation against the last known state of your resources. </p>\\n         <p>You can specify up to 25 Config rules per request. </p>\\n         <p>An existing <code>StartConfigRulesEvaluation</code> call for\\n\\t\\t\\tthe specified rules must complete before you can call the API again.\\n\\t\\t\\tIf you chose to have Config stream to an Amazon SNS topic, you\\n\\t\\t\\twill receive a <code>ConfigRuleEvaluationStarted</code> notification\\n\\t\\t\\twhen the evaluation starts.</p>\\n         <note>\\n            <p>You don't need to call the\\n\\t\\t\\t\\t\\t<code>StartConfigRulesEvaluation</code> API to run an\\n\\t\\t\\t\\tevaluation for a new rule. When you create a rule, Config\\n\\t\\t\\t\\tevaluates your resources against the rule automatically.\\n\\t\\t\\t</p>\\n         </note>\\n         <p>The <code>StartConfigRulesEvaluation</code> API is useful if\\n\\t\\t\\tyou want to run on-demand evaluations, such as the following\\n\\t\\t\\texample:</p>\\n         <ol>\\n            <li>\\n               <p>You have a custom rule that evaluates your IAM\\n\\t\\t\\t\\t\\tresources every 24 hours.</p>\\n            </li>\\n            <li>\\n               <p>You update your Lambda function to add additional\\n\\t\\t\\t\\t\\tconditions to your rule.</p>\\n            </li>\\n            <li>\\n               <p>Instead of waiting for the next periodic evaluation,\\n\\t\\t\\t\\t\\tyou call the <code>StartConfigRulesEvaluation</code>\\n\\t\\t\\t\\t\\tAPI.</p>\\n            </li>\\n            <li>\\n               <p>Config invokes your Lambda function and evaluates\\n\\t\\t\\t\\t\\tyour IAM resources.</p>\\n            </li>\\n            <li>\\n               <p>Your custom rule will still run periodic evaluations\\n\\t\\t\\t\\t\\tevery 24 hours.</p>\\n            </li>\\n         </ol>\"\n            }\n        },\n        \"com.amazonaws.configservice#StartConfigRulesEvaluationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConfigRuleNames\": {\n                    \"target\": \"com.amazonaws.configservice#ReevaluateConfigRuleNames\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The list of names of Config rules that you want to run\\n\\t\\t\\tevaluations for.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p></p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#StartConfigRulesEvaluationResponse\": {\n            \"type\": \"structure\",\n            \"members\": {},\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The output when you start the evaluation for the specified Config rule.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.configservice#StartConfigurationRecorder\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#StartConfigurationRecorderRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#NoAvailableDeliveryChannelException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#NoSuchConfigurationRecorderException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#UnmodifiableEntityException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Starts the customer managed configuration recorder. The customer managed configuration recorder will begin recording configuration changes for the resource types you specify.</p>\\n         <p>You must have created a delivery channel to\\n\\t\\t\\tsuccessfully start the customer managed configuration recorder. You can use the <a href=\\\"https://docs.aws.amazon.com/config/latest/APIReference/API_PutDeliveryChannel.html\\\">PutDeliveryChannel</a> operation to create a delivery channel.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#StartConfigurationRecorderRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConfigurationRecorderName\": {\n                    \"target\": \"com.amazonaws.configservice#RecorderName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the customer managed configuration recorder that you want to start.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The input for the <a>StartConfigurationRecorder</a>\\n\\t\\t\\toperation.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#StartRemediationExecution\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#StartRemediationExecutionRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.configservice#StartRemediationExecutionResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#InsufficientPermissionsException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#NoSuchRemediationConfigurationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Runs an on-demand remediation for the specified Config rules against the last known remediation configuration. It runs an execution against the current state of your resources. Remediation execution is asynchronous.</p>\\n         <p>You can specify up to 100 resource keys per request. An existing StartRemediationExecution call for the specified resource keys must complete before you can call the API again.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#StartRemediationExecutionRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConfigRuleName\": {\n                    \"target\": \"com.amazonaws.configservice#ConfigRuleName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The list of names of Config rules that you want to run remediation execution for.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ResourceKeys\": {\n                    \"target\": \"com.amazonaws.configservice#ResourceKeys\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of resource keys to be processed with the current request. Each element in the list consists of the resource type and resource ID. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#StartRemediationExecutionResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"FailureMessage\": {\n                    \"target\": \"com.amazonaws.configservice#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Returns a failure message. For example, the resource is already compliant.</p>\"\n                    }\n                },\n                \"FailedItems\": {\n                    \"target\": \"com.amazonaws.configservice#ResourceKeys\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>For resources that have failed to start execution, the API returns a resource key object.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.configservice#StartResourceEvaluation\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#StartResourceEvaluationRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.configservice#StartResourceEvaluationResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#IdempotentParameterMismatch\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#InvalidParameterValueException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Runs an on-demand evaluation for the specified resource to determine whether the resource details will comply with configured Config rules.\\n\\t\\t\\tYou can also use it for evaluation purposes. Config recommends using an evaluation context. It runs an execution against the resource details with all\\n\\t\\t\\tof the Config rules in your account that match with the specified proactive mode and resource type.</p>\\n         <note>\\n            <p>Ensure you have the <code>cloudformation:DescribeType</code> role setup to validate the resource type schema.</p>\\n            <p>You can find the\\n\\t\\t\\t\\t<a href=\\\"https://docs.aws.amazon.com/cloudformation-cli/latest/userguide/resource-type-schema.html\\\">Resource type schema</a> in \\\"<i>Amazon Web Services public extensions</i>\\\" within the CloudFormation registry or with the following CLI commmand:\\n\\t\\t\\t<code>aws cloudformation describe-type --type-name \\\"AWS::S3::Bucket\\\" --type RESOURCE</code>.</p>\\n            <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/registry.html#registry-view\\\">Managing extensions through the CloudFormation registry</a>\\n\\t\\t\\tand <a href=\\\"https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-template-resource-type-ref.html\\\">Amazon Web Services resource and property types reference</a> in the CloudFormation User Guide.</p>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.configservice#StartResourceEvaluationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ResourceDetails\": {\n                    \"target\": \"com.amazonaws.configservice#ResourceDetails\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Returns a <code>ResourceDetails</code> object.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"EvaluationContext\": {\n                    \"target\": \"com.amazonaws.configservice#EvaluationContext\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Returns an <code>EvaluationContext</code> object.</p>\"\n                    }\n                },\n                \"EvaluationMode\": {\n                    \"target\": \"com.amazonaws.configservice#EvaluationMode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The mode of an evaluation.</p>\\n         <note>\\n            <p>The only valid value for this API is <code>PROACTIVE</code>.</p>\\n         </note>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"EvaluationTimeout\": {\n                    \"target\": \"com.amazonaws.configservice#EvaluationTimeout\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The timeout for an evaluation. The default is 900 seconds. You cannot specify a number greater than 3600. If you specify 0, Config uses the default.</p>\"\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.configservice#ClientToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A client token is a unique, case-sensitive string of up to 64 ASCII characters. \\n\\t\\t\\tTo make an idempotent API request using one of these actions, specify a client token in the request.</p>\\n         <note>\\n            <p>Avoid reusing the same client token for other API requests. If you retry\\n\\t\\t\\t\\ta request that completed successfully using the same client token and the same\\n\\t\\t\\t\\tparameters, the retry succeeds without performing any further actions. If you retry\\n\\t\\t\\t\\ta successful request using the same client token, but one or more of the parameters\\n\\t\\t\\t\\tare different, other than the Region or Availability Zone, the retry fails with an\\n\\t\\t\\t\\tIdempotentParameterMismatch error.</p>\\n         </note>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#StartResourceEvaluationResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ResourceEvaluationId\": {\n                    \"target\": \"com.amazonaws.configservice#ResourceEvaluationId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A\\n\\t\\t\\tunique ResourceEvaluationId that is associated with a single execution.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.configservice#StaticParameterValues\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#StringWithCharLimit256\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 25\n                }\n            }\n        },\n        \"com.amazonaws.configservice#StaticValue\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Values\": {\n                    \"target\": \"com.amazonaws.configservice#StaticParameterValues\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of values. For example, the ARN of the assumed role. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The static value of the resource.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#StatusDetailFilters\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.configservice#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The 12-digit account ID of the member account within an organization.</p>\"\n                    }\n                },\n                \"MemberAccountRuleStatus\": {\n                    \"target\": \"com.amazonaws.configservice#MemberAccountRuleStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates deployment status for Config rule in the member account.\\n\\t\\t\\tWhen management account calls <code>PutOrganizationConfigRule</code> action for the first time, Config rule status is created in the member account. \\n\\t\\t\\tWhen management account calls <code>PutOrganizationConfigRule</code> action for the second time, Config rule status is updated in the member account.   \\n\\t\\t\\tConfig rule status is deleted when the management account deletes <code>OrganizationConfigRule</code> and disables service access for <code>config-multiaccountsetup.amazonaws.com</code>. \\n\\t\\t\\t</p>\\n         <p>Config sets the state of the rule to:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>CREATE_SUCCESSFUL</code> when Config rule has been created in the member account.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>CREATE_IN_PROGRESS</code> when Config rule is being created in the member account.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>CREATE_FAILED</code> when Config rule creation has failed in the member account.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>DELETE_FAILED</code> when Config rule deletion has failed in the member account.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>DELETE_IN_PROGRESS</code> when Config rule is being deleted in the member account.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>DELETE_SUCCESSFUL</code> when Config rule has been deleted in the member account.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>UPDATE_SUCCESSFUL</code> when Config rule has been updated in the member account.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>UPDATE_IN_PROGRESS</code> when Config rule is being updated in the member account.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>UPDATE_FAILED</code> when Config rule deletion has failed in the member account.</p>\\n            </li>\\n         </ul>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Status filter object to filter results based on specific member account ID or status type for an organization Config rule. </p>\"\n            }\n        },\n        \"com.amazonaws.configservice#StopConfigurationRecorder\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#StopConfigurationRecorderRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#NoSuchConfigurationRecorderException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#UnmodifiableEntityException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Stops the customer managed configuration recorder. The customer managed configuration recorder will stop recording configuration changes for the resource types you have specified.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#StopConfigurationRecorderRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConfigurationRecorderName\": {\n                    \"target\": \"com.amazonaws.configservice#RecorderName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the customer managed configuration recorder that you want to stop.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The input for the <a>StopConfigurationRecorder</a> operation.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#StoredQuery\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"QueryId\": {\n                    \"target\": \"com.amazonaws.configservice#QueryId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the query.</p>\"\n                    }\n                },\n                \"QueryArn\": {\n                    \"target\": \"com.amazonaws.configservice#QueryArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Amazon Resource Name (ARN) of the query. For example, arn:partition:service:region:account-id:resource-type/resource-name/resource-id.</p>\"\n                    }\n                },\n                \"QueryName\": {\n                    \"target\": \"com.amazonaws.configservice#QueryName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the query.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.configservice#QueryDescription\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A unique description for the query.</p>\"\n                    }\n                },\n                \"Expression\": {\n                    \"target\": \"com.amazonaws.configservice#QueryExpression\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The expression of the query. For example, <code>SELECT\\n\\t\\t\\tresourceId,\\n\\t\\t\\tresourceType,\\n\\t\\t\\tsupplementaryConfiguration.BucketVersioningConfiguration.status\\n\\t\\t\\tWHERE\\n\\t\\t\\tresourceType = 'AWS::S3::Bucket'\\n\\t\\t\\tAND supplementaryConfiguration.BucketVersioningConfiguration.status = 'Off'.</code>\\n         </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Provides the details of a stored query.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#StoredQueryMetadata\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"QueryId\": {\n                    \"target\": \"com.amazonaws.configservice#QueryId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the query. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"QueryArn\": {\n                    \"target\": \"com.amazonaws.configservice#QueryArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Amazon Resource Name (ARN) of the query. For example, arn:partition:service:region:account-id:resource-type/resource-name/resource-id.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"QueryName\": {\n                    \"target\": \"com.amazonaws.configservice#QueryName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the query.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.configservice#QueryDescription\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A unique description for the query.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns details of a specific query. </p>\"\n            }\n        },\n        \"com.amazonaws.configservice#StoredQueryMetadataList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#StoredQueryMetadata\"\n            }\n        },\n        \"com.amazonaws.configservice#String\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.configservice#StringWithCharLimit1024\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 1024\n                }\n            }\n        },\n        \"com.amazonaws.configservice#StringWithCharLimit128\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 128\n                }\n            }\n        },\n        \"com.amazonaws.configservice#StringWithCharLimit2048\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 2048\n                }\n            }\n        },\n        \"com.amazonaws.configservice#StringWithCharLimit256\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 256\n                }\n            }\n        },\n        \"com.amazonaws.configservice#StringWithCharLimit256Min0\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 256\n                }\n            }\n        },\n        \"com.amazonaws.configservice#StringWithCharLimit64\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 64\n                }\n            }\n        },\n        \"com.amazonaws.configservice#StringWithCharLimit768\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 768\n                }\n            }\n        },\n        \"com.amazonaws.configservice#SupplementaryConfiguration\": {\n            \"type\": \"map\",\n            \"key\": {\n                \"target\": \"com.amazonaws.configservice#SupplementaryConfigurationName\"\n            },\n            \"value\": {\n                \"target\": \"com.amazonaws.configservice#SupplementaryConfigurationValue\"\n            }\n        },\n        \"com.amazonaws.configservice#SupplementaryConfigurationName\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.configservice#SupplementaryConfigurationValue\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.configservice#Tag\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Key\": {\n                    \"target\": \"com.amazonaws.configservice#TagKey\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One part of a key-value pair that make up a tag. A key is a general label that acts like a category for more specific tag values.</p>\"\n                    }\n                },\n                \"Value\": {\n                    \"target\": \"com.amazonaws.configservice#TagValue\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The optional part of a key-value pair that make up a tag. A value acts as a descriptor within a tag category (key).</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The tags for the resource. The metadata that you apply to a resource to help you categorize and organize them. \\n\\t\\t\\tEach tag consists of a key and an optional value, both of which you define. \\n\\t\\t\\tTag keys can have a maximum character length of 128 characters, and tag values can have a maximum length of 256 characters.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#TagKey\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 128\n                }\n            }\n        },\n        \"com.amazonaws.configservice#TagKeyList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#TagKey\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 50\n                }\n            }\n        },\n        \"com.amazonaws.configservice#TagList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#Tag\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 50\n                }\n            }\n        },\n        \"com.amazonaws.configservice#TagResource\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#TagResourceRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#TooManyTagsException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Associates the specified tags to a resource with the specified <code>ResourceArn</code>. If existing tags on a resource are not specified in the request parameters, they are not changed.\\n\\t\\t\\tIf existing tags are specified, however, then their values will be updated. When a resource is deleted, the tags associated with that resource are deleted as well.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#TagResourceRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ResourceArn\": {\n                    \"target\": \"com.amazonaws.configservice#AmazonResourceName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) that identifies the resource for which to list the tags. The following resources are supported:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>ConfigurationRecorder</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ConfigRule</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>OrganizationConfigRule</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ConformancePack</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>OrganizationConformancePack</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ConfigurationAggregator</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>AggregationAuthorization</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>StoredQuery</code>\\n               </p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.configservice#TagList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An array of tag object.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#TagValue\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 256\n                }\n            }\n        },\n        \"com.amazonaws.configservice#Tags\": {\n            \"type\": \"map\",\n            \"key\": {\n                \"target\": \"com.amazonaws.configservice#Name\"\n            },\n            \"value\": {\n                \"target\": \"com.amazonaws.configservice#Value\"\n            }\n        },\n        \"com.amazonaws.configservice#TagsList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#Tag\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 50\n                }\n            }\n        },\n        \"com.amazonaws.configservice#TemplateBody\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 51200\n                }\n            }\n        },\n        \"com.amazonaws.configservice#TemplateS3Uri\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 1024\n                },\n                \"smithy.api#pattern\": \"^s3://\"\n            }\n        },\n        \"com.amazonaws.configservice#TemplateSSMDocumentDetails\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DocumentName\": {\n                    \"target\": \"com.amazonaws.configservice#SSMDocumentName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name or Amazon Resource Name (ARN) of the SSM document to use to create a conformance pack.\\n\\t\\t\\tIf you use the document name, Config checks only your account and Amazon Web Services Region for the SSM document.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DocumentVersion\": {\n                    \"target\": \"com.amazonaws.configservice#SSMDocumentVersion\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The version of the SSM document to use to create a conformance pack. By default, Config uses the latest version.</p>\\n         <note>\\n            <p>This field is optional.</p>\\n         </note>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This API allows you to create a conformance pack template with an Amazon Web Services Systems Manager document (SSM document). \\n\\t\\t\\tTo deploy a conformance pack using an SSM document, first create an SSM document with conformance pack content, and then provide the <code>DocumentName</code> in the <a href=\\\"https://docs.aws.amazon.com/config/latest/APIReference/API_PutConformancePack.html\\\">PutConformancePack API</a>. You can also provide the <code>DocumentVersion</code>.</p>\\n         <p>The <code>TemplateSSMDocumentDetails</code> object contains the name of the SSM document and the version of the SSM document.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#TimeWindow\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"StartTime\": {\n                    \"target\": \"com.amazonaws.configservice#Date\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The start time of an execution.</p>\"\n                    }\n                },\n                \"EndTime\": {\n                    \"target\": \"com.amazonaws.configservice#Date\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The end time of an execution. The end time must be after the start date.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Filters evaluation results based on start and end times.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#TooManyTagsException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.configservice#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Error executing the command</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>You have reached the limit of the number of tags you can use. \\n\\t\\t\\tFor more information, see <a href=\\\"https://docs.aws.amazon.com/config/latest/developerguide/configlimits.html\\\">\\n               <b>Service Limits</b>\\n            </a> in the <i>Config Developer Guide</i>.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.configservice#UnmodifiableEntityException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.configservice#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Error executing the command</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The requested operation is not valid.</p>\\n         <p>For <a href=\\\"https://docs.aws.amazon.com/config/latest/APIReference/API_PutConfigurationRecorder.html\\\">PutConfigurationRecorder</a>,\\n\\t\\t\\tyou will see this exception because you cannot use this operation to create a service-linked configuration recorder. Use the <a href=\\\"https://docs.aws.amazon.com/config/latest/APIReference/API_PutServiceLinkedConfigurationRecorder.html\\\">PutServiceLinkedConfigurationRecorder</a> operation to create a service-linked configuration\\n\\t\\t\\trecorder.</p>\\n         <p>For <a href=\\\"https://docs.aws.amazon.com/config/latest/APIReference/API_DeleteConfigurationRecorder.html\\\">DeleteConfigurationRecorder</a>, you will see this exception because you cannot use this operation to delete a service-linked configuration recorder. Use the <a href=\\\"https://docs.aws.amazon.com/config/latest/APIReference/API_DeleteServiceLinkedConfigurationRecorder.html\\\">DeleteServiceLinkedConfigurationRecorder</a> operation to delete a service-linked configuration\\n\\t\\t\\trecorder.</p>\\n         <p>For <a href=\\\"https://docs.aws.amazon.com/config/latest/APIReference/API_StartConfigurationRecorder.html\\\">StartConfigurationRecorder</a> and <a href=\\\"https://docs.aws.amazon.com/config/latest/APIReference/API_StopConfigurationRecorder.html\\\">StopConfigurationRecorder</a>, you will see this exception because these operations do not affect service-linked configuration recorders.\\n\\t\\t\\tService-linked configuration recorders are always recording. To stop recording, you must delete the service-linked configuration recorder. Use the <a href=\\\"https://docs.aws.amazon.com/config/latest/APIReference/API_DeleteServiceLinkedConfigurationRecorder.html\\\">DeleteServiceLinkedConfigurationRecorder</a> operation to delete a service-linked configuration\\n\\t\\t\\trecorder.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.configservice#UnprocessedResourceIdentifierList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.configservice#AggregateResourceIdentifier\"\n            }\n        },\n        \"com.amazonaws.configservice#UntagResource\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.configservice#UntagResourceRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.configservice#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.configservice#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes specified tags from a resource.</p>\"\n            }\n        },\n        \"com.amazonaws.configservice#UntagResourceRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ResourceArn\": {\n                    \"target\": \"com.amazonaws.configservice#AmazonResourceName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) that identifies the resource for which to list the tags. The following resources are supported:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>ConfigurationRecorder</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ConfigRule</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>OrganizationConfigRule</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ConformancePack</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>OrganizationConformancePack</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ConfigurationAggregator</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>AggregationAuthorization</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>StoredQuery</code>\\n               </p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TagKeys\": {\n                    \"target\": \"com.amazonaws.configservice#TagKeyList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The keys of the tags to be removed.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.configservice#ValidationException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.configservice#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Error executing the command</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The requested operation is not valid. You will see this exception if there are missing required fields or if the input value fails the validation.</p>\\n         <p>For <a href=\\\"https://docs.aws.amazon.com/config/latest/APIReference/API_PutStoredQuery.html\\\">PutStoredQuery</a>, one of the following errors:</p>\\n         <ul>\\n            <li>\\n               <p>There are missing required fields.</p>\\n            </li>\\n            <li>\\n               <p>The input value fails the validation.</p>\\n            </li>\\n            <li>\\n               <p>You are trying to create more than 300 queries.</p>\\n            </li>\\n         </ul>\\n         <p>For <a href=\\\"https://docs.aws.amazon.com/config/latest/APIReference/API_DescribeConfigurationRecorders.html\\\">DescribeConfigurationRecorders</a> and <a href=\\\"https://docs.aws.amazon.com/config/latest/APIReference/API_DescribeConfigurationRecorderStatus.html\\\">DescribeConfigurationRecorderStatus</a>, one of the following errors:</p>\\n         <ul>\\n            <li>\\n               <p>You have specified more than one configuration recorder.</p>\\n            </li>\\n            <li>\\n               <p>You have provided a service principal for service-linked configuration recorder that is not valid.</p>\\n            </li>\\n         </ul>\\n         <p>For <a href=\\\"https://docs.aws.amazon.com/config/latest/APIReference/API_AssociateResourceTypes.html\\\">AssociateResourceTypes</a> and <a href=\\\"https://docs.aws.amazon.com/config/latest/APIReference/API_DisassociateResourceTypes.html\\\">DisassociateResourceTypes</a>, one of the following errors:</p>\\n         <ul>\\n            <li>\\n               <p>Your configuraiton recorder has a recording strategy that does not allow the association or disassociation of resource types.</p>\\n            </li>\\n            <li>\\n               <p>One or more of the specified resource types are already associated or disassociated with the configuration recorder.</p>\\n            </li>\\n            <li>\\n               <p>For service-linked configuration recorders, the configuration recorder does not record one or more of the specified resource types.</p>\\n            </li>\\n         </ul>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.configservice#Value\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.configservice#Version\": {\n            \"type\": \"string\"\n        }\n    }\n}\n"
  },
  {
    "path": "aws/sdk/aws-models/dynamodb.json",
    "content": "{\n    \"smithy\": \"2.0\",\n    \"metadata\": {\n        \"suppressions\": [\n            {\n                \"id\": \"HttpMethodSemantics\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"HttpResponseCodeSemantics\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"PaginatedTrait\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"HttpHeaderTrait\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"HttpUriConflict\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"Service\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"RuleSetAwsBuiltIn.AWS::Auth::AccountIdEndpointMode\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"RuleSetAwsBuiltIn.AWS::Auth::AccountId\",\n                \"namespace\": \"*\"\n            }\n        ]\n    },\n    \"shapes\": {\n        \"com.amazonaws.dynamodb#ApproximateCreationDateTimePrecision\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"MILLISECOND\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"MILLISECOND\"\n                    }\n                },\n                \"MICROSECOND\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"MICROSECOND\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#ArchivalReason\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.dynamodb#ArchivalSummary\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ArchivalDateTime\": {\n                    \"target\": \"com.amazonaws.dynamodb#Date\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time when table archival was initiated by DynamoDB, in UNIX epoch time\\n            format.</p>\"\n                    }\n                },\n                \"ArchivalReason\": {\n                    \"target\": \"com.amazonaws.dynamodb#ArchivalReason\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The reason DynamoDB archived the table. Currently, the only possible value is:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>INACCESSIBLE_ENCRYPTION_CREDENTIALS</code> - The table was archived due\\n                    to the table's KMS key being inaccessible for more than seven\\n                    days. An On-Demand backup was created at the archival time.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"ArchivalBackupArn\": {\n                    \"target\": \"com.amazonaws.dynamodb#BackupArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the backup the table was archived to, when\\n            applicable in the archival reason. If you wish to restore this backup to the same table\\n            name, you will need to delete the original table.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains details of a table archival operation.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#AttributeAction\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ADD\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ADD\"\n                    }\n                },\n                \"PUT\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"PUT\"\n                    }\n                },\n                \"DELETE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DELETE\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#AttributeDefinition\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AttributeName\": {\n                    \"target\": \"com.amazonaws.dynamodb#KeySchemaAttributeName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A name for the attribute.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"AttributeType\": {\n                    \"target\": \"com.amazonaws.dynamodb#ScalarAttributeType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The data type for the attribute, where:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>S</code> - the attribute is of type String</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>N</code> - the attribute is of type Number</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>B</code> - the attribute is of type Binary</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents an attribute for describing the schema for the table and indexes.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#AttributeDefinitions\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.dynamodb#AttributeDefinition\"\n            }\n        },\n        \"com.amazonaws.dynamodb#AttributeMap\": {\n            \"type\": \"map\",\n            \"key\": {\n                \"target\": \"com.amazonaws.dynamodb#AttributeName\"\n            },\n            \"value\": {\n                \"target\": \"com.amazonaws.dynamodb#AttributeValue\"\n            }\n        },\n        \"com.amazonaws.dynamodb#AttributeName\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 65535\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#AttributeNameList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.dynamodb#AttributeName\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#AttributeUpdates\": {\n            \"type\": \"map\",\n            \"key\": {\n                \"target\": \"com.amazonaws.dynamodb#AttributeName\"\n            },\n            \"value\": {\n                \"target\": \"com.amazonaws.dynamodb#AttributeValueUpdate\"\n            }\n        },\n        \"com.amazonaws.dynamodb#AttributeValue\": {\n            \"type\": \"union\",\n            \"members\": {\n                \"S\": {\n                    \"target\": \"com.amazonaws.dynamodb#StringAttributeValue\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An attribute of type String. For example:</p>\\n         <p>\\n            <code>\\\"S\\\": \\\"Hello\\\"</code>\\n         </p>\"\n                    }\n                },\n                \"N\": {\n                    \"target\": \"com.amazonaws.dynamodb#NumberAttributeValue\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An attribute of type Number. For example:</p>\\n         <p>\\n            <code>\\\"N\\\": \\\"123.45\\\"</code>\\n         </p>\\n         <p>Numbers are sent across the network to DynamoDB as strings, to maximize compatibility\\n            across languages and libraries. However, DynamoDB treats them as number type attributes\\n            for mathematical operations.</p>\"\n                    }\n                },\n                \"B\": {\n                    \"target\": \"com.amazonaws.dynamodb#BinaryAttributeValue\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An attribute of type Binary. For example:</p>\\n         <p>\\n            <code>\\\"B\\\": \\\"dGhpcyB0ZXh0IGlzIGJhc2U2NC1lbmNvZGVk\\\"</code>\\n         </p>\"\n                    }\n                },\n                \"SS\": {\n                    \"target\": \"com.amazonaws.dynamodb#StringSetAttributeValue\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An attribute of type String Set. For example:</p>\\n         <p>\\n            <code>\\\"SS\\\": [\\\"Giraffe\\\", \\\"Hippo\\\" ,\\\"Zebra\\\"]</code>\\n         </p>\"\n                    }\n                },\n                \"NS\": {\n                    \"target\": \"com.amazonaws.dynamodb#NumberSetAttributeValue\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An attribute of type Number Set. For example:</p>\\n         <p>\\n            <code>\\\"NS\\\": [\\\"42.2\\\", \\\"-19\\\", \\\"7.5\\\", \\\"3.14\\\"]</code>\\n         </p>\\n         <p>Numbers are sent across the network to DynamoDB as strings, to maximize compatibility\\n            across languages and libraries. However, DynamoDB treats them as number type attributes\\n            for mathematical operations.</p>\"\n                    }\n                },\n                \"BS\": {\n                    \"target\": \"com.amazonaws.dynamodb#BinarySetAttributeValue\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An attribute of type Binary Set. For example:</p>\\n         <p>\\n            <code>\\\"BS\\\": [\\\"U3Vubnk=\\\", \\\"UmFpbnk=\\\", \\\"U25vd3k=\\\"]</code>\\n         </p>\"\n                    }\n                },\n                \"M\": {\n                    \"target\": \"com.amazonaws.dynamodb#MapAttributeValue\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An attribute of type Map. For example:</p>\\n         <p>\\n            <code>\\\"M\\\": {\\\"Name\\\": {\\\"S\\\": \\\"Joe\\\"}, \\\"Age\\\": {\\\"N\\\": \\\"35\\\"}}</code>\\n         </p>\"\n                    }\n                },\n                \"L\": {\n                    \"target\": \"com.amazonaws.dynamodb#ListAttributeValue\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An attribute of type List. For example:</p>\\n         <p>\\n            <code>\\\"L\\\": [ {\\\"S\\\": \\\"Cookies\\\"} , {\\\"S\\\": \\\"Coffee\\\"}, {\\\"N\\\": \\\"3.14159\\\"}]</code>\\n         </p>\"\n                    }\n                },\n                \"NULL\": {\n                    \"target\": \"com.amazonaws.dynamodb#NullAttributeValue\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An attribute of type Null. For example:</p>\\n         <p>\\n            <code>\\\"NULL\\\": true</code>\\n         </p>\"\n                    }\n                },\n                \"BOOL\": {\n                    \"target\": \"com.amazonaws.dynamodb#BooleanAttributeValue\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An attribute of type Boolean. For example:</p>\\n         <p>\\n            <code>\\\"BOOL\\\": true</code>\\n         </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents the data for an attribute.</p>\\n         <p>Each attribute value is described as a name-value pair. The name is the data type, and\\n            the value is the data itself.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.NamingRulesDataTypes.html#HowItWorks.DataTypes\\\">Data Types</a> in the <i>Amazon DynamoDB Developer\\n            Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#AttributeValueList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.dynamodb#AttributeValue\"\n            }\n        },\n        \"com.amazonaws.dynamodb#AttributeValueUpdate\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Value\": {\n                    \"target\": \"com.amazonaws.dynamodb#AttributeValue\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Represents the data for an attribute.</p>\\n         <p>Each attribute value is described as a name-value pair. The name is the data type, and\\n            the value is the data itself.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.NamingRulesDataTypes.html#HowItWorks.DataTypes\\\">Data Types</a> in the <i>Amazon DynamoDB Developer Guide</i>.\\n        </p>\"\n                    }\n                },\n                \"Action\": {\n                    \"target\": \"com.amazonaws.dynamodb#AttributeAction\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies how to perform the update. Valid values are <code>PUT</code> (default),\\n                <code>DELETE</code>, and <code>ADD</code>. The behavior depends on whether the\\n            specified primary key already exists in the table.</p>\\n         <p>\\n            <b>If an item with the specified <i>Key</i> is found in\\n                the table:</b>\\n         </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>PUT</code> - Adds the specified attribute to the item. If the attribute\\n                    already exists, it is replaced by the new value. </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>DELETE</code> - If no value is specified, the attribute and its value are\\n                    removed from the item. The data type of the specified value must match the\\n                    existing value's data type.</p>\\n               <p>If a <i>set</i> of values is specified, then those values are\\n                    subtracted from the old set. For example, if the attribute value was the set\\n                        <code>[a,b,c]</code> and the <code>DELETE</code> action specified\\n                        <code>[a,c]</code>, then the final attribute value would be\\n                    <code>[b]</code>. Specifying an empty set is an error.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ADD</code> - If the attribute does not already exist, then the attribute\\n                    and its values are added to the item. If the attribute does exist, then the\\n                    behavior of <code>ADD</code> depends on the data type of the attribute:</p>\\n               <ul>\\n                  <li>\\n                     <p>If the existing attribute is a number, and if <code>Value</code> is\\n                            also a number, then the <code>Value</code> is mathematically added to\\n                            the existing attribute. If <code>Value</code> is a negative number, then\\n                            it is subtracted from the existing attribute.</p>\\n                     <note>\\n                        <p> If you use <code>ADD</code> to increment or decrement a number\\n                                value for an item that doesn't exist before the update, DynamoDB\\n                                uses 0 as the initial value.</p>\\n                        <p>In addition, if you use <code>ADD</code> to update an existing\\n                                item, and intend to increment or decrement an attribute value which\\n                                does not yet exist, DynamoDB uses <code>0</code> as the initial\\n                                value. For example, suppose that the item you want to update does\\n                                not yet have an attribute named <i>itemcount</i>, but\\n                                you decide to <code>ADD</code> the number <code>3</code> to this\\n                                attribute anyway, even though it currently does not exist. DynamoDB\\n                                will create the <i>itemcount</i> attribute, set its\\n                                initial value to <code>0</code>, and finally add <code>3</code> to\\n                                it. The result will be a new <i>itemcount</i>\\n                                attribute in the item, with a value of <code>3</code>.</p>\\n                     </note>\\n                  </li>\\n                  <li>\\n                     <p>If the existing data type is a set, and if the <code>Value</code> is\\n                            also a set, then the <code>Value</code> is added to the existing set.\\n                            (This is a <i>set</i> operation, not mathematical\\n                            addition.) For example, if the attribute value was the set\\n                                <code>[1,2]</code>, and the <code>ADD</code> action specified\\n                                <code>[3]</code>, then the final attribute value would be\\n                                <code>[1,2,3]</code>. An error occurs if an Add action is specified\\n                            for a set attribute and the attribute type specified does not match the\\n                            existing set type. </p>\\n                     <p>Both sets must have the same primitive data type. For example, if the\\n                            existing data type is a set of strings, the <code>Value</code> must also\\n                            be a set of strings. The same holds true for number sets and binary\\n                            sets.</p>\\n                  </li>\\n               </ul>\\n               <p>This action is only valid for an existing attribute whose data type is number\\n                    or is a set. Do not use <code>ADD</code> for any other data types.</p>\\n            </li>\\n         </ul>\\n         <p>\\n            <b>If no item with the specified <i>Key</i> is\\n                found:</b>\\n         </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>PUT</code> - DynamoDB creates a new item with the specified primary key,\\n                    and then adds the attribute. </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>DELETE</code> - Nothing happens; there is no attribute to delete.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ADD</code> - DynamoDB creates a new item with the supplied primary key and\\n                    number (or set) for the attribute value. The only data types allowed are number,\\n                    number set, string set or binary set.</p>\\n            </li>\\n         </ul>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>For the <code>UpdateItem</code> operation, represents the attributes to be modified,\\n            the action to perform on each, and the new value for each.</p>\\n         <note>\\n            <p>You cannot use <code>UpdateItem</code> to update any primary key attributes.\\n                Instead, you will need to delete the item, and then use <code>PutItem</code> to\\n                create a new item with new attributes.</p>\\n         </note>\\n         <p>Attribute values cannot be null; string and binary type attributes must have lengths\\n            greater than zero; and set type attributes must not be empty. Requests with empty values\\n            will be rejected with a <code>ValidationException</code> exception.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#AutoScalingPolicyDescription\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PolicyName\": {\n                    \"target\": \"com.amazonaws.dynamodb#AutoScalingPolicyName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the scaling policy.</p>\"\n                    }\n                },\n                \"TargetTrackingScalingPolicyConfiguration\": {\n                    \"target\": \"com.amazonaws.dynamodb#AutoScalingTargetTrackingScalingPolicyConfigurationDescription\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Represents a target tracking scaling policy configuration.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents the properties of the scaling policy.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#AutoScalingPolicyDescriptionList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.dynamodb#AutoScalingPolicyDescription\"\n            }\n        },\n        \"com.amazonaws.dynamodb#AutoScalingPolicyName\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 256\n                },\n                \"smithy.api#pattern\": \"^\\\\p{Print}+$\"\n            }\n        },\n        \"com.amazonaws.dynamodb#AutoScalingPolicyUpdate\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PolicyName\": {\n                    \"target\": \"com.amazonaws.dynamodb#AutoScalingPolicyName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the scaling policy.</p>\"\n                    }\n                },\n                \"TargetTrackingScalingPolicyConfiguration\": {\n                    \"target\": \"com.amazonaws.dynamodb#AutoScalingTargetTrackingScalingPolicyConfigurationUpdate\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Represents a target tracking scaling policy configuration.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents the auto scaling policy to be modified.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#AutoScalingRoleArn\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 1600\n                },\n                \"smithy.api#pattern\": \"^[\\\\u0020-\\\\uD7FF\\\\uE000-\\\\uFFFD\\\\uD800\\\\uDC00-\\\\uDBFF\\\\uDFFF\\\\r\\\\n\\\\t]*$\"\n            }\n        },\n        \"com.amazonaws.dynamodb#AutoScalingSettingsDescription\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"MinimumUnits\": {\n                    \"target\": \"com.amazonaws.dynamodb#PositiveLongObject\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The minimum capacity units that a global table or global secondary index should be\\n            scaled down to.</p>\"\n                    }\n                },\n                \"MaximumUnits\": {\n                    \"target\": \"com.amazonaws.dynamodb#PositiveLongObject\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum capacity units that a global table or global secondary index should be\\n            scaled up to.</p>\"\n                    }\n                },\n                \"AutoScalingDisabled\": {\n                    \"target\": \"com.amazonaws.dynamodb#BooleanObject\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Disabled auto scaling for this global table or global secondary index.</p>\"\n                    }\n                },\n                \"AutoScalingRoleArn\": {\n                    \"target\": \"com.amazonaws.dynamodb#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Role ARN used for configuring the auto scaling policy.</p>\"\n                    }\n                },\n                \"ScalingPolicies\": {\n                    \"target\": \"com.amazonaws.dynamodb#AutoScalingPolicyDescriptionList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Information about the scaling policies.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents the auto scaling settings for a global table or global secondary\\n            index.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#AutoScalingSettingsUpdate\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"MinimumUnits\": {\n                    \"target\": \"com.amazonaws.dynamodb#PositiveLongObject\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The minimum capacity units that a global table or global secondary index should be\\n            scaled down to.</p>\"\n                    }\n                },\n                \"MaximumUnits\": {\n                    \"target\": \"com.amazonaws.dynamodb#PositiveLongObject\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum capacity units that a global table or global secondary index should be\\n            scaled up to.</p>\"\n                    }\n                },\n                \"AutoScalingDisabled\": {\n                    \"target\": \"com.amazonaws.dynamodb#BooleanObject\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Disabled auto scaling for this global table or global secondary index.</p>\"\n                    }\n                },\n                \"AutoScalingRoleArn\": {\n                    \"target\": \"com.amazonaws.dynamodb#AutoScalingRoleArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Role ARN used for configuring auto scaling policy.</p>\"\n                    }\n                },\n                \"ScalingPolicyUpdate\": {\n                    \"target\": \"com.amazonaws.dynamodb#AutoScalingPolicyUpdate\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The scaling policy to apply for scaling target global table or global secondary index\\n            capacity units.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents the auto scaling settings to be modified for a global table or global\\n            secondary index.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#AutoScalingTargetTrackingScalingPolicyConfigurationDescription\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DisableScaleIn\": {\n                    \"target\": \"com.amazonaws.dynamodb#BooleanObject\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether scale in by the target tracking policy is disabled. If the value is\\n            true, scale in is disabled and the target tracking policy won't remove capacity from the\\n            scalable resource. Otherwise, scale in is enabled and the target tracking policy can\\n            remove capacity from the scalable resource. The default value is false.</p>\"\n                    }\n                },\n                \"ScaleInCooldown\": {\n                    \"target\": \"com.amazonaws.dynamodb#IntegerObject\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The amount of time, in seconds, after a scale in activity completes before another\\n            scale in activity can start. The cooldown period is used to block subsequent scale in\\n            requests until it has expired. You should scale in conservatively to protect your\\n            application's availability. However, if another alarm triggers a scale out policy during\\n            the cooldown period after a scale-in, application auto scaling scales out your scalable\\n            target immediately. </p>\"\n                    }\n                },\n                \"ScaleOutCooldown\": {\n                    \"target\": \"com.amazonaws.dynamodb#IntegerObject\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The amount of time, in seconds, after a scale out activity completes before another\\n            scale out activity can start. While the cooldown period is in effect, the capacity that\\n            has been added by the previous scale out event that initiated the cooldown is calculated\\n            as part of the desired capacity for the next scale out. You should continuously (but not\\n            excessively) scale out.</p>\"\n                    }\n                },\n                \"TargetValue\": {\n                    \"target\": \"com.amazonaws.dynamodb#DoubleObject\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The target value for the metric. The range is 8.515920e-109 to 1.174271e+108 (Base 10)\\n            or 2e-360 to 2e360 (Base 2).</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents the properties of a target tracking scaling policy.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#AutoScalingTargetTrackingScalingPolicyConfigurationUpdate\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DisableScaleIn\": {\n                    \"target\": \"com.amazonaws.dynamodb#BooleanObject\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether scale in by the target tracking policy is disabled. If the value is\\n            true, scale in is disabled and the target tracking policy won't remove capacity from the\\n            scalable resource. Otherwise, scale in is enabled and the target tracking policy can\\n            remove capacity from the scalable resource. The default value is false.</p>\"\n                    }\n                },\n                \"ScaleInCooldown\": {\n                    \"target\": \"com.amazonaws.dynamodb#IntegerObject\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The amount of time, in seconds, after a scale in activity completes before another\\n            scale in activity can start. The cooldown period is used to block subsequent scale in\\n            requests until it has expired. You should scale in conservatively to protect your\\n            application's availability. However, if another alarm triggers a scale out policy during\\n            the cooldown period after a scale-in, application auto scaling scales out your scalable\\n            target immediately. </p>\"\n                    }\n                },\n                \"ScaleOutCooldown\": {\n                    \"target\": \"com.amazonaws.dynamodb#IntegerObject\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The amount of time, in seconds, after a scale out activity completes before another\\n            scale out activity can start. While the cooldown period is in effect, the capacity that\\n            has been added by the previous scale out event that initiated the cooldown is calculated\\n            as part of the desired capacity for the next scale out. You should continuously (but not\\n            excessively) scale out.</p>\"\n                    }\n                },\n                \"TargetValue\": {\n                    \"target\": \"com.amazonaws.dynamodb#DoubleObject\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The target value for the metric. The range is 8.515920e-109 to 1.174271e+108 (Base 10)\\n            or 2e-360 to 2e360 (Base 2).</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents the settings of a target tracking scaling policy that will be\\n            modified.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#AvailabilityErrorMessage\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.dynamodb#Backfilling\": {\n            \"type\": \"boolean\"\n        },\n        \"com.amazonaws.dynamodb#BackupArn\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 37,\n                    \"max\": 1024\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#BackupCreationDateTime\": {\n            \"type\": \"timestamp\"\n        },\n        \"com.amazonaws.dynamodb#BackupDescription\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"BackupDetails\": {\n                    \"target\": \"com.amazonaws.dynamodb#BackupDetails\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Contains the details of the backup created for the table. </p>\"\n                    }\n                },\n                \"SourceTableDetails\": {\n                    \"target\": \"com.amazonaws.dynamodb#SourceTableDetails\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Contains the details of the table when the backup was created. </p>\"\n                    }\n                },\n                \"SourceTableFeatureDetails\": {\n                    \"target\": \"com.amazonaws.dynamodb#SourceTableFeatureDetails\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Contains the details of the features enabled on the table when the backup was created.\\n            For example, LSIs, GSIs, streams, TTL.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the description of the backup created for the table.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#BackupDetails\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"BackupArn\": {\n                    \"target\": \"com.amazonaws.dynamodb#BackupArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>ARN associated with the backup.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"BackupName\": {\n                    \"target\": \"com.amazonaws.dynamodb#BackupName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Name of the requested backup.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"BackupSizeBytes\": {\n                    \"target\": \"com.amazonaws.dynamodb#BackupSizeBytes\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Size of the backup in bytes. DynamoDB updates this value approximately every six\\n            hours. Recent changes might not be reflected in this value.</p>\"\n                    }\n                },\n                \"BackupStatus\": {\n                    \"target\": \"com.amazonaws.dynamodb#BackupStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Backup can be in one of the following states: CREATING, ACTIVE, DELETED. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"BackupType\": {\n                    \"target\": \"com.amazonaws.dynamodb#BackupType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>BackupType:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>USER</code> - You create and manage these using the on-demand backup\\n                    feature.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>SYSTEM</code> - If you delete a table with point-in-time recovery enabled,\\n                    a <code>SYSTEM</code> backup is automatically created and is retained for 35\\n                    days (at no additional cost). System backups allow you to restore the deleted\\n                    table to the state it was in just before the point of deletion. </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>AWS_BACKUP</code> - On-demand backup created by you from Backup service.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"BackupCreationDateTime\": {\n                    \"target\": \"com.amazonaws.dynamodb#BackupCreationDateTime\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Time at which the backup was created. This is the request time of the backup. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"BackupExpiryDateTime\": {\n                    \"target\": \"com.amazonaws.dynamodb#Date\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Time at which the automatic on-demand backup created by DynamoDB will\\n            expire. This <code>SYSTEM</code> on-demand backup expires automatically 35 days after\\n            its creation.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the details of the backup created for the table.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#BackupInUseException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.dynamodb#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>There is another ongoing conflicting backup control plane operation on the table.\\n            The backup is either being created, deleted or restored to a table.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.dynamodb#BackupName\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 3,\n                    \"max\": 255\n                },\n                \"smithy.api#pattern\": \"^[a-zA-Z0-9_.-]+$\"\n            }\n        },\n        \"com.amazonaws.dynamodb#BackupNotFoundException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.dynamodb#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Backup not found for the given BackupARN. </p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.dynamodb#BackupSizeBytes\": {\n            \"type\": \"long\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 0\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#BackupStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"CREATING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"CREATING\"\n                    }\n                },\n                \"DELETED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DELETED\"\n                    }\n                },\n                \"AVAILABLE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AVAILABLE\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#BackupSummaries\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.dynamodb#BackupSummary\"\n            }\n        },\n        \"com.amazonaws.dynamodb#BackupSummary\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TableName\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Name of the table.</p>\"\n                    }\n                },\n                \"TableId\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Unique identifier for the table.</p>\"\n                    }\n                },\n                \"TableArn\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>ARN associated with the table.</p>\"\n                    }\n                },\n                \"BackupArn\": {\n                    \"target\": \"com.amazonaws.dynamodb#BackupArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>ARN associated with the backup.</p>\"\n                    }\n                },\n                \"BackupName\": {\n                    \"target\": \"com.amazonaws.dynamodb#BackupName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Name of the specified backup.</p>\"\n                    }\n                },\n                \"BackupCreationDateTime\": {\n                    \"target\": \"com.amazonaws.dynamodb#BackupCreationDateTime\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Time at which the backup was created.</p>\"\n                    }\n                },\n                \"BackupExpiryDateTime\": {\n                    \"target\": \"com.amazonaws.dynamodb#Date\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Time at which the automatic on-demand backup created by DynamoDB will\\n            expire. This <code>SYSTEM</code> on-demand backup expires automatically 35 days after\\n            its creation.</p>\"\n                    }\n                },\n                \"BackupStatus\": {\n                    \"target\": \"com.amazonaws.dynamodb#BackupStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Backup can be in one of the following states: CREATING, ACTIVE, DELETED.</p>\"\n                    }\n                },\n                \"BackupType\": {\n                    \"target\": \"com.amazonaws.dynamodb#BackupType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>BackupType:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>USER</code> - You create and manage these using the on-demand backup\\n                    feature.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>SYSTEM</code> - If you delete a table with point-in-time recovery enabled,\\n                    a <code>SYSTEM</code> backup is automatically created and is retained for 35\\n                    days (at no additional cost). System backups allow you to restore the deleted\\n                    table to the state it was in just before the point of deletion. </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>AWS_BACKUP</code> - On-demand backup created by you from Backup service.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"BackupSizeBytes\": {\n                    \"target\": \"com.amazonaws.dynamodb#BackupSizeBytes\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Size of the backup in bytes.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains details for the backup.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#BackupType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"USER\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"USER\"\n                    }\n                },\n                \"SYSTEM\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"SYSTEM\"\n                    }\n                },\n                \"AWS_BACKUP\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS_BACKUP\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#BackupTypeFilter\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"USER\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"USER\"\n                    }\n                },\n                \"SYSTEM\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"SYSTEM\"\n                    }\n                },\n                \"AWS_BACKUP\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS_BACKUP\"\n                    }\n                },\n                \"ALL\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ALL\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#BackupsInputLimit\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 100\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#BatchExecuteStatement\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.dynamodb#BatchExecuteStatementInput\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.dynamodb#BatchExecuteStatementOutput\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#RequestLimitExceeded\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ThrottlingException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This operation allows you to perform batch reads or writes on data stored in DynamoDB,\\n            using PartiQL. Each read statement in a <code>BatchExecuteStatement</code> must specify\\n            an equality condition on all key attributes. This enforces that each <code>SELECT</code>\\n            statement in a batch returns at most a single item. For more information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ql-reference.multiplestatements.batching.html\\\">Running batch operations with PartiQL for DynamoDB </a>.</p>\\n         <note>\\n            <p>The entire batch must consist of either read statements or write statements, you\\n                cannot mix both in one batch.</p>\\n         </note>\\n         <important>\\n            <p>A HTTP 200 response does not mean that all statements in the BatchExecuteStatement\\n                succeeded. Error details for individual statements can be found under the <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_BatchStatementResponse.html#DDB-Type-BatchStatementResponse-Error\\\">Error</a> field of the <code>BatchStatementResponse</code> for each\\n                statement.</p>\\n         </important>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#BatchExecuteStatementInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Statements\": {\n                    \"target\": \"com.amazonaws.dynamodb#PartiQLBatchRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The list of PartiQL statements representing the batch to run.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ReturnConsumedCapacity\": {\n                    \"target\": \"com.amazonaws.dynamodb#ReturnConsumedCapacity\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#BatchExecuteStatementOutput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Responses\": {\n                    \"target\": \"com.amazonaws.dynamodb#PartiQLBatchResponse\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The response to each PartiQL statement in the batch. The values of the list are\\n            ordered according to the ordering of the request statements.</p>\"\n                    }\n                },\n                \"ConsumedCapacity\": {\n                    \"target\": \"com.amazonaws.dynamodb#ConsumedCapacityMultiple\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The capacity units consumed by the entire operation. The values of the list are\\n            ordered according to the ordering of the statements.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#BatchGetItem\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.dynamodb#BatchGetItemInput\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.dynamodb#BatchGetItemOutput\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InvalidEndpointException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ProvisionedThroughputExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#RequestLimitExceeded\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ThrottlingException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#clientDiscoveredEndpoint\": {\n                    \"required\": false\n                },\n                \"smithy.api#documentation\": \"<p>The <code>BatchGetItem</code> operation returns the attributes of one or more items\\n            from one or more tables. You identify requested items by primary key.</p>\\n         <p>A single operation can retrieve up to 16 MB of data, which can contain as many as 100\\n            items. <code>BatchGetItem</code> returns a partial result if the response size limit is\\n            exceeded, the table's provisioned throughput is exceeded, more than 1MB per partition is\\n            requested, or an internal processing failure occurs. If a partial result is returned,\\n            the operation returns a value for <code>UnprocessedKeys</code>. You can use this value\\n            to retry the operation starting with the next item to get.</p>\\n         <important>\\n            <p>If you request more than 100 items, <code>BatchGetItem</code> returns a\\n                    <code>ValidationException</code> with the message \\\"Too many items requested for\\n                the BatchGetItem call.\\\"</p>\\n         </important>\\n         <p>For example, if you ask to retrieve 100 items, but each individual item is 300 KB in\\n            size, the system returns 52 items (so as not to exceed the 16 MB limit). It also returns\\n            an appropriate <code>UnprocessedKeys</code> value so you can get the next page of\\n            results. If desired, your application can include its own logic to assemble the pages of\\n            results into one dataset.</p>\\n         <p>If <i>none</i> of the items can be processed due to insufficient\\n            provisioned throughput on all of the tables in the request, then\\n                <code>BatchGetItem</code> returns a\\n                <code>ProvisionedThroughputExceededException</code>. If <i>at least\\n                one</i> of the items is successfully processed, then\\n                <code>BatchGetItem</code> completes successfully, while returning the keys of the\\n            unread items in <code>UnprocessedKeys</code>.</p>\\n         <important>\\n            <p>If DynamoDB returns any unprocessed items, you should retry the batch operation on\\n                those items. However, <i>we strongly recommend that you use an exponential\\n                    backoff algorithm</i>. If you retry the batch operation immediately, the\\n                underlying read or write requests can still fail due to throttling on the individual\\n                tables. If you delay the batch operation using exponential backoff, the individual\\n                requests in the batch are much more likely to succeed.</p>\\n            <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ErrorHandling.html#BatchOperations\\\">Batch Operations and Error Handling</a> in the <i>Amazon DynamoDB\\n                    Developer Guide</i>.</p>\\n         </important>\\n         <p>By default, <code>BatchGetItem</code> performs eventually consistent reads on every\\n            table in the request. If you want strongly consistent reads instead, you can set\\n                <code>ConsistentRead</code> to <code>true</code> for any or all tables.</p>\\n         <p>In order to minimize response latency, <code>BatchGetItem</code> may retrieve items in\\n            parallel.</p>\\n         <p>When designing your application, keep in mind that DynamoDB does not return items in\\n            any particular order. To help parse the response by item, include the primary key values\\n            for the items in your request in the <code>ProjectionExpression</code> parameter.</p>\\n         <p>If a requested item does not exist, it is not returned in the result. Requests for\\n            nonexistent items consume the minimum read capacity units according to the type of read.\\n            For more information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/WorkingWithTables.html#CapacityUnitCalculations\\\">Working with Tables</a> in the <i>Amazon DynamoDB Developer\\n                Guide</i>.</p>\\n         <note>\\n            <p>\\n               <code>BatchGetItem</code> will result in a <code>ValidationException</code> if the\\n                same key is specified multiple times.</p>\\n         </note>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To retrieve multiple items from a table\",\n                        \"documentation\": \"This example reads multiple items from the Music table using a batch of three GetItem requests.  Only the AlbumTitle attribute is returned.\",\n                        \"input\": {\n                            \"RequestItems\": {\n                                \"Music\": {\n                                    \"Keys\": [\n                                        {\n                                            \"Artist\": {\n                                                \"S\": \"No One You Know\"\n                                            },\n                                            \"SongTitle\": {\n                                                \"S\": \"Call Me Today\"\n                                            }\n                                        },\n                                        {\n                                            \"Artist\": {\n                                                \"S\": \"Acme Band\"\n                                            },\n                                            \"SongTitle\": {\n                                                \"S\": \"Happy Day\"\n                                            }\n                                        },\n                                        {\n                                            \"Artist\": {\n                                                \"S\": \"No One You Know\"\n                                            },\n                                            \"SongTitle\": {\n                                                \"S\": \"Scared of My Shadow\"\n                                            }\n                                        }\n                                    ],\n                                    \"ProjectionExpression\": \"AlbumTitle\"\n                                }\n                            }\n                        },\n                        \"output\": {\n                            \"Responses\": {\n                                \"Music\": [\n                                    {\n                                        \"AlbumTitle\": {\n                                            \"S\": \"Somewhat Famous\"\n                                        }\n                                    },\n                                    {\n                                        \"AlbumTitle\": {\n                                            \"S\": \"Blue Sky Blues\"\n                                        }\n                                    },\n                                    {\n                                        \"AlbumTitle\": {\n                                            \"S\": \"Louder Than Ever\"\n                                        }\n                                    }\n                                ]\n                            }\n                        }\n                    }\n                ],\n                \"smithy.rules#operationContextParams\": {\n                    \"ResourceArnList\": {\n                        \"path\": \"keys(RequestItems)\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#BatchGetItemInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RequestItems\": {\n                    \"target\": \"com.amazonaws.dynamodb#BatchGetRequestMap\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A map of one or more table names or table ARNs and, for each table, a map that\\n            describes one or more items to retrieve from that table. Each table name or ARN can be\\n            used only once per <code>BatchGetItem</code> request.</p>\\n         <p>Each element in the map of items to retrieve consists of the following:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>ConsistentRead</code> - If <code>true</code>, a strongly consistent read\\n                    is used; if <code>false</code> (the default), an eventually consistent read is\\n                    used.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ExpressionAttributeNames</code> - One or more substitution tokens for\\n                    attribute names in the <code>ProjectionExpression</code> parameter. The\\n                    following are some use cases for using\\n                    <code>ExpressionAttributeNames</code>:</p>\\n               <ul>\\n                  <li>\\n                     <p>To access an attribute whose name conflicts with a DynamoDB reserved\\n                            word.</p>\\n                  </li>\\n                  <li>\\n                     <p>To create a placeholder for repeating occurrences of an attribute name\\n                            in an expression.</p>\\n                  </li>\\n                  <li>\\n                     <p>To prevent special characters in an attribute name from being\\n                            misinterpreted in an expression.</p>\\n                  </li>\\n               </ul>\\n               <p>Use the <b>#</b> character in an expression to\\n                    dereference an attribute name. For example, consider the following attribute\\n                    name:</p>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <code>Percentile</code>\\n                     </p>\\n                  </li>\\n               </ul>\\n               <p>The name of this attribute conflicts with a reserved word, so it cannot be\\n                    used directly in an expression. (For the complete list of reserved words, see\\n                        <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ReservedWords.html\\\">Reserved\\n                        Words</a> in the <i>Amazon DynamoDB Developer Guide</i>).\\n                    To work around this, you could specify the following for\\n                        <code>ExpressionAttributeNames</code>:</p>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <code>{\\\"#P\\\":\\\"Percentile\\\"}</code>\\n                     </p>\\n                  </li>\\n               </ul>\\n               <p>You could then use this substitution in an expression, as in this\\n                    example:</p>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <code>#P = :val</code>\\n                     </p>\\n                  </li>\\n               </ul>\\n               <note>\\n                  <p>Tokens that begin with the <b>:</b> character\\n                        are <i>expression attribute values</i>, which are placeholders\\n                        for the actual value at runtime.</p>\\n               </note>\\n               <p>For more information about expression attribute names, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.AccessingItemAttributes.html\\\">Accessing Item Attributes</a> in the <i>Amazon DynamoDB\\n                        Developer Guide</i>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>Keys</code> - An array of primary key attribute values that define\\n                    specific items in the table. For each primary key, you must provide\\n                        <i>all</i> of the key attributes. For example, with a simple\\n                    primary key, you only need to provide the partition key value. For a composite\\n                    key, you must provide <i>both</i> the partition key value and the\\n                    sort key value.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ProjectionExpression</code> - A string that identifies one or more\\n                    attributes to retrieve from the table. These attributes can include scalars,\\n                    sets, or elements of a JSON document. The attributes in the expression must be\\n                    separated by commas.</p>\\n               <p>If no attribute names are specified, then all attributes are returned. If any\\n                    of the requested attributes are not found, they do not appear in the\\n                    result.</p>\\n               <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.AccessingItemAttributes.html\\\">Accessing Item Attributes</a> in the <i>Amazon DynamoDB\\n                        Developer Guide</i>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>AttributesToGet</code> - This is a legacy parameter. Use\\n                        <code>ProjectionExpression</code> instead. For more information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/LegacyConditionalParameters.AttributesToGet.html\\\">AttributesToGet</a> in the <i>Amazon DynamoDB Developer\\n                        Guide</i>. </p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ReturnConsumedCapacity\": {\n                    \"target\": \"com.amazonaws.dynamodb#ReturnConsumedCapacity\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents the input of a <code>BatchGetItem</code> operation.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#BatchGetItemOutput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Responses\": {\n                    \"target\": \"com.amazonaws.dynamodb#BatchGetResponseMap\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A map of table name or table ARN to a list of items. Each object in\\n                <code>Responses</code> consists of a table name or ARN, along with a map of\\n            attribute data consisting of the data type and attribute value.</p>\"\n                    }\n                },\n                \"UnprocessedKeys\": {\n                    \"target\": \"com.amazonaws.dynamodb#BatchGetRequestMap\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A map of tables and their respective keys that were not processed with the current\\n            response. The <code>UnprocessedKeys</code> value is in the same form as\\n                <code>RequestItems</code>, so the value can be provided directly to a subsequent\\n                <code>BatchGetItem</code> operation. For more information, see\\n                <code>RequestItems</code> in the Request Parameters section.</p>\\n         <p>Each element consists of:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>Keys</code> - An array of primary key attribute values that define\\n                    specific items in the table.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ProjectionExpression</code> - One or more attributes to be retrieved from\\n                    the table or index. By default, all attributes are returned. If a requested\\n                    attribute is not found, it does not appear in the result.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ConsistentRead</code> - The consistency of a read operation. If set to\\n                        <code>true</code>, then a strongly consistent read is used; otherwise, an\\n                    eventually consistent read is used.</p>\\n            </li>\\n         </ul>\\n         <p>If there are no unprocessed keys remaining, the response contains an empty\\n                <code>UnprocessedKeys</code> map.</p>\"\n                    }\n                },\n                \"ConsumedCapacity\": {\n                    \"target\": \"com.amazonaws.dynamodb#ConsumedCapacityMultiple\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The read capacity units consumed by the entire <code>BatchGetItem</code>\\n            operation.</p>\\n         <p>Each element consists of:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>TableName</code> - The table that consumed the provisioned\\n                    throughput.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>CapacityUnits</code> - The total number of capacity units consumed.</p>\\n            </li>\\n         </ul>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents the output of a <code>BatchGetItem</code> operation.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#BatchGetRequestMap\": {\n            \"type\": \"map\",\n            \"key\": {\n                \"target\": \"com.amazonaws.dynamodb#TableArn\"\n            },\n            \"value\": {\n                \"target\": \"com.amazonaws.dynamodb#KeysAndAttributes\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 100\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#BatchGetResponseMap\": {\n            \"type\": \"map\",\n            \"key\": {\n                \"target\": \"com.amazonaws.dynamodb#TableArn\"\n            },\n            \"value\": {\n                \"target\": \"com.amazonaws.dynamodb#ItemList\"\n            }\n        },\n        \"com.amazonaws.dynamodb#BatchStatementError\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Code\": {\n                    \"target\": \"com.amazonaws.dynamodb#BatchStatementErrorCodeEnum\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The error code associated with the failed PartiQL batch statement. </p>\"\n                    }\n                },\n                \"Message\": {\n                    \"target\": \"com.amazonaws.dynamodb#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The error message associated with the PartiQL batch response. </p>\"\n                    }\n                },\n                \"Item\": {\n                    \"target\": \"com.amazonaws.dynamodb#AttributeMap\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The item which caused the condition check to fail. This will be set if\\n            ReturnValuesOnConditionCheckFailure is specified as <code>ALL_OLD</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p> An error associated with a statement in a PartiQL batch that was run. </p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#BatchStatementErrorCodeEnum\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ConditionalCheckFailed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ConditionalCheckFailed\"\n                    }\n                },\n                \"ItemCollectionSizeLimitExceeded\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ItemCollectionSizeLimitExceeded\"\n                    }\n                },\n                \"RequestLimitExceeded\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"RequestLimitExceeded\"\n                    }\n                },\n                \"ValidationError\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ValidationError\"\n                    }\n                },\n                \"ProvisionedThroughputExceeded\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ProvisionedThroughputExceeded\"\n                    }\n                },\n                \"TransactionConflict\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"TransactionConflict\"\n                    }\n                },\n                \"ThrottlingError\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ThrottlingError\"\n                    }\n                },\n                \"InternalServerError\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"InternalServerError\"\n                    }\n                },\n                \"ResourceNotFound\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ResourceNotFound\"\n                    }\n                },\n                \"AccessDenied\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AccessDenied\"\n                    }\n                },\n                \"DuplicateItem\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DuplicateItem\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#BatchStatementRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Statement\": {\n                    \"target\": \"com.amazonaws.dynamodb#PartiQLStatement\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> A valid PartiQL statement. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Parameters\": {\n                    \"target\": \"com.amazonaws.dynamodb#PreparedStatementParameters\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The parameters associated with a PartiQL statement in the batch request. </p>\"\n                    }\n                },\n                \"ConsistentRead\": {\n                    \"target\": \"com.amazonaws.dynamodb#ConsistentRead\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The read consistency of the PartiQL batch request. </p>\"\n                    }\n                },\n                \"ReturnValuesOnConditionCheckFailure\": {\n                    \"target\": \"com.amazonaws.dynamodb#ReturnValuesOnConditionCheckFailure\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An optional parameter that returns the item attributes for a PartiQL batch request\\n            operation that failed a condition check.</p>\\n         <p>There is no additional cost associated with requesting a return value aside from the\\n            small network and processing overhead of receiving a larger response. No read capacity\\n            units are consumed.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p> A PartiQL batch statement request. </p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#BatchStatementResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Error\": {\n                    \"target\": \"com.amazonaws.dynamodb#BatchStatementError\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The error associated with a failed PartiQL batch statement. </p>\"\n                    }\n                },\n                \"TableName\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The table name associated with a failed PartiQL batch statement. </p>\"\n                    }\n                },\n                \"Item\": {\n                    \"target\": \"com.amazonaws.dynamodb#AttributeMap\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> A DynamoDB item associated with a BatchStatementResponse </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p> A PartiQL batch statement response.. </p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#BatchWriteItem\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.dynamodb#BatchWriteItemInput\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.dynamodb#BatchWriteItemOutput\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InvalidEndpointException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ItemCollectionSizeLimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ProvisionedThroughputExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ReplicatedWriteConflictException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#RequestLimitExceeded\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ThrottlingException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#clientDiscoveredEndpoint\": {\n                    \"required\": false\n                },\n                \"smithy.api#documentation\": \"<p>The <code>BatchWriteItem</code> operation puts or deletes multiple items in one or\\n            more tables. A single call to <code>BatchWriteItem</code> can transmit up to 16MB of\\n            data over the network, consisting of up to 25 item put or delete operations. While\\n            individual items can be up to 400 KB once stored, it's important to note that an item's\\n            representation might be greater than 400KB while being sent in DynamoDB's JSON format\\n            for the API call. For more details on this distinction, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.NamingRulesDataTypes.html\\\">Naming Rules and Data Types</a>.</p>\\n         <note>\\n            <p>\\n               <code>BatchWriteItem</code> cannot update items. If you perform a\\n                    <code>BatchWriteItem</code> operation on an existing item, that item's values\\n                will be overwritten by the operation and it will appear like it was updated. To\\n                update items, we recommend you use the <code>UpdateItem</code> action.</p>\\n         </note>\\n         <p>The individual <code>PutItem</code> and <code>DeleteItem</code> operations specified\\n            in <code>BatchWriteItem</code> are atomic; however <code>BatchWriteItem</code> as a\\n            whole is not. If any requested operations fail because the table's provisioned\\n            throughput is exceeded or an internal processing failure occurs, the failed operations\\n            are returned in the <code>UnprocessedItems</code> response parameter. You can\\n            investigate and optionally resend the requests. Typically, you would call\\n                <code>BatchWriteItem</code> in a loop. Each iteration would check for unprocessed\\n            items and submit a new <code>BatchWriteItem</code> request with those unprocessed items\\n            until all items have been processed.</p>\\n         <p>For tables and indexes with provisioned capacity, if none of the items can be\\n            processed due to insufficient provisioned throughput on all of the tables in the\\n            request, then <code>BatchWriteItem</code> returns a\\n                <code>ProvisionedThroughputExceededException</code>. For all tables and indexes, if\\n            none of the items can be processed due to other throttling scenarios (such as exceeding\\n            partition level limits), then <code>BatchWriteItem</code> returns a\\n                <code>ThrottlingException</code>.</p>\\n         <important>\\n            <p>If DynamoDB returns any unprocessed items, you should retry the batch operation on\\n                those items. However, <i>we strongly recommend that you use an exponential\\n                    backoff algorithm</i>. If you retry the batch operation immediately, the\\n                underlying read or write requests can still fail due to throttling on the individual\\n                tables. If you delay the batch operation using exponential backoff, the individual\\n                requests in the batch are much more likely to succeed.</p>\\n            <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ErrorHandling.html#Programming.Errors.BatchOperations\\\">Batch Operations and Error Handling</a> in the <i>Amazon DynamoDB\\n                    Developer Guide</i>.</p>\\n         </important>\\n         <p>With <code>BatchWriteItem</code>, you can efficiently write or delete large amounts of\\n            data, such as from Amazon EMR, or copy data from another database into DynamoDB. In\\n            order to improve performance with these large-scale operations,\\n                <code>BatchWriteItem</code> does not behave in the same way as individual\\n                <code>PutItem</code> and <code>DeleteItem</code> calls would. For example, you\\n            cannot specify conditions on individual put and delete requests, and\\n                <code>BatchWriteItem</code> does not return deleted items in the response.</p>\\n         <p>If you use a programming language that supports concurrency, you can use threads to\\n            write items in parallel. Your application must include the necessary logic to manage the\\n            threads. With languages that don't support threading, you must update or delete the\\n            specified items one at a time. In both situations, <code>BatchWriteItem</code> performs\\n            the specified put and delete operations in parallel, giving you the power of the thread\\n            pool approach without having to introduce complexity into your application.</p>\\n         <p>Parallel processing reduces latency, but each specified put and delete request\\n            consumes the same number of write capacity units whether it is processed in parallel or\\n            not. Delete operations on nonexistent items consume one write capacity unit.</p>\\n         <p>If one or more of the following is true, DynamoDB rejects the entire batch write\\n            operation:</p>\\n         <ul>\\n            <li>\\n               <p>One or more tables specified in the <code>BatchWriteItem</code> request does\\n                    not exist.</p>\\n            </li>\\n            <li>\\n               <p>Primary key attributes specified on an item in the request do not match those\\n                    in the corresponding table's primary key schema.</p>\\n            </li>\\n            <li>\\n               <p>You try to perform multiple operations on the same item in the same\\n                        <code>BatchWriteItem</code> request. For example, you cannot put and delete\\n                    the same item in the same <code>BatchWriteItem</code> request. </p>\\n            </li>\\n            <li>\\n               <p> Your request contains at least two items with identical hash and range keys\\n                    (which essentially is two put operations). </p>\\n            </li>\\n            <li>\\n               <p>There are more than 25 requests in the batch.</p>\\n            </li>\\n            <li>\\n               <p>Any individual item in a batch exceeds 400 KB.</p>\\n            </li>\\n            <li>\\n               <p>The total request size exceeds 16 MB.</p>\\n            </li>\\n            <li>\\n               <p>Any individual items with keys exceeding the key length limits. For a\\n                    partition key, the limit is 2048 bytes and for a sort key, the limit is 1024\\n                    bytes.</p>\\n            </li>\\n         </ul>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To add multiple items to a table\",\n                        \"documentation\": \"This example adds three new items to the Music table using a batch of three PutItem requests.\",\n                        \"input\": {\n                            \"RequestItems\": {\n                                \"Music\": [\n                                    {\n                                        \"PutRequest\": {\n                                            \"Item\": {\n                                                \"AlbumTitle\": {\n                                                    \"S\": \"Somewhat Famous\"\n                                                },\n                                                \"SongTitle\": {\n                                                    \"S\": \"Call Me Today\"\n                                                },\n                                                \"Artist\": {\n                                                    \"S\": \"No One You Know\"\n                                                }\n                                            }\n                                        }\n                                    },\n                                    {\n                                        \"PutRequest\": {\n                                            \"Item\": {\n                                                \"AlbumTitle\": {\n                                                    \"S\": \"Songs About Life\"\n                                                },\n                                                \"SongTitle\": {\n                                                    \"S\": \"Happy Day\"\n                                                },\n                                                \"Artist\": {\n                                                    \"S\": \"Acme Band\"\n                                                }\n                                            }\n                                        }\n                                    },\n                                    {\n                                        \"PutRequest\": {\n                                            \"Item\": {\n                                                \"AlbumTitle\": {\n                                                    \"S\": \"Blue Sky Blues\"\n                                                },\n                                                \"SongTitle\": {\n                                                    \"S\": \"Scared of My Shadow\"\n                                                },\n                                                \"Artist\": {\n                                                    \"S\": \"No One You Know\"\n                                                }\n                                            }\n                                        }\n                                    }\n                                ]\n                            }\n                        },\n                        \"output\": {}\n                    }\n                ],\n                \"smithy.rules#operationContextParams\": {\n                    \"ResourceArnList\": {\n                        \"path\": \"keys(RequestItems)\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#BatchWriteItemInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RequestItems\": {\n                    \"target\": \"com.amazonaws.dynamodb#BatchWriteItemRequestMap\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A map of one or more table names or table ARNs and, for each table, a list of\\n            operations to be performed (<code>DeleteRequest</code> or <code>PutRequest</code>). Each\\n            element in the map consists of the following:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>DeleteRequest</code> - Perform a <code>DeleteItem</code> operation on the\\n                    specified item. The item to be deleted is identified by a <code>Key</code>\\n                    subelement:</p>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <code>Key</code> - A map of primary key attribute values that uniquely\\n                            identify the item. Each entry in this map consists of an attribute name\\n                            and an attribute value. For each primary key, you must provide\\n                                <i>all</i> of the key attributes. For example, with a\\n                            simple primary key, you only need to provide a value for the partition\\n                            key. For a composite primary key, you must provide values for\\n                                <i>both</i> the partition key and the sort key.</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>PutRequest</code> - Perform a <code>PutItem</code> operation on the\\n                    specified item. The item to be put is identified by an <code>Item</code>\\n                    subelement:</p>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <code>Item</code> - A map of attributes and their values. Each entry in\\n                            this map consists of an attribute name and an attribute value. Attribute\\n                            values must not be null; string and binary type attributes must have\\n                            lengths greater than zero; and set type attributes must not be empty.\\n                            Requests that contain empty values are rejected with a\\n                                <code>ValidationException</code> exception.</p>\\n                     <p>If you specify any attributes that are part of an index key, then the\\n                            data types for those attributes must match those of the schema in the\\n                            table's attribute definition.</p>\\n                  </li>\\n               </ul>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ReturnConsumedCapacity\": {\n                    \"target\": \"com.amazonaws.dynamodb#ReturnConsumedCapacity\"\n                },\n                \"ReturnItemCollectionMetrics\": {\n                    \"target\": \"com.amazonaws.dynamodb#ReturnItemCollectionMetrics\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Determines whether item collection metrics are returned. If set to <code>SIZE</code>,\\n            the response includes statistics about item collections, if any, that were modified\\n            during the operation are returned in the response. If set to <code>NONE</code> (the\\n            default), no statistics are returned.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents the input of a <code>BatchWriteItem</code> operation.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#BatchWriteItemOutput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"UnprocessedItems\": {\n                    \"target\": \"com.amazonaws.dynamodb#BatchWriteItemRequestMap\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A map of tables and requests against those tables that were not processed. The\\n                <code>UnprocessedItems</code> value is in the same form as\\n            <code>RequestItems</code>, so you can provide this value directly to a subsequent\\n                <code>BatchWriteItem</code> operation. For more information, see\\n                <code>RequestItems</code> in the Request Parameters section.</p>\\n         <p>Each <code>UnprocessedItems</code> entry consists of a table name or table ARN\\n            and, for that table, a list of operations to perform (<code>DeleteRequest</code> or\\n                <code>PutRequest</code>).</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>DeleteRequest</code> - Perform a <code>DeleteItem</code> operation on the\\n                    specified item. The item to be deleted is identified by a <code>Key</code>\\n                    subelement:</p>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <code>Key</code> - A map of primary key attribute values that uniquely\\n                            identify the item. Each entry in this map consists of an attribute name\\n                            and an attribute value.</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>PutRequest</code> - Perform a <code>PutItem</code> operation on the\\n                    specified item. The item to be put is identified by an <code>Item</code>\\n                    subelement:</p>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <code>Item</code> - A map of attributes and their values. Each entry in\\n                            this map consists of an attribute name and an attribute value. Attribute\\n                            values must not be null; string and binary type attributes must have\\n                            lengths greater than zero; and set type attributes must not be empty.\\n                            Requests that contain empty values will be rejected with a\\n                                <code>ValidationException</code> exception.</p>\\n                     <p>If you specify any attributes that are part of an index key, then the\\n                            data types for those attributes must match those of the schema in the\\n                            table's attribute definition.</p>\\n                  </li>\\n               </ul>\\n            </li>\\n         </ul>\\n         <p>If there are no unprocessed items remaining, the response contains an empty\\n                <code>UnprocessedItems</code> map.</p>\"\n                    }\n                },\n                \"ItemCollectionMetrics\": {\n                    \"target\": \"com.amazonaws.dynamodb#ItemCollectionMetricsPerTable\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of tables that were processed by <code>BatchWriteItem</code> and, for each\\n            table, information about any item collections that were affected by individual\\n                <code>DeleteItem</code> or <code>PutItem</code> operations.</p>\\n         <p>Each entry consists of the following subelements:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>ItemCollectionKey</code> - The partition key value of the item collection.\\n                    This is the same as the partition key value of the item.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>SizeEstimateRangeGB</code> - An estimate of item collection size,\\n                    expressed in GB. This is a two-element array containing a lower bound and an\\n                    upper bound for the estimate. The estimate includes the size of all the items in\\n                    the table, plus the size of all attributes projected into all of the local\\n                    secondary indexes on the table. Use this estimate to measure whether a local\\n                    secondary index is approaching its size limit.</p>\\n               <p>The estimate is subject to change over time; therefore, do not rely on the\\n                    precision or accuracy of the estimate.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"ConsumedCapacity\": {\n                    \"target\": \"com.amazonaws.dynamodb#ConsumedCapacityMultiple\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The capacity units consumed by the entire <code>BatchWriteItem</code>\\n            operation.</p>\\n         <p>Each element consists of:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>TableName</code> - The table that consumed the provisioned\\n                    throughput.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>CapacityUnits</code> - The total number of capacity units consumed.</p>\\n            </li>\\n         </ul>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents the output of a <code>BatchWriteItem</code> operation.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#BatchWriteItemRequestMap\": {\n            \"type\": \"map\",\n            \"key\": {\n                \"target\": \"com.amazonaws.dynamodb#TableArn\"\n            },\n            \"value\": {\n                \"target\": \"com.amazonaws.dynamodb#WriteRequests\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 25\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#BilledSizeBytes\": {\n            \"type\": \"long\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 0\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#BillingMode\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"PROVISIONED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"PROVISIONED\"\n                    }\n                },\n                \"PAY_PER_REQUEST\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"PAY_PER_REQUEST\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#BillingModeSummary\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"BillingMode\": {\n                    \"target\": \"com.amazonaws.dynamodb#BillingMode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Controls how you are charged for read and write throughput and how you manage\\n            capacity. This setting can be changed later.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>PROVISIONED</code> - Sets the read/write capacity mode to\\n                        <code>PROVISIONED</code>. We recommend using <code>PROVISIONED</code> for\\n                    predictable workloads.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>PAY_PER_REQUEST</code> - Sets the read/write capacity mode to\\n                        <code>PAY_PER_REQUEST</code>. We recommend using\\n                        <code>PAY_PER_REQUEST</code> for unpredictable workloads. </p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"LastUpdateToPayPerRequestDateTime\": {\n                    \"target\": \"com.amazonaws.dynamodb#Date\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Represents the time when <code>PAY_PER_REQUEST</code> was last set as the read/write\\n            capacity mode.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the details for the read/write capacity mode. This page talks about\\n                <code>PROVISIONED</code> and <code>PAY_PER_REQUEST</code> billing modes. For more\\n            information about these modes, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.ReadWriteCapacityMode.html\\\">Read/write capacity mode</a>.</p>\\n         <note>\\n            <p>You may need to switch to on-demand mode at least once in order to return a\\n                    <code>BillingModeSummary</code> response.</p>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#BinaryAttributeValue\": {\n            \"type\": \"blob\"\n        },\n        \"com.amazonaws.dynamodb#BinarySetAttributeValue\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.dynamodb#BinaryAttributeValue\"\n            }\n        },\n        \"com.amazonaws.dynamodb#BooleanAttributeValue\": {\n            \"type\": \"boolean\"\n        },\n        \"com.amazonaws.dynamodb#BooleanObject\": {\n            \"type\": \"boolean\"\n        },\n        \"com.amazonaws.dynamodb#CancellationReason\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Item\": {\n                    \"target\": \"com.amazonaws.dynamodb#AttributeMap\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Item in the request which caused the transaction to get cancelled.</p>\"\n                    }\n                },\n                \"Code\": {\n                    \"target\": \"com.amazonaws.dynamodb#Code\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Status code for the result of the cancelled transaction.</p>\"\n                    }\n                },\n                \"Message\": {\n                    \"target\": \"com.amazonaws.dynamodb#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Cancellation reason message description.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>An ordered list of errors for each item in the request which caused the transaction to\\n            get cancelled. The values of the list are ordered according to the ordering of the\\n                <code>TransactWriteItems</code> request parameter. If no error occurred for the\\n            associated item an error with a Null code and Null message will be present. </p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#CancellationReasonList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.dynamodb#CancellationReason\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 100\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#Capacity\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ReadCapacityUnits\": {\n                    \"target\": \"com.amazonaws.dynamodb#ConsumedCapacityUnits\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The total number of read capacity units consumed on a table or an index.</p>\"\n                    }\n                },\n                \"WriteCapacityUnits\": {\n                    \"target\": \"com.amazonaws.dynamodb#ConsumedCapacityUnits\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The total number of write capacity units consumed on a table or an index.</p>\"\n                    }\n                },\n                \"CapacityUnits\": {\n                    \"target\": \"com.amazonaws.dynamodb#ConsumedCapacityUnits\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The total number of capacity units consumed on a table or an index.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents the amount of provisioned throughput capacity consumed on a table or an\\n            index.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#ClientRequestToken\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 36\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#ClientToken\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#pattern\": \"^[^\\\\$]+$\"\n            }\n        },\n        \"com.amazonaws.dynamodb#CloudWatchLogGroupArn\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 1024\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#Code\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.dynamodb#ComparisonOperator\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"EQ\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"EQ\"\n                    }\n                },\n                \"NE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"NE\"\n                    }\n                },\n                \"IN\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"IN\"\n                    }\n                },\n                \"LE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"LE\"\n                    }\n                },\n                \"LT\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"LT\"\n                    }\n                },\n                \"GE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"GE\"\n                    }\n                },\n                \"GT\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"GT\"\n                    }\n                },\n                \"BETWEEN\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"BETWEEN\"\n                    }\n                },\n                \"NOT_NULL\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"NOT_NULL\"\n                    }\n                },\n                \"NULL\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"NULL\"\n                    }\n                },\n                \"CONTAINS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"CONTAINS\"\n                    }\n                },\n                \"NOT_CONTAINS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"NOT_CONTAINS\"\n                    }\n                },\n                \"BEGINS_WITH\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"BEGINS_WITH\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#Condition\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AttributeValueList\": {\n                    \"target\": \"com.amazonaws.dynamodb#AttributeValueList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more values to evaluate against the supplied attribute. The number of values in\\n            the list depends on the <code>ComparisonOperator</code> being used.</p>\\n         <p>For type Number, value comparisons are numeric.</p>\\n         <p>String value comparisons for greater than, equals, or less than are based on ASCII\\n            character code values. For example, <code>a</code> is greater than <code>A</code>, and\\n                <code>a</code> is greater than <code>B</code>. For a list of code values, see <a href=\\\"http://en.wikipedia.org/wiki/ASCII#ASCII_printable_characters\\\">http://en.wikipedia.org/wiki/ASCII#ASCII_printable_characters</a>.</p>\\n         <p>For Binary, DynamoDB treats each byte of the binary data as unsigned when it\\n            compares binary values.</p>\"\n                    }\n                },\n                \"ComparisonOperator\": {\n                    \"target\": \"com.amazonaws.dynamodb#ComparisonOperator\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A comparator for evaluating attributes. For example, equals, greater than, less than,\\n            etc.</p>\\n         <p>The following comparison operators are available:</p>\\n         <p>\\n            <code>EQ | NE | LE | LT | GE | GT | NOT_NULL | NULL | CONTAINS | NOT_CONTAINS |\\n                BEGINS_WITH | IN | BETWEEN</code>\\n         </p>\\n         <p>The following are descriptions of each comparison operator.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>EQ</code> : Equal. <code>EQ</code> is supported for all data types,\\n                    including lists and maps.</p>\\n               <p>\\n                  <code>AttributeValueList</code> can contain only one <code>AttributeValue</code>\\n                    element of type String, Number, Binary, String Set, Number Set, or Binary Set.\\n                    If an item contains an <code>AttributeValue</code> element of a different type\\n                    than the one provided in the request, the value does not match. For example,\\n                        <code>{\\\"S\\\":\\\"6\\\"}</code> does not equal <code>{\\\"N\\\":\\\"6\\\"}</code>. Also,\\n                        <code>{\\\"N\\\":\\\"6\\\"}</code> does not equal <code>{\\\"NS\\\":[\\\"6\\\", \\\"2\\\",\\n                    \\\"1\\\"]}</code>.</p>\\n               <p></p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>NE</code> : Not equal. <code>NE</code> is supported for all data types,\\n                    including lists and maps.</p>\\n               <p>\\n                  <code>AttributeValueList</code> can contain only one <code>AttributeValue</code>\\n                    of type String, Number, Binary, String Set, Number Set, or Binary Set. If an\\n                    item contains an <code>AttributeValue</code> of a different type than the one\\n                    provided in the request, the value does not match. For example,\\n                        <code>{\\\"S\\\":\\\"6\\\"}</code> does not equal <code>{\\\"N\\\":\\\"6\\\"}</code>. Also,\\n                        <code>{\\\"N\\\":\\\"6\\\"}</code> does not equal <code>{\\\"NS\\\":[\\\"6\\\", \\\"2\\\",\\n                    \\\"1\\\"]}</code>.</p>\\n               <p></p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>LE</code> : Less than or equal. </p>\\n               <p>\\n                  <code>AttributeValueList</code> can contain only one <code>AttributeValue</code>\\n                    element of type String, Number, or Binary (not a set type). If an item contains\\n                    an <code>AttributeValue</code> element of a different type than the one provided\\n                    in the request, the value does not match. For example, <code>{\\\"S\\\":\\\"6\\\"}</code>\\n                    does not equal <code>{\\\"N\\\":\\\"6\\\"}</code>. Also, <code>{\\\"N\\\":\\\"6\\\"}</code> does not\\n                    compare to <code>{\\\"NS\\\":[\\\"6\\\", \\\"2\\\", \\\"1\\\"]}</code>.</p>\\n               <p></p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>LT</code> : Less than. </p>\\n               <p>\\n                  <code>AttributeValueList</code> can contain only one <code>AttributeValue</code>\\n                    of type String, Number, or Binary (not a set type). If an item contains an\\n                        <code>AttributeValue</code> element of a different type than the one\\n                    provided in the request, the value does not match. For example,\\n                        <code>{\\\"S\\\":\\\"6\\\"}</code> does not equal <code>{\\\"N\\\":\\\"6\\\"}</code>. Also,\\n                        <code>{\\\"N\\\":\\\"6\\\"}</code> does not compare to <code>{\\\"NS\\\":[\\\"6\\\", \\\"2\\\",\\n                        \\\"1\\\"]}</code>.</p>\\n               <p></p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>GE</code> : Greater than or equal. </p>\\n               <p>\\n                  <code>AttributeValueList</code> can contain only one <code>AttributeValue</code>\\n                    element of type String, Number, or Binary (not a set type). If an item contains\\n                    an <code>AttributeValue</code> element of a different type than the one provided\\n                    in the request, the value does not match. For example, <code>{\\\"S\\\":\\\"6\\\"}</code>\\n                    does not equal <code>{\\\"N\\\":\\\"6\\\"}</code>. Also, <code>{\\\"N\\\":\\\"6\\\"}</code> does not\\n                    compare to <code>{\\\"NS\\\":[\\\"6\\\", \\\"2\\\", \\\"1\\\"]}</code>.</p>\\n               <p></p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>GT</code> : Greater than. </p>\\n               <p>\\n                  <code>AttributeValueList</code> can contain only one <code>AttributeValue</code>\\n                    element of type String, Number, or Binary (not a set type). If an item contains\\n                    an <code>AttributeValue</code> element of a different type than the one provided\\n                    in the request, the value does not match. For example, <code>{\\\"S\\\":\\\"6\\\"}</code>\\n                    does not equal <code>{\\\"N\\\":\\\"6\\\"}</code>. Also, <code>{\\\"N\\\":\\\"6\\\"}</code> does not\\n                    compare to <code>{\\\"NS\\\":[\\\"6\\\", \\\"2\\\", \\\"1\\\"]}</code>.</p>\\n               <p></p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>NOT_NULL</code> : The attribute exists. <code>NOT_NULL</code> is supported\\n                    for all data types, including lists and maps.</p>\\n               <note>\\n                  <p>This operator tests for the existence of an attribute, not its data type.\\n                        If the data type of attribute \\\"<code>a</code>\\\" is null, and you evaluate it\\n                        using <code>NOT_NULL</code>, the result is a Boolean <code>true</code>. This\\n                        result is because the attribute \\\"<code>a</code>\\\" exists; its data type is\\n                        not relevant to the <code>NOT_NULL</code> comparison operator.</p>\\n               </note>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>NULL</code> : The attribute does not exist. <code>NULL</code> is supported\\n                    for all data types, including lists and maps.</p>\\n               <note>\\n                  <p>This operator tests for the nonexistence of an attribute, not its data\\n                        type. If the data type of attribute \\\"<code>a</code>\\\" is null, and you\\n                        evaluate it using <code>NULL</code>, the result is a Boolean\\n                            <code>false</code>. This is because the attribute \\\"<code>a</code>\\\"\\n                        exists; its data type is not relevant to the <code>NULL</code> comparison\\n                        operator.</p>\\n               </note>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>CONTAINS</code> : Checks for a subsequence, or value in a set.</p>\\n               <p>\\n                  <code>AttributeValueList</code> can contain only one <code>AttributeValue</code>\\n                    element of type String, Number, or Binary (not a set type). If the target\\n                    attribute of the comparison is of type String, then the operator checks for a\\n                    substring match. If the target attribute of the comparison is of type Binary,\\n                    then the operator looks for a subsequence of the target that matches the input.\\n                    If the target attribute of the comparison is a set (\\\"<code>SS</code>\\\",\\n                        \\\"<code>NS</code>\\\", or \\\"<code>BS</code>\\\"), then the operator evaluates to\\n                    true if it finds an exact match with any member of the set.</p>\\n               <p>CONTAINS is supported for lists: When evaluating \\\"<code>a CONTAINS b</code>\\\",\\n                        \\\"<code>a</code>\\\" can be a list; however, \\\"<code>b</code>\\\" cannot be a set, a\\n                    map, or a list.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>NOT_CONTAINS</code> : Checks for absence of a subsequence, or absence of a\\n                    value in a set.</p>\\n               <p>\\n                  <code>AttributeValueList</code> can contain only one <code>AttributeValue</code>\\n                    element of type String, Number, or Binary (not a set type). If the target\\n                    attribute of the comparison is a String, then the operator checks for the\\n                    absence of a substring match. If the target attribute of the comparison is\\n                    Binary, then the operator checks for the absence of a subsequence of the target\\n                    that matches the input. If the target attribute of the comparison is a set\\n                        (\\\"<code>SS</code>\\\", \\\"<code>NS</code>\\\", or \\\"<code>BS</code>\\\"), then the\\n                    operator evaluates to true if it <i>does not</i> find an exact\\n                    match with any member of the set.</p>\\n               <p>NOT_CONTAINS is supported for lists: When evaluating \\\"<code>a NOT CONTAINS\\n                        b</code>\\\", \\\"<code>a</code>\\\" can be a list; however, \\\"<code>b</code>\\\" cannot\\n                    be a set, a map, or a list.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>BEGINS_WITH</code> : Checks for a prefix. </p>\\n               <p>\\n                  <code>AttributeValueList</code> can contain only one <code>AttributeValue</code>\\n                    of type String or Binary (not a Number or a set type). The target attribute of\\n                    the comparison must be of type String or Binary (not a Number or a set\\n                    type).</p>\\n               <p></p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>IN</code> : Checks for matching elements in a list.</p>\\n               <p>\\n                  <code>AttributeValueList</code> can contain one or more\\n                        <code>AttributeValue</code> elements of type String, Number, or Binary.\\n                    These attributes are compared against an existing attribute of an item. If any\\n                    elements of the input are equal to the item attribute, the expression evaluates\\n                    to true.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>BETWEEN</code> : Greater than or equal to the first value, and less than\\n                    or equal to the second value. </p>\\n               <p>\\n                  <code>AttributeValueList</code> must contain two <code>AttributeValue</code>\\n                    elements of the same type, either String, Number, or Binary (not a set type). A\\n                    target attribute matches if the target value is greater than, or equal to, the\\n                    first element and less than, or equal to, the second element. If an item\\n                    contains an <code>AttributeValue</code> element of a different type than the one\\n                    provided in the request, the value does not match. For example,\\n                        <code>{\\\"S\\\":\\\"6\\\"}</code> does not compare to <code>{\\\"N\\\":\\\"6\\\"}</code>. Also,\\n                        <code>{\\\"N\\\":\\\"6\\\"}</code> does not compare to <code>{\\\"NS\\\":[\\\"6\\\", \\\"2\\\",\\n                        \\\"1\\\"]}</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>For usage examples of <code>AttributeValueList</code> and\\n                <code>ComparisonOperator</code>, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/LegacyConditionalParameters.html\\\">Legacy\\n                Conditional Parameters</a> in the <i>Amazon DynamoDB Developer\\n                Guide</i>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents the selection criteria for a <code>Query</code> or <code>Scan</code>\\n            operation:</p>\\n         <ul>\\n            <li>\\n               <p>For a <code>Query</code> operation, <code>Condition</code> is used for\\n                    specifying the <code>KeyConditions</code> to use when querying a table or an\\n                    index. For <code>KeyConditions</code>, only the following comparison operators\\n                    are supported:</p>\\n               <p>\\n                  <code>EQ | LE | LT | GE | GT | BEGINS_WITH | BETWEEN</code>\\n               </p>\\n               <p>\\n                  <code>Condition</code> is also used in a <code>QueryFilter</code>, which\\n                    evaluates the query results and returns only the desired values.</p>\\n            </li>\\n            <li>\\n               <p>For a <code>Scan</code> operation, <code>Condition</code> is used in a\\n                        <code>ScanFilter</code>, which evaluates the scan results and returns only\\n                    the desired values.</p>\\n            </li>\\n         </ul>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#ConditionCheck\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Key\": {\n                    \"target\": \"com.amazonaws.dynamodb#Key\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The primary key of the item to be checked. Each element consists of an attribute name\\n            and a value for that attribute.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TableName\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Name of the table for the check item request. You can also provide the Amazon Resource Name (ARN) of\\n            the table in this parameter.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ConditionExpression\": {\n                    \"target\": \"com.amazonaws.dynamodb#ConditionExpression\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A condition that must be satisfied in order for a conditional update to succeed. For\\n            more information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.ConditionExpressions.html\\\">Condition expressions</a> in the <i>Amazon DynamoDB Developer\\n                Guide</i>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ExpressionAttributeNames\": {\n                    \"target\": \"com.amazonaws.dynamodb#ExpressionAttributeNameMap\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more substitution tokens for attribute names in an expression. For more\\n            information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.ExpressionAttributeNames.html\\\">Expression attribute names</a> in the <i>Amazon DynamoDB Developer\\n                Guide</i>.</p>\"\n                    }\n                },\n                \"ExpressionAttributeValues\": {\n                    \"target\": \"com.amazonaws.dynamodb#ExpressionAttributeValueMap\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more values that can be substituted in an expression. For more information, see\\n                <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.ConditionExpressions.html\\\">Condition expressions</a> in the <i>Amazon DynamoDB Developer\\n                Guide</i>.</p>\"\n                    }\n                },\n                \"ReturnValuesOnConditionCheckFailure\": {\n                    \"target\": \"com.amazonaws.dynamodb#ReturnValuesOnConditionCheckFailure\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use <code>ReturnValuesOnConditionCheckFailure</code> to get the item attributes if the\\n                <code>ConditionCheck</code> condition fails. For\\n                <code>ReturnValuesOnConditionCheckFailure</code>, the valid values are: NONE and\\n            ALL_OLD.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents a request to perform a check that an item exists or to check the condition\\n            of specific attributes of the item.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#ConditionExpression\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.dynamodb#ConditionalCheckFailedException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.dynamodb#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The conditional request failed.</p>\"\n                    }\n                },\n                \"Item\": {\n                    \"target\": \"com.amazonaws.dynamodb#AttributeMap\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Item which caused the <code>ConditionalCheckFailedException</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A condition specified in the operation failed to be evaluated.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.dynamodb#ConditionalOperator\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"AND\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AND\"\n                    }\n                },\n                \"OR\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"OR\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#ConfirmRemoveSelfResourceAccess\": {\n            \"type\": \"boolean\",\n            \"traits\": {\n                \"smithy.api#default\": false\n            }\n        },\n        \"com.amazonaws.dynamodb#ConsistentRead\": {\n            \"type\": \"boolean\"\n        },\n        \"com.amazonaws.dynamodb#ConsumedCapacity\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TableName\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the table that was affected by the operation. If you had specified the\\n            Amazon Resource Name (ARN) of a table in the input, you'll see the table ARN in the response.</p>\"\n                    }\n                },\n                \"CapacityUnits\": {\n                    \"target\": \"com.amazonaws.dynamodb#ConsumedCapacityUnits\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The total number of capacity units consumed by the operation.</p>\"\n                    }\n                },\n                \"ReadCapacityUnits\": {\n                    \"target\": \"com.amazonaws.dynamodb#ConsumedCapacityUnits\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The total number of read capacity units consumed by the operation.</p>\"\n                    }\n                },\n                \"WriteCapacityUnits\": {\n                    \"target\": \"com.amazonaws.dynamodb#ConsumedCapacityUnits\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The total number of write capacity units consumed by the operation.</p>\"\n                    }\n                },\n                \"Table\": {\n                    \"target\": \"com.amazonaws.dynamodb#Capacity\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The amount of throughput consumed on the table affected by the operation.</p>\"\n                    }\n                },\n                \"LocalSecondaryIndexes\": {\n                    \"target\": \"com.amazonaws.dynamodb#SecondaryIndexesCapacityMap\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The amount of throughput consumed on each local index affected by the\\n            operation.</p>\"\n                    }\n                },\n                \"GlobalSecondaryIndexes\": {\n                    \"target\": \"com.amazonaws.dynamodb#SecondaryIndexesCapacityMap\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The amount of throughput consumed on each global index affected by the\\n            operation.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The capacity units consumed by an operation. The data returned includes the total\\n            provisioned throughput consumed, along with statistics for the table and any indexes\\n            involved in the operation. <code>ConsumedCapacity</code> is only returned if the request\\n            asked for it. For more information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/provisioned-capacity-mode.html\\\">Provisioned capacity mode</a> in the <i>Amazon DynamoDB Developer\\n                Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#ConsumedCapacityMultiple\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.dynamodb#ConsumedCapacity\"\n            }\n        },\n        \"com.amazonaws.dynamodb#ConsumedCapacityUnits\": {\n            \"type\": \"double\"\n        },\n        \"com.amazonaws.dynamodb#ContinuousBackupsDescription\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ContinuousBackupsStatus\": {\n                    \"target\": \"com.amazonaws.dynamodb#ContinuousBackupsStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>\\n            <code>ContinuousBackupsStatus</code> can be one of the following states: ENABLED,\\n            DISABLED</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"PointInTimeRecoveryDescription\": {\n                    \"target\": \"com.amazonaws.dynamodb#PointInTimeRecoveryDescription\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The description of the point in time recovery settings applied to the table.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents the continuous backups and point in time recovery settings on the\\n            table.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#ContinuousBackupsStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ENABLED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ENABLED\"\n                    }\n                },\n                \"DISABLED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DISABLED\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#ContinuousBackupsUnavailableException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.dynamodb#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Backups have not yet been enabled for this table.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.dynamodb#ContributorInsightsAction\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ENABLE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ENABLE\"\n                    }\n                },\n                \"DISABLE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DISABLE\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#ContributorInsightsMode\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ACCESSED_AND_THROTTLED_KEYS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ACCESSED_AND_THROTTLED_KEYS\"\n                    }\n                },\n                \"THROTTLED_KEYS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"THROTTLED_KEYS\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#ContributorInsightsRule\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#pattern\": \"^[A-Za-z0-9][A-Za-z0-9\\\\-\\\\_\\\\.]{0,126}[A-Za-z0-9]$\"\n            }\n        },\n        \"com.amazonaws.dynamodb#ContributorInsightsRuleList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.dynamodb#ContributorInsightsRule\"\n            }\n        },\n        \"com.amazonaws.dynamodb#ContributorInsightsStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ENABLING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ENABLING\"\n                    }\n                },\n                \"ENABLED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ENABLED\"\n                    }\n                },\n                \"DISABLING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DISABLING\"\n                    }\n                },\n                \"DISABLED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DISABLED\"\n                    }\n                },\n                \"FAILED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"FAILED\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#ContributorInsightsSummaries\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.dynamodb#ContributorInsightsSummary\"\n            }\n        },\n        \"com.amazonaws.dynamodb#ContributorInsightsSummary\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TableName\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Name of the table associated with the summary.</p>\"\n                    }\n                },\n                \"IndexName\": {\n                    \"target\": \"com.amazonaws.dynamodb#IndexName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Name of the index associated with the summary, if any.</p>\"\n                    }\n                },\n                \"ContributorInsightsStatus\": {\n                    \"target\": \"com.amazonaws.dynamodb#ContributorInsightsStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Describes the current status for contributor insights for the given table and index,\\n            if applicable.</p>\"\n                    }\n                },\n                \"ContributorInsightsMode\": {\n                    \"target\": \"com.amazonaws.dynamodb#ContributorInsightsMode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates the current mode of CloudWatch Contributor Insights, specifying whether it\\n            tracks all access and throttled events or throttled events only for the DynamoDB\\n            table or index.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents a Contributor Insights summary entry.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#CreateBackup\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.dynamodb#CreateBackupInput\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.dynamodb#CreateBackupOutput\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.dynamodb#BackupInUseException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ContinuousBackupsUnavailableException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InvalidEndpointException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#TableInUseException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#TableNotFoundException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#clientDiscoveredEndpoint\": {\n                    \"required\": false\n                },\n                \"smithy.api#documentation\": \"<p>Creates a backup for an existing table.</p>\\n         <p> Each time you create an on-demand backup, the entire table data is backed up. There\\n            is no limit to the number of on-demand backups that can be taken. </p>\\n         <p> When you create an on-demand backup, a time marker of the request is cataloged, and\\n            the backup is created asynchronously, by applying all changes until the time of the\\n            request to the last full table snapshot. Backup requests are processed instantaneously\\n            and become available for restore within minutes. </p>\\n         <p>You can call <code>CreateBackup</code> at a maximum rate of 50 times per\\n            second.</p>\\n         <p>All backups in DynamoDB work without consuming any provisioned throughput on the\\n            table.</p>\\n         <p> If you submit a backup request on 2018-12-14 at 14:25:00, the backup is guaranteed to\\n            contain all data committed to the table up to 14:24:00, and data committed after\\n            14:26:00 will not be. The backup might contain data modifications made between 14:24:00\\n            and 14:26:00. On-demand backup does not support causal consistency. </p>\\n         <p> Along with data, the following are also included on the backups: </p>\\n         <ul>\\n            <li>\\n               <p>Global secondary indexes (GSIs)</p>\\n            </li>\\n            <li>\\n               <p>Local secondary indexes (LSIs)</p>\\n            </li>\\n            <li>\\n               <p>Streams</p>\\n            </li>\\n            <li>\\n               <p>Provisioned read and write capacity</p>\\n            </li>\\n         </ul>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#CreateBackupInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TableName\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the table. You can also provide the Amazon Resource Name (ARN) of the table in this\\n            parameter.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"ResourceArn\"\n                        }\n                    }\n                },\n                \"BackupName\": {\n                    \"target\": \"com.amazonaws.dynamodb#BackupName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specified name for the backup.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#CreateBackupOutput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"BackupDetails\": {\n                    \"target\": \"com.amazonaws.dynamodb#BackupDetails\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Contains the details of the backup created for the table.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#CreateGlobalSecondaryIndexAction\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"IndexName\": {\n                    \"target\": \"com.amazonaws.dynamodb#IndexName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the global secondary index to be created.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"KeySchema\": {\n                    \"target\": \"com.amazonaws.dynamodb#KeySchema\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The key schema for the global secondary index.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Projection\": {\n                    \"target\": \"com.amazonaws.dynamodb#Projection\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Represents attributes that are copied (projected) from the table into an index. These\\n            are in addition to the primary key attributes and index key attributes, which are\\n            automatically projected.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ProvisionedThroughput\": {\n                    \"target\": \"com.amazonaws.dynamodb#ProvisionedThroughput\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Represents the provisioned throughput settings for the specified global secondary\\n            index.</p>\\n         <p>For current minimum and maximum provisioned throughput values, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Limits.html\\\">Service,\\n                Account, and Table Quotas</a> in the <i>Amazon DynamoDB Developer\\n                Guide</i>.</p>\"\n                    }\n                },\n                \"OnDemandThroughput\": {\n                    \"target\": \"com.amazonaws.dynamodb#OnDemandThroughput\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of read and write units for the global secondary index being\\n            created. If you use this parameter, you must specify <code>MaxReadRequestUnits</code>,\\n                <code>MaxWriteRequestUnits</code>, or both. You must use either <code>OnDemand\\n                Throughput</code> or <code>ProvisionedThroughput</code> based on your table's\\n            capacity mode.</p>\"\n                    }\n                },\n                \"WarmThroughput\": {\n                    \"target\": \"com.amazonaws.dynamodb#WarmThroughput\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Represents the warm throughput value (in read units per second and write units per\\n            second) when creating a secondary index.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents a new global secondary index to be added to an existing table.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#CreateGlobalTable\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.dynamodb#CreateGlobalTableInput\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.dynamodb#CreateGlobalTableOutput\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.dynamodb#GlobalTableAlreadyExistsException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InvalidEndpointException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#TableNotFoundException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#clientDiscoveredEndpoint\": {\n                    \"required\": false\n                },\n                \"smithy.api#documentation\": \"<p>Creates a global table from an existing table. A global table creates a replication\\n            relationship between two or more DynamoDB tables with the same table name in the\\n            provided Regions. </p>\\n         <important>\\n            <p>This documentation is for version 2017.11.29 (Legacy) of global tables, which should be avoided for new global tables. Customers should use <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GlobalTables.html\\\">Global Tables version 2019.11.21 (Current)</a> when possible, because it provides greater flexibility, higher efficiency, and consumes less write capacity than 2017.11.29 (Legacy).</p>\\n            <p>To determine which version you're using, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/globaltables.DetermineVersion.html\\\">Determining the global table version you are using</a>. To update existing global tables from version 2017.11.29 (Legacy) to version 2019.11.21 (Current), see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/V2globaltables_upgrade.html\\\">Upgrading global tables</a>.</p>\\n         </important>\\n         <p>If you want to add a new replica table to a global table, each of the following\\n            conditions must be true:</p>\\n         <ul>\\n            <li>\\n               <p>The table must have the same primary key as all of the other replicas.</p>\\n            </li>\\n            <li>\\n               <p>The table must have the same name as all of the other replicas.</p>\\n            </li>\\n            <li>\\n               <p>The table must have DynamoDB Streams enabled, with the stream containing both\\n                    the new and the old images of the item.</p>\\n            </li>\\n            <li>\\n               <p>None of the replica tables in the global table can contain any data.</p>\\n            </li>\\n         </ul>\\n         <p> If global secondary indexes are specified, then the following conditions must also be\\n            met: </p>\\n         <ul>\\n            <li>\\n               <p> The global secondary indexes must have the same name. </p>\\n            </li>\\n            <li>\\n               <p> The global secondary indexes must have the same hash key and sort key (if\\n                    present). </p>\\n            </li>\\n         </ul>\\n         <p> If local secondary indexes are specified, then the following conditions must also be\\n            met: </p>\\n         <ul>\\n            <li>\\n               <p> The local secondary indexes must have the same name. </p>\\n            </li>\\n            <li>\\n               <p> The local secondary indexes must have the same hash key and sort key (if\\n                    present). </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p> Write capacity settings should be set consistently across your replica tables and\\n                secondary indexes. DynamoDB strongly recommends enabling auto scaling to manage the\\n                write capacity settings for all of your global tables replicas and indexes. </p>\\n            <p> If you prefer to manage write capacity settings manually, you should provision\\n                equal replicated write capacity units to your replica tables. You should also\\n                provision equal replicated write capacity units to matching secondary indexes across\\n                your global table. </p>\\n         </important>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#CreateGlobalTableInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"GlobalTableName\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The global table name.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"ResourceArn\"\n                        }\n                    }\n                },\n                \"ReplicationGroup\": {\n                    \"target\": \"com.amazonaws.dynamodb#ReplicaList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Regions where the global table needs to be created.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#CreateGlobalTableOutput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"GlobalTableDescription\": {\n                    \"target\": \"com.amazonaws.dynamodb#GlobalTableDescription\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Contains the details of the global table.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#CreateGlobalTableWitnessGroupMemberAction\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RegionName\": {\n                    \"target\": \"com.amazonaws.dynamodb#RegionName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services Region name to be added as a witness Region for the MRSC global\\n            table. The witness must be in a different Region than the replicas and within the same\\n            Region set:</p>\\n         <ul>\\n            <li>\\n               <p>US Region set: US East (N. Virginia), US East (Ohio), US West (Oregon)</p>\\n            </li>\\n            <li>\\n               <p>EU Region set: Europe (Ireland), Europe (London), Europe (Paris), Europe\\n                    (Frankfurt)</p>\\n            </li>\\n            <li>\\n               <p>AP Region set: Asia Pacific (Tokyo), Asia Pacific (Seoul), Asia Pacific\\n                    (Osaka)</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Specifies the action to add a new witness Region to a MRSC global table. A MRSC global\\n            table can be configured with either three replicas, or with two replicas and one\\n            witness.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#CreateReplicaAction\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RegionName\": {\n                    \"target\": \"com.amazonaws.dynamodb#RegionName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Region of the replica to be added.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents a replica to be added.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#CreateReplicationGroupMemberAction\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RegionName\": {\n                    \"target\": \"com.amazonaws.dynamodb#RegionName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Region where the new replica will be created.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"KMSMasterKeyId\": {\n                    \"target\": \"com.amazonaws.dynamodb#KMSMasterKeyId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The KMS key that should be used for KMS encryption in\\n            the new replica. To specify a key, use its key ID, Amazon Resource Name (ARN), alias\\n            name, or alias ARN. Note that you should only provide this parameter if the key is\\n            different from the default DynamoDB KMS key\\n            <code>alias/aws/dynamodb</code>.</p>\"\n                    }\n                },\n                \"ProvisionedThroughputOverride\": {\n                    \"target\": \"com.amazonaws.dynamodb#ProvisionedThroughputOverride\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Replica-specific provisioned throughput. If not specified, uses the source table's\\n            provisioned throughput settings.</p>\"\n                    }\n                },\n                \"OnDemandThroughputOverride\": {\n                    \"target\": \"com.amazonaws.dynamodb#OnDemandThroughputOverride\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum on-demand throughput settings for the specified replica table being\\n            created. You can only modify <code>MaxReadRequestUnits</code>, because you can't modify\\n                <code>MaxWriteRequestUnits</code> for individual replica tables. </p>\"\n                    }\n                },\n                \"GlobalSecondaryIndexes\": {\n                    \"target\": \"com.amazonaws.dynamodb#ReplicaGlobalSecondaryIndexList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Replica-specific global secondary index settings.</p>\"\n                    }\n                },\n                \"TableClassOverride\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableClass\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Replica-specific table class. If not specified, uses the source table's table\\n            class.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents a replica to be created.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#CreateTable\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.dynamodb#CreateTableInput\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.dynamodb#CreateTableOutput\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InvalidEndpointException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ResourceInUseException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#clientDiscoveredEndpoint\": {\n                    \"required\": false\n                },\n                \"smithy.api#documentation\": \"<p>The <code>CreateTable</code> operation adds a new table to your account. In an Amazon Web Services account, table names must be unique within each Region. That is, you can\\n            have two tables with same name if you create the tables in different Regions.</p>\\n         <p>\\n            <code>CreateTable</code> is an asynchronous operation. Upon receiving a\\n                <code>CreateTable</code> request, DynamoDB immediately returns a response with a\\n                <code>TableStatus</code> of <code>CREATING</code>. After the table is created,\\n            DynamoDB sets the <code>TableStatus</code> to <code>ACTIVE</code>. You can perform read\\n            and write operations only on an <code>ACTIVE</code> table. </p>\\n         <p>You can optionally define secondary indexes on the new table, as part of the\\n                <code>CreateTable</code> operation. If you want to create multiple tables with\\n            secondary indexes on them, you must create the tables sequentially. Only one table with\\n            secondary indexes can be in the <code>CREATING</code> state at any given time.</p>\\n         <p>You can use the <code>DescribeTable</code> action to check the table status.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#CreateTableInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AttributeDefinitions\": {\n                    \"target\": \"com.amazonaws.dynamodb#AttributeDefinitions\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An array of attributes that describe the key schema for the table and indexes.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TableName\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the table to create. You can also provide the Amazon Resource Name (ARN) of the table in\\n            this parameter.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"ResourceArn\"\n                        }\n                    }\n                },\n                \"KeySchema\": {\n                    \"target\": \"com.amazonaws.dynamodb#KeySchema\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the attributes that make up the primary key for a table or an index. The\\n            attributes in <code>KeySchema</code> must also be defined in the\\n                <code>AttributeDefinitions</code> array. For more information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DataModel.html\\\">Data\\n                Model</a> in the <i>Amazon DynamoDB Developer Guide</i>.</p>\\n         <p>Each <code>KeySchemaElement</code> in the array is composed of:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>AttributeName</code> - The name of this key attribute.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>KeyType</code> - The role that the key attribute will assume:</p>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <code>HASH</code> - partition key</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <code>RANGE</code> - sort key</p>\\n                  </li>\\n               </ul>\\n            </li>\\n         </ul>\\n         <note>\\n            <p>The partition key of an item is also known as its <i>hash\\n                    attribute</i>. The term \\\"hash attribute\\\" derives from the DynamoDB usage\\n                of an internal hash function to evenly distribute data items across partitions,\\n                based on their partition key values.</p>\\n            <p>The sort key of an item is also known as its <i>range attribute</i>.\\n                The term \\\"range attribute\\\" derives from the way DynamoDB stores items with the same\\n                partition key physically close together, in sorted order by the sort key\\n                value.</p>\\n         </note>\\n         <p>For a simple primary key (partition key), you must provide exactly one element with a\\n                <code>KeyType</code> of <code>HASH</code>.</p>\\n         <p>For a composite primary key (partition key and sort key), you must provide exactly two\\n            elements, in this order: The first element must have a <code>KeyType</code> of\\n                <code>HASH</code>, and the second element must have a <code>KeyType</code> of\\n                <code>RANGE</code>.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/WorkingWithTables.html#WorkingWithTables.primary.key\\\">Working with Tables</a> in the <i>Amazon DynamoDB Developer\\n                Guide</i>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"LocalSecondaryIndexes\": {\n                    \"target\": \"com.amazonaws.dynamodb#LocalSecondaryIndexList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more local secondary indexes (the maximum is 5) to be created on the table.\\n            Each index is scoped to a given partition key value. There is a 10 GB size limit per\\n            partition key value; otherwise, the size of a local secondary index is\\n            unconstrained.</p>\\n         <p>Each local secondary index in the array includes the following:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>IndexName</code> - The name of the local secondary index. Must be unique\\n                    only for this table.</p>\\n               <p></p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>KeySchema</code> - Specifies the key schema for the local secondary index.\\n                    The key schema must begin with the same partition key as the table.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>Projection</code> - Specifies attributes that are copied (projected) from\\n                    the table into the index. These are in addition to the primary key attributes\\n                    and index key attributes, which are automatically projected. Each attribute\\n                    specification is composed of:</p>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <code>ProjectionType</code> - One of the following:</p>\\n                     <ul>\\n                        <li>\\n                           <p>\\n                              <code>KEYS_ONLY</code> - Only the index and primary keys are\\n                                    projected into the index.</p>\\n                        </li>\\n                        <li>\\n                           <p>\\n                              <code>INCLUDE</code> - Only the specified table attributes are\\n                                    projected into the index. The list of projected attributes is in\\n                                        <code>NonKeyAttributes</code>.</p>\\n                        </li>\\n                        <li>\\n                           <p>\\n                              <code>ALL</code> - All of the table attributes are projected\\n                                    into the index.</p>\\n                        </li>\\n                     </ul>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <code>NonKeyAttributes</code> - A list of one or more non-key attribute\\n                            names that are projected into the secondary index. The total count of\\n                            attributes provided in <code>NonKeyAttributes</code>, summed across all\\n                            of the secondary indexes, must not exceed 100. If you project the same\\n                            attribute into two different indexes, this counts as two distinct\\n                            attributes when determining the total. This limit only applies when you\\n                            specify the ProjectionType of <code>INCLUDE</code>. You still can\\n                            specify the ProjectionType of <code>ALL</code> to project all attributes\\n                            from the source table, even if the table has more than 100\\n                            attributes.</p>\\n                  </li>\\n               </ul>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"GlobalSecondaryIndexes\": {\n                    \"target\": \"com.amazonaws.dynamodb#GlobalSecondaryIndexList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more global secondary indexes (the maximum is 20) to be created on the table.\\n            Each global secondary index in the array includes the following:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>IndexName</code> - The name of the global secondary index. Must be unique\\n                    only for this table.</p>\\n               <p></p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>KeySchema</code> - Specifies the key schema for the global secondary\\n                    index.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>Projection</code> - Specifies attributes that are copied (projected) from\\n                    the table into the index. These are in addition to the primary key attributes\\n                    and index key attributes, which are automatically projected. Each attribute\\n                    specification is composed of:</p>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <code>ProjectionType</code> - One of the following:</p>\\n                     <ul>\\n                        <li>\\n                           <p>\\n                              <code>KEYS_ONLY</code> - Only the index and primary keys are\\n                                    projected into the index.</p>\\n                        </li>\\n                        <li>\\n                           <p>\\n                              <code>INCLUDE</code> - Only the specified table attributes are\\n                                    projected into the index. The list of projected attributes is in\\n                                        <code>NonKeyAttributes</code>.</p>\\n                        </li>\\n                        <li>\\n                           <p>\\n                              <code>ALL</code> - All of the table attributes are projected\\n                                    into the index.</p>\\n                        </li>\\n                     </ul>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <code>NonKeyAttributes</code> - A list of one or more non-key attribute\\n                            names that are projected into the secondary index. The total count of\\n                            attributes provided in <code>NonKeyAttributes</code>, summed across all\\n                            of the secondary indexes, must not exceed 100. If you project the same\\n                            attribute into two different indexes, this counts as two distinct\\n                            attributes when determining the total. This limit only applies when you\\n                            specify the ProjectionType of <code>INCLUDE</code>. You still can\\n                            specify the ProjectionType of <code>ALL</code> to project all attributes\\n                            from the source table, even if the table has more than 100\\n                            attributes.</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ProvisionedThroughput</code> - The provisioned throughput settings for the\\n                    global secondary index, consisting of read and write capacity units.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"BillingMode\": {\n                    \"target\": \"com.amazonaws.dynamodb#BillingMode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Controls how you are charged for read and write throughput and how you manage\\n            capacity. This setting can be changed later.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>PAY_PER_REQUEST</code> - We recommend using <code>PAY_PER_REQUEST</code>\\n                    for most DynamoDB workloads. <code>PAY_PER_REQUEST</code> sets the billing mode\\n                    to <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/on-demand-capacity-mode.html\\\">On-demand capacity mode</a>. </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>PROVISIONED</code> - We recommend using <code>PROVISIONED</code> for\\n                    steady workloads with predictable growth where capacity requirements can be\\n                    reliably forecasted. <code>PROVISIONED</code> sets the billing mode to <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/provisioned-capacity-mode.html\\\">Provisioned capacity mode</a>.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"ProvisionedThroughput\": {\n                    \"target\": \"com.amazonaws.dynamodb#ProvisionedThroughput\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Represents the provisioned throughput settings for a specified table or index. The\\n            settings can be modified using the <code>UpdateTable</code> operation.</p>\\n         <p> If you set BillingMode as <code>PROVISIONED</code>, you must specify this property.\\n            If you set BillingMode as <code>PAY_PER_REQUEST</code>, you cannot specify this\\n            property.</p>\\n         <p>For current minimum and maximum provisioned throughput values, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Limits.html\\\">Service,\\n                Account, and Table Quotas</a> in the <i>Amazon DynamoDB Developer\\n                Guide</i>.</p>\"\n                    }\n                },\n                \"StreamSpecification\": {\n                    \"target\": \"com.amazonaws.dynamodb#StreamSpecification\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The settings for DynamoDB Streams on the table. These settings consist of:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>StreamEnabled</code> - Indicates whether DynamoDB Streams is to be enabled\\n                    (true) or disabled (false).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>StreamViewType</code> - When an item in the table is modified,\\n                        <code>StreamViewType</code> determines what information is written to the\\n                    table's stream. Valid values for <code>StreamViewType</code> are:</p>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <code>KEYS_ONLY</code> - Only the key attributes of the modified item\\n                            are written to the stream.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <code>NEW_IMAGE</code> - The entire item, as it appears after it was\\n                            modified, is written to the stream.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <code>OLD_IMAGE</code> - The entire item, as it appeared before it was\\n                            modified, is written to the stream.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <code>NEW_AND_OLD_IMAGES</code> - Both the new and the old item images\\n                            of the item are written to the stream.</p>\\n                  </li>\\n               </ul>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"SSESpecification\": {\n                    \"target\": \"com.amazonaws.dynamodb#SSESpecification\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Represents the settings used to enable server-side encryption.</p>\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.dynamodb#TagList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of key-value pairs to label the table. For more information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Tagging.html\\\">Tagging\\n                for DynamoDB</a>.</p>\"\n                    }\n                },\n                \"TableClass\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableClass\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The table class of the new table. Valid values are <code>STANDARD</code> and\\n                <code>STANDARD_INFREQUENT_ACCESS</code>.</p>\"\n                    }\n                },\n                \"DeletionProtectionEnabled\": {\n                    \"target\": \"com.amazonaws.dynamodb#DeletionProtectionEnabled\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether deletion protection is to be enabled (true) or disabled (false) on\\n            the table.</p>\"\n                    }\n                },\n                \"WarmThroughput\": {\n                    \"target\": \"com.amazonaws.dynamodb#WarmThroughput\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Represents the warm throughput (in read units per second and write units per second)\\n            for creating a table.</p>\"\n                    }\n                },\n                \"ResourcePolicy\": {\n                    \"target\": \"com.amazonaws.dynamodb#ResourcePolicy\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An Amazon Web Services resource-based policy document in JSON format that will be\\n            attached to the table.</p>\\n         <p>When you attach a resource-based policy while creating a table, the policy application\\n            is <i>strongly consistent</i>.</p>\\n         <p>The maximum size supported for a resource-based policy document is 20 KB. DynamoDB counts whitespaces when calculating the size of a policy against this\\n            limit. For a full list of all considerations that apply for resource-based policies, see\\n                <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/rbac-considerations.html\\\">Resource-based\\n                policy considerations</a>.</p>\\n         <note>\\n            <p>You need to specify the <code>CreateTable</code> and\\n                    <code>PutResourcePolicy</code>\\n                IAM actions for authorizing a user to create a table with a\\n                resource-based policy.</p>\\n         </note>\"\n                    }\n                },\n                \"OnDemandThroughput\": {\n                    \"target\": \"com.amazonaws.dynamodb#OnDemandThroughput\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Sets the maximum number of read and write units for the specified table in on-demand\\n            capacity mode. If you use this parameter, you must specify\\n                <code>MaxReadRequestUnits</code>, <code>MaxWriteRequestUnits</code>, or both.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents the input of a <code>CreateTable</code> operation.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#CreateTableOutput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TableDescription\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableDescription\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Represents the properties of the table.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents the output of a <code>CreateTable</code> operation.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#CsvDelimiter\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 1\n                },\n                \"smithy.api#pattern\": \"^[,;:|\\\\t ]$\"\n            }\n        },\n        \"com.amazonaws.dynamodb#CsvHeader\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 65536\n                },\n                \"smithy.api#pattern\": \"^[\\\\x20-\\\\x21\\\\x23-\\\\x2B\\\\x2D-\\\\x7E]*$\"\n            }\n        },\n        \"com.amazonaws.dynamodb#CsvHeaderList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.dynamodb#CsvHeader\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 255\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#CsvOptions\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Delimiter\": {\n                    \"target\": \"com.amazonaws.dynamodb#CsvDelimiter\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The delimiter used for separating items in the CSV file being imported. </p>\"\n                    }\n                },\n                \"HeaderList\": {\n                    \"target\": \"com.amazonaws.dynamodb#CsvHeaderList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> List of the headers used to specify a common header for all source CSV files being\\n            imported. If this field is specified then the first line of each CSV file is treated as\\n            data instead of the header. If this field is not specified the the first line of each\\n            CSV file is treated as the header. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p> Processing options for the CSV file being imported. </p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#Date\": {\n            \"type\": \"timestamp\"\n        },\n        \"com.amazonaws.dynamodb#Delete\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Key\": {\n                    \"target\": \"com.amazonaws.dynamodb#Key\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The primary key of the item to be deleted. Each element consists of an attribute name\\n            and a value for that attribute.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TableName\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Name of the table in which the item to be deleted resides. You can also provide the\\n            Amazon Resource Name (ARN) of the table in this parameter.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ConditionExpression\": {\n                    \"target\": \"com.amazonaws.dynamodb#ConditionExpression\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A condition that must be satisfied in order for a conditional delete to\\n            succeed.</p>\"\n                    }\n                },\n                \"ExpressionAttributeNames\": {\n                    \"target\": \"com.amazonaws.dynamodb#ExpressionAttributeNameMap\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more substitution tokens for attribute names in an expression.</p>\"\n                    }\n                },\n                \"ExpressionAttributeValues\": {\n                    \"target\": \"com.amazonaws.dynamodb#ExpressionAttributeValueMap\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more values that can be substituted in an expression.</p>\"\n                    }\n                },\n                \"ReturnValuesOnConditionCheckFailure\": {\n                    \"target\": \"com.amazonaws.dynamodb#ReturnValuesOnConditionCheckFailure\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use <code>ReturnValuesOnConditionCheckFailure</code> to get the item attributes if the\\n                <code>Delete</code> condition fails. For\\n                <code>ReturnValuesOnConditionCheckFailure</code>, the valid values are: NONE and\\n            ALL_OLD.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents a request to perform a <code>DeleteItem</code> operation.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#DeleteBackup\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.dynamodb#DeleteBackupInput\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.dynamodb#DeleteBackupOutput\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.dynamodb#BackupInUseException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#BackupNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InvalidEndpointException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#LimitExceededException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#clientDiscoveredEndpoint\": {\n                    \"required\": false\n                },\n                \"smithy.api#documentation\": \"<p>Deletes an existing backup of a table.</p>\\n         <p>You can call <code>DeleteBackup</code> at a maximum rate of 10 times per\\n            second.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#DeleteBackupInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"BackupArn\": {\n                    \"target\": \"com.amazonaws.dynamodb#BackupArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN associated with the backup.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"ResourceArn\"\n                        }\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#DeleteBackupOutput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"BackupDescription\": {\n                    \"target\": \"com.amazonaws.dynamodb#BackupDescription\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Contains the description of the backup created for the table.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#DeleteGlobalSecondaryIndexAction\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"IndexName\": {\n                    \"target\": \"com.amazonaws.dynamodb#IndexName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the global secondary index to be deleted.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents a global secondary index to be deleted from an existing table.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#DeleteGlobalTableWitnessGroupMemberAction\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RegionName\": {\n                    \"target\": \"com.amazonaws.dynamodb#RegionName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The witness Region name to be removed from the MRSC global table.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Specifies the action to remove a witness Region from a MRSC global table. You cannot\\n            delete a single witness from a MRSC global table - you must delete both a replica and\\n            the witness together. The deletion of both a witness and replica converts the remaining\\n            replica to a single-Region DynamoDB table. </p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#DeleteItem\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.dynamodb#DeleteItemInput\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.dynamodb#DeleteItemOutput\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ConditionalCheckFailedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InvalidEndpointException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ItemCollectionSizeLimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ProvisionedThroughputExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ReplicatedWriteConflictException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#RequestLimitExceeded\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ThrottlingException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#TransactionConflictException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#clientDiscoveredEndpoint\": {\n                    \"required\": false\n                },\n                \"smithy.api#documentation\": \"<p>Deletes a single item in a table by primary key. You can perform a conditional delete\\n            operation that deletes the item if it exists, or if it has an expected attribute\\n            value.</p>\\n         <p>In addition to deleting an item, you can also return the item's attribute values in\\n            the same operation, using the <code>ReturnValues</code> parameter.</p>\\n         <p>Unless you specify conditions, the <code>DeleteItem</code> is an idempotent operation;\\n            running it multiple times on the same item or attribute does <i>not</i>\\n            result in an error response.</p>\\n         <p>Conditional deletes are useful for deleting items only if specific conditions are met.\\n            If those conditions are met, DynamoDB performs the delete. Otherwise, the item is not\\n            deleted.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To delete an item\",\n                        \"documentation\": \"This example deletes an item from the Music table.\",\n                        \"input\": {\n                            \"TableName\": \"Music\",\n                            \"Key\": {\n                                \"Artist\": {\n                                    \"S\": \"No One You Know\"\n                                },\n                                \"SongTitle\": {\n                                    \"S\": \"Scared of My Shadow\"\n                                }\n                            }\n                        },\n                        \"output\": {\n                            \"ConsumedCapacity\": {\n                                \"CapacityUnits\": 1,\n                                \"TableName\": \"Music\"\n                            }\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.dynamodb#DeleteItemInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TableName\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the table from which to delete the item. You can also provide the\\n            Amazon Resource Name (ARN) of the table in this parameter.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"ResourceArn\"\n                        }\n                    }\n                },\n                \"Key\": {\n                    \"target\": \"com.amazonaws.dynamodb#Key\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A map of attribute names to <code>AttributeValue</code> objects, representing the\\n            primary key of the item to delete.</p>\\n         <p>For the primary key, you must provide all of the key attributes. For example, with a\\n            simple primary key, you only need to provide a value for the partition key. For a\\n            composite primary key, you must provide values for both the partition key and the sort\\n            key.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Expected\": {\n                    \"target\": \"com.amazonaws.dynamodb#ExpectedAttributeMap\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>This is a legacy parameter. Use <code>ConditionExpression</code> instead. For more\\n            information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/LegacyConditionalParameters.Expected.html\\\">Expected</a> in the <i>Amazon DynamoDB Developer\\n            Guide</i>.</p>\"\n                    }\n                },\n                \"ConditionalOperator\": {\n                    \"target\": \"com.amazonaws.dynamodb#ConditionalOperator\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>This is a legacy parameter. Use <code>ConditionExpression</code> instead. For more\\n            information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/LegacyConditionalParameters.ConditionalOperator.html\\\">ConditionalOperator</a> in the <i>Amazon DynamoDB Developer\\n                Guide</i>.</p>\"\n                    }\n                },\n                \"ReturnValues\": {\n                    \"target\": \"com.amazonaws.dynamodb#ReturnValue\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use <code>ReturnValues</code> if you want to get the item attributes as they appeared\\n            before they were deleted. For <code>DeleteItem</code>, the valid values are:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>NONE</code> - If <code>ReturnValues</code> is not specified, or if its\\n                    value is <code>NONE</code>, then nothing is returned. (This setting is the\\n                    default for <code>ReturnValues</code>.)</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ALL_OLD</code> - The content of the old item is returned.</p>\\n            </li>\\n         </ul>\\n         <p>There is no additional cost associated with requesting a return value aside from the\\n            small network and processing overhead of receiving a larger response. No read capacity\\n            units are consumed.</p>\\n         <note>\\n            <p>The <code>ReturnValues</code> parameter is used by several DynamoDB operations;\\n                however, <code>DeleteItem</code> does not recognize any values other than\\n                    <code>NONE</code> or <code>ALL_OLD</code>.</p>\\n         </note>\"\n                    }\n                },\n                \"ReturnConsumedCapacity\": {\n                    \"target\": \"com.amazonaws.dynamodb#ReturnConsumedCapacity\"\n                },\n                \"ReturnItemCollectionMetrics\": {\n                    \"target\": \"com.amazonaws.dynamodb#ReturnItemCollectionMetrics\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Determines whether item collection metrics are returned. If set to <code>SIZE</code>,\\n            the response includes statistics about item collections, if any, that were modified\\n            during the operation are returned in the response. If set to <code>NONE</code> (the\\n            default), no statistics are returned.</p>\"\n                    }\n                },\n                \"ConditionExpression\": {\n                    \"target\": \"com.amazonaws.dynamodb#ConditionExpression\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A condition that must be satisfied in order for a conditional <code>DeleteItem</code>\\n            to succeed.</p>\\n         <p>An expression can contain any of the following:</p>\\n         <ul>\\n            <li>\\n               <p>Functions: <code>attribute_exists | attribute_not_exists | attribute_type |\\n                        contains | begins_with | size</code>\\n               </p>\\n               <p>These function names are case-sensitive.</p>\\n            </li>\\n            <li>\\n               <p>Comparison operators: <code>= | <> |\\n            < | > | <= | >= |\\n            BETWEEN | IN </code>\\n               </p>\\n            </li>\\n            <li>\\n               <p> Logical operators: <code>AND | OR | NOT</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>For more information about condition expressions, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.SpecifyingConditions.html\\\">Condition Expressions</a> in the <i>Amazon DynamoDB Developer\\n                Guide</i>.</p>\"\n                    }\n                },\n                \"ExpressionAttributeNames\": {\n                    \"target\": \"com.amazonaws.dynamodb#ExpressionAttributeNameMap\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more substitution tokens for attribute names in an expression. The following\\n            are some use cases for using <code>ExpressionAttributeNames</code>:</p>\\n         <ul>\\n            <li>\\n               <p>To access an attribute whose name conflicts with a DynamoDB reserved\\n                    word.</p>\\n            </li>\\n            <li>\\n               <p>To create a placeholder for repeating occurrences of an attribute name in an\\n                    expression.</p>\\n            </li>\\n            <li>\\n               <p>To prevent special characters in an attribute name from being misinterpreted\\n                    in an expression.</p>\\n            </li>\\n         </ul>\\n         <p>Use the <b>#</b> character in an expression to dereference\\n            an attribute name. For example, consider the following attribute name:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>Percentile</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>The name of this attribute conflicts with a reserved word, so it cannot be used\\n            directly in an expression. (For the complete list of reserved words, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ReservedWords.html\\\">Reserved Words</a> in the <i>Amazon DynamoDB Developer\\n            Guide</i>). To work around this, you could specify the following for\\n                <code>ExpressionAttributeNames</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>{\\\"#P\\\":\\\"Percentile\\\"}</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>You could then use this substitution in an expression, as in this example:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>#P = :val</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <note>\\n            <p>Tokens that begin with the <b>:</b> character are\\n                    <i>expression attribute values</i>, which are placeholders for the\\n                actual value at runtime.</p>\\n         </note>\\n         <p>For more information on expression attribute names, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.AccessingItemAttributes.html\\\">Specifying Item Attributes</a> in the <i>Amazon DynamoDB Developer\\n                Guide</i>.</p>\"\n                    }\n                },\n                \"ExpressionAttributeValues\": {\n                    \"target\": \"com.amazonaws.dynamodb#ExpressionAttributeValueMap\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more values that can be substituted in an expression.</p>\\n         <p>Use the <b>:</b> (colon) character in an expression to\\n            dereference an attribute value. For example, suppose that you wanted to check whether\\n            the value of the <i>ProductStatus</i> attribute was one of the following: </p>\\n         <p>\\n            <code>Available | Backordered | Discontinued</code>\\n         </p>\\n         <p>You would first need to specify <code>ExpressionAttributeValues</code> as\\n            follows:</p>\\n         <p>\\n            <code>{ \\\":avail\\\":{\\\"S\\\":\\\"Available\\\"}, \\\":back\\\":{\\\"S\\\":\\\"Backordered\\\"},\\n                \\\":disc\\\":{\\\"S\\\":\\\"Discontinued\\\"} }</code>\\n         </p>\\n         <p>You could then use these values in an expression, such as this:</p>\\n         <p>\\n            <code>ProductStatus IN (:avail, :back, :disc)</code>\\n         </p>\\n         <p>For more information on expression attribute values, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.SpecifyingConditions.html\\\">Condition Expressions</a> in the <i>Amazon DynamoDB Developer\\n                Guide</i>.</p>\"\n                    }\n                },\n                \"ReturnValuesOnConditionCheckFailure\": {\n                    \"target\": \"com.amazonaws.dynamodb#ReturnValuesOnConditionCheckFailure\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An optional parameter that returns the item attributes for a <code>DeleteItem</code>\\n            operation that failed a condition check.</p>\\n         <p>There is no additional cost associated with requesting a return value aside from the\\n            small network and processing overhead of receiving a larger response. No read capacity\\n            units are consumed.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents the input of a <code>DeleteItem</code> operation.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#DeleteItemOutput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Attributes\": {\n                    \"target\": \"com.amazonaws.dynamodb#AttributeMap\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A map of attribute names to <code>AttributeValue</code> objects, representing the item\\n            as it appeared before the <code>DeleteItem</code> operation. This map appears in the\\n            response only if <code>ReturnValues</code> was specified as <code>ALL_OLD</code> in the\\n            request.</p>\"\n                    }\n                },\n                \"ConsumedCapacity\": {\n                    \"target\": \"com.amazonaws.dynamodb#ConsumedCapacity\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The capacity units consumed by the <code>DeleteItem</code> operation. The data\\n            returned includes the total provisioned throughput consumed, along with statistics for\\n            the table and any indexes involved in the operation. <code>ConsumedCapacity</code> is\\n            only returned if the <code>ReturnConsumedCapacity</code> parameter was specified. For\\n            more information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/provisioned-capacity-mode.html\\\">Provisioned capacity mode</a> in the <i>Amazon DynamoDB Developer\\n                Guide</i>.</p>\"\n                    }\n                },\n                \"ItemCollectionMetrics\": {\n                    \"target\": \"com.amazonaws.dynamodb#ItemCollectionMetrics\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Information about item collections, if any, that were affected by the\\n                <code>DeleteItem</code> operation. <code>ItemCollectionMetrics</code> is only\\n            returned if the <code>ReturnItemCollectionMetrics</code> parameter was specified. If the\\n            table does not have any local secondary indexes, this information is not returned in the\\n            response.</p>\\n         <p>Each <code>ItemCollectionMetrics</code> element consists of:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>ItemCollectionKey</code> - The partition key value of the item collection.\\n                    This is the same as the partition key value of the item itself.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>SizeEstimateRangeGB</code> - An estimate of item collection size, in\\n                    gigabytes. This value is a two-element array containing a lower bound and an\\n                    upper bound for the estimate. The estimate includes the size of all the items in\\n                    the table, plus the size of all attributes projected into all of the local\\n                    secondary indexes on that table. Use this estimate to measure whether a local\\n                    secondary index is approaching its size limit.</p>\\n               <p>The estimate is subject to change over time; therefore, do not rely on the\\n                    precision or accuracy of the estimate.</p>\\n            </li>\\n         </ul>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents the output of a <code>DeleteItem</code> operation.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#DeleteReplicaAction\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RegionName\": {\n                    \"target\": \"com.amazonaws.dynamodb#RegionName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Region of the replica to be removed.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents a replica to be removed.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#DeleteReplicationGroupMemberAction\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RegionName\": {\n                    \"target\": \"com.amazonaws.dynamodb#RegionName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Region where the replica exists.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents a replica to be deleted.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#DeleteRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Key\": {\n                    \"target\": \"com.amazonaws.dynamodb#Key\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A map of attribute name to attribute values, representing the primary key of the item\\n            to delete. All of the table's primary key attributes must be specified, and their data\\n            types must match those of the table's key schema.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents a request to perform a <code>DeleteItem</code> operation on an item.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#DeleteResourcePolicy\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.dynamodb#DeleteResourcePolicyInput\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.dynamodb#DeleteResourcePolicyOutput\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InvalidEndpointException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#PolicyNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ResourceInUseException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ResourceNotFoundException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#clientDiscoveredEndpoint\": {\n                    \"required\": false\n                },\n                \"smithy.api#documentation\": \"<p>Deletes the resource-based policy attached to the resource, which can be a table or\\n            stream.</p>\\n         <p>\\n            <code>DeleteResourcePolicy</code> is an idempotent operation; running it multiple\\n            times on the same resource <i>doesn't</i> result in an error response,\\n            unless you specify an <code>ExpectedRevisionId</code>, which will then return a\\n                <code>PolicyNotFoundException</code>.</p>\\n         <important>\\n            <p>To make sure that you don't inadvertently lock yourself out of your own resources,\\n                the root principal in your Amazon Web Services account can perform\\n                    <code>DeleteResourcePolicy</code> requests, even if your resource-based policy\\n                explicitly denies the root principal's access. </p>\\n         </important>\\n         <note>\\n            <p>\\n               <code>DeleteResourcePolicy</code> is an asynchronous operation. If you issue a\\n                    <code>GetResourcePolicy</code> request immediately after running the\\n                    <code>DeleteResourcePolicy</code> request, DynamoDB might still return\\n                the deleted policy. This is because the policy for your resource might not have been\\n                deleted yet. Wait for a few seconds, and then try the <code>GetResourcePolicy</code>\\n                request again.</p>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#DeleteResourcePolicyInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ResourceArn\": {\n                    \"target\": \"com.amazonaws.dynamodb#ResourceArnString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the DynamoDB resource from which the policy will be\\n            removed. The resources you can specify include tables and streams. If you remove the\\n            policy of a table, it will also remove the permissions for the table's indexes defined\\n            in that policy document. This is because index permissions are defined in the table's\\n            policy.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"ResourceArn\"\n                        }\n                    }\n                },\n                \"ExpectedRevisionId\": {\n                    \"target\": \"com.amazonaws.dynamodb#PolicyRevisionId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A string value that you can use to conditionally delete your policy. When you provide\\n            an expected revision ID, if the revision ID of the existing policy on the resource\\n            doesn't match or if there's no policy attached to the resource, the request will fail\\n            and return a <code>PolicyNotFoundException</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#DeleteResourcePolicyOutput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RevisionId\": {\n                    \"target\": \"com.amazonaws.dynamodb#PolicyRevisionId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A unique string that represents the revision ID of the policy. If you're comparing revision IDs, make sure to always use string comparison logic.</p>\\n         <p>This value will be empty if you make a request against a resource without a\\n            policy.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#DeleteTable\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.dynamodb#DeleteTableInput\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.dynamodb#DeleteTableOutput\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InvalidEndpointException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ResourceInUseException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ResourceNotFoundException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#clientDiscoveredEndpoint\": {\n                    \"required\": false\n                },\n                \"smithy.api#documentation\": \"<p>The <code>DeleteTable</code> operation deletes a table and all of its items. After a\\n                <code>DeleteTable</code> request, the specified table is in the\\n                <code>DELETING</code> state until DynamoDB completes the deletion. If the table is\\n            in the <code>ACTIVE</code> state, you can delete it. If a table is in\\n                <code>CREATING</code> or <code>UPDATING</code> states, then DynamoDB returns a\\n                <code>ResourceInUseException</code>. If the specified table does not exist, DynamoDB\\n            returns a <code>ResourceNotFoundException</code>. If table is already in the\\n                <code>DELETING</code> state, no error is returned. </p>\\n         <note>\\n            <p>DynamoDB might continue to accept data read and write operations, such as\\n                    <code>GetItem</code> and <code>PutItem</code>, on a table in the\\n                    <code>DELETING</code> state until the table deletion is complete. For the full\\n                list of table states, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_TableDescription.html#DDB-Type-TableDescription-TableStatus\\\">TableStatus</a>.</p>\\n         </note>\\n         <p>When you delete a table, any indexes on that table are also deleted.</p>\\n         <p>If you have DynamoDB Streams enabled on the table, then the corresponding stream on\\n            that table goes into the <code>DISABLED</code> state, and the stream is automatically\\n            deleted after 24 hours.</p>\\n         <p>Use the <code>DescribeTable</code> action to check the status of the table. </p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To delete a table\",\n                        \"documentation\": \"This example deletes the Music table.\",\n                        \"input\": {\n                            \"TableName\": \"Music\"\n                        },\n                        \"output\": {\n                            \"TableDescription\": {\n                                \"TableStatus\": \"DELETING\",\n                                \"TableSizeBytes\": 0,\n                                \"ItemCount\": 0,\n                                \"TableName\": \"Music\",\n                                \"ProvisionedThroughput\": {\n                                    \"NumberOfDecreasesToday\": 1,\n                                    \"WriteCapacityUnits\": 5,\n                                    \"ReadCapacityUnits\": 5\n                                }\n                            }\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.dynamodb#DeleteTableInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TableName\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the table to delete. You can also provide the Amazon Resource Name (ARN) of the table in\\n            this parameter.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"ResourceArn\"\n                        }\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents the input of a <code>DeleteTable</code> operation.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#DeleteTableOutput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TableDescription\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableDescription\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Represents the properties of a table.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents the output of a <code>DeleteTable</code> operation.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#DeletionProtectionEnabled\": {\n            \"type\": \"boolean\"\n        },\n        \"com.amazonaws.dynamodb#DescribeBackup\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.dynamodb#DescribeBackupInput\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.dynamodb#DescribeBackupOutput\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.dynamodb#BackupNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InvalidEndpointException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#clientDiscoveredEndpoint\": {\n                    \"required\": false\n                },\n                \"smithy.api#documentation\": \"<p>Describes an existing backup of a table.</p>\\n         <p>You can call <code>DescribeBackup</code> at a maximum rate of 10 times per\\n            second.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#DescribeBackupInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"BackupArn\": {\n                    \"target\": \"com.amazonaws.dynamodb#BackupArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) associated with the backup.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"ResourceArn\"\n                        }\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#DescribeBackupOutput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"BackupDescription\": {\n                    \"target\": \"com.amazonaws.dynamodb#BackupDescription\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Contains the description of the backup created for the table.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#DescribeContinuousBackups\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.dynamodb#DescribeContinuousBackupsInput\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.dynamodb#DescribeContinuousBackupsOutput\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InvalidEndpointException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#TableNotFoundException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#clientDiscoveredEndpoint\": {\n                    \"required\": false\n                },\n                \"smithy.api#documentation\": \"<p>Checks the status of continuous backups and point in time recovery on the specified\\n            table. Continuous backups are <code>ENABLED</code> on all tables at table creation. If\\n            point in time recovery is enabled, <code>PointInTimeRecoveryStatus</code> will be set to\\n            ENABLED.</p>\\n         <p> After continuous backups and point in time recovery are enabled, you can restore to\\n            any point in time within <code>EarliestRestorableDateTime</code> and\\n                <code>LatestRestorableDateTime</code>. </p>\\n         <p>\\n            <code>LatestRestorableDateTime</code> is typically 5 minutes before the current time.\\n            You can restore your table to any point in time in the last 35 days. You can set the\\n            recovery period to any value between 1 and 35 days. </p>\\n         <p>You can call <code>DescribeContinuousBackups</code> at a maximum rate of 10 times per\\n            second.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#DescribeContinuousBackupsInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TableName\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Name of the table for which the customer wants to check the continuous backups and\\n            point in time recovery settings.</p>\\n         <p>You can also provide the Amazon Resource Name (ARN) of the table in this parameter.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"ResourceArn\"\n                        }\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#DescribeContinuousBackupsOutput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ContinuousBackupsDescription\": {\n                    \"target\": \"com.amazonaws.dynamodb#ContinuousBackupsDescription\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Represents the continuous backups and point in time recovery settings on the\\n            table.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#DescribeContributorInsights\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.dynamodb#DescribeContributorInsightsInput\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.dynamodb#DescribeContributorInsightsOutput\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ResourceNotFoundException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns information about contributor insights for a given table or global secondary\\n            index.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#DescribeContributorInsightsInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TableName\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the table to describe. You can also provide the Amazon Resource Name (ARN) of the table in\\n            this parameter.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"ResourceArn\"\n                        }\n                    }\n                },\n                \"IndexName\": {\n                    \"target\": \"com.amazonaws.dynamodb#IndexName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the global secondary index to describe, if applicable.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#DescribeContributorInsightsOutput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TableName\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the table being described.</p>\"\n                    }\n                },\n                \"IndexName\": {\n                    \"target\": \"com.amazonaws.dynamodb#IndexName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the global secondary index being described.</p>\"\n                    }\n                },\n                \"ContributorInsightsRuleList\": {\n                    \"target\": \"com.amazonaws.dynamodb#ContributorInsightsRuleList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>List of names of the associated contributor insights rules.</p>\"\n                    }\n                },\n                \"ContributorInsightsStatus\": {\n                    \"target\": \"com.amazonaws.dynamodb#ContributorInsightsStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Current status of contributor insights.</p>\"\n                    }\n                },\n                \"LastUpdateDateTime\": {\n                    \"target\": \"com.amazonaws.dynamodb#LastUpdateDateTime\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Timestamp of the last time the status was changed.</p>\"\n                    }\n                },\n                \"FailureException\": {\n                    \"target\": \"com.amazonaws.dynamodb#FailureException\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Returns information about the last failure that was encountered.</p>\\n         <p>The most common exceptions for a FAILED status are:</p>\\n         <ul>\\n            <li>\\n               <p>LimitExceededException - Per-account Amazon CloudWatch Contributor Insights\\n                    rule limit reached. Please disable Contributor Insights for other tables/indexes\\n                    OR disable Contributor Insights rules before retrying.</p>\\n            </li>\\n            <li>\\n               <p>AccessDeniedException - Amazon CloudWatch Contributor Insights rules cannot be\\n                    modified due to insufficient permissions.</p>\\n            </li>\\n            <li>\\n               <p>AccessDeniedException - Failed to create service-linked role for Contributor\\n                    Insights due to insufficient permissions.</p>\\n            </li>\\n            <li>\\n               <p>InternalServerError - Failed to create Amazon CloudWatch Contributor Insights\\n                    rules. Please retry request.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"ContributorInsightsMode\": {\n                    \"target\": \"com.amazonaws.dynamodb#ContributorInsightsMode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The mode of CloudWatch Contributor Insights for DynamoDB that determines\\n            which events are emitted. Can be set to track all access and throttled events or throttled\\n            events only.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#DescribeEndpoints\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.dynamodb#DescribeEndpointsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.dynamodb#DescribeEndpointsResponse\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns the regional endpoint information. For more information on policy permissions,\\n            please see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/inter-network-traffic-privacy.html#inter-network-traffic-DescribeEndpoints\\\">Internetwork traffic privacy</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#DescribeEndpointsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {},\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#DescribeEndpointsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Endpoints\": {\n                    \"target\": \"com.amazonaws.dynamodb#Endpoints\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>List of endpoints.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#DescribeExport\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.dynamodb#DescribeExportInput\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.dynamodb#DescribeExportOutput\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ExportNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#LimitExceededException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes an existing table export.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#DescribeExportInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ExportArn\": {\n                    \"target\": \"com.amazonaws.dynamodb#ExportArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) associated with the export.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"ResourceArn\"\n                        }\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#DescribeExportOutput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ExportDescription\": {\n                    \"target\": \"com.amazonaws.dynamodb#ExportDescription\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Represents the properties of the export.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#DescribeGlobalTable\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.dynamodb#DescribeGlobalTableInput\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.dynamodb#DescribeGlobalTableOutput\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.dynamodb#GlobalTableNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InvalidEndpointException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#clientDiscoveredEndpoint\": {\n                    \"required\": false\n                },\n                \"smithy.api#documentation\": \"<p>Returns information about the specified global table.</p>\\n         <important>\\n            <p>This documentation is for version 2017.11.29 (Legacy) of global tables, which should be avoided for new global tables. Customers should use <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GlobalTables.html\\\">Global Tables version 2019.11.21 (Current)</a> when possible, because it provides greater flexibility, higher efficiency, and consumes less write capacity than 2017.11.29 (Legacy).</p>\\n            <p>To determine which version you're using, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/globaltables.DetermineVersion.html\\\">Determining the global table version you are using</a>. To update existing global tables from version 2017.11.29 (Legacy) to version 2019.11.21 (Current), see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/V2globaltables_upgrade.html\\\">Upgrading global tables</a>.</p>\\n         </important>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#DescribeGlobalTableInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"GlobalTableName\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the global table.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"ResourceArn\"\n                        }\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#DescribeGlobalTableOutput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"GlobalTableDescription\": {\n                    \"target\": \"com.amazonaws.dynamodb#GlobalTableDescription\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Contains the details of the global table.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#DescribeGlobalTableSettings\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.dynamodb#DescribeGlobalTableSettingsInput\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.dynamodb#DescribeGlobalTableSettingsOutput\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.dynamodb#GlobalTableNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InvalidEndpointException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#clientDiscoveredEndpoint\": {\n                    \"required\": false\n                },\n                \"smithy.api#documentation\": \"<p>Describes Region-specific settings for a global table.</p>\\n         <important>\\n            <p>This documentation is for version 2017.11.29 (Legacy) of global tables, which should be avoided for new global tables. Customers should use <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GlobalTables.html\\\">Global Tables version 2019.11.21 (Current)</a> when possible, because it provides greater flexibility, higher efficiency, and consumes less write capacity than 2017.11.29 (Legacy).</p>\\n            <p>To determine which version you're using, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/globaltables.DetermineVersion.html\\\">Determining the global table version you are using</a>. To update existing global tables from version 2017.11.29 (Legacy) to version 2019.11.21 (Current), see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/V2globaltables_upgrade.html\\\">Upgrading global tables</a>.</p>\\n         </important>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#DescribeGlobalTableSettingsInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"GlobalTableName\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the global table to describe.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"ResourceArn\"\n                        }\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#DescribeGlobalTableSettingsOutput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"GlobalTableName\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the global table.</p>\"\n                    }\n                },\n                \"ReplicaSettings\": {\n                    \"target\": \"com.amazonaws.dynamodb#ReplicaSettingsDescriptionList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Region-specific settings for the global table.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#DescribeImport\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.dynamodb#DescribeImportInput\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.dynamodb#DescribeImportOutput\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ImportNotFoundException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p> Represents the properties of the import. </p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#DescribeImportInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ImportArn\": {\n                    \"target\": \"com.amazonaws.dynamodb#ImportArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The Amazon Resource Name (ARN) associated with the table you're importing to. </p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"ResourceArn\"\n                        }\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#DescribeImportOutput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ImportTableDescription\": {\n                    \"target\": \"com.amazonaws.dynamodb#ImportTableDescription\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> Represents the properties of the table created for the import, and parameters of the\\n            import. The import parameters include import status, how many items were processed, and\\n            how many errors were encountered. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#DescribeKinesisStreamingDestination\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.dynamodb#DescribeKinesisStreamingDestinationInput\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.dynamodb#DescribeKinesisStreamingDestinationOutput\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InvalidEndpointException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ResourceNotFoundException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#clientDiscoveredEndpoint\": {\n                    \"required\": false\n                },\n                \"smithy.api#documentation\": \"<p>Returns information about the status of Kinesis streaming.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#DescribeKinesisStreamingDestinationInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TableName\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the table being described. You can also provide the Amazon Resource Name (ARN) of the table\\n            in this parameter.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"ResourceArn\"\n                        }\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#DescribeKinesisStreamingDestinationOutput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TableName\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the table being described.</p>\"\n                    }\n                },\n                \"KinesisDataStreamDestinations\": {\n                    \"target\": \"com.amazonaws.dynamodb#KinesisDataStreamDestinations\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The list of replica structures for the table being described.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#DescribeLimits\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.dynamodb#DescribeLimitsInput\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.dynamodb#DescribeLimitsOutput\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InvalidEndpointException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#clientDiscoveredEndpoint\": {\n                    \"required\": false\n                },\n                \"smithy.api#documentation\": \"<p>Returns the current provisioned-capacity quotas for your Amazon Web Services account in\\n            a Region, both for the Region as a whole and for any one DynamoDB table that you create\\n            there.</p>\\n         <p>When you establish an Amazon Web Services account, the account has initial quotas on\\n            the maximum read capacity units and write capacity units that you can provision across\\n            all of your DynamoDB tables in a given Region. Also, there are per-table\\n            quotas that apply when you create a table there. For more information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Limits.html\\\">Service,\\n                Account, and Table Quotas</a> page in the <i>Amazon DynamoDB\\n                Developer Guide</i>.</p>\\n         <p>Although you can increase these quotas by filing a case at <a href=\\\"https://console.aws.amazon.com/support/home#/\\\">Amazon Web Services Support Center</a>, obtaining the\\n            increase is not instantaneous. The <code>DescribeLimits</code> action lets you write\\n            code to compare the capacity you are currently using to those quotas imposed by your\\n            account so that you have enough time to apply for an increase before you hit a\\n            quota.</p>\\n         <p>For example, you could use one of the Amazon Web Services SDKs to do the\\n            following:</p>\\n         <ol>\\n            <li>\\n               <p>Call <code>DescribeLimits</code> for a particular Region to obtain your\\n                    current account quotas on provisioned capacity there.</p>\\n            </li>\\n            <li>\\n               <p>Create a variable to hold the aggregate read capacity units provisioned for\\n                    all your tables in that Region, and one to hold the aggregate write capacity\\n                    units. Zero them both.</p>\\n            </li>\\n            <li>\\n               <p>Call <code>ListTables</code> to obtain a list of all your DynamoDB\\n                    tables.</p>\\n            </li>\\n            <li>\\n               <p>For each table name listed by <code>ListTables</code>, do the\\n                    following:</p>\\n               <ul>\\n                  <li>\\n                     <p>Call <code>DescribeTable</code> with the table name.</p>\\n                  </li>\\n                  <li>\\n                     <p>Use the data returned by <code>DescribeTable</code> to add the read\\n                            capacity units and write capacity units provisioned for the table itself\\n                            to your variables.</p>\\n                  </li>\\n                  <li>\\n                     <p>If the table has one or more global secondary indexes (GSIs), loop\\n                            over these GSIs and add their provisioned capacity values to your\\n                            variables as well.</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <p>Report the account quotas for that Region returned by\\n                        <code>DescribeLimits</code>, along with the total current provisioned\\n                    capacity levels you have calculated.</p>\\n            </li>\\n         </ol>\\n         <p>This will let you see whether you are getting close to your account-level\\n            quotas.</p>\\n         <p>The per-table quotas apply only when you are creating a new table. They restrict the\\n            sum of the provisioned capacity of the new table itself and all its global secondary\\n            indexes.</p>\\n         <p>For existing tables and their GSIs, DynamoDB doesn't let you increase provisioned\\n            capacity extremely rapidly, but the only quota that applies is that the aggregate\\n            provisioned capacity over all your tables and GSIs cannot exceed either of the\\n            per-account quotas.</p>\\n         <note>\\n            <p>\\n               <code>DescribeLimits</code> should only be called periodically. You can expect\\n                throttling errors if you call it more than once in a minute.</p>\\n         </note>\\n         <p>The <code>DescribeLimits</code> Request element has no content.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To determine capacity limits per table and account, in the current AWS region\",\n                        \"documentation\": \"The following example returns the maximum read and write capacity units per table, and for the AWS account, in the current AWS region.\",\n                        \"output\": {\n                            \"TableMaxWriteCapacityUnits\": 10000,\n                            \"TableMaxReadCapacityUnits\": 10000,\n                            \"AccountMaxReadCapacityUnits\": 20000,\n                            \"AccountMaxWriteCapacityUnits\": 20000\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.dynamodb#DescribeLimitsInput\": {\n            \"type\": \"structure\",\n            \"members\": {},\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents the input of a <code>DescribeLimits</code> operation. Has no\\n            content.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#DescribeLimitsOutput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountMaxReadCapacityUnits\": {\n                    \"target\": \"com.amazonaws.dynamodb#PositiveLongObject\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum total read capacity units that your account allows you to provision across\\n            all of your tables in this Region.</p>\"\n                    }\n                },\n                \"AccountMaxWriteCapacityUnits\": {\n                    \"target\": \"com.amazonaws.dynamodb#PositiveLongObject\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum total write capacity units that your account allows you to provision\\n            across all of your tables in this Region.</p>\"\n                    }\n                },\n                \"TableMaxReadCapacityUnits\": {\n                    \"target\": \"com.amazonaws.dynamodb#PositiveLongObject\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum read capacity units that your account allows you to provision for a new\\n            table that you are creating in this Region, including the read capacity units\\n            provisioned for its global secondary indexes (GSIs).</p>\"\n                    }\n                },\n                \"TableMaxWriteCapacityUnits\": {\n                    \"target\": \"com.amazonaws.dynamodb#PositiveLongObject\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum write capacity units that your account allows you to provision for a new\\n            table that you are creating in this Region, including the write capacity units\\n            provisioned for its global secondary indexes (GSIs).</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents the output of a <code>DescribeLimits</code> operation.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#DescribeTable\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.dynamodb#DescribeTableInput\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.dynamodb#DescribeTableOutput\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InvalidEndpointException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ResourceNotFoundException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#clientDiscoveredEndpoint\": {\n                    \"required\": false\n                },\n                \"smithy.api#documentation\": \"<p>Returns information about the table, including the current status of the table, when\\n            it was created, the primary key schema, and any indexes on the table.</p>\\n         <note>\\n            <p>If you issue a <code>DescribeTable</code> request immediately after a\\n                    <code>CreateTable</code> request, DynamoDB might return a\\n                    <code>ResourceNotFoundException</code>. This is because\\n                    <code>DescribeTable</code> uses an eventually consistent query, and the metadata\\n                for your table might not be available at that moment. Wait for a few seconds, and\\n                then try the <code>DescribeTable</code> request again.</p>\\n         </note>\",\n                \"smithy.waiters#waitable\": {\n                    \"TableExists\": {\n                        \"acceptors\": [\n                            {\n                                \"state\": \"success\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"Table.TableStatus\",\n                                        \"expected\": \"ACTIVE\",\n                                        \"comparator\": \"stringEquals\"\n                                    }\n                                }\n                            },\n                            {\n                                \"state\": \"retry\",\n                                \"matcher\": {\n                                    \"errorType\": \"ResourceNotFoundException\"\n                                }\n                            }\n                        ],\n                        \"minDelay\": 20\n                    },\n                    \"TableNotExists\": {\n                        \"acceptors\": [\n                            {\n                                \"state\": \"success\",\n                                \"matcher\": {\n                                    \"errorType\": \"ResourceNotFoundException\"\n                                }\n                            }\n                        ],\n                        \"minDelay\": 20\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#DescribeTableInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TableName\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the table to describe. You can also provide the Amazon Resource Name (ARN) of the table in\\n            this parameter.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"ResourceArn\"\n                        }\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents the input of a <code>DescribeTable</code> operation.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#DescribeTableOutput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Table\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableDescription\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The properties of the table.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents the output of a <code>DescribeTable</code> operation.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#DescribeTableReplicaAutoScaling\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.dynamodb#DescribeTableReplicaAutoScalingInput\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.dynamodb#DescribeTableReplicaAutoScalingOutput\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ResourceNotFoundException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes auto scaling settings across replicas of the global table at once.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#DescribeTableReplicaAutoScalingInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TableName\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the table. You can also provide the Amazon Resource Name (ARN) of the table in this\\n            parameter.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"ResourceArn\"\n                        }\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#DescribeTableReplicaAutoScalingOutput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TableAutoScalingDescription\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableAutoScalingDescription\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Represents the auto scaling properties of the table.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#DescribeTimeToLive\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.dynamodb#DescribeTimeToLiveInput\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.dynamodb#DescribeTimeToLiveOutput\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InvalidEndpointException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ResourceNotFoundException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#clientDiscoveredEndpoint\": {\n                    \"required\": false\n                },\n                \"smithy.api#documentation\": \"<p>Gives a description of the Time to Live (TTL) status on the specified table. </p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#DescribeTimeToLiveInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TableName\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the table to be described. You can also provide the Amazon Resource Name (ARN) of the table\\n            in this parameter.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"ResourceArn\"\n                        }\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#DescribeTimeToLiveOutput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TimeToLiveDescription\": {\n                    \"target\": \"com.amazonaws.dynamodb#TimeToLiveDescription\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#DestinationStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ENABLING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ENABLING\"\n                    }\n                },\n                \"ACTIVE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ACTIVE\"\n                    }\n                },\n                \"DISABLING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DISABLING\"\n                    }\n                },\n                \"DISABLED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DISABLED\"\n                    }\n                },\n                \"ENABLE_FAILED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ENABLE_FAILED\"\n                    }\n                },\n                \"UPDATING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"UPDATING\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#DisableKinesisStreamingDestination\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.dynamodb#KinesisStreamingDestinationInput\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.dynamodb#KinesisStreamingDestinationOutput\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InvalidEndpointException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ResourceInUseException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ResourceNotFoundException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#clientDiscoveredEndpoint\": {\n                    \"required\": false\n                },\n                \"smithy.api#documentation\": \"<p>Stops replication from the DynamoDB table to the Kinesis data stream. This\\n            is done without deleting either of the resources.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#DoubleObject\": {\n            \"type\": \"double\"\n        },\n        \"com.amazonaws.dynamodb#DuplicateItemException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.dynamodb#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p> There was an attempt to insert an item with the same primary key as an item that\\n            already exists in the DynamoDB table.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.dynamodb#DynamoDB_20120810\": {\n            \"type\": \"service\",\n            \"version\": \"2012-08-10\",\n            \"operations\": [\n                {\n                    \"target\": \"com.amazonaws.dynamodb#BatchExecuteStatement\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#BatchGetItem\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#BatchWriteItem\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#CreateBackup\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#CreateGlobalTable\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#CreateTable\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#DeleteBackup\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#DeleteItem\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#DeleteResourcePolicy\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#DeleteTable\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#DescribeBackup\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#DescribeContinuousBackups\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#DescribeContributorInsights\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#DescribeEndpoints\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#DescribeExport\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#DescribeGlobalTable\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#DescribeGlobalTableSettings\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#DescribeImport\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#DescribeKinesisStreamingDestination\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#DescribeLimits\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#DescribeTable\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#DescribeTableReplicaAutoScaling\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#DescribeTimeToLive\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#DisableKinesisStreamingDestination\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#EnableKinesisStreamingDestination\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ExecuteStatement\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ExecuteTransaction\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ExportTableToPointInTime\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#GetItem\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#GetResourcePolicy\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ImportTable\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ListBackups\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ListContributorInsights\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ListExports\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ListGlobalTables\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ListImports\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ListTables\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ListTagsOfResource\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#PutItem\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#PutResourcePolicy\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#Query\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#RestoreTableFromBackup\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#RestoreTableToPointInTime\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#Scan\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#TagResource\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#TransactGetItems\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#TransactWriteItems\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#UntagResource\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#UpdateContinuousBackups\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#UpdateContributorInsights\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#UpdateGlobalTable\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#UpdateGlobalTableSettings\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#UpdateItem\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#UpdateKinesisStreamingDestination\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#UpdateTable\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#UpdateTableReplicaAutoScaling\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#UpdateTimeToLive\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#clientEndpointDiscovery\": {\n                    \"operation\": \"com.amazonaws.dynamodb#DescribeEndpoints\",\n                    \"error\": \"com.amazonaws.dynamodb#InvalidEndpointException\"\n                },\n                \"aws.api#service\": {\n                    \"sdkId\": \"DynamoDB\",\n                    \"arnNamespace\": \"dynamodb\",\n                    \"cloudFormationName\": \"DynamoDB\",\n                    \"cloudTrailEventSource\": \"dynamodb.amazonaws.com\",\n                    \"endpointPrefix\": \"dynamodb\"\n                },\n                \"aws.auth#sigv4\": {\n                    \"name\": \"dynamodb\"\n                },\n                \"aws.protocols#awsJson1_0\": {},\n                \"smithy.api#documentation\": \"<fullname>Amazon DynamoDB</fullname>\\n         <p>Amazon DynamoDB is a fully managed NoSQL database service that provides fast\\n            and predictable performance with seamless scalability. DynamoDB lets you\\n            offload the administrative burdens of operating and scaling a distributed database, so\\n            that you don't have to worry about hardware provisioning, setup and configuration,\\n            replication, software patching, or cluster scaling.</p>\\n         <p>With DynamoDB, you can create database tables that can store and retrieve\\n            any amount of data, and serve any level of request traffic. You can scale up or scale\\n            down your tables' throughput capacity without downtime or performance degradation, and\\n            use the Amazon Web Services Management Console to monitor resource utilization and performance\\n            metrics.</p>\\n         <p>DynamoDB automatically spreads the data and traffic for your tables over\\n            a sufficient number of servers to handle your throughput and storage requirements, while\\n            maintaining consistent and fast performance. All of your data is stored on solid state\\n            disks (SSDs) and automatically replicated across multiple Availability Zones in an\\n                Amazon Web Services Region, providing built-in high availability and data\\n            durability.</p>\",\n                \"smithy.api#suppress\": [\n                    \"RuleSetAwsBuiltIn.AWS::Auth::AccountId\"\n                ],\n                \"smithy.api#title\": \"Amazon DynamoDB\",\n                \"smithy.api#xmlNamespace\": {\n                    \"uri\": \"http://dynamodb.amazonaws.com/doc/2012-08-10/\"\n                },\n                \"smithy.rules#endpointRuleSet\": {\n                    \"version\": \"1.0\",\n                    \"parameters\": {\n                        \"Region\": {\n                            \"builtIn\": \"AWS::Region\",\n                            \"required\": false,\n                            \"documentation\": \"The AWS region used to dispatch the request.\",\n                            \"type\": \"String\"\n                        },\n                        \"UseDualStack\": {\n                            \"builtIn\": \"AWS::UseDualStack\",\n                            \"required\": true,\n                            \"default\": false,\n                            \"documentation\": \"When true, use the dual-stack endpoint. If the configured endpoint does not support dual-stack, dispatching the request MAY return an error.\",\n                            \"type\": \"Boolean\"\n                        },\n                        \"UseFIPS\": {\n                            \"builtIn\": \"AWS::UseFIPS\",\n                            \"required\": true,\n                            \"default\": false,\n                            \"documentation\": \"When true, send this request to the FIPS-compliant regional endpoint. If the configured endpoint does not have a FIPS compliant endpoint, dispatching the request will return an error.\",\n                            \"type\": \"Boolean\"\n                        },\n                        \"Endpoint\": {\n                            \"builtIn\": \"SDK::Endpoint\",\n                            \"required\": false,\n                            \"documentation\": \"Override the endpoint used to send this request\",\n                            \"type\": \"String\"\n                        },\n                        \"AccountId\": {\n                            \"builtIn\": \"AWS::Auth::AccountId\",\n                            \"required\": false,\n                            \"documentation\": \"The AWS AccountId used for the request.\",\n                            \"type\": \"String\"\n                        },\n                        \"AccountIdEndpointMode\": {\n                            \"builtIn\": \"AWS::Auth::AccountIdEndpointMode\",\n                            \"required\": false,\n                            \"documentation\": \"The AccountId Endpoint Mode.\",\n                            \"type\": \"String\"\n                        },\n                        \"ResourceArn\": {\n                            \"required\": false,\n                            \"documentation\": \"ResourceArn containing arn of resource\",\n                            \"type\": \"String\"\n                        },\n                        \"ResourceArnList\": {\n                            \"required\": false,\n                            \"documentation\": \"ResourceArnList containing list of resource arns\",\n                            \"type\": \"stringArray\"\n                        }\n                    },\n                    \"rules\": [\n                        {\n                            \"conditions\": [\n                                {\n                                    \"fn\": \"isSet\",\n                                    \"argv\": [\n                                        {\n                                            \"ref\": \"Endpoint\"\n                                        }\n                                    ]\n                                }\n                            ],\n                            \"rules\": [\n                                {\n                                    \"conditions\": [\n                                        {\n                                            \"fn\": \"booleanEquals\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"UseFIPS\"\n                                                },\n                                                true\n                                            ]\n                                        }\n                                    ],\n                                    \"error\": \"Invalid Configuration: FIPS and custom endpoint are not supported\",\n                                    \"type\": \"error\"\n                                },\n                                {\n                                    \"conditions\": [\n                                        {\n                                            \"fn\": \"booleanEquals\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"UseDualStack\"\n                                                },\n                                                true\n                                            ]\n                                        }\n                                    ],\n                                    \"error\": \"Invalid Configuration: Dualstack and custom endpoint are not supported\",\n                                    \"type\": \"error\"\n                                },\n                                {\n                                    \"conditions\": [],\n                                    \"endpoint\": {\n                                        \"url\": \"{Endpoint}\",\n                                        \"properties\": {},\n                                        \"headers\": {}\n                                    },\n                                    \"type\": \"endpoint\"\n                                }\n                            ],\n                            \"type\": \"tree\"\n                        },\n                        {\n                            \"conditions\": [\n                                {\n                                    \"fn\": \"isSet\",\n                                    \"argv\": [\n                                        {\n                                            \"ref\": \"Region\"\n                                        }\n                                    ]\n                                }\n                            ],\n                            \"rules\": [\n                                {\n                                    \"conditions\": [\n                                        {\n                                            \"fn\": \"aws.partition\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"Region\"\n                                                }\n                                            ],\n                                            \"assign\": \"PartitionResult\"\n                                        }\n                                    ],\n                                    \"rules\": [\n                                        {\n                                            \"conditions\": [\n                                                {\n                                                    \"fn\": \"stringEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"Region\"\n                                                        },\n                                                        \"local\"\n                                                    ]\n                                                }\n                                            ],\n                                            \"rules\": [\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"UseFIPS\"\n                                                                },\n                                                                true\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"error\": \"Invalid Configuration: FIPS and local endpoint are not supported\",\n                                                    \"type\": \"error\"\n                                                },\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"UseDualStack\"\n                                                                },\n                                                                true\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"error\": \"Invalid Configuration: Dualstack and local endpoint are not supported\",\n                                                    \"type\": \"error\"\n                                                },\n                                                {\n                                                    \"conditions\": [],\n                                                    \"endpoint\": {\n                                                        \"url\": \"http://localhost:8000\",\n                                                        \"properties\": {\n                                                            \"authSchemes\": [\n                                                                {\n                                                                    \"name\": \"sigv4\",\n                                                                    \"signingName\": \"dynamodb\",\n                                                                    \"signingRegion\": \"us-east-1\"\n                                                                }\n                                                            ]\n                                                        },\n                                                        \"headers\": {}\n                                                    },\n                                                    \"type\": \"endpoint\"\n                                                }\n                                            ],\n                                            \"type\": \"tree\"\n                                        },\n                                        {\n                                            \"conditions\": [\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseFIPS\"\n                                                        },\n                                                        true\n                                                    ]\n                                                },\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseDualStack\"\n                                                        },\n                                                        true\n                                                    ]\n                                                }\n                                            ],\n                                            \"rules\": [\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"PartitionResult\"\n                                                                        },\n                                                                        \"supportsFIPS\"\n                                                                    ]\n                                                                },\n                                                                true\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"PartitionResult\"\n                                                                        },\n                                                                        \"supportsDualStack\"\n                                                                    ]\n                                                                },\n                                                                true\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"rules\": [\n                                                        {\n                                                            \"conditions\": [\n                                                                {\n                                                                    \"fn\": \"isSet\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"AccountIdEndpointMode\"\n                                                                        }\n                                                                    ]\n                                                                },\n                                                                {\n                                                                    \"fn\": \"stringEquals\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"AccountIdEndpointMode\"\n                                                                        },\n                                                                        \"required\"\n                                                                    ]\n                                                                }\n                                                            ],\n                                                            \"rules\": [\n                                                                {\n                                                                    \"conditions\": [],\n                                                                    \"error\": \"Invalid Configuration: AccountIdEndpointMode is required and FIPS is enabled, but FIPS account endpoints are not supported\",\n                                                                    \"type\": \"error\"\n                                                                }\n                                                            ],\n                                                            \"type\": \"tree\"\n                                                        },\n                                                        {\n                                                            \"conditions\": [],\n                                                            \"endpoint\": {\n                                                                \"url\": \"https://dynamodb-fips.{Region}.{PartitionResult#dualStackDnsSuffix}\",\n                                                                \"properties\": {},\n                                                                \"headers\": {}\n                                                            },\n                                                            \"type\": \"endpoint\"\n                                                        }\n                                                    ],\n                                                    \"type\": \"tree\"\n                                                },\n                                                {\n                                                    \"conditions\": [],\n                                                    \"error\": \"FIPS and DualStack are enabled, but this partition does not support one or both\",\n                                                    \"type\": \"error\"\n                                                }\n                                            ],\n                                            \"type\": \"tree\"\n                                        },\n                                        {\n                                            \"conditions\": [\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseFIPS\"\n                                                        },\n                                                        true\n                                                    ]\n                                                }\n                                            ],\n                                            \"rules\": [\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"PartitionResult\"\n                                                                        },\n                                                                        \"supportsFIPS\"\n                                                                    ]\n                                                                },\n                                                                true\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"rules\": [\n                                                        {\n                                                            \"conditions\": [\n                                                                {\n                                                                    \"fn\": \"stringEquals\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"fn\": \"getAttr\",\n                                                                            \"argv\": [\n                                                                                {\n                                                                                    \"ref\": \"PartitionResult\"\n                                                                                },\n                                                                                \"name\"\n                                                                            ]\n                                                                        },\n                                                                        \"aws-us-gov\"\n                                                                    ]\n                                                                }\n                                                            ],\n                                                            \"rules\": [\n                                                                {\n                                                                    \"conditions\": [\n                                                                        {\n                                                                            \"fn\": \"isSet\",\n                                                                            \"argv\": [\n                                                                                {\n                                                                                    \"ref\": \"AccountIdEndpointMode\"\n                                                                                }\n                                                                            ]\n                                                                        },\n                                                                        {\n                                                                            \"fn\": \"stringEquals\",\n                                                                            \"argv\": [\n                                                                                {\n                                                                                    \"ref\": \"AccountIdEndpointMode\"\n                                                                                },\n                                                                                \"required\"\n                                                                            ]\n                                                                        }\n                                                                    ],\n                                                                    \"rules\": [\n                                                                        {\n                                                                            \"conditions\": [],\n                                                                            \"error\": \"Invalid Configuration: AccountIdEndpointMode is required and FIPS is enabled, but FIPS account endpoints are not supported\",\n                                                                            \"type\": \"error\"\n                                                                        }\n                                                                    ],\n                                                                    \"type\": \"tree\"\n                                                                },\n                                                                {\n                                                                    \"conditions\": [],\n                                                                    \"endpoint\": {\n                                                                        \"url\": \"https://dynamodb.{Region}.{PartitionResult#dnsSuffix}\",\n                                                                        \"properties\": {},\n                                                                        \"headers\": {}\n                                                                    },\n                                                                    \"type\": \"endpoint\"\n                                                                }\n                                                            ],\n                                                            \"type\": \"tree\"\n                                                        },\n                                                        {\n                                                            \"conditions\": [\n                                                                {\n                                                                    \"fn\": \"isSet\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"AccountIdEndpointMode\"\n                                                                        }\n                                                                    ]\n                                                                },\n                                                                {\n                                                                    \"fn\": \"stringEquals\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"AccountIdEndpointMode\"\n                                                                        },\n                                                                        \"required\"\n                                                                    ]\n                                                                }\n                                                            ],\n                                                            \"rules\": [\n                                                                {\n                                                                    \"conditions\": [],\n                                                                    \"error\": \"Invalid Configuration: AccountIdEndpointMode is required and FIPS is enabled, but FIPS account endpoints are not supported\",\n                                                                    \"type\": \"error\"\n                                                                }\n                                                            ],\n                                                            \"type\": \"tree\"\n                                                        },\n                                                        {\n                                                            \"conditions\": [],\n                                                            \"endpoint\": {\n                                                                \"url\": \"https://dynamodb-fips.{Region}.{PartitionResult#dnsSuffix}\",\n                                                                \"properties\": {},\n                                                                \"headers\": {}\n                                                            },\n                                                            \"type\": \"endpoint\"\n                                                        }\n                                                    ],\n                                                    \"type\": \"tree\"\n                                                },\n                                                {\n                                                    \"conditions\": [],\n                                                    \"error\": \"FIPS is enabled but this partition does not support FIPS\",\n                                                    \"type\": \"error\"\n                                                }\n                                            ],\n                                            \"type\": \"tree\"\n                                        },\n                                        {\n                                            \"conditions\": [\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseDualStack\"\n                                                        },\n                                                        true\n                                                    ]\n                                                }\n                                            ],\n                                            \"rules\": [\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"PartitionResult\"\n                                                                        },\n                                                                        \"supportsDualStack\"\n                                                                    ]\n                                                                },\n                                                                true\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"rules\": [\n                                                        {\n                                                            \"conditions\": [\n                                                                {\n                                                                    \"fn\": \"isSet\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"AccountIdEndpointMode\"\n                                                                        }\n                                                                    ]\n                                                                },\n                                                                {\n                                                                    \"fn\": \"stringEquals\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"AccountIdEndpointMode\"\n                                                                        },\n                                                                        \"required\"\n                                                                    ]\n                                                                }\n                                                            ],\n                                                            \"rules\": [\n                                                                {\n                                                                    \"conditions\": [\n                                                                        {\n                                                                            \"fn\": \"not\",\n                                                                            \"argv\": [\n                                                                                {\n                                                                                    \"fn\": \"booleanEquals\",\n                                                                                    \"argv\": [\n                                                                                        {\n                                                                                            \"ref\": \"UseFIPS\"\n                                                                                        },\n                                                                                        true\n                                                                                    ]\n                                                                                }\n                                                                            ]\n                                                                        }\n                                                                    ],\n                                                                    \"rules\": [\n                                                                        {\n                                                                            \"conditions\": [],\n                                                                            \"error\": \"Invalid Configuration: AccountIdEndpointMode is required and DualStack is enabled, but DualStack account endpoints are not supported\",\n                                                                            \"type\": \"error\"\n                                                                        }\n                                                                    ],\n                                                                    \"type\": \"tree\"\n                                                                },\n                                                                {\n                                                                    \"conditions\": [],\n                                                                    \"error\": \"Invalid Configuration: AccountIdEndpointMode is required and FIPS is enabled, but FIPS account endpoints are not supported\",\n                                                                    \"type\": \"error\"\n                                                                }\n                                                            ],\n                                                            \"type\": \"tree\"\n                                                        },\n                                                        {\n                                                            \"conditions\": [],\n                                                            \"endpoint\": {\n                                                                \"url\": \"https://dynamodb.{Region}.{PartitionResult#dualStackDnsSuffix}\",\n                                                                \"properties\": {},\n                                                                \"headers\": {}\n                                                            },\n                                                            \"type\": \"endpoint\"\n                                                        }\n                                                    ],\n                                                    \"type\": \"tree\"\n                                                },\n                                                {\n                                                    \"conditions\": [],\n                                                    \"error\": \"DualStack is enabled but this partition does not support DualStack\",\n                                                    \"type\": \"error\"\n                                                }\n                                            ],\n                                            \"type\": \"tree\"\n                                        },\n                                        {\n                                            \"conditions\": [\n                                                {\n                                                    \"fn\": \"isSet\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"AccountIdEndpointMode\"\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"fn\": \"not\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"fn\": \"stringEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"AccountIdEndpointMode\"\n                                                                },\n                                                                \"disabled\"\n                                                            ]\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"fn\": \"stringEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"fn\": \"getAttr\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"PartitionResult\"\n                                                                },\n                                                                \"name\"\n                                                            ]\n                                                        },\n                                                        \"aws\"\n                                                    ]\n                                                },\n                                                {\n                                                    \"fn\": \"not\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"UseFIPS\"\n                                                                },\n                                                                true\n                                                            ]\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"fn\": \"not\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"UseDualStack\"\n                                                                },\n                                                                true\n                                                            ]\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"fn\": \"isSet\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"ResourceArn\"\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"fn\": \"aws.parseArn\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"ResourceArn\"\n                                                        }\n                                                    ],\n                                                    \"assign\": \"ParsedArn\"\n                                                },\n                                                {\n                                                    \"fn\": \"stringEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"fn\": \"getAttr\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"ParsedArn\"\n                                                                },\n                                                                \"service\"\n                                                            ]\n                                                        },\n                                                        \"dynamodb\"\n                                                    ]\n                                                },\n                                                {\n                                                    \"fn\": \"isValidHostLabel\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"fn\": \"getAttr\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"ParsedArn\"\n                                                                },\n                                                                \"region\"\n                                                            ]\n                                                        },\n                                                        false\n                                                    ]\n                                                },\n                                                {\n                                                    \"fn\": \"stringEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"fn\": \"getAttr\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"ParsedArn\"\n                                                                },\n                                                                \"region\"\n                                                            ]\n                                                        },\n                                                        \"{Region}\"\n                                                    ]\n                                                },\n                                                {\n                                                    \"fn\": \"isValidHostLabel\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"fn\": \"getAttr\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"ParsedArn\"\n                                                                },\n                                                                \"accountId\"\n                                                            ]\n                                                        },\n                                                        false\n                                                    ]\n                                                }\n                                            ],\n                                            \"endpoint\": {\n                                                \"url\": \"https://{ParsedArn#accountId}.ddb.{Region}.{PartitionResult#dnsSuffix}\",\n                                                \"properties\": {},\n                                                \"headers\": {}\n                                            },\n                                            \"type\": \"endpoint\"\n                                        },\n                                        {\n                                            \"conditions\": [\n                                                {\n                                                    \"fn\": \"isSet\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"AccountIdEndpointMode\"\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"fn\": \"not\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"fn\": \"stringEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"AccountIdEndpointMode\"\n                                                                },\n                                                                \"disabled\"\n                                                            ]\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"fn\": \"stringEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"fn\": \"getAttr\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"PartitionResult\"\n                                                                },\n                                                                \"name\"\n                                                            ]\n                                                        },\n                                                        \"aws\"\n                                                    ]\n                                                },\n                                                {\n                                                    \"fn\": \"not\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"UseFIPS\"\n                                                                },\n                                                                true\n                                                            ]\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"fn\": \"not\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"UseDualStack\"\n                                                                },\n                                                                true\n                                                            ]\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"fn\": \"isSet\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"ResourceArnList\"\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"fn\": \"getAttr\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"ResourceArnList\"\n                                                        },\n                                                        \"[0]\"\n                                                    ],\n                                                    \"assign\": \"FirstArn\"\n                                                },\n                                                {\n                                                    \"fn\": \"aws.parseArn\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"FirstArn\"\n                                                        }\n                                                    ],\n                                                    \"assign\": \"ParsedArn\"\n                                                },\n                                                {\n                                                    \"fn\": \"stringEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"fn\": \"getAttr\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"ParsedArn\"\n                                                                },\n                                                                \"service\"\n                                                            ]\n                                                        },\n                                                        \"dynamodb\"\n                                                    ]\n                                                },\n                                                {\n                                                    \"fn\": \"isValidHostLabel\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"fn\": \"getAttr\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"ParsedArn\"\n                                                                },\n                                                                \"region\"\n                                                            ]\n                                                        },\n                                                        false\n                                                    ]\n                                                },\n                                                {\n                                                    \"fn\": \"stringEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"fn\": \"getAttr\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"ParsedArn\"\n                                                                },\n                                                                \"region\"\n                                                            ]\n                                                        },\n                                                        \"{Region}\"\n                                                    ]\n                                                },\n                                                {\n                                                    \"fn\": \"isValidHostLabel\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"fn\": \"getAttr\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"ParsedArn\"\n                                                                },\n                                                                \"accountId\"\n                                                            ]\n                                                        },\n                                                        false\n                                                    ]\n                                                }\n                                            ],\n                                            \"endpoint\": {\n                                                \"url\": \"https://{ParsedArn#accountId}.ddb.{Region}.{PartitionResult#dnsSuffix}\",\n                                                \"properties\": {},\n                                                \"headers\": {}\n                                            },\n                                            \"type\": \"endpoint\"\n                                        },\n                                        {\n                                            \"conditions\": [\n                                                {\n                                                    \"fn\": \"isSet\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"AccountIdEndpointMode\"\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"fn\": \"not\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"fn\": \"stringEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"AccountIdEndpointMode\"\n                                                                },\n                                                                \"disabled\"\n                                                            ]\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"fn\": \"stringEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"fn\": \"getAttr\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"PartitionResult\"\n                                                                },\n                                                                \"name\"\n                                                            ]\n                                                        },\n                                                        \"aws\"\n                                                    ]\n                                                },\n                                                {\n                                                    \"fn\": \"not\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"UseFIPS\"\n                                                                },\n                                                                true\n                                                            ]\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"fn\": \"not\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"UseDualStack\"\n                                                                },\n                                                                true\n                                                            ]\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"fn\": \"isSet\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"AccountId\"\n                                                        }\n                                                    ]\n                                                }\n                                            ],\n                                            \"rules\": [\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"isValidHostLabel\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"AccountId\"\n                                                                },\n                                                                false\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"rules\": [\n                                                        {\n                                                            \"conditions\": [],\n                                                            \"endpoint\": {\n                                                                \"url\": \"https://{AccountId}.ddb.{Region}.{PartitionResult#dnsSuffix}\",\n                                                                \"properties\": {},\n                                                                \"headers\": {}\n                                                            },\n                                                            \"type\": \"endpoint\"\n                                                        }\n                                                    ],\n                                                    \"type\": \"tree\"\n                                                },\n                                                {\n                                                    \"conditions\": [],\n                                                    \"error\": \"Credentials-sourced account ID parameter is invalid\",\n                                                    \"type\": \"error\"\n                                                }\n                                            ],\n                                            \"type\": \"tree\"\n                                        },\n                                        {\n                                            \"conditions\": [\n                                                {\n                                                    \"fn\": \"isSet\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"AccountIdEndpointMode\"\n                                                        }\n                                                    ]\n                                                },\n                                                {\n                                                    \"fn\": \"stringEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"AccountIdEndpointMode\"\n                                                        },\n                                                        \"required\"\n                                                    ]\n                                                }\n                                            ],\n                                            \"rules\": [\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"not\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"fn\": \"booleanEquals\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"UseFIPS\"\n                                                                        },\n                                                                        true\n                                                                    ]\n                                                                }\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"rules\": [\n                                                        {\n                                                            \"conditions\": [\n                                                                {\n                                                                    \"fn\": \"not\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"fn\": \"booleanEquals\",\n                                                                            \"argv\": [\n                                                                                {\n                                                                                    \"ref\": \"UseDualStack\"\n                                                                                },\n                                                                                true\n                                                                            ]\n                                                                        }\n                                                                    ]\n                                                                }\n                                                            ],\n                                                            \"rules\": [\n                                                                {\n                                                                    \"conditions\": [\n                                                                        {\n                                                                            \"fn\": \"stringEquals\",\n                                                                            \"argv\": [\n                                                                                {\n                                                                                    \"fn\": \"getAttr\",\n                                                                                    \"argv\": [\n                                                                                        {\n                                                                                            \"ref\": \"PartitionResult\"\n                                                                                        },\n                                                                                        \"name\"\n                                                                                    ]\n                                                                                },\n                                                                                \"aws\"\n                                                                            ]\n                                                                        }\n                                                                    ],\n                                                                    \"rules\": [\n                                                                        {\n                                                                            \"conditions\": [],\n                                                                            \"error\": \"AccountIdEndpointMode is required but no AccountID was provided or able to be loaded\",\n                                                                            \"type\": \"error\"\n                                                                        }\n                                                                    ],\n                                                                    \"type\": \"tree\"\n                                                                },\n                                                                {\n                                                                    \"conditions\": [],\n                                                                    \"error\": \"Invalid Configuration: AccountIdEndpointMode is required but account endpoints are not supported in this partition\",\n                                                                    \"type\": \"error\"\n                                                                }\n                                                            ],\n                                                            \"type\": \"tree\"\n                                                        },\n                                                        {\n                                                            \"conditions\": [],\n                                                            \"error\": \"Invalid Configuration: AccountIdEndpointMode is required and DualStack is enabled, but DualStack account endpoints are not supported\",\n                                                            \"type\": \"error\"\n                                                        }\n                                                    ],\n                                                    \"type\": \"tree\"\n                                                },\n                                                {\n                                                    \"conditions\": [],\n                                                    \"error\": \"Invalid Configuration: AccountIdEndpointMode is required and FIPS is enabled, but FIPS account endpoints are not supported\",\n                                                    \"type\": \"error\"\n                                                }\n                                            ],\n                                            \"type\": \"tree\"\n                                        },\n                                        {\n                                            \"conditions\": [],\n                                            \"endpoint\": {\n                                                \"url\": \"https://dynamodb.{Region}.{PartitionResult#dnsSuffix}\",\n                                                \"properties\": {},\n                                                \"headers\": {}\n                                            },\n                                            \"type\": \"endpoint\"\n                                        }\n                                    ],\n                                    \"type\": \"tree\"\n                                }\n                            ],\n                            \"type\": \"tree\"\n                        },\n                        {\n                            \"conditions\": [],\n                            \"error\": \"Invalid Configuration: Missing Region\",\n                            \"type\": \"error\"\n                        }\n                    ]\n                },\n                \"smithy.rules#endpointTests\": {\n                    \"testCases\": [\n                        {\n                            \"documentation\": \"For region af-south-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.af-south-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"af-south-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.ap-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-northeast-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.ap-northeast-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-northeast-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-northeast-2 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.ap-northeast-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-northeast-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-northeast-3 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.ap-northeast-3.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-northeast-3\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-south-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.ap-south-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-south-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-southeast-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.ap-southeast-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-southeast-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-southeast-2 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.ap-southeast-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-southeast-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-southeast-3 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.ap-southeast-3.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-southeast-3\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ca-central-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.ca-central-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ca-central-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ca-central-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb-fips.ca-central-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ca-central-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-central-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.eu-central-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-central-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-north-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.eu-north-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-north-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-south-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.eu-south-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-south-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-west-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.eu-west-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-west-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-west-2 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.eu-west-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-west-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-west-3 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.eu-west-3.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-west-3\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region local with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"dynamodb\",\n                                                \"signingRegion\": \"us-east-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"http://localhost:8000\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"local\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region me-south-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.me-south-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"me-south-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region sa-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.sa-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"sa-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb-fips.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-2 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.us-east-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-2 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb-fips.us-east-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-2\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-west-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.us-west-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-west-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-west-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb-fips.us-west-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-west-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-west-2 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.us-west-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-west-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-west-2 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb-fips.us-west-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-west-2\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-1 with FIPS enabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb-fips.us-east-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-1 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.us-east-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-north-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.cn-north-1.amazonaws.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-north-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-northwest-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.cn-northwest-1.amazonaws.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-northwest-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-north-1 with FIPS enabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb-fips.cn-north-1.api.amazonwebservices.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-north-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-north-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb-fips.cn-north-1.amazonaws.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-north-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-north-1 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.cn-north-1.api.amazonwebservices.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-north-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.us-gov-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-east-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.us-gov-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-west-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.us-gov-west-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-west-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-west-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.us-gov-west-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-west-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-east-1 with FIPS enabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb-fips.us-gov-east-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-east-1 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.us-gov-east-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-iso-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.us-iso-east-1.c2s.ic.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-iso-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-iso-west-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.us-iso-west-1.c2s.ic.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-iso-west-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-iso-east-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb-fips.us-iso-east-1.c2s.ic.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-iso-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-isob-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.us-isob-east-1.sc2s.sgov.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-isob-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-isob-east-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb-fips.us-isob-east-1.sc2s.sgov.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-isob-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For custom endpoint with region set and fips disabled and dualstack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://example.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"For custom endpoint with region not set and fips disabled and dualstack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://example.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"For custom endpoint with fips enabled and dualstack disabled\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: FIPS and custom endpoint are not supported\"\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false,\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"For custom endpoint with fips disabled and dualstack enabled\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: Dualstack and custom endpoint are not supported\"\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true,\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"Missing region\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: Missing Region\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=true, UseDualStack=true, AccountId=111111111111, AccountIdEndpointMode=preferred, Region=us-east-1, Endpoint=https://example.com}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: FIPS and custom endpoint are not supported\"\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"SDK::Endpoint\": \"https://example.com\",\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": true,\n                                        \"AWS::UseDualStack\": true,\n                                        \"AWS::Auth::AccountId\": \"111111111111\",\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"preferred\"\n                                    },\n                                    \"operationName\": \"ListTables\"\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true,\n                                \"AccountId\": \"111111111111\",\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-east-1\",\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=true, UseDualStack=false, AccountId=111111111111, AccountIdEndpointMode=preferred, Region=us-east-1, Endpoint=https://example.com}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: FIPS and custom endpoint are not supported\"\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"SDK::Endpoint\": \"https://example.com\",\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": true,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountId\": \"111111111111\",\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"preferred\"\n                                    },\n                                    \"operationName\": \"ListTables\"\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-east-1\",\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=true, AccountId=111111111111, AccountIdEndpointMode=preferred, Region=us-east-1, Endpoint=https://example.com}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: Dualstack and custom endpoint are not supported\"\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"SDK::Endpoint\": \"https://example.com\",\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": true,\n                                        \"AWS::Auth::AccountId\": \"111111111111\",\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"preferred\"\n                                    },\n                                    \"operationName\": \"ListTables\"\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true,\n                                \"AccountId\": \"111111111111\",\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-east-1\",\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, AccountIdEndpointMode=preferred, Region=us-east-1, Endpoint=https://example.com}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://example.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"SDK::Endpoint\": \"https://example.com\",\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountId\": \"111111111111\",\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"preferred\"\n                                    },\n                                    \"operationName\": \"ListTables\"\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-east-1\",\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=preferred, Region=us-east-1, Endpoint=https://example.com}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://example.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"SDK::Endpoint\": \"https://example.com\",\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountId\": \"111111111111\",\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"preferred\"\n                                    },\n                                    \"operationName\": \"BatchGetItem\",\n                                    \"operationParams\": {\n                                        \"RequestItems\": {\n                                            \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\": {\n                                                \"Keys\": [\n                                                    {\n                                                        \"pk\": {\n                                                            \"S\": \"value\"\n                                                        }\n                                                    }\n                                                ]\n                                            }\n                                        }\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-east-1\",\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, ResourceArn=arn:aws:dynamodb:us-east-1:222222222222:table/table_name, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=preferred, Region=us-east-1, Endpoint=https://example.com}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://example.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-east-1\",\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, ResourceArn=arn:aws:dynamodb:us-west-2:222222222222:table/table_name, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=preferred, Region=us-east-1, Endpoint=https://example.com}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://example.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-west-2:222222222222:table/table_name\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-east-1\",\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, ResourceArn=arn:aws:s3:us-west-2:222222222222:stream/testStream, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=preferred, Region=us-east-1, Endpoint=https://example.com}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://example.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"ResourceArn\": \"arn:aws:s3:us-west-2:222222222222:stream/testStream\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-east-1\",\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, ResourceArn=arn:aws:dynamodb:us-west-2:222222222222:table/table_name, ResourceArnList=[arn:aws:dynamodb:us-west-2:333333333333:table/table_name], AccountIdEndpointMode=preferred, Region=us-east-1, Endpoint=https://example.com}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://example.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-west-2:222222222222:table/table_name\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-west-2:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-east-1\",\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, ResourceArn=arn:aws:s3:us-west-2:222222222222:stream/testStream, ResourceArnList=[arn:aws:s3:us-east-1:333333333333:stream/testStream], AccountIdEndpointMode=preferred, Region=us-east-1, Endpoint=https://example.com}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://example.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"ResourceArn\": \"arn:aws:s3:us-west-2:222222222222:stream/testStream\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:s3:us-east-1:333333333333:stream/testStream\"\n                                ],\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-east-1\",\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=, AccountIdEndpointMode=preferred, Region=us-east-1, Endpoint=https://example.com}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://example.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"SDK::Endpoint\": \"https://example.com\",\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountId\": \"\",\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"preferred\"\n                                    },\n                                    \"operationName\": \"ListTables\"\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"\",\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-east-1\",\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=true, UseDualStack=true, ResourceArn=arn:aws:dynamodb:us-east-1:222222222222:table/table_name, AccountIdEndpointMode=preferred, Region=us-east-1, Endpoint=https://example.com}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: FIPS and custom endpoint are not supported\"\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"SDK::Endpoint\": \"https://example.com\",\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": true,\n                                        \"AWS::UseDualStack\": true,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"preferred\"\n                                    },\n                                    \"operationName\": \"DescribeTable\",\n                                    \"operationParams\": {\n                                        \"TableName\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true,\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\",\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-east-1\",\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=true, UseDualStack=false, ResourceArn=arn:aws:dynamodb:us-east-1:222222222222:table/table_name, AccountIdEndpointMode=preferred, Region=us-east-1, Endpoint=https://example.com}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: FIPS and custom endpoint are not supported\"\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"SDK::Endpoint\": \"https://example.com\",\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": true,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"preferred\"\n                                    },\n                                    \"operationName\": \"DescribeTable\",\n                                    \"operationParams\": {\n                                        \"TableName\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false,\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\",\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-east-1\",\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=true, ResourceArn=arn:aws:dynamodb:us-east-1:222222222222:table/table_name, AccountIdEndpointMode=preferred, Region=us-east-1, Endpoint=https://example.com}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: Dualstack and custom endpoint are not supported\"\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"SDK::Endpoint\": \"https://example.com\",\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": true,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"preferred\"\n                                    },\n                                    \"operationName\": \"DescribeTable\",\n                                    \"operationParams\": {\n                                        \"TableName\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true,\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\",\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-east-1\",\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, ResourceArn=arn:aws:dynamodb:us-east-1:222222222222:table/table_name, AccountIdEndpointMode=preferred, Region=us-east-1, Endpoint=https://example.com}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://example.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"SDK::Endpoint\": \"https://example.com\",\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"preferred\"\n                                    },\n                                    \"operationName\": \"DescribeTable\",\n                                    \"operationParams\": {\n                                        \"TableName\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\",\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-east-1\",\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, ResourceArn=arn:aws:dynamodb:us-west-2:222222222222:table/table_name, AccountIdEndpointMode=preferred, Region=us-east-1, Endpoint=https://example.com}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://example.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"SDK::Endpoint\": \"https://example.com\",\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"preferred\"\n                                    },\n                                    \"operationName\": \"DescribeTable\",\n                                    \"operationParams\": {\n                                        \"TableName\": \"arn:aws:dynamodb:us-west-2:222222222222:table/table_name\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-west-2:222222222222:table/table_name\",\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-east-1\",\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, ResourceArn=arn:aws:s3:us-west-2:222222222222:stream/testStream, AccountIdEndpointMode=preferred, Region=us-east-1, Endpoint=https://example.com}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://example.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"SDK::Endpoint\": \"https://example.com\",\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"preferred\"\n                                    },\n                                    \"operationName\": \"DescribeTable\",\n                                    \"operationParams\": {\n                                        \"TableName\": \"arn:aws:s3:us-west-2:222222222222:stream/testStream\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"ResourceArn\": \"arn:aws:s3:us-west-2:222222222222:stream/testStream\",\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-east-1\",\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, ResourceArn=, AccountIdEndpointMode=preferred, Region=us-east-1, Endpoint=https://example.com}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://example.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"ResourceArn\": \"\",\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-east-1\",\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=true, UseDualStack=true, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=preferred, Region=us-east-1, Endpoint=https://example.com}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: FIPS and custom endpoint are not supported\"\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"SDK::Endpoint\": \"https://example.com\",\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": true,\n                                        \"AWS::UseDualStack\": true,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"preferred\"\n                                    },\n                                    \"operationName\": \"BatchGetItem\",\n                                    \"operationParams\": {\n                                        \"RequestItems\": {\n                                            \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\": {\n                                                \"Keys\": [\n                                                    {\n                                                        \"pk\": {\n                                                            \"S\": \"value\"\n                                                        }\n                                                    }\n                                                ]\n                                            }\n                                        }\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true,\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-east-1\",\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=true, UseDualStack=false, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=preferred, Region=us-east-1, Endpoint=https://example.com}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: FIPS and custom endpoint are not supported\"\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"SDK::Endpoint\": \"https://example.com\",\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": true,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"preferred\"\n                                    },\n                                    \"operationName\": \"BatchGetItem\",\n                                    \"operationParams\": {\n                                        \"RequestItems\": {\n                                            \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\": {\n                                                \"Keys\": [\n                                                    {\n                                                        \"pk\": {\n                                                            \"S\": \"value\"\n                                                        }\n                                                    }\n                                                ]\n                                            }\n                                        }\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false,\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-east-1\",\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=true, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=preferred, Region=us-east-1, Endpoint=https://example.com}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: Dualstack and custom endpoint are not supported\"\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"SDK::Endpoint\": \"https://example.com\",\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": true,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"preferred\"\n                                    },\n                                    \"operationName\": \"BatchGetItem\",\n                                    \"operationParams\": {\n                                        \"RequestItems\": {\n                                            \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\": {\n                                                \"Keys\": [\n                                                    {\n                                                        \"pk\": {\n                                                            \"S\": \"value\"\n                                                        }\n                                                    }\n                                                ]\n                                            }\n                                        }\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true,\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-east-1\",\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=preferred, Region=us-east-1, Endpoint=https://example.com}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://example.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"SDK::Endpoint\": \"https://example.com\",\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"preferred\"\n                                    },\n                                    \"operationName\": \"BatchGetItem\",\n                                    \"operationParams\": {\n                                        \"RequestItems\": {\n                                            \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\": {\n                                                \"Keys\": [\n                                                    {\n                                                        \"pk\": {\n                                                            \"S\": \"value\"\n                                                        }\n                                                    }\n                                                ]\n                                            }\n                                        }\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-east-1\",\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, ResourceArn=arn:aws:dynamodb:us-east-1:222222222222:table/table_name, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=preferred, Region=us-east-1, Endpoint=https://example.com}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://example.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-east-1\",\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountIdEndpointMode=preferred, Region=us-east-1, Endpoint=https://example.com}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://example.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-east-1\",\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=true, UseDualStack=true, AccountId=111111111111, AccountIdEndpointMode=disabled, Region=us-east-1, Endpoint=https://example.com}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: FIPS and custom endpoint are not supported\"\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"SDK::Endpoint\": \"https://example.com\",\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": true,\n                                        \"AWS::UseDualStack\": true,\n                                        \"AWS::Auth::AccountId\": \"111111111111\",\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"disabled\"\n                                    },\n                                    \"operationName\": \"ListTables\"\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true,\n                                \"AccountId\": \"111111111111\",\n                                \"AccountIdEndpointMode\": \"disabled\",\n                                \"Region\": \"us-east-1\",\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=true, UseDualStack=false, AccountId=111111111111, AccountIdEndpointMode=disabled, Region=us-east-1, Endpoint=https://example.com}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: FIPS and custom endpoint are not supported\"\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"SDK::Endpoint\": \"https://example.com\",\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": true,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountId\": \"111111111111\",\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"disabled\"\n                                    },\n                                    \"operationName\": \"ListTables\"\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"AccountIdEndpointMode\": \"disabled\",\n                                \"Region\": \"us-east-1\",\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=true, AccountId=111111111111, AccountIdEndpointMode=disabled, Region=us-east-1, Endpoint=https://example.com}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: Dualstack and custom endpoint are not supported\"\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"SDK::Endpoint\": \"https://example.com\",\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": true,\n                                        \"AWS::Auth::AccountId\": \"111111111111\",\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"disabled\"\n                                    },\n                                    \"operationName\": \"ListTables\"\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true,\n                                \"AccountId\": \"111111111111\",\n                                \"AccountIdEndpointMode\": \"disabled\",\n                                \"Region\": \"us-east-1\",\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, AccountIdEndpointMode=disabled, Region=us-east-1, Endpoint=https://example.com}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://example.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"SDK::Endpoint\": \"https://example.com\",\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountId\": \"111111111111\",\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"disabled\"\n                                    },\n                                    \"operationName\": \"ListTables\"\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"AccountIdEndpointMode\": \"disabled\",\n                                \"Region\": \"us-east-1\",\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=disabled, Region=us-east-1, Endpoint=https://example.com}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://example.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"SDK::Endpoint\": \"https://example.com\",\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountId\": \"111111111111\",\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"disabled\"\n                                    },\n                                    \"operationName\": \"BatchGetItem\",\n                                    \"operationParams\": {\n                                        \"RequestItems\": {\n                                            \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\": {\n                                                \"Keys\": [\n                                                    {\n                                                        \"pk\": {\n                                                            \"S\": \"value\"\n                                                        }\n                                                    }\n                                                ]\n                                            }\n                                        }\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"disabled\",\n                                \"Region\": \"us-east-1\",\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, ResourceArn=arn:aws:dynamodb:us-east-1:222222222222:table/table_name, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=disabled, Region=us-east-1, Endpoint=https://example.com}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://example.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"disabled\",\n                                \"Region\": \"us-east-1\",\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, ResourceArn=arn:aws:dynamodb:us-west-2:222222222222:table/table_name, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=disabled, Region=us-east-1, Endpoint=https://example.com}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://example.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-west-2:222222222222:table/table_name\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"disabled\",\n                                \"Region\": \"us-east-1\",\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, ResourceArn=arn:aws:s3:us-west-2:222222222222:stream/testStream, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=disabled, Region=us-east-1, Endpoint=https://example.com}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://example.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"ResourceArn\": \"arn:aws:s3:us-west-2:222222222222:stream/testStream\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"disabled\",\n                                \"Region\": \"us-east-1\",\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, ResourceArn=arn:aws:dynamodb:us-west-2:222222222222:table/table_name, ResourceArnList=[arn:aws:dynamodb:us-west-2:333333333333:table/table_name], AccountIdEndpointMode=disabled, Region=us-east-1, Endpoint=https://example.com}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://example.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-west-2:222222222222:table/table_name\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-west-2:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"disabled\",\n                                \"Region\": \"us-east-1\",\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, ResourceArn=arn:aws:s3:us-west-2:222222222222:stream/testStream, ResourceArnList=[arn:aws:s3:us-east-1:333333333333:stream/testStream], AccountIdEndpointMode=disabled, Region=us-east-1, Endpoint=https://example.com}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://example.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"ResourceArn\": \"arn:aws:s3:us-west-2:222222222222:stream/testStream\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:s3:us-east-1:333333333333:stream/testStream\"\n                                ],\n                                \"AccountIdEndpointMode\": \"disabled\",\n                                \"Region\": \"us-east-1\",\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=, AccountIdEndpointMode=disabled, Region=us-east-1, Endpoint=https://example.com}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://example.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"SDK::Endpoint\": \"https://example.com\",\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountId\": \"\",\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"disabled\"\n                                    },\n                                    \"operationName\": \"ListTables\"\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"\",\n                                \"AccountIdEndpointMode\": \"disabled\",\n                                \"Region\": \"us-east-1\",\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=true, UseDualStack=true, ResourceArn=arn:aws:dynamodb:us-east-1:222222222222:table/table_name, AccountIdEndpointMode=disabled, Region=us-east-1, Endpoint=https://example.com}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: FIPS and custom endpoint are not supported\"\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"SDK::Endpoint\": \"https://example.com\",\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": true,\n                                        \"AWS::UseDualStack\": true,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"disabled\"\n                                    },\n                                    \"operationName\": \"DescribeTable\",\n                                    \"operationParams\": {\n                                        \"TableName\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true,\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\",\n                                \"AccountIdEndpointMode\": \"disabled\",\n                                \"Region\": \"us-east-1\",\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=true, UseDualStack=false, ResourceArn=arn:aws:dynamodb:us-east-1:222222222222:table/table_name, AccountIdEndpointMode=disabled, Region=us-east-1, Endpoint=https://example.com}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: FIPS and custom endpoint are not supported\"\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"SDK::Endpoint\": \"https://example.com\",\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": true,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"disabled\"\n                                    },\n                                    \"operationName\": \"DescribeTable\",\n                                    \"operationParams\": {\n                                        \"TableName\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false,\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\",\n                                \"AccountIdEndpointMode\": \"disabled\",\n                                \"Region\": \"us-east-1\",\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=true, ResourceArn=arn:aws:dynamodb:us-east-1:222222222222:table/table_name, AccountIdEndpointMode=disabled, Region=us-east-1, Endpoint=https://example.com}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: Dualstack and custom endpoint are not supported\"\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"SDK::Endpoint\": \"https://example.com\",\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": true,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"disabled\"\n                                    },\n                                    \"operationName\": \"DescribeTable\",\n                                    \"operationParams\": {\n                                        \"TableName\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true,\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\",\n                                \"AccountIdEndpointMode\": \"disabled\",\n                                \"Region\": \"us-east-1\",\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, ResourceArn=arn:aws:dynamodb:us-east-1:222222222222:table/table_name, AccountIdEndpointMode=disabled, Region=us-east-1, Endpoint=https://example.com}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://example.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"SDK::Endpoint\": \"https://example.com\",\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"disabled\"\n                                    },\n                                    \"operationName\": \"DescribeTable\",\n                                    \"operationParams\": {\n                                        \"TableName\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\",\n                                \"AccountIdEndpointMode\": \"disabled\",\n                                \"Region\": \"us-east-1\",\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, ResourceArn=arn:aws:dynamodb:us-west-2:222222222222:table/table_name, AccountIdEndpointMode=disabled, Region=us-east-1, Endpoint=https://example.com}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://example.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"SDK::Endpoint\": \"https://example.com\",\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"disabled\"\n                                    },\n                                    \"operationName\": \"DescribeTable\",\n                                    \"operationParams\": {\n                                        \"TableName\": \"arn:aws:dynamodb:us-west-2:222222222222:table/table_name\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-west-2:222222222222:table/table_name\",\n                                \"AccountIdEndpointMode\": \"disabled\",\n                                \"Region\": \"us-east-1\",\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, ResourceArn=arn:aws:s3:us-west-2:222222222222:stream/testStream, AccountIdEndpointMode=disabled, Region=us-east-1, Endpoint=https://example.com}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://example.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"SDK::Endpoint\": \"https://example.com\",\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"disabled\"\n                                    },\n                                    \"operationName\": \"DescribeTable\",\n                                    \"operationParams\": {\n                                        \"TableName\": \"arn:aws:s3:us-west-2:222222222222:stream/testStream\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"ResourceArn\": \"arn:aws:s3:us-west-2:222222222222:stream/testStream\",\n                                \"AccountIdEndpointMode\": \"disabled\",\n                                \"Region\": \"us-east-1\",\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, ResourceArn=, AccountIdEndpointMode=disabled, Region=us-east-1, Endpoint=https://example.com}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://example.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"ResourceArn\": \"\",\n                                \"AccountIdEndpointMode\": \"disabled\",\n                                \"Region\": \"us-east-1\",\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=true, UseDualStack=true, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=disabled, Region=us-east-1, Endpoint=https://example.com}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: FIPS and custom endpoint are not supported\"\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"SDK::Endpoint\": \"https://example.com\",\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": true,\n                                        \"AWS::UseDualStack\": true,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"disabled\"\n                                    },\n                                    \"operationName\": \"BatchGetItem\",\n                                    \"operationParams\": {\n                                        \"RequestItems\": {\n                                            \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\": {\n                                                \"Keys\": [\n                                                    {\n                                                        \"pk\": {\n                                                            \"S\": \"value\"\n                                                        }\n                                                    }\n                                                ]\n                                            }\n                                        }\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true,\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"disabled\",\n                                \"Region\": \"us-east-1\",\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=true, UseDualStack=false, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=disabled, Region=us-east-1, Endpoint=https://example.com}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: FIPS and custom endpoint are not supported\"\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"SDK::Endpoint\": \"https://example.com\",\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": true,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"disabled\"\n                                    },\n                                    \"operationName\": \"BatchGetItem\",\n                                    \"operationParams\": {\n                                        \"RequestItems\": {\n                                            \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\": {\n                                                \"Keys\": [\n                                                    {\n                                                        \"pk\": {\n                                                            \"S\": \"value\"\n                                                        }\n                                                    }\n                                                ]\n                                            }\n                                        }\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false,\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"disabled\",\n                                \"Region\": \"us-east-1\",\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=true, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=disabled, Region=us-east-1, Endpoint=https://example.com}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: Dualstack and custom endpoint are not supported\"\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"SDK::Endpoint\": \"https://example.com\",\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": true,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"disabled\"\n                                    },\n                                    \"operationName\": \"BatchGetItem\",\n                                    \"operationParams\": {\n                                        \"RequestItems\": {\n                                            \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\": {\n                                                \"Keys\": [\n                                                    {\n                                                        \"pk\": {\n                                                            \"S\": \"value\"\n                                                        }\n                                                    }\n                                                ]\n                                            }\n                                        }\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true,\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"disabled\",\n                                \"Region\": \"us-east-1\",\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=disabled, Region=us-east-1, Endpoint=https://example.com}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://example.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"SDK::Endpoint\": \"https://example.com\",\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"disabled\"\n                                    },\n                                    \"operationName\": \"BatchGetItem\",\n                                    \"operationParams\": {\n                                        \"RequestItems\": {\n                                            \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\": {\n                                                \"Keys\": [\n                                                    {\n                                                        \"pk\": {\n                                                            \"S\": \"value\"\n                                                        }\n                                                    }\n                                                ]\n                                            }\n                                        }\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"disabled\",\n                                \"Region\": \"us-east-1\",\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, ResourceArn=arn:aws:dynamodb:us-east-1:222222222222:table/table_name, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=disabled, Region=us-east-1, Endpoint=https://example.com}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://example.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"disabled\",\n                                \"Region\": \"us-east-1\",\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountIdEndpointMode=disabled, Region=us-east-1, Endpoint=https://example.com}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://example.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountIdEndpointMode\": \"disabled\",\n                                \"Region\": \"us-east-1\",\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=true, UseDualStack=true, AccountId=111111111111, AccountIdEndpointMode=required, Region=us-east-1, Endpoint=https://example.com}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: FIPS and custom endpoint are not supported\"\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"SDK::Endpoint\": \"https://example.com\",\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": true,\n                                        \"AWS::UseDualStack\": true,\n                                        \"AWS::Auth::AccountId\": \"111111111111\",\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"required\"\n                                    },\n                                    \"operationName\": \"ListTables\"\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true,\n                                \"AccountId\": \"111111111111\",\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"us-east-1\",\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=true, UseDualStack=false, AccountId=111111111111, AccountIdEndpointMode=required, Region=us-east-1, Endpoint=https://example.com}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: FIPS and custom endpoint are not supported\"\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"SDK::Endpoint\": \"https://example.com\",\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": true,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountId\": \"111111111111\",\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"required\"\n                                    },\n                                    \"operationName\": \"ListTables\"\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"us-east-1\",\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=true, AccountId=111111111111, AccountIdEndpointMode=required, Region=us-east-1, Endpoint=https://example.com}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: Dualstack and custom endpoint are not supported\"\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"SDK::Endpoint\": \"https://example.com\",\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": true,\n                                        \"AWS::Auth::AccountId\": \"111111111111\",\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"required\"\n                                    },\n                                    \"operationName\": \"ListTables\"\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true,\n                                \"AccountId\": \"111111111111\",\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"us-east-1\",\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, AccountIdEndpointMode=required, Region=us-east-1, Endpoint=https://example.com}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://example.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"SDK::Endpoint\": \"https://example.com\",\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountId\": \"111111111111\",\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"required\"\n                                    },\n                                    \"operationName\": \"ListTables\"\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"us-east-1\",\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=required, Region=us-east-1, Endpoint=https://example.com}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://example.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"SDK::Endpoint\": \"https://example.com\",\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountId\": \"111111111111\",\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"required\"\n                                    },\n                                    \"operationName\": \"BatchGetItem\",\n                                    \"operationParams\": {\n                                        \"RequestItems\": {\n                                            \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\": {\n                                                \"Keys\": [\n                                                    {\n                                                        \"pk\": {\n                                                            \"S\": \"value\"\n                                                        }\n                                                    }\n                                                ]\n                                            }\n                                        }\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"us-east-1\",\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, ResourceArn=arn:aws:dynamodb:us-east-1:222222222222:table/table_name, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=required, Region=us-east-1, Endpoint=https://example.com}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://example.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"us-east-1\",\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, ResourceArn=arn:aws:dynamodb:us-west-2:222222222222:table/table_name, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=required, Region=us-east-1, Endpoint=https://example.com}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://example.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-west-2:222222222222:table/table_name\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"us-east-1\",\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, ResourceArn=arn:aws:s3:us-west-2:222222222222:stream/testStream, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=required, Region=us-east-1, Endpoint=https://example.com}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://example.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"ResourceArn\": \"arn:aws:s3:us-west-2:222222222222:stream/testStream\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"us-east-1\",\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, ResourceArn=arn:aws:dynamodb:us-west-2:222222222222:table/table_name, ResourceArnList=[arn:aws:dynamodb:us-west-2:333333333333:table/table_name], AccountIdEndpointMode=required, Region=us-east-1, Endpoint=https://example.com}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://example.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-west-2:222222222222:table/table_name\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-west-2:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"us-east-1\",\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, ResourceArn=arn:aws:s3:us-west-2:222222222222:stream/testStream, ResourceArnList=[arn:aws:s3:us-east-1:333333333333:stream/testStream], AccountIdEndpointMode=required, Region=us-east-1, Endpoint=https://example.com}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://example.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"ResourceArn\": \"arn:aws:s3:us-west-2:222222222222:stream/testStream\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:s3:us-east-1:333333333333:stream/testStream\"\n                                ],\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"us-east-1\",\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=, AccountIdEndpointMode=required, Region=us-east-1, Endpoint=https://example.com}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://example.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"SDK::Endpoint\": \"https://example.com\",\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountId\": \"\",\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"required\"\n                                    },\n                                    \"operationName\": \"ListTables\"\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"\",\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"us-east-1\",\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=true, UseDualStack=true, ResourceArn=arn:aws:dynamodb:us-east-1:222222222222:table/table_name, AccountIdEndpointMode=required, Region=us-east-1, Endpoint=https://example.com}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: FIPS and custom endpoint are not supported\"\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"SDK::Endpoint\": \"https://example.com\",\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": true,\n                                        \"AWS::UseDualStack\": true,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"required\"\n                                    },\n                                    \"operationName\": \"DescribeTable\",\n                                    \"operationParams\": {\n                                        \"TableName\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true,\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\",\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"us-east-1\",\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=true, UseDualStack=false, ResourceArn=arn:aws:dynamodb:us-east-1:222222222222:table/table_name, AccountIdEndpointMode=required, Region=us-east-1, Endpoint=https://example.com}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: FIPS and custom endpoint are not supported\"\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"SDK::Endpoint\": \"https://example.com\",\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": true,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"required\"\n                                    },\n                                    \"operationName\": \"DescribeTable\",\n                                    \"operationParams\": {\n                                        \"TableName\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false,\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\",\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"us-east-1\",\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=true, ResourceArn=arn:aws:dynamodb:us-east-1:222222222222:table/table_name, AccountIdEndpointMode=required, Region=us-east-1, Endpoint=https://example.com}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: Dualstack and custom endpoint are not supported\"\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"SDK::Endpoint\": \"https://example.com\",\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": true,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"required\"\n                                    },\n                                    \"operationName\": \"DescribeTable\",\n                                    \"operationParams\": {\n                                        \"TableName\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true,\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\",\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"us-east-1\",\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, ResourceArn=arn:aws:dynamodb:us-east-1:222222222222:table/table_name, AccountIdEndpointMode=required, Region=us-east-1, Endpoint=https://example.com}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://example.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"SDK::Endpoint\": \"https://example.com\",\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"required\"\n                                    },\n                                    \"operationName\": \"DescribeTable\",\n                                    \"operationParams\": {\n                                        \"TableName\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\",\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"us-east-1\",\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, ResourceArn=arn:aws:dynamodb:us-west-2:222222222222:table/table_name, AccountIdEndpointMode=required, Region=us-east-1, Endpoint=https://example.com}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://example.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"SDK::Endpoint\": \"https://example.com\",\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"required\"\n                                    },\n                                    \"operationName\": \"DescribeTable\",\n                                    \"operationParams\": {\n                                        \"TableName\": \"arn:aws:dynamodb:us-west-2:222222222222:table/table_name\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-west-2:222222222222:table/table_name\",\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"us-east-1\",\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, ResourceArn=arn:aws:s3:us-west-2:222222222222:stream/testStream, AccountIdEndpointMode=required, Region=us-east-1, Endpoint=https://example.com}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://example.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"SDK::Endpoint\": \"https://example.com\",\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"required\"\n                                    },\n                                    \"operationName\": \"DescribeTable\",\n                                    \"operationParams\": {\n                                        \"TableName\": \"arn:aws:s3:us-west-2:222222222222:stream/testStream\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"ResourceArn\": \"arn:aws:s3:us-west-2:222222222222:stream/testStream\",\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"us-east-1\",\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, ResourceArn=, AccountIdEndpointMode=required, Region=us-east-1, Endpoint=https://example.com}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://example.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"ResourceArn\": \"\",\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"us-east-1\",\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=true, UseDualStack=true, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=required, Region=us-east-1, Endpoint=https://example.com}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: FIPS and custom endpoint are not supported\"\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"SDK::Endpoint\": \"https://example.com\",\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": true,\n                                        \"AWS::UseDualStack\": true,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"required\"\n                                    },\n                                    \"operationName\": \"BatchGetItem\",\n                                    \"operationParams\": {\n                                        \"RequestItems\": {\n                                            \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\": {\n                                                \"Keys\": [\n                                                    {\n                                                        \"pk\": {\n                                                            \"S\": \"value\"\n                                                        }\n                                                    }\n                                                ]\n                                            }\n                                        }\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true,\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"us-east-1\",\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=true, UseDualStack=false, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=required, Region=us-east-1, Endpoint=https://example.com}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: FIPS and custom endpoint are not supported\"\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"SDK::Endpoint\": \"https://example.com\",\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": true,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"required\"\n                                    },\n                                    \"operationName\": \"BatchGetItem\",\n                                    \"operationParams\": {\n                                        \"RequestItems\": {\n                                            \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\": {\n                                                \"Keys\": [\n                                                    {\n                                                        \"pk\": {\n                                                            \"S\": \"value\"\n                                                        }\n                                                    }\n                                                ]\n                                            }\n                                        }\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false,\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"us-east-1\",\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=true, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=required, Region=us-east-1, Endpoint=https://example.com}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: Dualstack and custom endpoint are not supported\"\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"SDK::Endpoint\": \"https://example.com\",\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": true,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"required\"\n                                    },\n                                    \"operationName\": \"BatchGetItem\",\n                                    \"operationParams\": {\n                                        \"RequestItems\": {\n                                            \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\": {\n                                                \"Keys\": [\n                                                    {\n                                                        \"pk\": {\n                                                            \"S\": \"value\"\n                                                        }\n                                                    }\n                                                ]\n                                            }\n                                        }\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true,\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"us-east-1\",\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=required, Region=us-east-1, Endpoint=https://example.com}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://example.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"SDK::Endpoint\": \"https://example.com\",\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"required\"\n                                    },\n                                    \"operationName\": \"BatchGetItem\",\n                                    \"operationParams\": {\n                                        \"RequestItems\": {\n                                            \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\": {\n                                                \"Keys\": [\n                                                    {\n                                                        \"pk\": {\n                                                            \"S\": \"value\"\n                                                        }\n                                                    }\n                                                ]\n                                            }\n                                        }\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"us-east-1\",\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, ResourceArn=arn:aws:dynamodb:us-east-1:222222222222:table/table_name, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=required, Region=us-east-1, Endpoint=https://example.com}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://example.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"us-east-1\",\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountIdEndpointMode=required, Region=us-east-1, Endpoint=https://example.com}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://example.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"us-east-1\",\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=true, UseDualStack=true, AccountId=111111111111, AccountIdEndpointMode=preferred, Region=local}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: FIPS and local endpoint are not supported\"\n                            },\n                            \"params\": {\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true,\n                                \"AccountId\": \"111111111111\",\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"local\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=true, UseDualStack=false, AccountId=111111111111, AccountIdEndpointMode=preferred, Region=local}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: FIPS and local endpoint are not supported\"\n                            },\n                            \"params\": {\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"local\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=true, AccountId=111111111111, AccountIdEndpointMode=preferred, Region=local}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: Dualstack and local endpoint are not supported\"\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true,\n                                \"AccountId\": \"111111111111\",\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"local\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, AccountIdEndpointMode=preferred, Region=local}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"signingName\": \"dynamodb\",\n                                                \"name\": \"sigv4\",\n                                                \"signingRegion\": \"us-east-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"http://localhost:8000\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"local\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountId\": \"111111111111\",\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"preferred\"\n                                    },\n                                    \"operationName\": \"ListTables\"\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"local\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=preferred, Region=local}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"signingName\": \"dynamodb\",\n                                                \"name\": \"sigv4\",\n                                                \"signingRegion\": \"us-east-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"http://localhost:8000\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"local\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountId\": \"111111111111\",\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"preferred\"\n                                    },\n                                    \"operationName\": \"BatchGetItem\",\n                                    \"operationParams\": {\n                                        \"RequestItems\": {\n                                            \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\": {\n                                                \"Keys\": [\n                                                    {\n                                                        \"pk\": {\n                                                            \"S\": \"value\"\n                                                        }\n                                                    }\n                                                ]\n                                            }\n                                        }\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"local\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, ResourceArn=arn:aws:dynamodb:us-east-1:222222222222:table/table_name, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=preferred, Region=local}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"signingName\": \"dynamodb\",\n                                                \"name\": \"sigv4\",\n                                                \"signingRegion\": \"us-east-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"http://localhost:8000\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"local\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, ResourceArn=arn:aws:dynamodb:us-west-2:222222222222:table/table_name, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=preferred, Region=local}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"signingName\": \"dynamodb\",\n                                                \"name\": \"sigv4\",\n                                                \"signingRegion\": \"us-east-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"http://localhost:8000\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-west-2:222222222222:table/table_name\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"local\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, ResourceArn=arn:aws:s3:us-west-2:222222222222:stream/testStream, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=preferred, Region=local}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"signingName\": \"dynamodb\",\n                                                \"name\": \"sigv4\",\n                                                \"signingRegion\": \"us-east-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"http://localhost:8000\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"ResourceArn\": \"arn:aws:s3:us-west-2:222222222222:stream/testStream\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"local\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, ResourceArn=arn:aws:dynamodb:us-west-2:222222222222:table/table_name, ResourceArnList=[arn:aws:dynamodb:us-west-2:333333333333:table/table_name], AccountIdEndpointMode=preferred, Region=local}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"signingName\": \"dynamodb\",\n                                                \"name\": \"sigv4\",\n                                                \"signingRegion\": \"us-east-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"http://localhost:8000\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-west-2:222222222222:table/table_name\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-west-2:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"local\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, ResourceArn=arn:aws:s3:us-west-2:222222222222:stream/testStream, ResourceArnList=[arn:aws:s3:us-east-1:333333333333:stream/testStream], AccountIdEndpointMode=preferred, Region=local}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"signingName\": \"dynamodb\",\n                                                \"name\": \"sigv4\",\n                                                \"signingRegion\": \"us-east-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"http://localhost:8000\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"ResourceArn\": \"arn:aws:s3:us-west-2:222222222222:stream/testStream\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:s3:us-east-1:333333333333:stream/testStream\"\n                                ],\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"local\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=, AccountIdEndpointMode=preferred, Region=local}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"signingName\": \"dynamodb\",\n                                                \"name\": \"sigv4\",\n                                                \"signingRegion\": \"us-east-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"http://localhost:8000\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"local\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountId\": \"\",\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"preferred\"\n                                    },\n                                    \"operationName\": \"ListTables\"\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"\",\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"local\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=true, UseDualStack=true, ResourceArn=arn:aws:dynamodb:us-east-1:222222222222:table/table_name, AccountIdEndpointMode=preferred, Region=local}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: FIPS and local endpoint are not supported\"\n                            },\n                            \"params\": {\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true,\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\",\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"local\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=true, UseDualStack=false, ResourceArn=arn:aws:dynamodb:us-east-1:222222222222:table/table_name, AccountIdEndpointMode=preferred, Region=local}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: FIPS and local endpoint are not supported\"\n                            },\n                            \"params\": {\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false,\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\",\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"local\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=true, ResourceArn=arn:aws:dynamodb:us-east-1:222222222222:table/table_name, AccountIdEndpointMode=preferred, Region=local}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: Dualstack and local endpoint are not supported\"\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true,\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\",\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"local\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, ResourceArn=arn:aws:dynamodb:us-east-1:222222222222:table/table_name, AccountIdEndpointMode=preferred, Region=local}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"signingName\": \"dynamodb\",\n                                                \"name\": \"sigv4\",\n                                                \"signingRegion\": \"us-east-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"http://localhost:8000\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"local\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"preferred\"\n                                    },\n                                    \"operationName\": \"DescribeTable\",\n                                    \"operationParams\": {\n                                        \"TableName\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\",\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"local\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, ResourceArn=arn:aws:dynamodb:us-west-2:222222222222:table/table_name, AccountIdEndpointMode=preferred, Region=local}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"signingName\": \"dynamodb\",\n                                                \"name\": \"sigv4\",\n                                                \"signingRegion\": \"us-east-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"http://localhost:8000\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"local\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"preferred\"\n                                    },\n                                    \"operationName\": \"DescribeTable\",\n                                    \"operationParams\": {\n                                        \"TableName\": \"arn:aws:dynamodb:us-west-2:222222222222:table/table_name\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-west-2:222222222222:table/table_name\",\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"local\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, ResourceArn=arn:aws:s3:us-west-2:222222222222:stream/testStream, AccountIdEndpointMode=preferred, Region=local}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"signingName\": \"dynamodb\",\n                                                \"name\": \"sigv4\",\n                                                \"signingRegion\": \"us-east-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"http://localhost:8000\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"local\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"preferred\"\n                                    },\n                                    \"operationName\": \"DescribeTable\",\n                                    \"operationParams\": {\n                                        \"TableName\": \"arn:aws:s3:us-west-2:222222222222:stream/testStream\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"ResourceArn\": \"arn:aws:s3:us-west-2:222222222222:stream/testStream\",\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"local\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, ResourceArn=, AccountIdEndpointMode=preferred, Region=local}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"signingName\": \"dynamodb\",\n                                                \"name\": \"sigv4\",\n                                                \"signingRegion\": \"us-east-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"http://localhost:8000\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"ResourceArn\": \"\",\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"local\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=true, UseDualStack=true, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=preferred, Region=local}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: FIPS and local endpoint are not supported\"\n                            },\n                            \"params\": {\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true,\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"local\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=true, UseDualStack=false, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=preferred, Region=local}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: FIPS and local endpoint are not supported\"\n                            },\n                            \"params\": {\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false,\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"local\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=true, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=preferred, Region=local}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: Dualstack and local endpoint are not supported\"\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true,\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"local\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=preferred, Region=local}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"signingName\": \"dynamodb\",\n                                                \"name\": \"sigv4\",\n                                                \"signingRegion\": \"us-east-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"http://localhost:8000\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"local\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"preferred\"\n                                    },\n                                    \"operationName\": \"BatchGetItem\",\n                                    \"operationParams\": {\n                                        \"RequestItems\": {\n                                            \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\": {\n                                                \"Keys\": [\n                                                    {\n                                                        \"pk\": {\n                                                            \"S\": \"value\"\n                                                        }\n                                                    }\n                                                ]\n                                            }\n                                        }\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"local\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, ResourceArn=arn:aws:dynamodb:us-east-1:222222222222:table/table_name, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=preferred, Region=local}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"signingName\": \"dynamodb\",\n                                                \"name\": \"sigv4\",\n                                                \"signingRegion\": \"us-east-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"http://localhost:8000\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"local\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountIdEndpointMode=preferred, Region=local}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"signingName\": \"dynamodb\",\n                                                \"name\": \"sigv4\",\n                                                \"signingRegion\": \"us-east-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"http://localhost:8000\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"local\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=true, UseDualStack=true, AccountId=111111111111, AccountIdEndpointMode=disabled, Region=local}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: FIPS and local endpoint are not supported\"\n                            },\n                            \"params\": {\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true,\n                                \"AccountId\": \"111111111111\",\n                                \"AccountIdEndpointMode\": \"disabled\",\n                                \"Region\": \"local\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=true, UseDualStack=false, AccountId=111111111111, AccountIdEndpointMode=disabled, Region=local}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: FIPS and local endpoint are not supported\"\n                            },\n                            \"params\": {\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"AccountIdEndpointMode\": \"disabled\",\n                                \"Region\": \"local\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=true, AccountId=111111111111, AccountIdEndpointMode=disabled, Region=local}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: Dualstack and local endpoint are not supported\"\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true,\n                                \"AccountId\": \"111111111111\",\n                                \"AccountIdEndpointMode\": \"disabled\",\n                                \"Region\": \"local\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, AccountIdEndpointMode=disabled, Region=local}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"signingName\": \"dynamodb\",\n                                                \"name\": \"sigv4\",\n                                                \"signingRegion\": \"us-east-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"http://localhost:8000\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"local\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountId\": \"111111111111\",\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"disabled\"\n                                    },\n                                    \"operationName\": \"ListTables\"\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"AccountIdEndpointMode\": \"disabled\",\n                                \"Region\": \"local\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=disabled, Region=local}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"signingName\": \"dynamodb\",\n                                                \"name\": \"sigv4\",\n                                                \"signingRegion\": \"us-east-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"http://localhost:8000\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"local\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountId\": \"111111111111\",\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"disabled\"\n                                    },\n                                    \"operationName\": \"BatchGetItem\",\n                                    \"operationParams\": {\n                                        \"RequestItems\": {\n                                            \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\": {\n                                                \"Keys\": [\n                                                    {\n                                                        \"pk\": {\n                                                            \"S\": \"value\"\n                                                        }\n                                                    }\n                                                ]\n                                            }\n                                        }\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"disabled\",\n                                \"Region\": \"local\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, ResourceArn=arn:aws:dynamodb:us-east-1:222222222222:table/table_name, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=disabled, Region=local}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"signingName\": \"dynamodb\",\n                                                \"name\": \"sigv4\",\n                                                \"signingRegion\": \"us-east-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"http://localhost:8000\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"disabled\",\n                                \"Region\": \"local\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, ResourceArn=arn:aws:dynamodb:us-west-2:222222222222:table/table_name, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=disabled, Region=local}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"signingName\": \"dynamodb\",\n                                                \"name\": \"sigv4\",\n                                                \"signingRegion\": \"us-east-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"http://localhost:8000\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-west-2:222222222222:table/table_name\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"disabled\",\n                                \"Region\": \"local\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, ResourceArn=arn:aws:s3:us-west-2:222222222222:stream/testStream, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=disabled, Region=local}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"signingName\": \"dynamodb\",\n                                                \"name\": \"sigv4\",\n                                                \"signingRegion\": \"us-east-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"http://localhost:8000\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"ResourceArn\": \"arn:aws:s3:us-west-2:222222222222:stream/testStream\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"disabled\",\n                                \"Region\": \"local\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, ResourceArn=arn:aws:dynamodb:us-west-2:222222222222:table/table_name, ResourceArnList=[arn:aws:dynamodb:us-west-2:333333333333:table/table_name], AccountIdEndpointMode=disabled, Region=local}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"signingName\": \"dynamodb\",\n                                                \"name\": \"sigv4\",\n                                                \"signingRegion\": \"us-east-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"http://localhost:8000\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-west-2:222222222222:table/table_name\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-west-2:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"disabled\",\n                                \"Region\": \"local\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, ResourceArn=arn:aws:s3:us-west-2:222222222222:stream/testStream, ResourceArnList=[arn:aws:s3:us-east-1:333333333333:stream/testStream], AccountIdEndpointMode=disabled, Region=local}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"signingName\": \"dynamodb\",\n                                                \"name\": \"sigv4\",\n                                                \"signingRegion\": \"us-east-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"http://localhost:8000\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"ResourceArn\": \"arn:aws:s3:us-west-2:222222222222:stream/testStream\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:s3:us-east-1:333333333333:stream/testStream\"\n                                ],\n                                \"AccountIdEndpointMode\": \"disabled\",\n                                \"Region\": \"local\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=, AccountIdEndpointMode=disabled, Region=local}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"signingName\": \"dynamodb\",\n                                                \"name\": \"sigv4\",\n                                                \"signingRegion\": \"us-east-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"http://localhost:8000\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"local\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountId\": \"\",\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"disabled\"\n                                    },\n                                    \"operationName\": \"ListTables\"\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"\",\n                                \"AccountIdEndpointMode\": \"disabled\",\n                                \"Region\": \"local\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=true, UseDualStack=true, ResourceArn=arn:aws:dynamodb:us-east-1:222222222222:table/table_name, AccountIdEndpointMode=disabled, Region=local}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: FIPS and local endpoint are not supported\"\n                            },\n                            \"params\": {\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true,\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\",\n                                \"AccountIdEndpointMode\": \"disabled\",\n                                \"Region\": \"local\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=true, UseDualStack=false, ResourceArn=arn:aws:dynamodb:us-east-1:222222222222:table/table_name, AccountIdEndpointMode=disabled, Region=local}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: FIPS and local endpoint are not supported\"\n                            },\n                            \"params\": {\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false,\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\",\n                                \"AccountIdEndpointMode\": \"disabled\",\n                                \"Region\": \"local\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=true, ResourceArn=arn:aws:dynamodb:us-east-1:222222222222:table/table_name, AccountIdEndpointMode=disabled, Region=local}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: Dualstack and local endpoint are not supported\"\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true,\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\",\n                                \"AccountIdEndpointMode\": \"disabled\",\n                                \"Region\": \"local\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, ResourceArn=arn:aws:dynamodb:us-east-1:222222222222:table/table_name, AccountIdEndpointMode=disabled, Region=local}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"signingName\": \"dynamodb\",\n                                                \"name\": \"sigv4\",\n                                                \"signingRegion\": \"us-east-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"http://localhost:8000\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"local\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"disabled\"\n                                    },\n                                    \"operationName\": \"DescribeTable\",\n                                    \"operationParams\": {\n                                        \"TableName\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\",\n                                \"AccountIdEndpointMode\": \"disabled\",\n                                \"Region\": \"local\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, ResourceArn=arn:aws:dynamodb:us-west-2:222222222222:table/table_name, AccountIdEndpointMode=disabled, Region=local}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"signingName\": \"dynamodb\",\n                                                \"name\": \"sigv4\",\n                                                \"signingRegion\": \"us-east-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"http://localhost:8000\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"local\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"disabled\"\n                                    },\n                                    \"operationName\": \"DescribeTable\",\n                                    \"operationParams\": {\n                                        \"TableName\": \"arn:aws:dynamodb:us-west-2:222222222222:table/table_name\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-west-2:222222222222:table/table_name\",\n                                \"AccountIdEndpointMode\": \"disabled\",\n                                \"Region\": \"local\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, ResourceArn=arn:aws:s3:us-west-2:222222222222:stream/testStream, AccountIdEndpointMode=disabled, Region=local}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"signingName\": \"dynamodb\",\n                                                \"name\": \"sigv4\",\n                                                \"signingRegion\": \"us-east-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"http://localhost:8000\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"local\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"disabled\"\n                                    },\n                                    \"operationName\": \"DescribeTable\",\n                                    \"operationParams\": {\n                                        \"TableName\": \"arn:aws:s3:us-west-2:222222222222:stream/testStream\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"ResourceArn\": \"arn:aws:s3:us-west-2:222222222222:stream/testStream\",\n                                \"AccountIdEndpointMode\": \"disabled\",\n                                \"Region\": \"local\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, ResourceArn=, AccountIdEndpointMode=disabled, Region=local}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"signingName\": \"dynamodb\",\n                                                \"name\": \"sigv4\",\n                                                \"signingRegion\": \"us-east-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"http://localhost:8000\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"ResourceArn\": \"\",\n                                \"AccountIdEndpointMode\": \"disabled\",\n                                \"Region\": \"local\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=true, UseDualStack=true, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=disabled, Region=local}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: FIPS and local endpoint are not supported\"\n                            },\n                            \"params\": {\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true,\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"disabled\",\n                                \"Region\": \"local\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=true, UseDualStack=false, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=disabled, Region=local}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: FIPS and local endpoint are not supported\"\n                            },\n                            \"params\": {\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false,\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"disabled\",\n                                \"Region\": \"local\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=true, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=disabled, Region=local}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: Dualstack and local endpoint are not supported\"\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true,\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"disabled\",\n                                \"Region\": \"local\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=disabled, Region=local}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"signingName\": \"dynamodb\",\n                                                \"name\": \"sigv4\",\n                                                \"signingRegion\": \"us-east-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"http://localhost:8000\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"local\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"disabled\"\n                                    },\n                                    \"operationName\": \"BatchGetItem\",\n                                    \"operationParams\": {\n                                        \"RequestItems\": {\n                                            \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\": {\n                                                \"Keys\": [\n                                                    {\n                                                        \"pk\": {\n                                                            \"S\": \"value\"\n                                                        }\n                                                    }\n                                                ]\n                                            }\n                                        }\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"disabled\",\n                                \"Region\": \"local\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, ResourceArn=arn:aws:dynamodb:us-east-1:222222222222:table/table_name, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=disabled, Region=local}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"signingName\": \"dynamodb\",\n                                                \"name\": \"sigv4\",\n                                                \"signingRegion\": \"us-east-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"http://localhost:8000\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"disabled\",\n                                \"Region\": \"local\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountIdEndpointMode=disabled, Region=local}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"signingName\": \"dynamodb\",\n                                                \"name\": \"sigv4\",\n                                                \"signingRegion\": \"us-east-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"http://localhost:8000\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountIdEndpointMode\": \"disabled\",\n                                \"Region\": \"local\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=true, UseDualStack=true, AccountId=111111111111, AccountIdEndpointMode=required, Region=local}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: FIPS and local endpoint are not supported\"\n                            },\n                            \"params\": {\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true,\n                                \"AccountId\": \"111111111111\",\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"local\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=true, UseDualStack=false, AccountId=111111111111, AccountIdEndpointMode=required, Region=local}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: FIPS and local endpoint are not supported\"\n                            },\n                            \"params\": {\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"local\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=true, AccountId=111111111111, AccountIdEndpointMode=required, Region=local}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: Dualstack and local endpoint are not supported\"\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true,\n                                \"AccountId\": \"111111111111\",\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"local\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, AccountIdEndpointMode=required, Region=local}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"signingName\": \"dynamodb\",\n                                                \"name\": \"sigv4\",\n                                                \"signingRegion\": \"us-east-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"http://localhost:8000\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"local\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountId\": \"111111111111\",\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"required\"\n                                    },\n                                    \"operationName\": \"ListTables\"\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"local\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=required, Region=local}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"signingName\": \"dynamodb\",\n                                                \"name\": \"sigv4\",\n                                                \"signingRegion\": \"us-east-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"http://localhost:8000\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"local\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountId\": \"111111111111\",\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"required\"\n                                    },\n                                    \"operationName\": \"BatchGetItem\",\n                                    \"operationParams\": {\n                                        \"RequestItems\": {\n                                            \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\": {\n                                                \"Keys\": [\n                                                    {\n                                                        \"pk\": {\n                                                            \"S\": \"value\"\n                                                        }\n                                                    }\n                                                ]\n                                            }\n                                        }\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"local\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, ResourceArn=arn:aws:dynamodb:us-east-1:222222222222:table/table_name, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=required, Region=local}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"signingName\": \"dynamodb\",\n                                                \"name\": \"sigv4\",\n                                                \"signingRegion\": \"us-east-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"http://localhost:8000\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"local\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, ResourceArn=arn:aws:dynamodb:us-west-2:222222222222:table/table_name, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=required, Region=local}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"signingName\": \"dynamodb\",\n                                                \"name\": \"sigv4\",\n                                                \"signingRegion\": \"us-east-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"http://localhost:8000\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-west-2:222222222222:table/table_name\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"local\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, ResourceArn=arn:aws:s3:us-west-2:222222222222:stream/testStream, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=required, Region=local}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"signingName\": \"dynamodb\",\n                                                \"name\": \"sigv4\",\n                                                \"signingRegion\": \"us-east-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"http://localhost:8000\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"ResourceArn\": \"arn:aws:s3:us-west-2:222222222222:stream/testStream\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"local\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, ResourceArn=arn:aws:dynamodb:us-west-2:222222222222:table/table_name, ResourceArnList=[arn:aws:dynamodb:us-west-2:333333333333:table/table_name], AccountIdEndpointMode=required, Region=local}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"signingName\": \"dynamodb\",\n                                                \"name\": \"sigv4\",\n                                                \"signingRegion\": \"us-east-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"http://localhost:8000\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-west-2:222222222222:table/table_name\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-west-2:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"local\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, ResourceArn=arn:aws:s3:us-west-2:222222222222:stream/testStream, ResourceArnList=[arn:aws:s3:us-east-1:333333333333:stream/testStream], AccountIdEndpointMode=required, Region=local}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"signingName\": \"dynamodb\",\n                                                \"name\": \"sigv4\",\n                                                \"signingRegion\": \"us-east-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"http://localhost:8000\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"ResourceArn\": \"arn:aws:s3:us-west-2:222222222222:stream/testStream\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:s3:us-east-1:333333333333:stream/testStream\"\n                                ],\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"local\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=, AccountIdEndpointMode=required, Region=local}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"signingName\": \"dynamodb\",\n                                                \"name\": \"sigv4\",\n                                                \"signingRegion\": \"us-east-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"http://localhost:8000\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"local\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountId\": \"\",\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"required\"\n                                    },\n                                    \"operationName\": \"ListTables\"\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"\",\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"local\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=true, UseDualStack=true, ResourceArn=arn:aws:dynamodb:us-east-1:222222222222:table/table_name, AccountIdEndpointMode=required, Region=local}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: FIPS and local endpoint are not supported\"\n                            },\n                            \"params\": {\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true,\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\",\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"local\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=true, UseDualStack=false, ResourceArn=arn:aws:dynamodb:us-east-1:222222222222:table/table_name, AccountIdEndpointMode=required, Region=local}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: FIPS and local endpoint are not supported\"\n                            },\n                            \"params\": {\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false,\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\",\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"local\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=true, ResourceArn=arn:aws:dynamodb:us-east-1:222222222222:table/table_name, AccountIdEndpointMode=required, Region=local}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: Dualstack and local endpoint are not supported\"\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true,\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\",\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"local\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, ResourceArn=arn:aws:dynamodb:us-east-1:222222222222:table/table_name, AccountIdEndpointMode=required, Region=local}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"signingName\": \"dynamodb\",\n                                                \"name\": \"sigv4\",\n                                                \"signingRegion\": \"us-east-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"http://localhost:8000\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"local\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"required\"\n                                    },\n                                    \"operationName\": \"DescribeTable\",\n                                    \"operationParams\": {\n                                        \"TableName\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\",\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"local\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, ResourceArn=arn:aws:dynamodb:us-west-2:222222222222:table/table_name, AccountIdEndpointMode=required, Region=local}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"signingName\": \"dynamodb\",\n                                                \"name\": \"sigv4\",\n                                                \"signingRegion\": \"us-east-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"http://localhost:8000\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"local\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"required\"\n                                    },\n                                    \"operationName\": \"DescribeTable\",\n                                    \"operationParams\": {\n                                        \"TableName\": \"arn:aws:dynamodb:us-west-2:222222222222:table/table_name\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-west-2:222222222222:table/table_name\",\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"local\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, ResourceArn=arn:aws:s3:us-west-2:222222222222:stream/testStream, AccountIdEndpointMode=required, Region=local}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"signingName\": \"dynamodb\",\n                                                \"name\": \"sigv4\",\n                                                \"signingRegion\": \"us-east-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"http://localhost:8000\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"local\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"required\"\n                                    },\n                                    \"operationName\": \"DescribeTable\",\n                                    \"operationParams\": {\n                                        \"TableName\": \"arn:aws:s3:us-west-2:222222222222:stream/testStream\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"ResourceArn\": \"arn:aws:s3:us-west-2:222222222222:stream/testStream\",\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"local\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, ResourceArn=, AccountIdEndpointMode=required, Region=local}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"signingName\": \"dynamodb\",\n                                                \"name\": \"sigv4\",\n                                                \"signingRegion\": \"us-east-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"http://localhost:8000\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"ResourceArn\": \"\",\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"local\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=true, UseDualStack=true, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=required, Region=local}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: FIPS and local endpoint are not supported\"\n                            },\n                            \"params\": {\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true,\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"local\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=true, UseDualStack=false, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=required, Region=local}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: FIPS and local endpoint are not supported\"\n                            },\n                            \"params\": {\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false,\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"local\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=true, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=required, Region=local}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: Dualstack and local endpoint are not supported\"\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true,\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"local\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=required, Region=local}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"signingName\": \"dynamodb\",\n                                                \"name\": \"sigv4\",\n                                                \"signingRegion\": \"us-east-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"http://localhost:8000\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"local\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"required\"\n                                    },\n                                    \"operationName\": \"BatchGetItem\",\n                                    \"operationParams\": {\n                                        \"RequestItems\": {\n                                            \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\": {\n                                                \"Keys\": [\n                                                    {\n                                                        \"pk\": {\n                                                            \"S\": \"value\"\n                                                        }\n                                                    }\n                                                ]\n                                            }\n                                        }\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"local\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, ResourceArn=arn:aws:dynamodb:us-east-1:222222222222:table/table_name, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=required, Region=local}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"signingName\": \"dynamodb\",\n                                                \"name\": \"sigv4\",\n                                                \"signingRegion\": \"us-east-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"http://localhost:8000\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"local\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountIdEndpointMode=required, Region=local}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"signingName\": \"dynamodb\",\n                                                \"name\": \"sigv4\",\n                                                \"signingRegion\": \"us-east-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"http://localhost:8000\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"local\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=true, UseDualStack=true, AccountId=111111111111, AccountIdEndpointMode=preferred, Region=us-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb-fips.us-east-1.api.aws\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": true,\n                                        \"AWS::UseDualStack\": true,\n                                        \"AWS::Auth::AccountId\": \"111111111111\",\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"preferred\"\n                                    },\n                                    \"operationName\": \"ListTables\"\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true,\n                                \"AccountId\": \"111111111111\",\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=true, UseDualStack=false, AccountId=111111111111, AccountIdEndpointMode=preferred, Region=us-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb-fips.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": true,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountId\": \"111111111111\",\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"preferred\"\n                                    },\n                                    \"operationName\": \"ListTables\"\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=true, AccountId=111111111111, AccountIdEndpointMode=preferred, Region=us-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.us-east-1.api.aws\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": true,\n                                        \"AWS::Auth::AccountId\": \"111111111111\",\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"preferred\"\n                                    },\n                                    \"operationName\": \"ListTables\"\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true,\n                                \"AccountId\": \"111111111111\",\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, AccountIdEndpointMode=preferred, Region=us-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://111111111111.ddb.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountId\": \"111111111111\",\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"preferred\"\n                                    },\n                                    \"operationName\": \"ListTables\"\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=preferred, Region=us-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://333333333333.ddb.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountId\": \"111111111111\",\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"preferred\"\n                                    },\n                                    \"operationName\": \"BatchGetItem\",\n                                    \"operationParams\": {\n                                        \"RequestItems\": {\n                                            \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\": {\n                                                \"Keys\": [\n                                                    {\n                                                        \"pk\": {\n                                                            \"S\": \"value\"\n                                                        }\n                                                    }\n                                                ]\n                                            }\n                                        }\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, ResourceArn=arn:aws:dynamodb:us-east-1:222222222222:table/table_name, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=preferred, Region=us-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://222222222222.ddb.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, ResourceArn=arn:aws:dynamodb:us-west-2:222222222222:table/table_name, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=preferred, Region=us-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://333333333333.ddb.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-west-2:222222222222:table/table_name\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, ResourceArn=arn:aws:s3:us-west-2:222222222222:stream/testStream, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=preferred, Region=us-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://333333333333.ddb.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"ResourceArn\": \"arn:aws:s3:us-west-2:222222222222:stream/testStream\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, ResourceArn=arn:aws:dynamodb:us-west-2:222222222222:table/table_name, ResourceArnList=[arn:aws:dynamodb:us-west-2:333333333333:table/table_name], AccountIdEndpointMode=preferred, Region=us-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://111111111111.ddb.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-west-2:222222222222:table/table_name\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-west-2:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, ResourceArn=arn:aws:s3:us-west-2:222222222222:stream/testStream, ResourceArnList=[arn:aws:s3:us-east-1:333333333333:stream/testStream], AccountIdEndpointMode=preferred, Region=us-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://111111111111.ddb.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"ResourceArn\": \"arn:aws:s3:us-west-2:222222222222:stream/testStream\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:s3:us-east-1:333333333333:stream/testStream\"\n                                ],\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=, AccountIdEndpointMode=preferred, Region=us-east-1}\",\n                            \"expect\": {\n                                \"error\": \"Credentials-sourced account ID parameter is invalid\"\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountId\": \"\",\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"preferred\"\n                                    },\n                                    \"operationName\": \"ListTables\"\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"\",\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=true, UseDualStack=true, ResourceArn=arn:aws:dynamodb:us-east-1:222222222222:table/table_name, AccountIdEndpointMode=preferred, Region=us-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb-fips.us-east-1.api.aws\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": true,\n                                        \"AWS::UseDualStack\": true,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"preferred\"\n                                    },\n                                    \"operationName\": \"DescribeTable\",\n                                    \"operationParams\": {\n                                        \"TableName\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true,\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\",\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=true, UseDualStack=false, ResourceArn=arn:aws:dynamodb:us-east-1:222222222222:table/table_name, AccountIdEndpointMode=preferred, Region=us-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb-fips.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": true,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"preferred\"\n                                    },\n                                    \"operationName\": \"DescribeTable\",\n                                    \"operationParams\": {\n                                        \"TableName\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false,\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\",\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=true, ResourceArn=arn:aws:dynamodb:us-east-1:222222222222:table/table_name, AccountIdEndpointMode=preferred, Region=us-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.us-east-1.api.aws\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": true,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"preferred\"\n                                    },\n                                    \"operationName\": \"DescribeTable\",\n                                    \"operationParams\": {\n                                        \"TableName\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true,\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\",\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, ResourceArn=arn:aws:dynamodb:us-east-1:222222222222:table/table_name, AccountIdEndpointMode=preferred, Region=us-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://222222222222.ddb.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"preferred\"\n                                    },\n                                    \"operationName\": \"DescribeTable\",\n                                    \"operationParams\": {\n                                        \"TableName\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\",\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, ResourceArn=arn:aws:dynamodb:us-west-2:222222222222:table/table_name, AccountIdEndpointMode=preferred, Region=us-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"preferred\"\n                                    },\n                                    \"operationName\": \"DescribeTable\",\n                                    \"operationParams\": {\n                                        \"TableName\": \"arn:aws:dynamodb:us-west-2:222222222222:table/table_name\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-west-2:222222222222:table/table_name\",\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, ResourceArn=arn:aws:s3:us-west-2:222222222222:stream/testStream, AccountIdEndpointMode=preferred, Region=us-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"preferred\"\n                                    },\n                                    \"operationName\": \"DescribeTable\",\n                                    \"operationParams\": {\n                                        \"TableName\": \"arn:aws:s3:us-west-2:222222222222:stream/testStream\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"ResourceArn\": \"arn:aws:s3:us-west-2:222222222222:stream/testStream\",\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, ResourceArn=, AccountIdEndpointMode=preferred, Region=us-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"ResourceArn\": \"\",\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=true, UseDualStack=true, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=preferred, Region=us-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb-fips.us-east-1.api.aws\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": true,\n                                        \"AWS::UseDualStack\": true,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"preferred\"\n                                    },\n                                    \"operationName\": \"BatchGetItem\",\n                                    \"operationParams\": {\n                                        \"RequestItems\": {\n                                            \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\": {\n                                                \"Keys\": [\n                                                    {\n                                                        \"pk\": {\n                                                            \"S\": \"value\"\n                                                        }\n                                                    }\n                                                ]\n                                            }\n                                        }\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true,\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=true, UseDualStack=false, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=preferred, Region=us-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb-fips.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": true,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"preferred\"\n                                    },\n                                    \"operationName\": \"BatchGetItem\",\n                                    \"operationParams\": {\n                                        \"RequestItems\": {\n                                            \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\": {\n                                                \"Keys\": [\n                                                    {\n                                                        \"pk\": {\n                                                            \"S\": \"value\"\n                                                        }\n                                                    }\n                                                ]\n                                            }\n                                        }\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false,\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=true, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=preferred, Region=us-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.us-east-1.api.aws\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": true,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"preferred\"\n                                    },\n                                    \"operationName\": \"BatchGetItem\",\n                                    \"operationParams\": {\n                                        \"RequestItems\": {\n                                            \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\": {\n                                                \"Keys\": [\n                                                    {\n                                                        \"pk\": {\n                                                            \"S\": \"value\"\n                                                        }\n                                                    }\n                                                ]\n                                            }\n                                        }\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true,\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=preferred, Region=us-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://333333333333.ddb.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"preferred\"\n                                    },\n                                    \"operationName\": \"BatchGetItem\",\n                                    \"operationParams\": {\n                                        \"RequestItems\": {\n                                            \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\": {\n                                                \"Keys\": [\n                                                    {\n                                                        \"pk\": {\n                                                            \"S\": \"value\"\n                                                        }\n                                                    }\n                                                ]\n                                            }\n                                        }\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, ResourceArn=arn:aws:dynamodb:us-east-1:222222222222:table/table_name, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=preferred, Region=us-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://222222222222.ddb.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountIdEndpointMode=preferred, Region=us-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=true, UseDualStack=true, AccountId=111111111111, AccountIdEndpointMode=required, Region=us-east-1}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: AccountIdEndpointMode is required and FIPS is enabled, but FIPS account endpoints are not supported\"\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": true,\n                                        \"AWS::UseDualStack\": true,\n                                        \"AWS::Auth::AccountId\": \"111111111111\",\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"required\"\n                                    },\n                                    \"operationName\": \"ListTables\"\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true,\n                                \"AccountId\": \"111111111111\",\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"us-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=true, UseDualStack=false, AccountId=111111111111, AccountIdEndpointMode=required, Region=us-east-1}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: AccountIdEndpointMode is required and FIPS is enabled, but FIPS account endpoints are not supported\"\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": true,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountId\": \"111111111111\",\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"required\"\n                                    },\n                                    \"operationName\": \"ListTables\"\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"us-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=true, AccountId=111111111111, AccountIdEndpointMode=required, Region=us-east-1}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: AccountIdEndpointMode is required and DualStack is enabled, but DualStack account endpoints are not supported\"\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": true,\n                                        \"AWS::Auth::AccountId\": \"111111111111\",\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"required\"\n                                    },\n                                    \"operationName\": \"ListTables\"\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true,\n                                \"AccountId\": \"111111111111\",\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"us-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, AccountIdEndpointMode=required, Region=us-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://111111111111.ddb.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountId\": \"111111111111\",\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"required\"\n                                    },\n                                    \"operationName\": \"ListTables\"\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"us-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=required, Region=us-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://333333333333.ddb.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountId\": \"111111111111\",\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"required\"\n                                    },\n                                    \"operationName\": \"BatchGetItem\",\n                                    \"operationParams\": {\n                                        \"RequestItems\": {\n                                            \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\": {\n                                                \"Keys\": [\n                                                    {\n                                                        \"pk\": {\n                                                            \"S\": \"value\"\n                                                        }\n                                                    }\n                                                ]\n                                            }\n                                        }\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"us-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, ResourceArn=arn:aws:dynamodb:us-east-1:222222222222:table/table_name, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=required, Region=us-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://222222222222.ddb.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"us-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, ResourceArn=arn:aws:dynamodb:us-west-2:222222222222:table/table_name, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=required, Region=us-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://333333333333.ddb.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-west-2:222222222222:table/table_name\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"us-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, ResourceArn=arn:aws:s3:us-west-2:222222222222:stream/testStream, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=required, Region=us-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://333333333333.ddb.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"ResourceArn\": \"arn:aws:s3:us-west-2:222222222222:stream/testStream\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"us-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, ResourceArn=arn:aws:dynamodb:us-west-2:222222222222:table/table_name, ResourceArnList=[arn:aws:dynamodb:us-west-2:333333333333:table/table_name], AccountIdEndpointMode=required, Region=us-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://111111111111.ddb.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-west-2:222222222222:table/table_name\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-west-2:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"us-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, ResourceArn=arn:aws:s3:us-west-2:222222222222:stream/testStream, ResourceArnList=[arn:aws:s3:us-east-1:333333333333:stream/testStream], AccountIdEndpointMode=required, Region=us-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://111111111111.ddb.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"ResourceArn\": \"arn:aws:s3:us-west-2:222222222222:stream/testStream\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:s3:us-east-1:333333333333:stream/testStream\"\n                                ],\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"us-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=, AccountIdEndpointMode=required, Region=us-east-1}\",\n                            \"expect\": {\n                                \"error\": \"Credentials-sourced account ID parameter is invalid\"\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountId\": \"\",\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"required\"\n                                    },\n                                    \"operationName\": \"ListTables\"\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"\",\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"us-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=true, UseDualStack=true, ResourceArn=arn:aws:dynamodb:us-east-1:222222222222:table/table_name, AccountIdEndpointMode=required, Region=us-east-1}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: AccountIdEndpointMode is required and FIPS is enabled, but FIPS account endpoints are not supported\"\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": true,\n                                        \"AWS::UseDualStack\": true,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"required\"\n                                    },\n                                    \"operationName\": \"DescribeTable\",\n                                    \"operationParams\": {\n                                        \"TableName\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true,\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\",\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"us-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=true, UseDualStack=false, ResourceArn=arn:aws:dynamodb:us-east-1:222222222222:table/table_name, AccountIdEndpointMode=required, Region=us-east-1}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: AccountIdEndpointMode is required and FIPS is enabled, but FIPS account endpoints are not supported\"\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": true,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"required\"\n                                    },\n                                    \"operationName\": \"DescribeTable\",\n                                    \"operationParams\": {\n                                        \"TableName\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false,\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\",\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"us-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=true, ResourceArn=arn:aws:dynamodb:us-east-1:222222222222:table/table_name, AccountIdEndpointMode=required, Region=us-east-1}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: AccountIdEndpointMode is required and DualStack is enabled, but DualStack account endpoints are not supported\"\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": true,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"required\"\n                                    },\n                                    \"operationName\": \"DescribeTable\",\n                                    \"operationParams\": {\n                                        \"TableName\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true,\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\",\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"us-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, ResourceArn=arn:aws:dynamodb:us-east-1:222222222222:table/table_name, AccountIdEndpointMode=required, Region=us-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://222222222222.ddb.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"required\"\n                                    },\n                                    \"operationName\": \"DescribeTable\",\n                                    \"operationParams\": {\n                                        \"TableName\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\",\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"us-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, ResourceArn=arn:aws:dynamodb:us-west-2:222222222222:table/table_name, AccountIdEndpointMode=required, Region=us-east-1}\",\n                            \"expect\": {\n                                \"error\": \"AccountIdEndpointMode is required but no AccountID was provided or able to be loaded\"\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"required\"\n                                    },\n                                    \"operationName\": \"DescribeTable\",\n                                    \"operationParams\": {\n                                        \"TableName\": \"arn:aws:dynamodb:us-west-2:222222222222:table/table_name\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-west-2:222222222222:table/table_name\",\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"us-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, ResourceArn=arn:aws:s3:us-west-2:222222222222:stream/testStream, AccountIdEndpointMode=required, Region=us-east-1}\",\n                            \"expect\": {\n                                \"error\": \"AccountIdEndpointMode is required but no AccountID was provided or able to be loaded\"\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"required\"\n                                    },\n                                    \"operationName\": \"DescribeTable\",\n                                    \"operationParams\": {\n                                        \"TableName\": \"arn:aws:s3:us-west-2:222222222222:stream/testStream\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"ResourceArn\": \"arn:aws:s3:us-west-2:222222222222:stream/testStream\",\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"us-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, ResourceArn=, AccountIdEndpointMode=required, Region=us-east-1}\",\n                            \"expect\": {\n                                \"error\": \"AccountIdEndpointMode is required but no AccountID was provided or able to be loaded\"\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"ResourceArn\": \"\",\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"us-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=true, UseDualStack=true, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=required, Region=us-east-1}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: AccountIdEndpointMode is required and FIPS is enabled, but FIPS account endpoints are not supported\"\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": true,\n                                        \"AWS::UseDualStack\": true,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"required\"\n                                    },\n                                    \"operationName\": \"BatchGetItem\",\n                                    \"operationParams\": {\n                                        \"RequestItems\": {\n                                            \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\": {\n                                                \"Keys\": [\n                                                    {\n                                                        \"pk\": {\n                                                            \"S\": \"value\"\n                                                        }\n                                                    }\n                                                ]\n                                            }\n                                        }\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true,\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"us-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=true, UseDualStack=false, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=required, Region=us-east-1}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: AccountIdEndpointMode is required and FIPS is enabled, but FIPS account endpoints are not supported\"\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": true,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"required\"\n                                    },\n                                    \"operationName\": \"BatchGetItem\",\n                                    \"operationParams\": {\n                                        \"RequestItems\": {\n                                            \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\": {\n                                                \"Keys\": [\n                                                    {\n                                                        \"pk\": {\n                                                            \"S\": \"value\"\n                                                        }\n                                                    }\n                                                ]\n                                            }\n                                        }\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false,\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"us-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=true, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=required, Region=us-east-1}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: AccountIdEndpointMode is required and DualStack is enabled, but DualStack account endpoints are not supported\"\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": true,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"required\"\n                                    },\n                                    \"operationName\": \"BatchGetItem\",\n                                    \"operationParams\": {\n                                        \"RequestItems\": {\n                                            \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\": {\n                                                \"Keys\": [\n                                                    {\n                                                        \"pk\": {\n                                                            \"S\": \"value\"\n                                                        }\n                                                    }\n                                                ]\n                                            }\n                                        }\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true,\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"us-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=required, Region=us-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://333333333333.ddb.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"required\"\n                                    },\n                                    \"operationName\": \"BatchGetItem\",\n                                    \"operationParams\": {\n                                        \"RequestItems\": {\n                                            \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\": {\n                                                \"Keys\": [\n                                                    {\n                                                        \"pk\": {\n                                                            \"S\": \"value\"\n                                                        }\n                                                    }\n                                                ]\n                                            }\n                                        }\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"us-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, ResourceArn=arn:aws:dynamodb:us-east-1:222222222222:table/table_name, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=required, Region=us-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://222222222222.ddb.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"us-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountIdEndpointMode=required, Region=us-east-1}\",\n                            \"expect\": {\n                                \"error\": \"AccountIdEndpointMode is required but no AccountID was provided or able to be loaded\"\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"us-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=true, UseDualStack=true, AccountId=111111111111, AccountIdEndpointMode=required, Region=cn-north-1}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: AccountIdEndpointMode is required and FIPS is enabled, but FIPS account endpoints are not supported\"\n                            },\n                            \"params\": {\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true,\n                                \"AccountId\": \"111111111111\",\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"cn-north-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=true, UseDualStack=false, AccountId=111111111111, AccountIdEndpointMode=required, Region=cn-north-1}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: AccountIdEndpointMode is required and FIPS is enabled, but FIPS account endpoints are not supported\"\n                            },\n                            \"params\": {\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"cn-north-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=true, AccountId=111111111111, AccountIdEndpointMode=required, Region=cn-north-1}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: AccountIdEndpointMode is required and DualStack is enabled, but DualStack account endpoints are not supported\"\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true,\n                                \"AccountId\": \"111111111111\",\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"cn-north-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, AccountIdEndpointMode=required, Region=cn-north-1}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: AccountIdEndpointMode is required but account endpoints are not supported in this partition\"\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"cn-north-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountId\": \"111111111111\",\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"required\"\n                                    },\n                                    \"operationName\": \"ListTables\"\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"cn-north-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=required, Region=cn-north-1}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: AccountIdEndpointMode is required but account endpoints are not supported in this partition\"\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"cn-north-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountId\": \"111111111111\",\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"required\"\n                                    },\n                                    \"operationName\": \"BatchGetItem\",\n                                    \"operationParams\": {\n                                        \"RequestItems\": {\n                                            \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\": {\n                                                \"Keys\": [\n                                                    {\n                                                        \"pk\": {\n                                                            \"S\": \"value\"\n                                                        }\n                                                    }\n                                                ]\n                                            }\n                                        }\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"cn-north-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, ResourceArn=arn:aws:dynamodb:us-east-1:222222222222:table/table_name, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=required, Region=cn-north-1}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: AccountIdEndpointMode is required but account endpoints are not supported in this partition\"\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"cn-north-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, ResourceArn=arn:aws:dynamodb:us-west-2:222222222222:table/table_name, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=required, Region=cn-north-1}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: AccountIdEndpointMode is required but account endpoints are not supported in this partition\"\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-west-2:222222222222:table/table_name\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"cn-north-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, ResourceArn=arn:aws:s3:us-west-2:222222222222:stream/testStream, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=required, Region=cn-north-1}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: AccountIdEndpointMode is required but account endpoints are not supported in this partition\"\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"ResourceArn\": \"arn:aws:s3:us-west-2:222222222222:stream/testStream\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"cn-north-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, ResourceArn=arn:aws:dynamodb:us-west-2:222222222222:table/table_name, ResourceArnList=[arn:aws:dynamodb:us-west-2:333333333333:table/table_name], AccountIdEndpointMode=required, Region=cn-north-1}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: AccountIdEndpointMode is required but account endpoints are not supported in this partition\"\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-west-2:222222222222:table/table_name\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-west-2:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"cn-north-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, ResourceArn=arn:aws:s3:us-west-2:222222222222:stream/testStream, ResourceArnList=[arn:aws:s3:us-east-1:333333333333:stream/testStream], AccountIdEndpointMode=required, Region=cn-north-1}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: AccountIdEndpointMode is required but account endpoints are not supported in this partition\"\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"ResourceArn\": \"arn:aws:s3:us-west-2:222222222222:stream/testStream\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:s3:us-east-1:333333333333:stream/testStream\"\n                                ],\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"cn-north-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=, AccountIdEndpointMode=required, Region=cn-north-1}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: AccountIdEndpointMode is required but account endpoints are not supported in this partition\"\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"cn-north-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountId\": \"\",\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"required\"\n                                    },\n                                    \"operationName\": \"ListTables\"\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"\",\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"cn-north-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=true, UseDualStack=true, ResourceArn=arn:aws:dynamodb:us-east-1:222222222222:table/table_name, AccountIdEndpointMode=required, Region=cn-north-1}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: AccountIdEndpointMode is required and FIPS is enabled, but FIPS account endpoints are not supported\"\n                            },\n                            \"params\": {\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true,\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\",\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"cn-north-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=true, UseDualStack=false, ResourceArn=arn:aws:dynamodb:us-east-1:222222222222:table/table_name, AccountIdEndpointMode=required, Region=cn-north-1}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: AccountIdEndpointMode is required and FIPS is enabled, but FIPS account endpoints are not supported\"\n                            },\n                            \"params\": {\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false,\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\",\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"cn-north-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=true, ResourceArn=arn:aws:dynamodb:us-east-1:222222222222:table/table_name, AccountIdEndpointMode=required, Region=cn-north-1}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: AccountIdEndpointMode is required and DualStack is enabled, but DualStack account endpoints are not supported\"\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true,\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\",\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"cn-north-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, ResourceArn=arn:aws:dynamodb:us-east-1:222222222222:table/table_name, AccountIdEndpointMode=required, Region=cn-north-1}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: AccountIdEndpointMode is required but account endpoints are not supported in this partition\"\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"cn-north-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"required\"\n                                    },\n                                    \"operationName\": \"DescribeTable\",\n                                    \"operationParams\": {\n                                        \"TableName\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\",\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"cn-north-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, ResourceArn=arn:aws:dynamodb:us-west-2:222222222222:table/table_name, AccountIdEndpointMode=required, Region=cn-north-1}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: AccountIdEndpointMode is required but account endpoints are not supported in this partition\"\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"cn-north-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"required\"\n                                    },\n                                    \"operationName\": \"DescribeTable\",\n                                    \"operationParams\": {\n                                        \"TableName\": \"arn:aws:dynamodb:us-west-2:222222222222:table/table_name\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-west-2:222222222222:table/table_name\",\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"cn-north-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, ResourceArn=arn:aws:s3:us-west-2:222222222222:stream/testStream, AccountIdEndpointMode=required, Region=cn-north-1}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: AccountIdEndpointMode is required but account endpoints are not supported in this partition\"\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"cn-north-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"required\"\n                                    },\n                                    \"operationName\": \"DescribeTable\",\n                                    \"operationParams\": {\n                                        \"TableName\": \"arn:aws:s3:us-west-2:222222222222:stream/testStream\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"ResourceArn\": \"arn:aws:s3:us-west-2:222222222222:stream/testStream\",\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"cn-north-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, ResourceArn=, AccountIdEndpointMode=required, Region=cn-north-1}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: AccountIdEndpointMode is required but account endpoints are not supported in this partition\"\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"ResourceArn\": \"\",\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"cn-north-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=true, UseDualStack=true, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=required, Region=cn-north-1}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: AccountIdEndpointMode is required and FIPS is enabled, but FIPS account endpoints are not supported\"\n                            },\n                            \"params\": {\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true,\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"cn-north-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=true, UseDualStack=false, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=required, Region=cn-north-1}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: AccountIdEndpointMode is required and FIPS is enabled, but FIPS account endpoints are not supported\"\n                            },\n                            \"params\": {\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false,\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"cn-north-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=true, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=required, Region=cn-north-1}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: AccountIdEndpointMode is required and DualStack is enabled, but DualStack account endpoints are not supported\"\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true,\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"cn-north-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=required, Region=cn-north-1}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: AccountIdEndpointMode is required but account endpoints are not supported in this partition\"\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"cn-north-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"required\"\n                                    },\n                                    \"operationName\": \"BatchGetItem\",\n                                    \"operationParams\": {\n                                        \"RequestItems\": {\n                                            \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\": {\n                                                \"Keys\": [\n                                                    {\n                                                        \"pk\": {\n                                                            \"S\": \"value\"\n                                                        }\n                                                    }\n                                                ]\n                                            }\n                                        }\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"cn-north-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, ResourceArn=arn:aws:dynamodb:us-east-1:222222222222:table/table_name, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=required, Region=cn-north-1}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: AccountIdEndpointMode is required but account endpoints are not supported in this partition\"\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"cn-north-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountIdEndpointMode=required, Region=cn-north-1}\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: AccountIdEndpointMode is required but account endpoints are not supported in this partition\"\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountIdEndpointMode\": \"required\",\n                                \"Region\": \"cn-north-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=true, UseDualStack=true, AccountId=111111111111, AccountIdEndpointMode=disabled, Region=us-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb-fips.us-east-1.api.aws\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": true,\n                                        \"AWS::UseDualStack\": true,\n                                        \"AWS::Auth::AccountId\": \"111111111111\",\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"disabled\"\n                                    },\n                                    \"operationName\": \"ListTables\"\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true,\n                                \"AccountId\": \"111111111111\",\n                                \"AccountIdEndpointMode\": \"disabled\",\n                                \"Region\": \"us-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=true, UseDualStack=false, AccountId=111111111111, AccountIdEndpointMode=disabled, Region=us-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb-fips.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": true,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountId\": \"111111111111\",\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"disabled\"\n                                    },\n                                    \"operationName\": \"ListTables\"\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"AccountIdEndpointMode\": \"disabled\",\n                                \"Region\": \"us-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=true, AccountId=111111111111, AccountIdEndpointMode=disabled, Region=us-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.us-east-1.api.aws\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": true,\n                                        \"AWS::Auth::AccountId\": \"111111111111\",\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"disabled\"\n                                    },\n                                    \"operationName\": \"ListTables\"\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true,\n                                \"AccountId\": \"111111111111\",\n                                \"AccountIdEndpointMode\": \"disabled\",\n                                \"Region\": \"us-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, AccountIdEndpointMode=disabled, Region=us-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountId\": \"111111111111\",\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"disabled\"\n                                    },\n                                    \"operationName\": \"ListTables\"\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"AccountIdEndpointMode\": \"disabled\",\n                                \"Region\": \"us-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=disabled, Region=us-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountId\": \"111111111111\",\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"disabled\"\n                                    },\n                                    \"operationName\": \"BatchGetItem\",\n                                    \"operationParams\": {\n                                        \"RequestItems\": {\n                                            \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\": {\n                                                \"Keys\": [\n                                                    {\n                                                        \"pk\": {\n                                                            \"S\": \"value\"\n                                                        }\n                                                    }\n                                                ]\n                                            }\n                                        }\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"disabled\",\n                                \"Region\": \"us-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, ResourceArn=arn:aws:dynamodb:us-east-1:222222222222:table/table_name, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=disabled, Region=us-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"disabled\",\n                                \"Region\": \"us-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, ResourceArn=arn:aws:dynamodb:us-west-2:222222222222:table/table_name, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=disabled, Region=us-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-west-2:222222222222:table/table_name\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"disabled\",\n                                \"Region\": \"us-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, ResourceArn=arn:aws:s3:us-west-2:222222222222:stream/testStream, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=disabled, Region=us-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"ResourceArn\": \"arn:aws:s3:us-west-2:222222222222:stream/testStream\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"disabled\",\n                                \"Region\": \"us-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, ResourceArn=arn:aws:dynamodb:us-west-2:222222222222:table/table_name, ResourceArnList=[arn:aws:dynamodb:us-west-2:333333333333:table/table_name], AccountIdEndpointMode=disabled, Region=us-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-west-2:222222222222:table/table_name\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-west-2:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"disabled\",\n                                \"Region\": \"us-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, ResourceArn=arn:aws:s3:us-west-2:222222222222:stream/testStream, ResourceArnList=[arn:aws:s3:us-east-1:333333333333:stream/testStream], AccountIdEndpointMode=disabled, Region=us-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"ResourceArn\": \"arn:aws:s3:us-west-2:222222222222:stream/testStream\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:s3:us-east-1:333333333333:stream/testStream\"\n                                ],\n                                \"AccountIdEndpointMode\": \"disabled\",\n                                \"Region\": \"us-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=, AccountIdEndpointMode=disabled, Region=us-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountId\": \"\",\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"disabled\"\n                                    },\n                                    \"operationName\": \"ListTables\"\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"\",\n                                \"AccountIdEndpointMode\": \"disabled\",\n                                \"Region\": \"us-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=true, UseDualStack=true, ResourceArn=arn:aws:dynamodb:us-east-1:222222222222:table/table_name, AccountIdEndpointMode=disabled, Region=us-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb-fips.us-east-1.api.aws\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": true,\n                                        \"AWS::UseDualStack\": true,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"disabled\"\n                                    },\n                                    \"operationName\": \"DescribeTable\",\n                                    \"operationParams\": {\n                                        \"TableName\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true,\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\",\n                                \"AccountIdEndpointMode\": \"disabled\",\n                                \"Region\": \"us-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=true, UseDualStack=false, ResourceArn=arn:aws:dynamodb:us-east-1:222222222222:table/table_name, AccountIdEndpointMode=disabled, Region=us-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb-fips.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": true,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"disabled\"\n                                    },\n                                    \"operationName\": \"DescribeTable\",\n                                    \"operationParams\": {\n                                        \"TableName\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false,\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\",\n                                \"AccountIdEndpointMode\": \"disabled\",\n                                \"Region\": \"us-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=true, ResourceArn=arn:aws:dynamodb:us-east-1:222222222222:table/table_name, AccountIdEndpointMode=disabled, Region=us-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.us-east-1.api.aws\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": true,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"disabled\"\n                                    },\n                                    \"operationName\": \"DescribeTable\",\n                                    \"operationParams\": {\n                                        \"TableName\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true,\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\",\n                                \"AccountIdEndpointMode\": \"disabled\",\n                                \"Region\": \"us-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, ResourceArn=arn:aws:dynamodb:us-east-1:222222222222:table/table_name, AccountIdEndpointMode=disabled, Region=us-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"disabled\"\n                                    },\n                                    \"operationName\": \"DescribeTable\",\n                                    \"operationParams\": {\n                                        \"TableName\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\",\n                                \"AccountIdEndpointMode\": \"disabled\",\n                                \"Region\": \"us-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, ResourceArn=arn:aws:dynamodb:us-west-2:222222222222:table/table_name, AccountIdEndpointMode=disabled, Region=us-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"disabled\"\n                                    },\n                                    \"operationName\": \"DescribeTable\",\n                                    \"operationParams\": {\n                                        \"TableName\": \"arn:aws:dynamodb:us-west-2:222222222222:table/table_name\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-west-2:222222222222:table/table_name\",\n                                \"AccountIdEndpointMode\": \"disabled\",\n                                \"Region\": \"us-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, ResourceArn=arn:aws:s3:us-west-2:222222222222:stream/testStream, AccountIdEndpointMode=disabled, Region=us-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"disabled\"\n                                    },\n                                    \"operationName\": \"DescribeTable\",\n                                    \"operationParams\": {\n                                        \"TableName\": \"arn:aws:s3:us-west-2:222222222222:stream/testStream\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"ResourceArn\": \"arn:aws:s3:us-west-2:222222222222:stream/testStream\",\n                                \"AccountIdEndpointMode\": \"disabled\",\n                                \"Region\": \"us-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, ResourceArn=, AccountIdEndpointMode=disabled, Region=us-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"ResourceArn\": \"\",\n                                \"AccountIdEndpointMode\": \"disabled\",\n                                \"Region\": \"us-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=true, UseDualStack=true, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=disabled, Region=us-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb-fips.us-east-1.api.aws\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": true,\n                                        \"AWS::UseDualStack\": true,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"disabled\"\n                                    },\n                                    \"operationName\": \"BatchGetItem\",\n                                    \"operationParams\": {\n                                        \"RequestItems\": {\n                                            \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\": {\n                                                \"Keys\": [\n                                                    {\n                                                        \"pk\": {\n                                                            \"S\": \"value\"\n                                                        }\n                                                    }\n                                                ]\n                                            }\n                                        }\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true,\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"disabled\",\n                                \"Region\": \"us-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=true, UseDualStack=false, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=disabled, Region=us-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb-fips.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": true,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"disabled\"\n                                    },\n                                    \"operationName\": \"BatchGetItem\",\n                                    \"operationParams\": {\n                                        \"RequestItems\": {\n                                            \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\": {\n                                                \"Keys\": [\n                                                    {\n                                                        \"pk\": {\n                                                            \"S\": \"value\"\n                                                        }\n                                                    }\n                                                ]\n                                            }\n                                        }\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false,\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"disabled\",\n                                \"Region\": \"us-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=true, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=disabled, Region=us-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.us-east-1.api.aws\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": true,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"disabled\"\n                                    },\n                                    \"operationName\": \"BatchGetItem\",\n                                    \"operationParams\": {\n                                        \"RequestItems\": {\n                                            \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\": {\n                                                \"Keys\": [\n                                                    {\n                                                        \"pk\": {\n                                                            \"S\": \"value\"\n                                                        }\n                                                    }\n                                                ]\n                                            }\n                                        }\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true,\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"disabled\",\n                                \"Region\": \"us-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=disabled, Region=us-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"disabled\"\n                                    },\n                                    \"operationName\": \"BatchGetItem\",\n                                    \"operationParams\": {\n                                        \"RequestItems\": {\n                                            \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\": {\n                                                \"Keys\": [\n                                                    {\n                                                        \"pk\": {\n                                                            \"S\": \"value\"\n                                                        }\n                                                    }\n                                                ]\n                                            }\n                                        }\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"disabled\",\n                                \"Region\": \"us-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, ResourceArn=arn:aws:dynamodb:us-east-1:222222222222:table/table_name, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=disabled, Region=us-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"disabled\",\n                                \"Region\": \"us-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountIdEndpointMode=disabled, Region=us-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountIdEndpointMode\": \"disabled\",\n                                \"Region\": \"us-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=true, UseDualStack=true, AccountId=111111111111, AccountIdEndpointMode=preferred, Region=cn-north-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb-fips.cn-north-1.api.amazonwebservices.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true,\n                                \"AccountId\": \"111111111111\",\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"cn-north-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=true, UseDualStack=false, AccountId=111111111111, AccountIdEndpointMode=preferred, Region=cn-north-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb-fips.cn-north-1.amazonaws.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"cn-north-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=true, AccountId=111111111111, AccountIdEndpointMode=preferred, Region=cn-north-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.cn-north-1.api.amazonwebservices.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true,\n                                \"AccountId\": \"111111111111\",\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"cn-north-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, AccountIdEndpointMode=preferred, Region=cn-north-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.cn-north-1.amazonaws.com.cn\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"cn-north-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountId\": \"111111111111\",\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"preferred\"\n                                    },\n                                    \"operationName\": \"ListTables\"\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"cn-north-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=preferred, Region=cn-north-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.cn-north-1.amazonaws.com.cn\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"cn-north-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountId\": \"111111111111\",\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"preferred\"\n                                    },\n                                    \"operationName\": \"BatchGetItem\",\n                                    \"operationParams\": {\n                                        \"RequestItems\": {\n                                            \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\": {\n                                                \"Keys\": [\n                                                    {\n                                                        \"pk\": {\n                                                            \"S\": \"value\"\n                                                        }\n                                                    }\n                                                ]\n                                            }\n                                        }\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"cn-north-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, ResourceArn=arn:aws:dynamodb:us-east-1:222222222222:table/table_name, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=preferred, Region=cn-north-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.cn-north-1.amazonaws.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"cn-north-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, ResourceArn=arn:aws:dynamodb:us-west-2:222222222222:table/table_name, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=preferred, Region=cn-north-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.cn-north-1.amazonaws.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-west-2:222222222222:table/table_name\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"cn-north-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, ResourceArn=arn:aws:s3:us-west-2:222222222222:stream/testStream, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=preferred, Region=cn-north-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.cn-north-1.amazonaws.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"ResourceArn\": \"arn:aws:s3:us-west-2:222222222222:stream/testStream\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"cn-north-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, ResourceArn=arn:aws:dynamodb:us-west-2:222222222222:table/table_name, ResourceArnList=[arn:aws:dynamodb:us-west-2:333333333333:table/table_name], AccountIdEndpointMode=preferred, Region=cn-north-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.cn-north-1.amazonaws.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-west-2:222222222222:table/table_name\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-west-2:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"cn-north-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, ResourceArn=arn:aws:s3:us-west-2:222222222222:stream/testStream, ResourceArnList=[arn:aws:s3:us-east-1:333333333333:stream/testStream], AccountIdEndpointMode=preferred, Region=cn-north-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.cn-north-1.amazonaws.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"ResourceArn\": \"arn:aws:s3:us-west-2:222222222222:stream/testStream\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:s3:us-east-1:333333333333:stream/testStream\"\n                                ],\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"cn-north-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=, AccountIdEndpointMode=preferred, Region=cn-north-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.cn-north-1.amazonaws.com.cn\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"cn-north-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountId\": \"\",\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"preferred\"\n                                    },\n                                    \"operationName\": \"ListTables\"\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"\",\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"cn-north-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=true, UseDualStack=true, ResourceArn=arn:aws:dynamodb:us-east-1:222222222222:table/table_name, AccountIdEndpointMode=preferred, Region=cn-north-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb-fips.cn-north-1.api.amazonwebservices.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true,\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\",\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"cn-north-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=true, UseDualStack=false, ResourceArn=arn:aws:dynamodb:us-east-1:222222222222:table/table_name, AccountIdEndpointMode=preferred, Region=cn-north-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb-fips.cn-north-1.amazonaws.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false,\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\",\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"cn-north-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=true, ResourceArn=arn:aws:dynamodb:us-east-1:222222222222:table/table_name, AccountIdEndpointMode=preferred, Region=cn-north-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.cn-north-1.api.amazonwebservices.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true,\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\",\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"cn-north-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, ResourceArn=arn:aws:dynamodb:us-east-1:222222222222:table/table_name, AccountIdEndpointMode=preferred, Region=cn-north-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.cn-north-1.amazonaws.com.cn\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"cn-north-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"preferred\"\n                                    },\n                                    \"operationName\": \"DescribeTable\",\n                                    \"operationParams\": {\n                                        \"TableName\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\",\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"cn-north-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, ResourceArn=arn:aws:dynamodb:us-west-2:222222222222:table/table_name, AccountIdEndpointMode=preferred, Region=cn-north-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.cn-north-1.amazonaws.com.cn\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"cn-north-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"preferred\"\n                                    },\n                                    \"operationName\": \"DescribeTable\",\n                                    \"operationParams\": {\n                                        \"TableName\": \"arn:aws:dynamodb:us-west-2:222222222222:table/table_name\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-west-2:222222222222:table/table_name\",\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"cn-north-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, ResourceArn=arn:aws:s3:us-west-2:222222222222:stream/testStream, AccountIdEndpointMode=preferred, Region=cn-north-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.cn-north-1.amazonaws.com.cn\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"cn-north-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"preferred\"\n                                    },\n                                    \"operationName\": \"DescribeTable\",\n                                    \"operationParams\": {\n                                        \"TableName\": \"arn:aws:s3:us-west-2:222222222222:stream/testStream\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"ResourceArn\": \"arn:aws:s3:us-west-2:222222222222:stream/testStream\",\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"cn-north-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, ResourceArn=, AccountIdEndpointMode=preferred, Region=cn-north-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.cn-north-1.amazonaws.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"ResourceArn\": \"\",\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"cn-north-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=true, UseDualStack=true, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=preferred, Region=cn-north-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb-fips.cn-north-1.api.amazonwebservices.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true,\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"cn-north-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=true, UseDualStack=false, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=preferred, Region=cn-north-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb-fips.cn-north-1.amazonaws.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false,\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"cn-north-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=true, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=preferred, Region=cn-north-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.cn-north-1.api.amazonwebservices.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true,\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"cn-north-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=preferred, Region=cn-north-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.cn-north-1.amazonaws.com.cn\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"cn-north-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"preferred\"\n                                    },\n                                    \"operationName\": \"BatchGetItem\",\n                                    \"operationParams\": {\n                                        \"RequestItems\": {\n                                            \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\": {\n                                                \"Keys\": [\n                                                    {\n                                                        \"pk\": {\n                                                            \"S\": \"value\"\n                                                        }\n                                                    }\n                                                ]\n                                            }\n                                        }\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"cn-north-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, ResourceArn=arn:aws:dynamodb:us-east-1:222222222222:table/table_name, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=preferred, Region=cn-north-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.cn-north-1.amazonaws.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"cn-north-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountIdEndpointMode=preferred, Region=cn-north-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.cn-north-1.amazonaws.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"cn-north-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=true, UseDualStack=false, AccountId=111111111111, AccountIdEndpointMode=preferred, Region=us-iso-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb-fips.us-iso-east-1.c2s.ic.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-iso-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, AccountIdEndpointMode=preferred, Region=us-iso-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.us-iso-east-1.c2s.ic.gov\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-iso-east-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountId\": \"111111111111\",\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"preferred\"\n                                    },\n                                    \"operationName\": \"ListTables\"\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-iso-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=preferred, Region=us-iso-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.us-iso-east-1.c2s.ic.gov\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-iso-east-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountId\": \"111111111111\",\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"preferred\"\n                                    },\n                                    \"operationName\": \"BatchGetItem\",\n                                    \"operationParams\": {\n                                        \"RequestItems\": {\n                                            \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\": {\n                                                \"Keys\": [\n                                                    {\n                                                        \"pk\": {\n                                                            \"S\": \"value\"\n                                                        }\n                                                    }\n                                                ]\n                                            }\n                                        }\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-iso-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, ResourceArn=arn:aws:dynamodb:us-east-1:222222222222:table/table_name, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=preferred, Region=us-iso-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.us-iso-east-1.c2s.ic.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-iso-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, ResourceArn=arn:aws:dynamodb:us-west-2:222222222222:table/table_name, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=preferred, Region=us-iso-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.us-iso-east-1.c2s.ic.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-west-2:222222222222:table/table_name\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-iso-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, ResourceArn=arn:aws:s3:us-west-2:222222222222:stream/testStream, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=preferred, Region=us-iso-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.us-iso-east-1.c2s.ic.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"ResourceArn\": \"arn:aws:s3:us-west-2:222222222222:stream/testStream\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-iso-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, ResourceArn=arn:aws:dynamodb:us-west-2:222222222222:table/table_name, ResourceArnList=[arn:aws:dynamodb:us-west-2:333333333333:table/table_name], AccountIdEndpointMode=preferred, Region=us-iso-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.us-iso-east-1.c2s.ic.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-west-2:222222222222:table/table_name\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-west-2:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-iso-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, ResourceArn=arn:aws:s3:us-west-2:222222222222:stream/testStream, ResourceArnList=[arn:aws:s3:us-east-1:333333333333:stream/testStream], AccountIdEndpointMode=preferred, Region=us-iso-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.us-iso-east-1.c2s.ic.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"ResourceArn\": \"arn:aws:s3:us-west-2:222222222222:stream/testStream\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:s3:us-east-1:333333333333:stream/testStream\"\n                                ],\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-iso-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=, AccountIdEndpointMode=preferred, Region=us-iso-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.us-iso-east-1.c2s.ic.gov\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-iso-east-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountId\": \"\",\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"preferred\"\n                                    },\n                                    \"operationName\": \"ListTables\"\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"\",\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-iso-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=true, UseDualStack=false, ResourceArn=arn:aws:dynamodb:us-east-1:222222222222:table/table_name, AccountIdEndpointMode=preferred, Region=us-iso-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb-fips.us-iso-east-1.c2s.ic.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false,\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\",\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-iso-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, ResourceArn=arn:aws:dynamodb:us-east-1:222222222222:table/table_name, AccountIdEndpointMode=preferred, Region=us-iso-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.us-iso-east-1.c2s.ic.gov\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-iso-east-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"preferred\"\n                                    },\n                                    \"operationName\": \"DescribeTable\",\n                                    \"operationParams\": {\n                                        \"TableName\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\",\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-iso-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, ResourceArn=arn:aws:dynamodb:us-west-2:222222222222:table/table_name, AccountIdEndpointMode=preferred, Region=us-iso-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.us-iso-east-1.c2s.ic.gov\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-iso-east-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"preferred\"\n                                    },\n                                    \"operationName\": \"DescribeTable\",\n                                    \"operationParams\": {\n                                        \"TableName\": \"arn:aws:dynamodb:us-west-2:222222222222:table/table_name\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-west-2:222222222222:table/table_name\",\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-iso-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, ResourceArn=arn:aws:s3:us-west-2:222222222222:stream/testStream, AccountIdEndpointMode=preferred, Region=us-iso-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.us-iso-east-1.c2s.ic.gov\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-iso-east-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"preferred\"\n                                    },\n                                    \"operationName\": \"DescribeTable\",\n                                    \"operationParams\": {\n                                        \"TableName\": \"arn:aws:s3:us-west-2:222222222222:stream/testStream\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"ResourceArn\": \"arn:aws:s3:us-west-2:222222222222:stream/testStream\",\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-iso-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, ResourceArn=, AccountIdEndpointMode=preferred, Region=us-iso-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.us-iso-east-1.c2s.ic.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"ResourceArn\": \"\",\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-iso-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=true, UseDualStack=false, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=preferred, Region=us-iso-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb-fips.us-iso-east-1.c2s.ic.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false,\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-iso-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=preferred, Region=us-iso-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.us-iso-east-1.c2s.ic.gov\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-iso-east-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"preferred\"\n                                    },\n                                    \"operationName\": \"BatchGetItem\",\n                                    \"operationParams\": {\n                                        \"RequestItems\": {\n                                            \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\": {\n                                                \"Keys\": [\n                                                    {\n                                                        \"pk\": {\n                                                            \"S\": \"value\"\n                                                        }\n                                                    }\n                                                ]\n                                            }\n                                        }\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-iso-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, ResourceArn=arn:aws:dynamodb:us-east-1:222222222222:table/table_name, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=preferred, Region=us-iso-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.us-iso-east-1.c2s.ic.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-iso-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountIdEndpointMode=preferred, Region=us-iso-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.us-iso-east-1.c2s.ic.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-iso-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=true, UseDualStack=true, AccountId=111111111111, AccountIdEndpointMode=preferred, Region=us-gov-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb-fips.us-gov-east-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true,\n                                \"AccountId\": \"111111111111\",\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-gov-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=true, UseDualStack=false, AccountId=111111111111, AccountIdEndpointMode=preferred, Region=us-gov-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.us-gov-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-gov-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=true, AccountId=111111111111, AccountIdEndpointMode=preferred, Region=us-gov-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.us-gov-east-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true,\n                                \"AccountId\": \"111111111111\",\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-gov-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, AccountIdEndpointMode=preferred, Region=us-gov-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.us-gov-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-gov-east-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountId\": \"111111111111\",\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"preferred\"\n                                    },\n                                    \"operationName\": \"ListTables\"\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-gov-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=preferred, Region=us-gov-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.us-gov-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-gov-east-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountId\": \"111111111111\",\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"preferred\"\n                                    },\n                                    \"operationName\": \"BatchGetItem\",\n                                    \"operationParams\": {\n                                        \"RequestItems\": {\n                                            \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\": {\n                                                \"Keys\": [\n                                                    {\n                                                        \"pk\": {\n                                                            \"S\": \"value\"\n                                                        }\n                                                    }\n                                                ]\n                                            }\n                                        }\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-gov-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, ResourceArn=arn:aws:dynamodb:us-east-1:222222222222:table/table_name, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=preferred, Region=us-gov-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.us-gov-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-gov-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, ResourceArn=arn:aws:dynamodb:us-west-2:222222222222:table/table_name, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=preferred, Region=us-gov-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.us-gov-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-west-2:222222222222:table/table_name\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-gov-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, ResourceArn=arn:aws:s3:us-west-2:222222222222:stream/testStream, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=preferred, Region=us-gov-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.us-gov-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"ResourceArn\": \"arn:aws:s3:us-west-2:222222222222:stream/testStream\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-gov-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, ResourceArn=arn:aws:dynamodb:us-west-2:222222222222:table/table_name, ResourceArnList=[arn:aws:dynamodb:us-west-2:333333333333:table/table_name], AccountIdEndpointMode=preferred, Region=us-gov-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.us-gov-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-west-2:222222222222:table/table_name\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-west-2:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-gov-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=111111111111, ResourceArn=arn:aws:s3:us-west-2:222222222222:stream/testStream, ResourceArnList=[arn:aws:s3:us-east-1:333333333333:stream/testStream], AccountIdEndpointMode=preferred, Region=us-gov-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.us-gov-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"111111111111\",\n                                \"ResourceArn\": \"arn:aws:s3:us-west-2:222222222222:stream/testStream\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:s3:us-east-1:333333333333:stream/testStream\"\n                                ],\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-gov-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountId=, AccountIdEndpointMode=preferred, Region=us-gov-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.us-gov-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-gov-east-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountId\": \"\",\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"preferred\"\n                                    },\n                                    \"operationName\": \"ListTables\"\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountId\": \"\",\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-gov-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=true, UseDualStack=true, ResourceArn=arn:aws:dynamodb:us-east-1:222222222222:table/table_name, AccountIdEndpointMode=preferred, Region=us-gov-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb-fips.us-gov-east-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true,\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\",\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-gov-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=true, UseDualStack=false, ResourceArn=arn:aws:dynamodb:us-east-1:222222222222:table/table_name, AccountIdEndpointMode=preferred, Region=us-gov-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.us-gov-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false,\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\",\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-gov-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=true, ResourceArn=arn:aws:dynamodb:us-east-1:222222222222:table/table_name, AccountIdEndpointMode=preferred, Region=us-gov-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.us-gov-east-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true,\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\",\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-gov-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, ResourceArn=arn:aws:dynamodb:us-east-1:222222222222:table/table_name, AccountIdEndpointMode=preferred, Region=us-gov-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.us-gov-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-gov-east-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"preferred\"\n                                    },\n                                    \"operationName\": \"DescribeTable\",\n                                    \"operationParams\": {\n                                        \"TableName\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\",\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-gov-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, ResourceArn=arn:aws:dynamodb:us-west-2:222222222222:table/table_name, AccountIdEndpointMode=preferred, Region=us-gov-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.us-gov-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-gov-east-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"preferred\"\n                                    },\n                                    \"operationName\": \"DescribeTable\",\n                                    \"operationParams\": {\n                                        \"TableName\": \"arn:aws:dynamodb:us-west-2:222222222222:table/table_name\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-west-2:222222222222:table/table_name\",\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-gov-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, ResourceArn=arn:aws:s3:us-west-2:222222222222:stream/testStream, AccountIdEndpointMode=preferred, Region=us-gov-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.us-gov-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-gov-east-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"preferred\"\n                                    },\n                                    \"operationName\": \"DescribeTable\",\n                                    \"operationParams\": {\n                                        \"TableName\": \"arn:aws:s3:us-west-2:222222222222:stream/testStream\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"ResourceArn\": \"arn:aws:s3:us-west-2:222222222222:stream/testStream\",\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-gov-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, ResourceArn=, AccountIdEndpointMode=preferred, Region=us-gov-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.us-gov-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"ResourceArn\": \"\",\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-gov-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=true, UseDualStack=true, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=preferred, Region=us-gov-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb-fips.us-gov-east-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true,\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-gov-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=true, UseDualStack=false, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=preferred, Region=us-gov-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.us-gov-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false,\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-gov-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=true, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=preferred, Region=us-gov-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.us-gov-east-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true,\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-gov-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=preferred, Region=us-gov-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.us-gov-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-gov-east-1\",\n                                        \"AWS::UseFIPS\": false,\n                                        \"AWS::UseDualStack\": false,\n                                        \"AWS::Auth::AccountIdEndpointMode\": \"preferred\"\n                                    },\n                                    \"operationName\": \"BatchGetItem\",\n                                    \"operationParams\": {\n                                        \"RequestItems\": {\n                                            \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\": {\n                                                \"Keys\": [\n                                                    {\n                                                        \"pk\": {\n                                                            \"S\": \"value\"\n                                                        }\n                                                    }\n                                                ]\n                                            }\n                                        }\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-gov-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, ResourceArn=arn:aws:dynamodb:us-east-1:222222222222:table/table_name, ResourceArnList=[arn:aws:dynamodb:us-east-1:333333333333:table/table_name], AccountIdEndpointMode=preferred, Region=us-gov-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.us-gov-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"ResourceArn\": \"arn:aws:dynamodb:us-east-1:222222222222:table/table_name\",\n                                \"ResourceArnList\": [\n                                    \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\"\n                                ],\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-gov-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"{UseFIPS=false, UseDualStack=false, AccountIdEndpointMode=preferred, Region=us-gov-east-1}\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://dynamodb.us-gov-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"AccountIdEndpointMode\": \"preferred\",\n                                \"Region\": \"us-gov-east-1\"\n                            }\n                        }\n                    ],\n                    \"version\": \"1.0\"\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#EnableKinesisStreamingConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ApproximateCreationDateTimePrecision\": {\n                    \"target\": \"com.amazonaws.dynamodb#ApproximateCreationDateTimePrecision\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Toggle for the precision of Kinesis data stream timestamp. The values are either\\n                <code>MILLISECOND</code> or <code>MICROSECOND</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Enables setting the configuration for Kinesis Streaming.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#EnableKinesisStreamingDestination\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.dynamodb#KinesisStreamingDestinationInput\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.dynamodb#KinesisStreamingDestinationOutput\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InvalidEndpointException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ResourceInUseException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ResourceNotFoundException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#clientDiscoveredEndpoint\": {\n                    \"required\": false\n                },\n                \"smithy.api#documentation\": \"<p>Starts table data replication to the specified Kinesis data stream at a timestamp\\n            chosen during the enable workflow. If this operation doesn't return results immediately,\\n            use DescribeKinesisStreamingDestination to check if streaming to the Kinesis data stream\\n            is ACTIVE.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#Endpoint\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Address\": {\n                    \"target\": \"com.amazonaws.dynamodb#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>IP address of the endpoint.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"CachePeriodInMinutes\": {\n                    \"target\": \"com.amazonaws.dynamodb#Long\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>Endpoint cache time to live (TTL) value.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>An endpoint information details.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#Endpoints\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.dynamodb#Endpoint\"\n            }\n        },\n        \"com.amazonaws.dynamodb#ErrorCount\": {\n            \"type\": \"long\",\n            \"traits\": {\n                \"smithy.api#default\": 0,\n                \"smithy.api#range\": {\n                    \"min\": 0\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#ErrorMessage\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.dynamodb#ExceptionDescription\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.dynamodb#ExceptionName\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.dynamodb#ExecuteStatement\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.dynamodb#ExecuteStatementInput\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.dynamodb#ExecuteStatementOutput\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ConditionalCheckFailedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#DuplicateItemException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ItemCollectionSizeLimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ProvisionedThroughputExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#RequestLimitExceeded\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ThrottlingException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#TransactionConflictException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This operation allows you to perform reads and singleton writes on data stored in\\n            DynamoDB, using PartiQL.</p>\\n         <p>For PartiQL reads (<code>SELECT</code> statement), if the total number of processed\\n            items exceeds the maximum dataset size limit of 1 MB, the read stops and results are\\n            returned to the user as a <code>LastEvaluatedKey</code> value to continue the read in a\\n            subsequent operation. If the filter criteria in <code>WHERE</code> clause does not match\\n            any data, the read will return an empty result set.</p>\\n         <p>A single <code>SELECT</code> statement response can return up to the maximum number of\\n            items (if using the Limit parameter) or a maximum of 1 MB of data (and then apply any\\n            filtering to the results using <code>WHERE</code> clause). If\\n                <code>LastEvaluatedKey</code> is present in the response, you need to paginate the\\n            result set. If <code>NextToken</code> is present, you need to paginate the result set\\n            and include <code>NextToken</code>.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#ExecuteStatementInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Statement\": {\n                    \"target\": \"com.amazonaws.dynamodb#PartiQLStatement\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The PartiQL statement representing the operation to run.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Parameters\": {\n                    \"target\": \"com.amazonaws.dynamodb#PreparedStatementParameters\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The parameters for the PartiQL statement, if any.</p>\"\n                    }\n                },\n                \"ConsistentRead\": {\n                    \"target\": \"com.amazonaws.dynamodb#ConsistentRead\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The consistency of a read operation. If set to <code>true</code>, then a strongly\\n            consistent read is used; otherwise, an eventually consistent read is used.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.dynamodb#PartiQLNextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Set this value to get remaining results, if <code>NextToken</code> was returned in the\\n            statement response.</p>\"\n                    }\n                },\n                \"ReturnConsumedCapacity\": {\n                    \"target\": \"com.amazonaws.dynamodb#ReturnConsumedCapacity\"\n                },\n                \"Limit\": {\n                    \"target\": \"com.amazonaws.dynamodb#PositiveIntegerObject\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of items to evaluate (not necessarily the number of matching\\n            items). If DynamoDB processes the number of items up to the limit while processing the\\n            results, it stops the operation and returns the matching values up to that point, along\\n            with a key in <code>LastEvaluatedKey</code> to apply in a subsequent operation so you\\n            can pick up where you left off. Also, if the processed dataset size exceeds 1 MB before\\n            DynamoDB reaches this limit, it stops the operation and returns the matching values up\\n            to the limit, and a key in <code>LastEvaluatedKey</code> to apply in a subsequent\\n            operation to continue the operation. </p>\"\n                    }\n                },\n                \"ReturnValuesOnConditionCheckFailure\": {\n                    \"target\": \"com.amazonaws.dynamodb#ReturnValuesOnConditionCheckFailure\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An optional parameter that returns the item attributes for an\\n                <code>ExecuteStatement</code> operation that failed a condition check.</p>\\n         <p>There is no additional cost associated with requesting a return value aside from the\\n            small network and processing overhead of receiving a larger response. No read capacity\\n            units are consumed.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#ExecuteStatementOutput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Items\": {\n                    \"target\": \"com.amazonaws.dynamodb#ItemList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If a read operation was used, this property will contain the result of the read\\n            operation; a map of attribute names and their values. For the write operations this\\n            value will be empty.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.dynamodb#PartiQLNextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If the response of a read request exceeds the response payload limit DynamoDB will set\\n            this value in the response. If set, you can use that this value in the subsequent\\n            request to get the remaining results.</p>\"\n                    }\n                },\n                \"ConsumedCapacity\": {\n                    \"target\": \"com.amazonaws.dynamodb#ConsumedCapacity\"\n                },\n                \"LastEvaluatedKey\": {\n                    \"target\": \"com.amazonaws.dynamodb#Key\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The primary key of the item where the operation stopped, inclusive of the previous\\n            result set. Use this value to start a new operation, excluding this value in the new\\n            request. If <code>LastEvaluatedKey</code> is empty, then the \\\"last page\\\" of results has\\n            been processed and there is no more data to be retrieved. If\\n                <code>LastEvaluatedKey</code> is not empty, it does not necessarily mean that there\\n            is more data in the result set. The only way to know when you have reached the end of\\n            the result set is when <code>LastEvaluatedKey</code> is empty. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#ExecuteTransaction\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.dynamodb#ExecuteTransactionInput\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.dynamodb#ExecuteTransactionOutput\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.dynamodb#IdempotentParameterMismatchException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ProvisionedThroughputExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#RequestLimitExceeded\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ThrottlingException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#TransactionCanceledException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#TransactionInProgressException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This operation allows you to perform transactional reads or writes on data stored in\\n            DynamoDB, using PartiQL.</p>\\n         <note>\\n            <p>The entire transaction must consist of either read statements or write statements,\\n                you cannot mix both in one transaction. The EXISTS function is an exception and can\\n                be used to check the condition of specific attributes of the item in a similar\\n                manner to <code>ConditionCheck</code> in the <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/transaction-apis.html#transaction-apis-txwriteitems\\\">TransactWriteItems</a> API.</p>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#ExecuteTransactionInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransactStatements\": {\n                    \"target\": \"com.amazonaws.dynamodb#ParameterizedStatements\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The list of PartiQL statements representing the transaction to run.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ClientRequestToken\": {\n                    \"target\": \"com.amazonaws.dynamodb#ClientRequestToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Set this value to get remaining results, if <code>NextToken</code> was returned in the\\n            statement response.</p>\",\n                        \"smithy.api#idempotencyToken\": {}\n                    }\n                },\n                \"ReturnConsumedCapacity\": {\n                    \"target\": \"com.amazonaws.dynamodb#ReturnConsumedCapacity\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Determines the level of detail about either provisioned or on-demand throughput\\n            consumption that is returned in the response. For more information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_TransactGetItems.html\\\">TransactGetItems</a> and <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_TransactWriteItems.html\\\">TransactWriteItems</a>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#ExecuteTransactionOutput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Responses\": {\n                    \"target\": \"com.amazonaws.dynamodb#ItemResponseList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The response to a PartiQL transaction.</p>\"\n                    }\n                },\n                \"ConsumedCapacity\": {\n                    \"target\": \"com.amazonaws.dynamodb#ConsumedCapacityMultiple\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The capacity units consumed by the entire operation. The values of the list are\\n            ordered according to the ordering of the statements.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#ExpectedAttributeMap\": {\n            \"type\": \"map\",\n            \"key\": {\n                \"target\": \"com.amazonaws.dynamodb#AttributeName\"\n            },\n            \"value\": {\n                \"target\": \"com.amazonaws.dynamodb#ExpectedAttributeValue\"\n            }\n        },\n        \"com.amazonaws.dynamodb#ExpectedAttributeValue\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Value\": {\n                    \"target\": \"com.amazonaws.dynamodb#AttributeValue\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Represents the data for the expected attribute.</p>\\n         <p>Each attribute value is described as a name-value pair. The name is the data type, and\\n            the value is the data itself.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.NamingRulesDataTypes.html#HowItWorks.DataTypes\\\">Data Types</a> in the <i>Amazon DynamoDB Developer\\n                Guide</i>.</p>\"\n                    }\n                },\n                \"Exists\": {\n                    \"target\": \"com.amazonaws.dynamodb#BooleanObject\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Causes DynamoDB to evaluate the value before attempting a conditional\\n            operation:</p>\\n         <ul>\\n            <li>\\n               <p>If <code>Exists</code> is <code>true</code>, DynamoDB will check to\\n                    see if that attribute value already exists in the table. If it is found, then\\n                    the operation succeeds. If it is not found, the operation fails with a\\n                        <code>ConditionCheckFailedException</code>.</p>\\n            </li>\\n            <li>\\n               <p>If <code>Exists</code> is <code>false</code>, DynamoDB assumes that\\n                    the attribute value does not exist in the table. If in fact the value does not\\n                    exist, then the assumption is valid and the operation succeeds. If the value is\\n                    found, despite the assumption that it does not exist, the operation fails with a\\n                        <code>ConditionCheckFailedException</code>.</p>\\n            </li>\\n         </ul>\\n         <p>The default setting for <code>Exists</code> is <code>true</code>. If you supply a\\n                <code>Value</code> all by itself, DynamoDB assumes the attribute exists:\\n            You don't have to set <code>Exists</code> to <code>true</code>, because it is\\n            implied.</p>\\n         <p>DynamoDB returns a <code>ValidationException</code> if:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>Exists</code> is <code>true</code> but there is no <code>Value</code> to\\n                    check. (You expect a value to exist, but don't specify what that value\\n                    is.)</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>Exists</code> is <code>false</code> but you also provide a\\n                        <code>Value</code>. (You cannot expect an attribute to have a value, while\\n                    also expecting it not to exist.)</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"ComparisonOperator\": {\n                    \"target\": \"com.amazonaws.dynamodb#ComparisonOperator\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A comparator for evaluating attributes in the <code>AttributeValueList</code>. For\\n            example, equals, greater than, less than, etc.</p>\\n         <p>The following comparison operators are available:</p>\\n         <p>\\n            <code>EQ | NE | LE | LT | GE | GT | NOT_NULL | NULL | CONTAINS | NOT_CONTAINS |\\n                BEGINS_WITH | IN | BETWEEN</code>\\n         </p>\\n         <p>The following are descriptions of each comparison operator.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>EQ</code> : Equal. <code>EQ</code> is supported for all data types,\\n                    including lists and maps.</p>\\n               <p>\\n                  <code>AttributeValueList</code> can contain only one <code>AttributeValue</code>\\n                    element of type String, Number, Binary, String Set, Number Set, or Binary Set.\\n                    If an item contains an <code>AttributeValue</code> element of a different type\\n                    than the one provided in the request, the value does not match. For example,\\n                        <code>{\\\"S\\\":\\\"6\\\"}</code> does not equal <code>{\\\"N\\\":\\\"6\\\"}</code>. Also,\\n                        <code>{\\\"N\\\":\\\"6\\\"}</code> does not equal <code>{\\\"NS\\\":[\\\"6\\\", \\\"2\\\",\\n                    \\\"1\\\"]}</code>.</p>\\n               <p></p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>NE</code> : Not equal. <code>NE</code> is supported for all data types,\\n                    including lists and maps.</p>\\n               <p>\\n                  <code>AttributeValueList</code> can contain only one <code>AttributeValue</code>\\n                    of type String, Number, Binary, String Set, Number Set, or Binary Set. If an\\n                    item contains an <code>AttributeValue</code> of a different type than the one\\n                    provided in the request, the value does not match. For example,\\n                        <code>{\\\"S\\\":\\\"6\\\"}</code> does not equal <code>{\\\"N\\\":\\\"6\\\"}</code>. Also,\\n                        <code>{\\\"N\\\":\\\"6\\\"}</code> does not equal <code>{\\\"NS\\\":[\\\"6\\\", \\\"2\\\",\\n                    \\\"1\\\"]}</code>.</p>\\n               <p></p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>LE</code> : Less than or equal. </p>\\n               <p>\\n                  <code>AttributeValueList</code> can contain only one <code>AttributeValue</code>\\n                    element of type String, Number, or Binary (not a set type). If an item contains\\n                    an <code>AttributeValue</code> element of a different type than the one provided\\n                    in the request, the value does not match. For example, <code>{\\\"S\\\":\\\"6\\\"}</code>\\n                    does not equal <code>{\\\"N\\\":\\\"6\\\"}</code>. Also, <code>{\\\"N\\\":\\\"6\\\"}</code> does not\\n                    compare to <code>{\\\"NS\\\":[\\\"6\\\", \\\"2\\\", \\\"1\\\"]}</code>.</p>\\n               <p></p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>LT</code> : Less than. </p>\\n               <p>\\n                  <code>AttributeValueList</code> can contain only one <code>AttributeValue</code>\\n                    of type String, Number, or Binary (not a set type). If an item contains an\\n                        <code>AttributeValue</code> element of a different type than the one\\n                    provided in the request, the value does not match. For example,\\n                        <code>{\\\"S\\\":\\\"6\\\"}</code> does not equal <code>{\\\"N\\\":\\\"6\\\"}</code>. Also,\\n                        <code>{\\\"N\\\":\\\"6\\\"}</code> does not compare to <code>{\\\"NS\\\":[\\\"6\\\", \\\"2\\\",\\n                        \\\"1\\\"]}</code>.</p>\\n               <p></p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>GE</code> : Greater than or equal. </p>\\n               <p>\\n                  <code>AttributeValueList</code> can contain only one <code>AttributeValue</code>\\n                    element of type String, Number, or Binary (not a set type). If an item contains\\n                    an <code>AttributeValue</code> element of a different type than the one provided\\n                    in the request, the value does not match. For example, <code>{\\\"S\\\":\\\"6\\\"}</code>\\n                    does not equal <code>{\\\"N\\\":\\\"6\\\"}</code>. Also, <code>{\\\"N\\\":\\\"6\\\"}</code> does not\\n                    compare to <code>{\\\"NS\\\":[\\\"6\\\", \\\"2\\\", \\\"1\\\"]}</code>.</p>\\n               <p></p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>GT</code> : Greater than. </p>\\n               <p>\\n                  <code>AttributeValueList</code> can contain only one <code>AttributeValue</code>\\n                    element of type String, Number, or Binary (not a set type). If an item contains\\n                    an <code>AttributeValue</code> element of a different type than the one provided\\n                    in the request, the value does not match. For example, <code>{\\\"S\\\":\\\"6\\\"}</code>\\n                    does not equal <code>{\\\"N\\\":\\\"6\\\"}</code>. Also, <code>{\\\"N\\\":\\\"6\\\"}</code> does not\\n                    compare to <code>{\\\"NS\\\":[\\\"6\\\", \\\"2\\\", \\\"1\\\"]}</code>.</p>\\n               <p></p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>NOT_NULL</code> : The attribute exists. <code>NOT_NULL</code> is supported\\n                    for all data types, including lists and maps.</p>\\n               <note>\\n                  <p>This operator tests for the existence of an attribute, not its data type.\\n                        If the data type of attribute \\\"<code>a</code>\\\" is null, and you evaluate it\\n                        using <code>NOT_NULL</code>, the result is a Boolean <code>true</code>. This\\n                        result is because the attribute \\\"<code>a</code>\\\" exists; its data type is\\n                        not relevant to the <code>NOT_NULL</code> comparison operator.</p>\\n               </note>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>NULL</code> : The attribute does not exist. <code>NULL</code> is supported\\n                    for all data types, including lists and maps.</p>\\n               <note>\\n                  <p>This operator tests for the nonexistence of an attribute, not its data\\n                        type. If the data type of attribute \\\"<code>a</code>\\\" is null, and you\\n                        evaluate it using <code>NULL</code>, the result is a Boolean\\n                            <code>false</code>. This is because the attribute \\\"<code>a</code>\\\"\\n                        exists; its data type is not relevant to the <code>NULL</code> comparison\\n                        operator.</p>\\n               </note>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>CONTAINS</code> : Checks for a subsequence, or value in a set.</p>\\n               <p>\\n                  <code>AttributeValueList</code> can contain only one <code>AttributeValue</code>\\n                    element of type String, Number, or Binary (not a set type). If the target\\n                    attribute of the comparison is of type String, then the operator checks for a\\n                    substring match. If the target attribute of the comparison is of type Binary,\\n                    then the operator looks for a subsequence of the target that matches the input.\\n                    If the target attribute of the comparison is a set (\\\"<code>SS</code>\\\",\\n                        \\\"<code>NS</code>\\\", or \\\"<code>BS</code>\\\"), then the operator evaluates to\\n                    true if it finds an exact match with any member of the set.</p>\\n               <p>CONTAINS is supported for lists: When evaluating \\\"<code>a CONTAINS b</code>\\\",\\n                        \\\"<code>a</code>\\\" can be a list; however, \\\"<code>b</code>\\\" cannot be a set, a\\n                    map, or a list.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>NOT_CONTAINS</code> : Checks for absence of a subsequence, or absence of a\\n                    value in a set.</p>\\n               <p>\\n                  <code>AttributeValueList</code> can contain only one <code>AttributeValue</code>\\n                    element of type String, Number, or Binary (not a set type). If the target\\n                    attribute of the comparison is a String, then the operator checks for the\\n                    absence of a substring match. If the target attribute of the comparison is\\n                    Binary, then the operator checks for the absence of a subsequence of the target\\n                    that matches the input. If the target attribute of the comparison is a set\\n                        (\\\"<code>SS</code>\\\", \\\"<code>NS</code>\\\", or \\\"<code>BS</code>\\\"), then the\\n                    operator evaluates to true if it <i>does not</i> find an exact\\n                    match with any member of the set.</p>\\n               <p>NOT_CONTAINS is supported for lists: When evaluating \\\"<code>a NOT CONTAINS\\n                        b</code>\\\", \\\"<code>a</code>\\\" can be a list; however, \\\"<code>b</code>\\\" cannot\\n                    be a set, a map, or a list.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>BEGINS_WITH</code> : Checks for a prefix. </p>\\n               <p>\\n                  <code>AttributeValueList</code> can contain only one <code>AttributeValue</code>\\n                    of type String or Binary (not a Number or a set type). The target attribute of\\n                    the comparison must be of type String or Binary (not a Number or a set\\n                    type).</p>\\n               <p></p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>IN</code> : Checks for matching elements in a list.</p>\\n               <p>\\n                  <code>AttributeValueList</code> can contain one or more\\n                        <code>AttributeValue</code> elements of type String, Number, or Binary.\\n                    These attributes are compared against an existing attribute of an item. If any\\n                    elements of the input are equal to the item attribute, the expression evaluates\\n                    to true.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>BETWEEN</code> : Greater than or equal to the first value, and less than\\n                    or equal to the second value. </p>\\n               <p>\\n                  <code>AttributeValueList</code> must contain two <code>AttributeValue</code>\\n                    elements of the same type, either String, Number, or Binary (not a set type). A\\n                    target attribute matches if the target value is greater than, or equal to, the\\n                    first element and less than, or equal to, the second element. If an item\\n                    contains an <code>AttributeValue</code> element of a different type than the one\\n                    provided in the request, the value does not match. For example,\\n                        <code>{\\\"S\\\":\\\"6\\\"}</code> does not compare to <code>{\\\"N\\\":\\\"6\\\"}</code>. Also,\\n                        <code>{\\\"N\\\":\\\"6\\\"}</code> does not compare to <code>{\\\"NS\\\":[\\\"6\\\", \\\"2\\\",\\n                        \\\"1\\\"]}</code>\\n               </p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"AttributeValueList\": {\n                    \"target\": \"com.amazonaws.dynamodb#AttributeValueList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more values to evaluate against the supplied attribute. The number of values in\\n            the list depends on the <code>ComparisonOperator</code> being used.</p>\\n         <p>For type Number, value comparisons are numeric.</p>\\n         <p>String value comparisons for greater than, equals, or less than are based on ASCII\\n            character code values. For example, <code>a</code> is greater than <code>A</code>, and\\n                <code>a</code> is greater than <code>B</code>. For a list of code values, see <a href=\\\"http://en.wikipedia.org/wiki/ASCII#ASCII_printable_characters\\\">http://en.wikipedia.org/wiki/ASCII#ASCII_printable_characters</a>.</p>\\n         <p>For Binary, DynamoDB treats each byte of the binary data as unsigned when it\\n            compares binary values.</p>\\n         <p>For information on specifying data types in JSON, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DataFormat.html\\\">JSON Data Format</a>\\n            in the <i>Amazon DynamoDB Developer Guide</i>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents a condition to be compared with an attribute value. This condition can be\\n            used with <code>DeleteItem</code>, <code>PutItem</code>, or <code>UpdateItem</code>\\n            operations; if the comparison evaluates to true, the operation succeeds; if not, the\\n            operation fails. You can use <code>ExpectedAttributeValue</code> in one of two different\\n            ways:</p>\\n         <ul>\\n            <li>\\n               <p>Use <code>AttributeValueList</code> to specify one or more values to compare\\n                    against an attribute. Use <code>ComparisonOperator</code> to specify how you\\n                    want to perform the comparison. If the comparison evaluates to true, then the\\n                    conditional operation succeeds.</p>\\n            </li>\\n            <li>\\n               <p>Use <code>Value</code> to specify a value that DynamoDB will compare against\\n                    an attribute. If the values match, then <code>ExpectedAttributeValue</code>\\n                    evaluates to true and the conditional operation succeeds. Optionally, you can\\n                    also set <code>Exists</code> to false, indicating that you <i>do\\n                        not</i> expect to find the attribute value in the table. In this\\n                    case, the conditional operation succeeds only if the comparison evaluates to\\n                    false.</p>\\n            </li>\\n         </ul>\\n         <p>\\n            <code>Value</code> and <code>Exists</code> are incompatible with\\n                <code>AttributeValueList</code> and <code>ComparisonOperator</code>. Note that if\\n            you use both sets of parameters at once, DynamoDB will return a\\n                <code>ValidationException</code> exception.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#ExportArn\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 37,\n                    \"max\": 1024\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#ExportConflictException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.dynamodb#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>There was a conflict when writing to the specified S3 bucket.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.dynamodb#ExportDescription\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ExportArn\": {\n                    \"target\": \"com.amazonaws.dynamodb#ExportArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the table export.</p>\"\n                    }\n                },\n                \"ExportStatus\": {\n                    \"target\": \"com.amazonaws.dynamodb#ExportStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Export can be in one of the following states: IN_PROGRESS, COMPLETED, or\\n            FAILED.</p>\"\n                    }\n                },\n                \"StartTime\": {\n                    \"target\": \"com.amazonaws.dynamodb#ExportStartTime\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time at which the export task began.</p>\"\n                    }\n                },\n                \"EndTime\": {\n                    \"target\": \"com.amazonaws.dynamodb#ExportEndTime\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time at which the export task completed.</p>\"\n                    }\n                },\n                \"ExportManifest\": {\n                    \"target\": \"com.amazonaws.dynamodb#ExportManifest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the manifest file for the export task.</p>\"\n                    }\n                },\n                \"TableArn\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the table that was exported.</p>\"\n                    }\n                },\n                \"TableId\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Unique ID of the table that was exported.</p>\"\n                    }\n                },\n                \"ExportTime\": {\n                    \"target\": \"com.amazonaws.dynamodb#ExportTime\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Point in time from which table data was exported.</p>\"\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.dynamodb#ClientToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The client token that was provided for the export task. A client token makes calls to\\n                <code>ExportTableToPointInTimeInput</code> idempotent, meaning that multiple\\n            identical calls have the same effect as one single call.</p>\"\n                    }\n                },\n                \"S3Bucket\": {\n                    \"target\": \"com.amazonaws.dynamodb#S3Bucket\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the Amazon S3 bucket containing the export.</p>\"\n                    }\n                },\n                \"S3BucketOwner\": {\n                    \"target\": \"com.amazonaws.dynamodb#S3BucketOwner\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the Amazon Web Services account that owns the bucket containing the\\n            export.</p>\"\n                    }\n                },\n                \"S3Prefix\": {\n                    \"target\": \"com.amazonaws.dynamodb#S3Prefix\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon S3 bucket prefix used as the file name and path of the exported\\n            snapshot.</p>\"\n                    }\n                },\n                \"S3SseAlgorithm\": {\n                    \"target\": \"com.amazonaws.dynamodb#S3SseAlgorithm\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Type of encryption used on the bucket where export data is stored. Valid values for\\n                <code>S3SseAlgorithm</code> are:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>AES256</code> - server-side encryption with Amazon S3 managed\\n                    keys</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>KMS</code> - server-side encryption with KMS managed\\n                    keys</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"S3SseKmsKeyId\": {\n                    \"target\": \"com.amazonaws.dynamodb#S3SseKmsKeyId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the KMS managed key used to encrypt the S3 bucket where\\n            export data is stored (if applicable).</p>\"\n                    }\n                },\n                \"FailureCode\": {\n                    \"target\": \"com.amazonaws.dynamodb#FailureCode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Status code for the result of the failed export.</p>\"\n                    }\n                },\n                \"FailureMessage\": {\n                    \"target\": \"com.amazonaws.dynamodb#FailureMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Export failure reason description.</p>\"\n                    }\n                },\n                \"ExportFormat\": {\n                    \"target\": \"com.amazonaws.dynamodb#ExportFormat\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The format of the exported data. Valid values for <code>ExportFormat</code> are\\n                <code>DYNAMODB_JSON</code> or <code>ION</code>.</p>\"\n                    }\n                },\n                \"BilledSizeBytes\": {\n                    \"target\": \"com.amazonaws.dynamodb#BilledSizeBytes\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The billable size of the table export.</p>\"\n                    }\n                },\n                \"ItemCount\": {\n                    \"target\": \"com.amazonaws.dynamodb#ItemCount\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of items exported.</p>\"\n                    }\n                },\n                \"ExportType\": {\n                    \"target\": \"com.amazonaws.dynamodb#ExportType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of export that was performed. Valid values are <code>FULL_EXPORT</code> or\\n                <code>INCREMENTAL_EXPORT</code>.</p>\"\n                    }\n                },\n                \"IncrementalExportSpecification\": {\n                    \"target\": \"com.amazonaws.dynamodb#IncrementalExportSpecification\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Optional object containing the parameters specific to an incremental export.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents the properties of the exported table.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#ExportEndTime\": {\n            \"type\": \"timestamp\"\n        },\n        \"com.amazonaws.dynamodb#ExportFormat\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"DYNAMODB_JSON\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DYNAMODB_JSON\"\n                    }\n                },\n                \"ION\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ION\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#ExportFromTime\": {\n            \"type\": \"timestamp\"\n        },\n        \"com.amazonaws.dynamodb#ExportManifest\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.dynamodb#ExportNextToken\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.dynamodb#ExportNotFoundException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.dynamodb#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The specified export was not found.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.dynamodb#ExportStartTime\": {\n            \"type\": \"timestamp\"\n        },\n        \"com.amazonaws.dynamodb#ExportStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"IN_PROGRESS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"IN_PROGRESS\"\n                    }\n                },\n                \"COMPLETED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"COMPLETED\"\n                    }\n                },\n                \"FAILED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"FAILED\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#ExportSummaries\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.dynamodb#ExportSummary\"\n            }\n        },\n        \"com.amazonaws.dynamodb#ExportSummary\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ExportArn\": {\n                    \"target\": \"com.amazonaws.dynamodb#ExportArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the export.</p>\"\n                    }\n                },\n                \"ExportStatus\": {\n                    \"target\": \"com.amazonaws.dynamodb#ExportStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Export can be in one of the following states: IN_PROGRESS, COMPLETED, or\\n            FAILED.</p>\"\n                    }\n                },\n                \"ExportType\": {\n                    \"target\": \"com.amazonaws.dynamodb#ExportType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of export that was performed. Valid values are <code>FULL_EXPORT</code> or\\n                <code>INCREMENTAL_EXPORT</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Summary information about an export task.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#ExportTableToPointInTime\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.dynamodb#ExportTableToPointInTimeInput\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.dynamodb#ExportTableToPointInTimeOutput\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ExportConflictException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InvalidExportTimeException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#PointInTimeRecoveryUnavailableException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#TableNotFoundException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Exports table data to an S3 bucket. The table must have point in time recovery\\n            enabled, and you can export data from any time within the point in time recovery\\n            window.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#ExportTableToPointInTimeInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TableArn\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) associated with the table to export.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"ResourceArn\"\n                        }\n                    }\n                },\n                \"ExportTime\": {\n                    \"target\": \"com.amazonaws.dynamodb#ExportTime\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Time in the past from which to export table data, counted in seconds from the start of\\n            the Unix epoch. The table export will be a snapshot of the table's state at this point\\n            in time.</p>\"\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.dynamodb#ClientToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Providing a <code>ClientToken</code> makes the call to\\n                <code>ExportTableToPointInTimeInput</code> idempotent, meaning that multiple\\n            identical calls have the same effect as one single call.</p>\\n         <p>A client token is valid for 8 hours after the first request that uses it is completed.\\n            After 8 hours, any request with the same client token is treated as a new request. Do\\n            not resubmit the same request with the same client token for more than 8 hours, or the\\n            result might not be idempotent.</p>\\n         <p>If you submit a request with the same client token but a change in other parameters\\n            within the 8-hour idempotency window, DynamoDB returns an\\n                <code>ImportConflictException</code>.</p>\",\n                        \"smithy.api#idempotencyToken\": {}\n                    }\n                },\n                \"S3Bucket\": {\n                    \"target\": \"com.amazonaws.dynamodb#S3Bucket\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the Amazon S3 bucket to export the snapshot to.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"S3BucketOwner\": {\n                    \"target\": \"com.amazonaws.dynamodb#S3BucketOwner\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the Amazon Web Services account that owns the bucket the export will be\\n            stored in.</p>\\n         <note>\\n            <p>S3BucketOwner is a required parameter when exporting to a S3 bucket in another\\n                account.</p>\\n         </note>\"\n                    }\n                },\n                \"S3Prefix\": {\n                    \"target\": \"com.amazonaws.dynamodb#S3Prefix\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon S3 bucket prefix to use as the file name and path of the exported\\n            snapshot.</p>\"\n                    }\n                },\n                \"S3SseAlgorithm\": {\n                    \"target\": \"com.amazonaws.dynamodb#S3SseAlgorithm\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Type of encryption used on the bucket where export data will be stored. Valid values\\n            for <code>S3SseAlgorithm</code> are:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>AES256</code> - server-side encryption with Amazon S3 managed\\n                    keys</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>KMS</code> - server-side encryption with KMS managed\\n                    keys</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"S3SseKmsKeyId\": {\n                    \"target\": \"com.amazonaws.dynamodb#S3SseKmsKeyId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the KMS managed key used to encrypt the S3 bucket where\\n            export data will be stored (if applicable).</p>\"\n                    }\n                },\n                \"ExportFormat\": {\n                    \"target\": \"com.amazonaws.dynamodb#ExportFormat\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The format for the exported data. Valid values for <code>ExportFormat</code> are\\n                <code>DYNAMODB_JSON</code> or <code>ION</code>.</p>\"\n                    }\n                },\n                \"ExportType\": {\n                    \"target\": \"com.amazonaws.dynamodb#ExportType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Choice of whether to execute as a full export or incremental export. Valid values are\\n            FULL_EXPORT or INCREMENTAL_EXPORT. The default value is FULL_EXPORT. If\\n            INCREMENTAL_EXPORT is provided, the IncrementalExportSpecification must also be\\n            used.</p>\"\n                    }\n                },\n                \"IncrementalExportSpecification\": {\n                    \"target\": \"com.amazonaws.dynamodb#IncrementalExportSpecification\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Optional object containing the parameters specific to an incremental export.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#ExportTableToPointInTimeOutput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ExportDescription\": {\n                    \"target\": \"com.amazonaws.dynamodb#ExportDescription\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Contains a description of the table export.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#ExportTime\": {\n            \"type\": \"timestamp\"\n        },\n        \"com.amazonaws.dynamodb#ExportToTime\": {\n            \"type\": \"timestamp\"\n        },\n        \"com.amazonaws.dynamodb#ExportType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"FULL_EXPORT\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"FULL_EXPORT\"\n                    }\n                },\n                \"INCREMENTAL_EXPORT\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"INCREMENTAL_EXPORT\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#ExportViewType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"NEW_IMAGE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"NEW_IMAGE\"\n                    }\n                },\n                \"NEW_AND_OLD_IMAGES\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"NEW_AND_OLD_IMAGES\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#ExpressionAttributeNameMap\": {\n            \"type\": \"map\",\n            \"key\": {\n                \"target\": \"com.amazonaws.dynamodb#ExpressionAttributeNameVariable\"\n            },\n            \"value\": {\n                \"target\": \"com.amazonaws.dynamodb#AttributeName\"\n            }\n        },\n        \"com.amazonaws.dynamodb#ExpressionAttributeNameVariable\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.dynamodb#ExpressionAttributeValueMap\": {\n            \"type\": \"map\",\n            \"key\": {\n                \"target\": \"com.amazonaws.dynamodb#ExpressionAttributeValueVariable\"\n            },\n            \"value\": {\n                \"target\": \"com.amazonaws.dynamodb#AttributeValue\"\n            }\n        },\n        \"com.amazonaws.dynamodb#ExpressionAttributeValueVariable\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.dynamodb#FailureCode\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.dynamodb#FailureException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ExceptionName\": {\n                    \"target\": \"com.amazonaws.dynamodb#ExceptionName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Exception name.</p>\"\n                    }\n                },\n                \"ExceptionDescription\": {\n                    \"target\": \"com.amazonaws.dynamodb#ExceptionDescription\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Description of the failure.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents a failure a contributor insights operation.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#FailureMessage\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.dynamodb#FilterConditionMap\": {\n            \"type\": \"map\",\n            \"key\": {\n                \"target\": \"com.amazonaws.dynamodb#AttributeName\"\n            },\n            \"value\": {\n                \"target\": \"com.amazonaws.dynamodb#Condition\"\n            }\n        },\n        \"com.amazonaws.dynamodb#Get\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Key\": {\n                    \"target\": \"com.amazonaws.dynamodb#Key\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A map of attribute names to <code>AttributeValue</code> objects that specifies the\\n            primary key of the item to retrieve.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TableName\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the table from which to retrieve the specified item. You can also provide\\n            the Amazon Resource Name (ARN) of the table in this parameter.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ProjectionExpression\": {\n                    \"target\": \"com.amazonaws.dynamodb#ProjectionExpression\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A string that identifies one or more attributes of the specified item to retrieve from\\n            the table. The attributes in the expression must be separated by commas. If no attribute\\n            names are specified, then all attributes of the specified item are returned. If any of\\n            the requested attributes are not found, they do not appear in the result.</p>\"\n                    }\n                },\n                \"ExpressionAttributeNames\": {\n                    \"target\": \"com.amazonaws.dynamodb#ExpressionAttributeNameMap\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more substitution tokens for attribute names in the ProjectionExpression\\n            parameter.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Specifies an item and related attribute values to retrieve in a\\n                <code>TransactGetItem</code> object.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#GetItem\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.dynamodb#GetItemInput\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.dynamodb#GetItemOutput\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InvalidEndpointException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ProvisionedThroughputExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#RequestLimitExceeded\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ThrottlingException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#clientDiscoveredEndpoint\": {\n                    \"required\": false\n                },\n                \"smithy.api#documentation\": \"<p>The <code>GetItem</code> operation returns a set of attributes for the item with the\\n            given primary key. If there is no matching item, <code>GetItem</code> does not return\\n            any data and there will be no <code>Item</code> element in the response.</p>\\n         <p>\\n            <code>GetItem</code> provides an eventually consistent read by default. If your\\n            application requires a strongly consistent read, set <code>ConsistentRead</code> to\\n                <code>true</code>. Although a strongly consistent read might take more time than an\\n            eventually consistent read, it always returns the last updated value.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To read an item from a table\",\n                        \"documentation\": \"This example retrieves an item from the Music table. The table has a partition key and a sort key (Artist and SongTitle), so you must specify both of these attributes.\",\n                        \"input\": {\n                            \"TableName\": \"Music\",\n                            \"Key\": {\n                                \"Artist\": {\n                                    \"S\": \"Acme Band\"\n                                },\n                                \"SongTitle\": {\n                                    \"S\": \"Happy Day\"\n                                }\n                            }\n                        },\n                        \"output\": {\n                            \"Item\": {\n                                \"AlbumTitle\": {\n                                    \"S\": \"Songs About Life\"\n                                },\n                                \"SongTitle\": {\n                                    \"S\": \"Happy Day\"\n                                },\n                                \"Artist\": {\n                                    \"S\": \"Acme Band\"\n                                }\n                            }\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.dynamodb#GetItemInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TableName\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the table containing the requested item. You can also provide the\\n            Amazon Resource Name (ARN) of the table in this parameter.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"ResourceArn\"\n                        }\n                    }\n                },\n                \"Key\": {\n                    \"target\": \"com.amazonaws.dynamodb#Key\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A map of attribute names to <code>AttributeValue</code> objects, representing the\\n            primary key of the item to retrieve.</p>\\n         <p>For the primary key, you must provide all of the attributes. For example, with a\\n            simple primary key, you only need to provide a value for the partition key. For a\\n            composite primary key, you must provide values for both the partition key and the sort\\n            key.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"AttributesToGet\": {\n                    \"target\": \"com.amazonaws.dynamodb#AttributeNameList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>This is a legacy parameter. Use <code>ProjectionExpression</code> instead. For more\\n            information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/LegacyConditionalParameters.AttributesToGet.html\\\">AttributesToGet</a> in the <i>Amazon DynamoDB Developer\\n            Guide</i>.</p>\"\n                    }\n                },\n                \"ConsistentRead\": {\n                    \"target\": \"com.amazonaws.dynamodb#ConsistentRead\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Determines the read consistency model: If set to <code>true</code>, then the operation\\n            uses strongly consistent reads; otherwise, the operation uses eventually consistent\\n            reads.</p>\"\n                    }\n                },\n                \"ReturnConsumedCapacity\": {\n                    \"target\": \"com.amazonaws.dynamodb#ReturnConsumedCapacity\"\n                },\n                \"ProjectionExpression\": {\n                    \"target\": \"com.amazonaws.dynamodb#ProjectionExpression\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A string that identifies one or more attributes to retrieve from the table. These\\n            attributes can include scalars, sets, or elements of a JSON document. The attributes in\\n            the expression must be separated by commas.</p>\\n         <p>If no attribute names are specified, then all attributes are returned. If any of the\\n            requested attributes are not found, they do not appear in the result.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.AccessingItemAttributes.html\\\">Specifying Item Attributes</a> in the <i>Amazon DynamoDB Developer\\n                Guide</i>.</p>\"\n                    }\n                },\n                \"ExpressionAttributeNames\": {\n                    \"target\": \"com.amazonaws.dynamodb#ExpressionAttributeNameMap\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more substitution tokens for attribute names in an expression. The following\\n            are some use cases for using <code>ExpressionAttributeNames</code>:</p>\\n         <ul>\\n            <li>\\n               <p>To access an attribute whose name conflicts with a DynamoDB reserved\\n                    word.</p>\\n            </li>\\n            <li>\\n               <p>To create a placeholder for repeating occurrences of an attribute name in an\\n                    expression.</p>\\n            </li>\\n            <li>\\n               <p>To prevent special characters in an attribute name from being misinterpreted\\n                    in an expression.</p>\\n            </li>\\n         </ul>\\n         <p>Use the <b>#</b> character in an expression to dereference\\n            an attribute name. For example, consider the following attribute name:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>Percentile</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>The name of this attribute conflicts with a reserved word, so it cannot be used\\n            directly in an expression. (For the complete list of reserved words, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ReservedWords.html\\\">Reserved Words</a> in the <i>Amazon DynamoDB Developer\\n            Guide</i>). To work around this, you could specify the following for\\n                <code>ExpressionAttributeNames</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>{\\\"#P\\\":\\\"Percentile\\\"}</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>You could then use this substitution in an expression, as in this example:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>#P = :val</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <note>\\n            <p>Tokens that begin with the <b>:</b> character are\\n                    <i>expression attribute values</i>, which are placeholders for the\\n                actual value at runtime.</p>\\n         </note>\\n         <p>For more information on expression attribute names, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.AccessingItemAttributes.html\\\">Specifying Item Attributes</a> in the <i>Amazon DynamoDB Developer\\n                Guide</i>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents the input of a <code>GetItem</code> operation.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#GetItemOutput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Item\": {\n                    \"target\": \"com.amazonaws.dynamodb#AttributeMap\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A map of attribute names to <code>AttributeValue</code> objects, as specified by\\n                <code>ProjectionExpression</code>.</p>\"\n                    }\n                },\n                \"ConsumedCapacity\": {\n                    \"target\": \"com.amazonaws.dynamodb#ConsumedCapacity\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The capacity units consumed by the <code>GetItem</code> operation. The data returned\\n            includes the total provisioned throughput consumed, along with statistics for the table\\n            and any indexes involved in the operation. <code>ConsumedCapacity</code> is only\\n            returned if the <code>ReturnConsumedCapacity</code> parameter was specified. For more\\n            information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/read-write-operations.html#read-operation-consumption\\\">Capacity unit consumption for read operations</a> in the <i>Amazon\\n                DynamoDB Developer Guide</i>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents the output of a <code>GetItem</code> operation.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#GetResourcePolicy\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.dynamodb#GetResourcePolicyInput\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.dynamodb#GetResourcePolicyOutput\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InvalidEndpointException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#PolicyNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ResourceNotFoundException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#clientDiscoveredEndpoint\": {\n                    \"required\": false\n                },\n                \"smithy.api#documentation\": \"<p>Returns the resource-based policy document attached to the resource, which can be a\\n            table or stream, in JSON format.</p>\\n         <p>\\n            <code>GetResourcePolicy</code> follows an <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.ReadConsistency.html\\\">\\n               <i>eventually consistent</i>\\n            </a> model. The following list\\n            describes the outcomes when you issue the <code>GetResourcePolicy</code> request\\n            immediately after issuing another request:</p>\\n         <ul>\\n            <li>\\n               <p>If you issue a <code>GetResourcePolicy</code> request immediately after a\\n                        <code>PutResourcePolicy</code> request, DynamoDB might return a\\n                        <code>PolicyNotFoundException</code>.</p>\\n            </li>\\n            <li>\\n               <p>If you issue a <code>GetResourcePolicy</code>request immediately after a\\n                        <code>DeleteResourcePolicy</code> request, DynamoDB might return\\n                    the policy that was present before the deletion request.</p>\\n            </li>\\n            <li>\\n               <p>If you issue a <code>GetResourcePolicy</code> request immediately after a\\n                        <code>CreateTable</code> request, which includes a resource-based policy,\\n                        DynamoDB might return a <code>ResourceNotFoundException</code> or\\n                    a <code>PolicyNotFoundException</code>.</p>\\n            </li>\\n         </ul>\\n         <p>Because <code>GetResourcePolicy</code> uses an <i>eventually\\n                consistent</i> query, the metadata for your policy or table might not be\\n            available at that moment. Wait for a few seconds, and then retry the\\n                <code>GetResourcePolicy</code> request.</p>\\n         <p>After a <code>GetResourcePolicy</code> request returns a policy created using the\\n                <code>PutResourcePolicy</code> request, the policy will be applied in the\\n            authorization of requests to the resource. Because this process is eventually\\n            consistent, it will take some time to apply the policy to all requests to a resource.\\n            Policies that you attach while creating a table using the <code>CreateTable</code>\\n            request will always be applied to all requests for that table.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#GetResourcePolicyInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ResourceArn\": {\n                    \"target\": \"com.amazonaws.dynamodb#ResourceArnString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the DynamoDB resource to which the policy is attached. The\\n            resources you can specify include tables and streams.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"ResourceArn\"\n                        }\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#GetResourcePolicyOutput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Policy\": {\n                    \"target\": \"com.amazonaws.dynamodb#ResourcePolicy\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The resource-based policy document attached to the resource, which can be a table or\\n            stream, in JSON format.</p>\"\n                    }\n                },\n                \"RevisionId\": {\n                    \"target\": \"com.amazonaws.dynamodb#PolicyRevisionId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A unique string that represents the revision ID of the policy. If you're comparing revision IDs, make sure to always use string comparison logic.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#GlobalSecondaryIndex\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"IndexName\": {\n                    \"target\": \"com.amazonaws.dynamodb#IndexName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the global secondary index. The name must be unique among all other\\n            indexes on this table.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"KeySchema\": {\n                    \"target\": \"com.amazonaws.dynamodb#KeySchema\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The complete key schema for a global secondary index, which consists of one or more\\n            pairs of attribute names and key types:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>HASH</code> - partition key</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>RANGE</code> - sort key</p>\\n            </li>\\n         </ul>\\n         <note>\\n            <p>The partition key of an item is also known as its <i>hash\\n                    attribute</i>. The term \\\"hash attribute\\\" derives from DynamoDB's usage of\\n                an internal hash function to evenly distribute data items across partitions, based\\n                on their partition key values.</p>\\n            <p>The sort key of an item is also known as its <i>range attribute</i>.\\n                The term \\\"range attribute\\\" derives from the way DynamoDB stores items with the same\\n                partition key physically close together, in sorted order by the sort key\\n                value.</p>\\n         </note>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Projection\": {\n                    \"target\": \"com.amazonaws.dynamodb#Projection\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Represents attributes that are copied (projected) from the table into the global\\n            secondary index. These are in addition to the primary key attributes and index key\\n            attributes, which are automatically projected. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ProvisionedThroughput\": {\n                    \"target\": \"com.amazonaws.dynamodb#ProvisionedThroughput\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Represents the provisioned throughput settings for the specified global secondary\\n            index. You must use either <code>OnDemandThroughput</code> or\\n                <code>ProvisionedThroughput</code> based on your table's capacity mode.</p>\\n         <p>For current minimum and maximum provisioned throughput values, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Limits.html\\\">Service,\\n                Account, and Table Quotas</a> in the <i>Amazon DynamoDB Developer\\n                Guide</i>.</p>\"\n                    }\n                },\n                \"OnDemandThroughput\": {\n                    \"target\": \"com.amazonaws.dynamodb#OnDemandThroughput\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of read and write units for the specified global secondary index.\\n            If you use this parameter, you must specify <code>MaxReadRequestUnits</code>,\\n                <code>MaxWriteRequestUnits</code>, or both. You must use either\\n                <code>OnDemandThroughput</code> or <code>ProvisionedThroughput</code> based on your\\n            table's capacity mode.</p>\"\n                    }\n                },\n                \"WarmThroughput\": {\n                    \"target\": \"com.amazonaws.dynamodb#WarmThroughput\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Represents the warm throughput value (in read units per second and write units per\\n            second) for the specified secondary index. If you use this parameter, you must specify\\n                <code>ReadUnitsPerSecond</code>, <code>WriteUnitsPerSecond</code>, or both.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents the properties of a global secondary index.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#GlobalSecondaryIndexAutoScalingUpdate\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"IndexName\": {\n                    \"target\": \"com.amazonaws.dynamodb#IndexName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the global secondary index.</p>\"\n                    }\n                },\n                \"ProvisionedWriteCapacityAutoScalingUpdate\": {\n                    \"target\": \"com.amazonaws.dynamodb#AutoScalingSettingsUpdate\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents the auto scaling settings of a global secondary index for a global table\\n            that will be modified.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#GlobalSecondaryIndexAutoScalingUpdateList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.dynamodb#GlobalSecondaryIndexAutoScalingUpdate\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#GlobalSecondaryIndexDescription\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"IndexName\": {\n                    \"target\": \"com.amazonaws.dynamodb#IndexName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the global secondary index.</p>\"\n                    }\n                },\n                \"KeySchema\": {\n                    \"target\": \"com.amazonaws.dynamodb#KeySchema\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The complete key schema for a global secondary index, which consists of one or more\\n            pairs of attribute names and key types:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>HASH</code> - partition key</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>RANGE</code> - sort key</p>\\n            </li>\\n         </ul>\\n         <note>\\n            <p>The partition key of an item is also known as its <i>hash\\n                    attribute</i>. The term \\\"hash attribute\\\" derives from DynamoDB's usage of an internal hash function to evenly distribute data items across\\n                partitions, based on their partition key values.</p>\\n            <p>The sort key of an item is also known as its <i>range attribute</i>.\\n                The term \\\"range attribute\\\" derives from the way DynamoDB stores items with\\n                the same partition key physically close together, in sorted order by the sort key\\n                value.</p>\\n         </note>\"\n                    }\n                },\n                \"Projection\": {\n                    \"target\": \"com.amazonaws.dynamodb#Projection\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Represents attributes that are copied (projected) from the table into the global\\n            secondary index. These are in addition to the primary key attributes and index key\\n            attributes, which are automatically projected. </p>\"\n                    }\n                },\n                \"IndexStatus\": {\n                    \"target\": \"com.amazonaws.dynamodb#IndexStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The current state of the global secondary index:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>CREATING</code> - The index is being created.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>UPDATING</code> - The index is being updated.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>DELETING</code> - The index is being deleted.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ACTIVE</code> - The index is ready for use.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"Backfilling\": {\n                    \"target\": \"com.amazonaws.dynamodb#Backfilling\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether the index is currently backfilling. <i>Backfilling</i>\\n            is the process of reading items from the table and determining whether they can be added\\n            to the index. (Not all items will qualify: For example, a partition key cannot have any\\n            duplicate values.) If an item can be added to the index, DynamoDB will do so. After all\\n            items have been processed, the backfilling operation is complete and\\n                <code>Backfilling</code> is false.</p>\\n         <p>You can delete an index that is being created during the <code>Backfilling</code>\\n            phase when <code>IndexStatus</code> is set to CREATING and <code>Backfilling</code> is\\n            true. You can't delete the index that is being created when <code>IndexStatus</code> is\\n            set to CREATING and <code>Backfilling</code> is false. </p>\\n         <note>\\n            <p>For indexes that were created during a <code>CreateTable</code> operation, the\\n                    <code>Backfilling</code> attribute does not appear in the\\n                    <code>DescribeTable</code> output.</p>\\n         </note>\"\n                    }\n                },\n                \"ProvisionedThroughput\": {\n                    \"target\": \"com.amazonaws.dynamodb#ProvisionedThroughputDescription\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Represents the provisioned throughput settings for the specified global secondary\\n            index.</p>\\n         <p>For current minimum and maximum provisioned throughput values, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Limits.html\\\">Service,\\n                Account, and Table Quotas</a> in the <i>Amazon DynamoDB Developer\\n                Guide</i>.</p>\"\n                    }\n                },\n                \"IndexSizeBytes\": {\n                    \"target\": \"com.amazonaws.dynamodb#LongObject\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The total size of the specified index, in bytes. DynamoDB updates this value\\n            approximately every six hours. Recent changes might not be reflected in this\\n            value.</p>\"\n                    }\n                },\n                \"ItemCount\": {\n                    \"target\": \"com.amazonaws.dynamodb#LongObject\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of items in the specified index. DynamoDB updates this value approximately\\n            every six hours. Recent changes might not be reflected in this value.</p>\"\n                    }\n                },\n                \"IndexArn\": {\n                    \"target\": \"com.amazonaws.dynamodb#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) that uniquely identifies the index.</p>\"\n                    }\n                },\n                \"OnDemandThroughput\": {\n                    \"target\": \"com.amazonaws.dynamodb#OnDemandThroughput\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of read and write units for the specified global secondary index.\\n            If you use this parameter, you must specify <code>MaxReadRequestUnits</code>,\\n                <code>MaxWriteRequestUnits</code>, or both.</p>\"\n                    }\n                },\n                \"WarmThroughput\": {\n                    \"target\": \"com.amazonaws.dynamodb#GlobalSecondaryIndexWarmThroughputDescription\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Represents the warm throughput value (in read units per second and write units per\\n            second) for the specified secondary index.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents the properties of a global secondary index.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#GlobalSecondaryIndexDescriptionList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.dynamodb#GlobalSecondaryIndexDescription\"\n            }\n        },\n        \"com.amazonaws.dynamodb#GlobalSecondaryIndexInfo\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"IndexName\": {\n                    \"target\": \"com.amazonaws.dynamodb#IndexName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the global secondary index.</p>\"\n                    }\n                },\n                \"KeySchema\": {\n                    \"target\": \"com.amazonaws.dynamodb#KeySchema\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The complete key schema for a global secondary index, which consists of one or more\\n            pairs of attribute names and key types:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>HASH</code> - partition key</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>RANGE</code> - sort key</p>\\n            </li>\\n         </ul>\\n         <note>\\n            <p>The partition key of an item is also known as its <i>hash\\n                    attribute</i>. The term \\\"hash attribute\\\" derives from DynamoDB's usage of an internal hash function to evenly distribute data items across\\n                partitions, based on their partition key values.</p>\\n            <p>The sort key of an item is also known as its <i>range attribute</i>.\\n                The term \\\"range attribute\\\" derives from the way DynamoDB stores items with\\n                the same partition key physically close together, in sorted order by the sort key\\n                value.</p>\\n         </note>\"\n                    }\n                },\n                \"Projection\": {\n                    \"target\": \"com.amazonaws.dynamodb#Projection\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Represents attributes that are copied (projected) from the table into the global\\n            secondary index. These are in addition to the primary key attributes and index key\\n            attributes, which are automatically projected. </p>\"\n                    }\n                },\n                \"ProvisionedThroughput\": {\n                    \"target\": \"com.amazonaws.dynamodb#ProvisionedThroughput\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Represents the provisioned throughput settings for the specified global secondary\\n            index. </p>\"\n                    }\n                },\n                \"OnDemandThroughput\": {\n                    \"target\": \"com.amazonaws.dynamodb#OnDemandThroughput\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents the properties of a global secondary index for the table when the backup\\n            was created.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#GlobalSecondaryIndexList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.dynamodb#GlobalSecondaryIndex\"\n            }\n        },\n        \"com.amazonaws.dynamodb#GlobalSecondaryIndexUpdate\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Update\": {\n                    \"target\": \"com.amazonaws.dynamodb#UpdateGlobalSecondaryIndexAction\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of an existing global secondary index, along with new provisioned throughput\\n            settings to be applied to that index.</p>\"\n                    }\n                },\n                \"Create\": {\n                    \"target\": \"com.amazonaws.dynamodb#CreateGlobalSecondaryIndexAction\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The parameters required for creating a global secondary index on an existing\\n            table:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>IndexName </code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>KeySchema </code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>AttributeDefinitions </code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>Projection </code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ProvisionedThroughput </code>\\n               </p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"Delete\": {\n                    \"target\": \"com.amazonaws.dynamodb#DeleteGlobalSecondaryIndexAction\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of an existing global secondary index to be removed.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents one of the following:</p>\\n         <ul>\\n            <li>\\n               <p>A new global secondary index to be added to an existing table.</p>\\n            </li>\\n            <li>\\n               <p>New provisioned throughput parameters for an existing global secondary\\n                    index.</p>\\n            </li>\\n            <li>\\n               <p>An existing global secondary index to be removed from an existing\\n                    table.</p>\\n            </li>\\n         </ul>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#GlobalSecondaryIndexUpdateList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.dynamodb#GlobalSecondaryIndexUpdate\"\n            }\n        },\n        \"com.amazonaws.dynamodb#GlobalSecondaryIndexWarmThroughputDescription\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ReadUnitsPerSecond\": {\n                    \"target\": \"com.amazonaws.dynamodb#PositiveLongObject\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Represents warm throughput read units per second value for a global secondary\\n            index.</p>\"\n                    }\n                },\n                \"WriteUnitsPerSecond\": {\n                    \"target\": \"com.amazonaws.dynamodb#PositiveLongObject\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Represents warm throughput write units per second value for a global secondary\\n            index.</p>\"\n                    }\n                },\n                \"Status\": {\n                    \"target\": \"com.amazonaws.dynamodb#IndexStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Represents the warm throughput status being created or updated on a global secondary\\n            index. The status can only be <code>UPDATING</code> or <code>ACTIVE</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The description of the warm throughput value on a global secondary index.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#GlobalSecondaryIndexes\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.dynamodb#GlobalSecondaryIndexInfo\"\n            }\n        },\n        \"com.amazonaws.dynamodb#GlobalTable\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"GlobalTableName\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The global table name.</p>\"\n                    }\n                },\n                \"ReplicationGroup\": {\n                    \"target\": \"com.amazonaws.dynamodb#ReplicaList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Regions where the global table has replicas.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents the properties of a global table.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#GlobalTableAlreadyExistsException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.dynamodb#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The specified global table already exists.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.dynamodb#GlobalTableArnString\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.dynamodb#GlobalTableDescription\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ReplicationGroup\": {\n                    \"target\": \"com.amazonaws.dynamodb#ReplicaDescriptionList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Regions where the global table has replicas.</p>\"\n                    }\n                },\n                \"GlobalTableArn\": {\n                    \"target\": \"com.amazonaws.dynamodb#GlobalTableArnString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The unique identifier of the global table.</p>\"\n                    }\n                },\n                \"CreationDateTime\": {\n                    \"target\": \"com.amazonaws.dynamodb#Date\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The creation time of the global table.</p>\"\n                    }\n                },\n                \"GlobalTableStatus\": {\n                    \"target\": \"com.amazonaws.dynamodb#GlobalTableStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The current state of the global table:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>CREATING</code> - The global table is being created.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>UPDATING</code> - The global table is being updated.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>DELETING</code> - The global table is being deleted.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ACTIVE</code> - The global table is ready for use.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"GlobalTableName\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The global table name.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains details about the global table.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#GlobalTableGlobalSecondaryIndexSettingsUpdate\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"IndexName\": {\n                    \"target\": \"com.amazonaws.dynamodb#IndexName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the global secondary index. The name must be unique among all other\\n            indexes on this table.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ProvisionedWriteCapacityUnits\": {\n                    \"target\": \"com.amazonaws.dynamodb#PositiveLongObject\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of writes consumed per second before DynamoDB returns a\\n                <code>ThrottlingException.</code>\\n         </p>\"\n                    }\n                },\n                \"ProvisionedWriteCapacityAutoScalingSettingsUpdate\": {\n                    \"target\": \"com.amazonaws.dynamodb#AutoScalingSettingsUpdate\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Auto scaling settings for managing a global secondary index's write capacity\\n            units.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents the settings of a global secondary index for a global table that will be\\n            modified.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#GlobalTableGlobalSecondaryIndexSettingsUpdateList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.dynamodb#GlobalTableGlobalSecondaryIndexSettingsUpdate\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 20\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#GlobalTableList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.dynamodb#GlobalTable\"\n            }\n        },\n        \"com.amazonaws.dynamodb#GlobalTableNotFoundException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.dynamodb#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The specified global table does not exist.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.dynamodb#GlobalTableStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"CREATING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"CREATING\"\n                    }\n                },\n                \"ACTIVE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ACTIVE\"\n                    }\n                },\n                \"DELETING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DELETING\"\n                    }\n                },\n                \"UPDATING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"UPDATING\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#GlobalTableWitnessDescription\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RegionName\": {\n                    \"target\": \"com.amazonaws.dynamodb#RegionName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the Amazon Web Services Region that serves as a witness for the MRSC global\\n            table.</p>\"\n                    }\n                },\n                \"WitnessStatus\": {\n                    \"target\": \"com.amazonaws.dynamodb#WitnessStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The current status of the witness Region in the MRSC global table.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents the properties of a witness Region in a MRSC global table. </p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#GlobalTableWitnessDescriptionList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.dynamodb#GlobalTableWitnessDescription\"\n            }\n        },\n        \"com.amazonaws.dynamodb#GlobalTableWitnessGroupUpdate\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Create\": {\n                    \"target\": \"com.amazonaws.dynamodb#CreateGlobalTableWitnessGroupMemberAction\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies a witness Region to be added to a new MRSC global table. The witness must be\\n            added when creating the MRSC global table.</p>\"\n                    }\n                },\n                \"Delete\": {\n                    \"target\": \"com.amazonaws.dynamodb#DeleteGlobalTableWitnessGroupMemberAction\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies a witness Region to be removed from an existing global table. Must be done\\n            in conjunction with removing a replica. The deletion of both a witness and replica\\n            converts the remaining replica to a single-Region DynamoDB table.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents one of the following:</p>\\n         <ul>\\n            <li>\\n               <p>A new witness to be added to a new global table.</p>\\n            </li>\\n            <li>\\n               <p>An existing witness to be removed from an existing global table.</p>\\n            </li>\\n         </ul>\\n         <p>You can configure one witness per MRSC global table.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#GlobalTableWitnessGroupUpdateList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.dynamodb#GlobalTableWitnessGroupUpdate\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 1\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#IdempotentParameterMismatchException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Message\": {\n                    \"target\": \"com.amazonaws.dynamodb#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>DynamoDB rejected the request because you retried a request with a\\n            different payload but with an idempotent token that was already used.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.dynamodb#ImportArn\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 37,\n                    \"max\": 1024\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#ImportConflictException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.dynamodb#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p> There was a conflict when importing from the specified S3 source. This can occur when\\n            the current import conflicts with a previous import request that had the same client\\n            token. </p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.dynamodb#ImportEndTime\": {\n            \"type\": \"timestamp\"\n        },\n        \"com.amazonaws.dynamodb#ImportNextToken\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 112,\n                    \"max\": 1024\n                },\n                \"smithy.api#pattern\": \"^([0-9a-f]{16})+$\"\n            }\n        },\n        \"com.amazonaws.dynamodb#ImportNotFoundException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.dynamodb#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p> The specified import was not found. </p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.dynamodb#ImportStartTime\": {\n            \"type\": \"timestamp\"\n        },\n        \"com.amazonaws.dynamodb#ImportStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"IN_PROGRESS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"IN_PROGRESS\"\n                    }\n                },\n                \"COMPLETED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"COMPLETED\"\n                    }\n                },\n                \"CANCELLING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"CANCELLING\"\n                    }\n                },\n                \"CANCELLED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"CANCELLED\"\n                    }\n                },\n                \"FAILED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"FAILED\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#ImportSummary\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ImportArn\": {\n                    \"target\": \"com.amazonaws.dynamodb#ImportArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The Amazon Resource Number (ARN) corresponding to the import request. </p>\"\n                    }\n                },\n                \"ImportStatus\": {\n                    \"target\": \"com.amazonaws.dynamodb#ImportStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The status of the import operation. </p>\"\n                    }\n                },\n                \"TableArn\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The Amazon Resource Number (ARN) of the table being imported into. </p>\"\n                    }\n                },\n                \"S3BucketSource\": {\n                    \"target\": \"com.amazonaws.dynamodb#S3BucketSource\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The path and S3 bucket of the source file that is being imported. This includes the\\n            S3Bucket (required), S3KeyPrefix (optional) and S3BucketOwner (optional if the bucket is\\n            owned by the requester). </p>\"\n                    }\n                },\n                \"CloudWatchLogGroupArn\": {\n                    \"target\": \"com.amazonaws.dynamodb#CloudWatchLogGroupArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The Amazon Resource Number (ARN) of the Cloudwatch Log Group associated with this\\n            import task. </p>\"\n                    }\n                },\n                \"InputFormat\": {\n                    \"target\": \"com.amazonaws.dynamodb#InputFormat\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The format of the source data. Valid values are <code>CSV</code>,\\n                <code>DYNAMODB_JSON</code> or <code>ION</code>.</p>\"\n                    }\n                },\n                \"StartTime\": {\n                    \"target\": \"com.amazonaws.dynamodb#ImportStartTime\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The time at which this import task began. </p>\"\n                    }\n                },\n                \"EndTime\": {\n                    \"target\": \"com.amazonaws.dynamodb#ImportEndTime\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The time at which this import task ended. (Does this include the successful complete\\n            creation of the table it was imported to?) </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p> Summary information about the source file for the import.\\n            </p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#ImportSummaryList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.dynamodb#ImportSummary\"\n            }\n        },\n        \"com.amazonaws.dynamodb#ImportTable\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.dynamodb#ImportTableInput\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.dynamodb#ImportTableOutput\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ImportConflictException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ResourceInUseException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p> Imports table data from an S3 bucket. </p>\",\n                \"smithy.rules#operationContextParams\": {\n                    \"ResourceArn\": {\n                        \"path\": \"TableCreationParameters.TableName\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#ImportTableDescription\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ImportArn\": {\n                    \"target\": \"com.amazonaws.dynamodb#ImportArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The Amazon Resource Number (ARN) corresponding to the import request.\\n            </p>\"\n                    }\n                },\n                \"ImportStatus\": {\n                    \"target\": \"com.amazonaws.dynamodb#ImportStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The status of the import. </p>\"\n                    }\n                },\n                \"TableArn\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The Amazon Resource Number (ARN) of the table being imported into.\\n            </p>\"\n                    }\n                },\n                \"TableId\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The table id corresponding to the table created by import table process.\\n            </p>\"\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.dynamodb#ClientToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The client token that was provided for the import task. Reusing the client token on\\n            retry makes a call to <code>ImportTable</code> idempotent. </p>\"\n                    }\n                },\n                \"S3BucketSource\": {\n                    \"target\": \"com.amazonaws.dynamodb#S3BucketSource\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> Values for the S3 bucket the source file is imported from. Includes bucket name\\n            (required), key prefix (optional) and bucket account owner ID (optional). </p>\"\n                    }\n                },\n                \"ErrorCount\": {\n                    \"target\": \"com.amazonaws.dynamodb#ErrorCount\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p> The number of errors occurred on importing the source file into the target table.\\n        </p>\"\n                    }\n                },\n                \"CloudWatchLogGroupArn\": {\n                    \"target\": \"com.amazonaws.dynamodb#CloudWatchLogGroupArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The Amazon Resource Number (ARN) of the Cloudwatch Log Group associated with the\\n            target table. </p>\"\n                    }\n                },\n                \"InputFormat\": {\n                    \"target\": \"com.amazonaws.dynamodb#InputFormat\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The format of the source data going into the target table.\\n            </p>\"\n                    }\n                },\n                \"InputFormatOptions\": {\n                    \"target\": \"com.amazonaws.dynamodb#InputFormatOptions\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The format options for the data that was imported into the target table. There is one\\n            value, CsvOption. </p>\"\n                    }\n                },\n                \"InputCompressionType\": {\n                    \"target\": \"com.amazonaws.dynamodb#InputCompressionType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The compression options for the data that has been imported into the target table.\\n            The values are NONE, GZIP, or ZSTD. </p>\"\n                    }\n                },\n                \"TableCreationParameters\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableCreationParameters\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The parameters for the new table that is being imported into. </p>\"\n                    }\n                },\n                \"StartTime\": {\n                    \"target\": \"com.amazonaws.dynamodb#ImportStartTime\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The time when this import task started. </p>\"\n                    }\n                },\n                \"EndTime\": {\n                    \"target\": \"com.amazonaws.dynamodb#ImportEndTime\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The time at which the creation of the table associated with this import task\\n            completed. </p>\"\n                    }\n                },\n                \"ProcessedSizeBytes\": {\n                    \"target\": \"com.amazonaws.dynamodb#LongObject\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The total size of data processed from the source file, in Bytes. </p>\"\n                    }\n                },\n                \"ProcessedItemCount\": {\n                    \"target\": \"com.amazonaws.dynamodb#ProcessedItemCount\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p> The total number of items processed from the source file. </p>\"\n                    }\n                },\n                \"ImportedItemCount\": {\n                    \"target\": \"com.amazonaws.dynamodb#ImportedItemCount\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p> The number of items successfully imported into the new table. </p>\"\n                    }\n                },\n                \"FailureCode\": {\n                    \"target\": \"com.amazonaws.dynamodb#FailureCode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The error code corresponding to the failure that the import job ran into during\\n            execution. </p>\"\n                    }\n                },\n                \"FailureMessage\": {\n                    \"target\": \"com.amazonaws.dynamodb#FailureMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The error message corresponding to the failure that the import job ran into during\\n            execution. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p> Represents the properties of the table being imported into.\\n            </p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#ImportTableInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.dynamodb#ClientToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Providing a <code>ClientToken</code> makes the call to <code>ImportTableInput</code>\\n            idempotent, meaning that multiple identical calls have the same effect as one single\\n            call.</p>\\n         <p>A client token is valid for 8 hours after the first request that uses it is completed.\\n            After 8 hours, any request with the same client token is treated as a new request. Do\\n            not resubmit the same request with the same client token for more than 8 hours, or the\\n            result might not be idempotent.</p>\\n         <p>If you submit a request with the same client token but a change in other parameters\\n            within the 8-hour idempotency window, DynamoDB returns an\\n                <code>IdempotentParameterMismatch</code> exception.</p>\",\n                        \"smithy.api#idempotencyToken\": {}\n                    }\n                },\n                \"S3BucketSource\": {\n                    \"target\": \"com.amazonaws.dynamodb#S3BucketSource\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The S3 bucket that provides the source for the import. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"InputFormat\": {\n                    \"target\": \"com.amazonaws.dynamodb#InputFormat\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The format of the source data. Valid values for <code>ImportFormat</code> are\\n                <code>CSV</code>, <code>DYNAMODB_JSON</code> or <code>ION</code>. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"InputFormatOptions\": {\n                    \"target\": \"com.amazonaws.dynamodb#InputFormatOptions\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> Additional properties that specify how the input is formatted, </p>\"\n                    }\n                },\n                \"InputCompressionType\": {\n                    \"target\": \"com.amazonaws.dynamodb#InputCompressionType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> Type of compression to be used on the input coming from the imported table. </p>\"\n                    }\n                },\n                \"TableCreationParameters\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableCreationParameters\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Parameters for the table to import the data into. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#ImportTableOutput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ImportTableDescription\": {\n                    \"target\": \"com.amazonaws.dynamodb#ImportTableDescription\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> Represents the properties of the table created for the import, and parameters of the\\n            import. The import parameters include import status, how many items were processed, and\\n            how many errors were encountered. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#ImportedItemCount\": {\n            \"type\": \"long\",\n            \"traits\": {\n                \"smithy.api#default\": 0,\n                \"smithy.api#range\": {\n                    \"min\": 0\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#IncrementalExportSpecification\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ExportFromTime\": {\n                    \"target\": \"com.amazonaws.dynamodb#ExportFromTime\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Time in the past which provides the inclusive start range for the export table's data,\\n            counted in seconds from the start of the Unix epoch. The incremental export will reflect\\n            the table's state including and after this point in time.</p>\"\n                    }\n                },\n                \"ExportToTime\": {\n                    \"target\": \"com.amazonaws.dynamodb#ExportToTime\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Time in the past which provides the exclusive end range for the export table's data,\\n            counted in seconds from the start of the Unix epoch. The incremental export will reflect\\n            the table's state just prior to this point in time. If this is not provided, the latest\\n            time with data available will be used.</p>\"\n                    }\n                },\n                \"ExportViewType\": {\n                    \"target\": \"com.amazonaws.dynamodb#ExportViewType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The view type that was chosen for the export. Valid values are\\n                <code>NEW_AND_OLD_IMAGES</code> and <code>NEW_IMAGES</code>. The default value is\\n                <code>NEW_AND_OLD_IMAGES</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Optional object containing the parameters specific to an incremental export.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#IndexName\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 3,\n                    \"max\": 255\n                },\n                \"smithy.api#pattern\": \"^[a-zA-Z0-9_.-]+$\"\n            }\n        },\n        \"com.amazonaws.dynamodb#IndexNotFoundException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.dynamodb#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The operation tried to access a nonexistent index.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.dynamodb#IndexStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"CREATING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"CREATING\"\n                    }\n                },\n                \"UPDATING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"UPDATING\"\n                    }\n                },\n                \"DELETING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DELETING\"\n                    }\n                },\n                \"ACTIVE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ACTIVE\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#InputCompressionType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"GZIP\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"GZIP\"\n                    }\n                },\n                \"ZSTD\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ZSTD\"\n                    }\n                },\n                \"NONE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"NONE\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#InputFormat\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"DYNAMODB_JSON\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DYNAMODB_JSON\"\n                    }\n                },\n                \"ION\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ION\"\n                    }\n                },\n                \"CSV\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"CSV\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#InputFormatOptions\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Csv\": {\n                    \"target\": \"com.amazonaws.dynamodb#CsvOptions\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The options for imported source files in CSV format. The values are Delimiter and\\n            HeaderList. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p> The format options for the data that was imported into the target table. There is one\\n            value, CsvOption.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#Integer\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#default\": 0\n            }\n        },\n        \"com.amazonaws.dynamodb#IntegerObject\": {\n            \"type\": \"integer\"\n        },\n        \"com.amazonaws.dynamodb#InternalServerError\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.dynamodb#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The server encountered an internal error trying to fulfill the request.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>An error occurred on the server side.</p>\",\n                \"smithy.api#error\": \"server\"\n            }\n        },\n        \"com.amazonaws.dynamodb#InvalidEndpointException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Message\": {\n                    \"target\": \"com.amazonaws.dynamodb#String\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 421\n            }\n        },\n        \"com.amazonaws.dynamodb#InvalidExportTimeException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.dynamodb#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The specified <code>ExportTime</code> is outside of the point in time recovery\\n            window.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.dynamodb#InvalidRestoreTimeException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.dynamodb#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>An invalid restore time was specified. RestoreDateTime must be between\\n            EarliestRestorableDateTime and LatestRestorableDateTime.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.dynamodb#ItemCollectionKeyAttributeMap\": {\n            \"type\": \"map\",\n            \"key\": {\n                \"target\": \"com.amazonaws.dynamodb#AttributeName\"\n            },\n            \"value\": {\n                \"target\": \"com.amazonaws.dynamodb#AttributeValue\"\n            }\n        },\n        \"com.amazonaws.dynamodb#ItemCollectionMetrics\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ItemCollectionKey\": {\n                    \"target\": \"com.amazonaws.dynamodb#ItemCollectionKeyAttributeMap\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The partition key value of the item collection. This value is the same as the\\n            partition key value of the item.</p>\"\n                    }\n                },\n                \"SizeEstimateRangeGB\": {\n                    \"target\": \"com.amazonaws.dynamodb#ItemCollectionSizeEstimateRange\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An estimate of item collection size, in gigabytes. This value is a two-element array\\n            containing a lower bound and an upper bound for the estimate. The estimate includes the\\n            size of all the items in the table, plus the size of all attributes projected into all\\n            of the local secondary indexes on that table. Use this estimate to measure whether a\\n            local secondary index is approaching its size limit.</p>\\n         <p>The estimate is subject to change over time; therefore, do not rely on the precision\\n            or accuracy of the estimate.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about item collections, if any, that were affected by the operation.\\n                <code>ItemCollectionMetrics</code> is only returned if the request asked for it. If\\n            the table does not have any local secondary indexes, this information is not returned in\\n            the response.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#ItemCollectionMetricsMultiple\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.dynamodb#ItemCollectionMetrics\"\n            }\n        },\n        \"com.amazonaws.dynamodb#ItemCollectionMetricsPerTable\": {\n            \"type\": \"map\",\n            \"key\": {\n                \"target\": \"com.amazonaws.dynamodb#TableArn\"\n            },\n            \"value\": {\n                \"target\": \"com.amazonaws.dynamodb#ItemCollectionMetricsMultiple\"\n            }\n        },\n        \"com.amazonaws.dynamodb#ItemCollectionSizeEstimateBound\": {\n            \"type\": \"double\"\n        },\n        \"com.amazonaws.dynamodb#ItemCollectionSizeEstimateRange\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.dynamodb#ItemCollectionSizeEstimateBound\"\n            }\n        },\n        \"com.amazonaws.dynamodb#ItemCollectionSizeLimitExceededException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.dynamodb#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The total size of an item collection has exceeded the maximum limit of 10\\n            gigabytes.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>An item collection is too large. This exception is only returned for tables that\\n            have one or more local secondary indexes.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.dynamodb#ItemCount\": {\n            \"type\": \"long\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 0\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#ItemList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.dynamodb#AttributeMap\"\n            }\n        },\n        \"com.amazonaws.dynamodb#ItemResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Item\": {\n                    \"target\": \"com.amazonaws.dynamodb#AttributeMap\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Map of attribute data consisting of the data type and attribute value.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Details for the requested item.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#ItemResponseList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.dynamodb#ItemResponse\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 100\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#KMSMasterKeyArn\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.dynamodb#KMSMasterKeyId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.dynamodb#Key\": {\n            \"type\": \"map\",\n            \"key\": {\n                \"target\": \"com.amazonaws.dynamodb#AttributeName\"\n            },\n            \"value\": {\n                \"target\": \"com.amazonaws.dynamodb#AttributeValue\"\n            }\n        },\n        \"com.amazonaws.dynamodb#KeyConditions\": {\n            \"type\": \"map\",\n            \"key\": {\n                \"target\": \"com.amazonaws.dynamodb#AttributeName\"\n            },\n            \"value\": {\n                \"target\": \"com.amazonaws.dynamodb#Condition\"\n            }\n        },\n        \"com.amazonaws.dynamodb#KeyExpression\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.dynamodb#KeyList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.dynamodb#Key\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 100\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#KeySchema\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.dynamodb#KeySchemaElement\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 2\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#KeySchemaAttributeName\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 255\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#KeySchemaElement\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AttributeName\": {\n                    \"target\": \"com.amazonaws.dynamodb#KeySchemaAttributeName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of a key attribute.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"KeyType\": {\n                    \"target\": \"com.amazonaws.dynamodb#KeyType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The role that this key attribute will assume:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>HASH</code> - partition key</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>RANGE</code> - sort key</p>\\n            </li>\\n         </ul>\\n         <note>\\n            <p>The partition key of an item is also known as its <i>hash\\n                    attribute</i>. The term \\\"hash attribute\\\" derives from DynamoDB's usage of an internal hash function to evenly distribute data items across\\n                partitions, based on their partition key values.</p>\\n            <p>The sort key of an item is also known as its <i>range attribute</i>.\\n                The term \\\"range attribute\\\" derives from the way DynamoDB stores items with\\n                the same partition key physically close together, in sorted order by the sort key\\n                value.</p>\\n         </note>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents <i>a single element</i> of a key schema. A key schema\\n            specifies the attributes that make up the primary key of a table, or the key attributes\\n            of an index.</p>\\n         <p>A <code>KeySchemaElement</code> represents exactly one attribute of the primary key.\\n            For example, a simple primary key would be represented by one\\n                <code>KeySchemaElement</code> (for the partition key). A composite primary key would\\n            require one <code>KeySchemaElement</code> for the partition key, and another\\n                <code>KeySchemaElement</code> for the sort key.</p>\\n         <p>A <code>KeySchemaElement</code> must be a scalar, top-level attribute (not a nested\\n            attribute). The data type must be one of String, Number, or Binary. The attribute cannot\\n            be nested within a List or a Map.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#KeyType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"HASH\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"HASH\"\n                    }\n                },\n                \"RANGE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"RANGE\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#KeysAndAttributes\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Keys\": {\n                    \"target\": \"com.amazonaws.dynamodb#KeyList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The primary key attribute values that define the items and the attributes associated\\n            with the items.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"AttributesToGet\": {\n                    \"target\": \"com.amazonaws.dynamodb#AttributeNameList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>This is a legacy parameter. Use <code>ProjectionExpression</code> instead. For more\\n            information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/LegacyConditionalParameters.html\\\">Legacy\\n                Conditional Parameters</a> in the <i>Amazon DynamoDB Developer\\n                Guide</i>.</p>\"\n                    }\n                },\n                \"ConsistentRead\": {\n                    \"target\": \"com.amazonaws.dynamodb#ConsistentRead\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The consistency of a read operation. If set to <code>true</code>, then a strongly\\n            consistent read is used; otherwise, an eventually consistent read is used.</p>\"\n                    }\n                },\n                \"ProjectionExpression\": {\n                    \"target\": \"com.amazonaws.dynamodb#ProjectionExpression\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A string that identifies one or more attributes to retrieve from the table. These\\n            attributes can include scalars, sets, or elements of a JSON document. The attributes in\\n            the <code>ProjectionExpression</code> must be separated by commas.</p>\\n         <p>If no attribute names are specified, then all attributes will be returned. If any of\\n            the requested attributes are not found, they will not appear in the result.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.AccessingItemAttributes.html\\\">Accessing Item Attributes</a> in the <i>Amazon DynamoDB Developer\\n                Guide</i>.</p>\"\n                    }\n                },\n                \"ExpressionAttributeNames\": {\n                    \"target\": \"com.amazonaws.dynamodb#ExpressionAttributeNameMap\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more substitution tokens for attribute names in an expression. The following\\n            are some use cases for using <code>ExpressionAttributeNames</code>:</p>\\n         <ul>\\n            <li>\\n               <p>To access an attribute whose name conflicts with a DynamoDB reserved\\n                    word.</p>\\n            </li>\\n            <li>\\n               <p>To create a placeholder for repeating occurrences of an attribute name in an\\n                    expression.</p>\\n            </li>\\n            <li>\\n               <p>To prevent special characters in an attribute name from being misinterpreted\\n                    in an expression.</p>\\n            </li>\\n         </ul>\\n         <p>Use the <b>#</b> character in an expression to dereference\\n            an attribute name. For example, consider the following attribute name:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>Percentile</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>The name of this attribute conflicts with a reserved word, so it cannot be used\\n            directly in an expression. (For the complete list of reserved words, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ReservedWords.html\\\">Reserved Words</a> in the <i>Amazon DynamoDB Developer\\n                Guide</i>). To work around this, you could specify the following for\\n                <code>ExpressionAttributeNames</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>{\\\"#P\\\":\\\"Percentile\\\"}</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>You could then use this substitution in an expression, as in this example:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>#P = :val</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <note>\\n            <p>Tokens that begin with the <b>:</b> character are\\n                    <i>expression attribute values</i>, which are placeholders for the\\n                actual value at runtime.</p>\\n         </note>\\n         <p>For more information on expression attribute names, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.AccessingItemAttributes.html\\\">Accessing Item Attributes</a> in the <i>Amazon DynamoDB Developer\\n                Guide</i>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents a set of primary keys and, for each key, the attributes to retrieve from\\n            the table.</p>\\n         <p>For each primary key, you must provide <i>all</i> of the key attributes.\\n            For example, with a simple primary key, you only need to provide the partition key. For\\n            a composite primary key, you must provide <i>both</i> the partition key\\n            and the sort key.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#KinesisDataStreamDestination\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"StreamArn\": {\n                    \"target\": \"com.amazonaws.dynamodb#StreamArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN for a specific Kinesis data stream.</p>\"\n                    }\n                },\n                \"DestinationStatus\": {\n                    \"target\": \"com.amazonaws.dynamodb#DestinationStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The current status of replication.</p>\"\n                    }\n                },\n                \"DestinationStatusDescription\": {\n                    \"target\": \"com.amazonaws.dynamodb#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The human-readable string that corresponds to the replica status.</p>\"\n                    }\n                },\n                \"ApproximateCreationDateTimePrecision\": {\n                    \"target\": \"com.amazonaws.dynamodb#ApproximateCreationDateTimePrecision\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The precision of the Kinesis data stream timestamp. The values are either\\n                <code>MILLISECOND</code> or <code>MICROSECOND</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a Kinesis data stream destination.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#KinesisDataStreamDestinations\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.dynamodb#KinesisDataStreamDestination\"\n            }\n        },\n        \"com.amazonaws.dynamodb#KinesisStreamingDestinationInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TableName\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the DynamoDB table. You can also provide the Amazon Resource Name (ARN) of the\\n            table in this parameter.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"ResourceArn\"\n                        }\n                    }\n                },\n                \"StreamArn\": {\n                    \"target\": \"com.amazonaws.dynamodb#StreamArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN for a Kinesis data stream.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"EnableKinesisStreamingConfiguration\": {\n                    \"target\": \"com.amazonaws.dynamodb#EnableKinesisStreamingConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The source for the Kinesis streaming information that is being enabled.</p>\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#KinesisStreamingDestinationOutput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TableName\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the table being modified.</p>\"\n                    }\n                },\n                \"StreamArn\": {\n                    \"target\": \"com.amazonaws.dynamodb#StreamArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN for the specific Kinesis data stream.</p>\"\n                    }\n                },\n                \"DestinationStatus\": {\n                    \"target\": \"com.amazonaws.dynamodb#DestinationStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The current status of the replication.</p>\"\n                    }\n                },\n                \"EnableKinesisStreamingConfiguration\": {\n                    \"target\": \"com.amazonaws.dynamodb#EnableKinesisStreamingConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The destination for the Kinesis streaming information that is being enabled.</p>\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#LastUpdateDateTime\": {\n            \"type\": \"timestamp\"\n        },\n        \"com.amazonaws.dynamodb#LimitExceededException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.dynamodb#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Too many operations for a given subscriber.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>There is no limit to the number of daily on-demand backups that can be taken. </p>\\n         <p>For most purposes, up to 500 simultaneous table operations are allowed per account.\\n            These operations include <code>CreateTable</code>, <code>UpdateTable</code>,\\n                <code>DeleteTable</code>,<code>UpdateTimeToLive</code>,\\n                <code>RestoreTableFromBackup</code>, and <code>RestoreTableToPointInTime</code>. </p>\\n         <p>When you are creating a table with one or more secondary indexes, you can have up\\n            to 250 such requests running at a time. However, if the table or index specifications\\n            are complex, then DynamoDB might temporarily reduce the number of concurrent\\n            operations.</p>\\n         <p>When importing into DynamoDB, up to 50 simultaneous import table operations are\\n            allowed per account.</p>\\n         <p>There is a soft account quota of 2,500 tables.</p>\\n         <p>GetRecords was called with a value of more than 1000 for the limit request\\n            parameter.</p>\\n         <p>More than 2 processes are reading from the same streams shard at the same time.\\n            Exceeding this limit may result in request throttling.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.dynamodb#ListAttributeValue\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.dynamodb#AttributeValue\"\n            }\n        },\n        \"com.amazonaws.dynamodb#ListBackups\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.dynamodb#ListBackupsInput\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.dynamodb#ListBackupsOutput\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InvalidEndpointException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#clientDiscoveredEndpoint\": {\n                    \"required\": false\n                },\n                \"smithy.api#documentation\": \"<p>List DynamoDB backups that are associated with an Amazon Web Services account and\\n            weren't made with Amazon Web Services Backup. To list these backups for a given table,\\n            specify <code>TableName</code>. <code>ListBackups</code> returns a paginated list of\\n            results with at most 1 MB worth of items in a page. You can also specify a maximum\\n            number of entries to be returned in a page.</p>\\n         <p>In the request, start time is inclusive, but end time is exclusive. Note that these\\n            boundaries are for the time at which the original backup was requested.</p>\\n         <p>You can call <code>ListBackups</code> a maximum of five times per second.</p>\\n         <p>If you want to retrieve the complete list of backups made with Amazon Web Services\\n            Backup, use the <a href=\\\"https://docs.aws.amazon.com/aws-backup/latest/devguide/API_ListBackupJobs.html\\\">Amazon Web Services Backup\\n                list API.</a>\\n         </p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#ListBackupsInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TableName\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Lists the backups from the table specified in <code>TableName</code>. You can also\\n            provide the Amazon Resource Name (ARN) of the table in this parameter.</p>\",\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"ResourceArn\"\n                        }\n                    }\n                },\n                \"Limit\": {\n                    \"target\": \"com.amazonaws.dynamodb#BackupsInputLimit\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Maximum number of backups to return at once.</p>\"\n                    }\n                },\n                \"TimeRangeLowerBound\": {\n                    \"target\": \"com.amazonaws.dynamodb#TimeRangeLowerBound\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Only backups created after this time are listed. <code>TimeRangeLowerBound</code> is\\n            inclusive.</p>\"\n                    }\n                },\n                \"TimeRangeUpperBound\": {\n                    \"target\": \"com.amazonaws.dynamodb#TimeRangeUpperBound\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Only backups created before this time are listed. <code>TimeRangeUpperBound</code> is\\n            exclusive. </p>\"\n                    }\n                },\n                \"ExclusiveStartBackupArn\": {\n                    \"target\": \"com.amazonaws.dynamodb#BackupArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>\\n            <code>LastEvaluatedBackupArn</code> is the Amazon Resource Name (ARN) of the backup last\\n            evaluated when the current page of results was returned, inclusive of the current page\\n            of results. This value may be specified as the <code>ExclusiveStartBackupArn</code> of a\\n            new <code>ListBackups</code> operation in order to fetch the next page of results.\\n        </p>\"\n                    }\n                },\n                \"BackupType\": {\n                    \"target\": \"com.amazonaws.dynamodb#BackupTypeFilter\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The backups from the table specified by <code>BackupType</code> are listed.</p>\\n         <p>Where <code>BackupType</code> can be:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>USER</code> - On-demand backup created by you. (The default setting if no\\n                    other backup types are specified.)</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>SYSTEM</code> - On-demand backup automatically created by DynamoDB.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ALL</code> - All types of on-demand backups (USER and SYSTEM).</p>\\n            </li>\\n         </ul>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#ListBackupsOutput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"BackupSummaries\": {\n                    \"target\": \"com.amazonaws.dynamodb#BackupSummaries\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>List of <code>BackupSummary</code> objects.</p>\"\n                    }\n                },\n                \"LastEvaluatedBackupArn\": {\n                    \"target\": \"com.amazonaws.dynamodb#BackupArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The ARN of the backup last evaluated when the current page of results was returned,\\n            inclusive of the current page of results. This value may be specified as the\\n                <code>ExclusiveStartBackupArn</code> of a new <code>ListBackups</code> operation in\\n            order to fetch the next page of results. </p>\\n         <p> If <code>LastEvaluatedBackupArn</code> is empty, then the last page of results has\\n            been processed and there are no more results to be retrieved. </p>\\n         <p> If <code>LastEvaluatedBackupArn</code> is not empty, this may or may not indicate\\n            that there is more data to be returned. All results are guaranteed to have been returned\\n            if and only if no value for <code>LastEvaluatedBackupArn</code> is returned. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#ListContributorInsights\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.dynamodb#ListContributorInsightsInput\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.dynamodb#ListContributorInsightsOutput\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ResourceNotFoundException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns a list of ContributorInsightsSummary for a table and all its global secondary\\n            indexes.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#ListContributorInsightsInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TableName\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the table. You can also provide the Amazon Resource Name (ARN) of the table in this\\n            parameter.</p>\",\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"ResourceArn\"\n                        }\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.dynamodb#NextTokenString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A token to for the desired page, if there is one.</p>\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.dynamodb#ListContributorInsightsLimit\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>Maximum number of results to return per page.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#ListContributorInsightsLimit\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#default\": 0,\n                \"smithy.api#range\": {\n                    \"max\": 100\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#ListContributorInsightsOutput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ContributorInsightsSummaries\": {\n                    \"target\": \"com.amazonaws.dynamodb#ContributorInsightsSummaries\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of ContributorInsightsSummary.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.dynamodb#NextTokenString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A token to go to the next page if there is one.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#ListExports\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.dynamodb#ListExportsInput\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.dynamodb#ListExportsOutput\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#LimitExceededException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Lists completed exports within the past 90 days.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#ListExportsInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TableArn\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) associated with the exported table.</p>\",\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"ResourceArn\"\n                        }\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.dynamodb#ListExportsMaxLimit\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Maximum number of results to return per page.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.dynamodb#ExportNextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An optional string that, if supplied, must be copied from the output of a previous\\n            call to <code>ListExports</code>. When provided in this manner, the API fetches the next\\n            page of results.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#ListExportsMaxLimit\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 25\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#ListExportsOutput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ExportSummaries\": {\n                    \"target\": \"com.amazonaws.dynamodb#ExportSummaries\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of <code>ExportSummary</code> objects.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.dynamodb#ExportNextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If this value is returned, there are additional results to be displayed. To retrieve\\n            them, call <code>ListExports</code> again, with <code>NextToken</code> set to this\\n            value.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#ListGlobalTables\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.dynamodb#ListGlobalTablesInput\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.dynamodb#ListGlobalTablesOutput\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InvalidEndpointException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#clientDiscoveredEndpoint\": {\n                    \"required\": false\n                },\n                \"smithy.api#documentation\": \"<p>Lists all global tables that have a replica in the specified Region.</p>\\n         <important>\\n            <p>This documentation is for version 2017.11.29 (Legacy) of global tables, which should be avoided for new global tables. Customers should use <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GlobalTables.html\\\">Global Tables version 2019.11.21 (Current)</a> when possible, because it provides greater flexibility, higher efficiency, and consumes less write capacity than 2017.11.29 (Legacy).</p>\\n            <p>To determine which version you're using, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/globaltables.DetermineVersion.html\\\">Determining the global table version you are using</a>. To update existing global tables from version 2017.11.29 (Legacy) to version 2019.11.21 (Current), see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/V2globaltables_upgrade.html\\\">Upgrading global tables</a>.</p>\\n         </important>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#ListGlobalTablesInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ExclusiveStartGlobalTableName\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The first global table name that this operation will evaluate.</p>\"\n                    }\n                },\n                \"Limit\": {\n                    \"target\": \"com.amazonaws.dynamodb#PositiveIntegerObject\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of table names to return, if the parameter is not specified\\n            DynamoDB defaults to 100.</p>\\n         <p>If the number of global tables DynamoDB finds reaches this limit, it stops the\\n            operation and returns the table names collected up to that point, with a table name in\\n            the <code>LastEvaluatedGlobalTableName</code> to apply in a subsequent operation to the\\n                <code>ExclusiveStartGlobalTableName</code> parameter.</p>\"\n                    }\n                },\n                \"RegionName\": {\n                    \"target\": \"com.amazonaws.dynamodb#RegionName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Lists the global tables in a specific Region.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#ListGlobalTablesOutput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"GlobalTables\": {\n                    \"target\": \"com.amazonaws.dynamodb#GlobalTableList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>List of global table names.</p>\"\n                    }\n                },\n                \"LastEvaluatedGlobalTableName\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Last evaluated global table name.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#ListImports\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.dynamodb#ListImportsInput\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.dynamodb#ListImportsOutput\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.dynamodb#LimitExceededException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p> Lists completed imports within the past 90 days. </p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"pageSize\": \"PageSize\"\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#ListImportsInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TableArn\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The Amazon Resource Name (ARN) associated with the table that was imported to.\\n        </p>\",\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"ResourceArn\"\n                        }\n                    }\n                },\n                \"PageSize\": {\n                    \"target\": \"com.amazonaws.dynamodb#ListImportsMaxLimit\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The number of <code>ImportSummary </code>objects returned in a single page. </p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.dynamodb#ImportNextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> An optional string that, if supplied, must be copied from the output of a previous\\n            call to <code>ListImports</code>. When provided in this manner, the API fetches the next\\n            page of results. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#ListImportsMaxLimit\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 25\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#ListImportsOutput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ImportSummaryList\": {\n                    \"target\": \"com.amazonaws.dynamodb#ImportSummaryList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> A list of <code>ImportSummary</code> objects. </p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.dynamodb#ImportNextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> If this value is returned, there are additional results to be displayed. To retrieve\\n            them, call <code>ListImports</code> again, with <code>NextToken</code> set to this\\n            value. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#ListTables\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.dynamodb#ListTablesInput\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.dynamodb#ListTablesOutput\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InvalidEndpointException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#clientDiscoveredEndpoint\": {\n                    \"required\": false\n                },\n                \"smithy.api#documentation\": \"<p>Returns an array of table names associated with the current account and endpoint. The\\n            output from <code>ListTables</code> is paginated, with each page returning a maximum of\\n            100 table names.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To list tables\",\n                        \"documentation\": \"This example lists all of the tables associated with the current AWS account and endpoint.\",\n                        \"output\": {\n                            \"TableNames\": [\n                                \"Forum\",\n                                \"ProductCatalog\",\n                                \"Reply\",\n                                \"Thread\"\n                            ]\n                        }\n                    }\n                ],\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"ExclusiveStartTableName\",\n                    \"outputToken\": \"LastEvaluatedTableName\",\n                    \"items\": \"TableNames\",\n                    \"pageSize\": \"Limit\"\n                },\n                \"smithy.test#smokeTests\": [\n                    {\n                        \"id\": \"ListTablesSuccess\",\n                        \"params\": {\n                            \"Limit\": 1\n                        },\n                        \"vendorParams\": {\n                            \"region\": \"us-west-2\"\n                        },\n                        \"vendorParamsShape\": \"aws.test#AwsVendorParams\",\n                        \"expect\": {\n                            \"success\": {}\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.dynamodb#ListTablesInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ExclusiveStartTableName\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The first table name that this operation will evaluate. Use the value that was\\n            returned for <code>LastEvaluatedTableName</code> in a previous operation, so that you\\n            can obtain the next page of results.</p>\"\n                    }\n                },\n                \"Limit\": {\n                    \"target\": \"com.amazonaws.dynamodb#ListTablesInputLimit\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A maximum number of table names to return. If this parameter is not specified, the\\n            limit is 100.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents the input of a <code>ListTables</code> operation.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#ListTablesInputLimit\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 100\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#ListTablesOutput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TableNames\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableNameList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The names of the tables associated with the current account at the current endpoint.\\n            The maximum size of this array is 100.</p>\\n         <p>If <code>LastEvaluatedTableName</code> also appears in the output, you can use this\\n            value as the <code>ExclusiveStartTableName</code> parameter in a subsequent\\n                <code>ListTables</code> request and obtain the next page of results.</p>\"\n                    }\n                },\n                \"LastEvaluatedTableName\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the last table in the current page of results. Use this value as the\\n                <code>ExclusiveStartTableName</code> in a new request to obtain the next page of\\n            results, until all the table names are returned.</p>\\n         <p>If you do not receive a <code>LastEvaluatedTableName</code> value in the response,\\n            this means that there are no more table names to be retrieved.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents the output of a <code>ListTables</code> operation.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#ListTagsOfResource\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.dynamodb#ListTagsOfResourceInput\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.dynamodb#ListTagsOfResourceOutput\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InvalidEndpointException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ResourceNotFoundException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#clientDiscoveredEndpoint\": {\n                    \"required\": false\n                },\n                \"smithy.api#documentation\": \"<p>List all tags on an Amazon DynamoDB resource. You can call ListTagsOfResource up to 10\\n            times per second, per account.</p>\\n         <p>For an overview on tagging DynamoDB resources, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Tagging.html\\\">Tagging for DynamoDB</a>\\n            in the <i>Amazon DynamoDB Developer Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#ListTagsOfResourceInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ResourceArn\": {\n                    \"target\": \"com.amazonaws.dynamodb#ResourceArnString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon DynamoDB resource with tags to be listed. This value is an Amazon Resource\\n            Name (ARN).</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"ResourceArn\"\n                        }\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.dynamodb#NextTokenString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An optional string that, if supplied, must be copied from the output of a previous\\n            call to ListTagOfResource. When provided in this manner, this API fetches the next page\\n            of results.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#ListTagsOfResourceOutput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.dynamodb#TagList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags currently associated with the Amazon DynamoDB resource.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.dynamodb#NextTokenString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If this value is returned, there are additional results to be displayed. To retrieve\\n            them, call ListTagsOfResource again, with NextToken set to this value.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#LocalSecondaryIndex\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"IndexName\": {\n                    \"target\": \"com.amazonaws.dynamodb#IndexName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the local secondary index. The name must be unique among all other indexes\\n            on this table.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"KeySchema\": {\n                    \"target\": \"com.amazonaws.dynamodb#KeySchema\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The complete key schema for the local secondary index, consisting of one or more pairs\\n            of attribute names and key types:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>HASH</code> - partition key</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>RANGE</code> - sort key</p>\\n            </li>\\n         </ul>\\n         <note>\\n            <p>The partition key of an item is also known as its <i>hash\\n                    attribute</i>. The term \\\"hash attribute\\\" derives from DynamoDB's usage of\\n                an internal hash function to evenly distribute data items across partitions, based\\n                on their partition key values.</p>\\n            <p>The sort key of an item is also known as its <i>range attribute</i>.\\n                The term \\\"range attribute\\\" derives from the way DynamoDB stores items with the same\\n                partition key physically close together, in sorted order by the sort key\\n                value.</p>\\n         </note>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Projection\": {\n                    \"target\": \"com.amazonaws.dynamodb#Projection\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Represents attributes that are copied (projected) from the table into the local\\n            secondary index. These are in addition to the primary key attributes and index key\\n            attributes, which are automatically projected. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents the properties of a local secondary index.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#LocalSecondaryIndexDescription\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"IndexName\": {\n                    \"target\": \"com.amazonaws.dynamodb#IndexName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Represents the name of the local secondary index.</p>\"\n                    }\n                },\n                \"KeySchema\": {\n                    \"target\": \"com.amazonaws.dynamodb#KeySchema\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The complete key schema for the local secondary index, consisting of one or more pairs\\n            of attribute names and key types:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>HASH</code> - partition key</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>RANGE</code> - sort key</p>\\n            </li>\\n         </ul>\\n         <note>\\n            <p>The partition key of an item is also known as its <i>hash\\n                    attribute</i>. The term \\\"hash attribute\\\" derives from DynamoDB's usage of\\n                an internal hash function to evenly distribute data items across partitions, based\\n                on their partition key values.</p>\\n            <p>The sort key of an item is also known as its <i>range attribute</i>.\\n                The term \\\"range attribute\\\" derives from the way DynamoDB stores items with the same\\n                partition key physically close together, in sorted order by the sort key\\n                value.</p>\\n         </note>\"\n                    }\n                },\n                \"Projection\": {\n                    \"target\": \"com.amazonaws.dynamodb#Projection\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Represents attributes that are copied (projected) from the table into the global\\n            secondary index. These are in addition to the primary key attributes and index key\\n            attributes, which are automatically projected. </p>\"\n                    }\n                },\n                \"IndexSizeBytes\": {\n                    \"target\": \"com.amazonaws.dynamodb#LongObject\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The total size of the specified index, in bytes. DynamoDB updates this value\\n            approximately every six hours. Recent changes might not be reflected in this\\n            value.</p>\"\n                    }\n                },\n                \"ItemCount\": {\n                    \"target\": \"com.amazonaws.dynamodb#LongObject\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of items in the specified index. DynamoDB updates this value\\n            approximately every six hours. Recent changes might not be reflected in this\\n            value.</p>\"\n                    }\n                },\n                \"IndexArn\": {\n                    \"target\": \"com.amazonaws.dynamodb#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) that uniquely identifies the index.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents the properties of a local secondary index.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#LocalSecondaryIndexDescriptionList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.dynamodb#LocalSecondaryIndexDescription\"\n            }\n        },\n        \"com.amazonaws.dynamodb#LocalSecondaryIndexInfo\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"IndexName\": {\n                    \"target\": \"com.amazonaws.dynamodb#IndexName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Represents the name of the local secondary index.</p>\"\n                    }\n                },\n                \"KeySchema\": {\n                    \"target\": \"com.amazonaws.dynamodb#KeySchema\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The complete key schema for a local secondary index, which consists of one or more\\n            pairs of attribute names and key types:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>HASH</code> - partition key</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>RANGE</code> - sort key</p>\\n            </li>\\n         </ul>\\n         <note>\\n            <p>The partition key of an item is also known as its <i>hash\\n                    attribute</i>. The term \\\"hash attribute\\\" derives from DynamoDB's usage of\\n                an internal hash function to evenly distribute data items across partitions, based\\n                on their partition key values.</p>\\n            <p>The sort key of an item is also known as its <i>range attribute</i>.\\n                The term \\\"range attribute\\\" derives from the way DynamoDB stores items with the same\\n                partition key physically close together, in sorted order by the sort key\\n                value.</p>\\n         </note>\"\n                    }\n                },\n                \"Projection\": {\n                    \"target\": \"com.amazonaws.dynamodb#Projection\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Represents attributes that are copied (projected) from the table into the global\\n            secondary index. These are in addition to the primary key attributes and index key\\n            attributes, which are automatically projected. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents the properties of a local secondary index for the table when the backup was\\n            created.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#LocalSecondaryIndexList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.dynamodb#LocalSecondaryIndex\"\n            }\n        },\n        \"com.amazonaws.dynamodb#LocalSecondaryIndexes\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.dynamodb#LocalSecondaryIndexInfo\"\n            }\n        },\n        \"com.amazonaws.dynamodb#Long\": {\n            \"type\": \"long\",\n            \"traits\": {\n                \"smithy.api#default\": 0\n            }\n        },\n        \"com.amazonaws.dynamodb#LongObject\": {\n            \"type\": \"long\"\n        },\n        \"com.amazonaws.dynamodb#MapAttributeValue\": {\n            \"type\": \"map\",\n            \"key\": {\n                \"target\": \"com.amazonaws.dynamodb#AttributeName\"\n            },\n            \"value\": {\n                \"target\": \"com.amazonaws.dynamodb#AttributeValue\"\n            }\n        },\n        \"com.amazonaws.dynamodb#MultiRegionConsistency\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"EVENTUAL\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"EVENTUAL\"\n                    }\n                },\n                \"STRONG\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"STRONG\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#NextTokenString\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.dynamodb#NonKeyAttributeName\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 255\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#NonKeyAttributeNameList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.dynamodb#NonKeyAttributeName\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 20\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#NonNegativeLongObject\": {\n            \"type\": \"long\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 0\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#NullAttributeValue\": {\n            \"type\": \"boolean\"\n        },\n        \"com.amazonaws.dynamodb#NumberAttributeValue\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.dynamodb#NumberSetAttributeValue\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.dynamodb#NumberAttributeValue\"\n            }\n        },\n        \"com.amazonaws.dynamodb#OnDemandThroughput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"MaxReadRequestUnits\": {\n                    \"target\": \"com.amazonaws.dynamodb#LongObject\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Maximum number of read request units for the specified table.</p>\\n         <p>To specify a maximum <code>OnDemandThroughput</code> on your table, set the value of\\n                <code>MaxReadRequestUnits</code> as greater than or equal to 1. To remove the\\n            maximum <code>OnDemandThroughput</code> that is currently set on your table, set the\\n            value of <code>MaxReadRequestUnits</code> to -1.</p>\"\n                    }\n                },\n                \"MaxWriteRequestUnits\": {\n                    \"target\": \"com.amazonaws.dynamodb#LongObject\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Maximum number of write request units for the specified table.</p>\\n         <p>To specify a maximum <code>OnDemandThroughput</code> on your table, set the value of\\n                <code>MaxWriteRequestUnits</code> as greater than or equal to 1. To remove the\\n            maximum <code>OnDemandThroughput</code> that is currently set on your table, set the\\n            value of <code>MaxWriteRequestUnits</code> to -1.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Sets the maximum number of read and write units for the specified on-demand table. If\\n            you use this parameter, you must specify <code>MaxReadRequestUnits</code>,\\n                <code>MaxWriteRequestUnits</code>, or both.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#OnDemandThroughputOverride\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"MaxReadRequestUnits\": {\n                    \"target\": \"com.amazonaws.dynamodb#LongObject\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Maximum number of read request units for the specified replica table.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Overrides the on-demand throughput settings for this replica table. If you don't\\n            specify a value for this parameter, it uses the source table's on-demand throughput\\n            settings.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#ParameterizedStatement\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Statement\": {\n                    \"target\": \"com.amazonaws.dynamodb#PartiQLStatement\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> A PartiQL statement that uses parameters. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Parameters\": {\n                    \"target\": \"com.amazonaws.dynamodb#PreparedStatementParameters\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The parameter values. </p>\"\n                    }\n                },\n                \"ReturnValuesOnConditionCheckFailure\": {\n                    \"target\": \"com.amazonaws.dynamodb#ReturnValuesOnConditionCheckFailure\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An optional parameter that returns the item attributes for a PartiQL\\n                <code>ParameterizedStatement</code> operation that failed a condition check.</p>\\n         <p>There is no additional cost associated with requesting a return value aside from the\\n            small network and processing overhead of receiving a larger response. No read capacity\\n            units are consumed.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p> Represents a PartiQL statement that uses parameters. </p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#ParameterizedStatements\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.dynamodb#ParameterizedStatement\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 100\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#PartiQLBatchRequest\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.dynamodb#BatchStatementRequest\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 25\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#PartiQLBatchResponse\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.dynamodb#BatchStatementResponse\"\n            }\n        },\n        \"com.amazonaws.dynamodb#PartiQLNextToken\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 32768\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#PartiQLStatement\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 8192\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#PointInTimeRecoveryDescription\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PointInTimeRecoveryStatus\": {\n                    \"target\": \"com.amazonaws.dynamodb#PointInTimeRecoveryStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The current state of point in time recovery:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>ENABLED</code> - Point in time recovery is enabled.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>DISABLED</code> - Point in time recovery is disabled.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"RecoveryPeriodInDays\": {\n                    \"target\": \"com.amazonaws.dynamodb#RecoveryPeriodInDays\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of preceding days for which continuous backups are taken and maintained.\\n            Your table data is only recoverable to any point-in-time from within the configured\\n            recovery period. This parameter is optional.</p>\"\n                    }\n                },\n                \"EarliestRestorableDateTime\": {\n                    \"target\": \"com.amazonaws.dynamodb#Date\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the earliest point in time you can restore your table to. You can restore\\n            your table to any point in time during the last 35 days. </p>\"\n                    }\n                },\n                \"LatestRestorableDateTime\": {\n                    \"target\": \"com.amazonaws.dynamodb#Date\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>\\n            <code>LatestRestorableDateTime</code> is typically 5 minutes before the current time.\\n        </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The description of the point in time settings applied to the table.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#PointInTimeRecoverySpecification\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PointInTimeRecoveryEnabled\": {\n                    \"target\": \"com.amazonaws.dynamodb#BooleanObject\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether point in time recovery is enabled (true) or disabled (false) on the\\n            table.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"RecoveryPeriodInDays\": {\n                    \"target\": \"com.amazonaws.dynamodb#RecoveryPeriodInDays\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of preceding days for which continuous backups are taken and maintained.\\n            Your table data is only recoverable to any point-in-time from within the configured\\n            recovery period. This parameter is optional. If no value is provided, the value will\\n            default to 35.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents the settings used to enable point in time recovery.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#PointInTimeRecoveryStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ENABLED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ENABLED\"\n                    }\n                },\n                \"DISABLED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DISABLED\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#PointInTimeRecoveryUnavailableException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.dynamodb#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Point in time recovery has not yet been enabled for this source table.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.dynamodb#PolicyNotFoundException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.dynamodb#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The operation tried to access a nonexistent resource-based policy.</p>\\n         <p>If you specified an <code>ExpectedRevisionId</code>, it's possible that a policy is\\n            present for the resource but its revision ID didn't match the expected value.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.dynamodb#PolicyRevisionId\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 255\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#PositiveIntegerObject\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#PositiveLongObject\": {\n            \"type\": \"long\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#PreparedStatementParameters\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.dynamodb#AttributeValue\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#ProcessedItemCount\": {\n            \"type\": \"long\",\n            \"traits\": {\n                \"smithy.api#default\": 0,\n                \"smithy.api#range\": {\n                    \"min\": 0\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#Projection\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ProjectionType\": {\n                    \"target\": \"com.amazonaws.dynamodb#ProjectionType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The set of attributes that are projected into the index:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>KEYS_ONLY</code> - Only the index and primary keys are projected into the\\n                    index.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>INCLUDE</code> - In addition to the attributes described in\\n                        <code>KEYS_ONLY</code>, the secondary index will include other non-key\\n                    attributes that you specify.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ALL</code> - All of the table attributes are projected into the\\n                    index.</p>\\n            </li>\\n         </ul>\\n         <p>When using the DynamoDB console, <code>ALL</code> is selected by default.</p>\"\n                    }\n                },\n                \"NonKeyAttributes\": {\n                    \"target\": \"com.amazonaws.dynamodb#NonKeyAttributeNameList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Represents the non-key attribute names which will be projected into the index.</p>\\n         <p>For global and local secondary indexes, the total count of\\n                <code>NonKeyAttributes</code> summed across all of the secondary indexes, must not\\n            exceed 100. If you project the same attribute into two different indexes, this counts as\\n            two distinct attributes when determining the total. This limit only applies when you\\n            specify the ProjectionType of <code>INCLUDE</code>. You still can specify the\\n            ProjectionType of <code>ALL</code> to project all attributes from the source table, even\\n            if the table has more than 100 attributes.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents attributes that are copied (projected) from the table into an index. These\\n            are in addition to the primary key attributes and index key attributes, which are\\n            automatically projected.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#ProjectionExpression\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.dynamodb#ProjectionType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ALL\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ALL\"\n                    }\n                },\n                \"KEYS_ONLY\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"KEYS_ONLY\"\n                    }\n                },\n                \"INCLUDE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"INCLUDE\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#ProvisionedThroughput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ReadCapacityUnits\": {\n                    \"target\": \"com.amazonaws.dynamodb#PositiveLongObject\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of strongly consistent reads consumed per second before DynamoDB\\n            returns a <code>ThrottlingException</code>. For more information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ProvisionedThroughput.html\\\">Specifying\\n                Read and Write Requirements</a> in the <i>Amazon DynamoDB Developer\\n                Guide</i>.</p>\\n         <p>If read/write capacity mode is <code>PAY_PER_REQUEST</code> the value is set to\\n            0.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"WriteCapacityUnits\": {\n                    \"target\": \"com.amazonaws.dynamodb#PositiveLongObject\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of writes consumed per second before DynamoDB returns a\\n                <code>ThrottlingException</code>. For more information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ProvisionedThroughput.html\\\">Specifying\\n                Read and Write Requirements</a> in the <i>Amazon DynamoDB Developer\\n                Guide</i>.</p>\\n         <p>If read/write capacity mode is <code>PAY_PER_REQUEST</code> the value is set to\\n            0.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents the provisioned throughput settings for the specified global secondary\\n            index. You must use <code>ProvisionedThroughput</code> or\\n                <code>OnDemandThroughput</code> based on your table’s capacity mode.</p>\\n         <p>For current minimum and maximum provisioned throughput values, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Limits.html\\\">Service,\\n                Account, and Table Quotas</a> in the <i>Amazon DynamoDB Developer\\n                Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#ProvisionedThroughputDescription\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LastIncreaseDateTime\": {\n                    \"target\": \"com.amazonaws.dynamodb#Date\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time of the last provisioned throughput increase for this table.</p>\"\n                    }\n                },\n                \"LastDecreaseDateTime\": {\n                    \"target\": \"com.amazonaws.dynamodb#Date\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time of the last provisioned throughput decrease for this table.</p>\"\n                    }\n                },\n                \"NumberOfDecreasesToday\": {\n                    \"target\": \"com.amazonaws.dynamodb#PositiveLongObject\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of provisioned throughput decreases for this table during this UTC calendar\\n            day. For current maximums on provisioned throughput decreases, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Limits.html\\\">Service,\\n                Account, and Table Quotas</a> in the <i>Amazon DynamoDB Developer\\n                Guide</i>.</p>\"\n                    }\n                },\n                \"ReadCapacityUnits\": {\n                    \"target\": \"com.amazonaws.dynamodb#NonNegativeLongObject\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of strongly consistent reads consumed per second before DynamoDB\\n            returns a <code>ThrottlingException</code>. Eventually consistent reads require less\\n            effort than strongly consistent reads, so a setting of 50 <code>ReadCapacityUnits</code>\\n            per second provides 100 eventually consistent <code>ReadCapacityUnits</code> per\\n            second.</p>\"\n                    }\n                },\n                \"WriteCapacityUnits\": {\n                    \"target\": \"com.amazonaws.dynamodb#NonNegativeLongObject\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of writes consumed per second before DynamoDB returns a\\n                <code>ThrottlingException</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents the provisioned throughput settings for the table, consisting of read and\\n            write capacity units, along with data about increases and decreases.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#ProvisionedThroughputExceededException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.dynamodb#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>You exceeded your maximum allowed provisioned throughput.</p>\"\n                    }\n                },\n                \"ThrottlingReasons\": {\n                    \"target\": \"com.amazonaws.dynamodb#ThrottlingReasonList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_ThrottlingReason.html\\\">ThrottlingReason</a> that\\n     provide detailed diagnostic information about why the request was throttled.\\n    </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The request was denied due to request throttling. For detailed information about\\n            why the request was throttled and the ARN of the impacted resource, find the <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_ThrottlingReason.html\\\">ThrottlingReason</a> field in the returned exception. The Amazon Web Services\\n            SDKs for DynamoDB automatically retry requests that receive this exception.\\n            Your request is eventually successful, unless your retry queue is too large to finish.\\n            Reduce the frequency of requests and use exponential backoff. For more information, go\\n            to <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Programming.Errors.html#Programming.Errors.RetryAndBackoff\\\">Error Retries and Exponential Backoff</a> in the <i>Amazon DynamoDB Developer Guide</i>.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.dynamodb#ProvisionedThroughputOverride\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ReadCapacityUnits\": {\n                    \"target\": \"com.amazonaws.dynamodb#PositiveLongObject\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Replica-specific read capacity units. If not specified, uses the source table's read\\n            capacity settings.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Replica-specific provisioned throughput settings. If not specified, uses the source\\n            table's provisioned throughput settings.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#Put\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Item\": {\n                    \"target\": \"com.amazonaws.dynamodb#PutItemInputAttributeMap\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A map of attribute name to attribute values, representing the primary key of the item\\n            to be written by <code>PutItem</code>. All of the table's primary key attributes must be\\n            specified, and their data types must match those of the table's key schema. If any\\n            attributes are present in the item that are part of an index key schema for the table,\\n            their types must match the index key schema. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TableName\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Name of the table in which to write the item. You can also provide the Amazon Resource Name (ARN) of\\n            the table in this parameter.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ConditionExpression\": {\n                    \"target\": \"com.amazonaws.dynamodb#ConditionExpression\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A condition that must be satisfied in order for a conditional update to\\n            succeed.</p>\"\n                    }\n                },\n                \"ExpressionAttributeNames\": {\n                    \"target\": \"com.amazonaws.dynamodb#ExpressionAttributeNameMap\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more substitution tokens for attribute names in an expression.</p>\"\n                    }\n                },\n                \"ExpressionAttributeValues\": {\n                    \"target\": \"com.amazonaws.dynamodb#ExpressionAttributeValueMap\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more values that can be substituted in an expression.</p>\"\n                    }\n                },\n                \"ReturnValuesOnConditionCheckFailure\": {\n                    \"target\": \"com.amazonaws.dynamodb#ReturnValuesOnConditionCheckFailure\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use <code>ReturnValuesOnConditionCheckFailure</code> to get the item attributes if the\\n                <code>Put</code> condition fails. For\\n                <code>ReturnValuesOnConditionCheckFailure</code>, the valid values are: NONE and\\n            ALL_OLD.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents a request to perform a <code>PutItem</code> operation.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#PutItem\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.dynamodb#PutItemInput\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.dynamodb#PutItemOutput\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ConditionalCheckFailedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InvalidEndpointException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ItemCollectionSizeLimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ProvisionedThroughputExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ReplicatedWriteConflictException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#RequestLimitExceeded\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ThrottlingException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#TransactionConflictException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#clientDiscoveredEndpoint\": {\n                    \"required\": false\n                },\n                \"smithy.api#documentation\": \"<p>Creates a new item, or replaces an old item with a new item. If an item that has the\\n            same primary key as the new item already exists in the specified table, the new item\\n            completely replaces the existing item. You can perform a conditional put operation (add\\n            a new item if one with the specified primary key doesn't exist), or replace an existing\\n            item if it has certain attribute values. You can return the item's attribute values in\\n            the same operation, using the <code>ReturnValues</code> parameter.</p>\\n         <p>When you add an item, the primary key attributes are the only required attributes. </p>\\n         <p>Empty String and Binary attribute values are allowed. Attribute values of type String\\n            and Binary must have a length greater than zero if the attribute is used as a key\\n            attribute for a table or index. Set type attributes cannot be empty. </p>\\n         <p>Invalid Requests with empty values will be rejected with a\\n                <code>ValidationException</code> exception.</p>\\n         <note>\\n            <p>To prevent a new item from replacing an existing item, use a conditional\\n                expression that contains the <code>attribute_not_exists</code> function with the\\n                name of the attribute being used as the partition key for the table. Since every\\n                record must contain that attribute, the <code>attribute_not_exists</code> function\\n                will only succeed if no matching item exists.</p>\\n         </note>\\n         <p>For more information about <code>PutItem</code>, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/WorkingWithItems.html\\\">Working with\\n                Items</a> in the <i>Amazon DynamoDB Developer Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To add an item to a table\",\n                        \"documentation\": \"This example adds a new item to the Music table.\",\n                        \"input\": {\n                            \"TableName\": \"Music\",\n                            \"Item\": {\n                                \"AlbumTitle\": {\n                                    \"S\": \"Somewhat Famous\"\n                                },\n                                \"SongTitle\": {\n                                    \"S\": \"Call Me Today\"\n                                },\n                                \"Artist\": {\n                                    \"S\": \"No One You Know\"\n                                }\n                            },\n                            \"ReturnConsumedCapacity\": \"TOTAL\"\n                        },\n                        \"output\": {\n                            \"ConsumedCapacity\": {\n                                \"CapacityUnits\": 1,\n                                \"TableName\": \"Music\"\n                            }\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.dynamodb#PutItemInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TableName\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the table to contain the item. You can also provide the Amazon Resource Name (ARN) of the\\n            table in this parameter.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"ResourceArn\"\n                        }\n                    }\n                },\n                \"Item\": {\n                    \"target\": \"com.amazonaws.dynamodb#PutItemInputAttributeMap\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A map of attribute name/value pairs, one for each attribute. Only the primary key\\n            attributes are required; you can optionally provide other attribute name-value pairs for\\n            the item.</p>\\n         <p>You must provide all of the attributes for the primary key. For example, with a simple\\n            primary key, you only need to provide a value for the partition key. For a composite\\n            primary key, you must provide both values for both the partition key and the sort\\n            key.</p>\\n         <p>If you specify any attributes that are part of an index key, then the data types for\\n            those attributes must match those of the schema in the table's attribute\\n            definition.</p>\\n         <p>Empty String and Binary attribute values are allowed. Attribute values of type String\\n            and Binary must have a length greater than zero if the attribute is used as a key\\n            attribute for a table or index.</p>\\n         <p>For more information about primary keys, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.CoreComponents.html#HowItWorks.CoreComponents.PrimaryKey\\\">Primary Key</a> in the <i>Amazon DynamoDB Developer\\n            Guide</i>.</p>\\n         <p>Each element in the <code>Item</code> map is an <code>AttributeValue</code>\\n            object.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Expected\": {\n                    \"target\": \"com.amazonaws.dynamodb#ExpectedAttributeMap\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>This is a legacy parameter. Use <code>ConditionExpression</code> instead. For more\\n            information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/LegacyConditionalParameters.Expected.html\\\">Expected</a> in the <i>Amazon DynamoDB Developer\\n            Guide</i>.</p>\"\n                    }\n                },\n                \"ReturnValues\": {\n                    \"target\": \"com.amazonaws.dynamodb#ReturnValue\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use <code>ReturnValues</code> if you want to get the item attributes as they appeared\\n            before they were updated with the <code>PutItem</code> request. For\\n            <code>PutItem</code>, the valid values are:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>NONE</code> - If <code>ReturnValues</code> is not specified, or if its\\n                    value is <code>NONE</code>, then nothing is returned. (This setting is the\\n                    default for <code>ReturnValues</code>.)</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ALL_OLD</code> - If <code>PutItem</code> overwrote an attribute name-value\\n                    pair, then the content of the old item is returned.</p>\\n            </li>\\n         </ul>\\n         <p>The values returned are strongly consistent.</p>\\n         <p>There is no additional cost associated with requesting a return value aside from the\\n            small network and processing overhead of receiving a larger response. No read capacity\\n            units are consumed.</p>\\n         <note>\\n            <p>The <code>ReturnValues</code> parameter is used by several DynamoDB operations;\\n                however, <code>PutItem</code> does not recognize any values other than\\n                    <code>NONE</code> or <code>ALL_OLD</code>.</p>\\n         </note>\"\n                    }\n                },\n                \"ReturnConsumedCapacity\": {\n                    \"target\": \"com.amazonaws.dynamodb#ReturnConsumedCapacity\"\n                },\n                \"ReturnItemCollectionMetrics\": {\n                    \"target\": \"com.amazonaws.dynamodb#ReturnItemCollectionMetrics\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Determines whether item collection metrics are returned. If set to <code>SIZE</code>,\\n            the response includes statistics about item collections, if any, that were modified\\n            during the operation are returned in the response. If set to <code>NONE</code> (the\\n            default), no statistics are returned.</p>\"\n                    }\n                },\n                \"ConditionalOperator\": {\n                    \"target\": \"com.amazonaws.dynamodb#ConditionalOperator\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>This is a legacy parameter. Use <code>ConditionExpression</code> instead. For more\\n            information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/LegacyConditionalParameters.ConditionalOperator.html\\\">ConditionalOperator</a> in the <i>Amazon DynamoDB Developer\\n                Guide</i>.</p>\"\n                    }\n                },\n                \"ConditionExpression\": {\n                    \"target\": \"com.amazonaws.dynamodb#ConditionExpression\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A condition that must be satisfied in order for a conditional <code>PutItem</code>\\n            operation to succeed.</p>\\n         <p>An expression can contain any of the following:</p>\\n         <ul>\\n            <li>\\n               <p>Functions: <code>attribute_exists | attribute_not_exists | attribute_type |\\n                        contains | begins_with | size</code>\\n               </p>\\n               <p>These function names are case-sensitive.</p>\\n            </li>\\n            <li>\\n               <p>Comparison operators: <code>= | <> |\\n            < | > | <= | >= |\\n            BETWEEN | IN </code>\\n               </p>\\n            </li>\\n            <li>\\n               <p> Logical operators: <code>AND | OR | NOT</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>For more information on condition expressions, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.SpecifyingConditions.html\\\">Condition Expressions</a> in the <i>Amazon DynamoDB Developer\\n                Guide</i>.</p>\"\n                    }\n                },\n                \"ExpressionAttributeNames\": {\n                    \"target\": \"com.amazonaws.dynamodb#ExpressionAttributeNameMap\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more substitution tokens for attribute names in an expression. The following\\n            are some use cases for using <code>ExpressionAttributeNames</code>:</p>\\n         <ul>\\n            <li>\\n               <p>To access an attribute whose name conflicts with a DynamoDB reserved\\n                    word.</p>\\n            </li>\\n            <li>\\n               <p>To create a placeholder for repeating occurrences of an attribute name in an\\n                    expression.</p>\\n            </li>\\n            <li>\\n               <p>To prevent special characters in an attribute name from being misinterpreted\\n                    in an expression.</p>\\n            </li>\\n         </ul>\\n         <p>Use the <b>#</b> character in an expression to dereference\\n            an attribute name. For example, consider the following attribute name:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>Percentile</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>The name of this attribute conflicts with a reserved word, so it cannot be used\\n            directly in an expression. (For the complete list of reserved words, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ReservedWords.html\\\">Reserved Words</a> in the <i>Amazon DynamoDB Developer\\n            Guide</i>). To work around this, you could specify the following for\\n                <code>ExpressionAttributeNames</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>{\\\"#P\\\":\\\"Percentile\\\"}</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>You could then use this substitution in an expression, as in this example:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>#P = :val</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <note>\\n            <p>Tokens that begin with the <b>:</b> character are\\n                    <i>expression attribute values</i>, which are placeholders for the\\n                actual value at runtime.</p>\\n         </note>\\n         <p>For more information on expression attribute names, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.AccessingItemAttributes.html\\\">Specifying Item Attributes</a> in the <i>Amazon DynamoDB Developer\\n                Guide</i>.</p>\"\n                    }\n                },\n                \"ExpressionAttributeValues\": {\n                    \"target\": \"com.amazonaws.dynamodb#ExpressionAttributeValueMap\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more values that can be substituted in an expression.</p>\\n         <p>Use the <b>:</b> (colon) character in an expression to\\n            dereference an attribute value. For example, suppose that you wanted to check whether\\n            the value of the <i>ProductStatus</i> attribute was one of the following: </p>\\n         <p>\\n            <code>Available | Backordered | Discontinued</code>\\n         </p>\\n         <p>You would first need to specify <code>ExpressionAttributeValues</code> as\\n            follows:</p>\\n         <p>\\n            <code>{ \\\":avail\\\":{\\\"S\\\":\\\"Available\\\"}, \\\":back\\\":{\\\"S\\\":\\\"Backordered\\\"},\\n                \\\":disc\\\":{\\\"S\\\":\\\"Discontinued\\\"} }</code>\\n         </p>\\n         <p>You could then use these values in an expression, such as this:</p>\\n         <p>\\n            <code>ProductStatus IN (:avail, :back, :disc)</code>\\n         </p>\\n         <p>For more information on expression attribute values, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.SpecifyingConditions.html\\\">Condition Expressions</a> in the <i>Amazon DynamoDB Developer\\n                Guide</i>.</p>\"\n                    }\n                },\n                \"ReturnValuesOnConditionCheckFailure\": {\n                    \"target\": \"com.amazonaws.dynamodb#ReturnValuesOnConditionCheckFailure\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An optional parameter that returns the item attributes for a <code>PutItem</code>\\n            operation that failed a condition check.</p>\\n         <p>There is no additional cost associated with requesting a return value aside from the\\n            small network and processing overhead of receiving a larger response. No read capacity\\n            units are consumed.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents the input of a <code>PutItem</code> operation.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#PutItemInputAttributeMap\": {\n            \"type\": \"map\",\n            \"key\": {\n                \"target\": \"com.amazonaws.dynamodb#AttributeName\"\n            },\n            \"value\": {\n                \"target\": \"com.amazonaws.dynamodb#AttributeValue\"\n            }\n        },\n        \"com.amazonaws.dynamodb#PutItemOutput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Attributes\": {\n                    \"target\": \"com.amazonaws.dynamodb#AttributeMap\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The attribute values as they appeared before the <code>PutItem</code> operation, but\\n            only if <code>ReturnValues</code> is specified as <code>ALL_OLD</code> in the request.\\n            Each element consists of an attribute name and an attribute value.</p>\"\n                    }\n                },\n                \"ConsumedCapacity\": {\n                    \"target\": \"com.amazonaws.dynamodb#ConsumedCapacity\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The capacity units consumed by the <code>PutItem</code> operation. The data returned\\n            includes the total provisioned throughput consumed, along with statistics for the table\\n            and any indexes involved in the operation. <code>ConsumedCapacity</code> is only\\n            returned if the <code>ReturnConsumedCapacity</code> parameter was specified. For more\\n            information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/read-write-operations.html#write-operation-consumption\\\">Capacity unity consumption for write operations</a> in the <i>Amazon\\n                DynamoDB Developer Guide</i>.</p>\"\n                    }\n                },\n                \"ItemCollectionMetrics\": {\n                    \"target\": \"com.amazonaws.dynamodb#ItemCollectionMetrics\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Information about item collections, if any, that were affected by the\\n                <code>PutItem</code> operation. <code>ItemCollectionMetrics</code> is only returned\\n            if the <code>ReturnItemCollectionMetrics</code> parameter was specified. If the table\\n            does not have any local secondary indexes, this information is not returned in the\\n            response.</p>\\n         <p>Each <code>ItemCollectionMetrics</code> element consists of:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>ItemCollectionKey</code> - The partition key value of the item collection.\\n                    This is the same as the partition key value of the item itself.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>SizeEstimateRangeGB</code> - An estimate of item collection size, in\\n                    gigabytes. This value is a two-element array containing a lower bound and an\\n                    upper bound for the estimate. The estimate includes the size of all the items in\\n                    the table, plus the size of all attributes projected into all of the local\\n                    secondary indexes on that table. Use this estimate to measure whether a local\\n                    secondary index is approaching its size limit.</p>\\n               <p>The estimate is subject to change over time; therefore, do not rely on the\\n                    precision or accuracy of the estimate.</p>\\n            </li>\\n         </ul>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents the output of a <code>PutItem</code> operation.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#PutRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Item\": {\n                    \"target\": \"com.amazonaws.dynamodb#PutItemInputAttributeMap\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A map of attribute name to attribute values, representing the primary key of an item\\n            to be processed by <code>PutItem</code>. All of the table's primary key attributes must\\n            be specified, and their data types must match those of the table's key schema. If any\\n            attributes are present in the item that are part of an index key schema for the table,\\n            their types must match the index key schema.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents a request to perform a <code>PutItem</code> operation on an item.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#PutResourcePolicy\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.dynamodb#PutResourcePolicyInput\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.dynamodb#PutResourcePolicyOutput\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InvalidEndpointException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#PolicyNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ResourceInUseException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ResourceNotFoundException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#clientDiscoveredEndpoint\": {\n                    \"required\": false\n                },\n                \"smithy.api#documentation\": \"<p>Attaches a resource-based policy document to the resource, which can be a table or\\n            stream. When you attach a resource-based policy using this API, the policy application\\n            is <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.ReadConsistency.html\\\">\\n               <i>eventually consistent</i>\\n            </a>.</p>\\n         <p>\\n            <code>PutResourcePolicy</code> is an idempotent operation; running it multiple times\\n            on the same resource using the same policy document will return the same revision ID. If\\n            you specify an <code>ExpectedRevisionId</code> that doesn't match the current policy's\\n                <code>RevisionId</code>, the <code>PolicyNotFoundException</code> will be\\n            returned.</p>\\n         <note>\\n            <p>\\n               <code>PutResourcePolicy</code> is an asynchronous operation. If you issue a\\n                    <code>GetResourcePolicy</code> request immediately after a\\n                    <code>PutResourcePolicy</code> request, DynamoDB might return your\\n                previous policy, if there was one, or return the\\n                    <code>PolicyNotFoundException</code>. This is because\\n                    <code>GetResourcePolicy</code> uses an eventually consistent query, and the\\n                metadata for your policy or table might not be available at that moment. Wait for a\\n                few seconds, and then try the <code>GetResourcePolicy</code> request again.</p>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#PutResourcePolicyInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ResourceArn\": {\n                    \"target\": \"com.amazonaws.dynamodb#ResourceArnString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the DynamoDB resource to which the policy will be attached.\\n            The resources you can specify include tables and streams.</p>\\n         <p>You can control index permissions using the base table's policy. To specify the same permission level for your table and its indexes, you can provide both the table and index Amazon Resource Name (ARN)s in the <code>Resource</code> field of a given <code>Statement</code> in your policy document. Alternatively, to specify different permissions for your table, indexes, or both, you can define multiple <code>Statement</code> fields in your policy document.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"ResourceArn\"\n                        }\n                    }\n                },\n                \"Policy\": {\n                    \"target\": \"com.amazonaws.dynamodb#ResourcePolicy\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An Amazon Web Services resource-based policy document in JSON format.</p>\\n         <ul>\\n            <li>\\n               <p>The maximum size supported for a resource-based policy document is 20 KB.\\n                        DynamoDB counts whitespaces when calculating the size of a policy\\n                    against this limit.</p>\\n            </li>\\n            <li>\\n               <p>Within a resource-based policy, if the action for a DynamoDB\\n                    service-linked role (SLR) to replicate data for a global table is denied, adding\\n                    or deleting a replica will fail with an error.</p>\\n            </li>\\n         </ul>\\n         <p>For a full list of all considerations that apply while attaching a resource-based\\n            policy, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/rbac-considerations.html\\\">Resource-based\\n                policy considerations</a>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ExpectedRevisionId\": {\n                    \"target\": \"com.amazonaws.dynamodb#PolicyRevisionId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A string value that you can use to conditionally update your policy. You can provide\\n            the revision ID of your existing policy to make mutating requests against that\\n            policy.</p>\\n         <note>\\n            <p>When you provide an expected revision ID, if the revision ID of the existing\\n                policy on the resource doesn't match or if there's no policy attached to the\\n                resource, your request will be rejected with a\\n                <code>PolicyNotFoundException</code>.</p>\\n         </note>\\n         <p>To conditionally attach a policy when no policy exists for the resource, specify\\n                <code>NO_POLICY</code> for the revision ID.</p>\"\n                    }\n                },\n                \"ConfirmRemoveSelfResourceAccess\": {\n                    \"target\": \"com.amazonaws.dynamodb#ConfirmRemoveSelfResourceAccess\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Set this parameter to <code>true</code> to confirm that you want to remove your\\n            permissions to change the policy of this resource in the future.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amz-confirm-remove-self-resource-access\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#PutResourcePolicyOutput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RevisionId\": {\n                    \"target\": \"com.amazonaws.dynamodb#PolicyRevisionId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A unique string that represents the revision ID of the policy. If you're comparing revision IDs, make sure to always use string comparison logic.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#Query\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.dynamodb#QueryInput\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.dynamodb#QueryOutput\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InvalidEndpointException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ProvisionedThroughputExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#RequestLimitExceeded\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ThrottlingException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#clientDiscoveredEndpoint\": {\n                    \"required\": false\n                },\n                \"smithy.api#documentation\": \"<p>You must provide the name of the partition key attribute and a single value for that\\n            attribute. <code>Query</code> returns all items with that partition key value.\\n            Optionally, you can provide a sort key attribute and use a comparison operator to refine\\n            the search results.</p>\\n         <p>Use the <code>KeyConditionExpression</code> parameter to provide a specific value for\\n            the partition key. The <code>Query</code> operation will return all of the items from\\n            the table or index with that partition key value. You can optionally narrow the scope of\\n            the <code>Query</code> operation by specifying a sort key value and a comparison\\n            operator in <code>KeyConditionExpression</code>. To further refine the\\n                <code>Query</code> results, you can optionally provide a\\n                <code>FilterExpression</code>. A <code>FilterExpression</code> determines which\\n            items within the results should be returned to you. All of the other results are\\n            discarded. </p>\\n         <p> A <code>Query</code> operation always returns a result set. If no matching items are\\n            found, the result set will be empty. Queries that do not return results consume the\\n            minimum number of read capacity units for that type of read operation. </p>\\n         <note>\\n            <p> DynamoDB calculates the number of read capacity units consumed based on item\\n                size, not on the amount of data that is returned to an application. The number of\\n                capacity units consumed will be the same whether you request all of the attributes\\n                (the default behavior) or just some of them (using a projection expression). The\\n                number will also be the same whether or not you use a <code>FilterExpression</code>.\\n            </p>\\n         </note>\\n         <p>\\n            <code>Query</code> results are always sorted by the sort key value. If the data type of\\n            the sort key is Number, the results are returned in numeric order; otherwise, the\\n            results are returned in order of UTF-8 bytes. By default, the sort order is ascending.\\n            To reverse the order, set the <code>ScanIndexForward</code> parameter to false. </p>\\n         <p> A single <code>Query</code> operation will read up to the maximum number of items set\\n            (if using the <code>Limit</code> parameter) or a maximum of 1 MB of data and then apply\\n            any filtering to the results using <code>FilterExpression</code>. If\\n                <code>LastEvaluatedKey</code> is present in the response, you will need to paginate\\n            the result set. For more information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Query.html#Query.Pagination\\\">Paginating\\n                the Results</a> in the <i>Amazon DynamoDB Developer Guide</i>. </p>\\n         <p>\\n            <code>FilterExpression</code> is applied after a <code>Query</code> finishes, but before\\n            the results are returned. A <code>FilterExpression</code> cannot contain partition key\\n            or sort key attributes. You need to specify those attributes in the\\n                <code>KeyConditionExpression</code>. </p>\\n         <note>\\n            <p> A <code>Query</code> operation can return an empty result set and a\\n                    <code>LastEvaluatedKey</code> if all the items read for the page of results are\\n                filtered out. </p>\\n         </note>\\n         <p>You can query a table, a local secondary index, or a global secondary index. For a\\n            query on a table or on a local secondary index, you can set the\\n                <code>ConsistentRead</code> parameter to <code>true</code> and obtain a strongly\\n            consistent result. Global secondary indexes support eventually consistent reads only, so\\n            do not specify <code>ConsistentRead</code> when querying a global secondary\\n            index.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To query an item\",\n                        \"documentation\": \"This example queries items in the Music table. The table has a partition key and sort key (Artist and SongTitle), but this query only specifies the partition key value. It returns song titles by the artist named \\\"No One You Know\\\".\",\n                        \"input\": {\n                            \"TableName\": \"Music\",\n                            \"ProjectionExpression\": \"SongTitle\",\n                            \"KeyConditionExpression\": \"Artist = :v1\",\n                            \"ExpressionAttributeValues\": {\n                                \":v1\": {\n                                    \"S\": \"No One You Know\"\n                                }\n                            }\n                        },\n                        \"output\": {\n                            \"Count\": 2,\n                            \"Items\": [\n                                {\n                                    \"SongTitle\": {\n                                        \"S\": \"Call Me Today\"\n                                    }\n                                }\n                            ],\n                            \"ScannedCount\": 2,\n                            \"ConsumedCapacity\": {}\n                        }\n                    }\n                ],\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"ExclusiveStartKey\",\n                    \"outputToken\": \"LastEvaluatedKey\",\n                    \"items\": \"Items\",\n                    \"pageSize\": \"Limit\"\n                },\n                \"smithy.api#suppress\": [\n                    \"PaginatedTrait\"\n                ]\n            }\n        },\n        \"com.amazonaws.dynamodb#QueryInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TableName\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the table containing the requested items. You can also provide the\\n            Amazon Resource Name (ARN) of the table in this parameter.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"ResourceArn\"\n                        }\n                    }\n                },\n                \"IndexName\": {\n                    \"target\": \"com.amazonaws.dynamodb#IndexName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of an index to query. This index can be any local secondary index or global\\n            secondary index on the table. Note that if you use the <code>IndexName</code> parameter,\\n            you must also provide <code>TableName.</code>\\n         </p>\"\n                    }\n                },\n                \"Select\": {\n                    \"target\": \"com.amazonaws.dynamodb#Select\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The attributes to be returned in the result. You can retrieve all item attributes,\\n            specific item attributes, the count of matching items, or in the case of an index, some\\n            or all of the attributes projected into the index.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>ALL_ATTRIBUTES</code> - Returns all of the item attributes from the\\n                    specified table or index. If you query a local secondary index, then for each\\n                    matching item in the index, DynamoDB fetches the entire item from the parent\\n                    table. If the index is configured to project all item attributes, then all of\\n                    the data can be obtained from the local secondary index, and no fetching is\\n                    required.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ALL_PROJECTED_ATTRIBUTES</code> - Allowed only when querying an index.\\n                    Retrieves all attributes that have been projected into the index. If the index\\n                    is configured to project all attributes, this return value is equivalent to\\n                    specifying <code>ALL_ATTRIBUTES</code>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>COUNT</code> - Returns the number of matching items, rather than the\\n                    matching items themselves. Note that this uses the same quantity of read\\n                    capacity units as getting the items, and is subject to the same item size\\n                    calculations.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>SPECIFIC_ATTRIBUTES</code> - Returns only the attributes listed in\\n                        <code>ProjectionExpression</code>. This return value is equivalent to\\n                    specifying <code>ProjectionExpression</code> without specifying any value for\\n                        <code>Select</code>.</p>\\n               <p>If you query or scan a local secondary index and request only attributes that\\n                    are projected into that index, the operation will read only the index and not\\n                    the table. If any of the requested attributes are not projected into the local\\n                    secondary index, DynamoDB fetches each of these attributes from the parent\\n                    table. This extra fetching incurs additional throughput cost and latency.</p>\\n               <p>If you query or scan a global secondary index, you can only request attributes\\n                    that are projected into the index. Global secondary index queries cannot fetch\\n                    attributes from the parent table.</p>\\n            </li>\\n         </ul>\\n         <p>If neither <code>Select</code> nor <code>ProjectionExpression</code> are specified,\\n            DynamoDB defaults to <code>ALL_ATTRIBUTES</code> when accessing a table, and\\n                <code>ALL_PROJECTED_ATTRIBUTES</code> when accessing an index. You cannot use both\\n                <code>Select</code> and <code>ProjectionExpression</code> together in a single\\n            request, unless the value for <code>Select</code> is <code>SPECIFIC_ATTRIBUTES</code>.\\n            (This usage is equivalent to specifying <code>ProjectionExpression</code> without any\\n            value for <code>Select</code>.)</p>\\n         <note>\\n            <p>If you use the <code>ProjectionExpression</code> parameter, then the value for\\n                    <code>Select</code> can only be <code>SPECIFIC_ATTRIBUTES</code>. Any other\\n                value for <code>Select</code> will return an error.</p>\\n         </note>\"\n                    }\n                },\n                \"AttributesToGet\": {\n                    \"target\": \"com.amazonaws.dynamodb#AttributeNameList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>This is a legacy parameter. Use <code>ProjectionExpression</code> instead. For more\\n            information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/LegacyConditionalParameters.AttributesToGet.html\\\">AttributesToGet</a> in the <i>Amazon DynamoDB Developer\\n            Guide</i>.</p>\"\n                    }\n                },\n                \"Limit\": {\n                    \"target\": \"com.amazonaws.dynamodb#PositiveIntegerObject\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of items to evaluate (not necessarily the number of matching\\n            items). If DynamoDB processes the number of items up to the limit while processing the\\n            results, it stops the operation and returns the matching values up to that point, and a\\n            key in <code>LastEvaluatedKey</code> to apply in a subsequent operation, so that you can\\n            pick up where you left off. Also, if the processed dataset size exceeds 1 MB before\\n            DynamoDB reaches this limit, it stops the operation and returns the matching values up\\n            to the limit, and a key in <code>LastEvaluatedKey</code> to apply in a subsequent\\n            operation to continue the operation. For more information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/QueryAndScan.html\\\">Query and Scan</a> in the <i>Amazon DynamoDB Developer\\n            Guide</i>.</p>\"\n                    }\n                },\n                \"ConsistentRead\": {\n                    \"target\": \"com.amazonaws.dynamodb#ConsistentRead\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Determines the read consistency model: If set to <code>true</code>, then the operation\\n            uses strongly consistent reads; otherwise, the operation uses eventually consistent\\n            reads.</p>\\n         <p>Strongly consistent reads are not supported on global secondary indexes. If you query\\n            a global secondary index with <code>ConsistentRead</code> set to <code>true</code>, you\\n            will receive a <code>ValidationException</code>.</p>\"\n                    }\n                },\n                \"KeyConditions\": {\n                    \"target\": \"com.amazonaws.dynamodb#KeyConditions\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>This is a legacy parameter. Use <code>KeyConditionExpression</code> instead. For more\\n            information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/LegacyConditionalParameters.KeyConditions.html\\\">KeyConditions</a> in the <i>Amazon DynamoDB Developer\\n            Guide</i>.</p>\"\n                    }\n                },\n                \"QueryFilter\": {\n                    \"target\": \"com.amazonaws.dynamodb#FilterConditionMap\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>This is a legacy parameter. Use <code>FilterExpression</code> instead. For more\\n            information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/LegacyConditionalParameters.QueryFilter.html\\\">QueryFilter</a> in the <i>Amazon DynamoDB Developer\\n            Guide</i>.</p>\"\n                    }\n                },\n                \"ConditionalOperator\": {\n                    \"target\": \"com.amazonaws.dynamodb#ConditionalOperator\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>This is a legacy parameter. Use <code>FilterExpression</code> instead. For more\\n            information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/LegacyConditionalParameters.ConditionalOperator.html\\\">ConditionalOperator</a> in the <i>Amazon DynamoDB Developer\\n                Guide</i>.</p>\"\n                    }\n                },\n                \"ScanIndexForward\": {\n                    \"target\": \"com.amazonaws.dynamodb#BooleanObject\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the order for index traversal: If <code>true</code> (default), the traversal\\n            is performed in ascending order; if <code>false</code>, the traversal is performed in\\n            descending order. </p>\\n         <p>Items with the same partition key value are stored in sorted order by sort key. If the\\n            sort key data type is Number, the results are stored in numeric order. For type String,\\n            the results are stored in order of UTF-8 bytes. For type Binary, DynamoDB treats each\\n            byte of the binary data as unsigned.</p>\\n         <p>If <code>ScanIndexForward</code> is <code>true</code>, DynamoDB returns the results in\\n            the order in which they are stored (by sort key value). This is the default behavior. If\\n                <code>ScanIndexForward</code> is <code>false</code>, DynamoDB reads the results in\\n            reverse order by sort key value, and then returns the results to the client.</p>\"\n                    }\n                },\n                \"ExclusiveStartKey\": {\n                    \"target\": \"com.amazonaws.dynamodb#Key\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The primary key of the first item that this operation will evaluate. Use the value\\n            that was returned for <code>LastEvaluatedKey</code> in the previous operation.</p>\\n         <p>The data type for <code>ExclusiveStartKey</code> must be String, Number, or Binary. No\\n            set data types are allowed.</p>\"\n                    }\n                },\n                \"ReturnConsumedCapacity\": {\n                    \"target\": \"com.amazonaws.dynamodb#ReturnConsumedCapacity\"\n                },\n                \"ProjectionExpression\": {\n                    \"target\": \"com.amazonaws.dynamodb#ProjectionExpression\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A string that identifies one or more attributes to retrieve from the table. These\\n            attributes can include scalars, sets, or elements of a JSON document. The attributes in\\n            the expression must be separated by commas.</p>\\n         <p>If no attribute names are specified, then all attributes will be returned. If any of\\n            the requested attributes are not found, they will not appear in the result.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.AccessingItemAttributes.html\\\">Accessing Item Attributes</a> in the <i>Amazon DynamoDB Developer\\n                Guide</i>.</p>\"\n                    }\n                },\n                \"FilterExpression\": {\n                    \"target\": \"com.amazonaws.dynamodb#ConditionExpression\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A string that contains conditions that DynamoDB applies after the <code>Query</code>\\n            operation, but before the data is returned to you. Items that do not satisfy the\\n                <code>FilterExpression</code> criteria are not returned.</p>\\n         <p>A <code>FilterExpression</code> does not allow key attributes. You cannot define a\\n            filter expression based on a partition key or a sort key.</p>\\n         <note>\\n            <p>A <code>FilterExpression</code> is applied after the items have already been read;\\n                the process of filtering does not consume any additional read capacity units.</p>\\n         </note>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Query.FilterExpression.html\\\">Filter\\n                Expressions</a> in the <i>Amazon DynamoDB Developer\\n            Guide</i>.</p>\"\n                    }\n                },\n                \"KeyConditionExpression\": {\n                    \"target\": \"com.amazonaws.dynamodb#KeyExpression\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The condition that specifies the key values for items to be retrieved by the\\n                <code>Query</code> action.</p>\\n         <p>The condition must perform an equality test on a single partition key value.</p>\\n         <p>The condition can optionally perform one of several comparison tests on a single sort\\n            key value. This allows <code>Query</code> to retrieve one item with a given partition\\n            key value and sort key value, or several items that have the same partition key value\\n            but different sort key values.</p>\\n         <p>The partition key equality test is required, and must be specified in the following\\n            format:</p>\\n         <p>\\n            <code>partitionKeyName</code>\\n            <i>=</i>\\n            <code>:partitionkeyval</code>\\n         </p>\\n         <p>If you also want to provide a condition for the sort key, it must be combined using\\n                <code>AND</code> with the condition for the sort key. Following is an example, using\\n            the <b>=</b> comparison operator for the sort key:</p>\\n         <p>\\n            <code>partitionKeyName</code>\\n            <code>=</code>\\n            <code>:partitionkeyval</code>\\n            <code>AND</code>\\n            <code>sortKeyName</code>\\n            <code>=</code>\\n            <code>:sortkeyval</code>\\n         </p>\\n         <p>Valid comparisons for the sort key condition are as follows:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>sortKeyName</code>\\n                  <code>=</code>\\n                  <code>:sortkeyval</code> - true if the sort key value is equal to\\n                        <code>:sortkeyval</code>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>sortKeyName</code>\\n                  <code><</code>\\n                  <code>:sortkeyval</code> - true if the sort key value is less than\\n                        <code>:sortkeyval</code>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>sortKeyName</code>\\n                  <code><=</code>\\n                  <code>:sortkeyval</code> - true if the sort key value is less than or equal to\\n                        <code>:sortkeyval</code>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>sortKeyName</code>\\n                  <code>></code>\\n                  <code>:sortkeyval</code> - true if the sort key value is greater than\\n                        <code>:sortkeyval</code>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>sortKeyName</code>\\n                  <code>>= </code>\\n                  <code>:sortkeyval</code> - true if the sort key value is greater than or equal\\n                    to <code>:sortkeyval</code>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>sortKeyName</code>\\n                  <code>BETWEEN</code>\\n                  <code>:sortkeyval1</code>\\n                  <code>AND</code>\\n                  <code>:sortkeyval2</code> - true if the sort key value is greater than or equal\\n                    to <code>:sortkeyval1</code>, and less than or equal to\\n                        <code>:sortkeyval2</code>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>begins_with (</code>\\n                  <code>sortKeyName</code>, <code>:sortkeyval</code>\\n                  <code>)</code> - true if the sort key value begins with a particular operand.\\n                    (You cannot use this function with a sort key that is of type Number.) Note that\\n                    the function name <code>begins_with</code> is case-sensitive.</p>\\n            </li>\\n         </ul>\\n         <p>Use the <code>ExpressionAttributeValues</code> parameter to replace tokens such as\\n                <code>:partitionval</code> and <code>:sortval</code> with actual values at\\n            runtime.</p>\\n         <p>You can optionally use the <code>ExpressionAttributeNames</code> parameter to replace\\n            the names of the partition key and sort key with placeholder tokens. This option might\\n            be necessary if an attribute name conflicts with a DynamoDB reserved word. For example,\\n            the following <code>KeyConditionExpression</code> parameter causes an error because\\n                <i>Size</i> is a reserved word:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>Size = :myval</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>To work around this, define a placeholder (such a <code>#S</code>) to represent the\\n            attribute name <i>Size</i>. <code>KeyConditionExpression</code> then is as\\n            follows:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>#S = :myval</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>For a list of reserved words, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ReservedWords.html\\\">Reserved Words</a>\\n            in the <i>Amazon DynamoDB Developer Guide</i>.</p>\\n         <p>For more information on <code>ExpressionAttributeNames</code> and\\n                <code>ExpressionAttributeValues</code>, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ExpressionPlaceholders.html\\\">Using\\n                Placeholders for Attribute Names and Values</a> in the <i>Amazon DynamoDB\\n                Developer Guide</i>.</p>\"\n                    }\n                },\n                \"ExpressionAttributeNames\": {\n                    \"target\": \"com.amazonaws.dynamodb#ExpressionAttributeNameMap\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more substitution tokens for attribute names in an expression. The following\\n            are some use cases for using <code>ExpressionAttributeNames</code>:</p>\\n         <ul>\\n            <li>\\n               <p>To access an attribute whose name conflicts with a DynamoDB reserved\\n                    word.</p>\\n            </li>\\n            <li>\\n               <p>To create a placeholder for repeating occurrences of an attribute name in an\\n                    expression.</p>\\n            </li>\\n            <li>\\n               <p>To prevent special characters in an attribute name from being misinterpreted\\n                    in an expression.</p>\\n            </li>\\n         </ul>\\n         <p>Use the <b>#</b> character in an expression to dereference\\n            an attribute name. For example, consider the following attribute name:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>Percentile</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>The name of this attribute conflicts with a reserved word, so it cannot be used\\n            directly in an expression. (For the complete list of reserved words, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ReservedWords.html\\\">Reserved Words</a> in the <i>Amazon DynamoDB Developer\\n            Guide</i>). To work around this, you could specify the following for\\n                <code>ExpressionAttributeNames</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>{\\\"#P\\\":\\\"Percentile\\\"}</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>You could then use this substitution in an expression, as in this example:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>#P = :val</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <note>\\n            <p>Tokens that begin with the <b>:</b> character are\\n                    <i>expression attribute values</i>, which are placeholders for the\\n                actual value at runtime.</p>\\n         </note>\\n         <p>For more information on expression attribute names, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.AccessingItemAttributes.html\\\">Specifying Item Attributes</a> in the <i>Amazon DynamoDB Developer\\n                Guide</i>.</p>\"\n                    }\n                },\n                \"ExpressionAttributeValues\": {\n                    \"target\": \"com.amazonaws.dynamodb#ExpressionAttributeValueMap\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more values that can be substituted in an expression.</p>\\n         <p>Use the <b>:</b> (colon) character in an expression to\\n            dereference an attribute value. For example, suppose that you wanted to check whether\\n            the value of the <i>ProductStatus</i> attribute was one of the following: </p>\\n         <p>\\n            <code>Available | Backordered | Discontinued</code>\\n         </p>\\n         <p>You would first need to specify <code>ExpressionAttributeValues</code> as\\n            follows:</p>\\n         <p>\\n            <code>{ \\\":avail\\\":{\\\"S\\\":\\\"Available\\\"}, \\\":back\\\":{\\\"S\\\":\\\"Backordered\\\"},\\n                \\\":disc\\\":{\\\"S\\\":\\\"Discontinued\\\"} }</code>\\n         </p>\\n         <p>You could then use these values in an expression, such as this:</p>\\n         <p>\\n            <code>ProductStatus IN (:avail, :back, :disc)</code>\\n         </p>\\n         <p>For more information on expression attribute values, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.SpecifyingConditions.html\\\">Specifying Conditions</a> in the <i>Amazon DynamoDB Developer\\n                Guide</i>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents the input of a <code>Query</code> operation.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#QueryOutput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Items\": {\n                    \"target\": \"com.amazonaws.dynamodb#ItemList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An array of item attributes that match the query criteria. Each element in this array\\n            consists of an attribute name and the value for that attribute.</p>\"\n                    }\n                },\n                \"Count\": {\n                    \"target\": \"com.amazonaws.dynamodb#Integer\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The number of items in the response.</p>\\n         <p>If you used a <code>QueryFilter</code> in the request, then <code>Count</code> is the\\n            number of items returned after the filter was applied, and <code>ScannedCount</code> is\\n            the number of matching items before the filter was applied.</p>\\n         <p>If you did not use a filter in the request, then <code>Count</code> and\\n                <code>ScannedCount</code> are the same.</p>\"\n                    }\n                },\n                \"ScannedCount\": {\n                    \"target\": \"com.amazonaws.dynamodb#Integer\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The number of items evaluated, before any <code>QueryFilter</code> is applied. A high\\n                <code>ScannedCount</code> value with few, or no, <code>Count</code> results\\n            indicates an inefficient <code>Query</code> operation. For more information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Scan.html#Scan.Count\\\">Count and ScannedCount</a> in the <i>Amazon DynamoDB Developer\\n                Guide</i>.</p>\\n         <p>If you did not use a filter in the request, then <code>ScannedCount</code> is the same\\n            as <code>Count</code>.</p>\"\n                    }\n                },\n                \"LastEvaluatedKey\": {\n                    \"target\": \"com.amazonaws.dynamodb#Key\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The primary key of the item where the operation stopped, inclusive of the previous\\n            result set. Use this value to start a new operation, excluding this value in the new\\n            request.</p>\\n         <p>If <code>LastEvaluatedKey</code> is empty, then the \\\"last page\\\" of results has been\\n            processed and there is no more data to be retrieved.</p>\\n         <p>If <code>LastEvaluatedKey</code> is not empty, it does not necessarily mean that there\\n            is more data in the result set. The only way to know when you have reached the end of\\n            the result set is when <code>LastEvaluatedKey</code> is empty.</p>\"\n                    }\n                },\n                \"ConsumedCapacity\": {\n                    \"target\": \"com.amazonaws.dynamodb#ConsumedCapacity\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The capacity units consumed by the <code>Query</code> operation. The data returned\\n            includes the total provisioned throughput consumed, along with statistics for the table\\n            and any indexes involved in the operation. <code>ConsumedCapacity</code> is only\\n            returned if the <code>ReturnConsumedCapacity</code> parameter was specified. For more\\n            information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/read-write-operations.html#read-operation-consumption\\\">Capacity unit consumption for read operations</a> in the <i>Amazon\\n                DynamoDB Developer Guide</i>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents the output of a <code>Query</code> operation.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#Reason\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.dynamodb#RecoveryPeriodInDays\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 35\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#RegionName\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.dynamodb#Replica\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RegionName\": {\n                    \"target\": \"com.amazonaws.dynamodb#RegionName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Region where the replica needs to be created.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents the properties of a replica.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#ReplicaAlreadyExistsException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.dynamodb#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The specified replica is already part of the global table.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.dynamodb#ReplicaAutoScalingDescription\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RegionName\": {\n                    \"target\": \"com.amazonaws.dynamodb#RegionName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Region where the replica exists.</p>\"\n                    }\n                },\n                \"GlobalSecondaryIndexes\": {\n                    \"target\": \"com.amazonaws.dynamodb#ReplicaGlobalSecondaryIndexAutoScalingDescriptionList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Replica-specific global secondary index auto scaling settings.</p>\"\n                    }\n                },\n                \"ReplicaProvisionedReadCapacityAutoScalingSettings\": {\n                    \"target\": \"com.amazonaws.dynamodb#AutoScalingSettingsDescription\"\n                },\n                \"ReplicaProvisionedWriteCapacityAutoScalingSettings\": {\n                    \"target\": \"com.amazonaws.dynamodb#AutoScalingSettingsDescription\"\n                },\n                \"ReplicaStatus\": {\n                    \"target\": \"com.amazonaws.dynamodb#ReplicaStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The current state of the replica:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>CREATING</code> - The replica is being created.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>UPDATING</code> - The replica is being updated.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>DELETING</code> - The replica is being deleted.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ACTIVE</code> - The replica is ready for use.</p>\\n            </li>\\n         </ul>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents the auto scaling settings of the replica.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#ReplicaAutoScalingDescriptionList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.dynamodb#ReplicaAutoScalingDescription\"\n            }\n        },\n        \"com.amazonaws.dynamodb#ReplicaAutoScalingUpdate\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RegionName\": {\n                    \"target\": \"com.amazonaws.dynamodb#RegionName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Region where the replica exists.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ReplicaGlobalSecondaryIndexUpdates\": {\n                    \"target\": \"com.amazonaws.dynamodb#ReplicaGlobalSecondaryIndexAutoScalingUpdateList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Represents the auto scaling settings of global secondary indexes that will be\\n            modified.</p>\"\n                    }\n                },\n                \"ReplicaProvisionedReadCapacityAutoScalingUpdate\": {\n                    \"target\": \"com.amazonaws.dynamodb#AutoScalingSettingsUpdate\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents the auto scaling settings of a replica that will be modified.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#ReplicaAutoScalingUpdateList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.dynamodb#ReplicaAutoScalingUpdate\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#ReplicaDescription\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RegionName\": {\n                    \"target\": \"com.amazonaws.dynamodb#RegionName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the Region.</p>\"\n                    }\n                },\n                \"ReplicaStatus\": {\n                    \"target\": \"com.amazonaws.dynamodb#ReplicaStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The current state of the replica:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>CREATING</code> - The replica is being created.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>UPDATING</code> - The replica is being updated.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>DELETING</code> - The replica is being deleted.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ACTIVE</code> - The replica is ready for use.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>REGION_DISABLED</code> - The replica is inaccessible because the Amazon Web Services Region has been disabled.</p>\\n               <note>\\n                  <p>If the Amazon Web Services Region remains inaccessible for more than 20\\n                        hours, DynamoDB will remove this replica from the replication\\n                        group. The replica will not be deleted and replication will stop from and to\\n                        this region.</p>\\n               </note>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>INACCESSIBLE_ENCRYPTION_CREDENTIALS </code> - The KMS key\\n                    used to encrypt the table is inaccessible.</p>\\n               <note>\\n                  <p>If the KMS key remains inaccessible for more than 20 hours,\\n                            DynamoDB will remove this replica from the replication group.\\n                        The replica will not be deleted and replication will stop from and to this\\n                        region.</p>\\n               </note>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"ReplicaStatusDescription\": {\n                    \"target\": \"com.amazonaws.dynamodb#ReplicaStatusDescription\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Detailed information about the replica status.</p>\"\n                    }\n                },\n                \"ReplicaStatusPercentProgress\": {\n                    \"target\": \"com.amazonaws.dynamodb#ReplicaStatusPercentProgress\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the progress of a Create, Update, or Delete action on the replica as a\\n            percentage.</p>\"\n                    }\n                },\n                \"KMSMasterKeyId\": {\n                    \"target\": \"com.amazonaws.dynamodb#KMSMasterKeyId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The KMS key of the replica that will be used for KMS\\n            encryption.</p>\"\n                    }\n                },\n                \"ProvisionedThroughputOverride\": {\n                    \"target\": \"com.amazonaws.dynamodb#ProvisionedThroughputOverride\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Replica-specific provisioned throughput. If not described, uses the source table's\\n            provisioned throughput settings.</p>\"\n                    }\n                },\n                \"OnDemandThroughputOverride\": {\n                    \"target\": \"com.amazonaws.dynamodb#OnDemandThroughputOverride\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Overrides the maximum on-demand throughput settings for the specified replica\\n            table.</p>\"\n                    }\n                },\n                \"WarmThroughput\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableWarmThroughputDescription\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Represents the warm throughput value for this replica.</p>\"\n                    }\n                },\n                \"GlobalSecondaryIndexes\": {\n                    \"target\": \"com.amazonaws.dynamodb#ReplicaGlobalSecondaryIndexDescriptionList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Replica-specific global secondary index settings.</p>\"\n                    }\n                },\n                \"ReplicaInaccessibleDateTime\": {\n                    \"target\": \"com.amazonaws.dynamodb#Date\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time at which the replica was first detected as inaccessible. To determine cause\\n            of inaccessibility check the <code>ReplicaStatus</code> property.</p>\"\n                    }\n                },\n                \"ReplicaTableClassSummary\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableClassSummary\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the details of the replica.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#ReplicaDescriptionList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.dynamodb#ReplicaDescription\"\n            }\n        },\n        \"com.amazonaws.dynamodb#ReplicaGlobalSecondaryIndex\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"IndexName\": {\n                    \"target\": \"com.amazonaws.dynamodb#IndexName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the global secondary index.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ProvisionedThroughputOverride\": {\n                    \"target\": \"com.amazonaws.dynamodb#ProvisionedThroughputOverride\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Replica table GSI-specific provisioned throughput. If not specified, uses the source\\n            table GSI's read capacity settings.</p>\"\n                    }\n                },\n                \"OnDemandThroughputOverride\": {\n                    \"target\": \"com.amazonaws.dynamodb#OnDemandThroughputOverride\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Overrides the maximum on-demand throughput settings for the specified global secondary\\n            index in the specified replica table.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents the properties of a replica global secondary index.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#ReplicaGlobalSecondaryIndexAutoScalingDescription\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"IndexName\": {\n                    \"target\": \"com.amazonaws.dynamodb#IndexName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the global secondary index.</p>\"\n                    }\n                },\n                \"IndexStatus\": {\n                    \"target\": \"com.amazonaws.dynamodb#IndexStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The current state of the replica global secondary index:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>CREATING</code> - The index is being created.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>UPDATING</code> - The table/index configuration is being updated. The\\n                    table/index remains available for data operations when\\n                    <code>UPDATING</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>DELETING</code> - The index is being deleted.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ACTIVE</code> - The index is ready for use.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"ProvisionedReadCapacityAutoScalingSettings\": {\n                    \"target\": \"com.amazonaws.dynamodb#AutoScalingSettingsDescription\"\n                },\n                \"ProvisionedWriteCapacityAutoScalingSettings\": {\n                    \"target\": \"com.amazonaws.dynamodb#AutoScalingSettingsDescription\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents the auto scaling configuration for a replica global secondary index.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#ReplicaGlobalSecondaryIndexAutoScalingDescriptionList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.dynamodb#ReplicaGlobalSecondaryIndexAutoScalingDescription\"\n            }\n        },\n        \"com.amazonaws.dynamodb#ReplicaGlobalSecondaryIndexAutoScalingUpdate\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"IndexName\": {\n                    \"target\": \"com.amazonaws.dynamodb#IndexName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the global secondary index.</p>\"\n                    }\n                },\n                \"ProvisionedReadCapacityAutoScalingUpdate\": {\n                    \"target\": \"com.amazonaws.dynamodb#AutoScalingSettingsUpdate\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents the auto scaling settings of a global secondary index for a replica that\\n            will be modified.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#ReplicaGlobalSecondaryIndexAutoScalingUpdateList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.dynamodb#ReplicaGlobalSecondaryIndexAutoScalingUpdate\"\n            }\n        },\n        \"com.amazonaws.dynamodb#ReplicaGlobalSecondaryIndexDescription\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"IndexName\": {\n                    \"target\": \"com.amazonaws.dynamodb#IndexName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the global secondary index.</p>\"\n                    }\n                },\n                \"ProvisionedThroughputOverride\": {\n                    \"target\": \"com.amazonaws.dynamodb#ProvisionedThroughputOverride\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If not described, uses the source table GSI's read capacity settings.</p>\"\n                    }\n                },\n                \"OnDemandThroughputOverride\": {\n                    \"target\": \"com.amazonaws.dynamodb#OnDemandThroughputOverride\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Overrides the maximum on-demand throughput for the specified global secondary index in\\n            the specified replica table.</p>\"\n                    }\n                },\n                \"WarmThroughput\": {\n                    \"target\": \"com.amazonaws.dynamodb#GlobalSecondaryIndexWarmThroughputDescription\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Represents the warm throughput of the global secondary index for this replica.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents the properties of a replica global secondary index.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#ReplicaGlobalSecondaryIndexDescriptionList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.dynamodb#ReplicaGlobalSecondaryIndexDescription\"\n            }\n        },\n        \"com.amazonaws.dynamodb#ReplicaGlobalSecondaryIndexList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.dynamodb#ReplicaGlobalSecondaryIndex\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#ReplicaGlobalSecondaryIndexSettingsDescription\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"IndexName\": {\n                    \"target\": \"com.amazonaws.dynamodb#IndexName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the global secondary index. The name must be unique among all other\\n            indexes on this table.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"IndexStatus\": {\n                    \"target\": \"com.amazonaws.dynamodb#IndexStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The current status of the global secondary index:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>CREATING</code> - The global secondary index is being created.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>UPDATING</code> - The global secondary index is being updated.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>DELETING</code> - The global secondary index is being deleted.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ACTIVE</code> - The global secondary index is ready for use.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"ProvisionedReadCapacityUnits\": {\n                    \"target\": \"com.amazonaws.dynamodb#PositiveLongObject\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of strongly consistent reads consumed per second before DynamoDB\\n            returns a <code>ThrottlingException</code>.</p>\"\n                    }\n                },\n                \"ProvisionedReadCapacityAutoScalingSettings\": {\n                    \"target\": \"com.amazonaws.dynamodb#AutoScalingSettingsDescription\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Auto scaling settings for a global secondary index replica's read capacity\\n            units.</p>\"\n                    }\n                },\n                \"ProvisionedWriteCapacityUnits\": {\n                    \"target\": \"com.amazonaws.dynamodb#PositiveLongObject\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of writes consumed per second before DynamoDB returns a\\n                <code>ThrottlingException</code>.</p>\"\n                    }\n                },\n                \"ProvisionedWriteCapacityAutoScalingSettings\": {\n                    \"target\": \"com.amazonaws.dynamodb#AutoScalingSettingsDescription\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Auto scaling settings for a global secondary index replica's write capacity\\n            units.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents the properties of a global secondary index.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#ReplicaGlobalSecondaryIndexSettingsDescriptionList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.dynamodb#ReplicaGlobalSecondaryIndexSettingsDescription\"\n            }\n        },\n        \"com.amazonaws.dynamodb#ReplicaGlobalSecondaryIndexSettingsUpdate\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"IndexName\": {\n                    \"target\": \"com.amazonaws.dynamodb#IndexName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the global secondary index. The name must be unique among all other\\n            indexes on this table.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ProvisionedReadCapacityUnits\": {\n                    \"target\": \"com.amazonaws.dynamodb#PositiveLongObject\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of strongly consistent reads consumed per second before DynamoDB\\n            returns a <code>ThrottlingException</code>.</p>\"\n                    }\n                },\n                \"ProvisionedReadCapacityAutoScalingSettingsUpdate\": {\n                    \"target\": \"com.amazonaws.dynamodb#AutoScalingSettingsUpdate\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Auto scaling settings for managing a global secondary index replica's read capacity\\n            units.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents the settings of a global secondary index for a global table that will be\\n            modified.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#ReplicaGlobalSecondaryIndexSettingsUpdateList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.dynamodb#ReplicaGlobalSecondaryIndexSettingsUpdate\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 20\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#ReplicaList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.dynamodb#Replica\"\n            }\n        },\n        \"com.amazonaws.dynamodb#ReplicaNotFoundException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.dynamodb#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The specified replica is no longer part of the global table.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.dynamodb#ReplicaSettingsDescription\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RegionName\": {\n                    \"target\": \"com.amazonaws.dynamodb#RegionName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Region name of the replica.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ReplicaStatus\": {\n                    \"target\": \"com.amazonaws.dynamodb#ReplicaStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The current state of the Region:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>CREATING</code> - The Region is being created.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>UPDATING</code> - The Region is being updated.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>DELETING</code> - The Region is being deleted.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ACTIVE</code> - The Region is ready for use.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"ReplicaBillingModeSummary\": {\n                    \"target\": \"com.amazonaws.dynamodb#BillingModeSummary\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The read/write capacity mode of the replica.</p>\"\n                    }\n                },\n                \"ReplicaProvisionedReadCapacityUnits\": {\n                    \"target\": \"com.amazonaws.dynamodb#NonNegativeLongObject\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of strongly consistent reads consumed per second before DynamoDB\\n            returns a <code>ThrottlingException</code>. For more information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/WorkingWithTables.html#ProvisionedThroughput\\\">Specifying Read and Write Requirements</a> in the <i>Amazon DynamoDB\\n                Developer Guide</i>. </p>\"\n                    }\n                },\n                \"ReplicaProvisionedReadCapacityAutoScalingSettings\": {\n                    \"target\": \"com.amazonaws.dynamodb#AutoScalingSettingsDescription\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Auto scaling settings for a global table replica's read capacity units.</p>\"\n                    }\n                },\n                \"ReplicaProvisionedWriteCapacityUnits\": {\n                    \"target\": \"com.amazonaws.dynamodb#NonNegativeLongObject\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of writes consumed per second before DynamoDB returns a\\n                <code>ThrottlingException</code>. For more information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/WorkingWithTables.html#ProvisionedThroughput\\\">Specifying Read and Write Requirements</a> in the <i>Amazon DynamoDB\\n                Developer Guide</i>.</p>\"\n                    }\n                },\n                \"ReplicaProvisionedWriteCapacityAutoScalingSettings\": {\n                    \"target\": \"com.amazonaws.dynamodb#AutoScalingSettingsDescription\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Auto scaling settings for a global table replica's write capacity units.</p>\"\n                    }\n                },\n                \"ReplicaGlobalSecondaryIndexSettings\": {\n                    \"target\": \"com.amazonaws.dynamodb#ReplicaGlobalSecondaryIndexSettingsDescriptionList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Replica global secondary index settings for the global table.</p>\"\n                    }\n                },\n                \"ReplicaTableClassSummary\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableClassSummary\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents the properties of a replica.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#ReplicaSettingsDescriptionList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.dynamodb#ReplicaSettingsDescription\"\n            }\n        },\n        \"com.amazonaws.dynamodb#ReplicaSettingsUpdate\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RegionName\": {\n                    \"target\": \"com.amazonaws.dynamodb#RegionName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Region of the replica to be added.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ReplicaProvisionedReadCapacityUnits\": {\n                    \"target\": \"com.amazonaws.dynamodb#PositiveLongObject\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of strongly consistent reads consumed per second before DynamoDB\\n            returns a <code>ThrottlingException</code>. For more information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/WorkingWithTables.html#ProvisionedThroughput\\\">Specifying Read and Write Requirements</a> in the <i>Amazon DynamoDB\\n                Developer Guide</i>. </p>\"\n                    }\n                },\n                \"ReplicaProvisionedReadCapacityAutoScalingSettingsUpdate\": {\n                    \"target\": \"com.amazonaws.dynamodb#AutoScalingSettingsUpdate\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Auto scaling settings for managing a global table replica's read capacity\\n            units.</p>\"\n                    }\n                },\n                \"ReplicaGlobalSecondaryIndexSettingsUpdate\": {\n                    \"target\": \"com.amazonaws.dynamodb#ReplicaGlobalSecondaryIndexSettingsUpdateList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Represents the settings of a global secondary index for a global table that will be\\n            modified.</p>\"\n                    }\n                },\n                \"ReplicaTableClass\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableClass\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Replica-specific table class. If not specified, uses the source table's table\\n            class.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents the settings for a global table in a Region that will be modified.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#ReplicaSettingsUpdateList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.dynamodb#ReplicaSettingsUpdate\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 50\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#ReplicaStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"CREATING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"CREATING\"\n                    }\n                },\n                \"CREATION_FAILED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"CREATION_FAILED\"\n                    }\n                },\n                \"UPDATING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"UPDATING\"\n                    }\n                },\n                \"DELETING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DELETING\"\n                    }\n                },\n                \"ACTIVE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ACTIVE\"\n                    }\n                },\n                \"REGION_DISABLED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"REGION_DISABLED\"\n                    }\n                },\n                \"INACCESSIBLE_ENCRYPTION_CREDENTIALS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"INACCESSIBLE_ENCRYPTION_CREDENTIALS\"\n                    }\n                },\n                \"ARCHIVING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ARCHIVING\"\n                    }\n                },\n                \"ARCHIVED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ARCHIVED\"\n                    }\n                },\n                \"REPLICATION_NOT_AUTHORIZED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"REPLICATION_NOT_AUTHORIZED\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#ReplicaStatusDescription\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.dynamodb#ReplicaStatusPercentProgress\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.dynamodb#ReplicaUpdate\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Create\": {\n                    \"target\": \"com.amazonaws.dynamodb#CreateReplicaAction\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The parameters required for creating a replica on an existing global table.</p>\"\n                    }\n                },\n                \"Delete\": {\n                    \"target\": \"com.amazonaws.dynamodb#DeleteReplicaAction\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the existing replica to be removed.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents one of the following:</p>\\n         <ul>\\n            <li>\\n               <p>A new replica to be added to an existing global table.</p>\\n            </li>\\n            <li>\\n               <p>New parameters for an existing replica.</p>\\n            </li>\\n            <li>\\n               <p>An existing replica to be removed from an existing global table.</p>\\n            </li>\\n         </ul>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#ReplicaUpdateList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.dynamodb#ReplicaUpdate\"\n            }\n        },\n        \"com.amazonaws.dynamodb#ReplicatedWriteConflictException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.dynamodb#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The request was rejected because one or more items in the request are being modified\\n            by a request in another Region. </p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#retryable\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#ReplicationGroupUpdate\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Create\": {\n                    \"target\": \"com.amazonaws.dynamodb#CreateReplicationGroupMemberAction\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The parameters required for creating a replica for the table.</p>\"\n                    }\n                },\n                \"Update\": {\n                    \"target\": \"com.amazonaws.dynamodb#UpdateReplicationGroupMemberAction\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The parameters required for updating a replica for the table.</p>\"\n                    }\n                },\n                \"Delete\": {\n                    \"target\": \"com.amazonaws.dynamodb#DeleteReplicationGroupMemberAction\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The parameters required for deleting a replica for the table.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents one of the following:</p>\\n         <ul>\\n            <li>\\n               <p>A new replica to be added to an existing regional table or global table. This\\n                    request invokes the <code>CreateTableReplica</code> action in the destination\\n                    Region.</p>\\n            </li>\\n            <li>\\n               <p>New parameters for an existing replica. This request invokes the\\n                        <code>UpdateTable</code> action in the destination Region.</p>\\n            </li>\\n            <li>\\n               <p>An existing replica to be deleted. The request invokes the\\n                        <code>DeleteTableReplica</code> action in the destination Region, deleting\\n                    the replica and all if its items in the destination Region.</p>\\n            </li>\\n         </ul>\\n         <note>\\n            <p>When you manually remove a table or global table replica, you do not automatically\\n                remove any associated scalable targets, scaling policies, or CloudWatch\\n                alarms.</p>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#ReplicationGroupUpdateList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.dynamodb#ReplicationGroupUpdate\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#RequestLimitExceeded\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.dynamodb#ErrorMessage\"\n                },\n                \"ThrottlingReasons\": {\n                    \"target\": \"com.amazonaws.dynamodb#ThrottlingReasonList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_ThrottlingReason.html\\\">ThrottlingReason</a> that\\n     provide detailed diagnostic information about why the request was throttled.\\n    </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Throughput exceeds the current throughput quota for your account. For detailed\\n            information about why the request was throttled and the ARN of the impacted resource,\\n            find the <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_ThrottlingReason.html\\\">ThrottlingReason</a> field in the returned exception. Contact <a href=\\\"https://aws.amazon.com/support\\\">Amazon Web Services Support</a> to request a quota\\n            increase.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.dynamodb#Resource\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.dynamodb#ResourceArnString\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 1283\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#ResourceInUseException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.dynamodb#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The resource which is being attempted to be changed is in use.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The operation conflicts with the resource's availability. For example:</p>\\n         <ul>\\n            <li>\\n               <p>You attempted to recreate an existing table.</p>\\n            </li>\\n            <li>\\n               <p>You tried to delete a table currently in the <code>CREATING</code>\\n                    state.</p>\\n            </li>\\n            <li>\\n               <p>You tried to update a resource that was already being updated.</p>\\n            </li>\\n         </ul>\\n         <p>When appropriate, wait for the ongoing update to complete and attempt the request\\n            again.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.dynamodb#ResourceNotFoundException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.dynamodb#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The resource which is being requested does not exist.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The operation tried to access a nonexistent table or index. The resource might not\\n            be specified correctly, or its status might not be <code>ACTIVE</code>.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.dynamodb#ResourcePolicy\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.dynamodb#RestoreInProgress\": {\n            \"type\": \"boolean\"\n        },\n        \"com.amazonaws.dynamodb#RestoreSummary\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SourceBackupArn\": {\n                    \"target\": \"com.amazonaws.dynamodb#BackupArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the backup from which the table was restored.</p>\"\n                    }\n                },\n                \"SourceTableArn\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the source table of the backup that is being restored.</p>\"\n                    }\n                },\n                \"RestoreDateTime\": {\n                    \"target\": \"com.amazonaws.dynamodb#Date\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Point in time or source backup time.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"RestoreInProgress\": {\n                    \"target\": \"com.amazonaws.dynamodb#RestoreInProgress\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates if a restore is in progress or not.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains details for the restore.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#RestoreTableFromBackup\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.dynamodb#RestoreTableFromBackupInput\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.dynamodb#RestoreTableFromBackupOutput\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.dynamodb#BackupInUseException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#BackupNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InvalidEndpointException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#TableAlreadyExistsException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#TableInUseException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#clientDiscoveredEndpoint\": {\n                    \"required\": false\n                },\n                \"smithy.api#documentation\": \"<p>Creates a new table from an existing backup. Any number of users can execute up to 50\\n            concurrent restores (any type of restore) in a given account. </p>\\n         <p>You can call <code>RestoreTableFromBackup</code> at a maximum rate of 10 times per\\n            second.</p>\\n         <p>You must manually set up the following on the restored table:</p>\\n         <ul>\\n            <li>\\n               <p>Auto scaling policies</p>\\n            </li>\\n            <li>\\n               <p>IAM policies</p>\\n            </li>\\n            <li>\\n               <p>Amazon CloudWatch metrics and alarms</p>\\n            </li>\\n            <li>\\n               <p>Tags</p>\\n            </li>\\n            <li>\\n               <p>Stream settings</p>\\n            </li>\\n            <li>\\n               <p>Time to Live (TTL) settings</p>\\n            </li>\\n         </ul>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#RestoreTableFromBackupInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TargetTableName\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the new table to which the backup must be restored.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"ResourceArn\"\n                        }\n                    }\n                },\n                \"BackupArn\": {\n                    \"target\": \"com.amazonaws.dynamodb#BackupArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) associated with the backup.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"BillingModeOverride\": {\n                    \"target\": \"com.amazonaws.dynamodb#BillingMode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The billing mode of the restored table.</p>\"\n                    }\n                },\n                \"GlobalSecondaryIndexOverride\": {\n                    \"target\": \"com.amazonaws.dynamodb#GlobalSecondaryIndexList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>List of global secondary indexes for the restored table. The indexes provided should\\n            match existing secondary indexes. You can choose to exclude some or all of the indexes\\n            at the time of restore.</p>\"\n                    }\n                },\n                \"LocalSecondaryIndexOverride\": {\n                    \"target\": \"com.amazonaws.dynamodb#LocalSecondaryIndexList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>List of local secondary indexes for the restored table. The indexes provided should\\n            match existing secondary indexes. You can choose to exclude some or all of the indexes\\n            at the time of restore.</p>\"\n                    }\n                },\n                \"ProvisionedThroughputOverride\": {\n                    \"target\": \"com.amazonaws.dynamodb#ProvisionedThroughput\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Provisioned throughput settings for the restored table.</p>\"\n                    }\n                },\n                \"OnDemandThroughputOverride\": {\n                    \"target\": \"com.amazonaws.dynamodb#OnDemandThroughput\"\n                },\n                \"SSESpecificationOverride\": {\n                    \"target\": \"com.amazonaws.dynamodb#SSESpecification\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The new server-side encryption settings for the restored table.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#RestoreTableFromBackupOutput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TableDescription\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableDescription\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The description of the table created from an existing backup.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#RestoreTableToPointInTime\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.dynamodb#RestoreTableToPointInTimeInput\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.dynamodb#RestoreTableToPointInTimeOutput\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InvalidEndpointException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InvalidRestoreTimeException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#PointInTimeRecoveryUnavailableException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#TableAlreadyExistsException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#TableInUseException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#TableNotFoundException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#clientDiscoveredEndpoint\": {\n                    \"required\": false\n                },\n                \"smithy.api#documentation\": \"<p>Restores the specified table to the specified point in time within\\n                <code>EarliestRestorableDateTime</code> and <code>LatestRestorableDateTime</code>.\\n            You can restore your table to any point in time in the last 35 days. You can set the\\n            recovery period to any value between 1 and 35 days. Any number of users can execute up\\n            to 50 concurrent restores (any type of restore) in a given account. </p>\\n         <p>When you restore using point in time recovery, DynamoDB restores your table data to\\n            the state based on the selected date and time (day:hour:minute:second) to a new table. </p>\\n         <p>Along with data, the following are also included on the new restored table using point\\n            in time recovery: </p>\\n         <ul>\\n            <li>\\n               <p>Global secondary indexes (GSIs)</p>\\n            </li>\\n            <li>\\n               <p>Local secondary indexes (LSIs)</p>\\n            </li>\\n            <li>\\n               <p>Provisioned read and write capacity</p>\\n            </li>\\n            <li>\\n               <p>Encryption settings</p>\\n               <important>\\n                  <p> All these settings come from the current settings of the source table at\\n                        the time of restore. </p>\\n               </important>\\n            </li>\\n         </ul>\\n         <p>You must manually set up the following on the restored table:</p>\\n         <ul>\\n            <li>\\n               <p>Auto scaling policies</p>\\n            </li>\\n            <li>\\n               <p>IAM policies</p>\\n            </li>\\n            <li>\\n               <p>Amazon CloudWatch metrics and alarms</p>\\n            </li>\\n            <li>\\n               <p>Tags</p>\\n            </li>\\n            <li>\\n               <p>Stream settings</p>\\n            </li>\\n            <li>\\n               <p>Time to Live (TTL) settings</p>\\n            </li>\\n            <li>\\n               <p>Point in time recovery settings</p>\\n            </li>\\n         </ul>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#RestoreTableToPointInTimeInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SourceTableArn\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The DynamoDB table that will be restored. This value is an Amazon Resource Name\\n            (ARN).</p>\"\n                    }\n                },\n                \"SourceTableName\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Name of the source table that is being restored.</p>\"\n                    }\n                },\n                \"TargetTableName\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the new table to which it must be restored to.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"ResourceArn\"\n                        }\n                    }\n                },\n                \"UseLatestRestorableTime\": {\n                    \"target\": \"com.amazonaws.dynamodb#BooleanObject\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Restore the table to the latest possible time. <code>LatestRestorableDateTime</code>\\n            is typically 5 minutes before the current time. </p>\"\n                    }\n                },\n                \"RestoreDateTime\": {\n                    \"target\": \"com.amazonaws.dynamodb#Date\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Time in the past to restore the table to.</p>\"\n                    }\n                },\n                \"BillingModeOverride\": {\n                    \"target\": \"com.amazonaws.dynamodb#BillingMode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The billing mode of the restored table.</p>\"\n                    }\n                },\n                \"GlobalSecondaryIndexOverride\": {\n                    \"target\": \"com.amazonaws.dynamodb#GlobalSecondaryIndexList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>List of global secondary indexes for the restored table. The indexes provided should\\n            match existing secondary indexes. You can choose to exclude some or all of the indexes\\n            at the time of restore.</p>\"\n                    }\n                },\n                \"LocalSecondaryIndexOverride\": {\n                    \"target\": \"com.amazonaws.dynamodb#LocalSecondaryIndexList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>List of local secondary indexes for the restored table. The indexes provided should\\n            match existing secondary indexes. You can choose to exclude some or all of the indexes\\n            at the time of restore.</p>\"\n                    }\n                },\n                \"ProvisionedThroughputOverride\": {\n                    \"target\": \"com.amazonaws.dynamodb#ProvisionedThroughput\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Provisioned throughput settings for the restored table.</p>\"\n                    }\n                },\n                \"OnDemandThroughputOverride\": {\n                    \"target\": \"com.amazonaws.dynamodb#OnDemandThroughput\"\n                },\n                \"SSESpecificationOverride\": {\n                    \"target\": \"com.amazonaws.dynamodb#SSESpecification\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The new server-side encryption settings for the restored table.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#RestoreTableToPointInTimeOutput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TableDescription\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableDescription\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Represents the properties of a table.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#ReturnConsumedCapacity\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"INDEXES\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"INDEXES\"\n                    }\n                },\n                \"TOTAL\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"TOTAL\"\n                    }\n                },\n                \"NONE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"NONE\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Determines the level of detail about either provisioned or on-demand throughput\\n            consumption that is returned in the response:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>INDEXES</code> - The response includes the aggregate\\n                        <code>ConsumedCapacity</code> for the operation, together with\\n                        <code>ConsumedCapacity</code> for each table and secondary index that was\\n                    accessed.</p>\\n               <p>Note that some operations, such as <code>GetItem</code> and\\n                        <code>BatchGetItem</code>, do not access any indexes at all. In these cases,\\n                    specifying <code>INDEXES</code> will only return <code>ConsumedCapacity</code>\\n                    information for table(s).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>TOTAL</code> - The response includes only the aggregate\\n                        <code>ConsumedCapacity</code> for the operation.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>NONE</code> - No <code>ConsumedCapacity</code> details are included in the\\n                    response.</p>\\n            </li>\\n         </ul>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#ReturnItemCollectionMetrics\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"SIZE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"SIZE\"\n                    }\n                },\n                \"NONE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"NONE\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#ReturnValue\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"NONE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"NONE\"\n                    }\n                },\n                \"ALL_OLD\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ALL_OLD\"\n                    }\n                },\n                \"UPDATED_OLD\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"UPDATED_OLD\"\n                    }\n                },\n                \"ALL_NEW\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ALL_NEW\"\n                    }\n                },\n                \"UPDATED_NEW\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"UPDATED_NEW\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#ReturnValuesOnConditionCheckFailure\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ALL_OLD\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ALL_OLD\"\n                    }\n                },\n                \"NONE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"NONE\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#S3Bucket\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 255\n                },\n                \"smithy.api#pattern\": \"^[a-z0-9A-Z]+[\\\\.\\\\-\\\\w]*[a-z0-9A-Z]+$\"\n            }\n        },\n        \"com.amazonaws.dynamodb#S3BucketOwner\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#pattern\": \"^[0-9]{12}$\"\n            }\n        },\n        \"com.amazonaws.dynamodb#S3BucketSource\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"S3BucketOwner\": {\n                    \"target\": \"com.amazonaws.dynamodb#S3BucketOwner\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The account number of the S3 bucket that is being imported from. If the bucket is\\n            owned by the requester this is optional. </p>\"\n                    }\n                },\n                \"S3Bucket\": {\n                    \"target\": \"com.amazonaws.dynamodb#S3Bucket\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The S3 bucket that is being imported from. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"S3KeyPrefix\": {\n                    \"target\": \"com.amazonaws.dynamodb#S3Prefix\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The key prefix shared by all S3 Objects that are being imported. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p> The S3 bucket that is being imported from. </p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#S3Prefix\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 1024\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#S3SseAlgorithm\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"AES256\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AES256\"\n                    }\n                },\n                \"KMS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"KMS\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#S3SseKmsKeyId\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 2048\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#SSEDescription\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Status\": {\n                    \"target\": \"com.amazonaws.dynamodb#SSEStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Represents the current state of server-side encryption. The only supported values\\n            are:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>ENABLED</code> - Server-side encryption is enabled.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>UPDATING</code> - Server-side encryption is being updated.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"SSEType\": {\n                    \"target\": \"com.amazonaws.dynamodb#SSEType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Server-side encryption type. The only supported value is:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>KMS</code> - Server-side encryption that uses Key Management Service. The\\n                    key is stored in your account and is managed by KMS (KMS charges apply).</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"KMSMasterKeyArn\": {\n                    \"target\": \"com.amazonaws.dynamodb#KMSMasterKeyArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The KMS key ARN used for the KMS encryption.</p>\"\n                    }\n                },\n                \"InaccessibleEncryptionDateTime\": {\n                    \"target\": \"com.amazonaws.dynamodb#Date\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates the time, in UNIX epoch date format, when DynamoDB detected that\\n            the table's KMS key was inaccessible. This attribute will automatically\\n            be cleared when DynamoDB detects that the table's KMS key is accessible\\n            again. DynamoDB will initiate the table archival process when table's KMS key remains inaccessible for more than seven days from this date.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The description of the server-side encryption status on the specified table.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#SSEEnabled\": {\n            \"type\": \"boolean\"\n        },\n        \"com.amazonaws.dynamodb#SSESpecification\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Enabled\": {\n                    \"target\": \"com.amazonaws.dynamodb#SSEEnabled\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether server-side encryption is done using an Amazon Web Services managed\\n            key or an Amazon Web Services owned key. If enabled (true), server-side encryption type\\n            is set to <code>KMS</code> and an Amazon Web Services managed key is used (KMS charges apply). If disabled (false) or not specified, server-side\\n            encryption is set to Amazon Web Services owned key.</p>\"\n                    }\n                },\n                \"SSEType\": {\n                    \"target\": \"com.amazonaws.dynamodb#SSEType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Server-side encryption type. The only supported value is:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>KMS</code> - Server-side encryption that uses Key Management Service. The\\n                    key is stored in your account and is managed by KMS (KMS charges apply).</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"KMSMasterKeyId\": {\n                    \"target\": \"com.amazonaws.dynamodb#KMSMasterKeyId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The KMS key that should be used for the KMS encryption.\\n            To specify a key, use its key ID, Amazon Resource Name (ARN), alias name, or alias ARN.\\n            Note that you should only provide this parameter if the key is different from the\\n            default DynamoDB key <code>alias/aws/dynamodb</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents the settings used to enable server-side encryption.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#SSEStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ENABLING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ENABLING\"\n                    }\n                },\n                \"ENABLED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ENABLED\"\n                    }\n                },\n                \"DISABLING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DISABLING\"\n                    }\n                },\n                \"DISABLED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DISABLED\"\n                    }\n                },\n                \"UPDATING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"UPDATING\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#SSEType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"AES256\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AES256\"\n                    }\n                },\n                \"KMS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"KMS\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#ScalarAttributeType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"S\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"S\"\n                    }\n                },\n                \"N\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"N\"\n                    }\n                },\n                \"B\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"B\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#Scan\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.dynamodb#ScanInput\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.dynamodb#ScanOutput\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InvalidEndpointException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ProvisionedThroughputExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#RequestLimitExceeded\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ThrottlingException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#clientDiscoveredEndpoint\": {\n                    \"required\": false\n                },\n                \"smithy.api#documentation\": \"<p>The <code>Scan</code> operation returns one or more items and item attributes by\\n            accessing every item in a table or a secondary index. To have DynamoDB return fewer\\n            items, you can provide a <code>FilterExpression</code> operation.</p>\\n         <p>If the total size of scanned items exceeds the maximum dataset size limit of 1 MB, the\\n            scan completes and results are returned to the user. The <code>LastEvaluatedKey</code>\\n            value is also returned and the requestor can use the <code>LastEvaluatedKey</code> to\\n            continue the scan in a subsequent operation. Each scan response also includes number of\\n            items that were scanned (ScannedCount) as part of the request. If using a\\n                <code>FilterExpression</code>, a scan result can result in no items meeting the\\n            criteria and the <code>Count</code> will result in zero. If you did not use a\\n                <code>FilterExpression</code> in the scan request, then <code>Count</code> is the\\n            same as <code>ScannedCount</code>.</p>\\n         <note>\\n            <p>\\n               <code>Count</code> and <code>ScannedCount</code> only return the count of items\\n                specific to a single scan request and, unless the table is less than 1MB, do not\\n                represent the total number of items in the table. </p>\\n         </note>\\n         <p>A single <code>Scan</code> operation first reads up to the maximum number of items set\\n            (if using the <code>Limit</code> parameter) or a maximum of 1 MB of data and then\\n            applies any filtering to the results if a <code>FilterExpression</code> is provided. If\\n                <code>LastEvaluatedKey</code> is present in the response, pagination is required to\\n            complete the full table scan. For more information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Scan.html#Scan.Pagination\\\">Paginating the\\n                Results</a> in the <i>Amazon DynamoDB Developer Guide</i>.</p>\\n         <p>\\n            <code>Scan</code> operations proceed sequentially; however, for faster performance on\\n            a large table or secondary index, applications can request a parallel <code>Scan</code>\\n            operation by providing the <code>Segment</code> and <code>TotalSegments</code>\\n            parameters. For more information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Scan.html#Scan.ParallelScan\\\">Parallel\\n                Scan</a> in the <i>Amazon DynamoDB Developer Guide</i>.</p>\\n         <p>By default, a <code>Scan</code> uses eventually consistent reads when accessing the\\n            items in a table. Therefore, the results from an eventually consistent <code>Scan</code>\\n            may not include the latest item changes at the time the scan iterates through each item\\n            in the table. If you require a strongly consistent read of each item as the scan\\n            iterates through the items in the table, you can set the <code>ConsistentRead</code>\\n            parameter to true. Strong consistency only relates to the consistency of the read at the\\n            item level.</p>\\n         <note>\\n            <p> DynamoDB does not provide snapshot isolation for a scan operation when the\\n                    <code>ConsistentRead</code> parameter is set to true. Thus, a DynamoDB scan\\n                operation does not guarantee that all reads in a scan see a consistent snapshot of\\n                the table when the scan operation was requested. </p>\\n         </note>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To scan a table\",\n                        \"documentation\": \"This example scans the entire Music table, and then narrows the results to songs by the artist \\\"No One You Know\\\". For each item, only the album title and song title are returned.\",\n                        \"input\": {\n                            \"TableName\": \"Music\",\n                            \"FilterExpression\": \"Artist = :a\",\n                            \"ProjectionExpression\": \"#ST, #AT\",\n                            \"ExpressionAttributeNames\": {\n                                \"#ST\": \"SongTitle\",\n                                \"#AT\": \"AlbumTitle\"\n                            },\n                            \"ExpressionAttributeValues\": {\n                                \":a\": {\n                                    \"S\": \"No One You Know\"\n                                }\n                            }\n                        },\n                        \"output\": {\n                            \"Count\": 2,\n                            \"Items\": [\n                                {\n                                    \"SongTitle\": {\n                                        \"S\": \"Call Me Today\"\n                                    },\n                                    \"AlbumTitle\": {\n                                        \"S\": \"Somewhat Famous\"\n                                    }\n                                },\n                                {\n                                    \"SongTitle\": {\n                                        \"S\": \"Scared of My Shadow\"\n                                    },\n                                    \"AlbumTitle\": {\n                                        \"S\": \"Blue Sky Blues\"\n                                    }\n                                }\n                            ],\n                            \"ScannedCount\": 3,\n                            \"ConsumedCapacity\": {}\n                        }\n                    }\n                ],\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"ExclusiveStartKey\",\n                    \"outputToken\": \"LastEvaluatedKey\",\n                    \"items\": \"Items\",\n                    \"pageSize\": \"Limit\"\n                },\n                \"smithy.api#suppress\": [\n                    \"PaginatedTrait\"\n                ]\n            }\n        },\n        \"com.amazonaws.dynamodb#ScanInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TableName\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the table containing the requested items or if you provide\\n                <code>IndexName</code>, the name of the table to which that index belongs.</p>\\n         <p>You can also provide the Amazon Resource Name (ARN) of the table in this parameter.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"ResourceArn\"\n                        }\n                    }\n                },\n                \"IndexName\": {\n                    \"target\": \"com.amazonaws.dynamodb#IndexName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of a secondary index to scan. This index can be any local secondary index or\\n            global secondary index. Note that if you use the <code>IndexName</code> parameter, you\\n            must also provide <code>TableName</code>.</p>\"\n                    }\n                },\n                \"AttributesToGet\": {\n                    \"target\": \"com.amazonaws.dynamodb#AttributeNameList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>This is a legacy parameter. Use <code>ProjectionExpression</code> instead. For more\\n            information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/LegacyConditionalParameters.AttributesToGet.html\\\">AttributesToGet</a> in the <i>Amazon DynamoDB Developer\\n            Guide</i>.</p>\"\n                    }\n                },\n                \"Limit\": {\n                    \"target\": \"com.amazonaws.dynamodb#PositiveIntegerObject\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of items to evaluate (not necessarily the number of matching\\n            items). If DynamoDB processes the number of items up to the limit while processing the\\n            results, it stops the operation and returns the matching values up to that point, and a\\n            key in <code>LastEvaluatedKey</code> to apply in a subsequent operation, so that you can\\n            pick up where you left off. Also, if the processed dataset size exceeds 1 MB before\\n            DynamoDB reaches this limit, it stops the operation and returns the matching values up\\n            to the limit, and a key in <code>LastEvaluatedKey</code> to apply in a subsequent\\n            operation to continue the operation. For more information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/QueryAndScan.html\\\">Working with Queries</a> in the <i>Amazon DynamoDB Developer\\n                Guide</i>.</p>\"\n                    }\n                },\n                \"Select\": {\n                    \"target\": \"com.amazonaws.dynamodb#Select\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The attributes to be returned in the result. You can retrieve all item attributes,\\n            specific item attributes, the count of matching items, or in the case of an index, some\\n            or all of the attributes projected into the index.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>ALL_ATTRIBUTES</code> - Returns all of the item attributes from the\\n                    specified table or index. If you query a local secondary index, then for each\\n                    matching item in the index, DynamoDB fetches the entire item from the parent\\n                    table. If the index is configured to project all item attributes, then all of\\n                    the data can be obtained from the local secondary index, and no fetching is\\n                    required.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ALL_PROJECTED_ATTRIBUTES</code> - Allowed only when querying an index.\\n                    Retrieves all attributes that have been projected into the index. If the index\\n                    is configured to project all attributes, this return value is equivalent to\\n                    specifying <code>ALL_ATTRIBUTES</code>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>COUNT</code> - Returns the number of matching items, rather than the\\n                    matching items themselves. Note that this uses the same quantity of read\\n                    capacity units as getting the items, and is subject to the same item size\\n                    calculations.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>SPECIFIC_ATTRIBUTES</code> - Returns only the attributes listed in\\n                        <code>ProjectionExpression</code>. This return value is equivalent to\\n                    specifying <code>ProjectionExpression</code> without specifying any value for\\n                        <code>Select</code>.</p>\\n               <p>If you query or scan a local secondary index and request only attributes that\\n                    are projected into that index, the operation reads only the index and not the\\n                    table. If any of the requested attributes are not projected into the local\\n                    secondary index, DynamoDB fetches each of these attributes from the parent\\n                    table. This extra fetching incurs additional throughput cost and latency.</p>\\n               <p>If you query or scan a global secondary index, you can only request attributes\\n                    that are projected into the index. Global secondary index queries cannot fetch\\n                    attributes from the parent table.</p>\\n            </li>\\n         </ul>\\n         <p>If neither <code>Select</code> nor <code>ProjectionExpression</code> are specified,\\n            DynamoDB defaults to <code>ALL_ATTRIBUTES</code> when accessing a table, and\\n                <code>ALL_PROJECTED_ATTRIBUTES</code> when accessing an index. You cannot use both\\n                <code>Select</code> and <code>ProjectionExpression</code> together in a single\\n            request, unless the value for <code>Select</code> is <code>SPECIFIC_ATTRIBUTES</code>.\\n            (This usage is equivalent to specifying <code>ProjectionExpression</code> without any\\n            value for <code>Select</code>.)</p>\\n         <note>\\n            <p>If you use the <code>ProjectionExpression</code> parameter, then the value for\\n                    <code>Select</code> can only be <code>SPECIFIC_ATTRIBUTES</code>. Any other\\n                value for <code>Select</code> will return an error.</p>\\n         </note>\"\n                    }\n                },\n                \"ScanFilter\": {\n                    \"target\": \"com.amazonaws.dynamodb#FilterConditionMap\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>This is a legacy parameter. Use <code>FilterExpression</code> instead. For more\\n            information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/LegacyConditionalParameters.ScanFilter.html\\\">ScanFilter</a> in the <i>Amazon DynamoDB Developer\\n            Guide</i>.</p>\"\n                    }\n                },\n                \"ConditionalOperator\": {\n                    \"target\": \"com.amazonaws.dynamodb#ConditionalOperator\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>This is a legacy parameter. Use <code>FilterExpression</code> instead. For more\\n            information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/LegacyConditionalParameters.ConditionalOperator.html\\\">ConditionalOperator</a> in the <i>Amazon DynamoDB Developer\\n                Guide</i>.</p>\"\n                    }\n                },\n                \"ExclusiveStartKey\": {\n                    \"target\": \"com.amazonaws.dynamodb#Key\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The primary key of the first item that this operation will evaluate. Use the value\\n            that was returned for <code>LastEvaluatedKey</code> in the previous operation.</p>\\n         <p>The data type for <code>ExclusiveStartKey</code> must be String, Number or Binary. No\\n            set data types are allowed.</p>\\n         <p>In a parallel scan, a <code>Scan</code> request that includes\\n                <code>ExclusiveStartKey</code> must specify the same segment whose previous\\n                <code>Scan</code> returned the corresponding value of\\n            <code>LastEvaluatedKey</code>.</p>\"\n                    }\n                },\n                \"ReturnConsumedCapacity\": {\n                    \"target\": \"com.amazonaws.dynamodb#ReturnConsumedCapacity\"\n                },\n                \"TotalSegments\": {\n                    \"target\": \"com.amazonaws.dynamodb#ScanTotalSegments\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>For a parallel <code>Scan</code> request, <code>TotalSegments</code> represents the\\n            total number of segments into which the <code>Scan</code> operation will be divided. The\\n            value of <code>TotalSegments</code> corresponds to the number of application workers\\n            that will perform the parallel scan. For example, if you want to use four application\\n            threads to scan a table or an index, specify a <code>TotalSegments</code> value of\\n            4.</p>\\n         <p>The value for <code>TotalSegments</code> must be greater than or equal to 1, and less\\n            than or equal to 1000000. If you specify a <code>TotalSegments</code> value of 1, the\\n                <code>Scan</code> operation will be sequential rather than parallel.</p>\\n         <p>If you specify <code>TotalSegments</code>, you must also specify\\n            <code>Segment</code>.</p>\"\n                    }\n                },\n                \"Segment\": {\n                    \"target\": \"com.amazonaws.dynamodb#ScanSegment\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>For a parallel <code>Scan</code> request, <code>Segment</code> identifies an\\n            individual segment to be scanned by an application worker.</p>\\n         <p>Segment IDs are zero-based, so the first segment is always 0. For example, if you want\\n            to use four application threads to scan a table or an index, then the first thread\\n            specifies a <code>Segment</code> value of 0, the second thread specifies 1, and so\\n            on.</p>\\n         <p>The value of <code>LastEvaluatedKey</code> returned from a parallel <code>Scan</code>\\n            request must be used as <code>ExclusiveStartKey</code> with the same segment ID in a\\n            subsequent <code>Scan</code> operation.</p>\\n         <p>The value for <code>Segment</code> must be greater than or equal to 0, and less than\\n            the value provided for <code>TotalSegments</code>.</p>\\n         <p>If you provide <code>Segment</code>, you must also provide\\n            <code>TotalSegments</code>.</p>\"\n                    }\n                },\n                \"ProjectionExpression\": {\n                    \"target\": \"com.amazonaws.dynamodb#ProjectionExpression\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A string that identifies one or more attributes to retrieve from the specified table\\n            or index. These attributes can include scalars, sets, or elements of a JSON document.\\n            The attributes in the expression must be separated by commas.</p>\\n         <p>If no attribute names are specified, then all attributes will be returned. If any of\\n            the requested attributes are not found, they will not appear in the result.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.AccessingItemAttributes.html\\\">Specifying Item Attributes</a> in the <i>Amazon DynamoDB Developer\\n                Guide</i>.</p>\"\n                    }\n                },\n                \"FilterExpression\": {\n                    \"target\": \"com.amazonaws.dynamodb#ConditionExpression\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A string that contains conditions that DynamoDB applies after the <code>Scan</code>\\n            operation, but before the data is returned to you. Items that do not satisfy the\\n                <code>FilterExpression</code> criteria are not returned.</p>\\n         <note>\\n            <p>A <code>FilterExpression</code> is applied after the items have already been read;\\n                the process of filtering does not consume any additional read capacity units.</p>\\n         </note>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Scan.html#Scan.FilterExpression\\\">Filter\\n                Expressions</a> in the <i>Amazon DynamoDB Developer\\n            Guide</i>.</p>\"\n                    }\n                },\n                \"ExpressionAttributeNames\": {\n                    \"target\": \"com.amazonaws.dynamodb#ExpressionAttributeNameMap\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more substitution tokens for attribute names in an expression. The following\\n            are some use cases for using <code>ExpressionAttributeNames</code>:</p>\\n         <ul>\\n            <li>\\n               <p>To access an attribute whose name conflicts with a DynamoDB reserved\\n                    word.</p>\\n            </li>\\n            <li>\\n               <p>To create a placeholder for repeating occurrences of an attribute name in an\\n                    expression.</p>\\n            </li>\\n            <li>\\n               <p>To prevent special characters in an attribute name from being misinterpreted\\n                    in an expression.</p>\\n            </li>\\n         </ul>\\n         <p>Use the <b>#</b> character in an expression to dereference\\n            an attribute name. For example, consider the following attribute name:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>Percentile</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>The name of this attribute conflicts with a reserved word, so it cannot be used\\n            directly in an expression. (For the complete list of reserved words, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ReservedWords.html\\\">Reserved Words</a> in the <i>Amazon DynamoDB Developer\\n            Guide</i>). To work around this, you could specify the following for\\n                <code>ExpressionAttributeNames</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>{\\\"#P\\\":\\\"Percentile\\\"}</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>You could then use this substitution in an expression, as in this example:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>#P = :val</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <note>\\n            <p>Tokens that begin with the <b>:</b> character are\\n                    <i>expression attribute values</i>, which are placeholders for the\\n                actual value at runtime.</p>\\n         </note>\\n         <p>For more information on expression attribute names, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.AccessingItemAttributes.html\\\">Specifying Item Attributes</a> in the <i>Amazon DynamoDB Developer\\n                Guide</i>.</p>\"\n                    }\n                },\n                \"ExpressionAttributeValues\": {\n                    \"target\": \"com.amazonaws.dynamodb#ExpressionAttributeValueMap\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more values that can be substituted in an expression.</p>\\n         <p>Use the <b>:</b> (colon) character in an expression to\\n            dereference an attribute value. For example, suppose that you wanted to check whether\\n            the value of the <code>ProductStatus</code> attribute was one of the following: </p>\\n         <p>\\n            <code>Available | Backordered | Discontinued</code>\\n         </p>\\n         <p>You would first need to specify <code>ExpressionAttributeValues</code> as\\n            follows:</p>\\n         <p>\\n            <code>{ \\\":avail\\\":{\\\"S\\\":\\\"Available\\\"}, \\\":back\\\":{\\\"S\\\":\\\"Backordered\\\"},\\n                \\\":disc\\\":{\\\"S\\\":\\\"Discontinued\\\"} }</code>\\n         </p>\\n         <p>You could then use these values in an expression, such as this:</p>\\n         <p>\\n            <code>ProductStatus IN (:avail, :back, :disc)</code>\\n         </p>\\n         <p>For more information on expression attribute values, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.SpecifyingConditions.html\\\">Condition Expressions</a> in the <i>Amazon DynamoDB Developer\\n                Guide</i>.</p>\"\n                    }\n                },\n                \"ConsistentRead\": {\n                    \"target\": \"com.amazonaws.dynamodb#ConsistentRead\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A Boolean value that determines the read consistency model during the scan:</p>\\n         <ul>\\n            <li>\\n               <p>If <code>ConsistentRead</code> is <code>false</code>, then the data returned\\n                    from <code>Scan</code> might not contain the results from other recently\\n                    completed write operations (<code>PutItem</code>, <code>UpdateItem</code>, or\\n                        <code>DeleteItem</code>).</p>\\n            </li>\\n            <li>\\n               <p>If <code>ConsistentRead</code> is <code>true</code>, then all of the write\\n                    operations that completed before the <code>Scan</code> began are guaranteed to\\n                    be contained in the <code>Scan</code> response.</p>\\n            </li>\\n         </ul>\\n         <p>The default setting for <code>ConsistentRead</code> is <code>false</code>.</p>\\n         <p>The <code>ConsistentRead</code> parameter is not supported on global secondary\\n            indexes. If you scan a global secondary index with <code>ConsistentRead</code> set to\\n            true, you will receive a <code>ValidationException</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents the input of a <code>Scan</code> operation.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#ScanOutput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Items\": {\n                    \"target\": \"com.amazonaws.dynamodb#ItemList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An array of item attributes that match the scan criteria. Each element in this array\\n            consists of an attribute name and the value for that attribute.</p>\"\n                    }\n                },\n                \"Count\": {\n                    \"target\": \"com.amazonaws.dynamodb#Integer\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The number of items in the response.</p>\\n         <p>If you set <code>ScanFilter</code> in the request, then <code>Count</code> is the\\n            number of items returned after the filter was applied, and <code>ScannedCount</code> is\\n            the number of matching items before the filter was applied.</p>\\n         <p>If you did not use a filter in the request, then <code>Count</code> is the same as\\n                <code>ScannedCount</code>.</p>\"\n                    }\n                },\n                \"ScannedCount\": {\n                    \"target\": \"com.amazonaws.dynamodb#Integer\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The number of items evaluated, before any <code>ScanFilter</code> is applied. A high\\n                <code>ScannedCount</code> value with few, or no, <code>Count</code> results\\n            indicates an inefficient <code>Scan</code> operation. For more information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/QueryAndScan.html#Count\\\">Count and\\n                ScannedCount</a> in the <i>Amazon DynamoDB Developer\\n            Guide</i>.</p>\\n         <p>If you did not use a filter in the request, then <code>ScannedCount</code> is the same\\n            as <code>Count</code>.</p>\"\n                    }\n                },\n                \"LastEvaluatedKey\": {\n                    \"target\": \"com.amazonaws.dynamodb#Key\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The primary key of the item where the operation stopped, inclusive of the previous\\n            result set. Use this value to start a new operation, excluding this value in the new\\n            request.</p>\\n         <p>If <code>LastEvaluatedKey</code> is empty, then the \\\"last page\\\" of results has been\\n            processed and there is no more data to be retrieved.</p>\\n         <p>If <code>LastEvaluatedKey</code> is not empty, it does not necessarily mean that there\\n            is more data in the result set. The only way to know when you have reached the end of\\n            the result set is when <code>LastEvaluatedKey</code> is empty.</p>\"\n                    }\n                },\n                \"ConsumedCapacity\": {\n                    \"target\": \"com.amazonaws.dynamodb#ConsumedCapacity\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The capacity units consumed by the <code>Scan</code> operation. The data returned\\n            includes the total provisioned throughput consumed, along with statistics for the table\\n            and any indexes involved in the operation. <code>ConsumedCapacity</code> is only\\n            returned if the <code>ReturnConsumedCapacity</code> parameter was specified. For more\\n            information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/read-write-operations.html#read-operation-consumption\\\">Capacity unit consumption for read operations</a> in the <i>Amazon\\n                DynamoDB Developer Guide</i>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents the output of a <code>Scan</code> operation.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#ScanSegment\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 0,\n                    \"max\": 999999\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#ScanTotalSegments\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 1000000\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#SecondaryIndexesCapacityMap\": {\n            \"type\": \"map\",\n            \"key\": {\n                \"target\": \"com.amazonaws.dynamodb#IndexName\"\n            },\n            \"value\": {\n                \"target\": \"com.amazonaws.dynamodb#Capacity\"\n            }\n        },\n        \"com.amazonaws.dynamodb#Select\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ALL_ATTRIBUTES\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ALL_ATTRIBUTES\"\n                    }\n                },\n                \"ALL_PROJECTED_ATTRIBUTES\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ALL_PROJECTED_ATTRIBUTES\"\n                    }\n                },\n                \"SPECIFIC_ATTRIBUTES\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"SPECIFIC_ATTRIBUTES\"\n                    }\n                },\n                \"COUNT\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"COUNT\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#SourceTableDetails\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TableName\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the table for which the backup was created. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TableId\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Unique identifier for the table for which the backup was created. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TableArn\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>ARN of the table for which backup was created. </p>\"\n                    }\n                },\n                \"TableSizeBytes\": {\n                    \"target\": \"com.amazonaws.dynamodb#LongObject\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Size of the table in bytes. Note that this is an approximate value.</p>\"\n                    }\n                },\n                \"KeySchema\": {\n                    \"target\": \"com.amazonaws.dynamodb#KeySchema\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Schema of the table. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TableCreationDateTime\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableCreationDateTime\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Time when the source table was created. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ProvisionedThroughput\": {\n                    \"target\": \"com.amazonaws.dynamodb#ProvisionedThroughput\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Read IOPs and Write IOPS on the table when the backup was created.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"OnDemandThroughput\": {\n                    \"target\": \"com.amazonaws.dynamodb#OnDemandThroughput\"\n                },\n                \"ItemCount\": {\n                    \"target\": \"com.amazonaws.dynamodb#ItemCount\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Number of items in the table. Note that this is an approximate value. </p>\"\n                    }\n                },\n                \"BillingMode\": {\n                    \"target\": \"com.amazonaws.dynamodb#BillingMode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Controls how you are charged for read and write throughput and how you manage\\n            capacity. This setting can be changed later.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>PROVISIONED</code> - Sets the read/write capacity mode to\\n                        <code>PROVISIONED</code>. We recommend using <code>PROVISIONED</code> for\\n                    predictable workloads.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>PAY_PER_REQUEST</code> - Sets the read/write capacity mode to\\n                        <code>PAY_PER_REQUEST</code>. We recommend using\\n                        <code>PAY_PER_REQUEST</code> for unpredictable workloads. </p>\\n            </li>\\n         </ul>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the details of the table when the backup was created. </p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#SourceTableFeatureDetails\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LocalSecondaryIndexes\": {\n                    \"target\": \"com.amazonaws.dynamodb#LocalSecondaryIndexes\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Represents the LSI properties for the table when the backup was created. It includes\\n            the IndexName, KeySchema and Projection for the LSIs on the table at the time of backup.\\n        </p>\"\n                    }\n                },\n                \"GlobalSecondaryIndexes\": {\n                    \"target\": \"com.amazonaws.dynamodb#GlobalSecondaryIndexes\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Represents the GSI properties for the table when the backup was created. It includes\\n            the IndexName, KeySchema, Projection, and ProvisionedThroughput for the GSIs on the\\n            table at the time of backup. </p>\"\n                    }\n                },\n                \"StreamDescription\": {\n                    \"target\": \"com.amazonaws.dynamodb#StreamSpecification\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Stream settings on the table when the backup was created.</p>\"\n                    }\n                },\n                \"TimeToLiveDescription\": {\n                    \"target\": \"com.amazonaws.dynamodb#TimeToLiveDescription\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Time to Live settings on the table when the backup was created.</p>\"\n                    }\n                },\n                \"SSEDescription\": {\n                    \"target\": \"com.amazonaws.dynamodb#SSEDescription\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The description of the server-side encryption status on the table when the backup was\\n            created.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the details of the features enabled on the table when the backup was created.\\n            For example, LSIs, GSIs, streams, TTL. </p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#StreamArn\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 37,\n                    \"max\": 1024\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#StreamEnabled\": {\n            \"type\": \"boolean\"\n        },\n        \"com.amazonaws.dynamodb#StreamSpecification\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"StreamEnabled\": {\n                    \"target\": \"com.amazonaws.dynamodb#StreamEnabled\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether DynamoDB Streams is enabled (true) or disabled (false) on the\\n            table.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"StreamViewType\": {\n                    \"target\": \"com.amazonaws.dynamodb#StreamViewType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> When an item in the table is modified, <code>StreamViewType</code> determines what\\n            information is written to the stream for this table. Valid values for\\n                <code>StreamViewType</code> are:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>KEYS_ONLY</code> - Only the key attributes of the modified item are\\n                    written to the stream.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>NEW_IMAGE</code> - The entire item, as it appears after it was modified,\\n                    is written to the stream.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>OLD_IMAGE</code> - The entire item, as it appeared before it was modified,\\n                    is written to the stream.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>NEW_AND_OLD_IMAGES</code> - Both the new and the old item images of the\\n                    item are written to the stream.</p>\\n            </li>\\n         </ul>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents the DynamoDB Streams configuration for a table in DynamoDB.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#StreamViewType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"NEW_IMAGE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"NEW_IMAGE\"\n                    }\n                },\n                \"OLD_IMAGE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"OLD_IMAGE\"\n                    }\n                },\n                \"NEW_AND_OLD_IMAGES\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"NEW_AND_OLD_IMAGES\"\n                    }\n                },\n                \"KEYS_ONLY\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"KEYS_ONLY\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#String\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.dynamodb#StringAttributeValue\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.dynamodb#StringSetAttributeValue\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.dynamodb#StringAttributeValue\"\n            }\n        },\n        \"com.amazonaws.dynamodb#TableAlreadyExistsException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.dynamodb#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A target table with the specified name already exists. </p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.dynamodb#TableArn\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 1024\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#TableAutoScalingDescription\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TableName\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the table.</p>\"\n                    }\n                },\n                \"TableStatus\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The current state of the table:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>CREATING</code> - The table is being created.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>UPDATING</code> - The table is being updated.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>DELETING</code> - The table is being deleted.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ACTIVE</code> - The table is ready for use.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"Replicas\": {\n                    \"target\": \"com.amazonaws.dynamodb#ReplicaAutoScalingDescriptionList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Represents replicas of the global table.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents the auto scaling configuration for a global table.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#TableClass\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"STANDARD\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"STANDARD\"\n                    }\n                },\n                \"STANDARD_INFREQUENT_ACCESS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"STANDARD_INFREQUENT_ACCESS\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#TableClassSummary\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TableClass\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableClass\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The table class of the specified table. Valid values are <code>STANDARD</code> and\\n                <code>STANDARD_INFREQUENT_ACCESS</code>.</p>\"\n                    }\n                },\n                \"LastUpdateDateTime\": {\n                    \"target\": \"com.amazonaws.dynamodb#Date\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time at which the table class was last updated.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains details of the table class.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#TableCreationDateTime\": {\n            \"type\": \"timestamp\"\n        },\n        \"com.amazonaws.dynamodb#TableCreationParameters\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TableName\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The name of the table created as part of the import operation. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"AttributeDefinitions\": {\n                    \"target\": \"com.amazonaws.dynamodb#AttributeDefinitions\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The attributes of the table created as part of the import operation. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"KeySchema\": {\n                    \"target\": \"com.amazonaws.dynamodb#KeySchema\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The primary key and option sort key of the table created as part of the import\\n            operation. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"BillingMode\": {\n                    \"target\": \"com.amazonaws.dynamodb#BillingMode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The billing mode for provisioning the table created as part of the import operation.\\n        </p>\"\n                    }\n                },\n                \"ProvisionedThroughput\": {\n                    \"target\": \"com.amazonaws.dynamodb#ProvisionedThroughput\"\n                },\n                \"OnDemandThroughput\": {\n                    \"target\": \"com.amazonaws.dynamodb#OnDemandThroughput\"\n                },\n                \"SSESpecification\": {\n                    \"target\": \"com.amazonaws.dynamodb#SSESpecification\"\n                },\n                \"GlobalSecondaryIndexes\": {\n                    \"target\": \"com.amazonaws.dynamodb#GlobalSecondaryIndexList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The Global Secondary Indexes (GSI) of the table to be created as part of the import\\n            operation. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p> The parameters for the table created as part of the import operation. </p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#TableDescription\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AttributeDefinitions\": {\n                    \"target\": \"com.amazonaws.dynamodb#AttributeDefinitions\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An array of <code>AttributeDefinition</code> objects. Each of these objects describes\\n            one attribute in the table and index key schema.</p>\\n         <p>Each <code>AttributeDefinition</code> object in this array is composed of:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>AttributeName</code> - The name of the attribute.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>AttributeType</code> - The data type for the attribute.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"TableName\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the table.</p>\"\n                    }\n                },\n                \"KeySchema\": {\n                    \"target\": \"com.amazonaws.dynamodb#KeySchema\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The primary key structure for the table. Each <code>KeySchemaElement</code> consists\\n            of:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>AttributeName</code> - The name of the attribute.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>KeyType</code> - The role of the attribute:</p>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <code>HASH</code> - partition key</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <code>RANGE</code> - sort key</p>\\n                  </li>\\n               </ul>\\n               <note>\\n                  <p>The partition key of an item is also known as its <i>hash\\n                            attribute</i>. The term \\\"hash attribute\\\" derives from DynamoDB's\\n                        usage of an internal hash function to evenly distribute data items across\\n                        partitions, based on their partition key values.</p>\\n                  <p>The sort key of an item is also known as its <i>range\\n                            attribute</i>. The term \\\"range attribute\\\" derives from the way\\n                        DynamoDB stores items with the same partition key physically close together,\\n                        in sorted order by the sort key value.</p>\\n               </note>\\n            </li>\\n         </ul>\\n         <p>For more information about primary keys, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DataModel.html#DataModelPrimaryKey\\\">Primary Key</a> in the <i>Amazon DynamoDB Developer\\n            Guide</i>.</p>\"\n                    }\n                },\n                \"TableStatus\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The current state of the table:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>CREATING</code> - The table is being created.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>UPDATING</code> - The table/index configuration is being updated. The\\n                    table/index remains available for data operations when\\n                    <code>UPDATING</code>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>DELETING</code> - The table is being deleted.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ACTIVE</code> - The table is ready for use.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>INACCESSIBLE_ENCRYPTION_CREDENTIALS</code> - The KMS key\\n                    used to encrypt the table in inaccessible. Table operations may fail due to\\n                    failure to use the KMS key. DynamoDB will initiate the\\n                    table archival process when a table's KMS key remains\\n                    inaccessible for more than seven days. </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ARCHIVING</code> - The table is being archived. Operations are not allowed\\n                    until archival is complete. </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ARCHIVED</code> - The table has been archived. See the ArchivalReason for\\n                    more information. </p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"CreationDateTime\": {\n                    \"target\": \"com.amazonaws.dynamodb#Date\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time when the table was created, in <a href=\\\"http://www.epochconverter.com/\\\">UNIX epoch time</a> format.</p>\"\n                    }\n                },\n                \"ProvisionedThroughput\": {\n                    \"target\": \"com.amazonaws.dynamodb#ProvisionedThroughputDescription\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The provisioned throughput settings for the table, consisting of read and write\\n            capacity units, along with data about increases and decreases.</p>\"\n                    }\n                },\n                \"TableSizeBytes\": {\n                    \"target\": \"com.amazonaws.dynamodb#LongObject\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The total size of the specified table, in bytes. DynamoDB updates this value\\n            approximately every six hours. Recent changes might not be reflected in this\\n            value.</p>\"\n                    }\n                },\n                \"ItemCount\": {\n                    \"target\": \"com.amazonaws.dynamodb#LongObject\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of items in the specified table. DynamoDB updates this value approximately\\n            every six hours. Recent changes might not be reflected in this value.</p>\"\n                    }\n                },\n                \"TableArn\": {\n                    \"target\": \"com.amazonaws.dynamodb#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) that uniquely identifies the table.</p>\"\n                    }\n                },\n                \"TableId\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Unique identifier for the table for which the backup was created. </p>\"\n                    }\n                },\n                \"BillingModeSummary\": {\n                    \"target\": \"com.amazonaws.dynamodb#BillingModeSummary\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Contains the details for the read/write capacity mode.</p>\"\n                    }\n                },\n                \"LocalSecondaryIndexes\": {\n                    \"target\": \"com.amazonaws.dynamodb#LocalSecondaryIndexDescriptionList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Represents one or more local secondary indexes on the table. Each index is scoped to a\\n            given partition key value. Tables with one or more local secondary indexes are subject\\n            to an item collection size limit, where the amount of data within a given item\\n            collection cannot exceed 10 GB. Each element is composed of:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>IndexName</code> - The name of the local secondary index.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>KeySchema</code> - Specifies the complete index key schema. The attribute\\n                    names in the key schema must be between 1 and 255 characters (inclusive). The\\n                    key schema must begin with the same partition key as the table.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>Projection</code> - Specifies attributes that are copied (projected) from\\n                    the table into the index. These are in addition to the primary key attributes\\n                    and index key attributes, which are automatically projected. Each attribute\\n                    specification is composed of:</p>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <code>ProjectionType</code> - One of the following:</p>\\n                     <ul>\\n                        <li>\\n                           <p>\\n                              <code>KEYS_ONLY</code> - Only the index and primary keys are\\n                                    projected into the index.</p>\\n                        </li>\\n                        <li>\\n                           <p>\\n                              <code>INCLUDE</code> - Only the specified table attributes are\\n                                    projected into the index. The list of projected attributes is in\\n                                        <code>NonKeyAttributes</code>.</p>\\n                        </li>\\n                        <li>\\n                           <p>\\n                              <code>ALL</code> - All of the table attributes are projected\\n                                    into the index.</p>\\n                        </li>\\n                     </ul>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <code>NonKeyAttributes</code> - A list of one or more non-key attribute\\n                            names that are projected into the secondary index. The total count of\\n                            attributes provided in <code>NonKeyAttributes</code>, summed across all\\n                            of the secondary indexes, must not exceed 100. If you project the same\\n                            attribute into two different indexes, this counts as two distinct\\n                            attributes when determining the total. This limit only applies when you\\n                            specify the ProjectionType of <code>INCLUDE</code>. You still can\\n                            specify the ProjectionType of <code>ALL</code> to project all attributes\\n                            from the source table, even if the table has more than 100\\n                            attributes.</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>IndexSizeBytes</code> - Represents the total size of the index, in bytes.\\n                    DynamoDB updates this value approximately every six hours. Recent changes might\\n                    not be reflected in this value.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ItemCount</code> - Represents the number of items in the index. DynamoDB\\n                    updates this value approximately every six hours. Recent changes might not be\\n                    reflected in this value.</p>\\n            </li>\\n         </ul>\\n         <p>If the table is in the <code>DELETING</code> state, no information about indexes will\\n            be returned.</p>\"\n                    }\n                },\n                \"GlobalSecondaryIndexes\": {\n                    \"target\": \"com.amazonaws.dynamodb#GlobalSecondaryIndexDescriptionList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The global secondary indexes, if any, on the table. Each index is scoped to a given\\n            partition key value. Each element is composed of:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>Backfilling</code> - If true, then the index is currently in the\\n                    backfilling phase. Backfilling occurs only when a new global secondary index is\\n                    added to the table. It is the process by which DynamoDB populates the new index\\n                    with data from the table. (This attribute does not appear for indexes that were\\n                    created during a <code>CreateTable</code> operation.) </p>\\n               <p> You can delete an index that is being created during the\\n                        <code>Backfilling</code> phase when <code>IndexStatus</code> is set to\\n                    CREATING and <code>Backfilling</code> is true. You can't delete the index that\\n                    is being created when <code>IndexStatus</code> is set to CREATING and\\n                        <code>Backfilling</code> is false. (This attribute does not appear for\\n                    indexes that were created during a <code>CreateTable</code> operation.)</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>IndexName</code> - The name of the global secondary index.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>IndexSizeBytes</code> - The total size of the global secondary index, in\\n                    bytes. DynamoDB updates this value approximately every six hours. Recent changes\\n                    might not be reflected in this value. </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>IndexStatus</code> - The current status of the global secondary\\n                    index:</p>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <code>CREATING</code> - The index is being created.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <code>UPDATING</code> - The index is being updated.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <code>DELETING</code> - The index is being deleted.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <code>ACTIVE</code> - The index is ready for use.</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ItemCount</code> - The number of items in the global secondary index.\\n                    DynamoDB updates this value approximately every six hours. Recent changes might\\n                    not be reflected in this value. </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>KeySchema</code> - Specifies the complete index key schema. The attribute\\n                    names in the key schema must be between 1 and 255 characters (inclusive). The\\n                    key schema must begin with the same partition key as the table.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>Projection</code> - Specifies attributes that are copied (projected) from\\n                    the table into the index. These are in addition to the primary key attributes\\n                    and index key attributes, which are automatically projected. Each attribute\\n                    specification is composed of:</p>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <code>ProjectionType</code> - One of the following:</p>\\n                     <ul>\\n                        <li>\\n                           <p>\\n                              <code>KEYS_ONLY</code> - Only the index and primary keys are\\n                                    projected into the index.</p>\\n                        </li>\\n                        <li>\\n                           <p>\\n                              <code>INCLUDE</code> - In addition to the attributes described\\n                                    in <code>KEYS_ONLY</code>, the secondary index will include\\n                                    other non-key attributes that you specify.</p>\\n                        </li>\\n                        <li>\\n                           <p>\\n                              <code>ALL</code> - All of the table attributes are projected\\n                                    into the index.</p>\\n                        </li>\\n                     </ul>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <code>NonKeyAttributes</code> - A list of one or more non-key attribute\\n                            names that are projected into the secondary index. The total count of\\n                            attributes provided in <code>NonKeyAttributes</code>, summed across all\\n                            of the secondary indexes, must not exceed 100. If you project the same\\n                            attribute into two different indexes, this counts as two distinct\\n                            attributes when determining the total. This limit only applies when you\\n                            specify the ProjectionType of <code>INCLUDE</code>. You still can\\n                            specify the ProjectionType of <code>ALL</code> to project all attributes\\n                            from the source table, even if the table has more than 100\\n                            attributes.</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ProvisionedThroughput</code> - The provisioned throughput settings for the\\n                    global secondary index, consisting of read and write capacity units, along with\\n                    data about increases and decreases. </p>\\n            </li>\\n         </ul>\\n         <p>If the table is in the <code>DELETING</code> state, no information about indexes will\\n            be returned.</p>\"\n                    }\n                },\n                \"StreamSpecification\": {\n                    \"target\": \"com.amazonaws.dynamodb#StreamSpecification\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The current DynamoDB Streams configuration for the table.</p>\"\n                    }\n                },\n                \"LatestStreamLabel\": {\n                    \"target\": \"com.amazonaws.dynamodb#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A timestamp, in ISO 8601 format, for this stream.</p>\\n         <p>Note that <code>LatestStreamLabel</code> is not a unique identifier for the stream,\\n            because it is possible that a stream from another table might have the same timestamp.\\n            However, the combination of the following three elements is guaranteed to be\\n            unique:</p>\\n         <ul>\\n            <li>\\n               <p>Amazon Web Services customer ID</p>\\n            </li>\\n            <li>\\n               <p>Table name</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>StreamLabel</code>\\n               </p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"LatestStreamArn\": {\n                    \"target\": \"com.amazonaws.dynamodb#StreamArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) that uniquely identifies the latest stream for this\\n            table.</p>\"\n                    }\n                },\n                \"GlobalTableVersion\": {\n                    \"target\": \"com.amazonaws.dynamodb#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Represents the version of <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GlobalTables.html\\\">global tables</a>\\n            in use, if the table is replicated across Amazon Web Services Regions.</p>\"\n                    }\n                },\n                \"Replicas\": {\n                    \"target\": \"com.amazonaws.dynamodb#ReplicaDescriptionList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Represents replicas of the table.</p>\"\n                    }\n                },\n                \"GlobalTableWitnesses\": {\n                    \"target\": \"com.amazonaws.dynamodb#GlobalTableWitnessDescriptionList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The witness Region and its current status in the MRSC global table. Only one witness\\n            Region can be configured per MRSC global table.</p>\"\n                    }\n                },\n                \"RestoreSummary\": {\n                    \"target\": \"com.amazonaws.dynamodb#RestoreSummary\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Contains details for the restore.</p>\"\n                    }\n                },\n                \"SSEDescription\": {\n                    \"target\": \"com.amazonaws.dynamodb#SSEDescription\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The description of the server-side encryption status on the specified table.</p>\"\n                    }\n                },\n                \"ArchivalSummary\": {\n                    \"target\": \"com.amazonaws.dynamodb#ArchivalSummary\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Contains information about the table archive.</p>\"\n                    }\n                },\n                \"TableClassSummary\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableClassSummary\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Contains details of the table class.</p>\"\n                    }\n                },\n                \"DeletionProtectionEnabled\": {\n                    \"target\": \"com.amazonaws.dynamodb#DeletionProtectionEnabled\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether deletion protection is enabled (true) or disabled (false) on the\\n            table.</p>\"\n                    }\n                },\n                \"OnDemandThroughput\": {\n                    \"target\": \"com.amazonaws.dynamodb#OnDemandThroughput\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of read and write units for the specified on-demand table. If you\\n            use this parameter, you must specify <code>MaxReadRequestUnits</code>,\\n                <code>MaxWriteRequestUnits</code>, or both.</p>\"\n                    }\n                },\n                \"WarmThroughput\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableWarmThroughputDescription\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Describes the warm throughput value of the base table.</p>\"\n                    }\n                },\n                \"MultiRegionConsistency\": {\n                    \"target\": \"com.amazonaws.dynamodb#MultiRegionConsistency\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates one of the following consistency modes for a global table:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>EVENTUAL</code>: Indicates that the global table is configured for\\n                    multi-Region eventual consistency (MREC).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>STRONG</code>: Indicates that the global table is configured for\\n                    multi-Region strong consistency (MRSC).</p>\\n            </li>\\n         </ul>\\n         <p>If you don't specify this field, the global table consistency mode defaults to\\n                <code>EVENTUAL</code>. For more information about global tables consistency modes,\\n            see <a href=\\\"https://docs.aws.amazon.com/V2globaltables_HowItWorks.html#V2globaltables_HowItWorks.consistency-modes\\\">\\n                Consistency modes</a> in DynamoDB developer guide. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents the properties of a table.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#TableId\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#pattern\": \"^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$\"\n            }\n        },\n        \"com.amazonaws.dynamodb#TableInUseException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.dynamodb#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A target table with the specified name is either being created or deleted.\\n        </p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.dynamodb#TableName\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 3,\n                    \"max\": 255\n                },\n                \"smithy.api#pattern\": \"^[a-zA-Z0-9_.-]+$\"\n            }\n        },\n        \"com.amazonaws.dynamodb#TableNameList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.dynamodb#TableName\"\n            }\n        },\n        \"com.amazonaws.dynamodb#TableNotFoundException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.dynamodb#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A source table with the name <code>TableName</code> does not currently exist within\\n            the subscriber's account or the subscriber is operating in the wrong Amazon Web Services\\n            Region.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.dynamodb#TableStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"CREATING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"CREATING\"\n                    }\n                },\n                \"UPDATING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"UPDATING\"\n                    }\n                },\n                \"DELETING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DELETING\"\n                    }\n                },\n                \"ACTIVE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ACTIVE\"\n                    }\n                },\n                \"INACCESSIBLE_ENCRYPTION_CREDENTIALS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"INACCESSIBLE_ENCRYPTION_CREDENTIALS\"\n                    }\n                },\n                \"ARCHIVING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ARCHIVING\"\n                    }\n                },\n                \"ARCHIVED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ARCHIVED\"\n                    }\n                },\n                \"REPLICATION_NOT_AUTHORIZED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"REPLICATION_NOT_AUTHORIZED\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#TableWarmThroughputDescription\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ReadUnitsPerSecond\": {\n                    \"target\": \"com.amazonaws.dynamodb#PositiveLongObject\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Represents the base table's warm throughput value in read units per second.</p>\"\n                    }\n                },\n                \"WriteUnitsPerSecond\": {\n                    \"target\": \"com.amazonaws.dynamodb#PositiveLongObject\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Represents the base table's warm throughput value in write units per second.</p>\"\n                    }\n                },\n                \"Status\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Represents warm throughput value of the base table.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents the warm throughput value (in read units per second and write units per\\n            second) of the table. Warm throughput is applicable for DynamoDB Standard-IA tables and\\n            specifies the minimum provisioned capacity maintained for immediate data access.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#Tag\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Key\": {\n                    \"target\": \"com.amazonaws.dynamodb#TagKeyString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The key of the tag. Tag keys are case sensitive. Each DynamoDB table can\\n            only have up to one tag with the same key. If you try to add an existing tag (same key),\\n            the existing tag value will be updated to the new value.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Value\": {\n                    \"target\": \"com.amazonaws.dynamodb#TagValueString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The value of the tag. Tag values are case-sensitive and can be null.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a tag. A tag is a key-value pair. You can add up to 50 tags to a single\\n            DynamoDB table. </p>\\n         <p>Amazon Web Services-assigned tag names and values are automatically assigned the\\n                <code>aws:</code> prefix, which the user cannot assign. Amazon Web Services-assigned\\n            tag names do not count towards the tag limit of 50. User-assigned tag names have the\\n            prefix <code>user:</code> in the Cost Allocation Report. You cannot backdate the\\n            application of a tag.</p>\\n         <p>For an overview on tagging DynamoDB resources, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Tagging.html\\\">Tagging\\n                for DynamoDB</a> in the <i>Amazon DynamoDB Developer\\n                Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#TagKeyList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.dynamodb#TagKeyString\"\n            }\n        },\n        \"com.amazonaws.dynamodb#TagKeyString\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 128\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#TagList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.dynamodb#Tag\"\n            }\n        },\n        \"com.amazonaws.dynamodb#TagResource\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.dynamodb#TagResourceInput\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InvalidEndpointException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ResourceInUseException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ResourceNotFoundException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#clientDiscoveredEndpoint\": {\n                    \"required\": false\n                },\n                \"smithy.api#documentation\": \"<p>Associate a set of tags with an Amazon DynamoDB resource. You can then activate these\\n            user-defined tags so that they appear on the Billing and Cost Management console for\\n            cost allocation tracking. You can call TagResource up to five times per second, per\\n            account. </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>TagResource</code> is an asynchronous operation. If you issue a <a>ListTagsOfResource</a> request immediately after a\\n                        <code>TagResource</code> request, DynamoDB might return your\\n                    previous tag set, if there was one, or an empty tag set. This is because\\n                        <code>ListTagsOfResource</code> uses an eventually consistent query, and the\\n                    metadata for your tags or table might not be available at that moment. Wait for\\n                    a few seconds, and then try the <code>ListTagsOfResource</code> request\\n                    again.</p>\\n            </li>\\n            <li>\\n               <p>The application or removal of tags using <code>TagResource</code> and\\n                        <code>UntagResource</code> APIs is eventually consistent.\\n                        <code>ListTagsOfResource</code> API will only reflect the changes after a\\n                    few seconds.</p>\\n            </li>\\n         </ul>\\n         <p>For an overview on tagging DynamoDB resources, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Tagging.html\\\">Tagging for DynamoDB</a>\\n            in the <i>Amazon DynamoDB Developer Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#TagResourceInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ResourceArn\": {\n                    \"target\": \"com.amazonaws.dynamodb#ResourceArnString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Identifies the Amazon DynamoDB resource to which tags should be added. This value is\\n            an Amazon Resource Name (ARN).</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"ResourceArn\"\n                        }\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.dynamodb#TagList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags to be assigned to the Amazon DynamoDB resource.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#TagValueString\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 256\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#ThrottlingException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.dynamodb#AvailabilityErrorMessage\"\n                },\n                \"throttlingReasons\": {\n                    \"target\": \"com.amazonaws.dynamodb#ThrottlingReasonList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_ThrottlingReason.html\\\">ThrottlingReason</a> that\\n     provide detailed diagnostic information about why the request was throttled.\\n    </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"Throttling\",\n                    \"httpResponseCode\": 400\n                },\n                \"smithy.api#documentation\": \"<p>The request was denied due to request throttling. For detailed information about why\\n            the request was throttled and the ARN of the impacted resource, find the <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_ThrottlingReason.html\\\">ThrottlingReason</a> field in the returned exception.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.dynamodb#ThrottlingReason\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"reason\": {\n                    \"target\": \"com.amazonaws.dynamodb#Reason\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The reason for throttling. The throttling reason follows a specific format:\\n                <code>ResourceType+OperationType+LimitType</code>:</p>\\n         <ul>\\n            <li>\\n               <p>Resource Type (What is being throttled): Table or Index</p>\\n            </li>\\n            <li>\\n               <p>Operation Type (What kind of operation): Read or Write</p>\\n            </li>\\n            <li>\\n               <p>Limit Type (Why the throttling occurred):</p>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <code>ProvisionedThroughputExceeded</code>: The request rate is\\n                            exceeding the <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/provisioned-capacity-mode.html\\\">provisioned throughput capacity</a> (read or write capacity\\n                            units) configured for a table or a global secondary index (GSI) in\\n                            provisioned capacity mode.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <code>AccountLimitExceeded</code>: The request rate has caused a table\\n                            or global secondary index (GSI) in on-demand mode to exceed the <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ServiceQuotas.html#default-limits-throughput\\\">per-table account-level service quotas</a> for read/write\\n                            throughput in the current Amazon Web Services Region. </p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <code>KeyRangeThroughputExceeded</code>: The request rate directed at\\n                            a specific partition key value has exceeded the <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/bp-partition-key-design.html\\\">internal partition-level throughput limits</a>, indicating\\n                            uneven access patterns across the table's or GSI's key space.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <code>MaxOnDemandThroughputExceeded</code>: The request rate has\\n                            exceeded the <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/on-demand-capacity-mode-max-throughput.html\\\">configured maximum throughput limits</a> set for a table or\\n                            index in on-demand capacity mode.</p>\\n                  </li>\\n               </ul>\\n            </li>\\n         </ul>\\n         <p>Examples of complete throttling reasons:</p>\\n         <ul>\\n            <li>\\n               <p>TableReadProvisionedThroughputExceeded</p>\\n            </li>\\n            <li>\\n               <p>IndexWriteAccountLimitExceeded</p>\\n            </li>\\n         </ul>\\n         <p>This helps identify exactly what resource is being throttled, what type of operation\\n            caused it, and why the throttling occurred.</p>\"\n                    }\n                },\n                \"resource\": {\n                    \"target\": \"com.amazonaws.dynamodb#Resource\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the DynamoDB table or index that experienced the\\n            throttling event.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents the specific reason why a DynamoDB request was throttled and the\\n            ARN of the impacted resource. This helps identify exactly what resource is being throttled, \\n            what type of operation caused it, and why the throttling occurred.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#ThrottlingReasonList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.dynamodb#ThrottlingReason\"\n            }\n        },\n        \"com.amazonaws.dynamodb#TimeRangeLowerBound\": {\n            \"type\": \"timestamp\"\n        },\n        \"com.amazonaws.dynamodb#TimeRangeUpperBound\": {\n            \"type\": \"timestamp\"\n        },\n        \"com.amazonaws.dynamodb#TimeToLiveAttributeName\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 255\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#TimeToLiveDescription\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TimeToLiveStatus\": {\n                    \"target\": \"com.amazonaws.dynamodb#TimeToLiveStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The TTL status for the table.</p>\"\n                    }\n                },\n                \"AttributeName\": {\n                    \"target\": \"com.amazonaws.dynamodb#TimeToLiveAttributeName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The name of the TTL attribute for items in the table.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The description of the Time to Live (TTL) status on the specified table. </p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#TimeToLiveEnabled\": {\n            \"type\": \"boolean\"\n        },\n        \"com.amazonaws.dynamodb#TimeToLiveSpecification\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Enabled\": {\n                    \"target\": \"com.amazonaws.dynamodb#TimeToLiveEnabled\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether TTL is to be enabled (true) or disabled (false) on the table.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"AttributeName\": {\n                    \"target\": \"com.amazonaws.dynamodb#TimeToLiveAttributeName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the TTL attribute used to store the expiration time for items in the\\n            table.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents the settings used to enable or disable Time to Live (TTL) for the specified\\n            table.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#TimeToLiveStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ENABLING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ENABLING\"\n                    }\n                },\n                \"DISABLING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DISABLING\"\n                    }\n                },\n                \"ENABLED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ENABLED\"\n                    }\n                },\n                \"DISABLED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DISABLED\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#TransactGetItem\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Get\": {\n                    \"target\": \"com.amazonaws.dynamodb#Get\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Contains the primary key that identifies the item to get, together with the name of\\n            the table that contains the item, and optionally the specific attributes of the item to\\n            retrieve.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Specifies an item to be retrieved as part of the transaction.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#TransactGetItemList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.dynamodb#TransactGetItem\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 100\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#TransactGetItems\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.dynamodb#TransactGetItemsInput\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.dynamodb#TransactGetItemsOutput\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InvalidEndpointException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ProvisionedThroughputExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#RequestLimitExceeded\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ThrottlingException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#TransactionCanceledException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#clientDiscoveredEndpoint\": {\n                    \"required\": false\n                },\n                \"smithy.api#documentation\": \"<p>\\n            <code>TransactGetItems</code> is a synchronous operation that atomically retrieves\\n            multiple items from one or more tables (but not from indexes) in a single account and\\n            Region. A <code>TransactGetItems</code> call can contain up to 100\\n                <code>TransactGetItem</code> objects, each of which contains a <code>Get</code>\\n            structure that specifies an item to retrieve from a table in the account and Region. A\\n            call to <code>TransactGetItems</code> cannot retrieve items from tables in more than one\\n                Amazon Web Services account or Region. The aggregate size of the items in the\\n            transaction cannot exceed 4 MB.</p>\\n         <p>DynamoDB rejects the entire <code>TransactGetItems</code> request if any of\\n            the following is true:</p>\\n         <ul>\\n            <li>\\n               <p>A conflicting operation is in the process of updating an item to be\\n                    read.</p>\\n            </li>\\n            <li>\\n               <p>There is insufficient provisioned capacity for the transaction to be\\n                    completed.</p>\\n            </li>\\n            <li>\\n               <p>There is a user error, such as an invalid data format.</p>\\n            </li>\\n            <li>\\n               <p>The aggregate size of the items in the transaction exceeded 4 MB.</p>\\n            </li>\\n         </ul>\",\n                \"smithy.rules#operationContextParams\": {\n                    \"ResourceArnList\": {\n                        \"path\": \"TransactItems[*].Get.TableName\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#TransactGetItemsInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransactItems\": {\n                    \"target\": \"com.amazonaws.dynamodb#TransactGetItemList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An ordered array of up to 100 <code>TransactGetItem</code> objects, each of which\\n            contains a <code>Get</code> structure.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ReturnConsumedCapacity\": {\n                    \"target\": \"com.amazonaws.dynamodb#ReturnConsumedCapacity\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A value of <code>TOTAL</code> causes consumed capacity information to be returned, and\\n            a value of <code>NONE</code> prevents that information from being returned. No other\\n            value is valid.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#TransactGetItemsOutput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConsumedCapacity\": {\n                    \"target\": \"com.amazonaws.dynamodb#ConsumedCapacityMultiple\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If the <i>ReturnConsumedCapacity</i> value was <code>TOTAL</code>, this\\n            is an array of <code>ConsumedCapacity</code> objects, one for each table addressed by\\n                <code>TransactGetItem</code> objects in the <i>TransactItems</i>\\n            parameter. These <code>ConsumedCapacity</code> objects report the read-capacity units\\n            consumed by the <code>TransactGetItems</code> call in that table.</p>\"\n                    }\n                },\n                \"Responses\": {\n                    \"target\": \"com.amazonaws.dynamodb#ItemResponseList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An ordered array of up to 100 <code>ItemResponse</code> objects, each of which\\n            corresponds to the <code>TransactGetItem</code> object in the same position in the\\n                <i>TransactItems</i> array. Each <code>ItemResponse</code> object\\n            contains a Map of the name-value pairs that are the projected attributes of the\\n            requested item.</p>\\n         <p>If a requested item could not be retrieved, the corresponding\\n                <code>ItemResponse</code> object is Null, or if the requested item has no projected\\n            attributes, the corresponding <code>ItemResponse</code> object is an empty Map. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#TransactWriteItem\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConditionCheck\": {\n                    \"target\": \"com.amazonaws.dynamodb#ConditionCheck\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A request to perform a check item operation.</p>\"\n                    }\n                },\n                \"Put\": {\n                    \"target\": \"com.amazonaws.dynamodb#Put\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A request to perform a <code>PutItem</code> operation.</p>\"\n                    }\n                },\n                \"Delete\": {\n                    \"target\": \"com.amazonaws.dynamodb#Delete\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A request to perform a <code>DeleteItem</code> operation.</p>\"\n                    }\n                },\n                \"Update\": {\n                    \"target\": \"com.amazonaws.dynamodb#Update\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A request to perform an <code>UpdateItem</code> operation.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A list of requests that can perform update, put, delete, or check operations on\\n            multiple items in one or more tables atomically.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#TransactWriteItemList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.dynamodb#TransactWriteItem\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 100\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#TransactWriteItems\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.dynamodb#TransactWriteItemsInput\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.dynamodb#TransactWriteItemsOutput\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.dynamodb#IdempotentParameterMismatchException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InvalidEndpointException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ProvisionedThroughputExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#RequestLimitExceeded\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ThrottlingException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#TransactionCanceledException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#TransactionInProgressException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#clientDiscoveredEndpoint\": {\n                    \"required\": false\n                },\n                \"smithy.api#documentation\": \"<p>\\n            <code>TransactWriteItems</code> is a synchronous write operation that groups up to 100\\n            action requests. These actions can target items in different tables, but not in\\n            different Amazon Web Services accounts or Regions, and no two actions can target the same\\n            item. For example, you cannot both <code>ConditionCheck</code> and <code>Update</code>\\n            the same item. The aggregate size of the items in the transaction cannot exceed 4\\n            MB.</p>\\n         <p>The actions are completed atomically so that either all of them succeed, or all of\\n            them fail. They are defined by the following objects:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>Put</code>  —   Initiates a <code>PutItem</code>\\n                    operation to write a new item. This structure specifies the primary key of the\\n                    item to be written, the name of the table to write it in, an optional condition\\n                    expression that must be satisfied for the write to succeed, a list of the item's\\n                    attributes, and a field indicating whether to retrieve the item's attributes if\\n                    the condition is not met.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>Update</code>  —   Initiates an <code>UpdateItem</code>\\n                    operation to update an existing item. This structure specifies the primary key\\n                    of the item to be updated, the name of the table where it resides, an optional\\n                    condition expression that must be satisfied for the update to succeed, an\\n                    expression that defines one or more attributes to be updated, and a field\\n                    indicating whether to retrieve the item's attributes if the condition is not\\n                    met.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>Delete</code>  —   Initiates a <code>DeleteItem</code>\\n                    operation to delete an existing item. This structure specifies the primary key\\n                    of the item to be deleted, the name of the table where it resides, an optional\\n                    condition expression that must be satisfied for the deletion to succeed, and a\\n                    field indicating whether to retrieve the item's attributes if the condition is\\n                    not met.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ConditionCheck</code>  —   Applies a condition to an item\\n                    that is not being modified by the transaction. This structure specifies the\\n                    primary key of the item to be checked, the name of the table where it resides, a\\n                    condition expression that must be satisfied for the transaction to succeed, and\\n                    a field indicating whether to retrieve the item's attributes if the condition is\\n                    not met.</p>\\n            </li>\\n         </ul>\\n         <p>DynamoDB rejects the entire <code>TransactWriteItems</code> request if any of the\\n            following is true:</p>\\n         <ul>\\n            <li>\\n               <p>A condition in one of the condition expressions is not met.</p>\\n            </li>\\n            <li>\\n               <p>An ongoing operation is in the process of updating the same item.</p>\\n            </li>\\n            <li>\\n               <p>There is insufficient provisioned capacity for the transaction to be\\n                    completed.</p>\\n            </li>\\n            <li>\\n               <p>An item size becomes too large (bigger than 400 KB), a local secondary index\\n                    (LSI) becomes too large, or a similar validation error occurs because of changes\\n                    made by the transaction.</p>\\n            </li>\\n            <li>\\n               <p>The aggregate size of the items in the transaction exceeds 4 MB.</p>\\n            </li>\\n            <li>\\n               <p>There is a user error, such as an invalid data format.</p>\\n            </li>\\n         </ul>\",\n                \"smithy.rules#operationContextParams\": {\n                    \"ResourceArnList\": {\n                        \"path\": \"TransactItems[*].[ConditionCheck.TableName, Put.TableName, Delete.TableName, Update.TableName][]\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#TransactWriteItemsInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransactItems\": {\n                    \"target\": \"com.amazonaws.dynamodb#TransactWriteItemList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An ordered array of up to 100 <code>TransactWriteItem</code> objects, each of which\\n            contains a <code>ConditionCheck</code>, <code>Put</code>, <code>Update</code>, or\\n                <code>Delete</code> object. These can operate on items in different tables, but the\\n            tables must reside in the same Amazon Web Services account and Region, and no two of them\\n            can operate on the same item. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ReturnConsumedCapacity\": {\n                    \"target\": \"com.amazonaws.dynamodb#ReturnConsumedCapacity\"\n                },\n                \"ReturnItemCollectionMetrics\": {\n                    \"target\": \"com.amazonaws.dynamodb#ReturnItemCollectionMetrics\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Determines whether item collection metrics are returned. If set to <code>SIZE</code>,\\n            the response includes statistics about item collections (if any), that were modified\\n            during the operation and are returned in the response. If set to <code>NONE</code> (the\\n            default), no statistics are returned. </p>\"\n                    }\n                },\n                \"ClientRequestToken\": {\n                    \"target\": \"com.amazonaws.dynamodb#ClientRequestToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Providing a <code>ClientRequestToken</code> makes the call to\\n                <code>TransactWriteItems</code> idempotent, meaning that multiple identical calls\\n            have the same effect as one single call.</p>\\n         <p>Although multiple identical calls using the same client request token produce the same\\n            result on the server (no side effects), the responses to the calls might not be the\\n            same. If the <code>ReturnConsumedCapacity</code> parameter is set, then the initial\\n                <code>TransactWriteItems</code> call returns the amount of write capacity units\\n            consumed in making the changes. Subsequent <code>TransactWriteItems</code> calls with\\n            the same client token return the number of read capacity units consumed in reading the\\n            item.</p>\\n         <p>A client request token is valid for 10 minutes after the first request that uses it is\\n            completed. After 10 minutes, any request with the same client token is treated as a new\\n            request. Do not resubmit the same request with the same client token for more than 10\\n            minutes, or the result might not be idempotent.</p>\\n         <p>If you submit a request with the same client token but a change in other parameters\\n            within the 10-minute idempotency window, DynamoDB returns an\\n                <code>IdempotentParameterMismatch</code> exception.</p>\",\n                        \"smithy.api#idempotencyToken\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#TransactWriteItemsOutput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConsumedCapacity\": {\n                    \"target\": \"com.amazonaws.dynamodb#ConsumedCapacityMultiple\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The capacity units consumed by the entire <code>TransactWriteItems</code> operation.\\n            The values of the list are ordered according to the ordering of the\\n                <code>TransactItems</code> request parameter. </p>\"\n                    }\n                },\n                \"ItemCollectionMetrics\": {\n                    \"target\": \"com.amazonaws.dynamodb#ItemCollectionMetricsPerTable\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of tables that were processed by <code>TransactWriteItems</code> and, for each\\n            table, information about any item collections that were affected by individual\\n                <code>UpdateItem</code>, <code>PutItem</code>, or <code>DeleteItem</code>\\n            operations. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#TransactionCanceledException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Message\": {\n                    \"target\": \"com.amazonaws.dynamodb#ErrorMessage\"\n                },\n                \"CancellationReasons\": {\n                    \"target\": \"com.amazonaws.dynamodb#CancellationReasonList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of cancellation reasons.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The entire transaction request was canceled.</p>\\n         <p>DynamoDB cancels a <code>TransactWriteItems</code> request under the following\\n            circumstances:</p>\\n         <ul>\\n            <li>\\n               <p>A condition in one of the condition expressions is not met.</p>\\n            </li>\\n            <li>\\n               <p>A table in the <code>TransactWriteItems</code> request is in a different\\n                    account or region.</p>\\n            </li>\\n            <li>\\n               <p>More than one action in the <code>TransactWriteItems</code> operation\\n                    targets the same item.</p>\\n            </li>\\n            <li>\\n               <p>There is insufficient provisioned capacity for the transaction to be\\n                    completed.</p>\\n            </li>\\n            <li>\\n               <p>An item size becomes too large (larger than 400 KB), or a local secondary\\n                    index (LSI) becomes too large, or a similar validation error occurs because of\\n                    changes made by the transaction.</p>\\n            </li>\\n            <li>\\n               <p>There is a user error, such as an invalid data format.</p>\\n            </li>\\n            <li>\\n               <p> There is an ongoing <code>TransactWriteItems</code> operation that\\n                    conflicts with a concurrent <code>TransactWriteItems</code> request. In this\\n                    case the <code>TransactWriteItems</code> operation fails with a\\n                        <code>TransactionCanceledException</code>. </p>\\n            </li>\\n         </ul>\\n         <p>DynamoDB cancels a <code>TransactGetItems</code> request under the\\n            following circumstances:</p>\\n         <ul>\\n            <li>\\n               <p>There is an ongoing <code>TransactGetItems</code> operation that conflicts\\n                    with a concurrent <code>PutItem</code>, <code>UpdateItem</code>,\\n                        <code>DeleteItem</code> or <code>TransactWriteItems</code> request. In this\\n                    case the <code>TransactGetItems</code> operation fails with a\\n                        <code>TransactionCanceledException</code>.</p>\\n            </li>\\n            <li>\\n               <p>A table in the <code>TransactGetItems</code> request is in a different\\n                    account or region.</p>\\n            </li>\\n            <li>\\n               <p>There is insufficient provisioned capacity for the transaction to be\\n                    completed.</p>\\n            </li>\\n            <li>\\n               <p>There is a user error, such as an invalid data format.</p>\\n            </li>\\n         </ul>\\n         <note>\\n            <p>If using Java, DynamoDB lists the cancellation reasons on the\\n                    <code>CancellationReasons</code> property. This property is not set for other\\n                languages. Transaction cancellation reasons are ordered in the order of requested\\n                items, if an item has no error it will have <code>None</code> code and\\n                    <code>Null</code> message.</p>\\n         </note>\\n         <p>Cancellation reason codes and possible error messages:</p>\\n         <ul>\\n            <li>\\n               <p>No Errors:</p>\\n               <ul>\\n                  <li>\\n                     <p>Code: <code>None</code>\\n                     </p>\\n                  </li>\\n                  <li>\\n                     <p>Message: <code>null</code>\\n                     </p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <p>Conditional Check Failed:</p>\\n               <ul>\\n                  <li>\\n                     <p>Code: <code>ConditionalCheckFailed</code>\\n                     </p>\\n                  </li>\\n                  <li>\\n                     <p>Message: The conditional request failed. </p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <p>Item Collection Size Limit Exceeded:</p>\\n               <ul>\\n                  <li>\\n                     <p>Code: <code>ItemCollectionSizeLimitExceeded</code>\\n                     </p>\\n                  </li>\\n                  <li>\\n                     <p>Message: Collection size exceeded.</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <p>Transaction Conflict:</p>\\n               <ul>\\n                  <li>\\n                     <p>Code: <code>TransactionConflict</code>\\n                     </p>\\n                  </li>\\n                  <li>\\n                     <p>Message: Transaction is ongoing for the item.</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <p>Provisioned Throughput Exceeded:</p>\\n               <ul>\\n                  <li>\\n                     <p>Code: <code>ProvisionedThroughputExceeded</code>\\n                     </p>\\n                  </li>\\n                  <li>\\n                     <p>Messages:</p>\\n                     <ul>\\n                        <li>\\n                           <p>The level of configured provisioned throughput for the\\n                                    table was exceeded. Consider increasing your provisioning level\\n                                    with the UpdateTable API.</p>\\n                           <note>\\n                              <p>This Message is received when provisioned throughput is\\n                                        exceeded is on a provisioned DynamoDB\\n                                        table.</p>\\n                           </note>\\n                        </li>\\n                        <li>\\n                           <p>The level of configured provisioned throughput for one or\\n                                    more global secondary indexes of the table was exceeded.\\n                                    Consider increasing your provisioning level for the\\n                                    under-provisioned global secondary indexes with the UpdateTable\\n                                    API.</p>\\n                           <note>\\n                              <p>This message is returned when provisioned throughput is\\n                                        exceeded is on a provisioned GSI.</p>\\n                           </note>\\n                        </li>\\n                     </ul>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <p>Throttling Error:</p>\\n               <ul>\\n                  <li>\\n                     <p>Code: <code>ThrottlingError</code>\\n                     </p>\\n                  </li>\\n                  <li>\\n                     <p>Messages: </p>\\n                     <ul>\\n                        <li>\\n                           <p>Throughput exceeds the current capacity of your table or\\n                                    index. DynamoDB is automatically scaling your table or\\n                                    index so please try again shortly. If exceptions persist, check\\n                                    if you have a hot key:\\n                                    https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/bp-partition-key-design.html.</p>\\n                           <note>\\n                              <p>This message is returned when writes get throttled on an\\n                                        On-Demand table as DynamoDB is automatically\\n                                        scaling the table.</p>\\n                           </note>\\n                        </li>\\n                        <li>\\n                           <p>Throughput exceeds the current capacity for one or more\\n                                    global secondary indexes. DynamoDB is automatically\\n                                    scaling your index so please try again shortly.</p>\\n                           <note>\\n                              <p>This message is returned when writes get throttled on an\\n                                        On-Demand GSI as DynamoDB is automatically scaling\\n                                        the GSI.</p>\\n                           </note>\\n                        </li>\\n                     </ul>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <p>Validation Error:</p>\\n               <ul>\\n                  <li>\\n                     <p>Code: <code>ValidationError</code>\\n                     </p>\\n                  </li>\\n                  <li>\\n                     <p>Messages: </p>\\n                     <ul>\\n                        <li>\\n                           <p>One or more parameter values were invalid.</p>\\n                        </li>\\n                        <li>\\n                           <p>The update expression attempted to update the secondary\\n                                    index key beyond allowed size limits.</p>\\n                        </li>\\n                        <li>\\n                           <p>The update expression attempted to update the secondary\\n                                    index key to unsupported type.</p>\\n                        </li>\\n                        <li>\\n                           <p>An operand in the update expression has an incorrect data\\n                                    type.</p>\\n                        </li>\\n                        <li>\\n                           <p>Item size to update has exceeded the maximum allowed\\n                                    size.</p>\\n                        </li>\\n                        <li>\\n                           <p>Number overflow. Attempting to store a number with\\n                                    magnitude larger than supported range.</p>\\n                        </li>\\n                        <li>\\n                           <p>Type mismatch for attribute to update.</p>\\n                        </li>\\n                        <li>\\n                           <p>Nesting Levels have exceeded supported limits.</p>\\n                        </li>\\n                        <li>\\n                           <p>The document path provided in the update expression is\\n                                    invalid for update.</p>\\n                        </li>\\n                        <li>\\n                           <p>The provided expression refers to an attribute that does\\n                                    not exist in the item.</p>\\n                        </li>\\n                     </ul>\\n                  </li>\\n               </ul>\\n            </li>\\n         </ul>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.dynamodb#TransactionConflictException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.dynamodb#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Operation was rejected because there is an ongoing transaction for the\\n            item.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.dynamodb#TransactionInProgressException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Message\": {\n                    \"target\": \"com.amazonaws.dynamodb#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The transaction with the given request token is already in progress.</p>\\n         <p> Recommended Settings </p>\\n         <note>\\n            <p> This is a general recommendation for handling the\\n                    <code>TransactionInProgressException</code>. These settings help ensure that the\\n                client retries will trigger completion of the ongoing\\n                    <code>TransactWriteItems</code> request. </p>\\n         </note>\\n         <ul>\\n            <li>\\n               <p> Set <code>clientExecutionTimeout</code> to a value that allows at least one\\n                    retry to be processed after 5 seconds have elapsed since the first attempt for\\n                    the <code>TransactWriteItems</code> operation. </p>\\n            </li>\\n            <li>\\n               <p> Set <code>socketTimeout</code> to a value a little lower than the\\n                        <code>requestTimeout</code> setting. </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>requestTimeout</code> should be set based on the time taken for the\\n                    individual retries of a single HTTP request for your use case, but setting it to\\n                    1 second or higher should work well to reduce chances of retries and\\n                        <code>TransactionInProgressException</code> errors. </p>\\n            </li>\\n            <li>\\n               <p> Use exponential backoff when retrying and tune backoff if needed. </p>\\n            </li>\\n         </ul>\\n         <p> Assuming <a href=\\\"https://github.com/aws/aws-sdk-java/blob/fd409dee8ae23fb8953e0bb4dbde65536a7e0514/aws-java-sdk-core/src/main/java/com/amazonaws/retry/PredefinedRetryPolicies.java#L97\\\">default retry policy</a>, example timeout settings based on the guidelines\\n            above are as follows: </p>\\n         <p>Example timeline:</p>\\n         <ul>\\n            <li>\\n               <p>0-1000 first attempt</p>\\n            </li>\\n            <li>\\n               <p>1000-1500 first sleep/delay (default retry policy uses 500 ms as base delay\\n                    for 4xx errors)</p>\\n            </li>\\n            <li>\\n               <p>1500-2500 second attempt</p>\\n            </li>\\n            <li>\\n               <p>2500-3500 second sleep/delay (500 * 2, exponential backoff)</p>\\n            </li>\\n            <li>\\n               <p>3500-4500 third attempt</p>\\n            </li>\\n            <li>\\n               <p>4500-6500 third sleep/delay (500 * 2^2)</p>\\n            </li>\\n            <li>\\n               <p>6500-7500 fourth attempt (this can trigger inline recovery since 5 seconds\\n                    have elapsed since the first attempt reached TC)</p>\\n            </li>\\n         </ul>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.dynamodb#UntagResource\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.dynamodb#UntagResourceInput\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InvalidEndpointException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ResourceInUseException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ResourceNotFoundException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#clientDiscoveredEndpoint\": {\n                    \"required\": false\n                },\n                \"smithy.api#documentation\": \"<p>Removes the association of tags from an Amazon DynamoDB resource. You can call\\n                <code>UntagResource</code> up to five times per second, per account. </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>UntagResource</code> is an asynchronous operation. If you issue a <a>ListTagsOfResource</a> request immediately after an\\n                        <code>UntagResource</code> request, DynamoDB might return your\\n                    previous tag set, if there was one, or an empty tag set. This is because\\n                        <code>ListTagsOfResource</code> uses an eventually consistent query, and the\\n                    metadata for your tags or table might not be available at that moment. Wait for\\n                    a few seconds, and then try the <code>ListTagsOfResource</code> request\\n                    again.</p>\\n            </li>\\n            <li>\\n               <p>The application or removal of tags using <code>TagResource</code> and\\n                        <code>UntagResource</code> APIs is eventually consistent.\\n                        <code>ListTagsOfResource</code> API will only reflect the changes after a\\n                    few seconds.</p>\\n            </li>\\n         </ul>\\n         <p>For an overview on tagging DynamoDB resources, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Tagging.html\\\">Tagging for DynamoDB</a>\\n            in the <i>Amazon DynamoDB Developer Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#UntagResourceInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ResourceArn\": {\n                    \"target\": \"com.amazonaws.dynamodb#ResourceArnString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The DynamoDB resource that the tags will be removed from. This value is an Amazon\\n            Resource Name (ARN).</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"ResourceArn\"\n                        }\n                    }\n                },\n                \"TagKeys\": {\n                    \"target\": \"com.amazonaws.dynamodb#TagKeyList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of tag keys. Existing tags of the resource whose keys are members of this list\\n            will be removed from the DynamoDB resource.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#Update\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Key\": {\n                    \"target\": \"com.amazonaws.dynamodb#Key\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The primary key of the item to be updated. Each element consists of an attribute name\\n            and a value for that attribute.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"UpdateExpression\": {\n                    \"target\": \"com.amazonaws.dynamodb#UpdateExpression\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An expression that defines one or more attributes to be updated, the action to be\\n            performed on them, and new value(s) for them.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TableName\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Name of the table for the <code>UpdateItem</code> request. You can also provide the\\n            Amazon Resource Name (ARN) of the table in this parameter.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ConditionExpression\": {\n                    \"target\": \"com.amazonaws.dynamodb#ConditionExpression\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A condition that must be satisfied in order for a conditional update to\\n            succeed.</p>\"\n                    }\n                },\n                \"ExpressionAttributeNames\": {\n                    \"target\": \"com.amazonaws.dynamodb#ExpressionAttributeNameMap\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more substitution tokens for attribute names in an expression.</p>\"\n                    }\n                },\n                \"ExpressionAttributeValues\": {\n                    \"target\": \"com.amazonaws.dynamodb#ExpressionAttributeValueMap\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more values that can be substituted in an expression.</p>\"\n                    }\n                },\n                \"ReturnValuesOnConditionCheckFailure\": {\n                    \"target\": \"com.amazonaws.dynamodb#ReturnValuesOnConditionCheckFailure\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use <code>ReturnValuesOnConditionCheckFailure</code> to get the item attributes if the\\n                <code>Update</code> condition fails. For\\n                <code>ReturnValuesOnConditionCheckFailure</code>, the valid values are: NONE and\\n            ALL_OLD.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents a request to perform an <code>UpdateItem</code> operation.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#UpdateContinuousBackups\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.dynamodb#UpdateContinuousBackupsInput\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.dynamodb#UpdateContinuousBackupsOutput\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ContinuousBackupsUnavailableException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InvalidEndpointException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#TableNotFoundException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#clientDiscoveredEndpoint\": {\n                    \"required\": false\n                },\n                \"smithy.api#documentation\": \"<p>\\n            <code>UpdateContinuousBackups</code> enables or disables point in time recovery for\\n            the specified table. A successful <code>UpdateContinuousBackups</code> call returns the\\n            current <code>ContinuousBackupsDescription</code>. Continuous backups are\\n                <code>ENABLED</code> on all tables at table creation. If point in time recovery is\\n            enabled, <code>PointInTimeRecoveryStatus</code> will be set to ENABLED.</p>\\n         <p> Once continuous backups and point in time recovery are enabled, you can restore to\\n            any point in time within <code>EarliestRestorableDateTime</code> and\\n                <code>LatestRestorableDateTime</code>. </p>\\n         <p>\\n            <code>LatestRestorableDateTime</code> is typically 5 minutes before the current time.\\n            You can restore your table to any point in time in the last 35 days. You can set the\\n                <code>RecoveryPeriodInDays</code> to any value between 1 and 35 days.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#UpdateContinuousBackupsInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TableName\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the table. You can also provide the Amazon Resource Name (ARN) of the table in this\\n            parameter.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"ResourceArn\"\n                        }\n                    }\n                },\n                \"PointInTimeRecoverySpecification\": {\n                    \"target\": \"com.amazonaws.dynamodb#PointInTimeRecoverySpecification\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Represents the settings used to enable point in time recovery.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#UpdateContinuousBackupsOutput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ContinuousBackupsDescription\": {\n                    \"target\": \"com.amazonaws.dynamodb#ContinuousBackupsDescription\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Represents the continuous backups and point in time recovery settings on the\\n            table.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#UpdateContributorInsights\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.dynamodb#UpdateContributorInsightsInput\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.dynamodb#UpdateContributorInsightsOutput\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ResourceNotFoundException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Updates the status for contributor insights for a specific table or index. CloudWatch\\n            Contributor Insights for DynamoDB graphs display the partition key and (if applicable)\\n            sort key of frequently accessed items and frequently throttled items in plaintext. If\\n            you require the use of Amazon Web Services Key Management Service (KMS) to encrypt this\\n            table’s partition key and sort key data with an Amazon Web Services managed key or\\n            customer managed key, you should not enable CloudWatch Contributor Insights for DynamoDB\\n            for this table.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#UpdateContributorInsightsInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TableName\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the table. You can also provide the Amazon Resource Name (ARN) of the table in this\\n            parameter.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"ResourceArn\"\n                        }\n                    }\n                },\n                \"IndexName\": {\n                    \"target\": \"com.amazonaws.dynamodb#IndexName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The global secondary index name, if applicable.</p>\"\n                    }\n                },\n                \"ContributorInsightsAction\": {\n                    \"target\": \"com.amazonaws.dynamodb#ContributorInsightsAction\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Represents the contributor insights action.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ContributorInsightsMode\": {\n                    \"target\": \"com.amazonaws.dynamodb#ContributorInsightsMode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies whether to track all access and throttled events or throttled events only for\\n            the DynamoDB table or index.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#UpdateContributorInsightsOutput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TableName\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the table.</p>\"\n                    }\n                },\n                \"IndexName\": {\n                    \"target\": \"com.amazonaws.dynamodb#IndexName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the global secondary index, if applicable.</p>\"\n                    }\n                },\n                \"ContributorInsightsStatus\": {\n                    \"target\": \"com.amazonaws.dynamodb#ContributorInsightsStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The status of contributor insights</p>\"\n                    }\n                },\n                \"ContributorInsightsMode\": {\n                    \"target\": \"com.amazonaws.dynamodb#ContributorInsightsMode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The updated mode of CloudWatch Contributor Insights that determines whether to monitor\\n            all access and throttled events or to track throttled events exclusively.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#UpdateExpression\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.dynamodb#UpdateGlobalSecondaryIndexAction\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"IndexName\": {\n                    \"target\": \"com.amazonaws.dynamodb#IndexName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the global secondary index to be updated.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ProvisionedThroughput\": {\n                    \"target\": \"com.amazonaws.dynamodb#ProvisionedThroughput\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Represents the provisioned throughput settings for the specified global secondary\\n            index.</p>\\n         <p>For current minimum and maximum provisioned throughput values, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Limits.html\\\">Service,\\n                Account, and Table Quotas</a> in the <i>Amazon DynamoDB Developer\\n                Guide</i>.</p>\"\n                    }\n                },\n                \"OnDemandThroughput\": {\n                    \"target\": \"com.amazonaws.dynamodb#OnDemandThroughput\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Updates the maximum number of read and write units for the specified global secondary\\n            index. If you use this parameter, you must specify <code>MaxReadRequestUnits</code>,\\n                <code>MaxWriteRequestUnits</code>, or both.</p>\"\n                    }\n                },\n                \"WarmThroughput\": {\n                    \"target\": \"com.amazonaws.dynamodb#WarmThroughput\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Represents the warm throughput value of the new provisioned throughput settings to be\\n            applied to a global secondary index.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents the new provisioned throughput settings to be applied to a global secondary\\n            index.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#UpdateGlobalTable\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.dynamodb#UpdateGlobalTableInput\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.dynamodb#UpdateGlobalTableOutput\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.dynamodb#GlobalTableNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InvalidEndpointException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ReplicaAlreadyExistsException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ReplicaNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#TableNotFoundException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#clientDiscoveredEndpoint\": {\n                    \"required\": false\n                },\n                \"smithy.api#documentation\": \"<p>Adds or removes replicas in the specified global table. The global table must already\\n            exist to be able to use this operation. Any replica to be added must be empty, have the\\n            same name as the global table, have the same key schema, have DynamoDB Streams enabled,\\n            and have the same provisioned and maximum write capacity units.</p>\\n         <important>\\n            <p>This documentation is for version 2017.11.29 (Legacy) of global tables, which should be avoided for new global tables. Customers should use <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GlobalTables.html\\\">Global Tables version 2019.11.21 (Current)</a> when possible, because it provides greater flexibility, higher efficiency, and consumes less write capacity than 2017.11.29 (Legacy).</p>\\n            <p>To determine which version you're using, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/globaltables.DetermineVersion.html\\\">Determining the global table version you are using</a>. To update existing global tables from version 2017.11.29 (Legacy) to version 2019.11.21 (Current), see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/V2globaltables_upgrade.html\\\">Upgrading global tables</a>.</p>\\n         </important>\\n         <note>\\n            <p> If you are using global tables <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GlobalTables.html\\\">Version\\n                    2019.11.21</a> (Current) you can use <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateTable.html\\\">UpdateTable</a> instead. </p>\\n            <p> Although you can use <code>UpdateGlobalTable</code> to add replicas and remove\\n                replicas in a single request, for simplicity we recommend that you issue separate\\n                requests for adding or removing replicas. </p>\\n         </note>\\n         <p> If global secondary indexes are specified, then the following conditions must also be\\n            met: </p>\\n         <ul>\\n            <li>\\n               <p> The global secondary indexes must have the same name. </p>\\n            </li>\\n            <li>\\n               <p> The global secondary indexes must have the same hash key and sort key (if\\n                    present). </p>\\n            </li>\\n            <li>\\n               <p> The global secondary indexes must have the same provisioned and maximum write\\n                    capacity units. </p>\\n            </li>\\n         </ul>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#UpdateGlobalTableInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"GlobalTableName\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The global table name.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"ResourceArn\"\n                        }\n                    }\n                },\n                \"ReplicaUpdates\": {\n                    \"target\": \"com.amazonaws.dynamodb#ReplicaUpdateList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of Regions that should be added or removed from the global table.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#UpdateGlobalTableOutput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"GlobalTableDescription\": {\n                    \"target\": \"com.amazonaws.dynamodb#GlobalTableDescription\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Contains the details of the global table.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#UpdateGlobalTableSettings\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.dynamodb#UpdateGlobalTableSettingsInput\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.dynamodb#UpdateGlobalTableSettingsOutput\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.dynamodb#GlobalTableNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#IndexNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InvalidEndpointException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ReplicaNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ResourceInUseException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#clientDiscoveredEndpoint\": {\n                    \"required\": false\n                },\n                \"smithy.api#documentation\": \"<p>Updates settings for a global table.</p>\\n         <important>\\n            <p>This documentation is for version 2017.11.29 (Legacy) of global tables, which should be avoided for new global tables. Customers should use <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GlobalTables.html\\\">Global Tables version 2019.11.21 (Current)</a> when possible, because it provides greater flexibility, higher efficiency, and consumes less write capacity than 2017.11.29 (Legacy).</p>\\n            <p>To determine which version you're using, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/globaltables.DetermineVersion.html\\\">Determining the global table version you are using</a>. To update existing global tables from version 2017.11.29 (Legacy) to version 2019.11.21 (Current), see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/V2globaltables_upgrade.html\\\">Upgrading global tables</a>.</p>\\n         </important>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#UpdateGlobalTableSettingsInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"GlobalTableName\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the global table</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"ResourceArn\"\n                        }\n                    }\n                },\n                \"GlobalTableBillingMode\": {\n                    \"target\": \"com.amazonaws.dynamodb#BillingMode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The billing mode of the global table. If <code>GlobalTableBillingMode</code> is not\\n            specified, the global table defaults to <code>PROVISIONED</code> capacity billing\\n            mode.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>PROVISIONED</code> - We recommend using <code>PROVISIONED</code> for\\n                    predictable workloads. <code>PROVISIONED</code> sets the billing mode to <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/provisioned-capacity-mode.html\\\">Provisioned capacity mode</a>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>PAY_PER_REQUEST</code> - We recommend using <code>PAY_PER_REQUEST</code>\\n                    for unpredictable workloads. <code>PAY_PER_REQUEST</code> sets the billing mode\\n                    to <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/on-demand-capacity-mode.html\\\">On-demand capacity mode</a>. </p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"GlobalTableProvisionedWriteCapacityUnits\": {\n                    \"target\": \"com.amazonaws.dynamodb#PositiveLongObject\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of writes consumed per second before DynamoDB returns a\\n                <code>ThrottlingException.</code>\\n         </p>\"\n                    }\n                },\n                \"GlobalTableProvisionedWriteCapacityAutoScalingSettingsUpdate\": {\n                    \"target\": \"com.amazonaws.dynamodb#AutoScalingSettingsUpdate\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Auto scaling settings for managing provisioned write capacity for the global\\n            table.</p>\"\n                    }\n                },\n                \"GlobalTableGlobalSecondaryIndexSettingsUpdate\": {\n                    \"target\": \"com.amazonaws.dynamodb#GlobalTableGlobalSecondaryIndexSettingsUpdateList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Represents the settings of a global secondary index for a global table that will be\\n            modified.</p>\"\n                    }\n                },\n                \"ReplicaSettingsUpdate\": {\n                    \"target\": \"com.amazonaws.dynamodb#ReplicaSettingsUpdateList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Represents the settings for a global table in a Region that will be modified.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#UpdateGlobalTableSettingsOutput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"GlobalTableName\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the global table.</p>\"\n                    }\n                },\n                \"ReplicaSettings\": {\n                    \"target\": \"com.amazonaws.dynamodb#ReplicaSettingsDescriptionList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Region-specific settings for the global table.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#UpdateItem\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.dynamodb#UpdateItemInput\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.dynamodb#UpdateItemOutput\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ConditionalCheckFailedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InvalidEndpointException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ItemCollectionSizeLimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ProvisionedThroughputExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ReplicatedWriteConflictException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#RequestLimitExceeded\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ThrottlingException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#TransactionConflictException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#clientDiscoveredEndpoint\": {\n                    \"required\": false\n                },\n                \"smithy.api#documentation\": \"<p>Edits an existing item's attributes, or adds a new item to the table if it does not\\n            already exist. You can put, delete, or add attribute values. You can also perform a\\n            conditional update on an existing item (insert a new attribute name-value pair if it\\n            doesn't exist, or replace an existing name-value pair if it has certain expected\\n            attribute values).</p>\\n         <p>You can also return the item's attribute values in the same <code>UpdateItem</code>\\n            operation using the <code>ReturnValues</code> parameter.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To update an item in a table\",\n                        \"documentation\": \"This example updates an item in the Music table. It adds a new attribute (Year) and modifies the AlbumTitle attribute.  All of the attributes in the item, as they appear after the update, are returned in the response.\",\n                        \"input\": {\n                            \"TableName\": \"Music\",\n                            \"Key\": {\n                                \"Artist\": {\n                                    \"S\": \"Acme Band\"\n                                },\n                                \"SongTitle\": {\n                                    \"S\": \"Happy Day\"\n                                }\n                            },\n                            \"UpdateExpression\": \"SET #Y = :y, #AT = :t\",\n                            \"ExpressionAttributeNames\": {\n                                \"#Y\": \"Year\",\n                                \"#AT\": \"AlbumTitle\"\n                            },\n                            \"ExpressionAttributeValues\": {\n                                \":y\": {\n                                    \"N\": \"2015\"\n                                },\n                                \":t\": {\n                                    \"S\": \"Louder Than Ever\"\n                                }\n                            },\n                            \"ReturnValues\": \"ALL_NEW\"\n                        },\n                        \"output\": {\n                            \"Attributes\": {\n                                \"AlbumTitle\": {\n                                    \"S\": \"Louder Than Ever\"\n                                },\n                                \"Artist\": {\n                                    \"S\": \"Acme Band\"\n                                },\n                                \"Year\": {\n                                    \"N\": \"2015\"\n                                },\n                                \"SongTitle\": {\n                                    \"S\": \"Happy Day\"\n                                }\n                            }\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.dynamodb#UpdateItemInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TableName\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the table containing the item to update. You can also provide the\\n            Amazon Resource Name (ARN) of the table in this parameter.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"ResourceArn\"\n                        }\n                    }\n                },\n                \"Key\": {\n                    \"target\": \"com.amazonaws.dynamodb#Key\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The primary key of the item to be updated. Each element consists of an attribute name\\n            and a value for that attribute.</p>\\n         <p>For the primary key, you must provide all of the attributes. For example, with a\\n            simple primary key, you only need to provide a value for the partition key. For a\\n            composite primary key, you must provide values for both the partition key and the sort\\n            key.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"AttributeUpdates\": {\n                    \"target\": \"com.amazonaws.dynamodb#AttributeUpdates\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>This is a legacy parameter. Use <code>UpdateExpression</code> instead. For more\\n            information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/LegacyConditionalParameters.AttributeUpdates.html\\\">AttributeUpdates</a> in the <i>Amazon DynamoDB Developer\\n                Guide</i>.</p>\"\n                    }\n                },\n                \"Expected\": {\n                    \"target\": \"com.amazonaws.dynamodb#ExpectedAttributeMap\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>This is a legacy parameter. Use <code>ConditionExpression</code> instead. For more\\n            information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/LegacyConditionalParameters.Expected.html\\\">Expected</a> in the <i>Amazon DynamoDB Developer\\n            Guide</i>.</p>\"\n                    }\n                },\n                \"ConditionalOperator\": {\n                    \"target\": \"com.amazonaws.dynamodb#ConditionalOperator\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>This is a legacy parameter. Use <code>ConditionExpression</code> instead. For more\\n            information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/LegacyConditionalParameters.ConditionalOperator.html\\\">ConditionalOperator</a> in the <i>Amazon DynamoDB Developer\\n                Guide</i>.</p>\"\n                    }\n                },\n                \"ReturnValues\": {\n                    \"target\": \"com.amazonaws.dynamodb#ReturnValue\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use <code>ReturnValues</code> if you want to get the item attributes as they appear\\n            before or after they are successfully updated. For <code>UpdateItem</code>, the valid\\n            values are:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>NONE</code> - If <code>ReturnValues</code> is not specified, or if its\\n                    value is <code>NONE</code>, then nothing is returned. (This setting is the\\n                    default for <code>ReturnValues</code>.)</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ALL_OLD</code> - Returns all of the attributes of the item, as they\\n                    appeared before the UpdateItem operation.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>UPDATED_OLD</code> - Returns only the updated attributes, as they appeared\\n                    before the UpdateItem operation.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ALL_NEW</code> - Returns all of the attributes of the item, as they appear\\n                    after the UpdateItem operation.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>UPDATED_NEW</code> - Returns only the updated attributes, as they appear\\n                    after the UpdateItem operation.</p>\\n            </li>\\n         </ul>\\n         <p>There is no additional cost associated with requesting a return value aside from the\\n            small network and processing overhead of receiving a larger response. No read capacity\\n            units are consumed.</p>\\n         <p>The values returned are strongly consistent.</p>\"\n                    }\n                },\n                \"ReturnConsumedCapacity\": {\n                    \"target\": \"com.amazonaws.dynamodb#ReturnConsumedCapacity\"\n                },\n                \"ReturnItemCollectionMetrics\": {\n                    \"target\": \"com.amazonaws.dynamodb#ReturnItemCollectionMetrics\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Determines whether item collection metrics are returned. If set to <code>SIZE</code>,\\n            the response includes statistics about item collections, if any, that were modified\\n            during the operation are returned in the response. If set to <code>NONE</code> (the\\n            default), no statistics are returned.</p>\"\n                    }\n                },\n                \"UpdateExpression\": {\n                    \"target\": \"com.amazonaws.dynamodb#UpdateExpression\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An expression that defines one or more attributes to be updated, the action to be\\n            performed on them, and new values for them.</p>\\n         <p>The following action values are available for <code>UpdateExpression</code>.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>SET</code> - Adds one or more attributes and values to an item. If any of\\n                    these attributes already exist, they are replaced by the new values. You can\\n                    also use <code>SET</code> to add or subtract from an attribute that is of type\\n                    Number. For example: <code>SET myNum = myNum + :val</code>\\n               </p>\\n               <p>\\n                  <code>SET</code> supports the following functions:</p>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <code>if_not_exists (path, operand)</code> - if the item does not\\n                            contain an attribute at the specified path, then\\n                                <code>if_not_exists</code> evaluates to operand; otherwise, it\\n                            evaluates to path. You can use this function to avoid overwriting an\\n                            attribute that may already be present in the item.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <code>list_append (operand, operand)</code> - evaluates to a list with a\\n                            new element added to it. You can append the new element to the start or\\n                            the end of the list by reversing the order of the operands.</p>\\n                  </li>\\n               </ul>\\n               <p>These function names are case-sensitive.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>REMOVE</code> - Removes one or more attributes from an item.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ADD</code> - Adds the specified value to the item, if the attribute does\\n                    not already exist. If the attribute does exist, then the behavior of\\n                        <code>ADD</code> depends on the data type of the attribute:</p>\\n               <ul>\\n                  <li>\\n                     <p>If the existing attribute is a number, and if <code>Value</code> is\\n                            also a number, then <code>Value</code> is mathematically added to the\\n                            existing attribute. If <code>Value</code> is a negative number, then it\\n                            is subtracted from the existing attribute.</p>\\n                     <note>\\n                        <p>If you use <code>ADD</code> to increment or decrement a number\\n                                value for an item that doesn't exist before the update, DynamoDB\\n                                uses <code>0</code> as the initial value.</p>\\n                        <p>Similarly, if you use <code>ADD</code> for an existing item to\\n                                increment or decrement an attribute value that doesn't exist before\\n                                the update, DynamoDB uses <code>0</code> as the initial value. For\\n                                example, suppose that the item you want to update doesn't have an\\n                                attribute named <code>itemcount</code>, but you decide to\\n                                    <code>ADD</code> the number <code>3</code> to this attribute\\n                                anyway. DynamoDB will create the <code>itemcount</code> attribute,\\n                                set its initial value to <code>0</code>, and finally add\\n                                    <code>3</code> to it. The result will be a new\\n                                    <code>itemcount</code> attribute in the item, with a value of\\n                                    <code>3</code>.</p>\\n                     </note>\\n                  </li>\\n                  <li>\\n                     <p>If the existing data type is a set and if <code>Value</code> is also a\\n                            set, then <code>Value</code> is added to the existing set. For example,\\n                            if the attribute value is the set <code>[1,2]</code>, and the\\n                                <code>ADD</code> action specified <code>[3]</code>, then the final\\n                            attribute value is <code>[1,2,3]</code>. An error occurs if an\\n                                <code>ADD</code> action is specified for a set attribute and the\\n                            attribute type specified does not match the existing set type. </p>\\n                     <p>Both sets must have the same primitive data type. For example, if the\\n                            existing data type is a set of strings, the <code>Value</code> must also\\n                            be a set of strings.</p>\\n                  </li>\\n               </ul>\\n               <important>\\n                  <p>The <code>ADD</code> action only supports Number and set data types. In\\n                        addition, <code>ADD</code> can only be used on top-level attributes, not\\n                        nested attributes.</p>\\n               </important>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>DELETE</code> - Deletes an element from a set.</p>\\n               <p>If a set of values is specified, then those values are subtracted from the old\\n                    set. For example, if the attribute value was the set <code>[a,b,c]</code> and\\n                    the <code>DELETE</code> action specifies <code>[a,c]</code>, then the final\\n                    attribute value is <code>[b]</code>. Specifying an empty set is an error.</p>\\n               <important>\\n                  <p>The <code>DELETE</code> action only supports set data types. In addition,\\n                            <code>DELETE</code> can only be used on top-level attributes, not nested\\n                        attributes.</p>\\n               </important>\\n            </li>\\n         </ul>\\n         <p>You can have many actions in a single expression, such as the following: <code>SET\\n                a=:value1, b=:value2 DELETE :value3, :value4, :value5</code>\\n         </p>\\n         <p>For more information on update expressions, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.Modifying.html\\\">Modifying\\n                Items and Attributes</a> in the <i>Amazon DynamoDB Developer\\n                Guide</i>.</p>\"\n                    }\n                },\n                \"ConditionExpression\": {\n                    \"target\": \"com.amazonaws.dynamodb#ConditionExpression\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A condition that must be satisfied in order for a conditional update to\\n            succeed.</p>\\n         <p>An expression can contain any of the following:</p>\\n         <ul>\\n            <li>\\n               <p>Functions: <code>attribute_exists | attribute_not_exists | attribute_type |\\n                        contains | begins_with | size</code>\\n               </p>\\n               <p>These function names are case-sensitive.</p>\\n            </li>\\n            <li>\\n               <p>Comparison operators: <code>= | <> |\\n            < | > | <= | >= |\\n            BETWEEN | IN </code>\\n               </p>\\n            </li>\\n            <li>\\n               <p> Logical operators: <code>AND | OR | NOT</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>For more information about condition expressions, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.SpecifyingConditions.html\\\">Specifying Conditions</a> in the <i>Amazon DynamoDB Developer\\n                Guide</i>.</p>\"\n                    }\n                },\n                \"ExpressionAttributeNames\": {\n                    \"target\": \"com.amazonaws.dynamodb#ExpressionAttributeNameMap\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more substitution tokens for attribute names in an expression. The following\\n            are some use cases for using <code>ExpressionAttributeNames</code>:</p>\\n         <ul>\\n            <li>\\n               <p>To access an attribute whose name conflicts with a DynamoDB reserved\\n                    word.</p>\\n            </li>\\n            <li>\\n               <p>To create a placeholder for repeating occurrences of an attribute name in an\\n                    expression.</p>\\n            </li>\\n            <li>\\n               <p>To prevent special characters in an attribute name from being misinterpreted\\n                    in an expression.</p>\\n            </li>\\n         </ul>\\n         <p>Use the <b>#</b> character in an expression to dereference\\n            an attribute name. For example, consider the following attribute name:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>Percentile</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>The name of this attribute conflicts with a reserved word, so it cannot be used\\n            directly in an expression. (For the complete list of reserved words, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ReservedWords.html\\\">Reserved Words</a> in the <i>Amazon DynamoDB Developer\\n            Guide</i>.) To work around this, you could specify the following for\\n                <code>ExpressionAttributeNames</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>{\\\"#P\\\":\\\"Percentile\\\"}</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>You could then use this substitution in an expression, as in this example:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>#P = :val</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <note>\\n            <p>Tokens that begin with the <b>:</b> character are\\n                    <i>expression attribute values</i>, which are placeholders for the\\n                actual value at runtime.</p>\\n         </note>\\n         <p>For more information about expression attribute names, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.AccessingItemAttributes.html\\\">Specifying Item Attributes</a> in the <i>Amazon DynamoDB Developer\\n                Guide</i>.</p>\"\n                    }\n                },\n                \"ExpressionAttributeValues\": {\n                    \"target\": \"com.amazonaws.dynamodb#ExpressionAttributeValueMap\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more values that can be substituted in an expression.</p>\\n         <p>Use the <b>:</b> (colon) character in an expression to\\n            dereference an attribute value. For example, suppose that you wanted to check whether\\n            the value of the <code>ProductStatus</code> attribute was one of the following: </p>\\n         <p>\\n            <code>Available | Backordered | Discontinued</code>\\n         </p>\\n         <p>You would first need to specify <code>ExpressionAttributeValues</code> as\\n            follows:</p>\\n         <p>\\n            <code>{ \\\":avail\\\":{\\\"S\\\":\\\"Available\\\"}, \\\":back\\\":{\\\"S\\\":\\\"Backordered\\\"},\\n                \\\":disc\\\":{\\\"S\\\":\\\"Discontinued\\\"} }</code>\\n         </p>\\n         <p>You could then use these values in an expression, such as this:</p>\\n         <p>\\n            <code>ProductStatus IN (:avail, :back, :disc)</code>\\n         </p>\\n         <p>For more information on expression attribute values, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.SpecifyingConditions.html\\\">Condition Expressions</a> in the <i>Amazon DynamoDB Developer\\n                Guide</i>.</p>\"\n                    }\n                },\n                \"ReturnValuesOnConditionCheckFailure\": {\n                    \"target\": \"com.amazonaws.dynamodb#ReturnValuesOnConditionCheckFailure\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An optional parameter that returns the item attributes for an <code>UpdateItem</code>\\n            operation that failed a condition check.</p>\\n         <p>There is no additional cost associated with requesting a return value aside from the\\n            small network and processing overhead of receiving a larger response. No read capacity\\n            units are consumed.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents the input of an <code>UpdateItem</code> operation.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#UpdateItemOutput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Attributes\": {\n                    \"target\": \"com.amazonaws.dynamodb#AttributeMap\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A map of attribute values as they appear before or after the <code>UpdateItem</code>\\n            operation, as determined by the <code>ReturnValues</code> parameter.</p>\\n         <p>The <code>Attributes</code> map is only present if the update was successful and\\n                <code>ReturnValues</code> was specified as something other than <code>NONE</code> in\\n            the request. Each element represents one attribute.</p>\"\n                    }\n                },\n                \"ConsumedCapacity\": {\n                    \"target\": \"com.amazonaws.dynamodb#ConsumedCapacity\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The capacity units consumed by the <code>UpdateItem</code> operation. The data\\n            returned includes the total provisioned throughput consumed, along with statistics for\\n            the table and any indexes involved in the operation. <code>ConsumedCapacity</code> is\\n            only returned if the <code>ReturnConsumedCapacity</code> parameter was specified. For\\n            more information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/read-write-operations.html#write-operation-consumption\\\">Capacity unity consumption for write operations</a> in the <i>Amazon\\n                DynamoDB Developer Guide</i>.</p>\"\n                    }\n                },\n                \"ItemCollectionMetrics\": {\n                    \"target\": \"com.amazonaws.dynamodb#ItemCollectionMetrics\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Information about item collections, if any, that were affected by the\\n                <code>UpdateItem</code> operation. <code>ItemCollectionMetrics</code> is only\\n            returned if the <code>ReturnItemCollectionMetrics</code> parameter was specified. If the\\n            table does not have any local secondary indexes, this information is not returned in the\\n            response.</p>\\n         <p>Each <code>ItemCollectionMetrics</code> element consists of:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>ItemCollectionKey</code> - The partition key value of the item collection.\\n                    This is the same as the partition key value of the item itself.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>SizeEstimateRangeGB</code> - An estimate of item collection size, in\\n                    gigabytes. This value is a two-element array containing a lower bound and an\\n                    upper bound for the estimate. The estimate includes the size of all the items in\\n                    the table, plus the size of all attributes projected into all of the local\\n                    secondary indexes on that table. Use this estimate to measure whether a local\\n                    secondary index is approaching its size limit.</p>\\n               <p>The estimate is subject to change over time; therefore, do not rely on the\\n                    precision or accuracy of the estimate.</p>\\n            </li>\\n         </ul>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents the output of an <code>UpdateItem</code> operation.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#UpdateKinesisStreamingConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ApproximateCreationDateTimePrecision\": {\n                    \"target\": \"com.amazonaws.dynamodb#ApproximateCreationDateTimePrecision\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Enables updating the precision of Kinesis data stream timestamp. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Enables updating the configuration for Kinesis Streaming.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#UpdateKinesisStreamingDestination\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.dynamodb#UpdateKinesisStreamingDestinationInput\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.dynamodb#UpdateKinesisStreamingDestinationOutput\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InvalidEndpointException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ResourceInUseException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ResourceNotFoundException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#clientDiscoveredEndpoint\": {\n                    \"required\": false\n                },\n                \"smithy.api#documentation\": \"<p>The command to update the Kinesis stream destination.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#UpdateKinesisStreamingDestinationInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TableName\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The table name for the Kinesis streaming destination input. You can also provide the\\n            ARN of the table in this parameter.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"ResourceArn\"\n                        }\n                    }\n                },\n                \"StreamArn\": {\n                    \"target\": \"com.amazonaws.dynamodb#StreamArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) for the Kinesis stream input.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"UpdateKinesisStreamingConfiguration\": {\n                    \"target\": \"com.amazonaws.dynamodb#UpdateKinesisStreamingConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The command to update the Kinesis stream configuration.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#UpdateKinesisStreamingDestinationOutput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TableName\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The table name for the Kinesis streaming destination output.</p>\"\n                    }\n                },\n                \"StreamArn\": {\n                    \"target\": \"com.amazonaws.dynamodb#StreamArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN for the Kinesis stream input.</p>\"\n                    }\n                },\n                \"DestinationStatus\": {\n                    \"target\": \"com.amazonaws.dynamodb#DestinationStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The status of the attempt to update the Kinesis streaming destination output.</p>\"\n                    }\n                },\n                \"UpdateKinesisStreamingConfiguration\": {\n                    \"target\": \"com.amazonaws.dynamodb#UpdateKinesisStreamingConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The command to update the Kinesis streaming destination configuration.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#UpdateReplicationGroupMemberAction\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RegionName\": {\n                    \"target\": \"com.amazonaws.dynamodb#RegionName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Region where the replica exists.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"KMSMasterKeyId\": {\n                    \"target\": \"com.amazonaws.dynamodb#KMSMasterKeyId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The KMS key of the replica that should be used for KMS\\n            encryption. To specify a key, use its key ID, Amazon Resource Name (ARN), alias name, or\\n            alias ARN. Note that you should only provide this parameter if the key is different from\\n            the default DynamoDB KMS key <code>alias/aws/dynamodb</code>.</p>\"\n                    }\n                },\n                \"ProvisionedThroughputOverride\": {\n                    \"target\": \"com.amazonaws.dynamodb#ProvisionedThroughputOverride\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Replica-specific provisioned throughput. If not specified, uses the source table's\\n            provisioned throughput settings.</p>\"\n                    }\n                },\n                \"OnDemandThroughputOverride\": {\n                    \"target\": \"com.amazonaws.dynamodb#OnDemandThroughputOverride\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Overrides the maximum on-demand throughput for the replica table.</p>\"\n                    }\n                },\n                \"GlobalSecondaryIndexes\": {\n                    \"target\": \"com.amazonaws.dynamodb#ReplicaGlobalSecondaryIndexList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Replica-specific global secondary index settings.</p>\"\n                    }\n                },\n                \"TableClassOverride\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableClass\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Replica-specific table class. If not specified, uses the source table's table\\n            class.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents a replica to be modified.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#UpdateTable\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.dynamodb#UpdateTableInput\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.dynamodb#UpdateTableOutput\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InvalidEndpointException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ResourceInUseException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ResourceNotFoundException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#clientDiscoveredEndpoint\": {\n                    \"required\": false\n                },\n                \"smithy.api#documentation\": \"<p>Modifies the provisioned throughput settings, global secondary indexes, or DynamoDB\\n            Streams settings for a given table.</p>\\n         <p>You can only perform one of the following operations at once:</p>\\n         <ul>\\n            <li>\\n               <p>Modify the provisioned throughput settings of the table.</p>\\n            </li>\\n            <li>\\n               <p>Remove a global secondary index from the table.</p>\\n            </li>\\n            <li>\\n               <p>Create a new global secondary index on the table. After the index begins\\n                    backfilling, you can use <code>UpdateTable</code> to perform other\\n                    operations.</p>\\n            </li>\\n         </ul>\\n         <p>\\n            <code>UpdateTable</code> is an asynchronous operation; while it's executing, the table\\n            status changes from <code>ACTIVE</code> to <code>UPDATING</code>. While it's\\n                <code>UPDATING</code>, you can't issue another <code>UpdateTable</code> request.\\n            When the table returns to the <code>ACTIVE</code> state, the <code>UpdateTable</code>\\n            operation is complete.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#UpdateTableInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AttributeDefinitions\": {\n                    \"target\": \"com.amazonaws.dynamodb#AttributeDefinitions\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An array of attributes that describe the key schema for the table and indexes. If you\\n            are adding a new global secondary index to the table, <code>AttributeDefinitions</code>\\n            must include the key element(s) of the new index.</p>\"\n                    }\n                },\n                \"TableName\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the table to be updated. You can also provide the Amazon Resource Name (ARN) of the table\\n            in this parameter.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"ResourceArn\"\n                        }\n                    }\n                },\n                \"BillingMode\": {\n                    \"target\": \"com.amazonaws.dynamodb#BillingMode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Controls how you are charged for read and write throughput and how you manage\\n            capacity. When switching from pay-per-request to provisioned capacity, initial\\n            provisioned capacity values must be set. The initial provisioned capacity values are\\n            estimated based on the consumed read and write capacity of your table and global\\n            secondary indexes over the past 30 minutes.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>PAY_PER_REQUEST</code> - We recommend using <code>PAY_PER_REQUEST</code>\\n                    for most DynamoDB workloads. <code>PAY_PER_REQUEST</code> sets the billing mode\\n                    to <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/on-demand-capacity-mode.html\\\">On-demand capacity mode</a>. </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>PROVISIONED</code> - We recommend using <code>PROVISIONED</code> for\\n                    steady workloads with predictable growth where capacity requirements can be\\n                    reliably forecasted. <code>PROVISIONED</code> sets the billing mode to <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/provisioned-capacity-mode.html\\\">Provisioned capacity mode</a>.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"ProvisionedThroughput\": {\n                    \"target\": \"com.amazonaws.dynamodb#ProvisionedThroughput\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The new provisioned throughput settings for the specified table or index.</p>\"\n                    }\n                },\n                \"GlobalSecondaryIndexUpdates\": {\n                    \"target\": \"com.amazonaws.dynamodb#GlobalSecondaryIndexUpdateList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An array of one or more global secondary indexes for the table. For each index in the\\n            array, you can request one action:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>Create</code> - add a new global secondary index to the table.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>Update</code> - modify the provisioned throughput settings of an existing\\n                    global secondary index.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>Delete</code> - remove a global secondary index from the table.</p>\\n            </li>\\n         </ul>\\n         <p>You can create or delete only one global secondary index per <code>UpdateTable</code>\\n            operation.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GSI.OnlineOps.html\\\">Managing Global\\n                Secondary Indexes</a> in the <i>Amazon DynamoDB Developer\\n                Guide</i>. </p>\"\n                    }\n                },\n                \"StreamSpecification\": {\n                    \"target\": \"com.amazonaws.dynamodb#StreamSpecification\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Represents the DynamoDB Streams configuration for the table.</p>\\n         <note>\\n            <p>You receive a <code>ValidationException</code> if you try to enable a stream on a\\n                table that already has a stream, or if you try to disable a stream on a table that\\n                doesn't have a stream.</p>\\n         </note>\"\n                    }\n                },\n                \"SSESpecification\": {\n                    \"target\": \"com.amazonaws.dynamodb#SSESpecification\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The new server-side encryption settings for the specified table.</p>\"\n                    }\n                },\n                \"ReplicaUpdates\": {\n                    \"target\": \"com.amazonaws.dynamodb#ReplicationGroupUpdateList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of replica update actions (create, delete, or update) for the table.</p>\"\n                    }\n                },\n                \"TableClass\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableClass\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The table class of the table to be updated. Valid values are <code>STANDARD</code> and\\n                <code>STANDARD_INFREQUENT_ACCESS</code>.</p>\"\n                    }\n                },\n                \"DeletionProtectionEnabled\": {\n                    \"target\": \"com.amazonaws.dynamodb#DeletionProtectionEnabled\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether deletion protection is to be enabled (true) or disabled (false) on\\n            the table.</p>\"\n                    }\n                },\n                \"MultiRegionConsistency\": {\n                    \"target\": \"com.amazonaws.dynamodb#MultiRegionConsistency\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the consistency mode for a new global table. This parameter is only valid\\n            when you create a global table by specifying one or more <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_ReplicationGroupUpdate.html#DDB-Type-ReplicationGroupUpdate-Create\\\">Create</a> actions in the <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_UpdateTable.html#DDB-UpdateTable-request-ReplicaUpdates\\\">ReplicaUpdates</a> action list.</p>\\n         <p>You can specify one of the following consistency modes:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>EVENTUAL</code>: Configures a new global table for multi-Region eventual\\n                    consistency (MREC). This is the default consistency mode for global\\n                    tables.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>STRONG</code>: Configures a new global table for multi-Region strong\\n                    consistency (MRSC).</p>\\n            </li>\\n         </ul>\\n         <p>If you don't specify this field, the global table consistency mode defaults to\\n                <code>EVENTUAL</code>. For more information about global tables consistency modes,\\n            see <a href=\\\"https://docs.aws.amazon.com/V2globaltables_HowItWorks.html#V2globaltables_HowItWorks.consistency-modes\\\">\\n                Consistency modes</a> in DynamoDB developer guide. </p>\"\n                    }\n                },\n                \"GlobalTableWitnessUpdates\": {\n                    \"target\": \"com.amazonaws.dynamodb#GlobalTableWitnessGroupUpdateList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of witness updates for a  MRSC global table. A witness provides a cost-effective\\n            alternative to a full replica in a MRSC global table by maintaining replicated change\\n            data written to global table replicas. You cannot perform read or write operations on a\\n            witness. For each witness, you can request one action:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>Create</code> - add a new witness to the global table.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>Delete</code> - remove a witness from the global table.</p>\\n            </li>\\n         </ul>\\n         <p>You can create or delete only one witness per <code>UpdateTable</code>\\n            operation.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/V2globaltables_HowItWorks.html#V2globaltables_HowItWorks.consistency-modes\\\">Multi-Region strong consistency (MRSC)</a> in the Amazon DynamoDB\\n            Developer Guide</p>\"\n                    }\n                },\n                \"OnDemandThroughput\": {\n                    \"target\": \"com.amazonaws.dynamodb#OnDemandThroughput\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Updates the maximum number of read and write units for the specified table in\\n            on-demand capacity mode. If you use this parameter, you must specify\\n                <code>MaxReadRequestUnits</code>, <code>MaxWriteRequestUnits</code>, or both.</p>\"\n                    }\n                },\n                \"WarmThroughput\": {\n                    \"target\": \"com.amazonaws.dynamodb#WarmThroughput\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Represents the warm throughput (in read units per second and write units per second)\\n            for updating a table.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents the input of an <code>UpdateTable</code> operation.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#UpdateTableOutput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TableDescription\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableDescription\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Represents the properties of the table.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents the output of an <code>UpdateTable</code> operation.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#UpdateTableReplicaAutoScaling\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.dynamodb#UpdateTableReplicaAutoScalingInput\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.dynamodb#UpdateTableReplicaAutoScalingOutput\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ResourceInUseException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ResourceNotFoundException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Updates auto scaling settings on your global tables at once.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#UpdateTableReplicaAutoScalingInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"GlobalSecondaryIndexUpdates\": {\n                    \"target\": \"com.amazonaws.dynamodb#GlobalSecondaryIndexAutoScalingUpdateList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Represents the auto scaling settings of the global secondary indexes of the replica to\\n            be updated.</p>\"\n                    }\n                },\n                \"TableName\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the global table to be updated. You can also provide the Amazon Resource Name (ARN) of the\\n            table in this parameter.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"ResourceArn\"\n                        }\n                    }\n                },\n                \"ProvisionedWriteCapacityAutoScalingUpdate\": {\n                    \"target\": \"com.amazonaws.dynamodb#AutoScalingSettingsUpdate\"\n                },\n                \"ReplicaUpdates\": {\n                    \"target\": \"com.amazonaws.dynamodb#ReplicaAutoScalingUpdateList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Represents the auto scaling settings of replicas of the table that will be\\n            modified.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#UpdateTableReplicaAutoScalingOutput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TableAutoScalingDescription\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableAutoScalingDescription\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Returns information about the auto scaling settings of a table with replicas.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#UpdateTimeToLive\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.dynamodb#UpdateTimeToLiveInput\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.dynamodb#UpdateTimeToLiveOutput\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#InvalidEndpointException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ResourceInUseException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.dynamodb#ResourceNotFoundException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#clientDiscoveredEndpoint\": {\n                    \"required\": false\n                },\n                \"smithy.api#documentation\": \"<p>The <code>UpdateTimeToLive</code> method enables or disables Time to Live (TTL) for\\n            the specified table. A successful <code>UpdateTimeToLive</code> call returns the current\\n                <code>TimeToLiveSpecification</code>. It can take up to one hour for the change to\\n            fully process. Any additional <code>UpdateTimeToLive</code> calls for the same table\\n            during this one hour duration result in a <code>ValidationException</code>. </p>\\n         <p>TTL compares the current time in epoch time format to the time stored in the TTL\\n            attribute of an item. If the epoch time value stored in the attribute is less than the\\n            current time, the item is marked as expired and subsequently deleted.</p>\\n         <note>\\n            <p> The epoch time format is the number of seconds elapsed since 12:00:00 AM January\\n                1, 1970 UTC. </p>\\n         </note>\\n         <p>DynamoDB deletes expired items on a best-effort basis to ensure availability of\\n            throughput for other data operations. </p>\\n         <important>\\n            <p>DynamoDB typically deletes expired items within two days of expiration. The exact\\n                duration within which an item gets deleted after expiration is specific to the\\n                nature of the workload. Items that have expired and not been deleted will still show\\n                up in reads, queries, and scans.</p>\\n         </important>\\n         <p>As items are deleted, they are removed from any local secondary index and global\\n            secondary index immediately in the same eventually consistent way as a standard delete\\n            operation.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/TTL.html\\\">Time To Live</a> in the\\n            Amazon DynamoDB Developer Guide. </p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#UpdateTimeToLiveInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TableName\": {\n                    \"target\": \"com.amazonaws.dynamodb#TableArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the table to be configured. You can also provide the Amazon Resource Name (ARN) of the\\n            table in this parameter.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"ResourceArn\"\n                        }\n                    }\n                },\n                \"TimeToLiveSpecification\": {\n                    \"target\": \"com.amazonaws.dynamodb#TimeToLiveSpecification\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Represents the settings used to enable or disable Time to Live for the specified\\n            table.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents the input of an <code>UpdateTimeToLive</code> operation.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#UpdateTimeToLiveOutput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TimeToLiveSpecification\": {\n                    \"target\": \"com.amazonaws.dynamodb#TimeToLiveSpecification\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Represents the output of an <code>UpdateTimeToLive</code> operation.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.dynamodb#WarmThroughput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ReadUnitsPerSecond\": {\n                    \"target\": \"com.amazonaws.dynamodb#LongObject\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Represents the number of read operations your base table can instantaneously\\n            support.</p>\"\n                    }\n                },\n                \"WriteUnitsPerSecond\": {\n                    \"target\": \"com.amazonaws.dynamodb#LongObject\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Represents the number of write operations your base table can instantaneously\\n            support.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Provides visibility into the number of read and write operations your table or\\n            secondary index can instantaneously support. The settings can be modified using the\\n                <code>UpdateTable</code> operation to meet the throughput requirements of an\\n            upcoming peak event.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#WitnessStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"CREATING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"CREATING\"\n                    }\n                },\n                \"DELETING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DELETING\"\n                    }\n                },\n                \"ACTIVE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ACTIVE\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.dynamodb#WriteRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PutRequest\": {\n                    \"target\": \"com.amazonaws.dynamodb#PutRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A request to perform a <code>PutItem</code> operation.</p>\"\n                    }\n                },\n                \"DeleteRequest\": {\n                    \"target\": \"com.amazonaws.dynamodb#DeleteRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A request to perform a <code>DeleteItem</code> operation.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents an operation to perform - either <code>DeleteItem</code> or\\n                <code>PutItem</code>. You can only request one of these operations, not both, in a\\n            single <code>WriteRequest</code>. If you do need to perform both of these operations,\\n            you need to provide two separate <code>WriteRequest</code> objects.</p>\"\n            }\n        },\n        \"com.amazonaws.dynamodb#WriteRequests\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.dynamodb#WriteRequest\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 25\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "aws/sdk/aws-models/ec2.json",
    "content": "{\n    \"smithy\": \"2.0\",\n    \"metadata\": {\n        \"suppressions\": [\n            {\n                \"id\": \"HttpMethodSemantics\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"HttpResponseCodeSemantics\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"PaginatedTrait\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"HttpHeaderTrait\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"HttpUriConflict\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"Service\",\n                \"namespace\": \"*\"\n            }\n        ]\n    },\n    \"shapes\": {\n        \"com.amazonaws.ec2#AcceleratorCount\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Min\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Min\",\n                        \"smithy.api#documentation\": \"<p>The minimum number of accelerators. If this parameter is not specified, there is no minimum\\n         limit.</p>\",\n                        \"smithy.api#xmlName\": \"min\"\n                    }\n                },\n                \"Max\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Max\",\n                        \"smithy.api#documentation\": \"<p>The maximum number of accelerators. If this parameter is not specified, there is no\\n         maximum limit.</p>\",\n                        \"smithy.api#xmlName\": \"max\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The minimum and maximum number of accelerators (GPUs, FPGAs, or Amazon Web Services Inferentia chips)\\n         on an instance.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#AcceleratorCountRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Min\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The minimum number of accelerators. To specify no minimum limit, omit this\\n         parameter.</p>\"\n                    }\n                },\n                \"Max\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of accelerators. To specify no maximum limit, omit this\\n         parameter. To exclude accelerator-enabled instance types, set <code>Max</code> to\\n         <code>0</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The minimum and maximum number of accelerators (GPUs, FPGAs, or Amazon Web Services Inferentia chips)\\n         on an instance. To exclude accelerator-enabled instance types, set <code>Max</code> to\\n            <code>0</code>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#AcceleratorManufacturer\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"AMAZON_WEB_SERVICES\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"amazon-web-services\"\n                    }\n                },\n                \"AMD\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"amd\"\n                    }\n                },\n                \"NVIDIA\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"nvidia\"\n                    }\n                },\n                \"XILINX\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"xilinx\"\n                    }\n                },\n                \"HABANA\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"habana\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#AcceleratorManufacturerSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#AcceleratorManufacturer\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#AcceleratorName\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"A100\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"a100\"\n                    }\n                },\n                \"INFERENTIA\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"inferentia\"\n                    }\n                },\n                \"K520\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"k520\"\n                    }\n                },\n                \"K80\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"k80\"\n                    }\n                },\n                \"M60\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m60\"\n                    }\n                },\n                \"RADEON_PRO_V520\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"radeon-pro-v520\"\n                    }\n                },\n                \"T4\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"t4\"\n                    }\n                },\n                \"VU9P\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"vu9p\"\n                    }\n                },\n                \"V100\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"v100\"\n                    }\n                },\n                \"A10G\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"a10g\"\n                    }\n                },\n                \"H100\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"h100\"\n                    }\n                },\n                \"T4G\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"t4g\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#AcceleratorNameSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#AcceleratorName\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#AcceleratorTotalMemoryMiB\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Min\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Min\",\n                        \"smithy.api#documentation\": \"<p>The minimum amount of accelerator memory, in MiB. If this parameter is not specified,\\n         there is no minimum limit.</p>\",\n                        \"smithy.api#xmlName\": \"min\"\n                    }\n                },\n                \"Max\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Max\",\n                        \"smithy.api#documentation\": \"<p>The maximum amount of accelerator memory, in MiB. If this parameter is not specified,\\n         there is no maximum limit.</p>\",\n                        \"smithy.api#xmlName\": \"max\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The minimum and maximum amount of total accelerator memory, in MiB.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#AcceleratorTotalMemoryMiBRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Min\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The minimum amount of accelerator memory, in MiB. To specify no minimum limit, omit this\\n         parameter.</p>\"\n                    }\n                },\n                \"Max\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum amount of accelerator memory, in MiB. To specify no maximum limit, omit this\\n         parameter.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The minimum and maximum amount of total accelerator memory, in MiB.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#AcceleratorType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"GPU\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"gpu\"\n                    }\n                },\n                \"FPGA\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"fpga\"\n                    }\n                },\n                \"INFERENCE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"inference\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#AcceleratorTypeSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#AcceleratorType\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#AcceptAddressTransfer\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#AcceptAddressTransferRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#AcceptAddressTransferResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Accepts an Elastic IP address transfer. For more information, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/userguide/vpc-eips.html#using-instance-addressing-eips-transfer-accept\\\">Accept a transferred Elastic IP address</a> in the <i>Amazon VPC User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#AcceptAddressTransferRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Address\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The Elastic IP address you are accepting for transfer.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>\\n            <code>tag</code>:<key> - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\\n    For example, to find all resources that have a tag with the key <code>Owner</code> and the value <code>TeamA</code>, specify <code>tag:Owner</code> for the filter name and <code>TeamA</code> for the filter value.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#AcceptAddressTransferResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AddressTransfer\": {\n                    \"target\": \"com.amazonaws.ec2#AddressTransfer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AddressTransfer\",\n                        \"smithy.api#documentation\": \"<p>An Elastic IP address transfer.</p>\",\n                        \"smithy.api#xmlName\": \"addressTransfer\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#AcceptCapacityReservationBillingOwnership\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#AcceptCapacityReservationBillingOwnershipRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#AcceptCapacityReservationBillingOwnershipResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Accepts a request to assign billing of the available capacity of a shared Capacity\\n\\t\\t\\tReservation to your account. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/assign-billing.html\\\"> Billing assignment for shared\\n\\t\\t\\t\\t\\tAmazon EC2 Capacity Reservations</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#AcceptCapacityReservationBillingOwnershipRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"CapacityReservationId\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityReservationId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the Capacity Reservation for which to accept the request.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#AcceptCapacityReservationBillingOwnershipResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Return\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Return\",\n                        \"smithy.api#documentation\": \"<p>Returns <code>true</code> if the request succeeds; otherwise, it returns an error.</p>\",\n                        \"smithy.api#xmlName\": \"return\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#AcceptReservedInstancesExchangeQuote\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#AcceptReservedInstancesExchangeQuoteRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#AcceptReservedInstancesExchangeQuoteResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Accepts the Convertible Reserved Instance exchange quote described in the <a>GetReservedInstancesExchangeQuote</a> call.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#AcceptReservedInstancesExchangeQuoteRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making\\n      the request, and provides an error response. If you have the required permissions, the error\\n      response is <code>DryRunOperation</code>. Otherwise, it is\\n      <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"ReservedInstanceIds\": {\n                    \"target\": \"com.amazonaws.ec2#ReservedInstanceIdSet\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The IDs of the Convertible Reserved Instances to exchange for another Convertible Reserved\\n      Instance of the same or higher value.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"ReservedInstanceId\"\n                    }\n                },\n                \"TargetConfigurations\": {\n                    \"target\": \"com.amazonaws.ec2#TargetConfigurationRequestSet\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The configuration of the target Convertible Reserved Instance to exchange for your current\\n      Convertible Reserved Instances.</p>\",\n                        \"smithy.api#xmlName\": \"TargetConfiguration\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the parameters for accepting the quote.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#AcceptReservedInstancesExchangeQuoteResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ExchangeId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ExchangeId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the successful exchange.</p>\",\n                        \"smithy.api#xmlName\": \"exchangeId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The result of the exchange and whether it was <code>successful</code>.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#AcceptTransitGatewayMulticastDomainAssociations\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#AcceptTransitGatewayMulticastDomainAssociationsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#AcceptTransitGatewayMulticastDomainAssociationsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Accepts a request to associate subnets with a transit gateway multicast domain.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#AcceptTransitGatewayMulticastDomainAssociationsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayMulticastDomainId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayMulticastDomainId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the transit gateway multicast domain.</p>\"\n                    }\n                },\n                \"TransitGatewayAttachmentId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayAttachmentId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the transit gateway attachment.</p>\"\n                    }\n                },\n                \"SubnetIds\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the subnets to associate with the transit gateway multicast domain.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#AcceptTransitGatewayMulticastDomainAssociationsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Associations\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayMulticastDomainAssociations\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Associations\",\n                        \"smithy.api#documentation\": \"<p>Information about the multicast domain associations.</p>\",\n                        \"smithy.api#xmlName\": \"associations\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#AcceptTransitGatewayPeeringAttachment\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#AcceptTransitGatewayPeeringAttachmentRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#AcceptTransitGatewayPeeringAttachmentResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Accepts a transit gateway peering attachment request. The peering attachment must be\\n            in the <code>pendingAcceptance</code> state.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#AcceptTransitGatewayPeeringAttachmentRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayAttachmentId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayAttachmentId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the transit gateway attachment.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#AcceptTransitGatewayPeeringAttachmentResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayPeeringAttachment\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayPeeringAttachment\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayPeeringAttachment\",\n                        \"smithy.api#documentation\": \"<p>The transit gateway peering attachment.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayPeeringAttachment\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#AcceptTransitGatewayVpcAttachment\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#AcceptTransitGatewayVpcAttachmentRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#AcceptTransitGatewayVpcAttachmentResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Accepts a request to attach a VPC to a transit gateway.</p>\\n         <p>The VPC attachment must be in the <code>pendingAcceptance</code> state.\\n         Use <a>DescribeTransitGatewayVpcAttachments</a> to view your pending VPC attachment requests.\\n         Use <a>RejectTransitGatewayVpcAttachment</a> to reject a VPC attachment request.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#AcceptTransitGatewayVpcAttachmentRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayAttachmentId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayAttachmentId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the attachment.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#AcceptTransitGatewayVpcAttachmentResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayVpcAttachment\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayVpcAttachment\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayVpcAttachment\",\n                        \"smithy.api#documentation\": \"<p>The VPC attachment.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayVpcAttachment\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#AcceptVpcEndpointConnections\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#AcceptVpcEndpointConnectionsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#AcceptVpcEndpointConnectionsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Accepts connection requests to your VPC endpoint service.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#AcceptVpcEndpointConnectionsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"ServiceId\": {\n                    \"target\": \"com.amazonaws.ec2#VpcEndpointServiceId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the VPC endpoint service.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"VpcEndpointIds\": {\n                    \"target\": \"com.amazonaws.ec2#VpcEndpointIdList\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The IDs of the interface VPC endpoints.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"VpcEndpointId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#AcceptVpcEndpointConnectionsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Unsuccessful\": {\n                    \"target\": \"com.amazonaws.ec2#UnsuccessfulItemSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Unsuccessful\",\n                        \"smithy.api#documentation\": \"<p>Information about the interface endpoints that were not accepted, if\\n            applicable.</p>\",\n                        \"smithy.api#xmlName\": \"unsuccessful\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#AcceptVpcPeeringConnection\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#AcceptVpcPeeringConnectionRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#AcceptVpcPeeringConnectionResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Accept a VPC peering connection request. To accept a request, the VPC peering connection must\\n      be in the <code>pending-acceptance</code> state, and you must be the owner of the peer VPC.\\n      Use <a>DescribeVpcPeeringConnections</a> to view your outstanding VPC\\n      peering connection requests.</p>\\n         <p>For an inter-Region VPC peering connection request, you must accept the VPC peering\\n      connection in the Region of the accepter VPC.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#AcceptVpcPeeringConnectionRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"VpcPeeringConnectionId\": {\n                    \"target\": \"com.amazonaws.ec2#VpcPeeringConnectionIdWithResolver\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcPeeringConnectionId\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the VPC peering connection. You must specify this parameter in the\\n\\t\\t\\trequest.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"vpcPeeringConnectionId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#AcceptVpcPeeringConnectionResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VpcPeeringConnection\": {\n                    \"target\": \"com.amazonaws.ec2#VpcPeeringConnection\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcPeeringConnection\",\n                        \"smithy.api#documentation\": \"<p>Information about the VPC peering connection.</p>\",\n                        \"smithy.api#xmlName\": \"vpcPeeringConnection\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#AccessScopeAnalysisFinding\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NetworkInsightsAccessScopeAnalysisId\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInsightsAccessScopeAnalysisId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkInsightsAccessScopeAnalysisId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Network Access Scope analysis.</p>\",\n                        \"smithy.api#xmlName\": \"networkInsightsAccessScopeAnalysisId\"\n                    }\n                },\n                \"NetworkInsightsAccessScopeId\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInsightsAccessScopeId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkInsightsAccessScopeId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Network Access Scope.</p>\",\n                        \"smithy.api#xmlName\": \"networkInsightsAccessScopeId\"\n                    }\n                },\n                \"FindingId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"FindingId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the finding.</p>\",\n                        \"smithy.api#xmlName\": \"findingId\"\n                    }\n                },\n                \"FindingComponents\": {\n                    \"target\": \"com.amazonaws.ec2#PathComponentList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"FindingComponentSet\",\n                        \"smithy.api#documentation\": \"<p>The finding components.</p>\",\n                        \"smithy.api#xmlName\": \"findingComponentSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a finding for a Network Access Scope.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#AccessScopeAnalysisFindingList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#AccessScopeAnalysisFinding\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#AccessScopePath\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Source\": {\n                    \"target\": \"com.amazonaws.ec2#PathStatement\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Source\",\n                        \"smithy.api#documentation\": \"<p>The source.</p>\",\n                        \"smithy.api#xmlName\": \"source\"\n                    }\n                },\n                \"Destination\": {\n                    \"target\": \"com.amazonaws.ec2#PathStatement\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Destination\",\n                        \"smithy.api#documentation\": \"<p>The destination.</p>\",\n                        \"smithy.api#xmlName\": \"destination\"\n                    }\n                },\n                \"ThroughResources\": {\n                    \"target\": \"com.amazonaws.ec2#ThroughResourcesStatementList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ThroughResourceSet\",\n                        \"smithy.api#documentation\": \"<p>The through resources.</p>\",\n                        \"smithy.api#xmlName\": \"throughResourceSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a path.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#AccessScopePathList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#AccessScopePath\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#AccessScopePathListRequest\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#AccessScopePathRequest\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#AccessScopePathRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Source\": {\n                    \"target\": \"com.amazonaws.ec2#PathStatementRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The source.</p>\"\n                    }\n                },\n                \"Destination\": {\n                    \"target\": \"com.amazonaws.ec2#PathStatementRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The destination.</p>\"\n                    }\n                },\n                \"ThroughResources\": {\n                    \"target\": \"com.amazonaws.ec2#ThroughResourcesStatementRequestList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The through resources.</p>\",\n                        \"smithy.api#xmlName\": \"ThroughResource\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a path.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#AccountAttribute\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AttributeName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AttributeName\",\n                        \"smithy.api#documentation\": \"<p>The name of the account attribute.</p>\",\n                        \"smithy.api#xmlName\": \"attributeName\"\n                    }\n                },\n                \"AttributeValues\": {\n                    \"target\": \"com.amazonaws.ec2#AccountAttributeValueList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AttributeValueSet\",\n                        \"smithy.api#documentation\": \"<p>The values for the account attribute.</p>\",\n                        \"smithy.api#xmlName\": \"attributeValueSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes an account attribute.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#AccountAttributeList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#AccountAttribute\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#AccountAttributeName\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"supported_platforms\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"supported-platforms\"\n                    }\n                },\n                \"default_vpc\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"default-vpc\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#AccountAttributeNameStringList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#AccountAttributeName\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"attributeName\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#AccountAttributeValue\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AttributeValue\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AttributeValue\",\n                        \"smithy.api#documentation\": \"<p>The value of the attribute.</p>\",\n                        \"smithy.api#xmlName\": \"attributeValue\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a value of an account attribute.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#AccountAttributeValueList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#AccountAttributeValue\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#AccountID\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 12,\n                    \"max\": 12\n                },\n                \"smithy.api#pattern\": \"^[0-9]{12}$\"\n            }\n        },\n        \"com.amazonaws.ec2#ActiveInstance\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the instance.</p>\",\n                        \"smithy.api#xmlName\": \"instanceId\"\n                    }\n                },\n                \"InstanceType\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceType\",\n                        \"smithy.api#documentation\": \"<p>The instance type.</p>\",\n                        \"smithy.api#xmlName\": \"instanceType\"\n                    }\n                },\n                \"SpotInstanceRequestId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SpotInstanceRequestId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Spot Instance request.</p>\",\n                        \"smithy.api#xmlName\": \"spotInstanceRequestId\"\n                    }\n                },\n                \"InstanceHealth\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceHealthStatus\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceHealth\",\n                        \"smithy.api#documentation\": \"<p>The health status of the instance. If the status of either the instance status check\\n            or the system status check is <code>impaired</code>, the health status of the instance\\n            is <code>unhealthy</code>. Otherwise, the health status is <code>healthy</code>.</p>\",\n                        \"smithy.api#xmlName\": \"instanceHealth\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a running instance in a Spot Fleet.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ActiveInstanceSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ActiveInstance\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ActiveVpnTunnelStatus\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Phase1EncryptionAlgorithm\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Phase1EncryptionAlgorithm\",\n                        \"smithy.api#documentation\": \"<p>The encryption algorithm negotiated in Phase 1 IKE negotiations.</p>\",\n                        \"smithy.api#xmlName\": \"phase1EncryptionAlgorithm\"\n                    }\n                },\n                \"Phase2EncryptionAlgorithm\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Phase2EncryptionAlgorithm\",\n                        \"smithy.api#documentation\": \"<p>The encryption algorithm negotiated in Phase 2 IKE negotiations.</p>\",\n                        \"smithy.api#xmlName\": \"phase2EncryptionAlgorithm\"\n                    }\n                },\n                \"Phase1IntegrityAlgorithm\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Phase1IntegrityAlgorithm\",\n                        \"smithy.api#documentation\": \"<p>The integrity algorithm negotiated in Phase 1 IKE negotiations.</p>\",\n                        \"smithy.api#xmlName\": \"phase1IntegrityAlgorithm\"\n                    }\n                },\n                \"Phase2IntegrityAlgorithm\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Phase2IntegrityAlgorithm\",\n                        \"smithy.api#documentation\": \"<p>The integrity algorithm negotiated in Phase 2 IKE negotiations.</p>\",\n                        \"smithy.api#xmlName\": \"phase2IntegrityAlgorithm\"\n                    }\n                },\n                \"Phase1DHGroup\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Phase1DHGroup\",\n                        \"smithy.api#documentation\": \"<p>The Diffie-Hellman group number being used in Phase 1 IKE negotiations.</p>\",\n                        \"smithy.api#xmlName\": \"phase1DHGroup\"\n                    }\n                },\n                \"Phase2DHGroup\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Phase2DHGroup\",\n                        \"smithy.api#documentation\": \"<p>The Diffie-Hellman group number being used in Phase 2 IKE negotiations.</p>\",\n                        \"smithy.api#xmlName\": \"phase2DHGroup\"\n                    }\n                },\n                \"IkeVersion\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IkeVersion\",\n                        \"smithy.api#documentation\": \"<p>The version of the Internet Key Exchange (IKE) protocol being used.</p>\",\n                        \"smithy.api#xmlName\": \"ikeVersion\"\n                    }\n                },\n                \"ProvisioningStatus\": {\n                    \"target\": \"com.amazonaws.ec2#VpnTunnelProvisioningStatus\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ProvisioningStatus\",\n                        \"smithy.api#documentation\": \"<p>The current provisioning status of the VPN tunnel.</p>\",\n                        \"smithy.api#xmlName\": \"provisioningStatus\"\n                    }\n                },\n                \"ProvisioningStatusReason\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ProvisioningStatusReason\",\n                        \"smithy.api#documentation\": \"<p>The reason for the current provisioning status.</p>\",\n                        \"smithy.api#xmlName\": \"provisioningStatusReason\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains information about the current security configuration of an active VPN tunnel.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ActivityStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ERROR\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"error\"\n                    }\n                },\n                \"PENDING_FULFILLMENT\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"pending_fulfillment\"\n                    }\n                },\n                \"PENDING_TERMINATION\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"pending_termination\"\n                    }\n                },\n                \"FULFILLED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"fulfilled\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#AddIpamOperatingRegion\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RegionName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the operating Region.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Add an operating Region to an IPAM. Operating Regions are Amazon Web Services Regions where the IPAM is allowed to manage IP address CIDRs. IPAM only discovers and monitors resources in the Amazon Web Services Regions you select as operating Regions.</p>\\n         <p>For more information about operating Regions, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/ipam/create-ipam.html\\\">Create an IPAM</a> in the <i>Amazon VPC IPAM User Guide</i>.\\n      </p>\"\n            }\n        },\n        \"com.amazonaws.ec2#AddIpamOperatingRegionSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#AddIpamOperatingRegion\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 50\n                }\n            }\n        },\n        \"com.amazonaws.ec2#AddIpamOrganizationalUnitExclusion\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"OrganizationsEntityPath\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An Amazon Web Services Organizations entity path. Build the path for the OU(s) using Amazon Web Services Organizations IDs separated by a <code>/</code>. Include all child OUs by ending the path with <code>/*</code>.</p>\\n         <ul>\\n            <li>\\n               <p>Example 1</p>\\n               <ul>\\n                  <li>\\n                     <p>Path to a child OU: <code>o-a1b2c3d4e5/r-f6g7h8i9j0example/ou-ghi0-awsccccc/ou-jkl0-awsddddd/</code>\\n                     </p>\\n                  </li>\\n                  <li>\\n                     <p>In this example, <code>o-a1b2c3d4e5</code> is the organization ID, <code>r-f6g7h8i9j0example</code> is the root ID , <code>ou-ghi0-awsccccc</code> is an OU ID, and <code>ou-jkl0-awsddddd</code> is a child OU ID.</p>\\n                  </li>\\n                  <li>\\n                     <p>IPAM will not manage the IP addresses in accounts in the child OU.</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <p>Example 2</p>\\n               <ul>\\n                  <li>\\n                     <p>Path where all child OUs will be part of the exclusion: <code>o-a1b2c3d4e5/r-f6g7h8i9j0example/ou-ghi0-awsccccc/*</code>\\n                     </p>\\n                  </li>\\n                  <li>\\n                     <p>In this example, IPAM will not manage the IP addresses in accounts in the OU (<code>ou-ghi0-awsccccc</code>) or in accounts in any OUs that are children of the OU.</p>\\n                  </li>\\n               </ul>\\n            </li>\\n         </ul>\\n         <p>For more information on how to construct an entity path, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_last-accessed-view-data-orgs.html#access_policies_access-advisor-viewing-orgs-entity-path\\\">Understand the Amazon Web Services Organizations entity path</a> in the <i>Amazon Web Services Identity and Access Management User Guide</i>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Add an Organizational Unit (OU) exclusion to your IPAM. If your IPAM is integrated with Amazon Web Services Organizations and you add an organizational unit (OU) exclusion, IPAM will not manage the IP addresses in accounts in that OU exclusion. There is a limit on the number of exclusions you can create. For more information, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/ipam/quotas-ipam.html\\\">Quotas for your IPAM</a> in the <i>Amazon VPC IPAM User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#AddIpamOrganizationalUnitExclusionSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#AddIpamOrganizationalUnitExclusion\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 10\n                }\n            }\n        },\n        \"com.amazonaws.ec2#AddPrefixListEntries\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#AddPrefixListEntry\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 100\n                }\n            }\n        },\n        \"com.amazonaws.ec2#AddPrefixListEntry\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Cidr\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The CIDR block.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A description for the entry.</p>\\n         <p>Constraints: Up to 255 characters in length.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>An entry for a prefix list.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#AddedPrincipal\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PrincipalType\": {\n                    \"target\": \"com.amazonaws.ec2#PrincipalType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PrincipalType\",\n                        \"smithy.api#documentation\": \"<p>The type of principal.</p>\",\n                        \"smithy.api#xmlName\": \"principalType\"\n                    }\n                },\n                \"Principal\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Principal\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the principal.</p>\",\n                        \"smithy.api#xmlName\": \"principal\"\n                    }\n                },\n                \"ServicePermissionId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ServicePermissionId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the service permission.</p>\",\n                        \"smithy.api#xmlName\": \"servicePermissionId\"\n                    }\n                },\n                \"ServiceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ServiceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the service.</p>\",\n                        \"smithy.api#xmlName\": \"serviceId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a principal.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#AddedPrincipalSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#AddedPrincipal\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#AdditionalDetail\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AdditionalDetailType\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AdditionalDetailType\",\n                        \"smithy.api#documentation\": \"<p>The additional detail code.</p>\",\n                        \"smithy.api#xmlName\": \"additionalDetailType\"\n                    }\n                },\n                \"Component\": {\n                    \"target\": \"com.amazonaws.ec2#AnalysisComponent\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Component\",\n                        \"smithy.api#documentation\": \"<p>The path component.</p>\",\n                        \"smithy.api#xmlName\": \"component\"\n                    }\n                },\n                \"VpcEndpointService\": {\n                    \"target\": \"com.amazonaws.ec2#AnalysisComponent\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcEndpointService\",\n                        \"smithy.api#documentation\": \"<p>The VPC endpoint service.</p>\",\n                        \"smithy.api#xmlName\": \"vpcEndpointService\"\n                    }\n                },\n                \"RuleOptions\": {\n                    \"target\": \"com.amazonaws.ec2#RuleOptionList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RuleOptionSet\",\n                        \"smithy.api#documentation\": \"<p>The rule options.</p>\",\n                        \"smithy.api#xmlName\": \"ruleOptionSet\"\n                    }\n                },\n                \"RuleGroupTypePairs\": {\n                    \"target\": \"com.amazonaws.ec2#RuleGroupTypePairList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RuleGroupTypePairSet\",\n                        \"smithy.api#documentation\": \"<p>The rule group type.</p>\",\n                        \"smithy.api#xmlName\": \"ruleGroupTypePairSet\"\n                    }\n                },\n                \"RuleGroupRuleOptionsPairs\": {\n                    \"target\": \"com.amazonaws.ec2#RuleGroupRuleOptionsPairList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RuleGroupRuleOptionsPairSet\",\n                        \"smithy.api#documentation\": \"<p>The rule options.</p>\",\n                        \"smithy.api#xmlName\": \"ruleGroupRuleOptionsPairSet\"\n                    }\n                },\n                \"ServiceName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ServiceName\",\n                        \"smithy.api#documentation\": \"<p>The name of the VPC endpoint service.</p>\",\n                        \"smithy.api#xmlName\": \"serviceName\"\n                    }\n                },\n                \"LoadBalancers\": {\n                    \"target\": \"com.amazonaws.ec2#AnalysisComponentList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LoadBalancerSet\",\n                        \"smithy.api#documentation\": \"<p>The load balancers.</p>\",\n                        \"smithy.api#xmlName\": \"loadBalancerSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes an additional detail for a path analysis. For more information, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/reachability/additional-detail-codes.html\\\">Reachability Analyzer additional detail codes</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#AdditionalDetailList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#AdditionalDetail\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#Address\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AllocationId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AllocationId\",\n                        \"smithy.api#documentation\": \"<p>The ID representing the allocation of the address.</p>\",\n                        \"smithy.api#xmlName\": \"allocationId\"\n                    }\n                },\n                \"AssociationId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AssociationId\",\n                        \"smithy.api#documentation\": \"<p>The ID representing the association of the address with an instance.</p>\",\n                        \"smithy.api#xmlName\": \"associationId\"\n                    }\n                },\n                \"Domain\": {\n                    \"target\": \"com.amazonaws.ec2#DomainType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Domain\",\n                        \"smithy.api#documentation\": \"<p>The network (<code>vpc</code>).</p>\",\n                        \"smithy.api#xmlName\": \"domain\"\n                    }\n                },\n                \"NetworkInterfaceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkInterfaceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the network interface.</p>\",\n                        \"smithy.api#xmlName\": \"networkInterfaceId\"\n                    }\n                },\n                \"NetworkInterfaceOwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkInterfaceOwnerId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Amazon Web Services account that owns the network interface.</p>\",\n                        \"smithy.api#xmlName\": \"networkInterfaceOwnerId\"\n                    }\n                },\n                \"PrivateIpAddress\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PrivateIpAddress\",\n                        \"smithy.api#documentation\": \"<p>The private IP address associated with the Elastic IP address.</p>\",\n                        \"smithy.api#xmlName\": \"privateIpAddress\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>Any tags assigned to the Elastic IP address.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                },\n                \"PublicIpv4Pool\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PublicIpv4Pool\",\n                        \"smithy.api#documentation\": \"<p>The ID of an address pool.</p>\",\n                        \"smithy.api#xmlName\": \"publicIpv4Pool\"\n                    }\n                },\n                \"NetworkBorderGroup\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkBorderGroup\",\n                        \"smithy.api#documentation\": \"<p>The name of the unique set of Availability Zones, Local Zones, or Wavelength Zones from\\n      which Amazon Web Services advertises IP addresses.</p>\",\n                        \"smithy.api#xmlName\": \"networkBorderGroup\"\n                    }\n                },\n                \"CustomerOwnedIp\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CustomerOwnedIp\",\n                        \"smithy.api#documentation\": \"<p>The customer-owned IP address.</p>\",\n                        \"smithy.api#xmlName\": \"customerOwnedIp\"\n                    }\n                },\n                \"CustomerOwnedIpv4Pool\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CustomerOwnedIpv4Pool\",\n                        \"smithy.api#documentation\": \"<p>The ID of the customer-owned address pool.</p>\",\n                        \"smithy.api#xmlName\": \"customerOwnedIpv4Pool\"\n                    }\n                },\n                \"CarrierIp\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CarrierIp\",\n                        \"smithy.api#documentation\": \"<p>The carrier IP address associated. This option is only available for network interfaces\\n      which  reside in a subnet in a Wavelength Zone (for example an EC2 instance). </p>\",\n                        \"smithy.api#xmlName\": \"carrierIp\"\n                    }\n                },\n                \"SubnetId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SubnetId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the subnet where the IP address is allocated.</p>\",\n                        \"smithy.api#xmlName\": \"subnetId\"\n                    }\n                },\n                \"ServiceManaged\": {\n                    \"target\": \"com.amazonaws.ec2#ServiceManaged\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ServiceManaged\",\n                        \"smithy.api#documentation\": \"<p>The service that manages the elastic IP address.</p>\\n         <note>\\n            <p>The only option supported today is <code>alb</code>.</p>\\n         </note>\",\n                        \"smithy.api#xmlName\": \"serviceManaged\"\n                    }\n                },\n                \"InstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the instance that the address is associated with (if any).</p>\",\n                        \"smithy.api#xmlName\": \"instanceId\"\n                    }\n                },\n                \"PublicIp\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PublicIp\",\n                        \"smithy.api#documentation\": \"<p>The Elastic IP address.</p>\",\n                        \"smithy.api#xmlName\": \"publicIp\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes an Elastic IP address, or a carrier IP address.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#AddressAttribute\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PublicIp\": {\n                    \"target\": \"com.amazonaws.ec2#PublicIpAddress\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PublicIp\",\n                        \"smithy.api#documentation\": \"<p>The public IP address.</p>\",\n                        \"smithy.api#xmlName\": \"publicIp\"\n                    }\n                },\n                \"AllocationId\": {\n                    \"target\": \"com.amazonaws.ec2#AllocationId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AllocationId\",\n                        \"smithy.api#documentation\": \"<p>[EC2-VPC] The allocation ID.</p>\",\n                        \"smithy.api#xmlName\": \"allocationId\"\n                    }\n                },\n                \"PtrRecord\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PtrRecord\",\n                        \"smithy.api#documentation\": \"<p>The pointer (PTR) record for the IP address.</p>\",\n                        \"smithy.api#xmlName\": \"ptrRecord\"\n                    }\n                },\n                \"PtrRecordUpdate\": {\n                    \"target\": \"com.amazonaws.ec2#PtrUpdateStatus\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PtrRecordUpdate\",\n                        \"smithy.api#documentation\": \"<p>The updated PTR record for the IP address.</p>\",\n                        \"smithy.api#xmlName\": \"ptrRecordUpdate\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The attributes associated with an Elastic IP address.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#AddressAttributeName\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"domain_name\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"domain-name\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#AddressFamily\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ipv4\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ipv4\"\n                    }\n                },\n                \"ipv6\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ipv6\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#AddressList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#Address\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#AddressMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.ec2#AddressSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#AddressAttribute\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#AddressTransfer\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PublicIp\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PublicIp\",\n                        \"smithy.api#documentation\": \"<p>The Elastic IP address being transferred.</p>\",\n                        \"smithy.api#xmlName\": \"publicIp\"\n                    }\n                },\n                \"AllocationId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AllocationId\",\n                        \"smithy.api#documentation\": \"<p>The allocation ID of an Elastic IP address.</p>\",\n                        \"smithy.api#xmlName\": \"allocationId\"\n                    }\n                },\n                \"TransferAccountId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransferAccountId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the account that you want to transfer the Elastic IP address to.</p>\",\n                        \"smithy.api#xmlName\": \"transferAccountId\"\n                    }\n                },\n                \"TransferOfferExpirationTimestamp\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransferOfferExpirationTimestamp\",\n                        \"smithy.api#documentation\": \"<p>The timestamp when the Elastic IP address transfer expired. When the source account starts\\n      the transfer, the transfer account has seven hours to allocate the Elastic IP address to\\n      complete the transfer, or the Elastic IP address will return to its original owner.</p>\",\n                        \"smithy.api#xmlName\": \"transferOfferExpirationTimestamp\"\n                    }\n                },\n                \"TransferOfferAcceptedTimestamp\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransferOfferAcceptedTimestamp\",\n                        \"smithy.api#documentation\": \"<p>The timestamp when the Elastic IP address transfer was accepted.</p>\",\n                        \"smithy.api#xmlName\": \"transferOfferAcceptedTimestamp\"\n                    }\n                },\n                \"AddressTransferStatus\": {\n                    \"target\": \"com.amazonaws.ec2#AddressTransferStatus\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AddressTransferStatus\",\n                        \"smithy.api#documentation\": \"<p>The Elastic IP address transfer status.</p>\",\n                        \"smithy.api#xmlName\": \"addressTransferStatus\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Details on the Elastic IP address transfer. For more information, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/userguide/vpc-eips.html#transfer-EIPs-intro\\\">Transfer Elastic IP addresses</a> in the <i>Amazon VPC User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#AddressTransferList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#AddressTransfer\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#AddressTransferStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"pending\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"pending\"\n                    }\n                },\n                \"disabled\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"disabled\"\n                    }\n                },\n                \"accepted\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"accepted\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#AdvertiseByoipCidr\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#AdvertiseByoipCidrRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#AdvertiseByoipCidrResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Advertises an IPv4 or IPv6 address range that is provisioned for use with your Amazon Web Services resources through \\n         bring your own IP addresses (BYOIP).</p>\\n         <p>You can perform this operation at most once every 10 seconds, even if you specify different \\n         address ranges each time.</p>\\n         <p>We recommend that you stop advertising the BYOIP CIDR from other locations when you advertise\\n          it from Amazon Web Services. To minimize down time, you can configure your Amazon Web Services resources to use an address from a\\n         BYOIP CIDR before it is advertised, and then simultaneously stop advertising it from the current \\n         location and start advertising it through Amazon Web Services.</p>\\n         <p>It can take a few minutes before traffic to the specified addresses starts routing to Amazon Web Services\\n         because of BGP propagation delays.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#AdvertiseByoipCidrRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Cidr\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The address range, in CIDR notation. This must be the exact range that you provisioned. \\n         You can't advertise only a portion of the provisioned range.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Asn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The public 2-byte or 4-byte ASN that you want to advertise.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"NetworkBorderGroup\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If you have <a href=\\\"https://docs.aws.amazon.com/local-zones/latest/ug/how-local-zones-work.html\\\">Local Zones</a> enabled, you can choose a network border group for Local Zones when you provision and advertise a BYOIPv4 CIDR. Choose the network border group carefully as the EIP and the Amazon Web Services resource it is associated with must reside in the same network border group.</p>\\n         <p>You can provision BYOIP address ranges to and advertise them in the following Local Zone network border groups:</p>\\n         <ul>\\n            <li>\\n               <p>us-east-1-dfw-2</p>\\n            </li>\\n            <li>\\n               <p>us-west-2-lax-1</p>\\n            </li>\\n            <li>\\n               <p>us-west-2-phx-2</p>\\n            </li>\\n         </ul>\\n         <note>\\n            <p>You cannot provision or advertise BYOIPv6 address ranges in Local Zones at this time.</p>\\n         </note>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#AdvertiseByoipCidrResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ByoipCidr\": {\n                    \"target\": \"com.amazonaws.ec2#ByoipCidr\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ByoipCidr\",\n                        \"smithy.api#documentation\": \"<p>Information about the address range.</p>\",\n                        \"smithy.api#xmlName\": \"byoipCidr\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#Affinity\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"default\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"default\"\n                    }\n                },\n                \"host\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"host\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#AllocateAddress\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#AllocateAddressRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#AllocateAddressResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Allocates an Elastic IP address to your Amazon Web Services account. After you allocate the Elastic IP address you can associate  \\n         it with an instance or network interface. After you release an Elastic IP address, it is released to the IP address \\n         pool and can be allocated to a different Amazon Web Services account.</p>\\n         <p>You can allocate an Elastic IP address from an address pool owned by Amazon Web Services or from an address pool created \\n       from a public IPv4 address range that you have brought to Amazon Web Services for use with your Amazon Web Services resources using bring your own \\n         IP addresses (BYOIP). For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-byoip.html\\\">Bring Your Own IP Addresses (BYOIP)</a> in the <i>Amazon EC2 User Guide</i>.</p>\\n         <p>If you release an Elastic IP address, you might be able to recover it. You cannot recover\\n      an Elastic IP address that you released after it is allocated to another Amazon Web Services account. To attempt to recover an Elastic IP address that you released, specify\\n      it in this operation.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/elastic-ip-addresses-eip.html\\\">Elastic IP Addresses</a> in the <i>Amazon EC2 User Guide</i>.</p>\\n         <p>You can allocate a carrier IP address which is a public IP address from a telecommunication carrier, \\n       to a network interface which resides in a subnet in a Wavelength Zone (for example an EC2 instance).</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To allocate an Elastic IP address\",\n                        \"documentation\": \"This example allocates an Elastic IP address.\",\n                        \"output\": {\n                            \"PublicIp\": \"203.0.113.0\",\n                            \"AllocationId\": \"eipalloc-64d5890a\",\n                            \"PublicIpv4Pool\": \"amazon\",\n                            \"NetworkBorderGroup\": \"us-east-1\",\n                            \"Domain\": \"vpc\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#AllocateAddressRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Domain\": {\n                    \"target\": \"com.amazonaws.ec2#DomainType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The network (<code>vpc</code>).</p>\"\n                    }\n                },\n                \"Address\": {\n                    \"target\": \"com.amazonaws.ec2#PublicIpAddress\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Elastic IP address to recover or an IPv4 address from an address pool.</p>\"\n                    }\n                },\n                \"PublicIpv4Pool\": {\n                    \"target\": \"com.amazonaws.ec2#Ipv4PoolEc2Id\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of an address pool that you own. Use this parameter to let Amazon EC2 select an address from the address pool.\\n       To specify a specific address from the address pool, use the <code>Address</code> parameter instead.</p>\"\n                    }\n                },\n                \"NetworkBorderGroup\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> A unique set of Availability Zones, Local Zones, or Wavelength Zones from which Amazon Web Services\\n      advertises IP addresses. Use this parameter to limit the IP address to this location. IP\\n      addresses cannot move between network border groups.</p>\"\n                    }\n                },\n                \"CustomerOwnedIpv4Pool\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of a customer-owned address pool. Use this parameter to let Amazon EC2 \\n        select an address from the address pool. Alternatively, specify a specific \\n        address from the address pool.</p>\"\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags to assign to the Elastic IP address.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                },\n                \"IpamPoolId\": {\n                    \"target\": \"com.amazonaws.ec2#IpamPoolId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of an IPAM pool which has an Amazon-provided or BYOIP public IPv4 CIDR provisioned to it. For more information, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/ipam/tutorials-eip-pool.html\\\">Allocate sequential Elastic IP addresses from an IPAM pool</a> in the <i>Amazon VPC IPAM User Guide</i>.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#AllocateAddressResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AllocationId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AllocationId\",\n                        \"smithy.api#documentation\": \"<p>The ID that represents the allocation of the Elastic IP address.</p>\",\n                        \"smithy.api#xmlName\": \"allocationId\"\n                    }\n                },\n                \"PublicIpv4Pool\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PublicIpv4Pool\",\n                        \"smithy.api#documentation\": \"<p>The ID of an address pool.</p>\",\n                        \"smithy.api#xmlName\": \"publicIpv4Pool\"\n                    }\n                },\n                \"NetworkBorderGroup\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkBorderGroup\",\n                        \"smithy.api#documentation\": \"<p>The set of Availability Zones, Local Zones, or Wavelength Zones from which Amazon Web Services advertises\\n      IP addresses.</p>\",\n                        \"smithy.api#xmlName\": \"networkBorderGroup\"\n                    }\n                },\n                \"Domain\": {\n                    \"target\": \"com.amazonaws.ec2#DomainType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Domain\",\n                        \"smithy.api#documentation\": \"<p>The network (<code>vpc</code>).</p>\",\n                        \"smithy.api#xmlName\": \"domain\"\n                    }\n                },\n                \"CustomerOwnedIp\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CustomerOwnedIp\",\n                        \"smithy.api#documentation\": \"<p>The customer-owned IP address.</p>\",\n                        \"smithy.api#xmlName\": \"customerOwnedIp\"\n                    }\n                },\n                \"CustomerOwnedIpv4Pool\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CustomerOwnedIpv4Pool\",\n                        \"smithy.api#documentation\": \"<p>The ID of the customer-owned address pool.</p>\",\n                        \"smithy.api#xmlName\": \"customerOwnedIpv4Pool\"\n                    }\n                },\n                \"CarrierIp\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CarrierIp\",\n                        \"smithy.api#documentation\": \"<p>The carrier IP address. This option is only available for network interfaces that reside\\n      in a subnet in a Wavelength Zone.</p>\",\n                        \"smithy.api#xmlName\": \"carrierIp\"\n                    }\n                },\n                \"PublicIp\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PublicIp\",\n                        \"smithy.api#documentation\": \"<p>The Elastic IP address.</p>\",\n                        \"smithy.api#xmlName\": \"publicIp\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#AllocateHosts\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#AllocateHostsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#AllocateHostsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Allocates a Dedicated Host to your account. At a minimum, specify the supported\\n            instance type or instance family, the Availability Zone in which to allocate the host,\\n            and the number of hosts to allocate.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#AllocateHostsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceFamily\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the instance family to be supported by the Dedicated Hosts. If you specify\\n            an instance family, the Dedicated Hosts support multiple instance types within that\\n            instance family.</p>\\n         <p>If you want the Dedicated Hosts to support a specific instance type only, omit this\\n            parameter and specify <b>InstanceType</b> instead. You cannot\\n            specify <b>InstanceFamily</b> and <b>InstanceType</b> in the same request.</p>\"\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags to apply to the Dedicated Host during creation.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                },\n                \"HostRecovery\": {\n                    \"target\": \"com.amazonaws.ec2#HostRecovery\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether to enable or disable host recovery for the Dedicated Host. Host\\n            recovery is disabled by default. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/dedicated-hosts-recovery.html\\\"> Host recovery</a>\\n            in the <i>Amazon EC2 User Guide</i>.</p>\\n         <p>Default: <code>off</code>\\n         </p>\"\n                    }\n                },\n                \"OutpostArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the Amazon Web Services Outpost on which to allocate\\n            the Dedicated Host. If you specify <b>OutpostArn</b>, you can \\n            optionally specify <b>AssetIds</b>.</p>\\n         <p>If you are allocating the Dedicated Host in a Region, omit this parameter.</p>\"\n                    }\n                },\n                \"HostMaintenance\": {\n                    \"target\": \"com.amazonaws.ec2#HostMaintenance\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether to enable or disable host maintenance for the Dedicated Host. For\\n            more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/dedicated-hosts-maintenance.html\\\">Host\\n                maintenance</a> in the <i>Amazon EC2 User Guide</i>.</p>\"\n                    }\n                },\n                \"AssetIds\": {\n                    \"target\": \"com.amazonaws.ec2#AssetIdList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the Outpost hardware assets on which to allocate the Dedicated Hosts. Targeting \\n            specific hardware assets on an Outpost can help to minimize latency between your workloads. \\n            This parameter is supported only if you specify <b>OutpostArn</b>. \\n            If you are allocating the Dedicated Hosts in a Region, omit this parameter.</p>\\n         <ul>\\n            <li>\\n               <p>If you specify this parameter, you can omit <b>Quantity</b>. \\n                    In this case, Amazon EC2 allocates a Dedicated Host on each specified hardware \\n                    asset.</p>\\n            </li>\\n            <li>\\n               <p>If you specify both <b>AssetIds</b> and \\n                    <b>Quantity</b>, then the value for \\n                    <b>Quantity</b> must be equal to the number of asset IDs \\n                    specified.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"AssetId\"\n                    }\n                },\n                \"AvailabilityZoneId\": {\n                    \"target\": \"com.amazonaws.ec2#AvailabilityZoneId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the Availability Zone.</p>\"\n                    }\n                },\n                \"AutoPlacement\": {\n                    \"target\": \"com.amazonaws.ec2#AutoPlacement\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AutoPlacement\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether the host accepts any untargeted instance launches that match its\\n            instance type configuration, or if it only accepts Host tenancy instance launches that\\n            specify its unique host ID. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/how-dedicated-hosts-work.html#dedicated-hosts-understanding\\\"> Understanding auto-placement and affinity</a> in the\\n                <i>Amazon EC2 User Guide</i>.</p>\\n         <p>Default: <code>off</code>\\n         </p>\",\n                        \"smithy.api#xmlName\": \"autoPlacement\"\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ClientToken\",\n                        \"smithy.api#documentation\": \"<p>Unique, case-sensitive identifier that you provide to ensure the idempotency of the request. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Run_Instance_Idempotency.html\\\">Ensuring Idempotency</a>.</p>\",\n                        \"smithy.api#xmlName\": \"clientToken\"\n                    }\n                },\n                \"InstanceType\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceType\",\n                        \"smithy.api#documentation\": \"<p>Specifies the instance type to be supported by the Dedicated Hosts. If you specify an\\n            instance type, the Dedicated Hosts support instances of the specified instance type\\n            only.</p>\\n         <p>If you want the Dedicated Hosts to support multiple instance types in a specific\\n            instance family, omit this parameter and specify <b>InstanceFamily</b> instead. You cannot specify <b>InstanceType</b> and <b>InstanceFamily</b> in the\\n            same request.</p>\",\n                        \"smithy.api#xmlName\": \"instanceType\"\n                    }\n                },\n                \"Quantity\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Quantity\",\n                        \"smithy.api#documentation\": \"<p>The number of Dedicated Hosts to allocate to your account with these parameters. If you are \\n            allocating the Dedicated Hosts on an Outpost, and you specify <b>AssetIds</b>, \\n            you can omit this parameter. In this case, Amazon EC2 allocates a Dedicated Host on each \\n            specified hardware asset. If you specify both <b>AssetIds</b> and \\n            <b>Quantity</b>, then the value that you specify for \\n            <b>Quantity</b> must be equal to the number of asset IDs specified.</p>\",\n                        \"smithy.api#xmlName\": \"quantity\"\n                    }\n                },\n                \"AvailabilityZone\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AvailabilityZone\",\n                        \"smithy.api#documentation\": \"<p>The Availability Zone in which to allocate the Dedicated Host.</p>\",\n                        \"smithy.api#xmlName\": \"availabilityZone\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#AllocateHostsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"HostIds\": {\n                    \"target\": \"com.amazonaws.ec2#ResponseHostIdList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"HostIdSet\",\n                        \"smithy.api#documentation\": \"<p>The ID of the allocated Dedicated Host. This is used to launch an instance onto a\\n            specific host.</p>\",\n                        \"smithy.api#xmlName\": \"hostIdSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the output of AllocateHosts.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#AllocateIpamPoolCidr\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#AllocateIpamPoolCidrRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#AllocateIpamPoolCidrResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Allocate a CIDR from an IPAM pool. The Region you use should be the IPAM pool locale. The locale is the Amazon Web Services Region where this IPAM pool is available for allocations.</p>\\n         <p>In IPAM, an allocation is a CIDR assignment from an IPAM pool to another IPAM pool or to a resource. For more information, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/ipam/allocate-cidrs-ipam.html\\\">Allocate CIDRs</a> in the <i>Amazon VPC IPAM User Guide</i>.</p>\\n         <note>\\n            <p>This action creates an allocation with strong consistency. The returned CIDR will not overlap with any other allocations from the same pool.</p>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.ec2#AllocateIpamPoolCidrRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A check for whether you have the required permissions for the action without actually making the request \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"IpamPoolId\": {\n                    \"target\": \"com.amazonaws.ec2#IpamPoolId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the IPAM pool from which you would like to allocate a CIDR.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Cidr\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The CIDR you would like to allocate from the IPAM pool. Note the following:</p>\\n         <ul>\\n            <li>\\n               <p>If there is no DefaultNetmaskLength allocation rule set on the pool, you must specify either the NetmaskLength or the CIDR.</p>\\n            </li>\\n            <li>\\n               <p>If the DefaultNetmaskLength allocation rule is set on the pool, you can specify either the NetmaskLength or the CIDR and the DefaultNetmaskLength allocation rule will be ignored.</p>\\n            </li>\\n         </ul>\\n         <p>Possible values: Any available IPv4 or IPv6 CIDR.</p>\"\n                    }\n                },\n                \"NetmaskLength\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The netmask length of the CIDR you would like to allocate from the IPAM pool. Note the following:</p>\\n         <ul>\\n            <li>\\n               <p>If there is no DefaultNetmaskLength allocation rule set on the pool, you must specify either the NetmaskLength or the CIDR.</p>\\n            </li>\\n            <li>\\n               <p>If the DefaultNetmaskLength allocation rule is set on the pool, you can specify either the NetmaskLength or the CIDR and the DefaultNetmaskLength allocation rule will be ignored.</p>\\n            </li>\\n         </ul>\\n         <p>Possible netmask lengths for IPv4 addresses are 0 - 32. Possible netmask lengths for IPv6 addresses are 0 - 128.</p>\"\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A unique, case-sensitive identifier that you provide to ensure the idempotency of the request. For more information, see <a href=\\\"https://docs.aws.amazon.com/ec2/latest/devguide/ec2-api-idempotency.html\\\">Ensuring idempotency</a>.</p>\",\n                        \"smithy.api#idempotencyToken\": {}\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A description for the allocation.</p>\"\n                    }\n                },\n                \"PreviewNextCidr\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A preview of the next available CIDR in a pool.</p>\"\n                    }\n                },\n                \"AllowedCidrs\": {\n                    \"target\": \"com.amazonaws.ec2#IpamPoolAllocationAllowedCidrs\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Include a particular CIDR range that can be returned by the pool. Allowed CIDRs are only allowed if using netmask length for allocation.</p>\",\n                        \"smithy.api#xmlName\": \"AllowedCidr\"\n                    }\n                },\n                \"DisallowedCidrs\": {\n                    \"target\": \"com.amazonaws.ec2#IpamPoolAllocationDisallowedCidrs\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Exclude a particular CIDR range from being returned by the pool. Disallowed CIDRs are only allowed if using netmask length for allocation.</p>\",\n                        \"smithy.api#xmlName\": \"DisallowedCidr\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#AllocateIpamPoolCidrResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"IpamPoolAllocation\": {\n                    \"target\": \"com.amazonaws.ec2#IpamPoolAllocation\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpamPoolAllocation\",\n                        \"smithy.api#documentation\": \"<p>Information about the allocation created.</p>\",\n                        \"smithy.api#xmlName\": \"ipamPoolAllocation\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#AllocationId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#AllocationIdList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#AllocationId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"AllocationId\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#AllocationIds\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#AllocationId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#AllocationState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"available\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"available\"\n                    }\n                },\n                \"under_assessment\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"under-assessment\"\n                    }\n                },\n                \"permanent_failure\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"permanent-failure\"\n                    }\n                },\n                \"released\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"released\"\n                    }\n                },\n                \"released_permanent_failure\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"released-permanent-failure\"\n                    }\n                },\n                \"pending\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"pending\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#AllocationStrategy\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"LOWEST_PRICE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"lowestPrice\"\n                    }\n                },\n                \"DIVERSIFIED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"diversified\"\n                    }\n                },\n                \"CAPACITY_OPTIMIZED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"capacityOptimized\"\n                    }\n                },\n                \"CAPACITY_OPTIMIZED_PRIORITIZED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"capacityOptimizedPrioritized\"\n                    }\n                },\n                \"PRICE_CAPACITY_OPTIMIZED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"priceCapacityOptimized\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#AllocationType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"used\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"used\"\n                    }\n                },\n                \"future\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"future\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#AllowedImagesSettingsDisabledState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"disabled\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"disabled\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#AllowedImagesSettingsEnabledState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"enabled\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"enabled\"\n                    }\n                },\n                \"audit_mode\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"audit-mode\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#AllowedInstanceType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 30\n                },\n                \"smithy.api#pattern\": \"^[a-zA-Z0-9\\\\.\\\\*\\\\-]+$\"\n            }\n        },\n        \"com.amazonaws.ec2#AllowedInstanceTypeSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#AllowedInstanceType\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 400\n                }\n            }\n        },\n        \"com.amazonaws.ec2#AllowedPrincipal\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PrincipalType\": {\n                    \"target\": \"com.amazonaws.ec2#PrincipalType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PrincipalType\",\n                        \"smithy.api#documentation\": \"<p>The type of principal.</p>\",\n                        \"smithy.api#xmlName\": \"principalType\"\n                    }\n                },\n                \"Principal\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Principal\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the principal.</p>\",\n                        \"smithy.api#xmlName\": \"principal\"\n                    }\n                },\n                \"ServicePermissionId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ServicePermissionId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the service permission.</p>\",\n                        \"smithy.api#xmlName\": \"servicePermissionId\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>The tags.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                },\n                \"ServiceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ServiceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the service.</p>\",\n                        \"smithy.api#xmlName\": \"serviceId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a principal.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#AllowedPrincipalSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#AllowedPrincipal\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#AllowsMultipleInstanceTypes\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"on\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"on\"\n                    }\n                },\n                \"off\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"off\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#AlternatePathHint\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ComponentId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ComponentId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the component.</p>\",\n                        \"smithy.api#xmlName\": \"componentId\"\n                    }\n                },\n                \"ComponentArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ComponentArn\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the component.</p>\",\n                        \"smithy.api#xmlName\": \"componentArn\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes an potential intermediate component of a feasible path.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#AlternatePathHintList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#AlternatePathHint\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#AmazonEC2\": {\n            \"type\": \"service\",\n            \"version\": \"2016-11-15\",\n            \"operations\": [\n                {\n                    \"target\": \"com.amazonaws.ec2#AcceptAddressTransfer\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#AcceptCapacityReservationBillingOwnership\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#AcceptReservedInstancesExchangeQuote\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#AcceptTransitGatewayMulticastDomainAssociations\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#AcceptTransitGatewayPeeringAttachment\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#AcceptTransitGatewayVpcAttachment\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#AcceptVpcEndpointConnections\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#AcceptVpcPeeringConnection\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#AdvertiseByoipCidr\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#AllocateAddress\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#AllocateHosts\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#AllocateIpamPoolCidr\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ApplySecurityGroupsToClientVpnTargetNetwork\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#AssignIpv6Addresses\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#AssignPrivateIpAddresses\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#AssignPrivateNatGatewayAddress\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#AssociateAddress\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#AssociateCapacityReservationBillingOwner\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#AssociateClientVpnTargetNetwork\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#AssociateDhcpOptions\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#AssociateEnclaveCertificateIamRole\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#AssociateIamInstanceProfile\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#AssociateInstanceEventWindow\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#AssociateIpamByoasn\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#AssociateIpamResourceDiscovery\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#AssociateNatGatewayAddress\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#AssociateRouteServer\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#AssociateRouteTable\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#AssociateSecurityGroupVpc\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#AssociateSubnetCidrBlock\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#AssociateTransitGatewayMulticastDomain\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#AssociateTransitGatewayPolicyTable\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#AssociateTransitGatewayRouteTable\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#AssociateTrunkInterface\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#AssociateVpcCidrBlock\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#AttachClassicLinkVpc\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#AttachInternetGateway\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#AttachNetworkInterface\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#AttachVerifiedAccessTrustProvider\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#AttachVolume\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#AttachVpnGateway\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#AuthorizeClientVpnIngress\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#AuthorizeSecurityGroupEgress\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#AuthorizeSecurityGroupIngress\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#BundleInstance\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CancelBundleTask\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CancelCapacityReservation\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CancelCapacityReservationFleets\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CancelConversionTask\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CancelDeclarativePoliciesReport\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CancelExportTask\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CancelImageLaunchPermission\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CancelImportTask\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CancelReservedInstancesListing\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CancelSpotFleetRequests\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CancelSpotInstanceRequests\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ConfirmProductInstance\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CopyFpgaImage\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CopyImage\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CopySnapshot\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateCapacityReservation\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateCapacityReservationBySplitting\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateCapacityReservationFleet\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateCarrierGateway\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateClientVpnEndpoint\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateClientVpnRoute\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateCoipCidr\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateCoipPool\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateCustomerGateway\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateDefaultSubnet\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateDefaultVpc\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateDelegateMacVolumeOwnershipTask\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateDhcpOptions\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateEgressOnlyInternetGateway\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateFleet\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateFlowLogs\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateFpgaImage\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateImage\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateImageUsageReport\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateInstanceConnectEndpoint\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateInstanceEventWindow\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateInstanceExportTask\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateInternetGateway\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateIpam\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateIpamExternalResourceVerificationToken\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateIpamPool\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateIpamResourceDiscovery\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateIpamScope\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateKeyPair\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateLaunchTemplate\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateLaunchTemplateVersion\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateLocalGatewayRoute\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateLocalGatewayRouteTable\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateLocalGatewayRouteTableVirtualInterfaceGroupAssociation\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateLocalGatewayRouteTableVpcAssociation\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateLocalGatewayVirtualInterface\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateLocalGatewayVirtualInterfaceGroup\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateMacSystemIntegrityProtectionModificationTask\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateManagedPrefixList\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateNatGateway\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateNetworkAcl\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateNetworkAclEntry\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateNetworkInsightsAccessScope\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateNetworkInsightsPath\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateNetworkInterface\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateNetworkInterfacePermission\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreatePlacementGroup\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreatePublicIpv4Pool\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateReplaceRootVolumeTask\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateReservedInstancesListing\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateRestoreImageTask\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateRoute\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateRouteServer\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateRouteServerEndpoint\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateRouteServerPeer\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateRouteTable\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateSecurityGroup\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateSnapshot\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateSnapshots\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateSpotDatafeedSubscription\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateStoreImageTask\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateSubnet\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateSubnetCidrReservation\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateTags\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateTrafficMirrorFilter\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateTrafficMirrorFilterRule\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateTrafficMirrorSession\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateTrafficMirrorTarget\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateTransitGateway\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateTransitGatewayConnect\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateTransitGatewayConnectPeer\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateTransitGatewayMulticastDomain\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateTransitGatewayPeeringAttachment\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateTransitGatewayPolicyTable\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateTransitGatewayPrefixListReference\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateTransitGatewayRoute\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateTransitGatewayRouteTable\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateTransitGatewayRouteTableAnnouncement\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateTransitGatewayVpcAttachment\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateVerifiedAccessEndpoint\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateVerifiedAccessGroup\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateVerifiedAccessInstance\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateVerifiedAccessTrustProvider\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateVolume\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateVpc\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateVpcBlockPublicAccessExclusion\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateVpcEndpoint\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateVpcEndpointConnectionNotification\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateVpcEndpointServiceConfiguration\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateVpcPeeringConnection\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateVpnConnection\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateVpnConnectionRoute\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#CreateVpnGateway\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeleteCarrierGateway\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeleteClientVpnEndpoint\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeleteClientVpnRoute\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeleteCoipCidr\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeleteCoipPool\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeleteCustomerGateway\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeleteDhcpOptions\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeleteEgressOnlyInternetGateway\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeleteFleets\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeleteFlowLogs\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeleteFpgaImage\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeleteImageUsageReport\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeleteInstanceConnectEndpoint\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeleteInstanceEventWindow\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeleteInternetGateway\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeleteIpam\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeleteIpamExternalResourceVerificationToken\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeleteIpamPool\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeleteIpamResourceDiscovery\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeleteIpamScope\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeleteKeyPair\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeleteLaunchTemplate\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeleteLaunchTemplateVersions\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeleteLocalGatewayRoute\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeleteLocalGatewayRouteTable\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeleteLocalGatewayRouteTableVirtualInterfaceGroupAssociation\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeleteLocalGatewayRouteTableVpcAssociation\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeleteLocalGatewayVirtualInterface\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeleteLocalGatewayVirtualInterfaceGroup\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeleteManagedPrefixList\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeleteNatGateway\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeleteNetworkAcl\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeleteNetworkAclEntry\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeleteNetworkInsightsAccessScope\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeleteNetworkInsightsAccessScopeAnalysis\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeleteNetworkInsightsAnalysis\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeleteNetworkInsightsPath\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeleteNetworkInterface\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeleteNetworkInterfacePermission\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeletePlacementGroup\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeletePublicIpv4Pool\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeleteQueuedReservedInstances\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeleteRoute\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeleteRouteServer\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeleteRouteServerEndpoint\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeleteRouteServerPeer\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeleteRouteTable\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeleteSecurityGroup\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeleteSnapshot\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeleteSpotDatafeedSubscription\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeleteSubnet\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeleteSubnetCidrReservation\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeleteTags\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeleteTrafficMirrorFilter\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeleteTrafficMirrorFilterRule\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeleteTrafficMirrorSession\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeleteTrafficMirrorTarget\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeleteTransitGateway\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeleteTransitGatewayConnect\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeleteTransitGatewayConnectPeer\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeleteTransitGatewayMulticastDomain\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeleteTransitGatewayPeeringAttachment\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeleteTransitGatewayPolicyTable\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeleteTransitGatewayPrefixListReference\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeleteTransitGatewayRoute\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeleteTransitGatewayRouteTable\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeleteTransitGatewayRouteTableAnnouncement\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeleteTransitGatewayVpcAttachment\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeleteVerifiedAccessEndpoint\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeleteVerifiedAccessGroup\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeleteVerifiedAccessInstance\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeleteVerifiedAccessTrustProvider\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeleteVolume\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeleteVpc\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeleteVpcBlockPublicAccessExclusion\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeleteVpcEndpointConnectionNotifications\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeleteVpcEndpoints\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeleteVpcEndpointServiceConfigurations\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeleteVpcPeeringConnection\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeleteVpnConnection\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeleteVpnConnectionRoute\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeleteVpnGateway\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeprovisionByoipCidr\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeprovisionIpamByoasn\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeprovisionIpamPoolCidr\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeprovisionPublicIpv4PoolCidr\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeregisterImage\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeregisterInstanceEventNotificationAttributes\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeregisterTransitGatewayMulticastGroupMembers\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DeregisterTransitGatewayMulticastGroupSources\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeAccountAttributes\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeAddresses\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeAddressesAttribute\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeAddressTransfers\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeAggregateIdFormat\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeAvailabilityZones\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeAwsNetworkPerformanceMetricSubscriptions\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeBundleTasks\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeByoipCidrs\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeCapacityBlockExtensionHistory\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeCapacityBlockExtensionOfferings\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeCapacityBlockOfferings\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeCapacityBlocks\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeCapacityBlockStatus\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeCapacityReservationBillingRequests\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeCapacityReservationFleets\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeCapacityReservations\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeCarrierGateways\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeClassicLinkInstances\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeClientVpnAuthorizationRules\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeClientVpnConnections\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeClientVpnEndpoints\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeClientVpnRoutes\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeClientVpnTargetNetworks\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeCoipPools\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeConversionTasks\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeCustomerGateways\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeDeclarativePoliciesReports\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeDhcpOptions\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeEgressOnlyInternetGateways\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeElasticGpus\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeExportImageTasks\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeExportTasks\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeFastLaunchImages\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeFastSnapshotRestores\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeFleetHistory\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeFleetInstances\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeFleets\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeFlowLogs\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeFpgaImageAttribute\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeFpgaImages\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeHostReservationOfferings\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeHostReservations\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeHosts\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeIamInstanceProfileAssociations\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeIdentityIdFormat\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeIdFormat\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeImageAttribute\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeImageReferences\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeImages\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeImageUsageReportEntries\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeImageUsageReports\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeImportImageTasks\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeImportSnapshotTasks\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeInstanceAttribute\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeInstanceConnectEndpoints\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeInstanceCreditSpecifications\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeInstanceEventNotificationAttributes\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeInstanceEventWindows\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeInstanceImageMetadata\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeInstances\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeInstanceStatus\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeInstanceTopology\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeInstanceTypeOfferings\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeInstanceTypes\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeInternetGateways\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeIpamByoasn\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeIpamExternalResourceVerificationTokens\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeIpamPools\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeIpamResourceDiscoveries\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeIpamResourceDiscoveryAssociations\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeIpams\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeIpamScopes\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeIpv6Pools\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeKeyPairs\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeLaunchTemplates\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeLaunchTemplateVersions\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeLocalGatewayRouteTables\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeLocalGatewayRouteTableVirtualInterfaceGroupAssociations\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeLocalGatewayRouteTableVpcAssociations\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeLocalGateways\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeLocalGatewayVirtualInterfaceGroups\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeLocalGatewayVirtualInterfaces\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeLockedSnapshots\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeMacHosts\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeMacModificationTasks\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeManagedPrefixLists\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeMovingAddresses\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeNatGateways\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeNetworkAcls\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeNetworkInsightsAccessScopeAnalyses\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeNetworkInsightsAccessScopes\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeNetworkInsightsAnalyses\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeNetworkInsightsPaths\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeNetworkInterfaceAttribute\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeNetworkInterfacePermissions\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeNetworkInterfaces\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeOutpostLags\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribePlacementGroups\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribePrefixLists\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribePrincipalIdFormat\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribePublicIpv4Pools\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeRegions\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeReplaceRootVolumeTasks\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeReservedInstances\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeReservedInstancesListings\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeReservedInstancesModifications\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeReservedInstancesOfferings\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeRouteServerEndpoints\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeRouteServerPeers\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeRouteServers\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeRouteTables\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeScheduledInstanceAvailability\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeScheduledInstances\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeSecurityGroupReferences\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeSecurityGroupRules\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeSecurityGroups\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeSecurityGroupVpcAssociations\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeServiceLinkVirtualInterfaces\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeSnapshotAttribute\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeSnapshots\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeSnapshotTierStatus\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeSpotDatafeedSubscription\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeSpotFleetInstances\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeSpotFleetRequestHistory\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeSpotFleetRequests\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeSpotInstanceRequests\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeSpotPriceHistory\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeStaleSecurityGroups\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeStoreImageTasks\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeSubnets\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeTags\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeTrafficMirrorFilterRules\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeTrafficMirrorFilters\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeTrafficMirrorSessions\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeTrafficMirrorTargets\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeTransitGatewayAttachments\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeTransitGatewayConnectPeers\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeTransitGatewayConnects\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeTransitGatewayMulticastDomains\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeTransitGatewayPeeringAttachments\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeTransitGatewayPolicyTables\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeTransitGatewayRouteTableAnnouncements\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeTransitGatewayRouteTables\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeTransitGateways\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeTransitGatewayVpcAttachments\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeTrunkInterfaceAssociations\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeVerifiedAccessEndpoints\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeVerifiedAccessGroups\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeVerifiedAccessInstanceLoggingConfigurations\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeVerifiedAccessInstances\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeVerifiedAccessTrustProviders\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeVolumeAttribute\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeVolumes\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeVolumesModifications\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeVolumeStatus\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeVpcAttribute\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeVpcBlockPublicAccessExclusions\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeVpcBlockPublicAccessOptions\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeVpcClassicLink\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeVpcClassicLinkDnsSupport\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeVpcEndpointAssociations\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeVpcEndpointConnectionNotifications\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeVpcEndpointConnections\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeVpcEndpoints\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeVpcEndpointServiceConfigurations\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeVpcEndpointServicePermissions\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeVpcEndpointServices\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeVpcPeeringConnections\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeVpcs\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeVpnConnections\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DescribeVpnGateways\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DetachClassicLinkVpc\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DetachInternetGateway\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DetachNetworkInterface\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DetachVerifiedAccessTrustProvider\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DetachVolume\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DetachVpnGateway\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DisableAddressTransfer\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DisableAllowedImagesSettings\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DisableAwsNetworkPerformanceMetricSubscription\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DisableEbsEncryptionByDefault\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DisableFastLaunch\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DisableFastSnapshotRestores\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DisableImage\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DisableImageBlockPublicAccess\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DisableImageDeprecation\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DisableImageDeregistrationProtection\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DisableIpamOrganizationAdminAccount\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DisableRouteServerPropagation\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DisableSerialConsoleAccess\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DisableSnapshotBlockPublicAccess\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DisableTransitGatewayRouteTablePropagation\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DisableVgwRoutePropagation\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DisableVpcClassicLink\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DisableVpcClassicLinkDnsSupport\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DisassociateAddress\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DisassociateCapacityReservationBillingOwner\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DisassociateClientVpnTargetNetwork\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DisassociateEnclaveCertificateIamRole\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DisassociateIamInstanceProfile\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DisassociateInstanceEventWindow\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DisassociateIpamByoasn\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DisassociateIpamResourceDiscovery\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DisassociateNatGatewayAddress\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DisassociateRouteServer\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DisassociateRouteTable\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DisassociateSecurityGroupVpc\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DisassociateSubnetCidrBlock\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DisassociateTransitGatewayMulticastDomain\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DisassociateTransitGatewayPolicyTable\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DisassociateTransitGatewayRouteTable\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DisassociateTrunkInterface\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#DisassociateVpcCidrBlock\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#EnableAddressTransfer\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#EnableAllowedImagesSettings\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#EnableAwsNetworkPerformanceMetricSubscription\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#EnableEbsEncryptionByDefault\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#EnableFastLaunch\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#EnableFastSnapshotRestores\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#EnableImage\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#EnableImageBlockPublicAccess\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#EnableImageDeprecation\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#EnableImageDeregistrationProtection\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#EnableIpamOrganizationAdminAccount\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#EnableReachabilityAnalyzerOrganizationSharing\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#EnableRouteServerPropagation\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#EnableSerialConsoleAccess\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#EnableSnapshotBlockPublicAccess\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#EnableTransitGatewayRouteTablePropagation\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#EnableVgwRoutePropagation\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#EnableVolumeIO\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#EnableVpcClassicLink\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#EnableVpcClassicLinkDnsSupport\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ExportClientVpnClientCertificateRevocationList\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ExportClientVpnClientConfiguration\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ExportImage\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ExportTransitGatewayRoutes\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ExportVerifiedAccessInstanceClientConfiguration\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#GetActiveVpnTunnelStatus\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#GetAllowedImagesSettings\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#GetAssociatedEnclaveCertificateIamRoles\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#GetAssociatedIpv6PoolCidrs\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#GetAwsNetworkPerformanceData\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#GetCapacityReservationUsage\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#GetCoipPoolUsage\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#GetConsoleOutput\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#GetConsoleScreenshot\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#GetDeclarativePoliciesReportSummary\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#GetDefaultCreditSpecification\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#GetEbsDefaultKmsKeyId\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#GetEbsEncryptionByDefault\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#GetFlowLogsIntegrationTemplate\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#GetGroupsForCapacityReservation\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#GetHostReservationPurchasePreview\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#GetImageBlockPublicAccessState\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#GetInstanceMetadataDefaults\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#GetInstanceTpmEkPub\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#GetInstanceTypesFromInstanceRequirements\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#GetInstanceUefiData\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#GetIpamAddressHistory\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#GetIpamDiscoveredAccounts\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#GetIpamDiscoveredPublicAddresses\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#GetIpamDiscoveredResourceCidrs\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#GetIpamPoolAllocations\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#GetIpamPoolCidrs\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#GetIpamResourceCidrs\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#GetLaunchTemplateData\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#GetManagedPrefixListAssociations\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#GetManagedPrefixListEntries\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#GetNetworkInsightsAccessScopeAnalysisFindings\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#GetNetworkInsightsAccessScopeContent\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#GetPasswordData\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#GetReservedInstancesExchangeQuote\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#GetRouteServerAssociations\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#GetRouteServerPropagations\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#GetRouteServerRoutingDatabase\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#GetSecurityGroupsForVpc\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#GetSerialConsoleAccessStatus\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#GetSnapshotBlockPublicAccessState\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#GetSpotPlacementScores\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#GetSubnetCidrReservations\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#GetTransitGatewayAttachmentPropagations\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#GetTransitGatewayMulticastDomainAssociations\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#GetTransitGatewayPolicyTableAssociations\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#GetTransitGatewayPolicyTableEntries\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#GetTransitGatewayPrefixListReferences\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#GetTransitGatewayRouteTableAssociations\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#GetTransitGatewayRouteTablePropagations\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#GetVerifiedAccessEndpointPolicy\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#GetVerifiedAccessEndpointTargets\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#GetVerifiedAccessGroupPolicy\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#GetVpnConnectionDeviceSampleConfiguration\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#GetVpnConnectionDeviceTypes\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#GetVpnTunnelReplacementStatus\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ImportClientVpnClientCertificateRevocationList\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ImportImage\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ImportInstance\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ImportKeyPair\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ImportSnapshot\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ImportVolume\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ListImagesInRecycleBin\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ListSnapshotsInRecycleBin\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#LockSnapshot\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ModifyAddressAttribute\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ModifyAvailabilityZoneGroup\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ModifyCapacityReservation\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ModifyCapacityReservationFleet\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ModifyClientVpnEndpoint\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ModifyDefaultCreditSpecification\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ModifyEbsDefaultKmsKeyId\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ModifyFleet\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ModifyFpgaImageAttribute\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ModifyHosts\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ModifyIdentityIdFormat\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ModifyIdFormat\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ModifyImageAttribute\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ModifyInstanceAttribute\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ModifyInstanceCapacityReservationAttributes\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ModifyInstanceConnectEndpoint\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ModifyInstanceCpuOptions\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ModifyInstanceCreditSpecification\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ModifyInstanceEventStartTime\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ModifyInstanceEventWindow\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ModifyInstanceMaintenanceOptions\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ModifyInstanceMetadataDefaults\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ModifyInstanceMetadataOptions\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ModifyInstanceNetworkPerformanceOptions\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ModifyInstancePlacement\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ModifyIpam\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ModifyIpamPool\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ModifyIpamResourceCidr\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ModifyIpamResourceDiscovery\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ModifyIpamScope\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ModifyLaunchTemplate\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ModifyLocalGatewayRoute\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ModifyManagedPrefixList\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ModifyNetworkInterfaceAttribute\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ModifyPrivateDnsNameOptions\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ModifyPublicIpDnsNameOptions\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ModifyReservedInstances\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ModifyRouteServer\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ModifySecurityGroupRules\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ModifySnapshotAttribute\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ModifySnapshotTier\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ModifySpotFleetRequest\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ModifySubnetAttribute\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ModifyTrafficMirrorFilterNetworkServices\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ModifyTrafficMirrorFilterRule\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ModifyTrafficMirrorSession\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ModifyTransitGateway\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ModifyTransitGatewayPrefixListReference\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ModifyTransitGatewayVpcAttachment\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ModifyVerifiedAccessEndpoint\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ModifyVerifiedAccessEndpointPolicy\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ModifyVerifiedAccessGroup\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ModifyVerifiedAccessGroupPolicy\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ModifyVerifiedAccessInstance\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ModifyVerifiedAccessInstanceLoggingConfiguration\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ModifyVerifiedAccessTrustProvider\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ModifyVolume\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ModifyVolumeAttribute\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ModifyVpcAttribute\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ModifyVpcBlockPublicAccessExclusion\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ModifyVpcBlockPublicAccessOptions\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ModifyVpcEndpoint\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ModifyVpcEndpointConnectionNotification\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ModifyVpcEndpointServiceConfiguration\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ModifyVpcEndpointServicePayerResponsibility\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ModifyVpcEndpointServicePermissions\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ModifyVpcPeeringConnectionOptions\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ModifyVpcTenancy\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ModifyVpnConnection\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ModifyVpnConnectionOptions\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ModifyVpnTunnelCertificate\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ModifyVpnTunnelOptions\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#MonitorInstances\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#MoveAddressToVpc\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#MoveByoipCidrToIpam\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#MoveCapacityReservationInstances\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ProvisionByoipCidr\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ProvisionIpamByoasn\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ProvisionIpamPoolCidr\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ProvisionPublicIpv4PoolCidr\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#PurchaseCapacityBlock\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#PurchaseCapacityBlockExtension\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#PurchaseHostReservation\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#PurchaseReservedInstancesOffering\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#PurchaseScheduledInstances\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#RebootInstances\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#RegisterImage\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#RegisterInstanceEventNotificationAttributes\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#RegisterTransitGatewayMulticastGroupMembers\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#RegisterTransitGatewayMulticastGroupSources\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#RejectCapacityReservationBillingOwnership\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#RejectTransitGatewayMulticastDomainAssociations\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#RejectTransitGatewayPeeringAttachment\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#RejectTransitGatewayVpcAttachment\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#RejectVpcEndpointConnections\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#RejectVpcPeeringConnection\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ReleaseAddress\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ReleaseHosts\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ReleaseIpamPoolAllocation\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ReplaceIamInstanceProfileAssociation\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ReplaceImageCriteriaInAllowedImagesSettings\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ReplaceNetworkAclAssociation\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ReplaceNetworkAclEntry\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ReplaceRoute\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ReplaceRouteTableAssociation\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ReplaceTransitGatewayRoute\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ReplaceVpnTunnel\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ReportInstanceStatus\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#RequestSpotFleet\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#RequestSpotInstances\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ResetAddressAttribute\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ResetEbsDefaultKmsKeyId\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ResetFpgaImageAttribute\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ResetImageAttribute\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ResetInstanceAttribute\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ResetNetworkInterfaceAttribute\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#ResetSnapshotAttribute\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#RestoreAddressToClassic\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#RestoreImageFromRecycleBin\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#RestoreManagedPrefixListVersion\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#RestoreSnapshotFromRecycleBin\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#RestoreSnapshotTier\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#RevokeClientVpnIngress\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#RevokeSecurityGroupEgress\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#RevokeSecurityGroupIngress\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#RunInstances\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#RunScheduledInstances\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#SearchLocalGatewayRoutes\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#SearchTransitGatewayMulticastGroups\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#SearchTransitGatewayRoutes\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#SendDiagnosticInterrupt\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#StartDeclarativePoliciesReport\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#StartInstances\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#StartNetworkInsightsAccessScopeAnalysis\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#StartNetworkInsightsAnalysis\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#StartVpcEndpointServicePrivateDnsVerification\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#StopInstances\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#TerminateClientVpnConnections\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#TerminateInstances\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#UnassignIpv6Addresses\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#UnassignPrivateIpAddresses\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#UnassignPrivateNatGatewayAddress\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#UnlockSnapshot\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#UnmonitorInstances\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#UpdateSecurityGroupRuleDescriptionsEgress\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#UpdateSecurityGroupRuleDescriptionsIngress\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ec2#WithdrawByoipCidr\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#service\": {\n                    \"sdkId\": \"EC2\",\n                    \"arnNamespace\": \"ec2\",\n                    \"cloudFormationName\": \"EC2\",\n                    \"cloudTrailEventSource\": \"ec2.amazonaws.com\",\n                    \"endpointPrefix\": \"ec2\"\n                },\n                \"aws.auth#sigv4\": {\n                    \"name\": \"ec2\"\n                },\n                \"aws.protocols#ec2Query\": {},\n                \"smithy.api#documentation\": \"<fullname>Amazon Elastic Compute Cloud</fullname>\\n         <p>You can access the features of Amazon Elastic Compute Cloud (Amazon EC2) programmatically. For more information,\\n        see the <a href=\\\"https://docs.aws.amazon.com/ec2/latest/devguide\\\">Amazon EC2 Developer Guide</a>.</p>\",\n                \"smithy.api#title\": \"Amazon Elastic Compute Cloud\",\n                \"smithy.api#xmlNamespace\": {\n                    \"uri\": \"http://ec2.amazonaws.com/doc/2016-11-15\"\n                },\n                \"smithy.rules#endpointRuleSet\": {\n                    \"version\": \"1.0\",\n                    \"parameters\": {\n                        \"Region\": {\n                            \"builtIn\": \"AWS::Region\",\n                            \"required\": false,\n                            \"documentation\": \"The AWS region used to dispatch the request.\",\n                            \"type\": \"String\"\n                        },\n                        \"UseDualStack\": {\n                            \"builtIn\": \"AWS::UseDualStack\",\n                            \"required\": true,\n                            \"default\": false,\n                            \"documentation\": \"When true, use the dual-stack endpoint. If the configured endpoint does not support dual-stack, dispatching the request MAY return an error.\",\n                            \"type\": \"Boolean\"\n                        },\n                        \"UseFIPS\": {\n                            \"builtIn\": \"AWS::UseFIPS\",\n                            \"required\": true,\n                            \"default\": false,\n                            \"documentation\": \"When true, send this request to the FIPS-compliant regional endpoint. If the configured endpoint does not have a FIPS compliant endpoint, dispatching the request will return an error.\",\n                            \"type\": \"Boolean\"\n                        },\n                        \"Endpoint\": {\n                            \"builtIn\": \"SDK::Endpoint\",\n                            \"required\": false,\n                            \"documentation\": \"Override the endpoint used to send this request\",\n                            \"type\": \"String\"\n                        }\n                    },\n                    \"rules\": [\n                        {\n                            \"conditions\": [\n                                {\n                                    \"fn\": \"isSet\",\n                                    \"argv\": [\n                                        {\n                                            \"ref\": \"Endpoint\"\n                                        }\n                                    ]\n                                }\n                            ],\n                            \"rules\": [\n                                {\n                                    \"conditions\": [\n                                        {\n                                            \"fn\": \"booleanEquals\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"UseFIPS\"\n                                                },\n                                                true\n                                            ]\n                                        }\n                                    ],\n                                    \"error\": \"Invalid Configuration: FIPS and custom endpoint are not supported\",\n                                    \"type\": \"error\"\n                                },\n                                {\n                                    \"conditions\": [\n                                        {\n                                            \"fn\": \"booleanEquals\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"UseDualStack\"\n                                                },\n                                                true\n                                            ]\n                                        }\n                                    ],\n                                    \"error\": \"Invalid Configuration: Dualstack and custom endpoint are not supported\",\n                                    \"type\": \"error\"\n                                },\n                                {\n                                    \"conditions\": [],\n                                    \"endpoint\": {\n                                        \"url\": {\n                                            \"ref\": \"Endpoint\"\n                                        },\n                                        \"properties\": {},\n                                        \"headers\": {}\n                                    },\n                                    \"type\": \"endpoint\"\n                                }\n                            ],\n                            \"type\": \"tree\"\n                        },\n                        {\n                            \"conditions\": [\n                                {\n                                    \"fn\": \"isSet\",\n                                    \"argv\": [\n                                        {\n                                            \"ref\": \"Region\"\n                                        }\n                                    ]\n                                }\n                            ],\n                            \"rules\": [\n                                {\n                                    \"conditions\": [\n                                        {\n                                            \"fn\": \"aws.partition\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"Region\"\n                                                }\n                                            ],\n                                            \"assign\": \"PartitionResult\"\n                                        }\n                                    ],\n                                    \"rules\": [\n                                        {\n                                            \"conditions\": [\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseFIPS\"\n                                                        },\n                                                        true\n                                                    ]\n                                                },\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseDualStack\"\n                                                        },\n                                                        true\n                                                    ]\n                                                }\n                                            ],\n                                            \"rules\": [\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                true,\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"PartitionResult\"\n                                                                        },\n                                                                        \"supportsFIPS\"\n                                                                    ]\n                                                                }\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                true,\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"PartitionResult\"\n                                                                        },\n                                                                        \"supportsDualStack\"\n                                                                    ]\n                                                                }\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"rules\": [\n                                                        {\n                                                            \"conditions\": [],\n                                                            \"endpoint\": {\n                                                                \"url\": \"https://ec2-fips.{Region}.{PartitionResult#dualStackDnsSuffix}\",\n                                                                \"properties\": {},\n                                                                \"headers\": {}\n                                                            },\n                                                            \"type\": \"endpoint\"\n                                                        }\n                                                    ],\n                                                    \"type\": \"tree\"\n                                                },\n                                                {\n                                                    \"conditions\": [],\n                                                    \"error\": \"FIPS and DualStack are enabled, but this partition does not support one or both\",\n                                                    \"type\": \"error\"\n                                                }\n                                            ],\n                                            \"type\": \"tree\"\n                                        },\n                                        {\n                                            \"conditions\": [\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseFIPS\"\n                                                        },\n                                                        true\n                                                    ]\n                                                }\n                                            ],\n                                            \"rules\": [\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"PartitionResult\"\n                                                                        },\n                                                                        \"supportsFIPS\"\n                                                                    ]\n                                                                },\n                                                                true\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"rules\": [\n                                                        {\n                                                            \"conditions\": [\n                                                                {\n                                                                    \"fn\": \"stringEquals\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"fn\": \"getAttr\",\n                                                                            \"argv\": [\n                                                                                {\n                                                                                    \"ref\": \"PartitionResult\"\n                                                                                },\n                                                                                \"name\"\n                                                                            ]\n                                                                        },\n                                                                        \"aws-us-gov\"\n                                                                    ]\n                                                                }\n                                                            ],\n                                                            \"endpoint\": {\n                                                                \"url\": \"https://ec2.{Region}.amazonaws.com\",\n                                                                \"properties\": {},\n                                                                \"headers\": {}\n                                                            },\n                                                            \"type\": \"endpoint\"\n                                                        },\n                                                        {\n                                                            \"conditions\": [],\n                                                            \"endpoint\": {\n                                                                \"url\": \"https://ec2-fips.{Region}.{PartitionResult#dnsSuffix}\",\n                                                                \"properties\": {},\n                                                                \"headers\": {}\n                                                            },\n                                                            \"type\": \"endpoint\"\n                                                        }\n                                                    ],\n                                                    \"type\": \"tree\"\n                                                },\n                                                {\n                                                    \"conditions\": [],\n                                                    \"error\": \"FIPS is enabled but this partition does not support FIPS\",\n                                                    \"type\": \"error\"\n                                                }\n                                            ],\n                                            \"type\": \"tree\"\n                                        },\n                                        {\n                                            \"conditions\": [\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseDualStack\"\n                                                        },\n                                                        true\n                                                    ]\n                                                }\n                                            ],\n                                            \"rules\": [\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                true,\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"PartitionResult\"\n                                                                        },\n                                                                        \"supportsDualStack\"\n                                                                    ]\n                                                                }\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"rules\": [\n                                                        {\n                                                            \"conditions\": [],\n                                                            \"endpoint\": {\n                                                                \"url\": \"https://ec2.{Region}.{PartitionResult#dualStackDnsSuffix}\",\n                                                                \"properties\": {},\n                                                                \"headers\": {}\n                                                            },\n                                                            \"type\": \"endpoint\"\n                                                        }\n                                                    ],\n                                                    \"type\": \"tree\"\n                                                },\n                                                {\n                                                    \"conditions\": [],\n                                                    \"error\": \"DualStack is enabled but this partition does not support DualStack\",\n                                                    \"type\": \"error\"\n                                                }\n                                            ],\n                                            \"type\": \"tree\"\n                                        },\n                                        {\n                                            \"conditions\": [],\n                                            \"endpoint\": {\n                                                \"url\": \"https://ec2.{Region}.{PartitionResult#dnsSuffix}\",\n                                                \"properties\": {},\n                                                \"headers\": {}\n                                            },\n                                            \"type\": \"endpoint\"\n                                        }\n                                    ],\n                                    \"type\": \"tree\"\n                                }\n                            ],\n                            \"type\": \"tree\"\n                        },\n                        {\n                            \"conditions\": [],\n                            \"error\": \"Invalid Configuration: Missing Region\",\n                            \"type\": \"error\"\n                        }\n                    ]\n                },\n                \"smithy.rules#endpointTests\": {\n                    \"testCases\": [\n                        {\n                            \"documentation\": \"For region af-south-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ec2.af-south-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"af-south-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ec2.ap-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-northeast-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ec2.ap-northeast-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-northeast-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-northeast-2 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ec2.ap-northeast-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-northeast-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-northeast-3 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ec2.ap-northeast-3.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-northeast-3\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-south-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ec2.ap-south-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-south-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-south-1 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ec2.ap-south-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-south-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-southeast-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ec2.ap-southeast-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-southeast-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-southeast-2 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ec2.ap-southeast-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-southeast-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-southeast-3 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ec2.ap-southeast-3.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-southeast-3\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ca-central-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ec2.ca-central-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ca-central-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ca-central-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ec2-fips.ca-central-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ca-central-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-central-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ec2.eu-central-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-central-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-north-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ec2.eu-north-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-north-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-south-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ec2.eu-south-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-south-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-west-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ec2.eu-west-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-west-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-west-1 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ec2.eu-west-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-west-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-west-2 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ec2.eu-west-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-west-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-west-3 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ec2.eu-west-3.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-west-3\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region me-south-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ec2.me-south-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"me-south-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region sa-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ec2.sa-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"sa-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region sa-east-1 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ec2.sa-east-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"sa-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ec2.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ec2-fips.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-1 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ec2.us-east-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-2 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ec2.us-east-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-2 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ec2-fips.us-east-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-2\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-2 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ec2.us-east-2.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-west-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ec2.us-west-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-west-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-west-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ec2-fips.us-west-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-west-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-west-2 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ec2.us-west-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-west-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-west-2 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ec2-fips.us-west-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-west-2\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-west-2 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ec2.us-west-2.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-west-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-1 with FIPS enabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ec2-fips.us-east-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-north-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ec2.cn-north-1.amazonaws.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-north-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-northwest-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ec2.cn-northwest-1.amazonaws.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-northwest-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-north-1 with FIPS enabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ec2-fips.cn-north-1.api.amazonwebservices.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-north-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-north-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ec2-fips.cn-north-1.amazonaws.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-north-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-north-1 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ec2.cn-north-1.api.amazonwebservices.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-north-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ec2.us-gov-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-west-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ec2.us-gov-west-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-west-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-east-1 with FIPS enabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ec2-fips.us-gov-east-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-east-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ec2.us-gov-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-east-1 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ec2.us-gov-east-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-iso-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ec2.us-iso-east-1.c2s.ic.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-iso-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-iso-west-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ec2.us-iso-west-1.c2s.ic.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-iso-west-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-iso-east-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ec2-fips.us-iso-east-1.c2s.ic.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-iso-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-isob-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ec2.us-isob-east-1.sc2s.sgov.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-isob-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-isob-east-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ec2-fips.us-isob-east-1.sc2s.sgov.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-isob-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For custom endpoint with region set and fips disabled and dualstack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://example.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"For custom endpoint with region not set and fips disabled and dualstack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://example.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"For custom endpoint with fips enabled and dualstack disabled\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: FIPS and custom endpoint are not supported\"\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false,\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"For custom endpoint with fips disabled and dualstack enabled\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: Dualstack and custom endpoint are not supported\"\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true,\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"Missing region\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: Missing Region\"\n                            }\n                        }\n                    ],\n                    \"version\": \"1.0\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#AmdSevSnpSpecification\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"enabled\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"enabled\"\n                    }\n                },\n                \"disabled\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"disabled\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#AnalysisAclRule\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Cidr\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Cidr\",\n                        \"smithy.api#documentation\": \"<p>The IPv4 address range, in CIDR notation.</p>\",\n                        \"smithy.api#xmlName\": \"cidr\"\n                    }\n                },\n                \"Egress\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Egress\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether the rule is an outbound rule.</p>\",\n                        \"smithy.api#xmlName\": \"egress\"\n                    }\n                },\n                \"PortRange\": {\n                    \"target\": \"com.amazonaws.ec2#PortRange\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PortRange\",\n                        \"smithy.api#documentation\": \"<p>The range of ports.</p>\",\n                        \"smithy.api#xmlName\": \"portRange\"\n                    }\n                },\n                \"Protocol\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Protocol\",\n                        \"smithy.api#documentation\": \"<p>The protocol.</p>\",\n                        \"smithy.api#xmlName\": \"protocol\"\n                    }\n                },\n                \"RuleAction\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RuleAction\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether to allow or deny traffic that matches the rule.</p>\",\n                        \"smithy.api#xmlName\": \"ruleAction\"\n                    }\n                },\n                \"RuleNumber\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RuleNumber\",\n                        \"smithy.api#documentation\": \"<p>The rule number.</p>\",\n                        \"smithy.api#xmlName\": \"ruleNumber\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a network access control (ACL) rule.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#AnalysisComponent\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Id\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Id\",\n                        \"smithy.api#documentation\": \"<p>The ID of the component.</p>\",\n                        \"smithy.api#xmlName\": \"id\"\n                    }\n                },\n                \"Arn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Arn\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the component.</p>\",\n                        \"smithy.api#xmlName\": \"arn\"\n                    }\n                },\n                \"Name\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Name\",\n                        \"smithy.api#documentation\": \"<p>The name of the analysis component.</p>\",\n                        \"smithy.api#xmlName\": \"name\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a path component.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#AnalysisComponentList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#AnalysisComponent\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#AnalysisLoadBalancerListener\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LoadBalancerPort\": {\n                    \"target\": \"com.amazonaws.ec2#Port\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LoadBalancerPort\",\n                        \"smithy.api#documentation\": \"<p>The port on which the load balancer is listening.</p>\",\n                        \"smithy.api#xmlName\": \"loadBalancerPort\"\n                    }\n                },\n                \"InstancePort\": {\n                    \"target\": \"com.amazonaws.ec2#Port\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstancePort\",\n                        \"smithy.api#documentation\": \"<p>[Classic Load Balancers] The back-end port for the listener.</p>\",\n                        \"smithy.api#xmlName\": \"instancePort\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a load balancer listener.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#AnalysisLoadBalancerTarget\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Address\": {\n                    \"target\": \"com.amazonaws.ec2#IpAddress\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Address\",\n                        \"smithy.api#documentation\": \"<p>The IP address.</p>\",\n                        \"smithy.api#xmlName\": \"address\"\n                    }\n                },\n                \"AvailabilityZone\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AvailabilityZone\",\n                        \"smithy.api#documentation\": \"<p>The Availability Zone.</p>\",\n                        \"smithy.api#xmlName\": \"availabilityZone\"\n                    }\n                },\n                \"AvailabilityZoneId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AvailabilityZoneId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Availability Zone.</p>\",\n                        \"smithy.api#xmlName\": \"availabilityZoneId\"\n                    }\n                },\n                \"Instance\": {\n                    \"target\": \"com.amazonaws.ec2#AnalysisComponent\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Instance\",\n                        \"smithy.api#documentation\": \"<p>Information about the instance.</p>\",\n                        \"smithy.api#xmlName\": \"instance\"\n                    }\n                },\n                \"Port\": {\n                    \"target\": \"com.amazonaws.ec2#Port\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Port\",\n                        \"smithy.api#documentation\": \"<p>The port on which the target is listening.</p>\",\n                        \"smithy.api#xmlName\": \"port\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a load balancer target.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#AnalysisPacketHeader\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DestinationAddresses\": {\n                    \"target\": \"com.amazonaws.ec2#IpAddressList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DestinationAddressSet\",\n                        \"smithy.api#documentation\": \"<p>The destination addresses.</p>\",\n                        \"smithy.api#xmlName\": \"destinationAddressSet\"\n                    }\n                },\n                \"DestinationPortRanges\": {\n                    \"target\": \"com.amazonaws.ec2#PortRangeList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DestinationPortRangeSet\",\n                        \"smithy.api#documentation\": \"<p>The destination port ranges.</p>\",\n                        \"smithy.api#xmlName\": \"destinationPortRangeSet\"\n                    }\n                },\n                \"Protocol\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Protocol\",\n                        \"smithy.api#documentation\": \"<p>The protocol.</p>\",\n                        \"smithy.api#xmlName\": \"protocol\"\n                    }\n                },\n                \"SourceAddresses\": {\n                    \"target\": \"com.amazonaws.ec2#IpAddressList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SourceAddressSet\",\n                        \"smithy.api#documentation\": \"<p>The source addresses.</p>\",\n                        \"smithy.api#xmlName\": \"sourceAddressSet\"\n                    }\n                },\n                \"SourcePortRanges\": {\n                    \"target\": \"com.amazonaws.ec2#PortRangeList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SourcePortRangeSet\",\n                        \"smithy.api#documentation\": \"<p>The source port ranges.</p>\",\n                        \"smithy.api#xmlName\": \"sourcePortRangeSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a header. Reflects any changes made by a component as traffic passes through.\\n         The fields of an inbound header are null except for the first component of a path.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#AnalysisRouteTableRoute\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DestinationCidr\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DestinationCidr\",\n                        \"smithy.api#documentation\": \"<p>The destination IPv4 address, in CIDR notation.</p>\",\n                        \"smithy.api#xmlName\": \"destinationCidr\"\n                    }\n                },\n                \"DestinationPrefixListId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DestinationPrefixListId\",\n                        \"smithy.api#documentation\": \"<p>The prefix of the Amazon Web Services service.</p>\",\n                        \"smithy.api#xmlName\": \"destinationPrefixListId\"\n                    }\n                },\n                \"EgressOnlyInternetGatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EgressOnlyInternetGatewayId\",\n                        \"smithy.api#documentation\": \"<p>The ID of an egress-only internet gateway.</p>\",\n                        \"smithy.api#xmlName\": \"egressOnlyInternetGatewayId\"\n                    }\n                },\n                \"GatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"GatewayId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the gateway, such as an internet gateway or virtual private gateway.</p>\",\n                        \"smithy.api#xmlName\": \"gatewayId\"\n                    }\n                },\n                \"InstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the instance, such as a NAT instance.</p>\",\n                        \"smithy.api#xmlName\": \"instanceId\"\n                    }\n                },\n                \"NatGatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NatGatewayId\",\n                        \"smithy.api#documentation\": \"<p>The ID of a NAT gateway.</p>\",\n                        \"smithy.api#xmlName\": \"natGatewayId\"\n                    }\n                },\n                \"NetworkInterfaceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkInterfaceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of a network interface.</p>\",\n                        \"smithy.api#xmlName\": \"networkInterfaceId\"\n                    }\n                },\n                \"Origin\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Origin\",\n                        \"smithy.api#documentation\": \"<p>Describes how the route was created. The following are the possible values:</p>\\n         <ul>\\n            <li>\\n               <p>CreateRouteTable - The route was automatically created when the route table was created.</p>\\n            </li>\\n            <li>\\n               <p>CreateRoute - The route was manually added to the route table.</p>\\n            </li>\\n            <li>\\n               <p>EnableVgwRoutePropagation - The route was propagated by route propagation.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"origin\"\n                    }\n                },\n                \"TransitGatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayId\",\n                        \"smithy.api#documentation\": \"<p>The ID of a transit gateway.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayId\"\n                    }\n                },\n                \"VpcPeeringConnectionId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcPeeringConnectionId\",\n                        \"smithy.api#documentation\": \"<p>The ID of a VPC peering connection.</p>\",\n                        \"smithy.api#xmlName\": \"vpcPeeringConnectionId\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The state. The following are the possible values:</p>\\n         <ul>\\n            <li>\\n               <p>active</p>\\n            </li>\\n            <li>\\n               <p>blackhole</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                },\n                \"CarrierGatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CarrierGatewayId\",\n                        \"smithy.api#documentation\": \"<p>The ID of a carrier gateway.</p>\",\n                        \"smithy.api#xmlName\": \"carrierGatewayId\"\n                    }\n                },\n                \"CoreNetworkArn\": {\n                    \"target\": \"com.amazonaws.ec2#ResourceArn\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CoreNetworkArn\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of a core network.</p>\",\n                        \"smithy.api#xmlName\": \"coreNetworkArn\"\n                    }\n                },\n                \"LocalGatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LocalGatewayId\",\n                        \"smithy.api#documentation\": \"<p>The ID of a local gateway.</p>\",\n                        \"smithy.api#xmlName\": \"localGatewayId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a route table route.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#AnalysisSecurityGroupRule\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Cidr\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Cidr\",\n                        \"smithy.api#documentation\": \"<p>The IPv4 address range, in CIDR notation.</p>\",\n                        \"smithy.api#xmlName\": \"cidr\"\n                    }\n                },\n                \"Direction\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Direction\",\n                        \"smithy.api#documentation\": \"<p>The direction. The following are the possible values:</p>\\n         <ul>\\n            <li>\\n               <p>egress</p>\\n            </li>\\n            <li>\\n               <p>ingress</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"direction\"\n                    }\n                },\n                \"SecurityGroupId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SecurityGroupId\",\n                        \"smithy.api#documentation\": \"<p>The security group ID.</p>\",\n                        \"smithy.api#xmlName\": \"securityGroupId\"\n                    }\n                },\n                \"PortRange\": {\n                    \"target\": \"com.amazonaws.ec2#PortRange\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PortRange\",\n                        \"smithy.api#documentation\": \"<p>The port range.</p>\",\n                        \"smithy.api#xmlName\": \"portRange\"\n                    }\n                },\n                \"PrefixListId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PrefixListId\",\n                        \"smithy.api#documentation\": \"<p>The prefix list ID.</p>\",\n                        \"smithy.api#xmlName\": \"prefixListId\"\n                    }\n                },\n                \"Protocol\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Protocol\",\n                        \"smithy.api#documentation\": \"<p>The protocol name.</p>\",\n                        \"smithy.api#xmlName\": \"protocol\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a security group rule.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#AnalysisStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"running\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"running\"\n                    }\n                },\n                \"succeeded\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"succeeded\"\n                    }\n                },\n                \"failed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"failed\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ApplianceModeSupportValue\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"enable\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"enable\"\n                    }\n                },\n                \"disable\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"disable\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ApplySecurityGroupsToClientVpnTargetNetwork\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ApplySecurityGroupsToClientVpnTargetNetworkRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ApplySecurityGroupsToClientVpnTargetNetworkResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Applies a security group to the association between the target network and the Client VPN endpoint. This action replaces the existing \\n\\t\\t\\tsecurity groups with the specified security groups.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ApplySecurityGroupsToClientVpnTargetNetworkRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ClientVpnEndpointId\": {\n                    \"target\": \"com.amazonaws.ec2#ClientVpnEndpointId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the Client VPN endpoint.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"VpcId\": {\n                    \"target\": \"com.amazonaws.ec2#VpcId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the VPC in which the associated target network is located.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"SecurityGroupIds\": {\n                    \"target\": \"com.amazonaws.ec2#ClientVpnSecurityGroupIdSet\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The IDs of the security groups to apply to the associated target network. Up to 5 security groups can \\n\\t\\t\\tbe applied to an associated target network.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"SecurityGroupId\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ApplySecurityGroupsToClientVpnTargetNetworkResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SecurityGroupIds\": {\n                    \"target\": \"com.amazonaws.ec2#ClientVpnSecurityGroupIdSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SecurityGroupIds\",\n                        \"smithy.api#documentation\": \"<p>The IDs of the applied security groups.</p>\",\n                        \"smithy.api#xmlName\": \"securityGroupIds\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ArchitectureType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"i386\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"i386\"\n                    }\n                },\n                \"x86_64\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"x86_64\"\n                    }\n                },\n                \"arm64\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"arm64\"\n                    }\n                },\n                \"x86_64_mac\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"x86_64_mac\"\n                    }\n                },\n                \"arm64_mac\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"arm64_mac\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ArchitectureTypeList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ArchitectureType\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ArchitectureTypeSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ArchitectureType\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 3\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ArchitectureValues\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"i386\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"i386\"\n                    }\n                },\n                \"x86_64\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"x86_64\"\n                    }\n                },\n                \"arm64\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"arm64\"\n                    }\n                },\n                \"x86_64_mac\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"x86_64_mac\"\n                    }\n                },\n                \"arm64_mac\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"arm64_mac\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ArnList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ResourceArn\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#AsPath\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#String\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#AsnAssociation\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Asn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Asn\",\n                        \"smithy.api#documentation\": \"<p>The association's ASN.</p>\",\n                        \"smithy.api#xmlName\": \"asn\"\n                    }\n                },\n                \"Cidr\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Cidr\",\n                        \"smithy.api#documentation\": \"<p>The association's CIDR.</p>\",\n                        \"smithy.api#xmlName\": \"cidr\"\n                    }\n                },\n                \"StatusMessage\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"StatusMessage\",\n                        \"smithy.api#documentation\": \"<p>The association's status message.</p>\",\n                        \"smithy.api#xmlName\": \"statusMessage\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#AsnAssociationState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The association's state.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>An Autonomous System Number (ASN) and BYOIP CIDR association.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#AsnAssociationSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#AsnAssociation\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#AsnAssociationState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"disassociated\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"disassociated\"\n                    }\n                },\n                \"failed_disassociation\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"failed-disassociation\"\n                    }\n                },\n                \"failed_association\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"failed-association\"\n                    }\n                },\n                \"pending_disassociation\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"pending-disassociation\"\n                    }\n                },\n                \"pending_association\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"pending-association\"\n                    }\n                },\n                \"associated\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"associated\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#AsnAuthorizationContext\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Message\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The authorization context's message.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Signature\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The authorization context's signature.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Provides authorization for Amazon to bring an Autonomous System Number (ASN) to a specific Amazon Web Services account using bring your own ASN (BYOASN). \\n            For details on the format of the message and signature, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/ipam/tutorials-byoasn.html\\\">Tutorial: Bring your ASN to IPAM</a> in the <i>Amazon VPC IPAM guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#AsnState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"deprovisioned\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"deprovisioned\"\n                    }\n                },\n                \"failed_deprovision\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"failed-deprovision\"\n                    }\n                },\n                \"failed_provision\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"failed-provision\"\n                    }\n                },\n                \"pending_deprovision\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"pending-deprovision\"\n                    }\n                },\n                \"pending_provision\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"pending-provision\"\n                    }\n                },\n                \"provisioned\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"provisioned\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#AssetId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#AssetIdList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#AssetId\"\n            }\n        },\n        \"com.amazonaws.ec2#AssignIpv6Addresses\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#AssignIpv6AddressesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#AssignIpv6AddressesResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Assigns the specified IPv6 addresses to the specified network interface. You can\\n            specify specific IPv6 addresses, or you can specify the number of IPv6 addresses to be\\n            automatically assigned from the subnet's IPv6 CIDR block range. You can assign as many\\n            IPv6 addresses to a network interface as you can assign private IPv4 addresses, and the\\n            limit varies by instance type.</p>\\n         <p>You must specify either the IPv6 addresses or the IPv6 address count in the request. </p>\\n         <p>You can optionally use Prefix Delegation on the network interface. You must specify\\n            either the IPV6 Prefix Delegation prefixes, or the IPv6 Prefix Delegation count. For\\n            information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-prefix-eni.html\\\"> Assigning prefixes to network\\n                interfaces</a> in the <i>Amazon EC2 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#AssignIpv6AddressesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Ipv6PrefixCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of IPv6 prefixes that Amazon Web Services automatically assigns to the\\n            network interface. You cannot use this option if you use the <code>Ipv6Prefixes</code>\\n            option.</p>\"\n                    }\n                },\n                \"Ipv6Prefixes\": {\n                    \"target\": \"com.amazonaws.ec2#IpPrefixList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more IPv6 prefixes assigned to the network interface. You can't use this option if you use the <code>Ipv6PrefixCount</code> option.</p>\",\n                        \"smithy.api#xmlName\": \"Ipv6Prefix\"\n                    }\n                },\n                \"NetworkInterfaceId\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInterfaceId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkInterfaceId\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the network interface.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"networkInterfaceId\"\n                    }\n                },\n                \"Ipv6Addresses\": {\n                    \"target\": \"com.amazonaws.ec2#Ipv6AddressList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Ipv6Addresses\",\n                        \"smithy.api#documentation\": \"<p>The IPv6 addresses to be assigned to the network interface. You can't use this option\\n            if you're specifying a number of IPv6 addresses.</p>\",\n                        \"smithy.api#xmlName\": \"ipv6Addresses\"\n                    }\n                },\n                \"Ipv6AddressCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Ipv6AddressCount\",\n                        \"smithy.api#documentation\": \"<p>The number of additional IPv6 addresses to assign to the network interface. The\\n            specified number of IPv6 addresses are assigned in addition to the existing IPv6\\n            addresses that are already assigned to the network interface. Amazon EC2 automatically\\n            selects the IPv6 addresses from the subnet range. You can't use this option if\\n            specifying specific IPv6 addresses.</p>\",\n                        \"smithy.api#xmlName\": \"ipv6AddressCount\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#AssignIpv6AddressesResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AssignedIpv6Addresses\": {\n                    \"target\": \"com.amazonaws.ec2#Ipv6AddressList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AssignedIpv6Addresses\",\n                        \"smithy.api#documentation\": \"<p>The new IPv6 addresses assigned to the network interface. Existing IPv6 addresses that\\n            were assigned to the network interface before the request are not included.</p>\",\n                        \"smithy.api#xmlName\": \"assignedIpv6Addresses\"\n                    }\n                },\n                \"AssignedIpv6Prefixes\": {\n                    \"target\": \"com.amazonaws.ec2#IpPrefixList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AssignedIpv6PrefixSet\",\n                        \"smithy.api#documentation\": \"<p>The IPv6 prefixes that are assigned to the network interface.</p>\",\n                        \"smithy.api#xmlName\": \"assignedIpv6PrefixSet\"\n                    }\n                },\n                \"NetworkInterfaceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkInterfaceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the network interface.</p>\",\n                        \"smithy.api#xmlName\": \"networkInterfaceId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#AssignPrivateIpAddresses\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#AssignPrivateIpAddressesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#AssignPrivateIpAddressesResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Assigns the specified secondary private IP addresses to the specified network\\n            interface.</p>\\n         <p>You can specify specific secondary IP addresses, or you can specify the number of\\n            secondary IP addresses to be automatically assigned from the subnet's CIDR block range.\\n            The number of secondary IP addresses that you can assign to an instance varies by\\n            instance type. For more information about Elastic IP addresses, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/elastic-ip-addresses-eip.html\\\">Elastic IP\\n                Addresses</a> in the <i>Amazon EC2 User Guide</i>.</p>\\n         <p>When you move a secondary private IP address to another network interface, any Elastic\\n            IP address that is associated with the IP address is also moved.</p>\\n         <p>Remapping an IP address is an asynchronous operation. When you move an IP address from\\n            one network interface to another, check\\n                <code>network/interfaces/macs/mac/local-ipv4s</code> in the instance metadata to\\n            confirm that the remapping is complete.</p>\\n         <p>You must specify either the IP addresses or the IP address count in the\\n            request.</p>\\n         <p>You can optionally use Prefix Delegation on the network interface. You must specify\\n            either the IPv4 Prefix Delegation prefixes, or the IPv4 Prefix Delegation count. For\\n            information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-prefix-eni.html\\\"> Assigning prefixes to network\\n                interfaces</a> in the <i>Amazon EC2 User Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To assign a specific secondary private IP address to an interface\",\n                        \"documentation\": \"This example assigns the specified secondary private IP address to the specified network interface.\",\n                        \"input\": {\n                            \"NetworkInterfaceId\": \"eni-e5aa89a3\",\n                            \"PrivateIpAddresses\": [\n                                \"10.0.0.82\"\n                            ]\n                        }\n                    },\n                    {\n                        \"title\": \"To assign secondary private IP addresses that Amazon EC2 selects to an interface\",\n                        \"documentation\": \"This example assigns two secondary private IP addresses to the specified network interface. Amazon EC2 automatically assigns these IP addresses from the available IP addresses in the CIDR block range of the subnet the network interface is associated with.\",\n                        \"input\": {\n                            \"NetworkInterfaceId\": \"eni-e5aa89a3\",\n                            \"SecondaryPrivateIpAddressCount\": 2\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#AssignPrivateIpAddressesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Ipv4Prefixes\": {\n                    \"target\": \"com.amazonaws.ec2#IpPrefixList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more IPv4 prefixes assigned to the network interface. You can't use this option if you use the <code>Ipv4PrefixCount</code> option.</p>\",\n                        \"smithy.api#xmlName\": \"Ipv4Prefix\"\n                    }\n                },\n                \"Ipv4PrefixCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of IPv4 prefixes that Amazon Web Services automatically assigns to the network interface. You can't use this option if you use the <code>Ipv4 Prefixes</code> option.</p>\"\n                    }\n                },\n                \"NetworkInterfaceId\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInterfaceId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkInterfaceId\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the network interface.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"networkInterfaceId\"\n                    }\n                },\n                \"PrivateIpAddresses\": {\n                    \"target\": \"com.amazonaws.ec2#PrivateIpAddressStringList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PrivateIpAddress\",\n                        \"smithy.api#documentation\": \"<p>The IP addresses to be assigned as a secondary private IP address to the network\\n            interface. You can't specify this parameter when also specifying a number of secondary\\n            IP addresses.</p>\\n         <p>If you don't specify an IP address, Amazon EC2 automatically selects an IP address within\\n            the subnet range.</p>\",\n                        \"smithy.api#xmlName\": \"privateIpAddress\"\n                    }\n                },\n                \"SecondaryPrivateIpAddressCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SecondaryPrivateIpAddressCount\",\n                        \"smithy.api#documentation\": \"<p>The number of secondary IP addresses to assign to the network interface. You can't\\n            specify this parameter when also specifying private IP addresses.</p>\",\n                        \"smithy.api#xmlName\": \"secondaryPrivateIpAddressCount\"\n                    }\n                },\n                \"AllowReassignment\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AllowReassignment\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether to allow an IP address that is already assigned to another network\\n            interface or instance to be reassigned to the specified network interface.</p>\",\n                        \"smithy.api#xmlName\": \"allowReassignment\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the parameters for AssignPrivateIpAddresses.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#AssignPrivateIpAddressesResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NetworkInterfaceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkInterfaceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the network interface.</p>\",\n                        \"smithy.api#xmlName\": \"networkInterfaceId\"\n                    }\n                },\n                \"AssignedPrivateIpAddresses\": {\n                    \"target\": \"com.amazonaws.ec2#AssignedPrivateIpAddressList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AssignedPrivateIpAddressesSet\",\n                        \"smithy.api#documentation\": \"<p>The private IP addresses assigned to the network interface.</p>\",\n                        \"smithy.api#xmlName\": \"assignedPrivateIpAddressesSet\"\n                    }\n                },\n                \"AssignedIpv4Prefixes\": {\n                    \"target\": \"com.amazonaws.ec2#Ipv4PrefixesList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AssignedIpv4PrefixSet\",\n                        \"smithy.api#documentation\": \"<p>The IPv4 prefixes that are assigned to the network interface.</p>\",\n                        \"smithy.api#xmlName\": \"assignedIpv4PrefixSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#AssignPrivateNatGatewayAddress\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#AssignPrivateNatGatewayAddressRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#AssignPrivateNatGatewayAddressResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Assigns private IPv4 addresses to a private NAT gateway. For more information, see \\n            <a href=\\\"https://docs.aws.amazon.com/vpc/latest/userguide/nat-gateway-working-with.html\\\">Work with NAT gateways</a> in the <i>Amazon VPC User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#AssignPrivateNatGatewayAddressRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NatGatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#NatGatewayId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the NAT gateway.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"PrivateIpAddresses\": {\n                    \"target\": \"com.amazonaws.ec2#IpList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The private IPv4 addresses you want to assign to the private NAT gateway.</p>\",\n                        \"smithy.api#xmlName\": \"PrivateIpAddress\"\n                    }\n                },\n                \"PrivateIpAddressCount\": {\n                    \"target\": \"com.amazonaws.ec2#PrivateIpAddressCount\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of private IP addresses to assign to the NAT gateway. You can't specify this parameter when also specifying private IP addresses.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#AssignPrivateNatGatewayAddressResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NatGatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#NatGatewayId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NatGatewayId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the NAT gateway.</p>\",\n                        \"smithy.api#xmlName\": \"natGatewayId\"\n                    }\n                },\n                \"NatGatewayAddresses\": {\n                    \"target\": \"com.amazonaws.ec2#NatGatewayAddressList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NatGatewayAddressSet\",\n                        \"smithy.api#documentation\": \"<p>NAT gateway IP addresses.</p>\",\n                        \"smithy.api#xmlName\": \"natGatewayAddressSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#AssignedPrivateIpAddress\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PrivateIpAddress\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PrivateIpAddress\",\n                        \"smithy.api#documentation\": \"<p>The private IP address assigned to the network interface.</p>\",\n                        \"smithy.api#xmlName\": \"privateIpAddress\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the private IP addresses assigned to a network interface.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#AssignedPrivateIpAddressList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#AssignedPrivateIpAddress\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#AssociateAddress\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#AssociateAddressRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#AssociateAddressResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Associates an Elastic IP address, or carrier IP address (for instances that are in\\n      subnets in Wavelength Zones) with an instance or a network interface. Before you can use an\\n      Elastic IP address, you must allocate it to your account.</p>\\n         <p>If the Elastic IP address is already\\n      associated with a different instance, it is disassociated from that instance and associated\\n      with the specified instance. If you associate an Elastic IP address with an instance that has\\n      an existing Elastic IP address, the existing address is disassociated from the instance, but\\n      remains allocated to your account.</p>\\n         <p>[Subnets in Wavelength Zones] You can associate an IP address from the telecommunication\\n      carrier to the instance or network interface. </p>\\n         <p>You cannot associate an Elastic IP address with an interface in a different network border group.</p>\\n         <important>\\n            <p>This is an idempotent operation. If you perform the operation more than once, Amazon EC2\\n        doesn't return an error, and you may be charged for each time the Elastic IP address is\\n        remapped to the same instance. For more information, see the <i>Elastic IP\\n          Addresses</i> section of <a href=\\\"http://aws.amazon.com/ec2/pricing/\\\">Amazon EC2\\n          Pricing</a>.</p>\\n         </important>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To associate an Elastic IP address\",\n                        \"documentation\": \"This example associates the specified Elastic IP address with the specified instance.\",\n                        \"input\": {\n                            \"AllocationId\": \"eipalloc-64d5890a\",\n                            \"InstanceId\": \"i-0b263919b6498b123\"\n                        },\n                        \"output\": {\n                            \"AssociationId\": \"eipassoc-2bebb745\"\n                        }\n                    },\n                    {\n                        \"title\": \"To associate an Elastic IP address with a network interface\",\n                        \"documentation\": \"This example associates the specified Elastic IP address with the specified network interface.\",\n                        \"input\": {\n                            \"AllocationId\": \"eipalloc-64d5890a\",\n                            \"NetworkInterfaceId\": \"eni-1a2b3c4d\"\n                        },\n                        \"output\": {\n                            \"AssociationId\": \"eipassoc-2bebb745\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#AssociateAddressRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AllocationId\": {\n                    \"target\": \"com.amazonaws.ec2#AllocationId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The allocation ID. This is required.</p>\"\n                    }\n                },\n                \"InstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the instance. The instance must have exactly one attached network interface.\\n      You can specify either the instance ID or the network interface ID, but not both.</p>\"\n                    }\n                },\n                \"PublicIp\": {\n                    \"target\": \"com.amazonaws.ec2#EipAllocationPublicIp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Deprecated.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"NetworkInterfaceId\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInterfaceId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkInterfaceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the network interface. If the instance has more than one network interface, you must specify a network interface ID.</p>\\n         <p>You can specify either the instance ID or the network interface ID, but not both. </p>\",\n                        \"smithy.api#xmlName\": \"networkInterfaceId\"\n                    }\n                },\n                \"PrivateIpAddress\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PrivateIpAddress\",\n                        \"smithy.api#documentation\": \"<p>The primary or secondary private IP address to associate with the Elastic IP address. If no private IP address is specified, the Elastic IP address is associated with the primary private IP address.</p>\",\n                        \"smithy.api#xmlName\": \"privateIpAddress\"\n                    }\n                },\n                \"AllowReassociation\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AllowReassociation\",\n                        \"smithy.api#documentation\": \"<p>Reassociation is automatic, but you can specify false to ensure the operation fails if the Elastic IP address is already associated with another resource.</p>\",\n                        \"smithy.api#xmlName\": \"allowReassociation\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#AssociateAddressResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AssociationId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AssociationId\",\n                        \"smithy.api#documentation\": \"<p>The ID that represents the association of the Elastic IP address with an instance.</p>\",\n                        \"smithy.api#xmlName\": \"associationId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#AssociateCapacityReservationBillingOwner\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#AssociateCapacityReservationBillingOwnerRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#AssociateCapacityReservationBillingOwnerResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Initiates a request to assign billing of the unused capacity of a shared Capacity\\n\\t\\t\\tReservation to a consumer account that is consolidated under the same Amazon Web Services\\n\\t\\t\\torganizations payer account. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/assign-billing.html\\\">Billing assignment for shared\\n\\t\\t\\t\\t\\tAmazon EC2 Capacity Reservations</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#AssociateCapacityReservationBillingOwnerRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"CapacityReservationId\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityReservationId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the Capacity Reservation.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"UnusedReservationBillingOwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#AccountID\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the consumer account to which to assign billing.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#AssociateCapacityReservationBillingOwnerResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Return\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Return\",\n                        \"smithy.api#documentation\": \"<p>Returns <code>true</code> if the request succeeds; otherwise, it returns an error.</p>\",\n                        \"smithy.api#xmlName\": \"return\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#AssociateClientVpnTargetNetwork\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#AssociateClientVpnTargetNetworkRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#AssociateClientVpnTargetNetworkResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Associates a target network with a Client VPN endpoint. A target network is a subnet in a VPC. You can associate multiple subnets from the same VPC with a Client VPN endpoint. You can associate only one subnet in each Availability Zone. We recommend that you associate at least two subnets to provide Availability Zone redundancy.</p>\\n         <p>If you specified a VPC when you created the Client VPN endpoint or if you have previous subnet associations, the specified subnet must be in the same VPC. To specify a subnet that's in a different VPC, you must first modify the Client VPN endpoint (<a>ModifyClientVpnEndpoint</a>) and change the VPC that's associated with it.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#AssociateClientVpnTargetNetworkRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ClientVpnEndpointId\": {\n                    \"target\": \"com.amazonaws.ec2#ClientVpnEndpointId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the Client VPN endpoint.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"SubnetId\": {\n                    \"target\": \"com.amazonaws.ec2#SubnetId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the subnet to associate with the Client VPN endpoint.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Unique, case-sensitive identifier that you provide to ensure the idempotency of the request. \\nFor more information, see <a href=\\\"https://docs.aws.amazon.com/ec2/latest/devguide/ec2-api-idempotency.html\\\">Ensuring idempotency</a>.</p>\",\n                        \"smithy.api#idempotencyToken\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#AssociateClientVpnTargetNetworkResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AssociationId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AssociationId\",\n                        \"smithy.api#documentation\": \"<p>The unique ID of the target network association.</p>\",\n                        \"smithy.api#xmlName\": \"associationId\"\n                    }\n                },\n                \"Status\": {\n                    \"target\": \"com.amazonaws.ec2#AssociationStatus\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Status\",\n                        \"smithy.api#documentation\": \"<p>The current state of the target network association.</p>\",\n                        \"smithy.api#xmlName\": \"status\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#AssociateDhcpOptions\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#AssociateDhcpOptionsRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Associates a set of DHCP options (that you've previously created) with the specified VPC, or associates no DHCP options with the VPC.</p>\\n         <p>After you associate the options with the VPC, any existing instances and all new instances that you launch in that VPC use the options. You don't need to restart or relaunch the instances. They automatically pick up the changes within a few hours, depending on how frequently the instance renews its DHCP lease. You can explicitly renew the lease using the operating system on the instance.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/userguide/VPC_DHCP_Options.html\\\">DHCP option sets</a>\\n          in the <i>Amazon VPC User Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To associate a DHCP options set with a VPC\",\n                        \"documentation\": \"This example associates the specified DHCP options set with the specified VPC.\",\n                        \"input\": {\n                            \"DhcpOptionsId\": \"dopt-d9070ebb\",\n                            \"VpcId\": \"vpc-a01106c2\"\n                        }\n                    },\n                    {\n                        \"title\": \"To associate the default DHCP options set with a VPC\",\n                        \"documentation\": \"This example associates the default DHCP options set with the specified VPC.\",\n                        \"input\": {\n                            \"DhcpOptionsId\": \"default\",\n                            \"VpcId\": \"vpc-a01106c2\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#AssociateDhcpOptionsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DhcpOptionsId\": {\n                    \"target\": \"com.amazonaws.ec2#DefaultingDhcpOptionsId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the DHCP options set, or <code>default</code> to associate \\n        no DHCP options with the VPC.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"VpcId\": {\n                    \"target\": \"com.amazonaws.ec2#VpcId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the VPC.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#AssociateEnclaveCertificateIamRole\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#AssociateEnclaveCertificateIamRoleRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#AssociateEnclaveCertificateIamRoleResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Associates an Identity and Access Management (IAM) role with an Certificate Manager (ACM) certificate. \\n\\t\\t\\tThis enables the certificate to be used by the ACM for Nitro Enclaves application inside an enclave. For more \\n\\t\\t\\tinformation, see <a href=\\\"https://docs.aws.amazon.com/enclaves/latest/user/nitro-enclave-refapp.html\\\">Certificate Manager for Nitro Enclaves</a> in the <i>Amazon Web Services Nitro Enclaves \\n\\t\\t\\t\\t\\tUser Guide</i>.</p>\\n         <p>When the IAM role is associated with the ACM certificate, the certificate, certificate chain, and encrypted \\n\\t\\t\\tprivate key are placed in an Amazon S3 location that only the associated IAM role can access. The private key of the certificate \\n\\t\\t\\tis encrypted with an Amazon Web Services managed key that has an attached attestation-based key policy.</p>\\n         <p>To enable the IAM role to access the Amazon S3 object, you must grant it permission to call <code>s3:GetObject</code> \\n\\t\\t\\ton the Amazon S3 bucket returned by the command. To enable the IAM role to access the KMS key,\\n\\t\\t\\tyou must grant it permission to call <code>kms:Decrypt</code> on the KMS key returned by the command. \\n\\t\\t\\tFor more information, see <a href=\\\"https://docs.aws.amazon.com/enclaves/latest/user/nitro-enclave-refapp.html#add-policy\\\">\\n\\t\\t\\t\\tGrant the role permission to access the certificate and encryption key</a> in the \\n\\t\\t\\t<i>Amazon Web Services Nitro Enclaves User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#AssociateEnclaveCertificateIamRoleRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CertificateArn\": {\n                    \"target\": \"com.amazonaws.ec2#CertificateId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ARN of the ACM certificate with which to associate the IAM role.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"RoleArn\": {\n                    \"target\": \"com.amazonaws.ec2#RoleId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ARN of the IAM role to associate with the ACM certificate. You can associate up to 16 IAM roles with an ACM \\n\\t\\t\\tcertificate.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#AssociateEnclaveCertificateIamRoleResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CertificateS3BucketName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CertificateS3BucketName\",\n                        \"smithy.api#documentation\": \"<p>The name of the Amazon S3 bucket to which the certificate was uploaded.</p>\",\n                        \"smithy.api#xmlName\": \"certificateS3BucketName\"\n                    }\n                },\n                \"CertificateS3ObjectKey\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CertificateS3ObjectKey\",\n                        \"smithy.api#documentation\": \"<p>The Amazon S3 object key where the certificate, certificate chain, and encrypted private key bundle are stored. The \\n\\t\\t\\tobject key is formatted as follows: <code>role_arn</code>/<code>certificate_arn</code>.</p>\",\n                        \"smithy.api#xmlName\": \"certificateS3ObjectKey\"\n                    }\n                },\n                \"EncryptionKmsKeyId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EncryptionKmsKeyId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the KMS key used to encrypt the private key of the certificate.</p>\",\n                        \"smithy.api#xmlName\": \"encryptionKmsKeyId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#AssociateIamInstanceProfile\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#AssociateIamInstanceProfileRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#AssociateIamInstanceProfileResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Associates an IAM instance profile with a running or stopped instance. You cannot\\n            associate more than one IAM instance profile with an instance.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To associate an IAM instance profile with an instance\",\n                        \"documentation\": \"This example associates an IAM instance profile named admin-role with the specified instance.\",\n                        \"input\": {\n                            \"IamInstanceProfile\": {\n                                \"Name\": \"admin-role\"\n                            },\n                            \"InstanceId\": \"i-123456789abcde123\"\n                        },\n                        \"output\": {\n                            \"IamInstanceProfileAssociation\": {\n                                \"InstanceId\": \"i-123456789abcde123\",\n                                \"State\": \"associating\",\n                                \"AssociationId\": \"iip-assoc-0e7736511a163c209\",\n                                \"IamInstanceProfile\": {\n                                    \"Id\": \"AIPAJBLK7RKJKWDXVHIEC\",\n                                    \"Arn\": \"arn:aws:iam::123456789012:instance-profile/admin-role\"\n                                }\n                            }\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#AssociateIamInstanceProfileRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"IamInstanceProfile\": {\n                    \"target\": \"com.amazonaws.ec2#IamInstanceProfileSpecification\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The IAM instance profile.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"InstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the instance.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#AssociateIamInstanceProfileResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"IamInstanceProfileAssociation\": {\n                    \"target\": \"com.amazonaws.ec2#IamInstanceProfileAssociation\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IamInstanceProfileAssociation\",\n                        \"smithy.api#documentation\": \"<p>Information about the IAM instance profile association.</p>\",\n                        \"smithy.api#xmlName\": \"iamInstanceProfileAssociation\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#AssociateInstanceEventWindow\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#AssociateInstanceEventWindowRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#AssociateInstanceEventWindowResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Associates one or more targets with an event window. Only one type of target (instance\\n         IDs, Dedicated Host IDs, or tags) can be specified with an event window.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/event-windows.html\\\">Define event windows for scheduled\\n            events</a> in the <i>Amazon EC2 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#AssociateInstanceEventWindowRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"InstanceEventWindowId\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceEventWindowId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the event window.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"AssociationTarget\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceEventWindowAssociationRequest\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>One or more targets associated with the specified event window.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#AssociateInstanceEventWindowResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceEventWindow\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceEventWindow\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceEventWindow\",\n                        \"smithy.api#documentation\": \"<p>Information about the event window.</p>\",\n                        \"smithy.api#xmlName\": \"instanceEventWindow\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#AssociateIpamByoasn\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#AssociateIpamByoasnRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#AssociateIpamByoasnResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Associates your Autonomous System Number (ASN) with a BYOIP CIDR that you own in the same Amazon Web Services Region. \\n            For more information, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/ipam/tutorials-byoasn.html\\\">Tutorial: Bring your ASN to IPAM</a> in the <i>Amazon VPC IPAM guide</i>.</p>\\n         <p>After the association succeeds, the ASN is eligible for \\n            advertisement. You can view the association with <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeByoipCidrs.html\\\">DescribeByoipCidrs</a>. You can advertise the CIDR with <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_AdvertiseByoipCidr.html\\\">AdvertiseByoipCidr</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#AssociateIpamByoasnRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"Asn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>A public 2-byte or 4-byte ASN.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Cidr\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The BYOIP CIDR you want to associate with an ASN.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#AssociateIpamByoasnResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AsnAssociation\": {\n                    \"target\": \"com.amazonaws.ec2#AsnAssociation\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AsnAssociation\",\n                        \"smithy.api#documentation\": \"<p>The ASN and BYOIP CIDR association.</p>\",\n                        \"smithy.api#xmlName\": \"asnAssociation\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#AssociateIpamResourceDiscovery\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#AssociateIpamResourceDiscoveryRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#AssociateIpamResourceDiscoveryResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Associates an IPAM resource discovery with an Amazon VPC IPAM. A resource discovery is an IPAM component that enables IPAM to manage and monitor resources that belong to the owning account.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#AssociateIpamResourceDiscoveryRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A check for whether you have the required permissions for the action without actually making the request \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"IpamId\": {\n                    \"target\": \"com.amazonaws.ec2#IpamId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>An IPAM ID.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"IpamResourceDiscoveryId\": {\n                    \"target\": \"com.amazonaws.ec2#IpamResourceDiscoveryId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>A resource discovery ID.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Tag specifications.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A client token.</p>\",\n                        \"smithy.api#idempotencyToken\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#AssociateIpamResourceDiscoveryResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"IpamResourceDiscoveryAssociation\": {\n                    \"target\": \"com.amazonaws.ec2#IpamResourceDiscoveryAssociation\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpamResourceDiscoveryAssociation\",\n                        \"smithy.api#documentation\": \"<p>A resource discovery association. An associated resource discovery is a resource discovery that has been associated with an IPAM.</p>\",\n                        \"smithy.api#xmlName\": \"ipamResourceDiscoveryAssociation\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#AssociateNatGatewayAddress\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#AssociateNatGatewayAddressRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#AssociateNatGatewayAddressResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Associates Elastic IP addresses (EIPs) and private IPv4 addresses with a public NAT gateway. For more information, \\n            see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/userguide/nat-gateway-working-with.html\\\">Work with NAT gateways</a> in the <i>Amazon VPC User Guide</i>.</p>\\n         <p>By default, you can associate up to 2 Elastic IP addresses per public NAT gateway. You can increase the limit by requesting a quota adjustment. \\n            For more information, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/userguide/amazon-vpc-limits.html#vpc-limits-eips\\\">Elastic IP address quotas</a> in the <i>Amazon VPC User Guide</i>.</p>\\n         <important>\\n            <p>When you associate an EIP or secondary EIPs with a public NAT gateway, the network border group of the EIPs \\n            must match the network border group of the Availability Zone (AZ) that the public NAT gateway is in. If it's not the same, \\n            the EIP will fail to associate. You can see the network border group for the subnet's AZ by viewing the details of the subnet.\\n            Similarly, you can view the network border group of an EIP by viewing the details of the EIP address. For more information \\n            about network border groups and EIPs, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/userguide/WorkWithEIPs.html\\\">Allocate an Elastic IP address</a> in the <i>Amazon VPC User Guide</i>. \\n        </p>\\n         </important>\"\n            }\n        },\n        \"com.amazonaws.ec2#AssociateNatGatewayAddressRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NatGatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#NatGatewayId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the NAT gateway.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"AllocationIds\": {\n                    \"target\": \"com.amazonaws.ec2#AllocationIdList\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The allocation IDs of EIPs that you want to associate with your NAT gateway.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"AllocationId\"\n                    }\n                },\n                \"PrivateIpAddresses\": {\n                    \"target\": \"com.amazonaws.ec2#IpList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The private IPv4 addresses that you want to assign to the NAT gateway.</p>\",\n                        \"smithy.api#xmlName\": \"PrivateIpAddress\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#AssociateNatGatewayAddressResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NatGatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#NatGatewayId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NatGatewayId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the NAT gateway.</p>\",\n                        \"smithy.api#xmlName\": \"natGatewayId\"\n                    }\n                },\n                \"NatGatewayAddresses\": {\n                    \"target\": \"com.amazonaws.ec2#NatGatewayAddressList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NatGatewayAddressSet\",\n                        \"smithy.api#documentation\": \"<p>The IP addresses.</p>\",\n                        \"smithy.api#xmlName\": \"natGatewayAddressSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#AssociateRouteServer\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#AssociateRouteServerRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#AssociateRouteServerResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Associates a route server with a VPC to enable dynamic route updates.</p>\\n         <p>A route server association is the connection established between a route server and a VPC.</p>\\n         <p>For more information see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/userguide/dynamic-routing-route-server.html\\\">Dynamic routing in your VPC with VPC Route Server</a> in the <i>Amazon VPC User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#AssociateRouteServerRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RouteServerId\": {\n                    \"target\": \"com.amazonaws.ec2#RouteServerId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The unique identifier for the route server to be associated.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"VpcId\": {\n                    \"target\": \"com.amazonaws.ec2#VpcId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the VPC to associate with the route server.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A check for whether you have the required permissions for the action without actually making the request \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#AssociateRouteServerResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RouteServerAssociation\": {\n                    \"target\": \"com.amazonaws.ec2#RouteServerAssociation\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RouteServerAssociation\",\n                        \"smithy.api#documentation\": \"<p>Information about the association between the route server and the VPC.</p>\",\n                        \"smithy.api#xmlName\": \"routeServerAssociation\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#AssociateRouteTable\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#AssociateRouteTableRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#AssociateRouteTableResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Associates a subnet in your VPC or an internet gateway or virtual private gateway\\n            attached to your VPC with a route table in your VPC. This association causes traffic\\n            from the subnet or gateway to be routed according to the routes in the route table. The\\n            action returns an association ID, which you need in order to disassociate the route\\n            table later. A route table can be associated with multiple subnets.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Route_Tables.html\\\">Route tables</a> in the\\n                <i>Amazon VPC User Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To associate a route table with a subnet\",\n                        \"documentation\": \"This example associates the specified route table with the specified subnet.\",\n                        \"input\": {\n                            \"SubnetId\": \"subnet-9d4a7b6\",\n                            \"RouteTableId\": \"rtb-22574640\"\n                        },\n                        \"output\": {\n                            \"AssociationId\": \"rtbassoc-781d0d1a\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#AssociateRouteTableRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"GatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#RouteGatewayId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the internet gateway or virtual private gateway.</p>\"\n                    }\n                },\n                \"PublicIpv4Pool\": {\n                    \"target\": \"com.amazonaws.ec2#Ipv4PoolEc2Id\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of a public IPv4 pool. A public IPv4 pool is a pool of IPv4 addresses that you've brought to Amazon Web Services with BYOIP.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"SubnetId\": {\n                    \"target\": \"com.amazonaws.ec2#SubnetId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SubnetId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the subnet.</p>\",\n                        \"smithy.api#xmlName\": \"subnetId\"\n                    }\n                },\n                \"RouteTableId\": {\n                    \"target\": \"com.amazonaws.ec2#RouteTableId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RouteTableId\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the route table.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"routeTableId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#AssociateRouteTableResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AssociationId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AssociationId\",\n                        \"smithy.api#documentation\": \"<p>The route table association ID. This ID is required for disassociating the route\\n\\t\\t\\ttable.</p>\",\n                        \"smithy.api#xmlName\": \"associationId\"\n                    }\n                },\n                \"AssociationState\": {\n                    \"target\": \"com.amazonaws.ec2#RouteTableAssociationState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AssociationState\",\n                        \"smithy.api#documentation\": \"<p>The state of the association.</p>\",\n                        \"smithy.api#xmlName\": \"associationState\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#AssociateSecurityGroupVpc\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#AssociateSecurityGroupVpcRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#AssociateSecurityGroupVpcResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Associates a security group with another VPC in the same Region. This enables you to use the same security group with network interfaces and instances in the specified VPC.</p>\\n         <note>\\n            <ul>\\n               <li>\\n                  <p>The VPC you want to associate the security group with must be in the same Region.</p>\\n               </li>\\n               <li>\\n                  <p>You can associate the security group with another VPC if your account owns the VPC or if the VPC was shared with you.</p>\\n               </li>\\n               <li>\\n                  <p>You must own the security group.</p>\\n               </li>\\n               <li>\\n                  <p>You cannot use this feature with default security groups.</p>\\n               </li>\\n               <li>\\n                  <p>You cannot use this feature with the default VPC.</p>\\n               </li>\\n            </ul>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.ec2#AssociateSecurityGroupVpcRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"GroupId\": {\n                    \"target\": \"com.amazonaws.ec2#SecurityGroupId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>A security group ID.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"VpcId\": {\n                    \"target\": \"com.amazonaws.ec2#VpcId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>A VPC ID.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#AssociateSecurityGroupVpcResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#SecurityGroupVpcAssociationState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The state of the association.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#AssociateSubnetCidrBlock\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#AssociateSubnetCidrBlockRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#AssociateSubnetCidrBlockResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Associates a CIDR block with your subnet. You can only associate a single IPv6 CIDR\\n            block with your subnet.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#AssociateSubnetCidrBlockRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Ipv6IpamPoolId\": {\n                    \"target\": \"com.amazonaws.ec2#IpamPoolId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An IPv6 IPAM pool ID.</p>\"\n                    }\n                },\n                \"Ipv6NetmaskLength\": {\n                    \"target\": \"com.amazonaws.ec2#NetmaskLength\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An IPv6 netmask length.</p>\"\n                    }\n                },\n                \"SubnetId\": {\n                    \"target\": \"com.amazonaws.ec2#SubnetId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SubnetId\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of your subnet.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"subnetId\"\n                    }\n                },\n                \"Ipv6CidrBlock\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Ipv6CidrBlock\",\n                        \"smithy.api#documentation\": \"<p>The IPv6 CIDR block for your subnet.</p>\",\n                        \"smithy.api#xmlName\": \"ipv6CidrBlock\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#AssociateSubnetCidrBlockResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Ipv6CidrBlockAssociation\": {\n                    \"target\": \"com.amazonaws.ec2#SubnetIpv6CidrBlockAssociation\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Ipv6CidrBlockAssociation\",\n                        \"smithy.api#documentation\": \"<p>Information about the IPv6 association.</p>\",\n                        \"smithy.api#xmlName\": \"ipv6CidrBlockAssociation\"\n                    }\n                },\n                \"SubnetId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SubnetId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the subnet.</p>\",\n                        \"smithy.api#xmlName\": \"subnetId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#AssociateTransitGatewayMulticastDomain\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#AssociateTransitGatewayMulticastDomainRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#AssociateTransitGatewayMulticastDomainResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Associates the specified subnets and transit gateway attachments with the specified transit gateway multicast domain.</p>\\n         <p>The transit gateway attachment must be in the available state before you can add a resource. Use <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeTransitGatewayAttachments.html\\\">DescribeTransitGatewayAttachments</a> \\n            to see the state of the attachment.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#AssociateTransitGatewayMulticastDomainRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayMulticastDomainId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayMulticastDomainId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the transit gateway multicast domain.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TransitGatewayAttachmentId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayAttachmentId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the transit gateway attachment to associate with the transit gateway multicast domain.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"SubnetIds\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewaySubnetIdList\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The IDs of the subnets to associate with the transit gateway multicast domain.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#AssociateTransitGatewayMulticastDomainResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Associations\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayMulticastDomainAssociations\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Associations\",\n                        \"smithy.api#documentation\": \"<p>Information about the transit gateway multicast domain associations.</p>\",\n                        \"smithy.api#xmlName\": \"associations\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#AssociateTransitGatewayPolicyTable\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#AssociateTransitGatewayPolicyTableRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#AssociateTransitGatewayPolicyTableResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Associates the specified transit gateway attachment with a transit gateway policy table.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#AssociateTransitGatewayPolicyTableRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayPolicyTableId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayPolicyTableId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the transit gateway policy table to associate with the transit gateway attachment.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TransitGatewayAttachmentId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayAttachmentId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the transit gateway attachment to associate with the policy table.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#AssociateTransitGatewayPolicyTableResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Association\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayPolicyTableAssociation\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Association\",\n                        \"smithy.api#documentation\": \"<p>Describes the association of a transit gateway and a transit gateway policy table.</p>\",\n                        \"smithy.api#xmlName\": \"association\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#AssociateTransitGatewayRouteTable\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#AssociateTransitGatewayRouteTableRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#AssociateTransitGatewayRouteTableResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Associates the specified attachment with the specified transit gateway route table. You can \\n        associate only one route table with an attachment.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#AssociateTransitGatewayRouteTableRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayRouteTableId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayRouteTableId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the transit gateway route table.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TransitGatewayAttachmentId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayAttachmentId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the attachment.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#AssociateTransitGatewayRouteTableResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Association\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayAssociation\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Association\",\n                        \"smithy.api#documentation\": \"<p>The ID of the association.</p>\",\n                        \"smithy.api#xmlName\": \"association\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#AssociateTrunkInterface\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#AssociateTrunkInterfaceRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#AssociateTrunkInterfaceResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Associates a branch network interface with a trunk network interface.</p>\\n         <p>Before you create the association, use <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateNetworkInterface.html\\\">CreateNetworkInterface</a> command and set the interface type\\n            to <code>trunk</code>. You must also create a network interface for \\n            each branch network interface that you want to associate with the trunk \\n            network interface.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#AssociateTrunkInterfaceRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"BranchInterfaceId\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInterfaceId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the branch network interface.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TrunkInterfaceId\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInterfaceId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the trunk network interface.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"VlanId\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the VLAN. This applies to the VLAN protocol.</p>\"\n                    }\n                },\n                \"GreKey\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The application key. This applies to the GRE protocol.</p>\"\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Unique, case-sensitive identifier that you provide to ensure the idempotency of the\\n            request. For more information, see <a href=\\\"https://docs.aws.amazon.com/ec2/latest/devguide/ec2-api-idempotency.html\\\">Ensuring\\n                idempotency</a>.</p>\",\n                        \"smithy.api#idempotencyToken\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#AssociateTrunkInterfaceResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InterfaceAssociation\": {\n                    \"target\": \"com.amazonaws.ec2#TrunkInterfaceAssociation\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InterfaceAssociation\",\n                        \"smithy.api#documentation\": \"<p>Information about the association between the trunk network interface and branch network interface.</p>\",\n                        \"smithy.api#xmlName\": \"interfaceAssociation\"\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ClientToken\",\n                        \"smithy.api#documentation\": \"<p>Unique, case-sensitive identifier that you provide to ensure the idempotency of the\\n            request. For more information, see <a href=\\\"https://docs.aws.amazon.com/ec2/latest/devguide/ec2-api-idempotency.html\\\">Ensuring\\n                idempotency</a>.</p>\",\n                        \"smithy.api#xmlName\": \"clientToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#AssociateVpcCidrBlock\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#AssociateVpcCidrBlockRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#AssociateVpcCidrBlockResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Associates a CIDR block with your VPC. You can associate a secondary IPv4 CIDR block,\\n            an Amazon-provided IPv6 CIDR block, or an IPv6 CIDR block from an IPv6 address pool that\\n            you provisioned through bring your own IP addresses (<a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-byoip.html\\\">BYOIP</a>).</p>\\n         <p>You must specify one of the following in the request: an IPv4 CIDR block, an IPv6\\n            pool, or an Amazon-provided IPv6 CIDR block.</p>\\n         <p>For more information about associating CIDR blocks with your VPC and applicable\\n            restrictions, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/userguide/vpc-ip-addressing.html\\\">IP addressing for your VPCs and subnets</a> \\n            in the <i>Amazon VPC User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#AssociateVpcCidrBlockRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CidrBlock\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An IPv4 CIDR block to associate with the VPC.</p>\"\n                    }\n                },\n                \"Ipv6CidrBlockNetworkBorderGroup\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the location from which we advertise the IPV6 CIDR block. Use this parameter\\n      to limit the CIDR block to this location.</p>\\n         <p> You must set <code>AmazonProvidedIpv6CidrBlock</code> to <code>true</code> to use this parameter.</p>\\n         <p> You can have one IPv6 CIDR block association per network border group.</p>\"\n                    }\n                },\n                \"Ipv6Pool\": {\n                    \"target\": \"com.amazonaws.ec2#Ipv6PoolEc2Id\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of an IPv6 address pool from which to allocate the IPv6 CIDR block.</p>\"\n                    }\n                },\n                \"Ipv6CidrBlock\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An IPv6 CIDR block from the IPv6 address pool. You must also specify <code>Ipv6Pool</code> in the request.</p>\\n         <p>To let Amazon choose the IPv6 CIDR block for you, omit this parameter.</p>\"\n                    }\n                },\n                \"Ipv4IpamPoolId\": {\n                    \"target\": \"com.amazonaws.ec2#IpamPoolId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Associate a CIDR allocated from an IPv4 IPAM pool to a VPC. For more information about Amazon VPC IP Address Manager (IPAM), see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/ipam/what-is-it-ipam.html\\\">What is IPAM?</a> in the <i>Amazon VPC IPAM User Guide</i>.</p>\"\n                    }\n                },\n                \"Ipv4NetmaskLength\": {\n                    \"target\": \"com.amazonaws.ec2#NetmaskLength\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The netmask length of the IPv4 CIDR you would like to associate from an Amazon VPC IP Address Manager (IPAM) pool. For more information about IPAM, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/ipam/what-is-it-ipam.html\\\">What is IPAM?</a> in the <i>Amazon VPC IPAM User Guide</i>.\\n      </p>\"\n                    }\n                },\n                \"Ipv6IpamPoolId\": {\n                    \"target\": \"com.amazonaws.ec2#IpamPoolId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Associates a CIDR allocated from an IPv6 IPAM pool to a VPC. For more information about Amazon VPC IP Address Manager (IPAM), see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/ipam/what-is-it-ipam.html\\\">What is IPAM?</a> in the <i>Amazon VPC IPAM User Guide</i>.</p>\"\n                    }\n                },\n                \"Ipv6NetmaskLength\": {\n                    \"target\": \"com.amazonaws.ec2#NetmaskLength\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The netmask length of the IPv6 CIDR you would like to associate from an Amazon VPC IP Address Manager (IPAM) pool. For more information about IPAM, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/ipam/what-is-it-ipam.html\\\">What is IPAM?</a> in the <i>Amazon VPC IPAM User Guide</i>. </p>\"\n                    }\n                },\n                \"VpcId\": {\n                    \"target\": \"com.amazonaws.ec2#VpcId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcId\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the VPC.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"vpcId\"\n                    }\n                },\n                \"AmazonProvidedIpv6CidrBlock\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AmazonProvidedIpv6CidrBlock\",\n                        \"smithy.api#documentation\": \"<p>Requests an Amazon-provided IPv6 CIDR block with a /56 prefix length for the VPC. You\\n            cannot specify the range of IPv6 addresses or the size of the CIDR block.</p>\",\n                        \"smithy.api#xmlName\": \"amazonProvidedIpv6CidrBlock\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#AssociateVpcCidrBlockResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Ipv6CidrBlockAssociation\": {\n                    \"target\": \"com.amazonaws.ec2#VpcIpv6CidrBlockAssociation\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Ipv6CidrBlockAssociation\",\n                        \"smithy.api#documentation\": \"<p>Information about the IPv6 CIDR block association.</p>\",\n                        \"smithy.api#xmlName\": \"ipv6CidrBlockAssociation\"\n                    }\n                },\n                \"CidrBlockAssociation\": {\n                    \"target\": \"com.amazonaws.ec2#VpcCidrBlockAssociation\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CidrBlockAssociation\",\n                        \"smithy.api#documentation\": \"<p>Information about the IPv4 CIDR block association.</p>\",\n                        \"smithy.api#xmlName\": \"cidrBlockAssociation\"\n                    }\n                },\n                \"VpcId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the VPC.</p>\",\n                        \"smithy.api#xmlName\": \"vpcId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#AssociatedNetworkType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"vpc\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"vpc\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#AssociatedRole\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AssociatedRoleArn\": {\n                    \"target\": \"com.amazonaws.ec2#ResourceArn\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AssociatedRoleArn\",\n                        \"smithy.api#documentation\": \"<p>The ARN of the associated IAM role.</p>\",\n                        \"smithy.api#xmlName\": \"associatedRoleArn\"\n                    }\n                },\n                \"CertificateS3BucketName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CertificateS3BucketName\",\n                        \"smithy.api#documentation\": \"<p>The name of the Amazon S3 bucket in which the Amazon S3 object is stored.</p>\",\n                        \"smithy.api#xmlName\": \"certificateS3BucketName\"\n                    }\n                },\n                \"CertificateS3ObjectKey\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CertificateS3ObjectKey\",\n                        \"smithy.api#documentation\": \"<p>The key of the Amazon S3 object where the certificate, certificate chain, and encrypted private key bundle \\n\\t\\t\\tare stored. The object key is formatted as follows: <code>role_arn</code>/<code>certificate_arn</code>.\\n\\t\\t</p>\",\n                        \"smithy.api#xmlName\": \"certificateS3ObjectKey\"\n                    }\n                },\n                \"EncryptionKmsKeyId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EncryptionKmsKeyId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the KMS key used to encrypt the private key.</p>\",\n                        \"smithy.api#xmlName\": \"encryptionKmsKeyId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about the associated IAM roles.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#AssociatedRolesList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#AssociatedRole\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#AssociatedSubnetList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#SubnetId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#AssociatedTargetNetwork\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NetworkId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the subnet.</p>\",\n                        \"smithy.api#xmlName\": \"networkId\"\n                    }\n                },\n                \"NetworkType\": {\n                    \"target\": \"com.amazonaws.ec2#AssociatedNetworkType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkType\",\n                        \"smithy.api#documentation\": \"<p>The target network type.</p>\",\n                        \"smithy.api#xmlName\": \"networkType\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a target network that is associated with a Client VPN endpoint. A target network is a subnet in a VPC.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#AssociatedTargetNetworkSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#AssociatedTargetNetwork\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#AssociationIdList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#IamInstanceProfileAssociationId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"AssociationId\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#AssociationStatus\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Code\": {\n                    \"target\": \"com.amazonaws.ec2#AssociationStatusCode\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Code\",\n                        \"smithy.api#documentation\": \"<p>The state of the target network association.</p>\",\n                        \"smithy.api#xmlName\": \"code\"\n                    }\n                },\n                \"Message\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Message\",\n                        \"smithy.api#documentation\": \"<p>A message about the status of the target network association, if applicable.</p>\",\n                        \"smithy.api#xmlName\": \"message\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the state of a target network association.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#AssociationStatusCode\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"associating\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"associating\"\n                    }\n                },\n                \"associated\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"associated\"\n                    }\n                },\n                \"association_failed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"association-failed\"\n                    }\n                },\n                \"disassociating\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"disassociating\"\n                    }\n                },\n                \"disassociated\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"disassociated\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#AthenaIntegration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"IntegrationResultS3DestinationArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The location in Amazon S3 to store the generated CloudFormation template.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"PartitionLoadFrequency\": {\n                    \"target\": \"com.amazonaws.ec2#PartitionLoadFrequency\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The schedule for adding new partitions to the table.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"PartitionStartDate\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The start date for the partition.</p>\"\n                    }\n                },\n                \"PartitionEndDate\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The end date for the partition.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes integration options for Amazon Athena.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#AthenaIntegrationsSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#AthenaIntegration\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 10\n                }\n            }\n        },\n        \"com.amazonaws.ec2#AttachClassicLinkVpc\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#AttachClassicLinkVpcRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#AttachClassicLinkVpcResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>This action is deprecated.</p>\\n         </note>\\n         <p>Links an EC2-Classic instance to a ClassicLink-enabled VPC through one or more of the VPC\\n\\t\\t\\tsecurity groups. You cannot link an EC2-Classic instance to more than one VPC at a time. You\\n\\t\\t\\tcan only link an instance that's in the <code>running</code> state. An instance is\\n\\t\\t\\tautomatically unlinked from a VPC when it's stopped - you can link it to the VPC again when\\n\\t\\t\\tyou restart it.</p>\\n         <p>After you've linked an instance, you cannot change the VPC security groups that are associated with it. To change the security groups, you must first unlink the instance, and then link it again.</p>\\n         <p>Linking your instance to a VPC is sometimes referred to as <i>attaching</i> your instance.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#AttachClassicLinkVpcRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"InstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceId\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the EC2-Classic instance.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"instanceId\"\n                    }\n                },\n                \"VpcId\": {\n                    \"target\": \"com.amazonaws.ec2#VpcId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcId\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the ClassicLink-enabled VPC.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"vpcId\"\n                    }\n                },\n                \"Groups\": {\n                    \"target\": \"com.amazonaws.ec2#GroupIdStringList\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The IDs of the security groups. You cannot specify security groups from a different VPC.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"SecurityGroupId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#AttachClassicLinkVpcResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Return\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Return\",\n                        \"smithy.api#documentation\": \"<p>Returns <code>true</code> if the request succeeds; otherwise, it returns an error.</p>\",\n                        \"smithy.api#xmlName\": \"return\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#AttachInternetGateway\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#AttachInternetGatewayRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Attaches an internet gateway or a virtual private gateway to a VPC, enabling connectivity \\n\\t\\t        between the internet and the VPC. For more information, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Internet_Gateway.html\\\">Internet gateways</a> in the \\n\\t\\t        <i>Amazon VPC User Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To attach an Internet gateway to a VPC\",\n                        \"documentation\": \"This example attaches the specified Internet gateway to the specified VPC.\",\n                        \"input\": {\n                            \"InternetGatewayId\": \"igw-c0a643a9\",\n                            \"VpcId\": \"vpc-a01106c2\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#AttachInternetGatewayRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"InternetGatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#InternetGatewayId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InternetGatewayId\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the internet gateway.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"internetGatewayId\"\n                    }\n                },\n                \"VpcId\": {\n                    \"target\": \"com.amazonaws.ec2#VpcId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcId\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the VPC.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"vpcId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#AttachNetworkInterface\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#AttachNetworkInterfaceRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#AttachNetworkInterfaceResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Attaches a network interface to an instance.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To attach a network interface to an instance\",\n                        \"documentation\": \"This example attaches the specified network interface to the specified instance.\",\n                        \"input\": {\n                            \"NetworkInterfaceId\": \"eni-e5aa89a3\",\n                            \"InstanceId\": \"i-1234567890abcdef0\",\n                            \"DeviceIndex\": 1\n                        },\n                        \"output\": {\n                            \"AttachmentId\": \"eni-attach-66c4350a\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#AttachNetworkInterfaceRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NetworkCardIndex\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The index of the network card. Some instance types support multiple network cards. The\\n            primary network interface must be assigned to network card index 0. The default is\\n            network card index 0.</p>\"\n                    }\n                },\n                \"EnaSrdSpecification\": {\n                    \"target\": \"com.amazonaws.ec2#EnaSrdSpecification\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Configures ENA Express for the network interface that this action attaches to the\\n            instance.</p>\"\n                    }\n                },\n                \"EnaQueueCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of ENA queues to be created with the instance.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually\\n            making the request, and provides an error response. If you have the required\\n            permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is\\n                <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"NetworkInterfaceId\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInterfaceId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkInterfaceId\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the network interface.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"networkInterfaceId\"\n                    }\n                },\n                \"InstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceId\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the instance.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"instanceId\"\n                    }\n                },\n                \"DeviceIndex\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DeviceIndex\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The index of the device for the network interface attachment.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"deviceIndex\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the parameters for AttachNetworkInterface.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#AttachNetworkInterfaceResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AttachmentId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AttachmentId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the network interface attachment.</p>\",\n                        \"smithy.api#xmlName\": \"attachmentId\"\n                    }\n                },\n                \"NetworkCardIndex\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkCardIndex\",\n                        \"smithy.api#documentation\": \"<p>The index of the network card.</p>\",\n                        \"smithy.api#xmlName\": \"networkCardIndex\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the output of AttachNetworkInterface.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#AttachVerifiedAccessTrustProvider\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#AttachVerifiedAccessTrustProviderRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#AttachVerifiedAccessTrustProviderResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Attaches the specified Amazon Web Services Verified Access trust provider to the specified Amazon Web Services Verified Access instance.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#AttachVerifiedAccessTrustProviderRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VerifiedAccessInstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessInstanceId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the Verified Access instance.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"VerifiedAccessTrustProviderId\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessTrustProviderId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the Verified Access trust provider.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A unique, case-sensitive token that you provide to ensure idempotency of your\\n            modification request. For more information, see <a href=\\\"https://docs.aws.amazon.com/ec2/latest/devguide/ec2-api-idempotency.html\\\">Ensuring idempotency</a>.</p>\",\n                        \"smithy.api#idempotencyToken\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#AttachVerifiedAccessTrustProviderResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VerifiedAccessTrustProvider\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessTrustProvider\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VerifiedAccessTrustProvider\",\n                        \"smithy.api#documentation\": \"<p>Details about the Verified Access trust provider.</p>\",\n                        \"smithy.api#xmlName\": \"verifiedAccessTrustProvider\"\n                    }\n                },\n                \"VerifiedAccessInstance\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessInstance\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VerifiedAccessInstance\",\n                        \"smithy.api#documentation\": \"<p>Details about the Verified Access instance.</p>\",\n                        \"smithy.api#xmlName\": \"verifiedAccessInstance\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#AttachVolume\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#AttachVolumeRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#VolumeAttachment\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Attaches an Amazon EBS volume to a <code>running</code> or <code>stopped</code> \\n      instance, and exposes it to the instance with the specified device name.</p>\\n         <note>\\n            <p>The maximum number of Amazon EBS volumes that you can attach to an instance depends on the \\n        instance type. If you exceed the volume attachment limit for an instance type, the attachment \\n        request fails with the <code>AttachmentLimitExceeded</code> error. For more information, \\n        see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/volume_limits.html\\\">Instance \\n          volume limits</a>.</p>\\n         </note>\\n         <p>After you attach an EBS volume, you must make it available for use. For more information, \\n      see <a href=\\\"https://docs.aws.amazon.com/ebs/latest/userguide/ebs-using-volumes.html\\\">Make an \\n        EBS volume available for use</a>.</p>\\n         <p>If a volume has an Amazon Web Services Marketplace product code:</p>\\n         <ul>\\n            <li>\\n               <p>The volume can be attached only to a stopped instance.</p>\\n            </li>\\n            <li>\\n               <p>Amazon Web Services Marketplace product codes are copied from the volume to the instance.</p>\\n            </li>\\n            <li>\\n               <p>You must be subscribed to the product.</p>\\n            </li>\\n            <li>\\n               <p>The instance type and operating system of the instance must support the product. For\\n          example, you can't detach a volume from a Windows instance and attach it to a Linux\\n          instance.</p>\\n            </li>\\n         </ul>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/ebs/latest/userguide/ebs-attaching-volume.html\\\">Attach an Amazon EBS volume to an instance</a> in the\\n        <i>Amazon EBS User Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To attach a volume to an instance\",\n                        \"documentation\": \"This example attaches a volume (``vol-1234567890abcdef0``) to an instance (``i-01474ef662b89480``) as ``/dev/sdf``.\",\n                        \"input\": {\n                            \"VolumeId\": \"vol-1234567890abcdef0\",\n                            \"InstanceId\": \"i-01474ef662b89480\",\n                            \"Device\": \"/dev/sdf\"\n                        },\n                        \"output\": {\n                            \"AttachTime\": \"2016-08-29T18:52:32.724Z\",\n                            \"InstanceId\": \"i-01474ef662b89480\",\n                            \"VolumeId\": \"vol-1234567890abcdef0\",\n                            \"State\": \"attaching\",\n                            \"Device\": \"/dev/sdf\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#AttachVolumeRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Device\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The device name (for example, <code>/dev/sdh</code> or <code>xvdh</code>).</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"InstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the instance.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"VolumeId\": {\n                    \"target\": \"com.amazonaws.ec2#VolumeId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the EBS volume. The volume and instance must be within the same Availability\\n      Zone.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#AttachVpnGateway\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#AttachVpnGatewayRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#AttachVpnGatewayResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Attaches an available virtual private gateway to a VPC. You can attach one virtual private\\n            gateway to one VPC at a time.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/vpn/latest/s2svpn/VPC_VPN.html\\\">Amazon Web Services Site-to-Site VPN</a> in the <i>Amazon Web Services Site-to-Site VPN\\n                User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#AttachVpnGatewayRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VpcId\": {\n                    \"target\": \"com.amazonaws.ec2#VpcId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the VPC.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"VpnGatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#VpnGatewayId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the virtual private gateway.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually\\n            making the request, and provides an error response. If you have the required\\n            permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is\\n                <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the parameters for AttachVpnGateway.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#AttachVpnGatewayResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VpcAttachment\": {\n                    \"target\": \"com.amazonaws.ec2#VpcAttachment\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Attachment\",\n                        \"smithy.api#documentation\": \"<p>Information about the attachment.</p>\",\n                        \"smithy.api#xmlName\": \"attachment\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the output of AttachVpnGateway.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#AttachmentEnaSrdSpecification\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"EnaSrdEnabled\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EnaSrdEnabled\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether ENA Express is enabled for the network interface.</p>\",\n                        \"smithy.api#xmlName\": \"enaSrdEnabled\"\n                    }\n                },\n                \"EnaSrdUdpSpecification\": {\n                    \"target\": \"com.amazonaws.ec2#AttachmentEnaSrdUdpSpecification\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EnaSrdUdpSpecification\",\n                        \"smithy.api#documentation\": \"<p>Configures ENA Express for UDP network traffic.</p>\",\n                        \"smithy.api#xmlName\": \"enaSrdUdpSpecification\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>ENA Express uses Amazon Web Services Scalable Reliable Datagram (SRD) technology to increase the \\n\\t\\t\\tmaximum bandwidth used per stream and minimize tail latency of network traffic between EC2 instances. \\n\\t\\t\\tWith ENA Express, you can communicate between two EC2 instances in the same subnet within the same \\n\\t\\t\\taccount, or in different accounts. Both sending and receiving instances must have ENA Express enabled.</p>\\n         <p>To improve the reliability of network packet delivery, ENA Express reorders network packets on the \\n\\t\\t\\treceiving end by default. However, some UDP-based applications are designed to handle network packets \\n\\t\\t\\tthat are out of order to reduce the overhead for packet delivery at the network layer. When ENA Express \\n\\t\\t\\tis enabled, you can specify whether UDP network traffic uses it.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#AttachmentEnaSrdUdpSpecification\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"EnaSrdUdpEnabled\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EnaSrdUdpEnabled\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether UDP traffic to and from the instance uses ENA Express. To specify this setting, \\n\\t\\t\\tyou must first enable ENA Express.</p>\",\n                        \"smithy.api#xmlName\": \"enaSrdUdpEnabled\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>ENA Express is compatible with both TCP and UDP transport protocols. When it's enabled, TCP traffic \\n\\t\\t\\tautomatically uses it. However, some UDP-based applications are designed to handle network packets that are \\n\\t\\t\\tout of order, without a need for retransmission, such as live video broadcasting or other near-real-time \\n\\t\\t\\tapplications. For UDP traffic, you can specify whether to use ENA Express, based on your application \\n\\t\\t\\tenvironment needs.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#AttachmentLimitType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"SHARED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"shared\"\n                    }\n                },\n                \"DEDICATED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"dedicated\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#AttachmentStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"attaching\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"attaching\"\n                    }\n                },\n                \"attached\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"attached\"\n                    }\n                },\n                \"detaching\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"detaching\"\n                    }\n                },\n                \"detached\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"detached\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#AttributeBooleanValue\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Value\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Value\",\n                        \"smithy.api#documentation\": \"<p>The attribute value. The valid values are <code>true</code> or <code>false</code>.</p>\",\n                        \"smithy.api#xmlName\": \"value\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a value for a resource attribute that is a Boolean value.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#AttributeSummary\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AttributeName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AttributeName\",\n                        \"smithy.api#documentation\": \"<p>The name of the attribute.</p>\",\n                        \"smithy.api#xmlName\": \"attributeName\"\n                    }\n                },\n                \"MostFrequentValue\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MostFrequentValue\",\n                        \"smithy.api#documentation\": \"<p>The configuration value that is most frequently observed for the attribute.</p>\",\n                        \"smithy.api#xmlName\": \"mostFrequentValue\"\n                    }\n                },\n                \"NumberOfMatchedAccounts\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NumberOfMatchedAccounts\",\n                        \"smithy.api#documentation\": \"<p>The number of accounts with the same configuration value for the attribute that is\\n            most frequently observed.</p>\",\n                        \"smithy.api#xmlName\": \"numberOfMatchedAccounts\"\n                    }\n                },\n                \"NumberOfUnmatchedAccounts\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NumberOfUnmatchedAccounts\",\n                        \"smithy.api#documentation\": \"<p>The number of accounts with a configuration value different from the most frequently\\n            observed value for the attribute.</p>\",\n                        \"smithy.api#xmlName\": \"numberOfUnmatchedAccounts\"\n                    }\n                },\n                \"RegionalSummaries\": {\n                    \"target\": \"com.amazonaws.ec2#RegionalSummaryList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RegionalSummarySet\",\n                        \"smithy.api#documentation\": \"<p>The summary report for each Region for the attribute.</p>\",\n                        \"smithy.api#xmlName\": \"regionalSummarySet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A summary report for the attribute across all Regions.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#AttributeSummaryList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#AttributeSummary\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#AttributeValue\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Value\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Value\",\n                        \"smithy.api#documentation\": \"<p>The attribute value. The value is case-sensitive.</p>\",\n                        \"smithy.api#xmlName\": \"value\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a value for a resource attribute that is a String.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#AuthorizationRule\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ClientVpnEndpointId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ClientVpnEndpointId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Client VPN endpoint with which the authorization rule is associated.</p>\",\n                        \"smithy.api#xmlName\": \"clientVpnEndpointId\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Description\",\n                        \"smithy.api#documentation\": \"<p>A brief description of the authorization rule.</p>\",\n                        \"smithy.api#xmlName\": \"description\"\n                    }\n                },\n                \"GroupId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"GroupId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Active Directory group to which the authorization rule grants access.</p>\",\n                        \"smithy.api#xmlName\": \"groupId\"\n                    }\n                },\n                \"AccessAll\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AccessAll\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether the authorization rule grants access to all clients.</p>\",\n                        \"smithy.api#xmlName\": \"accessAll\"\n                    }\n                },\n                \"DestinationCidr\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DestinationCidr\",\n                        \"smithy.api#documentation\": \"<p>The IPv4 address range, in CIDR notation, of the network to which the authorization rule applies.</p>\",\n                        \"smithy.api#xmlName\": \"destinationCidr\"\n                    }\n                },\n                \"Status\": {\n                    \"target\": \"com.amazonaws.ec2#ClientVpnAuthorizationRuleStatus\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Status\",\n                        \"smithy.api#documentation\": \"<p>The current state of the authorization rule.</p>\",\n                        \"smithy.api#xmlName\": \"status\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about an authorization rule.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#AuthorizationRuleSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#AuthorizationRule\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#AuthorizeClientVpnIngress\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#AuthorizeClientVpnIngressRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#AuthorizeClientVpnIngressResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Adds an ingress authorization rule to a Client VPN endpoint. Ingress authorization rules act as \\n\\t\\t\\tfirewall rules that grant access to networks. You must configure ingress authorization rules to \\n\\t\\t\\tenable clients to access resources in Amazon Web Services or on-premises networks.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#AuthorizeClientVpnIngressRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ClientVpnEndpointId\": {\n                    \"target\": \"com.amazonaws.ec2#ClientVpnEndpointId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the Client VPN endpoint.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TargetNetworkCidr\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The IPv4 address range, in CIDR notation, of the network for which access is being authorized.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"AccessGroupId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the group to grant access to, for example, the Active Directory group or identity provider (IdP) group. Required if <code>AuthorizeAllGroups</code> is <code>false</code> or not specified.</p>\"\n                    }\n                },\n                \"AuthorizeAllGroups\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether to grant access to all clients. Specify <code>true</code> to grant all\\n            clients who successfully establish a VPN connection access to the network. Must be set\\n            to <code>true</code> if <code>AccessGroupId</code> is not specified.</p>\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A brief description of the authorization rule.</p>\"\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Unique, case-sensitive identifier that you provide to ensure the idempotency of the request. \\nFor more information, see <a href=\\\"https://docs.aws.amazon.com/ec2/latest/devguide/ec2-api-idempotency.html\\\">Ensuring idempotency</a>.</p>\",\n                        \"smithy.api#idempotencyToken\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#AuthorizeClientVpnIngressResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Status\": {\n                    \"target\": \"com.amazonaws.ec2#ClientVpnAuthorizationRuleStatus\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Status\",\n                        \"smithy.api#documentation\": \"<p>The current state of the authorization rule.</p>\",\n                        \"smithy.api#xmlName\": \"status\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#AuthorizeSecurityGroupEgress\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#AuthorizeSecurityGroupEgressRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#AuthorizeSecurityGroupEgressResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Adds the specified outbound (egress) rules to a security group.</p>\\n         <p>An outbound rule permits instances to send traffic to the specified IPv4 or IPv6 \\n       address ranges, the IP address ranges specified by a prefix list, or the instances \\n       that are associated with a source security group. For more information, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/userguide/security-group-rules.html\\\">Security group rules</a>.</p>\\n         <p>You must specify exactly one of the following destinations: an IPv4 or IPv6 address range, \\n       a prefix list, or a security group. You must specify a protocol for each rule (for example, TCP). \\n       If the protocol is TCP or UDP, you must also specify a port or port range. If the protocol is \\n       ICMP or ICMPv6, you must also specify the ICMP type and code.</p>\\n         <p>Rule changes are propagated to instances associated with the security group as quickly \\n         as possible. However, a small delay might occur.</p>\\n         <p>For examples of rules that you can add to security groups for specific access scenarios, \\n         see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/security-group-rules-reference.html\\\">Security group rules for different use cases</a> in the <i>Amazon EC2 User Guide</i>.</p>\\n         <p>For information about security group quotas, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/userguide/amazon-vpc-limits.html\\\">Amazon VPC quotas</a> in the <i>Amazon VPC User Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To add a rule that allows outbound traffic to a specific address range\",\n                        \"documentation\": \"This example adds a rule that grants access to the specified address ranges on TCP port 80.\",\n                        \"input\": {\n                            \"GroupId\": \"sg-1a2b3c4d\",\n                            \"IpPermissions\": [\n                                {\n                                    \"IpProtocol\": \"tcp\",\n                                    \"FromPort\": 80,\n                                    \"ToPort\": 80,\n                                    \"IpRanges\": [\n                                        {\n                                            \"CidrIp\": \"10.0.0.0/16\"\n                                        }\n                                    ]\n                                }\n                            ]\n                        },\n                        \"output\": {}\n                    },\n                    {\n                        \"title\": \"To add a rule that allows outbound traffic to a specific security group\",\n                        \"documentation\": \"This example adds a rule that grants access to the specified security group on TCP port 80.\",\n                        \"input\": {\n                            \"GroupId\": \"sg-1a2b3c4d\",\n                            \"IpPermissions\": [\n                                {\n                                    \"IpProtocol\": \"tcp\",\n                                    \"FromPort\": 80,\n                                    \"ToPort\": 80,\n                                    \"UserIdGroupPairs\": [\n                                        {\n                                            \"GroupId\": \"sg-4b51a32f\"\n                                        }\n                                    ]\n                                }\n                            ]\n                        },\n                        \"output\": {}\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#AuthorizeSecurityGroupEgressRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags applied to the security group rule.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"GroupId\": {\n                    \"target\": \"com.amazonaws.ec2#SecurityGroupId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"GroupId\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the security group.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"groupId\"\n                    }\n                },\n                \"SourceSecurityGroupName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SourceSecurityGroupName\",\n                        \"smithy.api#documentation\": \"<p>Not supported. Use IP permissions instead.</p>\",\n                        \"smithy.api#xmlName\": \"sourceSecurityGroupName\"\n                    }\n                },\n                \"SourceSecurityGroupOwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SourceSecurityGroupOwnerId\",\n                        \"smithy.api#documentation\": \"<p>Not supported. Use IP permissions instead.</p>\",\n                        \"smithy.api#xmlName\": \"sourceSecurityGroupOwnerId\"\n                    }\n                },\n                \"IpProtocol\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpProtocol\",\n                        \"smithy.api#documentation\": \"<p>Not supported. Use IP permissions instead.</p>\",\n                        \"smithy.api#xmlName\": \"ipProtocol\"\n                    }\n                },\n                \"FromPort\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"FromPort\",\n                        \"smithy.api#documentation\": \"<p>Not supported. Use IP permissions instead.</p>\",\n                        \"smithy.api#xmlName\": \"fromPort\"\n                    }\n                },\n                \"ToPort\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ToPort\",\n                        \"smithy.api#documentation\": \"<p>Not supported. Use IP permissions instead.</p>\",\n                        \"smithy.api#xmlName\": \"toPort\"\n                    }\n                },\n                \"CidrIp\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CidrIp\",\n                        \"smithy.api#documentation\": \"<p>Not supported. Use IP permissions instead.</p>\",\n                        \"smithy.api#xmlName\": \"cidrIp\"\n                    }\n                },\n                \"IpPermissions\": {\n                    \"target\": \"com.amazonaws.ec2#IpPermissionList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpPermissions\",\n                        \"smithy.api#documentation\": \"<p>The permissions for the security group rules.</p>\",\n                        \"smithy.api#xmlName\": \"ipPermissions\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#AuthorizeSecurityGroupEgressResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Return\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Return\",\n                        \"smithy.api#documentation\": \"<p>Returns <code>true</code> if the request succeeds; otherwise, returns an error.</p>\",\n                        \"smithy.api#xmlName\": \"return\"\n                    }\n                },\n                \"SecurityGroupRules\": {\n                    \"target\": \"com.amazonaws.ec2#SecurityGroupRuleList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SecurityGroupRuleSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the outbound (egress) security group rules that were added.</p>\",\n                        \"smithy.api#xmlName\": \"securityGroupRuleSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#AuthorizeSecurityGroupIngress\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#AuthorizeSecurityGroupIngressRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#AuthorizeSecurityGroupIngressResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Adds the specified inbound (ingress) rules to a security group.</p>\\n         <p>An inbound rule permits instances to receive traffic from the specified IPv4 or IPv6 \\n       address range, the IP address ranges that are specified by a prefix list, or the instances \\n       that are associated with a destination security group. For more information, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/userguide/security-group-rules.html\\\">Security group rules</a>.</p>\\n         <p>You must specify exactly one of the following sources: an IPv4 or IPv6 address range,\\n       a prefix list, or a security group. You must specify a protocol for each rule (for example, TCP). \\n       If the protocol is TCP or UDP, you must also specify a port or port range. If the protocol is \\n       ICMP or ICMPv6, you must also specify the ICMP/ICMPv6 type and code.</p>\\n         <p>Rule changes are propagated to instances associated with the security group as quickly \\n       as possible. However, a small delay might occur.</p>\\n         <p>For examples of rules that you can add to security groups for specific access scenarios, \\n       see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/security-group-rules-reference.html\\\">Security group rules for different use cases</a> in the <i>Amazon EC2 User Guide</i>.</p>\\n         <p>For more information about security group quotas, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/userguide/amazon-vpc-limits.html\\\">Amazon VPC quotas</a> in the <i>Amazon VPC User Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To add a rule that allows inbound HTTP traffic from another security group\",\n                        \"documentation\": \"This example enables inbound traffic on TCP port 80 from the specified security group. The group must be in the same VPC or a peer VPC. Incoming traffic is allowed based on the private IP addresses of instances that are associated with the specified security group.\",\n                        \"input\": {\n                            \"GroupId\": \"sg-111aaa22\",\n                            \"IpPermissions\": [\n                                {\n                                    \"IpProtocol\": \"tcp\",\n                                    \"FromPort\": 80,\n                                    \"ToPort\": 80,\n                                    \"UserIdGroupPairs\": [\n                                        {\n                                            \"GroupId\": \"sg-1a2b3c4d\",\n                                            \"Description\": \"HTTP access from other instances\"\n                                        }\n                                    ]\n                                }\n                            ]\n                        },\n                        \"output\": {}\n                    },\n                    {\n                        \"title\": \"To add a rule that allows inbound SSH traffic from an IPv4 address range\",\n                        \"documentation\": \"This example enables inbound traffic on TCP port 22 (SSH). The rule includes a description to help you identify it later.\",\n                        \"input\": {\n                            \"GroupId\": \"sg-903004f8\",\n                            \"IpPermissions\": [\n                                {\n                                    \"IpProtocol\": \"tcp\",\n                                    \"FromPort\": 22,\n                                    \"ToPort\": 22,\n                                    \"IpRanges\": [\n                                        {\n                                            \"CidrIp\": \"203.0.113.0/24\",\n                                            \"Description\": \"SSH access from the LA office\"\n                                        }\n                                    ]\n                                }\n                            ]\n                        },\n                        \"output\": {}\n                    },\n                    {\n                        \"title\": \"To add a rule that allows inbound RDP traffic from an IPv6 address range\",\n                        \"documentation\": \"This example adds an inbound rule that allows RDP traffic from the specified IPv6 address range. The rule includes a description to help you identify it later.\",\n                        \"input\": {\n                            \"GroupId\": \"sg-123abc12 \",\n                            \"IpPermissions\": [\n                                {\n                                    \"IpProtocol\": \"tcp\",\n                                    \"FromPort\": 3389,\n                                    \"ToPort\": 3389,\n                                    \"Ipv6Ranges\": [\n                                        {\n                                            \"CidrIpv6\": \"2001:db8:1234:1a00::/64\",\n                                            \"Description\": \"RDP access from the NY office\"\n                                        }\n                                    ]\n                                }\n                            ]\n                        },\n                        \"output\": {}\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#AuthorizeSecurityGroupIngressRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CidrIp\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IPv4 address range, in CIDR format.</p>\\n         <note>\\n            <p>\\n               Amazon Web Services <a href=\\\"https://en.wikipedia.org/wiki/Canonicalization\\\">canonicalizes</a> IPv4 and IPv6 CIDRs. For example, if you specify 100.68.0.18/18 for the CIDR block, \\n              Amazon Web Services canonicalizes the CIDR block to 100.68.0.0/18. Any subsequent DescribeSecurityGroups and DescribeSecurityGroupRules calls will \\n              return the canonicalized form of the CIDR block. Additionally, if you attempt to add another rule with the \\n              non-canonical form of the CIDR (such as 100.68.0.18/18) and there is already a rule for the canonicalized \\n              form of the CIDR block (such as 100.68.0.0/18), the API throws an duplicate rule error.</p>\\n         </note>\\n         <p>To specify an IPv6 address range, use IP permissions instead.</p>\\n         <p>To specify multiple rules and descriptions for the rules, use IP permissions instead.</p>\"\n                    }\n                },\n                \"FromPort\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If the protocol is TCP or UDP, this is the start of the port range.\\n           If the protocol is ICMP, this is the ICMP type or -1 (all ICMP types).</p>\\n         <p>To specify multiple rules and descriptions for the rules, use IP permissions instead.</p>\"\n                    }\n                },\n                \"GroupId\": {\n                    \"target\": \"com.amazonaws.ec2#SecurityGroupId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the security group.</p>\"\n                    }\n                },\n                \"GroupName\": {\n                    \"target\": \"com.amazonaws.ec2#SecurityGroupName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>[Default VPC] The name of the security group. For security groups for a default VPC\\n         you can specify either the ID or the name of the security group. For security groups for\\n         a nondefault VPC, you must specify the ID of the security group.</p>\"\n                    }\n                },\n                \"IpPermissions\": {\n                    \"target\": \"com.amazonaws.ec2#IpPermissionList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The permissions for the security group rules.</p>\"\n                    }\n                },\n                \"IpProtocol\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IP protocol name (<code>tcp</code>, <code>udp</code>, <code>icmp</code>) or number\\n      (see <a href=\\\"http://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml\\\">Protocol Numbers</a>). To specify all protocols, use <code>-1</code>.</p>\\n         <p>To specify <code>icmpv6</code>, use IP permissions instead.</p>\\n         <p>If you specify a protocol other than one of the supported values, traffic is allowed \\n         on all ports, regardless of any ports that you specify.</p>\\n         <p>To specify multiple rules and descriptions for the rules, use IP permissions instead.</p>\"\n                    }\n                },\n                \"SourceSecurityGroupName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>[Default VPC] The name of the source security group.</p>\\n         <p>The rule grants full ICMP, UDP, and TCP access. To create a rule with a specific protocol\\n             and port range, specify a set of IP permissions instead.</p>\"\n                    }\n                },\n                \"SourceSecurityGroupOwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID for the source security group, if the source security group is \\n         in a different account.</p>\\n         <p>The rule grants full ICMP, UDP, and TCP access. To create a rule with a specific protocol \\n         and port range, use IP permissions instead.</p>\"\n                    }\n                },\n                \"ToPort\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If the protocol is TCP or UDP, this is the end of the port range.\\n           If the protocol is ICMP, this is the ICMP code or -1 (all ICMP codes). \\n           If the start port is -1 (all ICMP types), then the end port must be -1 (all ICMP codes).</p>\\n         <p>To specify multiple rules and descriptions for the rules, use IP permissions instead.</p>\"\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags applied to the security group rule.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#AuthorizeSecurityGroupIngressResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Return\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Return\",\n                        \"smithy.api#documentation\": \"<p>Returns <code>true</code> if the request succeeds; otherwise, returns an error.</p>\",\n                        \"smithy.api#xmlName\": \"return\"\n                    }\n                },\n                \"SecurityGroupRules\": {\n                    \"target\": \"com.amazonaws.ec2#SecurityGroupRuleList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SecurityGroupRuleSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the inbound (ingress) security group rules that were added.</p>\",\n                        \"smithy.api#xmlName\": \"securityGroupRuleSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#AutoAcceptSharedAssociationsValue\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"enable\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"enable\"\n                    }\n                },\n                \"disable\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"disable\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#AutoAcceptSharedAttachmentsValue\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"enable\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"enable\"\n                    }\n                },\n                \"disable\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"disable\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#AutoPlacement\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"on\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"on\"\n                    }\n                },\n                \"off\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"off\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#AutoRecoveryFlag\": {\n            \"type\": \"boolean\"\n        },\n        \"com.amazonaws.ec2#AvailabilityZone\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"OptInStatus\": {\n                    \"target\": \"com.amazonaws.ec2#AvailabilityZoneOptInStatus\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OptInStatus\",\n                        \"smithy.api#documentation\": \"<p>For Availability Zones, this parameter always has the value of\\n        <code>opt-in-not-required</code>.</p>\\n         <p>For Local Zones and Wavelength Zones, this parameter is the opt-in status. The possible\\n      values are <code>opted-in</code> and <code>not-opted-in</code>.</p>\",\n                        \"smithy.api#xmlName\": \"optInStatus\"\n                    }\n                },\n                \"Messages\": {\n                    \"target\": \"com.amazonaws.ec2#AvailabilityZoneMessageList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MessageSet\",\n                        \"smithy.api#documentation\": \"<p>Any messages about the Availability Zone, Local Zone, or Wavelength Zone.</p>\",\n                        \"smithy.api#xmlName\": \"messageSet\"\n                    }\n                },\n                \"RegionName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RegionName\",\n                        \"smithy.api#documentation\": \"<p>The name of the Region.</p>\",\n                        \"smithy.api#xmlName\": \"regionName\"\n                    }\n                },\n                \"ZoneName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ZoneName\",\n                        \"smithy.api#documentation\": \"<p>The name of the Availability Zone, Local Zone, or Wavelength Zone.</p>\",\n                        \"smithy.api#xmlName\": \"zoneName\"\n                    }\n                },\n                \"ZoneId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ZoneId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Availability Zone, Local Zone, or Wavelength Zone.</p>\",\n                        \"smithy.api#xmlName\": \"zoneId\"\n                    }\n                },\n                \"GroupName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"GroupName\",\n                        \"smithy.api#documentation\": \"<p>The name of the zone group. For example:</p>\\n         <ul>\\n            <li>\\n               <p>Availability Zones - <code>us-east-1-zg-1</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Local Zones - <code>us-west-2-lax-1</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Wavelength Zones - <code>us-east-1-wl1-bos-wlz-1</code>\\n               </p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"groupName\"\n                    }\n                },\n                \"NetworkBorderGroup\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkBorderGroup\",\n                        \"smithy.api#documentation\": \"<p>The name of the network border group.</p>\",\n                        \"smithy.api#xmlName\": \"networkBorderGroup\"\n                    }\n                },\n                \"ZoneType\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ZoneType\",\n                        \"smithy.api#documentation\": \"<p>The type of zone.</p>\\n         <p>Valid values: <code>availability-zone</code> | <code>local-zone</code> |\\n        <code>wavelength-zone</code>\\n         </p>\",\n                        \"smithy.api#xmlName\": \"zoneType\"\n                    }\n                },\n                \"ParentZoneName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ParentZoneName\",\n                        \"smithy.api#documentation\": \"<p>The name of the zone that handles some of the Local Zone or Wavelength Zone control plane\\n      operations, such as API calls.</p>\",\n                        \"smithy.api#xmlName\": \"parentZoneName\"\n                    }\n                },\n                \"ParentZoneId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ParentZoneId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the zone that handles some of the Local Zone or Wavelength Zone control plane\\n      operations, such as API calls.</p>\",\n                        \"smithy.api#xmlName\": \"parentZoneId\"\n                    }\n                },\n                \"GroupLongName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"GroupLongName\",\n                        \"smithy.api#documentation\": \"<p>The long name of the Availability Zone group, Local Zone group, or Wavelength Zone\\n      group.</p>\",\n                        \"smithy.api#xmlName\": \"groupLongName\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#AvailabilityZoneState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ZoneState\",\n                        \"smithy.api#documentation\": \"<p>The state of the Availability Zone, Local Zone, or Wavelength Zone. The possible values are\\n        <code>available</code>, <code>unavailable</code>, and <code>constrained</code>.</p>\",\n                        \"smithy.api#xmlName\": \"zoneState\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes Availability Zones, Local Zones, and Wavelength Zones.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#AvailabilityZoneId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#AvailabilityZoneList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#AvailabilityZone\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#AvailabilityZoneMessage\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Message\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Message\",\n                        \"smithy.api#documentation\": \"<p>The message about the Availability Zone, Local Zone, or Wavelength Zone.</p>\",\n                        \"smithy.api#xmlName\": \"message\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a message about an Availability Zone, Local Zone, or Wavelength Zone.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#AvailabilityZoneMessageList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#AvailabilityZoneMessage\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#AvailabilityZoneName\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#AvailabilityZoneOptInStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"opt_in_not_required\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"opt-in-not-required\"\n                    }\n                },\n                \"opted_in\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"opted-in\"\n                    }\n                },\n                \"not_opted_in\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"not-opted-in\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#AvailabilityZoneState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"available\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"available\"\n                    }\n                },\n                \"information\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"information\"\n                    }\n                },\n                \"impaired\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"impaired\"\n                    }\n                },\n                \"unavailable\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"unavailable\"\n                    }\n                },\n                \"constrained\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"constrained\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#AvailabilityZoneStringList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#String\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"AvailabilityZone\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#AvailableCapacity\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AvailableInstanceCapacity\": {\n                    \"target\": \"com.amazonaws.ec2#AvailableInstanceCapacityList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AvailableInstanceCapacity\",\n                        \"smithy.api#documentation\": \"<p>The number of instances that can be launched onto the Dedicated Host depending on the\\n            host's available capacity. For Dedicated Hosts that support multiple instance types,\\n            this parameter represents the number of instances for each instance size that is\\n            supported on the host.</p>\",\n                        \"smithy.api#xmlName\": \"availableInstanceCapacity\"\n                    }\n                },\n                \"AvailableVCpus\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AvailableVCpus\",\n                        \"smithy.api#documentation\": \"<p>The number of vCPUs available for launching instances onto the Dedicated Host.</p>\",\n                        \"smithy.api#xmlName\": \"availableVCpus\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The capacity information for instances that can be launched onto the Dedicated Host.\\n        </p>\"\n            }\n        },\n        \"com.amazonaws.ec2#AvailableInstanceCapacityList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#InstanceCapacity\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#BandwidthWeightingType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"DEFAULT\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"default\"\n                    }\n                },\n                \"VPC_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"vpc-1\"\n                    }\n                },\n                \"EBS_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ebs-1\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#BandwidthWeightingTypeList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#BandwidthWeightingType\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#BareMetal\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"INCLUDED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"included\"\n                    }\n                },\n                \"REQUIRED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"required\"\n                    }\n                },\n                \"EXCLUDED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"excluded\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#BareMetalFlag\": {\n            \"type\": \"boolean\"\n        },\n        \"com.amazonaws.ec2#BaselineBandwidthInGbps\": {\n            \"type\": \"double\"\n        },\n        \"com.amazonaws.ec2#BaselineBandwidthInMbps\": {\n            \"type\": \"integer\"\n        },\n        \"com.amazonaws.ec2#BaselineEbsBandwidthMbps\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Min\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Min\",\n                        \"smithy.api#documentation\": \"<p>The minimum baseline bandwidth, in Mbps. If this parameter is not specified, there is no\\n         minimum limit.</p>\",\n                        \"smithy.api#xmlName\": \"min\"\n                    }\n                },\n                \"Max\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Max\",\n                        \"smithy.api#documentation\": \"<p>The maximum baseline bandwidth, in Mbps. If this parameter is not specified, there is no\\n         maximum limit.</p>\",\n                        \"smithy.api#xmlName\": \"max\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The minimum and maximum baseline bandwidth to Amazon EBS, in Mbps. For more information, see\\n            <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-optimized.html\\\">Amazon\\n            EBS–optimized instances</a> in the <i>Amazon EC2 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#BaselineEbsBandwidthMbpsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Min\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The minimum baseline bandwidth, in Mbps. To specify no minimum limit, omit\\n         this parameter.</p>\"\n                    }\n                },\n                \"Max\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum baseline bandwidth, in Mbps. To specify no maximum limit, omit\\n         this parameter.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The minimum and maximum baseline bandwidth to Amazon EBS, in Mbps. For more information, see\\n            <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-optimized.html\\\">Amazon\\n            EBS–optimized instances</a> in the <i>Amazon EC2 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#BaselineIops\": {\n            \"type\": \"integer\"\n        },\n        \"com.amazonaws.ec2#BaselinePerformanceFactors\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Cpu\": {\n                    \"target\": \"com.amazonaws.ec2#CpuPerformanceFactor\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Cpu\",\n                        \"smithy.api#documentation\": \"<p>The CPU performance to consider, using an instance family as the baseline reference.</p>\",\n                        \"smithy.api#xmlName\": \"cpu\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The baseline performance to consider, using an instance family as a baseline reference.\\n         The instance family establishes the lowest acceptable level of performance. Amazon EC2 uses this\\n         baseline to guide instance type selection, but there is no guarantee that the selected\\n         instance types will always exceed the baseline for every application.</p>\\n         <p>Currently, this parameter only supports CPU performance as a baseline performance\\n         factor. For example, specifying <code>c6i</code> would use the CPU performance of the\\n         <code>c6i</code> family as the baseline reference.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#BaselinePerformanceFactorsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Cpu\": {\n                    \"target\": \"com.amazonaws.ec2#CpuPerformanceFactorRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The CPU performance to consider, using an instance family as the baseline reference.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The baseline performance to consider, using an instance family as a baseline reference.\\n         The instance family establishes the lowest acceptable level of performance. Amazon EC2 uses this\\n         baseline to guide instance type selection, but there is no guarantee that the selected\\n         instance types will always exceed the baseline for every application.</p>\\n         <p>Currently, this parameter only supports CPU performance as a baseline performance\\n         factor. For example, specifying <code>c6i</code> would use the CPU performance of the\\n         <code>c6i</code> family as the baseline reference.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#BaselineThroughputInMBps\": {\n            \"type\": \"double\"\n        },\n        \"com.amazonaws.ec2#BatchState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"SUBMITTED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"submitted\"\n                    }\n                },\n                \"ACTIVE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"active\"\n                    }\n                },\n                \"CANCELLED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"cancelled\"\n                    }\n                },\n                \"FAILED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"failed\"\n                    }\n                },\n                \"CANCELLED_RUNNING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"cancelled_running\"\n                    }\n                },\n                \"CANCELLED_TERMINATING_INSTANCES\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"cancelled_terminating\"\n                    }\n                },\n                \"MODIFYING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"modifying\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#BgpStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"up\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"up\"\n                    }\n                },\n                \"down\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"down\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#BillingProductList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#String\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#Blob\": {\n            \"type\": \"blob\"\n        },\n        \"com.amazonaws.ec2#BlobAttributeValue\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Value\": {\n                    \"target\": \"com.amazonaws.ec2#Blob\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Value\",\n                        \"smithy.api#xmlName\": \"value\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#BlockDeviceMapping\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Ebs\": {\n                    \"target\": \"com.amazonaws.ec2#EbsBlockDevice\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Ebs\",\n                        \"smithy.api#documentation\": \"<p>Parameters used to automatically set up EBS volumes when the instance is\\n            launched.</p>\",\n                        \"smithy.api#xmlName\": \"ebs\"\n                    }\n                },\n                \"NoDevice\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NoDevice\",\n                        \"smithy.api#documentation\": \"<p>To omit the device from the block device mapping, specify an empty string. When this\\n            property is specified, the device is removed from the block device mapping regardless of\\n            the assigned value.</p>\",\n                        \"smithy.api#xmlName\": \"noDevice\"\n                    }\n                },\n                \"DeviceName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DeviceName\",\n                        \"smithy.api#documentation\": \"<p>The device name. For available device names, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/device_naming.html\\\">Device names for volumes</a>.</p>\",\n                        \"smithy.api#xmlName\": \"deviceName\"\n                    }\n                },\n                \"VirtualName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VirtualName\",\n                        \"smithy.api#documentation\": \"<p>The virtual device name (<code>ephemeral</code>N). Instance store volumes are numbered\\n            starting from 0. An instance type with 2 available instance store volumes can specify\\n            mappings for <code>ephemeral0</code> and <code>ephemeral1</code>. The number of\\n            available instance store volumes depends on the instance type. After you connect to the\\n            instance, you must mount the volume.</p>\\n         <p>NVMe instance store volumes are automatically enumerated and assigned a device name.\\n            Including them in your block device mapping has no effect.</p>\\n         <p>Constraints: For M3 instances, you must specify instance store volumes in the block\\n            device mapping for the instance. When you launch an M3 instance, we ignore any instance\\n            store volumes specified in the block device mapping for the AMI.</p>\",\n                        \"smithy.api#xmlName\": \"virtualName\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a block device mapping, which defines the EBS volumes and instance store\\n            volumes to attach to an instance at launch.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#BlockDeviceMappingList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#BlockDeviceMapping\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#BlockDeviceMappingRequestList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#BlockDeviceMapping\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"BlockDeviceMapping\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#BlockDeviceMappingResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DeviceName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DeviceName\",\n                        \"smithy.api#documentation\": \"<p>The device name (for example, <code>/dev/sdh</code> or <code>xvdh</code>).</p>\",\n                        \"smithy.api#xmlName\": \"deviceName\"\n                    }\n                },\n                \"VirtualName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VirtualName\",\n                        \"smithy.api#documentation\": \"<p>The virtual device name.</p>\",\n                        \"smithy.api#xmlName\": \"virtualName\"\n                    }\n                },\n                \"Ebs\": {\n                    \"target\": \"com.amazonaws.ec2#EbsBlockDeviceResponse\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Ebs\",\n                        \"smithy.api#documentation\": \"<p>Parameters used to automatically set up EBS volumes when the instance is\\n         launched.</p>\",\n                        \"smithy.api#xmlName\": \"ebs\"\n                    }\n                },\n                \"NoDevice\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NoDevice\",\n                        \"smithy.api#documentation\": \"<p>Suppresses the specified device included in the block device mapping.</p>\",\n                        \"smithy.api#xmlName\": \"noDevice\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a block device mapping, which defines the EBS volumes and instance store\\n         volumes to attach to an instance at launch.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#BlockDeviceMappingResponseList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#BlockDeviceMappingResponse\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#BlockPublicAccessMode\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"off\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"off\"\n                    }\n                },\n                \"block_bidirectional\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"block-bidirectional\"\n                    }\n                },\n                \"block_ingress\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"block-ingress\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#BlockPublicAccessStates\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InternetGatewayBlockMode\": {\n                    \"target\": \"com.amazonaws.ec2#BlockPublicAccessMode\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InternetGatewayBlockMode\",\n                        \"smithy.api#documentation\": \"<p>The mode of VPC BPA.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>off</code>: VPC BPA is not enabled and traffic is allowed to and from internet gateways and egress-only internet gateways in this Region.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>block-bidirectional</code>: Block all traffic to and from internet gateways and egress-only internet gateways in this Region (except for excluded VPCs and subnets).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>block-ingress</code>: Block all internet traffic to the VPCs in this Region (except for VPCs or subnets which are excluded). Only traffic to and from NAT gateways and egress-only internet gateways is allowed because these gateways only allow outbound connections to be established.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"internetGatewayBlockMode\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The state of VPC Block Public Access (BPA).</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#Boolean\": {\n            \"type\": \"boolean\"\n        },\n        \"com.amazonaws.ec2#BootModeType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"legacy_bios\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"legacy-bios\"\n                    }\n                },\n                \"uefi\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"uefi\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#BootModeTypeList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#BootModeType\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#BootModeValues\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"legacy_bios\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"legacy-bios\"\n                    }\n                },\n                \"uefi\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"uefi\"\n                    }\n                },\n                \"uefi_preferred\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"uefi-preferred\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#BoxedDouble\": {\n            \"type\": \"double\"\n        },\n        \"com.amazonaws.ec2#BoxedInteger\": {\n            \"type\": \"integer\"\n        },\n        \"com.amazonaws.ec2#BoxedLong\": {\n            \"type\": \"long\"\n        },\n        \"com.amazonaws.ec2#BundleId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#BundleIdStringList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#BundleId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"BundleId\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#BundleInstance\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#BundleInstanceRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#BundleInstanceResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Bundles an Amazon instance store-backed Windows instance.</p>\\n         <p>During bundling, only the root device volume (C:\\\\) is bundled. Data on other instance\\n      store volumes is not preserved.</p>\\n         <note>\\n            <p>This action is not applicable for Linux/Unix instances or Windows instances that are\\n        backed by Amazon EBS.</p>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.ec2#BundleInstanceRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the instance to bundle.</p>\\n         <p>Default: None</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Storage\": {\n                    \"target\": \"com.amazonaws.ec2#Storage\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The bucket in which to store the AMI. You can specify a bucket that you already own or a\\n      new bucket that Amazon EC2 creates on your behalf. If you specify a bucket that belongs to someone\\n      else, Amazon EC2 returns an error.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n\\t\\t\\tand provides an error response. If you have the required permissions, the error response is \\n\\t\\t\\t<code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the parameters for BundleInstance.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#BundleInstanceResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"BundleTask\": {\n                    \"target\": \"com.amazonaws.ec2#BundleTask\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"BundleInstanceTask\",\n                        \"smithy.api#documentation\": \"<p>Information about the bundle task.</p>\",\n                        \"smithy.api#xmlName\": \"bundleInstanceTask\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the output of BundleInstance.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#BundleTask\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the instance associated with this bundle task.</p>\",\n                        \"smithy.api#xmlName\": \"instanceId\"\n                    }\n                },\n                \"BundleId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"BundleId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the bundle task.</p>\",\n                        \"smithy.api#xmlName\": \"bundleId\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#BundleTaskState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The state of the task.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                },\n                \"StartTime\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"StartTime\",\n                        \"smithy.api#documentation\": \"<p>The time this task started.</p>\",\n                        \"smithy.api#xmlName\": \"startTime\"\n                    }\n                },\n                \"UpdateTime\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"UpdateTime\",\n                        \"smithy.api#documentation\": \"<p>The time of the most recent update for the task.</p>\",\n                        \"smithy.api#xmlName\": \"updateTime\"\n                    }\n                },\n                \"Storage\": {\n                    \"target\": \"com.amazonaws.ec2#Storage\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Storage\",\n                        \"smithy.api#documentation\": \"<p>The Amazon S3 storage locations.</p>\",\n                        \"smithy.api#xmlName\": \"storage\"\n                    }\n                },\n                \"Progress\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Progress\",\n                        \"smithy.api#documentation\": \"<p>The level of task completion, as a percent (for example, 20%).</p>\",\n                        \"smithy.api#xmlName\": \"progress\"\n                    }\n                },\n                \"BundleTaskError\": {\n                    \"target\": \"com.amazonaws.ec2#BundleTaskError\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Error\",\n                        \"smithy.api#documentation\": \"<p>If the task fails, a description of the error.</p>\",\n                        \"smithy.api#xmlName\": \"error\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a bundle task.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#BundleTaskError\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Code\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Code\",\n                        \"smithy.api#documentation\": \"<p>The error code.</p>\",\n                        \"smithy.api#xmlName\": \"code\"\n                    }\n                },\n                \"Message\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Message\",\n                        \"smithy.api#documentation\": \"<p>The error message.</p>\",\n                        \"smithy.api#xmlName\": \"message\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes an error for <a>BundleInstance</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#BundleTaskList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#BundleTask\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#BundleTaskState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"pending\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"pending\"\n                    }\n                },\n                \"waiting_for_shutdown\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"waiting-for-shutdown\"\n                    }\n                },\n                \"bundling\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"bundling\"\n                    }\n                },\n                \"storing\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"storing\"\n                    }\n                },\n                \"cancelling\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"cancelling\"\n                    }\n                },\n                \"complete\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"complete\"\n                    }\n                },\n                \"failed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"failed\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#BurstablePerformance\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"INCLUDED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"included\"\n                    }\n                },\n                \"REQUIRED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"required\"\n                    }\n                },\n                \"EXCLUDED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"excluded\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#BurstablePerformanceFlag\": {\n            \"type\": \"boolean\"\n        },\n        \"com.amazonaws.ec2#Byoasn\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Asn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Asn\",\n                        \"smithy.api#documentation\": \"<p>A public 2-byte or 4-byte ASN.</p>\",\n                        \"smithy.api#xmlName\": \"asn\"\n                    }\n                },\n                \"IpamId\": {\n                    \"target\": \"com.amazonaws.ec2#IpamId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpamId\",\n                        \"smithy.api#documentation\": \"<p>An IPAM ID.</p>\",\n                        \"smithy.api#xmlName\": \"ipamId\"\n                    }\n                },\n                \"StatusMessage\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"StatusMessage\",\n                        \"smithy.api#documentation\": \"<p>The status message.</p>\",\n                        \"smithy.api#xmlName\": \"statusMessage\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#AsnState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The provisioning state of the BYOASN.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The Autonomous System Number (ASN) and BYOIP CIDR association.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ByoasnSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#Byoasn\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ByoipCidr\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Cidr\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Cidr\",\n                        \"smithy.api#documentation\": \"<p>The address range, in CIDR notation.</p>\",\n                        \"smithy.api#xmlName\": \"cidr\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Description\",\n                        \"smithy.api#documentation\": \"<p>The description of the address range.</p>\",\n                        \"smithy.api#xmlName\": \"description\"\n                    }\n                },\n                \"AsnAssociations\": {\n                    \"target\": \"com.amazonaws.ec2#AsnAssociationSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AsnAssociationSet\",\n                        \"smithy.api#documentation\": \"<p>The BYOIP CIDR associations with ASNs.</p>\",\n                        \"smithy.api#xmlName\": \"asnAssociationSet\"\n                    }\n                },\n                \"StatusMessage\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"StatusMessage\",\n                        \"smithy.api#documentation\": \"<p>Upon success, contains the ID of the address pool. Otherwise, contains an error message.</p>\",\n                        \"smithy.api#xmlName\": \"statusMessage\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#ByoipCidrState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The state of the address range.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>advertised</code>: The address range is being advertised to the internet by Amazon Web Services.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>deprovisioned</code>: The address range is deprovisioned.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>failed-deprovision</code>: The request to deprovision the address range was unsuccessful. Ensure that all EIPs from the range have been deallocated and try again.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>failed-provision</code>: The request to provision the address range was unsuccessful.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>pending-deprovision</code>: You’ve submitted a request to deprovision an address range and it's pending.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>pending-provision</code>: You’ve submitted a request to provision an address range and it's pending.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>provisioned</code>: The address range is provisioned and can be advertised. The range is not currently advertised.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>provisioned-not-publicly-advertisable</code>: The address range is provisioned and cannot be advertised.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                },\n                \"NetworkBorderGroup\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkBorderGroup\",\n                        \"smithy.api#documentation\": \"<p>If you have <a href=\\\"https://docs.aws.amazon.com/local-zones/latest/ug/how-local-zones-work.html\\\">Local Zones</a> enabled, you can choose a network border group for Local Zones when you provision and advertise a BYOIPv4 CIDR. Choose the network border group carefully as the EIP and the Amazon Web Services resource it is associated with must reside in the same network border group.</p>\\n         <p>You can provision BYOIP address ranges to and advertise them in the following Local Zone network border groups:</p>\\n         <ul>\\n            <li>\\n               <p>us-east-1-dfw-2</p>\\n            </li>\\n            <li>\\n               <p>us-west-2-lax-1</p>\\n            </li>\\n            <li>\\n               <p>us-west-2-phx-2</p>\\n            </li>\\n         </ul>\\n         <note>\\n            <p>You cannot provision or advertise BYOIPv6 address ranges in Local Zones at this time.</p>\\n         </note>\",\n                        \"smithy.api#xmlName\": \"networkBorderGroup\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about an address range that is provisioned for use with your Amazon Web Services resources \\n         through bring your own IP addresses (BYOIP).</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ByoipCidrSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ByoipCidr\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ByoipCidrState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"advertised\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"advertised\"\n                    }\n                },\n                \"deprovisioned\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"deprovisioned\"\n                    }\n                },\n                \"failed_deprovision\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"failed-deprovision\"\n                    }\n                },\n                \"failed_provision\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"failed-provision\"\n                    }\n                },\n                \"pending_deprovision\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"pending-deprovision\"\n                    }\n                },\n                \"pending_provision\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"pending-provision\"\n                    }\n                },\n                \"provisioned\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"provisioned\"\n                    }\n                },\n                \"provisioned_not_publicly_advertisable\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"provisioned-not-publicly-advertisable\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#CallerRole\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"odcr_owner\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"odcr-owner\"\n                    }\n                },\n                \"unused_reservation_billing_owner\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"unused-reservation-billing-owner\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#CancelBatchErrorCode\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"FLEET_REQUEST_ID_DOES_NOT_EXIST\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"fleetRequestIdDoesNotExist\"\n                    }\n                },\n                \"FLEET_REQUEST_ID_MALFORMED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"fleetRequestIdMalformed\"\n                    }\n                },\n                \"FLEET_REQUEST_NOT_IN_CANCELLABLE_STATE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"fleetRequestNotInCancellableState\"\n                    }\n                },\n                \"UNEXPECTED_ERROR\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"unexpectedError\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#CancelBundleTask\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CancelBundleTaskRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CancelBundleTaskResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Cancels a bundling operation for an instance store-backed Windows instance.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CancelBundleTaskRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"BundleId\": {\n                    \"target\": \"com.amazonaws.ec2#BundleId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the bundle task.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n\\t\\t\\tand provides an error response. If you have the required permissions, the error response is \\n\\t\\t\\t<code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the parameters for CancelBundleTask.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CancelBundleTaskResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"BundleTask\": {\n                    \"target\": \"com.amazonaws.ec2#BundleTask\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"BundleInstanceTask\",\n                        \"smithy.api#documentation\": \"<p>Information about the bundle task.</p>\",\n                        \"smithy.api#xmlName\": \"bundleInstanceTask\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the output of CancelBundleTask.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CancelCapacityReservation\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CancelCapacityReservationRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CancelCapacityReservationResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Cancels the specified Capacity Reservation, releases the reserved capacity, and\\n\\t\\t\\tchanges the Capacity Reservation's state to <code>cancelled</code>.</p>\\n         <p>You can cancel a Capacity Reservation that is in the following states:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>assessing</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>active</code> and there is no commitment duration or the commitment\\n\\t\\t\\t\\t\\tduration has elapsed. You can't cancel a future-dated Capacity Reservation\\n\\t\\t\\t\\t\\tduring the commitment duration.</p>\\n            </li>\\n         </ul>\\n         <note>\\n            <p>You can't modify or cancel a Capacity Block. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-capacity-blocks.html\\\">Capacity Blocks for ML</a>.</p>\\n         </note>\\n         <p>If a future-dated Capacity Reservation enters the <code>delayed</code> state, the\\n\\t\\t\\tcommitment duration is waived, and you can cancel it as soon as it enters the\\n\\t\\t\\t\\t<code>active</code> state.</p>\\n         <p>Instances running in the reserved capacity continue running until you stop them.\\n\\t\\t\\tStopped instances that target the Capacity Reservation can no longer launch. Modify\\n\\t\\t\\tthese instances to either target a different Capacity Reservation, launch On-Demand\\n\\t\\t\\tInstance capacity, or run in any open Capacity Reservation that has matching attributes\\n\\t\\t\\tand sufficient capacity.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CancelCapacityReservationFleetError\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Code\": {\n                    \"target\": \"com.amazonaws.ec2#CancelCapacityReservationFleetErrorCode\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Code\",\n                        \"smithy.api#documentation\": \"<p>The error code.</p>\",\n                        \"smithy.api#xmlName\": \"code\"\n                    }\n                },\n                \"Message\": {\n                    \"target\": \"com.amazonaws.ec2#CancelCapacityReservationFleetErrorMessage\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Message\",\n                        \"smithy.api#documentation\": \"<p>The error message.</p>\",\n                        \"smithy.api#xmlName\": \"message\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a Capacity Reservation Fleet cancellation error.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CancelCapacityReservationFleetErrorCode\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#CancelCapacityReservationFleetErrorMessage\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#CancelCapacityReservationFleets\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CancelCapacityReservationFleetsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CancelCapacityReservationFleetsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Cancels one or more Capacity Reservation Fleets. When you cancel a Capacity\\n\\t\\t\\tReservation Fleet, the following happens:</p>\\n         <ul>\\n            <li>\\n               <p>The Capacity Reservation Fleet's status changes to\\n\\t\\t\\t\\t\\t<code>cancelled</code>.</p>\\n            </li>\\n            <li>\\n               <p>The individual Capacity Reservations in the Fleet are cancelled. Instances\\n\\t\\t\\t\\t\\trunning in the Capacity Reservations at the time of cancelling the Fleet\\n\\t\\t\\t\\t\\tcontinue to run in shared capacity.</p>\\n            </li>\\n            <li>\\n               <p>The Fleet stops creating new Capacity Reservations.</p>\\n            </li>\\n         </ul>\"\n            }\n        },\n        \"com.amazonaws.ec2#CancelCapacityReservationFleetsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"CapacityReservationFleetIds\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityReservationFleetIdSet\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The IDs of the Capacity Reservation Fleets to cancel.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"CapacityReservationFleetId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CancelCapacityReservationFleetsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SuccessfulFleetCancellations\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityReservationFleetCancellationStateSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SuccessfulFleetCancellationSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the Capacity Reservation Fleets that were successfully\\n\\t\\t\\tcancelled.</p>\",\n                        \"smithy.api#xmlName\": \"successfulFleetCancellationSet\"\n                    }\n                },\n                \"FailedFleetCancellations\": {\n                    \"target\": \"com.amazonaws.ec2#FailedCapacityReservationFleetCancellationResultSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"FailedFleetCancellationSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the Capacity Reservation Fleets that could not be cancelled.</p>\",\n                        \"smithy.api#xmlName\": \"failedFleetCancellationSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CancelCapacityReservationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CapacityReservationId\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityReservationId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the Capacity Reservation to be cancelled.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CancelCapacityReservationResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Return\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Return\",\n                        \"smithy.api#documentation\": \"<p>Returns <code>true</code> if the request succeeds; otherwise, it returns an error.</p>\",\n                        \"smithy.api#xmlName\": \"return\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CancelConversionRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"ConversionTaskId\": {\n                    \"target\": \"com.amazonaws.ec2#ConversionTaskId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ConversionTaskId\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the conversion task.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"conversionTaskId\"\n                    }\n                },\n                \"ReasonMessage\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ReasonMessage\",\n                        \"smithy.api#documentation\": \"<p>The reason for canceling the conversion task.</p>\",\n                        \"smithy.api#xmlName\": \"reasonMessage\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CancelConversionTask\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CancelConversionRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Cancels an active conversion task. The task can be the import of an instance or volume. The action removes all\\n   artifacts of the conversion, including a partially uploaded volume or instance. If the conversion is complete or is\\n   in the process of transferring the final disk image, the command fails and returns an exception.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CancelDeclarativePoliciesReport\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CancelDeclarativePoliciesReportRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CancelDeclarativePoliciesReportResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Cancels the generation of an account status report.</p>\\n         <p>You can only cancel a report while it has the <code>running</code> status. Reports\\n            with other statuses (<code>complete</code>, <code>cancelled</code>, or\\n                <code>error</code>) can't be canceled.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_declarative_status-report.html\\\">Generating the account status report for declarative policies</a> in the\\n                <i>Amazon Web Services Organizations User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CancelDeclarativePoliciesReportRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"ReportId\": {\n                    \"target\": \"com.amazonaws.ec2#DeclarativePoliciesReportId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the report.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CancelDeclarativePoliciesReportResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Return\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Return\",\n                        \"smithy.api#documentation\": \"<p>Is <code>true</code> if the request succeeds, and an error otherwise.</p>\",\n                        \"smithy.api#xmlName\": \"return\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CancelExportTask\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CancelExportTaskRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Cancels an active export task. The request removes all artifacts of the export, including any partially-created\\n   Amazon S3 objects. If the export task is complete or is in the process of transferring the final disk image, the\\n   command fails and returns an error.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CancelExportTaskRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ExportTaskId\": {\n                    \"target\": \"com.amazonaws.ec2#ExportVmTaskId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ExportTaskId\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the export task. This is the ID returned by the\\n    <code>CreateInstanceExportTask</code> and <code>ExportImage</code> operations.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"exportTaskId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CancelImageLaunchPermission\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CancelImageLaunchPermissionRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CancelImageLaunchPermissionResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Removes your Amazon Web Services account from the launch permissions for the specified AMI.\\n      For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/cancel-sharing-an-AMI.html\\\">Cancel having an AMI shared with\\n        your Amazon Web Services account</a> in the <i>Amazon EC2 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CancelImageLaunchPermissionRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ImageId\": {\n                    \"target\": \"com.amazonaws.ec2#ImageId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the AMI that was shared with your Amazon Web Services account.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n\\t\\t\\tand provides an error response. If you have the required permissions, the error response is \\n\\t\\t\\t<code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CancelImageLaunchPermissionResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Return\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Return\",\n                        \"smithy.api#documentation\": \"<p>Returns <code>true</code> if the request succeeds; otherwise, it returns an error.</p>\",\n                        \"smithy.api#xmlName\": \"return\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CancelImportTask\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CancelImportTaskRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CancelImportTaskResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Cancels an in-process import virtual machine or import snapshot task.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CancelImportTaskRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CancelReason\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The reason for canceling the task.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"ImportTaskId\": {\n                    \"target\": \"com.amazonaws.ec2#ImportTaskId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the import image or import snapshot task to be canceled.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CancelImportTaskResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ImportTaskId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ImportTaskId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the task being canceled.</p>\",\n                        \"smithy.api#xmlName\": \"importTaskId\"\n                    }\n                },\n                \"PreviousState\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PreviousState\",\n                        \"smithy.api#documentation\": \"<p>The current state of the task being canceled.</p>\",\n                        \"smithy.api#xmlName\": \"previousState\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The current state of the task being canceled.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CancelReservedInstancesListing\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CancelReservedInstancesListingRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CancelReservedInstancesListingResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Cancels the specified Reserved Instance listing in the Reserved Instance\\n      Marketplace.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ri-market-general.html\\\">Sell in the Reserved Instance\\n        Marketplace</a> in the <i>Amazon EC2 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CancelReservedInstancesListingRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ReservedInstancesListingId\": {\n                    \"target\": \"com.amazonaws.ec2#ReservedInstancesListingId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ReservedInstancesListingId\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the Reserved Instance listing.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"reservedInstancesListingId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the parameters for CancelReservedInstancesListing.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CancelReservedInstancesListingResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ReservedInstancesListings\": {\n                    \"target\": \"com.amazonaws.ec2#ReservedInstancesListingList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ReservedInstancesListingsSet\",\n                        \"smithy.api#documentation\": \"<p>The Reserved Instance listing.</p>\",\n                        \"smithy.api#xmlName\": \"reservedInstancesListingsSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the output of CancelReservedInstancesListing.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CancelSpotFleetRequests\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CancelSpotFleetRequestsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CancelSpotFleetRequestsResponse\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Cancels the specified Spot Fleet requests.</p>\\n         <p>After you cancel a Spot Fleet request, the Spot Fleet launches no new instances.</p>\\n         <p>You must also specify whether a canceled Spot Fleet request should terminate its instances. If you\\n            choose to terminate the instances, the Spot Fleet request enters the\\n                <code>cancelled_terminating</code> state. Otherwise, the Spot Fleet request enters\\n            the <code>cancelled_running</code> state and the instances continue to run until they\\n            are interrupted or you terminate them manually.</p>\\n         <p class=\\\"title\\\">\\n            <b>Restrictions</b>\\n         </p>\\n         <ul>\\n            <li>\\n               <p>You can delete up to 100 fleets in a single request. If you exceed the specified\\n               number, no fleets are deleted.</p>\\n            </li>\\n         </ul>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To cancel a Spot fleet request\",\n                        \"documentation\": \"This example cancels the specified Spot fleet request and terminates its associated Spot Instances.\",\n                        \"input\": {\n                            \"SpotFleetRequestIds\": [\n                                \"sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE\"\n                            ],\n                            \"TerminateInstances\": true\n                        },\n                        \"output\": {\n                            \"SuccessfulFleetRequests\": [\n                                {\n                                    \"SpotFleetRequestId\": \"sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE\",\n                                    \"CurrentSpotFleetRequestState\": \"cancelled_running\",\n                                    \"PreviousSpotFleetRequestState\": \"active\"\n                                }\n                            ]\n                        }\n                    },\n                    {\n                        \"title\": \"To cancel a Spot fleet request without terminating its Spot Instances\",\n                        \"documentation\": \"This example cancels the specified Spot fleet request without terminating its associated Spot Instances.\",\n                        \"input\": {\n                            \"SpotFleetRequestIds\": [\n                                \"sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE\"\n                            ],\n                            \"TerminateInstances\": false\n                        },\n                        \"output\": {\n                            \"SuccessfulFleetRequests\": [\n                                {\n                                    \"SpotFleetRequestId\": \"sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE\",\n                                    \"CurrentSpotFleetRequestState\": \"cancelled_terminating\",\n                                    \"PreviousSpotFleetRequestState\": \"active\"\n                                }\n                            ]\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#CancelSpotFleetRequestsError\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Code\": {\n                    \"target\": \"com.amazonaws.ec2#CancelBatchErrorCode\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Code\",\n                        \"smithy.api#documentation\": \"<p>The error code.</p>\",\n                        \"smithy.api#xmlName\": \"code\"\n                    }\n                },\n                \"Message\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Message\",\n                        \"smithy.api#documentation\": \"<p>The description for the error code.</p>\",\n                        \"smithy.api#xmlName\": \"message\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a Spot Fleet error.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CancelSpotFleetRequestsErrorItem\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Error\": {\n                    \"target\": \"com.amazonaws.ec2#CancelSpotFleetRequestsError\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Error\",\n                        \"smithy.api#documentation\": \"<p>The error.</p>\",\n                        \"smithy.api#xmlName\": \"error\"\n                    }\n                },\n                \"SpotFleetRequestId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SpotFleetRequestId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Spot Fleet request.</p>\",\n                        \"smithy.api#xmlName\": \"spotFleetRequestId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a Spot Fleet request that was not successfully canceled.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CancelSpotFleetRequestsErrorSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#CancelSpotFleetRequestsErrorItem\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#CancelSpotFleetRequestsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"SpotFleetRequestIds\": {\n                    \"target\": \"com.amazonaws.ec2#SpotFleetRequestIdList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SpotFleetRequestId\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The IDs of the Spot Fleet requests.</p>\\n         <p>Constraint: You can specify up to 100 IDs in a single request.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"spotFleetRequestId\"\n                    }\n                },\n                \"TerminateInstances\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TerminateInstances\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>Indicates whether to terminate the associated instances when the Spot Fleet request is canceled. \\n        The default is to terminate the instances.</p>\\n         <p>To let the instances continue to run after the Spot Fleet request is canceled, specify\\n          <code>no-terminate-instances</code>.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"terminateInstances\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the parameters for CancelSpotFleetRequests.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CancelSpotFleetRequestsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SuccessfulFleetRequests\": {\n                    \"target\": \"com.amazonaws.ec2#CancelSpotFleetRequestsSuccessSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SuccessfulFleetRequestSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the Spot Fleet requests that are successfully canceled.</p>\",\n                        \"smithy.api#xmlName\": \"successfulFleetRequestSet\"\n                    }\n                },\n                \"UnsuccessfulFleetRequests\": {\n                    \"target\": \"com.amazonaws.ec2#CancelSpotFleetRequestsErrorSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"UnsuccessfulFleetRequestSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the Spot Fleet requests that are not successfully canceled.</p>\",\n                        \"smithy.api#xmlName\": \"unsuccessfulFleetRequestSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the output of CancelSpotFleetRequests.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CancelSpotFleetRequestsSuccessItem\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CurrentSpotFleetRequestState\": {\n                    \"target\": \"com.amazonaws.ec2#BatchState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CurrentSpotFleetRequestState\",\n                        \"smithy.api#documentation\": \"<p>The current state of the Spot Fleet request.</p>\",\n                        \"smithy.api#xmlName\": \"currentSpotFleetRequestState\"\n                    }\n                },\n                \"PreviousSpotFleetRequestState\": {\n                    \"target\": \"com.amazonaws.ec2#BatchState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PreviousSpotFleetRequestState\",\n                        \"smithy.api#documentation\": \"<p>The previous state of the Spot Fleet request.</p>\",\n                        \"smithy.api#xmlName\": \"previousSpotFleetRequestState\"\n                    }\n                },\n                \"SpotFleetRequestId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SpotFleetRequestId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Spot Fleet request.</p>\",\n                        \"smithy.api#xmlName\": \"spotFleetRequestId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a Spot Fleet request that was successfully canceled.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CancelSpotFleetRequestsSuccessSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#CancelSpotFleetRequestsSuccessItem\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#CancelSpotInstanceRequestState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"active\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"active\"\n                    }\n                },\n                \"open\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"open\"\n                    }\n                },\n                \"closed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"closed\"\n                    }\n                },\n                \"cancelled\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"cancelled\"\n                    }\n                },\n                \"completed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"completed\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#CancelSpotInstanceRequests\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CancelSpotInstanceRequestsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CancelSpotInstanceRequestsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Cancels one or more Spot Instance requests.</p>\\n         <important>\\n            <p>Canceling a Spot Instance request does not terminate running Spot Instances\\n                associated with the request.</p>\\n         </important>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To cancel Spot Instance requests\",\n                        \"documentation\": \"This example cancels a Spot Instance request.\",\n                        \"input\": {\n                            \"SpotInstanceRequestIds\": [\n                                \"sir-08b93456\"\n                            ]\n                        },\n                        \"output\": {\n                            \"CancelledSpotInstanceRequests\": [\n                                {\n                                    \"State\": \"cancelled\",\n                                    \"SpotInstanceRequestId\": \"sir-08b93456\"\n                                }\n                            ]\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#CancelSpotInstanceRequestsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually\\n            making the request, and provides an error response. If you have the required\\n            permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is\\n                <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"SpotInstanceRequestIds\": {\n                    \"target\": \"com.amazonaws.ec2#SpotInstanceRequestIdList\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The IDs of the Spot Instance requests.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"SpotInstanceRequestId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the parameters for CancelSpotInstanceRequests.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CancelSpotInstanceRequestsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CancelledSpotInstanceRequests\": {\n                    \"target\": \"com.amazonaws.ec2#CancelledSpotInstanceRequestList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SpotInstanceRequestSet\",\n                        \"smithy.api#documentation\": \"<p>The Spot Instance requests.</p>\",\n                        \"smithy.api#xmlName\": \"spotInstanceRequestSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the output of CancelSpotInstanceRequests.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CancelledSpotInstanceRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SpotInstanceRequestId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SpotInstanceRequestId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Spot Instance request.</p>\",\n                        \"smithy.api#xmlName\": \"spotInstanceRequestId\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#CancelSpotInstanceRequestState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The state of the Spot Instance request.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a request to cancel a Spot Instance.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CancelledSpotInstanceRequestList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#CancelledSpotInstanceRequest\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#CapacityAllocation\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AllocationType\": {\n                    \"target\": \"com.amazonaws.ec2#AllocationType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AllocationType\",\n                        \"smithy.api#documentation\": \"<p>The usage type. <code>used</code> indicates that the instance capacity is in use by\\n\\t\\t\\tinstances that are running in the Capacity Reservation.</p>\",\n                        \"smithy.api#xmlName\": \"allocationType\"\n                    }\n                },\n                \"Count\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Count\",\n                        \"smithy.api#documentation\": \"<p>The amount of instance capacity associated with the usage. For example a value of\\n\\t\\t\\t\\t<code>4</code> indicates that instance capacity for 4 instances is currently in\\n\\t\\t\\tuse.</p>\",\n                        \"smithy.api#xmlName\": \"count\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about instance capacity usage for a Capacity Reservation.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CapacityAllocations\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#CapacityAllocation\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#CapacityBlock\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CapacityBlockId\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityBlockId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CapacityBlockId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Capacity Block.</p>\",\n                        \"smithy.api#xmlName\": \"capacityBlockId\"\n                    }\n                },\n                \"UltraserverType\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"UltraserverType\",\n                        \"smithy.api#documentation\": \"<p>The EC2 UltraServer type of the Capacity Block.</p>\",\n                        \"smithy.api#xmlName\": \"ultraserverType\"\n                    }\n                },\n                \"AvailabilityZone\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AvailabilityZone\",\n                        \"smithy.api#documentation\": \"<p>The Availability Zone of the Capacity Block.</p>\",\n                        \"smithy.api#xmlName\": \"availabilityZone\"\n                    }\n                },\n                \"AvailabilityZoneId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AvailabilityZoneId\",\n                        \"smithy.api#documentation\": \"<p>The Availability Zone ID of the Capacity Block.</p>\",\n                        \"smithy.api#xmlName\": \"availabilityZoneId\"\n                    }\n                },\n                \"CapacityReservationIds\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityReservationIdSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CapacityReservationIdSet\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Capacity Reservation.</p>\",\n                        \"smithy.api#xmlName\": \"capacityReservationIdSet\"\n                    }\n                },\n                \"StartDate\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"StartDate\",\n                        \"smithy.api#documentation\": \"<p>The date and time at which the Capacity Block was started.</p>\",\n                        \"smithy.api#xmlName\": \"startDate\"\n                    }\n                },\n                \"EndDate\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EndDate\",\n                        \"smithy.api#documentation\": \"<p>The date and time at which the Capacity Block expires. When a Capacity Block expires,\\n\\t\\t\\tall instances in the Capacity Block are terminated.</p>\",\n                        \"smithy.api#xmlName\": \"endDate\"\n                    }\n                },\n                \"CreateDate\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CreateDate\",\n                        \"smithy.api#documentation\": \"<p>The date and time at which the Capacity Block was created.</p>\",\n                        \"smithy.api#xmlName\": \"createDate\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityBlockResourceState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The state of the Capacity Block.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>The tags assigned to the Capacity Block.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Reserve powerful GPU instances on a future date to support your short duration machine learning (ML) workloads. Instances that run inside a Capacity Block are automatically placed close together inside <a href=\\\"http://aws.amazon.com/ec2/ultraclusters/\\\">Amazon EC2 UltraClusters</a>, for low-latency, petabit-scale, non-blocking networking.</p>\\n         <p>You can also reserve Amazon EC2 UltraServers. UltraServers connect multiple EC2 instances using a low-latency, high-bandwidth accelerator interconnect (NeuronLink). They are built to tackle very large-scale AI/ML workloads that require significant processing power. For more information, see Amazon EC2 UltraServers.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CapacityBlockExtension\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CapacityReservationId\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityReservationId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CapacityReservationId\",\n                        \"smithy.api#documentation\": \"<p>The reservation ID of the Capacity Block extension.</p>\",\n                        \"smithy.api#xmlName\": \"capacityReservationId\"\n                    }\n                },\n                \"InstanceType\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceType\",\n                        \"smithy.api#documentation\": \"<p>The instance type of the Capacity Block extension.</p>\",\n                        \"smithy.api#xmlName\": \"instanceType\"\n                    }\n                },\n                \"InstanceCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceCount\",\n                        \"smithy.api#documentation\": \"<p>The number of instances in the Capacity Block extension.</p>\",\n                        \"smithy.api#xmlName\": \"instanceCount\"\n                    }\n                },\n                \"AvailabilityZone\": {\n                    \"target\": \"com.amazonaws.ec2#AvailabilityZoneName\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AvailabilityZone\",\n                        \"smithy.api#documentation\": \"<p>The Availability Zone of the Capacity Block extension.</p>\",\n                        \"smithy.api#xmlName\": \"availabilityZone\"\n                    }\n                },\n                \"AvailabilityZoneId\": {\n                    \"target\": \"com.amazonaws.ec2#AvailabilityZoneId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AvailabilityZoneId\",\n                        \"smithy.api#documentation\": \"<p>The Availability Zone ID of the Capacity Block extension.</p>\",\n                        \"smithy.api#xmlName\": \"availabilityZoneId\"\n                    }\n                },\n                \"CapacityBlockExtensionOfferingId\": {\n                    \"target\": \"com.amazonaws.ec2#OfferingId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CapacityBlockExtensionOfferingId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Capacity Block extension offering.</p>\",\n                        \"smithy.api#xmlName\": \"capacityBlockExtensionOfferingId\"\n                    }\n                },\n                \"CapacityBlockExtensionDurationHours\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CapacityBlockExtensionDurationHours\",\n                        \"smithy.api#documentation\": \"<p>The duration of the Capacity Block extension in hours.</p>\",\n                        \"smithy.api#xmlName\": \"capacityBlockExtensionDurationHours\"\n                    }\n                },\n                \"CapacityBlockExtensionStatus\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityBlockExtensionStatus\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CapacityBlockExtensionStatus\",\n                        \"smithy.api#documentation\": \"<p>The status of the Capacity Block extension. A Capacity Block extension can have one of\\n\\t\\t\\tthe following statuses:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>payment-pending</code> - The Capacity Block extension payment is\\n\\t\\t\\t\\t\\tprocessing. If your payment can't be processed within 12 hours, the Capacity\\n\\t\\t\\t\\t\\tBlock extension is failed.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>payment-failed</code> - Payment for the Capacity Block extension request\\n\\t\\t\\t\\t\\twas not successful.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>payment-succeeded</code> - Payment for the Capacity Block extension\\n\\t\\t\\t\\t\\trequest was successful. You receive an invoice that reflects the one-time\\n\\t\\t\\t\\t\\tupfront payment. In the invoice, you can associate the paid amount with the\\n\\t\\t\\t\\t\\tCapacity Block reservation ID.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"capacityBlockExtensionStatus\"\n                    }\n                },\n                \"CapacityBlockExtensionPurchaseDate\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CapacityBlockExtensionPurchaseDate\",\n                        \"smithy.api#documentation\": \"<p>The date when the Capacity Block extension was purchased.</p>\",\n                        \"smithy.api#xmlName\": \"capacityBlockExtensionPurchaseDate\"\n                    }\n                },\n                \"CapacityBlockExtensionStartDate\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CapacityBlockExtensionStartDate\",\n                        \"smithy.api#documentation\": \"<p>The start date of the Capacity Block extension.</p>\",\n                        \"smithy.api#xmlName\": \"capacityBlockExtensionStartDate\"\n                    }\n                },\n                \"CapacityBlockExtensionEndDate\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CapacityBlockExtensionEndDate\",\n                        \"smithy.api#documentation\": \"<p>The end date of the Capacity Block extension.</p>\",\n                        \"smithy.api#xmlName\": \"capacityBlockExtensionEndDate\"\n                    }\n                },\n                \"UpfrontFee\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"UpfrontFee\",\n                        \"smithy.api#documentation\": \"<p>The total price to be paid up front.</p>\",\n                        \"smithy.api#xmlName\": \"upfrontFee\"\n                    }\n                },\n                \"CurrencyCode\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CurrencyCode\",\n                        \"smithy.api#documentation\": \"<p>The currency of the payment for the Capacity Block extension.</p>\",\n                        \"smithy.api#xmlName\": \"currencyCode\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a Capacity Block extension. With an extension, you can extend the duration\\n\\t\\t\\tof time for an existing Capacity Block.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CapacityBlockExtensionOffering\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CapacityBlockExtensionOfferingId\": {\n                    \"target\": \"com.amazonaws.ec2#OfferingId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CapacityBlockExtensionOfferingId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Capacity Block extension offering.</p>\",\n                        \"smithy.api#xmlName\": \"capacityBlockExtensionOfferingId\"\n                    }\n                },\n                \"InstanceType\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceType\",\n                        \"smithy.api#documentation\": \"<p>The instance type of the Capacity Block that will be extended.</p>\",\n                        \"smithy.api#xmlName\": \"instanceType\"\n                    }\n                },\n                \"InstanceCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceCount\",\n                        \"smithy.api#documentation\": \"<p>The number of instances in the Capacity Block extension offering.</p>\",\n                        \"smithy.api#xmlName\": \"instanceCount\"\n                    }\n                },\n                \"AvailabilityZone\": {\n                    \"target\": \"com.amazonaws.ec2#AvailabilityZoneName\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AvailabilityZone\",\n                        \"smithy.api#documentation\": \"<p>The Availability Zone of the Capacity Block that will be extended.</p>\",\n                        \"smithy.api#xmlName\": \"availabilityZone\"\n                    }\n                },\n                \"AvailabilityZoneId\": {\n                    \"target\": \"com.amazonaws.ec2#AvailabilityZoneId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AvailabilityZoneId\",\n                        \"smithy.api#documentation\": \"<p>The Availability Zone ID of the Capacity Block that will be extended.</p>\",\n                        \"smithy.api#xmlName\": \"availabilityZoneId\"\n                    }\n                },\n                \"StartDate\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"StartDate\",\n                        \"smithy.api#documentation\": \"<p>The start date of the Capacity Block that will be extended.</p>\",\n                        \"smithy.api#xmlName\": \"startDate\"\n                    }\n                },\n                \"CapacityBlockExtensionStartDate\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CapacityBlockExtensionStartDate\",\n                        \"smithy.api#documentation\": \"<p>The date and time at which the Capacity Block extension will start. This date is also\\n\\t\\t\\tthe same as the end date of the Capacity Block that will be extended.</p>\",\n                        \"smithy.api#xmlName\": \"capacityBlockExtensionStartDate\"\n                    }\n                },\n                \"CapacityBlockExtensionEndDate\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CapacityBlockExtensionEndDate\",\n                        \"smithy.api#documentation\": \"<p>The date and time at which the Capacity Block extension expires. When a Capacity Block\\n\\t\\t\\texpires, the reserved capacity is released and you can no longer launch instances into\\n\\t\\t\\tit. The Capacity Block's state changes to <code>expired</code> when it reaches its end\\n\\t\\t\\tdate</p>\",\n                        \"smithy.api#xmlName\": \"capacityBlockExtensionEndDate\"\n                    }\n                },\n                \"CapacityBlockExtensionDurationHours\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CapacityBlockExtensionDurationHours\",\n                        \"smithy.api#documentation\": \"<p>The amount of time of the Capacity Block extension offering in hours.</p>\",\n                        \"smithy.api#xmlName\": \"capacityBlockExtensionDurationHours\"\n                    }\n                },\n                \"UpfrontFee\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"UpfrontFee\",\n                        \"smithy.api#documentation\": \"<p>The total price of the Capacity Block extension offering, to be paid up front.</p>\",\n                        \"smithy.api#xmlName\": \"upfrontFee\"\n                    }\n                },\n                \"CurrencyCode\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CurrencyCode\",\n                        \"smithy.api#documentation\": \"<p>The currency of the payment for the Capacity Block extension offering.</p>\",\n                        \"smithy.api#xmlName\": \"currencyCode\"\n                    }\n                },\n                \"Tenancy\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityReservationTenancy\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Tenancy\",\n                        \"smithy.api#documentation\": \"<p>Indicates the tenancy of the Capacity Block extension offering. A Capacity Block can\\n\\t\\t\\thave one of the following tenancy settings:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>default</code> - The Capacity Block is created on hardware that is\\n\\t\\t\\t\\t\\tshared with other Amazon Web Services accounts.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>dedicated</code> - The Capacity Block is created on single-tenant\\n\\t\\t\\t\\t\\thardware that is dedicated to a single Amazon Web Services account.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"tenancy\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The recommended Capacity Block extension that fits your search requirements.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CapacityBlockExtensionOfferingSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#CapacityBlockExtensionOffering\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#CapacityBlockExtensionSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#CapacityBlockExtension\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#CapacityBlockExtensionStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"PAYMENT_PENDING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"payment-pending\"\n                    }\n                },\n                \"PAYMENT_FAILED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"payment-failed\"\n                    }\n                },\n                \"PAYMENT_SUCCEEDED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"payment-succeeded\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#CapacityBlockId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#CapacityBlockIds\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#CapacityBlockId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#CapacityBlockInterconnectStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ok\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ok\"\n                    }\n                },\n                \"impaired\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"impaired\"\n                    }\n                },\n                \"insufficient_data\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"insufficient-data\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#CapacityBlockOffering\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CapacityBlockOfferingId\": {\n                    \"target\": \"com.amazonaws.ec2#OfferingId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CapacityBlockOfferingId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Capacity Block offering.</p>\",\n                        \"smithy.api#xmlName\": \"capacityBlockOfferingId\"\n                    }\n                },\n                \"InstanceType\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceType\",\n                        \"smithy.api#documentation\": \"<p>The instance type of the Capacity Block offering.</p>\",\n                        \"smithy.api#xmlName\": \"instanceType\"\n                    }\n                },\n                \"AvailabilityZone\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AvailabilityZone\",\n                        \"smithy.api#documentation\": \"<p>The Availability Zone of the Capacity Block offering.</p>\",\n                        \"smithy.api#xmlName\": \"availabilityZone\"\n                    }\n                },\n                \"InstanceCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceCount\",\n                        \"smithy.api#documentation\": \"<p>The number of instances in the Capacity Block offering.</p>\",\n                        \"smithy.api#xmlName\": \"instanceCount\"\n                    }\n                },\n                \"StartDate\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"StartDate\",\n                        \"smithy.api#documentation\": \"<p>The start date of the Capacity Block offering.</p>\",\n                        \"smithy.api#xmlName\": \"startDate\"\n                    }\n                },\n                \"EndDate\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EndDate\",\n                        \"smithy.api#documentation\": \"<p>The end date of the Capacity Block offering.</p>\",\n                        \"smithy.api#xmlName\": \"endDate\"\n                    }\n                },\n                \"CapacityBlockDurationHours\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CapacityBlockDurationHours\",\n                        \"smithy.api#documentation\": \"<p>The number of hours (in addition to <code>capacityBlockDurationMinutes</code>) for the\\n\\t\\t\\tduration of the Capacity Block reservation. For example, if a Capacity Block starts at\\n\\t\\t\\t\\t<b>04:55</b> and ends at <b>11:30</b>, the hours field would be <b>6</b>.</p>\",\n                        \"smithy.api#xmlName\": \"capacityBlockDurationHours\"\n                    }\n                },\n                \"UpfrontFee\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"UpfrontFee\",\n                        \"smithy.api#documentation\": \"<p>The total price to be paid up front.</p>\",\n                        \"smithy.api#xmlName\": \"upfrontFee\"\n                    }\n                },\n                \"CurrencyCode\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CurrencyCode\",\n                        \"smithy.api#documentation\": \"<p>The currency of the payment for the Capacity Block.</p>\",\n                        \"smithy.api#xmlName\": \"currencyCode\"\n                    }\n                },\n                \"Tenancy\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityReservationTenancy\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Tenancy\",\n                        \"smithy.api#documentation\": \"<p>The tenancy of the Capacity Block.</p>\",\n                        \"smithy.api#xmlName\": \"tenancy\"\n                    }\n                },\n                \"UltraserverType\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"UltraserverType\",\n                        \"smithy.api#documentation\": \"<p>The EC2 UltraServer type of the Capacity Block offering.</p>\",\n                        \"smithy.api#xmlName\": \"ultraserverType\"\n                    }\n                },\n                \"UltraserverCount\": {\n                    \"target\": \"com.amazonaws.ec2#BoxedInteger\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"UltraserverCount\",\n                        \"smithy.api#documentation\": \"<p>The number of EC2 UltraServers in the offering.</p>\",\n                        \"smithy.api#xmlName\": \"ultraserverCount\"\n                    }\n                },\n                \"CapacityBlockDurationMinutes\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CapacityBlockDurationMinutes\",\n                        \"smithy.api#documentation\": \"<p>The number of minutes (in addition to <code>capacityBlockDurationHours</code>) for the\\n\\t\\t\\tduration of the Capacity Block reservation. For example, if a Capacity Block starts at\\n\\t\\t\\t\\t<b>08:55</b> and ends at <b>11:30</b>, the minutes field would be <b>35</b>.</p>\",\n                        \"smithy.api#xmlName\": \"capacityBlockDurationMinutes\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The recommended Capacity Block that fits your search requirements.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CapacityBlockOfferingSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#CapacityBlockOffering\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#CapacityBlockResourceState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"active\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"active\"\n                    }\n                },\n                \"expired\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"expired\"\n                    }\n                },\n                \"unavailable\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"unavailable\"\n                    }\n                },\n                \"cancelled\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"cancelled\"\n                    }\n                },\n                \"failed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"failed\"\n                    }\n                },\n                \"scheduled\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"scheduled\"\n                    }\n                },\n                \"payment_pending\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"payment-pending\"\n                    }\n                },\n                \"payment_failed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"payment-failed\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#CapacityBlockSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#CapacityBlock\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#CapacityBlockStatus\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CapacityBlockId\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityBlockId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CapacityBlockId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Capacity Block.</p>\",\n                        \"smithy.api#xmlName\": \"capacityBlockId\"\n                    }\n                },\n                \"InterconnectStatus\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityBlockInterconnectStatus\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InterconnectStatus\",\n                        \"smithy.api#documentation\": \"<p>The status of the high-bandwidth accelerator interconnect. Possible states include:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>ok</code> the accelerator interconnect is healthy.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>impaired</code> - accelerator interconnect communication is impaired.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>insufficient-data</code> - insufficient data to determine accelerator interconnect status.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"interconnectStatus\"\n                    }\n                },\n                \"TotalCapacity\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TotalCapacity\",\n                        \"smithy.api#documentation\": \"<p>The combined amount of <code>Available</code> and <code>Unavailable</code> capacity in the Capacity Block.</p>\",\n                        \"smithy.api#xmlName\": \"totalCapacity\"\n                    }\n                },\n                \"TotalAvailableCapacity\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TotalAvailableCapacity\",\n                        \"smithy.api#documentation\": \"<p>The remaining capacity. Indicates the number of resources that can be launched into the Capacity Block.</p>\",\n                        \"smithy.api#xmlName\": \"totalAvailableCapacity\"\n                    }\n                },\n                \"TotalUnavailableCapacity\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TotalUnavailableCapacity\",\n                        \"smithy.api#documentation\": \"<p>The unavailable capacity. Indicates the instance capacity that is unavailable for use \\n\\t\\t\\tdue to a system status check failure.</p>\",\n                        \"smithy.api#xmlName\": \"totalUnavailableCapacity\"\n                    }\n                },\n                \"CapacityReservationStatuses\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityReservationStatusSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CapacityReservationStatusSet\",\n                        \"smithy.api#documentation\": \"<p>The availability of capacity for the Capacity Block reservations.</p>\",\n                        \"smithy.api#xmlName\": \"capacityReservationStatusSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the availability of capacity for a Capacity Block.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CapacityBlockStatusSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#CapacityBlockStatus\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#CapacityReservation\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CapacityReservationId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CapacityReservationId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Capacity Reservation.</p>\",\n                        \"smithy.api#xmlName\": \"capacityReservationId\"\n                    }\n                },\n                \"OwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OwnerId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Amazon Web Services account that owns the Capacity Reservation.</p>\",\n                        \"smithy.api#xmlName\": \"ownerId\"\n                    }\n                },\n                \"CapacityReservationArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CapacityReservationArn\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the Capacity Reservation.</p>\",\n                        \"smithy.api#xmlName\": \"capacityReservationArn\"\n                    }\n                },\n                \"AvailabilityZoneId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AvailabilityZoneId\",\n                        \"smithy.api#documentation\": \"<p>The Availability Zone ID of the Capacity Reservation.</p>\",\n                        \"smithy.api#xmlName\": \"availabilityZoneId\"\n                    }\n                },\n                \"InstanceType\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceType\",\n                        \"smithy.api#documentation\": \"<p>The type of instance for which the Capacity Reservation reserves capacity.</p>\",\n                        \"smithy.api#xmlName\": \"instanceType\"\n                    }\n                },\n                \"InstancePlatform\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityReservationInstancePlatform\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstancePlatform\",\n                        \"smithy.api#documentation\": \"<p>The type of operating system for which the Capacity Reservation reserves\\n\\t\\t\\tcapacity.</p>\",\n                        \"smithy.api#xmlName\": \"instancePlatform\"\n                    }\n                },\n                \"AvailabilityZone\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AvailabilityZone\",\n                        \"smithy.api#documentation\": \"<p>The Availability Zone in which the capacity is reserved.</p>\",\n                        \"smithy.api#xmlName\": \"availabilityZone\"\n                    }\n                },\n                \"Tenancy\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityReservationTenancy\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Tenancy\",\n                        \"smithy.api#documentation\": \"<p>Indicates the tenancy of the Capacity Reservation. A Capacity Reservation can have one\\n\\t\\t\\tof the following tenancy settings:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>default</code> - The Capacity Reservation is created on hardware that is\\n\\t\\t\\t\\t\\tshared with other Amazon Web Services accounts.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>dedicated</code> - The Capacity Reservation is created on single-tenant\\n\\t\\t\\t\\t\\thardware that is dedicated to a single Amazon Web Services account.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"tenancy\"\n                    }\n                },\n                \"TotalInstanceCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TotalInstanceCount\",\n                        \"smithy.api#documentation\": \"<p>The total number of instances for which the Capacity Reservation reserves\\n\\t\\t\\tcapacity.</p>\",\n                        \"smithy.api#xmlName\": \"totalInstanceCount\"\n                    }\n                },\n                \"AvailableInstanceCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AvailableInstanceCount\",\n                        \"smithy.api#documentation\": \"<p>The remaining capacity. Indicates the number of instances that can be launched in the\\n\\t\\t\\tCapacity Reservation.</p>\",\n                        \"smithy.api#xmlName\": \"availableInstanceCount\"\n                    }\n                },\n                \"EbsOptimized\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EbsOptimized\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether the Capacity Reservation supports EBS-optimized instances. This\\n\\t\\t\\toptimization provides dedicated throughput to Amazon EBS and an optimized configuration\\n\\t\\t\\tstack to provide optimal I/O performance. This optimization isn't available with all\\n\\t\\t\\tinstance types. Additional usage charges apply when using an EBS- optimized\\n\\t\\t\\tinstance.</p>\",\n                        \"smithy.api#xmlName\": \"ebsOptimized\"\n                    }\n                },\n                \"EphemeralStorage\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EphemeralStorage\",\n                        \"smithy.api#documentation\": \"<p>\\n            <i>Deprecated.</i>\\n         </p>\",\n                        \"smithy.api#xmlName\": \"ephemeralStorage\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityReservationState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The current state of the Capacity Reservation. A Capacity Reservation can be in one of\\n\\t\\t\\tthe following states:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>active</code> - The capacity is available for use.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>expired</code> - The Capacity Reservation expired automatically at the date and time \\n\\t\\tspecified in your reservation request. The reserved capacity is no longer available for your use.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>cancelled</code> - The Capacity Reservation was canceled. The reserved capacity is no \\n\\t\\tlonger available for your use.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>pending</code> - The Capacity Reservation request was successful but the capacity \\n\\t\\tprovisioning is still pending.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>failed</code> - The Capacity Reservation request has failed. A request can fail due to \\n\\t\\trequest parameters that are not valid, capacity constraints, or instance limit constraints. You \\n\\t\\tcan view a failed request for 60 minutes.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>scheduled</code> - (<i>Future-dated Capacity Reservations</i>) The \\n\\t\\tfuture-dated Capacity Reservation request was approved and the Capacity Reservation is scheduled \\n\\t\\tfor delivery on the requested start date.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>payment-pending</code> - (<i>Capacity Blocks</i>) The upfront \\n\\t    payment has not been processed yet.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>payment-failed</code> - (<i>Capacity Blocks</i>) The upfront \\n\\t    payment was not processed in the 12-hour time frame. Your Capacity Block was released.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>assessing</code> - (<i>Future-dated Capacity Reservations</i>) \\n\\t\\tAmazon EC2 is assessing your request for a future-dated Capacity Reservation.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>delayed</code> - (<i>Future-dated Capacity Reservations</i>) Amazon EC2 \\n\\t\\tencountered a delay in provisioning the requested future-dated Capacity Reservation. Amazon EC2 is \\n\\t\\tunable to deliver the requested capacity by the requested start date and time.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>unsupported</code> - (<i>Future-dated Capacity Reservations</i>) Amazon EC2 \\n\\t\\tcan't support the future-dated Capacity Reservation request due to capacity constraints. You can view \\n\\t\\tunsupported requests for 30 days. The Capacity Reservation will not be delivered.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                },\n                \"StartDate\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"StartDate\",\n                        \"smithy.api#documentation\": \"<p>The date and time at which the Capacity Reservation was started.</p>\",\n                        \"smithy.api#xmlName\": \"startDate\"\n                    }\n                },\n                \"EndDate\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EndDate\",\n                        \"smithy.api#documentation\": \"<p>The date and time at which the Capacity Reservation expires. When a Capacity\\n\\t\\t\\tReservation expires, the reserved capacity is released and you can no longer launch\\n\\t\\t\\tinstances into it. The Capacity Reservation's state changes to <code>expired</code> when\\n\\t\\t\\tit reaches its end date and time.</p>\",\n                        \"smithy.api#xmlName\": \"endDate\"\n                    }\n                },\n                \"EndDateType\": {\n                    \"target\": \"com.amazonaws.ec2#EndDateType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EndDateType\",\n                        \"smithy.api#documentation\": \"<p>Indicates the way in which the Capacity Reservation ends. A Capacity Reservation can\\n\\t\\t\\thave one of the following end types:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>unlimited</code> - The Capacity Reservation remains active until you\\n\\t\\t\\t\\t\\texplicitly cancel it.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>limited</code> - The Capacity Reservation expires automatically at a\\n\\t\\t\\t\\t\\tspecified date and time.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"endDateType\"\n                    }\n                },\n                \"InstanceMatchCriteria\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceMatchCriteria\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceMatchCriteria\",\n                        \"smithy.api#documentation\": \"<p>Indicates the type of instance launches that the Capacity Reservation accepts. The\\n\\t\\t\\toptions include:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>open</code> - The Capacity Reservation accepts all instances that have\\n\\t\\t\\t\\t\\tmatching attributes (instance type, platform, and Availability Zone). Instances\\n\\t\\t\\t\\t\\tthat have matching attributes launch into the Capacity Reservation automatically\\n\\t\\t\\t\\t\\twithout specifying any additional parameters.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>targeted</code> - The Capacity Reservation only accepts instances that\\n\\t\\t\\t\\t\\thave matching attributes (instance type, platform, and Availability Zone), and\\n\\t\\t\\t\\t\\texplicitly target the Capacity Reservation. This ensures that only permitted\\n\\t\\t\\t\\t\\tinstances can use the reserved capacity. </p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"instanceMatchCriteria\"\n                    }\n                },\n                \"CreateDate\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CreateDate\",\n                        \"smithy.api#documentation\": \"<p>The date and time at which the Capacity Reservation was created.</p>\",\n                        \"smithy.api#xmlName\": \"createDate\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>Any tags assigned to the Capacity Reservation.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                },\n                \"OutpostArn\": {\n                    \"target\": \"com.amazonaws.ec2#OutpostArn\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OutpostArn\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the Outpost on which the Capacity Reservation was\\n\\t\\t\\tcreated.</p>\",\n                        \"smithy.api#xmlName\": \"outpostArn\"\n                    }\n                },\n                \"CapacityReservationFleetId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CapacityReservationFleetId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Capacity Reservation Fleet to which the Capacity Reservation belongs.\\n\\t\\t\\tOnly valid for Capacity Reservations that were created by a Capacity Reservation\\n\\t\\t\\tFleet.</p>\",\n                        \"smithy.api#xmlName\": \"capacityReservationFleetId\"\n                    }\n                },\n                \"PlacementGroupArn\": {\n                    \"target\": \"com.amazonaws.ec2#PlacementGroupArn\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PlacementGroupArn\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the cluster placement group in which the Capacity\\n\\t\\t\\tReservation was created. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/cr-cpg.html\\\"> Capacity Reservations for cluster\\n\\t\\t\\t\\tplacement groups</a> in the <i>Amazon EC2 User Guide</i>.</p>\",\n                        \"smithy.api#xmlName\": \"placementGroupArn\"\n                    }\n                },\n                \"CapacityAllocations\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityAllocations\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CapacityAllocationSet\",\n                        \"smithy.api#documentation\": \"<p>Information about instance capacity usage.</p>\",\n                        \"smithy.api#xmlName\": \"capacityAllocationSet\"\n                    }\n                },\n                \"ReservationType\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityReservationType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ReservationType\",\n                        \"smithy.api#documentation\": \"<p>The type of Capacity Reservation.</p>\",\n                        \"smithy.api#xmlName\": \"reservationType\"\n                    }\n                },\n                \"UnusedReservationBillingOwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#AccountID\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"UnusedReservationBillingOwnerId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Amazon Web Services account to which billing of the unused capacity of\\n\\t\\t\\tthe Capacity Reservation is assigned.</p>\",\n                        \"smithy.api#xmlName\": \"unusedReservationBillingOwnerId\"\n                    }\n                },\n                \"CommitmentInfo\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityReservationCommitmentInfo\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CommitmentInfo\",\n                        \"smithy.api#documentation\": \"<p>Information about your commitment for a future-dated Capacity Reservation.</p>\",\n                        \"smithy.api#xmlName\": \"commitmentInfo\"\n                    }\n                },\n                \"DeliveryPreference\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityReservationDeliveryPreference\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DeliveryPreference\",\n                        \"smithy.api#documentation\": \"<p>The delivery method for a future-dated Capacity Reservation. <code>incremental</code>\\n\\t\\t\\tindicates that the requested capacity is delivered in addition to any running instances\\n\\t\\t\\tand reserved capacity that you have in your account at the requested date and\\n\\t\\t\\ttime.</p>\",\n                        \"smithy.api#xmlName\": \"deliveryPreference\"\n                    }\n                },\n                \"CapacityBlockId\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityBlockId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CapacityBlockId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Capacity Block.</p>\",\n                        \"smithy.api#xmlName\": \"capacityBlockId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a Capacity Reservation.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CapacityReservationBillingRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CapacityReservationId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CapacityReservationId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Capacity Reservation.</p>\",\n                        \"smithy.api#xmlName\": \"capacityReservationId\"\n                    }\n                },\n                \"RequestedBy\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RequestedBy\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Amazon Web Services account that initiated the request.</p>\",\n                        \"smithy.api#xmlName\": \"requestedBy\"\n                    }\n                },\n                \"UnusedReservationBillingOwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#AccountID\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"UnusedReservationBillingOwnerId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Amazon Web Services account to which the request was sent.</p>\",\n                        \"smithy.api#xmlName\": \"unusedReservationBillingOwnerId\"\n                    }\n                },\n                \"LastUpdateTime\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LastUpdateTime\",\n                        \"smithy.api#documentation\": \"<p>The date and time, in UTC time format, at which the request was initiated.</p>\",\n                        \"smithy.api#xmlName\": \"lastUpdateTime\"\n                    }\n                },\n                \"Status\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityReservationBillingRequestStatus\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Status\",\n                        \"smithy.api#documentation\": \"<p>The status of the request. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/view-billing-transfers.html\\\"> View billing assignment\\n\\t\\t\\t\\trequests for a shared Amazon EC2 Capacity Reservation</a>.</p>\",\n                        \"smithy.api#xmlName\": \"status\"\n                    }\n                },\n                \"StatusMessage\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"StatusMessage\",\n                        \"smithy.api#documentation\": \"<p>Information about the status.</p>\",\n                        \"smithy.api#xmlName\": \"statusMessage\"\n                    }\n                },\n                \"CapacityReservationInfo\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityReservationInfo\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CapacityReservationInfo\",\n                        \"smithy.api#documentation\": \"<p>Information about the Capacity Reservation.</p>\",\n                        \"smithy.api#xmlName\": \"capacityReservationInfo\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about a request to assign billing of the unused capacity of a Capacity\\n\\t\\t\\tReservation.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CapacityReservationBillingRequestSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#CapacityReservationBillingRequest\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#CapacityReservationBillingRequestStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"pending\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"pending\"\n                    }\n                },\n                \"accepted\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"accepted\"\n                    }\n                },\n                \"rejected\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"rejected\"\n                    }\n                },\n                \"cancelled\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"cancelled\"\n                    }\n                },\n                \"revoked\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"revoked\"\n                    }\n                },\n                \"expired\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"expired\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#CapacityReservationCommitmentDuration\": {\n            \"type\": \"long\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 200000000\n                }\n            }\n        },\n        \"com.amazonaws.ec2#CapacityReservationCommitmentInfo\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CommittedInstanceCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CommittedInstanceCount\",\n                        \"smithy.api#documentation\": \"<p>The instance capacity that you committed to when you requested the future-dated\\n\\t\\t\\tCapacity Reservation.</p>\",\n                        \"smithy.api#xmlName\": \"committedInstanceCount\"\n                    }\n                },\n                \"CommitmentEndDate\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CommitmentEndDate\",\n                        \"smithy.api#documentation\": \"<p>The date and time at which the commitment duration expires, in the ISO8601 format in\\n\\t\\t\\tthe UTC time zone (<code>YYYY-MM-DDThh:mm:ss.sssZ</code>). You can't decrease the\\n\\t\\t\\tinstance count or cancel the Capacity Reservation before this date and time.</p>\",\n                        \"smithy.api#xmlName\": \"commitmentEndDate\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about your commitment for a future-dated Capacity Reservation.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CapacityReservationDeliveryPreference\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"FIXED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"fixed\"\n                    }\n                },\n                \"INCREMENTAL\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"incremental\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#CapacityReservationFleet\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CapacityReservationFleetId\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityReservationFleetId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CapacityReservationFleetId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Capacity Reservation Fleet.</p>\",\n                        \"smithy.api#xmlName\": \"capacityReservationFleetId\"\n                    }\n                },\n                \"CapacityReservationFleetArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CapacityReservationFleetArn\",\n                        \"smithy.api#documentation\": \"<p>The ARN of the Capacity Reservation Fleet.</p>\",\n                        \"smithy.api#xmlName\": \"capacityReservationFleetArn\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityReservationFleetState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The state of the Capacity Reservation Fleet. Possible states include:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>submitted</code> - The Capacity Reservation Fleet request has been\\n\\t\\t\\t\\t\\tsubmitted and Amazon Elastic Compute Cloud is preparing to create the Capacity\\n\\t\\t\\t\\t\\tReservations.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>modifying</code> - The Capacity Reservation Fleet is being modified. The\\n\\t\\t\\t\\t\\tFleet remains in this state until the modification is complete.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>active</code> - The Capacity Reservation Fleet has fulfilled its total\\n\\t\\t\\t\\t\\ttarget capacity and it is attempting to maintain this capacity. The Fleet\\n\\t\\t\\t\\t\\tremains in this state until it is modified or deleted.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>partially_fulfilled</code> - The Capacity Reservation Fleet has\\n\\t\\t\\t\\t\\tpartially fulfilled its total target capacity. There is insufficient Amazon EC2 to fulfill the total target capacity. The Fleet is attempting to\\n\\t\\t\\t\\t\\tasynchronously fulfill its total target capacity.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>expiring</code> - The Capacity Reservation Fleet has reach its end date\\n\\t\\t\\t\\t\\tand it is in the process of expiring. One or more of its Capacity reservations\\n\\t\\t\\t\\t\\tmight still be active.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>expired</code> - The Capacity Reservation Fleet has reach its end date.\\n\\t\\t\\t\\t\\tThe Fleet and its Capacity Reservations are expired. The Fleet can't create new\\n\\t\\t\\t\\t\\tCapacity Reservations.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>cancelling</code> - The Capacity Reservation Fleet is in the process of\\n\\t\\t\\t\\t\\tbeing cancelled. One or more of its Capacity reservations might still be\\n\\t\\t\\t\\t\\tactive.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>cancelled</code> - The Capacity Reservation Fleet has been manually\\n\\t\\t\\t\\t\\tcancelled. The Fleet and its Capacity Reservations are cancelled and the Fleet\\n\\t\\t\\t\\t\\tcan't create new Capacity Reservations.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>failed</code> - The Capacity Reservation Fleet failed to reserve\\n\\t\\t\\t\\t\\tcapacity for the specified instance types.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                },\n                \"TotalTargetCapacity\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TotalTargetCapacity\",\n                        \"smithy.api#documentation\": \"<p>The total number of capacity units for which the Capacity Reservation Fleet reserves\\n\\t\\t\\tcapacity. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/crfleet-concepts.html#target-capacity\\\">Total target\\n\\t\\t\\t\\tcapacity</a> in the <i>Amazon EC2 User Guide</i>.</p>\",\n                        \"smithy.api#xmlName\": \"totalTargetCapacity\"\n                    }\n                },\n                \"TotalFulfilledCapacity\": {\n                    \"target\": \"com.amazonaws.ec2#Double\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TotalFulfilledCapacity\",\n                        \"smithy.api#documentation\": \"<p>The capacity units that have been fulfilled.</p>\",\n                        \"smithy.api#xmlName\": \"totalFulfilledCapacity\"\n                    }\n                },\n                \"Tenancy\": {\n                    \"target\": \"com.amazonaws.ec2#FleetCapacityReservationTenancy\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Tenancy\",\n                        \"smithy.api#documentation\": \"<p>The tenancy of the Capacity Reservation Fleet. Tenancies include:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>default</code> - The Capacity Reservation Fleet is created on hardware\\n\\t\\t\\t\\t\\tthat is shared with other Amazon Web Services accounts.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>dedicated</code> - The Capacity Reservation Fleet is created on\\n\\t\\t\\t\\t\\tsingle-tenant hardware that is dedicated to a single Amazon Web Services account.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"tenancy\"\n                    }\n                },\n                \"EndDate\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EndDate\",\n                        \"smithy.api#documentation\": \"<p>The date and time at which the Capacity Reservation Fleet expires.</p>\",\n                        \"smithy.api#xmlName\": \"endDate\"\n                    }\n                },\n                \"CreateTime\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CreateTime\",\n                        \"smithy.api#documentation\": \"<p>The date and time at which the Capacity Reservation Fleet was created.</p>\",\n                        \"smithy.api#xmlName\": \"createTime\"\n                    }\n                },\n                \"InstanceMatchCriteria\": {\n                    \"target\": \"com.amazonaws.ec2#FleetInstanceMatchCriteria\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceMatchCriteria\",\n                        \"smithy.api#documentation\": \"<p>Indicates the type of instance launches that the Capacity Reservation Fleet accepts.\\n\\t\\t\\tAll Capacity Reservations in the Fleet inherit this instance matching criteria.</p>\\n         <p>Currently, Capacity Reservation Fleets support <code>open</code> instance matching\\n\\t\\t\\tcriteria only. This means that instances that have matching attributes (instance type,\\n\\t\\t\\tplatform, and Availability Zone) run in the Capacity Reservations automatically.\\n\\t\\t\\tInstances do not need to explicitly target a Capacity Reservation Fleet to use its\\n\\t\\t\\treserved capacity.</p>\",\n                        \"smithy.api#xmlName\": \"instanceMatchCriteria\"\n                    }\n                },\n                \"AllocationStrategy\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AllocationStrategy\",\n                        \"smithy.api#documentation\": \"<p>The strategy used by the Capacity Reservation Fleet to determine which of the\\n\\t\\t\\tspecified instance types to use. For more information, see For more information, see\\n\\t\\t\\t\\t<a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/crfleet-concepts.html#allocation-strategy\\\">Allocation\\n\\t\\t\\t\\tstrategy</a> in the <i>Amazon EC2 User Guide</i>.</p>\",\n                        \"smithy.api#xmlName\": \"allocationStrategy\"\n                    }\n                },\n                \"InstanceTypeSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#FleetCapacityReservationSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceTypeSpecificationSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the instance types for which to reserve the capacity.</p>\",\n                        \"smithy.api#xmlName\": \"instanceTypeSpecificationSet\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>The tags assigned to the Capacity Reservation Fleet.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about a Capacity Reservation Fleet.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CapacityReservationFleetCancellationState\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CurrentFleetState\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityReservationFleetState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CurrentFleetState\",\n                        \"smithy.api#documentation\": \"<p>The current state of the Capacity Reservation Fleet.</p>\",\n                        \"smithy.api#xmlName\": \"currentFleetState\"\n                    }\n                },\n                \"PreviousFleetState\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityReservationFleetState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PreviousFleetState\",\n                        \"smithy.api#documentation\": \"<p>The previous state of the Capacity Reservation Fleet.</p>\",\n                        \"smithy.api#xmlName\": \"previousFleetState\"\n                    }\n                },\n                \"CapacityReservationFleetId\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityReservationFleetId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CapacityReservationFleetId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Capacity Reservation Fleet that was successfully cancelled.</p>\",\n                        \"smithy.api#xmlName\": \"capacityReservationFleetId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a Capacity Reservation Fleet that was successfully cancelled.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CapacityReservationFleetCancellationStateSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#CapacityReservationFleetCancellationState\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#CapacityReservationFleetId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#CapacityReservationFleetIdSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#CapacityReservationFleetId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#CapacityReservationFleetSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#CapacityReservationFleet\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#CapacityReservationFleetState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"SUBMITTED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"submitted\"\n                    }\n                },\n                \"MODIFYING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"modifying\"\n                    }\n                },\n                \"ACTIVE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"active\"\n                    }\n                },\n                \"PARTIALLY_FULFILLED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"partially_fulfilled\"\n                    }\n                },\n                \"EXPIRING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"expiring\"\n                    }\n                },\n                \"EXPIRED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"expired\"\n                    }\n                },\n                \"CANCELLING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"cancelling\"\n                    }\n                },\n                \"CANCELLED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"cancelled\"\n                    }\n                },\n                \"FAILED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"failed\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#CapacityReservationGroup\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"GroupArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"GroupArn\",\n                        \"smithy.api#documentation\": \"<p>The ARN of the resource group.</p>\",\n                        \"smithy.api#xmlName\": \"groupArn\"\n                    }\n                },\n                \"OwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OwnerId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Amazon Web Services account that owns the resource group.</p>\",\n                        \"smithy.api#xmlName\": \"ownerId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a resource group to which a Capacity Reservation has been added.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CapacityReservationGroupSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#CapacityReservationGroup\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#CapacityReservationId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#CapacityReservationIdSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#CapacityReservationId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#CapacityReservationInfo\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceType\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceType\",\n                        \"smithy.api#documentation\": \"<p>The instance type for the Capacity Reservation.</p>\",\n                        \"smithy.api#xmlName\": \"instanceType\"\n                    }\n                },\n                \"AvailabilityZone\": {\n                    \"target\": \"com.amazonaws.ec2#AvailabilityZoneName\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AvailabilityZone\",\n                        \"smithy.api#documentation\": \"<p>The Availability Zone for the Capacity Reservation.</p>\",\n                        \"smithy.api#xmlName\": \"availabilityZone\"\n                    }\n                },\n                \"Tenancy\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityReservationTenancy\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Tenancy\",\n                        \"smithy.api#documentation\": \"<p>The tenancy of the Capacity Reservation.</p>\",\n                        \"smithy.api#xmlName\": \"tenancy\"\n                    }\n                },\n                \"AvailabilityZoneId\": {\n                    \"target\": \"com.amazonaws.ec2#AvailabilityZoneId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AvailabilityZoneId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Availability Zone.</p>\",\n                        \"smithy.api#xmlName\": \"availabilityZoneId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about a Capacity Reservation.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CapacityReservationInstancePlatform\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"LINUX_UNIX\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Linux/UNIX\"\n                    }\n                },\n                \"RED_HAT_ENTERPRISE_LINUX\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Red Hat Enterprise Linux\"\n                    }\n                },\n                \"SUSE_LINUX\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"SUSE Linux\"\n                    }\n                },\n                \"WINDOWS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Windows\"\n                    }\n                },\n                \"WINDOWS_WITH_SQL_SERVER\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Windows with SQL Server\"\n                    }\n                },\n                \"WINDOWS_WITH_SQL_SERVER_ENTERPRISE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Windows with SQL Server Enterprise\"\n                    }\n                },\n                \"WINDOWS_WITH_SQL_SERVER_STANDARD\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Windows with SQL Server Standard\"\n                    }\n                },\n                \"WINDOWS_WITH_SQL_SERVER_WEB\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Windows with SQL Server Web\"\n                    }\n                },\n                \"LINUX_WITH_SQL_SERVER_STANDARD\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Linux with SQL Server Standard\"\n                    }\n                },\n                \"LINUX_WITH_SQL_SERVER_WEB\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Linux with SQL Server Web\"\n                    }\n                },\n                \"LINUX_WITH_SQL_SERVER_ENTERPRISE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Linux with SQL Server Enterprise\"\n                    }\n                },\n                \"RHEL_WITH_SQL_SERVER_STANDARD\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"RHEL with SQL Server Standard\"\n                    }\n                },\n                \"RHEL_WITH_SQL_SERVER_ENTERPRISE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"RHEL with SQL Server Enterprise\"\n                    }\n                },\n                \"RHEL_WITH_SQL_SERVER_WEB\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"RHEL with SQL Server Web\"\n                    }\n                },\n                \"RHEL_WITH_HA\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"RHEL with HA\"\n                    }\n                },\n                \"RHEL_WITH_HA_AND_SQL_SERVER_STANDARD\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"RHEL with HA and SQL Server Standard\"\n                    }\n                },\n                \"RHEL_WITH_HA_AND_SQL_SERVER_ENTERPRISE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"RHEL with HA and SQL Server Enterprise\"\n                    }\n                },\n                \"UBUNTU_PRO_LINUX\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Ubuntu Pro\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#CapacityReservationOptions\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"UsageStrategy\": {\n                    \"target\": \"com.amazonaws.ec2#FleetCapacityReservationUsageStrategy\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"UsageStrategy\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether to use unused Capacity Reservations for fulfilling On-Demand capacity.</p>\\n         <p>If you specify <code>use-capacity-reservations-first</code>, the fleet uses unused\\n         Capacity Reservations to fulfill On-Demand capacity up to the target On-Demand capacity. If\\n         multiple instance pools have unused Capacity Reservations, the On-Demand allocation\\n         strategy (<code>lowest-price</code> or <code>prioritized</code>) is applied. If the number\\n         of unused Capacity Reservations is less than the On-Demand target capacity, the remaining\\n         On-Demand target capacity is launched according to the On-Demand allocation strategy\\n            (<code>lowest-price</code> or <code>prioritized</code>).</p>\\n         <p>If you do not specify a value, the fleet fulfils the On-Demand capacity according to the\\n         chosen On-Demand allocation strategy.</p>\",\n                        \"smithy.api#xmlName\": \"usageStrategy\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the strategy for using unused Capacity Reservations for fulfilling On-Demand\\n         capacity.</p>\\n         <note>\\n            <p>This strategy can only be used if the EC2 Fleet is of type\\n            <code>instant</code>.</p>\\n         </note>\\n         <p>For more information about Capacity Reservations, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-capacity-reservations.html\\\">On-Demand Capacity\\n            Reservations</a> in the <i>Amazon EC2 User Guide</i>. For examples of using\\n         Capacity Reservations in an EC2 Fleet, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-fleet-examples.html\\\">EC2 Fleet example\\n            configurations</a> in the <i>Amazon EC2 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CapacityReservationOptionsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"UsageStrategy\": {\n                    \"target\": \"com.amazonaws.ec2#FleetCapacityReservationUsageStrategy\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether to use unused Capacity Reservations for fulfilling On-Demand capacity.</p>\\n         <p>If you specify <code>use-capacity-reservations-first</code>, the fleet uses unused\\n         Capacity Reservations to fulfill On-Demand capacity up to the target On-Demand capacity. If\\n         multiple instance pools have unused Capacity Reservations, the On-Demand allocation\\n         strategy (<code>lowest-price</code> or <code>prioritized</code>) is applied. If the number\\n         of unused Capacity Reservations is less than the On-Demand target capacity, the remaining\\n         On-Demand target capacity is launched according to the On-Demand allocation strategy\\n            (<code>lowest-price</code> or <code>prioritized</code>).</p>\\n         <p>If you do not specify a value, the fleet fulfils the On-Demand capacity according to the\\n         chosen On-Demand allocation strategy.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the strategy for using unused Capacity Reservations for fulfilling On-Demand\\n         capacity.</p>\\n         <note>\\n            <p>This strategy can only be used if the EC2 Fleet is of type <code>instant</code>.</p>\\n         </note>\\n         <p>For more information about Capacity Reservations, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-capacity-reservations.html\\\">On-Demand Capacity\\n            Reservations</a> in the <i>Amazon EC2 User Guide</i>. For examples of using\\n         Capacity Reservations in an EC2 Fleet, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-fleet-examples.html\\\">EC2 Fleet example\\n            configurations</a> in the <i>Amazon EC2 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CapacityReservationPreference\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"capacity_reservations_only\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"capacity-reservations-only\"\n                    }\n                },\n                \"open\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"open\"\n                    }\n                },\n                \"none\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"none\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#CapacityReservationSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#CapacityReservation\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#CapacityReservationSpecification\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CapacityReservationPreference\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityReservationPreference\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates the instance's Capacity Reservation preferences. Possible preferences\\n\\t\\t\\tinclude:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>capacity-reservations-only</code> - The instance will only run in a\\n\\t\\t\\t\\t\\tCapacity Reservation or Capacity Reservation group. If capacity isn't available,\\n\\t\\t\\t\\t\\tthe instance will fail to launch.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>open</code> - The instance can run in any <code>open</code> Capacity\\n\\t\\t\\t\\t\\tReservation that has matching attributes (instance type, platform, Availability\\n\\t\\t\\t\\t\\tZone, and tenancy). If capacity isn't available, the instance runs as an\\n\\t\\t\\t\\t\\tOn-Demand Instance.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>none</code> - The instance doesn't run in a Capacity Reservation even if\\n\\t\\t\\t\\t\\tone is available. The instance runs as an On-Demand Instance.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"CapacityReservationTarget\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityReservationTarget\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Information about the target Capacity Reservation or Capacity Reservation\\n\\t\\t\\tgroup.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes an instance's Capacity Reservation targeting option. </p>\\n         <p>Use the <code>CapacityReservationPreference</code> parameter to configure the instance\\n\\t\\t\\tto run as an On-Demand Instance, to run in any <code>open</code> Capacity Reservation\\n\\t\\t\\tthat has matching attributes, or to run only in a Capacity Reservation or Capacity\\n\\t\\t\\tReservation group. Use the <code>CapacityReservationTarget</code> parameter to\\n\\t\\t\\texplicitly target a specific Capacity Reservation or a Capacity Reservation\\n\\t\\t\\tgroup.</p>\\n         <p>You can only specify <code>CapacityReservationPreference</code> and\\n\\t\\t\\t\\t<code>CapacityReservationTarget</code> if the\\n\\t\\t\\t\\t<code>CapacityReservationPreference</code> is\\n\\t\\t\\t\\t<code>capacity-reservations-only</code>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CapacityReservationSpecificationResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CapacityReservationPreference\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityReservationPreference\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CapacityReservationPreference\",\n                        \"smithy.api#documentation\": \"<p>Describes the instance's Capacity Reservation preferences. Possible preferences include:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>open</code> - The instance can run in any <code>open</code> Capacity Reservation that\\n                    has matching attributes (instance type, platform, Availability Zone).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>none</code> - The instance avoids running in a Capacity Reservation even if one is\\n                    available. The instance runs in On-Demand capacity.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"capacityReservationPreference\"\n                    }\n                },\n                \"CapacityReservationTarget\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityReservationTargetResponse\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CapacityReservationTarget\",\n                        \"smithy.api#documentation\": \"<p>Information about the targeted Capacity Reservation or Capacity Reservation group.</p>\",\n                        \"smithy.api#xmlName\": \"capacityReservationTarget\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the instance's Capacity Reservation targeting preferences. The action returns the\\n                <code>capacityReservationPreference</code> response element if the instance is\\n            configured to run in On-Demand capacity, or if it is configured in run in any\\n                <code>open</code> Capacity Reservation that has matching attributes (instance type, platform,\\n            Availability Zone). The action returns the <code>capacityReservationTarget</code>\\n            response element if the instance explicily targets a specific Capacity Reservation or Capacity Reservation group.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CapacityReservationState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"active\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"active\"\n                    }\n                },\n                \"expired\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"expired\"\n                    }\n                },\n                \"cancelled\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"cancelled\"\n                    }\n                },\n                \"pending\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"pending\"\n                    }\n                },\n                \"failed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"failed\"\n                    }\n                },\n                \"scheduled\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"scheduled\"\n                    }\n                },\n                \"payment_pending\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"payment-pending\"\n                    }\n                },\n                \"payment_failed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"payment-failed\"\n                    }\n                },\n                \"assessing\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"assessing\"\n                    }\n                },\n                \"delayed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"delayed\"\n                    }\n                },\n                \"unsupported\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"unsupported\"\n                    }\n                },\n                \"unavailable\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"unavailable\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#CapacityReservationStatus\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CapacityReservationId\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityReservationId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CapacityReservationId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Capacity Reservation.</p>\",\n                        \"smithy.api#xmlName\": \"capacityReservationId\"\n                    }\n                },\n                \"TotalCapacity\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TotalCapacity\",\n                        \"smithy.api#documentation\": \"<p>The combined amount of <code>Available</code> and <code>Unavailable</code> capacity in the Capacity Reservation.</p>\",\n                        \"smithy.api#xmlName\": \"totalCapacity\"\n                    }\n                },\n                \"TotalAvailableCapacity\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TotalAvailableCapacity\",\n                        \"smithy.api#documentation\": \"<p>The remaining capacity. Indicates the amount of resources that can be launched into the Capacity Reservation.</p>\",\n                        \"smithy.api#xmlName\": \"totalAvailableCapacity\"\n                    }\n                },\n                \"TotalUnavailableCapacity\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TotalUnavailableCapacity\",\n                        \"smithy.api#documentation\": \"<p>The used capacity. Indicates that the capacity is in use by resources that are running in the Capacity Reservation.</p>\",\n                        \"smithy.api#xmlName\": \"totalUnavailableCapacity\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the availability of capacity for a Capacity Reservation.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CapacityReservationStatusSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#CapacityReservationStatus\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#CapacityReservationTarget\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CapacityReservationId\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityReservationId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the Capacity Reservation in which to run the instance.</p>\"\n                    }\n                },\n                \"CapacityReservationResourceGroupArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the Capacity Reservation resource group in which to run the\\n\\t\\t\\tinstance.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a target Capacity Reservation or Capacity Reservation group.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CapacityReservationTargetResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CapacityReservationId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CapacityReservationId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the targeted Capacity Reservation.</p>\",\n                        \"smithy.api#xmlName\": \"capacityReservationId\"\n                    }\n                },\n                \"CapacityReservationResourceGroupArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CapacityReservationResourceGroupArn\",\n                        \"smithy.api#documentation\": \"<p>The ARN of the targeted Capacity Reservation group.</p>\",\n                        \"smithy.api#xmlName\": \"capacityReservationResourceGroupArn\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a target Capacity Reservation or Capacity Reservation group.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CapacityReservationTenancy\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"default\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"default\"\n                    }\n                },\n                \"dedicated\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"dedicated\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#CapacityReservationType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"DEFAULT\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"default\"\n                    }\n                },\n                \"CAPACITY_BLOCK\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"capacity-block\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#CarrierGateway\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CarrierGatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#CarrierGatewayId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CarrierGatewayId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the carrier gateway.</p>\",\n                        \"smithy.api#xmlName\": \"carrierGatewayId\"\n                    }\n                },\n                \"VpcId\": {\n                    \"target\": \"com.amazonaws.ec2#VpcId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the VPC associated with the carrier gateway.</p>\",\n                        \"smithy.api#xmlName\": \"vpcId\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#CarrierGatewayState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The state of the carrier gateway.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                },\n                \"OwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OwnerId\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID of the owner of the carrier gateway.</p>\",\n                        \"smithy.api#xmlName\": \"ownerId\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>The tags assigned to the carrier gateway.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a carrier gateway.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CarrierGatewayId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#CarrierGatewayIdSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#CarrierGatewayId\"\n            }\n        },\n        \"com.amazonaws.ec2#CarrierGatewayMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 5,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.ec2#CarrierGatewaySet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#CarrierGateway\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#CarrierGatewayState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"pending\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"pending\"\n                    }\n                },\n                \"available\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"available\"\n                    }\n                },\n                \"deleting\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"deleting\"\n                    }\n                },\n                \"deleted\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"deleted\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#CertificateArn\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#CertificateAuthentication\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ClientRootCertificateChain\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ClientRootCertificateChain\",\n                        \"smithy.api#documentation\": \"<p>The ARN of the client certificate. </p>\",\n                        \"smithy.api#xmlName\": \"clientRootCertificateChain\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about the client certificate used for authentication.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CertificateAuthenticationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ClientRootCertificateChainArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the client certificate. The certificate must be signed by a certificate \\n\\t\\t\\tauthority (CA) and it must be provisioned in Certificate Manager (ACM).</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about the client certificate to be used for authentication.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CertificateId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#CidrAuthorizationContext\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Message\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The plain-text authorization message for the prefix and account.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Signature\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The signed authorization message for the prefix and account.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Provides authorization for Amazon to bring a specific IP address range to a specific\\n          Amazon Web Services account using bring your own IP addresses (BYOIP). For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-byoip.html#prepare-for-byoip\\\">Configuring your BYOIP address range</a> in the <i>Amazon EC2 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CidrBlock\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CidrBlock\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CidrBlock\",\n                        \"smithy.api#documentation\": \"<p>The IPv4 CIDR block.</p>\",\n                        \"smithy.api#xmlName\": \"cidrBlock\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes an IPv4 CIDR block.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CidrBlockSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#CidrBlock\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ClassicLinkDnsSupport\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ClassicLinkDnsSupported\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ClassicLinkDnsSupported\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether ClassicLink DNS support is enabled for the VPC.</p>\",\n                        \"smithy.api#xmlName\": \"classicLinkDnsSupported\"\n                    }\n                },\n                \"VpcId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the VPC.</p>\",\n                        \"smithy.api#xmlName\": \"vpcId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>Deprecated.</p>\\n         </note>\\n         <p>Describes the ClassicLink DNS support status of a VPC.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ClassicLinkDnsSupportList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ClassicLinkDnsSupport\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ClassicLinkInstance\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Groups\": {\n                    \"target\": \"com.amazonaws.ec2#GroupIdentifierList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"GroupSet\",\n                        \"smithy.api#documentation\": \"<p>The security groups.</p>\",\n                        \"smithy.api#xmlName\": \"groupSet\"\n                    }\n                },\n                \"InstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the instance.</p>\",\n                        \"smithy.api#xmlName\": \"instanceId\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>Any tags assigned to the instance.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                },\n                \"VpcId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the VPC.</p>\",\n                        \"smithy.api#xmlName\": \"vpcId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>Deprecated.</p>\\n         </note>\\n         <p>Describes a linked EC2-Classic instance.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ClassicLinkInstanceList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ClassicLinkInstance\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ClassicLoadBalancer\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Name\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Name\",\n                        \"smithy.api#documentation\": \"<p>The name of the load balancer.</p>\",\n                        \"smithy.api#xmlName\": \"name\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a Classic Load Balancer.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ClassicLoadBalancers\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ClassicLoadBalancer\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 5\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ClassicLoadBalancersConfig\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ClassicLoadBalancers\": {\n                    \"target\": \"com.amazonaws.ec2#ClassicLoadBalancers\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ClassicLoadBalancers\",\n                        \"smithy.api#documentation\": \"<p>One or more Classic Load Balancers.</p>\",\n                        \"smithy.api#xmlName\": \"classicLoadBalancers\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the Classic Load Balancers to attach to a Spot Fleet. Spot Fleet registers\\n            the running Spot Instances with these Classic Load Balancers.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ClientCertificateRevocationListStatus\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Code\": {\n                    \"target\": \"com.amazonaws.ec2#ClientCertificateRevocationListStatusCode\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Code\",\n                        \"smithy.api#documentation\": \"<p>The state of the client certificate revocation list.</p>\",\n                        \"smithy.api#xmlName\": \"code\"\n                    }\n                },\n                \"Message\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Message\",\n                        \"smithy.api#documentation\": \"<p>A message about the status of the client certificate revocation list, if applicable.</p>\",\n                        \"smithy.api#xmlName\": \"message\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the state of a client certificate revocation list.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ClientCertificateRevocationListStatusCode\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"pending\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"pending\"\n                    }\n                },\n                \"active\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"active\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ClientConnectOptions\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Enabled\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether client connect options are enabled. The default is <code>false</code> (not enabled).</p>\"\n                    }\n                },\n                \"LambdaFunctionArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the Lambda function used for connection authorization.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The options for managing connection authorization for new client connections.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ClientConnectResponseOptions\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Enabled\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Enabled\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether client connect options are enabled.</p>\",\n                        \"smithy.api#xmlName\": \"enabled\"\n                    }\n                },\n                \"LambdaFunctionArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LambdaFunctionArn\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the Lambda function used for connection authorization.</p>\",\n                        \"smithy.api#xmlName\": \"lambdaFunctionArn\"\n                    }\n                },\n                \"Status\": {\n                    \"target\": \"com.amazonaws.ec2#ClientVpnEndpointAttributeStatus\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Status\",\n                        \"smithy.api#documentation\": \"<p>The status of any updates to the client connect options.</p>\",\n                        \"smithy.api#xmlName\": \"status\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The options for managing connection authorization for new client connections.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ClientData\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Comment\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A user-defined comment about the disk upload.</p>\"\n                    }\n                },\n                \"UploadEnd\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time that the disk upload ends.</p>\"\n                    }\n                },\n                \"UploadSize\": {\n                    \"target\": \"com.amazonaws.ec2#Double\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The size of the uploaded disk image, in GiB.</p>\"\n                    }\n                },\n                \"UploadStart\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time that the disk upload starts.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the client-specific data.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ClientLoginBannerOptions\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Enabled\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Enable or disable a customizable text banner that will be displayed on\\n\\t\\t\\tAmazon Web Services provided clients when a VPN session is established.</p>\\n         <p>Valid values: <code>true | false</code>\\n         </p>\\n         <p>Default value: <code>false</code>\\n         </p>\"\n                    }\n                },\n                \"BannerText\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Customizable text that will be displayed in a banner on Amazon Web Services provided\\n\\t\\t\\tclients when a VPN session is established. UTF-8 encoded characters only. Maximum of\\n\\t\\t\\t1400 characters.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Options for enabling a customizable text banner that will be displayed on\\n\\t\\t\\tAmazon Web Services provided clients when a VPN session is established.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ClientLoginBannerResponseOptions\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Enabled\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Enabled\",\n                        \"smithy.api#documentation\": \"<p>Current state of text banner feature.</p>\\n         <p>Valid values: <code>true | false</code>\\n         </p>\",\n                        \"smithy.api#xmlName\": \"enabled\"\n                    }\n                },\n                \"BannerText\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"BannerText\",\n                        \"smithy.api#documentation\": \"<p>Customizable text that will be displayed in a banner on Amazon Web Services provided\\n\\t\\t\\tclients when a VPN session is established. UTF-8 encoded\\n\\t\\t\\tcharacters only. Maximum of 1400 characters.</p>\",\n                        \"smithy.api#xmlName\": \"bannerText\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Current state of options for customizable text banner that will be displayed on\\n\\t\\t\\tAmazon Web Services provided clients when a VPN session is established.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ClientRouteEnforcementOptions\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Enforced\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Enable or disable Client Route Enforcement. The state can either be <code>true</code>\\n\\t\\t\\t(enabled) or <code>false</code> (disabled). The default is <code>false</code>.</p>\\n         <p>Valid values: <code>true | false</code>\\n         </p>\\n         <p>Default value: <code>false</code>\\n         </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Client Route Enforcement is a feature of Client VPN that helps enforce administrator defined\\n\\t\\t\\troutes on devices connected through the VPN. This feature helps improve your security\\n\\t\\t\\tposture by ensuring that network traffic originating from a connected client is not\\n\\t\\t\\tinadvertently sent outside the VPN tunnel.</p>\\n         <p>Client Route Enforcement works by monitoring the route table of a connected device for\\n\\t\\t\\trouting policy changes to the VPN connection. If the feature detects any VPN routing\\n\\t\\t\\tpolicy modifications, it will automatically force an update to the route table,\\n\\t\\t\\treverting it back to the expected route configurations.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ClientRouteEnforcementResponseOptions\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Enforced\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Enforced\",\n                        \"smithy.api#documentation\": \"<p>Status of the client route enforcement feature, indicating whether Client Route Enforcement\\n\\t\\t\\tis <code>true</code> (enabled) or <code>false</code> (disabled).</p>\\n         <p>Valid values: <code>true | false</code>\\n         </p>\\n         <p>Default value: <code>false</code>\\n         </p>\",\n                        \"smithy.api#xmlName\": \"enforced\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The current status of Client Route Enforcement. </p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ClientSecretType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#sensitive\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ClientVpnAuthentication\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Type\": {\n                    \"target\": \"com.amazonaws.ec2#ClientVpnAuthenticationType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Type\",\n                        \"smithy.api#documentation\": \"<p>The authentication type used.</p>\",\n                        \"smithy.api#xmlName\": \"type\"\n                    }\n                },\n                \"ActiveDirectory\": {\n                    \"target\": \"com.amazonaws.ec2#DirectoryServiceAuthentication\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ActiveDirectory\",\n                        \"smithy.api#documentation\": \"<p>Information about the Active Directory, if applicable.</p>\",\n                        \"smithy.api#xmlName\": \"activeDirectory\"\n                    }\n                },\n                \"MutualAuthentication\": {\n                    \"target\": \"com.amazonaws.ec2#CertificateAuthentication\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MutualAuthentication\",\n                        \"smithy.api#documentation\": \"<p>Information about the authentication certificates, if applicable.</p>\",\n                        \"smithy.api#xmlName\": \"mutualAuthentication\"\n                    }\n                },\n                \"FederatedAuthentication\": {\n                    \"target\": \"com.amazonaws.ec2#FederatedAuthentication\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"FederatedAuthentication\",\n                        \"smithy.api#documentation\": \"<p>Information about the IAM SAML identity provider, if applicable.</p>\",\n                        \"smithy.api#xmlName\": \"federatedAuthentication\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the authentication methods used by a Client VPN endpoint. For more information, see <a href=\\\"https://docs.aws.amazon.com/vpn/latest/clientvpn-admin/client-authentication.html\\\">Authentication</a> \\n\\t\\t\\tin the <i>Client VPN Administrator Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ClientVpnAuthenticationList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ClientVpnAuthentication\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ClientVpnAuthenticationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Type\": {\n                    \"target\": \"com.amazonaws.ec2#ClientVpnAuthenticationType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of client authentication to be used.</p>\"\n                    }\n                },\n                \"ActiveDirectory\": {\n                    \"target\": \"com.amazonaws.ec2#DirectoryServiceAuthenticationRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Information about the Active Directory to be used, if applicable. You must provide this information if <b>Type</b> is <code>directory-service-authentication</code>.</p>\"\n                    }\n                },\n                \"MutualAuthentication\": {\n                    \"target\": \"com.amazonaws.ec2#CertificateAuthenticationRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Information about the authentication certificates to be used, if applicable. You must provide this information if <b>Type</b> is <code>certificate-authentication</code>.</p>\"\n                    }\n                },\n                \"FederatedAuthentication\": {\n                    \"target\": \"com.amazonaws.ec2#FederatedAuthenticationRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Information about the IAM SAML identity provider to be used, if applicable. You must provide this information if <b>Type</b> is <code>federated-authentication</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the authentication method to be used by a Client VPN endpoint. For more information, see <a href=\\\"https://docs.aws.amazon.com/vpn/latest/clientvpn-admin/authentication-authrization.html#client-authentication\\\">Authentication</a> \\n\\t\\t\\tin the <i>Client VPN Administrator Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ClientVpnAuthenticationRequestList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ClientVpnAuthenticationRequest\"\n            }\n        },\n        \"com.amazonaws.ec2#ClientVpnAuthenticationType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"certificate_authentication\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"certificate-authentication\"\n                    }\n                },\n                \"directory_service_authentication\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"directory-service-authentication\"\n                    }\n                },\n                \"federated_authentication\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"federated-authentication\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ClientVpnAuthorizationRuleStatus\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Code\": {\n                    \"target\": \"com.amazonaws.ec2#ClientVpnAuthorizationRuleStatusCode\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Code\",\n                        \"smithy.api#documentation\": \"<p>The state of the authorization rule.</p>\",\n                        \"smithy.api#xmlName\": \"code\"\n                    }\n                },\n                \"Message\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Message\",\n                        \"smithy.api#documentation\": \"<p>A message about the status of the authorization rule, if applicable.</p>\",\n                        \"smithy.api#xmlName\": \"message\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the state of an authorization rule.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ClientVpnAuthorizationRuleStatusCode\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"authorizing\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"authorizing\"\n                    }\n                },\n                \"active\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"active\"\n                    }\n                },\n                \"failed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"failed\"\n                    }\n                },\n                \"revoking\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"revoking\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ClientVpnConnection\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ClientVpnEndpointId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ClientVpnEndpointId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Client VPN endpoint to which the client is connected.</p>\",\n                        \"smithy.api#xmlName\": \"clientVpnEndpointId\"\n                    }\n                },\n                \"Timestamp\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Timestamp\",\n                        \"smithy.api#documentation\": \"<p>The current date and time.</p>\",\n                        \"smithy.api#xmlName\": \"timestamp\"\n                    }\n                },\n                \"ConnectionId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ConnectionId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the client connection.</p>\",\n                        \"smithy.api#xmlName\": \"connectionId\"\n                    }\n                },\n                \"Username\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Username\",\n                        \"smithy.api#documentation\": \"<p>The username of the client who established the client connection. This information is only provided \\n\\t\\t\\tif Active Directory client authentication is used.</p>\",\n                        \"smithy.api#xmlName\": \"username\"\n                    }\n                },\n                \"ConnectionEstablishedTime\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ConnectionEstablishedTime\",\n                        \"smithy.api#documentation\": \"<p>The date and time the client connection was established.</p>\",\n                        \"smithy.api#xmlName\": \"connectionEstablishedTime\"\n                    }\n                },\n                \"IngressBytes\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IngressBytes\",\n                        \"smithy.api#documentation\": \"<p>The number of bytes sent by the client.</p>\",\n                        \"smithy.api#xmlName\": \"ingressBytes\"\n                    }\n                },\n                \"EgressBytes\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EgressBytes\",\n                        \"smithy.api#documentation\": \"<p>The number of bytes received by the client.</p>\",\n                        \"smithy.api#xmlName\": \"egressBytes\"\n                    }\n                },\n                \"IngressPackets\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IngressPackets\",\n                        \"smithy.api#documentation\": \"<p>The number of packets sent by the client.</p>\",\n                        \"smithy.api#xmlName\": \"ingressPackets\"\n                    }\n                },\n                \"EgressPackets\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EgressPackets\",\n                        \"smithy.api#documentation\": \"<p>The number of packets received by the client.</p>\",\n                        \"smithy.api#xmlName\": \"egressPackets\"\n                    }\n                },\n                \"ClientIp\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ClientIp\",\n                        \"smithy.api#documentation\": \"<p>The IP address of the client.</p>\",\n                        \"smithy.api#xmlName\": \"clientIp\"\n                    }\n                },\n                \"ClientIpv6Address\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ClientIpv6Address\",\n                        \"smithy.api#documentation\": \"<p>The IPv6 address assigned to the client connection when using a dual-stack Client VPN endpoint. This field is only populated when the endpoint is configured for dual-stack addressing, and the client is using IPv6 for connectivity.</p>\",\n                        \"smithy.api#xmlName\": \"clientIpv6Address\"\n                    }\n                },\n                \"CommonName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CommonName\",\n                        \"smithy.api#documentation\": \"<p>The common name associated with the client. This is either the name of the client certificate,\\n\\t\\t\\tor the Active Directory user name.</p>\",\n                        \"smithy.api#xmlName\": \"commonName\"\n                    }\n                },\n                \"Status\": {\n                    \"target\": \"com.amazonaws.ec2#ClientVpnConnectionStatus\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Status\",\n                        \"smithy.api#documentation\": \"<p>The current state of the client connection.</p>\",\n                        \"smithy.api#xmlName\": \"status\"\n                    }\n                },\n                \"ConnectionEndTime\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ConnectionEndTime\",\n                        \"smithy.api#documentation\": \"<p>The date and time the client connection was terminated.</p>\",\n                        \"smithy.api#xmlName\": \"connectionEndTime\"\n                    }\n                },\n                \"PostureComplianceStatuses\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PostureComplianceStatusSet\",\n                        \"smithy.api#documentation\": \"<p>The statuses returned by the client connect handler for posture compliance, if applicable.</p>\",\n                        \"smithy.api#xmlName\": \"postureComplianceStatusSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a client connection.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ClientVpnConnectionSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ClientVpnConnection\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ClientVpnConnectionStatus\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Code\": {\n                    \"target\": \"com.amazonaws.ec2#ClientVpnConnectionStatusCode\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Code\",\n                        \"smithy.api#documentation\": \"<p>The state of the client connection.</p>\",\n                        \"smithy.api#xmlName\": \"code\"\n                    }\n                },\n                \"Message\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Message\",\n                        \"smithy.api#documentation\": \"<p>A message about the status of the client connection, if applicable.</p>\",\n                        \"smithy.api#xmlName\": \"message\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the status of a client connection.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ClientVpnConnectionStatusCode\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"active\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"active\"\n                    }\n                },\n                \"failed_to_terminate\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"failed-to-terminate\"\n                    }\n                },\n                \"terminating\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"terminating\"\n                    }\n                },\n                \"terminated\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"terminated\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ClientVpnEndpoint\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ClientVpnEndpointId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ClientVpnEndpointId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Client VPN endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"clientVpnEndpointId\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Description\",\n                        \"smithy.api#documentation\": \"<p>A brief description of the endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"description\"\n                    }\n                },\n                \"Status\": {\n                    \"target\": \"com.amazonaws.ec2#ClientVpnEndpointStatus\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Status\",\n                        \"smithy.api#documentation\": \"<p>The current state of the Client VPN endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"status\"\n                    }\n                },\n                \"CreationTime\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CreationTime\",\n                        \"smithy.api#documentation\": \"<p>The date and time the Client VPN endpoint was created.</p>\",\n                        \"smithy.api#xmlName\": \"creationTime\"\n                    }\n                },\n                \"DeletionTime\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DeletionTime\",\n                        \"smithy.api#documentation\": \"<p>The date and time the Client VPN endpoint was deleted, if applicable.</p>\",\n                        \"smithy.api#xmlName\": \"deletionTime\"\n                    }\n                },\n                \"DnsName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DnsName\",\n                        \"smithy.api#documentation\": \"<p>The DNS name to be used by clients when connecting to the Client VPN endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"dnsName\"\n                    }\n                },\n                \"ClientCidrBlock\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ClientCidrBlock\",\n                        \"smithy.api#documentation\": \"<p>The IPv4 address range, in CIDR notation, from which client IP addresses are assigned.</p>\",\n                        \"smithy.api#xmlName\": \"clientCidrBlock\"\n                    }\n                },\n                \"DnsServers\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DnsServer\",\n                        \"smithy.api#documentation\": \"<p>Information about the DNS servers to be used for DNS resolution. </p>\",\n                        \"smithy.api#xmlName\": \"dnsServer\"\n                    }\n                },\n                \"SplitTunnel\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SplitTunnel\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether split-tunnel is enabled in the Client VPN endpoint.</p>\\n         <p>For information about split-tunnel VPN endpoints, see <a href=\\\"https://docs.aws.amazon.com/vpn/latest/clientvpn-admin/split-tunnel-vpn.html\\\">Split-Tunnel Client VPN endpoint</a> \\n\\t\\t\\tin the <i>Client VPN Administrator Guide</i>.</p>\",\n                        \"smithy.api#xmlName\": \"splitTunnel\"\n                    }\n                },\n                \"VpnProtocol\": {\n                    \"target\": \"com.amazonaws.ec2#VpnProtocol\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpnProtocol\",\n                        \"smithy.api#documentation\": \"<p>The protocol used by the VPN session.</p>\",\n                        \"smithy.api#xmlName\": \"vpnProtocol\"\n                    }\n                },\n                \"TransportProtocol\": {\n                    \"target\": \"com.amazonaws.ec2#TransportProtocol\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransportProtocol\",\n                        \"smithy.api#documentation\": \"<p>The transport protocol used by the Client VPN endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"transportProtocol\"\n                    }\n                },\n                \"VpnPort\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpnPort\",\n                        \"smithy.api#documentation\": \"<p>The port number for the  Client VPN endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"vpnPort\"\n                    }\n                },\n                \"AssociatedTargetNetworks\": {\n                    \"target\": \"com.amazonaws.ec2#AssociatedTargetNetworkSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AssociatedTargetNetwork\",\n                        \"smithy.api#deprecated\": {\n                            \"message\": \"This property is deprecated. To view the target networks associated with a Client VPN endpoint, call DescribeClientVpnTargetNetworks and inspect the clientVpnTargetNetworks response element.\"\n                        },\n                        \"smithy.api#documentation\": \"<p>Information about the associated target networks. A target network is a subnet in a VPC.</p>\",\n                        \"smithy.api#xmlName\": \"associatedTargetNetwork\"\n                    }\n                },\n                \"ServerCertificateArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ServerCertificateArn\",\n                        \"smithy.api#documentation\": \"<p>The ARN of the server certificate.</p>\",\n                        \"smithy.api#xmlName\": \"serverCertificateArn\"\n                    }\n                },\n                \"AuthenticationOptions\": {\n                    \"target\": \"com.amazonaws.ec2#ClientVpnAuthenticationList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AuthenticationOptions\",\n                        \"smithy.api#documentation\": \"<p>Information about the authentication method used by the Client VPN endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"authenticationOptions\"\n                    }\n                },\n                \"ConnectionLogOptions\": {\n                    \"target\": \"com.amazonaws.ec2#ConnectionLogResponseOptions\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ConnectionLogOptions\",\n                        \"smithy.api#documentation\": \"<p>Information about the client connection logging options for the Client VPN endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"connectionLogOptions\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>Any tags assigned to the Client VPN endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                },\n                \"SecurityGroupIds\": {\n                    \"target\": \"com.amazonaws.ec2#ClientVpnSecurityGroupIdSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SecurityGroupIdSet\",\n                        \"smithy.api#documentation\": \"<p>The IDs of the security groups for the target network.</p>\",\n                        \"smithy.api#xmlName\": \"securityGroupIdSet\"\n                    }\n                },\n                \"VpcId\": {\n                    \"target\": \"com.amazonaws.ec2#VpcId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the VPC.</p>\",\n                        \"smithy.api#xmlName\": \"vpcId\"\n                    }\n                },\n                \"SelfServicePortalUrl\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SelfServicePortalUrl\",\n                        \"smithy.api#documentation\": \"<p>The URL of the self-service portal.</p>\",\n                        \"smithy.api#xmlName\": \"selfServicePortalUrl\"\n                    }\n                },\n                \"ClientConnectOptions\": {\n                    \"target\": \"com.amazonaws.ec2#ClientConnectResponseOptions\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ClientConnectOptions\",\n                        \"smithy.api#documentation\": \"<p>The options for managing connection authorization for new client connections.</p>\",\n                        \"smithy.api#xmlName\": \"clientConnectOptions\"\n                    }\n                },\n                \"SessionTimeoutHours\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SessionTimeoutHours\",\n                        \"smithy.api#documentation\": \"<p>The maximum VPN session duration time in hours.</p>\\n         <p>Valid values: <code>8 | 10 | 12 | 24</code>\\n         </p>\\n         <p>Default value: <code>24</code>\\n         </p>\",\n                        \"smithy.api#xmlName\": \"sessionTimeoutHours\"\n                    }\n                },\n                \"ClientLoginBannerOptions\": {\n                    \"target\": \"com.amazonaws.ec2#ClientLoginBannerResponseOptions\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ClientLoginBannerOptions\",\n                        \"smithy.api#documentation\": \"<p>Options for enabling a customizable text banner that will be displayed on Amazon Web Services provided clients when a VPN session is\\n\\t\\t\\testablished.</p>\",\n                        \"smithy.api#xmlName\": \"clientLoginBannerOptions\"\n                    }\n                },\n                \"ClientRouteEnforcementOptions\": {\n                    \"target\": \"com.amazonaws.ec2#ClientRouteEnforcementResponseOptions\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ClientRouteEnforcementOptions\",\n                        \"smithy.api#documentation\": \"<p>Client route enforcement is a feature of the Client VPN service that helps enforce administrator defined routes on devices connected through the VPN. T\\n\\t\\this feature helps improve your security posture by ensuring that network traffic originating from a connected client is not inadvertently sent outside the VPN tunnel.</p>\\n         <p>Client route enforcement works by monitoring the route table of a connected device for routing policy changes to the VPN connection. If the feature detects any VPN routing policy modifications, it will automatically force an update to the route table, \\n\\t\\t\\treverting it back to the expected route configurations.</p>\",\n                        \"smithy.api#xmlName\": \"clientRouteEnforcementOptions\"\n                    }\n                },\n                \"DisconnectOnSessionTimeout\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DisconnectOnSessionTimeout\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether the client VPN session is disconnected after the maximum <code>sessionTimeoutHours</code> is reached. If <code>true</code>, users are prompted to reconnect client VPN. If <code>false</code>, client VPN attempts to reconnect automatically. The default value is <code>true</code>.</p>\",\n                        \"smithy.api#xmlName\": \"disconnectOnSessionTimeout\"\n                    }\n                },\n                \"EndpointIpAddressType\": {\n                    \"target\": \"com.amazonaws.ec2#EndpointIpAddressType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EndpointIpAddressType\",\n                        \"smithy.api#documentation\": \"<p>The IP address type of the Client VPN endpoint. Possible values are <code>ipv4</code> for IPv4 addressing only, <code>ipv6</code> for IPv6 addressing only, or <code>dual-stack </code>for both IPv4 and IPv6 addressing.</p>\",\n                        \"smithy.api#xmlName\": \"endpointIpAddressType\"\n                    }\n                },\n                \"TrafficIpAddressType\": {\n                    \"target\": \"com.amazonaws.ec2#TrafficIpAddressType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TrafficIpAddressType\",\n                        \"smithy.api#documentation\": \"<p>The IP address type of the Client VPN endpoint. Possible values are either <code>ipv4</code> for IPv4 addressing only, <code>ipv6</code> for IPv6 addressing only, or <code>dual-stack</code> for both IPv4 and IPv6 addressing.</p>\",\n                        \"smithy.api#xmlName\": \"trafficIpAddressType\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a Client VPN endpoint.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ClientVpnEndpointAttributeStatus\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Code\": {\n                    \"target\": \"com.amazonaws.ec2#ClientVpnEndpointAttributeStatusCode\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Code\",\n                        \"smithy.api#documentation\": \"<p>The status code.</p>\",\n                        \"smithy.api#xmlName\": \"code\"\n                    }\n                },\n                \"Message\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Message\",\n                        \"smithy.api#documentation\": \"<p>The status message.</p>\",\n                        \"smithy.api#xmlName\": \"message\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the status of the Client VPN endpoint attribute.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ClientVpnEndpointAttributeStatusCode\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"applying\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"applying\"\n                    }\n                },\n                \"applied\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"applied\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ClientVpnEndpointId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#ClientVpnEndpointIdList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ClientVpnEndpointId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ClientVpnEndpointStatus\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Code\": {\n                    \"target\": \"com.amazonaws.ec2#ClientVpnEndpointStatusCode\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Code\",\n                        \"smithy.api#documentation\": \"<p>The state of the Client VPN endpoint. Possible states include:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>pending-associate</code> - The Client VPN endpoint has been created but no target networks \\n\\t\\t\\t\\t\\thave been associated. The Client VPN endpoint cannot accept connections.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>available</code> - The Client VPN endpoint has been created and a target network has been\\n\\t\\t\\t\\t\\tassociated. The Client VPN endpoint can accept connections.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>deleting</code> - The Client VPN endpoint is being deleted. The Client VPN endpoint cannot accept\\n\\t\\t\\t\\t\\tconnections.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>deleted</code> - The Client VPN endpoint has been deleted. The Client VPN endpoint cannot accept\\n\\t\\t\\t\\t\\tconnections.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"code\"\n                    }\n                },\n                \"Message\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Message\",\n                        \"smithy.api#documentation\": \"<p>A message about the status of the Client VPN endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"message\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the state of a Client VPN endpoint.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ClientVpnEndpointStatusCode\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"pending_associate\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"pending-associate\"\n                    }\n                },\n                \"available\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"available\"\n                    }\n                },\n                \"deleting\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"deleting\"\n                    }\n                },\n                \"deleted\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"deleted\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ClientVpnRoute\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ClientVpnEndpointId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ClientVpnEndpointId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Client VPN endpoint with which the route is associated.</p>\",\n                        \"smithy.api#xmlName\": \"clientVpnEndpointId\"\n                    }\n                },\n                \"DestinationCidr\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DestinationCidr\",\n                        \"smithy.api#documentation\": \"<p>The IPv4 address range, in CIDR notation, of the route destination.</p>\",\n                        \"smithy.api#xmlName\": \"destinationCidr\"\n                    }\n                },\n                \"TargetSubnet\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TargetSubnet\",\n                        \"smithy.api#documentation\": \"<p>The ID of the subnet through which traffic is routed.</p>\",\n                        \"smithy.api#xmlName\": \"targetSubnet\"\n                    }\n                },\n                \"Type\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Type\",\n                        \"smithy.api#documentation\": \"<p>The route type.</p>\",\n                        \"smithy.api#xmlName\": \"type\"\n                    }\n                },\n                \"Origin\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Origin\",\n                        \"smithy.api#documentation\": \"<p>Indicates how the route was associated with the Client VPN endpoint. \\n\\t\\t\\t<code>associate</code> indicates that the route was automatically added when the target network \\n\\t\\t\\twas associated with the Client VPN endpoint. <code>add-route</code> indicates that the route \\n\\t\\t\\twas manually added using the <b>CreateClientVpnRoute</b> action.</p>\",\n                        \"smithy.api#xmlName\": \"origin\"\n                    }\n                },\n                \"Status\": {\n                    \"target\": \"com.amazonaws.ec2#ClientVpnRouteStatus\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Status\",\n                        \"smithy.api#documentation\": \"<p>The current state of the route.</p>\",\n                        \"smithy.api#xmlName\": \"status\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Description\",\n                        \"smithy.api#documentation\": \"<p>A brief description of the route.</p>\",\n                        \"smithy.api#xmlName\": \"description\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about a Client VPN endpoint route.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ClientVpnRouteSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ClientVpnRoute\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ClientVpnRouteStatus\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Code\": {\n                    \"target\": \"com.amazonaws.ec2#ClientVpnRouteStatusCode\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Code\",\n                        \"smithy.api#documentation\": \"<p>The state of the Client VPN endpoint route.</p>\",\n                        \"smithy.api#xmlName\": \"code\"\n                    }\n                },\n                \"Message\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Message\",\n                        \"smithy.api#documentation\": \"<p>A message about the status of the Client VPN endpoint route, if applicable.</p>\",\n                        \"smithy.api#xmlName\": \"message\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the state of a Client VPN endpoint route.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ClientVpnRouteStatusCode\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"creating\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"creating\"\n                    }\n                },\n                \"active\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"active\"\n                    }\n                },\n                \"failed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"failed\"\n                    }\n                },\n                \"deleting\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"deleting\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ClientVpnSecurityGroupIdSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#SecurityGroupId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#CloudWatchLogGroupArn\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#CloudWatchLogOptions\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LogEnabled\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LogEnabled\",\n                        \"smithy.api#documentation\": \"<p>Status of VPN tunnel logging feature. Default value is <code>False</code>.</p>\\n         <p>Valid values: <code>True</code> | <code>False</code>\\n         </p>\",\n                        \"smithy.api#xmlName\": \"logEnabled\"\n                    }\n                },\n                \"LogGroupArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LogGroupArn\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the CloudWatch log group to send logs to.</p>\",\n                        \"smithy.api#xmlName\": \"logGroupArn\"\n                    }\n                },\n                \"LogOutputFormat\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LogOutputFormat\",\n                        \"smithy.api#documentation\": \"<p>Configured log format. Default format is <code>json</code>.</p>\\n         <p>Valid values: <code>json</code> | <code>text</code>\\n         </p>\",\n                        \"smithy.api#xmlName\": \"logOutputFormat\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Options for sending VPN tunnel logs to CloudWatch.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CloudWatchLogOptionsSpecification\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LogEnabled\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Enable or disable VPN tunnel logging feature. Default value is <code>False</code>.</p>\\n         <p>Valid values: <code>True</code> | <code>False</code>\\n         </p>\"\n                    }\n                },\n                \"LogGroupArn\": {\n                    \"target\": \"com.amazonaws.ec2#CloudWatchLogGroupArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the CloudWatch log group to send logs to.</p>\"\n                    }\n                },\n                \"LogOutputFormat\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Set log format. Default format is <code>json</code>.</p>\\n         <p>Valid values: <code>json</code> | <code>text</code>\\n         </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Options for sending VPN tunnel logs to CloudWatch.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CoipAddressUsage\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AllocationId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AllocationId\",\n                        \"smithy.api#documentation\": \"<p>The allocation ID of the address.</p>\",\n                        \"smithy.api#xmlName\": \"allocationId\"\n                    }\n                },\n                \"AwsAccountId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AwsAccountId\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID.</p>\",\n                        \"smithy.api#xmlName\": \"awsAccountId\"\n                    }\n                },\n                \"AwsService\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AwsService\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services service.</p>\",\n                        \"smithy.api#xmlName\": \"awsService\"\n                    }\n                },\n                \"CoIp\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CoIp\",\n                        \"smithy.api#documentation\": \"<p>The customer-owned IP address.</p>\",\n                        \"smithy.api#xmlName\": \"coIp\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes address usage for a customer-owned address pool.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CoipAddressUsageSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#CoipAddressUsage\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#CoipCidr\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Cidr\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Cidr\",\n                        \"smithy.api#documentation\": \"<p>\\n      An address range in a customer-owned IP address space.\\n      </p>\",\n                        \"smithy.api#xmlName\": \"cidr\"\n                    }\n                },\n                \"CoipPoolId\": {\n                    \"target\": \"com.amazonaws.ec2#Ipv4PoolCoipId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CoipPoolId\",\n                        \"smithy.api#documentation\": \"<p>\\n         The ID of the address pool.\\n      </p>\",\n                        \"smithy.api#xmlName\": \"coipPoolId\"\n                    }\n                },\n                \"LocalGatewayRouteTableId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LocalGatewayRouteTableId\",\n                        \"smithy.api#documentation\": \"<p>\\n      The ID of the local gateway route table.\\n      </p>\",\n                        \"smithy.api#xmlName\": \"localGatewayRouteTableId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>\\n      Information about a customer-owned IP address range.\\n      </p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CoipPool\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PoolId\": {\n                    \"target\": \"com.amazonaws.ec2#Ipv4PoolCoipId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PoolId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the address pool.</p>\",\n                        \"smithy.api#xmlName\": \"poolId\"\n                    }\n                },\n                \"PoolCidrs\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PoolCidrSet\",\n                        \"smithy.api#documentation\": \"<p>The address ranges of the address pool.</p>\",\n                        \"smithy.api#xmlName\": \"poolCidrSet\"\n                    }\n                },\n                \"LocalGatewayRouteTableId\": {\n                    \"target\": \"com.amazonaws.ec2#LocalGatewayRoutetableId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LocalGatewayRouteTableId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the local gateway route table.</p>\",\n                        \"smithy.api#xmlName\": \"localGatewayRouteTableId\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>The tags.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                },\n                \"PoolArn\": {\n                    \"target\": \"com.amazonaws.ec2#ResourceArn\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PoolArn\",\n                        \"smithy.api#documentation\": \"<p>The ARN of the address pool.</p>\",\n                        \"smithy.api#xmlName\": \"poolArn\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a customer-owned address pool.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CoipPoolId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#CoipPoolIdSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#Ipv4PoolCoipId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#CoipPoolMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 5,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.ec2#CoipPoolSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#CoipPool\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ComponentAccount\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#pattern\": \"^\\\\d{12}$\"\n            }\n        },\n        \"com.amazonaws.ec2#ComponentRegion\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#pattern\": \"^[a-z]{2}-[a-z]+-[1-9]+$\"\n            }\n        },\n        \"com.amazonaws.ec2#ConfirmProductInstance\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ConfirmProductInstanceRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ConfirmProductInstanceResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Determines whether a product code is associated with an instance. This action can only\\n            be used by the owner of the product code. It is useful when a product code owner must\\n            verify whether another user's instance is eligible for support.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To confirm the product instance\",\n                        \"documentation\": \"This example determines whether the specified product code is associated with the specified instance.\",\n                        \"input\": {\n                            \"ProductCode\": \"774F4FF8\",\n                            \"InstanceId\": \"i-1234567890abcdef0\"\n                        },\n                        \"output\": {\n                            \"OwnerId\": \"123456789012\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#ConfirmProductInstanceRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the instance.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ProductCode\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The product code. This must be a product code that you own.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the operation, without actually making the \\n  request, and provides an error response. If you have the required permissions, the error response is \\n  <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ConfirmProductInstanceResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Return\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Return\",\n                        \"smithy.api#documentation\": \"<p>The return value of the request. Returns <code>true</code> if the specified product\\n            code is owned by the requester and associated with the specified instance.</p>\",\n                        \"smithy.api#xmlName\": \"return\"\n                    }\n                },\n                \"OwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OwnerId\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID of the instance owner. This is only present if the\\n            product code is attached to the instance.</p>\",\n                        \"smithy.api#xmlName\": \"ownerId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ConnectionLogOptions\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Enabled\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether connection logging is enabled.</p>\"\n                    }\n                },\n                \"CloudwatchLogGroup\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the CloudWatch Logs log group. Required if connection logging is enabled.</p>\"\n                    }\n                },\n                \"CloudwatchLogStream\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the CloudWatch Logs log stream to which the connection data is published.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the client connection logging options for the Client VPN endpoint.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ConnectionLogResponseOptions\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Enabled\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether client connection logging is enabled for the Client VPN endpoint.</p>\"\n                    }\n                },\n                \"CloudwatchLogGroup\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the Amazon CloudWatch Logs log group to which connection logging data is published.</p>\"\n                    }\n                },\n                \"CloudwatchLogStream\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the Amazon CloudWatch Logs log stream to which connection logging data is published.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about the client connection logging options for a Client VPN endpoint.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ConnectionNotification\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConnectionNotificationId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ConnectionNotificationId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the notification.</p>\",\n                        \"smithy.api#xmlName\": \"connectionNotificationId\"\n                    }\n                },\n                \"ServiceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ServiceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the endpoint service.</p>\",\n                        \"smithy.api#xmlName\": \"serviceId\"\n                    }\n                },\n                \"VpcEndpointId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcEndpointId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the VPC endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"vpcEndpointId\"\n                    }\n                },\n                \"ConnectionNotificationType\": {\n                    \"target\": \"com.amazonaws.ec2#ConnectionNotificationType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ConnectionNotificationType\",\n                        \"smithy.api#documentation\": \"<p>The type of notification.</p>\",\n                        \"smithy.api#xmlName\": \"connectionNotificationType\"\n                    }\n                },\n                \"ConnectionNotificationArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ConnectionNotificationArn\",\n                        \"smithy.api#documentation\": \"<p>The ARN of the SNS topic for the notification.</p>\",\n                        \"smithy.api#xmlName\": \"connectionNotificationArn\"\n                    }\n                },\n                \"ConnectionEvents\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ConnectionEvents\",\n                        \"smithy.api#documentation\": \"<p>The events for the notification. Valid values are <code>Accept</code>,\\n            <code>Connect</code>, <code>Delete</code>, and <code>Reject</code>.</p>\",\n                        \"smithy.api#xmlName\": \"connectionEvents\"\n                    }\n                },\n                \"ConnectionNotificationState\": {\n                    \"target\": \"com.amazonaws.ec2#ConnectionNotificationState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ConnectionNotificationState\",\n                        \"smithy.api#documentation\": \"<p>The state of the notification.</p>\",\n                        \"smithy.api#xmlName\": \"connectionNotificationState\"\n                    }\n                },\n                \"ServiceRegion\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ServiceRegion\",\n                        \"smithy.api#documentation\": \"<p>The Region for the endpoint service.</p>\",\n                        \"smithy.api#xmlName\": \"serviceRegion\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a connection notification for a VPC endpoint or VPC endpoint\\n            service.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ConnectionNotificationId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#ConnectionNotificationIdsList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ConnectionNotificationId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ConnectionNotificationSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ConnectionNotification\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ConnectionNotificationState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"Enabled\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Enabled\"\n                    }\n                },\n                \"Disabled\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Disabled\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ConnectionNotificationType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"Topic\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Topic\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ConnectionTrackingConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TcpEstablishedTimeout\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TcpEstablishedTimeout\",\n                        \"smithy.api#documentation\": \"<p>Timeout (in seconds) for idle TCP\\n\\t\\t\\t\\t\\t\\tconnections in an established state. Min: 60 seconds. Max: 432000 seconds (5\\n\\t\\t\\t\\t\\t\\tdays). Default: 432000 seconds. Recommended: Less than 432000 seconds.</p>\",\n                        \"smithy.api#xmlName\": \"tcpEstablishedTimeout\"\n                    }\n                },\n                \"UdpStreamTimeout\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"UdpStreamTimeout\",\n                        \"smithy.api#documentation\": \"<p>Timeout (in seconds) for idle UDP\\n\\t\\t\\t\\t\\t\\tflows classified as streams which have seen more than one request-response\\n\\t\\t\\t\\t\\t\\ttransaction. Min: 60 seconds. Max: 180 seconds (3 minutes). Default: 180\\n\\t\\t\\t\\t\\t\\tseconds.</p>\",\n                        \"smithy.api#xmlName\": \"udpStreamTimeout\"\n                    }\n                },\n                \"UdpTimeout\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"UdpTimeout\",\n                        \"smithy.api#documentation\": \"<p>Timeout (in seconds) for idle UDP flows that\\n\\t\\t\\t\\t\\t\\thave seen traffic only in a single direction or a single request-response\\n\\t\\t\\t\\t\\t\\ttransaction. Min: 30 seconds. Max: 60 seconds. Default: 30 seconds.</p>\",\n                        \"smithy.api#xmlName\": \"udpTimeout\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A security group connection tracking configuration that enables you to set the idle\\n            timeout for connection tracking on an Elastic network interface. For more information,\\n            see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/security-group-connection-tracking.html#connection-tracking-timeouts\\\">Connection tracking timeouts</a> in the\\n            <i>Amazon EC2 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ConnectionTrackingSpecification\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TcpEstablishedTimeout\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TcpEstablishedTimeout\",\n                        \"smithy.api#documentation\": \"<p>Timeout (in seconds) for idle TCP\\n\\t\\t\\t\\t\\t\\tconnections in an established state. Min: 60 seconds. Max: 432000 seconds (5\\n\\t\\t\\t\\t\\t\\tdays). Default: 432000 seconds. Recommended: Less than 432000 seconds.</p>\",\n                        \"smithy.api#xmlName\": \"tcpEstablishedTimeout\"\n                    }\n                },\n                \"UdpTimeout\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"UdpTimeout\",\n                        \"smithy.api#documentation\": \"<p>Timeout (in seconds) for idle UDP flows that\\n\\t\\t\\t\\t\\t\\thave seen traffic only in a single direction or a single request-response\\n\\t\\t\\t\\t\\t\\ttransaction. Min: 30 seconds. Max: 60 seconds. Default: 30 seconds.</p>\",\n                        \"smithy.api#xmlName\": \"udpTimeout\"\n                    }\n                },\n                \"UdpStreamTimeout\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"UdpStreamTimeout\",\n                        \"smithy.api#documentation\": \"<p>Timeout (in seconds) for idle UDP\\n\\t\\t\\t\\t\\t\\tflows classified as streams which have seen more than one request-response\\n\\t\\t\\t\\t\\t\\ttransaction. Min: 60 seconds. Max: 180 seconds (3 minutes). Default: 180\\n\\t\\t\\t\\t\\t\\tseconds.</p>\",\n                        \"smithy.api#xmlName\": \"udpStreamTimeout\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A security group connection tracking specification that enables you to set the idle\\n            timeout for connection tracking on an Elastic network interface. For more information,\\n            see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/security-group-connection-tracking.html#connection-tracking-timeouts\\\">Connection tracking timeouts</a> in the\\n            <i>Amazon EC2 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ConnectionTrackingSpecificationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TcpEstablishedTimeout\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Timeout (in seconds) for idle TCP\\n\\t\\t\\t\\t\\t\\tconnections in an established state. Min: 60 seconds. Max: 432000 seconds (5\\n\\t\\t\\t\\t\\t\\tdays). Default: 432000 seconds. Recommended: Less than 432000 seconds.</p>\"\n                    }\n                },\n                \"UdpStreamTimeout\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Timeout (in seconds) for idle UDP\\n\\t\\t\\t\\t\\t\\tflows classified as streams which have seen more than one request-response\\n\\t\\t\\t\\t\\t\\ttransaction. Min: 60 seconds. Max: 180 seconds (3 minutes). Default: 180\\n\\t\\t\\t\\t\\t\\tseconds.</p>\"\n                    }\n                },\n                \"UdpTimeout\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Timeout (in seconds) for idle UDP flows that\\n\\t\\t\\t\\t\\t\\thave seen traffic only in a single direction or a single request-response\\n\\t\\t\\t\\t\\t\\ttransaction. Min: 30 seconds. Max: 60 seconds. Default: 30 seconds.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A security group connection tracking specification request that enables you to set the\\n            idle timeout for connection tracking on an Elastic network interface. For more\\n            information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/security-group-connection-tracking.html#connection-tracking-timeouts\\\">Connection tracking timeouts</a> in the\\n            <i>Amazon EC2 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ConnectionTrackingSpecificationResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TcpEstablishedTimeout\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TcpEstablishedTimeout\",\n                        \"smithy.api#documentation\": \"<p>Timeout (in seconds) for idle TCP\\n\\t\\t\\t\\t\\t\\tconnections in an established state. Min: 60 seconds. Max: 432000 seconds (5\\n\\t\\t\\t\\t\\t\\tdays). Default: 432000 seconds. Recommended: Less than 432000 seconds.</p>\",\n                        \"smithy.api#xmlName\": \"tcpEstablishedTimeout\"\n                    }\n                },\n                \"UdpStreamTimeout\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"UdpStreamTimeout\",\n                        \"smithy.api#documentation\": \"<p>Timeout (in seconds) for idle UDP\\n\\t\\t\\t\\t\\t\\tflows classified as streams which have seen more than one request-response\\n\\t\\t\\t\\t\\t\\ttransaction. Min: 60 seconds. Max: 180 seconds (3 minutes). Default: 180\\n\\t\\t\\t\\t\\t\\tseconds.</p>\",\n                        \"smithy.api#xmlName\": \"udpStreamTimeout\"\n                    }\n                },\n                \"UdpTimeout\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"UdpTimeout\",\n                        \"smithy.api#documentation\": \"<p>Timeout (in seconds) for idle UDP flows that\\n\\t\\t\\t\\t\\t\\thave seen traffic only in a single direction or a single request-response\\n\\t\\t\\t\\t\\t\\ttransaction. Min: 30 seconds. Max: 60 seconds. Default: 30 seconds.</p>\",\n                        \"smithy.api#xmlName\": \"udpTimeout\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A security group connection tracking specification response that enables you to set\\n            the idle timeout for connection tracking on an Elastic network interface. For more\\n            information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/security-group-connection-tracking.html#connection-tracking-timeouts\\\">Connection tracking timeouts</a> in the\\n            <i>Amazon EC2 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ConnectivityType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"PRIVATE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"private\"\n                    }\n                },\n                \"PUBLIC\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"public\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ContainerFormat\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ova\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ova\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ConversionIdStringList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ConversionTaskId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ConversionTask\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConversionTaskId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ConversionTaskId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the conversion task.</p>\",\n                        \"smithy.api#xmlName\": \"conversionTaskId\"\n                    }\n                },\n                \"ExpirationTime\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ExpirationTime\",\n                        \"smithy.api#documentation\": \"<p>The time when the task expires. If the upload isn't complete before the expiration time, we automatically cancel\\n   the task.</p>\",\n                        \"smithy.api#xmlName\": \"expirationTime\"\n                    }\n                },\n                \"ImportInstance\": {\n                    \"target\": \"com.amazonaws.ec2#ImportInstanceTaskDetails\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ImportInstance\",\n                        \"smithy.api#documentation\": \"<p>If the task is for importing an instance, this contains information about the import instance task.</p>\",\n                        \"smithy.api#xmlName\": \"importInstance\"\n                    }\n                },\n                \"ImportVolume\": {\n                    \"target\": \"com.amazonaws.ec2#ImportVolumeTaskDetails\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ImportVolume\",\n                        \"smithy.api#documentation\": \"<p>If the task is for importing a volume, this contains information about the import volume task.</p>\",\n                        \"smithy.api#xmlName\": \"importVolume\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#ConversionTaskState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The state of the conversion task.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                },\n                \"StatusMessage\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"StatusMessage\",\n                        \"smithy.api#documentation\": \"<p>The status message related to the conversion task.</p>\",\n                        \"smithy.api#xmlName\": \"statusMessage\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>Any tags assigned to the task.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a conversion task.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ConversionTaskId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#ConversionTaskState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"active\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"active\"\n                    }\n                },\n                \"cancelling\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"cancelling\"\n                    }\n                },\n                \"cancelled\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"cancelled\"\n                    }\n                },\n                \"completed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"completed\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#CoolOffPeriodRequestHours\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 72\n                }\n            }\n        },\n        \"com.amazonaws.ec2#CoolOffPeriodResponseHours\": {\n            \"type\": \"integer\"\n        },\n        \"com.amazonaws.ec2#CopyFpgaImage\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CopyFpgaImageRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CopyFpgaImageResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Copies the specified Amazon FPGA Image (AFI) to the current Region.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CopyFpgaImageRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"SourceFpgaImageId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the source AFI.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The description for the new AFI.</p>\"\n                    }\n                },\n                \"Name\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name for the new AFI. The default is the name of the source AFI.</p>\"\n                    }\n                },\n                \"SourceRegion\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The Region that contains the source AFI.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Unique, case-sensitive identifier that you provide to ensure the idempotency of the request. \\n      \\tFor more information, see <a href=\\\"https://docs.aws.amazon.com/ec2/latest/devguide/ec2-api-idempotency.html\\\">Ensuring idempotency</a>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CopyFpgaImageResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"FpgaImageId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"FpgaImageId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the new AFI.</p>\",\n                        \"smithy.api#xmlName\": \"fpgaImageId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CopyImage\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CopyImageRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CopyImageResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Initiates an AMI copy operation. You must specify the source AMI ID and both the source\\n      and destination locations. The copy operation must be initiated in the destination\\n      Region.</p>\\n         <p class=\\\"title\\\">\\n            <b>CopyImage supports the following source to destination copies:</b>\\n         </p>\\n         <ul>\\n            <li>\\n               <p>Region to Region</p>\\n            </li>\\n            <li>\\n               <p>Region to Outpost</p>\\n            </li>\\n            <li>\\n               <p>Parent Region to Local Zone</p>\\n            </li>\\n            <li>\\n               <p>Local Zone to parent Region</p>\\n            </li>\\n            <li>\\n               <p>Between Local Zones with the same parent Region (only supported for certain Local\\n          Zones)</p>\\n            </li>\\n         </ul>\\n         <p class=\\\"title\\\">\\n            <b>CopyImage does not support the following source to destination copies:</b>\\n         </p>\\n         <ul>\\n            <li>\\n               <p>Local Zone to non-parent Regions</p>\\n            </li>\\n            <li>\\n               <p>Between Local Zones with different parent Regions</p>\\n            </li>\\n            <li>\\n               <p>Local Zone to Outpost</p>\\n            </li>\\n            <li>\\n               <p>Outpost to Local Zone</p>\\n            </li>\\n            <li>\\n               <p>Outpost to Region</p>\\n            </li>\\n            <li>\\n               <p>Between Outposts</p>\\n            </li>\\n            <li>\\n               <p>Within same Outpost</p>\\n            </li>\\n            <li>\\n               <p>Cross-partition copies (use <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateStoreImageTask.html\\\">CreateStoreImageTask</a> instead)</p>\\n            </li>\\n         </ul>\\n         <p class=\\\"title\\\">\\n            <b>Destination specification</b>\\n         </p>\\n         <ul>\\n            <li>\\n               <p>Region to Region: The destination Region is the Region in which you initiate the copy\\n          operation.</p>\\n            </li>\\n            <li>\\n               <p>Region to Outpost: Specify the destination using the\\n            <code>DestinationOutpostArn</code> parameter (the ARN of the Outpost)</p>\\n            </li>\\n            <li>\\n               <p>Region to Local Zone, and Local Zone to Local Zone copies: Specify the destination\\n          using the <code>DestinationAvailabilityZone</code> parameter (the name of the destination\\n          Local Zone) or <code>DestinationAvailabilityZoneId</code> parameter (the ID of the\\n          destination Local Zone).</p>\\n            </li>\\n         </ul>\\n         <p class=\\\"title\\\">\\n            <b>Snapshot encryption</b>\\n         </p>\\n         <ul>\\n            <li>\\n               <p>Region to Outpost: Backing snapshots copied to an Outpost are encrypted by default\\n          using the default encryption key for the Region or the key that you specify. Outposts do\\n          not support unencrypted snapshots.</p>\\n            </li>\\n            <li>\\n               <p>Region to Local Zone, and Local Zone to Local Zone: Not all Local Zones require\\n          encrypted snapshots. In Local Zones that require encrypted snapshots, backing snapshots\\n          are automatically encrypted during copy. In Local Zones where encryption is not required,\\n          snapshots retain their original encryption state (encrypted or unencrypted) by\\n          default.</p>\\n            </li>\\n         </ul>\\n         <p>For more information, including the required permissions for copying an AMI, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/CopyingAMIs.html\\\">Copy an Amazon EC2 AMI</a> in the\\n        <i>Amazon EC2 User Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To copy an AMI to another region\",\n                        \"documentation\": \"This example copies the specified AMI from the us-east-1 region to the current region.\",\n                        \"input\": {\n                            \"Description\": \"\",\n                            \"Name\": \"My server\",\n                            \"SourceImageId\": \"ami-5731123e\",\n                            \"SourceRegion\": \"us-east-1\"\n                        },\n                        \"output\": {\n                            \"ImageId\": \"ami-438bea42\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#CopyImageRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Unique, case-sensitive identifier you provide to ensure idempotency of the request. For\\n      more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Run_Instance_Idempotency.html\\\">Ensuring idempotency in\\n          Amazon EC2 API requests</a> in the <i>Amazon EC2 API\\n      Reference</i>.</p>\",\n                        \"smithy.api#idempotencyToken\": {}\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A description for the new AMI.</p>\"\n                    }\n                },\n                \"Encrypted\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Encrypted\",\n                        \"smithy.api#documentation\": \"<p>Specifies whether to encrypt the snapshots of the copied image.</p>\\n         <p>You can encrypt a copy of an unencrypted snapshot, but you cannot create an unencrypted\\n      copy of an encrypted snapshot. The default KMS key for Amazon EBS is used unless you specify a\\n      non-default Key Management Service (KMS) KMS key using <code>KmsKeyId</code>. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AMIEncryption.html\\\">Use encryption with\\n        EBS-backed AMIs</a> in the <i>Amazon EC2 User Guide</i>.</p>\",\n                        \"smithy.api#xmlName\": \"encrypted\"\n                    }\n                },\n                \"KmsKeyId\": {\n                    \"target\": \"com.amazonaws.ec2#KmsKeyId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"KmsKeyId\",\n                        \"smithy.api#documentation\": \"<p>The identifier of the symmetric Key Management Service (KMS) KMS key to use when creating encrypted volumes.\\n      If this parameter is not specified, your Amazon Web Services managed KMS key for Amazon EBS is used. If you\\n      specify a KMS key, you must also set the encrypted state to <code>true</code>.</p>\\n         <p>You can specify a KMS key using any of the following:</p>\\n         <ul>\\n            <li>\\n               <p>Key ID. For example, 1234abcd-12ab-34cd-56ef-1234567890ab.</p>\\n            </li>\\n            <li>\\n               <p>Key alias. For example, alias/ExampleAlias.</p>\\n            </li>\\n            <li>\\n               <p>Key ARN. For example, arn:aws:kms:us-east-1:012345678910:key/1234abcd-12ab-34cd-56ef-1234567890ab.</p>\\n            </li>\\n            <li>\\n               <p>Alias ARN. For example, arn:aws:kms:us-east-1:012345678910:alias/ExampleAlias.</p>\\n            </li>\\n         </ul>\\n         <p>Amazon Web Services authenticates the KMS key asynchronously. Therefore, if you specify an identifier\\n      that is not valid, the action can appear to complete, but eventually fails.</p>\\n         <p>The specified KMS key must exist in the destination Region.</p>\\n         <p>Amazon EBS does not support asymmetric KMS keys.</p>\",\n                        \"smithy.api#xmlName\": \"kmsKeyId\"\n                    }\n                },\n                \"Name\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The name of the new AMI.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"SourceImageId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the AMI to copy.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"SourceRegion\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The name of the Region that contains the AMI to copy.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DestinationOutpostArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the Outpost for the new AMI.</p>\\n         <p>Only specify this parameter when copying an AMI from an Amazon Web Services Region to an Outpost. The\\n      AMI must be in the Region of the destination Outpost. You can't copy an AMI from an Outpost to\\n      a Region, from one Outpost to another, or within the same Outpost.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/ebs/latest/userguide/snapshots-outposts.html#copy-amis\\\">Copy AMIs from an Amazon Web Services Region\\n        to an Outpost</a> in the <i>Amazon EBS User Guide</i>.</p>\\n         <p>Only one of <code>DestinationAvailabilityZone</code>,\\n        <code>DestinationAvailabilityZoneId</code>, or <code>DestinationOutpostArn</code> can be\\n      specified.</p>\"\n                    }\n                },\n                \"CopyImageTags\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies whether to copy your user-defined AMI tags to the new AMI.</p>\\n         <p>The following tags are not be copied:</p>\\n         <ul>\\n            <li>\\n               <p>System tags (prefixed with <code>aws:</code>)</p>\\n            </li>\\n            <li>\\n               <p>For public and shared AMIs, user-defined tags that are attached by other Amazon Web Services\\n          accounts</p>\\n            </li>\\n         </ul>\\n         <p>Default: Your user-defined AMI tags are not copied.</p>\"\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags to apply to the new AMI and new snapshots. You can tag the AMI, the snapshots, or\\n      both.</p>\\n         <ul>\\n            <li>\\n               <p>To tag the new AMI, the value for <code>ResourceType</code> must be\\n          <code>image</code>.</p>\\n            </li>\\n            <li>\\n               <p>To tag the new snapshots, the value for <code>ResourceType</code> must be\\n            <code>snapshot</code>. The same tag is applied to all the new snapshots.</p>\\n            </li>\\n         </ul>\\n         <p>If you specify other values for <code>ResourceType</code>, the request fails.</p>\\n         <p>To tag an AMI or snapshot after it has been created, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateTags.html\\\">CreateTags</a>.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                },\n                \"SnapshotCopyCompletionDurationMinutes\": {\n                    \"target\": \"com.amazonaws.ec2#Long\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify a completion duration, in 15 minute increments, to initiate a time-based AMI copy.\\n      The specified completion duration applies to each of the snapshots associated with the AMI.\\n      Each snapshot associated with the AMI will be completed within the specified completion\\n      duration, with copy throughput automatically adjusted for each snapshot based on its size to\\n      meet the timing target.</p>\\n         <p>If you do not specify a value, the AMI copy operation is completed on a best-effort \\n      basis.</p>\\n         <note>\\n            <p>This parameter is not supported when copying an AMI to or from a Local Zone, or to an\\n        Outpost.</p>\\n         </note>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/ebs/latest/userguide/time-based-copies.html\\\">Time-based copies for Amazon EBS snapshots and\\n        EBS-backed AMIs</a>.</p>\"\n                    }\n                },\n                \"DestinationAvailabilityZone\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Local Zone for the new AMI (for example, <code>cn-north-1-pkx-1a</code>).</p>\\n         <p>Only one of <code>DestinationAvailabilityZone</code>,\\n        <code>DestinationAvailabilityZoneId</code>, or <code>DestinationOutpostArn</code> can be\\n      specified.</p>\"\n                    }\n                },\n                \"DestinationAvailabilityZoneId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the Local Zone for the new AMI (for example, <code>cnn1-pkx1-az1</code>).</p>\\n         <p>Only one of <code>DestinationAvailabilityZone</code>,\\n        <code>DestinationAvailabilityZoneId</code>, or <code>DestinationOutpostArn</code> can be\\n      specified.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n\\t\\t\\tand provides an error response. If you have the required permissions, the error response is \\n\\t\\t\\t<code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the parameters for CopyImage.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CopyImageResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ImageId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ImageId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the new AMI.</p>\",\n                        \"smithy.api#xmlName\": \"imageId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the output of CopyImage.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CopySnapshot\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CopySnapshotRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CopySnapshotResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates an exact copy of an Amazon EBS snapshot.</p>\\n         <p>The location of the source snapshot determines whether you can copy it or not, \\n      and the allowed destinations for the snapshot copy.</p>\\n         <ul>\\n            <li>\\n               <p>If the source snapshot is in a Region, you can copy it within that Region, \\n          to another Region, to an Outpost associated with that Region, or to a Local \\n          Zone in that Region.</p>\\n            </li>\\n            <li>\\n               <p>If the source snapshot is in a Local Zone, you can copy it within that Local Zone, \\n          to another Local Zone in the same zone group, or to the parent Region of the Local \\n          Zone.</p>\\n            </li>\\n            <li>\\n               <p>If the source snapshot is on an Outpost, you can't copy it.</p>\\n            </li>\\n         </ul>\\n         <p>When copying snapshots to a Region, the encryption outcome for the snapshot copy depends on the \\n      Amazon EBS encryption by default setting for the destination Region, the encryption status of the source \\n      snapshot, and the encryption parameters you specify in the request. For more information, see <a href=\\\"https://docs.aws.amazon.com/ebs/latest/userguide/ebs-copy-snapshot.html#creating-encrypted-snapshots\\\">\\n        Encryption and snapshot copying</a>.</p>\\n         <p>Snapshots copied to an Outpost must be encrypted. Unencrypted snapshots are not supported \\n      on Outposts. For more information, <a href=\\\"https://docs.aws.amazon.com/ebs/latest/userguide/snapshots-outposts.html#considerations\\\">\\n        Amazon EBS local snapshots on Outposts</a>.</p>\\n         <note>\\n            <p>Snapshots copies have an arbitrary source volume ID. Do not use this volume ID for \\n        any purpose.</p>\\n         </note>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/ebs/latest/userguide/ebs-copy-snapshot.html\\\">Copy an Amazon EBS snapshot</a> in the\\n        <i>Amazon EBS User Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To copy a snapshot\",\n                        \"documentation\": \"This example copies a snapshot with the snapshot ID of ``snap-066877671789bd71b`` from the ``us-west-2`` region to the ``us-east-1`` region and adds a short description to identify the snapshot.\",\n                        \"input\": {\n                            \"SourceRegion\": \"us-west-2\",\n                            \"SourceSnapshotId\": \"snap-066877671789bd71b\",\n                            \"Description\": \"This is my copied snapshot.\",\n                            \"DestinationRegion\": \"us-east-1\"\n                        },\n                        \"output\": {\n                            \"SnapshotId\": \"snap-066877671789bd71b\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#CopySnapshotRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A description for the EBS snapshot.</p>\"\n                    }\n                },\n                \"DestinationOutpostArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the Outpost to which to copy the snapshot.</p>\\n         <note>\\n            <p>Only supported when copying a snapshot to an Outpost.</p>\\n         </note>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/ebs/latest/userguide/snapshots-outposts.html#copy-snapshots\\\">\\n  \\t\\tCopy snapshots from an Amazon Web Services Region to an Outpost</a> in the \\n      <i>Amazon EBS User Guide</i>.</p>\"\n                    }\n                },\n                \"DestinationRegion\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DestinationRegion\",\n                        \"smithy.api#documentation\": \"<p>The destination Region to use in the <code>PresignedUrl</code> parameter of a snapshot\\n      copy operation. This parameter is only valid for specifying the destination Region in a\\n        <code>PresignedUrl</code> parameter, where it is required.</p>\\n         <p>The snapshot copy is sent to the regional endpoint that you sent the HTTP\\n    \\trequest to (for example, <code>ec2.us-east-1.amazonaws.com</code>). With the CLI, this is\\n      specified using the <code>--region</code> parameter or the default Region in your Amazon Web Services\\n      configuration file.</p>\",\n                        \"smithy.api#xmlName\": \"destinationRegion\"\n                    }\n                },\n                \"Encrypted\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Encrypted\",\n                        \"smithy.api#documentation\": \"<p>To encrypt a copy of an unencrypted snapshot if encryption by default is not enabled, \\n      enable encryption using this parameter. Otherwise, omit this parameter. Copies of encrypted \\n      snapshots are encrypted, even if you omit this parameter and encryption by default is not \\n      enabled. You cannot set this parameter to false. For more information, see <a href=\\\"https://docs.aws.amazon.com/ebs/latest/userguide/ebs-encryption.html\\\">Amazon EBS encryption</a> in the \\n      <i>Amazon EBS User Guide</i>.</p>\",\n                        \"smithy.api#xmlName\": \"encrypted\"\n                    }\n                },\n                \"KmsKeyId\": {\n                    \"target\": \"com.amazonaws.ec2#KmsKeyId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"KmsKeyId\",\n                        \"smithy.api#documentation\": \"<p>The identifier of the KMS key to use for Amazon EBS encryption.\\n      If this parameter is not specified, your KMS key for Amazon EBS is used. If <code>KmsKeyId</code> is\\n      specified, the encrypted state must be <code>true</code>.</p>\\n         <p>You can specify the KMS key using any of the following:</p>\\n         <ul>\\n            <li>\\n               <p>Key ID. For example, 1234abcd-12ab-34cd-56ef-1234567890ab.</p>\\n            </li>\\n            <li>\\n               <p>Key alias. For example, alias/ExampleAlias.</p>\\n            </li>\\n            <li>\\n               <p>Key ARN. For example, arn:aws:kms:us-east-1:012345678910:key/1234abcd-12ab-34cd-56ef-1234567890ab.</p>\\n            </li>\\n            <li>\\n               <p>Alias ARN. For example, arn:aws:kms:us-east-1:012345678910:alias/ExampleAlias.</p>\\n            </li>\\n         </ul>\\n         <p>Amazon Web Services authenticates the KMS key asynchronously. Therefore, if you specify an ID, alias, or ARN that is not valid, \\n      the action can appear to complete, but eventually fails.</p>\",\n                        \"smithy.api#xmlName\": \"kmsKeyId\"\n                    }\n                },\n                \"PresignedUrl\": {\n                    \"target\": \"com.amazonaws.ec2#CopySnapshotRequestPSU\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PresignedUrl\",\n                        \"smithy.api#documentation\": \"<p>When you copy an encrypted source snapshot using the Amazon EC2 Query API, you must supply a\\n      pre-signed URL. This parameter is optional for unencrypted snapshots. For more information,\\n      see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Query-Requests.html\\\">Query\\n        requests</a>.</p>\\n         <p>The <code>PresignedUrl</code> should use the snapshot source endpoint, the\\n        <code>CopySnapshot</code> action, and include the <code>SourceRegion</code>,\\n        <code>SourceSnapshotId</code>, and <code>DestinationRegion</code> parameters. The\\n        <code>PresignedUrl</code> must be signed using Amazon Web Services Signature Version 4. Because EBS\\n      snapshots are stored in Amazon S3, the signing algorithm for this parameter uses the same logic\\n      that is described in <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-query-string-auth.html\\\">\\n        Authenticating Requests: Using Query Parameters (Amazon Web Services Signature Version 4)</a> in the <i>Amazon S3 API Reference</i>. An\\n      invalid or improperly signed <code>PresignedUrl</code> will cause the copy operation to fail\\n      asynchronously, and the snapshot will move to an <code>error</code> state.</p>\",\n                        \"smithy.api#xmlName\": \"presignedUrl\"\n                    }\n                },\n                \"SourceRegion\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the Region that contains the snapshot to be copied.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"SourceSnapshotId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the EBS snapshot to copy.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags to apply to the new snapshot.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                },\n                \"CompletionDurationMinutes\": {\n                    \"target\": \"com.amazonaws.ec2#SnapshotCompletionDurationMinutesRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<note>\\n            <p>Not supported when copying snapshots to or from Local Zones or Outposts.</p>\\n         </note>\\n         <p>Specify a completion duration, in 15 minute increments, to initiate a time-based snapshot \\n      copy. Time-based snapshot copy operations complete within the specified duration. For more \\n      information, see <a href=\\\"https://docs.aws.amazon.com/ebs/latest/userguide/time-based-copies.html\\\">\\n        Time-based copies</a>.</p>\\n         <p>If you do not specify a value, the snapshot copy operation is completed on a \\n      best-effort basis.</p>\"\n                    }\n                },\n                \"DestinationAvailabilityZone\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Local Zone, for example, <code>cn-north-1-pkx-1a</code> to which to copy the \\n      snapshot.</p>\\n         <note>\\n            <p>Only supported when copying a snapshot to a Local Zone.</p>\\n         </note>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CopySnapshotRequestPSU\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#sensitive\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CopySnapshotResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>Any tags applied to the new snapshot.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                },\n                \"SnapshotId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SnapshotId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the new snapshot.</p>\",\n                        \"smithy.api#xmlName\": \"snapshotId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CopyTagsFromSource\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"volume\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"volume\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#CoreCount\": {\n            \"type\": \"integer\"\n        },\n        \"com.amazonaws.ec2#CoreCountList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#CoreCount\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#CoreNetworkArn\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#CpuManufacturer\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"INTEL\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"intel\"\n                    }\n                },\n                \"AMD\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"amd\"\n                    }\n                },\n                \"AMAZON_WEB_SERVICES\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"amazon-web-services\"\n                    }\n                },\n                \"APPLE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"apple\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#CpuManufacturerName\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#CpuManufacturerSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#CpuManufacturer\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#CpuOptions\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CoreCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CoreCount\",\n                        \"smithy.api#documentation\": \"<p>The number of CPU cores for the instance.</p>\",\n                        \"smithy.api#xmlName\": \"coreCount\"\n                    }\n                },\n                \"ThreadsPerCore\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ThreadsPerCore\",\n                        \"smithy.api#documentation\": \"<p>The number of threads per CPU core.</p>\",\n                        \"smithy.api#xmlName\": \"threadsPerCore\"\n                    }\n                },\n                \"AmdSevSnp\": {\n                    \"target\": \"com.amazonaws.ec2#AmdSevSnpSpecification\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AmdSevSnp\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether the instance is enabled for AMD SEV-SNP. For more information, see \\n            <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/sev-snp.html\\\">AMD SEV-SNP</a>.</p>\",\n                        \"smithy.api#xmlName\": \"amdSevSnp\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The CPU options for the instance.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CpuOptionsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CoreCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of CPU cores for the instance.</p>\"\n                    }\n                },\n                \"ThreadsPerCore\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of threads per CPU core. To disable multithreading for the instance,\\n            specify a value of <code>1</code>. Otherwise, specify the default value of\\n                <code>2</code>.</p>\"\n                    }\n                },\n                \"AmdSevSnp\": {\n                    \"target\": \"com.amazonaws.ec2#AmdSevSnpSpecification\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether to enable the instance for AMD SEV-SNP. AMD SEV-SNP is supported \\n            with M6a, R6a, and C6a instance types only. For more information, see \\n            <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/sev-snp.html\\\">AMD SEV-SNP</a>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The CPU options for the instance. Both the core count and threads per core must be\\n            specified in the request.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CpuPerformanceFactor\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"References\": {\n                    \"target\": \"com.amazonaws.ec2#PerformanceFactorReferenceSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ReferenceSet\",\n                        \"smithy.api#documentation\": \"<p>Specify an instance family to use as the baseline reference for CPU performance. All\\n         instance types that match your specified attributes will be compared against the CPU\\n         performance of the referenced instance family, regardless of CPU manufacturer or\\n         architecture differences.</p>\\n         <note>\\n            <p>Currently, only one instance family can be specified in the list.</p>\\n         </note>\",\n                        \"smithy.api#xmlName\": \"referenceSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The CPU performance to consider, using an instance family as the baseline reference.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CpuPerformanceFactorRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"References\": {\n                    \"target\": \"com.amazonaws.ec2#PerformanceFactorReferenceSetRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify an instance family to use as the baseline reference for CPU performance. All\\n         instance types that match your specified attributes will be compared against the CPU\\n         performance of the referenced instance family, regardless of CPU manufacturer or\\n         architecture differences.</p>\\n         <note>\\n            <p>Currently, only one instance family can be specified in the list.</p>\\n         </note>\",\n                        \"smithy.api#xmlName\": \"Reference\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The CPU performance to consider, using an instance family as the baseline reference.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateCapacityReservation\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateCapacityReservationRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreateCapacityReservationResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates a new Capacity Reservation with the specified attributes. Capacity\\n\\t\\t\\tReservations enable you to reserve capacity for your Amazon EC2 instances in a specific\\n\\t\\t\\tAvailability Zone for any duration.</p>\\n         <p>You can create a Capacity Reservation at any time, and you can choose when it starts.\\n\\t\\t\\tYou can create a Capacity Reservation for immediate use or you can request a Capacity\\n\\t\\t\\tReservation for a future date.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-capacity-reservations.html\\\"> Reserve compute\\n\\t\\t\\t\\tcapacity with On-Demand Capacity Reservations</a> in the\\n\\t\\t\\t\\t<i>Amazon EC2 User Guide</i>.</p>\\n         <p>Your request to create a Capacity Reservation could fail if:</p>\\n         <ul>\\n            <li>\\n               <p>Amazon EC2 does not have sufficient capacity. In this case, try again\\n\\t\\t\\t\\t\\tat a later time, try in a different Availability Zone, or request a smaller\\n\\t\\t\\t\\t\\tCapacity Reservation. If your workload is flexible across instance types and\\n\\t\\t\\t\\t\\tsizes, try with different instance attributes.</p>\\n            </li>\\n            <li>\\n               <p>The requested quantity exceeds your On-Demand Instance quota. In this case,\\n\\t\\t\\t\\t\\tincrease your On-Demand Instance quota for the requested instance type and try\\n\\t\\t\\t\\t\\tagain. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-resource-limits.html\\\">\\n\\t\\t\\t\\t\\t\\tAmazon EC2 Service Quotas</a> in the\\n\\t\\t\\t\\t\\t\\t<i>Amazon EC2 User Guide</i>.</p>\\n            </li>\\n         </ul>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateCapacityReservationBySplitting\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateCapacityReservationBySplittingRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreateCapacityReservationBySplittingResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p> Create a new Capacity Reservation by splitting the capacity of the source Capacity\\n\\t\\t\\tReservation. The new Capacity Reservation will have the same attributes as the source\\n\\t\\t\\tCapacity Reservation except for tags. The source Capacity Reservation must be\\n\\t\\t\\t\\t<code>active</code> and owned by your Amazon Web Services account. </p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateCapacityReservationBySplittingRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Unique, case-sensitive identifier that you provide to ensure the idempotency of the request. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Run_Instance_Idempotency.html\\\">Ensure Idempotency</a>.</p>\",\n                        \"smithy.api#idempotencyToken\": {}\n                    }\n                },\n                \"SourceCapacityReservationId\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityReservationId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p> The ID of the Capacity Reservation from which you want to split the capacity. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"InstanceCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p> The number of instances to split from the source Capacity Reservation. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The tags to apply to the new Capacity Reservation. </p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateCapacityReservationBySplittingResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SourceCapacityReservation\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityReservation\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SourceCapacityReservation\",\n                        \"smithy.api#documentation\": \"<p> Information about the source Capacity Reservation. </p>\",\n                        \"smithy.api#xmlName\": \"sourceCapacityReservation\"\n                    }\n                },\n                \"DestinationCapacityReservation\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityReservation\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DestinationCapacityReservation\",\n                        \"smithy.api#documentation\": \"<p> Information about the destination Capacity Reservation. </p>\",\n                        \"smithy.api#xmlName\": \"destinationCapacityReservation\"\n                    }\n                },\n                \"InstanceCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceCount\",\n                        \"smithy.api#documentation\": \"<p> The number of instances in the new Capacity Reservation. The number of instances in\\n\\t\\t\\tthe source Capacity Reservation was reduced by this amount. </p>\",\n                        \"smithy.api#xmlName\": \"instanceCount\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateCapacityReservationFleet\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateCapacityReservationFleetRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreateCapacityReservationFleetResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates a Capacity Reservation Fleet. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/work-with-cr-fleets.html#create-crfleet\\\">Create a\\n\\t\\t\\t\\tCapacity Reservation Fleet</a> in the\\n\\t\\t\\t<i>Amazon EC2 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateCapacityReservationFleetRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AllocationStrategy\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The strategy used by the Capacity Reservation Fleet to determine which of the\\n\\t\\t\\tspecified instance types to use. Currently, only the <code>prioritized</code> allocation\\n\\t\\t\\tstrategy is supported. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/crfleet-concepts.html#allocation-strategy\\\"> Allocation\\n\\t\\t\\t\\tstrategy</a> in the <i>Amazon EC2 User Guide</i>.</p>\\n         <p>Valid values: <code>prioritized</code>\\n         </p>\"\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Unique, case-sensitive identifier that you provide to ensure the idempotency of the request. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Run_Instance_Idempotency.html\\\">Ensure Idempotency</a>.</p>\",\n                        \"smithy.api#idempotencyToken\": {}\n                    }\n                },\n                \"InstanceTypeSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#ReservationFleetInstanceSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>Information about the instance types for which to reserve the capacity.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"InstanceTypeSpecification\"\n                    }\n                },\n                \"Tenancy\": {\n                    \"target\": \"com.amazonaws.ec2#FleetCapacityReservationTenancy\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates the tenancy of the Capacity Reservation Fleet. All Capacity Reservations in\\n\\t\\t\\tthe Fleet inherit this tenancy. The Capacity Reservation Fleet can have one of the\\n\\t\\t\\tfollowing tenancy settings:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>default</code> - The Capacity Reservation Fleet is created on hardware\\n\\t\\t\\t\\t\\tthat is shared with other Amazon Web Services accounts.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>dedicated</code> - The Capacity Reservations are created on single-tenant\\n\\t\\t\\t\\t\\thardware that is dedicated to a single Amazon Web Services account.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"TotalTargetCapacity\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The total number of capacity units to be reserved by the Capacity Reservation Fleet.\\n\\t\\t\\tThis value, together with the instance type weights that you assign to each instance\\n\\t\\t\\ttype used by the Fleet determine the number of instances for which the Fleet reserves\\n\\t\\t\\tcapacity. Both values are based on units that make sense for your workload. For more\\n\\t\\t\\tinformation, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/crfleet-concepts.html#target-capacity\\\">Total target\\n\\t\\t\\t\\tcapacity</a> in the <i>Amazon EC2 User Guide</i>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"EndDate\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time at which the Capacity Reservation Fleet expires. When the Capacity\\n\\t\\t\\tReservation Fleet expires, its state changes to <code>expired</code> and all of the\\n\\t\\t\\tCapacity Reservations in the Fleet expire.</p>\\n         <p>The Capacity Reservation Fleet expires within an hour after the specified time. For\\n\\t\\t\\texample, if you specify <code>5/31/2019</code>, <code>13:30:55</code>, the Capacity\\n\\t\\t\\tReservation Fleet is guaranteed to expire between <code>13:30:55</code> and\\n\\t\\t\\t\\t<code>14:30:55</code> on <code>5/31/2019</code>. </p>\"\n                    }\n                },\n                \"InstanceMatchCriteria\": {\n                    \"target\": \"com.amazonaws.ec2#FleetInstanceMatchCriteria\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates the type of instance launches that the Capacity Reservation Fleet accepts.\\n\\t\\t\\tAll Capacity Reservations in the Fleet inherit this instance matching criteria.</p>\\n         <p>Currently, Capacity Reservation Fleets support <code>open</code> instance matching\\n\\t\\t\\tcriteria only. This means that instances that have matching attributes (instance type,\\n\\t\\t\\tplatform, and Availability Zone) run in the Capacity Reservations automatically.\\n\\t\\t\\tInstances do not need to explicitly target a Capacity Reservation Fleet to use its\\n\\t\\t\\treserved capacity.</p>\"\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags to assign to the Capacity Reservation Fleet. The tags are automatically\\n\\t\\t\\tassigned to the Capacity Reservations in the Fleet.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateCapacityReservationFleetResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CapacityReservationFleetId\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityReservationFleetId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CapacityReservationFleetId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Capacity Reservation Fleet.</p>\",\n                        \"smithy.api#xmlName\": \"capacityReservationFleetId\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityReservationFleetState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The status of the Capacity Reservation Fleet.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                },\n                \"TotalTargetCapacity\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TotalTargetCapacity\",\n                        \"smithy.api#documentation\": \"<p>The total number of capacity units for which the Capacity Reservation Fleet reserves\\n\\t\\t\\tcapacity.</p>\",\n                        \"smithy.api#xmlName\": \"totalTargetCapacity\"\n                    }\n                },\n                \"TotalFulfilledCapacity\": {\n                    \"target\": \"com.amazonaws.ec2#Double\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TotalFulfilledCapacity\",\n                        \"smithy.api#documentation\": \"<p>The requested capacity units that have been successfully reserved.</p>\",\n                        \"smithy.api#xmlName\": \"totalFulfilledCapacity\"\n                    }\n                },\n                \"InstanceMatchCriteria\": {\n                    \"target\": \"com.amazonaws.ec2#FleetInstanceMatchCriteria\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceMatchCriteria\",\n                        \"smithy.api#documentation\": \"<p>The instance matching criteria for the Capacity Reservation Fleet.</p>\",\n                        \"smithy.api#xmlName\": \"instanceMatchCriteria\"\n                    }\n                },\n                \"AllocationStrategy\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AllocationStrategy\",\n                        \"smithy.api#documentation\": \"<p>The allocation strategy used by the Capacity Reservation Fleet.</p>\",\n                        \"smithy.api#xmlName\": \"allocationStrategy\"\n                    }\n                },\n                \"CreateTime\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CreateTime\",\n                        \"smithy.api#documentation\": \"<p>The date and time at which the Capacity Reservation Fleet was created.</p>\",\n                        \"smithy.api#xmlName\": \"createTime\"\n                    }\n                },\n                \"EndDate\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EndDate\",\n                        \"smithy.api#documentation\": \"<p>The date and time at which the Capacity Reservation Fleet expires.</p>\",\n                        \"smithy.api#xmlName\": \"endDate\"\n                    }\n                },\n                \"Tenancy\": {\n                    \"target\": \"com.amazonaws.ec2#FleetCapacityReservationTenancy\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Tenancy\",\n                        \"smithy.api#documentation\": \"<p>Indicates the tenancy of Capacity Reservation Fleet.</p>\",\n                        \"smithy.api#xmlName\": \"tenancy\"\n                    }\n                },\n                \"FleetCapacityReservations\": {\n                    \"target\": \"com.amazonaws.ec2#FleetCapacityReservationSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"FleetCapacityReservationSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the individual Capacity Reservations in the Capacity Reservation\\n\\t\\t\\tFleet.</p>\",\n                        \"smithy.api#xmlName\": \"fleetCapacityReservationSet\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>The tags assigned to the Capacity Reservation Fleet.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateCapacityReservationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Unique, case-sensitive identifier that you provide to ensure the idempotency of the request. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Run_Instance_Idempotency.html\\\">Ensure Idempotency</a>.</p>\"\n                    }\n                },\n                \"InstanceType\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The instance type for which to reserve capacity.</p>\\n         <note>\\n            <p>You can request future-dated Capacity Reservations for instance types in the C, M,\\n\\t\\t\\t\\tR, I, T, and G instance families only.</p>\\n         </note>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html\\\">Instance types</a> in the\\n\\t\\t\\t\\t<i>Amazon EC2 User Guide</i>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"InstancePlatform\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityReservationInstancePlatform\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The type of operating system for which to reserve capacity.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"AvailabilityZone\": {\n                    \"target\": \"com.amazonaws.ec2#AvailabilityZoneName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Availability Zone in which to create the Capacity Reservation.</p>\"\n                    }\n                },\n                \"AvailabilityZoneId\": {\n                    \"target\": \"com.amazonaws.ec2#AvailabilityZoneId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the Availability Zone in which to create the Capacity Reservation.</p>\"\n                    }\n                },\n                \"Tenancy\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityReservationTenancy\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates the tenancy of the Capacity Reservation. A Capacity Reservation can have one\\n\\t\\t\\tof the following tenancy settings:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>default</code> - The Capacity Reservation is created on hardware that is\\n\\t\\t\\t\\t\\tshared with other Amazon Web Services accounts.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>dedicated</code> - The Capacity Reservation is created on single-tenant\\n\\t\\t\\t\\t\\thardware that is dedicated to a single Amazon Web Services account.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"InstanceCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The number of instances for which to reserve capacity.</p>\\n         <note>\\n            <p>You can request future-dated Capacity Reservations for an instance count with a\\n\\t\\t\\t\\tminimum of 64 vCPUs. For example, if you request a future-dated Capacity\\n\\t\\t\\t\\tReservation for <code>m5.xlarge</code> instances, you must request at least 25\\n\\t\\t\\t\\tinstances (<i>16 * m5.xlarge = 64 vCPUs</i>).</p>\\n         </note>\\n         <p>Valid range: 1 - 1000</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"EbsOptimized\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether the Capacity Reservation supports EBS-optimized instances. This\\n\\t\\t\\toptimization provides dedicated throughput to Amazon EBS and an optimized configuration\\n\\t\\t\\tstack to provide optimal I/O performance. This optimization isn't available with all\\n\\t\\t\\tinstance types. Additional usage charges apply when using an EBS- optimized\\n\\t\\t\\tinstance.</p>\"\n                    }\n                },\n                \"EphemeralStorage\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>\\n            <i>Deprecated.</i>\\n         </p>\"\n                    }\n                },\n                \"EndDate\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time at which the Capacity Reservation expires. When a Capacity\\n\\t\\t\\tReservation expires, the reserved capacity is released and you can no longer launch\\n\\t\\t\\tinstances into it. The Capacity Reservation's state changes to <code>expired</code> when\\n\\t\\t\\tit reaches its end date and time.</p>\\n         <p>You must provide an <code>EndDate</code> value if <code>EndDateType</code> is\\n\\t\\t\\t\\t<code>limited</code>. Omit <code>EndDate</code> if <code>EndDateType</code> is\\n\\t\\t\\t\\t<code>unlimited</code>.</p>\\n         <p>If the <code>EndDateType</code> is <code>limited</code>, the Capacity Reservation is\\n\\t\\t\\tcancelled within an hour from the specified time. For example, if you specify 5/31/2019,\\n\\t\\t\\t13:30:55, the Capacity Reservation is guaranteed to end between 13:30:55 and 14:30:55 on\\n\\t\\t\\t5/31/2019.</p>\\n         <p>If you are requesting a future-dated Capacity Reservation, you can't specify an end\\n\\t\\t\\tdate and time that is within the commitment duration.</p>\"\n                    }\n                },\n                \"EndDateType\": {\n                    \"target\": \"com.amazonaws.ec2#EndDateType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates the way in which the Capacity Reservation ends. A Capacity Reservation can\\n\\t\\t\\thave one of the following end types:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>unlimited</code> - The Capacity Reservation remains active until you\\n\\t\\t\\t\\t\\texplicitly cancel it. Do not provide an <code>EndDate</code> if the\\n\\t\\t\\t\\t\\t\\t<code>EndDateType</code> is <code>unlimited</code>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>limited</code> - The Capacity Reservation expires automatically at a\\n\\t\\t\\t\\t\\tspecified date and time. You must provide an <code>EndDate</code> value if the\\n\\t\\t\\t\\t\\t\\t<code>EndDateType</code> value is <code>limited</code>.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"InstanceMatchCriteria\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceMatchCriteria\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates the type of instance launches that the Capacity Reservation accepts. The\\n\\t\\t\\toptions include:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>open</code> - The Capacity Reservation automatically matches all instances\\n\\t\\t\\t\\t\\tthat have matching attributes (instance type, platform, and Availability Zone).\\n\\t\\t\\t\\t\\tInstances that have matching attributes run in the Capacity Reservation\\n\\t\\t\\t\\t\\tautomatically without specifying any additional parameters.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>targeted</code> - The Capacity Reservation only accepts instances that\\n\\t\\t\\t\\t\\thave matching attributes (instance type, platform, and Availability Zone), and\\n\\t\\t\\t\\t\\texplicitly target the Capacity Reservation. This ensures that only permitted\\n\\t\\t\\t\\t\\tinstances can use the reserved capacity. </p>\\n            </li>\\n         </ul>\\n         <note>\\n            <p>If you are requesting a future-dated Capacity Reservation, you must specify\\n\\t\\t\\t\\t\\t<code>targeted</code>.</p>\\n         </note>\\n         <p>Default: <code>open</code>\\n         </p>\"\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags to apply to the Capacity Reservation during launch.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"OutpostArn\": {\n                    \"target\": \"com.amazonaws.ec2#OutpostArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<note>\\n            <p>Not supported for future-dated Capacity Reservations.</p>\\n         </note>\\n         <p>The Amazon Resource Name (ARN) of the Outpost on which to create the Capacity\\n\\t\\t\\tReservation.</p>\"\n                    }\n                },\n                \"PlacementGroupArn\": {\n                    \"target\": \"com.amazonaws.ec2#PlacementGroupArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<note>\\n            <p>Not supported for future-dated Capacity Reservations.</p>\\n         </note>\\n         <p>The Amazon Resource Name (ARN) of the cluster placement group in which to create the\\n\\t\\t\\tCapacity Reservation. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/cr-cpg.html\\\"> Capacity Reservations for cluster\\n\\t\\t\\t\\tplacement groups</a> in the <i>Amazon EC2 User Guide</i>.</p>\"\n                    }\n                },\n                \"StartDate\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<note>\\n            <p>Required for future-dated Capacity Reservations only. To create a Capacity\\n\\t\\t\\t\\tReservation for immediate use, omit this parameter. </p>\\n         </note>\\n         <p>The date and time at which the future-dated Capacity Reservation should become\\n\\t\\t\\tavailable for use, in the ISO8601 format in the UTC time zone\\n\\t\\t\\t\\t(<code>YYYY-MM-DDThh:mm:ss.sssZ</code>).</p>\\n         <p>You can request a future-dated Capacity Reservation between 5 and 120 days in\\n\\t\\t\\tadvance.</p>\"\n                    }\n                },\n                \"CommitmentDuration\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityReservationCommitmentDuration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<note>\\n            <p>Required for future-dated Capacity Reservations only. To create a Capacity\\n\\t\\t\\t\\tReservation for immediate use, omit this parameter. </p>\\n         </note>\\n         <p>Specify a commitment duration, in seconds, for the future-dated Capacity\\n\\t\\t\\tReservation.</p>\\n         <p>The commitment duration is a minimum duration for which you commit to having the\\n\\t\\t\\tfuture-dated Capacity Reservation in the <code>active</code> state in your account after\\n\\t\\t\\tit has been delivered.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/cr-concepts.html#cr-commitment-duration\\\"> Commitment\\n\\t\\t\\t\\tduration</a>.</p>\"\n                    }\n                },\n                \"DeliveryPreference\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityReservationDeliveryPreference\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<note>\\n            <p>Required for future-dated Capacity Reservations only. To create a Capacity\\n\\t\\t\\t\\tReservation for immediate use, omit this parameter. </p>\\n         </note>\\n         <p>Indicates that the requested capacity will be delivered in addition to any running\\n\\t\\t\\tinstances or reserved capacity that you have in your account at the requested date and\\n\\t\\t\\ttime.</p>\\n         <p>The only supported value is <code>incremental</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateCapacityReservationResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CapacityReservation\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityReservation\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CapacityReservation\",\n                        \"smithy.api#documentation\": \"<p>Information about the Capacity Reservation.</p>\",\n                        \"smithy.api#xmlName\": \"capacityReservation\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateCarrierGateway\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateCarrierGatewayRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreateCarrierGatewayResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates a carrier gateway.   For more information about carrier gateways, see <a href=\\\"https://docs.aws.amazon.com/wavelength/latest/developerguide/how-wavelengths-work.html#wavelength-carrier-gateway\\\">Carrier gateways</a> in the <i>Amazon Web Services Wavelength Developer Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateCarrierGatewayRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VpcId\": {\n                    \"target\": \"com.amazonaws.ec2#VpcId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the VPC to associate with the carrier gateway.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags to associate with the carrier gateway.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Unique, case-sensitive identifier that you provide to ensure the idempotency of the\\n            request. For more information, see <a href=\\\"https://docs.aws.amazon.com/ec2/latest/devguide/ec2-api-idempotency.html\\\">How to ensure\\n                idempotency</a>.</p>\",\n                        \"smithy.api#idempotencyToken\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateCarrierGatewayResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CarrierGateway\": {\n                    \"target\": \"com.amazonaws.ec2#CarrierGateway\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CarrierGateway\",\n                        \"smithy.api#documentation\": \"<p>Information about the carrier gateway.</p>\",\n                        \"smithy.api#xmlName\": \"carrierGateway\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateClientVpnEndpoint\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateClientVpnEndpointRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreateClientVpnEndpointResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates a Client VPN endpoint. A Client VPN endpoint is the resource you create and configure to \\n\\t\\t\\tenable and manage client VPN sessions. It is the destination endpoint at which all client VPN sessions \\n\\t\\t\\tare terminated.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateClientVpnEndpointRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ClientCidrBlock\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IPv4 address range, in CIDR notation, from which to assign client IP addresses. The address range cannot overlap with the local CIDR of the VPC in which the associated subnet is located, or the routes that you add manually. The address range cannot be changed after the Client VPN endpoint has been created. Client CIDR range must have a size of at least /22 and must not be greater than /12.</p>\"\n                    }\n                },\n                \"ServerCertificateArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ARN of the server certificate. For more information, see \\n\\t\\t\\tthe <a href=\\\"https://docs.aws.amazon.com/acm/latest/userguide/\\\">Certificate Manager User Guide</a>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"AuthenticationOptions\": {\n                    \"target\": \"com.amazonaws.ec2#ClientVpnAuthenticationRequestList\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>Information about the authentication method to be used to authenticate clients.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"Authentication\"\n                    }\n                },\n                \"ConnectionLogOptions\": {\n                    \"target\": \"com.amazonaws.ec2#ConnectionLogOptions\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>Information about the client connection logging options.</p>\\n         <p>If you enable client connection logging, data about client connections is sent to a\\n\\t\\t\\tCloudwatch Logs log stream. The following information is logged:</p>\\n         <ul>\\n            <li>\\n               <p>Client connection requests</p>\\n            </li>\\n            <li>\\n               <p>Client connection results (successful and unsuccessful)</p>\\n            </li>\\n            <li>\\n               <p>Reasons for unsuccessful client connection requests</p>\\n            </li>\\n            <li>\\n               <p>Client connection termination time</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DnsServers\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Information about the DNS servers to be used for DNS resolution. A Client VPN endpoint can\\n\\t\\t\\thave up to two DNS servers. If no DNS server is specified, the DNS address configured on the device is used for the DNS server.</p>\"\n                    }\n                },\n                \"TransportProtocol\": {\n                    \"target\": \"com.amazonaws.ec2#TransportProtocol\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The transport protocol to be used by the VPN session.</p>\\n         <p>Default value: <code>udp</code>\\n         </p>\"\n                    }\n                },\n                \"VpnPort\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The port number to assign to the Client VPN endpoint for TCP and UDP traffic.</p>\\n         <p>Valid Values: <code>443</code> | <code>1194</code>\\n         </p>\\n         <p>Default Value: <code>443</code>\\n         </p>\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A brief description of the Client VPN endpoint.</p>\"\n                    }\n                },\n                \"SplitTunnel\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether split-tunnel is enabled on the Client VPN endpoint.</p>\\n         <p>By default, split-tunnel on a VPN endpoint is disabled.</p>\\n         <p>For information about split-tunnel VPN endpoints, see <a href=\\\"https://docs.aws.amazon.com/vpn/latest/clientvpn-admin/split-tunnel-vpn.html\\\">Split-tunnel Client VPN endpoint</a> in the \\n\\t\\t\\t<i>Client VPN Administrator Guide</i>.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Unique, case-sensitive identifier that you provide to ensure the idempotency of the request. \\nFor more information, see <a href=\\\"https://docs.aws.amazon.com/ec2/latest/devguide/ec2-api-idempotency.html\\\">Ensuring idempotency</a>.</p>\",\n                        \"smithy.api#idempotencyToken\": {}\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags to apply to the Client VPN endpoint during creation.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                },\n                \"SecurityGroupIds\": {\n                    \"target\": \"com.amazonaws.ec2#ClientVpnSecurityGroupIdSet\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of one or more security groups to apply to the target network. You must also specify the ID of the VPC that contains the security groups.</p>\",\n                        \"smithy.api#xmlName\": \"SecurityGroupId\"\n                    }\n                },\n                \"VpcId\": {\n                    \"target\": \"com.amazonaws.ec2#VpcId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the VPC to associate with the Client VPN endpoint. If no security group IDs are specified in the request, the default security group for the VPC is applied.</p>\"\n                    }\n                },\n                \"SelfServicePortal\": {\n                    \"target\": \"com.amazonaws.ec2#SelfServicePortal\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify whether to enable the self-service portal for the Client VPN endpoint.</p>\\n         <p>Default Value: <code>enabled</code>\\n         </p>\"\n                    }\n                },\n                \"ClientConnectOptions\": {\n                    \"target\": \"com.amazonaws.ec2#ClientConnectOptions\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The options for managing connection authorization for new client connections.</p>\"\n                    }\n                },\n                \"SessionTimeoutHours\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum VPN session duration time in hours.</p>\\n         <p>Valid values: <code>8 | 10 | 12 | 24</code>\\n         </p>\\n         <p>Default value: <code>24</code>\\n         </p>\"\n                    }\n                },\n                \"ClientLoginBannerOptions\": {\n                    \"target\": \"com.amazonaws.ec2#ClientLoginBannerOptions\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Options for enabling a customizable text banner that will be displayed on\\n\\t\\t\\tAmazon Web Services provided clients when a VPN session is established.</p>\"\n                    }\n                },\n                \"ClientRouteEnforcementOptions\": {\n                    \"target\": \"com.amazonaws.ec2#ClientRouteEnforcementOptions\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Client route enforcement is a feature of the Client VPN service that helps enforce administrator defined routes on devices connected through the VPN. T\\n\\t\\this feature helps improve your security posture by ensuring that network traffic originating from a connected client is not inadvertently sent outside the VPN tunnel.</p>\\n         <p>Client route enforcement works by monitoring the route table of a connected device for routing policy changes to the VPN connection. If the feature detects any VPN routing policy modifications, it will automatically force an update to the route table, \\n\\t\\t\\treverting it back to the expected route configurations.</p>\"\n                    }\n                },\n                \"DisconnectOnSessionTimeout\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether the client VPN session is disconnected after the maximum timeout specified in <code>SessionTimeoutHours</code> is reached. If <code>true</code>, users are prompted to reconnect client VPN. If <code>false</code>, client VPN attempts to reconnect automatically. \\n                   The default value is <code>true</code>.</p>\"\n                    }\n                },\n                \"EndpointIpAddressType\": {\n                    \"target\": \"com.amazonaws.ec2#EndpointIpAddressType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IP address type for the Client VPN endpoint. Valid values are <code>ipv4</code>\\n\\t\\t\\t(default) for IPv4 addressing only, <code>ipv6</code> for IPv6 addressing only, or <code>dual-stack</code> for both IPv4 and IPv6\\n\\t\\t\\taddressing. When set to <code>dual-stack,</code> clients can connect to the endpoint\\n\\t\\t\\tusing either IPv4 or IPv6 addresses..</p>\"\n                    }\n                },\n                \"TrafficIpAddressType\": {\n                    \"target\": \"com.amazonaws.ec2#TrafficIpAddressType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IP address type for traffic within the Client VPN tunnel. Valid values are <code>ipv4</code> (default) for IPv4 traffic only, <code>ipv6</code> for IPv6 addressing only, or <code>dual-stack</code> for both IPv4 and IPv6 traffic. When set to <code>dual-stack</code>, clients can access both IPv4 and IPv6 resources through the VPN .</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateClientVpnEndpointResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ClientVpnEndpointId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ClientVpnEndpointId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Client VPN endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"clientVpnEndpointId\"\n                    }\n                },\n                \"Status\": {\n                    \"target\": \"com.amazonaws.ec2#ClientVpnEndpointStatus\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Status\",\n                        \"smithy.api#documentation\": \"<p>The current state of the Client VPN endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"status\"\n                    }\n                },\n                \"DnsName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DnsName\",\n                        \"smithy.api#documentation\": \"<p>The DNS name to be used by clients when establishing their VPN session.</p>\",\n                        \"smithy.api#xmlName\": \"dnsName\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateClientVpnRoute\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateClientVpnRouteRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreateClientVpnRouteResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Adds a route to a network to a Client VPN endpoint. Each Client VPN endpoint has a route table that describes the \\n\\t\\t\\tavailable destination network routes. Each route in the route table specifies the path for traﬃc to speciﬁc resources or networks.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateClientVpnRouteRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ClientVpnEndpointId\": {\n                    \"target\": \"com.amazonaws.ec2#ClientVpnEndpointId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the Client VPN endpoint to which to add the route.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DestinationCidrBlock\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The IPv4 address range, in CIDR notation, of the route destination. For example:</p>\\n         <ul>\\n            <li>\\n               <p>To add a route for Internet access, enter <code>0.0.0.0/0</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>To add a route for a peered VPC, enter the peered VPC's IPv4 CIDR range</p>\\n            </li>\\n            <li>\\n               <p>To add a route for an on-premises network, enter the Amazon Web Services Site-to-Site VPN connection's IPv4 CIDR range</p>\\n            </li>\\n            <li>\\n               <p>To add a route for the local network, enter the client CIDR range</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TargetVpcSubnetId\": {\n                    \"target\": \"com.amazonaws.ec2#SubnetId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the subnet through which you want to route traffic. The specified subnet must be\\n\\t\\t\\tan existing target network of the Client VPN endpoint.</p>\\n         <p>Alternatively, if you're adding a route for the local network, specify <code>local</code>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A brief description of the route.</p>\"\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Unique, case-sensitive identifier that you provide to ensure the idempotency of the request. \\nFor more information, see <a href=\\\"https://docs.aws.amazon.com/ec2/latest/devguide/ec2-api-idempotency.html\\\">Ensuring idempotency</a>.</p>\",\n                        \"smithy.api#idempotencyToken\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateClientVpnRouteResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Status\": {\n                    \"target\": \"com.amazonaws.ec2#ClientVpnRouteStatus\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Status\",\n                        \"smithy.api#documentation\": \"<p>The current state of the route.</p>\",\n                        \"smithy.api#xmlName\": \"status\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateCoipCidr\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateCoipCidrRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreateCoipCidrResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>\\n     Creates a range of customer-owned IP addresses.\\n      </p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateCoipCidrRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Cidr\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>\\n      A customer-owned IP address range to create.\\n      </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"CoipPoolId\": {\n                    \"target\": \"com.amazonaws.ec2#Ipv4PoolCoipId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>\\n         The ID of the address pool.\\n      </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateCoipCidrResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CoipCidr\": {\n                    \"target\": \"com.amazonaws.ec2#CoipCidr\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CoipCidr\",\n                        \"smithy.api#documentation\": \"<p>\\n         Information about a range of customer-owned IP addresses.\\n      </p>\",\n                        \"smithy.api#xmlName\": \"coipCidr\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateCoipPool\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateCoipPoolRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreateCoipPoolResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p> Creates a pool of customer-owned IP (CoIP) addresses. </p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateCoipPoolRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LocalGatewayRouteTableId\": {\n                    \"target\": \"com.amazonaws.ec2#LocalGatewayRoutetableId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>\\n      The ID of the local gateway route table.\\n      </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>\\n      The tags to assign to the CoIP address pool.\\n      </p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateCoipPoolResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CoipPool\": {\n                    \"target\": \"com.amazonaws.ec2#CoipPool\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CoipPool\",\n                        \"smithy.api#documentation\": \"<p>Information about the CoIP address pool.</p>\",\n                        \"smithy.api#xmlName\": \"coipPool\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateCustomerGateway\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateCustomerGatewayRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreateCustomerGatewayResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Provides information to Amazon Web Services about your customer gateway device. The\\n            customer gateway device is the appliance at your end of the VPN connection. You\\n            must provide the IP address of the customer gateway device’s external\\n            interface. The IP address must be static and can be behind a device performing network\\n            address translation (NAT).</p>\\n         <p>For devices that use Border Gateway Protocol (BGP), you can also provide the device's\\n            BGP Autonomous System Number (ASN). You can use an existing ASN assigned to your network.\\n            If you don't have an ASN already, you can use a private ASN. For more information, see \\n            <a href=\\\"https://docs.aws.amazon.com/vpn/latest/s2svpn/cgw-options.html\\\">Customer gateway \\n                options for your Site-to-Site VPN connection</a> in the <i>Amazon Web Services Site-to-Site VPN User Guide</i>.</p>\\n         <p>To create more than one customer gateway with the same VPN type, IP address, and\\n            BGP ASN, specify a unique device name for each customer gateway. An identical request\\n            returns information about the existing customer gateway; it doesn't create a new customer\\n            gateway.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To create a customer gateway\",\n                        \"documentation\": \"This example creates a customer gateway with the specified IP address for its outside interface.\",\n                        \"input\": {\n                            \"Type\": \"ipsec.1\",\n                            \"PublicIp\": \"12.1.2.3\",\n                            \"BgpAsn\": 65534\n                        },\n                        \"output\": {\n                            \"CustomerGateway\": {\n                                \"CustomerGatewayId\": \"cgw-0e11f167\",\n                                \"IpAddress\": \"12.1.2.3\",\n                                \"State\": \"available\",\n                                \"Type\": \"ipsec.1\",\n                                \"BgpAsn\": \"65534\"\n                            }\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#CreateCustomerGatewayRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"BgpAsn\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>For customer gateway devices that support BGP, specify the device's ASN. You must specify either <code>BgpAsn</code> or <code>BgpAsnExtended</code> when creating the customer gateway. If the ASN is larger than <code>2,147,483,647</code>, you must use <code>BgpAsnExtended</code>.</p>\\n         <p>Default: 65000</p>\\n         <p>Valid values: <code>1</code> to <code>2,147,483,647</code>\\n         </p>\"\n                    }\n                },\n                \"PublicIp\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>\\n            <i>This member has been deprecated.</i> The Internet-routable IP address for the customer gateway's outside interface. The\\n            address must be static.</p>\"\n                    }\n                },\n                \"CertificateArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) for the customer gateway certificate.</p>\"\n                    }\n                },\n                \"Type\": {\n                    \"target\": \"com.amazonaws.ec2#GatewayType\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The type of VPN connection that this customer gateway supports\\n            (<code>ipsec.1</code>).</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags to apply to the customer gateway.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                },\n                \"DeviceName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A name for the customer gateway device.</p>\\n         <p>Length Constraints: Up to 255 characters.</p>\"\n                    }\n                },\n                \"IpAddress\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IP address for the customer gateway device's outside interface. The address must be\\n            static. If <code>OutsideIpAddressType</code> in your VPN connection options is set to\\n                <code>PrivateIpv4</code>, you can use an RFC6598 or RFC1918 private IPv4 address. If\\n                <code>OutsideIpAddressType</code> is set to <code>Ipv6</code>, you can use an IPv6 address. </p>\"\n                    }\n                },\n                \"BgpAsnExtended\": {\n                    \"target\": \"com.amazonaws.ec2#Long\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>For customer gateway devices that support BGP, specify the device's ASN. You must specify either <code>BgpAsn</code> or <code>BgpAsnExtended</code> when creating the customer gateway. If the ASN is larger than <code>2,147,483,647</code>, you must use <code>BgpAsnExtended</code>.</p>\\n         <p>Valid values: <code>2,147,483,648</code> to <code>4,294,967,295</code>\\n         </p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually\\n            making the request, and provides an error response. If you have the required\\n            permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is\\n                <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the parameters for CreateCustomerGateway.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateCustomerGatewayResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CustomerGateway\": {\n                    \"target\": \"com.amazonaws.ec2#CustomerGateway\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CustomerGateway\",\n                        \"smithy.api#documentation\": \"<p>Information about the customer gateway.</p>\",\n                        \"smithy.api#xmlName\": \"customerGateway\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the output of CreateCustomerGateway.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateDefaultSubnet\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateDefaultSubnetRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreateDefaultSubnetResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates a default subnet with a size <code>/20</code> IPv4 CIDR block in the\\n            specified Availability Zone in your default VPC. You can have only one default subnet\\n            per Availability Zone. For more information, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/userguide/work-with-default-vpc.html#create-default-subnet\\\">Create a default\\n                subnet</a> in the <i>Amazon VPC User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateDefaultSubnetRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AvailabilityZone\": {\n                    \"target\": \"com.amazonaws.ec2#AvailabilityZoneName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Availability Zone in which to create the default subnet.</p>\\n         <p>Either <code>AvailabilityZone</code> or <code>AvailabilityZoneId</code> must be specified,\\n            but not both.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"Ipv6Native\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether to create an IPv6 only subnet. If you already have a default subnet\\n            for this Availability Zone, you must delete it before you can create an IPv6 only subnet.</p>\"\n                    }\n                },\n                \"AvailabilityZoneId\": {\n                    \"target\": \"com.amazonaws.ec2#AvailabilityZoneId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the Availability Zone.</p>\\n         <p>Either <code>AvailabilityZone</code> or <code>AvailabilityZoneId</code> must be specified,\\n            but not both.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateDefaultSubnetResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Subnet\": {\n                    \"target\": \"com.amazonaws.ec2#Subnet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Subnet\",\n                        \"smithy.api#documentation\": \"<p>Information about the subnet.</p>\",\n                        \"smithy.api#xmlName\": \"subnet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateDefaultVpc\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateDefaultVpcRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreateDefaultVpcResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates a default VPC with a size <code>/16</code> IPv4 CIDR block and a default subnet\\n\\t\\t\\tin each Availability Zone. For more information about the components of a default VPC,\\n\\t\\t\\tsee <a href=\\\"https://docs.aws.amazon.com/vpc/latest/userguide/default-vpc.html\\\">Default VPCs</a> \\n\\t\\t    in the <i>Amazon VPC User Guide</i>. You cannot specify the components of the \\n\\t\\t    default VPC yourself.</p>\\n         <p>If you deleted your previous default VPC, you can create a default VPC. You cannot have\\n\\t\\t\\tmore than one default VPC per Region.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateDefaultVpcRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateDefaultVpcResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Vpc\": {\n                    \"target\": \"com.amazonaws.ec2#Vpc\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Vpc\",\n                        \"smithy.api#documentation\": \"<p>Information about the VPC.</p>\",\n                        \"smithy.api#xmlName\": \"vpc\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateDelegateMacVolumeOwnershipTask\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateDelegateMacVolumeOwnershipTaskRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreateDelegateMacVolumeOwnershipTaskResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Delegates ownership of the Amazon EBS root volume for an Apple silicon \\n         Mac instance to an administrative user.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateDelegateMacVolumeOwnershipTaskRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Unique, case-sensitive identifier that you provide to ensure the idempotency of the request. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Run_Instance_Idempotency.html\\\">Ensuring Idempotency</a>.</p>\",\n                        \"smithy.api#idempotencyToken\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"InstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the Amazon EC2 Mac instance.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"MacCredentials\": {\n                    \"target\": \"com.amazonaws.ec2#SensitiveMacCredentials\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>Specifies the following credentials:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <b>Internal disk administrative user</b>\\n               </p>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <b>Username</b> - Only the default administrative user \\n                     (<code>aws-managed-user</code>) is supported and it is used by default. You can't \\n                     specify a different administrative user.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <b>Password</b> - If you did not change the default \\n                     password for <code>aws-managed-user</code>, specify the default password, which is \\n                     <i>blank</i>. Otherwise, specify your password.</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>Amazon EBS root volume administrative user</b>\\n               </p>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <b>Username</b> - If you did not change the default \\n                     administrative user, specify <code>ec2-user</code>. Otherwise, specify the username \\n                     for your administrative user.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <b>Password</b> - Specify the password for the \\n                     administrative user.</p>\\n                  </li>\\n               </ul>\\n            </li>\\n         </ul>\\n         <p>The credentials must be specified in the following JSON format:</p>\\n         <p>\\n            <code>{\\n  \\\"internalDiskPassword\\\":\\\"<i>internal-disk-admin_password</i>\\\",\\n  \\\"rootVolumeUsername\\\":\\\"<i>root-volume-admin_username</i>\\\",\\n  \\\"rootVolumepassword\\\":\\\"<i>root-volume-admin_password</i>\\\"\\n}</code>\\n         </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags to assign to the volume ownership delegation task.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateDelegateMacVolumeOwnershipTaskResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"MacModificationTask\": {\n                    \"target\": \"com.amazonaws.ec2#MacModificationTask\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MacModificationTask\",\n                        \"smithy.api#documentation\": \"<p>Information about the volume ownership delegation task.</p>\",\n                        \"smithy.api#xmlName\": \"macModificationTask\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateDhcpOptions\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateDhcpOptionsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreateDhcpOptionsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates a custom set of DHCP options. After you create a DHCP option set, you associate\\n\\t       it with a VPC. After you associate a DHCP option set with a VPC, all existing and newly \\n\\t       launched instances in the VPC use this set of DHCP options.</p>\\n         <p>The following are the individual DHCP options you can specify. For more information, see \\n           <a href=\\\"https://docs.aws.amazon.com/vpc/latest/userguide/VPC_DHCP_Options.html\\\">DHCP option sets</a> \\n           in the <i>Amazon VPC User Guide</i>.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>domain-name</code> - If you're using AmazonProvidedDNS in <code>us-east-1</code>, \\n                   specify <code>ec2.internal</code>. If you're using AmazonProvidedDNS in any other Region, \\n                   specify <code>region.compute.internal</code>. Otherwise, specify a custom domain name.\\n                   This value is used to complete unqualified DNS hostnames.</p>\\n               <p>Some Linux operating systems accept multiple domain names separated by spaces.\\n                   However, Windows and other Linux operating systems treat the value as a single\\n                   domain, which results in unexpected behavior. If your DHCP option set is\\n                   associated with a VPC that has instances running operating systems that treat\\n                   the value as a single domain, specify only one domain name.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>domain-name-servers</code> - The IP addresses of up to four DNS servers,\\n                   or AmazonProvidedDNS. To specify multiple domain name servers in a single parameter, \\n                   separate the IP addresses using commas. To have your instances receive custom DNS \\n                   hostnames as specified in <code>domain-name</code>, you must specify a custom DNS\\n                   server.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ntp-servers</code> - The IP addresses of up to eight Network Time Protocol (NTP)\\n                   servers (four IPv4 addresses and four IPv6 addresses).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>netbios-name-servers</code> - The IP addresses of up to four NetBIOS name\\n                   servers.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>netbios-node-type</code> - The NetBIOS node type (1, 2, 4, or 8). We recommend that\\n                   you specify 2. Broadcast and multicast are not supported. For more information about \\n                   NetBIOS node types, see <a href=\\\"https://www.ietf.org/rfc/rfc2132.txt\\\">RFC 2132</a>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ipv6-address-preferred-lease-time</code> - A value (in seconds, minutes, hours, or years) for how frequently a running instance with an IPv6 assigned to it goes through DHCPv6 lease renewal. \\n                   Acceptable values are between 140 and 2147483647 seconds (approximately 68 years). If no value is entered, the default lease time is 140 seconds. If you use long-term addressing for EC2 instances, you can increase the lease time and avoid frequent \\n                   lease renewal requests. Lease renewal typically occurs when half of the lease time has elapsed.</p>\\n            </li>\\n         </ul>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To create a DHCP options set\",\n                        \"documentation\": \"This example creates a DHCP options set.\",\n                        \"input\": {\n                            \"DhcpConfigurations\": [\n                                {\n                                    \"Key\": \"domain-name-servers\",\n                                    \"Values\": [\n                                        \"10.2.5.1\",\n                                        \"10.2.5.2\"\n                                    ]\n                                }\n                            ]\n                        },\n                        \"output\": {\n                            \"DhcpOptions\": {\n                                \"DhcpConfigurations\": [\n                                    {\n                                        \"Values\": [\n                                            {\n                                                \"Value\": \"10.2.5.2\"\n                                            },\n                                            {\n                                                \"Value\": \"10.2.5.1\"\n                                            }\n                                        ],\n                                        \"Key\": \"domain-name-servers\"\n                                    }\n                                ],\n                                \"DhcpOptionsId\": \"dopt-d9070ebb\"\n                            }\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#CreateDhcpOptionsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DhcpConfigurations\": {\n                    \"target\": \"com.amazonaws.ec2#NewDhcpConfigurationList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DhcpConfiguration\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>A DHCP configuration option.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"dhcpConfiguration\"\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags to assign to the DHCP option.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateDhcpOptionsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DhcpOptions\": {\n                    \"target\": \"com.amazonaws.ec2#DhcpOptions\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DhcpOptions\",\n                        \"smithy.api#documentation\": \"<p>A set of DHCP options.</p>\",\n                        \"smithy.api#xmlName\": \"dhcpOptions\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateEgressOnlyInternetGateway\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateEgressOnlyInternetGatewayRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreateEgressOnlyInternetGatewayResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>[IPv6 only] Creates an egress-only internet gateway for your VPC. An egress-only\\n\\t\\t\\tinternet gateway is used to enable outbound communication over IPv6 from instances in\\n\\t\\t\\tyour VPC to the internet, and prevents hosts outside of your VPC from initiating an IPv6\\n\\t\\t\\tconnection with your instance.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateEgressOnlyInternetGatewayRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Unique, case-sensitive identifier that you provide to ensure the idempotency of the\\n\\t\\t\\trequest. For more information, see <a href=\\\"https://docs.aws.amazon.com/ec2/latest/devguide/ec2-api-idempotency.html\\\">Ensuring idempotency</a>.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"VpcId\": {\n                    \"target\": \"com.amazonaws.ec2#VpcId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the VPC for which to create the egress-only internet gateway.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags to assign to the egress-only internet gateway.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateEgressOnlyInternetGatewayResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ClientToken\",\n                        \"smithy.api#documentation\": \"<p>Unique, case-sensitive identifier that you provide to ensure the idempotency of the\\n\\t\\t\\trequest.</p>\",\n                        \"smithy.api#xmlName\": \"clientToken\"\n                    }\n                },\n                \"EgressOnlyInternetGateway\": {\n                    \"target\": \"com.amazonaws.ec2#EgressOnlyInternetGateway\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EgressOnlyInternetGateway\",\n                        \"smithy.api#documentation\": \"<p>Information about the egress-only internet gateway.</p>\",\n                        \"smithy.api#xmlName\": \"egressOnlyInternetGateway\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateFleet\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateFleetRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreateFleetResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates an EC2 Fleet that contains the configuration information for On-Demand Instances and Spot Instances.\\n         Instances are launched immediately if there is available capacity.</p>\\n         <p>A single EC2 Fleet can include multiple launch specifications that vary by instance type,\\n         AMI, Availability Zone, or subnet.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-fleet.html\\\">EC2 Fleet</a> in the <i>Amazon EC2 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateFleetError\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LaunchTemplateAndOverrides\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplateAndOverridesResponse\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LaunchTemplateAndOverrides\",\n                        \"smithy.api#documentation\": \"<p>The launch templates and overrides that were used for launching the instances. The\\n         values that you specify in the Overrides replace the values in the launch template.</p>\",\n                        \"smithy.api#xmlName\": \"launchTemplateAndOverrides\"\n                    }\n                },\n                \"Lifecycle\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceLifecycle\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Lifecycle\",\n                        \"smithy.api#documentation\": \"<p>Indicates if the instance that could not be launched was a Spot Instance or On-Demand Instance.</p>\",\n                        \"smithy.api#xmlName\": \"lifecycle\"\n                    }\n                },\n                \"ErrorCode\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ErrorCode\",\n                        \"smithy.api#documentation\": \"<p>The error code that indicates why the instance could not be launched. For more\\n         information about error codes, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/errors-overview.html\\\">Error codes</a>.</p>\",\n                        \"smithy.api#xmlName\": \"errorCode\"\n                    }\n                },\n                \"ErrorMessage\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ErrorMessage\",\n                        \"smithy.api#documentation\": \"<p>The error message that describes why the instance could not be launched. For more\\n         information about error messages, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/errors-overview.html\\\">Error codes</a>.</p>\",\n                        \"smithy.api#xmlName\": \"errorMessage\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the instances that could not be launched by the fleet.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateFleetErrorsSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#CreateFleetError\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#CreateFleetInstance\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LaunchTemplateAndOverrides\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplateAndOverridesResponse\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LaunchTemplateAndOverrides\",\n                        \"smithy.api#documentation\": \"<p>The launch templates and overrides that were used for launching the instances. The\\n         values that you specify in the Overrides replace the values in the launch template.</p>\",\n                        \"smithy.api#xmlName\": \"launchTemplateAndOverrides\"\n                    }\n                },\n                \"Lifecycle\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceLifecycle\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Lifecycle\",\n                        \"smithy.api#documentation\": \"<p>Indicates if the instance that was launched is a Spot Instance or On-Demand Instance.</p>\",\n                        \"smithy.api#xmlName\": \"lifecycle\"\n                    }\n                },\n                \"InstanceIds\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceIdsSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceIds\",\n                        \"smithy.api#documentation\": \"<p>The IDs of the instances.</p>\",\n                        \"smithy.api#xmlName\": \"instanceIds\"\n                    }\n                },\n                \"InstanceType\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceType\",\n                        \"smithy.api#documentation\": \"<p>The instance type.</p>\",\n                        \"smithy.api#xmlName\": \"instanceType\"\n                    }\n                },\n                \"Platform\": {\n                    \"target\": \"com.amazonaws.ec2#PlatformValues\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Platform\",\n                        \"smithy.api#documentation\": \"<p>The value is <code>windows</code> for Windows instances in an EC2 Fleet. Otherwise, the value is\\n         blank.</p>\",\n                        \"smithy.api#xmlName\": \"platform\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the instances that were launched by the fleet.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateFleetInstancesSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#CreateFleetInstance\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#CreateFleetRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Unique, case-sensitive identifier that you provide to ensure the idempotency of the\\n          request. If you do not specify a client token, a randomly generated token is used for\\n          the request to ensure idempotency.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Run_Instance_Idempotency.html\\\">Ensuring\\n            idempotency</a>.</p>\",\n                        \"smithy.api#idempotencyToken\": {}\n                    }\n                },\n                \"SpotOptions\": {\n                    \"target\": \"com.amazonaws.ec2#SpotOptionsRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Describes the configuration of Spot Instances in an EC2 Fleet.</p>\"\n                    }\n                },\n                \"OnDemandOptions\": {\n                    \"target\": \"com.amazonaws.ec2#OnDemandOptionsRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Describes the configuration of On-Demand Instances in an EC2 Fleet.</p>\"\n                    }\n                },\n                \"ExcessCapacityTerminationPolicy\": {\n                    \"target\": \"com.amazonaws.ec2#FleetExcessCapacityTerminationPolicy\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether running instances should be terminated if the total target capacity of\\n         the EC2 Fleet is decreased below the current size of the EC2 Fleet.</p>\\n         <p>Supported only for fleets of type <code>maintain</code>.</p>\"\n                    }\n                },\n                \"LaunchTemplateConfigs\": {\n                    \"target\": \"com.amazonaws.ec2#FleetLaunchTemplateConfigListRequest\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The configuration for the EC2 Fleet.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TargetCapacitySpecification\": {\n                    \"target\": \"com.amazonaws.ec2#TargetCapacitySpecificationRequest\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The number of units to request.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TerminateInstancesWithExpiration\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether running instances should be terminated when the EC2 Fleet expires.</p>\"\n                    }\n                },\n                \"Type\": {\n                    \"target\": \"com.amazonaws.ec2#FleetType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The fleet type. The default value is <code>maintain</code>.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>maintain</code> - The EC2 Fleet places an asynchronous request for your desired\\n               capacity, and continues to maintain your desired Spot capacity by replenishing\\n               interrupted Spot Instances.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>request</code> - The EC2 Fleet places an asynchronous one-time request for your\\n               desired capacity, but does submit Spot requests in alternative capacity pools if Spot\\n               capacity is unavailable, and does not maintain Spot capacity if Spot Instances are\\n               interrupted.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>instant</code> - The EC2 Fleet places a synchronous one-time request for your\\n               desired capacity, and returns errors for any instances that could not be\\n               launched.</p>\\n            </li>\\n         </ul>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-fleet-request-type.html\\\">EC2 Fleet\\n            request types</a> in the <i>Amazon EC2 User Guide</i>.</p>\"\n                    }\n                },\n                \"ValidFrom\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The start date and time of the request, in UTC format (for example,\\n            <i>YYYY</i>-<i>MM</i>-<i>DD</i>T<i>HH</i>:<i>MM</i>:<i>SS</i>Z).\\n         The default is to start fulfilling the request immediately.</p>\"\n                    }\n                },\n                \"ValidUntil\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The end date and time of the request, in UTC format (for example,\\n            <i>YYYY</i>-<i>MM</i>-<i>DD</i>T<i>HH</i>:<i>MM</i>:<i>SS</i>Z).\\n         At this point, no new EC2 Fleet requests are placed or able to fulfill the request. If no value is specified, the request remains until you cancel it.</p>\"\n                    }\n                },\n                \"ReplaceUnhealthyInstances\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether EC2 Fleet should replace unhealthy Spot Instances. Supported only for\\n         fleets of type <code>maintain</code>. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/manage-ec2-fleet.html#ec2-fleet-health-checks\\\">EC2 Fleet\\n            health checks</a> in the <i>Amazon EC2 User Guide</i>.</p>\"\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The key-value pair for tagging the EC2 Fleet request on creation. For more information, see \\n         <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Tags.html#tag-resources\\\">Tag your resources</a>.</p>\\n         <p>If the fleet type is <code>instant</code>, specify a resource type of <code>fleet</code> \\n         to tag the fleet or <code>instance</code> to tag the instances at launch.</p>\\n         <p>If the fleet type is <code>maintain</code> or <code>request</code>, specify a resource\\n         type of <code>fleet</code> to tag the fleet. You cannot specify a resource type of\\n            <code>instance</code>. To tag instances at launch, specify the tags in a <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-launch-templates.html#create-launch-template\\\">launch template</a>.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                },\n                \"Context\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Reserved.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateFleetResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"FleetId\": {\n                    \"target\": \"com.amazonaws.ec2#FleetId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"FleetId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the EC2 Fleet.</p>\",\n                        \"smithy.api#xmlName\": \"fleetId\"\n                    }\n                },\n                \"Errors\": {\n                    \"target\": \"com.amazonaws.ec2#CreateFleetErrorsSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ErrorSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the instances that could not be launched by the fleet. Supported only for\\n            fleets of type <code>instant</code>.</p>\",\n                        \"smithy.api#xmlName\": \"errorSet\"\n                    }\n                },\n                \"Instances\": {\n                    \"target\": \"com.amazonaws.ec2#CreateFleetInstancesSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"FleetInstanceSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the instances that were launched by the fleet. Supported only for\\n            fleets of type <code>instant</code>.</p>\",\n                        \"smithy.api#xmlName\": \"fleetInstanceSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateFlowLogs\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateFlowLogsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreateFlowLogsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates one or more flow logs to capture information about IP traffic for a specific network interface,\\n            subnet, or VPC. </p>\\n         <p>Flow log data for a monitored network interface is recorded as flow log records, which are log events \\n            consisting of fields that describe the traffic flow. For more information, see \\n            <a href=\\\"https://docs.aws.amazon.com/vpc/latest/userguide/flow-log-records.html\\\">Flow log records</a> \\n            in the <i>Amazon VPC User Guide</i>.</p>\\n         <p>When publishing to CloudWatch Logs, flow log records are published to a log group, and each network \\n            interface has a unique log stream in the log group. When publishing to Amazon S3, flow log records for all \\n            of the monitored network interfaces are published to a single log file object that is stored in the specified \\n            bucket.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/userguide/flow-logs.html\\\">VPC Flow Logs</a> \\n            in the <i>Amazon VPC User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateFlowLogsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Unique, case-sensitive identifier that you provide to ensure the idempotency of the\\n            request. For more information, see <a href=\\\"https://docs.aws.amazon.com/ec2/latest/devguide/ec2-api-idempotency.html\\\">How to ensure\\n                idempotency</a>.</p>\"\n                    }\n                },\n                \"DeliverLogsPermissionArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the IAM role that allows Amazon EC2 to publish flow logs to the log destination.</p>\\n         <p>This parameter is required if the destination type is <code>cloud-watch-logs</code>,\\n            or if the destination type is <code>kinesis-data-firehose</code> and the delivery stream\\n            and the resources to monitor are in different accounts.</p>\"\n                    }\n                },\n                \"DeliverCrossAccountRole\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the IAM role that allows Amazon EC2 to publish flow logs across accounts.</p>\"\n                    }\n                },\n                \"LogGroupName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of a new or existing CloudWatch Logs log group where Amazon EC2 publishes your flow logs.</p>\\n         <p>This parameter is valid only if the destination type is <code>cloud-watch-logs</code>.</p>\"\n                    }\n                },\n                \"ResourceIds\": {\n                    \"target\": \"com.amazonaws.ec2#FlowLogResourceIds\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The IDs of the resources to monitor. For example, if the resource type is\\n                <code>VPC</code>, specify the IDs of the VPCs.</p>\\n         <p>Constraints: Maximum of 25 for transit gateway resource types. Maximum of 1000 for the\\n            other resource types.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"ResourceId\"\n                    }\n                },\n                \"ResourceType\": {\n                    \"target\": \"com.amazonaws.ec2#FlowLogsResourceType\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The type of resource to monitor.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TrafficType\": {\n                    \"target\": \"com.amazonaws.ec2#TrafficType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of traffic to monitor (accepted traffic, rejected traffic, or all traffic).\\n            This parameter is not supported for transit gateway resource types. It is required for\\n            the other resource types.</p>\"\n                    }\n                },\n                \"LogDestinationType\": {\n                    \"target\": \"com.amazonaws.ec2#LogDestinationType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of destination for the flow log data.</p>\\n         <p>Default: <code>cloud-watch-logs</code>\\n         </p>\"\n                    }\n                },\n                \"LogDestination\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The destination for the flow log data. The meaning of this parameter depends on the destination type.</p>\\n         <ul>\\n            <li>\\n               <p>If the destination type is <code>cloud-watch-logs</code>, specify the ARN of a CloudWatch Logs log group. For example:</p>\\n               <p>arn:aws:logs:<i>region</i>:<i>account_id</i>:log-group:<i>my_group</i>\\n               </p>\\n               <p>Alternatively, use the <code>LogGroupName</code> parameter.</p>\\n            </li>\\n            <li>\\n               <p>If the destination type is <code>s3</code>, specify the ARN of an S3 bucket. For example:</p>\\n               <p>arn:aws:s3:::<i>my_bucket</i>/<i>my_subfolder</i>/</p>\\n               <p>The subfolder is optional. Note that you can't use <code>AWSLogs</code> as a subfolder name.</p>\\n            </li>\\n            <li>\\n               <p>If the destination type is <code>kinesis-data-firehose</code>, specify the ARN of a Kinesis Data Firehose delivery stream. For example:</p>\\n               <p>arn:aws:firehose:<i>region</i>:<i>account_id</i>:deliverystream:<i>my_stream</i>\\n               </p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"LogFormat\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The fields to include in the flow log record. List the fields in the order in which\\n            they should appear. If you omit this parameter, the flow log is created using the\\n            default format. If you specify this parameter, you must include at least one\\n            field. For more information about the available fields, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/userguide/flow-log-records.html\\\">Flow log records</a> \\n            in the <i>Amazon VPC User Guide</i> or <a href=\\\"https://docs.aws.amazon.com/vpc/latest/tgw/tgw-flow-logs.html#flow-log-records\\\">Transit Gateway Flow Log\\n                    records</a> in the <i>Amazon Web Services Transit Gateway Guide</i>.</p>\\n         <p>Specify the fields using the <code>${field-id}</code> format, separated by spaces.</p>\"\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags to apply to the flow logs.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                },\n                \"MaxAggregationInterval\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum interval of time during which a flow of packets is captured and aggregated into a flow log record. \\n            The possible values are 60 seconds (1 minute) or 600 seconds (10 minutes).\\n            This parameter must be 60 seconds for transit gateway resource types.</p>\\n         <p>When a network interface is attached to a <a href=\\\"https://docs.aws.amazon.com/ec2/latest/instancetypes/ec2-nitro-instances.html\\\">Nitro-based\\n                instance</a>, the aggregation interval is always 60 seconds or less, regardless\\n            of the value that you specify.</p>\\n         <p>Default: 600</p>\"\n                    }\n                },\n                \"DestinationOptions\": {\n                    \"target\": \"com.amazonaws.ec2#DestinationOptionsRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The destination options.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateFlowLogsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ClientToken\",\n                        \"smithy.api#documentation\": \"<p>Unique, case-sensitive identifier that you provide to ensure the idempotency of the\\n            request.</p>\",\n                        \"smithy.api#xmlName\": \"clientToken\"\n                    }\n                },\n                \"FlowLogIds\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"FlowLogIdSet\",\n                        \"smithy.api#documentation\": \"<p>The IDs of the flow logs.</p>\",\n                        \"smithy.api#xmlName\": \"flowLogIdSet\"\n                    }\n                },\n                \"Unsuccessful\": {\n                    \"target\": \"com.amazonaws.ec2#UnsuccessfulItemSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Unsuccessful\",\n                        \"smithy.api#documentation\": \"<p>Information about the flow logs that could not be created successfully.</p>\",\n                        \"smithy.api#xmlName\": \"unsuccessful\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateFpgaImage\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateFpgaImageRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreateFpgaImageResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates an Amazon FPGA Image (AFI) from the specified design checkpoint (DCP).</p>\\n         <p>The create operation is asynchronous. To verify that the AFI was successfully \\n         created and is ready for use, check the output logs.</p>\\n         <p>An AFI contains the FPGA bitstream that is ready to download to an FPGA. \\n         You can securely deploy an AFI on multiple FPGA-accelerated instances.\\n         For more information, see the <a href=\\\"https://github.com/aws/aws-fpga/\\\">Amazon Web Services FPGA Hardware Development Kit</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateFpgaImageRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"InputStorageLocation\": {\n                    \"target\": \"com.amazonaws.ec2#StorageLocation\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The location of the encrypted design checkpoint in Amazon S3. The input must be a tarball.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"LogsStorageLocation\": {\n                    \"target\": \"com.amazonaws.ec2#StorageLocation\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The location in Amazon S3 for the output logs.</p>\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A description for the AFI.</p>\"\n                    }\n                },\n                \"Name\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A name for the AFI.</p>\"\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Unique, case-sensitive identifier that you provide to ensure the idempotency of the request. \\n      \\tFor more information, see <a href=\\\"https://docs.aws.amazon.com/ec2/latest/devguide/ec2-api-idempotency.html\\\">Ensuring Idempotency</a>.</p>\"\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags to apply to the FPGA image during creation.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateFpgaImageResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"FpgaImageId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"FpgaImageId\",\n                        \"smithy.api#documentation\": \"<p>The FPGA image identifier (AFI ID).</p>\",\n                        \"smithy.api#xmlName\": \"fpgaImageId\"\n                    }\n                },\n                \"FpgaImageGlobalId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"FpgaImageGlobalId\",\n                        \"smithy.api#documentation\": \"<p>The global FPGA image identifier (AGFI ID).</p>\",\n                        \"smithy.api#xmlName\": \"fpgaImageGlobalId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateImage\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateImageRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreateImageResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates an Amazon EBS-backed AMI from an Amazon EBS-backed instance that is either running or\\n      stopped.</p>\\n         <p>If you customized your instance with instance store volumes or Amazon EBS volumes in addition\\n      to the root device volume, the new AMI contains block device mapping information for those\\n      volumes. When you launch an instance from this new AMI, the instance automatically launches\\n      with those additional volumes.</p>\\n         <p>The location of the source instance determines where you can create the snapshots of the\\n      AMI:</p>\\n         <ul>\\n            <li>\\n               <p>If the source instance is in a Region, you must create the snapshots in the same\\n          Region as the instance.</p>\\n            </li>\\n            <li>\\n               <p>If the source instance is in a Local Zone, you can create the snapshots in the same\\n          Local Zone or in its parent Region.</p>\\n            </li>\\n         </ul>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/creating-an-ami-ebs.html\\\">Create an Amazon EBS-backed AMI</a> in\\n      the <i>Amazon Elastic Compute Cloud User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateImageRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags to apply to the AMI and snapshots on creation. You can tag the AMI, the\\n      snapshots, or both.</p>\\n         <ul>\\n            <li>\\n               <p>To tag the AMI, the value for <code>ResourceType</code> must be\\n          <code>image</code>.</p>\\n            </li>\\n            <li>\\n               <p>To tag the snapshots that are created of the root volume and of other Amazon EBS volumes\\n          that are attached to the instance, the value for <code>ResourceType</code> must be\\n            <code>snapshot</code>. The same tag is applied to all of the snapshots that are\\n          created.</p>\\n            </li>\\n         </ul>\\n         <p>If you specify other values for <code>ResourceType</code>, the request fails.</p>\\n         <p>To tag an AMI or snapshot after it has been created, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateTags.html\\\">CreateTags</a>. </p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                },\n                \"SnapshotLocation\": {\n                    \"target\": \"com.amazonaws.ec2#SnapshotLocationEnum\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<note>\\n            <p>Only supported for instances in Local Zones. If the source instance is not in a Local\\n        Zone, omit this parameter.</p>\\n         </note>\\n         <p>The Amazon S3 location where the snapshots will be stored.</p>\\n         <ul>\\n            <li>\\n               <p>To create local snapshots in the same Local Zone as the source instance, specify\\n          <code>local</code>.</p>\\n            </li>\\n            <li>\\n               <p>To create regional snapshots in the parent Region of the Local Zone, specify\\n          <code>regional</code> or omit this parameter.</p>\\n            </li>\\n         </ul>\\n         <p>Default: <code>regional</code>\\n         </p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n\\t\\t\\tand provides an error response. If you have the required permissions, the error response is \\n\\t\\t\\t<code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"InstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceId\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the instance.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"instanceId\"\n                    }\n                },\n                \"Name\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Name\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>A name for the new image.</p>\\n         <p>Constraints: 3-128 alphanumeric characters, parentheses (()), square brackets ([]), spaces\\n      ( ), periods (.), slashes (/), dashes (-), single quotes ('), at-signs (@), or\\n      underscores(_)</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"name\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Description\",\n                        \"smithy.api#documentation\": \"<p>A description for the new image.</p>\",\n                        \"smithy.api#xmlName\": \"description\"\n                    }\n                },\n                \"NoReboot\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NoReboot\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether or not the instance should be automatically rebooted before creating the\\n      image. Specify one of the following values:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>true</code> - The instance is not rebooted before creating the image. This\\n          creates crash-consistent snapshots that include only the data that has been written to the\\n          volumes at the time the snapshots are created. Buffered data and data in memory that has\\n          not yet been written to the volumes is not included in the snapshots.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>false</code> - The instance is rebooted before creating the image. This ensures\\n          that all buffered data and data in memory is written to the volumes before the snapshots\\n          are created.</p>\\n            </li>\\n         </ul>\\n         <p>Default: <code>false</code>\\n         </p>\",\n                        \"smithy.api#xmlName\": \"noReboot\"\n                    }\n                },\n                \"BlockDeviceMappings\": {\n                    \"target\": \"com.amazonaws.ec2#BlockDeviceMappingRequestList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"BlockDeviceMapping\",\n                        \"smithy.api#documentation\": \"<p>The block device mappings.</p>\\n         <p>When using the CreateImage action:</p>\\n         <ul>\\n            <li>\\n               <p>You can't change the volume size using the VolumeSize parameter. If you want a\\n          different volume size, you must first change the volume size of the source\\n          instance.</p>\\n            </li>\\n            <li>\\n               <p>You can't modify the encryption status of existing volumes or snapshots. To create an\\n          AMI with volumes or snapshots that have a different encryption status (for example, where\\n          the source volume and snapshots are unencrypted, and you want to create an AMI with\\n          encrypted volumes or snapshots), copy the image instead.</p>\\n            </li>\\n            <li>\\n               <p>The only option that can be changed for existing mappings or snapshots is\\n            <code>DeleteOnTermination</code>.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"blockDeviceMapping\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateImageResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ImageId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ImageId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the new AMI.</p>\",\n                        \"smithy.api#xmlName\": \"imageId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateImageUsageReport\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateImageUsageReportRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreateImageUsageReportResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates a report that shows how your image is used across other Amazon Web Services accounts. The report\\n      provides visibility into which accounts are using the specified image, and how many resources\\n      (EC2 instances or launch templates) are referencing it.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/your-ec2-ami-usage.html\\\">View your AMI usage</a> in the\\n      <i>Amazon EC2 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateImageUsageReportRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ImageId\": {\n                    \"target\": \"com.amazonaws.ec2#ImageId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the image to report on.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n\\t\\t\\tand provides an error response. If you have the required permissions, the error response is \\n\\t\\t\\t<code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"ResourceTypes\": {\n                    \"target\": \"com.amazonaws.ec2#ImageUsageResourceTypeRequestList\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The resource types to include in the report.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"ResourceType\"\n                    }\n                },\n                \"AccountIds\": {\n                    \"target\": \"com.amazonaws.ec2#ImageUsageReportUserIdStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account IDs to include in the report. To include all accounts, omit this\\n      parameter.</p>\",\n                        \"smithy.api#xmlName\": \"AccountId\"\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A unique, case-sensitive identifier that you provide to ensure idempotency of the request.</p>\",\n                        \"smithy.api#idempotencyToken\": {}\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags to apply to the report on creation. The <code>ResourceType</code> must be set to\\n      <code>image-usage-report</code>; any other value will cause the report creation to\\n      fail.</p>\\n         <p>To tag a report after it has been created, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateTags.html\\\">CreateTags</a>.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateImageUsageReportResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ReportId\": {\n                    \"target\": \"com.amazonaws.ec2#ImageUsageReportId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ReportId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the report.</p>\",\n                        \"smithy.api#xmlName\": \"reportId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateInstanceConnectEndpoint\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateInstanceConnectEndpointRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreateInstanceConnectEndpointResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates an EC2 Instance Connect Endpoint.</p>\\n         <p>An EC2 Instance Connect Endpoint allows you to connect to an instance, without\\n            requiring the instance to have a public IPv4 or public IPv6 address. For more\\n            information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Connect-using-EC2-Instance-Connect-Endpoint.html\\\">Connect to your instances using EC2 Instance Connect Endpoint</a> in the\\n                <i>Amazon EC2 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateInstanceConnectEndpointRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n            and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n            Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"SubnetId\": {\n                    \"target\": \"com.amazonaws.ec2#SubnetId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the subnet in which to create the EC2 Instance Connect Endpoint.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"SecurityGroupIds\": {\n                    \"target\": \"com.amazonaws.ec2#SecurityGroupIdStringListRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more security groups to associate with the endpoint. If you don't specify a security group, \\n            the default security group for your VPC will be associated with the endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"SecurityGroupId\"\n                    }\n                },\n                \"PreserveClientIp\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether the client IP address is preserved as the source. The following are the possible values.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>true</code> - Use the client IP address as the source.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>false</code> - Use the network interface IP address as the source.</p>\\n            </li>\\n         </ul>\\n         <note>\\n            <p>\\n               <code>PreserveClientIp</code> is only supported on IPv4 EC2 Instance Connect\\n                Endpoints. To use <code>PreserveClientIp</code>, the value for\\n                    <code>IpAddressType</code> must be <code>ipv4</code>.</p>\\n         </note>\\n         <p>Default: <code>false</code>\\n         </p>\"\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Unique, case-sensitive identifier that you provide to ensure the idempotency of the request.</p>\",\n                        \"smithy.api#idempotencyToken\": {}\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags to apply to the EC2 Instance Connect Endpoint during creation.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                },\n                \"IpAddressType\": {\n                    \"target\": \"com.amazonaws.ec2#IpAddressType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IP address type of the endpoint.</p>\\n         <p>If no value is specified, the default value is determined by the IP address type of\\n            the subnet:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>dualstack</code> - If the subnet has both IPv4 and IPv6 CIDRs</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ipv4</code> - If the subnet has only IPv4 CIDRs</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ipv6</code> - If the subnet has only IPv6 CIDRs</p>\\n            </li>\\n         </ul>\\n         <note>\\n            <p>\\n               <code>PreserveClientIp</code> is only supported on IPv4 EC2 Instance Connect\\n                Endpoints. To use <code>PreserveClientIp</code>, the value for\\n                <code>IpAddressType</code> must be <code>ipv4</code>.</p>\\n         </note>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateInstanceConnectEndpointResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceConnectEndpoint\": {\n                    \"target\": \"com.amazonaws.ec2#Ec2InstanceConnectEndpoint\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceConnectEndpoint\",\n                        \"smithy.api#documentation\": \"<p>Information about the EC2 Instance Connect Endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"instanceConnectEndpoint\"\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ClientToken\",\n                        \"smithy.api#documentation\": \"<p>Unique, case-sensitive idempotency token provided by the client in the the request.</p>\",\n                        \"smithy.api#xmlName\": \"clientToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateInstanceEventWindow\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateInstanceEventWindowRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreateInstanceEventWindowResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates an event window in which scheduled events for the associated Amazon EC2 instances can\\n         run.</p>\\n         <p>You can define either a set of time ranges or a cron expression when creating the event\\n         window, but not both. All event window times are in UTC.</p>\\n         <p>You can create up to 200 event windows per Amazon Web Services Region.</p>\\n         <p>When you create the event window, targets (instance IDs, Dedicated Host IDs, or tags)\\n         are not yet associated with it. To ensure that the event window can be used, you must\\n         associate one or more targets with it by using the <a>AssociateInstanceEventWindow</a> API.</p>\\n         <important>\\n            <p>Event windows are applicable only for scheduled events that stop, reboot, or\\n            terminate instances.</p>\\n            <p>Event windows are <i>not</i> applicable for:</p>\\n            <ul>\\n               <li>\\n                  <p>Expedited scheduled events and network maintenance events. </p>\\n               </li>\\n               <li>\\n                  <p>Unscheduled maintenance such as AutoRecovery and unplanned reboots.</p>\\n               </li>\\n            </ul>\\n         </important>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/event-windows.html\\\">Define event windows for scheduled\\n            events</a> in the <i>Amazon EC2 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateInstanceEventWindowRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"Name\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the event window.</p>\"\n                    }\n                },\n                \"TimeRanges\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceEventWindowTimeRangeRequestSet\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time range for the event window. If you specify a time range, you can't specify a\\n         cron expression.</p>\",\n                        \"smithy.api#xmlName\": \"TimeRange\"\n                    }\n                },\n                \"CronExpression\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceEventWindowCronExpression\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The cron expression for the event window, for example, <code>* 0-4,20-23 * * 1,5</code>.\\n         If you specify a cron expression, you can't specify a time range.</p>\\n         <p>Constraints:</p>\\n         <ul>\\n            <li>\\n               <p>Only hour and day of the week values are supported.</p>\\n            </li>\\n            <li>\\n               <p>For day of the week values, you can specify either integers <code>0</code> through\\n                  <code>6</code>, or alternative single values <code>SUN</code> through\\n                  <code>SAT</code>.</p>\\n            </li>\\n            <li>\\n               <p>The minute, month, and year must be specified by <code>*</code>.</p>\\n            </li>\\n            <li>\\n               <p>The hour value must be one or a multiple range, for example, <code>0-4</code> or\\n                  <code>0-4,20-23</code>.</p>\\n            </li>\\n            <li>\\n               <p>Each hour range must be >= 2 hours, for example, <code>0-2</code> or\\n                  <code>20-23</code>.</p>\\n            </li>\\n            <li>\\n               <p>The event window must be >= 4 hours. The combined total time ranges in the event\\n               window must be >= 4 hours.</p>\\n            </li>\\n         </ul>\\n         <p>For more information about cron expressions, see <a href=\\\"https://en.wikipedia.org/wiki/Cron\\\">cron</a> on the <i>Wikipedia\\n            website</i>.</p>\"\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags to apply to the event window.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateInstanceEventWindowResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceEventWindow\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceEventWindow\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceEventWindow\",\n                        \"smithy.api#documentation\": \"<p>Information about the event window.</p>\",\n                        \"smithy.api#xmlName\": \"instanceEventWindow\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateInstanceExportTask\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateInstanceExportTaskRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreateInstanceExportTaskResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Exports a running or stopped instance to an Amazon S3 bucket.</p>\\n         <p>For information about the prerequisites for your Amazon S3 bucket, supported operating systems,\\n   image formats, and known limitations for the types of instances you can export, see <a href=\\\"https://docs.aws.amazon.com/vm-import/latest/userguide/vmexport.html\\\">Exporting an instance as a VM Using VM\\n    Import/Export</a> in the <i>VM Import/Export User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateInstanceExportTaskRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags to apply to the export instance task during creation.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Description\",\n                        \"smithy.api#documentation\": \"<p>A description for the conversion task or the resource being exported. The maximum length is 255 characters.</p>\",\n                        \"smithy.api#xmlName\": \"description\"\n                    }\n                },\n                \"InstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceId\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the instance.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"instanceId\"\n                    }\n                },\n                \"TargetEnvironment\": {\n                    \"target\": \"com.amazonaws.ec2#ExportEnvironment\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TargetEnvironment\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The target virtualization environment.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"targetEnvironment\"\n                    }\n                },\n                \"ExportToS3Task\": {\n                    \"target\": \"com.amazonaws.ec2#ExportToS3TaskSpecification\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ExportToS3\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The format and location for an export instance task.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"exportToS3\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateInstanceExportTaskResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ExportTask\": {\n                    \"target\": \"com.amazonaws.ec2#ExportTask\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ExportTask\",\n                        \"smithy.api#documentation\": \"<p>Information about the export instance task.</p>\",\n                        \"smithy.api#xmlName\": \"exportTask\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateInternetGateway\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateInternetGatewayRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreateInternetGatewayResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates an internet gateway for use with a VPC. After creating the internet gateway,\\n\\t\\t\\tyou attach it to a VPC using <a>AttachInternetGateway</a>.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Internet_Gateway.html\\\">Internet gateways</a> in the \\n           <i>Amazon VPC User Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To create an Internet gateway\",\n                        \"documentation\": \"This example creates an Internet gateway.\",\n                        \"output\": {\n                            \"InternetGateway\": {\n                                \"Tags\": [],\n                                \"InternetGatewayId\": \"igw-c0a643a9\",\n                                \"Attachments\": []\n                            }\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#CreateInternetGatewayRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags to assign to the internet gateway.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateInternetGatewayResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InternetGateway\": {\n                    \"target\": \"com.amazonaws.ec2#InternetGateway\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InternetGateway\",\n                        \"smithy.api#documentation\": \"<p>Information about the internet gateway.</p>\",\n                        \"smithy.api#xmlName\": \"internetGateway\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateIpam\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateIpamRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreateIpamResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Create an IPAM. Amazon VPC IP Address Manager (IPAM) is a VPC feature that you can use\\n         to automate your IP address management workflows including assigning, tracking,\\n         troubleshooting, and auditing IP addresses across Amazon Web Services Regions and accounts\\n         throughout your Amazon Web Services Organization.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/ipam/create-ipam.html\\\">Create an IPAM</a> in the <i>Amazon VPC IPAM User Guide</i>.\\n      </p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateIpamExternalResourceVerificationToken\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateIpamExternalResourceVerificationTokenRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreateIpamExternalResourceVerificationTokenResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Create a verification token. A verification token is an Amazon Web Services-generated random value that you can use to prove ownership of an external resource. For example, you can use a verification token to validate that you control a public IP address range when you bring an IP address range to Amazon Web Services (BYOIP).\\n</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateIpamExternalResourceVerificationTokenRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A check for whether you have the required permissions for the action without actually making the request \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"IpamId\": {\n                    \"target\": \"com.amazonaws.ec2#IpamId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the IPAM that will create the token.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Token tags.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A unique, case-sensitive identifier that you provide to ensure the idempotency of the request. For more information, see <a href=\\\"https://docs.aws.amazon.com/ec2/latest/devguide/ec2-api-idempotency.html\\\">Ensuring idempotency</a>.</p>\",\n                        \"smithy.api#idempotencyToken\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateIpamExternalResourceVerificationTokenResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"IpamExternalResourceVerificationToken\": {\n                    \"target\": \"com.amazonaws.ec2#IpamExternalResourceVerificationToken\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpamExternalResourceVerificationToken\",\n                        \"smithy.api#documentation\": \"<p>The verification token.</p>\",\n                        \"smithy.api#xmlName\": \"ipamExternalResourceVerificationToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateIpamPool\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateIpamPoolRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreateIpamPoolResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Create an IP address pool for Amazon VPC IP Address Manager (IPAM). In IPAM, a pool is a collection of contiguous IP addresses CIDRs. Pools enable you to organize your IP addresses according to your routing and security needs. For example, if you have separate routing and security needs for development and production applications, you can create a pool for each.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/ipam/create-top-ipam.html\\\">Create a top-level pool</a> in the <i>Amazon VPC IPAM User Guide</i>.\\n      </p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateIpamPoolRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A check for whether you have the required permissions for the action without actually making the request \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"IpamScopeId\": {\n                    \"target\": \"com.amazonaws.ec2#IpamScopeId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the scope in which you would like to create the IPAM pool.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Locale\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The locale for the pool should be one of the following:</p>\\n         <ul>\\n            <li>\\n               <p>An Amazon Web Services Region where you want this IPAM pool to be available for allocations.</p>\\n            </li>\\n            <li>\\n               <p>The network border group for an Amazon Web Services Local Zone where you want this IPAM pool to be available for allocations (<a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-byoip.html#byoip-zone-avail\\\">supported Local Zones</a>). This option is only available for IPAM IPv4 pools in the public scope.</p>\\n            </li>\\n         </ul>\\n         <p>Possible values: Any Amazon Web Services Region or supported Amazon Web Services Local Zone. Default is <code>none</code> and means any locale.</p>\"\n                    }\n                },\n                \"SourceIpamPoolId\": {\n                    \"target\": \"com.amazonaws.ec2#IpamPoolId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the source IPAM pool. Use this option to create a pool within an existing pool. Note that the CIDR you provision for the pool within the source pool must be available in the source pool's CIDR range.</p>\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A description for the IPAM pool.</p>\"\n                    }\n                },\n                \"AddressFamily\": {\n                    \"target\": \"com.amazonaws.ec2#AddressFamily\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The IP protocol assigned to this IPAM pool. You must choose either IPv4 or IPv6 protocol for a pool.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"AutoImport\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If selected, IPAM will continuously look for resources within the CIDR range of this pool \\n         and automatically import them as allocations into your IPAM. The CIDRs that will be allocated for\\n         these resources must not already be allocated to other resources in order for the import to succeed. IPAM will import \\n         a CIDR regardless of its compliance with the pool's allocation rules, so a resource might be imported and subsequently \\n         marked as noncompliant. If IPAM discovers multiple CIDRs that overlap, IPAM will import the largest CIDR only. If IPAM \\n         discovers multiple CIDRs with matching CIDRs, IPAM will randomly import one of them only.\\n      </p>\\n         <p>A locale must be set on the pool for this feature to work.</p>\"\n                    }\n                },\n                \"PubliclyAdvertisable\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Determines if the pool is publicly advertisable. The request can only contain <code>PubliclyAdvertisable</code> if <code>AddressFamily</code> is <code>ipv6</code> and <code>PublicIpSource</code> is <code>byoip</code>.</p>\"\n                    }\n                },\n                \"AllocationMinNetmaskLength\": {\n                    \"target\": \"com.amazonaws.ec2#IpamNetmaskLength\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The minimum netmask length required for CIDR allocations in this IPAM pool to be compliant. The minimum netmask length must be \\n         less than the maximum netmask length. Possible netmask lengths for IPv4 addresses are 0 - 32. Possible netmask lengths for IPv6 addresses are  0 - 128.</p>\"\n                    }\n                },\n                \"AllocationMaxNetmaskLength\": {\n                    \"target\": \"com.amazonaws.ec2#IpamNetmaskLength\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum netmask length possible for CIDR allocations in this IPAM pool to be compliant. The maximum netmask length must be \\n         greater than the minimum netmask length. Possible netmask lengths for IPv4 addresses are 0 - 32. Possible netmask lengths for IPv6 addresses are  0 - 128.</p>\"\n                    }\n                },\n                \"AllocationDefaultNetmaskLength\": {\n                    \"target\": \"com.amazonaws.ec2#IpamNetmaskLength\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The default netmask length for allocations added to this pool. If, for example, the CIDR assigned to this pool is 10.0.0.0/8 and you enter 16 here, \\n         new allocations will default to 10.0.0.0/16.</p>\"\n                    }\n                },\n                \"AllocationResourceTags\": {\n                    \"target\": \"com.amazonaws.ec2#RequestIpamResourceTagList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Tags that are required for resources that use CIDRs from this IPAM pool. Resources that do not have these tags will not be allowed to allocate space from the pool. If the resources have their tags changed after they have allocated space or if the allocation tagging requirements are changed on the pool, the resource may be marked as noncompliant.</p>\",\n                        \"smithy.api#xmlName\": \"AllocationResourceTag\"\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\\n    For example, to find all resources that have a tag with the key <code>Owner</code> and the value <code>TeamA</code>, specify <code>tag:Owner</code> for the filter name and <code>TeamA</code> for the filter value.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A unique, case-sensitive identifier that you provide to ensure the idempotency of the request. For more information, see <a href=\\\"https://docs.aws.amazon.com/ec2/latest/devguide/ec2-api-idempotency.html\\\">Ensuring idempotency</a>.</p>\",\n                        \"smithy.api#idempotencyToken\": {}\n                    }\n                },\n                \"AwsService\": {\n                    \"target\": \"com.amazonaws.ec2#IpamPoolAwsService\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Limits which service in Amazon Web Services that the pool can be used in. \\\"ec2\\\", for example, allows users to use space for Elastic IP addresses and VPCs.</p>\"\n                    }\n                },\n                \"PublicIpSource\": {\n                    \"target\": \"com.amazonaws.ec2#IpamPoolPublicIpSource\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IP address source for pools in the public scope. Only used for provisioning IP address CIDRs to pools in the public scope. Default is <code>byoip</code>. For more information, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/ipam/intro-create-ipv6-pools.html\\\">Create IPv6 pools</a> in the <i>Amazon VPC IPAM User Guide</i>. \\n         By default, you can add only one Amazon-provided IPv6 CIDR block to a top-level IPv6 pool if PublicIpSource is <code>amazon</code>. For information on increasing the default limit, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/ipam/quotas-ipam.html\\\"> Quotas for your IPAM</a> in the <i>Amazon VPC IPAM User Guide</i>.</p>\"\n                    }\n                },\n                \"SourceResource\": {\n                    \"target\": \"com.amazonaws.ec2#IpamPoolSourceResourceRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The resource used to provision CIDRs to a resource planning pool.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateIpamPoolResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"IpamPool\": {\n                    \"target\": \"com.amazonaws.ec2#IpamPool\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpamPool\",\n                        \"smithy.api#documentation\": \"<p>Information about the IPAM pool created.</p>\",\n                        \"smithy.api#xmlName\": \"ipamPool\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateIpamRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A check for whether you have the required permissions for the action without actually making the request \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A description for the IPAM.</p>\"\n                    }\n                },\n                \"OperatingRegions\": {\n                    \"target\": \"com.amazonaws.ec2#AddIpamOperatingRegionSet\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The operating Regions for the IPAM. Operating Regions are Amazon Web Services Regions where the IPAM is allowed to manage IP address CIDRs. IPAM only discovers and monitors resources in the Amazon Web Services Regions you select as operating Regions. </p>\\n         <p>For more information about operating Regions, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/ipam/create-ipam.html\\\">Create an IPAM</a> in the <i>Amazon VPC IPAM User Guide</i>.\\n      </p>\",\n                        \"smithy.api#xmlName\": \"OperatingRegion\"\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\\n    For example, to find all resources that have a tag with the key <code>Owner</code> and the value <code>TeamA</code>, specify <code>tag:Owner</code> for the filter name and <code>TeamA</code> for the filter value.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A unique, case-sensitive identifier that you provide to ensure the idempotency of the request. For more information, see <a href=\\\"https://docs.aws.amazon.com/ec2/latest/devguide/ec2-api-idempotency.html\\\">Ensuring idempotency</a>.</p>\",\n                        \"smithy.api#idempotencyToken\": {}\n                    }\n                },\n                \"Tier\": {\n                    \"target\": \"com.amazonaws.ec2#IpamTier\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>IPAM is offered in a Free Tier and an Advanced Tier. For more information about the features available in each tier and the costs associated with the tiers, see <a href=\\\"http://aws.amazon.com/vpc/pricing/\\\">Amazon VPC pricing > IPAM tab</a>.</p>\"\n                    }\n                },\n                \"EnablePrivateGua\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Enable this option to use your own GUA ranges as private IPv6 addresses. This option is disabled by default.</p>\"\n                    }\n                },\n                \"MeteredAccount\": {\n                    \"target\": \"com.amazonaws.ec2#IpamMeteredAccount\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A metered account is an Amazon Web Services account that is charged for active IP addresses managed in IPAM. For more information, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/ipam/ipam-enable-cost-distro.html\\\">Enable cost distribution</a> in the <i>Amazon VPC IPAM User Guide</i>.</p>\\n         <p>Possible values:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>ipam-owner</code> (default): The Amazon Web Services account which owns the IPAM is charged for all active IP addresses managed in IPAM.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>resource-owner</code>: The Amazon Web Services account that owns the IP address is charged for the active IP address.</p>\\n            </li>\\n         </ul>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateIpamResourceDiscovery\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateIpamResourceDiscoveryRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreateIpamResourceDiscoveryResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates an IPAM resource discovery. A resource discovery is an IPAM component that enables IPAM to manage and monitor resources that belong to the owning account.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateIpamResourceDiscoveryRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A check for whether you have the required permissions for the action without actually making the request \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A description for the IPAM resource discovery.</p>\"\n                    }\n                },\n                \"OperatingRegions\": {\n                    \"target\": \"com.amazonaws.ec2#AddIpamOperatingRegionSet\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Operating Regions for the IPAM resource discovery. Operating Regions are Amazon Web Services Regions where the IPAM is allowed to manage IP address CIDRs. IPAM only discovers and monitors resources in the Amazon Web Services Regions you select as operating Regions.</p>\",\n                        \"smithy.api#xmlName\": \"OperatingRegion\"\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Tag specifications for the IPAM resource discovery.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A client token for the IPAM resource discovery.</p>\",\n                        \"smithy.api#idempotencyToken\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateIpamResourceDiscoveryResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"IpamResourceDiscovery\": {\n                    \"target\": \"com.amazonaws.ec2#IpamResourceDiscovery\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpamResourceDiscovery\",\n                        \"smithy.api#documentation\": \"<p>An IPAM resource discovery.</p>\",\n                        \"smithy.api#xmlName\": \"ipamResourceDiscovery\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateIpamResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Ipam\": {\n                    \"target\": \"com.amazonaws.ec2#Ipam\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Ipam\",\n                        \"smithy.api#documentation\": \"<p>Information about the IPAM created.</p>\",\n                        \"smithy.api#xmlName\": \"ipam\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateIpamScope\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateIpamScopeRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreateIpamScopeResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Create an IPAM scope. In IPAM, a scope is the highest-level container within IPAM. An IPAM contains two default scopes. Each scope represents the IP space for a single network. The private scope is intended for all private IP address space. The public scope is intended for all public IP address space. Scopes enable you to reuse IP addresses across multiple unconnected networks without causing IP address overlap or conflict.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/ipam/add-scope-ipam.html\\\">Add a scope</a> in the <i>Amazon VPC IPAM User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateIpamScopeRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A check for whether you have the required permissions for the action without actually making the request \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"IpamId\": {\n                    \"target\": \"com.amazonaws.ec2#IpamId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the IPAM for which you're creating this scope.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A description for the scope you're creating.</p>\"\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\\n    For example, to find all resources that have a tag with the key <code>Owner</code> and the value <code>TeamA</code>, specify <code>tag:Owner</code> for the filter name and <code>TeamA</code> for the filter value.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A unique, case-sensitive identifier that you provide to ensure the idempotency of the request. For more information, see <a href=\\\"https://docs.aws.amazon.com/ec2/latest/devguide/ec2-api-idempotency.html\\\">Ensuring idempotency</a>.</p>\",\n                        \"smithy.api#idempotencyToken\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateIpamScopeResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"IpamScope\": {\n                    \"target\": \"com.amazonaws.ec2#IpamScope\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpamScope\",\n                        \"smithy.api#documentation\": \"<p>Information about the created scope.</p>\",\n                        \"smithy.api#xmlName\": \"ipamScope\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateKeyPair\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateKeyPairRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#KeyPair\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates an ED25519 or 2048-bit RSA key pair with the specified name and in the\\n            specified format. Amazon EC2 stores the public key and displays the private\\n            key for you to save to a file. The private key is returned as an unencrypted PEM encoded\\n            PKCS#1 private key or an unencrypted PPK formatted private key for use with PuTTY. If a\\n            key with the specified name already exists, Amazon EC2 returns an error.</p>\\n         <p>The key pair returned to you is available only in the Amazon Web Services Region in which you create it.\\n            If you prefer, you can create your own key pair using a third-party tool and upload it\\n            to any Region using <a>ImportKeyPair</a>.</p>\\n         <p>You can have up to 5,000 key pairs per Amazon Web Services Region.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html\\\">Amazon EC2 key pairs</a> in the\\n                <i>Amazon EC2 User Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To create a key pair\",\n                        \"documentation\": \"This example creates a key pair named my-key-pair.\",\n                        \"input\": {\n                            \"KeyName\": \"my-key-pair\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#CreateKeyPairRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"KeyName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>A unique name for the key pair.</p>\\n         <p>Constraints: Up to 255 ASCII characters</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"KeyType\": {\n                    \"target\": \"com.amazonaws.ec2#KeyType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of key pair. Note that ED25519 keys are not supported for Windows instances.</p>\\n         <p>Default: <code>rsa</code>\\n         </p>\"\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags to apply to the new key pair.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                },\n                \"KeyFormat\": {\n                    \"target\": \"com.amazonaws.ec2#KeyFormat\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The format of the key pair.</p>\\n         <p>Default: <code>pem</code>\\n         </p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateLaunchTemplate\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateLaunchTemplateRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreateLaunchTemplateResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates a launch template.</p>\\n         <p>A launch template contains the parameters to launch an instance. When you launch an\\n            instance using <a>RunInstances</a>, you can specify a launch template instead\\n            of providing the launch parameters in the request. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-launch-templates.html\\\">Store\\n                instance launch parameters in Amazon EC2 launch templates</a> in the\\n                <i>Amazon EC2 User Guide</i>.</p>\\n         <p>To clone an existing launch template as the basis for a new launch template, use the\\n            Amazon EC2 console. The API, SDKs, and CLI do not support cloning a template. For more\\n            information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/create-launch-template.html#create-launch-template-from-existing-launch-template\\\">Create a launch template from an existing launch template</a> in the\\n                <i>Amazon EC2 User Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To create a launch template\",\n                        \"documentation\": \"This example creates a launch template that specifies the subnet in which to launch the instance, assigns a public IP address and an IPv6 address to the instance, and creates a tag for the instance.\",\n                        \"input\": {\n                            \"LaunchTemplateName\": \"my-template\",\n                            \"VersionDescription\": \"WebVersion1\",\n                            \"LaunchTemplateData\": {\n                                \"NetworkInterfaces\": [\n                                    {\n                                        \"AssociatePublicIpAddress\": true,\n                                        \"DeviceIndex\": 0,\n                                        \"Ipv6AddressCount\": 1,\n                                        \"SubnetId\": \"subnet-7b16de0c\"\n                                    }\n                                ],\n                                \"ImageId\": \"ami-8c1be5f6\",\n                                \"InstanceType\": \"t2.small\",\n                                \"TagSpecifications\": [\n                                    {\n                                        \"ResourceType\": \"instance\",\n                                        \"Tags\": [\n                                            {\n                                                \"Key\": \"Name\",\n                                                \"Value\": \"webserver\"\n                                            }\n                                        ]\n                                    }\n                                ]\n                            }\n                        },\n                        \"output\": {\n                            \"LaunchTemplate\": {\n                                \"LatestVersionNumber\": 1,\n                                \"LaunchTemplateId\": \"lt-01238c059e3466abc\",\n                                \"LaunchTemplateName\": \"my-template\",\n                                \"DefaultVersionNumber\": 1,\n                                \"CreatedBy\": \"arn:aws:iam::123456789012:root\",\n                                \"CreateTime\": \"2017-11-27T09:13:24.000Z\"\n                            }\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#CreateLaunchTemplateRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually\\n            making the request, and provides an error response. If you have the required\\n            permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is\\n                <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Unique, case-sensitive identifier you provide to ensure the idempotency of the\\n            request. If a client token isn't specified, a randomly generated token is used in the\\n            request to ensure idempotency.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Run_Instance_Idempotency.html\\\">Ensuring\\n                idempotency</a>.</p>\\n         <p>Constraint: Maximum 128 ASCII characters.</p>\",\n                        \"smithy.api#idempotencyToken\": {}\n                    }\n                },\n                \"LaunchTemplateName\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplateName\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>A name for the launch template.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"VersionDescription\": {\n                    \"target\": \"com.amazonaws.ec2#VersionDescription\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A description for the first version of the launch template.</p>\"\n                    }\n                },\n                \"LaunchTemplateData\": {\n                    \"target\": \"com.amazonaws.ec2#RequestLaunchTemplateData\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The information for the launch template.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Operator\": {\n                    \"target\": \"com.amazonaws.ec2#OperatorRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Reserved for internal use.</p>\"\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags to apply to the launch template on creation. To tag the launch template, the\\n            resource type must be <code>launch-template</code>.</p>\\n         <p>To specify the tags for the resources that are created when an instance is launched,\\n            you must use the <code>TagSpecifications</code> parameter in the <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RequestLaunchTemplateData.html\\\">launch template\\n                data</a> structure.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateLaunchTemplateResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LaunchTemplate\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplate\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LaunchTemplate\",\n                        \"smithy.api#documentation\": \"<p>Information about the launch template.</p>\",\n                        \"smithy.api#xmlName\": \"launchTemplate\"\n                    }\n                },\n                \"Warning\": {\n                    \"target\": \"com.amazonaws.ec2#ValidationWarning\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Warning\",\n                        \"smithy.api#documentation\": \"<p>If the launch template contains parameters or parameter combinations that are not\\n            valid, an error code and an error message are returned for each issue that's\\n            found.</p>\",\n                        \"smithy.api#xmlName\": \"warning\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateLaunchTemplateVersion\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateLaunchTemplateVersionRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreateLaunchTemplateVersionResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates a new version of a launch template. You must specify an existing launch\\n            template, either by name or ID. You can determine whether the new version inherits\\n            parameters from a source version, and add or overwrite parameters as needed.</p>\\n         <p>Launch template versions are numbered in the order in which they are created. You\\n            can't specify, change, or replace the numbering of launch template versions.</p>\\n         <p>Launch templates are immutable; after you create a launch template, you can't modify\\n            it. Instead, you can create a new version of the launch template that includes the\\n            changes that you require.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/manage-launch-template-versions.html\\\">Modify a launch\\n                template (manage launch template versions)</a> in the\\n                <i>Amazon EC2 User Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To create a launch template version\",\n                        \"documentation\": \"This example creates a new launch template version based on version 1 of the specified launch template and specifies a different AMI ID.\",\n                        \"input\": {\n                            \"LaunchTemplateId\": \"lt-0abcd290751193123\",\n                            \"SourceVersion\": \"1\",\n                            \"VersionDescription\": \"WebVersion2\",\n                            \"LaunchTemplateData\": {\n                                \"ImageId\": \"ami-c998b6b2\"\n                            }\n                        },\n                        \"output\": {\n                            \"LaunchTemplateVersion\": {\n                                \"VersionDescription\": \"WebVersion2\",\n                                \"LaunchTemplateId\": \"lt-0abcd290751193123\",\n                                \"LaunchTemplateName\": \"my-template\",\n                                \"VersionNumber\": 2,\n                                \"CreatedBy\": \"arn:aws:iam::123456789012:root\",\n                                \"LaunchTemplateData\": {\n                                    \"ImageId\": \"ami-c998b6b2\",\n                                    \"InstanceType\": \"t2.micro\",\n                                    \"NetworkInterfaces\": [\n                                        {\n                                            \"Ipv6Addresses\": [\n                                                {\n                                                    \"Ipv6Address\": \"2001:db8:1234:1a00::123\"\n                                                }\n                                            ],\n                                            \"DeviceIndex\": 0,\n                                            \"SubnetId\": \"subnet-7b16de0c\",\n                                            \"AssociatePublicIpAddress\": true\n                                        }\n                                    ]\n                                },\n                                \"DefaultVersion\": false,\n                                \"CreateTime\": \"2017-12-01T13:35:46.000Z\"\n                            }\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#CreateLaunchTemplateVersionRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually\\n            making the request, and provides an error response. If you have the required\\n            permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is\\n                <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Unique, case-sensitive identifier you provide to ensure the idempotency of the\\n            request. If a client token isn't specified, a randomly generated token is used in the\\n            request to ensure idempotency.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Run_Instance_Idempotency.html\\\">Ensuring\\n                idempotency</a>.</p>\\n         <p>Constraint: Maximum 128 ASCII characters.</p>\",\n                        \"smithy.api#idempotencyToken\": {}\n                    }\n                },\n                \"LaunchTemplateId\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplateId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the launch template.</p>\\n         <p>You must specify either the launch template ID or the launch template name, but not\\n            both.</p>\"\n                    }\n                },\n                \"LaunchTemplateName\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplateName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the launch template.</p>\\n         <p>You must specify either the launch template ID or the launch template name, but not\\n            both.</p>\"\n                    }\n                },\n                \"SourceVersion\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The version of the launch template on which to base the new version. Snapshots applied\\n            to the block device mapping are ignored when creating a new version unless they are\\n            explicitly included.</p>\\n         <p>If you specify this parameter, the new version inherits the launch parameters from the\\n            source version. If you specify additional launch parameters for the new version, they\\n            overwrite any corresponding launch parameters inherited from the source version.</p>\\n         <p>If you omit this parameter, the new version contains only the launch parameters that\\n            you specify for the new version.</p>\"\n                    }\n                },\n                \"VersionDescription\": {\n                    \"target\": \"com.amazonaws.ec2#VersionDescription\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A description for the version of the launch template.</p>\"\n                    }\n                },\n                \"LaunchTemplateData\": {\n                    \"target\": \"com.amazonaws.ec2#RequestLaunchTemplateData\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The information for the launch template.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ResolveAlias\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If <code>true</code>, and if a Systems Manager parameter is specified for\\n                <code>ImageId</code>, the AMI ID is displayed in the response for\\n                <code>imageID</code>. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/create-launch-template.html#use-an-ssm-parameter-instead-of-an-ami-id\\\">Use a Systems Manager parameter instead of an AMI ID</a> in the\\n                <i>Amazon EC2 User Guide</i>.</p>\\n         <p>Default: <code>false</code>\\n         </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateLaunchTemplateVersionResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LaunchTemplateVersion\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplateVersion\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LaunchTemplateVersion\",\n                        \"smithy.api#documentation\": \"<p>Information about the launch template version.</p>\",\n                        \"smithy.api#xmlName\": \"launchTemplateVersion\"\n                    }\n                },\n                \"Warning\": {\n                    \"target\": \"com.amazonaws.ec2#ValidationWarning\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Warning\",\n                        \"smithy.api#documentation\": \"<p>If the new version of the launch template contains parameters or parameter\\n            combinations that are not valid, an error code and an error message are returned for\\n            each issue that's found.</p>\",\n                        \"smithy.api#xmlName\": \"warning\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateLocalGatewayRoute\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateLocalGatewayRouteRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreateLocalGatewayRouteResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates a static route for the specified local gateway route table. You must specify one of the \\n         following targets: </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>LocalGatewayVirtualInterfaceGroupId</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>NetworkInterfaceId</code>\\n               </p>\\n            </li>\\n         </ul>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateLocalGatewayRouteRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DestinationCidrBlock\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The CIDR range used for destination matches. Routing decisions are based on \\n        the most specific match.</p>\"\n                    }\n                },\n                \"LocalGatewayRouteTableId\": {\n                    \"target\": \"com.amazonaws.ec2#LocalGatewayRoutetableId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the local gateway route table.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"LocalGatewayVirtualInterfaceGroupId\": {\n                    \"target\": \"com.amazonaws.ec2#LocalGatewayVirtualInterfaceGroupId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the virtual interface group.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"NetworkInterfaceId\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInterfaceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the network interface.</p>\"\n                    }\n                },\n                \"DestinationPrefixListId\": {\n                    \"target\": \"com.amazonaws.ec2#PrefixListResourceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>\\n         The ID of the prefix list. Use a prefix list in place of <code>DestinationCidrBlock</code>. You \\n         cannot use <code>DestinationPrefixListId</code> and <code>DestinationCidrBlock</code> in the same request.\\n      </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateLocalGatewayRouteResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Route\": {\n                    \"target\": \"com.amazonaws.ec2#LocalGatewayRoute\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Route\",\n                        \"smithy.api#documentation\": \"<p>Information about the route.</p>\",\n                        \"smithy.api#xmlName\": \"route\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateLocalGatewayRouteTable\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateLocalGatewayRouteTableRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreateLocalGatewayRouteTableResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>\\n      Creates a local gateway route table. \\n      </p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateLocalGatewayRouteTableRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LocalGatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#LocalGatewayId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>\\n      The ID of the local gateway. \\n      </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Mode\": {\n                    \"target\": \"com.amazonaws.ec2#LocalGatewayRouteTableMode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>\\n      The mode of the local gateway route table.\\n      </p>\"\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>\\n      The tags assigned to the local gateway route table.\\n      </p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateLocalGatewayRouteTableResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LocalGatewayRouteTable\": {\n                    \"target\": \"com.amazonaws.ec2#LocalGatewayRouteTable\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LocalGatewayRouteTable\",\n                        \"smithy.api#documentation\": \"<p>Information about the local gateway route table.</p>\",\n                        \"smithy.api#xmlName\": \"localGatewayRouteTable\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateLocalGatewayRouteTableVirtualInterfaceGroupAssociation\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateLocalGatewayRouteTableVirtualInterfaceGroupAssociationRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreateLocalGatewayRouteTableVirtualInterfaceGroupAssociationResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>\\n      Creates a local gateway route table virtual interface group association. \\n      </p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateLocalGatewayRouteTableVirtualInterfaceGroupAssociationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LocalGatewayRouteTableId\": {\n                    \"target\": \"com.amazonaws.ec2#LocalGatewayRoutetableId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>\\n      The ID of the local gateway route table.\\n      </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"LocalGatewayVirtualInterfaceGroupId\": {\n                    \"target\": \"com.amazonaws.ec2#LocalGatewayVirtualInterfaceGroupId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>\\n      The ID of the local gateway route table virtual interface group association.\\n      </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>\\n      The tags assigned to the local gateway route table virtual interface group association.\\n      </p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateLocalGatewayRouteTableVirtualInterfaceGroupAssociationResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LocalGatewayRouteTableVirtualInterfaceGroupAssociation\": {\n                    \"target\": \"com.amazonaws.ec2#LocalGatewayRouteTableVirtualInterfaceGroupAssociation\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LocalGatewayRouteTableVirtualInterfaceGroupAssociation\",\n                        \"smithy.api#documentation\": \"<p>Information about the local gateway route table virtual interface group association.</p>\",\n                        \"smithy.api#xmlName\": \"localGatewayRouteTableVirtualInterfaceGroupAssociation\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateLocalGatewayRouteTableVpcAssociation\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateLocalGatewayRouteTableVpcAssociationRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreateLocalGatewayRouteTableVpcAssociationResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Associates the specified VPC with the specified local gateway route table.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateLocalGatewayRouteTableVpcAssociationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LocalGatewayRouteTableId\": {\n                    \"target\": \"com.amazonaws.ec2#LocalGatewayRoutetableId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the local gateway route table.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"VpcId\": {\n                    \"target\": \"com.amazonaws.ec2#VpcId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the VPC.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags to assign to the local gateway route table VPC association.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateLocalGatewayRouteTableVpcAssociationResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LocalGatewayRouteTableVpcAssociation\": {\n                    \"target\": \"com.amazonaws.ec2#LocalGatewayRouteTableVpcAssociation\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LocalGatewayRouteTableVpcAssociation\",\n                        \"smithy.api#documentation\": \"<p>Information about the association.</p>\",\n                        \"smithy.api#xmlName\": \"localGatewayRouteTableVpcAssociation\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateLocalGatewayVirtualInterface\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateLocalGatewayVirtualInterfaceRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreateLocalGatewayVirtualInterfaceResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Create a virtual interface for a local gateway. </p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateLocalGatewayVirtualInterfaceGroup\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateLocalGatewayVirtualInterfaceGroupRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreateLocalGatewayVirtualInterfaceGroupResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Create a local gateway virtual interface group.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateLocalGatewayVirtualInterfaceGroupRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LocalGatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#LocalGatewayId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the local gateway.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"LocalBgpAsn\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Autonomous System Number(ASN) for the local Border Gateway Protocol (BGP).</p>\"\n                    }\n                },\n                \"LocalBgpAsnExtended\": {\n                    \"target\": \"com.amazonaws.ec2#Long\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The extended 32-bit ASN for the local BGP configuration.</p>\"\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags to apply to the local gateway virtual interface group when the resource is\\n         being created.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateLocalGatewayVirtualInterfaceGroupResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LocalGatewayVirtualInterfaceGroup\": {\n                    \"target\": \"com.amazonaws.ec2#LocalGatewayVirtualInterfaceGroup\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LocalGatewayVirtualInterfaceGroup\",\n                        \"smithy.api#documentation\": \"<p>Information about the created local gateway virtual interface group.</p>\",\n                        \"smithy.api#xmlName\": \"localGatewayVirtualInterfaceGroup\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateLocalGatewayVirtualInterfaceRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LocalGatewayVirtualInterfaceGroupId\": {\n                    \"target\": \"com.amazonaws.ec2#LocalGatewayVirtualInterfaceGroupId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the local gateway virtual interface group.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"OutpostLagId\": {\n                    \"target\": \"com.amazonaws.ec2#OutpostLagId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>References the Link Aggregation Group (LAG) that connects the Outpost to on-premises network devices.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Vlan\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The virtual local area network (VLAN) used for the local gateway virtual interface.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"LocalAddress\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The IP address assigned to the local gateway virtual interface on the Outpost side. Only IPv4 is supported.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"PeerAddress\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The peer IP address for the local gateway virtual interface. Only IPv4 is\\n         supported.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"PeerBgpAsn\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Autonomous System Number (ASN) of the Border Gateway Protocol (BGP) peer.</p>\"\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags to apply to a resource when the local gateway virtual interface is being created. </p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"PeerBgpAsnExtended\": {\n                    \"target\": \"com.amazonaws.ec2#Long\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The extended 32-bit ASN of the BGP peer for use with larger ASN values.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateLocalGatewayVirtualInterfaceResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LocalGatewayVirtualInterface\": {\n                    \"target\": \"com.amazonaws.ec2#LocalGatewayVirtualInterface\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LocalGatewayVirtualInterface\",\n                        \"smithy.api#documentation\": \"<p>Information about the local gateway virtual interface.</p>\",\n                        \"smithy.api#xmlName\": \"localGatewayVirtualInterface\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateMacSystemIntegrityProtectionModificationTask\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateMacSystemIntegrityProtectionModificationTaskRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreateMacSystemIntegrityProtectionModificationTaskResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates a System Integrity Protection (SIP) modification task to configure the SIP settings \\n         for an x86 Mac instance or Apple silicon Mac instance. For more information, see \\n         <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/mac-sip-settings.html#mac-sip-configure\\\">\\n            Configure SIP for Amazon EC2 instances</a> in the <i>Amazon EC2 User Guide</i>.</p>\\n         <p>When you configure the SIP settings for your instance, you can either enable \\n         or disable all SIP settings, or you can specify a custom SIP configuration that \\n         selectively enables or disables specific SIP settings.</p>\\n         <note>\\n            <p>If you implement a custom configuration, <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/mac-sip-settings.html#mac-sip-check-settings\\\">\\n               connect to the instance and verify the settings</a> to ensure that your \\n            requirements are properly implemented and functioning as intended.</p>\\n            <p>SIP configurations might change with macOS updates. We recommend that you \\n            review custom SIP settings after any macOS version upgrade to ensure \\n            continued compatibility and proper functionality of your security configurations.</p>\\n         </note>\\n         <p>To enable or disable all SIP settings, use the <b>MacSystemIntegrityProtectionStatus</b> \\n         parameter only. For example, to enable all SIP settings, specify the following:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>MacSystemIntegrityProtectionStatus=enabled</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>To specify a custom configuration that selectively enables or disables specific SIP \\n         settings, use the <b>MacSystemIntegrityProtectionStatus</b> \\n         parameter to enable or disable all SIP settings, and then use the \\n         <b>MacSystemIntegrityProtectionConfiguration</b> parameter \\n         to specify exceptions. In this case, the exceptions you specify for <b>MacSystemIntegrityProtectionConfiguration</b> override the value \\n         you specify for <b>MacSystemIntegrityProtectionStatus</b>. \\n         For example, to enable all SIP settings, except <code>NvramProtections</code>, \\n         specify the following:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>MacSystemIntegrityProtectionStatus=enabled</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>MacSystemIntegrityProtectionConfigurationRequest \\\"NvramProtections=disabled\\\"</code>\\n               </p>\\n            </li>\\n         </ul>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateMacSystemIntegrityProtectionModificationTaskRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Unique, case-sensitive identifier that you provide to ensure the idempotency of the request. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Run_Instance_Idempotency.html\\\">Ensuring Idempotency</a>.</p>\",\n                        \"smithy.api#idempotencyToken\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"InstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the Amazon EC2 Mac instance.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"MacCredentials\": {\n                    \"target\": \"com.amazonaws.ec2#SensitiveMacCredentials\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>\\n            <b>[Apple silicon Mac instances only]</b> Specifies the \\n         following credentials:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <b>Internal disk administrative user</b>\\n               </p>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <b>Username</b> - Only the default administrative \\n                     user (<code>aws-managed-user</code>) is supported and it is used by default. You \\n                     can't specify a different administrative user.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <b>Password</b> - If you did not change the default \\n                     password for <code>aws-managed-user</code>, specify the default password, which \\n                     is <i>blank</i>. Otherwise, specify your password.</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>Amazon EBS root volume administrative user</b>\\n               </p>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <b>Username</b> - If you did not change the default \\n                     administrative user, specify <code>ec2-user</code>. Otherwise, specify the username \\n                     for your administrative user.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <b>Password</b> - Specify the password for the \\n                     administrative user.</p>\\n                  </li>\\n               </ul>\\n            </li>\\n         </ul>\\n         <p>The credentials must be specified in the following JSON format:</p>\\n         <p>\\n            <code>{\\n  \\\"internalDiskPassword\\\":\\\"<i>internal-disk-admin_password</i>\\\",\\n  \\\"rootVolumeUsername\\\":\\\"<i>root-volume-admin_username</i>\\\",\\n  \\\"rootVolumepassword\\\":\\\"<i>root-volume-admin_password</i>\\\"\\n}</code>\\n         </p>\"\n                    }\n                },\n                \"MacSystemIntegrityProtectionConfiguration\": {\n                    \"target\": \"com.amazonaws.ec2#MacSystemIntegrityProtectionConfigurationRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the overrides to selectively enable or disable individual SIP settings. \\n         The individual settings you specify here override the overall SIP status you specify \\n         for <b>MacSystemIntegrityProtectionStatus</b>.</p>\"\n                    }\n                },\n                \"MacSystemIntegrityProtectionStatus\": {\n                    \"target\": \"com.amazonaws.ec2#MacSystemIntegrityProtectionSettingStatus\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>Specifies the overall SIP status for the instance. To enable all SIP settings, specify \\n         <code>enabled</code>. To disable all SIP settings, specify <code>disabled</code>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies tags to apply to the SIP modification task.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateMacSystemIntegrityProtectionModificationTaskResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"MacModificationTask\": {\n                    \"target\": \"com.amazonaws.ec2#MacModificationTask\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MacModificationTask\",\n                        \"smithy.api#documentation\": \"<p>Information about the SIP modification task.</p>\",\n                        \"smithy.api#xmlName\": \"macModificationTask\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateManagedPrefixList\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateManagedPrefixListRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreateManagedPrefixListResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates a managed prefix list. You can specify entries for the prefix list. \\n            Each entry consists of a CIDR block and an optional description.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateManagedPrefixListRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"PrefixListName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>A name for the prefix list.</p>\\n         <p>Constraints: Up to 255 characters in length. The name cannot start with <code>com.amazonaws</code>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Entries\": {\n                    \"target\": \"com.amazonaws.ec2#AddPrefixListEntries\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more entries for the prefix list.</p>\",\n                        \"smithy.api#xmlName\": \"Entry\"\n                    }\n                },\n                \"MaxEntries\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The maximum number of entries for the prefix list.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags to apply to the prefix list during creation.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                },\n                \"AddressFamily\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The IP address type.</p>\\n         <p>Valid Values: <code>IPv4</code> | <code>IPv6</code>\\n         </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Unique, case-sensitive identifier you provide to ensure the idempotency of the\\n            request. For more information, see <a href=\\\"https://docs.aws.amazon.com/ec2/latest/devguide/ec2-api-idempotency.html\\\">Ensuring\\n                idempotency</a>.</p>\\n         <p>Constraints: Up to 255 UTF-8 characters in length.</p>\",\n                        \"smithy.api#idempotencyToken\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateManagedPrefixListResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PrefixList\": {\n                    \"target\": \"com.amazonaws.ec2#ManagedPrefixList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PrefixList\",\n                        \"smithy.api#documentation\": \"<p>Information about the prefix list.</p>\",\n                        \"smithy.api#xmlName\": \"prefixList\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateNatGateway\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateNatGatewayRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreateNatGatewayResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates a NAT gateway in the specified subnet. This action creates a network interface\\n          in the specified subnet with a private IP address from the IP address range of the\\n          subnet. You can create either a public NAT gateway or a private NAT gateway.</p>\\n         <p>With a public NAT gateway, internet-bound traffic from a private subnet can be routed\\n          to the NAT gateway, so that instances in a private subnet can connect to the internet.</p>\\n         <p>With a private NAT gateway, private communication is routed across VPCs and on-premises\\n            networks through a transit gateway or virtual private gateway. Common use cases include\\n            running large workloads behind a small pool of allowlisted IPv4 addresses, preserving\\n            private IPv4 addresses, and communicating between overlapping networks.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/userguide/vpc-nat-gateway.html\\\">NAT gateways</a> in the <i>Amazon VPC User Guide</i>.</p>\\n         <important>\\n            <p>When you create a public NAT gateway and assign it an EIP or secondary EIPs, \\n          the network border group of the EIPs must match the network border group of the Availability Zone (AZ) \\n          that the public NAT gateway is in. If it's not the same, the NAT gateway will fail to launch. \\n          You can see the network border group for the subnet's AZ by viewing the details of the subnet. \\n          Similarly, you can view the network border group of an EIP by viewing the details of the EIP address. \\n          For more information about network border groups and EIPs, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/userguide/WorkWithEIPs.html\\\">Allocate an Elastic IP address</a> \\n          in the <i>Amazon VPC User Guide</i>. \\n      </p>\\n         </important>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To create a NAT gateway\",\n                        \"documentation\": \"This example creates a NAT gateway in subnet subnet-1a2b3c4d and associates an Elastic IP address with the allocation ID eipalloc-37fc1a52 with the NAT gateway.\",\n                        \"input\": {\n                            \"SubnetId\": \"subnet-1a2b3c4d\",\n                            \"AllocationId\": \"eipalloc-37fc1a52\"\n                        },\n                        \"output\": {\n                            \"NatGateway\": {\n                                \"NatGatewayAddresses\": [\n                                    {\n                                        \"AllocationId\": \"eipalloc-37fc1a52\"\n                                    }\n                                ],\n                                \"VpcId\": \"vpc-1122aabb\",\n                                \"State\": \"pending\",\n                                \"NatGatewayId\": \"nat-08d48af2a8e83edfd\",\n                                \"SubnetId\": \"subnet-1a2b3c4d\",\n                                \"CreateTime\": \"2015-12-17T12:45:26.732Z\"\n                            }\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#CreateNatGatewayRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AllocationId\": {\n                    \"target\": \"com.amazonaws.ec2#AllocationId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>[Public NAT gateways only] The allocation ID of an Elastic IP address to associate \\n          with the NAT gateway. You cannot specify an Elastic IP address with a private NAT gateway.\\n          If the Elastic IP address is associated with another resource, you must first disassociate it.</p>\"\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Unique, case-sensitive identifier that you provide to ensure the idempotency of the\\n\\t\\t\\trequest. For more information, see <a href=\\\"https://docs.aws.amazon.com/ec2/latest/devguide/ec2-api-idempotency.html\\\">Ensuring idempotency</a>.</p>\\n         <p>Constraint: Maximum 64 ASCII characters.</p>\",\n                        \"smithy.api#idempotencyToken\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"SubnetId\": {\n                    \"target\": \"com.amazonaws.ec2#SubnetId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the subnet in which to create the NAT gateway.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags to assign to the NAT gateway.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                },\n                \"ConnectivityType\": {\n                    \"target\": \"com.amazonaws.ec2#ConnectivityType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether the NAT gateway supports public or private connectivity. \\n          The default is public connectivity.</p>\"\n                    }\n                },\n                \"PrivateIpAddress\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The private IPv4 address to assign to the NAT gateway. If you don't provide an address, a private IPv4 address will be automatically assigned.</p>\"\n                    }\n                },\n                \"SecondaryAllocationIds\": {\n                    \"target\": \"com.amazonaws.ec2#AllocationIdList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Secondary EIP allocation IDs. For more information, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/userguide/nat-gateway-working-with.html\\\">Create a NAT gateway</a> \\n            in the <i>Amazon VPC User Guide</i>.</p>\",\n                        \"smithy.api#xmlName\": \"SecondaryAllocationId\"\n                    }\n                },\n                \"SecondaryPrivateIpAddresses\": {\n                    \"target\": \"com.amazonaws.ec2#IpList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Secondary private IPv4 addresses. For more information about secondary addresses, see \\n            <a href=\\\"https://docs.aws.amazon.com/vpc/latest/userguide/nat-gateway-working-with.html\\\">Create a NAT gateway</a> in the <i>Amazon VPC User Guide</i>.</p>\",\n                        \"smithy.api#xmlName\": \"SecondaryPrivateIpAddress\"\n                    }\n                },\n                \"SecondaryPrivateIpAddressCount\": {\n                    \"target\": \"com.amazonaws.ec2#PrivateIpAddressCount\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>[Private NAT gateway only] The number of secondary private IPv4 addresses you want to assign to the NAT gateway. \\n            For more information about secondary addresses, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/userguide/nat-gateway-working-with.html\\\">Create a NAT gateway</a> \\n            in the <i>Amazon VPC User Guide</i>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateNatGatewayResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ClientToken\",\n                        \"smithy.api#documentation\": \"<p>Unique, case-sensitive identifier to ensure the idempotency of the request. Only returned if a client token was provided in the request.</p>\",\n                        \"smithy.api#xmlName\": \"clientToken\"\n                    }\n                },\n                \"NatGateway\": {\n                    \"target\": \"com.amazonaws.ec2#NatGateway\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NatGateway\",\n                        \"smithy.api#documentation\": \"<p>Information about the NAT gateway.</p>\",\n                        \"smithy.api#xmlName\": \"natGateway\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateNetworkAcl\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateNetworkAclRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreateNetworkAclResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates a network ACL in a VPC. Network ACLs provide an optional layer of security (in addition to security groups) for the instances in your VPC.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/userguide/vpc-network-acls.html\\\">Network ACLs</a> in the\\n\\t\\t\\t\\t<i>Amazon VPC User Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To create a network ACL\",\n                        \"documentation\": \"This example creates a network ACL for the specified VPC.\",\n                        \"input\": {\n                            \"VpcId\": \"vpc-a01106c2\"\n                        },\n                        \"output\": {\n                            \"NetworkAcl\": {\n                                \"Associations\": [],\n                                \"NetworkAclId\": \"acl-5fb85d36\",\n                                \"VpcId\": \"vpc-a01106c2\",\n                                \"Tags\": [],\n                                \"Entries\": [\n                                    {\n                                        \"CidrBlock\": \"0.0.0.0/0\",\n                                        \"RuleNumber\": 32767,\n                                        \"Protocol\": \"-1\",\n                                        \"Egress\": true,\n                                        \"RuleAction\": \"deny\"\n                                    },\n                                    {\n                                        \"CidrBlock\": \"0.0.0.0/0\",\n                                        \"RuleNumber\": 32767,\n                                        \"Protocol\": \"-1\",\n                                        \"Egress\": false,\n                                        \"RuleAction\": \"deny\"\n                                    }\n                                ],\n                                \"IsDefault\": false\n                            }\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#CreateNetworkAclEntry\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateNetworkAclEntryRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates an entry (a rule) in a network ACL with the specified rule number. Each network ACL has a set of numbered ingress rules \\n\\t\\t        and a separate set of numbered egress rules. When determining whether a packet should be allowed in or out of a subnet associated \\n\\t\\t        with the ACL, we process the entries in the ACL according to the rule numbers, in ascending order. Each network ACL has a set of \\n\\t\\t        ingress rules and a separate set of egress rules.</p>\\n         <p>We recommend that you leave room between the rule numbers (for example, 100, 110, 120, ...), and not number them one right after the \\n\\t\\t        other (for example, 101, 102, 103, ...). This makes it easier to add a rule between existing ones without having to renumber the rules.</p>\\n         <p>After you add an entry, you can't modify it; you must either replace it, or create an entry and delete the old one.</p>\\n         <p>For more information about network ACLs, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/userguide/vpc-network-acls.html\\\">Network ACLs</a> \\n           in the <i>Amazon VPC User Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To create a network ACL entry\",\n                        \"documentation\": \"This example creates an entry for the specified network ACL. The rule allows ingress traffic from anywhere (0.0.0.0/0) on UDP port 53 (DNS) into any associated subnet.\",\n                        \"input\": {\n                            \"NetworkAclId\": \"acl-5fb85d36\",\n                            \"RuleNumber\": 100,\n                            \"Protocol\": \"17\",\n                            \"RuleAction\": \"allow\",\n                            \"Egress\": false,\n                            \"CidrBlock\": \"0.0.0.0/0\",\n                            \"PortRange\": {\n                                \"From\": 53,\n                                \"To\": 53\n                            }\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#CreateNetworkAclEntryRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"NetworkAclId\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkAclId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkAclId\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the network ACL.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"networkAclId\"\n                    }\n                },\n                \"RuleNumber\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RuleNumber\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The rule number for the entry (for example, 100). ACL entries are processed in ascending order by rule number.</p>\\n         <p>Constraints: Positive integer from 1 to 32766. The range 32767 to 65535 is reserved for internal use.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"ruleNumber\"\n                    }\n                },\n                \"Protocol\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Protocol\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The protocol number. A value of \\\"-1\\\" means all protocols. If you specify \\\"-1\\\" or a\\n  \\t\\t\\tprotocol number other than \\\"6\\\" (TCP), \\\"17\\\" (UDP), or \\\"1\\\" (ICMP), traffic on all ports is \\n\\t\\t\\tallowed, regardless of any ports or ICMP types or codes that you specify. If you specify \\n\\t\\t\\tprotocol \\\"58\\\" (ICMPv6) and specify an IPv4 CIDR block, traffic for all ICMP types and \\n\\t\\t\\tcodes allowed, regardless of any that you specify. If you specify protocol \\\"58\\\" (ICMPv6) \\n\\t\\t\\tand specify an IPv6 CIDR block, you must specify an ICMP type and code.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"protocol\"\n                    }\n                },\n                \"RuleAction\": {\n                    \"target\": \"com.amazonaws.ec2#RuleAction\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RuleAction\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>Indicates whether to allow or deny the traffic that matches the rule.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"ruleAction\"\n                    }\n                },\n                \"Egress\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Egress\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>Indicates whether this is an egress rule (rule is applied to traffic leaving the subnet).</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"egress\"\n                    }\n                },\n                \"CidrBlock\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CidrBlock\",\n                        \"smithy.api#documentation\": \"<p>The IPv4 network range to allow or deny, in CIDR notation (for example\\n\\t\\t        <code>172.16.0.0/24</code>). We modify the specified CIDR block to its canonical form; for example, if you specify <code>100.68.0.18/18</code>, we modify it to <code>100.68.0.0/18</code>.</p>\",\n                        \"smithy.api#xmlName\": \"cidrBlock\"\n                    }\n                },\n                \"Ipv6CidrBlock\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Ipv6CidrBlock\",\n                        \"smithy.api#documentation\": \"<p>The IPv6 network range to allow or deny, in CIDR notation (for example\\n                <code>2001:db8:1234:1a00::/64</code>).</p>\",\n                        \"smithy.api#xmlName\": \"ipv6CidrBlock\"\n                    }\n                },\n                \"IcmpTypeCode\": {\n                    \"target\": \"com.amazonaws.ec2#IcmpTypeCode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>ICMP protocol: The ICMP or ICMPv6 type and code. Required if specifying protocol \\n\\t\\t        1 (ICMP) or protocol 58 (ICMPv6) with an IPv6 CIDR block.</p>\",\n                        \"smithy.api#xmlName\": \"Icmp\"\n                    }\n                },\n                \"PortRange\": {\n                    \"target\": \"com.amazonaws.ec2#PortRange\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PortRange\",\n                        \"smithy.api#documentation\": \"<p>TCP or UDP protocols: The range of ports the rule applies to.\\n\\t\\t        Required if specifying protocol 6 (TCP) or 17 (UDP).</p>\",\n                        \"smithy.api#xmlName\": \"portRange\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateNetworkAclRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags to assign to the network ACL.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Unique, case-sensitive identifier that you provide to ensure the idempotency of the\\n            request. For more information, see <a href=\\\"https://docs.aws.amazon.com/ec2/latest/devguide/ec2-api-idempotency.html\\\">Ensuring idempotency</a>.</p>\",\n                        \"smithy.api#idempotencyToken\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"VpcId\": {\n                    \"target\": \"com.amazonaws.ec2#VpcId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcId\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the VPC.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"vpcId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateNetworkAclResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NetworkAcl\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkAcl\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkAcl\",\n                        \"smithy.api#documentation\": \"<p>Information about the network ACL.</p>\",\n                        \"smithy.api#xmlName\": \"networkAcl\"\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ClientToken\",\n                        \"smithy.api#documentation\": \"<p>Unique, case-sensitive identifier to ensure the idempotency of the request. Only returned if a client token was provided in the request.</p>\",\n                        \"smithy.api#xmlName\": \"clientToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateNetworkInsightsAccessScope\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateNetworkInsightsAccessScopeRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreateNetworkInsightsAccessScopeResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates a Network Access Scope.</p>\\n         <p>Amazon Web Services Network Access Analyzer enables cloud networking and cloud operations teams \\n         to verify that their networks on Amazon Web Services conform to their network security and governance \\n         objectives. For more information, see the <a href=\\\"https://docs.aws.amazon.com/vpc/latest/network-access-analyzer/\\\">Amazon Web Services Network Access Analyzer Guide</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateNetworkInsightsAccessScopeRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"MatchPaths\": {\n                    \"target\": \"com.amazonaws.ec2#AccessScopePathListRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The paths to match.</p>\",\n                        \"smithy.api#xmlName\": \"MatchPath\"\n                    }\n                },\n                \"ExcludePaths\": {\n                    \"target\": \"com.amazonaws.ec2#AccessScopePathListRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The paths to exclude.</p>\",\n                        \"smithy.api#xmlName\": \"ExcludePath\"\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>Unique, case-sensitive identifier that you provide to ensure the idempotency of the request. For more information, \\n   see <a href=\\\"https://docs.aws.amazon.com/ec2/latest/devguide/ec2-api-idempotency.html\\\">How to ensure idempotency</a>.</p>\",\n                        \"smithy.api#idempotencyToken\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags to apply.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateNetworkInsightsAccessScopeResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NetworkInsightsAccessScope\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInsightsAccessScope\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkInsightsAccessScope\",\n                        \"smithy.api#documentation\": \"<p>The Network Access Scope.</p>\",\n                        \"smithy.api#xmlName\": \"networkInsightsAccessScope\"\n                    }\n                },\n                \"NetworkInsightsAccessScopeContent\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInsightsAccessScopeContent\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkInsightsAccessScopeContent\",\n                        \"smithy.api#documentation\": \"<p>The Network Access Scope content.</p>\",\n                        \"smithy.api#xmlName\": \"networkInsightsAccessScopeContent\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateNetworkInsightsPath\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateNetworkInsightsPathRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreateNetworkInsightsPathResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates a path to analyze for reachability.</p>\\n         <p>Reachability Analyzer enables you to analyze and debug network reachability between\\n          two resources in your virtual private cloud (VPC). For more information, see the \\n          <a href=\\\"https://docs.aws.amazon.com/vpc/latest/reachability/\\\">Reachability Analyzer Guide</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateNetworkInsightsPathRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SourceIp\": {\n                    \"target\": \"com.amazonaws.ec2#IpAddress\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IP address of the source.</p>\"\n                    }\n                },\n                \"DestinationIp\": {\n                    \"target\": \"com.amazonaws.ec2#IpAddress\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IP address of the destination.</p>\"\n                    }\n                },\n                \"Source\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInsightsResourceId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID or ARN of the source. If the resource is in another account, you must specify an ARN.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Destination\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInsightsResourceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID or ARN of the destination. If the resource is in another account, you must specify an ARN.</p>\"\n                    }\n                },\n                \"Protocol\": {\n                    \"target\": \"com.amazonaws.ec2#Protocol\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The protocol.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DestinationPort\": {\n                    \"target\": \"com.amazonaws.ec2#Port\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The destination port.</p>\"\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags to add to the path.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>Unique, case-sensitive identifier that you provide to ensure the idempotency of the request. For more information, \\n   see <a href=\\\"https://docs.aws.amazon.com/ec2/latest/devguide/ec2-api-idempotency.html\\\">How to ensure idempotency</a>.</p>\",\n                        \"smithy.api#idempotencyToken\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"FilterAtSource\": {\n                    \"target\": \"com.amazonaws.ec2#PathRequestFilter\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Scopes the analysis to network paths that match specific filters at the source. If you specify\\n          this parameter, you can't specify the parameters for the source IP address or the destination port.</p>\"\n                    }\n                },\n                \"FilterAtDestination\": {\n                    \"target\": \"com.amazonaws.ec2#PathRequestFilter\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Scopes the analysis to network paths that match specific filters at the destination. If you specify\\n          this parameter, you can't specify the parameter for the destination IP address.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateNetworkInsightsPathResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NetworkInsightsPath\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInsightsPath\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkInsightsPath\",\n                        \"smithy.api#documentation\": \"<p>Information about the path.</p>\",\n                        \"smithy.api#xmlName\": \"networkInsightsPath\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateNetworkInterface\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateNetworkInterfaceRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreateNetworkInterfaceResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates a network interface in the specified subnet.</p>\\n         <p>The number of IP addresses you can assign to a network interface varies by instance\\n            type.</p>\\n         <p>For more information about network interfaces, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-eni.html\\\">Elastic network interfaces</a> in the\\n                <i>Amazon EC2 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateNetworkInterfacePermission\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateNetworkInterfacePermissionRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreateNetworkInterfacePermissionResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Grants an Amazon Web Services-authorized account permission to attach the specified\\n            network interface to an instance in their account.</p>\\n         <p>You can grant permission to a single Amazon Web Services account only, and only one\\n            account at a time.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateNetworkInterfacePermissionRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NetworkInterfaceId\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInterfaceId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the network interface.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"AwsAccountId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID.</p>\"\n                    }\n                },\n                \"AwsService\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services service. Currently not supported.</p>\"\n                    }\n                },\n                \"Permission\": {\n                    \"target\": \"com.amazonaws.ec2#InterfacePermissionType\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The type of permission to grant.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually\\n            making the request, and provides an error response. If you have the required\\n            permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is\\n                <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the parameters for CreateNetworkInterfacePermission.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateNetworkInterfacePermissionResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InterfacePermission\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInterfacePermission\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InterfacePermission\",\n                        \"smithy.api#documentation\": \"<p>Information about the permission for the network interface.</p>\",\n                        \"smithy.api#xmlName\": \"interfacePermission\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the output of CreateNetworkInterfacePermission.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateNetworkInterfaceRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Ipv4Prefixes\": {\n                    \"target\": \"com.amazonaws.ec2#Ipv4PrefixList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IPv4 prefixes assigned to the network interface.</p>\\n         <p>You can't specify IPv4 prefixes if you've specified one of the following: a count of\\n            IPv4 prefixes, specific private IPv4 addresses, or a count of private IPv4\\n            addresses.</p>\",\n                        \"smithy.api#xmlName\": \"Ipv4Prefix\"\n                    }\n                },\n                \"Ipv4PrefixCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of IPv4 prefixes that Amazon Web Services automatically assigns to the\\n            network interface.</p>\\n         <p>You can't specify a count of IPv4 prefixes if you've specified one of the following:\\n            specific IPv4 prefixes, specific private IPv4 addresses, or a count of private IPv4\\n            addresses.</p>\"\n                    }\n                },\n                \"Ipv6Prefixes\": {\n                    \"target\": \"com.amazonaws.ec2#Ipv6PrefixList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IPv6 prefixes assigned to the network interface.</p>\\n         <p>You can't specify IPv6 prefixes if you've specified one of the following: a count of\\n            IPv6 prefixes, specific IPv6 addresses, or a count of IPv6 addresses.</p>\",\n                        \"smithy.api#xmlName\": \"Ipv6Prefix\"\n                    }\n                },\n                \"Ipv6PrefixCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of IPv6 prefixes that Amazon Web Services automatically assigns to the\\n            network interface.</p>\\n         <p>You can't specify a count of IPv6 prefixes if you've specified one of the following:\\n            specific IPv6 prefixes, specific IPv6 addresses, or a count of IPv6 addresses.</p>\"\n                    }\n                },\n                \"InterfaceType\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInterfaceCreationType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of network interface. The default is <code>interface</code>.</p>\\n         <p>If you specify <code>efa-only</code>, do not assign any IP addresses to the network\\n            interface. EFA-only network interfaces do not support IP addresses.</p>\\n         <p>The only supported values are <code>interface</code>, <code>efa</code>,\\n                <code>efa-only</code>, and <code>trunk</code>.</p>\"\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags to apply to the new network interface.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Unique, case-sensitive identifier that you provide to ensure the idempotency of the request. For more information, see <a href=\\\"https://docs.aws.amazon.com/ec2/latest/devguide/ec2-api-idempotency.html\\\">Ensuring idempotency</a>.</p>\",\n                        \"smithy.api#idempotencyToken\": {}\n                    }\n                },\n                \"EnablePrimaryIpv6\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If you’re creating a network interface in a dual-stack or IPv6-only subnet, you have\\n            the option to assign a primary IPv6 IP address. A primary IPv6 address is an IPv6 GUA\\n            address associated with an ENI that you have enabled to use a primary IPv6 address. Use\\n            this option if the instance that this ENI will be attached to relies on its IPv6 address\\n            not changing. Amazon Web Services will automatically assign an IPv6 address associated\\n            with the ENI attached to your instance to be the primary IPv6 address. Once you enable\\n            an IPv6 GUA address to be a primary IPv6, you cannot disable it. When you enable an IPv6\\n            GUA address to be a primary IPv6, the first IPv6 GUA will be made the primary IPv6\\n            address until the instance is terminated or the network interface is detached. If you\\n            have multiple IPv6 addresses associated with an ENI attached to your instance and you\\n            enable a primary IPv6 address, the first IPv6 GUA address associated with the ENI\\n            becomes the primary IPv6 address.</p>\"\n                    }\n                },\n                \"ConnectionTrackingSpecification\": {\n                    \"target\": \"com.amazonaws.ec2#ConnectionTrackingSpecificationRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A connection tracking specification for the network interface.</p>\"\n                    }\n                },\n                \"Operator\": {\n                    \"target\": \"com.amazonaws.ec2#OperatorRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Reserved for internal use.</p>\"\n                    }\n                },\n                \"SubnetId\": {\n                    \"target\": \"com.amazonaws.ec2#SubnetId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SubnetId\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the subnet to associate with the network interface.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"subnetId\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Description\",\n                        \"smithy.api#documentation\": \"<p>A description for the network interface.</p>\",\n                        \"smithy.api#xmlName\": \"description\"\n                    }\n                },\n                \"PrivateIpAddress\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PrivateIpAddress\",\n                        \"smithy.api#documentation\": \"<p>The primary private IPv4 address of the network interface. If you don't specify an\\n            IPv4 address, Amazon EC2 selects one for you from the subnet's IPv4 CIDR range. If you\\n            specify an IP address, you cannot indicate any IP addresses specified in\\n                <code>privateIpAddresses</code> as primary (only one IP address can be designated as\\n            primary).</p>\",\n                        \"smithy.api#xmlName\": \"privateIpAddress\"\n                    }\n                },\n                \"Groups\": {\n                    \"target\": \"com.amazonaws.ec2#SecurityGroupIdStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the security groups.</p>\",\n                        \"smithy.api#xmlName\": \"SecurityGroupId\"\n                    }\n                },\n                \"PrivateIpAddresses\": {\n                    \"target\": \"com.amazonaws.ec2#PrivateIpAddressSpecificationList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PrivateIpAddresses\",\n                        \"smithy.api#documentation\": \"<p>The private IPv4 addresses.</p>\\n         <p>You can't specify private IPv4 addresses if you've specified one of the following: a\\n            count of private IPv4 addresses, specific IPv4 prefixes, or a count of IPv4\\n            prefixes.</p>\",\n                        \"smithy.api#xmlName\": \"privateIpAddresses\"\n                    }\n                },\n                \"SecondaryPrivateIpAddressCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SecondaryPrivateIpAddressCount\",\n                        \"smithy.api#documentation\": \"<p>The number of secondary private IPv4 addresses to assign to a network interface. When\\n            you specify a number of secondary IPv4 addresses, Amazon EC2 selects these IP addresses\\n            within the subnet's IPv4 CIDR range. You can't specify this option and specify more than\\n            one private IP address using <code>privateIpAddresses</code>.</p>\\n         <p>You can't specify a count of private IPv4 addresses if you've specified one of the\\n            following: specific private IPv4 addresses, specific IPv4 prefixes, or a count of IPv4\\n            prefixes.</p>\",\n                        \"smithy.api#xmlName\": \"secondaryPrivateIpAddressCount\"\n                    }\n                },\n                \"Ipv6Addresses\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceIpv6AddressList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Ipv6Addresses\",\n                        \"smithy.api#documentation\": \"<p>The IPv6 addresses from the IPv6 CIDR block range of your subnet.</p>\\n         <p>You can't specify IPv6 addresses using this parameter if you've specified one of the\\n            following: a count of IPv6 addresses, specific IPv6 prefixes, or a count of IPv6\\n            prefixes.</p>\",\n                        \"smithy.api#xmlName\": \"ipv6Addresses\"\n                    }\n                },\n                \"Ipv6AddressCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Ipv6AddressCount\",\n                        \"smithy.api#documentation\": \"<p>The number of IPv6 addresses to assign to a network interface. Amazon EC2\\n            automatically selects the IPv6 addresses from the subnet range.</p>\\n         <p>You can't specify a count of IPv6 addresses using this parameter if you've specified\\n            one of the following: specific IPv6 addresses, specific IPv6 prefixes, or a count of\\n            IPv6 prefixes.</p>\\n         <p>If your subnet has the <code>AssignIpv6AddressOnCreation</code> attribute set, you can\\n            override that setting by specifying 0 as the IPv6 address count.</p>\",\n                        \"smithy.api#xmlName\": \"ipv6AddressCount\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually\\n            making the request, and provides an error response. If you have the required\\n            permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is\\n                <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateNetworkInterfaceResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NetworkInterface\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInterface\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkInterface\",\n                        \"smithy.api#documentation\": \"<p>Information about the network interface.</p>\",\n                        \"smithy.api#xmlName\": \"networkInterface\"\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ClientToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"clientToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreatePlacementGroup\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreatePlacementGroupRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreatePlacementGroupResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates a placement group in which to launch instances. The strategy of the placement\\n            group determines how the instances are organized within the group. </p>\\n         <p>A <code>cluster</code> placement group is a logical grouping of instances within a\\n            single Availability Zone that benefit from low network latency, high network throughput.\\n            A <code>spread</code> placement group places instances on distinct hardware. A\\n                <code>partition</code> placement group places groups of instances in different\\n            partitions, where instances in one partition do not share the same hardware with\\n            instances in another partition.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/placement-groups.html\\\">Placement groups</a> in the\\n                <i>Amazon EC2 User Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To create a placement group\",\n                        \"documentation\": \"This example creates a placement group with the specified name.\",\n                        \"input\": {\n                            \"GroupName\": \"my-cluster\",\n                            \"Strategy\": \"cluster\"\n                        },\n                        \"output\": {}\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#CreatePlacementGroupRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PartitionCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of partitions. Valid only when <b>Strategy</b> is\\n            set to <code>partition</code>.</p>\"\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags to apply to the new placement group.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                },\n                \"SpreadLevel\": {\n                    \"target\": \"com.amazonaws.ec2#SpreadLevel\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Determines how placement groups spread instances. </p>\\n         <ul>\\n            <li>\\n               <p>Host – You can use <code>host</code> only with Outpost placement\\n                    groups.</p>\\n            </li>\\n            <li>\\n               <p>Rack – No usage restrictions.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the operation, without actually making the \\n  request, and provides an error response. If you have the required permissions, the error response is \\n  <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"GroupName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"GroupName\",\n                        \"smithy.api#documentation\": \"<p>A name for the placement group. Must be unique within the scope of your account for\\n            the Region.</p>\\n         <p>Constraints: Up to 255 ASCII characters</p>\",\n                        \"smithy.api#xmlName\": \"groupName\"\n                    }\n                },\n                \"Strategy\": {\n                    \"target\": \"com.amazonaws.ec2#PlacementStrategy\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Strategy\",\n                        \"smithy.api#documentation\": \"<p>The placement strategy.</p>\",\n                        \"smithy.api#xmlName\": \"strategy\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreatePlacementGroupResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PlacementGroup\": {\n                    \"target\": \"com.amazonaws.ec2#PlacementGroup\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PlacementGroup\",\n                        \"smithy.api#documentation\": \"<p>Information about the placement group.</p>\",\n                        \"smithy.api#xmlName\": \"placementGroup\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreatePublicIpv4Pool\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreatePublicIpv4PoolRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreatePublicIpv4PoolResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates a public IPv4 address pool. A public IPv4 pool is an EC2 IP address pool required for the public IPv4 CIDRs that you own and bring to Amazon Web Services to manage with IPAM. IPv6 addresses you bring to Amazon Web Services, however, use IPAM pools only. To monitor the status of pool creation, use <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribePublicIpv4Pools.html\\\">DescribePublicIpv4Pools</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreatePublicIpv4PoolRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A check for whether you have the required permissions for the action without actually making the request \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\\n    For example, to find all resources that have a tag with the key <code>Owner</code> and the value <code>TeamA</code>, specify <code>tag:Owner</code> for the filter name and <code>TeamA</code> for the filter value.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                },\n                \"NetworkBorderGroup\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Availability Zone (AZ) or Local Zone (LZ) network border group that the resource that the IP address is assigned to is in. Defaults to an AZ network border group. For more information on available Local Zones, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-byoip.html#byoip-zone-avail\\\">Local Zone availability</a> in the <i>Amazon EC2 User Guide</i>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreatePublicIpv4PoolResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PoolId\": {\n                    \"target\": \"com.amazonaws.ec2#Ipv4PoolEc2Id\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PoolId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the public IPv4 pool.</p>\",\n                        \"smithy.api#xmlName\": \"poolId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateReplaceRootVolumeTask\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateReplaceRootVolumeTaskRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreateReplaceRootVolumeTaskResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Replaces the EBS-backed root volume for a <code>running</code> instance with a new \\n      volume that is restored to the original root volume's launch state, that is restored to a \\n      specific snapshot taken from the original root volume, or that is restored from an AMI \\n      that has the same key characteristics as that of the instance.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/replace-root.html\\\">Replace a root volume</a> in the <i>Amazon EC2 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateReplaceRootVolumeTaskRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the instance for which to replace the root volume.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"SnapshotId\": {\n                    \"target\": \"com.amazonaws.ec2#SnapshotId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the snapshot from which to restore the replacement root volume. The \\n      specified snapshot must be a snapshot that you previously created from the original \\n      root volume.</p>\\n         <p>If you want to restore the replacement root volume to the initial launch state, \\n      or if you want to restore the replacement root volume from an AMI, omit this \\n      parameter.</p>\"\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Unique, case-sensitive identifier you provide to ensure the idempotency of the request. \\n      If you do not specify a client token, a randomly generated token is used for the request \\n      to ensure idempotency. For more information, see <a href=\\\"https://docs.aws.amazon.com/ec2/latest/devguide/ec2-api-idempotency.html\\\">Ensuring idempotency</a>.</p>\",\n                        \"smithy.api#idempotencyToken\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags to apply to the root volume replacement task.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                },\n                \"ImageId\": {\n                    \"target\": \"com.amazonaws.ec2#ImageId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the AMI to use to restore the root volume. The specified AMI must have the \\n      same product code, billing information, architecture type, and virtualization type as \\n      that of the instance.</p>\\n         <p>If you want to restore the replacement volume from a specific snapshot, or if you want \\n      to restore it to its launch state, omit this parameter.</p>\"\n                    }\n                },\n                \"DeleteReplacedRootVolume\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether to automatically delete the original root volume after the root volume \\n      replacement task completes. To delete the original root volume, specify <code>true</code>. \\n      If you choose to keep the original root volume after the replacement task completes, you must \\n      manually delete it when you no longer need it.</p>\"\n                    }\n                },\n                \"VolumeInitializationRate\": {\n                    \"target\": \"com.amazonaws.ec2#Long\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the Amazon EBS Provisioned Rate for Volume Initialization (volume initialization rate), in MiB/s, at which to download \\n      the snapshot blocks from Amazon S3 to the replacement root volume. This is also known as \\n      <i>volume initialization</i>. Specifying a volume initialization rate ensures that \\n      the volume is initialized at a predictable and consistent rate after creation.</p>\\n         <p>Omit this parameter if:</p>\\n         <ul>\\n            <li>\\n               <p>You want to create the volume using fast snapshot restore. You must specify a snapshot \\n          that is enabled for fast snapshot restore. In this case, the volume is fully initialized at \\n          creation.</p>\\n               <note>\\n                  <p>If you specify a snapshot that is enabled for fast snapshot restore and a volume initialization rate, \\n            the volume will be initialized at the specified rate instead of fast snapshot restore.</p>\\n               </note>\\n            </li>\\n            <li>\\n               <p>You want to create a volume that is initialized at the default rate.</p>\\n            </li>\\n         </ul>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/ebs/latest/userguide/initalize-volume.html\\\">\\n      Initialize Amazon EBS volumes</a> in the <i>Amazon EC2 User Guide</i>.</p>\\n         <p>Valid range: 100 - 300 MiB/s</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateReplaceRootVolumeTaskResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ReplaceRootVolumeTask\": {\n                    \"target\": \"com.amazonaws.ec2#ReplaceRootVolumeTask\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ReplaceRootVolumeTask\",\n                        \"smithy.api#documentation\": \"<p>Information about the root volume replacement task.</p>\",\n                        \"smithy.api#xmlName\": \"replaceRootVolumeTask\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateReservedInstancesListing\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateReservedInstancesListingRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreateReservedInstancesListingResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates a listing for Amazon EC2 Standard Reserved Instances to be sold in the Reserved\\n      Instance Marketplace. You can submit one Standard Reserved Instance listing at a time. To get\\n      a list of your Standard Reserved Instances, you can use the <a>DescribeReservedInstances</a> operation.</p>\\n         <note>\\n            <p>Only Standard Reserved Instances can be sold in the Reserved Instance Marketplace.\\n        Convertible Reserved Instances cannot be sold.</p>\\n         </note>\\n         <p>The Reserved Instance Marketplace matches sellers who want to resell Standard Reserved\\n      Instance capacity that they no longer need with buyers who want to purchase additional\\n      capacity. Reserved Instances bought and sold through the Reserved Instance Marketplace work\\n      like any other Reserved Instances.</p>\\n         <p>To sell your Standard Reserved Instances, you must first register as a seller in the\\n      Reserved Instance Marketplace. After completing the registration process, you can create a\\n      Reserved Instance Marketplace listing of some or all of your Standard Reserved Instances, and\\n      specify the upfront price to receive for them. Your Standard Reserved Instance listings then\\n      become available for purchase. To view the details of your Standard Reserved Instance listing,\\n      you can use the <a>DescribeReservedInstancesListings</a> operation.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ri-market-general.html\\\">Sell in the Reserved Instance\\n        Marketplace</a> in the <i>Amazon EC2 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateReservedInstancesListingRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ReservedInstancesId\": {\n                    \"target\": \"com.amazonaws.ec2#ReservationId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ReservedInstancesId\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the active Standard Reserved Instance.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"reservedInstancesId\"\n                    }\n                },\n                \"InstanceCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceCount\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The number of instances that are a part of a Reserved Instance account to be listed in the\\n      Reserved Instance Marketplace. This number should be less than or equal to the instance count\\n      associated with the Reserved Instance ID specified in this call.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"instanceCount\"\n                    }\n                },\n                \"PriceSchedules\": {\n                    \"target\": \"com.amazonaws.ec2#PriceScheduleSpecificationList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PriceSchedules\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>A list specifying the price of the Standard Reserved Instance for each month remaining in\\n      the Reserved Instance term.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"priceSchedules\"\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ClientToken\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>Unique, case-sensitive identifier you provide to ensure idempotency of your listings. This\\n      helps avoid duplicate listings. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Run_Instance_Idempotency.html\\\">Ensuring\\n      Idempotency</a>.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"clientToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the parameters for CreateReservedInstancesListing.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateReservedInstancesListingResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ReservedInstancesListings\": {\n                    \"target\": \"com.amazonaws.ec2#ReservedInstancesListingList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ReservedInstancesListingsSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the Standard Reserved Instance listing.</p>\",\n                        \"smithy.api#xmlName\": \"reservedInstancesListingsSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the output of CreateReservedInstancesListing.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateRestoreImageTask\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateRestoreImageTaskRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreateRestoreImageTaskResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Starts a task that restores an AMI from an Amazon S3 object that was previously created by\\n      using <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateStoreImageTask.html\\\">CreateStoreImageTask</a>.</p>\\n         <p>To use this API, you must have the required permissions. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/work-with-ami-store-restore.html#ami-s3-permissions\\\">Permissions for storing and restoring AMIs using S3</a> in the\\n      <i>Amazon EC2 User Guide</i>.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ami-store-restore.html\\\">Store and restore an AMI using\\n        S3</a> in the <i>Amazon EC2 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateRestoreImageTaskRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Bucket\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The name of the Amazon S3 bucket that contains the stored AMI object.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ObjectKey\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The name of the stored AMI object in the bucket.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Name\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name for the restored AMI. The name must be unique for AMIs in the Region for this\\n      account. If you do not provide a name, the new AMI gets the same name as the original\\n      AMI.</p>\"\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags to apply to the AMI and snapshots on restoration. You can tag the AMI, the\\n      snapshots, or both.</p>\\n         <ul>\\n            <li>\\n               <p>To tag the AMI, the value for <code>ResourceType</code> must be\\n          <code>image</code>.</p>\\n            </li>\\n            <li>\\n               <p>To tag the snapshots, the value for <code>ResourceType</code> must be\\n          <code>snapshot</code>. The same tag is applied to all of the snapshots that are\\n          created.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n\\t\\t\\tand provides an error response. If you have the required permissions, the error response is \\n\\t\\t\\t<code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateRestoreImageTaskResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ImageId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ImageId\",\n                        \"smithy.api#documentation\": \"<p>The AMI ID.</p>\",\n                        \"smithy.api#xmlName\": \"imageId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateRoute\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateRouteRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreateRouteResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates a route in a route table within a VPC.</p>\\n         <p>You must specify either a destination CIDR block or a prefix list ID. You must also specify  \\n         exactly one of the resources from the parameter list.</p>\\n         <p>When determining how to route traffic, we use the route with the most specific match.\\n            For example, traffic is destined for the IPv4 address <code>192.0.2.3</code>, and the\\n            route table includes the following two IPv4 routes:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>192.0.2.0/24</code> (goes to some target A)</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>192.0.2.0/28</code> (goes to some target B)</p>\\n            </li>\\n         </ul>\\n         <p>Both routes apply to the traffic destined for <code>192.0.2.3</code>. However, the second route\\n\\t\\t\\t\\tin the list covers a smaller number of IP addresses and is therefore more specific,\\n\\t\\t\\t\\tso we use that route to determine where to target the traffic.</p>\\n         <p>For more information about route tables, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Route_Tables.html\\\">Route tables</a> in the\\n         <i>Amazon VPC User Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To create a route\",\n                        \"documentation\": \"This example creates a route for the specified route table. The route matches all traffic (0.0.0.0/0) and routes it to the specified Internet gateway.\",\n                        \"input\": {\n                            \"RouteTableId\": \"rtb-22574640\",\n                            \"DestinationCidrBlock\": \"0.0.0.0/0\",\n                            \"GatewayId\": \"igw-c0a643a9\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#CreateRouteRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DestinationPrefixListId\": {\n                    \"target\": \"com.amazonaws.ec2#PrefixListResourceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of a prefix list used for the destination match.</p>\"\n                    }\n                },\n                \"VpcEndpointId\": {\n                    \"target\": \"com.amazonaws.ec2#VpcEndpointId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of a VPC endpoint. Supported for Gateway Load Balancer endpoints only.</p>\"\n                    }\n                },\n                \"TransitGatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of a transit gateway.</p>\"\n                    }\n                },\n                \"LocalGatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#LocalGatewayId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the local gateway.</p>\"\n                    }\n                },\n                \"CarrierGatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#CarrierGatewayId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the carrier gateway.</p>\\n         <p>You can only use this option when the VPC contains a subnet which is associated with a Wavelength Zone.</p>\"\n                    }\n                },\n                \"CoreNetworkArn\": {\n                    \"target\": \"com.amazonaws.ec2#CoreNetworkArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the core network.</p>\"\n                    }\n                },\n                \"OdbNetworkArn\": {\n                    \"target\": \"com.amazonaws.ec2#OdbNetworkArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the ODB network.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"RouteTableId\": {\n                    \"target\": \"com.amazonaws.ec2#RouteTableId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RouteTableId\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the route table for the route.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"routeTableId\"\n                    }\n                },\n                \"DestinationCidrBlock\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DestinationCidrBlock\",\n                        \"smithy.api#documentation\": \"<p>The IPv4 CIDR address block used for the destination match. Routing decisions are based on the most specific match. We modify the specified CIDR block to its canonical form; for example, if you specify <code>100.68.0.18/18</code>, we modify it to <code>100.68.0.0/18</code>.</p>\",\n                        \"smithy.api#xmlName\": \"destinationCidrBlock\"\n                    }\n                },\n                \"GatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#RouteGatewayId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"GatewayId\",\n                        \"smithy.api#documentation\": \"<p>The ID of an internet gateway or virtual private gateway attached to your\\n\\t\\t\\tVPC.</p>\",\n                        \"smithy.api#xmlName\": \"gatewayId\"\n                    }\n                },\n                \"DestinationIpv6CidrBlock\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DestinationIpv6CidrBlock\",\n                        \"smithy.api#documentation\": \"<p>The IPv6 CIDR block used for the destination match. Routing decisions are based on the most specific match.</p>\",\n                        \"smithy.api#xmlName\": \"destinationIpv6CidrBlock\"\n                    }\n                },\n                \"EgressOnlyInternetGatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#EgressOnlyInternetGatewayId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EgressOnlyInternetGatewayId\",\n                        \"smithy.api#documentation\": \"<p>[IPv6 traffic only] The ID of an egress-only internet gateway.</p>\",\n                        \"smithy.api#xmlName\": \"egressOnlyInternetGatewayId\"\n                    }\n                },\n                \"InstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of a NAT instance in your VPC. The operation fails if you specify an instance ID unless exactly one network interface is attached.</p>\",\n                        \"smithy.api#xmlName\": \"instanceId\"\n                    }\n                },\n                \"NetworkInterfaceId\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInterfaceId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkInterfaceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of a network interface.</p>\",\n                        \"smithy.api#xmlName\": \"networkInterfaceId\"\n                    }\n                },\n                \"VpcPeeringConnectionId\": {\n                    \"target\": \"com.amazonaws.ec2#VpcPeeringConnectionId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcPeeringConnectionId\",\n                        \"smithy.api#documentation\": \"<p>The ID of a VPC peering connection.</p>\",\n                        \"smithy.api#xmlName\": \"vpcPeeringConnectionId\"\n                    }\n                },\n                \"NatGatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#NatGatewayId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NatGatewayId\",\n                        \"smithy.api#documentation\": \"<p>[IPv4 traffic only] The ID of a NAT gateway.</p>\",\n                        \"smithy.api#xmlName\": \"natGatewayId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateRouteResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Return\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Return\",\n                        \"smithy.api#documentation\": \"<p>Returns <code>true</code> if the request succeeds; otherwise, it returns an error.</p>\",\n                        \"smithy.api#xmlName\": \"return\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateRouteServer\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateRouteServerRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreateRouteServerResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates a new route server to manage dynamic routing in a VPC.</p>\\n         <p>Amazon VPC Route Server simplifies routing for traffic between workloads that are deployed within a VPC and its internet gateways. With this feature, \\nVPC Route Server dynamically updates VPC and internet gateway route tables with your preferred IPv4 or IPv6 routes to achieve routing fault tolerance for those workloads. This enables you to automatically reroute traffic within a VPC, which increases the manageability of VPC routing and interoperability with third-party workloads.</p>\\n         <p>Route server supports the follow route table types:</p>\\n         <ul>\\n            <li>\\n               <p>VPC route tables not associated with subnets</p>\\n            </li>\\n            <li>\\n               <p>Subnet route tables</p>\\n            </li>\\n            <li>\\n               <p>Internet gateway route tables</p>\\n            </li>\\n         </ul>\\n         <p>Route server does not support route tables associated with virtual private gateways. To propagate routes into a transit gateway route table, use <a href=\\\"https://docs.aws.amazon.com/vpc/latest/tgw/tgw-connect.html\\\">Transit Gateway Connect</a>.</p>\\n         <p>For more information see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/userguide/dynamic-routing-route-server.html\\\">Dynamic routing in your VPC with VPC Route Server</a> in the <i>Amazon VPC User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateRouteServerEndpoint\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateRouteServerEndpointRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreateRouteServerEndpointResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates a new endpoint for a route server in a specified subnet.</p>\\n         <p>A route server endpoint is an Amazon Web Services-managed component inside a subnet that facilitates <a href=\\\"https://en.wikipedia.org/wiki/Border_Gateway_Protocol\\\">BGP (Border Gateway Protocol)</a> connections between your route server and your BGP peers.</p>\\n         <p>For more information see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/userguide/dynamic-routing-route-server.html\\\">Dynamic routing in your VPC with VPC Route Server</a> in the <i>Amazon VPC User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateRouteServerEndpointRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RouteServerId\": {\n                    \"target\": \"com.amazonaws.ec2#RouteServerId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the route server for which to create an endpoint.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"SubnetId\": {\n                    \"target\": \"com.amazonaws.ec2#SubnetId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the subnet in which to create the route server endpoint.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Unique, case-sensitive identifier to ensure idempotency of the request.</p>\",\n                        \"smithy.api#idempotencyToken\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A check for whether you have the required permissions for the action without actually making the request \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags to apply to the route server endpoint during creation.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateRouteServerEndpointResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RouteServerEndpoint\": {\n                    \"target\": \"com.amazonaws.ec2#RouteServerEndpoint\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RouteServerEndpoint\",\n                        \"smithy.api#documentation\": \"<p>Information about the created route server endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"routeServerEndpoint\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateRouteServerPeer\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateRouteServerPeerRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreateRouteServerPeerResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates a new BGP peer for a specified route server endpoint.</p>\\n         <p>A route server peer is a session between a route server endpoint and the device deployed in Amazon Web Services (such as a firewall appliance or other network security function running on an EC2 instance). The device must meet these requirements:</p>\\n         <ul>\\n            <li>\\n               <p>Have an elastic network interface in the VPC</p>\\n            </li>\\n            <li>\\n               <p>Support BGP (Border Gateway Protocol)</p>\\n            </li>\\n            <li>\\n               <p>Can initiate BGP sessions</p>\\n            </li>\\n         </ul>\\n         <p>For more information see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/userguide/dynamic-routing-route-server.html\\\">Dynamic routing in your VPC with VPC Route Server</a> in the <i>Amazon VPC User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateRouteServerPeerRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RouteServerEndpointId\": {\n                    \"target\": \"com.amazonaws.ec2#RouteServerEndpointId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the route server endpoint for which to create a peer.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"PeerAddress\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The IPv4 address of the peer device.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"BgpOptions\": {\n                    \"target\": \"com.amazonaws.ec2#RouteServerBgpOptionsRequest\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The BGP options for the peer, including ASN (Autonomous System Number) and BFD (Bidrectional Forwarding Detection) settings.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A check for whether you have the required permissions for the action without actually making the request \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags to apply to the route server peer during creation.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateRouteServerPeerResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RouteServerPeer\": {\n                    \"target\": \"com.amazonaws.ec2#RouteServerPeer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RouteServerPeer\",\n                        \"smithy.api#documentation\": \"<p>Information about the created route server peer.</p>\",\n                        \"smithy.api#xmlName\": \"routeServerPeer\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateRouteServerRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AmazonSideAsn\": {\n                    \"target\": \"com.amazonaws.ec2#Long\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The private Autonomous System Number (ASN) for the Amazon side of the BGP session. Valid values are from 1 to 4294967295. We recommend using a private ASN in the 64512–65534 (16-bit ASN) or 4200000000–4294967294 (32-bit ASN) range.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Unique, case-sensitive identifier to ensure idempotency of the request.</p>\",\n                        \"smithy.api#idempotencyToken\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A check for whether you have the required permissions for the action without actually making the request \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"PersistRoutes\": {\n                    \"target\": \"com.amazonaws.ec2#RouteServerPersistRoutesAction\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether routes should be persisted after all BGP sessions are terminated.</p>\"\n                    }\n                },\n                \"PersistRoutesDuration\": {\n                    \"target\": \"com.amazonaws.ec2#BoxedLong\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of minutes a route server will wait after BGP is re-established to unpersist the routes in the FIB and RIB. Value must be in the range of 1-5. Required if PersistRoutes is <code>enabled</code>.</p>\\n         <p>If you set the duration to 1 minute, then when your network appliance re-establishes BGP with route server, it has 1 minute to relearn it's adjacent network and advertise those routes to route server before route server resumes normal functionality. In most cases, 1 minute is probably sufficient. If, however, you have concerns that your BGP network may not be capable of fully re-establishing and re-learning everything in 1 minute, you can increase the duration up to 5 minutes.</p>\"\n                    }\n                },\n                \"SnsNotificationsEnabled\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether SNS notifications should be enabled for route server events. Enabling SNS notifications persists BGP status changes to an SNS topic provisioned by Amazon Web Services.</p>\"\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags to apply to the route server during creation.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateRouteServerResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RouteServer\": {\n                    \"target\": \"com.amazonaws.ec2#RouteServer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RouteServer\",\n                        \"smithy.api#documentation\": \"<p>Information about the created route server.</p>\",\n                        \"smithy.api#xmlName\": \"routeServer\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateRouteTable\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateRouteTableRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreateRouteTableResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates a route table for the specified VPC. After you create a route table, you can add routes and associate the table with a subnet.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Route_Tables.html\\\">Route tables</a> in the\\n\\t\\t\\t\\t<i>Amazon VPC User Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To create a route table\",\n                        \"documentation\": \"This example creates a route table for the specified VPC.\",\n                        \"input\": {\n                            \"VpcId\": \"vpc-a01106c2\"\n                        },\n                        \"output\": {\n                            \"RouteTable\": {\n                                \"Associations\": [],\n                                \"RouteTableId\": \"rtb-22574640\",\n                                \"VpcId\": \"vpc-a01106c2\",\n                                \"PropagatingVgws\": [],\n                                \"Tags\": [],\n                                \"Routes\": [\n                                    {\n                                        \"GatewayId\": \"local\",\n                                        \"DestinationCidrBlock\": \"10.0.0.0/16\",\n                                        \"State\": \"active\"\n                                    }\n                                ]\n                            }\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#CreateRouteTableRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags to assign to the route table.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Unique, case-sensitive identifier that you provide to ensure the idempotency of the\\n            request. For more information, see <a href=\\\"https://docs.aws.amazon.com/ec2/latest/devguide/ec2-api-idempotency.html\\\">Ensuring idempotency</a>.</p>\",\n                        \"smithy.api#idempotencyToken\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"VpcId\": {\n                    \"target\": \"com.amazonaws.ec2#VpcId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcId\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the VPC.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"vpcId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateRouteTableResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RouteTable\": {\n                    \"target\": \"com.amazonaws.ec2#RouteTable\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RouteTable\",\n                        \"smithy.api#documentation\": \"<p>Information about the route table.</p>\",\n                        \"smithy.api#xmlName\": \"routeTable\"\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ClientToken\",\n                        \"smithy.api#documentation\": \"<p>Unique, case-sensitive identifier to ensure the idempotency of the request. Only returned if a client token was provided in the request.</p>\",\n                        \"smithy.api#xmlName\": \"clientToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateSecurityGroup\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateSecurityGroupRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreateSecurityGroupResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates a security group.</p>\\n         <p>A security group acts as a virtual firewall for your instance to control inbound and outbound traffic.\\n         For more information, see\\n\\t\\t\\t\\t<a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-network-security.html\\\">Amazon EC2 security groups</a> in \\n\\t\\t\\t\\tthe <i>Amazon EC2 User Guide</i> and \\n\\t\\t\\t\\t<a href=\\\"https://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_SecurityGroups.html\\\">Security groups for your VPC</a> in the\\n\\t\\t\\t\\t<i>Amazon VPC User Guide</i>.</p>\\n         <p>When you create a security group, you specify a friendly name of your choice. \\n         You can't have two security groups for the same VPC with the same name.</p>\\n         <p>You have a default security group for use in your VPC. If you don't specify a security group \\n         when you launch an instance, the instance is launched into the appropriate default security group. \\n         A default security group includes a default rule that grants instances unrestricted network access \\n         to each other.</p>\\n         <p>You can add or remove rules from your security groups using \\n\\t\\t\\t\\t\\t<a>AuthorizeSecurityGroupIngress</a>,\\n\\t\\t\\t\\t\\t<a>AuthorizeSecurityGroupEgress</a>,\\n\\t\\t\\t\\t\\t<a>RevokeSecurityGroupIngress</a>, and\\n\\t\\t\\t\\t\\t<a>RevokeSecurityGroupEgress</a>.</p>\\n         <p>For more information about VPC security group limits, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/userguide/amazon-vpc-limits.html\\\">Amazon VPC Limits</a>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To create a security group for a VPC\",\n                        \"documentation\": \"This example creates a security group for the specified VPC.\",\n                        \"input\": {\n                            \"Description\": \"My security group\",\n                            \"GroupName\": \"my-security-group\",\n                            \"VpcId\": \"vpc-1a2b3c4d\"\n                        },\n                        \"output\": {\n                            \"GroupId\": \"sg-903004f8\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#CreateSecurityGroupRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>A description for the security group.</p>\\n         <p>Constraints: Up to 255 characters in length</p>\\n         <p>Valid characters: a-z, A-Z, 0-9, spaces, and ._-:/()#,@[]+=&;{}!$*</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"GroupDescription\"\n                    }\n                },\n                \"GroupName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The name of the security group. Names are case-insensitive and must be unique within the VPC.</p>\\n         <p>Constraints: Up to 255 characters in length. Can't start with <code>sg-</code>.</p>\\n         <p>Valid characters: a-z, A-Z, 0-9, spaces, and ._-:/()#,@[]+=&;{}!$*</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"VpcId\": {\n                    \"target\": \"com.amazonaws.ec2#VpcId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the VPC. Required for a nondefault VPC.</p>\"\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags to assign to the security group.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateSecurityGroupResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"GroupId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"GroupId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the security group.</p>\",\n                        \"smithy.api#xmlName\": \"groupId\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>The tags assigned to the security group.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                },\n                \"SecurityGroupArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SecurityGroupArn\",\n                        \"smithy.api#documentation\": \"<p>The security group ARN.</p>\",\n                        \"smithy.api#xmlName\": \"securityGroupArn\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateSnapshot\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateSnapshotRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#Snapshot\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates a snapshot of an EBS volume and stores it in Amazon S3. You can use snapshots for\\n  \\tbackups, to make copies of EBS volumes, and to save data before shutting down an\\n  \\tinstance.</p>\\n         <p>The location of the source EBS volume determines where you can create the snapshot.</p>\\n         <ul>\\n            <li>\\n               <p>If the source volume is in a Region, you must create the snapshot in the same \\n          Region as the volume.</p>\\n            </li>\\n            <li>\\n               <p>If the source volume is in a Local Zone, you can create the snapshot in the same Local\\n          Zone or in its parent Amazon Web Services Region.</p>\\n            </li>\\n            <li>\\n               <p>If the source volume is on an Outpost, you can create the snapshot on the same \\n          Outpost or in its parent Amazon Web Services Region.</p>\\n            </li>\\n         </ul>\\n         <p>When a snapshot is created, any Amazon Web Services Marketplace product codes that are associated with the\\n      source volume are propagated to the snapshot.</p>\\n         <p>You can take a snapshot of an attached volume that is in use. However, snapshots only\\n      capture data that has been written to your Amazon EBS volume at the time the snapshot command is\\n      issued; this might exclude any data that has been cached by any applications or the operating\\n      system. If you can pause any file systems on the volume long enough to take a snapshot, your\\n      snapshot should be complete. However, if you cannot pause all file writes to the volume, you\\n      should unmount the volume from within the instance, issue the snapshot command, and then\\n      remount the volume to ensure a consistent and complete snapshot. You may remount and use your\\n      volume while the snapshot status is <code>pending</code>.</p>\\n         <p>When you create a snapshot for an EBS volume that serves as a root device, we recommend \\n      that you stop the instance before taking the snapshot.</p>\\n         <p>Snapshots that are taken from encrypted volumes are automatically encrypted. Volumes that\\n      are created from encrypted snapshots are also automatically encrypted. Your encrypted volumes\\n      and any associated snapshots always remain protected. For more information, see <a href=\\\"https://docs.aws.amazon.com/ebs/latest/userguide/ebs-encryption.html\\\">Amazon EBS encryption</a>\\n      in the <i>Amazon EBS User Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To create a snapshot\",\n                        \"documentation\": \"This example creates a snapshot of the volume with a volume ID of ``vol-1234567890abcdef0`` and a short description to identify the snapshot.\",\n                        \"input\": {\n                            \"VolumeId\": \"vol-1234567890abcdef0\",\n                            \"Description\": \"This is my root volume snapshot.\"\n                        },\n                        \"output\": {\n                            \"Description\": \"This is my root volume snapshot.\",\n                            \"Tags\": [],\n                            \"VolumeId\": \"vol-1234567890abcdef0\",\n                            \"State\": \"pending\",\n                            \"VolumeSize\": 8,\n                            \"StartTime\": \"2014-02-28T21:06:01.000Z\",\n                            \"OwnerId\": \"012345678910\",\n                            \"SnapshotId\": \"snap-066877671789bd71b\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#CreateSnapshotRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A description for the snapshot.</p>\"\n                    }\n                },\n                \"OutpostArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<note>\\n            <p>Only supported for volumes on Outposts. If the source volume is not on an Outpost, \\n        omit this parameter.</p>\\n         </note>\\n         <ul>\\n            <li>\\n               <p>To create the snapshot on the same Outpost as the source volume, specify the \\n          ARN of that Outpost. The snapshot must be created on the same Outpost as the volume.</p>\\n            </li>\\n            <li>\\n               <p>To create the snapshot in the parent Region of the Outpost, omit this parameter.</p>\\n            </li>\\n         </ul>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/ebs/latest/userguide/snapshots-outposts.html#create-snapshot\\\">Create local snapshots from volumes on an Outpost</a> in the <i>Amazon EBS User Guide</i>.</p>\"\n                    }\n                },\n                \"VolumeId\": {\n                    \"target\": \"com.amazonaws.ec2#VolumeId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the Amazon EBS volume.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags to apply to the snapshot during creation.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                },\n                \"Location\": {\n                    \"target\": \"com.amazonaws.ec2#SnapshotLocationEnum\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<note>\\n            <p>Only supported for volumes in Local Zones. If the source volume is not in a Local Zone, \\n        omit this parameter.</p>\\n         </note>\\n         <ul>\\n            <li>\\n               <p>To create a local snapshot in the same Local Zone as the source volume, specify \\n          <code>local</code>.</p>\\n            </li>\\n            <li>\\n               <p>To create a regional snapshot in the parent Region of the Local Zone, specify \\n          <code>regional</code> or omit this parameter.</p>\\n            </li>\\n         </ul>\\n         <p>Default value: <code>regional</code>\\n         </p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateSnapshots\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateSnapshotsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreateSnapshotsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates crash-consistent snapshots of multiple EBS volumes attached to an Amazon EC2 instance.\\n    Volumes are chosen by specifying an instance. Each volume attached to the specified instance \\n    will produce one snapshot that is crash-consistent across the instance. You can include all of \\n    the volumes currently attached to the instance, or you can exclude the root volume or specific \\n    data (non-root) volumes from the multi-volume snapshot set.</p>\\n         <p>The location of the source instance determines where you can create the snapshots.</p>\\n         <ul>\\n            <li>\\n               <p>If the source instance is in a Region, you must create the snapshots in the same \\n          Region as the instance.</p>\\n            </li>\\n            <li>\\n               <p>If the source instance is in a Local Zone, you can create the snapshots in the same\\n          Local Zone or in its parent Amazon Web Services Region.</p>\\n            </li>\\n            <li>\\n               <p>If the source instance is on an Outpost, you can create the snapshots on the same \\n          Outpost or in its parent Amazon Web Services Region.</p>\\n            </li>\\n         </ul>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateSnapshotsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> A description propagated to every snapshot specified by the instance.</p>\"\n                    }\n                },\n                \"InstanceSpecification\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceSpecification\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The instance to specify which volumes should be included in the snapshots.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"OutpostArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<note>\\n            <p>Only supported for instances on Outposts. If the source instance is not on an Outpost, \\n        omit this parameter.</p>\\n         </note>\\n         <ul>\\n            <li>\\n               <p>To create the snapshots on the same Outpost as the source instance, specify the \\n          ARN of that Outpost. The snapshots must be created on the same Outpost as the instance.</p>\\n            </li>\\n            <li>\\n               <p>To create the snapshots in the parent Region of the Outpost, omit this parameter.</p>\\n            </li>\\n         </ul>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/ebs/latest/userguide/snapshots-outposts.html#create-snapshot\\\">\\n      Create local snapshots from volumes on an Outpost</a> in the <i>Amazon EBS User Guide</i>.</p>\"\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Tags to apply to every snapshot specified by the instance.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"CopyTagsFromSource\": {\n                    \"target\": \"com.amazonaws.ec2#CopyTagsFromSource\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Copies the tags from the specified volume to corresponding snapshot.</p>\"\n                    }\n                },\n                \"Location\": {\n                    \"target\": \"com.amazonaws.ec2#SnapshotLocationEnum\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<note>\\n            <p>Only supported for instances in Local Zones. If the source instance is not in a Local Zone, \\n        omit this parameter.</p>\\n         </note>\\n         <ul>\\n            <li>\\n               <p>To create local snapshots in the same Local Zone as the source instance, specify \\n          <code>local</code>.</p>\\n            </li>\\n            <li>\\n               <p>To create regional snapshots in the parent Region of the Local Zone, specify \\n          <code>regional</code> or omit this parameter.</p>\\n            </li>\\n         </ul>\\n         <p>Default value: <code>regional</code>\\n         </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateSnapshotsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Snapshots\": {\n                    \"target\": \"com.amazonaws.ec2#SnapshotSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SnapshotSet\",\n                        \"smithy.api#documentation\": \"<p>List of snapshots.</p>\",\n                        \"smithy.api#xmlName\": \"snapshotSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateSpotDatafeedSubscription\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateSpotDatafeedSubscriptionRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreateSpotDatafeedSubscriptionResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates a data feed for Spot Instances, enabling you to view Spot Instance usage logs.\\n            You can create one data feed per Amazon Web Services account. For more information, see\\n            <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-data-feeds.html\\\">Spot Instance data feed</a> \\n            in the <i>Amazon EC2 User Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To create a Spot Instance datafeed\",\n                        \"documentation\": \"This example creates a Spot Instance data feed for your AWS account.\",\n                        \"input\": {\n                            \"Bucket\": \"my-s3-bucket\",\n                            \"Prefix\": \"spotdata\"\n                        },\n                        \"output\": {\n                            \"SpotDatafeedSubscription\": {\n                                \"OwnerId\": \"123456789012\",\n                                \"Prefix\": \"spotdata\",\n                                \"Bucket\": \"my-s3-bucket\",\n                                \"State\": \"Active\"\n                            }\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#CreateSpotDatafeedSubscriptionRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually\\n            making the request, and provides an error response. If you have the required\\n            permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is\\n            <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"Bucket\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Bucket\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The name of the Amazon S3 bucket in which to store the Spot Instance data feed. For\\n            more information about bucket names, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucketnamingrules.html\\\">Bucket naming rules</a> \\n            in the <i>Amazon S3 User Guide</i>.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"bucket\"\n                    }\n                },\n                \"Prefix\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Prefix\",\n                        \"smithy.api#documentation\": \"<p>The prefix for the data feed file names.</p>\",\n                        \"smithy.api#xmlName\": \"prefix\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the parameters for CreateSpotDatafeedSubscription.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateSpotDatafeedSubscriptionResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SpotDatafeedSubscription\": {\n                    \"target\": \"com.amazonaws.ec2#SpotDatafeedSubscription\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SpotDatafeedSubscription\",\n                        \"smithy.api#documentation\": \"<p>The Spot Instance data feed subscription.</p>\",\n                        \"smithy.api#xmlName\": \"spotDatafeedSubscription\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the output of CreateSpotDatafeedSubscription.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateStoreImageTask\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateStoreImageTaskRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreateStoreImageTaskResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Stores an AMI as a single object in an Amazon S3 bucket.</p>\\n         <p>To use this API, you must have the required permissions. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/work-with-ami-store-restore.html#ami-s3-permissions\\\">Permissions for storing and restoring AMIs using S3</a> in the\\n        <i>Amazon EC2 User Guide</i>.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ami-store-restore.html\\\">Store and restore an AMI using\\n        S3</a> in the <i>Amazon EC2 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateStoreImageTaskRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ImageId\": {\n                    \"target\": \"com.amazonaws.ec2#ImageId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the AMI.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Bucket\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The name of the Amazon S3 bucket in which the AMI object will be stored. The bucket must be in\\n      the Region in which the request is being made. The AMI object appears in the bucket only after\\n      the upload task has completed. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"S3ObjectTags\": {\n                    \"target\": \"com.amazonaws.ec2#S3ObjectTagList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags to apply to the AMI object that will be stored in the Amazon S3 bucket. </p>\",\n                        \"smithy.api#xmlName\": \"S3ObjectTag\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n\\t\\t\\tand provides an error response. If you have the required permissions, the error response is \\n\\t\\t\\t<code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateStoreImageTaskResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ObjectKey\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ObjectKey\",\n                        \"smithy.api#documentation\": \"<p>The name of the stored AMI object in the S3 bucket.</p>\",\n                        \"smithy.api#xmlName\": \"objectKey\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateSubnet\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateSubnetRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreateSubnetResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates a subnet in the specified VPC. For an IPv4 only subnet, specify an IPv4 CIDR block.\\n            If the VPC has an IPv6 CIDR block, you can create an IPv6 only subnet or a dual stack subnet instead.\\n            For an IPv6 only subnet, specify an IPv6 CIDR block. For a dual stack subnet, specify both\\n            an IPv4 CIDR block and an IPv6 CIDR block.</p>\\n         <p>A subnet CIDR block must not overlap the CIDR block of an existing subnet in the VPC.\\n            After you create a subnet, you can't change its CIDR block.</p>\\n         <p>The allowed size for an IPv4 subnet is between a /28 netmask (16 IP addresses) and  \\n            a /16 netmask (65,536 IP addresses). Amazon Web Services reserves both the first four and \\n            the last IPv4 address in each subnet's CIDR block. They're not available for your use.</p>\\n         <p>If you've associated an IPv6 CIDR block with your VPC, you can associate an IPv6 CIDR\\n            block with a subnet when you create it. </p>\\n         <p>If you add more than one subnet to a VPC, they're set up in a star topology with a\\n            logical router in the middle.</p>\\n         <p>When you stop an instance in a subnet, it retains its private IPv4 address. It's\\n            therefore possible to have a subnet with no running instances (they're all stopped), but\\n            no remaining IP addresses available.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/userguide/configure-subnets.html\\\">Subnets</a> in the <i>Amazon VPC User Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To create a subnet\",\n                        \"documentation\": \"This example creates a subnet in the specified VPC with the specified CIDR block. We recommend that you let us select an Availability Zone for you.\",\n                        \"input\": {\n                            \"VpcId\": \"vpc-a01106c2\",\n                            \"CidrBlock\": \"10.0.1.0/24\"\n                        },\n                        \"output\": {\n                            \"Subnet\": {\n                                \"VpcId\": \"vpc-a01106c2\",\n                                \"CidrBlock\": \"10.0.1.0/24\",\n                                \"State\": \"pending\",\n                                \"AvailabilityZone\": \"us-west-2c\",\n                                \"SubnetId\": \"subnet-9d4a7b6c\",\n                                \"AvailableIpAddressCount\": 251\n                            }\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#CreateSubnetCidrReservation\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateSubnetCidrReservationRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreateSubnetCidrReservationResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates a subnet CIDR reservation. For more information, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/userguide/subnet-cidr-reservation.html\\\">Subnet CIDR reservations</a> \\n            in the <i>Amazon VPC User Guide</i> and <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/work-with-prefixes.html\\\">Manage prefixes \\n                for your network interfaces</a> in the <i>Amazon EC2 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateSubnetCidrReservationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SubnetId\": {\n                    \"target\": \"com.amazonaws.ec2#SubnetId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the subnet.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Cidr\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The IPv4 or IPV6 CIDR range to reserve.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ReservationType\": {\n                    \"target\": \"com.amazonaws.ec2#SubnetCidrReservationType\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The type of reservation. The reservation type determines how the reserved IP addresses are \\n            assigned to resources.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>prefix</code> - Amazon Web Services assigns the reserved IP addresses to \\n                    network interfaces.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>explicit</code> - You assign the reserved IP addresses to network interfaces.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The description to assign to the subnet CIDR reservation.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags to assign to the subnet CIDR reservation.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateSubnetCidrReservationResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SubnetCidrReservation\": {\n                    \"target\": \"com.amazonaws.ec2#SubnetCidrReservation\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SubnetCidrReservation\",\n                        \"smithy.api#documentation\": \"<p>Information about the created subnet CIDR reservation.</p>\",\n                        \"smithy.api#xmlName\": \"subnetCidrReservation\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateSubnetRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags to assign to the subnet.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                },\n                \"AvailabilityZone\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Availability Zone or Local Zone for the subnet.</p>\\n         <p>Default: Amazon Web Services selects one for you. If you create more than one subnet in your VPC, we \\n          do not necessarily select a different zone for each subnet.</p>\\n         <p>To create a subnet in a Local Zone, set this value to the Local Zone ID, for example\\n          <code>us-west-2-lax-1a</code>. For information about the Regions that support Local Zones, \\n           see <a href=\\\"https://docs.aws.amazon.com/local-zones/latest/ug/available-local-zones.html\\\">Available Local Zones</a>.</p>\\n         <p>To create a subnet in an Outpost, set this value to the Availability Zone for the\\n           Outpost and specify the Outpost ARN.</p>\"\n                    }\n                },\n                \"AvailabilityZoneId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The AZ ID or the Local Zone ID of the subnet.</p>\"\n                    }\n                },\n                \"CidrBlock\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IPv4 network range for the subnet, in CIDR notation. For example, <code>10.0.0.0/24</code>. \\n           We modify the specified CIDR block to its canonical form; for example, if you specify \\n           <code>100.68.0.18/18</code>, we modify it to <code>100.68.0.0/18</code>.</p>\\n         <p>This parameter is not supported for an IPv6 only subnet.</p>\"\n                    }\n                },\n                \"Ipv6CidrBlock\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IPv6 network range for the subnet, in CIDR notation. This parameter is required\\n            for an IPv6 only subnet.</p>\"\n                    }\n                },\n                \"OutpostArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the Outpost. If you specify an Outpost ARN, you must also\\n        specify the Availability Zone of the Outpost subnet.</p>\"\n                    }\n                },\n                \"VpcId\": {\n                    \"target\": \"com.amazonaws.ec2#VpcId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the VPC.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Ipv6Native\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether to create an IPv6 only subnet.</p>\"\n                    }\n                },\n                \"Ipv4IpamPoolId\": {\n                    \"target\": \"com.amazonaws.ec2#IpamPoolId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An IPv4 IPAM pool ID for the subnet.</p>\"\n                    }\n                },\n                \"Ipv4NetmaskLength\": {\n                    \"target\": \"com.amazonaws.ec2#NetmaskLength\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An IPv4 netmask length for the subnet.</p>\"\n                    }\n                },\n                \"Ipv6IpamPoolId\": {\n                    \"target\": \"com.amazonaws.ec2#IpamPoolId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An IPv6 IPAM pool ID for the subnet.</p>\"\n                    }\n                },\n                \"Ipv6NetmaskLength\": {\n                    \"target\": \"com.amazonaws.ec2#NetmaskLength\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An IPv6 netmask length for the subnet.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateSubnetResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Subnet\": {\n                    \"target\": \"com.amazonaws.ec2#Subnet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Subnet\",\n                        \"smithy.api#documentation\": \"<p>Information about the subnet.</p>\",\n                        \"smithy.api#xmlName\": \"subnet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateTags\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateTagsRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Adds or overwrites only the specified tags for the specified Amazon EC2 resource or\\n         resources. When you specify an existing tag key, the value is overwritten with\\n         the new value. Each resource can have a maximum of 50 tags. Each tag consists of a key and\\n         optional value. Tag keys must be unique per resource.</p>\\n         <p>For more information about tags, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Tags.html\\\">Tag your Amazon EC2 resources</a> in the\\n            <i>Amazon Elastic Compute Cloud User Guide</i>. For more information about\\n         creating IAM policies that control users' access to resources based on tags, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-supported-iam-actions-resources.html\\\">Supported\\n            resource-level permissions for Amazon EC2 API actions</a> in the <i>Amazon\\n            Elastic Compute Cloud User Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To add a tag to a resource\",\n                        \"documentation\": \"This example adds the tag Stack=production to the specified image, or overwrites an existing tag for the AMI where the tag key is Stack.\",\n                        \"input\": {\n                            \"Resources\": [\n                                \"ami-78a54011\"\n                            ],\n                            \"Tags\": [\n                                {\n                                    \"Key\": \"Stack\",\n                                    \"Value\": \"production\"\n                                }\n                            ]\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#CreateTagsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"Resources\": {\n                    \"target\": \"com.amazonaws.ec2#ResourceIdList\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The IDs of the resources, separated by spaces.</p>\\n         <p>Constraints: Up to 1000 resource IDs. We recommend breaking up this request into smaller batches.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"ResourceId\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The tags. The <code>value</code> parameter is required, but if you don't want the tag to have a value,\\n        specify the parameter with no value, and we set the value to an empty string.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"Tag\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateTrafficMirrorFilter\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateTrafficMirrorFilterRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreateTrafficMirrorFilterResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates a Traffic Mirror filter.</p>\\n         <p>A Traffic Mirror filter is a set of rules that defines the traffic to mirror.</p>\\n         <p>By default, no traffic is mirrored. To mirror traffic, use <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateTrafficMirrorFilterRule.htm\\\">CreateTrafficMirrorFilterRule</a> \\n         to add Traffic Mirror rules to the filter. The rules you add define what traffic gets mirrored. \\n         You can also use <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyTrafficMirrorFilterNetworkServices.html\\\">ModifyTrafficMirrorFilterNetworkServices</a> to mirror supported network services.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateTrafficMirrorFilterRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The description of the Traffic Mirror filter.</p>\"\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags to assign to a Traffic Mirror filter.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Unique, case-sensitive identifier that you provide to ensure the idempotency of the request. For more information, see <a href=\\\"https://docs.aws.amazon.com/ec2/latest/devguide/ec2-api-idempotency.html\\\">How to ensure idempotency</a>.</p>\",\n                        \"smithy.api#idempotencyToken\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateTrafficMirrorFilterResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TrafficMirrorFilter\": {\n                    \"target\": \"com.amazonaws.ec2#TrafficMirrorFilter\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TrafficMirrorFilter\",\n                        \"smithy.api#documentation\": \"<p>Information about the Traffic Mirror filter.</p>\",\n                        \"smithy.api#xmlName\": \"trafficMirrorFilter\"\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ClientToken\",\n                        \"smithy.api#documentation\": \"<p>Unique, case-sensitive identifier that you provide to ensure the idempotency of the request. For more information, see <a href=\\\"https://docs.aws.amazon.com/ec2/latest/devguide/ec2-api-idempotency.html\\\">How to ensure idempotency</a>.</p>\",\n                        \"smithy.api#xmlName\": \"clientToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateTrafficMirrorFilterRule\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateTrafficMirrorFilterRuleRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreateTrafficMirrorFilterRuleResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates a Traffic Mirror filter rule.</p>\\n         <p>A Traffic Mirror rule defines the Traffic Mirror source traffic to mirror.</p>\\n         <p>You need the Traffic Mirror filter ID when you create the rule.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateTrafficMirrorFilterRuleRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TrafficMirrorFilterId\": {\n                    \"target\": \"com.amazonaws.ec2#TrafficMirrorFilterId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the filter that this rule is associated with.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TrafficDirection\": {\n                    \"target\": \"com.amazonaws.ec2#TrafficDirection\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The type of traffic.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"RuleNumber\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The number of the Traffic Mirror rule. This number must be unique for each Traffic Mirror rule in a given\\n         direction. The rules are processed in ascending order by rule number.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"RuleAction\": {\n                    \"target\": \"com.amazonaws.ec2#TrafficMirrorRuleAction\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The action to take on the filtered traffic.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DestinationPortRange\": {\n                    \"target\": \"com.amazonaws.ec2#TrafficMirrorPortRangeRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The destination port range.</p>\"\n                    }\n                },\n                \"SourcePortRange\": {\n                    \"target\": \"com.amazonaws.ec2#TrafficMirrorPortRangeRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The source port range.</p>\"\n                    }\n                },\n                \"Protocol\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The protocol, for example UDP, to assign to the Traffic Mirror rule.</p>\\n         <p>For information about the protocol value, see <a href=\\\"https://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml\\\">Protocol Numbers</a> on the  Internet Assigned Numbers Authority (IANA) website.</p>\"\n                    }\n                },\n                \"DestinationCidrBlock\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The destination CIDR block to assign to the Traffic Mirror rule.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"SourceCidrBlock\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The source CIDR block to assign to the Traffic Mirror rule.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The description of the Traffic Mirror rule.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Unique, case-sensitive identifier that you provide to ensure the idempotency of the request. For more information, see <a href=\\\"https://docs.aws.amazon.com/ec2/latest/devguide/ec2-api-idempotency.html\\\">How to ensure idempotency</a>.</p>\",\n                        \"smithy.api#idempotencyToken\": {}\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Traffic Mirroring tags specifications.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateTrafficMirrorFilterRuleResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TrafficMirrorFilterRule\": {\n                    \"target\": \"com.amazonaws.ec2#TrafficMirrorFilterRule\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TrafficMirrorFilterRule\",\n                        \"smithy.api#documentation\": \"<p>The Traffic Mirror rule.</p>\",\n                        \"smithy.api#xmlName\": \"trafficMirrorFilterRule\"\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ClientToken\",\n                        \"smithy.api#documentation\": \"<p>Unique, case-sensitive identifier that you provide to ensure the idempotency of the request. For more information, see <a href=\\\"https://docs.aws.amazon.com/ec2/latest/devguide/ec2-api-idempotency.html\\\">How to ensure idempotency</a>.</p>\",\n                        \"smithy.api#xmlName\": \"clientToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateTrafficMirrorSession\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateTrafficMirrorSessionRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreateTrafficMirrorSessionResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates a Traffic Mirror session.</p>\\n         <p>A Traffic Mirror session actively copies packets from a Traffic Mirror source to a Traffic Mirror target. Create a filter, and then assign it\\n         to the session to define a subset of the traffic to mirror, for example all TCP\\n         traffic.</p>\\n         <p>The Traffic Mirror source and the Traffic Mirror target (monitoring appliances) can be in the same VPC, or in a different VPC connected via VPC peering or a transit gateway. </p>\\n         <p>By default, no traffic is mirrored. Use <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateTrafficMirrorFilter.html\\\">CreateTrafficMirrorFilter</a> to\\n         create filter rules that specify the traffic to mirror.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateTrafficMirrorSessionRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NetworkInterfaceId\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInterfaceId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the source network interface.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TrafficMirrorTargetId\": {\n                    \"target\": \"com.amazonaws.ec2#TrafficMirrorTargetId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the Traffic Mirror target.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TrafficMirrorFilterId\": {\n                    \"target\": \"com.amazonaws.ec2#TrafficMirrorFilterId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the Traffic Mirror filter.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"PacketLength\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of bytes in each packet to mirror. These are bytes after the VXLAN header. Do\\n         not specify this parameter when you want to mirror the entire packet. To mirror a subset of\\n         the packet, set this to the length (in bytes) that you want to mirror. For example, if you\\n         set this value to 100, then the first 100 bytes that meet the filter criteria are copied to\\n         the target.</p>\\n         <p>If you do not want to mirror the entire packet, use the <code>PacketLength</code> parameter to specify the number of bytes in each packet to mirror.</p>\\n         <p>For sessions with Network Load Balancer (NLB) Traffic Mirror targets the default <code>PacketLength</code> will be set to 8500. Valid values are 1-8500. Setting a <code>PacketLength</code> greater than 8500 will result in an error response.</p>\"\n                    }\n                },\n                \"SessionNumber\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The session number determines the order in which sessions are evaluated when an interface is used by multiple sessions. The first session with a matching filter is the one that mirrors the packets.</p>\\n         <p>Valid values are 1-32766.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"VirtualNetworkId\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The VXLAN ID for the Traffic Mirror session. For more information about the VXLAN\\n         protocol, see <a href=\\\"https://datatracker.ietf.org/doc/html/rfc7348\\\">RFC 7348</a>. If you do\\n         not specify a <code>VirtualNetworkId</code>, an account-wide unique ID is chosen at\\n         random.</p>\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The description of the Traffic Mirror session.</p>\"\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags to assign to a Traffic Mirror session.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Unique, case-sensitive identifier that you provide to ensure the idempotency of the request. For more information, see <a href=\\\"https://docs.aws.amazon.com/ec2/latest/devguide/ec2-api-idempotency.html\\\">How to ensure idempotency</a>.</p>\",\n                        \"smithy.api#idempotencyToken\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateTrafficMirrorSessionResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TrafficMirrorSession\": {\n                    \"target\": \"com.amazonaws.ec2#TrafficMirrorSession\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TrafficMirrorSession\",\n                        \"smithy.api#documentation\": \"<p>Information about the Traffic Mirror session.</p>\",\n                        \"smithy.api#xmlName\": \"trafficMirrorSession\"\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ClientToken\",\n                        \"smithy.api#documentation\": \"<p>Unique, case-sensitive identifier that you provide to ensure the idempotency of the request. For more information, see <a href=\\\"https://docs.aws.amazon.com/ec2/latest/devguide/ec2-api-idempotency.html\\\">How to ensure idempotency</a>.</p>\",\n                        \"smithy.api#xmlName\": \"clientToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateTrafficMirrorTarget\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateTrafficMirrorTargetRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreateTrafficMirrorTargetResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates a target for your Traffic Mirror session.</p>\\n         <p>A Traffic Mirror target is the destination for mirrored traffic. The Traffic Mirror source and\\n         the Traffic Mirror target (monitoring appliances) can be in the same VPC, or in\\n         different VPCs connected via VPC peering or a transit gateway.</p>\\n         <p>A Traffic Mirror target can be a network interface, a Network Load Balancer, or a Gateway Load Balancer endpoint.</p>\\n         <p>To use the target in a Traffic Mirror session, use  <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateTrafficMirrorSession.htm\\\">CreateTrafficMirrorSession</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateTrafficMirrorTargetRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NetworkInterfaceId\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInterfaceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The network interface ID that is associated with the target.</p>\"\n                    }\n                },\n                \"NetworkLoadBalancerArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the Network Load Balancer that is associated with the target.</p>\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The description of the Traffic Mirror target.</p>\"\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags to assign to the Traffic Mirror target.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Unique, case-sensitive identifier that you provide to ensure the idempotency of the request. For more information, see <a href=\\\"https://docs.aws.amazon.com/ec2/latest/devguide/ec2-api-idempotency.html\\\">How to ensure idempotency</a>.</p>\",\n                        \"smithy.api#idempotencyToken\": {}\n                    }\n                },\n                \"GatewayLoadBalancerEndpointId\": {\n                    \"target\": \"com.amazonaws.ec2#VpcEndpointId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the Gateway Load Balancer endpoint.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateTrafficMirrorTargetResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TrafficMirrorTarget\": {\n                    \"target\": \"com.amazonaws.ec2#TrafficMirrorTarget\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TrafficMirrorTarget\",\n                        \"smithy.api#documentation\": \"<p>Information about the Traffic Mirror target.</p>\",\n                        \"smithy.api#xmlName\": \"trafficMirrorTarget\"\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ClientToken\",\n                        \"smithy.api#documentation\": \"<p>Unique, case-sensitive identifier that you provide to ensure the idempotency of the request. For more information, see <a href=\\\"https://docs.aws.amazon.com/ec2/latest/devguide/ec2-api-idempotency.html\\\">How to ensure idempotency</a>.</p>\",\n                        \"smithy.api#xmlName\": \"clientToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateTransitGateway\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateTransitGatewayRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreateTransitGatewayResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates a transit gateway.</p>\\n         <p>You can use a transit gateway to interconnect your virtual private clouds (VPC) and on-premises networks.\\n          After the transit gateway enters the <code>available</code> state, you can attach your VPCs and VPN\\n          connections to the transit gateway.</p>\\n         <p>To attach your VPCs, use <a>CreateTransitGatewayVpcAttachment</a>.</p>\\n         <p>To attach a VPN connection, use <a>CreateCustomerGateway</a> to create a customer \\n         gateway and specify the ID of the customer gateway and the ID of the transit gateway in a call to\\n         <a>CreateVpnConnection</a>.</p>\\n         <p>When you create a transit gateway, we create a default transit gateway route table and use it as the default association route table\\n         and the default propagation route table. You can use <a>CreateTransitGatewayRouteTable</a> to create\\n         additional transit gateway route tables. If you disable automatic route propagation, we do not create a default transit gateway route table. \\n         You can use <a>EnableTransitGatewayRouteTablePropagation</a> to propagate routes from a resource \\n         attachment to a transit gateway route table. If you disable automatic associations, you can use <a>AssociateTransitGatewayRouteTable</a> to associate a resource attachment with a transit gateway route table.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateTransitGatewayConnect\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateTransitGatewayConnectRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreateTransitGatewayConnectResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates a Connect attachment from a specified transit gateway attachment. A Connect attachment is a GRE-based tunnel attachment that you can use to establish a connection between a transit gateway and an appliance.</p>\\n         <p>A Connect attachment uses an existing VPC or Amazon Web Services Direct Connect attachment as the underlying transport mechanism.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateTransitGatewayConnectPeer\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateTransitGatewayConnectPeerRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreateTransitGatewayConnectPeerResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates a Connect peer for a specified transit gateway Connect attachment between a\\n            transit gateway and an appliance.</p>\\n         <p>The peer address and transit gateway address must be the same IP address family (IPv4 or IPv6).</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/tgw/tgw-connect.html#tgw-connect-peer\\\">Connect peers</a>\\n            in the <i>Amazon Web Services Transit Gateways Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateTransitGatewayConnectPeerRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayAttachmentId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayAttachmentId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the Connect attachment.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TransitGatewayAddress\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The peer IP address (GRE outer IP address) on the transit gateway side of the Connect peer, which must be\\n            specified from a transit gateway CIDR block. If not specified, Amazon automatically assigns\\n            the first available IP address from the transit gateway CIDR block.</p>\"\n                    }\n                },\n                \"PeerAddress\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The peer IP address (GRE outer IP address) on the appliance side of the Connect peer.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"BgpOptions\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayConnectRequestBgpOptions\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The BGP options for the Connect peer.</p>\"\n                    }\n                },\n                \"InsideCidrBlocks\": {\n                    \"target\": \"com.amazonaws.ec2#InsideCidrBlocksStringList\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The range of inside IP addresses that are used for BGP peering. You must specify a\\n            size /29 IPv4 CIDR block from the <code>169.254.0.0/16</code> range. The first address\\n            from the range must be configured on the appliance as the BGP IP address. You can also\\n            optionally specify a size /125 IPv6 CIDR block from the <code>fd00::/8</code>\\n            range.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags to apply to the Connect peer.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateTransitGatewayConnectPeerResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayConnectPeer\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayConnectPeer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayConnectPeer\",\n                        \"smithy.api#documentation\": \"<p>Information about the Connect peer.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayConnectPeer\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateTransitGatewayConnectRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransportTransitGatewayAttachmentId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayAttachmentId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the transit gateway attachment. You can specify a VPC attachment or Amazon Web Services Direct Connect attachment.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Options\": {\n                    \"target\": \"com.amazonaws.ec2#CreateTransitGatewayConnectRequestOptions\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The Connect attachment options.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags to apply to the Connect attachment.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateTransitGatewayConnectRequestOptions\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Protocol\": {\n                    \"target\": \"com.amazonaws.ec2#ProtocolValue\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The tunnel protocol.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The options for a Connect attachment.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateTransitGatewayConnectResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayConnect\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayConnect\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayConnect\",\n                        \"smithy.api#documentation\": \"<p>Information about the Connect attachment.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayConnect\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateTransitGatewayMulticastDomain\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateTransitGatewayMulticastDomainRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreateTransitGatewayMulticastDomainResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates a multicast domain using the specified transit gateway.</p>\\n         <p>The transit gateway  must be in the available state before you create a domain. Use <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeTransitGateways.html\\\">DescribeTransitGateways</a> to see the state of transit gateway.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateTransitGatewayMulticastDomainRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the transit gateway.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Options\": {\n                    \"target\": \"com.amazonaws.ec2#CreateTransitGatewayMulticastDomainRequestOptions\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The options for the transit gateway multicast domain.</p>\"\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags for the transit gateway multicast domain.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateTransitGatewayMulticastDomainRequestOptions\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Igmpv2Support\": {\n                    \"target\": \"com.amazonaws.ec2#Igmpv2SupportValue\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify whether to enable Internet Group Management Protocol (IGMP) version 2 for the transit gateway multicast domain.</p>\"\n                    }\n                },\n                \"StaticSourcesSupport\": {\n                    \"target\": \"com.amazonaws.ec2#StaticSourcesSupportValue\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify whether to enable support for statically configuring multicast group sources for a domain.</p>\"\n                    }\n                },\n                \"AutoAcceptSharedAssociations\": {\n                    \"target\": \"com.amazonaws.ec2#AutoAcceptSharedAssociationsValue\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether to automatically accept cross-account subnet associations that are associated with the transit gateway multicast domain.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The options for the transit gateway multicast domain.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateTransitGatewayMulticastDomainResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayMulticastDomain\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayMulticastDomain\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayMulticastDomain\",\n                        \"smithy.api#documentation\": \"<p>Information about the transit gateway multicast domain.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayMulticastDomain\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateTransitGatewayPeeringAttachment\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateTransitGatewayPeeringAttachmentRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreateTransitGatewayPeeringAttachmentResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Requests a transit gateway peering attachment between the specified transit gateway\\n            (requester) and a peer transit gateway (accepter). The peer transit gateway can be in \\n            your account or a different Amazon Web Services account.</p>\\n         <p>After you create the peering attachment, the owner of the accepter transit gateway \\n            must accept the attachment request.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateTransitGatewayPeeringAttachmentRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the transit gateway.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"PeerTransitGatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitAssociationGatewayId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the peer transit gateway with which to create the peering attachment.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"PeerAccountId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the Amazon Web Services account that owns the peer transit gateway.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"PeerRegion\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The Region where the peer transit gateway is located.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Options\": {\n                    \"target\": \"com.amazonaws.ec2#CreateTransitGatewayPeeringAttachmentRequestOptions\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Requests a transit gateway peering attachment.</p>\"\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags to apply to the transit gateway peering attachment.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateTransitGatewayPeeringAttachmentRequestOptions\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DynamicRouting\": {\n                    \"target\": \"com.amazonaws.ec2#DynamicRoutingValue\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether dynamic routing is enabled or disabled.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes whether dynamic routing is enabled or disabled for the transit gateway peering request.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateTransitGatewayPeeringAttachmentResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayPeeringAttachment\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayPeeringAttachment\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayPeeringAttachment\",\n                        \"smithy.api#documentation\": \"<p>The transit gateway peering attachment.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayPeeringAttachment\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateTransitGatewayPolicyTable\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateTransitGatewayPolicyTableRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreateTransitGatewayPolicyTableResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates a transit gateway policy table.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateTransitGatewayPolicyTableRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the transit gateway used for the policy table.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags specification for the transit gateway policy table created during the request.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateTransitGatewayPolicyTableResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayPolicyTable\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayPolicyTable\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayPolicyTable\",\n                        \"smithy.api#documentation\": \"<p>Describes the created transit gateway policy table.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayPolicyTable\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateTransitGatewayPrefixListReference\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateTransitGatewayPrefixListReferenceRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreateTransitGatewayPrefixListReferenceResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates a reference (route) to a prefix list in a specified transit gateway route table.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateTransitGatewayPrefixListReferenceRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayRouteTableId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayRouteTableId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the transit gateway route table.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"PrefixListId\": {\n                    \"target\": \"com.amazonaws.ec2#PrefixListResourceId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the prefix list that is used for destination matches.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TransitGatewayAttachmentId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayAttachmentId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the attachment to which traffic is routed.</p>\"\n                    }\n                },\n                \"Blackhole\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether to drop traffic that matches this route.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateTransitGatewayPrefixListReferenceResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayPrefixListReference\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayPrefixListReference\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayPrefixListReference\",\n                        \"smithy.api#documentation\": \"<p>Information about the prefix list reference.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayPrefixListReference\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateTransitGatewayRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A description of the transit gateway.</p>\"\n                    }\n                },\n                \"Options\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayRequestOptions\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The transit gateway options.</p>\"\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags to apply to the transit gateway.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateTransitGatewayResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGateway\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGateway\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGateway\",\n                        \"smithy.api#documentation\": \"<p>Information about the transit gateway.</p>\",\n                        \"smithy.api#xmlName\": \"transitGateway\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateTransitGatewayRoute\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateTransitGatewayRouteRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreateTransitGatewayRouteResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates a static route for the specified transit gateway route table.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateTransitGatewayRouteRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DestinationCidrBlock\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The CIDR range used for destination matches. Routing decisions are based on the\\n         most specific match.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TransitGatewayRouteTableId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayRouteTableId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the transit gateway route table.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TransitGatewayAttachmentId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayAttachmentId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the attachment.</p>\"\n                    }\n                },\n                \"Blackhole\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether to drop traffic that matches this route.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateTransitGatewayRouteResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Route\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayRoute\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Route\",\n                        \"smithy.api#documentation\": \"<p>Information about the route.</p>\",\n                        \"smithy.api#xmlName\": \"route\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateTransitGatewayRouteTable\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateTransitGatewayRouteTableRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreateTransitGatewayRouteTableResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates a route table for the specified transit gateway.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateTransitGatewayRouteTableAnnouncement\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateTransitGatewayRouteTableAnnouncementRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreateTransitGatewayRouteTableAnnouncementResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Advertises a new transit gateway route table.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateTransitGatewayRouteTableAnnouncementRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayRouteTableId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayRouteTableId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the transit gateway route table.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"PeeringAttachmentId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayAttachmentId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the peering attachment.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags specifications applied to the transit gateway route table announcement.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateTransitGatewayRouteTableAnnouncementResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayRouteTableAnnouncement\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayRouteTableAnnouncement\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayRouteTableAnnouncement\",\n                        \"smithy.api#documentation\": \"<p>Provides details about the transit gateway route table announcement.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayRouteTableAnnouncement\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateTransitGatewayRouteTableRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the transit gateway.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags to apply to the transit gateway route table.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateTransitGatewayRouteTableResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayRouteTable\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayRouteTable\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayRouteTable\",\n                        \"smithy.api#documentation\": \"<p>Information about the transit gateway route table.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayRouteTable\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateTransitGatewayVpcAttachment\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateTransitGatewayVpcAttachmentRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreateTransitGatewayVpcAttachmentResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Attaches the specified VPC to the specified transit gateway.</p>\\n         <p>If you attach a VPC with a CIDR range that overlaps the CIDR range of a VPC that is already attached,\\n         the new VPC CIDR range is not propagated to the default propagation route table.</p>\\n         <p>To send VPC traffic to an attached transit gateway, add a route to the VPC route table using <a>CreateRoute</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateTransitGatewayVpcAttachmentRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the transit gateway.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"VpcId\": {\n                    \"target\": \"com.amazonaws.ec2#VpcId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the VPC.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"SubnetIds\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewaySubnetIdList\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The IDs of one or more subnets. You can specify only one subnet per Availability Zone. \\n         You must specify at least one subnet, but we recommend that you specify two subnets for better availability.\\n         The transit gateway uses one IP address from each specified subnet.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Options\": {\n                    \"target\": \"com.amazonaws.ec2#CreateTransitGatewayVpcAttachmentRequestOptions\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The VPC attachment options.</p>\"\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags to apply to the VPC attachment.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateTransitGatewayVpcAttachmentRequestOptions\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DnsSupport\": {\n                    \"target\": \"com.amazonaws.ec2#DnsSupportValue\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Enable or disable DNS support. The default is <code>enable</code>.</p>\"\n                    }\n                },\n                \"SecurityGroupReferencingSupport\": {\n                    \"target\": \"com.amazonaws.ec2#SecurityGroupReferencingSupportValue\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Enables you to reference a security group across VPCs attached to a transit gateway to simplify security group management.</p>\\n         <p>This option is set to <code>enable</code> by default. However, at the transit gateway level the default is set to <code>disable</code>.</p>\\n         <p>For more information about security group referencing, see  <a href=\\\"https://docs.aws.amazon.com/vpc/latest/tgw/tgw-vpc-attachments.html#vpc-attachment-security\\\">Security group referencing </a> in the <i>Amazon Web Services Transit Gateways Guide</i>.</p>\"\n                    }\n                },\n                \"Ipv6Support\": {\n                    \"target\": \"com.amazonaws.ec2#Ipv6SupportValue\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Enable or disable IPv6 support.  The default is <code>disable</code>.</p>\"\n                    }\n                },\n                \"ApplianceModeSupport\": {\n                    \"target\": \"com.amazonaws.ec2#ApplianceModeSupportValue\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Enable or disable support for appliance mode. If enabled, a traffic flow between a source and destination uses the same Availability Zone for the VPC attachment for the lifetime of that flow. The default is <code>disable</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the options for a VPC attachment.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateTransitGatewayVpcAttachmentResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayVpcAttachment\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayVpcAttachment\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayVpcAttachment\",\n                        \"smithy.api#documentation\": \"<p>Information about the VPC attachment.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayVpcAttachment\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateVerifiedAccessEndpoint\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateVerifiedAccessEndpointRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreateVerifiedAccessEndpointResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>An Amazon Web Services Verified Access endpoint is where you define your application along with an optional endpoint-level access policy.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateVerifiedAccessEndpointCidrOptions\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Protocol\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessEndpointProtocol\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The protocol.</p>\"\n                    }\n                },\n                \"SubnetIds\": {\n                    \"target\": \"com.amazonaws.ec2#CreateVerifiedAccessEndpointSubnetIdList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the subnets.</p>\",\n                        \"smithy.api#xmlName\": \"SubnetId\"\n                    }\n                },\n                \"Cidr\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The CIDR.</p>\"\n                    }\n                },\n                \"PortRanges\": {\n                    \"target\": \"com.amazonaws.ec2#CreateVerifiedAccessEndpointPortRangeList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The port ranges.</p>\",\n                        \"smithy.api#xmlName\": \"PortRange\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the CIDR options for a Verified Access endpoint.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateVerifiedAccessEndpointEniOptions\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NetworkInterfaceId\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInterfaceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the network interface.</p>\"\n                    }\n                },\n                \"Protocol\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessEndpointProtocol\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IP protocol.</p>\"\n                    }\n                },\n                \"Port\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessEndpointPortNumber\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IP port number.</p>\"\n                    }\n                },\n                \"PortRanges\": {\n                    \"target\": \"com.amazonaws.ec2#CreateVerifiedAccessEndpointPortRangeList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The port ranges.</p>\",\n                        \"smithy.api#xmlName\": \"PortRange\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the network interface options when creating an Amazon Web Services Verified Access endpoint using the\\n            <code>network-interface</code> type.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateVerifiedAccessEndpointLoadBalancerOptions\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Protocol\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessEndpointProtocol\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IP protocol.</p>\"\n                    }\n                },\n                \"Port\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessEndpointPortNumber\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IP port number.</p>\"\n                    }\n                },\n                \"LoadBalancerArn\": {\n                    \"target\": \"com.amazonaws.ec2#LoadBalancerArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the load balancer.</p>\"\n                    }\n                },\n                \"SubnetIds\": {\n                    \"target\": \"com.amazonaws.ec2#CreateVerifiedAccessEndpointSubnetIdList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the subnets. You can specify only one subnet per Availability Zone.</p>\",\n                        \"smithy.api#xmlName\": \"SubnetId\"\n                    }\n                },\n                \"PortRanges\": {\n                    \"target\": \"com.amazonaws.ec2#CreateVerifiedAccessEndpointPortRangeList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The port ranges.</p>\",\n                        \"smithy.api#xmlName\": \"PortRange\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the load balancer options when creating an Amazon Web Services Verified Access endpoint using the\\n            <code>load-balancer</code> type.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateVerifiedAccessEndpointPortRange\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"FromPort\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessEndpointPortNumber\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The start of the port range.</p>\"\n                    }\n                },\n                \"ToPort\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessEndpointPortNumber\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The end of the port range.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the port range for a Verified Access endpoint.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateVerifiedAccessEndpointPortRangeList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#CreateVerifiedAccessEndpointPortRange\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#CreateVerifiedAccessEndpointRdsOptions\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Protocol\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessEndpointProtocol\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The protocol.</p>\"\n                    }\n                },\n                \"Port\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessEndpointPortNumber\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The port.</p>\"\n                    }\n                },\n                \"RdsDbInstanceArn\": {\n                    \"target\": \"com.amazonaws.ec2#RdsDbInstanceArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the RDS instance.</p>\"\n                    }\n                },\n                \"RdsDbClusterArn\": {\n                    \"target\": \"com.amazonaws.ec2#RdsDbClusterArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the DB cluster.</p>\"\n                    }\n                },\n                \"RdsDbProxyArn\": {\n                    \"target\": \"com.amazonaws.ec2#RdsDbProxyArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the RDS proxy.</p>\"\n                    }\n                },\n                \"RdsEndpoint\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The RDS endpoint.</p>\"\n                    }\n                },\n                \"SubnetIds\": {\n                    \"target\": \"com.amazonaws.ec2#CreateVerifiedAccessEndpointSubnetIdList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the subnets. You can specify only one subnet per Availability Zone.</p>\",\n                        \"smithy.api#xmlName\": \"SubnetId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the RDS options for a Verified Access endpoint.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateVerifiedAccessEndpointRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VerifiedAccessGroupId\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessGroupId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the Verified Access group to associate the endpoint with.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"EndpointType\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessEndpointType\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The type of Verified Access endpoint to create.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"AttachmentType\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessEndpointAttachmentType\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The type of attachment.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DomainCertificateArn\": {\n                    \"target\": \"com.amazonaws.ec2#CertificateArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the public TLS/SSL certificate in Amazon Web Services Certificate Manager to associate with the endpoint.\\n         The CN in the certificate must match the DNS name your end users will use to reach your\\n         application.</p>\"\n                    }\n                },\n                \"ApplicationDomain\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The DNS name for users to reach your application.</p>\"\n                    }\n                },\n                \"EndpointDomainPrefix\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A custom identifier that is prepended to the DNS name that is generated for the\\n         endpoint.</p>\"\n                    }\n                },\n                \"SecurityGroupIds\": {\n                    \"target\": \"com.amazonaws.ec2#SecurityGroupIdList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the security groups to associate with the Verified Access endpoint. Required if <code>AttachmentType</code> is set to <code>vpc</code>.</p>\",\n                        \"smithy.api#xmlName\": \"SecurityGroupId\"\n                    }\n                },\n                \"LoadBalancerOptions\": {\n                    \"target\": \"com.amazonaws.ec2#CreateVerifiedAccessEndpointLoadBalancerOptions\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The load balancer details. This parameter is required if the endpoint type is\\n            <code>load-balancer</code>.</p>\"\n                    }\n                },\n                \"NetworkInterfaceOptions\": {\n                    \"target\": \"com.amazonaws.ec2#CreateVerifiedAccessEndpointEniOptions\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The network interface details. This parameter is required if the endpoint type is\\n            <code>network-interface</code>.</p>\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A description for the Verified Access endpoint.</p>\"\n                    }\n                },\n                \"PolicyDocument\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Verified Access policy document.</p>\"\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags to assign to the Verified Access endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A unique, case-sensitive token that you provide to ensure idempotency of your\\n            modification request. For more information, see <a href=\\\"https://docs.aws.amazon.com/ec2/latest/devguide/ec2-api-idempotency.html\\\">Ensuring idempotency</a>.</p>\",\n                        \"smithy.api#idempotencyToken\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"SseSpecification\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessSseSpecificationRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The options for server side encryption.</p>\"\n                    }\n                },\n                \"RdsOptions\": {\n                    \"target\": \"com.amazonaws.ec2#CreateVerifiedAccessEndpointRdsOptions\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The RDS details. This parameter is required if the endpoint type is <code>rds</code>.</p>\"\n                    }\n                },\n                \"CidrOptions\": {\n                    \"target\": \"com.amazonaws.ec2#CreateVerifiedAccessEndpointCidrOptions\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The CIDR options. This parameter is required if the endpoint type is <code>cidr</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateVerifiedAccessEndpointResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VerifiedAccessEndpoint\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessEndpoint\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VerifiedAccessEndpoint\",\n                        \"smithy.api#documentation\": \"<p>Details about the Verified Access endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"verifiedAccessEndpoint\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateVerifiedAccessEndpointSubnetIdList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#SubnetId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#CreateVerifiedAccessGroup\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateVerifiedAccessGroupRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreateVerifiedAccessGroupResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>An Amazon Web Services Verified Access group is a collection of Amazon Web Services Verified Access endpoints who's associated applications have\\n         similar security requirements. Each instance within a Verified Access group shares an Verified Access policy. For\\n         example, you can group all Verified Access instances associated with \\\"sales\\\" applications together and\\n         use one common Verified Access policy.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateVerifiedAccessGroupRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VerifiedAccessInstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessInstanceId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the Verified Access instance.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A description for the Verified Access group.</p>\"\n                    }\n                },\n                \"PolicyDocument\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Verified Access policy document.</p>\"\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags to assign to the Verified Access group.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A unique, case-sensitive token that you provide to ensure idempotency of your\\n            modification request. For more information, see <a href=\\\"https://docs.aws.amazon.com/ec2/latest/devguide/ec2-api-idempotency.html\\\">Ensuring idempotency</a>.</p>\",\n                        \"smithy.api#idempotencyToken\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"SseSpecification\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessSseSpecificationRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The options for server side encryption.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateVerifiedAccessGroupResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VerifiedAccessGroup\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessGroup\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VerifiedAccessGroup\",\n                        \"smithy.api#documentation\": \"<p>Details about the Verified Access group.</p>\",\n                        \"smithy.api#xmlName\": \"verifiedAccessGroup\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateVerifiedAccessInstance\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateVerifiedAccessInstanceRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreateVerifiedAccessInstanceResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>An Amazon Web Services Verified Access instance is a regional entity that evaluates application requests and grants\\n         access only when your security requirements are met.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateVerifiedAccessInstanceRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A description for the Verified Access instance.</p>\"\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags to assign to the Verified Access instance.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A unique, case-sensitive token that you provide to ensure idempotency of your\\n            modification request. For more information, see <a href=\\\"https://docs.aws.amazon.com/ec2/latest/devguide/ec2-api-idempotency.html\\\">Ensuring idempotency</a>.</p>\",\n                        \"smithy.api#idempotencyToken\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"FIPSEnabled\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Enable or disable support for Federal Information Processing Standards (FIPS) on the instance.</p>\"\n                    }\n                },\n                \"CidrEndpointsCustomSubDomain\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The custom subdomain.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateVerifiedAccessInstanceResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VerifiedAccessInstance\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessInstance\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VerifiedAccessInstance\",\n                        \"smithy.api#documentation\": \"<p>Details about the Verified Access instance.</p>\",\n                        \"smithy.api#xmlName\": \"verifiedAccessInstance\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateVerifiedAccessNativeApplicationOidcOptions\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PublicSigningKeyEndpoint\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The public signing key endpoint.</p>\"\n                    }\n                },\n                \"Issuer\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The OIDC issuer identifier of the IdP.</p>\"\n                    }\n                },\n                \"AuthorizationEndpoint\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The authorization endpoint of the IdP.</p>\"\n                    }\n                },\n                \"TokenEndpoint\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token endpoint of the IdP.</p>\"\n                    }\n                },\n                \"UserInfoEndpoint\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The user info endpoint of the IdP.</p>\"\n                    }\n                },\n                \"ClientId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The OAuth 2.0 client identifier.</p>\"\n                    }\n                },\n                \"ClientSecret\": {\n                    \"target\": \"com.amazonaws.ec2#ClientSecretType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The OAuth 2.0 client secret.</p>\"\n                    }\n                },\n                \"Scope\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The set of user claims to be requested from the IdP.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the OpenID Connect (OIDC) options.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateVerifiedAccessTrustProvider\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateVerifiedAccessTrustProviderRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreateVerifiedAccessTrustProviderResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A trust provider is a third-party entity that creates, maintains, and manages identity\\n         information for users and devices. When an application request is made, the identity\\n         information sent by the trust provider is evaluated by Verified Access before allowing or\\n         denying the application request.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateVerifiedAccessTrustProviderDeviceOptions\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TenantId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the tenant application with the device-identity provider.</p>\"\n                    }\n                },\n                \"PublicSigningKeyUrl\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>\\n         The URL Amazon Web Services Verified Access will use to verify the authenticity of the device tokens.\\n      </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the options when creating an Amazon Web Services Verified Access trust provider using the\\n            <code>device</code> type.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateVerifiedAccessTrustProviderOidcOptions\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Issuer\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The OIDC issuer.</p>\"\n                    }\n                },\n                \"AuthorizationEndpoint\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The OIDC authorization endpoint.</p>\"\n                    }\n                },\n                \"TokenEndpoint\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The OIDC token endpoint.</p>\"\n                    }\n                },\n                \"UserInfoEndpoint\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The OIDC user info endpoint.</p>\"\n                    }\n                },\n                \"ClientId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The client identifier.</p>\"\n                    }\n                },\n                \"ClientSecret\": {\n                    \"target\": \"com.amazonaws.ec2#ClientSecretType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The client secret.</p>\"\n                    }\n                },\n                \"Scope\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>OpenID Connect (OIDC) scopes are used by an application during authentication to authorize access to a user's details. Each scope returns a specific set of user attributes.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the options when creating an Amazon Web Services Verified Access trust provider using the <code>user</code>\\n         type.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateVerifiedAccessTrustProviderRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TrustProviderType\": {\n                    \"target\": \"com.amazonaws.ec2#TrustProviderType\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The type of trust provider.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"UserTrustProviderType\": {\n                    \"target\": \"com.amazonaws.ec2#UserTrustProviderType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of user-based trust provider. This parameter is required when the provider type\\n         is <code>user</code>.</p>\"\n                    }\n                },\n                \"DeviceTrustProviderType\": {\n                    \"target\": \"com.amazonaws.ec2#DeviceTrustProviderType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of device-based trust provider. This parameter is required when the provider\\n         type is <code>device</code>.</p>\"\n                    }\n                },\n                \"OidcOptions\": {\n                    \"target\": \"com.amazonaws.ec2#CreateVerifiedAccessTrustProviderOidcOptions\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The options for a OpenID Connect-compatible user-identity trust provider. This parameter\\n         is required when the provider type is <code>user</code>.</p>\"\n                    }\n                },\n                \"DeviceOptions\": {\n                    \"target\": \"com.amazonaws.ec2#CreateVerifiedAccessTrustProviderDeviceOptions\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The options for a device-based trust provider. This parameter is required when the\\n         provider type is <code>device</code>.</p>\"\n                    }\n                },\n                \"PolicyReferenceName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The identifier to be used when working with policy rules.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A description for the Verified Access trust provider.</p>\"\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags to assign to the Verified Access trust provider.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A unique, case-sensitive token that you provide to ensure idempotency of your\\n            modification request. For more information, see <a href=\\\"https://docs.aws.amazon.com/ec2/latest/devguide/ec2-api-idempotency.html\\\">Ensuring idempotency</a>.</p>\",\n                        \"smithy.api#idempotencyToken\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"SseSpecification\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessSseSpecificationRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The options for server side encryption.</p>\"\n                    }\n                },\n                \"NativeApplicationOidcOptions\": {\n                    \"target\": \"com.amazonaws.ec2#CreateVerifiedAccessNativeApplicationOidcOptions\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The OpenID Connect (OIDC) options.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateVerifiedAccessTrustProviderResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VerifiedAccessTrustProvider\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessTrustProvider\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VerifiedAccessTrustProvider\",\n                        \"smithy.api#documentation\": \"<p>Details about the Verified Access trust provider.</p>\",\n                        \"smithy.api#xmlName\": \"verifiedAccessTrustProvider\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateVolume\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateVolumeRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#Volume\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates an EBS volume that can be attached to an instance in the same Availability Zone.</p>\\n         <p>You can create a new empty volume or restore a volume from an EBS snapshot.\\n      Any Amazon Web Services Marketplace product codes from the snapshot are propagated to the volume.</p>\\n         <p>You can create encrypted volumes. Encrypted volumes must be attached to instances that \\n      support Amazon EBS encryption. Volumes that are created from encrypted snapshots are also automatically \\n      encrypted. For more information, see <a href=\\\"https://docs.aws.amazon.com/ebs/latest/userguide/ebs-encryption.html\\\">Amazon EBS encryption</a>\\n      in the <i>Amazon EBS User Guide</i>.</p>\\n         <p>You can tag your volumes during creation. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Tags.html\\\">Tag your Amazon EC2\\n        resources</a> in the <i>Amazon EC2 User Guide</i>.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/ebs/latest/userguide/ebs-creating-volume.html\\\">Create an Amazon EBS volume</a> in the\\n        <i>Amazon EBS User Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To create a new Provisioned IOPS (SSD) volume from a snapshot\",\n                        \"documentation\": \"This example creates a new Provisioned IOPS (SSD) volume with 1000 provisioned IOPS from a snapshot in the Availability Zone ``us-east-1a``.\",\n                        \"input\": {\n                            \"AvailabilityZone\": \"us-east-1a\",\n                            \"Iops\": 1000,\n                            \"VolumeType\": \"io1\",\n                            \"SnapshotId\": \"snap-066877671789bd71b\"\n                        },\n                        \"output\": {\n                            \"AvailabilityZone\": \"us-east-1a\",\n                            \"Attachments\": [],\n                            \"Tags\": [],\n                            \"VolumeType\": \"io1\",\n                            \"VolumeId\": \"vol-1234567890abcdef0\",\n                            \"State\": \"creating\",\n                            \"Iops\": 1000,\n                            \"SnapshotId\": \"snap-066877671789bd71b\",\n                            \"CreateTime\": \"2016-08-29T18:52:32.724Z\",\n                            \"Size\": 500\n                        }\n                    },\n                    {\n                        \"title\": \"To create a new volume\",\n                        \"documentation\": \"This example creates an 80 GiB General Purpose (SSD) volume in the Availability Zone ``us-east-1a``.\",\n                        \"input\": {\n                            \"AvailabilityZone\": \"us-east-1a\",\n                            \"Size\": 80,\n                            \"VolumeType\": \"gp2\"\n                        },\n                        \"output\": {\n                            \"AvailabilityZone\": \"us-east-1a\",\n                            \"Encrypted\": false,\n                            \"VolumeType\": \"gp2\",\n                            \"VolumeId\": \"vol-6b60b7c7\",\n                            \"State\": \"creating\",\n                            \"Iops\": 240,\n                            \"SnapshotId\": \"\",\n                            \"CreateTime\": \"2016-08-29T18:52:32.724Z\",\n                            \"Size\": 80\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#CreateVolumePermission\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"UserId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"UserId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Amazon Web Services account to be added or removed.</p>\",\n                        \"smithy.api#xmlName\": \"userId\"\n                    }\n                },\n                \"Group\": {\n                    \"target\": \"com.amazonaws.ec2#PermissionGroup\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Group\",\n                        \"smithy.api#documentation\": \"<p>The group to be added or removed. The possible value is <code>all</code>.</p>\",\n                        \"smithy.api#xmlName\": \"group\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the user or group to be added or removed from the list of create volume\\n      permissions for a volume.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateVolumePermissionList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#CreateVolumePermission\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#CreateVolumePermissionModifications\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Add\": {\n                    \"target\": \"com.amazonaws.ec2#CreateVolumePermissionList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Adds the specified Amazon Web Services account ID or group to the list.</p>\"\n                    }\n                },\n                \"Remove\": {\n                    \"target\": \"com.amazonaws.ec2#CreateVolumePermissionList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Removes the specified Amazon Web Services account ID or group from the list.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes modifications to the list of create volume permissions for a volume.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateVolumeRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AvailabilityZone\": {\n                    \"target\": \"com.amazonaws.ec2#AvailabilityZoneName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the Availability Zone in which to create the volume. For example, <code>us-east-1a</code>.</p>\\n         <p>Either <code>AvailabilityZone</code> or <code>AvailabilityZoneId</code> must be specified,\\n      but not both.</p>\"\n                    }\n                },\n                \"AvailabilityZoneId\": {\n                    \"target\": \"com.amazonaws.ec2#AvailabilityZoneId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the Availability Zone in which to create the volume. For example, <code>use1-az1</code>.</p>\\n         <p>Either <code>AvailabilityZone</code> or <code>AvailabilityZoneId</code> must be specified,\\n      but not both.</p>\"\n                    }\n                },\n                \"Encrypted\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Encrypted\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether the volume should be encrypted. \\n      The effect of setting the encryption state to <code>true</code> depends on \\nthe volume origin (new or from a snapshot), starting encryption state, ownership, and whether encryption by default is enabled. \\n      For more information, see <a href=\\\"https://docs.aws.amazon.com/ebs/latest/userguide/work-with-ebs-encr.html#encryption-by-default\\\">Encryption by default</a>\\n      in the <i>Amazon EBS User Guide</i>.</p>\\n         <p>Encrypted Amazon EBS volumes must be attached to instances that support Amazon EBS encryption. \\n      For more information, see <a href=\\\"https://docs.aws.amazon.com/ebs/latest/userguide/ebs-encryption-requirements.html#ebs-encryption_supported_instances\\\">Supported\\n        instance types</a>.</p>\",\n                        \"smithy.api#xmlName\": \"encrypted\"\n                    }\n                },\n                \"Iops\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of I/O operations per second (IOPS). For <code>gp3</code>, <code>io1</code>, and <code>io2</code> volumes, this represents \\n      the number of IOPS that are provisioned for the volume. For <code>gp2</code> volumes, this represents the baseline \\n      performance of the volume and the rate at which the volume accumulates I/O credits for bursting.</p>\\n         <p>The following are the supported values for each volume type:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>gp3</code>: 3,000 - 80,000 IOPS</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>io1</code>: 100 - 64,000 IOPS</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>io2</code>: 100 - 256,000 IOPS</p>\\n            </li>\\n         </ul>\\n         <p>For <code>io2</code> volumes, you can achieve up to 256,000 IOPS on \\n<a href=\\\"https://docs.aws.amazon.com/ec2/latest/instancetypes/ec2-nitro-instances.html\\\">instances \\nbuilt on the Nitro System</a>. On other instances, you can achieve performance up to 32,000 IOPS.</p>\\n         <p>This parameter is required for <code>io1</code> and <code>io2</code> volumes. The default for <code>gp3</code> volumes is 3,000 IOPS.\\n      This parameter is not supported for <code>gp2</code>, <code>st1</code>, <code>sc1</code>, or <code>standard</code> volumes.</p>\"\n                    }\n                },\n                \"KmsKeyId\": {\n                    \"target\": \"com.amazonaws.ec2#KmsKeyId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The identifier of the KMS key to use for Amazon EBS encryption.\\n      If this parameter is not specified, your KMS key for Amazon EBS is used. If <code>KmsKeyId</code> is\\n      specified, the encrypted state must be <code>true</code>.</p>\\n         <p>You can specify the KMS key using any of the following:</p>\\n         <ul>\\n            <li>\\n               <p>Key ID. For example, 1234abcd-12ab-34cd-56ef-1234567890ab.</p>\\n            </li>\\n            <li>\\n               <p>Key alias. For example, alias/ExampleAlias.</p>\\n            </li>\\n            <li>\\n               <p>Key ARN. For example, arn:aws:kms:us-east-1:012345678910:key/1234abcd-12ab-34cd-56ef-1234567890ab.</p>\\n            </li>\\n            <li>\\n               <p>Alias ARN. For example, arn:aws:kms:us-east-1:012345678910:alias/ExampleAlias.</p>\\n            </li>\\n         </ul>\\n         <p>Amazon Web Services authenticates the KMS key asynchronously. Therefore, if you specify an ID, alias, or ARN that is not valid, \\n      the action can appear to complete, but eventually fails.</p>\"\n                    }\n                },\n                \"OutpostArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the Outpost on which to create the volume.</p>\\n         <p>If you intend to use a volume with an instance running on an outpost, then you must \\n         create the volume on the same outpost as the instance. You can't use a volume created \\n         in an Amazon Web Services Region with an instance on an Amazon Web Services outpost, or the other way around.</p>\"\n                    }\n                },\n                \"Size\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The size of the volume, in GiBs. You must specify either a snapshot ID or a volume size.\\n      If you specify a snapshot, the default is the snapshot size. You can specify a volume \\n      size that is equal to or larger than the snapshot size.</p>\\n         <p>The following are the supported volumes sizes for each volume type:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>gp2</code>: 1 - 16,384 GiB</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>gp3</code>: 1 - 65,536 GiB</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>io1</code>: 4 - 16,384 GiB</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>io2</code>: 4 - 65,536 GiB</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>st1</code> and <code>sc1</code>: 125 - 16,384 GiB</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>standard</code>: 1 - 1024 GiB</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"SnapshotId\": {\n                    \"target\": \"com.amazonaws.ec2#SnapshotId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The snapshot from which to create the volume. You must specify either a snapshot ID or a volume size.</p>\"\n                    }\n                },\n                \"VolumeType\": {\n                    \"target\": \"com.amazonaws.ec2#VolumeType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The volume type. This parameter can be one of the following values:</p>\\n         <ul>\\n            <li>\\n               <p>General Purpose SSD: <code>gp2</code> | <code>gp3</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Provisioned IOPS SSD: <code>io1</code> | <code>io2</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Throughput Optimized HDD: <code>st1</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Cold HDD: <code>sc1</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Magnetic: <code>standard</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>Throughput Optimized HDD (<code>st1</code>) and Cold HDD (<code>sc1</code>) volumes can't be used as boot volumes.</p>\\n         </important>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/ebs/latest/userguide/ebs-volume-types.html\\\">Amazon EBS volume types</a> in the\\n      <i>Amazon EBS User Guide</i>.</p>\\n         <p>Default: <code>gp2</code>\\n         </p>\"\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags to apply to the volume during creation.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                },\n                \"MultiAttachEnabled\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether to enable Amazon EBS Multi-Attach. If you enable Multi-Attach, you can attach the \\n      volume to up to 16 <a href=\\\"https://docs.aws.amazon.com/ec2/latest/instancetypes/ec2-nitro-instances.html\\\">Instances built on the Nitro System</a> in the same Availability Zone. This parameter is \\n    \\tsupported with <code>io1</code> and <code>io2</code> volumes only. For more information, \\n    \\tsee <a href=\\\"https://docs.aws.amazon.com/ebs/latest/userguide/ebs-volumes-multi.html\\\">\\n    \\t\\tAmazon EBS Multi-Attach</a> in the <i>Amazon EBS User Guide</i>.</p>\"\n                    }\n                },\n                \"Throughput\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The throughput to provision for a volume, with a maximum of 2,000 MiB/s.</p>\\n         <p>This parameter is valid only for <code>gp3</code> volumes.</p>\\n         <p>Valid Range: Minimum value of 125. Maximum value of 2,000.</p>\"\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Unique, case-sensitive identifier that you provide to ensure the idempotency \\n      of the request. For more information, see <a href=\\\"https://docs.aws.amazon.com/ec2/latest/devguide/ec2-api-idempotency.html\\\">Ensure \\n        Idempotency</a>.</p>\",\n                        \"smithy.api#idempotencyToken\": {}\n                    }\n                },\n                \"VolumeInitializationRate\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the Amazon EBS Provisioned Rate for Volume Initialization (volume initialization rate), in MiB/s, at which to download \\n      the snapshot blocks from Amazon S3 to the volume. This is also known as <i>volume \\n        initialization</i>. Specifying a volume initialization rate ensures that the volume is \\n      initialized at a predictable and consistent rate after creation.</p>\\n         <p>This parameter is supported only for volumes created from snapshots. Omit this parameter \\n      if:</p>\\n         <ul>\\n            <li>\\n               <p>You want to create the volume using fast snapshot restore. You must specify a snapshot \\n          that is enabled for fast snapshot restore. In this case, the volume is fully initialized at \\n          creation.</p>\\n               <note>\\n                  <p>If you specify a snapshot that is enabled for fast snapshot restore and a volume initialization rate, \\n            the volume will be initialized at the specified rate instead of fast snapshot restore.</p>\\n               </note>\\n            </li>\\n            <li>\\n               <p>You want to create a volume that is initialized at the default rate.</p>\\n            </li>\\n         </ul>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/ebs/latest/userguide/initalize-volume.html\\\">\\n      Initialize Amazon EBS volumes</a> in the <i>Amazon EC2 User Guide</i>.</p>\\n         <p>Valid range: 100 - 300 MiB/s</p>\"\n                    }\n                },\n                \"Operator\": {\n                    \"target\": \"com.amazonaws.ec2#OperatorRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Reserved for internal use.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateVpc\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateVpcRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreateVpcResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates a VPC with the specified CIDR blocks. For more information, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/userguide/vpc-ip-addressing.html\\\">IP addressing for your VPCs and subnets</a> in the \\n        <i>Amazon VPC User Guide</i>.</p>\\n         <p>You can optionally request an IPv6 CIDR block for the VPC. You can request an\\n            Amazon-provided IPv6 CIDR block from Amazon's pool of IPv6 addresses or an IPv6 CIDR\\n            block from an IPv6 address pool that you provisioned through bring your own IP addresses\\n            (<a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-byoip.html\\\">BYOIP</a>).</p>\\n         <p>By default, each instance that you launch in the VPC has the default DHCP options, which\\n\\t\\t\\tinclude only a default DNS server that we provide (AmazonProvidedDNS). For more\\n\\t\\t\\tinformation, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/userguide/VPC_DHCP_Options.html\\\">DHCP option sets</a> in the <i>Amazon VPC User Guide</i>.</p>\\n         <p>You can specify the instance tenancy value for the VPC when you create it. You can't change\\n          this value for the VPC after you create it. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/dedicated-instance.html\\\">Dedicated Instances</a> in the\\n          <i>Amazon EC2 User Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To create a VPC\",\n                        \"documentation\": \"This example creates a VPC with the specified CIDR block.\",\n                        \"input\": {\n                            \"CidrBlock\": \"10.0.0.0/16\"\n                        },\n                        \"output\": {\n                            \"Vpc\": {\n                                \"InstanceTenancy\": \"default\",\n                                \"State\": \"pending\",\n                                \"VpcId\": \"vpc-a01106c2\",\n                                \"CidrBlock\": \"10.0.0.0/16\",\n                                \"DhcpOptionsId\": \"dopt-7a8b9c2d\"\n                            }\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#CreateVpcBlockPublicAccessExclusion\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateVpcBlockPublicAccessExclusionRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreateVpcBlockPublicAccessExclusionResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Create a VPC Block Public Access (BPA) exclusion. A VPC BPA exclusion is a mode that can be applied to a single VPC or subnet that exempts it from the account’s BPA mode and will allow bidirectional or egress-only access. You can create BPA exclusions for VPCs and subnets even when BPA is not enabled on the account to ensure that there is no traffic disruption to the exclusions when VPC BPA is turned on. To learn more about VPC BPA, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/userguide/security-vpc-bpa.html\\\">Block public access to VPCs and subnets</a> in the <i>Amazon VPC User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateVpcBlockPublicAccessExclusionRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"SubnetId\": {\n                    \"target\": \"com.amazonaws.ec2#SubnetId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A subnet ID.</p>\"\n                    }\n                },\n                \"VpcId\": {\n                    \"target\": \"com.amazonaws.ec2#VpcId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A VPC ID.</p>\"\n                    }\n                },\n                \"InternetGatewayExclusionMode\": {\n                    \"target\": \"com.amazonaws.ec2#InternetGatewayExclusionMode\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The exclusion mode for internet gateway traffic.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>allow-bidirectional</code>: Allow all internet traffic to and from the excluded VPCs and subnets.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>allow-egress</code>: Allow outbound internet traffic from the excluded VPCs and subnets. Block inbound internet traffic to the excluded VPCs and subnets. Only applies when VPC Block Public Access is set to Bidirectional.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>\\n            <code>tag</code> - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\\n    For example, to find all resources that have a tag with the key <code>Owner</code> and the value <code>TeamA</code>, specify <code>tag:Owner</code> for the filter name and <code>TeamA</code> for the filter value.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateVpcBlockPublicAccessExclusionResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VpcBlockPublicAccessExclusion\": {\n                    \"target\": \"com.amazonaws.ec2#VpcBlockPublicAccessExclusion\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcBlockPublicAccessExclusion\",\n                        \"smithy.api#documentation\": \"<p>Details about an exclusion.</p>\",\n                        \"smithy.api#xmlName\": \"vpcBlockPublicAccessExclusion\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateVpcEndpoint\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateVpcEndpointRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreateVpcEndpointResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates a VPC endpoint. A VPC endpoint provides a private connection between the\\n            specified VPC and the specified endpoint service. You can use an endpoint service\\n            provided by Amazon Web Services, an Amazon Web Services Marketplace Partner, or another\\n            Amazon Web Services account. For more information, see the <a href=\\\"https://docs.aws.amazon.com/vpc/latest/privatelink/\\\">Amazon Web Services PrivateLink User Guide</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateVpcEndpointConnectionNotification\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateVpcEndpointConnectionNotificationRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreateVpcEndpointConnectionNotificationResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates a connection notification for a specified VPC endpoint or VPC endpoint\\n            service. A connection notification notifies you of specific endpoint events. You must\\n            create an SNS topic to receive notifications. For more information, see <a href=\\\"https://docs.aws.amazon.com/sns/latest/dg/CreateTopic.html\\\">Creating an Amazon SNS topic</a> in\\n            the <i>Amazon SNS Developer Guide</i>.</p>\\n         <p>You can create a connection notification for interface endpoints only.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateVpcEndpointConnectionNotificationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"ServiceId\": {\n                    \"target\": \"com.amazonaws.ec2#VpcEndpointServiceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the endpoint service.</p>\"\n                    }\n                },\n                \"VpcEndpointId\": {\n                    \"target\": \"com.amazonaws.ec2#VpcEndpointId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the endpoint.</p>\"\n                    }\n                },\n                \"ConnectionNotificationArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ARN of the SNS topic for the notifications.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ConnectionEvents\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The endpoint events for which to receive notifications. Valid values are\\n                <code>Accept</code>, <code>Connect</code>, <code>Delete</code>, and\\n                <code>Reject</code>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Unique, case-sensitive identifier that you provide to ensure the idempotency of the\\n            request. For more information, see <a href=\\\"https://docs.aws.amazon.com/ec2/latest/devguide/ec2-api-idempotency.html\\\">How to ensure\\n                idempotency</a>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateVpcEndpointConnectionNotificationResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConnectionNotification\": {\n                    \"target\": \"com.amazonaws.ec2#ConnectionNotification\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ConnectionNotification\",\n                        \"smithy.api#documentation\": \"<p>Information about the notification.</p>\",\n                        \"smithy.api#xmlName\": \"connectionNotification\"\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ClientToken\",\n                        \"smithy.api#documentation\": \"<p>Unique, case-sensitive identifier that you provide to ensure the idempotency of the\\n            request.</p>\",\n                        \"smithy.api#xmlName\": \"clientToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateVpcEndpointRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"VpcEndpointType\": {\n                    \"target\": \"com.amazonaws.ec2#VpcEndpointType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of endpoint.</p>\\n         <p>Default: Gateway</p>\"\n                    }\n                },\n                \"VpcId\": {\n                    \"target\": \"com.amazonaws.ec2#VpcId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the VPC.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ServiceName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the endpoint service.</p>\"\n                    }\n                },\n                \"PolicyDocument\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>(Interface and gateway endpoints) A policy to attach to the endpoint that controls access to the\\n            service. The policy must be in valid JSON format. If this parameter is not specified, we\\n            attach a default policy that allows full access to the service.</p>\"\n                    }\n                },\n                \"RouteTableIds\": {\n                    \"target\": \"com.amazonaws.ec2#VpcEndpointRouteTableIdList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>(Gateway endpoint) The route table IDs.</p>\",\n                        \"smithy.api#xmlName\": \"RouteTableId\"\n                    }\n                },\n                \"SubnetIds\": {\n                    \"target\": \"com.amazonaws.ec2#VpcEndpointSubnetIdList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>(Interface and Gateway Load Balancer endpoints) The IDs of the subnets in which to create endpoint\\n            network interfaces. For a Gateway Load Balancer endpoint, you can specify only one subnet.</p>\",\n                        \"smithy.api#xmlName\": \"SubnetId\"\n                    }\n                },\n                \"SecurityGroupIds\": {\n                    \"target\": \"com.amazonaws.ec2#VpcEndpointSecurityGroupIdList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>(Interface endpoint) The IDs of the security groups to associate with the\\n            endpoint network interfaces. If this parameter is not specified, we use the default \\n            security group for the VPC.</p>\",\n                        \"smithy.api#xmlName\": \"SecurityGroupId\"\n                    }\n                },\n                \"IpAddressType\": {\n                    \"target\": \"com.amazonaws.ec2#IpAddressType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IP address type for the endpoint.</p>\"\n                    }\n                },\n                \"DnsOptions\": {\n                    \"target\": \"com.amazonaws.ec2#DnsOptionsSpecification\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The DNS options for the endpoint.</p>\"\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Unique, case-sensitive identifier that you provide to ensure the idempotency of the\\n            request. For more information, see <a href=\\\"https://docs.aws.amazon.com/ec2/latest/devguide/ec2-api-idempotency.html\\\">How to ensure\\n                idempotency</a>.</p>\"\n                    }\n                },\n                \"PrivateDnsEnabled\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>(Interface endpoint) Indicates whether to associate a private hosted zone with the\\n            specified VPC. The private hosted zone contains a record set for the default public DNS\\n            name for the service for the Region (for example,\\n                <code>kinesis.us-east-1.amazonaws.com</code>), which resolves to the private IP\\n            addresses of the endpoint network interfaces in the VPC. This enables you to make\\n            requests to the default public DNS name for the service instead of the public DNS names\\n            that are automatically generated by the VPC endpoint service.</p>\\n         <p>To use a private hosted zone, you must set the following VPC attributes to\\n            <code>true</code>: <code>enableDnsHostnames</code> and\\n            <code>enableDnsSupport</code>. Use <a>ModifyVpcAttribute</a> to set the VPC\\n            attributes.</p>\"\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags to associate with the endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                },\n                \"SubnetConfigurations\": {\n                    \"target\": \"com.amazonaws.ec2#SubnetConfigurationsList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The subnet configurations for the endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"SubnetConfiguration\"\n                    }\n                },\n                \"ServiceNetworkArn\": {\n                    \"target\": \"com.amazonaws.ec2#ServiceNetworkArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of a service network that will be associated with the VPC\\n         endpoint of type service-network.</p>\"\n                    }\n                },\n                \"ResourceConfigurationArn\": {\n                    \"target\": \"com.amazonaws.ec2#ResourceConfigurationArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of a resource configuration that will be associated with\\n         the VPC endpoint of type resource.</p>\"\n                    }\n                },\n                \"ServiceRegion\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Region where the service is hosted. The default is the current Region.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateVpcEndpointResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VpcEndpoint\": {\n                    \"target\": \"com.amazonaws.ec2#VpcEndpoint\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcEndpoint\",\n                        \"smithy.api#documentation\": \"<p>Information about the endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"vpcEndpoint\"\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ClientToken\",\n                        \"smithy.api#documentation\": \"<p>Unique, case-sensitive identifier that you provide to ensure the idempotency of the\\n            request.</p>\",\n                        \"smithy.api#xmlName\": \"clientToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateVpcEndpointServiceConfiguration\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateVpcEndpointServiceConfigurationRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreateVpcEndpointServiceConfigurationResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates a VPC endpoint service to which service consumers (Amazon Web Services accounts,\\n            users, and IAM roles) can connect.</p>\\n         <p>Before you create an endpoint service, you must create one of the following for your service:</p>\\n         <ul>\\n            <li>\\n               <p>A <a href=\\\"https://docs.aws.amazon.com/elasticloadbalancing/latest/network/\\\">Network Load Balancer</a>. \\n                    Service consumers connect to your service using an interface endpoint.</p>\\n            </li>\\n            <li>\\n               <p>A <a href=\\\"https://docs.aws.amazon.com/elasticloadbalancing/latest/gateway/\\\">Gateway Load Balancer</a>. \\n                    Service consumers connect to your service using a Gateway Load Balancer endpoint.</p>\\n            </li>\\n         </ul>\\n         <p>If you set the private DNS name, you must prove that you own the private DNS domain\\n            name.</p>\\n         <p>For more information, see the <a href=\\\"https://docs.aws.amazon.com/vpc/latest/privatelink/\\\">Amazon Web Services PrivateLink \\n\\t        Guide</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateVpcEndpointServiceConfigurationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"AcceptanceRequired\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether requests from service consumers to create an endpoint to your service must\\n            be accepted manually.</p>\"\n                    }\n                },\n                \"PrivateDnsName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>(Interface endpoint configuration) The private DNS name to assign to the VPC endpoint service.</p>\"\n                    }\n                },\n                \"NetworkLoadBalancerArns\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Names (ARNs) of the Network Load Balancers.</p>\",\n                        \"smithy.api#xmlName\": \"NetworkLoadBalancerArn\"\n                    }\n                },\n                \"GatewayLoadBalancerArns\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Names (ARNs) of the Gateway Load Balancers.</p>\",\n                        \"smithy.api#xmlName\": \"GatewayLoadBalancerArn\"\n                    }\n                },\n                \"SupportedIpAddressTypes\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The supported IP address types. The possible values are <code>ipv4</code> and <code>ipv6</code>.</p>\",\n                        \"smithy.api#xmlName\": \"SupportedIpAddressType\"\n                    }\n                },\n                \"SupportedRegions\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Regions from which service consumers can access the service.</p>\",\n                        \"smithy.api#xmlName\": \"SupportedRegion\"\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Unique, case-sensitive identifier that you provide to ensure the idempotency of the request.\\n            For more information, see <a href=\\\"https://docs.aws.amazon.com/ec2/latest/devguide/ec2-api-idempotency.html\\\">How to ensure\\n                idempotency</a>.</p>\"\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags to associate with the service.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateVpcEndpointServiceConfigurationResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ServiceConfiguration\": {\n                    \"target\": \"com.amazonaws.ec2#ServiceConfiguration\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ServiceConfiguration\",\n                        \"smithy.api#documentation\": \"<p>Information about the service configuration.</p>\",\n                        \"smithy.api#xmlName\": \"serviceConfiguration\"\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ClientToken\",\n                        \"smithy.api#documentation\": \"<p>Unique, case-sensitive identifier that you provide to ensure the idempotency of the\\n            request.</p>\",\n                        \"smithy.api#xmlName\": \"clientToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateVpcPeeringConnection\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateVpcPeeringConnectionRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreateVpcPeeringConnectionResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Requests a VPC peering connection between two VPCs: a requester VPC that you own and\\n\\t\\t  an accepter VPC with which to create the connection. The accepter VPC can belong to\\n\\t\\t  another Amazon Web Services account and can be in a different Region to the requester VPC. \\n          The requester VPC and accepter VPC cannot have overlapping CIDR blocks.</p>\\n         <note>\\n            <p>Limitations and rules apply to a VPC peering connection. For more information, see \\n          the <a href=\\\"https://docs.aws.amazon.com/vpc/latest/peering/vpc-peering-basics.html#vpc-peering-limitations\\\">VPC peering limitations</a> in the <i>VPC Peering Guide</i>.</p>\\n         </note>\\n         <p>The owner of the accepter VPC must accept the peering request to activate the peering\\n            connection. The VPC peering connection request expires after 7 days, after which it\\n            cannot be accepted or rejected.</p>\\n         <p>If you create a VPC peering connection request between VPCs with overlapping CIDR\\n            blocks, the VPC peering connection has a status of <code>failed</code>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateVpcPeeringConnectionRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PeerRegion\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Region code for the accepter VPC, if the accepter VPC is located in a Region\\n            other than the Region in which you make the request.</p>\\n         <p>Default: The Region in which you make the request.</p>\"\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags to assign to the peering connection.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"VpcId\": {\n                    \"target\": \"com.amazonaws.ec2#VpcId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcId\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the requester VPC. You must specify this parameter in the\\n\\t\\t\\trequest.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"vpcId\"\n                    }\n                },\n                \"PeerVpcId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PeerVpcId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the VPC with which you are creating the VPC peering connection. You must\\n\\t\\t\\tspecify this parameter in the request.</p>\",\n                        \"smithy.api#xmlName\": \"peerVpcId\"\n                    }\n                },\n                \"PeerOwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PeerOwnerId\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID of the owner of the accepter VPC.</p>\\n         <p>Default: Your Amazon Web Services account ID</p>\",\n                        \"smithy.api#xmlName\": \"peerOwnerId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateVpcPeeringConnectionResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VpcPeeringConnection\": {\n                    \"target\": \"com.amazonaws.ec2#VpcPeeringConnection\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcPeeringConnection\",\n                        \"smithy.api#documentation\": \"<p>Information about the VPC peering connection.</p>\",\n                        \"smithy.api#xmlName\": \"vpcPeeringConnection\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateVpcRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CidrBlock\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IPv4 network range for the VPC, in CIDR notation. For example,\\n\\t\\t        <code>10.0.0.0/16</code>. We modify the specified CIDR block to its canonical form; for example, if you specify <code>100.68.0.18/18</code>, we modify it to <code>100.68.0.0/18</code>.</p>\"\n                    }\n                },\n                \"Ipv6Pool\": {\n                    \"target\": \"com.amazonaws.ec2#Ipv6PoolEc2Id\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of an IPv6 address pool from which to allocate the IPv6 CIDR block.</p>\"\n                    }\n                },\n                \"Ipv6CidrBlock\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IPv6 CIDR block from the IPv6 address pool. You must also specify <code>Ipv6Pool</code> in the request.</p>\\n         <p>To let Amazon choose the IPv6 CIDR block for you, omit this parameter.</p>\"\n                    }\n                },\n                \"Ipv4IpamPoolId\": {\n                    \"target\": \"com.amazonaws.ec2#IpamPoolId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of an IPv4 IPAM pool you want to use for allocating this VPC's CIDR. For more information, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/ipam/what-is-it-ipam.html\\\">What is IPAM?</a> in the <i>Amazon VPC IPAM User Guide</i>.\\n         \\n      </p>\"\n                    }\n                },\n                \"Ipv4NetmaskLength\": {\n                    \"target\": \"com.amazonaws.ec2#NetmaskLength\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The netmask length of the IPv4 CIDR you want to allocate to this VPC from an Amazon VPC IP Address Manager (IPAM) pool. For more information about IPAM, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/ipam/what-is-it-ipam.html\\\">What is IPAM?</a> in the <i>Amazon VPC IPAM User Guide</i>.</p>\"\n                    }\n                },\n                \"Ipv6IpamPoolId\": {\n                    \"target\": \"com.amazonaws.ec2#IpamPoolId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of an IPv6 IPAM pool which will be used to allocate this VPC an IPv6 CIDR. IPAM is a VPC feature that you can use to automate your IP address management workflows including assigning, tracking, troubleshooting, and auditing IP addresses across Amazon Web Services Regions and accounts throughout your Amazon Web Services Organization. For more information, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/ipam/what-is-it-ipam.html\\\">What is IPAM?</a> in the <i>Amazon VPC IPAM User Guide</i>.</p>\"\n                    }\n                },\n                \"Ipv6NetmaskLength\": {\n                    \"target\": \"com.amazonaws.ec2#NetmaskLength\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The netmask length of the IPv6 CIDR you want to allocate to this VPC from an Amazon VPC IP Address Manager (IPAM) pool. For more information about IPAM, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/ipam/what-is-it-ipam.html\\\">What is IPAM?</a> in the <i>Amazon VPC IPAM User Guide</i>.</p>\"\n                    }\n                },\n                \"Ipv6CidrBlockNetworkBorderGroup\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the location from which we advertise the IPV6 CIDR block. Use this parameter to limit the address to this location.</p>\\n         <p> You must set <code>AmazonProvidedIpv6CidrBlock</code> to <code>true</code> to use this parameter.</p>\"\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags to assign to the VPC.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"InstanceTenancy\": {\n                    \"target\": \"com.amazonaws.ec2#Tenancy\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceTenancy\",\n                        \"smithy.api#documentation\": \"<p>The tenancy options for instances launched into the VPC. For <code>default</code>, instances\\n      are launched with shared tenancy by default. You can launch instances with any tenancy into a\\n      shared tenancy VPC. For <code>dedicated</code>, instances are launched as dedicated tenancy\\n      instances by default. You can only launch instances with a tenancy of <code>dedicated</code>\\n      or <code>host</code> into a dedicated tenancy VPC. </p>\\n         <p>\\n            <b>Important:</b> The <code>host</code> value cannot be used with this parameter. Use the <code>default</code> or <code>dedicated</code> values only.</p>\\n         <p>Default: <code>default</code>\\n         </p>\",\n                        \"smithy.api#xmlName\": \"instanceTenancy\"\n                    }\n                },\n                \"AmazonProvidedIpv6CidrBlock\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AmazonProvidedIpv6CidrBlock\",\n                        \"smithy.api#documentation\": \"<p>Requests an Amazon-provided IPv6 CIDR block with a /56 prefix length for the VPC.\\n            You cannot specify the range of IP addresses, or the size of the CIDR block.</p>\",\n                        \"smithy.api#xmlName\": \"amazonProvidedIpv6CidrBlock\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateVpcResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Vpc\": {\n                    \"target\": \"com.amazonaws.ec2#Vpc\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Vpc\",\n                        \"smithy.api#documentation\": \"<p>Information about the VPC.</p>\",\n                        \"smithy.api#xmlName\": \"vpc\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateVpnConnection\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateVpnConnectionRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreateVpnConnectionResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates a VPN connection between an existing virtual private gateway or transit\\n            gateway and a customer gateway. The supported connection type is\\n            <code>ipsec.1</code>.</p>\\n         <p>The response includes information that you need to give to your network administrator\\n            to configure your customer gateway.</p>\\n         <important>\\n            <p>We strongly recommend that you use HTTPS when calling this operation because the\\n                response contains sensitive cryptographic information for configuring your customer\\n                gateway device.</p>\\n         </important>\\n         <p>If you decide to shut down your VPN connection for any reason and later create a new\\n            VPN connection, you must reconfigure your customer gateway with the new information\\n            returned from this call.</p>\\n         <p>This is an idempotent operation. If you perform the operation more than once, Amazon\\n            EC2 doesn't return an error.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/vpn/latest/s2svpn/VPC_VPN.html\\\">Amazon Web Services Site-to-Site VPN</a> in the <i>Amazon Web Services Site-to-Site VPN\\n                User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateVpnConnectionRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CustomerGatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#CustomerGatewayId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the customer gateway.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Type\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The type of VPN connection (<code>ipsec.1</code>).</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"VpnGatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#VpnGatewayId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the virtual private gateway. If you specify a virtual private gateway, you\\n            cannot specify a transit gateway.</p>\"\n                    }\n                },\n                \"TransitGatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the transit gateway. If you specify a transit gateway, you cannot specify a virtual private\\n            gateway.</p>\"\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags to apply to the VPN connection.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                },\n                \"PreSharedKeyStorage\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the storage mode for the pre-shared key (PSK). Valid values are <code>Standard</code>\\\" (stored in the Site-to-Site VPN service) or <code>SecretsManager</code> (stored in Amazon Web Services Secrets Manager).</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually\\n            making the request, and provides an error response. If you have the required\\n            permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is\\n                <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"Options\": {\n                    \"target\": \"com.amazonaws.ec2#VpnConnectionOptionsSpecification\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Options\",\n                        \"smithy.api#documentation\": \"<p>The options for the VPN connection.</p>\",\n                        \"smithy.api#xmlName\": \"options\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the parameters for CreateVpnConnection.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateVpnConnectionResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VpnConnection\": {\n                    \"target\": \"com.amazonaws.ec2#VpnConnection\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpnConnection\",\n                        \"smithy.api#documentation\": \"<p>Information about the VPN connection.</p>\",\n                        \"smithy.api#xmlName\": \"vpnConnection\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the output of CreateVpnConnection.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateVpnConnectionRoute\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateVpnConnectionRouteRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates a static route associated with a VPN connection between an existing virtual\\n            private gateway and a VPN customer gateway. The static route allows traffic to be routed\\n            from the virtual private gateway to the VPN customer gateway.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/vpn/latest/s2svpn/VPC_VPN.html\\\">Amazon Web Services Site-to-Site VPN</a> in the <i>Amazon Web Services Site-to-Site VPN\\n                User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateVpnConnectionRouteRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DestinationCidrBlock\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The CIDR block associated with the local subnet of the customer network.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"VpnConnectionId\": {\n                    \"target\": \"com.amazonaws.ec2#VpnConnectionId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the VPN connection.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the parameters for CreateVpnConnectionRoute.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateVpnGateway\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#CreateVpnGatewayRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#CreateVpnGatewayResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates a virtual private gateway. A virtual private gateway is the endpoint on the\\n            VPC side of your VPN connection. You can create a virtual private gateway before\\n            creating the VPC itself.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/vpn/latest/s2svpn/VPC_VPN.html\\\">Amazon Web Services Site-to-Site VPN</a> in the <i>Amazon Web Services Site-to-Site VPN\\n                User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreateVpnGatewayRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AvailabilityZone\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Availability Zone for the virtual private gateway.</p>\"\n                    }\n                },\n                \"Type\": {\n                    \"target\": \"com.amazonaws.ec2#GatewayType\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The type of VPN connection this virtual private gateway supports.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags to apply to the virtual private gateway.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                },\n                \"AmazonSideAsn\": {\n                    \"target\": \"com.amazonaws.ec2#Long\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A private Autonomous System Number (ASN) for the Amazon side of a BGP session. If\\n            you're using a 16-bit ASN, it must be in the 64512 to 65534 range. If you're using a\\n            32-bit ASN, it must be in the 4200000000 to 4294967294 range.</p>\\n         <p>Default: 64512</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually\\n            making the request, and provides an error response. If you have the required\\n            permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is\\n                <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the parameters for CreateVpnGateway.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreateVpnGatewayResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VpnGateway\": {\n                    \"target\": \"com.amazonaws.ec2#VpnGateway\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpnGateway\",\n                        \"smithy.api#documentation\": \"<p>Information about the virtual private gateway.</p>\",\n                        \"smithy.api#xmlName\": \"vpnGateway\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the output of CreateVpnGateway.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#CreationDateCondition\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"MaximumDaysSinceCreated\": {\n                    \"target\": \"com.amazonaws.ec2#MaximumDaysSinceCreatedValue\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MaximumDaysSinceCreated\",\n                        \"smithy.api#documentation\": \"<p>The maximum number of days that have elapsed since the image was created. For example, a\\n      value of <code>300</code> allows images that were created within the last 300 days.</p>\",\n                        \"smithy.api#xmlName\": \"maximumDaysSinceCreated\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The maximum age for allowed images.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreationDateConditionRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"MaximumDaysSinceCreated\": {\n                    \"target\": \"com.amazonaws.ec2#MaximumDaysSinceCreatedValue\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of days that have elapsed since the image was created. For example, a\\n      value of <code>300</code> allows images that were created within the last 300 days.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The maximum age for allowed images.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreditSpecification\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CpuCredits\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CpuCredits\",\n                        \"smithy.api#documentation\": \"<p>The credit option for CPU usage of a T instance.</p>\\n         <p>Valid values: <code>standard</code> | <code>unlimited</code>\\n         </p>\",\n                        \"smithy.api#xmlName\": \"cpuCredits\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the credit option for CPU usage of a T instance.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CreditSpecificationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CpuCredits\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The credit option for CPU usage of a T instance.</p>\\n         <p>Valid values: <code>standard</code> | <code>unlimited</code>\\n         </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The credit option for CPU usage of a T instance.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CurrencyCodeValues\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"USD\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"USD\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#CurrentGenerationFlag\": {\n            \"type\": \"boolean\"\n        },\n        \"com.amazonaws.ec2#CustomerGateway\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CertificateArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CertificateArn\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) for the customer gateway certificate.</p>\",\n                        \"smithy.api#xmlName\": \"certificateArn\"\n                    }\n                },\n                \"DeviceName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DeviceName\",\n                        \"smithy.api#documentation\": \"<p>The name of customer gateway device.</p>\",\n                        \"smithy.api#xmlName\": \"deviceName\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>Any tags assigned to the customer gateway.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                },\n                \"BgpAsnExtended\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"BgpAsnExtended\",\n                        \"smithy.api#documentation\": \"<p>The customer gateway device's Border Gateway Protocol (BGP) Autonomous System Number\\n            (ASN).</p>\\n         <p>Valid values: <code>2,147,483,648</code> to <code>4,294,967,295</code>\\n         </p>\",\n                        \"smithy.api#xmlName\": \"bgpAsnExtended\"\n                    }\n                },\n                \"CustomerGatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CustomerGatewayId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the customer gateway.</p>\",\n                        \"smithy.api#xmlName\": \"customerGatewayId\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The current state of the customer gateway (<code>pending | available | deleting |\\n                deleted</code>).</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                },\n                \"Type\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Type\",\n                        \"smithy.api#documentation\": \"<p>The type of VPN connection the customer gateway supports\\n            (<code>ipsec.1</code>).</p>\",\n                        \"smithy.api#xmlName\": \"type\"\n                    }\n                },\n                \"IpAddress\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpAddress\",\n                        \"smithy.api#documentation\": \"<p>\\n            The IP address for the customer gateway device's outside interface. The address must be static. If <code>OutsideIpAddressType</code> in your VPN connection options is set to <code>PrivateIpv4</code>, you can use an RFC6598 or RFC1918 private IPv4 address. If \\n            <code>OutsideIpAddressType</code> is set to <code>PublicIpv4</code>, you can use a public IPv4 address. If <code>OutsideIpAddressType</code> is set to <code>Ipv6</code>, you can use a public IPv6 address.\\n        </p>\",\n                        \"smithy.api#xmlName\": \"ipAddress\"\n                    }\n                },\n                \"BgpAsn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"BgpAsn\",\n                        \"smithy.api#documentation\": \"<p>The customer gateway device's Border Gateway Protocol (BGP) Autonomous System Number\\n            (ASN).</p>\\n         <p>Valid values: <code>1</code> to <code>2,147,483,647</code>\\n         </p>\",\n                        \"smithy.api#xmlName\": \"bgpAsn\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a customer gateway.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#CustomerGatewayId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#CustomerGatewayIdStringList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#CustomerGatewayId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"CustomerGatewayId\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#CustomerGatewayList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#CustomerGateway\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DITMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 5,\n                    \"max\": 100\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DITOMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 5,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DataQueries\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#DataQuery\"\n            }\n        },\n        \"com.amazonaws.ec2#DataQuery\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Id\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A user-defined ID associated with a data query that's returned in the <code>dataResponse</code> identifying the query. For example, if you set the Id to <code>MyQuery01</code>in the query, the <code>dataResponse</code> identifies the query as <code>MyQuery01</code>.</p>\"\n                    }\n                },\n                \"Source\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Region or Availability Zone that's the source for the data query. For example, <code>us-east-1</code>.</p>\"\n                    }\n                },\n                \"Destination\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Region or Availability Zone that's the target for the data query. For example, <code>eu-north-1</code>.</p>\"\n                    }\n                },\n                \"Metric\": {\n                    \"target\": \"com.amazonaws.ec2#MetricType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The metric used for the network performance request.</p>\"\n                    }\n                },\n                \"Statistic\": {\n                    \"target\": \"com.amazonaws.ec2#StatisticType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The metric data aggregation period, <code>p50</code>, between the specified <code>startDate</code> \\n         and <code>endDate</code>. For example, a metric of <code>five_minutes</code> is the median of all \\n         the data points gathered within those five minutes. <code>p50</code> is the only supported metric.</p>\"\n                    }\n                },\n                \"Period\": {\n                    \"target\": \"com.amazonaws.ec2#PeriodType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The aggregation period used for the data query.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A query used for retrieving network health data. </p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DataResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Id\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Id\",\n                        \"smithy.api#documentation\": \"<p>The ID passed in the <code>DataQuery</code>.</p>\",\n                        \"smithy.api#xmlName\": \"id\"\n                    }\n                },\n                \"Source\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Source\",\n                        \"smithy.api#documentation\": \"<p>The Region or Availability Zone that's the source for the data query. For example, <code>us-east-1</code>.</p>\",\n                        \"smithy.api#xmlName\": \"source\"\n                    }\n                },\n                \"Destination\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Destination\",\n                        \"smithy.api#documentation\": \"<p>The Region or Availability Zone that's the destination for the data query. For example, <code>eu-west-1</code>.</p>\",\n                        \"smithy.api#xmlName\": \"destination\"\n                    }\n                },\n                \"Metric\": {\n                    \"target\": \"com.amazonaws.ec2#MetricType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Metric\",\n                        \"smithy.api#documentation\": \"<p>The metric used for the network performance request.</p>\",\n                        \"smithy.api#xmlName\": \"metric\"\n                    }\n                },\n                \"Statistic\": {\n                    \"target\": \"com.amazonaws.ec2#StatisticType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Statistic\",\n                        \"smithy.api#documentation\": \"<p>The statistic used for the network performance request.</p>\",\n                        \"smithy.api#xmlName\": \"statistic\"\n                    }\n                },\n                \"Period\": {\n                    \"target\": \"com.amazonaws.ec2#PeriodType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Period\",\n                        \"smithy.api#documentation\": \"<p>The period used for the network performance request.</p>\",\n                        \"smithy.api#xmlName\": \"period\"\n                    }\n                },\n                \"MetricPoints\": {\n                    \"target\": \"com.amazonaws.ec2#MetricPoints\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MetricPointSet\",\n                        \"smithy.api#documentation\": \"<p>A list of <code>MetricPoint</code> objects.</p>\",\n                        \"smithy.api#xmlName\": \"metricPointSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The response to a <code>DataQuery</code>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DataResponses\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#DataResponse\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DatafeedSubscriptionState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"Active\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Active\"\n                    }\n                },\n                \"Inactive\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Inactive\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DateTime\": {\n            \"type\": \"timestamp\"\n        },\n        \"com.amazonaws.ec2#DeclarativePoliciesMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DeclarativePoliciesReport\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ReportId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ReportId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the report.</p>\",\n                        \"smithy.api#xmlName\": \"reportId\"\n                    }\n                },\n                \"S3Bucket\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"S3Bucket\",\n                        \"smithy.api#documentation\": \"<p>The name of the Amazon S3 bucket where the report is located.</p>\",\n                        \"smithy.api#xmlName\": \"s3Bucket\"\n                    }\n                },\n                \"S3Prefix\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"S3Prefix\",\n                        \"smithy.api#documentation\": \"<p>The prefix for your S3 object.</p>\",\n                        \"smithy.api#xmlName\": \"s3Prefix\"\n                    }\n                },\n                \"TargetId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TargetId\",\n                        \"smithy.api#documentation\": \"<p>The root ID, organizational unit ID, or account ID.</p>\\n         <p>Format:</p>\\n         <ul>\\n            <li>\\n               <p>For root: <code>r-ab12</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>For OU: <code>ou-ab12-cdef1234</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>For account: <code>123456789012</code>\\n               </p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"targetId\"\n                    }\n                },\n                \"StartTime\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"StartTime\",\n                        \"smithy.api#documentation\": \"<p>The time when the report generation started.</p>\",\n                        \"smithy.api#xmlName\": \"startTime\"\n                    }\n                },\n                \"EndTime\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EndTime\",\n                        \"smithy.api#documentation\": \"<p>The time when the report generation ended.</p>\",\n                        \"smithy.api#xmlName\": \"endTime\"\n                    }\n                },\n                \"Status\": {\n                    \"target\": \"com.amazonaws.ec2#ReportState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Status\",\n                        \"smithy.api#documentation\": \"<p>The current status of the report.</p>\",\n                        \"smithy.api#xmlName\": \"status\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>Any tags assigned to the report.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the metadata of the account status report.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DeclarativePoliciesReportId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#DeclarativePoliciesReportList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#DeclarativePoliciesReport\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DedicatedHostFlag\": {\n            \"type\": \"boolean\"\n        },\n        \"com.amazonaws.ec2#DedicatedHostId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#DedicatedHostIdList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#DedicatedHostId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DefaultEnaQueueCountPerInterface\": {\n            \"type\": \"integer\"\n        },\n        \"com.amazonaws.ec2#DefaultInstanceMetadataEndpointState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"disabled\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"disabled\"\n                    }\n                },\n                \"enabled\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"enabled\"\n                    }\n                },\n                \"no_preference\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"no-preference\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DefaultInstanceMetadataTagsState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"disabled\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"disabled\"\n                    }\n                },\n                \"enabled\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"enabled\"\n                    }\n                },\n                \"no_preference\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"no-preference\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DefaultNetworkCardIndex\": {\n            \"type\": \"integer\"\n        },\n        \"com.amazonaws.ec2#DefaultRouteTableAssociationValue\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"enable\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"enable\"\n                    }\n                },\n                \"disable\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"disable\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DefaultRouteTablePropagationValue\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"enable\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"enable\"\n                    }\n                },\n                \"disable\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"disable\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DefaultTargetCapacityType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"SPOT\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"spot\"\n                    }\n                },\n                \"ON_DEMAND\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"on-demand\"\n                    }\n                },\n                \"CAPACITY_BLOCK\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"capacity-block\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DefaultingDhcpOptionsId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#DeleteCarrierGateway\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeleteCarrierGatewayRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DeleteCarrierGatewayResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes a carrier gateway.</p>\\n         <important>\\n            <p>If you do not delete the route that contains the carrier gateway as the\\n                Target, the route is a blackhole route. For information about how to delete a route, see \\n                <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteRoute.html\\\">DeleteRoute</a>.</p>\\n         </important>\"\n            }\n        },\n        \"com.amazonaws.ec2#DeleteCarrierGatewayRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CarrierGatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#CarrierGatewayId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the carrier gateway.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteCarrierGatewayResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CarrierGateway\": {\n                    \"target\": \"com.amazonaws.ec2#CarrierGateway\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CarrierGateway\",\n                        \"smithy.api#documentation\": \"<p>Information about the carrier gateway.</p>\",\n                        \"smithy.api#xmlName\": \"carrierGateway\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteClientVpnEndpoint\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeleteClientVpnEndpointRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DeleteClientVpnEndpointResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the specified Client VPN endpoint. You must disassociate all target networks before you \\n\\t\\t\\tcan delete a Client VPN endpoint.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DeleteClientVpnEndpointRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ClientVpnEndpointId\": {\n                    \"target\": \"com.amazonaws.ec2#ClientVpnEndpointId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the Client VPN to be deleted.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteClientVpnEndpointResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Status\": {\n                    \"target\": \"com.amazonaws.ec2#ClientVpnEndpointStatus\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Status\",\n                        \"smithy.api#documentation\": \"<p>The current state of the Client VPN endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"status\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteClientVpnRoute\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeleteClientVpnRouteRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DeleteClientVpnRouteResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes a route from a Client VPN endpoint. You can only delete routes that you manually added using \\n\\t\\t\\tthe <b>CreateClientVpnRoute</b> action. You cannot delete routes that were \\n\\t\\t\\tautomatically added when associating a subnet. To remove routes that have been automatically added, \\n\\t\\t\\tdisassociate the target subnet from the Client VPN endpoint.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DeleteClientVpnRouteRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ClientVpnEndpointId\": {\n                    \"target\": \"com.amazonaws.ec2#ClientVpnEndpointId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the Client VPN endpoint from which the route is to be deleted.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TargetVpcSubnetId\": {\n                    \"target\": \"com.amazonaws.ec2#SubnetId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the target subnet used by the route.</p>\"\n                    }\n                },\n                \"DestinationCidrBlock\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The IPv4 address range, in CIDR notation, of the route to be deleted.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteClientVpnRouteResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Status\": {\n                    \"target\": \"com.amazonaws.ec2#ClientVpnRouteStatus\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Status\",\n                        \"smithy.api#documentation\": \"<p>The current state of the route.</p>\",\n                        \"smithy.api#xmlName\": \"status\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteCoipCidr\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeleteCoipCidrRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DeleteCoipCidrResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>\\n      Deletes a range of customer-owned IP addresses.\\n      </p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DeleteCoipCidrRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Cidr\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p> A customer-owned IP address range that you want to delete. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"CoipPoolId\": {\n                    \"target\": \"com.amazonaws.ec2#Ipv4PoolCoipId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>\\n        The ID of the customer-owned address pool. \\n      </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteCoipCidrResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CoipCidr\": {\n                    \"target\": \"com.amazonaws.ec2#CoipCidr\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CoipCidr\",\n                        \"smithy.api#documentation\": \"<p>\\n       Information about a range of customer-owned IP addresses.\\n      </p>\",\n                        \"smithy.api#xmlName\": \"coipCidr\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteCoipPool\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeleteCoipPoolRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DeleteCoipPoolResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes a pool of customer-owned IP (CoIP) addresses. </p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DeleteCoipPoolRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CoipPoolId\": {\n                    \"target\": \"com.amazonaws.ec2#Ipv4PoolCoipId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the CoIP pool that you want to delete. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteCoipPoolResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CoipPool\": {\n                    \"target\": \"com.amazonaws.ec2#CoipPool\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CoipPool\",\n                        \"smithy.api#documentation\": \"<p>Information about the CoIP address pool.</p>\",\n                        \"smithy.api#xmlName\": \"coipPool\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteCustomerGateway\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeleteCustomerGatewayRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the specified customer gateway. You must delete the VPN connection before you\\n            can delete the customer gateway.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To delete a customer gateway\",\n                        \"documentation\": \"This example deletes the specified customer gateway.\",\n                        \"input\": {\n                            \"CustomerGatewayId\": \"cgw-0e11f167\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#DeleteCustomerGatewayRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CustomerGatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#CustomerGatewayId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the customer gateway.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually\\n            making the request, and provides an error response. If you have the required\\n            permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is\\n                <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the parameters for DeleteCustomerGateway.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteDhcpOptions\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeleteDhcpOptionsRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the specified set of DHCP options. You must disassociate the set of DHCP options before you can delete it. You can disassociate the set of DHCP options by associating either a new set of options or the default set of options with the VPC.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To delete a DHCP options set\",\n                        \"documentation\": \"This example deletes the specified DHCP options set.\",\n                        \"input\": {\n                            \"DhcpOptionsId\": \"dopt-d9070ebb\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#DeleteDhcpOptionsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DhcpOptionsId\": {\n                    \"target\": \"com.amazonaws.ec2#DhcpOptionsId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the DHCP options set.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteEgressOnlyInternetGateway\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeleteEgressOnlyInternetGatewayRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DeleteEgressOnlyInternetGatewayResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes an egress-only internet gateway.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DeleteEgressOnlyInternetGatewayRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"EgressOnlyInternetGatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#EgressOnlyInternetGatewayId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the egress-only internet gateway.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteEgressOnlyInternetGatewayResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ReturnCode\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ReturnCode\",\n                        \"smithy.api#documentation\": \"<p>Returns <code>true</code> if the request succeeds; otherwise, it returns an error.</p>\",\n                        \"smithy.api#xmlName\": \"returnCode\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteFleetError\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Code\": {\n                    \"target\": \"com.amazonaws.ec2#DeleteFleetErrorCode\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Code\",\n                        \"smithy.api#documentation\": \"<p>The error code.</p>\",\n                        \"smithy.api#xmlName\": \"code\"\n                    }\n                },\n                \"Message\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Message\",\n                        \"smithy.api#documentation\": \"<p>The description for the error code.</p>\",\n                        \"smithy.api#xmlName\": \"message\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes an EC2 Fleet error.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DeleteFleetErrorCode\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"FLEET_ID_DOES_NOT_EXIST\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"fleetIdDoesNotExist\"\n                    }\n                },\n                \"FLEET_ID_MALFORMED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"fleetIdMalformed\"\n                    }\n                },\n                \"FLEET_NOT_IN_DELETABLE_STATE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"fleetNotInDeletableState\"\n                    }\n                },\n                \"UNEXPECTED_ERROR\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"unexpectedError\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DeleteFleetErrorItem\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Error\": {\n                    \"target\": \"com.amazonaws.ec2#DeleteFleetError\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Error\",\n                        \"smithy.api#documentation\": \"<p>The error.</p>\",\n                        \"smithy.api#xmlName\": \"error\"\n                    }\n                },\n                \"FleetId\": {\n                    \"target\": \"com.amazonaws.ec2#FleetId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"FleetId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the EC2 Fleet.</p>\",\n                        \"smithy.api#xmlName\": \"fleetId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes an EC2 Fleet that was not successfully deleted.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DeleteFleetErrorSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#DeleteFleetErrorItem\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DeleteFleetSuccessItem\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CurrentFleetState\": {\n                    \"target\": \"com.amazonaws.ec2#FleetStateCode\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CurrentFleetState\",\n                        \"smithy.api#documentation\": \"<p>The current state of the EC2 Fleet.</p>\",\n                        \"smithy.api#xmlName\": \"currentFleetState\"\n                    }\n                },\n                \"PreviousFleetState\": {\n                    \"target\": \"com.amazonaws.ec2#FleetStateCode\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PreviousFleetState\",\n                        \"smithy.api#documentation\": \"<p>The previous state of the EC2 Fleet.</p>\",\n                        \"smithy.api#xmlName\": \"previousFleetState\"\n                    }\n                },\n                \"FleetId\": {\n                    \"target\": \"com.amazonaws.ec2#FleetId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"FleetId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the EC2 Fleet.</p>\",\n                        \"smithy.api#xmlName\": \"fleetId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes an EC2 Fleet that was successfully deleted.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DeleteFleetSuccessSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#DeleteFleetSuccessItem\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DeleteFleets\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeleteFleetsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DeleteFleetsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the specified EC2 Fleet request.</p>\\n         <p>After you delete an EC2 Fleet request, it launches no new instances.</p>\\n         <p>You must also specify whether a deleted EC2 Fleet request should terminate its instances. If\\n         you choose to terminate the instances, the EC2 Fleet request enters the\\n            <code>deleted_terminating</code> state. Otherwise, it enters the\\n            <code>deleted_running</code> state, and the instances continue to run until they are\\n         interrupted or you terminate them manually.</p>\\n         <p>A deleted <code>instant</code> fleet with running instances is not supported. When you\\n         delete an <code>instant</code> fleet, Amazon EC2 automatically terminates all its instances. For\\n         fleets with more than 1000 instances, the deletion request might fail. If your fleet has\\n         more than 1000 instances, first terminate most of the instances manually, leaving 1000 or\\n         fewer. Then delete the fleet, and the remaining instances will be terminated automatically.</p>\\n         <p class=\\\"title\\\">\\n            <b>Restrictions</b>\\n         </p>\\n         <ul>\\n            <li>\\n               <p>You can delete up to 25 fleets of type <code>instant</code> in a single\\n               request.</p>\\n            </li>\\n            <li>\\n               <p>You can delete up to 100 fleets of type <code>maintain</code> or\\n                  <code>request</code> in a single request.</p>\\n            </li>\\n            <li>\\n               <p>You can delete up to 125 fleets in a single request, provided you do not exceed\\n               the quota for each fleet type, as specified above.</p>\\n            </li>\\n            <li>\\n               <p>If you exceed the specified number of fleets to delete, no fleets are\\n               deleted.</p>\\n            </li>\\n         </ul>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/delete-fleet.html\\\">Delete an EC2 Fleet request and the instances\\n            in the fleet</a> in the <i>Amazon EC2 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DeleteFleetsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"FleetIds\": {\n                    \"target\": \"com.amazonaws.ec2#FleetIdSet\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The IDs of the EC2 Fleets.</p>\\n         <p>Constraints: In a single request, you can specify up to 25 <code>instant</code> fleet\\n         IDs and up to 100 <code>maintain</code> or <code>request</code> fleet IDs. </p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"FleetId\"\n                    }\n                },\n                \"TerminateInstances\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>Indicates whether to terminate the associated instances when the EC2 Fleet is deleted. The default is to\\n         terminate the instances.</p>\\n         <p>To let the instances continue to run after the EC2 Fleet is deleted, specify\\n            <code>no-terminate-instances</code>. Supported only for fleets of type\\n            <code>maintain</code> and <code>request</code>.</p>\\n         <p>For <code>instant</code> fleets, you cannot specify <code>NoTerminateInstances</code>. A\\n         deleted <code>instant</code> fleet with running instances is not supported.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteFleetsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SuccessfulFleetDeletions\": {\n                    \"target\": \"com.amazonaws.ec2#DeleteFleetSuccessSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SuccessfulFleetDeletionSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the EC2 Fleets that are successfully deleted.</p>\",\n                        \"smithy.api#xmlName\": \"successfulFleetDeletionSet\"\n                    }\n                },\n                \"UnsuccessfulFleetDeletions\": {\n                    \"target\": \"com.amazonaws.ec2#DeleteFleetErrorSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"UnsuccessfulFleetDeletionSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the EC2 Fleets that are not successfully deleted.</p>\",\n                        \"smithy.api#xmlName\": \"unsuccessfulFleetDeletionSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteFlowLogs\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeleteFlowLogsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DeleteFlowLogsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes one or more flow logs.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DeleteFlowLogsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"FlowLogIds\": {\n                    \"target\": \"com.amazonaws.ec2#FlowLogIdList\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>One or more flow log IDs.</p>\\n         <p>Constraint: Maximum of 1000 flow log IDs.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"FlowLogId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteFlowLogsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Unsuccessful\": {\n                    \"target\": \"com.amazonaws.ec2#UnsuccessfulItemSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Unsuccessful\",\n                        \"smithy.api#documentation\": \"<p>Information about the flow logs that could not be deleted successfully.</p>\",\n                        \"smithy.api#xmlName\": \"unsuccessful\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteFpgaImage\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeleteFpgaImageRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DeleteFpgaImageResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the specified Amazon FPGA Image (AFI).</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DeleteFpgaImageRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"FpgaImageId\": {\n                    \"target\": \"com.amazonaws.ec2#FpgaImageId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the AFI.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteFpgaImageResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Return\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Return\",\n                        \"smithy.api#documentation\": \"<p>Is <code>true</code> if the request succeeds, and an error otherwise.</p>\",\n                        \"smithy.api#xmlName\": \"return\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteImageUsageReport\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeleteImageUsageReportRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DeleteImageUsageReportResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the specified image usage report.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/your-ec2-ami-usage.html\\\">View your AMI usage</a> in the\\n      <i>Amazon EC2 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DeleteImageUsageReportRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ReportId\": {\n                    \"target\": \"com.amazonaws.ec2#ImageUsageReportId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the report to delete.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n\\t\\t\\tand provides an error response. If you have the required permissions, the error response is \\n\\t\\t\\t<code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteImageUsageReportResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Return\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Return\",\n                        \"smithy.api#documentation\": \"<p>Returns <code>true</code> if the request succeeds; otherwise, it returns an error.</p>\",\n                        \"smithy.api#xmlName\": \"return\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteInstanceConnectEndpoint\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeleteInstanceConnectEndpointRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DeleteInstanceConnectEndpointResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the specified EC2 Instance Connect Endpoint.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DeleteInstanceConnectEndpointRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n            and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n            Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"InstanceConnectEndpointId\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceConnectEndpointId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the EC2 Instance Connect Endpoint to delete.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteInstanceConnectEndpointResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceConnectEndpoint\": {\n                    \"target\": \"com.amazonaws.ec2#Ec2InstanceConnectEndpoint\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceConnectEndpoint\",\n                        \"smithy.api#documentation\": \"<p>Information about the EC2 Instance Connect Endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"instanceConnectEndpoint\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteInstanceEventWindow\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeleteInstanceEventWindowRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DeleteInstanceEventWindowResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the specified event window.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/event-windows.html\\\">Define event windows for scheduled\\n            events</a> in the <i>Amazon EC2 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DeleteInstanceEventWindowRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"ForceDelete\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify <code>true</code> to force delete the event window. Use the force delete\\n         parameter if the event window is currently associated with targets.</p>\"\n                    }\n                },\n                \"InstanceEventWindowId\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceEventWindowId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the event window.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"InstanceEventWindowId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteInstanceEventWindowResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceEventWindowState\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceEventWindowStateChange\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceEventWindowState\",\n                        \"smithy.api#documentation\": \"<p>The state of the event window.</p>\",\n                        \"smithy.api#xmlName\": \"instanceEventWindowState\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteInternetGateway\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeleteInternetGatewayRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the specified internet gateway. You must detach the internet gateway from the\\n\\t\\t\\tVPC before you can delete it.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To delete an Internet gateway\",\n                        \"documentation\": \"This example deletes the specified Internet gateway.\",\n                        \"input\": {\n                            \"InternetGatewayId\": \"igw-c0a643a9\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#DeleteInternetGatewayRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"InternetGatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#InternetGatewayId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InternetGatewayId\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the internet gateway.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"internetGatewayId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteIpam\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeleteIpamRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DeleteIpamResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Delete an IPAM. Deleting an IPAM removes all monitored data associated with the IPAM including the historical data for CIDRs.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/ipam/delete-ipam.html\\\">Delete an IPAM</a> in the <i>Amazon VPC IPAM User Guide</i>.\\n      </p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DeleteIpamExternalResourceVerificationToken\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeleteIpamExternalResourceVerificationTokenRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DeleteIpamExternalResourceVerificationTokenResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Delete a verification token. A verification token is an Amazon Web Services-generated random value that you can use to prove ownership of an external resource. For example, you can use a verification token to validate that you control a public IP address range when you bring an IP address range to Amazon Web Services (BYOIP).\\n</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DeleteIpamExternalResourceVerificationTokenRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A check for whether you have the required permissions for the action without actually making the request \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"IpamExternalResourceVerificationTokenId\": {\n                    \"target\": \"com.amazonaws.ec2#IpamExternalResourceVerificationTokenId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The token ID.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteIpamExternalResourceVerificationTokenResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"IpamExternalResourceVerificationToken\": {\n                    \"target\": \"com.amazonaws.ec2#IpamExternalResourceVerificationToken\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpamExternalResourceVerificationToken\",\n                        \"smithy.api#documentation\": \"<p>The verification token.</p>\",\n                        \"smithy.api#xmlName\": \"ipamExternalResourceVerificationToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteIpamPool\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeleteIpamPoolRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DeleteIpamPoolResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Delete an IPAM pool.</p>\\n         <note>\\n            <p>You cannot delete an IPAM pool if there are allocations in it or CIDRs provisioned to it. To release \\n         allocations, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ReleaseIpamPoolAllocation.html\\\">ReleaseIpamPoolAllocation</a>. To deprovision pool \\n         CIDRs, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeprovisionIpamPoolCidr.html\\\">DeprovisionIpamPoolCidr</a>.</p>\\n         </note>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/ipam/delete-pool-ipam.html\\\">Delete a pool</a> in the <i>Amazon VPC IPAM User Guide</i>.\\n      </p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DeleteIpamPoolRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A check for whether you have the required permissions for the action without actually making the request \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"IpamPoolId\": {\n                    \"target\": \"com.amazonaws.ec2#IpamPoolId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the pool to delete.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Cascade\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Enables you to quickly delete an IPAM pool and all resources within that pool, including\\n         provisioned CIDRs, allocations, and other pools.</p>\\n         <important>\\n            <p>You can only use this option to delete pools in the private scope or pools in the public scope with a source resource. A source resource is a resource used to provision CIDRs to a resource planning pool.</p>\\n         </important>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteIpamPoolResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"IpamPool\": {\n                    \"target\": \"com.amazonaws.ec2#IpamPool\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpamPool\",\n                        \"smithy.api#documentation\": \"<p>Information about the results of the deletion.</p>\",\n                        \"smithy.api#xmlName\": \"ipamPool\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteIpamRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A check for whether you have the required permissions for the action without actually making the request \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"IpamId\": {\n                    \"target\": \"com.amazonaws.ec2#IpamId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the IPAM to delete.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Cascade\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Enables you to quickly delete an IPAM, private scopes, pools in private scopes, and\\n         any allocations in the pools in private scopes. You cannot delete the IPAM with this option if there is a pool in your public scope. If you use this option, IPAM does the following:</p>\\n         <ul>\\n            <li>\\n               <p>Deallocates any CIDRs allocated to VPC resources (such as VPCs) in pools in private scopes.</p>\\n               <note>\\n                  <p>No VPC resources are deleted as a result of enabling this option. The CIDR associated with the resource will no longer be allocated from an IPAM pool, but the CIDR itself will remain unchanged.</p>\\n               </note>\\n            </li>\\n            <li>\\n               <p>Deprovisions all IPv4 CIDRs provisioned to IPAM pools in private scopes.</p>\\n            </li>\\n            <li>\\n               <p>Deletes all IPAM pools in private scopes.</p>\\n            </li>\\n            <li>\\n               <p>Deletes all non-default private scopes in the IPAM.</p>\\n            </li>\\n            <li>\\n               <p>Deletes the default public and private scopes and the IPAM.</p>\\n            </li>\\n         </ul>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteIpamResourceDiscovery\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeleteIpamResourceDiscoveryRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DeleteIpamResourceDiscoveryResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes an IPAM resource discovery. A resource discovery is an IPAM component that enables IPAM to manage and monitor resources that belong to the owning account.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DeleteIpamResourceDiscoveryRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A check for whether you have the required permissions for the action without actually making the request \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"IpamResourceDiscoveryId\": {\n                    \"target\": \"com.amazonaws.ec2#IpamResourceDiscoveryId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The IPAM resource discovery ID.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteIpamResourceDiscoveryResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"IpamResourceDiscovery\": {\n                    \"target\": \"com.amazonaws.ec2#IpamResourceDiscovery\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpamResourceDiscovery\",\n                        \"smithy.api#documentation\": \"<p>The IPAM resource discovery.</p>\",\n                        \"smithy.api#xmlName\": \"ipamResourceDiscovery\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteIpamResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Ipam\": {\n                    \"target\": \"com.amazonaws.ec2#Ipam\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Ipam\",\n                        \"smithy.api#documentation\": \"<p>Information about the results of the deletion.</p>\",\n                        \"smithy.api#xmlName\": \"ipam\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteIpamScope\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeleteIpamScopeRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DeleteIpamScopeResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Delete the scope for an IPAM. You cannot delete the default scopes.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/ipam/delete-scope-ipam.html\\\">Delete a scope</a> in the <i>Amazon VPC IPAM User Guide</i>.\\n      </p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DeleteIpamScopeRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A check for whether you have the required permissions for the action without actually making the request \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"IpamScopeId\": {\n                    \"target\": \"com.amazonaws.ec2#IpamScopeId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the scope to delete.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteIpamScopeResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"IpamScope\": {\n                    \"target\": \"com.amazonaws.ec2#IpamScope\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpamScope\",\n                        \"smithy.api#documentation\": \"<p>Information about the results of the deletion.</p>\",\n                        \"smithy.api#xmlName\": \"ipamScope\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteKeyPair\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeleteKeyPairRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DeleteKeyPairResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the specified key pair, by removing the public key from Amazon EC2.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To delete a key pair\",\n                        \"documentation\": \"This example deletes the specified key pair.\",\n                        \"input\": {\n                            \"KeyName\": \"my-key-pair\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#DeleteKeyPairRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"KeyName\": {\n                    \"target\": \"com.amazonaws.ec2#KeyPairNameWithResolver\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the key pair.</p>\"\n                    }\n                },\n                \"KeyPairId\": {\n                    \"target\": \"com.amazonaws.ec2#KeyPairId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the key pair.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteKeyPairResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Return\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Return\",\n                        \"smithy.api#documentation\": \"<p>Is <code>true</code> if the request succeeds, and an error otherwise.</p>\",\n                        \"smithy.api#xmlName\": \"return\"\n                    }\n                },\n                \"KeyPairId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"KeyPairId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the key pair.</p>\",\n                        \"smithy.api#xmlName\": \"keyPairId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteLaunchTemplate\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeleteLaunchTemplateRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DeleteLaunchTemplateResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes a launch template. Deleting a launch template deletes all of its\\n            versions.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To delete a launch template\",\n                        \"documentation\": \"This example deletes the specified launch template.\",\n                        \"input\": {\n                            \"LaunchTemplateId\": \"lt-0abcd290751193123\"\n                        },\n                        \"output\": {\n                            \"LaunchTemplate\": {\n                                \"LatestVersionNumber\": 2,\n                                \"LaunchTemplateId\": \"lt-0abcd290751193123\",\n                                \"LaunchTemplateName\": \"my-template\",\n                                \"DefaultVersionNumber\": 2,\n                                \"CreatedBy\": \"arn:aws:iam::123456789012:root\",\n                                \"CreateTime\": \"2017-11-23T16:46:25.000Z\"\n                            }\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#DeleteLaunchTemplateRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually\\n            making the request, and provides an error response. If you have the required\\n            permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is\\n                <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"LaunchTemplateId\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplateId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the launch template.</p>\\n         <p>You must specify either the launch template ID or the launch template name, but not\\n            both.</p>\"\n                    }\n                },\n                \"LaunchTemplateName\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplateName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the launch template.</p>\\n         <p>You must specify either the launch template ID or the launch template name, but not\\n            both.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteLaunchTemplateResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LaunchTemplate\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplate\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LaunchTemplate\",\n                        \"smithy.api#documentation\": \"<p>Information about the launch template.</p>\",\n                        \"smithy.api#xmlName\": \"launchTemplate\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteLaunchTemplateVersions\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeleteLaunchTemplateVersionsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DeleteLaunchTemplateVersionsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes one or more versions of a launch template.</p>\\n         <p>You can't delete the default version of a launch template; you must first assign a\\n            different version as the default. If the default version is the only version for the\\n            launch template, you must delete the entire launch template using <a>DeleteLaunchTemplate</a>.</p>\\n         <p>You can delete up to 200 launch template versions in a single request. To delete more\\n            than 200 versions in a single request, use <a>DeleteLaunchTemplate</a>, which\\n            deletes the launch template and all of its versions.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/delete-launch-template.html#delete-launch-template-version\\\">Delete a launch template version</a> in the\\n                <i>Amazon EC2 User Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To delete a launch template version\",\n                        \"documentation\": \"This example deletes the specified launch template version.\",\n                        \"input\": {\n                            \"LaunchTemplateId\": \"lt-0abcd290751193123\",\n                            \"Versions\": [\n                                \"1\"\n                            ]\n                        },\n                        \"output\": {\n                            \"SuccessfullyDeletedLaunchTemplateVersions\": [\n                                {\n                                    \"LaunchTemplateName\": \"my-template\",\n                                    \"VersionNumber\": 1,\n                                    \"LaunchTemplateId\": \"lt-0abcd290751193123\"\n                                }\n                            ],\n                            \"UnsuccessfullyDeletedLaunchTemplateVersions\": []\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#DeleteLaunchTemplateVersionsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually\\n            making the request, and provides an error response. If you have the required\\n            permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is\\n                <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"LaunchTemplateId\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplateId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the launch template.</p>\\n         <p>You must specify either the launch template ID or the launch template name, but not\\n            both.</p>\"\n                    }\n                },\n                \"LaunchTemplateName\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplateName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the launch template.</p>\\n         <p>You must specify either the launch template ID or the launch template name, but not\\n            both.</p>\"\n                    }\n                },\n                \"Versions\": {\n                    \"target\": \"com.amazonaws.ec2#VersionStringList\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The version numbers of one or more launch template versions to delete. You can specify\\n            up to 200 launch template version numbers.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"LaunchTemplateVersion\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteLaunchTemplateVersionsResponseErrorItem\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LaunchTemplateId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LaunchTemplateId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the launch template.</p>\",\n                        \"smithy.api#xmlName\": \"launchTemplateId\"\n                    }\n                },\n                \"LaunchTemplateName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LaunchTemplateName\",\n                        \"smithy.api#documentation\": \"<p>The name of the launch template.</p>\",\n                        \"smithy.api#xmlName\": \"launchTemplateName\"\n                    }\n                },\n                \"VersionNumber\": {\n                    \"target\": \"com.amazonaws.ec2#Long\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VersionNumber\",\n                        \"smithy.api#documentation\": \"<p>The version number of the launch template.</p>\",\n                        \"smithy.api#xmlName\": \"versionNumber\"\n                    }\n                },\n                \"ResponseError\": {\n                    \"target\": \"com.amazonaws.ec2#ResponseError\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResponseError\",\n                        \"smithy.api#documentation\": \"<p>Information about the error.</p>\",\n                        \"smithy.api#xmlName\": \"responseError\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a launch template version that could not be deleted.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DeleteLaunchTemplateVersionsResponseErrorSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#DeleteLaunchTemplateVersionsResponseErrorItem\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DeleteLaunchTemplateVersionsResponseSuccessItem\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LaunchTemplateId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LaunchTemplateId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the launch template.</p>\",\n                        \"smithy.api#xmlName\": \"launchTemplateId\"\n                    }\n                },\n                \"LaunchTemplateName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LaunchTemplateName\",\n                        \"smithy.api#documentation\": \"<p>The name of the launch template.</p>\",\n                        \"smithy.api#xmlName\": \"launchTemplateName\"\n                    }\n                },\n                \"VersionNumber\": {\n                    \"target\": \"com.amazonaws.ec2#Long\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VersionNumber\",\n                        \"smithy.api#documentation\": \"<p>The version number of the launch template.</p>\",\n                        \"smithy.api#xmlName\": \"versionNumber\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a launch template version that was successfully deleted.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DeleteLaunchTemplateVersionsResponseSuccessSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#DeleteLaunchTemplateVersionsResponseSuccessItem\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DeleteLaunchTemplateVersionsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SuccessfullyDeletedLaunchTemplateVersions\": {\n                    \"target\": \"com.amazonaws.ec2#DeleteLaunchTemplateVersionsResponseSuccessSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SuccessfullyDeletedLaunchTemplateVersionSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the launch template versions that were successfully deleted.</p>\",\n                        \"smithy.api#xmlName\": \"successfullyDeletedLaunchTemplateVersionSet\"\n                    }\n                },\n                \"UnsuccessfullyDeletedLaunchTemplateVersions\": {\n                    \"target\": \"com.amazonaws.ec2#DeleteLaunchTemplateVersionsResponseErrorSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"UnsuccessfullyDeletedLaunchTemplateVersionSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the launch template versions that could not be deleted.</p>\",\n                        \"smithy.api#xmlName\": \"unsuccessfullyDeletedLaunchTemplateVersionSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteLocalGatewayRoute\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeleteLocalGatewayRouteRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DeleteLocalGatewayRouteResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the specified route from the specified local gateway route table.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DeleteLocalGatewayRouteRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DestinationCidrBlock\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The CIDR range for the route. This must match the CIDR for the route exactly.</p>\"\n                    }\n                },\n                \"LocalGatewayRouteTableId\": {\n                    \"target\": \"com.amazonaws.ec2#LocalGatewayRoutetableId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the local gateway route table.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"DestinationPrefixListId\": {\n                    \"target\": \"com.amazonaws.ec2#PrefixListResourceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>\\n         Use a prefix list in place of <code>DestinationCidrBlock</code>. You cannot use \\n         <code>DestinationPrefixListId</code> and <code>DestinationCidrBlock</code> in the same request.\\n      </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteLocalGatewayRouteResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Route\": {\n                    \"target\": \"com.amazonaws.ec2#LocalGatewayRoute\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Route\",\n                        \"smithy.api#documentation\": \"<p>Information about the route.</p>\",\n                        \"smithy.api#xmlName\": \"route\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteLocalGatewayRouteTable\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeleteLocalGatewayRouteTableRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DeleteLocalGatewayRouteTableResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>\\n      Deletes a local gateway route table.\\n      </p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DeleteLocalGatewayRouteTableRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LocalGatewayRouteTableId\": {\n                    \"target\": \"com.amazonaws.ec2#LocalGatewayRoutetableId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>\\n      The ID of the local gateway route table.\\n      </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteLocalGatewayRouteTableResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LocalGatewayRouteTable\": {\n                    \"target\": \"com.amazonaws.ec2#LocalGatewayRouteTable\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LocalGatewayRouteTable\",\n                        \"smithy.api#documentation\": \"<p>Information about the local gateway route table.</p>\",\n                        \"smithy.api#xmlName\": \"localGatewayRouteTable\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteLocalGatewayRouteTableVirtualInterfaceGroupAssociation\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeleteLocalGatewayRouteTableVirtualInterfaceGroupAssociationRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DeleteLocalGatewayRouteTableVirtualInterfaceGroupAssociationResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>\\n      Deletes a local gateway route table virtual interface group association.\\n      </p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DeleteLocalGatewayRouteTableVirtualInterfaceGroupAssociationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LocalGatewayRouteTableVirtualInterfaceGroupAssociationId\": {\n                    \"target\": \"com.amazonaws.ec2#LocalGatewayRouteTableVirtualInterfaceGroupAssociationId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>\\n         The ID of the local gateway route table virtual interface group association.\\n      </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteLocalGatewayRouteTableVirtualInterfaceGroupAssociationResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LocalGatewayRouteTableVirtualInterfaceGroupAssociation\": {\n                    \"target\": \"com.amazonaws.ec2#LocalGatewayRouteTableVirtualInterfaceGroupAssociation\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LocalGatewayRouteTableVirtualInterfaceGroupAssociation\",\n                        \"smithy.api#documentation\": \"<p>Information about the association.</p>\",\n                        \"smithy.api#xmlName\": \"localGatewayRouteTableVirtualInterfaceGroupAssociation\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteLocalGatewayRouteTableVpcAssociation\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeleteLocalGatewayRouteTableVpcAssociationRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DeleteLocalGatewayRouteTableVpcAssociationResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the specified association between a VPC and local gateway route table.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DeleteLocalGatewayRouteTableVpcAssociationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LocalGatewayRouteTableVpcAssociationId\": {\n                    \"target\": \"com.amazonaws.ec2#LocalGatewayRouteTableVpcAssociationId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the association.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteLocalGatewayRouteTableVpcAssociationResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LocalGatewayRouteTableVpcAssociation\": {\n                    \"target\": \"com.amazonaws.ec2#LocalGatewayRouteTableVpcAssociation\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LocalGatewayRouteTableVpcAssociation\",\n                        \"smithy.api#documentation\": \"<p>Information about the association.</p>\",\n                        \"smithy.api#xmlName\": \"localGatewayRouteTableVpcAssociation\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteLocalGatewayVirtualInterface\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeleteLocalGatewayVirtualInterfaceRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DeleteLocalGatewayVirtualInterfaceResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the specified local gateway virtual interface.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DeleteLocalGatewayVirtualInterfaceGroup\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeleteLocalGatewayVirtualInterfaceGroupRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DeleteLocalGatewayVirtualInterfaceGroupResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Delete the specified local gateway interface group.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DeleteLocalGatewayVirtualInterfaceGroupRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LocalGatewayVirtualInterfaceGroupId\": {\n                    \"target\": \"com.amazonaws.ec2#LocalGatewayVirtualInterfaceGroupId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the local gateway virtual interface group to delete.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteLocalGatewayVirtualInterfaceGroupResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LocalGatewayVirtualInterfaceGroup\": {\n                    \"target\": \"com.amazonaws.ec2#LocalGatewayVirtualInterfaceGroup\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LocalGatewayVirtualInterfaceGroup\",\n                        \"smithy.api#documentation\": \"<p>Information about the deleted local gateway virtual interface group.</p>\",\n                        \"smithy.api#xmlName\": \"localGatewayVirtualInterfaceGroup\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteLocalGatewayVirtualInterfaceRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LocalGatewayVirtualInterfaceId\": {\n                    \"target\": \"com.amazonaws.ec2#LocalGatewayVirtualInterfaceId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the local virtual interface to delete.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteLocalGatewayVirtualInterfaceResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LocalGatewayVirtualInterface\": {\n                    \"target\": \"com.amazonaws.ec2#LocalGatewayVirtualInterface\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LocalGatewayVirtualInterface\",\n                        \"smithy.api#documentation\": \"<p>Information about the deleted local gateway virtual interface.</p>\",\n                        \"smithy.api#xmlName\": \"localGatewayVirtualInterface\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteManagedPrefixList\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeleteManagedPrefixListRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DeleteManagedPrefixListResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the specified managed prefix list. You must first remove all references to the prefix list in your resources.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DeleteManagedPrefixListRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"PrefixListId\": {\n                    \"target\": \"com.amazonaws.ec2#PrefixListResourceId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the prefix list.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteManagedPrefixListResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PrefixList\": {\n                    \"target\": \"com.amazonaws.ec2#ManagedPrefixList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PrefixList\",\n                        \"smithy.api#documentation\": \"<p>Information about the prefix list.</p>\",\n                        \"smithy.api#xmlName\": \"prefixList\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteNatGateway\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeleteNatGatewayRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DeleteNatGatewayResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the specified NAT gateway. Deleting a public NAT gateway disassociates its Elastic IP address, \\n          but does not release the address from your account. Deleting a NAT gateway does not delete any NAT gateway \\n          routes in your route tables.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To delete a NAT gateway\",\n                        \"documentation\": \"This example deletes the specified NAT gateway.\",\n                        \"input\": {\n                            \"NatGatewayId\": \"nat-04ae55e711cec5680\"\n                        },\n                        \"output\": {\n                            \"NatGatewayId\": \"nat-04ae55e711cec5680\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#DeleteNatGatewayRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"NatGatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#NatGatewayId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the NAT gateway.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"NatGatewayId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteNatGatewayResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NatGatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NatGatewayId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the NAT gateway.</p>\",\n                        \"smithy.api#xmlName\": \"natGatewayId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteNetworkAcl\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeleteNetworkAclRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the specified network ACL. You can't delete the ACL if it's associated with any subnets. You can't delete the default network ACL.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To delete a network ACL\",\n                        \"documentation\": \"This example deletes the specified network ACL.\",\n                        \"input\": {\n                            \"NetworkAclId\": \"acl-5fb85d36\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#DeleteNetworkAclEntry\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeleteNetworkAclEntryRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the specified ingress or egress entry (rule) from the specified network ACL.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To delete a network ACL entry\",\n                        \"documentation\": \"This example deletes ingress rule number 100 from the specified network ACL.\",\n                        \"input\": {\n                            \"NetworkAclId\": \"acl-5fb85d36\",\n                            \"RuleNumber\": 100,\n                            \"Egress\": true\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#DeleteNetworkAclEntryRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"NetworkAclId\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkAclId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkAclId\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the network ACL.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"networkAclId\"\n                    }\n                },\n                \"RuleNumber\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RuleNumber\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The rule number of the entry to delete.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"ruleNumber\"\n                    }\n                },\n                \"Egress\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Egress\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>Indicates whether the rule is an egress rule.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"egress\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteNetworkAclRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"NetworkAclId\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkAclId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkAclId\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the network ACL.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"networkAclId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteNetworkInsightsAccessScope\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeleteNetworkInsightsAccessScopeRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DeleteNetworkInsightsAccessScopeResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the specified Network Access Scope.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DeleteNetworkInsightsAccessScopeAnalysis\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeleteNetworkInsightsAccessScopeAnalysisRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DeleteNetworkInsightsAccessScopeAnalysisResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the specified Network Access Scope analysis.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DeleteNetworkInsightsAccessScopeAnalysisRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NetworkInsightsAccessScopeAnalysisId\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInsightsAccessScopeAnalysisId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the Network Access Scope analysis.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteNetworkInsightsAccessScopeAnalysisResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NetworkInsightsAccessScopeAnalysisId\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInsightsAccessScopeAnalysisId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkInsightsAccessScopeAnalysisId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Network Access Scope analysis.</p>\",\n                        \"smithy.api#xmlName\": \"networkInsightsAccessScopeAnalysisId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteNetworkInsightsAccessScopeRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"NetworkInsightsAccessScopeId\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInsightsAccessScopeId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the Network Access Scope.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteNetworkInsightsAccessScopeResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NetworkInsightsAccessScopeId\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInsightsAccessScopeId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkInsightsAccessScopeId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Network Access Scope.</p>\",\n                        \"smithy.api#xmlName\": \"networkInsightsAccessScopeId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteNetworkInsightsAnalysis\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeleteNetworkInsightsAnalysisRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DeleteNetworkInsightsAnalysisResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the specified network insights analysis.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DeleteNetworkInsightsAnalysisRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"NetworkInsightsAnalysisId\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInsightsAnalysisId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the network insights analysis.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteNetworkInsightsAnalysisResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NetworkInsightsAnalysisId\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInsightsAnalysisId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkInsightsAnalysisId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the network insights analysis.</p>\",\n                        \"smithy.api#xmlName\": \"networkInsightsAnalysisId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteNetworkInsightsPath\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeleteNetworkInsightsPathRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DeleteNetworkInsightsPathResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the specified path.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DeleteNetworkInsightsPathRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"NetworkInsightsPathId\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInsightsPathId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the path.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteNetworkInsightsPathResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NetworkInsightsPathId\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInsightsPathId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkInsightsPathId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the path.</p>\",\n                        \"smithy.api#xmlName\": \"networkInsightsPathId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteNetworkInterface\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeleteNetworkInterfaceRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the specified network interface. You must detach the network interface before\\n            you can delete it.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To delete a network interface\",\n                        \"documentation\": \"This example deletes the specified network interface.\",\n                        \"input\": {\n                            \"NetworkInterfaceId\": \"eni-e5aa89a3\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#DeleteNetworkInterfacePermission\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeleteNetworkInterfacePermissionRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DeleteNetworkInterfacePermissionResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes a permission for a network interface. By default, you cannot delete the\\n            permission if the account for which you're removing the permission has attached the\\n            network interface to an instance. However, you can force delete the permission,\\n            regardless of any attachment.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DeleteNetworkInterfacePermissionRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NetworkInterfacePermissionId\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInterfacePermissionId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the network interface permission.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Force\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify <code>true</code> to remove the permission even if the network interface is\\n            attached to an instance.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually\\n            making the request, and provides an error response. If you have the required\\n            permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is\\n                <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the parameters for DeleteNetworkInterfacePermission.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteNetworkInterfacePermissionResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Return\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Return\",\n                        \"smithy.api#documentation\": \"<p>Returns <code>true</code> if the request succeeds, otherwise returns an error.</p>\",\n                        \"smithy.api#xmlName\": \"return\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the output for DeleteNetworkInterfacePermission.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteNetworkInterfaceRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually\\n            making the request, and provides an error response. If you have the required\\n            permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is\\n                <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"NetworkInterfaceId\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInterfaceId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkInterfaceId\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the network interface.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"networkInterfaceId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the parameters for DeleteNetworkInterface.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeletePlacementGroup\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeletePlacementGroupRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the specified placement group. You must terminate all instances in the\\n            placement group before you can delete the placement group. For more information, see\\n                <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/placement-groups.html\\\">Placement groups</a> in the <i>Amazon EC2 User Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To delete a placement group\",\n                        \"documentation\": \"This example deletes the specified placement group.\\n\",\n                        \"input\": {\n                            \"GroupName\": \"my-cluster\"\n                        },\n                        \"output\": {}\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#DeletePlacementGroupRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the operation, without actually making the \\n  request, and provides an error response. If you have the required permissions, the error response is \\n  <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"GroupName\": {\n                    \"target\": \"com.amazonaws.ec2#PlacementGroupName\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"GroupName\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The name of the placement group.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"groupName\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeletePublicIpv4Pool\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeletePublicIpv4PoolRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DeletePublicIpv4PoolResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Delete a public IPv4 pool. A public IPv4 pool is an EC2 IP address pool required for the public IPv4 CIDRs that you own and bring to Amazon Web Services to manage with IPAM. IPv6 addresses you bring to Amazon Web Services, however, use IPAM pools only.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DeletePublicIpv4PoolRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A check for whether you have the required permissions for the action without actually making the request \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"PoolId\": {\n                    \"target\": \"com.amazonaws.ec2#Ipv4PoolEc2Id\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the public IPv4 pool you want to delete.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"NetworkBorderGroup\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Availability Zone (AZ) or Local Zone (LZ) network border group that the resource that the IP address is assigned to is in. Defaults to an AZ network border group. For more information on available Local Zones, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-byoip.html#byoip-zone-avail\\\">Local Zone availability</a> in the <i>Amazon EC2 User Guide</i>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeletePublicIpv4PoolResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ReturnValue\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ReturnValue\",\n                        \"smithy.api#documentation\": \"<p>Information about the result of deleting the public IPv4 pool.</p>\",\n                        \"smithy.api#xmlName\": \"returnValue\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteQueuedReservedInstances\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeleteQueuedReservedInstancesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DeleteQueuedReservedInstancesResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the queued purchases for the specified Reserved Instances.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DeleteQueuedReservedInstancesError\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Code\": {\n                    \"target\": \"com.amazonaws.ec2#DeleteQueuedReservedInstancesErrorCode\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Code\",\n                        \"smithy.api#documentation\": \"<p>The error code.</p>\",\n                        \"smithy.api#xmlName\": \"code\"\n                    }\n                },\n                \"Message\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Message\",\n                        \"smithy.api#documentation\": \"<p>The error message.</p>\",\n                        \"smithy.api#xmlName\": \"message\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the error for a Reserved Instance whose queued purchase could not be\\n      deleted.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DeleteQueuedReservedInstancesErrorCode\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"RESERVED_INSTANCES_ID_INVALID\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"reserved-instances-id-invalid\"\n                    }\n                },\n                \"RESERVED_INSTANCES_NOT_IN_QUEUED_STATE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"reserved-instances-not-in-queued-state\"\n                    }\n                },\n                \"UNEXPECTED_ERROR\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"unexpected-error\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DeleteQueuedReservedInstancesIdList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ReservationId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 100\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DeleteQueuedReservedInstancesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making\\n      the request, and provides an error response. If you have the required permissions, the error\\n      response is <code>DryRunOperation</code>. Otherwise, it is\\n      <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"ReservedInstancesIds\": {\n                    \"target\": \"com.amazonaws.ec2#DeleteQueuedReservedInstancesIdList\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The IDs of the Reserved Instances.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"ReservedInstancesId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteQueuedReservedInstancesResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SuccessfulQueuedPurchaseDeletions\": {\n                    \"target\": \"com.amazonaws.ec2#SuccessfulQueuedPurchaseDeletionSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SuccessfulQueuedPurchaseDeletionSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the queued purchases that were successfully deleted.</p>\",\n                        \"smithy.api#xmlName\": \"successfulQueuedPurchaseDeletionSet\"\n                    }\n                },\n                \"FailedQueuedPurchaseDeletions\": {\n                    \"target\": \"com.amazonaws.ec2#FailedQueuedPurchaseDeletionSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"FailedQueuedPurchaseDeletionSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the queued purchases that could not be deleted.</p>\",\n                        \"smithy.api#xmlName\": \"failedQueuedPurchaseDeletionSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteRoute\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeleteRouteRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the specified route from the specified route table.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To delete a route\",\n                        \"documentation\": \"This example deletes the specified route from the specified route table.\",\n                        \"input\": {\n                            \"RouteTableId\": \"rtb-22574640\",\n                            \"DestinationCidrBlock\": \"0.0.0.0/0\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#DeleteRouteRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DestinationPrefixListId\": {\n                    \"target\": \"com.amazonaws.ec2#PrefixListResourceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the prefix list for the route.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"RouteTableId\": {\n                    \"target\": \"com.amazonaws.ec2#RouteTableId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RouteTableId\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the route table.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"routeTableId\"\n                    }\n                },\n                \"DestinationCidrBlock\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DestinationCidrBlock\",\n                        \"smithy.api#documentation\": \"<p>The IPv4 CIDR range for the route. The value you specify must match the CIDR for the route exactly.</p>\",\n                        \"smithy.api#xmlName\": \"destinationCidrBlock\"\n                    }\n                },\n                \"DestinationIpv6CidrBlock\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DestinationIpv6CidrBlock\",\n                        \"smithy.api#documentation\": \"<p>The IPv6 CIDR range for the route. The value you specify must match the CIDR for the route exactly.</p>\",\n                        \"smithy.api#xmlName\": \"destinationIpv6CidrBlock\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteRouteServer\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeleteRouteServerRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DeleteRouteServerResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the specified route server.</p>\\n         <p>Amazon VPC Route Server simplifies routing for traffic between workloads that are deployed within a VPC and its internet gateways. With this feature, \\nVPC Route Server dynamically updates VPC and internet gateway route tables with your preferred IPv4 or IPv6 routes to achieve routing fault tolerance for those workloads. This enables you to automatically reroute traffic within a VPC, which increases the manageability of VPC routing and interoperability with third-party workloads.</p>\\n         <p>Route server supports the follow route table types:</p>\\n         <ul>\\n            <li>\\n               <p>VPC route tables not associated with subnets</p>\\n            </li>\\n            <li>\\n               <p>Subnet route tables</p>\\n            </li>\\n            <li>\\n               <p>Internet gateway route tables</p>\\n            </li>\\n         </ul>\\n         <p>Route server does not support route tables associated with virtual private gateways. To propagate routes into a transit gateway route table, use <a href=\\\"https://docs.aws.amazon.com/vpc/latest/tgw/tgw-connect.html\\\">Transit Gateway Connect</a>.</p>\\n         <p>For more information see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/userguide/dynamic-routing-route-server.html\\\">Dynamic routing in your VPC with VPC Route Server</a> in the <i>Amazon VPC User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DeleteRouteServerEndpoint\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeleteRouteServerEndpointRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DeleteRouteServerEndpointResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the specified route server endpoint.</p>\\n         <p>A route server endpoint is an Amazon Web Services-managed component inside a subnet that facilitates <a href=\\\"https://en.wikipedia.org/wiki/Border_Gateway_Protocol\\\">BGP (Border Gateway Protocol)</a> connections between your route server and your BGP peers.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DeleteRouteServerEndpointRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RouteServerEndpointId\": {\n                    \"target\": \"com.amazonaws.ec2#RouteServerEndpointId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the route server endpoint to delete.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A check for whether you have the required permissions for the action without actually making the request \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteRouteServerEndpointResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RouteServerEndpoint\": {\n                    \"target\": \"com.amazonaws.ec2#RouteServerEndpoint\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RouteServerEndpoint\",\n                        \"smithy.api#documentation\": \"<p>Information about the deleted route server endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"routeServerEndpoint\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteRouteServerPeer\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeleteRouteServerPeerRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DeleteRouteServerPeerResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the specified BGP peer from a route server.</p>\\n         <p>A route server peer is a session between a route server endpoint and the device deployed in Amazon Web Services (such as a firewall appliance or other network security function running on an EC2 instance). The device must meet these requirements:</p>\\n         <ul>\\n            <li>\\n               <p>Have an elastic network interface in the VPC</p>\\n            </li>\\n            <li>\\n               <p>Support BGP (Border Gateway Protocol)</p>\\n            </li>\\n            <li>\\n               <p>Can initiate BGP sessions</p>\\n            </li>\\n         </ul>\"\n            }\n        },\n        \"com.amazonaws.ec2#DeleteRouteServerPeerRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RouteServerPeerId\": {\n                    \"target\": \"com.amazonaws.ec2#RouteServerPeerId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the route server peer to delete.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A check for whether you have the required permissions for the action without actually making the request \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteRouteServerPeerResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RouteServerPeer\": {\n                    \"target\": \"com.amazonaws.ec2#RouteServerPeer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RouteServerPeer\",\n                        \"smithy.api#documentation\": \"<p>Information about the deleted route server peer.</p>\",\n                        \"smithy.api#xmlName\": \"routeServerPeer\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteRouteServerRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RouteServerId\": {\n                    \"target\": \"com.amazonaws.ec2#RouteServerId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the route server to delete.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A check for whether you have the required permissions for the action without actually making the request \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteRouteServerResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RouteServer\": {\n                    \"target\": \"com.amazonaws.ec2#RouteServer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RouteServer\",\n                        \"smithy.api#documentation\": \"<p>Information about the deleted route server.</p>\",\n                        \"smithy.api#xmlName\": \"routeServer\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteRouteTable\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeleteRouteTableRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the specified route table. You must disassociate the route table from any subnets before you can delete it. You can't delete the main route table.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To delete a route table\",\n                        \"documentation\": \"This example deletes the specified route table.\",\n                        \"input\": {\n                            \"RouteTableId\": \"rtb-22574640\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#DeleteRouteTableRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"RouteTableId\": {\n                    \"target\": \"com.amazonaws.ec2#RouteTableId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RouteTableId\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the route table.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"routeTableId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteSecurityGroup\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeleteSecurityGroupRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DeleteSecurityGroupResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes a security group.</p>\\n         <p>If you attempt to delete a security group that is associated with an instance or network interface, is\\n\\t\\t\\t  referenced by another security group in the same VPC, or has a VPC association, the operation fails with\\n\\t\\t\\t\\t<code>DependencyViolation</code>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To delete a security group\",\n                        \"documentation\": \"This example deletes the specified security group.\",\n                        \"input\": {\n                            \"GroupId\": \"sg-903004f8\"\n                        },\n                        \"output\": {}\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#DeleteSecurityGroupRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"GroupId\": {\n                    \"target\": \"com.amazonaws.ec2#SecurityGroupId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the security group.</p>\"\n                    }\n                },\n                \"GroupName\": {\n                    \"target\": \"com.amazonaws.ec2#SecurityGroupName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>[Default VPC] The name of the security group. You can specify either the\\n            security group name or the security group ID. For security groups in a nondefault VPC,\\n            you must specify the security group ID.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteSecurityGroupResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Return\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Return\",\n                        \"smithy.api#documentation\": \"<p>Returns <code>true</code> if the request succeeds; otherwise, returns an error.</p>\",\n                        \"smithy.api#xmlName\": \"return\"\n                    }\n                },\n                \"GroupId\": {\n                    \"target\": \"com.amazonaws.ec2#SecurityGroupId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"GroupId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the deleted security group.</p>\",\n                        \"smithy.api#xmlName\": \"groupId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteSnapshot\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeleteSnapshotRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the specified snapshot.</p>\\n         <p>When you make periodic snapshots of a volume, the snapshots are incremental, and only the\\n      blocks on the device that have changed since your last snapshot are saved in the new snapshot.\\n      When you delete a snapshot, only the data not needed for any other snapshot is removed. So\\n      regardless of which prior snapshots have been deleted, all active snapshots will have access\\n      to all the information needed to restore the volume.</p>\\n         <p>You cannot delete a snapshot of the root device of an EBS volume used by a registered AMI.\\n      You must first deregister the AMI before you can delete the snapshot.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/ebs/latest/userguide/ebs-deleting-snapshot.html\\\">Delete an Amazon EBS snapshot</a> in the\\n        <i>Amazon EBS User Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To delete a snapshot\",\n                        \"documentation\": \"This example deletes a snapshot with the snapshot ID of ``snap-1234567890abcdef0``. If the command succeeds, no output is returned.\",\n                        \"input\": {\n                            \"SnapshotId\": \"snap-1234567890abcdef0\"\n                        },\n                        \"output\": {}\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#DeleteSnapshotRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SnapshotId\": {\n                    \"target\": \"com.amazonaws.ec2#SnapshotId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the EBS snapshot.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteSnapshotResultSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#DeleteSnapshotReturnCode\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DeleteSnapshotReturnCode\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SnapshotId\": {\n                    \"target\": \"com.amazonaws.ec2#SnapshotId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SnapshotId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the snapshot.</p>\",\n                        \"smithy.api#xmlName\": \"snapshotId\"\n                    }\n                },\n                \"ReturnCode\": {\n                    \"target\": \"com.amazonaws.ec2#SnapshotReturnCodes\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ReturnCode\",\n                        \"smithy.api#documentation\": \"<p>The result code from the snapshot deletion attempt. Possible values:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>success</code> - The snapshot was successfully deleted.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>skipped</code> - The snapshot was not deleted because it's associated with other\\n          AMIs.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>missing-permissions</code> - The snapshot was not deleted because the role lacks\\n            <code>DeleteSnapshot</code> permissions. For more information, see <a href=\\\"https://docs.aws.amazon.com/ebs/latest/userguide/security_iam_service-with-iam.html\\\">How\\n            Amazon EBS works with IAM</a>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>internal-error</code> - The snapshot was not deleted due to a server\\n          error.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>client-error</code> - The snapshot was not deleted due to a client configuration\\n          error.</p>\\n            </li>\\n         </ul>\\n         <p>For details about an error, check the <code>DeleteSnapshot</code> event in the CloudTrail\\n      event history. For more information, see <a href=\\\"https://docs.aws.amazon.com/awscloudtrail/latest/userguide/tutorial-event-history.html\\\">View event history</a>\\n      in the <i>Amazon Web Services CloudTrail User Guide</i>.</p>\",\n                        \"smithy.api#xmlName\": \"returnCode\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The snapshot ID and its deletion result code.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DeleteSpotDatafeedSubscription\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeleteSpotDatafeedSubscriptionRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the data feed for Spot Instances.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To cancel a Spot Instance data feed subscription\",\n                        \"documentation\": \"This example deletes a Spot data feed subscription for the account.\"\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#DeleteSpotDatafeedSubscriptionRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually\\n            making the request, and provides an error response. If you have the required\\n            permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is\\n            <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the parameters for DeleteSpotDatafeedSubscription.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteSubnet\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeleteSubnetRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the specified subnet. You must terminate all running instances in the subnet before you can delete the subnet.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To delete a subnet\",\n                        \"documentation\": \"This example deletes the specified subnet.\",\n                        \"input\": {\n                            \"SubnetId\": \"subnet-9d4a7b6c\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#DeleteSubnetCidrReservation\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeleteSubnetCidrReservationRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DeleteSubnetCidrReservationResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes a subnet CIDR reservation.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DeleteSubnetCidrReservationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SubnetCidrReservationId\": {\n                    \"target\": \"com.amazonaws.ec2#SubnetCidrReservationId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the subnet CIDR reservation.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteSubnetCidrReservationResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DeletedSubnetCidrReservation\": {\n                    \"target\": \"com.amazonaws.ec2#SubnetCidrReservation\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DeletedSubnetCidrReservation\",\n                        \"smithy.api#documentation\": \"<p>Information about the deleted subnet CIDR reservation.</p>\",\n                        \"smithy.api#xmlName\": \"deletedSubnetCidrReservation\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteSubnetRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SubnetId\": {\n                    \"target\": \"com.amazonaws.ec2#SubnetId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the subnet.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteTags\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeleteTagsRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the specified set of tags from the specified set of resources.</p>\\n         <p>To list the current tags, use <a>DescribeTags</a>. For more information about\\n         tags, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Tags.html\\\">Tag\\n            your Amazon EC2 resources</a> in the <i>Amazon Elastic Compute Cloud User\\n            Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To delete a tag from a resource\",\n                        \"documentation\": \"This example deletes the tag Stack=test from the specified image.\",\n                        \"input\": {\n                            \"Resources\": [\n                                \"ami-78a54011\"\n                            ],\n                            \"Tags\": [\n                                {\n                                    \"Key\": \"Stack\",\n                                    \"Value\": \"test\"\n                                }\n                            ]\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#DeleteTagsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"Resources\": {\n                    \"target\": \"com.amazonaws.ec2#ResourceIdList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResourceId\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The IDs of the resources, separated by spaces.</p>\\n         <p>Constraints: Up to 1000 resource IDs. We recommend breaking up this request into smaller batches.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"resourceId\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Tag\",\n                        \"smithy.api#documentation\": \"<p>The tags to delete. Specify a tag key and an optional tag value to delete\\n            specific tags. If you specify a tag key without a tag value, we delete any tag with this\\n            key regardless of its value. If you specify a tag key with an empty string as the tag\\n            value, we delete the tag only if its value is an empty string.</p>\\n         <p>If you omit this parameter, we delete all user-defined tags for the specified\\n            resources. We do not delete Amazon Web Services-generated tags (tags that have the <code>aws:</code>\\n            prefix).</p>\\n         <p>Constraints: Up to 1000 tags.</p>\",\n                        \"smithy.api#xmlName\": \"tag\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteTrafficMirrorFilter\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeleteTrafficMirrorFilterRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DeleteTrafficMirrorFilterResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the specified Traffic Mirror filter.</p>\\n         <p>You cannot delete a Traffic Mirror filter that is in use by a Traffic Mirror session.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DeleteTrafficMirrorFilterRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TrafficMirrorFilterId\": {\n                    \"target\": \"com.amazonaws.ec2#TrafficMirrorFilterId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the Traffic Mirror filter.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteTrafficMirrorFilterResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TrafficMirrorFilterId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TrafficMirrorFilterId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Traffic Mirror filter.</p>\",\n                        \"smithy.api#xmlName\": \"trafficMirrorFilterId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteTrafficMirrorFilterRule\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeleteTrafficMirrorFilterRuleRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DeleteTrafficMirrorFilterRuleResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the specified Traffic Mirror rule.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DeleteTrafficMirrorFilterRuleRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TrafficMirrorFilterRuleId\": {\n                    \"target\": \"com.amazonaws.ec2#TrafficMirrorFilterRuleIdWithResolver\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the Traffic Mirror rule.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteTrafficMirrorFilterRuleResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TrafficMirrorFilterRuleId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TrafficMirrorFilterRuleId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the deleted Traffic Mirror rule.</p>\",\n                        \"smithy.api#xmlName\": \"trafficMirrorFilterRuleId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteTrafficMirrorSession\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeleteTrafficMirrorSessionRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DeleteTrafficMirrorSessionResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the specified Traffic Mirror session.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DeleteTrafficMirrorSessionRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TrafficMirrorSessionId\": {\n                    \"target\": \"com.amazonaws.ec2#TrafficMirrorSessionId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the Traffic Mirror session.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteTrafficMirrorSessionResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TrafficMirrorSessionId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TrafficMirrorSessionId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the deleted Traffic Mirror session.</p>\",\n                        \"smithy.api#xmlName\": \"trafficMirrorSessionId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteTrafficMirrorTarget\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeleteTrafficMirrorTargetRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DeleteTrafficMirrorTargetResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the specified Traffic Mirror target.</p>\\n         <p>You cannot delete a Traffic Mirror target that is in use by a Traffic Mirror session.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DeleteTrafficMirrorTargetRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TrafficMirrorTargetId\": {\n                    \"target\": \"com.amazonaws.ec2#TrafficMirrorTargetId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the Traffic Mirror target.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteTrafficMirrorTargetResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TrafficMirrorTargetId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TrafficMirrorTargetId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the deleted Traffic Mirror target.</p>\",\n                        \"smithy.api#xmlName\": \"trafficMirrorTargetId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteTransitGateway\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeleteTransitGatewayRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DeleteTransitGatewayResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the specified transit gateway.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DeleteTransitGatewayConnect\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeleteTransitGatewayConnectRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DeleteTransitGatewayConnectResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the specified Connect attachment. You must first delete any Connect peers for\\n            the attachment.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DeleteTransitGatewayConnectPeer\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeleteTransitGatewayConnectPeerRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DeleteTransitGatewayConnectPeerResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the specified Connect peer.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DeleteTransitGatewayConnectPeerRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayConnectPeerId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayConnectPeerId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the Connect peer.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteTransitGatewayConnectPeerResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayConnectPeer\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayConnectPeer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayConnectPeer\",\n                        \"smithy.api#documentation\": \"<p>Information about the deleted Connect peer.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayConnectPeer\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteTransitGatewayConnectRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayAttachmentId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayAttachmentId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the Connect attachment.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteTransitGatewayConnectResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayConnect\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayConnect\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayConnect\",\n                        \"smithy.api#documentation\": \"<p>Information about the deleted Connect attachment.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayConnect\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteTransitGatewayMulticastDomain\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeleteTransitGatewayMulticastDomainRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DeleteTransitGatewayMulticastDomainResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the specified transit gateway multicast domain.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DeleteTransitGatewayMulticastDomainRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayMulticastDomainId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayMulticastDomainId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the transit gateway multicast domain.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteTransitGatewayMulticastDomainResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayMulticastDomain\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayMulticastDomain\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayMulticastDomain\",\n                        \"smithy.api#documentation\": \"<p>Information about the deleted transit gateway multicast domain.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayMulticastDomain\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteTransitGatewayPeeringAttachment\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeleteTransitGatewayPeeringAttachmentRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DeleteTransitGatewayPeeringAttachmentResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes a transit gateway peering attachment.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DeleteTransitGatewayPeeringAttachmentRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayAttachmentId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayAttachmentId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the transit gateway peering attachment.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteTransitGatewayPeeringAttachmentResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayPeeringAttachment\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayPeeringAttachment\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayPeeringAttachment\",\n                        \"smithy.api#documentation\": \"<p>The transit gateway peering attachment.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayPeeringAttachment\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteTransitGatewayPolicyTable\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeleteTransitGatewayPolicyTableRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DeleteTransitGatewayPolicyTableResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the specified transit gateway policy table.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DeleteTransitGatewayPolicyTableRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayPolicyTableId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayPolicyTableId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The transit gateway policy table to delete.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteTransitGatewayPolicyTableResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayPolicyTable\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayPolicyTable\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayPolicyTable\",\n                        \"smithy.api#documentation\": \"<p>Provides details about the deleted transit gateway policy table.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayPolicyTable\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteTransitGatewayPrefixListReference\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeleteTransitGatewayPrefixListReferenceRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DeleteTransitGatewayPrefixListReferenceResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes a reference (route) to a prefix list in a specified transit gateway route table.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DeleteTransitGatewayPrefixListReferenceRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayRouteTableId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayRouteTableId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the route table.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"PrefixListId\": {\n                    \"target\": \"com.amazonaws.ec2#PrefixListResourceId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the prefix list.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteTransitGatewayPrefixListReferenceResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayPrefixListReference\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayPrefixListReference\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayPrefixListReference\",\n                        \"smithy.api#documentation\": \"<p>Information about the deleted prefix list reference.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayPrefixListReference\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteTransitGatewayRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the transit gateway.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteTransitGatewayResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGateway\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGateway\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGateway\",\n                        \"smithy.api#documentation\": \"<p>Information about the deleted transit gateway.</p>\",\n                        \"smithy.api#xmlName\": \"transitGateway\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteTransitGatewayRoute\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeleteTransitGatewayRouteRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DeleteTransitGatewayRouteResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the specified route from the specified transit gateway route table.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DeleteTransitGatewayRouteRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayRouteTableId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayRouteTableId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the transit gateway route table.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DestinationCidrBlock\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The CIDR range for the route. This must match the CIDR for the route exactly.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteTransitGatewayRouteResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Route\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayRoute\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Route\",\n                        \"smithy.api#documentation\": \"<p>Information about the route.</p>\",\n                        \"smithy.api#xmlName\": \"route\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteTransitGatewayRouteTable\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeleteTransitGatewayRouteTableRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DeleteTransitGatewayRouteTableResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the specified transit gateway route table. If there are any route tables associated with\\n         the transit gateway route table, you must first run <a>DisassociateRouteTable</a> before you can delete the transit gateway route table. This removes any route tables associated with the transit gateway route table.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DeleteTransitGatewayRouteTableAnnouncement\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeleteTransitGatewayRouteTableAnnouncementRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DeleteTransitGatewayRouteTableAnnouncementResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Advertises to the transit gateway that a transit gateway route table is deleted.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DeleteTransitGatewayRouteTableAnnouncementRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayRouteTableAnnouncementId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayRouteTableAnnouncementId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The transit gateway route table ID that's being deleted. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteTransitGatewayRouteTableAnnouncementResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayRouteTableAnnouncement\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayRouteTableAnnouncement\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayRouteTableAnnouncement\",\n                        \"smithy.api#documentation\": \"<p>Provides details about a deleted transit gateway route table.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayRouteTableAnnouncement\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteTransitGatewayRouteTableRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayRouteTableId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayRouteTableId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the transit gateway route table.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteTransitGatewayRouteTableResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayRouteTable\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayRouteTable\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayRouteTable\",\n                        \"smithy.api#documentation\": \"<p>Information about the deleted transit gateway route table.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayRouteTable\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteTransitGatewayVpcAttachment\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeleteTransitGatewayVpcAttachmentRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DeleteTransitGatewayVpcAttachmentResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the specified VPC attachment.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DeleteTransitGatewayVpcAttachmentRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayAttachmentId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayAttachmentId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the attachment.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteTransitGatewayVpcAttachmentResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayVpcAttachment\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayVpcAttachment\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayVpcAttachment\",\n                        \"smithy.api#documentation\": \"<p>Information about the deleted VPC attachment.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayVpcAttachment\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteVerifiedAccessEndpoint\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeleteVerifiedAccessEndpointRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DeleteVerifiedAccessEndpointResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Delete an Amazon Web Services Verified Access endpoint.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DeleteVerifiedAccessEndpointRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VerifiedAccessEndpointId\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessEndpointId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the Verified Access endpoint.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A unique, case-sensitive token that you provide to ensure idempotency of your\\n            modification request. For more information, see <a href=\\\"https://docs.aws.amazon.com/ec2/latest/devguide/ec2-api-idempotency.html\\\">Ensuring idempotency</a>.</p>\",\n                        \"smithy.api#idempotencyToken\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteVerifiedAccessEndpointResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VerifiedAccessEndpoint\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessEndpoint\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VerifiedAccessEndpoint\",\n                        \"smithy.api#documentation\": \"<p>Details about the Verified Access endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"verifiedAccessEndpoint\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteVerifiedAccessGroup\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeleteVerifiedAccessGroupRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DeleteVerifiedAccessGroupResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Delete an Amazon Web Services Verified Access group.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DeleteVerifiedAccessGroupRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VerifiedAccessGroupId\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessGroupId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the Verified Access group.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A unique, case-sensitive token that you provide to ensure idempotency of your\\n            modification request. For more information, see <a href=\\\"https://docs.aws.amazon.com/ec2/latest/devguide/ec2-api-idempotency.html\\\">Ensuring idempotency</a>.</p>\",\n                        \"smithy.api#idempotencyToken\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteVerifiedAccessGroupResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VerifiedAccessGroup\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessGroup\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VerifiedAccessGroup\",\n                        \"smithy.api#documentation\": \"<p>Details about the Verified Access group.</p>\",\n                        \"smithy.api#xmlName\": \"verifiedAccessGroup\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteVerifiedAccessInstance\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeleteVerifiedAccessInstanceRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DeleteVerifiedAccessInstanceResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Delete an Amazon Web Services Verified Access instance.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DeleteVerifiedAccessInstanceRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VerifiedAccessInstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessInstanceId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the Verified Access instance.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A unique, case-sensitive token that you provide to ensure idempotency of your\\n            modification request. For more information, see <a href=\\\"https://docs.aws.amazon.com/ec2/latest/devguide/ec2-api-idempotency.html\\\">Ensuring idempotency</a>.</p>\",\n                        \"smithy.api#idempotencyToken\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteVerifiedAccessInstanceResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VerifiedAccessInstance\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessInstance\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VerifiedAccessInstance\",\n                        \"smithy.api#documentation\": \"<p>Details about the Verified Access instance.</p>\",\n                        \"smithy.api#xmlName\": \"verifiedAccessInstance\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteVerifiedAccessTrustProvider\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeleteVerifiedAccessTrustProviderRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DeleteVerifiedAccessTrustProviderResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Delete an Amazon Web Services Verified Access trust provider.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DeleteVerifiedAccessTrustProviderRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VerifiedAccessTrustProviderId\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessTrustProviderId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the Verified Access trust provider.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A unique, case-sensitive token that you provide to ensure idempotency of your\\n            modification request. For more information, see <a href=\\\"https://docs.aws.amazon.com/ec2/latest/devguide/ec2-api-idempotency.html\\\">Ensuring idempotency</a>.</p>\",\n                        \"smithy.api#idempotencyToken\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteVerifiedAccessTrustProviderResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VerifiedAccessTrustProvider\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessTrustProvider\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VerifiedAccessTrustProvider\",\n                        \"smithy.api#documentation\": \"<p>Details about the Verified Access trust provider.</p>\",\n                        \"smithy.api#xmlName\": \"verifiedAccessTrustProvider\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteVolume\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeleteVolumeRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the specified EBS volume. The volume must be in the <code>available</code> state\\n      (not attached to an instance).</p>\\n         <p>The volume can remain in the <code>deleting</code> state for several minutes.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/ebs/latest/userguide/ebs-deleting-volume.html\\\">Delete an Amazon EBS volume</a> in the\\n        <i>Amazon EBS User Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To delete a volume\",\n                        \"documentation\": \"This example deletes an available volume with the volume ID of ``vol-049df61146c4d7901``. If the command succeeds, no output is returned.\",\n                        \"input\": {\n                            \"VolumeId\": \"vol-049df61146c4d7901\"\n                        },\n                        \"output\": {}\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#DeleteVolumeRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VolumeId\": {\n                    \"target\": \"com.amazonaws.ec2#VolumeId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the volume.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteVpc\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeleteVpcRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the specified VPC. You must detach or delete all gateways and resources that are associated \\n\\t\\t  with the VPC before you can delete it. For example, you must terminate all instances running in the VPC, \\n\\t\\t  delete all security groups associated with the VPC (except the default one), delete all route tables \\n\\t\\t  associated with the VPC (except the default one), and so on. When you delete the VPC, it deletes the \\n\\t\\t  default security group, network ACL, and route table for the VPC.</p>\\n         <p>If you created a flow log for the VPC that you are deleting, note that flow logs for deleted \\n          VPCs are eventually automatically removed.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To delete a VPC\",\n                        \"documentation\": \"This example deletes the specified VPC.\",\n                        \"input\": {\n                            \"VpcId\": \"vpc-a01106c2\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#DeleteVpcBlockPublicAccessExclusion\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeleteVpcBlockPublicAccessExclusionRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DeleteVpcBlockPublicAccessExclusionResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Delete a VPC Block Public Access (BPA) exclusion. A VPC BPA exclusion is a mode that can be applied to a single VPC or subnet that exempts it from the account’s BPA mode and will allow bidirectional or egress-only access. You can create BPA exclusions for VPCs and subnets even when BPA is not enabled on the account to ensure that there is no traffic disruption to the exclusions when VPC BPA is turned on. To learn more about VPC BPA, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/userguide/security-vpc-bpa.html\\\">Block public access to VPCs and subnets</a> in the <i>Amazon VPC User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DeleteVpcBlockPublicAccessExclusionRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"ExclusionId\": {\n                    \"target\": \"com.amazonaws.ec2#VpcBlockPublicAccessExclusionId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the exclusion.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteVpcBlockPublicAccessExclusionResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VpcBlockPublicAccessExclusion\": {\n                    \"target\": \"com.amazonaws.ec2#VpcBlockPublicAccessExclusion\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcBlockPublicAccessExclusion\",\n                        \"smithy.api#documentation\": \"<p>Details about an exclusion.</p>\",\n                        \"smithy.api#xmlName\": \"vpcBlockPublicAccessExclusion\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteVpcEndpointConnectionNotifications\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeleteVpcEndpointConnectionNotificationsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DeleteVpcEndpointConnectionNotificationsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the specified VPC endpoint connection notifications.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DeleteVpcEndpointConnectionNotificationsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"ConnectionNotificationIds\": {\n                    \"target\": \"com.amazonaws.ec2#ConnectionNotificationIdsList\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The IDs of the notifications.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"ConnectionNotificationId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteVpcEndpointConnectionNotificationsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Unsuccessful\": {\n                    \"target\": \"com.amazonaws.ec2#UnsuccessfulItemSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Unsuccessful\",\n                        \"smithy.api#documentation\": \"<p>Information about the notifications that could not be deleted\\n            successfully.</p>\",\n                        \"smithy.api#xmlName\": \"unsuccessful\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteVpcEndpointServiceConfigurations\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeleteVpcEndpointServiceConfigurationsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DeleteVpcEndpointServiceConfigurationsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the specified VPC endpoint service configurations. Before you can delete\\n            an endpoint service configuration, you must reject any <code>Available</code> or\\n            <code>PendingAcceptance</code> interface endpoint connections that are attached to\\n            the service.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DeleteVpcEndpointServiceConfigurationsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"ServiceIds\": {\n                    \"target\": \"com.amazonaws.ec2#VpcEndpointServiceIdList\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The IDs of the services.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"ServiceId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteVpcEndpointServiceConfigurationsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Unsuccessful\": {\n                    \"target\": \"com.amazonaws.ec2#UnsuccessfulItemSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Unsuccessful\",\n                        \"smithy.api#documentation\": \"<p>Information about the service configurations that were not deleted, if\\n            applicable.</p>\",\n                        \"smithy.api#xmlName\": \"unsuccessful\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteVpcEndpoints\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeleteVpcEndpointsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DeleteVpcEndpointsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the specified VPC endpoints.</p>\\n         <p>When you delete a gateway endpoint, we delete the endpoint routes in the route tables for the endpoint.</p>\\n         <p>When you delete a Gateway Load Balancer endpoint, we delete its endpoint network interfaces. \\n          You can only delete Gateway Load Balancer endpoints when the routes that are associated with the endpoint are deleted.</p>\\n         <p>When you delete an interface endpoint, we delete its endpoint network interfaces.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DeleteVpcEndpointsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"VpcEndpointIds\": {\n                    \"target\": \"com.amazonaws.ec2#VpcEndpointIdList\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The IDs of the VPC endpoints.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"VpcEndpointId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteVpcEndpointsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Unsuccessful\": {\n                    \"target\": \"com.amazonaws.ec2#UnsuccessfulItemSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Unsuccessful\",\n                        \"smithy.api#documentation\": \"<p>Information about the VPC endpoints that were not successfully deleted.</p>\",\n                        \"smithy.api#xmlName\": \"unsuccessful\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteVpcPeeringConnection\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeleteVpcPeeringConnectionRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DeleteVpcPeeringConnectionResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes a VPC peering connection. Either the owner of the requester VPC or the owner\\n            of the accepter VPC can delete the VPC peering connection if it's in the\\n                <code>active</code> state. The owner of the requester VPC can delete a VPC peering\\n            connection in the <code>pending-acceptance</code> state. You cannot delete a VPC peering\\n          connection that's in the <code>failed</code> or <code>rejected</code> state.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DeleteVpcPeeringConnectionRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"VpcPeeringConnectionId\": {\n                    \"target\": \"com.amazonaws.ec2#VpcPeeringConnectionId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcPeeringConnectionId\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the VPC peering connection.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"vpcPeeringConnectionId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteVpcPeeringConnectionResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Return\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Return\",\n                        \"smithy.api#documentation\": \"<p>Returns <code>true</code> if the request succeeds; otherwise, it returns an error.</p>\",\n                        \"smithy.api#xmlName\": \"return\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteVpcRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VpcId\": {\n                    \"target\": \"com.amazonaws.ec2#VpcId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the VPC.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteVpnConnection\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeleteVpnConnectionRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the specified VPN connection.</p>\\n         <p>If you're deleting the VPC and its associated components, we recommend that you detach\\n            the virtual private gateway from the VPC and delete the VPC before deleting the VPN\\n            connection. If you believe that the tunnel credentials for your VPN connection have been\\n            compromised, you can delete the VPN connection and create a new one that has new keys,\\n            without needing to delete the VPC or virtual private gateway. If you create a new VPN\\n            connection, you must reconfigure the customer gateway device using the new configuration\\n            information returned with the new VPN connection ID.</p>\\n         <p>For certificate-based authentication, delete all Certificate Manager (ACM) private\\n            certificates used for the Amazon Web Services-side tunnel endpoints for the VPN\\n            connection before deleting the VPN connection.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DeleteVpnConnectionRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VpnConnectionId\": {\n                    \"target\": \"com.amazonaws.ec2#VpnConnectionId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the VPN connection.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually\\n            making the request, and provides an error response. If you have the required\\n            permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is\\n                <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the parameters for DeleteVpnConnection.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteVpnConnectionRoute\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeleteVpnConnectionRouteRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the specified static route associated with a VPN connection between an\\n            existing virtual private gateway and a VPN customer gateway. The static route allows\\n            traffic to be routed from the virtual private gateway to the VPN customer\\n            gateway.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DeleteVpnConnectionRouteRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DestinationCidrBlock\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The CIDR block associated with the local subnet of the customer network.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"VpnConnectionId\": {\n                    \"target\": \"com.amazonaws.ec2#VpnConnectionId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the VPN connection.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the parameters for DeleteVpnConnectionRoute.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeleteVpnGateway\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeleteVpnGatewayRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the specified virtual private gateway. You must first detach the virtual\\n            private gateway from the VPC. Note that you don't need to delete the virtual private\\n            gateway if you plan to delete and recreate the VPN connection between your VPC and your\\n            network.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DeleteVpnGatewayRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VpnGatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#VpnGatewayId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the virtual private gateway.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually\\n            making the request, and provides an error response. If you have the required\\n            permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is\\n                <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the parameters for DeleteVpnGateway.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeprecationTimeCondition\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"MaximumDaysSinceDeprecated\": {\n                    \"target\": \"com.amazonaws.ec2#MaximumDaysSinceDeprecatedValue\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MaximumDaysSinceDeprecated\",\n                        \"smithy.api#documentation\": \"<p>The maximum number of days that have elapsed since the image was deprecated. When set to\\n      <code>0</code>, no deprecated images are allowed.</p>\",\n                        \"smithy.api#xmlName\": \"maximumDaysSinceDeprecated\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The maximum period since deprecation for allowed images.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DeprecationTimeConditionRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"MaximumDaysSinceDeprecated\": {\n                    \"target\": \"com.amazonaws.ec2#MaximumDaysSinceDeprecatedValue\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of days that have elapsed since the image was deprecated. Set to\\n      <code>0</code> to exclude all deprecated images.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The maximum period since deprecation for allowed images.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DeprovisionByoipCidr\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeprovisionByoipCidrRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DeprovisionByoipCidrResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Releases the specified address range that you provisioned for use with your Amazon Web Services resources\\n         through bring your own IP addresses (BYOIP) and deletes the corresponding address pool.</p>\\n         <p>Before you can release an address range, you must stop advertising it and you must not \\n          have any IP addresses allocated from its address range.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DeprovisionByoipCidrRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Cidr\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The address range, in CIDR notation. The prefix must be the same prefix \\n         that you specified when you provisioned the address range.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeprovisionByoipCidrResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ByoipCidr\": {\n                    \"target\": \"com.amazonaws.ec2#ByoipCidr\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ByoipCidr\",\n                        \"smithy.api#documentation\": \"<p>Information about the address range.</p>\",\n                        \"smithy.api#xmlName\": \"byoipCidr\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeprovisionIpamByoasn\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeprovisionIpamByoasnRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DeprovisionIpamByoasnResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deprovisions your Autonomous System Number (ASN) from your Amazon Web Services account. This action can only be called after any BYOIP CIDR associations are removed from your Amazon Web Services account with <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DisassociateIpamByoasn.html\\\">DisassociateIpamByoasn</a>.\\n            For more information, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/ipam/tutorials-byoasn.html\\\">Tutorial: Bring your ASN to IPAM</a> in the <i>Amazon VPC IPAM guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DeprovisionIpamByoasnRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"IpamId\": {\n                    \"target\": \"com.amazonaws.ec2#IpamId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The IPAM ID.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Asn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>An ASN.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeprovisionIpamByoasnResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Byoasn\": {\n                    \"target\": \"com.amazonaws.ec2#Byoasn\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Byoasn\",\n                        \"smithy.api#documentation\": \"<p>An ASN and BYOIP CIDR association.</p>\",\n                        \"smithy.api#xmlName\": \"byoasn\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeprovisionIpamPoolCidr\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeprovisionIpamPoolCidrRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DeprovisionIpamPoolCidrResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deprovision a CIDR provisioned from an IPAM pool. If you deprovision a CIDR from a pool that has a source pool, the CIDR is recycled back into the source pool. For more information, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/ipam/depro-pool-cidr-ipam.html\\\">Deprovision pool CIDRs</a> in the <i>Amazon VPC IPAM User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DeprovisionIpamPoolCidrRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A check for whether you have the required permissions for the action without actually making the request \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"IpamPoolId\": {\n                    \"target\": \"com.amazonaws.ec2#IpamPoolId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the pool that has the CIDR you want to deprovision.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Cidr\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The CIDR which you want to deprovision from the pool.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeprovisionIpamPoolCidrResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"IpamPoolCidr\": {\n                    \"target\": \"com.amazonaws.ec2#IpamPoolCidr\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpamPoolCidr\",\n                        \"smithy.api#documentation\": \"<p>The deprovisioned pool CIDR.</p>\",\n                        \"smithy.api#xmlName\": \"ipamPoolCidr\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeprovisionPublicIpv4PoolCidr\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeprovisionPublicIpv4PoolCidrRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DeprovisionPublicIpv4PoolCidrResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deprovision a CIDR from a public IPv4 pool.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DeprovisionPublicIpv4PoolCidrRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A check for whether you have the required permissions for the action without actually making the request \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"PoolId\": {\n                    \"target\": \"com.amazonaws.ec2#Ipv4PoolEc2Id\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the pool that you want to deprovision the CIDR from.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Cidr\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The CIDR you want to deprovision from the pool.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeprovisionPublicIpv4PoolCidrResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PoolId\": {\n                    \"target\": \"com.amazonaws.ec2#Ipv4PoolEc2Id\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PoolId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the pool that you deprovisioned the CIDR from.</p>\",\n                        \"smithy.api#xmlName\": \"poolId\"\n                    }\n                },\n                \"DeprovisionedAddresses\": {\n                    \"target\": \"com.amazonaws.ec2#DeprovisionedAddressSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DeprovisionedAddressSet\",\n                        \"smithy.api#documentation\": \"<p>The deprovisioned CIDRs.</p>\",\n                        \"smithy.api#xmlName\": \"deprovisionedAddressSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeprovisionedAddressSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#String\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DeregisterImage\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeregisterImageRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DeregisterImageResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deregisters the specified AMI. A deregistered AMI can't be used to launch new\\n      instances.</p>\\n         <p>If a deregistered EBS-backed AMI matches a Recycle Bin retention rule, it moves to the\\n      Recycle Bin for the specified retention period. It can be restored before its retention period\\n      expires, after which it is permanently deleted. If the deregistered AMI doesn't match a\\n      retention rule, it is permanently deleted immediately. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/recycle-bin.html\\\">Recover deleted Amazon EBS\\n        snapshots and EBS-backed AMIs with Recycle Bin</a> in the <i>Amazon EBS User\\n        Guide</i>.</p>\\n         <p>When deregistering an EBS-backed AMI, you can optionally delete its associated snapshots\\n      at the same time. However, if a snapshot is associated with multiple AMIs, it won't be deleted\\n      even if specified for deletion, although the AMI will still be deregistered.</p>\\n         <p>Deregistering an AMI does not delete the following:</p>\\n         <ul>\\n            <li>\\n               <p>Instances already launched from the AMI. You'll continue to incur usage costs for the\\n          instances until you terminate them.</p>\\n            </li>\\n            <li>\\n               <p>For EBS-backed AMIs: Snapshots that are associated with multiple AMIs. You'll continue\\n          to incur snapshot storage costs.</p>\\n            </li>\\n            <li>\\n               <p>For instance store-backed AMIs: The files uploaded to Amazon S3 during AMI creation. You'll\\n          continue to incur S3 storage costs.</p>\\n            </li>\\n         </ul>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/deregister-ami.html\\\">Deregister an Amazon EC2 AMI</a> in the\\n        <i>Amazon EC2 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DeregisterImageRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ImageId\": {\n                    \"target\": \"com.amazonaws.ec2#ImageId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the AMI.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DeleteAssociatedSnapshots\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies whether to delete the snapshots associated with the AMI during\\n      deregistration.</p>\\n         <note>\\n            <p>If a snapshot is associated with multiple AMIs, it is not deleted, regardless of this setting.</p>\\n         </note>\\n         <p>Default: The snapshots are not deleted.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n\\t\\t\\tand provides an error response. If you have the required permissions, the error response is \\n\\t\\t\\t<code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the parameters for DeregisterImage.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeregisterImageResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Return\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Return\",\n                        \"smithy.api#documentation\": \"<p>Returns <code>true</code> if the request succeeds; otherwise, it returns an error.</p>\",\n                        \"smithy.api#xmlName\": \"return\"\n                    }\n                },\n                \"DeleteSnapshotResults\": {\n                    \"target\": \"com.amazonaws.ec2#DeleteSnapshotResultSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DeleteSnapshotResultSet\",\n                        \"smithy.api#documentation\": \"<p>The deletion result for each snapshot associated with the AMI, including the snapshot ID\\n      and its success or error code.</p>\",\n                        \"smithy.api#xmlName\": \"deleteSnapshotResultSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeregisterInstanceEventNotificationAttributes\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeregisterInstanceEventNotificationAttributesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DeregisterInstanceEventNotificationAttributesResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deregisters tag keys to prevent tags that have the specified tag keys from being\\n         included in scheduled event notifications for resources in the Region.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DeregisterInstanceEventNotificationAttributesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"InstanceTagAttribute\": {\n                    \"target\": \"com.amazonaws.ec2#DeregisterInstanceTagAttributeRequest\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>Information about the tag keys to deregister.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeregisterInstanceEventNotificationAttributesResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceTagAttribute\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceTagNotificationAttribute\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceTagAttribute\",\n                        \"smithy.api#documentation\": \"<p>The resulting set of tag keys.</p>\",\n                        \"smithy.api#xmlName\": \"instanceTagAttribute\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeregisterInstanceTagAttributeRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"IncludeAllTagsOfInstance\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether to deregister all tag keys in the current Region. Specify\\n            <code>false</code> to deregister all tag keys.</p>\"\n                    }\n                },\n                \"InstanceTagKeys\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceTagKeySet\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Information about the tag keys to deregister.</p>\",\n                        \"smithy.api#xmlName\": \"InstanceTagKey\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about the tag keys to deregister for the current Region. You can either\\n         specify individual tag keys or deregister all tag keys in the current Region. You must\\n         specify either <code>IncludeAllTagsOfInstance</code> or <code>InstanceTagKeys</code> in the\\n         request</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DeregisterTransitGatewayMulticastGroupMembers\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeregisterTransitGatewayMulticastGroupMembersRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DeregisterTransitGatewayMulticastGroupMembersResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deregisters the specified members (network interfaces) from the  transit gateway multicast group.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DeregisterTransitGatewayMulticastGroupMembersRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayMulticastDomainId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayMulticastDomainId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the transit gateway multicast domain.</p>\"\n                    }\n                },\n                \"GroupIpAddress\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IP address assigned to the  transit gateway multicast group.</p>\"\n                    }\n                },\n                \"NetworkInterfaceIds\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayNetworkInterfaceIdList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the group members' network interfaces.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeregisterTransitGatewayMulticastGroupMembersResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DeregisteredMulticastGroupMembers\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayMulticastDeregisteredGroupMembers\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DeregisteredMulticastGroupMembers\",\n                        \"smithy.api#documentation\": \"<p>Information about the deregistered members.</p>\",\n                        \"smithy.api#xmlName\": \"deregisteredMulticastGroupMembers\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeregisterTransitGatewayMulticastGroupSources\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DeregisterTransitGatewayMulticastGroupSourcesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DeregisterTransitGatewayMulticastGroupSourcesResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deregisters the specified sources (network interfaces) from the  transit gateway multicast group.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DeregisterTransitGatewayMulticastGroupSourcesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayMulticastDomainId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayMulticastDomainId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the transit gateway multicast domain.</p>\"\n                    }\n                },\n                \"GroupIpAddress\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IP address assigned to the  transit gateway multicast group.</p>\"\n                    }\n                },\n                \"NetworkInterfaceIds\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayNetworkInterfaceIdList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the group sources' network interfaces.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeregisterTransitGatewayMulticastGroupSourcesResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DeregisteredMulticastGroupSources\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayMulticastDeregisteredGroupSources\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DeregisteredMulticastGroupSources\",\n                        \"smithy.api#documentation\": \"<p>Information about the deregistered group sources.</p>\",\n                        \"smithy.api#xmlName\": \"deregisteredMulticastGroupSources\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeAccountAttributes\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeAccountAttributesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeAccountAttributesResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes attributes of your Amazon Web Services account. The following are the supported account attributes:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>default-vpc</code>: The ID of the default VPC for your account, or <code>none</code>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>max-instances</code>: This attribute is no longer supported. The returned\\n                    value does not reflect your actual vCPU limit for running On-Demand Instances.\\n                    For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-on-demand-instances.html#ec2-on-demand-instances-limits\\\">On-Demand Instance Limits</a> in the\\n                        <i>Amazon Elastic Compute Cloud User Guide</i>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>max-elastic-ips</code>: The maximum number of Elastic IP addresses that you can allocate.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>supported-platforms</code>: This attribute is deprecated.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>vpc-max-elastic-ips</code>: The maximum number of Elastic IP addresses that you can allocate.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>vpc-max-security-groups-per-interface</code>: The maximum number of security groups\\n                  that you can assign to a network interface.</p>\\n            </li>\\n         </ul>\\n         <note>\\n            <p>The order of the elements in the response, including those within nested\\n         structures, might vary. Applications should not assume the elements appear in a\\n         particular order.</p>\\n         </note>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To describe a single attribute for your AWS account\",\n                        \"documentation\": \"This example describes the supported-platforms attribute for your AWS account.\",\n                        \"input\": {\n                            \"AttributeNames\": [\n                                \"supported-platforms\"\n                            ]\n                        },\n                        \"output\": {\n                            \"AccountAttributes\": [\n                                {\n                                    \"AttributeName\": \"supported-platforms\",\n                                    \"AttributeValues\": [\n                                        {\n                                            \"AttributeValue\": \"EC2\"\n                                        },\n                                        {\n                                            \"AttributeValue\": \"VPC\"\n                                        }\n                                    ]\n                                }\n                            ]\n                        }\n                    },\n                    {\n                        \"title\": \"To describe all attributes for your AWS account\",\n                        \"documentation\": \"This example describes the attributes for your AWS account.\",\n                        \"output\": {\n                            \"AccountAttributes\": [\n                                {\n                                    \"AttributeName\": \"supported-platforms\",\n                                    \"AttributeValues\": [\n                                        {\n                                            \"AttributeValue\": \"EC2\"\n                                        },\n                                        {\n                                            \"AttributeValue\": \"VPC\"\n                                        }\n                                    ]\n                                },\n                                {\n                                    \"AttributeName\": \"vpc-max-security-groups-per-interface\",\n                                    \"AttributeValues\": [\n                                        {\n                                            \"AttributeValue\": \"5\"\n                                        }\n                                    ]\n                                },\n                                {\n                                    \"AttributeName\": \"max-elastic-ips\",\n                                    \"AttributeValues\": [\n                                        {\n                                            \"AttributeValue\": \"5\"\n                                        }\n                                    ]\n                                },\n                                {\n                                    \"AttributeName\": \"max-instances\",\n                                    \"AttributeValues\": [\n                                        {\n                                            \"AttributeValue\": \"20\"\n                                        }\n                                    ]\n                                },\n                                {\n                                    \"AttributeName\": \"vpc-max-elastic-ips\",\n                                    \"AttributeValues\": [\n                                        {\n                                            \"AttributeValue\": \"5\"\n                                        }\n                                    ]\n                                },\n                                {\n                                    \"AttributeName\": \"default-vpc\",\n                                    \"AttributeValues\": [\n                                        {\n                                            \"AttributeValue\": \"none\"\n                                        }\n                                    ]\n                                }\n                            ]\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#DescribeAccountAttributesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n           and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n           Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"AttributeNames\": {\n                    \"target\": \"com.amazonaws.ec2#AccountAttributeNameStringList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AttributeName\",\n                        \"smithy.api#documentation\": \"<p>The account attribute names.</p>\",\n                        \"smithy.api#xmlName\": \"attributeName\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeAccountAttributesResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountAttributes\": {\n                    \"target\": \"com.amazonaws.ec2#AccountAttributeList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AccountAttributeSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the account attributes.</p>\",\n                        \"smithy.api#xmlName\": \"accountAttributeSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeAddressTransfers\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeAddressTransfersRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeAddressTransfersResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes an Elastic IP address transfer. For more information, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/userguide/vpc-eips.html#transfer-EIPs-intro\\\">Transfer Elastic IP addresses</a> in the <i>Amazon VPC User Guide</i>.</p>\\n         <p>When you transfer an Elastic IP address, there is a two-step handshake\\n      between the source and transfer Amazon Web Services accounts. When the source account starts the transfer,\\n      the transfer account has seven days to accept the Elastic IP address\\n      transfer. During those seven days, the source account can view the\\n      pending transfer by using this action. After seven days, the\\n      transfer expires and ownership of the Elastic IP\\n      address returns to the source\\n      account. Accepted transfers are visible to the source account for 14 days\\n        after the transfers have been accepted.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"AddressTransfers\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeAddressTransfersMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 5,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeAddressTransfersRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AllocationIds\": {\n                    \"target\": \"com.amazonaws.ec2#AllocationIdList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The allocation IDs of Elastic IP addresses.</p>\",\n                        \"smithy.api#xmlName\": \"AllocationId\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify the pagination token from a previous request to retrieve the next page of results.</p>\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#DescribeAddressTransfersMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of address transfers to return in one page of results.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeAddressTransfersResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AddressTransfers\": {\n                    \"target\": \"com.amazonaws.ec2#AddressTransferList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AddressTransferSet\",\n                        \"smithy.api#documentation\": \"<p>The Elastic IP address transfer.</p>\",\n                        \"smithy.api#xmlName\": \"addressTransferSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>Specify the pagination token from a previous request to retrieve the next page of results.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeAddresses\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeAddressesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeAddressesResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the specified Elastic IP addresses or all of your Elastic IP addresses.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To describe your Elastic IP addresses\",\n                        \"documentation\": \"This example describes your Elastic IP addresses.\",\n                        \"output\": {\n                            \"Addresses\": [\n                                {\n                                    \"InstanceId\": \"i-1234567890abcdef0\",\n                                    \"PublicIp\": \"198.51.100.0\",\n                                    \"Domain\": \"standard\"\n                                },\n                                {\n                                    \"Domain\": \"vpc\",\n                                    \"InstanceId\": \"i-1234567890abcdef0\",\n                                    \"NetworkInterfaceId\": \"eni-12345678\",\n                                    \"AssociationId\": \"eipassoc-12345678\",\n                                    \"NetworkInterfaceOwnerId\": \"123456789012\",\n                                    \"PublicIp\": \"203.0.113.0\",\n                                    \"AllocationId\": \"eipalloc-12345678\",\n                                    \"PrivateIpAddress\": \"10.0.1.241\"\n                                }\n                            ]\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#DescribeAddressesAttribute\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeAddressesAttributeRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeAddressesAttributeResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the attributes of the specified Elastic IP addresses. For requirements, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/elastic-ip-addresses-eip.html#Using_Elastic_Addressing_Reverse_DNS\\\">Using reverse DNS for email applications</a>.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"Addresses\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeAddressesAttributeRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AllocationIds\": {\n                    \"target\": \"com.amazonaws.ec2#AllocationIds\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>[EC2-VPC] The allocation IDs.</p>\",\n                        \"smithy.api#xmlName\": \"AllocationId\"\n                    }\n                },\n                \"Attribute\": {\n                    \"target\": \"com.amazonaws.ec2#AddressAttributeName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The attribute of the IP address.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next page of results.</p>\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#AddressMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return with a single call. To retrieve the remaining results, make another call with the returned <code>nextToken</code> value.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeAddressesAttributeResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Addresses\": {\n                    \"target\": \"com.amazonaws.ec2#AddressSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AddressSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the IP addresses.</p>\",\n                        \"smithy.api#xmlName\": \"addressSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeAddressesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PublicIps\": {\n                    \"target\": \"com.amazonaws.ec2#PublicIpStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more Elastic IP addresses.</p>\\n         <p>Default: Describes all your Elastic IP addresses.</p>\",\n                        \"smithy.api#xmlName\": \"PublicIp\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more filters. Filter names and values are case-sensitive.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>allocation-id</code> - The allocation ID for the address.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>association-id</code> - The association ID for the address.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>instance-id</code> - The ID of the instance the address is associated with, if any.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-border-group</code> -  A unique set of Availability Zones, Local Zones,\\n           or Wavelength Zones from where Amazon Web Services advertises IP addresses. </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-interface-id</code> - The ID of the network interface that the address is associated with, if any.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-interface-owner-id</code> - The Amazon Web Services account ID of the owner.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>private-ip-address</code> - The private IP address associated with the Elastic IP address.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>public-ip</code> - The Elastic IP address, or the carrier IP address.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag</code>:<key> - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\\n    For example, to find all resources that have a tag with the key <code>Owner</code> and the value <code>TeamA</code>, specify <code>tag:Owner</code> for the filter name and <code>TeamA</code> for the filter value.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag-key</code> - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"AllocationIds\": {\n                    \"target\": \"com.amazonaws.ec2#AllocationIdList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Information about the allocation IDs.</p>\",\n                        \"smithy.api#xmlName\": \"AllocationId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeAddressesResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Addresses\": {\n                    \"target\": \"com.amazonaws.ec2#AddressList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AddressesSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the Elastic IP addresses.</p>\",\n                        \"smithy.api#xmlName\": \"addressesSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeAggregateIdFormat\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeAggregateIdFormatRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeAggregateIdFormatResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the longer ID format settings for all resource types in a specific\\n         Region. This request is useful for performing a quick audit to determine whether a\\n         specific Region is fully opted in for longer IDs (17-character IDs).</p>\\n         <p>This request only returns information about resource types that support longer IDs.</p>\\n         <p>The following resource types support longer IDs: <code>bundle</code> |\\n        <code>conversion-task</code> | <code>customer-gateway</code> | <code>dhcp-options</code> |\\n        <code>elastic-ip-allocation</code> | <code>elastic-ip-association</code> |\\n        <code>export-task</code> | <code>flow-log</code> | <code>image</code> |\\n        <code>import-task</code> | <code>instance</code> | <code>internet-gateway</code> |\\n        <code>network-acl</code> | <code>network-acl-association</code> |\\n        <code>network-interface</code> | <code>network-interface-attachment</code> |\\n        <code>prefix-list</code> | <code>reservation</code> | <code>route-table</code> |\\n        <code>route-table-association</code> | <code>security-group</code> |\\n        <code>snapshot</code> | <code>subnet</code> |\\n        <code>subnet-cidr-block-association</code> | <code>volume</code> | <code>vpc</code> |\\n        <code>vpc-cidr-block-association</code> | <code>vpc-endpoint</code> |\\n        <code>vpc-peering-connection</code> | <code>vpn-connection</code> | <code>vpn-gateway</code>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DescribeAggregateIdFormatRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeAggregateIdFormatResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"UseLongIdsAggregated\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"UseLongIdsAggregated\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether all resource types in the Region are configured to use longer IDs.\\n            This value is only <code>true</code> if all users are configured to use longer IDs for\\n            all resources types in the Region.</p>\",\n                        \"smithy.api#xmlName\": \"useLongIdsAggregated\"\n                    }\n                },\n                \"Statuses\": {\n                    \"target\": \"com.amazonaws.ec2#IdFormatList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"StatusSet\",\n                        \"smithy.api#documentation\": \"<p>Information about each resource's ID format.</p>\",\n                        \"smithy.api#xmlName\": \"statusSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeAvailabilityZones\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeAvailabilityZonesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeAvailabilityZonesResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the Availability Zones, Local Zones, and Wavelength Zones that are available to\\n      you.</p>\\n         <p>For more information about Availability Zones, Local Zones, and Wavelength Zones, see\\n        <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-regions-availability-zones.html\\\">Regions and zones</a> \\n      in the <i>Amazon EC2 User Guide</i>.</p>\\n         <note>\\n            <p>The order of the elements in the response, including those within nested\\n        structures, might vary. Applications should not assume the elements appear in a\\n        particular order.</p>\\n         </note>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To describe your Availability Zones\",\n                        \"documentation\": \"This example describes the Availability Zones that are available to you. The response includes Availability Zones only for the current region.\",\n                        \"output\": {\n                            \"AvailabilityZones\": [\n                                {\n                                    \"State\": \"available\",\n                                    \"RegionName\": \"us-east-1\",\n                                    \"Messages\": [],\n                                    \"ZoneName\": \"us-east-1b\"\n                                },\n                                {\n                                    \"State\": \"available\",\n                                    \"RegionName\": \"us-east-1\",\n                                    \"Messages\": [],\n                                    \"ZoneName\": \"us-east-1c\"\n                                },\n                                {\n                                    \"State\": \"available\",\n                                    \"RegionName\": \"us-east-1\",\n                                    \"Messages\": [],\n                                    \"ZoneName\": \"us-east-1d\"\n                                },\n                                {\n                                    \"State\": \"available\",\n                                    \"RegionName\": \"us-east-1\",\n                                    \"Messages\": [],\n                                    \"ZoneName\": \"us-east-1e\"\n                                }\n                            ]\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#DescribeAvailabilityZonesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ZoneNames\": {\n                    \"target\": \"com.amazonaws.ec2#ZoneNameStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The names of the Availability Zones, Local Zones, and Wavelength Zones.</p>\",\n                        \"smithy.api#xmlName\": \"ZoneName\"\n                    }\n                },\n                \"ZoneIds\": {\n                    \"target\": \"com.amazonaws.ec2#ZoneIdStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the Availability Zones, Local Zones, and Wavelength Zones.</p>\",\n                        \"smithy.api#xmlName\": \"ZoneId\"\n                    }\n                },\n                \"AllAvailabilityZones\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Include all Availability Zones, Local Zones, and Wavelength Zones regardless of your\\n      opt-in status.</p>\\n         <p>If you do not use this parameter, the results include only the zones for the Regions where you have chosen the option to opt in.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>group-long-name</code> - The long name of the zone group for the Availability Zone (for\\n          example, <code>US West (Oregon) 1</code>), the Local Zone (for example, for Zone group <code>us-west-2-lax-1</code>, it is <code>US West (Los Angeles)</code>,\\n          or the Wavelength Zone (for example, for Zone group <code>us-east-1-wl1</code>, it is <code>US East (Verizon)</code>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>group-name</code> - The name of the zone group for the Availability Zone (for\\n          example, <code>us-east-1-zg-1</code>), the Local Zone (for example, <code>us-west-2-lax-1</code>),\\n          or the Wavelength Zone (for example, <code>us-east-1-wl1</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>message</code> - The Zone message.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>opt-in-status</code> - The opt-in status (<code>opted-in</code> |\\n            <code>not-opted-in</code> | <code>opt-in-not-required</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>parent-zone-id</code> - The ID of the zone that handles some of the Local Zone\\n          and Wavelength Zone control plane operations, such as API calls.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>parent-zone-name</code> - The ID of the zone that handles some of the Local Zone\\n          and Wavelength Zone control plane operations, such as API calls.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>region-name</code> - The name of the Region for the Zone (for example,\\n            <code>us-east-1</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>state</code> - The state of the Availability Zone, the Local Zone, or the\\n          Wavelength Zone (<code>available</code> | <code>unavailable</code> |\\n            <code>constrained</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>zone-id</code> - The ID of the Availability Zone (for example,\\n            <code>use1-az1</code>), the Local Zone (for example, <code>usw2-lax1-az1</code>), or the\\n          Wavelength Zone (for example, <code>us-east-1-wl1-bos-wlz-1</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>zone-name</code> - The name of the Availability Zone (for example,\\n            <code>us-east-1a</code>), the Local Zone (for example, <code>us-west-2-lax-1a</code>), or\\n          the Wavelength Zone (for example, <code>us-east-1-wl1-bos-wlz-1</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>zone-type</code> - The type of zone (<code>availability-zone</code> | \\n          <code>local-zone</code> | <code>wavelength-zone</code>).</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeAvailabilityZonesResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AvailabilityZones\": {\n                    \"target\": \"com.amazonaws.ec2#AvailabilityZoneList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AvailabilityZoneInfo\",\n                        \"smithy.api#documentation\": \"<p>Information about the Availability Zones, Local Zones, and Wavelength Zones.</p>\",\n                        \"smithy.api#xmlName\": \"availabilityZoneInfo\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeAwsNetworkPerformanceMetricSubscriptions\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeAwsNetworkPerformanceMetricSubscriptionsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeAwsNetworkPerformanceMetricSubscriptionsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the current Infrastructure Performance metric subscriptions.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"Subscriptions\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeAwsNetworkPerformanceMetricSubscriptionsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#MaxResultsParam\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return with a single call.\\n   To retrieve the remaining results, make another call with the returned <code>nextToken</code> value.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next page of results.</p>\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more filters.</p>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeAwsNetworkPerformanceMetricSubscriptionsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                },\n                \"Subscriptions\": {\n                    \"target\": \"com.amazonaws.ec2#SubscriptionList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SubscriptionSet\",\n                        \"smithy.api#documentation\": \"<p>Describes the current Infrastructure Performance subscriptions.</p>\",\n                        \"smithy.api#xmlName\": \"subscriptionSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeBundleTasks\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeBundleTasksRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeBundleTasksResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the specified bundle tasks or all of your bundle tasks.</p>\\n         <note>\\n            <p>Completed bundle tasks are listed for only a limited time. If your bundle task is no\\n        longer in the list, you can still register an AMI from it. Just use\\n          <code>RegisterImage</code> with the Amazon S3 bucket name and image manifest name you provided\\n        to the bundle task.</p>\\n         </note>\\n         <note>\\n            <p>The order of the elements in the response, including those within nested structures,\\n        might vary. Applications should not assume the elements appear in a particular order.</p>\\n         </note>\",\n                \"smithy.waiters#waitable\": {\n                    \"BundleTaskComplete\": {\n                        \"acceptors\": [\n                            {\n                                \"state\": \"success\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"BundleTasks[].State\",\n                                        \"expected\": \"complete\",\n                                        \"comparator\": \"allStringEquals\"\n                                    }\n                                }\n                            },\n                            {\n                                \"state\": \"failure\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"BundleTasks[].State\",\n                                        \"expected\": \"failed\",\n                                        \"comparator\": \"anyStringEquals\"\n                                    }\n                                }\n                            }\n                        ],\n                        \"minDelay\": 15\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeBundleTasksRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"BundleIds\": {\n                    \"target\": \"com.amazonaws.ec2#BundleIdStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The bundle task IDs.</p>\\n         <p>Default: Describes all your bundle tasks.</p>\",\n                        \"smithy.api#xmlName\": \"BundleId\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n\\t\\t\\tand provides an error response. If you have the required permissions, the error response is \\n\\t\\t\\t<code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>bundle-id</code> - The ID of the bundle task.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>error-code</code> - If the task failed, the error code returned.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>error-message</code> - If the task failed, the error message returned.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>instance-id</code> - The ID of the instance.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>progress</code> - The level of task completion, as a percentage (for example,\\n          20%).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>s3-bucket</code> - The Amazon S3 bucket to store the AMI.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>s3-prefix</code> - The beginning of the AMI name.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>start-time</code> - The time the task started (for example,\\n          2013-09-15T17:15:20.000Z).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>state</code> - The state of the task (<code>pending</code> |\\n            <code>waiting-for-shutdown</code> | <code>bundling</code> | <code>storing</code> |\\n            <code>cancelling</code> | <code>complete</code> | <code>failed</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>update-time</code> - The time of the most recent update for the task.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeBundleTasksResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"BundleTasks\": {\n                    \"target\": \"com.amazonaws.ec2#BundleTaskList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"BundleInstanceTasksSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the bundle tasks.</p>\",\n                        \"smithy.api#xmlName\": \"bundleInstanceTasksSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeByoipCidrs\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeByoipCidrsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeByoipCidrsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the IP address ranges that were provisioned for use with Amazon Web Services resources\\n          through through bring your own IP addresses (BYOIP).</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"ByoipCidrs\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeByoipCidrsMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 100\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeByoipCidrsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#DescribeByoipCidrsMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return with a single call.\\n\\tTo retrieve the remaining results, make another call with the returned <code>nextToken</code> value.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next page of results.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeByoipCidrsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ByoipCidrs\": {\n                    \"target\": \"com.amazonaws.ec2#ByoipCidrSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ByoipCidrSet\",\n                        \"smithy.api#documentation\": \"<p>Information about your address ranges.</p>\",\n                        \"smithy.api#xmlName\": \"byoipCidrSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeCapacityBlockExtensionHistory\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeCapacityBlockExtensionHistoryRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeCapacityBlockExtensionHistoryResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the events for the specified Capacity Block extension during the specified\\n\\t\\t\\ttime.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"CapacityBlockExtensions\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeCapacityBlockExtensionHistoryRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CapacityReservationIds\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityReservationIdSet\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of Capacity Block reservations that you want to display the history\\n\\t\\t\\tfor.</p>\",\n                        \"smithy.api#xmlName\": \"CapacityReservationId\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results.</p>\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#DescribeFutureCapacityMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of items to return for this request. To get the next page of items, make another request with the token returned in the output. For more information, \\n    see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Query-Requests.html#api-pagination\\\">Pagination</a>.</p>\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more filters</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>availability-zone</code> - The Availability Zone of the\\n\\t\\t\\t\\t\\textension.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>availability-zone-id</code> - The Availability Zone ID of the\\n\\t\\t\\t\\t\\textension.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>capacity-block-extension-offering-id</code> - The ID of the extension\\n\\t\\t\\t\\t\\toffering.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>capacity-block-extension-status</code> - The status of the extension\\n\\t\\t\\t\\t\\t\\t(<code>payment-pending</code> | <code>payment-failed</code> |\\n\\t\\t\\t\\t\\t\\t<code>payment-succeeded</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>capacity-reservation-id</code> - The reservation ID of the\\n\\t\\t\\t\\t\\textension.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>instance-type</code> - The instance type of the extension.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeCapacityBlockExtensionHistoryResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CapacityBlockExtensions\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityBlockExtensionSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CapacityBlockExtensionSet\",\n                        \"smithy.api#documentation\": \"<p>Describes one or more of your Capacity Block extensions. The results describe only the\\n\\t\\t\\tCapacity Block extensions in the Amazon Web Services Region that you're currently using.</p>\",\n                        \"smithy.api#xmlName\": \"capacityBlockExtensionSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeCapacityBlockExtensionOfferings\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeCapacityBlockExtensionOfferingsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeCapacityBlockExtensionOfferingsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes Capacity Block extension offerings available for purchase in the Amazon Web Services\\n\\t\\t\\tRegion that you're currently using.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"CapacityBlockExtensionOfferings\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeCapacityBlockExtensionOfferingsMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeCapacityBlockExtensionOfferingsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"CapacityBlockExtensionDurationHours\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The duration of the Capacity Block extension offering in hours.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"CapacityReservationId\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityReservationId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the Capacity reservation to be extended.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results.</p>\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#DescribeCapacityBlockExtensionOfferingsMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of items to return for this request. To get the next page of items, make another request with the token returned in the output. For more information, \\n    see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Query-Requests.html#api-pagination\\\">Pagination</a>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeCapacityBlockExtensionOfferingsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CapacityBlockExtensionOfferings\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityBlockExtensionOfferingSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CapacityBlockExtensionOfferingSet\",\n                        \"smithy.api#documentation\": \"<p>The recommended Capacity Block extension offerings for the dates specified.</p>\",\n                        \"smithy.api#xmlName\": \"capacityBlockExtensionOfferingSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeCapacityBlockOfferings\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeCapacityBlockOfferingsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeCapacityBlockOfferingsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes Capacity Block offerings available for purchase in the Amazon Web Services Region that you're currently using. With Capacity Blocks, you can \\n\\t\\t\\tpurchase a specific GPU instance type or EC2 UltraServer for a period of time.</p>\\n         <p>To search for an available Capacity Block offering, you specify a reservation duration\\n\\t\\t\\tand instance count.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"CapacityBlockOfferings\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeCapacityBlockOfferingsMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeCapacityBlockOfferingsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"InstanceType\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of instance for which the Capacity Block offering reserves capacity.</p>\"\n                    }\n                },\n                \"InstanceCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of instances for which to reserve capacity. Each Capacity Block can have up\\n\\t\\t\\tto 64 instances, and you can have up to 256 instances across Capacity Blocks.</p>\"\n                    }\n                },\n                \"StartDateRange\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The earliest start date for the Capacity Block offering.</p>\"\n                    }\n                },\n                \"EndDateRange\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The latest end date for the Capacity Block offering.</p>\"\n                    }\n                },\n                \"CapacityDurationHours\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The reservation duration for the Capacity Block, in hours. You must specify the\\n\\t\\t\\tduration in 1-day increments up 14 days, and in 7-day increments up to 182 days.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results.</p>\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#DescribeCapacityBlockOfferingsMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of items to return for this request. To get the next page of items, make another request with the token returned in the output. For more information, \\n    see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Query-Requests.html#api-pagination\\\">Pagination</a>.</p>\"\n                    }\n                },\n                \"UltraserverType\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The EC2 UltraServer type of the Capacity Block offerings.</p>\"\n                    }\n                },\n                \"UltraserverCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of EC2 UltraServers in the offerings.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeCapacityBlockOfferingsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CapacityBlockOfferings\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityBlockOfferingSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CapacityBlockOfferingSet\",\n                        \"smithy.api#documentation\": \"<p>The recommended Capacity Block offering for the dates specified.</p>\",\n                        \"smithy.api#xmlName\": \"capacityBlockOfferingSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeCapacityBlockStatus\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeCapacityBlockStatusRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeCapacityBlockStatusResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the availability of capacity for the specified Capacity blocks, or all of your Capacity Blocks.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"CapacityBlockStatuses\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeCapacityBlockStatusMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeCapacityBlockStatusRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CapacityBlockIds\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityBlockIds\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the Capacity Block.</p>\",\n                        \"smithy.api#xmlName\": \"CapacityBlockId\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results.</p>\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#DescribeCapacityBlockStatusMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of items to return for this request. To get the next page of items, make another request with the token returned in the output. For more information, \\n    see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Query-Requests.html#api-pagination\\\">Pagination</a>.</p>\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more filters. </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>interconnect-status</code> - The status of the interconnect for the Capacity Block (<code>ok</code> | <code>impaired</code> | <code>insufficient-data</code>).</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeCapacityBlockStatusResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CapacityBlockStatuses\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityBlockStatusSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CapacityBlockStatusSet\",\n                        \"smithy.api#documentation\": \"<p>The availability of capacity for a Capacity Block.</p>\",\n                        \"smithy.api#xmlName\": \"capacityBlockStatusSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeCapacityBlocks\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeCapacityBlocksRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeCapacityBlocksResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes details about Capacity Blocks in the Amazon Web Services Region that you're currently using.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"CapacityBlocks\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeCapacityBlocksMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeCapacityBlocksRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CapacityBlockIds\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityBlockIds\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the Capacity Blocks.</p>\",\n                        \"smithy.api#xmlName\": \"CapacityBlockId\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results.</p>\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#DescribeCapacityBlocksMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of items to return for this request. To get the next page of items, make another request with the token returned in the output. For more information, \\n    see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Query-Requests.html#api-pagination\\\">Pagination</a>.</p>\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> One or more filters. </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>capacity-block-id</code> - The ID of the Capacity Block.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ultraserver-type</code> - The Capacity Block type. The type can be\\n\\t\\t\\t\\t\\t<code>instances</code> or <code>ultraservers</code>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>availability-zone</code> - The Availability Zone of the Capacity\\n\\t\\t\\t\\t\\tBlock.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>start-date</code> - The date and time at which the Capacity Block was\\n\\t\\t\\t\\t\\tstarted.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>end-date</code> - The date and time at which the Capacity Block expires.\\n\\t\\t\\t\\t\\tWhen a Capacity Block expires, all instances in the Capacity Block are\\n\\t\\t\\t\\t\\tterminated.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>create-date</code> - The date and time at which the Capacity Block was\\n\\t\\t\\t\\t\\tcreated.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>state</code> - The state of the Capacity Block (<code>active</code> | \\n\\t\\t\\t\\t\\t<code>expired</code> | <code>unavailable</code> | <code>cancelled</code> | \\n\\t\\t\\t\\t\\t<code>failed</code> | <code>scheduled</code> | <code>payment-pending</code> | \\n\\t\\t\\t\\t\\t<code>payment-failed</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tags</code> - The tags assigned to the Capacity Block.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeCapacityBlocksResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CapacityBlocks\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityBlockSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CapacityBlockSet\",\n                        \"smithy.api#documentation\": \"<p>The Capacity Blocks.</p>\",\n                        \"smithy.api#xmlName\": \"capacityBlockSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeCapacityReservationBillingRequests\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeCapacityReservationBillingRequestsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeCapacityReservationBillingRequestsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a request to assign the billing of the unused capacity of a Capacity\\n\\t\\t\\tReservation. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/transfer-billing.html\\\"> Billing assignment for shared\\n\\t\\t\\t\\t\\tAmazon EC2 Capacity Reservations</a>.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"CapacityReservationBillingRequests\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeCapacityReservationBillingRequestsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CapacityReservationIds\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityReservationIdSet\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the Capacity Reservation.</p>\",\n                        \"smithy.api#xmlName\": \"CapacityReservationId\"\n                    }\n                },\n                \"Role\": {\n                    \"target\": \"com.amazonaws.ec2#CallerRole\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>Specify one of the following:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>odcr-owner</code> - If you are the Capacity Reservation owner, specify\\n\\t\\t\\t\\t\\tthis value to view requests that you have initiated. Not supported with the\\n\\t\\t\\t\\t\\t\\t<code>requested-by</code> filter.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>unused-reservation-billing-owner</code> - If you are the consumer\\n\\t\\t\\t\\t\\taccount, specify this value to view requests that have been sent to you. Not\\n\\t\\t\\t\\t\\tsupported with the <code>unused-reservation-billing-owner</code> filter.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results.</p>\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#DescribeCapacityReservationBillingRequestsRequestMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of items to return for this request. To get the next page of items, make another request with the token returned in the output. For more information, \\n    see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Query-Requests.html#api-pagination\\\">Pagination</a>.</p>\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>status</code> - The state of the request (<code>pending</code> |\\n\\t\\t\\t\\t\\t\\t<code>accepted</code> | <code>rejected</code> | <code>cancelled</code> |\\n\\t\\t\\t\\t\\t\\t<code>revoked</code> | <code>expired</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>requested-by</code> - The account ID of the Capacity Reservation owner\\n\\t\\t\\t\\t\\tthat initiated the request. Not supported if you specify\\n\\t\\t\\t\\t\\t\\t<code>requested-by</code> for <b>Role</b>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>unused-reservation-billing-owner</code> - The ID of the consumer account\\n\\t\\t\\t\\t\\tto which the request was sent. Not supported if you specify\\n\\t\\t\\t\\t\\t\\t<code>unused-reservation-billing-owner</code> for <b>Role</b>.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeCapacityReservationBillingRequestsRequestMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeCapacityReservationBillingRequestsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                },\n                \"CapacityReservationBillingRequests\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityReservationBillingRequestSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CapacityReservationBillingRequestSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the request.</p>\",\n                        \"smithy.api#xmlName\": \"capacityReservationBillingRequestSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeCapacityReservationFleets\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeCapacityReservationFleetsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeCapacityReservationFleetsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes one or more Capacity Reservation Fleets.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"CapacityReservationFleets\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeCapacityReservationFleetsMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 100\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeCapacityReservationFleetsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CapacityReservationFleetIds\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityReservationFleetIdSet\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the Capacity Reservation Fleets to describe.</p>\",\n                        \"smithy.api#xmlName\": \"CapacityReservationFleetId\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results.</p>\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#DescribeCapacityReservationFleetsMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of items to return for this request. To get the next page of items, make another request with the token returned in the output. For more information, \\n    see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Query-Requests.html#api-pagination\\\">Pagination</a>.</p>\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>state</code> - The state of the Fleet (<code>submitted</code> |\\n\\t\\t\\t\\t\\t\\t<code>modifying</code> | <code>active</code> |\\n\\t\\t\\t\\t\\t\\t<code>partially_fulfilled</code> | <code>expiring</code> |\\n\\t\\t\\t\\t\\t\\t<code>expired</code> | <code>cancelling</code> | <code>cancelled</code> |\\n\\t\\t\\t\\t\\t\\t<code>failed</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>instance-match-criteria</code> - The instance matching criteria for the\\n\\t\\t\\t\\t\\tFleet. Only <code>open</code> is supported.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tenancy</code> - The tenancy of the Fleet (<code>default</code> |\\n\\t\\t\\t\\t\\t\\t<code>dedicated</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>allocation-strategy</code> - The allocation strategy used by the Fleet.\\n\\t\\t\\t\\t\\tOnly <code>prioritized</code> is supported.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeCapacityReservationFleetsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CapacityReservationFleets\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityReservationFleetSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CapacityReservationFleetSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the Capacity Reservation Fleets.</p>\",\n                        \"smithy.api#xmlName\": \"capacityReservationFleetSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeCapacityReservations\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeCapacityReservationsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeCapacityReservationsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes one or more of your Capacity Reservations. The results describe only the\\n\\t\\t\\tCapacity Reservations in the Amazon Web Services Region that you're currently\\n\\t\\t\\tusing.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"CapacityReservations\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeCapacityReservationsMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeCapacityReservationsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CapacityReservationIds\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityReservationIdSet\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the Capacity Reservation.</p>\",\n                        \"smithy.api#xmlName\": \"CapacityReservationId\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results.</p>\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#DescribeCapacityReservationsMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of items to return for this request. To get the next page of items, make another request with the token returned in the output. For more information, \\n    see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Query-Requests.html#api-pagination\\\">Pagination</a>.</p>\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>instance-type</code> - The type of instance for which the Capacity\\n\\t\\t\\t\\t\\tReservation reserves capacity.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>owner-id</code> - The ID of the Amazon Web Services account that owns the\\n\\t\\t\\t\\t\\tCapacity Reservation.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>instance-platform</code> - The type of operating system for which the\\n\\t\\t\\t\\t\\tCapacity Reservation reserves capacity.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>availability-zone</code> - The Availability Zone of the Capacity\\n\\t\\t\\t\\t\\tReservation.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tenancy</code> - Indicates the tenancy of the Capacity Reservation. A\\n\\t\\t\\t\\t\\tCapacity Reservation can have one of the following tenancy settings:</p>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <code>default</code> - The Capacity Reservation is created on hardware\\n\\t\\t\\t\\t\\t\\t\\tthat is shared with other Amazon Web Services accounts.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <code>dedicated</code> - The Capacity Reservation is created on\\n\\t\\t\\t\\t\\t\\t\\tsingle-tenant hardware that is dedicated to a single Amazon Web Services account.</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>outpost-arn</code> - The Amazon Resource Name (ARN) of the Outpost on\\n\\t\\t\\t\\t\\twhich the Capacity Reservation was created.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>state</code> - The current state of the Capacity Reservation. A Capacity\\n\\t\\t\\t\\t\\tReservation can be in one of the following states:</p>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <code>active</code>- The Capacity Reservation is active and the\\n\\t\\t\\t\\t\\t\\t\\tcapacity is available for your use.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <code>expired</code> - The Capacity Reservation expired automatically\\n\\t\\t\\t\\t\\t\\t\\tat the date and time specified in your request. The reserved capacity is\\n\\t\\t\\t\\t\\t\\t\\tno longer available for your use.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <code>cancelled</code> - The Capacity Reservation was cancelled. The\\n\\t\\t\\t\\t\\t\\t\\treserved capacity is no longer available for your use.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <code>pending</code> - The Capacity Reservation request was successful\\n\\t\\t\\t\\t\\t\\t\\tbut the capacity provisioning is still pending.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <code>failed</code> - The Capacity Reservation request has failed. A\\n\\t\\t\\t\\t\\t\\t\\trequest might fail due to invalid request parameters, capacity\\n\\t\\t\\t\\t\\t\\t\\tconstraints, or instance limit constraints. Failed requests are retained\\n\\t\\t\\t\\t\\t\\t\\tfor 60 minutes.</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>start-date</code> - The date and time at which the Capacity Reservation\\n\\t\\t\\t\\t\\twas started.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>end-date</code> - The date and time at which the Capacity Reservation\\n\\t\\t\\t\\t\\texpires. When a Capacity Reservation expires, the reserved capacity is released\\n\\t\\t\\t\\t\\tand you can no longer launch instances into it. The Capacity Reservation's state\\n\\t\\t\\t\\t\\tchanges to expired when it reaches its end date and time.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>end-date-type</code> - Indicates the way in which the Capacity\\n\\t\\t\\t\\t\\tReservation ends. A Capacity Reservation can have one of the following end\\n\\t\\t\\t\\t\\ttypes:</p>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <code>unlimited</code> - The Capacity Reservation remains active until\\n\\t\\t\\t\\t\\t\\t\\tyou explicitly cancel it.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <code>limited</code> - The Capacity Reservation expires automatically\\n\\t\\t\\t\\t\\t\\t\\tat a specified date and time.</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>instance-match-criteria</code> - Indicates the type of instance launches\\n\\t\\t\\t\\t\\tthat the Capacity Reservation accepts. The options include:</p>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <code>open</code> - The Capacity Reservation accepts all instances\\n\\t\\t\\t\\t\\t\\t\\tthat have matching attributes (instance type, platform, and Availability\\n\\t\\t\\t\\t\\t\\t\\tZone). Instances that have matching attributes launch into the Capacity\\n\\t\\t\\t\\t\\t\\t\\tReservation automatically without specifying any additional\\n\\t\\t\\t\\t\\t\\t\\tparameters.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <code>targeted</code> - The Capacity Reservation only accepts\\n\\t\\t\\t\\t\\t\\t\\tinstances that have matching attributes (instance type, platform, and\\n\\t\\t\\t\\t\\t\\t\\tAvailability Zone), and explicitly target the Capacity Reservation. This\\n\\t\\t\\t\\t\\t\\t\\tensures that only permitted instances can use the reserved\\n\\t\\t\\t\\t\\t\\t\\tcapacity.</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>placement-group-arn</code> - The ARN of the cluster placement group in\\n\\t\\t\\t\\t\\twhich the Capacity Reservation was created.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeCapacityReservationsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                },\n                \"CapacityReservations\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityReservationSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CapacityReservationSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the Capacity Reservations.</p>\",\n                        \"smithy.api#xmlName\": \"capacityReservationSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeCarrierGateways\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeCarrierGatewaysRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeCarrierGatewaysResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes one or more of your carrier gateways.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"CarrierGateways\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeCarrierGatewaysRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CarrierGatewayIds\": {\n                    \"target\": \"com.amazonaws.ec2#CarrierGatewayIdSet\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more carrier gateway IDs.</p>\",\n                        \"smithy.api#xmlName\": \"CarrierGatewayId\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>carrier-gateway-id</code> - The ID of the carrier gateway.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>state</code> - The state of the carrier gateway (<code>pending</code> |\\n                    <code>failed</code> | <code>available</code> | <code>deleting</code> | <code>deleted</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>owner-id</code> - The Amazon Web Services account ID of the owner of the carrier gateway.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag</code>:<key> - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\\n    For example, to find all resources that have a tag with the key <code>Owner</code> and the value <code>TeamA</code>, specify <code>tag:Owner</code> for the filter name and <code>TeamA</code> for the filter value.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag-key</code> - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>vpc-id</code> - The ID of the VPC associated with the carrier gateway.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#CarrierGatewayMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return with a single call.\\n\\tTo retrieve the remaining results, make another call with the returned <code>nextToken</code> value.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next page of results.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeCarrierGatewaysResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CarrierGateways\": {\n                    \"target\": \"com.amazonaws.ec2#CarrierGatewaySet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CarrierGatewaySet\",\n                        \"smithy.api#documentation\": \"<p>Information about the carrier gateway.</p>\",\n                        \"smithy.api#xmlName\": \"carrierGatewaySet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeClassicLinkInstances\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeClassicLinkInstancesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeClassicLinkInstancesResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>This action is deprecated.</p>\\n         </note>\\n         <p>Describes your linked EC2-Classic instances. This request only returns\\n\\t\\t\\tinformation about EC2-Classic instances linked to a VPC through ClassicLink. You cannot\\n\\t\\t\\tuse this request to return information about other instances.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"Instances\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeClassicLinkInstancesMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 5,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeClassicLinkInstancesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"InstanceIds\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceIdStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The instance IDs. Must be instances linked to a VPC through ClassicLink.</p>\",\n                        \"smithy.api#xmlName\": \"InstanceId\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>group-id</code> - The ID of a VPC security group that's associated with the instance.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>instance-id</code> - The ID of the instance.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag</code> - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\\n    For example, to find all resources that have a tag with the key <code>Owner</code> and the value <code>TeamA</code>, specify <code>tag:Owner</code> for the filter name and <code>TeamA</code> for the filter value.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag-key</code> - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>vpc-id</code> - The ID of the VPC to which the instance is linked.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token returned from a previous paginated request. Pagination continues from the end of the items returned by the previous request.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#DescribeClassicLinkInstancesMaxResults\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MaxResults\",\n                        \"smithy.api#documentation\": \"<p>The maximum number of items to return for this request.\\n\\tTo get the next page of items, make another request with the token returned in the output.\\n\\tFor more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Query-Requests.html#api-pagination\\\">Pagination</a>.</p>\\n         <p>Constraint: If the value is greater than 1000, we return only 1000 items.</p>\",\n                        \"smithy.api#xmlName\": \"maxResults\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeClassicLinkInstancesResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Instances\": {\n                    \"target\": \"com.amazonaws.ec2#ClassicLinkInstanceList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstancesSet\",\n                        \"smithy.api#documentation\": \"<p>Information about one or more linked EC2-Classic instances.</p>\",\n                        \"smithy.api#xmlName\": \"instancesSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to include in another request to get the next page of items. This value is <code>null</code> when there are no more items to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeClientVpnAuthorizationRules\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeClientVpnAuthorizationRulesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeClientVpnAuthorizationRulesResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the authorization rules for a specified Client VPN endpoint.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"AuthorizationRules\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeClientVpnAuthorizationRulesMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 5,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeClientVpnAuthorizationRulesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ClientVpnEndpointId\": {\n                    \"target\": \"com.amazonaws.ec2#ClientVpnEndpointId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the Client VPN endpoint.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token to retrieve the next page of results.</p>\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more filters. Filter names and values are case-sensitive.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>description</code> - The description of the authorization rule.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>destination-cidr</code> - The CIDR of the network to which the authorization rule\\n                    applies.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>group-id</code> - The ID of the Active Directory group to which the authorization rule grants access.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#DescribeClientVpnAuthorizationRulesMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return for the request in a single page. The remaining results can be seen by sending another request with the nextToken value.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeClientVpnAuthorizationRulesResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AuthorizationRules\": {\n                    \"target\": \"com.amazonaws.ec2#AuthorizationRuleSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AuthorizationRule\",\n                        \"smithy.api#documentation\": \"<p>Information about the authorization rules.</p>\",\n                        \"smithy.api#xmlName\": \"authorizationRule\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeClientVpnConnections\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeClientVpnConnectionsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeClientVpnConnectionsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes active client connections and connections that have been terminated within the last 60 \\n\\t\\t\\tminutes for the specified Client VPN endpoint.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"Connections\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeClientVpnConnectionsMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 5,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeClientVpnConnectionsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ClientVpnEndpointId\": {\n                    \"target\": \"com.amazonaws.ec2#ClientVpnEndpointId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the Client VPN endpoint.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more filters. Filter names and values are case-sensitive.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>connection-id</code> - The ID of the connection.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>username</code> - For Active Directory client authentication, the user name of the\\n                    client who established the client connection.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token to retrieve the next page of results.</p>\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#DescribeClientVpnConnectionsMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return for the request in a single page. The remaining results can be seen by sending another request with the nextToken value.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeClientVpnConnectionsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Connections\": {\n                    \"target\": \"com.amazonaws.ec2#ClientVpnConnectionSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Connections\",\n                        \"smithy.api#documentation\": \"<p>Information about the active and terminated client connections.</p>\",\n                        \"smithy.api#xmlName\": \"connections\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeClientVpnEndpointMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 5,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeClientVpnEndpoints\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeClientVpnEndpointsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeClientVpnEndpointsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes one or more Client VPN endpoints in the account.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"ClientVpnEndpoints\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeClientVpnEndpointsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ClientVpnEndpointIds\": {\n                    \"target\": \"com.amazonaws.ec2#ClientVpnEndpointIdList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the Client VPN endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"ClientVpnEndpointId\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#DescribeClientVpnEndpointMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return for the request in a single page. The remaining results can be seen by sending another request with the nextToken value.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token to retrieve the next page of results.</p>\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more filters. Filter names and values are case-sensitive.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>endpoint-id</code> - The ID of the Client VPN endpoint.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>transport-protocol</code> - The transport protocol (<code>tcp</code> |\\n                    <code>udp</code>).</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeClientVpnEndpointsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ClientVpnEndpoints\": {\n                    \"target\": \"com.amazonaws.ec2#EndpointSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ClientVpnEndpoint\",\n                        \"smithy.api#documentation\": \"<p>Information about the Client VPN endpoints.</p>\",\n                        \"smithy.api#xmlName\": \"clientVpnEndpoint\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeClientVpnRoutes\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeClientVpnRoutesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeClientVpnRoutesResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the routes for the specified Client VPN endpoint.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"Routes\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeClientVpnRoutesMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 5,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeClientVpnRoutesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ClientVpnEndpointId\": {\n                    \"target\": \"com.amazonaws.ec2#ClientVpnEndpointId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the Client VPN endpoint.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more filters. Filter names and values are case-sensitive.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>destination-cidr</code> - The CIDR of the route destination.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>origin</code> - How the route was associated with the Client VPN endpoint (<code>associate</code> | <code>add-route</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>target-subnet</code> - The ID of the subnet through which traffic is routed.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#DescribeClientVpnRoutesMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return for the request in a single page. The remaining results can be seen by sending another request with the nextToken value.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token to retrieve the next page of results.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeClientVpnRoutesResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Routes\": {\n                    \"target\": \"com.amazonaws.ec2#ClientVpnRouteSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Routes\",\n                        \"smithy.api#documentation\": \"<p>Information about the Client VPN endpoint routes.</p>\",\n                        \"smithy.api#xmlName\": \"routes\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeClientVpnTargetNetworks\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeClientVpnTargetNetworksRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeClientVpnTargetNetworksResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the target networks associated with the specified Client VPN endpoint.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"ClientVpnTargetNetworks\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeClientVpnTargetNetworksMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 5,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeClientVpnTargetNetworksRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ClientVpnEndpointId\": {\n                    \"target\": \"com.amazonaws.ec2#ClientVpnEndpointId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the Client VPN endpoint.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"AssociationIds\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the target network associations.</p>\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#DescribeClientVpnTargetNetworksMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return for the request in a single page. The remaining results can be seen by sending another request with the nextToken value.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token to retrieve the next page of results.</p>\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more filters. Filter names and values are case-sensitive.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>association-id</code> - The ID of the association.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>target-network-id</code> - The ID of the subnet specified as the target network.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>vpc-id</code> - The ID of the VPC in which the target network is located.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeClientVpnTargetNetworksResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ClientVpnTargetNetworks\": {\n                    \"target\": \"com.amazonaws.ec2#TargetNetworkSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ClientVpnTargetNetworks\",\n                        \"smithy.api#documentation\": \"<p>Information about the associated target networks.</p>\",\n                        \"smithy.api#xmlName\": \"clientVpnTargetNetworks\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeCoipPools\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeCoipPoolsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeCoipPoolsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the specified customer-owned address pools or all of your customer-owned address pools.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"CoipPools\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeCoipPoolsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PoolIds\": {\n                    \"target\": \"com.amazonaws.ec2#CoipPoolIdSet\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the address pools.</p>\",\n                        \"smithy.api#xmlName\": \"PoolId\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>coip-pool.local-gateway-route-table-id</code> - The ID of the local gateway route table.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>coip-pool.pool-id</code> - The ID of the address pool.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#CoipPoolMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return with a single call.\\n\\tTo retrieve the remaining results, make another call with the returned <code>nextToken</code> value.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next page of results.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeCoipPoolsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CoipPools\": {\n                    \"target\": \"com.amazonaws.ec2#CoipPoolSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CoipPoolSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the address pools.</p>\",\n                        \"smithy.api#xmlName\": \"coipPoolSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeConversionTaskList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ConversionTask\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeConversionTasks\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeConversionTasksRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeConversionTasksResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the specified conversion tasks or all your conversion tasks. For more information, see the\\n   <a href=\\\"https://docs.aws.amazon.com/vm-import/latest/userguide/\\\">VM Import/Export User Guide</a>.</p>\\n         <p>For information about the import manifest referenced by this API action, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/manifest.html\\\">VM Import Manifest</a>.</p>\",\n                \"smithy.waiters#waitable\": {\n                    \"ConversionTaskCancelled\": {\n                        \"acceptors\": [\n                            {\n                                \"state\": \"success\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"ConversionTasks[].State\",\n                                        \"expected\": \"cancelled\",\n                                        \"comparator\": \"allStringEquals\"\n                                    }\n                                }\n                            }\n                        ],\n                        \"minDelay\": 15\n                    },\n                    \"ConversionTaskCompleted\": {\n                        \"acceptors\": [\n                            {\n                                \"state\": \"success\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"ConversionTasks[].State\",\n                                        \"expected\": \"completed\",\n                                        \"comparator\": \"allStringEquals\"\n                                    }\n                                }\n                            },\n                            {\n                                \"state\": \"failure\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"ConversionTasks[].State\",\n                                        \"expected\": \"cancelled\",\n                                        \"comparator\": \"anyStringEquals\"\n                                    }\n                                }\n                            },\n                            {\n                                \"state\": \"failure\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"ConversionTasks[].State\",\n                                        \"expected\": \"cancelling\",\n                                        \"comparator\": \"anyStringEquals\"\n                                    }\n                                }\n                            }\n                        ],\n                        \"minDelay\": 15\n                    },\n                    \"ConversionTaskDeleted\": {\n                        \"acceptors\": [\n                            {\n                                \"state\": \"success\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"ConversionTasks[].State\",\n                                        \"expected\": \"deleted\",\n                                        \"comparator\": \"allStringEquals\"\n                                    }\n                                }\n                            }\n                        ],\n                        \"minDelay\": 15\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeConversionTasksRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"ConversionTaskIds\": {\n                    \"target\": \"com.amazonaws.ec2#ConversionIdStringList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ConversionTaskId\",\n                        \"smithy.api#documentation\": \"<p>The conversion task IDs.</p>\",\n                        \"smithy.api#xmlName\": \"conversionTaskId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeConversionTasksResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConversionTasks\": {\n                    \"target\": \"com.amazonaws.ec2#DescribeConversionTaskList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ConversionTasks\",\n                        \"smithy.api#documentation\": \"<p>Information about the conversion tasks.</p>\",\n                        \"smithy.api#xmlName\": \"conversionTasks\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeCustomerGateways\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeCustomerGatewaysRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeCustomerGatewaysResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes one or more of your VPN customer gateways.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/vpn/latest/s2svpn/VPC_VPN.html\\\">Amazon Web Services Site-to-Site VPN</a> in the <i>Amazon Web Services Site-to-Site VPN\\n                User Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To describe a customer gateway\",\n                        \"documentation\": \"This example describes the specified customer gateway.\",\n                        \"input\": {\n                            \"CustomerGatewayIds\": [\n                                \"cgw-0e11f167\"\n                            ]\n                        },\n                        \"output\": {\n                            \"CustomerGateways\": [\n                                {\n                                    \"CustomerGatewayId\": \"cgw-0e11f167\",\n                                    \"IpAddress\": \"12.1.2.3\",\n                                    \"State\": \"available\",\n                                    \"Type\": \"ipsec.1\",\n                                    \"BgpAsn\": \"65534\"\n                                }\n                            ]\n                        }\n                    }\n                ],\n                \"smithy.waiters#waitable\": {\n                    \"CustomerGatewayAvailable\": {\n                        \"acceptors\": [\n                            {\n                                \"state\": \"success\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"CustomerGateways[].State\",\n                                        \"expected\": \"available\",\n                                        \"comparator\": \"allStringEquals\"\n                                    }\n                                }\n                            },\n                            {\n                                \"state\": \"failure\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"CustomerGateways[].State\",\n                                        \"expected\": \"deleted\",\n                                        \"comparator\": \"anyStringEquals\"\n                                    }\n                                }\n                            },\n                            {\n                                \"state\": \"failure\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"CustomerGateways[].State\",\n                                        \"expected\": \"deleting\",\n                                        \"comparator\": \"anyStringEquals\"\n                                    }\n                                }\n                            }\n                        ],\n                        \"minDelay\": 15\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeCustomerGatewaysRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CustomerGatewayIds\": {\n                    \"target\": \"com.amazonaws.ec2#CustomerGatewayIdStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more customer gateway IDs.</p>\\n         <p>Default: Describes all your customer gateways.</p>\",\n                        \"smithy.api#xmlName\": \"CustomerGatewayId\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>bgp-asn</code> - The customer gateway's Border Gateway Protocol (BGP)\\n                    Autonomous System Number (ASN).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>customer-gateway-id</code> - The ID of the customer gateway.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ip-address</code> - The IP address of the customer gateway\\n                    device's external interface.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>state</code> - The state of the customer gateway (<code>pending</code> |\\n                        <code>available</code> | <code>deleting</code> |\\n                    <code>deleted</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>type</code> - The type of customer gateway. Currently, the only\\n                    supported type is <code>ipsec.1</code>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag</code>:<key> - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\\n    For example, to find all resources that have a tag with the key <code>Owner</code> and the value <code>TeamA</code>, specify <code>tag:Owner</code> for the filter name and <code>TeamA</code> for the filter value.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag-key</code> - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually\\n            making the request, and provides an error response. If you have the required\\n            permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is\\n                <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the parameters for DescribeCustomerGateways.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeCustomerGatewaysResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CustomerGateways\": {\n                    \"target\": \"com.amazonaws.ec2#CustomerGatewayList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CustomerGatewaySet\",\n                        \"smithy.api#documentation\": \"<p>Information about one or more customer gateways.</p>\",\n                        \"smithy.api#xmlName\": \"customerGatewaySet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the output of DescribeCustomerGateways.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeDeclarativePoliciesReports\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeDeclarativePoliciesReportsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeDeclarativePoliciesReportsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the metadata of an account status report, including the status of the\\n            report.</p>\\n         <p>To view the full report, download it from the Amazon S3 bucket where it was saved.\\n            Reports are accessible only when they have the <code>complete</code> status. Reports\\n            with other statuses (<code>running</code>, <code>cancelled</code>, or\\n            <code>error</code>) are not available in the S3 bucket. For more information about\\n            downloading objects from an S3 bucket, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/download-objects.html\\\">Downloading objects</a> in\\n            the <i>Amazon Simple Storage Service User Guide</i>.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_declarative_status-report.html\\\">Generating the account status report for declarative policies</a> in the\\n                <i>Amazon Web Services Organizations User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DescribeDeclarativePoliciesReportsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token returned from a previous paginated request. Pagination continues from the end of the items returned by the previous request.</p>\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#DeclarativePoliciesMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of items to return for this request.\\n\\tTo get the next page of items, make another request with the token returned in the output.\\n\\tFor more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Query-Requests.html#api-pagination\\\">Pagination</a>.</p>\"\n                    }\n                },\n                \"ReportIds\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more report IDs.</p>\",\n                        \"smithy.api#xmlName\": \"ReportId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeDeclarativePoliciesReportsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to include in another request to get the next page of items. This value is <code>null</code> when there are no more items to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                },\n                \"Reports\": {\n                    \"target\": \"com.amazonaws.ec2#DeclarativePoliciesReportList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ReportSet\",\n                        \"smithy.api#documentation\": \"<p>The report metadata.</p>\",\n                        \"smithy.api#xmlName\": \"reportSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeDhcpOptions\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeDhcpOptionsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeDhcpOptionsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes your DHCP option sets. The default is to describe all your DHCP option sets. \\n\\t\\t        Alternatively, you can specify specific DHCP option set IDs or filter the results to\\n\\t\\t        include only the DHCP option sets that match specific criteria.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/userguide/VPC_DHCP_Options.html\\\">DHCP option sets</a> in the\\n\\t\\t\\t\\t<i>Amazon VPC User Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To describe a DHCP options set\",\n                        \"documentation\": \"This example describes the specified DHCP options set.\",\n                        \"input\": {\n                            \"DhcpOptionsIds\": [\n                                \"dopt-d9070ebb\"\n                            ]\n                        },\n                        \"output\": {\n                            \"DhcpOptions\": [\n                                {\n                                    \"DhcpConfigurations\": [\n                                        {\n                                            \"Values\": [\n                                                {\n                                                    \"Value\": \"10.2.5.2\"\n                                                },\n                                                {\n                                                    \"Value\": \"10.2.5.1\"\n                                                }\n                                            ],\n                                            \"Key\": \"domain-name-servers\"\n                                        }\n                                    ],\n                                    \"DhcpOptionsId\": \"dopt-d9070ebb\"\n                                }\n                            ]\n                        }\n                    }\n                ],\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"DhcpOptions\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeDhcpOptionsMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 5,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeDhcpOptionsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DhcpOptionsIds\": {\n                    \"target\": \"com.amazonaws.ec2#DhcpOptionsIdStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of DHCP option sets.</p>\",\n                        \"smithy.api#xmlName\": \"DhcpOptionsId\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token returned from a previous paginated request. Pagination continues from the end of the items returned by the previous request.</p>\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#DescribeDhcpOptionsMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of items to return for this request.\\n\\tTo get the next page of items, make another request with the token returned in the output.\\n\\tFor more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Query-Requests.html#api-pagination\\\">Pagination</a>.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>dhcp-options-id</code> - The ID of a DHCP options set.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>key</code> - The key for one of the options (for example, <code>domain-name</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>value</code> - The value for one of the options.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>owner-id</code> - The ID of the Amazon Web Services account that owns the DHCP options set.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag</code> - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\\n    For example, to find all resources that have a tag with the key <code>Owner</code> and the value <code>TeamA</code>, specify <code>tag:Owner</code> for the filter name and <code>TeamA</code> for the filter value.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag-key</code> - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeDhcpOptionsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to include in another request to get the next page of items. This value is <code>null</code> when there are no more items to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                },\n                \"DhcpOptions\": {\n                    \"target\": \"com.amazonaws.ec2#DhcpOptionsList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DhcpOptionsSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the DHCP options sets.</p>\",\n                        \"smithy.api#xmlName\": \"dhcpOptionsSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeEgressOnlyInternetGateways\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeEgressOnlyInternetGatewaysRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeEgressOnlyInternetGatewaysResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes your egress-only internet gateways. The default is to describe all your egress-only internet gateways. \\n            Alternatively, you can specify specific egress-only internet gateway IDs or filter the results to\\n            include only the egress-only internet gateways that match specific criteria.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"EgressOnlyInternetGateways\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeEgressOnlyInternetGatewaysMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 5,\n                    \"max\": 255\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeEgressOnlyInternetGatewaysRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"EgressOnlyInternetGatewayIds\": {\n                    \"target\": \"com.amazonaws.ec2#EgressOnlyInternetGatewayIdList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the egress-only internet gateways.</p>\",\n                        \"smithy.api#xmlName\": \"EgressOnlyInternetGatewayId\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#DescribeEgressOnlyInternetGatewaysMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of items to return for this request.\\n\\tTo get the next page of items, make another request with the token returned in the output.\\n\\tFor more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Query-Requests.html#api-pagination\\\">Pagination</a>.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token returned from a previous paginated request. Pagination continues from the end of the items returned by the previous request.</p>\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>tag</code> - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\\n    For example, to find all resources that have a tag with the key <code>Owner</code> and the value <code>TeamA</code>, specify <code>tag:Owner</code> for the filter name and <code>TeamA</code> for the filter value.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag-key</code> - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeEgressOnlyInternetGatewaysResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"EgressOnlyInternetGateways\": {\n                    \"target\": \"com.amazonaws.ec2#EgressOnlyInternetGatewayList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EgressOnlyInternetGatewaySet\",\n                        \"smithy.api#documentation\": \"<p>Information about the egress-only internet gateways.</p>\",\n                        \"smithy.api#xmlName\": \"egressOnlyInternetGatewaySet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to include in another request to get the next page of items. This value is <code>null</code> when there are no more items to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeElasticGpus\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeElasticGpusRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeElasticGpusResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>Amazon Elastic Graphics reached end of life on January 8, 2024.</p>\\n         </note>\\n         <p>Describes the Elastic Graphics accelerator associated with your instances.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DescribeElasticGpusMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 10,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeElasticGpusRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ElasticGpuIds\": {\n                    \"target\": \"com.amazonaws.ec2#ElasticGpuIdSet\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Elastic Graphics accelerator IDs.</p>\",\n                        \"smithy.api#xmlName\": \"ElasticGpuId\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n            and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n            Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>availability-zone</code> - The Availability Zone in which the\\n                    Elastic Graphics accelerator resides.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>elastic-gpu-health</code> - The status of the Elastic Graphics accelerator\\n                        (<code>OK</code> | <code>IMPAIRED</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>elastic-gpu-state</code> - The state of the Elastic Graphics accelerator\\n                        (<code>ATTACHED</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>elastic-gpu-type</code> - The type of Elastic Graphics accelerator; for example,\\n                        <code>eg1.medium</code>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>instance-id</code> - The ID of the instance to which the\\n                    Elastic Graphics accelerator is associated.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#DescribeElasticGpusMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return in a single call. To retrieve the remaining\\n            results, make another call with the returned <code>NextToken</code> value. This value\\n            can be between 5 and 1000.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token to request the next page of results.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeElasticGpusResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ElasticGpuSet\": {\n                    \"target\": \"com.amazonaws.ec2#ElasticGpuSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ElasticGpuSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the Elastic Graphics accelerators.</p>\",\n                        \"smithy.api#xmlName\": \"elasticGpuSet\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MaxResults\",\n                        \"smithy.api#documentation\": \"<p>The total number of items to return. If the total number of items available is more\\n            than the value specified in max-items then a Next-Token will be provided in the output\\n            that you can use to resume pagination.</p>\",\n                        \"smithy.api#xmlName\": \"maxResults\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is\\n                <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeExportImageTasks\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeExportImageTasksRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeExportImageTasksResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the specified export image tasks or all of your export image tasks.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"ExportImageTasks\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeExportImageTasksMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 500\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeExportImageTasksRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Filter tasks using the <code>task-state</code> filter and one of the following values: <code>active</code>,\\n    <code>completed</code>, <code>deleting</code>, or <code>deleted</code>.</p>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"ExportImageTaskIds\": {\n                    \"target\": \"com.amazonaws.ec2#ExportImageTaskIdList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the export image tasks.</p>\",\n                        \"smithy.api#xmlName\": \"ExportImageTaskId\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#DescribeExportImageTasksMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return in a single call.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A token that indicates the next page of results.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeExportImageTasksResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ExportImageTasks\": {\n                    \"target\": \"com.amazonaws.ec2#ExportImageTaskList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ExportImageTaskSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the export image tasks.</p>\",\n                        \"smithy.api#xmlName\": \"exportImageTaskSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to get the next page of results. This value is <code>null</code> when there are no more results\\n   to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeExportTasks\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeExportTasksRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeExportTasksResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the specified export instance tasks or all of your export instance tasks.</p>\",\n                \"smithy.waiters#waitable\": {\n                    \"ExportTaskCancelled\": {\n                        \"acceptors\": [\n                            {\n                                \"state\": \"success\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"ExportTasks[].State\",\n                                        \"expected\": \"cancelled\",\n                                        \"comparator\": \"allStringEquals\"\n                                    }\n                                }\n                            }\n                        ],\n                        \"minDelay\": 15\n                    },\n                    \"ExportTaskCompleted\": {\n                        \"acceptors\": [\n                            {\n                                \"state\": \"success\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"ExportTasks[].State\",\n                                        \"expected\": \"completed\",\n                                        \"comparator\": \"allStringEquals\"\n                                    }\n                                }\n                            }\n                        ],\n                        \"minDelay\": 15\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeExportTasksRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>the filters for the export tasks.</p>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"ExportTaskIds\": {\n                    \"target\": \"com.amazonaws.ec2#ExportTaskIdStringList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ExportTaskId\",\n                        \"smithy.api#documentation\": \"<p>The export task IDs.</p>\",\n                        \"smithy.api#xmlName\": \"exportTaskId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeExportTasksResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ExportTasks\": {\n                    \"target\": \"com.amazonaws.ec2#ExportTaskList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ExportTaskSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the export tasks.</p>\",\n                        \"smithy.api#xmlName\": \"exportTaskSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeFastLaunchImages\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeFastLaunchImagesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeFastLaunchImagesResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describe details for Windows AMIs that are configured for Windows fast launch.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"FastLaunchImages\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeFastLaunchImagesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ImageIds\": {\n                    \"target\": \"com.amazonaws.ec2#FastLaunchImageIdList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify one or more Windows AMI image IDs for the request.</p>\",\n                        \"smithy.api#xmlName\": \"ImageId\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use the following filters to streamline results.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>resource-type</code> - The resource type for pre-provisioning.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>owner-id</code> - The owner ID for the pre-provisioning resource.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>state</code> - The current state of fast launching for the Windows AMI.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#DescribeFastLaunchImagesRequestMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of items to return for this request.\\n         To get the next page of items, make another request with the token returned in the output.\\n\\t        For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Query-Requests.html#api-pagination\\\">Pagination</a>.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token returned from a previous paginated request. Pagination continues from the end of the items returned by the previous request.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n\\t\\t\\tand provides an error response. If you have the required permissions, the error response is \\n\\t\\t\\t<code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeFastLaunchImagesRequestMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 0,\n                    \"max\": 200\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeFastLaunchImagesResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"FastLaunchImages\": {\n                    \"target\": \"com.amazonaws.ec2#DescribeFastLaunchImagesSuccessSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"FastLaunchImageSet\",\n                        \"smithy.api#documentation\": \"<p>A collection of details about the fast-launch enabled Windows images that meet the\\n      requested criteria.</p>\",\n                        \"smithy.api#xmlName\": \"fastLaunchImageSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to include in another request to get the next page of items. This value is <code>null</code> when there\\n         are no more items to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeFastLaunchImagesSuccessItem\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ImageId\": {\n                    \"target\": \"com.amazonaws.ec2#ImageId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ImageId\",\n                        \"smithy.api#documentation\": \"<p>The image ID that identifies the Windows fast launch enabled image.</p>\",\n                        \"smithy.api#xmlName\": \"imageId\"\n                    }\n                },\n                \"ResourceType\": {\n                    \"target\": \"com.amazonaws.ec2#FastLaunchResourceType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResourceType\",\n                        \"smithy.api#documentation\": \"<p>The resource type that Amazon EC2 uses for pre-provisioning the Windows AMI. Supported values\\n      include: <code>snapshot</code>.</p>\",\n                        \"smithy.api#xmlName\": \"resourceType\"\n                    }\n                },\n                \"SnapshotConfiguration\": {\n                    \"target\": \"com.amazonaws.ec2#FastLaunchSnapshotConfigurationResponse\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SnapshotConfiguration\",\n                        \"smithy.api#documentation\": \"<p>A group of parameters that are used for pre-provisioning the associated Windows AMI using\\n      snapshots.</p>\",\n                        \"smithy.api#xmlName\": \"snapshotConfiguration\"\n                    }\n                },\n                \"LaunchTemplate\": {\n                    \"target\": \"com.amazonaws.ec2#FastLaunchLaunchTemplateSpecificationResponse\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LaunchTemplate\",\n                        \"smithy.api#documentation\": \"<p>The launch template that the Windows fast launch enabled AMI uses when it launches Windows\\n      instances from pre-provisioned snapshots.</p>\",\n                        \"smithy.api#xmlName\": \"launchTemplate\"\n                    }\n                },\n                \"MaxParallelLaunches\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MaxParallelLaunches\",\n                        \"smithy.api#documentation\": \"<p>The maximum number of instances that Amazon EC2 can launch at the same time to create\\n      pre-provisioned snapshots for Windows fast launch.</p>\",\n                        \"smithy.api#xmlName\": \"maxParallelLaunches\"\n                    }\n                },\n                \"OwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OwnerId\",\n                        \"smithy.api#documentation\": \"<p>The owner ID for the Windows fast launch enabled AMI.</p>\",\n                        \"smithy.api#xmlName\": \"ownerId\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#FastLaunchStateCode\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The current state of Windows fast launch for the specified Windows AMI.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                },\n                \"StateTransitionReason\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"StateTransitionReason\",\n                        \"smithy.api#documentation\": \"<p>The reason that Windows fast launch for the AMI changed to the current state.</p>\",\n                        \"smithy.api#xmlName\": \"stateTransitionReason\"\n                    }\n                },\n                \"StateTransitionTime\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"StateTransitionTime\",\n                        \"smithy.api#documentation\": \"<p>The time that Windows fast launch for the AMI changed to the current state.</p>\",\n                        \"smithy.api#xmlName\": \"stateTransitionTime\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describe details about a Windows image with Windows fast launch enabled that meets the\\n      requested criteria. Criteria are defined by the <code>DescribeFastLaunchImages</code> action\\n      filters.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DescribeFastLaunchImagesSuccessSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#DescribeFastLaunchImagesSuccessItem\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeFastSnapshotRestoreSuccessItem\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SnapshotId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SnapshotId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the snapshot.</p>\",\n                        \"smithy.api#xmlName\": \"snapshotId\"\n                    }\n                },\n                \"AvailabilityZone\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AvailabilityZone\",\n                        \"smithy.api#documentation\": \"<p>The Availability Zone.</p>\",\n                        \"smithy.api#xmlName\": \"availabilityZone\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#FastSnapshotRestoreStateCode\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The state of fast snapshot restores.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                },\n                \"StateTransitionReason\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"StateTransitionReason\",\n                        \"smithy.api#documentation\": \"<p>The reason for the state transition. The possible values are as follows:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>Client.UserInitiated</code> - The state successfully transitioned to <code>enabling</code> or\\n          <code>disabling</code>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>Client.UserInitiated - Lifecycle state transition</code> - The state successfully transitioned \\n          to <code>optimizing</code>, <code>enabled</code>, or <code>disabled</code>.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"stateTransitionReason\"\n                    }\n                },\n                \"OwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OwnerId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Amazon Web Services account that enabled fast snapshot restores on the snapshot.</p>\",\n                        \"smithy.api#xmlName\": \"ownerId\"\n                    }\n                },\n                \"OwnerAlias\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OwnerAlias\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services owner alias that enabled fast snapshot restores on the snapshot. This is intended for future use.</p>\",\n                        \"smithy.api#xmlName\": \"ownerAlias\"\n                    }\n                },\n                \"EnablingTime\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EnablingTime\",\n                        \"smithy.api#documentation\": \"<p>The time at which fast snapshot restores entered the <code>enabling</code> state.</p>\",\n                        \"smithy.api#xmlName\": \"enablingTime\"\n                    }\n                },\n                \"OptimizingTime\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OptimizingTime\",\n                        \"smithy.api#documentation\": \"<p>The time at which fast snapshot restores entered the <code>optimizing</code> state.</p>\",\n                        \"smithy.api#xmlName\": \"optimizingTime\"\n                    }\n                },\n                \"EnabledTime\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EnabledTime\",\n                        \"smithy.api#documentation\": \"<p>The time at which fast snapshot restores entered the <code>enabled</code> state.</p>\",\n                        \"smithy.api#xmlName\": \"enabledTime\"\n                    }\n                },\n                \"DisablingTime\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DisablingTime\",\n                        \"smithy.api#documentation\": \"<p>The time at which fast snapshot restores entered the <code>disabling</code> state.</p>\",\n                        \"smithy.api#xmlName\": \"disablingTime\"\n                    }\n                },\n                \"DisabledTime\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DisabledTime\",\n                        \"smithy.api#documentation\": \"<p>The time at which fast snapshot restores entered the <code>disabled</code> state.</p>\",\n                        \"smithy.api#xmlName\": \"disabledTime\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes fast snapshot restores for a snapshot.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DescribeFastSnapshotRestoreSuccessSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#DescribeFastSnapshotRestoreSuccessItem\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeFastSnapshotRestores\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeFastSnapshotRestoresRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeFastSnapshotRestoresResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the state of fast snapshot restores for your snapshots.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"FastSnapshotRestores\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeFastSnapshotRestoresMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 0,\n                    \"max\": 200\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeFastSnapshotRestoresRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The filters. The possible values are:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>availability-zone</code>: The Availability Zone of the snapshot.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>owner-id</code>: The ID of the Amazon Web Services account that enabled fast snapshot restore on the snapshot.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>snapshot-id</code>: The ID of the snapshot.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>state</code>: The state of fast snapshot restores for the snapshot \\n         (<code>enabling</code> | \\n          <code>optimizing</code> | \\n          <code>enabled</code> | \\n          <code>disabling</code> | \\n          <code>disabled</code>).</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#DescribeFastSnapshotRestoresMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of items to return for this request.\\n\\tTo get the next page of items, make another request with the token returned in the output. \\n\\tFor more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Query-Requests.html#api-pagination\\\">Pagination</a>.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token returned from a previous paginated request.\\n  Pagination continues from the end of the items returned by the previous request.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeFastSnapshotRestoresResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"FastSnapshotRestores\": {\n                    \"target\": \"com.amazonaws.ec2#DescribeFastSnapshotRestoreSuccessSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"FastSnapshotRestoreSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the state of fast snapshot restores.</p>\",\n                        \"smithy.api#xmlName\": \"fastSnapshotRestoreSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to include in another request to get the next page of items. \\n  This value is <code>null</code> when there are no more items to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeFleetError\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LaunchTemplateAndOverrides\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplateAndOverridesResponse\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LaunchTemplateAndOverrides\",\n                        \"smithy.api#documentation\": \"<p>The launch templates and overrides that were used for launching the instances. The\\n         values that you specify in the Overrides replace the values in the launch template.</p>\",\n                        \"smithy.api#xmlName\": \"launchTemplateAndOverrides\"\n                    }\n                },\n                \"Lifecycle\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceLifecycle\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Lifecycle\",\n                        \"smithy.api#documentation\": \"<p>Indicates if the instance that could not be launched was a Spot Instance or On-Demand Instance.</p>\",\n                        \"smithy.api#xmlName\": \"lifecycle\"\n                    }\n                },\n                \"ErrorCode\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ErrorCode\",\n                        \"smithy.api#documentation\": \"<p>The error code that indicates why the instance could not be launched. For more\\n         information about error codes, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/errors-overview.html.html\\\">Error codes</a>.</p>\",\n                        \"smithy.api#xmlName\": \"errorCode\"\n                    }\n                },\n                \"ErrorMessage\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ErrorMessage\",\n                        \"smithy.api#documentation\": \"<p>The error message that describes why the instance could not be launched. For more\\n         information about error messages, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/errors-overview.html.html\\\">Error codes</a>.</p>\",\n                        \"smithy.api#xmlName\": \"errorMessage\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the instances that could not be launched by the fleet.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DescribeFleetHistory\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeFleetHistoryRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeFleetHistoryResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the events for the specified EC2 Fleet during the specified time.</p>\\n         <p>EC2 Fleet events are delayed by up to 30 seconds before they can be described. This ensures\\n         that you can query by the last evaluated time and not miss a recorded event. EC2 Fleet events\\n         are available for 48 hours.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/fleet-monitor.html\\\">Monitor fleet events using Amazon EventBridge</a> in the\\n            <i>Amazon EC2 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DescribeFleetHistoryRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"EventType\": {\n                    \"target\": \"com.amazonaws.ec2#FleetEventType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of events to describe. By default, all events are described.</p>\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of items to return for this request.\\n         To get the next page of items, make another request with the token returned in the output.\\n\\t        For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Query-Requests.html#api-pagination\\\">Pagination</a>.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token returned from a previous paginated request. Pagination continues from the end of the items returned by the previous request.</p>\"\n                    }\n                },\n                \"FleetId\": {\n                    \"target\": \"com.amazonaws.ec2#FleetId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the EC2 Fleet.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"StartTime\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The start date and time for the events, in UTC format (for example,\\n            <i>YYYY</i>-<i>MM</i>-<i>DD</i>T<i>HH</i>:<i>MM</i>:<i>SS</i>Z).</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeFleetHistoryResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"HistoryRecords\": {\n                    \"target\": \"com.amazonaws.ec2#HistoryRecordSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"HistoryRecordSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the events in the history of the EC2 Fleet.</p>\",\n                        \"smithy.api#xmlName\": \"historyRecordSet\"\n                    }\n                },\n                \"LastEvaluatedTime\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LastEvaluatedTime\",\n                        \"smithy.api#documentation\": \"<p>The last date and time for the events, in UTC format (for example,\\n            <i>YYYY</i>-<i>MM</i>-<i>DD</i>T<i>HH</i>:<i>MM</i>:<i>SS</i>Z).\\n         All records up to this time were retrieved.</p>\\n         <p>If <code>nextToken</code> indicates that there are more items, this value is not\\n         present.</p>\",\n                        \"smithy.api#xmlName\": \"lastEvaluatedTime\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to include in another request to get the next page of items. This value is <code>null</code> when there\\n         are no more items to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                },\n                \"FleetId\": {\n                    \"target\": \"com.amazonaws.ec2#FleetId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"FleetId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the EC Fleet.</p>\",\n                        \"smithy.api#xmlName\": \"fleetId\"\n                    }\n                },\n                \"StartTime\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"StartTime\",\n                        \"smithy.api#documentation\": \"<p>The start date and time for the events, in UTC format (for example,\\n            <i>YYYY</i>-<i>MM</i>-<i>DD</i>T<i>HH</i>:<i>MM</i>:<i>SS</i>Z).</p>\",\n                        \"smithy.api#xmlName\": \"startTime\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeFleetInstances\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeFleetInstancesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeFleetInstancesResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the running instances for the specified EC2 Fleet.</p>\\n         <note>\\n            <p>Currently, <code>DescribeFleetInstances</code> does not support fleets of type\\n               <code>instant</code>. Instead, use <code>DescribeFleets</code>, specifying the\\n               <code>instant</code> fleet ID in the request.</p>\\n         </note>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/manage-ec2-fleet.html#monitor-ec2-fleet\\\">Describe your\\n            EC2 Fleet</a> in the <i>Amazon EC2 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DescribeFleetInstancesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of items to return for this request.\\n         To get the next page of items, make another request with the token returned in the output.\\n\\t        For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Query-Requests.html#api-pagination\\\">Pagination</a>.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token returned from a previous paginated request. Pagination continues from the end of the items returned by the previous request.</p>\"\n                    }\n                },\n                \"FleetId\": {\n                    \"target\": \"com.amazonaws.ec2#FleetId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the EC2 Fleet.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>instance-type</code> - The instance type.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeFleetInstancesResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ActiveInstances\": {\n                    \"target\": \"com.amazonaws.ec2#ActiveInstanceSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ActiveInstanceSet\",\n                        \"smithy.api#documentation\": \"<p>The running instances. This list is refreshed periodically and might be out of\\n         date.</p>\",\n                        \"smithy.api#xmlName\": \"activeInstanceSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to include in another request to get the next page of items. This value is <code>null</code> when there\\n         are no more items to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                },\n                \"FleetId\": {\n                    \"target\": \"com.amazonaws.ec2#FleetId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"FleetId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the EC2 Fleet.</p>\",\n                        \"smithy.api#xmlName\": \"fleetId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeFleets\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeFleetsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeFleetsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the specified EC2 Fleet or all of your EC2 Fleets.</p>\\n         <important>\\n            <p>If a fleet is of type <code>instant</code>, you must specify the fleet ID in the\\n            request, otherwise the fleet does not appear in the response.</p>\\n         </important>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/manage-ec2-fleet.html#monitor-ec2-fleet\\\">Describe your\\n            EC2 Fleet</a> in the <i>Amazon EC2 User Guide</i>.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"Fleets\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeFleetsErrorSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#DescribeFleetError\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeFleetsInstances\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LaunchTemplateAndOverrides\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplateAndOverridesResponse\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LaunchTemplateAndOverrides\",\n                        \"smithy.api#documentation\": \"<p>The launch templates and overrides that were used for launching the instances. The\\n         values that you specify in the Overrides replace the values in the launch template.</p>\",\n                        \"smithy.api#xmlName\": \"launchTemplateAndOverrides\"\n                    }\n                },\n                \"Lifecycle\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceLifecycle\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Lifecycle\",\n                        \"smithy.api#documentation\": \"<p>Indicates if the instance that was launched is a Spot Instance or On-Demand Instance.</p>\",\n                        \"smithy.api#xmlName\": \"lifecycle\"\n                    }\n                },\n                \"InstanceIds\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceIdsSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceIds\",\n                        \"smithy.api#documentation\": \"<p>The IDs of the instances.</p>\",\n                        \"smithy.api#xmlName\": \"instanceIds\"\n                    }\n                },\n                \"InstanceType\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceType\",\n                        \"smithy.api#documentation\": \"<p>The instance type.</p>\",\n                        \"smithy.api#xmlName\": \"instanceType\"\n                    }\n                },\n                \"Platform\": {\n                    \"target\": \"com.amazonaws.ec2#PlatformValues\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Platform\",\n                        \"smithy.api#documentation\": \"<p>The value is <code>windows</code> for Windows instances in an EC2 Fleet. Otherwise, the value is\\n         blank.</p>\",\n                        \"smithy.api#xmlName\": \"platform\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the instances that were launched by the fleet.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DescribeFleetsInstancesSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#DescribeFleetsInstances\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeFleetsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of items to return for this request.\\n         To get the next page of items, make another request with the token returned in the output.\\n\\t        For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Query-Requests.html#api-pagination\\\">Pagination</a>.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token returned from a previous paginated request. Pagination continues from the end of the items returned by the previous request.</p>\"\n                    }\n                },\n                \"FleetIds\": {\n                    \"target\": \"com.amazonaws.ec2#FleetIdSet\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the EC2 Fleets.</p>\\n         <note>\\n            <p>If a fleet is of type <code>instant</code>, you must specify the fleet ID, otherwise\\n            it does not appear in the response.</p>\\n         </note>\",\n                        \"smithy.api#xmlName\": \"FleetId\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>activity-status</code> - The progress of the EC2 Fleet ( <code>error</code> |\\n                  <code>pending-fulfillment</code> | <code>pending-termination</code> |\\n                  <code>fulfilled</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>excess-capacity-termination-policy</code> - Indicates whether to terminate\\n               running instances if the target capacity is decreased below the current EC2 Fleet size\\n                  (<code>true</code> | <code>false</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>fleet-state</code> - The state of the EC2 Fleet (<code>submitted</code> |\\n                  <code>active</code> | <code>deleted</code> | <code>failed</code> |\\n                  <code>deleted-running</code> | <code>deleted-terminating</code> |\\n                  <code>modifying</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>replace-unhealthy-instances</code> - Indicates whether EC2 Fleet should replace\\n               unhealthy instances (<code>true</code> | <code>false</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>type</code> - The type of request (<code>instant</code> |\\n                  <code>request</code> | <code>maintain</code>).</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeFleetsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to include in another request to get the next page of items. This value is <code>null</code> when there\\n         are no more items to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                },\n                \"Fleets\": {\n                    \"target\": \"com.amazonaws.ec2#FleetSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"FleetSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the EC2 Fleets.</p>\",\n                        \"smithy.api#xmlName\": \"fleetSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeFlowLogs\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeFlowLogsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeFlowLogsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes one or more flow logs.</p>\\n         <p>To view the published flow log records, you must view the log destination. For example, \\n            the CloudWatch Logs log group, the Amazon S3 bucket, or the Kinesis Data Firehose delivery stream.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"FlowLogs\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeFlowLogsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"Filter\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>deliver-log-status</code> - The status of the logs delivery (<code>SUCCESS</code> |\\n                    <code>FAILED</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>log-destination-type</code> - The type of destination for the flow log\\n                    data (<code>cloud-watch-logs</code> | <code>s3</code> |\\n                        <code>kinesis-data-firehose</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>flow-log-id</code> - The ID of the flow log.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>log-group-name</code> - The name of the log group.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>resource-id</code> - The ID of the VPC, subnet, or network interface.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>traffic-type</code> - The type of traffic (<code>ACCEPT</code> |\\n                    <code>REJECT</code> | <code>ALL</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag</code>:<key> - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\\n    For example, to find all resources that have a tag with the key <code>Owner</code> and the value <code>TeamA</code>, specify <code>tag:Owner</code> for the filter name and <code>TeamA</code> for the filter value.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag-key</code> - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"FlowLogIds\": {\n                    \"target\": \"com.amazonaws.ec2#FlowLogIdList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more flow log IDs.</p>\\n         <p>Constraint: Maximum of 1000 flow log IDs.</p>\",\n                        \"smithy.api#xmlName\": \"FlowLogId\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of items to return for this request.\\n\\tTo get the next page of items, make another request with the token returned in the output.\\n\\tFor more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Query-Requests.html#api-pagination\\\">Pagination</a>.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token to request the next page of items. Pagination continues from the end of the items returned by the previous request.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeFlowLogsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"FlowLogs\": {\n                    \"target\": \"com.amazonaws.ec2#FlowLogSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"FlowLogSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the flow logs.</p>\",\n                        \"smithy.api#xmlName\": \"flowLogSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to request the next page of items. This value is <code>null</code> when there are no more items to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeFpgaImageAttribute\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeFpgaImageAttributeRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeFpgaImageAttributeResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the specified attribute of the specified Amazon FPGA Image (AFI).</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DescribeFpgaImageAttributeRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"FpgaImageId\": {\n                    \"target\": \"com.amazonaws.ec2#FpgaImageId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the AFI.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Attribute\": {\n                    \"target\": \"com.amazonaws.ec2#FpgaImageAttributeName\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The AFI attribute.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeFpgaImageAttributeResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"FpgaImageAttribute\": {\n                    \"target\": \"com.amazonaws.ec2#FpgaImageAttribute\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"FpgaImageAttribute\",\n                        \"smithy.api#documentation\": \"<p>Information about the attribute.</p>\",\n                        \"smithy.api#xmlName\": \"fpgaImageAttribute\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeFpgaImages\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeFpgaImagesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeFpgaImagesResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the Amazon FPGA Images (AFIs) available to you. These include public AFIs,\\n\\t\\t\\tprivate AFIs that you own, and AFIs owned by other Amazon Web Services accounts for which you have load\\n\\t\\t\\tpermissions.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"FpgaImages\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeFpgaImagesMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 5,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeFpgaImagesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"FpgaImageIds\": {\n                    \"target\": \"com.amazonaws.ec2#FpgaImageIdList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The AFI IDs.</p>\",\n                        \"smithy.api#xmlName\": \"FpgaImageId\"\n                    }\n                },\n                \"Owners\": {\n                    \"target\": \"com.amazonaws.ec2#OwnerStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Filters the AFI by owner. Specify an Amazon Web Services account ID, <code>self</code> \\n\\t\\t\\t(owner is the sender of the request), or an Amazon Web Services owner alias (valid values are \\n\\t\\t\\t<code>amazon</code> | <code>aws-marketplace</code>).</p>\",\n                        \"smithy.api#xmlName\": \"Owner\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>create-time</code> - The creation time of the AFI.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>fpga-image-id</code> - The FPGA image identifier (AFI ID).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>fpga-image-global-id</code> - The global FPGA image identifier (AGFI ID).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>name</code> - The name of the AFI.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>owner-id</code> - The Amazon Web Services account ID of the AFI owner.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>product-code</code> - The product code.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>shell-version</code> - The version of the Amazon Web Services Shell that was used to create the bitstream.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>state</code> - The state of the AFI (<code>pending</code> | <code>failed</code> | <code>available</code> | <code>unavailable</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag</code>:<key> - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\\n    For example, to find all resources that have a tag with the key <code>Owner</code> and the value <code>TeamA</code>, specify <code>tag:Owner</code> for the filter name and <code>TeamA</code> for the filter value.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag-key</code> - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>update-time</code> - The time of the most recent update.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token to retrieve the next page of results.</p>\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#DescribeFpgaImagesMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return in a single call.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeFpgaImagesResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"FpgaImages\": {\n                    \"target\": \"com.amazonaws.ec2#FpgaImageList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"FpgaImageSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the FPGA images.</p>\",\n                        \"smithy.api#xmlName\": \"fpgaImageSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeFutureCapacityMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeHostReservationOfferings\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeHostReservationOfferingsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeHostReservationOfferingsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the Dedicated Host reservations that are available to purchase.</p>\\n         <p>The results describe all of the Dedicated Host reservation offerings, including\\n            offerings that might not match the instance family and Region of your Dedicated Hosts.\\n            When purchasing an offering, ensure that the instance family and Region of the offering\\n            matches that of the Dedicated Hosts with which it is to be associated. For more\\n            information about supported instance types, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/dedicated-hosts-overview.html\\\">Dedicated Hosts</a>\\n            in the <i>Amazon EC2 User Guide</i>. </p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"OfferingSet\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeHostReservationOfferingsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Filter\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>instance-family</code> - The instance family of the offering (for example,\\n                        <code>m4</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>payment-option</code> - The payment option (<code>NoUpfront</code> |\\n                        <code>PartialUpfront</code> | <code>AllUpfront</code>).</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"MaxDuration\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>This is the maximum duration of the reservation to purchase, specified in seconds.\\n            Reservations are available in one-year and three-year terms. The number of seconds\\n            specified must be the number of seconds in a year (365x24x60x60) times one of the\\n            supported durations (1 or 3). For example, specify 94608000 for three years.</p>\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#DescribeHostReservationsMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return for the request in a single page. The remaining results can be seen by sending another request with the returned <code>nextToken</code> value. This value can be between 5 and 500. If <code>maxResults</code> is given a larger value than 500, you receive an error.</p>\"\n                    }\n                },\n                \"MinDuration\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>This is the minimum duration of the reservation you'd like to purchase, specified in\\n            seconds. Reservations are available in one-year and three-year terms. The number of\\n            seconds specified must be the number of seconds in a year (365x24x60x60) times one of\\n            the supported durations (1 or 3). For example, specify 31536000 for one year.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results.</p>\"\n                    }\n                },\n                \"OfferingId\": {\n                    \"target\": \"com.amazonaws.ec2#OfferingId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the reservation offering.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeHostReservationOfferingsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                },\n                \"OfferingSet\": {\n                    \"target\": \"com.amazonaws.ec2#HostOfferingSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OfferingSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the offerings.</p>\",\n                        \"smithy.api#xmlName\": \"offeringSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeHostReservations\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeHostReservationsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeHostReservationsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes reservations that are associated with Dedicated Hosts in your\\n            account.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"HostReservationSet\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeHostReservationsMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 5,\n                    \"max\": 500\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeHostReservationsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Filter\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>instance-family</code> - The instance family (for example,\\n                    <code>m4</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>payment-option</code> - The payment option (<code>NoUpfront</code> |\\n                        <code>PartialUpfront</code> | <code>AllUpfront</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>state</code> - The state of the reservation (<code>payment-pending</code>\\n                    | <code>payment-failed</code> | <code>active</code> |\\n                    <code>retired</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag:<key></code> - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\\n    For example, to find all resources that have a tag with the key <code>Owner</code> and the value <code>TeamA</code>, specify <code>tag:Owner</code> for the filter name and <code>TeamA</code> for the filter value.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag-key</code> - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"HostReservationIdSet\": {\n                    \"target\": \"com.amazonaws.ec2#HostReservationIdSet\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The host reservation IDs.</p>\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return for the request in a single page. The remaining results can be seen by sending another request with the returned <code>nextToken</code> value. This value can be between 5 and 500. If <code>maxResults</code> is given a larger value than 500, you receive an error.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeHostReservationsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"HostReservationSet\": {\n                    \"target\": \"com.amazonaws.ec2#HostReservationSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"HostReservationSet\",\n                        \"smithy.api#documentation\": \"<p>Details about the reservation's configuration.</p>\",\n                        \"smithy.api#xmlName\": \"hostReservationSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeHosts\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeHostsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeHostsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the specified Dedicated Hosts or all your Dedicated Hosts.</p>\\n         <p>The results describe only the Dedicated Hosts in the Region you're currently using.\\n            All listed instances consume capacity on your Dedicated Host. Dedicated Hosts that have\\n            recently been released are listed with the state <code>released</code>.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"Hosts\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeHostsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"HostIds\": {\n                    \"target\": \"com.amazonaws.ec2#RequestHostIdList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"HostId\",\n                        \"smithy.api#documentation\": \"<p>The IDs of the Dedicated Hosts. The IDs are used for targeted instance\\n            launches.</p>\",\n                        \"smithy.api#xmlName\": \"hostId\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MaxResults\",\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return for the request in a single page. The remaining results can be seen by sending another request with the returned <code>nextToken</code> value. This value can be between 5 and 500. If <code>maxResults</code> is given a larger value than 500, you receive an error.</p>\\n         <p>You cannot specify this parameter and the host IDs parameter in the same\\n            request.</p>\",\n                        \"smithy.api#xmlName\": \"maxResults\"\n                    }\n                },\n                \"Filter\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Filter\",\n                        \"smithy.api#documentation\": \"<p>The filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>auto-placement</code> - Whether auto-placement is enabled or disabled\\n                        (<code>on</code> | <code>off</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>availability-zone</code> - The Availability Zone of the host.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>client-token</code> - The idempotency token that you provided when you\\n                    allocated the host.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>host-reservation-id</code> - The ID of the reservation assigned to this\\n                    host.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>instance-type</code> - The instance type size that the Dedicated Host is\\n                    configured to support.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>state</code> - The allocation state of the Dedicated Host\\n                        (<code>available</code> | <code>under-assessment</code> |\\n                        <code>permanent-failure</code> | <code>released</code> |\\n                        <code>released-permanent-failure</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag-key</code> - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"filter\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeHostsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Hosts\": {\n                    \"target\": \"com.amazonaws.ec2#HostList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"HostSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the Dedicated Hosts.</p>\",\n                        \"smithy.api#xmlName\": \"hostSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeIamInstanceProfileAssociations\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeIamInstanceProfileAssociationsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeIamInstanceProfileAssociationsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes your IAM instance profile associations.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To describe an IAM instance profile association\",\n                        \"documentation\": \"This example describes the specified IAM instance profile association.\",\n                        \"input\": {\n                            \"AssociationIds\": [\n                                \"iip-assoc-0db249b1f25fa24b8\"\n                            ]\n                        },\n                        \"output\": {\n                            \"IamInstanceProfileAssociations\": [\n                                {\n                                    \"InstanceId\": \"i-09eb09efa73ec1dee\",\n                                    \"State\": \"associated\",\n                                    \"AssociationId\": \"iip-assoc-0db249b1f25fa24b8\",\n                                    \"IamInstanceProfile\": {\n                                        \"Id\": \"AIPAJVQN4F5WVLGCJDRGM\",\n                                        \"Arn\": \"arn:aws:iam::123456789012:instance-profile/admin-role\"\n                                    }\n                                }\n                            ]\n                        }\n                    }\n                ],\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"IamInstanceProfileAssociations\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeIamInstanceProfileAssociationsMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 5,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeIamInstanceProfileAssociationsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AssociationIds\": {\n                    \"target\": \"com.amazonaws.ec2#AssociationIdList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IAM instance profile associations.</p>\",\n                        \"smithy.api#xmlName\": \"AssociationId\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>instance-id</code> - The ID of the instance.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>state</code> - The state of the association (<code>associating</code> |\\n                <code>associated</code> | <code>disassociating</code>).</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#DescribeIamInstanceProfileAssociationsMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of items to return for this request. To get the next page of\\n            items, make another request with the token returned in the output. For more information, \\n            see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Query-Requests.html#api-pagination\\\">Pagination</a>.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token returned from a previous paginated request.\\n            Pagination continues from the end of the items returned by the previous request.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeIamInstanceProfileAssociationsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"IamInstanceProfileAssociations\": {\n                    \"target\": \"com.amazonaws.ec2#IamInstanceProfileAssociationSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IamInstanceProfileAssociationSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the IAM instance profile associations.</p>\",\n                        \"smithy.api#xmlName\": \"iamInstanceProfileAssociationSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to include in another request to get the next page of items. \\n            This value is <code>null</code> when there are no more items to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeIdFormat\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeIdFormatRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeIdFormatResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the ID format settings for your resources on a per-Region basis, for example, to view which resource types are enabled for longer IDs. This request only returns information about resource types whose ID formats can be modified; it does not return information about other resource types.</p>\\n         <p>The following resource types support longer IDs: <code>bundle</code> |\\n           <code>conversion-task</code> | <code>customer-gateway</code> | <code>dhcp-options</code> |\\n           <code>elastic-ip-allocation</code> | <code>elastic-ip-association</code> |\\n           <code>export-task</code> | <code>flow-log</code> | <code>image</code> |\\n           <code>import-task</code> | <code>instance</code> | <code>internet-gateway</code> |\\n           <code>network-acl</code> | <code>network-acl-association</code> |\\n           <code>network-interface</code> | <code>network-interface-attachment</code> |\\n           <code>prefix-list</code> | <code>reservation</code> | <code>route-table</code> |\\n           <code>route-table-association</code> | <code>security-group</code> |\\n           <code>snapshot</code> | <code>subnet</code> |\\n           <code>subnet-cidr-block-association</code> | <code>volume</code> | <code>vpc</code>\\n           | <code>vpc-cidr-block-association</code> | <code>vpc-endpoint</code> |\\n           <code>vpc-peering-connection</code> | <code>vpn-connection</code> | <code>vpn-gateway</code>. </p>\\n         <p>These settings apply to the IAM user who makes the request; they do not apply to the entire\\n      Amazon Web Services account. By default, an IAM user defaults to the same settings as the root user, unless\\n      they explicitly override the settings by running the <a>ModifyIdFormat</a> command. Resources\\n      created with longer IDs are visible to all IAM users, regardless of these settings and\\n      provided that they have permission to use the relevant <code>Describe</code> command for the\\n      resource type.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DescribeIdFormatRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Resource\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of resource: <code>bundle</code> |\\n           <code>conversion-task</code> | <code>customer-gateway</code> | <code>dhcp-options</code> |\\n           <code>elastic-ip-allocation</code> | <code>elastic-ip-association</code> |\\n           <code>export-task</code> | <code>flow-log</code> | <code>image</code> |\\n           <code>import-task</code> | <code>instance</code> | <code>internet-gateway</code> |\\n           <code>network-acl</code> | <code>network-acl-association</code> |\\n           <code>network-interface</code> | <code>network-interface-attachment</code> |\\n           <code>prefix-list</code> | <code>reservation</code> | <code>route-table</code> |\\n           <code>route-table-association</code> | <code>security-group</code> |\\n           <code>snapshot</code> | <code>subnet</code> |\\n           <code>subnet-cidr-block-association</code> | <code>volume</code> | <code>vpc</code>\\n           | <code>vpc-cidr-block-association</code> | <code>vpc-endpoint</code> |\\n           <code>vpc-peering-connection</code> | <code>vpn-connection</code> | <code>vpn-gateway</code>\\n         </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeIdFormatResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Statuses\": {\n                    \"target\": \"com.amazonaws.ec2#IdFormatList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"StatusSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the ID format for the resource.</p>\",\n                        \"smithy.api#xmlName\": \"statusSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeIdentityIdFormat\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeIdentityIdFormatRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeIdentityIdFormatResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the ID format settings for resources for the specified IAM user, IAM role, or root\\n      user. For example, you can view the resource types that are enabled for longer IDs. This request only\\n      returns information about resource types whose ID formats can be modified; it does not return\\n      information about other resource types. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/resource-ids.html\\\">Resource IDs</a> in the <i>Amazon Elastic Compute Cloud User Guide</i>. </p>\\n         <p>The following resource types support longer IDs: <code>bundle</code> |\\n          <code>conversion-task</code> | <code>customer-gateway</code> | <code>dhcp-options</code> |\\n          <code>elastic-ip-allocation</code> | <code>elastic-ip-association</code> |\\n          <code>export-task</code> | <code>flow-log</code> | <code>image</code> |\\n          <code>import-task</code> | <code>instance</code> | <code>internet-gateway</code> |\\n          <code>network-acl</code> | <code>network-acl-association</code> |\\n          <code>network-interface</code> | <code>network-interface-attachment</code> |\\n          <code>prefix-list</code> | <code>reservation</code> | <code>route-table</code> |\\n          <code>route-table-association</code> | <code>security-group</code> |\\n          <code>snapshot</code> | <code>subnet</code> |\\n          <code>subnet-cidr-block-association</code> | <code>volume</code> | <code>vpc</code>\\n          | <code>vpc-cidr-block-association</code> | <code>vpc-endpoint</code> |\\n          <code>vpc-peering-connection</code> | <code>vpn-connection</code> | <code>vpn-gateway</code>. </p>\\n         <p>These settings apply to the principal specified in the request. They do not apply to the\\n      principal that makes the request.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DescribeIdentityIdFormatRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Resource\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Resource\",\n                        \"smithy.api#documentation\": \"<p>The type of resource: <code>bundle</code> |\\n          <code>conversion-task</code> | <code>customer-gateway</code> | <code>dhcp-options</code> |\\n          <code>elastic-ip-allocation</code> | <code>elastic-ip-association</code> |\\n          <code>export-task</code> | <code>flow-log</code> | <code>image</code> |\\n          <code>import-task</code> | <code>instance</code> | <code>internet-gateway</code> |\\n          <code>network-acl</code> | <code>network-acl-association</code> |\\n          <code>network-interface</code> | <code>network-interface-attachment</code> |\\n          <code>prefix-list</code> | <code>reservation</code> | <code>route-table</code> |\\n          <code>route-table-association</code> | <code>security-group</code> |\\n          <code>snapshot</code> | <code>subnet</code> |\\n          <code>subnet-cidr-block-association</code> | <code>volume</code> | <code>vpc</code>\\n          | <code>vpc-cidr-block-association</code> | <code>vpc-endpoint</code> |\\n          <code>vpc-peering-connection</code> | <code>vpn-connection</code> | <code>vpn-gateway</code>\\n         </p>\",\n                        \"smithy.api#xmlName\": \"resource\"\n                    }\n                },\n                \"PrincipalArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PrincipalArn\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ARN of the principal, which can be an IAM role, IAM user, or the root user.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"principalArn\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeIdentityIdFormatResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Statuses\": {\n                    \"target\": \"com.amazonaws.ec2#IdFormatList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"StatusSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the ID format for the resources.</p>\",\n                        \"smithy.api#xmlName\": \"statusSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeImageAttribute\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeImageAttributeRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ImageAttribute\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the specified attribute of the specified AMI. You can specify only one attribute\\n      at a time.</p>\\n         <note>\\n            <p>The order of the elements in the response, including those within nested structures,\\n        might vary. Applications should not assume the elements appear in a particular order.</p>\\n         </note>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To describe the launch permissions for an AMI\",\n                        \"documentation\": \"This example describes the launch permissions for the specified AMI.\",\n                        \"input\": {\n                            \"Attribute\": \"launchPermission\",\n                            \"ImageId\": \"ami-5731123e\"\n                        },\n                        \"output\": {\n                            \"ImageId\": \"ami-5731123e\",\n                            \"LaunchPermissions\": [\n                                {\n                                    \"UserId\": \"123456789012\"\n                                }\n                            ]\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#DescribeImageAttributeRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Attribute\": {\n                    \"target\": \"com.amazonaws.ec2#ImageAttributeName\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The AMI attribute.</p>\\n         <p>\\n            <b>Note</b>: The <code>blockDeviceMapping</code> attribute is\\n      deprecated. Using this attribute returns the <code>Client.AuthFailure</code> error. To get\\n      information about the block device mappings for an AMI, describe the image instead.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ImageId\": {\n                    \"target\": \"com.amazonaws.ec2#ImageId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the AMI.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n\\t\\t\\tand provides an error response. If you have the required permissions, the error response is \\n\\t\\t\\t<code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the parameters for DescribeImageAttribute.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeImageReferences\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeImageReferencesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeImageReferencesResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes your Amazon Web Services resources that are referencing the specified images.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-ami-references.html\\\">Identify your resources referencing\\n        specified AMIs</a> in the <i>Amazon EC2 User Guide</i>.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"ImageReferences\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeImageReferencesImageIdStringList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ImageId\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 10\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeImageReferencesMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 5\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeImageReferencesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ImageIds\": {\n                    \"target\": \"com.amazonaws.ec2#DescribeImageReferencesImageIdStringList\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The IDs of the images to check for resource references.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"ImageId\"\n                    }\n                },\n                \"IncludeAllResourceTypes\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies whether to check all supported Amazon Web Services resource types for image references. When\\n      specified, default values are applied for <code>ResourceTypeOptions</code>. For the default\\n      values, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-ami-references.html#how-ami-references-works\\\">How AMI\\n        reference checks work</a> in the <i>Amazon EC2 User Guide</i>. If you also\\n      specify <code>ResourceTypes</code> with <code>ResourceTypeOptions</code>, your specified\\n      values override the default values.</p>\\n         <p>Supported resource types: <code>ec2:Instance</code> | <code>ec2:LaunchTemplate</code> |\\n      <code>ssm:Parameter</code> | <code>imagebuilder:ImageRecipe</code> |\\n      <code>imagebuilder:ContainerRecipe</code>\\n         </p>\\n         <p>Either <code>IncludeAllResourceTypes</code> or <code>ResourceTypes</code> must be\\n      specified.</p>\"\n                    }\n                },\n                \"ResourceTypes\": {\n                    \"target\": \"com.amazonaws.ec2#ResourceTypeRequestList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services resource types to check for image references.</p>\\n         <p>Either <code>IncludeAllResourceTypes</code> or <code>ResourceTypes</code> must be\\n      specified.</p>\",\n                        \"smithy.api#xmlName\": \"ResourceType\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token returned from a previous paginated request. Pagination continues from the end of the items returned by the previous request.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n\\t\\t\\tand provides an error response. If you have the required permissions, the error response is \\n\\t\\t\\t<code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#DescribeImageReferencesMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>\\n      The maximum number of items to return for this request.\\n         To get the next page of items, make another request with the token returned in the output.\\n\\t        For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Query-Requests.html#api-pagination\\\">Pagination</a>.\\n    </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeImageReferencesResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to include in another request to get the next page of items. This value is <code>null</code> when there\\n         are no more items to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                },\n                \"ImageReferences\": {\n                    \"target\": \"com.amazonaws.ec2#ImageReferenceList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ImageReferenceSet\",\n                        \"smithy.api#documentation\": \"<p>The resources that are referencing the specified images.</p>\",\n                        \"smithy.api#xmlName\": \"imageReferenceSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeImageUsageReportEntries\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeImageUsageReportEntriesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeImageUsageReportEntriesResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the entries in image usage reports, showing how your images are used across\\n      other Amazon Web Services accounts.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/your-ec2-ami-usage.html\\\">View your AMI usage</a> in the\\n      <i>Amazon EC2 User Guide</i>.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"ImageUsageReportEntries\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeImageUsageReportEntriesMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeImageUsageReportEntriesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ImageIds\": {\n                    \"target\": \"com.amazonaws.ec2#DescribeImageUsageReportsImageIdStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the images for filtering the report entries. If specified, only report entries\\n      containing these images are returned.</p>\",\n                        \"smithy.api#xmlName\": \"ImageId\"\n                    }\n                },\n                \"ReportIds\": {\n                    \"target\": \"com.amazonaws.ec2#ImageUsageReportIdStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the usage reports.</p>\",\n                        \"smithy.api#xmlName\": \"ReportId\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token returned from a previous paginated request. Pagination continues from the end of the items returned by the previous request.</p>\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>account-id</code> - A 12-digit Amazon Web Services account ID.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>creation-time</code> - The time when the report was created, in the ISO 8601\\n          format in the UTC time zone (YYYY-MM-DDThh:mm:ss.sssZ), for example,\\n          <code>2025-11-29T11:04:43.305Z</code>. You can use a wildcard (<code>*</code>), for\\n          example, <code>2025-11-29T*</code>, which matches an entire day.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>resource-type</code> - The resource type (<code>ec2:Instance</code> |\\n          <code>ec2:LaunchTemplate</code>).</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n\\t\\t\\tand provides an error response. If you have the required permissions, the error response is \\n\\t\\t\\t<code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#DescribeImageUsageReportEntriesMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of items to return for this request.\\n         To get the next page of items, make another request with the token returned in the output.\\n\\t        For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Query-Requests.html#api-pagination\\\">Pagination</a>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeImageUsageReportEntriesResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to include in another request to get the next page of items. This value is <code>null</code> when there\\n         are no more items to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                },\n                \"ImageUsageReportEntries\": {\n                    \"target\": \"com.amazonaws.ec2#ImageUsageReportEntryList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ImageUsageReportEntrySet\",\n                        \"smithy.api#documentation\": \"<p>The content of the usage reports.</p>\",\n                        \"smithy.api#xmlName\": \"imageUsageReportEntrySet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeImageUsageReports\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeImageUsageReportsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeImageUsageReportsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the configuration and status of image usage reports, filtered by report IDs or\\n      image IDs.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/your-ec2-ami-usage.html\\\">View your AMI usage</a> in the\\n      <i>Amazon EC2 User Guide</i>.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"ImageUsageReports\",\n                    \"pageSize\": \"MaxResults\"\n                },\n                \"smithy.waiters#waitable\": {\n                    \"ImageUsageReportAvailable\": {\n                        \"acceptors\": [\n                            {\n                                \"state\": \"success\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"ImageUsageReports[].State\",\n                                        \"expected\": \"available\",\n                                        \"comparator\": \"allStringEquals\"\n                                    }\n                                }\n                            },\n                            {\n                                \"state\": \"failure\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"ImageUsageReports[].State\",\n                                        \"expected\": \"failed\",\n                                        \"comparator\": \"anyStringEquals\"\n                                    }\n                                }\n                            }\n                        ],\n                        \"minDelay\": 15\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeImageUsageReportsImageIdStringList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ImageId\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 200\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeImageUsageReportsMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeImageUsageReportsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ImageIds\": {\n                    \"target\": \"com.amazonaws.ec2#DescribeImageUsageReportsImageIdStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the images for filtering the reports. If specified, only reports containing\\n      these images are returned.</p>\",\n                        \"smithy.api#xmlName\": \"ImageId\"\n                    }\n                },\n                \"ReportIds\": {\n                    \"target\": \"com.amazonaws.ec2#ImageUsageReportIdStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the image usage reports.</p>\",\n                        \"smithy.api#xmlName\": \"ReportId\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token returned from a previous paginated request. Pagination continues from the end of the items returned by the previous request.</p>\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>creation-time</code> - The time when the report was created, in the ISO 8601\\n          format in the UTC time zone (YYYY-MM-DDThh:mm:ss.sssZ), for example,\\n          <code>2025-11-29T11:04:43.305Z</code>. You can use a wildcard (<code>*</code>), for\\n          example, <code>2025-11-29T*</code>, which matches an entire day.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>state</code> - The state of the report (<code>available</code> |\\n          <code>pending</code> | <code>error</code>).</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n\\t\\t\\tand provides an error response. If you have the required permissions, the error response is \\n\\t\\t\\t<code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#DescribeImageUsageReportsMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of items to return for this request.\\n         To get the next page of items, make another request with the token returned in the output.\\n\\t        For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Query-Requests.html#api-pagination\\\">Pagination</a>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeImageUsageReportsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to include in another request to get the next page of items. This value is <code>null</code> when there\\n         are no more items to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                },\n                \"ImageUsageReports\": {\n                    \"target\": \"com.amazonaws.ec2#ImageUsageReportList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ImageUsageReportSet\",\n                        \"smithy.api#documentation\": \"<p>The image usage reports.</p>\",\n                        \"smithy.api#xmlName\": \"imageUsageReportSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeImages\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeImagesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeImagesResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the specified images (AMIs, AKIs, and ARIs) available to you or all of the\\n      images available to you.</p>\\n         <p>The images available to you include public images, private images that you own, and\\n      private images owned by other Amazon Web Services accounts for which you have explicit launch\\n      permissions.</p>\\n         <p>Recently deregistered images appear in the returned results for a short interval and then\\n      return empty results. After all instances that reference a deregistered AMI are terminated,\\n      specifying the ID of the image will eventually return an error indicating that the AMI ID\\n      cannot be found.</p>\\n         <p>When Allowed AMIs is set to <code>enabled</code>, only allowed images are returned in the\\n      results, with the <code>imageAllowed</code> field set to <code>true</code> for each image. In\\n        <code>audit-mode</code>, the <code>imageAllowed</code> field is set to <code>true</code> for\\n      images that meet the account's Allowed AMIs criteria, and <code>false</code> for images that\\n      don't meet the criteria. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-allowed-amis.html\\\">Allowed AMIs</a>.</p>\\n         <p>The Amazon EC2 API follows an eventual consistency model. This means that the result of an API\\n      command you run that creates or modifies resources might not be immediately available to all\\n      subsequent commands you run. For guidance on how to manage eventual consistency, see <a href=\\\"https://docs.aws.amazon.com/ec2/latest/devguide/eventual-consistency.html\\\">Eventual\\n        consistency in the Amazon EC2 API</a> in the <i>Amazon EC2 Developer\\n        Guide</i>.</p>\\n         <important>\\n            <p>We strongly recommend using only paginated requests. Unpaginated requests are\\n        susceptible to throttling and timeouts.</p>\\n         </important>\\n         <note>\\n            <p>The order of the elements in the response, including those within nested structures,\\n        might vary. Applications should not assume the elements appear in a particular order.</p>\\n         </note>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To describe an AMI\",\n                        \"documentation\": \"This example describes the specified AMI.\",\n                        \"input\": {\n                            \"ImageIds\": [\n                                \"ami-5731123e\"\n                            ]\n                        },\n                        \"output\": {\n                            \"Images\": [\n                                {\n                                    \"VirtualizationType\": \"paravirtual\",\n                                    \"Name\": \"My server\",\n                                    \"Hypervisor\": \"xen\",\n                                    \"ImageId\": \"ami-5731123e\",\n                                    \"RootDeviceType\": \"ebs\",\n                                    \"State\": \"available\",\n                                    \"BlockDeviceMappings\": [\n                                        {\n                                            \"DeviceName\": \"/dev/sda1\",\n                                            \"Ebs\": {\n                                                \"DeleteOnTermination\": true,\n                                                \"SnapshotId\": \"snap-1234567890abcdef0\",\n                                                \"VolumeSize\": 8,\n                                                \"VolumeType\": \"standard\"\n                                            }\n                                        }\n                                    ],\n                                    \"Architecture\": \"x86_64\",\n                                    \"ImageLocation\": \"123456789012/My server\",\n                                    \"KernelId\": \"aki-88aa75e1\",\n                                    \"OwnerId\": \"123456789012\",\n                                    \"RootDeviceName\": \"/dev/sda1\",\n                                    \"Public\": false,\n                                    \"ImageType\": \"machine\",\n                                    \"Description\": \"An AMI for my server\"\n                                }\n                            ]\n                        }\n                    }\n                ],\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"Images\",\n                    \"pageSize\": \"MaxResults\"\n                },\n                \"smithy.api#suppress\": [\n                    \"WaitableTraitInvalidErrorType\"\n                ],\n                \"smithy.waiters#waitable\": {\n                    \"ImageAvailable\": {\n                        \"acceptors\": [\n                            {\n                                \"state\": \"success\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"Images[].State\",\n                                        \"expected\": \"available\",\n                                        \"comparator\": \"allStringEquals\"\n                                    }\n                                }\n                            },\n                            {\n                                \"state\": \"failure\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"Images[].State\",\n                                        \"expected\": \"failed\",\n                                        \"comparator\": \"anyStringEquals\"\n                                    }\n                                }\n                            }\n                        ],\n                        \"minDelay\": 15\n                    },\n                    \"ImageExists\": {\n                        \"acceptors\": [\n                            {\n                                \"state\": \"success\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"length(Images[]) > `0`\",\n                                        \"expected\": \"true\",\n                                        \"comparator\": \"booleanEquals\"\n                                    }\n                                }\n                            },\n                            {\n                                \"state\": \"retry\",\n                                \"matcher\": {\n                                    \"errorType\": \"InvalidAMIID.NotFound\"\n                                }\n                            }\n                        ],\n                        \"minDelay\": 15\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeImagesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ExecutableUsers\": {\n                    \"target\": \"com.amazonaws.ec2#ExecutableByStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Scopes the images by users with explicit launch permissions. Specify an Amazon Web Services account ID, <code>self</code> (the sender of the request), or <code>all</code>\\n      (public AMIs).</p>\\n         <ul>\\n            <li>\\n               <p>If you specify an Amazon Web Services account ID that is not your own, only AMIs shared\\n          with that specific Amazon Web Services account ID are returned. However, AMIs that are\\n          shared with the account’s organization or organizational unit (OU) are not\\n          returned.</p>\\n            </li>\\n            <li>\\n               <p>If you specify <code>self</code> or your own Amazon Web Services account ID, AMIs\\n          shared with your account are returned. In addition, AMIs that are shared with the\\n          organization or OU of which you are member are also returned. </p>\\n            </li>\\n            <li>\\n               <p>If you specify <code>all</code>, all public AMIs are returned.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"ExecutableBy\"\n                    }\n                },\n                \"ImageIds\": {\n                    \"target\": \"com.amazonaws.ec2#ImageIdStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The image IDs.</p>\\n         <p>Default: Describes all images available to you.</p>\",\n                        \"smithy.api#xmlName\": \"ImageId\"\n                    }\n                },\n                \"Owners\": {\n                    \"target\": \"com.amazonaws.ec2#OwnerStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Scopes the results to images with the specified owners. You can specify a combination of\\n        Amazon Web Services account IDs, <code>self</code>, <code>amazon</code>,\\n        <code>aws-backup-vault</code>, and <code>aws-marketplace</code>. If you omit this parameter,\\n      the results include all images for which you have launch permissions, regardless of\\n      ownership.</p>\",\n                        \"smithy.api#xmlName\": \"Owner\"\n                    }\n                },\n                \"IncludeDeprecated\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies whether to include deprecated AMIs.</p>\\n         <p>Default: No deprecated AMIs are included in the response.</p>\\n         <note>\\n            <p>If you are the AMI owner, all deprecated AMIs appear in the response regardless of what\\n        you specify for this parameter.</p>\\n         </note>\"\n                    }\n                },\n                \"IncludeDisabled\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies whether to include disabled AMIs.</p>\\n         <p>Default: No disabled AMIs are included in the response.</p>\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of items to return for this request.\\n         To get the next page of items, make another request with the token returned in the output.\\n\\t        For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Query-Requests.html#api-pagination\\\">Pagination</a>.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token returned from a previous paginated request. Pagination continues from the end of the items returned by the previous request.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n\\t\\t\\tand provides an error response. If you have the required permissions, the error response is \\n\\t\\t\\t<code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>architecture</code> - The image architecture (<code>i386</code> |\\n            <code>x86_64</code> | <code>arm64</code> | <code>x86_64_mac</code> |\\n            <code>arm64_mac</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>block-device-mapping.delete-on-termination</code> - A Boolean value that indicates\\n          whether the Amazon EBS volume is deleted on instance termination.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>block-device-mapping.device-name</code> - The device name specified in the block\\n          device mapping (for example, <code>/dev/sdh</code> or <code>xvdh</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>block-device-mapping.snapshot-id</code> - The ID of the snapshot used for the Amazon EBS\\n          volume.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>block-device-mapping.volume-size</code> - The volume size of the Amazon EBS volume, in\\n          GiB.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>block-device-mapping.volume-type</code> - The volume type of the Amazon EBS volume\\n            (<code>io1</code> | <code>io2</code> | <code>gp2</code> | <code>gp3</code> | <code>sc1\\n          </code>| <code>st1</code> | <code>standard</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>block-device-mapping.encrypted</code> - A Boolean that indicates whether the Amazon EBS\\n          volume is encrypted.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>creation-date</code> - The time when the image was created, in the ISO 8601\\n          format in the UTC time zone (YYYY-MM-DDThh:mm:ss.sssZ), for example,\\n            <code>2021-09-29T11:04:43.305Z</code>. You can use a wildcard (<code>*</code>), for\\n          example, <code>2021-09-29T*</code>, which matches an entire day.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>description</code> - The description of the image (provided during image\\n          creation).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ena-support</code> - A Boolean that indicates whether enhanced networking with\\n          ENA is enabled.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>free-tier-eligible</code> - A Boolean that indicates whether this image can be\\n          used under the Amazon Web Services Free Tier  (<code>true</code> | <code>false</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>hypervisor</code> - The hypervisor type (<code>ovm</code> |\\n          <code>xen</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>image-allowed</code> - A Boolean that indicates whether the image meets the\\n          criteria specified for Allowed AMIs.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>image-id</code> - The ID of the image.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>image-type</code> - The image type (<code>machine</code> | <code>kernel</code> |\\n            <code>ramdisk</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>is-public</code> - A Boolean that indicates whether the image is public.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>kernel-id</code> - The kernel ID.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>manifest-location</code> - The location of the image manifest.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>name</code> - The name of the AMI (provided during image creation).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>owner-alias</code> - The owner alias (<code>amazon</code> |\\n            <code>aws-backup-vault</code> | <code>aws-marketplace</code>). The valid aliases are\\n          defined in an Amazon-maintained list. This is not the Amazon Web Services account alias\\n          that can be set using the IAM console. We recommend that you use the <b>Owner</b> request parameter instead of this filter.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>owner-id</code> - The Amazon Web Services account ID of the owner. We recommend\\n          that you use the <b>Owner</b> request parameter instead of this\\n          filter.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>platform</code> - The platform. The only supported value is\\n          <code>windows</code>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>product-code</code> - The product code.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>product-code.type</code> - The type of the product code\\n          (<code>marketplace</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ramdisk-id</code> - The RAM disk ID.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>root-device-name</code> - The device name of the root device volume (for example,\\n            <code>/dev/sda1</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>root-device-type</code> - The type of the root device volume (<code>ebs</code> |\\n            <code>instance-store</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>source-image-id</code> - The ID of the source AMI from which the AMI was\\n          created.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>source-image-region</code> - The Region of the source AMI.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>source-instance-id</code> - The ID of the instance that the AMI was created from\\n          if the AMI was created using CreateImage. This filter is applicable only if the AMI was\\n          created using <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateImage.html\\\">CreateImage</a>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>state</code> - The state of the image (<code>available</code> | <code>pending</code>\\n          | <code>failed</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>state-reason-code</code> - The reason code for the state change.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>state-reason-message</code> - The message for the state change.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>sriov-net-support</code> - A value of <code>simple</code> indicates that\\n          enhanced networking with the Intel 82599 VF interface is enabled.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag:<key></code> - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\\n    For example, to find all resources that have a tag with the key <code>Owner</code> and the value <code>TeamA</code>, specify <code>tag:Owner</code> for the filter name and <code>TeamA</code> for the filter value.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag-key</code> - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>virtualization-type</code> - The virtualization type (<code>paravirtual</code> |\\n            <code>hvm</code>).</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeImagesResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to include in another request to get the next page of items. This value is <code>null</code> when there\\n         are no more items to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                },\n                \"Images\": {\n                    \"target\": \"com.amazonaws.ec2#ImageList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ImagesSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the images.</p>\",\n                        \"smithy.api#xmlName\": \"imagesSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeImportImageTasks\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeImportImageTasksRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeImportImageTasksResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Displays details about an import virtual machine or import snapshot tasks that are already created.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"ImportImageTasks\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeImportImageTasksRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Filter tasks using the <code>task-state</code> filter and one of the following values: <code>active</code>,\\n    <code>completed</code>, <code>deleting</code>, or <code>deleted</code>.</p>\",\n                        \"smithy.api#xmlName\": \"Filters\"\n                    }\n                },\n                \"ImportTaskIds\": {\n                    \"target\": \"com.amazonaws.ec2#ImportTaskIdList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the import image tasks.</p>\",\n                        \"smithy.api#xmlName\": \"ImportTaskId\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return in a single call.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A token that indicates the next page of results.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeImportImageTasksResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ImportImageTasks\": {\n                    \"target\": \"com.amazonaws.ec2#ImportImageTaskList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ImportImageTaskSet\",\n                        \"smithy.api#documentation\": \"<p>A list of zero or more import image tasks that are currently active or were completed or canceled in the\\n   previous 7 days.</p>\",\n                        \"smithy.api#xmlName\": \"importImageTaskSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to get the next page of results. This value is <code>null</code> when there are no more results\\n   to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeImportSnapshotTasks\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeImportSnapshotTasksRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeImportSnapshotTasksResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes your import snapshot tasks.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"ImportSnapshotTasks\",\n                    \"pageSize\": \"MaxResults\"\n                },\n                \"smithy.waiters#waitable\": {\n                    \"SnapshotImported\": {\n                        \"acceptors\": [\n                            {\n                                \"state\": \"success\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"ImportSnapshotTasks[].SnapshotTaskDetail.Status\",\n                                        \"expected\": \"completed\",\n                                        \"comparator\": \"allStringEquals\"\n                                    }\n                                }\n                            },\n                            {\n                                \"state\": \"failure\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"ImportSnapshotTasks[].SnapshotTaskDetail.Status\",\n                                        \"expected\": \"error\",\n                                        \"comparator\": \"anyStringEquals\"\n                                    }\n                                }\n                            }\n                        ],\n                        \"minDelay\": 15\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeImportSnapshotTasksRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The filters.</p>\",\n                        \"smithy.api#xmlName\": \"Filters\"\n                    }\n                },\n                \"ImportTaskIds\": {\n                    \"target\": \"com.amazonaws.ec2#ImportSnapshotTaskIdList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of import snapshot task IDs.</p>\",\n                        \"smithy.api#xmlName\": \"ImportTaskId\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return in a single call. To retrieve the remaining results, make another call\\n   with the returned <code>NextToken</code> value.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A token that indicates the next page of results.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeImportSnapshotTasksResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ImportSnapshotTasks\": {\n                    \"target\": \"com.amazonaws.ec2#ImportSnapshotTaskList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ImportSnapshotTaskSet\",\n                        \"smithy.api#documentation\": \"<p>A list of zero or more import snapshot tasks that are currently active or were completed or canceled in the\\n   previous 7 days.</p>\",\n                        \"smithy.api#xmlName\": \"importSnapshotTaskSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to get the next page of results. This value is <code>null</code> when there are no more results\\n   to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeInstanceAttribute\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeInstanceAttributeRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#InstanceAttribute\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the specified attribute of the specified instance. You can specify only one\\n            attribute at a time.\\n        </p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To describe the block device mapping for an instance\",\n                        \"documentation\": \"This example describes the ``blockDeviceMapping`` attribute of the specified instance.\\n\",\n                        \"input\": {\n                            \"InstanceId\": \"i-1234567890abcdef0\",\n                            \"Attribute\": \"blockDeviceMapping\"\n                        },\n                        \"output\": {\n                            \"InstanceId\": \"i-1234567890abcdef0\",\n                            \"BlockDeviceMappings\": [\n                                {\n                                    \"DeviceName\": \"/dev/sda1\",\n                                    \"Ebs\": {\n                                        \"Status\": \"attached\",\n                                        \"DeleteOnTermination\": true,\n                                        \"VolumeId\": \"vol-049df61146c4d7901\",\n                                        \"AttachTime\": \"2013-05-17T22:42:34.000Z\"\n                                    }\n                                },\n                                {\n                                    \"DeviceName\": \"/dev/sdf\",\n                                    \"Ebs\": {\n                                        \"Status\": \"attached\",\n                                        \"DeleteOnTermination\": false,\n                                        \"VolumeId\": \"vol-049df61146c4d7901\",\n                                        \"AttachTime\": \"2013-09-10T23:07:00.000Z\"\n                                    }\n                                }\n                            ]\n                        }\n                    },\n                    {\n                        \"title\": \"To describe the instance type\",\n                        \"documentation\": \"This example describes the instance type of the specified instance.\\n\",\n                        \"input\": {\n                            \"InstanceId\": \"i-1234567890abcdef0\",\n                            \"Attribute\": \"instanceType\"\n                        },\n                        \"output\": {\n                            \"InstanceId\": \"i-1234567890abcdef0\",\n                            \"InstanceType\": {\n                                \"Value\": \"t1.micro\"\n                            }\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#DescribeInstanceAttributeRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the operation, without actually making the \\n  request, and provides an error response. If you have the required permissions, the error response is \\n  <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"InstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceId\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the instance.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"instanceId\"\n                    }\n                },\n                \"Attribute\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceAttributeName\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Attribute\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The instance attribute.</p>\\n         <p>Note that the <code>enaSupport</code> attribute is not supported.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"attribute\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeInstanceConnectEndpoints\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeInstanceConnectEndpointsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeInstanceConnectEndpointsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the specified EC2 Instance Connect Endpoints or all EC2 Instance Connect Endpoints.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"InstanceConnectEndpoints\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeInstanceConnectEndpointsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n            and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n            Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceConnectEndpointMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of items to return for this request.\\n         To get the next page of items, make another request with the token returned in the output.\\n\\t        For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Query-Requests.html#api-pagination\\\">Pagination</a>.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token returned from a previous paginated request. Pagination continues from the end of the items returned by the previous request.</p>\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>instance-connect-endpoint-id</code> - The ID of the EC2 Instance Connect Endpoint.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>state</code> - The state of the EC2 Instance Connect Endpoint (<code>create-in-progress</code> | <code>create-complete</code> | <code>create-failed</code> | \\n                    <code>delete-in-progress</code> | <code>delete-complete</code> | <code>delete-failed</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>subnet-id</code> - The ID of the subnet in which the EC2 Instance\\n                    Connect Endpoint was created.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag</code>:<key> - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\\n    For example, to find all resources that have a tag with the key <code>Owner</code> and the value <code>TeamA</code>, specify <code>tag:Owner</code> for the filter name and <code>TeamA</code> for the filter value.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag-key</code> - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag-value</code> - The value of a tag assigned to the resource. Use this filter to find all resources \\n                    that have a tag with a specific value, regardless of tag key.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>vpc-id</code> - The ID of the VPC in which the EC2 Instance Connect\\n                    Endpoint was created.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"InstanceConnectEndpointIds\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more EC2 Instance Connect Endpoint IDs.</p>\",\n                        \"smithy.api#xmlName\": \"InstanceConnectEndpointId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeInstanceConnectEndpointsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceConnectEndpoints\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceConnectEndpointSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceConnectEndpointSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the EC2 Instance Connect Endpoints.</p>\",\n                        \"smithy.api#xmlName\": \"instanceConnectEndpointSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to include in another request to get the next page of items. This value is <code>null</code> when there\\n         are no more items to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeInstanceCreditSpecifications\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeInstanceCreditSpecificationsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeInstanceCreditSpecificationsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the credit option for CPU usage of the specified burstable performance\\n            instances. The credit options are <code>standard</code> and\\n            <code>unlimited</code>.</p>\\n         <p>If you do not specify an instance ID, Amazon EC2 returns burstable performance\\n            instances with the <code>unlimited</code> credit option, as well as instances that were\\n            previously configured as T2, T3, and T3a with the <code>unlimited</code> credit option.\\n            For example, if you resize a T2 instance, while it is configured as\\n                <code>unlimited</code>, to an M4 instance, Amazon EC2 returns the M4\\n            instance.</p>\\n         <p>If you specify one or more instance IDs, Amazon EC2 returns the credit option\\n                (<code>standard</code> or <code>unlimited</code>) of those instances. If you specify\\n            an instance ID that is not valid, such as an instance that is not a burstable\\n            performance instance, an error is returned.</p>\\n         <p>Recently terminated instances might appear in the returned results. This interval is\\n            usually less than one hour.</p>\\n         <p>If an Availability Zone is experiencing a service disruption and you specify instance\\n            IDs in the affected zone, or do not specify any instance IDs at all, the call fails. If\\n            you specify only instance IDs in an unaffected zone, the call works normally.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/burstable-performance-instances.html\\\">Burstable\\n                performance instances</a> in the <i>Amazon EC2 User Guide</i>.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"InstanceCreditSpecifications\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeInstanceCreditSpecificationsMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 5,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeInstanceCreditSpecificationsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the operation, without actually making the \\n  request, and provides an error response. If you have the required permissions, the error response is \\n  <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>instance-id</code> - The ID of the instance.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"InstanceIds\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceIdStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The instance IDs.</p>\\n         <p>Default: Describes all your instances.</p>\\n         <p>Constraints: Maximum 1000 explicitly specified instance IDs.</p>\",\n                        \"smithy.api#xmlName\": \"InstanceId\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#DescribeInstanceCreditSpecificationsMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of items to return for this request.\\n         To get the next page of items, make another request with the token returned in the output.\\n\\t        For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Query-Requests.html#api-pagination\\\">Pagination</a>.</p>\\n         <p>You cannot specify this parameter and the instance IDs\\n            parameter in the same call.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token returned from a previous paginated request. Pagination continues from the end of the items returned by the previous request.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeInstanceCreditSpecificationsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceCreditSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceCreditSpecificationList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceCreditSpecificationSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the credit option for CPU usage of an instance.</p>\",\n                        \"smithy.api#xmlName\": \"instanceCreditSpecificationSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to include in another request to get the next page of items. This value is <code>null</code> when there\\n         are no more items to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeInstanceEventNotificationAttributes\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeInstanceEventNotificationAttributesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeInstanceEventNotificationAttributesResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the tag keys that are registered to appear in scheduled event notifications\\n         for resources in the current Region.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DescribeInstanceEventNotificationAttributesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeInstanceEventNotificationAttributesResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceTagAttribute\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceTagNotificationAttribute\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceTagAttribute\",\n                        \"smithy.api#documentation\": \"<p>Information about the registered tag keys.</p>\",\n                        \"smithy.api#xmlName\": \"instanceTagAttribute\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeInstanceEventWindows\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeInstanceEventWindowsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeInstanceEventWindowsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the specified event windows or all event windows.</p>\\n         <p>If you specify event window IDs, the output includes information for only the specified\\n         event windows. If you specify filters, the output includes information for only those event\\n         windows that meet the filter criteria. If you do not specify event windows IDs or filters,\\n         the output includes information for all event windows, which can affect performance. We\\n         recommend that you use pagination to ensure that the operation returns quickly and\\n         successfully. </p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/event-windows.html\\\">Define event windows for scheduled\\n            events</a> in the <i>Amazon EC2 User Guide</i>.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"InstanceEventWindows\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeInstanceEventWindowsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"InstanceEventWindowIds\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceEventWindowIdSet\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the event windows.</p>\",\n                        \"smithy.api#xmlName\": \"InstanceEventWindowId\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>dedicated-host-id</code> - The event windows associated with the specified\\n               Dedicated Host ID.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>event-window-name</code> - The event windows associated with the specified\\n               names. </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>instance-id</code> - The event windows associated with the specified\\n               instance ID.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>instance-tag</code> - The event windows associated with the specified tag\\n               and value.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>instance-tag-key</code> - The event windows associated with the specified\\n               tag key, regardless of the value.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>instance-tag-value</code> - The event windows associated with the specified\\n               tag value, regardless of the key.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag:<key></code> - The key/value combination of a tag assigned to the\\n               event window. Use the tag key in the filter name and the tag value as the filter\\n               value. For example, to find all resources that have a tag with the key\\n                  <code>Owner</code> and the value <code>CMX</code>, specify <code>tag:Owner</code>\\n               for the filter name and <code>CMX</code> for the filter value. </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag-key</code> - The key of a tag assigned to the event window. Use this\\n               filter to find all event windows that have a tag with a specific key, regardless of\\n               the tag value. </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag-value</code> - The value of a tag assigned to the event window. Use this\\n               filter to find all event windows that have a tag with a specific value, regardless of\\n               the tag key. </p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#ResultRange\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return in a single call. To retrieve the remaining\\n         results, make another call with the returned <code>NextToken</code> value. This value can\\n         be between 20 and 500. You cannot specify this parameter and the event window IDs parameter\\n         in the same call.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token to request the next page of results.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describe instance event windows by InstanceEventWindow.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeInstanceEventWindowsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceEventWindows\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceEventWindowSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceEventWindowSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the event windows.</p>\",\n                        \"smithy.api#xmlName\": \"instanceEventWindowSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code>\\n         when there are no more results to return. </p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeInstanceImageMetadata\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeInstanceImageMetadataRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeInstanceImageMetadataResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the AMI that was used to launch an instance, even if the AMI is deprecated,\\n      deregistered, made private (no longer public or shared with your account), or not\\n      allowed.</p>\\n         <p>If you specify instance IDs, the output includes information for only the specified\\n      instances. If you specify filters, the output includes information for only those instances\\n      that meet the filter criteria. If you do not specify instance IDs or filters, the output\\n      includes information for all instances, which can affect performance.</p>\\n         <p>If you specify an instance ID that is not valid, an instance that doesn't exist, or an\\n      instance that you do not own, an error (<code>InvalidInstanceID.NotFound</code>) is\\n      returned.</p>\\n         <p>Recently terminated instances might appear in the returned results. This interval is\\n      usually less than one hour.</p>\\n         <p>In the rare case where an Availability Zone is experiencing a service disruption and you\\n      specify instance IDs that are in the affected Availability Zone, or do not specify any\\n      instance IDs at all, the call fails. If you specify only instance IDs that are in an\\n      unaffected Availability Zone, the call works normally.</p>\\n         <note>\\n            <p>The order of the elements in the response, including those within nested structures,\\n        might vary. Applications should not assume the elements appear in a particular order.</p>\\n         </note>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"InstanceImageMetadata\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeInstanceImageMetadataMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeInstanceImageMetadataRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>availability-zone</code> - The name of the Availability Zone (for example,\\n          <code>us-west-2a</code>) or Local Zone (for example, <code>us-west-2-lax-1b</code>) of\\n          the instance.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>instance-id</code> - The ID of the instance.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>image-allowed</code> - A Boolean that indicates whether the image meets the\\n          criteria specified for Allowed AMIs.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>instance-state-name</code> - The state of the instance (<code>pending</code> |\\n          <code>running</code> | <code>shutting-down</code> | <code>terminated</code> |\\n          <code>stopping</code> | <code>stopped</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>instance-type</code> - The type of instance (for example,\\n          <code>t3.micro</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>launch-time</code> - The time when the instance was launched, in the ISO 8601\\n          format in the UTC time zone (YYYY-MM-DDThh:mm:ss.sssZ), for example,\\n          <code>2023-09-29T11:04:43.305Z</code>. You can use a wildcard (<code>*</code>), for\\n          example, <code>2023-09-29T*</code>, which matches an entire day.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>owner-alias</code> - The owner alias (<code>amazon</code> |\\n          <code>aws-marketplace</code> | <code>aws-backup-vault</code>). The valid aliases are\\n          defined in an Amazon-maintained list. This is not the Amazon Web Services account alias that can be set\\n          using the IAM console. We recommend that you use the <code>Owner</code> request parameter\\n          instead of this filter.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>owner-id</code> - The Amazon Web Services account ID of the owner. We recommend that you use\\n          the <code>Owner</code> request parameter instead of this filter.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag:<key></code> - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\\n    For example, to find all resources that have a tag with the key <code>Owner</code> and the value <code>TeamA</code>, specify <code>tag:Owner</code> for the filter name and <code>TeamA</code> for the filter value.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag-key</code> - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>zone-id</code> - The ID of the Availability Zone (for example,\\n          <code>usw2-az2</code>) or Local Zone (for example, <code>usw2-lax1-az1</code>) of the\\n          instance.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"InstanceIds\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceIdStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The instance IDs.</p>\\n         <p>If you don't specify an instance ID or filters, the output includes information for all\\n      instances.</p>\",\n                        \"smithy.api#xmlName\": \"InstanceId\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#DescribeInstanceImageMetadataMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of items to return for this request.\\n         To get the next page of items, make another request with the token returned in the output.\\n\\t        For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Query-Requests.html#api-pagination\\\">Pagination</a>.</p>\\n         <p>Default: 1000</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token returned from a previous paginated request. Pagination continues from the end of the items returned by the previous request.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n\\t\\t\\tand provides an error response. If you have the required permissions, the error response is \\n\\t\\t\\t<code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeInstanceImageMetadataResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceImageMetadata\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceImageMetadataList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceImageMetadataSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the instance and the AMI used to launch the instance.</p>\",\n                        \"smithy.api#xmlName\": \"instanceImageMetadataSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to include in another request to get the next page of items. This value is <code>null</code> when there\\n         are no more items to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeInstanceStatus\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeInstanceStatusRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeInstanceStatusResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the status of the specified instances or all of your instances. By default,\\n            only running instances are described, unless you specifically indicate to return the\\n            status of all instances.</p>\\n         <p>Instance status includes the following components:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <b>Status checks</b> - Amazon EC2 performs status\\n                    checks on running EC2 instances to identify hardware and software issues. For\\n                    more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/monitoring-system-instance-status-check.html\\\">Status checks for your instances</a> and <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/TroubleshootingInstances.html\\\">Troubleshoot\\n                        instances with failed status checks</a> in the <i>Amazon EC2 User\\n                        Guide</i>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>Scheduled events</b> - Amazon EC2 can schedule\\n                    events (such as reboot, stop, or terminate) for your instances related to\\n                    hardware issues, software updates, or system maintenance. For more information,\\n                    see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/monitoring-instances-status-check_sched.html\\\">Scheduled events for your instances</a> in the <i>Amazon EC2 User\\n                        Guide</i>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>Instance state</b> - You can manage your instances\\n                    from the moment you launch them through their termination. For more information,\\n                    see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-lifecycle.html\\\">Instance\\n                        lifecycle</a> in the <i>Amazon EC2 User Guide</i>.</p>\\n            </li>\\n         </ul>\\n         <p>The Amazon EC2 API follows an eventual consistency model. This means that the result of an\\n            API command you run that creates or modifies resources might not be immediately\\n            available to all subsequent commands you run. For guidance on how to manage eventual\\n            consistency, see <a href=\\\"https://docs.aws.amazon.com/ec2/latest/devguide/eventual-consistency.html\\\">Eventual consistency in the\\n                Amazon EC2 API</a> in the <i>Amazon EC2 Developer\\n            Guide</i>.</p>\\n         <note>\\n            <p>The order of the elements in the response, including those within nested\\n                structures, might vary. Applications should not assume the elements appear in a\\n                particular order.</p>\\n         </note>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To describe the status of an instance\",\n                        \"documentation\": \"This example describes the current status of the specified instance.\",\n                        \"input\": {\n                            \"InstanceIds\": [\n                                \"i-1234567890abcdef0\"\n                            ]\n                        },\n                        \"output\": {\n                            \"InstanceStatuses\": [\n                                {\n                                    \"InstanceId\": \"i-1234567890abcdef0\",\n                                    \"InstanceState\": {\n                                        \"Code\": 16,\n                                        \"Name\": \"running\"\n                                    },\n                                    \"AvailabilityZone\": \"us-east-1d\",\n                                    \"SystemStatus\": {\n                                        \"Status\": \"ok\",\n                                        \"Details\": [\n                                            {\n                                                \"Status\": \"passed\",\n                                                \"Name\": \"reachability\"\n                                            }\n                                        ]\n                                    },\n                                    \"InstanceStatus\": {\n                                        \"Status\": \"ok\",\n                                        \"Details\": [\n                                            {\n                                                \"Status\": \"passed\",\n                                                \"Name\": \"reachability\"\n                                            }\n                                        ]\n                                    }\n                                }\n                            ]\n                        }\n                    }\n                ],\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"InstanceStatuses\",\n                    \"pageSize\": \"MaxResults\"\n                },\n                \"smithy.api#suppress\": [\n                    \"WaitableTraitInvalidErrorType\"\n                ],\n                \"smithy.waiters#waitable\": {\n                    \"InstanceStatusOk\": {\n                        \"acceptors\": [\n                            {\n                                \"state\": \"success\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"InstanceStatuses[].InstanceStatus.Status\",\n                                        \"expected\": \"ok\",\n                                        \"comparator\": \"allStringEquals\"\n                                    }\n                                }\n                            },\n                            {\n                                \"state\": \"retry\",\n                                \"matcher\": {\n                                    \"errorType\": \"InvalidInstanceID.NotFound\"\n                                }\n                            }\n                        ],\n                        \"minDelay\": 15\n                    },\n                    \"SystemStatusOk\": {\n                        \"acceptors\": [\n                            {\n                                \"state\": \"success\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"InstanceStatuses[].SystemStatus.Status\",\n                                        \"expected\": \"ok\",\n                                        \"comparator\": \"allStringEquals\"\n                                    }\n                                }\n                            }\n                        ],\n                        \"minDelay\": 15\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeInstanceStatusRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceIds\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceIdStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The instance IDs.</p>\\n         <p>Default: Describes all your instances.</p>\\n         <p>Constraints: Maximum 100 explicitly specified instance IDs.</p>\",\n                        \"smithy.api#xmlName\": \"InstanceId\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of items to return for this request.\\n         To get the next page of items, make another request with the token returned in the output.\\n\\t        For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Query-Requests.html#api-pagination\\\">Pagination</a>.</p>\\n         <p>You cannot specify this parameter and the instance IDs parameter in the same request.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token returned from a previous paginated request. Pagination continues from the end of the items returned by the previous request.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the operation, without actually making the \\n  request, and provides an error response. If you have the required permissions, the error response is \\n  <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>availability-zone</code> - The Availability Zone of the instance.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>availability-zone-id</code> - The ID of the Availability Zone of the\\n                    instance.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>event.code</code> - The code for the scheduled event\\n                        (<code>instance-reboot</code> | <code>system-reboot</code> |\\n                        <code>system-maintenance</code> | <code>instance-retirement</code> |\\n                        <code>instance-stop</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>event.description</code> - A description of the event.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>event.instance-event-id</code> - The ID of the event whose date and time\\n                    you are modifying.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>event.not-after</code> - The latest end time for the scheduled event\\n                    (for example, <code>2014-09-15T17:15:20.000Z</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>event.not-before</code> - The earliest start time for the scheduled\\n                    event (for example, <code>2014-09-15T17:15:20.000Z</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>event.not-before-deadline</code> - The deadline for starting the event\\n                    (for example, <code>2014-09-15T17:15:20.000Z</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>instance-state-code</code> - The code for the instance state, as a\\n                    16-bit unsigned integer. The high byte is used for internal purposes and should\\n                    be ignored. The low byte is set based on the state represented. The valid values\\n                    are 0 (pending), 16 (running), 32 (shutting-down), 48 (terminated), 64\\n                    (stopping), and 80 (stopped).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>instance-state-name</code> - The state of the instance\\n                        (<code>pending</code> | <code>running</code> | <code>shutting-down</code> |\\n                        <code>terminated</code> | <code>stopping</code> |\\n                    <code>stopped</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>instance-status.reachability</code> - Filters on instance status where\\n                    the name is <code>reachability</code> (<code>passed</code> | <code>failed</code>\\n                    | <code>initializing</code> | <code>insufficient-data</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>instance-status.status</code> - The status of the instance\\n                        (<code>ok</code> | <code>impaired</code> | <code>initializing</code> |\\n                        <code>insufficient-data</code> | <code>not-applicable</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>operator.managed</code> - A Boolean that indicates whether this is a\\n                    managed instance.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>operator.principal</code> - The principal that manages the instance.\\n                    Only valid for managed instances, where <code>managed</code> is\\n                        <code>true</code>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>system-status.reachability</code> - Filters on system status where the\\n                    name is <code>reachability</code> (<code>passed</code> | <code>failed</code> |\\n                        <code>initializing</code> | <code>insufficient-data</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>system-status.status</code> - The system status of the instance\\n                        (<code>ok</code> | <code>impaired</code> | <code>initializing</code> |\\n                        <code>insufficient-data</code> | <code>not-applicable</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>attached-ebs-status.status</code> - The status of the attached EBS volume \\n                    for the instance (<code>ok</code> | <code>impaired</code> | <code>initializing</code> | \\n                    <code>insufficient-data</code> | <code>not-applicable</code>).</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"IncludeAllInstances\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IncludeAllInstances\",\n                        \"smithy.api#documentation\": \"<p>When <code>true</code>, includes the health status for all instances. When\\n                <code>false</code>, includes the health status for running instances only.</p>\\n         <p>Default: <code>false</code>\\n         </p>\",\n                        \"smithy.api#xmlName\": \"includeAllInstances\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeInstanceStatusResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceStatuses\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceStatusList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceStatusSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the status of the instances.</p>\",\n                        \"smithy.api#xmlName\": \"instanceStatusSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to include in another request to get the next page of items. This value is <code>null</code> when there\\n         are no more items to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeInstanceTopology\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeInstanceTopologyRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeInstanceTopologyResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a tree-based hierarchy that represents the physical host placement of your\\n            EC2 instances within an Availability Zone or Local Zone. You can use this information to\\n            determine the relative proximity of your EC2 instances within the Amazon Web Services network to\\n            support your tightly coupled workloads.</p>\\n         <p>Instance topology is supported for specific instance types only. For more information, \\n            see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-topology-prerequisites.html\\\">\\n                Prerequisites for Amazon EC2 instance topology</a> in the <i>Amazon EC2 User Guide</i>.</p>\\n         <note>\\n            <p>The Amazon EC2 API follows an eventual consistency model due to the\\n                distributed nature of the system supporting it. As a result, when you call the\\n                DescribeInstanceTopology API command immediately after launching instances, the\\n                response might return a <code>null</code> value for <code>capacityBlockId</code>\\n                because the data might not have fully propagated across all subsystems. For more\\n                information, see <a href=\\\"https://docs.aws.amazon.com/ec2/latest/devguide/eventual-consistency.html\\\">Eventual consistency in the\\n                    Amazon EC2 API</a> in the <i>Amazon EC2 Developer\\n                        Guide</i>.</p>\\n         </note>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-topology.html\\\">Amazon EC2 instance\\n                topology</a> in the <i>Amazon EC2 User Guide</i>.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"Instances\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeInstanceTopologyGroupNameSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#PlacementGroupName\"\n            }\n        },\n        \"com.amazonaws.ec2#DescribeInstanceTopologyInstanceIdSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#InstanceId\"\n            }\n        },\n        \"com.amazonaws.ec2#DescribeInstanceTopologyMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 100\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeInstanceTopologyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the operation, without actually making the \\n  request, and provides an error response. If you have the required permissions, the error response is \\n  <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token returned from a previous paginated request. Pagination continues from the end of the items returned by the previous request.</p>\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#DescribeInstanceTopologyMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of items to return for this request.\\n         To get the next page of items, make another request with the token returned in the output.\\n\\t        For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Query-Requests.html#api-pagination\\\">Pagination</a>.</p>\\n         <p>You can't specify this parameter and the instance IDs parameter in the same request.</p>\\n         <p>Default: <code>20</code>\\n         </p>\"\n                    }\n                },\n                \"InstanceIds\": {\n                    \"target\": \"com.amazonaws.ec2#DescribeInstanceTopologyInstanceIdSet\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The instance IDs.</p>\\n         <p>Default: Describes all your instances.</p>\\n         <p>Constraints: Maximum 100 explicitly specified instance IDs.</p>\",\n                        \"smithy.api#xmlName\": \"InstanceId\"\n                    }\n                },\n                \"GroupNames\": {\n                    \"target\": \"com.amazonaws.ec2#DescribeInstanceTopologyGroupNameSet\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the placement group that each instance is in.</p>\\n         <p>Constraints: Maximum 100 explicitly specified placement group names.</p>\",\n                        \"smithy.api#xmlName\": \"GroupName\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>availability-zone</code> - The name of the Availability Zone (for\\n                    example, <code>us-west-2a</code>) or Local Zone (for example,\\n                        <code>us-west-2-lax-1b</code>) that the instance is in.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>instance-type</code> - The instance type (for example,\\n                        <code>p4d.24xlarge</code>) or instance family (for example,\\n                        <code>p4d*</code>). You can use the <code>*</code> wildcard to match zero or\\n                    more characters, or the <code>?</code> wildcard to match zero or one\\n                    character.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>zone-id</code> - The ID of the Availability Zone (for example,\\n                        <code>usw2-az2</code>) or Local Zone (for example,\\n                        <code>usw2-lax1-az1</code>) that the instance is in.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeInstanceTopologyResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Instances\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the topology of each instance.</p>\",\n                        \"smithy.api#xmlName\": \"instanceSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to include in another request to get the next page of items. This value is <code>null</code> when there\\n         are no more items to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeInstanceTypeOfferings\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeInstanceTypeOfferingsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeInstanceTypeOfferingsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Lists the instance types that are offered for the specified location. If no location is\\n   specified, the default is to list the instance types that are offered in the current\\n   Region.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"InstanceTypeOfferings\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeInstanceTypeOfferingsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request,\\n         and provides an error response. If you have the required permissions, the error response is\\n         <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"LocationType\": {\n                    \"target\": \"com.amazonaws.ec2#LocationType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The location type.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>availability-zone</code> - The Availability Zone. When you specify a location\\n     filter, it must be an Availability Zone for the current Region.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>availability-zone-id</code> - The AZ ID. When you specify a location filter, it must\\n     be an AZ ID for the current Region.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>outpost</code> - The Outpost ARN. When you specify a location filter, it must be an\\n     Outpost ARN for the current Region.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>region</code> - The current Region. If you specify a location filter, it must match\\n     the current Region.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more filters. Filter names and values are case-sensitive.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>instance-type</code> - The instance type. For a list of possible values, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_Instance.html\\\">Instance</a>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>location</code> - The location. For a list of possible identifiers, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-regions-availability-zones.html\\\">Regions and Zones</a>.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#DITOMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of items to return for this request.\\n         To get the next page of items, make another request with the token returned in the output.\\n\\t        For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Query-Requests.html#api-pagination\\\">Pagination</a>.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token returned from a previous paginated request. Pagination continues from the end of the items returned by the previous request.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeInstanceTypeOfferingsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceTypeOfferings\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceTypeOfferingsList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceTypeOfferingSet\",\n                        \"smithy.api#documentation\": \"<p>The instance types offered in the location.</p>\",\n                        \"smithy.api#xmlName\": \"instanceTypeOfferingSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to include in another request to get the next page of items. This value is <code>null</code> when there\\n         are no more items to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeInstanceTypes\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeInstanceTypesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeInstanceTypesResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the specified instance types. By default, all instance types for the current\\n   Region are described. Alternatively, you can filter the results.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"InstanceTypes\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeInstanceTypesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request,\\n         and provides an error response. If you have the required permissions, the error response is\\n         <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"InstanceTypes\": {\n                    \"target\": \"com.amazonaws.ec2#RequestInstanceTypeList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The instance types.</p>\",\n                        \"smithy.api#xmlName\": \"InstanceType\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more filters. Filter names and values are case-sensitive.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>auto-recovery-supported</code> - Indicates whether Amazon CloudWatch action\\n     based recovery is supported  (<code>true</code> | <code>false</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>bare-metal</code> - Indicates whether it is a bare metal instance type\\n      (<code>true</code> | <code>false</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>burstable-performance-supported</code> - Indicates whether the instance type is a\\n     burstable performance T instance type  (<code>true</code> | <code>false</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>current-generation</code> - Indicates whether this instance type is the latest\\n     generation instance type of an instance family  (<code>true</code> | <code>false</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>dedicated-hosts-supported</code> - Indicates whether the instance type supports\\n     Dedicated Hosts.  (<code>true</code> | <code>false</code>)</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ebs-info.attachment-limit-type</code> - The type of Amazon EBS volume attachment limit \\n     (<code>shared</code> | <code>dedicated</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ebs-info.maximum-ebs-attachments</code> - The maximum number of Amazon EBS volumes that \\n     can be attached to the instance type.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ebs-info.ebs-optimized-info.baseline-bandwidth-in-mbps</code> - The baseline\\n     bandwidth performance for an EBS-optimized instance type, in Mbps.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ebs-info.ebs-optimized-info.baseline-iops</code> - The baseline input/output storage\\n     operations per second for an EBS-optimized instance type.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ebs-info.ebs-optimized-info.baseline-throughput-in-mbps</code> - The baseline\\n     throughput performance for an EBS-optimized instance type, in MB/s.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ebs-info.ebs-optimized-info.maximum-bandwidth-in-mbps</code> - The maximum bandwidth\\n     performance for an EBS-optimized instance type, in Mbps.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ebs-info.ebs-optimized-info.maximum-iops</code> - The maximum input/output storage\\n     operations per second for an EBS-optimized instance type.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ebs-info.ebs-optimized-info.maximum-throughput-in-mbps</code> - The maximum\\n     throughput performance for an EBS-optimized instance type, in MB/s.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ebs-info.ebs-optimized-support</code> - Indicates whether the instance type is\\n     EBS-optimized (<code>supported</code> | <code>unsupported</code> |\\n     <code>default</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ebs-info.encryption-support</code> - Indicates whether EBS encryption is supported\\n      (<code>supported</code> | <code>unsupported</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ebs-info.nvme-support</code> - Indicates whether non-volatile memory express (NVMe)\\n     is supported for EBS volumes (<code>required</code> | <code>supported</code> |\\n      <code>unsupported</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>free-tier-eligible</code> - A Boolean that indicates whether this instance type can\\n     be used under the Amazon Web Services Free Tier  (<code>true</code> | <code>false</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>hibernation-supported</code> - Indicates whether On-Demand hibernation is supported\\n      (<code>true</code> | <code>false</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>hypervisor</code> - The hypervisor (<code>nitro</code> | <code>xen</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>instance-storage-info.disk.count</code> - The number of local disks.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>instance-storage-info.disk.size-in-gb</code> - The storage size of each instance\\n     storage disk, in GB.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>instance-storage-info.disk.type</code> - The storage technology for the local\\n     instance storage disks (<code>hdd</code> | <code>ssd</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>instance-storage-info.encryption-support</code> - Indicates whether data is\\n     encrypted at rest (<code>required</code> | <code>supported</code> |\\n     <code>unsupported</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>instance-storage-info.nvme-support</code> - Indicates whether non-volatile memory\\n     express (NVMe) is supported for instance store (<code>required</code> | <code>supported</code>\\n     | <code>unsupported</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>instance-storage-info.total-size-in-gb</code> - The total amount of storage\\n     available from all local instance storage, in GB.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>instance-storage-supported</code> - Indicates whether the instance type has local\\n     instance storage  (<code>true</code> | <code>false</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>instance-type</code> - The instance type (for example <code>c5.2xlarge</code> or\\n     c5*).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>memory-info.size-in-mib</code> - The memory size.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-info.bandwidth-weightings</code> - For instances that support bandwidth\\n     weighting to boost performance (<code>default</code>, <code>vpc-1</code>,\\n     <code>ebs-1</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-info.efa-info.maximum-efa-interfaces</code> - The maximum number of Elastic\\n     Fabric Adapters (EFAs) per instance.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-info.efa-supported</code> - Indicates whether the instance type supports\\n     Elastic Fabric Adapter (EFA)  (<code>true</code> | <code>false</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-info.ena-support</code> - Indicates whether Elastic Network Adapter (ENA) is\\n     supported or required (<code>required</code> | <code>supported</code> |\\n      <code>unsupported</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-info.flexible-ena-queues-support</code> - Indicates whether an instance supports\\n     flexible ENA queues (<code>supported</code> | <code>unsupported</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-info.encryption-in-transit-supported</code> - Indicates whether the instance\\n     type automatically encrypts in-transit traffic between instances  (<code>true</code> | <code>false</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-info.ipv4-addresses-per-interface</code> - The maximum number of private\\n     IPv4 addresses per network interface.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-info.ipv6-addresses-per-interface</code> - The maximum number of private\\n     IPv6 addresses per network interface.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-info.ipv6-supported</code> - Indicates whether the instance type supports\\n     IPv6  (<code>true</code> | <code>false</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-info.maximum-network-cards</code> - The maximum number of network cards per\\n     instance.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-info.maximum-network-interfaces</code> - The maximum number of network\\n     interfaces per instance.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-info.network-performance</code> - The network performance (for example, \\\"25\\n     Gigabit\\\").</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>nitro-enclaves-support</code> - Indicates whether Nitro Enclaves is supported\\n      (<code>supported</code> | <code>unsupported</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>nitro-tpm-support</code> - Indicates whether NitroTPM is supported\\n      (<code>supported</code> | <code>unsupported</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>nitro-tpm-info.supported-versions</code> - The supported NitroTPM version\\n      (<code>2.0</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>processor-info.supported-architecture</code> - The CPU architecture\\n      (<code>arm64</code> | <code>i386</code> | <code>x86_64</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>processor-info.sustained-clock-speed-in-ghz</code> - The CPU clock speed, in\\n     GHz.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>processor-info.supported-features</code> - The supported CPU features\\n      (<code>amd-sev-snp</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>reboot-migration-support</code> - Indicates whether enabling reboot migration is\\n     supported (<code>supported</code> | <code>unsupported</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>supported-boot-mode</code> - The boot mode (<code>legacy-bios</code> |\\n      <code>uefi</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>supported-root-device-type</code> - The root device type (<code>ebs</code> |\\n      <code>instance-store</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>supported-usage-class</code> - The usage class (<code>on-demand</code> |\\n      <code>spot</code> | <code>capacity-block</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>supported-virtualization-type</code> - The virtualization type (<code>hvm</code> |\\n      <code>paravirtual</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>vcpu-info.default-cores</code> - The default number of cores for the instance\\n     type.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>vcpu-info.default-threads-per-core</code> - The default number of threads per core\\n     for the instance type.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>vcpu-info.default-vcpus</code> - The default number of vCPUs for the instance\\n     type.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>vcpu-info.valid-cores</code> - The number of cores that can be configured for the\\n     instance type.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>vcpu-info.valid-threads-per-core</code> - The number of threads per core that can be\\n     configured for the instance type. For example, \\\"1\\\" or \\\"1,2\\\".</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#DITMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of items to return for this request.\\n         To get the next page of items, make another request with the token returned in the output.\\n\\t        For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Query-Requests.html#api-pagination\\\">Pagination</a>.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token returned from a previous paginated request. Pagination continues from the end of the items returned by the previous request.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeInstanceTypesResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceTypes\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceTypeInfoList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceTypeSet\",\n                        \"smithy.api#documentation\": \"<p>The instance type.</p>\",\n                        \"smithy.api#xmlName\": \"instanceTypeSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to include in another request to get the next page of items. This value is <code>null</code> when there\\n         are no more items to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeInstances\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeInstancesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeInstancesResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the specified instances or all instances.</p>\\n         <p>If you specify instance IDs, the output includes information for only the specified\\n            instances. If you specify filters, the output includes information for only those\\n            instances that meet the filter criteria. If you do not specify instance IDs or filters,\\n            the output includes information for all instances, which can affect performance. We\\n            recommend that you use pagination to ensure that the operation returns quickly and\\n            successfully.</p>\\n         <p>If you specify an instance ID that is not valid, an error is returned. If you specify\\n            an instance that you do not own, it is not included in the output.</p>\\n         <p>Recently terminated instances might appear in the returned results. This interval is\\n            usually less than one hour.</p>\\n         <p>If you describe instances in the rare case where an Availability Zone is experiencing\\n            a service disruption and you specify instance IDs that are in the affected zone, or do\\n            not specify any instance IDs at all, the call fails. If you describe instances and\\n            specify only instance IDs that are in an unaffected zone, the call works\\n            normally.</p>\\n         <p>The Amazon EC2 API follows an eventual consistency model. This means that the result of an\\n            API command you run that creates or modifies resources might not be immediately\\n            available to all subsequent commands you run. For guidance on how to manage eventual\\n            consistency, see <a href=\\\"https://docs.aws.amazon.com/ec2/latest/devguide/eventual-consistency.html\\\">Eventual consistency in the\\n                Amazon EC2 API</a> in the <i>Amazon EC2 Developer\\n            Guide</i>.</p>\\n         <important>\\n            <p>We strongly recommend using only paginated requests. Unpaginated requests are\\n                susceptible to throttling and timeouts.</p>\\n         </important>\\n         <note>\\n            <p>The order of the elements in the response, including those within nested\\n                structures, might vary. Applications should not assume the elements appear in a\\n                particular order.</p>\\n         </note>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To describe an Amazon EC2 instance\",\n                        \"documentation\": \"This example describes the specified instance.\",\n                        \"input\": {\n                            \"InstanceIds\": [\n                                \"i-1234567890abcdef0\"\n                            ]\n                        },\n                        \"output\": {}\n                    },\n                    {\n                        \"title\": \"To describe the instances with a specific tag\",\n                        \"documentation\": \"This example describes the instances with the Purpose=test tag.\",\n                        \"input\": {\n                            \"Filters\": [\n                                {\n                                    \"Name\": \"tag:Purpose\",\n                                    \"Values\": [\n                                        \"test\"\n                                    ]\n                                }\n                            ]\n                        },\n                        \"output\": {}\n                    },\n                    {\n                        \"title\": \"To describe the instances with a specific instance type\",\n                        \"documentation\": \"This example describes the instances with the t2.micro instance type.\",\n                        \"input\": {\n                            \"Filters\": [\n                                {\n                                    \"Name\": \"instance-type\",\n                                    \"Values\": [\n                                        \"t2.micro\"\n                                    ]\n                                }\n                            ]\n                        },\n                        \"output\": {}\n                    }\n                ],\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"Reservations\",\n                    \"pageSize\": \"MaxResults\"\n                },\n                \"smithy.api#suppress\": [\n                    \"WaitableTraitInvalidErrorType\"\n                ],\n                \"smithy.test#smokeTests\": [\n                    {\n                        \"id\": \"DescribeInstancesFailure\",\n                        \"params\": {\n                            \"InstanceIds\": [\n                                \"i-12345678\"\n                            ]\n                        },\n                        \"vendorParams\": {\n                            \"region\": \"us-west-2\"\n                        },\n                        \"vendorParamsShape\": \"aws.test#AwsVendorParams\",\n                        \"expect\": {\n                            \"failure\": {}\n                        }\n                    }\n                ],\n                \"smithy.waiters#waitable\": {\n                    \"InstanceExists\": {\n                        \"acceptors\": [\n                            {\n                                \"state\": \"success\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"length(Reservations[]) > `0`\",\n                                        \"expected\": \"true\",\n                                        \"comparator\": \"booleanEquals\"\n                                    }\n                                }\n                            },\n                            {\n                                \"state\": \"retry\",\n                                \"matcher\": {\n                                    \"errorType\": \"InvalidInstanceID.NotFound\"\n                                }\n                            }\n                        ],\n                        \"minDelay\": 5\n                    },\n                    \"InstanceRunning\": {\n                        \"acceptors\": [\n                            {\n                                \"state\": \"success\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"Reservations[].Instances[].State.Name\",\n                                        \"expected\": \"running\",\n                                        \"comparator\": \"allStringEquals\"\n                                    }\n                                }\n                            },\n                            {\n                                \"state\": \"failure\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"Reservations[].Instances[].State.Name\",\n                                        \"expected\": \"shutting-down\",\n                                        \"comparator\": \"anyStringEquals\"\n                                    }\n                                }\n                            },\n                            {\n                                \"state\": \"failure\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"Reservations[].Instances[].State.Name\",\n                                        \"expected\": \"terminated\",\n                                        \"comparator\": \"anyStringEquals\"\n                                    }\n                                }\n                            },\n                            {\n                                \"state\": \"failure\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"Reservations[].Instances[].State.Name\",\n                                        \"expected\": \"stopping\",\n                                        \"comparator\": \"anyStringEquals\"\n                                    }\n                                }\n                            },\n                            {\n                                \"state\": \"retry\",\n                                \"matcher\": {\n                                    \"errorType\": \"InvalidInstanceID.NotFound\"\n                                }\n                            }\n                        ],\n                        \"minDelay\": 15\n                    },\n                    \"InstanceStopped\": {\n                        \"acceptors\": [\n                            {\n                                \"state\": \"success\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"Reservations[].Instances[].State.Name\",\n                                        \"expected\": \"stopped\",\n                                        \"comparator\": \"allStringEquals\"\n                                    }\n                                }\n                            },\n                            {\n                                \"state\": \"failure\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"Reservations[].Instances[].State.Name\",\n                                        \"expected\": \"pending\",\n                                        \"comparator\": \"anyStringEquals\"\n                                    }\n                                }\n                            },\n                            {\n                                \"state\": \"failure\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"Reservations[].Instances[].State.Name\",\n                                        \"expected\": \"terminated\",\n                                        \"comparator\": \"anyStringEquals\"\n                                    }\n                                }\n                            }\n                        ],\n                        \"minDelay\": 15\n                    },\n                    \"InstanceTerminated\": {\n                        \"acceptors\": [\n                            {\n                                \"state\": \"success\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"Reservations[].Instances[].State.Name\",\n                                        \"expected\": \"terminated\",\n                                        \"comparator\": \"allStringEquals\"\n                                    }\n                                }\n                            },\n                            {\n                                \"state\": \"failure\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"Reservations[].Instances[].State.Name\",\n                                        \"expected\": \"pending\",\n                                        \"comparator\": \"anyStringEquals\"\n                                    }\n                                }\n                            },\n                            {\n                                \"state\": \"failure\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"Reservations[].Instances[].State.Name\",\n                                        \"expected\": \"stopping\",\n                                        \"comparator\": \"anyStringEquals\"\n                                    }\n                                }\n                            }\n                        ],\n                        \"minDelay\": 15\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeInstancesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceIds\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceIdStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The instance IDs.</p>\\n         <p>Default: Describes all your instances.</p>\",\n                        \"smithy.api#xmlName\": \"InstanceId\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the operation, without actually making the \\n  request, and provides an error response. If you have the required permissions, the error response is \\n  <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>affinity</code> - The affinity setting for an instance running on a\\n                    Dedicated Host (<code>default</code> | <code>host</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>architecture</code> - The instance architecture (<code>i386</code> |\\n                        <code>x86_64</code> | <code>arm64</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>availability-zone</code> - The Availability Zone of the instance.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>availability-zone-id</code> - The ID of the Availability Zone of the\\n                    instance.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>block-device-mapping.attach-time</code> - The attach time for an EBS\\n                    volume mapped to the instance, for example,\\n                        <code>2022-09-15T17:15:20.000Z</code>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>block-device-mapping.delete-on-termination</code> - A Boolean that\\n                    indicates whether the EBS volume is deleted on instance termination.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>block-device-mapping.device-name</code> - The device name specified in\\n                    the block device mapping (for example, <code>/dev/sdh</code> or\\n                        <code>xvdh</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>block-device-mapping.status</code> - The status for the EBS volume\\n                        (<code>attaching</code> | <code>attached</code> | <code>detaching</code> |\\n                        <code>detached</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>block-device-mapping.volume-id</code> - The volume ID of the EBS\\n                    volume.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>boot-mode</code> - The boot mode that was specified by the AMI\\n                        (<code>legacy-bios</code> | <code>uefi</code> |\\n                    <code>uefi-preferred</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>capacity-reservation-id</code> - The ID of the Capacity Reservation into which the\\n                    instance was launched.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>capacity-reservation-specification.capacity-reservation-preference</code>\\n                    - The instance's Capacity Reservation preference (<code>open</code> | <code>none</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>capacity-reservation-specification.capacity-reservation-target.capacity-reservation-id</code>\\n                    - The ID of the targeted Capacity Reservation.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>capacity-reservation-specification.capacity-reservation-target.capacity-reservation-resource-group-arn</code>\\n                    - The ARN of the targeted Capacity Reservation group.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>client-token</code> - The idempotency token you provided when you\\n                    launched the instance.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>current-instance-boot-mode</code> - The boot mode that is used to launch\\n                    the instance at launch or start (<code>legacy-bios</code> |\\n                    <code>uefi</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>dns-name</code> - The public DNS name of the instance.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ebs-optimized</code> - A Boolean that indicates whether the instance is\\n                    optimized for Amazon EBS I/O.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ena-support</code> - A Boolean that indicates whether the instance is\\n                    enabled for enhanced networking with ENA.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>enclave-options.enabled</code> - A Boolean that indicates whether the\\n                    instance is enabled for Amazon Web Services Nitro Enclaves.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>hibernation-options.configured</code> - A Boolean that indicates whether\\n                    the instance is enabled for hibernation. A value of <code>true</code> means that\\n                    the instance is enabled for hibernation.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>host-id</code> - The ID of the Dedicated Host on which the instance is\\n                    running, if applicable.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>hypervisor</code> - The hypervisor type of the instance\\n                        (<code>ovm</code> | <code>xen</code>). The value <code>xen</code> is used\\n                    for both Xen and Nitro hypervisors.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>iam-instance-profile.arn</code> - The instance profile associated with\\n                    the instance. Specified as an ARN.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>iam-instance-profile.id</code> - The instance profile associated with\\n                    the instance. Specified as an ID.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>image-id</code> - The ID of the image used to launch the\\n                    instance.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>instance-id</code> - The ID of the instance.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>instance-lifecycle</code> - Indicates whether this is a Spot Instance, a Scheduled Instance, or\\n                     a Capacity Block (<code>spot</code> | <code>scheduled</code> | <code>capacity-block</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>instance-state-code</code> - The state of the instance, as a 16-bit\\n                    unsigned integer. The high byte is used for internal purposes and should be\\n                    ignored. The low byte is set based on the state represented. The valid values\\n                    are: 0 (pending), 16 (running), 32 (shutting-down), 48 (terminated), 64\\n                    (stopping), and 80 (stopped).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>instance-state-name</code> - The state of the instance\\n                        (<code>pending</code> | <code>running</code> | <code>shutting-down</code> |\\n                        <code>terminated</code> | <code>stopping</code> |\\n                    <code>stopped</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>instance-type</code> - The type of instance (for example,\\n                        <code>t2.micro</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>instance.group-id</code> - The ID of the security group for the\\n                    instance. </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>instance.group-name</code> - The name of the security group for the\\n                    instance. </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ip-address</code> - The public IPv4 address of the instance.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ipv6-address</code> - The IPv6 address of the instance.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>kernel-id</code> - The kernel ID.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>key-name</code> - The name of the key pair used when the instance was\\n                    launched.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>launch-index</code> - When launching multiple instances, this is the\\n                    index for the instance in the launch group (for example, 0, 1, 2, and so on).\\n                </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>launch-time</code> - The time when the instance was launched, in the ISO\\n                    8601 format in the UTC time zone (YYYY-MM-DDThh:mm:ss.sssZ), for example,\\n                        <code>2021-09-29T11:04:43.305Z</code>. You can use a wildcard\\n                        (<code>*</code>), for example, <code>2021-09-29T*</code>, which matches an\\n                    entire day.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>maintenance-options.auto-recovery</code> - The current automatic\\n                    recovery behavior of the instance (<code>disabled</code> | <code>default</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>metadata-options.http-endpoint</code> - The status of access to the HTTP\\n                    metadata endpoint on your instance (<code>enabled</code> |\\n                    <code>disabled</code>)</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>metadata-options.http-protocol-ipv4</code> - Indicates whether the IPv4\\n                    endpoint is enabled (<code>disabled</code> | <code>enabled</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>metadata-options.http-protocol-ipv6</code> - Indicates whether the IPv6\\n                    endpoint is enabled (<code>disabled</code> | <code>enabled</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>metadata-options.http-put-response-hop-limit</code> - The HTTP metadata\\n                    request put response hop limit (integer, possible values <code>1</code> to\\n                        <code>64</code>)</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>metadata-options.http-tokens</code> - The metadata request authorization\\n                    state (<code>optional</code> | <code>required</code>)</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>metadata-options.instance-metadata-tags</code> - The status of access to\\n                    instance tags from the instance metadata (<code>enabled</code> |\\n                        <code>disabled</code>)</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>metadata-options.state</code> - The state of the metadata option changes\\n                        (<code>pending</code> | <code>applied</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>monitoring-state</code> - Indicates whether detailed monitoring is\\n                    enabled (<code>disabled</code> | <code>enabled</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-interface.addresses.association.allocation-id</code> - The allocation ID.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-interface.addresses.association.association-id</code> - The association ID.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-interface.addresses.association.carrier-ip</code> - The carrier IP address.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-interface.addresses.association.customer-owned-ip</code> - The customer-owned IP address.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-interface.addresses.association.ip-owner-id</code> - The owner\\n                    ID of the private IPv4 address associated with the network interface.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-interface.addresses.association.public-dns-name</code> - The public DNS name.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-interface.addresses.association.public-ip</code> - The ID of the\\n                    association of an Elastic IP address (IPv4) with a network interface.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-interface.addresses.primary</code> - Specifies whether the IPv4\\n                    address of the network interface is the primary private IPv4 address.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-interface.addresses.private-dns-name</code> - The private DNS name.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-interface.addresses.private-ip-address</code> - The private IPv4\\n                    address associated with the network interface.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-interface.association.allocation-id</code> - The allocation ID\\n                    returned when you allocated the Elastic IP address (IPv4) for your network\\n                    interface.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-interface.association.association-id</code> - The association ID\\n                    returned when the network interface was associated with an IPv4 address.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-interface.association.carrier-ip</code> - The customer-owned IP address.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-interface.association.customer-owned-ip</code> - The customer-owned IP address.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-interface.association.ip-owner-id</code> - The owner of the\\n                    Elastic IP address (IPv4) associated with the network interface.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-interface.association.public-dns-name</code> - The public DNS name.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-interface.association.public-ip</code> - The address of the\\n                    Elastic IP address (IPv4) bound to the network interface.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-interface.attachment.attach-time</code> - The time that the\\n                    network interface was attached to an instance.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-interface.attachment.attachment-id</code> - The ID of the\\n                    interface attachment.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-interface.attachment.delete-on-termination</code> - Specifies\\n                    whether the attachment is deleted when an instance is terminated.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-interface.attachment.device-index</code> - The device index to\\n                    which the network interface is attached.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-interface.attachment.instance-id</code> - The ID of the instance\\n                    to which the network interface is attached.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-interface.attachment.instance-owner-id</code> - The owner ID of\\n                    the instance to which the network interface is attached.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-interface.attachment.network-card-index</code> - The index of the network card.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-interface.attachment.status</code> - The status of the\\n                    attachment (<code>attaching</code> | <code>attached</code> |\\n                    <code>detaching</code> | <code>detached</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-interface.availability-zone</code> - The Availability Zone for\\n                    the network interface.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-interface.deny-all-igw-traffic</code> - A Boolean that indicates whether \\n                a network interface with an IPv6 address is unreachable from the public internet.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-interface.description</code> - The description of the network\\n                    interface.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-interface.group-id</code> - The ID of a security group\\n                    associated with the network interface.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-interface.group-name</code> - The name of a security group\\n                    associated with the network interface.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-interface.ipv4-prefixes.ipv4-prefix</code> - The IPv4 prefixes that are assigned to the network interface.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-interface.ipv6-address</code> - The IPv6 address associated with the network interface.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-interface.ipv6-addresses.ipv6-address</code> - The IPv6 address\\n                    associated with the network interface.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-interface.ipv6-addresses.is-primary-ipv6</code> - A Boolean that indicates whether this\\n                    is the primary IPv6 address.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-interface.ipv6-native</code> - A Boolean that indicates whether this is\\n                    an IPv6 only network interface.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-interface.ipv6-prefixes.ipv6-prefix</code> - The IPv6 prefix assigned to the network interface.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-interface.mac-address</code> - The MAC address of the network\\n                    interface.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-interface.network-interface-id</code> - The ID of the network\\n                    interface.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-interface.operator.managed</code> - A Boolean that indicates\\n                    whether the instance has a managed network interface.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-interface.operator.principal</code> - The principal that manages\\n                    the network interface. Only valid for instances with managed network interfaces,\\n                    where <code>managed</code> is <code>true</code>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-interface.outpost-arn</code> - The ARN of the Outpost.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-interface.owner-id</code> - The ID of the owner of the network\\n                    interface.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-interface.private-dns-name</code> - The private DNS name of the\\n                    network interface.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-interface.private-ip-address</code> - The private IPv4 address.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-interface.public-dns-name</code> - The public DNS name.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-interface.requester-id</code> - The requester ID for the network\\n                    interface.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-interface.requester-managed</code> - Indicates whether the\\n                    network interface is being managed by Amazon Web Services.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-interface.status</code> - The status of the network interface\\n                        (<code>available</code>) | <code>in-use</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-interface.source-dest-check</code> - Whether the network\\n                    interface performs source/destination checking. A value of <code>true</code>\\n                    means that checking is enabled, and <code>false</code> means that checking is\\n                    disabled. The value must be <code>false</code> for the network interface to\\n                    perform network address translation (NAT) in your VPC.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-interface.subnet-id</code> - The ID of the subnet for the\\n                    network interface.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-interface.tag-key</code> - The key of a tag assigned to the network interface.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-interface.tag-value</code> - The value of a tag assigned to the network interface.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-interface.vpc-id</code> - The ID of the VPC for the network\\n                    interface.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-performance-options.bandwidth-weighting</code> - Where the performance boost \\n        \\t\\t\\tis applied, if applicable. Valid values: <code>default</code>, <code>vpc-1</code>, \\n        \\t\\t\\t<code>ebs-1</code>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>operator.managed</code> - A Boolean that indicates whether this is a\\n                    managed instance.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>operator.principal</code> - The principal that manages the instance.\\n                    Only valid for managed instances, where <code>managed</code> is\\n                        <code>true</code>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>outpost-arn</code> - The Amazon Resource Name (ARN) of the\\n                    Outpost.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>owner-id</code> - The Amazon Web Services account ID of the instance\\n                    owner.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>placement-group-name</code> - The name of the placement group for the\\n                    instance.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>placement-partition-number</code> - The partition in which the instance is\\n                    located.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>platform</code> - The platform. To list only Windows instances, use\\n                        <code>windows</code>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>platform-details</code> - The platform (<code>Linux/UNIX</code> |\\n                        <code>Red Hat BYOL Linux</code> | <code> Red Hat Enterprise Linux</code> |\\n                    <code>Red Hat Enterprise Linux with HA</code> | <code>Red Hat Enterprise Linux with High Availability</code> | <code>Red Hat Enterprise\\n                        Linux with SQL Server Standard and HA</code> | <code>Red Hat Enterprise\\n                        Linux with SQL Server Enterprise and HA</code> | <code>Red Hat Enterprise\\n                        Linux with SQL Server Standard</code> | <code>Red Hat Enterprise Linux with\\n                        SQL Server Web</code> | <code>Red Hat Enterprise Linux with SQL Server\\n                        Enterprise</code> | <code>SQL Server Enterprise</code> | <code>SQL Server\\n                        Standard</code> | <code>SQL Server Web</code> | <code>SUSE Linux</code> |\\n                        <code>Ubuntu Pro</code> | <code>Windows</code> | <code>Windows BYOL</code> |\\n                        <code>Windows with SQL Server Enterprise</code> | <code>Windows with SQL\\n                        Server Standard</code> | <code>Windows with SQL Server Web</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>private-dns-name</code> - The private IPv4 DNS name of the\\n                    instance.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>private-dns-name-options.enable-resource-name-dns-a-record</code> - A\\n                    Boolean that indicates whether to respond to DNS queries for instance hostnames\\n                    with DNS A records.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>private-dns-name-options.enable-resource-name-dns-aaaa-record</code> - A\\n                    Boolean that indicates whether to respond to DNS queries for instance hostnames\\n                    with DNS AAAA records.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>private-dns-name-options.hostname-type</code> - The type of hostname\\n                    (<code>ip-name</code> | <code>resource-name</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>private-ip-address</code> - The private IPv4 address of the instance.\\n                    This can only be used to filter by the primary IP address of the network\\n                    interface attached to the instance. To filter by additional IP addresses\\n                    assigned to the network interface, use the filter\\n                        <code>network-interface.addresses.private-ip-address</code>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>product-code</code> - The product code associated with the AMI used to\\n                    launch the instance.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>product-code.type</code> - The type of product code (<code>devpay</code>\\n                    | <code>marketplace</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ramdisk-id</code> - The RAM disk ID.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>reason</code> - The reason for the current state of the instance (for\\n                    example, shows \\\"User Initiated [date]\\\" when you stop or terminate the instance).\\n                    Similar to the state-reason-code filter.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>requester-id</code> - The ID of the entity that launched the instance on\\n                    your behalf (for example, Amazon Web Services Management Console, Auto Scaling, and so\\n                    on).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>reservation-id</code> - The ID of the instance's reservation. A\\n                    reservation ID is created any time you launch an instance. A reservation ID has\\n                    a one-to-one relationship with an instance launch request, but can be associated\\n                    with more than one instance if you launch multiple instances using the same\\n                    launch request. For example, if you launch one instance, you get one reservation\\n                    ID. If you launch ten instances using the same launch request, you also get one\\n                    reservation ID.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>root-device-name</code> - The device name of the root device volume (for\\n                    example, <code>/dev/sda1</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>root-device-type</code> - The type of the root device volume\\n                        (<code>ebs</code> | <code>instance-store</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>source-dest-check</code> - Indicates whether the instance performs\\n                    source/destination checking. A value of <code>true</code> means that checking is\\n                    enabled, and <code>false</code> means that checking is disabled. The value must\\n                    be <code>false</code> for the instance to perform network address translation\\n                    (NAT) in your VPC. </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>spot-instance-request-id</code> - The ID of the Spot Instance\\n                    request.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>state-reason-code</code> - The reason code for the state change.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>state-reason-message</code> - A message that describes the state\\n                    change.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>subnet-id</code> - The ID of the subnet for the instance.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag:<key></code> - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\\n    For example, to find all resources that have a tag with the key <code>Owner</code> and the value <code>TeamA</code>, specify <code>tag:Owner</code> for the filter name and <code>TeamA</code> for the filter value.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag-key</code> - The key of a tag assigned to the resource. Use this filter to find all resources that have a tag with a specific key, regardless of the tag value.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tenancy</code> - The tenancy of an instance (<code>dedicated</code> |\\n                        <code>default</code> | <code>host</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tpm-support</code> - Indicates if the instance is configured for\\n                    NitroTPM support (<code>v2.0</code>). </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>usage-operation</code> - The usage operation value for the instance\\n                        (<code>RunInstances</code> | <code>RunInstances:00g0</code> |\\n                        <code>RunInstances:0010</code> | <code>RunInstances:1010</code> |\\n                        <code>RunInstances:1014</code> | <code>RunInstances:1110</code> |\\n                        <code>RunInstances:0014</code> | <code>RunInstances:0210</code> |\\n                        <code>RunInstances:0110</code> | <code>RunInstances:0100</code> |\\n                        <code>RunInstances:0004</code> | <code>RunInstances:0200</code> |\\n                        <code>RunInstances:000g</code> | <code>RunInstances:0g00</code> |\\n                        <code>RunInstances:0002</code> | <code>RunInstances:0800</code> |\\n                        <code>RunInstances:0102</code> | <code>RunInstances:0006</code> |\\n                        <code>RunInstances:0202</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>usage-operation-update-time</code> - The time that the usage operation\\n                    was last updated, for example, <code>2022-09-15T17:15:20.000Z</code>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>virtualization-type</code> - The virtualization type of the instance\\n                        (<code>paravirtual</code> | <code>hvm</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>vpc-id</code> - The ID of the VPC that the instance is running in.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token returned from a previous paginated request. Pagination continues from the end of the items returned by the previous request.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MaxResults\",\n                        \"smithy.api#documentation\": \"<p>The maximum number of items to return for this request.\\n         To get the next page of items, make another request with the token returned in the output.\\n\\t        For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Query-Requests.html#api-pagination\\\">Pagination</a>.</p>\\n         <p>You cannot specify this parameter and the instance IDs parameter in the same request.</p>\",\n                        \"smithy.api#xmlName\": \"maxResults\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeInstancesResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to include in another request to get the next page of items. This value is <code>null</code> when there\\n         are no more items to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                },\n                \"Reservations\": {\n                    \"target\": \"com.amazonaws.ec2#ReservationList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ReservationSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the reservations.</p>\",\n                        \"smithy.api#xmlName\": \"reservationSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeInternetGateways\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeInternetGatewaysRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeInternetGatewaysResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes your internet gateways. The default is to describe all your internet gateways. \\n            Alternatively, you can specify specific internet gateway IDs or filter the results to\\n            include only the internet gateways that match specific criteria.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To describe the Internet gateway for a VPC\",\n                        \"documentation\": \"This example describes the Internet gateway for the specified VPC.\",\n                        \"input\": {\n                            \"Filters\": [\n                                {\n                                    \"Name\": \"attachment.vpc-id\",\n                                    \"Values\": [\n                                        \"vpc-a01106c2\"\n                                    ]\n                                }\n                            ]\n                        },\n                        \"output\": {\n                            \"InternetGateways\": [\n                                {\n                                    \"Tags\": [],\n                                    \"InternetGatewayId\": \"igw-c0a643a9\",\n                                    \"Attachments\": [\n                                        {\n                                            \"State\": \"attached\",\n                                            \"VpcId\": \"vpc-a01106c2\"\n                                        }\n                                    ]\n                                }\n                            ]\n                        }\n                    }\n                ],\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"InternetGateways\",\n                    \"pageSize\": \"MaxResults\"\n                },\n                \"smithy.api#suppress\": [\n                    \"WaitableTraitInvalidErrorType\"\n                ],\n                \"smithy.waiters#waitable\": {\n                    \"InternetGatewayExists\": {\n                        \"acceptors\": [\n                            {\n                                \"state\": \"success\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"length(InternetGateways[].InternetGatewayId) > `0`\",\n                                        \"expected\": \"true\",\n                                        \"comparator\": \"booleanEquals\"\n                                    }\n                                }\n                            },\n                            {\n                                \"state\": \"retry\",\n                                \"matcher\": {\n                                    \"errorType\": \"InvalidInternetGateway.NotFound\"\n                                }\n                            }\n                        ],\n                        \"minDelay\": 5\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeInternetGatewaysMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 5,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeInternetGatewaysRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token returned from a previous paginated request. Pagination continues from the end of the items returned by the previous request.</p>\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#DescribeInternetGatewaysMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of items to return for this request.\\n\\tTo get the next page of items, make another request with the token returned in the output.\\n\\tFor more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Query-Requests.html#api-pagination\\\">Pagination</a>.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"InternetGatewayIds\": {\n                    \"target\": \"com.amazonaws.ec2#InternetGatewayIdList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InternetGatewayId\",\n                        \"smithy.api#documentation\": \"<p>The IDs of the internet gateways.</p>\\n         <p>Default: Describes all your internet gateways.</p>\",\n                        \"smithy.api#xmlName\": \"internetGatewayId\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>attachment.state</code> - The current state of the attachment between the gateway\\n                    and the VPC (<code>available</code>). Present only if a VPC is attached.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>attachment.vpc-id</code> - The ID of an attached VPC.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>internet-gateway-id</code> - The ID of the Internet gateway.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>owner-id</code> - The ID of the Amazon Web Services account that owns the internet gateway.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag</code> - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\\n    For example, to find all resources that have a tag with the key <code>Owner</code> and the value <code>TeamA</code>, specify <code>tag:Owner</code> for the filter name and <code>TeamA</code> for the filter value.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag-key</code> - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeInternetGatewaysResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InternetGateways\": {\n                    \"target\": \"com.amazonaws.ec2#InternetGatewayList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InternetGatewaySet\",\n                        \"smithy.api#documentation\": \"<p>Information about the internet gateways.</p>\",\n                        \"smithy.api#xmlName\": \"internetGatewaySet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to include in another request to get the next page of items. This value is <code>null</code> when there are no more items to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeIpamByoasn\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeIpamByoasnRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeIpamByoasnResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes your Autonomous System Numbers (ASNs), their provisioning statuses, and the BYOIP CIDRs with which they are associated. For more information, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/ipam/tutorials-byoasn.html\\\">Tutorial: Bring your ASN to IPAM</a> in the <i>Amazon VPC IPAM guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DescribeIpamByoasnMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 100\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeIpamByoasnRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#DescribeIpamByoasnMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return with a single call.\\n\\tTo retrieve the remaining results, make another call with the returned <code>nextToken</code> value.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next page of results.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeIpamByoasnResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Byoasns\": {\n                    \"target\": \"com.amazonaws.ec2#ByoasnSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ByoasnSet\",\n                        \"smithy.api#documentation\": \"<p>ASN and BYOIP CIDR associations.</p>\",\n                        \"smithy.api#xmlName\": \"byoasnSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeIpamExternalResourceVerificationTokens\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeIpamExternalResourceVerificationTokensRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeIpamExternalResourceVerificationTokensResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describe verification tokens. A verification token is an Amazon Web Services-generated random value that you can use to prove ownership of an external resource. For example, you can use a verification token to validate that you control a public IP address range when you bring an IP address range to Amazon Web Services (BYOIP).\\n</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DescribeIpamExternalResourceVerificationTokensRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A check for whether you have the required permissions for the action without actually making the request \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more filters for the request. For more information about filtering, see <a href=\\\"https://docs.aws.amazon.com/cli/latest/userguide/cli-usage-filter.html\\\">Filtering CLI output</a>.</p>\\n         <p>Available filters:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>ipam-arn</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ipam-external-resource-verification-token-arn</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ipam-external-resource-verification-token-id</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ipam-id</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ipam-region</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>state</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>status</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>token-name</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>token-value</code>\\n               </p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next page of results.</p>\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#IpamMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of tokens to return in one page of results.</p>\"\n                    }\n                },\n                \"IpamExternalResourceVerificationTokenIds\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Verification token IDs.</p>\",\n                        \"smithy.api#xmlName\": \"IpamExternalResourceVerificationTokenId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeIpamExternalResourceVerificationTokensResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                },\n                \"IpamExternalResourceVerificationTokens\": {\n                    \"target\": \"com.amazonaws.ec2#IpamExternalResourceVerificationTokenSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpamExternalResourceVerificationTokenSet\",\n                        \"smithy.api#documentation\": \"<p>Verification tokens.</p>\",\n                        \"smithy.api#xmlName\": \"ipamExternalResourceVerificationTokenSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeIpamPools\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeIpamPoolsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeIpamPoolsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Get information about your IPAM pools.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"IpamPools\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeIpamPoolsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A check for whether you have the required permissions for the action without actually making the request \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more filters for the request. For more information about filtering, see <a href=\\\"https://docs.aws.amazon.com/cli/latest/userguide/cli-usage-filter.html\\\">Filtering CLI output</a>.</p>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#IpamMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return in the request.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next page of results.</p>\"\n                    }\n                },\n                \"IpamPoolIds\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the IPAM pools you would like information on.</p>\",\n                        \"smithy.api#xmlName\": \"IpamPoolId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeIpamPoolsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                },\n                \"IpamPools\": {\n                    \"target\": \"com.amazonaws.ec2#IpamPoolSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpamPoolSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the IPAM pools.</p>\",\n                        \"smithy.api#xmlName\": \"ipamPoolSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeIpamResourceDiscoveries\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeIpamResourceDiscoveriesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeIpamResourceDiscoveriesResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes IPAM resource discoveries. A resource discovery is an IPAM component that enables IPAM to manage and monitor resources that belong to the owning account.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"IpamResourceDiscoveries\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeIpamResourceDiscoveriesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A check for whether you have the required permissions for the action without actually making the request \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"IpamResourceDiscoveryIds\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IPAM resource discovery IDs.</p>\",\n                        \"smithy.api#xmlName\": \"IpamResourceDiscoveryId\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify the pagination token from a previous request to retrieve the next page of results.</p>\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#IpamMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of resource discoveries to return in one page of results.</p>\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The resource discovery filters.</p>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeIpamResourceDiscoveriesResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"IpamResourceDiscoveries\": {\n                    \"target\": \"com.amazonaws.ec2#IpamResourceDiscoverySet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpamResourceDiscoverySet\",\n                        \"smithy.api#documentation\": \"<p>The resource discoveries.</p>\",\n                        \"smithy.api#xmlName\": \"ipamResourceDiscoverySet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>Specify the pagination token from a previous request to retrieve the next page of results.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeIpamResourceDiscoveryAssociations\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeIpamResourceDiscoveryAssociationsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeIpamResourceDiscoveryAssociationsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes resource discovery association with an Amazon VPC IPAM. An associated resource discovery is a resource discovery that has been associated with an IPAM..</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"IpamResourceDiscoveryAssociations\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeIpamResourceDiscoveryAssociationsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A check for whether you have the required permissions for the action without actually making the request \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"IpamResourceDiscoveryAssociationIds\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The resource discovery association IDs.</p>\",\n                        \"smithy.api#xmlName\": \"IpamResourceDiscoveryAssociationId\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify the pagination token from a previous request to retrieve the next page of results.</p>\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#IpamMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of resource discovery associations to return in one page of results.</p>\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The resource discovery association filters.</p>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeIpamResourceDiscoveryAssociationsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"IpamResourceDiscoveryAssociations\": {\n                    \"target\": \"com.amazonaws.ec2#IpamResourceDiscoveryAssociationSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpamResourceDiscoveryAssociationSet\",\n                        \"smithy.api#documentation\": \"<p>The resource discovery associations.</p>\",\n                        \"smithy.api#xmlName\": \"ipamResourceDiscoveryAssociationSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>Specify the pagination token from a previous request to retrieve the next page of results.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeIpamScopes\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeIpamScopesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeIpamScopesResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Get information about your IPAM scopes.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"IpamScopes\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeIpamScopesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A check for whether you have the required permissions for the action without actually making the request \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more filters for the request. For more information about filtering, see <a href=\\\"https://docs.aws.amazon.com/cli/latest/userguide/cli-usage-filter.html\\\">Filtering CLI output</a>.</p>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#IpamMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return in the request.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next page of results.</p>\"\n                    }\n                },\n                \"IpamScopeIds\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the scopes you want information on.</p>\",\n                        \"smithy.api#xmlName\": \"IpamScopeId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeIpamScopesResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                },\n                \"IpamScopes\": {\n                    \"target\": \"com.amazonaws.ec2#IpamScopeSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpamScopeSet\",\n                        \"smithy.api#documentation\": \"<p>The scopes you want information on.</p>\",\n                        \"smithy.api#xmlName\": \"ipamScopeSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeIpams\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeIpamsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeIpamsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Get information about your IPAM pools.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/ipam/what-is-it-ipam.html\\\">What is IPAM?</a> in the <i>Amazon VPC IPAM User Guide</i>.\\n      </p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"Ipams\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeIpamsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A check for whether you have the required permissions for the action without actually making the request \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more filters for the request. For more information about filtering, see <a href=\\\"https://docs.aws.amazon.com/cli/latest/userguide/cli-usage-filter.html\\\">Filtering CLI output</a>.</p>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#IpamMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return in the request.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next page of results.</p>\"\n                    }\n                },\n                \"IpamIds\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the IPAMs you want information on.</p>\",\n                        \"smithy.api#xmlName\": \"IpamId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeIpamsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                },\n                \"Ipams\": {\n                    \"target\": \"com.amazonaws.ec2#IpamSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpamSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the IPAMs.</p>\",\n                        \"smithy.api#xmlName\": \"ipamSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeIpv6Pools\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeIpv6PoolsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeIpv6PoolsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes your IPv6 address pools.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"Ipv6Pools\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeIpv6PoolsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PoolIds\": {\n                    \"target\": \"com.amazonaws.ec2#Ipv6PoolIdList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the IPv6 address pools.</p>\",\n                        \"smithy.api#xmlName\": \"PoolId\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next page of results.</p>\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#Ipv6PoolMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return with a single call.\\n\\tTo retrieve the remaining results, make another call with the returned <code>nextToken</code> value.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>tag</code>:<key> - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\\n    For example, to find all resources that have a tag with the key <code>Owner</code> and the value <code>TeamA</code>, specify <code>tag:Owner</code> for the filter name and <code>TeamA</code> for the filter value.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag-key</code> - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeIpv6PoolsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Ipv6Pools\": {\n                    \"target\": \"com.amazonaws.ec2#Ipv6PoolSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Ipv6PoolSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the IPv6 address pools.</p>\",\n                        \"smithy.api#xmlName\": \"ipv6PoolSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeKeyPairs\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeKeyPairsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeKeyPairsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the specified key pairs or all of your key pairs.</p>\\n         <p>For more information about key pairs, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html\\\">Amazon EC2 key pairs</a> \\n\\t\\t\\t\\tin the <i>Amazon EC2 User Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To display a key pair\",\n                        \"documentation\": \"This example displays the fingerprint for the specified key.\",\n                        \"input\": {\n                            \"KeyNames\": [\n                                \"my-key-pair\"\n                            ]\n                        },\n                        \"output\": {\n                            \"KeyPairs\": [\n                                {\n                                    \"KeyName\": \"my-key-pair\",\n                                    \"KeyFingerprint\": \"1f:51:ae:28:bf:89:e9:d8:1f:25:5d:37:2d:7d:b8:ca:9f:f5:f1:6f\"\n                                }\n                            ]\n                        }\n                    }\n                ],\n                \"smithy.api#suppress\": [\n                    \"WaitableTraitInvalidErrorType\"\n                ],\n                \"smithy.waiters#waitable\": {\n                    \"KeyPairExists\": {\n                        \"acceptors\": [\n                            {\n                                \"state\": \"success\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"length(KeyPairs[].KeyName) > `0`\",\n                                        \"expected\": \"true\",\n                                        \"comparator\": \"booleanEquals\"\n                                    }\n                                }\n                            },\n                            {\n                                \"state\": \"retry\",\n                                \"matcher\": {\n                                    \"errorType\": \"InvalidKeyPair.NotFound\"\n                                }\n                            }\n                        ],\n                        \"minDelay\": 5\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeKeyPairsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"KeyNames\": {\n                    \"target\": \"com.amazonaws.ec2#KeyNameStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The key pair names.</p>\\n         <p>Default: Describes all of your key pairs.</p>\",\n                        \"smithy.api#xmlName\": \"KeyName\"\n                    }\n                },\n                \"KeyPairIds\": {\n                    \"target\": \"com.amazonaws.ec2#KeyPairIdStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the key pairs.</p>\",\n                        \"smithy.api#xmlName\": \"KeyPairId\"\n                    }\n                },\n                \"IncludePublicKey\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If <code>true</code>, the public key material is included in the response.</p>\\n         <p>Default: <code>false</code>\\n         </p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>key-pair-id</code> - The ID of the key pair.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>fingerprint</code> - The fingerprint of the key pair.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>key-name</code> - The name of the key pair.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag-key</code> - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag</code>:<key> - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\\n    For example, to find all resources that have a tag with the key <code>Owner</code> and the value <code>TeamA</code>, specify <code>tag:Owner</code> for the filter name and <code>TeamA</code> for the filter value.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeKeyPairsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"KeyPairs\": {\n                    \"target\": \"com.amazonaws.ec2#KeyPairList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"KeySet\",\n                        \"smithy.api#documentation\": \"<p>Information about the key pairs.</p>\",\n                        \"smithy.api#xmlName\": \"keySet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeLaunchTemplateVersions\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeLaunchTemplateVersionsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeLaunchTemplateVersionsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes one or more versions of a specified launch template. You can describe all\\n            versions, individual versions, or a range of versions. You can also describe all the\\n            latest versions or all the default versions of all the launch templates in your\\n            account.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To describe the versions for a launch template\",\n                        \"documentation\": \"This example describes the versions for the specified launch template.\",\n                        \"input\": {\n                            \"LaunchTemplateId\": \"068f72b72934aff71\"\n                        },\n                        \"output\": {\n                            \"LaunchTemplateVersions\": [\n                                {\n                                    \"LaunchTemplateId\": \"lt-068f72b72934aff71\",\n                                    \"LaunchTemplateName\": \"Webservers\",\n                                    \"VersionNumber\": 2,\n                                    \"CreatedBy\": \"arn:aws:iam::123456789102:root\",\n                                    \"LaunchTemplateData\": {\n                                        \"KeyName\": \"kp-us-east\",\n                                        \"ImageId\": \"ami-6057e21a\",\n                                        \"InstanceType\": \"t2.medium\",\n                                        \"NetworkInterfaces\": [\n                                            {\n                                                \"SubnetId\": \"subnet-1a2b3c4d\",\n                                                \"DeviceIndex\": 0,\n                                                \"Groups\": [\n                                                    \"sg-7c227019\"\n                                                ]\n                                            }\n                                        ]\n                                    },\n                                    \"DefaultVersion\": false,\n                                    \"CreateTime\": \"2017-11-20T13:12:32.000Z\"\n                                },\n                                {\n                                    \"LaunchTemplateId\": \"lt-068f72b72934aff71\",\n                                    \"LaunchTemplateName\": \"Webservers\",\n                                    \"VersionNumber\": 1,\n                                    \"CreatedBy\": \"arn:aws:iam::123456789102:root\",\n                                    \"LaunchTemplateData\": {\n                                        \"UserData\": \"\",\n                                        \"KeyName\": \"kp-us-east\",\n                                        \"ImageId\": \"ami-aabbcc11\",\n                                        \"InstanceType\": \"t2.medium\",\n                                        \"NetworkInterfaces\": [\n                                            {\n                                                \"SubnetId\": \"subnet-7b16de0c\",\n                                                \"DeviceIndex\": 0,\n                                                \"DeleteOnTermination\": false,\n                                                \"Groups\": [\n                                                    \"sg-7c227019\"\n                                                ],\n                                                \"AssociatePublicIpAddress\": true\n                                            }\n                                        ]\n                                    },\n                                    \"DefaultVersion\": true,\n                                    \"CreateTime\": \"2017-11-20T12:52:33.000Z\"\n                                }\n                            ]\n                        }\n                    }\n                ],\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"LaunchTemplateVersions\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeLaunchTemplateVersionsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually\\n            making the request, and provides an error response. If you have the required\\n            permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is\\n                <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"LaunchTemplateId\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplateId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the launch template.</p>\\n         <p>To describe one or more versions of a specified launch template, you must specify\\n            either the launch template ID or the launch template name, but not both.</p>\\n         <p>To describe all the latest or default launch template versions in your account, you\\n            must omit this parameter.</p>\"\n                    }\n                },\n                \"LaunchTemplateName\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplateName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the launch template.</p>\\n         <p>To describe one or more versions of a specified launch template, you must specify\\n            either the launch template name or the launch template ID, but not both.</p>\\n         <p>To describe all the latest or default launch template versions in your account, you\\n            must omit this parameter.</p>\"\n                    }\n                },\n                \"Versions\": {\n                    \"target\": \"com.amazonaws.ec2#VersionStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more versions of the launch template. Valid values depend on whether you are\\n            describing a specified launch template (by ID or name) or all launch templates in your\\n            account.</p>\\n         <p>To describe one or more versions of a specified launch template, valid values are\\n                <code>$Latest</code>, <code>$Default</code>, and numbers.</p>\\n         <p>To describe all launch templates in your account that are defined as the latest\\n            version, the valid value is <code>$Latest</code>. To describe all launch templates in\\n            your account that are defined as the default version, the valid value is\\n                <code>$Default</code>. You can specify <code>$Latest</code> and\\n                <code>$Default</code> in the same request. You cannot specify numbers.</p>\",\n                        \"smithy.api#xmlName\": \"LaunchTemplateVersion\"\n                    }\n                },\n                \"MinVersion\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The version number after which to describe launch template versions.</p>\"\n                    }\n                },\n                \"MaxVersion\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The version number up to which to describe launch template versions.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token to request the next page of results.</p>\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return in a single call. To retrieve the remaining\\n            results, make another call with the returned <code>NextToken</code> value. This value\\n            can be between 1 and 200.</p>\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>create-time</code> - The time the launch template version was\\n                    created.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ebs-optimized</code> - A boolean that indicates whether the instance is\\n                    optimized for Amazon EBS I/O.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>http-endpoint</code> - Indicates whether the HTTP metadata endpoint on\\n                    your instances is enabled (<code>enabled</code> | <code>disabled</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>http-protocol-ipv4</code> - Indicates whether the IPv4 endpoint for the\\n                    instance metadata service is enabled (<code>enabled</code> |\\n                        <code>disabled</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>host-resource-group-arn</code> - The ARN of the host resource group in\\n                    which to launch the instances.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>http-tokens</code> - The state of token usage for your instance metadata\\n                    requests (<code>optional</code> | <code>required</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>iam-instance-profile</code> - The ARN of the IAM instance\\n                    profile.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>image-id</code> - The ID of the AMI.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>instance-type</code> - The instance type.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>is-default-version</code> - A boolean that indicates whether the launch\\n                    template version is the default version.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>kernel-id</code> - The kernel ID.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>license-configuration-arn</code> - The ARN of the license\\n                    configuration.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-card-index</code> - The index of the network card.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ram-disk-id</code> - The RAM disk ID.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"ResolveAlias\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If <code>true</code>, and if a Systems Manager parameter is specified for\\n                <code>ImageId</code>, the AMI ID is displayed in the response for\\n                <code>imageId</code>.</p>\\n         <p>If <code>false</code>, and if a Systems Manager parameter is specified for\\n                <code>ImageId</code>, the parameter is displayed in the response for\\n                <code>imageId</code>.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/create-launch-template.html#use-an-ssm-parameter-instead-of-an-ami-id\\\">Use a Systems Manager parameter instead of an AMI ID</a> in the\\n                <i>Amazon EC2 User Guide</i>.</p>\\n         <p>Default: <code>false</code>\\n         </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeLaunchTemplateVersionsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LaunchTemplateVersions\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplateVersionSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LaunchTemplateVersionSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the launch template versions.</p>\",\n                        \"smithy.api#xmlName\": \"launchTemplateVersionSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code>\\n            when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeLaunchTemplates\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeLaunchTemplatesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeLaunchTemplatesResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes one or more launch templates.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To describe a launch template\",\n                        \"documentation\": \"This example describes the specified launch template.\",\n                        \"input\": {\n                            \"LaunchTemplateIds\": [\n                                \"lt-01238c059e3466abc\"\n                            ]\n                        },\n                        \"output\": {\n                            \"LaunchTemplates\": [\n                                {\n                                    \"LatestVersionNumber\": 1,\n                                    \"LaunchTemplateName\": \"my-template\",\n                                    \"LaunchTemplateId\": \"lt-01238c059e3466abc\",\n                                    \"CreatedBy\": \"arn:aws:iam::123456789012:root\",\n                                    \"CreateTime\": \"2018-01-16T04:32:57.000Z\",\n                                    \"DefaultVersionNumber\": 1\n                                }\n                            ]\n                        }\n                    }\n                ],\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"LaunchTemplates\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeLaunchTemplatesMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 200\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeLaunchTemplatesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually\\n            making the request, and provides an error response. If you have the required\\n            permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is\\n                <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"LaunchTemplateIds\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplateIdStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more launch template IDs.</p>\",\n                        \"smithy.api#xmlName\": \"LaunchTemplateId\"\n                    }\n                },\n                \"LaunchTemplateNames\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplateNameStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more launch template names.</p>\",\n                        \"smithy.api#xmlName\": \"LaunchTemplateName\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>create-time</code> - The time the launch template was created.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>launch-template-name</code> - The name of the launch template.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag</code>:<key> - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\\n    For example, to find all resources that have a tag with the key <code>Owner</code> and the value <code>TeamA</code>, specify <code>tag:Owner</code> for the filter name and <code>TeamA</code> for the filter value.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag-key</code> - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token to request the next page of results.</p>\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#DescribeLaunchTemplatesMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return in a single call. To retrieve the remaining\\n            results, make another call with the returned <code>NextToken</code> value. This value\\n            can be between 1 and 200.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeLaunchTemplatesResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LaunchTemplates\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplateSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LaunchTemplates\",\n                        \"smithy.api#documentation\": \"<p>Information about the launch templates.</p>\",\n                        \"smithy.api#xmlName\": \"launchTemplates\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code>\\n            when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeLocalGatewayRouteTableVirtualInterfaceGroupAssociations\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeLocalGatewayRouteTableVirtualInterfaceGroupAssociationsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeLocalGatewayRouteTableVirtualInterfaceGroupAssociationsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the associations between virtual interface groups and local gateway route tables.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"LocalGatewayRouteTableVirtualInterfaceGroupAssociations\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeLocalGatewayRouteTableVirtualInterfaceGroupAssociationsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LocalGatewayRouteTableVirtualInterfaceGroupAssociationIds\": {\n                    \"target\": \"com.amazonaws.ec2#LocalGatewayRouteTableVirtualInterfaceGroupAssociationIdSet\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the associations.</p>\",\n                        \"smithy.api#xmlName\": \"LocalGatewayRouteTableVirtualInterfaceGroupAssociationId\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>local-gateway-id</code> - The ID of a local gateway.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>local-gateway-route-table-arn</code> - The Amazon Resource Name (ARN) of the local \\n               gateway route table for the virtual interface group.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>local-gateway-route-table-id</code> - The ID of the local gateway route table.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>local-gateway-route-table-virtual-interface-group-association-id</code> - The ID of the association.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>local-gateway-route-table-virtual-interface-group-id</code> - The ID of the virtual interface group.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>owner-id</code> - The ID of the Amazon Web Services account that owns the local gateway virtual \\n               interface group association.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>state</code> - The state of the association.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#LocalGatewayMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return with a single call.\\n\\tTo retrieve the remaining results, make another call with the returned <code>nextToken</code> value.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next page of results.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeLocalGatewayRouteTableVirtualInterfaceGroupAssociationsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LocalGatewayRouteTableVirtualInterfaceGroupAssociations\": {\n                    \"target\": \"com.amazonaws.ec2#LocalGatewayRouteTableVirtualInterfaceGroupAssociationSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LocalGatewayRouteTableVirtualInterfaceGroupAssociationSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the associations.</p>\",\n                        \"smithy.api#xmlName\": \"localGatewayRouteTableVirtualInterfaceGroupAssociationSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeLocalGatewayRouteTableVpcAssociations\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeLocalGatewayRouteTableVpcAssociationsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeLocalGatewayRouteTableVpcAssociationsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the specified associations between VPCs and local gateway route tables.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"LocalGatewayRouteTableVpcAssociations\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeLocalGatewayRouteTableVpcAssociationsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LocalGatewayRouteTableVpcAssociationIds\": {\n                    \"target\": \"com.amazonaws.ec2#LocalGatewayRouteTableVpcAssociationIdSet\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the associations.</p>\",\n                        \"smithy.api#xmlName\": \"LocalGatewayRouteTableVpcAssociationId\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>local-gateway-id</code> - The ID of a local gateway.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>local-gateway-route-table-arn</code> - The Amazon Resource Name (ARN) of the local \\n               gateway route table for the association.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>local-gateway-route-table-id</code> - The ID of the local gateway route table.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>local-gateway-route-table-vpc-association-id</code> - The ID of the association.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>owner-id</code> - The ID of the Amazon Web Services account that owns the local gateway route table\\n               for the association.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>state</code> - The state of the association.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>vpc-id</code> - The ID of the VPC.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#LocalGatewayMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return with a single call.\\n\\tTo retrieve the remaining results, make another call with the returned <code>nextToken</code> value.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next page of results.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeLocalGatewayRouteTableVpcAssociationsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LocalGatewayRouteTableVpcAssociations\": {\n                    \"target\": \"com.amazonaws.ec2#LocalGatewayRouteTableVpcAssociationSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LocalGatewayRouteTableVpcAssociationSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the associations.</p>\",\n                        \"smithy.api#xmlName\": \"localGatewayRouteTableVpcAssociationSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeLocalGatewayRouteTables\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeLocalGatewayRouteTablesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeLocalGatewayRouteTablesResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes one or more local gateway route tables. By default, all local gateway route tables are described.\\n         Alternatively, you can filter the results.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"LocalGatewayRouteTables\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeLocalGatewayRouteTablesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LocalGatewayRouteTableIds\": {\n                    \"target\": \"com.amazonaws.ec2#LocalGatewayRouteTableIdSet\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the local gateway route tables.</p>\",\n                        \"smithy.api#xmlName\": \"LocalGatewayRouteTableId\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>local-gateway-id</code> - The ID of a local gateway.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>local-gateway-route-table-arn</code> - The Amazon Resource Name (ARN) of the \\n               local gateway route table.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>local-gateway-route-table-id</code> - The ID of a local gateway route table.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>outpost-arn</code> - The Amazon Resource Name (ARN) of the Outpost.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>owner-id</code> - The ID of the Amazon Web Services account that owns the local gateway route table.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>state</code> - The state of the local gateway route table.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#LocalGatewayMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return with a single call.\\n\\tTo retrieve the remaining results, make another call with the returned <code>nextToken</code> value.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next page of results.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeLocalGatewayRouteTablesResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LocalGatewayRouteTables\": {\n                    \"target\": \"com.amazonaws.ec2#LocalGatewayRouteTableSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LocalGatewayRouteTableSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the local gateway route tables.</p>\",\n                        \"smithy.api#xmlName\": \"localGatewayRouteTableSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeLocalGatewayVirtualInterfaceGroups\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeLocalGatewayVirtualInterfaceGroupsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeLocalGatewayVirtualInterfaceGroupsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the specified local gateway virtual interface groups.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"LocalGatewayVirtualInterfaceGroups\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeLocalGatewayVirtualInterfaceGroupsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LocalGatewayVirtualInterfaceGroupIds\": {\n                    \"target\": \"com.amazonaws.ec2#LocalGatewayVirtualInterfaceGroupIdSet\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the virtual interface groups.</p>\",\n                        \"smithy.api#xmlName\": \"LocalGatewayVirtualInterfaceGroupId\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>local-gateway-id</code> - The ID of a local gateway.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>local-gateway-virtual-interface-group-id</code> - The ID of the virtual interface group.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>local-gateway-virtual-interface-id</code> - The ID of the virtual interface.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>owner-id</code> - The ID of the Amazon Web Services account that owns the local gateway virtual interface group.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#LocalGatewayMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return with a single call.\\n\\tTo retrieve the remaining results, make another call with the returned <code>nextToken</code> value.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next page of results.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeLocalGatewayVirtualInterfaceGroupsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LocalGatewayVirtualInterfaceGroups\": {\n                    \"target\": \"com.amazonaws.ec2#LocalGatewayVirtualInterfaceGroupSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LocalGatewayVirtualInterfaceGroupSet\",\n                        \"smithy.api#documentation\": \"<p>The virtual interface groups.</p>\",\n                        \"smithy.api#xmlName\": \"localGatewayVirtualInterfaceGroupSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeLocalGatewayVirtualInterfaces\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeLocalGatewayVirtualInterfacesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeLocalGatewayVirtualInterfacesResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the specified local gateway virtual interfaces.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"LocalGatewayVirtualInterfaces\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeLocalGatewayVirtualInterfacesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LocalGatewayVirtualInterfaceIds\": {\n                    \"target\": \"com.amazonaws.ec2#LocalGatewayVirtualInterfaceIdSet\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the virtual interfaces.</p>\",\n                        \"smithy.api#xmlName\": \"LocalGatewayVirtualInterfaceId\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>local-address</code> - The local address.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>local-bgp-asn</code> - The Border Gateway Protocol (BGP) Autonomous System Number (ASN) \\n               of the local gateway.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>local-gateway-id</code> - The ID of the local gateway.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>local-gateway-virtual-interface-id</code> - The ID of the virtual interface.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>owner-id</code> - The ID of the Amazon Web Services account that owns the local gateway virtual interface.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>peer-address</code> - The peer address.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>peer-bgp-asn</code> - The peer BGP ASN.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>vlan</code> - The ID of the VLAN.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#LocalGatewayMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return with a single call.\\n\\tTo retrieve the remaining results, make another call with the returned <code>nextToken</code> value.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next page of results.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeLocalGatewayVirtualInterfacesResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LocalGatewayVirtualInterfaces\": {\n                    \"target\": \"com.amazonaws.ec2#LocalGatewayVirtualInterfaceSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LocalGatewayVirtualInterfaceSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the virtual interfaces.</p>\",\n                        \"smithy.api#xmlName\": \"localGatewayVirtualInterfaceSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeLocalGateways\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeLocalGatewaysRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeLocalGatewaysResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes one or more local gateways. By default, all local gateways are described. \\n        Alternatively, you can filter the results.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"LocalGateways\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeLocalGatewaysRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LocalGatewayIds\": {\n                    \"target\": \"com.amazonaws.ec2#LocalGatewayIdSet\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the local gateways.</p>\",\n                        \"smithy.api#xmlName\": \"LocalGatewayId\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>local-gateway-id</code> - The ID of a local gateway.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>outpost-arn</code> - The Amazon Resource Name (ARN) of the Outpost.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>owner-id</code> - The ID of the Amazon Web Services account that owns the local gateway.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>state</code> - The state of the association.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#LocalGatewayMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return with a single call.\\n\\tTo retrieve the remaining results, make another call with the returned <code>nextToken</code> value.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next page of results.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeLocalGatewaysResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LocalGateways\": {\n                    \"target\": \"com.amazonaws.ec2#LocalGatewaySet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LocalGatewaySet\",\n                        \"smithy.api#documentation\": \"<p>Information about the local gateways.</p>\",\n                        \"smithy.api#xmlName\": \"localGatewaySet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeLockedSnapshots\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeLockedSnapshotsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeLockedSnapshotsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the lock status for a snapshot.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DescribeLockedSnapshotsMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 5,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeLockedSnapshotsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>lock-state</code> - The state of the snapshot lock (<code>compliance-cooloff</code> | \\n          <code>governance</code> | <code>compliance</code> | <code>expired</code>).</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#DescribeLockedSnapshotsMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of items to return for this request.\\n\\tTo get the next page of items, make another request with the token returned in the output. \\n\\tFor more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Query-Requests.html#api-pagination\\\">Pagination</a>.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token returned from a previous paginated request.\\n  Pagination continues from the end of the items returned by the previous request.</p>\"\n                    }\n                },\n                \"SnapshotIds\": {\n                    \"target\": \"com.amazonaws.ec2#SnapshotIdStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the snapshots for which to view the lock status.</p>\",\n                        \"smithy.api#xmlName\": \"SnapshotId\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeLockedSnapshotsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Snapshots\": {\n                    \"target\": \"com.amazonaws.ec2#LockedSnapshotsInfoList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SnapshotSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the snapshots.</p>\",\n                        \"smithy.api#xmlName\": \"snapshotSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to include in another request to get the next page of items. \\n  This value is <code>null</code> when there are no more items to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeMacHosts\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeMacHostsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeMacHostsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the specified EC2 Mac Dedicated Host or all of your EC2 Mac Dedicated Hosts.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"MacHosts\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeMacHostsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>availability-zone</code> - The Availability Zone of the EC2 Mac Dedicated Host.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>instance-type</code> - The instance type size that the EC2 Mac Dedicated Host is\\n                        configured to support.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"HostIds\": {\n                    \"target\": \"com.amazonaws.ec2#RequestHostIdList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>\\n            The IDs of the EC2 Mac Dedicated Hosts.\\n        </p>\",\n                        \"smithy.api#xmlName\": \"HostId\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#DescribeMacHostsRequestMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return for the request in a single page. The remaining results can be seen by sending another request with the returned <code>nextToken</code> value. This value can be between 5 and 500. If <code>maxResults</code> is given a larger value than 500, you receive an error.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeMacHostsRequestMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 5,\n                    \"max\": 500\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeMacHostsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"MacHosts\": {\n                    \"target\": \"com.amazonaws.ec2#MacHostList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MacHostSet\",\n                        \"smithy.api#documentation\": \"<p>\\n            Information about the EC2 Mac Dedicated Hosts.\\n        </p>\",\n                        \"smithy.api#xmlName\": \"macHostSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeMacModificationTasks\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeMacModificationTasksRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeMacModificationTasksResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a System Integrity Protection (SIP) modification task or volume ownership delegation \\n         task for an Amazon EC2 Mac instance. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/mac-sip-settings.html#mac-sip-configure\\\">Configure \\n            SIP for Amazon EC2 instances</a> in the <i>Amazon EC2 User Guide</i>.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"MacModificationTasks\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeMacModificationTasksMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 500\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeMacModificationTasksRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies one or more filters for the request:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>instance-id</code> - The ID of the instance for which the task was created.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>task-state</code> - The state of the task (<code>successful</code> | <code>failed</code> | \\n               <code>in-progress</code> | <code>pending</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>mac-system-integrity-protection-configuration.sip-status</code> - The overall SIP \\n               state requested in the task (<code>enabled</code> | <code>disabled</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>start-time</code> - The date and time the task was created.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>task-type</code> - The type of task (<code>sip-modification</code> | <code>volume-ownership-delegation</code>).</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"MacModificationTaskIds\": {\n                    \"target\": \"com.amazonaws.ec2#MacModificationTaskIdList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of task.</p>\",\n                        \"smithy.api#xmlName\": \"MacModificationTaskId\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#DescribeMacModificationTasksMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return for the request in a single page. The remaining results can be seen by sending another request with the returned <code>nextToken</code> value. This value can be between 5 and 500. If <code>maxResults</code> is given a larger value than 500, you receive an error.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeMacModificationTasksResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"MacModificationTasks\": {\n                    \"target\": \"com.amazonaws.ec2#MacModificationTaskList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MacModificationTaskSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the tasks.</p>\",\n                        \"smithy.api#xmlName\": \"macModificationTaskSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeManagedPrefixLists\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeManagedPrefixListsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeManagedPrefixListsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes your managed prefix lists and any Amazon Web Services-managed prefix lists.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"PrefixLists\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeManagedPrefixListsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>owner-id</code> - The ID of the prefix list owner.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>prefix-list-id</code> - The ID of the prefix list.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>prefix-list-name</code> - The name of the prefix list.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#PrefixListMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return with a single call.\\n\\tTo retrieve the remaining results, make another call with the returned <code>nextToken</code> value.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next page of results.</p>\"\n                    }\n                },\n                \"PrefixListIds\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more prefix list IDs.</p>\",\n                        \"smithy.api#xmlName\": \"PrefixListId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeManagedPrefixListsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                },\n                \"PrefixLists\": {\n                    \"target\": \"com.amazonaws.ec2#ManagedPrefixListSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PrefixListSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the prefix lists.</p>\",\n                        \"smithy.api#xmlName\": \"prefixListSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeMovingAddresses\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeMovingAddressesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeMovingAddressesResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>This action is deprecated.</p>\\n         </note>\\n         <p>Describes your Elastic IP addresses that are being moved from or being restored to the EC2-Classic platform. \\n      This request does not return information about any other Elastic IP addresses in your account.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To describe your moving addresses\",\n                        \"documentation\": \"This example describes all of your moving Elastic IP addresses.\",\n                        \"output\": {\n                            \"MovingAddressStatuses\": [\n                                {\n                                    \"PublicIp\": \"198.51.100.0\",\n                                    \"MoveStatus\": \"movingToVpc\"\n                                }\n                            ]\n                        }\n                    }\n                ],\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"MovingAddressStatuses\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeMovingAddressesMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 5,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeMovingAddressesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"PublicIps\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PublicIp\",\n                        \"smithy.api#documentation\": \"<p>One or more Elastic IP addresses.</p>\",\n                        \"smithy.api#xmlName\": \"publicIp\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token for the next page of results.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Filter\",\n                        \"smithy.api#documentation\": \"<p>One or more filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>moving-status</code> - The status of the Elastic IP address\\n          (<code>MovingToVpc</code> | <code>RestoringToClassic</code>).</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"filter\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#DescribeMovingAddressesMaxResults\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MaxResults\",\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return for the request in a single page. The remaining\\n      results of the initial request can be seen by sending another request with the returned\\n      <code>NextToken</code> value. This value can be between 5 and 1000; if\\n      <code>MaxResults</code> is given a value outside of this range, an error is returned.</p>\\n         <p>Default: If no value is provided, the default is 1000.</p>\",\n                        \"smithy.api#xmlName\": \"maxResults\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeMovingAddressesResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"MovingAddressStatuses\": {\n                    \"target\": \"com.amazonaws.ec2#MovingAddressStatusSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MovingAddressStatusSet\",\n                        \"smithy.api#documentation\": \"<p>The status for each Elastic IP address.</p>\",\n                        \"smithy.api#xmlName\": \"movingAddressStatusSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeNatGateways\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeNatGatewaysRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeNatGatewaysResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes your NAT gateways. The default is to describe all your NAT gateways. \\n          Alternatively, you can specify specific NAT gateway IDs or filter the results to\\n          include only the NAT gateways that match specific criteria.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To describe a NAT gateway\",\n                        \"documentation\": \"This example describes the NAT gateway for the specified VPC.\",\n                        \"input\": {\n                            \"Filter\": [\n                                {\n                                    \"Name\": \"vpc-id\",\n                                    \"Values\": [\n                                        \"vpc-1a2b3c4d\"\n                                    ]\n                                }\n                            ]\n                        },\n                        \"output\": {\n                            \"NatGateways\": [\n                                {\n                                    \"NatGatewayAddresses\": [\n                                        {\n                                            \"PublicIp\": \"198.11.222.333\",\n                                            \"NetworkInterfaceId\": \"eni-9dec76cd\",\n                                            \"AllocationId\": \"eipalloc-89c620ec\",\n                                            \"PrivateIp\": \"10.0.0.149\"\n                                        }\n                                    ],\n                                    \"VpcId\": \"vpc-1a2b3c4d\",\n                                    \"State\": \"available\",\n                                    \"NatGatewayId\": \"nat-05dba92075d71c408\",\n                                    \"SubnetId\": \"subnet-847e4dc2\",\n                                    \"CreateTime\": \"2015-12-01T12:26:55.983Z\"\n                                }\n                            ]\n                        }\n                    }\n                ],\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"NatGateways\",\n                    \"pageSize\": \"MaxResults\"\n                },\n                \"smithy.api#suppress\": [\n                    \"WaitableTraitInvalidErrorType\"\n                ],\n                \"smithy.waiters#waitable\": {\n                    \"NatGatewayAvailable\": {\n                        \"acceptors\": [\n                            {\n                                \"state\": \"success\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"NatGateways[].State\",\n                                        \"expected\": \"available\",\n                                        \"comparator\": \"allStringEquals\"\n                                    }\n                                }\n                            },\n                            {\n                                \"state\": \"failure\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"NatGateways[].State\",\n                                        \"expected\": \"failed\",\n                                        \"comparator\": \"anyStringEquals\"\n                                    }\n                                }\n                            },\n                            {\n                                \"state\": \"failure\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"NatGateways[].State\",\n                                        \"expected\": \"deleting\",\n                                        \"comparator\": \"anyStringEquals\"\n                                    }\n                                }\n                            },\n                            {\n                                \"state\": \"failure\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"NatGateways[].State\",\n                                        \"expected\": \"deleted\",\n                                        \"comparator\": \"anyStringEquals\"\n                                    }\n                                }\n                            },\n                            {\n                                \"state\": \"retry\",\n                                \"matcher\": {\n                                    \"errorType\": \"NatGatewayNotFound\"\n                                }\n                            }\n                        ],\n                        \"minDelay\": 15\n                    },\n                    \"NatGatewayDeleted\": {\n                        \"acceptors\": [\n                            {\n                                \"state\": \"success\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"NatGateways[].State\",\n                                        \"expected\": \"deleted\",\n                                        \"comparator\": \"allStringEquals\"\n                                    }\n                                }\n                            },\n                            {\n                                \"state\": \"success\",\n                                \"matcher\": {\n                                    \"errorType\": \"NatGatewayNotFound\"\n                                }\n                            }\n                        ],\n                        \"minDelay\": 15\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeNatGatewaysMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 5,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeNatGatewaysRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"Filter\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>nat-gateway-id</code> - The ID of the NAT gateway.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>state</code> - The state of the NAT gateway (<code>pending</code> |\\n              <code>failed</code> | <code>available</code> | <code>deleting</code> | <code>deleted</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>subnet-id</code> - The ID of the subnet in which the NAT gateway resides.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag</code> - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\\n    For example, to find all resources that have a tag with the key <code>Owner</code> and the value <code>TeamA</code>, specify <code>tag:Owner</code> for the filter name and <code>TeamA</code> for the filter value.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag-key</code> - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>vpc-id</code> - The ID of the VPC in which the NAT gateway resides.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#DescribeNatGatewaysMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of items to return for this request.\\n\\tTo get the next page of items, make another request with the token returned in the output.\\n\\tFor more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Query-Requests.html#api-pagination\\\">Pagination</a>.</p>\"\n                    }\n                },\n                \"NatGatewayIds\": {\n                    \"target\": \"com.amazonaws.ec2#NatGatewayIdStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the NAT gateways.</p>\",\n                        \"smithy.api#xmlName\": \"NatGatewayId\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token returned from a previous paginated request. Pagination continues from the end of the items returned by the previous request.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeNatGatewaysResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NatGateways\": {\n                    \"target\": \"com.amazonaws.ec2#NatGatewayList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NatGatewaySet\",\n                        \"smithy.api#documentation\": \"<p>Information about the NAT gateways.</p>\",\n                        \"smithy.api#xmlName\": \"natGatewaySet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to include in another request to get the next page of items. This value is <code>null</code> when there are no more items to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeNetworkAcls\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeNetworkAclsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeNetworkAclsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes your network ACLs. The default is to describe all your network ACLs. \\n           Alternatively, you can specify specific network ACL IDs or filter the results to\\n           include only the network ACLs that match specific criteria.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/userguide/vpc-network-acls.html\\\">Network ACLs</a> in the\\n\\t\\t\\t\\t<i>Amazon VPC User Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To describe a network ACL\",\n                        \"documentation\": \"This example describes the specified network ACL.\",\n                        \"input\": {\n                            \"NetworkAclIds\": [\n                                \"acl-5fb85d36\"\n                            ]\n                        },\n                        \"output\": {\n                            \"NetworkAcls\": [\n                                {\n                                    \"Associations\": [\n                                        {\n                                            \"SubnetId\": \"subnet-65ea5f08\",\n                                            \"NetworkAclId\": \"acl-9aeb5ef7\",\n                                            \"NetworkAclAssociationId\": \"aclassoc-66ea5f0b\"\n                                        }\n                                    ],\n                                    \"NetworkAclId\": \"acl-5fb85d36\",\n                                    \"VpcId\": \"vpc-a01106c2\",\n                                    \"Tags\": [],\n                                    \"Entries\": [\n                                        {\n                                            \"CidrBlock\": \"0.0.0.0/0\",\n                                            \"RuleNumber\": 32767,\n                                            \"Protocol\": \"-1\",\n                                            \"Egress\": true,\n                                            \"RuleAction\": \"deny\"\n                                        },\n                                        {\n                                            \"CidrBlock\": \"0.0.0.0/0\",\n                                            \"RuleNumber\": 32767,\n                                            \"Protocol\": \"-1\",\n                                            \"Egress\": false,\n                                            \"RuleAction\": \"deny\"\n                                        }\n                                    ],\n                                    \"IsDefault\": false\n                                }\n                            ]\n                        }\n                    }\n                ],\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"NetworkAcls\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeNetworkAclsMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 5,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeNetworkAclsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token returned from a previous paginated request. Pagination continues from the end of the items returned by the previous request.</p>\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#DescribeNetworkAclsMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of items to return for this request.\\n\\tTo get the next page of items, make another request with the token returned in the output.\\n\\tFor more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Query-Requests.html#api-pagination\\\">Pagination</a>.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"NetworkAclIds\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkAclIdStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the network ACLs.</p>\",\n                        \"smithy.api#xmlName\": \"NetworkAclId\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>association.association-id</code> - The ID of an association ID for the ACL.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>association.network-acl-id</code> - The ID of the network ACL involved in the association.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>association.subnet-id</code> - The ID of the subnet involved in the association.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>default</code> - Indicates whether the ACL is the default network ACL for the VPC.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>entry.cidr</code> - The IPv4 CIDR range specified in the entry.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>entry.icmp.code</code> - The ICMP code specified in the entry, if any.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>entry.icmp.type</code> - The ICMP type specified in the entry, if any.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>entry.ipv6-cidr</code> - The IPv6 CIDR range specified in the entry.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>entry.port-range.from</code> - The start of the port range specified in the entry. </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>entry.port-range.to</code> - The end of the port range specified in the entry. </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>entry.protocol</code> - The protocol specified in the entry (<code>tcp</code> | <code>udp</code> | <code>icmp</code> or a protocol number).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>entry.rule-action</code> - Allows or denies the matching traffic (<code>allow</code> | <code>deny</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>entry.egress</code> - A Boolean that indicates the type of rule. Specify <code>true</code> \\n\\t\\t                for egress rules, or <code>false</code> for ingress rules.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>entry.rule-number</code> - The number of an entry (in other words, rule) in\\n                    the set of ACL entries.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-acl-id</code> - The ID of the network ACL.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>owner-id</code> - The ID of the Amazon Web Services account that owns the network ACL.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag</code> - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\\n    For example, to find all resources that have a tag with the key <code>Owner</code> and the value <code>TeamA</code>, specify <code>tag:Owner</code> for the filter name and <code>TeamA</code> for the filter value.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag-key</code> - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>vpc-id</code> - The ID of the VPC for the network ACL.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeNetworkAclsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NetworkAcls\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkAclList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkAclSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the network ACLs.</p>\",\n                        \"smithy.api#xmlName\": \"networkAclSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to include in another request to get the next page of items. This value is <code>null</code> when there are no more items to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeNetworkInsightsAccessScopeAnalyses\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeNetworkInsightsAccessScopeAnalysesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeNetworkInsightsAccessScopeAnalysesResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the specified Network Access Scope analyses.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"NetworkInsightsAccessScopeAnalyses\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeNetworkInsightsAccessScopeAnalysesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NetworkInsightsAccessScopeAnalysisIds\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInsightsAccessScopeAnalysisIdList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the Network Access Scope analyses.</p>\",\n                        \"smithy.api#xmlName\": \"NetworkInsightsAccessScopeAnalysisId\"\n                    }\n                },\n                \"NetworkInsightsAccessScopeId\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInsightsAccessScopeId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the Network Access Scope.</p>\"\n                    }\n                },\n                \"AnalysisStartTimeBegin\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Filters the results based on the start time. The analysis must have started on or after this time.</p>\"\n                    }\n                },\n                \"AnalysisStartTimeEnd\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Filters the results based on the start time. The analysis must have started on or before this time.</p>\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>There are no supported filters.</p>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInsightsMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return with a single call.\\n   To retrieve the remaining results, make another call with the returned <code>nextToken</code> value.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next page of results.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeNetworkInsightsAccessScopeAnalysesResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NetworkInsightsAccessScopeAnalyses\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInsightsAccessScopeAnalysisList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkInsightsAccessScopeAnalysisSet\",\n                        \"smithy.api#documentation\": \"<p>The Network Access Scope analyses.</p>\",\n                        \"smithy.api#xmlName\": \"networkInsightsAccessScopeAnalysisSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeNetworkInsightsAccessScopes\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeNetworkInsightsAccessScopesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeNetworkInsightsAccessScopesResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the specified Network Access Scopes.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"NetworkInsightsAccessScopes\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeNetworkInsightsAccessScopesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NetworkInsightsAccessScopeIds\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInsightsAccessScopeIdList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the Network Access Scopes.</p>\",\n                        \"smithy.api#xmlName\": \"NetworkInsightsAccessScopeId\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>There are no supported filters.</p>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInsightsMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return with a single call.\\n   To retrieve the remaining results, make another call with the returned <code>nextToken</code> value.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next page of results.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeNetworkInsightsAccessScopesResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NetworkInsightsAccessScopes\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInsightsAccessScopeList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkInsightsAccessScopeSet\",\n                        \"smithy.api#documentation\": \"<p>The Network Access Scopes.</p>\",\n                        \"smithy.api#xmlName\": \"networkInsightsAccessScopeSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeNetworkInsightsAnalyses\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeNetworkInsightsAnalysesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeNetworkInsightsAnalysesResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes one or more of your network insights analyses.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"NetworkInsightsAnalyses\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeNetworkInsightsAnalysesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NetworkInsightsAnalysisIds\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInsightsAnalysisIdList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the network insights analyses. You must specify either analysis IDs or a path ID.</p>\",\n                        \"smithy.api#xmlName\": \"NetworkInsightsAnalysisId\"\n                    }\n                },\n                \"NetworkInsightsPathId\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInsightsPathId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the path. You must specify either a path ID or analysis IDs.</p>\"\n                    }\n                },\n                \"AnalysisStartTime\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time when the network insights analyses started.</p>\"\n                    }\n                },\n                \"AnalysisEndTime\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time when the network insights analyses ended.</p>\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The filters. The following are the possible values:</p>\\n         <ul>\\n            <li>\\n               <p>path-found - A Boolean value that indicates whether a feasible path is found.</p>\\n            </li>\\n            <li>\\n               <p>status - The status of the analysis (running | succeeded | failed).</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInsightsMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return with a single call.\\n   To retrieve the remaining results, make another call with the returned <code>nextToken</code> value.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next page of results.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeNetworkInsightsAnalysesResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NetworkInsightsAnalyses\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInsightsAnalysisList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkInsightsAnalysisSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the network insights analyses.</p>\",\n                        \"smithy.api#xmlName\": \"networkInsightsAnalysisSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeNetworkInsightsPaths\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeNetworkInsightsPathsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeNetworkInsightsPathsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes one or more of your paths.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"NetworkInsightsPaths\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeNetworkInsightsPathsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NetworkInsightsPathIds\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInsightsPathIdList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the paths.</p>\",\n                        \"smithy.api#xmlName\": \"NetworkInsightsPathId\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The filters. The following are the possible values:</p>\\n         <ul>\\n            <li>\\n               <p>destination - The ID of the resource.</p>\\n            </li>\\n            <li>\\n               <p>filter-at-source.source-address - The source IPv4 address at the source.</p>\\n            </li>\\n            <li>\\n               <p>filter-at-source.source-port-range - The source port range at the source.</p>\\n            </li>\\n            <li>\\n               <p>filter-at-source.destination-address - The destination IPv4 address at the source.</p>\\n            </li>\\n            <li>\\n               <p>filter-at-source.destination-port-range - The destination port range at the source.</p>\\n            </li>\\n            <li>\\n               <p>filter-at-destination.source-address - The source IPv4 address at the destination.</p>\\n            </li>\\n            <li>\\n               <p>filter-at-destination.source-port-range - The source port range at the destination.</p>\\n            </li>\\n            <li>\\n               <p>filter-at-destination.destination-address - The destination IPv4 address at the destination.</p>\\n            </li>\\n            <li>\\n               <p>filter-at-destination.destination-port-range - The destination port range at the destination.</p>\\n            </li>\\n            <li>\\n               <p>protocol - The protocol.</p>\\n            </li>\\n            <li>\\n               <p>source - The ID of the resource.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInsightsMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return with a single call.\\n   To retrieve the remaining results, make another call with the returned <code>nextToken</code> value.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next page of results.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeNetworkInsightsPathsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NetworkInsightsPaths\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInsightsPathList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkInsightsPathSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the paths.</p>\",\n                        \"smithy.api#xmlName\": \"networkInsightsPathSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeNetworkInterfaceAttribute\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeNetworkInterfaceAttributeRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeNetworkInterfaceAttributeResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a network interface attribute. You can specify only one attribute at a\\n            time.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To describe the attachment attribute of a network interface\",\n                        \"documentation\": \"This example describes the attachment attribute of the specified network interface.\",\n                        \"input\": {\n                            \"NetworkInterfaceId\": \"eni-686ea200\",\n                            \"Attribute\": \"attachment\"\n                        },\n                        \"output\": {\n                            \"NetworkInterfaceId\": \"eni-686ea200\",\n                            \"Attachment\": {\n                                \"Status\": \"attached\",\n                                \"DeviceIndex\": 0,\n                                \"AttachTime\": \"2015-05-21T20:02:20.000Z\",\n                                \"InstanceId\": \"i-1234567890abcdef0\",\n                                \"DeleteOnTermination\": true,\n                                \"AttachmentId\": \"eni-attach-43348162\",\n                                \"InstanceOwnerId\": \"123456789012\"\n                            }\n                        }\n                    },\n                    {\n                        \"title\": \"To describe the description attribute of a network interface\",\n                        \"documentation\": \"This example describes the description attribute of the specified network interface.\",\n                        \"input\": {\n                            \"NetworkInterfaceId\": \"eni-686ea200\",\n                            \"Attribute\": \"description\"\n                        },\n                        \"output\": {\n                            \"NetworkInterfaceId\": \"eni-686ea200\",\n                            \"Description\": {\n                                \"Value\": \"My description\"\n                            }\n                        }\n                    },\n                    {\n                        \"title\": \"To describe the groupSet attribute of a network interface\",\n                        \"documentation\": \"This example describes the groupSet attribute of the specified network interface.\",\n                        \"input\": {\n                            \"NetworkInterfaceId\": \"eni-686ea200\",\n                            \"Attribute\": \"groupSet\"\n                        },\n                        \"output\": {\n                            \"NetworkInterfaceId\": \"eni-686ea200\",\n                            \"Groups\": [\n                                {\n                                    \"GroupName\": \"my-security-group\",\n                                    \"GroupId\": \"sg-903004f8\"\n                                }\n                            ]\n                        }\n                    },\n                    {\n                        \"title\": \"To describe the sourceDestCheck attribute of a network interface\",\n                        \"documentation\": \"This example describes the sourceDestCheck attribute of the specified network interface.\",\n                        \"input\": {\n                            \"NetworkInterfaceId\": \"eni-686ea200\",\n                            \"Attribute\": \"sourceDestCheck\"\n                        },\n                        \"output\": {\n                            \"NetworkInterfaceId\": \"eni-686ea200\",\n                            \"SourceDestCheck\": {\n                                \"Value\": true\n                            }\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#DescribeNetworkInterfaceAttributeRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually\\n            making the request, and provides an error response. If you have the required\\n            permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is\\n                <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"NetworkInterfaceId\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInterfaceId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkInterfaceId\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the network interface.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"networkInterfaceId\"\n                    }\n                },\n                \"Attribute\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInterfaceAttribute\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Attribute\",\n                        \"smithy.api#documentation\": \"<p>The attribute of the network interface. This parameter is required.</p>\",\n                        \"smithy.api#xmlName\": \"attribute\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the parameters for DescribeNetworkInterfaceAttribute.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeNetworkInterfaceAttributeResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Attachment\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInterfaceAttachment\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Attachment\",\n                        \"smithy.api#documentation\": \"<p>The attachment (if any) of the network interface.</p>\",\n                        \"smithy.api#xmlName\": \"attachment\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#AttributeValue\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Description\",\n                        \"smithy.api#documentation\": \"<p>The description of the network interface.</p>\",\n                        \"smithy.api#xmlName\": \"description\"\n                    }\n                },\n                \"Groups\": {\n                    \"target\": \"com.amazonaws.ec2#GroupIdentifierList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"GroupSet\",\n                        \"smithy.api#documentation\": \"<p>The security groups associated with the network interface.</p>\",\n                        \"smithy.api#xmlName\": \"groupSet\"\n                    }\n                },\n                \"NetworkInterfaceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkInterfaceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the network interface.</p>\",\n                        \"smithy.api#xmlName\": \"networkInterfaceId\"\n                    }\n                },\n                \"SourceDestCheck\": {\n                    \"target\": \"com.amazonaws.ec2#AttributeBooleanValue\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SourceDestCheck\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether source/destination checking is enabled.</p>\",\n                        \"smithy.api#xmlName\": \"sourceDestCheck\"\n                    }\n                },\n                \"AssociatePublicIpAddress\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AssociatePublicIpAddress\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether to assign a public IPv4 address to a network interface. This option\\n            can be enabled for any network interface but will only apply to the primary network\\n            interface (eth0).</p>\",\n                        \"smithy.api#xmlName\": \"associatePublicIpAddress\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the output of DescribeNetworkInterfaceAttribute.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeNetworkInterfacePermissions\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeNetworkInterfacePermissionsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeNetworkInterfacePermissionsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the permissions for your network interfaces. </p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"NetworkInterfacePermissions\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeNetworkInterfacePermissionsMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 5,\n                    \"max\": 255\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeNetworkInterfacePermissionsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NetworkInterfacePermissionIds\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInterfacePermissionIdList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The network interface permission IDs.</p>\",\n                        \"smithy.api#xmlName\": \"NetworkInterfacePermissionId\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>network-interface-permission.network-interface-permission-id</code> -\\n                    The ID of the permission.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-interface-permission.network-interface-id</code> - The ID of the\\n                    network interface.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-interface-permission.aws-account-id</code> - The Amazon Web Services account ID.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-interface-permission.aws-service</code> - The Amazon Web Services\\n                    service.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-interface-permission.permission</code> - The type of permission\\n                        (<code>INSTANCE-ATTACH</code> | <code>EIP-ASSOCIATE</code>).</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token returned from a previous paginated request. Pagination continues from the\\n            end of the items returned by the previous request.</p>\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#DescribeNetworkInterfacePermissionsMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of items to return for this request. To get the next page of items,\\n            make another request with the token returned in the output. If this parameter is not\\n            specified, up to 50 results are returned by default. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Query-Requests.html#api-pagination\\\">Pagination</a>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the parameters for DescribeNetworkInterfacePermissions.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeNetworkInterfacePermissionsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NetworkInterfacePermissions\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInterfacePermissionList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkInterfacePermissions\",\n                        \"smithy.api#documentation\": \"<p>The network interface permissions.</p>\",\n                        \"smithy.api#xmlName\": \"networkInterfacePermissions\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to include in another request to get the next page of items. This value is\\n                <code>null</code> when there are no more items to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the output for DescribeNetworkInterfacePermissions.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeNetworkInterfaces\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeNetworkInterfacesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeNetworkInterfacesResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the specified network interfaces or all your network interfaces.</p>\\n         <p>If you have a large number of network interfaces, the operation fails unless you use\\n            pagination or one of the following filters: <code>group-id</code>,\\n                <code>mac-address</code>, <code>private-dns-name</code>,\\n                <code>private-ip-address</code>, <code>subnet-id</code>, or\\n            <code>vpc-id</code>.</p>\\n         <important>\\n            <p>We strongly recommend using only paginated requests. Unpaginated requests are\\n                susceptible to throttling and timeouts.</p>\\n         </important>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To describe a network interface\",\n                        \"documentation\": \"\",\n                        \"input\": {\n                            \"NetworkInterfaceIds\": [\n                                \"eni-e5aa89a3\"\n                            ]\n                        },\n                        \"output\": {\n                            \"NetworkInterfaces\": [\n                                {\n                                    \"Status\": \"in-use\",\n                                    \"MacAddress\": \"02:2f:8f:b0:cf:75\",\n                                    \"SourceDestCheck\": true,\n                                    \"VpcId\": \"vpc-a01106c2\",\n                                    \"Description\": \"my network interface\",\n                                    \"Association\": {\n                                        \"PublicIp\": \"203.0.113.12\",\n                                        \"AssociationId\": \"eipassoc-0fbb766a\",\n                                        \"PublicDnsName\": \"ec2-203-0-113-12.compute-1.amazonaws.com\",\n                                        \"IpOwnerId\": \"123456789012\"\n                                    },\n                                    \"NetworkInterfaceId\": \"eni-e5aa89a3\",\n                                    \"PrivateIpAddresses\": [\n                                        {\n                                            \"PrivateDnsName\": \"ip-10-0-1-17.ec2.internal\",\n                                            \"Association\": {\n                                                \"PublicIp\": \"203.0.113.12\",\n                                                \"AssociationId\": \"eipassoc-0fbb766a\",\n                                                \"PublicDnsName\": \"ec2-203-0-113-12.compute-1.amazonaws.com\",\n                                                \"IpOwnerId\": \"123456789012\"\n                                            },\n                                            \"Primary\": true,\n                                            \"PrivateIpAddress\": \"10.0.1.17\"\n                                        }\n                                    ],\n                                    \"RequesterManaged\": false,\n                                    \"PrivateDnsName\": \"ip-10-0-1-17.ec2.internal\",\n                                    \"AvailabilityZone\": \"us-east-1d\",\n                                    \"Attachment\": {\n                                        \"Status\": \"attached\",\n                                        \"DeviceIndex\": 1,\n                                        \"AttachTime\": \"2013-11-30T23:36:42.000Z\",\n                                        \"InstanceId\": \"i-1234567890abcdef0\",\n                                        \"DeleteOnTermination\": false,\n                                        \"AttachmentId\": \"eni-attach-66c4350a\",\n                                        \"InstanceOwnerId\": \"123456789012\"\n                                    },\n                                    \"Groups\": [\n                                        {\n                                            \"GroupName\": \"default\",\n                                            \"GroupId\": \"sg-8637d3e3\"\n                                        }\n                                    ],\n                                    \"SubnetId\": \"subnet-b61f49f0\",\n                                    \"OwnerId\": \"123456789012\",\n                                    \"TagSet\": [],\n                                    \"PrivateIpAddress\": \"10.0.1.17\"\n                                }\n                            ]\n                        }\n                    }\n                ],\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"NetworkInterfaces\",\n                    \"pageSize\": \"MaxResults\"\n                },\n                \"smithy.api#suppress\": [\n                    \"WaitableTraitInvalidErrorType\"\n                ],\n                \"smithy.waiters#waitable\": {\n                    \"NetworkInterfaceAvailable\": {\n                        \"acceptors\": [\n                            {\n                                \"state\": \"success\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"NetworkInterfaces[].Status\",\n                                        \"expected\": \"available\",\n                                        \"comparator\": \"allStringEquals\"\n                                    }\n                                }\n                            },\n                            {\n                                \"state\": \"failure\",\n                                \"matcher\": {\n                                    \"errorType\": \"InvalidNetworkInterfaceID.NotFound\"\n                                }\n                            }\n                        ],\n                        \"minDelay\": 20\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeNetworkInterfacesMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 5,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeNetworkInterfacesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token returned from a previous paginated request. Pagination continues from the\\n            end of the items returned by the previous request.</p>\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#DescribeNetworkInterfacesMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of items to return for this request. To get the next page of items,\\n            make another request with the token returned in the output. You cannot specify this\\n            parameter and the network interface IDs parameter in the same request. For more\\n            information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Query-Requests.html#api-pagination\\\">Pagination</a>.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually\\n            making the request, and provides an error response. If you have the required\\n            permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is\\n                <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"NetworkInterfaceIds\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInterfaceIdList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The network interface IDs.</p>\\n         <p>Default: Describes all your network interfaces.</p>\",\n                        \"smithy.api#xmlName\": \"NetworkInterfaceId\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Filter\",\n                        \"smithy.api#documentation\": \"<p>One or more filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>association.allocation-id</code> - The allocation ID returned when you\\n                    allocated the Elastic IP address (IPv4) for your network interface.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>association.association-id</code> - The association ID returned when the\\n                    network interface was associated with an IPv4 address.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>addresses.association.owner-id</code> - The owner ID of the addresses\\n                    associated with the network interface.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>addresses.association.public-ip</code> - The association ID returned\\n                    when the network interface was associated with the Elastic IP address\\n                    (IPv4).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>addresses.primary</code> - Whether the private IPv4 address is the\\n                    primary IP address associated with the network interface. </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>addresses.private-ip-address</code> - The private IPv4 addresses\\n                    associated with the network interface.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>association.ip-owner-id</code> - The owner of the Elastic IP address\\n                    (IPv4) associated with the network interface.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>association.public-ip</code> - The address of the Elastic IP address\\n                    (IPv4) bound to the network interface.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>association.public-dns-name</code> - The public DNS name for the network\\n                    interface (IPv4).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>attachment.attach-time</code> - The time that the network interface was\\n                    attached to an instance.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>attachment.attachment-id</code> - The ID of the interface\\n                    attachment.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>attachment.delete-on-termination</code> - Indicates whether the\\n                    attachment is deleted when an instance is terminated.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>attachment.device-index</code> - The device index to which the network\\n                    interface is attached.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>attachment.instance-id</code> - The ID of the instance to which the\\n                    network interface is attached.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>attachment.instance-owner-id</code> - The owner ID of the instance to\\n                    which the network interface is attached.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>attachment.status</code> - The status of the attachment\\n                        (<code>attaching</code> | <code>attached</code> | <code>detaching</code> |\\n                        <code>detached</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>availability-zone</code> - The Availability Zone of the network\\n                    interface.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>description</code> - The description of the network interface.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>group-id</code> - The ID of a security group associated with the network\\n                    interface.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ipv6-addresses.ipv6-address</code> - An IPv6 address associated with the\\n                    network interface.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>interface-type</code> - The type of network interface\\n                        (<code>api_gateway_managed</code> |\\n                        <code>aws_codestar_connections_managed</code> | <code>branch</code> |\\n                        <code>ec2_instance_connect_endpoint</code> | <code>efa</code> |\\n                        <code>efa-only</code> | <code>efs</code> |\\n                        <code>evs</code> |\\n                        <code>gateway_load_balancer</code> |\\n                        <code>gateway_load_balancer_endpoint</code> |\\n                        <code>global_accelerator_managed</code> | <code>interface</code> |\\n                        <code>iot_rules_managed</code> | <code>lambda</code> |\\n                        <code>load_balancer</code> | <code>nat_gateway</code> |\\n                        <code>network_load_balancer</code> | <code>quicksight</code> |\\n                        <code>transit_gateway</code> | <code>trunk</code> |\\n                        <code>vpc_endpoint</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>mac-address</code> - The MAC address of the network interface.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-interface-id</code> - The ID of the network interface.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>operator.managed</code> - A Boolean that indicates whether this is a\\n                    managed network interface.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>operator.principal</code> - The principal that manages the network\\n                    interface. Only valid for managed network interfaces, where <code>managed</code>\\n                    is <code>true</code>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>owner-id</code> - The Amazon Web Services account ID of the network\\n                    interface owner.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>private-dns-name</code> - The private DNS name of the network interface\\n                    (IPv4).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>private-ip-address</code> - The private IPv4 address or addresses of the\\n                    network interface.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>requester-id</code> - The alias or Amazon Web Services account ID of the\\n                    principal or service that created the network interface.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>requester-managed</code> - Indicates whether the network interface is\\n                    being managed by an Amazon Web Services service (for example, Amazon Web Services Management Console, Auto Scaling, and so on).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>source-dest-check</code> - Indicates whether the network interface\\n                    performs source/destination checking. A value of <code>true</code> means\\n                    checking is enabled, and <code>false</code> means checking is disabled. The\\n                    value must be <code>false</code> for the network interface to perform network\\n                    address translation (NAT) in your VPC. </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>status</code> - The status of the network interface. If the network\\n                    interface is not attached to an instance, the status is <code>available</code>;\\n                    if a network interface is attached to an instance the status is\\n                        <code>in-use</code>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>subnet-id</code> - The ID of the subnet for the network\\n                    interface.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag</code>:<key> - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\\n    For example, to find all resources that have a tag with the key <code>Owner</code> and the value <code>TeamA</code>, specify <code>tag:Owner</code> for the filter name and <code>TeamA</code> for the filter value.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag-key</code> - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>vpc-id</code> - The ID of the VPC for the network interface.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"filter\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the parameters for DescribeNetworkInterfaces.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeNetworkInterfacesResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NetworkInterfaces\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInterfaceList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkInterfaceSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the network interfaces.</p>\",\n                        \"smithy.api#xmlName\": \"networkInterfaceSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to include in another request to get the next page of items. This value is\\n                <code>null</code> when there are no more items to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeOutpostLags\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeOutpostLagsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeOutpostLagsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the Outposts link aggregation groups (LAGs).</p>\\n         <note>\\n            <p>LAGs are only available for second-generation Outposts racks at this time.</p>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.ec2#DescribeOutpostLagsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"OutpostLagIds\": {\n                    \"target\": \"com.amazonaws.ec2#OutpostLagIdSet\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the Outpost LAGs.</p>\",\n                        \"smithy.api#xmlName\": \"OutpostLagId\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The filters to use for narrowing down the request. The following filters are\\n         supported:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>service-link-virtual-interface-id</code> - The ID of the service link virtual interface.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>service-link-virtual-interface-arn</code> - The ARN of the service link virtual interface.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>outpost-id</code> - The Outpost ID.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>outpost-arn</code> - The Outpost ARN.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>owner-id</code> - The ID of the Amazon Web Services account that owns the service link virtual interface.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>vlan</code> - The ID of the address pool.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>local-address</code> - The local address.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>peer-address</code> - The peer address.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>peer-bgp-asn</code> - The peer BGP ASN.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>outpost-lag-id</code> - The Outpost LAG ID.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>configuration-state</code> - The configuration state of the service link virtual interface.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#OutpostLagMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return with a single call.\\n\\tTo retrieve the remaining results, make another call with the returned <code>nextToken</code> value.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next page of results.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeOutpostLagsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"OutpostLags\": {\n                    \"target\": \"com.amazonaws.ec2#OutpostLagSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OutpostLagSet\",\n                        \"smithy.api#documentation\": \"<p>The Outpost LAGs.</p>\",\n                        \"smithy.api#xmlName\": \"outpostLagSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribePlacementGroups\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribePlacementGroupsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribePlacementGroupsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the specified placement groups or all of your placement groups.</p>\\n         <note>\\n            <p>To describe a specific placement group that is <i>shared</i> with\\n                your account, you must specify the ID of the placement group using the\\n                    <code>GroupId</code> parameter. Specifying the name of a\\n                    <i>shared</i> placement group using the <code>GroupNames</code>\\n                parameter will result in an error.</p>\\n         </note>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/placement-groups.html\\\">Placement groups</a> in the\\n                <i>Amazon EC2 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DescribePlacementGroupsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"GroupIds\": {\n                    \"target\": \"com.amazonaws.ec2#PlacementGroupIdStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the placement groups.</p>\",\n                        \"smithy.api#xmlName\": \"GroupId\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the operation, without actually making the \\n  request, and provides an error response. If you have the required permissions, the error response is \\n  <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"GroupNames\": {\n                    \"target\": \"com.amazonaws.ec2#PlacementGroupStringList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"GroupName\",\n                        \"smithy.api#documentation\": \"<p>The names of the placement groups.</p>\\n         <p>Constraints:</p>\\n         <ul>\\n            <li>\\n               <p>You can specify a name only if the placement group is owned by your\\n                    account.</p>\\n            </li>\\n            <li>\\n               <p>If a placement group is <i>shared</i> with your account,\\n                    specifying the name results in an error. You must use the <code>GroupId</code>\\n                    parameter instead.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"groupName\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>group-name</code> - The name of the placement group.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>group-arn</code> - The Amazon Resource Name (ARN) of the placement\\n                    group.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>spread-level</code> - The spread level for the placement group\\n                        (<code>host</code> | <code>rack</code>). </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>state</code> - The state of the placement group (<code>pending</code> |\\n                        <code>available</code> | <code>deleting</code> |\\n                    <code>deleted</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>strategy</code> - The strategy of the placement group\\n                        (<code>cluster</code> | <code>spread</code> |\\n                    <code>partition</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag:<key></code> - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\\n    For example, to find all resources that have a tag with the key <code>Owner</code> and the value <code>TeamA</code>, specify <code>tag:Owner</code> for the filter name and <code>TeamA</code> for the filter value.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag-key</code> - The key of a tag assigned to the resource. Use this filter to find all resources that have a tag with a specific key, regardless of the tag value.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribePlacementGroupsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PlacementGroups\": {\n                    \"target\": \"com.amazonaws.ec2#PlacementGroupList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PlacementGroupSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the placement groups.</p>\",\n                        \"smithy.api#xmlName\": \"placementGroupSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribePrefixLists\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribePrefixListsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribePrefixListsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes available Amazon Web Services services in a prefix list format, which includes the prefix list\\n            name and prefix list ID of the service and the IP address range for the service.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"PrefixLists\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribePrefixListsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>prefix-list-id</code>: The ID of a prefix list.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>prefix-list-name</code>: The name of a prefix list.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return with a single call.\\n\\tTo retrieve the remaining results, make another call with the returned <code>nextToken</code> value.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next page of results.</p>\"\n                    }\n                },\n                \"PrefixListIds\": {\n                    \"target\": \"com.amazonaws.ec2#PrefixListResourceIdStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more prefix list IDs.</p>\",\n                        \"smithy.api#xmlName\": \"PrefixListId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribePrefixListsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                },\n                \"PrefixLists\": {\n                    \"target\": \"com.amazonaws.ec2#PrefixListSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PrefixListSet\",\n                        \"smithy.api#documentation\": \"<p>All available prefix lists.</p>\",\n                        \"smithy.api#xmlName\": \"prefixListSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribePrincipalIdFormat\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribePrincipalIdFormatRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribePrincipalIdFormatResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the ID format settings for the root user and all IAM roles and IAM users\\n            that have explicitly specified a longer ID (17-character ID) preference. </p>\\n         <p>By default, all IAM roles and IAM users default to the same ID settings as the root user, unless they\\n            explicitly override the settings. This request is useful for identifying those IAM users and IAM roles\\n            that have overridden the default ID settings.</p>\\n         <p>The following resource types support longer IDs: <code>bundle</code> |\\n          <code>conversion-task</code> | <code>customer-gateway</code> | <code>dhcp-options</code> |\\n          <code>elastic-ip-allocation</code> | <code>elastic-ip-association</code> |\\n          <code>export-task</code> | <code>flow-log</code> | <code>image</code> |\\n          <code>import-task</code> | <code>instance</code> | <code>internet-gateway</code> |\\n          <code>network-acl</code> | <code>network-acl-association</code> |\\n          <code>network-interface</code> | <code>network-interface-attachment</code> |\\n          <code>prefix-list</code> | <code>reservation</code> | <code>route-table</code> |\\n          <code>route-table-association</code> | <code>security-group</code> |\\n          <code>snapshot</code> | <code>subnet</code> |\\n          <code>subnet-cidr-block-association</code> | <code>volume</code> | <code>vpc</code>\\n          | <code>vpc-cidr-block-association</code> | <code>vpc-endpoint</code> |\\n          <code>vpc-peering-connection</code> | <code>vpn-connection</code> | <code>vpn-gateway</code>. </p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"Principals\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribePrincipalIdFormatMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribePrincipalIdFormatRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"Resources\": {\n                    \"target\": \"com.amazonaws.ec2#ResourceList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of resource: <code>bundle</code> |\\n            <code>conversion-task</code> | <code>customer-gateway</code> | <code>dhcp-options</code> |\\n            <code>elastic-ip-allocation</code> | <code>elastic-ip-association</code> |\\n            <code>export-task</code> | <code>flow-log</code> | <code>image</code> |\\n            <code>import-task</code> | <code>instance</code> | <code>internet-gateway</code> |\\n            <code>network-acl</code> | <code>network-acl-association</code> |\\n            <code>network-interface</code> | <code>network-interface-attachment</code> |\\n            <code>prefix-list</code> | <code>reservation</code> | <code>route-table</code> |\\n            <code>route-table-association</code> | <code>security-group</code> |\\n            <code>snapshot</code> | <code>subnet</code> |\\n            <code>subnet-cidr-block-association</code> | <code>volume</code> | <code>vpc</code>\\n            | <code>vpc-cidr-block-association</code> | <code>vpc-endpoint</code> |\\n            <code>vpc-peering-connection</code> | <code>vpn-connection</code> | <code>vpn-gateway</code>\\n         </p>\",\n                        \"smithy.api#xmlName\": \"Resource\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#DescribePrincipalIdFormatMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return in a single call. To retrieve the remaining\\n            results, make another call with the returned NextToken value. </p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token to request the next page of results.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribePrincipalIdFormatResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Principals\": {\n                    \"target\": \"com.amazonaws.ec2#PrincipalIdFormatList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PrincipalSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the ID format settings for the ARN.</p>\",\n                        \"smithy.api#xmlName\": \"principalSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is null when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribePublicIpv4Pools\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribePublicIpv4PoolsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribePublicIpv4PoolsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the specified IPv4 address pools.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"PublicIpv4Pools\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribePublicIpv4PoolsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PoolIds\": {\n                    \"target\": \"com.amazonaws.ec2#PublicIpv4PoolIdStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the address pools.</p>\",\n                        \"smithy.api#xmlName\": \"PoolId\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next page of results.</p>\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#PoolMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return with a single call.\\n\\tTo retrieve the remaining results, make another call with the returned <code>nextToken</code> value.</p>\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>tag</code>:<key> - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\\n    For example, to find all resources that have a tag with the key <code>Owner</code> and the value <code>TeamA</code>, specify <code>tag:Owner</code> for the filter name and <code>TeamA</code> for the filter value.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag-key</code> - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribePublicIpv4PoolsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PublicIpv4Pools\": {\n                    \"target\": \"com.amazonaws.ec2#PublicIpv4PoolSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PublicIpv4PoolSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the address pools.</p>\",\n                        \"smithy.api#xmlName\": \"publicIpv4PoolSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeRegions\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeRegionsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeRegionsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the Regions that are enabled for your account, or all Regions.</p>\\n         <p>For a list of the Regions supported by Amazon EC2, see <a href=\\\"https://docs.aws.amazon.com/ec2/latest/devguide/ec2-endpoints.html\\\">Amazon EC2 service endpoints</a>.</p>\\n         <p>For information about enabling and disabling Regions for your account, see <a href=\\\"https://docs.aws.amazon.com/accounts/latest/reference/manage-acct-regions.html\\\">Specify which Amazon Web Services Regions \\n      your account can use</a> in the <i>Amazon Web Services Account Management Reference Guide</i>.</p>\\n         <note>\\n            <p>The order of the elements in the response, including those within nested structures,\\n        might vary. Applications should not assume the elements appear in a particular order.</p>\\n         </note>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To describe your regions\",\n                        \"documentation\": \"This example describes all the regions that are available to you.\",\n                        \"output\": {\n                            \"Regions\": [\n                                {\n                                    \"Endpoint\": \"ec2.ap-south-1.amazonaws.com\",\n                                    \"RegionName\": \"ap-south-1\"\n                                },\n                                {\n                                    \"Endpoint\": \"ec2.eu-west-1.amazonaws.com\",\n                                    \"RegionName\": \"eu-west-1\"\n                                },\n                                {\n                                    \"Endpoint\": \"ec2.ap-southeast-1.amazonaws.com\",\n                                    \"RegionName\": \"ap-southeast-1\"\n                                },\n                                {\n                                    \"Endpoint\": \"ec2.ap-southeast-2.amazonaws.com\",\n                                    \"RegionName\": \"ap-southeast-2\"\n                                },\n                                {\n                                    \"Endpoint\": \"ec2.eu-central-1.amazonaws.com\",\n                                    \"RegionName\": \"eu-central-1\"\n                                },\n                                {\n                                    \"Endpoint\": \"ec2.ap-northeast-2.amazonaws.com\",\n                                    \"RegionName\": \"ap-northeast-2\"\n                                },\n                                {\n                                    \"Endpoint\": \"ec2.ap-northeast-1.amazonaws.com\",\n                                    \"RegionName\": \"ap-northeast-1\"\n                                },\n                                {\n                                    \"Endpoint\": \"ec2.us-east-1.amazonaws.com\",\n                                    \"RegionName\": \"us-east-1\"\n                                },\n                                {\n                                    \"Endpoint\": \"ec2.sa-east-1.amazonaws.com\",\n                                    \"RegionName\": \"sa-east-1\"\n                                },\n                                {\n                                    \"Endpoint\": \"ec2.us-west-1.amazonaws.com\",\n                                    \"RegionName\": \"us-west-1\"\n                                },\n                                {\n                                    \"Endpoint\": \"ec2.us-west-2.amazonaws.com\",\n                                    \"RegionName\": \"us-west-2\"\n                                }\n                            ]\n                        }\n                    }\n                ],\n                \"smithy.test#smokeTests\": [\n                    {\n                        \"id\": \"DescribeRegionsSuccess\",\n                        \"params\": {},\n                        \"vendorParams\": {\n                            \"region\": \"us-west-2\"\n                        },\n                        \"vendorParamsShape\": \"aws.test#AwsVendorParams\",\n                        \"expect\": {\n                            \"success\": {}\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#DescribeRegionsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RegionNames\": {\n                    \"target\": \"com.amazonaws.ec2#RegionNameStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The names of the Regions. You can specify any Regions, whether they are enabled and disabled for your account.</p>\",\n                        \"smithy.api#xmlName\": \"RegionName\"\n                    }\n                },\n                \"AllRegions\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether to display all Regions, including Regions that are disabled for your account.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>endpoint</code> - The endpoint of the Region (for example, <code>ec2.us-east-1.amazonaws.com</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>opt-in-status</code> - The opt-in status of the Region (<code>opt-in-not-required</code> | <code>opted-in</code> | \\n                 <code>not-opted-in</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>region-name</code> - The name of the Region (for example, <code>us-east-1</code>).</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeRegionsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Regions\": {\n                    \"target\": \"com.amazonaws.ec2#RegionList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RegionInfo\",\n                        \"smithy.api#documentation\": \"<p>Information about the Regions.</p>\",\n                        \"smithy.api#xmlName\": \"regionInfo\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeReplaceRootVolumeTasks\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeReplaceRootVolumeTasksRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeReplaceRootVolumeTasksResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a root volume replacement task. For more information, see \\n      <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/replace-root.html\\\">Replace a root volume</a> in the <i>Amazon EC2 User Guide</i>.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"ReplaceRootVolumeTasks\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeReplaceRootVolumeTasksMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 50\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeReplaceRootVolumeTasksRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ReplaceRootVolumeTaskIds\": {\n                    \"target\": \"com.amazonaws.ec2#ReplaceRootVolumeTaskIds\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the root volume replacement task to view.</p>\",\n                        \"smithy.api#xmlName\": \"ReplaceRootVolumeTaskId\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Filter to use:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>instance-id</code> - The ID of the instance for which the root volume replacement task was created.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#DescribeReplaceRootVolumeTasksMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of items to return for this request.\\n\\tTo get the next page of items, make another request with the token returned in the output. \\n\\tFor more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Query-Requests.html#api-pagination\\\">Pagination</a>.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token returned from a previous paginated request.\\n  Pagination continues from the end of the items returned by the previous request.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeReplaceRootVolumeTasksResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ReplaceRootVolumeTasks\": {\n                    \"target\": \"com.amazonaws.ec2#ReplaceRootVolumeTasks\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ReplaceRootVolumeTaskSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the root volume replacement task.</p>\",\n                        \"smithy.api#xmlName\": \"replaceRootVolumeTaskSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to include in another request to get the next page of items. \\n  This value is <code>null</code> when there are no more items to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeReservedInstances\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeReservedInstancesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeReservedInstancesResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes one or more of the Reserved Instances that you purchased.</p>\\n         <p>For more information about Reserved Instances, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/concepts-on-demand-reserved-instances.html\\\">Reserved\\n        Instances</a> in the <i>Amazon EC2 User Guide</i>.</p>\\n         <note>\\n            <p>The order of the elements in the response, including those within nested structures,\\n        might vary. Applications should not assume the elements appear in a particular order.</p>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.ec2#DescribeReservedInstancesListings\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeReservedInstancesListingsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeReservedInstancesListingsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes your account's Reserved Instance listings in the Reserved Instance\\n      Marketplace.</p>\\n         <p>The Reserved Instance Marketplace matches sellers who want to resell Reserved Instance\\n      capacity that they no longer need with buyers who want to purchase additional capacity.\\n      Reserved Instances bought and sold through the Reserved Instance Marketplace work like any\\n      other Reserved Instances.</p>\\n         <p>As a seller, you choose to list some or all of your Reserved Instances, and you specify\\n      the upfront price to receive for them. Your Reserved Instances are then listed in the Reserved\\n      Instance Marketplace and are available for purchase.</p>\\n         <p>As a buyer, you specify the configuration of the Reserved Instance to purchase, and the\\n      Marketplace matches what you're searching for with what's available. The Marketplace first\\n      sells the lowest priced Reserved Instances to you, and continues to sell available Reserved\\n      Instance listings to you until your demand is met. You are charged based on the total price of\\n      all of the listings that you purchase.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ri-market-general.html\\\">Sell in the Reserved Instance\\n        Marketplace</a> in the <i>Amazon EC2 User Guide</i>.</p>\\n         <note>\\n            <p>The order of the elements in the response, including those within nested structures,\\n        might vary. Applications should not assume the elements appear in a particular order.</p>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.ec2#DescribeReservedInstancesListingsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ReservedInstancesId\": {\n                    \"target\": \"com.amazonaws.ec2#ReservationId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ReservedInstancesId\",\n                        \"smithy.api#documentation\": \"<p>One or more Reserved Instance IDs.</p>\",\n                        \"smithy.api#xmlName\": \"reservedInstancesId\"\n                    }\n                },\n                \"ReservedInstancesListingId\": {\n                    \"target\": \"com.amazonaws.ec2#ReservedInstancesListingId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ReservedInstancesListingId\",\n                        \"smithy.api#documentation\": \"<p>One or more Reserved Instance listing IDs.</p>\",\n                        \"smithy.api#xmlName\": \"reservedInstancesListingId\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>reserved-instances-id</code> - The ID of the Reserved Instances.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>reserved-instances-listing-id</code> - The ID of the Reserved Instances\\n          listing.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>status</code> - The status of the Reserved Instance listing (<code>pending</code> |\\n            <code>active</code> | <code>cancelled</code> | <code>closed</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>status-message</code> - The reason for the status.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the parameters for DescribeReservedInstancesListings.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeReservedInstancesListingsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ReservedInstancesListings\": {\n                    \"target\": \"com.amazonaws.ec2#ReservedInstancesListingList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ReservedInstancesListingsSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the Reserved Instance listing.</p>\",\n                        \"smithy.api#xmlName\": \"reservedInstancesListingsSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the output of DescribeReservedInstancesListings.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeReservedInstancesModifications\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeReservedInstancesModificationsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeReservedInstancesModificationsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the modifications made to your Reserved Instances. If no parameter is specified,\\n      information about all your Reserved Instances modification requests is returned. If a\\n      modification ID is specified, only information about the specific modification is\\n      returned.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ri-modifying.html\\\">Modify Reserved Instances</a> in the\\n        <i>Amazon EC2 User Guide</i>.</p>\\n         <note>\\n            <p>The order of the elements in the response, including those within nested structures,\\n        might vary. Applications should not assume the elements appear in a particular order.</p>\\n         </note>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"ReservedInstancesModifications\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeReservedInstancesModificationsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ReservedInstancesModificationIds\": {\n                    \"target\": \"com.amazonaws.ec2#ReservedInstancesModificationIdStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>IDs for the submitted modification request.</p>\",\n                        \"smithy.api#xmlName\": \"ReservedInstancesModificationId\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to retrieve the next page of results.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>client-token</code> - The idempotency token for the modification request.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>create-date</code> - The time when the modification request was created.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>effective-date</code> - The time when the modification becomes effective.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>modification-result.reserved-instances-id</code> - The ID for the Reserved Instances\\n          created as part of the modification request. This ID is only available when the status of\\n          the modification is <code>fulfilled</code>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>modification-result.target-configuration.availability-zone</code> - The Availability\\n          Zone for the new Reserved Instances.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>modification-result.target-configuration.availability-zone-id</code> - The ID of the\\n          Availability Zone for the new Reserved Instances.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>modification-result.target-configuration.instance-count </code> - The number of new\\n          Reserved Instances.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>modification-result.target-configuration.instance-type</code> - The instance type of\\n          the new Reserved Instances.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>reserved-instances-id</code> - The ID of the Reserved Instances modified.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>reserved-instances-modification-id</code> - The ID of the modification\\n          request.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>status</code> - The status of the Reserved Instances modification request\\n            (<code>processing</code> | <code>fulfilled</code> | <code>failed</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>status-message</code> - The reason for the status.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>update-date</code> - The time when the modification request was last updated.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the parameters for DescribeReservedInstancesModifications.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeReservedInstancesModificationsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code>\\n      when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                },\n                \"ReservedInstancesModifications\": {\n                    \"target\": \"com.amazonaws.ec2#ReservedInstancesModificationList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ReservedInstancesModificationsSet\",\n                        \"smithy.api#documentation\": \"<p>The Reserved Instance modification information.</p>\",\n                        \"smithy.api#xmlName\": \"reservedInstancesModificationsSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the output of DescribeReservedInstancesModifications.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeReservedInstancesOfferings\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeReservedInstancesOfferingsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeReservedInstancesOfferingsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes Reserved Instance offerings that are available for purchase. With Reserved\\n      Instances, you purchase the right to launch instances for a period of time. During that time\\n      period, you do not receive insufficient capacity errors, and you pay a lower usage rate than\\n      the rate charged for On-Demand instances for the actual time used.</p>\\n         <p>If you have listed your own Reserved Instances for sale in the Reserved Instance\\n      Marketplace, they will be excluded from these results. This is to ensure that you do not\\n      purchase your own Reserved Instances.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ri-market-general.html\\\">Sell in the Reserved Instance\\n        Marketplace</a> in the <i>Amazon EC2 User Guide</i>.</p>\\n         <note>\\n            <p>The order of the elements in the response, including those within nested structures,\\n        might vary. Applications should not assume the elements appear in a particular order.</p>\\n         </note>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"ReservedInstancesOfferings\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeReservedInstancesOfferingsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AvailabilityZone\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Availability Zone in which the Reserved Instance can be used.</p>\\n         <p>Either <code>AvailabilityZone</code> or <code>AvailabilityZoneId</code> can be specified,\\n      but not both.</p>\"\n                    }\n                },\n                \"IncludeMarketplace\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Include Reserved Instance Marketplace offerings in the response.</p>\"\n                    }\n                },\n                \"InstanceType\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The instance type that the reservation will cover (for example, <code>m1.small</code>).\\n      For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html\\\">Amazon EC2 instance types</a> in the\\n        <i>Amazon EC2 User Guide</i>.</p>\"\n                    }\n                },\n                \"MaxDuration\": {\n                    \"target\": \"com.amazonaws.ec2#Long\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum duration (in seconds) to filter when searching for offerings.</p>\\n         <p>Default: 94608000 (3 years)</p>\"\n                    }\n                },\n                \"MaxInstanceCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of instances to filter when searching for offerings.</p>\\n         <p>Default: 20</p>\"\n                    }\n                },\n                \"MinDuration\": {\n                    \"target\": \"com.amazonaws.ec2#Long\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The minimum duration (in seconds) to filter when searching for offerings.</p>\\n         <p>Default: 2592000 (1 month)</p>\"\n                    }\n                },\n                \"OfferingClass\": {\n                    \"target\": \"com.amazonaws.ec2#OfferingClassType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The offering class of the Reserved Instance. Can be <code>standard</code> or\\n        <code>convertible</code>.</p>\"\n                    }\n                },\n                \"ProductDescription\": {\n                    \"target\": \"com.amazonaws.ec2#RIProductDescription\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Reserved Instance product platform description. Instances that include <code>(Amazon\\n        VPC)</code> in the description are for use with Amazon VPC.</p>\"\n                    }\n                },\n                \"ReservedInstancesOfferingIds\": {\n                    \"target\": \"com.amazonaws.ec2#ReservedInstancesOfferingIdStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more Reserved Instances offering IDs.</p>\",\n                        \"smithy.api#xmlName\": \"ReservedInstancesOfferingId\"\n                    }\n                },\n                \"AvailabilityZoneId\": {\n                    \"target\": \"com.amazonaws.ec2#AvailabilityZoneId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the Availability Zone.</p>\\n         <p>Either <code>AvailabilityZone</code> or <code>AvailabilityZoneId</code> can be specified,\\n      but not both.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making\\n      the request, and provides an error response. If you have the required permissions, the error\\n      response is <code>DryRunOperation</code>. Otherwise, it is\\n      <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>availability-zone</code> - The Availability Zone where the Reserved Instance can be\\n          used.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>availability-zone-id</code> - The ID of the Availability Zone where the Reserved\\n          Instance can be used.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>duration</code> - The duration of the Reserved Instance (for example, one year or\\n          three years), in seconds (<code>31536000</code> | <code>94608000</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>fixed-price</code> - The purchase price of the Reserved Instance (for example,\\n          9800.0).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>instance-type</code> - The instance type that is covered by the reservation.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>marketplace</code> - Set to <code>true</code> to show only Reserved Instance\\n          Marketplace offerings. When this filter is not used, which is the default behavior, all\\n          offerings from both Amazon Web Services and the Reserved Instance Marketplace are listed.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>product-description</code> - The Reserved Instance product platform description\\n            (<code>Linux/UNIX</code> | <code>Linux with SQL Server Standard</code> | <code>Linux\\n            with SQL Server Web</code> | <code>Linux with SQL Server Enterprise</code> | <code>SUSE\\n            Linux</code> | <code>Red Hat Enterprise Linux</code> | <code>Red Hat Enterprise Linux\\n            with HA</code> | <code>Windows</code> | <code>Windows with SQL Server Standard</code> |\\n            <code>Windows with SQL Server Web</code> | <code>Windows with SQL Server\\n            Enterprise</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>reserved-instances-offering-id</code> - The Reserved Instances offering ID.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>scope</code> - The scope of the Reserved Instance (<code>Availability Zone</code> or\\n            <code>Region</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>usage-price</code> - The usage price of the Reserved Instance, per hour (for\\n          example, 0.84).</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"InstanceTenancy\": {\n                    \"target\": \"com.amazonaws.ec2#Tenancy\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceTenancy\",\n                        \"smithy.api#documentation\": \"<p>The tenancy of the instances covered by the reservation. A Reserved Instance with a\\n      tenancy of <code>dedicated</code> is applied to instances that run in a VPC on single-tenant\\n      hardware (i.e., Dedicated Instances).</p>\\n         <p>\\n            <b>Important:</b> The <code>host</code> value cannot be used with\\n      this parameter. Use the <code>default</code> or <code>dedicated</code> values only.</p>\\n         <p>Default: <code>default</code>\\n         </p>\",\n                        \"smithy.api#xmlName\": \"instanceTenancy\"\n                    }\n                },\n                \"OfferingType\": {\n                    \"target\": \"com.amazonaws.ec2#OfferingTypeValues\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OfferingType\",\n                        \"smithy.api#documentation\": \"<p>The Reserved Instance offering type. If you are using tools that predate the 2011-11-01\\n      API version, you only have access to the <code>Medium Utilization</code> Reserved Instance\\n      offering type. </p>\",\n                        \"smithy.api#xmlName\": \"offeringType\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to retrieve the next page of results.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MaxResults\",\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return for the request in a single page. The remaining\\n      results of the initial request can be seen by sending another request with the returned\\n        <code>NextToken</code> value. The maximum is 100.</p>\\n         <p>Default: 100</p>\",\n                        \"smithy.api#xmlName\": \"maxResults\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the parameters for DescribeReservedInstancesOfferings.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeReservedInstancesOfferingsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code>\\n      when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                },\n                \"ReservedInstancesOfferings\": {\n                    \"target\": \"com.amazonaws.ec2#ReservedInstancesOfferingList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ReservedInstancesOfferingsSet\",\n                        \"smithy.api#documentation\": \"<p>A list of Reserved Instances offerings.</p>\",\n                        \"smithy.api#xmlName\": \"reservedInstancesOfferingsSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the output of DescribeReservedInstancesOfferings.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeReservedInstancesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"OfferingClass\": {\n                    \"target\": \"com.amazonaws.ec2#OfferingClassType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Describes whether the Reserved Instance is Standard or Convertible.</p>\"\n                    }\n                },\n                \"ReservedInstancesIds\": {\n                    \"target\": \"com.amazonaws.ec2#ReservedInstancesIdStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more Reserved Instance IDs.</p>\\n         <p>Default: Describes all your Reserved Instances, or only those otherwise specified.</p>\",\n                        \"smithy.api#xmlName\": \"ReservedInstancesId\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making\\n      the request, and provides an error response. If you have the required permissions, the error\\n      response is <code>DryRunOperation</code>. Otherwise, it is\\n      <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>availability-zone</code> - The Availability Zone where the Reserved Instance can\\n          be used.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>availability-zone-id</code> - The ID of the Availability Zone where the Reserved\\n          Instance can be used.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>duration</code> - The duration of the Reserved Instance (one year or three\\n          years), in seconds (<code>31536000</code> | <code>94608000</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>end</code> - The time when the Reserved Instance expires (for example,\\n          2015-08-07T11:54:42.000Z).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>fixed-price</code> - The purchase price of the Reserved Instance (for example,\\n          9800.0).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>instance-type</code> - The instance type that is covered by the\\n          reservation.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>scope</code> - The scope of the Reserved Instance (<code>Region</code> or\\n            <code>Availability Zone</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>product-description</code> - The Reserved Instance product platform description\\n            (<code>Linux/UNIX</code> | <code>Linux with SQL Server Standard</code> | <code>Linux\\n            with SQL Server Web</code> | <code>Linux with SQL Server Enterprise</code> | <code>SUSE\\n            Linux</code> | <code>Red Hat Enterprise Linux</code> | <code>Red Hat Enterprise Linux\\n            with HA</code> | <code>Windows</code> | <code>Windows with SQL Server Standard</code> |\\n            <code>Windows with SQL Server Web</code> | <code>Windows with SQL Server\\n            Enterprise</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>reserved-instances-id</code> - The ID of the Reserved Instance.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>start</code> - The time at which the Reserved Instance purchase request was\\n          placed (for example, 2014-08-07T11:54:42.000Z).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>state</code> - The state of the Reserved Instance (<code>payment-pending</code>\\n          | <code>active</code> | <code>payment-failed</code> | <code>retired</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag:<key></code> - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\\n    For example, to find all resources that have a tag with the key <code>Owner</code> and the value <code>TeamA</code>, specify <code>tag:Owner</code> for the filter name and <code>TeamA</code> for the filter value.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag-key</code> - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>usage-price</code> - The usage price of the Reserved Instance, per hour (for\\n          example, 0.84).</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"OfferingType\": {\n                    \"target\": \"com.amazonaws.ec2#OfferingTypeValues\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OfferingType\",\n                        \"smithy.api#documentation\": \"<p>The Reserved Instance offering type. If you are using tools that predate the 2011-11-01\\n      API version, you only have access to the <code>Medium Utilization</code> Reserved Instance\\n      offering type.</p>\",\n                        \"smithy.api#xmlName\": \"offeringType\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the parameters for DescribeReservedInstances.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeReservedInstancesResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ReservedInstances\": {\n                    \"target\": \"com.amazonaws.ec2#ReservedInstancesList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ReservedInstancesSet\",\n                        \"smithy.api#documentation\": \"<p>A list of Reserved Instances.</p>\",\n                        \"smithy.api#xmlName\": \"reservedInstancesSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the output for DescribeReservedInstances.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeRouteServerEndpoints\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeRouteServerEndpointsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeRouteServerEndpointsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes one or more route server endpoints.</p>\\n         <p>A route server endpoint is an Amazon Web Services-managed component inside a subnet that facilitates <a href=\\\"https://en.wikipedia.org/wiki/Border_Gateway_Protocol\\\">BGP (Border Gateway Protocol)</a> connections between your route server and your BGP peers.</p>\\n         <p>For more information see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/userguide/dynamic-routing-route-server.html\\\">Dynamic routing in your VPC with VPC Route Server</a> in the <i>Amazon VPC User Guide</i>.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"RouteServerEndpoints\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeRouteServerEndpointsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RouteServerEndpointIds\": {\n                    \"target\": \"com.amazonaws.ec2#RouteServerEndpointIdsList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the route server endpoints to describe.</p>\",\n                        \"smithy.api#xmlName\": \"RouteServerEndpointId\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next page of results.</p>\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#RouteServerMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return with a single call.</p>\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more filters to apply to the describe request.</p>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A check for whether you have the required permissions for the action without actually making the request \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeRouteServerEndpointsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RouteServerEndpoints\": {\n                    \"target\": \"com.amazonaws.ec2#RouteServerEndpointsList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RouteServerEndpointSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the described route server endpoints.</p>\",\n                        \"smithy.api#xmlName\": \"routeServerEndpointSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeRouteServerPeers\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeRouteServerPeersRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeRouteServerPeersResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes one or more route server peers.</p>\\n         <p>A route server peer is a session between a route server endpoint and the device deployed in Amazon Web Services (such as a firewall appliance or other network security function running on an EC2 instance). The device must meet these requirements:</p>\\n         <ul>\\n            <li>\\n               <p>Have an elastic network interface in the VPC</p>\\n            </li>\\n            <li>\\n               <p>Support BGP (Border Gateway Protocol)</p>\\n            </li>\\n            <li>\\n               <p>Can initiate BGP sessions</p>\\n            </li>\\n         </ul>\\n         <p>For more information see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/userguide/dynamic-routing-route-server.html\\\">Dynamic routing in your VPC with VPC Route Server</a> in the <i>Amazon VPC User Guide</i>.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"RouteServerPeers\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeRouteServerPeersRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RouteServerPeerIds\": {\n                    \"target\": \"com.amazonaws.ec2#RouteServerPeerIdsList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the route server peers to describe.</p>\",\n                        \"smithy.api#xmlName\": \"RouteServerPeerId\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next page of results.</p>\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#RouteServerMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return with a single call.</p>\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more filters to apply to the describe request.</p>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A check for whether you have the required permissions for the action without actually making the request \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeRouteServerPeersResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RouteServerPeers\": {\n                    \"target\": \"com.amazonaws.ec2#RouteServerPeersList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RouteServerPeerSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the described route server peers.</p>\",\n                        \"smithy.api#xmlName\": \"routeServerPeerSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeRouteServers\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeRouteServersRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeRouteServersResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes one or more route servers.</p>\\n         <p>Amazon VPC Route Server simplifies routing for traffic between workloads that are deployed within a VPC and its internet gateways. With this feature, \\nVPC Route Server dynamically updates VPC and internet gateway route tables with your preferred IPv4 or IPv6 routes to achieve routing fault tolerance for those workloads. This enables you to automatically reroute traffic within a VPC, which increases the manageability of VPC routing and interoperability with third-party workloads.</p>\\n         <p>Route server supports the follow route table types:</p>\\n         <ul>\\n            <li>\\n               <p>VPC route tables not associated with subnets</p>\\n            </li>\\n            <li>\\n               <p>Subnet route tables</p>\\n            </li>\\n            <li>\\n               <p>Internet gateway route tables</p>\\n            </li>\\n         </ul>\\n         <p>Route server does not support route tables associated with virtual private gateways. To propagate routes into a transit gateway route table, use <a href=\\\"https://docs.aws.amazon.com/vpc/latest/tgw/tgw-connect.html\\\">Transit Gateway Connect</a>.</p>\\n         <p>For more information see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/userguide/dynamic-routing-route-server.html\\\">Dynamic routing in your VPC with VPC Route Server</a> in the <i>Amazon VPC User Guide</i>.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"RouteServers\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeRouteServersRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RouteServerIds\": {\n                    \"target\": \"com.amazonaws.ec2#RouteServerIdsList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the route servers to describe.</p>\",\n                        \"smithy.api#xmlName\": \"RouteServerId\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next page of results.</p>\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#RouteServerMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return with a single call.</p>\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more filters to apply to the describe request.</p>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A check for whether you have the required permissions for the action without actually making the request \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeRouteServersResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RouteServers\": {\n                    \"target\": \"com.amazonaws.ec2#RouteServersList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RouteServerSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the described route servers.</p>\",\n                        \"smithy.api#xmlName\": \"routeServerSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeRouteTables\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeRouteTablesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeRouteTablesResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes your route tables. The default is to describe all your route tables. \\n           Alternatively, you can specify specific route table IDs or filter the results to\\n           include only the route tables that match specific criteria.</p>\\n         <p>Each subnet in your VPC must be associated with a route table. If a subnet is not explicitly associated with any route table, it is implicitly associated with the main route table. This command does not return the subnet ID for implicit associations.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Route_Tables.html\\\">Route tables</a> in the\\n\\t\\t\\t\\t<i>Amazon VPC User Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To describe a route table\",\n                        \"documentation\": \"This example describes the specified route table.\",\n                        \"input\": {\n                            \"RouteTableIds\": [\n                                \"rtb-1f382e7d\"\n                            ]\n                        },\n                        \"output\": {\n                            \"RouteTables\": [\n                                {\n                                    \"Associations\": [\n                                        {\n                                            \"RouteTableAssociationId\": \"rtbassoc-d8ccddba\",\n                                            \"Main\": true,\n                                            \"RouteTableId\": \"rtb-1f382e7d\"\n                                        }\n                                    ],\n                                    \"RouteTableId\": \"rtb-1f382e7d\",\n                                    \"VpcId\": \"vpc-a01106c2\",\n                                    \"PropagatingVgws\": [],\n                                    \"Tags\": [],\n                                    \"Routes\": [\n                                        {\n                                            \"GatewayId\": \"local\",\n                                            \"DestinationCidrBlock\": \"10.0.0.0/16\",\n                                            \"State\": \"active\"\n                                        }\n                                    ]\n                                }\n                            ]\n                        }\n                    }\n                ],\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"RouteTables\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeRouteTablesMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 5,\n                    \"max\": 100\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeRouteTablesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token returned from a previous paginated request. Pagination continues from the end of the items returned by the previous request.</p>\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#DescribeRouteTablesMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of items to return for this request.\\n\\tTo get the next page of items, make another request with the token returned in the output.\\n\\tFor more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Query-Requests.html#api-pagination\\\">Pagination</a>.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"RouteTableIds\": {\n                    \"target\": \"com.amazonaws.ec2#RouteTableIdStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the route tables.</p>\",\n                        \"smithy.api#xmlName\": \"RouteTableId\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>association.gateway-id</code> - The ID of the gateway involved in the\\n\\t\\t                association.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>association.route-table-association-id</code> - The ID of an association\\n                    ID for the route table.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>association.route-table-id</code> - The ID of the route table involved in\\n                    the association.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>association.subnet-id</code> - The ID of the subnet involved in the\\n                    association.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>association.main</code> - Indicates whether the route table is the main\\n                    route table for the VPC (<code>true</code> | <code>false</code>). Route tables\\n                    that do not have an association ID are not returned in the response.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>owner-id</code> - The ID of the Amazon Web Services account that owns the route table.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>route-table-id</code> - The ID of the route table.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>route.destination-cidr-block</code> - The IPv4 CIDR range specified in a\\n                    route in the table.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>route.destination-ipv6-cidr-block</code> - The IPv6 CIDR range specified in a route in the route table.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>route.destination-prefix-list-id</code> - The ID (prefix) of the Amazon Web Services \\n\\t\\t\\t\\t      service specified in a route in the table.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>route.egress-only-internet-gateway-id</code> - The ID of an\\n                    egress-only Internet gateway specified in a route in the route table.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>route.gateway-id</code> - The ID of a gateway specified in a route in the table.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>route.instance-id</code> - The ID of an instance specified in a route in the table.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>route.nat-gateway-id</code> - The ID of a NAT gateway.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>route.transit-gateway-id</code> - The ID of a transit gateway.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>route.origin</code> - Describes how the route was created. \\n                        <code>CreateRouteTable</code> indicates that the route was automatically\\n                    created when the route table was created; <code>CreateRoute</code> indicates\\n                    that the route was manually added to the route table;\\n                        <code>EnableVgwRoutePropagation</code> indicates that the route was\\n                    propagated by route propagation.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>route.state</code> - The state of a route in the route table\\n                        (<code>active</code> | <code>blackhole</code>). The blackhole state\\n                    indicates that the route's target isn't available (for example, the specified\\n                    gateway isn't attached to the VPC, the specified NAT instance has been\\n                    terminated, and so on).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>route.vpc-peering-connection-id</code> - The ID of a VPC peering\\n\\t\\t                connection specified in a route in the table.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag</code> - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\\n    For example, to find all resources that have a tag with the key <code>Owner</code> and the value <code>TeamA</code>, specify <code>tag:Owner</code> for the filter name and <code>TeamA</code> for the filter value.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag-key</code> - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>vpc-id</code> - The ID of the VPC for the route table.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeRouteTablesResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RouteTables\": {\n                    \"target\": \"com.amazonaws.ec2#RouteTableList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RouteTableSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the route tables.</p>\",\n                        \"smithy.api#xmlName\": \"routeTableSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to include in another request to get the next page of items. This value is <code>null</code> when there are no more items to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the output of DescribeRouteTables.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeScheduledInstanceAvailability\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeScheduledInstanceAvailabilityRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeScheduledInstanceAvailabilityResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Finds available schedules that meet the specified criteria.</p>\\n         <p>You can search for an available schedule no more than 3 months in advance. You must meet the minimum required duration of 1,200 hours per year. For example, the minimum daily schedule is 4 hours, the minimum weekly schedule is 24 hours, and the minimum monthly schedule is 100 hours.</p>\\n         <p>After you find a schedule that meets your needs, call <a>PurchaseScheduledInstances</a>\\n         to purchase Scheduled Instances with that schedule.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"ScheduledInstanceAvailabilitySet\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeScheduledInstanceAvailabilityMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 5,\n                    \"max\": 300\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeScheduledInstanceAvailabilityRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>availability-zone</code> - The Availability Zone (for example, <code>us-west-2a</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>instance-type</code> - The instance type (for example, <code>c4.large</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>platform</code> - The platform (<code>Linux/UNIX</code> or <code>Windows</code>).</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"FirstSlotStartTimeRange\": {\n                    \"target\": \"com.amazonaws.ec2#SlotDateTimeRangeRequest\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The time period for the first schedule to start.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#DescribeScheduledInstanceAvailabilityMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return in a single call. \\n         This value can be between 5 and 300. The default value is 300.\\n         To retrieve the remaining results, make another call with the returned\\n         <code>NextToken</code> value.</p>\"\n                    }\n                },\n                \"MaxSlotDurationInHours\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum available duration, in hours. This value must be greater than <code>MinSlotDurationInHours</code>\\n         and less than 1,720.</p>\"\n                    }\n                },\n                \"MinSlotDurationInHours\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The minimum available duration, in hours. The minimum required duration is 1,200 hours per year. For example, the minimum daily schedule is 4 hours, the minimum weekly schedule is 24 hours, and the minimum monthly schedule is 100 hours.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next set of results.</p>\"\n                    }\n                },\n                \"Recurrence\": {\n                    \"target\": \"com.amazonaws.ec2#ScheduledInstanceRecurrenceRequest\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The schedule recurrence.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the parameters for DescribeScheduledInstanceAvailability.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeScheduledInstanceAvailabilityResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token required to retrieve the next set of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                },\n                \"ScheduledInstanceAvailabilitySet\": {\n                    \"target\": \"com.amazonaws.ec2#ScheduledInstanceAvailabilitySet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ScheduledInstanceAvailabilitySet\",\n                        \"smithy.api#documentation\": \"<p>Information about the available Scheduled Instances.</p>\",\n                        \"smithy.api#xmlName\": \"scheduledInstanceAvailabilitySet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the output of DescribeScheduledInstanceAvailability.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeScheduledInstances\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeScheduledInstancesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeScheduledInstancesResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the specified Scheduled Instances or all your Scheduled Instances.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"ScheduledInstanceSet\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeScheduledInstancesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>availability-zone</code> - The Availability Zone (for example, <code>us-west-2a</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>instance-type</code> - The instance type (for example, <code>c4.large</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>platform</code> - The platform (<code>Linux/UNIX</code> or <code>Windows</code>).</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return in a single call. \\n         This value can be between 5 and 300. The default value is 100.\\n         To retrieve the remaining results, make another call with the returned\\n         <code>NextToken</code> value.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next set of results.</p>\"\n                    }\n                },\n                \"ScheduledInstanceIds\": {\n                    \"target\": \"com.amazonaws.ec2#ScheduledInstanceIdRequestSet\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Scheduled Instance IDs.</p>\",\n                        \"smithy.api#xmlName\": \"ScheduledInstanceId\"\n                    }\n                },\n                \"SlotStartTimeRange\": {\n                    \"target\": \"com.amazonaws.ec2#SlotStartTimeRangeRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time period for the first schedule to start.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the parameters for DescribeScheduledInstances.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeScheduledInstancesResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token required to retrieve the next set of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                },\n                \"ScheduledInstanceSet\": {\n                    \"target\": \"com.amazonaws.ec2#ScheduledInstanceSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ScheduledInstanceSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the Scheduled Instances.</p>\",\n                        \"smithy.api#xmlName\": \"scheduledInstanceSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the output of DescribeScheduledInstances.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeSecurityGroupReferences\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeSecurityGroupReferencesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeSecurityGroupReferencesResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the VPCs on the other side of a VPC peering or Transit Gateway connection that are referencing the security groups you've specified in this request.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To describe security group references\",\n                        \"documentation\": \"This example describes the security group references for the specified security group.\",\n                        \"input\": {\n                            \"GroupId\": [\n                                \"sg-903004f8\"\n                            ]\n                        },\n                        \"output\": {\n                            \"SecurityGroupReferenceSet\": [\n                                {\n                                    \"ReferencingVpcId\": \"vpc-1a2b3c4d\",\n                                    \"GroupId\": \"sg-903004f8\",\n                                    \"VpcPeeringConnectionId\": \"pcx-b04deed9\"\n                                }\n                            ]\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#DescribeSecurityGroupReferencesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"GroupId\": {\n                    \"target\": \"com.amazonaws.ec2#GroupIds\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The IDs of the security groups in your account.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeSecurityGroupReferencesResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SecurityGroupReferenceSet\": {\n                    \"target\": \"com.amazonaws.ec2#SecurityGroupReferences\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SecurityGroupReferenceSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the VPCs with the referencing security groups.</p>\",\n                        \"smithy.api#xmlName\": \"securityGroupReferenceSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeSecurityGroupRules\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeSecurityGroupRulesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeSecurityGroupRulesResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes one or more of your security group rules.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"SecurityGroupRules\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeSecurityGroupRulesMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 5,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeSecurityGroupRulesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>group-id</code> - The ID of the security group.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>security-group-rule-id</code> - The ID of the security group rule.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag</code>:<key> - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\\n    For example, to find all resources that have a tag with the key <code>Owner</code> and the value <code>TeamA</code>, specify <code>tag:Owner</code> for the filter name and <code>TeamA</code> for the filter value.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"SecurityGroupRuleIds\": {\n                    \"target\": \"com.amazonaws.ec2#SecurityGroupRuleIdList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the security group rules.</p>\",\n                        \"smithy.api#xmlName\": \"SecurityGroupRuleId\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token returned from a previous paginated request.\\n            Pagination continues from the end of the items returned by the previous request.</p>\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#DescribeSecurityGroupRulesMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of items to return for this request. To get the next page of \\n            items, make another request with the token returned in the output. This value\\n            can be between 5 and 1000. If this parameter is not specified, then all items are\\n            returned. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Query-Requests.html#api-pagination\\\">Pagination</a>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeSecurityGroupRulesResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SecurityGroupRules\": {\n                    \"target\": \"com.amazonaws.ec2#SecurityGroupRuleList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SecurityGroupRuleSet\",\n                        \"smithy.api#documentation\": \"<p>Information about security group rules.</p>\",\n                        \"smithy.api#xmlName\": \"securityGroupRuleSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to include in another request to get the next page of items. \\n            This value is <code>null</code> when there are no more items to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeSecurityGroupVpcAssociations\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeSecurityGroupVpcAssociationsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeSecurityGroupVpcAssociationsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes security group VPC associations made with <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_AssociateSecurityGroupVpc.html\\\">AssociateSecurityGroupVpc</a>.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"SecurityGroupVpcAssociations\",\n                    \"pageSize\": \"MaxResults\"\n                },\n                \"smithy.waiters#waitable\": {\n                    \"SecurityGroupVpcAssociationAssociated\": {\n                        \"acceptors\": [\n                            {\n                                \"state\": \"success\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"SecurityGroupVpcAssociations[].State\",\n                                        \"expected\": \"associated\",\n                                        \"comparator\": \"allStringEquals\"\n                                    }\n                                }\n                            },\n                            {\n                                \"state\": \"retry\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"SecurityGroupVpcAssociations[].State\",\n                                        \"expected\": \"associating\",\n                                        \"comparator\": \"anyStringEquals\"\n                                    }\n                                }\n                            },\n                            {\n                                \"state\": \"failure\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"SecurityGroupVpcAssociations[].State\",\n                                        \"expected\": \"association-failed\",\n                                        \"comparator\": \"anyStringEquals\"\n                                    }\n                                }\n                            }\n                        ],\n                        \"minDelay\": 10\n                    },\n                    \"SecurityGroupVpcAssociationDisassociated\": {\n                        \"acceptors\": [\n                            {\n                                \"state\": \"success\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"SecurityGroupVpcAssociations[].State\",\n                                        \"expected\": \"disassociated\",\n                                        \"comparator\": \"allStringEquals\"\n                                    }\n                                }\n                            },\n                            {\n                                \"state\": \"retry\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"SecurityGroupVpcAssociations[].State\",\n                                        \"expected\": \"disassociating\",\n                                        \"comparator\": \"anyStringEquals\"\n                                    }\n                                }\n                            },\n                            {\n                                \"state\": \"failure\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"SecurityGroupVpcAssociations[].State\",\n                                        \"expected\": \"disassociation-failed\",\n                                        \"comparator\": \"anyStringEquals\"\n                                    }\n                                }\n                            },\n                            {\n                                \"state\": \"success\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"length(SecurityGroupVpcAssociations[]) == `0`\",\n                                        \"expected\": \"true\",\n                                        \"comparator\": \"booleanEquals\"\n                                    }\n                                }\n                            }\n                        ],\n                        \"minDelay\": 10\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeSecurityGroupVpcAssociationsMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 5,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeSecurityGroupVpcAssociationsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Security group VPC association filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>group-id</code>: The security group ID.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>group-owner-id</code>: The group owner ID.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>vpc-id</code>: The ID of the associated VPC.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>vpc-owner-id</code>: The account ID of the VPC owner.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>state</code>: The state of the association.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag:<key></code>: The key/value combination of a tag assigned to the resource. Use\\n                    the tag key in the filter name and the tag value as the filter value. For\\n                    example, to find all resources that have a tag with the key <code>Owner</code>\\n                    and the value <code>TeamA</code>, specify <code>tag:Owner</code> for the filter\\n                    name and <code>TeamA</code> for the filter value.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag-key</code>: The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token returned from a previous paginated request. Pagination continues from the end of the items returned by the previous request.</p>\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#DescribeSecurityGroupVpcAssociationsMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of items to return for this request.\\n\\tTo get the next page of items, make another request with the token returned in the output.\\n\\tFor more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Query-Requests.html#api-pagination\\\">Pagination</a>.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeSecurityGroupVpcAssociationsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SecurityGroupVpcAssociations\": {\n                    \"target\": \"com.amazonaws.ec2#SecurityGroupVpcAssociationList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SecurityGroupVpcAssociationSet\",\n                        \"smithy.api#documentation\": \"<p>The security group VPC associations.</p>\",\n                        \"smithy.api#xmlName\": \"securityGroupVpcAssociationSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to include in another request to get the next page of items. This value is <code>null</code> when there are no more items to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeSecurityGroups\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeSecurityGroupsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeSecurityGroupsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the specified security groups or all of your security groups.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To describe a security group\",\n                        \"documentation\": \"This example describes the specified security group.\",\n                        \"input\": {\n                            \"GroupIds\": [\n                                \"sg-903004f8\"\n                            ]\n                        },\n                        \"output\": {}\n                    },\n                    {\n                        \"title\": \"To describe a tagged security group\",\n                        \"documentation\": \"This example describes the security groups that include the specified tag (Purpose=test).\",\n                        \"input\": {\n                            \"Filters\": [\n                                {\n                                    \"Name\": \"tag:Purpose\",\n                                    \"Values\": [\n                                        \"test\"\n                                    ]\n                                }\n                            ]\n                        },\n                        \"output\": {}\n                    }\n                ],\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"SecurityGroups\",\n                    \"pageSize\": \"MaxResults\"\n                },\n                \"smithy.api#suppress\": [\n                    \"WaitableTraitInvalidErrorType\"\n                ],\n                \"smithy.waiters#waitable\": {\n                    \"SecurityGroupExists\": {\n                        \"acceptors\": [\n                            {\n                                \"state\": \"success\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"length(SecurityGroups[].GroupId) > `0`\",\n                                        \"expected\": \"true\",\n                                        \"comparator\": \"booleanEquals\"\n                                    }\n                                }\n                            },\n                            {\n                                \"state\": \"retry\",\n                                \"matcher\": {\n                                    \"errorType\": \"InvalidGroup.NotFound\"\n                                }\n                            }\n                        ],\n                        \"minDelay\": 5\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeSecurityGroupsMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 5,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeSecurityGroupsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"GroupIds\": {\n                    \"target\": \"com.amazonaws.ec2#GroupIdStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the security groups. Required for security groups in a nondefault VPC.</p>\\n         <p>Default: Describes all of your security groups.</p>\",\n                        \"smithy.api#xmlName\": \"GroupId\"\n                    }\n                },\n                \"GroupNames\": {\n                    \"target\": \"com.amazonaws.ec2#GroupNameStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>[Default VPC] The names of the security groups. You can specify either\\n\\t\\t\\tthe security group name or the security group ID.</p>\\n         <p>Default: Describes all of your security groups.</p>\",\n                        \"smithy.api#xmlName\": \"GroupName\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token returned from a previous paginated request.\\n            Pagination continues from the end of the items returned by the previous request.</p>\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#DescribeSecurityGroupsMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of items to return for this request. To get the next page of items,\\n            make another request with the token returned in the output. This value can be between 5 and 1000. \\n            If this parameter is not specified, then all items are returned. For more information, see \\n            <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Query-Requests.html#api-pagination\\\">Pagination</a>.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The filters. If using multiple filters for rules, the results include security groups for which any combination of rules - not necessarily a single rule - match all filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>description</code> - The description of the security group.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>egress.ip-permission.cidr</code> - An IPv4 CIDR block for an outbound\\n                    security group rule.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>egress.ip-permission.from-port</code> - For an outbound rule, the\\n                    start of port range for the TCP and UDP protocols, or an ICMP type\\n                    number.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>egress.ip-permission.group-id</code> - The ID of a security group\\n                    that has been referenced in an outbound security group rule.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>egress.ip-permission.group-name</code> - The name of a security group\\n                    that is referenced in an outbound security group rule.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>egress.ip-permission.ipv6-cidr</code> - An IPv6 CIDR block for an\\n                    outbound security group rule.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>egress.ip-permission.prefix-list-id</code> - The ID of a prefix list to which a security group rule allows outbound access.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>egress.ip-permission.protocol</code> - The IP protocol for an\\n                    outbound security group rule (<code>tcp</code> | <code>udp</code> |\\n                        <code>icmp</code>, a protocol number, or -1 for all protocols).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>egress.ip-permission.to-port</code> - For an outbound rule, the end\\n                    of port range for the TCP and UDP protocols, or an ICMP code.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>egress.ip-permission.user-id</code> - The ID of an Amazon Web Services account that\\n                    has been referenced in an outbound security group rule.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>group-id</code> - The ID of the security group. </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>group-name</code> - The name of the security group.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ip-permission.cidr</code> - An IPv4 CIDR block for an inbound security\\n                    group rule.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ip-permission.from-port</code> - For an inbound rule, the start of port\\n                    range for the TCP and UDP protocols, or an ICMP type number.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ip-permission.group-id</code> - The ID of a security group that has been\\n                    referenced in an inbound security group rule.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ip-permission.group-name</code> - The name of a security group that is\\n                    referenced in an inbound security group rule.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ip-permission.ipv6-cidr</code> - An IPv6 CIDR block for an inbound security\\n                    group rule.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ip-permission.prefix-list-id</code> - The ID of a prefix list from which a security group rule allows inbound access.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ip-permission.protocol</code> - The IP protocol for an inbound security\\n                group rule (<code>tcp</code> | <code>udp</code> | <code>icmp</code>, a\\n                protocol number, or -1 for all protocols).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ip-permission.to-port</code> - For an inbound rule, the end of port range\\n                    for the TCP and UDP protocols, or an ICMP code.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ip-permission.user-id</code> - The ID of an Amazon Web Services account that has been\\n                    referenced in an inbound security group rule.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>owner-id</code> - The Amazon Web Services account ID of the owner of the security group.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag</code>:<key> - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\\n    For example, to find all resources that have a tag with the key <code>Owner</code> and the value <code>TeamA</code>, specify <code>tag:Owner</code> for the filter name and <code>TeamA</code> for the filter value.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag-key</code> - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>vpc-id</code> - The ID of the VPC specified when the security group was created.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeSecurityGroupsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to include in another request to get the next page of items. This value is <code>null</code> when there are no more items to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                },\n                \"SecurityGroups\": {\n                    \"target\": \"com.amazonaws.ec2#SecurityGroupList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SecurityGroupInfo\",\n                        \"smithy.api#documentation\": \"<p>Information about the security groups.</p>\",\n                        \"smithy.api#xmlName\": \"securityGroupInfo\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeServiceLinkVirtualInterfaces\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeServiceLinkVirtualInterfacesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeServiceLinkVirtualInterfacesResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the Outpost service link virtual interfaces.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DescribeServiceLinkVirtualInterfacesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ServiceLinkVirtualInterfaceIds\": {\n                    \"target\": \"com.amazonaws.ec2#ServiceLinkVirtualInterfaceIdSet\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the service link virtual interfaces.</p>\",\n                        \"smithy.api#xmlName\": \"ServiceLinkVirtualInterfaceId\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The filters to use for narrowing down the request. The following filters are\\n         supported:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>outpost-lag-id</code> - The ID of the Outpost LAG.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>outpost-arn</code> - The Outpost ARN.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>owner-id</code> - The ID of the Amazon Web Services account that owns the service link virtual interface.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>state</code> - The  state of the Outpost LAG.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>vlan</code> - The ID of the address pool.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>service-link-virtual-interface-id</code> - The ID of the service link virtual interface.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>local-gateway-virtual-interface-id</code> - The ID of the local gateway virtual interface.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#ServiceLinkMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return with a single call.\\n\\tTo retrieve the remaining results, make another call with the returned <code>nextToken</code> value.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next page of results.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeServiceLinkVirtualInterfacesResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ServiceLinkVirtualInterfaces\": {\n                    \"target\": \"com.amazonaws.ec2#ServiceLinkVirtualInterfaceSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ServiceLinkVirtualInterfaceSet\",\n                        \"smithy.api#documentation\": \"<p>Describes the service link virtual interfaces.</p>\",\n                        \"smithy.api#xmlName\": \"serviceLinkVirtualInterfaceSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeSnapshotAttribute\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeSnapshotAttributeRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeSnapshotAttributeResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the specified attribute of the specified snapshot. You can specify only one\\n      attribute at a time.</p>\\n         <p>For more information about EBS snapshots, see <a href=\\\"https://docs.aws.amazon.com/ebs/latest/userguide/ebs-snapshots.html\\\">Amazon EBS snapshots</a> in the <i>Amazon EBS User Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To describe snapshot attributes\",\n                        \"documentation\": \"This example describes the ``createVolumePermission`` attribute on a snapshot with the snapshot ID of ``snap-066877671789bd71b``.\",\n                        \"input\": {\n                            \"SnapshotId\": \"snap-066877671789bd71b\",\n                            \"Attribute\": \"createVolumePermission\"\n                        },\n                        \"output\": {\n                            \"SnapshotId\": \"snap-066877671789bd71b\",\n                            \"CreateVolumePermissions\": []\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#DescribeSnapshotAttributeRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Attribute\": {\n                    \"target\": \"com.amazonaws.ec2#SnapshotAttributeName\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The snapshot attribute you would like to view.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"SnapshotId\": {\n                    \"target\": \"com.amazonaws.ec2#SnapshotId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the EBS snapshot.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeSnapshotAttributeResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ProductCodes\": {\n                    \"target\": \"com.amazonaws.ec2#ProductCodeList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ProductCodes\",\n                        \"smithy.api#documentation\": \"<p>The product codes.</p>\",\n                        \"smithy.api#xmlName\": \"productCodes\"\n                    }\n                },\n                \"SnapshotId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SnapshotId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the EBS snapshot.</p>\",\n                        \"smithy.api#xmlName\": \"snapshotId\"\n                    }\n                },\n                \"CreateVolumePermissions\": {\n                    \"target\": \"com.amazonaws.ec2#CreateVolumePermissionList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CreateVolumePermission\",\n                        \"smithy.api#documentation\": \"<p>The users and groups that have the permissions for creating volumes from the\\n      snapshot.</p>\",\n                        \"smithy.api#xmlName\": \"createVolumePermission\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeSnapshotTierStatus\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeSnapshotTierStatusRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeSnapshotTierStatusResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the storage tier status of one or more Amazon EBS snapshots.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"SnapshotTierStatuses\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeSnapshotTierStatusMaxResults\": {\n            \"type\": \"integer\"\n        },\n        \"com.amazonaws.ec2#DescribeSnapshotTierStatusRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>snapshot-id</code> - The snapshot ID.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>volume-id</code> - The ID of the volume the snapshot is for.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>last-tiering-operation</code> - The state of the last archive or restore action. (<code>archival-in-progress</code> | <code>archival-completed</code> |\\n          <code>archival-failed</code> | <code>permanent-restore-in-progress</code> | <code>permanent-restore-completed</code> | <code>permanent-restore-failed</code> | \\n\\t\\t<code>temporary-restore-in-progress</code> | <code>temporary-restore-completed</code> | <code>temporary-restore-failed</code>)</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token returned from a previous paginated request.\\n  Pagination continues from the end of the items returned by the previous request.</p>\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#DescribeSnapshotTierStatusMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of items to return for this request.\\n\\tTo get the next page of items, make another request with the token returned in the output. \\n\\tFor more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Query-Requests.html#api-pagination\\\">Pagination</a>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeSnapshotTierStatusResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SnapshotTierStatuses\": {\n                    \"target\": \"com.amazonaws.ec2#snapshotTierStatusSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SnapshotTierStatusSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the snapshot's storage tier.</p>\",\n                        \"smithy.api#xmlName\": \"snapshotTierStatusSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to include in another request to get the next page of items. \\n  This value is <code>null</code> when there are no more items to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeSnapshots\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeSnapshotsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeSnapshotsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the specified EBS snapshots available to you or all of the EBS snapshots\\n      available to you.</p>\\n         <p>The snapshots available to you include public snapshots, private snapshots that you own,\\n      and private snapshots owned by other Amazon Web Services accounts for which you have explicit create volume\\n      permissions.</p>\\n         <p>The create volume permissions fall into the following categories:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <i>public</i>: The owner of the snapshot granted create volume\\n          permissions for the snapshot to the <code>all</code> group. All Amazon Web Services accounts have create\\n          volume permissions for these snapshots.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <i>explicit</i>: The owner of the snapshot granted create volume\\n          permissions to a specific Amazon Web Services account.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <i>implicit</i>: An Amazon Web Services account has implicit create volume permissions\\n          for all snapshots it owns.</p>\\n            </li>\\n         </ul>\\n         <p>The list of snapshots returned can be filtered by specifying snapshot IDs, snapshot\\n      owners, or Amazon Web Services accounts with create volume permissions. If no options are specified, \\n      Amazon EC2 returns all snapshots for which you have create volume permissions.</p>\\n         <p>If you specify one or more snapshot IDs, only snapshots that have the specified IDs are\\n      returned. If you specify an invalid snapshot ID, an error is returned. If you specify a\\n      snapshot ID for which you do not have access, it is not included in the returned\\n      results.</p>\\n         <p>If you specify one or more snapshot owners using the <code>OwnerIds</code> option, only\\n      snapshots from the specified owners and for which you have access are returned. The results\\n      can include the Amazon Web Services account IDs of the specified owners, <code>amazon</code> for snapshots\\n      owned by Amazon, or <code>self</code> for snapshots that you own.</p>\\n         <p>If you specify a list of restorable users, only snapshots with create snapshot permissions\\n      for those users are returned. You can specify Amazon Web Services account IDs (if you own the snapshots),\\n        <code>self</code> for snapshots for which you own or have explicit permissions, or\\n        <code>all</code> for public snapshots.</p>\\n         <p>If you are describing a long list of snapshots, we recommend that you paginate the output to make the\\n      list more manageable. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Query-Requests.html#api-pagination\\\">Pagination</a>.</p>\\n         <p>For more information about EBS snapshots, see <a href=\\\"https://docs.aws.amazon.com/ebs/latest/userguide/ebs-snapshots.html\\\">Amazon EBS snapshots</a> in the <i>Amazon EBS User Guide</i>.</p>\\n         <important>\\n            <p>We strongly recommend using only paginated requests. Unpaginated requests are\\n        susceptible to throttling and timeouts.</p>\\n         </important>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To describe a snapshot\",\n                        \"documentation\": \"This example describes a snapshot with the snapshot ID of ``snap-1234567890abcdef0``.\",\n                        \"input\": {\n                            \"SnapshotIds\": [\n                                \"snap-1234567890abcdef0\"\n                            ]\n                        },\n                        \"output\": {\n                            \"Snapshots\": [\n                                {\n                                    \"Description\": \"This is my snapshot.\",\n                                    \"VolumeId\": \"vol-049df61146c4d7901\",\n                                    \"State\": \"completed\",\n                                    \"VolumeSize\": 8,\n                                    \"Progress\": \"100%\",\n                                    \"StartTime\": \"2014-02-28T21:28:32.000Z\",\n                                    \"SnapshotId\": \"snap-1234567890abcdef0\",\n                                    \"OwnerId\": \"012345678910\"\n                                }\n                            ],\n                            \"NextToken\": \"\"\n                        }\n                    },\n                    {\n                        \"title\": \"To describe snapshots using filters\",\n                        \"documentation\": \"This example describes all snapshots owned by the ID 012345678910 that are in the ``pending`` status.\",\n                        \"input\": {\n                            \"OwnerIds\": [\n                                \"012345678910\"\n                            ],\n                            \"Filters\": [\n                                {\n                                    \"Values\": [\n                                        \"pending\"\n                                    ],\n                                    \"Name\": \"status\"\n                                }\n                            ]\n                        },\n                        \"output\": {\n                            \"Snapshots\": [\n                                {\n                                    \"Description\": \"This is my copied snapshot.\",\n                                    \"VolumeId\": \"vol-1234567890abcdef0\",\n                                    \"State\": \"pending\",\n                                    \"VolumeSize\": 8,\n                                    \"Progress\": \"87%\",\n                                    \"StartTime\": \"2014-02-28T21:37:27.000Z\",\n                                    \"SnapshotId\": \"snap-066877671789bd71b\",\n                                    \"OwnerId\": \"012345678910\"\n                                }\n                            ],\n                            \"NextToken\": \"\"\n                        }\n                    }\n                ],\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"Snapshots\",\n                    \"pageSize\": \"MaxResults\"\n                },\n                \"smithy.waiters#waitable\": {\n                    \"SnapshotCompleted\": {\n                        \"acceptors\": [\n                            {\n                                \"state\": \"success\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"Snapshots[].State\",\n                                        \"expected\": \"completed\",\n                                        \"comparator\": \"allStringEquals\"\n                                    }\n                                }\n                            },\n                            {\n                                \"state\": \"failure\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"Snapshots[].State\",\n                                        \"expected\": \"error\",\n                                        \"comparator\": \"anyStringEquals\"\n                                    }\n                                }\n                            }\n                        ],\n                        \"minDelay\": 15\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeSnapshotsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of items to return for this request.\\n\\tTo get the next page of items, make another request with the token returned in the output. \\n\\tFor more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Query-Requests.html#api-pagination\\\">Pagination</a>.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token returned from a previous paginated request.\\n  Pagination continues from the end of the items returned by the previous request.</p>\"\n                    }\n                },\n                \"OwnerIds\": {\n                    \"target\": \"com.amazonaws.ec2#OwnerStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Scopes the results to snapshots with the specified owners. You can specify a combination of\\n      Amazon Web Services account IDs, <code>self</code>, and <code>amazon</code>.</p>\",\n                        \"smithy.api#xmlName\": \"Owner\"\n                    }\n                },\n                \"RestorableByUserIds\": {\n                    \"target\": \"com.amazonaws.ec2#RestorableByStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the Amazon Web Services accounts that can create volumes from the snapshot.</p>\",\n                        \"smithy.api#xmlName\": \"RestorableBy\"\n                    }\n                },\n                \"SnapshotIds\": {\n                    \"target\": \"com.amazonaws.ec2#SnapshotIdStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The snapshot IDs.</p>\\n         <p>Default: Describes the snapshots for which you have create volume permissions.</p>\",\n                        \"smithy.api#xmlName\": \"SnapshotId\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>description</code> - A description of the snapshot.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>encrypted</code> - Indicates whether the snapshot is encrypted\\n            (<code>true</code> | <code>false</code>)</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>owner-alias</code> - The owner alias, from an Amazon-maintained list  \\n          (<code>amazon</code>). \\n          This is not the user-configured Amazon Web Services account alias set using the IAM console.\\n          We recommend that you use the related parameter instead of this filter.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>owner-id</code> - The Amazon Web Services account ID of the owner. We recommend that \\n          you use the related parameter instead of this filter.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>progress</code> - The progress of the snapshot, as a percentage (for example,\\n          80%).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>snapshot-id</code> - The snapshot ID.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>start-time</code> - The time stamp when the snapshot was initiated.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>status</code> - The status of the snapshot (<code>pending</code> |\\n            <code>completed</code> | <code>error</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>storage-tier</code> - The storage tier of the snapshot (<code>archive</code> |\\n          <code>standard</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>transfer-type</code> - The type of operation used to create the snapshot (<code>time-based</code> | <code>standard</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag</code>:<key> - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\\n    For example, to find all resources that have a tag with the key <code>Owner</code> and the value <code>TeamA</code>, specify <code>tag:Owner</code> for the filter name and <code>TeamA</code> for the filter value.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag-key</code> - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>volume-id</code> - The ID of the volume the snapshot is for.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>volume-size</code> - The size of the volume, in GiB.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeSnapshotsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to include in another request to get the next page of items. \\n  This value is <code>null</code> when there are no more items to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                },\n                \"Snapshots\": {\n                    \"target\": \"com.amazonaws.ec2#SnapshotList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SnapshotSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the snapshots.</p>\",\n                        \"smithy.api#xmlName\": \"snapshotSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeSpotDatafeedSubscription\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeSpotDatafeedSubscriptionRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeSpotDatafeedSubscriptionResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the data feed for Spot Instances. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-data-feeds.html\\\">Spot\\n            Instance data feed</a> in the <i>Amazon EC2 User Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To describe the datafeed for your AWS account\",\n                        \"documentation\": \"This example describes the Spot Instance datafeed subscription for your AWS account.\",\n                        \"output\": {\n                            \"SpotDatafeedSubscription\": {\n                                \"OwnerId\": \"123456789012\",\n                                \"Prefix\": \"spotdata\",\n                                \"Bucket\": \"my-s3-bucket\",\n                                \"State\": \"Active\"\n                            }\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#DescribeSpotDatafeedSubscriptionRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually\\n            making the request, and provides an error response. If you have the required\\n            permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is\\n            <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the parameters for DescribeSpotDatafeedSubscription.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeSpotDatafeedSubscriptionResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SpotDatafeedSubscription\": {\n                    \"target\": \"com.amazonaws.ec2#SpotDatafeedSubscription\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SpotDatafeedSubscription\",\n                        \"smithy.api#documentation\": \"<p>The Spot Instance data feed subscription.</p>\",\n                        \"smithy.api#xmlName\": \"spotDatafeedSubscription\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the output of DescribeSpotDatafeedSubscription.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeSpotFleetInstances\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeSpotFleetInstancesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeSpotFleetInstancesResponse\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the running instances for the specified Spot Fleet.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To describe the Spot Instances associated with a Spot fleet\",\n                        \"documentation\": \"This example lists the Spot Instances associated with the specified Spot fleet.\",\n                        \"input\": {\n                            \"SpotFleetRequestId\": \"sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE\"\n                        },\n                        \"output\": {\n                            \"SpotFleetRequestId\": \"sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE\",\n                            \"ActiveInstances\": [\n                                {\n                                    \"InstanceId\": \"i-1234567890abcdef0\",\n                                    \"InstanceType\": \"m3.medium\",\n                                    \"SpotInstanceRequestId\": \"sir-08b93456\"\n                                }\n                            ]\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#DescribeSpotFleetInstancesMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeSpotFleetInstancesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually\\n            making the request, and provides an error response. If you have the required\\n            permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is\\n                <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"SpotFleetRequestId\": {\n                    \"target\": \"com.amazonaws.ec2#SpotFleetRequestId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SpotFleetRequestId\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the Spot Fleet request.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"spotFleetRequestId\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to include in another request to get the next page of items. This value is <code>null</code> when there\\n         are no more items to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#DescribeSpotFleetInstancesMaxResults\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MaxResults\",\n                        \"smithy.api#documentation\": \"<p>The maximum number of items to return for this request.\\n         To get the next page of items, make another request with the token returned in the output.\\n\\t        For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Query-Requests.html#api-pagination\\\">Pagination</a>.</p>\",\n                        \"smithy.api#xmlName\": \"maxResults\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the parameters for DescribeSpotFleetInstances.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeSpotFleetInstancesResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ActiveInstances\": {\n                    \"target\": \"com.amazonaws.ec2#ActiveInstanceSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ActiveInstanceSet\",\n                        \"smithy.api#documentation\": \"<p>The running instances. This list is refreshed periodically and might be out of\\n            date.</p>\",\n                        \"smithy.api#xmlName\": \"activeInstanceSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to include in another request to get the next page of items. This value is <code>null</code> when there\\n         are no more items to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                },\n                \"SpotFleetRequestId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SpotFleetRequestId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Spot Fleet request.</p>\",\n                        \"smithy.api#xmlName\": \"spotFleetRequestId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the output of DescribeSpotFleetInstances.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeSpotFleetRequestHistory\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeSpotFleetRequestHistoryRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeSpotFleetRequestHistoryResponse\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the events for the specified Spot Fleet request during the specified\\n            time.</p>\\n         <p>Spot Fleet events are delayed by up to 30 seconds before they can be described. This\\n            ensures that you can query by the last evaluated time and not miss a recorded event.\\n            Spot Fleet events are available for 48 hours.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/fleet-monitor.html\\\">Monitor fleet events using Amazon\\n                EventBridge</a> in the <i>Amazon EC2 User Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To describe Spot fleet history\",\n                        \"documentation\": \"This example returns the history for the specified Spot fleet starting at the specified time.\",\n                        \"input\": {\n                            \"SpotFleetRequestId\": \"sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE\",\n                            \"StartTime\": \"2015-05-26T00:00:00Z\"\n                        },\n                        \"output\": {\n                            \"HistoryRecords\": [\n                                {\n                                    \"Timestamp\": \"2015-05-26T23:17:20.697Z\",\n                                    \"EventInformation\": {\n                                        \"EventSubType\": \"submitted\"\n                                    },\n                                    \"EventType\": \"fleetRequestChange\"\n                                },\n                                {\n                                    \"Timestamp\": \"2015-05-26T23:17:20.873Z\",\n                                    \"EventInformation\": {\n                                        \"EventSubType\": \"active\"\n                                    },\n                                    \"EventType\": \"fleetRequestChange\"\n                                },\n                                {\n                                    \"Timestamp\": \"2015-05-26T23:21:21.712Z\",\n                                    \"EventInformation\": {\n                                        \"InstanceId\": \"i-1234567890abcdef0\",\n                                        \"EventSubType\": \"launched\"\n                                    },\n                                    \"EventType\": \"instanceChange\"\n                                },\n                                {\n                                    \"Timestamp\": \"2015-05-26T23:21:21.816Z\",\n                                    \"EventInformation\": {\n                                        \"InstanceId\": \"i-1234567890abcdef1\",\n                                        \"EventSubType\": \"launched\"\n                                    },\n                                    \"EventType\": \"instanceChange\"\n                                }\n                            ],\n                            \"SpotFleetRequestId\": \"sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE\",\n                            \"StartTime\": \"2015-05-26T00:00:00Z\",\n                            \"NextToken\": \"CpHNsscimcV5oH7bSbub03CI2Qms5+ypNpNm+53MNlR0YcXAkp0xFlfKf91yVxSExmbtma3awYxMFzNA663ZskT0AHtJ6TCb2Z8bQC2EnZgyELbymtWPfpZ1ZbauVg+P+TfGlWxWWB/Vr5dk5d4LfdgA/DRAHUrYgxzrEXAMPLE=\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#DescribeSpotFleetRequestHistoryMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeSpotFleetRequestHistoryRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually\\n            making the request, and provides an error response. If you have the required\\n            permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is\\n                <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"SpotFleetRequestId\": {\n                    \"target\": \"com.amazonaws.ec2#SpotFleetRequestId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SpotFleetRequestId\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the Spot Fleet request.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"spotFleetRequestId\"\n                    }\n                },\n                \"EventType\": {\n                    \"target\": \"com.amazonaws.ec2#EventType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EventType\",\n                        \"smithy.api#documentation\": \"<p>The type of events to describe. By default, all events are described.</p>\",\n                        \"smithy.api#xmlName\": \"eventType\"\n                    }\n                },\n                \"StartTime\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"StartTime\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The starting date and time for the events, in UTC format (for example,\\n                <i>YYYY</i>-<i>MM</i>-<i>DD</i>T<i>HH</i>:<i>MM</i>:<i>SS</i>Z).</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"startTime\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to include in another request to get the next page of items. This value is <code>null</code> when there\\n         are no more items to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#DescribeSpotFleetRequestHistoryMaxResults\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MaxResults\",\n                        \"smithy.api#documentation\": \"<p>The maximum number of items to return for this request.\\n         To get the next page of items, make another request with the token returned in the output.\\n\\t        For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Query-Requests.html#api-pagination\\\">Pagination</a>.</p>\",\n                        \"smithy.api#xmlName\": \"maxResults\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the parameters for DescribeSpotFleetRequestHistory.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeSpotFleetRequestHistoryResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"HistoryRecords\": {\n                    \"target\": \"com.amazonaws.ec2#HistoryRecords\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"HistoryRecordSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the events in the history of the Spot Fleet request.</p>\",\n                        \"smithy.api#xmlName\": \"historyRecordSet\"\n                    }\n                },\n                \"LastEvaluatedTime\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LastEvaluatedTime\",\n                        \"smithy.api#documentation\": \"<p>The last date and time for the events, in UTC format (for example,\\n                <i>YYYY</i>-<i>MM</i>-<i>DD</i>T<i>HH</i>:<i>MM</i>:<i>SS</i>Z).\\n            All records up to this time were retrieved.</p>\\n         <p>If <code>nextToken</code> indicates that there are more items, this value is not\\n            present.</p>\",\n                        \"smithy.api#xmlName\": \"lastEvaluatedTime\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to include in another request to get the next page of items. This value is <code>null</code> when there\\n         are no more items to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                },\n                \"SpotFleetRequestId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SpotFleetRequestId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Spot Fleet request.</p>\",\n                        \"smithy.api#xmlName\": \"spotFleetRequestId\"\n                    }\n                },\n                \"StartTime\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"StartTime\",\n                        \"smithy.api#documentation\": \"<p>The starting date and time for the events, in UTC format (for example,\\n                <i>YYYY</i>-<i>MM</i>-<i>DD</i>T<i>HH</i>:<i>MM</i>:<i>SS</i>Z).</p>\",\n                        \"smithy.api#xmlName\": \"startTime\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the output of DescribeSpotFleetRequestHistory.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeSpotFleetRequests\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeSpotFleetRequestsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeSpotFleetRequestsResponse\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes your Spot Fleet requests.</p>\\n         <p>Spot Fleet requests are deleted 48 hours after they are canceled and their instances\\n            are terminated.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To describe a Spot fleet request\",\n                        \"documentation\": \"This example describes the specified Spot fleet request.\",\n                        \"input\": {\n                            \"SpotFleetRequestIds\": [\n                                \"sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE\"\n                            ]\n                        },\n                        \"output\": {\n                            \"SpotFleetRequestConfigs\": [\n                                {\n                                    \"SpotFleetRequestId\": \"sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE\",\n                                    \"SpotFleetRequestConfig\": {\n                                        \"TargetCapacity\": 20,\n                                        \"LaunchSpecifications\": [\n                                            {\n                                                \"EbsOptimized\": false,\n                                                \"NetworkInterfaces\": [\n                                                    {\n                                                        \"SubnetId\": \"subnet-a61dafcf\",\n                                                        \"DeviceIndex\": 0,\n                                                        \"DeleteOnTermination\": false,\n                                                        \"AssociatePublicIpAddress\": true,\n                                                        \"SecondaryPrivateIpAddressCount\": 0\n                                                    }\n                                                ],\n                                                \"InstanceType\": \"cc2.8xlarge\",\n                                                \"ImageId\": \"ami-1a2b3c4d\"\n                                            },\n                                            {\n                                                \"EbsOptimized\": false,\n                                                \"NetworkInterfaces\": [\n                                                    {\n                                                        \"SubnetId\": \"subnet-a61dafcf\",\n                                                        \"DeviceIndex\": 0,\n                                                        \"DeleteOnTermination\": false,\n                                                        \"AssociatePublicIpAddress\": true,\n                                                        \"SecondaryPrivateIpAddressCount\": 0\n                                                    }\n                                                ],\n                                                \"InstanceType\": \"r3.8xlarge\",\n                                                \"ImageId\": \"ami-1a2b3c4d\"\n                                            }\n                                        ],\n                                        \"SpotPrice\": \"0.05\",\n                                        \"IamFleetRole\": \"arn:aws:iam::123456789012:role/my-spot-fleet-role\"\n                                    },\n                                    \"SpotFleetRequestState\": \"active\"\n                                }\n                            ]\n                        }\n                    }\n                ],\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"SpotFleetRequestConfigs\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeSpotFleetRequestsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually\\n            making the request, and provides an error response. If you have the required\\n            permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is\\n                <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"SpotFleetRequestIds\": {\n                    \"target\": \"com.amazonaws.ec2#SpotFleetRequestIdList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SpotFleetRequestId\",\n                        \"smithy.api#documentation\": \"<p>The IDs of the Spot Fleet requests.</p>\",\n                        \"smithy.api#xmlName\": \"spotFleetRequestId\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to include in another request to get the next page of items. This value is <code>null</code> when there\\n         are no more items to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MaxResults\",\n                        \"smithy.api#documentation\": \"<p>The maximum number of items to return for this request.\\n         To get the next page of items, make another request with the token returned in the output.\\n\\t        For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Query-Requests.html#api-pagination\\\">Pagination</a>.</p>\",\n                        \"smithy.api#xmlName\": \"maxResults\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the parameters for DescribeSpotFleetRequests.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeSpotFleetRequestsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to include in another request to get the next page of items. This value is <code>null</code> when there\\n         are no more items to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                },\n                \"SpotFleetRequestConfigs\": {\n                    \"target\": \"com.amazonaws.ec2#SpotFleetRequestConfigSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SpotFleetRequestConfigSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the configuration of your Spot Fleet.</p>\",\n                        \"smithy.api#xmlName\": \"spotFleetRequestConfigSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the output of DescribeSpotFleetRequests.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeSpotInstanceRequests\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeSpotInstanceRequestsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeSpotInstanceRequestsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the specified Spot Instance requests.</p>\\n         <p>You can use <code>DescribeSpotInstanceRequests</code> to find a running Spot Instance by\\n            examining the response. If the status of the Spot Instance is <code>fulfilled</code>, the\\n            instance ID appears in the response and contains the identifier of the instance.\\n            Alternatively, you can use <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeInstances\\\">DescribeInstances</a>\\n            with a filter to look for instances where the instance lifecycle is\\n            <code>spot</code>.</p>\\n         <p>We recommend that you set <code>MaxResults</code> to a value between 5 and 1000 to\\n            limit the number of items returned. This paginates the output, which makes the list\\n            more manageable and returns the items faster. If the list of items exceeds your\\n                <code>MaxResults</code> value, then that number of items is returned along with a\\n                <code>NextToken</code> value that can be passed to a subsequent\\n                <code>DescribeSpotInstanceRequests</code> request to retrieve the remaining\\n            items.</p>\\n         <p>Spot Instance requests are deleted four hours after they are canceled and their instances are\\n            terminated.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To describe a Spot Instance request\",\n                        \"documentation\": \"This example describes the specified Spot Instance request.\",\n                        \"input\": {\n                            \"SpotInstanceRequestIds\": [\n                                \"sir-08b93456\"\n                            ]\n                        },\n                        \"output\": {\n                            \"SpotInstanceRequests\": [\n                                {\n                                    \"Status\": {\n                                        \"UpdateTime\": \"2014-04-30T18:16:21.000Z\",\n                                        \"Code\": \"fulfilled\",\n                                        \"Message\": \"Your Spot request is fulfilled.\"\n                                    },\n                                    \"ProductDescription\": \"Linux/UNIX\",\n                                    \"InstanceId\": \"i-1234567890abcdef0\",\n                                    \"SpotInstanceRequestId\": \"sir-08b93456\",\n                                    \"State\": \"active\",\n                                    \"LaunchedAvailabilityZone\": \"us-west-1b\",\n                                    \"LaunchSpecification\": {\n                                        \"ImageId\": \"ami-7aba833f\",\n                                        \"KeyName\": \"my-key-pair\",\n                                        \"BlockDeviceMappings\": [\n                                            {\n                                                \"DeviceName\": \"/dev/sda1\",\n                                                \"Ebs\": {\n                                                    \"DeleteOnTermination\": true,\n                                                    \"VolumeType\": \"standard\",\n                                                    \"VolumeSize\": 8\n                                                }\n                                            }\n                                        ],\n                                        \"EbsOptimized\": false,\n                                        \"SecurityGroups\": [\n                                            {\n                                                \"GroupName\": \"my-security-group\",\n                                                \"GroupId\": \"sg-e38f24a7\"\n                                            }\n                                        ],\n                                        \"InstanceType\": \"m1.small\"\n                                    },\n                                    \"Type\": \"one-time\",\n                                    \"CreateTime\": \"2014-04-30T18:14:55.000Z\",\n                                    \"SpotPrice\": \"0.010000\"\n                                }\n                            ]\n                        }\n                    }\n                ],\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"SpotInstanceRequests\",\n                    \"pageSize\": \"MaxResults\"\n                },\n                \"smithy.api#suppress\": [\n                    \"WaitableTraitInvalidErrorType\"\n                ],\n                \"smithy.waiters#waitable\": {\n                    \"SpotInstanceRequestFulfilled\": {\n                        \"acceptors\": [\n                            {\n                                \"state\": \"success\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"SpotInstanceRequests[].Status.Code\",\n                                        \"expected\": \"fulfilled\",\n                                        \"comparator\": \"allStringEquals\"\n                                    }\n                                }\n                            },\n                            {\n                                \"state\": \"success\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"SpotInstanceRequests[].Status.Code\",\n                                        \"expected\": \"request-canceled-and-instance-running\",\n                                        \"comparator\": \"allStringEquals\"\n                                    }\n                                }\n                            },\n                            {\n                                \"state\": \"failure\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"SpotInstanceRequests[].Status.Code\",\n                                        \"expected\": \"schedule-expired\",\n                                        \"comparator\": \"anyStringEquals\"\n                                    }\n                                }\n                            },\n                            {\n                                \"state\": \"failure\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"SpotInstanceRequests[].Status.Code\",\n                                        \"expected\": \"canceled-before-fulfillment\",\n                                        \"comparator\": \"anyStringEquals\"\n                                    }\n                                }\n                            },\n                            {\n                                \"state\": \"failure\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"SpotInstanceRequests[].Status.Code\",\n                                        \"expected\": \"bad-parameters\",\n                                        \"comparator\": \"anyStringEquals\"\n                                    }\n                                }\n                            },\n                            {\n                                \"state\": \"failure\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"SpotInstanceRequests[].Status.Code\",\n                                        \"expected\": \"system-error\",\n                                        \"comparator\": \"anyStringEquals\"\n                                    }\n                                }\n                            },\n                            {\n                                \"state\": \"retry\",\n                                \"matcher\": {\n                                    \"errorType\": \"InvalidSpotInstanceRequestID.NotFound\"\n                                }\n                            }\n                        ],\n                        \"minDelay\": 15\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeSpotInstanceRequestsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token returned from a previous paginated request. Pagination continues from the end of the items returned by the previous request.</p>\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of items to return for this request.\\n         To get the next page of items, make another request with the token returned in the output.\\n\\t        For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Query-Requests.html#api-pagination\\\">Pagination</a>.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually\\n            making the request, and provides an error response. If you have the required\\n            permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is\\n                <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"SpotInstanceRequestIds\": {\n                    \"target\": \"com.amazonaws.ec2#SpotInstanceRequestIdList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the Spot Instance requests.</p>\",\n                        \"smithy.api#xmlName\": \"SpotInstanceRequestId\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>availability-zone-group</code> - The Availability Zone group.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>create-time</code> - The time stamp when the Spot Instance request was\\n                    created.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>fault-code</code> - The fault code related to the request.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>fault-message</code> - The fault message related to the request.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>instance-id</code> - The ID of the instance that fulfilled the\\n                    request.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>launch-group</code> - The Spot Instance launch group.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>launch.block-device-mapping.delete-on-termination</code> - Indicates\\n                    whether the EBS volume is deleted on instance termination.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>launch.block-device-mapping.device-name</code> - The device name for the\\n                    volume in the block device mapping (for example, <code>/dev/sdh</code> or\\n                        <code>xvdh</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>launch.block-device-mapping.snapshot-id</code> - The ID of the snapshot\\n                    for the EBS volume.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>launch.block-device-mapping.volume-size</code> - The size of the EBS\\n                    volume, in GiB.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>launch.block-device-mapping.volume-type</code> - The type of EBS volume:\\n                    <code>gp2</code> or <code>gp3</code> for General Purpose SSD, <code>io1</code> \\n                    or <code>io2</code> for Provisioned IOPS SSD, <code>st1</code> for Throughput\\n                    Optimized HDD, <code>sc1</code> for Cold HDD, or <code>standard</code> for\\n                    Magnetic.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>launch.group-id</code> - The ID of the security group for the\\n                    instance.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>launch.group-name</code> - The name of the security group for the\\n                    instance.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>launch.image-id</code> - The ID of the AMI.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>launch.instance-type</code> - The type of instance (for example,\\n                        <code>m3.medium</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>launch.kernel-id</code> - The kernel ID.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>launch.key-name</code> - The name of the key pair the instance launched\\n                    with.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>launch.monitoring-enabled</code> - Whether detailed monitoring is\\n                    enabled for the Spot Instance.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>launch.ramdisk-id</code> - The RAM disk ID.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>launched-availability-zone</code> - The Availability Zone in which the\\n                    request is launched.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>launched-availability-zone-id</code> - The ID of the Availability Zone\\n                    in which the request is launched.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-interface.addresses.primary</code> - Indicates whether the IP\\n                    address is the primary private IP address.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-interface.delete-on-termination</code> - Indicates whether the\\n                    network interface is deleted when the instance is terminated.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-interface.description</code> - A description of the network\\n                    interface.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-interface.device-index</code> - The index of the device for the\\n                    network interface attachment on the instance.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-interface.group-id</code> - The ID of the security group\\n                    associated with the network interface.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-interface.network-interface-id</code> - The ID of the network\\n                    interface.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-interface.private-ip-address</code> - The primary private IP\\n                    address of the network interface.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-interface.subnet-id</code> - The ID of the subnet for the\\n                    instance.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>product-description</code> - The product description associated with the\\n                    instance (<code>Linux/UNIX</code> | <code>Windows</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>spot-instance-request-id</code> - The Spot Instance request ID.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>spot-price</code> - The maximum hourly price for any Spot Instance\\n                    launched to fulfill the request.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>state</code> - The state of the Spot Instance request (<code>open</code>\\n                    | <code>active</code> | <code>closed</code> | <code>cancelled</code> |\\n                        <code>failed</code>). Spot request status information can help you track\\n                    your Amazon EC2 Spot Instance requests. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-request-status.html\\\">Spot\\n                        request status</a> in the <i>Amazon EC2 User Guide</i>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>status-code</code> - The short code describing the most recent\\n                    evaluation of your Spot Instance request.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>status-message</code> - The message explaining the status of the Spot\\n                    Instance request.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag:<key></code> - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\\n    For example, to find all resources that have a tag with the key <code>Owner</code> and the value <code>TeamA</code>, specify <code>tag:Owner</code> for the filter name and <code>TeamA</code> for the filter value.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag-key</code> - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>type</code> - The type of Spot Instance request (<code>one-time</code> |\\n                        <code>persistent</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>valid-from</code> - The start date of the request.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>valid-until</code> - The end date of the request.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the parameters for DescribeSpotInstanceRequests.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeSpotInstanceRequestsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SpotInstanceRequests\": {\n                    \"target\": \"com.amazonaws.ec2#SpotInstanceRequestList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SpotInstanceRequestSet\",\n                        \"smithy.api#documentation\": \"<p>The Spot Instance requests.</p>\",\n                        \"smithy.api#xmlName\": \"spotInstanceRequestSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to include in another request to get the next page of items. This value is <code>null</code> when there\\n         are no more items to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the output of DescribeSpotInstanceRequests.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeSpotPriceHistory\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeSpotPriceHistoryRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeSpotPriceHistoryResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the Spot price history. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-spot-instances-history.html\\\">Spot Instance pricing history</a> in the\\n            <i>Amazon EC2 User Guide</i>.</p>\\n         <p>When you specify a start and end time, the operation returns the prices of the\\n            instance types within that time range. It also returns the last price change before the\\n            start time, which is the effective price as of the start time.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To describe Spot price history for Linux/UNIX (Amazon VPC)\",\n                        \"documentation\": \"This example returns the Spot Price history for m1.xlarge, Linux/UNIX (Amazon VPC) instances for a particular day in January.\",\n                        \"input\": {\n                            \"StartTime\": \"2014-01-06T07:08:09.05Z\",\n                            \"EndTime\": \"2014-01-06T08:09:10.05Z\",\n                            \"InstanceTypes\": [\n                                \"m1.xlarge\"\n                            ],\n                            \"ProductDescriptions\": [\n                                \"Linux/UNIX (Amazon VPC)\"\n                            ]\n                        },\n                        \"output\": {\n                            \"SpotPriceHistory\": [\n                                {\n                                    \"Timestamp\": \"2014-01-06T04:32:53.000Z\",\n                                    \"ProductDescription\": \"Linux/UNIX (Amazon VPC)\",\n                                    \"InstanceType\": \"m1.xlarge\",\n                                    \"SpotPrice\": \"0.080000\",\n                                    \"AvailabilityZone\": \"us-west-1a\"\n                                },\n                                {\n                                    \"Timestamp\": \"2014-01-05T11:28:26.000Z\",\n                                    \"ProductDescription\": \"Linux/UNIX (Amazon VPC)\",\n                                    \"InstanceType\": \"m1.xlarge\",\n                                    \"SpotPrice\": \"0.080000\",\n                                    \"AvailabilityZone\": \"us-west-1c\"\n                                }\n                            ]\n                        }\n                    }\n                ],\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"SpotPriceHistory\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeSpotPriceHistoryRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AvailabilityZoneId\": {\n                    \"target\": \"com.amazonaws.ec2#AvailabilityZoneId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Filters the results by the specified ID of the Availability Zone.</p>\\n         <p>Either <code>AvailabilityZone</code> or <code>AvailabilityZoneId</code> can be specified, but not both</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually\\n            making the request, and provides an error response. If you have the required\\n            permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is\\n            <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"StartTime\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"StartTime\",\n                        \"smithy.api#documentation\": \"<p>The date and time, up to the past 90 days, from which to start retrieving the price\\n            history data, in UTC format (for example,\\n            <i>YYYY</i>-<i>MM</i>-<i>DD</i>T<i>HH</i>:<i>MM</i>:<i>SS</i>Z).</p>\",\n                        \"smithy.api#xmlName\": \"startTime\"\n                    }\n                },\n                \"EndTime\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EndTime\",\n                        \"smithy.api#documentation\": \"<p>The date and time, up to the current date, from which to stop retrieving the price\\n            history data, in UTC format (for example,\\n            <i>YYYY</i>-<i>MM</i>-<i>DD</i>T<i>HH</i>:<i>MM</i>:<i>SS</i>Z).</p>\",\n                        \"smithy.api#xmlName\": \"endTime\"\n                    }\n                },\n                \"InstanceTypes\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceTypeList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Filters the results by the specified instance types.</p>\",\n                        \"smithy.api#xmlName\": \"InstanceType\"\n                    }\n                },\n                \"ProductDescriptions\": {\n                    \"target\": \"com.amazonaws.ec2#ProductDescriptionList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Filters the results by the specified basic product descriptions.</p>\",\n                        \"smithy.api#xmlName\": \"ProductDescription\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>availability-zone</code> - The Availability Zone for which prices should\\n                    be returned.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>availability-zone-id</code> - The ID of the Availability Zone for which\\n                    prices should be returned.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>instance-type</code> - The type of instance (for example,\\n                    <code>m3.medium</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>product-description</code> - The product description for the Spot price\\n                    (<code>Linux/UNIX</code> | <code>Red Hat Enterprise Linux</code> |\\n                    <code>SUSE Linux</code> | <code>Windows</code> | <code>Linux/UNIX (Amazon\\n                        VPC)</code> | <code>Red Hat Enterprise Linux (Amazon VPC)</code> |\\n                    <code>SUSE Linux (Amazon VPC)</code> | <code>Windows (Amazon\\n                        VPC)</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>spot-price</code> - The Spot price. The value must match exactly (or use\\n                    wildcards; greater than or less than comparison is not supported).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>timestamp</code> - The time stamp of the Spot price history, in UTC format\\n                    (for example, <i>ddd MMM dd\\n                        HH</i>:<i>mm</i>:<i>ss</i> UTC\\n                        <i>YYYY</i>). You can use wildcards (<code>*</code> and\\n                        <code>?</code>). Greater than or less than comparison is not\\n                    supported.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"AvailabilityZone\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AvailabilityZone\",\n                        \"smithy.api#documentation\": \"<p>Filters the results by the specified Availability Zone.</p>\\n         <p>Either <code>AvailabilityZone</code> or <code>AvailabilityZoneId</code> can be specified, but not both</p>\",\n                        \"smithy.api#xmlName\": \"availabilityZone\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MaxResults\",\n                        \"smithy.api#documentation\": \"<p>The maximum number of items to return for this request.\\n         To get the next page of items, make another request with the token returned in the output.\\n\\t        For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Query-Requests.html#api-pagination\\\">Pagination</a>.</p>\",\n                        \"smithy.api#xmlName\": \"maxResults\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token returned from a previous paginated request. Pagination continues from the end of the items returned by the previous request.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the parameters for DescribeSpotPriceHistory.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeSpotPriceHistoryResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to include in another request to get the next page of items. This value is\\n            an empty string (<code>\\\"\\\"</code>) or <code>null</code> when there are no more items to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                },\n                \"SpotPriceHistory\": {\n                    \"target\": \"com.amazonaws.ec2#SpotPriceHistoryList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SpotPriceHistorySet\",\n                        \"smithy.api#documentation\": \"<p>The historical Spot prices.</p>\",\n                        \"smithy.api#xmlName\": \"spotPriceHistorySet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the output of DescribeSpotPriceHistory.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeStaleSecurityGroups\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeStaleSecurityGroupsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeStaleSecurityGroupsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the stale security group rules for security groups referenced across a VPC\\n            peering connection, transit gateway connection, or with a security group VPC\\n            association. Rules are stale when they reference a deleted security group. Rules can\\n            also be stale if they reference a security group in a peer VPC for which the VPC peering\\n            connection has been deleted, across a transit gateway where the transit gateway has been\\n            deleted (or <a href=\\\"https://docs.aws.amazon.com/vpc/latest/tgw/tgw-vpc-attachments.html#vpc-attachment-security\\\">the transit\\n                gateway security group referencing feature</a> has been disabled), or if a\\n            security group VPC association has been disassociated.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"StaleSecurityGroupSet\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeStaleSecurityGroupsMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 5,\n                    \"max\": 255\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeStaleSecurityGroupsNextToken\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 1024\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeStaleSecurityGroupsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#DescribeStaleSecurityGroupsMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of items to return for this request. To get the next page of items,\\n          make another request with the token returned in the output. For more information, \\n          see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Query-Requests.html#api-pagination\\\">Pagination</a>.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#DescribeStaleSecurityGroupsNextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token returned from a previous paginated request. Pagination continues from the end of the items returned by the previous request.</p>\"\n                    }\n                },\n                \"VpcId\": {\n                    \"target\": \"com.amazonaws.ec2#VpcId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the VPC.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeStaleSecurityGroupsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to include in another request to get the next page of items. This value is <code>null</code> when there are no more items to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                },\n                \"StaleSecurityGroupSet\": {\n                    \"target\": \"com.amazonaws.ec2#StaleSecurityGroupSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"StaleSecurityGroupSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the stale security groups.</p>\",\n                        \"smithy.api#xmlName\": \"staleSecurityGroupSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeStoreImageTasks\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeStoreImageTasksRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeStoreImageTasksResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the progress of the AMI store tasks. You can describe the store tasks for\\n      specified AMIs. If you don't specify the AMIs, you get a paginated list of store tasks from\\n      the last 31 days.</p>\\n         <p>For each AMI task, the response indicates if the task is <code>InProgress</code>,\\n      <code>Completed</code>, or <code>Failed</code>. For tasks <code>InProgress</code>, the\\n      response shows the estimated progress as a percentage.</p>\\n         <p>Tasks are listed in reverse chronological order. Currently, only tasks from the past 31\\n      days can be viewed.</p>\\n         <p>To use this API, you must have the required permissions. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/work-with-ami-store-restore.html#ami-s3-permissions\\\">Permissions for storing and restoring AMIs using S3</a> in the\\n        <i>Amazon EC2 User Guide</i>.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ami-store-restore.html\\\">Store and restore an AMI using\\n        S3</a> in the <i>Amazon EC2 User Guide</i>.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"StoreImageTaskResults\",\n                    \"pageSize\": \"MaxResults\"\n                },\n                \"smithy.waiters#waitable\": {\n                    \"StoreImageTaskComplete\": {\n                        \"acceptors\": [\n                            {\n                                \"state\": \"success\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"StoreImageTaskResults[].StoreTaskState\",\n                                        \"expected\": \"Completed\",\n                                        \"comparator\": \"allStringEquals\"\n                                    }\n                                }\n                            },\n                            {\n                                \"state\": \"failure\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"StoreImageTaskResults[].StoreTaskState\",\n                                        \"expected\": \"Failed\",\n                                        \"comparator\": \"anyStringEquals\"\n                                    }\n                                }\n                            },\n                            {\n                                \"state\": \"retry\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"StoreImageTaskResults[].StoreTaskState\",\n                                        \"expected\": \"InProgress\",\n                                        \"comparator\": \"anyStringEquals\"\n                                    }\n                                }\n                            }\n                        ],\n                        \"minDelay\": 5\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeStoreImageTasksRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ImageIds\": {\n                    \"target\": \"com.amazonaws.ec2#ImageIdList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The AMI IDs for which to show progress. Up to 20 AMI IDs can be included in a\\n      request.</p>\",\n                        \"smithy.api#xmlName\": \"ImageId\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n\\t\\t\\tand provides an error response. If you have the required permissions, the error response is \\n\\t\\t\\t<code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>task-state</code> - Returns tasks in a certain state (<code>InProgress</code> |\\n          <code>Completed</code> | <code>Failed</code>)</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>bucket</code> - Returns task information for tasks that targeted a specific\\n          bucket. For the filter value, specify the bucket name.</p>\\n            </li>\\n         </ul>\\n         <note>\\n            <p>When you specify the <code>ImageIds</code> parameter, any filters that you specify are\\n        ignored. To use the filters, you must remove the <code>ImageIds</code> parameter.</p>\\n         </note>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token returned from a previous paginated request. Pagination continues from the end of the items returned by the previous request.</p>\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#DescribeStoreImageTasksRequestMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of items to return for this request.\\n         To get the next page of items, make another request with the token returned in the output.\\n\\t        For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Query-Requests.html#api-pagination\\\">Pagination</a>.</p>\\n         <p>You cannot specify this parameter and the <code>ImageIds</code> parameter in the same\\n      call.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeStoreImageTasksRequestMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 200\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeStoreImageTasksResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"StoreImageTaskResults\": {\n                    \"target\": \"com.amazonaws.ec2#StoreImageTaskResultSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"StoreImageTaskResultSet\",\n                        \"smithy.api#documentation\": \"<p>The information about the AMI store tasks.</p>\",\n                        \"smithy.api#xmlName\": \"storeImageTaskResultSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to include in another request to get the next page of items. This value is <code>null</code> when there\\n         are no more items to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeSubnets\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeSubnetsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeSubnetsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes your subnets. The default is to describe all your subnets. \\n          Alternatively, you can specify specific subnet IDs or filter the results to\\n          include only the subnets that match specific criteria.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/userguide/configure-subnets.html\\\">Subnets</a> in the\\n\\t\\t\\t\\t<i>Amazon VPC User Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To describe the subnets for a VPC\",\n                        \"documentation\": \"This example describes the subnets for the specified VPC.\",\n                        \"input\": {\n                            \"Filters\": [\n                                {\n                                    \"Name\": \"vpc-id\",\n                                    \"Values\": [\n                                        \"vpc-a01106c2\"\n                                    ]\n                                }\n                            ]\n                        },\n                        \"output\": {\n                            \"Subnets\": [\n                                {\n                                    \"VpcId\": \"vpc-a01106c2\",\n                                    \"CidrBlock\": \"10.0.1.0/24\",\n                                    \"MapPublicIpOnLaunch\": false,\n                                    \"DefaultForAz\": false,\n                                    \"State\": \"available\",\n                                    \"AvailabilityZone\": \"us-east-1c\",\n                                    \"SubnetId\": \"subnet-9d4a7b6c\",\n                                    \"AvailableIpAddressCount\": 251\n                                }\n                            ]\n                        }\n                    }\n                ],\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"Subnets\",\n                    \"pageSize\": \"MaxResults\"\n                },\n                \"smithy.waiters#waitable\": {\n                    \"SubnetAvailable\": {\n                        \"acceptors\": [\n                            {\n                                \"state\": \"success\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"Subnets[].State\",\n                                        \"expected\": \"available\",\n                                        \"comparator\": \"allStringEquals\"\n                                    }\n                                }\n                            }\n                        ],\n                        \"minDelay\": 15\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeSubnetsMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 5,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeSubnetsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>availability-zone</code> - The Availability Zone for the subnet. You can also use\\n                    <code>availabilityZone</code> as the filter name.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>availability-zone-id</code> - The ID of the Availability Zone for the subnet.\\n                    You can also use <code>availabilityZoneId</code> as the filter name.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>available-ip-address-count</code> - The number of IPv4 addresses in the\\n                    subnet that are available.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>cidr-block</code> - The IPv4 CIDR block of the subnet. The CIDR block\\n                    you specify must exactly match the subnet's CIDR block for information to be\\n                    returned for the subnet. You can also use <code>cidr</code> or\\n                        <code>cidrBlock</code> as the filter names.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>customer-owned-ipv4-pool</code> - The customer-owned IPv4 address pool\\n                    associated with the subnet.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>default-for-az</code> - Indicates whether this is the default subnet for\\n                    the Availability Zone (<code>true</code> | <code>false</code>). You can also use\\n                        <code>defaultForAz</code> as the filter name.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>enable-dns64</code> - Indicates whether DNS queries made to the\\n                    Amazon-provided DNS Resolver in this subnet should return synthetic IPv6\\n                    addresses for IPv4-only destinations.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>enable-lni-at-device-index</code> - Indicates the device position for\\n                    local network interfaces in this subnet. For example, <code>1</code> indicates\\n                    local network interfaces in this subnet are the secondary network interface\\n                    (eth1). </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ipv6-cidr-block-association.ipv6-cidr-block</code> - An IPv6 CIDR\\n                    block associated with the subnet.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ipv6-cidr-block-association.association-id</code> - An association ID\\n                    for an IPv6 CIDR block associated with the subnet.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ipv6-cidr-block-association.state</code> - The state of an IPv6 CIDR\\n                    block associated with the subnet.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ipv6-native</code> - Indicates whether this is an IPv6 only subnet\\n                        (<code>true</code> | <code>false</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>map-customer-owned-ip-on-launch</code> - Indicates whether a network\\n                    interface created in this subnet (including a network interface created by <a>RunInstances</a>) receives a customer-owned IPv4 address.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>map-public-ip-on-launch</code> - Indicates whether instances launched in\\n                    this subnet receive a public IPv4 address.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>outpost-arn</code> - The Amazon Resource Name (ARN) of the Outpost.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>owner-id</code> - The ID of the Amazon Web Services account that owns the\\n                    subnet.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>private-dns-name-options-on-launch.hostname-type</code> - The type of\\n                    hostname to assign to instances in the subnet at launch. For IPv4-only and\\n                    dual-stack (IPv4 and IPv6) subnets, an instance DNS name can be based on the\\n                    instance IPv4 address (ip-name) or the instance ID (resource-name). For IPv6\\n                    only subnets, an instance DNS name must be based on the instance ID\\n                    (resource-name).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>private-dns-name-options-on-launch.enable-resource-name-dns-a-record</code>\\n                    - Indicates whether to respond to DNS queries for instance hostnames with DNS A\\n                    records.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>private-dns-name-options-on-launch.enable-resource-name-dns-aaaa-record</code>\\n                    - Indicates whether to respond to DNS queries for instance hostnames with DNS\\n                    AAAA records.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>state</code> - The state of the subnet (<code>pending</code> | <code>available</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>subnet-arn</code> - The Amazon Resource Name (ARN) of the subnet.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>subnet-id</code> - The ID of the subnet.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag</code> - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\\n    For example, to find all resources that have a tag with the key <code>Owner</code> and the value <code>TeamA</code>, specify <code>tag:Owner</code> for the filter name and <code>TeamA</code> for the filter value.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag-key</code> - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>vpc-id</code> - The ID of the VPC for the subnet.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"SubnetIds\": {\n                    \"target\": \"com.amazonaws.ec2#SubnetIdStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the subnets.</p>\\n         <p>Default: Describes all your subnets.</p>\",\n                        \"smithy.api#xmlName\": \"SubnetId\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token returned from a previous paginated request. Pagination continues from the end of the items returned by the previous request.</p>\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#DescribeSubnetsMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of items to return for this request.\\n\\tTo get the next page of items, make another request with the token returned in the output.\\n\\tFor more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Query-Requests.html#api-pagination\\\">Pagination</a>.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeSubnetsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to include in another request to get the next page of items. This value is <code>null</code> when there are no more items to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                },\n                \"Subnets\": {\n                    \"target\": \"com.amazonaws.ec2#SubnetList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SubnetSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the subnets.</p>\",\n                        \"smithy.api#xmlName\": \"subnetSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeTags\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeTagsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeTagsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the specified tags for your EC2 resources.</p>\\n         <p>For more information about tags, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Tags.html\\\">Tag your Amazon EC2 resources</a> in the\\n            <i>Amazon Elastic Compute Cloud User Guide</i>.</p>\\n         <important>\\n            <p>We strongly recommend using only paginated requests. Unpaginated requests are\\n            susceptible to throttling and timeouts.</p>\\n         </important>\\n         <note>\\n            <p>The order of the elements in the response, including those within nested\\n            structures, might vary. Applications should not assume the elements appear in a\\n            particular order.</p>\\n         </note>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To describe the tags for a single resource\",\n                        \"documentation\": \"This example describes the tags for the specified instance.\",\n                        \"input\": {\n                            \"Filters\": [\n                                {\n                                    \"Name\": \"resource-id\",\n                                    \"Values\": [\n                                        \"i-1234567890abcdef8\"\n                                    ]\n                                }\n                            ]\n                        },\n                        \"output\": {\n                            \"Tags\": [\n                                {\n                                    \"ResourceType\": \"instance\",\n                                    \"ResourceId\": \"i-1234567890abcdef8\",\n                                    \"Value\": \"test\",\n                                    \"Key\": \"Stack\"\n                                },\n                                {\n                                    \"ResourceType\": \"instance\",\n                                    \"ResourceId\": \"i-1234567890abcdef8\",\n                                    \"Value\": \"Beta Server\",\n                                    \"Key\": \"Name\"\n                                }\n                            ]\n                        }\n                    }\n                ],\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"Tags\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeTagsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>key</code> - The tag key.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>resource-id</code> - The ID of the resource.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>resource-type</code> - The resource type. For a list of possible values, see \\n               <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_TagSpecification.html\\\">TagSpecification</a>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag</code>:<key> - The key/value combination of the tag. For example,\\n                specify \\\"tag:Owner\\\" for the filter name and \\\"TeamA\\\" for the filter value to find\\n                resources with the tag \\\"Owner=TeamA\\\".</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>value</code> - The tag value.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MaxResults\",\n                        \"smithy.api#documentation\": \"<p>The maximum number of items to return for this request. This value can be between 5 and 1000. \\n         To get the next page of items, make another request with the token returned in the output.\\n         For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Query-Requests.html#api-pagination\\\">Pagination</a>.</p>\",\n                        \"smithy.api#xmlName\": \"maxResults\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token returned from a previous paginated request.\\n         Pagination continues from the end of the items returned by the previous request.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeTagsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to include in another request to get the next page of items. \\n         This value is <code>null</code> when there are no more items to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagDescriptionList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>The tags.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeTrafficMirrorFilterRules\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeTrafficMirrorFilterRulesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeTrafficMirrorFilterRulesResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describe traffic mirror filters that determine the traffic that is mirrored.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DescribeTrafficMirrorFilterRulesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TrafficMirrorFilterRuleIds\": {\n                    \"target\": \"com.amazonaws.ec2#TrafficMirrorFilterRuleIdList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Traffic filter rule IDs.</p>\",\n                        \"smithy.api#xmlName\": \"TrafficMirrorFilterRuleId\"\n                    }\n                },\n                \"TrafficMirrorFilterId\": {\n                    \"target\": \"com.amazonaws.ec2#TrafficMirrorFilterId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Traffic filter ID.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Traffic mirror filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>traffic-mirror-filter-rule-id</code>: The ID of the Traffic Mirror rule.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>traffic-mirror-filter-id</code>: The ID of the filter that this rule is associated with.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>rule-number</code>: The number of the Traffic Mirror rule.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>rule-action</code>: The action taken on the filtered traffic. Possible actions are <code>accept</code> and <code>reject</code>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>traffic-direction</code>: The traffic direction. Possible directions are <code>ingress</code> and <code>egress</code>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>protocol</code>: The protocol, for example UDP, assigned to the Traffic Mirror rule.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>source-cidr-block</code>: The source CIDR block assigned to the Traffic Mirror rule.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>destination-cidr-block</code>: The destination CIDR block assigned to the Traffic Mirror rule.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>description</code>: The description of the Traffic Mirror rule.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#TrafficMirroringMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return with a single call.\\n\\tTo retrieve the remaining results, make another call with the returned <code>nextToken</code> value.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next page of results.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeTrafficMirrorFilterRulesResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TrafficMirrorFilterRules\": {\n                    \"target\": \"com.amazonaws.ec2#TrafficMirrorFilterRuleSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TrafficMirrorFilterRuleSet\",\n                        \"smithy.api#documentation\": \"<p>Traffic mirror rules.</p>\",\n                        \"smithy.api#xmlName\": \"trafficMirrorFilterRuleSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. The value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeTrafficMirrorFilters\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeTrafficMirrorFiltersRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeTrafficMirrorFiltersResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes one or more Traffic Mirror filters.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"TrafficMirrorFilters\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeTrafficMirrorFiltersRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TrafficMirrorFilterIds\": {\n                    \"target\": \"com.amazonaws.ec2#TrafficMirrorFilterIdList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the Traffic Mirror filter.</p>\",\n                        \"smithy.api#xmlName\": \"TrafficMirrorFilterId\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more filters. The possible values are:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>description</code>: The Traffic Mirror filter description.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>traffic-mirror-filter-id</code>: The ID of the Traffic Mirror filter.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#TrafficMirroringMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return with a single call.\\n\\tTo retrieve the remaining results, make another call with the returned <code>nextToken</code> value.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next page of results.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeTrafficMirrorFiltersResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TrafficMirrorFilters\": {\n                    \"target\": \"com.amazonaws.ec2#TrafficMirrorFilterSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TrafficMirrorFilterSet\",\n                        \"smithy.api#documentation\": \"<p>Information about one or more Traffic Mirror filters.</p>\",\n                        \"smithy.api#xmlName\": \"trafficMirrorFilterSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. The value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeTrafficMirrorSessions\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeTrafficMirrorSessionsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeTrafficMirrorSessionsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes one or more Traffic Mirror sessions. By default, all Traffic Mirror sessions are described. Alternatively, you can filter the results.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"TrafficMirrorSessions\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeTrafficMirrorSessionsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TrafficMirrorSessionIds\": {\n                    \"target\": \"com.amazonaws.ec2#TrafficMirrorSessionIdList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the Traffic Mirror session.</p>\",\n                        \"smithy.api#xmlName\": \"TrafficMirrorSessionId\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more filters. The possible values are:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>description</code>: The Traffic Mirror session description.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-interface-id</code>: The ID of the Traffic Mirror session network interface.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>owner-id</code>: The ID of the account that owns the Traffic Mirror session.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>packet-length</code>: The assigned number of packets to mirror. </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>session-number</code>: The assigned session number. </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>traffic-mirror-filter-id</code>: The ID of the Traffic Mirror filter.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>traffic-mirror-session-id</code>: The ID of the Traffic Mirror session.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>traffic-mirror-target-id</code>: The ID of the Traffic Mirror target.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>virtual-network-id</code>: The virtual network ID of the Traffic Mirror session.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#TrafficMirroringMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return with a single call.\\n\\tTo retrieve the remaining results, make another call with the returned <code>nextToken</code> value.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next page of results.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeTrafficMirrorSessionsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TrafficMirrorSessions\": {\n                    \"target\": \"com.amazonaws.ec2#TrafficMirrorSessionSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TrafficMirrorSessionSet\",\n                        \"smithy.api#documentation\": \"<p>Describes one or more Traffic Mirror sessions. By default, all Traffic Mirror sessions are described. Alternatively, you can filter the results.</p>\",\n                        \"smithy.api#xmlName\": \"trafficMirrorSessionSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. The value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeTrafficMirrorTargets\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeTrafficMirrorTargetsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeTrafficMirrorTargetsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about one or more Traffic Mirror targets.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"TrafficMirrorTargets\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeTrafficMirrorTargetsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TrafficMirrorTargetIds\": {\n                    \"target\": \"com.amazonaws.ec2#TrafficMirrorTargetIdList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the Traffic Mirror targets.</p>\",\n                        \"smithy.api#xmlName\": \"TrafficMirrorTargetId\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more filters. The possible values are:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>description</code>: The Traffic Mirror target description.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-interface-id</code>: The ID of the Traffic Mirror session network interface.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>network-load-balancer-arn</code>: The Amazon Resource Name (ARN) of the Network Load Balancer that is associated with the session.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>owner-id</code>: The ID of the account that owns the Traffic Mirror session.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>traffic-mirror-target-id</code>: The ID of the Traffic Mirror target.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#TrafficMirroringMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return with a single call.\\n\\tTo retrieve the remaining results, make another call with the returned <code>nextToken</code> value.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next page of results.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeTrafficMirrorTargetsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TrafficMirrorTargets\": {\n                    \"target\": \"com.amazonaws.ec2#TrafficMirrorTargetSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TrafficMirrorTargetSet\",\n                        \"smithy.api#documentation\": \"<p>Information about one or more Traffic Mirror targets.</p>\",\n                        \"smithy.api#xmlName\": \"trafficMirrorTargetSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. The value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeTransitGatewayAttachments\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeTransitGatewayAttachmentsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeTransitGatewayAttachmentsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes one or more attachments between resources and transit gateways. By default, all attachments are described.\\n         Alternatively, you can filter the results by attachment ID, attachment state, resource ID, or resource owner.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"TransitGatewayAttachments\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeTransitGatewayAttachmentsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayAttachmentIds\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayAttachmentIdStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the attachments.</p>\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more filters. The possible values are:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>association.state</code> - The state of the association (<code>associating</code> | <code>associated</code> |\\n               <code>disassociating</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>association.transit-gateway-route-table-id</code> - The ID of the route table for the transit gateway.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>resource-id</code> - The ID of the resource.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>resource-owner-id</code> - The ID of the Amazon Web Services account that owns the resource.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>resource-type</code> - The resource type. Valid values are <code>vpc</code>\\n                    | <code>vpn</code> | <code>direct-connect-gateway</code> | <code>peering</code>\\n                    | <code>connect</code>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>state</code> - The state of the attachment. Valid values are <code>available</code> | <code>deleted</code> | <code>deleting</code> | <code>failed</code> |  <code>failing</code> | <code>initiatingRequest</code> | <code>modifying</code> | <code>pendingAcceptance</code> | <code>pending</code> | <code>rollingBack</code> | <code>rejected</code> | <code>rejecting</code>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>transit-gateway-attachment-id</code> - The ID of the attachment.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>transit-gateway-id</code> - The ID of the transit gateway.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>transit-gateway-owner-id</code> - The ID of the Amazon Web Services account that owns the transit gateway.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return with a single call.\\n\\tTo retrieve the remaining results, make another call with the returned <code>nextToken</code> value.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next page of results.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeTransitGatewayAttachmentsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayAttachments\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayAttachmentList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayAttachments\",\n                        \"smithy.api#documentation\": \"<p>Information about the attachments.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayAttachments\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeTransitGatewayConnectPeers\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeTransitGatewayConnectPeersRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeTransitGatewayConnectPeersResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes one or more Connect peers.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"TransitGatewayConnectPeers\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeTransitGatewayConnectPeersRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayConnectPeerIds\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayConnectPeerIdStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the Connect peers.</p>\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more filters. The possible values are:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>state</code> - The state of the Connect peer (<code>pending</code> |\\n                        <code>available</code> | <code>deleting</code> |\\n                    <code>deleted</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>transit-gateway-attachment-id</code> - The ID of the attachment.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>transit-gateway-connect-peer-id</code> - The ID of the Connect peer.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return with a single call.\\n\\tTo retrieve the remaining results, make another call with the returned <code>nextToken</code> value.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next page of results.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeTransitGatewayConnectPeersResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayConnectPeers\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayConnectPeerList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayConnectPeerSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the Connect peers.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayConnectPeerSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeTransitGatewayConnects\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeTransitGatewayConnectsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeTransitGatewayConnectsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes one or more Connect attachments.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"TransitGatewayConnects\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeTransitGatewayConnectsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayAttachmentIds\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayAttachmentIdStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the attachments.</p>\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more filters. The possible values are:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>options.protocol</code> - The tunnel protocol (<code>gre</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>state</code> - The state of the attachment (<code>initiating</code> |\\n                        <code>initiatingRequest</code> | <code>pendingAcceptance</code> |\\n                        <code>rollingBack</code> | <code>pending</code> | <code>available</code> |\\n                        <code>modifying</code> | <code>deleting</code> | <code>deleted</code> |\\n                        <code>failed</code> | <code>rejected</code> | <code>rejecting</code> |\\n                        <code>failing</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>transit-gateway-attachment-id</code> - The ID of the\\n                    Connect attachment.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>transit-gateway-id</code> - The ID of the transit gateway.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>transport-transit-gateway-attachment-id</code> - The ID of the transit gateway attachment from which the Connect attachment was created.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return with a single call.\\n\\tTo retrieve the remaining results, make another call with the returned <code>nextToken</code> value.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next page of results.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeTransitGatewayConnectsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayConnects\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayConnectList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayConnectSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the Connect attachments.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayConnectSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeTransitGatewayMulticastDomains\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeTransitGatewayMulticastDomainsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeTransitGatewayMulticastDomainsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes one or more transit gateway multicast domains.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"TransitGatewayMulticastDomains\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeTransitGatewayMulticastDomainsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayMulticastDomainIds\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayMulticastDomainIdStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the transit gateway multicast domain.</p>\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more filters. The possible values are:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>state</code> - The state of the transit gateway multicast domain. Valid values are <code>pending</code> | <code>available</code> | <code>deleting</code> | <code>deleted</code>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>transit-gateway-id</code> - The ID of the transit gateway.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>transit-gateway-multicast-domain-id</code> - The ID of the transit gateway multicast domain.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return with a single call.\\n\\tTo retrieve the remaining results, make another call with the returned <code>nextToken</code> value.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next page of results.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeTransitGatewayMulticastDomainsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayMulticastDomains\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayMulticastDomainList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayMulticastDomains\",\n                        \"smithy.api#documentation\": \"<p>Information about the transit gateway multicast domains.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayMulticastDomains\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeTransitGatewayPeeringAttachments\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeTransitGatewayPeeringAttachmentsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeTransitGatewayPeeringAttachmentsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes your transit gateway peering attachments.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"TransitGatewayPeeringAttachments\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeTransitGatewayPeeringAttachmentsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayAttachmentIds\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayAttachmentIdStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more IDs of the transit gateway peering attachments.</p>\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more filters. The possible values are:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>transit-gateway-attachment-id</code> - The ID of the transit gateway attachment.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>local-owner-id</code> - The ID of your Amazon Web Services account.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>remote-owner-id</code> - The ID of the Amazon Web Services account in the remote Region that owns the transit gateway.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>state</code> - The state of the peering attachment. Valid values are <code>available</code> | <code>deleted</code> | <code>deleting</code> | <code>failed</code> |  <code>failing</code> | <code>initiatingRequest</code> | <code>modifying</code> | <code>pendingAcceptance</code> | <code>pending</code> | <code>rollingBack</code> | <code>rejected</code> | <code>rejecting</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag</code>:<key> - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\\n    For example, to find all resources that have a tag with the key <code>Owner</code> and the value <code>TeamA</code>, specify <code>tag:Owner</code> for the filter name and <code>TeamA</code> for the filter value.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag-key</code> - The key of a tag assigned to the resource. Use this filter to find all resources that have a tag with a specific key, regardless of the tag value.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>transit-gateway-id</code> - The ID of the transit gateway.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return with a single call.\\n\\tTo retrieve the remaining results, make another call with the returned <code>nextToken</code> value.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next page of results.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeTransitGatewayPeeringAttachmentsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayPeeringAttachments\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayPeeringAttachmentList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayPeeringAttachments\",\n                        \"smithy.api#documentation\": \"<p>The transit gateway peering attachments.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayPeeringAttachments\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeTransitGatewayPolicyTables\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeTransitGatewayPolicyTablesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeTransitGatewayPolicyTablesResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes one or more transit gateway route policy tables.  </p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"TransitGatewayPolicyTables\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeTransitGatewayPolicyTablesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayPolicyTableIds\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayPolicyTableIdStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the transit gateway policy tables.</p>\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The filters associated with the transit gateway policy table.</p>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return with a single call.\\n\\tTo retrieve the remaining results, make another call with the returned <code>nextToken</code> value.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next page of results.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeTransitGatewayPolicyTablesResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayPolicyTables\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayPolicyTableList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayPolicyTables\",\n                        \"smithy.api#documentation\": \"<p>Describes the transit gateway policy tables.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayPolicyTables\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token for the next page of results.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeTransitGatewayRouteTableAnnouncements\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeTransitGatewayRouteTableAnnouncementsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeTransitGatewayRouteTableAnnouncementsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes one or more transit gateway route table advertisements.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"TransitGatewayRouteTableAnnouncements\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeTransitGatewayRouteTableAnnouncementsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayRouteTableAnnouncementIds\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayRouteTableAnnouncementIdStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the transit gateway route tables that are being advertised.</p>\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The filters associated with the transit gateway policy table.</p>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return with a single call.\\n\\tTo retrieve the remaining results, make another call with the returned <code>nextToken</code> value.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next page of results.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeTransitGatewayRouteTableAnnouncementsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayRouteTableAnnouncements\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayRouteTableAnnouncementList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayRouteTableAnnouncements\",\n                        \"smithy.api#documentation\": \"<p>Describes the transit gateway route table announcement.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayRouteTableAnnouncements\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token for the next page of results.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeTransitGatewayRouteTables\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeTransitGatewayRouteTablesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeTransitGatewayRouteTablesResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes one or more transit gateway route tables. By default, all transit gateway route tables are described.\\n         Alternatively, you can filter the results.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"TransitGatewayRouteTables\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeTransitGatewayRouteTablesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayRouteTableIds\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayRouteTableIdStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the transit gateway route tables.</p>\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more filters. The possible values are:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>default-association-route-table</code> - Indicates whether this is the default\\n                association route table for the transit gateway (<code>true</code> | <code>false</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>default-propagation-route-table</code> - Indicates whether this is the default\\n               propagation route table for the transit gateway (<code>true</code> | <code>false</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>state</code> - The state of the route table (<code>available</code> | <code>deleting</code> | <code>deleted</code> | <code>pending</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>transit-gateway-id</code> - The ID of the transit gateway.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>transit-gateway-route-table-id</code> - The ID of the transit gateway route table.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return with a single call.\\n\\tTo retrieve the remaining results, make another call with the returned <code>nextToken</code> value.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next page of results.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeTransitGatewayRouteTablesResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayRouteTables\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayRouteTableList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayRouteTables\",\n                        \"smithy.api#documentation\": \"<p>Information about the transit gateway route tables.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayRouteTables\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeTransitGatewayVpcAttachments\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeTransitGatewayVpcAttachmentsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeTransitGatewayVpcAttachmentsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes one or more VPC attachments. By default, all VPC attachments are described.\\n         Alternatively, you can filter the results.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"TransitGatewayVpcAttachments\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeTransitGatewayVpcAttachmentsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayAttachmentIds\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayAttachmentIdStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the attachments.</p>\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more filters. The possible values are:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>state</code> - The state of the attachment. Valid values are <code>available</code> | <code>deleted</code> | <code>deleting</code> | <code>failed</code> |  <code>failing</code> | <code>initiatingRequest</code> | <code>modifying</code> | <code>pendingAcceptance</code> | <code>pending</code> | <code>rollingBack</code> | <code>rejected</code> | <code>rejecting</code>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>transit-gateway-attachment-id</code> - The ID of the attachment.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>transit-gateway-id</code> - The ID of the transit gateway.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>vpc-id</code> - The ID of the VPC.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return with a single call.\\n\\tTo retrieve the remaining results, make another call with the returned <code>nextToken</code> value.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next page of results.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeTransitGatewayVpcAttachmentsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayVpcAttachments\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayVpcAttachmentList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayVpcAttachments\",\n                        \"smithy.api#documentation\": \"<p>Information about the VPC attachments.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayVpcAttachments\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeTransitGateways\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeTransitGatewaysRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeTransitGatewaysResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes one or more transit gateways. By default, all transit gateways are described. Alternatively, you can\\n         filter the results.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"TransitGateways\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeTransitGatewaysRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayIds\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayIdStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the transit gateways.</p>\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more filters. The possible values are:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>options.propagation-default-route-table-id</code> - The ID of the default propagation route table.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>options.amazon-side-asn</code> - The private ASN for the Amazon side of a BGP session.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>options.association-default-route-table-id</code> - The ID of the default association route table.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>options.auto-accept-shared-attachments</code> - Indicates whether there is automatic acceptance of attachment requests (<code>enable</code> | <code>disable</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>options.default-route-table-association</code> - Indicates whether resource attachments are automatically \\n               associated with the default association route table (<code>enable</code> | <code>disable</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>options.default-route-table-propagation</code> - Indicates whether resource attachments automatically propagate \\n               routes to the default propagation route table (<code>enable</code> | <code>disable</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>options.dns-support</code> - Indicates whether DNS support is enabled (<code>enable</code> | <code>disable</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>options.vpn-ecmp-support</code> - Indicates whether Equal Cost Multipath Protocol support is enabled  (<code>enable</code> | <code>disable</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>owner-id</code> - The ID of the Amazon Web Services account that owns the transit gateway.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>state</code> - The state of the transit gateway (<code>available</code> | <code>deleted</code> | <code>deleting</code> | <code>modifying</code> | <code>pending</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>transit-gateway-id</code> - The ID of the transit gateway.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag-key </code>- The key/value combination of a tag assigned to the resource. Use the\\n               tag key in the filter name and the tag value as the filter value. For example, to\\n               find all resources that have a tag with the key <code>Owner</code> and the value <code>TeamA</code>, specify\\n               <code>tag:Owner</code> for the filter name and <code>TeamA</code> for the filter value.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return with a single call.\\n\\tTo retrieve the remaining results, make another call with the returned <code>nextToken</code> value.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next page of results.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeTransitGatewaysResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGateways\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewaySet\",\n                        \"smithy.api#documentation\": \"<p>Information about the transit gateways.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewaySet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeTrunkInterfaceAssociations\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeTrunkInterfaceAssociationsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeTrunkInterfaceAssociationsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes one or more network interface trunk associations.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"InterfaceAssociations\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeTrunkInterfaceAssociationsMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 5,\n                    \"max\": 255\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeTrunkInterfaceAssociationsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AssociationIds\": {\n                    \"target\": \"com.amazonaws.ec2#TrunkInterfaceAssociationIdList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the associations.</p>\",\n                        \"smithy.api#xmlName\": \"AssociationId\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>gre-key</code> - The ID of a trunk interface association.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>interface-protocol</code> - The interface protocol. Valid values are <code>VLAN</code> and <code>GRE</code>.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next page of results.</p>\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#DescribeTrunkInterfaceAssociationsMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return with a single call.\\n            To retrieve the remaining results, make another call with the returned <code>nextToken</code> value.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeTrunkInterfaceAssociationsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InterfaceAssociations\": {\n                    \"target\": \"com.amazonaws.ec2#TrunkInterfaceAssociationList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InterfaceAssociationSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the trunk associations.</p>\",\n                        \"smithy.api#xmlName\": \"interfaceAssociationSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeVerifiedAccessEndpoints\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeVerifiedAccessEndpointsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeVerifiedAccessEndpointsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the specified Amazon Web Services Verified Access endpoints.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"VerifiedAccessEndpoints\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeVerifiedAccessEndpointsMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 5,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeVerifiedAccessEndpointsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VerifiedAccessEndpointIds\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessEndpointIdList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the Verified Access endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"VerifiedAccessEndpointId\"\n                    }\n                },\n                \"VerifiedAccessInstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessInstanceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the Verified Access instance.</p>\"\n                    }\n                },\n                \"VerifiedAccessGroupId\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessGroupId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the Verified Access group.</p>\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#DescribeVerifiedAccessEndpointsMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return with a single call.\\n\\tTo retrieve the remaining results, make another call with the returned <code>nextToken</code> value.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next page of results.</p>\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more filters. Filter names and values are case-sensitive.</p>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeVerifiedAccessEndpointsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VerifiedAccessEndpoints\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessEndpointList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VerifiedAccessEndpointSet\",\n                        \"smithy.api#documentation\": \"<p>Details about the Verified Access endpoints.</p>\",\n                        \"smithy.api#xmlName\": \"verifiedAccessEndpointSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeVerifiedAccessGroupMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 5,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeVerifiedAccessGroups\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeVerifiedAccessGroupsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeVerifiedAccessGroupsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the specified Verified Access groups.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"VerifiedAccessGroups\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeVerifiedAccessGroupsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VerifiedAccessGroupIds\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessGroupIdList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the Verified Access groups.</p>\",\n                        \"smithy.api#xmlName\": \"VerifiedAccessGroupId\"\n                    }\n                },\n                \"VerifiedAccessInstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessInstanceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the Verified Access instance.</p>\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#DescribeVerifiedAccessGroupMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return with a single call.\\n\\tTo retrieve the remaining results, make another call with the returned <code>nextToken</code> value.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next page of results.</p>\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more filters. Filter names and values are case-sensitive.</p>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeVerifiedAccessGroupsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VerifiedAccessGroups\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessGroupList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VerifiedAccessGroupSet\",\n                        \"smithy.api#documentation\": \"<p>Details about the Verified Access groups.</p>\",\n                        \"smithy.api#xmlName\": \"verifiedAccessGroupSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeVerifiedAccessInstanceLoggingConfigurations\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeVerifiedAccessInstanceLoggingConfigurationsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeVerifiedAccessInstanceLoggingConfigurationsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the specified Amazon Web Services Verified Access instances.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"LoggingConfigurations\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeVerifiedAccessInstanceLoggingConfigurationsMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 10\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeVerifiedAccessInstanceLoggingConfigurationsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VerifiedAccessInstanceIds\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessInstanceIdList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the Verified Access instances.</p>\",\n                        \"smithy.api#xmlName\": \"VerifiedAccessInstanceId\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#DescribeVerifiedAccessInstanceLoggingConfigurationsMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return with a single call.\\n\\tTo retrieve the remaining results, make another call with the returned <code>nextToken</code> value.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next page of results.</p>\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more filters. Filter names and values are case-sensitive.</p>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeVerifiedAccessInstanceLoggingConfigurationsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LoggingConfigurations\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessInstanceLoggingConfigurationList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LoggingConfigurationSet\",\n                        \"smithy.api#documentation\": \"<p>The logging configuration for the Verified Access instances.</p>\",\n                        \"smithy.api#xmlName\": \"loggingConfigurationSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeVerifiedAccessInstances\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeVerifiedAccessInstancesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeVerifiedAccessInstancesResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the specified Amazon Web Services Verified Access instances.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"VerifiedAccessInstances\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeVerifiedAccessInstancesMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 5,\n                    \"max\": 200\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeVerifiedAccessInstancesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VerifiedAccessInstanceIds\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessInstanceIdList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the Verified Access instances.</p>\",\n                        \"smithy.api#xmlName\": \"VerifiedAccessInstanceId\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#DescribeVerifiedAccessInstancesMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return with a single call.\\n\\tTo retrieve the remaining results, make another call with the returned <code>nextToken</code> value.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next page of results.</p>\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more filters. Filter names and values are case-sensitive.</p>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeVerifiedAccessInstancesResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VerifiedAccessInstances\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessInstanceList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VerifiedAccessInstanceSet\",\n                        \"smithy.api#documentation\": \"<p>Details about the Verified Access instances.</p>\",\n                        \"smithy.api#xmlName\": \"verifiedAccessInstanceSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeVerifiedAccessTrustProviders\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeVerifiedAccessTrustProvidersRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeVerifiedAccessTrustProvidersResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the specified Amazon Web Services Verified Access trust providers.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"VerifiedAccessTrustProviders\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeVerifiedAccessTrustProvidersMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 5,\n                    \"max\": 200\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeVerifiedAccessTrustProvidersRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VerifiedAccessTrustProviderIds\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessTrustProviderIdList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the Verified Access trust providers.</p>\",\n                        \"smithy.api#xmlName\": \"VerifiedAccessTrustProviderId\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#DescribeVerifiedAccessTrustProvidersMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return with a single call.\\n\\tTo retrieve the remaining results, make another call with the returned <code>nextToken</code> value.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next page of results.</p>\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more filters. Filter names and values are case-sensitive.</p>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeVerifiedAccessTrustProvidersResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VerifiedAccessTrustProviders\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessTrustProviderList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VerifiedAccessTrustProviderSet\",\n                        \"smithy.api#documentation\": \"<p>Details about the Verified Access trust providers.</p>\",\n                        \"smithy.api#xmlName\": \"verifiedAccessTrustProviderSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeVolumeAttribute\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeVolumeAttributeRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeVolumeAttributeResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the specified attribute of the specified volume. You can specify only one\\n      attribute at a time.</p>\\n         <p>For more information about EBS volumes, see <a href=\\\"https://docs.aws.amazon.com/ebs/latest/userguide/ebs-volumes.html\\\">Amazon EBS volumes</a> in the <i>Amazon EBS User Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To describe a volume attribute\",\n                        \"documentation\": \"This example describes the ``autoEnableIo`` attribute of the volume with the ID ``vol-049df61146c4d7901``.\",\n                        \"input\": {\n                            \"VolumeId\": \"vol-049df61146c4d7901\",\n                            \"Attribute\": \"autoEnableIO\"\n                        },\n                        \"output\": {\n                            \"AutoEnableIO\": {\n                                \"Value\": false\n                            },\n                            \"VolumeId\": \"vol-049df61146c4d7901\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#DescribeVolumeAttributeRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Attribute\": {\n                    \"target\": \"com.amazonaws.ec2#VolumeAttributeName\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The attribute of the volume. This parameter is required.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"VolumeId\": {\n                    \"target\": \"com.amazonaws.ec2#VolumeId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the volume.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeVolumeAttributeResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AutoEnableIO\": {\n                    \"target\": \"com.amazonaws.ec2#AttributeBooleanValue\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AutoEnableIO\",\n                        \"smithy.api#documentation\": \"<p>The state of <code>autoEnableIO</code> attribute.</p>\",\n                        \"smithy.api#xmlName\": \"autoEnableIO\"\n                    }\n                },\n                \"ProductCodes\": {\n                    \"target\": \"com.amazonaws.ec2#ProductCodeList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ProductCodes\",\n                        \"smithy.api#documentation\": \"<p>A list of product codes.</p>\",\n                        \"smithy.api#xmlName\": \"productCodes\"\n                    }\n                },\n                \"VolumeId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VolumeId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the volume.</p>\",\n                        \"smithy.api#xmlName\": \"volumeId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeVolumeStatus\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeVolumeStatusRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeVolumeStatusResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the status of the specified volumes. Volume status provides the result of the\\n      checks performed on your volumes to determine events that can impair the performance of your\\n      volumes. The performance of a volume can be affected if an issue occurs on the volume's\\n      underlying host. If the volume's underlying host experiences a power outage or system issue,\\n      after the system is restored, there could be data inconsistencies on the volume. Volume events\\n      notify you if this occurs. Volume actions notify you if any action needs to be taken in\\n      response to the event.</p>\\n         <p>The <code>DescribeVolumeStatus</code> operation provides the following information about\\n      the specified volumes:</p>\\n         <p>\\n            <i>Status</i>: Reflects the current status of the volume. The possible\\n      values are <code>ok</code>, <code>impaired</code> , <code>warning</code>, or\\n        <code>insufficient-data</code>. If all checks pass, the overall status of the volume is\\n        <code>ok</code>. If the check fails, the overall status is <code>impaired</code>. If the\\n      status is <code>insufficient-data</code>, then the checks might still be taking place on your\\n      volume at the time. We recommend that you retry the request. For more information about volume\\n      status, see <a href=\\\"https://docs.aws.amazon.com/ebs/latest/userguide/monitoring-volume-status.html\\\">Monitor the status of your volumes</a> in the <i>Amazon EBS User Guide</i>.</p>\\n         <p>\\n            <i>Events</i>: Reflect the cause of a volume status and might require you to\\n      take action. For example, if your volume returns an <code>impaired</code> status, then the\\n      volume event might be <code>potential-data-inconsistency</code>. This means that your volume\\n      has been affected by an issue with the underlying host, has all I/O operations disabled, and\\n      might have inconsistent data.</p>\\n         <p>\\n            <i>Actions</i>: Reflect the actions you might have to take in response to an\\n      event. For example, if the status of the volume is <code>impaired</code> and the volume event\\n      shows <code>potential-data-inconsistency</code>, then the action shows\\n        <code>enable-volume-io</code>. This means that you may want to enable the I/O operations for\\n      the volume and then check the volume for data consistency. For more information, see \\n      <a href=\\\"https://docs.aws.amazon.com/ebs/latest/userguide/work_volumes_impaired.html\\\">Work with an \\n        impaired EBS volume</a>.</p>\\n         <p>Volume status is based on the volume status checks, and does not reflect the volume state.\\n      Therefore, volume status does not indicate volumes in the <code>error</code> state (for\\n      example, when a volume is incapable of accepting I/O.)</p>\\n         <note>\\n            <p>The order of the elements in the response, including those within nested\\n        structures, might vary. Applications should not assume the elements appear in a\\n        particular order.</p>\\n         </note>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To describe the status of a single volume\",\n                        \"documentation\": \"This example describes the status for the volume ``vol-1234567890abcdef0``.\",\n                        \"input\": {\n                            \"VolumeIds\": [\n                                \"vol-1234567890abcdef0\"\n                            ]\n                        },\n                        \"output\": {\n                            \"VolumeStatuses\": [\n                                {\n                                    \"VolumeStatus\": {\n                                        \"Status\": \"ok\",\n                                        \"Details\": [\n                                            {\n                                                \"Status\": \"passed\",\n                                                \"Name\": \"io-enabled\"\n                                            },\n                                            {\n                                                \"Status\": \"not-applicable\",\n                                                \"Name\": \"io-performance\"\n                                            }\n                                        ]\n                                    },\n                                    \"AvailabilityZone\": \"us-east-1a\",\n                                    \"VolumeId\": \"vol-1234567890abcdef0\",\n                                    \"Actions\": [],\n                                    \"Events\": []\n                                }\n                            ]\n                        }\n                    },\n                    {\n                        \"title\": \"To describe the status of impaired volumes\",\n                        \"documentation\": \"This example describes the status for all volumes that are impaired. In this example output, there are no impaired volumes.\",\n                        \"input\": {\n                            \"Filters\": [\n                                {\n                                    \"Values\": [\n                                        \"impaired\"\n                                    ],\n                                    \"Name\": \"volume-status.status\"\n                                }\n                            ]\n                        },\n                        \"output\": {\n                            \"VolumeStatuses\": []\n                        }\n                    }\n                ],\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"VolumeStatuses\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeVolumeStatusRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of items to return for this request.\\n\\tTo get the next page of items, make another request with the token returned in the output. \\n\\tFor more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Query-Requests.html#api-pagination\\\">Pagination</a>.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token returned from a previous paginated request.\\n  Pagination continues from the end of the items returned by the previous request.</p>\"\n                    }\n                },\n                \"VolumeIds\": {\n                    \"target\": \"com.amazonaws.ec2#VolumeIdStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the volumes.</p>\\n         <p>Default: Describes all your volumes.</p>\",\n                        \"smithy.api#xmlName\": \"VolumeId\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>action.code</code> - The action code for the event (for example,\\n            <code>enable-volume-io</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>action.description</code> - A description of the action.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>action.event-id</code> - The event ID associated with the action.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>availability-zone</code> - The Availability Zone of the instance.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>event.description</code> - A description of the event.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>event.event-id</code> - The event ID.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>event.event-type</code> - The event type (for <code>io-enabled</code>:\\n            <code>passed</code> | <code>failed</code>; for <code>io-performance</code>:\\n            <code>io-performance:degraded</code> | <code>io-performance:severely-degraded</code> |\\n            <code>io-performance:stalled</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>event.not-after</code> - The latest end time for the event.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>event.not-before</code> - The earliest start time for the event.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>volume-status.details-name</code> - The cause for\\n            <code>volume-status.status</code> (<code>io-enabled</code> |\\n          <code>io-performance</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>volume-status.details-status</code> - The status of\\n            <code>volume-status.details-name</code> (for <code>io-enabled</code>:\\n            <code>passed</code> | <code>failed</code>; for <code>io-performance</code>:\\n            <code>normal</code> | <code>degraded</code> | <code>severely-degraded</code> |\\n            <code>stalled</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>volume-status.status</code> - The status of the volume (<code>ok</code> |\\n            <code>impaired</code> | <code>warning</code> | <code>insufficient-data</code>).</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeVolumeStatusResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to include in another request to get the next page of items. \\n  This value is <code>null</code> when there are no more items to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                },\n                \"VolumeStatuses\": {\n                    \"target\": \"com.amazonaws.ec2#VolumeStatusList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VolumeStatusSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the status of the volumes.</p>\",\n                        \"smithy.api#xmlName\": \"volumeStatusSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeVolumes\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeVolumesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeVolumesResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the specified EBS volumes or all of your EBS volumes.</p>\\n         <p>If you are describing a long list of volumes, we recommend that you paginate the output to make the list\\n      more manageable. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Query-Requests.html#api-pagination\\\">Pagination</a>.</p>\\n         <p>For more information about EBS volumes, see <a href=\\\"https://docs.aws.amazon.com/ebs/latest/userguide/ebs-volumes.html\\\">Amazon EBS volumes</a> in the <i>Amazon EBS User Guide</i>.</p>\\n         <important>\\n            <p>We strongly recommend using only paginated requests. Unpaginated requests are\\n        susceptible to throttling and timeouts.</p>\\n         </important>\\n         <note>\\n            <p>The order of the elements in the response, including those within nested\\n        structures, might vary. Applications should not assume the elements appear in a\\n        particular order.</p>\\n         </note>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To describe all volumes\",\n                        \"documentation\": \"This example describes all of your volumes in the default region.\",\n                        \"output\": {\n                            \"Volumes\": [\n                                {\n                                    \"AvailabilityZone\": \"us-east-1a\",\n                                    \"Attachments\": [\n                                        {\n                                            \"AttachTime\": \"2013-12-18T22:35:00.000Z\",\n                                            \"InstanceId\": \"i-1234567890abcdef0\",\n                                            \"VolumeId\": \"vol-049df61146c4d7901\",\n                                            \"State\": \"attached\",\n                                            \"DeleteOnTermination\": true,\n                                            \"Device\": \"/dev/sda1\"\n                                        }\n                                    ],\n                                    \"VolumeType\": \"standard\",\n                                    \"VolumeId\": \"vol-049df61146c4d7901\",\n                                    \"State\": \"in-use\",\n                                    \"SnapshotId\": \"snap-1234567890abcdef0\",\n                                    \"CreateTime\": \"2013-12-18T22:35:00.084Z\",\n                                    \"Size\": 8\n                                }\n                            ],\n                            \"NextToken\": \"\"\n                        }\n                    },\n                    {\n                        \"title\": \"To describe volumes that are attached to a specific instance\",\n                        \"documentation\": \"This example describes all volumes that are both attached to the instance with the ID i-1234567890abcdef0 and set to delete when the instance terminates.\",\n                        \"input\": {\n                            \"Filters\": [\n                                {\n                                    \"Values\": [\n                                        \"i-1234567890abcdef0\"\n                                    ],\n                                    \"Name\": \"attachment.instance-id\"\n                                },\n                                {\n                                    \"Values\": [\n                                        \"true\"\n                                    ],\n                                    \"Name\": \"attachment.delete-on-termination\"\n                                }\n                            ]\n                        },\n                        \"output\": {\n                            \"Volumes\": [\n                                {\n                                    \"AvailabilityZone\": \"us-east-1a\",\n                                    \"Attachments\": [\n                                        {\n                                            \"AttachTime\": \"2013-12-18T22:35:00.000Z\",\n                                            \"InstanceId\": \"i-1234567890abcdef0\",\n                                            \"VolumeId\": \"vol-049df61146c4d7901\",\n                                            \"State\": \"attached\",\n                                            \"DeleteOnTermination\": true,\n                                            \"Device\": \"/dev/sda1\"\n                                        }\n                                    ],\n                                    \"VolumeType\": \"standard\",\n                                    \"VolumeId\": \"vol-049df61146c4d7901\",\n                                    \"State\": \"in-use\",\n                                    \"SnapshotId\": \"snap-1234567890abcdef0\",\n                                    \"CreateTime\": \"2013-12-18T22:35:00.084Z\",\n                                    \"Size\": 8\n                                }\n                            ]\n                        }\n                    }\n                ],\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"Volumes\",\n                    \"pageSize\": \"MaxResults\"\n                },\n                \"smithy.api#suppress\": [\n                    \"WaitableTraitInvalidErrorType\"\n                ],\n                \"smithy.waiters#waitable\": {\n                    \"VolumeAvailable\": {\n                        \"acceptors\": [\n                            {\n                                \"state\": \"success\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"Volumes[].State\",\n                                        \"expected\": \"available\",\n                                        \"comparator\": \"allStringEquals\"\n                                    }\n                                }\n                            },\n                            {\n                                \"state\": \"failure\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"Volumes[].State\",\n                                        \"expected\": \"deleted\",\n                                        \"comparator\": \"anyStringEquals\"\n                                    }\n                                }\n                            }\n                        ],\n                        \"minDelay\": 15\n                    },\n                    \"VolumeDeleted\": {\n                        \"acceptors\": [\n                            {\n                                \"state\": \"success\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"Volumes[].State\",\n                                        \"expected\": \"deleted\",\n                                        \"comparator\": \"allStringEquals\"\n                                    }\n                                }\n                            },\n                            {\n                                \"state\": \"success\",\n                                \"matcher\": {\n                                    \"errorType\": \"InvalidVolume.NotFound\"\n                                }\n                            }\n                        ],\n                        \"minDelay\": 15\n                    },\n                    \"VolumeInUse\": {\n                        \"acceptors\": [\n                            {\n                                \"state\": \"success\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"Volumes[].State\",\n                                        \"expected\": \"in-use\",\n                                        \"comparator\": \"allStringEquals\"\n                                    }\n                                }\n                            },\n                            {\n                                \"state\": \"failure\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"Volumes[].State\",\n                                        \"expected\": \"deleted\",\n                                        \"comparator\": \"anyStringEquals\"\n                                    }\n                                }\n                            }\n                        ],\n                        \"minDelay\": 15\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeVolumesModifications\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeVolumesModificationsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeVolumesModificationsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the most recent volume modification request for the specified EBS volumes.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/ebs/latest/userguide/monitoring-volume-modifications.html\\\">\\n      Monitor the progress of volume modifications</a> in the <i>Amazon EBS User Guide</i>.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"VolumesModifications\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeVolumesModificationsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"VolumeIds\": {\n                    \"target\": \"com.amazonaws.ec2#VolumeIdStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the volumes.</p>\",\n                        \"smithy.api#xmlName\": \"VolumeId\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>modification-state</code> - The current modification state (modifying | \\n          optimizing | completed | failed).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>original-iops</code> - The original IOPS rate of the volume.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>original-size</code> - The original size of the volume, in GiB.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>original-volume-type</code> - The original volume type of the volume (standard | \\n          io1 | io2 | gp2 | sc1 | st1).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>originalMultiAttachEnabled</code> - Indicates whether Multi-Attach support was enabled (true | false).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>start-time</code> - The modification start time.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>target-iops</code> - The target IOPS rate of the volume.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>target-size</code> - The target size of the volume, in GiB.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>target-volume-type</code> - The target volume type of the volume (standard | \\n          io1 | io2 | gp2 | sc1 | st1).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>targetMultiAttachEnabled</code> - Indicates whether Multi-Attach support is to be enabled (true | false).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>volume-id</code> - The ID of the volume.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token returned from a previous paginated request.\\n  Pagination continues from the end of the items returned by the previous request.</p>\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results (up to a limit of 500) to be returned in a paginated\\n      request. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Query-Requests.html#api-pagination\\\">Pagination</a>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeVolumesModificationsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to include in another request to get the next page of items. \\n  This value is <code>null</code> when there are no more items to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                },\n                \"VolumesModifications\": {\n                    \"target\": \"com.amazonaws.ec2#VolumeModificationList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VolumeModificationSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the volume modifications.</p>\",\n                        \"smithy.api#xmlName\": \"volumeModificationSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeVolumesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VolumeIds\": {\n                    \"target\": \"com.amazonaws.ec2#VolumeIdStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The volume IDs. If not specified, then all volumes are included in the response.</p>\",\n                        \"smithy.api#xmlName\": \"VolumeId\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>attachment.attach-time</code> - The time stamp when the attachment\\n          initiated.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>attachment.delete-on-termination</code> - Whether the volume is deleted on\\n          instance termination.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>attachment.device</code> - The device name specified in the block device mapping\\n          (for example, <code>/dev/sda1</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>attachment.instance-id</code> - The ID of the instance the volume is attached\\n          to.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>attachment.status</code> - The attachment state (<code>attaching</code> |\\n            <code>attached</code> | <code>detaching</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>availability-zone</code> - The Availability Zone in which the volume was\\n          created.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>availability-zone-id</code> - The ID of the Availability Zone in which the\\n          volume was created.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>create-time</code> - The time stamp when the volume was created.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>encrypted</code> - Indicates whether the volume is encrypted (<code>true</code>\\n          | <code>false</code>)</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>fast-restored</code> - Indicates whether the volume was created from a \\n          snapshot that is enabled for fast snapshot restore (<code>true</code> | \\n          <code>false</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>multi-attach-enabled</code> - Indicates whether the volume is enabled for Multi-Attach (<code>true</code>\\n    \\t\\t\\t| <code>false</code>)</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>operator.managed</code> - A Boolean that indicates whether this is a managed\\n          volume.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>operator.principal</code> - The principal that manages the volume. Only valid\\n          for managed volumes, where <code>managed</code> is <code>true</code>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>size</code> - The size of the volume, in GiB.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>snapshot-id</code> - The snapshot from which the volume was created.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>status</code> - The state of the volume (<code>creating</code> |\\n            <code>available</code> | <code>in-use</code> | <code>deleting</code> |\\n            <code>deleted</code> | <code>error</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag</code>:<key> - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\\n    For example, to find all resources that have a tag with the key <code>Owner</code> and the value <code>TeamA</code>, specify <code>tag:Owner</code> for the filter name and <code>TeamA</code> for the filter value.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag-key</code> - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>volume-id</code> - The volume ID.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>volume-type</code> - The Amazon EBS volume type (<code>gp2</code> | <code>gp3</code> | <code>io1</code> | <code>io2</code> | \\n          <code>st1</code> | <code>sc1</code>| <code>standard</code>)</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token returned from a previous paginated request.\\n  Pagination continues from the end of the items returned by the previous request.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MaxResults\",\n                        \"smithy.api#documentation\": \"<p>The maximum number of items to return for this request.\\n\\tTo get the next page of items, make another request with the token returned in the output. \\n\\tFor more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Query-Requests.html#api-pagination\\\">Pagination</a>.</p>\",\n                        \"smithy.api#xmlName\": \"maxResults\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeVolumesResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to include in another request to get the next page of items. \\n  This value is <code>null</code> when there are no more items to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                },\n                \"Volumes\": {\n                    \"target\": \"com.amazonaws.ec2#VolumeList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VolumeSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the volumes.</p>\",\n                        \"smithy.api#xmlName\": \"volumeSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeVpcAttribute\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeVpcAttributeRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeVpcAttributeResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the specified attribute of the specified VPC. You can specify only one attribute at a time.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To describe the enableDnsSupport attribute\",\n                        \"documentation\": \"This example describes the enableDnsSupport attribute. This attribute indicates whether DNS resolution is enabled for the VPC. If this attribute is true, the Amazon DNS server resolves DNS hostnames for your instances to their corresponding IP addresses; otherwise, it does not.\",\n                        \"input\": {\n                            \"VpcId\": \"vpc-a01106c2\",\n                            \"Attribute\": \"enableDnsSupport\"\n                        },\n                        \"output\": {\n                            \"VpcId\": \"vpc-a01106c2\",\n                            \"EnableDnsSupport\": {\n                                \"Value\": true\n                            }\n                        }\n                    },\n                    {\n                        \"title\": \"To describe the enableDnsHostnames attribute\",\n                        \"documentation\": \"This example describes the enableDnsHostnames attribute. This attribute indicates whether the instances launched in the VPC get DNS hostnames. If this attribute is true, instances in the VPC get DNS hostnames; otherwise, they do not.\",\n                        \"input\": {\n                            \"VpcId\": \"vpc-a01106c2\",\n                            \"Attribute\": \"enableDnsHostnames\"\n                        },\n                        \"output\": {\n                            \"VpcId\": \"vpc-a01106c2\",\n                            \"EnableDnsHostnames\": {\n                                \"Value\": true\n                            }\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#DescribeVpcAttributeRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Attribute\": {\n                    \"target\": \"com.amazonaws.ec2#VpcAttributeName\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The VPC attribute.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"VpcId\": {\n                    \"target\": \"com.amazonaws.ec2#VpcId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the VPC.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeVpcAttributeResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"EnableDnsHostnames\": {\n                    \"target\": \"com.amazonaws.ec2#AttributeBooleanValue\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EnableDnsHostnames\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether the instances launched in the VPC get DNS hostnames.\\n\\t\\t\\t\\tIf this attribute is <code>true</code>, instances in the VPC get DNS hostnames;\\n\\t\\t\\t\\totherwise, they do not.</p>\",\n                        \"smithy.api#xmlName\": \"enableDnsHostnames\"\n                    }\n                },\n                \"EnableDnsSupport\": {\n                    \"target\": \"com.amazonaws.ec2#AttributeBooleanValue\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EnableDnsSupport\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether DNS resolution is enabled for\\n\\t\\t\\t\\tthe VPC. If this attribute is <code>true</code>, the Amazon DNS server\\n\\t\\t\\t\\tresolves DNS hostnames for your instances to their corresponding\\n\\t\\t\\t\\tIP addresses; otherwise, it does not.</p>\",\n                        \"smithy.api#xmlName\": \"enableDnsSupport\"\n                    }\n                },\n                \"EnableNetworkAddressUsageMetrics\": {\n                    \"target\": \"com.amazonaws.ec2#AttributeBooleanValue\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EnableNetworkAddressUsageMetrics\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether Network Address Usage metrics are enabled for your VPC.</p>\",\n                        \"smithy.api#xmlName\": \"enableNetworkAddressUsageMetrics\"\n                    }\n                },\n                \"VpcId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the VPC.</p>\",\n                        \"smithy.api#xmlName\": \"vpcId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeVpcBlockPublicAccessExclusions\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeVpcBlockPublicAccessExclusionsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeVpcBlockPublicAccessExclusionsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describe VPC Block Public Access (BPA) exclusions. A VPC BPA exclusion is a mode that can be applied to a single VPC or subnet that exempts it from the account’s BPA mode and will allow bidirectional or egress-only access. You can create BPA exclusions for VPCs and subnets even when BPA is not enabled on the account to ensure that there is no traffic disruption to the exclusions when VPC BPA is turned on. To learn more about VPC BPA, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/userguide/security-vpc-bpa.html\\\">Block public access to VPCs and subnets</a> in the <i>Amazon VPC User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DescribeVpcBlockPublicAccessExclusionsMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 5,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeVpcBlockPublicAccessExclusionsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Filters for the request:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>resource-arn</code> - The Amazon Resource Name (ARN) of a exclusion.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>internet-gateway-exclusion-mode</code> - The mode of a VPC BPA exclusion. Possible values: <code>allow-bidirectional | allow-egress</code>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>state</code> - The state of VPC BPA. Possible values: <code>create-in-progress | create-complete | update-in-progress | update-complete | delete-in-progress | deleted-complete | disable-in-progress | disable-complete</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag</code> - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\\n    For example, to find all resources that have a tag with the key <code>Owner</code> and the value <code>TeamA</code>, specify <code>tag:Owner</code> for the filter name and <code>TeamA</code> for the filter value.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag-key</code> - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag-value</code>: The value of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific value, regardless of the tag key.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"ExclusionIds\": {\n                    \"target\": \"com.amazonaws.ec2#VpcBlockPublicAccessExclusionIdList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>IDs of exclusions.</p>\",\n                        \"smithy.api#xmlName\": \"ExclusionId\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token returned from a previous paginated request. Pagination continues from the end of the items returned by the previous request.</p>\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#DescribeVpcBlockPublicAccessExclusionsMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of items to return for this request.\\n\\tTo get the next page of items, make another request with the token returned in the output.\\n\\tFor more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Query-Requests.html#api-pagination\\\">Pagination</a>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeVpcBlockPublicAccessExclusionsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VpcBlockPublicAccessExclusions\": {\n                    \"target\": \"com.amazonaws.ec2#VpcBlockPublicAccessExclusionList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcBlockPublicAccessExclusionSet\",\n                        \"smithy.api#documentation\": \"<p>Details related to the exclusions.</p>\",\n                        \"smithy.api#xmlName\": \"vpcBlockPublicAccessExclusionSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to include in another request to get the next page of items. This value is <code>null</code> when there are no more items to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeVpcBlockPublicAccessOptions\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeVpcBlockPublicAccessOptionsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeVpcBlockPublicAccessOptionsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describe VPC Block Public Access (BPA) options. VPC Block Public Access (BPA) enables you to block resources in VPCs and subnets that you own in a Region from reaching or being reached from the internet through internet gateways and egress-only internet gateways. To learn more about VPC BPA, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/userguide/security-vpc-bpa.html\\\">Block public access to VPCs and subnets</a> in the <i>Amazon VPC User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DescribeVpcBlockPublicAccessOptionsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeVpcBlockPublicAccessOptionsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VpcBlockPublicAccessOptions\": {\n                    \"target\": \"com.amazonaws.ec2#VpcBlockPublicAccessOptions\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcBlockPublicAccessOptions\",\n                        \"smithy.api#documentation\": \"<p>Details related to the options.</p>\",\n                        \"smithy.api#xmlName\": \"vpcBlockPublicAccessOptions\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeVpcClassicLink\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeVpcClassicLinkRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeVpcClassicLinkResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>This action is deprecated.</p>\\n         </note>\\n         <p>Describes the ClassicLink status of the specified VPCs.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DescribeVpcClassicLinkDnsSupport\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeVpcClassicLinkDnsSupportRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeVpcClassicLinkDnsSupportResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>This action is deprecated.</p>\\n         </note>\\n         <p>Describes the ClassicLink DNS support status of one or more VPCs. If enabled, the DNS\\n            hostname of a linked EC2-Classic instance resolves to its private IP address when\\n            addressed from an instance in the VPC to which it's linked. Similarly, the DNS hostname\\n            of an instance in a VPC resolves to its private IP address when addressed from a linked\\n            EC2-Classic instance.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"Vpcs\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeVpcClassicLinkDnsSupportMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 5,\n                    \"max\": 255\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeVpcClassicLinkDnsSupportNextToken\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 1024\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeVpcClassicLinkDnsSupportRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VpcIds\": {\n                    \"target\": \"com.amazonaws.ec2#VpcClassicLinkIdList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the VPCs.</p>\",\n                        \"smithy.api#xmlName\": \"VpcIds\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#DescribeVpcClassicLinkDnsSupportMaxResults\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MaxResults\",\n                        \"smithy.api#documentation\": \"<p>The maximum number of items to return for this request.\\n\\tTo get the next page of items, make another request with the token returned in the output.\\n\\tFor more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Query-Requests.html#api-pagination\\\">Pagination</a>.</p>\",\n                        \"smithy.api#xmlName\": \"maxResults\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#DescribeVpcClassicLinkDnsSupportNextToken\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token returned from a previous paginated request. Pagination continues from the end of the items returned by the previous request.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeVpcClassicLinkDnsSupportResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#DescribeVpcClassicLinkDnsSupportNextToken\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to include in another request to get the next page of items. This value is <code>null</code> when there are no more items to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                },\n                \"Vpcs\": {\n                    \"target\": \"com.amazonaws.ec2#ClassicLinkDnsSupportList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Vpcs\",\n                        \"smithy.api#documentation\": \"<p>Information about the ClassicLink DNS support status of the VPCs.</p>\",\n                        \"smithy.api#xmlName\": \"vpcs\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeVpcClassicLinkRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"VpcIds\": {\n                    \"target\": \"com.amazonaws.ec2#VpcClassicLinkIdList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The VPCs for which you want to describe the ClassicLink status.</p>\",\n                        \"smithy.api#xmlName\": \"VpcId\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>is-classic-link-enabled</code> - Whether the VPC is enabled for ClassicLink\\n\\t\\t\\t\\t\\t   (<code>true</code> | <code>false</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag</code> - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\\n    For example, to find all resources that have a tag with the key <code>Owner</code> and the value <code>TeamA</code>, specify <code>tag:Owner</code> for the filter name and <code>TeamA</code> for the filter value.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag-key</code> - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeVpcClassicLinkResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Vpcs\": {\n                    \"target\": \"com.amazonaws.ec2#VpcClassicLinkList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcSet\",\n                        \"smithy.api#documentation\": \"<p>The ClassicLink status of the VPCs.</p>\",\n                        \"smithy.api#xmlName\": \"vpcSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeVpcEndpointAssociations\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeVpcEndpointAssociationsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeVpcEndpointAssociationsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the VPC resources, VPC endpoint services, Amazon Lattice services, or service networks\\n         associated with the VPC endpoint.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DescribeVpcEndpointAssociationsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"VpcEndpointIds\": {\n                    \"target\": \"com.amazonaws.ec2#VpcEndpointIdList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the VPC endpoints.</p>\",\n                        \"smithy.api#xmlName\": \"VpcEndpointId\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>vpc-endpoint-id</code> - The ID of the VPC endpoint.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>associated-resource-accessibility</code> - The association state. When the\\n               state is <code>accessible</code>, it returns <code>AVAILABLE</code>. When the state\\n               is <code>inaccessible</code>, it returns <code>PENDING</code> or\\n               <code>FAILED</code>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>association-id</code> - The ID of the VPC endpoint association.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>associated-resource-id</code> - The ID of the associated resource\\n               configuration.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>service-network-arn</code> - The Amazon Resource Name (ARN) of the\\n               associated service network. Only VPC endpoints of type service network will be\\n               returned.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>resource-configuration-group-arn</code> - The Amazon Resource Name (ARN) of\\n               the resource configuration of type GROUP.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#MaxResults2\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum page size.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The pagination token.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeVpcEndpointAssociationsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VpcEndpointAssociations\": {\n                    \"target\": \"com.amazonaws.ec2#VpcEndpointAssociationSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcEndpointAssociationSet\",\n                        \"smithy.api#documentation\": \"<p>Details of the endpoint associations.</p>\",\n                        \"smithy.api#xmlName\": \"vpcEndpointAssociationSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The pagination token.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeVpcEndpointConnectionNotifications\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeVpcEndpointConnectionNotificationsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeVpcEndpointConnectionNotificationsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the connection notifications for VPC endpoints and VPC endpoint\\n            services.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"ConnectionNotificationSet\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeVpcEndpointConnectionNotificationsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"ConnectionNotificationId\": {\n                    \"target\": \"com.amazonaws.ec2#ConnectionNotificationId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the notification.</p>\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>connection-notification-arn</code> - The ARN of the SNS topic for the\\n                    notification.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>connection-notification-id</code> - The ID of the\\n                    notification.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>connection-notification-state</code> - The state of the notification\\n                        (<code>Enabled</code> | <code>Disabled</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>connection-notification-type</code> - The type of notification\\n                        (<code>Topic</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>service-id</code> - The ID of the endpoint service.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>vpc-endpoint-id</code> - The ID of the VPC endpoint.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return in a single call. To retrieve the remaining\\n            results, make another request with the returned <code>NextToken</code> value.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token to request the next page of results.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeVpcEndpointConnectionNotificationsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConnectionNotificationSet\": {\n                    \"target\": \"com.amazonaws.ec2#ConnectionNotificationSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ConnectionNotificationSet\",\n                        \"smithy.api#documentation\": \"<p>The notifications.</p>\",\n                        \"smithy.api#xmlName\": \"connectionNotificationSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is\\n            <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeVpcEndpointConnections\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeVpcEndpointConnectionsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeVpcEndpointConnectionsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the VPC endpoint connections to your VPC endpoint services, including any\\n            endpoints that are pending your acceptance.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"VpcEndpointConnections\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeVpcEndpointConnectionsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>ip-address-type</code> - The IP address type (<code>ipv4</code> | <code>ipv6</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>service-id</code> - The ID of the service.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>vpc-endpoint-owner</code> - The ID of the Amazon Web Services account ID \\n\\t\\t            that owns the endpoint.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>vpc-endpoint-region</code> - The Region of the endpoint or <code>cross-region</code>\\n\\t\\t            to find endpoints for other Regions.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>vpc-endpoint-state</code> - The state of the endpoint\\n\\t\\t\\t        (<code>pendingAcceptance</code> | <code>pending</code> |\\n\\t\\t\\t        <code>available</code> | <code>deleting</code> | <code>deleted</code> |\\n\\t\\t\\t        <code>rejected</code> | <code>failed</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>vpc-endpoint-id</code> - The ID of the endpoint.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return for the request in a single page. The remaining\\n            results of the initial request can be seen by sending another request with the returned\\n                <code>NextToken</code> value. This value can be between 5 and 1,000; if\\n                <code>MaxResults</code> is given a value larger than 1,000, only 1,000 results are\\n            returned.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token to retrieve the next page of results.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeVpcEndpointConnectionsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VpcEndpointConnections\": {\n                    \"target\": \"com.amazonaws.ec2#VpcEndpointConnectionSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcEndpointConnectionSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the VPC endpoint connections.</p>\",\n                        \"smithy.api#xmlName\": \"vpcEndpointConnectionSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeVpcEndpointServiceConfigurations\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeVpcEndpointServiceConfigurationsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeVpcEndpointServiceConfigurationsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the VPC endpoint service configurations in your account (your services).</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"ServiceConfigurations\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeVpcEndpointServiceConfigurationsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"ServiceIds\": {\n                    \"target\": \"com.amazonaws.ec2#VpcEndpointServiceIdList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the endpoint services.</p>\",\n                        \"smithy.api#xmlName\": \"ServiceId\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>service-name</code> - The name of the service.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>service-id</code> - The ID of the service.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>service-state</code> - The state of the service (<code>Pending</code> |\\n                        <code>Available</code> | <code>Deleting</code> | <code>Deleted</code> |\\n                        <code>Failed</code>). </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>supported-ip-address-types</code> - The IP address type (<code>ipv4</code> | <code>ipv6</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag</code>:<key> - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value. For example, to find all resources that have a tag with the key <code>Owner</code> and the value <code>TeamA</code>, specify <code>tag:Owner</code> for the filter name and <code>TeamA</code> for the filter value.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag-key</code> - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return for the request in a single page. The remaining\\n            results of the initial request can be seen by sending another request with the returned\\n                <code>NextToken</code> value. This value can be between 5 and 1,000; if\\n                <code>MaxResults</code> is given a value larger than 1,000, only 1,000 results are\\n            returned.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token to retrieve the next page of results.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeVpcEndpointServiceConfigurationsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ServiceConfigurations\": {\n                    \"target\": \"com.amazonaws.ec2#ServiceConfigurationSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ServiceConfigurationSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the services.</p>\",\n                        \"smithy.api#xmlName\": \"serviceConfigurationSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeVpcEndpointServicePermissions\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeVpcEndpointServicePermissionsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeVpcEndpointServicePermissionsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the principals (service consumers) that are permitted to discover your VPC\\n            endpoint service. Principal ARNs with path components aren't supported.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"AllowedPrincipals\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeVpcEndpointServicePermissionsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"ServiceId\": {\n                    \"target\": \"com.amazonaws.ec2#VpcEndpointServiceId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the service.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>principal</code> - The ARN of the principal.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>principal-type</code> - The principal type (<code>All</code> |\\n\\t\\t\\t\\t\\t\\t<code>Service</code> | <code>OrganizationUnit</code> | <code>Account</code>\\n\\t\\t\\t\\t\\t| <code>User</code> | <code>Role</code>).</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return for the request in a single page. The remaining\\n            results of the initial request can be seen by sending another request with the returned\\n                <code>NextToken</code> value. This value can be between 5 and 1,000; if\\n                <code>MaxResults</code> is given a value larger than 1,000, only 1,000 results are\\n            returned.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token to retrieve the next page of results.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeVpcEndpointServicePermissionsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AllowedPrincipals\": {\n                    \"target\": \"com.amazonaws.ec2#AllowedPrincipalSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AllowedPrincipals\",\n                        \"smithy.api#documentation\": \"<p>Information about the allowed principals.</p>\",\n                        \"smithy.api#xmlName\": \"allowedPrincipals\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeVpcEndpointServices\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeVpcEndpointServicesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeVpcEndpointServicesResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes available services to which you can create a VPC endpoint.</p>\\n         <p>When the service provider and the consumer have different accounts in multiple\\n            Availability Zones, and the consumer views the VPC endpoint service information, the\\n            response only includes the common Availability Zones. For example, when the service\\n            provider account uses <code>us-east-1a</code> and <code>us-east-1c</code> and the\\n            consumer uses <code>us-east-1a</code> and <code>us-east-1b</code>, the response includes\\n            the VPC endpoint services in the common Availability Zone,\\n            <code>us-east-1a</code>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DescribeVpcEndpointServicesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"ServiceNames\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The service names.</p>\",\n                        \"smithy.api#xmlName\": \"ServiceName\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>owner</code> - The ID or alias of the Amazon Web Services account that owns \\n                    the service.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>service-name</code> - The name of the service.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>service-region</code> - The Region of the service.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>service-type</code> - The type of service (<code>Interface</code> |\\n                        <code>Gateway</code> | <code>GatewayLoadBalancer</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>supported-ip-address-types</code> - The IP address type (<code>ipv4</code> | <code>ipv6</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag</code>:<key> - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value. For example, to find all resources that have a tag with the key <code>Owner</code> and the value <code>TeamA</code>, specify <code>tag:Owner</code> for the filter name and <code>TeamA</code> for the filter value.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag-key</code> - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of items to return for this request. The request returns a token that you can specify in a subsequent call to get the next set of results.</p>\\n         <p>Constraint: If the value is greater than 1,000, we return only 1,000 items.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next set of items to return. (You received this token from a prior call.)</p>\"\n                    }\n                },\n                \"ServiceRegions\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The service Regions.</p>\",\n                        \"smithy.api#xmlName\": \"ServiceRegion\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeVpcEndpointServicesResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ServiceNames\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ServiceNameSet\",\n                        \"smithy.api#documentation\": \"<p>The supported services.</p>\",\n                        \"smithy.api#xmlName\": \"serviceNameSet\"\n                    }\n                },\n                \"ServiceDetails\": {\n                    \"target\": \"com.amazonaws.ec2#ServiceDetailSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ServiceDetailSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the service.</p>\",\n                        \"smithy.api#xmlName\": \"serviceDetailSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use when requesting the next set of items. If there are no additional items to return, the string is empty.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeVpcEndpoints\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeVpcEndpointsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeVpcEndpointsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes your VPC endpoints. The default is to describe all your VPC endpoints. \\n            Alternatively, you can specify specific VPC endpoint IDs or filter the results to\\n            include only the VPC endpoints that match specific criteria.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"VpcEndpoints\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeVpcEndpointsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"VpcEndpointIds\": {\n                    \"target\": \"com.amazonaws.ec2#VpcEndpointIdList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the VPC endpoints.</p>\",\n                        \"smithy.api#xmlName\": \"VpcEndpointId\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>ip-address-type</code> - The IP address type (<code>ipv4</code> | <code>ipv6</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>service-name</code> - The name of the service.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>service-region</code> - The Region of the service.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag</code>:<key> - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value. For example, to find all resources that have a tag with the key <code>Owner</code> and the value <code>TeamA</code>, specify <code>tag:Owner</code> for the filter name and <code>TeamA</code> for the filter value.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag-key</code> - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>vpc-id</code> - The ID of the VPC in which the endpoint resides.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>vpc-endpoint-id</code> - The ID of the endpoint.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>vpc-endpoint-state</code> - The state of the endpoint\\n                        (<code>pendingAcceptance</code> | <code>pending</code> |\\n                        <code>available</code> | <code>deleting</code> | <code>deleted</code> |\\n                        <code>rejected</code> | <code>failed</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>vpc-endpoint-type</code> - The type of VPC endpoint (<code>Interface</code> |\\n                    <code>Gateway</code> | <code>GatewayLoadBalancer</code> | <code>Resource</code> | \\n                    <code>ServiceNetwork</code>).</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of items to return for this request. The request returns a token that you can specify in a subsequent call to get the next set of results.</p>\\n         <p>Constraint: If the value is greater than 1,000, we return only 1,000 items.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next set of items to return. (You received this token from a prior call.)</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeVpcEndpointsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VpcEndpoints\": {\n                    \"target\": \"com.amazonaws.ec2#VpcEndpointSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcEndpointSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the VPC endpoints.</p>\",\n                        \"smithy.api#xmlName\": \"vpcEndpointSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use when requesting the next set of items. If there are no additional items to return, the string is empty.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeVpcPeeringConnections\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeVpcPeeringConnectionsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeVpcPeeringConnectionsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes your VPC peering connections. The default is to describe all your VPC peering connections. \\n          Alternatively, you can specify specific VPC peering connection IDs or filter the results to\\n          include only the VPC peering connections that match specific criteria.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"VpcPeeringConnections\",\n                    \"pageSize\": \"MaxResults\"\n                },\n                \"smithy.api#suppress\": [\n                    \"WaitableTraitInvalidErrorType\"\n                ],\n                \"smithy.waiters#waitable\": {\n                    \"VpcPeeringConnectionDeleted\": {\n                        \"acceptors\": [\n                            {\n                                \"state\": \"success\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"VpcPeeringConnections[].Status.Code\",\n                                        \"expected\": \"deleted\",\n                                        \"comparator\": \"allStringEquals\"\n                                    }\n                                }\n                            },\n                            {\n                                \"state\": \"success\",\n                                \"matcher\": {\n                                    \"errorType\": \"InvalidVpcPeeringConnectionID.NotFound\"\n                                }\n                            }\n                        ],\n                        \"minDelay\": 15\n                    },\n                    \"VpcPeeringConnectionExists\": {\n                        \"acceptors\": [\n                            {\n                                \"state\": \"success\",\n                                \"matcher\": {\n                                    \"success\": true\n                                }\n                            },\n                            {\n                                \"state\": \"retry\",\n                                \"matcher\": {\n                                    \"errorType\": \"InvalidVpcPeeringConnectionID.NotFound\"\n                                }\n                            }\n                        ],\n                        \"minDelay\": 15\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeVpcPeeringConnectionsMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 5,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeVpcPeeringConnectionsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token returned from a previous paginated request. Pagination continues from the end of the items returned by the previous request.</p>\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#DescribeVpcPeeringConnectionsMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of items to return for this request.\\n\\tTo get the next page of items, make another request with the token returned in the output.\\n\\tFor more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Query-Requests.html#api-pagination\\\">Pagination</a>.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"VpcPeeringConnectionIds\": {\n                    \"target\": \"com.amazonaws.ec2#VpcPeeringConnectionIdList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the VPC peering connections.</p>\\n         <p>Default: Describes all your VPC peering connections.</p>\",\n                        \"smithy.api#xmlName\": \"VpcPeeringConnectionId\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>accepter-vpc-info.cidr-block</code> - The IPv4 CIDR block of the accepter\\n                    VPC.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>accepter-vpc-info.owner-id</code> - The ID of the Amazon Web Services account that owns the\\n                    accepter VPC.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>accepter-vpc-info.vpc-id</code> - The ID of the accepter VPC.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>expiration-time</code> - The expiration date and time for the VPC peering\\n          connection.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>requester-vpc-info.cidr-block</code> - The IPv4 CIDR block of the\\n                    requester's VPC.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>requester-vpc-info.owner-id</code> - The ID of the Amazon Web Services account that owns the\\n                  requester VPC.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>requester-vpc-info.vpc-id</code> - The ID of the requester VPC.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>status-code</code> - The status of the VPC peering connection\\n                        (<code>pending-acceptance</code> | <code>failed</code> |\\n                        <code>expired</code> | <code>provisioning</code> | <code>active</code> |\\n                        <code>deleting</code> | <code>deleted</code> |\\n                    <code>rejected</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>status-message</code> - A message that provides more information about the status\\n          of the VPC peering connection, if applicable.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag</code> - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\\n    For example, to find all resources that have a tag with the key <code>Owner</code> and the value <code>TeamA</code>, specify <code>tag:Owner</code> for the filter name and <code>TeamA</code> for the filter value.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag-key</code> - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>vpc-peering-connection-id</code> - The ID of the VPC peering connection.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeVpcPeeringConnectionsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VpcPeeringConnections\": {\n                    \"target\": \"com.amazonaws.ec2#VpcPeeringConnectionList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcPeeringConnectionSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the VPC peering connections.</p>\",\n                        \"smithy.api#xmlName\": \"vpcPeeringConnectionSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to include in another request to get the next page of items. This value is <code>null</code> when there are no more items to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeVpcs\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeVpcsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeVpcsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes your VPCs. The default is to describe all your VPCs. \\n          Alternatively, you can specify specific VPC IDs or filter the results to\\n          include only the VPCs that match specific criteria.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To describe a VPC\",\n                        \"documentation\": \"This example describes the specified VPC.\",\n                        \"input\": {\n                            \"VpcIds\": [\n                                \"vpc-a01106c2\"\n                            ]\n                        },\n                        \"output\": {\n                            \"Vpcs\": [\n                                {\n                                    \"VpcId\": \"vpc-a01106c2\",\n                                    \"InstanceTenancy\": \"default\",\n                                    \"Tags\": [\n                                        {\n                                            \"Value\": \"MyVPC\",\n                                            \"Key\": \"Name\"\n                                        }\n                                    ],\n                                    \"State\": \"available\",\n                                    \"DhcpOptionsId\": \"dopt-7a8b9c2d\",\n                                    \"CidrBlock\": \"10.0.0.0/16\",\n                                    \"IsDefault\": false\n                                }\n                            ]\n                        }\n                    }\n                ],\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"Vpcs\",\n                    \"pageSize\": \"MaxResults\"\n                },\n                \"smithy.api#suppress\": [\n                    \"WaitableTraitInvalidErrorType\"\n                ],\n                \"smithy.waiters#waitable\": {\n                    \"VpcAvailable\": {\n                        \"acceptors\": [\n                            {\n                                \"state\": \"success\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"Vpcs[].State\",\n                                        \"expected\": \"available\",\n                                        \"comparator\": \"allStringEquals\"\n                                    }\n                                }\n                            }\n                        ],\n                        \"minDelay\": 15\n                    },\n                    \"VpcExists\": {\n                        \"acceptors\": [\n                            {\n                                \"state\": \"success\",\n                                \"matcher\": {\n                                    \"success\": true\n                                }\n                            },\n                            {\n                                \"state\": \"retry\",\n                                \"matcher\": {\n                                    \"errorType\": \"InvalidVpcID.NotFound\"\n                                }\n                            }\n                        ],\n                        \"minDelay\": 1\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeVpcsMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 5,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeVpcsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>cidr</code> - The primary IPv4 CIDR block of the VPC. The CIDR block you\\n                    specify must exactly match the VPC's CIDR block for information to be returned\\n                    for the VPC. Must contain the slash followed by one or two digits (for example,\\n                    <code>/28</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>cidr-block-association.cidr-block</code> - An IPv4 CIDR block associated with the\\n                    VPC.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>cidr-block-association.association-id</code> - The association ID for\\n                    an IPv4 CIDR block associated with the VPC.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>cidr-block-association.state</code> - The state of an IPv4 CIDR block\\n                    associated with the VPC.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>dhcp-options-id</code> - The ID of a set of DHCP options.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ipv6-cidr-block-association.ipv6-cidr-block</code> - An IPv6 CIDR\\n                    block associated with the VPC.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ipv6-cidr-block-association.ipv6-pool</code> - The ID of the IPv6 address pool from which the IPv6 CIDR block is allocated.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ipv6-cidr-block-association.association-id</code> - The association\\n                    ID for an IPv6 CIDR block associated with the VPC.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ipv6-cidr-block-association.state</code> - The state of an IPv6 CIDR\\n                    block associated with the VPC.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>is-default</code> - Indicates whether the VPC is the default VPC.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>owner-id</code> - The ID of the Amazon Web Services account that owns the VPC.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>state</code> - The state of the VPC (<code>pending</code> | <code>available</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag</code> - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\\n    For example, to find all resources that have a tag with the key <code>Owner</code> and the value <code>TeamA</code>, specify <code>tag:Owner</code> for the filter name and <code>TeamA</code> for the filter value.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag-key</code> - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>vpc-id</code> - The ID of the VPC.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"VpcIds\": {\n                    \"target\": \"com.amazonaws.ec2#VpcIdStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the VPCs.</p>\",\n                        \"smithy.api#xmlName\": \"VpcId\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token returned from a previous paginated request. Pagination continues from the end of the items returned by the previous request.</p>\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#DescribeVpcsMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of items to return for this request.\\n\\tTo get the next page of items, make another request with the token returned in the output.\\n\\tFor more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Query-Requests.html#api-pagination\\\">Pagination</a>.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeVpcsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to include in another request to get the next page of items. This value is <code>null</code> when there are no more items to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                },\n                \"Vpcs\": {\n                    \"target\": \"com.amazonaws.ec2#VpcList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the VPCs.</p>\",\n                        \"smithy.api#xmlName\": \"vpcSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeVpnConnections\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeVpnConnectionsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeVpnConnectionsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes one or more of your VPN connections.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/vpn/latest/s2svpn/VPC_VPN.html\\\">Amazon Web Services Site-to-Site VPN</a> in the <i>Amazon Web Services Site-to-Site VPN\\n                User Guide</i>.</p>\",\n                \"smithy.waiters#waitable\": {\n                    \"VpnConnectionAvailable\": {\n                        \"acceptors\": [\n                            {\n                                \"state\": \"success\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"VpnConnections[].State\",\n                                        \"expected\": \"available\",\n                                        \"comparator\": \"allStringEquals\"\n                                    }\n                                }\n                            },\n                            {\n                                \"state\": \"failure\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"VpnConnections[].State\",\n                                        \"expected\": \"deleting\",\n                                        \"comparator\": \"anyStringEquals\"\n                                    }\n                                }\n                            },\n                            {\n                                \"state\": \"failure\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"VpnConnections[].State\",\n                                        \"expected\": \"deleted\",\n                                        \"comparator\": \"anyStringEquals\"\n                                    }\n                                }\n                            }\n                        ],\n                        \"minDelay\": 15\n                    },\n                    \"VpnConnectionDeleted\": {\n                        \"acceptors\": [\n                            {\n                                \"state\": \"success\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"VpnConnections[].State\",\n                                        \"expected\": \"deleted\",\n                                        \"comparator\": \"allStringEquals\"\n                                    }\n                                }\n                            },\n                            {\n                                \"state\": \"failure\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"VpnConnections[].State\",\n                                        \"expected\": \"pending\",\n                                        \"comparator\": \"anyStringEquals\"\n                                    }\n                                }\n                            }\n                        ],\n                        \"minDelay\": 15\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DescribeVpnConnectionsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>customer-gateway-configuration</code> - The configuration information\\n                    for the customer gateway.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>customer-gateway-id</code> - The ID of a customer gateway associated\\n                    with the VPN connection.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>state</code> - The state of the VPN connection (<code>pending</code> |\\n                        <code>available</code> | <code>deleting</code> |\\n                    <code>deleted</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>option.static-routes-only</code> - Indicates whether the connection has\\n                    static routes only. Used for devices that do not support Border Gateway Protocol\\n                    (BGP).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>route.destination-cidr-block</code> - The destination CIDR block. This\\n                    corresponds to the subnet used in a customer data center.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>bgp-asn</code> - The BGP Autonomous System Number (ASN) associated with\\n                    a BGP device.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag</code>:<key> - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\\n    For example, to find all resources that have a tag with the key <code>Owner</code> and the value <code>TeamA</code>, specify <code>tag:Owner</code> for the filter name and <code>TeamA</code> for the filter value.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag-key</code> - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>type</code> - The type of VPN connection. Currently the only supported\\n                    type is <code>ipsec.1</code>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>vpn-connection-id</code> - The ID of the VPN connection.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>vpn-gateway-id</code> - The ID of a virtual private gateway associated\\n                    with the VPN connection.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>transit-gateway-id</code> - The ID of a transit gateway associated with\\n                    the VPN connection.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"VpnConnectionIds\": {\n                    \"target\": \"com.amazonaws.ec2#VpnConnectionIdStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more VPN connection IDs.</p>\\n         <p>Default: Describes your VPN connections.</p>\",\n                        \"smithy.api#xmlName\": \"VpnConnectionId\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually\\n            making the request, and provides an error response. If you have the required\\n            permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is\\n                <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the parameters for DescribeVpnConnections.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeVpnConnectionsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VpnConnections\": {\n                    \"target\": \"com.amazonaws.ec2#VpnConnectionList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpnConnectionSet\",\n                        \"smithy.api#documentation\": \"<p>Information about one or more VPN connections.</p>\",\n                        \"smithy.api#xmlName\": \"vpnConnectionSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the output of DescribeVpnConnections.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeVpnGateways\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DescribeVpnGatewaysRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DescribeVpnGatewaysResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes one or more of your virtual private gateways.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/vpn/latest/s2svpn/VPC_VPN.html\\\">Amazon Web Services Site-to-Site VPN</a> in the <i>Amazon Web Services Site-to-Site VPN\\n                User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DescribeVpnGatewaysRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>amazon-side-asn</code> - The Autonomous System Number (ASN) for the\\n                    Amazon side of the gateway.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>attachment.state</code> - The current state of the attachment between\\n                    the gateway and the VPC (<code>attaching</code> | <code>attached</code> |\\n                        <code>detaching</code> | <code>detached</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>attachment.vpc-id</code> - The ID of an attached VPC.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>availability-zone</code> - The Availability Zone for the virtual private\\n                    gateway (if applicable).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>state</code> - The state of the virtual private gateway\\n                        (<code>pending</code> | <code>available</code> | <code>deleting</code> |\\n                        <code>deleted</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag</code>:<key> - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\\n    For example, to find all resources that have a tag with the key <code>Owner</code> and the value <code>TeamA</code>, specify <code>tag:Owner</code> for the filter name and <code>TeamA</code> for the filter value.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag-key</code> - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>type</code> - The type of virtual private gateway. Currently the only\\n                    supported type is <code>ipsec.1</code>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>vpn-gateway-id</code> - The ID of the virtual private gateway.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"VpnGatewayIds\": {\n                    \"target\": \"com.amazonaws.ec2#VpnGatewayIdStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more virtual private gateway IDs.</p>\\n         <p>Default: Describes all your virtual private gateways.</p>\",\n                        \"smithy.api#xmlName\": \"VpnGatewayId\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually\\n            making the request, and provides an error response. If you have the required\\n            permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is\\n                <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the parameters for DescribeVpnGateways.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DescribeVpnGatewaysResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VpnGateways\": {\n                    \"target\": \"com.amazonaws.ec2#VpnGatewayList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpnGatewaySet\",\n                        \"smithy.api#documentation\": \"<p>Information about one or more virtual private gateways.</p>\",\n                        \"smithy.api#xmlName\": \"vpnGatewaySet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the output of DescribeVpnGateways.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DestinationFileFormat\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"plain_text\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"plain-text\"\n                    }\n                },\n                \"parquet\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"parquet\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DestinationOptionsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"FileFormat\": {\n                    \"target\": \"com.amazonaws.ec2#DestinationFileFormat\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The format for the flow log. The default is <code>plain-text</code>.</p>\"\n                    }\n                },\n                \"HiveCompatiblePartitions\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether to use Hive-compatible prefixes for flow logs stored in Amazon S3.\\n            The default is <code>false</code>.</p>\"\n                    }\n                },\n                \"PerHourPartition\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether to partition the flow log per hour. This reduces the cost and response \\n            time for queries. The default is <code>false</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the destination options for a flow log.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DestinationOptionsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"FileFormat\": {\n                    \"target\": \"com.amazonaws.ec2#DestinationFileFormat\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"FileFormat\",\n                        \"smithy.api#documentation\": \"<p>The format for the flow log.</p>\",\n                        \"smithy.api#xmlName\": \"fileFormat\"\n                    }\n                },\n                \"HiveCompatiblePartitions\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"HiveCompatiblePartitions\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether to use Hive-compatible prefixes for flow logs stored in Amazon S3.</p>\",\n                        \"smithy.api#xmlName\": \"hiveCompatiblePartitions\"\n                    }\n                },\n                \"PerHourPartition\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PerHourPartition\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether to partition the flow log per hour.</p>\",\n                        \"smithy.api#xmlName\": \"perHourPartition\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the destination options for a flow log.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DetachClassicLinkVpc\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DetachClassicLinkVpcRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DetachClassicLinkVpcResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>This action is deprecated.</p>\\n         </note>\\n         <p>Unlinks (detaches) a linked EC2-Classic instance from a VPC. After the instance has been unlinked, \\n\\t\\t    the VPC security groups are no longer associated with it. An instance is automatically unlinked from \\n\\t\\t    a VPC when it's stopped.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DetachClassicLinkVpcRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"InstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceId\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the instance to unlink from the VPC.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"instanceId\"\n                    }\n                },\n                \"VpcId\": {\n                    \"target\": \"com.amazonaws.ec2#VpcId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcId\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the VPC to which the instance is linked.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"vpcId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DetachClassicLinkVpcResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Return\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Return\",\n                        \"smithy.api#documentation\": \"<p>Returns <code>true</code> if the request succeeds; otherwise, it returns an error.</p>\",\n                        \"smithy.api#xmlName\": \"return\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DetachInternetGateway\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DetachInternetGatewayRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Detaches an internet gateway from a VPC, disabling connectivity between the internet\\n\\t\\t\\tand the VPC. The VPC must not contain any running instances with Elastic IP addresses or\\n\\t\\t\\tpublic IPv4 addresses.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To detach an Internet gateway from a VPC\",\n                        \"documentation\": \"This example detaches the specified Internet gateway from the specified VPC.\",\n                        \"input\": {\n                            \"InternetGatewayId\": \"igw-c0a643a9\",\n                            \"VpcId\": \"vpc-a01106c2\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#DetachInternetGatewayRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"InternetGatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#InternetGatewayId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InternetGatewayId\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the internet gateway.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"internetGatewayId\"\n                    }\n                },\n                \"VpcId\": {\n                    \"target\": \"com.amazonaws.ec2#VpcId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcId\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the VPC.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"vpcId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DetachNetworkInterface\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DetachNetworkInterfaceRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Detaches a network interface from an instance.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To detach a network interface from an instance\",\n                        \"documentation\": \"This example detaches the specified network interface from its attached instance.\",\n                        \"input\": {\n                            \"AttachmentId\": \"eni-attach-66c4350a\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#DetachNetworkInterfaceRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually\\n            making the request, and provides an error response. If you have the required\\n            permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is\\n                <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"AttachmentId\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInterfaceAttachmentId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AttachmentId\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the attachment.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"attachmentId\"\n                    }\n                },\n                \"Force\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Force\",\n                        \"smithy.api#documentation\": \"<p>Specifies whether to force a detachment.</p>\\n         <note>\\n            <ul>\\n               <li>\\n                  <p>Use the <code>Force</code> parameter only as a last resort to detach a\\n                        network interface from a failed instance. </p>\\n               </li>\\n               <li>\\n                  <p>If you use the <code>Force</code> parameter to detach a network interface,\\n                        you might not be able to attach a different network interface to the same\\n                        index on the instance without first stopping and starting the\\n                        instance.</p>\\n               </li>\\n               <li>\\n                  <p>If you force the detachment of a network interface, the <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html\\\">instance\\n                            metadata</a> might not get updated. This means that the attributes\\n                        associated with the detached network interface might still be visible. The\\n                        instance metadata will get updated when you stop and start the\\n                        instance.</p>\\n               </li>\\n            </ul>\\n         </note>\",\n                        \"smithy.api#xmlName\": \"force\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the parameters for DetachNetworkInterface.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DetachVerifiedAccessTrustProvider\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DetachVerifiedAccessTrustProviderRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DetachVerifiedAccessTrustProviderResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Detaches the specified Amazon Web Services Verified Access trust provider from the specified Amazon Web Services Verified Access instance.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DetachVerifiedAccessTrustProviderRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VerifiedAccessInstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessInstanceId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the Verified Access instance.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"VerifiedAccessTrustProviderId\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessTrustProviderId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the Verified Access trust provider.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A unique, case-sensitive token that you provide to ensure idempotency of your\\n            modification request. For more information, see <a href=\\\"https://docs.aws.amazon.com/ec2/latest/devguide/ec2-api-idempotency.html\\\">Ensuring idempotency</a>.</p>\",\n                        \"smithy.api#idempotencyToken\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DetachVerifiedAccessTrustProviderResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VerifiedAccessTrustProvider\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessTrustProvider\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VerifiedAccessTrustProvider\",\n                        \"smithy.api#documentation\": \"<p>Details about the Verified Access trust provider.</p>\",\n                        \"smithy.api#xmlName\": \"verifiedAccessTrustProvider\"\n                    }\n                },\n                \"VerifiedAccessInstance\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessInstance\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VerifiedAccessInstance\",\n                        \"smithy.api#documentation\": \"<p>Details about the Verified Access instance.</p>\",\n                        \"smithy.api#xmlName\": \"verifiedAccessInstance\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DetachVolume\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DetachVolumeRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#VolumeAttachment\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Detaches an EBS volume from an instance. Make sure to unmount any file systems on the\\n      device within your operating system before detaching the volume. Failure to do so can result\\n      in the volume becoming stuck in the <code>busy</code> state while detaching. If this happens,\\n      detachment can be delayed indefinitely until you unmount the volume, force detachment, reboot\\n      the instance, or all three. If an EBS volume is the root device of an instance, it can't be\\n      detached while the instance is running. To detach the root volume, stop the instance\\n      first.</p>\\n         <p>When a volume with an Amazon Web Services Marketplace product code is detached from an instance, the\\n      product code is no longer associated with the instance.</p>\\n         <p>You can't detach or force detach volumes that are attached to Amazon Web Services-managed resources. \\n      Attempting to do this results in the <code>UnsupportedOperationException</code> \\n      exception.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/ebs/latest/userguide/ebs-detaching-volume.html\\\">Detach an Amazon EBS volume</a> in the\\n        <i>Amazon EBS User Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To detach a volume from an instance\",\n                        \"documentation\": \"This example detaches the volume (``vol-049df61146c4d7901``) from the instance it is attached to.\",\n                        \"input\": {\n                            \"VolumeId\": \"vol-1234567890abcdef0\"\n                        },\n                        \"output\": {\n                            \"AttachTime\": \"2014-02-27T19:23:06.000Z\",\n                            \"InstanceId\": \"i-1234567890abcdef0\",\n                            \"VolumeId\": \"vol-049df61146c4d7901\",\n                            \"State\": \"detaching\",\n                            \"Device\": \"/dev/sdb\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#DetachVolumeRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Device\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The device name.</p>\"\n                    }\n                },\n                \"Force\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Forces detachment if the previous detachment attempt did not occur cleanly (for example,\\n      logging into an instance, unmounting the volume, and detaching normally). This option can lead\\n      to data loss or a corrupted file system. Use this option only as a last resort to detach a\\n      volume from a failed instance. The instance won't have an opportunity to flush file system\\n      caches or file system metadata. If you use this option, you must perform file system check and\\n      repair procedures.</p>\"\n                    }\n                },\n                \"InstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceIdForResolver\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the instance. If you are detaching a Multi-Attach enabled volume, you must specify an instance ID.</p>\"\n                    }\n                },\n                \"VolumeId\": {\n                    \"target\": \"com.amazonaws.ec2#VolumeIdWithResolver\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the volume.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DetachVpnGateway\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DetachVpnGatewayRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Detaches a virtual private gateway from a VPC. You do this if you're planning to turn\\n            off the VPC and not use it anymore. You can confirm a virtual private gateway has been\\n            completely detached from a VPC by describing the virtual private gateway (any\\n            attachments to the virtual private gateway are also described).</p>\\n         <p>You must wait for the attachment's state to switch to <code>detached</code> before you\\n            can delete the VPC or attach a different VPC to the virtual private gateway.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DetachVpnGatewayRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VpcId\": {\n                    \"target\": \"com.amazonaws.ec2#VpcId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the VPC.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"VpnGatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#VpnGatewayId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the virtual private gateway.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually\\n            making the request, and provides an error response. If you have the required\\n            permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is\\n                <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the parameters for DetachVpnGateway.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DeviceOptions\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TenantId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TenantId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the tenant application with the device-identity provider.</p>\",\n                        \"smithy.api#xmlName\": \"tenantId\"\n                    }\n                },\n                \"PublicSigningKeyUrl\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PublicSigningKeyUrl\",\n                        \"smithy.api#documentation\": \"<p>\\n         The URL Amazon Web Services Verified Access will use to verify the authenticity of the device tokens.\\n      </p>\",\n                        \"smithy.api#xmlName\": \"publicSigningKeyUrl\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the options for an Amazon Web Services Verified Access device-identity based trust provider.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DeviceTrustProviderType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"jamf\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"jamf\"\n                    }\n                },\n                \"crowdstrike\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"crowdstrike\"\n                    }\n                },\n                \"jumpcloud\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"jumpcloud\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DeviceTrustProviderTypeList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#DeviceTrustProviderType\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DeviceType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ebs\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ebs\"\n                    }\n                },\n                \"instance_store\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"instance-store\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DhcpConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Key\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Key\",\n                        \"smithy.api#documentation\": \"<p>The name of a DHCP option.</p>\",\n                        \"smithy.api#xmlName\": \"key\"\n                    }\n                },\n                \"Values\": {\n                    \"target\": \"com.amazonaws.ec2#DhcpConfigurationValueList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ValueSet\",\n                        \"smithy.api#documentation\": \"<p>The values for the DHCP option.</p>\",\n                        \"smithy.api#xmlName\": \"valueSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a DHCP configuration option.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DhcpConfigurationList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#DhcpConfiguration\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DhcpConfigurationValueList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#AttributeValue\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DhcpOptions\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"OwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OwnerId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Amazon Web Services account that owns the DHCP options set.</p>\",\n                        \"smithy.api#xmlName\": \"ownerId\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>Any tags assigned to the DHCP options set.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                },\n                \"DhcpOptionsId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DhcpOptionsId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the set of DHCP options.</p>\",\n                        \"smithy.api#xmlName\": \"dhcpOptionsId\"\n                    }\n                },\n                \"DhcpConfigurations\": {\n                    \"target\": \"com.amazonaws.ec2#DhcpConfigurationList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DhcpConfigurationSet\",\n                        \"smithy.api#documentation\": \"<p>The DHCP options in the set.</p>\",\n                        \"smithy.api#xmlName\": \"dhcpConfigurationSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The set of DHCP options.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DhcpOptionsId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#DhcpOptionsIdStringList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#DhcpOptionsId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"DhcpOptionsId\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DhcpOptionsList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#DhcpOptions\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DirectoryServiceAuthentication\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DirectoryId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DirectoryId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Active Directory used for authentication.</p>\",\n                        \"smithy.api#xmlName\": \"directoryId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes an Active Directory.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DirectoryServiceAuthenticationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DirectoryId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the Active Directory to be used for authentication.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the Active Directory to be used for client authentication.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DisableAddressTransfer\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DisableAddressTransferRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DisableAddressTransferResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Disables Elastic IP address transfer. For more information, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/userguide/vpc-eips.html#transfer-EIPs-intro\\\">Transfer Elastic IP addresses</a> in the <i>Amazon VPC User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DisableAddressTransferRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AllocationId\": {\n                    \"target\": \"com.amazonaws.ec2#AllocationId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The allocation ID of an Elastic IP address.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DisableAddressTransferResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AddressTransfer\": {\n                    \"target\": \"com.amazonaws.ec2#AddressTransfer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AddressTransfer\",\n                        \"smithy.api#documentation\": \"<p>An Elastic IP address transfer.</p>\",\n                        \"smithy.api#xmlName\": \"addressTransfer\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DisableAllowedImagesSettings\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DisableAllowedImagesSettingsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DisableAllowedImagesSettingsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Disables Allowed AMIs for your account in the specified Amazon Web Services Region. When set to\\n      <code>disabled</code>, the image criteria in your Allowed AMIs settings do not apply, and no\\n      restrictions are placed on AMI discoverability or usage. Users in your account can launch\\n      instances using any public AMI or AMI shared with your account.</p>\\n         <note>\\n            <p>The Allowed AMIs feature does not restrict the AMIs owned by your account. Regardless of\\n        the criteria you set, the AMIs created by your account will always be discoverable and\\n        usable by users in your account.</p>\\n         </note>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-allowed-amis.html\\\">Control the discovery and use of AMIs in\\n      Amazon EC2 with Allowed AMIs</a> in\\n      <i>Amazon EC2 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DisableAllowedImagesSettingsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n\\t\\t\\tand provides an error response. If you have the required permissions, the error response is \\n\\t\\t\\t<code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DisableAllowedImagesSettingsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AllowedImagesSettingsState\": {\n                    \"target\": \"com.amazonaws.ec2#AllowedImagesSettingsDisabledState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AllowedImagesSettingsState\",\n                        \"smithy.api#documentation\": \"<p>Returns <code>disabled</code> if the request succeeds; otherwise, it returns an\\n      error.</p>\",\n                        \"smithy.api#xmlName\": \"allowedImagesSettingsState\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DisableAwsNetworkPerformanceMetricSubscription\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DisableAwsNetworkPerformanceMetricSubscriptionRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DisableAwsNetworkPerformanceMetricSubscriptionResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Disables Infrastructure Performance metric subscriptions.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DisableAwsNetworkPerformanceMetricSubscriptionRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Source\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The source Region or Availability Zone that the metric subscription is disabled for. For example, <code>us-east-1</code>.</p>\"\n                    }\n                },\n                \"Destination\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The target Region or Availability Zone that the metric subscription is disabled for. For example, <code>eu-north-1</code>.</p>\"\n                    }\n                },\n                \"Metric\": {\n                    \"target\": \"com.amazonaws.ec2#MetricType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The metric used for the disabled subscription.</p>\"\n                    }\n                },\n                \"Statistic\": {\n                    \"target\": \"com.amazonaws.ec2#StatisticType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The statistic used for the disabled subscription. </p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DisableAwsNetworkPerformanceMetricSubscriptionResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Output\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Output\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether the unsubscribe action was successful.</p>\",\n                        \"smithy.api#xmlName\": \"output\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DisableEbsEncryptionByDefault\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DisableEbsEncryptionByDefaultRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DisableEbsEncryptionByDefaultResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Disables EBS encryption by default for your account in the current Region.</p>\\n         <p>After you disable encryption by default, you can still create encrypted volumes by \\n      enabling encryption when you create each volume.</p>\\n         <p>Disabling encryption by default does not change the encryption status of your\\n      existing volumes.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/ebs/latest/userguide/ebs-encryption.html\\\">Amazon EBS encryption</a> in the\\n      <i>Amazon EBS User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DisableEbsEncryptionByDefaultRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DisableEbsEncryptionByDefaultResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"EbsEncryptionByDefault\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EbsEncryptionByDefault\",\n                        \"smithy.api#documentation\": \"<p>The updated status of encryption by default.</p>\",\n                        \"smithy.api#xmlName\": \"ebsEncryptionByDefault\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DisableFastLaunch\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DisableFastLaunchRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DisableFastLaunchResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Discontinue Windows fast launch for a Windows AMI, and clean up existing pre-provisioned\\n      snapshots. After you disable Windows fast launch, the AMI uses the standard launch process for\\n      each new instance. Amazon EC2 must remove all pre-provisioned snapshots before you can enable\\n      Windows fast launch again.</p>\\n         <note>\\n            <p>You can only change these settings for Windows AMIs that you own or that have been\\n        shared with you.</p>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.ec2#DisableFastLaunchRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ImageId\": {\n                    \"target\": \"com.amazonaws.ec2#ImageId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>Specify the ID of the image for which to disable Windows fast launch.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Force\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Forces the image settings to turn off Windows fast launch for your Windows AMI. This\\n      parameter overrides any errors that are encountered while cleaning up resources in your\\n      account.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n\\t\\t\\tand provides an error response. If you have the required permissions, the error response is \\n\\t\\t\\t<code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DisableFastLaunchResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ImageId\": {\n                    \"target\": \"com.amazonaws.ec2#ImageId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ImageId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the image for which Windows fast launch was disabled.</p>\",\n                        \"smithy.api#xmlName\": \"imageId\"\n                    }\n                },\n                \"ResourceType\": {\n                    \"target\": \"com.amazonaws.ec2#FastLaunchResourceType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResourceType\",\n                        \"smithy.api#documentation\": \"<p>The pre-provisioning resource type that must be cleaned after turning off Windows fast\\n      launch for the Windows AMI. Supported values include: <code>snapshot</code>.</p>\",\n                        \"smithy.api#xmlName\": \"resourceType\"\n                    }\n                },\n                \"SnapshotConfiguration\": {\n                    \"target\": \"com.amazonaws.ec2#FastLaunchSnapshotConfigurationResponse\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SnapshotConfiguration\",\n                        \"smithy.api#documentation\": \"<p>Parameters that were used for Windows fast launch for the Windows AMI before Windows fast\\n      launch was disabled. This informs the clean-up process.</p>\",\n                        \"smithy.api#xmlName\": \"snapshotConfiguration\"\n                    }\n                },\n                \"LaunchTemplate\": {\n                    \"target\": \"com.amazonaws.ec2#FastLaunchLaunchTemplateSpecificationResponse\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LaunchTemplate\",\n                        \"smithy.api#documentation\": \"<p>The launch template that was used to launch Windows instances from pre-provisioned\\n      snapshots.</p>\",\n                        \"smithy.api#xmlName\": \"launchTemplate\"\n                    }\n                },\n                \"MaxParallelLaunches\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MaxParallelLaunches\",\n                        \"smithy.api#documentation\": \"<p>The maximum number of instances that Amazon EC2 can launch at the same time to create\\n      pre-provisioned snapshots for Windows fast launch.</p>\",\n                        \"smithy.api#xmlName\": \"maxParallelLaunches\"\n                    }\n                },\n                \"OwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OwnerId\",\n                        \"smithy.api#documentation\": \"<p>The owner of the Windows AMI for which Windows fast launch was disabled.</p>\",\n                        \"smithy.api#xmlName\": \"ownerId\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#FastLaunchStateCode\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The current state of Windows fast launch for the specified Windows AMI.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                },\n                \"StateTransitionReason\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"StateTransitionReason\",\n                        \"smithy.api#documentation\": \"<p>The reason that the state changed for Windows fast launch for the Windows AMI.</p>\",\n                        \"smithy.api#xmlName\": \"stateTransitionReason\"\n                    }\n                },\n                \"StateTransitionTime\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"StateTransitionTime\",\n                        \"smithy.api#documentation\": \"<p>The time that the state changed for Windows fast launch for the Windows AMI.</p>\",\n                        \"smithy.api#xmlName\": \"stateTransitionTime\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DisableFastSnapshotRestoreErrorItem\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SnapshotId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SnapshotId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the snapshot.</p>\",\n                        \"smithy.api#xmlName\": \"snapshotId\"\n                    }\n                },\n                \"FastSnapshotRestoreStateErrors\": {\n                    \"target\": \"com.amazonaws.ec2#DisableFastSnapshotRestoreStateErrorSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"FastSnapshotRestoreStateErrorSet\",\n                        \"smithy.api#documentation\": \"<p>The errors.</p>\",\n                        \"smithy.api#xmlName\": \"fastSnapshotRestoreStateErrorSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains information about the errors that occurred when disabling fast snapshot restores.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DisableFastSnapshotRestoreErrorSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#DisableFastSnapshotRestoreErrorItem\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DisableFastSnapshotRestoreStateError\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Code\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Code\",\n                        \"smithy.api#documentation\": \"<p>The error code.</p>\",\n                        \"smithy.api#xmlName\": \"code\"\n                    }\n                },\n                \"Message\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Message\",\n                        \"smithy.api#documentation\": \"<p>The error message.</p>\",\n                        \"smithy.api#xmlName\": \"message\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes an error that occurred when disabling fast snapshot restores.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DisableFastSnapshotRestoreStateErrorItem\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AvailabilityZone\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AvailabilityZone\",\n                        \"smithy.api#documentation\": \"<p>The Availability Zone.</p>\",\n                        \"smithy.api#xmlName\": \"availabilityZone\"\n                    }\n                },\n                \"Error\": {\n                    \"target\": \"com.amazonaws.ec2#DisableFastSnapshotRestoreStateError\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Error\",\n                        \"smithy.api#documentation\": \"<p>The error.</p>\",\n                        \"smithy.api#xmlName\": \"error\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains information about an error that occurred when disabling fast snapshot restores.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DisableFastSnapshotRestoreStateErrorSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#DisableFastSnapshotRestoreStateErrorItem\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DisableFastSnapshotRestoreSuccessItem\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SnapshotId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SnapshotId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the snapshot.</p>\",\n                        \"smithy.api#xmlName\": \"snapshotId\"\n                    }\n                },\n                \"AvailabilityZone\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AvailabilityZone\",\n                        \"smithy.api#documentation\": \"<p>The Availability Zone.</p>\",\n                        \"smithy.api#xmlName\": \"availabilityZone\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#FastSnapshotRestoreStateCode\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The state of fast snapshot restores for the snapshot.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                },\n                \"StateTransitionReason\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"StateTransitionReason\",\n                        \"smithy.api#documentation\": \"<p>The reason for the state transition. The possible values are as follows:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>Client.UserInitiated</code> - The state successfully transitioned to <code>enabling</code> or\\n          <code>disabling</code>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>Client.UserInitiated - Lifecycle state transition</code> - The state successfully transitioned \\n          to <code>optimizing</code>, <code>enabled</code>, or <code>disabled</code>.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"stateTransitionReason\"\n                    }\n                },\n                \"OwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OwnerId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Amazon Web Services account that enabled fast snapshot restores on the snapshot.</p>\",\n                        \"smithy.api#xmlName\": \"ownerId\"\n                    }\n                },\n                \"OwnerAlias\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OwnerAlias\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services owner alias that enabled fast snapshot restores on the snapshot. This is intended for future use.</p>\",\n                        \"smithy.api#xmlName\": \"ownerAlias\"\n                    }\n                },\n                \"EnablingTime\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EnablingTime\",\n                        \"smithy.api#documentation\": \"<p>The time at which fast snapshot restores entered the <code>enabling</code> state.</p>\",\n                        \"smithy.api#xmlName\": \"enablingTime\"\n                    }\n                },\n                \"OptimizingTime\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OptimizingTime\",\n                        \"smithy.api#documentation\": \"<p>The time at which fast snapshot restores entered the <code>optimizing</code> state.</p>\",\n                        \"smithy.api#xmlName\": \"optimizingTime\"\n                    }\n                },\n                \"EnabledTime\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EnabledTime\",\n                        \"smithy.api#documentation\": \"<p>The time at which fast snapshot restores entered the <code>enabled</code> state.</p>\",\n                        \"smithy.api#xmlName\": \"enabledTime\"\n                    }\n                },\n                \"DisablingTime\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DisablingTime\",\n                        \"smithy.api#documentation\": \"<p>The time at which fast snapshot restores entered the <code>disabling</code> state.</p>\",\n                        \"smithy.api#xmlName\": \"disablingTime\"\n                    }\n                },\n                \"DisabledTime\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DisabledTime\",\n                        \"smithy.api#documentation\": \"<p>The time at which fast snapshot restores entered the <code>disabled</code> state.</p>\",\n                        \"smithy.api#xmlName\": \"disabledTime\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes fast snapshot restores that were successfully disabled.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DisableFastSnapshotRestoreSuccessSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#DisableFastSnapshotRestoreSuccessItem\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DisableFastSnapshotRestores\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DisableFastSnapshotRestoresRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DisableFastSnapshotRestoresResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Disables fast snapshot restores for the specified snapshots in the specified Availability Zones.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DisableFastSnapshotRestoresRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AvailabilityZones\": {\n                    \"target\": \"com.amazonaws.ec2#AvailabilityZoneStringList\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>One or more Availability Zones. For example, <code>us-east-2a</code>.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"AvailabilityZone\"\n                    }\n                },\n                \"SourceSnapshotIds\": {\n                    \"target\": \"com.amazonaws.ec2#SnapshotIdStringList\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The IDs of one or more snapshots. For example, <code>snap-1234567890abcdef0</code>.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"SourceSnapshotId\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DisableFastSnapshotRestoresResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Successful\": {\n                    \"target\": \"com.amazonaws.ec2#DisableFastSnapshotRestoreSuccessSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Successful\",\n                        \"smithy.api#documentation\": \"<p>Information about the snapshots for which fast snapshot restores were successfully disabled.</p>\",\n                        \"smithy.api#xmlName\": \"successful\"\n                    }\n                },\n                \"Unsuccessful\": {\n                    \"target\": \"com.amazonaws.ec2#DisableFastSnapshotRestoreErrorSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Unsuccessful\",\n                        \"smithy.api#documentation\": \"<p>Information about the snapshots for which fast snapshot restores could not be disabled.</p>\",\n                        \"smithy.api#xmlName\": \"unsuccessful\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DisableImage\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DisableImageRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DisableImageResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Sets the AMI state to <code>disabled</code> and removes all launch permissions from the\\n      AMI. A disabled AMI can't be used for instance launches.</p>\\n         <p>A disabled AMI can't be shared. If an AMI was public or previously shared, it is made\\n      private. If an AMI was shared with an Amazon Web Services account, organization, or Organizational Unit,\\n      they lose access to the disabled AMI. </p>\\n         <p>A disabled AMI does not appear in <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeImages.html\\\">DescribeImages</a> API calls by\\n      default.</p>\\n         <p>Only the AMI owner can disable an AMI.</p>\\n         <p>You can re-enable a disabled AMI using <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_EnableImage.html\\\">EnableImage</a>.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/disable-an-ami.html\\\">Disable an AMI</a> in the\\n      <i>Amazon EC2 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DisableImageBlockPublicAccess\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DisableImageBlockPublicAccessRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DisableImageBlockPublicAccessResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Disables <i>block public access for AMIs</i> at the account level in the\\n      specified Amazon Web Services Region. This removes the <i>block public access</i> restriction\\n      from your account. With the restriction removed, you can publicly share your AMIs in the\\n      specified Amazon Web Services Region.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/block-public-access-to-amis.html\\\">Block\\n      public access to your AMIs</a> in the <i>Amazon EC2 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DisableImageBlockPublicAccessRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n\\t\\t\\tand provides an error response. If you have the required permissions, the error response is \\n\\t\\t\\t<code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DisableImageBlockPublicAccessResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ImageBlockPublicAccessState\": {\n                    \"target\": \"com.amazonaws.ec2#ImageBlockPublicAccessDisabledState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ImageBlockPublicAccessState\",\n                        \"smithy.api#documentation\": \"<p>Returns <code>unblocked</code> if the request succeeds; otherwise, it returns an\\n      error.</p>\",\n                        \"smithy.api#xmlName\": \"imageBlockPublicAccessState\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DisableImageDeprecation\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DisableImageDeprecationRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DisableImageDeprecationResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Cancels the deprecation of the specified AMI.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ami-deprecate.html\\\">Deprecate an Amazon EC2 AMI</a> in the\\n      <i>Amazon EC2 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DisableImageDeprecationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ImageId\": {\n                    \"target\": \"com.amazonaws.ec2#ImageId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the AMI.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n\\t\\t\\tand provides an error response. If you have the required permissions, the error response is \\n\\t\\t\\t<code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DisableImageDeprecationResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Return\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Return\",\n                        \"smithy.api#documentation\": \"<p>Returns <code>true</code> if the request succeeds; otherwise, it returns an error.</p>\",\n                        \"smithy.api#xmlName\": \"return\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DisableImageDeregistrationProtection\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DisableImageDeregistrationProtectionRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DisableImageDeregistrationProtectionResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Disables deregistration protection for an AMI. When deregistration protection is disabled,\\n      the AMI can be deregistered.</p>\\n         <p>If you chose to include a 24-hour cooldown period when you enabled deregistration\\n      protection for the AMI, then, when you disable deregistration protection, you won’t\\n      immediately be able to deregister the AMI.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ami-deregistration-protection.html\\\">Protect an Amazon EC2 AMI from\\n        deregistration</a> in the <i>Amazon EC2 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DisableImageDeregistrationProtectionRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ImageId\": {\n                    \"target\": \"com.amazonaws.ec2#ImageId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the AMI.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n\\t\\t\\tand provides an error response. If you have the required permissions, the error response is \\n\\t\\t\\t<code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DisableImageDeregistrationProtectionResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Return\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Return\",\n                        \"smithy.api#documentation\": \"<p>Returns <code>true</code> if the request succeeds; otherwise, it returns an error.</p>\",\n                        \"smithy.api#xmlName\": \"return\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DisableImageRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ImageId\": {\n                    \"target\": \"com.amazonaws.ec2#ImageId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the AMI.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n\\t\\t\\tand provides an error response. If you have the required permissions, the error response is \\n\\t\\t\\t<code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DisableImageResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Return\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Return\",\n                        \"smithy.api#documentation\": \"<p>Returns <code>true</code> if the request succeeds; otherwise, it returns an error.</p>\",\n                        \"smithy.api#xmlName\": \"return\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DisableIpamOrganizationAdminAccount\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DisableIpamOrganizationAdminAccountRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DisableIpamOrganizationAdminAccountResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Disable the IPAM account. For more information, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/ipam/enable-integ-ipam.html\\\">Enable integration with Organizations</a> in the <i>Amazon VPC IPAM User Guide</i>.\\n      </p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DisableIpamOrganizationAdminAccountRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A check for whether you have the required permissions for the action without actually making the request \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"DelegatedAdminAccountId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The Organizations member account ID that you want to disable as IPAM account.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DisableIpamOrganizationAdminAccountResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Success\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Success\",\n                        \"smithy.api#documentation\": \"<p>The result of disabling the IPAM account.</p>\",\n                        \"smithy.api#xmlName\": \"success\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DisableRouteServerPropagation\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DisableRouteServerPropagationRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DisableRouteServerPropagationResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Disables route propagation from a route server to a specified route table.</p>\\n         <p>When enabled, route server propagation installs the routes in the FIB on the route table you've specified. Route server supports IPv4 and IPv6 route propagation.</p>\\n         <p>Amazon VPC Route Server simplifies routing for traffic between workloads that are deployed within a VPC and its internet gateways. With this feature, \\nVPC Route Server dynamically updates VPC and internet gateway route tables with your preferred IPv4 or IPv6 routes to achieve routing fault tolerance for those workloads. This enables you to automatically reroute traffic within a VPC, which increases the manageability of VPC routing and interoperability with third-party workloads.</p>\\n         <p>Route server supports the follow route table types:</p>\\n         <ul>\\n            <li>\\n               <p>VPC route tables not associated with subnets</p>\\n            </li>\\n            <li>\\n               <p>Subnet route tables</p>\\n            </li>\\n            <li>\\n               <p>Internet gateway route tables</p>\\n            </li>\\n         </ul>\\n         <p>Route server does not support route tables associated with virtual private gateways. To propagate routes into a transit gateway route table, use <a href=\\\"https://docs.aws.amazon.com/vpc/latest/tgw/tgw-connect.html\\\">Transit Gateway Connect</a>.</p>\\n         <p>For more information see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/userguide/dynamic-routing-route-server.html\\\">Dynamic routing in your VPC with VPC Route Server</a> in the <i>Amazon VPC User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DisableRouteServerPropagationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RouteServerId\": {\n                    \"target\": \"com.amazonaws.ec2#RouteServerId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the route server for which to disable propagation.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"RouteTableId\": {\n                    \"target\": \"com.amazonaws.ec2#RouteTableId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the route table for which to disable route server propagation.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A check for whether you have the required permissions for the action without actually making the request \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DisableRouteServerPropagationResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RouteServerPropagation\": {\n                    \"target\": \"com.amazonaws.ec2#RouteServerPropagation\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RouteServerPropagation\",\n                        \"smithy.api#documentation\": \"<p>Information about the disabled route server propagation.</p>\",\n                        \"smithy.api#xmlName\": \"routeServerPropagation\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DisableSerialConsoleAccess\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DisableSerialConsoleAccessRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DisableSerialConsoleAccessResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Disables access to the EC2 serial console of all instances for your account. By default,\\n\\t\\t\\taccess to the EC2 serial console is disabled for your account. For more information, see\\n\\t\\t\\t\\t<a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/configure-access-to-serial-console.html#serial-console-account-access\\\">Manage account access to the EC2 serial console</a> in the <i>Amazon EC2\\n\\t\\t\\t\\tUser Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DisableSerialConsoleAccessRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DisableSerialConsoleAccessResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SerialConsoleAccessEnabled\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SerialConsoleAccessEnabled\",\n                        \"smithy.api#documentation\": \"<p>If <code>true</code>, access to the EC2 serial console of all instances is enabled for\\n\\t\\t\\tyour account. If <code>false</code>, access to the EC2 serial console of all instances\\n\\t\\t\\tis disabled for your account.</p>\",\n                        \"smithy.api#xmlName\": \"serialConsoleAccessEnabled\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DisableSnapshotBlockPublicAccess\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DisableSnapshotBlockPublicAccessRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DisableSnapshotBlockPublicAccessResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Disables the <i>block public access for snapshots</i> setting at \\n      the account level for the specified Amazon Web Services Region. After you disable block public \\n      access for snapshots in a Region, users can publicly share snapshots in that Region.</p>\\n         <important>\\n            <p>Enabling block public access for snapshots in <i>block-all-sharing</i> \\n        mode does not change the permissions for snapshots that are already publicly shared. \\n        Instead, it prevents these snapshots from be publicly visible and publicly accessible. \\n        Therefore, the attributes for these snapshots still indicate that they are publicly \\n        shared, even though they are not publicly available.</p>\\n            <p>If you disable block public access , these snapshots will become publicly available \\n        again.</p>\\n         </important>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/ebs/latest/userguide/block-public-access-snapshots.html\\\">\\n        Block public access for snapshots</a> in the <i>Amazon EBS User Guide</i> .</p>\\n         <p></p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DisableSnapshotBlockPublicAccessRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DisableSnapshotBlockPublicAccessResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#SnapshotBlockPublicAccessState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>Returns <code>unblocked</code> if the request succeeds.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DisableTransitGatewayRouteTablePropagation\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DisableTransitGatewayRouteTablePropagationRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DisableTransitGatewayRouteTablePropagationResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Disables the specified resource attachment from propagating routes to the specified\\n         propagation route table.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DisableTransitGatewayRouteTablePropagationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayRouteTableId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayRouteTableId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the propagation route table.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TransitGatewayAttachmentId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayAttachmentId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the attachment.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"TransitGatewayRouteTableAnnouncementId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayRouteTableAnnouncementId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the route table announcement.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DisableTransitGatewayRouteTablePropagationResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Propagation\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayPropagation\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Propagation\",\n                        \"smithy.api#documentation\": \"<p>Information about route propagation.</p>\",\n                        \"smithy.api#xmlName\": \"propagation\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DisableVgwRoutePropagation\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DisableVgwRoutePropagationRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Disables a virtual private gateway (VGW) from propagating routes to a specified route\\n            table of a VPC.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To disable route propagation\",\n                        \"documentation\": \"This example disables the specified virtual private gateway from propagating static routes to the specified route table.\",\n                        \"input\": {\n                            \"RouteTableId\": \"rtb-22574640\",\n                            \"GatewayId\": \"vgw-9a4cacf3\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#DisableVgwRoutePropagationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"GatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#VpnGatewayId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the virtual private gateway.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"RouteTableId\": {\n                    \"target\": \"com.amazonaws.ec2#RouteTableId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the route table.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually\\n            making the request, and provides an error response. If you have the required\\n            permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is\\n                <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the parameters for DisableVgwRoutePropagation.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DisableVpcClassicLink\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DisableVpcClassicLinkRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DisableVpcClassicLinkResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>This action is deprecated.</p>\\n         </note>\\n         <p>Disables ClassicLink for a VPC. You cannot disable ClassicLink for a VPC that has EC2-Classic instances\\n            linked to it.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DisableVpcClassicLinkDnsSupport\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DisableVpcClassicLinkDnsSupportRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DisableVpcClassicLinkDnsSupportResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>This action is deprecated.</p>\\n         </note>\\n         <p>Disables ClassicLink DNS support for a VPC. If disabled, DNS hostnames resolve to\\n\\t\\t\\tpublic IP addresses when addressed between a linked EC2-Classic instance and instances\\n\\t\\t\\tin the VPC to which it's linked.</p>\\n         <p>You must specify a VPC ID in the request.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DisableVpcClassicLinkDnsSupportRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VpcId\": {\n                    \"target\": \"com.amazonaws.ec2#VpcId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the VPC.</p>\",\n                        \"smithy.api#xmlName\": \"VpcId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DisableVpcClassicLinkDnsSupportResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Return\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Return\",\n                        \"smithy.api#documentation\": \"<p>Returns <code>true</code> if the request succeeds; otherwise, it returns an error.</p>\",\n                        \"smithy.api#xmlName\": \"return\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DisableVpcClassicLinkRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"VpcId\": {\n                    \"target\": \"com.amazonaws.ec2#VpcId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcId\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the VPC.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"vpcId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DisableVpcClassicLinkResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Return\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Return\",\n                        \"smithy.api#documentation\": \"<p>Returns <code>true</code> if the request succeeds; otherwise, it returns an error.</p>\",\n                        \"smithy.api#xmlName\": \"return\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DisassociateAddress\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DisassociateAddressRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Disassociates an Elastic IP address from the instance or network interface it's associated with.</p>\\n         <p>This is an idempotent operation. If you perform the operation more than once, Amazon EC2 doesn't return an error.</p>\\n         <p>An address cannot be disassociated if the all of the following conditions are met:</p>\\n         <ul>\\n            <li>\\n               <p>Network interface has a <code>publicDualStackDnsName</code> publicDnsName</p>\\n            </li>\\n            <li>\\n               <p>Public IPv4 address is the primary public IPv4 address</p>\\n            </li>\\n            <li>\\n               <p>Network interface only has one remaining public IPv4 address</p>\\n            </li>\\n         </ul>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To disassociate an Elastic IP address\",\n                        \"documentation\": \"This example disassociates an Elastic IP address from an instance.\",\n                        \"input\": {\n                            \"AssociationId\": \"eipassoc-2bebb745\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#DisassociateAddressRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AssociationId\": {\n                    \"target\": \"com.amazonaws.ec2#ElasticIpAssociationId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The association ID. This parameter is required.</p>\"\n                    }\n                },\n                \"PublicIp\": {\n                    \"target\": \"com.amazonaws.ec2#EipAllocationPublicIp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Deprecated.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DisassociateCapacityReservationBillingOwner\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DisassociateCapacityReservationBillingOwnerRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DisassociateCapacityReservationBillingOwnerResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Cancels a pending request to assign billing of the unused capacity of a Capacity\\n\\t\\t\\tReservation to a consumer account, or revokes a request that has already been accepted.\\n\\t\\t\\tFor more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/assign-billing.html\\\">Billing assignment for shared\\n\\t\\t\\t\\t\\tAmazon EC2 Capacity Reservations</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DisassociateCapacityReservationBillingOwnerRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"CapacityReservationId\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityReservationId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the Capacity Reservation.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"UnusedReservationBillingOwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#AccountID\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the consumer account to which the request was sent.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DisassociateCapacityReservationBillingOwnerResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Return\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Return\",\n                        \"smithy.api#documentation\": \"<p>Returns <code>true</code> if the request succeeds; otherwise, it returns an error.</p>\",\n                        \"smithy.api#xmlName\": \"return\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DisassociateClientVpnTargetNetwork\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DisassociateClientVpnTargetNetworkRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DisassociateClientVpnTargetNetworkResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Disassociates a target network from the specified Client VPN endpoint. When you disassociate the \\n\\t\\t\\tlast target network from a Client VPN, the following happens:</p>\\n         <ul>\\n            <li>\\n               <p>The route that was automatically added for the VPC is deleted</p>\\n            </li>\\n            <li>\\n               <p>All active client connections are terminated</p>\\n            </li>\\n            <li>\\n               <p>New client connections are disallowed</p>\\n            </li>\\n            <li>\\n               <p>The Client VPN endpoint's status changes to <code>pending-associate</code>\\n               </p>\\n            </li>\\n         </ul>\"\n            }\n        },\n        \"com.amazonaws.ec2#DisassociateClientVpnTargetNetworkRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ClientVpnEndpointId\": {\n                    \"target\": \"com.amazonaws.ec2#ClientVpnEndpointId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the Client VPN endpoint from which to disassociate the target network.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"AssociationId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the target network association.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DisassociateClientVpnTargetNetworkResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AssociationId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AssociationId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the target network association.</p>\",\n                        \"smithy.api#xmlName\": \"associationId\"\n                    }\n                },\n                \"Status\": {\n                    \"target\": \"com.amazonaws.ec2#AssociationStatus\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Status\",\n                        \"smithy.api#documentation\": \"<p>The current state of the target network association.</p>\",\n                        \"smithy.api#xmlName\": \"status\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DisassociateEnclaveCertificateIamRole\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DisassociateEnclaveCertificateIamRoleRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DisassociateEnclaveCertificateIamRoleResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Disassociates an IAM role from an Certificate Manager (ACM) certificate. Disassociating an IAM role \\n\\t\\t\\tfrom an ACM certificate removes the Amazon S3 object that contains the certificate, certificate chain, and \\n\\t\\t\\tencrypted private key from the Amazon S3 bucket. It also revokes the IAM role's permission to use the\\n\\t\\t\\tKMS key used to encrypt the private key. This effectively revokes the role's permission \\n\\t\\t\\tto use the certificate.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DisassociateEnclaveCertificateIamRoleRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CertificateArn\": {\n                    \"target\": \"com.amazonaws.ec2#CertificateId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ARN of the ACM certificate from which to disassociate the IAM role.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"RoleArn\": {\n                    \"target\": \"com.amazonaws.ec2#RoleId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ARN of the IAM role to disassociate.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DisassociateEnclaveCertificateIamRoleResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Return\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Return\",\n                        \"smithy.api#documentation\": \"<p>Returns <code>true</code> if the request succeeds; otherwise, it returns an error.</p>\",\n                        \"smithy.api#xmlName\": \"return\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DisassociateIamInstanceProfile\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DisassociateIamInstanceProfileRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DisassociateIamInstanceProfileResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Disassociates an IAM instance profile from a running or stopped instance.</p>\\n         <p>Use <a>DescribeIamInstanceProfileAssociations</a> to get the association\\n            ID.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To disassociate an IAM instance profile\",\n                        \"documentation\": \"This example disassociates the specified IAM instance profile from an instance.\",\n                        \"input\": {\n                            \"AssociationId\": \"iip-assoc-05020b59952902f5f\"\n                        },\n                        \"output\": {\n                            \"IamInstanceProfileAssociation\": {\n                                \"InstanceId\": \"i-123456789abcde123\",\n                                \"State\": \"disassociating\",\n                                \"AssociationId\": \"iip-assoc-05020b59952902f5f\",\n                                \"IamInstanceProfile\": {\n                                    \"Id\": \"AIPAI5IVIHMFFYY2DKV5Y\",\n                                    \"Arn\": \"arn:aws:iam::123456789012:instance-profile/admin-role\"\n                                }\n                            }\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#DisassociateIamInstanceProfileRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AssociationId\": {\n                    \"target\": \"com.amazonaws.ec2#IamInstanceProfileAssociationId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the IAM instance profile association.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DisassociateIamInstanceProfileResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"IamInstanceProfileAssociation\": {\n                    \"target\": \"com.amazonaws.ec2#IamInstanceProfileAssociation\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IamInstanceProfileAssociation\",\n                        \"smithy.api#documentation\": \"<p>Information about the IAM instance profile association.</p>\",\n                        \"smithy.api#xmlName\": \"iamInstanceProfileAssociation\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DisassociateInstanceEventWindow\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DisassociateInstanceEventWindowRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DisassociateInstanceEventWindowResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Disassociates one or more targets from an event window.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/event-windows.html\\\">Define event windows for scheduled\\n            events</a> in the <i>Amazon EC2 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DisassociateInstanceEventWindowRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"InstanceEventWindowId\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceEventWindowId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the event window.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"AssociationTarget\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceEventWindowDisassociationRequest\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>One or more targets to disassociate from the specified event window.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DisassociateInstanceEventWindowResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceEventWindow\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceEventWindow\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceEventWindow\",\n                        \"smithy.api#documentation\": \"<p>Information about the event window.</p>\",\n                        \"smithy.api#xmlName\": \"instanceEventWindow\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DisassociateIpamByoasn\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DisassociateIpamByoasnRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DisassociateIpamByoasnResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Remove the association between your Autonomous System Number (ASN) and your BYOIP CIDR. You may want to use this action to disassociate an ASN from a CIDR or if you want to swap ASNs. \\n            For more information, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/ipam/tutorials-byoasn.html\\\">Tutorial: Bring your ASN to IPAM</a> in the <i>Amazon VPC IPAM guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DisassociateIpamByoasnRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"Asn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>A public 2-byte or 4-byte ASN.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Cidr\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>A BYOIP CIDR.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DisassociateIpamByoasnResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AsnAssociation\": {\n                    \"target\": \"com.amazonaws.ec2#AsnAssociation\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AsnAssociation\",\n                        \"smithy.api#documentation\": \"<p>An ASN and BYOIP CIDR association.</p>\",\n                        \"smithy.api#xmlName\": \"asnAssociation\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DisassociateIpamResourceDiscovery\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DisassociateIpamResourceDiscoveryRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DisassociateIpamResourceDiscoveryResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Disassociates a resource discovery from an Amazon VPC IPAM. A resource discovery is an IPAM component that enables IPAM to manage and monitor resources that belong to the owning account.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DisassociateIpamResourceDiscoveryRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A check for whether you have the required permissions for the action without actually making the request \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"IpamResourceDiscoveryAssociationId\": {\n                    \"target\": \"com.amazonaws.ec2#IpamResourceDiscoveryAssociationId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>A resource discovery association ID.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DisassociateIpamResourceDiscoveryResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"IpamResourceDiscoveryAssociation\": {\n                    \"target\": \"com.amazonaws.ec2#IpamResourceDiscoveryAssociation\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpamResourceDiscoveryAssociation\",\n                        \"smithy.api#documentation\": \"<p>A resource discovery association.</p>\",\n                        \"smithy.api#xmlName\": \"ipamResourceDiscoveryAssociation\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DisassociateNatGatewayAddress\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DisassociateNatGatewayAddressRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DisassociateNatGatewayAddressResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Disassociates secondary Elastic IP addresses (EIPs) from a public NAT gateway. \\n            You cannot disassociate your primary EIP. For more information, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/userguide/nat-gateway-working-with.html#nat-gateway-edit-secondary\\\">Edit secondary IP address associations</a> in the <i>Amazon VPC User Guide</i>.</p>\\n         <p>While disassociating is in progress, you cannot associate/disassociate additional EIPs while the connections are being drained. You are, however, allowed to delete the NAT gateway.</p>\\n         <p>An EIP is released only at the end of MaxDrainDurationSeconds. It stays\\n            associated and supports the existing connections but does not support any new connections\\n            (new connections are distributed across the remaining associated EIPs). As the existing\\n            connections drain out, the EIPs (and the corresponding private IP addresses mapped to them) \\n            are released.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DisassociateNatGatewayAddressRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NatGatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#NatGatewayId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the NAT gateway.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"AssociationIds\": {\n                    \"target\": \"com.amazonaws.ec2#EipAssociationIdList\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The association IDs of EIPs that have been associated with the NAT gateway.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"AssociationId\"\n                    }\n                },\n                \"MaxDrainDurationSeconds\": {\n                    \"target\": \"com.amazonaws.ec2#DrainSeconds\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum amount of time to wait (in seconds) before forcibly releasing the IP addresses if connections are still in progress. Default value is 350 seconds.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DisassociateNatGatewayAddressResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NatGatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#NatGatewayId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NatGatewayId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the NAT gateway.</p>\",\n                        \"smithy.api#xmlName\": \"natGatewayId\"\n                    }\n                },\n                \"NatGatewayAddresses\": {\n                    \"target\": \"com.amazonaws.ec2#NatGatewayAddressList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NatGatewayAddressSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the NAT gateway IP addresses.</p>\",\n                        \"smithy.api#xmlName\": \"natGatewayAddressSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DisassociateRouteServer\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DisassociateRouteServerRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DisassociateRouteServerResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Disassociates a route server from a VPC.</p>\\n         <p>A route server association is the connection established between a route server and a VPC.</p>\\n         <p>For more information see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/userguide/dynamic-routing-route-server.html\\\">Dynamic routing in your VPC with VPC Route Server</a> in the <i>Amazon VPC User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DisassociateRouteServerRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RouteServerId\": {\n                    \"target\": \"com.amazonaws.ec2#RouteServerId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the route server to disassociate.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"VpcId\": {\n                    \"target\": \"com.amazonaws.ec2#VpcId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the VPC to disassociate from the route server.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A check for whether you have the required permissions for the action without actually making the request \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DisassociateRouteServerResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RouteServerAssociation\": {\n                    \"target\": \"com.amazonaws.ec2#RouteServerAssociation\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RouteServerAssociation\",\n                        \"smithy.api#documentation\": \"<p>Information about the disassociated route server.</p>\",\n                        \"smithy.api#xmlName\": \"routeServerAssociation\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DisassociateRouteTable\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DisassociateRouteTableRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Disassociates a subnet or gateway from a route table.</p>\\n         <p>After you perform this action, the subnet no longer uses the routes in the route table.\\n\\t\\t\\t\\tInstead, it uses the routes in the VPC's main route table. For more information\\n\\t\\t\\t\\tabout route tables, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Route_Tables.html\\\">Route\\n\\t\\t\\t\\ttables</a> in the <i>Amazon VPC User Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To disassociate a route table\",\n                        \"documentation\": \"This example disassociates the specified route table from its associated subnet.\",\n                        \"input\": {\n                            \"AssociationId\": \"rtbassoc-781d0d1a\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#DisassociateRouteTableRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"AssociationId\": {\n                    \"target\": \"com.amazonaws.ec2#RouteTableAssociationId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AssociationId\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The association ID representing the current association between the route table and subnet or gateway.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"associationId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DisassociateSecurityGroupVpc\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DisassociateSecurityGroupVpcRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DisassociateSecurityGroupVpcResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Disassociates a security group from a VPC. You cannot disassociate the security group if any Elastic network interfaces in the associated VPC are still associated with the security group.\\n            \\n            Note that the disassociation is asynchronous and you can check the status of the request with <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeSecurityGroupVpcAssociations.html\\\">DescribeSecurityGroupVpcAssociations</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DisassociateSecurityGroupVpcRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"GroupId\": {\n                    \"target\": \"com.amazonaws.ec2#DisassociateSecurityGroupVpcSecurityGroupId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>A security group ID.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"VpcId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>A VPC ID.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DisassociateSecurityGroupVpcResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#SecurityGroupVpcAssociationState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The state of the disassociation.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DisassociateSecurityGroupVpcSecurityGroupId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#DisassociateSubnetCidrBlock\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DisassociateSubnetCidrBlockRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DisassociateSubnetCidrBlockResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Disassociates a CIDR block from a subnet. Currently, you can disassociate an IPv6 CIDR block only. You must detach or delete all gateways and resources that are associated with the CIDR block before you can disassociate it. </p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DisassociateSubnetCidrBlockRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AssociationId\": {\n                    \"target\": \"com.amazonaws.ec2#SubnetCidrAssociationId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AssociationId\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The association ID for the CIDR block.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"associationId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DisassociateSubnetCidrBlockResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Ipv6CidrBlockAssociation\": {\n                    \"target\": \"com.amazonaws.ec2#SubnetIpv6CidrBlockAssociation\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Ipv6CidrBlockAssociation\",\n                        \"smithy.api#documentation\": \"<p>Information about the IPv6 CIDR block association.</p>\",\n                        \"smithy.api#xmlName\": \"ipv6CidrBlockAssociation\"\n                    }\n                },\n                \"SubnetId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SubnetId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the subnet.</p>\",\n                        \"smithy.api#xmlName\": \"subnetId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DisassociateTransitGatewayMulticastDomain\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DisassociateTransitGatewayMulticastDomainRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DisassociateTransitGatewayMulticastDomainResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Disassociates the specified subnets from the transit gateway multicast domain. </p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DisassociateTransitGatewayMulticastDomainRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayMulticastDomainId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayMulticastDomainId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the transit gateway multicast domain.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TransitGatewayAttachmentId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayAttachmentId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the attachment.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"SubnetIds\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewaySubnetIdList\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The IDs of the subnets;</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DisassociateTransitGatewayMulticastDomainResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Associations\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayMulticastDomainAssociations\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Associations\",\n                        \"smithy.api#documentation\": \"<p>Information about the association.</p>\",\n                        \"smithy.api#xmlName\": \"associations\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DisassociateTransitGatewayPolicyTable\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DisassociateTransitGatewayPolicyTableRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DisassociateTransitGatewayPolicyTableResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Removes the association between an an attachment and a policy table.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DisassociateTransitGatewayPolicyTableRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayPolicyTableId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayPolicyTableId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the disassociated policy table.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TransitGatewayAttachmentId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayAttachmentId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the transit gateway attachment to disassociate from the policy table.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DisassociateTransitGatewayPolicyTableResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Association\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayPolicyTableAssociation\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Association\",\n                        \"smithy.api#documentation\": \"<p>Returns details about the transit gateway policy table disassociation.</p>\",\n                        \"smithy.api#xmlName\": \"association\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DisassociateTransitGatewayRouteTable\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DisassociateTransitGatewayRouteTableRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DisassociateTransitGatewayRouteTableResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Disassociates a resource attachment from a transit gateway route table.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DisassociateTransitGatewayRouteTableRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayRouteTableId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayRouteTableId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the transit gateway route table.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TransitGatewayAttachmentId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayAttachmentId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the attachment.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DisassociateTransitGatewayRouteTableResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Association\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayAssociation\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Association\",\n                        \"smithy.api#documentation\": \"<p>Information about the association.</p>\",\n                        \"smithy.api#xmlName\": \"association\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DisassociateTrunkInterface\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DisassociateTrunkInterfaceRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DisassociateTrunkInterfaceResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Removes an association between a branch network interface with a trunk network interface.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DisassociateTrunkInterfaceRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AssociationId\": {\n                    \"target\": \"com.amazonaws.ec2#TrunkInterfaceAssociationId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the association</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Unique, case-sensitive identifier that you provide to ensure the idempotency of the\\n            request. For more information, see <a href=\\\"https://docs.aws.amazon.com/ec2/latest/devguide/ec2-api-idempotency.html\\\">Ensuring\\n                idempotency</a>.</p>\",\n                        \"smithy.api#idempotencyToken\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DisassociateTrunkInterfaceResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Return\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Return\",\n                        \"smithy.api#documentation\": \"<p>Returns <code>true</code> if the request succeeds; otherwise, it returns an error.</p>\",\n                        \"smithy.api#xmlName\": \"return\"\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ClientToken\",\n                        \"smithy.api#documentation\": \"<p>Unique, case-sensitive identifier that you provide to ensure the idempotency of the\\n            request. For more information, see <a href=\\\"https://docs.aws.amazon.com/ec2/latest/devguide/ec2-api-idempotency.html\\\">Ensuring\\n                idempotency</a>.</p>\",\n                        \"smithy.api#xmlName\": \"clientToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DisassociateVpcCidrBlock\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#DisassociateVpcCidrBlockRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#DisassociateVpcCidrBlockResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Disassociates a CIDR block from a VPC. To disassociate the CIDR block, you must\\n            specify its association ID. You can get the association ID by using\\n                <a>DescribeVpcs</a>. You must detach or delete all gateways and resources that\\n            are associated with the CIDR block before you can disassociate it. </p>\\n         <p>You cannot disassociate the CIDR block with which you originally created the VPC (the\\n\\t\\t\\tprimary CIDR block).</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DisassociateVpcCidrBlockRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AssociationId\": {\n                    \"target\": \"com.amazonaws.ec2#VpcCidrAssociationId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AssociationId\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The association ID for the CIDR block.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"associationId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DisassociateVpcCidrBlockResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Ipv6CidrBlockAssociation\": {\n                    \"target\": \"com.amazonaws.ec2#VpcIpv6CidrBlockAssociation\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Ipv6CidrBlockAssociation\",\n                        \"smithy.api#documentation\": \"<p>Information about the IPv6 CIDR block association.</p>\",\n                        \"smithy.api#xmlName\": \"ipv6CidrBlockAssociation\"\n                    }\n                },\n                \"CidrBlockAssociation\": {\n                    \"target\": \"com.amazonaws.ec2#VpcCidrBlockAssociation\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CidrBlockAssociation\",\n                        \"smithy.api#documentation\": \"<p>Information about the IPv4 CIDR block association.</p>\",\n                        \"smithy.api#xmlName\": \"cidrBlockAssociation\"\n                    }\n                },\n                \"VpcId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the VPC.</p>\",\n                        \"smithy.api#xmlName\": \"vpcId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#DiskCount\": {\n            \"type\": \"integer\"\n        },\n        \"com.amazonaws.ec2#DiskImage\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A description of the disk image.</p>\"\n                    }\n                },\n                \"Image\": {\n                    \"target\": \"com.amazonaws.ec2#DiskImageDetail\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Information about the disk image.</p>\"\n                    }\n                },\n                \"Volume\": {\n                    \"target\": \"com.amazonaws.ec2#VolumeDetail\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Information about the volume.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a disk image.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DiskImageDescription\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Checksum\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Checksum\",\n                        \"smithy.api#documentation\": \"<p>The checksum computed for the disk image.</p>\",\n                        \"smithy.api#xmlName\": \"checksum\"\n                    }\n                },\n                \"Format\": {\n                    \"target\": \"com.amazonaws.ec2#DiskImageFormat\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Format\",\n                        \"smithy.api#documentation\": \"<p>The disk image format.</p>\",\n                        \"smithy.api#xmlName\": \"format\"\n                    }\n                },\n                \"ImportManifestUrl\": {\n                    \"target\": \"com.amazonaws.ec2#ImportManifestUrl\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ImportManifestUrl\",\n                        \"smithy.api#documentation\": \"<p>A presigned URL for the import manifest stored in Amazon S3. For information about creating a presigned URL for\\n   an Amazon S3 object, read the \\\"Query String Request Authentication Alternative\\\" section of the <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html\\\">Authenticating REST Requests</a> topic in\\n   the <i>Amazon Simple Storage Service Developer Guide</i>.</p>\\n         <p>For information about the import manifest referenced by this API action, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/manifest.html\\\">VM Import Manifest</a>.</p>\",\n                        \"smithy.api#xmlName\": \"importManifestUrl\"\n                    }\n                },\n                \"Size\": {\n                    \"target\": \"com.amazonaws.ec2#Long\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Size\",\n                        \"smithy.api#documentation\": \"<p>The size of the disk image, in GiB.</p>\",\n                        \"smithy.api#xmlName\": \"size\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a disk image.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DiskImageDetail\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Format\": {\n                    \"target\": \"com.amazonaws.ec2#DiskImageFormat\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Format\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The disk image format.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"format\"\n                    }\n                },\n                \"Bytes\": {\n                    \"target\": \"com.amazonaws.ec2#Long\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Bytes\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The size of the disk image, in GiB.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"bytes\"\n                    }\n                },\n                \"ImportManifestUrl\": {\n                    \"target\": \"com.amazonaws.ec2#ImportManifestUrl\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ImportManifestUrl\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>A presigned URL for the import manifest stored in Amazon S3 and presented here as an Amazon S3 presigned URL.\\n   For information about creating a presigned URL for an Amazon S3 object, read the \\\"Query String Request Authentication\\n   Alternative\\\" section of the <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html\\\">Authenticating REST Requests</a> topic in the <i>Amazon Simple Storage Service Developer\\n    Guide</i>.</p>\\n         <p>For information about the import manifest referenced by this API action, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/manifest.html\\\">VM Import Manifest</a>.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"importManifestUrl\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a disk image.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DiskImageFormat\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"VMDK\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"VMDK\"\n                    }\n                },\n                \"RAW\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"RAW\"\n                    }\n                },\n                \"VHD\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"VHD\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DiskImageList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#DiskImage\"\n            }\n        },\n        \"com.amazonaws.ec2#DiskImageVolumeDescription\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Id\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Id\",\n                        \"smithy.api#documentation\": \"<p>The volume identifier.</p>\",\n                        \"smithy.api#xmlName\": \"id\"\n                    }\n                },\n                \"Size\": {\n                    \"target\": \"com.amazonaws.ec2#Long\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Size\",\n                        \"smithy.api#documentation\": \"<p>The size of the volume, in GiB.</p>\",\n                        \"smithy.api#xmlName\": \"size\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a disk image volume.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DiskInfo\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SizeInGB\": {\n                    \"target\": \"com.amazonaws.ec2#DiskSize\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SizeInGB\",\n                        \"smithy.api#documentation\": \"<p>The size of the disk in GB.</p>\",\n                        \"smithy.api#xmlName\": \"sizeInGB\"\n                    }\n                },\n                \"Count\": {\n                    \"target\": \"com.amazonaws.ec2#DiskCount\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Count\",\n                        \"smithy.api#documentation\": \"<p>The number of disks with this configuration.</p>\",\n                        \"smithy.api#xmlName\": \"count\"\n                    }\n                },\n                \"Type\": {\n                    \"target\": \"com.amazonaws.ec2#DiskType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Type\",\n                        \"smithy.api#documentation\": \"<p>The type of disk.</p>\",\n                        \"smithy.api#xmlName\": \"type\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a disk.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DiskInfoList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#DiskInfo\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DiskSize\": {\n            \"type\": \"long\"\n        },\n        \"com.amazonaws.ec2#DiskType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"hdd\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"hdd\"\n                    }\n                },\n                \"ssd\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ssd\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DnsEntry\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DnsName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DnsName\",\n                        \"smithy.api#documentation\": \"<p>The DNS name.</p>\",\n                        \"smithy.api#xmlName\": \"dnsName\"\n                    }\n                },\n                \"HostedZoneId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"HostedZoneId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the private hosted zone.</p>\",\n                        \"smithy.api#xmlName\": \"hostedZoneId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a DNS entry.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DnsEntrySet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#DnsEntry\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DnsNameState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"PendingVerification\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"pendingVerification\"\n                    }\n                },\n                \"Verified\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"verified\"\n                    }\n                },\n                \"Failed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"failed\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DnsOptions\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DnsRecordIpType\": {\n                    \"target\": \"com.amazonaws.ec2#DnsRecordIpType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DnsRecordIpType\",\n                        \"smithy.api#documentation\": \"<p>The DNS records created for the endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"dnsRecordIpType\"\n                    }\n                },\n                \"PrivateDnsOnlyForInboundResolverEndpoint\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PrivateDnsOnlyForInboundResolverEndpoint\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether to enable private DNS only for inbound endpoints.</p>\",\n                        \"smithy.api#xmlName\": \"privateDnsOnlyForInboundResolverEndpoint\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the DNS options for an endpoint.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DnsOptionsSpecification\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DnsRecordIpType\": {\n                    \"target\": \"com.amazonaws.ec2#DnsRecordIpType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The DNS records created for the endpoint.</p>\"\n                    }\n                },\n                \"PrivateDnsOnlyForInboundResolverEndpoint\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether to enable private DNS only for inbound endpoints. This option is\\n          available only for services that support both gateway and interface endpoints. It routes\\n          traffic that originates from the VPC to the gateway endpoint and traffic that originates\\n          from on-premises to the interface endpoint.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the DNS options for an endpoint.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DnsRecordIpType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ipv4\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ipv4\"\n                    }\n                },\n                \"dualstack\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"dualstack\"\n                    }\n                },\n                \"ipv6\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ipv6\"\n                    }\n                },\n                \"service_defined\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"service-defined\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DnsServersOptionsModifyStructure\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CustomDnsServers\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IPv4 address range, in CIDR notation, of the DNS servers to be used. You can specify up to \\n\\t\\t\\ttwo DNS servers. Ensure that the DNS servers can be reached by the clients. The specified values \\n\\t\\t\\toverwrite the existing values.</p>\"\n                    }\n                },\n                \"Enabled\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether DNS servers should be used. Specify <code>False</code> to delete the existing DNS \\n\\t\\t\\tservers.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about the DNS server to be used.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#DnsSupportValue\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"enable\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"enable\"\n                    }\n                },\n                \"disable\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"disable\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DomainType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"vpc\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"vpc\"\n                    }\n                },\n                \"standard\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"standard\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#Double\": {\n            \"type\": \"double\"\n        },\n        \"com.amazonaws.ec2#DoubleWithConstraints\": {\n            \"type\": \"double\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 0.001,\n                    \"max\": 99.999\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DrainSeconds\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 4000\n                }\n            }\n        },\n        \"com.amazonaws.ec2#DynamicRoutingValue\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"enable\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"enable\"\n                    }\n                },\n                \"disable\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"disable\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#EbsBlockDevice\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DeleteOnTermination\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DeleteOnTermination\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether the EBS volume is deleted on instance termination. For more\\n            information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/terminating-instances.html#preserving-volumes-on-termination\\\">Preserving Amazon EBS volumes on instance termination</a> in the\\n                <i>Amazon EC2 User Guide</i>.</p>\",\n                        \"smithy.api#xmlName\": \"deleteOnTermination\"\n                    }\n                },\n                \"Iops\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Iops\",\n                        \"smithy.api#documentation\": \"<p>The number of I/O operations per second (IOPS). For <code>gp3</code>, <code>io1</code>, and <code>io2</code> volumes,\\n            this represents the number of IOPS that are provisioned for the volume. For <code>gp2</code>\\n            volumes, this represents the baseline performance of the volume and the rate at which\\n            the volume accumulates I/O credits for bursting.</p>\\n         <p>The following are the supported values for each volume type:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>gp3</code>: 3,000 - 80,000 IOPS</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>io1</code>: 100 - 64,000 IOPS</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>io2</code>: 100 - 256,000 IOPS</p>\\n            </li>\\n         </ul>\\n         <p>For <code>io2</code> volumes, you can achieve up to 256,000 IOPS on \\n<a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html#ec2-nitro-instances\\\">instances \\nbuilt on the Nitro System</a>. On other instances, you can achieve performance up to 32,000 IOPS.</p>\\n         <p>This parameter is required for <code>io1</code> and <code>io2</code> volumes. The default for <code>gp3</code> volumes\\n            is 3,000 IOPS.</p>\",\n                        \"smithy.api#xmlName\": \"iops\"\n                    }\n                },\n                \"SnapshotId\": {\n                    \"target\": \"com.amazonaws.ec2#SnapshotId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SnapshotId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the snapshot.</p>\",\n                        \"smithy.api#xmlName\": \"snapshotId\"\n                    }\n                },\n                \"VolumeSize\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VolumeSize\",\n                        \"smithy.api#documentation\": \"<p>The size of the volume, in GiBs. You must specify either a snapshot ID or a volume\\n            size. If you specify a snapshot, the default is the snapshot size. You can specify a\\n            volume size that is equal to or larger than the snapshot size.</p>\\n         <p>The following are the supported sizes for each volume type:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>gp2</code>: 1 - 16,384 GiB</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>gp3</code>: 1 - 65,536 GiB</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>io1</code>: 4 - 16,384 GiB</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>io2</code>: 4 - 65,536 GiB</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>st1</code> and <code>sc1</code>: 125 - 16,384 GiB</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>standard</code>: 1 - 1024 GiB</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"volumeSize\"\n                    }\n                },\n                \"VolumeType\": {\n                    \"target\": \"com.amazonaws.ec2#VolumeType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VolumeType\",\n                        \"smithy.api#documentation\": \"<p>The volume type. For more information, see <a href=\\\"https://docs.aws.amazon.com/ebs/latest/userguide/ebs-volume-types.html\\\">Amazon EBS volume types</a> in the\\n                <i>Amazon EBS User Guide</i>.</p>\",\n                        \"smithy.api#xmlName\": \"volumeType\"\n                    }\n                },\n                \"KmsKeyId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"KmsKeyId\",\n                        \"smithy.api#documentation\": \"<p>Identifier (key ID, key alias, key ARN, or alias ARN) of the customer managed KMS key \\n            to use for EBS encryption.</p>\\n         <p>This parameter is only supported on <code>BlockDeviceMapping</code> objects called by\\n                <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RunInstances.html\\\">RunInstances</a>, <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RequestSpotFleet.html\\\">RequestSpotFleet</a>,\\n            and <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RequestSpotInstances.html\\\">RequestSpotInstances</a>.</p>\",\n                        \"smithy.api#xmlName\": \"kmsKeyId\"\n                    }\n                },\n                \"Throughput\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Throughput\",\n                        \"smithy.api#documentation\": \"<p>The throughput that the volume supports, in MiB/s.</p>\\n         <p>This parameter is valid only for <code>gp3</code> volumes.</p>\\n         <p>Valid Range: Minimum value of 125. Maximum value of 2,000.</p>\",\n                        \"smithy.api#xmlName\": \"throughput\"\n                    }\n                },\n                \"OutpostArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OutpostArn\",\n                        \"smithy.api#documentation\": \"<p>The ARN of the Outpost on which the snapshot is stored.</p>\\n         <p>This parameter is not supported when using <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateImage.html\\\">CreateImage</a>.</p>\",\n                        \"smithy.api#xmlName\": \"outpostArn\"\n                    }\n                },\n                \"AvailabilityZone\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AvailabilityZone\",\n                        \"smithy.api#documentation\": \"<p>The Availability Zone where the EBS volume will be created (for example,\\n            <code>us-east-1a</code>).</p>\\n         <p>Either <code>AvailabilityZone</code> or <code>AvailabilityZoneId</code> can be specified,\\n            but not both. If neither is specified, Amazon EC2 automatically selects an Availability Zone within\\n            the Region.</p>\\n         <p>This parameter is not supported when using \\n            <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateFleet.html\\\">CreateFleet</a>, \\n            <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateImage.html\\\">CreateImage</a>, \\n            <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeImages.html\\\">DescribeImages</a>, \\n            <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RequestSpotFleet.html\\\">RequestSpotFleet</a>, \\n            <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RequestSpotInstances.html\\\">RequestSpotInstances</a>, and \\n            <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RunInstances.html\\\">RunInstances</a>.</p>\",\n                        \"smithy.api#xmlName\": \"availabilityZone\"\n                    }\n                },\n                \"Encrypted\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Encrypted\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether the encryption state of an EBS volume is changed while being\\n            restored from a backing snapshot. The effect of setting the encryption state to <code>true</code> depends on \\nthe volume origin (new or from a snapshot), starting encryption state, ownership, and whether encryption by default is enabled. For more information, see <a href=\\\"https://docs.aws.amazon.com/ebs/latest/userguide/ebs-encryption.html#encryption-parameters\\\">Amazon EBS encryption</a> in the <i>Amazon EBS User Guide</i>.</p>\\n         <p>In no case can you remove encryption from an encrypted volume.</p>\\n         <p>Encrypted volumes can only be attached to instances that support Amazon EBS encryption. For\\n            more information, see <a href=\\\"https://docs.aws.amazon.com/ebs/latest/userguide/ebs-encryption-requirements.html#ebs-encryption_supported_instances\\\">Supported instance types</a>.</p>\\n         <p>This parameter is not returned by <a>DescribeImageAttribute</a>.</p>\\n         <p>For <a>CreateImage</a> and <a>RegisterImage</a>, whether you can \\n            include this parameter, and the allowed values differ depending on the type of block \\n            device mapping you are creating.</p>\\n         <ul>\\n            <li>\\n               <p>If you are creating a block device mapping for a <b>new (empty) \\n                    volume</b>, you can include this parameter, and specify either <code>true</code> \\n                    for an encrypted volume, or <code>false</code> for an unencrypted volume. If you omit \\n                    this parameter, it defaults to <code>false</code> (unencrypted).</p>\\n            </li>\\n            <li>\\n               <p>If you are creating a block device mapping from an <b>existing \\n                    encrypted or unencrypted snapshot</b>, you must omit this parameter. If you \\n                    include this parameter, the request will fail, regardless of the value that you \\n                    specify.</p>\\n            </li>\\n            <li>\\n               <p>If you are creating a block device mapping from an <b>existing \\n                    unencrypted volume</b>, you can include this parameter, but you must specify \\n                    <code>false</code>. If you specify <code>true</code>, the request will fail. In this \\n                    case, we recommend that you omit the parameter.</p>\\n            </li>\\n            <li>\\n               <p>If you are creating a block device mapping from an <b>existing \\n                    encrypted volume</b>, you can include this parameter, and specify either \\n                    <code>true</code> or <code>false</code>. However, if you specify <code>false</code>, \\n                    the parameter is ignored and the block device mapping is always encrypted. In this \\n                    case, we recommend that you omit the parameter.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"encrypted\"\n                    }\n                },\n                \"VolumeInitializationRate\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the Amazon EBS Provisioned Rate for Volume Initialization (volume initialization rate), in MiB/s, at which to download \\n            the snapshot blocks from Amazon S3 to the volume. This is also known as \\n            <i>volume initialization</i>. Specifying a volume initialization rate ensures that \\n            the volume is initialized at a predictable and consistent rate after creation.</p>\\n         <p>This parameter is supported only for volumes created from snapshots. Omit this parameter \\n            if:</p>\\n         <ul>\\n            <li>\\n               <p>You want to create the volume using fast snapshot restore. You must specify a snapshot \\n                    that is enabled for fast snapshot restore. In this case, the volume is fully initialized at \\n                    creation.</p>\\n               <note>\\n                  <p>If you specify a snapshot that is enabled for fast snapshot restore and a volume initialization rate, \\n                        the volume will be initialized at the specified rate instead of fast snapshot restore.</p>\\n               </note>\\n            </li>\\n            <li>\\n               <p>You want to create a volume that is initialized at the default rate.</p>\\n            </li>\\n         </ul>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/ebs/latest/userguide/initalize-volume.html\\\">\\n            Initialize Amazon EBS volumes</a> in the <i>Amazon EC2 User Guide</i>.</p>\\n         <p>This parameter is not supported when using <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateImage.html\\\">CreateImage</a>.</p>\\n         <p>Valid range: 100 - 300 MiB/s</p>\"\n                    }\n                },\n                \"AvailabilityZoneId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the Availability Zone where the EBS volume will be created (for example,\\n            <code>use1-az1</code>).</p>\\n         <p>Either <code>AvailabilityZone</code> or <code>AvailabilityZoneId</code> can be specified,\\n            but not both. If neither is specified, Amazon EC2 automatically selects an Availability Zone within\\n            the Region.</p>\\n         <p>This parameter is not supported when using \\n            <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateFleet.html\\\">CreateFleet</a>, \\n            <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateImage.html\\\">CreateImage</a>, \\n            <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeImages.html\\\">DescribeImages</a>, \\n            <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RequestSpotFleet.html\\\">RequestSpotFleet</a>, \\n            <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RequestSpotInstances.html\\\">RequestSpotInstances</a>, and \\n            <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RunInstances.html\\\">RunInstances</a>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a block device for an EBS volume.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#EbsBlockDeviceResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Encrypted\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Encrypted\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether the volume is encrypted.</p>\",\n                        \"smithy.api#xmlName\": \"encrypted\"\n                    }\n                },\n                \"DeleteOnTermination\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DeleteOnTermination\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether the volume is deleted on instance termination.</p>\",\n                        \"smithy.api#xmlName\": \"deleteOnTermination\"\n                    }\n                },\n                \"Iops\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Iops\",\n                        \"smithy.api#documentation\": \"<p>The number of I/O operations per second (IOPS). For <code>gp3</code>, <code>io1</code>, and <code>io2</code> volumes,\\n         this represents the number of IOPS that are provisioned for the volume. For <code>gp2</code>\\n         volumes, this represents the baseline performance of the volume and the rate at which\\n         the volume accumulates I/O credits for bursting.</p>\",\n                        \"smithy.api#xmlName\": \"iops\"\n                    }\n                },\n                \"Throughput\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Throughput\",\n                        \"smithy.api#documentation\": \"<p>The throughput that the volume supports, in MiB/s.</p>\",\n                        \"smithy.api#xmlName\": \"throughput\"\n                    }\n                },\n                \"KmsKeyId\": {\n                    \"target\": \"com.amazonaws.ec2#KmsKeyId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"KmsKeyId\",\n                        \"smithy.api#documentation\": \"<p>Identifier (key ID, key alias, key ARN, or alias ARN) of the customer managed KMS key \\n         to use for EBS encryption.</p>\",\n                        \"smithy.api#xmlName\": \"kmsKeyId\"\n                    }\n                },\n                \"SnapshotId\": {\n                    \"target\": \"com.amazonaws.ec2#SnapshotId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SnapshotId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the snapshot.</p>\",\n                        \"smithy.api#xmlName\": \"snapshotId\"\n                    }\n                },\n                \"VolumeSize\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VolumeSize\",\n                        \"smithy.api#documentation\": \"<p>The size of the volume, in GiBs.</p>\",\n                        \"smithy.api#xmlName\": \"volumeSize\"\n                    }\n                },\n                \"VolumeType\": {\n                    \"target\": \"com.amazonaws.ec2#VolumeType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VolumeType\",\n                        \"smithy.api#documentation\": \"<p>The volume type. For more information, see <a href=\\\"https://docs.aws.amazon.com/ebs/latest/userguide/ebs-volume-types.html\\\">Amazon EBS volume types</a> in the\\n         <i>Amazon EBS User Guide</i>.</p>\",\n                        \"smithy.api#xmlName\": \"volumeType\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a block device for an EBS volume.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#EbsEncryptionSupport\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"unsupported\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"unsupported\"\n                    }\n                },\n                \"supported\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"supported\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#EbsInfo\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"EbsOptimizedSupport\": {\n                    \"target\": \"com.amazonaws.ec2#EbsOptimizedSupport\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EbsOptimizedSupport\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether the instance type is Amazon EBS-optimized. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EBSOptimized.html\\\">Amazon EBS-optimized\\n    instances</a> in <i>Amazon EC2 User Guide</i>.</p>\",\n                        \"smithy.api#xmlName\": \"ebsOptimizedSupport\"\n                    }\n                },\n                \"EncryptionSupport\": {\n                    \"target\": \"com.amazonaws.ec2#EbsEncryptionSupport\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EncryptionSupport\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether Amazon EBS encryption is supported.</p>\",\n                        \"smithy.api#xmlName\": \"encryptionSupport\"\n                    }\n                },\n                \"EbsOptimizedInfo\": {\n                    \"target\": \"com.amazonaws.ec2#EbsOptimizedInfo\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EbsOptimizedInfo\",\n                        \"smithy.api#documentation\": \"<p>Describes the optimized EBS performance for the instance type.</p>\",\n                        \"smithy.api#xmlName\": \"ebsOptimizedInfo\"\n                    }\n                },\n                \"NvmeSupport\": {\n                    \"target\": \"com.amazonaws.ec2#EbsNvmeSupport\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NvmeSupport\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether non-volatile memory express (NVMe) is supported.</p>\",\n                        \"smithy.api#xmlName\": \"nvmeSupport\"\n                    }\n                },\n                \"MaximumEbsAttachments\": {\n                    \"target\": \"com.amazonaws.ec2#MaximumEbsAttachments\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MaximumEbsAttachments\",\n                        \"smithy.api#documentation\": \"<p>Indicates the maximum number of Amazon EBS volumes that can be attached to \\n   the instance type. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/volume_limits.html\\\">Amazon EBS volume limits for \\n    Amazon EC2 instances</a> in the <i>Amazon EC2 User Guide</i>.</p>\",\n                        \"smithy.api#xmlName\": \"maximumEbsAttachments\"\n                    }\n                },\n                \"AttachmentLimitType\": {\n                    \"target\": \"com.amazonaws.ec2#AttachmentLimitType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AttachmentLimitType\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether the instance type features a shared or dedicated Amazon EBS \\n   volume attachment limit. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/volume_limits.html\\\">Amazon EBS volume limits for \\n    Amazon EC2 instances</a> in the <i>Amazon EC2 User Guide</i>.</p>\",\n                        \"smithy.api#xmlName\": \"attachmentLimitType\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the Amazon EBS features supported by the instance type.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#EbsInstanceBlockDevice\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AttachTime\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AttachTime\",\n                        \"smithy.api#documentation\": \"<p>The time stamp when the attachment initiated.</p>\",\n                        \"smithy.api#xmlName\": \"attachTime\"\n                    }\n                },\n                \"DeleteOnTermination\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DeleteOnTermination\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether the volume is deleted on instance termination.</p>\",\n                        \"smithy.api#xmlName\": \"deleteOnTermination\"\n                    }\n                },\n                \"Status\": {\n                    \"target\": \"com.amazonaws.ec2#AttachmentStatus\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Status\",\n                        \"smithy.api#documentation\": \"<p>The attachment state.</p>\",\n                        \"smithy.api#xmlName\": \"status\"\n                    }\n                },\n                \"VolumeId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VolumeId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the EBS volume.</p>\",\n                        \"smithy.api#xmlName\": \"volumeId\"\n                    }\n                },\n                \"AssociatedResource\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AssociatedResource\",\n                        \"smithy.api#documentation\": \"<p>The ARN of the Amazon Web Services-managed resource \\n            to which the volume is attached.</p>\",\n                        \"smithy.api#xmlName\": \"associatedResource\"\n                    }\n                },\n                \"VolumeOwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VolumeOwnerId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Amazon Web Services account that owns the volume.</p>\\n         <p>This parameter is returned only for volumes that are attached to \\n            Amazon Web Services-managed resources.</p>\",\n                        \"smithy.api#xmlName\": \"volumeOwnerId\"\n                    }\n                },\n                \"Operator\": {\n                    \"target\": \"com.amazonaws.ec2#OperatorResponse\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Operator\",\n                        \"smithy.api#documentation\": \"<p>The service provider that manages the EBS volume.</p>\",\n                        \"smithy.api#xmlName\": \"operator\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a parameter used to set up an EBS volume in a block device mapping.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#EbsInstanceBlockDeviceSpecification\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VolumeId\": {\n                    \"target\": \"com.amazonaws.ec2#VolumeId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VolumeId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the EBS volume.</p>\",\n                        \"smithy.api#xmlName\": \"volumeId\"\n                    }\n                },\n                \"DeleteOnTermination\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DeleteOnTermination\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether the volume is deleted on instance termination.</p>\",\n                        \"smithy.api#xmlName\": \"deleteOnTermination\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes information used to set up an EBS volume specified in a block device\\n            mapping.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#EbsNvmeSupport\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"UNSUPPORTED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"unsupported\"\n                    }\n                },\n                \"SUPPORTED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"supported\"\n                    }\n                },\n                \"REQUIRED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"required\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#EbsOptimizedInfo\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"BaselineBandwidthInMbps\": {\n                    \"target\": \"com.amazonaws.ec2#BaselineBandwidthInMbps\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"BaselineBandwidthInMbps\",\n                        \"smithy.api#documentation\": \"<p>The baseline bandwidth performance for an EBS-optimized instance type, in Mbps.</p>\",\n                        \"smithy.api#xmlName\": \"baselineBandwidthInMbps\"\n                    }\n                },\n                \"BaselineThroughputInMBps\": {\n                    \"target\": \"com.amazonaws.ec2#BaselineThroughputInMBps\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"BaselineThroughputInMBps\",\n                        \"smithy.api#documentation\": \"<p>The baseline throughput performance for an EBS-optimized instance type, in MB/s.</p>\",\n                        \"smithy.api#xmlName\": \"baselineThroughputInMBps\"\n                    }\n                },\n                \"BaselineIops\": {\n                    \"target\": \"com.amazonaws.ec2#BaselineIops\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"BaselineIops\",\n                        \"smithy.api#documentation\": \"<p>The baseline input/output storage operations per seconds for an EBS-optimized instance\\n   type.</p>\",\n                        \"smithy.api#xmlName\": \"baselineIops\"\n                    }\n                },\n                \"MaximumBandwidthInMbps\": {\n                    \"target\": \"com.amazonaws.ec2#MaximumBandwidthInMbps\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MaximumBandwidthInMbps\",\n                        \"smithy.api#documentation\": \"<p>The maximum bandwidth performance for an EBS-optimized instance type, in Mbps.</p>\",\n                        \"smithy.api#xmlName\": \"maximumBandwidthInMbps\"\n                    }\n                },\n                \"MaximumThroughputInMBps\": {\n                    \"target\": \"com.amazonaws.ec2#MaximumThroughputInMBps\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MaximumThroughputInMBps\",\n                        \"smithy.api#documentation\": \"<p>The maximum throughput performance for an EBS-optimized instance type, in MB/s.</p>\",\n                        \"smithy.api#xmlName\": \"maximumThroughputInMBps\"\n                    }\n                },\n                \"MaximumIops\": {\n                    \"target\": \"com.amazonaws.ec2#MaximumIops\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MaximumIops\",\n                        \"smithy.api#documentation\": \"<p>The maximum input/output storage operations per second for an EBS-optimized instance\\n   type.</p>\",\n                        \"smithy.api#xmlName\": \"maximumIops\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the optimized EBS performance for supported instance types.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#EbsOptimizedSupport\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"unsupported\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"unsupported\"\n                    }\n                },\n                \"supported\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"supported\"\n                    }\n                },\n                \"default\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"default\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#EbsStatusDetails\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ImpairedSince\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ImpairedSince\",\n                        \"smithy.api#documentation\": \"<p>The date and time when the attached EBS status check failed.</p>\",\n                        \"smithy.api#xmlName\": \"impairedSince\"\n                    }\n                },\n                \"Name\": {\n                    \"target\": \"com.amazonaws.ec2#StatusName\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Name\",\n                        \"smithy.api#documentation\": \"<p>The name of the attached EBS status check.</p>\",\n                        \"smithy.api#xmlName\": \"name\"\n                    }\n                },\n                \"Status\": {\n                    \"target\": \"com.amazonaws.ec2#StatusType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Status\",\n                        \"smithy.api#documentation\": \"<p>The result of the attached EBS status check.</p>\",\n                        \"smithy.api#xmlName\": \"status\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the attached EBS status check for an instance.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#EbsStatusDetailsList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#EbsStatusDetails\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#EbsStatusSummary\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Details\": {\n                    \"target\": \"com.amazonaws.ec2#EbsStatusDetailsList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Details\",\n                        \"smithy.api#documentation\": \"<p>Details about the attached EBS status check for an instance.</p>\",\n                        \"smithy.api#xmlName\": \"details\"\n                    }\n                },\n                \"Status\": {\n                    \"target\": \"com.amazonaws.ec2#SummaryStatus\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Status\",\n                        \"smithy.api#documentation\": \"<p>The current status.</p>\",\n                        \"smithy.api#xmlName\": \"status\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Provides a summary of the attached EBS volume status for an instance.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#Ec2InstanceConnectEndpoint\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"OwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OwnerId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Amazon Web Services account that created the EC2 Instance Connect Endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"ownerId\"\n                    }\n                },\n                \"InstanceConnectEndpointId\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceConnectEndpointId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceConnectEndpointId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the EC2 Instance Connect Endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"instanceConnectEndpointId\"\n                    }\n                },\n                \"InstanceConnectEndpointArn\": {\n                    \"target\": \"com.amazonaws.ec2#ResourceArn\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceConnectEndpointArn\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the EC2 Instance Connect Endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"instanceConnectEndpointArn\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#Ec2InstanceConnectEndpointState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The current state of the EC2 Instance Connect Endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                },\n                \"StateMessage\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"StateMessage\",\n                        \"smithy.api#documentation\": \"<p>The message for the current state of the EC2 Instance Connect Endpoint. \\n        Can include a failure message.</p>\",\n                        \"smithy.api#xmlName\": \"stateMessage\"\n                    }\n                },\n                \"DnsName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DnsName\",\n                        \"smithy.api#documentation\": \"<p>The DNS name of the EC2 Instance Connect Endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"dnsName\"\n                    }\n                },\n                \"FipsDnsName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"FipsDnsName\",\n                        \"smithy.api#documentation\": \"<p>The Federal Information Processing Standards (FIPS) compliant DNS name of the EC2\\n            Instance Connect Endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"fipsDnsName\"\n                    }\n                },\n                \"NetworkInterfaceIds\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInterfaceIdSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkInterfaceIdSet\",\n                        \"smithy.api#documentation\": \"<p>The ID of the elastic network interface that Amazon EC2 automatically created when creating the EC2\\n            Instance Connect Endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"networkInterfaceIdSet\"\n                    }\n                },\n                \"VpcId\": {\n                    \"target\": \"com.amazonaws.ec2#VpcId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the VPC in which the EC2 Instance Connect Endpoint was created.</p>\",\n                        \"smithy.api#xmlName\": \"vpcId\"\n                    }\n                },\n                \"AvailabilityZone\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AvailabilityZone\",\n                        \"smithy.api#documentation\": \"<p>The Availability Zone of the EC2 Instance Connect Endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"availabilityZone\"\n                    }\n                },\n                \"CreatedAt\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CreatedAt\",\n                        \"smithy.api#documentation\": \"<p>The date and time that the EC2 Instance Connect Endpoint was created.</p>\",\n                        \"smithy.api#xmlName\": \"createdAt\"\n                    }\n                },\n                \"SubnetId\": {\n                    \"target\": \"com.amazonaws.ec2#SubnetId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SubnetId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the subnet in which the EC2 Instance Connect Endpoint was created.</p>\",\n                        \"smithy.api#xmlName\": \"subnetId\"\n                    }\n                },\n                \"PreserveClientIp\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PreserveClientIp\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether your client's IP address is preserved as the source. The value is <code>true</code> or <code>false</code>.</p>\\n         <ul>\\n            <li>\\n               <p>If <code>true</code>, your client's IP address is used when you connect to a resource.</p>\\n            </li>\\n            <li>\\n               <p>If <code>false</code>, the elastic network interface IP address is used when you connect to a resource.</p>\\n            </li>\\n         </ul>\\n         <p>Default: <code>true</code>\\n         </p>\",\n                        \"smithy.api#xmlName\": \"preserveClientIp\"\n                    }\n                },\n                \"SecurityGroupIds\": {\n                    \"target\": \"com.amazonaws.ec2#SecurityGroupIdSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SecurityGroupIdSet\",\n                        \"smithy.api#documentation\": \"<p>The security groups associated with the endpoint. If you didn't specify a security group, \\n            the default security group for your VPC is associated with the endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"securityGroupIdSet\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>The tags assigned to the EC2 Instance Connect Endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                },\n                \"IpAddressType\": {\n                    \"target\": \"com.amazonaws.ec2#IpAddressType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpAddressType\",\n                        \"smithy.api#documentation\": \"<p>The IP address type of the endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"ipAddressType\"\n                    }\n                },\n                \"PublicDnsNames\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceConnectEndpointPublicDnsNames\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PublicDnsNames\",\n                        \"smithy.api#documentation\": \"<p>The public DNS names of the endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"publicDnsNames\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The EC2 Instance Connect Endpoint.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#Ec2InstanceConnectEndpointState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"create_in_progress\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"create-in-progress\"\n                    }\n                },\n                \"create_complete\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"create-complete\"\n                    }\n                },\n                \"create_failed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"create-failed\"\n                    }\n                },\n                \"delete_in_progress\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"delete-in-progress\"\n                    }\n                },\n                \"delete_complete\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"delete-complete\"\n                    }\n                },\n                \"delete_failed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"delete-failed\"\n                    }\n                },\n                \"update_in_progress\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"update-in-progress\"\n                    }\n                },\n                \"update_complete\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"update-complete\"\n                    }\n                },\n                \"update_failed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"update-failed\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#EfaInfo\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"MaximumEfaInterfaces\": {\n                    \"target\": \"com.amazonaws.ec2#MaximumEfaInterfaces\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MaximumEfaInterfaces\",\n                        \"smithy.api#documentation\": \"<p>The maximum number of Elastic Fabric Adapters for the instance type.</p>\",\n                        \"smithy.api#xmlName\": \"maximumEfaInterfaces\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the Elastic Fabric Adapters for the instance type.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#EfaSupportedFlag\": {\n            \"type\": \"boolean\"\n        },\n        \"com.amazonaws.ec2#EgressOnlyInternetGateway\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Attachments\": {\n                    \"target\": \"com.amazonaws.ec2#InternetGatewayAttachmentList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AttachmentSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the attachment of the egress-only internet gateway.</p>\",\n                        \"smithy.api#xmlName\": \"attachmentSet\"\n                    }\n                },\n                \"EgressOnlyInternetGatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#EgressOnlyInternetGatewayId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EgressOnlyInternetGatewayId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the egress-only internet gateway.</p>\",\n                        \"smithy.api#xmlName\": \"egressOnlyInternetGatewayId\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>The tags assigned to the egress-only internet gateway.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes an egress-only internet gateway.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#EgressOnlyInternetGatewayId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#EgressOnlyInternetGatewayIdList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#EgressOnlyInternetGatewayId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#EgressOnlyInternetGatewayList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#EgressOnlyInternetGateway\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#EipAllocationPublicIp\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#EipAssociationIdList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ElasticIpAssociationId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#EkPubKeyFormat\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"der\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"der\"\n                    }\n                },\n                \"tpmt\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"tpmt\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#EkPubKeyType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"RSA_2048\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"rsa-2048\"\n                    }\n                },\n                \"ECC_SEC_P384\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ecc-sec-p384\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#EkPubKeyValue\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#sensitive\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ElasticGpuAssociation\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ElasticGpuId\": {\n                    \"target\": \"com.amazonaws.ec2#ElasticGpuId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ElasticGpuId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Elastic Graphics accelerator.</p>\",\n                        \"smithy.api#xmlName\": \"elasticGpuId\"\n                    }\n                },\n                \"ElasticGpuAssociationId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ElasticGpuAssociationId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the association.</p>\",\n                        \"smithy.api#xmlName\": \"elasticGpuAssociationId\"\n                    }\n                },\n                \"ElasticGpuAssociationState\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ElasticGpuAssociationState\",\n                        \"smithy.api#documentation\": \"<p>The state of the association between the instance and the\\n            Elastic Graphics accelerator.</p>\",\n                        \"smithy.api#xmlName\": \"elasticGpuAssociationState\"\n                    }\n                },\n                \"ElasticGpuAssociationTime\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ElasticGpuAssociationTime\",\n                        \"smithy.api#documentation\": \"<p>The time the Elastic Graphics accelerator was associated with the instance.</p>\",\n                        \"smithy.api#xmlName\": \"elasticGpuAssociationTime\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>Amazon Elastic Graphics reached end of life on January 8, 2024.</p>\\n         </note>\\n         <p>Describes the association between an instance and an Elastic Graphics accelerator.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ElasticGpuAssociationList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ElasticGpuAssociation\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ElasticGpuHealth\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Status\": {\n                    \"target\": \"com.amazonaws.ec2#ElasticGpuStatus\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Status\",\n                        \"smithy.api#documentation\": \"<p>The health status.</p>\",\n                        \"smithy.api#xmlName\": \"status\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>Amazon Elastic Graphics reached end of life on January 8, 2024.</p>\\n         </note>\\n         <p>Describes the status of an Elastic Graphics accelerator.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ElasticGpuId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#ElasticGpuIdSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ElasticGpuId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ElasticGpuSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ElasticGpus\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ElasticGpuSpecification\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Type\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The type of Elastic Graphics accelerator.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>Amazon Elastic Graphics reached end of life on January 8, 2024.</p>\\n         </note>\\n         <p>A specification for an Elastic Graphics accelerator.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ElasticGpuSpecificationList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ElasticGpuSpecification\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"ElasticGpuSpecification\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ElasticGpuSpecificationResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Type\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Type\",\n                        \"smithy.api#documentation\": \"<p>Deprecated.</p>\\n         <note>\\n            <p>Amazon Elastic Graphics reached end of life on January 8, 2024.</p>\\n         </note>\",\n                        \"smithy.api#xmlName\": \"type\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deprecated.</p>\\n         <note>\\n            <p>Amazon Elastic Graphics reached end of life on January 8, 2024.</p>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.ec2#ElasticGpuSpecificationResponseList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ElasticGpuSpecificationResponse\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ElasticGpuSpecifications\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ElasticGpuSpecification\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ElasticGpuState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"Attached\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ATTACHED\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ElasticGpuStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"Ok\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"OK\"\n                    }\n                },\n                \"Impaired\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"IMPAIRED\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ElasticGpus\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ElasticGpuId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ElasticGpuId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Elastic Graphics accelerator.</p>\",\n                        \"smithy.api#xmlName\": \"elasticGpuId\"\n                    }\n                },\n                \"AvailabilityZone\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AvailabilityZone\",\n                        \"smithy.api#documentation\": \"<p>The Availability Zone in the which the Elastic Graphics accelerator resides.</p>\",\n                        \"smithy.api#xmlName\": \"availabilityZone\"\n                    }\n                },\n                \"ElasticGpuType\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ElasticGpuType\",\n                        \"smithy.api#documentation\": \"<p>The type of Elastic Graphics accelerator.</p>\",\n                        \"smithy.api#xmlName\": \"elasticGpuType\"\n                    }\n                },\n                \"ElasticGpuHealth\": {\n                    \"target\": \"com.amazonaws.ec2#ElasticGpuHealth\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ElasticGpuHealth\",\n                        \"smithy.api#documentation\": \"<p>The status of the Elastic Graphics accelerator.</p>\",\n                        \"smithy.api#xmlName\": \"elasticGpuHealth\"\n                    }\n                },\n                \"ElasticGpuState\": {\n                    \"target\": \"com.amazonaws.ec2#ElasticGpuState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ElasticGpuState\",\n                        \"smithy.api#documentation\": \"<p>The state of the Elastic Graphics accelerator.</p>\",\n                        \"smithy.api#xmlName\": \"elasticGpuState\"\n                    }\n                },\n                \"InstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the instance to which the Elastic Graphics accelerator is attached.</p>\",\n                        \"smithy.api#xmlName\": \"instanceId\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>The tags assigned to the Elastic Graphics accelerator.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>Amazon Elastic Graphics reached end of life on January 8, 2024.</p>\\n         </note>\\n         <p>Describes an Elastic Graphics accelerator.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ElasticInferenceAccelerator\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Type\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>\\n        \\tThe type of elastic inference accelerator. The possible values are <code>eia1.medium</code>, <code>eia1.large</code>, <code>eia1.xlarge</code>, <code>eia2.medium</code>, <code>eia2.large</code>, and <code>eia2.xlarge</code>.\\n        </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Count\": {\n                    \"target\": \"com.amazonaws.ec2#ElasticInferenceAcceleratorCount\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>\\n            The number of elastic inference accelerators to attach to the instance. \\n        </p>\\n         <p>Default: 1</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>Amazon Elastic Inference is no longer available.</p>\\n         </note>\\n         <p>\\n           Describes an elastic inference accelerator. \\n        </p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ElasticInferenceAcceleratorAssociation\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ElasticInferenceAcceleratorArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ElasticInferenceAcceleratorArn\",\n                        \"smithy.api#documentation\": \"<p>\\n            The Amazon Resource Name (ARN) of the elastic inference accelerator. \\n        </p>\",\n                        \"smithy.api#xmlName\": \"elasticInferenceAcceleratorArn\"\n                    }\n                },\n                \"ElasticInferenceAcceleratorAssociationId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ElasticInferenceAcceleratorAssociationId\",\n                        \"smithy.api#documentation\": \"<p>\\n            The ID of the association. \\n        </p>\",\n                        \"smithy.api#xmlName\": \"elasticInferenceAcceleratorAssociationId\"\n                    }\n                },\n                \"ElasticInferenceAcceleratorAssociationState\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ElasticInferenceAcceleratorAssociationState\",\n                        \"smithy.api#documentation\": \"<p>\\n            The state of the elastic inference accelerator.\\n        </p>\",\n                        \"smithy.api#xmlName\": \"elasticInferenceAcceleratorAssociationState\"\n                    }\n                },\n                \"ElasticInferenceAcceleratorAssociationTime\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ElasticInferenceAcceleratorAssociationTime\",\n                        \"smithy.api#documentation\": \"<p>\\n            The time at which the elastic inference accelerator is associated with an instance.\\n        </p>\",\n                        \"smithy.api#xmlName\": \"elasticInferenceAcceleratorAssociationTime\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>Amazon Elastic Inference is no longer available.</p>\\n         </note>\\n         <p>\\n            Describes the association between an instance and an elastic inference accelerator. \\n        </p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ElasticInferenceAcceleratorAssociationList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ElasticInferenceAcceleratorAssociation\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ElasticInferenceAcceleratorCount\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ElasticInferenceAccelerators\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ElasticInferenceAccelerator\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ElasticIpAssociationId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#EnaSrdSpecification\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"EnaSrdEnabled\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether ENA Express is enabled for the network interface.</p>\"\n                    }\n                },\n                \"EnaSrdUdpSpecification\": {\n                    \"target\": \"com.amazonaws.ec2#EnaSrdUdpSpecification\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Configures ENA Express for UDP network traffic.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>ENA Express uses Amazon Web Services Scalable Reliable Datagram (SRD) technology to increase the \\n\\t\\t\\tmaximum bandwidth used per stream and minimize tail latency of network traffic between EC2 instances. \\n\\t\\t\\tWith ENA Express, you can communicate between two EC2 instances in the same subnet within the same \\n\\t\\t\\taccount, or in different accounts. Both sending and receiving instances must have ENA Express enabled.</p>\\n         <p>To improve the reliability of network packet delivery, ENA Express reorders network packets on the \\n\\t\\t\\treceiving end by default. However, some UDP-based applications are designed to handle network packets \\n\\t\\t\\tthat are out of order to reduce the overhead for packet delivery at the network layer. When ENA Express \\n\\t\\t\\tis enabled, you can specify whether UDP network traffic uses it.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#EnaSrdSpecificationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"EnaSrdEnabled\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies whether ENA Express is enabled for the network interface when you launch an\\n            instance.</p>\"\n                    }\n                },\n                \"EnaSrdUdpSpecification\": {\n                    \"target\": \"com.amazonaws.ec2#EnaSrdUdpSpecificationRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Contains ENA Express settings for UDP network traffic for the network interface\\n            attached to the instance.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Launch instances with ENA Express settings configured from your launch\\n            template.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#EnaSrdSupported\": {\n            \"type\": \"boolean\"\n        },\n        \"com.amazonaws.ec2#EnaSrdUdpSpecification\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"EnaSrdUdpEnabled\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether UDP traffic to and from the instance uses ENA Express. To specify this setting, \\n\\t\\t\\tyou must first enable ENA Express.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>ENA Express is compatible with both TCP and UDP transport protocols. When it's enabled, TCP traffic \\n\\t\\t\\tautomatically uses it. However, some UDP-based applications are designed to handle network packets that are \\n\\t\\t\\tout of order, without a need for retransmission, such as live video broadcasting or other near-real-time \\n\\t\\t\\tapplications. For UDP traffic, you can specify whether to use ENA Express, based on your application \\n\\t\\t\\tenvironment needs.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#EnaSrdUdpSpecificationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"EnaSrdUdpEnabled\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether UDP traffic uses ENA Express for your instance. To ensure that UDP\\n            traffic can use ENA Express when you launch an instance, you must also set <b>EnaSrdEnabled</b> in the <b>EnaSrdSpecificationRequest</b> to <code>true</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Configures ENA Express for UDP network traffic from your launch template.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#EnaSupport\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"unsupported\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"unsupported\"\n                    }\n                },\n                \"supported\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"supported\"\n                    }\n                },\n                \"required\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"required\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#EnableAddressTransfer\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#EnableAddressTransferRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#EnableAddressTransferResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Enables Elastic IP address transfer. For more information, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/userguide/vpc-eips.html#transfer-EIPs-intro\\\">Transfer Elastic IP addresses</a> in the <i>Amazon VPC User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#EnableAddressTransferRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AllocationId\": {\n                    \"target\": \"com.amazonaws.ec2#AllocationId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The allocation ID of an Elastic IP address.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TransferAccountId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the account that you want to transfer the Elastic IP address to.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#EnableAddressTransferResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AddressTransfer\": {\n                    \"target\": \"com.amazonaws.ec2#AddressTransfer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AddressTransfer\",\n                        \"smithy.api#documentation\": \"<p>An Elastic IP address transfer.</p>\",\n                        \"smithy.api#xmlName\": \"addressTransfer\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#EnableAllowedImagesSettings\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#EnableAllowedImagesSettingsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#EnableAllowedImagesSettingsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Enables Allowed AMIs for your account in the specified Amazon Web Services Region. Two values are\\n      accepted:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>enabled</code>: The image criteria in your Allowed AMIs settings are applied. As\\n          a result, only AMIs matching these criteria are discoverable and can be used by your\\n          account to launch instances.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>audit-mode</code>: The image criteria in your Allowed AMIs settings are not\\n          applied. No restrictions are placed on AMI discoverability or usage. Users in your account\\n          can launch instances using any public AMI or AMI shared with your account.</p>\\n               <p>The purpose of <code>audit-mode</code> is to indicate which AMIs will be affected when\\n          Allowed AMIs is <code>enabled</code>. In <code>audit-mode</code>, each AMI displays either\\n          <code>\\\"ImageAllowed\\\": true</code> or <code>\\\"ImageAllowed\\\": false</code> to indicate\\n          whether the AMI will be discoverable and available to users in the account when Allowed\\n          AMIs is enabled.</p>\\n            </li>\\n         </ul>\\n         <note>\\n            <p>The Allowed AMIs feature does not restrict the AMIs owned by your account. Regardless of\\n        the criteria you set, the AMIs created by your account will always be discoverable and\\n        usable by users in your account.</p>\\n         </note>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-allowed-amis.html\\\">Control the discovery and use of AMIs in\\n      Amazon EC2 with Allowed AMIs</a> in\\n      <i>Amazon EC2 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#EnableAllowedImagesSettingsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AllowedImagesSettingsState\": {\n                    \"target\": \"com.amazonaws.ec2#AllowedImagesSettingsEnabledState\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>Specify <code>enabled</code> to apply the image criteria specified by the Allowed AMIs\\n      settings. Specify <code>audit-mode</code> so that you can check which AMIs will be allowed or\\n      not allowed by the image criteria.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n\\t\\t\\tand provides an error response. If you have the required permissions, the error response is \\n\\t\\t\\t<code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#EnableAllowedImagesSettingsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AllowedImagesSettingsState\": {\n                    \"target\": \"com.amazonaws.ec2#AllowedImagesSettingsEnabledState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AllowedImagesSettingsState\",\n                        \"smithy.api#documentation\": \"<p>Returns <code>enabled</code> or <code>audit-mode</code> if the request succeeds;\\n      otherwise, it returns an error.</p>\",\n                        \"smithy.api#xmlName\": \"allowedImagesSettingsState\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#EnableAwsNetworkPerformanceMetricSubscription\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#EnableAwsNetworkPerformanceMetricSubscriptionRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#EnableAwsNetworkPerformanceMetricSubscriptionResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Enables Infrastructure Performance subscriptions.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#EnableAwsNetworkPerformanceMetricSubscriptionRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Source\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The source Region (like <code>us-east-1</code>) or Availability Zone ID (like <code>use1-az1</code>) that the metric subscription is enabled for. If you use Availability Zone IDs, the Source and Destination Availability Zones must be in the same Region.</p>\"\n                    }\n                },\n                \"Destination\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The target Region (like <code>us-east-2</code>) or Availability Zone ID (like <code>use2-az2</code>) that the metric subscription is enabled for. If you use Availability Zone IDs, the Source and Destination Availability Zones must be in the same Region.</p>\"\n                    }\n                },\n                \"Metric\": {\n                    \"target\": \"com.amazonaws.ec2#MetricType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The metric used for the enabled subscription.</p>\"\n                    }\n                },\n                \"Statistic\": {\n                    \"target\": \"com.amazonaws.ec2#StatisticType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The statistic used for the enabled subscription.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#EnableAwsNetworkPerformanceMetricSubscriptionResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Output\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Output\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether the subscribe action was successful.</p>\",\n                        \"smithy.api#xmlName\": \"output\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#EnableEbsEncryptionByDefault\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#EnableEbsEncryptionByDefaultRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#EnableEbsEncryptionByDefaultResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Enables EBS encryption by default for your account in the current Region.</p>\\n         <p>After you enable encryption by default, the EBS volumes that you create are\\n    \\talways encrypted, either using the default KMS key or the KMS key that you specified\\n      when you created each volume. For more information, see <a href=\\\"https://docs.aws.amazon.com/ebs/latest/userguide/ebs-encryption.html\\\">Amazon EBS encryption</a> in the\\n      <i>Amazon EBS User Guide</i>.</p>\\n         <p>Enabling encryption by default has no effect on the encryption status of your \\n      existing volumes.</p>\\n         <p>After you enable encryption by default, you can no longer launch instances\\n      using instance types that do not support encryption. For more information, see <a href=\\\"https://docs.aws.amazon.com/ebs/latest/userguide/ebs-encryption-requirements.html#ebs-encryption_supported_instances\\\">Supported\\n        instance types</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#EnableEbsEncryptionByDefaultRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#EnableEbsEncryptionByDefaultResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"EbsEncryptionByDefault\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EbsEncryptionByDefault\",\n                        \"smithy.api#documentation\": \"<p>The updated status of encryption by default.</p>\",\n                        \"smithy.api#xmlName\": \"ebsEncryptionByDefault\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#EnableFastLaunch\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#EnableFastLaunchRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#EnableFastLaunchResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>When you enable Windows fast launch for a Windows AMI, images are pre-provisioned, using\\n      snapshots to launch instances up to 65% faster. To create the optimized Windows image, Amazon EC2\\n      launches an instance and runs through Sysprep steps, rebooting as required. Then it creates a\\n      set of reserved snapshots that are used for subsequent launches. The reserved snapshots are\\n      automatically replenished as they are used, depending on your settings for launch\\n      frequency.</p>\\n         <note>\\n            <p>You can only change these settings for Windows AMIs that you own or that have been\\n        shared with you.</p>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.ec2#EnableFastLaunchRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ImageId\": {\n                    \"target\": \"com.amazonaws.ec2#ImageId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>Specify the ID of the image for which to enable Windows fast launch.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ResourceType\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of resource to use for pre-provisioning the AMI for Windows fast launch.\\n      Supported values include: <code>snapshot</code>, which is the default value.</p>\"\n                    }\n                },\n                \"SnapshotConfiguration\": {\n                    \"target\": \"com.amazonaws.ec2#FastLaunchSnapshotConfigurationRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Configuration settings for creating and managing the snapshots that are used for\\n      pre-provisioning the AMI for Windows fast launch. The associated <code>ResourceType</code>\\n      must be <code>snapshot</code>.</p>\"\n                    }\n                },\n                \"LaunchTemplate\": {\n                    \"target\": \"com.amazonaws.ec2#FastLaunchLaunchTemplateSpecificationRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The launch template to use when launching Windows instances from pre-provisioned\\n      snapshots. Launch template parameters can include either the name or ID of the launch\\n      template, but not both.</p>\"\n                    }\n                },\n                \"MaxParallelLaunches\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of instances that Amazon EC2 can launch at the same time to create\\n      pre-provisioned snapshots for Windows fast launch. Value must be <code>6</code> or\\n      greater.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n\\t\\t\\tand provides an error response. If you have the required permissions, the error response is \\n\\t\\t\\t<code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#EnableFastLaunchResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ImageId\": {\n                    \"target\": \"com.amazonaws.ec2#ImageId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ImageId\",\n                        \"smithy.api#documentation\": \"<p>The image ID that identifies the AMI for which Windows fast launch was enabled.</p>\",\n                        \"smithy.api#xmlName\": \"imageId\"\n                    }\n                },\n                \"ResourceType\": {\n                    \"target\": \"com.amazonaws.ec2#FastLaunchResourceType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResourceType\",\n                        \"smithy.api#documentation\": \"<p>The type of resource that was defined for pre-provisioning the AMI for Windows fast\\n      launch.</p>\",\n                        \"smithy.api#xmlName\": \"resourceType\"\n                    }\n                },\n                \"SnapshotConfiguration\": {\n                    \"target\": \"com.amazonaws.ec2#FastLaunchSnapshotConfigurationResponse\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SnapshotConfiguration\",\n                        \"smithy.api#documentation\": \"<p>Settings to create and manage the pre-provisioned snapshots that Amazon EC2 uses for faster\\n      launches from the Windows AMI. This property is returned when the associated\\n        <code>resourceType</code> is <code>snapshot</code>.</p>\",\n                        \"smithy.api#xmlName\": \"snapshotConfiguration\"\n                    }\n                },\n                \"LaunchTemplate\": {\n                    \"target\": \"com.amazonaws.ec2#FastLaunchLaunchTemplateSpecificationResponse\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LaunchTemplate\",\n                        \"smithy.api#documentation\": \"<p>The launch template that is used when launching Windows instances from pre-provisioned\\n      snapshots.</p>\",\n                        \"smithy.api#xmlName\": \"launchTemplate\"\n                    }\n                },\n                \"MaxParallelLaunches\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MaxParallelLaunches\",\n                        \"smithy.api#documentation\": \"<p>The maximum number of instances that Amazon EC2 can launch at the same time to create\\n      pre-provisioned snapshots for Windows fast launch.</p>\",\n                        \"smithy.api#xmlName\": \"maxParallelLaunches\"\n                    }\n                },\n                \"OwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OwnerId\",\n                        \"smithy.api#documentation\": \"<p>The owner ID for the AMI for which Windows fast launch was enabled.</p>\",\n                        \"smithy.api#xmlName\": \"ownerId\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#FastLaunchStateCode\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The current state of Windows fast launch for the specified AMI.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                },\n                \"StateTransitionReason\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"StateTransitionReason\",\n                        \"smithy.api#documentation\": \"<p>The reason that the state changed for Windows fast launch for the AMI.</p>\",\n                        \"smithy.api#xmlName\": \"stateTransitionReason\"\n                    }\n                },\n                \"StateTransitionTime\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"StateTransitionTime\",\n                        \"smithy.api#documentation\": \"<p>The time that the state changed for Windows fast launch for the AMI.</p>\",\n                        \"smithy.api#xmlName\": \"stateTransitionTime\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#EnableFastSnapshotRestoreErrorItem\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SnapshotId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SnapshotId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the snapshot.</p>\",\n                        \"smithy.api#xmlName\": \"snapshotId\"\n                    }\n                },\n                \"FastSnapshotRestoreStateErrors\": {\n                    \"target\": \"com.amazonaws.ec2#EnableFastSnapshotRestoreStateErrorSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"FastSnapshotRestoreStateErrorSet\",\n                        \"smithy.api#documentation\": \"<p>The errors.</p>\",\n                        \"smithy.api#xmlName\": \"fastSnapshotRestoreStateErrorSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains information about the errors that occurred when enabling fast snapshot restores.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#EnableFastSnapshotRestoreErrorSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#EnableFastSnapshotRestoreErrorItem\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#EnableFastSnapshotRestoreStateError\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Code\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Code\",\n                        \"smithy.api#documentation\": \"<p>The error code.</p>\",\n                        \"smithy.api#xmlName\": \"code\"\n                    }\n                },\n                \"Message\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Message\",\n                        \"smithy.api#documentation\": \"<p>The error message.</p>\",\n                        \"smithy.api#xmlName\": \"message\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes an error that occurred when enabling fast snapshot restores.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#EnableFastSnapshotRestoreStateErrorItem\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AvailabilityZone\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AvailabilityZone\",\n                        \"smithy.api#documentation\": \"<p>The Availability Zone.</p>\",\n                        \"smithy.api#xmlName\": \"availabilityZone\"\n                    }\n                },\n                \"Error\": {\n                    \"target\": \"com.amazonaws.ec2#EnableFastSnapshotRestoreStateError\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Error\",\n                        \"smithy.api#documentation\": \"<p>The error.</p>\",\n                        \"smithy.api#xmlName\": \"error\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains information about an error that occurred when enabling fast snapshot restores.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#EnableFastSnapshotRestoreStateErrorSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#EnableFastSnapshotRestoreStateErrorItem\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#EnableFastSnapshotRestoreSuccessItem\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SnapshotId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SnapshotId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the snapshot.</p>\",\n                        \"smithy.api#xmlName\": \"snapshotId\"\n                    }\n                },\n                \"AvailabilityZone\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AvailabilityZone\",\n                        \"smithy.api#documentation\": \"<p>The Availability Zone.</p>\",\n                        \"smithy.api#xmlName\": \"availabilityZone\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#FastSnapshotRestoreStateCode\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The state of fast snapshot restores.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                },\n                \"StateTransitionReason\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"StateTransitionReason\",\n                        \"smithy.api#documentation\": \"<p>The reason for the state transition. The possible values are as follows:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>Client.UserInitiated</code> - The state successfully transitioned to <code>enabling</code> or\\n          <code>disabling</code>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>Client.UserInitiated - Lifecycle state transition</code> - The state successfully transitioned \\n          to <code>optimizing</code>, <code>enabled</code>, or <code>disabled</code>.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"stateTransitionReason\"\n                    }\n                },\n                \"OwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OwnerId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Amazon Web Services account that enabled fast snapshot restores on the snapshot.</p>\",\n                        \"smithy.api#xmlName\": \"ownerId\"\n                    }\n                },\n                \"OwnerAlias\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OwnerAlias\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services owner alias that enabled fast snapshot restores on the snapshot. This is intended for future use.</p>\",\n                        \"smithy.api#xmlName\": \"ownerAlias\"\n                    }\n                },\n                \"EnablingTime\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EnablingTime\",\n                        \"smithy.api#documentation\": \"<p>The time at which fast snapshot restores entered the <code>enabling</code> state.</p>\",\n                        \"smithy.api#xmlName\": \"enablingTime\"\n                    }\n                },\n                \"OptimizingTime\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OptimizingTime\",\n                        \"smithy.api#documentation\": \"<p>The time at which fast snapshot restores entered the <code>optimizing</code> state.</p>\",\n                        \"smithy.api#xmlName\": \"optimizingTime\"\n                    }\n                },\n                \"EnabledTime\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EnabledTime\",\n                        \"smithy.api#documentation\": \"<p>The time at which fast snapshot restores entered the <code>enabled</code> state.</p>\",\n                        \"smithy.api#xmlName\": \"enabledTime\"\n                    }\n                },\n                \"DisablingTime\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DisablingTime\",\n                        \"smithy.api#documentation\": \"<p>The time at which fast snapshot restores entered the <code>disabling</code> state.</p>\",\n                        \"smithy.api#xmlName\": \"disablingTime\"\n                    }\n                },\n                \"DisabledTime\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DisabledTime\",\n                        \"smithy.api#documentation\": \"<p>The time at which fast snapshot restores entered the <code>disabled</code> state.</p>\",\n                        \"smithy.api#xmlName\": \"disabledTime\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes fast snapshot restores that were successfully enabled.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#EnableFastSnapshotRestoreSuccessSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#EnableFastSnapshotRestoreSuccessItem\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#EnableFastSnapshotRestores\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#EnableFastSnapshotRestoresRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#EnableFastSnapshotRestoresResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Enables fast snapshot restores for the specified snapshots in the specified Availability Zones.</p>\\n         <p>You get the full benefit of fast snapshot restores after they enter the <code>enabled</code> state.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/ebs/latest/userguide/ebs-fast-snapshot-restore.html\\\">Amazon EBS fast snapshot\\n      restore</a> in the <i>Amazon EBS User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#EnableFastSnapshotRestoresRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AvailabilityZones\": {\n                    \"target\": \"com.amazonaws.ec2#AvailabilityZoneStringList\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>One or more Availability Zones. For example, <code>us-east-2a</code>.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"AvailabilityZone\"\n                    }\n                },\n                \"SourceSnapshotIds\": {\n                    \"target\": \"com.amazonaws.ec2#SnapshotIdStringList\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The IDs of one or more snapshots. For example, <code>snap-1234567890abcdef0</code>. You can specify\\n      a snapshot that was shared with you from another Amazon Web Services account.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"SourceSnapshotId\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#EnableFastSnapshotRestoresResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Successful\": {\n                    \"target\": \"com.amazonaws.ec2#EnableFastSnapshotRestoreSuccessSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Successful\",\n                        \"smithy.api#documentation\": \"<p>Information about the snapshots for which fast snapshot restores were successfully enabled.</p>\",\n                        \"smithy.api#xmlName\": \"successful\"\n                    }\n                },\n                \"Unsuccessful\": {\n                    \"target\": \"com.amazonaws.ec2#EnableFastSnapshotRestoreErrorSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Unsuccessful\",\n                        \"smithy.api#documentation\": \"<p>Information about the snapshots for which fast snapshot restores could not be enabled.</p>\",\n                        \"smithy.api#xmlName\": \"unsuccessful\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#EnableImage\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#EnableImageRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#EnableImageResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Re-enables a disabled AMI. The re-enabled AMI is marked as <code>available</code> and can\\n      be used for instance launches, appears in describe operations, and can be shared. Amazon Web Services\\n      accounts, organizations, and Organizational Units that lost access to the AMI when it was\\n      disabled do not regain access automatically. Once the AMI is available, it can be shared with\\n      them again.</p>\\n         <p>Only the AMI owner can re-enable a disabled AMI.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/disable-an-ami.html\\\">Disable an Amazon EC2 AMI</a>\\n      in the <i>Amazon EC2 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#EnableImageBlockPublicAccess\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#EnableImageBlockPublicAccessRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#EnableImageBlockPublicAccessResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Enables <i>block public access for AMIs</i> at the account level in the\\n      specified Amazon Web Services Region. This prevents the public sharing of your AMIs. However, if you already\\n      have public AMIs, they will remain publicly available.</p>\\n         <p>The API can take up to 10 minutes to configure this setting. During this time, if you run\\n      <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetImageBlockPublicAccessState.html\\\">GetImageBlockPublicAccessState</a>, the response will be <code>unblocked</code>. When\\n      the API has completed the configuration, the response will be\\n      <code>block-new-sharing</code>.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/block-public-access-to-amis.html\\\">Block\\n      public access to your AMIs</a> in the <i>Amazon EC2 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#EnableImageBlockPublicAccessRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ImageBlockPublicAccessState\": {\n                    \"target\": \"com.amazonaws.ec2#ImageBlockPublicAccessEnabledState\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>Specify <code>block-new-sharing</code> to enable block public access for AMIs at the\\n      account level in the specified Region. This will block any attempt to publicly share your AMIs\\n      in the specified Region.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n\\t\\t\\tand provides an error response. If you have the required permissions, the error response is \\n\\t\\t\\t<code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#EnableImageBlockPublicAccessResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ImageBlockPublicAccessState\": {\n                    \"target\": \"com.amazonaws.ec2#ImageBlockPublicAccessEnabledState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ImageBlockPublicAccessState\",\n                        \"smithy.api#documentation\": \"<p>Returns <code>block-new-sharing</code> if the request succeeds; otherwise, it returns an\\n      error.</p>\",\n                        \"smithy.api#xmlName\": \"imageBlockPublicAccessState\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#EnableImageDeprecation\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#EnableImageDeprecationRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#EnableImageDeprecationResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Enables deprecation of the specified AMI at the specified date and time.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ami-deprecate.html\\\">Deprecate an AMI</a> in the\\n      <i>Amazon EC2 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#EnableImageDeprecationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ImageId\": {\n                    \"target\": \"com.amazonaws.ec2#ImageId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the AMI.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DeprecateAt\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The date and time to deprecate the AMI, in UTC, in the following format:\\n      <i>YYYY</i>-<i>MM</i>-<i>DD</i>T<i>HH</i>:<i>MM</i>:<i>SS</i>Z.\\n      If you specify a value for seconds, Amazon EC2 rounds the seconds to the nearest minute.</p>\\n         <p>You can’t specify a date in the past. The upper limit for <code>DeprecateAt</code> is 10\\n      years from now, except for public AMIs, where the upper limit is 2 years from the creation\\n      date.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n\\t\\t\\tand provides an error response. If you have the required permissions, the error response is \\n\\t\\t\\t<code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#EnableImageDeprecationResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Return\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Return\",\n                        \"smithy.api#documentation\": \"<p>Returns <code>true</code> if the request succeeds; otherwise, it returns an error.</p>\",\n                        \"smithy.api#xmlName\": \"return\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#EnableImageDeregistrationProtection\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#EnableImageDeregistrationProtectionRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#EnableImageDeregistrationProtectionResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Enables deregistration protection for an AMI. When deregistration protection is enabled,\\n      the AMI can't be deregistered.</p>\\n         <p>To allow the AMI to be deregistered, you must first disable deregistration protection.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ami-deregistration-protection.html\\\">Protect an\\n      Amazon EC2 AMI from deregistration</a> in the <i>Amazon EC2 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#EnableImageDeregistrationProtectionRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ImageId\": {\n                    \"target\": \"com.amazonaws.ec2#ImageId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the AMI.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"WithCooldown\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If <code>true</code>, enforces deregistration protection for 24 hours after deregistration\\n      protection is disabled.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n\\t\\t\\tand provides an error response. If you have the required permissions, the error response is \\n\\t\\t\\t<code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#EnableImageDeregistrationProtectionResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Return\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Return\",\n                        \"smithy.api#documentation\": \"<p>Returns <code>true</code> if the request succeeds; otherwise, it returns an error.</p>\",\n                        \"smithy.api#xmlName\": \"return\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#EnableImageRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ImageId\": {\n                    \"target\": \"com.amazonaws.ec2#ImageId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the AMI.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n\\t\\t\\tand provides an error response. If you have the required permissions, the error response is \\n\\t\\t\\t<code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#EnableImageResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Return\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Return\",\n                        \"smithy.api#documentation\": \"<p>Returns <code>true</code> if the request succeeds; otherwise, it returns an error.</p>\",\n                        \"smithy.api#xmlName\": \"return\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#EnableIpamOrganizationAdminAccount\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#EnableIpamOrganizationAdminAccountRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#EnableIpamOrganizationAdminAccountResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Enable an Organizations member account as the IPAM admin account. You cannot select the Organizations management account as the IPAM admin account. For more information, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/ipam/enable-integ-ipam.html\\\">Enable integration with Organizations</a> in the <i>Amazon VPC IPAM User Guide</i>.\\n      </p>\"\n            }\n        },\n        \"com.amazonaws.ec2#EnableIpamOrganizationAdminAccountRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A check for whether you have the required permissions for the action without actually making the request \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"DelegatedAdminAccountId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The Organizations member account ID that you want to enable as the IPAM account.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#EnableIpamOrganizationAdminAccountResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Success\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Success\",\n                        \"smithy.api#documentation\": \"<p>The result of enabling the IPAM account.</p>\",\n                        \"smithy.api#xmlName\": \"success\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#EnableReachabilityAnalyzerOrganizationSharing\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#EnableReachabilityAnalyzerOrganizationSharingRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#EnableReachabilityAnalyzerOrganizationSharingResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Establishes a trust relationship between Reachability Analyzer and Organizations.\\n         This operation must be performed by the management account for the organization.</p>\\n         <p>After you establish a trust relationship, a user in the management account or \\n         a delegated administrator account can run a cross-account analysis using resources \\n         from the member accounts.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#EnableReachabilityAnalyzerOrganizationSharingRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#EnableReachabilityAnalyzerOrganizationSharingResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ReturnValue\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ReturnValue\",\n                        \"smithy.api#documentation\": \"<p>Returns <code>true</code> if the request succeeds; otherwise, returns an error.</p>\",\n                        \"smithy.api#xmlName\": \"returnValue\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#EnableRouteServerPropagation\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#EnableRouteServerPropagationRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#EnableRouteServerPropagationResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Defines which route tables the route server can update with routes.</p>\\n         <p>When enabled, route server propagation installs the routes in the FIB on the route table you've specified. Route server supports IPv4 and IPv6 route propagation.</p>\\n         <p>For more information see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/userguide/dynamic-routing-route-server.html\\\">Dynamic routing in your VPC with VPC Route Server</a> in the <i>Amazon VPC User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#EnableRouteServerPropagationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RouteServerId\": {\n                    \"target\": \"com.amazonaws.ec2#RouteServerId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the route server for which to enable propagation.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"RouteTableId\": {\n                    \"target\": \"com.amazonaws.ec2#RouteTableId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the route table to which route server will propagate routes.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A check for whether you have the required permissions for the action without actually making the request \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#EnableRouteServerPropagationResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RouteServerPropagation\": {\n                    \"target\": \"com.amazonaws.ec2#RouteServerPropagation\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RouteServerPropagation\",\n                        \"smithy.api#documentation\": \"<p>Information about the enabled route server propagation.</p>\",\n                        \"smithy.api#xmlName\": \"routeServerPropagation\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#EnableSerialConsoleAccess\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#EnableSerialConsoleAccessRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#EnableSerialConsoleAccessResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Enables access to the EC2 serial console of all instances for your account. By default,\\n\\t\\t\\taccess to the EC2 serial console is disabled for your account. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/configure-access-to-serial-console.html#serial-console-account-access\\\">Manage account access to the EC2 serial console</a>\\n\\t\\t\\tin the <i>Amazon EC2 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#EnableSerialConsoleAccessRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#EnableSerialConsoleAccessResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SerialConsoleAccessEnabled\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SerialConsoleAccessEnabled\",\n                        \"smithy.api#documentation\": \"<p>If <code>true</code>, access to the EC2 serial console of all instances is enabled for\\n\\t\\t\\tyour account. If <code>false</code>, access to the EC2 serial console of all instances\\n\\t\\t\\tis disabled for your account.</p>\",\n                        \"smithy.api#xmlName\": \"serialConsoleAccessEnabled\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#EnableSnapshotBlockPublicAccess\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#EnableSnapshotBlockPublicAccessRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#EnableSnapshotBlockPublicAccessResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Enables or modifies the <i>block public access for snapshots</i> \\n      setting at the account level for the specified Amazon Web Services Region. After you enable block \\n      public access for snapshots in a Region, users can no longer request public sharing \\n      for snapshots in that Region. Snapshots that are already publicly shared are either \\n      treated as private or they remain publicly shared, depending on the \\n      <b>State</b> that you specify.</p>\\n         <important>\\n            <p>Enabling block public access for snapshots in <i>block all sharing</i> \\n        mode does not change the permissions for snapshots that are already publicly shared. \\n        Instead, it prevents these snapshots from be publicly visible and publicly accessible. \\n        Therefore, the attributes for these snapshots still indicate that they are publicly \\n        shared, even though they are not publicly available.</p>\\n            <p>If you later disable block public access or change the mode to <i>block new \\n        sharing</i>, these snapshots will become publicly available again.</p>\\n         </important>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/ebs/latest/userguide/block-public-access-snapshots.html\\\">\\n      Block public access for snapshots</a> in the <i>Amazon EBS User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#EnableSnapshotBlockPublicAccessRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#SnapshotBlockPublicAccessState\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The mode in which to enable block public access for snapshots for the Region. \\n      Specify one of the following values:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>block-all-sharing</code> - Prevents all public sharing of snapshots in \\n          the Region. Users in the account will no longer be able to request new public \\n          sharing. Additionally, snapshots that are already publicly shared are treated as \\n          private and they are no longer publicly available.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>block-new-sharing</code>  - Prevents only new public sharing of snapshots \\n          in the Region. Users in the account will no longer be able to request new public \\n          sharing. However, snapshots that are already publicly shared, remain publicly \\n          available.</p>\\n            </li>\\n         </ul>\\n         <p>\\n            <code>unblocked</code> is not a valid value for <b>EnableSnapshotBlockPublicAccess</b>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#EnableSnapshotBlockPublicAccessResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#SnapshotBlockPublicAccessState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The state of block public access for snapshots for the account and Region. Returns \\n      either <code>block-all-sharing</code> or <code>block-new-sharing</code> if the request \\n      succeeds.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#EnableTransitGatewayRouteTablePropagation\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#EnableTransitGatewayRouteTablePropagationRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#EnableTransitGatewayRouteTablePropagationResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Enables the specified attachment to propagate routes to the specified\\n         propagation route table.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#EnableTransitGatewayRouteTablePropagationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayRouteTableId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayRouteTableId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the propagation route table.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TransitGatewayAttachmentId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayAttachmentId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the attachment.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"TransitGatewayRouteTableAnnouncementId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayRouteTableAnnouncementId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the transit gateway route table announcement.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#EnableTransitGatewayRouteTablePropagationResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Propagation\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayPropagation\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Propagation\",\n                        \"smithy.api#documentation\": \"<p>Information about route propagation.</p>\",\n                        \"smithy.api#xmlName\": \"propagation\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#EnableVgwRoutePropagation\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#EnableVgwRoutePropagationRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Enables a virtual private gateway (VGW) to propagate routes to the specified route\\n            table of a VPC.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To enable route propagation\",\n                        \"documentation\": \"This example enables the specified virtual private gateway to propagate static routes to the specified route table.\",\n                        \"input\": {\n                            \"RouteTableId\": \"rtb-22574640\",\n                            \"GatewayId\": \"vgw-9a4cacf3\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#EnableVgwRoutePropagationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"GatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#VpnGatewayId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the virtual private gateway that is attached to a VPC. The virtual private\\n            gateway must be attached to the same VPC that the routing tables are associated with.\\n        </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"RouteTableId\": {\n                    \"target\": \"com.amazonaws.ec2#RouteTableId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the route table. The routing table must be associated with the same VPC that\\n            the virtual private gateway is attached to. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually\\n            making the request, and provides an error response. If you have the required\\n            permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is\\n                <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the parameters for EnableVgwRoutePropagation.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#EnableVolumeIO\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#EnableVolumeIORequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Enables I/O operations for a volume that had I/O operations disabled because the data on\\n      the volume was potentially inconsistent.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To enable I/O for a volume\",\n                        \"documentation\": \"This example enables I/O on volume ``vol-1234567890abcdef0``.\",\n                        \"input\": {\n                            \"VolumeId\": \"vol-1234567890abcdef0\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#EnableVolumeIORequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"VolumeId\": {\n                    \"target\": \"com.amazonaws.ec2#VolumeId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VolumeId\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the volume.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"volumeId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#EnableVpcClassicLink\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#EnableVpcClassicLinkRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#EnableVpcClassicLinkResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>This action is deprecated.</p>\\n         </note>\\n         <p>Enables a VPC for ClassicLink. You can then link EC2-Classic instances to your\\n\\t\\t\\tClassicLink-enabled VPC to allow communication over private IP addresses. You cannot\\n\\t\\t\\tenable your VPC for ClassicLink if any of your VPC route tables have existing routes for\\n\\t\\t\\taddress ranges within the <code>10.0.0.0/8</code> IP address range, excluding local\\n\\t\\t\\troutes for VPCs in the <code>10.0.0.0/16</code> and <code>10.1.0.0/16</code> IP address\\n\\t\\t\\tranges.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#EnableVpcClassicLinkDnsSupport\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#EnableVpcClassicLinkDnsSupportRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#EnableVpcClassicLinkDnsSupportResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>This action is deprecated.</p>\\n         </note>\\n         <p>Enables a VPC to support DNS hostname resolution for ClassicLink. If enabled, the DNS\\n\\t\\t\\thostname of a linked EC2-Classic instance resolves to its private IP address when\\n\\t\\t\\taddressed from an instance in the VPC to which it's linked. Similarly, the DNS hostname\\n\\t\\t\\tof an instance in a VPC resolves to its private IP address when addressed from a linked\\n\\t\\t\\tEC2-Classic instance.</p>\\n         <p>You must specify a VPC ID in the request.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#EnableVpcClassicLinkDnsSupportRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VpcId\": {\n                    \"target\": \"com.amazonaws.ec2#VpcId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the VPC.</p>\",\n                        \"smithy.api#xmlName\": \"VpcId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#EnableVpcClassicLinkDnsSupportResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Return\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Return\",\n                        \"smithy.api#documentation\": \"<p>Returns <code>true</code> if the request succeeds; otherwise, it returns an error.</p>\",\n                        \"smithy.api#xmlName\": \"return\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#EnableVpcClassicLinkRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"VpcId\": {\n                    \"target\": \"com.amazonaws.ec2#VpcId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcId\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the VPC.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"vpcId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#EnableVpcClassicLinkResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Return\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Return\",\n                        \"smithy.api#documentation\": \"<p>Returns <code>true</code> if the request succeeds; otherwise, it returns an error.</p>\",\n                        \"smithy.api#xmlName\": \"return\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#EnclaveOptions\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Enabled\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Enabled\",\n                        \"smithy.api#documentation\": \"<p>If this parameter is set to <code>true</code>, the instance is enabled for Amazon Web Services Nitro Enclaves; otherwise, it is not enabled for Amazon Web Services Nitro\\n            Enclaves.</p>\",\n                        \"smithy.api#xmlName\": \"enabled\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Indicates whether the instance is enabled for Amazon Web Services Nitro\\n            Enclaves.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#EnclaveOptionsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Enabled\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>To enable the instance for Amazon Web Services Nitro Enclaves, set this parameter to\\n                <code>true</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Indicates whether the instance is enabled for Amazon Web Services Nitro Enclaves. For\\n            more information, see <a href=\\\"https://docs.aws.amazon.com/enclaves/latest/user/nitro-enclave.html\\\"> What is Amazon Web Services Nitro\\n                Enclaves?</a> in the <i>Amazon Web Services Nitro Enclaves User\\n                Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#EncryptionInTransitSupported\": {\n            \"type\": \"boolean\"\n        },\n        \"com.amazonaws.ec2#EndDateType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"unlimited\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"unlimited\"\n                    }\n                },\n                \"limited\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"limited\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#EndpointIpAddressType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ipv4\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ipv4\"\n                    }\n                },\n                \"ipv6\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ipv6\"\n                    }\n                },\n                \"dual_stack\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"dual-stack\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#EndpointSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ClientVpnEndpoint\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#EphemeralNvmeSupport\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"UNSUPPORTED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"unsupported\"\n                    }\n                },\n                \"SUPPORTED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"supported\"\n                    }\n                },\n                \"REQUIRED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"required\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ErrorSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ValidationError\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#EventCode\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"instance_reboot\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"instance-reboot\"\n                    }\n                },\n                \"system_reboot\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"system-reboot\"\n                    }\n                },\n                \"system_maintenance\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"system-maintenance\"\n                    }\n                },\n                \"instance_retirement\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"instance-retirement\"\n                    }\n                },\n                \"instance_stop\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"instance-stop\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#EventInformation\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"EventDescription\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EventDescription\",\n                        \"smithy.api#documentation\": \"<p>The description of the event.</p>\",\n                        \"smithy.api#xmlName\": \"eventDescription\"\n                    }\n                },\n                \"EventSubType\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EventSubType\",\n                        \"smithy.api#documentation\": \"<p>The event.</p>\\n         <p>\\n            <code>error</code> events:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>iamFleetRoleInvalid</code> - The EC2 Fleet or Spot Fleet does not have the required\\n               permissions either to launch or terminate an instance.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>allLaunchSpecsTemporarilyBlacklisted</code> - None of the configurations\\n               are valid, and several attempts to launch instances have failed. For more\\n               information, see the description of the event.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>spotInstanceCountLimitExceeded</code> - You've reached the limit on the\\n               number of Spot Instances that you can launch.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>spotFleetRequestConfigurationInvalid</code> - The configuration is not\\n               valid. For more information, see the description of the event.</p>\\n            </li>\\n         </ul>\\n         <p>\\n            <code>fleetRequestChange</code> events:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>active</code> - The EC2 Fleet or Spot Fleet request has been validated and Amazon EC2 is\\n               attempting to maintain the target number of running instances.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>deleted</code> (EC2 Fleet) / <code>cancelled</code> (Spot Fleet) - The EC2 Fleet is deleted or the Spot Fleet request is canceled and has no running\\n               instances. The EC2 Fleet or Spot Fleet will be deleted two days after its instances are\\n               terminated.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>deleted_running</code> (EC2 Fleet) / <code>cancelled_running</code> (Spot Fleet) - The EC2 Fleet is deleted or the Spot Fleet request is canceled and does\\n               not launch additional instances. Its existing instances continue to run until\\n               they are interrupted or terminated. The request remains in this state until all\\n               instances are interrupted or terminated.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>deleted_terminating</code> (EC2 Fleet) / <code>cancelled_terminating</code> (Spot Fleet) - The EC2 Fleet is deleted or the Spot Fleet request is canceled and\\n               its instances are terminating. The request remains in this state until all\\n               instances are terminated.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>expired</code> - The EC2 Fleet or Spot Fleet request has expired. If the request was\\n               created with <code>TerminateInstancesWithExpiration</code> set, a subsequent\\n               <code>terminated</code> event indicates that the instances are\\n               terminated.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>modify_in_progress</code> - The EC2 Fleet or Spot Fleet request is being modified.\\n               The request remains in this state until the modification is fully\\n               processed.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>modify_succeeded</code> - The EC2 Fleet or Spot Fleet request was modified.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>submitted</code> - The EC2 Fleet or Spot Fleet request is being evaluated and Amazon EC2\\n               is preparing to launch the target number of instances.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>progress</code> - The EC2 Fleet or Spot Fleet request is in the process of being fulfilled.</p>\\n            </li>\\n         </ul>\\n         <p>\\n            <code>instanceChange</code> events:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>launched</code> - A new instance was launched.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>terminated</code> - An instance was terminated by the user.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>termination_notified</code> - An instance termination notification was\\n               sent when a Spot Instance was terminated by Amazon EC2 during scale-down, when the target\\n               capacity of the fleet was modified down, for example, from a target capacity of\\n               4 to a target capacity of 3.</p>\\n            </li>\\n         </ul>\\n         <p>\\n            <code>Information</code> events:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>fleetProgressHalted</code> - The price in every launch specification is\\n               not valid because it is below the Spot price (all the launch specifications have\\n               produced <code>launchSpecUnusable</code> events). A launch specification might\\n               become valid if the Spot price changes.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>launchSpecTemporarilyBlacklisted</code> - The configuration is not valid\\n               and several attempts to launch instances have failed. For more information, see\\n               the description of the event.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>launchSpecUnusable</code> - The price specified in a launch specification \\n               is not valid because it is below the Spot price for the requested Spot pools.</p>\\n               <p>Note: Even if a fleet with the <code>maintain</code> request type is in the process \\n               of being canceled, it may still publish a <code>launchSpecUnusable</code> event. This \\n               does not mean that the canceled fleet is attempting to launch a new instance.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>registerWithLoadBalancersFailed</code> - An attempt to register\\n               instances with load balancers failed. For more information, see the description\\n               of the event.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"eventSubType\"\n                    }\n                },\n                \"InstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the instance. This information is available only for\\n         <code>instanceChange</code> events.</p>\",\n                        \"smithy.api#xmlName\": \"instanceId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes an EC2 Fleet or Spot Fleet event.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#EventType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"INSTANCE_CHANGE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"instanceChange\"\n                    }\n                },\n                \"BATCH_CHANGE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"fleetRequestChange\"\n                    }\n                },\n                \"ERROR\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"error\"\n                    }\n                },\n                \"INFORMATION\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"information\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ExcessCapacityTerminationPolicy\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"NO_TERMINATION\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"noTermination\"\n                    }\n                },\n                \"DEFAULT\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"default\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ExcludedInstanceType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 30\n                },\n                \"smithy.api#pattern\": \"^[a-zA-Z0-9\\\\.\\\\*\\\\-]+$\"\n            }\n        },\n        \"com.amazonaws.ec2#ExcludedInstanceTypeSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ExcludedInstanceType\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 400\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ExecutableByStringList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#String\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"ExecutableBy\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#Explanation\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Acl\": {\n                    \"target\": \"com.amazonaws.ec2#AnalysisComponent\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Acl\",\n                        \"smithy.api#documentation\": \"<p>The network ACL.</p>\",\n                        \"smithy.api#xmlName\": \"acl\"\n                    }\n                },\n                \"AclRule\": {\n                    \"target\": \"com.amazonaws.ec2#AnalysisAclRule\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AclRule\",\n                        \"smithy.api#documentation\": \"<p>The network ACL rule.</p>\",\n                        \"smithy.api#xmlName\": \"aclRule\"\n                    }\n                },\n                \"Address\": {\n                    \"target\": \"com.amazonaws.ec2#IpAddress\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Address\",\n                        \"smithy.api#documentation\": \"<p>The IPv4 address, in CIDR notation.</p>\",\n                        \"smithy.api#xmlName\": \"address\"\n                    }\n                },\n                \"Addresses\": {\n                    \"target\": \"com.amazonaws.ec2#IpAddressList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AddressSet\",\n                        \"smithy.api#documentation\": \"<p>The IPv4 addresses, in CIDR notation.</p>\",\n                        \"smithy.api#xmlName\": \"addressSet\"\n                    }\n                },\n                \"AttachedTo\": {\n                    \"target\": \"com.amazonaws.ec2#AnalysisComponent\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AttachedTo\",\n                        \"smithy.api#documentation\": \"<p>The resource to which the component is attached.</p>\",\n                        \"smithy.api#xmlName\": \"attachedTo\"\n                    }\n                },\n                \"AvailabilityZones\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AvailabilityZoneSet\",\n                        \"smithy.api#documentation\": \"<p>The Availability Zones.</p>\",\n                        \"smithy.api#xmlName\": \"availabilityZoneSet\"\n                    }\n                },\n                \"AvailabilityZoneIds\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AvailabilityZoneIdSet\",\n                        \"smithy.api#documentation\": \"<p>The IDs of the Availability Zones.</p>\",\n                        \"smithy.api#xmlName\": \"availabilityZoneIdSet\"\n                    }\n                },\n                \"Cidrs\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CidrSet\",\n                        \"smithy.api#documentation\": \"<p>The CIDR ranges.</p>\",\n                        \"smithy.api#xmlName\": \"cidrSet\"\n                    }\n                },\n                \"Component\": {\n                    \"target\": \"com.amazonaws.ec2#AnalysisComponent\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Component\",\n                        \"smithy.api#documentation\": \"<p>The component.</p>\",\n                        \"smithy.api#xmlName\": \"component\"\n                    }\n                },\n                \"CustomerGateway\": {\n                    \"target\": \"com.amazonaws.ec2#AnalysisComponent\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CustomerGateway\",\n                        \"smithy.api#documentation\": \"<p>The customer gateway.</p>\",\n                        \"smithy.api#xmlName\": \"customerGateway\"\n                    }\n                },\n                \"Destination\": {\n                    \"target\": \"com.amazonaws.ec2#AnalysisComponent\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Destination\",\n                        \"smithy.api#documentation\": \"<p>The destination.</p>\",\n                        \"smithy.api#xmlName\": \"destination\"\n                    }\n                },\n                \"DestinationVpc\": {\n                    \"target\": \"com.amazonaws.ec2#AnalysisComponent\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DestinationVpc\",\n                        \"smithy.api#documentation\": \"<p>The destination VPC.</p>\",\n                        \"smithy.api#xmlName\": \"destinationVpc\"\n                    }\n                },\n                \"Direction\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Direction\",\n                        \"smithy.api#documentation\": \"<p>The direction. The following are the possible values:</p>\\n         <ul>\\n            <li>\\n               <p>egress</p>\\n            </li>\\n            <li>\\n               <p>ingress</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"direction\"\n                    }\n                },\n                \"ExplanationCode\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ExplanationCode\",\n                        \"smithy.api#documentation\": \"<p>The explanation code.</p>\",\n                        \"smithy.api#xmlName\": \"explanationCode\"\n                    }\n                },\n                \"IngressRouteTable\": {\n                    \"target\": \"com.amazonaws.ec2#AnalysisComponent\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IngressRouteTable\",\n                        \"smithy.api#documentation\": \"<p>The route table.</p>\",\n                        \"smithy.api#xmlName\": \"ingressRouteTable\"\n                    }\n                },\n                \"InternetGateway\": {\n                    \"target\": \"com.amazonaws.ec2#AnalysisComponent\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InternetGateway\",\n                        \"smithy.api#documentation\": \"<p>The internet gateway.</p>\",\n                        \"smithy.api#xmlName\": \"internetGateway\"\n                    }\n                },\n                \"LoadBalancerArn\": {\n                    \"target\": \"com.amazonaws.ec2#ResourceArn\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LoadBalancerArn\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the load balancer.</p>\",\n                        \"smithy.api#xmlName\": \"loadBalancerArn\"\n                    }\n                },\n                \"ClassicLoadBalancerListener\": {\n                    \"target\": \"com.amazonaws.ec2#AnalysisLoadBalancerListener\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ClassicLoadBalancerListener\",\n                        \"smithy.api#documentation\": \"<p>The listener for a Classic Load Balancer.</p>\",\n                        \"smithy.api#xmlName\": \"classicLoadBalancerListener\"\n                    }\n                },\n                \"LoadBalancerListenerPort\": {\n                    \"target\": \"com.amazonaws.ec2#Port\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LoadBalancerListenerPort\",\n                        \"smithy.api#documentation\": \"<p>The listener port of the load balancer.</p>\",\n                        \"smithy.api#xmlName\": \"loadBalancerListenerPort\"\n                    }\n                },\n                \"LoadBalancerTarget\": {\n                    \"target\": \"com.amazonaws.ec2#AnalysisLoadBalancerTarget\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LoadBalancerTarget\",\n                        \"smithy.api#documentation\": \"<p>The target.</p>\",\n                        \"smithy.api#xmlName\": \"loadBalancerTarget\"\n                    }\n                },\n                \"LoadBalancerTargetGroup\": {\n                    \"target\": \"com.amazonaws.ec2#AnalysisComponent\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LoadBalancerTargetGroup\",\n                        \"smithy.api#documentation\": \"<p>The target group.</p>\",\n                        \"smithy.api#xmlName\": \"loadBalancerTargetGroup\"\n                    }\n                },\n                \"LoadBalancerTargetGroups\": {\n                    \"target\": \"com.amazonaws.ec2#AnalysisComponentList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LoadBalancerTargetGroupSet\",\n                        \"smithy.api#documentation\": \"<p>The target groups.</p>\",\n                        \"smithy.api#xmlName\": \"loadBalancerTargetGroupSet\"\n                    }\n                },\n                \"LoadBalancerTargetPort\": {\n                    \"target\": \"com.amazonaws.ec2#Port\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LoadBalancerTargetPort\",\n                        \"smithy.api#documentation\": \"<p>The target port.</p>\",\n                        \"smithy.api#xmlName\": \"loadBalancerTargetPort\"\n                    }\n                },\n                \"ElasticLoadBalancerListener\": {\n                    \"target\": \"com.amazonaws.ec2#AnalysisComponent\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ElasticLoadBalancerListener\",\n                        \"smithy.api#documentation\": \"<p>The load balancer listener.</p>\",\n                        \"smithy.api#xmlName\": \"elasticLoadBalancerListener\"\n                    }\n                },\n                \"MissingComponent\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MissingComponent\",\n                        \"smithy.api#documentation\": \"<p>The missing component.</p>\",\n                        \"smithy.api#xmlName\": \"missingComponent\"\n                    }\n                },\n                \"NatGateway\": {\n                    \"target\": \"com.amazonaws.ec2#AnalysisComponent\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NatGateway\",\n                        \"smithy.api#documentation\": \"<p>The NAT gateway.</p>\",\n                        \"smithy.api#xmlName\": \"natGateway\"\n                    }\n                },\n                \"NetworkInterface\": {\n                    \"target\": \"com.amazonaws.ec2#AnalysisComponent\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkInterface\",\n                        \"smithy.api#documentation\": \"<p>The network interface.</p>\",\n                        \"smithy.api#xmlName\": \"networkInterface\"\n                    }\n                },\n                \"PacketField\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PacketField\",\n                        \"smithy.api#documentation\": \"<p>The packet field.</p>\",\n                        \"smithy.api#xmlName\": \"packetField\"\n                    }\n                },\n                \"VpcPeeringConnection\": {\n                    \"target\": \"com.amazonaws.ec2#AnalysisComponent\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcPeeringConnection\",\n                        \"smithy.api#documentation\": \"<p>The VPC peering connection.</p>\",\n                        \"smithy.api#xmlName\": \"vpcPeeringConnection\"\n                    }\n                },\n                \"Port\": {\n                    \"target\": \"com.amazonaws.ec2#Port\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Port\",\n                        \"smithy.api#documentation\": \"<p>The port.</p>\",\n                        \"smithy.api#xmlName\": \"port\"\n                    }\n                },\n                \"PortRanges\": {\n                    \"target\": \"com.amazonaws.ec2#PortRangeList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PortRangeSet\",\n                        \"smithy.api#documentation\": \"<p>The port ranges.</p>\",\n                        \"smithy.api#xmlName\": \"portRangeSet\"\n                    }\n                },\n                \"PrefixList\": {\n                    \"target\": \"com.amazonaws.ec2#AnalysisComponent\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PrefixList\",\n                        \"smithy.api#documentation\": \"<p>The prefix list.</p>\",\n                        \"smithy.api#xmlName\": \"prefixList\"\n                    }\n                },\n                \"Protocols\": {\n                    \"target\": \"com.amazonaws.ec2#StringList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ProtocolSet\",\n                        \"smithy.api#documentation\": \"<p>The protocols.</p>\",\n                        \"smithy.api#xmlName\": \"protocolSet\"\n                    }\n                },\n                \"RouteTableRoute\": {\n                    \"target\": \"com.amazonaws.ec2#AnalysisRouteTableRoute\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RouteTableRoute\",\n                        \"smithy.api#documentation\": \"<p>The route table route.</p>\",\n                        \"smithy.api#xmlName\": \"routeTableRoute\"\n                    }\n                },\n                \"RouteTable\": {\n                    \"target\": \"com.amazonaws.ec2#AnalysisComponent\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RouteTable\",\n                        \"smithy.api#documentation\": \"<p>The route table.</p>\",\n                        \"smithy.api#xmlName\": \"routeTable\"\n                    }\n                },\n                \"SecurityGroup\": {\n                    \"target\": \"com.amazonaws.ec2#AnalysisComponent\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SecurityGroup\",\n                        \"smithy.api#documentation\": \"<p>The security group.</p>\",\n                        \"smithy.api#xmlName\": \"securityGroup\"\n                    }\n                },\n                \"SecurityGroupRule\": {\n                    \"target\": \"com.amazonaws.ec2#AnalysisSecurityGroupRule\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SecurityGroupRule\",\n                        \"smithy.api#documentation\": \"<p>The security group rule.</p>\",\n                        \"smithy.api#xmlName\": \"securityGroupRule\"\n                    }\n                },\n                \"SecurityGroups\": {\n                    \"target\": \"com.amazonaws.ec2#AnalysisComponentList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SecurityGroupSet\",\n                        \"smithy.api#documentation\": \"<p>The security groups.</p>\",\n                        \"smithy.api#xmlName\": \"securityGroupSet\"\n                    }\n                },\n                \"SourceVpc\": {\n                    \"target\": \"com.amazonaws.ec2#AnalysisComponent\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SourceVpc\",\n                        \"smithy.api#documentation\": \"<p>The source VPC.</p>\",\n                        \"smithy.api#xmlName\": \"sourceVpc\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The state.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                },\n                \"Subnet\": {\n                    \"target\": \"com.amazonaws.ec2#AnalysisComponent\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Subnet\",\n                        \"smithy.api#documentation\": \"<p>The subnet.</p>\",\n                        \"smithy.api#xmlName\": \"subnet\"\n                    }\n                },\n                \"SubnetRouteTable\": {\n                    \"target\": \"com.amazonaws.ec2#AnalysisComponent\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SubnetRouteTable\",\n                        \"smithy.api#documentation\": \"<p>The route table for the subnet.</p>\",\n                        \"smithy.api#xmlName\": \"subnetRouteTable\"\n                    }\n                },\n                \"Vpc\": {\n                    \"target\": \"com.amazonaws.ec2#AnalysisComponent\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Vpc\",\n                        \"smithy.api#documentation\": \"<p>The component VPC.</p>\",\n                        \"smithy.api#xmlName\": \"vpc\"\n                    }\n                },\n                \"VpcEndpoint\": {\n                    \"target\": \"com.amazonaws.ec2#AnalysisComponent\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcEndpoint\",\n                        \"smithy.api#documentation\": \"<p>The VPC endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"vpcEndpoint\"\n                    }\n                },\n                \"VpnConnection\": {\n                    \"target\": \"com.amazonaws.ec2#AnalysisComponent\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpnConnection\",\n                        \"smithy.api#documentation\": \"<p>The VPN connection.</p>\",\n                        \"smithy.api#xmlName\": \"vpnConnection\"\n                    }\n                },\n                \"VpnGateway\": {\n                    \"target\": \"com.amazonaws.ec2#AnalysisComponent\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpnGateway\",\n                        \"smithy.api#documentation\": \"<p>The VPN gateway.</p>\",\n                        \"smithy.api#xmlName\": \"vpnGateway\"\n                    }\n                },\n                \"TransitGateway\": {\n                    \"target\": \"com.amazonaws.ec2#AnalysisComponent\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGateway\",\n                        \"smithy.api#documentation\": \"<p>The transit gateway.</p>\",\n                        \"smithy.api#xmlName\": \"transitGateway\"\n                    }\n                },\n                \"TransitGatewayRouteTable\": {\n                    \"target\": \"com.amazonaws.ec2#AnalysisComponent\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayRouteTable\",\n                        \"smithy.api#documentation\": \"<p>The transit gateway route table.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayRouteTable\"\n                    }\n                },\n                \"TransitGatewayRouteTableRoute\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayRouteTableRoute\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayRouteTableRoute\",\n                        \"smithy.api#documentation\": \"<p>The transit gateway route table route.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayRouteTableRoute\"\n                    }\n                },\n                \"TransitGatewayAttachment\": {\n                    \"target\": \"com.amazonaws.ec2#AnalysisComponent\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayAttachment\",\n                        \"smithy.api#documentation\": \"<p>The transit gateway attachment.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayAttachment\"\n                    }\n                },\n                \"ComponentAccount\": {\n                    \"target\": \"com.amazonaws.ec2#ComponentAccount\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ComponentAccount\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account for the component.</p>\",\n                        \"smithy.api#xmlName\": \"componentAccount\"\n                    }\n                },\n                \"ComponentRegion\": {\n                    \"target\": \"com.amazonaws.ec2#ComponentRegion\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ComponentRegion\",\n                        \"smithy.api#documentation\": \"<p>The Region for the component.</p>\",\n                        \"smithy.api#xmlName\": \"componentRegion\"\n                    }\n                },\n                \"FirewallStatelessRule\": {\n                    \"target\": \"com.amazonaws.ec2#FirewallStatelessRule\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"FirewallStatelessRule\",\n                        \"smithy.api#documentation\": \"<p>The Network Firewall stateless rule.</p>\",\n                        \"smithy.api#xmlName\": \"firewallStatelessRule\"\n                    }\n                },\n                \"FirewallStatefulRule\": {\n                    \"target\": \"com.amazonaws.ec2#FirewallStatefulRule\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"FirewallStatefulRule\",\n                        \"smithy.api#documentation\": \"<p>The Network Firewall stateful rule.</p>\",\n                        \"smithy.api#xmlName\": \"firewallStatefulRule\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes an explanation code for an unreachable path. For more information, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/reachability/explanation-codes.html\\\">Reachability Analyzer explanation codes</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ExplanationList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#Explanation\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ExportClientVpnClientCertificateRevocationList\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ExportClientVpnClientCertificateRevocationListRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ExportClientVpnClientCertificateRevocationListResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Downloads the client certificate revocation list for the specified Client VPN endpoint.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ExportClientVpnClientCertificateRevocationListRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ClientVpnEndpointId\": {\n                    \"target\": \"com.amazonaws.ec2#ClientVpnEndpointId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the Client VPN endpoint.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ExportClientVpnClientCertificateRevocationListResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CertificateRevocationList\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CertificateRevocationList\",\n                        \"smithy.api#documentation\": \"<p>Information about the client certificate revocation list.</p>\",\n                        \"smithy.api#xmlName\": \"certificateRevocationList\"\n                    }\n                },\n                \"Status\": {\n                    \"target\": \"com.amazonaws.ec2#ClientCertificateRevocationListStatus\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Status\",\n                        \"smithy.api#documentation\": \"<p>The current state of the client certificate revocation list.</p>\",\n                        \"smithy.api#xmlName\": \"status\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ExportClientVpnClientConfiguration\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ExportClientVpnClientConfigurationRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ExportClientVpnClientConfigurationResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Downloads the contents of the Client VPN endpoint configuration file for the specified Client VPN endpoint. The Client VPN endpoint configuration \\n\\t\\t\\tfile includes the Client VPN endpoint and certificate information clients need to establish a connection \\n\\t\\t\\twith the Client VPN endpoint.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ExportClientVpnClientConfigurationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ClientVpnEndpointId\": {\n                    \"target\": \"com.amazonaws.ec2#ClientVpnEndpointId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the Client VPN endpoint.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ExportClientVpnClientConfigurationResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ClientConfiguration\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ClientConfiguration\",\n                        \"smithy.api#documentation\": \"<p>The contents of the Client VPN endpoint configuration file.</p>\",\n                        \"smithy.api#xmlName\": \"clientConfiguration\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ExportEnvironment\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"citrix\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"citrix\"\n                    }\n                },\n                \"vmware\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"vmware\"\n                    }\n                },\n                \"microsoft\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"microsoft\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ExportImage\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ExportImageRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ExportImageResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Exports an Amazon Machine Image (AMI) to a VM file. For more information, see <a href=\\\"https://docs.aws.amazon.com/vm-import/latest/userguide/vmexport_image.html\\\">Exporting a VM\\n    directly from an Amazon Machine Image (AMI)</a> in the\\n    <i>VM Import/Export User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ExportImageRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Token to enable idempotency for export image requests.</p>\",\n                        \"smithy.api#idempotencyToken\": {}\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A description of the image being exported. The maximum length is 255 characters.</p>\"\n                    }\n                },\n                \"DiskImageFormat\": {\n                    \"target\": \"com.amazonaws.ec2#DiskImageFormat\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The disk image format.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"ImageId\": {\n                    \"target\": \"com.amazonaws.ec2#ImageId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the image.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"S3ExportLocation\": {\n                    \"target\": \"com.amazonaws.ec2#ExportTaskS3LocationRequest\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The Amazon S3 bucket for the destination image. The destination bucket must exist.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"RoleName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the role that grants VM Import/Export permission to export images to your Amazon\\n   S3 bucket. If this parameter is not specified, the default role is named 'vmimport'.</p>\"\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags to apply to the export image task during creation.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ExportImageResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Description\",\n                        \"smithy.api#documentation\": \"<p>A description of the image being exported.</p>\",\n                        \"smithy.api#xmlName\": \"description\"\n                    }\n                },\n                \"DiskImageFormat\": {\n                    \"target\": \"com.amazonaws.ec2#DiskImageFormat\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DiskImageFormat\",\n                        \"smithy.api#documentation\": \"<p>The disk image format for the exported image.</p>\",\n                        \"smithy.api#xmlName\": \"diskImageFormat\"\n                    }\n                },\n                \"ExportImageTaskId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ExportImageTaskId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the export image task.</p>\",\n                        \"smithy.api#xmlName\": \"exportImageTaskId\"\n                    }\n                },\n                \"ImageId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ImageId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the image.</p>\",\n                        \"smithy.api#xmlName\": \"imageId\"\n                    }\n                },\n                \"RoleName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RoleName\",\n                        \"smithy.api#documentation\": \"<p>The name of the role that grants VM Import/Export permission to export images to your Amazon\\n   S3 bucket.</p>\",\n                        \"smithy.api#xmlName\": \"roleName\"\n                    }\n                },\n                \"Progress\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Progress\",\n                        \"smithy.api#documentation\": \"<p>The percent complete of the export image task.</p>\",\n                        \"smithy.api#xmlName\": \"progress\"\n                    }\n                },\n                \"S3ExportLocation\": {\n                    \"target\": \"com.amazonaws.ec2#ExportTaskS3Location\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"S3ExportLocation\",\n                        \"smithy.api#documentation\": \"<p>Information about the destination Amazon S3 bucket.</p>\",\n                        \"smithy.api#xmlName\": \"s3ExportLocation\"\n                    }\n                },\n                \"Status\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Status\",\n                        \"smithy.api#documentation\": \"<p>The status of the export image task. The possible values are <code>active</code>, <code>completed</code>,\\n    <code>deleting</code>, and <code>deleted</code>.</p>\",\n                        \"smithy.api#xmlName\": \"status\"\n                    }\n                },\n                \"StatusMessage\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"StatusMessage\",\n                        \"smithy.api#documentation\": \"<p>The status message for the export image task.</p>\",\n                        \"smithy.api#xmlName\": \"statusMessage\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>Any tags assigned to the export image task.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ExportImageTask\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Description\",\n                        \"smithy.api#documentation\": \"<p>A description of the image being exported.</p>\",\n                        \"smithy.api#xmlName\": \"description\"\n                    }\n                },\n                \"ExportImageTaskId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ExportImageTaskId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the export image task.</p>\",\n                        \"smithy.api#xmlName\": \"exportImageTaskId\"\n                    }\n                },\n                \"ImageId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ImageId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the image.</p>\",\n                        \"smithy.api#xmlName\": \"imageId\"\n                    }\n                },\n                \"Progress\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Progress\",\n                        \"smithy.api#documentation\": \"<p>The percent complete of the export image task.</p>\",\n                        \"smithy.api#xmlName\": \"progress\"\n                    }\n                },\n                \"S3ExportLocation\": {\n                    \"target\": \"com.amazonaws.ec2#ExportTaskS3Location\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"S3ExportLocation\",\n                        \"smithy.api#documentation\": \"<p>Information about the destination Amazon S3 bucket.</p>\",\n                        \"smithy.api#xmlName\": \"s3ExportLocation\"\n                    }\n                },\n                \"Status\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Status\",\n                        \"smithy.api#documentation\": \"<p>The status of the export image task. The possible values are <code>active</code>, <code>completed</code>,\\n    <code>deleting</code>, and <code>deleted</code>.</p>\",\n                        \"smithy.api#xmlName\": \"status\"\n                    }\n                },\n                \"StatusMessage\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"StatusMessage\",\n                        \"smithy.api#documentation\": \"<p>The status message for the export image task.</p>\",\n                        \"smithy.api#xmlName\": \"statusMessage\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>Any tags assigned to the export image task.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes an export image task.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ExportImageTaskId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#ExportImageTaskIdList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ExportImageTaskId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"ExportImageTaskId\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ExportImageTaskList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ExportImageTask\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ExportTask\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Description\",\n                        \"smithy.api#documentation\": \"<p>A description of the resource being exported.</p>\",\n                        \"smithy.api#xmlName\": \"description\"\n                    }\n                },\n                \"ExportTaskId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ExportTaskId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the export task.</p>\",\n                        \"smithy.api#xmlName\": \"exportTaskId\"\n                    }\n                },\n                \"ExportToS3Task\": {\n                    \"target\": \"com.amazonaws.ec2#ExportToS3Task\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ExportToS3\",\n                        \"smithy.api#documentation\": \"<p>Information about the export task.</p>\",\n                        \"smithy.api#xmlName\": \"exportToS3\"\n                    }\n                },\n                \"InstanceExportDetails\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceExportDetails\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceExport\",\n                        \"smithy.api#documentation\": \"<p>Information about the instance to export.</p>\",\n                        \"smithy.api#xmlName\": \"instanceExport\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#ExportTaskState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The state of the export task.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                },\n                \"StatusMessage\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"StatusMessage\",\n                        \"smithy.api#documentation\": \"<p>The status message related to the export task.</p>\",\n                        \"smithy.api#xmlName\": \"statusMessage\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>The tags for the export task.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes an export instance task.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ExportTaskId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#ExportTaskIdStringList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ExportTaskId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"ExportTaskId\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ExportTaskList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ExportTask\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ExportTaskS3Location\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"S3Bucket\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"S3Bucket\",\n                        \"smithy.api#documentation\": \"<p>The destination Amazon S3 bucket.</p>\",\n                        \"smithy.api#xmlName\": \"s3Bucket\"\n                    }\n                },\n                \"S3Prefix\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"S3Prefix\",\n                        \"smithy.api#documentation\": \"<p>The prefix (logical hierarchy) in the bucket.</p>\",\n                        \"smithy.api#xmlName\": \"s3Prefix\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the destination for an export image task.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ExportTaskS3LocationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"S3Bucket\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The destination Amazon S3 bucket.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"S3Prefix\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The prefix (logical hierarchy) in the bucket.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the destination for an export image task.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ExportTaskState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"active\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"active\"\n                    }\n                },\n                \"cancelling\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"cancelling\"\n                    }\n                },\n                \"cancelled\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"cancelled\"\n                    }\n                },\n                \"completed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"completed\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ExportToS3Task\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ContainerFormat\": {\n                    \"target\": \"com.amazonaws.ec2#ContainerFormat\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ContainerFormat\",\n                        \"smithy.api#documentation\": \"<p>The container format used to combine disk images with metadata (such as OVF). If absent, only the disk image is\\n   exported.</p>\",\n                        \"smithy.api#xmlName\": \"containerFormat\"\n                    }\n                },\n                \"DiskImageFormat\": {\n                    \"target\": \"com.amazonaws.ec2#DiskImageFormat\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DiskImageFormat\",\n                        \"smithy.api#documentation\": \"<p>The format for the exported image.</p>\",\n                        \"smithy.api#xmlName\": \"diskImageFormat\"\n                    }\n                },\n                \"S3Bucket\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"S3Bucket\",\n                        \"smithy.api#documentation\": \"<p>The Amazon S3 bucket for the destination image. The destination bucket must exist and have\\n   an access control list (ACL) attached that specifies the Region-specific canonical account ID for\\n   the <code>Grantee</code>. For more information about the ACL to your S3 bucket, see <a href=\\\"https://docs.aws.amazon.com/vm-import/latest/userguide/vmexport.html#vmexport-prerequisites\\\">Prerequisites</a> in the VM Import/Export User Guide.</p>\",\n                        \"smithy.api#xmlName\": \"s3Bucket\"\n                    }\n                },\n                \"S3Key\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"S3Key\",\n                        \"smithy.api#documentation\": \"<p>The encryption key for your S3 bucket.</p>\",\n                        \"smithy.api#xmlName\": \"s3Key\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the format and location for the export task.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ExportToS3TaskSpecification\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DiskImageFormat\": {\n                    \"target\": \"com.amazonaws.ec2#DiskImageFormat\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DiskImageFormat\",\n                        \"smithy.api#documentation\": \"<p>The format for the exported image.</p>\",\n                        \"smithy.api#xmlName\": \"diskImageFormat\"\n                    }\n                },\n                \"ContainerFormat\": {\n                    \"target\": \"com.amazonaws.ec2#ContainerFormat\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ContainerFormat\",\n                        \"smithy.api#documentation\": \"<p>The container format used to combine disk images with metadata (such as OVF). If absent, only the disk image is\\n   exported.</p>\",\n                        \"smithy.api#xmlName\": \"containerFormat\"\n                    }\n                },\n                \"S3Bucket\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"S3Bucket\",\n                        \"smithy.api#documentation\": \"<p>The Amazon S3 bucket for the destination image. The destination bucket must exist and have\\n   an access control list (ACL) attached that specifies the Region-specific canonical account ID for\\n   the <code>Grantee</code>. For more information about the ACL to your S3 bucket, see <a href=\\\"https://docs.aws.amazon.com/vm-import/latest/userguide/vmexport.html#vmexport-prerequisites\\\">Prerequisites</a> in the VM Import/Export User Guide.</p>\",\n                        \"smithy.api#xmlName\": \"s3Bucket\"\n                    }\n                },\n                \"S3Prefix\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"S3Prefix\",\n                        \"smithy.api#documentation\": \"<p>The image is written to a single object in the Amazon S3 bucket at the S3 key s3prefix +\\n   exportTaskId + '.' + diskImageFormat.</p>\",\n                        \"smithy.api#xmlName\": \"s3Prefix\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes an export instance task.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ExportTransitGatewayRoutes\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ExportTransitGatewayRoutesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ExportTransitGatewayRoutesResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Exports routes from the specified transit gateway route table to the specified S3 bucket.\\n         By default, all routes are exported. Alternatively, you can filter by CIDR range.</p>\\n         <p>The routes are saved to the specified bucket in a JSON file. For more information, see\\n                <a href=\\\"https://docs.aws.amazon.com/vpc/latest/tgw/tgw-route-tables.html#tgw-export-route-tables\\\">Export route tables\\n                   to Amazon S3</a> in the <i>Amazon Web Services Transit Gateways Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ExportTransitGatewayRoutesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayRouteTableId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayRouteTableId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the route table.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more filters. The possible values are:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>attachment.transit-gateway-attachment-id</code> - The id of the transit gateway attachment.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>attachment.resource-id</code> - The resource id of the transit gateway attachment.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>route-search.exact-match</code> - The exact match of the specified filter.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>route-search.longest-prefix-match</code> - The longest prefix that matches the route.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>route-search.subnet-of-match</code> - The routes with a subnet that match the specified CIDR filter.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>route-search.supernet-of-match</code> - The routes with a CIDR that encompass the CIDR filter. For example, if you have 10.0.1.0/29 and 10.0.1.0/31 routes in your route table and you specify supernet-of-match as 10.0.1.0/30, then the result returns 10.0.1.0/29.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>state</code> - The state of the route (<code>active</code> | <code>blackhole</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>transit-gateway-route-destination-cidr-block</code> - The CIDR range.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>type</code> - The type of route (<code>propagated</code> |\\n               <code>static</code>).</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"S3Bucket\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The name of the S3 bucket.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ExportTransitGatewayRoutesResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"S3Location\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"S3Location\",\n                        \"smithy.api#documentation\": \"<p>The URL of the exported file in Amazon S3. For example, \\n         s3://<i>bucket_name</i>/VPCTransitGateway/TransitGatewayRouteTables/<i>file_name</i>.</p>\",\n                        \"smithy.api#xmlName\": \"s3Location\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ExportVerifiedAccessInstanceClientConfiguration\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ExportVerifiedAccessInstanceClientConfigurationRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ExportVerifiedAccessInstanceClientConfigurationResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Exports the client configuration for a Verified Access instance.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ExportVerifiedAccessInstanceClientConfigurationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VerifiedAccessInstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessInstanceId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the Verified Access instance.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ExportVerifiedAccessInstanceClientConfigurationResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Version\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Version\",\n                        \"smithy.api#documentation\": \"<p>The version.</p>\",\n                        \"smithy.api#xmlName\": \"version\"\n                    }\n                },\n                \"VerifiedAccessInstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VerifiedAccessInstanceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Verified Access instance.</p>\",\n                        \"smithy.api#xmlName\": \"verifiedAccessInstanceId\"\n                    }\n                },\n                \"Region\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Region\",\n                        \"smithy.api#documentation\": \"<p>The Region.</p>\",\n                        \"smithy.api#xmlName\": \"region\"\n                    }\n                },\n                \"DeviceTrustProviders\": {\n                    \"target\": \"com.amazonaws.ec2#DeviceTrustProviderTypeList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DeviceTrustProviderSet\",\n                        \"smithy.api#documentation\": \"<p>The device trust providers.</p>\",\n                        \"smithy.api#xmlName\": \"deviceTrustProviderSet\"\n                    }\n                },\n                \"UserTrustProvider\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessInstanceUserTrustProviderClientConfiguration\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"UserTrustProvider\",\n                        \"smithy.api#documentation\": \"<p>The user identity trust provider.</p>\",\n                        \"smithy.api#xmlName\": \"userTrustProvider\"\n                    }\n                },\n                \"OpenVpnConfigurations\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessInstanceOpenVpnClientConfigurationList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OpenVpnConfigurationSet\",\n                        \"smithy.api#documentation\": \"<p>The Open VPN configuration.</p>\",\n                        \"smithy.api#xmlName\": \"openVpnConfigurationSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ExportVmTaskId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#FailedCapacityReservationFleetCancellationResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CapacityReservationFleetId\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityReservationFleetId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CapacityReservationFleetId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Capacity Reservation Fleet that could not be cancelled.</p>\",\n                        \"smithy.api#xmlName\": \"capacityReservationFleetId\"\n                    }\n                },\n                \"CancelCapacityReservationFleetError\": {\n                    \"target\": \"com.amazonaws.ec2#CancelCapacityReservationFleetError\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CancelCapacityReservationFleetError\",\n                        \"smithy.api#documentation\": \"<p>Information about the Capacity Reservation Fleet cancellation error.</p>\",\n                        \"smithy.api#xmlName\": \"cancelCapacityReservationFleetError\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a Capacity Reservation Fleet that could not be cancelled.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#FailedCapacityReservationFleetCancellationResultSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#FailedCapacityReservationFleetCancellationResult\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#FailedQueuedPurchaseDeletion\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Error\": {\n                    \"target\": \"com.amazonaws.ec2#DeleteQueuedReservedInstancesError\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Error\",\n                        \"smithy.api#documentation\": \"<p>The error.</p>\",\n                        \"smithy.api#xmlName\": \"error\"\n                    }\n                },\n                \"ReservedInstancesId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ReservedInstancesId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Reserved Instance.</p>\",\n                        \"smithy.api#xmlName\": \"reservedInstancesId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a Reserved Instance whose queued purchase was not deleted.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#FailedQueuedPurchaseDeletionSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#FailedQueuedPurchaseDeletion\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#FastLaunchImageIdList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ImageId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"ImageId\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#FastLaunchLaunchTemplateSpecificationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LaunchTemplateId\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplateId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify the ID of the launch template that the AMI should use for Windows fast\\n      launch.</p>\"\n                    }\n                },\n                \"LaunchTemplateName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify the name of the launch template that the AMI should use for Windows fast\\n      launch.</p>\"\n                    }\n                },\n                \"Version\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>Specify the version of the launch template that the AMI should use for Windows fast\\n      launch.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Request to create a launch template for a Windows fast launch enabled AMI.</p>\\n         <note>\\n            <p>Note - You can specify either the <code>LaunchTemplateName</code> or the\\n        <code>LaunchTemplateId</code>, but not both.</p>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.ec2#FastLaunchLaunchTemplateSpecificationResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LaunchTemplateId\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplateId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LaunchTemplateId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the launch template that the AMI uses for Windows fast launch.</p>\",\n                        \"smithy.api#xmlName\": \"launchTemplateId\"\n                    }\n                },\n                \"LaunchTemplateName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LaunchTemplateName\",\n                        \"smithy.api#documentation\": \"<p>The name of the launch template that the AMI uses for Windows fast launch.</p>\",\n                        \"smithy.api#xmlName\": \"launchTemplateName\"\n                    }\n                },\n                \"Version\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Version\",\n                        \"smithy.api#documentation\": \"<p>The version of the launch template that the AMI uses for Windows fast launch.</p>\",\n                        \"smithy.api#xmlName\": \"version\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Identifies the launch template that the AMI uses for Windows fast launch.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#FastLaunchResourceType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"SNAPSHOT\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"snapshot\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#FastLaunchSnapshotConfigurationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TargetResourceCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of pre-provisioned snapshots to keep on hand for a Windows fast launch enabled\\n      AMI.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Configuration settings for creating and managing pre-provisioned snapshots for a Windows\\n      fast launch enabled AMI.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#FastLaunchSnapshotConfigurationResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TargetResourceCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TargetResourceCount\",\n                        \"smithy.api#documentation\": \"<p>The number of pre-provisioned snapshots requested to keep on hand for a Windows fast\\n      launch enabled AMI.</p>\",\n                        \"smithy.api#xmlName\": \"targetResourceCount\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Configuration settings for creating and managing pre-provisioned snapshots for a Windows\\n      fast launch enabled Windows AMI.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#FastLaunchStateCode\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"enabling\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"enabling\"\n                    }\n                },\n                \"enabling_failed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"enabling-failed\"\n                    }\n                },\n                \"enabled\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"enabled\"\n                    }\n                },\n                \"enabled_failed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"enabled-failed\"\n                    }\n                },\n                \"disabling\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"disabling\"\n                    }\n                },\n                \"disabling_failed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"disabling-failed\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#FastSnapshotRestoreStateCode\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"enabling\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"enabling\"\n                    }\n                },\n                \"optimizing\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"optimizing\"\n                    }\n                },\n                \"enabled\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"enabled\"\n                    }\n                },\n                \"disabling\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"disabling\"\n                    }\n                },\n                \"disabled\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"disabled\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#FederatedAuthentication\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SamlProviderArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SamlProviderArn\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the IAM SAML identity provider.</p>\",\n                        \"smithy.api#xmlName\": \"samlProviderArn\"\n                    }\n                },\n                \"SelfServiceSamlProviderArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SelfServiceSamlProviderArn\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the IAM SAML identity provider for the self-service portal.</p>\",\n                        \"smithy.api#xmlName\": \"selfServiceSamlProviderArn\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the IAM SAML identity providers used for federated authentication.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#FederatedAuthenticationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SAMLProviderArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the IAM SAML identity provider.</p>\"\n                    }\n                },\n                \"SelfServiceSAMLProviderArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the IAM SAML identity provider for the self-service portal.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The IAM SAML identity provider used for federated authentication.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#Filter\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Name\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the filter. Filter names are case-sensitive.</p>\"\n                    }\n                },\n                \"Values\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The filter values. Filter values are case-sensitive. If you specify multiple values for a \\n         filter, the values are joined with an <code>OR</code>, and the request returns all results \\n         that match any of the specified values.</p>\",\n                        \"smithy.api#xmlName\": \"Value\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A filter name and value pair that is used to return a more specific list of results from a describe operation. \\n         Filters can be used to match a set of resources by specific criteria, such as tags, attributes, or IDs.</p>\\n         <p>If you specify multiple filters, the filters are joined with an <code>AND</code>, and the request returns only \\n           results that match all of the specified filters.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Filtering.html#Filtering_Resources_CLI\\\">List and filter using the CLI and API</a> in the <i>Amazon EC2 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#FilterList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#Filter\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"Filter\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#FilterPortRange\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"FromPort\": {\n                    \"target\": \"com.amazonaws.ec2#Port\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"FromPort\",\n                        \"smithy.api#documentation\": \"<p>The first port in the range.</p>\",\n                        \"smithy.api#xmlName\": \"fromPort\"\n                    }\n                },\n                \"ToPort\": {\n                    \"target\": \"com.amazonaws.ec2#Port\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ToPort\",\n                        \"smithy.api#documentation\": \"<p>The last port in the range.</p>\",\n                        \"smithy.api#xmlName\": \"toPort\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a port range.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#FindingsFound\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"true\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"true\"\n                    }\n                },\n                \"false\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"false\"\n                    }\n                },\n                \"unknown\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"unknown\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#FirewallStatefulRule\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RuleGroupArn\": {\n                    \"target\": \"com.amazonaws.ec2#ResourceArn\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RuleGroupArn\",\n                        \"smithy.api#documentation\": \"<p>The ARN of the stateful rule group.</p>\",\n                        \"smithy.api#xmlName\": \"ruleGroupArn\"\n                    }\n                },\n                \"Sources\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SourceSet\",\n                        \"smithy.api#documentation\": \"<p>The source IP addresses, in CIDR notation.</p>\",\n                        \"smithy.api#xmlName\": \"sourceSet\"\n                    }\n                },\n                \"Destinations\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DestinationSet\",\n                        \"smithy.api#documentation\": \"<p>The destination IP addresses, in CIDR notation.</p>\",\n                        \"smithy.api#xmlName\": \"destinationSet\"\n                    }\n                },\n                \"SourcePorts\": {\n                    \"target\": \"com.amazonaws.ec2#PortRangeList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SourcePortSet\",\n                        \"smithy.api#documentation\": \"<p>The source ports.</p>\",\n                        \"smithy.api#xmlName\": \"sourcePortSet\"\n                    }\n                },\n                \"DestinationPorts\": {\n                    \"target\": \"com.amazonaws.ec2#PortRangeList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DestinationPortSet\",\n                        \"smithy.api#documentation\": \"<p>The destination ports.</p>\",\n                        \"smithy.api#xmlName\": \"destinationPortSet\"\n                    }\n                },\n                \"Protocol\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Protocol\",\n                        \"smithy.api#documentation\": \"<p>The protocol.</p>\",\n                        \"smithy.api#xmlName\": \"protocol\"\n                    }\n                },\n                \"RuleAction\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RuleAction\",\n                        \"smithy.api#documentation\": \"<p>The rule action. The possible values are <code>pass</code>, <code>drop</code>, and \\n         <code>alert</code>.</p>\",\n                        \"smithy.api#xmlName\": \"ruleAction\"\n                    }\n                },\n                \"Direction\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Direction\",\n                        \"smithy.api#documentation\": \"<p>The direction. The possible values are <code>FORWARD</code> and <code>ANY</code>.</p>\",\n                        \"smithy.api#xmlName\": \"direction\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a stateful rule.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#FirewallStatelessRule\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RuleGroupArn\": {\n                    \"target\": \"com.amazonaws.ec2#ResourceArn\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RuleGroupArn\",\n                        \"smithy.api#documentation\": \"<p>The ARN of the stateless rule group.</p>\",\n                        \"smithy.api#xmlName\": \"ruleGroupArn\"\n                    }\n                },\n                \"Sources\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SourceSet\",\n                        \"smithy.api#documentation\": \"<p>The source IP addresses, in CIDR notation.</p>\",\n                        \"smithy.api#xmlName\": \"sourceSet\"\n                    }\n                },\n                \"Destinations\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DestinationSet\",\n                        \"smithy.api#documentation\": \"<p>The destination IP addresses, in CIDR notation.</p>\",\n                        \"smithy.api#xmlName\": \"destinationSet\"\n                    }\n                },\n                \"SourcePorts\": {\n                    \"target\": \"com.amazonaws.ec2#PortRangeList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SourcePortSet\",\n                        \"smithy.api#documentation\": \"<p>The source ports.</p>\",\n                        \"smithy.api#xmlName\": \"sourcePortSet\"\n                    }\n                },\n                \"DestinationPorts\": {\n                    \"target\": \"com.amazonaws.ec2#PortRangeList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DestinationPortSet\",\n                        \"smithy.api#documentation\": \"<p>The destination ports.</p>\",\n                        \"smithy.api#xmlName\": \"destinationPortSet\"\n                    }\n                },\n                \"Protocols\": {\n                    \"target\": \"com.amazonaws.ec2#ProtocolIntList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ProtocolSet\",\n                        \"smithy.api#documentation\": \"<p>The protocols.</p>\",\n                        \"smithy.api#xmlName\": \"protocolSet\"\n                    }\n                },\n                \"RuleAction\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RuleAction\",\n                        \"smithy.api#documentation\": \"<p>The rule action. The possible values are <code>pass</code>, <code>drop</code>, and \\n         <code>forward_to_site</code>.</p>\",\n                        \"smithy.api#xmlName\": \"ruleAction\"\n                    }\n                },\n                \"Priority\": {\n                    \"target\": \"com.amazonaws.ec2#Priority\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Priority\",\n                        \"smithy.api#documentation\": \"<p>The rule priority.</p>\",\n                        \"smithy.api#xmlName\": \"priority\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a stateless rule.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#FleetActivityStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ERROR\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"error\"\n                    }\n                },\n                \"PENDING_FULFILLMENT\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"pending_fulfillment\"\n                    }\n                },\n                \"PENDING_TERMINATION\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"pending_termination\"\n                    }\n                },\n                \"FULFILLED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"fulfilled\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#FleetBlockDeviceMappingRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DeviceName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The device name (for example, <code>/dev/sdh</code> or <code>xvdh</code>).</p>\"\n                    }\n                },\n                \"VirtualName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The virtual device name (<code>ephemeralN</code>). Instance store volumes are numbered\\n         starting from 0. An instance type with 2 available instance store volumes can specify\\n         mappings for <code>ephemeral0</code> and <code>ephemeral1</code>. The number of available\\n         instance store volumes depends on the instance type. After you connect to the instance, you\\n         must mount the volume.</p>\\n         <p>NVMe instance store volumes are automatically enumerated and assigned a device name.\\n         Including them in your block device mapping has no effect.</p>\\n         <p>Constraints: For M3 instances, you must specify instance store volumes in the block\\n         device mapping for the instance. When you launch an M3 instance, we ignore any instance\\n         store volumes specified in the block device mapping for the AMI.</p>\"\n                    }\n                },\n                \"Ebs\": {\n                    \"target\": \"com.amazonaws.ec2#FleetEbsBlockDeviceRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Parameters used to automatically set up EBS volumes when the instance is\\n         launched.</p>\"\n                    }\n                },\n                \"NoDevice\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>To omit the device from the block device mapping, specify an empty string. When this\\n         property is specified, the device is removed from the block device mapping regardless of\\n         the assigned value.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a block device mapping, which defines the EBS volumes and instance store\\n         volumes to attach to an instance at launch.</p>\\n         <p>To override a block device mapping specified in the launch template:</p>\\n         <ul>\\n            <li>\\n               <p>Specify the exact same <code>DeviceName</code> here as specified in the launch\\n               template.</p>\\n            </li>\\n            <li>\\n               <p>Only specify the parameters you want to change.</p>\\n            </li>\\n            <li>\\n               <p>Any parameters you don't specify here will keep their original launch template\\n               values.</p>\\n            </li>\\n         </ul>\\n         <p>To add a new block device mapping:</p>\\n         <ul>\\n            <li>\\n               <p>Specify a <code>DeviceName</code> that doesn't exist in the launch\\n               template.</p>\\n            </li>\\n            <li>\\n               <p>Specify all desired parameters here.</p>\\n            </li>\\n         </ul>\"\n            }\n        },\n        \"com.amazonaws.ec2#FleetBlockDeviceMappingRequestList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#FleetBlockDeviceMappingRequest\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"BlockDeviceMapping\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#FleetCapacityReservation\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CapacityReservationId\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityReservationId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CapacityReservationId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Capacity Reservation.</p>\",\n                        \"smithy.api#xmlName\": \"capacityReservationId\"\n                    }\n                },\n                \"AvailabilityZoneId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AvailabilityZoneId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Availability Zone in which the Capacity Reservation reserves\\n\\t\\t\\tcapacity.</p>\",\n                        \"smithy.api#xmlName\": \"availabilityZoneId\"\n                    }\n                },\n                \"InstanceType\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceType\",\n                        \"smithy.api#documentation\": \"<p>The instance type for which the Capacity Reservation reserves capacity.</p>\",\n                        \"smithy.api#xmlName\": \"instanceType\"\n                    }\n                },\n                \"InstancePlatform\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityReservationInstancePlatform\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstancePlatform\",\n                        \"smithy.api#documentation\": \"<p>The type of operating system for which the Capacity Reservation reserves\\n\\t\\t\\tcapacity.</p>\",\n                        \"smithy.api#xmlName\": \"instancePlatform\"\n                    }\n                },\n                \"AvailabilityZone\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AvailabilityZone\",\n                        \"smithy.api#documentation\": \"<p>The Availability Zone in which the Capacity Reservation reserves capacity.</p>\",\n                        \"smithy.api#xmlName\": \"availabilityZone\"\n                    }\n                },\n                \"TotalInstanceCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TotalInstanceCount\",\n                        \"smithy.api#documentation\": \"<p>The total number of instances for which the Capacity Reservation reserves\\n\\t\\t\\tcapacity.</p>\",\n                        \"smithy.api#xmlName\": \"totalInstanceCount\"\n                    }\n                },\n                \"FulfilledCapacity\": {\n                    \"target\": \"com.amazonaws.ec2#Double\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"FulfilledCapacity\",\n                        \"smithy.api#documentation\": \"<p>The number of capacity units fulfilled by the Capacity Reservation. For more\\n\\t\\t\\tinformation, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/crfleet-concepts.html#target-capacity\\\">Total target\\n\\t\\t\\t\\tcapacity</a> in the <i>Amazon EC2 User Guide</i>.</p>\",\n                        \"smithy.api#xmlName\": \"fulfilledCapacity\"\n                    }\n                },\n                \"EbsOptimized\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EbsOptimized\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether the Capacity Reservation reserves capacity for EBS-optimized\\n\\t\\t\\tinstance types.</p>\",\n                        \"smithy.api#xmlName\": \"ebsOptimized\"\n                    }\n                },\n                \"CreateDate\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CreateDate\",\n                        \"smithy.api#documentation\": \"<p>The date and time at which the Capacity Reservation was created.</p>\",\n                        \"smithy.api#xmlName\": \"createDate\"\n                    }\n                },\n                \"Weight\": {\n                    \"target\": \"com.amazonaws.ec2#DoubleWithConstraints\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Weight\",\n                        \"smithy.api#documentation\": \"<p>The weight of the instance type in the Capacity Reservation Fleet. For more\\n\\t\\t\\tinformation, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/crfleet-concepts.html#instance-weight\\\">Instance type\\n\\t\\t\\t\\tweight</a> in the <i>Amazon EC2 User Guide</i>.</p>\",\n                        \"smithy.api#xmlName\": \"weight\"\n                    }\n                },\n                \"Priority\": {\n                    \"target\": \"com.amazonaws.ec2#IntegerWithConstraints\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Priority\",\n                        \"smithy.api#documentation\": \"<p>The priority of the instance type in the Capacity Reservation Fleet. For more\\n\\t\\t\\tinformation, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/crfleet-concepts.html#instance-priority\\\">Instance type\\n\\t\\t\\t\\tpriority</a> in the <i>Amazon EC2 User Guide</i>.</p>\",\n                        \"smithy.api#xmlName\": \"priority\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about a Capacity Reservation in a Capacity Reservation Fleet.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#FleetCapacityReservationSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#FleetCapacityReservation\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#FleetCapacityReservationTenancy\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"default\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"default\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#FleetCapacityReservationUsageStrategy\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"USE_CAPACITY_RESERVATIONS_FIRST\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"use-capacity-reservations-first\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#FleetData\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ActivityStatus\": {\n                    \"target\": \"com.amazonaws.ec2#FleetActivityStatus\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ActivityStatus\",\n                        \"smithy.api#documentation\": \"<p>The progress of the EC2 Fleet.</p>\\n         <p>For fleets of type <code>instant</code>, the status is <code>fulfilled</code> after all\\n         requests are placed, regardless of whether target capacity is met (this is the only\\n         possible status for <code>instant</code> fleets).</p>\\n         <p>For fleets of type <code>request</code> or <code>maintain</code>, the status is\\n            <code>pending_fulfillment</code> after all requests are placed, <code>fulfilled</code>\\n         when the fleet size meets or exceeds target capacity, <code>pending_termination</code>\\n         while instances are terminating when fleet size is decreased, and <code>error</code> if\\n         there's an error.</p>\",\n                        \"smithy.api#xmlName\": \"activityStatus\"\n                    }\n                },\n                \"CreateTime\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CreateTime\",\n                        \"smithy.api#documentation\": \"<p>The creation date and time of the EC2 Fleet.</p>\",\n                        \"smithy.api#xmlName\": \"createTime\"\n                    }\n                },\n                \"FleetId\": {\n                    \"target\": \"com.amazonaws.ec2#FleetId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"FleetId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the EC2 Fleet.</p>\",\n                        \"smithy.api#xmlName\": \"fleetId\"\n                    }\n                },\n                \"FleetState\": {\n                    \"target\": \"com.amazonaws.ec2#FleetStateCode\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"FleetState\",\n                        \"smithy.api#documentation\": \"<p>The state of the EC2 Fleet.</p>\",\n                        \"smithy.api#xmlName\": \"fleetState\"\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ClientToken\",\n                        \"smithy.api#documentation\": \"<p>Unique, case-sensitive identifier that you provide to ensure the idempotency of the\\n         request. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Run_Instance_Idempotency.html\\\">Ensuring\\n            idempotency</a>.</p>\\n         <p>Constraints: Maximum 64 ASCII characters</p>\",\n                        \"smithy.api#xmlName\": \"clientToken\"\n                    }\n                },\n                \"ExcessCapacityTerminationPolicy\": {\n                    \"target\": \"com.amazonaws.ec2#FleetExcessCapacityTerminationPolicy\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ExcessCapacityTerminationPolicy\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether running instances should be terminated if the target capacity of the\\n         EC2 Fleet is decreased below the current size of the EC2 Fleet.</p>\\n         <p>Supported only for fleets of type <code>maintain</code>.</p>\",\n                        \"smithy.api#xmlName\": \"excessCapacityTerminationPolicy\"\n                    }\n                },\n                \"FulfilledCapacity\": {\n                    \"target\": \"com.amazonaws.ec2#Double\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"FulfilledCapacity\",\n                        \"smithy.api#documentation\": \"<p>The number of units fulfilled by this request compared to the set target\\n         capacity.</p>\",\n                        \"smithy.api#xmlName\": \"fulfilledCapacity\"\n                    }\n                },\n                \"FulfilledOnDemandCapacity\": {\n                    \"target\": \"com.amazonaws.ec2#Double\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"FulfilledOnDemandCapacity\",\n                        \"smithy.api#documentation\": \"<p>The number of units fulfilled by this request compared to the set target On-Demand\\n         capacity.</p>\",\n                        \"smithy.api#xmlName\": \"fulfilledOnDemandCapacity\"\n                    }\n                },\n                \"LaunchTemplateConfigs\": {\n                    \"target\": \"com.amazonaws.ec2#FleetLaunchTemplateConfigList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LaunchTemplateConfigs\",\n                        \"smithy.api#documentation\": \"<p>The launch template and overrides.</p>\",\n                        \"smithy.api#xmlName\": \"launchTemplateConfigs\"\n                    }\n                },\n                \"TargetCapacitySpecification\": {\n                    \"target\": \"com.amazonaws.ec2#TargetCapacitySpecification\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TargetCapacitySpecification\",\n                        \"smithy.api#documentation\": \"<p>The number of units to request. You can choose to set the target capacity in terms of\\n         instances or a performance characteristic that is important to your application workload,\\n         such as vCPUs, memory, or I/O. If the request type is <code>maintain</code>, you can\\n         specify a target capacity of 0 and add capacity later.</p>\",\n                        \"smithy.api#xmlName\": \"targetCapacitySpecification\"\n                    }\n                },\n                \"TerminateInstancesWithExpiration\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TerminateInstancesWithExpiration\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether running instances should be terminated when the EC2 Fleet expires. </p>\",\n                        \"smithy.api#xmlName\": \"terminateInstancesWithExpiration\"\n                    }\n                },\n                \"Type\": {\n                    \"target\": \"com.amazonaws.ec2#FleetType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Type\",\n                        \"smithy.api#documentation\": \"<p>The type of request. Indicates whether the EC2 Fleet only <code>requests</code> the target\\n         capacity, or also attempts to <code>maintain</code> it. If you request a certain target\\n         capacity, EC2 Fleet only places the required requests; it does not attempt to replenish\\n         instances if capacity is diminished, and it does not submit requests in alternative\\n         capacity pools if capacity is unavailable. To maintain a certain target capacity, EC2 Fleet\\n         places the required requests to meet this target capacity. It also automatically\\n         replenishes any interrupted Spot Instances. Default: <code>maintain</code>.</p>\",\n                        \"smithy.api#xmlName\": \"type\"\n                    }\n                },\n                \"ValidFrom\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ValidFrom\",\n                        \"smithy.api#documentation\": \"<p>The start date and time of the request, in UTC format (for example,\\n            <i>YYYY</i>-<i>MM</i>-<i>DD</i>T<i>HH</i>:<i>MM</i>:<i>SS</i>Z).\\n         The default is to start fulfilling the request immediately. </p>\",\n                        \"smithy.api#xmlName\": \"validFrom\"\n                    }\n                },\n                \"ValidUntil\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ValidUntil\",\n                        \"smithy.api#documentation\": \"<p>The end date and time of the request, in UTC format (for example,\\n            <i>YYYY</i>-<i>MM</i>-<i>DD</i>T<i>HH</i>:<i>MM</i>:<i>SS</i>Z).\\n         At this point, no new instance requests are placed or able to fulfill the request. The\\n         default end date is 7 days from the current date. </p>\",\n                        \"smithy.api#xmlName\": \"validUntil\"\n                    }\n                },\n                \"ReplaceUnhealthyInstances\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ReplaceUnhealthyInstances\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether EC2 Fleet should replace unhealthy Spot Instances. Supported only for\\n         fleets of type <code>maintain</code>. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/manage-ec2-fleet.html#ec2-fleet-health-checks\\\">EC2 Fleet\\n            health checks</a> in the <i>Amazon EC2 User Guide</i>.</p>\",\n                        \"smithy.api#xmlName\": \"replaceUnhealthyInstances\"\n                    }\n                },\n                \"SpotOptions\": {\n                    \"target\": \"com.amazonaws.ec2#SpotOptions\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SpotOptions\",\n                        \"smithy.api#documentation\": \"<p>The configuration of Spot Instances in an EC2 Fleet.</p>\",\n                        \"smithy.api#xmlName\": \"spotOptions\"\n                    }\n                },\n                \"OnDemandOptions\": {\n                    \"target\": \"com.amazonaws.ec2#OnDemandOptions\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OnDemandOptions\",\n                        \"smithy.api#documentation\": \"<p>The allocation strategy of On-Demand Instances in an EC2 Fleet.</p>\",\n                        \"smithy.api#xmlName\": \"onDemandOptions\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>The tags for an EC2 Fleet resource.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                },\n                \"Errors\": {\n                    \"target\": \"com.amazonaws.ec2#DescribeFleetsErrorSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ErrorSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the instances that could not be launched by the fleet. Valid only when\\n         <b>Type</b> is set to <code>instant</code>.</p>\",\n                        \"smithy.api#xmlName\": \"errorSet\"\n                    }\n                },\n                \"Instances\": {\n                    \"target\": \"com.amazonaws.ec2#DescribeFleetsInstancesSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"FleetInstanceSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the instances that were launched by the fleet. Valid only when\\n         <b>Type</b> is set to <code>instant</code>.</p>\",\n                        \"smithy.api#xmlName\": \"fleetInstanceSet\"\n                    }\n                },\n                \"Context\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Context\",\n                        \"smithy.api#documentation\": \"<p>Reserved.</p>\",\n                        \"smithy.api#xmlName\": \"context\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes an EC2 Fleet.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#FleetEbsBlockDeviceRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Encrypted\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether the encryption state of an EBS volume is changed while being restored\\n         from a backing snapshot. The effect of setting the encryption state to <code>true</code>\\n         depends on the volume origin (new or from a snapshot), starting encryption state,\\n         ownership, and whether encryption by default is enabled. For more information, see <a href=\\\"https://docs.aws.amazon.com/ebs/latest/userguide/ebs-encryption.html\\\">Amazon EBS\\n            encryption</a> in the <i>Amazon EBS User Guide</i>.</p>\\n         <p>In no case can you remove encryption from an encrypted volume.</p>\\n         <p>Encrypted volumes can only be attached to instances that support Amazon EBS encryption. For\\n         more information, see <a href=\\\"https://docs.aws.amazon.com/ebs/latest/userguide/ebs-encryption-requirements.html#ebs-encryption_supported_instances\\\">Supported instance types</a>.</p>\\n         <p>This parameter is not returned by <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeImageAttribute\\\">DescribeImageAttribute</a>.</p>\\n         <p>For <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateImage\\\">CreateImage</a> and <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RegisterImage\\\">RegisterImage</a>, whether you\\n         can include this parameter, and the allowed values differ depending on the type of block\\n         device mapping you are creating.</p>\\n         <ul>\\n            <li>\\n               <p>If you are creating a block device mapping for a <b>new (empty)\\n                  volume</b>, you can include this parameter, and specify either\\n                  <code>true</code> for an encrypted volume, or <code>false</code> for an\\n               unencrypted volume. If you omit this parameter, it defaults to <code>false</code>\\n               (unencrypted).</p>\\n            </li>\\n            <li>\\n               <p>If you are creating a block device mapping from an <b>existing encrypted or\\n                  unencrypted snapshot</b>, you must omit this parameter. If you include this\\n               parameter, the request will fail, regardless of the value that you specify.</p>\\n            </li>\\n            <li>\\n               <p>If you are creating a block device mapping from an <b>existing unencrypted\\n                  volume</b>, you can include this parameter, but you must specify\\n                  <code>false</code>. If you specify <code>true</code>, the request will fail. In\\n               this case, we recommend that you omit the parameter.</p>\\n            </li>\\n            <li>\\n               <p>If you are creating a block device mapping from an <b>existing encrypted\\n                  volume</b>, you can include this parameter, and specify either\\n                  <code>true</code> or <code>false</code>. However, if you specify\\n                  <code>false</code>, the parameter is ignored and the block device mapping is\\n               always encrypted. In this case, we recommend that you omit the parameter.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"DeleteOnTermination\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether the EBS volume is deleted on instance termination. For more\\n         information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/preserving-volumes-on-termination.html\\\">Preserve data when\\n            an instance is terminated</a> in the <i>Amazon EC2 User Guide</i>.</p>\"\n                    }\n                },\n                \"Iops\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of I/O operations per second (IOPS). For <code>gp3</code>, <code>io1</code>, and <code>io2</code> volumes,\\n         this represents the number of IOPS that are provisioned for the volume. For <code>gp2</code>\\n         volumes, this represents the baseline performance of the volume and the rate at which\\n         the volume accumulates I/O credits for bursting.</p>\\n         <p>The following are the supported values for each volume type:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>gp3</code>: 3,000 - 80,000 IOPS</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>io1</code>: 100 - 64,000 IOPS</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>io2</code>: 100 - 256,000 IOPS</p>\\n            </li>\\n         </ul>\\n         <p>For <code>io2</code> volumes, you can achieve up to 256,000 IOPS on \\n<a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html#ec2-nitro-instances\\\">instances \\nbuilt on the Nitro System</a>. On other instances, you can achieve performance up to 32,000 IOPS.</p>\\n         <p>This parameter is required for <code>io1</code> and <code>io2</code> volumes. The default for <code>gp3</code> volumes\\n         is 3,000 IOPS.</p>\"\n                    }\n                },\n                \"Throughput\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The throughput that the volume supports, in MiB/s.</p>\\n         <p>This parameter is valid only for <code>gp3</code> volumes.</p>\\n         <p>Valid Range: Minimum value of 125. Maximum value of 2,000.</p>\"\n                    }\n                },\n                \"KmsKeyId\": {\n                    \"target\": \"com.amazonaws.ec2#KmsKeyId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Identifier (key ID, key alias, key ARN, or alias ARN) of the customer managed KMS key \\n         to use for EBS encryption.</p>\\n         <p>This parameter is only supported on <code>BlockDeviceMapping</code> objects called by\\n            <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateFleet.html\\\">CreateFleet</a>, <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RequestSpotInstances.html\\\">RequestSpotInstances</a>, and <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RunInstances.html\\\">RunInstances</a>.</p>\"\n                    }\n                },\n                \"SnapshotId\": {\n                    \"target\": \"com.amazonaws.ec2#SnapshotId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the snapshot.</p>\"\n                    }\n                },\n                \"VolumeSize\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The size of the volume, in GiBs. You must specify either a snapshot ID or a volume\\n         size. If you specify a snapshot, the default is the snapshot size. You can specify a\\n         volume size that is equal to or larger than the snapshot size.</p>\\n         <p>The following are the supported sizes for each volume type:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>gp2</code>: 1 - 16,384 GiB</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>gp3</code>: 1 - 65,536 GiB</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>io1</code>: 4 - 16,384 GiB</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>io2</code>: 4 - 65,536 GiB</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>st1</code> and <code>sc1</code>: 125 - 16,384 GiB</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>standard</code>: 1 - 1024 GiB</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"VolumeType\": {\n                    \"target\": \"com.amazonaws.ec2#VolumeType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The volume type. For more information, see <a href=\\\"https://docs.aws.amazon.com/ebs/latest/userguide/ebs-volume-types.html\\\">Amazon EBS volume types</a> in the\\n         <i>Amazon EBS User Guide</i>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a block device for an EBS volume.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#FleetEventType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"INSTANCE_CHANGE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"instance-change\"\n                    }\n                },\n                \"FLEET_CHANGE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"fleet-change\"\n                    }\n                },\n                \"SERVICE_ERROR\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"service-error\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#FleetExcessCapacityTerminationPolicy\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"NO_TERMINATION\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"no-termination\"\n                    }\n                },\n                \"TERMINATION\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"termination\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#FleetId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#FleetIdSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#FleetId\"\n            }\n        },\n        \"com.amazonaws.ec2#FleetInstanceMatchCriteria\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"open\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"open\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#FleetLaunchTemplateConfig\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LaunchTemplateSpecification\": {\n                    \"target\": \"com.amazonaws.ec2#FleetLaunchTemplateSpecification\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LaunchTemplateSpecification\",\n                        \"smithy.api#documentation\": \"<p>The launch template.</p>\",\n                        \"smithy.api#xmlName\": \"launchTemplateSpecification\"\n                    }\n                },\n                \"Overrides\": {\n                    \"target\": \"com.amazonaws.ec2#FleetLaunchTemplateOverridesList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Overrides\",\n                        \"smithy.api#documentation\": \"<p>Any parameters that you specify override the same parameters in the launch\\n         template.</p>\",\n                        \"smithy.api#xmlName\": \"overrides\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a launch template and overrides.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#FleetLaunchTemplateConfigList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#FleetLaunchTemplateConfig\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#FleetLaunchTemplateConfigListRequest\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#FleetLaunchTemplateConfigRequest\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 50\n                }\n            }\n        },\n        \"com.amazonaws.ec2#FleetLaunchTemplateConfigRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LaunchTemplateSpecification\": {\n                    \"target\": \"com.amazonaws.ec2#FleetLaunchTemplateSpecificationRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The launch template to use. You must specify either the launch template ID or launch\\n         template name in the request. </p>\"\n                    }\n                },\n                \"Overrides\": {\n                    \"target\": \"com.amazonaws.ec2#FleetLaunchTemplateOverridesListRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Any parameters that you specify override the same parameters in the launch\\n         template.</p>\\n         <p>For fleets of type <code>request</code> and <code>maintain</code>, a maximum of 300\\n         items is allowed across all launch templates.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a launch template and overrides.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#FleetLaunchTemplateOverrides\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceType\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceType\",\n                        \"smithy.api#documentation\": \"<p>The instance type.</p>\\n         <p>\\n            <code>mac1.metal</code> is not supported as a launch template override.</p>\\n         <note>\\n            <p>If you specify <code>InstanceType</code>, you can't specify\\n               <code>InstanceRequirements</code>.</p>\\n         </note>\",\n                        \"smithy.api#xmlName\": \"instanceType\"\n                    }\n                },\n                \"MaxPrice\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MaxPrice\",\n                        \"smithy.api#documentation\": \"<p>The maximum price per unit hour that you are willing to pay for a Spot Instance. We do not \\n         recommend using this parameter because it can lead to increased interruptions. If you \\n         do not specify this parameter, you will pay the current Spot price.\\n      </p>\\n         <important>\\n            <p>If you specify a maximum price, your instances will be interrupted more frequently \\n         than if you do not specify this parameter.</p>\\n            <p>If you specify a maximum price, it must be more than USD $0.001. Specifying a value\\n         below USD $0.001 will result in an <code>InvalidParameterValue</code> error\\n         message.</p>\\n         </important>\",\n                        \"smithy.api#xmlName\": \"maxPrice\"\n                    }\n                },\n                \"SubnetId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SubnetId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the subnet in which to launch the instances.</p>\",\n                        \"smithy.api#xmlName\": \"subnetId\"\n                    }\n                },\n                \"AvailabilityZone\": {\n                    \"target\": \"com.amazonaws.ec2#AvailabilityZoneName\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AvailabilityZone\",\n                        \"smithy.api#documentation\": \"<p>The Availability Zone in which to launch the instances.</p>\",\n                        \"smithy.api#xmlName\": \"availabilityZone\"\n                    }\n                },\n                \"WeightedCapacity\": {\n                    \"target\": \"com.amazonaws.ec2#Double\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"WeightedCapacity\",\n                        \"smithy.api#documentation\": \"<p>The number of units provided by the specified instance type. These are the same units\\n         that you chose to set the target capacity in terms of instances, or a performance\\n         characteristic such as vCPUs, memory, or I/O.</p>\\n         <p>If the target capacity divided by this value is not a whole number, Amazon EC2 rounds the\\n         number of instances to the next whole number. If this value is not specified, the default\\n         is 1.</p>\\n         <note>\\n            <p>When specifying weights, the price used in the <code>lowest-price</code> and\\n            <code>price-capacity-optimized</code> allocation strategies is per\\n            <i>unit</i> hour (where the instance price is divided by the specified\\n            weight). However, if all the specified weights are above the requested\\n            <code>TargetCapacity</code>, resulting in only 1 instance being launched, the price\\n            used is per <i>instance</i> hour.</p>\\n         </note>\",\n                        \"smithy.api#xmlName\": \"weightedCapacity\"\n                    }\n                },\n                \"Priority\": {\n                    \"target\": \"com.amazonaws.ec2#Double\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Priority\",\n                        \"smithy.api#documentation\": \"<p>The priority for the launch template override. The highest priority is launched\\n         first.</p>\\n         <p>If the On-Demand <code>AllocationStrategy</code> is set to <code>prioritized</code>,\\n         EC2 Fleet uses priority to determine which launch template override to use first in fulfilling\\n         On-Demand capacity.</p>\\n         <p>If the Spot <code>AllocationStrategy</code> is set to\\n            <code>capacity-optimized-prioritized</code>, EC2 Fleet uses priority on a best-effort basis\\n         to determine which launch template override to use in fulfilling Spot capacity, but\\n         optimizes for capacity first.</p>\\n         <p>Valid values are whole numbers starting at <code>0</code>. The lower the number, the\\n         higher the priority. If no number is set, the override has the lowest priority. You can set\\n         the same priority for different launch template overrides.</p>\",\n                        \"smithy.api#xmlName\": \"priority\"\n                    }\n                },\n                \"Placement\": {\n                    \"target\": \"com.amazonaws.ec2#PlacementResponse\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Placement\",\n                        \"smithy.api#documentation\": \"<p>The location where the instance launched, if applicable.</p>\",\n                        \"smithy.api#xmlName\": \"placement\"\n                    }\n                },\n                \"InstanceRequirements\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceRequirements\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceRequirements\",\n                        \"smithy.api#documentation\": \"<p>The attributes for the instance types. When you specify instance attributes, Amazon EC2 will\\n         identify instance types with those attributes.</p>\\n         <note>\\n            <p>If you specify <code>InstanceRequirements</code>, you can't specify\\n            <code>InstanceType</code>.</p>\\n         </note>\",\n                        \"smithy.api#xmlName\": \"instanceRequirements\"\n                    }\n                },\n                \"ImageId\": {\n                    \"target\": \"com.amazonaws.ec2#ImageId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ImageId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the AMI in the format <code>ami-17characters00000</code>.</p>\\n         <p>Alternatively, you can specify a Systems Manager parameter, using one of the following\\n         formats. The Systems Manager parameter will resolve to an AMI ID on launch.</p>\\n         <p>To reference a public parameter:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>resolve:ssm:<i>public-parameter</i>\\n                  </code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>To reference a parameter stored in the same account:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>resolve:ssm:<i>parameter-name</i>\\n                  </code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>resolve:ssm:<i>parameter-name:version-number</i>\\n                  </code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>resolve:ssm:<i>parameter-name:label</i>\\n                  </code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>To reference a parameter shared from another Amazon Web Services account:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>resolve:ssm:<i>parameter-ARN</i>\\n                  </code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>resolve:ssm:<i>parameter-ARN:version-number</i>\\n                  </code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>resolve:ssm:<i>parameter-ARN:label</i>\\n                  </code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/create-launch-template.html#use-an-ssm-parameter-instead-of-an-ami-id\\\">Use a Systems Manager parameter instead of an AMI ID</a> in the\\n            <i>Amazon EC2 User Guide</i>.</p>\\n         <note>\\n            <p>This parameter is only available for fleets of type <code>instant</code>. For fleets\\n            of type <code>maintain</code> and <code>request</code>, you must specify the AMI ID in\\n            the launch template.</p>\\n         </note>\",\n                        \"smithy.api#xmlName\": \"imageId\"\n                    }\n                },\n                \"BlockDeviceMappings\": {\n                    \"target\": \"com.amazonaws.ec2#BlockDeviceMappingResponseList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"BlockDeviceMappingSet\",\n                        \"smithy.api#documentation\": \"<p>The block device mappings, which define the EBS volumes and instance store volumes to\\n         attach to the instance at launch.</p>\\n         <p>Supported only for fleets of type <code>instant</code>.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/block-device-mapping-concepts.html\\\">Block device mappings\\n            for volumes on Amazon EC2 instances</a> in the <i>Amazon EC2 User\\n         Guide</i>.</p>\",\n                        \"smithy.api#xmlName\": \"blockDeviceMappingSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes overrides for a launch template.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#FleetLaunchTemplateOverridesList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#FleetLaunchTemplateOverrides\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#FleetLaunchTemplateOverridesListRequest\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#FleetLaunchTemplateOverridesRequest\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#FleetLaunchTemplateOverridesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceType\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The instance type.</p>\\n         <p>\\n            <code>mac1.metal</code> is not supported as a launch template override.</p>\\n         <note>\\n            <p>If you specify <code>InstanceType</code>, you can't specify\\n               <code>InstanceRequirements</code>.</p>\\n         </note>\"\n                    }\n                },\n                \"MaxPrice\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum price per unit hour that you are willing to pay for a Spot Instance. We do not \\n         recommend using this parameter because it can lead to increased interruptions. If you \\n         do not specify this parameter, you will pay the current Spot price.\\n      </p>\\n         <important>\\n            <p>If you specify a maximum price, your instances will be interrupted more \\n            frequently than if you do not specify this parameter.</p>\\n            <p>If you specify a maximum price, it must be more than USD $0.001. Specifying a value\\n            below USD $0.001 will result in an <code>InvalidParameterValue</code> error\\n            message.</p>\\n         </important>\"\n                    }\n                },\n                \"SubnetId\": {\n                    \"target\": \"com.amazonaws.ec2#SubnetId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the subnets in which to launch the instances. Separate multiple subnet IDs using commas (for example, <code>subnet-1234abcdeexample1, subnet-0987cdef6example2</code>). A request of type <code>instant</code> can have only one subnet ID.</p>\"\n                    }\n                },\n                \"AvailabilityZone\": {\n                    \"target\": \"com.amazonaws.ec2#AvailabilityZoneName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Availability Zone in which to launch the instances.</p>\"\n                    }\n                },\n                \"WeightedCapacity\": {\n                    \"target\": \"com.amazonaws.ec2#Double\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of units provided by the specified instance type. These are the same units\\n         that you chose to set the target capacity in terms of instances, or a performance\\n         characteristic such as vCPUs, memory, or I/O.</p>\\n         <p>If the target capacity divided by this value is not a whole number, Amazon EC2 rounds the\\n         number of instances to the next whole number. If this value is not specified, the default\\n         is 1.</p>\\n         <note>\\n            <p>When specifying weights, the price used in the <code>lowest-price</code> and\\n               <code>price-capacity-optimized</code> allocation strategies is per\\n               <i>unit</i> hour (where the instance price is divided by the specified\\n            weight). However, if all the specified weights are above the requested\\n               <code>TargetCapacity</code>, resulting in only 1 instance being launched, the price\\n            used is per <i>instance</i> hour.</p>\\n         </note>\"\n                    }\n                },\n                \"Priority\": {\n                    \"target\": \"com.amazonaws.ec2#Double\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The priority for the launch template override. The highest priority is launched\\n         first.</p>\\n         <p>If the On-Demand <code>AllocationStrategy</code> is set to <code>prioritized</code>,\\n         EC2 Fleet uses priority to determine which launch template override to use first in fulfilling\\n         On-Demand capacity.</p>\\n         <p>If the Spot <code>AllocationStrategy</code> is set to\\n            <code>capacity-optimized-prioritized</code>, EC2 Fleet uses priority on a best-effort basis\\n         to determine which launch template override to use in fulfilling Spot capacity, but\\n         optimizes for capacity first.</p>\\n         <p>Valid values are whole numbers starting at <code>0</code>. The lower the number, the\\n         higher the priority. If no number is set, the launch template override has the lowest\\n         priority. You can set the same priority for different launch template overrides.</p>\"\n                    }\n                },\n                \"Placement\": {\n                    \"target\": \"com.amazonaws.ec2#Placement\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The location where the instance launched, if applicable.</p>\"\n                    }\n                },\n                \"BlockDeviceMappings\": {\n                    \"target\": \"com.amazonaws.ec2#FleetBlockDeviceMappingRequestList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The block device mappings, which define the EBS volumes and instance store volumes to\\n         attach to the instance at launch.</p>\\n         <p>Supported only for fleets of type <code>instant</code>.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/block-device-mapping-concepts.html\\\">Block device mappings\\n            for volumes on Amazon EC2 instances</a> in the <i>Amazon EC2 User\\n         Guide</i>.</p>\",\n                        \"smithy.api#xmlName\": \"BlockDeviceMapping\"\n                    }\n                },\n                \"InstanceRequirements\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceRequirementsRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The attributes for the instance types. When you specify instance attributes, Amazon EC2 will\\n         identify instance types with those attributes.</p>\\n         <note>\\n            <p>If you specify <code>InstanceRequirements</code>, you can't specify\\n            <code>InstanceType</code>.</p>\\n         </note>\"\n                    }\n                },\n                \"ImageId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the AMI in the format <code>ami-17characters00000</code>.</p>\\n         <p>Alternatively, you can specify a Systems Manager parameter, using one of the following\\n         formats. The Systems Manager parameter will resolve to an AMI ID on launch.</p>\\n         <p>To reference a public parameter:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>resolve:ssm:<i>public-parameter</i>\\n                  </code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>To reference a parameter stored in the same account:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>resolve:ssm:<i>parameter-name</i>\\n                  </code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>resolve:ssm:<i>parameter-name:version-number</i>\\n                  </code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>resolve:ssm:<i>parameter-name:label</i>\\n                  </code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>To reference a parameter shared from another Amazon Web Services account:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>resolve:ssm:<i>parameter-ARN</i>\\n                  </code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>resolve:ssm:<i>parameter-ARN:version-number</i>\\n                  </code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>resolve:ssm:<i>parameter-ARN:label</i>\\n                  </code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/create-launch-template.html#use-an-ssm-parameter-instead-of-an-ami-id\\\">Use a Systems Manager parameter instead of an AMI ID</a> in the\\n         <i>Amazon EC2 User Guide</i>.</p>\\n         <note>\\n            <p>This parameter is only available for fleets of type <code>instant</code>. For fleets\\n            of type <code>maintain</code> and <code>request</code>, you must specify the AMI ID in\\n            the launch template.</p>\\n         </note>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes overrides for a launch template.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#FleetLaunchTemplateSpecification\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LaunchTemplateId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LaunchTemplateId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the launch template.</p>\\n         <p>You must specify the <code>LaunchTemplateId</code> or the <code>LaunchTemplateName</code>, but not both.</p>\",\n                        \"smithy.api#xmlName\": \"launchTemplateId\"\n                    }\n                },\n                \"LaunchTemplateName\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplateName\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LaunchTemplateName\",\n                        \"smithy.api#documentation\": \"<p>The name of the launch template.</p>\\n         <p>You must specify the <code>LaunchTemplateName</code> or the <code>LaunchTemplateId</code>, but not both.</p>\",\n                        \"smithy.api#xmlName\": \"launchTemplateName\"\n                    }\n                },\n                \"Version\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Version\",\n                        \"smithy.api#documentation\": \"<p>The launch template version number, <code>$Latest</code>, or <code>$Default</code>.\\n            You must specify a value, otherwise the request fails.</p>\\n         <p>If the value is <code>$Latest</code>, Amazon EC2 uses the latest version of the launch\\n            template.</p>\\n         <p>If the value is <code>$Default</code>, Amazon EC2 uses the default version of the launch\\n            template.</p>\",\n                        \"smithy.api#xmlName\": \"version\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The Amazon EC2 launch template that can be used by\\n            a Spot Fleet to configure Amazon EC2 instances. You must specify either the ID or name of the launch template in the request, but not both.</p>\\n         <p>For information about launch templates,\\n            see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-launch-templates.html\\\">Launch an instance from a launch template</a> in the\\n                <i>Amazon EC2 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#FleetLaunchTemplateSpecificationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LaunchTemplateId\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplateId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the launch template.</p>\\n         <p>You must specify the <code>LaunchTemplateId</code> or the <code>LaunchTemplateName</code>, but not both.</p>\"\n                    }\n                },\n                \"LaunchTemplateName\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplateName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the launch template.</p>\\n         <p>You must specify the <code>LaunchTemplateName</code> or the <code>LaunchTemplateId</code>, but not both.</p>\"\n                    }\n                },\n                \"Version\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The launch template version number, <code>$Latest</code>, or <code>$Default</code>. You must specify a value, otherwise the request fails.</p>\\n         <p>If the value is <code>$Latest</code>, Amazon EC2 uses the latest version of the launch template.</p>\\n         <p>If the value is <code>$Default</code>, Amazon EC2 uses the default version of the launch template.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The Amazon EC2 launch template that can be used by\\n         an EC2 Fleet to configure Amazon EC2 instances. You must specify either the ID or name of the launch template in the request, but not both.</p>\\n         <p>For information about launch templates, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-launch-templates.html\\\">Launch\\n            an instance from a launch template</a> in the\\n         <i>Amazon EC2 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#FleetOnDemandAllocationStrategy\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"LOWEST_PRICE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"lowest-price\"\n                    }\n                },\n                \"PRIORITIZED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"prioritized\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#FleetReplacementStrategy\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"LAUNCH\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"launch\"\n                    }\n                },\n                \"LAUNCH_BEFORE_TERMINATE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"launch-before-terminate\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#FleetSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#FleetData\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#FleetSpotCapacityRebalance\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ReplacementStrategy\": {\n                    \"target\": \"com.amazonaws.ec2#FleetReplacementStrategy\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ReplacementStrategy\",\n                        \"smithy.api#documentation\": \"<p>The replacement strategy to use. Only available for fleets of type\\n         <code>maintain</code>.</p>\\n         <p>\\n            <code>launch</code> - EC2 Fleet launches a new replacement Spot Instance when a\\n         rebalance notification is emitted for an existing Spot Instance in the fleet. EC2 Fleet\\n         does not terminate the instances that receive a rebalance notification. You can terminate\\n         the old instances, or you can leave them running. You are charged for all instances while\\n         they are running. </p>\\n         <p>\\n            <code>launch-before-terminate</code> - EC2 Fleet launches a new replacement Spot\\n         Instance when a rebalance notification is emitted for an existing Spot Instance in the\\n         fleet, and then, after a delay that you specify (in <code>TerminationDelay</code>),\\n         terminates the instances that received a rebalance notification.</p>\",\n                        \"smithy.api#xmlName\": \"replacementStrategy\"\n                    }\n                },\n                \"TerminationDelay\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TerminationDelay\",\n                        \"smithy.api#documentation\": \"<p>The amount of time (in seconds) that Amazon EC2 waits before terminating the old Spot\\n         Instance after launching a new replacement Spot Instance.</p>\\n         <p>Required when <code>ReplacementStrategy</code> is set to <code>launch-before-terminate</code>.</p>\\n         <p>Not valid when <code>ReplacementStrategy</code> is set to <code>launch</code>.</p>\\n         <p>Valid values: Minimum value of <code>120</code> seconds. Maximum value of <code>7200</code> seconds.</p>\",\n                        \"smithy.api#xmlName\": \"terminationDelay\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The strategy to use when Amazon EC2 emits a signal that your Spot Instance is at an\\n         elevated risk of being interrupted.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#FleetSpotCapacityRebalanceRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ReplacementStrategy\": {\n                    \"target\": \"com.amazonaws.ec2#FleetReplacementStrategy\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The replacement strategy to use. Only available for fleets of type\\n         <code>maintain</code>.</p>\\n         <p>\\n            <code>launch</code> - EC2 Fleet launches a replacement Spot Instance when a rebalance\\n         notification is emitted for an existing Spot Instance in the fleet. EC2 Fleet does not\\n         terminate the instances that receive a rebalance notification. You can terminate the old\\n         instances, or you can leave them running. You are charged for all instances while they are\\n         running. </p>\\n         <p>\\n            <code>launch-before-terminate</code> - EC2 Fleet launches a replacement Spot Instance\\n         when a rebalance notification is emitted for an existing Spot Instance in the fleet, and\\n         then, after a delay that you specify (in <code>TerminationDelay</code>), terminates the\\n         instances that received a rebalance notification.</p>\"\n                    }\n                },\n                \"TerminationDelay\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The amount of time (in seconds) that Amazon EC2 waits before terminating the old Spot\\n         Instance after launching a new replacement Spot Instance.</p>\\n         <p>Required when <code>ReplacementStrategy</code> is set to <code>launch-before-terminate</code>.</p>\\n         <p>Not valid when <code>ReplacementStrategy</code> is set to <code>launch</code>.</p>\\n         <p>Valid values: Minimum value of <code>120</code> seconds. Maximum value of <code>7200</code> seconds.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The Spot Instance replacement strategy to use when Amazon EC2 emits a rebalance\\n         notification signal that your Spot Instance is at an elevated risk of being interrupted.\\n         For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-fleet-capacity-rebalance.html\\\">Capacity rebalancing</a> in the <i>Amazon EC2 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#FleetSpotMaintenanceStrategies\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CapacityRebalance\": {\n                    \"target\": \"com.amazonaws.ec2#FleetSpotCapacityRebalance\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CapacityRebalance\",\n                        \"smithy.api#documentation\": \"<p>The strategy to use when Amazon EC2 emits a signal that your Spot Instance is at an\\n         elevated risk of being interrupted.</p>\",\n                        \"smithy.api#xmlName\": \"capacityRebalance\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The strategies for managing your Spot Instances that are at an elevated risk of being\\n         interrupted.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#FleetSpotMaintenanceStrategiesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CapacityRebalance\": {\n                    \"target\": \"com.amazonaws.ec2#FleetSpotCapacityRebalanceRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The strategy to use when Amazon EC2 emits a signal that your Spot Instance is at an\\n         elevated risk of being interrupted.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The strategies for managing your Spot Instances that are at an elevated risk of being interrupted.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#FleetStateCode\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"SUBMITTED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"submitted\"\n                    }\n                },\n                \"ACTIVE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"active\"\n                    }\n                },\n                \"DELETED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"deleted\"\n                    }\n                },\n                \"FAILED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"failed\"\n                    }\n                },\n                \"DELETED_RUNNING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"deleted_running\"\n                    }\n                },\n                \"DELETED_TERMINATING_INSTANCES\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"deleted_terminating\"\n                    }\n                },\n                \"MODIFYING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"modifying\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#FleetType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"REQUEST\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"request\"\n                    }\n                },\n                \"MAINTAIN\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"maintain\"\n                    }\n                },\n                \"INSTANT\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"instant\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#FlexibleEnaQueuesSupport\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"UNSUPPORTED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"unsupported\"\n                    }\n                },\n                \"SUPPORTED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"supported\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#Float\": {\n            \"type\": \"float\"\n        },\n        \"com.amazonaws.ec2#FlowLog\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CreationTime\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CreationTime\",\n                        \"smithy.api#documentation\": \"<p>The date and time the flow log was created.</p>\",\n                        \"smithy.api#xmlName\": \"creationTime\"\n                    }\n                },\n                \"DeliverLogsErrorMessage\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DeliverLogsErrorMessage\",\n                        \"smithy.api#documentation\": \"<p>Information about the error that occurred. <code>Rate limited</code> indicates that\\n            CloudWatch Logs throttling has been applied for one or more network interfaces, or that you've\\n            reached the limit on the number of log groups that you can create. <code>Access\\n                error</code> indicates that the IAM role associated with the flow log does not have\\n            sufficient permissions to publish to CloudWatch Logs. <code>Unknown error</code> indicates an\\n            internal error.</p>\",\n                        \"smithy.api#xmlName\": \"deliverLogsErrorMessage\"\n                    }\n                },\n                \"DeliverLogsPermissionArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DeliverLogsPermissionArn\",\n                        \"smithy.api#documentation\": \"<p>The ARN of the IAM role allows the service to publish logs to CloudWatch Logs.</p>\",\n                        \"smithy.api#xmlName\": \"deliverLogsPermissionArn\"\n                    }\n                },\n                \"DeliverCrossAccountRole\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DeliverCrossAccountRole\",\n                        \"smithy.api#documentation\": \"<p>The ARN of the IAM role that allows the service to publish flow logs across accounts.</p>\",\n                        \"smithy.api#xmlName\": \"deliverCrossAccountRole\"\n                    }\n                },\n                \"DeliverLogsStatus\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DeliverLogsStatus\",\n                        \"smithy.api#documentation\": \"<p>The status of the logs delivery (<code>SUCCESS</code> | <code>FAILED</code>).</p>\",\n                        \"smithy.api#xmlName\": \"deliverLogsStatus\"\n                    }\n                },\n                \"FlowLogId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"FlowLogId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the flow log.</p>\",\n                        \"smithy.api#xmlName\": \"flowLogId\"\n                    }\n                },\n                \"FlowLogStatus\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"FlowLogStatus\",\n                        \"smithy.api#documentation\": \"<p>The status of the flow log (<code>ACTIVE</code>).</p>\",\n                        \"smithy.api#xmlName\": \"flowLogStatus\"\n                    }\n                },\n                \"LogGroupName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LogGroupName\",\n                        \"smithy.api#documentation\": \"<p>The name of the flow log group.</p>\",\n                        \"smithy.api#xmlName\": \"logGroupName\"\n                    }\n                },\n                \"ResourceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResourceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the resource being monitored.</p>\",\n                        \"smithy.api#xmlName\": \"resourceId\"\n                    }\n                },\n                \"TrafficType\": {\n                    \"target\": \"com.amazonaws.ec2#TrafficType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TrafficType\",\n                        \"smithy.api#documentation\": \"<p>The type of traffic captured for the flow log.</p>\",\n                        \"smithy.api#xmlName\": \"trafficType\"\n                    }\n                },\n                \"LogDestinationType\": {\n                    \"target\": \"com.amazonaws.ec2#LogDestinationType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LogDestinationType\",\n                        \"smithy.api#documentation\": \"<p>The type of destination for the flow log data.</p>\",\n                        \"smithy.api#xmlName\": \"logDestinationType\"\n                    }\n                },\n                \"LogDestination\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LogDestination\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the destination for the flow log data.</p>\",\n                        \"smithy.api#xmlName\": \"logDestination\"\n                    }\n                },\n                \"LogFormat\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LogFormat\",\n                        \"smithy.api#documentation\": \"<p>The format of the flow log record.</p>\",\n                        \"smithy.api#xmlName\": \"logFormat\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>The tags for the flow log.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                },\n                \"MaxAggregationInterval\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MaxAggregationInterval\",\n                        \"smithy.api#documentation\": \"<p>The maximum interval of time, in seconds, during which a flow of packets is captured and aggregated into a flow log record.</p>\\n         <p>When a network interface is attached to a <a href=\\\"https://docs.aws.amazon.com/ec2/latest/instancetypes/ec2-nitro-instances.html\\\">Nitro-based\\n                instance</a>, the aggregation interval is always 60 seconds (1 minute) or less,\\n            regardless of the specified value.</p>\\n         <p>Valid Values: <code>60</code> | <code>600</code>\\n         </p>\",\n                        \"smithy.api#xmlName\": \"maxAggregationInterval\"\n                    }\n                },\n                \"DestinationOptions\": {\n                    \"target\": \"com.amazonaws.ec2#DestinationOptionsResponse\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DestinationOptions\",\n                        \"smithy.api#documentation\": \"<p>The destination options.</p>\",\n                        \"smithy.api#xmlName\": \"destinationOptions\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a flow log.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#FlowLogIdList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#VpcFlowLogId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#FlowLogResourceId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#FlowLogResourceIds\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#FlowLogResourceId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#FlowLogSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#FlowLog\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#FlowLogsResourceType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"VPC\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"VPC\"\n                    }\n                },\n                \"Subnet\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Subnet\"\n                    }\n                },\n                \"NetworkInterface\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"NetworkInterface\"\n                    }\n                },\n                \"TransitGateway\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"TransitGateway\"\n                    }\n                },\n                \"TransitGatewayAttachment\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"TransitGatewayAttachment\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#FpgaDeviceCount\": {\n            \"type\": \"integer\"\n        },\n        \"com.amazonaws.ec2#FpgaDeviceInfo\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Name\": {\n                    \"target\": \"com.amazonaws.ec2#FpgaDeviceName\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Name\",\n                        \"smithy.api#documentation\": \"<p>The name of the FPGA accelerator.</p>\",\n                        \"smithy.api#xmlName\": \"name\"\n                    }\n                },\n                \"Manufacturer\": {\n                    \"target\": \"com.amazonaws.ec2#FpgaDeviceManufacturerName\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Manufacturer\",\n                        \"smithy.api#documentation\": \"<p>The manufacturer of the FPGA accelerator.</p>\",\n                        \"smithy.api#xmlName\": \"manufacturer\"\n                    }\n                },\n                \"Count\": {\n                    \"target\": \"com.amazonaws.ec2#FpgaDeviceCount\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Count\",\n                        \"smithy.api#documentation\": \"<p>The count of FPGA accelerators for the instance type.</p>\",\n                        \"smithy.api#xmlName\": \"count\"\n                    }\n                },\n                \"MemoryInfo\": {\n                    \"target\": \"com.amazonaws.ec2#FpgaDeviceMemoryInfo\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MemoryInfo\",\n                        \"smithy.api#documentation\": \"<p>Describes the memory for the FPGA accelerator for the instance type.</p>\",\n                        \"smithy.api#xmlName\": \"memoryInfo\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the FPGA accelerator for the instance type.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#FpgaDeviceInfoList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#FpgaDeviceInfo\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#FpgaDeviceManufacturerName\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#FpgaDeviceMemoryInfo\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SizeInMiB\": {\n                    \"target\": \"com.amazonaws.ec2#FpgaDeviceMemorySize\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SizeInMiB\",\n                        \"smithy.api#documentation\": \"<p>The size of the memory available to the FPGA accelerator, in MiB.</p>\",\n                        \"smithy.api#xmlName\": \"sizeInMiB\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the memory for the FPGA accelerator for the instance type.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#FpgaDeviceMemorySize\": {\n            \"type\": \"integer\"\n        },\n        \"com.amazonaws.ec2#FpgaDeviceName\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#FpgaImage\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"FpgaImageId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"FpgaImageId\",\n                        \"smithy.api#documentation\": \"<p>The FPGA image identifier (AFI ID).</p>\",\n                        \"smithy.api#xmlName\": \"fpgaImageId\"\n                    }\n                },\n                \"FpgaImageGlobalId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"FpgaImageGlobalId\",\n                        \"smithy.api#documentation\": \"<p>The global FPGA image identifier (AGFI ID).</p>\",\n                        \"smithy.api#xmlName\": \"fpgaImageGlobalId\"\n                    }\n                },\n                \"Name\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Name\",\n                        \"smithy.api#documentation\": \"<p>The name of the AFI.</p>\",\n                        \"smithy.api#xmlName\": \"name\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Description\",\n                        \"smithy.api#documentation\": \"<p>The description of the AFI.</p>\",\n                        \"smithy.api#xmlName\": \"description\"\n                    }\n                },\n                \"ShellVersion\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ShellVersion\",\n                        \"smithy.api#documentation\": \"<p>The version of the Amazon Web Services Shell that was used to create the bitstream.</p>\",\n                        \"smithy.api#xmlName\": \"shellVersion\"\n                    }\n                },\n                \"PciId\": {\n                    \"target\": \"com.amazonaws.ec2#PciId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PciId\",\n                        \"smithy.api#documentation\": \"<p>Information about the PCI bus.</p>\",\n                        \"smithy.api#xmlName\": \"pciId\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#FpgaImageState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>Information about the state of the AFI.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                },\n                \"CreateTime\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CreateTime\",\n                        \"smithy.api#documentation\": \"<p>The date and time the AFI was created.</p>\",\n                        \"smithy.api#xmlName\": \"createTime\"\n                    }\n                },\n                \"UpdateTime\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"UpdateTime\",\n                        \"smithy.api#documentation\": \"<p>The time of the most recent update to the AFI.</p>\",\n                        \"smithy.api#xmlName\": \"updateTime\"\n                    }\n                },\n                \"OwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OwnerId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Amazon Web Services account that owns the AFI.</p>\",\n                        \"smithy.api#xmlName\": \"ownerId\"\n                    }\n                },\n                \"OwnerAlias\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OwnerAlias\",\n                        \"smithy.api#documentation\": \"<p>The alias of the AFI owner. Possible values include <code>self</code>, <code>amazon</code>, and <code>aws-marketplace</code>.</p>\",\n                        \"smithy.api#xmlName\": \"ownerAlias\"\n                    }\n                },\n                \"ProductCodes\": {\n                    \"target\": \"com.amazonaws.ec2#ProductCodeList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ProductCodes\",\n                        \"smithy.api#documentation\": \"<p>The product codes for the AFI.</p>\",\n                        \"smithy.api#xmlName\": \"productCodes\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Tags\",\n                        \"smithy.api#documentation\": \"<p>Any tags assigned to the AFI.</p>\",\n                        \"smithy.api#xmlName\": \"tags\"\n                    }\n                },\n                \"Public\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Public\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether the AFI is public.</p>\",\n                        \"smithy.api#xmlName\": \"public\"\n                    }\n                },\n                \"DataRetentionSupport\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DataRetentionSupport\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether data retention support is enabled for the AFI.</p>\",\n                        \"smithy.api#xmlName\": \"dataRetentionSupport\"\n                    }\n                },\n                \"InstanceTypes\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceTypesList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceTypes\",\n                        \"smithy.api#documentation\": \"<p>The instance types supported by the AFI.</p>\",\n                        \"smithy.api#xmlName\": \"instanceTypes\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes an Amazon FPGA image (AFI).</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#FpgaImageAttribute\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"FpgaImageId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"FpgaImageId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the AFI.</p>\",\n                        \"smithy.api#xmlName\": \"fpgaImageId\"\n                    }\n                },\n                \"Name\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Name\",\n                        \"smithy.api#documentation\": \"<p>The name of the AFI.</p>\",\n                        \"smithy.api#xmlName\": \"name\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Description\",\n                        \"smithy.api#documentation\": \"<p>The description of the AFI.</p>\",\n                        \"smithy.api#xmlName\": \"description\"\n                    }\n                },\n                \"LoadPermissions\": {\n                    \"target\": \"com.amazonaws.ec2#LoadPermissionList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LoadPermissions\",\n                        \"smithy.api#documentation\": \"<p>The load permissions.</p>\",\n                        \"smithy.api#xmlName\": \"loadPermissions\"\n                    }\n                },\n                \"ProductCodes\": {\n                    \"target\": \"com.amazonaws.ec2#ProductCodeList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ProductCodes\",\n                        \"smithy.api#documentation\": \"<p>The product codes.</p>\",\n                        \"smithy.api#xmlName\": \"productCodes\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes an Amazon FPGA image (AFI) attribute.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#FpgaImageAttributeName\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"description\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"description\"\n                    }\n                },\n                \"name\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"name\"\n                    }\n                },\n                \"loadPermission\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"loadPermission\"\n                    }\n                },\n                \"productCodes\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"productCodes\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#FpgaImageId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#FpgaImageIdList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#FpgaImageId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#FpgaImageList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#FpgaImage\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#FpgaImageState\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Code\": {\n                    \"target\": \"com.amazonaws.ec2#FpgaImageStateCode\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Code\",\n                        \"smithy.api#documentation\": \"<p>The state. The following are the possible values:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>pending</code> - AFI bitstream generation is in progress.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>available</code> - The AFI is available for use.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>failed</code> - AFI bitstream generation failed.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>unavailable</code> - The AFI is no longer available for use.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"code\"\n                    }\n                },\n                \"Message\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Message\",\n                        \"smithy.api#documentation\": \"<p>If the state is <code>failed</code>, this is the error message.</p>\",\n                        \"smithy.api#xmlName\": \"message\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the state of the bitstream generation process for an Amazon FPGA image (AFI).</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#FpgaImageStateCode\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"pending\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"pending\"\n                    }\n                },\n                \"failed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"failed\"\n                    }\n                },\n                \"available\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"available\"\n                    }\n                },\n                \"unavailable\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"unavailable\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#FpgaInfo\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Fpgas\": {\n                    \"target\": \"com.amazonaws.ec2#FpgaDeviceInfoList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Fpgas\",\n                        \"smithy.api#documentation\": \"<p>Describes the FPGAs for the instance type.</p>\",\n                        \"smithy.api#xmlName\": \"fpgas\"\n                    }\n                },\n                \"TotalFpgaMemoryInMiB\": {\n                    \"target\": \"com.amazonaws.ec2#totalFpgaMemory\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TotalFpgaMemoryInMiB\",\n                        \"smithy.api#documentation\": \"<p>The total memory of all FPGA accelerators for the instance type.</p>\",\n                        \"smithy.api#xmlName\": \"totalFpgaMemoryInMiB\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the FPGAs for the instance type.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#FreeTierEligibleFlag\": {\n            \"type\": \"boolean\"\n        },\n        \"com.amazonaws.ec2#GVCDMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 200,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.ec2#GatewayAssociationState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"associated\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"associated\"\n                    }\n                },\n                \"not_associated\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"not-associated\"\n                    }\n                },\n                \"associating\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"associating\"\n                    }\n                },\n                \"disassociating\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"disassociating\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#GatewayType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ipsec_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ipsec.1\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#GetActiveVpnTunnelStatus\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#GetActiveVpnTunnelStatusRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#GetActiveVpnTunnelStatusResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns the currently negotiated security parameters for an active VPN tunnel, including IKE version, DH groups, encryption algorithms, and integrity algorithms.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#GetActiveVpnTunnelStatusRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VpnConnectionId\": {\n                    \"target\": \"com.amazonaws.ec2#VpnConnectionId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the VPN connection for which to retrieve the active tunnel status.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"VpnTunnelOutsideIpAddress\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The external IP address of the VPN tunnel for which to retrieve the active status.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetActiveVpnTunnelStatusResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ActiveVpnTunnelStatus\": {\n                    \"target\": \"com.amazonaws.ec2#ActiveVpnTunnelStatus\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ActiveVpnTunnelStatus\",\n                        \"smithy.api#documentation\": \"<p>Information about the current security configuration of the VPN tunnel.</p>\",\n                        \"smithy.api#xmlName\": \"activeVpnTunnelStatus\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetAllowedImagesSettings\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#GetAllowedImagesSettingsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#GetAllowedImagesSettingsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Gets the current state of the Allowed AMIs setting and the list of Allowed AMIs criteria\\n      at the account level in the specified Region.</p>\\n         <note>\\n            <p>The Allowed AMIs feature does not restrict the AMIs owned by your account. Regardless of\\n        the criteria you set, the AMIs created by your account will always be discoverable and\\n        usable by users in your account.</p>\\n         </note>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-allowed-amis.html\\\">Control the discovery and use of AMIs in\\n      Amazon EC2 with Allowed AMIs</a> in\\n      <i>Amazon EC2 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#GetAllowedImagesSettingsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n\\t\\t\\tand provides an error response. If you have the required permissions, the error response is \\n\\t\\t\\t<code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetAllowedImagesSettingsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The current state of the Allowed AMIs setting at the account level in the specified Amazon Web Services\\n      Region.</p>\\n         <p>Possible values:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>disabled</code>: All AMIs are allowed.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>audit-mode</code>: All AMIs are allowed, but the <code>ImageAllowed</code> field\\n          is set to <code>true</code> if the AMI would be allowed with the current list of criteria\\n          if allowed AMIs was enabled.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>enabled</code>: Only AMIs matching the image criteria are discoverable and\\n          available for use.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                },\n                \"ImageCriteria\": {\n                    \"target\": \"com.amazonaws.ec2#ImageCriterionList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ImageCriterionSet\",\n                        \"smithy.api#documentation\": \"<p>The list of criteria for images that are discoverable and usable in the account in the\\n      specified Amazon Web Services Region.</p>\",\n                        \"smithy.api#xmlName\": \"imageCriterionSet\"\n                    }\n                },\n                \"ManagedBy\": {\n                    \"target\": \"com.amazonaws.ec2#ManagedBy\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ManagedBy\",\n                        \"smithy.api#documentation\": \"<p>The entity that manages the Allowed AMIs settings. Possible values include:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>account</code> - The Allowed AMIs settings is managed by the account.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>declarative-policy</code> - The Allowed AMIs settings is managed by a\\n                    declarative policy and can't be modified by the account.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"managedBy\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetAssociatedEnclaveCertificateIamRoles\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#GetAssociatedEnclaveCertificateIamRolesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#GetAssociatedEnclaveCertificateIamRolesResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns the IAM roles that are associated with the specified ACM (ACM) certificate. \\n\\t\\t\\tIt also returns the name of the Amazon S3 bucket and the Amazon S3 object key where the certificate, \\n\\t\\t\\tcertificate chain, and encrypted private key bundle are stored, and the ARN of the KMS key \\n\\t\\t\\tthat's used to encrypt the private key.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#GetAssociatedEnclaveCertificateIamRolesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CertificateArn\": {\n                    \"target\": \"com.amazonaws.ec2#CertificateId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ARN of the ACM certificate for which to view the associated IAM roles, encryption keys, and Amazon \\n\\t\\t\\tS3 object information.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetAssociatedEnclaveCertificateIamRolesResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AssociatedRoles\": {\n                    \"target\": \"com.amazonaws.ec2#AssociatedRolesList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AssociatedRoleSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the associated IAM roles.</p>\",\n                        \"smithy.api#xmlName\": \"associatedRoleSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetAssociatedIpv6PoolCidrs\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#GetAssociatedIpv6PoolCidrsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#GetAssociatedIpv6PoolCidrsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Gets information about the IPv6 CIDR block associations for a specified IPv6 address pool.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"Ipv6CidrAssociations\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#GetAssociatedIpv6PoolCidrsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PoolId\": {\n                    \"target\": \"com.amazonaws.ec2#Ipv6PoolEc2Id\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the IPv6 address pool.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next page of results.</p>\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#Ipv6PoolMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return with a single call.\\n\\tTo retrieve the remaining results, make another call with the returned <code>nextToken</code> value.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetAssociatedIpv6PoolCidrsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Ipv6CidrAssociations\": {\n                    \"target\": \"com.amazonaws.ec2#Ipv6CidrAssociationSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Ipv6CidrAssociationSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the IPv6 CIDR block associations.</p>\",\n                        \"smithy.api#xmlName\": \"ipv6CidrAssociationSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetAwsNetworkPerformanceData\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#GetAwsNetworkPerformanceDataRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#GetAwsNetworkPerformanceDataResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Gets network performance data.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"DataResponses\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#GetAwsNetworkPerformanceDataRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DataQueries\": {\n                    \"target\": \"com.amazonaws.ec2#DataQueries\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of network performance data queries.</p>\",\n                        \"smithy.api#xmlName\": \"DataQuery\"\n                    }\n                },\n                \"StartTime\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The starting time for the performance data request. The starting time must be formatted\\n         as <code>yyyy-mm-ddThh:mm:ss</code>.  For example, <code>2022-06-10T12:00:00.000Z</code>.</p>\"\n                    }\n                },\n                \"EndTime\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ending time for the performance data request. The end time must be formatted as <code>yyyy-mm-ddThh:mm:ss</code>. For example, <code>2022-06-12T12:00:00.000Z</code>.</p>\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return with a single call.\\n   To retrieve the remaining results, make another call with the returned <code>nextToken</code> value.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next page of results.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetAwsNetworkPerformanceDataResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DataResponses\": {\n                    \"target\": \"com.amazonaws.ec2#DataResponses\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DataResponseSet\",\n                        \"smithy.api#documentation\": \"<p>The list of data responses.</p>\",\n                        \"smithy.api#xmlName\": \"dataResponseSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetCapacityReservationUsage\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#GetCapacityReservationUsageRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#GetCapacityReservationUsageResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Gets usage information about a Capacity Reservation. If the Capacity Reservation is\\n\\t\\t\\tshared, it shows usage information for the Capacity Reservation owner and each Amazon Web Services account that is currently using the shared capacity. If the Capacity\\n\\t\\t\\tReservation is not shared, it shows only the Capacity Reservation owner's usage.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#GetCapacityReservationUsageRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CapacityReservationId\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityReservationId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the Capacity Reservation.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results.</p>\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#GetCapacityReservationUsageRequestMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of items to return for this request. To get the next page of items, make another request with the token returned in the output. For more information, \\n    see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Query-Requests.html#api-pagination\\\">Pagination</a>.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetCapacityReservationUsageRequestMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.ec2#GetCapacityReservationUsageResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                },\n                \"CapacityReservationId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CapacityReservationId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Capacity Reservation.</p>\",\n                        \"smithy.api#xmlName\": \"capacityReservationId\"\n                    }\n                },\n                \"InstanceType\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceType\",\n                        \"smithy.api#documentation\": \"<p>The type of instance for which the Capacity Reservation reserves capacity.</p>\",\n                        \"smithy.api#xmlName\": \"instanceType\"\n                    }\n                },\n                \"TotalInstanceCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TotalInstanceCount\",\n                        \"smithy.api#documentation\": \"<p>The number of instances for which the Capacity Reservation reserves capacity.</p>\",\n                        \"smithy.api#xmlName\": \"totalInstanceCount\"\n                    }\n                },\n                \"AvailableInstanceCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AvailableInstanceCount\",\n                        \"smithy.api#documentation\": \"<p>The remaining capacity. Indicates the number of instances that can be launched in the\\n\\t\\t\\tCapacity Reservation.</p>\",\n                        \"smithy.api#xmlName\": \"availableInstanceCount\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityReservationState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The current state of the Capacity Reservation. A Capacity Reservation can be in one of\\n\\t\\t\\tthe following states:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>active</code> - The capacity is available for use.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>expired</code> - The Capacity Reservation expired automatically at the date and time \\n\\t\\tspecified in your reservation request. The reserved capacity is no longer available for your use.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>cancelled</code> - The Capacity Reservation was canceled. The reserved capacity is no \\n\\t\\tlonger available for your use.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>pending</code> - The Capacity Reservation request was successful but the capacity \\n\\t\\tprovisioning is still pending.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>failed</code> - The Capacity Reservation request has failed. A request can fail due to \\n\\t\\trequest parameters that are not valid, capacity constraints, or instance limit constraints. You \\n\\t\\tcan view a failed request for 60 minutes.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>scheduled</code> - (<i>Future-dated Capacity Reservations</i>) The \\n\\t\\tfuture-dated Capacity Reservation request was approved and the Capacity Reservation is scheduled \\n\\t\\tfor delivery on the requested start date.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>payment-pending</code> - (<i>Capacity Blocks</i>) The upfront \\n\\t    payment has not been processed yet.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>payment-failed</code> - (<i>Capacity Blocks</i>) The upfront \\n\\t    payment was not processed in the 12-hour time frame. Your Capacity Block was released.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>assessing</code> - (<i>Future-dated Capacity Reservations</i>) \\n\\t\\tAmazon EC2 is assessing your request for a future-dated Capacity Reservation.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>delayed</code> - (<i>Future-dated Capacity Reservations</i>) Amazon EC2 \\n\\t\\tencountered a delay in provisioning the requested future-dated Capacity Reservation. Amazon EC2 is \\n\\t\\tunable to deliver the requested capacity by the requested start date and time.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>unsupported</code> - (<i>Future-dated Capacity Reservations</i>) Amazon EC2 \\n\\t\\tcan't support the future-dated Capacity Reservation request due to capacity constraints. You can view \\n\\t\\tunsupported requests for 30 days. The Capacity Reservation will not be delivered.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                },\n                \"InstanceUsages\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceUsageSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceUsageSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the Capacity Reservation usage.</p>\",\n                        \"smithy.api#xmlName\": \"instanceUsageSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetCoipPoolUsage\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#GetCoipPoolUsageRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#GetCoipPoolUsageResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the allocations from the specified customer-owned address pool.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#GetCoipPoolUsageRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PoolId\": {\n                    \"target\": \"com.amazonaws.ec2#Ipv4PoolCoipId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the address pool.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>coip-address-usage.allocation-id</code> - The allocation ID of the address.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>coip-address-usage.aws-account-id</code> - The ID of the Amazon Web Services account that is using the customer-owned IP address.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>coip-address-usage.aws-service</code> - The Amazon Web Services service that is using the customer-owned IP address.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>coip-address-usage.co-ip</code> - The customer-owned IP address.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#CoipPoolMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return with a single call.\\n\\tTo retrieve the remaining results, make another call with the returned <code>nextToken</code> value.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next page of results.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetCoipPoolUsageResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CoipPoolId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CoipPoolId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the customer-owned address pool.</p>\",\n                        \"smithy.api#xmlName\": \"coipPoolId\"\n                    }\n                },\n                \"CoipAddressUsages\": {\n                    \"target\": \"com.amazonaws.ec2#CoipAddressUsageSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CoipAddressUsageSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the address usage.</p>\",\n                        \"smithy.api#xmlName\": \"coipAddressUsageSet\"\n                    }\n                },\n                \"LocalGatewayRouteTableId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LocalGatewayRouteTableId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the local gateway route table.</p>\",\n                        \"smithy.api#xmlName\": \"localGatewayRouteTableId\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetConsoleOutput\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#GetConsoleOutputRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#GetConsoleOutputResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Gets the console output for the specified instance. For Linux instances, the instance\\n            console output displays the exact console output that would normally be displayed on a\\n            physical monitor attached to a computer. For Windows instances, the instance console\\n            output includes the last three system event log errors.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-console.html#instance-console-console-output\\\">Instance\\n                console output</a> in the <i>Amazon EC2 User Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To get the console output\",\n                        \"documentation\": \"This example gets the console output for the specified instance.\",\n                        \"input\": {\n                            \"InstanceId\": \"i-1234567890abcdef0\"\n                        },\n                        \"output\": {\n                            \"InstanceId\": \"i-1234567890abcdef0\",\n                            \"Output\": \"...\",\n                            \"Timestamp\": \"2018-05-25T21:23:53.000Z\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#GetConsoleOutputRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the instance.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Latest\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>When enabled, retrieves the latest console output for the instance.</p>\\n         <p>Default: disabled (<code>false</code>)</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the operation, without actually making the \\n  request, and provides an error response. If you have the required permissions, the error response is \\n  <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetConsoleOutputResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the instance.</p>\",\n                        \"smithy.api#xmlName\": \"instanceId\"\n                    }\n                },\n                \"Timestamp\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Timestamp\",\n                        \"smithy.api#documentation\": \"<p>The time at which the output was last updated.</p>\",\n                        \"smithy.api#xmlName\": \"timestamp\"\n                    }\n                },\n                \"Output\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Output\",\n                        \"smithy.api#documentation\": \"<p>The console output, base64-encoded. If you are using a command line tool, the tool\\n            decodes the output for you.</p>\",\n                        \"smithy.api#xmlName\": \"output\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetConsoleScreenshot\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#GetConsoleScreenshotRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#GetConsoleScreenshotResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Retrieve a JPG-format screenshot of a running instance to help with\\n            troubleshooting.</p>\\n         <p>The returned content is Base64-encoded.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/troubleshoot-unreachable-instance.html#instance-console-console-output\\\">Instance console output</a> in the <i>Amazon EC2 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#GetConsoleScreenshotRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the operation, without actually making the \\n  request, and provides an error response. If you have the required permissions, the error response is \\n  <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"InstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the instance.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"WakeUp\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>When set to <code>true</code>, acts as keystroke input and wakes up an instance that's\\n            in standby or \\\"sleep\\\" mode.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetConsoleScreenshotResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ImageData\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ImageData\",\n                        \"smithy.api#documentation\": \"<p>The data that comprises the image.</p>\",\n                        \"smithy.api#xmlName\": \"imageData\"\n                    }\n                },\n                \"InstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the instance.</p>\",\n                        \"smithy.api#xmlName\": \"instanceId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetDeclarativePoliciesReportSummary\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#GetDeclarativePoliciesReportSummaryRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#GetDeclarativePoliciesReportSummaryResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Retrieves a summary of the account status report.</p>\\n         <p>To view the full report, download it from the Amazon S3 bucket where it was saved.\\n            Reports are accessible only when they have the <code>complete</code> status. Reports\\n            with other statuses (<code>running</code>, <code>cancelled</code>, or\\n            <code>error</code>) are not available in the S3 bucket. For more information about\\n            downloading objects from an S3 bucket, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/download-objects.html\\\">Downloading objects</a> in\\n            the <i>Amazon Simple Storage Service User Guide</i>.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_declarative_status-report.html\\\">Generating the account status report for declarative policies</a> in the\\n                <i>Amazon Web Services Organizations User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#GetDeclarativePoliciesReportSummaryRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"ReportId\": {\n                    \"target\": \"com.amazonaws.ec2#DeclarativePoliciesReportId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the report.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetDeclarativePoliciesReportSummaryResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ReportId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ReportId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the report.</p>\",\n                        \"smithy.api#xmlName\": \"reportId\"\n                    }\n                },\n                \"S3Bucket\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"S3Bucket\",\n                        \"smithy.api#documentation\": \"<p>The name of the Amazon S3 bucket where the report is located.</p>\",\n                        \"smithy.api#xmlName\": \"s3Bucket\"\n                    }\n                },\n                \"S3Prefix\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"S3Prefix\",\n                        \"smithy.api#documentation\": \"<p>The prefix for your S3 object.</p>\",\n                        \"smithy.api#xmlName\": \"s3Prefix\"\n                    }\n                },\n                \"TargetId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TargetId\",\n                        \"smithy.api#documentation\": \"<p>The root ID, organizational unit ID, or account ID.</p>\\n         <p>Format:</p>\\n         <ul>\\n            <li>\\n               <p>For root: <code>r-ab12</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>For OU: <code>ou-ab12-cdef1234</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>For account: <code>123456789012</code>\\n               </p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"targetId\"\n                    }\n                },\n                \"StartTime\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"StartTime\",\n                        \"smithy.api#documentation\": \"<p>The time when the report generation started.</p>\",\n                        \"smithy.api#xmlName\": \"startTime\"\n                    }\n                },\n                \"EndTime\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EndTime\",\n                        \"smithy.api#documentation\": \"<p>The time when the report generation ended.</p>\",\n                        \"smithy.api#xmlName\": \"endTime\"\n                    }\n                },\n                \"NumberOfAccounts\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NumberOfAccounts\",\n                        \"smithy.api#documentation\": \"<p>The total number of accounts associated with the specified\\n            <code>targetId</code>.</p>\",\n                        \"smithy.api#xmlName\": \"numberOfAccounts\"\n                    }\n                },\n                \"NumberOfFailedAccounts\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NumberOfFailedAccounts\",\n                        \"smithy.api#documentation\": \"<p>The number of accounts where attributes could not be retrieved in any Region.</p>\",\n                        \"smithy.api#xmlName\": \"numberOfFailedAccounts\"\n                    }\n                },\n                \"AttributeSummaries\": {\n                    \"target\": \"com.amazonaws.ec2#AttributeSummaryList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AttributeSummarySet\",\n                        \"smithy.api#documentation\": \"<p>The attributes described in the report.</p>\",\n                        \"smithy.api#xmlName\": \"attributeSummarySet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetDefaultCreditSpecification\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#GetDefaultCreditSpecificationRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#GetDefaultCreditSpecificationResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the default credit option for CPU usage of a burstable performance instance\\n            family.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/burstable-performance-instances.html\\\">Burstable\\n                performance instances</a> in the <i>Amazon EC2 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#GetDefaultCreditSpecificationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the operation, without actually making the \\n  request, and provides an error response. If you have the required permissions, the error response is \\n  <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"InstanceFamily\": {\n                    \"target\": \"com.amazonaws.ec2#UnlimitedSupportedInstanceFamily\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The instance family.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetDefaultCreditSpecificationResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceFamilyCreditSpecification\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceFamilyCreditSpecification\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceFamilyCreditSpecification\",\n                        \"smithy.api#documentation\": \"<p>The default credit option for CPU usage of the instance family.</p>\",\n                        \"smithy.api#xmlName\": \"instanceFamilyCreditSpecification\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetEbsDefaultKmsKeyId\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#GetEbsDefaultKmsKeyIdRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#GetEbsDefaultKmsKeyIdResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the default KMS key for EBS encryption by default for your account in this Region.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/ebs/latest/userguide/ebs-encryption.html\\\">Amazon EBS encryption</a>\\n      in the <i>Amazon EBS User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#GetEbsDefaultKmsKeyIdRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetEbsDefaultKmsKeyIdResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"KmsKeyId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"KmsKeyId\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the default KMS key for encryption by default.</p>\",\n                        \"smithy.api#xmlName\": \"kmsKeyId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetEbsEncryptionByDefault\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#GetEbsEncryptionByDefaultRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#GetEbsEncryptionByDefaultResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes whether EBS encryption by default is enabled for your account in the current\\n      Region.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/ebs/latest/userguide/ebs-encryption.html\\\">Amazon EBS encryption</a>\\n      in the <i>Amazon EBS User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#GetEbsEncryptionByDefaultRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetEbsEncryptionByDefaultResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"EbsEncryptionByDefault\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EbsEncryptionByDefault\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether encryption by default is enabled.</p>\",\n                        \"smithy.api#xmlName\": \"ebsEncryptionByDefault\"\n                    }\n                },\n                \"SseType\": {\n                    \"target\": \"com.amazonaws.ec2#SSEType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SseType\",\n                        \"smithy.api#documentation\": \"<p>Reserved for future use.</p>\",\n                        \"smithy.api#xmlName\": \"sseType\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetFlowLogsIntegrationTemplate\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#GetFlowLogsIntegrationTemplateRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#GetFlowLogsIntegrationTemplateResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Generates a CloudFormation template that streamlines and automates the integration of VPC flow logs \\n            with Amazon Athena. This make it easier for you to query and gain insights from VPC flow logs data. \\n            Based on the information that you provide, we configure resources in the template to do the following:</p>\\n         <ul>\\n            <li>\\n               <p>Create a table in Athena that maps fields to a custom log format</p>\\n            </li>\\n            <li>\\n               <p>Create a Lambda function that updates the table with new partitions on a daily, weekly, or\\n                    monthly basis</p>\\n            </li>\\n            <li>\\n               <p>Create a table partitioned between two timestamps in the past</p>\\n            </li>\\n            <li>\\n               <p>Create a set of named queries in Athena that you can use to get started quickly</p>\\n            </li>\\n         </ul>\\n         <note>\\n            <p>\\n               <code>GetFlowLogsIntegrationTemplate</code> does not support integration between\\n                    Amazon Web Services Transit Gateway Flow Logs and Amazon Athena.</p>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.ec2#GetFlowLogsIntegrationTemplateRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"FlowLogId\": {\n                    \"target\": \"com.amazonaws.ec2#VpcFlowLogId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the flow log.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ConfigDeliveryS3DestinationArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>To store the CloudFormation template in Amazon S3, specify the location in Amazon S3.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"IntegrateServices\": {\n                    \"target\": \"com.amazonaws.ec2#IntegrateServices\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>Information about the service integration.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"IntegrateService\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetFlowLogsIntegrationTemplateResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Result\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Result\",\n                        \"smithy.api#documentation\": \"<p>The generated CloudFormation template.</p>\",\n                        \"smithy.api#xmlName\": \"result\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetGroupsForCapacityReservation\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#GetGroupsForCapacityReservationRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#GetGroupsForCapacityReservationResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Lists the resource groups to which a Capacity Reservation has been added.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"CapacityReservationGroups\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#GetGroupsForCapacityReservationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CapacityReservationId\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityReservationId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the Capacity Reservation. If you specify a Capacity Reservation that is\\n\\t\\t\\tshared with you, the operation returns only Capacity Reservation groups that you\\n\\t\\t\\town.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results.</p>\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#GetGroupsForCapacityReservationRequestMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of items to return for this request. To get the next page of items, make another request with the token returned in the output. For more information, \\n    see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Query-Requests.html#api-pagination\\\">Pagination</a>.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetGroupsForCapacityReservationRequestMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.ec2#GetGroupsForCapacityReservationResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                },\n                \"CapacityReservationGroups\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityReservationGroupSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CapacityReservationGroupSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the resource groups to which the Capacity Reservation has been\\n\\t\\t\\tadded.</p>\",\n                        \"smithy.api#xmlName\": \"capacityReservationGroupSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetHostReservationPurchasePreview\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#GetHostReservationPurchasePreviewRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#GetHostReservationPurchasePreviewResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Preview a reservation purchase with configurations that match those of your Dedicated\\n            Host. You must have active Dedicated Hosts in your account before you purchase a\\n            reservation.</p>\\n         <p>This is a preview of the <a>PurchaseHostReservation</a> action and does not\\n            result in the offering being purchased.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#GetHostReservationPurchasePreviewRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"HostIdSet\": {\n                    \"target\": \"com.amazonaws.ec2#RequestHostIdSet\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The IDs of the Dedicated Hosts with which the reservation is associated.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"OfferingId\": {\n                    \"target\": \"com.amazonaws.ec2#OfferingId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The offering ID of the reservation.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetHostReservationPurchasePreviewResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CurrencyCode\": {\n                    \"target\": \"com.amazonaws.ec2#CurrencyCodeValues\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CurrencyCode\",\n                        \"smithy.api#documentation\": \"<p>The currency in which the <code>totalUpfrontPrice</code> and\\n                <code>totalHourlyPrice</code> amounts are specified. At this time, the only\\n            supported currency is <code>USD</code>.</p>\",\n                        \"smithy.api#xmlName\": \"currencyCode\"\n                    }\n                },\n                \"Purchase\": {\n                    \"target\": \"com.amazonaws.ec2#PurchaseSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Purchase\",\n                        \"smithy.api#documentation\": \"<p>The purchase information of the Dedicated Host reservation and the Dedicated Hosts\\n            associated with it.</p>\",\n                        \"smithy.api#xmlName\": \"purchase\"\n                    }\n                },\n                \"TotalHourlyPrice\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TotalHourlyPrice\",\n                        \"smithy.api#documentation\": \"<p>The potential total hourly price of the reservation per hour.</p>\",\n                        \"smithy.api#xmlName\": \"totalHourlyPrice\"\n                    }\n                },\n                \"TotalUpfrontPrice\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TotalUpfrontPrice\",\n                        \"smithy.api#documentation\": \"<p>The potential total upfront price. This is billed immediately.</p>\",\n                        \"smithy.api#xmlName\": \"totalUpfrontPrice\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetImageBlockPublicAccessState\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#GetImageBlockPublicAccessStateRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#GetImageBlockPublicAccessStateResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Gets the current state of <i>block public access for AMIs</i> at the account\\n      level in the specified Amazon Web Services Region.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/block-public-access-to-amis.html\\\">Block\\n      public access to your AMIs</a> in the <i>Amazon EC2 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#GetImageBlockPublicAccessStateRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n\\t\\t\\tand provides an error response. If you have the required permissions, the error response is \\n\\t\\t\\t<code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetImageBlockPublicAccessStateResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ImageBlockPublicAccessState\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ImageBlockPublicAccessState\",\n                        \"smithy.api#documentation\": \"<p>The current state of block public access for AMIs at the account level in the specified\\n      Amazon Web Services Region.</p>\\n         <p>Possible values:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>block-new-sharing</code> - Any attempt to publicly share your AMIs in the\\n          specified Region is blocked.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>unblocked</code> - Your AMIs in the specified Region can be publicly\\n          shared.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"imageBlockPublicAccessState\"\n                    }\n                },\n                \"ManagedBy\": {\n                    \"target\": \"com.amazonaws.ec2#ManagedBy\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ManagedBy\",\n                        \"smithy.api#documentation\": \"<p>The entity that manages the state for block public access for AMIs. Possible values\\n            include:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>account</code> -  The state is managed by the account.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>declarative-policy</code> - The state is managed by a declarative policy and\\n            can't be modified by the account.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"managedBy\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetInstanceMetadataDefaults\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#GetInstanceMetadataDefaultsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#GetInstanceMetadataDefaultsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Gets the default instance metadata service (IMDS) settings that are set at the account\\n            level in the specified Amazon Web Services\\u2028 Region.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/configuring-instance-metadata-options.html#instance-metadata-options-order-of-precedence\\\">Order of precedence for instance metadata options</a> in the\\n            <i>Amazon EC2 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#GetInstanceMetadataDefaultsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the operation, without actually making the \\n  request, and provides an error response. If you have the required permissions, the error response is \\n  <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetInstanceMetadataDefaultsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountLevel\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceMetadataDefaultsResponse\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AccountLevel\",\n                        \"smithy.api#documentation\": \"<p>The account-level default IMDS settings.</p>\",\n                        \"smithy.api#xmlName\": \"accountLevel\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetInstanceTpmEkPub\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#GetInstanceTpmEkPubRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#GetInstanceTpmEkPubResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Gets the public endorsement key associated with the Nitro Trusted \\n            Platform Module (NitroTPM) for the specified instance.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#GetInstanceTpmEkPubRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the instance for which to get the public endorsement key.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"InstanceId\"\n                    }\n                },\n                \"KeyType\": {\n                    \"target\": \"com.amazonaws.ec2#EkPubKeyType\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The required public endorsement key type.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"KeyFormat\": {\n                    \"target\": \"com.amazonaws.ec2#EkPubKeyFormat\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The required public endorsement key format. Specify <code>der</code> for a DER-encoded public \\n            key that is compatible with OpenSSL. Specify <code>tpmt</code> for a TPM 2.0 format that is \\n            compatible with tpm2-tools. The returned key is base64 encoded.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify this parameter to verify whether the request will succeed, without actually making the \\n            request. If the request will succeed, the response is <code>DryRunOperation</code>. Otherwise, \\n            the response is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetInstanceTpmEkPubResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the instance.</p>\",\n                        \"smithy.api#xmlName\": \"instanceId\"\n                    }\n                },\n                \"KeyType\": {\n                    \"target\": \"com.amazonaws.ec2#EkPubKeyType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"KeyType\",\n                        \"smithy.api#documentation\": \"<p>The public endorsement key type.</p>\",\n                        \"smithy.api#xmlName\": \"keyType\"\n                    }\n                },\n                \"KeyFormat\": {\n                    \"target\": \"com.amazonaws.ec2#EkPubKeyFormat\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"KeyFormat\",\n                        \"smithy.api#documentation\": \"<p>The public endorsement key format.</p>\",\n                        \"smithy.api#xmlName\": \"keyFormat\"\n                    }\n                },\n                \"KeyValue\": {\n                    \"target\": \"com.amazonaws.ec2#EkPubKeyValue\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"KeyValue\",\n                        \"smithy.api#documentation\": \"<p>The public endorsement key material.</p>\",\n                        \"smithy.api#xmlName\": \"keyValue\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetInstanceTypesFromInstanceRequirements\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#GetInstanceTypesFromInstanceRequirementsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#GetInstanceTypesFromInstanceRequirementsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns a list of instance types with the specified instance attributes. You can\\n         use the response to preview the instance types without launching instances. Note\\n         that the response does not consider capacity.</p>\\n         <p>When you specify multiple parameters, you get instance types that satisfy all of the\\n         specified parameters. If you specify multiple values for a parameter, you get instance\\n         types that satisfy any of the specified values.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-fleet-attribute-based-instance-type-selection.html#ec2fleet-get-instance-types-from-instance-requirements\\\">Preview instance types with specified attributes</a>, <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-fleet-attribute-based-instance-type-selection.html\\\">Specify attributes for instance type selection for EC2 Fleet or Spot Fleet</a>, and <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-placement-score.html\\\">Spot\\n            placement score</a> in the <i>Amazon EC2 User Guide</i>, and <a href=\\\"https://docs.aws.amazon.com/autoscaling/ec2/userguide/create-asg-instance-type-requirements.html\\\">Creating\\n            mixed instance groups using attribute-based instance type selection</a> in the\\n            <i>Amazon EC2 Auto Scaling User Guide</i>.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"InstanceTypes\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#GetInstanceTypesFromInstanceRequirementsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"ArchitectureTypes\": {\n                    \"target\": \"com.amazonaws.ec2#ArchitectureTypeSet\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The processor architecture type.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"ArchitectureType\"\n                    }\n                },\n                \"VirtualizationTypes\": {\n                    \"target\": \"com.amazonaws.ec2#VirtualizationTypeSet\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The virtualization type.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"VirtualizationType\"\n                    }\n                },\n                \"InstanceRequirements\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceRequirementsRequest\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The attributes required for the instance types.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of items to return for this request.\\n         To get the next page of items, make another request with the token returned in the output.\\n\\t        For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Query-Requests.html#api-pagination\\\">Pagination</a>.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token returned from a previous paginated request. Pagination continues from the end of the items returned by the previous request.</p>\"\n                    }\n                },\n                \"Context\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Reserved.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetInstanceTypesFromInstanceRequirementsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceTypes\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceTypeInfoFromInstanceRequirementsSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceTypeSet\",\n                        \"smithy.api#documentation\": \"<p>The instance types with the specified instance attributes.</p>\",\n                        \"smithy.api#xmlName\": \"instanceTypeSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to include in another request to get the next page of items. This value is <code>null</code> when there\\n         are no more items to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetInstanceUefiData\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#GetInstanceUefiDataRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#GetInstanceUefiDataResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A binary representation of the UEFI variable store. Only non-volatile variables are\\n            stored. This is a base64 encoded and zlib compressed binary value that must be properly\\n            encoded.</p>\\n         <p>When you use <a href=\\\"https://docs.aws.amazon.com/cli/latest/reference/ec2/register-image.html\\\">register-image</a> to create\\n            an AMI, you can create an exact copy of your variable store by passing the UEFI data in\\n            the <code>UefiData</code> parameter. You can modify the UEFI data by using the <a href=\\\"https://github.com/awslabs/python-uefivars\\\">python-uefivars tool</a> on\\n            GitHub. You can use the tool to convert the UEFI data into a human-readable format\\n            (JSON), which you can inspect and modify, and then convert back into the binary format\\n            to use with register-image.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/uefi-secure-boot.html\\\">UEFI Secure Boot</a> in the\\n                <i>Amazon EC2 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#GetInstanceUefiDataRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the instance from which to retrieve the UEFI data.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"InstanceId\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the operation, without actually making the \\n  request, and provides an error response. If you have the required permissions, the error response is \\n  <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetInstanceUefiDataResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the instance from which to retrieve the UEFI data.</p>\",\n                        \"smithy.api#xmlName\": \"instanceId\"\n                    }\n                },\n                \"UefiData\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"UefiData\",\n                        \"smithy.api#documentation\": \"<p>Base64 representation of the non-volatile UEFI variable store.</p>\",\n                        \"smithy.api#xmlName\": \"uefiData\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetIpamAddressHistory\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#GetIpamAddressHistoryRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#GetIpamAddressHistoryResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Retrieve historical information about a CIDR within an IPAM scope. For more information, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/ipam/view-history-cidr-ipam.html\\\">View the history of IP addresses</a> in the <i>Amazon VPC IPAM User Guide</i>.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"HistoryRecords\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#GetIpamAddressHistoryRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A check for whether you have the required permissions for the action without actually making the request \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"Cidr\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The CIDR you want the history of. The CIDR can be an IPv4 or IPv6 IP address range. \\n         If you enter a /16 IPv4 CIDR, you will get records that match it exactly. You will not get records for any subnets within the /16 CIDR.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"IpamScopeId\": {\n                    \"target\": \"com.amazonaws.ec2#IpamScopeId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the IPAM scope that the CIDR is in.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"VpcId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the VPC you want your history records filtered by.</p>\"\n                    }\n                },\n                \"StartTime\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The start of the time period for which you are looking for history. If you omit this option, it will default to the value of EndTime.</p>\"\n                    }\n                },\n                \"EndTime\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The end of the time period for which you are looking for history. If you omit this option, it will default to the current time.</p>\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#IpamAddressHistoryMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of historical results you would like returned per page. Defaults to 100.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next page of results.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetIpamAddressHistoryResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"HistoryRecords\": {\n                    \"target\": \"com.amazonaws.ec2#IpamAddressHistoryRecordSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"HistoryRecordSet\",\n                        \"smithy.api#documentation\": \"<p>A historical record for a CIDR within an IPAM scope. If the CIDR is associated with an EC2 instance, you will see an object in the response for the instance and one for the network interface.</p>\",\n                        \"smithy.api#xmlName\": \"historyRecordSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetIpamDiscoveredAccounts\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#GetIpamDiscoveredAccountsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#GetIpamDiscoveredAccountsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Gets IPAM discovered accounts. A discovered account is an Amazon Web Services account that is monitored under a resource discovery. If you have integrated IPAM with Amazon Web Services Organizations, all accounts in the organization are discovered accounts. Only the IPAM account can get all discovered accounts in the organization.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"IpamDiscoveredAccounts\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#GetIpamDiscoveredAccountsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A check for whether you have the required permissions for the action without actually making the request \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"IpamResourceDiscoveryId\": {\n                    \"target\": \"com.amazonaws.ec2#IpamResourceDiscoveryId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>A resource discovery ID.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DiscoveryRegion\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services Region that the account information is returned from.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Discovered account filters.</p>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify the pagination token from a previous request to retrieve the next page of results.</p>\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#IpamMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of discovered accounts to return in one page of results.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetIpamDiscoveredAccountsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"IpamDiscoveredAccounts\": {\n                    \"target\": \"com.amazonaws.ec2#IpamDiscoveredAccountSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpamDiscoveredAccountSet\",\n                        \"smithy.api#documentation\": \"<p>Discovered accounts.</p>\",\n                        \"smithy.api#xmlName\": \"ipamDiscoveredAccountSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>Specify the pagination token from a previous request to retrieve the next page of results.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetIpamDiscoveredPublicAddresses\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#GetIpamDiscoveredPublicAddressesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#GetIpamDiscoveredPublicAddressesResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Gets the public IP addresses that have been discovered by IPAM.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#GetIpamDiscoveredPublicAddressesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A check for whether you have the required permissions for the action without actually making the request \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"IpamResourceDiscoveryId\": {\n                    \"target\": \"com.amazonaws.ec2#IpamResourceDiscoveryId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>An IPAM resource discovery ID.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"AddressRegion\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services Region for the IP address.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Filters.</p>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next page of results.</p>\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#IpamMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of IPAM discovered public addresses to return in one page of results.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetIpamDiscoveredPublicAddressesResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"IpamDiscoveredPublicAddresses\": {\n                    \"target\": \"com.amazonaws.ec2#IpamDiscoveredPublicAddressSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpamDiscoveredPublicAddressSet\",\n                        \"smithy.api#documentation\": \"<p>IPAM discovered public addresses.</p>\",\n                        \"smithy.api#xmlName\": \"ipamDiscoveredPublicAddressSet\"\n                    }\n                },\n                \"OldestSampleTime\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OldestSampleTime\",\n                        \"smithy.api#documentation\": \"<p>The oldest successful resource discovery time.</p>\",\n                        \"smithy.api#xmlName\": \"oldestSampleTime\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetIpamDiscoveredResourceCidrs\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#GetIpamDiscoveredResourceCidrsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#GetIpamDiscoveredResourceCidrsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns the resource CIDRs that are monitored as part of a resource discovery. A discovered resource is a resource CIDR monitored under a resource discovery. The following resources can be discovered: VPCs, Public IPv4 pools, VPC subnets, and Elastic IP addresses. </p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"IpamDiscoveredResourceCidrs\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#GetIpamDiscoveredResourceCidrsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A check for whether you have the required permissions for the action without actually making the request \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"IpamResourceDiscoveryId\": {\n                    \"target\": \"com.amazonaws.ec2#IpamResourceDiscoveryId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>A resource discovery ID.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ResourceRegion\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>A resource Region.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Filters.</p>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify the pagination token from a previous request to retrieve the next page of results.</p>\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#IpamMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of discovered resource CIDRs to return in one page of results.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetIpamDiscoveredResourceCidrsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"IpamDiscoveredResourceCidrs\": {\n                    \"target\": \"com.amazonaws.ec2#IpamDiscoveredResourceCidrSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpamDiscoveredResourceCidrSet\",\n                        \"smithy.api#documentation\": \"<p>Discovered resource CIDRs.</p>\",\n                        \"smithy.api#xmlName\": \"ipamDiscoveredResourceCidrSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>Specify the pagination token from a previous request to retrieve the next page of results.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetIpamPoolAllocations\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#GetIpamPoolAllocationsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#GetIpamPoolAllocationsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Get a list of all the CIDR allocations in an IPAM pool. The Region you use should be the IPAM pool locale. The locale is the Amazon Web Services Region where this IPAM pool is available for allocations.</p>\\n         <note>\\n            <p>If you use this action after <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_AllocateIpamPoolCidr.html\\\">AllocateIpamPoolCidr</a> or <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ReleaseIpamPoolAllocation.html\\\">ReleaseIpamPoolAllocation</a>, note that all EC2 API actions follow an <a href=\\\"https://docs.aws.amazon.com/ec2/latest/devguide/eventual-consistency.html\\\">eventual consistency</a> model.</p>\\n         </note>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"IpamPoolAllocations\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#GetIpamPoolAllocationsMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1000,\n                    \"max\": 100000\n                }\n            }\n        },\n        \"com.amazonaws.ec2#GetIpamPoolAllocationsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A check for whether you have the required permissions for the action without actually making the request \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"IpamPoolId\": {\n                    \"target\": \"com.amazonaws.ec2#IpamPoolId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the IPAM pool you want to see the allocations for.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"IpamPoolAllocationId\": {\n                    \"target\": \"com.amazonaws.ec2#IpamPoolAllocationId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the allocation.</p>\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more filters for the request. For more information about filtering, see <a href=\\\"https://docs.aws.amazon.com/cli/latest/userguide/cli-usage-filter.html\\\">Filtering CLI output</a>.</p>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#GetIpamPoolAllocationsMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results you would like returned per page.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next page of results.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetIpamPoolAllocationsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"IpamPoolAllocations\": {\n                    \"target\": \"com.amazonaws.ec2#IpamPoolAllocationSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpamPoolAllocationSet\",\n                        \"smithy.api#documentation\": \"<p>The IPAM pool allocations you want information on.</p>\",\n                        \"smithy.api#xmlName\": \"ipamPoolAllocationSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetIpamPoolCidrs\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#GetIpamPoolCidrsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#GetIpamPoolCidrsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Get the CIDRs provisioned to an IPAM pool.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"IpamPoolCidrs\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#GetIpamPoolCidrsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A check for whether you have the required permissions for the action without actually making the request \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"IpamPoolId\": {\n                    \"target\": \"com.amazonaws.ec2#IpamPoolId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the IPAM pool you want the CIDR for.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more filters for the request. For more information about filtering, see <a href=\\\"https://docs.aws.amazon.com/cli/latest/userguide/cli-usage-filter.html\\\">Filtering CLI output</a>.</p>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#IpamMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return in the request.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next page of results.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetIpamPoolCidrsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"IpamPoolCidrs\": {\n                    \"target\": \"com.amazonaws.ec2#IpamPoolCidrSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpamPoolCidrSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the CIDRs provisioned to an IPAM pool.</p>\",\n                        \"smithy.api#xmlName\": \"ipamPoolCidrSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetIpamResourceCidrs\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#GetIpamResourceCidrsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#GetIpamResourceCidrsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns resource CIDRs managed by IPAM in a given scope. If an IPAM is associated with more than one resource discovery, the resource CIDRs across all of the resource discoveries is returned. A resource discovery is an IPAM component that enables IPAM to manage and monitor resources that belong to the owning account.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"IpamResourceCidrs\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#GetIpamResourceCidrsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A check for whether you have the required permissions for the action without actually making the request \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more filters for the request. For more information about filtering, see <a href=\\\"https://docs.aws.amazon.com/cli/latest/userguide/cli-usage-filter.html\\\">Filtering CLI output</a>.</p>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#IpamMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return in the request.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next page of results.</p>\"\n                    }\n                },\n                \"IpamScopeId\": {\n                    \"target\": \"com.amazonaws.ec2#IpamScopeId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the scope that the resource is in.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"IpamPoolId\": {\n                    \"target\": \"com.amazonaws.ec2#IpamPoolId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the IPAM pool that the resource is in.</p>\"\n                    }\n                },\n                \"ResourceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the resource.</p>\"\n                    }\n                },\n                \"ResourceType\": {\n                    \"target\": \"com.amazonaws.ec2#IpamResourceType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The resource type.</p>\"\n                    }\n                },\n                \"ResourceTag\": {\n                    \"target\": \"com.amazonaws.ec2#RequestIpamResourceTag\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The resource tag.</p>\"\n                    }\n                },\n                \"ResourceOwner\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the Amazon Web Services account that owns the resource.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetIpamResourceCidrsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                },\n                \"IpamResourceCidrs\": {\n                    \"target\": \"com.amazonaws.ec2#IpamResourceCidrSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpamResourceCidrSet\",\n                        \"smithy.api#documentation\": \"<p>The resource CIDRs.</p>\",\n                        \"smithy.api#xmlName\": \"ipamResourceCidrSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetLaunchTemplateData\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#GetLaunchTemplateDataRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#GetLaunchTemplateDataResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Retrieves the configuration data of the specified instance. You can use this data to\\n            create a launch template. </p>\\n         <p>This action calls on other describe actions to get instance information. Depending on\\n            your instance configuration, you may need to allow the following actions in your IAM\\n            policy: <code>DescribeSpotInstanceRequests</code>,\\n                <code>DescribeInstanceCreditSpecifications</code>, <code>DescribeVolumes</code>, and\\n                <code>DescribeInstanceAttribute</code>.\\n            Or, you can allow <code>describe*</code> depending on your instance requirements.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To get the launch template data for an instance \",\n                        \"documentation\": \"This example gets the launch template data for the specified instance.\",\n                        \"input\": {\n                            \"InstanceId\": \"0123d646e8048babc\"\n                        },\n                        \"output\": {\n                            \"LaunchTemplateData\": {\n                                \"NetworkInterfaces\": [\n                                    {\n                                        \"DeviceIndex\": 0,\n                                        \"Groups\": [\n                                            \"sg-d14e1bb4\"\n                                        ],\n                                        \"Ipv6Addresses\": [],\n                                        \"AssociatePublicIpAddress\": false,\n                                        \"NetworkInterfaceId\": \"eni-4338b5a9\",\n                                        \"DeleteOnTermination\": true,\n                                        \"Description\": \"\",\n                                        \"PrivateIpAddress\": \"10.0.3.233\",\n                                        \"SubnetId\": \"subnet-5264e837\",\n                                        \"PrivateIpAddresses\": [\n                                            {\n                                                \"PrivateIpAddress\": \"10.0.3.233\",\n                                                \"Primary\": true\n                                            }\n                                        ]\n                                    }\n                                ],\n                                \"Placement\": {\n                                    \"GroupName\": \"\",\n                                    \"Tenancy\": \"default\",\n                                    \"AvailabilityZone\": \"us-east-2b\"\n                                },\n                                \"InstanceType\": \"t2.medium\",\n                                \"EbsOptimized\": false,\n                                \"BlockDeviceMappings\": [\n                                    {\n                                        \"Ebs\": {\n                                            \"VolumeType\": \"gp2\",\n                                            \"Encrypted\": false,\n                                            \"Iops\": 100,\n                                            \"VolumeSize\": 8,\n                                            \"SnapshotId\": \"snap-02594938353ef77d3\",\n                                            \"DeleteOnTermination\": true\n                                        },\n                                        \"DeviceName\": \"/dev/xvda\"\n                                    }\n                                ],\n                                \"KeyName\": \"my-key-pair\",\n                                \"ImageId\": \"ami-32cf7b4a\",\n                                \"Monitoring\": {\n                                    \"Enabled\": false\n                                }\n                            }\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#GetLaunchTemplateDataRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually\\n            making the request, and provides an error response. If you have the required\\n            permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is\\n                <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"InstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the instance.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetLaunchTemplateDataResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LaunchTemplateData\": {\n                    \"target\": \"com.amazonaws.ec2#ResponseLaunchTemplateData\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LaunchTemplateData\",\n                        \"smithy.api#documentation\": \"<p>The instance data.</p>\",\n                        \"smithy.api#xmlName\": \"launchTemplateData\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetManagedPrefixListAssociations\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#GetManagedPrefixListAssociationsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#GetManagedPrefixListAssociationsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Gets information about the resources that are associated with the specified managed prefix list.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"PrefixListAssociations\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#GetManagedPrefixListAssociationsMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 5,\n                    \"max\": 255\n                }\n            }\n        },\n        \"com.amazonaws.ec2#GetManagedPrefixListAssociationsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"PrefixListId\": {\n                    \"target\": \"com.amazonaws.ec2#PrefixListResourceId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the prefix list.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#GetManagedPrefixListAssociationsMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return with a single call.\\n\\tTo retrieve the remaining results, make another call with the returned <code>nextToken</code> value.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next page of results.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetManagedPrefixListAssociationsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PrefixListAssociations\": {\n                    \"target\": \"com.amazonaws.ec2#PrefixListAssociationSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PrefixListAssociationSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the associations.</p>\",\n                        \"smithy.api#xmlName\": \"prefixListAssociationSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetManagedPrefixListEntries\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#GetManagedPrefixListEntriesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#GetManagedPrefixListEntriesResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Gets information about the entries for a specified managed prefix list.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"Entries\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#GetManagedPrefixListEntriesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"PrefixListId\": {\n                    \"target\": \"com.amazonaws.ec2#PrefixListResourceId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the prefix list.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TargetVersion\": {\n                    \"target\": \"com.amazonaws.ec2#Long\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The version of the prefix list for which to return the entries. The default is the current version.</p>\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#PrefixListMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return with a single call.\\n\\tTo retrieve the remaining results, make another call with the returned <code>nextToken</code> value.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next page of results.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetManagedPrefixListEntriesResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Entries\": {\n                    \"target\": \"com.amazonaws.ec2#PrefixListEntrySet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EntrySet\",\n                        \"smithy.api#documentation\": \"<p>Information about the prefix list entries.</p>\",\n                        \"smithy.api#xmlName\": \"entrySet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetNetworkInsightsAccessScopeAnalysisFindings\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#GetNetworkInsightsAccessScopeAnalysisFindingsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#GetNetworkInsightsAccessScopeAnalysisFindingsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Gets the findings for the specified Network Access Scope analysis.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"AnalysisFindings\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#GetNetworkInsightsAccessScopeAnalysisFindingsMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.ec2#GetNetworkInsightsAccessScopeAnalysisFindingsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NetworkInsightsAccessScopeAnalysisId\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInsightsAccessScopeAnalysisId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the Network Access Scope analysis.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#GetNetworkInsightsAccessScopeAnalysisFindingsMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return with a single call.\\n   To retrieve the remaining results, make another call with the returned <code>nextToken</code> value.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next page of results.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetNetworkInsightsAccessScopeAnalysisFindingsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NetworkInsightsAccessScopeAnalysisId\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInsightsAccessScopeAnalysisId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkInsightsAccessScopeAnalysisId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Network Access Scope analysis.</p>\",\n                        \"smithy.api#xmlName\": \"networkInsightsAccessScopeAnalysisId\"\n                    }\n                },\n                \"AnalysisStatus\": {\n                    \"target\": \"com.amazonaws.ec2#AnalysisStatus\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AnalysisStatus\",\n                        \"smithy.api#documentation\": \"<p>The status of Network Access Scope Analysis.</p>\",\n                        \"smithy.api#xmlName\": \"analysisStatus\"\n                    }\n                },\n                \"AnalysisFindings\": {\n                    \"target\": \"com.amazonaws.ec2#AccessScopeAnalysisFindingList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AnalysisFindingSet\",\n                        \"smithy.api#documentation\": \"<p>The findings associated with Network Access Scope Analysis.</p>\",\n                        \"smithy.api#xmlName\": \"analysisFindingSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetNetworkInsightsAccessScopeContent\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#GetNetworkInsightsAccessScopeContentRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#GetNetworkInsightsAccessScopeContentResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Gets the content for the specified Network Access Scope.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#GetNetworkInsightsAccessScopeContentRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NetworkInsightsAccessScopeId\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInsightsAccessScopeId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the Network Access Scope.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetNetworkInsightsAccessScopeContentResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NetworkInsightsAccessScopeContent\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInsightsAccessScopeContent\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkInsightsAccessScopeContent\",\n                        \"smithy.api#documentation\": \"<p>The Network Access Scope content.</p>\",\n                        \"smithy.api#xmlName\": \"networkInsightsAccessScopeContent\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetPasswordData\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#GetPasswordDataRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#GetPasswordDataResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Retrieves the encrypted administrator password for a running Windows instance.</p>\\n         <p>The Windows password is generated at boot by the <code>EC2Config</code> service or\\n                <code>EC2Launch</code> scripts (Windows Server 2016 and later). This usually only\\n            happens the first time an instance is launched. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/UsingConfig_WinAMI.html\\\">EC2Config</a> and <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2launch.html\\\">EC2Launch</a> in the\\n                <i>Amazon EC2 User Guide</i>.</p>\\n         <p>For the <code>EC2Config</code> service, the password is not generated for rebundled\\n            AMIs unless <code>Ec2SetPassword</code> is enabled before bundling.</p>\\n         <p>The password is encrypted using the key pair that you specified when you launched the\\n            instance. You must provide the corresponding key pair file.</p>\\n         <p>When you launch an instance, password generation and encryption may take a few\\n            minutes. If you try to retrieve the password before it's available, the output returns\\n            an empty string. We recommend that you wait up to 15 minutes after launching an instance\\n            before trying to retrieve the generated password.</p>\",\n                \"smithy.waiters#waitable\": {\n                    \"PasswordDataAvailable\": {\n                        \"acceptors\": [\n                            {\n                                \"state\": \"success\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"length(PasswordData) > `0`\",\n                                        \"expected\": \"true\",\n                                        \"comparator\": \"booleanEquals\"\n                                    }\n                                }\n                            }\n                        ],\n                        \"minDelay\": 15\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#GetPasswordDataRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the Windows instance.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the operation, without actually making the \\n  request, and provides an error response. If you have the required permissions, the error response is \\n  <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetPasswordDataResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Windows instance.</p>\",\n                        \"smithy.api#xmlName\": \"instanceId\"\n                    }\n                },\n                \"Timestamp\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Timestamp\",\n                        \"smithy.api#documentation\": \"<p>The time the data was last updated.</p>\",\n                        \"smithy.api#xmlName\": \"timestamp\"\n                    }\n                },\n                \"PasswordData\": {\n                    \"target\": \"com.amazonaws.ec2#PasswordData\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PasswordData\",\n                        \"smithy.api#documentation\": \"<p>The password of the instance. Returns an empty string if the password is not\\n            available.</p>\",\n                        \"smithy.api#xmlName\": \"passwordData\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetReservedInstancesExchangeQuote\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#GetReservedInstancesExchangeQuoteRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#GetReservedInstancesExchangeQuoteResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns a quote and exchange information for exchanging one or more specified Convertible\\n      Reserved Instances for a new Convertible Reserved Instance. If the exchange cannot be\\n      performed, the reason is returned in the response. Use <a>AcceptReservedInstancesExchangeQuote</a> to perform the exchange.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#GetReservedInstancesExchangeQuoteRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making\\n      the request, and provides an error response. If you have the required permissions, the error\\n      response is <code>DryRunOperation</code>. Otherwise, it is\\n      <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"ReservedInstanceIds\": {\n                    \"target\": \"com.amazonaws.ec2#ReservedInstanceIdSet\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The IDs of the Convertible Reserved Instances to exchange.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"ReservedInstanceId\"\n                    }\n                },\n                \"TargetConfigurations\": {\n                    \"target\": \"com.amazonaws.ec2#TargetConfigurationRequestSet\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The configuration of the target Convertible Reserved Instance to exchange for your current\\n      Convertible Reserved Instances.</p>\",\n                        \"smithy.api#xmlName\": \"TargetConfiguration\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the parameters for GetReservedInstanceExchangeQuote.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetReservedInstancesExchangeQuoteResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CurrencyCode\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CurrencyCode\",\n                        \"smithy.api#documentation\": \"<p>The currency of the transaction.</p>\",\n                        \"smithy.api#xmlName\": \"currencyCode\"\n                    }\n                },\n                \"IsValidExchange\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IsValidExchange\",\n                        \"smithy.api#documentation\": \"<p>If <code>true</code>, the exchange is valid. If <code>false</code>, the exchange cannot be\\n      completed.</p>\",\n                        \"smithy.api#xmlName\": \"isValidExchange\"\n                    }\n                },\n                \"OutputReservedInstancesWillExpireAt\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OutputReservedInstancesWillExpireAt\",\n                        \"smithy.api#documentation\": \"<p>The new end date of the reservation term.</p>\",\n                        \"smithy.api#xmlName\": \"outputReservedInstancesWillExpireAt\"\n                    }\n                },\n                \"PaymentDue\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PaymentDue\",\n                        \"smithy.api#documentation\": \"<p>The total true upfront charge for the exchange.</p>\",\n                        \"smithy.api#xmlName\": \"paymentDue\"\n                    }\n                },\n                \"ReservedInstanceValueRollup\": {\n                    \"target\": \"com.amazonaws.ec2#ReservationValue\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ReservedInstanceValueRollup\",\n                        \"smithy.api#documentation\": \"<p>The cost associated with the Reserved Instance.</p>\",\n                        \"smithy.api#xmlName\": \"reservedInstanceValueRollup\"\n                    }\n                },\n                \"ReservedInstanceValueSet\": {\n                    \"target\": \"com.amazonaws.ec2#ReservedInstanceReservationValueSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ReservedInstanceValueSet\",\n                        \"smithy.api#documentation\": \"<p>The configuration of your Convertible Reserved Instances.</p>\",\n                        \"smithy.api#xmlName\": \"reservedInstanceValueSet\"\n                    }\n                },\n                \"TargetConfigurationValueRollup\": {\n                    \"target\": \"com.amazonaws.ec2#ReservationValue\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TargetConfigurationValueRollup\",\n                        \"smithy.api#documentation\": \"<p>The cost associated with the Reserved Instance.</p>\",\n                        \"smithy.api#xmlName\": \"targetConfigurationValueRollup\"\n                    }\n                },\n                \"TargetConfigurationValueSet\": {\n                    \"target\": \"com.amazonaws.ec2#TargetReservationValueSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TargetConfigurationValueSet\",\n                        \"smithy.api#documentation\": \"<p>The values of the target Convertible Reserved Instances.</p>\",\n                        \"smithy.api#xmlName\": \"targetConfigurationValueSet\"\n                    }\n                },\n                \"ValidationFailureReason\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ValidationFailureReason\",\n                        \"smithy.api#documentation\": \"<p>Describes the reason why the exchange cannot be completed.</p>\",\n                        \"smithy.api#xmlName\": \"validationFailureReason\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the output of GetReservedInstancesExchangeQuote.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetRouteServerAssociations\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#GetRouteServerAssociationsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#GetRouteServerAssociationsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Gets information about the associations for the specified route server.</p>\\n         <p>A route server association is the connection established between a route server and a VPC.</p>\\n         <p>For more information see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/userguide/dynamic-routing-route-server.html\\\">Dynamic routing in your VPC with VPC Route Server</a> in the <i>Amazon VPC User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#GetRouteServerAssociationsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RouteServerId\": {\n                    \"target\": \"com.amazonaws.ec2#RouteServerId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the route server for which to get association information.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A check for whether you have the required permissions for the action without actually making the request \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetRouteServerAssociationsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RouteServerAssociations\": {\n                    \"target\": \"com.amazonaws.ec2#RouteServerAssociationsList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RouteServerAssociationSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the associations for the specified route server.</p>\",\n                        \"smithy.api#xmlName\": \"routeServerAssociationSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetRouteServerPropagations\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#GetRouteServerPropagationsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#GetRouteServerPropagationsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Gets information about the route propagations for the specified route server.</p>\\n         <p>When enabled, route server propagation installs the routes in the FIB on the route table you've specified. Route server supports IPv4 and IPv6 route propagation.</p>\\n         <p>Amazon VPC Route Server simplifies routing for traffic between workloads that are deployed within a VPC and its internet gateways. With this feature, \\nVPC Route Server dynamically updates VPC and internet gateway route tables with your preferred IPv4 or IPv6 routes to achieve routing fault tolerance for those workloads. This enables you to automatically reroute traffic within a VPC, which increases the manageability of VPC routing and interoperability with third-party workloads.</p>\\n         <p>Route server supports the follow route table types:</p>\\n         <ul>\\n            <li>\\n               <p>VPC route tables not associated with subnets</p>\\n            </li>\\n            <li>\\n               <p>Subnet route tables</p>\\n            </li>\\n            <li>\\n               <p>Internet gateway route tables</p>\\n            </li>\\n         </ul>\\n         <p>Route server does not support route tables associated with virtual private gateways. To propagate routes into a transit gateway route table, use <a href=\\\"https://docs.aws.amazon.com/vpc/latest/tgw/tgw-connect.html\\\">Transit Gateway Connect</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#GetRouteServerPropagationsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RouteServerId\": {\n                    \"target\": \"com.amazonaws.ec2#RouteServerId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the route server for which to get propagation information.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"RouteTableId\": {\n                    \"target\": \"com.amazonaws.ec2#RouteTableId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the route table for which to get propagation information.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A check for whether you have the required permissions for the action without actually making the request \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetRouteServerPropagationsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RouteServerPropagations\": {\n                    \"target\": \"com.amazonaws.ec2#RouteServerPropagationsList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RouteServerPropagationSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the route propagations for the specified route server.</p>\",\n                        \"smithy.api#xmlName\": \"routeServerPropagationSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetRouteServerRoutingDatabase\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#GetRouteServerRoutingDatabaseRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#GetRouteServerRoutingDatabaseResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Gets the routing database for the specified route server. The <a href=\\\"https://en.wikipedia.org/wiki/Routing_table\\\">Routing Information Base (RIB)</a> serves as a database that stores all the routing information and network topology data collected by a router or routing system, such as routes learned from BGP peers. The RIB is constantly updated as new routing information is received or existing routes change. This ensures that the route server always has the most current view of the network topology and can make optimal routing decisions.</p>\\n         <p>Amazon VPC Route Server simplifies routing for traffic between workloads that are deployed within a VPC and its internet gateways. With this feature, \\nVPC Route Server dynamically updates VPC and internet gateway route tables with your preferred IPv4 or IPv6 routes to achieve routing fault tolerance for those workloads. This enables you to automatically reroute traffic within a VPC, which increases the manageability of VPC routing and interoperability with third-party workloads.</p>\\n         <p>Route server supports the follow route table types:</p>\\n         <ul>\\n            <li>\\n               <p>VPC route tables not associated with subnets</p>\\n            </li>\\n            <li>\\n               <p>Subnet route tables</p>\\n            </li>\\n            <li>\\n               <p>Internet gateway route tables</p>\\n            </li>\\n         </ul>\\n         <p>Route server does not support route tables associated with virtual private gateways. To propagate routes into a transit gateway route table, use <a href=\\\"https://docs.aws.amazon.com/vpc/latest/tgw/tgw-connect.html\\\">Transit Gateway Connect</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#GetRouteServerRoutingDatabaseRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RouteServerId\": {\n                    \"target\": \"com.amazonaws.ec2#RouteServerId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the route server for which to get the routing database.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next page of results.</p>\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#RouteServerMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of routing database entries to return in a single response.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A check for whether you have the required permissions for the action without actually making the request \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Filters to apply to the routing database query.</p>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetRouteServerRoutingDatabaseResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AreRoutesPersisted\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AreRoutesPersisted\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether routes are being persisted in the routing database.</p>\",\n                        \"smithy.api#xmlName\": \"areRoutesPersisted\"\n                    }\n                },\n                \"Routes\": {\n                    \"target\": \"com.amazonaws.ec2#RouteServerRouteList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RouteSet\",\n                        \"smithy.api#documentation\": \"<p>The collection of routes in the route server's routing database.</p>\",\n                        \"smithy.api#xmlName\": \"routeSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetSecurityGroupsForVpc\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#GetSecurityGroupsForVpcRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#GetSecurityGroupsForVpcResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Gets security groups that can be associated by the Amazon Web Services account making the request with network interfaces in the specified VPC.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"SecurityGroupForVpcs\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#GetSecurityGroupsForVpcRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VpcId\": {\n                    \"target\": \"com.amazonaws.ec2#VpcId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The VPC ID where the security group can be used.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token returned from a previous paginated request. Pagination continues from the end of the items returned by the previous request.</p>\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#GetSecurityGroupsForVpcRequestMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of items to return for this request.\\n\\tTo get the next page of items, make another request with the token returned in the output.\\n\\tFor more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Query-Requests.html#api-pagination\\\">Pagination</a>.</p>\"\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The filters. If using multiple filters, the results include security groups which match all filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>group-id</code>: The security group ID.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>description</code>: The security group's description.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>group-name</code>: The security group name.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>owner-id</code>: The security group owner ID.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>primary-vpc-id</code>: The VPC ID in which the security group was created.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetSecurityGroupsForVpcRequestMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 5,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.ec2#GetSecurityGroupsForVpcResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to include in another request to get the next page of items. This value is <code>null</code> when there are no more items to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                },\n                \"SecurityGroupForVpcs\": {\n                    \"target\": \"com.amazonaws.ec2#SecurityGroupForVpcList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SecurityGroupForVpcSet\",\n                        \"smithy.api#documentation\": \"<p>The security group that can be used by interfaces in the VPC.</p>\",\n                        \"smithy.api#xmlName\": \"securityGroupForVpcSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetSerialConsoleAccessStatus\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#GetSerialConsoleAccessStatusRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#GetSerialConsoleAccessStatusResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Retrieves the access status of your account to the EC2 serial console of all instances. By\\n\\t\\t\\tdefault, access to the EC2 serial console is disabled for your account. For more\\n\\t\\t\\tinformation, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/configure-access-to-serial-console.html#serial-console-account-access\\\">Manage account access to the EC2 serial console</a> in the <i>Amazon EC2\\n\\t\\t\\t\\tUser Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#GetSerialConsoleAccessStatusRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetSerialConsoleAccessStatusResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SerialConsoleAccessEnabled\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SerialConsoleAccessEnabled\",\n                        \"smithy.api#documentation\": \"<p>If <code>true</code>, access to the EC2 serial console of all instances is enabled for\\n\\t\\t\\tyour account. If <code>false</code>, access to the EC2 serial console of all instances\\n\\t\\t\\tis disabled for your account.</p>\",\n                        \"smithy.api#xmlName\": \"serialConsoleAccessEnabled\"\n                    }\n                },\n                \"ManagedBy\": {\n                    \"target\": \"com.amazonaws.ec2#ManagedBy\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ManagedBy\",\n                        \"smithy.api#documentation\": \"<p>The entity that manages access to the serial console. Possible values include:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>account</code> - Access is managed by the account.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>declarative-policy</code> - Access is managed by a declarative policy and can't\\n            be modified by the account.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"managedBy\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetSnapshotBlockPublicAccessState\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#GetSnapshotBlockPublicAccessStateRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#GetSnapshotBlockPublicAccessStateResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Gets the current state of <i>block public access for snapshots</i> setting \\n      for the account and Region.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/ebs/latest/userguide/block-public-access-snapshots.html\\\">\\n      Block public access for snapshots</a> in the <i>Amazon EBS User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#GetSnapshotBlockPublicAccessStateRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetSnapshotBlockPublicAccessStateResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#SnapshotBlockPublicAccessState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The current state of block public access for snapshots. Possible values include:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>block-all-sharing</code> - All public sharing of snapshots is blocked. Users in \\n          the account can't request new public sharing. Additionally, snapshots that were already \\n          publicly shared are treated as private and are not publicly available.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>block-new-sharing</code>  - Only new public sharing of snapshots is blocked. \\n          Users in the account can't request new public sharing. However, snapshots that were \\n          already publicly shared, remain publicly available.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>unblocked</code>  - Public sharing is not blocked. Users can publicly share \\n          snapshots.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                },\n                \"ManagedBy\": {\n                    \"target\": \"com.amazonaws.ec2#ManagedBy\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ManagedBy\",\n                        \"smithy.api#documentation\": \"<p>The entity that manages the state for block public access for snapshots. Possible\\n            values include:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>account</code> - The state is managed by the account.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>declarative-policy</code> - The state is managed by a declarative policy and\\n            can't be modified by the account.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"managedBy\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetSpotPlacementScores\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#GetSpotPlacementScoresRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#GetSpotPlacementScoresResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Calculates the Spot placement score for a Region or Availability Zone based on the\\n         specified target capacity and compute requirements.</p>\\n         <p>You can specify your compute requirements either by using\\n            <code>InstanceRequirementsWithMetadata</code> and letting Amazon EC2 choose the optimal\\n         instance types to fulfill your Spot request, or you can specify the instance types by using\\n            <code>InstanceTypes</code>.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-placement-score.html\\\">Spot placement score</a> in\\n         the <i>Amazon EC2 User Guide</i>.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"SpotPlacementScores\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#GetSpotPlacementScoresRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceTypes\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceTypes\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The instance types. We recommend that you specify at least three instance types. If you\\n         specify one or two instance types, or specify variations of a single instance type (for\\n         example, an <code>m3.xlarge</code> with and without instance storage), the returned\\n         placement score will always be low. </p>\\n         <p>If you specify <code>InstanceTypes</code>, you can't specify\\n            <code>InstanceRequirementsWithMetadata</code>.</p>\",\n                        \"smithy.api#xmlName\": \"InstanceType\"\n                    }\n                },\n                \"TargetCapacity\": {\n                    \"target\": \"com.amazonaws.ec2#SpotPlacementScoresTargetCapacity\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The target capacity.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TargetCapacityUnitType\": {\n                    \"target\": \"com.amazonaws.ec2#TargetCapacityUnitType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The unit for the target capacity.</p>\"\n                    }\n                },\n                \"SingleAvailabilityZone\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify <code>true</code> so that the response returns a list of scored Availability Zones.\\n         Otherwise, the response returns a list of scored Regions.</p>\\n         <p>A list of scored Availability Zones is useful if you want to launch all of your Spot\\n         capacity into a single Availability Zone.</p>\"\n                    }\n                },\n                \"RegionNames\": {\n                    \"target\": \"com.amazonaws.ec2#RegionNames\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Regions used to narrow down the list of Regions to be scored. Enter the Region code,\\n         for example, <code>us-east-1</code>.</p>\",\n                        \"smithy.api#xmlName\": \"RegionName\"\n                    }\n                },\n                \"InstanceRequirementsWithMetadata\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceRequirementsWithMetadataRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The attributes for the instance types. When you specify instance attributes, Amazon EC2 will\\n         identify instance types with those attributes.</p>\\n         <p>If you specify <code>InstanceRequirementsWithMetadata</code>, you can't specify\\n            <code>InstanceTypes</code>.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#SpotPlacementScoresMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of items to return for this request.\\n         To get the next page of items, make another request with the token returned in the output.\\n\\t        For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Query-Requests.html#api-pagination\\\">Pagination</a>.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token returned from a previous paginated request. Pagination continues from the end of the items returned by the previous request.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetSpotPlacementScoresResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SpotPlacementScores\": {\n                    \"target\": \"com.amazonaws.ec2#SpotPlacementScores\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SpotPlacementScoreSet\",\n                        \"smithy.api#documentation\": \"<p>The Spot placement score for the top 10 Regions or Availability Zones, scored on a scale\\n         from 1 to 10. Each score\\u2028 reflects how likely it is that each Region or Availability Zone\\n         will succeed at fulfilling the specified target capacity\\u2028 <i>at the time of the Spot\\n            placement score request</i>. A score of <code>10</code> means that your Spot\\n         capacity request is highly likely to succeed in that Region or Availability Zone. </p>\\n         <p>If you request a Spot placement score for Regions, a high score assumes that your fleet\\n         request will be configured to use all Availability Zones and the\\n            <code>capacity-optimized</code> allocation strategy. If you request a Spot placement\\n         score for Availability Zones, a high score assumes that your fleet request will be\\n         configured to use a single Availability Zone and the <code>capacity-optimized</code>\\n         allocation strategy.</p>\\n         <p>Different\\u2028 Regions or Availability Zones might return the same score.</p>\\n         <note>\\n            <p>The Spot placement score serves as a recommendation only. No score guarantees that your\\n            Spot request will be fully or partially fulfilled.</p>\\n         </note>\",\n                        \"smithy.api#xmlName\": \"spotPlacementScoreSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to include in another request to get the next page of items. This value is <code>null</code> when there\\n         are no more items to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetSubnetCidrReservations\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#GetSubnetCidrReservationsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#GetSubnetCidrReservationsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Gets information about the subnet CIDR reservations.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#GetSubnetCidrReservationsMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 5,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.ec2#GetSubnetCidrReservationsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>reservationType</code> - The type of reservation (<code>prefix</code> |\\n                    <code>explicit</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>subnet-id</code> - The ID of the subnet.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag</code>:<key> - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\\n    For example, to find all resources that have a tag with the key <code>Owner</code> and the value <code>TeamA</code>, specify <code>tag:Owner</code> for the filter name and <code>TeamA</code> for the filter value.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tag-key</code> - The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"SubnetId\": {\n                    \"target\": \"com.amazonaws.ec2#SubnetId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the subnet.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next page of results.</p>\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#GetSubnetCidrReservationsMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return with a single call.\\n\\tTo retrieve the remaining results, make another call with the returned <code>nextToken</code> value.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetSubnetCidrReservationsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SubnetIpv4CidrReservations\": {\n                    \"target\": \"com.amazonaws.ec2#SubnetCidrReservationList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SubnetIpv4CidrReservationSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the IPv4 subnet CIDR reservations.</p>\",\n                        \"smithy.api#xmlName\": \"subnetIpv4CidrReservationSet\"\n                    }\n                },\n                \"SubnetIpv6CidrReservations\": {\n                    \"target\": \"com.amazonaws.ec2#SubnetCidrReservationList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SubnetIpv6CidrReservationSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the IPv6 subnet CIDR reservations.</p>\",\n                        \"smithy.api#xmlName\": \"subnetIpv6CidrReservationSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetTransitGatewayAttachmentPropagations\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#GetTransitGatewayAttachmentPropagationsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#GetTransitGatewayAttachmentPropagationsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Lists the route tables to which the specified resource attachment propagates routes.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"TransitGatewayAttachmentPropagations\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#GetTransitGatewayAttachmentPropagationsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayAttachmentId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayAttachmentId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the attachment.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more filters. The possible values are:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>transit-gateway-route-table-id</code> - The ID of the transit gateway route table.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return with a single call.\\n\\tTo retrieve the remaining results, make another call with the returned <code>nextToken</code> value.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next page of results.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetTransitGatewayAttachmentPropagationsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayAttachmentPropagations\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayAttachmentPropagationList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayAttachmentPropagations\",\n                        \"smithy.api#documentation\": \"<p>Information about the propagation route tables.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayAttachmentPropagations\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetTransitGatewayMulticastDomainAssociations\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#GetTransitGatewayMulticastDomainAssociationsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#GetTransitGatewayMulticastDomainAssociationsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Gets information about the associations for the transit gateway multicast domain.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"MulticastDomainAssociations\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#GetTransitGatewayMulticastDomainAssociationsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayMulticastDomainId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayMulticastDomainId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the transit gateway multicast domain.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more filters. The possible values are:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>resource-id</code> - The ID of the resource.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>resource-type</code> - The type of resource. The valid value is: <code>vpc</code>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>state</code> - The state of the subnet association. Valid values are\\n                        <code>associated</code> | <code>associating</code> |\\n                        <code>disassociated</code> | <code>disassociating</code>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>subnet-id</code> - The ID of the subnet.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>transit-gateway-attachment-id</code> - The id of the transit gateway attachment.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return with a single call.\\n\\tTo retrieve the remaining results, make another call with the returned <code>nextToken</code> value.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next page of results.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetTransitGatewayMulticastDomainAssociationsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"MulticastDomainAssociations\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayMulticastDomainAssociationList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MulticastDomainAssociations\",\n                        \"smithy.api#documentation\": \"<p>Information about the multicast domain associations.</p>\",\n                        \"smithy.api#xmlName\": \"multicastDomainAssociations\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetTransitGatewayPolicyTableAssociations\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#GetTransitGatewayPolicyTableAssociationsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#GetTransitGatewayPolicyTableAssociationsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Gets a list of the transit gateway policy table associations.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"Associations\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#GetTransitGatewayPolicyTableAssociationsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayPolicyTableId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayPolicyTableId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the transit gateway policy table.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The filters associated with the transit gateway policy table.</p>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return with a single call.\\n\\tTo retrieve the remaining results, make another call with the returned <code>nextToken</code> value.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next page of results.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetTransitGatewayPolicyTableAssociationsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Associations\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayPolicyTableAssociationList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Associations\",\n                        \"smithy.api#documentation\": \"<p>Returns details about the transit gateway policy table association.</p>\",\n                        \"smithy.api#xmlName\": \"associations\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token for the next page of results.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetTransitGatewayPolicyTableEntries\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#GetTransitGatewayPolicyTableEntriesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#GetTransitGatewayPolicyTableEntriesResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns a list of transit gateway policy table entries.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#GetTransitGatewayPolicyTableEntriesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayPolicyTableId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayPolicyTableId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the transit gateway policy table.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The filters associated with the transit gateway policy table.</p>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return with a single call.\\n\\tTo retrieve the remaining results, make another call with the returned <code>nextToken</code> value.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next page of results.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetTransitGatewayPolicyTableEntriesResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayPolicyTableEntries\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayPolicyTableEntryList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayPolicyTableEntries\",\n                        \"smithy.api#documentation\": \"<p>The entries for the transit gateway policy table.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayPolicyTableEntries\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetTransitGatewayPrefixListReferences\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#GetTransitGatewayPrefixListReferencesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#GetTransitGatewayPrefixListReferencesResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Gets information about the prefix list references in a specified transit gateway route table.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"TransitGatewayPrefixListReferences\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#GetTransitGatewayPrefixListReferencesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayRouteTableId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayRouteTableId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the transit gateway route table.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more filters. The possible values are:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>attachment.resource-id</code> - The ID of the resource for the attachment.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>attachment.resource-type</code> - The type of resource for the\\n                    attachment. Valid values are <code>vpc</code> | <code>vpn</code> |\\n                        <code>direct-connect-gateway</code> | <code>peering</code>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>attachment.transit-gateway-attachment-id</code> - The ID of the attachment.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>is-blackhole</code> - Whether traffic matching the route is blocked (<code>true</code> | <code>false</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>prefix-list-id</code> - The ID of the prefix list.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>prefix-list-owner-id</code> - The ID of the owner of the prefix list.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>state</code> - The state of the prefix list reference (<code>pending</code> | <code>available</code> | <code>modifying</code> | <code>deleting</code>).</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return with a single call.\\n\\tTo retrieve the remaining results, make another call with the returned <code>nextToken</code> value.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next page of results.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetTransitGatewayPrefixListReferencesResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayPrefixListReferences\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayPrefixListReferenceSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayPrefixListReferenceSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the prefix list references.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayPrefixListReferenceSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetTransitGatewayRouteTableAssociations\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#GetTransitGatewayRouteTableAssociationsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#GetTransitGatewayRouteTableAssociationsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Gets information about the associations for the specified transit gateway route table.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"Associations\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#GetTransitGatewayRouteTableAssociationsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayRouteTableId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayRouteTableId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the transit gateway route table.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more filters. The possible values are:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>resource-id</code> - The ID of the resource.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>resource-type</code> - The resource type. Valid values are <code>vpc</code>\\n                    | <code>vpn</code> | <code>direct-connect-gateway</code> | <code>peering</code>\\n                    | <code>connect</code>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>transit-gateway-attachment-id</code> - The ID of the attachment.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return with a single call.\\n\\tTo retrieve the remaining results, make another call with the returned <code>nextToken</code> value.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next page of results.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetTransitGatewayRouteTableAssociationsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Associations\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayRouteTableAssociationList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Associations\",\n                        \"smithy.api#documentation\": \"<p>Information about the associations.</p>\",\n                        \"smithy.api#xmlName\": \"associations\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetTransitGatewayRouteTablePropagations\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#GetTransitGatewayRouteTablePropagationsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#GetTransitGatewayRouteTablePropagationsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Gets information about the route table propagations for the specified transit gateway route table.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"TransitGatewayRouteTablePropagations\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#GetTransitGatewayRouteTablePropagationsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayRouteTableId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayRouteTableId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the transit gateway route table.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more filters. The possible values are:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>resource-id</code> - The ID of the resource.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>resource-type</code> - The resource type. Valid values are <code>vpc</code>\\n                    | <code>vpn</code> | <code>direct-connect-gateway</code> | <code>peering</code>\\n                    | <code>connect</code>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>transit-gateway-attachment-id</code> - The ID of the attachment.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return with a single call.\\n\\tTo retrieve the remaining results, make another call with the returned <code>nextToken</code> value.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next page of results.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetTransitGatewayRouteTablePropagationsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayRouteTablePropagations\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayRouteTablePropagationList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayRouteTablePropagations\",\n                        \"smithy.api#documentation\": \"<p>Information about the route table propagations.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayRouteTablePropagations\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetVerifiedAccessEndpointPolicy\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#GetVerifiedAccessEndpointPolicyRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#GetVerifiedAccessEndpointPolicyResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Get the Verified Access policy associated with the endpoint.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#GetVerifiedAccessEndpointPolicyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VerifiedAccessEndpointId\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessEndpointId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the Verified Access endpoint.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetVerifiedAccessEndpointPolicyResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PolicyEnabled\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PolicyEnabled\",\n                        \"smithy.api#documentation\": \"<p>The status of the Verified Access policy.</p>\",\n                        \"smithy.api#xmlName\": \"policyEnabled\"\n                    }\n                },\n                \"PolicyDocument\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PolicyDocument\",\n                        \"smithy.api#documentation\": \"<p>The Verified Access policy document.</p>\",\n                        \"smithy.api#xmlName\": \"policyDocument\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetVerifiedAccessEndpointTargets\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#GetVerifiedAccessEndpointTargetsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#GetVerifiedAccessEndpointTargetsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Gets the targets for the specified network CIDR endpoint for Verified Access.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#GetVerifiedAccessEndpointTargetsMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 5,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.ec2#GetVerifiedAccessEndpointTargetsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VerifiedAccessEndpointId\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessEndpointId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the network CIDR endpoint.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"VerifiedAccessEndpointId\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#GetVerifiedAccessEndpointTargetsMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return with a single call.\\n\\tTo retrieve the remaining results, make another call with the returned <code>nextToken</code> value.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next page of results.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetVerifiedAccessEndpointTargetsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VerifiedAccessEndpointTargets\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessEndpointTargetList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VerifiedAccessEndpointTargetSet\",\n                        \"smithy.api#documentation\": \"<p>The Verified Access targets.</p>\",\n                        \"smithy.api#xmlName\": \"verifiedAccessEndpointTargetSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetVerifiedAccessGroupPolicy\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#GetVerifiedAccessGroupPolicyRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#GetVerifiedAccessGroupPolicyResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Shows the contents of the Verified Access policy associated with the group.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#GetVerifiedAccessGroupPolicyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VerifiedAccessGroupId\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessGroupId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the Verified Access group.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetVerifiedAccessGroupPolicyResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PolicyEnabled\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PolicyEnabled\",\n                        \"smithy.api#documentation\": \"<p>The status of the Verified Access policy.</p>\",\n                        \"smithy.api#xmlName\": \"policyEnabled\"\n                    }\n                },\n                \"PolicyDocument\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PolicyDocument\",\n                        \"smithy.api#documentation\": \"<p>The Verified Access policy document.</p>\",\n                        \"smithy.api#xmlName\": \"policyDocument\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetVpnConnectionDeviceSampleConfiguration\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#GetVpnConnectionDeviceSampleConfigurationRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#GetVpnConnectionDeviceSampleConfigurationResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Download an Amazon Web Services-provided sample configuration file to be used with the customer\\n            gateway device specified for your Site-to-Site VPN connection.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#GetVpnConnectionDeviceSampleConfigurationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VpnConnectionId\": {\n                    \"target\": \"com.amazonaws.ec2#VpnConnectionId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The <code>VpnConnectionId</code> specifies the Site-to-Site VPN connection used for the sample\\n            configuration.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"VpnConnectionDeviceTypeId\": {\n                    \"target\": \"com.amazonaws.ec2#VpnConnectionDeviceTypeId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>Device identifier provided by the <code>GetVpnConnectionDeviceTypes</code> API.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"InternetKeyExchangeVersion\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IKE version to be used in the sample configuration file for your customer gateway\\n            device. You can specify one of the following versions: <code>ikev1</code> or\\n                <code>ikev2</code>.</p>\"\n                    }\n                },\n                \"SampleType\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of sample configuration to generate. Valid values are \\\"compatibility\\\" (includes IKEv1) or \\\"recommended\\\" (throws UnsupportedOperationException for IKEv1).</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually\\n            making the request, and provides an error response. If you have the required\\n            permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is\\n                <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetVpnConnectionDeviceSampleConfigurationResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VpnConnectionDeviceSampleConfiguration\": {\n                    \"target\": \"com.amazonaws.ec2#VpnConnectionDeviceSampleConfiguration\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpnConnectionDeviceSampleConfiguration\",\n                        \"smithy.api#documentation\": \"<p>Sample configuration file for the specified customer gateway device.</p>\",\n                        \"smithy.api#xmlName\": \"vpnConnectionDeviceSampleConfiguration\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetVpnConnectionDeviceTypes\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#GetVpnConnectionDeviceTypesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#GetVpnConnectionDeviceTypesResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Obtain a list of customer gateway devices for which sample configuration\\n            files can be provided. The request has no additional parameters. You can also see the\\n            list of device types with sample configuration files available under <a href=\\\"https://docs.aws.amazon.com/vpn/latest/s2svpn/your-cgw.html\\\">Your customer gateway\\n                device</a> in the <i>Amazon Web Services Site-to-Site VPN User Guide</i>.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"VpnConnectionDeviceTypes\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#GetVpnConnectionDeviceTypesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#GVCDMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results returned by <code>GetVpnConnectionDeviceTypes</code> in\\n            paginated output. When this parameter is used, <code>GetVpnConnectionDeviceTypes</code>\\n            only returns <code>MaxResults</code> results in a single page along with a\\n                <code>NextToken</code> response element. The remaining results of the initial\\n            request can be seen by sending another <code>GetVpnConnectionDeviceTypes</code> request\\n            with the returned <code>NextToken</code> value. This value can be between 200 and 1000.\\n            If this parameter is not used, then <code>GetVpnConnectionDeviceTypes</code> returns all\\n            results.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>NextToken</code> value returned from a previous paginated\\n                <code>GetVpnConnectionDeviceTypes</code> request where <code>MaxResults</code> was\\n            used and the results exceeded the value of that parameter. Pagination continues from the\\n            end of the previous results that returned the <code>NextToken</code> value. This value\\n            is null when there are no more results to return. </p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually\\n            making the request, and provides an error response. If you have the required\\n            permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is\\n                <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetVpnConnectionDeviceTypesResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VpnConnectionDeviceTypes\": {\n                    \"target\": \"com.amazonaws.ec2#VpnConnectionDeviceTypeList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpnConnectionDeviceTypeSet\",\n                        \"smithy.api#documentation\": \"<p>List of customer gateway devices that have a sample configuration file available for\\n            use.</p>\",\n                        \"smithy.api#xmlName\": \"vpnConnectionDeviceTypeSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#NextToken\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The <code>NextToken</code> value to include in a future\\n                <code>GetVpnConnectionDeviceTypes</code> request. When the results of a\\n                <code>GetVpnConnectionDeviceTypes</code> request exceed <code>MaxResults</code>,\\n            this value can be used to retrieve the next page of results. This value is null when\\n            there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetVpnTunnelReplacementStatus\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#GetVpnTunnelReplacementStatusRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#GetVpnTunnelReplacementStatusResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Get details of available tunnel endpoint maintenance.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#GetVpnTunnelReplacementStatusRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VpnConnectionId\": {\n                    \"target\": \"com.amazonaws.ec2#VpnConnectionId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the Site-to-Site VPN connection. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"VpnTunnelOutsideIpAddress\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The external IP address of the VPN tunnel.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GetVpnTunnelReplacementStatusResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VpnConnectionId\": {\n                    \"target\": \"com.amazonaws.ec2#VpnConnectionId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpnConnectionId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Site-to-Site VPN connection. </p>\",\n                        \"smithy.api#xmlName\": \"vpnConnectionId\"\n                    }\n                },\n                \"TransitGatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the transit gateway associated with the VPN connection.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayId\"\n                    }\n                },\n                \"CustomerGatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#CustomerGatewayId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CustomerGatewayId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the customer gateway.</p>\",\n                        \"smithy.api#xmlName\": \"customerGatewayId\"\n                    }\n                },\n                \"VpnGatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#VpnGatewayId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpnGatewayId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the virtual private gateway.</p>\",\n                        \"smithy.api#xmlName\": \"vpnGatewayId\"\n                    }\n                },\n                \"VpnTunnelOutsideIpAddress\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpnTunnelOutsideIpAddress\",\n                        \"smithy.api#documentation\": \"<p>The external IP address of the VPN tunnel.</p>\",\n                        \"smithy.api#xmlName\": \"vpnTunnelOutsideIpAddress\"\n                    }\n                },\n                \"MaintenanceDetails\": {\n                    \"target\": \"com.amazonaws.ec2#MaintenanceDetails\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MaintenanceDetails\",\n                        \"smithy.api#documentation\": \"<p>Get details of pending tunnel endpoint maintenance.</p>\",\n                        \"smithy.api#xmlName\": \"maintenanceDetails\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#GpuDeviceCount\": {\n            \"type\": \"integer\"\n        },\n        \"com.amazonaws.ec2#GpuDeviceInfo\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Name\": {\n                    \"target\": \"com.amazonaws.ec2#GpuDeviceName\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Name\",\n                        \"smithy.api#documentation\": \"<p>The name of the GPU accelerator.</p>\",\n                        \"smithy.api#xmlName\": \"name\"\n                    }\n                },\n                \"Manufacturer\": {\n                    \"target\": \"com.amazonaws.ec2#GpuDeviceManufacturerName\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Manufacturer\",\n                        \"smithy.api#documentation\": \"<p>The manufacturer of the GPU accelerator.</p>\",\n                        \"smithy.api#xmlName\": \"manufacturer\"\n                    }\n                },\n                \"Count\": {\n                    \"target\": \"com.amazonaws.ec2#GpuDeviceCount\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Count\",\n                        \"smithy.api#documentation\": \"<p>The number of GPUs for the instance type.</p>\",\n                        \"smithy.api#xmlName\": \"count\"\n                    }\n                },\n                \"MemoryInfo\": {\n                    \"target\": \"com.amazonaws.ec2#GpuDeviceMemoryInfo\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MemoryInfo\",\n                        \"smithy.api#documentation\": \"<p>Describes the memory available to the GPU accelerator.</p>\",\n                        \"smithy.api#xmlName\": \"memoryInfo\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the GPU accelerators for the instance type.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#GpuDeviceInfoList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#GpuDeviceInfo\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#GpuDeviceManufacturerName\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#GpuDeviceMemoryInfo\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SizeInMiB\": {\n                    \"target\": \"com.amazonaws.ec2#GpuDeviceMemorySize\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SizeInMiB\",\n                        \"smithy.api#documentation\": \"<p>The size of the memory available to the GPU accelerator, in MiB.</p>\",\n                        \"smithy.api#xmlName\": \"sizeInMiB\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the memory available to the GPU accelerator.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#GpuDeviceMemorySize\": {\n            \"type\": \"integer\"\n        },\n        \"com.amazonaws.ec2#GpuDeviceName\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#GpuInfo\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Gpus\": {\n                    \"target\": \"com.amazonaws.ec2#GpuDeviceInfoList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Gpus\",\n                        \"smithy.api#documentation\": \"<p>Describes the GPU accelerators for the instance type.</p>\",\n                        \"smithy.api#xmlName\": \"gpus\"\n                    }\n                },\n                \"TotalGpuMemoryInMiB\": {\n                    \"target\": \"com.amazonaws.ec2#totalGpuMemory\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TotalGpuMemoryInMiB\",\n                        \"smithy.api#documentation\": \"<p>The total size of the memory for the GPU accelerators for the instance type, in MiB.</p>\",\n                        \"smithy.api#xmlName\": \"totalGpuMemoryInMiB\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the GPU accelerators for the instance type.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#GroupIdStringList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#SecurityGroupId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"groupId\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#GroupIdentifier\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"GroupId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"GroupId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the security group.</p>\",\n                        \"smithy.api#xmlName\": \"groupId\"\n                    }\n                },\n                \"GroupName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"GroupName\",\n                        \"smithy.api#documentation\": \"<p>The name of the security group.</p>\",\n                        \"smithy.api#xmlName\": \"groupName\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a security group.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#GroupIdentifierList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#GroupIdentifier\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#GroupIdentifierSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#SecurityGroupIdentifier\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#GroupIds\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#SecurityGroupId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#GroupNameStringList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#SecurityGroupName\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"GroupName\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#HibernationFlag\": {\n            \"type\": \"boolean\"\n        },\n        \"com.amazonaws.ec2#HibernationOptions\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Configured\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Configured\",\n                        \"smithy.api#documentation\": \"<p>If <code>true</code>, your instance is enabled for hibernation; otherwise, it is not\\n            enabled for hibernation.</p>\",\n                        \"smithy.api#xmlName\": \"configured\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Indicates whether your instance is configured for hibernation. This parameter is valid\\n            only if the instance meets the <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/hibernating-prerequisites.html\\\">hibernation\\n                prerequisites</a>. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Hibernate.html\\\">Hibernate your Amazon EC2\\n                instance</a> in the <i>Amazon EC2 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#HibernationOptionsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Configured\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Set to <code>true</code> to enable your instance for hibernation.</p>\\n         <p>For Spot Instances, if you set <code>Configured</code> to <code>true</code>, either\\n            omit the <code>InstanceInterruptionBehavior</code> parameter (for <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_SpotMarketOptions.html\\\">\\n               <code>SpotMarketOptions</code>\\n            </a>), or set it to\\n                <code>hibernate</code>. When <code>Configured</code> is true:</p>\\n         <ul>\\n            <li>\\n               <p>If you omit <code>InstanceInterruptionBehavior</code>, it defaults to\\n                        <code>hibernate</code>.</p>\\n            </li>\\n            <li>\\n               <p>If you set <code>InstanceInterruptionBehavior</code> to a value other than\\n                        <code>hibernate</code>, you'll get an error.</p>\\n            </li>\\n         </ul>\\n         <p>Default: <code>false</code>\\n         </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Indicates whether your instance is configured for hibernation. This parameter is valid\\n            only if the instance meets the <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/hibernating-prerequisites.html\\\">hibernation\\n                prerequisites</a>. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Hibernate.html\\\">Hibernate your Amazon EC2\\n                instance</a> in the <i>Amazon EC2 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#HistoryRecord\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"EventInformation\": {\n                    \"target\": \"com.amazonaws.ec2#EventInformation\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EventInformation\",\n                        \"smithy.api#documentation\": \"<p>Information about the event.</p>\",\n                        \"smithy.api#xmlName\": \"eventInformation\"\n                    }\n                },\n                \"EventType\": {\n                    \"target\": \"com.amazonaws.ec2#EventType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EventType\",\n                        \"smithy.api#documentation\": \"<p>The event type.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>error</code> - An error with the Spot Fleet request.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>fleetRequestChange</code> - A change in the status or configuration of\\n                    the Spot Fleet request.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>instanceChange</code> - An instance was launched or terminated.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>Information</code> - An informational event.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"eventType\"\n                    }\n                },\n                \"Timestamp\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Timestamp\",\n                        \"smithy.api#documentation\": \"<p>The date and time of the event, in UTC format (for example,\\n                <i>YYYY</i>-<i>MM</i>-<i>DD</i>T<i>HH</i>:<i>MM</i>:<i>SS</i>Z).</p>\",\n                        \"smithy.api#xmlName\": \"timestamp\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes an event in the history of the Spot Fleet request.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#HistoryRecordEntry\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"EventInformation\": {\n                    \"target\": \"com.amazonaws.ec2#EventInformation\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EventInformation\",\n                        \"smithy.api#documentation\": \"<p>Information about the event.</p>\",\n                        \"smithy.api#xmlName\": \"eventInformation\"\n                    }\n                },\n                \"EventType\": {\n                    \"target\": \"com.amazonaws.ec2#FleetEventType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EventType\",\n                        \"smithy.api#documentation\": \"<p>The event type.</p>\",\n                        \"smithy.api#xmlName\": \"eventType\"\n                    }\n                },\n                \"Timestamp\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Timestamp\",\n                        \"smithy.api#documentation\": \"<p>The date and time of the event, in UTC format (for example,\\n            <i>YYYY</i>-<i>MM</i>-<i>DD</i>T<i>HH</i>:<i>MM</i>:<i>SS</i>Z).</p>\",\n                        \"smithy.api#xmlName\": \"timestamp\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes an event in the history of an EC2 Fleet.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#HistoryRecordSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#HistoryRecordEntry\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#HistoryRecords\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#HistoryRecord\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#Host\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AutoPlacement\": {\n                    \"target\": \"com.amazonaws.ec2#AutoPlacement\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AutoPlacement\",\n                        \"smithy.api#documentation\": \"<p>Whether auto-placement is on or off.</p>\",\n                        \"smithy.api#xmlName\": \"autoPlacement\"\n                    }\n                },\n                \"AvailabilityZone\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AvailabilityZone\",\n                        \"smithy.api#documentation\": \"<p>The Availability Zone of the Dedicated Host.</p>\",\n                        \"smithy.api#xmlName\": \"availabilityZone\"\n                    }\n                },\n                \"AvailableCapacity\": {\n                    \"target\": \"com.amazonaws.ec2#AvailableCapacity\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AvailableCapacity\",\n                        \"smithy.api#documentation\": \"<p>Information about the instances running on the Dedicated Host.</p>\",\n                        \"smithy.api#xmlName\": \"availableCapacity\"\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ClientToken\",\n                        \"smithy.api#documentation\": \"<p>Unique, case-sensitive identifier that you provide to ensure the idempotency of the request. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Run_Instance_Idempotency.html\\\">Ensuring Idempotency</a>.</p>\",\n                        \"smithy.api#xmlName\": \"clientToken\"\n                    }\n                },\n                \"HostId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"HostId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Dedicated Host.</p>\",\n                        \"smithy.api#xmlName\": \"hostId\"\n                    }\n                },\n                \"HostProperties\": {\n                    \"target\": \"com.amazonaws.ec2#HostProperties\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"HostProperties\",\n                        \"smithy.api#documentation\": \"<p>The hardware specifications of the Dedicated Host.</p>\",\n                        \"smithy.api#xmlName\": \"hostProperties\"\n                    }\n                },\n                \"HostReservationId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"HostReservationId\",\n                        \"smithy.api#documentation\": \"<p>The reservation ID of the Dedicated Host. This returns a <code>null</code> response if\\n            the Dedicated Host doesn't have an associated reservation.</p>\",\n                        \"smithy.api#xmlName\": \"hostReservationId\"\n                    }\n                },\n                \"Instances\": {\n                    \"target\": \"com.amazonaws.ec2#HostInstanceList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Instances\",\n                        \"smithy.api#documentation\": \"<p>The IDs and instance type that are currently running on the Dedicated Host.</p>\",\n                        \"smithy.api#xmlName\": \"instances\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#AllocationState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The Dedicated Host's state.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                },\n                \"AllocationTime\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AllocationTime\",\n                        \"smithy.api#documentation\": \"<p>The time that the Dedicated Host was allocated.</p>\",\n                        \"smithy.api#xmlName\": \"allocationTime\"\n                    }\n                },\n                \"ReleaseTime\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ReleaseTime\",\n                        \"smithy.api#documentation\": \"<p>The time that the Dedicated Host was released.</p>\",\n                        \"smithy.api#xmlName\": \"releaseTime\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>Any tags assigned to the Dedicated Host.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                },\n                \"HostRecovery\": {\n                    \"target\": \"com.amazonaws.ec2#HostRecovery\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"HostRecovery\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether host recovery is enabled or disabled for the Dedicated Host.</p>\",\n                        \"smithy.api#xmlName\": \"hostRecovery\"\n                    }\n                },\n                \"AllowsMultipleInstanceTypes\": {\n                    \"target\": \"com.amazonaws.ec2#AllowsMultipleInstanceTypes\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AllowsMultipleInstanceTypes\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether the Dedicated Host supports multiple instance types of the same\\n            instance family. If the value is <code>on</code>, the Dedicated Host supports multiple\\n            instance types in the instance family. If the value is <code>off</code>, the Dedicated\\n            Host supports a single instance type only.</p>\",\n                        \"smithy.api#xmlName\": \"allowsMultipleInstanceTypes\"\n                    }\n                },\n                \"OwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OwnerId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Amazon Web Services account that owns the Dedicated Host.</p>\",\n                        \"smithy.api#xmlName\": \"ownerId\"\n                    }\n                },\n                \"AvailabilityZoneId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AvailabilityZoneId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Availability Zone in which the Dedicated Host is allocated.</p>\",\n                        \"smithy.api#xmlName\": \"availabilityZoneId\"\n                    }\n                },\n                \"MemberOfServiceLinkedResourceGroup\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MemberOfServiceLinkedResourceGroup\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether the Dedicated Host is in a host resource group. If <b>memberOfServiceLinkedResourceGroup</b> is <code>true</code>, the\\n            host is in a host resource group; otherwise, it is not.</p>\",\n                        \"smithy.api#xmlName\": \"memberOfServiceLinkedResourceGroup\"\n                    }\n                },\n                \"OutpostArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OutpostArn\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the Amazon Web Services Outpost on which the\\n            Dedicated Host is allocated.</p>\",\n                        \"smithy.api#xmlName\": \"outpostArn\"\n                    }\n                },\n                \"HostMaintenance\": {\n                    \"target\": \"com.amazonaws.ec2#HostMaintenance\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"HostMaintenance\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether host maintenance is enabled or disabled for the Dedicated\\n            Host.</p>\",\n                        \"smithy.api#xmlName\": \"hostMaintenance\"\n                    }\n                },\n                \"AssetId\": {\n                    \"target\": \"com.amazonaws.ec2#AssetId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AssetId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Outpost hardware asset on which the Dedicated Host is allocated.</p>\",\n                        \"smithy.api#xmlName\": \"assetId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the properties of the Dedicated Host.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#HostInstance\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of instance that is running on the Dedicated Host.</p>\",\n                        \"smithy.api#xmlName\": \"instanceId\"\n                    }\n                },\n                \"InstanceType\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceType\",\n                        \"smithy.api#documentation\": \"<p>The instance type (for example, <code>m3.medium</code>) of the running\\n            instance.</p>\",\n                        \"smithy.api#xmlName\": \"instanceType\"\n                    }\n                },\n                \"OwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OwnerId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Amazon Web Services account that owns the instance.</p>\",\n                        \"smithy.api#xmlName\": \"ownerId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes an instance running on a Dedicated Host.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#HostInstanceList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#HostInstance\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#HostList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#Host\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#HostMaintenance\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"on\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"on\"\n                    }\n                },\n                \"off\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"off\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#HostOffering\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CurrencyCode\": {\n                    \"target\": \"com.amazonaws.ec2#CurrencyCodeValues\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CurrencyCode\",\n                        \"smithy.api#documentation\": \"<p>The currency of the offering.</p>\",\n                        \"smithy.api#xmlName\": \"currencyCode\"\n                    }\n                },\n                \"Duration\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Duration\",\n                        \"smithy.api#documentation\": \"<p>The duration of the offering (in seconds).</p>\",\n                        \"smithy.api#xmlName\": \"duration\"\n                    }\n                },\n                \"HourlyPrice\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"HourlyPrice\",\n                        \"smithy.api#documentation\": \"<p>The hourly price of the offering.</p>\",\n                        \"smithy.api#xmlName\": \"hourlyPrice\"\n                    }\n                },\n                \"InstanceFamily\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceFamily\",\n                        \"smithy.api#documentation\": \"<p>The instance family of the offering.</p>\",\n                        \"smithy.api#xmlName\": \"instanceFamily\"\n                    }\n                },\n                \"OfferingId\": {\n                    \"target\": \"com.amazonaws.ec2#OfferingId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OfferingId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the offering.</p>\",\n                        \"smithy.api#xmlName\": \"offeringId\"\n                    }\n                },\n                \"PaymentOption\": {\n                    \"target\": \"com.amazonaws.ec2#PaymentOption\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PaymentOption\",\n                        \"smithy.api#documentation\": \"<p>The available payment option.</p>\",\n                        \"smithy.api#xmlName\": \"paymentOption\"\n                    }\n                },\n                \"UpfrontPrice\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"UpfrontPrice\",\n                        \"smithy.api#documentation\": \"<p>The upfront price of the offering. Does not apply to No Upfront offerings.</p>\",\n                        \"smithy.api#xmlName\": \"upfrontPrice\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Details about the Dedicated Host Reservation offering.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#HostOfferingSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#HostOffering\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#HostProperties\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Cores\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Cores\",\n                        \"smithy.api#documentation\": \"<p>The number of cores on the Dedicated Host.</p>\",\n                        \"smithy.api#xmlName\": \"cores\"\n                    }\n                },\n                \"InstanceType\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceType\",\n                        \"smithy.api#documentation\": \"<p>The instance type supported by the Dedicated Host. For example, <code>m5.large</code>.\\n            If the host supports multiple instance types, no <b>instanceType</b> is returned.</p>\",\n                        \"smithy.api#xmlName\": \"instanceType\"\n                    }\n                },\n                \"InstanceFamily\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceFamily\",\n                        \"smithy.api#documentation\": \"<p>The instance family supported by the Dedicated Host. For example,\\n            <code>m5</code>.</p>\",\n                        \"smithy.api#xmlName\": \"instanceFamily\"\n                    }\n                },\n                \"Sockets\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Sockets\",\n                        \"smithy.api#documentation\": \"<p>The number of sockets on the Dedicated Host.</p>\",\n                        \"smithy.api#xmlName\": \"sockets\"\n                    }\n                },\n                \"TotalVCpus\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TotalVCpus\",\n                        \"smithy.api#documentation\": \"<p>The total number of vCPUs on the Dedicated Host.</p>\",\n                        \"smithy.api#xmlName\": \"totalVCpus\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the properties of a Dedicated Host.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#HostRecovery\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"on\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"on\"\n                    }\n                },\n                \"off\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"off\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#HostReservation\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Count\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Count\",\n                        \"smithy.api#documentation\": \"<p>The number of Dedicated Hosts the reservation is associated with.</p>\",\n                        \"smithy.api#xmlName\": \"count\"\n                    }\n                },\n                \"CurrencyCode\": {\n                    \"target\": \"com.amazonaws.ec2#CurrencyCodeValues\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CurrencyCode\",\n                        \"smithy.api#documentation\": \"<p>The currency in which the <code>upfrontPrice</code> and <code>hourlyPrice</code>\\n            amounts are specified. At this time, the only supported currency is\\n            <code>USD</code>.</p>\",\n                        \"smithy.api#xmlName\": \"currencyCode\"\n                    }\n                },\n                \"Duration\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Duration\",\n                        \"smithy.api#documentation\": \"<p>The length of the reservation's term, specified in seconds. Can be <code>31536000 (1\\n                year)</code> | <code>94608000 (3 years)</code>.</p>\",\n                        \"smithy.api#xmlName\": \"duration\"\n                    }\n                },\n                \"End\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"End\",\n                        \"smithy.api#documentation\": \"<p>The date and time that the reservation ends.</p>\",\n                        \"smithy.api#xmlName\": \"end\"\n                    }\n                },\n                \"HostIdSet\": {\n                    \"target\": \"com.amazonaws.ec2#ResponseHostIdSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"HostIdSet\",\n                        \"smithy.api#documentation\": \"<p>The IDs of the Dedicated Hosts associated with the reservation.</p>\",\n                        \"smithy.api#xmlName\": \"hostIdSet\"\n                    }\n                },\n                \"HostReservationId\": {\n                    \"target\": \"com.amazonaws.ec2#HostReservationId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"HostReservationId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the reservation that specifies the associated Dedicated Hosts.</p>\",\n                        \"smithy.api#xmlName\": \"hostReservationId\"\n                    }\n                },\n                \"HourlyPrice\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"HourlyPrice\",\n                        \"smithy.api#documentation\": \"<p>The hourly price of the reservation.</p>\",\n                        \"smithy.api#xmlName\": \"hourlyPrice\"\n                    }\n                },\n                \"InstanceFamily\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceFamily\",\n                        \"smithy.api#documentation\": \"<p>The instance family of the Dedicated Host Reservation. The instance family on the\\n            Dedicated Host must be the same in order for it to benefit from the reservation.</p>\",\n                        \"smithy.api#xmlName\": \"instanceFamily\"\n                    }\n                },\n                \"OfferingId\": {\n                    \"target\": \"com.amazonaws.ec2#OfferingId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OfferingId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the reservation. This remains the same regardless of which Dedicated Hosts\\n            are associated with it.</p>\",\n                        \"smithy.api#xmlName\": \"offeringId\"\n                    }\n                },\n                \"PaymentOption\": {\n                    \"target\": \"com.amazonaws.ec2#PaymentOption\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PaymentOption\",\n                        \"smithy.api#documentation\": \"<p>The payment option selected for this reservation.</p>\",\n                        \"smithy.api#xmlName\": \"paymentOption\"\n                    }\n                },\n                \"Start\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Start\",\n                        \"smithy.api#documentation\": \"<p>The date and time that the reservation started.</p>\",\n                        \"smithy.api#xmlName\": \"start\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#ReservationState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The state of the reservation.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                },\n                \"UpfrontPrice\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"UpfrontPrice\",\n                        \"smithy.api#documentation\": \"<p>The upfront price of the reservation.</p>\",\n                        \"smithy.api#xmlName\": \"upfrontPrice\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>Any tags assigned to the Dedicated Host Reservation.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Details about the Dedicated Host Reservation and associated Dedicated Hosts.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#HostReservationId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#HostReservationIdSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#HostReservationId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#HostReservationSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#HostReservation\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#HostTenancy\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"default\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"default\"\n                    }\n                },\n                \"dedicated\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"dedicated\"\n                    }\n                },\n                \"host\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"host\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#HostnameType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ip_name\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ip-name\"\n                    }\n                },\n                \"resource_name\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"resource-name\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#Hour\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 0,\n                    \"max\": 23\n                }\n            }\n        },\n        \"com.amazonaws.ec2#HttpTokensState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"optional\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"optional\"\n                    }\n                },\n                \"required\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"required\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#HypervisorType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ovm\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ovm\"\n                    }\n                },\n                \"xen\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"xen\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#IKEVersionsList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#IKEVersionsListValue\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#IKEVersionsListValue\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Value\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Value\",\n                        \"smithy.api#documentation\": \"<p>The IKE version.</p>\",\n                        \"smithy.api#xmlName\": \"value\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The internet key exchange (IKE) version permitted for the VPN tunnel.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#IKEVersionsRequestList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#IKEVersionsRequestListValue\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#IKEVersionsRequestListValue\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Value\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IKE version.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The IKE version that is permitted for the VPN tunnel.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#IamInstanceProfile\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Arn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Arn\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the instance profile.</p>\",\n                        \"smithy.api#xmlName\": \"arn\"\n                    }\n                },\n                \"Id\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Id\",\n                        \"smithy.api#documentation\": \"<p>The ID of the instance profile.</p>\",\n                        \"smithy.api#xmlName\": \"id\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes an IAM instance profile.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#IamInstanceProfileAssociation\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AssociationId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AssociationId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the association.</p>\",\n                        \"smithy.api#xmlName\": \"associationId\"\n                    }\n                },\n                \"InstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the instance.</p>\",\n                        \"smithy.api#xmlName\": \"instanceId\"\n                    }\n                },\n                \"IamInstanceProfile\": {\n                    \"target\": \"com.amazonaws.ec2#IamInstanceProfile\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IamInstanceProfile\",\n                        \"smithy.api#documentation\": \"<p>The IAM instance profile.</p>\",\n                        \"smithy.api#xmlName\": \"iamInstanceProfile\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#IamInstanceProfileAssociationState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The state of the association.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                },\n                \"Timestamp\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Timestamp\",\n                        \"smithy.api#documentation\": \"<p>The time the IAM instance profile was associated with the instance.</p>\",\n                        \"smithy.api#xmlName\": \"timestamp\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes an association between an IAM instance profile and an instance.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#IamInstanceProfileAssociationId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#IamInstanceProfileAssociationSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#IamInstanceProfileAssociation\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#IamInstanceProfileAssociationState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ASSOCIATING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"associating\"\n                    }\n                },\n                \"ASSOCIATED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"associated\"\n                    }\n                },\n                \"DISASSOCIATING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"disassociating\"\n                    }\n                },\n                \"DISASSOCIATED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"disassociated\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#IamInstanceProfileSpecification\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Arn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Arn\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the instance profile.</p>\",\n                        \"smithy.api#xmlName\": \"arn\"\n                    }\n                },\n                \"Name\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Name\",\n                        \"smithy.api#documentation\": \"<p>The name of the instance profile.</p>\",\n                        \"smithy.api#xmlName\": \"name\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes an IAM instance profile.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#IcmpTypeCode\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Code\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Code\",\n                        \"smithy.api#documentation\": \"<p>The ICMP code. A value of -1 means all codes for the specified ICMP type.</p>\",\n                        \"smithy.api#xmlName\": \"code\"\n                    }\n                },\n                \"Type\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Type\",\n                        \"smithy.api#documentation\": \"<p>The ICMP type. A value of -1 means all types.</p>\",\n                        \"smithy.api#xmlName\": \"type\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the ICMP type and code.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#IdFormat\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Deadline\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Deadline\",\n                        \"smithy.api#documentation\": \"<p>The date in UTC at which you are permanently switched over to using longer IDs. If a deadline is not yet available for this resource type, this field is not returned.</p>\",\n                        \"smithy.api#xmlName\": \"deadline\"\n                    }\n                },\n                \"Resource\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Resource\",\n                        \"smithy.api#documentation\": \"<p>The type of resource.</p>\",\n                        \"smithy.api#xmlName\": \"resource\"\n                    }\n                },\n                \"UseLongIds\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"UseLongIds\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether longer IDs (17-character IDs) are enabled for the resource.</p>\",\n                        \"smithy.api#xmlName\": \"useLongIds\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the ID format for a resource.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#IdFormatList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#IdFormat\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#Igmpv2SupportValue\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"enable\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"enable\"\n                    }\n                },\n                \"disable\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"disable\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#Image\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PlatformDetails\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PlatformDetails\",\n                        \"smithy.api#documentation\": \"<p>The platform details associated with the billing code of the AMI. For more information,\\n      see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ami-billing-info.html\\\">Understand\\n        AMI billing information</a> in the <i>Amazon EC2 User Guide</i>.</p>\",\n                        \"smithy.api#xmlName\": \"platformDetails\"\n                    }\n                },\n                \"UsageOperation\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"UsageOperation\",\n                        \"smithy.api#documentation\": \"<p>The operation of the Amazon EC2 instance and the billing code that is associated with the AMI.\\n        <code>usageOperation</code> corresponds to the <a href=\\\"https://docs.aws.amazon.com/cur/latest/userguide/Lineitem-columns.html#Lineitem-details-O-Operation\\\">lineitem/Operation</a> column on your Amazon Web Services Cost and Usage Report and in the <a href=\\\"https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/price-changes.html\\\">Amazon Web Services Price\\n        List API</a>. You can view these fields on the <b>Instances</b> or <b>AMIs</b> pages in the Amazon EC2 console,\\n      or in the responses that are returned by the <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeImages.html\\\">DescribeImages</a> command in\\n      the Amazon EC2 API, or the <a href=\\\"https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-images.html\\\">describe-images</a> command in the\\n      CLI.</p>\",\n                        \"smithy.api#xmlName\": \"usageOperation\"\n                    }\n                },\n                \"BlockDeviceMappings\": {\n                    \"target\": \"com.amazonaws.ec2#BlockDeviceMappingList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"BlockDeviceMapping\",\n                        \"smithy.api#documentation\": \"<p>Any block device mapping entries.</p>\",\n                        \"smithy.api#xmlName\": \"blockDeviceMapping\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Description\",\n                        \"smithy.api#documentation\": \"<p>The description of the AMI that was provided during image creation.</p>\",\n                        \"smithy.api#xmlName\": \"description\"\n                    }\n                },\n                \"EnaSupport\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EnaSupport\",\n                        \"smithy.api#documentation\": \"<p>Specifies whether enhanced networking with ENA is enabled.</p>\",\n                        \"smithy.api#xmlName\": \"enaSupport\"\n                    }\n                },\n                \"Hypervisor\": {\n                    \"target\": \"com.amazonaws.ec2#HypervisorType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Hypervisor\",\n                        \"smithy.api#documentation\": \"<p>The hypervisor type of the image. Only <code>xen</code> is supported. <code>ovm</code> is\\n      not supported.</p>\",\n                        \"smithy.api#xmlName\": \"hypervisor\"\n                    }\n                },\n                \"ImageOwnerAlias\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ImageOwnerAlias\",\n                        \"smithy.api#documentation\": \"<p>The owner alias (<code>amazon</code> | <code>aws-backup-vault</code> |\\n        <code>aws-marketplace</code>).</p>\",\n                        \"smithy.api#xmlName\": \"imageOwnerAlias\"\n                    }\n                },\n                \"Name\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Name\",\n                        \"smithy.api#documentation\": \"<p>The name of the AMI that was provided during image creation.</p>\",\n                        \"smithy.api#xmlName\": \"name\"\n                    }\n                },\n                \"RootDeviceName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RootDeviceName\",\n                        \"smithy.api#documentation\": \"<p>The device name of the root device volume (for example, <code>/dev/sda1</code>).</p>\",\n                        \"smithy.api#xmlName\": \"rootDeviceName\"\n                    }\n                },\n                \"RootDeviceType\": {\n                    \"target\": \"com.amazonaws.ec2#DeviceType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RootDeviceType\",\n                        \"smithy.api#documentation\": \"<p>The type of root device used by the AMI. The AMI can use an Amazon EBS volume or an instance\\n      store volume.</p>\",\n                        \"smithy.api#xmlName\": \"rootDeviceType\"\n                    }\n                },\n                \"SriovNetSupport\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SriovNetSupport\",\n                        \"smithy.api#documentation\": \"<p>Specifies whether enhanced networking with the Intel 82599 Virtual Function interface is\\n      enabled.</p>\",\n                        \"smithy.api#xmlName\": \"sriovNetSupport\"\n                    }\n                },\n                \"StateReason\": {\n                    \"target\": \"com.amazonaws.ec2#StateReason\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"StateReason\",\n                        \"smithy.api#documentation\": \"<p>The reason for the state change.</p>\",\n                        \"smithy.api#xmlName\": \"stateReason\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>Any tags assigned to the image.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                },\n                \"VirtualizationType\": {\n                    \"target\": \"com.amazonaws.ec2#VirtualizationType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VirtualizationType\",\n                        \"smithy.api#documentation\": \"<p>The type of virtualization of the AMI.</p>\",\n                        \"smithy.api#xmlName\": \"virtualizationType\"\n                    }\n                },\n                \"BootMode\": {\n                    \"target\": \"com.amazonaws.ec2#BootModeValues\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"BootMode\",\n                        \"smithy.api#documentation\": \"<p>The boot mode of the image. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ami-boot.html\\\">Instance launch behavior with Amazon EC2\\n        boot modes</a> in the <i>Amazon EC2 User Guide</i>.</p>\",\n                        \"smithy.api#xmlName\": \"bootMode\"\n                    }\n                },\n                \"TpmSupport\": {\n                    \"target\": \"com.amazonaws.ec2#TpmSupportValues\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TpmSupport\",\n                        \"smithy.api#documentation\": \"<p>If the image is configured for NitroTPM support, the value is <code>v2.0</code>. For more\\n      information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/nitrotpm.html\\\">NitroTPM</a> in the <i>Amazon EC2 User Guide</i>.</p>\",\n                        \"smithy.api#xmlName\": \"tpmSupport\"\n                    }\n                },\n                \"DeprecationTime\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DeprecationTime\",\n                        \"smithy.api#documentation\": \"<p>The date and time to deprecate the AMI, in UTC, in the following format:\\n        <i>YYYY</i>-<i>MM</i>-<i>DD</i>T<i>HH</i>:<i>MM</i>:<i>SS</i>Z.\\n      If you specified a value for seconds, Amazon EC2 rounds the seconds to the nearest minute.</p>\",\n                        \"smithy.api#xmlName\": \"deprecationTime\"\n                    }\n                },\n                \"ImdsSupport\": {\n                    \"target\": \"com.amazonaws.ec2#ImdsSupportValues\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ImdsSupport\",\n                        \"smithy.api#documentation\": \"<p>If <code>v2.0</code>, it indicates that IMDSv2 is specified in the AMI. Instances launched\\n      from this AMI will have <code>HttpTokens</code> automatically set to <code>required</code> so\\n      that, by default, the instance requires that IMDSv2 is used when requesting instance metadata.\\n      In addition, <code>HttpPutResponseHopLimit</code> is set to <code>2</code>. For more\\n      information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/configuring-IMDS-new-instances.html#configure-IMDS-new-instances-ami-configuration\\\">Configure the AMI</a> in the <i>Amazon EC2 User Guide</i>.</p>\",\n                        \"smithy.api#xmlName\": \"imdsSupport\"\n                    }\n                },\n                \"SourceInstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SourceInstanceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the instance that the AMI was created from if the AMI was created using <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateImage.html\\\">CreateImage</a>. This field only appears if the AMI was created using\\n      CreateImage.</p>\",\n                        \"smithy.api#xmlName\": \"sourceInstanceId\"\n                    }\n                },\n                \"DeregistrationProtection\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DeregistrationProtection\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether deregistration protection is enabled for the AMI.</p>\",\n                        \"smithy.api#xmlName\": \"deregistrationProtection\"\n                    }\n                },\n                \"LastLaunchedTime\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LastLaunchedTime\",\n                        \"smithy.api#documentation\": \"<p>The date and time, in <a href=\\\"http://www.iso.org/iso/iso8601\\\">ISO 8601 date-time\\n        format</a>, when the AMI was last used to launch an EC2 instance. When the AMI is used\\n      to launch an instance, there is a 24-hour delay before that usage is reported.</p>\\n         <note>\\n            <p>\\n               <code>lastLaunchedTime</code> data is available starting April 2017.</p>\\n         </note>\",\n                        \"smithy.api#xmlName\": \"lastLaunchedTime\"\n                    }\n                },\n                \"ImageAllowed\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ImageAllowed\",\n                        \"smithy.api#documentation\": \"<p>If <code>true</code>, the AMI satisfies the criteria for Allowed AMIs and can be\\n      discovered and used in the account. If <code>false</code> and Allowed AMIs is set to\\n      <code>enabled</code>, the AMI can't be discovered or used in the account. If\\n      <code>false</code> and Allowed AMIs is set to <code>audit-mode</code>, the AMI can be\\n      discovered and used in the account.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-allowed-amis.html\\\">Control the discovery and use of AMIs in\\n      Amazon EC2 with Allowed AMIs</a> in\\n      <i>Amazon EC2 User Guide</i>.</p>\",\n                        \"smithy.api#xmlName\": \"imageAllowed\"\n                    }\n                },\n                \"SourceImageId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SourceImageId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the source AMI from which the AMI was created.</p>\",\n                        \"smithy.api#xmlName\": \"sourceImageId\"\n                    }\n                },\n                \"SourceImageRegion\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SourceImageRegion\",\n                        \"smithy.api#documentation\": \"<p>The Region of the source AMI.</p>\",\n                        \"smithy.api#xmlName\": \"sourceImageRegion\"\n                    }\n                },\n                \"FreeTierEligible\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"FreeTierEligible\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether the image is eligible for Amazon Web Services Free Tier.</p>\\n         <ul>\\n            <li>\\n               <p>If <code>true</code>, the AMI is eligible for Free Tier and can be used to launch\\n          instances under the Free Tier limits.</p>\\n            </li>\\n            <li>\\n               <p>If <code>false</code>, the AMI is not eligible for Free Tier.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"freeTierEligible\"\n                    }\n                },\n                \"ImageId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ImageId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the AMI.</p>\",\n                        \"smithy.api#xmlName\": \"imageId\"\n                    }\n                },\n                \"ImageLocation\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ImageLocation\",\n                        \"smithy.api#documentation\": \"<p>The location of the AMI.</p>\",\n                        \"smithy.api#xmlName\": \"imageLocation\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#ImageState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ImageState\",\n                        \"smithy.api#documentation\": \"<p>The current state of the AMI. If the state is <code>available</code>, the image is\\n      successfully registered and can be used to launch an instance.</p>\",\n                        \"smithy.api#xmlName\": \"imageState\"\n                    }\n                },\n                \"OwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ImageOwnerId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Amazon Web Services account that owns the image.</p>\",\n                        \"smithy.api#xmlName\": \"imageOwnerId\"\n                    }\n                },\n                \"CreationDate\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CreationDate\",\n                        \"smithy.api#documentation\": \"<p>The date and time the image was created.</p>\",\n                        \"smithy.api#xmlName\": \"creationDate\"\n                    }\n                },\n                \"Public\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IsPublic\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether the image has public launch permissions. The value is <code>true</code>\\n      if this image has public launch permissions or <code>false</code> if it has only implicit and\\n      explicit launch permissions.</p>\",\n                        \"smithy.api#xmlName\": \"isPublic\"\n                    }\n                },\n                \"ProductCodes\": {\n                    \"target\": \"com.amazonaws.ec2#ProductCodeList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ProductCodes\",\n                        \"smithy.api#documentation\": \"<p>Any product codes associated with the AMI.</p>\",\n                        \"smithy.api#xmlName\": \"productCodes\"\n                    }\n                },\n                \"Architecture\": {\n                    \"target\": \"com.amazonaws.ec2#ArchitectureValues\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Architecture\",\n                        \"smithy.api#documentation\": \"<p>The architecture of the image.</p>\",\n                        \"smithy.api#xmlName\": \"architecture\"\n                    }\n                },\n                \"ImageType\": {\n                    \"target\": \"com.amazonaws.ec2#ImageTypeValues\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ImageType\",\n                        \"smithy.api#documentation\": \"<p>The type of image.</p>\",\n                        \"smithy.api#xmlName\": \"imageType\"\n                    }\n                },\n                \"KernelId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"KernelId\",\n                        \"smithy.api#documentation\": \"<p>The kernel associated with the image, if any. Only applicable for machine images.</p>\",\n                        \"smithy.api#xmlName\": \"kernelId\"\n                    }\n                },\n                \"RamdiskId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RamdiskId\",\n                        \"smithy.api#documentation\": \"<p>The RAM disk associated with the image, if any. Only applicable for machine images.</p>\",\n                        \"smithy.api#xmlName\": \"ramdiskId\"\n                    }\n                },\n                \"Platform\": {\n                    \"target\": \"com.amazonaws.ec2#PlatformValues\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Platform\",\n                        \"smithy.api#documentation\": \"<p>This value is set to <code>windows</code> for Windows AMIs; otherwise, it is blank.</p>\",\n                        \"smithy.api#xmlName\": \"platform\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes an image.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ImageAttribute\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#AttributeValue\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Description\",\n                        \"smithy.api#documentation\": \"<p>A description for the AMI.</p>\",\n                        \"smithy.api#xmlName\": \"description\"\n                    }\n                },\n                \"KernelId\": {\n                    \"target\": \"com.amazonaws.ec2#AttributeValue\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Kernel\",\n                        \"smithy.api#documentation\": \"<p>The kernel ID.</p>\",\n                        \"smithy.api#xmlName\": \"kernel\"\n                    }\n                },\n                \"RamdiskId\": {\n                    \"target\": \"com.amazonaws.ec2#AttributeValue\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Ramdisk\",\n                        \"smithy.api#documentation\": \"<p>The RAM disk ID.</p>\",\n                        \"smithy.api#xmlName\": \"ramdisk\"\n                    }\n                },\n                \"SriovNetSupport\": {\n                    \"target\": \"com.amazonaws.ec2#AttributeValue\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SriovNetSupport\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether enhanced networking with the Intel 82599 Virtual Function interface is\\n      enabled.</p>\",\n                        \"smithy.api#xmlName\": \"sriovNetSupport\"\n                    }\n                },\n                \"BootMode\": {\n                    \"target\": \"com.amazonaws.ec2#AttributeValue\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"BootMode\",\n                        \"smithy.api#documentation\": \"<p>The boot mode.</p>\",\n                        \"smithy.api#xmlName\": \"bootMode\"\n                    }\n                },\n                \"TpmSupport\": {\n                    \"target\": \"com.amazonaws.ec2#AttributeValue\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TpmSupport\",\n                        \"smithy.api#documentation\": \"<p>If the image is configured for NitroTPM support, the value is <code>v2.0</code>.</p>\",\n                        \"smithy.api#xmlName\": \"tpmSupport\"\n                    }\n                },\n                \"UefiData\": {\n                    \"target\": \"com.amazonaws.ec2#AttributeValue\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"UefiData\",\n                        \"smithy.api#documentation\": \"<p>Base64 representation of the non-volatile UEFI variable store. To retrieve the UEFI data,\\n      use the <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetInstanceUefiData\\\">GetInstanceUefiData</a> command. You can inspect and modify the UEFI data by using the\\n        <a href=\\\"https://github.com/awslabs/python-uefivars\\\">python-uefivars tool</a> on\\n      GitHub. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/uefi-secure-boot.html\\\">UEFI Secure Boot for Amazon EC2\\n        instances</a> in the <i>Amazon EC2 User Guide</i>.</p>\",\n                        \"smithy.api#xmlName\": \"uefiData\"\n                    }\n                },\n                \"LastLaunchedTime\": {\n                    \"target\": \"com.amazonaws.ec2#AttributeValue\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LastLaunchedTime\",\n                        \"smithy.api#documentation\": \"<p>The date and time, in <a href=\\\"http://www.iso.org/iso/iso8601\\\">ISO 8601 date-time\\n        format</a>, when the AMI was last used to launch an EC2 instance. When the AMI is used\\n      to launch an instance, there is a 24-hour delay before that usage is reported.</p>\\n         <note>\\n            <p>\\n               <code>lastLaunchedTime</code> data is available starting April 2017.</p>\\n         </note>\",\n                        \"smithy.api#xmlName\": \"lastLaunchedTime\"\n                    }\n                },\n                \"ImdsSupport\": {\n                    \"target\": \"com.amazonaws.ec2#AttributeValue\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ImdsSupport\",\n                        \"smithy.api#documentation\": \"<p>If <code>v2.0</code>, it indicates that IMDSv2 is specified in the AMI. Instances launched\\n      from this AMI will have <code>HttpTokens</code> automatically set to <code>required</code> so\\n      that, by default, the instance requires that IMDSv2 is used when requesting instance metadata.\\n      In addition, <code>HttpPutResponseHopLimit</code> is set to <code>2</code>. For more\\n      information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/configuring-IMDS-new-instances.html#configure-IMDS-new-instances-ami-configuration\\\">Configure the AMI</a> in the <i>Amazon EC2 User Guide</i>.</p>\",\n                        \"smithy.api#xmlName\": \"imdsSupport\"\n                    }\n                },\n                \"DeregistrationProtection\": {\n                    \"target\": \"com.amazonaws.ec2#AttributeValue\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DeregistrationProtection\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether deregistration protection is enabled for the AMI.</p>\",\n                        \"smithy.api#xmlName\": \"deregistrationProtection\"\n                    }\n                },\n                \"ImageId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ImageId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the AMI.</p>\",\n                        \"smithy.api#xmlName\": \"imageId\"\n                    }\n                },\n                \"LaunchPermissions\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchPermissionList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LaunchPermission\",\n                        \"smithy.api#documentation\": \"<p>The launch permissions.</p>\",\n                        \"smithy.api#xmlName\": \"launchPermission\"\n                    }\n                },\n                \"ProductCodes\": {\n                    \"target\": \"com.amazonaws.ec2#ProductCodeList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ProductCodes\",\n                        \"smithy.api#documentation\": \"<p>The product codes.</p>\",\n                        \"smithy.api#xmlName\": \"productCodes\"\n                    }\n                },\n                \"BlockDeviceMappings\": {\n                    \"target\": \"com.amazonaws.ec2#BlockDeviceMappingList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"BlockDeviceMapping\",\n                        \"smithy.api#documentation\": \"<p>The block device mapping entries.</p>\",\n                        \"smithy.api#xmlName\": \"blockDeviceMapping\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes an image attribute.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ImageAttributeName\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"description\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"description\"\n                    }\n                },\n                \"kernel\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"kernel\"\n                    }\n                },\n                \"ramdisk\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ramdisk\"\n                    }\n                },\n                \"launchPermission\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"launchPermission\"\n                    }\n                },\n                \"productCodes\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"productCodes\"\n                    }\n                },\n                \"blockDeviceMapping\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"blockDeviceMapping\"\n                    }\n                },\n                \"sriovNetSupport\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"sriovNetSupport\"\n                    }\n                },\n                \"bootMode\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"bootMode\"\n                    }\n                },\n                \"tpmSupport\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"tpmSupport\"\n                    }\n                },\n                \"uefiData\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"uefiData\"\n                    }\n                },\n                \"lastLaunchedTime\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"lastLaunchedTime\"\n                    }\n                },\n                \"imdsSupport\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"imdsSupport\"\n                    }\n                },\n                \"deregistrationProtection\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"deregistrationProtection\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ImageBlockPublicAccessDisabledState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"unblocked\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"unblocked\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ImageBlockPublicAccessEnabledState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"block_new_sharing\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"block-new-sharing\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ImageCriterion\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ImageProviders\": {\n                    \"target\": \"com.amazonaws.ec2#ImageProviderList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ImageProviderSet\",\n                        \"smithy.api#documentation\": \"<p>The image providers whose images are allowed.</p>\\n         <p>Possible values:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>amazon</code>: Allow AMIs created by Amazon or verified providers.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>aws-marketplace</code>: Allow AMIs created by verified providers in the Amazon Web Services\\n          Marketplace.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>aws-backup-vault</code>: Allow AMIs created by Amazon Web Services Backup. </p>\\n            </li>\\n            <li>\\n               <p>12-digit account ID: Allow AMIs created by this account. One or more account IDs can be\\n          specified.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>none</code>: Allow AMIs created by your own account only.</p>\\n            </li>\\n         </ul>\\n         <p>Maximum: 200 values</p>\",\n                        \"smithy.api#xmlName\": \"imageProviderSet\"\n                    }\n                },\n                \"MarketplaceProductCodes\": {\n                    \"target\": \"com.amazonaws.ec2#MarketplaceProductCodeList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MarketplaceProductCodeSet\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services Marketplace product codes for allowed images.</p>\\n         <p>Length: 1-25 characters</p>\\n         <p>Valid characters: Letters (<code>A–Z, a–z</code>) and numbers (<code>0–9</code>)</p>\\n         <p>Maximum: 50 values</p>\",\n                        \"smithy.api#xmlName\": \"marketplaceProductCodeSet\"\n                    }\n                },\n                \"ImageNames\": {\n                    \"target\": \"com.amazonaws.ec2#ImageNameList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ImageNameSet\",\n                        \"smithy.api#documentation\": \"<p>The names of allowed images. Names can include wildcards (<code>?</code> and\\n        <code>*</code>).</p>\\n         <p>Length: 1–128 characters. With <code>?</code>, the minimum is 3 characters.</p>\\n         <p>Valid characters:</p>\\n         <ul>\\n            <li>\\n               <p>Letters: <code>A–Z, a–z</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Numbers: <code>0–9</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Special characters: <code>( ) [ ] . / - ' @ _ * ?</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Spaces</p>\\n            </li>\\n         </ul>\\n         <p>Maximum: 50 values</p>\",\n                        \"smithy.api#xmlName\": \"imageNameSet\"\n                    }\n                },\n                \"DeprecationTimeCondition\": {\n                    \"target\": \"com.amazonaws.ec2#DeprecationTimeCondition\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DeprecationTimeCondition\",\n                        \"smithy.api#documentation\": \"<p>The maximum period since deprecation for allowed images.</p>\",\n                        \"smithy.api#xmlName\": \"deprecationTimeCondition\"\n                    }\n                },\n                \"CreationDateCondition\": {\n                    \"target\": \"com.amazonaws.ec2#CreationDateCondition\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CreationDateCondition\",\n                        \"smithy.api#documentation\": \"<p>The maximum age for allowed images.</p>\",\n                        \"smithy.api#xmlName\": \"creationDateCondition\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The criteria that are evaluated to determine which AMIs are discoverable and usable in\\n      your account for the specified Amazon Web Services Region.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-allowed-amis.html#how-allowed-amis-works\\\">How Allowed AMIs\\n        works</a> in the <i>Amazon EC2 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ImageCriterionList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ImageCriterion\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ImageCriterionRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ImageProviders\": {\n                    \"target\": \"com.amazonaws.ec2#ImageProviderRequestList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The image providers whose images are allowed.</p>\\n         <p>Possible values:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>amazon</code>: Allow AMIs created by Amazon or verified providers.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>aws-marketplace</code>: Allow AMIs created by verified providers in the Amazon Web Services\\n          Marketplace.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>aws-backup-vault</code>: Allow AMIs created by Amazon Web Services Backup. </p>\\n            </li>\\n            <li>\\n               <p>12-digit account ID: Allow AMIs created by the specified accounts. One or more account IDs can be\\n          specified.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>none</code>: Allow AMIs created by your own account only. When <code>none</code> is\\n          specified, no other values can be specified.</p>\\n            </li>\\n         </ul>\\n         <p>Maximum: 200 values</p>\",\n                        \"smithy.api#xmlName\": \"ImageProvider\"\n                    }\n                },\n                \"MarketplaceProductCodes\": {\n                    \"target\": \"com.amazonaws.ec2#MarketplaceProductCodeRequestList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services Marketplace product codes for allowed images.</p>\\n         <p>Length: 1-25 characters</p>\\n         <p>Valid characters: Letters (<code>A–Z, a–z</code>) and numbers (<code>0–9</code>)</p>\\n         <p>Maximum: 50 values</p>\",\n                        \"smithy.api#xmlName\": \"MarketplaceProductCode\"\n                    }\n                },\n                \"ImageNames\": {\n                    \"target\": \"com.amazonaws.ec2#ImageNameRequestList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The names of allowed images. Names can include wildcards (<code>?</code> and\\n        <code>*</code>).</p>\\n         <p>Length: 1–128 characters. With <code>?</code>, the minimum is 3 characters.</p>\\n         <p>Valid characters:</p>\\n         <ul>\\n            <li>\\n               <p>Letters: <code>A–Z, a–z</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Numbers: <code>0–9</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Special characters: <code>( ) [ ] . / - ' @ _ * ?</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Spaces</p>\\n            </li>\\n         </ul>\\n         <p>Maximum: 50 values</p>\",\n                        \"smithy.api#xmlName\": \"ImageName\"\n                    }\n                },\n                \"DeprecationTimeCondition\": {\n                    \"target\": \"com.amazonaws.ec2#DeprecationTimeConditionRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum period since deprecation for allowed images.</p>\"\n                    }\n                },\n                \"CreationDateCondition\": {\n                    \"target\": \"com.amazonaws.ec2#CreationDateConditionRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum age for allowed images.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The criteria that are evaluated to determine which AMIs are discoverable and usable in\\n      your account for the specified Amazon Web Services Region.</p>\\n         <p>The <code>ImageCriteria</code> can include up to:</p>\\n         <ul>\\n            <li>\\n               <p>10 <code>ImageCriterion</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>Each <code>ImageCriterion</code> can include up to:</p>\\n         <ul>\\n            <li>\\n               <p>200 values for <code>ImageProviders</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>50 values for <code>ImageNames</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>50 values for <code>MarketplaceProductCodes</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-allowed-amis.html#how-allowed-amis-works\\\">How Allowed AMIs\\n        works</a> in the <i>Amazon EC2 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ImageCriterionRequestList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ImageCriterionRequest\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"ImageCriterion\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ImageDiskContainer\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The description of the disk image.</p>\"\n                    }\n                },\n                \"DeviceName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The block device mapping for the disk.</p>\"\n                    }\n                },\n                \"Format\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The format of the disk image being imported.</p>\\n         <p>Valid values: <code>OVA</code> | <code>VHD</code> | <code>VHDX</code> | <code>VMDK</code> | <code>RAW</code>\\n         </p>\"\n                    }\n                },\n                \"SnapshotId\": {\n                    \"target\": \"com.amazonaws.ec2#SnapshotId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the EBS snapshot to be used for importing the snapshot.</p>\"\n                    }\n                },\n                \"Url\": {\n                    \"target\": \"com.amazonaws.ec2#SensitiveUrl\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The URL to the Amazon S3-based disk image being imported. The URL can either be a https URL (https://..) or an\\n   Amazon S3 URL (s3://..)</p>\"\n                    }\n                },\n                \"UserBucket\": {\n                    \"target\": \"com.amazonaws.ec2#UserBucket\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The S3 bucket for the disk image.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the disk container object for an import image task.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ImageDiskContainerList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ImageDiskContainer\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ImageId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#ImageIdList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ImageId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ImageIdStringList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ImageId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"ImageId\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ImageList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#Image\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ImageMetadata\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ImageId\": {\n                    \"target\": \"com.amazonaws.ec2#ImageId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ImageId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the AMI.</p>\",\n                        \"smithy.api#xmlName\": \"imageId\"\n                    }\n                },\n                \"Name\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Name\",\n                        \"smithy.api#documentation\": \"<p>The name of the AMI.</p>\",\n                        \"smithy.api#xmlName\": \"name\"\n                    }\n                },\n                \"OwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ImageOwnerId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Amazon Web Services account that owns the AMI.</p>\",\n                        \"smithy.api#xmlName\": \"imageOwnerId\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#ImageState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ImageState\",\n                        \"smithy.api#documentation\": \"<p>The current state of the AMI. If the state is <code>available</code>, the AMI is\\n      successfully registered and can be used to launch an instance.</p>\",\n                        \"smithy.api#xmlName\": \"imageState\"\n                    }\n                },\n                \"ImageOwnerAlias\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ImageOwnerAlias\",\n                        \"smithy.api#documentation\": \"<p>The alias of the AMI owner.</p>\\n         <p>Valid values: <code>amazon</code> | <code>aws-backup-vault</code> |\\n      <code>aws-marketplace</code>\\n         </p>\",\n                        \"smithy.api#xmlName\": \"imageOwnerAlias\"\n                    }\n                },\n                \"CreationDate\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CreationDate\",\n                        \"smithy.api#documentation\": \"<p>The date and time the AMI was created.</p>\",\n                        \"smithy.api#xmlName\": \"creationDate\"\n                    }\n                },\n                \"DeprecationTime\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DeprecationTime\",\n                        \"smithy.api#documentation\": \"<p>The deprecation date and time of the AMI, in UTC, in the following format:\\n      <i>YYYY</i>-<i>MM</i>-<i>DD</i>T<i>HH</i>:<i>MM</i>:<i>SS</i>Z.</p>\",\n                        \"smithy.api#xmlName\": \"deprecationTime\"\n                    }\n                },\n                \"ImageAllowed\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ImageAllowed\",\n                        \"smithy.api#documentation\": \"<p>If <code>true</code>, the AMI satisfies the criteria for Allowed AMIs and can be\\n      discovered and used in the account. If <code>false</code>, the AMI can't be discovered or used\\n      in the account.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-allowed-amis.html\\\">Control the discovery and use of AMIs in\\n      Amazon EC2 with Allowed AMIs</a> in\\n      <i>Amazon EC2 User Guide</i>.</p>\",\n                        \"smithy.api#xmlName\": \"imageAllowed\"\n                    }\n                },\n                \"IsPublic\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IsPublic\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether the AMI has public launch permissions. A value of <code>true</code>\\n      means this AMI has public launch permissions, while <code>false</code> means it has only\\n      implicit (AMI owner) or explicit (shared with your account) launch permissions.</p>\",\n                        \"smithy.api#xmlName\": \"isPublic\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about the AMI.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ImageName\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#ImageNameList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ImageName\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ImageNameRequest\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#ImageNameRequestList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ImageNameRequest\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ImageProvider\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#ImageProviderList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ImageProvider\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ImageProviderRequest\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#ImageProviderRequestList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ImageProviderRequest\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ImageRecycleBinInfo\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ImageId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ImageId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the AMI.</p>\",\n                        \"smithy.api#xmlName\": \"imageId\"\n                    }\n                },\n                \"Name\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Name\",\n                        \"smithy.api#documentation\": \"<p>The name of the AMI.</p>\",\n                        \"smithy.api#xmlName\": \"name\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Description\",\n                        \"smithy.api#documentation\": \"<p>The description of the AMI.</p>\",\n                        \"smithy.api#xmlName\": \"description\"\n                    }\n                },\n                \"RecycleBinEnterTime\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RecycleBinEnterTime\",\n                        \"smithy.api#documentation\": \"<p>The date and time when the AMI entered the Recycle Bin.</p>\",\n                        \"smithy.api#xmlName\": \"recycleBinEnterTime\"\n                    }\n                },\n                \"RecycleBinExitTime\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RecycleBinExitTime\",\n                        \"smithy.api#documentation\": \"<p>The date and time when the AMI is to be permanently deleted from the Recycle Bin.</p>\",\n                        \"smithy.api#xmlName\": \"recycleBinExitTime\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about an AMI that is currently in the Recycle Bin.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ImageRecycleBinInfoList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ImageRecycleBinInfo\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ImageReference\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ImageId\": {\n                    \"target\": \"com.amazonaws.ec2#ImageId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ImageId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the referenced image.</p>\",\n                        \"smithy.api#xmlName\": \"imageId\"\n                    }\n                },\n                \"ResourceType\": {\n                    \"target\": \"com.amazonaws.ec2#ImageReferenceResourceType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResourceType\",\n                        \"smithy.api#documentation\": \"<p>The type of resource referencing the image.</p>\",\n                        \"smithy.api#xmlName\": \"resourceType\"\n                    }\n                },\n                \"Arn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Arn\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the resource referencing the image.</p>\",\n                        \"smithy.api#xmlName\": \"arn\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A resource that is referencing an image.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ImageReferenceList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ImageReference\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ImageReferenceOptionName\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"STATE_NAME\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"state-name\"\n                    }\n                },\n                \"VERSION_DEPTH\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"version-depth\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ImageReferenceResourceType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"EC2_INSTANCE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ec2:Instance\"\n                    }\n                },\n                \"EC2_LAUNCH_TEMPLATE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ec2:LaunchTemplate\"\n                    }\n                },\n                \"SSM_PARAMETER\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ssm:Parameter\"\n                    }\n                },\n                \"IMAGE_BUILDER_IMAGE_RECIPE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"imagebuilder:ImageRecipe\"\n                    }\n                },\n                \"IMAGE_BUILDER_CONTAINER_RECIPE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"imagebuilder:ContainerRecipe\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ImageState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"pending\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"pending\"\n                    }\n                },\n                \"available\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"available\"\n                    }\n                },\n                \"invalid\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"invalid\"\n                    }\n                },\n                \"deregistered\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"deregistered\"\n                    }\n                },\n                \"transient\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"transient\"\n                    }\n                },\n                \"failed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"failed\"\n                    }\n                },\n                \"error\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"error\"\n                    }\n                },\n                \"disabled\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"disabled\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ImageTypeValues\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"machine\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"machine\"\n                    }\n                },\n                \"kernel\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"kernel\"\n                    }\n                },\n                \"ramdisk\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ramdisk\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ImageUsageReport\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ImageId\": {\n                    \"target\": \"com.amazonaws.ec2#ImageId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ImageId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the image that was specified when the report was created.</p>\",\n                        \"smithy.api#xmlName\": \"imageId\"\n                    }\n                },\n                \"ReportId\": {\n                    \"target\": \"com.amazonaws.ec2#ImageUsageReportId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ReportId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the report.</p>\",\n                        \"smithy.api#xmlName\": \"reportId\"\n                    }\n                },\n                \"ResourceTypes\": {\n                    \"target\": \"com.amazonaws.ec2#ImageUsageResourceTypeList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResourceTypeSet\",\n                        \"smithy.api#documentation\": \"<p>The resource types that were specified when the report was created.</p>\",\n                        \"smithy.api#xmlName\": \"resourceTypeSet\"\n                    }\n                },\n                \"AccountIds\": {\n                    \"target\": \"com.amazonaws.ec2#UserIdList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AccountIdSet\",\n                        \"smithy.api#documentation\": \"<p>The IDs of the Amazon Web Services accounts that were specified when the report was created.</p>\",\n                        \"smithy.api#xmlName\": \"accountIdSet\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#ImageUsageReportState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The current state of the report. Possible values:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>available</code> - The report is available to view.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>pending</code> - The report is being created and not available to view.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>error</code> - The report could not be created.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                },\n                \"StateReason\": {\n                    \"target\": \"com.amazonaws.ec2#ImageUsageReportStateReason\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"StateReason\",\n                        \"smithy.api#documentation\": \"<p>Provides additional details when the report is in an <code>error</code> state.</p>\",\n                        \"smithy.api#xmlName\": \"stateReason\"\n                    }\n                },\n                \"CreationTime\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CreationTime\",\n                        \"smithy.api#documentation\": \"<p>The date and time when the report was created.</p>\",\n                        \"smithy.api#xmlName\": \"creationTime\"\n                    }\n                },\n                \"ExpirationTime\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ExpirationTime\",\n                        \"smithy.api#documentation\": \"<p>The date and time when Amazon EC2 will delete the report (30 days after the report was\\n      created).</p>\",\n                        \"smithy.api#xmlName\": \"expirationTime\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>Any tags assigned to the report.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The configuration and status of an image usage report.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ImageUsageReportEntry\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ResourceType\": {\n                    \"target\": \"com.amazonaws.ec2#ImageUsageResourceTypeName\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResourceType\",\n                        \"smithy.api#documentation\": \"<p>The type of resource (<code>ec2:Instance</code> or\\n      <code>ec2:LaunchTemplate</code>).</p>\",\n                        \"smithy.api#xmlName\": \"resourceType\"\n                    }\n                },\n                \"ReportId\": {\n                    \"target\": \"com.amazonaws.ec2#ImageUsageReportId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ReportId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the report.</p>\",\n                        \"smithy.api#xmlName\": \"reportId\"\n                    }\n                },\n                \"UsageCount\": {\n                    \"target\": \"com.amazonaws.ec2#Long\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"UsageCount\",\n                        \"smithy.api#documentation\": \"<p>The number of times resources of this type reference this image in the account.</p>\",\n                        \"smithy.api#xmlName\": \"usageCount\"\n                    }\n                },\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AccountId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the account that uses the image.</p>\",\n                        \"smithy.api#xmlName\": \"accountId\"\n                    }\n                },\n                \"ImageId\": {\n                    \"target\": \"com.amazonaws.ec2#ImageId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ImageId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the image.</p>\",\n                        \"smithy.api#xmlName\": \"imageId\"\n                    }\n                },\n                \"ReportCreationTime\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ReportCreationTime\",\n                        \"smithy.api#documentation\": \"<p>The date and time the report creation was initiated.</p>\",\n                        \"smithy.api#xmlName\": \"reportCreationTime\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A single entry in an image usage report, detailing how an image is being used by a\\n      specific Amazon Web Services account and resource type.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ImageUsageReportEntryList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ImageUsageReportEntry\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ImageUsageReportId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#ImageUsageReportIdStringList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ImageUsageReportId\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 200\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ImageUsageReportList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ImageUsageReport\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ImageUsageReportState\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#ImageUsageReportStateReason\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#ImageUsageReportUserIdStringList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#String\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"UserId\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 200\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ImageUsageResourceType\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ResourceType\": {\n                    \"target\": \"com.amazonaws.ec2#ImageUsageResourceTypeName\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResourceType\",\n                        \"smithy.api#documentation\": \"<p>The resource type.</p>\\n         <p>Valid values: <code>ec2:Instance</code> | <code>ec2:LaunchTemplate</code>\\n         </p>\",\n                        \"smithy.api#xmlName\": \"resourceType\"\n                    }\n                },\n                \"ResourceTypeOptions\": {\n                    \"target\": \"com.amazonaws.ec2#ImageUsageResourceTypeOptionList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResourceTypeOptionSet\",\n                        \"smithy.api#documentation\": \"<p>The options that affect the scope of the report. Valid only when <code>ResourceType</code>\\n      is <code>ec2:LaunchTemplate</code>.</p>\",\n                        \"smithy.api#xmlName\": \"resourceTypeOptionSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A resource type to include in the report. Associated options can also be specified if the\\n      resource type is a launch template.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ImageUsageResourceTypeList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ImageUsageResourceType\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ImageUsageResourceTypeName\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#ImageUsageResourceTypeOption\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"OptionName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OptionName\",\n                        \"smithy.api#documentation\": \"<p>The name of the option.</p>\",\n                        \"smithy.api#xmlName\": \"optionName\"\n                    }\n                },\n                \"OptionValues\": {\n                    \"target\": \"com.amazonaws.ec2#ImageUsageResourceTypeOptionValuesList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OptionValueSet\",\n                        \"smithy.api#documentation\": \"<p>The number of launch template versions to check.</p>\",\n                        \"smithy.api#xmlName\": \"optionValueSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The options that affect the scope of the report.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ImageUsageResourceTypeOptionList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ImageUsageResourceTypeOption\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ImageUsageResourceTypeOptionRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"OptionName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the option.</p>\\n         <p>Valid value: <code>version-depth</code> - The number of launch template versions to\\n      check.</p>\"\n                    }\n                },\n                \"OptionValues\": {\n                    \"target\": \"com.amazonaws.ec2#ImageUsageResourceTypeOptionValuesList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A value for the specified option.</p>\\n         <p>Valid values: Integers between <code>1</code> and <code>10000</code>\\n         </p>\\n         <p>Default: <code>20</code>\\n         </p>\",\n                        \"smithy.api#xmlName\": \"OptionValue\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The options that affect the scope of the report.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ImageUsageResourceTypeOptionRequestList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ImageUsageResourceTypeOptionRequest\"\n            }\n        },\n        \"com.amazonaws.ec2#ImageUsageResourceTypeOptionValue\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#ImageUsageResourceTypeOptionValuesList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ImageUsageResourceTypeOptionValue\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ImageUsageResourceTypeRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ResourceType\": {\n                    \"target\": \"com.amazonaws.ec2#ImageUsageResourceTypeName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The resource type.</p>\\n         <p>Valid values: <code>ec2:Instance</code> | <code>ec2:LaunchTemplate</code>\\n         </p>\"\n                    }\n                },\n                \"ResourceTypeOptions\": {\n                    \"target\": \"com.amazonaws.ec2#ImageUsageResourceTypeOptionRequestList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The options that affect the scope of the report. Valid only when <code>ResourceType</code>\\n      is <code>ec2:LaunchTemplate</code>.</p>\",\n                        \"smithy.api#xmlName\": \"ResourceTypeOption\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A resource type to include in the report. Associated options can also be specified if the\\n      resource type is a launch template.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ImageUsageResourceTypeRequestList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ImageUsageResourceTypeRequest\"\n            }\n        },\n        \"com.amazonaws.ec2#ImdsSupportValues\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"v2_0\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"v2.0\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ImportClientVpnClientCertificateRevocationList\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ImportClientVpnClientCertificateRevocationListRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ImportClientVpnClientCertificateRevocationListResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Uploads a client certificate revocation list to the specified Client VPN endpoint. Uploading a client certificate revocation list overwrites the existing client certificate revocation list.</p>\\n         <p>Uploading a client certificate revocation list resets existing client connections.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ImportClientVpnClientCertificateRevocationListRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ClientVpnEndpointId\": {\n                    \"target\": \"com.amazonaws.ec2#ClientVpnEndpointId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the Client VPN endpoint to which the client certificate revocation list applies.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"CertificateRevocationList\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The client certificate revocation list file. For more information, see <a href=\\\"https://docs.aws.amazon.com/vpn/latest/clientvpn-admin/cvpn-working-certificates.html#cvpn-working-certificates-generate\\\">Generate a Client Certificate Revocation List</a> in the\\n\\t\\t\\t\\t<i>Client VPN Administrator Guide</i>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ImportClientVpnClientCertificateRevocationListResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Return\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Return\",\n                        \"smithy.api#documentation\": \"<p>Returns <code>true</code> if the request succeeds; otherwise, it returns an error.</p>\",\n                        \"smithy.api#xmlName\": \"return\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ImportImage\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ImportImageRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ImportImageResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>To import your virtual machines (VMs) with a console-based experience, you can use the\\n    <i>Import virtual machine images to Amazon Web Services</i> template in the <a href=\\\"https://console.aws.amazon.com/migrationhub/orchestrator\\\">Migration Hub Orchestrator console</a>. For more\\n    information, see the <a href=\\\"https://docs.aws.amazon.com/migrationhub-orchestrator/latest/userguide/import-vm-images.html\\\">\\n                  <i>Migration Hub Orchestrator User Guide</i>\\n               </a>.</p>\\n         </note>\\n         <p>Import single or multi-volume disk images or EBS snapshots into an Amazon Machine Image (AMI).</p>\\n         <important>\\n            <p>Amazon Web Services VM Import/Export strongly recommends specifying a value for either the\\n     <code>--license-type</code> or <code>--usage-operation</code> parameter when you create a new\\n    VM Import task. This ensures your operating system is licensed appropriately and your billing is\\n    optimized.</p>\\n         </important>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/vm-import/latest/userguide/vmimport-image-import.html\\\">Importing a \\n   VM as an image using VM Import/Export</a> in the <i>VM Import/Export User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ImportImageLicenseConfigurationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LicenseConfigurationArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of a license configuration.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The request information of license configurations.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ImportImageLicenseConfigurationResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LicenseConfigurationArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LicenseConfigurationArn\",\n                        \"smithy.api#documentation\": \"<p>The ARN of a license configuration.</p>\",\n                        \"smithy.api#xmlName\": \"licenseConfigurationArn\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p> The response information for license configurations.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ImportImageLicenseSpecificationListRequest\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ImportImageLicenseConfigurationRequest\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ImportImageLicenseSpecificationListResponse\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ImportImageLicenseConfigurationResponse\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ImportImageRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Architecture\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The architecture of the virtual machine.</p>\\n         <p>Valid values: <code>i386</code> | <code>x86_64</code>\\n         </p>\"\n                    }\n                },\n                \"ClientData\": {\n                    \"target\": \"com.amazonaws.ec2#ClientData\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The client-specific data.</p>\"\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token to enable idempotency for VM import requests.</p>\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A description string for the import image task.</p>\"\n                    }\n                },\n                \"DiskContainers\": {\n                    \"target\": \"com.amazonaws.ec2#ImageDiskContainerList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Information about the disk containers.</p>\",\n                        \"smithy.api#xmlName\": \"DiskContainer\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"Encrypted\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies whether the destination AMI of the imported image should be encrypted. The default KMS key for EBS is used\\n   unless you specify a non-default KMS key using <code>KmsKeyId</code>. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EBSEncryption.html\\\">Amazon EBS Encryption</a> in the\\n    <i>Amazon Elastic Compute Cloud User Guide</i>.</p>\"\n                    }\n                },\n                \"Hypervisor\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The target hypervisor platform.</p>\\n         <p>Valid values: <code>xen</code>\\n         </p>\"\n                    }\n                },\n                \"KmsKeyId\": {\n                    \"target\": \"com.amazonaws.ec2#KmsKeyId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An identifier for the symmetric KMS key to use when creating the\\n   encrypted AMI. This parameter is only required if you want to use a non-default KMS key; if this\\n   parameter is not specified, the default KMS key for EBS is used. If a <code>KmsKeyId</code> is\\n   specified, the <code>Encrypted</code> flag must also be set. </p>\\n         <p>The KMS key identifier may be provided in any of the following formats: </p>\\n         <ul>\\n            <li>\\n               <p>Key ID</p>\\n            </li>\\n            <li>\\n               <p>Key alias</p>\\n            </li>\\n            <li>\\n               <p>ARN using key ID. The ID ARN contains the <code>arn:aws:kms</code> namespace, followed by the Region of the key, the Amazon Web Services account ID of the key owner, the <code>key</code> namespace, and then the key ID. For example, arn:aws:kms:<i>us-east-1</i>:<i>012345678910</i>:key/<i>abcd1234-a123-456a-a12b-a123b4cd56ef</i>.</p>\\n            </li>\\n            <li>\\n               <p>ARN using key alias. The alias ARN contains the <code>arn:aws:kms</code> namespace, followed by the Region of the key, the Amazon Web Services account ID of the key owner, the <code>alias</code> namespace, and then the key alias. For example, arn:aws:kms:<i>us-east-1</i>:<i>012345678910</i>:alias/<i>ExampleAlias</i>. </p>\\n            </li>\\n         </ul>\\n         <p>Amazon Web Services parses <code>KmsKeyId</code> asynchronously, meaning that the action you call may appear to complete even\\n   though you provided an invalid identifier. This action will eventually report failure. </p>\\n         <p>The specified KMS key must exist in the Region that the AMI is being copied to.</p>\\n         <p>Amazon EBS does not support asymmetric KMS keys.</p>\"\n                    }\n                },\n                \"LicenseType\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The license type to be used for the Amazon Machine Image (AMI) after importing.</p>\\n         <p>Specify <code>AWS</code> to replace the source-system license with an Amazon Web Services\\n   license or <code>BYOL</code> to retain the source-system license. Leaving this parameter\\n   undefined is the same as choosing <code>AWS</code> when importing a Windows Server operating\\n   system, and the same as choosing <code>BYOL</code> when importing a Windows client operating\\n   system (such as Windows 10) or a Linux operating system.</p>\\n         <p>To use <code>BYOL</code>, you must have existing licenses with rights to use these licenses in a third party\\n   cloud, such as Amazon Web Services. For more information, see <a href=\\\"https://docs.aws.amazon.com/vm-import/latest/userguide/vmimport-image-import.html#prerequisites-image\\\">Prerequisites</a> in the\\n   VM Import/Export User Guide.</p>\"\n                    }\n                },\n                \"Platform\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The operating system of the virtual machine. If you import a VM that is compatible with\\n   Unified Extensible Firmware Interface (UEFI) using an EBS snapshot, you must specify a value for\\n   the platform.</p>\\n         <p>Valid values: <code>Windows</code> | <code>Linux</code>\\n         </p>\"\n                    }\n                },\n                \"RoleName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the role to use when not using the default role, 'vmimport'.</p>\"\n                    }\n                },\n                \"LicenseSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#ImportImageLicenseSpecificationListRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARNs of the license configurations.</p>\"\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags to apply to the import image task during creation.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                },\n                \"UsageOperation\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The usage operation value. For more information, see <a href=\\\"https://docs.aws.amazon.com/vm-import/latest/userguide/vmie_prereqs.html#prerequisites\\\">Licensing options</a> in the <i>VM Import/Export User Guide</i>.</p>\"\n                    }\n                },\n                \"BootMode\": {\n                    \"target\": \"com.amazonaws.ec2#BootModeValues\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The boot mode of the virtual machine.</p>\\n         <note>\\n            <p>The <code>uefi-preferred</code> boot mode isn't supported for importing images. For more\\n    information, see <a href=\\\"https://docs.aws.amazon.com/vm-import/latest/userguide/prerequisites.html#vmimport-boot-modes\\\">Boot modes</a> in\\n    the <i>VM Import/Export User Guide</i>.</p>\\n         </note>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ImportImageResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Architecture\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Architecture\",\n                        \"smithy.api#documentation\": \"<p>The architecture of the virtual machine.</p>\",\n                        \"smithy.api#xmlName\": \"architecture\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Description\",\n                        \"smithy.api#documentation\": \"<p>A description of the import task.</p>\",\n                        \"smithy.api#xmlName\": \"description\"\n                    }\n                },\n                \"Encrypted\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Encrypted\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether the AMI is encrypted.</p>\",\n                        \"smithy.api#xmlName\": \"encrypted\"\n                    }\n                },\n                \"Hypervisor\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Hypervisor\",\n                        \"smithy.api#documentation\": \"<p>The target hypervisor of the import task.</p>\",\n                        \"smithy.api#xmlName\": \"hypervisor\"\n                    }\n                },\n                \"ImageId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ImageId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Amazon Machine Image (AMI) created by the import task.</p>\",\n                        \"smithy.api#xmlName\": \"imageId\"\n                    }\n                },\n                \"ImportTaskId\": {\n                    \"target\": \"com.amazonaws.ec2#ImportImageTaskId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ImportTaskId\",\n                        \"smithy.api#documentation\": \"<p>The task ID of the import image task.</p>\",\n                        \"smithy.api#xmlName\": \"importTaskId\"\n                    }\n                },\n                \"KmsKeyId\": {\n                    \"target\": \"com.amazonaws.ec2#KmsKeyId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"KmsKeyId\",\n                        \"smithy.api#documentation\": \"<p>The identifier for the symmetric KMS key that was used to create the encrypted AMI.</p>\",\n                        \"smithy.api#xmlName\": \"kmsKeyId\"\n                    }\n                },\n                \"LicenseType\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LicenseType\",\n                        \"smithy.api#documentation\": \"<p>The license type of the virtual machine.</p>\",\n                        \"smithy.api#xmlName\": \"licenseType\"\n                    }\n                },\n                \"Platform\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Platform\",\n                        \"smithy.api#documentation\": \"<p>The operating system of the virtual machine.</p>\",\n                        \"smithy.api#xmlName\": \"platform\"\n                    }\n                },\n                \"Progress\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Progress\",\n                        \"smithy.api#documentation\": \"<p>The progress of the task.</p>\",\n                        \"smithy.api#xmlName\": \"progress\"\n                    }\n                },\n                \"SnapshotDetails\": {\n                    \"target\": \"com.amazonaws.ec2#SnapshotDetailList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SnapshotDetailSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the snapshots.</p>\",\n                        \"smithy.api#xmlName\": \"snapshotDetailSet\"\n                    }\n                },\n                \"Status\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Status\",\n                        \"smithy.api#documentation\": \"<p>A brief status of the task.</p>\",\n                        \"smithy.api#xmlName\": \"status\"\n                    }\n                },\n                \"StatusMessage\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"StatusMessage\",\n                        \"smithy.api#documentation\": \"<p>A detailed status message of the import task.</p>\",\n                        \"smithy.api#xmlName\": \"statusMessage\"\n                    }\n                },\n                \"LicenseSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#ImportImageLicenseSpecificationListResponse\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LicenseSpecifications\",\n                        \"smithy.api#documentation\": \"<p>The ARNs of the license configurations.</p>\",\n                        \"smithy.api#xmlName\": \"licenseSpecifications\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>Any tags assigned to the import image task.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                },\n                \"UsageOperation\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"UsageOperation\",\n                        \"smithy.api#documentation\": \"<p>The usage operation value.</p>\",\n                        \"smithy.api#xmlName\": \"usageOperation\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ImportImageTask\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Architecture\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Architecture\",\n                        \"smithy.api#documentation\": \"<p>The architecture of the virtual machine.</p>\\n         <p>Valid values: <code>i386</code> | <code>x86_64</code> | <code>arm64</code>\\n         </p>\",\n                        \"smithy.api#xmlName\": \"architecture\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Description\",\n                        \"smithy.api#documentation\": \"<p>A description of the import task.</p>\",\n                        \"smithy.api#xmlName\": \"description\"\n                    }\n                },\n                \"Encrypted\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Encrypted\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether the image is encrypted.</p>\",\n                        \"smithy.api#xmlName\": \"encrypted\"\n                    }\n                },\n                \"Hypervisor\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Hypervisor\",\n                        \"smithy.api#documentation\": \"<p>The target hypervisor for the import task.</p>\\n         <p>Valid values: <code>xen</code>\\n         </p>\",\n                        \"smithy.api#xmlName\": \"hypervisor\"\n                    }\n                },\n                \"ImageId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ImageId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Amazon Machine Image (AMI) of the imported virtual machine.</p>\",\n                        \"smithy.api#xmlName\": \"imageId\"\n                    }\n                },\n                \"ImportTaskId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ImportTaskId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the import image task.</p>\",\n                        \"smithy.api#xmlName\": \"importTaskId\"\n                    }\n                },\n                \"KmsKeyId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"KmsKeyId\",\n                        \"smithy.api#documentation\": \"<p>The identifier for the KMS key that was used to create the encrypted image.</p>\",\n                        \"smithy.api#xmlName\": \"kmsKeyId\"\n                    }\n                },\n                \"LicenseType\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LicenseType\",\n                        \"smithy.api#documentation\": \"<p>The license type of the virtual machine.</p>\",\n                        \"smithy.api#xmlName\": \"licenseType\"\n                    }\n                },\n                \"Platform\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Platform\",\n                        \"smithy.api#documentation\": \"<p>The description string for the import image task.</p>\",\n                        \"smithy.api#xmlName\": \"platform\"\n                    }\n                },\n                \"Progress\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Progress\",\n                        \"smithy.api#documentation\": \"<p>The percentage of progress of the import image task.</p>\",\n                        \"smithy.api#xmlName\": \"progress\"\n                    }\n                },\n                \"SnapshotDetails\": {\n                    \"target\": \"com.amazonaws.ec2#SnapshotDetailList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SnapshotDetailSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the snapshots.</p>\",\n                        \"smithy.api#xmlName\": \"snapshotDetailSet\"\n                    }\n                },\n                \"Status\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Status\",\n                        \"smithy.api#documentation\": \"<p>A brief status for the import image task.</p>\",\n                        \"smithy.api#xmlName\": \"status\"\n                    }\n                },\n                \"StatusMessage\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"StatusMessage\",\n                        \"smithy.api#documentation\": \"<p>A descriptive status message for the import image task.</p>\",\n                        \"smithy.api#xmlName\": \"statusMessage\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>The tags for the import image task.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                },\n                \"LicenseSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#ImportImageLicenseSpecificationListResponse\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LicenseSpecifications\",\n                        \"smithy.api#documentation\": \"<p>The ARNs of the license configurations that are associated with the import image task.</p>\",\n                        \"smithy.api#xmlName\": \"licenseSpecifications\"\n                    }\n                },\n                \"UsageOperation\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"UsageOperation\",\n                        \"smithy.api#documentation\": \"<p>The usage operation value.</p>\",\n                        \"smithy.api#xmlName\": \"usageOperation\"\n                    }\n                },\n                \"BootMode\": {\n                    \"target\": \"com.amazonaws.ec2#BootModeValues\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"BootMode\",\n                        \"smithy.api#documentation\": \"<p>The boot mode of the virtual machine.</p>\",\n                        \"smithy.api#xmlName\": \"bootMode\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes an import image task.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ImportImageTaskId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#ImportImageTaskList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ImportImageTask\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ImportInstance\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ImportInstanceRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ImportInstanceResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>We recommend that you use the <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ImportImage.html\\\">\\n                  <code>ImportImage</code>\\n               </a>\\n    API instead. For more information, see <a href=\\\"https://docs.aws.amazon.com/vm-import/latest/userguide/vmimport-image-import.html\\\">Importing a VM as an image using VM\\n     Import/Export</a> in the <i>VM Import/Export User Guide</i>.</p>\\n         </note>\\n         <p>Creates an import instance task using metadata from the specified disk image.</p>\\n         <p>This API action supports only single-volume VMs. To import multi-volume VMs, use <a>ImportImage</a>\\n   instead.</p>\\n         <p>For information about the import manifest referenced by this API action, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/manifest.html\\\">VM Import Manifest</a>.</p>\\n         <p>This API action is not supported by the Command Line Interface (CLI).</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ImportInstanceLaunchSpecification\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Architecture\": {\n                    \"target\": \"com.amazonaws.ec2#ArchitectureValues\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Architecture\",\n                        \"smithy.api#documentation\": \"<p>The architecture of the instance.</p>\",\n                        \"smithy.api#xmlName\": \"architecture\"\n                    }\n                },\n                \"GroupNames\": {\n                    \"target\": \"com.amazonaws.ec2#SecurityGroupStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The security group names.</p>\",\n                        \"smithy.api#xmlName\": \"GroupName\"\n                    }\n                },\n                \"GroupIds\": {\n                    \"target\": \"com.amazonaws.ec2#SecurityGroupIdStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The security group IDs.</p>\",\n                        \"smithy.api#xmlName\": \"GroupId\"\n                    }\n                },\n                \"AdditionalInfo\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AdditionalInfo\",\n                        \"smithy.api#documentation\": \"<p>Reserved.</p>\",\n                        \"smithy.api#xmlName\": \"additionalInfo\"\n                    }\n                },\n                \"UserData\": {\n                    \"target\": \"com.amazonaws.ec2#UserData\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"UserData\",\n                        \"smithy.api#documentation\": \"<p>The Base64-encoded user data to make available to the instance.</p>\",\n                        \"smithy.api#xmlName\": \"userData\"\n                    }\n                },\n                \"InstanceType\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceType\",\n                        \"smithy.api#documentation\": \"<p>The instance type. For more information about the instance types that you can import, see <a href=\\\"https://docs.aws.amazon.com/vm-import/latest/userguide/vmie_prereqs.html#vmimport-instance-types\\\">Instance Types</a> in the\\n   VM Import/Export User Guide.</p>\",\n                        \"smithy.api#xmlName\": \"instanceType\"\n                    }\n                },\n                \"Placement\": {\n                    \"target\": \"com.amazonaws.ec2#Placement\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Placement\",\n                        \"smithy.api#documentation\": \"<p>The placement information for the instance.</p>\",\n                        \"smithy.api#xmlName\": \"placement\"\n                    }\n                },\n                \"Monitoring\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Monitoring\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether monitoring is enabled.</p>\",\n                        \"smithy.api#xmlName\": \"monitoring\"\n                    }\n                },\n                \"SubnetId\": {\n                    \"target\": \"com.amazonaws.ec2#SubnetId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SubnetId\",\n                        \"smithy.api#documentation\": \"<p>[EC2-VPC] The ID of the subnet in which to launch the instance.</p>\",\n                        \"smithy.api#xmlName\": \"subnetId\"\n                    }\n                },\n                \"InstanceInitiatedShutdownBehavior\": {\n                    \"target\": \"com.amazonaws.ec2#ShutdownBehavior\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceInitiatedShutdownBehavior\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether an instance stops or terminates when you initiate shutdown from the instance (using the\\n   operating system command for system shutdown).</p>\",\n                        \"smithy.api#xmlName\": \"instanceInitiatedShutdownBehavior\"\n                    }\n                },\n                \"PrivateIpAddress\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PrivateIpAddress\",\n                        \"smithy.api#documentation\": \"<p>[EC2-VPC] An available IP address from the IP address range of the subnet.</p>\",\n                        \"smithy.api#xmlName\": \"privateIpAddress\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the launch specification for VM import.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ImportInstanceRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Description\",\n                        \"smithy.api#documentation\": \"<p>A description for the instance being imported.</p>\",\n                        \"smithy.api#xmlName\": \"description\"\n                    }\n                },\n                \"LaunchSpecification\": {\n                    \"target\": \"com.amazonaws.ec2#ImportInstanceLaunchSpecification\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LaunchSpecification\",\n                        \"smithy.api#documentation\": \"<p>The launch specification.</p>\",\n                        \"smithy.api#xmlName\": \"launchSpecification\"\n                    }\n                },\n                \"DiskImages\": {\n                    \"target\": \"com.amazonaws.ec2#DiskImageList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DiskImage\",\n                        \"smithy.api#documentation\": \"<p>The disk image.</p>\",\n                        \"smithy.api#xmlName\": \"diskImage\"\n                    }\n                },\n                \"Platform\": {\n                    \"target\": \"com.amazonaws.ec2#PlatformValues\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Platform\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The instance operating system.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"platform\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ImportInstanceResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConversionTask\": {\n                    \"target\": \"com.amazonaws.ec2#ConversionTask\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ConversionTask\",\n                        \"smithy.api#documentation\": \"<p>Information about the conversion task.</p>\",\n                        \"smithy.api#xmlName\": \"conversionTask\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ImportInstanceTaskDetails\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Description\",\n                        \"smithy.api#documentation\": \"<p>A description of the task.</p>\",\n                        \"smithy.api#xmlName\": \"description\"\n                    }\n                },\n                \"InstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the instance.</p>\",\n                        \"smithy.api#xmlName\": \"instanceId\"\n                    }\n                },\n                \"Platform\": {\n                    \"target\": \"com.amazonaws.ec2#PlatformValues\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Platform\",\n                        \"smithy.api#documentation\": \"<p>The instance operating system.</p>\",\n                        \"smithy.api#xmlName\": \"platform\"\n                    }\n                },\n                \"Volumes\": {\n                    \"target\": \"com.amazonaws.ec2#ImportInstanceVolumeDetailSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Volumes\",\n                        \"smithy.api#documentation\": \"<p>The volumes.</p>\",\n                        \"smithy.api#xmlName\": \"volumes\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes an import instance task.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ImportInstanceVolumeDetailItem\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AvailabilityZone\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AvailabilityZone\",\n                        \"smithy.api#documentation\": \"<p>The Availability Zone where the resulting instance will reside.</p>\",\n                        \"smithy.api#xmlName\": \"availabilityZone\"\n                    }\n                },\n                \"AvailabilityZoneId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AvailabilityZoneId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Availability Zone where the resulting instance will reside.</p>\",\n                        \"smithy.api#xmlName\": \"availabilityZoneId\"\n                    }\n                },\n                \"BytesConverted\": {\n                    \"target\": \"com.amazonaws.ec2#Long\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"BytesConverted\",\n                        \"smithy.api#documentation\": \"<p>The number of bytes converted so far.</p>\",\n                        \"smithy.api#xmlName\": \"bytesConverted\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Description\",\n                        \"smithy.api#documentation\": \"<p>A description of the task.</p>\",\n                        \"smithy.api#xmlName\": \"description\"\n                    }\n                },\n                \"Image\": {\n                    \"target\": \"com.amazonaws.ec2#DiskImageDescription\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Image\",\n                        \"smithy.api#documentation\": \"<p>The image.</p>\",\n                        \"smithy.api#xmlName\": \"image\"\n                    }\n                },\n                \"Status\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Status\",\n                        \"smithy.api#documentation\": \"<p>The status of the import of this particular disk image.</p>\",\n                        \"smithy.api#xmlName\": \"status\"\n                    }\n                },\n                \"StatusMessage\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"StatusMessage\",\n                        \"smithy.api#documentation\": \"<p>The status information or errors related to the disk image.</p>\",\n                        \"smithy.api#xmlName\": \"statusMessage\"\n                    }\n                },\n                \"Volume\": {\n                    \"target\": \"com.amazonaws.ec2#DiskImageVolumeDescription\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Volume\",\n                        \"smithy.api#documentation\": \"<p>The volume.</p>\",\n                        \"smithy.api#xmlName\": \"volume\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes an import volume task.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ImportInstanceVolumeDetailSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ImportInstanceVolumeDetailItem\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ImportKeyPair\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ImportKeyPairRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ImportKeyPairResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Imports the public key from an RSA or ED25519 key pair that you created using a third-party tool. \\n        You give Amazon Web Services only the public key. The private key is never transferred between you and Amazon Web Services.</p>\\n         <p>For more information about the requirements for importing a key pair, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/create-key-pairs.html#how-to-generate-your-own-key-and-import-it-to-aws\\\">Create a key pair and import the public key to Amazon EC2</a> in the <i>Amazon EC2 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ImportKeyPairRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags to apply to the imported key pair.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"KeyName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"KeyName\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>A unique name for the key pair.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"keyName\"\n                    }\n                },\n                \"PublicKeyMaterial\": {\n                    \"target\": \"com.amazonaws.ec2#Blob\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PublicKeyMaterial\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The public key.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"publicKeyMaterial\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ImportKeyPairResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"KeyFingerprint\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"KeyFingerprint\",\n                        \"smithy.api#documentation\": \"<ul>\\n            <li>\\n               <p>For RSA key pairs, the key fingerprint is the MD5 public key fingerprint as specified in section 4 of RFC 4716.</p>\\n            </li>\\n            <li>\\n               <p>For ED25519 key pairs, the key fingerprint is the base64-encoded SHA-256 digest, which is the default for OpenSSH, starting with <a href=\\\"http://www.openssh.com/txt/release-6.8\\\">OpenSSH 6.8</a>.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"keyFingerprint\"\n                    }\n                },\n                \"KeyName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"KeyName\",\n                        \"smithy.api#documentation\": \"<p>The key pair name that you provided.</p>\",\n                        \"smithy.api#xmlName\": \"keyName\"\n                    }\n                },\n                \"KeyPairId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"KeyPairId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the resulting key pair.</p>\",\n                        \"smithy.api#xmlName\": \"keyPairId\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>The tags applied to the imported key pair.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ImportManifestUrl\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#sensitive\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ImportSnapshot\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ImportSnapshotRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ImportSnapshotResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Imports a disk into an EBS snapshot.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/vm-import/latest/userguide/vmimport-import-snapshot.html\\\">Importing a disk as a snapshot using VM Import/Export</a> in the \\n   <i>VM Import/Export User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ImportSnapshotRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ClientData\": {\n                    \"target\": \"com.amazonaws.ec2#ClientData\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The client-specific data.</p>\"\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Token to enable idempotency for VM import requests.</p>\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The description string for the import snapshot task.</p>\"\n                    }\n                },\n                \"DiskContainer\": {\n                    \"target\": \"com.amazonaws.ec2#SnapshotDiskContainer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Information about the disk container.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"Encrypted\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies whether the destination snapshot of the imported image should be encrypted. The default KMS key for EBS is\\n   used unless you specify a non-default KMS key using <code>KmsKeyId</code>. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EBSEncryption.html\\\">Amazon EBS Encryption</a> in the\\n    <i>Amazon Elastic Compute Cloud User Guide</i>.</p>\"\n                    }\n                },\n                \"KmsKeyId\": {\n                    \"target\": \"com.amazonaws.ec2#KmsKeyId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An identifier for the symmetric KMS key to use when creating the\\n   encrypted snapshot. This parameter is only required if you want to use a non-default KMS key; if this\\n   parameter is not specified, the default KMS key for EBS is used. If a <code>KmsKeyId</code> is\\n   specified, the <code>Encrypted</code> flag must also be set. </p>\\n         <p>The KMS key identifier may be provided in any of the following formats: </p>\\n         <ul>\\n            <li>\\n               <p>Key ID</p>\\n            </li>\\n            <li>\\n               <p>Key alias</p>\\n            </li>\\n            <li>\\n               <p>ARN using key ID. The ID ARN contains the <code>arn:aws:kms</code> namespace, followed by the Region of the key, the Amazon Web Services account ID of the key owner, the <code>key</code> namespace, and then the key ID. For example, arn:aws:kms:<i>us-east-1</i>:<i>012345678910</i>:key/<i>abcd1234-a123-456a-a12b-a123b4cd56ef</i>.</p>\\n            </li>\\n            <li>\\n               <p>ARN using key alias. The alias ARN contains the <code>arn:aws:kms</code> namespace, followed by the Region of the key, the Amazon Web Services account ID of the key owner, the <code>alias</code> namespace, and then the key alias. For example, arn:aws:kms:<i>us-east-1</i>:<i>012345678910</i>:alias/<i>ExampleAlias</i>. </p>\\n            </li>\\n         </ul>\\n         <p>Amazon Web Services parses <code>KmsKeyId</code> asynchronously, meaning that the action you call may appear to complete even\\n   though you provided an invalid identifier. This action will eventually report failure. </p>\\n         <p>The specified KMS key must exist in the Region that the snapshot is being copied to.</p>\\n         <p>Amazon EBS does not support asymmetric KMS keys.</p>\"\n                    }\n                },\n                \"RoleName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the role to use when not using the default role, 'vmimport'.</p>\"\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags to apply to the import snapshot task during creation.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ImportSnapshotResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Description\",\n                        \"smithy.api#documentation\": \"<p>A description of the import snapshot task.</p>\",\n                        \"smithy.api#xmlName\": \"description\"\n                    }\n                },\n                \"ImportTaskId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ImportTaskId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the import snapshot task.</p>\",\n                        \"smithy.api#xmlName\": \"importTaskId\"\n                    }\n                },\n                \"SnapshotTaskDetail\": {\n                    \"target\": \"com.amazonaws.ec2#SnapshotTaskDetail\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SnapshotTaskDetail\",\n                        \"smithy.api#documentation\": \"<p>Information about the import snapshot task.</p>\",\n                        \"smithy.api#xmlName\": \"snapshotTaskDetail\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>Any tags assigned to the import snapshot task.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ImportSnapshotTask\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Description\",\n                        \"smithy.api#documentation\": \"<p>A description of the import snapshot task.</p>\",\n                        \"smithy.api#xmlName\": \"description\"\n                    }\n                },\n                \"ImportTaskId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ImportTaskId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the import snapshot task.</p>\",\n                        \"smithy.api#xmlName\": \"importTaskId\"\n                    }\n                },\n                \"SnapshotTaskDetail\": {\n                    \"target\": \"com.amazonaws.ec2#SnapshotTaskDetail\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SnapshotTaskDetail\",\n                        \"smithy.api#documentation\": \"<p>Describes an import snapshot task.</p>\",\n                        \"smithy.api#xmlName\": \"snapshotTaskDetail\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>The tags for the import snapshot task.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes an import snapshot task.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ImportSnapshotTaskId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#ImportSnapshotTaskIdList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ImportSnapshotTaskId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"ImportTaskId\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ImportSnapshotTaskList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ImportSnapshotTask\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ImportTaskId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#ImportTaskIdList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ImportImageTaskId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"ImportTaskId\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ImportVolume\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ImportVolumeRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ImportVolumeResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>This API action supports only single-volume VMs. To import multi-volume VMs, use \\n   <a>ImportImage</a> instead. To import a disk to a snapshot, use\\n   <a>ImportSnapshot</a> instead.</p>\\n         </note>\\n         <p>Creates an import volume task using metadata from the specified disk image.</p>\\n         <p>For information about the import manifest referenced by this API action, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/manifest.html\\\">VM Import Manifest</a>.</p>\\n         <p>This API action is not supported by the Command Line Interface (CLI).</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ImportVolumeRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AvailabilityZoneId\": {\n                    \"target\": \"com.amazonaws.ec2#AvailabilityZoneId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the Availability Zone for the resulting EBS volume.</p>\\n         <p>Either <code>AvailabilityZone</code> or <code>AvailabilityZoneId</code> must be specified,\\n   but not both.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"AvailabilityZone\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AvailabilityZone\",\n                        \"smithy.api#documentation\": \"<p>The Availability Zone for the resulting EBS volume.</p>\\n         <p>Either <code>AvailabilityZone</code> or <code>AvailabilityZoneId</code> must be specified,\\n   but not both.</p>\",\n                        \"smithy.api#xmlName\": \"availabilityZone\"\n                    }\n                },\n                \"Image\": {\n                    \"target\": \"com.amazonaws.ec2#DiskImageDetail\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Image\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The disk image.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"image\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Description\",\n                        \"smithy.api#documentation\": \"<p>A description of the volume.</p>\",\n                        \"smithy.api#xmlName\": \"description\"\n                    }\n                },\n                \"Volume\": {\n                    \"target\": \"com.amazonaws.ec2#VolumeDetail\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Volume\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The volume size.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"volume\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ImportVolumeResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConversionTask\": {\n                    \"target\": \"com.amazonaws.ec2#ConversionTask\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ConversionTask\",\n                        \"smithy.api#documentation\": \"<p>Information about the conversion task.</p>\",\n                        \"smithy.api#xmlName\": \"conversionTask\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ImportVolumeTaskDetails\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AvailabilityZone\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AvailabilityZone\",\n                        \"smithy.api#documentation\": \"<p>The Availability Zone where the resulting volume will reside.</p>\",\n                        \"smithy.api#xmlName\": \"availabilityZone\"\n                    }\n                },\n                \"AvailabilityZoneId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AvailabilityZoneId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Availability Zone where the resulting volume will reside.</p>\",\n                        \"smithy.api#xmlName\": \"availabilityZoneId\"\n                    }\n                },\n                \"BytesConverted\": {\n                    \"target\": \"com.amazonaws.ec2#Long\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"BytesConverted\",\n                        \"smithy.api#documentation\": \"<p>The number of bytes converted so far.</p>\",\n                        \"smithy.api#xmlName\": \"bytesConverted\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Description\",\n                        \"smithy.api#documentation\": \"<p>The description you provided when starting the import volume task.</p>\",\n                        \"smithy.api#xmlName\": \"description\"\n                    }\n                },\n                \"Image\": {\n                    \"target\": \"com.amazonaws.ec2#DiskImageDescription\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Image\",\n                        \"smithy.api#documentation\": \"<p>The image.</p>\",\n                        \"smithy.api#xmlName\": \"image\"\n                    }\n                },\n                \"Volume\": {\n                    \"target\": \"com.amazonaws.ec2#DiskImageVolumeDescription\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Volume\",\n                        \"smithy.api#documentation\": \"<p>The volume.</p>\",\n                        \"smithy.api#xmlName\": \"volume\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes an import volume task.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#InferenceAcceleratorInfo\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Accelerators\": {\n                    \"target\": \"com.amazonaws.ec2#InferenceDeviceInfoList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Accelerators\",\n                        \"smithy.api#documentation\": \"<p>Describes the Inference accelerators for the instance type.</p>\",\n                        \"smithy.api#xmlName\": \"accelerators\"\n                    }\n                },\n                \"TotalInferenceMemoryInMiB\": {\n                    \"target\": \"com.amazonaws.ec2#totalInferenceMemory\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TotalInferenceMemoryInMiB\",\n                        \"smithy.api#documentation\": \"<p>The total size of the memory for the inference accelerators for the instance type, in\\n   MiB.</p>\",\n                        \"smithy.api#xmlName\": \"totalInferenceMemoryInMiB\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>Amazon Elastic Inference is no longer available.</p>\\n         </note>\\n         <p>Describes the Inference accelerators for the instance type.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#InferenceDeviceCount\": {\n            \"type\": \"integer\"\n        },\n        \"com.amazonaws.ec2#InferenceDeviceInfo\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Count\": {\n                    \"target\": \"com.amazonaws.ec2#InferenceDeviceCount\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Count\",\n                        \"smithy.api#documentation\": \"<p>The number of Inference accelerators for the instance type.</p>\",\n                        \"smithy.api#xmlName\": \"count\"\n                    }\n                },\n                \"Name\": {\n                    \"target\": \"com.amazonaws.ec2#InferenceDeviceName\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Name\",\n                        \"smithy.api#documentation\": \"<p>The name of the Inference accelerator.</p>\",\n                        \"smithy.api#xmlName\": \"name\"\n                    }\n                },\n                \"Manufacturer\": {\n                    \"target\": \"com.amazonaws.ec2#InferenceDeviceManufacturerName\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Manufacturer\",\n                        \"smithy.api#documentation\": \"<p>The manufacturer of the Inference accelerator.</p>\",\n                        \"smithy.api#xmlName\": \"manufacturer\"\n                    }\n                },\n                \"MemoryInfo\": {\n                    \"target\": \"com.amazonaws.ec2#InferenceDeviceMemoryInfo\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MemoryInfo\",\n                        \"smithy.api#documentation\": \"<p>Describes the memory available to the inference accelerator.</p>\",\n                        \"smithy.api#xmlName\": \"memoryInfo\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>Amazon Elastic Inference is no longer available.</p>\\n         </note>\\n         <p>Describes the Inference accelerators for the instance type.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#InferenceDeviceInfoList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#InferenceDeviceInfo\"\n            }\n        },\n        \"com.amazonaws.ec2#InferenceDeviceManufacturerName\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#InferenceDeviceMemoryInfo\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SizeInMiB\": {\n                    \"target\": \"com.amazonaws.ec2#InferenceDeviceMemorySize\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SizeInMiB\",\n                        \"smithy.api#documentation\": \"<p>The size of the memory available to the inference accelerator, in MiB.</p>\",\n                        \"smithy.api#xmlName\": \"sizeInMiB\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>Amazon Elastic Inference is no longer available.</p>\\n         </note>\\n         <p>Describes the memory available to the inference accelerator.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#InferenceDeviceMemorySize\": {\n            \"type\": \"integer\"\n        },\n        \"com.amazonaws.ec2#InferenceDeviceName\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#InitializationStatusDetails\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InitializationType\": {\n                    \"target\": \"com.amazonaws.ec2#InitializationType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InitializationType\",\n                        \"smithy.api#documentation\": \"<p>The method used for volume initialization. Possible values include:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>default</code> - Volume initialized using the default volume initialization \\n          rate or fast snapshot restore.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>provisioned-rate</code> - Volume initialized using an Amazon EBS Provisioned \\n          Rate for Volume Initialization.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"initializationType\"\n                    }\n                },\n                \"Progress\": {\n                    \"target\": \"com.amazonaws.ec2#Long\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Progress\",\n                        \"smithy.api#documentation\": \"<p>The current volume initialization progress as a percentage (0-100). Returns <code>100</code> \\n      when volume initialization has completed.</p>\",\n                        \"smithy.api#xmlName\": \"progress\"\n                    }\n                },\n                \"EstimatedTimeToCompleteInSeconds\": {\n                    \"target\": \"com.amazonaws.ec2#Long\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EstimatedTimeToCompleteInSeconds\",\n                        \"smithy.api#documentation\": \"<p>The estimated remaining time, in seconds, for volume initialization to complete. Returns \\n      <code>0</code> when volume initialization has completed.</p>\\n         <p>Only available for volumes created with Amazon EBS Provisioned Rate for Volume Initialization.</p>\",\n                        \"smithy.api#xmlName\": \"estimatedTimeToCompleteInSeconds\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about the volume initialization. For more information, see <a href=\\\"https://docs.aws.amazon.com/ebs/latest/userguide/initalize-volume.html\\\">Initialize Amazon EBS volumes</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#InitializationType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"default\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"default\"\n                    }\n                },\n                \"provisioned_rate\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"provisioned-rate\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#InsideCidrBlocksStringList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#String\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#Instance\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Architecture\": {\n                    \"target\": \"com.amazonaws.ec2#ArchitectureValues\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Architecture\",\n                        \"smithy.api#documentation\": \"<p>The architecture of the image.</p>\",\n                        \"smithy.api#xmlName\": \"architecture\"\n                    }\n                },\n                \"BlockDeviceMappings\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceBlockDeviceMappingList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"BlockDeviceMapping\",\n                        \"smithy.api#documentation\": \"<p>Any block device mapping entries for the instance.</p>\",\n                        \"smithy.api#xmlName\": \"blockDeviceMapping\"\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ClientToken\",\n                        \"smithy.api#documentation\": \"<p>The idempotency token you provided when you launched the instance, if\\n            applicable.</p>\",\n                        \"smithy.api#xmlName\": \"clientToken\"\n                    }\n                },\n                \"EbsOptimized\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EbsOptimized\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether the instance is optimized for Amazon EBS I/O. This optimization\\n            provides dedicated throughput to Amazon EBS and an optimized configuration stack to\\n            provide optimal I/O performance. This optimization isn't available with all instance\\n            types. Additional usage charges apply when using an EBS Optimized instance.</p>\",\n                        \"smithy.api#xmlName\": \"ebsOptimized\"\n                    }\n                },\n                \"EnaSupport\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EnaSupport\",\n                        \"smithy.api#documentation\": \"<p>Specifies whether enhanced networking with ENA is enabled.</p>\",\n                        \"smithy.api#xmlName\": \"enaSupport\"\n                    }\n                },\n                \"Hypervisor\": {\n                    \"target\": \"com.amazonaws.ec2#HypervisorType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Hypervisor\",\n                        \"smithy.api#documentation\": \"<p>The hypervisor type of the instance. The value <code>xen</code> is used for both Xen\\n            and Nitro hypervisors.</p>\",\n                        \"smithy.api#xmlName\": \"hypervisor\"\n                    }\n                },\n                \"IamInstanceProfile\": {\n                    \"target\": \"com.amazonaws.ec2#IamInstanceProfile\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IamInstanceProfile\",\n                        \"smithy.api#documentation\": \"<p>The IAM instance profile associated with the instance, if\\n            applicable.</p>\",\n                        \"smithy.api#xmlName\": \"iamInstanceProfile\"\n                    }\n                },\n                \"InstanceLifecycle\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceLifecycleType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceLifecycle\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether this is a Spot Instance or a Scheduled Instance.</p>\",\n                        \"smithy.api#xmlName\": \"instanceLifecycle\"\n                    }\n                },\n                \"ElasticGpuAssociations\": {\n                    \"target\": \"com.amazonaws.ec2#ElasticGpuAssociationList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ElasticGpuAssociationSet\",\n                        \"smithy.api#documentation\": \"<p>Deprecated.</p>\\n         <note>\\n            <p>Amazon Elastic Graphics reached end of life on January 8, 2024.</p>\\n         </note>\",\n                        \"smithy.api#xmlName\": \"elasticGpuAssociationSet\"\n                    }\n                },\n                \"ElasticInferenceAcceleratorAssociations\": {\n                    \"target\": \"com.amazonaws.ec2#ElasticInferenceAcceleratorAssociationList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ElasticInferenceAcceleratorAssociationSet\",\n                        \"smithy.api#documentation\": \"<p>Deprecated</p>\\n         <note>\\n            <p>Amazon Elastic Inference is no longer available.</p>\\n         </note>\",\n                        \"smithy.api#xmlName\": \"elasticInferenceAcceleratorAssociationSet\"\n                    }\n                },\n                \"NetworkInterfaces\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceNetworkInterfaceList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkInterfaceSet\",\n                        \"smithy.api#documentation\": \"<p>The network interfaces for the instance.</p>\",\n                        \"smithy.api#xmlName\": \"networkInterfaceSet\"\n                    }\n                },\n                \"OutpostArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OutpostArn\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the Outpost.</p>\",\n                        \"smithy.api#xmlName\": \"outpostArn\"\n                    }\n                },\n                \"RootDeviceName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RootDeviceName\",\n                        \"smithy.api#documentation\": \"<p>The device name of the root device volume (for example,\\n            <code>/dev/sda1</code>).</p>\",\n                        \"smithy.api#xmlName\": \"rootDeviceName\"\n                    }\n                },\n                \"RootDeviceType\": {\n                    \"target\": \"com.amazonaws.ec2#DeviceType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RootDeviceType\",\n                        \"smithy.api#documentation\": \"<p>The root device type used by the AMI. The AMI can use an EBS volume or an instance\\n            store volume.</p>\",\n                        \"smithy.api#xmlName\": \"rootDeviceType\"\n                    }\n                },\n                \"SecurityGroups\": {\n                    \"target\": \"com.amazonaws.ec2#GroupIdentifierList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"GroupSet\",\n                        \"smithy.api#documentation\": \"<p>The security groups for the instance.</p>\",\n                        \"smithy.api#xmlName\": \"groupSet\"\n                    }\n                },\n                \"SourceDestCheck\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SourceDestCheck\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether source/destination checking is enabled.</p>\",\n                        \"smithy.api#xmlName\": \"sourceDestCheck\"\n                    }\n                },\n                \"SpotInstanceRequestId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SpotInstanceRequestId\",\n                        \"smithy.api#documentation\": \"<p>If the request is a Spot Instance request, the ID of the request.</p>\",\n                        \"smithy.api#xmlName\": \"spotInstanceRequestId\"\n                    }\n                },\n                \"SriovNetSupport\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SriovNetSupport\",\n                        \"smithy.api#documentation\": \"<p>Specifies whether enhanced networking with the Intel 82599 Virtual Function interface\\n            is enabled.</p>\",\n                        \"smithy.api#xmlName\": \"sriovNetSupport\"\n                    }\n                },\n                \"StateReason\": {\n                    \"target\": \"com.amazonaws.ec2#StateReason\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"StateReason\",\n                        \"smithy.api#documentation\": \"<p>The reason for the most recent state transition.</p>\",\n                        \"smithy.api#xmlName\": \"stateReason\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>Any tags assigned to the instance.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                },\n                \"VirtualizationType\": {\n                    \"target\": \"com.amazonaws.ec2#VirtualizationType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VirtualizationType\",\n                        \"smithy.api#documentation\": \"<p>The virtualization type of the instance.</p>\",\n                        \"smithy.api#xmlName\": \"virtualizationType\"\n                    }\n                },\n                \"CpuOptions\": {\n                    \"target\": \"com.amazonaws.ec2#CpuOptions\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CpuOptions\",\n                        \"smithy.api#documentation\": \"<p>The CPU options for the instance.</p>\",\n                        \"smithy.api#xmlName\": \"cpuOptions\"\n                    }\n                },\n                \"CapacityBlockId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CapacityBlockId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Capacity Block.</p>\\n         <note>\\n            <p>For P5 instances, a Capacity Block ID refers to a group of instances. For Trn2u\\n                instances, a capacity block ID refers to an EC2 UltraServer.</p>\\n         </note>\",\n                        \"smithy.api#xmlName\": \"capacityBlockId\"\n                    }\n                },\n                \"CapacityReservationId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CapacityReservationId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Capacity Reservation.</p>\",\n                        \"smithy.api#xmlName\": \"capacityReservationId\"\n                    }\n                },\n                \"CapacityReservationSpecification\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityReservationSpecificationResponse\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CapacityReservationSpecification\",\n                        \"smithy.api#documentation\": \"<p>Information about the Capacity Reservation targeting option.</p>\",\n                        \"smithy.api#xmlName\": \"capacityReservationSpecification\"\n                    }\n                },\n                \"HibernationOptions\": {\n                    \"target\": \"com.amazonaws.ec2#HibernationOptions\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"HibernationOptions\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether the instance is enabled for hibernation.</p>\",\n                        \"smithy.api#xmlName\": \"hibernationOptions\"\n                    }\n                },\n                \"Licenses\": {\n                    \"target\": \"com.amazonaws.ec2#LicenseList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LicenseSet\",\n                        \"smithy.api#documentation\": \"<p>The license configurations for the instance.</p>\",\n                        \"smithy.api#xmlName\": \"licenseSet\"\n                    }\n                },\n                \"MetadataOptions\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceMetadataOptionsResponse\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MetadataOptions\",\n                        \"smithy.api#documentation\": \"<p>The metadata options for the instance.</p>\",\n                        \"smithy.api#xmlName\": \"metadataOptions\"\n                    }\n                },\n                \"EnclaveOptions\": {\n                    \"target\": \"com.amazonaws.ec2#EnclaveOptions\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EnclaveOptions\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether the instance is enabled for Amazon Web Services Nitro\\n            Enclaves.</p>\",\n                        \"smithy.api#xmlName\": \"enclaveOptions\"\n                    }\n                },\n                \"BootMode\": {\n                    \"target\": \"com.amazonaws.ec2#BootModeValues\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"BootMode\",\n                        \"smithy.api#documentation\": \"<p>The boot mode that was specified by the AMI. If the value is <code>uefi-preferred</code>, \\n            the AMI supports both UEFI and Legacy BIOS. The <code>currentInstanceBootMode</code> parameter \\n            is the boot mode that is used to boot the instance at launch or start.</p>\\n         <note>\\n            <p>The operating system contained in the AMI must be configured to support the specified boot mode.</p>\\n         </note>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ami-boot.html\\\">Boot modes</a> in the\\n                <i>Amazon EC2 User Guide</i>.</p>\",\n                        \"smithy.api#xmlName\": \"bootMode\"\n                    }\n                },\n                \"PlatformDetails\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PlatformDetails\",\n                        \"smithy.api#documentation\": \"<p>The platform details value for the instance. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/billing-info-fields.html\\\">AMI\\n                billing information fields</a> in the\\n            <i>Amazon EC2 User Guide</i>.</p>\",\n                        \"smithy.api#xmlName\": \"platformDetails\"\n                    }\n                },\n                \"UsageOperation\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"UsageOperation\",\n                        \"smithy.api#documentation\": \"<p>The usage operation value for the instance. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/billing-info-fields.html\\\">AMI\\n                billing information fields</a> in the\\n            <i>Amazon EC2 User Guide</i>.</p>\",\n                        \"smithy.api#xmlName\": \"usageOperation\"\n                    }\n                },\n                \"UsageOperationUpdateTime\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"UsageOperationUpdateTime\",\n                        \"smithy.api#documentation\": \"<p>The time that the usage operation was last updated.</p>\",\n                        \"smithy.api#xmlName\": \"usageOperationUpdateTime\"\n                    }\n                },\n                \"PrivateDnsNameOptions\": {\n                    \"target\": \"com.amazonaws.ec2#PrivateDnsNameOptionsResponse\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PrivateDnsNameOptions\",\n                        \"smithy.api#documentation\": \"<p>The options for the instance hostname.</p>\",\n                        \"smithy.api#xmlName\": \"privateDnsNameOptions\"\n                    }\n                },\n                \"Ipv6Address\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Ipv6Address\",\n                        \"smithy.api#documentation\": \"<p>The IPv6 address assigned to the instance.</p>\",\n                        \"smithy.api#xmlName\": \"ipv6Address\"\n                    }\n                },\n                \"TpmSupport\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TpmSupport\",\n                        \"smithy.api#documentation\": \"<p>If the instance is configured for NitroTPM support, the value is <code>v2.0</code>.\\n            For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/nitrotpm.html\\\">NitroTPM</a> in the\\n                <i>Amazon EC2 User Guide</i>.</p>\",\n                        \"smithy.api#xmlName\": \"tpmSupport\"\n                    }\n                },\n                \"MaintenanceOptions\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceMaintenanceOptions\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MaintenanceOptions\",\n                        \"smithy.api#documentation\": \"<p>Provides information on the recovery and maintenance options of your instance.</p>\",\n                        \"smithy.api#xmlName\": \"maintenanceOptions\"\n                    }\n                },\n                \"CurrentInstanceBootMode\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceBootModeValues\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CurrentInstanceBootMode\",\n                        \"smithy.api#documentation\": \"<p>The boot mode that is used to boot the instance at launch or start. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ami-boot.html\\\">Boot modes</a> in the\\n            <i>Amazon EC2 User Guide</i>.</p>\",\n                        \"smithy.api#xmlName\": \"currentInstanceBootMode\"\n                    }\n                },\n                \"NetworkPerformanceOptions\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceNetworkPerformanceOptions\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkPerformanceOptions\",\n                        \"smithy.api#documentation\": \"<p>Contains settings for the network performance options for your instance.</p>\",\n                        \"smithy.api#xmlName\": \"networkPerformanceOptions\"\n                    }\n                },\n                \"Operator\": {\n                    \"target\": \"com.amazonaws.ec2#OperatorResponse\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Operator\",\n                        \"smithy.api#documentation\": \"<p>The service provider that manages the instance.</p>\",\n                        \"smithy.api#xmlName\": \"operator\"\n                    }\n                },\n                \"InstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the instance.</p>\",\n                        \"smithy.api#xmlName\": \"instanceId\"\n                    }\n                },\n                \"ImageId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ImageId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the AMI used to launch the instance.</p>\",\n                        \"smithy.api#xmlName\": \"imageId\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceState\",\n                        \"smithy.api#documentation\": \"<p>The current state of the instance.</p>\",\n                        \"smithy.api#xmlName\": \"instanceState\"\n                    }\n                },\n                \"PrivateDnsName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PrivateDnsName\",\n                        \"smithy.api#documentation\": \"<p>[IPv4 only] The private DNS hostname name assigned to the instance. This DNS hostname\\n            can only be used inside the Amazon EC2 network. This name is not available until the\\n            instance enters the <code>running</code> state. </p>\\n         <p>The Amazon-provided DNS server resolves Amazon-provided private DNS\\n            hostnames if you've enabled DNS resolution and DNS hostnames in your VPC. If you are not\\n            using the Amazon-provided DNS server in your VPC, your custom domain name servers must\\n            resolve the hostname as appropriate.</p>\",\n                        \"smithy.api#xmlName\": \"privateDnsName\"\n                    }\n                },\n                \"PublicDnsName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DnsName\",\n                        \"smithy.api#documentation\": \"<p>The public DNS name assigned to the instance. This name is not available\\n            until the instance enters the <code>running</code> state. This name is only\\n            available if you've enabled DNS hostnames for your VPC. The format of this\\n            name depends on the <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/hostname-types.html#public-hostnames\\\">public hostname type</a>.</p>\",\n                        \"smithy.api#xmlName\": \"dnsName\"\n                    }\n                },\n                \"StateTransitionReason\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Reason\",\n                        \"smithy.api#documentation\": \"<p>The reason for the most recent state transition. This might be an empty string.</p>\",\n                        \"smithy.api#xmlName\": \"reason\"\n                    }\n                },\n                \"KeyName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"KeyName\",\n                        \"smithy.api#documentation\": \"<p>The name of the key pair, if this instance was launched with an associated key\\n            pair.</p>\",\n                        \"smithy.api#xmlName\": \"keyName\"\n                    }\n                },\n                \"AmiLaunchIndex\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AmiLaunchIndex\",\n                        \"smithy.api#documentation\": \"<p>The AMI launch index, which can be used to find this instance in the launch\\n            group.</p>\",\n                        \"smithy.api#xmlName\": \"amiLaunchIndex\"\n                    }\n                },\n                \"ProductCodes\": {\n                    \"target\": \"com.amazonaws.ec2#ProductCodeList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ProductCodes\",\n                        \"smithy.api#documentation\": \"<p>The product codes attached to this instance, if applicable.</p>\",\n                        \"smithy.api#xmlName\": \"productCodes\"\n                    }\n                },\n                \"InstanceType\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceType\",\n                        \"smithy.api#documentation\": \"<p>The instance type.</p>\",\n                        \"smithy.api#xmlName\": \"instanceType\"\n                    }\n                },\n                \"LaunchTime\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LaunchTime\",\n                        \"smithy.api#documentation\": \"<p>The time that the instance was last launched. To determine the time that instance was first launched,\\n            see the attachment time for the primary network interface.</p>\",\n                        \"smithy.api#xmlName\": \"launchTime\"\n                    }\n                },\n                \"Placement\": {\n                    \"target\": \"com.amazonaws.ec2#Placement\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Placement\",\n                        \"smithy.api#documentation\": \"<p>The location where the instance launched, if applicable.</p>\",\n                        \"smithy.api#xmlName\": \"placement\"\n                    }\n                },\n                \"KernelId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"KernelId\",\n                        \"smithy.api#documentation\": \"<p>The kernel associated with this instance, if applicable.</p>\",\n                        \"smithy.api#xmlName\": \"kernelId\"\n                    }\n                },\n                \"RamdiskId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RamdiskId\",\n                        \"smithy.api#documentation\": \"<p>The RAM disk associated with this instance, if applicable.</p>\",\n                        \"smithy.api#xmlName\": \"ramdiskId\"\n                    }\n                },\n                \"Platform\": {\n                    \"target\": \"com.amazonaws.ec2#PlatformValues\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Platform\",\n                        \"smithy.api#documentation\": \"<p>The platform. This value is <code>windows</code> for Windows instances; otherwise, it is empty.</p>\",\n                        \"smithy.api#xmlName\": \"platform\"\n                    }\n                },\n                \"Monitoring\": {\n                    \"target\": \"com.amazonaws.ec2#Monitoring\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Monitoring\",\n                        \"smithy.api#documentation\": \"<p>The monitoring for the instance.</p>\",\n                        \"smithy.api#xmlName\": \"monitoring\"\n                    }\n                },\n                \"SubnetId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SubnetId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the subnet in which the instance is running.</p>\",\n                        \"smithy.api#xmlName\": \"subnetId\"\n                    }\n                },\n                \"VpcId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the VPC in which the instance is running.</p>\",\n                        \"smithy.api#xmlName\": \"vpcId\"\n                    }\n                },\n                \"PrivateIpAddress\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PrivateIpAddress\",\n                        \"smithy.api#documentation\": \"<p>The private IPv4 address assigned to the instance.</p>\",\n                        \"smithy.api#xmlName\": \"privateIpAddress\"\n                    }\n                },\n                \"PublicIpAddress\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpAddress\",\n                        \"smithy.api#documentation\": \"<p>The public IPv4 address, or the Carrier IP address assigned to the instance, if\\n            applicable.</p>\\n         <p>A Carrier IP address only applies to an instance launched in a subnet associated with\\n            a Wavelength Zone.</p>\",\n                        \"smithy.api#xmlName\": \"ipAddress\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes an instance.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#InstanceAttachmentEnaSrdSpecification\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"EnaSrdEnabled\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EnaSrdEnabled\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether ENA Express is enabled for the network interface.</p>\",\n                        \"smithy.api#xmlName\": \"enaSrdEnabled\"\n                    }\n                },\n                \"EnaSrdUdpSpecification\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceAttachmentEnaSrdUdpSpecification\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EnaSrdUdpSpecification\",\n                        \"smithy.api#documentation\": \"<p>Configures ENA Express for UDP network traffic.</p>\",\n                        \"smithy.api#xmlName\": \"enaSrdUdpSpecification\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>ENA Express uses Amazon Web Services Scalable Reliable Datagram (SRD) technology to increase the \\n\\t\\t\\tmaximum bandwidth used per stream and minimize tail latency of network traffic between EC2 instances. \\n\\t\\t\\tWith ENA Express, you can communicate between two EC2 instances in the same subnet within the same \\n\\t\\t\\taccount, or in different accounts. Both sending and receiving instances must have ENA Express enabled.</p>\\n         <p>To improve the reliability of network packet delivery, ENA Express reorders network packets on the \\n\\t\\t\\treceiving end by default. However, some UDP-based applications are designed to handle network packets \\n\\t\\t\\tthat are out of order to reduce the overhead for packet delivery at the network layer. When ENA Express \\n\\t\\t\\tis enabled, you can specify whether UDP network traffic uses it.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#InstanceAttachmentEnaSrdUdpSpecification\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"EnaSrdUdpEnabled\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EnaSrdUdpEnabled\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether UDP traffic to and from the instance uses ENA Express. To specify this setting, \\n\\t\\t\\tyou must first enable ENA Express.</p>\",\n                        \"smithy.api#xmlName\": \"enaSrdUdpEnabled\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>ENA Express is compatible with both TCP and UDP transport protocols. When it's enabled, TCP traffic \\n\\t\\t\\tautomatically uses it. However, some UDP-based applications are designed to handle network packets that are \\n\\t\\t\\tout of order, without a need for retransmission, such as live video broadcasting or other near-real-time \\n\\t\\t\\tapplications. For UDP traffic, you can specify whether to use ENA Express, based on your application \\n\\t\\t\\tenvironment needs.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#InstanceAttribute\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"BlockDeviceMappings\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceBlockDeviceMappingList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"BlockDeviceMapping\",\n                        \"smithy.api#documentation\": \"<p>The block device mapping of the instance.</p>\",\n                        \"smithy.api#xmlName\": \"blockDeviceMapping\"\n                    }\n                },\n                \"DisableApiTermination\": {\n                    \"target\": \"com.amazonaws.ec2#AttributeBooleanValue\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DisableApiTermination\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether termination protection is enabled. If the value is <code>true</code>, \\n            you can't terminate the instance using the Amazon EC2 console, command line tools, or API.</p>\",\n                        \"smithy.api#xmlName\": \"disableApiTermination\"\n                    }\n                },\n                \"EnaSupport\": {\n                    \"target\": \"com.amazonaws.ec2#AttributeBooleanValue\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EnaSupport\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether enhanced networking with ENA is enabled.</p>\",\n                        \"smithy.api#xmlName\": \"enaSupport\"\n                    }\n                },\n                \"EnclaveOptions\": {\n                    \"target\": \"com.amazonaws.ec2#EnclaveOptions\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EnclaveOptions\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether the instance is enabled for Amazon Web Services Nitro Enclaves.</p>\",\n                        \"smithy.api#xmlName\": \"enclaveOptions\"\n                    }\n                },\n                \"EbsOptimized\": {\n                    \"target\": \"com.amazonaws.ec2#AttributeBooleanValue\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EbsOptimized\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether the instance is optimized for Amazon EBS I/O.</p>\",\n                        \"smithy.api#xmlName\": \"ebsOptimized\"\n                    }\n                },\n                \"InstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the instance.</p>\",\n                        \"smithy.api#xmlName\": \"instanceId\"\n                    }\n                },\n                \"InstanceInitiatedShutdownBehavior\": {\n                    \"target\": \"com.amazonaws.ec2#AttributeValue\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceInitiatedShutdownBehavior\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether an instance stops or terminates when you initiate shutdown from the\\n            instance (using the operating system command for system shutdown).</p>\",\n                        \"smithy.api#xmlName\": \"instanceInitiatedShutdownBehavior\"\n                    }\n                },\n                \"InstanceType\": {\n                    \"target\": \"com.amazonaws.ec2#AttributeValue\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceType\",\n                        \"smithy.api#documentation\": \"<p>The instance type.</p>\",\n                        \"smithy.api#xmlName\": \"instanceType\"\n                    }\n                },\n                \"KernelId\": {\n                    \"target\": \"com.amazonaws.ec2#AttributeValue\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Kernel\",\n                        \"smithy.api#documentation\": \"<p>The kernel ID.</p>\",\n                        \"smithy.api#xmlName\": \"kernel\"\n                    }\n                },\n                \"ProductCodes\": {\n                    \"target\": \"com.amazonaws.ec2#ProductCodeList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ProductCodes\",\n                        \"smithy.api#documentation\": \"<p>The product codes.</p>\",\n                        \"smithy.api#xmlName\": \"productCodes\"\n                    }\n                },\n                \"RamdiskId\": {\n                    \"target\": \"com.amazonaws.ec2#AttributeValue\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Ramdisk\",\n                        \"smithy.api#documentation\": \"<p>The RAM disk ID.</p>\",\n                        \"smithy.api#xmlName\": \"ramdisk\"\n                    }\n                },\n                \"RootDeviceName\": {\n                    \"target\": \"com.amazonaws.ec2#AttributeValue\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RootDeviceName\",\n                        \"smithy.api#documentation\": \"<p>The device name of the root device volume (for example,\\n            <code>/dev/sda1</code>).</p>\",\n                        \"smithy.api#xmlName\": \"rootDeviceName\"\n                    }\n                },\n                \"SourceDestCheck\": {\n                    \"target\": \"com.amazonaws.ec2#AttributeBooleanValue\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SourceDestCheck\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether source/destination checks are enabled.</p>\",\n                        \"smithy.api#xmlName\": \"sourceDestCheck\"\n                    }\n                },\n                \"SriovNetSupport\": {\n                    \"target\": \"com.amazonaws.ec2#AttributeValue\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SriovNetSupport\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether enhanced networking with the Intel 82599 Virtual Function interface\\n            is enabled.</p>\",\n                        \"smithy.api#xmlName\": \"sriovNetSupport\"\n                    }\n                },\n                \"UserData\": {\n                    \"target\": \"com.amazonaws.ec2#AttributeValue\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"UserData\",\n                        \"smithy.api#documentation\": \"<p>The user data.</p>\",\n                        \"smithy.api#xmlName\": \"userData\"\n                    }\n                },\n                \"DisableApiStop\": {\n                    \"target\": \"com.amazonaws.ec2#AttributeBooleanValue\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DisableApiStop\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether stop protection is enabled for the instance.</p>\",\n                        \"smithy.api#xmlName\": \"disableApiStop\"\n                    }\n                },\n                \"Groups\": {\n                    \"target\": \"com.amazonaws.ec2#GroupIdentifierList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"GroupSet\",\n                        \"smithy.api#documentation\": \"<p>The security groups associated with the instance.</p>\",\n                        \"smithy.api#xmlName\": \"groupSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes an instance attribute.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#InstanceAttributeName\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"instanceType\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"instanceType\"\n                    }\n                },\n                \"kernel\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"kernel\"\n                    }\n                },\n                \"ramdisk\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ramdisk\"\n                    }\n                },\n                \"userData\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"userData\"\n                    }\n                },\n                \"disableApiTermination\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"disableApiTermination\"\n                    }\n                },\n                \"instanceInitiatedShutdownBehavior\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"instanceInitiatedShutdownBehavior\"\n                    }\n                },\n                \"rootDeviceName\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"rootDeviceName\"\n                    }\n                },\n                \"blockDeviceMapping\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"blockDeviceMapping\"\n                    }\n                },\n                \"productCodes\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"productCodes\"\n                    }\n                },\n                \"sourceDestCheck\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"sourceDestCheck\"\n                    }\n                },\n                \"groupSet\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"groupSet\"\n                    }\n                },\n                \"ebsOptimized\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ebsOptimized\"\n                    }\n                },\n                \"sriovNetSupport\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"sriovNetSupport\"\n                    }\n                },\n                \"enaSupport\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"enaSupport\"\n                    }\n                },\n                \"enclaveOptions\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"enclaveOptions\"\n                    }\n                },\n                \"disableApiStop\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"disableApiStop\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#InstanceAutoRecoveryState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"disabled\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"disabled\"\n                    }\n                },\n                \"default\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"default\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#InstanceBandwidthWeighting\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"DEFAULT\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"default\"\n                    }\n                },\n                \"VPC_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"vpc-1\"\n                    }\n                },\n                \"EBS_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ebs-1\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#InstanceBlockDeviceMapping\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DeviceName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DeviceName\",\n                        \"smithy.api#documentation\": \"<p>The device name.</p>\",\n                        \"smithy.api#xmlName\": \"deviceName\"\n                    }\n                },\n                \"Ebs\": {\n                    \"target\": \"com.amazonaws.ec2#EbsInstanceBlockDevice\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Ebs\",\n                        \"smithy.api#documentation\": \"<p>Parameters used to automatically set up EBS volumes when the instance is\\n            launched.</p>\",\n                        \"smithy.api#xmlName\": \"ebs\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a block device mapping.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#InstanceBlockDeviceMappingList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#InstanceBlockDeviceMapping\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#InstanceBlockDeviceMappingSpecification\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DeviceName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DeviceName\",\n                        \"smithy.api#documentation\": \"<p>The device name. For available device names, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/device_naming.html\\\">Device names for volumes</a>.</p>\",\n                        \"smithy.api#xmlName\": \"deviceName\"\n                    }\n                },\n                \"Ebs\": {\n                    \"target\": \"com.amazonaws.ec2#EbsInstanceBlockDeviceSpecification\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Ebs\",\n                        \"smithy.api#documentation\": \"<p>Parameters used to automatically set up EBS volumes when the instance is\\n            launched.</p>\",\n                        \"smithy.api#xmlName\": \"ebs\"\n                    }\n                },\n                \"VirtualName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VirtualName\",\n                        \"smithy.api#documentation\": \"<p>The virtual device name.</p>\",\n                        \"smithy.api#xmlName\": \"virtualName\"\n                    }\n                },\n                \"NoDevice\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NoDevice\",\n                        \"smithy.api#documentation\": \"<p>Suppresses the specified device included in the block device mapping.</p>\",\n                        \"smithy.api#xmlName\": \"noDevice\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a block device mapping entry.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#InstanceBlockDeviceMappingSpecificationList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#InstanceBlockDeviceMappingSpecification\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#InstanceBootModeValues\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"legacy_bios\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"legacy-bios\"\n                    }\n                },\n                \"uefi\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"uefi\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#InstanceCapacity\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AvailableCapacity\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AvailableCapacity\",\n                        \"smithy.api#documentation\": \"<p>The number of instances that can be launched onto the Dedicated Host based on the\\n            host's available capacity.</p>\",\n                        \"smithy.api#xmlName\": \"availableCapacity\"\n                    }\n                },\n                \"InstanceType\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceType\",\n                        \"smithy.api#documentation\": \"<p>The instance type supported by the Dedicated Host.</p>\",\n                        \"smithy.api#xmlName\": \"instanceType\"\n                    }\n                },\n                \"TotalCapacity\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TotalCapacity\",\n                        \"smithy.api#documentation\": \"<p>The total number of instances that can be launched onto the Dedicated Host if there\\n            are no instances running on it.</p>\",\n                        \"smithy.api#xmlName\": \"totalCapacity\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about the number of instances that can be launched onto the Dedicated\\n            Host.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#InstanceConnectEndpointDnsNames\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DnsName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DnsName\",\n                        \"smithy.api#documentation\": \"<p>The DNS name of the EC2 Instance Connect Endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"dnsName\"\n                    }\n                },\n                \"FipsDnsName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"FipsDnsName\",\n                        \"smithy.api#documentation\": \"<p>The Federal Information Processing Standards (FIPS) compliant DNS name of the EC2 Instance Connect Endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"fipsDnsName\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The DNS names of the endpoint.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#InstanceConnectEndpointId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#InstanceConnectEndpointMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 50\n                }\n            }\n        },\n        \"com.amazonaws.ec2#InstanceConnectEndpointPublicDnsNames\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Ipv4\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceConnectEndpointDnsNames\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Ipv4\",\n                        \"smithy.api#documentation\": \"<p>The IPv4-only DNS name of the EC2 Instance Connect Endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"ipv4\"\n                    }\n                },\n                \"Dualstack\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceConnectEndpointDnsNames\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Dualstack\",\n                        \"smithy.api#documentation\": \"<p>The dualstack DNS name of the EC2 Instance Connect Endpoint. A dualstack DNS name supports connections from both IPv4 and IPv6 clients.</p>\",\n                        \"smithy.api#xmlName\": \"dualstack\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The public DNS names of the endpoint, including IPv4-only and dualstack DNS\\n            names.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#InstanceConnectEndpointSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#Ec2InstanceConnectEndpoint\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#InstanceCount\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceCount\",\n                        \"smithy.api#documentation\": \"<p>The number of listed Reserved Instances in the state specified by the\\n      <code>state</code>.</p>\",\n                        \"smithy.api#xmlName\": \"instanceCount\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#ListingState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The states of the listed Reserved Instances.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a Reserved Instance listing state.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#InstanceCountList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#InstanceCount\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#InstanceCreditSpecification\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the instance.</p>\",\n                        \"smithy.api#xmlName\": \"instanceId\"\n                    }\n                },\n                \"CpuCredits\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CpuCredits\",\n                        \"smithy.api#documentation\": \"<p>The credit option for CPU usage of the instance.</p>\\n         <p>Valid values: <code>standard</code> | <code>unlimited</code>\\n         </p>\",\n                        \"smithy.api#xmlName\": \"cpuCredits\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the credit option for CPU usage of a burstable performance instance. </p>\"\n            }\n        },\n        \"com.amazonaws.ec2#InstanceCreditSpecificationList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#InstanceCreditSpecification\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#InstanceCreditSpecificationListRequest\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#InstanceCreditSpecificationRequest\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#InstanceCreditSpecificationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the instance.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"CpuCredits\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The credit option for CPU usage of the instance.</p>\\n         <p>Valid values: <code>standard</code> | <code>unlimited</code>\\n         </p>\\n         <p>T3 instances with <code>host</code> tenancy do not support the <code>unlimited</code>\\n            CPU credit option.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the credit option for CPU usage of a burstable performance instance.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#InstanceEventId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#InstanceEventWindow\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceEventWindowId\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceEventWindowId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceEventWindowId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the event window.</p>\",\n                        \"smithy.api#xmlName\": \"instanceEventWindowId\"\n                    }\n                },\n                \"TimeRanges\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceEventWindowTimeRangeList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TimeRangeSet\",\n                        \"smithy.api#documentation\": \"<p>One or more time ranges defined for the event window.</p>\",\n                        \"smithy.api#xmlName\": \"timeRangeSet\"\n                    }\n                },\n                \"Name\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Name\",\n                        \"smithy.api#documentation\": \"<p>The name of the event window.</p>\",\n                        \"smithy.api#xmlName\": \"name\"\n                    }\n                },\n                \"CronExpression\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceEventWindowCronExpression\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CronExpression\",\n                        \"smithy.api#documentation\": \"<p>The cron expression defined for the event window.</p>\",\n                        \"smithy.api#xmlName\": \"cronExpression\"\n                    }\n                },\n                \"AssociationTarget\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceEventWindowAssociationTarget\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AssociationTarget\",\n                        \"smithy.api#documentation\": \"<p>One or more targets associated with the event window.</p>\",\n                        \"smithy.api#xmlName\": \"associationTarget\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceEventWindowState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The current state of the event window.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>The instance tags associated with the event window.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The event window.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#InstanceEventWindowAssociationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceIds\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceIdList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the instances to associate with the event window. If the instance is on a\\n         Dedicated Host, you can't specify the Instance ID parameter; you must use the Dedicated\\n         Host ID parameter.</p>\",\n                        \"smithy.api#xmlName\": \"InstanceId\"\n                    }\n                },\n                \"InstanceTags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The instance tags to associate with the event window. Any instances associated with the\\n         tags will be associated with the event window.</p>\\n         <p>Note that while you can't create tag keys beginning with <code>aws:</code>, you can\\n         specify existing Amazon Web Services managed tag keys (with the <code>aws:</code> prefix) when specifying\\n         them as targets to associate with the event window.</p>\",\n                        \"smithy.api#xmlName\": \"InstanceTag\"\n                    }\n                },\n                \"DedicatedHostIds\": {\n                    \"target\": \"com.amazonaws.ec2#DedicatedHostIdList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the Dedicated Hosts to associate with the event window.</p>\",\n                        \"smithy.api#xmlName\": \"DedicatedHostId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>One or more targets associated with the specified event window. Only one\\n            <i>type</i> of target (instance ID, instance tag, or Dedicated Host ID)\\n         can be associated with an event window.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#InstanceEventWindowAssociationTarget\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceIds\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceIdList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceIdSet\",\n                        \"smithy.api#documentation\": \"<p>The IDs of the instances associated with the event window.</p>\",\n                        \"smithy.api#xmlName\": \"instanceIdSet\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>The instance tags associated with the event window. Any instances associated with the\\n         tags will be associated with the event window.</p>\\n         <p>Note that while you can't create tag keys beginning with <code>aws:</code>, you can\\n         specify existing Amazon Web Services managed tag keys (with the <code>aws:</code> prefix) when specifying\\n         them as targets to associate with the event window.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                },\n                \"DedicatedHostIds\": {\n                    \"target\": \"com.amazonaws.ec2#DedicatedHostIdList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DedicatedHostIdSet\",\n                        \"smithy.api#documentation\": \"<p>The IDs of the Dedicated Hosts associated with the event window.</p>\",\n                        \"smithy.api#xmlName\": \"dedicatedHostIdSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>One or more targets associated with the event window.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#InstanceEventWindowCronExpression\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#InstanceEventWindowDisassociationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceIds\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceIdList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the instances to disassociate from the event window.</p>\",\n                        \"smithy.api#xmlName\": \"InstanceId\"\n                    }\n                },\n                \"InstanceTags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The instance tags to disassociate from the event window. Any instances associated with\\n         the tags will be disassociated from the event window.</p>\",\n                        \"smithy.api#xmlName\": \"InstanceTag\"\n                    }\n                },\n                \"DedicatedHostIds\": {\n                    \"target\": \"com.amazonaws.ec2#DedicatedHostIdList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the Dedicated Hosts to disassociate from the event window.</p>\",\n                        \"smithy.api#xmlName\": \"DedicatedHostId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The targets to disassociate from the specified event window.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#InstanceEventWindowId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#InstanceEventWindowIdSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#InstanceEventWindowId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"InstanceEventWindowId\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#InstanceEventWindowSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#InstanceEventWindow\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#InstanceEventWindowState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"creating\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"creating\"\n                    }\n                },\n                \"deleting\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"deleting\"\n                    }\n                },\n                \"active\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"active\"\n                    }\n                },\n                \"deleted\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"deleted\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#InstanceEventWindowStateChange\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceEventWindowId\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceEventWindowId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceEventWindowId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the event window.</p>\",\n                        \"smithy.api#xmlName\": \"instanceEventWindowId\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceEventWindowState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The current state of the event window.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The state of the event window.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#InstanceEventWindowTimeRange\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"StartWeekDay\": {\n                    \"target\": \"com.amazonaws.ec2#WeekDay\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"StartWeekDay\",\n                        \"smithy.api#documentation\": \"<p>The day on which the time range begins.</p>\",\n                        \"smithy.api#xmlName\": \"startWeekDay\"\n                    }\n                },\n                \"StartHour\": {\n                    \"target\": \"com.amazonaws.ec2#Hour\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"StartHour\",\n                        \"smithy.api#documentation\": \"<p>The hour when the time range begins.</p>\",\n                        \"smithy.api#xmlName\": \"startHour\"\n                    }\n                },\n                \"EndWeekDay\": {\n                    \"target\": \"com.amazonaws.ec2#WeekDay\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EndWeekDay\",\n                        \"smithy.api#documentation\": \"<p>The day on which the time range ends.</p>\",\n                        \"smithy.api#xmlName\": \"endWeekDay\"\n                    }\n                },\n                \"EndHour\": {\n                    \"target\": \"com.amazonaws.ec2#Hour\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EndHour\",\n                        \"smithy.api#documentation\": \"<p>The hour when the time range ends.</p>\",\n                        \"smithy.api#xmlName\": \"endHour\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The start day and time and the end day and time of the time range, in UTC.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#InstanceEventWindowTimeRangeList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#InstanceEventWindowTimeRange\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#InstanceEventWindowTimeRangeRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"StartWeekDay\": {\n                    \"target\": \"com.amazonaws.ec2#WeekDay\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The day on which the time range begins.</p>\"\n                    }\n                },\n                \"StartHour\": {\n                    \"target\": \"com.amazonaws.ec2#Hour\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The hour when the time range begins.</p>\"\n                    }\n                },\n                \"EndWeekDay\": {\n                    \"target\": \"com.amazonaws.ec2#WeekDay\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The day on which the time range ends.</p>\"\n                    }\n                },\n                \"EndHour\": {\n                    \"target\": \"com.amazonaws.ec2#Hour\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The hour when the time range ends.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The start day and time and the end day and time of the time range, in UTC.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#InstanceEventWindowTimeRangeRequestSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#InstanceEventWindowTimeRangeRequest\"\n            }\n        },\n        \"com.amazonaws.ec2#InstanceExportDetails\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the resource being exported.</p>\",\n                        \"smithy.api#xmlName\": \"instanceId\"\n                    }\n                },\n                \"TargetEnvironment\": {\n                    \"target\": \"com.amazonaws.ec2#ExportEnvironment\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TargetEnvironment\",\n                        \"smithy.api#documentation\": \"<p>The target virtualization environment.</p>\",\n                        \"smithy.api#xmlName\": \"targetEnvironment\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes an instance to export.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#InstanceFamilyCreditSpecification\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceFamily\": {\n                    \"target\": \"com.amazonaws.ec2#UnlimitedSupportedInstanceFamily\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceFamily\",\n                        \"smithy.api#documentation\": \"<p>The instance family.</p>\",\n                        \"smithy.api#xmlName\": \"instanceFamily\"\n                    }\n                },\n                \"CpuCredits\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CpuCredits\",\n                        \"smithy.api#documentation\": \"<p>The default credit option for CPU usage of the instance family. Valid values are\\n                <code>standard</code> and <code>unlimited</code>.</p>\",\n                        \"smithy.api#xmlName\": \"cpuCredits\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the default credit option for CPU usage of a burstable performance instance\\n            family.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#InstanceGeneration\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"CURRENT\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"current\"\n                    }\n                },\n                \"PREVIOUS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"previous\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#InstanceGenerationSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#InstanceGeneration\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#InstanceHealthStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"HEALTHY_STATUS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"healthy\"\n                    }\n                },\n                \"UNHEALTHY_STATUS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"unhealthy\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#InstanceId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#InstanceIdForResolver\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#InstanceIdList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#InstanceId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#InstanceIdSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#InstanceId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#InstanceIdStringList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#InstanceId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"InstanceId\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#InstanceIdWithVolumeResolver\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#InstanceIdsSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#InstanceId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#InstanceImageMetadata\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the instance.</p>\",\n                        \"smithy.api#xmlName\": \"instanceId\"\n                    }\n                },\n                \"InstanceType\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceType\",\n                        \"smithy.api#documentation\": \"<p>The instance type.</p>\",\n                        \"smithy.api#xmlName\": \"instanceType\"\n                    }\n                },\n                \"LaunchTime\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LaunchTime\",\n                        \"smithy.api#documentation\": \"<p>The time the instance was launched.</p>\",\n                        \"smithy.api#xmlName\": \"launchTime\"\n                    }\n                },\n                \"AvailabilityZone\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AvailabilityZone\",\n                        \"smithy.api#documentation\": \"<p>The Availability Zone or Local Zone of the instance.</p>\",\n                        \"smithy.api#xmlName\": \"availabilityZone\"\n                    }\n                },\n                \"ZoneId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ZoneId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Availability Zone or Local Zone of the instance.</p>\",\n                        \"smithy.api#xmlName\": \"zoneId\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceState\",\n                        \"smithy.api#documentation\": \"<p>The current state of the instance.</p>\",\n                        \"smithy.api#xmlName\": \"instanceState\"\n                    }\n                },\n                \"OwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceOwnerId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Amazon Web Services account that owns the instance.</p>\",\n                        \"smithy.api#xmlName\": \"instanceOwnerId\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>Any tags assigned to the instance.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                },\n                \"ImageMetadata\": {\n                    \"target\": \"com.amazonaws.ec2#ImageMetadata\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ImageMetadata\",\n                        \"smithy.api#documentation\": \"<p>Information about the AMI used to launch the instance.</p>\",\n                        \"smithy.api#xmlName\": \"imageMetadata\"\n                    }\n                },\n                \"Operator\": {\n                    \"target\": \"com.amazonaws.ec2#OperatorResponse\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Operator\",\n                        \"smithy.api#documentation\": \"<p>The entity that manages the instance.</p>\",\n                        \"smithy.api#xmlName\": \"operator\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about the instance and the AMI used to launch the instance.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#InstanceImageMetadataList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#InstanceImageMetadata\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#InstanceInterruptionBehavior\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"hibernate\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"hibernate\"\n                    }\n                },\n                \"stop\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"stop\"\n                    }\n                },\n                \"terminate\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"terminate\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#InstanceIpv4Prefix\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Ipv4Prefix\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Ipv4Prefix\",\n                        \"smithy.api#documentation\": \"<p>One or more IPv4 prefixes assigned to the network interface.</p>\",\n                        \"smithy.api#xmlName\": \"ipv4Prefix\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about an IPv4 prefix.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#InstanceIpv4PrefixList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#InstanceIpv4Prefix\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#InstanceIpv6Address\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Ipv6Address\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Ipv6Address\",\n                        \"smithy.api#documentation\": \"<p>The IPv6 address.</p>\",\n                        \"smithy.api#xmlName\": \"ipv6Address\"\n                    }\n                },\n                \"IsPrimaryIpv6\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IsPrimaryIpv6\",\n                        \"smithy.api#documentation\": \"<p>Determines if an IPv6 address associated with a network interface is the primary IPv6 address. When you enable an IPv6 GUA address to be a primary IPv6, the first IPv6 GUA will be made the primary IPv6 address until the instance is terminated or the network interface is detached.  \\n            For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RunInstances.html\\\">RunInstances</a>.</p>\",\n                        \"smithy.api#xmlName\": \"isPrimaryIpv6\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes an IPv6 address.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#InstanceIpv6AddressList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#InstanceIpv6Address\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#InstanceIpv6AddressListRequest\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#InstanceIpv6AddressRequest\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"InstanceIpv6Address\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#InstanceIpv6AddressRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Ipv6Address\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IPv6 address.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes an IPv6 address.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#InstanceIpv6Prefix\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Ipv6Prefix\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Ipv6Prefix\",\n                        \"smithy.api#documentation\": \"<p>One or more IPv6 prefixes assigned to the network interface.</p>\",\n                        \"smithy.api#xmlName\": \"ipv6Prefix\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about an IPv6 prefix.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#InstanceIpv6PrefixList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#InstanceIpv6Prefix\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#InstanceLifecycle\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"SPOT\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"spot\"\n                    }\n                },\n                \"ON_DEMAND\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"on-demand\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#InstanceLifecycleType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"spot\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"spot\"\n                    }\n                },\n                \"scheduled\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"scheduled\"\n                    }\n                },\n                \"capacity_block\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"capacity-block\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#InstanceList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#Instance\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#InstanceMaintenanceOptions\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AutoRecovery\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceAutoRecoveryState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AutoRecovery\",\n                        \"smithy.api#documentation\": \"<p>Provides information on the current automatic recovery behavior of your\\n            instance.</p>\",\n                        \"smithy.api#xmlName\": \"autoRecovery\"\n                    }\n                },\n                \"RebootMigration\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceRebootMigrationState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RebootMigration\",\n                        \"smithy.api#documentation\": \"<p>Specifies whether to attempt reboot migration during a user-initiated reboot of an\\n            instance that has a scheduled <code>system-reboot</code> event:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>default</code> - Amazon EC2 attempts to migrate the instance to\\n                    new hardware (reboot migration). If successful, the <code>system-reboot</code>\\n                    event is cleared. If unsuccessful, an in-place reboot occurs and the event\\n                    remains scheduled.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>disabled</code> - Amazon EC2 keeps the instance on the same\\n                    hardware (in-place reboot). The <code>system-reboot</code> event remains\\n                    scheduled.</p>\\n            </li>\\n         </ul>\\n         <p>This setting only applies to supported instances that have a scheduled reboot event.\\n            For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/schedevents_actions_reboot.html#reboot-migration\\\">Enable or disable reboot migration</a> in the\\n            <i>Amazon EC2 User Guide</i>.</p>\",\n                        \"smithy.api#xmlName\": \"rebootMigration\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The maintenance options for the instance.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#InstanceMaintenanceOptionsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AutoRecovery\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceAutoRecoveryState\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Disables the automatic recovery behavior of your instance or sets it to default. For\\n            more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-recover.html#instance-configuration-recovery\\\">Simplified automatic recovery</a>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The maintenance options for the instance.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#InstanceMarketOptionsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"MarketType\": {\n                    \"target\": \"com.amazonaws.ec2#MarketType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The market type.</p>\"\n                    }\n                },\n                \"SpotOptions\": {\n                    \"target\": \"com.amazonaws.ec2#SpotMarketOptions\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The options for Spot Instances.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the market (purchasing) option for the instances.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#InstanceMatchCriteria\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"open\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"open\"\n                    }\n                },\n                \"targeted\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"targeted\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#InstanceMetadataDefaultsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"HttpTokens\": {\n                    \"target\": \"com.amazonaws.ec2#HttpTokensState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"HttpTokens\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether IMDSv2 is required.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>optional</code> – IMDSv2 is optional, which means that you can\\n                    use either IMDSv2 or IMDSv1.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>required</code> – IMDSv2 is required, which means that IMDSv1 is\\n                    disabled, and you must use IMDSv2.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"httpTokens\"\n                    }\n                },\n                \"HttpPutResponseHopLimit\": {\n                    \"target\": \"com.amazonaws.ec2#BoxedInteger\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"HttpPutResponseHopLimit\",\n                        \"smithy.api#documentation\": \"<p>The maximum number of hops that the metadata token can travel.</p>\",\n                        \"smithy.api#xmlName\": \"httpPutResponseHopLimit\"\n                    }\n                },\n                \"HttpEndpoint\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceMetadataEndpointState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"HttpEndpoint\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether the IMDS endpoint for an instance is enabled or disabled. When disabled, the instance\\n            metadata can't be accessed.</p>\",\n                        \"smithy.api#xmlName\": \"httpEndpoint\"\n                    }\n                },\n                \"InstanceMetadataTags\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceMetadataTagsState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceMetadataTags\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether access to instance tags from the instance metadata is enabled or\\n            disabled. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Tags.html#work-with-tags-in-IMDS\\\">Work with\\n                instance tags using the instance metadata</a> in the\\n            <i>Amazon EC2 User Guide</i>.</p>\",\n                        \"smithy.api#xmlName\": \"instanceMetadataTags\"\n                    }\n                },\n                \"ManagedBy\": {\n                    \"target\": \"com.amazonaws.ec2#ManagedBy\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ManagedBy\",\n                        \"smithy.api#documentation\": \"<p>The entity that manages the IMDS default settings. Possible values include:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>account</code> - The IMDS default settings are managed by the\\n            account.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>declarative-policy</code> - The IMDS default settings are managed\\n            by a declarative policy and can't be modified by the account.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"managedBy\"\n                    }\n                },\n                \"ManagedExceptionMessage\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ManagedExceptionMessage\",\n                        \"smithy.api#documentation\": \"<p>The customized exception message that is specified in the declarative policy.</p>\",\n                        \"smithy.api#xmlName\": \"managedExceptionMessage\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The default instance metadata service (IMDS) settings that were set at the account\\n            level in the specified Amazon Web Services\\u2028 Region.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#InstanceMetadataEndpointState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"disabled\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"disabled\"\n                    }\n                },\n                \"enabled\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"enabled\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#InstanceMetadataOptionsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"HttpTokens\": {\n                    \"target\": \"com.amazonaws.ec2#HttpTokensState\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether IMDSv2 is required.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>optional</code> - IMDSv2 is optional, which means that you can use\\n                    either IMDSv2 or IMDSv1.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>required</code> - IMDSv2 is required, which means that IMDSv1 is\\n                    disabled, and you must use IMDSv2.</p>\\n            </li>\\n         </ul>\\n         <p>Default:</p>\\n         <ul>\\n            <li>\\n               <p>If the value of <code>ImdsSupport</code> for the Amazon Machine Image (AMI)\\n                    for your instance is <code>v2.0</code> and the account level default is set to\\n                        <code>no-preference</code>, the default is <code>required</code>.</p>\\n            </li>\\n            <li>\\n               <p>If the value of <code>ImdsSupport</code> for the Amazon Machine Image (AMI)\\n                    for your instance is <code>v2.0</code>, but the account level default is set to\\n                        <code>V1 or V2</code>, the default is <code>optional</code>.</p>\\n            </li>\\n         </ul>\\n         <p>The default value can also be affected by other combinations of parameters. For more\\n            information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/configuring-instance-metadata-options.html#instance-metadata-options-order-of-precedence\\\">Order of precedence for instance metadata options</a> in the\\n            <i>Amazon EC2 User Guide</i>.</p>\"\n                    }\n                },\n                \"HttpPutResponseHopLimit\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of hops that the metadata token can travel.</p>\\n         <p>Possible values: Integers from 1 to 64</p>\"\n                    }\n                },\n                \"HttpEndpoint\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceMetadataEndpointState\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Enables or disables the HTTP metadata endpoint on your instances.</p>\\n         <p>If you specify a value of <code>disabled</code>, you cannot access your instance\\n            metadata.</p>\\n         <p>Default: <code>enabled</code>\\n         </p>\"\n                    }\n                },\n                \"HttpProtocolIpv6\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceMetadataProtocolState\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Enables or disables the IPv6 endpoint for the instance metadata service.</p>\\n         <p>Default: <code>disabled</code>\\n         </p>\"\n                    }\n                },\n                \"InstanceMetadataTags\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceMetadataTagsState\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Set to <code>enabled</code> to allow access to instance tags from the instance\\n            metadata. Set to <code>disabled</code> to turn off access to instance tags from the\\n            instance metadata. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Tags.html#work-with-tags-in-IMDS\\\">Work with\\n                instance tags using the instance metadata</a>.</p>\\n         <p>Default: <code>disabled</code>\\n         </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The metadata options for the instance.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#InstanceMetadataOptionsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceMetadataOptionsState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The state of the metadata option changes.</p>\\n         <p>\\n            <code>pending</code> - The metadata options are being updated and the instance is not\\n            ready to process metadata traffic with the new selection.</p>\\n         <p>\\n            <code>applied</code> - The metadata options have been successfully applied on the\\n            instance.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                },\n                \"HttpTokens\": {\n                    \"target\": \"com.amazonaws.ec2#HttpTokensState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"HttpTokens\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether IMDSv2 is required.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>optional</code> - IMDSv2 is optional, which means that you can use\\n                    either IMDSv2 or IMDSv1.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>required</code> - IMDSv2 is required, which means that IMDSv1 is\\n                    disabled, and you must use IMDSv2.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"httpTokens\"\n                    }\n                },\n                \"HttpPutResponseHopLimit\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"HttpPutResponseHopLimit\",\n                        \"smithy.api#documentation\": \"<p>The maximum number of hops that the metadata token can travel.</p>\\n         <p>Possible values: Integers from <code>1</code> to <code>64</code>\\n         </p>\",\n                        \"smithy.api#xmlName\": \"httpPutResponseHopLimit\"\n                    }\n                },\n                \"HttpEndpoint\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceMetadataEndpointState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"HttpEndpoint\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether the HTTP metadata endpoint on your instances is enabled or\\n            disabled.</p>\\n         <p>If the value is <code>disabled</code>, you cannot access your instance\\n            metadata.</p>\",\n                        \"smithy.api#xmlName\": \"httpEndpoint\"\n                    }\n                },\n                \"HttpProtocolIpv6\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceMetadataProtocolState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"HttpProtocolIpv6\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether the IPv6 endpoint for the instance metadata service is enabled or\\n            disabled.</p>\\n         <p>Default: <code>disabled</code>\\n         </p>\",\n                        \"smithy.api#xmlName\": \"httpProtocolIpv6\"\n                    }\n                },\n                \"InstanceMetadataTags\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceMetadataTagsState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceMetadataTags\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether access to instance tags from the instance metadata is enabled or\\n            disabled. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Tags.html#work-with-tags-in-IMDS\\\">Work with\\n                instance tags using the instance metadata</a>.</p>\",\n                        \"smithy.api#xmlName\": \"instanceMetadataTags\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The metadata options for the instance.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#InstanceMetadataOptionsState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"pending\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"pending\"\n                    }\n                },\n                \"applied\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"applied\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#InstanceMetadataProtocolState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"disabled\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"disabled\"\n                    }\n                },\n                \"enabled\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"enabled\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#InstanceMetadataTagsState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"disabled\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"disabled\"\n                    }\n                },\n                \"enabled\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"enabled\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#InstanceMonitoring\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the instance.</p>\",\n                        \"smithy.api#xmlName\": \"instanceId\"\n                    }\n                },\n                \"Monitoring\": {\n                    \"target\": \"com.amazonaws.ec2#Monitoring\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Monitoring\",\n                        \"smithy.api#documentation\": \"<p>The monitoring for the instance.</p>\",\n                        \"smithy.api#xmlName\": \"monitoring\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the monitoring of an instance.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#InstanceMonitoringList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#InstanceMonitoring\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#InstanceNetworkInterface\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Association\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceNetworkInterfaceAssociation\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Association\",\n                        \"smithy.api#documentation\": \"<p>The association information for an Elastic IPv4 associated with the network\\n            interface.</p>\",\n                        \"smithy.api#xmlName\": \"association\"\n                    }\n                },\n                \"Attachment\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceNetworkInterfaceAttachment\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Attachment\",\n                        \"smithy.api#documentation\": \"<p>The network interface attachment.</p>\",\n                        \"smithy.api#xmlName\": \"attachment\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Description\",\n                        \"smithy.api#documentation\": \"<p>The description.</p>\",\n                        \"smithy.api#xmlName\": \"description\"\n                    }\n                },\n                \"Groups\": {\n                    \"target\": \"com.amazonaws.ec2#GroupIdentifierList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"GroupSet\",\n                        \"smithy.api#documentation\": \"<p>The security groups.</p>\",\n                        \"smithy.api#xmlName\": \"groupSet\"\n                    }\n                },\n                \"Ipv6Addresses\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceIpv6AddressList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Ipv6AddressesSet\",\n                        \"smithy.api#documentation\": \"<p>The IPv6 addresses associated with the network interface.</p>\",\n                        \"smithy.api#xmlName\": \"ipv6AddressesSet\"\n                    }\n                },\n                \"MacAddress\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MacAddress\",\n                        \"smithy.api#documentation\": \"<p>The MAC address.</p>\",\n                        \"smithy.api#xmlName\": \"macAddress\"\n                    }\n                },\n                \"NetworkInterfaceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkInterfaceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the network interface.</p>\",\n                        \"smithy.api#xmlName\": \"networkInterfaceId\"\n                    }\n                },\n                \"OwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OwnerId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Amazon Web Services account that created the network interface.</p>\",\n                        \"smithy.api#xmlName\": \"ownerId\"\n                    }\n                },\n                \"PrivateDnsName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PrivateDnsName\",\n                        \"smithy.api#documentation\": \"<p>The private DNS name.</p>\",\n                        \"smithy.api#xmlName\": \"privateDnsName\"\n                    }\n                },\n                \"PrivateIpAddress\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PrivateIpAddress\",\n                        \"smithy.api#documentation\": \"<p>The IPv4 address of the network interface within the subnet.</p>\",\n                        \"smithy.api#xmlName\": \"privateIpAddress\"\n                    }\n                },\n                \"PrivateIpAddresses\": {\n                    \"target\": \"com.amazonaws.ec2#InstancePrivateIpAddressList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PrivateIpAddressesSet\",\n                        \"smithy.api#documentation\": \"<p>The private IPv4 addresses associated with the network interface.</p>\",\n                        \"smithy.api#xmlName\": \"privateIpAddressesSet\"\n                    }\n                },\n                \"SourceDestCheck\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SourceDestCheck\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether source/destination checking is enabled.</p>\",\n                        \"smithy.api#xmlName\": \"sourceDestCheck\"\n                    }\n                },\n                \"Status\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInterfaceStatus\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Status\",\n                        \"smithy.api#documentation\": \"<p>The status of the network interface.</p>\",\n                        \"smithy.api#xmlName\": \"status\"\n                    }\n                },\n                \"SubnetId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SubnetId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the subnet.</p>\",\n                        \"smithy.api#xmlName\": \"subnetId\"\n                    }\n                },\n                \"VpcId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the VPC.</p>\",\n                        \"smithy.api#xmlName\": \"vpcId\"\n                    }\n                },\n                \"InterfaceType\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InterfaceType\",\n                        \"smithy.api#documentation\": \"<p>The type of network interface.</p>\\n         <p>Valid values: <code>interface</code> | <code>efa</code> | <code>efa-only</code> | <code>evs</code> |\\n                <code>trunk</code>\\n         </p>\",\n                        \"smithy.api#xmlName\": \"interfaceType\"\n                    }\n                },\n                \"Ipv4Prefixes\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceIpv4PrefixList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Ipv4PrefixSet\",\n                        \"smithy.api#documentation\": \"<p>The IPv4 delegated prefixes that are assigned to the network interface.</p>\",\n                        \"smithy.api#xmlName\": \"ipv4PrefixSet\"\n                    }\n                },\n                \"Ipv6Prefixes\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceIpv6PrefixList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Ipv6PrefixSet\",\n                        \"smithy.api#documentation\": \"<p>The IPv6 delegated prefixes that are assigned to the network interface.</p>\",\n                        \"smithy.api#xmlName\": \"ipv6PrefixSet\"\n                    }\n                },\n                \"ConnectionTrackingConfiguration\": {\n                    \"target\": \"com.amazonaws.ec2#ConnectionTrackingSpecificationResponse\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ConnectionTrackingConfiguration\",\n                        \"smithy.api#documentation\": \"<p>A security group connection tracking configuration that enables you to set the timeout\\n            for connection tracking on an Elastic network interface. For more information, see\\n                <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/security-group-connection-tracking.html#connection-tracking-timeouts\\\">Connection tracking timeouts</a> in the\\n            <i>Amazon EC2 User Guide</i>.</p>\",\n                        \"smithy.api#xmlName\": \"connectionTrackingConfiguration\"\n                    }\n                },\n                \"Operator\": {\n                    \"target\": \"com.amazonaws.ec2#OperatorResponse\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Operator\",\n                        \"smithy.api#documentation\": \"<p>The service provider that manages the network interface.</p>\",\n                        \"smithy.api#xmlName\": \"operator\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a network interface.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#InstanceNetworkInterfaceAssociation\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CarrierIp\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CarrierIp\",\n                        \"smithy.api#documentation\": \"<p>The carrier IP address associated with the network interface.</p>\",\n                        \"smithy.api#xmlName\": \"carrierIp\"\n                    }\n                },\n                \"CustomerOwnedIp\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CustomerOwnedIp\",\n                        \"smithy.api#documentation\": \"<p>The customer-owned IP address associated with the network interface.</p>\",\n                        \"smithy.api#xmlName\": \"customerOwnedIp\"\n                    }\n                },\n                \"IpOwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpOwnerId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the owner of the Elastic IP address.</p>\",\n                        \"smithy.api#xmlName\": \"ipOwnerId\"\n                    }\n                },\n                \"PublicDnsName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PublicDnsName\",\n                        \"smithy.api#documentation\": \"<p>The public DNS name.</p>\",\n                        \"smithy.api#xmlName\": \"publicDnsName\"\n                    }\n                },\n                \"PublicIp\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PublicIp\",\n                        \"smithy.api#documentation\": \"<p>The public IP address or Elastic IP address bound to the network interface.</p>\",\n                        \"smithy.api#xmlName\": \"publicIp\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes association information for an Elastic IP address (IPv4).</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#InstanceNetworkInterfaceAttachment\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AttachTime\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AttachTime\",\n                        \"smithy.api#documentation\": \"<p>The time stamp when the attachment initiated.</p>\",\n                        \"smithy.api#xmlName\": \"attachTime\"\n                    }\n                },\n                \"AttachmentId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AttachmentId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the network interface attachment.</p>\",\n                        \"smithy.api#xmlName\": \"attachmentId\"\n                    }\n                },\n                \"DeleteOnTermination\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DeleteOnTermination\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether the network interface is deleted when the instance is\\n            terminated.</p>\",\n                        \"smithy.api#xmlName\": \"deleteOnTermination\"\n                    }\n                },\n                \"DeviceIndex\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DeviceIndex\",\n                        \"smithy.api#documentation\": \"<p>The index of the device on the instance for the network interface attachment.</p>\",\n                        \"smithy.api#xmlName\": \"deviceIndex\"\n                    }\n                },\n                \"Status\": {\n                    \"target\": \"com.amazonaws.ec2#AttachmentStatus\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Status\",\n                        \"smithy.api#documentation\": \"<p>The attachment state.</p>\",\n                        \"smithy.api#xmlName\": \"status\"\n                    }\n                },\n                \"NetworkCardIndex\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkCardIndex\",\n                        \"smithy.api#documentation\": \"<p>The index of the network card.</p>\",\n                        \"smithy.api#xmlName\": \"networkCardIndex\"\n                    }\n                },\n                \"EnaSrdSpecification\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceAttachmentEnaSrdSpecification\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EnaSrdSpecification\",\n                        \"smithy.api#documentation\": \"<p>Contains the ENA Express settings for the network interface that's attached to\\n            the instance.</p>\",\n                        \"smithy.api#xmlName\": \"enaSrdSpecification\"\n                    }\n                },\n                \"EnaQueueCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EnaQueueCount\",\n                        \"smithy.api#documentation\": \"<p>The number of ENA queues created with the instance.</p>\",\n                        \"smithy.api#xmlName\": \"enaQueueCount\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a network interface attachment.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#InstanceNetworkInterfaceList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#InstanceNetworkInterface\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#InstanceNetworkInterfaceSpecification\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AssociatePublicIpAddress\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AssociatePublicIpAddress\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether to assign a public IPv4 address to an instance you launch in a VPC.\\n            The public IP address can only be assigned to a network interface for eth0, and can only\\n            be assigned to a new network interface, not an existing one. You cannot specify more\\n            than one network interface in the request. If launching into a default subnet, the\\n            default value is <code>true</code>.</p>\\n         <p>Amazon Web Services charges for all public IPv4 addresses, including public IPv4 addresses \\nassociated with running instances and Elastic IP addresses. For more information, see the <i>Public IPv4 Address</i> tab on the <a href=\\\"http://aws.amazon.com/vpc/pricing/\\\">Amazon VPC pricing page</a>.</p>\",\n                        \"smithy.api#xmlName\": \"associatePublicIpAddress\"\n                    }\n                },\n                \"DeleteOnTermination\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DeleteOnTermination\",\n                        \"smithy.api#documentation\": \"<p>If set to <code>true</code>, the interface is deleted when the instance is terminated.\\n            You can specify <code>true</code> only if creating a new network interface when\\n            launching an instance.</p>\",\n                        \"smithy.api#xmlName\": \"deleteOnTermination\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Description\",\n                        \"smithy.api#documentation\": \"<p>The description of the network interface. Applies only if creating a network interface\\n            when launching an instance.</p>\",\n                        \"smithy.api#xmlName\": \"description\"\n                    }\n                },\n                \"DeviceIndex\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DeviceIndex\",\n                        \"smithy.api#documentation\": \"<p>The position of the network interface in the attachment order. A primary network\\n            interface has a device index of 0.</p>\\n         <p>If you specify a network interface when launching an instance, you must specify the\\n            device index.</p>\",\n                        \"smithy.api#xmlName\": \"deviceIndex\"\n                    }\n                },\n                \"Groups\": {\n                    \"target\": \"com.amazonaws.ec2#SecurityGroupIdStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the security groups for the network interface. Applies only if creating a\\n            network interface when launching an instance.</p>\",\n                        \"smithy.api#xmlName\": \"SecurityGroupId\"\n                    }\n                },\n                \"Ipv6AddressCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Ipv6AddressCount\",\n                        \"smithy.api#documentation\": \"<p>A number of IPv6 addresses to assign to the network interface. Amazon EC2 chooses the\\n            IPv6 addresses from the range of the subnet. You cannot specify this option and the\\n            option to assign specific IPv6 addresses in the same request. You can specify this\\n            option if you've specified a minimum number of instances to launch.</p>\",\n                        \"smithy.api#xmlName\": \"ipv6AddressCount\"\n                    }\n                },\n                \"Ipv6Addresses\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceIpv6AddressList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Ipv6Addresses\",\n                        \"smithy.api#documentation\": \"<p>The IPv6 addresses to assign to the network interface. You cannot specify this option\\n            and the option to assign a number of IPv6 addresses in the same request. You cannot\\n            specify this option if you've specified a minimum number of instances to launch.</p>\",\n                        \"smithy.api#xmlName\": \"ipv6AddressesSet\"\n                    }\n                },\n                \"NetworkInterfaceId\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInterfaceId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkInterfaceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the network interface.</p>\\n         <p>If you are creating a Spot Fleet, omit this parameter because you can’t specify a\\n            network interface ID in a launch specification.</p>\",\n                        \"smithy.api#xmlName\": \"networkInterfaceId\"\n                    }\n                },\n                \"PrivateIpAddress\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PrivateIpAddress\",\n                        \"smithy.api#documentation\": \"<p>The private IPv4 address of the network interface. Applies only if creating a network\\n            interface when launching an instance. You cannot specify this option if you're launching\\n            more than one instance in a <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RunInstances.html\\\">RunInstances</a>\\n            request.</p>\",\n                        \"smithy.api#xmlName\": \"privateIpAddress\"\n                    }\n                },\n                \"PrivateIpAddresses\": {\n                    \"target\": \"com.amazonaws.ec2#PrivateIpAddressSpecificationList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PrivateIpAddresses\",\n                        \"smithy.api#documentation\": \"<p>The private IPv4 addresses to assign to the network interface. Only one private IPv4\\n            address can be designated as primary. You cannot specify this option if you're launching\\n            more than one instance in a <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RunInstances.html\\\">RunInstances</a>\\n            request.</p>\",\n                        \"smithy.api#xmlName\": \"privateIpAddressesSet\"\n                    }\n                },\n                \"SecondaryPrivateIpAddressCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SecondaryPrivateIpAddressCount\",\n                        \"smithy.api#documentation\": \"<p>The number of secondary private IPv4 addresses. You can’t specify this parameter and\\n            also specify a secondary private IP address using the <code>PrivateIpAddress</code>\\n            parameter.</p>\",\n                        \"smithy.api#xmlName\": \"secondaryPrivateIpAddressCount\"\n                    }\n                },\n                \"SubnetId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SubnetId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the subnet associated with the network interface. Applies only if creating a\\n            network interface when launching an instance.</p>\",\n                        \"smithy.api#xmlName\": \"subnetId\"\n                    }\n                },\n                \"AssociateCarrierIpAddress\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether to assign a carrier IP address to the network interface.</p>\\n         <p>You can only assign a carrier IP address to a network interface that is in a subnet in\\n            a Wavelength Zone. For more information about carrier IP addresses, see <a href=\\\"https://docs.aws.amazon.com/wavelength/latest/developerguide/how-wavelengths-work.html#provider-owned-ip\\\">Carrier IP address</a> in the <i>Amazon Web Services Wavelength Developer\\n                Guide</i>.</p>\"\n                    }\n                },\n                \"InterfaceType\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of network interface.</p>\\n         <p>If you specify <code>efa-only</code>, do not assign any IP addresses to the network\\n            interface. EFA-only network interfaces do not support IP addresses.</p>\\n         <p>Valid values: <code>interface</code> | <code>efa</code> | <code>efa-only</code>\\n         </p>\"\n                    }\n                },\n                \"NetworkCardIndex\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The index of the network card. Some instance types support multiple network cards. The\\n            primary network interface must be assigned to network card index 0. The default is\\n            network card index 0.</p>\\n         <p>If you are using <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RequestSpotInstances.html\\\">RequestSpotInstances</a> to create Spot Instances, omit this parameter because\\n            you can’t specify the network card index when using this API. To specify the network\\n            card index, use <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RunInstances.html\\\">RunInstances</a>.</p>\"\n                    }\n                },\n                \"Ipv4Prefixes\": {\n                    \"target\": \"com.amazonaws.ec2#Ipv4PrefixList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IPv4 delegated prefixes to be assigned to the network interface. You cannot use\\n            this option if you use the <code>Ipv4PrefixCount</code> option.</p>\",\n                        \"smithy.api#xmlName\": \"Ipv4Prefix\"\n                    }\n                },\n                \"Ipv4PrefixCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of IPv4 delegated prefixes to be automatically assigned to the network\\n            interface. You cannot use this option if you use the <code>Ipv4Prefix</code>\\n            option.</p>\"\n                    }\n                },\n                \"Ipv6Prefixes\": {\n                    \"target\": \"com.amazonaws.ec2#Ipv6PrefixList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IPv6 delegated prefixes to be assigned to the network interface. You cannot use\\n            this option if you use the <code>Ipv6PrefixCount</code> option.</p>\",\n                        \"smithy.api#xmlName\": \"Ipv6Prefix\"\n                    }\n                },\n                \"Ipv6PrefixCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of IPv6 delegated prefixes to be automatically assigned to the network\\n            interface. You cannot use this option if you use the <code>Ipv6Prefix</code>\\n            option.</p>\"\n                    }\n                },\n                \"PrimaryIpv6\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The primary IPv6 address of the network interface. When you enable an IPv6 GUA address to be a primary IPv6, the first IPv6 GUA will be made the primary IPv6 address until the instance is terminated or the network interface is detached. For more information about primary IPv6 addresses, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RunInstances.html\\\">RunInstances</a>.</p>\"\n                    }\n                },\n                \"EnaSrdSpecification\": {\n                    \"target\": \"com.amazonaws.ec2#EnaSrdSpecificationRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the ENA Express settings for the network interface that's attached to\\n            the instance.</p>\"\n                    }\n                },\n                \"ConnectionTrackingSpecification\": {\n                    \"target\": \"com.amazonaws.ec2#ConnectionTrackingSpecificationRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A security group connection tracking specification that enables you to set the timeout\\n            for connection tracking on an Elastic network interface. For more information, see\\n                <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/security-group-connection-tracking.html#connection-tracking-timeouts\\\">Connection tracking timeouts</a> in the\\n            <i>Amazon EC2 User Guide</i>.</p>\"\n                    }\n                },\n                \"EnaQueueCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of ENA queues to be created with the instance.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a network interface.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#InstanceNetworkInterfaceSpecificationList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#InstanceNetworkInterfaceSpecification\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#InstanceNetworkPerformanceOptions\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"BandwidthWeighting\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceBandwidthWeighting\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"BandwidthWeighting\",\n                        \"smithy.api#documentation\": \"<p>When you configure network bandwidth weighting, you can boost your baseline bandwidth for either \\n    \\t\\tnetworking or EBS by up to 25%. The total available baseline bandwidth for your instance remains \\n    \\t\\tthe same. The default option uses the standard bandwidth configuration for your instance type.</p>\",\n                        \"smithy.api#xmlName\": \"bandwidthWeighting\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>With network performance options, you can adjust your bandwidth preferences to meet \\n    \\t\\tthe needs of the workload that runs on your instance.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#InstanceNetworkPerformanceOptionsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"BandwidthWeighting\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceBandwidthWeighting\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify the bandwidth weighting option to boost the associated type of baseline bandwidth, \\n    \\t\\tas follows:</p>\\n         <dl>\\n            <dt>default</dt>\\n            <dd>\\n               <p>This option uses the standard bandwidth configuration for your instance type.</p>\\n            </dd>\\n            <dt>vpc-1</dt>\\n            <dd>\\n               <p>This option boosts your networking baseline bandwidth and reduces your EBS baseline \\n    \\t\\t\\t\\t\\tbandwidth.</p>\\n            </dd>\\n            <dt>ebs-1</dt>\\n            <dd>\\n               <p>This option boosts your EBS baseline bandwidth and reduces your networking baseline \\n    \\t\\t\\t\\t\\tbandwidth.</p>\\n            </dd>\\n         </dl>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Configure network performance options for your instance that are geared towards performance \\n    \\t\\timprovements based on the workload that it runs.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#InstancePrivateIpAddress\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Association\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceNetworkInterfaceAssociation\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Association\",\n                        \"smithy.api#documentation\": \"<p>The association information for an Elastic IP address for the network\\n            interface.</p>\",\n                        \"smithy.api#xmlName\": \"association\"\n                    }\n                },\n                \"Primary\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Primary\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether this IPv4 address is the primary private IP address of the network\\n            interface.</p>\",\n                        \"smithy.api#xmlName\": \"primary\"\n                    }\n                },\n                \"PrivateDnsName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PrivateDnsName\",\n                        \"smithy.api#documentation\": \"<p>The private IPv4 DNS name.</p>\",\n                        \"smithy.api#xmlName\": \"privateDnsName\"\n                    }\n                },\n                \"PrivateIpAddress\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PrivateIpAddress\",\n                        \"smithy.api#documentation\": \"<p>The private IPv4 address of the network interface.</p>\",\n                        \"smithy.api#xmlName\": \"privateIpAddress\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a private IPv4 address.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#InstancePrivateIpAddressList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#InstancePrivateIpAddress\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#InstanceRebootMigrationState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"disabled\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"disabled\"\n                    }\n                },\n                \"default\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"default\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#InstanceRequirements\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VCpuCount\": {\n                    \"target\": \"com.amazonaws.ec2#VCpuCountRange\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VCpuCount\",\n                        \"smithy.api#documentation\": \"<p>The minimum and maximum number of vCPUs.</p>\",\n                        \"smithy.api#xmlName\": \"vCpuCount\"\n                    }\n                },\n                \"MemoryMiB\": {\n                    \"target\": \"com.amazonaws.ec2#MemoryMiB\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MemoryMiB\",\n                        \"smithy.api#documentation\": \"<p>The minimum and maximum amount of memory, in MiB.</p>\",\n                        \"smithy.api#xmlName\": \"memoryMiB\"\n                    }\n                },\n                \"CpuManufacturers\": {\n                    \"target\": \"com.amazonaws.ec2#CpuManufacturerSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CpuManufacturerSet\",\n                        \"smithy.api#documentation\": \"<p>The CPU manufacturers to include.</p>\\n         <ul>\\n            <li>\\n               <p>For instance types with Intel CPUs, specify <code>intel</code>.</p>\\n            </li>\\n            <li>\\n               <p>For instance types with AMD CPUs, specify <code>amd</code>.</p>\\n            </li>\\n            <li>\\n               <p>For instance types with Amazon Web Services CPUs, specify <code>amazon-web-services</code>.</p>\\n            </li>\\n            <li>\\n               <p>For instance types with Apple CPUs, specify <code>apple</code>.</p>\\n            </li>\\n         </ul>\\n         <note>\\n            <p>Don't confuse the CPU manufacturer with the CPU architecture. Instances will \\n         be launched with a compatible CPU architecture based on the Amazon Machine Image (AMI) that you \\n         specify in your launch template.</p>\\n         </note>\\n         <p>Default: Any manufacturer</p>\",\n                        \"smithy.api#xmlName\": \"cpuManufacturerSet\"\n                    }\n                },\n                \"MemoryGiBPerVCpu\": {\n                    \"target\": \"com.amazonaws.ec2#MemoryGiBPerVCpu\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MemoryGiBPerVCpu\",\n                        \"smithy.api#documentation\": \"<p>The minimum and maximum amount of memory per vCPU, in GiB.</p>\\n         <p>Default: No minimum or maximum limits</p>\",\n                        \"smithy.api#xmlName\": \"memoryGiBPerVCpu\"\n                    }\n                },\n                \"ExcludedInstanceTypes\": {\n                    \"target\": \"com.amazonaws.ec2#ExcludedInstanceTypeSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ExcludedInstanceTypeSet\",\n                        \"smithy.api#documentation\": \"<p>The instance types to exclude.</p>\\n         <p>You can use strings with one or more wild cards, represented by\\n      an asterisk (<code>*</code>), to exclude an instance type, size, or generation. The\\n      following are examples: <code>m5.8xlarge</code>, <code>c5*.*</code>, <code>m5a.*</code>,\\n      <code>r*</code>, <code>*3*</code>.</p>\\n         <p>For example, if you specify <code>c5*</code>,Amazon EC2 will exclude the entire C5 instance\\n      family, which includes all C5a and C5n instance types. If you specify\\n      <code>m5a.*</code>, Amazon EC2 will exclude all the M5a instance types, but not the M5n\\n      instance types.</p>\\n         <note>\\n            <p>If you specify <code>ExcludedInstanceTypes</code>, you can't specify <code>AllowedInstanceTypes</code>.</p>\\n         </note>\\n         <p>Default: No excluded instance types</p>\",\n                        \"smithy.api#xmlName\": \"excludedInstanceTypeSet\"\n                    }\n                },\n                \"InstanceGenerations\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceGenerationSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceGenerationSet\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether current or previous generation instance types are included. The\\n      current generation instance types are recommended for use. Current generation instance types are\\n      typically the latest two to three generations in each instance family. For more\\n      information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html\\\">Instance types</a> in the\\n      <i>Amazon EC2 User Guide</i>.</p>\\n         <p>For current generation instance types, specify <code>current</code>.</p>\\n         <p>For previous generation instance types, specify <code>previous</code>.</p>\\n         <p>Default: Current and previous generation instance types</p>\",\n                        \"smithy.api#xmlName\": \"instanceGenerationSet\"\n                    }\n                },\n                \"SpotMaxPricePercentageOverLowestPrice\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SpotMaxPricePercentageOverLowestPrice\",\n                        \"smithy.api#documentation\": \"<p>[Price protection] The price protection threshold for Spot Instances, as a percentage higher than\\n         an identified Spot price. The identified Spot price is the Spot price of the lowest priced\\n         current generation C, M, or R instance type with your specified attributes. If no current\\n         generation C, M, or R instance type matches your attributes, then the identified Spot price\\n         is from the lowest priced current generation instance types, and failing that, from the\\n         lowest priced previous generation instance types that match your attributes. When Amazon EC2\\n         selects instance types with your attributes, it will exclude instance types whose Spot\\n         price exceeds your specified threshold.</p>\\n         <p>The parameter accepts an integer, which Amazon EC2 interprets as a percentage.</p>\\n         <p>If you set <code>TargetCapacityUnitType</code> to <code>vcpu</code> or\\n            <code>memory-mib</code>, the price protection threshold is applied based on the per-vCPU\\n         or per-memory price instead of the per-instance price.</p>\\n         <p>This parameter is not supported for <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetSpotPlacementScores.html\\\">GetSpotPlacementScores</a> and <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetInstanceTypesFromInstanceRequirements.html\\\">GetInstanceTypesFromInstanceRequirements</a>.</p>\\n         <note>\\n            <p>Only one of <code>SpotMaxPricePercentageOverLowestPrice</code> or\\n               <code>MaxSpotPriceAsPercentageOfOptimalOnDemandPrice</code> can be specified. If you\\n            don't specify either, Amazon EC2 will automatically apply optimal price protection to\\n            consistently select from a wide range of instance types. To indicate no price protection\\n            threshold for Spot Instances, meaning you want to consider all instance types that match your\\n            attributes, include one of these parameters and specify a high value, such as\\n               <code>999999</code>.</p>\\n         </note>\\n         <p>Default: <code>100</code>\\n         </p>\",\n                        \"smithy.api#xmlName\": \"spotMaxPricePercentageOverLowestPrice\"\n                    }\n                },\n                \"OnDemandMaxPricePercentageOverLowestPrice\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OnDemandMaxPricePercentageOverLowestPrice\",\n                        \"smithy.api#documentation\": \"<p>[Price protection] The price protection threshold for On-Demand Instances, as a percentage higher\\n         than an identified On-Demand price. The identified On-Demand price is the price of the\\n         lowest priced current generation C, M, or R instance type with your specified attributes.\\n         When Amazon EC2 selects instance types with your attributes, it will exclude instance types\\n         whose price exceeds your specified threshold.</p>\\n         <p>The parameter accepts an integer, which Amazon EC2 interprets as a percentage.</p>\\n         <p>To turn off price protection, specify a high value, such as <code>999999</code>.</p>\\n         <p>This parameter is not supported for <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetSpotPlacementScores.html\\\">GetSpotPlacementScores</a> and <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetInstanceTypesFromInstanceRequirements.html\\\">GetInstanceTypesFromInstanceRequirements</a>.</p>\\n         <note>\\n            <p>If you set <code>TargetCapacityUnitType</code> to <code>vcpu</code> or\\n         <code>memory-mib</code>, the price protection threshold is applied based on the\\n         per-vCPU or per-memory price instead of the per-instance price.</p>\\n         </note>\\n         <p>Default: <code>20</code>\\n         </p>\",\n                        \"smithy.api#xmlName\": \"onDemandMaxPricePercentageOverLowestPrice\"\n                    }\n                },\n                \"BareMetal\": {\n                    \"target\": \"com.amazonaws.ec2#BareMetal\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"BareMetal\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether bare metal instance types must be included, excluded, or required.</p>\\n         <ul>\\n            <li>\\n               <p>To include bare metal instance types, specify <code>included</code>.</p>\\n            </li>\\n            <li>\\n               <p>To require only bare metal instance types, specify <code>required</code>.</p>\\n            </li>\\n            <li>\\n               <p>To exclude bare metal instance types, specify <code>excluded</code>.</p>\\n            </li>\\n         </ul>\\n         <p>Default: <code>excluded</code>\\n         </p>\",\n                        \"smithy.api#xmlName\": \"bareMetal\"\n                    }\n                },\n                \"BurstablePerformance\": {\n                    \"target\": \"com.amazonaws.ec2#BurstablePerformance\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"BurstablePerformance\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether burstable performance T instance types are included, excluded, or required. For more information, see \\n      <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/burstable-performance-instances.html\\\">Burstable performance instances</a>.</p>\\n         <ul>\\n            <li>\\n               <p>To include burstable performance instance types, specify <code>included</code>.</p>\\n            </li>\\n            <li>\\n               <p>To require only burstable performance instance types, specify <code>required</code>.</p>\\n            </li>\\n            <li>\\n               <p>To exclude burstable performance instance types, specify <code>excluded</code>.</p>\\n            </li>\\n         </ul>\\n         <p>Default: <code>excluded</code>\\n         </p>\",\n                        \"smithy.api#xmlName\": \"burstablePerformance\"\n                    }\n                },\n                \"RequireHibernateSupport\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RequireHibernateSupport\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether instance types must support hibernation for On-Demand\\n         Instances.</p>\\n         <p>This parameter is not supported for <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetSpotPlacementScores.html\\\">GetSpotPlacementScores</a>.</p>\\n         <p>Default: <code>false</code>\\n         </p>\",\n                        \"smithy.api#xmlName\": \"requireHibernateSupport\"\n                    }\n                },\n                \"NetworkInterfaceCount\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInterfaceCount\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkInterfaceCount\",\n                        \"smithy.api#documentation\": \"<p>The minimum and maximum number of network interfaces.</p>\\n         <p>Default: No minimum or maximum limits</p>\",\n                        \"smithy.api#xmlName\": \"networkInterfaceCount\"\n                    }\n                },\n                \"LocalStorage\": {\n                    \"target\": \"com.amazonaws.ec2#LocalStorage\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LocalStorage\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether instance types with instance store volumes are included, excluded, or required. For more information,\\n            <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/InstanceStorage.html\\\">Amazon\\n            EC2 instance store</a> in the <i>Amazon EC2 User Guide</i>.</p>\\n         <ul>\\n            <li>\\n               <p>To include instance types with instance store volumes, specify\\n               <code>included</code>.</p>\\n            </li>\\n            <li>\\n               <p>To require only instance types with instance store volumes, specify\\n                  <code>required</code>.</p>\\n            </li>\\n            <li>\\n               <p>To exclude instance types with instance store volumes, specify\\n               <code>excluded</code>.</p>\\n            </li>\\n         </ul>\\n         <p>Default: <code>included</code>\\n         </p>\",\n                        \"smithy.api#xmlName\": \"localStorage\"\n                    }\n                },\n                \"LocalStorageTypes\": {\n                    \"target\": \"com.amazonaws.ec2#LocalStorageTypeSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LocalStorageTypeSet\",\n                        \"smithy.api#documentation\": \"<p>The type of local storage that is required.</p>\\n         <ul>\\n            <li>\\n               <p>For instance types with hard disk drive (HDD) storage, specify <code>hdd</code>.</p>\\n            </li>\\n            <li>\\n               <p>For instance types with solid state drive (SSD) storage, specify\\n               <code>ssd</code>.</p>\\n            </li>\\n         </ul>\\n         <p>Default: <code>hdd</code> and <code>ssd</code>\\n         </p>\",\n                        \"smithy.api#xmlName\": \"localStorageTypeSet\"\n                    }\n                },\n                \"TotalLocalStorageGB\": {\n                    \"target\": \"com.amazonaws.ec2#TotalLocalStorageGB\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TotalLocalStorageGB\",\n                        \"smithy.api#documentation\": \"<p>The minimum and maximum amount of total local storage, in GB.</p>\\n         <p>Default: No minimum or maximum limits</p>\",\n                        \"smithy.api#xmlName\": \"totalLocalStorageGB\"\n                    }\n                },\n                \"BaselineEbsBandwidthMbps\": {\n                    \"target\": \"com.amazonaws.ec2#BaselineEbsBandwidthMbps\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"BaselineEbsBandwidthMbps\",\n                        \"smithy.api#documentation\": \"<p>The minimum and maximum baseline bandwidth to Amazon EBS, in Mbps. For more information, see\\n            <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-optimized.html\\\">Amazon\\n            EBS–optimized instances</a> in the <i>Amazon EC2 User Guide</i>.</p>\\n         <p>Default: No minimum or maximum limits</p>\",\n                        \"smithy.api#xmlName\": \"baselineEbsBandwidthMbps\"\n                    }\n                },\n                \"AcceleratorTypes\": {\n                    \"target\": \"com.amazonaws.ec2#AcceleratorTypeSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AcceleratorTypeSet\",\n                        \"smithy.api#documentation\": \"<p>The accelerator types that must be on the instance type.</p>\\n         <ul>\\n            <li>\\n               <p>For instance types with FPGA accelerators, specify <code>fpga</code>.</p>\\n            </li>\\n            <li>\\n               <p>For instance types with GPU accelerators, specify <code>gpu</code>.</p>\\n            </li>\\n            <li>\\n               <p>For instance types with Inference accelerators, specify <code>inference</code>.</p>\\n            </li>\\n         </ul>\\n         <p>Default: Any accelerator type</p>\",\n                        \"smithy.api#xmlName\": \"acceleratorTypeSet\"\n                    }\n                },\n                \"AcceleratorCount\": {\n                    \"target\": \"com.amazonaws.ec2#AcceleratorCount\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AcceleratorCount\",\n                        \"smithy.api#documentation\": \"<p>The minimum and maximum number of accelerators (GPUs, FPGAs, or Amazon Web Services Inferentia chips) on\\n         an instance.</p>\\n         <p>To exclude accelerator-enabled instance types, set <code>Max</code> to <code>0</code>.</p>\\n         <p>Default: No minimum or maximum limits</p>\",\n                        \"smithy.api#xmlName\": \"acceleratorCount\"\n                    }\n                },\n                \"AcceleratorManufacturers\": {\n                    \"target\": \"com.amazonaws.ec2#AcceleratorManufacturerSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AcceleratorManufacturerSet\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether instance types must have accelerators by specific manufacturers.</p>\\n         <ul>\\n            <li>\\n               <p>For instance types with Amazon Web Services devices, specify <code>amazon-web-services</code>.</p>\\n            </li>\\n            <li>\\n               <p>For instance types with AMD devices, specify <code>amd</code>.</p>\\n            </li>\\n            <li>\\n               <p>For instance types with Habana devices, specify <code>habana</code>.</p>\\n            </li>\\n            <li>\\n               <p>For instance types with NVIDIA devices, specify <code>nvidia</code>.</p>\\n            </li>\\n            <li>\\n               <p>For instance types with Xilinx devices, specify <code>xilinx</code>.</p>\\n            </li>\\n         </ul>\\n         <p>Default: Any manufacturer</p>\",\n                        \"smithy.api#xmlName\": \"acceleratorManufacturerSet\"\n                    }\n                },\n                \"AcceleratorNames\": {\n                    \"target\": \"com.amazonaws.ec2#AcceleratorNameSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AcceleratorNameSet\",\n                        \"smithy.api#documentation\": \"<p>The accelerators that must be on the instance type.</p>\\n         <ul>\\n            <li>\\n               <p>For instance types with NVIDIA A10G GPUs, specify <code>a10g</code>.</p>\\n            </li>\\n            <li>\\n               <p>For instance types with NVIDIA A100 GPUs, specify <code>a100</code>.</p>\\n            </li>\\n            <li>\\n               <p>For instance types with NVIDIA H100 GPUs, specify <code>h100</code>.</p>\\n            </li>\\n            <li>\\n               <p>For instance types with Amazon Web Services Inferentia chips, specify <code>inferentia</code>.</p>\\n            </li>\\n            <li>\\n               <p>For instance types with NVIDIA GRID K520 GPUs, specify <code>k520</code>.</p>\\n            </li>\\n            <li>\\n               <p>For instance types with NVIDIA K80 GPUs, specify <code>k80</code>.</p>\\n            </li>\\n            <li>\\n               <p>For instance types with NVIDIA M60 GPUs, specify <code>m60</code>.</p>\\n            </li>\\n            <li>\\n               <p>For instance types with AMD Radeon Pro V520 GPUs, specify <code>radeon-pro-v520</code>.</p>\\n            </li>\\n            <li>\\n               <p>For instance types with NVIDIA T4 GPUs, specify <code>t4</code>.</p>\\n            </li>\\n            <li>\\n               <p>For instance types with NVIDIA T4G GPUs, specify <code>t4g</code>.</p>\\n            </li>\\n            <li>\\n               <p>For instance types with Xilinx VU9P FPGAs, specify <code>vu9p</code>.</p>\\n            </li>\\n            <li>\\n               <p>For instance types with NVIDIA V100 GPUs, specify <code>v100</code>.</p>\\n            </li>\\n         </ul>\\n         <p>Default: Any accelerator</p>\",\n                        \"smithy.api#xmlName\": \"acceleratorNameSet\"\n                    }\n                },\n                \"AcceleratorTotalMemoryMiB\": {\n                    \"target\": \"com.amazonaws.ec2#AcceleratorTotalMemoryMiB\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AcceleratorTotalMemoryMiB\",\n                        \"smithy.api#documentation\": \"<p>The minimum and maximum amount of total accelerator memory, in MiB.</p>\\n         <p>Default: No minimum or maximum limits</p>\",\n                        \"smithy.api#xmlName\": \"acceleratorTotalMemoryMiB\"\n                    }\n                },\n                \"NetworkBandwidthGbps\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkBandwidthGbps\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkBandwidthGbps\",\n                        \"smithy.api#documentation\": \"<p>The minimum and maximum amount of network bandwidth, in gigabits per second (Gbps).</p>\\n         <p>Default: No minimum or maximum limits</p>\",\n                        \"smithy.api#xmlName\": \"networkBandwidthGbps\"\n                    }\n                },\n                \"AllowedInstanceTypes\": {\n                    \"target\": \"com.amazonaws.ec2#AllowedInstanceTypeSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AllowedInstanceTypeSet\",\n                        \"smithy.api#documentation\": \"<p>The instance types to apply your specified attributes against. All other instance types \\n         are ignored, even if they match your specified attributes.</p>\\n         <p>You can use strings with one or more wild cards, represented by\\n         an asterisk (<code>*</code>), to allow an instance type, size, or generation. The\\n         following are examples: <code>m5.8xlarge</code>, <code>c5*.*</code>, <code>m5a.*</code>,\\n         <code>r*</code>, <code>*3*</code>.</p>\\n         <p>For example, if you specify <code>c5*</code>,Amazon EC2 will allow the entire C5 instance\\n         family, which includes all C5a and C5n instance types. If you specify\\n         <code>m5a.*</code>, Amazon EC2 will allow all the M5a instance types, but not the M5n\\n         instance types.</p>\\n         <note>\\n            <p>If you specify <code>AllowedInstanceTypes</code>, you can't specify <code>ExcludedInstanceTypes</code>.</p>\\n         </note>\\n         <p>Default: All instance types</p>\",\n                        \"smithy.api#xmlName\": \"allowedInstanceTypeSet\"\n                    }\n                },\n                \"MaxSpotPriceAsPercentageOfOptimalOnDemandPrice\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MaxSpotPriceAsPercentageOfOptimalOnDemandPrice\",\n                        \"smithy.api#documentation\": \"<p>[Price protection] The price protection threshold for Spot Instances, as a percentage of an\\n         identified On-Demand price. The identified On-Demand price is the price of the lowest\\n         priced current generation C, M, or R instance type with your specified attributes. If no\\n         current generation C, M, or R instance type matches your attributes, then the identified\\n         price is from the lowest priced current generation instance types, and failing that, from\\n         the lowest priced previous generation instance types that match your attributes. When Amazon EC2\\n         selects instance types with your attributes, it will exclude instance types whose price\\n         exceeds your specified threshold.</p>\\n         <p>The parameter accepts an integer, which Amazon EC2 interprets as a percentage.</p>\\n         <p>If you set <code>TargetCapacityUnitType</code> to <code>vcpu</code> or\\n            <code>memory-mib</code>, the price protection threshold is based on the per vCPU or per\\n         memory price instead of the per instance price.</p>\\n         <note>\\n            <p>Only one of <code>SpotMaxPricePercentageOverLowestPrice</code> or\\n               <code>MaxSpotPriceAsPercentageOfOptimalOnDemandPrice</code> can be specified. If you\\n            don't specify either, Amazon EC2 will automatically apply optimal price protection to\\n            consistently select from a wide range of instance types. To indicate no price protection\\n            threshold for Spot Instances, meaning you want to consider all instance types that match your\\n            attributes, include one of these parameters and specify a high value, such as\\n               <code>999999</code>.</p>\\n         </note>\",\n                        \"smithy.api#xmlName\": \"maxSpotPriceAsPercentageOfOptimalOnDemandPrice\"\n                    }\n                },\n                \"BaselinePerformanceFactors\": {\n                    \"target\": \"com.amazonaws.ec2#BaselinePerformanceFactors\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"BaselinePerformanceFactors\",\n                        \"smithy.api#documentation\": \"<p>The baseline performance to consider, using an instance family as a baseline reference.\\n         The instance family establishes the lowest acceptable level of performance. Amazon EC2 uses this\\n         baseline to guide instance type selection, but there is no guarantee that the selected\\n         instance types will always exceed the baseline for every application. Currently, this\\n         parameter only supports CPU performance as a baseline performance factor. For more\\n         information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-fleet-attribute-based-instance-type-selection.html#ec2fleet-abis-performance-protection\\\">Performance protection</a> in the <i>Amazon EC2 User Guide</i>.</p>\",\n                        \"smithy.api#xmlName\": \"baselinePerformanceFactors\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The attributes for the instance types. When you specify instance attributes, Amazon EC2 will\\n         identify instance types with these attributes.</p>\\n         <p>You must specify <code>VCpuCount</code> and <code>MemoryMiB</code>. All other attributes\\n         are optional. Any unspecified optional attribute is set to its default.</p>\\n         <p>When you specify multiple attributes, you get instance types that satisfy all of the\\n         specified attributes. If you specify multiple values for an attribute, you get instance\\n         types that satisfy any of the specified values.</p>\\n         <p>To limit the list of instance types from which Amazon EC2 can identify matching instance types, \\n         you can use one of the following parameters, but not both in the same request:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>AllowedInstanceTypes</code> - The instance types to include in the list. All \\n               other instance types are ignored, even if they match your specified attributes.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ExcludedInstanceTypes</code> - The instance types to exclude from the list, \\n               even if they match your specified attributes.</p>\\n            </li>\\n         </ul>\\n         <note>\\n            <p>If you specify <code>InstanceRequirements</code>, you can't specify\\n            <code>InstanceType</code>.</p>\\n            <p>Attribute-based instance type selection is only supported when using Auto Scaling\\n            groups, EC2 Fleet, and Spot Fleet to launch instances. If you plan to use the launch template in\\n            the <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-launch-instance-wizard.html\\\">launch instance\\n               wizard</a> or with the <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RunInstances.html\\\">RunInstances API</a>, you\\n            can't specify <code>InstanceRequirements</code>.</p>\\n         </note>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/autoscaling/ec2/userguide/create-mixed-instances-group-attribute-based-instance-type-selection.html\\\">Create mixed instances group using attribute-based instance type selection</a> in\\n         the <i>Amazon EC2 Auto Scaling User Guide</i>, and also <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-fleet-attribute-based-instance-type-selection.html\\\">Specify attributes for instance type selection for EC2 Fleet or Spot Fleet</a> and <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-placement-score.html\\\">Spot\\n            placement score</a> in the <i>Amazon EC2 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#InstanceRequirementsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VCpuCount\": {\n                    \"target\": \"com.amazonaws.ec2#VCpuCountRangeRequest\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The minimum and maximum number of vCPUs.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"MemoryMiB\": {\n                    \"target\": \"com.amazonaws.ec2#MemoryMiBRequest\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The minimum and maximum amount of memory, in MiB.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"CpuManufacturers\": {\n                    \"target\": \"com.amazonaws.ec2#CpuManufacturerSet\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The CPU manufacturers to include.</p>\\n         <ul>\\n            <li>\\n               <p>For instance types with Intel CPUs, specify <code>intel</code>.</p>\\n            </li>\\n            <li>\\n               <p>For instance types with AMD CPUs, specify <code>amd</code>.</p>\\n            </li>\\n            <li>\\n               <p>For instance types with Amazon Web Services CPUs, specify <code>amazon-web-services</code>.</p>\\n            </li>\\n            <li>\\n               <p>For instance types with Apple CPUs, specify <code>apple</code>.</p>\\n            </li>\\n         </ul>\\n         <note>\\n            <p>Don't confuse the CPU manufacturer with the CPU architecture. Instances will \\n         be launched with a compatible CPU architecture based on the Amazon Machine Image (AMI) that you \\n         specify in your launch template.</p>\\n         </note>\\n         <p>Default: Any manufacturer</p>\",\n                        \"smithy.api#xmlName\": \"CpuManufacturer\"\n                    }\n                },\n                \"MemoryGiBPerVCpu\": {\n                    \"target\": \"com.amazonaws.ec2#MemoryGiBPerVCpuRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The minimum and maximum amount of memory per vCPU, in GiB.</p>\\n         <p>Default: No minimum or maximum limits</p>\"\n                    }\n                },\n                \"ExcludedInstanceTypes\": {\n                    \"target\": \"com.amazonaws.ec2#ExcludedInstanceTypeSet\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The instance types to exclude.</p>\\n         <p>You can use strings with one or more wild cards, represented by\\n         an asterisk (<code>*</code>), to exclude an instance family, type, size, or generation. The\\n         following are examples: <code>m5.8xlarge</code>, <code>c5*.*</code>, <code>m5a.*</code>,\\n            <code>r*</code>, <code>*3*</code>.</p>\\n         <p>For example, if you specify <code>c5*</code>,Amazon EC2 will exclude the entire C5 instance\\n      family, which includes all C5a and C5n instance types. If you specify\\n      <code>m5a.*</code>, Amazon EC2 will exclude all the M5a instance types, but not the M5n\\n      instance types.</p>\\n         <note>\\n            <p>If you specify <code>ExcludedInstanceTypes</code>, you can't specify <code>AllowedInstanceTypes</code>.</p>\\n         </note>\\n         <p>Default: No excluded instance types</p>\",\n                        \"smithy.api#xmlName\": \"ExcludedInstanceType\"\n                    }\n                },\n                \"InstanceGenerations\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceGenerationSet\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether current or previous generation instance types are included. The\\n      current generation instance types are recommended for use. Current generation instance types are\\n      typically the latest two to three generations in each instance family. For more\\n      information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html\\\">Instance types</a> in the\\n      <i>Amazon EC2 User Guide</i>.</p>\\n         <p>For current generation instance types, specify <code>current</code>.</p>\\n         <p>For previous generation instance types, specify <code>previous</code>.</p>\\n         <p>Default: Current and previous generation instance types</p>\",\n                        \"smithy.api#xmlName\": \"InstanceGeneration\"\n                    }\n                },\n                \"SpotMaxPricePercentageOverLowestPrice\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>[Price protection] The price protection threshold for Spot Instances, as a percentage higher than\\n         an identified Spot price. The identified Spot price is the Spot price of the lowest priced\\n         current generation C, M, or R instance type with your specified attributes. If no current\\n         generation C, M, or R instance type matches your attributes, then the identified Spot price\\n         is from the lowest priced current generation instance types, and failing that, from the\\n         lowest priced previous generation instance types that match your attributes. When Amazon EC2\\n         selects instance types with your attributes, it will exclude instance types whose Spot\\n         price exceeds your specified threshold.</p>\\n         <p>The parameter accepts an integer, which Amazon EC2 interprets as a percentage.</p>\\n         <p>If you set <code>TargetCapacityUnitType</code> to <code>vcpu</code> or\\n         <code>memory-mib</code>, the price protection threshold is applied based on the\\n         per-vCPU or per-memory price instead of the per-instance price.</p>\\n         <p>This parameter is not supported for <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetSpotPlacementScores.html\\\">GetSpotPlacementScores</a> and <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetInstanceTypesFromInstanceRequirements.html\\\">GetInstanceTypesFromInstanceRequirements</a>.</p>\\n         <note>\\n            <p>Only one of <code>SpotMaxPricePercentageOverLowestPrice</code> or\\n               <code>MaxSpotPriceAsPercentageOfOptimalOnDemandPrice</code> can be specified. If you\\n            don't specify either, Amazon EC2 will automatically apply optimal price protection to\\n            consistently select from a wide range of instance types. To indicate no price protection\\n            threshold for Spot Instances, meaning you want to consider all instance types that match your\\n            attributes, include one of these parameters and specify a high value, such as\\n               <code>999999</code>.</p>\\n         </note>\\n         <p>Default: <code>100</code>\\n         </p>\"\n                    }\n                },\n                \"OnDemandMaxPricePercentageOverLowestPrice\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>[Price protection] The price protection threshold for On-Demand Instances, as a percentage higher than\\n         an identified On-Demand price. The identified On-Demand price is the price of the lowest\\n         priced current generation C, M, or R instance type with your specified attributes. When\\n         Amazon EC2 selects instance types with your attributes, it will exclude instance types whose\\n         price exceeds your specified threshold.</p>\\n         <p>The parameter accepts an integer, which Amazon EC2 interprets as a percentage.</p>\\n         <p>To indicate no price protection threshold, specify a high value, such as\\n            <code>999999</code>.</p>\\n         <p>This parameter is not supported for <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetSpotPlacementScores.html\\\">GetSpotPlacementScores</a> and <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetInstanceTypesFromInstanceRequirements.html\\\">GetInstanceTypesFromInstanceRequirements</a>.</p>\\n         <note>\\n            <p>If you set <code>TargetCapacityUnitType</code> to <code>vcpu</code> or\\n         <code>memory-mib</code>, the price protection threshold is applied based on the\\n         per-vCPU or per-memory price instead of the per-instance price.</p>\\n         </note>\\n         <p>Default: <code>20</code>\\n         </p>\"\n                    }\n                },\n                \"BareMetal\": {\n                    \"target\": \"com.amazonaws.ec2#BareMetal\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether bare metal instance types must be included, excluded, or required.</p>\\n         <ul>\\n            <li>\\n               <p>To include bare metal instance types, specify <code>included</code>.</p>\\n            </li>\\n            <li>\\n               <p>To require only bare metal instance types, specify <code>required</code>.</p>\\n            </li>\\n            <li>\\n               <p>To exclude bare metal instance types, specify <code>excluded</code>.</p>\\n            </li>\\n         </ul>\\n         <p>Default: <code>excluded</code>\\n         </p>\"\n                    }\n                },\n                \"BurstablePerformance\": {\n                    \"target\": \"com.amazonaws.ec2#BurstablePerformance\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether burstable performance T instance types are included, excluded, or required. For more information, see \\n      <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/burstable-performance-instances.html\\\">Burstable performance instances</a>.</p>\\n         <ul>\\n            <li>\\n               <p>To include burstable performance instance types, specify <code>included</code>.</p>\\n            </li>\\n            <li>\\n               <p>To require only burstable performance instance types, specify <code>required</code>.</p>\\n            </li>\\n            <li>\\n               <p>To exclude burstable performance instance types, specify <code>excluded</code>.</p>\\n            </li>\\n         </ul>\\n         <p>Default: <code>excluded</code>\\n         </p>\"\n                    }\n                },\n                \"RequireHibernateSupport\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether instance types must support hibernation for On-Demand Instances.</p>\\n         <p>This parameter is not supported for <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetSpotPlacementScores.html\\\">GetSpotPlacementScores</a>.</p>\\n         <p>Default: <code>false</code>\\n         </p>\"\n                    }\n                },\n                \"NetworkInterfaceCount\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInterfaceCountRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The minimum and maximum number of network interfaces.</p>\\n         <p>Default: No minimum or maximum limits</p>\"\n                    }\n                },\n                \"LocalStorage\": {\n                    \"target\": \"com.amazonaws.ec2#LocalStorage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether instance types with instance store volumes are included, excluded, or required. For more information,\\n      <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/InstanceStorage.html\\\">Amazon\\n         EC2 instance store</a> in the <i>Amazon EC2 User Guide</i>.</p>\\n         <ul>\\n            <li>\\n               <p>To include instance types with instance store volumes, specify\\n                  <code>included</code>.</p>\\n            </li>\\n            <li>\\n               <p>To require only instance types with instance store volumes, specify\\n                  <code>required</code>.</p>\\n            </li>\\n            <li>\\n               <p>To exclude instance types with instance store volumes, specify\\n                  <code>excluded</code>.</p>\\n            </li>\\n         </ul>\\n         <p>Default: <code>included</code>\\n         </p>\"\n                    }\n                },\n                \"LocalStorageTypes\": {\n                    \"target\": \"com.amazonaws.ec2#LocalStorageTypeSet\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of local storage that is required.</p>\\n         <ul>\\n            <li>\\n               <p>For instance types with hard disk drive (HDD) storage, specify <code>hdd</code>.</p>\\n            </li>\\n            <li>\\n               <p>For instance types with solid state drive (SSD) storage, specify\\n               <code>ssd</code>.</p>\\n            </li>\\n         </ul>\\n         <p>Default: <code>hdd</code> and <code>ssd</code>\\n         </p>\",\n                        \"smithy.api#xmlName\": \"LocalStorageType\"\n                    }\n                },\n                \"TotalLocalStorageGB\": {\n                    \"target\": \"com.amazonaws.ec2#TotalLocalStorageGBRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The minimum and maximum amount of total local storage, in GB.</p>\\n         <p>Default: No minimum or maximum limits</p>\"\n                    }\n                },\n                \"BaselineEbsBandwidthMbps\": {\n                    \"target\": \"com.amazonaws.ec2#BaselineEbsBandwidthMbpsRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The minimum and maximum baseline bandwidth to Amazon EBS, in Mbps. For more information, see\\n            <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-optimized.html\\\">Amazon\\n            EBS–optimized instances</a> in the <i>Amazon EC2 User Guide</i>.</p>\\n         <p>Default: No minimum or maximum limits</p>\"\n                    }\n                },\n                \"AcceleratorTypes\": {\n                    \"target\": \"com.amazonaws.ec2#AcceleratorTypeSet\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The accelerator types that must be on the instance type.</p>\\n         <ul>\\n            <li>\\n               <p>For instance types with FPGA accelerators, specify <code>fpga</code>.</p>\\n            </li>\\n            <li>\\n               <p>For instance types with GPU accelerators, specify <code>gpu</code>.</p>\\n            </li>\\n            <li>\\n               <p>For instance types with Inference accelerators, specify <code>inference</code>.</p>\\n            </li>\\n         </ul>\\n         <p>Default: Any accelerator type</p>\",\n                        \"smithy.api#xmlName\": \"AcceleratorType\"\n                    }\n                },\n                \"AcceleratorCount\": {\n                    \"target\": \"com.amazonaws.ec2#AcceleratorCountRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The minimum and maximum number of accelerators (GPUs, FPGAs, or Amazon Web Services Inferentia chips) on\\n         an instance.</p>\\n         <p>To exclude accelerator-enabled instance types, set <code>Max</code> to <code>0</code>.</p>\\n         <p>Default: No minimum or maximum limits</p>\"\n                    }\n                },\n                \"AcceleratorManufacturers\": {\n                    \"target\": \"com.amazonaws.ec2#AcceleratorManufacturerSet\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether instance types must have accelerators by specific manufacturers.</p>\\n         <ul>\\n            <li>\\n               <p>For instance types with Amazon Web Services devices, specify <code>amazon-web-services</code>.</p>\\n            </li>\\n            <li>\\n               <p>For instance types with AMD devices, specify <code>amd</code>.</p>\\n            </li>\\n            <li>\\n               <p>For instance types with Habana devices, specify <code>habana</code>.</p>\\n            </li>\\n            <li>\\n               <p>For instance types with NVIDIA devices, specify <code>nvidia</code>.</p>\\n            </li>\\n            <li>\\n               <p>For instance types with Xilinx devices, specify <code>xilinx</code>.</p>\\n            </li>\\n         </ul>\\n         <p>Default: Any manufacturer</p>\",\n                        \"smithy.api#xmlName\": \"AcceleratorManufacturer\"\n                    }\n                },\n                \"AcceleratorNames\": {\n                    \"target\": \"com.amazonaws.ec2#AcceleratorNameSet\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The accelerators that must be on the instance type.</p>\\n         <ul>\\n            <li>\\n               <p>For instance types with NVIDIA A10G GPUs, specify <code>a10g</code>.</p>\\n            </li>\\n            <li>\\n               <p>For instance types with NVIDIA A100 GPUs, specify <code>a100</code>.</p>\\n            </li>\\n            <li>\\n               <p>For instance types with NVIDIA H100 GPUs, specify <code>h100</code>.</p>\\n            </li>\\n            <li>\\n               <p>For instance types with Amazon Web Services Inferentia chips, specify <code>inferentia</code>.</p>\\n            </li>\\n            <li>\\n               <p>For instance types with NVIDIA GRID K520 GPUs, specify <code>k520</code>.</p>\\n            </li>\\n            <li>\\n               <p>For instance types with NVIDIA K80 GPUs, specify <code>k80</code>.</p>\\n            </li>\\n            <li>\\n               <p>For instance types with NVIDIA M60 GPUs, specify <code>m60</code>.</p>\\n            </li>\\n            <li>\\n               <p>For instance types with AMD Radeon Pro V520 GPUs, specify <code>radeon-pro-v520</code>.</p>\\n            </li>\\n            <li>\\n               <p>For instance types with NVIDIA T4 GPUs, specify <code>t4</code>.</p>\\n            </li>\\n            <li>\\n               <p>For instance types with NVIDIA T4G GPUs, specify <code>t4g</code>.</p>\\n            </li>\\n            <li>\\n               <p>For instance types with Xilinx VU9P FPGAs, specify <code>vu9p</code>.</p>\\n            </li>\\n            <li>\\n               <p>For instance types with NVIDIA V100 GPUs, specify <code>v100</code>.</p>\\n            </li>\\n         </ul>\\n         <p>Default: Any accelerator</p>\",\n                        \"smithy.api#xmlName\": \"AcceleratorName\"\n                    }\n                },\n                \"AcceleratorTotalMemoryMiB\": {\n                    \"target\": \"com.amazonaws.ec2#AcceleratorTotalMemoryMiBRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The minimum and maximum amount of total accelerator memory, in MiB.</p>\\n         <p>Default: No minimum or maximum limits</p>\"\n                    }\n                },\n                \"NetworkBandwidthGbps\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkBandwidthGbpsRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The minimum and maximum amount of baseline network bandwidth, in gigabits per second \\n          (Gbps). For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-network-bandwidth.html\\\">Amazon EC2 instance network bandwidth</a> in the <i>Amazon EC2 User Guide</i>.</p>\\n         <p>Default: No minimum or maximum limits</p>\"\n                    }\n                },\n                \"AllowedInstanceTypes\": {\n                    \"target\": \"com.amazonaws.ec2#AllowedInstanceTypeSet\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The instance types to apply your specified attributes against. All other instance types \\n         are ignored, even if they match your specified attributes.</p>\\n         <p>You can use strings with one or more wild cards, represented by\\n         an asterisk (<code>*</code>), to allow an instance type, size, or generation. The\\n         following are examples: <code>m5.8xlarge</code>, <code>c5*.*</code>, <code>m5a.*</code>,\\n         <code>r*</code>, <code>*3*</code>.</p>\\n         <p>For example, if you specify <code>c5*</code>,Amazon EC2 will allow the entire C5 instance\\n         family, which includes all C5a and C5n instance types. If you specify\\n         <code>m5a.*</code>, Amazon EC2 will allow all the M5a instance types, but not the M5n\\n         instance types.</p>\\n         <note>\\n            <p>If you specify <code>AllowedInstanceTypes</code>, you can't specify <code>ExcludedInstanceTypes</code>.</p>\\n         </note>\\n         <p>Default: All instance types</p>\",\n                        \"smithy.api#xmlName\": \"AllowedInstanceType\"\n                    }\n                },\n                \"MaxSpotPriceAsPercentageOfOptimalOnDemandPrice\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>[Price protection] The price protection threshold for Spot Instances, as a percentage of an\\n         identified On-Demand price. The identified On-Demand price is the price of the lowest\\n         priced current generation C, M, or R instance type with your specified attributes. If no\\n         current generation C, M, or R instance type matches your attributes, then the identified\\n         price is from the lowest priced current generation instance types, and failing that, from\\n         the lowest priced previous generation instance types that match your attributes. When Amazon EC2\\n         selects instance types with your attributes, it will exclude instance types whose price\\n         exceeds your specified threshold.</p>\\n         <p>The parameter accepts an integer, which Amazon EC2 interprets as a percentage.</p>\\n         <p>If you set <code>TargetCapacityUnitType</code> to <code>vcpu</code> or\\n         <code>memory-mib</code>, the price protection threshold is based on the per vCPU or per\\n         memory price instead of the per instance price.</p>\\n         <note>\\n            <p>Only one of <code>SpotMaxPricePercentageOverLowestPrice</code> or\\n               <code>MaxSpotPriceAsPercentageOfOptimalOnDemandPrice</code> can be specified. If you\\n            don't specify either, Amazon EC2 will automatically apply optimal price protection to\\n            consistently select from a wide range of instance types. To indicate no price protection\\n            threshold for Spot Instances, meaning you want to consider all instance types that match your\\n            attributes, include one of these parameters and specify a high value, such as\\n               <code>999999</code>.</p>\\n         </note>\"\n                    }\n                },\n                \"BaselinePerformanceFactors\": {\n                    \"target\": \"com.amazonaws.ec2#BaselinePerformanceFactorsRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The baseline performance to consider, using an instance family as a baseline reference.\\n         The instance family establishes the lowest acceptable level of performance. Amazon EC2 uses this\\n         baseline to guide instance type selection, but there is no guarantee that the selected\\n         instance types will always exceed the baseline for every application. Currently, this\\n         parameter only supports CPU performance as a baseline performance factor. For more\\n         information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-fleet-attribute-based-instance-type-selection.html#ec2fleet-abis-performance-protection\\\">Performance protection</a> in the <i>Amazon EC2 User Guide</i>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The attributes for the instance types. When you specify instance attributes, Amazon EC2 will\\n         identify instance types with these attributes.</p>\\n         <p>You must specify <code>VCpuCount</code> and <code>MemoryMiB</code>. All other attributes\\n         are optional. Any unspecified optional attribute is set to its default.</p>\\n         <p>When you specify multiple attributes, you get instance types that satisfy all of the\\n         specified attributes. If you specify multiple values for an attribute, you get instance\\n         types that satisfy any of the specified values.</p>\\n         <p>To limit the list of instance types from which Amazon EC2 can identify matching instance types, \\n         you can use one of the following parameters, but not both in the same request:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>AllowedInstanceTypes</code> - The instance types to include in the list. All \\n               other instance types are ignored, even if they match your specified attributes.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ExcludedInstanceTypes</code> - The instance types to exclude from the list, \\n               even if they match your specified attributes.</p>\\n            </li>\\n         </ul>\\n         <note>\\n            <p>If you specify <code>InstanceRequirements</code>, you can't specify\\n            <code>InstanceType</code>.</p>\\n            <p>Attribute-based instance type selection is only supported when using Auto Scaling\\n            groups, EC2 Fleet, and Spot Fleet to launch instances. If you plan to use the launch template in\\n            the <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-launch-instance-wizard.html\\\">launch instance\\n               wizard</a>, or with the <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RunInstances.html\\\">RunInstances</a> API or\\n               <a href=\\\"https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html\\\">AWS::EC2::Instance</a> Amazon Web Services CloudFormation resource, you can't specify\\n               <code>InstanceRequirements</code>.</p>\\n         </note>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-fleet-attribute-based-instance-type-selection.html\\\">Specify attributes for instance type selection for EC2 Fleet or Spot Fleet</a> and <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-placement-score.html\\\">Spot\\n            placement score</a> in the <i>Amazon EC2 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#InstanceRequirementsWithMetadataRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ArchitectureTypes\": {\n                    \"target\": \"com.amazonaws.ec2#ArchitectureTypeSet\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The architecture type.</p>\",\n                        \"smithy.api#xmlName\": \"ArchitectureType\"\n                    }\n                },\n                \"VirtualizationTypes\": {\n                    \"target\": \"com.amazonaws.ec2#VirtualizationTypeSet\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The virtualization type.</p>\",\n                        \"smithy.api#xmlName\": \"VirtualizationType\"\n                    }\n                },\n                \"InstanceRequirements\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceRequirementsRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The attributes for the instance types. When you specify instance attributes, Amazon EC2 will\\n         identify instance types with those attributes.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The architecture type, virtualization type, and other attributes for the instance types.\\n         When you specify instance attributes, Amazon EC2 will identify instance types with those\\n         attributes.</p>\\n         <p>If you specify <code>InstanceRequirementsWithMetadataRequest</code>, you can't specify\\n         <code>InstanceTypes</code>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#InstanceSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#InstanceTopology\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#InstanceSpecification\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceIdWithVolumeResolver\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The instance to specify which volumes should be snapshotted.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ExcludeBootVolume\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Excludes the root volume from being snapshotted.</p>\"\n                    }\n                },\n                \"ExcludeDataVolumeIds\": {\n                    \"target\": \"com.amazonaws.ec2#VolumeIdStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the data (non-root) volumes to exclude from the multi-volume snapshot set. \\n      If you specify the ID of the root volume, the request fails. To exclude the root volume, \\n      use <b>ExcludeBootVolume</b>.</p>\\n         <p>You can specify up to 40 volume IDs per request.</p>\",\n                        \"smithy.api#xmlName\": \"ExcludeDataVolumeId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The instance details to specify which volumes should be snapshotted.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#InstanceState\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Code\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Code\",\n                        \"smithy.api#documentation\": \"<p>The state of the instance as a 16-bit unsigned integer. </p>\\n         <p>The high byte is all of the bits between 2^8 and (2^16)-1, which equals decimal values\\n            between 256 and 65,535. These numerical values are used for internal purposes and should\\n            be ignored.</p>\\n         <p>The low byte is all of the bits between 2^0 and (2^8)-1, which equals decimal values\\n            between 0 and 255. </p>\\n         <p>The valid values for instance-state-code will all be in the range of the low byte and\\n            they are:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>0</code> : <code>pending</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>16</code> : <code>running</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>32</code> : <code>shutting-down</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>48</code> : <code>terminated</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>64</code> : <code>stopping</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>80</code> : <code>stopped</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>You can ignore the high byte value by zeroing out all of the bits above 2^8 or 256 in\\n            decimal.</p>\",\n                        \"smithy.api#xmlName\": \"code\"\n                    }\n                },\n                \"Name\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceStateName\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Name\",\n                        \"smithy.api#documentation\": \"<p>The current state of the instance.</p>\",\n                        \"smithy.api#xmlName\": \"name\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the current state of an instance.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#InstanceStateChange\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the instance.</p>\",\n                        \"smithy.api#xmlName\": \"instanceId\"\n                    }\n                },\n                \"CurrentState\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CurrentState\",\n                        \"smithy.api#documentation\": \"<p>The current state of the instance.</p>\",\n                        \"smithy.api#xmlName\": \"currentState\"\n                    }\n                },\n                \"PreviousState\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PreviousState\",\n                        \"smithy.api#documentation\": \"<p>The previous state of the instance.</p>\",\n                        \"smithy.api#xmlName\": \"previousState\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes an instance state change.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#InstanceStateChangeList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#InstanceStateChange\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#InstanceStateName\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"pending\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"pending\"\n                    }\n                },\n                \"running\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"running\"\n                    }\n                },\n                \"shutting_down\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"shutting-down\"\n                    }\n                },\n                \"terminated\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"terminated\"\n                    }\n                },\n                \"stopping\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"stopping\"\n                    }\n                },\n                \"stopped\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"stopped\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#InstanceStatus\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AvailabilityZone\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AvailabilityZone\",\n                        \"smithy.api#documentation\": \"<p>The Availability Zone of the instance.</p>\",\n                        \"smithy.api#xmlName\": \"availabilityZone\"\n                    }\n                },\n                \"AvailabilityZoneId\": {\n                    \"target\": \"com.amazonaws.ec2#AvailabilityZoneId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AvailabilityZoneId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Availability Zone of the instance.</p>\",\n                        \"smithy.api#xmlName\": \"availabilityZoneId\"\n                    }\n                },\n                \"OutpostArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OutpostArn\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the Outpost.</p>\",\n                        \"smithy.api#xmlName\": \"outpostArn\"\n                    }\n                },\n                \"Operator\": {\n                    \"target\": \"com.amazonaws.ec2#OperatorResponse\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Operator\",\n                        \"smithy.api#documentation\": \"<p>The service provider that manages the instance.</p>\",\n                        \"smithy.api#xmlName\": \"operator\"\n                    }\n                },\n                \"Events\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceStatusEventList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EventsSet\",\n                        \"smithy.api#documentation\": \"<p>Any scheduled events associated with the instance.</p>\",\n                        \"smithy.api#xmlName\": \"eventsSet\"\n                    }\n                },\n                \"InstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the instance.</p>\",\n                        \"smithy.api#xmlName\": \"instanceId\"\n                    }\n                },\n                \"InstanceState\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceState\",\n                        \"smithy.api#documentation\": \"<p>The intended state of the instance. <a>DescribeInstanceStatus</a> requires\\n            that an instance be in the <code>running</code> state.</p>\",\n                        \"smithy.api#xmlName\": \"instanceState\"\n                    }\n                },\n                \"InstanceStatus\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceStatusSummary\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceStatus\",\n                        \"smithy.api#documentation\": \"<p>Reports impaired functionality that stems from issues internal to the instance, such\\n            as impaired reachability.</p>\",\n                        \"smithy.api#xmlName\": \"instanceStatus\"\n                    }\n                },\n                \"SystemStatus\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceStatusSummary\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SystemStatus\",\n                        \"smithy.api#documentation\": \"<p>Reports impaired functionality that stems from issues related to the systems that\\n            support an instance, such as hardware failures and network connectivity problems.</p>\",\n                        \"smithy.api#xmlName\": \"systemStatus\"\n                    }\n                },\n                \"AttachedEbsStatus\": {\n                    \"target\": \"com.amazonaws.ec2#EbsStatusSummary\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AttachedEbsStatus\",\n                        \"smithy.api#documentation\": \"<p>Reports impaired functionality that stems from an attached Amazon EBS volume that is \\n            unreachable and unable to complete I/O operations.</p>\",\n                        \"smithy.api#xmlName\": \"attachedEbsStatus\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the status of an instance.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#InstanceStatusDetails\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ImpairedSince\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ImpairedSince\",\n                        \"smithy.api#documentation\": \"<p>The time when a status check failed. For an instance that was launched and impaired,\\n            this is the time when the instance was launched.</p>\",\n                        \"smithy.api#xmlName\": \"impairedSince\"\n                    }\n                },\n                \"Name\": {\n                    \"target\": \"com.amazonaws.ec2#StatusName\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Name\",\n                        \"smithy.api#documentation\": \"<p>The type of instance status.</p>\",\n                        \"smithy.api#xmlName\": \"name\"\n                    }\n                },\n                \"Status\": {\n                    \"target\": \"com.amazonaws.ec2#StatusType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Status\",\n                        \"smithy.api#documentation\": \"<p>The status.</p>\",\n                        \"smithy.api#xmlName\": \"status\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the instance status.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#InstanceStatusDetailsList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#InstanceStatusDetails\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#InstanceStatusEvent\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceEventId\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceEventId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceEventId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the event.</p>\",\n                        \"smithy.api#xmlName\": \"instanceEventId\"\n                    }\n                },\n                \"Code\": {\n                    \"target\": \"com.amazonaws.ec2#EventCode\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Code\",\n                        \"smithy.api#documentation\": \"<p>The event code.</p>\",\n                        \"smithy.api#xmlName\": \"code\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Description\",\n                        \"smithy.api#documentation\": \"<p>A description of the event.</p>\\n         <p>After a scheduled event is completed, it can still be described for up to a week. If\\n            the event has been completed, this description starts with the following text:\\n            [Completed].</p>\",\n                        \"smithy.api#xmlName\": \"description\"\n                    }\n                },\n                \"NotAfter\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NotAfter\",\n                        \"smithy.api#documentation\": \"<p>The latest scheduled end time for the event.</p>\",\n                        \"smithy.api#xmlName\": \"notAfter\"\n                    }\n                },\n                \"NotBefore\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NotBefore\",\n                        \"smithy.api#documentation\": \"<p>The earliest scheduled start time for the event.</p>\",\n                        \"smithy.api#xmlName\": \"notBefore\"\n                    }\n                },\n                \"NotBeforeDeadline\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NotBeforeDeadline\",\n                        \"smithy.api#documentation\": \"<p>The deadline for starting the event.</p>\",\n                        \"smithy.api#xmlName\": \"notBeforeDeadline\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a scheduled event for an instance.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#InstanceStatusEventList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#InstanceStatusEvent\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#InstanceStatusList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#InstanceStatus\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#InstanceStatusSummary\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Details\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceStatusDetailsList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Details\",\n                        \"smithy.api#documentation\": \"<p>The system instance health or application instance health.</p>\",\n                        \"smithy.api#xmlName\": \"details\"\n                    }\n                },\n                \"Status\": {\n                    \"target\": \"com.amazonaws.ec2#SummaryStatus\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Status\",\n                        \"smithy.api#documentation\": \"<p>The status.</p>\",\n                        \"smithy.api#xmlName\": \"status\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the status of an instance.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#InstanceStorageEncryptionSupport\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"unsupported\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"unsupported\"\n                    }\n                },\n                \"required\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"required\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#InstanceStorageFlag\": {\n            \"type\": \"boolean\"\n        },\n        \"com.amazonaws.ec2#InstanceStorageInfo\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TotalSizeInGB\": {\n                    \"target\": \"com.amazonaws.ec2#DiskSize\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TotalSizeInGB\",\n                        \"smithy.api#documentation\": \"<p>The total size of the disks, in GB.</p>\",\n                        \"smithy.api#xmlName\": \"totalSizeInGB\"\n                    }\n                },\n                \"Disks\": {\n                    \"target\": \"com.amazonaws.ec2#DiskInfoList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Disks\",\n                        \"smithy.api#documentation\": \"<p>Describes the disks that are available for the instance type.</p>\",\n                        \"smithy.api#xmlName\": \"disks\"\n                    }\n                },\n                \"NvmeSupport\": {\n                    \"target\": \"com.amazonaws.ec2#EphemeralNvmeSupport\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NvmeSupport\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether non-volatile memory express (NVMe) is supported.</p>\",\n                        \"smithy.api#xmlName\": \"nvmeSupport\"\n                    }\n                },\n                \"EncryptionSupport\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceStorageEncryptionSupport\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EncryptionSupport\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether data is encrypted at rest.</p>\",\n                        \"smithy.api#xmlName\": \"encryptionSupport\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the instance store features that are supported by the instance type.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#InstanceTagKeySet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#String\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#InstanceTagNotificationAttribute\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceTagKeys\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceTagKeySet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceTagKeySet\",\n                        \"smithy.api#documentation\": \"<p>The registered tag keys.</p>\",\n                        \"smithy.api#xmlName\": \"instanceTagKeySet\"\n                    }\n                },\n                \"IncludeAllTagsOfInstance\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IncludeAllTagsOfInstance\",\n                        \"smithy.api#documentation\": \"<p>Indicates wheter all tag keys in the current Region are registered to appear in\\n         scheduled event notifications. <code>true</code> indicates that all tag keys in the current\\n         Region are registered.</p>\",\n                        \"smithy.api#xmlName\": \"includeAllTagsOfInstance\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the registered tag keys for the current Region.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#InstanceTopology\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceId\",\n                        \"smithy.api#documentation\": \"<p>The instance ID.</p>\",\n                        \"smithy.api#xmlName\": \"instanceId\"\n                    }\n                },\n                \"InstanceType\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceType\",\n                        \"smithy.api#documentation\": \"<p>The instance type.</p>\",\n                        \"smithy.api#xmlName\": \"instanceType\"\n                    }\n                },\n                \"GroupName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"GroupName\",\n                        \"smithy.api#documentation\": \"<p>The name of the placement group that the instance is in.</p>\",\n                        \"smithy.api#xmlName\": \"groupName\"\n                    }\n                },\n                \"NetworkNodes\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkNodesList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkNodeSet\",\n                        \"smithy.api#documentation\": \"<p>The network nodes. The nodes are hashed based on your account. Instances from\\n            different accounts running under the same server will return a different hashed list of\\n            strings.</p>\",\n                        \"smithy.api#xmlName\": \"networkNodeSet\"\n                    }\n                },\n                \"AvailabilityZone\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AvailabilityZone\",\n                        \"smithy.api#documentation\": \"<p>The name of the Availability Zone or Local Zone that the instance is in.</p>\",\n                        \"smithy.api#xmlName\": \"availabilityZone\"\n                    }\n                },\n                \"ZoneId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ZoneId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Availability Zone or Local Zone that the instance is in.</p>\",\n                        \"smithy.api#xmlName\": \"zoneId\"\n                    }\n                },\n                \"CapacityBlockId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CapacityBlockId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Capacity Block. This parameter is only supported for Ultraserver\\n            instances and identifies instances within the Ultraserver domain.</p>\",\n                        \"smithy.api#xmlName\": \"capacityBlockId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about the instance topology.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#InstanceType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"a1_medium\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"a1.medium\"\n                    }\n                },\n                \"a1_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"a1.large\"\n                    }\n                },\n                \"a1_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"a1.xlarge\"\n                    }\n                },\n                \"a1_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"a1.2xlarge\"\n                    }\n                },\n                \"a1_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"a1.4xlarge\"\n                    }\n                },\n                \"a1_metal\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"a1.metal\"\n                    }\n                },\n                \"c1_medium\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c1.medium\"\n                    }\n                },\n                \"c1_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c1.xlarge\"\n                    }\n                },\n                \"c3_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c3.large\"\n                    }\n                },\n                \"c3_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c3.xlarge\"\n                    }\n                },\n                \"c3_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c3.2xlarge\"\n                    }\n                },\n                \"c3_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c3.4xlarge\"\n                    }\n                },\n                \"c3_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c3.8xlarge\"\n                    }\n                },\n                \"c4_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c4.large\"\n                    }\n                },\n                \"c4_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c4.xlarge\"\n                    }\n                },\n                \"c4_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c4.2xlarge\"\n                    }\n                },\n                \"c4_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c4.4xlarge\"\n                    }\n                },\n                \"c4_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c4.8xlarge\"\n                    }\n                },\n                \"c5_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c5.large\"\n                    }\n                },\n                \"c5_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c5.xlarge\"\n                    }\n                },\n                \"c5_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c5.2xlarge\"\n                    }\n                },\n                \"c5_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c5.4xlarge\"\n                    }\n                },\n                \"c5_9xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c5.9xlarge\"\n                    }\n                },\n                \"c5_12xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c5.12xlarge\"\n                    }\n                },\n                \"c5_18xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c5.18xlarge\"\n                    }\n                },\n                \"c5_24xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c5.24xlarge\"\n                    }\n                },\n                \"c5_metal\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c5.metal\"\n                    }\n                },\n                \"c5a_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c5a.large\"\n                    }\n                },\n                \"c5a_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c5a.xlarge\"\n                    }\n                },\n                \"c5a_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c5a.2xlarge\"\n                    }\n                },\n                \"c5a_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c5a.4xlarge\"\n                    }\n                },\n                \"c5a_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c5a.8xlarge\"\n                    }\n                },\n                \"c5a_12xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c5a.12xlarge\"\n                    }\n                },\n                \"c5a_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c5a.16xlarge\"\n                    }\n                },\n                \"c5a_24xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c5a.24xlarge\"\n                    }\n                },\n                \"c5ad_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c5ad.large\"\n                    }\n                },\n                \"c5ad_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c5ad.xlarge\"\n                    }\n                },\n                \"c5ad_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c5ad.2xlarge\"\n                    }\n                },\n                \"c5ad_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c5ad.4xlarge\"\n                    }\n                },\n                \"c5ad_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c5ad.8xlarge\"\n                    }\n                },\n                \"c5ad_12xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c5ad.12xlarge\"\n                    }\n                },\n                \"c5ad_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c5ad.16xlarge\"\n                    }\n                },\n                \"c5ad_24xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c5ad.24xlarge\"\n                    }\n                },\n                \"c5d_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c5d.large\"\n                    }\n                },\n                \"c5d_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c5d.xlarge\"\n                    }\n                },\n                \"c5d_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c5d.2xlarge\"\n                    }\n                },\n                \"c5d_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c5d.4xlarge\"\n                    }\n                },\n                \"c5d_9xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c5d.9xlarge\"\n                    }\n                },\n                \"c5d_12xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c5d.12xlarge\"\n                    }\n                },\n                \"c5d_18xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c5d.18xlarge\"\n                    }\n                },\n                \"c5d_24xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c5d.24xlarge\"\n                    }\n                },\n                \"c5d_metal\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c5d.metal\"\n                    }\n                },\n                \"c5n_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c5n.large\"\n                    }\n                },\n                \"c5n_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c5n.xlarge\"\n                    }\n                },\n                \"c5n_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c5n.2xlarge\"\n                    }\n                },\n                \"c5n_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c5n.4xlarge\"\n                    }\n                },\n                \"c5n_9xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c5n.9xlarge\"\n                    }\n                },\n                \"c5n_18xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c5n.18xlarge\"\n                    }\n                },\n                \"c5n_metal\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c5n.metal\"\n                    }\n                },\n                \"c6g_medium\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c6g.medium\"\n                    }\n                },\n                \"c6g_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c6g.large\"\n                    }\n                },\n                \"c6g_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c6g.xlarge\"\n                    }\n                },\n                \"c6g_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c6g.2xlarge\"\n                    }\n                },\n                \"c6g_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c6g.4xlarge\"\n                    }\n                },\n                \"c6g_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c6g.8xlarge\"\n                    }\n                },\n                \"c6g_12xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c6g.12xlarge\"\n                    }\n                },\n                \"c6g_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c6g.16xlarge\"\n                    }\n                },\n                \"c6g_metal\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c6g.metal\"\n                    }\n                },\n                \"c6gd_medium\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c6gd.medium\"\n                    }\n                },\n                \"c6gd_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c6gd.large\"\n                    }\n                },\n                \"c6gd_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c6gd.xlarge\"\n                    }\n                },\n                \"c6gd_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c6gd.2xlarge\"\n                    }\n                },\n                \"c6gd_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c6gd.4xlarge\"\n                    }\n                },\n                \"c6gd_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c6gd.8xlarge\"\n                    }\n                },\n                \"c6gd_12xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c6gd.12xlarge\"\n                    }\n                },\n                \"c6gd_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c6gd.16xlarge\"\n                    }\n                },\n                \"c6gd_metal\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c6gd.metal\"\n                    }\n                },\n                \"c6gn_medium\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c6gn.medium\"\n                    }\n                },\n                \"c6gn_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c6gn.large\"\n                    }\n                },\n                \"c6gn_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c6gn.xlarge\"\n                    }\n                },\n                \"c6gn_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c6gn.2xlarge\"\n                    }\n                },\n                \"c6gn_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c6gn.4xlarge\"\n                    }\n                },\n                \"c6gn_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c6gn.8xlarge\"\n                    }\n                },\n                \"c6gn_12xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c6gn.12xlarge\"\n                    }\n                },\n                \"c6gn_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c6gn.16xlarge\"\n                    }\n                },\n                \"c6i_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c6i.large\"\n                    }\n                },\n                \"c6i_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c6i.xlarge\"\n                    }\n                },\n                \"c6i_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c6i.2xlarge\"\n                    }\n                },\n                \"c6i_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c6i.4xlarge\"\n                    }\n                },\n                \"c6i_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c6i.8xlarge\"\n                    }\n                },\n                \"c6i_12xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c6i.12xlarge\"\n                    }\n                },\n                \"c6i_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c6i.16xlarge\"\n                    }\n                },\n                \"c6i_24xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c6i.24xlarge\"\n                    }\n                },\n                \"c6i_32xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c6i.32xlarge\"\n                    }\n                },\n                \"c6i_metal\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c6i.metal\"\n                    }\n                },\n                \"cc1_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"cc1.4xlarge\"\n                    }\n                },\n                \"cc2_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"cc2.8xlarge\"\n                    }\n                },\n                \"cg1_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"cg1.4xlarge\"\n                    }\n                },\n                \"cr1_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"cr1.8xlarge\"\n                    }\n                },\n                \"d2_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"d2.xlarge\"\n                    }\n                },\n                \"d2_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"d2.2xlarge\"\n                    }\n                },\n                \"d2_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"d2.4xlarge\"\n                    }\n                },\n                \"d2_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"d2.8xlarge\"\n                    }\n                },\n                \"d3_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"d3.xlarge\"\n                    }\n                },\n                \"d3_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"d3.2xlarge\"\n                    }\n                },\n                \"d3_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"d3.4xlarge\"\n                    }\n                },\n                \"d3_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"d3.8xlarge\"\n                    }\n                },\n                \"d3en_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"d3en.xlarge\"\n                    }\n                },\n                \"d3en_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"d3en.2xlarge\"\n                    }\n                },\n                \"d3en_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"d3en.4xlarge\"\n                    }\n                },\n                \"d3en_6xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"d3en.6xlarge\"\n                    }\n                },\n                \"d3en_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"d3en.8xlarge\"\n                    }\n                },\n                \"d3en_12xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"d3en.12xlarge\"\n                    }\n                },\n                \"dl1_24xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"dl1.24xlarge\"\n                    }\n                },\n                \"f1_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"f1.2xlarge\"\n                    }\n                },\n                \"f1_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"f1.4xlarge\"\n                    }\n                },\n                \"f1_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"f1.16xlarge\"\n                    }\n                },\n                \"g2_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"g2.2xlarge\"\n                    }\n                },\n                \"g2_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"g2.8xlarge\"\n                    }\n                },\n                \"g3_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"g3.4xlarge\"\n                    }\n                },\n                \"g3_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"g3.8xlarge\"\n                    }\n                },\n                \"g3_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"g3.16xlarge\"\n                    }\n                },\n                \"g3s_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"g3s.xlarge\"\n                    }\n                },\n                \"g4ad_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"g4ad.xlarge\"\n                    }\n                },\n                \"g4ad_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"g4ad.2xlarge\"\n                    }\n                },\n                \"g4ad_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"g4ad.4xlarge\"\n                    }\n                },\n                \"g4ad_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"g4ad.8xlarge\"\n                    }\n                },\n                \"g4ad_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"g4ad.16xlarge\"\n                    }\n                },\n                \"g4dn_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"g4dn.xlarge\"\n                    }\n                },\n                \"g4dn_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"g4dn.2xlarge\"\n                    }\n                },\n                \"g4dn_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"g4dn.4xlarge\"\n                    }\n                },\n                \"g4dn_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"g4dn.8xlarge\"\n                    }\n                },\n                \"g4dn_12xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"g4dn.12xlarge\"\n                    }\n                },\n                \"g4dn_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"g4dn.16xlarge\"\n                    }\n                },\n                \"g4dn_metal\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"g4dn.metal\"\n                    }\n                },\n                \"g5_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"g5.xlarge\"\n                    }\n                },\n                \"g5_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"g5.2xlarge\"\n                    }\n                },\n                \"g5_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"g5.4xlarge\"\n                    }\n                },\n                \"g5_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"g5.8xlarge\"\n                    }\n                },\n                \"g5_12xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"g5.12xlarge\"\n                    }\n                },\n                \"g5_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"g5.16xlarge\"\n                    }\n                },\n                \"g5_24xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"g5.24xlarge\"\n                    }\n                },\n                \"g5_48xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"g5.48xlarge\"\n                    }\n                },\n                \"g5g_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"g5g.xlarge\"\n                    }\n                },\n                \"g5g_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"g5g.2xlarge\"\n                    }\n                },\n                \"g5g_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"g5g.4xlarge\"\n                    }\n                },\n                \"g5g_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"g5g.8xlarge\"\n                    }\n                },\n                \"g5g_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"g5g.16xlarge\"\n                    }\n                },\n                \"g5g_metal\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"g5g.metal\"\n                    }\n                },\n                \"hi1_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"hi1.4xlarge\"\n                    }\n                },\n                \"hpc6a_48xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"hpc6a.48xlarge\"\n                    }\n                },\n                \"hs1_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"hs1.8xlarge\"\n                    }\n                },\n                \"h1_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"h1.2xlarge\"\n                    }\n                },\n                \"h1_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"h1.4xlarge\"\n                    }\n                },\n                \"h1_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"h1.8xlarge\"\n                    }\n                },\n                \"h1_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"h1.16xlarge\"\n                    }\n                },\n                \"i2_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"i2.xlarge\"\n                    }\n                },\n                \"i2_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"i2.2xlarge\"\n                    }\n                },\n                \"i2_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"i2.4xlarge\"\n                    }\n                },\n                \"i2_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"i2.8xlarge\"\n                    }\n                },\n                \"i3_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"i3.large\"\n                    }\n                },\n                \"i3_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"i3.xlarge\"\n                    }\n                },\n                \"i3_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"i3.2xlarge\"\n                    }\n                },\n                \"i3_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"i3.4xlarge\"\n                    }\n                },\n                \"i3_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"i3.8xlarge\"\n                    }\n                },\n                \"i3_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"i3.16xlarge\"\n                    }\n                },\n                \"i3_metal\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"i3.metal\"\n                    }\n                },\n                \"i3en_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"i3en.large\"\n                    }\n                },\n                \"i3en_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"i3en.xlarge\"\n                    }\n                },\n                \"i3en_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"i3en.2xlarge\"\n                    }\n                },\n                \"i3en_3xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"i3en.3xlarge\"\n                    }\n                },\n                \"i3en_6xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"i3en.6xlarge\"\n                    }\n                },\n                \"i3en_12xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"i3en.12xlarge\"\n                    }\n                },\n                \"i3en_24xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"i3en.24xlarge\"\n                    }\n                },\n                \"i3en_metal\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"i3en.metal\"\n                    }\n                },\n                \"im4gn_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"im4gn.large\"\n                    }\n                },\n                \"im4gn_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"im4gn.xlarge\"\n                    }\n                },\n                \"im4gn_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"im4gn.2xlarge\"\n                    }\n                },\n                \"im4gn_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"im4gn.4xlarge\"\n                    }\n                },\n                \"im4gn_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"im4gn.8xlarge\"\n                    }\n                },\n                \"im4gn_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"im4gn.16xlarge\"\n                    }\n                },\n                \"inf1_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"inf1.xlarge\"\n                    }\n                },\n                \"inf1_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"inf1.2xlarge\"\n                    }\n                },\n                \"inf1_6xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"inf1.6xlarge\"\n                    }\n                },\n                \"inf1_24xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"inf1.24xlarge\"\n                    }\n                },\n                \"is4gen_medium\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"is4gen.medium\"\n                    }\n                },\n                \"is4gen_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"is4gen.large\"\n                    }\n                },\n                \"is4gen_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"is4gen.xlarge\"\n                    }\n                },\n                \"is4gen_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"is4gen.2xlarge\"\n                    }\n                },\n                \"is4gen_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"is4gen.4xlarge\"\n                    }\n                },\n                \"is4gen_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"is4gen.8xlarge\"\n                    }\n                },\n                \"m1_small\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m1.small\"\n                    }\n                },\n                \"m1_medium\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m1.medium\"\n                    }\n                },\n                \"m1_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m1.large\"\n                    }\n                },\n                \"m1_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m1.xlarge\"\n                    }\n                },\n                \"m2_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m2.xlarge\"\n                    }\n                },\n                \"m2_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m2.2xlarge\"\n                    }\n                },\n                \"m2_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m2.4xlarge\"\n                    }\n                },\n                \"m3_medium\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m3.medium\"\n                    }\n                },\n                \"m3_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m3.large\"\n                    }\n                },\n                \"m3_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m3.xlarge\"\n                    }\n                },\n                \"m3_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m3.2xlarge\"\n                    }\n                },\n                \"m4_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m4.large\"\n                    }\n                },\n                \"m4_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m4.xlarge\"\n                    }\n                },\n                \"m4_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m4.2xlarge\"\n                    }\n                },\n                \"m4_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m4.4xlarge\"\n                    }\n                },\n                \"m4_10xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m4.10xlarge\"\n                    }\n                },\n                \"m4_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m4.16xlarge\"\n                    }\n                },\n                \"m5_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m5.large\"\n                    }\n                },\n                \"m5_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m5.xlarge\"\n                    }\n                },\n                \"m5_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m5.2xlarge\"\n                    }\n                },\n                \"m5_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m5.4xlarge\"\n                    }\n                },\n                \"m5_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m5.8xlarge\"\n                    }\n                },\n                \"m5_12xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m5.12xlarge\"\n                    }\n                },\n                \"m5_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m5.16xlarge\"\n                    }\n                },\n                \"m5_24xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m5.24xlarge\"\n                    }\n                },\n                \"m5_metal\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m5.metal\"\n                    }\n                },\n                \"m5a_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m5a.large\"\n                    }\n                },\n                \"m5a_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m5a.xlarge\"\n                    }\n                },\n                \"m5a_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m5a.2xlarge\"\n                    }\n                },\n                \"m5a_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m5a.4xlarge\"\n                    }\n                },\n                \"m5a_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m5a.8xlarge\"\n                    }\n                },\n                \"m5a_12xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m5a.12xlarge\"\n                    }\n                },\n                \"m5a_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m5a.16xlarge\"\n                    }\n                },\n                \"m5a_24xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m5a.24xlarge\"\n                    }\n                },\n                \"m5ad_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m5ad.large\"\n                    }\n                },\n                \"m5ad_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m5ad.xlarge\"\n                    }\n                },\n                \"m5ad_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m5ad.2xlarge\"\n                    }\n                },\n                \"m5ad_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m5ad.4xlarge\"\n                    }\n                },\n                \"m5ad_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m5ad.8xlarge\"\n                    }\n                },\n                \"m5ad_12xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m5ad.12xlarge\"\n                    }\n                },\n                \"m5ad_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m5ad.16xlarge\"\n                    }\n                },\n                \"m5ad_24xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m5ad.24xlarge\"\n                    }\n                },\n                \"m5d_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m5d.large\"\n                    }\n                },\n                \"m5d_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m5d.xlarge\"\n                    }\n                },\n                \"m5d_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m5d.2xlarge\"\n                    }\n                },\n                \"m5d_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m5d.4xlarge\"\n                    }\n                },\n                \"m5d_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m5d.8xlarge\"\n                    }\n                },\n                \"m5d_12xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m5d.12xlarge\"\n                    }\n                },\n                \"m5d_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m5d.16xlarge\"\n                    }\n                },\n                \"m5d_24xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m5d.24xlarge\"\n                    }\n                },\n                \"m5d_metal\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m5d.metal\"\n                    }\n                },\n                \"m5dn_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m5dn.large\"\n                    }\n                },\n                \"m5dn_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m5dn.xlarge\"\n                    }\n                },\n                \"m5dn_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m5dn.2xlarge\"\n                    }\n                },\n                \"m5dn_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m5dn.4xlarge\"\n                    }\n                },\n                \"m5dn_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m5dn.8xlarge\"\n                    }\n                },\n                \"m5dn_12xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m5dn.12xlarge\"\n                    }\n                },\n                \"m5dn_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m5dn.16xlarge\"\n                    }\n                },\n                \"m5dn_24xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m5dn.24xlarge\"\n                    }\n                },\n                \"m5dn_metal\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m5dn.metal\"\n                    }\n                },\n                \"m5n_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m5n.large\"\n                    }\n                },\n                \"m5n_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m5n.xlarge\"\n                    }\n                },\n                \"m5n_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m5n.2xlarge\"\n                    }\n                },\n                \"m5n_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m5n.4xlarge\"\n                    }\n                },\n                \"m5n_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m5n.8xlarge\"\n                    }\n                },\n                \"m5n_12xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m5n.12xlarge\"\n                    }\n                },\n                \"m5n_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m5n.16xlarge\"\n                    }\n                },\n                \"m5n_24xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m5n.24xlarge\"\n                    }\n                },\n                \"m5n_metal\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m5n.metal\"\n                    }\n                },\n                \"m5zn_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m5zn.large\"\n                    }\n                },\n                \"m5zn_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m5zn.xlarge\"\n                    }\n                },\n                \"m5zn_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m5zn.2xlarge\"\n                    }\n                },\n                \"m5zn_3xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m5zn.3xlarge\"\n                    }\n                },\n                \"m5zn_6xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m5zn.6xlarge\"\n                    }\n                },\n                \"m5zn_12xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m5zn.12xlarge\"\n                    }\n                },\n                \"m5zn_metal\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m5zn.metal\"\n                    }\n                },\n                \"m6a_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m6a.large\"\n                    }\n                },\n                \"m6a_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m6a.xlarge\"\n                    }\n                },\n                \"m6a_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m6a.2xlarge\"\n                    }\n                },\n                \"m6a_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m6a.4xlarge\"\n                    }\n                },\n                \"m6a_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m6a.8xlarge\"\n                    }\n                },\n                \"m6a_12xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m6a.12xlarge\"\n                    }\n                },\n                \"m6a_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m6a.16xlarge\"\n                    }\n                },\n                \"m6a_24xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m6a.24xlarge\"\n                    }\n                },\n                \"m6a_32xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m6a.32xlarge\"\n                    }\n                },\n                \"m6a_48xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m6a.48xlarge\"\n                    }\n                },\n                \"m6g_metal\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m6g.metal\"\n                    }\n                },\n                \"m6g_medium\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m6g.medium\"\n                    }\n                },\n                \"m6g_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m6g.large\"\n                    }\n                },\n                \"m6g_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m6g.xlarge\"\n                    }\n                },\n                \"m6g_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m6g.2xlarge\"\n                    }\n                },\n                \"m6g_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m6g.4xlarge\"\n                    }\n                },\n                \"m6g_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m6g.8xlarge\"\n                    }\n                },\n                \"m6g_12xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m6g.12xlarge\"\n                    }\n                },\n                \"m6g_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m6g.16xlarge\"\n                    }\n                },\n                \"m6gd_metal\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m6gd.metal\"\n                    }\n                },\n                \"m6gd_medium\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m6gd.medium\"\n                    }\n                },\n                \"m6gd_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m6gd.large\"\n                    }\n                },\n                \"m6gd_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m6gd.xlarge\"\n                    }\n                },\n                \"m6gd_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m6gd.2xlarge\"\n                    }\n                },\n                \"m6gd_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m6gd.4xlarge\"\n                    }\n                },\n                \"m6gd_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m6gd.8xlarge\"\n                    }\n                },\n                \"m6gd_12xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m6gd.12xlarge\"\n                    }\n                },\n                \"m6gd_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m6gd.16xlarge\"\n                    }\n                },\n                \"m6i_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m6i.large\"\n                    }\n                },\n                \"m6i_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m6i.xlarge\"\n                    }\n                },\n                \"m6i_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m6i.2xlarge\"\n                    }\n                },\n                \"m6i_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m6i.4xlarge\"\n                    }\n                },\n                \"m6i_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m6i.8xlarge\"\n                    }\n                },\n                \"m6i_12xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m6i.12xlarge\"\n                    }\n                },\n                \"m6i_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m6i.16xlarge\"\n                    }\n                },\n                \"m6i_24xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m6i.24xlarge\"\n                    }\n                },\n                \"m6i_32xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m6i.32xlarge\"\n                    }\n                },\n                \"m6i_metal\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m6i.metal\"\n                    }\n                },\n                \"mac1_metal\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"mac1.metal\"\n                    }\n                },\n                \"p2_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"p2.xlarge\"\n                    }\n                },\n                \"p2_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"p2.8xlarge\"\n                    }\n                },\n                \"p2_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"p2.16xlarge\"\n                    }\n                },\n                \"p3_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"p3.2xlarge\"\n                    }\n                },\n                \"p3_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"p3.8xlarge\"\n                    }\n                },\n                \"p3_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"p3.16xlarge\"\n                    }\n                },\n                \"p3dn_24xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"p3dn.24xlarge\"\n                    }\n                },\n                \"p4d_24xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"p4d.24xlarge\"\n                    }\n                },\n                \"r3_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r3.large\"\n                    }\n                },\n                \"r3_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r3.xlarge\"\n                    }\n                },\n                \"r3_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r3.2xlarge\"\n                    }\n                },\n                \"r3_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r3.4xlarge\"\n                    }\n                },\n                \"r3_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r3.8xlarge\"\n                    }\n                },\n                \"r4_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r4.large\"\n                    }\n                },\n                \"r4_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r4.xlarge\"\n                    }\n                },\n                \"r4_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r4.2xlarge\"\n                    }\n                },\n                \"r4_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r4.4xlarge\"\n                    }\n                },\n                \"r4_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r4.8xlarge\"\n                    }\n                },\n                \"r4_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r4.16xlarge\"\n                    }\n                },\n                \"r5_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r5.large\"\n                    }\n                },\n                \"r5_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r5.xlarge\"\n                    }\n                },\n                \"r5_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r5.2xlarge\"\n                    }\n                },\n                \"r5_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r5.4xlarge\"\n                    }\n                },\n                \"r5_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r5.8xlarge\"\n                    }\n                },\n                \"r5_12xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r5.12xlarge\"\n                    }\n                },\n                \"r5_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r5.16xlarge\"\n                    }\n                },\n                \"r5_24xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r5.24xlarge\"\n                    }\n                },\n                \"r5_metal\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r5.metal\"\n                    }\n                },\n                \"r5a_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r5a.large\"\n                    }\n                },\n                \"r5a_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r5a.xlarge\"\n                    }\n                },\n                \"r5a_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r5a.2xlarge\"\n                    }\n                },\n                \"r5a_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r5a.4xlarge\"\n                    }\n                },\n                \"r5a_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r5a.8xlarge\"\n                    }\n                },\n                \"r5a_12xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r5a.12xlarge\"\n                    }\n                },\n                \"r5a_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r5a.16xlarge\"\n                    }\n                },\n                \"r5a_24xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r5a.24xlarge\"\n                    }\n                },\n                \"r5ad_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r5ad.large\"\n                    }\n                },\n                \"r5ad_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r5ad.xlarge\"\n                    }\n                },\n                \"r5ad_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r5ad.2xlarge\"\n                    }\n                },\n                \"r5ad_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r5ad.4xlarge\"\n                    }\n                },\n                \"r5ad_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r5ad.8xlarge\"\n                    }\n                },\n                \"r5ad_12xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r5ad.12xlarge\"\n                    }\n                },\n                \"r5ad_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r5ad.16xlarge\"\n                    }\n                },\n                \"r5ad_24xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r5ad.24xlarge\"\n                    }\n                },\n                \"r5b_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r5b.large\"\n                    }\n                },\n                \"r5b_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r5b.xlarge\"\n                    }\n                },\n                \"r5b_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r5b.2xlarge\"\n                    }\n                },\n                \"r5b_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r5b.4xlarge\"\n                    }\n                },\n                \"r5b_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r5b.8xlarge\"\n                    }\n                },\n                \"r5b_12xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r5b.12xlarge\"\n                    }\n                },\n                \"r5b_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r5b.16xlarge\"\n                    }\n                },\n                \"r5b_24xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r5b.24xlarge\"\n                    }\n                },\n                \"r5b_metal\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r5b.metal\"\n                    }\n                },\n                \"r5d_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r5d.large\"\n                    }\n                },\n                \"r5d_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r5d.xlarge\"\n                    }\n                },\n                \"r5d_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r5d.2xlarge\"\n                    }\n                },\n                \"r5d_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r5d.4xlarge\"\n                    }\n                },\n                \"r5d_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r5d.8xlarge\"\n                    }\n                },\n                \"r5d_12xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r5d.12xlarge\"\n                    }\n                },\n                \"r5d_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r5d.16xlarge\"\n                    }\n                },\n                \"r5d_24xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r5d.24xlarge\"\n                    }\n                },\n                \"r5d_metal\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r5d.metal\"\n                    }\n                },\n                \"r5dn_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r5dn.large\"\n                    }\n                },\n                \"r5dn_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r5dn.xlarge\"\n                    }\n                },\n                \"r5dn_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r5dn.2xlarge\"\n                    }\n                },\n                \"r5dn_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r5dn.4xlarge\"\n                    }\n                },\n                \"r5dn_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r5dn.8xlarge\"\n                    }\n                },\n                \"r5dn_12xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r5dn.12xlarge\"\n                    }\n                },\n                \"r5dn_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r5dn.16xlarge\"\n                    }\n                },\n                \"r5dn_24xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r5dn.24xlarge\"\n                    }\n                },\n                \"r5dn_metal\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r5dn.metal\"\n                    }\n                },\n                \"r5n_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r5n.large\"\n                    }\n                },\n                \"r5n_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r5n.xlarge\"\n                    }\n                },\n                \"r5n_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r5n.2xlarge\"\n                    }\n                },\n                \"r5n_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r5n.4xlarge\"\n                    }\n                },\n                \"r5n_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r5n.8xlarge\"\n                    }\n                },\n                \"r5n_12xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r5n.12xlarge\"\n                    }\n                },\n                \"r5n_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r5n.16xlarge\"\n                    }\n                },\n                \"r5n_24xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r5n.24xlarge\"\n                    }\n                },\n                \"r5n_metal\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r5n.metal\"\n                    }\n                },\n                \"r6g_medium\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r6g.medium\"\n                    }\n                },\n                \"r6g_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r6g.large\"\n                    }\n                },\n                \"r6g_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r6g.xlarge\"\n                    }\n                },\n                \"r6g_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r6g.2xlarge\"\n                    }\n                },\n                \"r6g_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r6g.4xlarge\"\n                    }\n                },\n                \"r6g_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r6g.8xlarge\"\n                    }\n                },\n                \"r6g_12xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r6g.12xlarge\"\n                    }\n                },\n                \"r6g_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r6g.16xlarge\"\n                    }\n                },\n                \"r6g_metal\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r6g.metal\"\n                    }\n                },\n                \"r6gd_medium\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r6gd.medium\"\n                    }\n                },\n                \"r6gd_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r6gd.large\"\n                    }\n                },\n                \"r6gd_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r6gd.xlarge\"\n                    }\n                },\n                \"r6gd_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r6gd.2xlarge\"\n                    }\n                },\n                \"r6gd_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r6gd.4xlarge\"\n                    }\n                },\n                \"r6gd_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r6gd.8xlarge\"\n                    }\n                },\n                \"r6gd_12xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r6gd.12xlarge\"\n                    }\n                },\n                \"r6gd_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r6gd.16xlarge\"\n                    }\n                },\n                \"r6gd_metal\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r6gd.metal\"\n                    }\n                },\n                \"r6i_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r6i.large\"\n                    }\n                },\n                \"r6i_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r6i.xlarge\"\n                    }\n                },\n                \"r6i_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r6i.2xlarge\"\n                    }\n                },\n                \"r6i_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r6i.4xlarge\"\n                    }\n                },\n                \"r6i_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r6i.8xlarge\"\n                    }\n                },\n                \"r6i_12xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r6i.12xlarge\"\n                    }\n                },\n                \"r6i_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r6i.16xlarge\"\n                    }\n                },\n                \"r6i_24xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r6i.24xlarge\"\n                    }\n                },\n                \"r6i_32xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r6i.32xlarge\"\n                    }\n                },\n                \"r6i_metal\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r6i.metal\"\n                    }\n                },\n                \"t1_micro\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"t1.micro\"\n                    }\n                },\n                \"t2_nano\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"t2.nano\"\n                    }\n                },\n                \"t2_micro\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"t2.micro\"\n                    }\n                },\n                \"t2_small\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"t2.small\"\n                    }\n                },\n                \"t2_medium\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"t2.medium\"\n                    }\n                },\n                \"t2_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"t2.large\"\n                    }\n                },\n                \"t2_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"t2.xlarge\"\n                    }\n                },\n                \"t2_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"t2.2xlarge\"\n                    }\n                },\n                \"t3_nano\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"t3.nano\"\n                    }\n                },\n                \"t3_micro\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"t3.micro\"\n                    }\n                },\n                \"t3_small\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"t3.small\"\n                    }\n                },\n                \"t3_medium\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"t3.medium\"\n                    }\n                },\n                \"t3_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"t3.large\"\n                    }\n                },\n                \"t3_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"t3.xlarge\"\n                    }\n                },\n                \"t3_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"t3.2xlarge\"\n                    }\n                },\n                \"t3a_nano\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"t3a.nano\"\n                    }\n                },\n                \"t3a_micro\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"t3a.micro\"\n                    }\n                },\n                \"t3a_small\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"t3a.small\"\n                    }\n                },\n                \"t3a_medium\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"t3a.medium\"\n                    }\n                },\n                \"t3a_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"t3a.large\"\n                    }\n                },\n                \"t3a_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"t3a.xlarge\"\n                    }\n                },\n                \"t3a_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"t3a.2xlarge\"\n                    }\n                },\n                \"t4g_nano\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"t4g.nano\"\n                    }\n                },\n                \"t4g_micro\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"t4g.micro\"\n                    }\n                },\n                \"t4g_small\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"t4g.small\"\n                    }\n                },\n                \"t4g_medium\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"t4g.medium\"\n                    }\n                },\n                \"t4g_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"t4g.large\"\n                    }\n                },\n                \"t4g_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"t4g.xlarge\"\n                    }\n                },\n                \"t4g_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"t4g.2xlarge\"\n                    }\n                },\n                \"u_6tb1_56xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"u-6tb1.56xlarge\"\n                    }\n                },\n                \"u_6tb1_112xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"u-6tb1.112xlarge\"\n                    }\n                },\n                \"u_9tb1_112xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"u-9tb1.112xlarge\"\n                    }\n                },\n                \"u_12tb1_112xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"u-12tb1.112xlarge\"\n                    }\n                },\n                \"u_6tb1_metal\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"u-6tb1.metal\"\n                    }\n                },\n                \"u_9tb1_metal\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"u-9tb1.metal\"\n                    }\n                },\n                \"u_12tb1_metal\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"u-12tb1.metal\"\n                    }\n                },\n                \"u_18tb1_metal\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"u-18tb1.metal\"\n                    }\n                },\n                \"u_24tb1_metal\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"u-24tb1.metal\"\n                    }\n                },\n                \"vt1_3xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"vt1.3xlarge\"\n                    }\n                },\n                \"vt1_6xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"vt1.6xlarge\"\n                    }\n                },\n                \"vt1_24xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"vt1.24xlarge\"\n                    }\n                },\n                \"x1_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"x1.16xlarge\"\n                    }\n                },\n                \"x1_32xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"x1.32xlarge\"\n                    }\n                },\n                \"x1e_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"x1e.xlarge\"\n                    }\n                },\n                \"x1e_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"x1e.2xlarge\"\n                    }\n                },\n                \"x1e_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"x1e.4xlarge\"\n                    }\n                },\n                \"x1e_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"x1e.8xlarge\"\n                    }\n                },\n                \"x1e_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"x1e.16xlarge\"\n                    }\n                },\n                \"x1e_32xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"x1e.32xlarge\"\n                    }\n                },\n                \"x2iezn_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"x2iezn.2xlarge\"\n                    }\n                },\n                \"x2iezn_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"x2iezn.4xlarge\"\n                    }\n                },\n                \"x2iezn_6xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"x2iezn.6xlarge\"\n                    }\n                },\n                \"x2iezn_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"x2iezn.8xlarge\"\n                    }\n                },\n                \"x2iezn_12xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"x2iezn.12xlarge\"\n                    }\n                },\n                \"x2iezn_metal\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"x2iezn.metal\"\n                    }\n                },\n                \"x2gd_medium\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"x2gd.medium\"\n                    }\n                },\n                \"x2gd_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"x2gd.large\"\n                    }\n                },\n                \"x2gd_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"x2gd.xlarge\"\n                    }\n                },\n                \"x2gd_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"x2gd.2xlarge\"\n                    }\n                },\n                \"x2gd_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"x2gd.4xlarge\"\n                    }\n                },\n                \"x2gd_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"x2gd.8xlarge\"\n                    }\n                },\n                \"x2gd_12xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"x2gd.12xlarge\"\n                    }\n                },\n                \"x2gd_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"x2gd.16xlarge\"\n                    }\n                },\n                \"x2gd_metal\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"x2gd.metal\"\n                    }\n                },\n                \"z1d_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"z1d.large\"\n                    }\n                },\n                \"z1d_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"z1d.xlarge\"\n                    }\n                },\n                \"z1d_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"z1d.2xlarge\"\n                    }\n                },\n                \"z1d_3xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"z1d.3xlarge\"\n                    }\n                },\n                \"z1d_6xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"z1d.6xlarge\"\n                    }\n                },\n                \"z1d_12xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"z1d.12xlarge\"\n                    }\n                },\n                \"z1d_metal\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"z1d.metal\"\n                    }\n                },\n                \"x2idn_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"x2idn.16xlarge\"\n                    }\n                },\n                \"x2idn_24xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"x2idn.24xlarge\"\n                    }\n                },\n                \"x2idn_32xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"x2idn.32xlarge\"\n                    }\n                },\n                \"x2iedn_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"x2iedn.xlarge\"\n                    }\n                },\n                \"x2iedn_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"x2iedn.2xlarge\"\n                    }\n                },\n                \"x2iedn_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"x2iedn.4xlarge\"\n                    }\n                },\n                \"x2iedn_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"x2iedn.8xlarge\"\n                    }\n                },\n                \"x2iedn_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"x2iedn.16xlarge\"\n                    }\n                },\n                \"x2iedn_24xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"x2iedn.24xlarge\"\n                    }\n                },\n                \"x2iedn_32xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"x2iedn.32xlarge\"\n                    }\n                },\n                \"c6a_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c6a.large\"\n                    }\n                },\n                \"c6a_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c6a.xlarge\"\n                    }\n                },\n                \"c6a_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c6a.2xlarge\"\n                    }\n                },\n                \"c6a_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c6a.4xlarge\"\n                    }\n                },\n                \"c6a_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c6a.8xlarge\"\n                    }\n                },\n                \"c6a_12xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c6a.12xlarge\"\n                    }\n                },\n                \"c6a_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c6a.16xlarge\"\n                    }\n                },\n                \"c6a_24xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c6a.24xlarge\"\n                    }\n                },\n                \"c6a_32xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c6a.32xlarge\"\n                    }\n                },\n                \"c6a_48xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c6a.48xlarge\"\n                    }\n                },\n                \"c6a_metal\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c6a.metal\"\n                    }\n                },\n                \"m6a_metal\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m6a.metal\"\n                    }\n                },\n                \"i4i_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"i4i.large\"\n                    }\n                },\n                \"i4i_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"i4i.xlarge\"\n                    }\n                },\n                \"i4i_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"i4i.2xlarge\"\n                    }\n                },\n                \"i4i_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"i4i.4xlarge\"\n                    }\n                },\n                \"i4i_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"i4i.8xlarge\"\n                    }\n                },\n                \"i4i_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"i4i.16xlarge\"\n                    }\n                },\n                \"i4i_32xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"i4i.32xlarge\"\n                    }\n                },\n                \"i4i_metal\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"i4i.metal\"\n                    }\n                },\n                \"x2idn_metal\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"x2idn.metal\"\n                    }\n                },\n                \"x2iedn_metal\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"x2iedn.metal\"\n                    }\n                },\n                \"c7g_medium\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c7g.medium\"\n                    }\n                },\n                \"c7g_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c7g.large\"\n                    }\n                },\n                \"c7g_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c7g.xlarge\"\n                    }\n                },\n                \"c7g_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c7g.2xlarge\"\n                    }\n                },\n                \"c7g_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c7g.4xlarge\"\n                    }\n                },\n                \"c7g_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c7g.8xlarge\"\n                    }\n                },\n                \"c7g_12xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c7g.12xlarge\"\n                    }\n                },\n                \"c7g_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c7g.16xlarge\"\n                    }\n                },\n                \"mac2_metal\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"mac2.metal\"\n                    }\n                },\n                \"c6id_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c6id.large\"\n                    }\n                },\n                \"c6id_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c6id.xlarge\"\n                    }\n                },\n                \"c6id_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c6id.2xlarge\"\n                    }\n                },\n                \"c6id_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c6id.4xlarge\"\n                    }\n                },\n                \"c6id_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c6id.8xlarge\"\n                    }\n                },\n                \"c6id_12xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c6id.12xlarge\"\n                    }\n                },\n                \"c6id_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c6id.16xlarge\"\n                    }\n                },\n                \"c6id_24xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c6id.24xlarge\"\n                    }\n                },\n                \"c6id_32xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c6id.32xlarge\"\n                    }\n                },\n                \"c6id_metal\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c6id.metal\"\n                    }\n                },\n                \"m6id_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m6id.large\"\n                    }\n                },\n                \"m6id_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m6id.xlarge\"\n                    }\n                },\n                \"m6id_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m6id.2xlarge\"\n                    }\n                },\n                \"m6id_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m6id.4xlarge\"\n                    }\n                },\n                \"m6id_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m6id.8xlarge\"\n                    }\n                },\n                \"m6id_12xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m6id.12xlarge\"\n                    }\n                },\n                \"m6id_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m6id.16xlarge\"\n                    }\n                },\n                \"m6id_24xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m6id.24xlarge\"\n                    }\n                },\n                \"m6id_32xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m6id.32xlarge\"\n                    }\n                },\n                \"m6id_metal\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m6id.metal\"\n                    }\n                },\n                \"r6id_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r6id.large\"\n                    }\n                },\n                \"r6id_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r6id.xlarge\"\n                    }\n                },\n                \"r6id_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r6id.2xlarge\"\n                    }\n                },\n                \"r6id_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r6id.4xlarge\"\n                    }\n                },\n                \"r6id_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r6id.8xlarge\"\n                    }\n                },\n                \"r6id_12xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r6id.12xlarge\"\n                    }\n                },\n                \"r6id_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r6id.16xlarge\"\n                    }\n                },\n                \"r6id_24xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r6id.24xlarge\"\n                    }\n                },\n                \"r6id_32xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r6id.32xlarge\"\n                    }\n                },\n                \"r6id_metal\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r6id.metal\"\n                    }\n                },\n                \"r6a_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r6a.large\"\n                    }\n                },\n                \"r6a_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r6a.xlarge\"\n                    }\n                },\n                \"r6a_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r6a.2xlarge\"\n                    }\n                },\n                \"r6a_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r6a.4xlarge\"\n                    }\n                },\n                \"r6a_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r6a.8xlarge\"\n                    }\n                },\n                \"r6a_12xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r6a.12xlarge\"\n                    }\n                },\n                \"r6a_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r6a.16xlarge\"\n                    }\n                },\n                \"r6a_24xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r6a.24xlarge\"\n                    }\n                },\n                \"r6a_32xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r6a.32xlarge\"\n                    }\n                },\n                \"r6a_48xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r6a.48xlarge\"\n                    }\n                },\n                \"r6a_metal\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r6a.metal\"\n                    }\n                },\n                \"p4de_24xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"p4de.24xlarge\"\n                    }\n                },\n                \"u_3tb1_56xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"u-3tb1.56xlarge\"\n                    }\n                },\n                \"u_18tb1_112xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"u-18tb1.112xlarge\"\n                    }\n                },\n                \"u_24tb1_112xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"u-24tb1.112xlarge\"\n                    }\n                },\n                \"trn1_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"trn1.2xlarge\"\n                    }\n                },\n                \"trn1_32xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"trn1.32xlarge\"\n                    }\n                },\n                \"hpc6id_32xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"hpc6id.32xlarge\"\n                    }\n                },\n                \"c6in_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c6in.large\"\n                    }\n                },\n                \"c6in_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c6in.xlarge\"\n                    }\n                },\n                \"c6in_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c6in.2xlarge\"\n                    }\n                },\n                \"c6in_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c6in.4xlarge\"\n                    }\n                },\n                \"c6in_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c6in.8xlarge\"\n                    }\n                },\n                \"c6in_12xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c6in.12xlarge\"\n                    }\n                },\n                \"c6in_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c6in.16xlarge\"\n                    }\n                },\n                \"c6in_24xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c6in.24xlarge\"\n                    }\n                },\n                \"c6in_32xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c6in.32xlarge\"\n                    }\n                },\n                \"m6in_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m6in.large\"\n                    }\n                },\n                \"m6in_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m6in.xlarge\"\n                    }\n                },\n                \"m6in_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m6in.2xlarge\"\n                    }\n                },\n                \"m6in_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m6in.4xlarge\"\n                    }\n                },\n                \"m6in_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m6in.8xlarge\"\n                    }\n                },\n                \"m6in_12xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m6in.12xlarge\"\n                    }\n                },\n                \"m6in_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m6in.16xlarge\"\n                    }\n                },\n                \"m6in_24xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m6in.24xlarge\"\n                    }\n                },\n                \"m6in_32xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m6in.32xlarge\"\n                    }\n                },\n                \"m6idn_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m6idn.large\"\n                    }\n                },\n                \"m6idn_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m6idn.xlarge\"\n                    }\n                },\n                \"m6idn_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m6idn.2xlarge\"\n                    }\n                },\n                \"m6idn_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m6idn.4xlarge\"\n                    }\n                },\n                \"m6idn_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m6idn.8xlarge\"\n                    }\n                },\n                \"m6idn_12xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m6idn.12xlarge\"\n                    }\n                },\n                \"m6idn_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m6idn.16xlarge\"\n                    }\n                },\n                \"m6idn_24xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m6idn.24xlarge\"\n                    }\n                },\n                \"m6idn_32xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m6idn.32xlarge\"\n                    }\n                },\n                \"r6in_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r6in.large\"\n                    }\n                },\n                \"r6in_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r6in.xlarge\"\n                    }\n                },\n                \"r6in_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r6in.2xlarge\"\n                    }\n                },\n                \"r6in_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r6in.4xlarge\"\n                    }\n                },\n                \"r6in_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r6in.8xlarge\"\n                    }\n                },\n                \"r6in_12xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r6in.12xlarge\"\n                    }\n                },\n                \"r6in_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r6in.16xlarge\"\n                    }\n                },\n                \"r6in_24xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r6in.24xlarge\"\n                    }\n                },\n                \"r6in_32xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r6in.32xlarge\"\n                    }\n                },\n                \"r6idn_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r6idn.large\"\n                    }\n                },\n                \"r6idn_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r6idn.xlarge\"\n                    }\n                },\n                \"r6idn_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r6idn.2xlarge\"\n                    }\n                },\n                \"r6idn_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r6idn.4xlarge\"\n                    }\n                },\n                \"r6idn_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r6idn.8xlarge\"\n                    }\n                },\n                \"r6idn_12xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r6idn.12xlarge\"\n                    }\n                },\n                \"r6idn_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r6idn.16xlarge\"\n                    }\n                },\n                \"r6idn_24xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r6idn.24xlarge\"\n                    }\n                },\n                \"r6idn_32xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r6idn.32xlarge\"\n                    }\n                },\n                \"c7g_metal\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c7g.metal\"\n                    }\n                },\n                \"m7g_medium\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m7g.medium\"\n                    }\n                },\n                \"m7g_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m7g.large\"\n                    }\n                },\n                \"m7g_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m7g.xlarge\"\n                    }\n                },\n                \"m7g_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m7g.2xlarge\"\n                    }\n                },\n                \"m7g_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m7g.4xlarge\"\n                    }\n                },\n                \"m7g_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m7g.8xlarge\"\n                    }\n                },\n                \"m7g_12xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m7g.12xlarge\"\n                    }\n                },\n                \"m7g_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m7g.16xlarge\"\n                    }\n                },\n                \"m7g_metal\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m7g.metal\"\n                    }\n                },\n                \"r7g_medium\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r7g.medium\"\n                    }\n                },\n                \"r7g_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r7g.large\"\n                    }\n                },\n                \"r7g_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r7g.xlarge\"\n                    }\n                },\n                \"r7g_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r7g.2xlarge\"\n                    }\n                },\n                \"r7g_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r7g.4xlarge\"\n                    }\n                },\n                \"r7g_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r7g.8xlarge\"\n                    }\n                },\n                \"r7g_12xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r7g.12xlarge\"\n                    }\n                },\n                \"r7g_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r7g.16xlarge\"\n                    }\n                },\n                \"r7g_metal\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r7g.metal\"\n                    }\n                },\n                \"c6in_metal\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c6in.metal\"\n                    }\n                },\n                \"m6in_metal\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m6in.metal\"\n                    }\n                },\n                \"m6idn_metal\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m6idn.metal\"\n                    }\n                },\n                \"r6in_metal\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r6in.metal\"\n                    }\n                },\n                \"r6idn_metal\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r6idn.metal\"\n                    }\n                },\n                \"inf2_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"inf2.xlarge\"\n                    }\n                },\n                \"inf2_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"inf2.8xlarge\"\n                    }\n                },\n                \"inf2_24xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"inf2.24xlarge\"\n                    }\n                },\n                \"inf2_48xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"inf2.48xlarge\"\n                    }\n                },\n                \"trn1n_32xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"trn1n.32xlarge\"\n                    }\n                },\n                \"i4g_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"i4g.large\"\n                    }\n                },\n                \"i4g_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"i4g.xlarge\"\n                    }\n                },\n                \"i4g_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"i4g.2xlarge\"\n                    }\n                },\n                \"i4g_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"i4g.4xlarge\"\n                    }\n                },\n                \"i4g_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"i4g.8xlarge\"\n                    }\n                },\n                \"i4g_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"i4g.16xlarge\"\n                    }\n                },\n                \"hpc7g_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"hpc7g.4xlarge\"\n                    }\n                },\n                \"hpc7g_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"hpc7g.8xlarge\"\n                    }\n                },\n                \"hpc7g_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"hpc7g.16xlarge\"\n                    }\n                },\n                \"c7gn_medium\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c7gn.medium\"\n                    }\n                },\n                \"c7gn_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c7gn.large\"\n                    }\n                },\n                \"c7gn_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c7gn.xlarge\"\n                    }\n                },\n                \"c7gn_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c7gn.2xlarge\"\n                    }\n                },\n                \"c7gn_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c7gn.4xlarge\"\n                    }\n                },\n                \"c7gn_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c7gn.8xlarge\"\n                    }\n                },\n                \"c7gn_12xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c7gn.12xlarge\"\n                    }\n                },\n                \"c7gn_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c7gn.16xlarge\"\n                    }\n                },\n                \"p5_48xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"p5.48xlarge\"\n                    }\n                },\n                \"m7i_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m7i.large\"\n                    }\n                },\n                \"m7i_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m7i.xlarge\"\n                    }\n                },\n                \"m7i_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m7i.2xlarge\"\n                    }\n                },\n                \"m7i_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m7i.4xlarge\"\n                    }\n                },\n                \"m7i_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m7i.8xlarge\"\n                    }\n                },\n                \"m7i_12xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m7i.12xlarge\"\n                    }\n                },\n                \"m7i_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m7i.16xlarge\"\n                    }\n                },\n                \"m7i_24xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m7i.24xlarge\"\n                    }\n                },\n                \"m7i_48xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m7i.48xlarge\"\n                    }\n                },\n                \"m7i_flex_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m7i-flex.large\"\n                    }\n                },\n                \"m7i_flex_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m7i-flex.xlarge\"\n                    }\n                },\n                \"m7i_flex_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m7i-flex.2xlarge\"\n                    }\n                },\n                \"m7i_flex_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m7i-flex.4xlarge\"\n                    }\n                },\n                \"m7i_flex_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m7i-flex.8xlarge\"\n                    }\n                },\n                \"m7a_medium\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m7a.medium\"\n                    }\n                },\n                \"m7a_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m7a.large\"\n                    }\n                },\n                \"m7a_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m7a.xlarge\"\n                    }\n                },\n                \"m7a_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m7a.2xlarge\"\n                    }\n                },\n                \"m7a_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m7a.4xlarge\"\n                    }\n                },\n                \"m7a_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m7a.8xlarge\"\n                    }\n                },\n                \"m7a_12xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m7a.12xlarge\"\n                    }\n                },\n                \"m7a_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m7a.16xlarge\"\n                    }\n                },\n                \"m7a_24xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m7a.24xlarge\"\n                    }\n                },\n                \"m7a_32xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m7a.32xlarge\"\n                    }\n                },\n                \"m7a_48xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m7a.48xlarge\"\n                    }\n                },\n                \"m7a_metal_48xl\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m7a.metal-48xl\"\n                    }\n                },\n                \"hpc7a_12xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"hpc7a.12xlarge\"\n                    }\n                },\n                \"hpc7a_24xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"hpc7a.24xlarge\"\n                    }\n                },\n                \"hpc7a_48xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"hpc7a.48xlarge\"\n                    }\n                },\n                \"hpc7a_96xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"hpc7a.96xlarge\"\n                    }\n                },\n                \"c7gd_medium\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c7gd.medium\"\n                    }\n                },\n                \"c7gd_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c7gd.large\"\n                    }\n                },\n                \"c7gd_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c7gd.xlarge\"\n                    }\n                },\n                \"c7gd_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c7gd.2xlarge\"\n                    }\n                },\n                \"c7gd_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c7gd.4xlarge\"\n                    }\n                },\n                \"c7gd_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c7gd.8xlarge\"\n                    }\n                },\n                \"c7gd_12xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c7gd.12xlarge\"\n                    }\n                },\n                \"c7gd_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c7gd.16xlarge\"\n                    }\n                },\n                \"m7gd_medium\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m7gd.medium\"\n                    }\n                },\n                \"m7gd_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m7gd.large\"\n                    }\n                },\n                \"m7gd_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m7gd.xlarge\"\n                    }\n                },\n                \"m7gd_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m7gd.2xlarge\"\n                    }\n                },\n                \"m7gd_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m7gd.4xlarge\"\n                    }\n                },\n                \"m7gd_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m7gd.8xlarge\"\n                    }\n                },\n                \"m7gd_12xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m7gd.12xlarge\"\n                    }\n                },\n                \"m7gd_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m7gd.16xlarge\"\n                    }\n                },\n                \"r7gd_medium\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r7gd.medium\"\n                    }\n                },\n                \"r7gd_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r7gd.large\"\n                    }\n                },\n                \"r7gd_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r7gd.xlarge\"\n                    }\n                },\n                \"r7gd_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r7gd.2xlarge\"\n                    }\n                },\n                \"r7gd_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r7gd.4xlarge\"\n                    }\n                },\n                \"r7gd_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r7gd.8xlarge\"\n                    }\n                },\n                \"r7gd_12xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r7gd.12xlarge\"\n                    }\n                },\n                \"r7gd_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r7gd.16xlarge\"\n                    }\n                },\n                \"r7a_medium\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r7a.medium\"\n                    }\n                },\n                \"r7a_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r7a.large\"\n                    }\n                },\n                \"r7a_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r7a.xlarge\"\n                    }\n                },\n                \"r7a_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r7a.2xlarge\"\n                    }\n                },\n                \"r7a_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r7a.4xlarge\"\n                    }\n                },\n                \"r7a_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r7a.8xlarge\"\n                    }\n                },\n                \"r7a_12xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r7a.12xlarge\"\n                    }\n                },\n                \"r7a_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r7a.16xlarge\"\n                    }\n                },\n                \"r7a_24xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r7a.24xlarge\"\n                    }\n                },\n                \"r7a_32xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r7a.32xlarge\"\n                    }\n                },\n                \"r7a_48xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r7a.48xlarge\"\n                    }\n                },\n                \"c7i_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c7i.large\"\n                    }\n                },\n                \"c7i_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c7i.xlarge\"\n                    }\n                },\n                \"c7i_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c7i.2xlarge\"\n                    }\n                },\n                \"c7i_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c7i.4xlarge\"\n                    }\n                },\n                \"c7i_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c7i.8xlarge\"\n                    }\n                },\n                \"c7i_12xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c7i.12xlarge\"\n                    }\n                },\n                \"c7i_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c7i.16xlarge\"\n                    }\n                },\n                \"c7i_24xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c7i.24xlarge\"\n                    }\n                },\n                \"c7i_48xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c7i.48xlarge\"\n                    }\n                },\n                \"mac2_m2pro_metal\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"mac2-m2pro.metal\"\n                    }\n                },\n                \"r7iz_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r7iz.large\"\n                    }\n                },\n                \"r7iz_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r7iz.xlarge\"\n                    }\n                },\n                \"r7iz_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r7iz.2xlarge\"\n                    }\n                },\n                \"r7iz_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r7iz.4xlarge\"\n                    }\n                },\n                \"r7iz_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r7iz.8xlarge\"\n                    }\n                },\n                \"r7iz_12xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r7iz.12xlarge\"\n                    }\n                },\n                \"r7iz_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r7iz.16xlarge\"\n                    }\n                },\n                \"r7iz_32xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r7iz.32xlarge\"\n                    }\n                },\n                \"c7a_medium\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c7a.medium\"\n                    }\n                },\n                \"c7a_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c7a.large\"\n                    }\n                },\n                \"c7a_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c7a.xlarge\"\n                    }\n                },\n                \"c7a_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c7a.2xlarge\"\n                    }\n                },\n                \"c7a_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c7a.4xlarge\"\n                    }\n                },\n                \"c7a_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c7a.8xlarge\"\n                    }\n                },\n                \"c7a_12xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c7a.12xlarge\"\n                    }\n                },\n                \"c7a_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c7a.16xlarge\"\n                    }\n                },\n                \"c7a_24xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c7a.24xlarge\"\n                    }\n                },\n                \"c7a_32xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c7a.32xlarge\"\n                    }\n                },\n                \"c7a_48xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c7a.48xlarge\"\n                    }\n                },\n                \"c7a_metal_48xl\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c7a.metal-48xl\"\n                    }\n                },\n                \"r7a_metal_48xl\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r7a.metal-48xl\"\n                    }\n                },\n                \"r7i_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r7i.large\"\n                    }\n                },\n                \"r7i_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r7i.xlarge\"\n                    }\n                },\n                \"r7i_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r7i.2xlarge\"\n                    }\n                },\n                \"r7i_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r7i.4xlarge\"\n                    }\n                },\n                \"r7i_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r7i.8xlarge\"\n                    }\n                },\n                \"r7i_12xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r7i.12xlarge\"\n                    }\n                },\n                \"r7i_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r7i.16xlarge\"\n                    }\n                },\n                \"r7i_24xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r7i.24xlarge\"\n                    }\n                },\n                \"r7i_48xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r7i.48xlarge\"\n                    }\n                },\n                \"dl2q_24xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"dl2q.24xlarge\"\n                    }\n                },\n                \"mac2_m2_metal\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"mac2-m2.metal\"\n                    }\n                },\n                \"i4i_12xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"i4i.12xlarge\"\n                    }\n                },\n                \"i4i_24xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"i4i.24xlarge\"\n                    }\n                },\n                \"c7i_metal_24xl\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c7i.metal-24xl\"\n                    }\n                },\n                \"c7i_metal_48xl\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c7i.metal-48xl\"\n                    }\n                },\n                \"m7i_metal_24xl\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m7i.metal-24xl\"\n                    }\n                },\n                \"m7i_metal_48xl\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m7i.metal-48xl\"\n                    }\n                },\n                \"r7i_metal_24xl\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r7i.metal-24xl\"\n                    }\n                },\n                \"r7i_metal_48xl\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r7i.metal-48xl\"\n                    }\n                },\n                \"r7iz_metal_16xl\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r7iz.metal-16xl\"\n                    }\n                },\n                \"r7iz_metal_32xl\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r7iz.metal-32xl\"\n                    }\n                },\n                \"c7gd_metal\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c7gd.metal\"\n                    }\n                },\n                \"m7gd_metal\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m7gd.metal\"\n                    }\n                },\n                \"r7gd_metal\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r7gd.metal\"\n                    }\n                },\n                \"g6_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"g6.xlarge\"\n                    }\n                },\n                \"g6_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"g6.2xlarge\"\n                    }\n                },\n                \"g6_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"g6.4xlarge\"\n                    }\n                },\n                \"g6_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"g6.8xlarge\"\n                    }\n                },\n                \"g6_12xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"g6.12xlarge\"\n                    }\n                },\n                \"g6_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"g6.16xlarge\"\n                    }\n                },\n                \"g6_24xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"g6.24xlarge\"\n                    }\n                },\n                \"g6_48xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"g6.48xlarge\"\n                    }\n                },\n                \"gr6_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"gr6.4xlarge\"\n                    }\n                },\n                \"gr6_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"gr6.8xlarge\"\n                    }\n                },\n                \"c7i_flex_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c7i-flex.large\"\n                    }\n                },\n                \"c7i_flex_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c7i-flex.xlarge\"\n                    }\n                },\n                \"c7i_flex_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c7i-flex.2xlarge\"\n                    }\n                },\n                \"c7i_flex_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c7i-flex.4xlarge\"\n                    }\n                },\n                \"c7i_flex_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c7i-flex.8xlarge\"\n                    }\n                },\n                \"u7i_12tb_224xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"u7i-12tb.224xlarge\"\n                    }\n                },\n                \"u7in_16tb_224xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"u7in-16tb.224xlarge\"\n                    }\n                },\n                \"u7in_24tb_224xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"u7in-24tb.224xlarge\"\n                    }\n                },\n                \"u7in_32tb_224xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"u7in-32tb.224xlarge\"\n                    }\n                },\n                \"u7ib_12tb_224xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"u7ib-12tb.224xlarge\"\n                    }\n                },\n                \"c7gn_metal\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c7gn.metal\"\n                    }\n                },\n                \"r8g_medium\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r8g.medium\"\n                    }\n                },\n                \"r8g_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r8g.large\"\n                    }\n                },\n                \"r8g_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r8g.xlarge\"\n                    }\n                },\n                \"r8g_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r8g.2xlarge\"\n                    }\n                },\n                \"r8g_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r8g.4xlarge\"\n                    }\n                },\n                \"r8g_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r8g.8xlarge\"\n                    }\n                },\n                \"r8g_12xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r8g.12xlarge\"\n                    }\n                },\n                \"r8g_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r8g.16xlarge\"\n                    }\n                },\n                \"r8g_24xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r8g.24xlarge\"\n                    }\n                },\n                \"r8g_48xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r8g.48xlarge\"\n                    }\n                },\n                \"r8g_metal_24xl\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r8g.metal-24xl\"\n                    }\n                },\n                \"r8g_metal_48xl\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r8g.metal-48xl\"\n                    }\n                },\n                \"mac2_m1ultra_metal\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"mac2-m1ultra.metal\"\n                    }\n                },\n                \"g6e_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"g6e.xlarge\"\n                    }\n                },\n                \"g6e_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"g6e.2xlarge\"\n                    }\n                },\n                \"g6e_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"g6e.4xlarge\"\n                    }\n                },\n                \"g6e_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"g6e.8xlarge\"\n                    }\n                },\n                \"g6e_12xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"g6e.12xlarge\"\n                    }\n                },\n                \"g6e_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"g6e.16xlarge\"\n                    }\n                },\n                \"g6e_24xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"g6e.24xlarge\"\n                    }\n                },\n                \"g6e_48xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"g6e.48xlarge\"\n                    }\n                },\n                \"c8g_medium\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c8g.medium\"\n                    }\n                },\n                \"c8g_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c8g.large\"\n                    }\n                },\n                \"c8g_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c8g.xlarge\"\n                    }\n                },\n                \"c8g_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c8g.2xlarge\"\n                    }\n                },\n                \"c8g_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c8g.4xlarge\"\n                    }\n                },\n                \"c8g_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c8g.8xlarge\"\n                    }\n                },\n                \"c8g_12xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c8g.12xlarge\"\n                    }\n                },\n                \"c8g_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c8g.16xlarge\"\n                    }\n                },\n                \"c8g_24xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c8g.24xlarge\"\n                    }\n                },\n                \"c8g_48xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c8g.48xlarge\"\n                    }\n                },\n                \"c8g_metal_24xl\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c8g.metal-24xl\"\n                    }\n                },\n                \"c8g_metal_48xl\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c8g.metal-48xl\"\n                    }\n                },\n                \"m8g_medium\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m8g.medium\"\n                    }\n                },\n                \"m8g_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m8g.large\"\n                    }\n                },\n                \"m8g_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m8g.xlarge\"\n                    }\n                },\n                \"m8g_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m8g.2xlarge\"\n                    }\n                },\n                \"m8g_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m8g.4xlarge\"\n                    }\n                },\n                \"m8g_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m8g.8xlarge\"\n                    }\n                },\n                \"m8g_12xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m8g.12xlarge\"\n                    }\n                },\n                \"m8g_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m8g.16xlarge\"\n                    }\n                },\n                \"m8g_24xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m8g.24xlarge\"\n                    }\n                },\n                \"m8g_48xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m8g.48xlarge\"\n                    }\n                },\n                \"m8g_metal_24xl\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m8g.metal-24xl\"\n                    }\n                },\n                \"m8g_metal_48xl\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m8g.metal-48xl\"\n                    }\n                },\n                \"x8g_medium\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"x8g.medium\"\n                    }\n                },\n                \"x8g_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"x8g.large\"\n                    }\n                },\n                \"x8g_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"x8g.xlarge\"\n                    }\n                },\n                \"x8g_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"x8g.2xlarge\"\n                    }\n                },\n                \"x8g_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"x8g.4xlarge\"\n                    }\n                },\n                \"x8g_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"x8g.8xlarge\"\n                    }\n                },\n                \"x8g_12xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"x8g.12xlarge\"\n                    }\n                },\n                \"x8g_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"x8g.16xlarge\"\n                    }\n                },\n                \"x8g_24xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"x8g.24xlarge\"\n                    }\n                },\n                \"x8g_48xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"x8g.48xlarge\"\n                    }\n                },\n                \"x8g_metal_24xl\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"x8g.metal-24xl\"\n                    }\n                },\n                \"x8g_metal_48xl\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"x8g.metal-48xl\"\n                    }\n                },\n                \"i7ie_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"i7ie.large\"\n                    }\n                },\n                \"i7ie_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"i7ie.xlarge\"\n                    }\n                },\n                \"i7ie_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"i7ie.2xlarge\"\n                    }\n                },\n                \"i7ie_3xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"i7ie.3xlarge\"\n                    }\n                },\n                \"i7ie_6xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"i7ie.6xlarge\"\n                    }\n                },\n                \"i7ie_12xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"i7ie.12xlarge\"\n                    }\n                },\n                \"i7ie_18xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"i7ie.18xlarge\"\n                    }\n                },\n                \"i7ie_24xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"i7ie.24xlarge\"\n                    }\n                },\n                \"i7ie_48xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"i7ie.48xlarge\"\n                    }\n                },\n                \"i8g_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"i8g.large\"\n                    }\n                },\n                \"i8g_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"i8g.xlarge\"\n                    }\n                },\n                \"i8g_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"i8g.2xlarge\"\n                    }\n                },\n                \"i8g_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"i8g.4xlarge\"\n                    }\n                },\n                \"i8g_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"i8g.8xlarge\"\n                    }\n                },\n                \"i8g_12xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"i8g.12xlarge\"\n                    }\n                },\n                \"i8g_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"i8g.16xlarge\"\n                    }\n                },\n                \"i8g_24xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"i8g.24xlarge\"\n                    }\n                },\n                \"i8g_metal_24xl\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"i8g.metal-24xl\"\n                    }\n                },\n                \"u7i_6tb_112xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"u7i-6tb.112xlarge\"\n                    }\n                },\n                \"u7i_8tb_112xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"u7i-8tb.112xlarge\"\n                    }\n                },\n                \"u7inh_32tb_480xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"u7inh-32tb.480xlarge\"\n                    }\n                },\n                \"p5e_48xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"p5e.48xlarge\"\n                    }\n                },\n                \"p5en_48xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"p5en.48xlarge\"\n                    }\n                },\n                \"f2_12xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"f2.12xlarge\"\n                    }\n                },\n                \"f2_48xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"f2.48xlarge\"\n                    }\n                },\n                \"trn2_48xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"trn2.48xlarge\"\n                    }\n                },\n                \"c7i_flex_12xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c7i-flex.12xlarge\"\n                    }\n                },\n                \"c7i_flex_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c7i-flex.16xlarge\"\n                    }\n                },\n                \"m7i_flex_12xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m7i-flex.12xlarge\"\n                    }\n                },\n                \"m7i_flex_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m7i-flex.16xlarge\"\n                    }\n                },\n                \"i7ie_metal_24xl\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"i7ie.metal-24xl\"\n                    }\n                },\n                \"i7ie_metal_48xl\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"i7ie.metal-48xl\"\n                    }\n                },\n                \"i8g_48xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"i8g.48xlarge\"\n                    }\n                },\n                \"c8gd_medium\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c8gd.medium\"\n                    }\n                },\n                \"c8gd_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c8gd.large\"\n                    }\n                },\n                \"c8gd_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c8gd.xlarge\"\n                    }\n                },\n                \"c8gd_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c8gd.2xlarge\"\n                    }\n                },\n                \"c8gd_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c8gd.4xlarge\"\n                    }\n                },\n                \"c8gd_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c8gd.8xlarge\"\n                    }\n                },\n                \"c8gd_12xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c8gd.12xlarge\"\n                    }\n                },\n                \"c8gd_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c8gd.16xlarge\"\n                    }\n                },\n                \"c8gd_24xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c8gd.24xlarge\"\n                    }\n                },\n                \"c8gd_48xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c8gd.48xlarge\"\n                    }\n                },\n                \"c8gd_metal_24xl\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c8gd.metal-24xl\"\n                    }\n                },\n                \"c8gd_metal_48xl\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c8gd.metal-48xl\"\n                    }\n                },\n                \"i7i_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"i7i.large\"\n                    }\n                },\n                \"i7i_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"i7i.xlarge\"\n                    }\n                },\n                \"i7i_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"i7i.2xlarge\"\n                    }\n                },\n                \"i7i_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"i7i.4xlarge\"\n                    }\n                },\n                \"i7i_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"i7i.8xlarge\"\n                    }\n                },\n                \"i7i_12xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"i7i.12xlarge\"\n                    }\n                },\n                \"i7i_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"i7i.16xlarge\"\n                    }\n                },\n                \"i7i_24xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"i7i.24xlarge\"\n                    }\n                },\n                \"i7i_48xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"i7i.48xlarge\"\n                    }\n                },\n                \"i7i_metal_24xl\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"i7i.metal-24xl\"\n                    }\n                },\n                \"i7i_metal_48xl\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"i7i.metal-48xl\"\n                    }\n                },\n                \"p6_b200_48xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"p6-b200.48xlarge\"\n                    }\n                },\n                \"m8gd_medium\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m8gd.medium\"\n                    }\n                },\n                \"m8gd_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m8gd.large\"\n                    }\n                },\n                \"m8gd_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m8gd.xlarge\"\n                    }\n                },\n                \"m8gd_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m8gd.2xlarge\"\n                    }\n                },\n                \"m8gd_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m8gd.4xlarge\"\n                    }\n                },\n                \"m8gd_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m8gd.8xlarge\"\n                    }\n                },\n                \"m8gd_12xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m8gd.12xlarge\"\n                    }\n                },\n                \"m8gd_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m8gd.16xlarge\"\n                    }\n                },\n                \"m8gd_24xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m8gd.24xlarge\"\n                    }\n                },\n                \"m8gd_48xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m8gd.48xlarge\"\n                    }\n                },\n                \"m8gd_metal_24xl\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m8gd.metal-24xl\"\n                    }\n                },\n                \"m8gd_metal_48xl\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m8gd.metal-48xl\"\n                    }\n                },\n                \"r8gd_medium\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r8gd.medium\"\n                    }\n                },\n                \"r8gd_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r8gd.large\"\n                    }\n                },\n                \"r8gd_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r8gd.xlarge\"\n                    }\n                },\n                \"r8gd_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r8gd.2xlarge\"\n                    }\n                },\n                \"r8gd_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r8gd.4xlarge\"\n                    }\n                },\n                \"r8gd_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r8gd.8xlarge\"\n                    }\n                },\n                \"r8gd_12xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r8gd.12xlarge\"\n                    }\n                },\n                \"r8gd_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r8gd.16xlarge\"\n                    }\n                },\n                \"r8gd_24xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r8gd.24xlarge\"\n                    }\n                },\n                \"r8gd_48xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r8gd.48xlarge\"\n                    }\n                },\n                \"r8gd_metal_24xl\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r8gd.metal-24xl\"\n                    }\n                },\n                \"r8gd_metal_48xl\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r8gd.metal-48xl\"\n                    }\n                },\n                \"c8gn_medium\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c8gn.medium\"\n                    }\n                },\n                \"c8gn_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c8gn.large\"\n                    }\n                },\n                \"c8gn_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c8gn.xlarge\"\n                    }\n                },\n                \"c8gn_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c8gn.2xlarge\"\n                    }\n                },\n                \"c8gn_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c8gn.4xlarge\"\n                    }\n                },\n                \"c8gn_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c8gn.8xlarge\"\n                    }\n                },\n                \"c8gn_12xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c8gn.12xlarge\"\n                    }\n                },\n                \"c8gn_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c8gn.16xlarge\"\n                    }\n                },\n                \"c8gn_24xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c8gn.24xlarge\"\n                    }\n                },\n                \"c8gn_48xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c8gn.48xlarge\"\n                    }\n                },\n                \"c8gn_metal_24xl\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c8gn.metal-24xl\"\n                    }\n                },\n                \"c8gn_metal_48xl\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"c8gn.metal-48xl\"\n                    }\n                },\n                \"f2_6xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"f2.6xlarge\"\n                    }\n                },\n                \"p6e_gb200_36xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"p6e-gb200.36xlarge\"\n                    }\n                },\n                \"g6f_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"g6f.large\"\n                    }\n                },\n                \"g6f_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"g6f.xlarge\"\n                    }\n                },\n                \"g6f_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"g6f.2xlarge\"\n                    }\n                },\n                \"g6f_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"g6f.4xlarge\"\n                    }\n                },\n                \"gr6f_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"gr6f.4xlarge\"\n                    }\n                },\n                \"p5_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"p5.4xlarge\"\n                    }\n                },\n                \"r8i_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r8i.large\"\n                    }\n                },\n                \"r8i_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r8i.xlarge\"\n                    }\n                },\n                \"r8i_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r8i.2xlarge\"\n                    }\n                },\n                \"r8i_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r8i.4xlarge\"\n                    }\n                },\n                \"r8i_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r8i.8xlarge\"\n                    }\n                },\n                \"r8i_12xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r8i.12xlarge\"\n                    }\n                },\n                \"r8i_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r8i.16xlarge\"\n                    }\n                },\n                \"r8i_24xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r8i.24xlarge\"\n                    }\n                },\n                \"r8i_32xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r8i.32xlarge\"\n                    }\n                },\n                \"r8i_48xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r8i.48xlarge\"\n                    }\n                },\n                \"r8i_96xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r8i.96xlarge\"\n                    }\n                },\n                \"r8i_metal_48xl\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r8i.metal-48xl\"\n                    }\n                },\n                \"r8i_metal_96xl\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r8i.metal-96xl\"\n                    }\n                },\n                \"r8i_flex_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r8i-flex.large\"\n                    }\n                },\n                \"r8i_flex_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r8i-flex.xlarge\"\n                    }\n                },\n                \"r8i_flex_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r8i-flex.2xlarge\"\n                    }\n                },\n                \"r8i_flex_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r8i-flex.4xlarge\"\n                    }\n                },\n                \"r8i_flex_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r8i-flex.8xlarge\"\n                    }\n                },\n                \"r8i_flex_12xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r8i-flex.12xlarge\"\n                    }\n                },\n                \"r8i_flex_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r8i-flex.16xlarge\"\n                    }\n                },\n                \"m8i_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m8i.large\"\n                    }\n                },\n                \"m8i_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m8i.xlarge\"\n                    }\n                },\n                \"m8i_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m8i.2xlarge\"\n                    }\n                },\n                \"m8i_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m8i.4xlarge\"\n                    }\n                },\n                \"m8i_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m8i.8xlarge\"\n                    }\n                },\n                \"m8i_12xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m8i.12xlarge\"\n                    }\n                },\n                \"m8i_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m8i.16xlarge\"\n                    }\n                },\n                \"m8i_24xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m8i.24xlarge\"\n                    }\n                },\n                \"m8i_32xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m8i.32xlarge\"\n                    }\n                },\n                \"m8i_48xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m8i.48xlarge\"\n                    }\n                },\n                \"m8i_96xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m8i.96xlarge\"\n                    }\n                },\n                \"m8i_metal_48xl\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m8i.metal-48xl\"\n                    }\n                },\n                \"m8i_metal_96xl\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m8i.metal-96xl\"\n                    }\n                },\n                \"m8i_flex_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m8i-flex.large\"\n                    }\n                },\n                \"m8i_flex_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m8i-flex.xlarge\"\n                    }\n                },\n                \"m8i_flex_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m8i-flex.2xlarge\"\n                    }\n                },\n                \"m8i_flex_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m8i-flex.4xlarge\"\n                    }\n                },\n                \"m8i_flex_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m8i-flex.8xlarge\"\n                    }\n                },\n                \"m8i_flex_12xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m8i-flex.12xlarge\"\n                    }\n                },\n                \"m8i_flex_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m8i-flex.16xlarge\"\n                    }\n                },\n                \"i8ge_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"i8ge.large\"\n                    }\n                },\n                \"i8ge_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"i8ge.xlarge\"\n                    }\n                },\n                \"i8ge_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"i8ge.2xlarge\"\n                    }\n                },\n                \"i8ge_3xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"i8ge.3xlarge\"\n                    }\n                },\n                \"i8ge_6xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"i8ge.6xlarge\"\n                    }\n                },\n                \"i8ge_12xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"i8ge.12xlarge\"\n                    }\n                },\n                \"i8ge_18xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"i8ge.18xlarge\"\n                    }\n                },\n                \"i8ge_24xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"i8ge.24xlarge\"\n                    }\n                },\n                \"i8ge_48xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"i8ge.48xlarge\"\n                    }\n                },\n                \"i8ge_metal_24xl\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"i8ge.metal-24xl\"\n                    }\n                },\n                \"i8ge_metal_48xl\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"i8ge.metal-48xl\"\n                    }\n                },\n                \"mac_m4_metal\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"mac-m4.metal\"\n                    }\n                },\n                \"mac_m4pro_metal\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"mac-m4pro.metal\"\n                    }\n                },\n                \"r8gn_medium\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r8gn.medium\"\n                    }\n                },\n                \"r8gn_large\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r8gn.large\"\n                    }\n                },\n                \"r8gn_xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r8gn.xlarge\"\n                    }\n                },\n                \"r8gn_2xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r8gn.2xlarge\"\n                    }\n                },\n                \"r8gn_4xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r8gn.4xlarge\"\n                    }\n                },\n                \"r8gn_8xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r8gn.8xlarge\"\n                    }\n                },\n                \"r8gn_12xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r8gn.12xlarge\"\n                    }\n                },\n                \"r8gn_16xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r8gn.16xlarge\"\n                    }\n                },\n                \"r8gn_24xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r8gn.24xlarge\"\n                    }\n                },\n                \"r8gn_48xlarge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r8gn.48xlarge\"\n                    }\n                },\n                \"r8gn_metal_24xl\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r8gn.metal-24xl\"\n                    }\n                },\n                \"r8gn_metal_48xl\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"r8gn.metal-48xl\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#InstanceTypeHypervisor\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"NITRO\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"nitro\"\n                    }\n                },\n                \"XEN\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"xen\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#InstanceTypeInfo\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceType\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceType\",\n                        \"smithy.api#documentation\": \"<p>The instance type. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html\\\">Instance types</a> in the <i>Amazon EC2\\n    User Guide</i>.</p>\",\n                        \"smithy.api#xmlName\": \"instanceType\"\n                    }\n                },\n                \"CurrentGeneration\": {\n                    \"target\": \"com.amazonaws.ec2#CurrentGenerationFlag\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CurrentGeneration\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether the instance type is current generation.</p>\",\n                        \"smithy.api#xmlName\": \"currentGeneration\"\n                    }\n                },\n                \"FreeTierEligible\": {\n                    \"target\": \"com.amazonaws.ec2#FreeTierEligibleFlag\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"FreeTierEligible\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether the instance type is eligible for the free tier.</p>\",\n                        \"smithy.api#xmlName\": \"freeTierEligible\"\n                    }\n                },\n                \"SupportedUsageClasses\": {\n                    \"target\": \"com.amazonaws.ec2#UsageClassTypeList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SupportedUsageClasses\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether the instance type is offered for spot, On-Demand, or Capacity\\n   Blocks.</p>\",\n                        \"smithy.api#xmlName\": \"supportedUsageClasses\"\n                    }\n                },\n                \"SupportedRootDeviceTypes\": {\n                    \"target\": \"com.amazonaws.ec2#RootDeviceTypeList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SupportedRootDeviceTypes\",\n                        \"smithy.api#documentation\": \"<p>The supported root device types.</p>\",\n                        \"smithy.api#xmlName\": \"supportedRootDeviceTypes\"\n                    }\n                },\n                \"SupportedVirtualizationTypes\": {\n                    \"target\": \"com.amazonaws.ec2#VirtualizationTypeList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SupportedVirtualizationTypes\",\n                        \"smithy.api#documentation\": \"<p>The supported virtualization types.</p>\",\n                        \"smithy.api#xmlName\": \"supportedVirtualizationTypes\"\n                    }\n                },\n                \"BareMetal\": {\n                    \"target\": \"com.amazonaws.ec2#BareMetalFlag\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"BareMetal\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether the instance is a bare metal instance type.</p>\",\n                        \"smithy.api#xmlName\": \"bareMetal\"\n                    }\n                },\n                \"Hypervisor\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceTypeHypervisor\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Hypervisor\",\n                        \"smithy.api#documentation\": \"<p>The hypervisor for the instance type.</p>\",\n                        \"smithy.api#xmlName\": \"hypervisor\"\n                    }\n                },\n                \"ProcessorInfo\": {\n                    \"target\": \"com.amazonaws.ec2#ProcessorInfo\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ProcessorInfo\",\n                        \"smithy.api#documentation\": \"<p>Describes the processor.</p>\",\n                        \"smithy.api#xmlName\": \"processorInfo\"\n                    }\n                },\n                \"VCpuInfo\": {\n                    \"target\": \"com.amazonaws.ec2#VCpuInfo\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VCpuInfo\",\n                        \"smithy.api#documentation\": \"<p>Describes the vCPU configurations for the instance type.</p>\",\n                        \"smithy.api#xmlName\": \"vCpuInfo\"\n                    }\n                },\n                \"MemoryInfo\": {\n                    \"target\": \"com.amazonaws.ec2#MemoryInfo\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MemoryInfo\",\n                        \"smithy.api#documentation\": \"<p>Describes the memory for the instance type.</p>\",\n                        \"smithy.api#xmlName\": \"memoryInfo\"\n                    }\n                },\n                \"InstanceStorageSupported\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceStorageFlag\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceStorageSupported\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether instance storage is supported.</p>\",\n                        \"smithy.api#xmlName\": \"instanceStorageSupported\"\n                    }\n                },\n                \"InstanceStorageInfo\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceStorageInfo\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceStorageInfo\",\n                        \"smithy.api#documentation\": \"<p>Describes the instance storage for the instance type.</p>\",\n                        \"smithy.api#xmlName\": \"instanceStorageInfo\"\n                    }\n                },\n                \"EbsInfo\": {\n                    \"target\": \"com.amazonaws.ec2#EbsInfo\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EbsInfo\",\n                        \"smithy.api#documentation\": \"<p>Describes the Amazon EBS settings for the instance type.</p>\",\n                        \"smithy.api#xmlName\": \"ebsInfo\"\n                    }\n                },\n                \"NetworkInfo\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInfo\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkInfo\",\n                        \"smithy.api#documentation\": \"<p>Describes the network settings for the instance type.</p>\",\n                        \"smithy.api#xmlName\": \"networkInfo\"\n                    }\n                },\n                \"GpuInfo\": {\n                    \"target\": \"com.amazonaws.ec2#GpuInfo\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"GpuInfo\",\n                        \"smithy.api#documentation\": \"<p>Describes the GPU accelerator settings for the instance type.</p>\",\n                        \"smithy.api#xmlName\": \"gpuInfo\"\n                    }\n                },\n                \"FpgaInfo\": {\n                    \"target\": \"com.amazonaws.ec2#FpgaInfo\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"FpgaInfo\",\n                        \"smithy.api#documentation\": \"<p>Describes the FPGA accelerator settings for the instance type.</p>\",\n                        \"smithy.api#xmlName\": \"fpgaInfo\"\n                    }\n                },\n                \"PlacementGroupInfo\": {\n                    \"target\": \"com.amazonaws.ec2#PlacementGroupInfo\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PlacementGroupInfo\",\n                        \"smithy.api#documentation\": \"<p>Describes the placement group settings for the instance type.</p>\",\n                        \"smithy.api#xmlName\": \"placementGroupInfo\"\n                    }\n                },\n                \"InferenceAcceleratorInfo\": {\n                    \"target\": \"com.amazonaws.ec2#InferenceAcceleratorInfo\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InferenceAcceleratorInfo\",\n                        \"smithy.api#documentation\": \"<p>Describes the Inference accelerator settings for the instance type.</p>\",\n                        \"smithy.api#xmlName\": \"inferenceAcceleratorInfo\"\n                    }\n                },\n                \"HibernationSupported\": {\n                    \"target\": \"com.amazonaws.ec2#HibernationFlag\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"HibernationSupported\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether On-Demand hibernation is supported.</p>\",\n                        \"smithy.api#xmlName\": \"hibernationSupported\"\n                    }\n                },\n                \"BurstablePerformanceSupported\": {\n                    \"target\": \"com.amazonaws.ec2#BurstablePerformanceFlag\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"BurstablePerformanceSupported\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether the instance type is a burstable performance T instance type. For more\\n   information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/burstable-performance-instances.html\\\">Burstable performance\\n    instances</a>.</p>\",\n                        \"smithy.api#xmlName\": \"burstablePerformanceSupported\"\n                    }\n                },\n                \"DedicatedHostsSupported\": {\n                    \"target\": \"com.amazonaws.ec2#DedicatedHostFlag\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DedicatedHostsSupported\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether Dedicated Hosts are supported on the instance type.</p>\",\n                        \"smithy.api#xmlName\": \"dedicatedHostsSupported\"\n                    }\n                },\n                \"AutoRecoverySupported\": {\n                    \"target\": \"com.amazonaws.ec2#AutoRecoveryFlag\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AutoRecoverySupported\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether Amazon CloudWatch action based recovery is supported.</p>\",\n                        \"smithy.api#xmlName\": \"autoRecoverySupported\"\n                    }\n                },\n                \"SupportedBootModes\": {\n                    \"target\": \"com.amazonaws.ec2#BootModeTypeList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SupportedBootModes\",\n                        \"smithy.api#documentation\": \"<p>The supported boot modes. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ami-boot.html\\\">Boot modes</a> in the <i>Amazon EC2 User\\n    Guide</i>.</p>\",\n                        \"smithy.api#xmlName\": \"supportedBootModes\"\n                    }\n                },\n                \"NitroEnclavesSupport\": {\n                    \"target\": \"com.amazonaws.ec2#NitroEnclavesSupport\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NitroEnclavesSupport\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether Nitro Enclaves is supported.</p>\",\n                        \"smithy.api#xmlName\": \"nitroEnclavesSupport\"\n                    }\n                },\n                \"NitroTpmSupport\": {\n                    \"target\": \"com.amazonaws.ec2#NitroTpmSupport\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NitroTpmSupport\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether NitroTPM is supported.</p>\",\n                        \"smithy.api#xmlName\": \"nitroTpmSupport\"\n                    }\n                },\n                \"NitroTpmInfo\": {\n                    \"target\": \"com.amazonaws.ec2#NitroTpmInfo\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NitroTpmInfo\",\n                        \"smithy.api#documentation\": \"<p>Describes the supported NitroTPM versions for the instance type.</p>\",\n                        \"smithy.api#xmlName\": \"nitroTpmInfo\"\n                    }\n                },\n                \"MediaAcceleratorInfo\": {\n                    \"target\": \"com.amazonaws.ec2#MediaAcceleratorInfo\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MediaAcceleratorInfo\",\n                        \"smithy.api#documentation\": \"<p>Describes the media accelerator settings for the instance type.</p>\",\n                        \"smithy.api#xmlName\": \"mediaAcceleratorInfo\"\n                    }\n                },\n                \"NeuronInfo\": {\n                    \"target\": \"com.amazonaws.ec2#NeuronInfo\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NeuronInfo\",\n                        \"smithy.api#documentation\": \"<p>Describes the Neuron accelerator settings for the instance type.</p>\",\n                        \"smithy.api#xmlName\": \"neuronInfo\"\n                    }\n                },\n                \"PhcSupport\": {\n                    \"target\": \"com.amazonaws.ec2#PhcSupport\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PhcSupport\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether a local Precision Time Protocol (PTP) hardware clock (PHC) is\\n   supported.</p>\",\n                        \"smithy.api#xmlName\": \"phcSupport\"\n                    }\n                },\n                \"RebootMigrationSupport\": {\n                    \"target\": \"com.amazonaws.ec2#RebootMigrationSupport\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RebootMigrationSupport\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether reboot migration during a user-initiated reboot is supported for\\n   instances that have a scheduled <code>system-reboot</code> event. For more information,\\n   see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/schedevents_actions_reboot.html#reboot-migration\\\">Enable or disable reboot migration</a> in the\\n   <i>Amazon EC2 User Guide</i>.</p>\",\n                        \"smithy.api#xmlName\": \"rebootMigrationSupport\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the instance type.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#InstanceTypeInfoFromInstanceRequirements\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceType\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceType\",\n                        \"smithy.api#documentation\": \"<p>The matching instance type.</p>\",\n                        \"smithy.api#xmlName\": \"instanceType\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The list of instance types with the specified instance attributes.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#InstanceTypeInfoFromInstanceRequirementsSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#InstanceTypeInfoFromInstanceRequirements\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#InstanceTypeInfoList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#InstanceTypeInfo\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#InstanceTypeList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#InstanceType\"\n            }\n        },\n        \"com.amazonaws.ec2#InstanceTypeOffering\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceType\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceType\",\n                        \"smithy.api#documentation\": \"<p>The instance type. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html\\\">Instance types</a> in the <i>Amazon EC2\\n    User Guide</i>.</p>\",\n                        \"smithy.api#xmlName\": \"instanceType\"\n                    }\n                },\n                \"LocationType\": {\n                    \"target\": \"com.amazonaws.ec2#LocationType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LocationType\",\n                        \"smithy.api#documentation\": \"<p>The location type.</p>\",\n                        \"smithy.api#xmlName\": \"locationType\"\n                    }\n                },\n                \"Location\": {\n                    \"target\": \"com.amazonaws.ec2#Location\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Location\",\n                        \"smithy.api#documentation\": \"<p>The identifier for the location. This depends on the location type. For example, if the\\n   location type is <code>region</code>, the location is the Region code (for example,\\n    <code>us-east-2</code>.)</p>\",\n                        \"smithy.api#xmlName\": \"location\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The instance types offered.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#InstanceTypeOfferingsList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#InstanceTypeOffering\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#InstanceTypes\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#String\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.ec2#InstanceTypesList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#String\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#InstanceUsage\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AccountId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Amazon Web Services account that is making use of the Capacity\\n\\t\\t\\tReservation.</p>\",\n                        \"smithy.api#xmlName\": \"accountId\"\n                    }\n                },\n                \"UsedInstanceCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"UsedInstanceCount\",\n                        \"smithy.api#documentation\": \"<p>The number of instances the Amazon Web Services account currently has in the Capacity\\n\\t\\t\\tReservation.</p>\",\n                        \"smithy.api#xmlName\": \"usedInstanceCount\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about the Capacity Reservation usage.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#InstanceUsageSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#InstanceUsage\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#Integer\": {\n            \"type\": \"integer\"\n        },\n        \"com.amazonaws.ec2#IntegerWithConstraints\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 0\n                }\n            }\n        },\n        \"com.amazonaws.ec2#IntegrateServices\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AthenaIntegrations\": {\n                    \"target\": \"com.amazonaws.ec2#AthenaIntegrationsSet\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Information about the integration with Amazon Athena.</p>\",\n                        \"smithy.api#xmlName\": \"AthenaIntegration\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes service integrations with VPC Flow logs.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#InterfacePermissionType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"INSTANCE_ATTACH\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"INSTANCE-ATTACH\"\n                    }\n                },\n                \"EIP_ASSOCIATE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"EIP-ASSOCIATE\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#InterfaceProtocolType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"VLAN\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"VLAN\"\n                    }\n                },\n                \"GRE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"GRE\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#InternetGateway\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Attachments\": {\n                    \"target\": \"com.amazonaws.ec2#InternetGatewayAttachmentList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AttachmentSet\",\n                        \"smithy.api#documentation\": \"<p>Any VPCs attached to the internet gateway.</p>\",\n                        \"smithy.api#xmlName\": \"attachmentSet\"\n                    }\n                },\n                \"InternetGatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InternetGatewayId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the internet gateway.</p>\",\n                        \"smithy.api#xmlName\": \"internetGatewayId\"\n                    }\n                },\n                \"OwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OwnerId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Amazon Web Services account that owns the internet gateway.</p>\",\n                        \"smithy.api#xmlName\": \"ownerId\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>Any tags assigned to the internet gateway.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes an internet gateway.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#InternetGatewayAttachment\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#AttachmentStatus\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The current state of the attachment. For an internet gateway, the state is\\n\\t\\t\\t\\t<code>available</code> when attached to a VPC; otherwise, this value is not\\n\\t\\t\\treturned.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                },\n                \"VpcId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the VPC.</p>\",\n                        \"smithy.api#xmlName\": \"vpcId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the attachment of a VPC to an internet gateway or an egress-only internet gateway.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#InternetGatewayAttachmentList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#InternetGatewayAttachment\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#InternetGatewayBlockMode\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"off\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"off\"\n                    }\n                },\n                \"block_bidirectional\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"block-bidirectional\"\n                    }\n                },\n                \"block_ingress\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"block-ingress\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#InternetGatewayExclusionMode\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"allow_bidirectional\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"allow-bidirectional\"\n                    }\n                },\n                \"allow_egress\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"allow-egress\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#InternetGatewayId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#InternetGatewayIdList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#InternetGatewayId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#InternetGatewayList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#InternetGateway\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#IpAddress\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 15\n                },\n                \"smithy.api#pattern\": \"^([0-9]{1,3}.){3}[0-9]{1,3}$\"\n            }\n        },\n        \"com.amazonaws.ec2#IpAddressList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#IpAddress\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#IpAddressType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ipv4\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ipv4\"\n                    }\n                },\n                \"dualstack\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"dualstack\"\n                    }\n                },\n                \"ipv6\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ipv6\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#IpList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#String\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#IpPermission\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"IpProtocol\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpProtocol\",\n                        \"smithy.api#documentation\": \"<p>The IP protocol name (<code>tcp</code>, <code>udp</code>, <code>icmp</code>, <code>icmpv6</code>) \\n        or number (see <a href=\\\"http://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml\\\">Protocol Numbers</a>).</p>\\n         <p>Use <code>-1</code> to specify all protocols. When authorizing\\n        security group rules, specifying <code>-1</code> or a protocol number other than\\n        <code>tcp</code>, <code>udp</code>, <code>icmp</code>, or <code>icmpv6</code> allows\\n        traffic on all ports, regardless of any port range you specify. For <code>tcp</code>,\\n        <code>udp</code>, and <code>icmp</code>, you must specify a port range. For <code>icmpv6</code>,\\n        the port range is optional; if you omit the port range, traffic for all types and codes is allowed.</p>\",\n                        \"smithy.api#xmlName\": \"ipProtocol\"\n                    }\n                },\n                \"FromPort\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"FromPort\",\n                        \"smithy.api#documentation\": \"<p>If the protocol is TCP or UDP, this is the start of the port range.\\n        If the protocol is ICMP or ICMPv6, this is the ICMP type or -1 (all ICMP types).</p>\",\n                        \"smithy.api#xmlName\": \"fromPort\"\n                    }\n                },\n                \"ToPort\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ToPort\",\n                        \"smithy.api#documentation\": \"<p>If the protocol is TCP or UDP, this is the end of the port range.\\n          If the protocol is ICMP or ICMPv6, this is the ICMP code or -1 (all ICMP codes). \\n          If the start port is -1 (all ICMP types), then the end port must be -1 (all ICMP codes).</p>\",\n                        \"smithy.api#xmlName\": \"toPort\"\n                    }\n                },\n                \"UserIdGroupPairs\": {\n                    \"target\": \"com.amazonaws.ec2#UserIdGroupPairList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Groups\",\n                        \"smithy.api#documentation\": \"<p>The security group and Amazon Web Services account ID pairs.</p>\",\n                        \"smithy.api#xmlName\": \"groups\"\n                    }\n                },\n                \"IpRanges\": {\n                    \"target\": \"com.amazonaws.ec2#IpRangeList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpRanges\",\n                        \"smithy.api#documentation\": \"<p>The IPv4 address ranges.</p>\",\n                        \"smithy.api#xmlName\": \"ipRanges\"\n                    }\n                },\n                \"Ipv6Ranges\": {\n                    \"target\": \"com.amazonaws.ec2#Ipv6RangeList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Ipv6Ranges\",\n                        \"smithy.api#documentation\": \"<p>The IPv6 address ranges.</p>\",\n                        \"smithy.api#xmlName\": \"ipv6Ranges\"\n                    }\n                },\n                \"PrefixListIds\": {\n                    \"target\": \"com.amazonaws.ec2#PrefixListIdList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PrefixListIds\",\n                        \"smithy.api#documentation\": \"<p>The prefix list IDs.</p>\",\n                        \"smithy.api#xmlName\": \"prefixListIds\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the permissions for a security group rule.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#IpPermissionList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#IpPermission\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#IpPrefixList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#String\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#IpRange\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Description\",\n                        \"smithy.api#documentation\": \"<p>A description for the security group rule that references this IPv4 address range.</p>\\n         <p>Constraints: Up to 255 characters in length. Allowed characters are a-z, A-Z, 0-9,\\n        spaces, and ._-:/()#,@[]+=&;{}!$*</p>\",\n                        \"smithy.api#xmlName\": \"description\"\n                    }\n                },\n                \"CidrIp\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CidrIp\",\n                        \"smithy.api#documentation\": \"<p>The IPv4 address range. You can either specify a CIDR block or a source security group,\\n            not both. To specify a single IPv4 address, use the /32 prefix length.</p>\\n         <note>\\n            <p>\\n              Amazon Web Services <a href=\\\"https://en.wikipedia.org/wiki/Canonicalization\\\">canonicalizes</a> IPv4 and IPv6 CIDRs. For example, if you specify 100.68.0.18/18 for the CIDR block, \\n              Amazon Web Services canonicalizes the CIDR block to 100.68.0.0/18. Any subsequent DescribeSecurityGroups and DescribeSecurityGroupRules calls will \\n              return the canonicalized form of the CIDR block. Additionally, if you attempt to add another rule with the \\n              non-canonical form of the CIDR (such as 100.68.0.18/18) and there is already a rule for the canonicalized \\n              form of the CIDR block (such as 100.68.0.0/18), the API throws an duplicate rule error.</p>\\n         </note>\",\n                        \"smithy.api#xmlName\": \"cidrIp\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes an IPv4 address range.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#IpRangeList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#IpRange\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#IpRanges\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#String\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#IpSource\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"amazon\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"amazon\"\n                    }\n                },\n                \"byoip\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"byoip\"\n                    }\n                },\n                \"none\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"none\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#Ipam\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"OwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OwnerId\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID of the owner of the IPAM.</p>\",\n                        \"smithy.api#xmlName\": \"ownerId\"\n                    }\n                },\n                \"IpamId\": {\n                    \"target\": \"com.amazonaws.ec2#IpamId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpamId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the IPAM.</p>\",\n                        \"smithy.api#xmlName\": \"ipamId\"\n                    }\n                },\n                \"IpamArn\": {\n                    \"target\": \"com.amazonaws.ec2#ResourceArn\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpamArn\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the IPAM.</p>\",\n                        \"smithy.api#xmlName\": \"ipamArn\"\n                    }\n                },\n                \"IpamRegion\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpamRegion\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services Region of the IPAM.</p>\",\n                        \"smithy.api#xmlName\": \"ipamRegion\"\n                    }\n                },\n                \"PublicDefaultScopeId\": {\n                    \"target\": \"com.amazonaws.ec2#IpamScopeId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PublicDefaultScopeId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the IPAM's default public scope.</p>\",\n                        \"smithy.api#xmlName\": \"publicDefaultScopeId\"\n                    }\n                },\n                \"PrivateDefaultScopeId\": {\n                    \"target\": \"com.amazonaws.ec2#IpamScopeId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PrivateDefaultScopeId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the IPAM's default private scope.</p>\",\n                        \"smithy.api#xmlName\": \"privateDefaultScopeId\"\n                    }\n                },\n                \"ScopeCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ScopeCount\",\n                        \"smithy.api#documentation\": \"<p>The number of scopes in the IPAM. The scope quota is 5. For more information on quotas, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/ipam/quotas-ipam.html\\\">Quotas in IPAM</a> in the <i>Amazon VPC IPAM User Guide</i>.\\n      </p>\",\n                        \"smithy.api#xmlName\": \"scopeCount\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Description\",\n                        \"smithy.api#documentation\": \"<p>The description for the IPAM.</p>\",\n                        \"smithy.api#xmlName\": \"description\"\n                    }\n                },\n                \"OperatingRegions\": {\n                    \"target\": \"com.amazonaws.ec2#IpamOperatingRegionSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OperatingRegionSet\",\n                        \"smithy.api#documentation\": \"<p>The operating Regions for an IPAM. Operating Regions are Amazon Web Services Regions where the IPAM is allowed to manage IP address CIDRs. IPAM only discovers and monitors resources in the Amazon Web Services Regions you select as operating Regions.</p>\\n         <p>For more information about operating Regions, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/ipam/create-ipam.html\\\">Create an IPAM</a> in the <i>Amazon VPC IPAM User Guide</i>.</p>\",\n                        \"smithy.api#xmlName\": \"operatingRegionSet\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#IpamState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The state of the IPAM.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\\n    For example, to find all resources that have a tag with the key <code>Owner</code> and the value <code>TeamA</code>, specify <code>tag:Owner</code> for the filter name and <code>TeamA</code> for the filter value.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                },\n                \"DefaultResourceDiscoveryId\": {\n                    \"target\": \"com.amazonaws.ec2#IpamResourceDiscoveryId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DefaultResourceDiscoveryId\",\n                        \"smithy.api#documentation\": \"<p>The IPAM's default resource discovery ID.</p>\",\n                        \"smithy.api#xmlName\": \"defaultResourceDiscoveryId\"\n                    }\n                },\n                \"DefaultResourceDiscoveryAssociationId\": {\n                    \"target\": \"com.amazonaws.ec2#IpamResourceDiscoveryAssociationId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DefaultResourceDiscoveryAssociationId\",\n                        \"smithy.api#documentation\": \"<p>The IPAM's default resource discovery association ID.</p>\",\n                        \"smithy.api#xmlName\": \"defaultResourceDiscoveryAssociationId\"\n                    }\n                },\n                \"ResourceDiscoveryAssociationCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResourceDiscoveryAssociationCount\",\n                        \"smithy.api#documentation\": \"<p>The IPAM's resource discovery association count.</p>\",\n                        \"smithy.api#xmlName\": \"resourceDiscoveryAssociationCount\"\n                    }\n                },\n                \"StateMessage\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"StateMessage\",\n                        \"smithy.api#documentation\": \"<p>The state message.</p>\",\n                        \"smithy.api#xmlName\": \"stateMessage\"\n                    }\n                },\n                \"Tier\": {\n                    \"target\": \"com.amazonaws.ec2#IpamTier\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Tier\",\n                        \"smithy.api#documentation\": \"<p>IPAM is offered in a Free Tier and an Advanced Tier. For more information about the features available in each tier and the costs associated with the tiers, see <a href=\\\"http://aws.amazon.com/vpc/pricing/\\\">Amazon VPC pricing > IPAM tab</a>.</p>\",\n                        \"smithy.api#xmlName\": \"tier\"\n                    }\n                },\n                \"EnablePrivateGua\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EnablePrivateGua\",\n                        \"smithy.api#documentation\": \"<p>Enable this option to use your own GUA ranges as private IPv6 addresses. This option is disabled by default.</p>\",\n                        \"smithy.api#xmlName\": \"enablePrivateGua\"\n                    }\n                },\n                \"MeteredAccount\": {\n                    \"target\": \"com.amazonaws.ec2#IpamMeteredAccount\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MeteredAccount\",\n                        \"smithy.api#documentation\": \"<p>A metered account is an Amazon Web Services account that is charged for active IP addresses managed in IPAM. For more information, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/ipam/ipam-enable-cost-distro.html\\\">Enable cost distribution</a> in the <i>Amazon VPC IPAM User Guide</i>.</p>\\n         <p>Possible values:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>ipam-owner</code> (default): The Amazon Web Services account which owns the IPAM is charged for all active IP addresses managed in IPAM.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>resource-owner</code>: The Amazon Web Services account that owns the IP address is charged for the active IP address.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"meteredAccount\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>IPAM is a VPC feature that you can use to automate your IP address management workflows including assigning, tracking, troubleshooting, and auditing IP addresses across Amazon Web Services Regions and accounts throughout your Amazon Web Services Organization. For more information, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/ipam/what-is-it-ipam.html\\\">What is IPAM?</a> in the <i>Amazon VPC IPAM User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#IpamAddressHistoryMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.ec2#IpamAddressHistoryRecord\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ResourceOwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResourceOwnerId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the resource owner.</p>\",\n                        \"smithy.api#xmlName\": \"resourceOwnerId\"\n                    }\n                },\n                \"ResourceRegion\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResourceRegion\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services Region of the resource.</p>\",\n                        \"smithy.api#xmlName\": \"resourceRegion\"\n                    }\n                },\n                \"ResourceType\": {\n                    \"target\": \"com.amazonaws.ec2#IpamAddressHistoryResourceType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResourceType\",\n                        \"smithy.api#documentation\": \"<p>The type of the resource.</p>\",\n                        \"smithy.api#xmlName\": \"resourceType\"\n                    }\n                },\n                \"ResourceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResourceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the resource.</p>\",\n                        \"smithy.api#xmlName\": \"resourceId\"\n                    }\n                },\n                \"ResourceCidr\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResourceCidr\",\n                        \"smithy.api#documentation\": \"<p>The CIDR of the resource.</p>\",\n                        \"smithy.api#xmlName\": \"resourceCidr\"\n                    }\n                },\n                \"ResourceName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResourceName\",\n                        \"smithy.api#documentation\": \"<p>The name of the resource.</p>\",\n                        \"smithy.api#xmlName\": \"resourceName\"\n                    }\n                },\n                \"ResourceComplianceStatus\": {\n                    \"target\": \"com.amazonaws.ec2#IpamComplianceStatus\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResourceComplianceStatus\",\n                        \"smithy.api#documentation\": \"<p>The compliance status of a resource. For more information on compliance statuses, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/ipam/monitor-cidr-compliance-ipam.html\\\">Monitor CIDR usage by resource</a> in the <i>Amazon VPC IPAM User Guide</i>.</p>\",\n                        \"smithy.api#xmlName\": \"resourceComplianceStatus\"\n                    }\n                },\n                \"ResourceOverlapStatus\": {\n                    \"target\": \"com.amazonaws.ec2#IpamOverlapStatus\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResourceOverlapStatus\",\n                        \"smithy.api#documentation\": \"<p>The overlap status of an IPAM resource. The overlap status tells you if the CIDR for a resource overlaps with another CIDR in the scope. For more information on overlap statuses, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/ipam/monitor-cidr-compliance-ipam.html\\\">Monitor CIDR usage by resource</a> in the <i>Amazon VPC IPAM User Guide</i>.</p>\",\n                        \"smithy.api#xmlName\": \"resourceOverlapStatus\"\n                    }\n                },\n                \"VpcId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcId\",\n                        \"smithy.api#documentation\": \"<p>The VPC ID of the resource.</p>\",\n                        \"smithy.api#xmlName\": \"vpcId\"\n                    }\n                },\n                \"SampledStartTime\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SampledStartTime\",\n                        \"smithy.api#documentation\": \"<p>Sampled start time of the resource-to-CIDR association within the IPAM scope. Changes are picked up in periodic snapshots, so the start time may have occurred before this specific time.</p>\",\n                        \"smithy.api#xmlName\": \"sampledStartTime\"\n                    }\n                },\n                \"SampledEndTime\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SampledEndTime\",\n                        \"smithy.api#documentation\": \"<p>Sampled end time of the resource-to-CIDR association within the IPAM scope. Changes are picked up in periodic snapshots, so the end time may have occurred before this specific time.</p>\",\n                        \"smithy.api#xmlName\": \"sampledEndTime\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The historical record of a CIDR within an IPAM scope. For more information, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/ipam/view-history-cidr-ipam.html\\\">View the history of IP addresses</a> in the <i>Amazon VPC IPAM User Guide</i>.\\n      </p>\"\n            }\n        },\n        \"com.amazonaws.ec2#IpamAddressHistoryRecordSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#IpamAddressHistoryRecord\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#IpamAddressHistoryResourceType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"eip\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"eip\"\n                    }\n                },\n                \"vpc\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"vpc\"\n                    }\n                },\n                \"subnet\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"subnet\"\n                    }\n                },\n                \"network_interface\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"network-interface\"\n                    }\n                },\n                \"instance\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"instance\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#IpamAssociatedResourceDiscoveryStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ACTIVE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"active\"\n                    }\n                },\n                \"NOT_FOUND\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"not-found\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#IpamCidrAuthorizationContext\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Message\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The plain-text authorization message for the prefix and account.</p>\"\n                    }\n                },\n                \"Signature\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The signed authorization message for the prefix and account.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A signed document that proves that you are authorized to bring the specified IP address range to Amazon using BYOIP.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#IpamComplianceStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"compliant\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"compliant\"\n                    }\n                },\n                \"noncompliant\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"noncompliant\"\n                    }\n                },\n                \"unmanaged\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"unmanaged\"\n                    }\n                },\n                \"ignored\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ignored\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#IpamDiscoveredAccount\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AccountId\",\n                        \"smithy.api#documentation\": \"<p>The account ID.</p>\",\n                        \"smithy.api#xmlName\": \"accountId\"\n                    }\n                },\n                \"DiscoveryRegion\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DiscoveryRegion\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services Region that the account information is returned from. \\n         An account can be discovered in multiple regions and will have a separate discovered account for each Region.</p>\",\n                        \"smithy.api#xmlName\": \"discoveryRegion\"\n                    }\n                },\n                \"FailureReason\": {\n                    \"target\": \"com.amazonaws.ec2#IpamDiscoveryFailureReason\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"FailureReason\",\n                        \"smithy.api#documentation\": \"<p>The resource discovery failure reason.</p>\",\n                        \"smithy.api#xmlName\": \"failureReason\"\n                    }\n                },\n                \"LastAttemptedDiscoveryTime\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LastAttemptedDiscoveryTime\",\n                        \"smithy.api#documentation\": \"<p>The last attempted resource discovery time.</p>\",\n                        \"smithy.api#xmlName\": \"lastAttemptedDiscoveryTime\"\n                    }\n                },\n                \"LastSuccessfulDiscoveryTime\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LastSuccessfulDiscoveryTime\",\n                        \"smithy.api#documentation\": \"<p>The last successful resource discovery time.</p>\",\n                        \"smithy.api#xmlName\": \"lastSuccessfulDiscoveryTime\"\n                    }\n                },\n                \"OrganizationalUnitId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OrganizationalUnitId\",\n                        \"smithy.api#documentation\": \"<p>The ID of an Organizational Unit in Amazon Web Services Organizations.</p>\",\n                        \"smithy.api#xmlName\": \"organizationalUnitId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>An IPAM discovered account. A discovered account is an Amazon Web Services account that is monitored under a resource discovery. If you have integrated IPAM with Amazon Web Services Organizations, all accounts in the organization are discovered accounts.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#IpamDiscoveredAccountSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#IpamDiscoveredAccount\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#IpamDiscoveredPublicAddress\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"IpamResourceDiscoveryId\": {\n                    \"target\": \"com.amazonaws.ec2#IpamResourceDiscoveryId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpamResourceDiscoveryId\",\n                        \"smithy.api#documentation\": \"<p>The resource discovery ID.</p>\",\n                        \"smithy.api#xmlName\": \"ipamResourceDiscoveryId\"\n                    }\n                },\n                \"AddressRegion\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AddressRegion\",\n                        \"smithy.api#documentation\": \"<p>The Region of the resource the IP address is assigned to.</p>\",\n                        \"smithy.api#xmlName\": \"addressRegion\"\n                    }\n                },\n                \"Address\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Address\",\n                        \"smithy.api#documentation\": \"<p>The IP address.</p>\",\n                        \"smithy.api#xmlName\": \"address\"\n                    }\n                },\n                \"AddressOwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AddressOwnerId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the owner of the resource the IP address is assigned to.</p>\",\n                        \"smithy.api#xmlName\": \"addressOwnerId\"\n                    }\n                },\n                \"AddressAllocationId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AddressAllocationId\",\n                        \"smithy.api#documentation\": \"<p>The allocation ID of the resource the IP address is assigned to.</p>\",\n                        \"smithy.api#xmlName\": \"addressAllocationId\"\n                    }\n                },\n                \"AssociationStatus\": {\n                    \"target\": \"com.amazonaws.ec2#IpamPublicAddressAssociationStatus\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AssociationStatus\",\n                        \"smithy.api#documentation\": \"<p>The association status.</p>\",\n                        \"smithy.api#xmlName\": \"associationStatus\"\n                    }\n                },\n                \"AddressType\": {\n                    \"target\": \"com.amazonaws.ec2#IpamPublicAddressType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AddressType\",\n                        \"smithy.api#documentation\": \"<p>The IP address type.</p>\",\n                        \"smithy.api#xmlName\": \"addressType\"\n                    }\n                },\n                \"Service\": {\n                    \"target\": \"com.amazonaws.ec2#IpamPublicAddressAwsService\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Service\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services service associated with the IP address.</p>\",\n                        \"smithy.api#xmlName\": \"service\"\n                    }\n                },\n                \"ServiceResource\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ServiceResource\",\n                        \"smithy.api#documentation\": \"<p>The resource ARN or ID.</p>\",\n                        \"smithy.api#xmlName\": \"serviceResource\"\n                    }\n                },\n                \"VpcId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the VPC that the resource with the assigned IP address is in.</p>\",\n                        \"smithy.api#xmlName\": \"vpcId\"\n                    }\n                },\n                \"SubnetId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SubnetId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the subnet that the resource with the assigned IP address is in.</p>\",\n                        \"smithy.api#xmlName\": \"subnetId\"\n                    }\n                },\n                \"PublicIpv4PoolId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PublicIpv4PoolId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the public IPv4 pool that the resource with the assigned IP address is from.</p>\",\n                        \"smithy.api#xmlName\": \"publicIpv4PoolId\"\n                    }\n                },\n                \"NetworkInterfaceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkInterfaceId\",\n                        \"smithy.api#documentation\": \"<p>The network interface ID of the resource with the assigned IP address.</p>\",\n                        \"smithy.api#xmlName\": \"networkInterfaceId\"\n                    }\n                },\n                \"NetworkInterfaceDescription\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkInterfaceDescription\",\n                        \"smithy.api#documentation\": \"<p>The description of the network interface that IP address is assigned to.</p>\",\n                        \"smithy.api#xmlName\": \"networkInterfaceDescription\"\n                    }\n                },\n                \"InstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceId\",\n                        \"smithy.api#documentation\": \"<p>The instance ID of the instance the assigned IP address is assigned to.</p>\",\n                        \"smithy.api#xmlName\": \"instanceId\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#IpamPublicAddressTags\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Tags\",\n                        \"smithy.api#documentation\": \"<p>Tags associated with the IP address.</p>\",\n                        \"smithy.api#xmlName\": \"tags\"\n                    }\n                },\n                \"NetworkBorderGroup\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkBorderGroup\",\n                        \"smithy.api#documentation\": \"<p>The Availability Zone (AZ) or Local Zone (LZ) network border group that the resource that the IP address is assigned to is in. Defaults to an AZ network border group. For more information on available Local Zones, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-byoip.html#byoip-zone-avail\\\">Local Zone availability</a> in the <i>Amazon EC2 User Guide</i>.</p>\",\n                        \"smithy.api#xmlName\": \"networkBorderGroup\"\n                    }\n                },\n                \"SecurityGroups\": {\n                    \"target\": \"com.amazonaws.ec2#IpamPublicAddressSecurityGroupList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SecurityGroupSet\",\n                        \"smithy.api#documentation\": \"<p>Security groups associated with the resource that the IP address is assigned to.</p>\",\n                        \"smithy.api#xmlName\": \"securityGroupSet\"\n                    }\n                },\n                \"SampleTime\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SampleTime\",\n                        \"smithy.api#documentation\": \"<p>The last successful resource discovery time.</p>\",\n                        \"smithy.api#xmlName\": \"sampleTime\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A public IP Address discovered by IPAM.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#IpamDiscoveredPublicAddressSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#IpamDiscoveredPublicAddress\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#IpamDiscoveredResourceCidr\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"IpamResourceDiscoveryId\": {\n                    \"target\": \"com.amazonaws.ec2#IpamResourceDiscoveryId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpamResourceDiscoveryId\",\n                        \"smithy.api#documentation\": \"<p>The resource discovery ID.</p>\",\n                        \"smithy.api#xmlName\": \"ipamResourceDiscoveryId\"\n                    }\n                },\n                \"ResourceRegion\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResourceRegion\",\n                        \"smithy.api#documentation\": \"<p>The resource Region.</p>\",\n                        \"smithy.api#xmlName\": \"resourceRegion\"\n                    }\n                },\n                \"ResourceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResourceId\",\n                        \"smithy.api#documentation\": \"<p>The resource ID.</p>\",\n                        \"smithy.api#xmlName\": \"resourceId\"\n                    }\n                },\n                \"ResourceOwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResourceOwnerId\",\n                        \"smithy.api#documentation\": \"<p>The resource owner ID.</p>\",\n                        \"smithy.api#xmlName\": \"resourceOwnerId\"\n                    }\n                },\n                \"ResourceCidr\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResourceCidr\",\n                        \"smithy.api#documentation\": \"<p>The resource CIDR.</p>\",\n                        \"smithy.api#xmlName\": \"resourceCidr\"\n                    }\n                },\n                \"IpSource\": {\n                    \"target\": \"com.amazonaws.ec2#IpamResourceCidrIpSource\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpSource\",\n                        \"smithy.api#documentation\": \"<p>The source that allocated the IP address space. <code>byoip</code> or <code>amazon</code> indicates public IP address space allocated by Amazon or space that you have allocated with Bring your own IP (BYOIP). <code>none</code> indicates private space.</p>\",\n                        \"smithy.api#xmlName\": \"ipSource\"\n                    }\n                },\n                \"ResourceType\": {\n                    \"target\": \"com.amazonaws.ec2#IpamResourceType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResourceType\",\n                        \"smithy.api#documentation\": \"<p>The resource type.</p>\",\n                        \"smithy.api#xmlName\": \"resourceType\"\n                    }\n                },\n                \"ResourceTags\": {\n                    \"target\": \"com.amazonaws.ec2#IpamResourceTagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResourceTagSet\",\n                        \"smithy.api#documentation\": \"<p>The resource tags.</p>\",\n                        \"smithy.api#xmlName\": \"resourceTagSet\"\n                    }\n                },\n                \"IpUsage\": {\n                    \"target\": \"com.amazonaws.ec2#BoxedDouble\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpUsage\",\n                        \"smithy.api#documentation\": \"<p>The percentage of IP address space in use. To convert the decimal to a percentage, multiply the decimal by 100. Note the following:</p>\\n         <ul>\\n            <li>\\n               <p>For resources that are VPCs, this is the percentage of IP address space in the VPC that's taken up by subnet CIDRs.\\n         </p>\\n            </li>\\n            <li>\\n               <p>For resources that are subnets, if the subnet has an IPv4 CIDR provisioned to it, this is the percentage of IPv4 address space in the subnet that's in use. If the subnet has an IPv6 CIDR provisioned to it, the percentage of IPv6 address space in use is not represented. The percentage of IPv6 address space in use cannot currently be calculated.\\n         </p>\\n            </li>\\n            <li>\\n               <p>For resources that are public IPv4 pools, this is the percentage of IP address space in the pool that's been allocated to Elastic IP addresses (EIPs).\\n         </p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"ipUsage\"\n                    }\n                },\n                \"VpcId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcId\",\n                        \"smithy.api#documentation\": \"<p>The VPC ID.</p>\",\n                        \"smithy.api#xmlName\": \"vpcId\"\n                    }\n                },\n                \"SubnetId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SubnetId\",\n                        \"smithy.api#documentation\": \"<p>The subnet ID.</p>\",\n                        \"smithy.api#xmlName\": \"subnetId\"\n                    }\n                },\n                \"NetworkInterfaceAttachmentStatus\": {\n                    \"target\": \"com.amazonaws.ec2#IpamNetworkInterfaceAttachmentStatus\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkInterfaceAttachmentStatus\",\n                        \"smithy.api#documentation\": \"<p>For elastic network interfaces, this is the status of whether or not the elastic network interface is attached.</p>\",\n                        \"smithy.api#xmlName\": \"networkInterfaceAttachmentStatus\"\n                    }\n                },\n                \"SampleTime\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SampleTime\",\n                        \"smithy.api#documentation\": \"<p>The last successful resource discovery time.</p>\",\n                        \"smithy.api#xmlName\": \"sampleTime\"\n                    }\n                },\n                \"AvailabilityZoneId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AvailabilityZoneId\",\n                        \"smithy.api#documentation\": \"<p>The Availability Zone ID.</p>\",\n                        \"smithy.api#xmlName\": \"availabilityZoneId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>An IPAM discovered resource CIDR. A discovered resource is a resource CIDR monitored under a resource discovery. The following resources can be discovered: VPCs, Public IPv4 pools, VPC subnets, and Elastic IP addresses. The discovered resource CIDR is the IP address range in CIDR notation that is associated with the resource.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#IpamDiscoveredResourceCidrSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#IpamDiscoveredResourceCidr\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#IpamDiscoveryFailureCode\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"assume_role_failure\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"assume-role-failure\"\n                    }\n                },\n                \"throttling_failure\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"throttling-failure\"\n                    }\n                },\n                \"unauthorized_failure\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"unauthorized-failure\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#IpamDiscoveryFailureReason\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Code\": {\n                    \"target\": \"com.amazonaws.ec2#IpamDiscoveryFailureCode\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Code\",\n                        \"smithy.api#documentation\": \"<p>The discovery failure code.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>assume-role-failure</code> - IPAM could not assume the Amazon Web Services IAM service-linked role. This could be because of any of the following:</p>\\n               <ul>\\n                  <li>\\n                     <p>SLR has not been created yet and IPAM is still creating it.</p>\\n                  </li>\\n                  <li>\\n                     <p>You have opted-out of the IPAM home Region.</p>\\n                  </li>\\n                  <li>\\n                     <p>Account you are using as your IPAM account has been suspended.</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>throttling-failure</code> - IPAM account is already using the allotted transactions per second and IPAM is receiving a throttling error when assuming the Amazon Web Services IAM SLR.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>unauthorized-failure</code> - Amazon Web Services account making the request is not authorized. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/errors-overview.html\\\">AuthFailure</a> in the <i>Amazon Elastic Compute Cloud API Reference</i>.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"code\"\n                    }\n                },\n                \"Message\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Message\",\n                        \"smithy.api#documentation\": \"<p>The discovery failure message.</p>\",\n                        \"smithy.api#xmlName\": \"message\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The discovery failure reason.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#IpamExternalResourceVerificationToken\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"IpamExternalResourceVerificationTokenId\": {\n                    \"target\": \"com.amazonaws.ec2#IpamExternalResourceVerificationTokenId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpamExternalResourceVerificationTokenId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the token.</p>\",\n                        \"smithy.api#xmlName\": \"ipamExternalResourceVerificationTokenId\"\n                    }\n                },\n                \"IpamExternalResourceVerificationTokenArn\": {\n                    \"target\": \"com.amazonaws.ec2#ResourceArn\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpamExternalResourceVerificationTokenArn\",\n                        \"smithy.api#documentation\": \"<p>Token ARN.</p>\",\n                        \"smithy.api#xmlName\": \"ipamExternalResourceVerificationTokenArn\"\n                    }\n                },\n                \"IpamId\": {\n                    \"target\": \"com.amazonaws.ec2#IpamId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpamId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the IPAM that created the token.</p>\",\n                        \"smithy.api#xmlName\": \"ipamId\"\n                    }\n                },\n                \"IpamArn\": {\n                    \"target\": \"com.amazonaws.ec2#ResourceArn\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpamArn\",\n                        \"smithy.api#documentation\": \"<p>ARN of the IPAM that created the token.</p>\",\n                        \"smithy.api#xmlName\": \"ipamArn\"\n                    }\n                },\n                \"IpamRegion\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpamRegion\",\n                        \"smithy.api#documentation\": \"<p>Region of the IPAM that created the token.</p>\",\n                        \"smithy.api#xmlName\": \"ipamRegion\"\n                    }\n                },\n                \"TokenValue\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TokenValue\",\n                        \"smithy.api#documentation\": \"<p>Token value.</p>\",\n                        \"smithy.api#xmlName\": \"tokenValue\"\n                    }\n                },\n                \"TokenName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TokenName\",\n                        \"smithy.api#documentation\": \"<p>Token name.</p>\",\n                        \"smithy.api#xmlName\": \"tokenName\"\n                    }\n                },\n                \"NotAfter\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NotAfter\",\n                        \"smithy.api#documentation\": \"<p>Token expiration.</p>\",\n                        \"smithy.api#xmlName\": \"notAfter\"\n                    }\n                },\n                \"Status\": {\n                    \"target\": \"com.amazonaws.ec2#TokenState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Status\",\n                        \"smithy.api#documentation\": \"<p>Token status.</p>\",\n                        \"smithy.api#xmlName\": \"status\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>Token tags.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#IpamExternalResourceVerificationTokenState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>Token state.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A verification token is an Amazon Web Services-generated random value that you can use to prove ownership of an external resource. For example, you can use a verification token to validate that you control a public IP address range when you bring an IP address range to Amazon Web Services (BYOIP).\\n</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#IpamExternalResourceVerificationTokenId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#IpamExternalResourceVerificationTokenSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#IpamExternalResourceVerificationToken\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#IpamExternalResourceVerificationTokenState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"CREATE_IN_PROGRESS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"create-in-progress\"\n                    }\n                },\n                \"CREATE_COMPLETE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"create-complete\"\n                    }\n                },\n                \"CREATE_FAILED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"create-failed\"\n                    }\n                },\n                \"DELETE_IN_PROGRESS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"delete-in-progress\"\n                    }\n                },\n                \"DELETE_COMPLETE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"delete-complete\"\n                    }\n                },\n                \"DELETE_FAILED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"delete-failed\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#IpamId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#IpamManagementState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"managed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"managed\"\n                    }\n                },\n                \"unmanaged\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"unmanaged\"\n                    }\n                },\n                \"ignored\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ignored\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#IpamMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 5,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.ec2#IpamMeteredAccount\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ipam_owner\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ipam-owner\"\n                    }\n                },\n                \"resource_owner\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"resource-owner\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#IpamNetmaskLength\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 0,\n                    \"max\": 128\n                }\n            }\n        },\n        \"com.amazonaws.ec2#IpamNetworkInterfaceAttachmentStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"available\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"available\"\n                    }\n                },\n                \"in_use\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"in-use\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#IpamOperatingRegion\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RegionName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RegionName\",\n                        \"smithy.api#documentation\": \"<p>The name of the operating Region.</p>\",\n                        \"smithy.api#xmlName\": \"regionName\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The operating Regions for an IPAM. Operating Regions are Amazon Web Services Regions where the IPAM is allowed to manage IP address CIDRs. IPAM only discovers and monitors resources in the Amazon Web Services Regions you select as operating Regions.</p>\\n         <p>For more information about operating Regions, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/ipam/create-ipam.html\\\">Create an IPAM</a> in the <i>Amazon VPC IPAM User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#IpamOperatingRegionSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#IpamOperatingRegion\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#IpamOrganizationalUnitExclusion\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"OrganizationsEntityPath\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OrganizationsEntityPath\",\n                        \"smithy.api#documentation\": \"<p>An Amazon Web Services Organizations entity path. For more information on the entity path, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_last-accessed-view-data-orgs.html#access_policies_access-advisor-viewing-orgs-entity-path\\\">Understand the Amazon Web Services Organizations entity path</a> in the <i>Amazon Web Services Identity and Access Management User Guide</i>.</p>\",\n                        \"smithy.api#xmlName\": \"organizationsEntityPath\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>If your IPAM is integrated with Amazon Web Services Organizations and you add an organizational unit (OU) exclusion, IPAM will not manage the IP addresses in accounts in that OU exclusion.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#IpamOrganizationalUnitExclusionSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#IpamOrganizationalUnitExclusion\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#IpamOverlapStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"overlapping\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"overlapping\"\n                    }\n                },\n                \"nonoverlapping\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"nonoverlapping\"\n                    }\n                },\n                \"ignored\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ignored\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#IpamPool\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"OwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OwnerId\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID of the owner of the IPAM pool.</p>\",\n                        \"smithy.api#xmlName\": \"ownerId\"\n                    }\n                },\n                \"IpamPoolId\": {\n                    \"target\": \"com.amazonaws.ec2#IpamPoolId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpamPoolId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the IPAM pool.</p>\",\n                        \"smithy.api#xmlName\": \"ipamPoolId\"\n                    }\n                },\n                \"SourceIpamPoolId\": {\n                    \"target\": \"com.amazonaws.ec2#IpamPoolId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SourceIpamPoolId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the source IPAM pool. You can use this option to create an IPAM pool within an existing source pool.</p>\",\n                        \"smithy.api#xmlName\": \"sourceIpamPoolId\"\n                    }\n                },\n                \"IpamPoolArn\": {\n                    \"target\": \"com.amazonaws.ec2#ResourceArn\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpamPoolArn\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the IPAM pool.</p>\",\n                        \"smithy.api#xmlName\": \"ipamPoolArn\"\n                    }\n                },\n                \"IpamScopeArn\": {\n                    \"target\": \"com.amazonaws.ec2#ResourceArn\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpamScopeArn\",\n                        \"smithy.api#documentation\": \"<p>The ARN of the scope of the IPAM pool.</p>\",\n                        \"smithy.api#xmlName\": \"ipamScopeArn\"\n                    }\n                },\n                \"IpamScopeType\": {\n                    \"target\": \"com.amazonaws.ec2#IpamScopeType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpamScopeType\",\n                        \"smithy.api#documentation\": \"<p>In IPAM, a scope is the highest-level container within IPAM. An IPAM contains two default scopes. Each scope represents the IP space for a single network. The private scope is intended for all private IP address space. The public scope is intended for all public IP address space. Scopes enable you to reuse IP addresses across multiple unconnected networks without causing IP address overlap or conflict.</p>\",\n                        \"smithy.api#xmlName\": \"ipamScopeType\"\n                    }\n                },\n                \"IpamArn\": {\n                    \"target\": \"com.amazonaws.ec2#ResourceArn\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpamArn\",\n                        \"smithy.api#documentation\": \"<p>The ARN of the IPAM.</p>\",\n                        \"smithy.api#xmlName\": \"ipamArn\"\n                    }\n                },\n                \"IpamRegion\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpamRegion\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services Region of the IPAM pool.</p>\",\n                        \"smithy.api#xmlName\": \"ipamRegion\"\n                    }\n                },\n                \"Locale\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Locale\",\n                        \"smithy.api#documentation\": \"<p>The locale of the IPAM pool.</p>\\n         <p>The locale for the pool should be one of the following:</p>\\n         <ul>\\n            <li>\\n               <p>An Amazon Web Services Region where you want this IPAM pool to be available for allocations.</p>\\n            </li>\\n            <li>\\n               <p>The network border group for an Amazon Web Services Local Zone where you want this IPAM pool to be available for allocations (<a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-byoip.html#byoip-zone-avail\\\">supported Local Zones</a>). This option is only available for IPAM IPv4 pools in the public scope.</p>\\n            </li>\\n         </ul>\\n         <p>If you choose an Amazon Web Services Region for locale that has not been configured as an operating Region for the IPAM, you'll get an error.</p>\",\n                        \"smithy.api#xmlName\": \"locale\"\n                    }\n                },\n                \"PoolDepth\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PoolDepth\",\n                        \"smithy.api#documentation\": \"<p>The depth of pools in your IPAM pool. The pool depth quota is 10. For more information, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/ipam/quotas-ipam.html\\\">Quotas in IPAM</a> in the <i>Amazon VPC IPAM User Guide</i>.\\n      </p>\",\n                        \"smithy.api#xmlName\": \"poolDepth\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#IpamPoolState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The state of the IPAM pool.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                },\n                \"StateMessage\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"StateMessage\",\n                        \"smithy.api#documentation\": \"<p>The state message.</p>\",\n                        \"smithy.api#xmlName\": \"stateMessage\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Description\",\n                        \"smithy.api#documentation\": \"<p>The description of the IPAM pool.</p>\",\n                        \"smithy.api#xmlName\": \"description\"\n                    }\n                },\n                \"AutoImport\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AutoImport\",\n                        \"smithy.api#documentation\": \"<p>If selected, IPAM will continuously look for resources within the CIDR range of this pool \\n         and automatically import them as allocations into your IPAM. The CIDRs that will be allocated for\\n         these resources must not already be allocated to other resources in order for the import to succeed. IPAM will import \\n         a CIDR regardless of its compliance with the pool's allocation rules, so a resource might be imported and subsequently \\n         marked as noncompliant. If IPAM discovers multiple CIDRs that overlap, IPAM will import the largest CIDR only. If IPAM \\n         discovers multiple CIDRs with matching CIDRs, IPAM will randomly import one of them only.\\n      </p>\\n         <p>A locale must be set on the pool for this feature to work.</p>\",\n                        \"smithy.api#xmlName\": \"autoImport\"\n                    }\n                },\n                \"PubliclyAdvertisable\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PubliclyAdvertisable\",\n                        \"smithy.api#documentation\": \"<p>Determines if a pool is publicly advertisable. This option is not available for pools with AddressFamily set to <code>ipv4</code>.</p>\",\n                        \"smithy.api#xmlName\": \"publiclyAdvertisable\"\n                    }\n                },\n                \"AddressFamily\": {\n                    \"target\": \"com.amazonaws.ec2#AddressFamily\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AddressFamily\",\n                        \"smithy.api#documentation\": \"<p>The address family of the pool.</p>\",\n                        \"smithy.api#xmlName\": \"addressFamily\"\n                    }\n                },\n                \"AllocationMinNetmaskLength\": {\n                    \"target\": \"com.amazonaws.ec2#IpamNetmaskLength\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AllocationMinNetmaskLength\",\n                        \"smithy.api#documentation\": \"<p>The minimum netmask length required for CIDR allocations in this IPAM pool to be compliant. The minimum netmask length must be less than the maximum netmask length. Possible netmask lengths for IPv4 addresses are 0 - 32. Possible netmask lengths for IPv6 addresses are  0 - 128.</p>\",\n                        \"smithy.api#xmlName\": \"allocationMinNetmaskLength\"\n                    }\n                },\n                \"AllocationMaxNetmaskLength\": {\n                    \"target\": \"com.amazonaws.ec2#IpamNetmaskLength\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AllocationMaxNetmaskLength\",\n                        \"smithy.api#documentation\": \"<p>The maximum netmask length possible for CIDR allocations in this IPAM pool to be compliant. The maximum netmask length must be greater than the minimum netmask length. Possible netmask lengths for IPv4 addresses are 0 - 32. Possible netmask lengths for IPv6 addresses are  0 - 128.</p>\",\n                        \"smithy.api#xmlName\": \"allocationMaxNetmaskLength\"\n                    }\n                },\n                \"AllocationDefaultNetmaskLength\": {\n                    \"target\": \"com.amazonaws.ec2#IpamNetmaskLength\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AllocationDefaultNetmaskLength\",\n                        \"smithy.api#documentation\": \"<p>The default netmask length for allocations added to this pool. If, for example, the CIDR assigned to this pool is 10.0.0.0/8 and \\n         you enter 16 here, new allocations will default to 10.0.0.0/16.</p>\",\n                        \"smithy.api#xmlName\": \"allocationDefaultNetmaskLength\"\n                    }\n                },\n                \"AllocationResourceTags\": {\n                    \"target\": \"com.amazonaws.ec2#IpamResourceTagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AllocationResourceTagSet\",\n                        \"smithy.api#documentation\": \"<p>Tags that are required for resources that use CIDRs from this IPAM pool. Resources that do not have these tags will not be allowed to allocate space from the pool. If the resources have their tags changed after they have allocated space or if the allocation tagging requirements are changed on the pool, the resource may be marked as noncompliant.</p>\",\n                        \"smithy.api#xmlName\": \"allocationResourceTagSet\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\\n    For example, to find all resources that have a tag with the key <code>Owner</code> and the value <code>TeamA</code>, specify <code>tag:Owner</code> for the filter name and <code>TeamA</code> for the filter value.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                },\n                \"AwsService\": {\n                    \"target\": \"com.amazonaws.ec2#IpamPoolAwsService\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AwsService\",\n                        \"smithy.api#documentation\": \"<p>Limits which service in Amazon Web Services that the pool can be used in. \\\"ec2\\\", for example, allows users to use space for Elastic IP addresses and VPCs.</p>\",\n                        \"smithy.api#xmlName\": \"awsService\"\n                    }\n                },\n                \"PublicIpSource\": {\n                    \"target\": \"com.amazonaws.ec2#IpamPoolPublicIpSource\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PublicIpSource\",\n                        \"smithy.api#documentation\": \"<p>The IP address source for pools in the public scope. Only used for provisioning IP address CIDRs to pools in the public scope. Default is <code>BYOIP</code>. For more information, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/ipam/intro-create-ipv6-pools.html\\\">Create IPv6 pools</a> in the <i>Amazon VPC IPAM User Guide</i>. \\n         By default, you can add only one Amazon-provided IPv6 CIDR block to a top-level IPv6 pool. For information on increasing the default limit, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/ipam/quotas-ipam.html\\\">Quotas for your IPAM</a> in the <i>Amazon VPC IPAM User Guide</i>.</p>\",\n                        \"smithy.api#xmlName\": \"publicIpSource\"\n                    }\n                },\n                \"SourceResource\": {\n                    \"target\": \"com.amazonaws.ec2#IpamPoolSourceResource\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SourceResource\",\n                        \"smithy.api#documentation\": \"<p>The resource used to provision CIDRs to a resource planning pool.</p>\",\n                        \"smithy.api#xmlName\": \"sourceResource\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>In IPAM, a pool is a collection of contiguous IP addresses CIDRs. Pools enable you to organize your IP addresses according to your routing and security needs. For example, if you have separate routing and security needs for development and production applications, you can create a pool for each.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#IpamPoolAllocation\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Cidr\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Cidr\",\n                        \"smithy.api#documentation\": \"<p>The CIDR for the allocation. A CIDR is a representation of an IP address and its associated network mask (or netmask) and \\n         refers to a range of IP addresses. An IPv4 CIDR example is <code>10.24.34.0/23</code>. An IPv6 CIDR example is <code>2001:DB8::/32</code>.</p>\",\n                        \"smithy.api#xmlName\": \"cidr\"\n                    }\n                },\n                \"IpamPoolAllocationId\": {\n                    \"target\": \"com.amazonaws.ec2#IpamPoolAllocationId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpamPoolAllocationId\",\n                        \"smithy.api#documentation\": \"<p>The ID of an allocation.</p>\",\n                        \"smithy.api#xmlName\": \"ipamPoolAllocationId\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Description\",\n                        \"smithy.api#documentation\": \"<p>A description of the pool allocation.</p>\",\n                        \"smithy.api#xmlName\": \"description\"\n                    }\n                },\n                \"ResourceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResourceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the resource.</p>\",\n                        \"smithy.api#xmlName\": \"resourceId\"\n                    }\n                },\n                \"ResourceType\": {\n                    \"target\": \"com.amazonaws.ec2#IpamPoolAllocationResourceType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResourceType\",\n                        \"smithy.api#documentation\": \"<p>The type of the resource.</p>\",\n                        \"smithy.api#xmlName\": \"resourceType\"\n                    }\n                },\n                \"ResourceRegion\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResourceRegion\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services Region of the resource.</p>\",\n                        \"smithy.api#xmlName\": \"resourceRegion\"\n                    }\n                },\n                \"ResourceOwner\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResourceOwner\",\n                        \"smithy.api#documentation\": \"<p>The owner of the resource.</p>\",\n                        \"smithy.api#xmlName\": \"resourceOwner\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>In IPAM, an allocation is a CIDR assignment from an IPAM pool to another IPAM pool or to a resource.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#IpamPoolAllocationAllowedCidrs\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#String\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#IpamPoolAllocationDisallowedCidrs\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#String\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#IpamPoolAllocationId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#IpamPoolAllocationResourceType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ipam_pool\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ipam-pool\"\n                    }\n                },\n                \"vpc\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"vpc\"\n                    }\n                },\n                \"ec2_public_ipv4_pool\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ec2-public-ipv4-pool\"\n                    }\n                },\n                \"custom\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"custom\"\n                    }\n                },\n                \"subnet\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"subnet\"\n                    }\n                },\n                \"eip\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"eip\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#IpamPoolAllocationSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#IpamPoolAllocation\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#IpamPoolAwsService\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ec2\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ec2\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#IpamPoolCidr\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Cidr\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Cidr\",\n                        \"smithy.api#documentation\": \"<p>The CIDR provisioned to the IPAM pool. A CIDR is a representation of an IP address and its associated network mask (or netmask) \\n         and refers to a range of IP addresses. An IPv4 CIDR example is <code>10.24.34.0/23</code>. An IPv6 CIDR example is <code>2001:DB8::/32</code>.</p>\",\n                        \"smithy.api#xmlName\": \"cidr\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#IpamPoolCidrState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The state of the CIDR.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                },\n                \"FailureReason\": {\n                    \"target\": \"com.amazonaws.ec2#IpamPoolCidrFailureReason\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"FailureReason\",\n                        \"smithy.api#documentation\": \"<p>Details related to why an IPAM pool CIDR failed to be provisioned.</p>\",\n                        \"smithy.api#xmlName\": \"failureReason\"\n                    }\n                },\n                \"IpamPoolCidrId\": {\n                    \"target\": \"com.amazonaws.ec2#IpamPoolCidrId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpamPoolCidrId\",\n                        \"smithy.api#documentation\": \"<p>The IPAM pool CIDR ID.</p>\",\n                        \"smithy.api#xmlName\": \"ipamPoolCidrId\"\n                    }\n                },\n                \"NetmaskLength\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetmaskLength\",\n                        \"smithy.api#documentation\": \"<p>The netmask length of the CIDR you'd like to provision to a pool. Can be used for provisioning Amazon-provided IPv6 CIDRs to top-level pools and for provisioning CIDRs to pools with source pools. Cannot be used to provision BYOIP CIDRs to top-level pools. \\\"NetmaskLength\\\" or \\\"Cidr\\\" is required.</p>\",\n                        \"smithy.api#xmlName\": \"netmaskLength\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A CIDR provisioned to an IPAM pool.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#IpamPoolCidrFailureCode\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"cidr_not_available\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"cidr-not-available\"\n                    }\n                },\n                \"limit_exceeded\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"limit-exceeded\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#IpamPoolCidrFailureReason\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Code\": {\n                    \"target\": \"com.amazonaws.ec2#IpamPoolCidrFailureCode\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Code\",\n                        \"smithy.api#documentation\": \"<p>An error code related to why an IPAM pool CIDR failed to be provisioned.</p>\",\n                        \"smithy.api#xmlName\": \"code\"\n                    }\n                },\n                \"Message\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Message\",\n                        \"smithy.api#documentation\": \"<p>A message related to why an IPAM pool CIDR failed to be provisioned.</p>\",\n                        \"smithy.api#xmlName\": \"message\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Details related to why an IPAM pool CIDR failed to be provisioned.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#IpamPoolCidrId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#IpamPoolCidrSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#IpamPoolCidr\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#IpamPoolCidrState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"pending_provision\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"pending-provision\"\n                    }\n                },\n                \"provisioned\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"provisioned\"\n                    }\n                },\n                \"failed_provision\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"failed-provision\"\n                    }\n                },\n                \"pending_deprovision\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"pending-deprovision\"\n                    }\n                },\n                \"deprovisioned\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"deprovisioned\"\n                    }\n                },\n                \"failed_deprovision\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"failed-deprovision\"\n                    }\n                },\n                \"pending_import\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"pending-import\"\n                    }\n                },\n                \"failed_import\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"failed-import\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#IpamPoolId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#IpamPoolPublicIpSource\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"amazon\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"amazon\"\n                    }\n                },\n                \"byoip\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"byoip\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#IpamPoolSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#IpamPool\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#IpamPoolSourceResource\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ResourceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResourceId\",\n                        \"smithy.api#documentation\": \"<p>The source resource ID.</p>\",\n                        \"smithy.api#xmlName\": \"resourceId\"\n                    }\n                },\n                \"ResourceType\": {\n                    \"target\": \"com.amazonaws.ec2#IpamPoolSourceResourceType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResourceType\",\n                        \"smithy.api#documentation\": \"<p>The source resource type.</p>\",\n                        \"smithy.api#xmlName\": \"resourceType\"\n                    }\n                },\n                \"ResourceRegion\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResourceRegion\",\n                        \"smithy.api#documentation\": \"<p>The source resource Region.</p>\",\n                        \"smithy.api#xmlName\": \"resourceRegion\"\n                    }\n                },\n                \"ResourceOwner\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResourceOwner\",\n                        \"smithy.api#documentation\": \"<p>The source resource owner.</p>\",\n                        \"smithy.api#xmlName\": \"resourceOwner\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The resource used to provision CIDRs to a resource planning pool.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#IpamPoolSourceResourceRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ResourceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The source resource ID.</p>\"\n                    }\n                },\n                \"ResourceType\": {\n                    \"target\": \"com.amazonaws.ec2#IpamPoolSourceResourceType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The source resource type.</p>\"\n                    }\n                },\n                \"ResourceRegion\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The source resource Region.</p>\"\n                    }\n                },\n                \"ResourceOwner\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The source resource owner.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The resource used to provision CIDRs to a resource planning pool.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#IpamPoolSourceResourceType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"vpc\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"vpc\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#IpamPoolState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"create_in_progress\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"create-in-progress\"\n                    }\n                },\n                \"create_complete\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"create-complete\"\n                    }\n                },\n                \"create_failed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"create-failed\"\n                    }\n                },\n                \"modify_in_progress\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"modify-in-progress\"\n                    }\n                },\n                \"modify_complete\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"modify-complete\"\n                    }\n                },\n                \"modify_failed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"modify-failed\"\n                    }\n                },\n                \"delete_in_progress\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"delete-in-progress\"\n                    }\n                },\n                \"delete_complete\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"delete-complete\"\n                    }\n                },\n                \"delete_failed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"delete-failed\"\n                    }\n                },\n                \"isolate_in_progress\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"isolate-in-progress\"\n                    }\n                },\n                \"isolate_complete\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"isolate-complete\"\n                    }\n                },\n                \"restore_in_progress\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"restore-in-progress\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#IpamPublicAddressAssociationStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ASSOCIATED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"associated\"\n                    }\n                },\n                \"DISASSOCIATED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"disassociated\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#IpamPublicAddressAwsService\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"NAT_GATEWAY\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"nat-gateway\"\n                    }\n                },\n                \"DMS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"database-migration-service\"\n                    }\n                },\n                \"REDSHIFT\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"redshift\"\n                    }\n                },\n                \"ECS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"elastic-container-service\"\n                    }\n                },\n                \"RDS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"relational-database-service\"\n                    }\n                },\n                \"S2S_VPN\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"site-to-site-vpn\"\n                    }\n                },\n                \"EC2_LB\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"load-balancer\"\n                    }\n                },\n                \"AGA\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"global-accelerator\"\n                    }\n                },\n                \"OTHER\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"other\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#IpamPublicAddressSecurityGroup\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"GroupName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"GroupName\",\n                        \"smithy.api#documentation\": \"<p>The security group's name.</p>\",\n                        \"smithy.api#xmlName\": \"groupName\"\n                    }\n                },\n                \"GroupId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"GroupId\",\n                        \"smithy.api#documentation\": \"<p>The security group's ID.</p>\",\n                        \"smithy.api#xmlName\": \"groupId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The security group that the resource with the public IP address is in.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#IpamPublicAddressSecurityGroupList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#IpamPublicAddressSecurityGroup\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#IpamPublicAddressTag\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Key\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Key\",\n                        \"smithy.api#documentation\": \"<p>The tag's key.</p>\",\n                        \"smithy.api#xmlName\": \"key\"\n                    }\n                },\n                \"Value\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Value\",\n                        \"smithy.api#documentation\": \"<p>The tag's value.</p>\",\n                        \"smithy.api#xmlName\": \"value\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A tag for a public IP address discovered by IPAM.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#IpamPublicAddressTagList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#IpamPublicAddressTag\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#IpamPublicAddressTags\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"EipTags\": {\n                    \"target\": \"com.amazonaws.ec2#IpamPublicAddressTagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EipTagSet\",\n                        \"smithy.api#documentation\": \"<p>Tags for an Elastic IP address.</p>\",\n                        \"smithy.api#xmlName\": \"eipTagSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Tags for a public IP address discovered by IPAM.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#IpamPublicAddressType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"SERVICE_MANAGED_IP\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"service-managed-ip\"\n                    }\n                },\n                \"SERVICE_MANAGED_BYOIP\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"service-managed-byoip\"\n                    }\n                },\n                \"AMAZON_OWNED_EIP\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"amazon-owned-eip\"\n                    }\n                },\n                \"AMAZON_OWNED_CONTIG\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"amazon-owned-contig\"\n                    }\n                },\n                \"BYOIP\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"byoip\"\n                    }\n                },\n                \"EC2_PUBLIC_IP\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ec2-public-ip\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#IpamResourceCidr\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"IpamId\": {\n                    \"target\": \"com.amazonaws.ec2#IpamId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpamId\",\n                        \"smithy.api#documentation\": \"<p>The IPAM ID for an IPAM resource.</p>\",\n                        \"smithy.api#xmlName\": \"ipamId\"\n                    }\n                },\n                \"IpamScopeId\": {\n                    \"target\": \"com.amazonaws.ec2#IpamScopeId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpamScopeId\",\n                        \"smithy.api#documentation\": \"<p>The scope ID for an IPAM resource.</p>\",\n                        \"smithy.api#xmlName\": \"ipamScopeId\"\n                    }\n                },\n                \"IpamPoolId\": {\n                    \"target\": \"com.amazonaws.ec2#IpamPoolId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpamPoolId\",\n                        \"smithy.api#documentation\": \"<p>The pool ID for an IPAM resource.</p>\",\n                        \"smithy.api#xmlName\": \"ipamPoolId\"\n                    }\n                },\n                \"ResourceRegion\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResourceRegion\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services Region for an IPAM resource.</p>\",\n                        \"smithy.api#xmlName\": \"resourceRegion\"\n                    }\n                },\n                \"ResourceOwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResourceOwnerId\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account number of the owner of an IPAM resource.</p>\",\n                        \"smithy.api#xmlName\": \"resourceOwnerId\"\n                    }\n                },\n                \"ResourceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResourceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of an IPAM resource.</p>\",\n                        \"smithy.api#xmlName\": \"resourceId\"\n                    }\n                },\n                \"ResourceName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResourceName\",\n                        \"smithy.api#documentation\": \"<p>The name of an IPAM resource.</p>\",\n                        \"smithy.api#xmlName\": \"resourceName\"\n                    }\n                },\n                \"ResourceCidr\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResourceCidr\",\n                        \"smithy.api#documentation\": \"<p>The CIDR for an IPAM resource.</p>\",\n                        \"smithy.api#xmlName\": \"resourceCidr\"\n                    }\n                },\n                \"ResourceType\": {\n                    \"target\": \"com.amazonaws.ec2#IpamResourceType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResourceType\",\n                        \"smithy.api#documentation\": \"<p>The type of IPAM resource.</p>\",\n                        \"smithy.api#xmlName\": \"resourceType\"\n                    }\n                },\n                \"ResourceTags\": {\n                    \"target\": \"com.amazonaws.ec2#IpamResourceTagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResourceTagSet\",\n                        \"smithy.api#documentation\": \"<p>The tags for an IPAM resource.</p>\",\n                        \"smithy.api#xmlName\": \"resourceTagSet\"\n                    }\n                },\n                \"IpUsage\": {\n                    \"target\": \"com.amazonaws.ec2#BoxedDouble\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpUsage\",\n                        \"smithy.api#documentation\": \"<p>The percentage of IP address space in use. To convert the decimal to a percentage, multiply the decimal by 100. Note the following:</p>\\n         <ul>\\n            <li>\\n               <p>For resources that are VPCs, this is the percentage of IP address space in the VPC that's taken up by subnet CIDRs.\\n         </p>\\n            </li>\\n            <li>\\n               <p>For resources that are subnets, if the subnet has an IPv4 CIDR provisioned to it, this is the percentage of IPv4 address space in the subnet that's in use. If the subnet has an IPv6 CIDR provisioned to it, the percentage of IPv6 address space in use is not represented. The percentage of IPv6 address space in use cannot currently be calculated.\\n         </p>\\n            </li>\\n            <li>\\n               <p>For resources that are public IPv4 pools, this is the percentage of IP address space in the pool that's been allocated to Elastic IP addresses (EIPs).\\n         </p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"ipUsage\"\n                    }\n                },\n                \"ComplianceStatus\": {\n                    \"target\": \"com.amazonaws.ec2#IpamComplianceStatus\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ComplianceStatus\",\n                        \"smithy.api#documentation\": \"<p>The compliance status of the IPAM resource. For more information on compliance statuses, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/ipam/monitor-cidr-compliance-ipam.html\\\">Monitor CIDR usage by resource</a> in the <i>Amazon VPC IPAM User Guide</i>.</p>\",\n                        \"smithy.api#xmlName\": \"complianceStatus\"\n                    }\n                },\n                \"ManagementState\": {\n                    \"target\": \"com.amazonaws.ec2#IpamManagementState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ManagementState\",\n                        \"smithy.api#documentation\": \"<p>The management state of the resource. For more information about management states, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/ipam/monitor-cidr-compliance-ipam.html\\\">Monitor CIDR usage by resource</a> in the <i>Amazon VPC IPAM User Guide</i>.</p>\",\n                        \"smithy.api#xmlName\": \"managementState\"\n                    }\n                },\n                \"OverlapStatus\": {\n                    \"target\": \"com.amazonaws.ec2#IpamOverlapStatus\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OverlapStatus\",\n                        \"smithy.api#documentation\": \"<p>The overlap status of an IPAM resource. The overlap status tells you if the CIDR for a resource overlaps with another CIDR in the scope. For more information on overlap statuses, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/ipam/monitor-cidr-compliance-ipam.html\\\">Monitor CIDR usage by resource</a> in the <i>Amazon VPC IPAM User Guide</i>.</p>\",\n                        \"smithy.api#xmlName\": \"overlapStatus\"\n                    }\n                },\n                \"VpcId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcId\",\n                        \"smithy.api#documentation\": \"<p>The ID of a VPC.</p>\",\n                        \"smithy.api#xmlName\": \"vpcId\"\n                    }\n                },\n                \"AvailabilityZoneId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AvailabilityZoneId\",\n                        \"smithy.api#documentation\": \"<p>The Availability Zone ID.</p>\",\n                        \"smithy.api#xmlName\": \"availabilityZoneId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The CIDR for an IPAM resource.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#IpamResourceCidrIpSource\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"amazon\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"amazon\"\n                    }\n                },\n                \"byoip\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"byoip\"\n                    }\n                },\n                \"none\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"none\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#IpamResourceCidrSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#IpamResourceCidr\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#IpamResourceDiscovery\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"OwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OwnerId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the owner.</p>\",\n                        \"smithy.api#xmlName\": \"ownerId\"\n                    }\n                },\n                \"IpamResourceDiscoveryId\": {\n                    \"target\": \"com.amazonaws.ec2#IpamResourceDiscoveryId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpamResourceDiscoveryId\",\n                        \"smithy.api#documentation\": \"<p>The resource discovery ID.</p>\",\n                        \"smithy.api#xmlName\": \"ipamResourceDiscoveryId\"\n                    }\n                },\n                \"IpamResourceDiscoveryArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpamResourceDiscoveryArn\",\n                        \"smithy.api#documentation\": \"<p>The resource discovery Amazon Resource Name (ARN).</p>\",\n                        \"smithy.api#xmlName\": \"ipamResourceDiscoveryArn\"\n                    }\n                },\n                \"IpamResourceDiscoveryRegion\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpamResourceDiscoveryRegion\",\n                        \"smithy.api#documentation\": \"<p>The resource discovery Region.</p>\",\n                        \"smithy.api#xmlName\": \"ipamResourceDiscoveryRegion\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Description\",\n                        \"smithy.api#documentation\": \"<p>The resource discovery description.</p>\",\n                        \"smithy.api#xmlName\": \"description\"\n                    }\n                },\n                \"OperatingRegions\": {\n                    \"target\": \"com.amazonaws.ec2#IpamOperatingRegionSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OperatingRegionSet\",\n                        \"smithy.api#documentation\": \"<p>The operating Regions for the resource discovery. Operating Regions are Amazon Web Services Regions where the IPAM is allowed to manage IP address CIDRs. IPAM only discovers and monitors resources in the Amazon Web Services Regions you select as operating Regions.</p>\",\n                        \"smithy.api#xmlName\": \"operatingRegionSet\"\n                    }\n                },\n                \"IsDefault\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IsDefault\",\n                        \"smithy.api#documentation\": \"<p>Defines if the resource discovery is the default. The default resource discovery is the resource discovery automatically created when you create an IPAM.</p>\",\n                        \"smithy.api#xmlName\": \"isDefault\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#IpamResourceDiscoveryState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The lifecycle state of the resource discovery.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>create-in-progress</code> - Resource discovery is being created.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>create-complete</code> - Resource discovery creation is complete.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>create-failed</code> - Resource discovery creation has failed.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>modify-in-progress</code> - Resource discovery is being modified.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>modify-complete</code> - Resource discovery modification is complete.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>modify-failed</code> - Resource discovery modification has failed.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>delete-in-progress</code> - Resource discovery is being deleted.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>delete-complete</code> - Resource discovery deletion is complete.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>delete-failed</code> - Resource discovery deletion has failed.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>isolate-in-progress</code> - Amazon Web Services account that created the resource discovery has been removed and the resource discovery is being isolated.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>isolate-complete</code> - Resource discovery isolation is complete.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>restore-in-progress</code> - Amazon Web Services account that created the resource discovery and was isolated has been restored.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>A tag is a label that you assign to an Amazon Web Services resource. Each tag consists of a key and an optional value. You can use tags to search and filter your resources or track your Amazon Web Services costs.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                },\n                \"OrganizationalUnitExclusions\": {\n                    \"target\": \"com.amazonaws.ec2#IpamOrganizationalUnitExclusionSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OrganizationalUnitExclusionSet\",\n                        \"smithy.api#documentation\": \"<p>If your IPAM is integrated with Amazon Web Services Organizations and you add an organizational unit (OU) exclusion, IPAM will not manage the IP addresses in accounts in that OU exclusion.</p>\",\n                        \"smithy.api#xmlName\": \"organizationalUnitExclusionSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A resource discovery is an IPAM component that enables IPAM to manage and monitor resources that belong to the owning account.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#IpamResourceDiscoveryAssociation\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"OwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OwnerId\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID of the resource discovery owner.</p>\",\n                        \"smithy.api#xmlName\": \"ownerId\"\n                    }\n                },\n                \"IpamResourceDiscoveryAssociationId\": {\n                    \"target\": \"com.amazonaws.ec2#IpamResourceDiscoveryAssociationId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpamResourceDiscoveryAssociationId\",\n                        \"smithy.api#documentation\": \"<p>The resource discovery association ID.</p>\",\n                        \"smithy.api#xmlName\": \"ipamResourceDiscoveryAssociationId\"\n                    }\n                },\n                \"IpamResourceDiscoveryAssociationArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpamResourceDiscoveryAssociationArn\",\n                        \"smithy.api#documentation\": \"<p>The resource discovery association Amazon Resource Name (ARN).</p>\",\n                        \"smithy.api#xmlName\": \"ipamResourceDiscoveryAssociationArn\"\n                    }\n                },\n                \"IpamResourceDiscoveryId\": {\n                    \"target\": \"com.amazonaws.ec2#IpamResourceDiscoveryId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpamResourceDiscoveryId\",\n                        \"smithy.api#documentation\": \"<p>The resource discovery ID.</p>\",\n                        \"smithy.api#xmlName\": \"ipamResourceDiscoveryId\"\n                    }\n                },\n                \"IpamId\": {\n                    \"target\": \"com.amazonaws.ec2#IpamId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpamId\",\n                        \"smithy.api#documentation\": \"<p>The IPAM ID.</p>\",\n                        \"smithy.api#xmlName\": \"ipamId\"\n                    }\n                },\n                \"IpamArn\": {\n                    \"target\": \"com.amazonaws.ec2#ResourceArn\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpamArn\",\n                        \"smithy.api#documentation\": \"<p>The IPAM ARN.</p>\",\n                        \"smithy.api#xmlName\": \"ipamArn\"\n                    }\n                },\n                \"IpamRegion\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpamRegion\",\n                        \"smithy.api#documentation\": \"<p>The IPAM home Region.</p>\",\n                        \"smithy.api#xmlName\": \"ipamRegion\"\n                    }\n                },\n                \"IsDefault\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IsDefault\",\n                        \"smithy.api#documentation\": \"<p>Defines if the resource discovery is the default. When you create an IPAM, a default resource discovery is created for your IPAM and it's associated with your IPAM.</p>\",\n                        \"smithy.api#xmlName\": \"isDefault\"\n                    }\n                },\n                \"ResourceDiscoveryStatus\": {\n                    \"target\": \"com.amazonaws.ec2#IpamAssociatedResourceDiscoveryStatus\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResourceDiscoveryStatus\",\n                        \"smithy.api#documentation\": \"<p>The resource discovery status.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>active</code> - Connection or permissions required to read the\\n               results of the resource discovery are intact.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>not-found</code> - Connection or permissions required to read the\\n               results of the resource discovery are broken. This may happen if the owner of the resource discovery stopped sharing it or deleted the resource discovery. Verify the resource discovery still exists and the Amazon Web Services RAM resource share is still intact.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"resourceDiscoveryStatus\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#IpamResourceDiscoveryAssociationState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The lifecycle state of the association when you associate or disassociate a resource discovery.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>associate-in-progress</code> - Resource discovery is being associated.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>associate-complete</code> - Resource discovery association is complete.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>associate-failed</code> - Resource discovery association has failed.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>disassociate-in-progress</code> - Resource discovery is being disassociated.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>disassociate-complete</code> - Resource discovery disassociation is complete.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>disassociate-failed </code> - Resource discovery disassociation has failed.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>isolate-in-progress</code> - Amazon Web Services account that created the resource discovery association has been removed and the resource discovery associatation is being isolated.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>isolate-complete</code> - Resource discovery isolation is complete..</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>restore-in-progress</code> - Resource discovery is being restored.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>A tag is a label that you assign to an Amazon Web Services resource. Each tag consists of a key and an optional value. You can use tags to search and filter your resources or track your Amazon Web Services costs.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>An IPAM resource discovery association. An associated resource discovery is a resource discovery that has been associated with an IPAM. IPAM aggregates the resource CIDRs discovered by the associated resource discovery.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#IpamResourceDiscoveryAssociationId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#IpamResourceDiscoveryAssociationSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#IpamResourceDiscoveryAssociation\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#IpamResourceDiscoveryAssociationState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ASSOCIATE_IN_PROGRESS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"associate-in-progress\"\n                    }\n                },\n                \"ASSOCIATE_COMPLETE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"associate-complete\"\n                    }\n                },\n                \"ASSOCIATE_FAILED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"associate-failed\"\n                    }\n                },\n                \"DISASSOCIATE_IN_PROGRESS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"disassociate-in-progress\"\n                    }\n                },\n                \"DISASSOCIATE_COMPLETE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"disassociate-complete\"\n                    }\n                },\n                \"DISASSOCIATE_FAILED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"disassociate-failed\"\n                    }\n                },\n                \"ISOLATE_IN_PROGRESS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"isolate-in-progress\"\n                    }\n                },\n                \"ISOLATE_COMPLETE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"isolate-complete\"\n                    }\n                },\n                \"RESTORE_IN_PROGRESS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"restore-in-progress\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#IpamResourceDiscoveryId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#IpamResourceDiscoverySet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#IpamResourceDiscovery\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#IpamResourceDiscoveryState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"CREATE_IN_PROGRESS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"create-in-progress\"\n                    }\n                },\n                \"CREATE_COMPLETE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"create-complete\"\n                    }\n                },\n                \"CREATE_FAILED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"create-failed\"\n                    }\n                },\n                \"MODIFY_IN_PROGRESS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"modify-in-progress\"\n                    }\n                },\n                \"MODIFY_COMPLETE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"modify-complete\"\n                    }\n                },\n                \"MODIFY_FAILED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"modify-failed\"\n                    }\n                },\n                \"DELETE_IN_PROGRESS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"delete-in-progress\"\n                    }\n                },\n                \"DELETE_COMPLETE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"delete-complete\"\n                    }\n                },\n                \"DELETE_FAILED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"delete-failed\"\n                    }\n                },\n                \"ISOLATE_IN_PROGRESS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"isolate-in-progress\"\n                    }\n                },\n                \"ISOLATE_COMPLETE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"isolate-complete\"\n                    }\n                },\n                \"RESTORE_IN_PROGRESS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"restore-in-progress\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#IpamResourceTag\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Key\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Key\",\n                        \"smithy.api#documentation\": \"<p>The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.</p>\",\n                        \"smithy.api#xmlName\": \"key\"\n                    }\n                },\n                \"Value\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Value\",\n                        \"smithy.api#documentation\": \"<p>The value of the tag.</p>\",\n                        \"smithy.api#xmlName\": \"value\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\\n    For example, to find all resources that have a tag with the key <code>Owner</code> and the value <code>TeamA</code>, specify <code>tag:Owner</code> for the filter name and <code>TeamA</code> for the filter value.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#IpamResourceTagList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#IpamResourceTag\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#IpamResourceType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"vpc\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"vpc\"\n                    }\n                },\n                \"subnet\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"subnet\"\n                    }\n                },\n                \"eip\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"eip\"\n                    }\n                },\n                \"public_ipv4_pool\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"public-ipv4-pool\"\n                    }\n                },\n                \"ipv6_pool\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ipv6-pool\"\n                    }\n                },\n                \"eni\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"eni\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#IpamScope\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"OwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OwnerId\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID of the owner of the scope.</p>\",\n                        \"smithy.api#xmlName\": \"ownerId\"\n                    }\n                },\n                \"IpamScopeId\": {\n                    \"target\": \"com.amazonaws.ec2#IpamScopeId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpamScopeId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the scope.</p>\",\n                        \"smithy.api#xmlName\": \"ipamScopeId\"\n                    }\n                },\n                \"IpamScopeArn\": {\n                    \"target\": \"com.amazonaws.ec2#ResourceArn\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpamScopeArn\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the scope.</p>\",\n                        \"smithy.api#xmlName\": \"ipamScopeArn\"\n                    }\n                },\n                \"IpamArn\": {\n                    \"target\": \"com.amazonaws.ec2#ResourceArn\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpamArn\",\n                        \"smithy.api#documentation\": \"<p>The ARN of the IPAM.</p>\",\n                        \"smithy.api#xmlName\": \"ipamArn\"\n                    }\n                },\n                \"IpamRegion\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpamRegion\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services Region of the IPAM scope.</p>\",\n                        \"smithy.api#xmlName\": \"ipamRegion\"\n                    }\n                },\n                \"IpamScopeType\": {\n                    \"target\": \"com.amazonaws.ec2#IpamScopeType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpamScopeType\",\n                        \"smithy.api#documentation\": \"<p>The type of the scope.</p>\",\n                        \"smithy.api#xmlName\": \"ipamScopeType\"\n                    }\n                },\n                \"IsDefault\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IsDefault\",\n                        \"smithy.api#documentation\": \"<p>Defines if the scope is the default scope or not.</p>\",\n                        \"smithy.api#xmlName\": \"isDefault\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Description\",\n                        \"smithy.api#documentation\": \"<p>The description of the scope.</p>\",\n                        \"smithy.api#xmlName\": \"description\"\n                    }\n                },\n                \"PoolCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PoolCount\",\n                        \"smithy.api#documentation\": \"<p>The number of pools in the scope.</p>\",\n                        \"smithy.api#xmlName\": \"poolCount\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#IpamScopeState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The state of the IPAM scope.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\\n    For example, to find all resources that have a tag with the key <code>Owner</code> and the value <code>TeamA</code>, specify <code>tag:Owner</code> for the filter name and <code>TeamA</code> for the filter value.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>In IPAM, a scope is the highest-level container within IPAM. An IPAM contains two default scopes. Each scope represents the IP space for a single network. The private scope is intended for all private IP address space. The public scope is intended for all public IP address space. Scopes enable you to reuse IP addresses across multiple unconnected networks without causing IP address overlap or conflict.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/ipam/how-it-works-ipam.html\\\">How IPAM works</a> in the <i>Amazon VPC IPAM User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#IpamScopeId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#IpamScopeSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#IpamScope\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#IpamScopeState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"create_in_progress\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"create-in-progress\"\n                    }\n                },\n                \"create_complete\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"create-complete\"\n                    }\n                },\n                \"create_failed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"create-failed\"\n                    }\n                },\n                \"modify_in_progress\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"modify-in-progress\"\n                    }\n                },\n                \"modify_complete\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"modify-complete\"\n                    }\n                },\n                \"modify_failed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"modify-failed\"\n                    }\n                },\n                \"delete_in_progress\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"delete-in-progress\"\n                    }\n                },\n                \"delete_complete\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"delete-complete\"\n                    }\n                },\n                \"delete_failed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"delete-failed\"\n                    }\n                },\n                \"isolate_in_progress\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"isolate-in-progress\"\n                    }\n                },\n                \"isolate_complete\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"isolate-complete\"\n                    }\n                },\n                \"restore_in_progress\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"restore-in-progress\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#IpamScopeType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"public\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"public\"\n                    }\n                },\n                \"private\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"private\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#IpamSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#Ipam\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#IpamState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"create_in_progress\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"create-in-progress\"\n                    }\n                },\n                \"create_complete\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"create-complete\"\n                    }\n                },\n                \"create_failed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"create-failed\"\n                    }\n                },\n                \"modify_in_progress\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"modify-in-progress\"\n                    }\n                },\n                \"modify_complete\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"modify-complete\"\n                    }\n                },\n                \"modify_failed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"modify-failed\"\n                    }\n                },\n                \"delete_in_progress\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"delete-in-progress\"\n                    }\n                },\n                \"delete_complete\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"delete-complete\"\n                    }\n                },\n                \"delete_failed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"delete-failed\"\n                    }\n                },\n                \"isolate_in_progress\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"isolate-in-progress\"\n                    }\n                },\n                \"isolate_complete\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"isolate-complete\"\n                    }\n                },\n                \"restore_in_progress\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"restore-in-progress\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#IpamTier\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"free\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"free\"\n                    }\n                },\n                \"advanced\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"advanced\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#Ipv4PoolCoipId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#Ipv4PoolEc2Id\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#Ipv4PrefixList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#Ipv4PrefixSpecificationRequest\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#Ipv4PrefixListResponse\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#Ipv4PrefixSpecificationResponse\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#Ipv4PrefixSpecification\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Ipv4Prefix\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Ipv4Prefix\",\n                        \"smithy.api#documentation\": \"<p>The IPv4 prefix. For information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-prefix-eni.html\\\">\\n            Assigning prefixes to network interfaces</a> in the\\n                <i>Amazon EC2 User Guide</i>.</p>\",\n                        \"smithy.api#xmlName\": \"ipv4Prefix\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes an IPv4 prefix.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#Ipv4PrefixSpecificationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Ipv4Prefix\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IPv4 prefix. For information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-prefix-eni.html\\\">\\n            Assigning prefixes to network interfaces</a> in the\\n                <i>Amazon EC2 User Guide</i>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the IPv4 prefix option for a network interface.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#Ipv4PrefixSpecificationResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Ipv4Prefix\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Ipv4Prefix\",\n                        \"smithy.api#documentation\": \"<p>The IPv4 delegated prefixes assigned to the network interface.</p>\",\n                        \"smithy.api#xmlName\": \"ipv4Prefix\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about the IPv4 delegated prefixes assigned to a network interface.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#Ipv4PrefixesList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#Ipv4PrefixSpecification\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#Ipv6Address\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#Ipv6AddressAttribute\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"public\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"public\"\n                    }\n                },\n                \"private\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"private\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#Ipv6AddressList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#String\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#Ipv6CidrAssociation\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Ipv6Cidr\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Ipv6Cidr\",\n                        \"smithy.api#documentation\": \"<p>The IPv6 CIDR block.</p>\",\n                        \"smithy.api#xmlName\": \"ipv6Cidr\"\n                    }\n                },\n                \"AssociatedResource\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AssociatedResource\",\n                        \"smithy.api#documentation\": \"<p>The resource that's associated with the IPv6 CIDR block.</p>\",\n                        \"smithy.api#xmlName\": \"associatedResource\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes an IPv6 CIDR block association.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#Ipv6CidrAssociationSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#Ipv6CidrAssociation\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#Ipv6CidrBlock\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Ipv6CidrBlock\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Ipv6CidrBlock\",\n                        \"smithy.api#documentation\": \"<p>The IPv6 CIDR block.</p>\",\n                        \"smithy.api#xmlName\": \"ipv6CidrBlock\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes an IPv6 CIDR block.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#Ipv6CidrBlockSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#Ipv6CidrBlock\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#Ipv6Flag\": {\n            \"type\": \"boolean\"\n        },\n        \"com.amazonaws.ec2#Ipv6Pool\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PoolId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PoolId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the address pool.</p>\",\n                        \"smithy.api#xmlName\": \"poolId\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Description\",\n                        \"smithy.api#documentation\": \"<p>The description for the address pool.</p>\",\n                        \"smithy.api#xmlName\": \"description\"\n                    }\n                },\n                \"PoolCidrBlocks\": {\n                    \"target\": \"com.amazonaws.ec2#PoolCidrBlocksSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PoolCidrBlockSet\",\n                        \"smithy.api#documentation\": \"<p>The CIDR blocks for the address pool.</p>\",\n                        \"smithy.api#xmlName\": \"poolCidrBlockSet\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>Any tags for the address pool.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes an IPv6 address pool.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#Ipv6PoolEc2Id\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#Ipv6PoolIdList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#Ipv6PoolEc2Id\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#Ipv6PoolMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.ec2#Ipv6PoolSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#Ipv6Pool\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#Ipv6PrefixList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#Ipv6PrefixSpecificationRequest\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#Ipv6PrefixListResponse\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#Ipv6PrefixSpecificationResponse\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#Ipv6PrefixSpecification\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Ipv6Prefix\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Ipv6Prefix\",\n                        \"smithy.api#documentation\": \"<p>The IPv6 prefix.</p>\",\n                        \"smithy.api#xmlName\": \"ipv6Prefix\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the IPv6 prefix.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#Ipv6PrefixSpecificationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Ipv6Prefix\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IPv6 prefix.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the IPv6 prefix option for a network interface.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#Ipv6PrefixSpecificationResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Ipv6Prefix\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Ipv6Prefix\",\n                        \"smithy.api#documentation\": \"<p>The IPv6 delegated prefixes assigned to the network interface.</p>\",\n                        \"smithy.api#xmlName\": \"ipv6Prefix\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about the IPv6 delegated prefixes assigned to a network interface.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#Ipv6PrefixesList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#Ipv6PrefixSpecification\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#Ipv6Range\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Description\",\n                        \"smithy.api#documentation\": \"<p>A description for the security group rule that references this IPv6 address range.</p>\\n         <p>Constraints: Up to 255 characters in length. Allowed characters are a-z, A-Z, 0-9,\\n        spaces, and ._-:/()#,@[]+=&;{}!$*</p>\",\n                        \"smithy.api#xmlName\": \"description\"\n                    }\n                },\n                \"CidrIpv6\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CidrIpv6\",\n                        \"smithy.api#documentation\": \"<p>The IPv6 address range. You can either specify a CIDR block or a source security group,\\n        not both. To specify a single IPv6 address, use the /128 prefix length.</p>\\n         <note>\\n            <p>\\n              Amazon Web Services <a href=\\\"https://en.wikipedia.org/wiki/Canonicalization\\\">canonicalizes</a> IPv4 and IPv6 CIDRs. For example, if you specify 100.68.0.18/18 for the CIDR block, \\n              Amazon Web Services canonicalizes the CIDR block to 100.68.0.0/18. Any subsequent DescribeSecurityGroups and DescribeSecurityGroupRules calls will \\n              return the canonicalized form of the CIDR block. Additionally, if you attempt to add another rule with the \\n              non-canonical form of the CIDR (such as 100.68.0.18/18) and there is already a rule for the canonicalized \\n              form of the CIDR block (such as 100.68.0.0/18), the API throws an duplicate rule error.</p>\\n         </note>\",\n                        \"smithy.api#xmlName\": \"cidrIpv6\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes an IPv6 address range.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#Ipv6RangeList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#Ipv6Range\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#Ipv6SupportValue\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"enable\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"enable\"\n                    }\n                },\n                \"disable\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"disable\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#KernelId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#KeyFormat\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"pem\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"pem\"\n                    }\n                },\n                \"ppk\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ppk\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#KeyNameStringList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#KeyPairName\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"KeyName\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#KeyPair\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"KeyPairId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"KeyPairId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the key pair.</p>\",\n                        \"smithy.api#xmlName\": \"keyPairId\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>Any tags applied to the key pair.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                },\n                \"KeyName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"KeyName\",\n                        \"smithy.api#documentation\": \"<p>The name of the key pair.</p>\",\n                        \"smithy.api#xmlName\": \"keyName\"\n                    }\n                },\n                \"KeyFingerprint\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"KeyFingerprint\",\n                        \"smithy.api#documentation\": \"<ul>\\n            <li>\\n               <p>For RSA key pairs, the key fingerprint is the SHA-1 digest of the DER encoded private key.</p>\\n            </li>\\n            <li>\\n               <p>For ED25519 key pairs, the key fingerprint is the base64-encoded SHA-256 digest, which is the default for OpenSSH, starting with OpenSSH 6.8.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"keyFingerprint\"\n                    }\n                },\n                \"KeyMaterial\": {\n                    \"target\": \"com.amazonaws.ec2#SensitiveUserData\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"KeyMaterial\",\n                        \"smithy.api#documentation\": \"<p>An unencrypted PEM encoded RSA or ED25519 private key.</p>\",\n                        \"smithy.api#xmlName\": \"keyMaterial\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a key pair.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#KeyPairId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#KeyPairIdStringList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#KeyPairId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"KeyPairId\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#KeyPairInfo\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"KeyPairId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"KeyPairId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the key pair.</p>\",\n                        \"smithy.api#xmlName\": \"keyPairId\"\n                    }\n                },\n                \"KeyType\": {\n                    \"target\": \"com.amazonaws.ec2#KeyType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"KeyType\",\n                        \"smithy.api#documentation\": \"<p>The type of key pair.</p>\",\n                        \"smithy.api#xmlName\": \"keyType\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>Any tags applied to the key pair.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                },\n                \"PublicKey\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PublicKey\",\n                        \"smithy.api#documentation\": \"<p>The public key material.</p>\",\n                        \"smithy.api#xmlName\": \"publicKey\"\n                    }\n                },\n                \"CreateTime\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CreateTime\",\n                        \"smithy.api#documentation\": \"<p>If you used Amazon EC2 to create the key pair, this is the date and time when the key\\n            was created, in <a href=\\\"https://www.iso.org/iso-8601-date-and-time-format.html\\\">ISO\\n                8601 date-time format</a>, in the UTC time zone.</p>\\n         <p>If you imported an existing key pair to Amazon EC2, this is the date and time the key\\n            was imported, in <a href=\\\"https://www.iso.org/iso-8601-date-and-time-format.html\\\">ISO\\n                8601 date-time format</a>, in the UTC time zone.</p>\",\n                        \"smithy.api#xmlName\": \"createTime\"\n                    }\n                },\n                \"KeyName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"KeyName\",\n                        \"smithy.api#documentation\": \"<p>The name of the key pair.</p>\",\n                        \"smithy.api#xmlName\": \"keyName\"\n                    }\n                },\n                \"KeyFingerprint\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"KeyFingerprint\",\n                        \"smithy.api#documentation\": \"<p>If you used <a>CreateKeyPair</a> to create the key pair:</p>\\n         <ul>\\n            <li>\\n               <p>For RSA key pairs, the key fingerprint is the SHA-1 digest of the DER encoded private key.</p>\\n            </li>\\n            <li>\\n               <p>For ED25519 key pairs, the key fingerprint is the base64-encoded SHA-256 digest, which \\n                   is the default for OpenSSH, starting with <a href=\\\"http://www.openssh.com/txt/release-6.8\\\">OpenSSH 6.8</a>.</p>\\n            </li>\\n         </ul>\\n         <p>If you used <a>ImportKeyPair</a> to provide Amazon Web Services the public key:</p>\\n         <ul>\\n            <li>\\n               <p>For RSA key pairs, the key fingerprint is the MD5 public key fingerprint as specified in section 4 of RFC4716.</p>\\n            </li>\\n            <li>\\n               <p>For ED25519 key pairs, the key fingerprint is the base64-encoded SHA-256\\n                    digest, which is the default for OpenSSH, starting with <a href=\\\"http://www.openssh.com/txt/release-6.8\\\">OpenSSH 6.8</a>.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"keyFingerprint\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a key pair.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#KeyPairList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#KeyPairInfo\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#KeyPairName\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#KeyPairNameWithResolver\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#KeyType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"rsa\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"rsa\"\n                    }\n                },\n                \"ed25519\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ed25519\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#KmsKeyArn\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#KmsKeyId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#LastError\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Message\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Message\",\n                        \"smithy.api#documentation\": \"<p>The error message for the VPC endpoint error.</p>\",\n                        \"smithy.api#xmlName\": \"message\"\n                    }\n                },\n                \"Code\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Code\",\n                        \"smithy.api#documentation\": \"<p>The error code for the VPC endpoint error.</p>\",\n                        \"smithy.api#xmlName\": \"code\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The last error that occurred for a VPC endpoint.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#LaunchPermission\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"OrganizationArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OrganizationArn\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of an organization.</p>\",\n                        \"smithy.api#xmlName\": \"organizationArn\"\n                    }\n                },\n                \"OrganizationalUnitArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OrganizationalUnitArn\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of an organizational unit (OU).</p>\",\n                        \"smithy.api#xmlName\": \"organizationalUnitArn\"\n                    }\n                },\n                \"UserId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"UserId\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID.</p>\\n         <p>Constraints: Up to 10 000 account IDs can be specified in a single request.</p>\",\n                        \"smithy.api#xmlName\": \"userId\"\n                    }\n                },\n                \"Group\": {\n                    \"target\": \"com.amazonaws.ec2#PermissionGroup\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Group\",\n                        \"smithy.api#documentation\": \"<p>The name of the group.</p>\",\n                        \"smithy.api#xmlName\": \"group\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a launch permission.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#LaunchPermissionList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#LaunchPermission\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#LaunchPermissionModifications\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Add\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchPermissionList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID, organization ARN, or OU ARN to add to the list of\\n      launch permissions for the AMI.</p>\"\n                    }\n                },\n                \"Remove\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchPermissionList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID, organization ARN, or OU ARN to remove from the list of\\n      launch permissions for the AMI.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a launch permission modification.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#LaunchSpecification\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"UserData\": {\n                    \"target\": \"com.amazonaws.ec2#SensitiveUserData\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"UserData\",\n                        \"smithy.api#documentation\": \"<p>The base64-encoded user data that instances use when starting up. User data is limited to 16 KB.</p>\",\n                        \"smithy.api#xmlName\": \"userData\"\n                    }\n                },\n                \"AddressingType\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AddressingType\",\n                        \"smithy.api#documentation\": \"<p>Deprecated.</p>\",\n                        \"smithy.api#xmlName\": \"addressingType\"\n                    }\n                },\n                \"BlockDeviceMappings\": {\n                    \"target\": \"com.amazonaws.ec2#BlockDeviceMappingList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"BlockDeviceMapping\",\n                        \"smithy.api#documentation\": \"<p>The block device mapping entries.</p>\",\n                        \"smithy.api#xmlName\": \"blockDeviceMapping\"\n                    }\n                },\n                \"EbsOptimized\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EbsOptimized\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether the instance is optimized for EBS I/O. This optimization provides dedicated throughput to Amazon EBS and an optimized configuration stack to provide optimal EBS I/O performance. This optimization isn't available with all instance types. Additional usage charges apply when using an EBS Optimized instance.</p>\\n         <p>Default: <code>false</code>\\n         </p>\",\n                        \"smithy.api#xmlName\": \"ebsOptimized\"\n                    }\n                },\n                \"IamInstanceProfile\": {\n                    \"target\": \"com.amazonaws.ec2#IamInstanceProfileSpecification\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IamInstanceProfile\",\n                        \"smithy.api#documentation\": \"<p>The IAM instance profile.</p>\",\n                        \"smithy.api#xmlName\": \"iamInstanceProfile\"\n                    }\n                },\n                \"ImageId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ImageId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the AMI.</p>\",\n                        \"smithy.api#xmlName\": \"imageId\"\n                    }\n                },\n                \"InstanceType\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceType\",\n                        \"smithy.api#documentation\": \"<p>The instance type. Only one instance type can be specified.</p>\",\n                        \"smithy.api#xmlName\": \"instanceType\"\n                    }\n                },\n                \"KernelId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"KernelId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the kernel.</p>\",\n                        \"smithy.api#xmlName\": \"kernelId\"\n                    }\n                },\n                \"KeyName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"KeyName\",\n                        \"smithy.api#documentation\": \"<p>The name of the key pair.</p>\",\n                        \"smithy.api#xmlName\": \"keyName\"\n                    }\n                },\n                \"NetworkInterfaces\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceNetworkInterfaceSpecificationList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkInterfaceSet\",\n                        \"smithy.api#documentation\": \"<p>The network interfaces. If you specify a network interface, you must specify \\n           subnet IDs and security group IDs using the network interface.</p>\",\n                        \"smithy.api#xmlName\": \"networkInterfaceSet\"\n                    }\n                },\n                \"Placement\": {\n                    \"target\": \"com.amazonaws.ec2#SpotPlacement\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Placement\",\n                        \"smithy.api#documentation\": \"<p>The placement information for the instance.</p>\",\n                        \"smithy.api#xmlName\": \"placement\"\n                    }\n                },\n                \"RamdiskId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RamdiskId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the RAM disk.</p>\",\n                        \"smithy.api#xmlName\": \"ramdiskId\"\n                    }\n                },\n                \"SubnetId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SubnetId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the subnet in which to launch the instance.</p>\",\n                        \"smithy.api#xmlName\": \"subnetId\"\n                    }\n                },\n                \"SecurityGroups\": {\n                    \"target\": \"com.amazonaws.ec2#GroupIdentifierList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"GroupSet\",\n                        \"smithy.api#documentation\": \"<p>The IDs of the security groups.</p>\",\n                        \"smithy.api#xmlName\": \"groupSet\"\n                    }\n                },\n                \"Monitoring\": {\n                    \"target\": \"com.amazonaws.ec2#RunInstancesMonitoringEnabled\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Monitoring\",\n                        \"smithy.api#xmlName\": \"monitoring\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the launch specification for an instance.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#LaunchSpecsList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#SpotFleetLaunchSpecification\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#LaunchTemplate\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LaunchTemplateId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LaunchTemplateId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the launch template.</p>\",\n                        \"smithy.api#xmlName\": \"launchTemplateId\"\n                    }\n                },\n                \"LaunchTemplateName\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplateName\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LaunchTemplateName\",\n                        \"smithy.api#documentation\": \"<p>The name of the launch template.</p>\",\n                        \"smithy.api#xmlName\": \"launchTemplateName\"\n                    }\n                },\n                \"CreateTime\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CreateTime\",\n                        \"smithy.api#documentation\": \"<p>The time launch template was created.</p>\",\n                        \"smithy.api#xmlName\": \"createTime\"\n                    }\n                },\n                \"CreatedBy\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CreatedBy\",\n                        \"smithy.api#documentation\": \"<p>The principal that created the launch template. </p>\",\n                        \"smithy.api#xmlName\": \"createdBy\"\n                    }\n                },\n                \"DefaultVersionNumber\": {\n                    \"target\": \"com.amazonaws.ec2#Long\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DefaultVersionNumber\",\n                        \"smithy.api#documentation\": \"<p>The version number of the default version of the launch template.</p>\",\n                        \"smithy.api#xmlName\": \"defaultVersionNumber\"\n                    }\n                },\n                \"LatestVersionNumber\": {\n                    \"target\": \"com.amazonaws.ec2#Long\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LatestVersionNumber\",\n                        \"smithy.api#documentation\": \"<p>The version number of the latest version of the launch template.</p>\",\n                        \"smithy.api#xmlName\": \"latestVersionNumber\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>The tags for the launch template.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                },\n                \"Operator\": {\n                    \"target\": \"com.amazonaws.ec2#OperatorResponse\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Operator\",\n                        \"smithy.api#documentation\": \"<p>The entity that manages the launch template.</p>\",\n                        \"smithy.api#xmlName\": \"operator\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a launch template.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#LaunchTemplateAndOverridesResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LaunchTemplateSpecification\": {\n                    \"target\": \"com.amazonaws.ec2#FleetLaunchTemplateSpecification\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LaunchTemplateSpecification\",\n                        \"smithy.api#documentation\": \"<p>The launch template.</p>\",\n                        \"smithy.api#xmlName\": \"launchTemplateSpecification\"\n                    }\n                },\n                \"Overrides\": {\n                    \"target\": \"com.amazonaws.ec2#FleetLaunchTemplateOverrides\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Overrides\",\n                        \"smithy.api#documentation\": \"<p>Any parameters that you specify override the same parameters in the launch\\n         template.</p>\",\n                        \"smithy.api#xmlName\": \"overrides\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a launch template and overrides.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#LaunchTemplateAutoRecoveryState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"default\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"default\"\n                    }\n                },\n                \"disabled\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"disabled\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#LaunchTemplateBlockDeviceMapping\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DeviceName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DeviceName\",\n                        \"smithy.api#documentation\": \"<p>The device name.</p>\",\n                        \"smithy.api#xmlName\": \"deviceName\"\n                    }\n                },\n                \"VirtualName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VirtualName\",\n                        \"smithy.api#documentation\": \"<p>The virtual device name (ephemeralN).</p>\",\n                        \"smithy.api#xmlName\": \"virtualName\"\n                    }\n                },\n                \"Ebs\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplateEbsBlockDevice\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Ebs\",\n                        \"smithy.api#documentation\": \"<p>Information about the block device for an EBS volume.</p>\",\n                        \"smithy.api#xmlName\": \"ebs\"\n                    }\n                },\n                \"NoDevice\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NoDevice\",\n                        \"smithy.api#documentation\": \"<p>To omit the device from the block device mapping, specify an empty string.</p>\",\n                        \"smithy.api#xmlName\": \"noDevice\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a block device mapping.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#LaunchTemplateBlockDeviceMappingList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#LaunchTemplateBlockDeviceMapping\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#LaunchTemplateBlockDeviceMappingRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DeviceName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The device name (for example, /dev/sdh or xvdh).</p>\"\n                    }\n                },\n                \"VirtualName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The virtual device name (ephemeralN). Instance store volumes are numbered starting\\n            from 0. An instance type with 2 available instance store volumes can specify mappings\\n            for ephemeral0 and ephemeral1. The number of available instance store volumes depends on\\n            the instance type. After you connect to the instance, you must mount the volume.</p>\"\n                    }\n                },\n                \"Ebs\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplateEbsBlockDeviceRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Parameters used to automatically set up EBS volumes when the instance is\\n            launched.</p>\"\n                    }\n                },\n                \"NoDevice\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>To omit the device from the block device mapping, specify an empty string.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a block device mapping.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#LaunchTemplateBlockDeviceMappingRequestList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#LaunchTemplateBlockDeviceMappingRequest\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"BlockDeviceMapping\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#LaunchTemplateCapacityReservationSpecificationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CapacityReservationPreference\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityReservationPreference\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates the instance's Capacity Reservation preferences. Possible preferences\\n            include:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>capacity-reservations-only</code> - The instance will only run in a\\n                    Capacity Reservation or Capacity Reservation group. If capacity isn't available,\\n                    the instance will fail to launch.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>open</code> - The instance can run in any <code>open</code> Capacity\\n                    Reservation that has matching attributes (instance type, platform, Availability\\n                    Zone, tenancy).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>none</code> - The instance avoids running in a Capacity Reservation even\\n                    if one is available. The instance runs in On-Demand capacity.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"CapacityReservationTarget\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityReservationTarget\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Information about the target Capacity Reservation or Capacity Reservation\\n            group.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes an instance's Capacity Reservation targeting option. You can specify only\\n            one option at a time. Use the <code>CapacityReservationPreference</code> parameter to\\n            configure the instance to run in On-Demand capacity or to run in any <code>open</code>\\n            Capacity Reservation that has matching attributes (instance type, platform, Availability\\n            Zone). Use the <code>CapacityReservationTarget</code> parameter to explicitly target a\\n            specific Capacity Reservation or a Capacity Reservation group.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#LaunchTemplateCapacityReservationSpecificationResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CapacityReservationPreference\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityReservationPreference\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CapacityReservationPreference\",\n                        \"smithy.api#documentation\": \"<p>Indicates the instance's Capacity Reservation preferences. Possible preferences\\n            include:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>open</code> - The instance can run in any <code>open</code> Capacity\\n                    Reservation that has matching attributes (instance type, platform, Availability\\n                    Zone).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>none</code> - The instance avoids running in a Capacity Reservation even\\n                    if one is available. The instance runs in On-Demand capacity.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"capacityReservationPreference\"\n                    }\n                },\n                \"CapacityReservationTarget\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityReservationTargetResponse\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CapacityReservationTarget\",\n                        \"smithy.api#documentation\": \"<p>Information about the target Capacity Reservation or Capacity Reservation\\n            group.</p>\",\n                        \"smithy.api#xmlName\": \"capacityReservationTarget\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about the Capacity Reservation targeting option.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#LaunchTemplateConfig\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LaunchTemplateSpecification\": {\n                    \"target\": \"com.amazonaws.ec2#FleetLaunchTemplateSpecification\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LaunchTemplateSpecification\",\n                        \"smithy.api#documentation\": \"<p>The launch template to use. Make sure that the launch template does not contain the\\n            <code>NetworkInterfaceId</code> parameter because you can't specify a network interface\\n         ID in a Spot Fleet.</p>\",\n                        \"smithy.api#xmlName\": \"launchTemplateSpecification\"\n                    }\n                },\n                \"Overrides\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplateOverridesList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Overrides\",\n                        \"smithy.api#documentation\": \"<p>Any parameters that you specify override the same parameters in the launch\\n         template.</p>\",\n                        \"smithy.api#xmlName\": \"overrides\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a launch template and overrides.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#LaunchTemplateConfigList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#LaunchTemplateConfig\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#LaunchTemplateCpuOptions\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CoreCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CoreCount\",\n                        \"smithy.api#documentation\": \"<p>The number of CPU cores for the instance.</p>\",\n                        \"smithy.api#xmlName\": \"coreCount\"\n                    }\n                },\n                \"ThreadsPerCore\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ThreadsPerCore\",\n                        \"smithy.api#documentation\": \"<p>The number of threads per CPU core.</p>\",\n                        \"smithy.api#xmlName\": \"threadsPerCore\"\n                    }\n                },\n                \"AmdSevSnp\": {\n                    \"target\": \"com.amazonaws.ec2#AmdSevSnpSpecification\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AmdSevSnp\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether the instance is enabled for AMD SEV-SNP. For more information, see\\n                <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/sev-snp.html\\\">AMD SEV-SNP\\n                for Amazon EC2 instances</a>.</p>\",\n                        \"smithy.api#xmlName\": \"amdSevSnp\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The CPU options for the instance.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#LaunchTemplateCpuOptionsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CoreCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of CPU cores for the instance.</p>\"\n                    }\n                },\n                \"ThreadsPerCore\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of threads per CPU core. To disable multithreading for the instance,\\n            specify a value of <code>1</code>. Otherwise, specify the default value of\\n                <code>2</code>.</p>\"\n                    }\n                },\n                \"AmdSevSnp\": {\n                    \"target\": \"com.amazonaws.ec2#AmdSevSnpSpecification\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether to enable the instance for AMD SEV-SNP. AMD SEV-SNP is supported\\n            with M6a, R6a, and C6a instance types only. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/sev-snp.html\\\">AMD SEV-SNP for\\n                Amazon EC2 instances</a>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The CPU options for the instance. Both the core count and threads per core must be\\n            specified in the request.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#LaunchTemplateEbsBlockDevice\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Encrypted\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Encrypted\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether the EBS volume is encrypted.</p>\",\n                        \"smithy.api#xmlName\": \"encrypted\"\n                    }\n                },\n                \"DeleteOnTermination\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DeleteOnTermination\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether the EBS volume is deleted on instance termination.</p>\",\n                        \"smithy.api#xmlName\": \"deleteOnTermination\"\n                    }\n                },\n                \"Iops\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Iops\",\n                        \"smithy.api#documentation\": \"<p>The number of I/O operations per second (IOPS) that the volume supports. </p>\",\n                        \"smithy.api#xmlName\": \"iops\"\n                    }\n                },\n                \"KmsKeyId\": {\n                    \"target\": \"com.amazonaws.ec2#KmsKeyId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"KmsKeyId\",\n                        \"smithy.api#documentation\": \"<p>Identifier (key ID, key alias, key ARN, or alias ARN) of the customer managed KMS key to use for EBS encryption.</p>\",\n                        \"smithy.api#xmlName\": \"kmsKeyId\"\n                    }\n                },\n                \"SnapshotId\": {\n                    \"target\": \"com.amazonaws.ec2#SnapshotId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SnapshotId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the snapshot.</p>\",\n                        \"smithy.api#xmlName\": \"snapshotId\"\n                    }\n                },\n                \"VolumeSize\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VolumeSize\",\n                        \"smithy.api#documentation\": \"<p>The size of the volume, in GiB.</p>\",\n                        \"smithy.api#xmlName\": \"volumeSize\"\n                    }\n                },\n                \"VolumeType\": {\n                    \"target\": \"com.amazonaws.ec2#VolumeType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VolumeType\",\n                        \"smithy.api#documentation\": \"<p>The volume type.</p>\",\n                        \"smithy.api#xmlName\": \"volumeType\"\n                    }\n                },\n                \"Throughput\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Throughput\",\n                        \"smithy.api#documentation\": \"<p>The throughput that the volume supports, in MiB/s.</p>\",\n                        \"smithy.api#xmlName\": \"throughput\"\n                    }\n                },\n                \"VolumeInitializationRate\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VolumeInitializationRate\",\n                        \"smithy.api#documentation\": \"<p>The Amazon EBS Provisioned Rate for Volume Initialization (volume initialization rate) specified for the volume, in MiB/s. \\n            If no volume initialization rate was specified, the value is <code>null</code>.</p>\",\n                        \"smithy.api#xmlName\": \"volumeInitializationRate\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a block device for an EBS volume.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#LaunchTemplateEbsBlockDeviceRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Encrypted\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether the EBS volume is encrypted. Encrypted volumes can only be attached\\n            to instances that support Amazon EBS encryption. If you are creating a volume from a\\n            snapshot, you can't specify an encryption value.</p>\"\n                    }\n                },\n                \"DeleteOnTermination\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether the EBS volume is deleted on instance termination.</p>\"\n                    }\n                },\n                \"Iops\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of I/O operations per second (IOPS). For <code>gp3</code>,\\n            <code>io1</code>, and <code>io2</code> volumes, this represents the number of IOPS that\\n            are provisioned for the volume. For <code>gp2</code> volumes, this represents the\\n            baseline performance of the volume and the rate at which the volume accumulates I/O\\n            credits for bursting.</p>\\n         <p>The following are the supported values for each volume type:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>gp3</code>: 3,000 - 80,000 IOPS</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>io1</code>: 100 - 64,000 IOPS</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>io2</code>: 100 - 256,000 IOPS</p>\\n            </li>\\n         </ul>\\n         <p>For <code>io2</code> volumes, you can achieve up to 256,000 IOPS on \\n<a href=\\\"https://docs.aws.amazon.com/ec2/latest/instancetypes/ec2-nitro-instances.html\\\">instances \\nbuilt on the Nitro System</a>. On other instances, you can achieve performance up to 32,000 IOPS.</p>\\n         <p>This parameter is supported for <code>io1</code>, <code>io2</code>, and <code>gp3</code> volumes only.</p>\"\n                    }\n                },\n                \"KmsKeyId\": {\n                    \"target\": \"com.amazonaws.ec2#KmsKeyId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Identifier (key ID, key alias, key ARN, or alias ARN) of the customer managed KMS key to use for EBS encryption.</p>\"\n                    }\n                },\n                \"SnapshotId\": {\n                    \"target\": \"com.amazonaws.ec2#SnapshotId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the snapshot.</p>\"\n                    }\n                },\n                \"VolumeSize\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The size of the volume, in GiBs. You must specify either a snapshot ID or a volume\\n            size. The following are the supported volumes sizes for each volume type:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>gp2</code>: 1 - 16,384 GiB</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>gp3</code>: 1 - 65,536 GiB</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>io1</code>: 4 - 16,384 GiB</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>io2</code>: 4 - 65,536 GiB</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>st1</code> and <code>sc1</code>: 125 - 16,384 GiB</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>standard</code>: 1 - 1024 GiB</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"VolumeType\": {\n                    \"target\": \"com.amazonaws.ec2#VolumeType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The volume type. For more information, see <a href=\\\"https://docs.aws.amazon.com/ebs/latest/userguide/ebs-volume-types.html\\\">Amazon EBS volume types</a> in the\\n                <i>Amazon EBS User Guide</i>.</p>\"\n                    }\n                },\n                \"Throughput\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The throughput to provision for a <code>gp3</code> volume, with a maximum of 2,000\\n            MiB/s.</p>\\n         <p>Valid Range: Minimum value of 125. Maximum value of 2,000.</p>\"\n                    }\n                },\n                \"VolumeInitializationRate\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the Amazon EBS Provisioned Rate for Volume Initialization (volume initialization rate), in MiB/s, at which to download \\n            the snapshot blocks from Amazon S3 to the volume. This is also known as <i>volume \\n                initialization</i>. Specifying a volume initialization rate ensures that the volume is \\n            initialized at a predictable and consistent rate after creation.</p>\\n         <p>This parameter is supported only for volumes created from snapshots. Omit this parameter \\n            if:</p>\\n         <ul>\\n            <li>\\n               <p>You want to create the volume using fast snapshot restore. You must specify a snapshot \\n                    that is enabled for fast snapshot restore. In this case, the volume is fully initialized \\n                    at creation.</p>\\n               <note>\\n                  <p>If you specify a snapshot that is enabled for fast snapshot restore and a volume initialization rate, \\n                        the volume will be initialized at the specified rate instead of fast snapshot restore.</p>\\n               </note>\\n            </li>\\n            <li>\\n               <p>You want to create a volume that is initialized at the default rate.</p>\\n            </li>\\n         </ul>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/ebs/latest/userguide/initalize-volume.html\\\">\\n            Initialize Amazon EBS volumes</a> in the <i>Amazon EC2 User Guide</i>.</p>\\n         <p>Valid range: 100 - 300 MiB/s</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The parameters for a block device for an EBS volume.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#LaunchTemplateElasticInferenceAccelerator\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Type\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p> The type of elastic inference accelerator. The possible values are eia1.medium,\\n            eia1.large, and eia1.xlarge. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Count\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplateElasticInferenceAcceleratorCount\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of elastic inference accelerators to attach to the instance. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>Amazon Elastic Inference is no longer available.</p>\\n         </note>\\n         <p> Describes an elastic inference accelerator. </p>\"\n            }\n        },\n        \"com.amazonaws.ec2#LaunchTemplateElasticInferenceAcceleratorCount\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1\n                }\n            }\n        },\n        \"com.amazonaws.ec2#LaunchTemplateElasticInferenceAcceleratorList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#LaunchTemplateElasticInferenceAccelerator\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#LaunchTemplateElasticInferenceAcceleratorResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Type\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Type\",\n                        \"smithy.api#documentation\": \"<p>The type of elastic inference accelerator. The possible values are eia1.medium,\\n            eia1.large, and eia1.xlarge. </p>\",\n                        \"smithy.api#xmlName\": \"type\"\n                    }\n                },\n                \"Count\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Count\",\n                        \"smithy.api#documentation\": \"<p>The number of elastic inference accelerators to attach to the instance. </p>\",\n                        \"smithy.api#xmlName\": \"count\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>Amazon Elastic Inference is no longer available.</p>\\n         </note>\\n         <p> Describes an elastic inference accelerator. </p>\"\n            }\n        },\n        \"com.amazonaws.ec2#LaunchTemplateElasticInferenceAcceleratorResponseList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#LaunchTemplateElasticInferenceAcceleratorResponse\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#LaunchTemplateEnaSrdSpecification\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"EnaSrdEnabled\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EnaSrdEnabled\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether ENA Express is enabled for the network interface.</p>\",\n                        \"smithy.api#xmlName\": \"enaSrdEnabled\"\n                    }\n                },\n                \"EnaSrdUdpSpecification\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplateEnaSrdUdpSpecification\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EnaSrdUdpSpecification\",\n                        \"smithy.api#documentation\": \"<p>Configures ENA Express for UDP network traffic.</p>\",\n                        \"smithy.api#xmlName\": \"enaSrdUdpSpecification\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>ENA Express uses Amazon Web Services Scalable Reliable Datagram (SRD) technology to increase the \\n\\t\\t\\tmaximum bandwidth used per stream and minimize tail latency of network traffic between EC2 instances. \\n\\t\\t\\tWith ENA Express, you can communicate between two EC2 instances in the same subnet within the same \\n\\t\\t\\taccount, or in different accounts. Both sending and receiving instances must have ENA Express enabled.</p>\\n         <p>To improve the reliability of network packet delivery, ENA Express reorders network packets on the \\n\\t\\t\\treceiving end by default. However, some UDP-based applications are designed to handle network packets \\n\\t\\t\\tthat are out of order to reduce the overhead for packet delivery at the network layer. When ENA Express \\n\\t\\t\\tis enabled, you can specify whether UDP network traffic uses it.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#LaunchTemplateEnaSrdUdpSpecification\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"EnaSrdUdpEnabled\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EnaSrdUdpEnabled\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether UDP traffic to and from the instance uses ENA Express. To specify this setting, \\n\\t\\t\\tyou must first enable ENA Express.</p>\",\n                        \"smithy.api#xmlName\": \"enaSrdUdpEnabled\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>ENA Express is compatible with both TCP and UDP transport protocols. When it's enabled, TCP traffic \\n\\t\\t\\tautomatically uses it. However, some UDP-based applications are designed to handle network packets that are \\n\\t\\t\\tout of order, without a need for retransmission, such as live video broadcasting or other near-real-time \\n\\t\\t\\tapplications. For UDP traffic, you can specify whether to use ENA Express, based on your application \\n\\t\\t\\tenvironment needs.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#LaunchTemplateEnclaveOptions\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Enabled\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Enabled\",\n                        \"smithy.api#documentation\": \"<p>If this parameter is set to <code>true</code>, the instance is enabled for Amazon Web Services Nitro\\n            Enclaves; otherwise, it is not enabled for Amazon Web Services Nitro Enclaves.</p>\",\n                        \"smithy.api#xmlName\": \"enabled\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Indicates whether the instance is enabled for Amazon Web Services Nitro Enclaves.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#LaunchTemplateEnclaveOptionsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Enabled\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>To enable the instance for Amazon Web Services Nitro Enclaves, set this parameter to\\n                <code>true</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Indicates whether the instance is enabled for Amazon Web Services Nitro Enclaves. For more\\n            information, see <a href=\\\"https://docs.aws.amazon.com/enclaves/latest/user/nitro-enclave.html\\\">What is Nitro Enclaves?</a> in the\\n                <i>Amazon Web Services Nitro Enclaves User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#LaunchTemplateErrorCode\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"LAUNCH_TEMPLATE_ID_DOES_NOT_EXIST\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"launchTemplateIdDoesNotExist\"\n                    }\n                },\n                \"LAUNCH_TEMPLATE_ID_MALFORMED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"launchTemplateIdMalformed\"\n                    }\n                },\n                \"LAUNCH_TEMPLATE_NAME_DOES_NOT_EXIST\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"launchTemplateNameDoesNotExist\"\n                    }\n                },\n                \"LAUNCH_TEMPLATE_NAME_MALFORMED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"launchTemplateNameMalformed\"\n                    }\n                },\n                \"LAUNCH_TEMPLATE_VERSION_DOES_NOT_EXIST\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"launchTemplateVersionDoesNotExist\"\n                    }\n                },\n                \"UNEXPECTED_ERROR\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"unexpectedError\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#LaunchTemplateHibernationOptions\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Configured\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Configured\",\n                        \"smithy.api#documentation\": \"<p>If this parameter is set to <code>true</code>, the instance is enabled for\\n            hibernation; otherwise, it is not enabled for hibernation.</p>\",\n                        \"smithy.api#xmlName\": \"configured\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Indicates whether an instance is configured for hibernation.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#LaunchTemplateHibernationOptionsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Configured\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If you set this parameter to <code>true</code>, the instance is enabled for\\n            hibernation.</p>\\n         <p>Default: <code>false</code>\\n         </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Indicates whether the instance is configured for hibernation. This parameter is valid\\n            only if the instance meets the <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/hibernating-prerequisites.html\\\">hibernation\\n                prerequisites</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#LaunchTemplateHttpTokensState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"optional\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"optional\"\n                    }\n                },\n                \"required\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"required\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#LaunchTemplateIamInstanceProfileSpecification\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Arn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Arn\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the instance profile.</p>\",\n                        \"smithy.api#xmlName\": \"arn\"\n                    }\n                },\n                \"Name\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Name\",\n                        \"smithy.api#documentation\": \"<p>The name of the instance profile.</p>\",\n                        \"smithy.api#xmlName\": \"name\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes an IAM instance profile.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#LaunchTemplateIamInstanceProfileSpecificationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Arn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the instance profile.</p>\"\n                    }\n                },\n                \"Name\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the instance profile.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>An IAM instance profile.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#LaunchTemplateId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#LaunchTemplateIdStringList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#LaunchTemplateId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#LaunchTemplateInstanceMaintenanceOptions\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AutoRecovery\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplateAutoRecoveryState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AutoRecovery\",\n                        \"smithy.api#documentation\": \"<p>Disables the automatic recovery behavior of your instance or sets it to\\n            default.</p>\",\n                        \"smithy.api#xmlName\": \"autoRecovery\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The maintenance options of your instance.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#LaunchTemplateInstanceMaintenanceOptionsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AutoRecovery\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplateAutoRecoveryState\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Disables the automatic recovery behavior of your instance or sets it to default. For\\n            more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-recover.html#instance-configuration-recovery\\\">Simplified automatic recovery</a>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The maintenance options of your instance.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#LaunchTemplateInstanceMarketOptions\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"MarketType\": {\n                    \"target\": \"com.amazonaws.ec2#MarketType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MarketType\",\n                        \"smithy.api#documentation\": \"<p>The market type.</p>\",\n                        \"smithy.api#xmlName\": \"marketType\"\n                    }\n                },\n                \"SpotOptions\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplateSpotMarketOptions\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SpotOptions\",\n                        \"smithy.api#documentation\": \"<p>The options for Spot Instances.</p>\",\n                        \"smithy.api#xmlName\": \"spotOptions\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The market (purchasing) option for the instances.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#LaunchTemplateInstanceMarketOptionsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"MarketType\": {\n                    \"target\": \"com.amazonaws.ec2#MarketType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The market type.</p>\"\n                    }\n                },\n                \"SpotOptions\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplateSpotMarketOptionsRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The options for Spot Instances.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The market (purchasing) option for the instances.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#LaunchTemplateInstanceMetadataEndpointState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"disabled\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"disabled\"\n                    }\n                },\n                \"enabled\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"enabled\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#LaunchTemplateInstanceMetadataOptions\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplateInstanceMetadataOptionsState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The state of the metadata option changes.</p>\\n         <p>\\n            <code>pending</code> - The metadata options are being updated and the instance is not\\n            ready to process metadata traffic with the new selection.</p>\\n         <p>\\n            <code>applied</code> - The metadata options have been successfully applied on the\\n            instance.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                },\n                \"HttpTokens\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplateHttpTokensState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"HttpTokens\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether IMDSv2 is required.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>optional</code> - IMDSv2 is optional. You can choose whether to send a\\n                    session token in your instance metadata retrieval requests. If you retrieve IAM\\n                    role credentials without a session token, you receive the IMDSv1 role\\n                    credentials. If you retrieve IAM role credentials using a valid session token,\\n                    you receive the IMDSv2 role credentials.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>required</code> - IMDSv2 is required. You must send a session token in\\n                    your instance metadata retrieval requests. With this option, retrieving the IAM\\n                    role credentials always returns IMDSv2 credentials; IMDSv1 credentials are not\\n                    available.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"httpTokens\"\n                    }\n                },\n                \"HttpPutResponseHopLimit\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"HttpPutResponseHopLimit\",\n                        \"smithy.api#documentation\": \"<p>The desired HTTP PUT response hop limit for instance metadata requests. The larger the\\n            number, the further instance metadata requests can travel.</p>\\n         <p>Possible values: Integers from 1 to 64</p>\",\n                        \"smithy.api#xmlName\": \"httpPutResponseHopLimit\"\n                    }\n                },\n                \"HttpEndpoint\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplateInstanceMetadataEndpointState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"HttpEndpoint\",\n                        \"smithy.api#documentation\": \"<p>Enables or disables the HTTP metadata endpoint on your instances. If the parameter is\\n            not specified, the default state is <code>enabled</code>.</p>\\n         <note>\\n            <p>If you specify a value of <code>disabled</code>, you will not be able to access\\n                your instance metadata. </p>\\n         </note>\",\n                        \"smithy.api#xmlName\": \"httpEndpoint\"\n                    }\n                },\n                \"HttpProtocolIpv6\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplateInstanceMetadataProtocolIpv6\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"HttpProtocolIpv6\",\n                        \"smithy.api#documentation\": \"<p>Enables or disables the IPv6 endpoint for the instance metadata service.</p>\\n         <p>Default: <code>disabled</code>\\n         </p>\",\n                        \"smithy.api#xmlName\": \"httpProtocolIpv6\"\n                    }\n                },\n                \"InstanceMetadataTags\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplateInstanceMetadataTagsState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceMetadataTags\",\n                        \"smithy.api#documentation\": \"<p>Set to <code>enabled</code> to allow access to instance tags from the instance\\n            metadata. Set to <code>disabled</code> to turn off access to instance tags from the\\n            instance metadata. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/work-with-tags-in-IMDS.html\\\">View tags for your EC2\\n                instances using instance metadata</a>.</p>\\n         <p>Default: <code>disabled</code>\\n         </p>\",\n                        \"smithy.api#xmlName\": \"instanceMetadataTags\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The metadata options for the instance. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html\\\">Use\\n                instance metadata to manage your EC2 instance</a> in the\\n                <i>Amazon EC2 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#LaunchTemplateInstanceMetadataOptionsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"HttpTokens\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplateHttpTokensState\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether IMDSv2 is required.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>optional</code> - IMDSv2 is optional. You can choose whether to send a\\n                    session token in your instance metadata retrieval requests. If you retrieve IAM\\n                    role credentials without a session token, you receive the IMDSv1 role\\n                    credentials. If you retrieve IAM role credentials using a valid session token,\\n                    you receive the IMDSv2 role credentials.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>required</code> - IMDSv2 is required. You must send a session token in\\n                    your instance metadata retrieval requests. With this option, retrieving the IAM\\n                    role credentials always returns IMDSv2 credentials; IMDSv1 credentials are not\\n                    available.</p>\\n            </li>\\n         </ul>\\n         <p>Default: If the value of <code>ImdsSupport</code> for the Amazon Machine Image (AMI)\\n            for your instance is <code>v2.0</code>, the default is <code>required</code>.</p>\"\n                    }\n                },\n                \"HttpPutResponseHopLimit\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The desired HTTP PUT response hop limit for instance metadata requests. The larger the\\n            number, the further instance metadata requests can travel.</p>\\n         <p>Default: <code>1</code>\\n         </p>\\n         <p>Possible values: Integers from 1 to 64</p>\"\n                    }\n                },\n                \"HttpEndpoint\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplateInstanceMetadataEndpointState\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Enables or disables the HTTP metadata endpoint on your instances. If the parameter is\\n            not specified, the default state is <code>enabled</code>.</p>\\n         <note>\\n            <p>If you specify a value of <code>disabled</code>, you will not be able to access\\n                your instance metadata. </p>\\n         </note>\"\n                    }\n                },\n                \"HttpProtocolIpv6\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplateInstanceMetadataProtocolIpv6\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Enables or disables the IPv6 endpoint for the instance metadata service.</p>\\n         <p>Default: <code>disabled</code>\\n         </p>\"\n                    }\n                },\n                \"InstanceMetadataTags\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplateInstanceMetadataTagsState\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Set to <code>enabled</code> to allow access to instance tags from the instance\\n            metadata. Set to <code>disabled</code> to turn off access to instance tags from the\\n            instance metadata. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/work-with-tags-in-IMDS.html\\\">View tags for your EC2\\n                instances using instance metadata</a>.</p>\\n         <p>Default: <code>disabled</code>\\n         </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The metadata options for the instance. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html\\\">Use\\n                instance metadata to manage your EC2 instance</a> in the\\n                <i>Amazon EC2 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#LaunchTemplateInstanceMetadataOptionsState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"pending\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"pending\"\n                    }\n                },\n                \"applied\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"applied\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#LaunchTemplateInstanceMetadataProtocolIpv6\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"disabled\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"disabled\"\n                    }\n                },\n                \"enabled\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"enabled\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#LaunchTemplateInstanceMetadataTagsState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"disabled\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"disabled\"\n                    }\n                },\n                \"enabled\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"enabled\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#LaunchTemplateInstanceNetworkInterfaceSpecification\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AssociateCarrierIpAddress\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AssociateCarrierIpAddress\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether to associate a Carrier IP address with eth0 for a new network\\n            interface.</p>\\n         <p>Use this option when you launch an instance in a Wavelength Zone and want to associate\\n            a Carrier IP address with the network interface. For more information about Carrier IP\\n            addresses, see <a href=\\\"https://docs.aws.amazon.com/wavelength/latest/developerguide/how-wavelengths-work.html#provider-owned-ip\\\">Carrier IP address</a> in the <i>Wavelength Developer\\n            Guide</i>.</p>\",\n                        \"smithy.api#xmlName\": \"associateCarrierIpAddress\"\n                    }\n                },\n                \"AssociatePublicIpAddress\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AssociatePublicIpAddress\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether to associate a public IPv4 address with eth0 for a new network\\n            interface.</p>\\n         <p>Amazon Web Services charges for all public IPv4 addresses, including public IPv4 addresses \\nassociated with running instances and Elastic IP addresses. For more information, see the <i>Public IPv4 Address</i> tab on the <a href=\\\"http://aws.amazon.com/vpc/pricing/\\\">Amazon VPC pricing page</a>.</p>\",\n                        \"smithy.api#xmlName\": \"associatePublicIpAddress\"\n                    }\n                },\n                \"DeleteOnTermination\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DeleteOnTermination\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether the network interface is deleted when the instance is\\n            terminated.</p>\",\n                        \"smithy.api#xmlName\": \"deleteOnTermination\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Description\",\n                        \"smithy.api#documentation\": \"<p>A description for the network interface.</p>\",\n                        \"smithy.api#xmlName\": \"description\"\n                    }\n                },\n                \"DeviceIndex\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DeviceIndex\",\n                        \"smithy.api#documentation\": \"<p>The device index for the network interface attachment.</p>\",\n                        \"smithy.api#xmlName\": \"deviceIndex\"\n                    }\n                },\n                \"Groups\": {\n                    \"target\": \"com.amazonaws.ec2#GroupIdStringList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"GroupSet\",\n                        \"smithy.api#documentation\": \"<p>The IDs of one or more security groups.</p>\",\n                        \"smithy.api#xmlName\": \"groupSet\"\n                    }\n                },\n                \"InterfaceType\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InterfaceType\",\n                        \"smithy.api#documentation\": \"<p>The type of network interface.</p>\",\n                        \"smithy.api#xmlName\": \"interfaceType\"\n                    }\n                },\n                \"Ipv6AddressCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Ipv6AddressCount\",\n                        \"smithy.api#documentation\": \"<p>The number of IPv6 addresses for the network interface.</p>\",\n                        \"smithy.api#xmlName\": \"ipv6AddressCount\"\n                    }\n                },\n                \"Ipv6Addresses\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceIpv6AddressList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Ipv6AddressesSet\",\n                        \"smithy.api#documentation\": \"<p>The IPv6 addresses for the network interface.</p>\",\n                        \"smithy.api#xmlName\": \"ipv6AddressesSet\"\n                    }\n                },\n                \"NetworkInterfaceId\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInterfaceId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkInterfaceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the network interface.</p>\",\n                        \"smithy.api#xmlName\": \"networkInterfaceId\"\n                    }\n                },\n                \"PrivateIpAddress\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PrivateIpAddress\",\n                        \"smithy.api#documentation\": \"<p>The primary private IPv4 address of the network interface.</p>\",\n                        \"smithy.api#xmlName\": \"privateIpAddress\"\n                    }\n                },\n                \"PrivateIpAddresses\": {\n                    \"target\": \"com.amazonaws.ec2#PrivateIpAddressSpecificationList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PrivateIpAddressesSet\",\n                        \"smithy.api#documentation\": \"<p>One or more private IPv4 addresses.</p>\",\n                        \"smithy.api#xmlName\": \"privateIpAddressesSet\"\n                    }\n                },\n                \"SecondaryPrivateIpAddressCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SecondaryPrivateIpAddressCount\",\n                        \"smithy.api#documentation\": \"<p>The number of secondary private IPv4 addresses for the network interface.</p>\",\n                        \"smithy.api#xmlName\": \"secondaryPrivateIpAddressCount\"\n                    }\n                },\n                \"SubnetId\": {\n                    \"target\": \"com.amazonaws.ec2#SubnetId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SubnetId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the subnet for the network interface.</p>\",\n                        \"smithy.api#xmlName\": \"subnetId\"\n                    }\n                },\n                \"NetworkCardIndex\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkCardIndex\",\n                        \"smithy.api#documentation\": \"<p>The index of the network card.</p>\",\n                        \"smithy.api#xmlName\": \"networkCardIndex\"\n                    }\n                },\n                \"Ipv4Prefixes\": {\n                    \"target\": \"com.amazonaws.ec2#Ipv4PrefixListResponse\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Ipv4PrefixSet\",\n                        \"smithy.api#documentation\": \"<p>One or more IPv4 prefixes assigned to the network interface.</p>\",\n                        \"smithy.api#xmlName\": \"ipv4PrefixSet\"\n                    }\n                },\n                \"Ipv4PrefixCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Ipv4PrefixCount\",\n                        \"smithy.api#documentation\": \"<p>The number of IPv4 prefixes that Amazon Web Services automatically assigned to the network\\n            interface.</p>\",\n                        \"smithy.api#xmlName\": \"ipv4PrefixCount\"\n                    }\n                },\n                \"Ipv6Prefixes\": {\n                    \"target\": \"com.amazonaws.ec2#Ipv6PrefixListResponse\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Ipv6PrefixSet\",\n                        \"smithy.api#documentation\": \"<p>One or more IPv6 prefixes assigned to the network interface.</p>\",\n                        \"smithy.api#xmlName\": \"ipv6PrefixSet\"\n                    }\n                },\n                \"Ipv6PrefixCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Ipv6PrefixCount\",\n                        \"smithy.api#documentation\": \"<p>The number of IPv6 prefixes that Amazon Web Services automatically assigned to the network\\n            interface.</p>\",\n                        \"smithy.api#xmlName\": \"ipv6PrefixCount\"\n                    }\n                },\n                \"PrimaryIpv6\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PrimaryIpv6\",\n                        \"smithy.api#documentation\": \"<p>The primary IPv6 address of the network interface. When you enable an IPv6 GUA address\\n            to be a primary IPv6, the first IPv6 GUA will be made the primary IPv6 address until the\\n            instance is terminated or the network interface is detached. For more information about\\n            primary IPv6 addresses, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RunInstances.html\\\">RunInstances</a>.</p>\",\n                        \"smithy.api#xmlName\": \"primaryIpv6\"\n                    }\n                },\n                \"EnaSrdSpecification\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplateEnaSrdSpecification\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EnaSrdSpecification\",\n                        \"smithy.api#documentation\": \"<p>Contains the ENA Express settings for instances launched from your launch\\n            template.</p>\",\n                        \"smithy.api#xmlName\": \"enaSrdSpecification\"\n                    }\n                },\n                \"ConnectionTrackingSpecification\": {\n                    \"target\": \"com.amazonaws.ec2#ConnectionTrackingSpecification\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ConnectionTrackingSpecification\",\n                        \"smithy.api#documentation\": \"<p>A security group connection tracking specification that enables you to set the timeout\\n            for connection tracking on an Elastic network interface. For more information, see\\n                <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/security-group-connection-tracking.html#connection-tracking-timeouts\\\">Idle connection tracking timeout</a> in the\\n                <i>Amazon EC2 User Guide</i>.</p>\",\n                        \"smithy.api#xmlName\": \"connectionTrackingSpecification\"\n                    }\n                },\n                \"EnaQueueCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EnaQueueCount\",\n                        \"smithy.api#documentation\": \"<p>The number of ENA queues created with the instance.</p>\",\n                        \"smithy.api#xmlName\": \"enaQueueCount\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a network interface.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#LaunchTemplateInstanceNetworkInterfaceSpecificationList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#LaunchTemplateInstanceNetworkInterfaceSpecification\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#LaunchTemplateInstanceNetworkInterfaceSpecificationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AssociateCarrierIpAddress\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Associates a Carrier IP address with eth0 for a new network interface.</p>\\n         <p>Use this option when you launch an instance in a Wavelength Zone and want to associate\\n            a Carrier IP address with the network interface. For more information about Carrier IP\\n            addresses, see <a href=\\\"https://docs.aws.amazon.com/wavelength/latest/developerguide/how-wavelengths-work.html#provider-owned-ip\\\">Carrier IP addresses</a> in the <i>Wavelength Developer\\n            Guide</i>.</p>\"\n                    }\n                },\n                \"AssociatePublicIpAddress\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Associates a public IPv4 address with eth0 for a new network interface.</p>\\n         <p>Amazon Web Services charges for all public IPv4 addresses, including public IPv4 addresses \\nassociated with running instances and Elastic IP addresses. For more information, see the <i>Public IPv4 Address</i> tab on the <a href=\\\"http://aws.amazon.com/vpc/pricing/\\\">Amazon VPC pricing page</a>.</p>\"\n                    }\n                },\n                \"DeleteOnTermination\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether the network interface is deleted when the instance is\\n            terminated.</p>\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A description for the network interface.</p>\"\n                    }\n                },\n                \"DeviceIndex\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The device index for the network interface attachment. The primary network interface\\n            has a device index of 0. Each network interface is of type <code>interface</code>, you\\n            must specify a device index. If you create a launch template that includes secondary\\n            network interfaces but not a primary network interface, then you must add a primary\\n            network interface as a launch parameter when you launch an instance from the\\n            template.</p>\"\n                    }\n                },\n                \"Groups\": {\n                    \"target\": \"com.amazonaws.ec2#SecurityGroupIdStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of one or more security groups.</p>\",\n                        \"smithy.api#xmlName\": \"SecurityGroupId\"\n                    }\n                },\n                \"InterfaceType\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of network interface. To create an Elastic Fabric Adapter (EFA), specify\\n                <code>efa</code> or <code>efa</code>. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/efa.html\\\">Elastic Fabric Adapter for AI/ML\\n                and HPC workloads on Amazon EC2</a> in the\\n            <i>Amazon EC2 User Guide</i>.</p>\\n         <p>If you are not creating an EFA, specify <code>interface</code> or omit this\\n            parameter.</p>\\n         <p>If you specify <code>efa-only</code>, do not assign any IP addresses to the network\\n            interface. EFA-only network interfaces do not support IP addresses.</p>\\n         <p>Valid values: <code>interface</code> | <code>efa</code> | <code>efa-only</code>\\n         </p>\"\n                    }\n                },\n                \"Ipv6AddressCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of IPv6 addresses to assign to a network interface. Amazon EC2\\n            automatically selects the IPv6 addresses from the subnet range. You can't use this\\n            option if specifying specific IPv6 addresses.</p>\"\n                    }\n                },\n                \"Ipv6Addresses\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceIpv6AddressListRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more specific IPv6 addresses from the IPv6 CIDR block range of your subnet. You\\n            can't use this option if you're specifying a number of IPv6 addresses.</p>\"\n                    }\n                },\n                \"NetworkInterfaceId\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInterfaceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the network interface.</p>\"\n                    }\n                },\n                \"PrivateIpAddress\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The primary private IPv4 address of the network interface.</p>\"\n                    }\n                },\n                \"PrivateIpAddresses\": {\n                    \"target\": \"com.amazonaws.ec2#PrivateIpAddressSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more private IPv4 addresses.</p>\"\n                    }\n                },\n                \"SecondaryPrivateIpAddressCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of secondary private IPv4 addresses to assign to a network\\n            interface.</p>\"\n                    }\n                },\n                \"SubnetId\": {\n                    \"target\": \"com.amazonaws.ec2#SubnetId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the subnet for the network interface.</p>\"\n                    }\n                },\n                \"NetworkCardIndex\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The index of the network card. Some instance types support multiple network cards. The\\n            primary network interface must be assigned to network card index 0. The default is\\n            network card index 0.</p>\"\n                    }\n                },\n                \"Ipv4Prefixes\": {\n                    \"target\": \"com.amazonaws.ec2#Ipv4PrefixList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more IPv4 prefixes to be assigned to the network interface. You cannot use this\\n            option if you use the <code>Ipv4PrefixCount</code> option.</p>\",\n                        \"smithy.api#xmlName\": \"Ipv4Prefix\"\n                    }\n                },\n                \"Ipv4PrefixCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of IPv4 prefixes to be automatically assigned to the network interface. You\\n            cannot use this option if you use the <code>Ipv4Prefix</code> option.</p>\"\n                    }\n                },\n                \"Ipv6Prefixes\": {\n                    \"target\": \"com.amazonaws.ec2#Ipv6PrefixList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more IPv6 prefixes to be assigned to the network interface. You cannot use this\\n            option if you use the <code>Ipv6PrefixCount</code> option.</p>\",\n                        \"smithy.api#xmlName\": \"Ipv6Prefix\"\n                    }\n                },\n                \"Ipv6PrefixCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of IPv6 prefixes to be automatically assigned to the network interface. You\\n            cannot use this option if you use the <code>Ipv6Prefix</code> option.</p>\"\n                    }\n                },\n                \"PrimaryIpv6\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The primary IPv6 address of the network interface. When you enable an IPv6 GUA address\\n            to be a primary IPv6, the first IPv6 GUA will be made the primary IPv6 address until the\\n            instance is terminated or the network interface is detached. For more information about\\n            primary IPv6 addresses, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RunInstances.html\\\">RunInstances</a>.</p>\"\n                    }\n                },\n                \"EnaSrdSpecification\": {\n                    \"target\": \"com.amazonaws.ec2#EnaSrdSpecificationRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Configure ENA Express settings for your launch template.</p>\"\n                    }\n                },\n                \"ConnectionTrackingSpecification\": {\n                    \"target\": \"com.amazonaws.ec2#ConnectionTrackingSpecificationRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A security group connection tracking specification that enables you to set the timeout\\n            for connection tracking on an Elastic network interface. For more information, see\\n                <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/security-group-connection-tracking.html#connection-tracking-timeouts\\\">Idle connection tracking timeout</a> in the\\n                <i>Amazon EC2 User Guide</i>.</p>\"\n                    }\n                },\n                \"EnaQueueCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of ENA queues to be created with the instance.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The parameters for a network interface.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#LaunchTemplateInstanceNetworkInterfaceSpecificationRequestList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#LaunchTemplateInstanceNetworkInterfaceSpecificationRequest\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"InstanceNetworkInterfaceSpecification\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#LaunchTemplateLicenseConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LicenseConfigurationArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LicenseConfigurationArn\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the license configuration.</p>\",\n                        \"smithy.api#xmlName\": \"licenseConfigurationArn\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a license configuration.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#LaunchTemplateLicenseConfigurationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LicenseConfigurationArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the license configuration.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a license configuration.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#LaunchTemplateLicenseList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#LaunchTemplateLicenseConfiguration\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#LaunchTemplateLicenseSpecificationListRequest\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#LaunchTemplateLicenseConfigurationRequest\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#LaunchTemplateName\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 3,\n                    \"max\": 128\n                },\n                \"smithy.api#pattern\": \"^[a-zA-Z0-9\\\\(\\\\)\\\\.\\\\-/_]+$\"\n            }\n        },\n        \"com.amazonaws.ec2#LaunchTemplateNameStringList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#LaunchTemplateName\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#LaunchTemplateNetworkPerformanceOptions\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"BandwidthWeighting\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceBandwidthWeighting\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"BandwidthWeighting\",\n                        \"smithy.api#documentation\": \"<p>When you configure network bandwidth weighting, you can boost baseline bandwidth for\\n            either networking or EBS by up to 25%. The total available baseline bandwidth for your\\n            instance remains the same. The default option uses the standard bandwidth configuration\\n            for your instance type.</p>\",\n                        \"smithy.api#xmlName\": \"bandwidthWeighting\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>With network performance options, you can adjust your bandwidth preferences to meet\\n            the needs of the workload that runs on your instance at launch.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#LaunchTemplateNetworkPerformanceOptionsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"BandwidthWeighting\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceBandwidthWeighting\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify the bandwidth weighting option to boost the associated type of baseline\\n            bandwidth, as follows:</p>\\n         <dl>\\n            <dt>default</dt>\\n            <dd>\\n               <p>This option uses the standard bandwidth configuration for your instance\\n                        type.</p>\\n            </dd>\\n            <dt>vpc-1</dt>\\n            <dd>\\n               <p>This option boosts your networking baseline bandwidth and reduces your EBS\\n                        baseline bandwidth.</p>\\n            </dd>\\n            <dt>ebs-1</dt>\\n            <dd>\\n               <p>This option boosts your EBS baseline bandwidth and reduces your networking\\n                        baseline bandwidth.</p>\\n            </dd>\\n         </dl>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>When you configure network performance options in your launch template, your instance\\n            is geared for performance improvements based on the workload that it runs as soon as\\n            it's available.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#LaunchTemplateOverrides\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceType\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceType\",\n                        \"smithy.api#documentation\": \"<p>The instance type.</p>\",\n                        \"smithy.api#xmlName\": \"instanceType\"\n                    }\n                },\n                \"SpotPrice\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SpotPrice\",\n                        \"smithy.api#documentation\": \"<p>The maximum price per unit hour that you are willing to pay for a Spot Instance. We do not recommend using this parameter because it can lead to \\n         increased interruptions. If you do not specify this parameter, you will pay the current Spot price.</p>\\n         <important>\\n            <p>If you specify a maximum price, your instances will be interrupted more frequently than if you do not specify this parameter.</p>\\n         </important>\",\n                        \"smithy.api#xmlName\": \"spotPrice\"\n                    }\n                },\n                \"SubnetId\": {\n                    \"target\": \"com.amazonaws.ec2#SubnetId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SubnetId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the subnet in which to launch the instances.</p>\",\n                        \"smithy.api#xmlName\": \"subnetId\"\n                    }\n                },\n                \"AvailabilityZone\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AvailabilityZone\",\n                        \"smithy.api#documentation\": \"<p>The Availability Zone in which to launch the instances.</p>\",\n                        \"smithy.api#xmlName\": \"availabilityZone\"\n                    }\n                },\n                \"WeightedCapacity\": {\n                    \"target\": \"com.amazonaws.ec2#Double\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"WeightedCapacity\",\n                        \"smithy.api#documentation\": \"<p>The number of units provided by the specified instance type. These are the same units\\n         that you chose to set the target capacity in terms of instances, or a performance\\n         characteristic such as vCPUs, memory, or I/O.</p>\\n         <p>If the target capacity divided by this value is not a whole number, Amazon EC2 rounds the\\n         number of instances to the next whole number. If this value is not specified, the default\\n         is 1.</p>\\n         <note>\\n            <p>When specifying weights, the price used in the <code>lowestPrice</code> and\\n            <code>priceCapacityOptimized</code> allocation strategies is per\\n            <i>unit</i> hour (where the instance price is divided by the specified\\n            weight). However, if all the specified weights are above the requested\\n            <code>TargetCapacity</code>, resulting in only 1 instance being launched, the price\\n            used is per <i>instance</i> hour.</p>\\n         </note>\",\n                        \"smithy.api#xmlName\": \"weightedCapacity\"\n                    }\n                },\n                \"Priority\": {\n                    \"target\": \"com.amazonaws.ec2#Double\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Priority\",\n                        \"smithy.api#documentation\": \"<p>The priority for the launch template override. The highest priority is launched\\n         first.</p>\\n         <p>If <code>OnDemandAllocationStrategy</code> is set to <code>prioritized</code>, Spot Fleet\\n         uses priority to determine which launch template override to use first in fulfilling\\n         On-Demand capacity.</p>\\n         <p>If the Spot <code>AllocationStrategy</code> is set to\\n         <code>capacityOptimizedPrioritized</code>, Spot Fleet uses priority on a best-effort basis\\n         to determine which launch template override to use in fulfilling Spot capacity, but\\n         optimizes for capacity first.</p>\\n         <p>Valid values are whole numbers starting at <code>0</code>. The lower the number, the\\n         higher the priority. If no number is set, the launch template override has the lowest\\n         priority. You can set the same priority for different launch template overrides.</p>\",\n                        \"smithy.api#xmlName\": \"priority\"\n                    }\n                },\n                \"InstanceRequirements\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceRequirements\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceRequirements\",\n                        \"smithy.api#documentation\": \"<p>The instance requirements. When you specify instance requirements, Amazon EC2 will identify\\n         instance types with the provided requirements, and then use your On-Demand and Spot\\n         allocation strategies to launch instances from these instance types, in the same way as\\n         when you specify a list of instance types.</p>\\n         <note>\\n            <p>If you specify <code>InstanceRequirements</code>, you can't specify\\n            <code>InstanceType</code>.</p>\\n         </note>\",\n                        \"smithy.api#xmlName\": \"instanceRequirements\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes overrides for a launch template.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#LaunchTemplateOverridesList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#LaunchTemplateOverrides\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#LaunchTemplatePlacement\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AvailabilityZone\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AvailabilityZone\",\n                        \"smithy.api#documentation\": \"<p>The Availability Zone of the instance.</p>\",\n                        \"smithy.api#xmlName\": \"availabilityZone\"\n                    }\n                },\n                \"AvailabilityZoneId\": {\n                    \"target\": \"com.amazonaws.ec2#AvailabilityZoneId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AvailabilityZoneId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Availability Zone of the instance.</p>\",\n                        \"smithy.api#xmlName\": \"availabilityZoneId\"\n                    }\n                },\n                \"Affinity\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Affinity\",\n                        \"smithy.api#documentation\": \"<p>The affinity setting for the instance on the Dedicated Host.</p>\",\n                        \"smithy.api#xmlName\": \"affinity\"\n                    }\n                },\n                \"GroupName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"GroupName\",\n                        \"smithy.api#documentation\": \"<p>The name of the placement group for the instance.</p>\",\n                        \"smithy.api#xmlName\": \"groupName\"\n                    }\n                },\n                \"HostId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"HostId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Dedicated Host for the instance.</p>\",\n                        \"smithy.api#xmlName\": \"hostId\"\n                    }\n                },\n                \"Tenancy\": {\n                    \"target\": \"com.amazonaws.ec2#Tenancy\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Tenancy\",\n                        \"smithy.api#documentation\": \"<p>The tenancy of the instance. An instance with a tenancy of <code>dedicated</code> runs\\n            on single-tenant hardware. </p>\",\n                        \"smithy.api#xmlName\": \"tenancy\"\n                    }\n                },\n                \"SpreadDomain\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SpreadDomain\",\n                        \"smithy.api#documentation\": \"<p>Reserved for future use.</p>\",\n                        \"smithy.api#xmlName\": \"spreadDomain\"\n                    }\n                },\n                \"HostResourceGroupArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"HostResourceGroupArn\",\n                        \"smithy.api#documentation\": \"<p>The ARN of the host resource group in which to launch the instances. </p>\",\n                        \"smithy.api#xmlName\": \"hostResourceGroupArn\"\n                    }\n                },\n                \"PartitionNumber\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PartitionNumber\",\n                        \"smithy.api#documentation\": \"<p>The number of the partition the instance should launch in. Valid only if the placement\\n            group strategy is set to <code>partition</code>.</p>\",\n                        \"smithy.api#xmlName\": \"partitionNumber\"\n                    }\n                },\n                \"GroupId\": {\n                    \"target\": \"com.amazonaws.ec2#PlacementGroupId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"GroupId\",\n                        \"smithy.api#documentation\": \"<p>The Group ID of the placement group. You must specify the Placement Group <b>Group ID</b> to launch an instance in a shared placement\\n            group.</p>\",\n                        \"smithy.api#xmlName\": \"groupId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the placement of an instance.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#LaunchTemplatePlacementRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AvailabilityZone\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Availability Zone for the instance.</p>\\n         <p>Either <code>AvailabilityZone</code> or <code>AvailabilityZoneId</code> can be specified, but not both</p>\"\n                    }\n                },\n                \"AvailabilityZoneId\": {\n                    \"target\": \"com.amazonaws.ec2#AvailabilityZoneId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the Availability Zone for the instance.</p>\\n         <p>Either <code>AvailabilityZone</code> or <code>AvailabilityZoneId</code> can be specified, but not both</p>\"\n                    }\n                },\n                \"Affinity\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The affinity setting for an instance on a Dedicated Host.</p>\"\n                    }\n                },\n                \"GroupName\": {\n                    \"target\": \"com.amazonaws.ec2#PlacementGroupName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the placement group for the instance.</p>\"\n                    }\n                },\n                \"HostId\": {\n                    \"target\": \"com.amazonaws.ec2#DedicatedHostId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the Dedicated Host for the instance.</p>\"\n                    }\n                },\n                \"Tenancy\": {\n                    \"target\": \"com.amazonaws.ec2#Tenancy\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tenancy of the instance. An instance with a tenancy of dedicated runs on\\n            single-tenant hardware.</p>\"\n                    }\n                },\n                \"SpreadDomain\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Reserved for future use.</p>\"\n                    }\n                },\n                \"HostResourceGroupArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the host resource group in which to launch the instances. If you specify a\\n            host resource group ARN, omit the <b>Tenancy</b> parameter or\\n            set it to <code>host</code>.</p>\"\n                    }\n                },\n                \"PartitionNumber\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of the partition the instance should launch in. Valid only if the placement\\n            group strategy is set to <code>partition</code>.</p>\"\n                    }\n                },\n                \"GroupId\": {\n                    \"target\": \"com.amazonaws.ec2#PlacementGroupId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Group Id of a placement group. You must specify the Placement Group <b>Group Id</b> to launch an instance in a shared placement\\n            group.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the placement of an instance.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#LaunchTemplatePrivateDnsNameOptions\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"HostnameType\": {\n                    \"target\": \"com.amazonaws.ec2#HostnameType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"HostnameType\",\n                        \"smithy.api#documentation\": \"<p>The type of hostname to assign to an instance.</p>\",\n                        \"smithy.api#xmlName\": \"hostnameType\"\n                    }\n                },\n                \"EnableResourceNameDnsARecord\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EnableResourceNameDnsARecord\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether to respond to DNS queries for instance hostnames with DNS A\\n            records.</p>\",\n                        \"smithy.api#xmlName\": \"enableResourceNameDnsARecord\"\n                    }\n                },\n                \"EnableResourceNameDnsAAAARecord\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EnableResourceNameDnsAAAARecord\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether to respond to DNS queries for instance hostnames with DNS AAAA\\n            records.</p>\",\n                        \"smithy.api#xmlName\": \"enableResourceNameDnsAAAARecord\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the options for instance hostnames.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#LaunchTemplatePrivateDnsNameOptionsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"HostnameType\": {\n                    \"target\": \"com.amazonaws.ec2#HostnameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of hostname for Amazon EC2 instances. For IPv4 only subnets, an instance DNS name\\n            must be based on the instance IPv4 address. For IPv6 native subnets, an instance DNS\\n            name must be based on the instance ID. For dual-stack subnets, you can specify whether\\n            DNS names use the instance IPv4 address or the instance ID.</p>\"\n                    }\n                },\n                \"EnableResourceNameDnsARecord\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether to respond to DNS queries for instance hostnames with DNS A\\n            records.</p>\"\n                    }\n                },\n                \"EnableResourceNameDnsAAAARecord\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether to respond to DNS queries for instance hostnames with DNS AAAA\\n            records.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the options for instance hostnames.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#LaunchTemplateSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#LaunchTemplate\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#LaunchTemplateSpecification\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LaunchTemplateId\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplateId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the launch template.</p>\\n         <p>You must specify either the launch template ID or the\\n            launch template name, but not both.</p>\"\n                    }\n                },\n                \"LaunchTemplateName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the launch template.</p>\\n         <p>You must specify either the launch template ID or the\\n            launch template name, but not both.</p>\"\n                    }\n                },\n                \"Version\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The launch template version number, <code>$Latest</code>, or\\n            <code>$Default</code>.</p>\\n         <p>A value of <code>$Latest</code> uses the latest version of the launch template.</p>\\n         <p>A value of <code>$Default</code> uses the default version of the launch template.</p>\\n         <p>Default: The default version of the launch template.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the launch template to use.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#LaunchTemplateSpotMarketOptions\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"MaxPrice\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MaxPrice\",\n                        \"smithy.api#documentation\": \"<p>The maximum hourly price you're willing to pay for a Spot Instance. We do not\\n            recommend using this parameter because it can lead to increased interruptions. If you do\\n            not specify this parameter, you will pay the current Spot price. If you do specify this\\n            parameter, it must be more than USD $0.001. Specifying a value below USD $0.001 will\\n            result in an <code>InvalidParameterValue</code> error message when the launch template\\n            is used to launch an instance.</p>\",\n                        \"smithy.api#xmlName\": \"maxPrice\"\n                    }\n                },\n                \"SpotInstanceType\": {\n                    \"target\": \"com.amazonaws.ec2#SpotInstanceType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SpotInstanceType\",\n                        \"smithy.api#documentation\": \"<p>The Spot Instance request type.</p>\",\n                        \"smithy.api#xmlName\": \"spotInstanceType\"\n                    }\n                },\n                \"BlockDurationMinutes\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"BlockDurationMinutes\",\n                        \"smithy.api#documentation\": \"<p>The required duration for the Spot Instances (also known as Spot blocks), in minutes.\\n            This value must be a multiple of 60 (60, 120, 180, 240, 300, or 360).</p>\",\n                        \"smithy.api#xmlName\": \"blockDurationMinutes\"\n                    }\n                },\n                \"ValidUntil\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ValidUntil\",\n                        \"smithy.api#documentation\": \"<p>The end date of the request. For a one-time request, the request remains active until\\n            all instances launch, the request is canceled, or this date is reached. If the request\\n            is persistent, it remains active until it is canceled or this date and time is\\n            reached.</p>\",\n                        \"smithy.api#xmlName\": \"validUntil\"\n                    }\n                },\n                \"InstanceInterruptionBehavior\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceInterruptionBehavior\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceInterruptionBehavior\",\n                        \"smithy.api#documentation\": \"<p>The behavior when a Spot Instance is interrupted.</p>\",\n                        \"smithy.api#xmlName\": \"instanceInterruptionBehavior\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The options for Spot Instances.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#LaunchTemplateSpotMarketOptionsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"MaxPrice\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum hourly price you're willing to pay for a Spot Instance. We do not\\n            recommend using this parameter because it can lead to increased interruptions. If you do\\n            not specify this parameter, you will pay the current Spot price. If you do specify this\\n            parameter, it must be more than USD $0.001. Specifying a value below USD $0.001 will\\n            result in an <code>InvalidParameterValue</code> error message when the launch template\\n            is used to launch an instance.</p>\\n         <important>\\n            <p>If you specify a maximum price, your Spot Instances will be interrupted more\\n                frequently than if you do not specify this parameter.</p>\\n         </important>\"\n                    }\n                },\n                \"SpotInstanceType\": {\n                    \"target\": \"com.amazonaws.ec2#SpotInstanceType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Spot Instance request type.</p>\"\n                    }\n                },\n                \"BlockDurationMinutes\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Deprecated.</p>\"\n                    }\n                },\n                \"ValidUntil\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The end date of the request, in UTC format\\n                (<i>YYYY-MM-DD</i>T<i>HH:MM:SS</i>Z). Supported only for\\n            persistent requests.</p>\\n         <ul>\\n            <li>\\n               <p>For a persistent request, the request remains active until the\\n                        <code>ValidUntil</code> date and time is reached. Otherwise, the request\\n                    remains active until you cancel it.</p>\\n            </li>\\n            <li>\\n               <p>For a one-time request, <code>ValidUntil</code> is not supported. The request\\n                    remains active until all instances launch or you cancel the request.</p>\\n            </li>\\n         </ul>\\n         <p>Default: 7 days from the current date</p>\"\n                    }\n                },\n                \"InstanceInterruptionBehavior\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceInterruptionBehavior\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The behavior when a Spot Instance is interrupted. The default is\\n                <code>terminate</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The options for Spot Instances.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#LaunchTemplateTagSpecification\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ResourceType\": {\n                    \"target\": \"com.amazonaws.ec2#ResourceType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResourceType\",\n                        \"smithy.api#documentation\": \"<p>The type of resource to tag.</p>\",\n                        \"smithy.api#xmlName\": \"resourceType\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>The tags for the resource.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The tags specification for the launch template.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#LaunchTemplateTagSpecificationList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#LaunchTemplateTagSpecification\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#LaunchTemplateTagSpecificationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ResourceType\": {\n                    \"target\": \"com.amazonaws.ec2#ResourceType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of resource to tag.</p>\\n         <p>Valid Values lists all resource types for Amazon EC2 that can be tagged. When you\\n            create a launch template, you can specify tags for the following resource types only:\\n                <code>instance</code> | <code>volume</code> |\\n            <code>network-interface</code> | <code>spot-instances-request</code>. If the instance\\n            does not include the resource type that you specify, the instance launch fails. For\\n            example, not all instance types include a volume.</p>\\n         <p>To tag a resource after it has been created, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateTags.html\\\">CreateTags</a>.</p>\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags to apply to the resource.</p>\",\n                        \"smithy.api#xmlName\": \"Tag\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The tags specification for the resources that are created during instance\\n            launch.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#LaunchTemplateTagSpecificationRequestList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#LaunchTemplateTagSpecificationRequest\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"LaunchTemplateTagSpecificationRequest\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#LaunchTemplateVersion\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LaunchTemplateId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LaunchTemplateId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the launch template.</p>\",\n                        \"smithy.api#xmlName\": \"launchTemplateId\"\n                    }\n                },\n                \"LaunchTemplateName\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplateName\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LaunchTemplateName\",\n                        \"smithy.api#documentation\": \"<p>The name of the launch template.</p>\",\n                        \"smithy.api#xmlName\": \"launchTemplateName\"\n                    }\n                },\n                \"VersionNumber\": {\n                    \"target\": \"com.amazonaws.ec2#Long\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VersionNumber\",\n                        \"smithy.api#documentation\": \"<p>The version number.</p>\",\n                        \"smithy.api#xmlName\": \"versionNumber\"\n                    }\n                },\n                \"VersionDescription\": {\n                    \"target\": \"com.amazonaws.ec2#VersionDescription\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VersionDescription\",\n                        \"smithy.api#documentation\": \"<p>The description for the version.</p>\",\n                        \"smithy.api#xmlName\": \"versionDescription\"\n                    }\n                },\n                \"CreateTime\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CreateTime\",\n                        \"smithy.api#documentation\": \"<p>The time the version was created.</p>\",\n                        \"smithy.api#xmlName\": \"createTime\"\n                    }\n                },\n                \"CreatedBy\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CreatedBy\",\n                        \"smithy.api#documentation\": \"<p>The principal that created the version.</p>\",\n                        \"smithy.api#xmlName\": \"createdBy\"\n                    }\n                },\n                \"DefaultVersion\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DefaultVersion\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether the version is the default version.</p>\",\n                        \"smithy.api#xmlName\": \"defaultVersion\"\n                    }\n                },\n                \"LaunchTemplateData\": {\n                    \"target\": \"com.amazonaws.ec2#ResponseLaunchTemplateData\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LaunchTemplateData\",\n                        \"smithy.api#documentation\": \"<p>Information about the launch template.</p>\",\n                        \"smithy.api#xmlName\": \"launchTemplateData\"\n                    }\n                },\n                \"Operator\": {\n                    \"target\": \"com.amazonaws.ec2#OperatorResponse\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Operator\",\n                        \"smithy.api#documentation\": \"<p>The entity that manages the launch template.</p>\",\n                        \"smithy.api#xmlName\": \"operator\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a launch template version.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#LaunchTemplateVersionSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#LaunchTemplateVersion\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#LaunchTemplatesMonitoring\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Enabled\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Enabled\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether detailed monitoring is enabled. Otherwise, basic monitoring is\\n            enabled.</p>\",\n                        \"smithy.api#xmlName\": \"enabled\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the monitoring for the instance.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#LaunchTemplatesMonitoringRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Enabled\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify <code>true</code> to enable detailed monitoring. Otherwise, basic monitoring\\n            is enabled.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the monitoring for the instance.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#LicenseConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LicenseConfigurationArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LicenseConfigurationArn\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the license configuration.</p>\",\n                        \"smithy.api#xmlName\": \"licenseConfigurationArn\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a license configuration.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#LicenseConfigurationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LicenseConfigurationArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the license configuration.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a license configuration.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#LicenseList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#LicenseConfiguration\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#LicenseSpecificationListRequest\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#LicenseConfigurationRequest\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ListImagesInRecycleBin\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ListImagesInRecycleBinRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ListImagesInRecycleBinResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Lists one or more AMIs that are currently in the Recycle Bin. For more information, see\\n      <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/recycle-bin.html\\\">Recycle\\n        Bin</a> in the <i>Amazon EC2 User Guide</i>.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"Images\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ListImagesInRecycleBinMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ListImagesInRecycleBinRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ImageIds\": {\n                    \"target\": \"com.amazonaws.ec2#ImageIdStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the AMIs to list. Omit this parameter to list all of the AMIs that are in the\\n      Recycle Bin. You can specify up to 20 IDs in a single request.</p>\",\n                        \"smithy.api#xmlName\": \"ImageId\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token returned from a previous paginated request. Pagination continues from the end of the items returned by the previous request.</p>\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#ListImagesInRecycleBinMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of items to return for this request.\\n         To get the next page of items, make another request with the token returned in the output.\\n\\t        For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Query-Requests.html#api-pagination\\\">Pagination</a>.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n\\t\\t\\tand provides an error response. If you have the required permissions, the error response is \\n\\t\\t\\t<code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ListImagesInRecycleBinResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Images\": {\n                    \"target\": \"com.amazonaws.ec2#ImageRecycleBinInfoList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ImageSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the AMIs.</p>\",\n                        \"smithy.api#xmlName\": \"imageSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to include in another request to get the next page of items. This value is <code>null</code> when there\\n         are no more items to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ListSnapshotsInRecycleBin\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ListSnapshotsInRecycleBinRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ListSnapshotsInRecycleBinResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Lists one or more snapshots that are currently in the Recycle Bin.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"Snapshots\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ListSnapshotsInRecycleBinMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 5,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ListSnapshotsInRecycleBinRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#ListSnapshotsInRecycleBinMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of items to return for this request.\\n\\tTo get the next page of items, make another request with the token returned in the output. \\n\\tFor more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Query-Requests.html#api-pagination\\\">Pagination</a>.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token returned from a previous paginated request.\\n  Pagination continues from the end of the items returned by the previous request.</p>\"\n                    }\n                },\n                \"SnapshotIds\": {\n                    \"target\": \"com.amazonaws.ec2#SnapshotIdStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the snapshots to list. Omit this parameter to list all of the \\n      snapshots that are in the Recycle Bin.</p>\",\n                        \"smithy.api#xmlName\": \"SnapshotId\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ListSnapshotsInRecycleBinResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Snapshots\": {\n                    \"target\": \"com.amazonaws.ec2#SnapshotRecycleBinInfoList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SnapshotSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the snapshots.</p>\",\n                        \"smithy.api#xmlName\": \"snapshotSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to include in another request to get the next page of items. \\n  This value is <code>null</code> when there are no more items to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ListingState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"available\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"available\"\n                    }\n                },\n                \"sold\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"sold\"\n                    }\n                },\n                \"cancelled\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"cancelled\"\n                    }\n                },\n                \"pending\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"pending\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ListingStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"active\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"active\"\n                    }\n                },\n                \"pending\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"pending\"\n                    }\n                },\n                \"cancelled\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"cancelled\"\n                    }\n                },\n                \"closed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"closed\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#LoadBalancerArn\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#LoadBalancersConfig\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ClassicLoadBalancersConfig\": {\n                    \"target\": \"com.amazonaws.ec2#ClassicLoadBalancersConfig\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ClassicLoadBalancersConfig\",\n                        \"smithy.api#documentation\": \"<p>The Classic Load Balancers.</p>\",\n                        \"smithy.api#xmlName\": \"classicLoadBalancersConfig\"\n                    }\n                },\n                \"TargetGroupsConfig\": {\n                    \"target\": \"com.amazonaws.ec2#TargetGroupsConfig\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TargetGroupsConfig\",\n                        \"smithy.api#documentation\": \"<p>The target groups.</p>\",\n                        \"smithy.api#xmlName\": \"targetGroupsConfig\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the Classic Load Balancers and target groups to attach to a Spot Fleet\\n            request.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#LoadPermission\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"UserId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"UserId\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID.</p>\",\n                        \"smithy.api#xmlName\": \"userId\"\n                    }\n                },\n                \"Group\": {\n                    \"target\": \"com.amazonaws.ec2#PermissionGroup\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Group\",\n                        \"smithy.api#documentation\": \"<p>The name of the group.</p>\",\n                        \"smithy.api#xmlName\": \"group\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a load permission.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#LoadPermissionList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#LoadPermission\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#LoadPermissionListRequest\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#LoadPermissionRequest\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#LoadPermissionModifications\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Add\": {\n                    \"target\": \"com.amazonaws.ec2#LoadPermissionListRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The load permissions to add.</p>\"\n                    }\n                },\n                \"Remove\": {\n                    \"target\": \"com.amazonaws.ec2#LoadPermissionListRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The load permissions to remove.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes modifications to the load permissions of an Amazon FPGA image (AFI).</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#LoadPermissionRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Group\": {\n                    \"target\": \"com.amazonaws.ec2#PermissionGroup\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the group.</p>\"\n                    }\n                },\n                \"UserId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a load permission.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#LocalGateway\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LocalGatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#LocalGatewayId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LocalGatewayId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the local gateway.</p>\",\n                        \"smithy.api#xmlName\": \"localGatewayId\"\n                    }\n                },\n                \"OutpostArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OutpostArn\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the Outpost.</p>\",\n                        \"smithy.api#xmlName\": \"outpostArn\"\n                    }\n                },\n                \"OwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OwnerId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Amazon Web Services account that owns the local gateway.</p>\",\n                        \"smithy.api#xmlName\": \"ownerId\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The state of the local gateway.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>The tags assigned to the local gateway.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a local gateway.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#LocalGatewayId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#LocalGatewayIdSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#LocalGatewayId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#LocalGatewayMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 5,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.ec2#LocalGatewayRoute\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DestinationCidrBlock\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DestinationCidrBlock\",\n                        \"smithy.api#documentation\": \"<p>The CIDR block used for destination matches.</p>\",\n                        \"smithy.api#xmlName\": \"destinationCidrBlock\"\n                    }\n                },\n                \"LocalGatewayVirtualInterfaceGroupId\": {\n                    \"target\": \"com.amazonaws.ec2#LocalGatewayVirtualInterfaceGroupId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LocalGatewayVirtualInterfaceGroupId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the virtual interface group.</p>\",\n                        \"smithy.api#xmlName\": \"localGatewayVirtualInterfaceGroupId\"\n                    }\n                },\n                \"Type\": {\n                    \"target\": \"com.amazonaws.ec2#LocalGatewayRouteType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Type\",\n                        \"smithy.api#documentation\": \"<p>The route type.</p>\",\n                        \"smithy.api#xmlName\": \"type\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#LocalGatewayRouteState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The state of the route.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                },\n                \"LocalGatewayRouteTableId\": {\n                    \"target\": \"com.amazonaws.ec2#LocalGatewayRoutetableId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LocalGatewayRouteTableId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the local gateway route table.</p>\",\n                        \"smithy.api#xmlName\": \"localGatewayRouteTableId\"\n                    }\n                },\n                \"LocalGatewayRouteTableArn\": {\n                    \"target\": \"com.amazonaws.ec2#ResourceArn\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LocalGatewayRouteTableArn\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the local gateway route table.</p>\",\n                        \"smithy.api#xmlName\": \"localGatewayRouteTableArn\"\n                    }\n                },\n                \"OwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OwnerId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Amazon Web Services account that owns the local gateway route.</p>\",\n                        \"smithy.api#xmlName\": \"ownerId\"\n                    }\n                },\n                \"SubnetId\": {\n                    \"target\": \"com.amazonaws.ec2#SubnetId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SubnetId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the subnet.</p>\",\n                        \"smithy.api#xmlName\": \"subnetId\"\n                    }\n                },\n                \"CoipPoolId\": {\n                    \"target\": \"com.amazonaws.ec2#CoipPoolId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CoipPoolId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the customer-owned address pool.</p>\",\n                        \"smithy.api#xmlName\": \"coipPoolId\"\n                    }\n                },\n                \"NetworkInterfaceId\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInterfaceId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkInterfaceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the network interface.</p>\",\n                        \"smithy.api#xmlName\": \"networkInterfaceId\"\n                    }\n                },\n                \"DestinationPrefixListId\": {\n                    \"target\": \"com.amazonaws.ec2#PrefixListResourceId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DestinationPrefixListId\",\n                        \"smithy.api#documentation\": \"<p>\\n         The ID of the prefix list.\\n      </p>\",\n                        \"smithy.api#xmlName\": \"destinationPrefixListId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a route for a local gateway route table.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#LocalGatewayRouteList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#LocalGatewayRoute\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#LocalGatewayRouteState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"pending\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"pending\"\n                    }\n                },\n                \"active\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"active\"\n                    }\n                },\n                \"blackhole\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"blackhole\"\n                    }\n                },\n                \"deleting\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"deleting\"\n                    }\n                },\n                \"deleted\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"deleted\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#LocalGatewayRouteTable\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LocalGatewayRouteTableId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LocalGatewayRouteTableId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the local gateway route table.</p>\",\n                        \"smithy.api#xmlName\": \"localGatewayRouteTableId\"\n                    }\n                },\n                \"LocalGatewayRouteTableArn\": {\n                    \"target\": \"com.amazonaws.ec2#ResourceArn\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LocalGatewayRouteTableArn\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the local gateway route table.</p>\",\n                        \"smithy.api#xmlName\": \"localGatewayRouteTableArn\"\n                    }\n                },\n                \"LocalGatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#LocalGatewayId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LocalGatewayId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the local gateway.</p>\",\n                        \"smithy.api#xmlName\": \"localGatewayId\"\n                    }\n                },\n                \"OutpostArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OutpostArn\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the Outpost.</p>\",\n                        \"smithy.api#xmlName\": \"outpostArn\"\n                    }\n                },\n                \"OwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OwnerId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Amazon Web Services account that owns the local gateway route table.</p>\",\n                        \"smithy.api#xmlName\": \"ownerId\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The state of the local gateway route table.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>The tags assigned to the local gateway route table.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                },\n                \"Mode\": {\n                    \"target\": \"com.amazonaws.ec2#LocalGatewayRouteTableMode\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Mode\",\n                        \"smithy.api#documentation\": \"<p>The mode of the local gateway route table.</p>\",\n                        \"smithy.api#xmlName\": \"mode\"\n                    }\n                },\n                \"StateReason\": {\n                    \"target\": \"com.amazonaws.ec2#StateReason\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"StateReason\",\n                        \"smithy.api#documentation\": \"<p>Information about the state change.</p>\",\n                        \"smithy.api#xmlName\": \"stateReason\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a local gateway route table.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#LocalGatewayRouteTableIdSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#LocalGatewayRoutetableId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#LocalGatewayRouteTableMode\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"direct_vpc_routing\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"direct-vpc-routing\"\n                    }\n                },\n                \"coip\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"coip\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#LocalGatewayRouteTableSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#LocalGatewayRouteTable\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#LocalGatewayRouteTableVirtualInterfaceGroupAssociation\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LocalGatewayRouteTableVirtualInterfaceGroupAssociationId\": {\n                    \"target\": \"com.amazonaws.ec2#LocalGatewayRouteTableVirtualInterfaceGroupAssociationId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LocalGatewayRouteTableVirtualInterfaceGroupAssociationId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the association.</p>\",\n                        \"smithy.api#xmlName\": \"localGatewayRouteTableVirtualInterfaceGroupAssociationId\"\n                    }\n                },\n                \"LocalGatewayVirtualInterfaceGroupId\": {\n                    \"target\": \"com.amazonaws.ec2#LocalGatewayVirtualInterfaceGroupId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LocalGatewayVirtualInterfaceGroupId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the virtual interface group.</p>\",\n                        \"smithy.api#xmlName\": \"localGatewayVirtualInterfaceGroupId\"\n                    }\n                },\n                \"LocalGatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LocalGatewayId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the local gateway.</p>\",\n                        \"smithy.api#xmlName\": \"localGatewayId\"\n                    }\n                },\n                \"LocalGatewayRouteTableId\": {\n                    \"target\": \"com.amazonaws.ec2#LocalGatewayId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LocalGatewayRouteTableId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the local gateway route table.</p>\",\n                        \"smithy.api#xmlName\": \"localGatewayRouteTableId\"\n                    }\n                },\n                \"LocalGatewayRouteTableArn\": {\n                    \"target\": \"com.amazonaws.ec2#ResourceArn\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LocalGatewayRouteTableArn\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the local gateway route table for the virtual interface group.</p>\",\n                        \"smithy.api#xmlName\": \"localGatewayRouteTableArn\"\n                    }\n                },\n                \"OwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OwnerId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Amazon Web Services account that owns the local gateway virtual interface group association.</p>\",\n                        \"smithy.api#xmlName\": \"ownerId\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The state of the association.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>The tags assigned to the association.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes an association between a local gateway route table and a virtual interface group.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#LocalGatewayRouteTableVirtualInterfaceGroupAssociationId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#LocalGatewayRouteTableVirtualInterfaceGroupAssociationIdSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#LocalGatewayRouteTableVirtualInterfaceGroupAssociationId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#LocalGatewayRouteTableVirtualInterfaceGroupAssociationSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#LocalGatewayRouteTableVirtualInterfaceGroupAssociation\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#LocalGatewayRouteTableVpcAssociation\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LocalGatewayRouteTableVpcAssociationId\": {\n                    \"target\": \"com.amazonaws.ec2#LocalGatewayRouteTableVpcAssociationId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LocalGatewayRouteTableVpcAssociationId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the association.</p>\",\n                        \"smithy.api#xmlName\": \"localGatewayRouteTableVpcAssociationId\"\n                    }\n                },\n                \"LocalGatewayRouteTableId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LocalGatewayRouteTableId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the local gateway route table.</p>\",\n                        \"smithy.api#xmlName\": \"localGatewayRouteTableId\"\n                    }\n                },\n                \"LocalGatewayRouteTableArn\": {\n                    \"target\": \"com.amazonaws.ec2#ResourceArn\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LocalGatewayRouteTableArn\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the local gateway route table for the association.</p>\",\n                        \"smithy.api#xmlName\": \"localGatewayRouteTableArn\"\n                    }\n                },\n                \"LocalGatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LocalGatewayId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the local gateway.</p>\",\n                        \"smithy.api#xmlName\": \"localGatewayId\"\n                    }\n                },\n                \"VpcId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the VPC.</p>\",\n                        \"smithy.api#xmlName\": \"vpcId\"\n                    }\n                },\n                \"OwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OwnerId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Amazon Web Services account that owns the local gateway route table for the association.</p>\",\n                        \"smithy.api#xmlName\": \"ownerId\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The state of the association.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>The tags assigned to the association.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes an association between a local gateway route table and a VPC.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#LocalGatewayRouteTableVpcAssociationId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#LocalGatewayRouteTableVpcAssociationIdSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#LocalGatewayRouteTableVpcAssociationId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#LocalGatewayRouteTableVpcAssociationSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#LocalGatewayRouteTableVpcAssociation\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#LocalGatewayRouteType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"static\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"static\"\n                    }\n                },\n                \"propagated\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"propagated\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#LocalGatewayRoutetableId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#LocalGatewaySet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#LocalGateway\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#LocalGatewayVirtualInterface\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LocalGatewayVirtualInterfaceId\": {\n                    \"target\": \"com.amazonaws.ec2#LocalGatewayVirtualInterfaceId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LocalGatewayVirtualInterfaceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the virtual interface.</p>\",\n                        \"smithy.api#xmlName\": \"localGatewayVirtualInterfaceId\"\n                    }\n                },\n                \"LocalGatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LocalGatewayId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the local gateway.</p>\",\n                        \"smithy.api#xmlName\": \"localGatewayId\"\n                    }\n                },\n                \"LocalGatewayVirtualInterfaceGroupId\": {\n                    \"target\": \"com.amazonaws.ec2#LocalGatewayVirtualInterfaceGroupId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LocalGatewayVirtualInterfaceGroupId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the local gateway virtual interface group.</p>\",\n                        \"smithy.api#xmlName\": \"localGatewayVirtualInterfaceGroupId\"\n                    }\n                },\n                \"LocalGatewayVirtualInterfaceArn\": {\n                    \"target\": \"com.amazonaws.ec2#ResourceArn\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LocalGatewayVirtualInterfaceArn\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Number (ARN) of the local gateway virtual interface.</p>\",\n                        \"smithy.api#xmlName\": \"localGatewayVirtualInterfaceArn\"\n                    }\n                },\n                \"OutpostLagId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OutpostLagId\",\n                        \"smithy.api#documentation\": \"<p>The Outpost LAG ID.</p>\",\n                        \"smithy.api#xmlName\": \"outpostLagId\"\n                    }\n                },\n                \"Vlan\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Vlan\",\n                        \"smithy.api#documentation\": \"<p>The ID of the VLAN.</p>\",\n                        \"smithy.api#xmlName\": \"vlan\"\n                    }\n                },\n                \"LocalAddress\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LocalAddress\",\n                        \"smithy.api#documentation\": \"<p>The local address.</p>\",\n                        \"smithy.api#xmlName\": \"localAddress\"\n                    }\n                },\n                \"PeerAddress\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PeerAddress\",\n                        \"smithy.api#documentation\": \"<p>The peer address.</p>\",\n                        \"smithy.api#xmlName\": \"peerAddress\"\n                    }\n                },\n                \"LocalBgpAsn\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LocalBgpAsn\",\n                        \"smithy.api#documentation\": \"<p>The Border Gateway Protocol (BGP) Autonomous System Number (ASN) of the local gateway.</p>\",\n                        \"smithy.api#xmlName\": \"localBgpAsn\"\n                    }\n                },\n                \"PeerBgpAsn\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PeerBgpAsn\",\n                        \"smithy.api#documentation\": \"<p>The peer BGP ASN.</p>\",\n                        \"smithy.api#xmlName\": \"peerBgpAsn\"\n                    }\n                },\n                \"PeerBgpAsnExtended\": {\n                    \"target\": \"com.amazonaws.ec2#Long\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PeerBgpAsnExtended\",\n                        \"smithy.api#documentation\": \"<p>The extended 32-bit ASN of the BGP peer for use with larger ASN values.</p>\",\n                        \"smithy.api#xmlName\": \"peerBgpAsnExtended\"\n                    }\n                },\n                \"OwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OwnerId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Amazon Web Services account that owns the local gateway virtual interface.</p>\",\n                        \"smithy.api#xmlName\": \"ownerId\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>The tags assigned to the virtual interface.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                },\n                \"ConfigurationState\": {\n                    \"target\": \"com.amazonaws.ec2#LocalGatewayVirtualInterfaceConfigurationState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ConfigurationState\",\n                        \"smithy.api#documentation\": \"<p>The current state of the local gateway virtual interface.</p>\",\n                        \"smithy.api#xmlName\": \"configurationState\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a local gateway virtual interface.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#LocalGatewayVirtualInterfaceConfigurationState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"pending\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"pending\"\n                    }\n                },\n                \"available\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"available\"\n                    }\n                },\n                \"deleting\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"deleting\"\n                    }\n                },\n                \"deleted\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"deleted\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#LocalGatewayVirtualInterfaceGroup\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LocalGatewayVirtualInterfaceGroupId\": {\n                    \"target\": \"com.amazonaws.ec2#LocalGatewayVirtualInterfaceGroupId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LocalGatewayVirtualInterfaceGroupId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the virtual interface group.</p>\",\n                        \"smithy.api#xmlName\": \"localGatewayVirtualInterfaceGroupId\"\n                    }\n                },\n                \"LocalGatewayVirtualInterfaceIds\": {\n                    \"target\": \"com.amazonaws.ec2#LocalGatewayVirtualInterfaceIdSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LocalGatewayVirtualInterfaceIdSet\",\n                        \"smithy.api#documentation\": \"<p>The IDs of the virtual interfaces.</p>\",\n                        \"smithy.api#xmlName\": \"localGatewayVirtualInterfaceIdSet\"\n                    }\n                },\n                \"LocalGatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LocalGatewayId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the local gateway.</p>\",\n                        \"smithy.api#xmlName\": \"localGatewayId\"\n                    }\n                },\n                \"OwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OwnerId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Amazon Web Services account that owns the local gateway virtual interface group.</p>\",\n                        \"smithy.api#xmlName\": \"ownerId\"\n                    }\n                },\n                \"LocalBgpAsn\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LocalBgpAsn\",\n                        \"smithy.api#documentation\": \"<p>The Autonomous System Number(ASN) for the local Border Gateway Protocol (BGP).</p>\",\n                        \"smithy.api#xmlName\": \"localBgpAsn\"\n                    }\n                },\n                \"LocalBgpAsnExtended\": {\n                    \"target\": \"com.amazonaws.ec2#Long\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LocalBgpAsnExtended\",\n                        \"smithy.api#documentation\": \"<p>The extended 32-bit ASN for the local BGP configuration.</p>\",\n                        \"smithy.api#xmlName\": \"localBgpAsnExtended\"\n                    }\n                },\n                \"LocalGatewayVirtualInterfaceGroupArn\": {\n                    \"target\": \"com.amazonaws.ec2#ResourceArn\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LocalGatewayVirtualInterfaceGroupArn\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Number (ARN) of the local gateway virtual interface group.</p>\",\n                        \"smithy.api#xmlName\": \"localGatewayVirtualInterfaceGroupArn\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>The tags assigned to the virtual interface group.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                },\n                \"ConfigurationState\": {\n                    \"target\": \"com.amazonaws.ec2#LocalGatewayVirtualInterfaceGroupConfigurationState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ConfigurationState\",\n                        \"smithy.api#documentation\": \"<p>The current state of the local gateway virtual interface group.</p>\",\n                        \"smithy.api#xmlName\": \"configurationState\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a local gateway virtual interface group.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#LocalGatewayVirtualInterfaceGroupConfigurationState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"pending\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"pending\"\n                    }\n                },\n                \"incomplete\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"incomplete\"\n                    }\n                },\n                \"available\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"available\"\n                    }\n                },\n                \"deleting\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"deleting\"\n                    }\n                },\n                \"deleted\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"deleted\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#LocalGatewayVirtualInterfaceGroupId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#LocalGatewayVirtualInterfaceGroupIdSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#LocalGatewayVirtualInterfaceGroupId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#LocalGatewayVirtualInterfaceGroupSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#LocalGatewayVirtualInterfaceGroup\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#LocalGatewayVirtualInterfaceId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#LocalGatewayVirtualInterfaceIdSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#LocalGatewayVirtualInterfaceId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#LocalGatewayVirtualInterfaceSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#LocalGatewayVirtualInterface\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#LocalStorage\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"INCLUDED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"included\"\n                    }\n                },\n                \"REQUIRED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"required\"\n                    }\n                },\n                \"EXCLUDED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"excluded\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#LocalStorageType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"HDD\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"hdd\"\n                    }\n                },\n                \"SSD\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ssd\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#LocalStorageTypeSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#LocalStorageType\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#Location\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#LocationType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"region\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"region\"\n                    }\n                },\n                \"availability_zone\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"availability-zone\"\n                    }\n                },\n                \"availability_zone_id\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"availability-zone-id\"\n                    }\n                },\n                \"outpost\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"outpost\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#LockMode\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"compliance\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"compliance\"\n                    }\n                },\n                \"governance\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"governance\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#LockSnapshot\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#LockSnapshotRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#LockSnapshotResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Locks an Amazon EBS snapshot in either <i>governance</i> or <i>compliance</i> \\n      mode to protect it against accidental or malicious deletions for a specific duration. A locked snapshot \\n      can't be deleted.</p>\\n         <p>You can also use this action to modify the lock settings for a snapshot that is already locked. The \\n      allowed modifications depend on the lock mode and lock state:</p>\\n         <ul>\\n            <li>\\n               <p>If the snapshot is locked in governance mode, you can modify the lock mode and the lock duration \\n            or lock expiration date.</p>\\n            </li>\\n            <li>\\n               <p>If the snapshot is locked in compliance mode and it is in the cooling-off period, you can modify \\n            the lock mode and the lock duration or lock expiration date.</p>\\n            </li>\\n            <li>\\n               <p>If the snapshot is locked in compliance mode and the cooling-off period has lapsed, you can \\n            only increase the lock duration or extend the lock expiration date.</p>\\n            </li>\\n         </ul>\"\n            }\n        },\n        \"com.amazonaws.ec2#LockSnapshotRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SnapshotId\": {\n                    \"target\": \"com.amazonaws.ec2#SnapshotId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the snapshot to lock.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"LockMode\": {\n                    \"target\": \"com.amazonaws.ec2#LockMode\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The mode in which to lock the snapshot. Specify one of the following:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>governance</code> - Locks the snapshot in governance mode. Snapshots locked in governance \\n          mode can't be deleted until one of the following conditions are met:</p>\\n               <ul>\\n                  <li>\\n                     <p>The lock duration expires.</p>\\n                  </li>\\n                  <li>\\n                     <p>The snapshot is unlocked by a user with the appropriate permissions.</p>\\n                  </li>\\n               </ul>\\n               <p>Users with the appropriate IAM permissions can unlock the snapshot, increase or decrease the lock \\n          duration, and change the lock mode to <code>compliance</code> at any time.</p>\\n               <p>If you lock a snapshot in <code>governance</code> mode, omit <b>\\n          CoolOffPeriod</b>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>compliance</code> - Locks the snapshot in compliance mode. Snapshots locked in compliance \\n          mode can't be unlocked by any user. They can be deleted only after the lock duration expires. Users \\n          can't decrease the lock duration or change the lock mode to <code>governance</code>. However, users \\n          with appropriate IAM permissions can increase the lock duration at any time.</p>\\n               <p>If you lock a snapshot in <code>compliance</code> mode, you can optionally specify \\n          <b>CoolOffPeriod</b>.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"CoolOffPeriod\": {\n                    \"target\": \"com.amazonaws.ec2#CoolOffPeriodRequestHours\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The cooling-off period during which you can unlock the snapshot or modify the lock settings after \\n      locking the snapshot in compliance mode, in hours. After the cooling-off period expires, you can't \\n      unlock or delete the snapshot, decrease the lock duration, or change the lock mode. You can increase \\n      the lock duration after the cooling-off period expires.</p>\\n         <p>The cooling-off period is optional when locking a snapshot in compliance mode. If you are locking \\n      the snapshot in governance mode, omit this parameter.</p>\\n         <p>To lock the snapshot in compliance mode immediately without a cooling-off period, omit this \\n      parameter.</p>\\n         <p>If you are extending the lock duration for a snapshot that is locked in compliance mode after \\n      the cooling-off period has expired, omit this parameter. If you specify a cooling-period in a such \\n      a request, the request fails.</p>\\n         <p>Allowed values: Min 1, max 72.</p>\"\n                    }\n                },\n                \"LockDuration\": {\n                    \"target\": \"com.amazonaws.ec2#RetentionPeriodRequestDays\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The period of time for which to lock the snapshot, in days. The snapshot lock will automatically \\n      expire after this period lapses.</p>\\n         <p>You must specify either this parameter or <b>ExpirationDate</b>, but \\n      not both.</p>\\n         <p>Allowed values: Min: 1, max 36500</p>\"\n                    }\n                },\n                \"ExpirationDate\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time at which the snapshot lock is to automatically expire, in the UTC time zone \\n      (<code>YYYY-MM-DDThh:mm:ss.sssZ</code>).</p>\\n         <p>You must specify either this parameter or <b>LockDuration</b>, but \\n      not both.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#LockSnapshotResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SnapshotId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SnapshotId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the snapshot</p>\",\n                        \"smithy.api#xmlName\": \"snapshotId\"\n                    }\n                },\n                \"LockState\": {\n                    \"target\": \"com.amazonaws.ec2#LockState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LockState\",\n                        \"smithy.api#documentation\": \"<p>The state of the snapshot lock. Valid states include:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>compliance-cooloff</code> - The snapshot has been locked in \\n          compliance mode but it is still within the cooling-off period. The snapshot can't be \\n          deleted, but it can be unlocked and the lock settings can be modified by users with \\n          appropriate permissions.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>governance</code> - The snapshot is locked in governance mode. The \\n          snapshot can't be deleted, but it can be unlocked and the lock settings can be \\n          modified by users with appropriate permissions.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>compliance</code> - The snapshot is locked in compliance mode and the \\n          cooling-off period has expired. The snapshot can't be unlocked or deleted. The lock \\n          duration can only be increased by users with appropriate permissions.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>expired</code> - The snapshot was locked in compliance or governance \\n          mode but the lock duration has expired. The snapshot is not locked and can be deleted.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"lockState\"\n                    }\n                },\n                \"LockDuration\": {\n                    \"target\": \"com.amazonaws.ec2#RetentionPeriodResponseDays\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LockDuration\",\n                        \"smithy.api#documentation\": \"<p>The period of time for which the snapshot is locked, in days.</p>\",\n                        \"smithy.api#xmlName\": \"lockDuration\"\n                    }\n                },\n                \"CoolOffPeriod\": {\n                    \"target\": \"com.amazonaws.ec2#CoolOffPeriodResponseHours\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CoolOffPeriod\",\n                        \"smithy.api#documentation\": \"<p>The compliance mode cooling-off period, in hours.</p>\",\n                        \"smithy.api#xmlName\": \"coolOffPeriod\"\n                    }\n                },\n                \"CoolOffPeriodExpiresOn\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CoolOffPeriodExpiresOn\",\n                        \"smithy.api#documentation\": \"<p>The date and time at which the compliance mode cooling-off period expires, in the UTC time zone \\n      (<code>YYYY-MM-DDThh:mm:ss.sssZ</code>).</p>\",\n                        \"smithy.api#xmlName\": \"coolOffPeriodExpiresOn\"\n                    }\n                },\n                \"LockCreatedOn\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LockCreatedOn\",\n                        \"smithy.api#documentation\": \"<p>The date and time at which the snapshot was locked, in the UTC time zone \\n      (<code>YYYY-MM-DDThh:mm:ss.sssZ</code>).</p>\",\n                        \"smithy.api#xmlName\": \"lockCreatedOn\"\n                    }\n                },\n                \"LockExpiresOn\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LockExpiresOn\",\n                        \"smithy.api#documentation\": \"<p>The date and time at which the lock will expire, in the UTC time zone \\n      (<code>YYYY-MM-DDThh:mm:ss.sssZ</code>).</p>\",\n                        \"smithy.api#xmlName\": \"lockExpiresOn\"\n                    }\n                },\n                \"LockDurationStartTime\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LockDurationStartTime\",\n                        \"smithy.api#documentation\": \"<p>The date and time at which the lock duration started, in the UTC time zone \\n      (<code>YYYY-MM-DDThh:mm:ss.sssZ</code>).</p>\",\n                        \"smithy.api#xmlName\": \"lockDurationStartTime\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#LockState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"compliance\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"compliance\"\n                    }\n                },\n                \"governance\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"governance\"\n                    }\n                },\n                \"compliance_cooloff\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"compliance-cooloff\"\n                    }\n                },\n                \"expired\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"expired\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#LockedSnapshotsInfo\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"OwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OwnerId\",\n                        \"smithy.api#documentation\": \"<p>The account ID of the Amazon Web Services account that owns the snapshot.</p>\",\n                        \"smithy.api#xmlName\": \"ownerId\"\n                    }\n                },\n                \"SnapshotId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SnapshotId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the snapshot.</p>\",\n                        \"smithy.api#xmlName\": \"snapshotId\"\n                    }\n                },\n                \"LockState\": {\n                    \"target\": \"com.amazonaws.ec2#LockState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LockState\",\n                        \"smithy.api#documentation\": \"<p>The state of the snapshot lock. Valid states include:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>compliance-cooloff</code> - The snapshot has been locked in \\n          compliance mode but it is still within the cooling-off period. The snapshot can't be \\n          deleted, but it can be unlocked and the lock settings can be modified by users with \\n          appropriate permissions.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>governance</code> - The snapshot is locked in governance mode. The \\n          snapshot can't be deleted, but it can be unlocked and the lock settings can be \\n          modified by users with appropriate permissions.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>compliance</code> - The snapshot is locked in compliance mode and the \\n          cooling-off period has expired. The snapshot can't be unlocked or deleted. The lock \\n          duration can only be increased by users with appropriate permissions.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>expired</code> - The snapshot was locked in compliance or governance \\n          mode but the lock duration has expired. The snapshot is not locked and can be deleted.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"lockState\"\n                    }\n                },\n                \"LockDuration\": {\n                    \"target\": \"com.amazonaws.ec2#RetentionPeriodResponseDays\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LockDuration\",\n                        \"smithy.api#documentation\": \"<p>The period of time for which the snapshot is locked, in days.</p>\",\n                        \"smithy.api#xmlName\": \"lockDuration\"\n                    }\n                },\n                \"CoolOffPeriod\": {\n                    \"target\": \"com.amazonaws.ec2#CoolOffPeriodResponseHours\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CoolOffPeriod\",\n                        \"smithy.api#documentation\": \"<p>The compliance mode cooling-off period, in hours.</p>\",\n                        \"smithy.api#xmlName\": \"coolOffPeriod\"\n                    }\n                },\n                \"CoolOffPeriodExpiresOn\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CoolOffPeriodExpiresOn\",\n                        \"smithy.api#documentation\": \"<p>The date and time at which the compliance mode cooling-off period expires, in the UTC time zone \\n      (<code>YYYY-MM-DDThh:mm:ss.sssZ</code>).</p>\",\n                        \"smithy.api#xmlName\": \"coolOffPeriodExpiresOn\"\n                    }\n                },\n                \"LockCreatedOn\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LockCreatedOn\",\n                        \"smithy.api#documentation\": \"<p>The date and time at which the snapshot was locked, in the UTC time zone (<code>YYYY-MM-DDThh:mm:ss.sssZ</code>).</p>\",\n                        \"smithy.api#xmlName\": \"lockCreatedOn\"\n                    }\n                },\n                \"LockDurationStartTime\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LockDurationStartTime\",\n                        \"smithy.api#documentation\": \"<p>The date and time at which the lock duration started, in the UTC time zone (<code>YYYY-MM-DDThh:mm:ss.sssZ</code>).</p>\\n         <p>If you lock a snapshot that is in the <code>pending</code> state, the lock duration \\n      starts only once the snapshot enters the <code>completed</code> state.</p>\",\n                        \"smithy.api#xmlName\": \"lockDurationStartTime\"\n                    }\n                },\n                \"LockExpiresOn\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LockExpiresOn\",\n                        \"smithy.api#documentation\": \"<p>The date and time at which the lock will expire, in the UTC time zone (<code>YYYY-MM-DDThh:mm:ss.sssZ</code>).</p>\",\n                        \"smithy.api#xmlName\": \"lockExpiresOn\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about a locked snapshot.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#LockedSnapshotsInfoList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#LockedSnapshotsInfo\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#LogDestinationType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"cloud_watch_logs\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"cloud-watch-logs\"\n                    }\n                },\n                \"s3\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"s3\"\n                    }\n                },\n                \"kinesis_data_firehose\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"kinesis-data-firehose\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#Long\": {\n            \"type\": \"long\"\n        },\n        \"com.amazonaws.ec2#MacHost\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"HostId\": {\n                    \"target\": \"com.amazonaws.ec2#DedicatedHostId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"HostId\",\n                        \"smithy.api#documentation\": \"<p>\\n            The EC2 Mac Dedicated Host ID.\\n        </p>\",\n                        \"smithy.api#xmlName\": \"hostId\"\n                    }\n                },\n                \"MacOSLatestSupportedVersions\": {\n                    \"target\": \"com.amazonaws.ec2#MacOSVersionStringList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MacOSLatestSupportedVersionSet\",\n                        \"smithy.api#documentation\": \"<p>\\n            The latest macOS versions that the EC2 Mac Dedicated Host can launch without being upgraded.\\n        </p>\",\n                        \"smithy.api#xmlName\": \"macOSLatestSupportedVersionSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>\\n            Information about the EC2 Mac Dedicated Host.\\n        </p>\"\n            }\n        },\n        \"com.amazonaws.ec2#MacHostList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#MacHost\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#MacModificationTask\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Amazon EC2 Mac instance.</p>\",\n                        \"smithy.api#xmlName\": \"instanceId\"\n                    }\n                },\n                \"MacModificationTaskId\": {\n                    \"target\": \"com.amazonaws.ec2#MacModificationTaskId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MacModificationTaskId\",\n                        \"smithy.api#documentation\": \"<p>The ID of task.</p>\",\n                        \"smithy.api#xmlName\": \"macModificationTaskId\"\n                    }\n                },\n                \"MacSystemIntegrityProtectionConfig\": {\n                    \"target\": \"com.amazonaws.ec2#MacSystemIntegrityProtectionConfiguration\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MacSystemIntegrityProtectionConfig\",\n                        \"smithy.api#documentation\": \"<p>[SIP modification tasks only] Information about the SIP \\n         configuration.</p>\",\n                        \"smithy.api#xmlName\": \"macSystemIntegrityProtectionConfig\"\n                    }\n                },\n                \"StartTime\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"StartTime\",\n                        \"smithy.api#documentation\": \"<p>The date and time the task was created, in the UTC timezone \\n         (<code>YYYY-MM-DDThh:mm:ss.sssZ</code>).</p>\",\n                        \"smithy.api#xmlName\": \"startTime\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>The tags assigned to the task.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                },\n                \"TaskState\": {\n                    \"target\": \"com.amazonaws.ec2#MacModificationTaskState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TaskState\",\n                        \"smithy.api#documentation\": \"<p>The state of the task.</p>\",\n                        \"smithy.api#xmlName\": \"taskState\"\n                    }\n                },\n                \"TaskType\": {\n                    \"target\": \"com.amazonaws.ec2#MacModificationTaskType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TaskType\",\n                        \"smithy.api#documentation\": \"<p>The type of task.</p>\",\n                        \"smithy.api#xmlName\": \"taskType\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about a System Integrity Protection (SIP) modification task or volume \\n         ownership delegation task for an Amazon EC2 Mac instance.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#MacModificationTaskId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#MacModificationTaskIdList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#MacModificationTaskId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#MacModificationTaskList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#MacModificationTask\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#MacModificationTaskState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"successful\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"successful\"\n                    }\n                },\n                \"failed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"failed\"\n                    }\n                },\n                \"inprogress\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"in-progress\"\n                    }\n                },\n                \"pending\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"pending\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#MacModificationTaskType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"SIPModification\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"sip-modification\"\n                    }\n                },\n                \"VolumeOwnershipDelegation\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"volume-ownership-delegation\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#MacOSVersionStringList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#String\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#MacSystemIntegrityProtectionConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AppleInternal\": {\n                    \"target\": \"com.amazonaws.ec2#MacSystemIntegrityProtectionSettingStatus\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AppleInternal\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether Apple Internal was enabled or disabled by the task.</p>\",\n                        \"smithy.api#xmlName\": \"appleInternal\"\n                    }\n                },\n                \"BaseSystem\": {\n                    \"target\": \"com.amazonaws.ec2#MacSystemIntegrityProtectionSettingStatus\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"BaseSystem\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether Base System was enabled or disabled by the task.</p>\",\n                        \"smithy.api#xmlName\": \"baseSystem\"\n                    }\n                },\n                \"DebuggingRestrictions\": {\n                    \"target\": \"com.amazonaws.ec2#MacSystemIntegrityProtectionSettingStatus\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DebuggingRestrictions\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether Debugging Restrictions was enabled or disabled by the task.</p>\",\n                        \"smithy.api#xmlName\": \"debuggingRestrictions\"\n                    }\n                },\n                \"DTraceRestrictions\": {\n                    \"target\": \"com.amazonaws.ec2#MacSystemIntegrityProtectionSettingStatus\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DTraceRestrictions\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether Dtrace Restrictions was enabled or disabled by the task.</p>\",\n                        \"smithy.api#xmlName\": \"dTraceRestrictions\"\n                    }\n                },\n                \"FilesystemProtections\": {\n                    \"target\": \"com.amazonaws.ec2#MacSystemIntegrityProtectionSettingStatus\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"FilesystemProtections\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether Filesystem Protections was enabled or disabled by the task.</p>\",\n                        \"smithy.api#xmlName\": \"filesystemProtections\"\n                    }\n                },\n                \"KextSigning\": {\n                    \"target\": \"com.amazonaws.ec2#MacSystemIntegrityProtectionSettingStatus\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"KextSigning\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether Kext Signing was enabled or disabled by the task.</p>\",\n                        \"smithy.api#xmlName\": \"kextSigning\"\n                    }\n                },\n                \"NvramProtections\": {\n                    \"target\": \"com.amazonaws.ec2#MacSystemIntegrityProtectionSettingStatus\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NvramProtections\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether NVRAM Protections was enabled or disabled by the task.</p>\",\n                        \"smithy.api#xmlName\": \"nvramProtections\"\n                    }\n                },\n                \"Status\": {\n                    \"target\": \"com.amazonaws.ec2#MacSystemIntegrityProtectionSettingStatus\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Status\",\n                        \"smithy.api#documentation\": \"<p>Indicates SIP was enabled or disabled by the task.</p>\",\n                        \"smithy.api#xmlName\": \"status\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the configuration for a System Integrity Protection (SIP) modification task.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#MacSystemIntegrityProtectionConfigurationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AppleInternal\": {\n                    \"target\": \"com.amazonaws.ec2#MacSystemIntegrityProtectionSettingStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Enables or disables Apple Internal.</p>\"\n                    }\n                },\n                \"BaseSystem\": {\n                    \"target\": \"com.amazonaws.ec2#MacSystemIntegrityProtectionSettingStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Enables or disables Base System.</p>\"\n                    }\n                },\n                \"DebuggingRestrictions\": {\n                    \"target\": \"com.amazonaws.ec2#MacSystemIntegrityProtectionSettingStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Enables or disables Debugging Restrictions.</p>\"\n                    }\n                },\n                \"DTraceRestrictions\": {\n                    \"target\": \"com.amazonaws.ec2#MacSystemIntegrityProtectionSettingStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Enables or disables Dtrace Restrictions.</p>\"\n                    }\n                },\n                \"FilesystemProtections\": {\n                    \"target\": \"com.amazonaws.ec2#MacSystemIntegrityProtectionSettingStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Enables or disables Filesystem Protections.</p>\"\n                    }\n                },\n                \"KextSigning\": {\n                    \"target\": \"com.amazonaws.ec2#MacSystemIntegrityProtectionSettingStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Enables or disables Kext Signing.</p>\"\n                    }\n                },\n                \"NvramProtections\": {\n                    \"target\": \"com.amazonaws.ec2#MacSystemIntegrityProtectionSettingStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Enables or disables Nvram Protections.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a custom configuration for a System Integrity Protection (SIP) modification task.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#MacSystemIntegrityProtectionSettingStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"enabled\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"enabled\"\n                    }\n                },\n                \"disabled\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"disabled\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#MaintenanceDetails\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PendingMaintenance\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PendingMaintenance\",\n                        \"smithy.api#documentation\": \"<p>Verify existence of a pending maintenance.</p>\",\n                        \"smithy.api#xmlName\": \"pendingMaintenance\"\n                    }\n                },\n                \"MaintenanceAutoAppliedAfter\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MaintenanceAutoAppliedAfter\",\n                        \"smithy.api#documentation\": \"<p>The timestamp after which Amazon Web Services will automatically apply maintenance.</p>\",\n                        \"smithy.api#xmlName\": \"maintenanceAutoAppliedAfter\"\n                    }\n                },\n                \"LastMaintenanceApplied\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LastMaintenanceApplied\",\n                        \"smithy.api#documentation\": \"<p>Timestamp of last applied maintenance.</p>\",\n                        \"smithy.api#xmlName\": \"lastMaintenanceApplied\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Details for Site-to-Site VPN tunnel endpoint maintenance events.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ManagedBy\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"account\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"account\"\n                    }\n                },\n                \"declarative_policy\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"declarative-policy\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ManagedPrefixList\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PrefixListId\": {\n                    \"target\": \"com.amazonaws.ec2#PrefixListResourceId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PrefixListId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the prefix list.</p>\",\n                        \"smithy.api#xmlName\": \"prefixListId\"\n                    }\n                },\n                \"AddressFamily\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AddressFamily\",\n                        \"smithy.api#documentation\": \"<p>The IP address version.</p>\",\n                        \"smithy.api#xmlName\": \"addressFamily\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#PrefixListState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The current state of the prefix list.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                },\n                \"StateMessage\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"StateMessage\",\n                        \"smithy.api#documentation\": \"<p>The state message.</p>\",\n                        \"smithy.api#xmlName\": \"stateMessage\"\n                    }\n                },\n                \"PrefixListArn\": {\n                    \"target\": \"com.amazonaws.ec2#ResourceArn\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PrefixListArn\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) for the prefix list.</p>\",\n                        \"smithy.api#xmlName\": \"prefixListArn\"\n                    }\n                },\n                \"PrefixListName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PrefixListName\",\n                        \"smithy.api#documentation\": \"<p>The name of the prefix list.</p>\",\n                        \"smithy.api#xmlName\": \"prefixListName\"\n                    }\n                },\n                \"MaxEntries\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MaxEntries\",\n                        \"smithy.api#documentation\": \"<p>The maximum number of entries for the prefix list.</p>\",\n                        \"smithy.api#xmlName\": \"maxEntries\"\n                    }\n                },\n                \"Version\": {\n                    \"target\": \"com.amazonaws.ec2#Long\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Version\",\n                        \"smithy.api#documentation\": \"<p>The version of the prefix list.</p>\",\n                        \"smithy.api#xmlName\": \"version\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>The tags for the prefix list.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                },\n                \"OwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OwnerId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the owner of the prefix list.</p>\",\n                        \"smithy.api#xmlName\": \"ownerId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a managed prefix list.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ManagedPrefixListSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ManagedPrefixList\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#MarketType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"spot\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"spot\"\n                    }\n                },\n                \"capacity_block\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"capacity-block\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#MarketplaceProductCode\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#MarketplaceProductCodeList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#MarketplaceProductCode\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#MarketplaceProductCodeRequest\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#MarketplaceProductCodeRequestList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#MarketplaceProductCodeRequest\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#MaxIpv4AddrPerInterface\": {\n            \"type\": \"integer\"\n        },\n        \"com.amazonaws.ec2#MaxIpv6AddrPerInterface\": {\n            \"type\": \"integer\"\n        },\n        \"com.amazonaws.ec2#MaxNetworkInterfaces\": {\n            \"type\": \"integer\"\n        },\n        \"com.amazonaws.ec2#MaxResults\": {\n            \"type\": \"integer\"\n        },\n        \"com.amazonaws.ec2#MaxResults2\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 100\n                }\n            }\n        },\n        \"com.amazonaws.ec2#MaxResultsParam\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 0,\n                    \"max\": 100\n                }\n            }\n        },\n        \"com.amazonaws.ec2#MaximumBandwidthInMbps\": {\n            \"type\": \"integer\"\n        },\n        \"com.amazonaws.ec2#MaximumDaysSinceCreatedValue\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 0,\n                    \"max\": 2147483647\n                }\n            }\n        },\n        \"com.amazonaws.ec2#MaximumDaysSinceDeprecatedValue\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 0,\n                    \"max\": 2147483647\n                }\n            }\n        },\n        \"com.amazonaws.ec2#MaximumEbsAttachments\": {\n            \"type\": \"integer\"\n        },\n        \"com.amazonaws.ec2#MaximumEfaInterfaces\": {\n            \"type\": \"integer\"\n        },\n        \"com.amazonaws.ec2#MaximumEnaQueueCount\": {\n            \"type\": \"integer\"\n        },\n        \"com.amazonaws.ec2#MaximumEnaQueueCountPerInterface\": {\n            \"type\": \"integer\"\n        },\n        \"com.amazonaws.ec2#MaximumIops\": {\n            \"type\": \"integer\"\n        },\n        \"com.amazonaws.ec2#MaximumNetworkCards\": {\n            \"type\": \"integer\"\n        },\n        \"com.amazonaws.ec2#MaximumThroughputInMBps\": {\n            \"type\": \"double\"\n        },\n        \"com.amazonaws.ec2#MediaAcceleratorInfo\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Accelerators\": {\n                    \"target\": \"com.amazonaws.ec2#MediaDeviceInfoList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Accelerators\",\n                        \"smithy.api#documentation\": \"<p>Describes the media accelerators for the instance type.</p>\",\n                        \"smithy.api#xmlName\": \"accelerators\"\n                    }\n                },\n                \"TotalMediaMemoryInMiB\": {\n                    \"target\": \"com.amazonaws.ec2#TotalMediaMemory\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TotalMediaMemoryInMiB\",\n                        \"smithy.api#documentation\": \"<p>The total size of the memory for the media accelerators for the instance type, in\\n   MiB.</p>\",\n                        \"smithy.api#xmlName\": \"totalMediaMemoryInMiB\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the media accelerators for the instance type.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#MediaDeviceCount\": {\n            \"type\": \"integer\"\n        },\n        \"com.amazonaws.ec2#MediaDeviceInfo\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Count\": {\n                    \"target\": \"com.amazonaws.ec2#MediaDeviceCount\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Count\",\n                        \"smithy.api#documentation\": \"<p>The number of media accelerators for the instance type.</p>\",\n                        \"smithy.api#xmlName\": \"count\"\n                    }\n                },\n                \"Name\": {\n                    \"target\": \"com.amazonaws.ec2#MediaDeviceName\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Name\",\n                        \"smithy.api#documentation\": \"<p>The name of the media accelerator.</p>\",\n                        \"smithy.api#xmlName\": \"name\"\n                    }\n                },\n                \"Manufacturer\": {\n                    \"target\": \"com.amazonaws.ec2#MediaDeviceManufacturerName\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Manufacturer\",\n                        \"smithy.api#documentation\": \"<p>The manufacturer of the media accelerator.</p>\",\n                        \"smithy.api#xmlName\": \"manufacturer\"\n                    }\n                },\n                \"MemoryInfo\": {\n                    \"target\": \"com.amazonaws.ec2#MediaDeviceMemoryInfo\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MemoryInfo\",\n                        \"smithy.api#documentation\": \"<p>Describes the memory available to the media accelerator.</p>\",\n                        \"smithy.api#xmlName\": \"memoryInfo\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the media accelerators for the instance type.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#MediaDeviceInfoList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#MediaDeviceInfo\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#MediaDeviceManufacturerName\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#MediaDeviceMemoryInfo\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SizeInMiB\": {\n                    \"target\": \"com.amazonaws.ec2#MediaDeviceMemorySize\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SizeInMiB\",\n                        \"smithy.api#documentation\": \"<p>The size of the memory available to each media accelerator, in MiB.</p>\",\n                        \"smithy.api#xmlName\": \"sizeInMiB\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the memory available to the media accelerator.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#MediaDeviceMemorySize\": {\n            \"type\": \"integer\"\n        },\n        \"com.amazonaws.ec2#MediaDeviceName\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#MembershipType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"static\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"static\"\n                    }\n                },\n                \"igmp\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"igmp\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#MemoryGiBPerVCpu\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Min\": {\n                    \"target\": \"com.amazonaws.ec2#Double\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Min\",\n                        \"smithy.api#documentation\": \"<p>The minimum amount of memory per vCPU, in GiB. If this parameter is not specified, there is\\n         no minimum limit.</p>\",\n                        \"smithy.api#xmlName\": \"min\"\n                    }\n                },\n                \"Max\": {\n                    \"target\": \"com.amazonaws.ec2#Double\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Max\",\n                        \"smithy.api#documentation\": \"<p>The maximum amount of memory per vCPU, in GiB. If this parameter is not specified, there is\\n         no maximum limit.</p>\",\n                        \"smithy.api#xmlName\": \"max\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The minimum and maximum amount of memory per vCPU, in GiB.</p>\\n         <p></p>\"\n            }\n        },\n        \"com.amazonaws.ec2#MemoryGiBPerVCpuRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Min\": {\n                    \"target\": \"com.amazonaws.ec2#Double\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The minimum amount of memory per vCPU, in GiB. To specify no minimum limit, omit this\\n         parameter.</p>\"\n                    }\n                },\n                \"Max\": {\n                    \"target\": \"com.amazonaws.ec2#Double\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum amount of memory per vCPU, in GiB. To specify no maximum limit, omit this\\n         parameter.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The minimum and maximum amount of memory per vCPU, in GiB.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#MemoryInfo\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SizeInMiB\": {\n                    \"target\": \"com.amazonaws.ec2#MemorySize\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SizeInMiB\",\n                        \"smithy.api#documentation\": \"<p>The size of the memory, in MiB.</p>\",\n                        \"smithy.api#xmlName\": \"sizeInMiB\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the memory for the instance type.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#MemoryMiB\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Min\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Min\",\n                        \"smithy.api#documentation\": \"<p>The minimum amount of memory, in MiB. If this parameter is not specified, there is no minimum\\n         limit.</p>\",\n                        \"smithy.api#xmlName\": \"min\"\n                    }\n                },\n                \"Max\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Max\",\n                        \"smithy.api#documentation\": \"<p>The maximum amount of memory, in MiB. If this parameter is not specified, there is no\\n         maximum limit.</p>\",\n                        \"smithy.api#xmlName\": \"max\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The minimum and maximum amount of memory, in MiB.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#MemoryMiBRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Min\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The minimum amount of memory, in MiB. To specify no minimum limit, specify\\n         <code>0</code>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Max\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum amount of memory, in MiB. To specify no maximum limit, omit this\\n         parameter.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The minimum and maximum amount of memory, in MiB.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#MemorySize\": {\n            \"type\": \"long\"\n        },\n        \"com.amazonaws.ec2#MetadataDefaultHttpTokensState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"optional\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"optional\"\n                    }\n                },\n                \"required\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"required\"\n                    }\n                },\n                \"no_preference\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"no-preference\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#MetricPoint\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"StartDate\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"StartDate\",\n                        \"smithy.api#documentation\": \"<p>The start date for the metric point. The starting date for the metric point. The starting time must be formatted\\n         as <code>yyyy-mm-ddThh:mm:ss</code>.  For example, <code>2022-06-10T12:00:00.000Z</code>.</p>\",\n                        \"smithy.api#xmlName\": \"startDate\"\n                    }\n                },\n                \"EndDate\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EndDate\",\n                        \"smithy.api#documentation\": \"<p>The end date for the metric point. The ending time must be formatted as <code>yyyy-mm-ddThh:mm:ss</code>.  For example, <code>2022-06-12T12:00:00.000Z</code>.</p>\",\n                        \"smithy.api#xmlName\": \"endDate\"\n                    }\n                },\n                \"Value\": {\n                    \"target\": \"com.amazonaws.ec2#Float\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Value\",\n                        \"smithy.api#xmlName\": \"value\"\n                    }\n                },\n                \"Status\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Status\",\n                        \"smithy.api#documentation\": \"<p>The status of the metric point.</p>\",\n                        \"smithy.api#xmlName\": \"status\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Indicates whether the network was healthy or degraded at a particular point. The value is aggregated from the <code>startDate</code> to the <code>endDate</code>. Currently only <code>five_minutes</code> is supported.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#MetricPoints\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#MetricPoint\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#MetricType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"aggregate_latency\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"aggregate-latency\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#MillisecondDateTime\": {\n            \"type\": \"timestamp\"\n        },\n        \"com.amazonaws.ec2#ModifyAddressAttribute\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ModifyAddressAttributeRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ModifyAddressAttributeResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Modifies an attribute of the specified Elastic IP address. For requirements, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/elastic-ip-addresses-eip.html#Using_Elastic_Addressing_Reverse_DNS\\\">Using reverse DNS for email applications</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ModifyAddressAttributeRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AllocationId\": {\n                    \"target\": \"com.amazonaws.ec2#AllocationId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>[EC2-VPC] The allocation ID.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DomainName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The domain name to modify for the IP address.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyAddressAttributeResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Address\": {\n                    \"target\": \"com.amazonaws.ec2#AddressAttribute\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Address\",\n                        \"smithy.api#documentation\": \"<p>Information about the Elastic IP address.</p>\",\n                        \"smithy.api#xmlName\": \"address\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyAvailabilityZoneGroup\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ModifyAvailabilityZoneGroupRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ModifyAvailabilityZoneGroupResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Changes the opt-in status of the specified zone group for your account.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ModifyAvailabilityZoneGroupRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"GroupName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The name of the Availability Zone group, Local Zone group, or Wavelength Zone\\n      group.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"OptInStatus\": {\n                    \"target\": \"com.amazonaws.ec2#ModifyAvailabilityZoneOptInStatus\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>Indicates whether to opt in to the zone group. The only valid value is <code>opted-in</code>. \\n      You must contact Amazon Web Services Support to opt out of a Local Zone or Wavelength Zone group.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyAvailabilityZoneGroupResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Return\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Return\",\n                        \"smithy.api#documentation\": \"<p>Is <code>true</code> if the request succeeds, and an error otherwise.</p>\",\n                        \"smithy.api#xmlName\": \"return\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyAvailabilityZoneOptInStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"opted_in\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"opted-in\"\n                    }\n                },\n                \"not_opted_in\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"not-opted-in\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ModifyCapacityReservation\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ModifyCapacityReservationRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ModifyCapacityReservationResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Modifies a Capacity Reservation's capacity, instance eligibility, and the conditions\\n\\t\\t\\tunder which it is to be released. You can't modify a Capacity Reservation's instance\\n\\t\\t\\ttype, EBS optimization, platform, instance store settings, Availability Zone, or\\n\\t\\t\\ttenancy. If you need to modify any of these attributes, we recommend that you cancel the\\n\\t\\t\\tCapacity Reservation, and then create a new one with the required attributes. For more\\n\\t\\t\\tinformation, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/capacity-reservations-modify.html\\\"> Modify an active\\n\\t\\t\\t\\tCapacity Reservation</a>.</p>\\n         <p>The allowed modifications depend on the state of the Capacity Reservation:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>assessing</code> or <code>scheduled</code> state - You can modify the\\n\\t\\t\\t\\t\\ttags only.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>pending</code> state - You can't modify the Capacity Reservation in any\\n\\t\\t\\t\\t\\tway.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>active</code> state but still within the commitment duration - You can't\\n\\t\\t\\t\\t\\tdecrease the instance count or set an end date that is within the commitment\\n\\t\\t\\t\\t\\tduration. All other modifications are allowed.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>active</code> state with no commitment duration or elapsed commitment\\n\\t\\t\\t\\t\\tduration - All modifications are allowed.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>expired</code>, <code>cancelled</code>, <code>unsupported</code>, or\\n\\t\\t\\t\\t\\t\\t<code>failed</code> state - You can't modify the Capacity Reservation in any\\n\\t\\t\\t\\t\\tway.</p>\\n            </li>\\n         </ul>\"\n            }\n        },\n        \"com.amazonaws.ec2#ModifyCapacityReservationFleet\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ModifyCapacityReservationFleetRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ModifyCapacityReservationFleetResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Modifies a Capacity Reservation Fleet.</p>\\n         <p>When you modify the total target capacity of a Capacity Reservation Fleet, the Fleet\\n\\t\\t\\tautomatically creates new Capacity Reservations, or modifies or cancels existing\\n\\t\\t\\tCapacity Reservations in the Fleet to meet the new total target capacity. When you\\n\\t\\t\\tmodify the end date for the Fleet, the end dates for all of the individual Capacity\\n\\t\\t\\tReservations in the Fleet are updated accordingly.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ModifyCapacityReservationFleetRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CapacityReservationFleetId\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityReservationFleetId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the Capacity Reservation Fleet to modify.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TotalTargetCapacity\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The total number of capacity units to be reserved by the Capacity Reservation Fleet.\\n\\t\\t\\tThis value, together with the instance type weights that you assign to each instance\\n\\t\\t\\ttype used by the Fleet determine the number of instances for which the Fleet reserves\\n\\t\\t\\tcapacity. Both values are based on units that make sense for your workload. For more\\n\\t\\t\\tinformation, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/crfleet-concepts.html#target-capacity\\\">Total target\\n\\t\\t\\t\\tcapacity</a> in the <i>Amazon EC2 User Guide</i>.</p>\"\n                    }\n                },\n                \"EndDate\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time at which the Capacity Reservation Fleet expires. When the Capacity\\n\\t\\t\\tReservation Fleet expires, its state changes to <code>expired</code> and all of the\\n\\t\\t\\tCapacity Reservations in the Fleet expire.</p>\\n         <p>The Capacity Reservation Fleet expires within an hour after the specified time. For\\n\\t\\t\\texample, if you specify <code>5/31/2019</code>, <code>13:30:55</code>, the Capacity\\n\\t\\t\\tReservation Fleet is guaranteed to expire between <code>13:30:55</code> and\\n\\t\\t\\t\\t<code>14:30:55</code> on <code>5/31/2019</code>.</p>\\n         <p>You can't specify <b>EndDate</b> and <b>\\n\\t\\t\\t\\tRemoveEndDate</b> in the same request.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"RemoveEndDate\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether to remove the end date from the Capacity Reservation Fleet. If you\\n\\t\\t\\tremove the end date, the Capacity Reservation Fleet does not expire and it remains\\n\\t\\t\\tactive until you explicitly cancel it using the <b>CancelCapacityReservationFleet</b> action.</p>\\n         <p>You can't specify <b>RemoveEndDate</b> and <b> EndDate</b> in the same request.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyCapacityReservationFleetResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Return\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Return\",\n                        \"smithy.api#documentation\": \"<p>Returns <code>true</code> if the request succeeds; otherwise, it returns an error.</p>\",\n                        \"smithy.api#xmlName\": \"return\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyCapacityReservationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CapacityReservationId\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityReservationId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the Capacity Reservation.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"InstanceCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of instances for which to reserve capacity. The number of instances can't\\n\\t\\t\\tbe increased or decreased by more than <code>1000</code> in a single request.</p>\"\n                    }\n                },\n                \"EndDate\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time at which the Capacity Reservation expires. When a Capacity\\n\\t\\t\\tReservation expires, the reserved capacity is released and you can no longer launch\\n\\t\\t\\tinstances into it. The Capacity Reservation's state changes to <code>expired</code> when\\n\\t\\t\\tit reaches its end date and time.</p>\\n         <p>The Capacity Reservation is cancelled within an hour from the specified time. For\\n\\t\\t\\texample, if you specify 5/31/2019, 13:30:55, the Capacity Reservation is guaranteed to\\n\\t\\t\\tend between 13:30:55 and 14:30:55 on 5/31/2019.</p>\\n         <p>You must provide an <code>EndDate</code> value if <code>EndDateType</code> is\\n\\t\\t\\t\\t<code>limited</code>. Omit <code>EndDate</code> if <code>EndDateType</code> is\\n\\t\\t\\t\\t<code>unlimited</code>.</p>\"\n                    }\n                },\n                \"EndDateType\": {\n                    \"target\": \"com.amazonaws.ec2#EndDateType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates the way in which the Capacity Reservation ends. A Capacity Reservation can\\n\\t\\t\\thave one of the following end types:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>unlimited</code> - The Capacity Reservation remains active until you\\n\\t\\t\\t\\t\\texplicitly cancel it. Do not provide an <code>EndDate</code> value if\\n\\t\\t\\t\\t\\t\\t<code>EndDateType</code> is <code>unlimited</code>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>limited</code> - The Capacity Reservation expires automatically at a\\n\\t\\t\\t\\t\\tspecified date and time. You must provide an <code>EndDate</code> value if\\n\\t\\t\\t\\t\\t\\t<code>EndDateType</code> is <code>limited</code>.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"Accept\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Reserved. Capacity Reservations you have created are accepted by default.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"AdditionalInfo\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Reserved for future use.</p>\"\n                    }\n                },\n                \"InstanceMatchCriteria\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceMatchCriteria\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The matching criteria (instance eligibility) that you want to use in the modified\\n\\t\\t\\tCapacity Reservation. If you change the instance eligibility of an existing Capacity\\n\\t\\t\\tReservation from <code>targeted</code> to <code>open</code>, any running instances that\\n\\t\\t\\tmatch the attributes of the Capacity Reservation, have the\\n\\t\\t\\t\\t<code>CapacityReservationPreference</code> set to <code>open</code>, and are not yet\\n\\t\\t\\trunning in the Capacity Reservation, will automatically use the modified Capacity\\n\\t\\t\\tReservation. </p>\\n         <p>To modify the instance eligibility, the Capacity Reservation must be completely idle\\n\\t\\t\\t(zero usage).</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyCapacityReservationResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Return\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Return\",\n                        \"smithy.api#documentation\": \"<p>Returns <code>true</code> if the request succeeds; otherwise, it returns an error.</p>\",\n                        \"smithy.api#xmlName\": \"return\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyClientVpnEndpoint\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ModifyClientVpnEndpointRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ModifyClientVpnEndpointResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Modifies the specified Client VPN endpoint. Modifying the DNS server resets existing client connections.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ModifyClientVpnEndpointRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ClientVpnEndpointId\": {\n                    \"target\": \"com.amazonaws.ec2#ClientVpnEndpointId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the Client VPN endpoint to modify.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ServerCertificateArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the server certificate to be used. The server certificate must be provisioned in \\n\\t\\t\\tCertificate Manager (ACM).</p>\"\n                    }\n                },\n                \"ConnectionLogOptions\": {\n                    \"target\": \"com.amazonaws.ec2#ConnectionLogOptions\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Information about the client connection logging options.</p>\\n         <p>If you enable client connection logging, data about client connections is sent to a\\n\\t\\t\\tCloudwatch Logs log stream. The following information is logged:</p>\\n         <ul>\\n            <li>\\n               <p>Client connection requests</p>\\n            </li>\\n            <li>\\n               <p>Client connection results (successful and unsuccessful)</p>\\n            </li>\\n            <li>\\n               <p>Reasons for unsuccessful client connection requests</p>\\n            </li>\\n            <li>\\n               <p>Client connection termination time</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"DnsServers\": {\n                    \"target\": \"com.amazonaws.ec2#DnsServersOptionsModifyStructure\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Information about the DNS servers to be used by Client VPN connections. A Client VPN endpoint can have \\n\\t\\t\\tup to two DNS servers.</p>\"\n                    }\n                },\n                \"VpnPort\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The port number to assign to the Client VPN endpoint for TCP and UDP traffic.</p>\\n         <p>Valid Values: <code>443</code> | <code>1194</code>\\n         </p>\\n         <p>Default Value: <code>443</code>\\n         </p>\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A brief description of the Client VPN endpoint.</p>\"\n                    }\n                },\n                \"SplitTunnel\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether the VPN is split-tunnel.</p>\\n         <p>For information about split-tunnel VPN endpoints, see <a href=\\\"https://docs.aws.amazon.com/vpn/latest/clientvpn-admin/split-tunnel-vpn.html\\\">Split-tunnel Client VPN endpoint</a> in the \\n        \\t<i>Client VPN Administrator Guide</i>.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"SecurityGroupIds\": {\n                    \"target\": \"com.amazonaws.ec2#ClientVpnSecurityGroupIdSet\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of one or more security groups to apply to the target network.</p>\",\n                        \"smithy.api#xmlName\": \"SecurityGroupId\"\n                    }\n                },\n                \"VpcId\": {\n                    \"target\": \"com.amazonaws.ec2#VpcId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the VPC to associate with the Client VPN endpoint.</p>\"\n                    }\n                },\n                \"SelfServicePortal\": {\n                    \"target\": \"com.amazonaws.ec2#SelfServicePortal\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify whether to enable the self-service portal for the Client VPN endpoint.</p>\"\n                    }\n                },\n                \"ClientConnectOptions\": {\n                    \"target\": \"com.amazonaws.ec2#ClientConnectOptions\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The options for managing connection authorization for new client connections.</p>\"\n                    }\n                },\n                \"SessionTimeoutHours\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum VPN session duration time in hours.</p>\\n         <p>Valid values: <code>8 | 10 | 12 | 24</code>\\n         </p>\\n         <p>Default value: <code>24</code>\\n         </p>\"\n                    }\n                },\n                \"ClientLoginBannerOptions\": {\n                    \"target\": \"com.amazonaws.ec2#ClientLoginBannerOptions\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Options for enabling a customizable text banner that will be displayed on\\n\\t\\t\\tAmazon Web Services provided clients when a VPN session is established.</p>\"\n                    }\n                },\n                \"ClientRouteEnforcementOptions\": {\n                    \"target\": \"com.amazonaws.ec2#ClientRouteEnforcementOptions\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Client route enforcement is a feature of the Client VPN service that helps enforce administrator defined routes on devices connected through the VPN. T\\n\\t\\this feature helps improve your security posture by ensuring that network traffic originating from a connected client is not inadvertently sent outside the VPN tunnel.</p>\\n         <p>Client route enforcement works by monitoring the route table of a connected device for routing policy changes to the VPN connection. If the feature detects any VPN routing policy modifications, it will automatically force an update to the route table, \\n\\t\\t\\treverting it back to the expected route configurations.</p>\"\n                    }\n                },\n                \"DisconnectOnSessionTimeout\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether the client VPN session is disconnected after the maximum timeout specified in <code>sessionTimeoutHours</code> is reached. If <code>true</code>, users are prompted to reconnect client VPN. If <code>false</code>, client VPN attempts to reconnect automatically. The default value is <code>true</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyClientVpnEndpointResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Return\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Return\",\n                        \"smithy.api#documentation\": \"<p>Returns <code>true</code> if the request succeeds; otherwise, it returns an error.</p>\",\n                        \"smithy.api#xmlName\": \"return\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyDefaultCreditSpecification\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ModifyDefaultCreditSpecificationRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ModifyDefaultCreditSpecificationResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Modifies the default credit option for CPU usage of burstable performance instances.\\n            The default credit option is set at the account level per Amazon Web Services Region, and\\n            is specified per instance family. All new burstable performance instances in the account\\n            launch using the default credit option.</p>\\n         <p>\\n            <code>ModifyDefaultCreditSpecification</code> is an asynchronous operation, which\\n            works at an Amazon Web Services Region level and modifies the credit option for each\\n            Availability Zone. All zones in a Region are updated within five minutes. But if\\n            instances are launched during this operation, they might not get the new credit option\\n            until the zone is updated. To verify whether the update has occurred, you can call\\n                <code>GetDefaultCreditSpecification</code> and check\\n                <code>DefaultCreditSpecification</code> for updates.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/burstable-performance-instances.html\\\">Burstable\\n                performance instances</a> in the <i>Amazon EC2 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ModifyDefaultCreditSpecificationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the operation, without actually making the \\n  request, and provides an error response. If you have the required permissions, the error response is \\n  <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"InstanceFamily\": {\n                    \"target\": \"com.amazonaws.ec2#UnlimitedSupportedInstanceFamily\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The instance family.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"CpuCredits\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The credit option for CPU usage of the instance family.</p>\\n         <p>Valid Values: <code>standard</code> | <code>unlimited</code>\\n         </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyDefaultCreditSpecificationResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceFamilyCreditSpecification\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceFamilyCreditSpecification\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceFamilyCreditSpecification\",\n                        \"smithy.api#documentation\": \"<p>The default credit option for CPU usage of the instance family.</p>\",\n                        \"smithy.api#xmlName\": \"instanceFamilyCreditSpecification\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyEbsDefaultKmsKeyId\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ModifyEbsDefaultKmsKeyIdRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ModifyEbsDefaultKmsKeyIdResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Changes the default KMS key for EBS encryption by default for your account in this Region.</p>\\n         <p>Amazon Web Services creates a unique Amazon Web Services managed KMS key in each Region for use with encryption by default. If\\n      you change the default KMS key to a symmetric customer managed KMS key, it is used instead of the Amazon Web Services\\n      managed KMS key. Amazon EBS does not support asymmetric KMS keys.</p>\\n         <p>If you delete or disable the customer managed KMS key that you specified for use with\\n      encryption by default, your instances will fail to launch.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/ebs/latest/userguide/ebs-encryption.html\\\">Amazon EBS encryption</a>\\n      in the <i>Amazon EBS User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ModifyEbsDefaultKmsKeyIdRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"KmsKeyId\": {\n                    \"target\": \"com.amazonaws.ec2#KmsKeyId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The identifier of the KMS key to use for Amazon EBS encryption.\\n      If this parameter is not specified, your KMS key for Amazon EBS is used. If <code>KmsKeyId</code> is\\n      specified, the encrypted state must be <code>true</code>.</p>\\n         <p>You can specify the KMS key using any of the following:</p>\\n         <ul>\\n            <li>\\n               <p>Key ID. For example, 1234abcd-12ab-34cd-56ef-1234567890ab.</p>\\n            </li>\\n            <li>\\n               <p>Key alias. For example, alias/ExampleAlias.</p>\\n            </li>\\n            <li>\\n               <p>Key ARN. For example, arn:aws:kms:us-east-1:012345678910:key/1234abcd-12ab-34cd-56ef-1234567890ab.</p>\\n            </li>\\n            <li>\\n               <p>Alias ARN. For example, arn:aws:kms:us-east-1:012345678910:alias/ExampleAlias.</p>\\n            </li>\\n         </ul>\\n         <p>Amazon Web Services authenticates the KMS key asynchronously. Therefore, if you specify an ID, alias, or ARN that is not valid, \\n      the action can appear to complete, but eventually fails.</p>\\n         <p>Amazon EBS does not support asymmetric KMS keys.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyEbsDefaultKmsKeyIdResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"KmsKeyId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"KmsKeyId\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the default KMS key for encryption by default.</p>\",\n                        \"smithy.api#xmlName\": \"kmsKeyId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyFleet\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ModifyFleetRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ModifyFleetResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Modifies the specified EC2 Fleet.</p>\\n         <p>You can only modify an EC2 Fleet request of type <code>maintain</code>.</p>\\n         <p>While the EC2 Fleet is being modified, it is in the <code>modifying</code> state.</p>\\n         <p>To scale up your EC2 Fleet, increase its target capacity. The EC2 Fleet launches the additional\\n         Spot Instances according to the allocation strategy for the EC2 Fleet request. If the allocation\\n         strategy is <code>lowest-price</code>, the EC2 Fleet launches instances using the Spot Instance\\n         pool with the lowest price. If the allocation strategy is <code>diversified</code>, the\\n         EC2 Fleet distributes the instances across the Spot Instance pools. If the allocation strategy\\n         is <code>capacity-optimized</code>, EC2 Fleet launches instances from Spot Instance pools with optimal\\n         capacity for the number of instances that are launching.</p>\\n         <p>To scale down your EC2 Fleet, decrease its target capacity. First, the EC2 Fleet cancels any open\\n         requests that exceed the new target capacity. You can request that the EC2 Fleet terminate Spot\\n         Instances until the size of the fleet no longer exceeds the new target capacity. If the\\n         allocation strategy is <code>lowest-price</code>, the EC2 Fleet terminates the instances with\\n         the highest price per unit. If the allocation strategy is <code>capacity-optimized</code>,\\n         the EC2 Fleet terminates the instances in the Spot Instance pools that have the least available\\n         Spot Instance capacity. If the allocation strategy is <code>diversified</code>, the EC2 Fleet terminates\\n         instances across the Spot Instance pools. Alternatively, you can request that the EC2 Fleet keep\\n         the fleet at its current size, but not replace any Spot Instances that are interrupted or\\n         that you terminate manually.</p>\\n         <p>If you are finished with your EC2 Fleet for now, but will use it again later, you can set the\\n         target capacity to 0.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ModifyFleetRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"ExcessCapacityTerminationPolicy\": {\n                    \"target\": \"com.amazonaws.ec2#FleetExcessCapacityTerminationPolicy\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether running instances should be terminated if the total target capacity of\\n         the EC2 Fleet is decreased below the current size of the EC2 Fleet.</p>\\n         <p>Supported only for fleets of type <code>maintain</code>.</p>\"\n                    }\n                },\n                \"LaunchTemplateConfigs\": {\n                    \"target\": \"com.amazonaws.ec2#FleetLaunchTemplateConfigListRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The launch template and overrides.</p>\",\n                        \"smithy.api#xmlName\": \"LaunchTemplateConfig\"\n                    }\n                },\n                \"FleetId\": {\n                    \"target\": \"com.amazonaws.ec2#FleetId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the EC2 Fleet.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TargetCapacitySpecification\": {\n                    \"target\": \"com.amazonaws.ec2#TargetCapacitySpecificationRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The size of the EC2 Fleet.</p>\"\n                    }\n                },\n                \"Context\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Reserved.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyFleetResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Return\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Return\",\n                        \"smithy.api#documentation\": \"<p>If the request succeeds, the response returns <code>true</code>. If the request fails,\\n         no response is returned, and instead an error message is returned.</p>\",\n                        \"smithy.api#xmlName\": \"return\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyFpgaImageAttribute\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ModifyFpgaImageAttributeRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ModifyFpgaImageAttributeResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Modifies the specified attribute of the specified Amazon FPGA Image (AFI).</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ModifyFpgaImageAttributeRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"FpgaImageId\": {\n                    \"target\": \"com.amazonaws.ec2#FpgaImageId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the AFI.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Attribute\": {\n                    \"target\": \"com.amazonaws.ec2#FpgaImageAttributeName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the attribute.</p>\"\n                    }\n                },\n                \"OperationType\": {\n                    \"target\": \"com.amazonaws.ec2#OperationType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The operation type.</p>\"\n                    }\n                },\n                \"UserIds\": {\n                    \"target\": \"com.amazonaws.ec2#UserIdStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account IDs. This parameter is valid only when modifying the <code>loadPermission</code> attribute.</p>\",\n                        \"smithy.api#xmlName\": \"UserId\"\n                    }\n                },\n                \"UserGroups\": {\n                    \"target\": \"com.amazonaws.ec2#UserGroupStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The user groups. This parameter is valid only when modifying the <code>loadPermission</code> attribute.</p>\",\n                        \"smithy.api#xmlName\": \"UserGroup\"\n                    }\n                },\n                \"ProductCodes\": {\n                    \"target\": \"com.amazonaws.ec2#ProductCodeStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The product codes. After you add a product code to an AFI, it can't be removed.\\n\\t\\t    This parameter is valid only when modifying the <code>productCodes</code> attribute.</p>\",\n                        \"smithy.api#xmlName\": \"ProductCode\"\n                    }\n                },\n                \"LoadPermission\": {\n                    \"target\": \"com.amazonaws.ec2#LoadPermissionModifications\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The load permission for the AFI.</p>\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A description for the AFI.</p>\"\n                    }\n                },\n                \"Name\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A name for the AFI.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyFpgaImageAttributeResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"FpgaImageAttribute\": {\n                    \"target\": \"com.amazonaws.ec2#FpgaImageAttribute\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"FpgaImageAttribute\",\n                        \"smithy.api#documentation\": \"<p>Information about the attribute.</p>\",\n                        \"smithy.api#xmlName\": \"fpgaImageAttribute\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyHosts\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ModifyHostsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ModifyHostsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Modify the auto-placement setting of a Dedicated Host. When auto-placement is enabled,\\n            any instances that you launch with a tenancy of <code>host</code> but without a specific\\n            host ID are placed onto any available Dedicated Host in your account that has\\n            auto-placement enabled. When auto-placement is disabled, you need to provide a host ID\\n            to have the instance launch onto a specific host. If no host ID is provided, the\\n            instance is launched onto a suitable host with auto-placement enabled.</p>\\n         <p>You can also use this API action to modify a Dedicated Host to support either multiple\\n            instance types in an instance family, or to support a specific instance type\\n            only.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ModifyHostsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"HostRecovery\": {\n                    \"target\": \"com.amazonaws.ec2#HostRecovery\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether to enable or disable host recovery for the Dedicated Host. For more\\n            information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/dedicated-hosts-recovery.html\\\">Host recovery</a> in\\n            the <i>Amazon EC2 User Guide</i>.</p>\"\n                    }\n                },\n                \"InstanceType\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the instance type to be supported by the Dedicated Host. Specify this\\n            parameter to modify a Dedicated Host to support only a specific instance type.</p>\\n         <p>If you want to modify a Dedicated Host to support multiple instance types in its\\n            current instance family, omit this parameter and specify <b>InstanceFamily</b> instead. You cannot specify <b>InstanceType</b> and <b>InstanceFamily</b> in the\\n            same request.</p>\"\n                    }\n                },\n                \"InstanceFamily\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the instance family to be supported by the Dedicated Host. Specify this\\n            parameter to modify a Dedicated Host to support multiple instance types within its\\n            current instance family.</p>\\n         <p>If you want to modify a Dedicated Host to support a specific instance type only, omit\\n            this parameter and specify <b>InstanceType</b> instead. You\\n            cannot specify <b>InstanceFamily</b> and <b>InstanceType</b> in the same request.</p>\"\n                    }\n                },\n                \"HostMaintenance\": {\n                    \"target\": \"com.amazonaws.ec2#HostMaintenance\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether to enable or disable host maintenance for the Dedicated Host. For\\n            more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/dedicated-hosts-maintenance.html\\\">Host\\n                maintenance</a> in the <i>Amazon EC2 User Guide</i>.</p>\"\n                    }\n                },\n                \"HostIds\": {\n                    \"target\": \"com.amazonaws.ec2#RequestHostIdList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"HostId\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The IDs of the Dedicated Hosts to modify.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"hostId\"\n                    }\n                },\n                \"AutoPlacement\": {\n                    \"target\": \"com.amazonaws.ec2#AutoPlacement\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AutoPlacement\",\n                        \"smithy.api#documentation\": \"<p>Specify whether to enable or disable auto-placement.</p>\",\n                        \"smithy.api#xmlName\": \"autoPlacement\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyHostsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Successful\": {\n                    \"target\": \"com.amazonaws.ec2#ResponseHostIdList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Successful\",\n                        \"smithy.api#documentation\": \"<p>The IDs of the Dedicated Hosts that were successfully modified.</p>\",\n                        \"smithy.api#xmlName\": \"successful\"\n                    }\n                },\n                \"Unsuccessful\": {\n                    \"target\": \"com.amazonaws.ec2#UnsuccessfulItemList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Unsuccessful\",\n                        \"smithy.api#documentation\": \"<p>The IDs of the Dedicated Hosts that could not be modified. Check whether the setting\\n            you requested can be used.</p>\",\n                        \"smithy.api#xmlName\": \"unsuccessful\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyIdFormat\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ModifyIdFormatRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Modifies the ID format for the specified resource on a per-Region basis. You can\\n            specify that resources should receive longer IDs (17-character IDs) when they are\\n            created.</p>\\n         <p>This request can only be used to modify longer ID settings for resource types that\\n            are within the opt-in period. Resources currently in their opt-in period include:\\n            <code>bundle</code> | <code>conversion-task</code> | <code>customer-gateway</code> | <code>dhcp-options</code> |\\n            <code>elastic-ip-allocation</code> | <code>elastic-ip-association</code> |\\n            <code>export-task</code> | <code>flow-log</code> | <code>image</code> |\\n            <code>import-task</code> | <code>internet-gateway</code> | <code>network-acl</code>\\n            | <code>network-acl-association</code> | <code>network-interface</code> |\\n            <code>network-interface-attachment</code> | <code>prefix-list</code> |\\n            <code>route-table</code> | <code>route-table-association</code> |\\n            <code>security-group</code> | <code>subnet</code> |\\n            <code>subnet-cidr-block-association</code> | <code>vpc</code> |\\n            <code>vpc-cidr-block-association</code> | <code>vpc-endpoint</code> | <code>vpc-peering-connection</code> | <code>vpn-connection</code> | <code>vpn-gateway</code>.</p>\\n         <p>This setting applies to the IAM user who makes the request; it does not apply to the\\n        entire Amazon Web Services account. By default, an IAM user defaults to the same settings as the root user. If\\n        you're using this action as the root user, then these settings apply to the entire account,\\n        unless an IAM user explicitly overrides these settings for themselves. For more information,\\n        see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/resource-ids.html\\\">Resource IDs</a> \\n        in the <i>Amazon Elastic Compute Cloud User Guide</i>.</p>\\n         <p>Resources created with longer IDs are visible to all IAM roles and users, regardless\\n        of these settings and provided that they have permission to use the relevant\\n        <code>Describe</code> command for the resource type.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ModifyIdFormatRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Resource\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The type of resource: <code>bundle</code> | <code>conversion-task</code> | <code>customer-gateway</code> | <code>dhcp-options</code> |\\n           <code>elastic-ip-allocation</code> | <code>elastic-ip-association</code> |\\n           <code>export-task</code> | <code>flow-log</code> | <code>image</code> |\\n           <code>import-task</code> | <code>internet-gateway</code> | <code>network-acl</code>\\n           | <code>network-acl-association</code> | <code>network-interface</code> |\\n           <code>network-interface-attachment</code> | <code>prefix-list</code> |\\n           <code>route-table</code> | <code>route-table-association</code> |\\n           <code>security-group</code> | <code>subnet</code> |\\n           <code>subnet-cidr-block-association</code> | <code>vpc</code> |\\n           <code>vpc-cidr-block-association</code> | <code>vpc-endpoint</code> | <code>vpc-peering-connection</code> | <code>vpn-connection</code> | <code>vpn-gateway</code>.</p>\\n         <p>Alternatively, use the <code>all-current</code> option to include all resource types that are\\n       currently within their opt-in period for longer IDs.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"UseLongIds\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>Indicate whether the resource should use longer IDs (17-character IDs).</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyIdentityIdFormat\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ModifyIdentityIdFormatRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Modifies the ID format of a resource for a specified IAM user, IAM role, or the root\\n       user for an account; or all IAM users, IAM roles, and the root user for an account. You can\\n       specify that resources should receive longer IDs (17-character IDs) when they are created. </p>\\n         <p>This request can only be used to modify longer ID settings for resource types that are\\n       within the opt-in period. Resources currently in their opt-in period include:\\n                <code>bundle</code> | <code>conversion-task</code> | <code>customer-gateway</code> | <code>dhcp-options</code> |\\n                <code>elastic-ip-allocation</code> | <code>elastic-ip-association</code> |\\n                <code>export-task</code> | <code>flow-log</code> | <code>image</code> |\\n                <code>import-task</code> | <code>internet-gateway</code> | <code>network-acl</code>\\n            | <code>network-acl-association</code> | <code>network-interface</code> |\\n                <code>network-interface-attachment</code> | <code>prefix-list</code> |\\n                <code>route-table</code> | <code>route-table-association</code> |\\n                <code>security-group</code> | <code>subnet</code> |\\n                <code>subnet-cidr-block-association</code> | <code>vpc</code> |\\n        <code>vpc-cidr-block-association</code> | <code>vpc-endpoint</code> | <code>vpc-peering-connection</code> | <code>vpn-connection</code> | <code>vpn-gateway</code>. </p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/resource-ids.html\\\">Resource IDs</a> in the\\n                <i>Amazon Elastic Compute Cloud User Guide</i>. </p>\\n         <p>This setting applies to the principal specified in the request; it does not apply to the\\n      principal that makes the request. </p>\\n         <p>Resources created with longer IDs are visible to all IAM roles and users, regardless of these\\n      settings and provided that they have permission to use the relevant <code>Describe</code>\\n      command for the resource type.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ModifyIdentityIdFormatRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Resource\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Resource\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The type of resource: <code>bundle</code> | <code>conversion-task</code> | <code>customer-gateway</code> | <code>dhcp-options</code> |\\n          <code>elastic-ip-allocation</code> | <code>elastic-ip-association</code> |\\n          <code>export-task</code> | <code>flow-log</code> | <code>image</code> |\\n          <code>import-task</code> | <code>internet-gateway</code> | <code>network-acl</code>\\n          | <code>network-acl-association</code> | <code>network-interface</code> |\\n          <code>network-interface-attachment</code> | <code>prefix-list</code> |\\n          <code>route-table</code> | <code>route-table-association</code> |\\n          <code>security-group</code> | <code>subnet</code> |\\n          <code>subnet-cidr-block-association</code> | <code>vpc</code> |\\n          <code>vpc-cidr-block-association</code> | <code>vpc-endpoint</code> | <code>vpc-peering-connection</code> | <code>vpn-connection</code> | <code>vpn-gateway</code>.</p>\\n         <p>Alternatively, use the <code>all-current</code> option to include all resource types that are\\n          currently within their opt-in period for longer IDs.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"resource\"\n                    }\n                },\n                \"UseLongIds\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"UseLongIds\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>Indicates whether the resource should use longer IDs (17-character IDs)</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"useLongIds\"\n                    }\n                },\n                \"PrincipalArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PrincipalArn\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ARN of the principal, which can be an IAM user, IAM role, or the root user. Specify\\n       <code>all</code> to modify the ID format for all IAM users, IAM roles, and the root user of\\n       the account.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"principalArn\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyImageAttribute\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ModifyImageAttributeRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Modifies the specified attribute of the specified AMI. You can specify only one attribute\\n      at a time.</p>\\n         <p>To specify the attribute, you can use the <code>Attribute</code> parameter, or one of the\\n      following parameters: <code>Description</code>, <code>ImdsSupport</code>, or\\n        <code>LaunchPermission</code>.</p>\\n         <p>Images with an Amazon Web Services Marketplace product code cannot be made public.</p>\\n         <p>To enable the SriovNetSupport enhanced networking attribute of an image, enable\\n      SriovNetSupport on an instance and create an AMI from the instance.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To grant launch permissions\",\n                        \"documentation\": \"This example grants launch permissions for the specified AMI to the specified AWS account.\",\n                        \"input\": {\n                            \"ImageId\": \"ami-5731123e\",\n                            \"LaunchPermission\": {\n                                \"Add\": [\n                                    {\n                                        \"UserId\": \"123456789012\"\n                                    }\n                                ]\n                            }\n                        },\n                        \"output\": {}\n                    },\n                    {\n                        \"title\": \"To make an AMI public\",\n                        \"documentation\": \"This example makes the specified AMI public.\",\n                        \"input\": {\n                            \"ImageId\": \"ami-5731123e\",\n                            \"LaunchPermission\": {\n                                \"Add\": [\n                                    {\n                                        \"Group\": \"all\"\n                                    }\n                                ]\n                            }\n                        },\n                        \"output\": {}\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#ModifyImageAttributeRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Attribute\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the attribute to modify.</p>\\n         <p>Valid values: <code>description</code> | <code>imdsSupport</code> |\\n        <code>launchPermission</code>\\n         </p>\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#AttributeValue\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A new description for the AMI.</p>\"\n                    }\n                },\n                \"ImageId\": {\n                    \"target\": \"com.amazonaws.ec2#ImageId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the AMI.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"LaunchPermission\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchPermissionModifications\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A new launch permission for the AMI.</p>\"\n                    }\n                },\n                \"OperationType\": {\n                    \"target\": \"com.amazonaws.ec2#OperationType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The operation type. This parameter can be used only when the <code>Attribute</code>\\n      parameter is <code>launchPermission</code>.</p>\"\n                    }\n                },\n                \"ProductCodes\": {\n                    \"target\": \"com.amazonaws.ec2#ProductCodeStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Not supported.</p>\",\n                        \"smithy.api#xmlName\": \"ProductCode\"\n                    }\n                },\n                \"UserGroups\": {\n                    \"target\": \"com.amazonaws.ec2#UserGroupStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The user groups. This parameter can be used only when the <code>Attribute</code> parameter\\n      is <code>launchPermission</code>.</p>\",\n                        \"smithy.api#xmlName\": \"UserGroup\"\n                    }\n                },\n                \"UserIds\": {\n                    \"target\": \"com.amazonaws.ec2#UserIdStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account IDs. This parameter can be used only when the\\n        <code>Attribute</code> parameter is <code>launchPermission</code>.</p>\",\n                        \"smithy.api#xmlName\": \"UserId\"\n                    }\n                },\n                \"Value\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The value of the attribute being modified. This parameter can be used only when the\\n        <code>Attribute</code> parameter is <code>description</code> or\\n      <code>imdsSupport</code>.</p>\"\n                    }\n                },\n                \"OrganizationArns\": {\n                    \"target\": \"com.amazonaws.ec2#OrganizationArnStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of an organization. This parameter can be used only when\\n      the <code>Attribute</code> parameter is <code>launchPermission</code>.</p>\",\n                        \"smithy.api#xmlName\": \"OrganizationArn\"\n                    }\n                },\n                \"OrganizationalUnitArns\": {\n                    \"target\": \"com.amazonaws.ec2#OrganizationalUnitArnStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of an organizational unit (OU). This parameter can be used\\n      only when the <code>Attribute</code> parameter is <code>launchPermission</code>.</p>\",\n                        \"smithy.api#xmlName\": \"OrganizationalUnitArn\"\n                    }\n                },\n                \"ImdsSupport\": {\n                    \"target\": \"com.amazonaws.ec2#AttributeValue\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Set to <code>v2.0</code> to indicate that IMDSv2 is specified in the AMI. Instances\\n      launched from this AMI will have <code>HttpTokens</code> automatically set to\\n        <code>required</code> so that, by default, the instance requires that IMDSv2 is used when\\n      requesting instance metadata. In addition, <code>HttpPutResponseHopLimit</code> is set to\\n        <code>2</code>. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/configuring-IMDS-new-instances.html#configure-IMDS-new-instances-ami-configuration\\\">Configure the AMI</a> in the <i>Amazon EC2 User Guide</i>.</p>\\n         <important>\\n            <p>Do not use this parameter unless your AMI software supports IMDSv2. After you set the\\n        value to <code>v2.0</code>, you can't undo it. The only way to “reset” your AMI is to create\\n        a new AMI from the underlying snapshot.</p>\\n         </important>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n\\t\\t\\tand provides an error response. If you have the required permissions, the error response is \\n\\t\\t\\t<code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the parameters for ModifyImageAttribute.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyInstanceAttribute\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ModifyInstanceAttributeRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Modifies the specified attribute of the specified instance. You can specify only one\\n            attribute at a time.</p>\\n         <p>\\n            <b>Note: </b>Using this action to change the security groups\\n            associated with an elastic network interface (ENI) attached to an instance can\\n            result in an error if the instance has more than one ENI. To change the security groups\\n            associated with an ENI attached to an instance that has multiple ENIs, we recommend that\\n            you use the <a>ModifyNetworkInterfaceAttribute</a> action.</p>\\n         <p>To modify some attributes, the instance must be stopped. For more information, see\\n                <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_ChangingAttributesWhileInstanceStopped.html\\\">Modify a stopped instance</a> in the\\n            <i>Amazon EC2 User Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To enable enhanced networking\",\n                        \"documentation\": \"This example enables enhanced networking for the specified stopped instance.\",\n                        \"input\": {\n                            \"InstanceId\": \"i-1234567890abcdef0\",\n                            \"EnaSupport\": {\n                                \"Value\": true\n                            }\n                        },\n                        \"output\": {}\n                    },\n                    {\n                        \"title\": \"To modify the instance type\",\n                        \"documentation\": \"This example modifies the instance type of the specified stopped instance.\",\n                        \"input\": {\n                            \"InstanceId\": \"i-1234567890abcdef0\",\n                            \"InstanceType\": {\n                                \"Value\": \"m5.large\"\n                            }\n                        },\n                        \"output\": {}\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#ModifyInstanceAttributeRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SourceDestCheck\": {\n                    \"target\": \"com.amazonaws.ec2#AttributeBooleanValue\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Enable or disable source/destination checks, which ensure that the instance is either\\n            the source or the destination of any traffic that it receives. If the value is\\n                <code>true</code>, source/destination checks are enabled; otherwise, they are\\n            disabled. The default value is <code>true</code>. You must disable source/destination\\n            checks if the instance runs services such as network address translation, routing, or\\n            firewalls.</p>\"\n                    }\n                },\n                \"DisableApiStop\": {\n                    \"target\": \"com.amazonaws.ec2#AttributeBooleanValue\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether an instance is enabled for stop protection. For more information,\\n            see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-stop-protection.html\\\">Enable stop\\n                protection for your instance</a>.</p>\\n         <p></p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the operation, without actually making the \\n  request, and provides an error response. If you have the required permissions, the error response is \\n  <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"InstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceId\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the instance.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"instanceId\"\n                    }\n                },\n                \"Attribute\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceAttributeName\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Attribute\",\n                        \"smithy.api#documentation\": \"<p>The name of the attribute to modify.</p>\\n         <note>\\n            <p>When changing the instance type: If the original instance type is configured for\\n                configurable bandwidth, and the desired instance type doesn't support configurable\\n                bandwidth, first set the existing bandwidth configuration to <code>default</code>\\n                using the <a>ModifyInstanceNetworkPerformanceOptions</a>\\n                operation.</p>\\n         </note>\\n         <important>\\n            <p>You can modify the following attributes only: <code>disableApiTermination</code> |\\n                    <code>instanceType</code> | <code>kernel</code> | <code>ramdisk</code> |\\n                    <code>instanceInitiatedShutdownBehavior</code> | <code>blockDeviceMapping</code>\\n                | <code>userData</code> | <code>sourceDestCheck</code> | <code>groupSet</code> |\\n                    <code>ebsOptimized</code> | <code>sriovNetSupport</code> |\\n                    <code>enaSupport</code> | <code>nvmeSupport</code> | <code>disableApiStop</code>\\n                | <code>enclaveOptions</code>\\n            </p>\\n         </important>\",\n                        \"smithy.api#xmlName\": \"attribute\"\n                    }\n                },\n                \"Value\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Value\",\n                        \"smithy.api#documentation\": \"<p>A new value for the attribute. Use only with the <code>kernel</code>,\\n                <code>ramdisk</code>, <code>userData</code>, <code>disableApiTermination</code>, or\\n                <code>instanceInitiatedShutdownBehavior</code> attribute.</p>\",\n                        \"smithy.api#xmlName\": \"value\"\n                    }\n                },\n                \"BlockDeviceMappings\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceBlockDeviceMappingSpecificationList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"BlockDeviceMapping\",\n                        \"smithy.api#documentation\": \"<p>Modifies the <code>DeleteOnTermination</code> attribute for volumes that are currently\\n            attached. The volume must be owned by the caller. If no value is specified for\\n                <code>DeleteOnTermination</code>, the default is <code>true</code> and the volume is\\n            deleted when the instance is terminated. You can't modify the <code>DeleteOnTermination</code> \\n            attribute for volumes that are attached to Amazon Web Services-managed resources.</p>\\n         <p>To add instance store volumes to an Amazon EBS-backed instance, you must add them when\\n            you launch the instance. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/block-device-mapping-concepts.html#Using_OverridingAMIBDM\\\">Update the block device mapping when launching an instance</a> in the\\n                <i>Amazon EC2 User Guide</i>.</p>\",\n                        \"smithy.api#xmlName\": \"blockDeviceMapping\"\n                    }\n                },\n                \"DisableApiTermination\": {\n                    \"target\": \"com.amazonaws.ec2#AttributeBooleanValue\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DisableApiTermination\",\n                        \"smithy.api#documentation\": \"<p>Enable or disable termination protection for the instance. If the value is <code>true</code>, \\n            you can't terminate the instance using the Amazon EC2 console, command line interface, or API. \\n            You can't enable termination protection for Spot Instances.</p>\",\n                        \"smithy.api#xmlName\": \"disableApiTermination\"\n                    }\n                },\n                \"InstanceType\": {\n                    \"target\": \"com.amazonaws.ec2#AttributeValue\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceType\",\n                        \"smithy.api#documentation\": \"<p>Changes the instance type to the specified value. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html\\\">Instance\\n                types</a> in the <i>Amazon EC2 User Guide</i>. If the instance type is\\n            not valid, the error returned is <code>InvalidInstanceAttributeValue</code>.</p>\",\n                        \"smithy.api#xmlName\": \"instanceType\"\n                    }\n                },\n                \"Kernel\": {\n                    \"target\": \"com.amazonaws.ec2#AttributeValue\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Kernel\",\n                        \"smithy.api#documentation\": \"<p>Changes the instance's kernel to the specified value. We recommend that you use\\n            PV-GRUB instead of kernels and RAM disks. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/UserProvidedKernels.html\\\">PV-GRUB</a>.</p>\",\n                        \"smithy.api#xmlName\": \"kernel\"\n                    }\n                },\n                \"Ramdisk\": {\n                    \"target\": \"com.amazonaws.ec2#AttributeValue\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Ramdisk\",\n                        \"smithy.api#documentation\": \"<p>Changes the instance's RAM disk to the specified value. We recommend that you use\\n            PV-GRUB instead of kernels and RAM disks. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/UserProvidedKernels.html\\\">PV-GRUB</a>.</p>\",\n                        \"smithy.api#xmlName\": \"ramdisk\"\n                    }\n                },\n                \"UserData\": {\n                    \"target\": \"com.amazonaws.ec2#BlobAttributeValue\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"UserData\",\n                        \"smithy.api#documentation\": \"<p>Changes the instance's user data to the specified value. User data must be base64-encoded.\\n            Depending on the tool or SDK that you're using, the base64-encoding might be performed for you.\\n            For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instancedata-add-user-data.html\\\">Work with instance user data</a>.</p>\",\n                        \"smithy.api#xmlName\": \"userData\"\n                    }\n                },\n                \"InstanceInitiatedShutdownBehavior\": {\n                    \"target\": \"com.amazonaws.ec2#AttributeValue\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceInitiatedShutdownBehavior\",\n                        \"smithy.api#documentation\": \"<p>Specifies whether an instance stops or terminates when you initiate shutdown from the\\n            instance (using the operating system command for system shutdown).</p>\",\n                        \"smithy.api#xmlName\": \"instanceInitiatedShutdownBehavior\"\n                    }\n                },\n                \"Groups\": {\n                    \"target\": \"com.amazonaws.ec2#GroupIdStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Replaces the security groups of the instance with the specified security groups.\\n            You must specify the ID of at least one security group, even if it's just the default\\n            security group for the VPC.</p>\",\n                        \"smithy.api#xmlName\": \"GroupId\"\n                    }\n                },\n                \"EbsOptimized\": {\n                    \"target\": \"com.amazonaws.ec2#AttributeBooleanValue\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EbsOptimized\",\n                        \"smithy.api#documentation\": \"<p>Specifies whether the instance is optimized for Amazon EBS I/O. This optimization\\n            provides dedicated throughput to Amazon EBS and an optimized configuration stack to\\n            provide optimal EBS I/O performance. This optimization isn't available with all instance\\n            types. Additional usage charges apply when using an EBS Optimized instance.</p>\",\n                        \"smithy.api#xmlName\": \"ebsOptimized\"\n                    }\n                },\n                \"SriovNetSupport\": {\n                    \"target\": \"com.amazonaws.ec2#AttributeValue\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SriovNetSupport\",\n                        \"smithy.api#documentation\": \"<p>Set to <code>simple</code> to enable enhanced networking with the Intel 82599 Virtual\\n            Function interface for the instance.</p>\\n         <p>There is no way to disable enhanced networking with the Intel 82599 Virtual Function\\n            interface at this time.</p>\\n         <p>This option is supported only for HVM instances. Specifying this option with a PV\\n            instance can make it unreachable.</p>\",\n                        \"smithy.api#xmlName\": \"sriovNetSupport\"\n                    }\n                },\n                \"EnaSupport\": {\n                    \"target\": \"com.amazonaws.ec2#AttributeBooleanValue\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EnaSupport\",\n                        \"smithy.api#documentation\": \"<p>Set to <code>true</code> to enable enhanced networking with ENA for the\\n            instance.</p>\\n         <p>This option is supported only for HVM instances. Specifying this option with a PV\\n            instance can make it unreachable.</p>\",\n                        \"smithy.api#xmlName\": \"enaSupport\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyInstanceCapacityReservationAttributes\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ModifyInstanceCapacityReservationAttributesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ModifyInstanceCapacityReservationAttributesResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Modifies the Capacity Reservation settings for a stopped instance. Use this action to\\n\\t\\t\\tconfigure an instance to target a specific Capacity Reservation, run in any\\n\\t\\t\\t\\t<code>open</code> Capacity Reservation with matching attributes, run in On-Demand\\n\\t\\t\\tInstance capacity, or only run in a Capacity Reservation.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ModifyInstanceCapacityReservationAttributesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the instance to be modified.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"CapacityReservationSpecification\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityReservationSpecification\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>Information about the Capacity Reservation targeting option.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyInstanceCapacityReservationAttributesResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Return\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Return\",\n                        \"smithy.api#documentation\": \"<p>Returns <code>true</code> if the request succeeds; otherwise, it returns an error.</p>\",\n                        \"smithy.api#xmlName\": \"return\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyInstanceConnectEndpoint\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ModifyInstanceConnectEndpointRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ModifyInstanceConnectEndpointResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Modifies the specified EC2 Instance Connect Endpoint.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/modify-ec2-instance-connect-endpoint.html\\\">Modify an\\n                EC2 Instance Connect Endpoint</a> in the\\n            <i>Amazon EC2 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ModifyInstanceConnectEndpointRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the operation, without actually making the \\n  request, and provides an error response. If you have the required permissions, the error response is \\n  <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"InstanceConnectEndpointId\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceConnectEndpointId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the EC2 Instance Connect Endpoint to modify.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"IpAddressType\": {\n                    \"target\": \"com.amazonaws.ec2#IpAddressType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The new IP address type for the EC2 Instance Connect Endpoint.</p>\\n         <note>\\n            <p>\\n               <code>PreserveClientIp</code> is only supported on IPv4 EC2 Instance Connect\\n                Endpoints. To use <code>PreserveClientIp</code>, the value for\\n                <code>IpAddressType</code> must be <code>ipv4</code>.</p>\\n         </note>\"\n                    }\n                },\n                \"SecurityGroupIds\": {\n                    \"target\": \"com.amazonaws.ec2#SecurityGroupIdStringListRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Changes the security groups for the EC2 Instance Connect Endpoint. The new set of\\n            groups you specify replaces the current set. You must specify at least one group, even\\n            if it's just the default security group in the VPC. You must specify the ID of the\\n            security group, not the name.</p>\",\n                        \"smithy.api#xmlName\": \"SecurityGroupId\"\n                    }\n                },\n                \"PreserveClientIp\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether the client IP address is preserved as the source. The following are the possible values.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>true</code> - Use the client IP address as the source.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>false</code> - Use the network interface IP address as the source.</p>\\n            </li>\\n         </ul>\\n         <note>\\n            <p>\\n               <code>PreserveClientIp=true</code> is only supported on IPv4 EC2 Instance Connect\\n                Endpoints. If modifying <code>PreserveClientIp</code> to <code>true</code>, either\\n                the endpoint's existing <code>IpAddressType</code> must be <code>ipv4</code>, or if\\n                modifying <code>IpAddressType</code> in the same request, the new value must be\\n                    <code>ipv4</code>.</p>\\n         </note>\\n         <p>Default: <code>false</code>\\n         </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyInstanceConnectEndpointResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Return\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Return\",\n                        \"smithy.api#documentation\": \"<p>The return value of the request. Returns <code>true</code> if the specified product\\n            code is owned by the requester and associated with the specified instance.</p>\",\n                        \"smithy.api#xmlName\": \"return\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyInstanceCpuOptions\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ModifyInstanceCpuOptionsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ModifyInstanceCpuOptionsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>By default, all vCPUs for the instance type are active when you launch an instance. When you \\n\\t\\t\\tconfigure the number of active vCPUs for the instance, it can help you save on licensing costs and \\n\\t\\t\\toptimize performance. The base cost of the instance remains unchanged.</p>\\n         <p>The number of active vCPUs equals the number of threads per CPU core multiplied by the number \\n\\t\\t\\tof cores. The instance must be in a <code>Stopped</code> state before you make changes.</p>\\n         <note>\\n            <p>Some instance type options do not support this capability. For more information, see \\n\\t\\t\\t\\t<a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/cpu-options-supported-instances-values.html\\\">Supported CPU \\n\\t\\t\\t\\t\\toptions</a> in the <i>Amazon EC2 User Guide</i>.</p>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.ec2#ModifyInstanceCpuOptionsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the instance to update.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"CoreCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The number of CPU cores to activate for the specified instance.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ThreadsPerCore\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The number of threads to run for each CPU core.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the operation, without actually making the \\n  request, and provides an error response. If you have the required permissions, the error response is \\n  <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyInstanceCpuOptionsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the instance that was updated.</p>\",\n                        \"smithy.api#xmlName\": \"instanceId\"\n                    }\n                },\n                \"CoreCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CoreCount\",\n                        \"smithy.api#documentation\": \"<p>The number of CPU cores that are running for the specified instance after the \\n\\t\\t\\tupdate.</p>\",\n                        \"smithy.api#xmlName\": \"coreCount\"\n                    }\n                },\n                \"ThreadsPerCore\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ThreadsPerCore\",\n                        \"smithy.api#documentation\": \"<p>The number of threads that are running per CPU core for the specified \\n\\t\\t\\tinstance after the update.</p>\",\n                        \"smithy.api#xmlName\": \"threadsPerCore\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyInstanceCreditSpecification\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ModifyInstanceCreditSpecificationRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ModifyInstanceCreditSpecificationResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Modifies the credit option for CPU usage on a running or stopped burstable performance\\n            instance. The credit options are <code>standard</code> and\\n            <code>unlimited</code>.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/burstable-performance-instances.html\\\">Burstable\\n                performance instances</a> in the <i>Amazon EC2 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ModifyInstanceCreditSpecificationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the operation, without actually making the \\n  request, and provides an error response. If you have the required permissions, the error response is \\n  <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A unique, case-sensitive token that you provide to ensure idempotency of your\\n            modification request. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Run_Instance_Idempotency.html\\\">Ensuring\\n                Idempotency</a>.</p>\"\n                    }\n                },\n                \"InstanceCreditSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceCreditSpecificationListRequest\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>Information about the credit option for CPU usage.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"InstanceCreditSpecification\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyInstanceCreditSpecificationResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SuccessfulInstanceCreditSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#SuccessfulInstanceCreditSpecificationSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SuccessfulInstanceCreditSpecificationSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the instances whose credit option for CPU usage was successfully\\n            modified.</p>\",\n                        \"smithy.api#xmlName\": \"successfulInstanceCreditSpecificationSet\"\n                    }\n                },\n                \"UnsuccessfulInstanceCreditSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#UnsuccessfulInstanceCreditSpecificationSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"UnsuccessfulInstanceCreditSpecificationSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the instances whose credit option for CPU usage was not\\n            modified.</p>\",\n                        \"smithy.api#xmlName\": \"unsuccessfulInstanceCreditSpecificationSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyInstanceEventStartTime\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ModifyInstanceEventStartTimeRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ModifyInstanceEventStartTimeResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Modifies the start time for a scheduled Amazon EC2 instance event.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ModifyInstanceEventStartTimeRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the operation, without actually making the \\n  request, and provides an error response. If you have the required permissions, the error response is \\n  <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"InstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the instance with the scheduled event.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"InstanceEventId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the event whose date and time you are modifying.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"NotBefore\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The new date and time when the event will take place.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyInstanceEventStartTimeResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Event\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceStatusEvent\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Event\",\n                        \"smithy.api#documentation\": \"<p>Information about the event.</p>\",\n                        \"smithy.api#xmlName\": \"event\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyInstanceEventWindow\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ModifyInstanceEventWindowRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ModifyInstanceEventWindowResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Modifies the specified event window.</p>\\n         <p>You can define either a set of time ranges or a cron expression when modifying the event\\n         window, but not both.</p>\\n         <p>To modify the targets associated with the event window, use the <a>AssociateInstanceEventWindow</a> and <a>DisassociateInstanceEventWindow</a> API.</p>\\n         <p>If Amazon Web Services has already scheduled an event, modifying an event window won't change the time\\n         of the scheduled event.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/event-windows.html\\\">Define event windows for scheduled\\n            events</a> in the <i>Amazon EC2 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ModifyInstanceEventWindowRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"Name\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the event window.</p>\"\n                    }\n                },\n                \"InstanceEventWindowId\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceEventWindowId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the event window.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TimeRanges\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceEventWindowTimeRangeRequestSet\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time ranges of the event window.</p>\",\n                        \"smithy.api#xmlName\": \"TimeRange\"\n                    }\n                },\n                \"CronExpression\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceEventWindowCronExpression\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The cron expression of the event window, for example, <code>* 0-4,20-23 * *\\n         1,5</code>.</p>\\n         <p>Constraints:</p>\\n         <ul>\\n            <li>\\n               <p>Only hour and day of the week values are supported.</p>\\n            </li>\\n            <li>\\n               <p>For day of the week values, you can specify either integers <code>0</code> through\\n                  <code>6</code>, or alternative single values <code>SUN</code> through\\n                  <code>SAT</code>.</p>\\n            </li>\\n            <li>\\n               <p>The minute, month, and year must be specified by <code>*</code>.</p>\\n            </li>\\n            <li>\\n               <p>The hour value must be one or a multiple range, for example, <code>0-4</code> or\\n                  <code>0-4,20-23</code>.</p>\\n            </li>\\n            <li>\\n               <p>Each hour range must be >= 2 hours, for example, <code>0-2</code> or\\n                  <code>20-23</code>.</p>\\n            </li>\\n            <li>\\n               <p>The event window must be >= 4 hours. The combined total time ranges in the event\\n               window must be >= 4 hours.</p>\\n            </li>\\n         </ul>\\n         <p>For more information about cron expressions, see <a href=\\\"https://en.wikipedia.org/wiki/Cron\\\">cron</a> on the <i>Wikipedia\\n            website</i>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyInstanceEventWindowResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceEventWindow\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceEventWindow\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceEventWindow\",\n                        \"smithy.api#documentation\": \"<p>Information about the event window.</p>\",\n                        \"smithy.api#xmlName\": \"instanceEventWindow\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyInstanceMaintenanceOptions\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ModifyInstanceMaintenanceOptionsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ModifyInstanceMaintenanceOptionsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Modifies the recovery behavior of your instance to disable simplified automatic\\n            recovery or set the recovery behavior to default. The default configuration will not\\n            enable simplified automatic recovery for an unsupported instance type. For more\\n            information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-recover.html#instance-configuration-recovery\\\">Simplified automatic recovery</a>.</p>\\n         <p>Modifies the reboot migration behavior during a user-initiated reboot of an instance\\n            that has a pending <code>system-reboot</code> event. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/schedevents_actions_reboot.html#reboot-migration\\\">Enable or disable reboot migration</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ModifyInstanceMaintenanceOptionsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the instance.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"AutoRecovery\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceAutoRecoveryState\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Disables the automatic recovery behavior of your instance or sets it to\\n            default.</p>\"\n                    }\n                },\n                \"RebootMigration\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceRebootMigrationState\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies whether to attempt reboot migration during a user-initiated reboot of an\\n            instance that has a scheduled <code>system-reboot</code> event:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>default</code> - Amazon EC2 attempts to migrate the instance to\\n                    new hardware (reboot migration). If successful, the <code>system-reboot</code>\\n                    event is cleared. If unsuccessful, an in-place reboot occurs and the event\\n                    remains scheduled.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>disabled</code> - Amazon EC2 keeps the instance on the same\\n                    hardware (in-place reboot). The <code>system-reboot</code> event remains\\n                    scheduled.</p>\\n            </li>\\n         </ul>\\n         <p>This setting only applies to supported instances that have a scheduled reboot event.\\n            For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/schedevents_actions_reboot.html#reboot-migration\\\">Enable or disable reboot migration</a> in the\\n            <i>Amazon EC2 User Guide</i>.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually\\n            making the request, and provides an error response. If you have the required\\n            permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is\\n            <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyInstanceMaintenanceOptionsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the instance.</p>\",\n                        \"smithy.api#xmlName\": \"instanceId\"\n                    }\n                },\n                \"AutoRecovery\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceAutoRecoveryState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AutoRecovery\",\n                        \"smithy.api#documentation\": \"<p>Provides information on the current automatic recovery behavior of your\\n            instance.</p>\",\n                        \"smithy.api#xmlName\": \"autoRecovery\"\n                    }\n                },\n                \"RebootMigration\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceRebootMigrationState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RebootMigration\",\n                        \"smithy.api#documentation\": \"<p>Specifies whether to attempt reboot migration during a user-initiated reboot of an\\n            instance that has a scheduled <code>system-reboot</code> event:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>default</code> - Amazon EC2 attempts to migrate the instance to\\n                    new hardware (reboot migration). If successful, the <code>system-reboot</code>\\n                    event is cleared. If unsuccessful, an in-place reboot occurs and the event\\n                    remains scheduled.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>disabled</code> - Amazon EC2 keeps the instance on the same\\n                    hardware (in-place reboot). The <code>system-reboot</code> event remains\\n                    scheduled.</p>\\n            </li>\\n         </ul>\\n         <p>This setting only applies to supported instances that have a scheduled reboot event.\\n            For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/schedevents_actions_reboot.html#reboot-migration\\\">Enable or disable reboot migration</a> in the\\n            <i>Amazon EC2 User Guide</i>.</p>\",\n                        \"smithy.api#xmlName\": \"rebootMigration\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyInstanceMetadataDefaults\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ModifyInstanceMetadataDefaultsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ModifyInstanceMetadataDefaultsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Modifies the default instance metadata service (IMDS) settings at the account level in\\n            the specified Amazon Web Services\\u2028 Region.</p>\\n         <note>\\n            <p>To remove a parameter's account-level default setting, specify\\n                <code>no-preference</code>. If an account-level setting is cleared with\\n                <code>no-preference</code>, then the instance launch considers the other\\n                instance metadata settings. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/configuring-instance-metadata-options.html#instance-metadata-options-order-of-precedence\\\">Order of precedence for instance metadata options</a> in the\\n                <i>Amazon EC2 User Guide</i>.</p>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.ec2#ModifyInstanceMetadataDefaultsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"HttpTokens\": {\n                    \"target\": \"com.amazonaws.ec2#MetadataDefaultHttpTokensState\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether IMDSv2 is required.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>optional</code> – IMDSv2 is optional, which means that you can\\n                    use either IMDSv2 or IMDSv1.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>required</code> – IMDSv2 is required, which means that IMDSv1 is\\n                    disabled, and you must use IMDSv2.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"HttpPutResponseHopLimit\": {\n                    \"target\": \"com.amazonaws.ec2#BoxedInteger\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of hops that the metadata token can travel. To indicate no\\n            preference, specify <code>-1</code>.</p>\\n         <p>Possible values: Integers from <code>1</code> to <code>64</code>, and <code>-1</code>\\n            to indicate no preference</p>\"\n                    }\n                },\n                \"HttpEndpoint\": {\n                    \"target\": \"com.amazonaws.ec2#DefaultInstanceMetadataEndpointState\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Enables or disables the IMDS endpoint on an instance. When disabled, the instance\\n            metadata can't be accessed.</p>\"\n                    }\n                },\n                \"InstanceMetadataTags\": {\n                    \"target\": \"com.amazonaws.ec2#DefaultInstanceMetadataTagsState\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Enables or disables access to an instance's tags from the instance metadata. For more\\n            information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Tags.html#work-with-tags-in-IMDS\\\">Work with\\n                instance tags using the instance metadata</a> in the\\n            <i>Amazon EC2 User Guide</i>.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the operation, without actually making the \\n  request, and provides an error response. If you have the required permissions, the error response is \\n  <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyInstanceMetadataDefaultsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Return\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Return\",\n                        \"smithy.api#documentation\": \"<p>If the request succeeds, the response returns <code>true</code>. If the request fails,\\n            no response is returned, and instead an error message is returned.</p>\",\n                        \"smithy.api#xmlName\": \"return\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyInstanceMetadataOptions\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ModifyInstanceMetadataOptionsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ModifyInstanceMetadataOptionsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Modify the instance metadata parameters on a running or stopped instance. When you\\n            modify the parameters on a stopped instance, they are applied when the instance is\\n            started. When you modify the parameters on a running instance, the API responds with a\\n            state of “pending”. After the parameter modifications are successfully applied to the\\n            instance, the state of the modifications changes from “pending” to “applied” in\\n            subsequent describe-instances API calls. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html\\\">Instance metadata and user data</a> in the\\n                <i>Amazon EC2 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ModifyInstanceMetadataOptionsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the instance.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"HttpTokens\": {\n                    \"target\": \"com.amazonaws.ec2#HttpTokensState\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether IMDSv2 is required.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>optional</code> - IMDSv2 is optional. You can choose whether to send a \\n                    session token in your instance metadata retrieval requests. If you retrieve \\n                    IAM role credentials without a session token, you receive the IMDSv1 role \\n                    credentials. If you retrieve IAM role credentials using a valid session token, \\n                    you receive the IMDSv2 role credentials.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>required</code> - IMDSv2 is required. You must send a session token \\n                    in your instance metadata retrieval requests. With this option, retrieving the \\n                    IAM role credentials always returns IMDSv2 credentials; IMDSv1 credentials are \\n                    not available.</p>\\n            </li>\\n         </ul>\\n         <p>Default:</p>\\n         <ul>\\n            <li>\\n               <p>If the value of <code>ImdsSupport</code> for the Amazon Machine Image (AMI)\\n                    for your instance is <code>v2.0</code> and the account level default is set to\\n                    <code>no-preference</code>, the default is <code>required</code>.</p>\\n            </li>\\n            <li>\\n               <p>If the value of <code>ImdsSupport</code> for the Amazon Machine Image (AMI)\\n                    for your instance is <code>v2.0</code>, but the account level default is set to\\n                    <code>V1 or V2</code>, the default is <code>optional</code>.</p>\\n            </li>\\n         </ul>\\n         <p>The default value can also be affected by other combinations of parameters. For more\\n            information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/configuring-instance-metadata-options.html#instance-metadata-options-order-of-precedence\\\">Order of precedence for instance metadata options</a> in the\\n            <i>Amazon EC2 User Guide</i>.</p>\"\n                    }\n                },\n                \"HttpPutResponseHopLimit\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The desired HTTP PUT response hop limit for instance metadata requests. The larger the\\n            number, the further instance metadata requests can travel. If no parameter is specified,\\n            the existing state is maintained.</p>\\n         <p>Possible values: Integers from 1 to 64</p>\"\n                    }\n                },\n                \"HttpEndpoint\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceMetadataEndpointState\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Enables or disables the HTTP metadata endpoint on your instances. If this parameter is\\n            not specified, the existing state is maintained.</p>\\n         <p>If you specify a value of <code>disabled</code>, you cannot access your instance\\n            metadata.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually\\n            making the request, and provides an error response. If you have the required\\n            permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is\\n                <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"HttpProtocolIpv6\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceMetadataProtocolState\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Enables or disables the IPv6 endpoint for the instance metadata service. \\n            Applies only if you enabled the HTTP metadata endpoint.</p>\"\n                    }\n                },\n                \"InstanceMetadataTags\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceMetadataTagsState\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Set to <code>enabled</code> to allow access to instance tags from the instance\\n            metadata. Set to <code>disabled</code> to turn off access to instance tags from the\\n            instance metadata. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Tags.html#work-with-tags-in-IMDS\\\">Work with\\n                instance tags using the instance metadata</a>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyInstanceMetadataOptionsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the instance.</p>\",\n                        \"smithy.api#xmlName\": \"instanceId\"\n                    }\n                },\n                \"InstanceMetadataOptions\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceMetadataOptionsResponse\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceMetadataOptions\",\n                        \"smithy.api#documentation\": \"<p>The metadata options for the instance.</p>\",\n                        \"smithy.api#xmlName\": \"instanceMetadataOptions\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyInstanceNetworkPerformanceOptions\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ModifyInstanceNetworkPerformanceRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ModifyInstanceNetworkPerformanceResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Change the configuration of the network performance options for an existing \\n            instance.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ModifyInstanceNetworkPerformanceRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the instance to update.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"BandwidthWeighting\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceBandwidthWeighting\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>Specify the bandwidth weighting option to boost the associated type of baseline bandwidth, as follows:</p>\\n         <dl>\\n            <dt>default</dt>\\n            <dd>\\n               <p>This option uses the standard bandwidth configuration for your instance type.</p>\\n            </dd>\\n            <dt>vpc-1</dt>\\n            <dd>\\n               <p>This option boosts your networking baseline bandwidth and reduces your EBS \\n                        baseline bandwidth.</p>\\n            </dd>\\n            <dt>ebs-1</dt>\\n            <dd>\\n               <p>This option boosts your EBS baseline bandwidth and reduces your networking \\n                        baseline bandwidth.</p>\\n            </dd>\\n         </dl>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the operation, without actually making the \\n  request, and provides an error response. If you have the required permissions, the error response is \\n  <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyInstanceNetworkPerformanceResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceId\",\n                        \"smithy.api#documentation\": \"<p>The instance ID that was updated.</p>\",\n                        \"smithy.api#xmlName\": \"instanceId\"\n                    }\n                },\n                \"BandwidthWeighting\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceBandwidthWeighting\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"BandwidthWeighting\",\n                        \"smithy.api#documentation\": \"<p>Contains the updated configuration for bandwidth weighting on the specified instance.</p>\",\n                        \"smithy.api#xmlName\": \"bandwidthWeighting\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyInstancePlacement\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ModifyInstancePlacementRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ModifyInstancePlacementResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Modifies the placement attributes for a specified instance. You can do the\\n            following:</p>\\n         <ul>\\n            <li>\\n               <p>Modify the affinity between an instance and a <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/dedicated-hosts-overview.html\\\">Dedicated\\n                        Host</a>. When affinity is set to <code>host</code> and the instance is\\n                    not associated with a specific Dedicated Host, the next time the instance is\\n                    started, it is automatically associated with the host on which it lands. If the\\n                    instance is restarted or rebooted, this relationship persists.</p>\\n            </li>\\n            <li>\\n               <p>Change the Dedicated Host with which an instance is associated.</p>\\n            </li>\\n            <li>\\n               <p>Change the instance tenancy of an instance.</p>\\n            </li>\\n            <li>\\n               <p>Move an instance to or from a <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/placement-groups.html\\\">placement\\n                    group</a>.</p>\\n            </li>\\n         </ul>\\n         <p>At least one attribute for affinity, host ID, tenancy, or placement group name must be\\n            specified in the request. Affinity and tenancy can be modified in the same\\n            request.</p>\\n         <p>To modify the host ID, tenancy, placement group, or partition for an instance, the\\n            instance must be in the <code>stopped</code> state.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ModifyInstancePlacementRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"GroupName\": {\n                    \"target\": \"com.amazonaws.ec2#PlacementGroupName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the placement group in which to place the instance. For spread placement\\n            groups, the instance must have a tenancy of <code>default</code>. For cluster and\\n            partition placement groups, the instance must have a tenancy of <code>default</code> or\\n                <code>dedicated</code>.</p>\\n         <p>To remove an instance from a placement group, specify an empty string (\\\"\\\").</p>\"\n                    }\n                },\n                \"PartitionNumber\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of the partition in which to place the instance. Valid only if the\\n            placement group strategy is set to <code>partition</code>.</p>\"\n                    }\n                },\n                \"HostResourceGroupArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the host resource group in which to place the instance. The instance must\\n            have a tenancy of <code>host</code> to specify this parameter.</p>\"\n                    }\n                },\n                \"GroupId\": {\n                    \"target\": \"com.amazonaws.ec2#PlacementGroupId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Group Id of a placement group. You must specify the Placement Group <b>Group Id</b> to launch an instance in a shared placement\\n            group.</p>\"\n                    }\n                },\n                \"InstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceId\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the instance that you are modifying.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"instanceId\"\n                    }\n                },\n                \"Tenancy\": {\n                    \"target\": \"com.amazonaws.ec2#HostTenancy\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Tenancy\",\n                        \"smithy.api#documentation\": \"<p>The tenancy for the instance.</p>\\n         <note>\\n            <p>For T3 instances, you must launch the instance on a Dedicated Host to use a\\n                tenancy of <code>host</code>. You can't change the tenancy from\\n                <code>host</code> to <code>dedicated</code> or <code>default</code>.\\n                Attempting to make one of these unsupported tenancy changes results in an\\n                <code>InvalidRequest</code> error code.</p>\\n         </note>\",\n                        \"smithy.api#xmlName\": \"tenancy\"\n                    }\n                },\n                \"Affinity\": {\n                    \"target\": \"com.amazonaws.ec2#Affinity\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Affinity\",\n                        \"smithy.api#documentation\": \"<p>The affinity setting for the instance. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/how-dedicated-hosts-work.html#dedicated-hosts-affinity\\\">Host affinity</a> in the <i>Amazon EC2 User Guide</i>.</p>\",\n                        \"smithy.api#xmlName\": \"affinity\"\n                    }\n                },\n                \"HostId\": {\n                    \"target\": \"com.amazonaws.ec2#DedicatedHostId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"HostId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Dedicated Host with which to associate the instance.</p>\",\n                        \"smithy.api#xmlName\": \"hostId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyInstancePlacementResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Return\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Return\",\n                        \"smithy.api#documentation\": \"<p>Is <code>true</code> if the request succeeds, and an error otherwise.</p>\",\n                        \"smithy.api#xmlName\": \"return\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyIpam\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ModifyIpamRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ModifyIpamResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Modify the configurations of an IPAM.\\n      </p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ModifyIpamPool\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ModifyIpamPoolRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ModifyIpamPoolResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Modify the configurations of an IPAM pool.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/ipam/mod-pool-ipam.html\\\">Modify a pool</a> in the <i>Amazon VPC IPAM User Guide</i>.\\n      </p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ModifyIpamPoolRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A check for whether you have the required permissions for the action without actually making the request \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"IpamPoolId\": {\n                    \"target\": \"com.amazonaws.ec2#IpamPoolId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the IPAM pool you want to modify.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The description of the IPAM pool you want to modify.</p>\"\n                    }\n                },\n                \"AutoImport\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If true, IPAM will continuously look for resources within the CIDR range of this pool \\n         and automatically import them as allocations into your IPAM. The CIDRs that will be allocated for\\n         these resources must not already be allocated to other resources in order for the import to succeed. IPAM will import \\n         a CIDR regardless of its compliance with the pool's allocation rules, so a resource might be imported and subsequently \\n         marked as noncompliant. If IPAM discovers multiple CIDRs that overlap, IPAM will import the largest CIDR only. If IPAM \\n         discovers multiple CIDRs with matching CIDRs, IPAM will randomly import one of them only.\\n      </p>\\n         <p>A locale must be set on the pool for this feature to work.</p>\"\n                    }\n                },\n                \"AllocationMinNetmaskLength\": {\n                    \"target\": \"com.amazonaws.ec2#IpamNetmaskLength\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The minimum netmask length required for CIDR allocations in this IPAM pool to be compliant. Possible \\n         netmask lengths for IPv4 addresses are 0 - 32. Possible netmask lengths for IPv6 addresses are  0 - 128. The minimum netmask \\n         length must be less than the maximum netmask length.</p>\"\n                    }\n                },\n                \"AllocationMaxNetmaskLength\": {\n                    \"target\": \"com.amazonaws.ec2#IpamNetmaskLength\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum netmask length possible for CIDR allocations in this IPAM pool to be compliant. Possible \\n         netmask lengths for IPv4 addresses are 0 - 32. Possible netmask lengths for IPv6 addresses are  0 - 128.The maximum netmask \\n         length must be greater than the minimum netmask length.</p>\"\n                    }\n                },\n                \"AllocationDefaultNetmaskLength\": {\n                    \"target\": \"com.amazonaws.ec2#IpamNetmaskLength\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The default netmask length for allocations added to this pool. If, for example, the CIDR assigned to this pool is 10.0.0.0/8 and you enter 16 here, new allocations will default to 10.0.0.0/16.</p>\"\n                    }\n                },\n                \"ClearAllocationDefaultNetmaskLength\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Clear the default netmask length allocation rule for this pool.</p>\"\n                    }\n                },\n                \"AddAllocationResourceTags\": {\n                    \"target\": \"com.amazonaws.ec2#RequestIpamResourceTagList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Add tag allocation rules to a pool. For more information about allocation rules, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/ipam/create-top-ipam.html\\\">Create a top-level pool</a> in the <i>Amazon VPC IPAM User Guide</i>.</p>\",\n                        \"smithy.api#xmlName\": \"AddAllocationResourceTag\"\n                    }\n                },\n                \"RemoveAllocationResourceTags\": {\n                    \"target\": \"com.amazonaws.ec2#RequestIpamResourceTagList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Remove tag allocation rules from a pool.</p>\",\n                        \"smithy.api#xmlName\": \"RemoveAllocationResourceTag\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyIpamPoolResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"IpamPool\": {\n                    \"target\": \"com.amazonaws.ec2#IpamPool\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpamPool\",\n                        \"smithy.api#documentation\": \"<p>The results of the modification.</p>\",\n                        \"smithy.api#xmlName\": \"ipamPool\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyIpamRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A check for whether you have the required permissions for the action without actually making the request \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"IpamId\": {\n                    \"target\": \"com.amazonaws.ec2#IpamId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the IPAM you want to modify.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The description of the IPAM you want to modify.</p>\"\n                    }\n                },\n                \"AddOperatingRegions\": {\n                    \"target\": \"com.amazonaws.ec2#AddIpamOperatingRegionSet\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Choose the operating Regions for the IPAM. Operating Regions are Amazon Web Services Regions where the IPAM is allowed to manage IP address CIDRs. IPAM only discovers and monitors resources in the Amazon Web Services Regions you select as operating Regions.</p>\\n         <p>For more information about operating Regions, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/ipam/create-ipam.html\\\">Create an IPAM</a> in the <i>Amazon VPC IPAM User Guide</i>.</p>\",\n                        \"smithy.api#xmlName\": \"AddOperatingRegion\"\n                    }\n                },\n                \"RemoveOperatingRegions\": {\n                    \"target\": \"com.amazonaws.ec2#RemoveIpamOperatingRegionSet\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The operating Regions to remove.</p>\",\n                        \"smithy.api#xmlName\": \"RemoveOperatingRegion\"\n                    }\n                },\n                \"Tier\": {\n                    \"target\": \"com.amazonaws.ec2#IpamTier\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>IPAM is offered in a Free Tier and an Advanced Tier. For more information about the features available in each tier and the costs associated with the tiers, see <a href=\\\"http://aws.amazon.com/vpc/pricing/\\\">Amazon VPC pricing > IPAM tab</a>.</p>\"\n                    }\n                },\n                \"EnablePrivateGua\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Enable this option to use your own GUA ranges as private IPv6 addresses. This option is disabled by default.</p>\"\n                    }\n                },\n                \"MeteredAccount\": {\n                    \"target\": \"com.amazonaws.ec2#IpamMeteredAccount\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A metered account is an Amazon Web Services account that is charged for active IP addresses managed in IPAM. For more information, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/ipam/ipam-enable-cost-distro.html\\\">Enable cost distribution</a> in the <i>Amazon VPC IPAM User Guide</i>.</p>\\n         <p>Possible values:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>ipam-owner</code> (default): The Amazon Web Services account which owns the IPAM is charged for all active IP addresses managed in IPAM.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>resource-owner</code>: The Amazon Web Services account that owns the IP address is charged for the active IP address.</p>\\n            </li>\\n         </ul>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyIpamResourceCidr\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ModifyIpamResourceCidrRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ModifyIpamResourceCidrResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Modify a resource CIDR. You can use this action to transfer resource CIDRs between scopes and ignore resource CIDRs that you do not want to manage. If set to false, the resource will not be tracked for overlap, it cannot be auto-imported into a pool, and it will be removed from any pool it has an allocation in.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/ipam/move-resource-ipam.html\\\">Move resource CIDRs between scopes</a> and <a href=\\\"https://docs.aws.amazon.com/vpc/latest/ipam/change-monitoring-state-ipam.html\\\">Change the monitoring state of resource CIDRs</a> in the <i>Amazon VPC IPAM User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ModifyIpamResourceCidrRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A check for whether you have the required permissions for the action without actually making the request \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"ResourceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the resource you want to modify.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ResourceCidr\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The CIDR of the resource you want to modify.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ResourceRegion\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services Region of the resource you want to modify.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"CurrentIpamScopeId\": {\n                    \"target\": \"com.amazonaws.ec2#IpamScopeId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the current scope that the resource CIDR is in.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DestinationIpamScopeId\": {\n                    \"target\": \"com.amazonaws.ec2#IpamScopeId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the scope you want to transfer the resource CIDR to.</p>\"\n                    }\n                },\n                \"Monitored\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>Determines if the resource is monitored by IPAM. If a resource is monitored, the resource is discovered by IPAM and you can view details about the resource’s CIDR.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyIpamResourceCidrResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"IpamResourceCidr\": {\n                    \"target\": \"com.amazonaws.ec2#IpamResourceCidr\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpamResourceCidr\",\n                        \"smithy.api#documentation\": \"<p>The CIDR of the resource.</p>\",\n                        \"smithy.api#xmlName\": \"ipamResourceCidr\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyIpamResourceDiscovery\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ModifyIpamResourceDiscoveryRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ModifyIpamResourceDiscoveryResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Modifies a resource discovery. A resource discovery is an IPAM component that enables IPAM to manage and monitor resources that belong to the owning account.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ModifyIpamResourceDiscoveryRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A check for whether you have the required permissions for the action without actually making the request \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"IpamResourceDiscoveryId\": {\n                    \"target\": \"com.amazonaws.ec2#IpamResourceDiscoveryId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>A resource discovery ID.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A resource discovery description.</p>\"\n                    }\n                },\n                \"AddOperatingRegions\": {\n                    \"target\": \"com.amazonaws.ec2#AddIpamOperatingRegionSet\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Add operating Regions to the resource discovery. Operating Regions are Amazon Web Services Regions where the IPAM is allowed to manage IP address CIDRs. IPAM only discovers and monitors resources in the Amazon Web Services Regions you select as operating Regions.</p>\",\n                        \"smithy.api#xmlName\": \"AddOperatingRegion\"\n                    }\n                },\n                \"RemoveOperatingRegions\": {\n                    \"target\": \"com.amazonaws.ec2#RemoveIpamOperatingRegionSet\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Remove operating Regions.</p>\",\n                        \"smithy.api#xmlName\": \"RemoveOperatingRegion\"\n                    }\n                },\n                \"AddOrganizationalUnitExclusions\": {\n                    \"target\": \"com.amazonaws.ec2#AddIpamOrganizationalUnitExclusionSet\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Add an Organizational Unit (OU) exclusion to your IPAM. If your IPAM is integrated with Amazon Web Services Organizations and you add an organizational unit (OU) exclusion, IPAM will not manage the IP addresses in accounts in that OU exclusion. There is a limit on the number of exclusions you can create. For more information, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/ipam/quotas-ipam.html\\\">Quotas for your IPAM</a> in the <i>Amazon VPC IPAM User Guide</i>.</p>\\n         <note>\\n            <p>The resulting set of exclusions must not result in \\\"overlap\\\", meaning two or more OU\\n         exclusions must not exclude the same OU. For more information and examples, see the Amazon Web Services CLI request process in <a href=\\\"https://docs.aws.amazon.com/vpc/latest/ipam/exclude-ous.html#exclude-ous-create-delete\\\">Add or remove OU exclusions\\n         </a> in the <i>Amazon VPC User Guide</i>.</p>\\n         </note>\",\n                        \"smithy.api#xmlName\": \"AddOrganizationalUnitExclusion\"\n                    }\n                },\n                \"RemoveOrganizationalUnitExclusions\": {\n                    \"target\": \"com.amazonaws.ec2#RemoveIpamOrganizationalUnitExclusionSet\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Remove an Organizational Unit (OU) exclusion to your IPAM. If your IPAM is integrated with Amazon Web Services Organizations and you add an organizational unit (OU) exclusion, IPAM will not manage the IP addresses in accounts in that OU exclusion. There is a limit on the number of exclusions you can create. For more information, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/ipam/quotas-ipam.html\\\">Quotas for your IPAM</a> in the <i>Amazon VPC IPAM User Guide</i>.</p>\\n         <note>\\n            <p>The resulting set of exclusions must not result in \\\"overlap\\\", meaning two or more OU\\n            exclusions must not exclude the same OU. For more information and examples, see the Amazon Web Services CLI request process in <a href=\\\"https://docs.aws.amazon.com/vpc/latest/ipam/exclude-ous.html#exclude-ous-create-delete\\\">Add or remove OU exclusions\\n            </a> in the <i>Amazon VPC User Guide</i>.</p>\\n         </note>\",\n                        \"smithy.api#xmlName\": \"RemoveOrganizationalUnitExclusion\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyIpamResourceDiscoveryResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"IpamResourceDiscovery\": {\n                    \"target\": \"com.amazonaws.ec2#IpamResourceDiscovery\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpamResourceDiscovery\",\n                        \"smithy.api#documentation\": \"<p>A resource discovery.</p>\",\n                        \"smithy.api#xmlName\": \"ipamResourceDiscovery\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyIpamResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Ipam\": {\n                    \"target\": \"com.amazonaws.ec2#Ipam\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Ipam\",\n                        \"smithy.api#documentation\": \"<p>The results of the modification.</p>\",\n                        \"smithy.api#xmlName\": \"ipam\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyIpamScope\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ModifyIpamScopeRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ModifyIpamScopeResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Modify an IPAM scope.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ModifyIpamScopeRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A check for whether you have the required permissions for the action without actually making the request \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"IpamScopeId\": {\n                    \"target\": \"com.amazonaws.ec2#IpamScopeId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the scope you want to modify.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The description of the scope you want to modify.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyIpamScopeResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"IpamScope\": {\n                    \"target\": \"com.amazonaws.ec2#IpamScope\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpamScope\",\n                        \"smithy.api#documentation\": \"<p>The results of the modification.</p>\",\n                        \"smithy.api#xmlName\": \"ipamScope\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyLaunchTemplate\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ModifyLaunchTemplateRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ModifyLaunchTemplateResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Modifies a launch template. You can specify which version of the launch template to\\n            set as the default version. When launching an instance, the default version applies when\\n            a launch template version is not specified.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To change the default version of a launch template\",\n                        \"documentation\": \"This example specifies version 2 as the default version of the specified launch template.\",\n                        \"input\": {\n                            \"LaunchTemplateId\": \"lt-0abcd290751193123\",\n                            \"DefaultVersion\": \"2\"\n                        },\n                        \"output\": {\n                            \"LaunchTemplate\": {\n                                \"LatestVersionNumber\": 2,\n                                \"LaunchTemplateId\": \"lt-0abcd290751193123\",\n                                \"LaunchTemplateName\": \"WebServers\",\n                                \"DefaultVersionNumber\": 2,\n                                \"CreatedBy\": \"arn:aws:iam::123456789012:root\",\n                                \"CreateTime\": \"2017-12-01T13:35:46.000Z\"\n                            }\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#ModifyLaunchTemplateRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually\\n            making the request, and provides an error response. If you have the required\\n            permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is\\n                <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Unique, case-sensitive identifier you provide to ensure the idempotency of the\\n            request. If a client token isn't specified, a randomly generated token is used in the\\n            request to ensure idempotency.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Run_Instance_Idempotency.html\\\">Ensuring\\n                idempotency</a>.</p>\\n         <p>Constraint: Maximum 128 ASCII characters.</p>\",\n                        \"smithy.api#idempotencyToken\": {}\n                    }\n                },\n                \"LaunchTemplateId\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplateId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the launch template.</p>\\n         <p>You must specify either the launch template ID or the launch template name, but not\\n            both.</p>\"\n                    }\n                },\n                \"LaunchTemplateName\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplateName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the launch template.</p>\\n         <p>You must specify either the launch template ID or the launch template name, but not\\n            both.</p>\"\n                    }\n                },\n                \"DefaultVersion\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The version number of the launch template to set as the default version.</p>\",\n                        \"smithy.api#xmlName\": \"SetDefaultVersion\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyLaunchTemplateResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LaunchTemplate\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplate\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LaunchTemplate\",\n                        \"smithy.api#documentation\": \"<p>Information about the launch template.</p>\",\n                        \"smithy.api#xmlName\": \"launchTemplate\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyLocalGatewayRoute\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ModifyLocalGatewayRouteRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ModifyLocalGatewayRouteResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Modifies the specified local gateway route.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ModifyLocalGatewayRouteRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DestinationCidrBlock\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The CIDR block used for destination matches. The value that you provide must match the CIDR of an existing route in the table.</p>\"\n                    }\n                },\n                \"LocalGatewayRouteTableId\": {\n                    \"target\": \"com.amazonaws.ec2#LocalGatewayRoutetableId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the local gateway route table.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"LocalGatewayVirtualInterfaceGroupId\": {\n                    \"target\": \"com.amazonaws.ec2#LocalGatewayVirtualInterfaceGroupId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>\\n         The ID of the virtual interface group.\\n      </p>\"\n                    }\n                },\n                \"NetworkInterfaceId\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInterfaceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the network interface.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"DestinationPrefixListId\": {\n                    \"target\": \"com.amazonaws.ec2#PrefixListResourceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>\\n         The ID of the prefix list. Use a prefix list in place of <code>DestinationCidrBlock</code>. You \\n         cannot use <code>DestinationPrefixListId</code> and <code>DestinationCidrBlock</code> in the same request.\\n      </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyLocalGatewayRouteResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Route\": {\n                    \"target\": \"com.amazonaws.ec2#LocalGatewayRoute\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Route\",\n                        \"smithy.api#documentation\": \"<p>Information about the local gateway route table.</p>\",\n                        \"smithy.api#xmlName\": \"route\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyManagedPrefixList\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ModifyManagedPrefixListRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ModifyManagedPrefixListResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Modifies the specified managed prefix list.</p>\\n         <p>Adding or removing entries in a prefix list creates a new version of the prefix list.\\n            Changing the name of the prefix list does not affect the version.</p>\\n         <p>If you specify a current version number that does not match the true current version\\n            number, the request fails.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ModifyManagedPrefixListRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"PrefixListId\": {\n                    \"target\": \"com.amazonaws.ec2#PrefixListResourceId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the prefix list.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"CurrentVersion\": {\n                    \"target\": \"com.amazonaws.ec2#Long\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The current version of the prefix list.</p>\"\n                    }\n                },\n                \"PrefixListName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A name for the prefix list.</p>\"\n                    }\n                },\n                \"AddEntries\": {\n                    \"target\": \"com.amazonaws.ec2#AddPrefixListEntries\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more entries to add to the prefix list.</p>\",\n                        \"smithy.api#xmlName\": \"AddEntry\"\n                    }\n                },\n                \"RemoveEntries\": {\n                    \"target\": \"com.amazonaws.ec2#RemovePrefixListEntries\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more entries to remove from the prefix list.</p>\",\n                        \"smithy.api#xmlName\": \"RemoveEntry\"\n                    }\n                },\n                \"MaxEntries\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of entries for the prefix list. You cannot modify the entries  \\n            of a prefix list and modify the size of a prefix list at the same time.</p>\\n         <p>If any of the resources that reference the prefix list cannot support the new\\n            maximum size, the modify operation fails. Check the state message for the IDs of \\n            the first ten resources that do not support the new maximum size.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyManagedPrefixListResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PrefixList\": {\n                    \"target\": \"com.amazonaws.ec2#ManagedPrefixList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PrefixList\",\n                        \"smithy.api#documentation\": \"<p>Information about the prefix list.</p>\",\n                        \"smithy.api#xmlName\": \"prefixList\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyNetworkInterfaceAttribute\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ModifyNetworkInterfaceAttributeRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Modifies the specified network interface attribute. You can specify only one attribute\\n            at a time. You can use this action to attach and detach security groups from an existing\\n            EC2 instance.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To modify the attachment attribute of a network interface\",\n                        \"documentation\": \"This example modifies the attachment attribute of the specified network interface.\",\n                        \"input\": {\n                            \"NetworkInterfaceId\": \"eni-686ea200\",\n                            \"Attachment\": {\n                                \"AttachmentId\": \"eni-attach-43348162\",\n                                \"DeleteOnTermination\": false\n                            }\n                        }\n                    },\n                    {\n                        \"title\": \"To modify the description attribute of a network interface\",\n                        \"documentation\": \"This example modifies the description attribute of the specified network interface.\",\n                        \"input\": {\n                            \"NetworkInterfaceId\": \"eni-686ea200\",\n                            \"Description\": {\n                                \"Value\": \"My description\"\n                            }\n                        }\n                    },\n                    {\n                        \"title\": \"To modify the groupSet attribute of a network interface\",\n                        \"documentation\": \"This example command modifies the groupSet attribute of the specified network interface.\",\n                        \"input\": {\n                            \"NetworkInterfaceId\": \"eni-686ea200\",\n                            \"Groups\": [\n                                \"sg-903004f8\",\n                                \"sg-1a2b3c4d\"\n                            ]\n                        }\n                    },\n                    {\n                        \"title\": \"To modify the sourceDestCheck attribute of a network interface\",\n                        \"documentation\": \"This example command modifies the sourceDestCheck attribute of the specified network interface.\",\n                        \"input\": {\n                            \"NetworkInterfaceId\": \"eni-686ea200\",\n                            \"SourceDestCheck\": {\n                                \"Value\": false\n                            }\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#ModifyNetworkInterfaceAttributeRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"EnaSrdSpecification\": {\n                    \"target\": \"com.amazonaws.ec2#EnaSrdSpecification\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Updates the ENA Express configuration for the network interface that’s attached to the\\n            instance.</p>\"\n                    }\n                },\n                \"EnablePrimaryIpv6\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If you’re modifying a network interface in a dual-stack or IPv6-only subnet, you have\\n            the option to assign a primary IPv6 IP address. A primary IPv6 address is an IPv6 GUA\\n            address associated with an ENI that you have enabled to use a primary IPv6 address. Use\\n            this option if the instance that this ENI will be attached to relies on its IPv6 address\\n            not changing. Amazon Web Services will automatically assign an IPv6 address associated\\n            with the ENI attached to your instance to be the primary IPv6 address. Once you enable\\n            an IPv6 GUA address to be a primary IPv6, you cannot disable it. When you enable an IPv6\\n            GUA address to be a primary IPv6, the first IPv6 GUA will be made the primary IPv6\\n            address until the instance is terminated or the network interface is detached. If you\\n            have multiple IPv6 addresses associated with an ENI attached to your instance and you\\n            enable a primary IPv6 address, the first IPv6 GUA address associated with the ENI\\n            becomes the primary IPv6 address.</p>\"\n                    }\n                },\n                \"ConnectionTrackingSpecification\": {\n                    \"target\": \"com.amazonaws.ec2#ConnectionTrackingSpecificationRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A connection tracking specification.</p>\"\n                    }\n                },\n                \"AssociatePublicIpAddress\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether to assign a public IPv4 address to a network interface. This option\\n            can be enabled for any network interface but will only apply to the primary network\\n            interface (eth0).</p>\"\n                    }\n                },\n                \"AssociatedSubnetIds\": {\n                    \"target\": \"com.amazonaws.ec2#SubnetIdList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of subnet IDs to associate with the network interface.</p>\",\n                        \"smithy.api#xmlName\": \"AssociatedSubnetId\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually\\n            making the request, and provides an error response. If you have the required\\n            permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is\\n                <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"NetworkInterfaceId\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInterfaceId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkInterfaceId\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the network interface.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"networkInterfaceId\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#AttributeValue\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Description\",\n                        \"smithy.api#documentation\": \"<p>A description for the network interface.</p>\",\n                        \"smithy.api#xmlName\": \"description\"\n                    }\n                },\n                \"SourceDestCheck\": {\n                    \"target\": \"com.amazonaws.ec2#AttributeBooleanValue\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SourceDestCheck\",\n                        \"smithy.api#documentation\": \"<p>Enable or disable source/destination checks, which ensure that the instance is either\\n            the source or the destination of any traffic that it receives. If the value is\\n                <code>true</code>, source/destination checks are enabled; otherwise, they are\\n            disabled. The default value is <code>true</code>. You must disable source/destination\\n            checks if the instance runs services such as network address translation, routing, or\\n            firewalls.</p>\",\n                        \"smithy.api#xmlName\": \"sourceDestCheck\"\n                    }\n                },\n                \"Groups\": {\n                    \"target\": \"com.amazonaws.ec2#SecurityGroupIdStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Changes the security groups for the network interface. The new set of groups you\\n            specify replaces the current set. You must specify at least one group, even if it's just\\n            the default security group in the VPC. You must specify the ID of the security group,\\n            not the name.</p>\",\n                        \"smithy.api#xmlName\": \"SecurityGroupId\"\n                    }\n                },\n                \"Attachment\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInterfaceAttachmentChanges\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Attachment\",\n                        \"smithy.api#documentation\": \"<p>Information about the interface attachment. If modifying the <code>delete on\\n                termination</code> attribute, you must specify the ID of the interface\\n            attachment.</p>\",\n                        \"smithy.api#xmlName\": \"attachment\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the parameters for ModifyNetworkInterfaceAttribute.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyPrivateDnsNameOptions\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ModifyPrivateDnsNameOptionsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ModifyPrivateDnsNameOptionsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Modifies the options for instance hostnames for the specified instance.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ModifyPrivateDnsNameOptionsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually\\n            making the request, and provides an error response. If you have the required\\n            permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is\\n                <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"InstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the instance.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"PrivateDnsHostnameType\": {\n                    \"target\": \"com.amazonaws.ec2#HostnameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of hostname for EC2 instances. For IPv4 only subnets, an instance DNS name\\n            must be based on the instance IPv4 address. For IPv6 only subnets, an instance DNS name\\n            must be based on the instance ID. For dual-stack subnets, you can specify whether DNS\\n            names use the instance IPv4 address or the instance ID.</p>\"\n                    }\n                },\n                \"EnableResourceNameDnsARecord\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether to respond to DNS queries for instance hostnames with DNS A\\n            records.</p>\"\n                    }\n                },\n                \"EnableResourceNameDnsAAAARecord\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether to respond to DNS queries for instance hostnames with DNS AAAA\\n            records.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyPrivateDnsNameOptionsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Return\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Return\",\n                        \"smithy.api#documentation\": \"<p>Returns <code>true</code> if the request succeeds; otherwise, it returns an\\n            error.</p>\",\n                        \"smithy.api#xmlName\": \"return\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyPublicIpDnsNameOptions\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ModifyPublicIpDnsNameOptionsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ModifyPublicIpDnsNameOptionsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Modify public hostname options for a network interface. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-naming.html\\\">EC2 instance hostnames, DNS names, and domains</a> in the <i>Amazon EC2 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ModifyPublicIpDnsNameOptionsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NetworkInterfaceId\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInterfaceId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>A network interface ID.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"HostnameType\": {\n                    \"target\": \"com.amazonaws.ec2#PublicIpDnsOption\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The public hostname type. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-naming.html\\\">EC2 instance hostnames, DNS names, and domains</a> in the <i>Amazon EC2 User Guide</i>.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>public-dual-stack-dns-name</code>: A dual-stack public hostname for a network interface. Requests from within the VPC resolve to both the private IPv4 address and the IPv6 Global Unicast Address of the network interface. Requests from the internet resolve to both the public IPv4 and the IPv6 GUA address of the network interface.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>public-ipv4-dns-name</code>: An IPv4-enabled public hostname for a network interface. Requests from within the VPC resolve to the private primary IPv4 address of the network interface. Requests from the internet resolve to the public IPv4 address of the network interface.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>public-ipv6-dns-name</code>: An IPv6-enabled public hostname for a network interface. Requests from within the VPC or from the internet resolve to the IPv6 GUA of the network interface. </p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the operation, without actually making the \\n  request, and provides an error response. If you have the required permissions, the error response is \\n  <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyPublicIpDnsNameOptionsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Successful\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Successful\",\n                        \"smithy.api#documentation\": \"<p>Whether or not the request was successful.</p>\",\n                        \"smithy.api#xmlName\": \"successful\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyReservedInstances\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ModifyReservedInstancesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ModifyReservedInstancesResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Modifies the configuration of your Reserved Instances, such as the Availability Zone,\\n      instance count, or instance type. The Reserved Instances to be modified must be identical,\\n      except for Availability Zone, network platform, and instance type.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ri-modifying.html\\\">Modify Reserved Instances</a> in the\\n        <i>Amazon EC2 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ModifyReservedInstancesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ReservedInstancesIds\": {\n                    \"target\": \"com.amazonaws.ec2#ReservedInstancesIdStringList\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The IDs of the Reserved Instances to modify.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"ReservedInstancesId\"\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ClientToken\",\n                        \"smithy.api#documentation\": \"<p>A unique, case-sensitive token you provide to ensure idempotency of your modification\\n      request. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Run_Instance_Idempotency.html\\\">Ensuring\\n      Idempotency</a>.</p>\",\n                        \"smithy.api#xmlName\": \"clientToken\"\n                    }\n                },\n                \"TargetConfigurations\": {\n                    \"target\": \"com.amazonaws.ec2#ReservedInstancesConfigurationList\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The configuration settings for the Reserved Instances to modify.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"ReservedInstancesConfigurationSetItemType\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the parameters for ModifyReservedInstances.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyReservedInstancesResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ReservedInstancesModificationId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ReservedInstancesModificationId\",\n                        \"smithy.api#documentation\": \"<p>The ID for the modification.</p>\",\n                        \"smithy.api#xmlName\": \"reservedInstancesModificationId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the output of ModifyReservedInstances.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyRouteServer\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ModifyRouteServerRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ModifyRouteServerResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Modifies the configuration of an existing route server.</p>\\n         <p>Amazon VPC Route Server simplifies routing for traffic between workloads that are deployed within a VPC and its internet gateways. With this feature, \\nVPC Route Server dynamically updates VPC and internet gateway route tables with your preferred IPv4 or IPv6 routes to achieve routing fault tolerance for those workloads. This enables you to automatically reroute traffic within a VPC, which increases the manageability of VPC routing and interoperability with third-party workloads.</p>\\n         <p>Route server supports the follow route table types:</p>\\n         <ul>\\n            <li>\\n               <p>VPC route tables not associated with subnets</p>\\n            </li>\\n            <li>\\n               <p>Subnet route tables</p>\\n            </li>\\n            <li>\\n               <p>Internet gateway route tables</p>\\n            </li>\\n         </ul>\\n         <p>Route server does not support route tables associated with virtual private gateways. To propagate routes into a transit gateway route table, use <a href=\\\"https://docs.aws.amazon.com/vpc/latest/tgw/tgw-connect.html\\\">Transit Gateway Connect</a>.</p>\\n         <p>For more information see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/userguide/dynamic-routing-route-server.html\\\">Dynamic routing in your VPC with VPC Route Server</a> in the <i>Amazon VPC User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ModifyRouteServerRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RouteServerId\": {\n                    \"target\": \"com.amazonaws.ec2#RouteServerId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the route server to modify.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"PersistRoutes\": {\n                    \"target\": \"com.amazonaws.ec2#RouteServerPersistRoutesAction\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies whether to persist routes after all BGP sessions are terminated.</p>\\n         <ul>\\n            <li>\\n               <p>enable: Routes will be persisted in FIB and RIB after all BGP sessions are terminated.</p>\\n            </li>\\n            <li>\\n               <p>disable: Routes will not be persisted in FIB and RIB after all BGP sessions are terminated.</p>\\n            </li>\\n            <li>\\n               <p>reset: If a route server has persisted routes due to all BGP sessions having ended, reset will withdraw all routes and reset route server to an empty FIB and RIB.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"PersistRoutesDuration\": {\n                    \"target\": \"com.amazonaws.ec2#BoxedLong\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of minutes a route server will wait after BGP is re-established to unpersist the routes in the FIB and RIB. Value must be in the range of 1-5. Required if PersistRoutes is <code>enabled</code>.</p>\\n         <p>If you set the duration to 1 minute, then when your network appliance re-establishes BGP with route server, it has 1 minute to relearn it's adjacent network and advertise those routes to route server before route server resumes normal functionality. In most cases, 1 minute is probably sufficient. If, however, you have concerns that your BGP network may not be capable of fully re-establishing and re-learning everything in 1 minute, you can increase the duration up to 5 minutes.</p>\"\n                    }\n                },\n                \"SnsNotificationsEnabled\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies whether to enable SNS notifications for route server events. Enabling SNS notifications persists BGP status changes to an SNS topic provisioned by Amazon Web Services.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A check for whether you have the required permissions for the action without actually making the request \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyRouteServerResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RouteServer\": {\n                    \"target\": \"com.amazonaws.ec2#RouteServer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RouteServer\",\n                        \"smithy.api#documentation\": \"<p>Information about the modified route server.</p>\",\n                        \"smithy.api#xmlName\": \"routeServer\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifySecurityGroupRules\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ModifySecurityGroupRulesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ModifySecurityGroupRulesResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Modifies the rules of a security group.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ModifySecurityGroupRulesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"GroupId\": {\n                    \"target\": \"com.amazonaws.ec2#SecurityGroupId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the security group.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"SecurityGroupRules\": {\n                    \"target\": \"com.amazonaws.ec2#SecurityGroupRuleUpdateList\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>Information about the security group properties to update.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"SecurityGroupRule\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifySecurityGroupRulesResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Return\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Return\",\n                        \"smithy.api#documentation\": \"<p>Returns <code>true</code> if the request succeeds; otherwise, returns an error.</p>\",\n                        \"smithy.api#xmlName\": \"return\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifySnapshotAttribute\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ModifySnapshotAttributeRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Adds or removes permission settings for the specified snapshot. You may add or remove\\n      specified Amazon Web Services account IDs from a snapshot's list of create volume permissions, but you cannot\\n      do both in a single operation. If you need to both add and remove account IDs for a snapshot,\\n      you must use multiple operations. You can make up to 500 modifications to a snapshot in a single operation.</p>\\n         <p>Encrypted snapshots and snapshots with Amazon Web Services Marketplace product codes cannot be made\\n      public. Snapshots encrypted with your default KMS key cannot be shared with other accounts.</p>\\n         <p>For more information about modifying snapshot permissions, see <a href=\\\"https://docs.aws.amazon.com/ebs/latest/userguide/ebs-modifying-snapshot-permissions.html\\\">Share a snapshot</a> in the\\n        <i>Amazon EBS User Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To make a snapshot public\",\n                        \"documentation\": \"This example makes the snapshot ``snap-1234567890abcdef0`` public.\",\n                        \"input\": {\n                            \"SnapshotId\": \"snap-1234567890abcdef0\",\n                            \"Attribute\": \"createVolumePermission\",\n                            \"OperationType\": \"add\",\n                            \"GroupNames\": [\n                                \"all\"\n                            ]\n                        },\n                        \"output\": {}\n                    },\n                    {\n                        \"title\": \"To modify a snapshot attribute\",\n                        \"documentation\": \"This example modifies snapshot ``snap-1234567890abcdef0`` to remove the create volume permission for a user with the account ID ``123456789012``. If the command succeeds, no output is returned.\",\n                        \"input\": {\n                            \"SnapshotId\": \"snap-1234567890abcdef0\",\n                            \"Attribute\": \"createVolumePermission\",\n                            \"OperationType\": \"remove\",\n                            \"UserIds\": [\n                                \"123456789012\"\n                            ]\n                        },\n                        \"output\": {}\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#ModifySnapshotAttributeRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Attribute\": {\n                    \"target\": \"com.amazonaws.ec2#SnapshotAttributeName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The snapshot attribute to modify. Only volume creation permissions can be modified.</p>\"\n                    }\n                },\n                \"CreateVolumePermission\": {\n                    \"target\": \"com.amazonaws.ec2#CreateVolumePermissionModifications\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A JSON representation of the snapshot attribute modification.</p>\"\n                    }\n                },\n                \"GroupNames\": {\n                    \"target\": \"com.amazonaws.ec2#GroupNameStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The group to modify for the snapshot.</p>\",\n                        \"smithy.api#xmlName\": \"UserGroup\"\n                    }\n                },\n                \"OperationType\": {\n                    \"target\": \"com.amazonaws.ec2#OperationType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of operation to perform to the attribute.</p>\"\n                    }\n                },\n                \"SnapshotId\": {\n                    \"target\": \"com.amazonaws.ec2#SnapshotId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the snapshot.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"UserIds\": {\n                    \"target\": \"com.amazonaws.ec2#UserIdStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The account ID to modify for the snapshot.</p>\",\n                        \"smithy.api#xmlName\": \"UserId\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifySnapshotTier\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ModifySnapshotTierRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ModifySnapshotTierResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Archives an Amazon EBS snapshot. When you archive a snapshot, it is converted to a full \\n      snapshot that includes all of the blocks of data that were written to the volume at the \\n      time the snapshot was created, and moved from the standard tier to the archive \\n      tier. For more information, see <a href=\\\"https://docs.aws.amazon.com/ebs/latest/userguide/snapshot-archive.html\\\">Archive Amazon EBS snapshots</a> \\n      in the <i>Amazon EBS User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ModifySnapshotTierRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SnapshotId\": {\n                    \"target\": \"com.amazonaws.ec2#SnapshotId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the snapshot.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"StorageTier\": {\n                    \"target\": \"com.amazonaws.ec2#TargetStorageTier\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the storage tier. You must specify <code>archive</code>.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifySnapshotTierResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SnapshotId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SnapshotId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the snapshot.</p>\",\n                        \"smithy.api#xmlName\": \"snapshotId\"\n                    }\n                },\n                \"TieringStartTime\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TieringStartTime\",\n                        \"smithy.api#documentation\": \"<p>The date and time when the archive process was started.</p>\",\n                        \"smithy.api#xmlName\": \"tieringStartTime\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifySpotFleetRequest\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ModifySpotFleetRequestRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ModifySpotFleetRequestResponse\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Modifies the specified Spot Fleet request.</p>\\n         <p>You can only modify a Spot Fleet request of type <code>maintain</code>.</p>\\n         <p>While the Spot Fleet request is being modified, it is in the <code>modifying</code>\\n            state.</p>\\n         <p>To scale up your Spot Fleet, increase its target capacity. The Spot Fleet launches the\\n            additional Spot Instances according to the allocation strategy for the Spot Fleet\\n            request. If the allocation strategy is <code>lowestPrice</code>, the Spot Fleet launches\\n            instances using the Spot Instance pool with the lowest price. If the allocation strategy\\n            is <code>diversified</code>, the Spot Fleet distributes the instances across the Spot\\n            Instance pools. If the allocation strategy is <code>capacityOptimized</code>, Spot Fleet\\n            launches instances from Spot Instance pools with optimal capacity for the number of instances\\n            that are launching.</p>\\n         <p>To scale down your Spot Fleet, decrease its target capacity. First, the Spot Fleet\\n            cancels any open requests that exceed the new target capacity. You can request that the\\n            Spot Fleet terminate Spot Instances until the size of the fleet no longer exceeds the\\n            new target capacity. If the allocation strategy is <code>lowestPrice</code>, the Spot\\n            Fleet terminates the instances with the highest price per unit. If the allocation\\n            strategy is <code>capacityOptimized</code>, the Spot Fleet terminates the instances in\\n            the Spot Instance pools that have the least available Spot Instance capacity. If the allocation\\n            strategy is <code>diversified</code>, the Spot Fleet terminates instances across the\\n            Spot Instance pools. Alternatively, you can request that the Spot Fleet keep the fleet\\n            at its current size, but not replace any Spot Instances that are interrupted or that you\\n            terminate manually.</p>\\n         <p>If you are finished with your Spot Fleet for now, but will use it again later, you can\\n            set the target capacity to 0.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To increase the target capacity of a Spot fleet request\",\n                        \"documentation\": \"This example increases the target capacity of the specified Spot fleet request.\",\n                        \"input\": {\n                            \"SpotFleetRequestId\": \"sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE\",\n                            \"TargetCapacity\": 20\n                        },\n                        \"output\": {\n                            \"Return\": true\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#ModifySpotFleetRequestRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LaunchTemplateConfigs\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplateConfigList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The launch template and overrides. You can only use this parameter if you specified a\\n            launch template (<code>LaunchTemplateConfigs</code>) in your Spot Fleet request. If you\\n            specified <code>LaunchSpecifications</code> in your Spot Fleet request, then omit this\\n            parameter.</p>\",\n                        \"smithy.api#xmlName\": \"LaunchTemplateConfig\"\n                    }\n                },\n                \"OnDemandTargetCapacity\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of On-Demand Instances in the fleet.</p>\"\n                    }\n                },\n                \"Context\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Reserved.</p>\"\n                    }\n                },\n                \"SpotFleetRequestId\": {\n                    \"target\": \"com.amazonaws.ec2#SpotFleetRequestId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SpotFleetRequestId\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the Spot Fleet request.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"spotFleetRequestId\"\n                    }\n                },\n                \"TargetCapacity\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TargetCapacity\",\n                        \"smithy.api#documentation\": \"<p>The size of the fleet.</p>\",\n                        \"smithy.api#xmlName\": \"targetCapacity\"\n                    }\n                },\n                \"ExcessCapacityTerminationPolicy\": {\n                    \"target\": \"com.amazonaws.ec2#ExcessCapacityTerminationPolicy\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ExcessCapacityTerminationPolicy\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether running instances should be terminated if the target capacity\\n            of the Spot Fleet request is decreased below the current size of the Spot Fleet.</p>\\n         <p>Supported only for fleets of type <code>maintain</code>.</p>\",\n                        \"smithy.api#xmlName\": \"excessCapacityTerminationPolicy\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the parameters for ModifySpotFleetRequest.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifySpotFleetRequestResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Return\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Return\",\n                        \"smithy.api#documentation\": \"<p>If the request succeeds, the response returns <code>true</code>. If the request fails,\\n            no response is returned, and instead an error message is returned.</p>\",\n                        \"smithy.api#xmlName\": \"return\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the output of ModifySpotFleetRequest.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifySubnetAttribute\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ModifySubnetAttributeRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Modifies a subnet attribute. You can only modify one attribute at a time.</p>\\n         <p>Use this action to modify subnets on Amazon Web Services Outposts.</p>\\n         <ul>\\n            <li>\\n               <p>To modify a subnet on an Outpost rack, set both\\n                        <code>MapCustomerOwnedIpOnLaunch</code> and\\n                        <code>CustomerOwnedIpv4Pool</code>. These two parameters act as a single\\n                    attribute.</p>\\n            </li>\\n            <li>\\n               <p>To modify a subnet on an Outpost server, set either\\n                        <code>EnableLniAtDeviceIndex</code> or\\n                    <code>DisableLniAtDeviceIndex</code>.</p>\\n            </li>\\n         </ul>\\n         <p>For more information about Amazon Web Services Outposts, see the following:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/outposts/latest/userguide/how-servers-work.html\\\">Outpost servers</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/outposts/latest/userguide/how-racks-work.html\\\">Outpost racks</a>\\n               </p>\\n            </li>\\n         </ul>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To change a subnet's public IP addressing behavior\",\n                        \"documentation\": \"This example modifies the specified subnet so that all instances launched into this subnet are assigned a public IP address.\",\n                        \"input\": {\n                            \"SubnetId\": \"subnet-1a2b3c4d\",\n                            \"MapPublicIpOnLaunch\": {\n                                \"Value\": true\n                            }\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#ModifySubnetAttributeRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AssignIpv6AddressOnCreation\": {\n                    \"target\": \"com.amazonaws.ec2#AttributeBooleanValue\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify <code>true</code> to indicate that network interfaces created in the\\n            specified subnet should be assigned an IPv6 address. This includes a network interface\\n            that's created when launching an instance into the subnet (the instance therefore\\n            receives an IPv6 address). </p>\\n         <p>If you enable the IPv6 addressing feature for your subnet, your network interface\\n            or instance only receives an IPv6 address if it's created using version\\n                <code>2016-11-15</code> or later of the Amazon EC2 API.</p>\"\n                    }\n                },\n                \"MapPublicIpOnLaunch\": {\n                    \"target\": \"com.amazonaws.ec2#AttributeBooleanValue\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify <code>true</code> to indicate that network interfaces attached to instances created in the\\n            specified subnet should be assigned a public IPv4 address.</p>\\n         <p>Amazon Web Services charges for all public IPv4 addresses, including public IPv4 addresses \\nassociated with running instances and Elastic IP addresses. For more information, see the <i>Public IPv4 Address</i> tab on the <a href=\\\"http://aws.amazon.com/vpc/pricing/\\\">Amazon VPC pricing page</a>.</p>\"\n                    }\n                },\n                \"SubnetId\": {\n                    \"target\": \"com.amazonaws.ec2#SubnetId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SubnetId\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the subnet.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"subnetId\"\n                    }\n                },\n                \"MapCustomerOwnedIpOnLaunch\": {\n                    \"target\": \"com.amazonaws.ec2#AttributeBooleanValue\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify <code>true</code> to indicate that network interfaces  attached to instances created in the\\n            specified subnet should be assigned a customer-owned IPv4 address.</p>\\n         <p>When this value is <code>true</code>, you must specify the customer-owned IP pool using <code>CustomerOwnedIpv4Pool</code>.</p>\"\n                    }\n                },\n                \"CustomerOwnedIpv4Pool\": {\n                    \"target\": \"com.amazonaws.ec2#CoipPoolId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The customer-owned IPv4 address pool associated with the subnet.</p>\\n         <p>You must set this value when you specify <code>true</code> for <code>MapCustomerOwnedIpOnLaunch</code>.</p>\"\n                    }\n                },\n                \"EnableDns64\": {\n                    \"target\": \"com.amazonaws.ec2#AttributeBooleanValue\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether DNS queries made to the Amazon-provided DNS Resolver in this subnet \\n            should return synthetic IPv6 addresses for IPv4-only destinations.</p>\\n         <p>You must first configure a NAT gateway in a public subnet (separate from the subnet \\n           containing the IPv6-only workloads). For example, the subnet containing the NAT gateway \\n           should have a <code>0.0.0.0/0</code> route pointing to the internet gateway. For more \\n           information, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/userguide/nat-gateway-nat64-dns64.html#nat-gateway-nat64-dns64-walkthrough\\\">Configure DNS64 and NAT64</a> in the <i>Amazon VPC User Guide</i>.</p>\"\n                    }\n                },\n                \"PrivateDnsHostnameTypeOnLaunch\": {\n                    \"target\": \"com.amazonaws.ec2#HostnameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of hostname to assign to instances in the subnet at launch. For IPv4-only and dual-stack (IPv4 and IPv6) subnets, an\\n            instance DNS name can be based on the instance IPv4 address (ip-name) or the instance ID (resource-name). For IPv6 only subnets, an instance\\n            DNS name must be based on the instance ID (resource-name).</p>\"\n                    }\n                },\n                \"EnableResourceNameDnsARecordOnLaunch\": {\n                    \"target\": \"com.amazonaws.ec2#AttributeBooleanValue\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether to respond to DNS queries for instance hostnames with DNS A records.</p>\"\n                    }\n                },\n                \"EnableResourceNameDnsAAAARecordOnLaunch\": {\n                    \"target\": \"com.amazonaws.ec2#AttributeBooleanValue\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether to respond to DNS queries for instance hostnames with DNS AAAA records.</p>\"\n                    }\n                },\n                \"EnableLniAtDeviceIndex\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>\\n            Indicates the device position for local network interfaces in this subnet. For example, \\n            <code>1</code> indicates local network interfaces in this subnet are the secondary \\n            network interface (eth1). A local network interface cannot be the primary network\\n            interface (eth0).\\n        </p>\"\n                    }\n                },\n                \"DisableLniAtDeviceIndex\": {\n                    \"target\": \"com.amazonaws.ec2#AttributeBooleanValue\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>\\n            Specify <code>true</code> to indicate that local network interfaces at the current \\n            position should be disabled. \\n        </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyTrafficMirrorFilterNetworkServices\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ModifyTrafficMirrorFilterNetworkServicesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ModifyTrafficMirrorFilterNetworkServicesResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Allows or restricts mirroring network services.</p>\\n         <p> By default, Amazon DNS network services are not eligible for Traffic Mirror. Use <code>AddNetworkServices</code> to add network services to a Traffic Mirror filter. When a network service is added to the Traffic Mirror filter, all traffic related to that network service will be mirrored.\\n         When you no longer want to mirror network services, use <code>RemoveNetworkServices</code> to remove the network services from the Traffic Mirror filter.\\n      </p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ModifyTrafficMirrorFilterNetworkServicesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TrafficMirrorFilterId\": {\n                    \"target\": \"com.amazonaws.ec2#TrafficMirrorFilterId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the Traffic Mirror filter.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"AddNetworkServices\": {\n                    \"target\": \"com.amazonaws.ec2#TrafficMirrorNetworkServiceList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The network service, for example Amazon DNS, that you want to mirror.</p>\",\n                        \"smithy.api#xmlName\": \"AddNetworkService\"\n                    }\n                },\n                \"RemoveNetworkServices\": {\n                    \"target\": \"com.amazonaws.ec2#TrafficMirrorNetworkServiceList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The network service, for example Amazon DNS, that you no longer want to mirror.</p>\",\n                        \"smithy.api#xmlName\": \"RemoveNetworkService\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyTrafficMirrorFilterNetworkServicesResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TrafficMirrorFilter\": {\n                    \"target\": \"com.amazonaws.ec2#TrafficMirrorFilter\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TrafficMirrorFilter\",\n                        \"smithy.api#documentation\": \"<p>The Traffic Mirror filter that the network service is associated with.</p>\",\n                        \"smithy.api#xmlName\": \"trafficMirrorFilter\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyTrafficMirrorFilterRule\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ModifyTrafficMirrorFilterRuleRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ModifyTrafficMirrorFilterRuleResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Modifies the specified Traffic Mirror rule.</p>\\n         <p>\\n            <code>DestinationCidrBlock</code> and <code>SourceCidrBlock</code> must both be an IPv4\\n         range or an IPv6 range.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ModifyTrafficMirrorFilterRuleRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TrafficMirrorFilterRuleId\": {\n                    \"target\": \"com.amazonaws.ec2#TrafficMirrorFilterRuleIdWithResolver\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the Traffic Mirror rule.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TrafficDirection\": {\n                    \"target\": \"com.amazonaws.ec2#TrafficDirection\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of traffic to assign to the rule.</p>\"\n                    }\n                },\n                \"RuleNumber\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of the Traffic Mirror rule. This number must be unique for each Traffic Mirror rule in a given\\n         direction. The rules are processed in ascending order by rule number.</p>\"\n                    }\n                },\n                \"RuleAction\": {\n                    \"target\": \"com.amazonaws.ec2#TrafficMirrorRuleAction\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The action to assign to the rule.</p>\"\n                    }\n                },\n                \"DestinationPortRange\": {\n                    \"target\": \"com.amazonaws.ec2#TrafficMirrorPortRangeRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The destination ports that are associated with the Traffic Mirror rule.</p>\"\n                    }\n                },\n                \"SourcePortRange\": {\n                    \"target\": \"com.amazonaws.ec2#TrafficMirrorPortRangeRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The port range to assign to the Traffic Mirror rule.</p>\"\n                    }\n                },\n                \"Protocol\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The protocol, for example TCP, to assign to the Traffic Mirror rule.</p>\"\n                    }\n                },\n                \"DestinationCidrBlock\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The destination CIDR block to assign to the Traffic Mirror rule.</p>\"\n                    }\n                },\n                \"SourceCidrBlock\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The source CIDR block to assign to the Traffic Mirror rule.</p>\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The description to assign to the Traffic Mirror rule.</p>\"\n                    }\n                },\n                \"RemoveFields\": {\n                    \"target\": \"com.amazonaws.ec2#TrafficMirrorFilterRuleFieldList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The properties that you want to remove from the Traffic Mirror filter rule.</p>\\n         <p>When you remove a property from a Traffic Mirror filter rule, the property is set to the default.</p>\",\n                        \"smithy.api#xmlName\": \"RemoveField\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyTrafficMirrorFilterRuleResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TrafficMirrorFilterRule\": {\n                    \"target\": \"com.amazonaws.ec2#TrafficMirrorFilterRule\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TrafficMirrorFilterRule\",\n                        \"smithy.api#documentation\": \"<note>\\n            <p>Tags are not returned for ModifyTrafficMirrorFilterRule.</p>\\n         </note>\\n         <p>A Traffic Mirror rule.</p>\",\n                        \"smithy.api#xmlName\": \"trafficMirrorFilterRule\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyTrafficMirrorSession\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ModifyTrafficMirrorSessionRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ModifyTrafficMirrorSessionResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Modifies a Traffic Mirror session.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ModifyTrafficMirrorSessionRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TrafficMirrorSessionId\": {\n                    \"target\": \"com.amazonaws.ec2#TrafficMirrorSessionId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the Traffic Mirror session.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TrafficMirrorTargetId\": {\n                    \"target\": \"com.amazonaws.ec2#TrafficMirrorTargetId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Traffic Mirror target. The target must be in the same VPC as the source, or have a VPC peering connection with the source.</p>\"\n                    }\n                },\n                \"TrafficMirrorFilterId\": {\n                    \"target\": \"com.amazonaws.ec2#TrafficMirrorFilterId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the Traffic Mirror filter.</p>\"\n                    }\n                },\n                \"PacketLength\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of bytes in each packet to mirror. These are bytes after the VXLAN header. To mirror a subset, set this to the length (in bytes) to mirror. For example, if you set this value to 100, then the first 100 bytes that meet the filter criteria are copied to the target. Do not specify this parameter when you want to mirror the entire packet.</p>\\n         <p>For sessions with Network Load Balancer (NLB) traffic mirror targets, the default <code>PacketLength</code> will be set to 8500. Valid values are 1-8500. Setting a <code>PacketLength</code> greater than 8500 will result in an error response.</p>\"\n                    }\n                },\n                \"SessionNumber\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The session number determines the order in which sessions are evaluated when an interface is used by multiple sessions. The first session with a matching filter is the one that mirrors the packets.</p>\\n         <p>Valid values are 1-32766.</p>\"\n                    }\n                },\n                \"VirtualNetworkId\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The virtual network ID of the Traffic Mirror session.</p>\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The description to assign to the Traffic Mirror session.</p>\"\n                    }\n                },\n                \"RemoveFields\": {\n                    \"target\": \"com.amazonaws.ec2#TrafficMirrorSessionFieldList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The properties that you want to remove from the Traffic Mirror session.</p>\\n         <p>When you remove a property from a Traffic Mirror session, the property is set to the default.</p>\",\n                        \"smithy.api#xmlName\": \"RemoveField\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyTrafficMirrorSessionResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TrafficMirrorSession\": {\n                    \"target\": \"com.amazonaws.ec2#TrafficMirrorSession\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TrafficMirrorSession\",\n                        \"smithy.api#documentation\": \"<p>Information about the Traffic Mirror session.</p>\",\n                        \"smithy.api#xmlName\": \"trafficMirrorSession\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyTransitGateway\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ModifyTransitGatewayRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ModifyTransitGatewayResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Modifies the specified transit gateway. When you modify a transit gateway, the modified options are applied to new transit gateway attachments only. Your existing transit gateway attachments are not modified.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ModifyTransitGatewayOptions\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AddTransitGatewayCidrBlocks\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayCidrBlockStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Adds IPv4 or IPv6 CIDR blocks for the transit gateway. Must be a size /24 CIDR block or larger for IPv4, or a size /64 CIDR block or larger for IPv6.</p>\"\n                    }\n                },\n                \"RemoveTransitGatewayCidrBlocks\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayCidrBlockStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Removes CIDR blocks for the transit gateway.</p>\"\n                    }\n                },\n                \"VpnEcmpSupport\": {\n                    \"target\": \"com.amazonaws.ec2#VpnEcmpSupportValue\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Enable or disable Equal Cost Multipath Protocol support.</p>\"\n                    }\n                },\n                \"DnsSupport\": {\n                    \"target\": \"com.amazonaws.ec2#DnsSupportValue\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Enable or disable DNS support.</p>\"\n                    }\n                },\n                \"SecurityGroupReferencingSupport\": {\n                    \"target\": \"com.amazonaws.ec2#SecurityGroupReferencingSupportValue\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Enables you to reference a security group across VPCs attached to a transit gateway to simplify security group management.\\n\\n</p>\\n         <p>This option is disabled by default.</p>\\n         <p>For more information about security group referencing, see  <a href=\\\"https://docs.aws.amazon.com/vpc/latest/tgw/tgw-vpc-attachments.html#vpc-attachment-security\\\">Security group referencing</a> in the <i>Amazon Web Services Transit Gateways Guide</i>.</p>\"\n                    }\n                },\n                \"AutoAcceptSharedAttachments\": {\n                    \"target\": \"com.amazonaws.ec2#AutoAcceptSharedAttachmentsValue\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Enable or disable automatic acceptance of attachment requests.</p>\"\n                    }\n                },\n                \"DefaultRouteTableAssociation\": {\n                    \"target\": \"com.amazonaws.ec2#DefaultRouteTableAssociationValue\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Enable or disable automatic association with the default association route table.</p>\"\n                    }\n                },\n                \"AssociationDefaultRouteTableId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayRouteTableId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the default association route table.</p>\"\n                    }\n                },\n                \"DefaultRouteTablePropagation\": {\n                    \"target\": \"com.amazonaws.ec2#DefaultRouteTablePropagationValue\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether resource attachments automatically propagate routes to the default\\n          propagation route table. Enabled by default. If <code>defaultRouteTablePropagation</code>\\n          is set to <code>enable</code>,\\n          Amazon Web Services Transit Gateway will create the default transit gateway route\\n          table.</p>\"\n                    }\n                },\n                \"PropagationDefaultRouteTableId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayRouteTableId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the default propagation route table.</p>\"\n                    }\n                },\n                \"AmazonSideAsn\": {\n                    \"target\": \"com.amazonaws.ec2#Long\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A private Autonomous System Number (ASN) for the Amazon side of a BGP session. \\n            The range is 64512 to 65534 for 16-bit ASNs and 4200000000 to 4294967294 for 32-bit ASNs.</p>\\n         <p>The modify ASN operation is not allowed on a transit gateway if it has the following attachments:</p>\\n         <ul>\\n            <li>\\n               <p>Dynamic VPN</p>\\n            </li>\\n            <li>\\n               <p>Static VPN</p>\\n            </li>\\n            <li>\\n               <p>Direct Connect Gateway</p>\\n            </li>\\n            <li>\\n               <p>Connect</p>\\n            </li>\\n         </ul>\\n         <p>You must first delete all transit gateway attachments configured prior to modifying the ASN on\\n            the transit gateway.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The transit gateway options.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ModifyTransitGatewayPrefixListReference\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ModifyTransitGatewayPrefixListReferenceRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ModifyTransitGatewayPrefixListReferenceResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Modifies a reference (route) to a prefix list in a specified transit gateway route table.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ModifyTransitGatewayPrefixListReferenceRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayRouteTableId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayRouteTableId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the transit gateway route table.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"PrefixListId\": {\n                    \"target\": \"com.amazonaws.ec2#PrefixListResourceId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the prefix list.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TransitGatewayAttachmentId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayAttachmentId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the attachment to which traffic is routed.</p>\"\n                    }\n                },\n                \"Blackhole\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether to drop traffic that matches this route.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyTransitGatewayPrefixListReferenceResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayPrefixListReference\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayPrefixListReference\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayPrefixListReference\",\n                        \"smithy.api#documentation\": \"<p>Information about the prefix list reference.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayPrefixListReference\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyTransitGatewayRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the transit gateway.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The description for the transit gateway.</p>\"\n                    }\n                },\n                \"Options\": {\n                    \"target\": \"com.amazonaws.ec2#ModifyTransitGatewayOptions\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The options to modify.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyTransitGatewayResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGateway\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGateway\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGateway\",\n                        \"smithy.api#documentation\": \"<p>Information about the transit gateway.</p>\",\n                        \"smithy.api#xmlName\": \"transitGateway\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyTransitGatewayVpcAttachment\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ModifyTransitGatewayVpcAttachmentRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ModifyTransitGatewayVpcAttachmentResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Modifies the specified VPC attachment.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ModifyTransitGatewayVpcAttachmentRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayAttachmentId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayAttachmentId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the attachment.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"AddSubnetIds\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewaySubnetIdList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of one or more subnets to add. You can specify at most one subnet per Availability Zone.</p>\"\n                    }\n                },\n                \"RemoveSubnetIds\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewaySubnetIdList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of one or more subnets to remove.</p>\"\n                    }\n                },\n                \"Options\": {\n                    \"target\": \"com.amazonaws.ec2#ModifyTransitGatewayVpcAttachmentRequestOptions\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The new VPC attachment options.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyTransitGatewayVpcAttachmentRequestOptions\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DnsSupport\": {\n                    \"target\": \"com.amazonaws.ec2#DnsSupportValue\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Enable or disable DNS support. The default is <code>enable</code>.</p>\"\n                    }\n                },\n                \"SecurityGroupReferencingSupport\": {\n                    \"target\": \"com.amazonaws.ec2#SecurityGroupReferencingSupportValue\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Enables you to reference a security group across VPCs attached to a transit gateway to simplify security group management.\\n\\n</p>\\n         <p>This option is disabled by default.</p>\\n         <p>For more information about security group referencing, see  <a href=\\\"https://docs.aws.amazon.com/vpc/latest/tgw/tgw-vpc-attachments.html#vpc-attachment-security\\\">Security group referencing</a> in the <i>Amazon Web Services Transit Gateways Guide</i>.</p>\"\n                    }\n                },\n                \"Ipv6Support\": {\n                    \"target\": \"com.amazonaws.ec2#Ipv6SupportValue\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Enable or disable IPv6 support. The default is <code>enable</code>.</p>\"\n                    }\n                },\n                \"ApplianceModeSupport\": {\n                    \"target\": \"com.amazonaws.ec2#ApplianceModeSupportValue\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Enable or disable support for appliance mode. If enabled, a traffic flow between a source and destination uses the same Availability Zone for the VPC attachment for the lifetime of that flow. The default is <code>disable</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the options for a VPC attachment.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ModifyTransitGatewayVpcAttachmentResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayVpcAttachment\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayVpcAttachment\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayVpcAttachment\",\n                        \"smithy.api#documentation\": \"<p>Information about the modified attachment.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayVpcAttachment\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyVerifiedAccessEndpoint\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ModifyVerifiedAccessEndpointRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ModifyVerifiedAccessEndpointResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Modifies the configuration of the specified Amazon Web Services Verified Access endpoint.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ModifyVerifiedAccessEndpointCidrOptions\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PortRanges\": {\n                    \"target\": \"com.amazonaws.ec2#ModifyVerifiedAccessEndpointPortRangeList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The port ranges.</p>\",\n                        \"smithy.api#xmlName\": \"PortRange\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The CIDR options for a Verified Access endpoint.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ModifyVerifiedAccessEndpointEniOptions\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Protocol\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessEndpointProtocol\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IP protocol.</p>\"\n                    }\n                },\n                \"Port\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessEndpointPortNumber\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IP port number.</p>\"\n                    }\n                },\n                \"PortRanges\": {\n                    \"target\": \"com.amazonaws.ec2#ModifyVerifiedAccessEndpointPortRangeList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The port ranges.</p>\",\n                        \"smithy.api#xmlName\": \"PortRange\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the options when modifying a Verified Access endpoint with the\\n            <code>network-interface</code> type.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ModifyVerifiedAccessEndpointLoadBalancerOptions\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SubnetIds\": {\n                    \"target\": \"com.amazonaws.ec2#ModifyVerifiedAccessEndpointSubnetIdList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the subnets.</p>\",\n                        \"smithy.api#xmlName\": \"SubnetId\"\n                    }\n                },\n                \"Protocol\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessEndpointProtocol\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IP protocol.</p>\"\n                    }\n                },\n                \"Port\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessEndpointPortNumber\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IP port number.</p>\"\n                    }\n                },\n                \"PortRanges\": {\n                    \"target\": \"com.amazonaws.ec2#ModifyVerifiedAccessEndpointPortRangeList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The port ranges.</p>\",\n                        \"smithy.api#xmlName\": \"PortRange\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a load balancer when creating an Amazon Web Services Verified Access endpoint using the\\n            <code>load-balancer</code> type.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ModifyVerifiedAccessEndpointPolicy\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ModifyVerifiedAccessEndpointPolicyRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ModifyVerifiedAccessEndpointPolicyResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Modifies the specified Amazon Web Services Verified Access endpoint policy.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ModifyVerifiedAccessEndpointPolicyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VerifiedAccessEndpointId\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessEndpointId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the Verified Access endpoint.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"PolicyEnabled\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The status of the Verified Access policy.</p>\"\n                    }\n                },\n                \"PolicyDocument\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Verified Access policy document.</p>\"\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A unique, case-sensitive token that you provide to ensure idempotency of your\\n            modification request. For more information, see <a href=\\\"https://docs.aws.amazon.com/ec2/latest/devguide/ec2-api-idempotency.html\\\">Ensuring idempotency</a>.</p>\",\n                        \"smithy.api#idempotencyToken\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"SseSpecification\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessSseSpecificationRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The options for server side encryption.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyVerifiedAccessEndpointPolicyResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PolicyEnabled\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PolicyEnabled\",\n                        \"smithy.api#documentation\": \"<p>The status of the Verified Access policy.</p>\",\n                        \"smithy.api#xmlName\": \"policyEnabled\"\n                    }\n                },\n                \"PolicyDocument\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PolicyDocument\",\n                        \"smithy.api#documentation\": \"<p>The Verified Access policy document.</p>\",\n                        \"smithy.api#xmlName\": \"policyDocument\"\n                    }\n                },\n                \"SseSpecification\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessSseSpecificationResponse\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SseSpecification\",\n                        \"smithy.api#documentation\": \"<p>The options in use for server side encryption.</p>\",\n                        \"smithy.api#xmlName\": \"sseSpecification\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyVerifiedAccessEndpointPortRange\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"FromPort\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessEndpointPortNumber\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The start of the port range.</p>\"\n                    }\n                },\n                \"ToPort\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessEndpointPortNumber\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The end of the port range.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the port range for a Verified Access endpoint.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ModifyVerifiedAccessEndpointPortRangeList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ModifyVerifiedAccessEndpointPortRange\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ModifyVerifiedAccessEndpointRdsOptions\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SubnetIds\": {\n                    \"target\": \"com.amazonaws.ec2#ModifyVerifiedAccessEndpointSubnetIdList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the subnets.</p>\",\n                        \"smithy.api#xmlName\": \"SubnetId\"\n                    }\n                },\n                \"Port\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessEndpointPortNumber\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The port.</p>\"\n                    }\n                },\n                \"RdsEndpoint\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The RDS endpoint.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The RDS options for a Verified Access endpoint.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ModifyVerifiedAccessEndpointRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VerifiedAccessEndpointId\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessEndpointId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the Verified Access endpoint.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"VerifiedAccessGroupId\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessGroupId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the Verified Access group.</p>\"\n                    }\n                },\n                \"LoadBalancerOptions\": {\n                    \"target\": \"com.amazonaws.ec2#ModifyVerifiedAccessEndpointLoadBalancerOptions\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The load balancer details if creating the Verified Access endpoint as\\n         <code>load-balancer</code>type.</p>\"\n                    }\n                },\n                \"NetworkInterfaceOptions\": {\n                    \"target\": \"com.amazonaws.ec2#ModifyVerifiedAccessEndpointEniOptions\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The network interface options.</p>\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A description for the Verified Access endpoint.</p>\"\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A unique, case-sensitive token that you provide to ensure idempotency of your\\n            modification request. For more information, see <a href=\\\"https://docs.aws.amazon.com/ec2/latest/devguide/ec2-api-idempotency.html\\\">Ensuring idempotency</a>.</p>\",\n                        \"smithy.api#idempotencyToken\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"RdsOptions\": {\n                    \"target\": \"com.amazonaws.ec2#ModifyVerifiedAccessEndpointRdsOptions\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The RDS options.</p>\"\n                    }\n                },\n                \"CidrOptions\": {\n                    \"target\": \"com.amazonaws.ec2#ModifyVerifiedAccessEndpointCidrOptions\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The CIDR options.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyVerifiedAccessEndpointResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VerifiedAccessEndpoint\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessEndpoint\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VerifiedAccessEndpoint\",\n                        \"smithy.api#documentation\": \"<p>Details about the Verified Access endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"verifiedAccessEndpoint\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyVerifiedAccessEndpointSubnetIdList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#SubnetId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ModifyVerifiedAccessGroup\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ModifyVerifiedAccessGroupRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ModifyVerifiedAccessGroupResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Modifies the specified Amazon Web Services Verified Access group configuration.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ModifyVerifiedAccessGroupPolicy\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ModifyVerifiedAccessGroupPolicyRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ModifyVerifiedAccessGroupPolicyResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Modifies the specified Amazon Web Services Verified Access group policy.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ModifyVerifiedAccessGroupPolicyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VerifiedAccessGroupId\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessGroupId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the Verified Access group.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"PolicyEnabled\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The status of the Verified Access policy.</p>\"\n                    }\n                },\n                \"PolicyDocument\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Verified Access policy document.</p>\"\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A unique, case-sensitive token that you provide to ensure idempotency of your\\n            modification request. For more information, see <a href=\\\"https://docs.aws.amazon.com/ec2/latest/devguide/ec2-api-idempotency.html\\\">Ensuring idempotency</a>.</p>\",\n                        \"smithy.api#idempotencyToken\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"SseSpecification\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessSseSpecificationRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The options for server side encryption.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyVerifiedAccessGroupPolicyResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PolicyEnabled\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PolicyEnabled\",\n                        \"smithy.api#documentation\": \"<p>The status of the Verified Access policy.</p>\",\n                        \"smithy.api#xmlName\": \"policyEnabled\"\n                    }\n                },\n                \"PolicyDocument\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PolicyDocument\",\n                        \"smithy.api#documentation\": \"<p>The Verified Access policy document.</p>\",\n                        \"smithy.api#xmlName\": \"policyDocument\"\n                    }\n                },\n                \"SseSpecification\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessSseSpecificationResponse\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SseSpecification\",\n                        \"smithy.api#documentation\": \"<p>The options in use for server side encryption.</p>\",\n                        \"smithy.api#xmlName\": \"sseSpecification\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyVerifiedAccessGroupRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VerifiedAccessGroupId\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessGroupId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the Verified Access group.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"VerifiedAccessInstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessInstanceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the Verified Access instance.</p>\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A description for the Verified Access group.</p>\"\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A unique, case-sensitive token that you provide to ensure idempotency of your\\n            modification request. For more information, see <a href=\\\"https://docs.aws.amazon.com/ec2/latest/devguide/ec2-api-idempotency.html\\\">Ensuring idempotency</a>.</p>\",\n                        \"smithy.api#idempotencyToken\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyVerifiedAccessGroupResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VerifiedAccessGroup\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessGroup\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VerifiedAccessGroup\",\n                        \"smithy.api#documentation\": \"<p>Details about the Verified Access group.</p>\",\n                        \"smithy.api#xmlName\": \"verifiedAccessGroup\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyVerifiedAccessInstance\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ModifyVerifiedAccessInstanceRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ModifyVerifiedAccessInstanceResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Modifies the configuration of the specified Amazon Web Services Verified Access instance.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ModifyVerifiedAccessInstanceLoggingConfiguration\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ModifyVerifiedAccessInstanceLoggingConfigurationRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ModifyVerifiedAccessInstanceLoggingConfigurationResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Modifies the logging configuration for the specified Amazon Web Services Verified Access instance.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ModifyVerifiedAccessInstanceLoggingConfigurationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VerifiedAccessInstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessInstanceId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the Verified Access instance.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"AccessLogs\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessLogOptions\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The configuration options for Verified Access instances.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A unique, case-sensitive token that you provide to ensure idempotency of your\\n            modification request. For more information, see <a href=\\\"https://docs.aws.amazon.com/ec2/latest/devguide/ec2-api-idempotency.html\\\">Ensuring idempotency</a>.</p>\",\n                        \"smithy.api#idempotencyToken\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyVerifiedAccessInstanceLoggingConfigurationResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LoggingConfiguration\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessInstanceLoggingConfiguration\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LoggingConfiguration\",\n                        \"smithy.api#documentation\": \"<p>The logging configuration for the Verified Access instance.</p>\",\n                        \"smithy.api#xmlName\": \"loggingConfiguration\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyVerifiedAccessInstanceRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VerifiedAccessInstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessInstanceId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the Verified Access instance.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A description for the Verified Access instance.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A unique, case-sensitive token that you provide to ensure idempotency of your\\n            modification request. For more information, see <a href=\\\"https://docs.aws.amazon.com/ec2/latest/devguide/ec2-api-idempotency.html\\\">Ensuring idempotency</a>.</p>\",\n                        \"smithy.api#idempotencyToken\": {}\n                    }\n                },\n                \"CidrEndpointsCustomSubDomain\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The custom subdomain.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyVerifiedAccessInstanceResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VerifiedAccessInstance\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessInstance\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VerifiedAccessInstance\",\n                        \"smithy.api#documentation\": \"<p>Details about the Verified Access instance.</p>\",\n                        \"smithy.api#xmlName\": \"verifiedAccessInstance\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyVerifiedAccessNativeApplicationOidcOptions\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PublicSigningKeyEndpoint\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The public signing key endpoint.</p>\"\n                    }\n                },\n                \"Issuer\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The OIDC issuer identifier of the IdP.</p>\"\n                    }\n                },\n                \"AuthorizationEndpoint\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The authorization endpoint of the IdP.</p>\"\n                    }\n                },\n                \"TokenEndpoint\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token endpoint of the IdP.</p>\"\n                    }\n                },\n                \"UserInfoEndpoint\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The user info endpoint of the IdP.</p>\"\n                    }\n                },\n                \"ClientId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The OAuth 2.0 client identifier.</p>\"\n                    }\n                },\n                \"ClientSecret\": {\n                    \"target\": \"com.amazonaws.ec2#ClientSecretType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The OAuth 2.0 client secret.</p>\"\n                    }\n                },\n                \"Scope\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The set of user claims to be requested from the IdP.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the OpenID Connect (OIDC) options.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ModifyVerifiedAccessTrustProvider\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ModifyVerifiedAccessTrustProviderRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ModifyVerifiedAccessTrustProviderResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Modifies the configuration of the specified Amazon Web Services Verified Access trust provider.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ModifyVerifiedAccessTrustProviderDeviceOptions\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PublicSigningKeyUrl\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The URL Amazon Web Services Verified Access will use to verify the authenticity of the device tokens.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Modifies the configuration of the specified device-based Amazon Web Services Verified Access trust provider.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ModifyVerifiedAccessTrustProviderOidcOptions\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Issuer\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The OIDC issuer.</p>\"\n                    }\n                },\n                \"AuthorizationEndpoint\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The OIDC authorization endpoint.</p>\"\n                    }\n                },\n                \"TokenEndpoint\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The OIDC token endpoint.</p>\"\n                    }\n                },\n                \"UserInfoEndpoint\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The OIDC user info endpoint.</p>\"\n                    }\n                },\n                \"ClientId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The client identifier.</p>\"\n                    }\n                },\n                \"ClientSecret\": {\n                    \"target\": \"com.amazonaws.ec2#ClientSecretType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The client secret.</p>\"\n                    }\n                },\n                \"Scope\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>OpenID Connect (OIDC) scopes are used by an application during authentication to authorize access to a user's details. Each scope returns a specific set of user attributes.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Options for an OpenID Connect-compatible user-identity trust provider.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ModifyVerifiedAccessTrustProviderRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VerifiedAccessTrustProviderId\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessTrustProviderId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the Verified Access trust provider.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"OidcOptions\": {\n                    \"target\": \"com.amazonaws.ec2#ModifyVerifiedAccessTrustProviderOidcOptions\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The options for an OpenID Connect-compatible user-identity trust provider.</p>\"\n                    }\n                },\n                \"DeviceOptions\": {\n                    \"target\": \"com.amazonaws.ec2#ModifyVerifiedAccessTrustProviderDeviceOptions\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The options for a device-based trust provider. This parameter is required when the\\n         provider type is <code>device</code>.</p>\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A description for the Verified Access trust provider.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A unique, case-sensitive token that you provide to ensure idempotency of your\\n            modification request. For more information, see <a href=\\\"https://docs.aws.amazon.com/ec2/latest/devguide/ec2-api-idempotency.html\\\">Ensuring idempotency</a>.</p>\",\n                        \"smithy.api#idempotencyToken\": {}\n                    }\n                },\n                \"SseSpecification\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessSseSpecificationRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The options for server side encryption.</p>\"\n                    }\n                },\n                \"NativeApplicationOidcOptions\": {\n                    \"target\": \"com.amazonaws.ec2#ModifyVerifiedAccessNativeApplicationOidcOptions\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The OpenID Connect (OIDC) options.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyVerifiedAccessTrustProviderResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VerifiedAccessTrustProvider\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessTrustProvider\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VerifiedAccessTrustProvider\",\n                        \"smithy.api#documentation\": \"<p>Details about the Verified Access trust provider.</p>\",\n                        \"smithy.api#xmlName\": \"verifiedAccessTrustProvider\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyVolume\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ModifyVolumeRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ModifyVolumeResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>You can modify several parameters of an existing EBS volume, including volume size, volume\\n      type, and IOPS capacity. If your EBS volume is attached to a current-generation EC2 instance\\n      type, you might be able to apply these changes without stopping the instance or detaching the\\n      volume from it. For more information about modifying EBS volumes, see <a href=\\\"https://docs.aws.amazon.com/ebs/latest/userguide/ebs-modify-volume.html\\\">Amazon EBS Elastic Volumes</a> \\n      in the <i>Amazon EBS User Guide</i>.</p>\\n         <p>When you complete a resize operation on your volume, you need to extend the volume's\\n      file-system size to take advantage of the new storage capacity. For more information, see <a href=\\\"https://docs.aws.amazon.com/ebs/latest/userguide/recognize-expanded-volume-linux.html\\\">Extend the file system</a>.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/ebs/latest/userguide/monitoring-volume-modifications.html\\\">Monitor the progress of volume modifications</a> in the <i>Amazon EBS User Guide</i>.</p>\\n         <p>With previous-generation instance types, resizing an EBS volume might require detaching and\\n      reattaching the volume or stopping and restarting the instance.</p>\\n         <p>After modifying a volume, you must wait at least six hours and ensure that the volume \\n      is in the <code>in-use</code> or <code>available</code> state before you can modify the same \\n      volume. This is sometimes referred to as a cooldown period.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ModifyVolumeAttribute\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ModifyVolumeAttributeRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Modifies a volume attribute.</p>\\n         <p>By default, all I/O operations for the volume are suspended when the data on the volume is\\n      determined to be potentially inconsistent, to prevent undetectable, latent data corruption.\\n      The I/O access to the volume can be resumed by first enabling I/O access and then checking the\\n      data consistency on your volume.</p>\\n         <p>You can change the default behavior to resume I/O operations. We recommend that you change\\n      this only for boot volumes or for volumes that are stateless or disposable.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To modify a volume attribute\",\n                        \"documentation\": \"This example sets the ``autoEnableIo`` attribute of the volume with the ID ``vol-1234567890abcdef0`` to ``true``. If the command succeeds, no output is returned.\",\n                        \"input\": {\n                            \"DryRun\": true,\n                            \"VolumeId\": \"vol-1234567890abcdef0\",\n                            \"AutoEnableIO\": {\n                                \"Value\": true\n                            }\n                        },\n                        \"output\": {}\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#ModifyVolumeAttributeRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AutoEnableIO\": {\n                    \"target\": \"com.amazonaws.ec2#AttributeBooleanValue\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether the volume should be auto-enabled for I/O operations.</p>\"\n                    }\n                },\n                \"VolumeId\": {\n                    \"target\": \"com.amazonaws.ec2#VolumeId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the volume.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyVolumeRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"VolumeId\": {\n                    \"target\": \"com.amazonaws.ec2#VolumeId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the volume.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Size\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The target size of the volume, in GiB. The target volume size must be greater than or\\n      equal to the existing size of the volume.</p>\\n         <p>The following are the supported volumes sizes for each volume type:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>gp2</code>: 1 - 16,384 GiB</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>gp3</code>: 1 - 65,536 GiB</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>io1</code>: 4 - 16,384 GiB</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>io2</code>: 4 - 65,536 GiB</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>st1</code> and <code>sc1</code>: 125 - 16,384 GiB</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>standard</code>: 1 - 1024 GiB</p>\\n            </li>\\n         </ul>\\n         <p>Default: The existing size is retained.</p>\"\n                    }\n                },\n                \"VolumeType\": {\n                    \"target\": \"com.amazonaws.ec2#VolumeType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The target EBS volume type of the volume. For more information, see <a href=\\\"https://docs.aws.amazon.com/ebs/latest/userguide/ebs-volume-types.html\\\">Amazon EBS volume types</a> in the <i>Amazon EBS User Guide</i>.</p>\\n         <p>Default: The existing type is retained.</p>\"\n                    }\n                },\n                \"Iops\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The target IOPS rate of the volume. This parameter is valid only for <code>gp3</code>, <code>io1</code>, and <code>io2</code> volumes.</p>\\n         <p>The following are the supported values for each volume type:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>gp3</code>: 3,000 - 80,000 IOPS</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>io1</code>: 100 - 64,000 IOPS</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>io2</code>: 100 - 256,000 IOPS</p>\\n            </li>\\n         </ul>\\n         <p>For <code>io2</code> volumes, you can achieve up to 256,000 IOPS on \\n<a href=\\\"https://docs.aws.amazon.com/ec2/latest/instancetypes/ec2-nitro-instances.html\\\">instances \\nbuilt on the Nitro System</a>. On other instances, you can achieve performance up to 32,000 IOPS.</p>\\n         <p>Default: The existing value is retained if you keep the same volume type. If you change\\n      the volume type to <code>io1</code>, <code>io2</code>, or <code>gp3</code>, the default is 3,000.</p>\"\n                    }\n                },\n                \"Throughput\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The target throughput of the volume, in MiB/s. This parameter is valid only for <code>gp3</code> volumes. \\n      The maximum value is 2,000.</p>\\n         <p>Default: The existing value is retained if the source and target volume type is <code>gp3</code>.\\n      Otherwise, the default value is 125.</p>\\n         <p>Valid Range: Minimum value of 125. Maximum value of 2,000.</p>\"\n                    }\n                },\n                \"MultiAttachEnabled\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies whether to enable Amazon EBS Multi-Attach. If you enable Multi-Attach, you can attach the \\n\\t  volume to up to 16 <a href=\\\"https://docs.aws.amazon.com/ec2/latest/instancetypes/ec2-nitro-instances.html\\\">\\n\\t\\t\\tNitro-based instances</a> in the same Availability Zone. This parameter is \\n\\t\\tsupported with <code>io1</code> and <code>io2</code> volumes only. For more information, see \\n\\t  <a href=\\\"https://docs.aws.amazon.com/ebs/latest/userguide/ebs-volumes-multi.html\\\">\\n\\t\\t\\tAmazon EBS Multi-Attach</a> in the <i>Amazon EBS User Guide</i>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyVolumeResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VolumeModification\": {\n                    \"target\": \"com.amazonaws.ec2#VolumeModification\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VolumeModification\",\n                        \"smithy.api#documentation\": \"<p>Information about the volume modification.</p>\",\n                        \"smithy.api#xmlName\": \"volumeModification\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyVpcAttribute\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ModifyVpcAttributeRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Modifies the specified attribute of the specified VPC.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To modify the enableDnsSupport attribute\",\n                        \"documentation\": \"This example modifies the enableDnsSupport attribute. This attribute indicates whether DNS resolution is enabled for the VPC. If this attribute is true, the Amazon DNS server resolves DNS hostnames for instances in the VPC to their corresponding IP addresses; otherwise, it does not.\",\n                        \"input\": {\n                            \"VpcId\": \"vpc-a01106c2\",\n                            \"EnableDnsSupport\": {\n                                \"Value\": false\n                            }\n                        }\n                    },\n                    {\n                        \"title\": \"To modify the enableDnsHostnames attribute\",\n                        \"documentation\": \"This example modifies the enableDnsHostnames attribute. This attribute indicates whether instances launched in the VPC get DNS hostnames. If this attribute is true, instances in the VPC get DNS hostnames; otherwise, they do not.\",\n                        \"input\": {\n                            \"VpcId\": \"vpc-a01106c2\",\n                            \"EnableDnsHostnames\": {\n                                \"Value\": false\n                            }\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#ModifyVpcAttributeRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"EnableDnsHostnames\": {\n                    \"target\": \"com.amazonaws.ec2#AttributeBooleanValue\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether the instances launched in the VPC get DNS hostnames. If enabled, instances in the VPC get DNS hostnames; otherwise, they do not.</p>\\n         <p>You cannot modify the DNS resolution and DNS hostnames attributes in the same request. Use separate requests for each attribute. You can only enable DNS hostnames if you've enabled DNS support.</p>\"\n                    }\n                },\n                \"EnableDnsSupport\": {\n                    \"target\": \"com.amazonaws.ec2#AttributeBooleanValue\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether the DNS resolution is supported for the VPC. If enabled, queries to\\n\\t\\t\\tthe Amazon provided DNS server at the 169.254.169.253 IP address, or the reserved IP\\n\\t\\t\\taddress at the base of the VPC network range \\\"plus two\\\" succeed. If disabled, the Amazon\\n\\t\\t\\tprovided DNS service in the VPC that resolves public DNS hostnames to IP addresses is\\n\\t\\t\\tnot enabled.</p>\\n         <p>You cannot modify the DNS resolution and DNS hostnames attributes in the same request. Use separate requests for each attribute.</p>\"\n                    }\n                },\n                \"VpcId\": {\n                    \"target\": \"com.amazonaws.ec2#VpcId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcId\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the VPC.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"vpcId\"\n                    }\n                },\n                \"EnableNetworkAddressUsageMetrics\": {\n                    \"target\": \"com.amazonaws.ec2#AttributeBooleanValue\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether Network Address Usage metrics are enabled for your VPC.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyVpcBlockPublicAccessExclusion\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ModifyVpcBlockPublicAccessExclusionRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ModifyVpcBlockPublicAccessExclusionResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Modify VPC Block Public Access (BPA) exclusions. A VPC BPA exclusion is a mode that can be applied to a single VPC or subnet that exempts it from the account’s BPA mode and will allow bidirectional or egress-only access. You can create BPA exclusions for VPCs and subnets even when BPA is not enabled on the account to ensure that there is no traffic disruption to the exclusions when VPC BPA is turned on.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ModifyVpcBlockPublicAccessExclusionRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"ExclusionId\": {\n                    \"target\": \"com.amazonaws.ec2#VpcBlockPublicAccessExclusionId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of an exclusion.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"InternetGatewayExclusionMode\": {\n                    \"target\": \"com.amazonaws.ec2#InternetGatewayExclusionMode\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The exclusion mode for internet gateway traffic.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>allow-bidirectional</code>: Allow all internet traffic to and from the excluded VPCs and subnets.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>allow-egress</code>: Allow outbound internet traffic from the excluded VPCs and subnets. Block inbound internet traffic to the excluded VPCs and subnets. Only applies when VPC Block Public Access is set to Bidirectional.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyVpcBlockPublicAccessExclusionResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VpcBlockPublicAccessExclusion\": {\n                    \"target\": \"com.amazonaws.ec2#VpcBlockPublicAccessExclusion\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcBlockPublicAccessExclusion\",\n                        \"smithy.api#documentation\": \"<p>Details related to the exclusion.</p>\",\n                        \"smithy.api#xmlName\": \"vpcBlockPublicAccessExclusion\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyVpcBlockPublicAccessOptions\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ModifyVpcBlockPublicAccessOptionsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ModifyVpcBlockPublicAccessOptionsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Modify VPC Block Public Access (BPA) options. VPC Block Public Access (BPA) enables you to block resources in VPCs and subnets that you own in a Region from reaching or being reached from the internet through internet gateways and egress-only internet gateways. To learn more about VPC BPA, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/userguide/security-vpc-bpa.html\\\">Block public access to VPCs and subnets</a> in the <i>Amazon VPC User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ModifyVpcBlockPublicAccessOptionsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"InternetGatewayBlockMode\": {\n                    \"target\": \"com.amazonaws.ec2#InternetGatewayBlockMode\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The mode of VPC BPA.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>off</code>: VPC BPA is not enabled and traffic is allowed to and from internet gateways and egress-only internet gateways in this Region.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>block-bidirectional</code>: Block all traffic to and from internet gateways and egress-only internet gateways in this Region (except for excluded VPCs and subnets).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>block-ingress</code>: Block all internet traffic to the VPCs in this Region (except for VPCs or subnets which are excluded). Only traffic to and from NAT gateways and egress-only internet gateways is allowed because these gateways only allow outbound connections to be established.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyVpcBlockPublicAccessOptionsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VpcBlockPublicAccessOptions\": {\n                    \"target\": \"com.amazonaws.ec2#VpcBlockPublicAccessOptions\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcBlockPublicAccessOptions\",\n                        \"smithy.api#documentation\": \"<p>Details related to the VPC Block Public Access (BPA) options.</p>\",\n                        \"smithy.api#xmlName\": \"vpcBlockPublicAccessOptions\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyVpcEndpoint\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ModifyVpcEndpointRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ModifyVpcEndpointResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Modifies attributes of a specified VPC endpoint. The attributes that you can modify\\n            depend on the type of VPC endpoint (interface, gateway, or Gateway Load Balancer). For more information, \\n            see the <a href=\\\"https://docs.aws.amazon.com/vpc/latest/privatelink/\\\">Amazon Web Services PrivateLink \\n                Guide</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ModifyVpcEndpointConnectionNotification\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ModifyVpcEndpointConnectionNotificationRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ModifyVpcEndpointConnectionNotificationResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Modifies a connection notification for VPC endpoint or VPC endpoint service. You\\n            can change the SNS topic for the notification, or the events for which to be notified. </p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ModifyVpcEndpointConnectionNotificationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"ConnectionNotificationId\": {\n                    \"target\": \"com.amazonaws.ec2#ConnectionNotificationId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the notification.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ConnectionNotificationArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN for the SNS topic for the notification.</p>\"\n                    }\n                },\n                \"ConnectionEvents\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The events for the endpoint. Valid values are <code>Accept</code>,\\n                <code>Connect</code>, <code>Delete</code>, and <code>Reject</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyVpcEndpointConnectionNotificationResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ReturnValue\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Return\",\n                        \"smithy.api#documentation\": \"<p>Returns <code>true</code> if the request succeeds; otherwise, it returns an error.</p>\",\n                        \"smithy.api#xmlName\": \"return\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyVpcEndpointRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"VpcEndpointId\": {\n                    \"target\": \"com.amazonaws.ec2#VpcEndpointId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the endpoint.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ResetPolicy\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>(Gateway endpoint) Specify <code>true</code> to reset the policy document to the\\n            default policy. The default policy allows full access to the service.</p>\"\n                    }\n                },\n                \"PolicyDocument\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>(Interface and gateway endpoints) A policy to attach to the endpoint that controls access to the service. The policy must\\n            be in valid JSON format.</p>\"\n                    }\n                },\n                \"AddRouteTableIds\": {\n                    \"target\": \"com.amazonaws.ec2#VpcEndpointRouteTableIdList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>(Gateway endpoint) The IDs of the route tables to associate with the endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"AddRouteTableId\"\n                    }\n                },\n                \"RemoveRouteTableIds\": {\n                    \"target\": \"com.amazonaws.ec2#VpcEndpointRouteTableIdList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>(Gateway endpoint) The IDs of the route tables to disassociate from the endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"RemoveRouteTableId\"\n                    }\n                },\n                \"AddSubnetIds\": {\n                    \"target\": \"com.amazonaws.ec2#VpcEndpointSubnetIdList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>(Interface and Gateway Load Balancer endpoints) The IDs of the subnets in which to serve the endpoint. \\n            For a Gateway Load Balancer endpoint, you can specify only one subnet.</p>\",\n                        \"smithy.api#xmlName\": \"AddSubnetId\"\n                    }\n                },\n                \"RemoveSubnetIds\": {\n                    \"target\": \"com.amazonaws.ec2#VpcEndpointSubnetIdList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>(Interface endpoint) The IDs of the subnets from which to remove the endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"RemoveSubnetId\"\n                    }\n                },\n                \"AddSecurityGroupIds\": {\n                    \"target\": \"com.amazonaws.ec2#VpcEndpointSecurityGroupIdList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>(Interface endpoint) The IDs of the security groups to associate with the endpoint network interfaces.</p>\",\n                        \"smithy.api#xmlName\": \"AddSecurityGroupId\"\n                    }\n                },\n                \"RemoveSecurityGroupIds\": {\n                    \"target\": \"com.amazonaws.ec2#VpcEndpointSecurityGroupIdList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>(Interface endpoint) The IDs of the security groups to disassociate from the endpoint network interfaces.</p>\",\n                        \"smithy.api#xmlName\": \"RemoveSecurityGroupId\"\n                    }\n                },\n                \"IpAddressType\": {\n                    \"target\": \"com.amazonaws.ec2#IpAddressType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IP address type for the endpoint.</p>\"\n                    }\n                },\n                \"DnsOptions\": {\n                    \"target\": \"com.amazonaws.ec2#DnsOptionsSpecification\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The DNS options for the endpoint.</p>\"\n                    }\n                },\n                \"PrivateDnsEnabled\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>(Interface endpoint) Indicates whether a private hosted zone is associated with the VPC.</p>\"\n                    }\n                },\n                \"SubnetConfigurations\": {\n                    \"target\": \"com.amazonaws.ec2#SubnetConfigurationsList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The subnet configurations for the endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"SubnetConfiguration\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyVpcEndpointResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Return\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Return\",\n                        \"smithy.api#documentation\": \"<p>Returns <code>true</code> if the request succeeds; otherwise, it returns an error.</p>\",\n                        \"smithy.api#xmlName\": \"return\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyVpcEndpointServiceConfiguration\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ModifyVpcEndpointServiceConfigurationRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ModifyVpcEndpointServiceConfigurationResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Modifies the attributes of the specified VPC endpoint service configuration.</p>\\n         <p>If you set or modify the private DNS name, you must prove that you own the private DNS\\n            domain name.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ModifyVpcEndpointServiceConfigurationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"ServiceId\": {\n                    \"target\": \"com.amazonaws.ec2#VpcEndpointServiceId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the service.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"PrivateDnsName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>(Interface endpoint configuration) The private DNS name to assign to the endpoint service.</p>\"\n                    }\n                },\n                \"RemovePrivateDnsName\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>(Interface endpoint configuration) Removes the private DNS name of the endpoint service.</p>\"\n                    }\n                },\n                \"AcceptanceRequired\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether requests to create an endpoint to the service must be accepted.</p>\"\n                    }\n                },\n                \"AddNetworkLoadBalancerArns\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Names (ARNs) of Network Load Balancers to add to the service\\n            configuration.</p>\",\n                        \"smithy.api#xmlName\": \"AddNetworkLoadBalancerArn\"\n                    }\n                },\n                \"RemoveNetworkLoadBalancerArns\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Names (ARNs) of Network Load Balancers to remove from the service\\n            configuration.</p>\",\n                        \"smithy.api#xmlName\": \"RemoveNetworkLoadBalancerArn\"\n                    }\n                },\n                \"AddGatewayLoadBalancerArns\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Names (ARNs) of Gateway Load Balancers to add to the service configuration.</p>\",\n                        \"smithy.api#xmlName\": \"AddGatewayLoadBalancerArn\"\n                    }\n                },\n                \"RemoveGatewayLoadBalancerArns\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Names (ARNs) of Gateway Load Balancers to remove from the service configuration.</p>\",\n                        \"smithy.api#xmlName\": \"RemoveGatewayLoadBalancerArn\"\n                    }\n                },\n                \"AddSupportedIpAddressTypes\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IP address types to add to the service configuration.</p>\",\n                        \"smithy.api#xmlName\": \"AddSupportedIpAddressType\"\n                    }\n                },\n                \"RemoveSupportedIpAddressTypes\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IP address types to remove from the service configuration.</p>\",\n                        \"smithy.api#xmlName\": \"RemoveSupportedIpAddressType\"\n                    }\n                },\n                \"AddSupportedRegions\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The supported Regions to add to the service configuration.</p>\",\n                        \"smithy.api#xmlName\": \"AddSupportedRegion\"\n                    }\n                },\n                \"RemoveSupportedRegions\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The supported Regions to remove from the service configuration.</p>\",\n                        \"smithy.api#xmlName\": \"RemoveSupportedRegion\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyVpcEndpointServiceConfigurationResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Return\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Return\",\n                        \"smithy.api#documentation\": \"<p>Returns <code>true</code> if the request succeeds; otherwise, it returns an error.</p>\",\n                        \"smithy.api#xmlName\": \"return\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyVpcEndpointServicePayerResponsibility\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ModifyVpcEndpointServicePayerResponsibilityRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ModifyVpcEndpointServicePayerResponsibilityResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Modifies the payer responsibility for your VPC endpoint service.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ModifyVpcEndpointServicePayerResponsibilityRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"ServiceId\": {\n                    \"target\": \"com.amazonaws.ec2#VpcEndpointServiceId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the service.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"PayerResponsibility\": {\n                    \"target\": \"com.amazonaws.ec2#PayerResponsibility\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The entity that is responsible for the endpoint costs. The default is the endpoint owner.\\n            If you set the payer responsibility to the service owner, you cannot set it back to the\\n            endpoint owner.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyVpcEndpointServicePayerResponsibilityResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ReturnValue\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Return\",\n                        \"smithy.api#documentation\": \"<p>Returns <code>true</code> if the request succeeds; otherwise, it returns an error.</p>\",\n                        \"smithy.api#xmlName\": \"return\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyVpcEndpointServicePermissions\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ModifyVpcEndpointServicePermissionsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ModifyVpcEndpointServicePermissionsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Modifies the permissions for your VPC endpoint service. You can add or remove permissions\\n            for service consumers (Amazon Web Services accounts, users, and IAM roles) to connect to\\n            your endpoint service. Principal ARNs with path components aren't supported.</p>\\n         <p>If you grant permissions to all principals, the service is public. Any users who know the name of a\\n\\t        public service can send a request to attach an endpoint. If the service does not require manual approval,\\n\\t        attachments are automatically approved.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ModifyVpcEndpointServicePermissionsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"ServiceId\": {\n                    \"target\": \"com.amazonaws.ec2#VpcEndpointServiceId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the service.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"AddAllowedPrincipals\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Names (ARN) of the principals.\\n\\t        Permissions are granted to the principals in this list.\\n\\t        To grant permissions to all principals, specify an asterisk (*).</p>\"\n                    }\n                },\n                \"RemoveAllowedPrincipals\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Names (ARN) of the principals.\\n\\t        Permissions are revoked for principals in this list.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyVpcEndpointServicePermissionsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AddedPrincipals\": {\n                    \"target\": \"com.amazonaws.ec2#AddedPrincipalSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AddedPrincipalSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the added principals.</p>\",\n                        \"smithy.api#xmlName\": \"addedPrincipalSet\"\n                    }\n                },\n                \"ReturnValue\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Return\",\n                        \"smithy.api#documentation\": \"<p>Returns <code>true</code> if the request succeeds; otherwise, it returns an error.</p>\",\n                        \"smithy.api#xmlName\": \"return\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyVpcPeeringConnectionOptions\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ModifyVpcPeeringConnectionOptionsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ModifyVpcPeeringConnectionOptionsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Modifies the VPC peering connection options on one side of a VPC peering connection.</p>\\n         <p>If the peered VPCs are in the same Amazon Web Services account, you can enable DNS\\n            resolution for queries from the local VPC. This ensures that queries from the local VPC\\n            resolve to private IP addresses in the peer VPC. This option is not available if the\\n            peered VPCs are in different Amazon Web Services accounts or different Regions. For\\n            peered VPCs in different Amazon Web Services accounts, each Amazon Web Services account\\n            owner must initiate a separate request to modify the peering connection options. For\\n            inter-region peering connections, you must use the Region for the requester VPC to\\n            modify the requester VPC peering options and the Region for the accepter VPC to modify\\n            the accepter VPC peering options. To verify which VPCs are the accepter and the\\n            requester for a VPC peering connection, use the <a>DescribeVpcPeeringConnections</a> command.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ModifyVpcPeeringConnectionOptionsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccepterPeeringConnectionOptions\": {\n                    \"target\": \"com.amazonaws.ec2#PeeringConnectionOptionsRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The VPC peering connection options for the accepter VPC.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"RequesterPeeringConnectionOptions\": {\n                    \"target\": \"com.amazonaws.ec2#PeeringConnectionOptionsRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The VPC peering connection options for the requester VPC.</p>\"\n                    }\n                },\n                \"VpcPeeringConnectionId\": {\n                    \"target\": \"com.amazonaws.ec2#VpcPeeringConnectionId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the VPC peering connection.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyVpcPeeringConnectionOptionsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccepterPeeringConnectionOptions\": {\n                    \"target\": \"com.amazonaws.ec2#PeeringConnectionOptions\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AccepterPeeringConnectionOptions\",\n                        \"smithy.api#documentation\": \"<p>Information about the VPC peering connection options for the accepter VPC.</p>\",\n                        \"smithy.api#xmlName\": \"accepterPeeringConnectionOptions\"\n                    }\n                },\n                \"RequesterPeeringConnectionOptions\": {\n                    \"target\": \"com.amazonaws.ec2#PeeringConnectionOptions\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RequesterPeeringConnectionOptions\",\n                        \"smithy.api#documentation\": \"<p>Information about the VPC peering connection options for the requester VPC.</p>\",\n                        \"smithy.api#xmlName\": \"requesterPeeringConnectionOptions\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyVpcTenancy\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ModifyVpcTenancyRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ModifyVpcTenancyResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Modifies the instance tenancy attribute of the specified VPC. You can change the\\n            instance tenancy attribute of a VPC to <code>default</code> only. You cannot change the\\n            instance tenancy attribute to <code>dedicated</code>.</p>\\n         <p>After you modify the tenancy of the VPC, any new instances that you launch into the\\n            VPC have a tenancy of <code>default</code>, unless you specify otherwise during launch.\\n            The tenancy of any existing instances in the VPC is not affected.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/dedicated-instance.html\\\">Dedicated Instances</a> in the\\n\\t\\t\\t\\t<i>Amazon EC2 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ModifyVpcTenancyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VpcId\": {\n                    \"target\": \"com.amazonaws.ec2#VpcId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the VPC.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"InstanceTenancy\": {\n                    \"target\": \"com.amazonaws.ec2#VpcTenancy\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The instance tenancy attribute for the VPC. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyVpcTenancyResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ReturnValue\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Return\",\n                        \"smithy.api#documentation\": \"<p>Returns <code>true</code> if the request succeeds; otherwise, returns an\\n            error.</p>\",\n                        \"smithy.api#xmlName\": \"return\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyVpnConnection\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ModifyVpnConnectionRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ModifyVpnConnectionResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Modifies the customer gateway or the target gateway of an Amazon Web Services Site-to-Site VPN connection. To\\n            modify the target gateway, the following migration options are available:</p>\\n         <ul>\\n            <li>\\n               <p>An existing virtual private gateway to a new virtual private gateway</p>\\n            </li>\\n            <li>\\n               <p>An existing virtual private gateway to a transit gateway</p>\\n            </li>\\n            <li>\\n               <p>An existing transit gateway to a new transit gateway</p>\\n            </li>\\n            <li>\\n               <p>An existing transit gateway to a virtual private gateway</p>\\n            </li>\\n         </ul>\\n         <p>Before you perform the migration to the new gateway, you must configure the new\\n            gateway. Use <a>CreateVpnGateway</a> to create a virtual private gateway, or\\n                <a>CreateTransitGateway</a> to create a transit gateway.</p>\\n         <p>This step is required when you migrate from a virtual private gateway with static\\n            routes to a transit gateway. </p>\\n         <p>You must delete the static routes before you migrate to the new gateway.</p>\\n         <p>Keep a copy of the static route before you delete it. You will need to add back these\\n            routes to the transit gateway after the VPN connection migration is complete.</p>\\n         <p>After you migrate to the new gateway, you might need to modify your VPC route table.\\n            Use <a>CreateRoute</a> and <a>DeleteRoute</a> to make the changes\\n            described in <a href=\\\"https://docs.aws.amazon.com/vpn/latest/s2svpn/modify-vpn-target.html#step-update-routing\\\">Update VPC route\\n                tables</a> in the <i>Amazon Web Services Site-to-Site VPN User Guide</i>.</p>\\n         <p>When the new gateway is a transit gateway, modify the transit gateway route table to\\n            allow traffic between the VPC and the Amazon Web Services Site-to-Site VPN connection.\\n            Use <a>CreateTransitGatewayRoute</a> to add the routes.</p>\\n         <p> If you deleted VPN static routes, you must add the static routes to the transit\\n            gateway route table.</p>\\n         <p>After you perform this operation, the VPN endpoint's IP addresses on the Amazon Web Services side and the tunnel options remain intact. Your Amazon Web Services Site-to-Site VPN connection will\\n            be temporarily unavailable for a brief period while we provision the new\\n            endpoints.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ModifyVpnConnectionOptions\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ModifyVpnConnectionOptionsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ModifyVpnConnectionOptionsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Modifies the connection options for your Site-to-Site VPN connection.</p>\\n         <p>When you modify the VPN connection options, the VPN endpoint IP addresses on the\\n                Amazon Web Services side do not change, and the tunnel options do not change. Your\\n            VPN connection will be temporarily unavailable for a brief period while the VPN\\n            connection is updated.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ModifyVpnConnectionOptionsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VpnConnectionId\": {\n                    \"target\": \"com.amazonaws.ec2#VpnConnectionId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the Site-to-Site VPN connection. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"LocalIpv4NetworkCidr\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IPv4 CIDR on the customer gateway (on-premises) side of the VPN connection.</p>\\n         <p>Default: <code>0.0.0.0/0</code>\\n         </p>\"\n                    }\n                },\n                \"RemoteIpv4NetworkCidr\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IPv4 CIDR on the Amazon Web Services side of the VPN connection.</p>\\n         <p>Default: <code>0.0.0.0/0</code>\\n         </p>\"\n                    }\n                },\n                \"LocalIpv6NetworkCidr\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IPv6 CIDR on the customer gateway (on-premises) side of the VPN connection.</p>\\n         <p>Default: <code>::/0</code>\\n         </p>\"\n                    }\n                },\n                \"RemoteIpv6NetworkCidr\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IPv6 CIDR on the Amazon Web Services side of the VPN connection.</p>\\n         <p>Default: <code>::/0</code>\\n         </p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyVpnConnectionOptionsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VpnConnection\": {\n                    \"target\": \"com.amazonaws.ec2#VpnConnection\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpnConnection\",\n                        \"smithy.api#documentation\": \"<p>Information about the VPN connection.</p>\",\n                        \"smithy.api#xmlName\": \"vpnConnection\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyVpnConnectionRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VpnConnectionId\": {\n                    \"target\": \"com.amazonaws.ec2#VpnConnectionId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the VPN connection.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TransitGatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the transit gateway.</p>\"\n                    }\n                },\n                \"CustomerGatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#CustomerGatewayId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the customer gateway at your end of the VPN connection.</p>\"\n                    }\n                },\n                \"VpnGatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#VpnGatewayId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the virtual private gateway at the Amazon Web Services side of the VPN\\n            connection.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually\\n            making the request, and provides an error response. If you have the required\\n            permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is\\n                <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyVpnConnectionResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VpnConnection\": {\n                    \"target\": \"com.amazonaws.ec2#VpnConnection\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpnConnection\",\n                        \"smithy.api#documentation\": \"<p>Information about the VPN connection.</p>\",\n                        \"smithy.api#xmlName\": \"vpnConnection\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyVpnTunnelCertificate\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ModifyVpnTunnelCertificateRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ModifyVpnTunnelCertificateResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Modifies the VPN tunnel endpoint certificate.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ModifyVpnTunnelCertificateRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VpnConnectionId\": {\n                    \"target\": \"com.amazonaws.ec2#VpnConnectionId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the Amazon Web Services Site-to-Site VPN connection.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"VpnTunnelOutsideIpAddress\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The external IP address of the VPN tunnel.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually\\n            making the request, and provides an error response. If you have the required\\n            permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is\\n                <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyVpnTunnelCertificateResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VpnConnection\": {\n                    \"target\": \"com.amazonaws.ec2#VpnConnection\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpnConnection\",\n                        \"smithy.api#documentation\": \"<p>Information about the VPN connection.</p>\",\n                        \"smithy.api#xmlName\": \"vpnConnection\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyVpnTunnelOptions\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ModifyVpnTunnelOptionsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ModifyVpnTunnelOptionsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Modifies the options for a VPN tunnel in an Amazon Web Services Site-to-Site VPN connection. You can modify\\n            multiple options for a tunnel in a single request, but you can only modify one tunnel at\\n            a time. For more information, see <a href=\\\"https://docs.aws.amazon.com/vpn/latest/s2svpn/VPNTunnels.html\\\">Site-to-Site VPN tunnel options for your Site-to-Site VPN\\n                connection</a> in the <i>Amazon Web Services Site-to-Site VPN User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ModifyVpnTunnelOptionsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VpnConnectionId\": {\n                    \"target\": \"com.amazonaws.ec2#VpnConnectionId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the Amazon Web Services Site-to-Site VPN connection.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"VpnTunnelOutsideIpAddress\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The external IP address of the VPN tunnel.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TunnelOptions\": {\n                    \"target\": \"com.amazonaws.ec2#ModifyVpnTunnelOptionsSpecification\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The tunnel options to modify.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually\\n            making the request, and provides an error response. If you have the required\\n            permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is\\n                <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"SkipTunnelReplacement\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Choose whether or not to trigger immediate tunnel replacement. This is only applicable when turning on or off <code>EnableTunnelLifecycleControl</code>.</p>\\n         <p>Valid values: <code>True</code> | <code>False</code>\\n         </p>\"\n                    }\n                },\n                \"PreSharedKeyStorage\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the storage mode for the pre-shared key (PSK). Valid values are <code>Standard</code> (stored in Site-to-Site VPN service) or <code>SecretsManager</code> (stored in Amazon Web Services Secrets Manager).</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyVpnTunnelOptionsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VpnConnection\": {\n                    \"target\": \"com.amazonaws.ec2#VpnConnection\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpnConnection\",\n                        \"smithy.api#documentation\": \"<p>Information about the VPN connection.</p>\",\n                        \"smithy.api#xmlName\": \"vpnConnection\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ModifyVpnTunnelOptionsSpecification\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TunnelInsideCidr\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The range of inside IPv4 addresses for the tunnel. Any specified CIDR blocks must be\\n            unique across all VPN connections that use the same virtual private gateway. </p>\\n         <p>Constraints: A size /30 CIDR block from the <code>169.254.0.0/16</code> range. The\\n            following CIDR blocks are reserved and cannot be used:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>169.254.0.0/30</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>169.254.1.0/30</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>169.254.2.0/30</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>169.254.3.0/30</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>169.254.4.0/30</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>169.254.5.0/30</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>169.254.169.252/30</code>\\n               </p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"TunnelInsideIpv6Cidr\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The range of inside IPv6 addresses for the tunnel. Any specified CIDR blocks must be\\n            unique across all VPN connections that use the same transit gateway.</p>\\n         <p>Constraints: A size /126 CIDR block from the local <code>fd00::/8</code> range.</p>\"\n                    }\n                },\n                \"PreSharedKey\": {\n                    \"target\": \"com.amazonaws.ec2#preSharedKey\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The pre-shared key (PSK) to establish initial authentication between the virtual\\n            private gateway and the customer gateway.</p>\\n         <p>Constraints: Allowed characters are alphanumeric characters, periods (.), and\\n            underscores (_). Must be between 8 and 64 characters in length and cannot start with\\n            zero (0).</p>\"\n                    }\n                },\n                \"Phase1LifetimeSeconds\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The lifetime for phase 1 of the IKE negotiation, in seconds.</p>\\n         <p>Constraints: A value between 900 and 28,800.</p>\\n         <p>Default: <code>28800</code>\\n         </p>\"\n                    }\n                },\n                \"Phase2LifetimeSeconds\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The lifetime for phase 2 of the IKE negotiation, in seconds.</p>\\n         <p>Constraints: A value between 900 and 3,600. The value must be less than the value for\\n                <code>Phase1LifetimeSeconds</code>.</p>\\n         <p>Default: <code>3600</code>\\n         </p>\"\n                    }\n                },\n                \"RekeyMarginTimeSeconds\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The margin time, in seconds, before the phase 2 lifetime expires, during which the\\n                Amazon Web Services side of the VPN connection performs an IKE rekey. The exact time\\n            of the rekey is randomly selected based on the value for\\n                <code>RekeyFuzzPercentage</code>.</p>\\n         <p>Constraints: A value between 60 and half of <code>Phase2LifetimeSeconds</code>.</p>\\n         <p>Default: <code>270</code>\\n         </p>\"\n                    }\n                },\n                \"RekeyFuzzPercentage\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The percentage of the rekey window (determined by <code>RekeyMarginTimeSeconds</code>)\\n            during which the rekey time is randomly selected.</p>\\n         <p>Constraints: A value between 0 and 100.</p>\\n         <p>Default: <code>100</code>\\n         </p>\"\n                    }\n                },\n                \"ReplayWindowSize\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of packets in an IKE replay window.</p>\\n         <p>Constraints: A value between 64 and 2048.</p>\\n         <p>Default: <code>1024</code>\\n         </p>\"\n                    }\n                },\n                \"DPDTimeoutSeconds\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of seconds after which a DPD timeout occurs. A DPD timeout of 40 seconds means that the VPN endpoint will consider the peer dead 30 seconds after the first failed keep-alive.</p>\\n         <p>Constraints: A value greater than or equal to 30.</p>\\n         <p>Default: <code>40</code>\\n         </p>\"\n                    }\n                },\n                \"DPDTimeoutAction\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The action to take after DPD timeout occurs. Specify <code>restart</code> to restart\\n            the IKE initiation. Specify <code>clear</code> to end the IKE session.</p>\\n         <p>Valid Values: <code>clear</code> | <code>none</code> | <code>restart</code>\\n         </p>\\n         <p>Default: <code>clear</code>\\n         </p>\"\n                    }\n                },\n                \"Phase1EncryptionAlgorithms\": {\n                    \"target\": \"com.amazonaws.ec2#Phase1EncryptionAlgorithmsRequestList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more encryption algorithms that are permitted for the VPN tunnel for phase 1\\n            IKE negotiations.</p>\\n         <p>Valid values: <code>AES128</code> | <code>AES256</code> | <code>AES128-GCM-16</code> |\\n                <code>AES256-GCM-16</code>\\n         </p>\",\n                        \"smithy.api#xmlName\": \"Phase1EncryptionAlgorithm\"\n                    }\n                },\n                \"Phase2EncryptionAlgorithms\": {\n                    \"target\": \"com.amazonaws.ec2#Phase2EncryptionAlgorithmsRequestList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more encryption algorithms that are permitted for the VPN tunnel for phase 2\\n            IKE negotiations.</p>\\n         <p>Valid values: <code>AES128</code> | <code>AES256</code> | <code>AES128-GCM-16</code> |\\n                <code>AES256-GCM-16</code>\\n         </p>\",\n                        \"smithy.api#xmlName\": \"Phase2EncryptionAlgorithm\"\n                    }\n                },\n                \"Phase1IntegrityAlgorithms\": {\n                    \"target\": \"com.amazonaws.ec2#Phase1IntegrityAlgorithmsRequestList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more integrity algorithms that are permitted for the VPN tunnel for phase 1 IKE\\n            negotiations.</p>\\n         <p>Valid values: <code>SHA1</code> | <code>SHA2-256</code> | <code>SHA2-384</code> |\\n                <code>SHA2-512</code>\\n         </p>\",\n                        \"smithy.api#xmlName\": \"Phase1IntegrityAlgorithm\"\n                    }\n                },\n                \"Phase2IntegrityAlgorithms\": {\n                    \"target\": \"com.amazonaws.ec2#Phase2IntegrityAlgorithmsRequestList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more integrity algorithms that are permitted for the VPN tunnel for phase 2 IKE\\n            negotiations.</p>\\n         <p>Valid values: <code>SHA1</code> | <code>SHA2-256</code> | <code>SHA2-384</code> |\\n                <code>SHA2-512</code>\\n         </p>\",\n                        \"smithy.api#xmlName\": \"Phase2IntegrityAlgorithm\"\n                    }\n                },\n                \"Phase1DHGroupNumbers\": {\n                    \"target\": \"com.amazonaws.ec2#Phase1DHGroupNumbersRequestList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more Diffie-Hellman group numbers that are permitted for the VPN tunnel for\\n            phase 1 IKE negotiations.</p>\\n         <p>Valid values: <code>2</code> | <code>14</code> | <code>15</code> | <code>16</code> |\\n                <code>17</code> | <code>18</code> | <code>19</code> | <code>20</code> |\\n                <code>21</code> | <code>22</code> | <code>23</code> | <code>24</code>\\n         </p>\",\n                        \"smithy.api#xmlName\": \"Phase1DHGroupNumber\"\n                    }\n                },\n                \"Phase2DHGroupNumbers\": {\n                    \"target\": \"com.amazonaws.ec2#Phase2DHGroupNumbersRequestList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more Diffie-Hellman group numbers that are permitted for the VPN tunnel for\\n            phase 2 IKE negotiations.</p>\\n         <p>Valid values: <code>2</code> | <code>5</code> | <code>14</code> | <code>15</code> |\\n                <code>16</code> | <code>17</code> | <code>18</code> | <code>19</code> |\\n                <code>20</code> | <code>21</code> | <code>22</code> | <code>23</code> |\\n                <code>24</code>\\n         </p>\",\n                        \"smithy.api#xmlName\": \"Phase2DHGroupNumber\"\n                    }\n                },\n                \"IKEVersions\": {\n                    \"target\": \"com.amazonaws.ec2#IKEVersionsRequestList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IKE versions that are permitted for the VPN tunnel.</p>\\n         <p>Valid values: <code>ikev1</code> | <code>ikev2</code>\\n         </p>\",\n                        \"smithy.api#xmlName\": \"IKEVersion\"\n                    }\n                },\n                \"StartupAction\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The action to take when the establishing the tunnel for the VPN connection. By\\n            default, your customer gateway device must initiate the IKE negotiation and bring up the\\n            tunnel. Specify <code>start</code> for Amazon Web Services to initiate the IKE\\n            negotiation.</p>\\n         <p>Valid Values: <code>add</code> | <code>start</code>\\n         </p>\\n         <p>Default: <code>add</code>\\n         </p>\"\n                    }\n                },\n                \"LogOptions\": {\n                    \"target\": \"com.amazonaws.ec2#VpnTunnelLogOptionsSpecification\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Options for logging VPN tunnel activity.</p>\"\n                    }\n                },\n                \"EnableTunnelLifecycleControl\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Turn on or off tunnel endpoint lifecycle control feature.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The Amazon Web Services Site-to-Site VPN tunnel options to modify.</p>\",\n                \"smithy.api#sensitive\": {}\n            }\n        },\n        \"com.amazonaws.ec2#MonitorInstances\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#MonitorInstancesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#MonitorInstancesResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Enables detailed monitoring for a running instance. Otherwise, basic monitoring is\\n            enabled. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-cloudwatch.html\\\">Monitor your instances using\\n                CloudWatch</a> in the <i>Amazon EC2 User Guide</i>.</p>\\n         <p>To disable detailed monitoring, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_UnmonitorInstances.html\\\">UnmonitorInstances</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#MonitorInstancesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceIds\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceIdStringList\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The IDs of the instances.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"InstanceId\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the operation, without actually making the \\n  request, and provides an error response. If you have the required permissions, the error response is \\n  <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#MonitorInstancesResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceMonitorings\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceMonitoringList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstancesSet\",\n                        \"smithy.api#documentation\": \"<p>The monitoring information.</p>\",\n                        \"smithy.api#xmlName\": \"instancesSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#Monitoring\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#MonitoringState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether detailed monitoring is enabled. Otherwise, basic monitoring is\\n            enabled.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the monitoring of an instance.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#MonitoringState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"disabled\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"disabled\"\n                    }\n                },\n                \"disabling\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"disabling\"\n                    }\n                },\n                \"enabled\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"enabled\"\n                    }\n                },\n                \"pending\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"pending\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#MoveAddressToVpc\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#MoveAddressToVpcRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#MoveAddressToVpcResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>This action is deprecated.</p>\\n         </note>\\n         <p>Moves an Elastic IP address from the EC2-Classic platform to the EC2-VPC platform. The\\n      Elastic IP address must be allocated to your account for more than 24 hours, and it must not\\n      be associated with an instance. After the Elastic IP address is moved, it is no longer\\n      available for use in the EC2-Classic platform. You cannot move an Elastic IP address that was\\n      originally allocated for use in the EC2-VPC platform to the EC2-Classic platform.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To move an address to EC2-VPC\",\n                        \"documentation\": \"This example moves the specified Elastic IP address to the EC2-VPC platform.\",\n                        \"input\": {\n                            \"PublicIp\": \"54.123.4.56\"\n                        },\n                        \"output\": {\n                            \"Status\": \"MoveInProgress\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#MoveAddressToVpcRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"PublicIp\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PublicIp\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The Elastic IP address.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"publicIp\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#MoveAddressToVpcResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AllocationId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AllocationId\",\n                        \"smithy.api#documentation\": \"<p>The allocation ID for the Elastic IP address.</p>\",\n                        \"smithy.api#xmlName\": \"allocationId\"\n                    }\n                },\n                \"Status\": {\n                    \"target\": \"com.amazonaws.ec2#Status\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Status\",\n                        \"smithy.api#documentation\": \"<p>The status of the move of the IP address.</p>\",\n                        \"smithy.api#xmlName\": \"status\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#MoveByoipCidrToIpam\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#MoveByoipCidrToIpamRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#MoveByoipCidrToIpamResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Move a BYOIPv4 CIDR to IPAM from a public IPv4 pool.</p>\\n         <p>If you already have a BYOIPv4 CIDR with Amazon Web Services, you can move the CIDR to IPAM from a public IPv4 pool. You cannot move an IPv6 CIDR to IPAM. If you are bringing a new IP address to Amazon Web Services for the first time, complete the steps in <a href=\\\"https://docs.aws.amazon.com/vpc/latest/ipam/tutorials-byoip-ipam.html\\\">Tutorial: BYOIP address CIDRs to IPAM</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#MoveByoipCidrToIpamRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A check for whether you have the required permissions for the action without actually making the request \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"Cidr\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The BYOIP CIDR.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"IpamPoolId\": {\n                    \"target\": \"com.amazonaws.ec2#IpamPoolId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The IPAM pool ID.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"IpamPoolOwner\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID of the owner of the IPAM pool.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#MoveByoipCidrToIpamResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ByoipCidr\": {\n                    \"target\": \"com.amazonaws.ec2#ByoipCidr\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ByoipCidr\",\n                        \"smithy.api#documentation\": \"<p>The BYOIP CIDR.</p>\",\n                        \"smithy.api#xmlName\": \"byoipCidr\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#MoveCapacityReservationInstances\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#MoveCapacityReservationInstancesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#MoveCapacityReservationInstancesResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Move available capacity from a source Capacity Reservation to a destination Capacity\\n\\t\\t\\tReservation. The source Capacity Reservation and the destination Capacity Reservation\\n\\t\\t\\tmust be <code>active</code>, owned by your Amazon Web Services account, and share the following: </p>\\n         <ul>\\n            <li>\\n               <p>Instance type</p>\\n            </li>\\n            <li>\\n               <p>Platform</p>\\n            </li>\\n            <li>\\n               <p>Availability Zone</p>\\n            </li>\\n            <li>\\n               <p>Tenancy</p>\\n            </li>\\n            <li>\\n               <p>Placement group</p>\\n            </li>\\n            <li>\\n               <p>Capacity Reservation end time - <code>At specific time</code> or\\n\\t\\t\\t\\t\\t\\t<code>Manually</code>.</p>\\n            </li>\\n         </ul>\"\n            }\n        },\n        \"com.amazonaws.ec2#MoveCapacityReservationInstancesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Unique, case-sensitive identifier that you provide to ensure the idempotency of the request. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Run_Instance_Idempotency.html\\\">Ensure Idempotency</a>.</p>\",\n                        \"smithy.api#idempotencyToken\": {}\n                    }\n                },\n                \"SourceCapacityReservationId\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityReservationId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p> The ID of the Capacity Reservation from which you want to move capacity. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DestinationCapacityReservationId\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityReservationId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p> The ID of the Capacity Reservation that you want to move capacity into. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"InstanceCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The number of instances that you want to move from the source Capacity Reservation.\\n\\t\\t</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#MoveCapacityReservationInstancesResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SourceCapacityReservation\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityReservation\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SourceCapacityReservation\",\n                        \"smithy.api#documentation\": \"<p> Information about the source Capacity Reservation. </p>\",\n                        \"smithy.api#xmlName\": \"sourceCapacityReservation\"\n                    }\n                },\n                \"DestinationCapacityReservation\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityReservation\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DestinationCapacityReservation\",\n                        \"smithy.api#documentation\": \"<p> Information about the destination Capacity Reservation. </p>\",\n                        \"smithy.api#xmlName\": \"destinationCapacityReservation\"\n                    }\n                },\n                \"InstanceCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceCount\",\n                        \"smithy.api#documentation\": \"<p> The number of instances that were moved from the source Capacity Reservation to the\\n\\t\\t\\tdestination Capacity Reservation. </p>\",\n                        \"smithy.api#xmlName\": \"instanceCount\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#MoveStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"movingToVpc\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"movingToVpc\"\n                    }\n                },\n                \"restoringToClassic\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"restoringToClassic\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#MovingAddressStatus\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"MoveStatus\": {\n                    \"target\": \"com.amazonaws.ec2#MoveStatus\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MoveStatus\",\n                        \"smithy.api#documentation\": \"<p>The status of the Elastic IP address that's being moved or restored.</p>\",\n                        \"smithy.api#xmlName\": \"moveStatus\"\n                    }\n                },\n                \"PublicIp\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PublicIp\",\n                        \"smithy.api#documentation\": \"<p>The Elastic IP address.</p>\",\n                        \"smithy.api#xmlName\": \"publicIp\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>This action is deprecated.</p>\\n         </note>\\n         <p>Describes the status of a moving Elastic IP address.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#MovingAddressStatusSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#MovingAddressStatus\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#MulticastSupportValue\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"enable\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"enable\"\n                    }\n                },\n                \"disable\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"disable\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#NatGateway\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CreateTime\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CreateTime\",\n                        \"smithy.api#documentation\": \"<p>The date and time the NAT gateway was created.</p>\",\n                        \"smithy.api#xmlName\": \"createTime\"\n                    }\n                },\n                \"DeleteTime\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DeleteTime\",\n                        \"smithy.api#documentation\": \"<p>The date and time the NAT gateway was deleted, if applicable.</p>\",\n                        \"smithy.api#xmlName\": \"deleteTime\"\n                    }\n                },\n                \"FailureCode\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"FailureCode\",\n                        \"smithy.api#documentation\": \"<p>If the NAT gateway could not be created, specifies the error code for the failure.\\n        (<code>InsufficientFreeAddressesInSubnet</code> | <code>Gateway.NotAttached</code> |\\n         <code>InvalidAllocationID.NotFound</code> | <code>Resource.AlreadyAssociated</code> |\\n         <code>InternalError</code> | <code>InvalidSubnetID.NotFound</code>)</p>\",\n                        \"smithy.api#xmlName\": \"failureCode\"\n                    }\n                },\n                \"FailureMessage\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"FailureMessage\",\n                        \"smithy.api#documentation\": \"<p>If the NAT gateway could not be created, specifies the error message for the failure, that corresponds to the error code.</p>\\n         <ul>\\n            <li>\\n               <p>For InsufficientFreeAddressesInSubnet: \\\"Subnet has insufficient free addresses to create this NAT gateway\\\"</p>\\n            </li>\\n            <li>\\n               <p>For Gateway.NotAttached: \\\"Network vpc-xxxxxxxx has no Internet gateway attached\\\"</p>\\n            </li>\\n            <li>\\n               <p>For InvalidAllocationID.NotFound: \\\"Elastic IP address eipalloc-xxxxxxxx could not be associated with this NAT gateway\\\"</p>\\n            </li>\\n            <li>\\n               <p>For Resource.AlreadyAssociated: \\\"Elastic IP address eipalloc-xxxxxxxx is already associated\\\"</p>\\n            </li>\\n            <li>\\n               <p>For InternalError: \\\"Network interface eni-xxxxxxxx, created and used internally by this NAT gateway is in an invalid state. Please try again.\\\"</p>\\n            </li>\\n            <li>\\n               <p>For InvalidSubnetID.NotFound: \\\"The specified subnet subnet-xxxxxxxx does not exist or could not be found.\\\"</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"failureMessage\"\n                    }\n                },\n                \"NatGatewayAddresses\": {\n                    \"target\": \"com.amazonaws.ec2#NatGatewayAddressList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NatGatewayAddressSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the IP addresses and network interface associated with the NAT gateway.</p>\",\n                        \"smithy.api#xmlName\": \"natGatewayAddressSet\"\n                    }\n                },\n                \"NatGatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NatGatewayId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the NAT gateway.</p>\",\n                        \"smithy.api#xmlName\": \"natGatewayId\"\n                    }\n                },\n                \"ProvisionedBandwidth\": {\n                    \"target\": \"com.amazonaws.ec2#ProvisionedBandwidth\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ProvisionedBandwidth\",\n                        \"smithy.api#documentation\": \"<p>Reserved. If you need to sustain traffic greater than the <a href=\\\"https://docs.aws.amazon.com/vpc/latest/userguide/amazon-vpc-limits.html#vpc-limits-gateways\\\">documented limits</a>, \\n          contact Amazon Web Services Support.</p>\",\n                        \"smithy.api#xmlName\": \"provisionedBandwidth\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#NatGatewayState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The state of the NAT gateway.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>pending</code>: The NAT gateway is being created and is not ready to process\\n          traffic.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>failed</code>: The NAT gateway could not be created. Check the\\n            <code>failureCode</code> and <code>failureMessage</code> fields for the reason.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>available</code>: The NAT gateway is able to process traffic. This status remains\\n          until you delete the NAT gateway, and does not indicate the health of the NAT gateway.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>deleting</code>: The NAT gateway is in the process of being terminated and may\\n          still be processing traffic.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>deleted</code>: The NAT gateway has been terminated and is no longer processing\\n          traffic.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                },\n                \"SubnetId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SubnetId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the subnet in which the NAT gateway is located.</p>\",\n                        \"smithy.api#xmlName\": \"subnetId\"\n                    }\n                },\n                \"VpcId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the VPC in which the NAT gateway is located.</p>\",\n                        \"smithy.api#xmlName\": \"vpcId\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>The tags for the NAT gateway.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                },\n                \"ConnectivityType\": {\n                    \"target\": \"com.amazonaws.ec2#ConnectivityType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ConnectivityType\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether the NAT gateway supports public or private connectivity.</p>\",\n                        \"smithy.api#xmlName\": \"connectivityType\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a NAT gateway.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#NatGatewayAddress\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AllocationId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AllocationId\",\n                        \"smithy.api#documentation\": \"<p>[Public NAT gateway only] The allocation ID of the Elastic IP address that's associated with the NAT gateway.</p>\",\n                        \"smithy.api#xmlName\": \"allocationId\"\n                    }\n                },\n                \"NetworkInterfaceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkInterfaceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the network interface associated with the NAT gateway.</p>\",\n                        \"smithy.api#xmlName\": \"networkInterfaceId\"\n                    }\n                },\n                \"PrivateIp\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PrivateIp\",\n                        \"smithy.api#documentation\": \"<p>The private IP address associated with the NAT gateway.</p>\",\n                        \"smithy.api#xmlName\": \"privateIp\"\n                    }\n                },\n                \"PublicIp\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PublicIp\",\n                        \"smithy.api#documentation\": \"<p>[Public NAT gateway only] The Elastic IP address associated with the NAT gateway.</p>\",\n                        \"smithy.api#xmlName\": \"publicIp\"\n                    }\n                },\n                \"AssociationId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AssociationId\",\n                        \"smithy.api#documentation\": \"<p>[Public NAT gateway only] The association ID of the Elastic IP address that's associated with the NAT gateway.</p>\",\n                        \"smithy.api#xmlName\": \"associationId\"\n                    }\n                },\n                \"IsPrimary\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IsPrimary\",\n                        \"smithy.api#documentation\": \"<p>Defines if the IP address is the primary address.</p>\",\n                        \"smithy.api#xmlName\": \"isPrimary\"\n                    }\n                },\n                \"FailureMessage\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"FailureMessage\",\n                        \"smithy.api#documentation\": \"<p>The address failure message.</p>\",\n                        \"smithy.api#xmlName\": \"failureMessage\"\n                    }\n                },\n                \"Status\": {\n                    \"target\": \"com.amazonaws.ec2#NatGatewayAddressStatus\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Status\",\n                        \"smithy.api#documentation\": \"<p>The address status.</p>\",\n                        \"smithy.api#xmlName\": \"status\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the IP addresses and network interface associated with a NAT gateway.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#NatGatewayAddressList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#NatGatewayAddress\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#NatGatewayAddressStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ASSIGNING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"assigning\"\n                    }\n                },\n                \"UNASSIGNING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"unassigning\"\n                    }\n                },\n                \"ASSOCIATING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"associating\"\n                    }\n                },\n                \"DISASSOCIATING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"disassociating\"\n                    }\n                },\n                \"SUCCEEDED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"succeeded\"\n                    }\n                },\n                \"FAILED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"failed\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#NatGatewayId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#NatGatewayIdStringList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#NatGatewayId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#NatGatewayList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#NatGateway\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#NatGatewayState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"PENDING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"pending\"\n                    }\n                },\n                \"FAILED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"failed\"\n                    }\n                },\n                \"AVAILABLE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"available\"\n                    }\n                },\n                \"DELETING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"deleting\"\n                    }\n                },\n                \"DELETED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"deleted\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#NativeApplicationOidcOptions\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PublicSigningKeyEndpoint\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PublicSigningKeyEndpoint\",\n                        \"smithy.api#documentation\": \"<p>The public signing key endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"publicSigningKeyEndpoint\"\n                    }\n                },\n                \"Issuer\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Issuer\",\n                        \"smithy.api#documentation\": \"<p>The OIDC issuer identifier of the IdP.</p>\",\n                        \"smithy.api#xmlName\": \"issuer\"\n                    }\n                },\n                \"AuthorizationEndpoint\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AuthorizationEndpoint\",\n                        \"smithy.api#documentation\": \"<p>The authorization endpoint of the IdP.</p>\",\n                        \"smithy.api#xmlName\": \"authorizationEndpoint\"\n                    }\n                },\n                \"TokenEndpoint\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TokenEndpoint\",\n                        \"smithy.api#documentation\": \"<p>The token endpoint of the IdP.</p>\",\n                        \"smithy.api#xmlName\": \"tokenEndpoint\"\n                    }\n                },\n                \"UserInfoEndpoint\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"UserInfoEndpoint\",\n                        \"smithy.api#documentation\": \"<p>The user info endpoint of the IdP.</p>\",\n                        \"smithy.api#xmlName\": \"userInfoEndpoint\"\n                    }\n                },\n                \"ClientId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ClientId\",\n                        \"smithy.api#documentation\": \"<p>The OAuth 2.0 client identifier.</p>\",\n                        \"smithy.api#xmlName\": \"clientId\"\n                    }\n                },\n                \"Scope\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Scope\",\n                        \"smithy.api#documentation\": \"<p>The set of user claims to be requested from the IdP.</p>\",\n                        \"smithy.api#xmlName\": \"scope\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the OpenID Connect (OIDC) options.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#NetmaskLength\": {\n            \"type\": \"integer\"\n        },\n        \"com.amazonaws.ec2#NetworkAcl\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Associations\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkAclAssociationList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AssociationSet\",\n                        \"smithy.api#documentation\": \"<p>Any associations between the network ACL and your subnets</p>\",\n                        \"smithy.api#xmlName\": \"associationSet\"\n                    }\n                },\n                \"Entries\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkAclEntryList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EntrySet\",\n                        \"smithy.api#documentation\": \"<p>The entries (rules) in the network ACL.</p>\",\n                        \"smithy.api#xmlName\": \"entrySet\"\n                    }\n                },\n                \"IsDefault\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Default\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether this is the default network ACL for the VPC.</p>\",\n                        \"smithy.api#xmlName\": \"default\"\n                    }\n                },\n                \"NetworkAclId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkAclId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the network ACL.</p>\",\n                        \"smithy.api#xmlName\": \"networkAclId\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>Any tags assigned to the network ACL.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                },\n                \"VpcId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the VPC for the network ACL.</p>\",\n                        \"smithy.api#xmlName\": \"vpcId\"\n                    }\n                },\n                \"OwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OwnerId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Amazon Web Services account that owns the network ACL.</p>\",\n                        \"smithy.api#xmlName\": \"ownerId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a network ACL.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#NetworkAclAssociation\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NetworkAclAssociationId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkAclAssociationId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the association between a network ACL and a subnet.</p>\",\n                        \"smithy.api#xmlName\": \"networkAclAssociationId\"\n                    }\n                },\n                \"NetworkAclId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkAclId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the network ACL.</p>\",\n                        \"smithy.api#xmlName\": \"networkAclId\"\n                    }\n                },\n                \"SubnetId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SubnetId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the subnet.</p>\",\n                        \"smithy.api#xmlName\": \"subnetId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes an association between a network ACL and a subnet.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#NetworkAclAssociationId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#NetworkAclAssociationList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#NetworkAclAssociation\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#NetworkAclEntry\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CidrBlock\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CidrBlock\",\n                        \"smithy.api#documentation\": \"<p>The IPv4 network range to allow or deny, in CIDR notation.</p>\",\n                        \"smithy.api#xmlName\": \"cidrBlock\"\n                    }\n                },\n                \"Egress\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Egress\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether the rule is an egress rule (applied to traffic leaving the subnet).</p>\",\n                        \"smithy.api#xmlName\": \"egress\"\n                    }\n                },\n                \"IcmpTypeCode\": {\n                    \"target\": \"com.amazonaws.ec2#IcmpTypeCode\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IcmpTypeCode\",\n                        \"smithy.api#documentation\": \"<p>ICMP protocol: The ICMP type and code.</p>\",\n                        \"smithy.api#xmlName\": \"icmpTypeCode\"\n                    }\n                },\n                \"Ipv6CidrBlock\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Ipv6CidrBlock\",\n                        \"smithy.api#documentation\": \"<p>The IPv6 network range to allow or deny, in CIDR notation.</p>\",\n                        \"smithy.api#xmlName\": \"ipv6CidrBlock\"\n                    }\n                },\n                \"PortRange\": {\n                    \"target\": \"com.amazonaws.ec2#PortRange\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PortRange\",\n                        \"smithy.api#documentation\": \"<p>TCP or UDP protocols: The range of ports the rule applies to.</p>\",\n                        \"smithy.api#xmlName\": \"portRange\"\n                    }\n                },\n                \"Protocol\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Protocol\",\n                        \"smithy.api#documentation\": \"<p>The protocol number. A value of \\\"-1\\\" means all protocols.</p>\",\n                        \"smithy.api#xmlName\": \"protocol\"\n                    }\n                },\n                \"RuleAction\": {\n                    \"target\": \"com.amazonaws.ec2#RuleAction\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RuleAction\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether to allow or deny the traffic that matches the rule.</p>\",\n                        \"smithy.api#xmlName\": \"ruleAction\"\n                    }\n                },\n                \"RuleNumber\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RuleNumber\",\n                        \"smithy.api#documentation\": \"<p>The rule number for the entry. ACL entries are processed in ascending order by rule number.</p>\",\n                        \"smithy.api#xmlName\": \"ruleNumber\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes an entry in a network ACL.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#NetworkAclEntryList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#NetworkAclEntry\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#NetworkAclId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#NetworkAclIdStringList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#NetworkAclId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#NetworkAclList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#NetworkAcl\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#NetworkBandwidthGbps\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Min\": {\n                    \"target\": \"com.amazonaws.ec2#Double\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Min\",\n                        \"smithy.api#documentation\": \"<p>The minimum amount of network bandwidth, in Gbps. If this parameter is not specified, there is no minimum\\n         limit.</p>\",\n                        \"smithy.api#xmlName\": \"min\"\n                    }\n                },\n                \"Max\": {\n                    \"target\": \"com.amazonaws.ec2#Double\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Max\",\n                        \"smithy.api#documentation\": \"<p>The maximum amount of network bandwidth, in Gbps. If this parameter is not specified, there is no\\n         maximum limit.</p>\",\n                        \"smithy.api#xmlName\": \"max\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The minimum and maximum amount of network bandwidth, in gigabits per second (Gbps).</p>\\n         <note>\\n            <p>Setting the minimum bandwidth does not guarantee that your instance will achieve the \\n            minimum bandwidth. Amazon EC2 will identify instance types that support the specified minimum \\n            bandwidth, but the actual bandwidth of your instance might go below the specified minimum \\n            at times. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-network-bandwidth.html#available-instance-bandwidth\\\">Available instance bandwidth</a> in the\\n            <i>Amazon EC2 User Guide</i>.</p>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.ec2#NetworkBandwidthGbpsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Min\": {\n                    \"target\": \"com.amazonaws.ec2#Double\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The minimum amount of network bandwidth, in Gbps. To specify no minimum limit, omit this\\n         parameter.</p>\"\n                    }\n                },\n                \"Max\": {\n                    \"target\": \"com.amazonaws.ec2#Double\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum amount of network bandwidth, in Gbps. To specify no maximum limit, omit this\\n         parameter.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The minimum and maximum amount of network bandwidth, in gigabits per second (Gbps).</p>\\n         <note>\\n            <p>Setting the minimum bandwidth does not guarantee that your instance will achieve the \\n            minimum bandwidth. Amazon EC2 will identify instance types that support the specified minimum \\n            bandwidth, but the actual bandwidth of your instance might go below the specified minimum \\n            at times. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-network-bandwidth.html#available-instance-bandwidth\\\">Available instance bandwidth</a> in the\\n            <i>Amazon EC2 User Guide</i>.</p>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.ec2#NetworkCardIndex\": {\n            \"type\": \"integer\"\n        },\n        \"com.amazonaws.ec2#NetworkCardInfo\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NetworkCardIndex\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkCardIndex\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkCardIndex\",\n                        \"smithy.api#documentation\": \"<p>The index of the network card.</p>\",\n                        \"smithy.api#xmlName\": \"networkCardIndex\"\n                    }\n                },\n                \"NetworkPerformance\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkPerformance\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkPerformance\",\n                        \"smithy.api#documentation\": \"<p>The network performance of the network card.</p>\",\n                        \"smithy.api#xmlName\": \"networkPerformance\"\n                    }\n                },\n                \"MaximumNetworkInterfaces\": {\n                    \"target\": \"com.amazonaws.ec2#MaxNetworkInterfaces\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MaximumNetworkInterfaces\",\n                        \"smithy.api#documentation\": \"<p>The maximum number of network interfaces for the network card.</p>\",\n                        \"smithy.api#xmlName\": \"maximumNetworkInterfaces\"\n                    }\n                },\n                \"BaselineBandwidthInGbps\": {\n                    \"target\": \"com.amazonaws.ec2#BaselineBandwidthInGbps\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"BaselineBandwidthInGbps\",\n                        \"smithy.api#documentation\": \"<p>The baseline network performance of the network card, in Gbps.</p>\",\n                        \"smithy.api#xmlName\": \"baselineBandwidthInGbps\"\n                    }\n                },\n                \"PeakBandwidthInGbps\": {\n                    \"target\": \"com.amazonaws.ec2#PeakBandwidthInGbps\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PeakBandwidthInGbps\",\n                        \"smithy.api#documentation\": \"<p>The peak (burst) network performance of the network card, in Gbps.</p>\",\n                        \"smithy.api#xmlName\": \"peakBandwidthInGbps\"\n                    }\n                },\n                \"DefaultEnaQueueCountPerInterface\": {\n                    \"target\": \"com.amazonaws.ec2#DefaultEnaQueueCountPerInterface\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DefaultEnaQueueCountPerInterface\",\n                        \"smithy.api#documentation\": \"<p>The default number of the ENA queues for each interface.</p>\",\n                        \"smithy.api#xmlName\": \"defaultEnaQueueCountPerInterface\"\n                    }\n                },\n                \"MaximumEnaQueueCount\": {\n                    \"target\": \"com.amazonaws.ec2#MaximumEnaQueueCount\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MaximumEnaQueueCount\",\n                        \"smithy.api#documentation\": \"<p>The maximum number of the ENA queues.</p>\",\n                        \"smithy.api#xmlName\": \"maximumEnaQueueCount\"\n                    }\n                },\n                \"MaximumEnaQueueCountPerInterface\": {\n                    \"target\": \"com.amazonaws.ec2#MaximumEnaQueueCountPerInterface\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MaximumEnaQueueCountPerInterface\",\n                        \"smithy.api#documentation\": \"<p>The maximum number of the ENA queues for each interface.</p>\",\n                        \"smithy.api#xmlName\": \"maximumEnaQueueCountPerInterface\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the network card support of the instance type.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#NetworkCardInfoList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#NetworkCardInfo\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#NetworkInfo\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NetworkPerformance\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkPerformance\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkPerformance\",\n                        \"smithy.api#documentation\": \"<p>The network performance.</p>\",\n                        \"smithy.api#xmlName\": \"networkPerformance\"\n                    }\n                },\n                \"MaximumNetworkInterfaces\": {\n                    \"target\": \"com.amazonaws.ec2#MaxNetworkInterfaces\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MaximumNetworkInterfaces\",\n                        \"smithy.api#documentation\": \"<p>The maximum number of network interfaces for the instance type.</p>\",\n                        \"smithy.api#xmlName\": \"maximumNetworkInterfaces\"\n                    }\n                },\n                \"MaximumNetworkCards\": {\n                    \"target\": \"com.amazonaws.ec2#MaximumNetworkCards\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MaximumNetworkCards\",\n                        \"smithy.api#documentation\": \"<p>The maximum number of physical network cards that can be allocated to the instance.</p>\",\n                        \"smithy.api#xmlName\": \"maximumNetworkCards\"\n                    }\n                },\n                \"DefaultNetworkCardIndex\": {\n                    \"target\": \"com.amazonaws.ec2#DefaultNetworkCardIndex\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DefaultNetworkCardIndex\",\n                        \"smithy.api#documentation\": \"<p>The index of the default network card, starting at 0.</p>\",\n                        \"smithy.api#xmlName\": \"defaultNetworkCardIndex\"\n                    }\n                },\n                \"NetworkCards\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkCardInfoList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkCards\",\n                        \"smithy.api#documentation\": \"<p>Describes the network cards for the instance type.</p>\",\n                        \"smithy.api#xmlName\": \"networkCards\"\n                    }\n                },\n                \"Ipv4AddressesPerInterface\": {\n                    \"target\": \"com.amazonaws.ec2#MaxIpv4AddrPerInterface\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Ipv4AddressesPerInterface\",\n                        \"smithy.api#documentation\": \"<p>The maximum number of IPv4 addresses per network interface.</p>\",\n                        \"smithy.api#xmlName\": \"ipv4AddressesPerInterface\"\n                    }\n                },\n                \"Ipv6AddressesPerInterface\": {\n                    \"target\": \"com.amazonaws.ec2#MaxIpv6AddrPerInterface\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Ipv6AddressesPerInterface\",\n                        \"smithy.api#documentation\": \"<p>The maximum number of IPv6 addresses per network interface.</p>\",\n                        \"smithy.api#xmlName\": \"ipv6AddressesPerInterface\"\n                    }\n                },\n                \"Ipv6Supported\": {\n                    \"target\": \"com.amazonaws.ec2#Ipv6Flag\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Ipv6Supported\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether IPv6 is supported.</p>\",\n                        \"smithy.api#xmlName\": \"ipv6Supported\"\n                    }\n                },\n                \"EnaSupport\": {\n                    \"target\": \"com.amazonaws.ec2#EnaSupport\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EnaSupport\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether Elastic Network Adapter (ENA) is supported.</p>\",\n                        \"smithy.api#xmlName\": \"enaSupport\"\n                    }\n                },\n                \"EfaSupported\": {\n                    \"target\": \"com.amazonaws.ec2#EfaSupportedFlag\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EfaSupported\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether Elastic Fabric Adapter (EFA) is supported.</p>\",\n                        \"smithy.api#xmlName\": \"efaSupported\"\n                    }\n                },\n                \"EfaInfo\": {\n                    \"target\": \"com.amazonaws.ec2#EfaInfo\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EfaInfo\",\n                        \"smithy.api#documentation\": \"<p>Describes the Elastic Fabric Adapters for the instance type.</p>\",\n                        \"smithy.api#xmlName\": \"efaInfo\"\n                    }\n                },\n                \"EncryptionInTransitSupported\": {\n                    \"target\": \"com.amazonaws.ec2#EncryptionInTransitSupported\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EncryptionInTransitSupported\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether the instance type automatically encrypts in-transit traffic between\\n   instances.</p>\",\n                        \"smithy.api#xmlName\": \"encryptionInTransitSupported\"\n                    }\n                },\n                \"EnaSrdSupported\": {\n                    \"target\": \"com.amazonaws.ec2#EnaSrdSupported\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EnaSrdSupported\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether the instance type supports ENA Express. ENA Express uses Amazon Web Services Scalable Reliable Datagram (SRD) technology to increase the maximum bandwidth used per stream\\n   and minimize tail latency of network traffic between EC2 instances.</p>\",\n                        \"smithy.api#xmlName\": \"enaSrdSupported\"\n                    }\n                },\n                \"BandwidthWeightings\": {\n                    \"target\": \"com.amazonaws.ec2#BandwidthWeightingTypeList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"BandwidthWeightings\",\n                        \"smithy.api#documentation\": \"<p>A list of valid settings for configurable bandwidth weighting for the instance type, if\\n   supported.</p>\",\n                        \"smithy.api#xmlName\": \"bandwidthWeightings\"\n                    }\n                },\n                \"FlexibleEnaQueuesSupport\": {\n                    \"target\": \"com.amazonaws.ec2#FlexibleEnaQueuesSupport\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"FlexibleEnaQueuesSupport\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether changing the number of ENA queues is supported.</p>\",\n                        \"smithy.api#xmlName\": \"flexibleEnaQueuesSupport\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the networking features of the instance type.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#NetworkInsightsAccessScope\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NetworkInsightsAccessScopeId\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInsightsAccessScopeId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkInsightsAccessScopeId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Network Access Scope.</p>\",\n                        \"smithy.api#xmlName\": \"networkInsightsAccessScopeId\"\n                    }\n                },\n                \"NetworkInsightsAccessScopeArn\": {\n                    \"target\": \"com.amazonaws.ec2#ResourceArn\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkInsightsAccessScopeArn\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the Network Access Scope.</p>\",\n                        \"smithy.api#xmlName\": \"networkInsightsAccessScopeArn\"\n                    }\n                },\n                \"CreatedDate\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CreatedDate\",\n                        \"smithy.api#documentation\": \"<p>The creation date.</p>\",\n                        \"smithy.api#xmlName\": \"createdDate\"\n                    }\n                },\n                \"UpdatedDate\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"UpdatedDate\",\n                        \"smithy.api#documentation\": \"<p>The last updated date.</p>\",\n                        \"smithy.api#xmlName\": \"updatedDate\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>The tags.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a Network Access Scope.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#NetworkInsightsAccessScopeAnalysis\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NetworkInsightsAccessScopeAnalysisId\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInsightsAccessScopeAnalysisId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkInsightsAccessScopeAnalysisId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Network Access Scope analysis.</p>\",\n                        \"smithy.api#xmlName\": \"networkInsightsAccessScopeAnalysisId\"\n                    }\n                },\n                \"NetworkInsightsAccessScopeAnalysisArn\": {\n                    \"target\": \"com.amazonaws.ec2#ResourceArn\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkInsightsAccessScopeAnalysisArn\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the Network Access Scope analysis.</p>\",\n                        \"smithy.api#xmlName\": \"networkInsightsAccessScopeAnalysisArn\"\n                    }\n                },\n                \"NetworkInsightsAccessScopeId\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInsightsAccessScopeId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkInsightsAccessScopeId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Network Access Scope.</p>\",\n                        \"smithy.api#xmlName\": \"networkInsightsAccessScopeId\"\n                    }\n                },\n                \"Status\": {\n                    \"target\": \"com.amazonaws.ec2#AnalysisStatus\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Status\",\n                        \"smithy.api#documentation\": \"<p>The status.</p>\",\n                        \"smithy.api#xmlName\": \"status\"\n                    }\n                },\n                \"StatusMessage\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"StatusMessage\",\n                        \"smithy.api#documentation\": \"<p>The status message.</p>\",\n                        \"smithy.api#xmlName\": \"statusMessage\"\n                    }\n                },\n                \"WarningMessage\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"WarningMessage\",\n                        \"smithy.api#documentation\": \"<p>The warning message.</p>\",\n                        \"smithy.api#xmlName\": \"warningMessage\"\n                    }\n                },\n                \"StartDate\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"StartDate\",\n                        \"smithy.api#documentation\": \"<p>The analysis start date.</p>\",\n                        \"smithy.api#xmlName\": \"startDate\"\n                    }\n                },\n                \"EndDate\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EndDate\",\n                        \"smithy.api#documentation\": \"<p>The analysis end date.</p>\",\n                        \"smithy.api#xmlName\": \"endDate\"\n                    }\n                },\n                \"FindingsFound\": {\n                    \"target\": \"com.amazonaws.ec2#FindingsFound\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"FindingsFound\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether there are findings.</p>\",\n                        \"smithy.api#xmlName\": \"findingsFound\"\n                    }\n                },\n                \"AnalyzedEniCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AnalyzedEniCount\",\n                        \"smithy.api#documentation\": \"<p>The number of network interfaces analyzed.</p>\",\n                        \"smithy.api#xmlName\": \"analyzedEniCount\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>The tags.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a Network Access Scope analysis.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#NetworkInsightsAccessScopeAnalysisId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#NetworkInsightsAccessScopeAnalysisIdList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#NetworkInsightsAccessScopeAnalysisId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#NetworkInsightsAccessScopeAnalysisList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#NetworkInsightsAccessScopeAnalysis\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#NetworkInsightsAccessScopeContent\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NetworkInsightsAccessScopeId\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInsightsAccessScopeId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkInsightsAccessScopeId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Network Access Scope.</p>\",\n                        \"smithy.api#xmlName\": \"networkInsightsAccessScopeId\"\n                    }\n                },\n                \"MatchPaths\": {\n                    \"target\": \"com.amazonaws.ec2#AccessScopePathList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MatchPathSet\",\n                        \"smithy.api#documentation\": \"<p>The paths to match.</p>\",\n                        \"smithy.api#xmlName\": \"matchPathSet\"\n                    }\n                },\n                \"ExcludePaths\": {\n                    \"target\": \"com.amazonaws.ec2#AccessScopePathList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ExcludePathSet\",\n                        \"smithy.api#documentation\": \"<p>The paths to exclude.</p>\",\n                        \"smithy.api#xmlName\": \"excludePathSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the Network Access Scope content.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#NetworkInsightsAccessScopeId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#NetworkInsightsAccessScopeIdList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#NetworkInsightsAccessScopeId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#NetworkInsightsAccessScopeList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#NetworkInsightsAccessScope\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#NetworkInsightsAnalysis\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NetworkInsightsAnalysisId\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInsightsAnalysisId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkInsightsAnalysisId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the network insights analysis.</p>\",\n                        \"smithy.api#xmlName\": \"networkInsightsAnalysisId\"\n                    }\n                },\n                \"NetworkInsightsAnalysisArn\": {\n                    \"target\": \"com.amazonaws.ec2#ResourceArn\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkInsightsAnalysisArn\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the network insights analysis.</p>\",\n                        \"smithy.api#xmlName\": \"networkInsightsAnalysisArn\"\n                    }\n                },\n                \"NetworkInsightsPathId\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInsightsPathId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkInsightsPathId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the path.</p>\",\n                        \"smithy.api#xmlName\": \"networkInsightsPathId\"\n                    }\n                },\n                \"AdditionalAccounts\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AdditionalAccountSet\",\n                        \"smithy.api#documentation\": \"<p>The member accounts that contain resources that the path can traverse.</p>\",\n                        \"smithy.api#xmlName\": \"additionalAccountSet\"\n                    }\n                },\n                \"FilterInArns\": {\n                    \"target\": \"com.amazonaws.ec2#ArnList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"FilterInArnSet\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Names (ARN) of the resources that the path must traverse.</p>\",\n                        \"smithy.api#xmlName\": \"filterInArnSet\"\n                    }\n                },\n                \"FilterOutArns\": {\n                    \"target\": \"com.amazonaws.ec2#ArnList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"FilterOutArnSet\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Names (ARN) of the resources that the path must ignore.</p>\",\n                        \"smithy.api#xmlName\": \"filterOutArnSet\"\n                    }\n                },\n                \"StartDate\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"StartDate\",\n                        \"smithy.api#documentation\": \"<p>The time the analysis started.</p>\",\n                        \"smithy.api#xmlName\": \"startDate\"\n                    }\n                },\n                \"Status\": {\n                    \"target\": \"com.amazonaws.ec2#AnalysisStatus\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Status\",\n                        \"smithy.api#documentation\": \"<p>The status of the network insights analysis.</p>\",\n                        \"smithy.api#xmlName\": \"status\"\n                    }\n                },\n                \"StatusMessage\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"StatusMessage\",\n                        \"smithy.api#documentation\": \"<p>The status message, if the status is <code>failed</code>.</p>\",\n                        \"smithy.api#xmlName\": \"statusMessage\"\n                    }\n                },\n                \"WarningMessage\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"WarningMessage\",\n                        \"smithy.api#documentation\": \"<p>The warning message.</p>\",\n                        \"smithy.api#xmlName\": \"warningMessage\"\n                    }\n                },\n                \"NetworkPathFound\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkPathFound\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether the destination is reachable from the source.</p>\",\n                        \"smithy.api#xmlName\": \"networkPathFound\"\n                    }\n                },\n                \"ForwardPathComponents\": {\n                    \"target\": \"com.amazonaws.ec2#PathComponentList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ForwardPathComponentSet\",\n                        \"smithy.api#documentation\": \"<p>The components in the path from source to destination.</p>\",\n                        \"smithy.api#xmlName\": \"forwardPathComponentSet\"\n                    }\n                },\n                \"ReturnPathComponents\": {\n                    \"target\": \"com.amazonaws.ec2#PathComponentList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ReturnPathComponentSet\",\n                        \"smithy.api#documentation\": \"<p>The components in the path from destination to source.</p>\",\n                        \"smithy.api#xmlName\": \"returnPathComponentSet\"\n                    }\n                },\n                \"Explanations\": {\n                    \"target\": \"com.amazonaws.ec2#ExplanationList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ExplanationSet\",\n                        \"smithy.api#documentation\": \"<p>The explanations. For more information, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/reachability/explanation-codes.html\\\">Reachability Analyzer explanation codes</a>.</p>\",\n                        \"smithy.api#xmlName\": \"explanationSet\"\n                    }\n                },\n                \"AlternatePathHints\": {\n                    \"target\": \"com.amazonaws.ec2#AlternatePathHintList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AlternatePathHintSet\",\n                        \"smithy.api#documentation\": \"<p>Potential intermediate components.</p>\",\n                        \"smithy.api#xmlName\": \"alternatePathHintSet\"\n                    }\n                },\n                \"SuggestedAccounts\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SuggestedAccountSet\",\n                        \"smithy.api#documentation\": \"<p>Potential intermediate accounts.</p>\",\n                        \"smithy.api#xmlName\": \"suggestedAccountSet\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>The tags.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a network insights analysis.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#NetworkInsightsAnalysisId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#NetworkInsightsAnalysisIdList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#NetworkInsightsAnalysisId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#NetworkInsightsAnalysisList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#NetworkInsightsAnalysis\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#NetworkInsightsMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 100\n                }\n            }\n        },\n        \"com.amazonaws.ec2#NetworkInsightsPath\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NetworkInsightsPathId\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInsightsPathId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkInsightsPathId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the path.</p>\",\n                        \"smithy.api#xmlName\": \"networkInsightsPathId\"\n                    }\n                },\n                \"NetworkInsightsPathArn\": {\n                    \"target\": \"com.amazonaws.ec2#ResourceArn\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkInsightsPathArn\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the path.</p>\",\n                        \"smithy.api#xmlName\": \"networkInsightsPathArn\"\n                    }\n                },\n                \"CreatedDate\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CreatedDate\",\n                        \"smithy.api#documentation\": \"<p>The time stamp when the path was created.</p>\",\n                        \"smithy.api#xmlName\": \"createdDate\"\n                    }\n                },\n                \"Source\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Source\",\n                        \"smithy.api#documentation\": \"<p>The ID of the source.</p>\",\n                        \"smithy.api#xmlName\": \"source\"\n                    }\n                },\n                \"Destination\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Destination\",\n                        \"smithy.api#documentation\": \"<p>The ID of the destination.</p>\",\n                        \"smithy.api#xmlName\": \"destination\"\n                    }\n                },\n                \"SourceArn\": {\n                    \"target\": \"com.amazonaws.ec2#ResourceArn\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SourceArn\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the source.</p>\",\n                        \"smithy.api#xmlName\": \"sourceArn\"\n                    }\n                },\n                \"DestinationArn\": {\n                    \"target\": \"com.amazonaws.ec2#ResourceArn\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DestinationArn\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the destination.</p>\",\n                        \"smithy.api#xmlName\": \"destinationArn\"\n                    }\n                },\n                \"SourceIp\": {\n                    \"target\": \"com.amazonaws.ec2#IpAddress\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SourceIp\",\n                        \"smithy.api#documentation\": \"<p>The IP address of the source.</p>\",\n                        \"smithy.api#xmlName\": \"sourceIp\"\n                    }\n                },\n                \"DestinationIp\": {\n                    \"target\": \"com.amazonaws.ec2#IpAddress\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DestinationIp\",\n                        \"smithy.api#documentation\": \"<p>The IP address of the destination.</p>\",\n                        \"smithy.api#xmlName\": \"destinationIp\"\n                    }\n                },\n                \"Protocol\": {\n                    \"target\": \"com.amazonaws.ec2#Protocol\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Protocol\",\n                        \"smithy.api#documentation\": \"<p>The protocol.</p>\",\n                        \"smithy.api#xmlName\": \"protocol\"\n                    }\n                },\n                \"DestinationPort\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DestinationPort\",\n                        \"smithy.api#documentation\": \"<p>The destination port.</p>\",\n                        \"smithy.api#xmlName\": \"destinationPort\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>The tags associated with the path.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                },\n                \"FilterAtSource\": {\n                    \"target\": \"com.amazonaws.ec2#PathFilter\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"FilterAtSource\",\n                        \"smithy.api#documentation\": \"<p>Scopes the analysis to network paths that match specific filters at the source.</p>\",\n                        \"smithy.api#xmlName\": \"filterAtSource\"\n                    }\n                },\n                \"FilterAtDestination\": {\n                    \"target\": \"com.amazonaws.ec2#PathFilter\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"FilterAtDestination\",\n                        \"smithy.api#documentation\": \"<p>Scopes the analysis to network paths that match specific filters at the destination.</p>\",\n                        \"smithy.api#xmlName\": \"filterAtDestination\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a path.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#NetworkInsightsPathId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#NetworkInsightsPathIdList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#NetworkInsightsPathId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#NetworkInsightsPathList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#NetworkInsightsPath\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#NetworkInsightsResourceId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#NetworkInterface\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Association\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInterfaceAssociation\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Association\",\n                        \"smithy.api#documentation\": \"<p>The association information for an Elastic IP address (IPv4) associated with the\\n            network interface.</p>\",\n                        \"smithy.api#xmlName\": \"association\"\n                    }\n                },\n                \"Attachment\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInterfaceAttachment\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Attachment\",\n                        \"smithy.api#documentation\": \"<p>The network interface attachment.</p>\",\n                        \"smithy.api#xmlName\": \"attachment\"\n                    }\n                },\n                \"AvailabilityZone\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AvailabilityZone\",\n                        \"smithy.api#documentation\": \"<p>The Availability Zone.</p>\",\n                        \"smithy.api#xmlName\": \"availabilityZone\"\n                    }\n                },\n                \"ConnectionTrackingConfiguration\": {\n                    \"target\": \"com.amazonaws.ec2#ConnectionTrackingConfiguration\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ConnectionTrackingConfiguration\",\n                        \"smithy.api#documentation\": \"<p>A security group connection tracking configuration that enables you to set the timeout\\n            for connection tracking on an Elastic network interface. For more information, see\\n                <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/security-group-connection-tracking.html#connection-tracking-timeouts\\\">Connection tracking timeouts</a> in the\\n            <i>Amazon EC2 User Guide</i>.</p>\",\n                        \"smithy.api#xmlName\": \"connectionTrackingConfiguration\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Description\",\n                        \"smithy.api#documentation\": \"<p>A description.</p>\",\n                        \"smithy.api#xmlName\": \"description\"\n                    }\n                },\n                \"Groups\": {\n                    \"target\": \"com.amazonaws.ec2#GroupIdentifierList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"GroupSet\",\n                        \"smithy.api#documentation\": \"<p>Any security groups for the network interface.</p>\",\n                        \"smithy.api#xmlName\": \"groupSet\"\n                    }\n                },\n                \"InterfaceType\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInterfaceType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InterfaceType\",\n                        \"smithy.api#documentation\": \"<p>The type of network interface.</p>\",\n                        \"smithy.api#xmlName\": \"interfaceType\"\n                    }\n                },\n                \"Ipv6Addresses\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInterfaceIpv6AddressesList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Ipv6AddressesSet\",\n                        \"smithy.api#documentation\": \"<p>The IPv6 addresses associated with the network interface.</p>\",\n                        \"smithy.api#xmlName\": \"ipv6AddressesSet\"\n                    }\n                },\n                \"MacAddress\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MacAddress\",\n                        \"smithy.api#documentation\": \"<p>The MAC address.</p>\",\n                        \"smithy.api#xmlName\": \"macAddress\"\n                    }\n                },\n                \"NetworkInterfaceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkInterfaceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the network interface.</p>\",\n                        \"smithy.api#xmlName\": \"networkInterfaceId\"\n                    }\n                },\n                \"OutpostArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OutpostArn\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the Outpost.</p>\",\n                        \"smithy.api#xmlName\": \"outpostArn\"\n                    }\n                },\n                \"OwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OwnerId\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID of the owner of the network interface.</p>\",\n                        \"smithy.api#xmlName\": \"ownerId\"\n                    }\n                },\n                \"PrivateDnsName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PrivateDnsName\",\n                        \"smithy.api#documentation\": \"<p>The private hostname. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-naming.html\\\">EC2 instance hostnames, DNS names, and domains</a> in the <i>Amazon EC2 User Guide</i>.</p>\",\n                        \"smithy.api#xmlName\": \"privateDnsName\"\n                    }\n                },\n                \"PublicDnsName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PublicDnsName\",\n                        \"smithy.api#documentation\": \"<p>A public hostname. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-naming.html\\\">EC2 instance hostnames, DNS names, and domains</a> in the <i>Amazon EC2 User Guide</i>.</p>\",\n                        \"smithy.api#xmlName\": \"publicDnsName\"\n                    }\n                },\n                \"PublicIpDnsNameOptions\": {\n                    \"target\": \"com.amazonaws.ec2#PublicIpDnsNameOptions\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PublicIpDnsNameOptions\",\n                        \"smithy.api#documentation\": \"<p>Public hostname type options. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-naming.html\\\">EC2 instance hostnames, DNS names, and domains</a> in the <i>Amazon EC2 User Guide</i>.</p>\",\n                        \"smithy.api#xmlName\": \"publicIpDnsNameOptions\"\n                    }\n                },\n                \"PrivateIpAddress\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PrivateIpAddress\",\n                        \"smithy.api#documentation\": \"<p>The IPv4 address of the network interface within the subnet.</p>\",\n                        \"smithy.api#xmlName\": \"privateIpAddress\"\n                    }\n                },\n                \"PrivateIpAddresses\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInterfacePrivateIpAddressList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PrivateIpAddressesSet\",\n                        \"smithy.api#documentation\": \"<p>The private IPv4 addresses associated with the network interface.</p>\",\n                        \"smithy.api#xmlName\": \"privateIpAddressesSet\"\n                    }\n                },\n                \"Ipv4Prefixes\": {\n                    \"target\": \"com.amazonaws.ec2#Ipv4PrefixesList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Ipv4PrefixSet\",\n                        \"smithy.api#documentation\": \"<p>The IPv4 prefixes that are assigned to the network interface.</p>\",\n                        \"smithy.api#xmlName\": \"ipv4PrefixSet\"\n                    }\n                },\n                \"Ipv6Prefixes\": {\n                    \"target\": \"com.amazonaws.ec2#Ipv6PrefixesList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Ipv6PrefixSet\",\n                        \"smithy.api#documentation\": \"<p>The IPv6 prefixes that are assigned to the network interface.</p>\",\n                        \"smithy.api#xmlName\": \"ipv6PrefixSet\"\n                    }\n                },\n                \"RequesterId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RequesterId\",\n                        \"smithy.api#documentation\": \"<p>The alias or Amazon Web Services account ID of the principal or service that created\\n            the network interface.</p>\",\n                        \"smithy.api#xmlName\": \"requesterId\"\n                    }\n                },\n                \"RequesterManaged\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RequesterManaged\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether the network interface is being managed by Amazon Web Services.</p>\",\n                        \"smithy.api#xmlName\": \"requesterManaged\"\n                    }\n                },\n                \"SourceDestCheck\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SourceDestCheck\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether source/destination checking is enabled.</p>\",\n                        \"smithy.api#xmlName\": \"sourceDestCheck\"\n                    }\n                },\n                \"Status\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInterfaceStatus\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Status\",\n                        \"smithy.api#documentation\": \"<p>The status of the network interface.</p>\",\n                        \"smithy.api#xmlName\": \"status\"\n                    }\n                },\n                \"SubnetId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SubnetId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the subnet.</p>\",\n                        \"smithy.api#xmlName\": \"subnetId\"\n                    }\n                },\n                \"TagSet\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>Any tags assigned to the network interface.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                },\n                \"VpcId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the VPC.</p>\",\n                        \"smithy.api#xmlName\": \"vpcId\"\n                    }\n                },\n                \"DenyAllIgwTraffic\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DenyAllIgwTraffic\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether a network interface with an IPv6 address is unreachable from the\\n            public internet. If the value is <code>true</code>, inbound traffic from the internet is\\n            dropped and you cannot assign an elastic IP address to the network interface. The\\n            network interface is reachable from peered VPCs and resources connected through a\\n            transit gateway, including on-premises networks.</p>\",\n                        \"smithy.api#xmlName\": \"denyAllIgwTraffic\"\n                    }\n                },\n                \"Ipv6Native\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Ipv6Native\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether this is an IPv6 only network interface.</p>\",\n                        \"smithy.api#xmlName\": \"ipv6Native\"\n                    }\n                },\n                \"Ipv6Address\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Ipv6Address\",\n                        \"smithy.api#documentation\": \"<p>The IPv6 globally unique address associated with the network interface.</p>\",\n                        \"smithy.api#xmlName\": \"ipv6Address\"\n                    }\n                },\n                \"Operator\": {\n                    \"target\": \"com.amazonaws.ec2#OperatorResponse\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Operator\",\n                        \"smithy.api#documentation\": \"<p>The service provider that manages the network interface.</p>\",\n                        \"smithy.api#xmlName\": \"operator\"\n                    }\n                },\n                \"AssociatedSubnets\": {\n                    \"target\": \"com.amazonaws.ec2#AssociatedSubnetList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AssociatedSubnetSet\",\n                        \"smithy.api#documentation\": \"<p>The subnets associated with this network interface.</p>\",\n                        \"smithy.api#xmlName\": \"associatedSubnetSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a network interface.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#NetworkInterfaceAssociation\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AllocationId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AllocationId\",\n                        \"smithy.api#documentation\": \"<p>The allocation ID.</p>\",\n                        \"smithy.api#xmlName\": \"allocationId\"\n                    }\n                },\n                \"AssociationId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AssociationId\",\n                        \"smithy.api#documentation\": \"<p>The association ID.</p>\",\n                        \"smithy.api#xmlName\": \"associationId\"\n                    }\n                },\n                \"IpOwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpOwnerId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Elastic IP address owner.</p>\",\n                        \"smithy.api#xmlName\": \"ipOwnerId\"\n                    }\n                },\n                \"PublicDnsName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PublicDnsName\",\n                        \"smithy.api#documentation\": \"<p>The public DNS name.</p>\",\n                        \"smithy.api#xmlName\": \"publicDnsName\"\n                    }\n                },\n                \"PublicIp\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PublicIp\",\n                        \"smithy.api#documentation\": \"<p>The address of the Elastic IP address bound to the network interface.</p>\",\n                        \"smithy.api#xmlName\": \"publicIp\"\n                    }\n                },\n                \"CustomerOwnedIp\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CustomerOwnedIp\",\n                        \"smithy.api#documentation\": \"<p>The customer-owned IP address associated with the network interface.</p>\",\n                        \"smithy.api#xmlName\": \"customerOwnedIp\"\n                    }\n                },\n                \"CarrierIp\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CarrierIp\",\n                        \"smithy.api#documentation\": \"<p>The carrier IP address associated with the network interface.</p>\\n         <p>This option is only available when the network interface is in a subnet which is\\n            associated with a Wavelength Zone.</p>\",\n                        \"smithy.api#xmlName\": \"carrierIp\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes association information for an Elastic IP address (IPv4 only), or a Carrier\\n            IP address (for a network interface which resides in a subnet in a Wavelength\\n            Zone).</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#NetworkInterfaceAttachment\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AttachTime\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AttachTime\",\n                        \"smithy.api#documentation\": \"<p>The timestamp indicating when the attachment initiated.</p>\",\n                        \"smithy.api#xmlName\": \"attachTime\"\n                    }\n                },\n                \"AttachmentId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AttachmentId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the network interface attachment.</p>\",\n                        \"smithy.api#xmlName\": \"attachmentId\"\n                    }\n                },\n                \"DeleteOnTermination\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DeleteOnTermination\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether the network interface is deleted when the instance is\\n            terminated.</p>\",\n                        \"smithy.api#xmlName\": \"deleteOnTermination\"\n                    }\n                },\n                \"DeviceIndex\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DeviceIndex\",\n                        \"smithy.api#documentation\": \"<p>The device index of the network interface attachment on the instance.</p>\",\n                        \"smithy.api#xmlName\": \"deviceIndex\"\n                    }\n                },\n                \"NetworkCardIndex\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkCardIndex\",\n                        \"smithy.api#documentation\": \"<p>The index of the network card.</p>\",\n                        \"smithy.api#xmlName\": \"networkCardIndex\"\n                    }\n                },\n                \"InstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the instance.</p>\",\n                        \"smithy.api#xmlName\": \"instanceId\"\n                    }\n                },\n                \"InstanceOwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceOwnerId\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID of the owner of the instance.</p>\",\n                        \"smithy.api#xmlName\": \"instanceOwnerId\"\n                    }\n                },\n                \"Status\": {\n                    \"target\": \"com.amazonaws.ec2#AttachmentStatus\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Status\",\n                        \"smithy.api#documentation\": \"<p>The attachment state.</p>\",\n                        \"smithy.api#xmlName\": \"status\"\n                    }\n                },\n                \"EnaSrdSpecification\": {\n                    \"target\": \"com.amazonaws.ec2#AttachmentEnaSrdSpecification\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EnaSrdSpecification\",\n                        \"smithy.api#documentation\": \"<p>Configures ENA Express for the network interface that this action attaches to the\\n            instance.</p>\",\n                        \"smithy.api#xmlName\": \"enaSrdSpecification\"\n                    }\n                },\n                \"EnaQueueCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EnaQueueCount\",\n                        \"smithy.api#documentation\": \"<p>The number of ENA queues created with the instance.</p>\",\n                        \"smithy.api#xmlName\": \"enaQueueCount\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a network interface attachment.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#NetworkInterfaceAttachmentChanges\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DefaultEnaQueueCount\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The default number of the ENA queues.</p>\"\n                    }\n                },\n                \"EnaQueueCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of ENA queues to be created with the instance.</p>\"\n                    }\n                },\n                \"AttachmentId\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInterfaceAttachmentId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AttachmentId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the network interface attachment.</p>\",\n                        \"smithy.api#xmlName\": \"attachmentId\"\n                    }\n                },\n                \"DeleteOnTermination\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DeleteOnTermination\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether the network interface is deleted when the instance is\\n            terminated.</p>\",\n                        \"smithy.api#xmlName\": \"deleteOnTermination\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes an attachment change.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#NetworkInterfaceAttachmentId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#NetworkInterfaceAttribute\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"description\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"description\"\n                    }\n                },\n                \"groupSet\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"groupSet\"\n                    }\n                },\n                \"sourceDestCheck\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"sourceDestCheck\"\n                    }\n                },\n                \"attachment\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"attachment\"\n                    }\n                },\n                \"associatePublicIpAddress\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"associatePublicIpAddress\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#NetworkInterfaceCount\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Min\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Min\",\n                        \"smithy.api#documentation\": \"<p>The minimum number of network interfaces. If this parameter is not specified, there is no\\n         minimum limit.</p>\",\n                        \"smithy.api#xmlName\": \"min\"\n                    }\n                },\n                \"Max\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Max\",\n                        \"smithy.api#documentation\": \"<p>The maximum number of network interfaces. If this parameter is not specified, there is no\\n         maximum limit.</p>\",\n                        \"smithy.api#xmlName\": \"max\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The minimum and maximum number of network interfaces.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#NetworkInterfaceCountRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Min\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The minimum number of network interfaces. To specify no minimum limit, omit this\\n         parameter.</p>\"\n                    }\n                },\n                \"Max\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of network interfaces. To specify no maximum limit, omit this\\n         parameter.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The minimum and maximum number of network interfaces.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#NetworkInterfaceCreationType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"efa\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"efa\"\n                    }\n                },\n                \"efa_only\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"efa-only\"\n                    }\n                },\n                \"branch\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"branch\"\n                    }\n                },\n                \"trunk\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"trunk\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#NetworkInterfaceId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#NetworkInterfaceIdList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#NetworkInterfaceId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#NetworkInterfaceIdSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#String\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#NetworkInterfaceIpv6Address\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Ipv6Address\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Ipv6Address\",\n                        \"smithy.api#documentation\": \"<p>The IPv6 address.</p>\",\n                        \"smithy.api#xmlName\": \"ipv6Address\"\n                    }\n                },\n                \"PublicIpv6DnsName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PublicIpv6DnsName\",\n                        \"smithy.api#documentation\": \"<p>An IPv6-enabled public hostname for a network interface. Requests from within the VPC or from the internet resolve to the IPv6 GUA of the network interface. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-naming.html\\\">EC2 instance hostnames, DNS names, and domains</a> in the <i>Amazon EC2 User Guide</i>.</p>\",\n                        \"smithy.api#xmlName\": \"publicIpv6DnsName\"\n                    }\n                },\n                \"IsPrimaryIpv6\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IsPrimaryIpv6\",\n                        \"smithy.api#documentation\": \"<p>Determines if an IPv6 address associated with a network interface is the primary IPv6\\n            address. When you enable an IPv6 GUA address to be a primary IPv6, the first IPv6 GUA\\n            will be made the primary IPv6 address until the instance is terminated or the network\\n            interface is detached. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyNetworkInterfaceAttribute.html\\\">ModifyNetworkInterfaceAttribute</a>.</p>\",\n                        \"smithy.api#xmlName\": \"isPrimaryIpv6\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes an IPv6 address associated with a network interface.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#NetworkInterfaceIpv6AddressesList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#NetworkInterfaceIpv6Address\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#NetworkInterfaceList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#NetworkInterface\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#NetworkInterfacePermission\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NetworkInterfacePermissionId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkInterfacePermissionId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the network interface permission.</p>\",\n                        \"smithy.api#xmlName\": \"networkInterfacePermissionId\"\n                    }\n                },\n                \"NetworkInterfaceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkInterfaceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the network interface.</p>\",\n                        \"smithy.api#xmlName\": \"networkInterfaceId\"\n                    }\n                },\n                \"AwsAccountId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AwsAccountId\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID.</p>\",\n                        \"smithy.api#xmlName\": \"awsAccountId\"\n                    }\n                },\n                \"AwsService\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AwsService\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services service.</p>\",\n                        \"smithy.api#xmlName\": \"awsService\"\n                    }\n                },\n                \"Permission\": {\n                    \"target\": \"com.amazonaws.ec2#InterfacePermissionType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Permission\",\n                        \"smithy.api#documentation\": \"<p>The type of permission.</p>\",\n                        \"smithy.api#xmlName\": \"permission\"\n                    }\n                },\n                \"PermissionState\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInterfacePermissionState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PermissionState\",\n                        \"smithy.api#documentation\": \"<p>Information about the state of the permission.</p>\",\n                        \"smithy.api#xmlName\": \"permissionState\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a permission for a network interface.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#NetworkInterfacePermissionId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#NetworkInterfacePermissionIdList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#NetworkInterfacePermissionId\"\n            }\n        },\n        \"com.amazonaws.ec2#NetworkInterfacePermissionList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#NetworkInterfacePermission\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#NetworkInterfacePermissionState\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInterfacePermissionStateCode\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The state of the permission.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                },\n                \"StatusMessage\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"StatusMessage\",\n                        \"smithy.api#documentation\": \"<p>A status message, if applicable.</p>\",\n                        \"smithy.api#xmlName\": \"statusMessage\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the state of a network interface permission.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#NetworkInterfacePermissionStateCode\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"pending\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"pending\"\n                    }\n                },\n                \"granted\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"granted\"\n                    }\n                },\n                \"revoking\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"revoking\"\n                    }\n                },\n                \"revoked\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"revoked\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#NetworkInterfacePrivateIpAddress\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Association\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInterfaceAssociation\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Association\",\n                        \"smithy.api#documentation\": \"<p>The association information for an Elastic IP address (IPv4) associated with the\\n            network interface.</p>\",\n                        \"smithy.api#xmlName\": \"association\"\n                    }\n                },\n                \"Primary\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Primary\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether this IPv4 address is the primary private IPv4 address of the network\\n            interface.</p>\",\n                        \"smithy.api#xmlName\": \"primary\"\n                    }\n                },\n                \"PrivateDnsName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PrivateDnsName\",\n                        \"smithy.api#documentation\": \"<p>The private DNS name.</p>\",\n                        \"smithy.api#xmlName\": \"privateDnsName\"\n                    }\n                },\n                \"PrivateIpAddress\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PrivateIpAddress\",\n                        \"smithy.api#documentation\": \"<p>The private IPv4 address.</p>\",\n                        \"smithy.api#xmlName\": \"privateIpAddress\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the private IPv4 address of a network interface.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#NetworkInterfacePrivateIpAddressList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#NetworkInterfacePrivateIpAddress\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#NetworkInterfaceStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"available\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"available\"\n                    }\n                },\n                \"associated\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"associated\"\n                    }\n                },\n                \"attaching\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"attaching\"\n                    }\n                },\n                \"in_use\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"in-use\"\n                    }\n                },\n                \"detaching\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"detaching\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#NetworkInterfaceType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"interface\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"interface\"\n                    }\n                },\n                \"natGateway\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"natGateway\"\n                    }\n                },\n                \"efa\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"efa\"\n                    }\n                },\n                \"efa_only\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"efa-only\"\n                    }\n                },\n                \"trunk\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"trunk\"\n                    }\n                },\n                \"load_balancer\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"load_balancer\"\n                    }\n                },\n                \"network_load_balancer\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"network_load_balancer\"\n                    }\n                },\n                \"vpc_endpoint\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"vpc_endpoint\"\n                    }\n                },\n                \"branch\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"branch\"\n                    }\n                },\n                \"transit_gateway\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"transit_gateway\"\n                    }\n                },\n                \"lambda\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"lambda\"\n                    }\n                },\n                \"quicksight\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"quicksight\"\n                    }\n                },\n                \"global_accelerator_managed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"global_accelerator_managed\"\n                    }\n                },\n                \"api_gateway_managed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"api_gateway_managed\"\n                    }\n                },\n                \"gateway_load_balancer\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"gateway_load_balancer\"\n                    }\n                },\n                \"gateway_load_balancer_endpoint\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"gateway_load_balancer_endpoint\"\n                    }\n                },\n                \"iot_rules_managed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"iot_rules_managed\"\n                    }\n                },\n                \"aws_codestar_connections_managed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"aws_codestar_connections_managed\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#NetworkNodesList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#String\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#NetworkPerformance\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#NeuronDeviceCoreCount\": {\n            \"type\": \"integer\"\n        },\n        \"com.amazonaws.ec2#NeuronDeviceCoreInfo\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Count\": {\n                    \"target\": \"com.amazonaws.ec2#NeuronDeviceCoreCount\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Count\",\n                        \"smithy.api#documentation\": \"<p>The number of cores available to the neuron accelerator.</p>\",\n                        \"smithy.api#xmlName\": \"count\"\n                    }\n                },\n                \"Version\": {\n                    \"target\": \"com.amazonaws.ec2#NeuronDeviceCoreVersion\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Version\",\n                        \"smithy.api#documentation\": \"<p>The version of the neuron accelerator.</p>\",\n                        \"smithy.api#xmlName\": \"version\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the cores available to the neuron accelerator.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#NeuronDeviceCoreVersion\": {\n            \"type\": \"integer\"\n        },\n        \"com.amazonaws.ec2#NeuronDeviceCount\": {\n            \"type\": \"integer\"\n        },\n        \"com.amazonaws.ec2#NeuronDeviceInfo\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Count\": {\n                    \"target\": \"com.amazonaws.ec2#NeuronDeviceCount\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Count\",\n                        \"smithy.api#documentation\": \"<p>The number of neuron accelerators for the instance type.</p>\",\n                        \"smithy.api#xmlName\": \"count\"\n                    }\n                },\n                \"Name\": {\n                    \"target\": \"com.amazonaws.ec2#NeuronDeviceName\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Name\",\n                        \"smithy.api#documentation\": \"<p>The name of the neuron accelerator.</p>\",\n                        \"smithy.api#xmlName\": \"name\"\n                    }\n                },\n                \"CoreInfo\": {\n                    \"target\": \"com.amazonaws.ec2#NeuronDeviceCoreInfo\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CoreInfo\",\n                        \"smithy.api#documentation\": \"<p>Describes the cores available to each neuron accelerator.</p>\",\n                        \"smithy.api#xmlName\": \"coreInfo\"\n                    }\n                },\n                \"MemoryInfo\": {\n                    \"target\": \"com.amazonaws.ec2#NeuronDeviceMemoryInfo\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MemoryInfo\",\n                        \"smithy.api#documentation\": \"<p>Describes the memory available to each neuron accelerator.</p>\",\n                        \"smithy.api#xmlName\": \"memoryInfo\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the neuron accelerators for the instance type.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#NeuronDeviceInfoList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#NeuronDeviceInfo\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#NeuronDeviceMemoryInfo\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SizeInMiB\": {\n                    \"target\": \"com.amazonaws.ec2#NeuronDeviceMemorySize\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SizeInMiB\",\n                        \"smithy.api#documentation\": \"<p>The size of the memory available to the neuron accelerator, in MiB.</p>\",\n                        \"smithy.api#xmlName\": \"sizeInMiB\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the memory available to the neuron accelerator.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#NeuronDeviceMemorySize\": {\n            \"type\": \"integer\"\n        },\n        \"com.amazonaws.ec2#NeuronDeviceName\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#NeuronInfo\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NeuronDevices\": {\n                    \"target\": \"com.amazonaws.ec2#NeuronDeviceInfoList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NeuronDevices\",\n                        \"smithy.api#documentation\": \"<p>Describes the neuron accelerators for the instance type.</p>\",\n                        \"smithy.api#xmlName\": \"neuronDevices\"\n                    }\n                },\n                \"TotalNeuronDeviceMemoryInMiB\": {\n                    \"target\": \"com.amazonaws.ec2#TotalNeuronMemory\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TotalNeuronDeviceMemoryInMiB\",\n                        \"smithy.api#documentation\": \"<p>The total size of the memory for the neuron accelerators for the instance type, in\\n   MiB.</p>\",\n                        \"smithy.api#xmlName\": \"totalNeuronDeviceMemoryInMiB\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the neuron accelerators for the instance type.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#NewDhcpConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Key\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Key\",\n                        \"smithy.api#documentation\": \"<p>The name of a DHCP option.</p>\",\n                        \"smithy.api#xmlName\": \"key\"\n                    }\n                },\n                \"Values\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The values for the DHCP option.</p>\",\n                        \"smithy.api#xmlName\": \"Value\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a DHCP configuration option.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#NewDhcpConfigurationList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#NewDhcpConfiguration\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#NextToken\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#NitroEnclavesSupport\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"UNSUPPORTED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"unsupported\"\n                    }\n                },\n                \"SUPPORTED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"supported\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#NitroTpmInfo\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SupportedVersions\": {\n                    \"target\": \"com.amazonaws.ec2#NitroTpmSupportedVersionsList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SupportedVersions\",\n                        \"smithy.api#documentation\": \"<p>Indicates the supported NitroTPM versions.</p>\",\n                        \"smithy.api#xmlName\": \"supportedVersions\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the supported NitroTPM versions for the instance type.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#NitroTpmSupport\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"UNSUPPORTED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"unsupported\"\n                    }\n                },\n                \"SUPPORTED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"supported\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#NitroTpmSupportedVersionType\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#NitroTpmSupportedVersionsList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#NitroTpmSupportedVersionType\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#OccurrenceDayRequestSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#Integer\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"OccurenceDay\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#OccurrenceDaySet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#Integer\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#OdbNetworkArn\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#OfferingClassType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"STANDARD\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"standard\"\n                    }\n                },\n                \"CONVERTIBLE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"convertible\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#OfferingId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#OfferingTypeValues\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"Heavy_Utilization\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Heavy Utilization\"\n                    }\n                },\n                \"Medium_Utilization\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Medium Utilization\"\n                    }\n                },\n                \"Light_Utilization\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Light Utilization\"\n                    }\n                },\n                \"No_Upfront\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"No Upfront\"\n                    }\n                },\n                \"Partial_Upfront\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Partial Upfront\"\n                    }\n                },\n                \"All_Upfront\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"All Upfront\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#OidcOptions\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Issuer\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Issuer\",\n                        \"smithy.api#documentation\": \"<p>The OIDC issuer.</p>\",\n                        \"smithy.api#xmlName\": \"issuer\"\n                    }\n                },\n                \"AuthorizationEndpoint\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AuthorizationEndpoint\",\n                        \"smithy.api#documentation\": \"<p>The OIDC authorization endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"authorizationEndpoint\"\n                    }\n                },\n                \"TokenEndpoint\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TokenEndpoint\",\n                        \"smithy.api#documentation\": \"<p>The OIDC token endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"tokenEndpoint\"\n                    }\n                },\n                \"UserInfoEndpoint\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"UserInfoEndpoint\",\n                        \"smithy.api#documentation\": \"<p>The OIDC user info endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"userInfoEndpoint\"\n                    }\n                },\n                \"ClientId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ClientId\",\n                        \"smithy.api#documentation\": \"<p>The client identifier.</p>\",\n                        \"smithy.api#xmlName\": \"clientId\"\n                    }\n                },\n                \"ClientSecret\": {\n                    \"target\": \"com.amazonaws.ec2#ClientSecretType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ClientSecret\",\n                        \"smithy.api#documentation\": \"<p>The client secret.</p>\",\n                        \"smithy.api#xmlName\": \"clientSecret\"\n                    }\n                },\n                \"Scope\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Scope\",\n                        \"smithy.api#documentation\": \"<p>The OpenID Connect (OIDC) scope specified.</p>\",\n                        \"smithy.api#xmlName\": \"scope\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the options for an OpenID Connect-compatible user-identity trust\\n         provider.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#OnDemandAllocationStrategy\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"LOWEST_PRICE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"lowestPrice\"\n                    }\n                },\n                \"PRIORITIZED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"prioritized\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#OnDemandOptions\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AllocationStrategy\": {\n                    \"target\": \"com.amazonaws.ec2#FleetOnDemandAllocationStrategy\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AllocationStrategy\",\n                        \"smithy.api#documentation\": \"<p>The strategy that determines the order of the launch template overrides to use in\\n         fulfilling On-Demand capacity.</p>\\n         <p>\\n            <code>lowest-price</code> - EC2 Fleet uses price to determine the order, launching the lowest\\n         price first.</p>\\n         <p>\\n            <code>prioritized</code> - EC2 Fleet uses the priority that you assigned to each launch\\n         template override, launching the highest priority first.</p>\\n         <p>Default: <code>lowest-price</code>\\n         </p>\",\n                        \"smithy.api#xmlName\": \"allocationStrategy\"\n                    }\n                },\n                \"CapacityReservationOptions\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityReservationOptions\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CapacityReservationOptions\",\n                        \"smithy.api#documentation\": \"<p>The strategy for using unused Capacity Reservations for fulfilling On-Demand\\n         capacity.</p>\\n         <p>Supported only for fleets of type <code>instant</code>.</p>\",\n                        \"smithy.api#xmlName\": \"capacityReservationOptions\"\n                    }\n                },\n                \"SingleInstanceType\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SingleInstanceType\",\n                        \"smithy.api#documentation\": \"<p>Indicates that the fleet uses a single instance type to launch all On-Demand Instances in the\\n         fleet.</p>\\n         <p>Supported only for fleets of type <code>instant</code>.</p>\",\n                        \"smithy.api#xmlName\": \"singleInstanceType\"\n                    }\n                },\n                \"SingleAvailabilityZone\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SingleAvailabilityZone\",\n                        \"smithy.api#documentation\": \"<p>Indicates that the fleet launches all On-Demand Instances into a single Availability Zone.</p>\\n         <p>Supported only for fleets of type <code>instant</code>.</p>\",\n                        \"smithy.api#xmlName\": \"singleAvailabilityZone\"\n                    }\n                },\n                \"MinTargetCapacity\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MinTargetCapacity\",\n                        \"smithy.api#documentation\": \"<p>The minimum target capacity for On-Demand Instances in the fleet. If this minimum capacity isn't\\n         reached, no instances are launched.</p>\\n         <p>Constraints: Maximum value of <code>1000</code>. Supported only for fleets of type\\n            <code>instant</code>.</p>\\n         <p>At least one of the following must be specified: <code>SingleAvailabilityZone</code> |\\n         <code>SingleInstanceType</code>\\n         </p>\",\n                        \"smithy.api#xmlName\": \"minTargetCapacity\"\n                    }\n                },\n                \"MaxTotalPrice\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MaxTotalPrice\",\n                        \"smithy.api#documentation\": \"<p>The maximum amount per hour for On-Demand Instances that you're willing to pay.</p>\\n         <note>\\n            <p>If your fleet includes T instances that are configured as <code>unlimited</code>, and\\n            if their average CPU usage exceeds the baseline utilization, you will incur a charge for\\n            surplus credits. The <code>maxTotalPrice</code> does not account for surplus credits,\\n            and, if you use surplus credits, your final cost might be higher than what you specified\\n            for <code>maxTotalPrice</code>. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/burstable-performance-instances-unlimited-mode-concepts.html#unlimited-mode-surplus-credits\\\">Surplus credits can incur charges</a> in the\\n               <i>Amazon EC2 User Guide</i>.</p>\\n         </note>\",\n                        \"smithy.api#xmlName\": \"maxTotalPrice\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the configuration of On-Demand Instances in an EC2 Fleet.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#OnDemandOptionsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AllocationStrategy\": {\n                    \"target\": \"com.amazonaws.ec2#FleetOnDemandAllocationStrategy\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The strategy that determines the order of the launch template overrides to use in\\n         fulfilling On-Demand capacity.</p>\\n         <p>\\n            <code>lowest-price</code> - EC2 Fleet uses price to determine the order, launching the lowest\\n         price first.</p>\\n         <p>\\n            <code>prioritized</code> - EC2 Fleet uses the priority that you assigned to each launch\\n         template override, launching the highest priority first.</p>\\n         <p>Default: <code>lowest-price</code>\\n         </p>\"\n                    }\n                },\n                \"CapacityReservationOptions\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityReservationOptionsRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The strategy for using unused Capacity Reservations for fulfilling On-Demand\\n         capacity.</p>\\n         <p>Supported only for fleets of type <code>instant</code>.</p>\"\n                    }\n                },\n                \"SingleInstanceType\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates that the fleet uses a single instance type to launch all On-Demand Instances in the\\n         fleet.</p>\\n         <p>Supported only for fleets of type <code>instant</code>.</p>\"\n                    }\n                },\n                \"SingleAvailabilityZone\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates that the fleet launches all On-Demand Instances into a single Availability Zone.</p>\\n         <p>Supported only for fleets of type <code>instant</code>.</p>\"\n                    }\n                },\n                \"MinTargetCapacity\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The minimum target capacity for On-Demand Instances in the fleet. If this minimum capacity isn't\\n         reached, no instances are launched.</p>\\n         <p>Constraints: Maximum value of <code>1000</code>. Supported only for fleets of type\\n            <code>instant</code>.</p>\\n         <p>At least one of the following must be specified: <code>SingleAvailabilityZone</code> |\\n         <code>SingleInstanceType</code>\\n         </p>\"\n                    }\n                },\n                \"MaxTotalPrice\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum amount per hour for On-Demand Instances that you're willing to pay.</p>\\n         <note>\\n            <p>If your fleet includes T instances that are configured as <code>unlimited</code>,\\n            and if their average CPU usage exceeds the baseline utilization, you will incur a charge\\n            for surplus credits. The <code>MaxTotalPrice</code> does not account for surplus\\n            credits, and, if you use surplus credits, your final cost might be higher than what you\\n            specified for <code>MaxTotalPrice</code>. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/burstable-performance-instances-unlimited-mode-concepts.html#unlimited-mode-surplus-credits\\\">Surplus credits can incur charges</a> in the <i>Amazon EC2 User Guide</i>.</p>\\n         </note>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the configuration of On-Demand Instances in an EC2 Fleet.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#OperationType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"add\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"add\"\n                    }\n                },\n                \"remove\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"remove\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#OperatorRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Principal\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The service provider that manages the resource.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The service provider that manages the resource.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#OperatorResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Managed\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Managed\",\n                        \"smithy.api#documentation\": \"<p>If <code>true</code>, the resource is managed by a service provider.</p>\",\n                        \"smithy.api#xmlName\": \"managed\"\n                    }\n                },\n                \"Principal\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Principal\",\n                        \"smithy.api#documentation\": \"<p>If <code>managed</code> is <code>true</code>, then the principal is returned. The\\n            principal is the service provider that manages the resource.</p>\",\n                        \"smithy.api#xmlName\": \"principal\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes whether the resource is managed by a service provider and, if so, describes\\n            the service provider that manages it.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#OrganizationArnStringList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#String\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"OrganizationArn\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#OrganizationalUnitArnStringList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#String\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"OrganizationalUnitArn\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#OutpostArn\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#pattern\": \"^arn:aws([a-z-]+)?:outposts:[a-z\\\\d-]+:\\\\d{12}:outpost/op-[a-f0-9]{17}$\"\n            }\n        },\n        \"com.amazonaws.ec2#OutpostLag\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"OutpostArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OutpostArn\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Number (ARN) of the Outpost LAG.</p>\",\n                        \"smithy.api#xmlName\": \"outpostArn\"\n                    }\n                },\n                \"OwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OwnerId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Outpost LAG owner.</p>\",\n                        \"smithy.api#xmlName\": \"ownerId\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The current state of the Outpost LAG.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                },\n                \"OutpostLagId\": {\n                    \"target\": \"com.amazonaws.ec2#OutpostLagId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OutpostLagId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Outpost LAG.</p>\",\n                        \"smithy.api#xmlName\": \"outpostLagId\"\n                    }\n                },\n                \"LocalGatewayVirtualInterfaceIds\": {\n                    \"target\": \"com.amazonaws.ec2#LocalGatewayVirtualInterfaceIdSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LocalGatewayVirtualInterfaceIdSet\",\n                        \"smithy.api#documentation\": \"<p>The IDs of the local gateway virtual interfaces associated with the Outpost LAG.</p>\",\n                        \"smithy.api#xmlName\": \"localGatewayVirtualInterfaceIdSet\"\n                    }\n                },\n                \"ServiceLinkVirtualInterfaceIds\": {\n                    \"target\": \"com.amazonaws.ec2#ServiceLinkVirtualInterfaceIdSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ServiceLinkVirtualInterfaceIdSet\",\n                        \"smithy.api#documentation\": \"<p>The service link virtual interface IDs associated with the Outpost LAG.</p>\",\n                        \"smithy.api#xmlName\": \"serviceLinkVirtualInterfaceIdSet\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>The tags associated with the Outpost LAG.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes an Outpost link aggregation group (LAG).</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#OutpostLagId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#OutpostLagIdSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#OutpostLagId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#OutpostLagMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 5,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.ec2#OutpostLagSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#OutpostLag\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#OwnerStringList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#String\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"Owner\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#PacketHeaderStatement\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SourceAddresses\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SourceAddressSet\",\n                        \"smithy.api#documentation\": \"<p>The source addresses.</p>\",\n                        \"smithy.api#xmlName\": \"sourceAddressSet\"\n                    }\n                },\n                \"DestinationAddresses\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DestinationAddressSet\",\n                        \"smithy.api#documentation\": \"<p>The destination addresses.</p>\",\n                        \"smithy.api#xmlName\": \"destinationAddressSet\"\n                    }\n                },\n                \"SourcePorts\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SourcePortSet\",\n                        \"smithy.api#documentation\": \"<p>The source ports.</p>\",\n                        \"smithy.api#xmlName\": \"sourcePortSet\"\n                    }\n                },\n                \"DestinationPorts\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DestinationPortSet\",\n                        \"smithy.api#documentation\": \"<p>The destination ports.</p>\",\n                        \"smithy.api#xmlName\": \"destinationPortSet\"\n                    }\n                },\n                \"SourcePrefixLists\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SourcePrefixListSet\",\n                        \"smithy.api#documentation\": \"<p>The source prefix lists.</p>\",\n                        \"smithy.api#xmlName\": \"sourcePrefixListSet\"\n                    }\n                },\n                \"DestinationPrefixLists\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DestinationPrefixListSet\",\n                        \"smithy.api#documentation\": \"<p>The destination prefix lists.</p>\",\n                        \"smithy.api#xmlName\": \"destinationPrefixListSet\"\n                    }\n                },\n                \"Protocols\": {\n                    \"target\": \"com.amazonaws.ec2#ProtocolList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ProtocolSet\",\n                        \"smithy.api#documentation\": \"<p>The protocols.</p>\",\n                        \"smithy.api#xmlName\": \"protocolSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a packet header statement.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#PacketHeaderStatementRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SourceAddresses\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The source addresses.</p>\",\n                        \"smithy.api#xmlName\": \"SourceAddress\"\n                    }\n                },\n                \"DestinationAddresses\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The destination addresses.</p>\",\n                        \"smithy.api#xmlName\": \"DestinationAddress\"\n                    }\n                },\n                \"SourcePorts\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The source ports.</p>\",\n                        \"smithy.api#xmlName\": \"SourcePort\"\n                    }\n                },\n                \"DestinationPorts\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The destination ports.</p>\",\n                        \"smithy.api#xmlName\": \"DestinationPort\"\n                    }\n                },\n                \"SourcePrefixLists\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The source prefix lists.</p>\",\n                        \"smithy.api#xmlName\": \"SourcePrefixList\"\n                    }\n                },\n                \"DestinationPrefixLists\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The destination prefix lists.</p>\",\n                        \"smithy.api#xmlName\": \"DestinationPrefixList\"\n                    }\n                },\n                \"Protocols\": {\n                    \"target\": \"com.amazonaws.ec2#ProtocolList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The protocols.</p>\",\n                        \"smithy.api#xmlName\": \"Protocol\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a packet header statement.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#PartitionLoadFrequency\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"NONE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"none\"\n                    }\n                },\n                \"DAILY\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"daily\"\n                    }\n                },\n                \"WEEKLY\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"weekly\"\n                    }\n                },\n                \"MONTHLY\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"monthly\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#PasswordData\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#sensitive\": {}\n            }\n        },\n        \"com.amazonaws.ec2#PathComponent\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SequenceNumber\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SequenceNumber\",\n                        \"smithy.api#documentation\": \"<p>The sequence number.</p>\",\n                        \"smithy.api#xmlName\": \"sequenceNumber\"\n                    }\n                },\n                \"AclRule\": {\n                    \"target\": \"com.amazonaws.ec2#AnalysisAclRule\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AclRule\",\n                        \"smithy.api#documentation\": \"<p>The network ACL rule.</p>\",\n                        \"smithy.api#xmlName\": \"aclRule\"\n                    }\n                },\n                \"AttachedTo\": {\n                    \"target\": \"com.amazonaws.ec2#AnalysisComponent\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AttachedTo\",\n                        \"smithy.api#documentation\": \"<p>The resource to which the path component is attached.</p>\",\n                        \"smithy.api#xmlName\": \"attachedTo\"\n                    }\n                },\n                \"Component\": {\n                    \"target\": \"com.amazonaws.ec2#AnalysisComponent\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Component\",\n                        \"smithy.api#documentation\": \"<p>The component.</p>\",\n                        \"smithy.api#xmlName\": \"component\"\n                    }\n                },\n                \"DestinationVpc\": {\n                    \"target\": \"com.amazonaws.ec2#AnalysisComponent\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DestinationVpc\",\n                        \"smithy.api#documentation\": \"<p>The destination VPC.</p>\",\n                        \"smithy.api#xmlName\": \"destinationVpc\"\n                    }\n                },\n                \"OutboundHeader\": {\n                    \"target\": \"com.amazonaws.ec2#AnalysisPacketHeader\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OutboundHeader\",\n                        \"smithy.api#documentation\": \"<p>The outbound header.</p>\",\n                        \"smithy.api#xmlName\": \"outboundHeader\"\n                    }\n                },\n                \"InboundHeader\": {\n                    \"target\": \"com.amazonaws.ec2#AnalysisPacketHeader\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InboundHeader\",\n                        \"smithy.api#documentation\": \"<p>The inbound header.</p>\",\n                        \"smithy.api#xmlName\": \"inboundHeader\"\n                    }\n                },\n                \"RouteTableRoute\": {\n                    \"target\": \"com.amazonaws.ec2#AnalysisRouteTableRoute\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RouteTableRoute\",\n                        \"smithy.api#documentation\": \"<p>The route table route.</p>\",\n                        \"smithy.api#xmlName\": \"routeTableRoute\"\n                    }\n                },\n                \"SecurityGroupRule\": {\n                    \"target\": \"com.amazonaws.ec2#AnalysisSecurityGroupRule\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SecurityGroupRule\",\n                        \"smithy.api#documentation\": \"<p>The security group rule.</p>\",\n                        \"smithy.api#xmlName\": \"securityGroupRule\"\n                    }\n                },\n                \"SourceVpc\": {\n                    \"target\": \"com.amazonaws.ec2#AnalysisComponent\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SourceVpc\",\n                        \"smithy.api#documentation\": \"<p>The source VPC.</p>\",\n                        \"smithy.api#xmlName\": \"sourceVpc\"\n                    }\n                },\n                \"Subnet\": {\n                    \"target\": \"com.amazonaws.ec2#AnalysisComponent\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Subnet\",\n                        \"smithy.api#documentation\": \"<p>The subnet.</p>\",\n                        \"smithy.api#xmlName\": \"subnet\"\n                    }\n                },\n                \"Vpc\": {\n                    \"target\": \"com.amazonaws.ec2#AnalysisComponent\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Vpc\",\n                        \"smithy.api#documentation\": \"<p>The component VPC.</p>\",\n                        \"smithy.api#xmlName\": \"vpc\"\n                    }\n                },\n                \"AdditionalDetails\": {\n                    \"target\": \"com.amazonaws.ec2#AdditionalDetailList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AdditionalDetailSet\",\n                        \"smithy.api#documentation\": \"<p>The additional details.</p>\",\n                        \"smithy.api#xmlName\": \"additionalDetailSet\"\n                    }\n                },\n                \"TransitGateway\": {\n                    \"target\": \"com.amazonaws.ec2#AnalysisComponent\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGateway\",\n                        \"smithy.api#documentation\": \"<p>The transit gateway.</p>\",\n                        \"smithy.api#xmlName\": \"transitGateway\"\n                    }\n                },\n                \"TransitGatewayRouteTableRoute\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayRouteTableRoute\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayRouteTableRoute\",\n                        \"smithy.api#documentation\": \"<p>The route in a transit gateway route table.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayRouteTableRoute\"\n                    }\n                },\n                \"Explanations\": {\n                    \"target\": \"com.amazonaws.ec2#ExplanationList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ExplanationSet\",\n                        \"smithy.api#documentation\": \"<p>The explanation codes.</p>\",\n                        \"smithy.api#xmlName\": \"explanationSet\"\n                    }\n                },\n                \"ElasticLoadBalancerListener\": {\n                    \"target\": \"com.amazonaws.ec2#AnalysisComponent\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ElasticLoadBalancerListener\",\n                        \"smithy.api#documentation\": \"<p>The load balancer listener.</p>\",\n                        \"smithy.api#xmlName\": \"elasticLoadBalancerListener\"\n                    }\n                },\n                \"FirewallStatelessRule\": {\n                    \"target\": \"com.amazonaws.ec2#FirewallStatelessRule\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"FirewallStatelessRule\",\n                        \"smithy.api#documentation\": \"<p>The Network Firewall stateless rule.</p>\",\n                        \"smithy.api#xmlName\": \"firewallStatelessRule\"\n                    }\n                },\n                \"FirewallStatefulRule\": {\n                    \"target\": \"com.amazonaws.ec2#FirewallStatefulRule\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"FirewallStatefulRule\",\n                        \"smithy.api#documentation\": \"<p>The Network Firewall stateful rule.</p>\",\n                        \"smithy.api#xmlName\": \"firewallStatefulRule\"\n                    }\n                },\n                \"ServiceName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ServiceName\",\n                        \"smithy.api#documentation\": \"<p>The name of the VPC endpoint service.</p>\",\n                        \"smithy.api#xmlName\": \"serviceName\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a path component.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#PathComponentList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#PathComponent\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#PathFilter\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SourceAddress\": {\n                    \"target\": \"com.amazonaws.ec2#IpAddress\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SourceAddress\",\n                        \"smithy.api#documentation\": \"<p>The source IPv4 address.</p>\",\n                        \"smithy.api#xmlName\": \"sourceAddress\"\n                    }\n                },\n                \"SourcePortRange\": {\n                    \"target\": \"com.amazonaws.ec2#FilterPortRange\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SourcePortRange\",\n                        \"smithy.api#documentation\": \"<p>The source port range.</p>\",\n                        \"smithy.api#xmlName\": \"sourcePortRange\"\n                    }\n                },\n                \"DestinationAddress\": {\n                    \"target\": \"com.amazonaws.ec2#IpAddress\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DestinationAddress\",\n                        \"smithy.api#documentation\": \"<p>The destination IPv4 address.</p>\",\n                        \"smithy.api#xmlName\": \"destinationAddress\"\n                    }\n                },\n                \"DestinationPortRange\": {\n                    \"target\": \"com.amazonaws.ec2#FilterPortRange\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DestinationPortRange\",\n                        \"smithy.api#documentation\": \"<p>The destination port range.</p>\",\n                        \"smithy.api#xmlName\": \"destinationPortRange\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a set of filters for a path analysis. Use path filters to scope the analysis when\\n          there can be multiple resulting paths.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#PathRequestFilter\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SourceAddress\": {\n                    \"target\": \"com.amazonaws.ec2#IpAddress\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The source IPv4 address.</p>\"\n                    }\n                },\n                \"SourcePortRange\": {\n                    \"target\": \"com.amazonaws.ec2#RequestFilterPortRange\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The source port range.</p>\"\n                    }\n                },\n                \"DestinationAddress\": {\n                    \"target\": \"com.amazonaws.ec2#IpAddress\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The destination IPv4 address.</p>\"\n                    }\n                },\n                \"DestinationPortRange\": {\n                    \"target\": \"com.amazonaws.ec2#RequestFilterPortRange\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The destination port range.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a set of filters for a path analysis. Use path filters to scope the analysis when\\n         there can be multiple resulting paths.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#PathStatement\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PacketHeaderStatement\": {\n                    \"target\": \"com.amazonaws.ec2#PacketHeaderStatement\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PacketHeaderStatement\",\n                        \"smithy.api#documentation\": \"<p>The packet header statement.</p>\",\n                        \"smithy.api#xmlName\": \"packetHeaderStatement\"\n                    }\n                },\n                \"ResourceStatement\": {\n                    \"target\": \"com.amazonaws.ec2#ResourceStatement\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResourceStatement\",\n                        \"smithy.api#documentation\": \"<p>The resource statement.</p>\",\n                        \"smithy.api#xmlName\": \"resourceStatement\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a path statement.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#PathStatementRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PacketHeaderStatement\": {\n                    \"target\": \"com.amazonaws.ec2#PacketHeaderStatementRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The packet header statement.</p>\"\n                    }\n                },\n                \"ResourceStatement\": {\n                    \"target\": \"com.amazonaws.ec2#ResourceStatementRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The resource statement.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a path statement.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#PayerResponsibility\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ServiceOwner\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ServiceOwner\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#PaymentOption\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ALL_UPFRONT\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AllUpfront\"\n                    }\n                },\n                \"PARTIAL_UPFRONT\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"PartialUpfront\"\n                    }\n                },\n                \"NO_UPFRONT\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"NoUpfront\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#PciId\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DeviceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the device.</p>\"\n                    }\n                },\n                \"VendorId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the vendor.</p>\"\n                    }\n                },\n                \"SubsystemId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the subsystem.</p>\"\n                    }\n                },\n                \"SubsystemVendorId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the vendor for the subsystem.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the data that identifies an Amazon FPGA image (AFI) on the PCI bus.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#PeakBandwidthInGbps\": {\n            \"type\": \"double\"\n        },\n        \"com.amazonaws.ec2#PeeringAttachmentStatus\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Code\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Code\",\n                        \"smithy.api#documentation\": \"<p>The status code.</p>\",\n                        \"smithy.api#xmlName\": \"code\"\n                    }\n                },\n                \"Message\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Message\",\n                        \"smithy.api#documentation\": \"<p>The status message, if applicable.</p>\",\n                        \"smithy.api#xmlName\": \"message\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The status of the transit gateway peering attachment.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#PeeringConnectionOptions\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AllowDnsResolutionFromRemoteVpc\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AllowDnsResolutionFromRemoteVpc\",\n                        \"smithy.api#documentation\": \"<p>If true, the public DNS hostnames of instances in the specified VPC resolve to private\\n            IP addresses when queried from instances in the peer VPC.</p>\",\n                        \"smithy.api#xmlName\": \"allowDnsResolutionFromRemoteVpc\"\n                    }\n                },\n                \"AllowEgressFromLocalClassicLinkToRemoteVpc\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AllowEgressFromLocalClassicLinkToRemoteVpc\",\n                        \"smithy.api#documentation\": \"<p>Deprecated.</p>\",\n                        \"smithy.api#xmlName\": \"allowEgressFromLocalClassicLinkToRemoteVpc\"\n                    }\n                },\n                \"AllowEgressFromLocalVpcToRemoteClassicLink\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AllowEgressFromLocalVpcToRemoteClassicLink\",\n                        \"smithy.api#documentation\": \"<p>Deprecated.</p>\",\n                        \"smithy.api#xmlName\": \"allowEgressFromLocalVpcToRemoteClassicLink\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the VPC peering connection options.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#PeeringConnectionOptionsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AllowDnsResolutionFromRemoteVpc\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If true, enables a local VPC to resolve public DNS hostnames to private IP addresses \\n        when queried from instances in the peer VPC.</p>\"\n                    }\n                },\n                \"AllowEgressFromLocalClassicLinkToRemoteVpc\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Deprecated.</p>\"\n                    }\n                },\n                \"AllowEgressFromLocalVpcToRemoteClassicLink\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Deprecated.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The VPC peering connection options.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#PeeringTgwInfo\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the transit gateway.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayId\"\n                    }\n                },\n                \"CoreNetworkId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CoreNetworkId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the core network where the transit gateway peer is located.</p>\",\n                        \"smithy.api#xmlName\": \"coreNetworkId\"\n                    }\n                },\n                \"OwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OwnerId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Amazon Web Services account that owns the transit gateway.</p>\",\n                        \"smithy.api#xmlName\": \"ownerId\"\n                    }\n                },\n                \"Region\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Region\",\n                        \"smithy.api#documentation\": \"<p>The Region of the transit gateway.</p>\",\n                        \"smithy.api#xmlName\": \"region\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about the transit gateway in the peering attachment.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#PerformanceFactorReference\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceFamily\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceFamily\",\n                        \"smithy.api#documentation\": \"<p>The instance family to use as a baseline reference.</p>\\n         <note>\\n            <p>Ensure that you specify the correct value for the instance family. The instance\\n            family is everything before the period (<code>.</code>) in the instance type name. For\\n            example, in the instance type <code>c6i.large</code>, the instance family is\\n            <code>c6i</code>, not <code>c6</code>. For more information, see <a href=\\\"https://docs.aws.amazon.com/ec2/latest/instancetypes/instance-type-names.html\\\">Amazon EC2\\n               instance type naming conventions</a> in <i>Amazon EC2 Instance\\n                  Types</i>.</p>\\n         </note>\\n         <p>The following instance families are <i>not supported</i> for performance\\n         protection:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>c1</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>g3</code> | <code>g3s</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>hpc7g</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>m1</code> | <code>m2</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>mac1</code> | <code>mac2</code> | <code>mac2-m1ultra</code> |\\n               <code>mac2-m2</code> | <code>mac2-m2pro</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>p3dn</code> | <code>p4d</code> | <code>p5</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>t1</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>u-12tb1</code> | <code>u-18tb1</code> | <code>u-24tb1</code> |\\n               <code>u-3tb1</code> | <code>u-6tb1</code> | <code>u-9tb1</code> |\\n               <code>u7i-12tb</code> | <code>u7in-16tb</code> | <code>u7in-24tb</code> |\\n               <code>u7in-32tb</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>If you enable performance protection by specifying a supported instance family, the\\n         returned instance types will exclude the above unsupported instance families.</p>\\n         <p>If you specify an unsupported instance family as a value for baseline performance, the\\n         API returns an empty response for <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetInstanceTypesFromInstanceRequirements\\\">GetInstanceTypesFromInstanceRequirements</a> and an exception for <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateFleet\\\">CreateFleet</a>, <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RequestSpotFleet\\\">RequestSpotFleet</a>, <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyFleet\\\">ModifyFleet</a>, and <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifySpotFleetRequest\\\">ModifySpotFleetRequest</a>.</p>\",\n                        \"smithy.api#xmlName\": \"instanceFamily\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Specify an instance family to use as the baseline reference for CPU performance. All\\n         instance types that match your specified attributes will be compared against the CPU\\n         performance of the referenced instance family, regardless of CPU manufacturer or\\n         architecture.</p>\\n         <note>\\n            <p>Currently, only one instance family can be specified in the list.</p>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.ec2#PerformanceFactorReferenceRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceFamily\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The instance family to use as a baseline reference.</p>\\n         <note>\\n            <p>Ensure that you specify the correct value for the instance family. The instance\\n            family is everything before the period (<code>.</code>) in the instance type name. For\\n            example, in the instance type <code>c6i.large</code>, the instance family is\\n            <code>c6i</code>, not <code>c6</code>. For more information, see <a href=\\\"https://docs.aws.amazon.com/ec2/latest/instancetypes/instance-type-names.html\\\">Amazon EC2\\n               instance type naming conventions</a> in <i>Amazon EC2 Instance\\n                  Types</i>.</p>\\n         </note>\\n         <p>The following instance families are <i>not supported</i> for performance\\n         protection:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>c1</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>g3</code> | <code>g3s</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>hpc7g</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>m1</code> | <code>m2</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>mac1</code> | <code>mac2</code> | <code>mac2-m1ultra</code> |\\n               <code>mac2-m2</code> | <code>mac2-m2pro</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>p3dn</code> | <code>p4d</code> | <code>p5</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>t1</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>u-12tb1</code> | <code>u-18tb1</code> | <code>u-24tb1</code> |\\n               <code>u-3tb1</code> | <code>u-6tb1</code> | <code>u-9tb1</code> |\\n               <code>u7i-12tb</code> | <code>u7in-16tb</code> | <code>u7in-24tb</code> |\\n               <code>u7in-32tb</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>If you enable performance protection by specifying a supported instance family, the\\n         returned instance types will exclude the above unsupported instance families.</p>\\n         <p>If you specify an unsupported instance family as a value for baseline performance, the\\n         API returns an empty response for <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetInstanceTypesFromInstanceRequirements\\\">GetInstanceTypesFromInstanceRequirements</a> and an exception for <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateFleet\\\">CreateFleet</a>, <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RequestSpotFleet\\\">RequestSpotFleet</a>, <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyFleet\\\">ModifyFleet</a>, and <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifySpotFleetRequest\\\">ModifySpotFleetRequest</a>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Specify an instance family to use as the baseline reference for CPU performance. All\\n         instance types that match your specified attributes will be compared against the CPU\\n         performance of the referenced instance family, regardless of CPU manufacturer or\\n         architecture.</p>\\n         <note>\\n            <p>Currently, only one instance family can be specified in the list.</p>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.ec2#PerformanceFactorReferenceSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#PerformanceFactorReference\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#PerformanceFactorReferenceSetRequest\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#PerformanceFactorReferenceRequest\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#PeriodType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"five_minutes\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"five-minutes\"\n                    }\n                },\n                \"fifteen_minutes\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"fifteen-minutes\"\n                    }\n                },\n                \"one_hour\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"one-hour\"\n                    }\n                },\n                \"three_hours\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"three-hours\"\n                    }\n                },\n                \"one_day\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"one-day\"\n                    }\n                },\n                \"one_week\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"one-week\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#PermissionGroup\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"all\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"all\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#Phase1DHGroupNumbersList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#Phase1DHGroupNumbersListValue\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#Phase1DHGroupNumbersListValue\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Value\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Value\",\n                        \"smithy.api#documentation\": \"<p>The Diffie-Hellmann group number.</p>\",\n                        \"smithy.api#xmlName\": \"value\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The Diffie-Hellmann group number for phase 1 IKE negotiations.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#Phase1DHGroupNumbersRequestList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#Phase1DHGroupNumbersRequestListValue\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#Phase1DHGroupNumbersRequestListValue\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Value\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Diffie-Hellmann group number.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Specifies a Diffie-Hellman group number for the VPN tunnel for phase 1 IKE\\n            negotiations.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#Phase1EncryptionAlgorithmsList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#Phase1EncryptionAlgorithmsListValue\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#Phase1EncryptionAlgorithmsListValue\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Value\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Value\",\n                        \"smithy.api#documentation\": \"<p>The value for the encryption algorithm.</p>\",\n                        \"smithy.api#xmlName\": \"value\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The encryption algorithm for phase 1 IKE negotiations.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#Phase1EncryptionAlgorithmsRequestList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#Phase1EncryptionAlgorithmsRequestListValue\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#Phase1EncryptionAlgorithmsRequestListValue\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Value\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The value for the encryption algorithm.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Specifies the encryption algorithm for the VPN tunnel for phase 1 IKE\\n            negotiations.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#Phase1IntegrityAlgorithmsList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#Phase1IntegrityAlgorithmsListValue\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#Phase1IntegrityAlgorithmsListValue\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Value\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Value\",\n                        \"smithy.api#documentation\": \"<p>The value for the integrity algorithm.</p>\",\n                        \"smithy.api#xmlName\": \"value\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The integrity algorithm for phase 1 IKE negotiations.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#Phase1IntegrityAlgorithmsRequestList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#Phase1IntegrityAlgorithmsRequestListValue\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#Phase1IntegrityAlgorithmsRequestListValue\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Value\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The value for the integrity algorithm.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Specifies the integrity algorithm for the VPN tunnel for phase 1 IKE\\n            negotiations.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#Phase2DHGroupNumbersList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#Phase2DHGroupNumbersListValue\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#Phase2DHGroupNumbersListValue\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Value\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Value\",\n                        \"smithy.api#documentation\": \"<p>The Diffie-Hellmann group number.</p>\",\n                        \"smithy.api#xmlName\": \"value\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The Diffie-Hellmann group number for phase 2 IKE negotiations.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#Phase2DHGroupNumbersRequestList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#Phase2DHGroupNumbersRequestListValue\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#Phase2DHGroupNumbersRequestListValue\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Value\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Diffie-Hellmann group number.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Specifies a Diffie-Hellman group number for the VPN tunnel for phase 2 IKE\\n            negotiations.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#Phase2EncryptionAlgorithmsList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#Phase2EncryptionAlgorithmsListValue\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#Phase2EncryptionAlgorithmsListValue\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Value\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Value\",\n                        \"smithy.api#documentation\": \"<p>The encryption algorithm.</p>\",\n                        \"smithy.api#xmlName\": \"value\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The encryption algorithm for phase 2 IKE negotiations.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#Phase2EncryptionAlgorithmsRequestList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#Phase2EncryptionAlgorithmsRequestListValue\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#Phase2EncryptionAlgorithmsRequestListValue\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Value\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The encryption algorithm.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Specifies the encryption algorithm for the VPN tunnel for phase 2 IKE\\n            negotiations.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#Phase2IntegrityAlgorithmsList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#Phase2IntegrityAlgorithmsListValue\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#Phase2IntegrityAlgorithmsListValue\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Value\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Value\",\n                        \"smithy.api#documentation\": \"<p>The integrity algorithm.</p>\",\n                        \"smithy.api#xmlName\": \"value\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The integrity algorithm for phase 2 IKE negotiations.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#Phase2IntegrityAlgorithmsRequestList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#Phase2IntegrityAlgorithmsRequestListValue\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#Phase2IntegrityAlgorithmsRequestListValue\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Value\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The integrity algorithm.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Specifies the integrity algorithm for the VPN tunnel for phase 2 IKE\\n            negotiations.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#PhcSupport\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"UNSUPPORTED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"unsupported\"\n                    }\n                },\n                \"SUPPORTED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"supported\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#Placement\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AvailabilityZoneId\": {\n                    \"target\": \"com.amazonaws.ec2#AvailabilityZoneId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AvailabilityZoneId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Availability Zone of the instance.</p>\\n         <p>On input, you can specify <code>AvailabilityZone</code> or <code>AvailabilityZoneId</code>, \\n            but not both. If you specify neither one, Amazon EC2 automatically selects an Availability Zone\\n            for you.</p>\\n         <p>This parameter is not supported for <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateFleet\\\">CreateFleet</a>.</p>\",\n                        \"smithy.api#xmlName\": \"availabilityZoneId\"\n                    }\n                },\n                \"Affinity\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Affinity\",\n                        \"smithy.api#documentation\": \"<p>The affinity setting for the instance on the Dedicated Host.</p>\\n         <p>This parameter is not supported for <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateFleet\\\">CreateFleet</a> or <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ImportInstance.html\\\">ImportInstance</a>.</p>\",\n                        \"smithy.api#xmlName\": \"affinity\"\n                    }\n                },\n                \"GroupName\": {\n                    \"target\": \"com.amazonaws.ec2#PlacementGroupName\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"GroupName\",\n                        \"smithy.api#documentation\": \"<p>The name of the placement group that the instance is in.</p>\\n         <p>On input, you can specify <code>GroupId</code> or <code>GroupName</code>,\\n            but not both.</p>\",\n                        \"smithy.api#xmlName\": \"groupName\"\n                    }\n                },\n                \"PartitionNumber\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PartitionNumber\",\n                        \"smithy.api#documentation\": \"<p>The number of the partition that the instance is in. Valid only if the placement group\\n            strategy is set to <code>partition</code>.</p>\\n         <p>This parameter is not supported for <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateFleet\\\">CreateFleet</a>.</p>\",\n                        \"smithy.api#xmlName\": \"partitionNumber\"\n                    }\n                },\n                \"HostId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"HostId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Dedicated Host on which the instance resides.</p>\\n         <p>This parameter is not supported for <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateFleet\\\">CreateFleet</a> or <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ImportInstance.html\\\">ImportInstance</a>.</p>\",\n                        \"smithy.api#xmlName\": \"hostId\"\n                    }\n                },\n                \"Tenancy\": {\n                    \"target\": \"com.amazonaws.ec2#Tenancy\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Tenancy\",\n                        \"smithy.api#documentation\": \"<p>The tenancy of the instance. An instance with a\\n            tenancy of <code>dedicated</code> runs on single-tenant hardware.</p>\\n         <p>This parameter is not supported for <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateFleet\\\">CreateFleet</a>. The\\n                <code>host</code> tenancy is not supported for <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ImportInstance.html\\\">ImportInstance</a> or\\n            for T3 instances that are configured for the <code>unlimited</code> CPU credit\\n            option.</p>\",\n                        \"smithy.api#xmlName\": \"tenancy\"\n                    }\n                },\n                \"SpreadDomain\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SpreadDomain\",\n                        \"smithy.api#documentation\": \"<p>Reserved for future use.</p>\",\n                        \"smithy.api#xmlName\": \"spreadDomain\"\n                    }\n                },\n                \"HostResourceGroupArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"HostResourceGroupArn\",\n                        \"smithy.api#documentation\": \"<p>The ARN of the host resource group in which to launch the instances.</p>\\n         <p>On input, if you specify this parameter, either omit the <b>Tenancy</b> parameter or set it to <code>host</code>.</p>\\n         <p>This parameter is not supported for <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateFleet\\\">CreateFleet</a>.</p>\",\n                        \"smithy.api#xmlName\": \"hostResourceGroupArn\"\n                    }\n                },\n                \"GroupId\": {\n                    \"target\": \"com.amazonaws.ec2#PlacementGroupId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"GroupId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the placement group that the instance is in.</p>\\n         <p>On input, you can specify <code>GroupId</code> or <code>GroupName</code>,\\n            but not both.</p>\",\n                        \"smithy.api#xmlName\": \"groupId\"\n                    }\n                },\n                \"AvailabilityZone\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AvailabilityZone\",\n                        \"smithy.api#documentation\": \"<p>The Availability Zone of the instance.</p>\\n         <p>On input, you can specify <code>AvailabilityZone</code> or <code>AvailabilityZoneId</code>, \\n            but not both. If you specify neither one, Amazon EC2 automatically selects an Availability Zone\\n            for you.</p>\\n         <p>This parameter is not supported for <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateFleet\\\">CreateFleet</a>.</p>\",\n                        \"smithy.api#xmlName\": \"availabilityZone\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the placement of an instance.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#PlacementGroup\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"GroupName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"GroupName\",\n                        \"smithy.api#documentation\": \"<p>The name of the placement group.</p>\",\n                        \"smithy.api#xmlName\": \"groupName\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#PlacementGroupState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The state of the placement group.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                },\n                \"Strategy\": {\n                    \"target\": \"com.amazonaws.ec2#PlacementStrategy\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Strategy\",\n                        \"smithy.api#documentation\": \"<p>The placement strategy.</p>\",\n                        \"smithy.api#xmlName\": \"strategy\"\n                    }\n                },\n                \"PartitionCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PartitionCount\",\n                        \"smithy.api#documentation\": \"<p>The number of partitions. Valid only if <b>strategy</b> is\\n            set to <code>partition</code>.</p>\",\n                        \"smithy.api#xmlName\": \"partitionCount\"\n                    }\n                },\n                \"GroupId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"GroupId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the placement group.</p>\",\n                        \"smithy.api#xmlName\": \"groupId\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>Any tags applied to the placement group.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                },\n                \"GroupArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"GroupArn\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the placement group.</p>\",\n                        \"smithy.api#xmlName\": \"groupArn\"\n                    }\n                },\n                \"SpreadLevel\": {\n                    \"target\": \"com.amazonaws.ec2#SpreadLevel\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SpreadLevel\",\n                        \"smithy.api#documentation\": \"<p>The spread level for the placement group. <i>Only</i> Outpost placement\\n            groups can be spread across hosts.</p>\",\n                        \"smithy.api#xmlName\": \"spreadLevel\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a placement group.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#PlacementGroupArn\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#pattern\": \"^arn:aws([a-z-]+)?:ec2:[a-z\\\\d-]+:\\\\d{12}:placement-group/^.{1,255}$\"\n            }\n        },\n        \"com.amazonaws.ec2#PlacementGroupId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#PlacementGroupIdStringList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#PlacementGroupId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"GroupId\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#PlacementGroupInfo\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SupportedStrategies\": {\n                    \"target\": \"com.amazonaws.ec2#PlacementGroupStrategyList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SupportedStrategies\",\n                        \"smithy.api#documentation\": \"<p>The supported placement group types.</p>\",\n                        \"smithy.api#xmlName\": \"supportedStrategies\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the placement group support of the instance type.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#PlacementGroupList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#PlacementGroup\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#PlacementGroupName\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#PlacementGroupState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"pending\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"pending\"\n                    }\n                },\n                \"available\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"available\"\n                    }\n                },\n                \"deleting\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"deleting\"\n                    }\n                },\n                \"deleted\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"deleted\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#PlacementGroupStrategy\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"cluster\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"cluster\"\n                    }\n                },\n                \"partition\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"partition\"\n                    }\n                },\n                \"spread\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"spread\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#PlacementGroupStrategyList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#PlacementGroupStrategy\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#PlacementGroupStringList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#PlacementGroupName\"\n            }\n        },\n        \"com.amazonaws.ec2#PlacementResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"GroupName\": {\n                    \"target\": \"com.amazonaws.ec2#PlacementGroupName\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"GroupName\",\n                        \"smithy.api#documentation\": \"<p>The name of the placement group that the instance is in.</p>\",\n                        \"smithy.api#xmlName\": \"groupName\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the placement of an instance.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#PlacementStrategy\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"cluster\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"cluster\"\n                    }\n                },\n                \"spread\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"spread\"\n                    }\n                },\n                \"partition\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"partition\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#PlatformValues\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"Windows\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Windows\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#PoolCidrBlock\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Cidr\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PoolCidrBlock\",\n                        \"smithy.api#documentation\": \"<p>The CIDR block.</p>\",\n                        \"smithy.api#xmlName\": \"poolCidrBlock\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a CIDR block for an address pool.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#PoolCidrBlocksSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#PoolCidrBlock\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#PoolMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 10\n                }\n            }\n        },\n        \"com.amazonaws.ec2#Port\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 0,\n                    \"max\": 65535\n                }\n            }\n        },\n        \"com.amazonaws.ec2#PortRange\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"From\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"From\",\n                        \"smithy.api#documentation\": \"<p>The first port in the range.</p>\",\n                        \"smithy.api#xmlName\": \"from\"\n                    }\n                },\n                \"To\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"To\",\n                        \"smithy.api#documentation\": \"<p>The last port in the range.</p>\",\n                        \"smithy.api#xmlName\": \"to\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a range of ports.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#PortRangeList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#PortRange\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#PrefixList\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Cidrs\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CidrSet\",\n                        \"smithy.api#documentation\": \"<p>The IP address range of the Amazon Web Services service.</p>\",\n                        \"smithy.api#xmlName\": \"cidrSet\"\n                    }\n                },\n                \"PrefixListId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PrefixListId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the prefix.</p>\",\n                        \"smithy.api#xmlName\": \"prefixListId\"\n                    }\n                },\n                \"PrefixListName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PrefixListName\",\n                        \"smithy.api#documentation\": \"<p>The name of the prefix.</p>\",\n                        \"smithy.api#xmlName\": \"prefixListName\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes prefixes for Amazon Web Services services.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#PrefixListAssociation\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ResourceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResourceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the resource.</p>\",\n                        \"smithy.api#xmlName\": \"resourceId\"\n                    }\n                },\n                \"ResourceOwner\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResourceOwner\",\n                        \"smithy.api#documentation\": \"<p>The owner of the resource.</p>\",\n                        \"smithy.api#xmlName\": \"resourceOwner\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the resource with which a prefix list is associated.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#PrefixListAssociationSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#PrefixListAssociation\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#PrefixListEntry\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Cidr\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Cidr\",\n                        \"smithy.api#documentation\": \"<p>The CIDR block.</p>\",\n                        \"smithy.api#xmlName\": \"cidr\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Description\",\n                        \"smithy.api#documentation\": \"<p>The description.</p>\",\n                        \"smithy.api#xmlName\": \"description\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a prefix list entry.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#PrefixListEntrySet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#PrefixListEntry\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#PrefixListId\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Description\",\n                        \"smithy.api#documentation\": \"<p>A description for the security group rule that references this prefix list ID.</p>\\n         <p>Constraints: Up to 255 characters in length. Allowed characters are a-z, A-Z, 0-9,\\n      spaces, and ._-:/()#,@[]+=;{}!$*</p>\",\n                        \"smithy.api#xmlName\": \"description\"\n                    }\n                },\n                \"PrefixListId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PrefixListId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the prefix.</p>\",\n                        \"smithy.api#xmlName\": \"prefixListId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a prefix list ID.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#PrefixListIdList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#PrefixListId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#PrefixListIdSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#String\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#PrefixListMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 100\n                }\n            }\n        },\n        \"com.amazonaws.ec2#PrefixListResourceId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#PrefixListResourceIdStringList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#PrefixListResourceId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#PrefixListSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#PrefixList\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#PrefixListState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"create_in_progress\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"create-in-progress\"\n                    }\n                },\n                \"create_complete\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"create-complete\"\n                    }\n                },\n                \"create_failed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"create-failed\"\n                    }\n                },\n                \"modify_in_progress\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"modify-in-progress\"\n                    }\n                },\n                \"modify_complete\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"modify-complete\"\n                    }\n                },\n                \"modify_failed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"modify-failed\"\n                    }\n                },\n                \"restore_in_progress\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"restore-in-progress\"\n                    }\n                },\n                \"restore_complete\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"restore-complete\"\n                    }\n                },\n                \"restore_failed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"restore-failed\"\n                    }\n                },\n                \"delete_in_progress\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"delete-in-progress\"\n                    }\n                },\n                \"delete_complete\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"delete-complete\"\n                    }\n                },\n                \"delete_failed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"delete-failed\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#PriceSchedule\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Active\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Active\",\n                        \"smithy.api#documentation\": \"<p>The current price schedule, as determined by the term remaining for the Reserved Instance\\n      in the listing.</p>\\n         <p>A specific price schedule is always in effect, but only one price schedule can be active\\n      at any time. Take, for example, a Reserved Instance listing that has five months remaining in\\n      its term. When you specify price schedules for five months and two months, this means that\\n      schedule 1, covering the first three months of the remaining term, will be active during\\n      months 5, 4, and 3. Then schedule 2, covering the last two months of the term, will be active\\n      for months 2 and 1.</p>\",\n                        \"smithy.api#xmlName\": \"active\"\n                    }\n                },\n                \"CurrencyCode\": {\n                    \"target\": \"com.amazonaws.ec2#CurrencyCodeValues\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CurrencyCode\",\n                        \"smithy.api#documentation\": \"<p>The currency for transacting the Reserved Instance resale. At this time, the only\\n      supported currency is <code>USD</code>.</p>\",\n                        \"smithy.api#xmlName\": \"currencyCode\"\n                    }\n                },\n                \"Price\": {\n                    \"target\": \"com.amazonaws.ec2#Double\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Price\",\n                        \"smithy.api#documentation\": \"<p>The fixed price for the term.</p>\",\n                        \"smithy.api#xmlName\": \"price\"\n                    }\n                },\n                \"Term\": {\n                    \"target\": \"com.amazonaws.ec2#Long\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Term\",\n                        \"smithy.api#documentation\": \"<p>The number of months remaining in the reservation. For example, 2 is the second to the\\n      last month before the capacity reservation expires.</p>\",\n                        \"smithy.api#xmlName\": \"term\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the price for a Reserved Instance.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#PriceScheduleList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#PriceSchedule\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#PriceScheduleSpecification\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Term\": {\n                    \"target\": \"com.amazonaws.ec2#Long\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Term\",\n                        \"smithy.api#documentation\": \"<p>The number of months remaining in the reservation. For example, 2 is the second to the\\n      last month before the capacity reservation expires.</p>\",\n                        \"smithy.api#xmlName\": \"term\"\n                    }\n                },\n                \"Price\": {\n                    \"target\": \"com.amazonaws.ec2#Double\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Price\",\n                        \"smithy.api#documentation\": \"<p>The fixed price for the term.</p>\",\n                        \"smithy.api#xmlName\": \"price\"\n                    }\n                },\n                \"CurrencyCode\": {\n                    \"target\": \"com.amazonaws.ec2#CurrencyCodeValues\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CurrencyCode\",\n                        \"smithy.api#documentation\": \"<p>The currency for transacting the Reserved Instance resale. At this time, the only\\n      supported currency is <code>USD</code>.</p>\",\n                        \"smithy.api#xmlName\": \"currencyCode\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the price for a Reserved Instance.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#PriceScheduleSpecificationList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#PriceScheduleSpecification\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#PricingDetail\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Count\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Count\",\n                        \"smithy.api#documentation\": \"<p>The number of reservations available for the price.</p>\",\n                        \"smithy.api#xmlName\": \"count\"\n                    }\n                },\n                \"Price\": {\n                    \"target\": \"com.amazonaws.ec2#Double\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Price\",\n                        \"smithy.api#documentation\": \"<p>The price per instance.</p>\",\n                        \"smithy.api#xmlName\": \"price\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a Reserved Instance offering.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#PricingDetailsList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#PricingDetail\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#PrincipalIdFormat\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Arn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Arn\",\n                        \"smithy.api#documentation\": \"<p>PrincipalIdFormatARN description</p>\",\n                        \"smithy.api#xmlName\": \"arn\"\n                    }\n                },\n                \"Statuses\": {\n                    \"target\": \"com.amazonaws.ec2#IdFormatList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"StatusSet\",\n                        \"smithy.api#documentation\": \"<p>PrincipalIdFormatStatuses description</p>\",\n                        \"smithy.api#xmlName\": \"statusSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>PrincipalIdFormat description</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#PrincipalIdFormatList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#PrincipalIdFormat\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#PrincipalType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"All\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"All\"\n                    }\n                },\n                \"Service\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Service\"\n                    }\n                },\n                \"OrganizationUnit\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"OrganizationUnit\"\n                    }\n                },\n                \"Account\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Account\"\n                    }\n                },\n                \"User\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"User\"\n                    }\n                },\n                \"Role\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Role\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#Priority\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": -1,\n                    \"max\": 65535\n                }\n            }\n        },\n        \"com.amazonaws.ec2#PrivateDnsDetails\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PrivateDnsName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PrivateDnsName\",\n                        \"smithy.api#documentation\": \"<p>The private DNS name assigned to the VPC endpoint service.</p>\",\n                        \"smithy.api#xmlName\": \"privateDnsName\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about the Private DNS name for interface endpoints.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#PrivateDnsDetailsSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#PrivateDnsDetails\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#PrivateDnsNameConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#DnsNameState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The verification state of the VPC endpoint service.</p>\\n         <p>>Consumers\\n            of the endpoint service can use the private name only when the state is\\n                <code>verified</code>.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                },\n                \"Type\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Type\",\n                        \"smithy.api#documentation\": \"<p>The endpoint service verification type, for example TXT.</p>\",\n                        \"smithy.api#xmlName\": \"type\"\n                    }\n                },\n                \"Value\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Value\",\n                        \"smithy.api#documentation\": \"<p>The value the service provider adds to the private DNS name domain record before verification.</p>\",\n                        \"smithy.api#xmlName\": \"value\"\n                    }\n                },\n                \"Name\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Name\",\n                        \"smithy.api#documentation\": \"<p>The name of the record subdomain the service provider needs to create. The service provider adds the <code>value</code> text to the <code>name</code>.</p>\",\n                        \"smithy.api#xmlName\": \"name\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about the private DNS name for the service endpoint.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#PrivateDnsNameOptionsOnLaunch\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"HostnameType\": {\n                    \"target\": \"com.amazonaws.ec2#HostnameType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"HostnameType\",\n                        \"smithy.api#documentation\": \"<p>The type of hostname for EC2 instances. For IPv4 only subnets, an instance DNS name\\n            must be based on the instance IPv4 address. For IPv6 only subnets, an instance DNS name\\n            must be based on the instance ID. For dual-stack subnets, you can specify whether DNS\\n            names use the instance IPv4 address or the instance ID.</p>\",\n                        \"smithy.api#xmlName\": \"hostnameType\"\n                    }\n                },\n                \"EnableResourceNameDnsARecord\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EnableResourceNameDnsARecord\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether to respond to DNS queries for instance hostnames with DNS A\\n            records.</p>\",\n                        \"smithy.api#xmlName\": \"enableResourceNameDnsARecord\"\n                    }\n                },\n                \"EnableResourceNameDnsAAAARecord\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EnableResourceNameDnsAAAARecord\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether to respond to DNS queries for instance hostname with DNS AAAA\\n            records.</p>\",\n                        \"smithy.api#xmlName\": \"enableResourceNameDnsAAAARecord\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the options for instance hostnames.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#PrivateDnsNameOptionsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"HostnameType\": {\n                    \"target\": \"com.amazonaws.ec2#HostnameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of hostname for EC2 instances. For IPv4 only subnets, an instance DNS name\\n            must be based on the instance IPv4 address. For IPv6 only subnets, an instance DNS name\\n            must be based on the instance ID. For dual-stack subnets, you can specify whether DNS\\n            names use the instance IPv4 address or the instance ID.</p>\"\n                    }\n                },\n                \"EnableResourceNameDnsARecord\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether to respond to DNS queries for instance hostnames with DNS A\\n            records.</p>\"\n                    }\n                },\n                \"EnableResourceNameDnsAAAARecord\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether to respond to DNS queries for instance hostnames with DNS AAAA\\n            records.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the options for instance hostnames.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#PrivateDnsNameOptionsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"HostnameType\": {\n                    \"target\": \"com.amazonaws.ec2#HostnameType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"HostnameType\",\n                        \"smithy.api#documentation\": \"<p>The type of hostname to assign to an instance.</p>\",\n                        \"smithy.api#xmlName\": \"hostnameType\"\n                    }\n                },\n                \"EnableResourceNameDnsARecord\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EnableResourceNameDnsARecord\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether to respond to DNS queries for instance hostnames with DNS A\\n            records.</p>\",\n                        \"smithy.api#xmlName\": \"enableResourceNameDnsARecord\"\n                    }\n                },\n                \"EnableResourceNameDnsAAAARecord\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EnableResourceNameDnsAAAARecord\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether to respond to DNS queries for instance hostnames with DNS AAAA\\n            records.</p>\",\n                        \"smithy.api#xmlName\": \"enableResourceNameDnsAAAARecord\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the options for instance hostnames.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#PrivateIpAddressConfigSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ScheduledInstancesPrivateIpAddressConfig\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"PrivateIpAddressConfigSet\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#PrivateIpAddressCount\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 31\n                }\n            }\n        },\n        \"com.amazonaws.ec2#PrivateIpAddressSpecification\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Primary\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Primary\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether the private IPv4 address is the primary private IPv4 address. Only\\n            one IPv4 address can be designated as primary.</p>\",\n                        \"smithy.api#xmlName\": \"primary\"\n                    }\n                },\n                \"PrivateIpAddress\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PrivateIpAddress\",\n                        \"smithy.api#documentation\": \"<p>The private IPv4 address.</p>\",\n                        \"smithy.api#xmlName\": \"privateIpAddress\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a secondary private IPv4 address for a network interface.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#PrivateIpAddressSpecificationList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#PrivateIpAddressSpecification\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#PrivateIpAddressStringList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#String\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"PrivateIpAddress\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ProcessorInfo\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SupportedArchitectures\": {\n                    \"target\": \"com.amazonaws.ec2#ArchitectureTypeList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SupportedArchitectures\",\n                        \"smithy.api#documentation\": \"<p>The architectures supported by the instance type.</p>\",\n                        \"smithy.api#xmlName\": \"supportedArchitectures\"\n                    }\n                },\n                \"SustainedClockSpeedInGhz\": {\n                    \"target\": \"com.amazonaws.ec2#ProcessorSustainedClockSpeed\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SustainedClockSpeedInGhz\",\n                        \"smithy.api#documentation\": \"<p>The speed of the processor, in GHz.</p>\",\n                        \"smithy.api#xmlName\": \"sustainedClockSpeedInGhz\"\n                    }\n                },\n                \"SupportedFeatures\": {\n                    \"target\": \"com.amazonaws.ec2#SupportedAdditionalProcessorFeatureList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SupportedFeatures\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether the instance type supports AMD SEV-SNP. If the request returns\\n    <code>amd-sev-snp</code>, AMD SEV-SNP is supported. Otherwise, it is not supported. For more\\n   information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/sev-snp.html\\\"> AMD\\n    SEV-SNP</a>.</p>\",\n                        \"smithy.api#xmlName\": \"supportedFeatures\"\n                    }\n                },\n                \"Manufacturer\": {\n                    \"target\": \"com.amazonaws.ec2#CpuManufacturerName\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Manufacturer\",\n                        \"smithy.api#documentation\": \"<p>The manufacturer of the processor.</p>\",\n                        \"smithy.api#xmlName\": \"manufacturer\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the processor used by the instance type.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ProcessorSustainedClockSpeed\": {\n            \"type\": \"double\"\n        },\n        \"com.amazonaws.ec2#ProductCode\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ProductCodeId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ProductCode\",\n                        \"smithy.api#documentation\": \"<p>The product code.</p>\",\n                        \"smithy.api#xmlName\": \"productCode\"\n                    }\n                },\n                \"ProductCodeType\": {\n                    \"target\": \"com.amazonaws.ec2#ProductCodeValues\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Type\",\n                        \"smithy.api#documentation\": \"<p>The type of product code.</p>\",\n                        \"smithy.api#xmlName\": \"type\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a product code.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ProductCodeList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ProductCode\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ProductCodeStringList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#String\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"ProductCode\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ProductCodeValues\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"devpay\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"devpay\"\n                    }\n                },\n                \"marketplace\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"marketplace\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ProductDescriptionList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#String\"\n            }\n        },\n        \"com.amazonaws.ec2#PropagatingVgw\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"GatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"GatewayId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the virtual private gateway.</p>\",\n                        \"smithy.api#xmlName\": \"gatewayId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a virtual private gateway propagating route.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#PropagatingVgwList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#PropagatingVgw\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#Protocol\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"tcp\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"tcp\"\n                    }\n                },\n                \"udp\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"udp\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ProtocolInt\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 0,\n                    \"max\": 255\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ProtocolIntList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ProtocolInt\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ProtocolList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#Protocol\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ProtocolValue\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"gre\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"gre\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ProvisionByoipCidr\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ProvisionByoipCidrRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ProvisionByoipCidrResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Provisions an IPv4 or IPv6 address range for use with your Amazon Web Services resources through bring your own IP \\n         addresses (BYOIP) and creates a corresponding address pool. After the address range is\\n         provisioned, it is ready to be advertised.</p>\\n         <p>Amazon Web Services verifies that you own the address range and are authorized to advertise it. \\n         You must ensure that the address range is registered to you and that you created an \\n         RPKI ROA to authorize Amazon ASNs 16509 and 14618 to advertise the address range. \\n         For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-byoip.html\\\">Bring your own IP addresses (BYOIP)</a> in the <i>Amazon EC2 User Guide</i>.</p>\\n         <p>Provisioning an address range is an asynchronous operation, so the call returns immediately,\\n         but the address range is not ready to use until its status changes from <code>pending-provision</code>\\n          to <code>provisioned</code>. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/byoip-onboard.html\\\">Onboard your address range</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ProvisionByoipCidrRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Cidr\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The public IPv4 or IPv6 address range, in CIDR notation. The most specific IPv4 prefix that you can \\n          specify is /24. The most specific IPv6 address range that you can bring is /48 for CIDRs that are publicly advertisable and /56 for CIDRs that are not publicly advertisable. The address range cannot overlap with another address range that you've \\n         brought to this or another Region.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"CidrAuthorizationContext\": {\n                    \"target\": \"com.amazonaws.ec2#CidrAuthorizationContext\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A signed document that proves that you are authorized to bring the specified IP address \\n         range to Amazon using BYOIP.</p>\"\n                    }\n                },\n                \"PubliclyAdvertisable\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>(IPv6 only) Indicate whether the address range will be publicly advertised to the\\n            internet.</p>\\n         <p>Default: true</p>\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A description for the address range and the address pool.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"PoolTagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags to apply to the address pool.</p>\",\n                        \"smithy.api#xmlName\": \"PoolTagSpecification\"\n                    }\n                },\n                \"MultiRegion\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Reserved.</p>\"\n                    }\n                },\n                \"NetworkBorderGroup\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If you have <a href=\\\"https://docs.aws.amazon.com/local-zones/latest/ug/how-local-zones-work.html\\\">Local Zones</a> enabled, you can choose a network border group for Local Zones when you provision and advertise a BYOIPv4 CIDR. Choose the network border group carefully as the EIP and the Amazon Web Services resource it is associated with must reside in the same network border group.</p>\\n         <p>You can provision BYOIP address ranges to and advertise them in the following Local Zone network border groups:</p>\\n         <ul>\\n            <li>\\n               <p>us-east-1-dfw-2</p>\\n            </li>\\n            <li>\\n               <p>us-west-2-lax-1</p>\\n            </li>\\n            <li>\\n               <p>us-west-2-phx-2</p>\\n            </li>\\n         </ul>\\n         <note>\\n            <p>You cannot provision or advertise BYOIPv6 address ranges in Local Zones at this time.</p>\\n         </note>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ProvisionByoipCidrResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ByoipCidr\": {\n                    \"target\": \"com.amazonaws.ec2#ByoipCidr\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ByoipCidr\",\n                        \"smithy.api#documentation\": \"<p>Information about the address range.</p>\",\n                        \"smithy.api#xmlName\": \"byoipCidr\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ProvisionIpamByoasn\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ProvisionIpamByoasnRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ProvisionIpamByoasnResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Provisions your Autonomous System Number (ASN) for use in your Amazon Web Services account. This action requires authorization context for Amazon to bring the ASN to an Amazon Web Services account. For more information, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/ipam/tutorials-byoasn.html\\\">Tutorial: Bring your ASN to IPAM</a> in the <i>Amazon VPC IPAM guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ProvisionIpamByoasnRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"IpamId\": {\n                    \"target\": \"com.amazonaws.ec2#IpamId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>An IPAM ID.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Asn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>A public 2-byte or 4-byte ASN.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"AsnAuthorizationContext\": {\n                    \"target\": \"com.amazonaws.ec2#AsnAuthorizationContext\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>An ASN authorization context.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ProvisionIpamByoasnResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Byoasn\": {\n                    \"target\": \"com.amazonaws.ec2#Byoasn\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Byoasn\",\n                        \"smithy.api#documentation\": \"<p>An ASN and BYOIP CIDR association.</p>\",\n                        \"smithy.api#xmlName\": \"byoasn\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ProvisionIpamPoolCidr\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ProvisionIpamPoolCidrRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ProvisionIpamPoolCidrResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Provision a CIDR to an IPAM pool. You can use this action to provision new CIDRs to a top-level pool or to transfer a CIDR from a top-level pool to a pool within it.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/ipam/prov-cidr-ipam.html\\\">Provision CIDRs to pools</a> in the <i>Amazon VPC IPAM User Guide</i>.\\n      </p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ProvisionIpamPoolCidrRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A check for whether you have the required permissions for the action without actually making the request \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"IpamPoolId\": {\n                    \"target\": \"com.amazonaws.ec2#IpamPoolId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the IPAM pool to which you want to assign a CIDR.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Cidr\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The CIDR you want to assign to the IPAM pool. Either \\\"NetmaskLength\\\" or \\\"Cidr\\\" is required. This value will be null if you specify \\\"NetmaskLength\\\" and will be filled in during the provisioning process.</p>\"\n                    }\n                },\n                \"CidrAuthorizationContext\": {\n                    \"target\": \"com.amazonaws.ec2#IpamCidrAuthorizationContext\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A signed document that proves that you are authorized to bring a specified IP address range to Amazon using BYOIP. This option only applies to IPv4 and IPv6 pools in the public scope.</p>\"\n                    }\n                },\n                \"NetmaskLength\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The netmask length of the CIDR you'd like to provision to a pool. Can be used for provisioning Amazon-provided IPv6 CIDRs to top-level pools and for provisioning CIDRs to pools with source pools. Cannot be used to provision BYOIP CIDRs to top-level pools. Either \\\"NetmaskLength\\\" or \\\"Cidr\\\" is required.</p>\"\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A unique, case-sensitive identifier that you provide to ensure the idempotency of the request. For more information, see <a href=\\\"https://docs.aws.amazon.com/ec2/latest/devguide/ec2-api-idempotency.html\\\">Ensuring idempotency</a>.</p>\",\n                        \"smithy.api#idempotencyToken\": {}\n                    }\n                },\n                \"VerificationMethod\": {\n                    \"target\": \"com.amazonaws.ec2#VerificationMethod\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The method for verifying control of a public IP address range. Defaults to <code>remarks-x509</code> if not specified. This option only applies to IPv4 and IPv6 pools in the public scope.</p>\"\n                    }\n                },\n                \"IpamExternalResourceVerificationTokenId\": {\n                    \"target\": \"com.amazonaws.ec2#IpamExternalResourceVerificationTokenId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Verification token ID. This option only applies to IPv4 and IPv6 pools in the public scope.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ProvisionIpamPoolCidrResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"IpamPoolCidr\": {\n                    \"target\": \"com.amazonaws.ec2#IpamPoolCidr\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpamPoolCidr\",\n                        \"smithy.api#documentation\": \"<p>Information about the provisioned CIDR.</p>\",\n                        \"smithy.api#xmlName\": \"ipamPoolCidr\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ProvisionPublicIpv4PoolCidr\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ProvisionPublicIpv4PoolCidrRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ProvisionPublicIpv4PoolCidrResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Provision a CIDR to a public IPv4 pool.</p>\\n         <p>For more information about IPAM, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/ipam/what-is-it-ipam.html\\\">What is IPAM?</a> in the <i>Amazon VPC IPAM User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ProvisionPublicIpv4PoolCidrRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A check for whether you have the required permissions for the action without actually making the request \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"IpamPoolId\": {\n                    \"target\": \"com.amazonaws.ec2#IpamPoolId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the IPAM pool you would like to use to allocate this CIDR.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"PoolId\": {\n                    \"target\": \"com.amazonaws.ec2#Ipv4PoolEc2Id\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the public IPv4 pool you would like to use for this CIDR.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"NetmaskLength\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The netmask length of the CIDR you would like to allocate to the public IPv4 pool. The least specific netmask length you can define is 24.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"NetworkBorderGroup\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Availability Zone (AZ) or Local Zone (LZ) network border group that the resource that the IP address is assigned to is in. Defaults to an AZ network border group. For more information on available Local Zones, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-byoip.html#byoip-zone-avail\\\">Local Zone availability</a> in the <i>Amazon EC2 User Guide</i>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ProvisionPublicIpv4PoolCidrResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PoolId\": {\n                    \"target\": \"com.amazonaws.ec2#Ipv4PoolEc2Id\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PoolId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the pool that you want to provision the CIDR to.</p>\",\n                        \"smithy.api#xmlName\": \"poolId\"\n                    }\n                },\n                \"PoolAddressRange\": {\n                    \"target\": \"com.amazonaws.ec2#PublicIpv4PoolRange\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PoolAddressRange\",\n                        \"smithy.api#documentation\": \"<p>Information about the address range of the public IPv4 pool.</p>\",\n                        \"smithy.api#xmlName\": \"poolAddressRange\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ProvisionedBandwidth\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ProvisionTime\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ProvisionTime\",\n                        \"smithy.api#documentation\": \"<p>Reserved.</p>\",\n                        \"smithy.api#xmlName\": \"provisionTime\"\n                    }\n                },\n                \"Provisioned\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Provisioned\",\n                        \"smithy.api#documentation\": \"<p>Reserved.</p>\",\n                        \"smithy.api#xmlName\": \"provisioned\"\n                    }\n                },\n                \"RequestTime\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RequestTime\",\n                        \"smithy.api#documentation\": \"<p>Reserved.</p>\",\n                        \"smithy.api#xmlName\": \"requestTime\"\n                    }\n                },\n                \"Requested\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Requested\",\n                        \"smithy.api#documentation\": \"<p>Reserved.</p>\",\n                        \"smithy.api#xmlName\": \"requested\"\n                    }\n                },\n                \"Status\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Status\",\n                        \"smithy.api#documentation\": \"<p>Reserved.</p>\",\n                        \"smithy.api#xmlName\": \"status\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Reserved. If you need to sustain traffic greater than the <a href=\\\"https://docs.aws.amazon.com/vpc/latest/userguide/amazon-vpc-limits.html#vpc-limits-gateways\\\">documented limits</a>, \\n          contact Amazon Web Services Support.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#PtrUpdateStatus\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Value\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Value\",\n                        \"smithy.api#documentation\": \"<p>The value for the PTR record update.</p>\",\n                        \"smithy.api#xmlName\": \"value\"\n                    }\n                },\n                \"Status\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Status\",\n                        \"smithy.api#documentation\": \"<p>The status of the PTR record update.</p>\",\n                        \"smithy.api#xmlName\": \"status\"\n                    }\n                },\n                \"Reason\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Reason\",\n                        \"smithy.api#documentation\": \"<p>The reason for the PTR record update.</p>\",\n                        \"smithy.api#xmlName\": \"reason\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The status of an updated pointer (PTR) record for an Elastic IP address.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#PublicIpAddress\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#PublicIpDnsNameOptions\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DnsHostnameType\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DnsHostnameType\",\n                        \"smithy.api#documentation\": \"<p>The public hostname type. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-naming.html\\\">EC2 instance hostnames, DNS names, and domains</a> in the <i>Amazon EC2 User Guide</i>.</p>\",\n                        \"smithy.api#xmlName\": \"dnsHostnameType\"\n                    }\n                },\n                \"PublicIpv4DnsName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PublicIpv4DnsName\",\n                        \"smithy.api#documentation\": \"<p>An IPv4-enabled public hostname for a network interface. Requests from within the VPC resolve to the private primary IPv4 address of the network interface. Requests from the internet resolve to the public IPv4 address of the network interface.</p>\",\n                        \"smithy.api#xmlName\": \"publicIpv4DnsName\"\n                    }\n                },\n                \"PublicIpv6DnsName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PublicIpv6DnsName\",\n                        \"smithy.api#documentation\": \"<p>An IPv6-enabled public hostname for a network interface. Requests from within the VPC or from the internet resolve to the IPv6 GUA of the network interface.</p>\",\n                        \"smithy.api#xmlName\": \"publicIpv6DnsName\"\n                    }\n                },\n                \"PublicDualStackDnsName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PublicDualStackDnsName\",\n                        \"smithy.api#documentation\": \"<p>A dual-stack public hostname for a network interface. Requests from within the VPC resolve to both the private IPv4 address and the IPv6 Global Unicast Address of the network interface. Requests from the internet resolve to both the public IPv4 and the IPv6 GUA address of the network interface.</p>\",\n                        \"smithy.api#xmlName\": \"publicDualStackDnsName\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Public hostname type options. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-naming.html\\\">EC2 instance hostnames, DNS names, and domains</a> in the <i>Amazon EC2 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#PublicIpDnsOption\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"public_dual_stack_dns_name\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"public-dual-stack-dns-name\"\n                    }\n                },\n                \"public_ipv4_dns_name\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"public-ipv4-dns-name\"\n                    }\n                },\n                \"public_ipv6_dns_name\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"public-ipv6-dns-name\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#PublicIpStringList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#String\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"PublicIp\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#PublicIpv4Pool\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PoolId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PoolId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the address pool.</p>\",\n                        \"smithy.api#xmlName\": \"poolId\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Description\",\n                        \"smithy.api#documentation\": \"<p>A description of the address pool.</p>\",\n                        \"smithy.api#xmlName\": \"description\"\n                    }\n                },\n                \"PoolAddressRanges\": {\n                    \"target\": \"com.amazonaws.ec2#PublicIpv4PoolRangeSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PoolAddressRangeSet\",\n                        \"smithy.api#documentation\": \"<p>The address ranges.</p>\",\n                        \"smithy.api#xmlName\": \"poolAddressRangeSet\"\n                    }\n                },\n                \"TotalAddressCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TotalAddressCount\",\n                        \"smithy.api#documentation\": \"<p>The total number of addresses.</p>\",\n                        \"smithy.api#xmlName\": \"totalAddressCount\"\n                    }\n                },\n                \"TotalAvailableAddressCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TotalAvailableAddressCount\",\n                        \"smithy.api#documentation\": \"<p>The total number of available addresses.</p>\",\n                        \"smithy.api#xmlName\": \"totalAvailableAddressCount\"\n                    }\n                },\n                \"NetworkBorderGroup\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkBorderGroup\",\n                        \"smithy.api#documentation\": \"<p>The name of the location from which the address pool is advertised. \\n            A network border group is a unique set of Availability Zones or Local Zones \\n            from where Amazon Web Services advertises public IP addresses.</p>\",\n                        \"smithy.api#xmlName\": \"networkBorderGroup\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>Any tags for the address pool.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes an IPv4 address pool.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#PublicIpv4PoolIdStringList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#Ipv4PoolEc2Id\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#PublicIpv4PoolRange\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"FirstAddress\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"FirstAddress\",\n                        \"smithy.api#documentation\": \"<p>The first IP address in the range.</p>\",\n                        \"smithy.api#xmlName\": \"firstAddress\"\n                    }\n                },\n                \"LastAddress\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LastAddress\",\n                        \"smithy.api#documentation\": \"<p>The last IP address in the range.</p>\",\n                        \"smithy.api#xmlName\": \"lastAddress\"\n                    }\n                },\n                \"AddressCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AddressCount\",\n                        \"smithy.api#documentation\": \"<p>The number of addresses in the range.</p>\",\n                        \"smithy.api#xmlName\": \"addressCount\"\n                    }\n                },\n                \"AvailableAddressCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AvailableAddressCount\",\n                        \"smithy.api#documentation\": \"<p>The number of available addresses in the range.</p>\",\n                        \"smithy.api#xmlName\": \"availableAddressCount\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes an address range of an IPv4 address pool.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#PublicIpv4PoolRangeSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#PublicIpv4PoolRange\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#PublicIpv4PoolSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#PublicIpv4Pool\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#Purchase\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CurrencyCode\": {\n                    \"target\": \"com.amazonaws.ec2#CurrencyCodeValues\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CurrencyCode\",\n                        \"smithy.api#documentation\": \"<p>The currency in which the <code>UpfrontPrice</code> and <code>HourlyPrice</code>\\n            amounts are specified. At this time, the only supported currency is\\n            <code>USD</code>.</p>\",\n                        \"smithy.api#xmlName\": \"currencyCode\"\n                    }\n                },\n                \"Duration\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Duration\",\n                        \"smithy.api#documentation\": \"<p>The duration of the reservation's term in seconds.</p>\",\n                        \"smithy.api#xmlName\": \"duration\"\n                    }\n                },\n                \"HostIdSet\": {\n                    \"target\": \"com.amazonaws.ec2#ResponseHostIdSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"HostIdSet\",\n                        \"smithy.api#documentation\": \"<p>The IDs of the Dedicated Hosts associated with the reservation.</p>\",\n                        \"smithy.api#xmlName\": \"hostIdSet\"\n                    }\n                },\n                \"HostReservationId\": {\n                    \"target\": \"com.amazonaws.ec2#HostReservationId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"HostReservationId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the reservation.</p>\",\n                        \"smithy.api#xmlName\": \"hostReservationId\"\n                    }\n                },\n                \"HourlyPrice\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"HourlyPrice\",\n                        \"smithy.api#documentation\": \"<p>The hourly price of the reservation per hour.</p>\",\n                        \"smithy.api#xmlName\": \"hourlyPrice\"\n                    }\n                },\n                \"InstanceFamily\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceFamily\",\n                        \"smithy.api#documentation\": \"<p>The instance family on the Dedicated Host that the reservation can be associated\\n            with.</p>\",\n                        \"smithy.api#xmlName\": \"instanceFamily\"\n                    }\n                },\n                \"PaymentOption\": {\n                    \"target\": \"com.amazonaws.ec2#PaymentOption\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PaymentOption\",\n                        \"smithy.api#documentation\": \"<p>The payment option for the reservation.</p>\",\n                        \"smithy.api#xmlName\": \"paymentOption\"\n                    }\n                },\n                \"UpfrontPrice\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"UpfrontPrice\",\n                        \"smithy.api#documentation\": \"<p>The upfront price of the reservation.</p>\",\n                        \"smithy.api#xmlName\": \"upfrontPrice\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the result of the purchase.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#PurchaseCapacityBlock\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#PurchaseCapacityBlockRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#PurchaseCapacityBlockResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Purchase the Capacity Block for use with your account. With Capacity Blocks you ensure\\n\\t\\t\\tGPU capacity is available for machine learning (ML) workloads. You must specify the ID\\n\\t\\t\\tof the Capacity Block offering you are purchasing.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#PurchaseCapacityBlockExtension\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#PurchaseCapacityBlockExtensionRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#PurchaseCapacityBlockExtensionResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Purchase the Capacity Block extension for use with your account. You must specify the\\n\\t\\t\\tID of the Capacity Block extension offering you are purchasing.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#PurchaseCapacityBlockExtensionRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CapacityBlockExtensionOfferingId\": {\n                    \"target\": \"com.amazonaws.ec2#OfferingId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the Capacity Block extension offering to purchase.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"CapacityReservationId\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityReservationId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the Capacity reservation to be extended.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#PurchaseCapacityBlockExtensionResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CapacityBlockExtensions\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityBlockExtensionSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CapacityBlockExtensionSet\",\n                        \"smithy.api#documentation\": \"<p>The purchased Capacity Block extensions. </p>\",\n                        \"smithy.api#xmlName\": \"capacityBlockExtensionSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#PurchaseCapacityBlockRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags to apply to the Capacity Block during launch.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                },\n                \"CapacityBlockOfferingId\": {\n                    \"target\": \"com.amazonaws.ec2#OfferingId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the Capacity Block offering.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"InstancePlatform\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityReservationInstancePlatform\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The type of operating system for which to reserve capacity.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#PurchaseCapacityBlockResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CapacityReservation\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityReservation\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CapacityReservation\",\n                        \"smithy.api#documentation\": \"<p>The Capacity Reservation.</p>\",\n                        \"smithy.api#xmlName\": \"capacityReservation\"\n                    }\n                },\n                \"CapacityBlocks\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityBlockSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CapacityBlockSet\",\n                        \"smithy.api#documentation\": \"<p>The Capacity Block.</p>\",\n                        \"smithy.api#xmlName\": \"capacityBlockSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#PurchaseHostReservation\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#PurchaseHostReservationRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#PurchaseHostReservationResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Purchase a reservation with configurations that match those of your Dedicated Host.\\n            You must have active Dedicated Hosts in your account before you purchase a reservation.\\n            This action results in the specified reservation being purchased and charged to your\\n            account.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#PurchaseHostReservationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Unique, case-sensitive identifier that you provide to ensure the idempotency of the request. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Run_Instance_Idempotency.html\\\">Ensuring Idempotency</a>.</p>\"\n                    }\n                },\n                \"CurrencyCode\": {\n                    \"target\": \"com.amazonaws.ec2#CurrencyCodeValues\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The currency in which the <code>totalUpfrontPrice</code>, <code>LimitPrice</code>, and\\n                <code>totalHourlyPrice</code> amounts are specified. At this time, the only\\n            supported currency is <code>USD</code>.</p>\"\n                    }\n                },\n                \"HostIdSet\": {\n                    \"target\": \"com.amazonaws.ec2#RequestHostIdSet\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The IDs of the Dedicated Hosts with which the reservation will be associated.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"LimitPrice\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The specified limit is checked against the total upfront cost of the reservation\\n            (calculated as the offering's upfront cost multiplied by the host count). If the total\\n            upfront cost is greater than the specified price limit, the request fails. This is used\\n            to ensure that the purchase does not exceed the expected upfront cost of the purchase.\\n            At this time, the only supported currency is <code>USD</code>. For example, to indicate\\n            a limit price of USD 100, specify 100.00.</p>\"\n                    }\n                },\n                \"OfferingId\": {\n                    \"target\": \"com.amazonaws.ec2#OfferingId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the offering.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags to apply to the Dedicated Host Reservation during purchase.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#PurchaseHostReservationResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ClientToken\",\n                        \"smithy.api#documentation\": \"<p>Unique, case-sensitive identifier that you provide to ensure the idempotency of the request. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Run_Instance_Idempotency.html\\\">Ensuring Idempotency</a>.</p>\",\n                        \"smithy.api#xmlName\": \"clientToken\"\n                    }\n                },\n                \"CurrencyCode\": {\n                    \"target\": \"com.amazonaws.ec2#CurrencyCodeValues\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CurrencyCode\",\n                        \"smithy.api#documentation\": \"<p>The currency in which the <code>totalUpfrontPrice</code> and\\n                <code>totalHourlyPrice</code> amounts are specified. At this time, the only\\n            supported currency is <code>USD</code>.</p>\",\n                        \"smithy.api#xmlName\": \"currencyCode\"\n                    }\n                },\n                \"Purchase\": {\n                    \"target\": \"com.amazonaws.ec2#PurchaseSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Purchase\",\n                        \"smithy.api#documentation\": \"<p>Describes the details of the purchase.</p>\",\n                        \"smithy.api#xmlName\": \"purchase\"\n                    }\n                },\n                \"TotalHourlyPrice\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TotalHourlyPrice\",\n                        \"smithy.api#documentation\": \"<p>The total hourly price of the reservation calculated per hour.</p>\",\n                        \"smithy.api#xmlName\": \"totalHourlyPrice\"\n                    }\n                },\n                \"TotalUpfrontPrice\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TotalUpfrontPrice\",\n                        \"smithy.api#documentation\": \"<p>The total amount charged to your account when you purchase the reservation.</p>\",\n                        \"smithy.api#xmlName\": \"totalUpfrontPrice\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#PurchaseRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The number of instances.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"PurchaseToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The purchase token.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a request to purchase Scheduled Instances.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#PurchaseRequestSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#PurchaseRequest\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"PurchaseRequest\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1\n                }\n            }\n        },\n        \"com.amazonaws.ec2#PurchaseReservedInstancesOffering\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#PurchaseReservedInstancesOfferingRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#PurchaseReservedInstancesOfferingResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Purchases a Reserved Instance for use with your account. With Reserved Instances, you pay\\n      a lower hourly rate compared to On-Demand instance pricing.</p>\\n         <p>Use <a>DescribeReservedInstancesOfferings</a> to get a list of Reserved\\n      Instance offerings that match your specifications. After you've purchased a Reserved Instance,\\n      you can check for your new Reserved Instance with <a>DescribeReservedInstances</a>.</p>\\n         <p>To queue a purchase for a future date and time, specify a purchase time. If you do not\\n      specify a purchase time, the default is the current time.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/concepts-on-demand-reserved-instances.html\\\">Reserved\\n        Instances</a> and <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ri-market-general.html\\\">Sell in the Reserved Instance\\n        Marketplace</a> in the <i>Amazon EC2 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#PurchaseReservedInstancesOfferingRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The number of Reserved Instances to purchase.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ReservedInstancesOfferingId\": {\n                    \"target\": \"com.amazonaws.ec2#ReservedInstancesOfferingId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the Reserved Instance offering to purchase.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"PurchaseTime\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time at which to purchase the Reserved Instance, in UTC format (for example,\\n        <i>YYYY</i>-<i>MM</i>-<i>DD</i>T<i>HH</i>:<i>MM</i>:<i>SS</i>Z).</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making\\n      the request, and provides an error response. If you have the required permissions, the error\\n      response is <code>DryRunOperation</code>. Otherwise, it is\\n      <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"LimitPrice\": {\n                    \"target\": \"com.amazonaws.ec2#ReservedInstanceLimitPrice\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LimitPrice\",\n                        \"smithy.api#documentation\": \"<p>Specified for Reserved Instance Marketplace offerings to limit the total order and ensure\\n      that the Reserved Instances are not purchased at unexpected prices.</p>\",\n                        \"smithy.api#xmlName\": \"limitPrice\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the parameters for PurchaseReservedInstancesOffering.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#PurchaseReservedInstancesOfferingResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ReservedInstancesId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ReservedInstancesId\",\n                        \"smithy.api#documentation\": \"<p>The IDs of the purchased Reserved Instances. If your purchase crosses into a discounted\\n      pricing tier, the final Reserved Instances IDs might change. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/concepts-reserved-instances-application.html#crossing-pricing-tiers\\\">Crossing pricing tiers</a> in the <i>Amazon EC2 User Guide</i>.</p>\",\n                        \"smithy.api#xmlName\": \"reservedInstancesId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the output of PurchaseReservedInstancesOffering.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#PurchaseScheduledInstances\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#PurchaseScheduledInstancesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#PurchaseScheduledInstancesResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>You can no longer purchase Scheduled Instances.</p>\\n         </note>\\n         <p>Purchases the Scheduled Instances with the specified schedule.</p>\\n         <p>Scheduled Instances enable you to purchase Amazon EC2 compute capacity by the hour for a one-year term.\\n         Before you can purchase a Scheduled Instance, you must call <a>DescribeScheduledInstanceAvailability</a>\\n         to check for available schedules and obtain a purchase token. After you purchase a Scheduled Instance,\\n         you must call <a>RunScheduledInstances</a> during each scheduled time period.</p>\\n         <p>After you purchase a Scheduled Instance, you can't cancel, modify, or resell your purchase.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#PurchaseScheduledInstancesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Unique, case-sensitive identifier that ensures the idempotency of the request. \\n         For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Run_Instance_Idempotency.html\\\">Ensuring Idempotency</a>.</p>\",\n                        \"smithy.api#idempotencyToken\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"PurchaseRequests\": {\n                    \"target\": \"com.amazonaws.ec2#PurchaseRequestSet\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The purchase requests.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"PurchaseRequest\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the parameters for PurchaseScheduledInstances.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#PurchaseScheduledInstancesResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ScheduledInstanceSet\": {\n                    \"target\": \"com.amazonaws.ec2#PurchasedScheduledInstanceSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ScheduledInstanceSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the Scheduled Instances.</p>\",\n                        \"smithy.api#xmlName\": \"scheduledInstanceSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the output of PurchaseScheduledInstances.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#PurchaseSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#Purchase\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#PurchasedScheduledInstanceSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ScheduledInstance\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#RIProductDescription\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"Linux_UNIX\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Linux/UNIX\"\n                    }\n                },\n                \"Linux_UNIX_Amazon_VPC_\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Linux/UNIX (Amazon VPC)\"\n                    }\n                },\n                \"Windows\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Windows\"\n                    }\n                },\n                \"Windows_Amazon_VPC_\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Windows (Amazon VPC)\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#RamdiskId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#RdsDbClusterArn\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#RdsDbInstanceArn\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#RdsDbProxyArn\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#ReasonCodesList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ReportInstanceReasonCodes\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#RebootInstances\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#RebootInstancesRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Requests a reboot of the specified instances. This operation is asynchronous; it only\\n            queues a request to reboot the specified instances. The operation succeeds if the\\n            instances are valid and belong to you. Requests to reboot terminated instances are\\n            ignored.</p>\\n         <p>If an instance does not cleanly shut down within a few minutes, Amazon EC2 performs a\\n            hard reboot.</p>\\n         <p>For more information about troubleshooting, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-console.html\\\">Troubleshoot an unreachable\\n                instance</a> in the <i>Amazon EC2 User Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To reboot an EC2 instance\",\n                        \"documentation\": \"This example reboots the specified EC2 instance.\",\n                        \"input\": {\n                            \"InstanceIds\": [\n                                \"i-1234567890abcdef5\"\n                            ]\n                        },\n                        \"output\": {}\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#RebootInstancesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceIds\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceIdStringList\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The instance IDs.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"InstanceId\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the operation, without actually making the \\n  request, and provides an error response. If you have the required permissions, the error response is \\n  <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#RebootMigrationSupport\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"UNSUPPORTED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"unsupported\"\n                    }\n                },\n                \"SUPPORTED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"supported\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#RecurringCharge\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Amount\": {\n                    \"target\": \"com.amazonaws.ec2#Double\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Amount\",\n                        \"smithy.api#documentation\": \"<p>The amount of the recurring charge.</p>\",\n                        \"smithy.api#xmlName\": \"amount\"\n                    }\n                },\n                \"Frequency\": {\n                    \"target\": \"com.amazonaws.ec2#RecurringChargeFrequency\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Frequency\",\n                        \"smithy.api#documentation\": \"<p>The frequency of the recurring charge.</p>\",\n                        \"smithy.api#xmlName\": \"frequency\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a recurring charge.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#RecurringChargeFrequency\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"Hourly\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Hourly\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#RecurringChargesList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#RecurringCharge\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ReferencedSecurityGroup\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"GroupId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"GroupId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the security group.</p>\",\n                        \"smithy.api#xmlName\": \"groupId\"\n                    }\n                },\n                \"PeeringStatus\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PeeringStatus\",\n                        \"smithy.api#documentation\": \"<p>The status of a VPC peering connection, if applicable.</p>\",\n                        \"smithy.api#xmlName\": \"peeringStatus\"\n                    }\n                },\n                \"UserId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"UserId\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID.</p>\",\n                        \"smithy.api#xmlName\": \"userId\"\n                    }\n                },\n                \"VpcId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the VPC.</p>\",\n                        \"smithy.api#xmlName\": \"vpcId\"\n                    }\n                },\n                \"VpcPeeringConnectionId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcPeeringConnectionId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the VPC peering connection (if applicable).</p>\",\n                        \"smithy.api#xmlName\": \"vpcPeeringConnectionId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p> Describes the security group that is referenced in the security group rule.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#Region\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"OptInStatus\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OptInStatus\",\n                        \"smithy.api#documentation\": \"<p>The Region opt-in status. The possible values are <code>opt-in-not-required</code>, <code>opted-in</code>, and \\n        <code>not-opted-in</code>.</p>\",\n                        \"smithy.api#xmlName\": \"optInStatus\"\n                    }\n                },\n                \"RegionName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RegionName\",\n                        \"smithy.api#documentation\": \"<p>The name of the Region.</p>\",\n                        \"smithy.api#xmlName\": \"regionName\"\n                    }\n                },\n                \"Endpoint\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RegionEndpoint\",\n                        \"smithy.api#documentation\": \"<p>The Region service endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"regionEndpoint\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a Region.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#RegionList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#Region\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#RegionNameStringList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#String\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"RegionName\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#RegionNames\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#String\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 10\n                }\n            }\n        },\n        \"com.amazonaws.ec2#RegionalSummary\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RegionName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RegionName\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services Region.</p>\",\n                        \"smithy.api#xmlName\": \"regionName\"\n                    }\n                },\n                \"NumberOfMatchedAccounts\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NumberOfMatchedAccounts\",\n                        \"smithy.api#documentation\": \"<p>The number of accounts in the Region with the same configuration value for the\\n            attribute that is most frequently observed.</p>\",\n                        \"smithy.api#xmlName\": \"numberOfMatchedAccounts\"\n                    }\n                },\n                \"NumberOfUnmatchedAccounts\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NumberOfUnmatchedAccounts\",\n                        \"smithy.api#documentation\": \"<p>The number of accounts in the Region with a configuration value different from the\\n            most frequently observed value for the attribute.</p>\",\n                        \"smithy.api#xmlName\": \"numberOfUnmatchedAccounts\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A summary report for the attribute for a Region.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#RegionalSummaryList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#RegionalSummary\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#RegisterImage\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#RegisterImageRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#RegisterImageResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Registers an AMI. When you're creating an instance-store backed AMI, registering the AMI\\n      is the final step in the creation process. For more information about creating AMIs, see\\n        <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/creating-an-ami-ebs.html#creating-launching-ami-from-snapshot\\\">Create an AMI from a snapshot</a> and <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/creating-an-ami-instance-store.html\\\">Create an instance-store\\n        backed AMI</a> in the <i>Amazon EC2 User Guide</i>.</p>\\n         <p>If needed, you can deregister an AMI at any time. Any modifications you make to an AMI\\n      backed by an instance store volume invalidates its registration. If you make changes to an\\n      image, deregister the previous image and register the new image.</p>\\n         <p>\\n            <b>Register a snapshot of a root device volume</b>\\n         </p>\\n         <p>You can use <code>RegisterImage</code> to create an Amazon EBS-backed Linux AMI from a snapshot\\n      of a root device volume. You specify the snapshot using a block device mapping. You can't set\\n      the encryption state of the volume using the block device mapping. If the snapshot is\\n      encrypted, or encryption by default is enabled, the root volume of an instance launched from\\n      the AMI is encrypted.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/creating-an-ami-ebs.html#creating-launching-ami-from-snapshot\\\">Create an AMI from a snapshot</a> and <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AMIEncryption.html\\\">Use encryption with EBS-backed AMIs</a>\\n      in the <i>Amazon EC2 User Guide</i>.</p>\\n         <p>\\n            <b>Amazon Web Services Marketplace product codes</b>\\n         </p>\\n         <p>If any snapshots have Amazon Web Services Marketplace product codes, they are copied to the new AMI.</p>\\n         <p>In most cases, AMIs for Windows, RedHat, SUSE, and SQL Server require correct licensing\\n      information to be present on the AMI. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ami-billing-info.html\\\">Understand AMI billing\\n        information</a> in the <i>Amazon EC2 User Guide</i>. When creating an AMI from\\n      a snapshot, the <code>RegisterImage</code> operation derives the correct billing information\\n      from the snapshot's metadata, but this requires the appropriate metadata to be present. To\\n      verify if the correct billing information was applied, check the <code>PlatformDetails</code>\\n      field on the new AMI. If the field is empty or doesn't match the expected operating system\\n      code (for example, Windows, RedHat, SUSE, or SQL), the AMI creation was unsuccessful, and you\\n      should discard the AMI and instead create the AMI from an instance.  \\n        For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/creating-an-ami-ebs.html#how-to-create-ebs-ami\\\">Create an AMI\\n        from an instance </a> in the <i>Amazon EC2 User Guide</i>.</p>\\n         <p>If you purchase a Reserved Instance to apply to an On-Demand Instance that was launched\\n      from an AMI with a billing product code, make sure that the Reserved Instance has the matching\\n      billing product code. If you purchase a Reserved Instance without the matching billing product\\n      code, the Reserved Instance is not applied to the On-Demand Instance. For information\\n      about how to obtain the platform details and billing information of an AMI, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ami-billing-info.html\\\">Understand AMI\\n        billing information</a> in the <i>Amazon EC2 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#RegisterImageRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ImageLocation\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The full path to your AMI manifest in Amazon S3 storage. The specified bucket must have the\\n        <code>aws-exec-read</code> canned access control list (ACL) to ensure that it can be\\n      accessed by Amazon EC2. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html#canned-acl\\\">Canned ACL</a> in the\\n        <i>Amazon S3 Service Developer Guide</i>.</p>\"\n                    }\n                },\n                \"BillingProducts\": {\n                    \"target\": \"com.amazonaws.ec2#BillingProductList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The billing product codes. Your account must be authorized to specify billing product\\n      codes.</p>\\n         <p>If your account is not authorized to specify billing product codes, you can publish AMIs\\n      that include billable software and list them on the Amazon Web Services Marketplace. You must first register as a seller\\n      on the Amazon Web Services Marketplace. For more information, see <a href=\\\"https://docs.aws.amazon.com/marketplace/latest/userguide/user-guide-for-sellers.html\\\">Getting started as an Amazon Web Services Marketplace seller</a> and <a href=\\\"https://docs.aws.amazon.com/marketplace/latest/userguide/ami-products.html\\\">AMI-based products in Amazon Web Services Marketplace</a> in the <i>Amazon Web Services Marketplace Seller Guide</i>.</p>\",\n                        \"smithy.api#xmlName\": \"BillingProduct\"\n                    }\n                },\n                \"BootMode\": {\n                    \"target\": \"com.amazonaws.ec2#BootModeValues\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The boot mode of the AMI. A value of <code>uefi-preferred</code> indicates that the AMI\\n      supports both UEFI and Legacy BIOS.</p>\\n         <note>\\n            <p>The operating system contained in the AMI must be configured to support the specified\\n        boot mode.</p>\\n         </note>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ami-boot.html\\\">Instance launch behavior with Amazon EC2\\n        boot modes</a> in the <i>Amazon EC2 User Guide</i>.</p>\"\n                    }\n                },\n                \"TpmSupport\": {\n                    \"target\": \"com.amazonaws.ec2#TpmSupportValues\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Set to <code>v2.0</code> to enable Trusted Platform Module (TPM) support. For more\\n      information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/nitrotpm.html\\\">NitroTPM</a> in the <i>Amazon EC2 User Guide</i>.</p>\"\n                    }\n                },\n                \"UefiData\": {\n                    \"target\": \"com.amazonaws.ec2#StringType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Base64 representation of the non-volatile UEFI variable store. To retrieve the UEFI data,\\n      use the <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_GetInstanceUefiData\\\">GetInstanceUefiData</a> command. You can inspect and modify the UEFI data by using the\\n        <a href=\\\"https://github.com/awslabs/python-uefivars\\\">python-uefivars tool</a> on\\n      GitHub. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/uefi-secure-boot.html\\\">UEFI Secure Boot for Amazon EC2\\n        instances</a> in the <i>Amazon EC2 User Guide</i>.</p>\"\n                    }\n                },\n                \"ImdsSupport\": {\n                    \"target\": \"com.amazonaws.ec2#ImdsSupportValues\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Set to <code>v2.0</code> to indicate that IMDSv2 is specified in the AMI. Instances\\n      launched from this AMI will have <code>HttpTokens</code> automatically set to\\n        <code>required</code> so that, by default, the instance requires that IMDSv2 is used when\\n      requesting instance metadata. In addition, <code>HttpPutResponseHopLimit</code> is set to\\n        <code>2</code>. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/configuring-IMDS-new-instances.html#configure-IMDS-new-instances-ami-configuration\\\">Configure the AMI</a> in the <i>Amazon EC2 User Guide</i>.</p>\\n         <note>\\n            <p>If you set the value to <code>v2.0</code>, make sure that your AMI software can support\\n        IMDSv2.</p>\\n         </note>\"\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags to apply to the AMI.</p>\\n         <p>To tag the AMI, the value for <code>ResourceType</code> must be <code>image</code>. If you\\n      specify another value for <code>ResourceType</code>, the request fails.</p>\\n         <p>To tag an AMI after it has been registered, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateTags.html\\\">CreateTags</a>.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n\\t\\t\\tand provides an error response. If you have the required permissions, the error response is \\n\\t\\t\\t<code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"Name\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Name\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>A name for your AMI.</p>\\n         <p>Constraints: 3-128 alphanumeric characters, parentheses (()), square brackets ([]), spaces\\n      ( ), periods (.), slashes (/), dashes (-), single quotes ('), at-signs (@), or\\n      underscores(_)</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"name\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Description\",\n                        \"smithy.api#documentation\": \"<p>A description for your AMI.</p>\",\n                        \"smithy.api#xmlName\": \"description\"\n                    }\n                },\n                \"Architecture\": {\n                    \"target\": \"com.amazonaws.ec2#ArchitectureValues\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Architecture\",\n                        \"smithy.api#documentation\": \"<p>The architecture of the AMI.</p>\\n         <p>Default: For Amazon EBS-backed AMIs, <code>i386</code>. For instance store-backed AMIs, the\\n      architecture specified in the manifest file.</p>\",\n                        \"smithy.api#xmlName\": \"architecture\"\n                    }\n                },\n                \"KernelId\": {\n                    \"target\": \"com.amazonaws.ec2#KernelId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"KernelId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the kernel.</p>\",\n                        \"smithy.api#xmlName\": \"kernelId\"\n                    }\n                },\n                \"RamdiskId\": {\n                    \"target\": \"com.amazonaws.ec2#RamdiskId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RamdiskId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the RAM disk.</p>\",\n                        \"smithy.api#xmlName\": \"ramdiskId\"\n                    }\n                },\n                \"RootDeviceName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RootDeviceName\",\n                        \"smithy.api#documentation\": \"<p>The device name of the root device volume (for example, <code>/dev/sda1</code>).</p>\",\n                        \"smithy.api#xmlName\": \"rootDeviceName\"\n                    }\n                },\n                \"BlockDeviceMappings\": {\n                    \"target\": \"com.amazonaws.ec2#BlockDeviceMappingRequestList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The block device mapping entries.</p>\\n         <p>If you specify an Amazon EBS volume using the ID of an Amazon EBS snapshot, you can't specify the\\n      encryption state of the volume.</p>\\n         <p>If you create an AMI on an Outpost, then all backing snapshots must be on the same Outpost\\n      or in the Region of that Outpost. AMIs on an Outpost that include local snapshots can be used\\n      to launch instances on the same Outpost only. For more information, <a href=\\\"https://docs.aws.amazon.com/ebs/latest/userguide/snapshots-outposts.html#ami\\\">Create AMIs from\\n        local snapshots</a> in the <i>Amazon EBS User Guide</i>.</p>\",\n                        \"smithy.api#xmlName\": \"BlockDeviceMapping\"\n                    }\n                },\n                \"VirtualizationType\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VirtualizationType\",\n                        \"smithy.api#documentation\": \"<p>The type of virtualization (<code>hvm</code> | <code>paravirtual</code>).</p>\\n         <p>Default: <code>paravirtual</code>\\n         </p>\",\n                        \"smithy.api#xmlName\": \"virtualizationType\"\n                    }\n                },\n                \"SriovNetSupport\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SriovNetSupport\",\n                        \"smithy.api#documentation\": \"<p>Set to <code>simple</code> to enable enhanced networking with the Intel 82599 Virtual\\n      Function interface for the AMI and any instances that you launch from the AMI.</p>\\n         <p>There is no way to disable <code>sriovNetSupport</code> at this time.</p>\\n         <p>This option is supported only for HVM AMIs. Specifying this option with a PV AMI can make\\n      instances launched from the AMI unreachable.</p>\",\n                        \"smithy.api#xmlName\": \"sriovNetSupport\"\n                    }\n                },\n                \"EnaSupport\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EnaSupport\",\n                        \"smithy.api#documentation\": \"<p>Set to <code>true</code> to enable enhanced networking with ENA for the AMI and any\\n      instances that you launch from the AMI.</p>\\n         <p>This option is supported only for HVM AMIs. Specifying this option with a PV AMI can make\\n      instances launched from the AMI unreachable.</p>\",\n                        \"smithy.api#xmlName\": \"enaSupport\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the parameters for RegisterImage.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#RegisterImageResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ImageId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ImageId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the newly registered AMI.</p>\",\n                        \"smithy.api#xmlName\": \"imageId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the output of RegisterImage.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#RegisterInstanceEventNotificationAttributes\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#RegisterInstanceEventNotificationAttributesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#RegisterInstanceEventNotificationAttributesResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Registers a set of tag keys to include in scheduled event notifications for your\\n         resources.\\n         </p>\\n         <p>To remove tags, use <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeregisterInstanceEventNotificationAttributes.html\\\">DeregisterInstanceEventNotificationAttributes</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#RegisterInstanceEventNotificationAttributesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"InstanceTagAttribute\": {\n                    \"target\": \"com.amazonaws.ec2#RegisterInstanceTagAttributeRequest\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>Information about the tag keys to register.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#RegisterInstanceEventNotificationAttributesResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceTagAttribute\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceTagNotificationAttribute\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceTagAttribute\",\n                        \"smithy.api#documentation\": \"<p>The resulting set of tag keys.</p>\",\n                        \"smithy.api#xmlName\": \"instanceTagAttribute\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#RegisterInstanceTagAttributeRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"IncludeAllTagsOfInstance\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether to register all tag keys in the current Region. Specify\\n            <code>true</code> to register all tag keys.</p>\"\n                    }\n                },\n                \"InstanceTagKeys\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceTagKeySet\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tag keys to register.</p>\",\n                        \"smithy.api#xmlName\": \"InstanceTagKey\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about the tag keys to register for the current Region. You can either\\n         specify individual tag keys or register all tag keys in the current Region. You must\\n         specify either <code>IncludeAllTagsOfInstance</code> or <code>InstanceTagKeys</code> in the\\n         request</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#RegisterTransitGatewayMulticastGroupMembers\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#RegisterTransitGatewayMulticastGroupMembersRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#RegisterTransitGatewayMulticastGroupMembersResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Registers members (network interfaces) with the  transit gateway multicast group. A member is a network interface associated\\n            with a supported EC2 instance that receives multicast traffic. For more information, see\\n            <a href=\\\"https://docs.aws.amazon.com/vpc/latest/tgw/tgw-multicast-overview.html\\\">Multicast\\n                on transit gateways</a> in the <i>Amazon Web Services Transit Gateways Guide</i>.</p>\\n         <p>After you add the members, use <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_SearchTransitGatewayMulticastGroups.html\\\">SearchTransitGatewayMulticastGroups</a> to verify that the members were added\\n            to the  transit gateway multicast group.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#RegisterTransitGatewayMulticastGroupMembersRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayMulticastDomainId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayMulticastDomainId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the transit gateway multicast domain.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"GroupIpAddress\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IP address assigned to the  transit gateway multicast group.</p>\"\n                    }\n                },\n                \"NetworkInterfaceIds\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayNetworkInterfaceIdList\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The group members' network interface IDs to register with the  transit gateway multicast group.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#RegisterTransitGatewayMulticastGroupMembersResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RegisteredMulticastGroupMembers\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayMulticastRegisteredGroupMembers\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RegisteredMulticastGroupMembers\",\n                        \"smithy.api#documentation\": \"<p>Information about the registered  transit gateway multicast group members.</p>\",\n                        \"smithy.api#xmlName\": \"registeredMulticastGroupMembers\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#RegisterTransitGatewayMulticastGroupSources\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#RegisterTransitGatewayMulticastGroupSourcesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#RegisterTransitGatewayMulticastGroupSourcesResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Registers sources (network interfaces) with the specified  transit gateway multicast group.</p>\\n         <p>A multicast source is a network interface attached to a supported instance that sends\\n            multicast traffic. For more information about supported instances, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/tgw/tgw-multicast-overview.html\\\">Multicast\\n                on transit gateways</a> in the <i>Amazon Web Services Transit Gateways Guide</i>.</p>\\n         <p>After you add the source, use <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_SearchTransitGatewayMulticastGroups.html\\\">SearchTransitGatewayMulticastGroups</a> to verify that the source was added to the multicast\\n            group.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#RegisterTransitGatewayMulticastGroupSourcesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayMulticastDomainId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayMulticastDomainId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the transit gateway multicast domain.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"GroupIpAddress\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IP address assigned to the  transit gateway multicast group.</p>\"\n                    }\n                },\n                \"NetworkInterfaceIds\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayNetworkInterfaceIdList\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The group sources' network interface IDs to register with the  transit gateway multicast group.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#RegisterTransitGatewayMulticastGroupSourcesResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RegisteredMulticastGroupSources\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayMulticastRegisteredGroupSources\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RegisteredMulticastGroupSources\",\n                        \"smithy.api#documentation\": \"<p>Information about the  transit gateway multicast group sources.</p>\",\n                        \"smithy.api#xmlName\": \"registeredMulticastGroupSources\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#RejectCapacityReservationBillingOwnership\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#RejectCapacityReservationBillingOwnershipRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#RejectCapacityReservationBillingOwnershipResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Rejects a request to assign billing of the available capacity of a shared Capacity\\n\\t\\t\\tReservation to your account. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/assign-billing.html\\\"> Billing assignment for shared\\n\\t\\t\\t\\t\\tAmazon EC2 Capacity Reservations</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#RejectCapacityReservationBillingOwnershipRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"CapacityReservationId\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityReservationId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the Capacity Reservation for which to reject the request.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#RejectCapacityReservationBillingOwnershipResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Return\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Return\",\n                        \"smithy.api#documentation\": \"<p>Returns <code>true</code> if the request succeeds; otherwise, it returns an error.</p>\",\n                        \"smithy.api#xmlName\": \"return\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#RejectTransitGatewayMulticastDomainAssociations\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#RejectTransitGatewayMulticastDomainAssociationsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#RejectTransitGatewayMulticastDomainAssociationsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Rejects a request to associate cross-account subnets with a transit gateway multicast domain.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#RejectTransitGatewayMulticastDomainAssociationsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayMulticastDomainId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayMulticastDomainId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the transit gateway multicast domain.</p>\"\n                    }\n                },\n                \"TransitGatewayAttachmentId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayAttachmentId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the transit gateway attachment.</p>\"\n                    }\n                },\n                \"SubnetIds\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the subnets to associate with the transit gateway multicast domain.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#RejectTransitGatewayMulticastDomainAssociationsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Associations\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayMulticastDomainAssociations\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Associations\",\n                        \"smithy.api#documentation\": \"<p>Information about the multicast domain associations.</p>\",\n                        \"smithy.api#xmlName\": \"associations\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#RejectTransitGatewayPeeringAttachment\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#RejectTransitGatewayPeeringAttachmentRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#RejectTransitGatewayPeeringAttachmentResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Rejects a transit gateway peering attachment request.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#RejectTransitGatewayPeeringAttachmentRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayAttachmentId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayAttachmentId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the transit gateway peering attachment.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#RejectTransitGatewayPeeringAttachmentResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayPeeringAttachment\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayPeeringAttachment\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayPeeringAttachment\",\n                        \"smithy.api#documentation\": \"<p>The transit gateway peering attachment.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayPeeringAttachment\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#RejectTransitGatewayVpcAttachment\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#RejectTransitGatewayVpcAttachmentRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#RejectTransitGatewayVpcAttachmentResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Rejects a request to attach a VPC to a transit gateway.</p>\\n         <p>The VPC attachment must be in the <code>pendingAcceptance</code> state.\\n         Use <a>DescribeTransitGatewayVpcAttachments</a> to view your pending VPC attachment requests.\\n         Use <a>AcceptTransitGatewayVpcAttachment</a> to accept a VPC attachment request.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#RejectTransitGatewayVpcAttachmentRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayAttachmentId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayAttachmentId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the attachment.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#RejectTransitGatewayVpcAttachmentResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayVpcAttachment\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayVpcAttachment\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayVpcAttachment\",\n                        \"smithy.api#documentation\": \"<p>Information about the attachment.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayVpcAttachment\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#RejectVpcEndpointConnections\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#RejectVpcEndpointConnectionsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#RejectVpcEndpointConnectionsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Rejects VPC endpoint connection requests to your VPC endpoint service.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#RejectVpcEndpointConnectionsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"ServiceId\": {\n                    \"target\": \"com.amazonaws.ec2#VpcEndpointServiceId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the service.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"VpcEndpointIds\": {\n                    \"target\": \"com.amazonaws.ec2#VpcEndpointIdList\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The IDs of the VPC endpoints.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"VpcEndpointId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#RejectVpcEndpointConnectionsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Unsuccessful\": {\n                    \"target\": \"com.amazonaws.ec2#UnsuccessfulItemSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Unsuccessful\",\n                        \"smithy.api#documentation\": \"<p>Information about the endpoints that were not rejected, if applicable.</p>\",\n                        \"smithy.api#xmlName\": \"unsuccessful\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#RejectVpcPeeringConnection\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#RejectVpcPeeringConnectionRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#RejectVpcPeeringConnectionResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Rejects a VPC peering connection request. The VPC peering connection must be in the\\n\\t\\t\\t\\t<code>pending-acceptance</code> state. Use the <a>DescribeVpcPeeringConnections</a> request\\n\\t\\t\\tto view your outstanding VPC peering connection requests. To delete an active VPC peering\\n\\t\\t\\tconnection, or to delete a VPC peering connection request that you initiated, use\\t<a>DeleteVpcPeeringConnection</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#RejectVpcPeeringConnectionRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"VpcPeeringConnectionId\": {\n                    \"target\": \"com.amazonaws.ec2#VpcPeeringConnectionId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcPeeringConnectionId\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the VPC peering connection.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"vpcPeeringConnectionId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#RejectVpcPeeringConnectionResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Return\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Return\",\n                        \"smithy.api#documentation\": \"<p>Returns <code>true</code> if the request succeeds; otherwise, it returns an error.</p>\",\n                        \"smithy.api#xmlName\": \"return\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ReleaseAddress\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ReleaseAddressRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Releases the specified Elastic IP address.</p>\\n         <p>[Default VPC] Releasing an Elastic IP address automatically disassociates it\\n\\t\\t\\t\\tfrom any instance that it's associated with. Alternatively, you can disassociate an Elastic IP address without\\n\\t\\t\\t\\treleasing it.</p>\\n         <p>[Nondefault VPC] You must disassociate the Elastic IP address\\n\\t\\t\\t  before you can release it. Otherwise, Amazon EC2 returns an error (<code>InvalidIPAddress.InUse</code>).</p>\\n         <p>After releasing an Elastic IP address, it is released to the IP address pool. \\n        Be sure to update your DNS records and any servers or devices that communicate with the address. \\n        If you attempt to release an Elastic IP address that you already released, you'll get an\\n       <code>AuthFailure</code> error if the address is already allocated to another Amazon Web Services account.</p>\\n         <p>After you release an Elastic IP address, you might be able to recover it.\\n       For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-instance-addressing-eips-releasing.html\\\">Release an Elastic IP address</a>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To release an Elastic IP address\",\n                        \"documentation\": \"This example releases the specified Elastic IP address.\",\n                        \"input\": {\n                            \"AllocationId\": \"eipalloc-64d5890a\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#ReleaseAddressRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AllocationId\": {\n                    \"target\": \"com.amazonaws.ec2#AllocationId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The allocation ID. This parameter is required.</p>\"\n                    }\n                },\n                \"PublicIp\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Deprecated.</p>\"\n                    }\n                },\n                \"NetworkBorderGroup\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The set of Availability Zones, Local Zones, or Wavelength Zones from which Amazon Web Services advertises\\n      IP addresses.</p>\\n         <p>If you provide an incorrect network border group, you receive an <code>InvalidAddress.NotFound</code> error.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ReleaseHosts\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ReleaseHostsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ReleaseHostsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>When you no longer want to use an On-Demand Dedicated Host it can be released.\\n            On-Demand billing is stopped and the host goes into <code>released</code> state. The\\n            host ID of Dedicated Hosts that have been released can no longer be specified in another\\n            request, for example, to modify the host. You must stop or terminate all instances on a\\n            host before it can be released.</p>\\n         <p>When Dedicated Hosts are released, it may take some time for them to stop counting\\n            toward your limit and you may receive capacity errors when trying to allocate new\\n            Dedicated Hosts. Wait a few minutes and then try again.</p>\\n         <p>Released hosts still appear in a <a>DescribeHosts</a> response.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ReleaseHostsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"HostIds\": {\n                    \"target\": \"com.amazonaws.ec2#RequestHostIdList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"HostId\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The IDs of the Dedicated Hosts to release.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"hostId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ReleaseHostsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Successful\": {\n                    \"target\": \"com.amazonaws.ec2#ResponseHostIdList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Successful\",\n                        \"smithy.api#documentation\": \"<p>The IDs of the Dedicated Hosts that were successfully released.</p>\",\n                        \"smithy.api#xmlName\": \"successful\"\n                    }\n                },\n                \"Unsuccessful\": {\n                    \"target\": \"com.amazonaws.ec2#UnsuccessfulItemList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Unsuccessful\",\n                        \"smithy.api#documentation\": \"<p>The IDs of the Dedicated Hosts that could not be released, including an error\\n            message.</p>\",\n                        \"smithy.api#xmlName\": \"unsuccessful\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ReleaseIpamPoolAllocation\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ReleaseIpamPoolAllocationRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ReleaseIpamPoolAllocationResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Release an allocation within an IPAM pool. The Region you use should be the IPAM pool locale. The locale is the Amazon Web Services Region where this IPAM pool is available for allocations. You can only use this action to release manual allocations. To remove an allocation for a resource without deleting the resource, set its monitored state to false using <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyIpamResourceCidr.html\\\">ModifyIpamResourceCidr</a>. For more information, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/ipam/release-alloc-ipam.html\\\">Release an allocation</a> in the <i>Amazon VPC IPAM User Guide</i>.\\n      </p>\\n         <note>\\n            <p>All EC2 API actions follow an <a href=\\\"https://docs.aws.amazon.com/ec2/latest/devguide/eventual-consistency.html\\\">eventual consistency</a> model.</p>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.ec2#ReleaseIpamPoolAllocationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A check for whether you have the required permissions for the action without actually making the request \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"IpamPoolId\": {\n                    \"target\": \"com.amazonaws.ec2#IpamPoolId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the IPAM pool which contains the allocation you want to release.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Cidr\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The CIDR of the allocation you want to release.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"IpamPoolAllocationId\": {\n                    \"target\": \"com.amazonaws.ec2#IpamPoolAllocationId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the allocation.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ReleaseIpamPoolAllocationResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Success\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Success\",\n                        \"smithy.api#documentation\": \"<p>Indicates if the release was successful.</p>\",\n                        \"smithy.api#xmlName\": \"success\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#RemoveIpamOperatingRegion\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RegionName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the operating Region you want to remove.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Remove an operating Region from an IPAM. Operating Regions are Amazon Web Services Regions where the IPAM is allowed to manage IP address CIDRs. IPAM only discovers and monitors resources in the Amazon Web Services Regions you select as operating Regions.</p>\\n         <p>For more information about operating Regions, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/ipam/create-ipam.html\\\">Create an IPAM</a> in the <i>Amazon VPC IPAM User Guide</i>\\n         </p>\"\n            }\n        },\n        \"com.amazonaws.ec2#RemoveIpamOperatingRegionSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#RemoveIpamOperatingRegion\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 50\n                }\n            }\n        },\n        \"com.amazonaws.ec2#RemoveIpamOrganizationalUnitExclusion\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"OrganizationsEntityPath\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An Amazon Web Services Organizations entity path. Build the path for the OU(s) using Amazon Web Services Organizations IDs separated by a <code>/</code>. Include all child OUs by ending the path with <code>/*</code>.</p>\\n         <ul>\\n            <li>\\n               <p>Example 1</p>\\n               <ul>\\n                  <li>\\n                     <p>Path to a child OU: <code>o-a1b2c3d4e5/r-f6g7h8i9j0example/ou-ghi0-awsccccc/ou-jkl0-awsddddd/</code>\\n                     </p>\\n                  </li>\\n                  <li>\\n                     <p>In this example, <code>o-a1b2c3d4e5</code> is the organization ID, <code>r-f6g7h8i9j0example</code> is the root ID , <code>ou-ghi0-awsccccc</code> is an OU ID, and <code>ou-jkl0-awsddddd</code> is a child OU ID.</p>\\n                  </li>\\n                  <li>\\n                     <p>IPAM will not manage the IP addresses in accounts in the child OU.</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <p>Example 2</p>\\n               <ul>\\n                  <li>\\n                     <p>Path where all child OUs will be part of the exclusion: <code>o-a1b2c3d4e5/r-f6g7h8i9j0example/ou-ghi0-awsccccc/*</code>\\n                     </p>\\n                  </li>\\n                  <li>\\n                     <p>In this example, IPAM will not manage the IP addresses in accounts in the OU (<code>ou-ghi0-awsccccc</code>) or in accounts in any OUs that are children of the OU.</p>\\n                  </li>\\n               </ul>\\n            </li>\\n         </ul>\\n         <p>For more information on how to construct an entity path, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_last-accessed-view-data-orgs.html#access_policies_access-advisor-viewing-orgs-entity-path\\\">Understand the Amazon Web Services Organizations entity path</a> in the <i>Amazon Web Services Identity and Access Management User Guide</i>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Remove an Organizational Unit (OU) exclusion to your IPAM. If your IPAM is integrated with Amazon Web Services Organizations and you add an organizational unit (OU) exclusion, IPAM will not manage the IP addresses in accounts in that OU exclusion. There is a limit on the number of exclusions you can create. For more information, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/ipam/quotas-ipam.html\\\">Quotas for your IPAM</a> in the <i>Amazon VPC IPAM User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#RemoveIpamOrganizationalUnitExclusionSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#RemoveIpamOrganizationalUnitExclusion\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 10\n                }\n            }\n        },\n        \"com.amazonaws.ec2#RemovePrefixListEntries\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#RemovePrefixListEntry\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 100\n                }\n            }\n        },\n        \"com.amazonaws.ec2#RemovePrefixListEntry\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Cidr\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The CIDR block.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>An entry for a prefix list.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ReplaceIamInstanceProfileAssociation\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ReplaceIamInstanceProfileAssociationRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ReplaceIamInstanceProfileAssociationResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Replaces an IAM instance profile for the specified running instance. You can use\\n            this action to change the IAM instance profile that's associated with an instance\\n            without having to disassociate the existing IAM instance profile first.</p>\\n         <p>Use <a>DescribeIamInstanceProfileAssociations</a> to get the association\\n            ID.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ReplaceIamInstanceProfileAssociationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"IamInstanceProfile\": {\n                    \"target\": \"com.amazonaws.ec2#IamInstanceProfileSpecification\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The IAM instance profile.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"AssociationId\": {\n                    \"target\": \"com.amazonaws.ec2#IamInstanceProfileAssociationId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the existing IAM instance profile association.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ReplaceIamInstanceProfileAssociationResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"IamInstanceProfileAssociation\": {\n                    \"target\": \"com.amazonaws.ec2#IamInstanceProfileAssociation\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IamInstanceProfileAssociation\",\n                        \"smithy.api#documentation\": \"<p>Information about the IAM instance profile association.</p>\",\n                        \"smithy.api#xmlName\": \"iamInstanceProfileAssociation\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ReplaceImageCriteriaInAllowedImagesSettings\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ReplaceImageCriteriaInAllowedImagesSettingsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ReplaceImageCriteriaInAllowedImagesSettingsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Sets or replaces the criteria for Allowed AMIs.</p>\\n         <note>\\n            <p>The Allowed AMIs feature does not restrict the AMIs owned by your account. Regardless of\\n        the criteria you set, the AMIs created by your account will always be discoverable and\\n        usable by users in your account.</p>\\n         </note>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-allowed-amis.html\\\">Control the discovery and use of AMIs in\\n      Amazon EC2 with Allowed AMIs</a> in\\n      <i>Amazon EC2 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ReplaceImageCriteriaInAllowedImagesSettingsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ImageCriteria\": {\n                    \"target\": \"com.amazonaws.ec2#ImageCriterionRequestList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The list of criteria that are evaluated to determine whether AMIs are discoverable and\\n      usable in the account in the specified Amazon Web Services Region.</p>\",\n                        \"smithy.api#xmlName\": \"ImageCriterion\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n\\t\\t\\tand provides an error response. If you have the required permissions, the error response is \\n\\t\\t\\t<code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ReplaceImageCriteriaInAllowedImagesSettingsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ReturnValue\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Return\",\n                        \"smithy.api#documentation\": \"<p>Returns <code>true</code> if the request succeeds; otherwise, it returns an error.</p>\",\n                        \"smithy.api#xmlName\": \"return\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ReplaceNetworkAclAssociation\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ReplaceNetworkAclAssociationRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ReplaceNetworkAclAssociationResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Changes which network ACL a subnet is associated with. By default when you create a\\n\\t\\t\\tsubnet, it's automatically associated with the default network ACL. For more\\n\\t\\t\\tinformation, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/userguide/vpc-network-acls.html\\\">Network ACLs</a> in the <i>Amazon VPC User Guide</i>.</p>\\n         <p>This is an idempotent operation.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To replace the network ACL associated with a subnet\",\n                        \"documentation\": \"This example associates the specified network ACL with the subnet for the specified network ACL association.\",\n                        \"input\": {\n                            \"AssociationId\": \"aclassoc-e5b95c8c\",\n                            \"NetworkAclId\": \"acl-5fb85d36\"\n                        },\n                        \"output\": {\n                            \"NewAssociationId\": \"aclassoc-3999875b\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#ReplaceNetworkAclAssociationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"AssociationId\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkAclAssociationId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AssociationId\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the current association between the original network ACL and the subnet.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"associationId\"\n                    }\n                },\n                \"NetworkAclId\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkAclId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkAclId\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the new network ACL to associate with the subnet.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"networkAclId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ReplaceNetworkAclAssociationResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NewAssociationId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NewAssociationId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the new association.</p>\",\n                        \"smithy.api#xmlName\": \"newAssociationId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ReplaceNetworkAclEntry\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ReplaceNetworkAclEntryRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Replaces an entry (rule) in a network ACL. For more information, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/userguide/vpc-network-acls.html\\\">Network ACLs</a> in the\\n\\t\\t\\t\\t<i>Amazon VPC User Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To replace a network ACL entry\",\n                        \"documentation\": \"This example replaces an entry for the specified network ACL. The new rule 100 allows ingress traffic from 203.0.113.12/24 on UDP port 53 (DNS) into any associated subnet.\",\n                        \"input\": {\n                            \"NetworkAclId\": \"acl-5fb85d36\",\n                            \"RuleNumber\": 100,\n                            \"Protocol\": \"17\",\n                            \"RuleAction\": \"allow\",\n                            \"Egress\": false,\n                            \"CidrBlock\": \"203.0.113.12/24\",\n                            \"PortRange\": {\n                                \"From\": 53,\n                                \"To\": 53\n                            }\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#ReplaceNetworkAclEntryRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"NetworkAclId\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkAclId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkAclId\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the ACL.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"networkAclId\"\n                    }\n                },\n                \"RuleNumber\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RuleNumber\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The rule number of the entry to replace.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"ruleNumber\"\n                    }\n                },\n                \"Protocol\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Protocol\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The protocol number. A value of \\\"-1\\\" means all protocols. If you specify \\\"-1\\\" or a\\n           protocol number other than \\\"6\\\" (TCP), \\\"17\\\" (UDP), or \\\"1\\\" (ICMP), traffic on all ports is \\n           allowed, regardless of any ports or ICMP types or codes that you specify. If you specify \\n           protocol \\\"58\\\" (ICMPv6) and specify an IPv4 CIDR block, traffic for all ICMP types and \\n           codes allowed, regardless of any that you specify. If you specify protocol \\\"58\\\" (ICMPv6) \\n           and specify an IPv6 CIDR block, you must specify an ICMP type and code.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"protocol\"\n                    }\n                },\n                \"RuleAction\": {\n                    \"target\": \"com.amazonaws.ec2#RuleAction\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RuleAction\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>Indicates whether to allow or deny the traffic that matches the rule.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"ruleAction\"\n                    }\n                },\n                \"Egress\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Egress\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>Indicates whether to replace the egress rule.</p>\\n         <p>Default: If no value is specified, we replace the ingress rule.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"egress\"\n                    }\n                },\n                \"CidrBlock\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CidrBlock\",\n                        \"smithy.api#documentation\": \"<p>The IPv4 network range to allow or deny, in CIDR notation (for example\\n                <code>172.16.0.0/24</code>).</p>\",\n                        \"smithy.api#xmlName\": \"cidrBlock\"\n                    }\n                },\n                \"Ipv6CidrBlock\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Ipv6CidrBlock\",\n                        \"smithy.api#documentation\": \"<p>The IPv6 network range to allow or deny, in CIDR notation (for example\\n                <code>2001:bd8:1234:1a00::/64</code>).</p>\",\n                        \"smithy.api#xmlName\": \"ipv6CidrBlock\"\n                    }\n                },\n                \"IcmpTypeCode\": {\n                    \"target\": \"com.amazonaws.ec2#IcmpTypeCode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>ICMP protocol: The ICMP or ICMPv6 type and code. Required if specifying protocol\\n\\t\\t        1 (ICMP) or protocol 58 (ICMPv6) with an IPv6 CIDR block.</p>\",\n                        \"smithy.api#xmlName\": \"Icmp\"\n                    }\n                },\n                \"PortRange\": {\n                    \"target\": \"com.amazonaws.ec2#PortRange\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PortRange\",\n                        \"smithy.api#documentation\": \"<p>TCP or UDP protocols: The range of ports the rule applies to. \\n\\t\\t        Required if specifying protocol 6 (TCP) or 17 (UDP).</p>\",\n                        \"smithy.api#xmlName\": \"portRange\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ReplaceRootVolumeTask\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ReplaceRootVolumeTaskId\": {\n                    \"target\": \"com.amazonaws.ec2#ReplaceRootVolumeTaskId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ReplaceRootVolumeTaskId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the root volume replacement task.</p>\",\n                        \"smithy.api#xmlName\": \"replaceRootVolumeTaskId\"\n                    }\n                },\n                \"InstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the instance for which the root volume replacement task was created.</p>\",\n                        \"smithy.api#xmlName\": \"instanceId\"\n                    }\n                },\n                \"TaskState\": {\n                    \"target\": \"com.amazonaws.ec2#ReplaceRootVolumeTaskState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TaskState\",\n                        \"smithy.api#documentation\": \"<p>The state of the task. The task can be in one of the following states:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>pending</code> - the replacement volume is being created.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>in-progress</code> - the original volume is being detached and the \\n          replacement volume is being attached.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>succeeded</code> - the replacement volume has been successfully attached \\n          to the instance and the instance is available.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>failing</code> - the replacement task is in the process of failing.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>failed</code> - the replacement task has failed but the original root \\n          volume is still attached.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>failing-detached</code> - the replacement task is in the process of failing. \\n          The instance might have no root volume attached.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>failed-detached</code> - the replacement task has failed and the instance \\n          has no root volume attached.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"taskState\"\n                    }\n                },\n                \"StartTime\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"StartTime\",\n                        \"smithy.api#documentation\": \"<p>The time the task was started.</p>\",\n                        \"smithy.api#xmlName\": \"startTime\"\n                    }\n                },\n                \"CompleteTime\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CompleteTime\",\n                        \"smithy.api#documentation\": \"<p>The time the task completed.</p>\",\n                        \"smithy.api#xmlName\": \"completeTime\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>The tags assigned to the task.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                },\n                \"ImageId\": {\n                    \"target\": \"com.amazonaws.ec2#ImageId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ImageId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the AMI used to create the replacement root volume.</p>\",\n                        \"smithy.api#xmlName\": \"imageId\"\n                    }\n                },\n                \"SnapshotId\": {\n                    \"target\": \"com.amazonaws.ec2#SnapshotId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SnapshotId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the snapshot used to create the replacement root volume.</p>\",\n                        \"smithy.api#xmlName\": \"snapshotId\"\n                    }\n                },\n                \"DeleteReplacedRootVolume\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DeleteReplacedRootVolume\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether the original root volume is to be deleted after the root volume \\n      replacement task completes.</p>\",\n                        \"smithy.api#xmlName\": \"deleteReplacedRootVolume\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about a root volume replacement task.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ReplaceRootVolumeTaskId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#ReplaceRootVolumeTaskIds\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ReplaceRootVolumeTaskId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"ReplaceRootVolumeTaskId\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ReplaceRootVolumeTaskState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"pending\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"pending\"\n                    }\n                },\n                \"in_progress\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"in-progress\"\n                    }\n                },\n                \"failing\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"failing\"\n                    }\n                },\n                \"succeeded\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"succeeded\"\n                    }\n                },\n                \"failed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"failed\"\n                    }\n                },\n                \"failed_detached\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"failed-detached\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ReplaceRootVolumeTasks\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ReplaceRootVolumeTask\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ReplaceRoute\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ReplaceRouteRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Replaces an existing route within a route table in a VPC.</p>\\n         <p>You must specify either a destination CIDR block or a prefix list ID. You must also specify  \\n           exactly one of the resources from the parameter list, or reset the local route to its default \\n           target.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Route_Tables.html\\\">Route tables</a> in the\\n                <i>Amazon VPC User Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To replace a route\",\n                        \"documentation\": \"This example replaces the specified route in the specified table table. The new route matches the specified CIDR and sends the traffic to the specified virtual private gateway.\",\n                        \"input\": {\n                            \"RouteTableId\": \"rtb-22574640\",\n                            \"DestinationCidrBlock\": \"10.0.0.0/16\",\n                            \"GatewayId\": \"vgw-9a4cacf3\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#ReplaceRouteRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DestinationPrefixListId\": {\n                    \"target\": \"com.amazonaws.ec2#PrefixListResourceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the prefix list for the route.</p>\"\n                    }\n                },\n                \"VpcEndpointId\": {\n                    \"target\": \"com.amazonaws.ec2#VpcEndpointId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of a VPC endpoint. Supported for Gateway Load Balancer endpoints only.</p>\"\n                    }\n                },\n                \"LocalTarget\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies whether to reset the local route to its default target (<code>local</code>).</p>\"\n                    }\n                },\n                \"TransitGatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of a transit gateway.</p>\"\n                    }\n                },\n                \"LocalGatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#LocalGatewayId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the local gateway.</p>\"\n                    }\n                },\n                \"CarrierGatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#CarrierGatewayId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>[IPv4 traffic only] The ID of a carrier gateway.</p>\"\n                    }\n                },\n                \"CoreNetworkArn\": {\n                    \"target\": \"com.amazonaws.ec2#CoreNetworkArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the core network.</p>\"\n                    }\n                },\n                \"OdbNetworkArn\": {\n                    \"target\": \"com.amazonaws.ec2#OdbNetworkArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the ODB network.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"RouteTableId\": {\n                    \"target\": \"com.amazonaws.ec2#RouteTableId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RouteTableId\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the route table.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"routeTableId\"\n                    }\n                },\n                \"DestinationCidrBlock\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DestinationCidrBlock\",\n                        \"smithy.api#documentation\": \"<p>The IPv4 CIDR address block used for the destination match. The value that you\\n\\t\\t\\tprovide must match the CIDR of an existing route in the table.</p>\",\n                        \"smithy.api#xmlName\": \"destinationCidrBlock\"\n                    }\n                },\n                \"GatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#RouteGatewayId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"GatewayId\",\n                        \"smithy.api#documentation\": \"<p>The ID of an internet gateway or virtual private gateway.</p>\",\n                        \"smithy.api#xmlName\": \"gatewayId\"\n                    }\n                },\n                \"DestinationIpv6CidrBlock\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DestinationIpv6CidrBlock\",\n                        \"smithy.api#documentation\": \"<p>The IPv6 CIDR address block used for the destination match. The value that you\\n\\t\\t\\tprovide must match the CIDR of an existing route in the table.</p>\",\n                        \"smithy.api#xmlName\": \"destinationIpv6CidrBlock\"\n                    }\n                },\n                \"EgressOnlyInternetGatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#EgressOnlyInternetGatewayId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EgressOnlyInternetGatewayId\",\n                        \"smithy.api#documentation\": \"<p>[IPv6 traffic only] The ID of an egress-only internet gateway.</p>\",\n                        \"smithy.api#xmlName\": \"egressOnlyInternetGatewayId\"\n                    }\n                },\n                \"InstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of a NAT instance in your VPC.</p>\",\n                        \"smithy.api#xmlName\": \"instanceId\"\n                    }\n                },\n                \"NetworkInterfaceId\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInterfaceId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkInterfaceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of a network interface.</p>\",\n                        \"smithy.api#xmlName\": \"networkInterfaceId\"\n                    }\n                },\n                \"VpcPeeringConnectionId\": {\n                    \"target\": \"com.amazonaws.ec2#VpcPeeringConnectionId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcPeeringConnectionId\",\n                        \"smithy.api#documentation\": \"<p>The ID of a VPC peering connection.</p>\",\n                        \"smithy.api#xmlName\": \"vpcPeeringConnectionId\"\n                    }\n                },\n                \"NatGatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#NatGatewayId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NatGatewayId\",\n                        \"smithy.api#documentation\": \"<p>[IPv4 traffic only] The ID of a NAT gateway.</p>\",\n                        \"smithy.api#xmlName\": \"natGatewayId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ReplaceRouteTableAssociation\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ReplaceRouteTableAssociationRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ReplaceRouteTableAssociationResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Changes the route table associated with a given subnet, internet gateway, or virtual private gateway in a VPC. After the operation\\n        completes, the subnet or gateway uses the routes in the new route table. For more\\n        information about route tables, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Route_Tables.html\\\">Route\\n        tables</a> in the <i>Amazon VPC User Guide</i>.</p>\\n         <p>You can also use this operation to change which table is the main route table in the VPC. Specify the main route table's association ID and the route table ID of the new main route table.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To replace the route table associated with a subnet\",\n                        \"documentation\": \"This example associates the specified route table with the subnet for the specified route table association.\",\n                        \"input\": {\n                            \"AssociationId\": \"rtbassoc-781d0d1a\",\n                            \"RouteTableId\": \"rtb-22574640\"\n                        },\n                        \"output\": {\n                            \"NewAssociationId\": \"rtbassoc-3a1f0f58\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#ReplaceRouteTableAssociationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"AssociationId\": {\n                    \"target\": \"com.amazonaws.ec2#RouteTableAssociationId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AssociationId\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The association ID.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"associationId\"\n                    }\n                },\n                \"RouteTableId\": {\n                    \"target\": \"com.amazonaws.ec2#RouteTableId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RouteTableId\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the new route table to associate with the subnet.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"routeTableId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ReplaceRouteTableAssociationResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NewAssociationId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NewAssociationId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the new association.</p>\",\n                        \"smithy.api#xmlName\": \"newAssociationId\"\n                    }\n                },\n                \"AssociationState\": {\n                    \"target\": \"com.amazonaws.ec2#RouteTableAssociationState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AssociationState\",\n                        \"smithy.api#documentation\": \"<p>The state of the association.</p>\",\n                        \"smithy.api#xmlName\": \"associationState\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ReplaceTransitGatewayRoute\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ReplaceTransitGatewayRouteRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ReplaceTransitGatewayRouteResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Replaces the specified route in the specified transit gateway route table.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ReplaceTransitGatewayRouteRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DestinationCidrBlock\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The CIDR range used for the destination match. Routing decisions are based on the most specific match.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TransitGatewayRouteTableId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayRouteTableId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the route table.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TransitGatewayAttachmentId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayAttachmentId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the attachment.</p>\"\n                    }\n                },\n                \"Blackhole\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether traffic matching this route is to be dropped.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ReplaceTransitGatewayRouteResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Route\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayRoute\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Route\",\n                        \"smithy.api#documentation\": \"<p>Information about the modified route.</p>\",\n                        \"smithy.api#xmlName\": \"route\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ReplaceVpnTunnel\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ReplaceVpnTunnelRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ReplaceVpnTunnelResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Trigger replacement of specified VPN tunnel.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ReplaceVpnTunnelRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VpnConnectionId\": {\n                    \"target\": \"com.amazonaws.ec2#VpnConnectionId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the Site-to-Site VPN connection. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"VpnTunnelOutsideIpAddress\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The external IP address of the VPN tunnel.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ApplyPendingMaintenance\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Trigger pending tunnel endpoint maintenance.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ReplaceVpnTunnelResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Return\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Return\",\n                        \"smithy.api#documentation\": \"<p>Confirmation of replace tunnel operation.</p>\",\n                        \"smithy.api#xmlName\": \"return\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ReplacementStrategy\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"LAUNCH\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"launch\"\n                    }\n                },\n                \"LAUNCH_BEFORE_TERMINATE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"launch-before-terminate\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ReportInstanceReasonCodes\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"instance_stuck_in_state\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"instance-stuck-in-state\"\n                    }\n                },\n                \"unresponsive\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"unresponsive\"\n                    }\n                },\n                \"not_accepting_credentials\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"not-accepting-credentials\"\n                    }\n                },\n                \"password_not_available\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"password-not-available\"\n                    }\n                },\n                \"performance_network\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"performance-network\"\n                    }\n                },\n                \"performance_instance_store\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"performance-instance-store\"\n                    }\n                },\n                \"performance_ebs_volume\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"performance-ebs-volume\"\n                    }\n                },\n                \"performance_other\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"performance-other\"\n                    }\n                },\n                \"other\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"other\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ReportInstanceStatus\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ReportInstanceStatusRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Submits feedback about the status of an instance. The instance must be in the\\n                <code>running</code> state. If your experience with the instance differs from the\\n            instance status returned by <a>DescribeInstanceStatus</a>, use <a>ReportInstanceStatus</a> to report your experience with the instance. Amazon\\n            EC2 collects this information to improve the accuracy of status checks.</p>\\n         <p>Use of this action does not change the value returned by <a>DescribeInstanceStatus</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ReportInstanceStatusRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the operation, without actually making the \\n  request, and provides an error response. If you have the required permissions, the error response is \\n  <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"Instances\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceIdStringList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceId\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The instances.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"instanceId\"\n                    }\n                },\n                \"Status\": {\n                    \"target\": \"com.amazonaws.ec2#ReportStatusType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Status\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The status of all instances listed.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"status\"\n                    }\n                },\n                \"StartTime\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"StartTime\",\n                        \"smithy.api#documentation\": \"<p>The time at which the reported instance health state began.</p>\",\n                        \"smithy.api#xmlName\": \"startTime\"\n                    }\n                },\n                \"EndTime\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EndTime\",\n                        \"smithy.api#documentation\": \"<p>The time at which the reported instance health state ended.</p>\",\n                        \"smithy.api#xmlName\": \"endTime\"\n                    }\n                },\n                \"ReasonCodes\": {\n                    \"target\": \"com.amazonaws.ec2#ReasonCodesList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ReasonCode\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The reason codes that describe the health state of your instance.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>instance-stuck-in-state</code>: My instance is stuck in a state.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>unresponsive</code>: My instance is unresponsive.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>not-accepting-credentials</code>: My instance is not accepting my\\n                    credentials.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>password-not-available</code>: A password is not available for my\\n                    instance.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>performance-network</code>: My instance is experiencing performance\\n                    problems that I believe are network related.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>performance-instance-store</code>: My instance is experiencing performance\\n                    problems that I believe are related to the instance stores.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>performance-ebs-volume</code>: My instance is experiencing performance\\n                    problems that I believe are related to an EBS volume.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>performance-other</code>: My instance is experiencing performance\\n                    problems.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>other</code>: [explain using the description parameter]</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"reasonCode\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#ReportInstanceStatusRequestDescription\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Description\",\n                        \"smithy.api#deprecated\": {\n                            \"message\": \"This member has been deprecated\"\n                        },\n                        \"smithy.api#documentation\": \"<p>Descriptive text about the health state of your instance.</p>\",\n                        \"smithy.api#xmlName\": \"description\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ReportInstanceStatusRequestDescription\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#sensitive\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ReportState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"running\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"running\"\n                    }\n                },\n                \"cancelled\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"cancelled\"\n                    }\n                },\n                \"complete\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"complete\"\n                    }\n                },\n                \"error\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"error\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ReportStatusType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ok\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ok\"\n                    }\n                },\n                \"impaired\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"impaired\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#RequestFilterPortRange\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"FromPort\": {\n                    \"target\": \"com.amazonaws.ec2#Port\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The first port in the range.</p>\"\n                    }\n                },\n                \"ToPort\": {\n                    \"target\": \"com.amazonaws.ec2#Port\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The last port in the range.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a port range.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#RequestHostIdList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#DedicatedHostId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#RequestHostIdSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#DedicatedHostId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#RequestInstanceTypeList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#InstanceType\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 100\n                }\n            }\n        },\n        \"com.amazonaws.ec2#RequestIpamResourceTag\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Key\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The key of a tag assigned to the resource. Use this filter to find all resources assigned a tag with a specific key, regardless of the tag value.</p>\"\n                    }\n                },\n                \"Value\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The value for the tag.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A tag on an IPAM resource.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#RequestIpamResourceTagList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#RequestIpamResourceTag\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#RequestLaunchTemplateData\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"KernelId\": {\n                    \"target\": \"com.amazonaws.ec2#KernelId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the kernel.</p>\\n         <important>\\n            <p>We recommend that you use PV-GRUB instead of kernels and RAM disks. For more\\n                information, see <a href=\\\"https://docs.aws.amazon.com/linux/al2/ug/UserProvidedKernels.html\\\">User provided kernels</a> in the\\n                    <i>Amazon Linux 2 User Guide</i>.</p>\\n         </important>\"\n                    }\n                },\n                \"EbsOptimized\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether the instance is optimized for Amazon EBS I/O. This optimization\\n            provides dedicated throughput to Amazon EBS and an optimized configuration stack to\\n            provide optimal Amazon EBS I/O performance. This optimization isn't available with all\\n            instance types. Additional usage charges apply when using an EBS-optimized\\n            instance.</p>\"\n                    }\n                },\n                \"IamInstanceProfile\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplateIamInstanceProfileSpecificationRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name or Amazon Resource Name (ARN) of an IAM instance profile.</p>\"\n                    }\n                },\n                \"BlockDeviceMappings\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplateBlockDeviceMappingRequestList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The block device mapping.</p>\",\n                        \"smithy.api#xmlName\": \"BlockDeviceMapping\"\n                    }\n                },\n                \"NetworkInterfaces\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplateInstanceNetworkInterfaceSpecificationRequestList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The network interfaces for the instance.</p>\",\n                        \"smithy.api#xmlName\": \"NetworkInterface\"\n                    }\n                },\n                \"ImageId\": {\n                    \"target\": \"com.amazonaws.ec2#ImageId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the AMI in the format <code>ami-0ac394d6a3example</code>.</p>\\n         <p>Alternatively, you can specify a Systems Manager parameter, using one of the following\\n            formats. The Systems Manager parameter will resolve to an AMI ID on launch.</p>\\n         <p>To reference a public parameter:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>resolve:ssm:<i>public-parameter</i>\\n                  </code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>To reference a parameter stored in the same account:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>resolve:ssm:<i>parameter-name</i>\\n                  </code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>resolve:ssm:<i>parameter-name:version-number</i>\\n                  </code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>resolve:ssm:<i>parameter-name:label</i>\\n                  </code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>To reference a parameter shared from another Amazon Web Services account:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>resolve:ssm:<i>parameter-ARN</i>\\n                  </code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>resolve:ssm:<i>parameter-ARN:version-number</i>\\n                  </code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>resolve:ssm:<i>parameter-ARN:label</i>\\n                  </code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/create-launch-template.html#use-an-ssm-parameter-instead-of-an-ami-id\\\">Use a Systems Manager parameter instead of an AMI ID</a> in the\\n                <i>Amazon EC2 User Guide</i>.</p>\\n         <note>\\n            <p>If the launch template will be used for an EC2 Fleet or Spot Fleet, note the\\n                following:</p>\\n            <ul>\\n               <li>\\n                  <p>Only EC2 Fleets of type <code>instant</code> support specifying a Systems\\n                        Manager parameter.</p>\\n               </li>\\n               <li>\\n                  <p>For EC2 Fleets of type <code>maintain</code> or <code>request</code>, or\\n                        for Spot Fleets, you must specify the AMI ID.</p>\\n               </li>\\n            </ul>\\n         </note>\"\n                    }\n                },\n                \"InstanceType\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The instance type. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html\\\">Amazon EC2 instance types</a> in\\n            the <i>Amazon EC2 User Guide</i>.</p>\\n         <p>If you specify <code>InstanceType</code>, you can't specify\\n                <code>InstanceRequirements</code>.</p>\"\n                    }\n                },\n                \"KeyName\": {\n                    \"target\": \"com.amazonaws.ec2#KeyPairName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the key pair. You can create a key pair using <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateKeyPair.html\\\">CreateKeyPair</a> or\\n                <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ImportKeyPair.html\\\">ImportKeyPair</a>.</p>\\n         <important>\\n            <p>If you do not specify a key pair, you can't connect to the instance unless you\\n                choose an AMI that is configured to allow users another way to log in.</p>\\n         </important>\"\n                    }\n                },\n                \"Monitoring\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplatesMonitoringRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The monitoring for the instance.</p>\"\n                    }\n                },\n                \"Placement\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplatePlacementRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The placement for the instance.</p>\"\n                    }\n                },\n                \"RamDiskId\": {\n                    \"target\": \"com.amazonaws.ec2#RamdiskId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the RAM disk.</p>\\n         <important>\\n            <p>We recommend that you use PV-GRUB instead of kernels and RAM disks. For more\\n                information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/UserProvidedkernels.html\\\">User provided\\n                    kernels</a> in the <i>Amazon EC2 User Guide</i>.</p>\\n         </important>\"\n                    }\n                },\n                \"DisableApiTermination\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether termination protection is enabled for the instance. The default is\\n                <code>false</code>, which means that you can terminate the instance using the Amazon EC2\\n            console, command line tools, or API. You can enable termination protection when you\\n            launch an instance, while the instance is running, or while the instance is\\n            stopped.</p>\"\n                    }\n                },\n                \"InstanceInitiatedShutdownBehavior\": {\n                    \"target\": \"com.amazonaws.ec2#ShutdownBehavior\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether an instance stops or terminates when you initiate shutdown from the\\n            instance (using the operating system command for system shutdown).</p>\\n         <p>Default: <code>stop</code>\\n         </p>\"\n                    }\n                },\n                \"UserData\": {\n                    \"target\": \"com.amazonaws.ec2#SensitiveUserData\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The user data to make available to the instance. You must provide base64-encoded text.\\n            User data is limited to 16 KB. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/user-data.html\\\">Run commands when you launch an EC2\\n                instance with user data input</a> in the\\n            <i>Amazon EC2 User Guide</i>.</p>\\n         <p>If you are creating the launch template for use with Batch, the user\\n            data must be provided in the <a href=\\\"https://cloudinit.readthedocs.io/en/latest/topics/format.html#mime-multi-part-archive\\\">MIME multi-part archive format</a>. For more information, see <a href=\\\"https://docs.aws.amazon.com/batch/latest/userguide/launch-templates.html#lt-user-data\\\">Amazon EC2 user data in launch templates</a> in the\\n                    <i>Batch User Guide</i>.</p>\"\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplateTagSpecificationRequestList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags to apply to the resources that are created during instance launch. These tags\\n            are not applied to the launch template.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                },\n                \"ElasticGpuSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#ElasticGpuSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#deprecated\": {\n                            \"since\": \"2024-01-08\",\n                            \"message\": \"Specifying Elastic Graphics accelerators is no longer supported on the RunInstances API.\"\n                        },\n                        \"smithy.api#documentation\": \"<p>Deprecated.</p>\\n         <note>\\n            <p>Amazon Elastic Graphics reached end of life on January 8, 2024.</p>\\n         </note>\",\n                        \"smithy.api#xmlName\": \"ElasticGpuSpecification\"\n                    }\n                },\n                \"ElasticInferenceAccelerators\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplateElasticInferenceAcceleratorList\",\n                    \"traits\": {\n                        \"smithy.api#deprecated\": {\n                            \"since\": \"2024-01-08\",\n                            \"message\": \"Specifying Elastic Inference accelerators is no longer supported on the RunInstances API.\"\n                        },\n                        \"smithy.api#documentation\": \"<note>\\n            <p>Amazon Elastic Inference is no longer available.</p>\\n         </note>\\n         <p>An elastic inference accelerator to associate with the instance. Elastic inference\\n            accelerators are a resource you can attach to your Amazon EC2 instances to accelerate\\n            your Deep Learning (DL) inference workloads.</p>\\n         <p>You cannot specify accelerators from different generations in the same request.</p>\",\n                        \"smithy.api#xmlName\": \"ElasticInferenceAccelerator\"\n                    }\n                },\n                \"SecurityGroupIds\": {\n                    \"target\": \"com.amazonaws.ec2#SecurityGroupIdStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the security groups.</p>\\n         <p>If you specify a network interface, you must specify any security groups as part of\\n            the network interface instead of using this parameter.</p>\",\n                        \"smithy.api#xmlName\": \"SecurityGroupId\"\n                    }\n                },\n                \"SecurityGroups\": {\n                    \"target\": \"com.amazonaws.ec2#SecurityGroupStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The names of the security groups. For a nondefault VPC, you must use security group\\n            IDs instead.</p>\\n         <p>If you specify a network interface, you must specify any security groups as part of\\n            the network interface instead of using this parameter.</p>\",\n                        \"smithy.api#xmlName\": \"SecurityGroup\"\n                    }\n                },\n                \"InstanceMarketOptions\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplateInstanceMarketOptionsRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The market (purchasing) option for the instances.</p>\"\n                    }\n                },\n                \"CreditSpecification\": {\n                    \"target\": \"com.amazonaws.ec2#CreditSpecificationRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The credit option for CPU usage of the instance. Valid only for T instances.</p>\"\n                    }\n                },\n                \"CpuOptions\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplateCpuOptionsRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The CPU options for the instance. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-optimize-cpu.html\\\">CPU\\n                options for Amazon EC2 instances</a> in the\\n            <i>Amazon EC2 User Guide</i>.</p>\"\n                    }\n                },\n                \"CapacityReservationSpecification\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplateCapacityReservationSpecificationRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Capacity Reservation targeting option. If you do not specify this parameter, the\\n            instance's Capacity Reservation preference defaults to <code>open</code>, which enables\\n            it to run in any open Capacity Reservation that has matching attributes (instance type,\\n            platform, Availability Zone).</p>\"\n                    }\n                },\n                \"LicenseSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplateLicenseSpecificationListRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The license configurations.</p>\",\n                        \"smithy.api#xmlName\": \"LicenseSpecification\"\n                    }\n                },\n                \"HibernationOptions\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplateHibernationOptionsRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether an instance is enabled for hibernation. This parameter is valid only\\n            if the instance meets the <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/hibernating-prerequisites.html\\\">hibernation\\n                prerequisites</a>. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Hibernate.html\\\">Hibernate your Amazon EC2 instance</a>\\n            in the <i>Amazon EC2 User Guide</i>.</p>\"\n                    }\n                },\n                \"MetadataOptions\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplateInstanceMetadataOptionsRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The metadata options for the instance. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/configuring-instance-metadata-options.html\\\">Configure\\n                the Instance Metadata Service options</a> in the\\n                <i>Amazon EC2 User Guide</i>.</p>\"\n                    }\n                },\n                \"EnclaveOptions\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplateEnclaveOptionsRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether the instance is enabled for Amazon Web Services Nitro Enclaves. For more\\n            information, see <a href=\\\"https://docs.aws.amazon.com/enclaves/latest/user/nitro-enclave.html\\\">What is Nitro Enclaves?</a> in the\\n                <i>Amazon Web Services Nitro Enclaves User Guide</i>.</p>\\n         <p>You can't enable Amazon Web Services Nitro Enclaves and hibernation on the same instance.</p>\"\n                    }\n                },\n                \"InstanceRequirements\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceRequirementsRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The attributes for the instance types. When you specify instance attributes, Amazon EC2 will\\n         identify instance types with these attributes.</p>\\n         <p>You must specify <code>VCpuCount</code> and <code>MemoryMiB</code>. All other attributes\\n         are optional. Any unspecified optional attribute is set to its default.</p>\\n         <p>When you specify multiple attributes, you get instance types that satisfy all of the\\n         specified attributes. If you specify multiple values for an attribute, you get instance\\n         types that satisfy any of the specified values.</p>\\n         <p>To limit the list of instance types from which Amazon EC2 can identify matching instance types, \\n         you can use one of the following parameters, but not both in the same request:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>AllowedInstanceTypes</code> - The instance types to include in the list. All \\n               other instance types are ignored, even if they match your specified attributes.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ExcludedInstanceTypes</code> - The instance types to exclude from the list, \\n               even if they match your specified attributes.</p>\\n            </li>\\n         </ul>\\n         <note>\\n            <p>If you specify <code>InstanceRequirements</code>, you can't specify\\n            <code>InstanceType</code>.</p>\\n            <p>Attribute-based instance type selection is only supported when using Auto Scaling\\n            groups, EC2 Fleet, and Spot Fleet to launch instances. If you plan to use the launch template in\\n            the <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-launch-instance-wizard.html\\\">launch instance\\n               wizard</a>, or with the <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RunInstances.html\\\">RunInstances</a> API or\\n              <a href=\\\"https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-instance.html\\\">AWS::EC2::Instance</a> Amazon Web Services CloudFormation resource, you can't specify <code>InstanceRequirements</code>.</p>\\n         </note>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-fleet-attribute-based-instance-type-selection.html\\\">Specify attributes for instance type selection for EC2 Fleet or Spot Fleet</a> and <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-placement-score.html\\\">Spot\\n            placement score</a> in the <i>Amazon EC2 User Guide</i>.</p>\"\n                    }\n                },\n                \"PrivateDnsNameOptions\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplatePrivateDnsNameOptionsRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The options for the instance hostname. The default values are inherited from the\\n            subnet.</p>\"\n                    }\n                },\n                \"MaintenanceOptions\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplateInstanceMaintenanceOptionsRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maintenance options for the instance.</p>\"\n                    }\n                },\n                \"DisableApiStop\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether to enable the instance for stop protection. For more information,\\n            see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-stop-protection.html\\\">Enable stop protection for your EC2 instances</a> in the\\n                <i>Amazon EC2 User Guide</i>.</p>\"\n                    }\n                },\n                \"Operator\": {\n                    \"target\": \"com.amazonaws.ec2#OperatorRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The entity that manages the launch template.</p>\"\n                    }\n                },\n                \"NetworkPerformanceOptions\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplateNetworkPerformanceOptionsRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Contains launch template settings to boost network performance for the type of\\n            workload that runs on your instance.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The information to include in the launch template.</p>\\n         <note>\\n            <p>You must specify at least one parameter for the launch template data.</p>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.ec2#RequestSpotFleet\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#RequestSpotFleetRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#RequestSpotFleetResponse\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates a Spot Fleet request.</p>\\n         <p>The Spot Fleet request specifies the total target capacity and the On-Demand target\\n            capacity. Amazon EC2 calculates the difference between the total capacity and On-Demand\\n            capacity, and launches the difference as Spot capacity.</p>\\n         <p>You can submit a single request that includes multiple launch specifications that vary\\n            by instance type, AMI, Availability Zone, or subnet.</p>\\n         <p>By default, the Spot Fleet requests Spot Instances in the Spot Instance pool where the\\n            price per unit is the lowest. Each launch specification can include its own instance\\n            weighting that reflects the value of the instance type to your application\\n            workload.</p>\\n         <p>Alternatively, you can specify that the Spot Fleet distribute the target capacity\\n            across the Spot pools included in its launch specifications. By ensuring that the Spot\\n            Instances in your Spot Fleet are in different Spot pools, you can improve the\\n            availability of your fleet.</p>\\n         <p>You can specify tags for the Spot Fleet request and instances launched by the fleet.\\n            You cannot tag other resource types in a Spot Fleet request because only the\\n                <code>spot-fleet-request</code> and <code>instance</code> resource types are\\n            supported.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-fleet-requests.html\\\">Spot Fleet requests</a>\\n            in the <i>Amazon EC2 User Guide</i>.</p>\\n         <important>\\n            <p>We strongly discourage using the RequestSpotFleet API because it is a legacy\\n                API with no planned investment. For options for requesting Spot Instances, see\\n                <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-best-practices.html#which-spot-request-method-to-use\\\">Which\\n                    is the best Spot request method to use?</a> in the\\n                <i>Amazon EC2 User Guide</i>.</p>\\n         </important>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To request a Spot fleet in the subnet with the lowest price\",\n                        \"documentation\": \"This example creates a Spot fleet request with two launch specifications that differ only by subnet. The Spot fleet launches the instances in the specified subnet with the lowest price. If the instances are launched in a default VPC, they receive a public IP address by default. If the instances are launched in a nondefault VPC, they do not receive a public IP address by default. Note that you can't specify different subnets from the same Availability Zone in a Spot fleet request.\",\n                        \"input\": {\n                            \"SpotFleetRequestConfig\": {\n                                \"SpotPrice\": \"0.04\",\n                                \"TargetCapacity\": 2,\n                                \"IamFleetRole\": \"arn:aws:iam::123456789012:role/my-spot-fleet-role\",\n                                \"LaunchSpecifications\": [\n                                    {\n                                        \"ImageId\": \"ami-1a2b3c4d\",\n                                        \"KeyName\": \"my-key-pair\",\n                                        \"SecurityGroups\": [\n                                            {\n                                                \"GroupId\": \"sg-1a2b3c4d\"\n                                            }\n                                        ],\n                                        \"InstanceType\": \"m3.medium\",\n                                        \"SubnetId\": \"subnet-1a2b3c4d, subnet-3c4d5e6f\",\n                                        \"IamInstanceProfile\": {\n                                            \"Arn\": \"arn:aws:iam::123456789012:instance-profile/my-iam-role\"\n                                        }\n                                    }\n                                ]\n                            }\n                        },\n                        \"output\": {\n                            \"SpotFleetRequestId\": \"sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE\"\n                        }\n                    },\n                    {\n                        \"title\": \"To request a Spot fleet in the Availability Zone with the lowest price\",\n                        \"documentation\": \"This example creates a Spot fleet request with two launch specifications that differ only by Availability Zone. The Spot fleet launches the instances in the specified Availability Zone with the lowest price. If your account supports EC2-VPC only, Amazon EC2 launches the Spot instances in the default subnet of the Availability Zone.\",\n                        \"input\": {\n                            \"SpotFleetRequestConfig\": {\n                                \"SpotPrice\": \"0.04\",\n                                \"TargetCapacity\": 2,\n                                \"IamFleetRole\": \"arn:aws:iam::123456789012:role/my-spot-fleet-role\",\n                                \"LaunchSpecifications\": [\n                                    {\n                                        \"ImageId\": \"ami-1a2b3c4d\",\n                                        \"KeyName\": \"my-key-pair\",\n                                        \"SecurityGroups\": [\n                                            {\n                                                \"GroupId\": \"sg-1a2b3c4d\"\n                                            }\n                                        ],\n                                        \"InstanceType\": \"m3.medium\",\n                                        \"Placement\": {\n                                            \"AvailabilityZone\": \"us-west-2a, us-west-2b\"\n                                        },\n                                        \"IamInstanceProfile\": {\n                                            \"Arn\": \"arn:aws:iam::123456789012:instance-profile/my-iam-role\"\n                                        }\n                                    }\n                                ]\n                            }\n                        },\n                        \"output\": {\n                            \"SpotFleetRequestId\": \"sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE\"\n                        }\n                    },\n                    {\n                        \"title\": \"To launch Spot instances in a subnet and assign them public IP addresses\",\n                        \"documentation\": \"This example assigns public addresses to instances launched in a nondefault VPC. Note that when you specify a network interface, you must include the subnet ID and security group ID using the network interface.\",\n                        \"input\": {\n                            \"SpotFleetRequestConfig\": {\n                                \"SpotPrice\": \"0.04\",\n                                \"TargetCapacity\": 2,\n                                \"IamFleetRole\": \"arn:aws:iam::123456789012:role/my-spot-fleet-role\",\n                                \"LaunchSpecifications\": [\n                                    {\n                                        \"ImageId\": \"ami-1a2b3c4d\",\n                                        \"KeyName\": \"my-key-pair\",\n                                        \"InstanceType\": \"m3.medium\",\n                                        \"NetworkInterfaces\": [\n                                            {\n                                                \"DeviceIndex\": 0,\n                                                \"SubnetId\": \"subnet-1a2b3c4d\",\n                                                \"Groups\": [\n                                                    \"sg-1a2b3c4d\"\n                                                ],\n                                                \"AssociatePublicIpAddress\": true\n                                            }\n                                        ],\n                                        \"IamInstanceProfile\": {\n                                            \"Arn\": \"arn:aws:iam::880185128111:instance-profile/my-iam-role\"\n                                        }\n                                    }\n                                ]\n                            }\n                        },\n                        \"output\": {\n                            \"SpotFleetRequestId\": \"sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE\"\n                        }\n                    },\n                    {\n                        \"title\": \"To request a Spot fleet using the diversified allocation strategy\",\n                        \"documentation\": \"This example creates a Spot fleet request that launches 30 instances using the diversified allocation strategy. The launch specifications differ by instance type. The Spot fleet distributes the instances across the launch specifications such that there are 10 instances of each type.\",\n                        \"input\": {\n                            \"SpotFleetRequestConfig\": {\n                                \"SpotPrice\": \"0.70\",\n                                \"TargetCapacity\": 30,\n                                \"AllocationStrategy\": \"diversified\",\n                                \"IamFleetRole\": \"arn:aws:iam::123456789012:role/my-spot-fleet-role\",\n                                \"LaunchSpecifications\": [\n                                    {\n                                        \"ImageId\": \"ami-1a2b3c4d\",\n                                        \"InstanceType\": \"c4.2xlarge\",\n                                        \"SubnetId\": \"subnet-1a2b3c4d\"\n                                    },\n                                    {\n                                        \"ImageId\": \"ami-1a2b3c4d\",\n                                        \"InstanceType\": \"m3.2xlarge\",\n                                        \"SubnetId\": \"subnet-1a2b3c4d\"\n                                    },\n                                    {\n                                        \"ImageId\": \"ami-1a2b3c4d\",\n                                        \"InstanceType\": \"r3.2xlarge\",\n                                        \"SubnetId\": \"subnet-1a2b3c4d\"\n                                    }\n                                ]\n                            }\n                        },\n                        \"output\": {\n                            \"SpotFleetRequestId\": \"sfr-73fbd2ce-aa30-494c-8788-1cee4EXAMPLE\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#RequestSpotFleetRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually\\n            making the request, and provides an error response. If you have the required\\n            permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is\\n                <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"SpotFleetRequestConfig\": {\n                    \"target\": \"com.amazonaws.ec2#SpotFleetRequestConfigData\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SpotFleetRequestConfig\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The configuration for the Spot Fleet request.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"spotFleetRequestConfig\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the parameters for RequestSpotFleet.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#RequestSpotFleetResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SpotFleetRequestId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SpotFleetRequestId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Spot Fleet request.</p>\",\n                        \"smithy.api#xmlName\": \"spotFleetRequestId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the output of RequestSpotFleet.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#RequestSpotInstances\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#RequestSpotInstancesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#RequestSpotInstancesResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates a Spot Instance request.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-requests.html\\\">Work with Spot Instance</a> in\\n            the <i>Amazon EC2 User Guide</i>.</p>\\n         <important>\\n            <p>We strongly discourage using the RequestSpotInstances API because it is a legacy\\n                API with no planned investment. For options for requesting Spot Instances, see\\n                    <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-best-practices.html#which-spot-request-method-to-use\\\">Which\\n                    is the best Spot request method to use?</a> in the\\n                    <i>Amazon EC2 User Guide</i>.</p>\\n         </important>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To create a one-time Spot Instance request\",\n                        \"documentation\": \"This example creates a one-time Spot Instance request for five instances in the specified Availability Zone. If your account supports EC2-VPC only, Amazon EC2 launches the instances in the default subnet of the specified Availability Zone.\",\n                        \"input\": {\n                            \"SpotPrice\": \"0.03\",\n                            \"InstanceCount\": 5,\n                            \"Type\": \"one-time\",\n                            \"LaunchSpecification\": {\n                                \"ImageId\": \"ami-1a2b3c4d\",\n                                \"KeyName\": \"my-key-pair\",\n                                \"SecurityGroupIds\": [\n                                    \"sg-1a2b3c4d\"\n                                ],\n                                \"InstanceType\": \"m3.medium\",\n                                \"Placement\": {\n                                    \"AvailabilityZone\": \"us-west-2a\"\n                                },\n                                \"IamInstanceProfile\": {\n                                    \"Arn\": \"arn:aws:iam::123456789012:instance-profile/my-iam-role\"\n                                }\n                            }\n                        }\n                    },\n                    {\n                        \"title\": \"To create a one-time Spot Instance request\",\n                        \"documentation\": \"This example command creates a one-time Spot Instance request for five instances in the specified subnet. Amazon EC2 launches the instances in the specified subnet. If the VPC is a nondefault VPC, the instances do not receive a public IP address by default.\",\n                        \"input\": {\n                            \"SpotPrice\": \"0.050\",\n                            \"InstanceCount\": 5,\n                            \"Type\": \"one-time\",\n                            \"LaunchSpecification\": {\n                                \"ImageId\": \"ami-1a2b3c4d\",\n                                \"SecurityGroupIds\": [\n                                    \"sg-1a2b3c4d\"\n                                ],\n                                \"InstanceType\": \"m3.medium\",\n                                \"SubnetId\": \"subnet-1a2b3c4d\",\n                                \"IamInstanceProfile\": {\n                                    \"Arn\": \"arn:aws:iam::123456789012:instance-profile/my-iam-role\"\n                                }\n                            }\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#RequestSpotInstancesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LaunchSpecification\": {\n                    \"target\": \"com.amazonaws.ec2#RequestSpotLaunchSpecification\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The launch specification.</p>\"\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The key-value pair for tagging the Spot Instance request on creation. The value for\\n            <code>ResourceType</code> must be <code>spot-instances-request</code>, otherwise the\\n            Spot Instance request fails. To tag the Spot Instance request after it has been created,\\n            see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateTags.html\\\">CreateTags</a>. </p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                },\n                \"InstanceInterruptionBehavior\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceInterruptionBehavior\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The behavior when a Spot Instance is interrupted. The default is <code>terminate</code>.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually\\n            making the request, and provides an error response. If you have the required\\n            permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is\\n                <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"SpotPrice\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SpotPrice\",\n                        \"smithy.api#documentation\": \"<p>The maximum price per unit hour that you are willing to pay for a Spot Instance. We do not recommend \\n            using this parameter because it can lead to increased interruptions. If you do not specify this parameter, you will pay the current Spot price.</p>\\n         <important>\\n            <p>If you specify a maximum price, your instances will be interrupted more frequently than if you do not specify this parameter.</p>\\n         </important>\",\n                        \"smithy.api#xmlName\": \"spotPrice\"\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ClientToken\",\n                        \"smithy.api#documentation\": \"<p>Unique, case-sensitive identifier that you provide to ensure the idempotency of the\\n            request. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Run_Instance_Idempotency.html\\\">Ensuring idempotency in\\n                Amazon EC2 API requests</a> in the <i>Amazon EC2 User Guide</i>.</p>\",\n                        \"smithy.api#xmlName\": \"clientToken\"\n                    }\n                },\n                \"InstanceCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceCount\",\n                        \"smithy.api#documentation\": \"<p>The maximum number of Spot Instances to launch.</p>\\n         <p>Default: 1</p>\",\n                        \"smithy.api#xmlName\": \"instanceCount\"\n                    }\n                },\n                \"Type\": {\n                    \"target\": \"com.amazonaws.ec2#SpotInstanceType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Type\",\n                        \"smithy.api#documentation\": \"<p>The Spot Instance request type.</p>\\n         <p>Default: <code>one-time</code>\\n         </p>\",\n                        \"smithy.api#xmlName\": \"type\"\n                    }\n                },\n                \"ValidFrom\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ValidFrom\",\n                        \"smithy.api#documentation\": \"<p>The start date of the request. If this is a one-time request, the request becomes\\n            active at this date and time and remains active until all instances launch, the request\\n            expires, or the request is canceled. If the request is persistent, the request becomes\\n            active at this date and time and remains active until it expires or is canceled.</p>\\n         <p>The specified start date and time cannot be equal to the current date and time. You\\n            must specify a start date and time that occurs after the current date and time.</p>\",\n                        \"smithy.api#xmlName\": \"validFrom\"\n                    }\n                },\n                \"ValidUntil\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ValidUntil\",\n                        \"smithy.api#documentation\": \"<p>The end date of the request, in UTC format\\n                (<i>YYYY</i>-<i>MM</i>-<i>DD</i>T<i>HH</i>:<i>MM</i>:<i>SS</i>Z).</p>\\n         <ul>\\n            <li>\\n               <p>For a persistent request, the request remains active until the\\n                        <code>ValidUntil</code> date and time is reached. Otherwise, the request\\n                    remains active until you cancel it. </p>\\n            </li>\\n            <li>\\n               <p>For a one-time request, the request remains active until all instances launch,\\n                    the request is canceled, or the <code>ValidUntil</code> date and time is\\n                    reached. By default, the request is valid for 7 days from the date the request\\n                    was created.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"validUntil\"\n                    }\n                },\n                \"LaunchGroup\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LaunchGroup\",\n                        \"smithy.api#documentation\": \"<p>The instance launch group. Launch groups are Spot Instances that launch together and\\n            terminate together.</p>\\n         <p>Default: Instances are launched and terminated individually</p>\",\n                        \"smithy.api#xmlName\": \"launchGroup\"\n                    }\n                },\n                \"AvailabilityZoneGroup\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AvailabilityZoneGroup\",\n                        \"smithy.api#documentation\": \"<p>The user-specified name for a logical grouping of requests.</p>\\n         <p>When you specify an Availability Zone group in a Spot Instance request, all Spot\\n            Instances in the request are launched in the same Availability Zone. Instance proximity\\n            is maintained with this parameter, but the choice of Availability Zone is not. The group\\n            applies only to requests for Spot Instances of the same instance type. Any additional\\n            Spot Instance requests that are specified with the same Availability Zone group name are\\n            launched in that same Availability Zone, as long as at least one instance from the group\\n            is still active.</p>\\n         <p>If there is no active instance running in the Availability Zone group that you specify\\n            for a new Spot Instance request (all instances are terminated, the request is expired,\\n            or the maximum price you specified falls below current Spot price), then Amazon EC2 launches\\n            the instance in any Availability Zone where the constraint can be met. Consequently, the\\n            subsequent set of Spot Instances could be placed in a different zone from the original\\n            request, even if you specified the same Availability Zone group.</p>\\n         <p>Default: Instances are launched in any available Availability Zone.</p>\",\n                        \"smithy.api#xmlName\": \"availabilityZoneGroup\"\n                    }\n                },\n                \"BlockDurationMinutes\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"BlockDurationMinutes\",\n                        \"smithy.api#documentation\": \"<p>Deprecated.</p>\",\n                        \"smithy.api#xmlName\": \"blockDurationMinutes\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the parameters for RequestSpotInstances.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#RequestSpotInstancesResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SpotInstanceRequests\": {\n                    \"target\": \"com.amazonaws.ec2#SpotInstanceRequestList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SpotInstanceRequestSet\",\n                        \"smithy.api#documentation\": \"<p>The Spot Instance requests.</p>\",\n                        \"smithy.api#xmlName\": \"spotInstanceRequestSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the output of RequestSpotInstances.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#RequestSpotLaunchSpecification\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SecurityGroupIds\": {\n                    \"target\": \"com.amazonaws.ec2#RequestSpotLaunchSpecificationSecurityGroupIdList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the security groups.</p>\",\n                        \"smithy.api#xmlName\": \"SecurityGroupId\"\n                    }\n                },\n                \"SecurityGroups\": {\n                    \"target\": \"com.amazonaws.ec2#RequestSpotLaunchSpecificationSecurityGroupList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Not supported.</p>\",\n                        \"smithy.api#xmlName\": \"SecurityGroup\"\n                    }\n                },\n                \"AddressingType\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AddressingType\",\n                        \"smithy.api#documentation\": \"<p>Deprecated.</p>\",\n                        \"smithy.api#xmlName\": \"addressingType\"\n                    }\n                },\n                \"BlockDeviceMappings\": {\n                    \"target\": \"com.amazonaws.ec2#BlockDeviceMappingList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"BlockDeviceMapping\",\n                        \"smithy.api#documentation\": \"<p>The block device mapping entries. You can't specify both a snapshot ID and an encryption value. \\n           This is because only blank volumes can be encrypted on creation. If a snapshot is the basis for a volume, \\n           it is not blank and its encryption status is used for the volume encryption status.</p>\",\n                        \"smithy.api#xmlName\": \"blockDeviceMapping\"\n                    }\n                },\n                \"EbsOptimized\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EbsOptimized\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether the instance is optimized for EBS I/O. This optimization provides dedicated throughput to Amazon EBS and an optimized configuration stack to provide optimal EBS I/O performance. This optimization isn't available with all instance types. Additional usage charges apply when using an EBS Optimized instance.</p>\\n         <p>Default: <code>false</code>\\n         </p>\",\n                        \"smithy.api#xmlName\": \"ebsOptimized\"\n                    }\n                },\n                \"IamInstanceProfile\": {\n                    \"target\": \"com.amazonaws.ec2#IamInstanceProfileSpecification\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IamInstanceProfile\",\n                        \"smithy.api#documentation\": \"<p>The IAM instance profile.</p>\",\n                        \"smithy.api#xmlName\": \"iamInstanceProfile\"\n                    }\n                },\n                \"ImageId\": {\n                    \"target\": \"com.amazonaws.ec2#ImageId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ImageId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the AMI.</p>\",\n                        \"smithy.api#xmlName\": \"imageId\"\n                    }\n                },\n                \"InstanceType\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceType\",\n                        \"smithy.api#documentation\": \"<p>The instance type. Only one instance type can be specified.</p>\",\n                        \"smithy.api#xmlName\": \"instanceType\"\n                    }\n                },\n                \"KernelId\": {\n                    \"target\": \"com.amazonaws.ec2#KernelId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"KernelId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the kernel.</p>\",\n                        \"smithy.api#xmlName\": \"kernelId\"\n                    }\n                },\n                \"KeyName\": {\n                    \"target\": \"com.amazonaws.ec2#KeyPairNameWithResolver\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"KeyName\",\n                        \"smithy.api#documentation\": \"<p>The name of the key pair.</p>\",\n                        \"smithy.api#xmlName\": \"keyName\"\n                    }\n                },\n                \"Monitoring\": {\n                    \"target\": \"com.amazonaws.ec2#RunInstancesMonitoringEnabled\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Monitoring\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether basic or detailed monitoring is enabled for the instance.</p>\\n         <p>Default: Disabled</p>\",\n                        \"smithy.api#xmlName\": \"monitoring\"\n                    }\n                },\n                \"NetworkInterfaces\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceNetworkInterfaceSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The network interfaces. If you specify a network interface, you must specify \\n           subnet IDs and security group IDs using the network interface.</p>\",\n                        \"smithy.api#xmlName\": \"NetworkInterface\"\n                    }\n                },\n                \"Placement\": {\n                    \"target\": \"com.amazonaws.ec2#SpotPlacement\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Placement\",\n                        \"smithy.api#documentation\": \"<p>The placement information for the instance.</p>\",\n                        \"smithy.api#xmlName\": \"placement\"\n                    }\n                },\n                \"RamdiskId\": {\n                    \"target\": \"com.amazonaws.ec2#RamdiskId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RamdiskId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the RAM disk.</p>\",\n                        \"smithy.api#xmlName\": \"ramdiskId\"\n                    }\n                },\n                \"SubnetId\": {\n                    \"target\": \"com.amazonaws.ec2#SubnetId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SubnetId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the subnet in which to launch the instance.</p>\",\n                        \"smithy.api#xmlName\": \"subnetId\"\n                    }\n                },\n                \"UserData\": {\n                    \"target\": \"com.amazonaws.ec2#SensitiveUserData\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"UserData\",\n                        \"smithy.api#documentation\": \"<p>The base64-encoded user data that instances use when starting up. User data is limited to 16 KB.</p>\",\n                        \"smithy.api#xmlName\": \"userData\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the launch specification for an instance.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#RequestSpotLaunchSpecificationSecurityGroupIdList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#SecurityGroupId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#RequestSpotLaunchSpecificationSecurityGroupList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#String\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#Reservation\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ReservationId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ReservationId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the reservation.</p>\",\n                        \"smithy.api#xmlName\": \"reservationId\"\n                    }\n                },\n                \"OwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OwnerId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Amazon Web Services account that owns the reservation.</p>\",\n                        \"smithy.api#xmlName\": \"ownerId\"\n                    }\n                },\n                \"RequesterId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RequesterId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the requester that launched the instances on your behalf (for example,\\n                Amazon Web Services Management Console or Auto Scaling).</p>\",\n                        \"smithy.api#xmlName\": \"requesterId\"\n                    }\n                },\n                \"Groups\": {\n                    \"target\": \"com.amazonaws.ec2#GroupIdentifierList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"GroupSet\",\n                        \"smithy.api#documentation\": \"<p>Not supported.</p>\",\n                        \"smithy.api#xmlName\": \"groupSet\"\n                    }\n                },\n                \"Instances\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstancesSet\",\n                        \"smithy.api#documentation\": \"<p>The instances.</p>\",\n                        \"smithy.api#xmlName\": \"instancesSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a launch request for one or more instances, and includes owner, requester,\\n            and security group information that applies to all instances in the launch\\n            request.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ReservationFleetInstanceSpecification\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceType\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The instance type for which the Capacity Reservation Fleet reserves capacity.</p>\"\n                    }\n                },\n                \"InstancePlatform\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityReservationInstancePlatform\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of operating system for which the Capacity Reservation Fleet reserves\\n\\t\\t\\tcapacity.</p>\"\n                    }\n                },\n                \"Weight\": {\n                    \"target\": \"com.amazonaws.ec2#DoubleWithConstraints\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of capacity units provided by the specified instance type. This value,\\n\\t\\t\\ttogether with the total target capacity that you specify for the Fleet determine the\\n\\t\\t\\tnumber of instances for which the Fleet reserves capacity. Both values are based on\\n\\t\\t\\tunits that make sense for your workload. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/crfleet-concepts.html#target-capacity\\\">Total target\\n\\t\\t\\t\\tcapacity</a> in the <i>Amazon EC2 User Guide</i>.</p>\"\n                    }\n                },\n                \"AvailabilityZone\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Availability Zone in which the Capacity Reservation Fleet reserves the capacity. A\\n\\t\\t\\tCapacity Reservation Fleet can't span Availability Zones. All instance type\\n\\t\\t\\tspecifications that you specify for the Fleet must use the same Availability\\n\\t\\t\\tZone.</p>\"\n                    }\n                },\n                \"AvailabilityZoneId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the Availability Zone in which the Capacity Reservation Fleet reserves the\\n\\t\\t\\tcapacity. A Capacity Reservation Fleet can't span Availability Zones. All instance type\\n\\t\\t\\tspecifications that you specify for the Fleet must use the same Availability\\n\\t\\t\\tZone.</p>\"\n                    }\n                },\n                \"EbsOptimized\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether the Capacity Reservation Fleet supports EBS-optimized instances\\n\\t\\t\\ttypes. This optimization provides dedicated throughput to Amazon EBS and an\\n\\t\\t\\toptimized configuration stack to provide optimal I/O performance. This optimization\\n\\t\\t\\tisn't available with all instance types. Additional usage charges apply when using\\n\\t\\t\\tEBS-optimized instance types.</p>\"\n                    }\n                },\n                \"Priority\": {\n                    \"target\": \"com.amazonaws.ec2#IntegerWithConstraints\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The priority to assign to the instance type. This value is used to determine which of\\n\\t\\t\\tthe instance types specified for the Fleet should be prioritized for use. A lower value\\n\\t\\t\\tindicates a high priority. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/crfleet-concepts.html#instance-priority\\\">Instance type\\n\\t\\t\\t\\tpriority</a> in the <i>Amazon EC2 User Guide</i>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about an instance type to use in a Capacity Reservation Fleet.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ReservationFleetInstanceSpecificationList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ReservationFleetInstanceSpecification\"\n            }\n        },\n        \"com.amazonaws.ec2#ReservationId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#ReservationList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#Reservation\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ReservationState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"PAYMENT_PENDING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"payment-pending\"\n                    }\n                },\n                \"PAYMENT_FAILED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"payment-failed\"\n                    }\n                },\n                \"ACTIVE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"active\"\n                    }\n                },\n                \"RETIRED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"retired\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ReservationValue\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"HourlyPrice\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"HourlyPrice\",\n                        \"smithy.api#documentation\": \"<p>The hourly rate of the reservation.</p>\",\n                        \"smithy.api#xmlName\": \"hourlyPrice\"\n                    }\n                },\n                \"RemainingTotalValue\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RemainingTotalValue\",\n                        \"smithy.api#documentation\": \"<p>The balance of the total value (the sum of remainingUpfrontValue + hourlyPrice * number of\\n      hours remaining).</p>\",\n                        \"smithy.api#xmlName\": \"remainingTotalValue\"\n                    }\n                },\n                \"RemainingUpfrontValue\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RemainingUpfrontValue\",\n                        \"smithy.api#documentation\": \"<p>The remaining upfront cost of the reservation.</p>\",\n                        \"smithy.api#xmlName\": \"remainingUpfrontValue\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The cost associated with the Reserved Instance.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ReservedInstanceIdSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ReservationId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"ReservedInstanceId\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ReservedInstanceLimitPrice\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Amount\": {\n                    \"target\": \"com.amazonaws.ec2#Double\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Amount\",\n                        \"smithy.api#documentation\": \"<p>Used for Reserved Instance Marketplace offerings. Specifies the limit price on the total\\n      order (instanceCount * price).</p>\",\n                        \"smithy.api#xmlName\": \"amount\"\n                    }\n                },\n                \"CurrencyCode\": {\n                    \"target\": \"com.amazonaws.ec2#CurrencyCodeValues\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CurrencyCode\",\n                        \"smithy.api#documentation\": \"<p>The currency in which the <code>limitPrice</code> amount is specified. At this time, the\\n      only supported currency is <code>USD</code>.</p>\",\n                        \"smithy.api#xmlName\": \"currencyCode\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the limit price of a Reserved Instance offering.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ReservedInstanceReservationValue\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ReservationValue\": {\n                    \"target\": \"com.amazonaws.ec2#ReservationValue\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ReservationValue\",\n                        \"smithy.api#documentation\": \"<p>The total value of the Convertible Reserved Instance that you are exchanging.</p>\",\n                        \"smithy.api#xmlName\": \"reservationValue\"\n                    }\n                },\n                \"ReservedInstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ReservedInstanceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Convertible Reserved Instance that you are exchanging.</p>\",\n                        \"smithy.api#xmlName\": \"reservedInstanceId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The total value of the Convertible Reserved Instance.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ReservedInstanceReservationValueSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ReservedInstanceReservationValue\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ReservedInstanceState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"payment_pending\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"payment-pending\"\n                    }\n                },\n                \"active\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"active\"\n                    }\n                },\n                \"payment_failed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"payment-failed\"\n                    }\n                },\n                \"retired\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"retired\"\n                    }\n                },\n                \"queued\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"queued\"\n                    }\n                },\n                \"queued_deleted\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"queued-deleted\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ReservedInstances\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CurrencyCode\": {\n                    \"target\": \"com.amazonaws.ec2#CurrencyCodeValues\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CurrencyCode\",\n                        \"smithy.api#documentation\": \"<p>The currency of the Reserved Instance. It's specified using ISO 4217 standard currency\\n      codes. At this time, the only supported currency is <code>USD</code>.</p>\",\n                        \"smithy.api#xmlName\": \"currencyCode\"\n                    }\n                },\n                \"InstanceTenancy\": {\n                    \"target\": \"com.amazonaws.ec2#Tenancy\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceTenancy\",\n                        \"smithy.api#documentation\": \"<p>The tenancy of the instance.</p>\",\n                        \"smithy.api#xmlName\": \"instanceTenancy\"\n                    }\n                },\n                \"OfferingClass\": {\n                    \"target\": \"com.amazonaws.ec2#OfferingClassType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OfferingClass\",\n                        \"smithy.api#documentation\": \"<p>The offering class of the Reserved Instance.</p>\",\n                        \"smithy.api#xmlName\": \"offeringClass\"\n                    }\n                },\n                \"OfferingType\": {\n                    \"target\": \"com.amazonaws.ec2#OfferingTypeValues\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OfferingType\",\n                        \"smithy.api#documentation\": \"<p>The Reserved Instance offering type.</p>\",\n                        \"smithy.api#xmlName\": \"offeringType\"\n                    }\n                },\n                \"RecurringCharges\": {\n                    \"target\": \"com.amazonaws.ec2#RecurringChargesList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RecurringCharges\",\n                        \"smithy.api#documentation\": \"<p>The recurring charge tag assigned to the resource.</p>\",\n                        \"smithy.api#xmlName\": \"recurringCharges\"\n                    }\n                },\n                \"Scope\": {\n                    \"target\": \"com.amazonaws.ec2#scope\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Scope\",\n                        \"smithy.api#documentation\": \"<p>The scope of the Reserved Instance.</p>\",\n                        \"smithy.api#xmlName\": \"scope\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>Any tags assigned to the resource.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                },\n                \"AvailabilityZoneId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AvailabilityZoneId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Availability Zone.</p>\",\n                        \"smithy.api#xmlName\": \"availabilityZoneId\"\n                    }\n                },\n                \"ReservedInstancesId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ReservedInstancesId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Reserved Instance.</p>\",\n                        \"smithy.api#xmlName\": \"reservedInstancesId\"\n                    }\n                },\n                \"InstanceType\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceType\",\n                        \"smithy.api#documentation\": \"<p>The instance type on which the Reserved Instance can be used.</p>\",\n                        \"smithy.api#xmlName\": \"instanceType\"\n                    }\n                },\n                \"AvailabilityZone\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AvailabilityZone\",\n                        \"smithy.api#documentation\": \"<p>The Availability Zone in which the Reserved Instance can be used.</p>\",\n                        \"smithy.api#xmlName\": \"availabilityZone\"\n                    }\n                },\n                \"Start\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Start\",\n                        \"smithy.api#documentation\": \"<p>The date and time the Reserved Instance started.</p>\",\n                        \"smithy.api#xmlName\": \"start\"\n                    }\n                },\n                \"End\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"End\",\n                        \"smithy.api#documentation\": \"<p>The time when the Reserved Instance expires.</p>\",\n                        \"smithy.api#xmlName\": \"end\"\n                    }\n                },\n                \"Duration\": {\n                    \"target\": \"com.amazonaws.ec2#Long\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Duration\",\n                        \"smithy.api#documentation\": \"<p>The duration of the Reserved Instance, in seconds.</p>\",\n                        \"smithy.api#xmlName\": \"duration\"\n                    }\n                },\n                \"UsagePrice\": {\n                    \"target\": \"com.amazonaws.ec2#Float\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"UsagePrice\",\n                        \"smithy.api#documentation\": \"<p>The usage price of the Reserved Instance, per hour.</p>\",\n                        \"smithy.api#xmlName\": \"usagePrice\"\n                    }\n                },\n                \"FixedPrice\": {\n                    \"target\": \"com.amazonaws.ec2#Float\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"FixedPrice\",\n                        \"smithy.api#documentation\": \"<p>The purchase price of the Reserved Instance.</p>\",\n                        \"smithy.api#xmlName\": \"fixedPrice\"\n                    }\n                },\n                \"InstanceCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceCount\",\n                        \"smithy.api#documentation\": \"<p>The number of reservations purchased.</p>\",\n                        \"smithy.api#xmlName\": \"instanceCount\"\n                    }\n                },\n                \"ProductDescription\": {\n                    \"target\": \"com.amazonaws.ec2#RIProductDescription\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ProductDescription\",\n                        \"smithy.api#documentation\": \"<p>The Reserved Instance product platform description.</p>\",\n                        \"smithy.api#xmlName\": \"productDescription\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#ReservedInstanceState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The state of the Reserved Instance purchase.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a Reserved Instance.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ReservedInstancesConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AvailabilityZone\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AvailabilityZone\",\n                        \"smithy.api#documentation\": \"<p>The Availability Zone for the modified Reserved Instances.</p>\",\n                        \"smithy.api#xmlName\": \"availabilityZone\"\n                    }\n                },\n                \"InstanceCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceCount\",\n                        \"smithy.api#documentation\": \"<p>The number of modified Reserved Instances.</p>\\n         <note>\\n            <p>This is a required field for a request.</p>\\n         </note>\",\n                        \"smithy.api#xmlName\": \"instanceCount\"\n                    }\n                },\n                \"InstanceType\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceType\",\n                        \"smithy.api#documentation\": \"<p>The instance type for the modified Reserved Instances.</p>\",\n                        \"smithy.api#xmlName\": \"instanceType\"\n                    }\n                },\n                \"Platform\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Platform\",\n                        \"smithy.api#documentation\": \"<p>The network platform of the modified Reserved Instances.</p>\",\n                        \"smithy.api#xmlName\": \"platform\"\n                    }\n                },\n                \"Scope\": {\n                    \"target\": \"com.amazonaws.ec2#scope\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Scope\",\n                        \"smithy.api#documentation\": \"<p>Whether the Reserved Instance is applied to instances in a Region or instances in a\\n      specific Availability Zone.</p>\",\n                        \"smithy.api#xmlName\": \"scope\"\n                    }\n                },\n                \"AvailabilityZoneId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AvailabilityZoneId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Availability Zone.</p>\",\n                        \"smithy.api#xmlName\": \"availabilityZoneId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the configuration settings for the modified Reserved Instances.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ReservedInstancesConfigurationList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ReservedInstancesConfiguration\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ReservedInstancesId\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ReservedInstancesId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ReservedInstancesId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Reserved Instance.</p>\",\n                        \"smithy.api#xmlName\": \"reservedInstancesId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the ID of a Reserved Instance.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ReservedInstancesIdStringList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ReservationId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"ReservedInstancesId\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ReservedInstancesList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ReservedInstances\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ReservedInstancesListing\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ClientToken\",\n                        \"smithy.api#documentation\": \"<p>A unique, case-sensitive key supplied by the client to ensure that the request is\\n      idempotent. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Run_Instance_Idempotency.html\\\">Ensuring\\n      Idempotency</a>.</p>\",\n                        \"smithy.api#xmlName\": \"clientToken\"\n                    }\n                },\n                \"CreateDate\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CreateDate\",\n                        \"smithy.api#documentation\": \"<p>The time the listing was created.</p>\",\n                        \"smithy.api#xmlName\": \"createDate\"\n                    }\n                },\n                \"InstanceCounts\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceCountList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceCounts\",\n                        \"smithy.api#documentation\": \"<p>The number of instances in this state.</p>\",\n                        \"smithy.api#xmlName\": \"instanceCounts\"\n                    }\n                },\n                \"PriceSchedules\": {\n                    \"target\": \"com.amazonaws.ec2#PriceScheduleList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PriceSchedules\",\n                        \"smithy.api#documentation\": \"<p>The price of the Reserved Instance listing.</p>\",\n                        \"smithy.api#xmlName\": \"priceSchedules\"\n                    }\n                },\n                \"ReservedInstancesId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ReservedInstancesId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Reserved Instance.</p>\",\n                        \"smithy.api#xmlName\": \"reservedInstancesId\"\n                    }\n                },\n                \"ReservedInstancesListingId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ReservedInstancesListingId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Reserved Instance listing.</p>\",\n                        \"smithy.api#xmlName\": \"reservedInstancesListingId\"\n                    }\n                },\n                \"Status\": {\n                    \"target\": \"com.amazonaws.ec2#ListingStatus\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Status\",\n                        \"smithy.api#documentation\": \"<p>The status of the Reserved Instance listing.</p>\",\n                        \"smithy.api#xmlName\": \"status\"\n                    }\n                },\n                \"StatusMessage\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"StatusMessage\",\n                        \"smithy.api#documentation\": \"<p>The reason for the current status of the Reserved Instance listing. The response can be\\n      blank.</p>\",\n                        \"smithy.api#xmlName\": \"statusMessage\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>Any tags assigned to the resource.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                },\n                \"UpdateDate\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"UpdateDate\",\n                        \"smithy.api#documentation\": \"<p>The last modified timestamp of the listing.</p>\",\n                        \"smithy.api#xmlName\": \"updateDate\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a Reserved Instance listing.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ReservedInstancesListingId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#ReservedInstancesListingList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ReservedInstancesListing\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ReservedInstancesModification\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ClientToken\",\n                        \"smithy.api#documentation\": \"<p>A unique, case-sensitive key supplied by the client to ensure that the request is\\n      idempotent. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Run_Instance_Idempotency.html\\\">Ensuring\\n      Idempotency</a>.</p>\",\n                        \"smithy.api#xmlName\": \"clientToken\"\n                    }\n                },\n                \"CreateDate\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CreateDate\",\n                        \"smithy.api#documentation\": \"<p>The time when the modification request was created.</p>\",\n                        \"smithy.api#xmlName\": \"createDate\"\n                    }\n                },\n                \"EffectiveDate\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EffectiveDate\",\n                        \"smithy.api#documentation\": \"<p>The time for the modification to become effective.</p>\",\n                        \"smithy.api#xmlName\": \"effectiveDate\"\n                    }\n                },\n                \"ModificationResults\": {\n                    \"target\": \"com.amazonaws.ec2#ReservedInstancesModificationResultList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ModificationResultSet\",\n                        \"smithy.api#documentation\": \"<p>Contains target configurations along with their corresponding new Reserved Instance\\n      IDs.</p>\",\n                        \"smithy.api#xmlName\": \"modificationResultSet\"\n                    }\n                },\n                \"ReservedInstancesIds\": {\n                    \"target\": \"com.amazonaws.ec2#ReservedIntancesIds\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ReservedInstancesSet\",\n                        \"smithy.api#documentation\": \"<p>The IDs of one or more Reserved Instances.</p>\",\n                        \"smithy.api#xmlName\": \"reservedInstancesSet\"\n                    }\n                },\n                \"ReservedInstancesModificationId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ReservedInstancesModificationId\",\n                        \"smithy.api#documentation\": \"<p>A unique ID for the Reserved Instance modification.</p>\",\n                        \"smithy.api#xmlName\": \"reservedInstancesModificationId\"\n                    }\n                },\n                \"Status\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Status\",\n                        \"smithy.api#documentation\": \"<p>The status of the Reserved Instances modification request.</p>\",\n                        \"smithy.api#xmlName\": \"status\"\n                    }\n                },\n                \"StatusMessage\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"StatusMessage\",\n                        \"smithy.api#documentation\": \"<p>The reason for the status.</p>\",\n                        \"smithy.api#xmlName\": \"statusMessage\"\n                    }\n                },\n                \"UpdateDate\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"UpdateDate\",\n                        \"smithy.api#documentation\": \"<p>The time when the modification request was last updated.</p>\",\n                        \"smithy.api#xmlName\": \"updateDate\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a Reserved Instance modification.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ReservedInstancesModificationId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#ReservedInstancesModificationIdStringList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ReservedInstancesModificationId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"ReservedInstancesModificationId\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ReservedInstancesModificationList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ReservedInstancesModification\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ReservedInstancesModificationResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ReservedInstancesId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ReservedInstancesId\",\n                        \"smithy.api#documentation\": \"<p>The ID for the Reserved Instances that were created as part of the modification request.\\n      This field is only available when the modification is fulfilled.</p>\",\n                        \"smithy.api#xmlName\": \"reservedInstancesId\"\n                    }\n                },\n                \"TargetConfiguration\": {\n                    \"target\": \"com.amazonaws.ec2#ReservedInstancesConfiguration\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TargetConfiguration\",\n                        \"smithy.api#documentation\": \"<p>The target Reserved Instances configurations supplied as part of the modification\\n      request.</p>\",\n                        \"smithy.api#xmlName\": \"targetConfiguration\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the modification request/s.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ReservedInstancesModificationResultList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ReservedInstancesModificationResult\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ReservedInstancesOffering\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CurrencyCode\": {\n                    \"target\": \"com.amazonaws.ec2#CurrencyCodeValues\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CurrencyCode\",\n                        \"smithy.api#documentation\": \"<p>The currency of the Reserved Instance offering you are purchasing. It's specified using\\n      ISO 4217 standard currency codes. At this time, the only supported currency is\\n        <code>USD</code>.</p>\",\n                        \"smithy.api#xmlName\": \"currencyCode\"\n                    }\n                },\n                \"InstanceTenancy\": {\n                    \"target\": \"com.amazonaws.ec2#Tenancy\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceTenancy\",\n                        \"smithy.api#documentation\": \"<p>The tenancy of the instance.</p>\",\n                        \"smithy.api#xmlName\": \"instanceTenancy\"\n                    }\n                },\n                \"Marketplace\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Marketplace\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether the offering is available through the Reserved Instance Marketplace\\n      (resale) or Amazon Web Services. If it's a Reserved Instance Marketplace offering, this is\\n      <code>true</code>.</p>\",\n                        \"smithy.api#xmlName\": \"marketplace\"\n                    }\n                },\n                \"OfferingClass\": {\n                    \"target\": \"com.amazonaws.ec2#OfferingClassType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OfferingClass\",\n                        \"smithy.api#documentation\": \"<p>If <code>convertible</code> it can be exchanged for Reserved Instances of the same or\\n      higher monetary value, with different configurations. If <code>standard</code>, it is not\\n      possible to perform an exchange.</p>\",\n                        \"smithy.api#xmlName\": \"offeringClass\"\n                    }\n                },\n                \"OfferingType\": {\n                    \"target\": \"com.amazonaws.ec2#OfferingTypeValues\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OfferingType\",\n                        \"smithy.api#documentation\": \"<p>The Reserved Instance offering type.</p>\",\n                        \"smithy.api#xmlName\": \"offeringType\"\n                    }\n                },\n                \"PricingDetails\": {\n                    \"target\": \"com.amazonaws.ec2#PricingDetailsList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PricingDetailsSet\",\n                        \"smithy.api#documentation\": \"<p>The pricing details of the Reserved Instance offering.</p>\",\n                        \"smithy.api#xmlName\": \"pricingDetailsSet\"\n                    }\n                },\n                \"RecurringCharges\": {\n                    \"target\": \"com.amazonaws.ec2#RecurringChargesList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RecurringCharges\",\n                        \"smithy.api#documentation\": \"<p>The recurring charge tag assigned to the resource.</p>\",\n                        \"smithy.api#xmlName\": \"recurringCharges\"\n                    }\n                },\n                \"Scope\": {\n                    \"target\": \"com.amazonaws.ec2#scope\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Scope\",\n                        \"smithy.api#documentation\": \"<p>Whether the Reserved Instance is applied to instances in a Region or an Availability\\n      Zone.</p>\",\n                        \"smithy.api#xmlName\": \"scope\"\n                    }\n                },\n                \"AvailabilityZoneId\": {\n                    \"target\": \"com.amazonaws.ec2#AvailabilityZoneId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AvailabilityZoneId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Availability Zone.</p>\",\n                        \"smithy.api#xmlName\": \"availabilityZoneId\"\n                    }\n                },\n                \"ReservedInstancesOfferingId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ReservedInstancesOfferingId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Reserved Instance offering. This is the offering ID used in <a>GetReservedInstancesExchangeQuote</a> to confirm that an exchange can be\\n      made.</p>\",\n                        \"smithy.api#xmlName\": \"reservedInstancesOfferingId\"\n                    }\n                },\n                \"InstanceType\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceType\",\n                        \"smithy.api#documentation\": \"<p>The instance type on which the Reserved Instance can be used.</p>\",\n                        \"smithy.api#xmlName\": \"instanceType\"\n                    }\n                },\n                \"AvailabilityZone\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AvailabilityZone\",\n                        \"smithy.api#documentation\": \"<p>The Availability Zone in which the Reserved Instance can be used.</p>\",\n                        \"smithy.api#xmlName\": \"availabilityZone\"\n                    }\n                },\n                \"Duration\": {\n                    \"target\": \"com.amazonaws.ec2#Long\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Duration\",\n                        \"smithy.api#documentation\": \"<p>The duration of the Reserved Instance, in seconds.</p>\",\n                        \"smithy.api#xmlName\": \"duration\"\n                    }\n                },\n                \"UsagePrice\": {\n                    \"target\": \"com.amazonaws.ec2#Float\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"UsagePrice\",\n                        \"smithy.api#documentation\": \"<p>The usage price of the Reserved Instance, per hour.</p>\",\n                        \"smithy.api#xmlName\": \"usagePrice\"\n                    }\n                },\n                \"FixedPrice\": {\n                    \"target\": \"com.amazonaws.ec2#Float\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"FixedPrice\",\n                        \"smithy.api#documentation\": \"<p>The purchase price of the Reserved Instance.</p>\",\n                        \"smithy.api#xmlName\": \"fixedPrice\"\n                    }\n                },\n                \"ProductDescription\": {\n                    \"target\": \"com.amazonaws.ec2#RIProductDescription\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ProductDescription\",\n                        \"smithy.api#documentation\": \"<p>The Reserved Instance product platform description.</p>\",\n                        \"smithy.api#xmlName\": \"productDescription\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a Reserved Instance offering.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ReservedInstancesOfferingId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#ReservedInstancesOfferingIdStringList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ReservedInstancesOfferingId\"\n            }\n        },\n        \"com.amazonaws.ec2#ReservedInstancesOfferingList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ReservedInstancesOffering\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ReservedIntancesIds\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ReservedInstancesId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ResetAddressAttribute\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ResetAddressAttributeRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ResetAddressAttributeResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Resets the attribute of the specified IP address. For requirements, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/elastic-ip-addresses-eip.html#Using_Elastic_Addressing_Reverse_DNS\\\">Using reverse DNS for email applications</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ResetAddressAttributeRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AllocationId\": {\n                    \"target\": \"com.amazonaws.ec2#AllocationId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>[EC2-VPC] The allocation ID.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Attribute\": {\n                    \"target\": \"com.amazonaws.ec2#AddressAttributeName\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The attribute of the IP address.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ResetAddressAttributeResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Address\": {\n                    \"target\": \"com.amazonaws.ec2#AddressAttribute\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Address\",\n                        \"smithy.api#documentation\": \"<p>Information about the IP address.</p>\",\n                        \"smithy.api#xmlName\": \"address\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ResetEbsDefaultKmsKeyId\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ResetEbsDefaultKmsKeyIdRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ResetEbsDefaultKmsKeyIdResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Resets the default KMS key for EBS encryption for your account in this Region \\n      to the Amazon Web Services managed KMS key for EBS.</p>\\n         <p>After resetting the default KMS key to the Amazon Web Services managed KMS key, you can continue to encrypt by a \\n      customer managed KMS key by specifying it when you create the volume. For more information, see\\n      <a href=\\\"https://docs.aws.amazon.com/ebs/latest/userguide/ebs-encryption.html\\\">Amazon EBS encryption</a>\\n      in the <i>Amazon EBS User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ResetEbsDefaultKmsKeyIdRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ResetEbsDefaultKmsKeyIdResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"KmsKeyId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"KmsKeyId\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the default KMS key for EBS encryption by default.</p>\",\n                        \"smithy.api#xmlName\": \"kmsKeyId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ResetFpgaImageAttribute\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ResetFpgaImageAttributeRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#ResetFpgaImageAttributeResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Resets the specified attribute of the specified Amazon FPGA Image (AFI) to its default value.\\n\\t\\t    You can only reset the load permission attribute.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ResetFpgaImageAttributeName\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"loadPermission\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"loadPermission\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ResetFpgaImageAttributeRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"FpgaImageId\": {\n                    \"target\": \"com.amazonaws.ec2#FpgaImageId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the AFI.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Attribute\": {\n                    \"target\": \"com.amazonaws.ec2#ResetFpgaImageAttributeName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The attribute.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ResetFpgaImageAttributeResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Return\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Return\",\n                        \"smithy.api#documentation\": \"<p>Is <code>true</code> if the request succeeds, and an error otherwise.</p>\",\n                        \"smithy.api#xmlName\": \"return\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ResetImageAttribute\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ResetImageAttributeRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Resets an attribute of an AMI to its default value.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To reset the launchPermission attribute\",\n                        \"documentation\": \"This example resets the launchPermission attribute for the specified AMI. By default, AMIs are private.\",\n                        \"input\": {\n                            \"Attribute\": \"launchPermission\",\n                            \"ImageId\": \"ami-5731123e\"\n                        },\n                        \"output\": {}\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#ResetImageAttributeName\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"launchPermission\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"launchPermission\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ResetImageAttributeRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Attribute\": {\n                    \"target\": \"com.amazonaws.ec2#ResetImageAttributeName\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The attribute to reset (currently you can only reset the launch permission\\n      attribute).</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ImageId\": {\n                    \"target\": \"com.amazonaws.ec2#ImageId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the AMI.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n\\t\\t\\tand provides an error response. If you have the required permissions, the error response is \\n\\t\\t\\t<code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the parameters for ResetImageAttribute.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ResetInstanceAttribute\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ResetInstanceAttributeRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Resets an attribute of an instance to its default value. To reset the\\n                <code>kernel</code> or <code>ramdisk</code>, the instance must be in a stopped\\n            state. To reset the <code>sourceDestCheck</code>, the instance can be either running or\\n            stopped.</p>\\n         <p>The <code>sourceDestCheck</code> attribute controls whether source/destination\\n            checking is enabled. The default value is <code>true</code>, which means checking is\\n            enabled. This value must be <code>false</code> for a NAT instance to perform NAT. For\\n            more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/VPC_NAT_Instance.html\\\">NAT instances</a> in the\\n                <i>Amazon VPC User Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To reset the sourceDestCheck attribute\",\n                        \"documentation\": \"This example resets the sourceDestCheck attribute for the specified instance.\",\n                        \"input\": {\n                            \"Attribute\": \"sourceDestCheck\",\n                            \"InstanceId\": \"i-1234567890abcdef0\"\n                        },\n                        \"output\": {}\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#ResetInstanceAttributeRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the operation, without actually making the \\n  request, and provides an error response. If you have the required permissions, the error response is \\n  <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"InstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceId\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the instance.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"instanceId\"\n                    }\n                },\n                \"Attribute\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceAttributeName\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Attribute\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The attribute to reset.</p>\\n         <important>\\n            <p>You can only reset the following attributes: <code>kernel</code> |\\n                    <code>ramdisk</code> | <code>sourceDestCheck</code>.</p>\\n         </important>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"attribute\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ResetNetworkInterfaceAttribute\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ResetNetworkInterfaceAttributeRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Resets a network interface attribute. You can specify only one attribute at a\\n            time.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ResetNetworkInterfaceAttributeRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually\\n            making the request, and provides an error response. If you have the required\\n            permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is\\n                <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"NetworkInterfaceId\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInterfaceId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkInterfaceId\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the network interface.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"networkInterfaceId\"\n                    }\n                },\n                \"SourceDestCheck\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SourceDestCheck\",\n                        \"smithy.api#documentation\": \"<p>The source/destination checking attribute. Resets the value to\\n            <code>true</code>.</p>\",\n                        \"smithy.api#xmlName\": \"sourceDestCheck\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the parameters for ResetNetworkInterfaceAttribute.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ResetSnapshotAttribute\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#ResetSnapshotAttributeRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Resets permission settings for the specified snapshot.</p>\\n         <p>For more information about modifying snapshot permissions, see <a href=\\\"https://docs.aws.amazon.com/ebs/latest/userguide/ebs-modifying-snapshot-permissions.html\\\">Share a snapshot</a> in the\\n        <i>Amazon EBS User Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To reset a snapshot attribute\",\n                        \"documentation\": \"This example resets the create volume permissions for snapshot ``snap-1234567890abcdef0``. If the command succeeds, no output is returned.\",\n                        \"input\": {\n                            \"SnapshotId\": \"snap-1234567890abcdef0\",\n                            \"Attribute\": \"createVolumePermission\"\n                        },\n                        \"output\": {}\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#ResetSnapshotAttributeRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Attribute\": {\n                    \"target\": \"com.amazonaws.ec2#SnapshotAttributeName\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The attribute to reset. Currently, only the attribute for permission to create volumes can\\n      be reset.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"SnapshotId\": {\n                    \"target\": \"com.amazonaws.ec2#SnapshotId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the snapshot.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ResourceArn\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 1283\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ResourceConfigurationArn\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#ResourceIdList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#TaggableResourceId\"\n            }\n        },\n        \"com.amazonaws.ec2#ResourceList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#String\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ResourceStatement\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Resources\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResourceSet\",\n                        \"smithy.api#documentation\": \"<p>The resources.</p>\",\n                        \"smithy.api#xmlName\": \"resourceSet\"\n                    }\n                },\n                \"ResourceTypes\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResourceTypeSet\",\n                        \"smithy.api#documentation\": \"<p>The resource types.</p>\",\n                        \"smithy.api#xmlName\": \"resourceTypeSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a resource statement.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ResourceStatementRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Resources\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The resources.</p>\",\n                        \"smithy.api#xmlName\": \"Resource\"\n                    }\n                },\n                \"ResourceTypes\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The resource types.</p>\",\n                        \"smithy.api#xmlName\": \"ResourceType\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a resource statement.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ResourceType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"capacity_reservation\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"capacity-reservation\"\n                    }\n                },\n                \"client_vpn_endpoint\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"client-vpn-endpoint\"\n                    }\n                },\n                \"customer_gateway\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"customer-gateway\"\n                    }\n                },\n                \"carrier_gateway\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"carrier-gateway\"\n                    }\n                },\n                \"coip_pool\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"coip-pool\"\n                    }\n                },\n                \"declarative_policies_report\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"declarative-policies-report\"\n                    }\n                },\n                \"dedicated_host\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"dedicated-host\"\n                    }\n                },\n                \"dhcp_options\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"dhcp-options\"\n                    }\n                },\n                \"egress_only_internet_gateway\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"egress-only-internet-gateway\"\n                    }\n                },\n                \"elastic_ip\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"elastic-ip\"\n                    }\n                },\n                \"elastic_gpu\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"elastic-gpu\"\n                    }\n                },\n                \"export_image_task\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"export-image-task\"\n                    }\n                },\n                \"export_instance_task\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"export-instance-task\"\n                    }\n                },\n                \"fleet\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"fleet\"\n                    }\n                },\n                \"fpga_image\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"fpga-image\"\n                    }\n                },\n                \"host_reservation\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"host-reservation\"\n                    }\n                },\n                \"image\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"image\"\n                    }\n                },\n                \"image_usage_report\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"image-usage-report\"\n                    }\n                },\n                \"import_image_task\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"import-image-task\"\n                    }\n                },\n                \"import_snapshot_task\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"import-snapshot-task\"\n                    }\n                },\n                \"instance\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"instance\"\n                    }\n                },\n                \"instance_event_window\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"instance-event-window\"\n                    }\n                },\n                \"internet_gateway\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"internet-gateway\"\n                    }\n                },\n                \"ipam\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ipam\"\n                    }\n                },\n                \"ipam_pool\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ipam-pool\"\n                    }\n                },\n                \"ipam_scope\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ipam-scope\"\n                    }\n                },\n                \"ipv4pool_ec2\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ipv4pool-ec2\"\n                    }\n                },\n                \"ipv6pool_ec2\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ipv6pool-ec2\"\n                    }\n                },\n                \"key_pair\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"key-pair\"\n                    }\n                },\n                \"launch_template\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"launch-template\"\n                    }\n                },\n                \"local_gateway\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"local-gateway\"\n                    }\n                },\n                \"local_gateway_route_table\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"local-gateway-route-table\"\n                    }\n                },\n                \"local_gateway_virtual_interface\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"local-gateway-virtual-interface\"\n                    }\n                },\n                \"local_gateway_virtual_interface_group\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"local-gateway-virtual-interface-group\"\n                    }\n                },\n                \"local_gateway_route_table_vpc_association\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"local-gateway-route-table-vpc-association\"\n                    }\n                },\n                \"local_gateway_route_table_virtual_interface_group_association\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"local-gateway-route-table-virtual-interface-group-association\"\n                    }\n                },\n                \"natgateway\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"natgateway\"\n                    }\n                },\n                \"network_acl\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"network-acl\"\n                    }\n                },\n                \"network_interface\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"network-interface\"\n                    }\n                },\n                \"network_insights_analysis\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"network-insights-analysis\"\n                    }\n                },\n                \"network_insights_path\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"network-insights-path\"\n                    }\n                },\n                \"network_insights_access_scope\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"network-insights-access-scope\"\n                    }\n                },\n                \"network_insights_access_scope_analysis\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"network-insights-access-scope-analysis\"\n                    }\n                },\n                \"outpost_lag\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"outpost-lag\"\n                    }\n                },\n                \"placement_group\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"placement-group\"\n                    }\n                },\n                \"prefix_list\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"prefix-list\"\n                    }\n                },\n                \"replace_root_volume_task\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"replace-root-volume-task\"\n                    }\n                },\n                \"reserved_instances\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"reserved-instances\"\n                    }\n                },\n                \"route_table\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"route-table\"\n                    }\n                },\n                \"security_group\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"security-group\"\n                    }\n                },\n                \"security_group_rule\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"security-group-rule\"\n                    }\n                },\n                \"service_link_virtual_interface\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"service-link-virtual-interface\"\n                    }\n                },\n                \"snapshot\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"snapshot\"\n                    }\n                },\n                \"spot_fleet_request\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"spot-fleet-request\"\n                    }\n                },\n                \"spot_instances_request\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"spot-instances-request\"\n                    }\n                },\n                \"subnet\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"subnet\"\n                    }\n                },\n                \"subnet_cidr_reservation\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"subnet-cidr-reservation\"\n                    }\n                },\n                \"traffic_mirror_filter\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"traffic-mirror-filter\"\n                    }\n                },\n                \"traffic_mirror_session\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"traffic-mirror-session\"\n                    }\n                },\n                \"traffic_mirror_target\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"traffic-mirror-target\"\n                    }\n                },\n                \"transit_gateway\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"transit-gateway\"\n                    }\n                },\n                \"transit_gateway_attachment\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"transit-gateway-attachment\"\n                    }\n                },\n                \"transit_gateway_connect_peer\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"transit-gateway-connect-peer\"\n                    }\n                },\n                \"transit_gateway_multicast_domain\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"transit-gateway-multicast-domain\"\n                    }\n                },\n                \"transit_gateway_policy_table\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"transit-gateway-policy-table\"\n                    }\n                },\n                \"transit_gateway_route_table\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"transit-gateway-route-table\"\n                    }\n                },\n                \"transit_gateway_route_table_announcement\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"transit-gateway-route-table-announcement\"\n                    }\n                },\n                \"volume\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"volume\"\n                    }\n                },\n                \"vpc\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"vpc\"\n                    }\n                },\n                \"vpc_endpoint\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"vpc-endpoint\"\n                    }\n                },\n                \"vpc_endpoint_connection\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"vpc-endpoint-connection\"\n                    }\n                },\n                \"vpc_endpoint_service\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"vpc-endpoint-service\"\n                    }\n                },\n                \"vpc_endpoint_service_permission\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"vpc-endpoint-service-permission\"\n                    }\n                },\n                \"vpc_peering_connection\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"vpc-peering-connection\"\n                    }\n                },\n                \"vpn_connection\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"vpn-connection\"\n                    }\n                },\n                \"vpn_gateway\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"vpn-gateway\"\n                    }\n                },\n                \"vpc_flow_log\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"vpc-flow-log\"\n                    }\n                },\n                \"capacity_reservation_fleet\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"capacity-reservation-fleet\"\n                    }\n                },\n                \"traffic_mirror_filter_rule\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"traffic-mirror-filter-rule\"\n                    }\n                },\n                \"vpc_endpoint_connection_device_type\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"vpc-endpoint-connection-device-type\"\n                    }\n                },\n                \"verified_access_instance\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"verified-access-instance\"\n                    }\n                },\n                \"verified_access_group\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"verified-access-group\"\n                    }\n                },\n                \"verified_access_endpoint\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"verified-access-endpoint\"\n                    }\n                },\n                \"verified_access_policy\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"verified-access-policy\"\n                    }\n                },\n                \"verified_access_trust_provider\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"verified-access-trust-provider\"\n                    }\n                },\n                \"vpn_connection_device_type\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"vpn-connection-device-type\"\n                    }\n                },\n                \"vpc_block_public_access_exclusion\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"vpc-block-public-access-exclusion\"\n                    }\n                },\n                \"route_server\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"route-server\"\n                    }\n                },\n                \"route_server_endpoint\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"route-server-endpoint\"\n                    }\n                },\n                \"route_server_peer\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"route-server-peer\"\n                    }\n                },\n                \"ipam_resource_discovery\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ipam-resource-discovery\"\n                    }\n                },\n                \"ipam_resource_discovery_association\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ipam-resource-discovery-association\"\n                    }\n                },\n                \"instance_connect_endpoint\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"instance-connect-endpoint\"\n                    }\n                },\n                \"verified_access_endpoint_target\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"verified-access-endpoint-target\"\n                    }\n                },\n                \"ipam_external_resource_verification_token\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ipam-external-resource-verification-token\"\n                    }\n                },\n                \"capacity_block\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"capacity-block\"\n                    }\n                },\n                \"mac_modification_task\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"mac-modification-task\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ResourceTypeOption\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"OptionName\": {\n                    \"target\": \"com.amazonaws.ec2#ImageReferenceOptionName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the option.</p>\\n         <ul>\\n            <li>\\n               <p>For <code>ec2:Instance</code>:</p>\\n               <p>Specify <code>state-name</code> - The current state of the EC2 instance.</p>\\n            </li>\\n            <li>\\n               <p>For <code>ec2:LaunchTemplate</code>:</p>\\n               <p>Specify <code>version-depth</code> - The number of launch template versions to check,\\n          starting from the most recent version.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"OptionValues\": {\n                    \"target\": \"com.amazonaws.ec2#ResourceTypeOptionValuesList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A value for the specified option.</p>\\n         <ul>\\n            <li>\\n               <p>For <code>state-name</code>:</p>\\n               <ul>\\n                  <li>\\n                     <p>Valid values: <code>pending</code> | <code>running</code> | <code>shutting-down</code> |\\n              <code>terminated</code> | <code>stopping</code> | <code>stopped</code>\\n                     </p>\\n                  </li>\\n                  <li>\\n                     <p>Default: All states</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <p>For <code>version-depth</code>:</p>\\n               <ul>\\n                  <li>\\n                     <p>Valid values: Integers between <code>1</code> and <code>10000</code>\\n                     </p>\\n                  </li>\\n                  <li>\\n                     <p>Default: <code>10</code>\\n                     </p>\\n                  </li>\\n               </ul>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"OptionValue\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The options that affect the scope of the response.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ResourceTypeOptionList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ResourceTypeOption\"\n            }\n        },\n        \"com.amazonaws.ec2#ResourceTypeOptionValue\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#ResourceTypeOptionValuesList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ResourceTypeOptionValue\"\n            }\n        },\n        \"com.amazonaws.ec2#ResourceTypeRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ResourceType\": {\n                    \"target\": \"com.amazonaws.ec2#ImageReferenceResourceType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The resource type.</p>\"\n                    }\n                },\n                \"ResourceTypeOptions\": {\n                    \"target\": \"com.amazonaws.ec2#ResourceTypeOptionList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The options that affect the scope of the response. Valid only when\\n      <code>ResourceType</code> is <code>ec2:Instance</code> or\\n      <code>ec2:LaunchTemplate</code>.</p>\",\n                        \"smithy.api#xmlName\": \"ResourceTypeOption\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A resource type to check for image references. Associated options can also be specified if the\\n      resource type is an EC2 instance or launch template.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ResourceTypeRequestList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ResourceTypeRequest\"\n            }\n        },\n        \"com.amazonaws.ec2#ResponseError\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Code\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplateErrorCode\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Code\",\n                        \"smithy.api#documentation\": \"<p>The error code.</p>\",\n                        \"smithy.api#xmlName\": \"code\"\n                    }\n                },\n                \"Message\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Message\",\n                        \"smithy.api#documentation\": \"<p>The error message, if applicable.</p>\",\n                        \"smithy.api#xmlName\": \"message\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the error that's returned when you cannot delete a launch template\\n            version.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ResponseHostIdList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#String\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ResponseHostIdSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#String\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ResponseLaunchTemplateData\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"KernelId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"KernelId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the kernel, if applicable.</p>\",\n                        \"smithy.api#xmlName\": \"kernelId\"\n                    }\n                },\n                \"EbsOptimized\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EbsOptimized\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether the instance is optimized for Amazon EBS I/O. </p>\",\n                        \"smithy.api#xmlName\": \"ebsOptimized\"\n                    }\n                },\n                \"IamInstanceProfile\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplateIamInstanceProfileSpecification\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IamInstanceProfile\",\n                        \"smithy.api#documentation\": \"<p>The IAM instance profile.</p>\",\n                        \"smithy.api#xmlName\": \"iamInstanceProfile\"\n                    }\n                },\n                \"BlockDeviceMappings\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplateBlockDeviceMappingList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"BlockDeviceMappingSet\",\n                        \"smithy.api#documentation\": \"<p>The block device mappings.</p>\",\n                        \"smithy.api#xmlName\": \"blockDeviceMappingSet\"\n                    }\n                },\n                \"NetworkInterfaces\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplateInstanceNetworkInterfaceSpecificationList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkInterfaceSet\",\n                        \"smithy.api#documentation\": \"<p>The network interfaces.</p>\",\n                        \"smithy.api#xmlName\": \"networkInterfaceSet\"\n                    }\n                },\n                \"ImageId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ImageId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the AMI or a Systems Manager parameter. The Systems Manager parameter will\\n            resolve to the ID of the AMI at instance launch.</p>\\n         <p>The value depends on what you specified in the request. The possible values\\n            are:</p>\\n         <ul>\\n            <li>\\n               <p>If an AMI ID was specified in the request, then this is the AMI ID.</p>\\n            </li>\\n            <li>\\n               <p>If a Systems Manager parameter was specified in the request, and\\n                        <code>ResolveAlias</code> was configured as <code>true</code>, then this is\\n                    the AMI ID that the parameter is mapped to in the Parameter Store.</p>\\n            </li>\\n            <li>\\n               <p>If a Systems Manager parameter was specified in the request, and\\n                        <code>ResolveAlias</code> was configured as <code>false</code>, then this is\\n                    the parameter value.</p>\\n            </li>\\n         </ul>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/create-launch-template.html#use-an-ssm-parameter-instead-of-an-ami-id\\\">Use a Systems Manager parameter instead of an AMI ID</a> in the\\n                <i>Amazon EC2 User Guide</i>.</p>\",\n                        \"smithy.api#xmlName\": \"imageId\"\n                    }\n                },\n                \"InstanceType\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceType\",\n                        \"smithy.api#documentation\": \"<p>The instance type.</p>\",\n                        \"smithy.api#xmlName\": \"instanceType\"\n                    }\n                },\n                \"KeyName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"KeyName\",\n                        \"smithy.api#documentation\": \"<p>The name of the key pair.</p>\",\n                        \"smithy.api#xmlName\": \"keyName\"\n                    }\n                },\n                \"Monitoring\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplatesMonitoring\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Monitoring\",\n                        \"smithy.api#documentation\": \"<p>The monitoring for the instance.</p>\",\n                        \"smithy.api#xmlName\": \"monitoring\"\n                    }\n                },\n                \"Placement\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplatePlacement\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Placement\",\n                        \"smithy.api#documentation\": \"<p>The placement of the instance.</p>\",\n                        \"smithy.api#xmlName\": \"placement\"\n                    }\n                },\n                \"RamDiskId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RamDiskId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the RAM disk, if applicable.</p>\",\n                        \"smithy.api#xmlName\": \"ramDiskId\"\n                    }\n                },\n                \"DisableApiTermination\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DisableApiTermination\",\n                        \"smithy.api#documentation\": \"<p>If set to <code>true</code>, indicates that the instance cannot be terminated using\\n            the Amazon EC2 console, command line tool, or API.</p>\",\n                        \"smithy.api#xmlName\": \"disableApiTermination\"\n                    }\n                },\n                \"InstanceInitiatedShutdownBehavior\": {\n                    \"target\": \"com.amazonaws.ec2#ShutdownBehavior\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceInitiatedShutdownBehavior\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether an instance stops or terminates when you initiate shutdown from the\\n            instance (using the operating system command for system shutdown).</p>\",\n                        \"smithy.api#xmlName\": \"instanceInitiatedShutdownBehavior\"\n                    }\n                },\n                \"UserData\": {\n                    \"target\": \"com.amazonaws.ec2#SensitiveUserData\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"UserData\",\n                        \"smithy.api#documentation\": \"<p>The user data for the instance. </p>\",\n                        \"smithy.api#xmlName\": \"userData\"\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplateTagSpecificationList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSpecificationSet\",\n                        \"smithy.api#documentation\": \"<p>The tags that are applied to the resources that are created during instance\\n            launch.</p>\",\n                        \"smithy.api#xmlName\": \"tagSpecificationSet\"\n                    }\n                },\n                \"ElasticGpuSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#ElasticGpuSpecificationResponseList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ElasticGpuSpecificationSet\",\n                        \"smithy.api#documentation\": \"<p>Deprecated.</p>\\n         <note>\\n            <p>Amazon Elastic Graphics reached end of life on January 8, 2024.</p>\\n         </note>\",\n                        \"smithy.api#xmlName\": \"elasticGpuSpecificationSet\"\n                    }\n                },\n                \"ElasticInferenceAccelerators\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplateElasticInferenceAcceleratorResponseList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ElasticInferenceAcceleratorSet\",\n                        \"smithy.api#documentation\": \"<note>\\n            <p>Amazon Elastic Inference is no longer available.</p>\\n         </note>\\n         <p>An elastic inference accelerator to associate with the instance. Elastic inference\\n            accelerators are a resource you can attach to your Amazon EC2 instances to accelerate\\n            your Deep Learning (DL) inference workloads.</p>\\n         <p>You cannot specify accelerators from different generations in the same request.</p>\",\n                        \"smithy.api#xmlName\": \"elasticInferenceAcceleratorSet\"\n                    }\n                },\n                \"SecurityGroupIds\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SecurityGroupIdSet\",\n                        \"smithy.api#documentation\": \"<p>The security group IDs.</p>\",\n                        \"smithy.api#xmlName\": \"securityGroupIdSet\"\n                    }\n                },\n                \"SecurityGroups\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SecurityGroupSet\",\n                        \"smithy.api#documentation\": \"<p>The security group names.</p>\",\n                        \"smithy.api#xmlName\": \"securityGroupSet\"\n                    }\n                },\n                \"InstanceMarketOptions\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplateInstanceMarketOptions\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceMarketOptions\",\n                        \"smithy.api#documentation\": \"<p>The market (purchasing) option for the instances.</p>\",\n                        \"smithy.api#xmlName\": \"instanceMarketOptions\"\n                    }\n                },\n                \"CreditSpecification\": {\n                    \"target\": \"com.amazonaws.ec2#CreditSpecification\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CreditSpecification\",\n                        \"smithy.api#documentation\": \"<p>The credit option for CPU usage of the instance.</p>\",\n                        \"smithy.api#xmlName\": \"creditSpecification\"\n                    }\n                },\n                \"CpuOptions\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplateCpuOptions\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CpuOptions\",\n                        \"smithy.api#documentation\": \"<p>The CPU options for the instance. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-optimize-cpu.html\\\">CPU\\n                options for Amazon EC2 instances</a> in the\\n            <i>Amazon EC2 User Guide</i>.</p>\",\n                        \"smithy.api#xmlName\": \"cpuOptions\"\n                    }\n                },\n                \"CapacityReservationSpecification\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplateCapacityReservationSpecificationResponse\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CapacityReservationSpecification\",\n                        \"smithy.api#documentation\": \"<p>Information about the Capacity Reservation targeting option.</p>\",\n                        \"smithy.api#xmlName\": \"capacityReservationSpecification\"\n                    }\n                },\n                \"LicenseSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplateLicenseList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LicenseSet\",\n                        \"smithy.api#documentation\": \"<p>The license configurations.</p>\",\n                        \"smithy.api#xmlName\": \"licenseSet\"\n                    }\n                },\n                \"HibernationOptions\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplateHibernationOptions\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"HibernationOptions\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether an instance is configured for hibernation. For more information, see\\n                <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Hibernate.html\\\">Hibernate\\n                your Amazon EC2 instance</a> in the <i>Amazon EC2 User Guide</i>.</p>\",\n                        \"smithy.api#xmlName\": \"hibernationOptions\"\n                    }\n                },\n                \"MetadataOptions\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplateInstanceMetadataOptions\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MetadataOptions\",\n                        \"smithy.api#documentation\": \"<p>The metadata options for the instance. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/configuring-instance-metadata-options.html\\\">Configure\\n                the Instance Metadata Service options</a> in the\\n                <i>Amazon EC2 User Guide</i>.</p>\",\n                        \"smithy.api#xmlName\": \"metadataOptions\"\n                    }\n                },\n                \"EnclaveOptions\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplateEnclaveOptions\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EnclaveOptions\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether the instance is enabled for Amazon Web Services Nitro Enclaves.</p>\",\n                        \"smithy.api#xmlName\": \"enclaveOptions\"\n                    }\n                },\n                \"InstanceRequirements\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceRequirements\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceRequirements\",\n                        \"smithy.api#documentation\": \"<p>The attributes for the instance types. When you specify instance attributes, Amazon EC2 will\\n         identify instance types with these attributes.</p>\\n         <p>If you specify <code>InstanceRequirements</code>, you can't specify\\n         <code>InstanceTypes</code>.</p>\",\n                        \"smithy.api#xmlName\": \"instanceRequirements\"\n                    }\n                },\n                \"PrivateDnsNameOptions\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplatePrivateDnsNameOptions\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PrivateDnsNameOptions\",\n                        \"smithy.api#documentation\": \"<p>The options for the instance hostname.</p>\",\n                        \"smithy.api#xmlName\": \"privateDnsNameOptions\"\n                    }\n                },\n                \"MaintenanceOptions\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplateInstanceMaintenanceOptions\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MaintenanceOptions\",\n                        \"smithy.api#documentation\": \"<p>The maintenance options for your instance.</p>\",\n                        \"smithy.api#xmlName\": \"maintenanceOptions\"\n                    }\n                },\n                \"DisableApiStop\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DisableApiStop\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether the instance is enabled for stop protection. For more information,\\n            see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-stop-protection.html\\\">Enable stop protection for your EC2 instances</a> in the\\n                <i>Amazon EC2 User Guide</i>.</p>\",\n                        \"smithy.api#xmlName\": \"disableApiStop\"\n                    }\n                },\n                \"Operator\": {\n                    \"target\": \"com.amazonaws.ec2#OperatorResponse\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Operator\",\n                        \"smithy.api#documentation\": \"<p>The entity that manages the launch template.</p>\",\n                        \"smithy.api#xmlName\": \"operator\"\n                    }\n                },\n                \"NetworkPerformanceOptions\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplateNetworkPerformanceOptions\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkPerformanceOptions\",\n                        \"smithy.api#documentation\": \"<p>Contains the launch template settings for network performance options for your\\n            instance.</p>\",\n                        \"smithy.api#xmlName\": \"networkPerformanceOptions\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The information for a launch template. </p>\"\n            }\n        },\n        \"com.amazonaws.ec2#RestorableByStringList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#String\"\n            }\n        },\n        \"com.amazonaws.ec2#RestoreAddressToClassic\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#RestoreAddressToClassicRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#RestoreAddressToClassicResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>This action is deprecated.</p>\\n         </note>\\n         <p>Restores an Elastic IP address that was previously moved to the EC2-VPC platform back to the EC2-Classic platform. You cannot move an Elastic IP address that was originally allocated for use in EC2-VPC. The Elastic IP address must not be associated with an instance or network interface.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#RestoreAddressToClassicRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"PublicIp\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PublicIp\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The Elastic IP address.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"publicIp\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#RestoreAddressToClassicResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PublicIp\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PublicIp\",\n                        \"smithy.api#documentation\": \"<p>The Elastic IP address.</p>\",\n                        \"smithy.api#xmlName\": \"publicIp\"\n                    }\n                },\n                \"Status\": {\n                    \"target\": \"com.amazonaws.ec2#Status\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Status\",\n                        \"smithy.api#documentation\": \"<p>The move status for the IP address.</p>\",\n                        \"smithy.api#xmlName\": \"status\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#RestoreImageFromRecycleBin\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#RestoreImageFromRecycleBinRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#RestoreImageFromRecycleBinResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Restores an AMI from the Recycle Bin. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/recycle-bin.html\\\">Recover deleted Amazon EBS\\n        snapshots and EBS-back AMIs with Recycle Bin</a> in the\\n        <i>Amazon EC2 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#RestoreImageFromRecycleBinRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ImageId\": {\n                    \"target\": \"com.amazonaws.ec2#ImageId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the AMI to restore.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n\\t\\t\\tand provides an error response. If you have the required permissions, the error response is \\n\\t\\t\\t<code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#RestoreImageFromRecycleBinResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Return\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Return\",\n                        \"smithy.api#documentation\": \"<p>Returns <code>true</code> if the request succeeds; otherwise, it returns an error.</p>\",\n                        \"smithy.api#xmlName\": \"return\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#RestoreManagedPrefixListVersion\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#RestoreManagedPrefixListVersionRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#RestoreManagedPrefixListVersionResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Restores the entries from a previous version of a managed prefix list to a new version of the prefix list.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#RestoreManagedPrefixListVersionRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"PrefixListId\": {\n                    \"target\": \"com.amazonaws.ec2#PrefixListResourceId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the prefix list.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"PreviousVersion\": {\n                    \"target\": \"com.amazonaws.ec2#Long\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The version to restore.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"CurrentVersion\": {\n                    \"target\": \"com.amazonaws.ec2#Long\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The current version number for the prefix list.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#RestoreManagedPrefixListVersionResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PrefixList\": {\n                    \"target\": \"com.amazonaws.ec2#ManagedPrefixList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PrefixList\",\n                        \"smithy.api#documentation\": \"<p>Information about the prefix list.</p>\",\n                        \"smithy.api#xmlName\": \"prefixList\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#RestoreSnapshotFromRecycleBin\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#RestoreSnapshotFromRecycleBinRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#RestoreSnapshotFromRecycleBinResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Restores a snapshot from the Recycle Bin. For more information, see <a href=\\\"https://docs.aws.amazon.com/ebs/latest/userguide/recycle-bin-working-with-snaps.html#recycle-bin-restore-snaps\\\">Restore \\n      snapshots from the Recycle Bin</a> in the <i>Amazon EBS User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#RestoreSnapshotFromRecycleBinRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SnapshotId\": {\n                    \"target\": \"com.amazonaws.ec2#SnapshotId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the snapshot to restore.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#RestoreSnapshotFromRecycleBinResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SnapshotId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SnapshotId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the snapshot.</p>\",\n                        \"smithy.api#xmlName\": \"snapshotId\"\n                    }\n                },\n                \"OutpostArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OutpostArn\",\n                        \"smithy.api#documentation\": \"<p>The ARN of the Outpost on which the snapshot is stored. For more information, see <a href=\\\"https://docs.aws.amazon.com/ebs/latest/userguide/snapshots-outposts.html\\\">Amazon EBS local snapshots on Outposts</a> in the \\n      <i>Amazon EBS User Guide</i>.</p>\",\n                        \"smithy.api#xmlName\": \"outpostArn\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Description\",\n                        \"smithy.api#documentation\": \"<p>The description for the snapshot.</p>\",\n                        \"smithy.api#xmlName\": \"description\"\n                    }\n                },\n                \"Encrypted\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Encrypted\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether the snapshot is encrypted.</p>\",\n                        \"smithy.api#xmlName\": \"encrypted\"\n                    }\n                },\n                \"OwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OwnerId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Amazon Web Services account that owns the EBS snapshot.</p>\",\n                        \"smithy.api#xmlName\": \"ownerId\"\n                    }\n                },\n                \"Progress\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Progress\",\n                        \"smithy.api#documentation\": \"<p>The progress of the snapshot, as a percentage.</p>\",\n                        \"smithy.api#xmlName\": \"progress\"\n                    }\n                },\n                \"StartTime\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"StartTime\",\n                        \"smithy.api#documentation\": \"<p>The time stamp when the snapshot was initiated.</p>\",\n                        \"smithy.api#xmlName\": \"startTime\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#SnapshotState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Status\",\n                        \"smithy.api#documentation\": \"<p>The state of the snapshot.</p>\",\n                        \"smithy.api#xmlName\": \"status\"\n                    }\n                },\n                \"VolumeId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VolumeId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the volume that was used to create the snapshot.</p>\",\n                        \"smithy.api#xmlName\": \"volumeId\"\n                    }\n                },\n                \"VolumeSize\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VolumeSize\",\n                        \"smithy.api#documentation\": \"<p>The size of the volume, in GiB.</p>\",\n                        \"smithy.api#xmlName\": \"volumeSize\"\n                    }\n                },\n                \"SseType\": {\n                    \"target\": \"com.amazonaws.ec2#SSEType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SseType\",\n                        \"smithy.api#documentation\": \"<p>Reserved for future use.</p>\",\n                        \"smithy.api#xmlName\": \"sseType\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#RestoreSnapshotTier\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#RestoreSnapshotTierRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#RestoreSnapshotTierResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Restores an archived Amazon EBS snapshot for use temporarily or permanently, or modifies the restore \\n      period or restore type for a snapshot that was previously temporarily restored.</p>\\n         <p>For more information see <a href=\\\"https://docs.aws.amazon.com/ebs/latest/userguide/working-with-snapshot-archiving.html#restore-archived-snapshot\\\">\\n      Restore an archived snapshot</a> and <a href=\\\"https://docs.aws.amazon.com/ebs/latest/userguide/working-with-snapshot-archiving.html#modify-temp-restore-period\\\">\\n        modify the restore period or restore type for a temporarily restored snapshot</a> in the <i>Amazon EBS User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#RestoreSnapshotTierRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SnapshotId\": {\n                    \"target\": \"com.amazonaws.ec2#SnapshotId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the snapshot to restore.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TemporaryRestoreDays\": {\n                    \"target\": \"com.amazonaws.ec2#RestoreSnapshotTierRequestTemporaryRestoreDays\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the number of days for which to temporarily restore an archived snapshot. \\n      Required for temporary restores only. The snapshot will be automatically re-archived \\n      after this period.</p>\\n         <p>To temporarily restore an archived snapshot, specify the number of days and omit \\n      the <b>PermanentRestore</b> parameter or set it to \\n      <code>false</code>.</p>\"\n                    }\n                },\n                \"PermanentRestore\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether to permanently restore an archived snapshot. To permanently restore \\n      an archived snapshot, specify <code>true</code> and omit the \\n      <b>RestoreSnapshotTierRequest$TemporaryRestoreDays</b> parameter.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#RestoreSnapshotTierRequestTemporaryRestoreDays\": {\n            \"type\": \"integer\"\n        },\n        \"com.amazonaws.ec2#RestoreSnapshotTierResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SnapshotId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SnapshotId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the snapshot.</p>\",\n                        \"smithy.api#xmlName\": \"snapshotId\"\n                    }\n                },\n                \"RestoreStartTime\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RestoreStartTime\",\n                        \"smithy.api#documentation\": \"<p>The date and time when the snapshot restore process started.</p>\",\n                        \"smithy.api#xmlName\": \"restoreStartTime\"\n                    }\n                },\n                \"RestoreDuration\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RestoreDuration\",\n                        \"smithy.api#documentation\": \"<p>For temporary restores only. The number of days for which the archived snapshot \\n      is temporarily restored.</p>\",\n                        \"smithy.api#xmlName\": \"restoreDuration\"\n                    }\n                },\n                \"IsPermanentRestore\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IsPermanentRestore\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether the snapshot is permanently restored. <code>true</code> indicates a permanent \\n      restore. <code>false</code> indicates a temporary restore.</p>\",\n                        \"smithy.api#xmlName\": \"isPermanentRestore\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ResultRange\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 20,\n                    \"max\": 500\n                }\n            }\n        },\n        \"com.amazonaws.ec2#RetentionPeriodRequestDays\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 36500\n                }\n            }\n        },\n        \"com.amazonaws.ec2#RetentionPeriodResponseDays\": {\n            \"type\": \"integer\"\n        },\n        \"com.amazonaws.ec2#RevokeClientVpnIngress\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#RevokeClientVpnIngressRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#RevokeClientVpnIngressResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Removes an ingress authorization rule from a Client VPN endpoint. </p>\"\n            }\n        },\n        \"com.amazonaws.ec2#RevokeClientVpnIngressRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ClientVpnEndpointId\": {\n                    \"target\": \"com.amazonaws.ec2#ClientVpnEndpointId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the Client VPN endpoint with which the authorization rule is associated.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TargetNetworkCidr\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The IPv4 address range, in CIDR notation, of the network for which access is being removed.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"AccessGroupId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the Active Directory group for which to revoke access. </p>\"\n                    }\n                },\n                \"RevokeAllGroups\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether access should be revoked for all groups for a single <code>TargetNetworkCidr</code> that earlier authorized ingress for all groups using <code>AuthorizeAllGroups</code>.\\n\\t\\t\\tThis does not impact other authorization rules that allowed ingress to the same <code>TargetNetworkCidr</code> with a specific <code>AccessGroupId</code>.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#RevokeClientVpnIngressResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Status\": {\n                    \"target\": \"com.amazonaws.ec2#ClientVpnAuthorizationRuleStatus\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Status\",\n                        \"smithy.api#documentation\": \"<p>The current state of the authorization rule.</p>\",\n                        \"smithy.api#xmlName\": \"status\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#RevokeSecurityGroupEgress\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#RevokeSecurityGroupEgressRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#RevokeSecurityGroupEgressResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Removes the specified outbound (egress) rules from the specified security group.</p>\\n         <p>You can specify rules using either rule IDs or security group rule properties. If you use\\n         rule properties, the values that you specify (for example, ports) must match the existing rule's \\n         values exactly. Each rule has a protocol, from and to ports, and destination (CIDR range, \\n         security group, or prefix list). For the TCP and UDP protocols, you must also specify the \\n         destination port or range of ports. For the ICMP protocol, you must also specify the ICMP type \\n         and code. If the security group rule has a description, you do not need to specify the description \\n         to revoke the rule.</p>\\n         <p>For a default VPC, if the values you specify do not match the existing rule's values, no error is\\n         returned, and the output describes the security group rules that were not revoked.</p>\\n         <p>Amazon Web Services recommends that you describe the security group to verify that the rules were removed.</p>\\n         <p>Rule changes are propagated to instances within the security group as quickly as possible. However, \\n         a small delay might occur.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#RevokeSecurityGroupEgressRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SecurityGroupRuleIds\": {\n                    \"target\": \"com.amazonaws.ec2#SecurityGroupRuleIdList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the security group rules.</p>\",\n                        \"smithy.api#xmlName\": \"SecurityGroupRuleId\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"GroupId\": {\n                    \"target\": \"com.amazonaws.ec2#SecurityGroupId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"GroupId\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the security group.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"groupId\"\n                    }\n                },\n                \"SourceSecurityGroupName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SourceSecurityGroupName\",\n                        \"smithy.api#documentation\": \"<p>Not supported. Use a set of IP permissions to specify a\\n           destination security group.</p>\",\n                        \"smithy.api#xmlName\": \"sourceSecurityGroupName\"\n                    }\n                },\n                \"SourceSecurityGroupOwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SourceSecurityGroupOwnerId\",\n                        \"smithy.api#documentation\": \"<p>Not supported. Use a set of IP permissions to specify a destination security\\n            group.</p>\",\n                        \"smithy.api#xmlName\": \"sourceSecurityGroupOwnerId\"\n                    }\n                },\n                \"IpProtocol\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpProtocol\",\n                        \"smithy.api#documentation\": \"<p>Not supported. Use a set of IP permissions to specify the protocol name or\\n            number.</p>\",\n                        \"smithy.api#xmlName\": \"ipProtocol\"\n                    }\n                },\n                \"FromPort\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"FromPort\",\n                        \"smithy.api#documentation\": \"<p>Not supported. Use a set of IP permissions to specify the port.</p>\",\n                        \"smithy.api#xmlName\": \"fromPort\"\n                    }\n                },\n                \"ToPort\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ToPort\",\n                        \"smithy.api#documentation\": \"<p>Not supported. Use a set of IP permissions to specify the port.</p>\",\n                        \"smithy.api#xmlName\": \"toPort\"\n                    }\n                },\n                \"CidrIp\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CidrIp\",\n                        \"smithy.api#documentation\": \"<p>Not supported. Use a set of IP permissions to specify the CIDR.</p>\",\n                        \"smithy.api#xmlName\": \"cidrIp\"\n                    }\n                },\n                \"IpPermissions\": {\n                    \"target\": \"com.amazonaws.ec2#IpPermissionList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpPermissions\",\n                        \"smithy.api#documentation\": \"<p>The sets of IP permissions. You can't specify a destination security group and a CIDR IP address range in the same set of permissions.</p>\",\n                        \"smithy.api#xmlName\": \"ipPermissions\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#RevokeSecurityGroupEgressResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Return\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Return\",\n                        \"smithy.api#documentation\": \"<p>Returns <code>true</code> if the request succeeds; otherwise, returns an error.</p>\",\n                        \"smithy.api#xmlName\": \"return\"\n                    }\n                },\n                \"UnknownIpPermissions\": {\n                    \"target\": \"com.amazonaws.ec2#IpPermissionList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"UnknownIpPermissionSet\",\n                        \"smithy.api#documentation\": \"<p>The outbound rules that were unknown to the service. In some cases,\\n                <code>unknownIpPermissionSet</code> might be in a different format from the request\\n            parameter. </p>\",\n                        \"smithy.api#xmlName\": \"unknownIpPermissionSet\"\n                    }\n                },\n                \"RevokedSecurityGroupRules\": {\n                    \"target\": \"com.amazonaws.ec2#RevokedSecurityGroupRuleList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RevokedSecurityGroupRuleSet\",\n                        \"smithy.api#documentation\": \"<p>Details about the revoked security group rules.</p>\",\n                        \"smithy.api#xmlName\": \"revokedSecurityGroupRuleSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#RevokeSecurityGroupIngress\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#RevokeSecurityGroupIngressRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#RevokeSecurityGroupIngressResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Removes the specified inbound (ingress) rules from a security group.</p>\\n         <p>You can specify rules using either rule IDs or security group rule properties. If you use\\n           rule properties, the values that you specify (for example, ports) must match the existing rule's \\n           values exactly. Each rule has a protocol, from and to ports, and source (CIDR range, \\n           security group, or prefix list). For the TCP and UDP protocols, you must also specify the \\n           destination port or range of ports. For the ICMP protocol, you must also specify the ICMP type \\n           and code. If the security group rule has a description, you do not need to specify the description \\n           to revoke the rule.</p>\\n         <p>For a default VPC, if the values you specify do not match the existing rule's values,\\n            no error is returned, and the output describes the security group rules that were not\\n            revoked.</p>\\n         <p>For a non-default VPC, if the values you specify do not match the existing rule's\\n            values, an <code>InvalidPermission.NotFound</code> client error is returned, and no\\n            rules are revoked.</p>\\n         <p>Amazon Web Services recommends that you describe the security group to verify that the rules were removed.</p>\\n         <p>Rule changes are propagated to instances within the security group as quickly as possible. \\n         However, a small delay might occur.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#RevokeSecurityGroupIngressRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CidrIp\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The CIDR IP address range. You can't specify this parameter when specifying a source security group.</p>\"\n                    }\n                },\n                \"FromPort\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If the protocol is TCP or UDP, this is the start of the port range.\\n           If the protocol is ICMP, this is the ICMP type or -1 (all ICMP types).</p>\"\n                    }\n                },\n                \"GroupId\": {\n                    \"target\": \"com.amazonaws.ec2#SecurityGroupId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the security group.</p>\"\n                    }\n                },\n                \"GroupName\": {\n                    \"target\": \"com.amazonaws.ec2#SecurityGroupName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>[Default VPC] The name of the security group. You must specify either the\\n            security group ID or the security group name in the request. For security groups in a\\n            nondefault VPC, you must specify the security group ID.</p>\"\n                    }\n                },\n                \"IpPermissions\": {\n                    \"target\": \"com.amazonaws.ec2#IpPermissionList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The sets of IP permissions. You can't specify a source security group and a CIDR IP address range in the same set of permissions.</p>\"\n                    }\n                },\n                \"IpProtocol\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IP protocol name (<code>tcp</code>, <code>udp</code>, <code>icmp</code>) or number \\n        (see <a href=\\\"http://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml\\\">Protocol Numbers</a>). \\n        Use <code>-1</code> to specify all.</p>\"\n                    }\n                },\n                \"SourceSecurityGroupName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>[Default VPC] The name of the source security group. You can't specify this parameter \\n         in combination with the following parameters: the CIDR IP address range, the start of the port range, \\n         the IP protocol, and the end of the port range. The source security group must be in the same VPC. \\n         To revoke a specific rule for an IP protocol and port range, use a set of IP permissions instead.</p>\"\n                    }\n                },\n                \"SourceSecurityGroupOwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Not supported.</p>\"\n                    }\n                },\n                \"ToPort\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If the protocol is TCP or UDP, this is the end of the port range.\\n         If the protocol is ICMP, this is the ICMP code or -1 (all ICMP codes).</p>\"\n                    }\n                },\n                \"SecurityGroupRuleIds\": {\n                    \"target\": \"com.amazonaws.ec2#SecurityGroupRuleIdList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the security group rules.</p>\",\n                        \"smithy.api#xmlName\": \"SecurityGroupRuleId\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#RevokeSecurityGroupIngressResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Return\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Return\",\n                        \"smithy.api#documentation\": \"<p>Returns <code>true</code> if the request succeeds; otherwise, returns an error.</p>\",\n                        \"smithy.api#xmlName\": \"return\"\n                    }\n                },\n                \"UnknownIpPermissions\": {\n                    \"target\": \"com.amazonaws.ec2#IpPermissionList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"UnknownIpPermissionSet\",\n                        \"smithy.api#documentation\": \"<p>The inbound rules that were unknown to the service. In some cases,\\n                <code>unknownIpPermissionSet</code> might be in a different format from the request\\n            parameter. </p>\",\n                        \"smithy.api#xmlName\": \"unknownIpPermissionSet\"\n                    }\n                },\n                \"RevokedSecurityGroupRules\": {\n                    \"target\": \"com.amazonaws.ec2#RevokedSecurityGroupRuleList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RevokedSecurityGroupRuleSet\",\n                        \"smithy.api#documentation\": \"<p>Details about the revoked security group rules.</p>\",\n                        \"smithy.api#xmlName\": \"revokedSecurityGroupRuleSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#RevokedSecurityGroupRule\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SecurityGroupRuleId\": {\n                    \"target\": \"com.amazonaws.ec2#SecurityGroupRuleId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SecurityGroupRuleId\",\n                        \"smithy.api#documentation\": \"<p>A security group rule ID.</p>\",\n                        \"smithy.api#xmlName\": \"securityGroupRuleId\"\n                    }\n                },\n                \"GroupId\": {\n                    \"target\": \"com.amazonaws.ec2#SecurityGroupId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"GroupId\",\n                        \"smithy.api#documentation\": \"<p>A security group ID.</p>\",\n                        \"smithy.api#xmlName\": \"groupId\"\n                    }\n                },\n                \"IsEgress\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IsEgress\",\n                        \"smithy.api#documentation\": \"<p>Defines if a security group rule is an outbound rule.</p>\",\n                        \"smithy.api#xmlName\": \"isEgress\"\n                    }\n                },\n                \"IpProtocol\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpProtocol\",\n                        \"smithy.api#documentation\": \"<p>The security group rule's protocol.</p>\",\n                        \"smithy.api#xmlName\": \"ipProtocol\"\n                    }\n                },\n                \"FromPort\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"FromPort\",\n                        \"smithy.api#documentation\": \"<p>The 'from' port number of the security group rule.</p>\",\n                        \"smithy.api#xmlName\": \"fromPort\"\n                    }\n                },\n                \"ToPort\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ToPort\",\n                        \"smithy.api#documentation\": \"<p>The 'to' port number of the security group rule.</p>\",\n                        \"smithy.api#xmlName\": \"toPort\"\n                    }\n                },\n                \"CidrIpv4\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CidrIpv4\",\n                        \"smithy.api#documentation\": \"<p>The IPv4 CIDR of the traffic source.</p>\",\n                        \"smithy.api#xmlName\": \"cidrIpv4\"\n                    }\n                },\n                \"CidrIpv6\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CidrIpv6\",\n                        \"smithy.api#documentation\": \"<p>The IPv6 CIDR of the traffic source.</p>\",\n                        \"smithy.api#xmlName\": \"cidrIpv6\"\n                    }\n                },\n                \"PrefixListId\": {\n                    \"target\": \"com.amazonaws.ec2#PrefixListResourceId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PrefixListId\",\n                        \"smithy.api#documentation\": \"<p>The ID of a prefix list that's the traffic source.</p>\",\n                        \"smithy.api#xmlName\": \"prefixListId\"\n                    }\n                },\n                \"ReferencedGroupId\": {\n                    \"target\": \"com.amazonaws.ec2#SecurityGroupId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ReferencedGroupId\",\n                        \"smithy.api#documentation\": \"<p>The ID of a referenced security group.</p>\",\n                        \"smithy.api#xmlName\": \"referencedGroupId\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Description\",\n                        \"smithy.api#documentation\": \"<p>A description of the revoked security group rule.</p>\",\n                        \"smithy.api#xmlName\": \"description\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A security group rule removed with <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RevokeSecurityGroupEgress.html\\\">RevokeSecurityGroupEgress</a> or <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RevokeSecurityGroupIngress.html\\\">RevokeSecurityGroupIngress</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#RevokedSecurityGroupRuleList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#RevokedSecurityGroupRule\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#RoleId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#RootDeviceType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ebs\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ebs\"\n                    }\n                },\n                \"instance_store\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"instance-store\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#RootDeviceTypeList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#RootDeviceType\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#Route\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DestinationCidrBlock\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DestinationCidrBlock\",\n                        \"smithy.api#documentation\": \"<p>The IPv4 CIDR block used for the destination match.</p>\",\n                        \"smithy.api#xmlName\": \"destinationCidrBlock\"\n                    }\n                },\n                \"DestinationIpv6CidrBlock\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DestinationIpv6CidrBlock\",\n                        \"smithy.api#documentation\": \"<p>The IPv6 CIDR block used for the destination match.</p>\",\n                        \"smithy.api#xmlName\": \"destinationIpv6CidrBlock\"\n                    }\n                },\n                \"DestinationPrefixListId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DestinationPrefixListId\",\n                        \"smithy.api#documentation\": \"<p>The prefix of the Amazon Web Services service.</p>\",\n                        \"smithy.api#xmlName\": \"destinationPrefixListId\"\n                    }\n                },\n                \"EgressOnlyInternetGatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EgressOnlyInternetGatewayId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the egress-only internet gateway.</p>\",\n                        \"smithy.api#xmlName\": \"egressOnlyInternetGatewayId\"\n                    }\n                },\n                \"GatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"GatewayId\",\n                        \"smithy.api#documentation\": \"<p>The ID of a gateway attached to your VPC.</p>\",\n                        \"smithy.api#xmlName\": \"gatewayId\"\n                    }\n                },\n                \"InstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of a NAT instance in your VPC.</p>\",\n                        \"smithy.api#xmlName\": \"instanceId\"\n                    }\n                },\n                \"InstanceOwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceOwnerId\",\n                        \"smithy.api#documentation\": \"<p>The ID of Amazon Web Services account that owns the instance.</p>\",\n                        \"smithy.api#xmlName\": \"instanceOwnerId\"\n                    }\n                },\n                \"NatGatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NatGatewayId\",\n                        \"smithy.api#documentation\": \"<p>The ID of a NAT gateway.</p>\",\n                        \"smithy.api#xmlName\": \"natGatewayId\"\n                    }\n                },\n                \"TransitGatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayId\",\n                        \"smithy.api#documentation\": \"<p>The ID of a transit gateway.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayId\"\n                    }\n                },\n                \"LocalGatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LocalGatewayId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the local gateway.</p>\",\n                        \"smithy.api#xmlName\": \"localGatewayId\"\n                    }\n                },\n                \"CarrierGatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#CarrierGatewayId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CarrierGatewayId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the carrier gateway.</p>\",\n                        \"smithy.api#xmlName\": \"carrierGatewayId\"\n                    }\n                },\n                \"NetworkInterfaceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkInterfaceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the network interface.</p>\",\n                        \"smithy.api#xmlName\": \"networkInterfaceId\"\n                    }\n                },\n                \"Origin\": {\n                    \"target\": \"com.amazonaws.ec2#RouteOrigin\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Origin\",\n                        \"smithy.api#documentation\": \"<p>Describes how the route was created.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>CreateRouteTable</code> - The route was automatically created when the route table was created.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>CreateRoute</code> - The route was manually added to the route table.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>EnableVgwRoutePropagation</code> - The route was propagated by route propagation.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>Advertisement</code> - The route was created dynamically by Amazon VPC Route Server.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"origin\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#RouteState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The state of the route. The <code>blackhole</code> state indicates that the\\n\\t\\t\\t\\troute's target isn't available (for example, the specified gateway isn't attached to the\\n\\t\\t\\t\\tVPC, or the specified NAT instance has been terminated).</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                },\n                \"VpcPeeringConnectionId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcPeeringConnectionId\",\n                        \"smithy.api#documentation\": \"<p>The ID of a VPC peering connection.</p>\",\n                        \"smithy.api#xmlName\": \"vpcPeeringConnectionId\"\n                    }\n                },\n                \"CoreNetworkArn\": {\n                    \"target\": \"com.amazonaws.ec2#CoreNetworkArn\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CoreNetworkArn\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the core network.</p>\",\n                        \"smithy.api#xmlName\": \"coreNetworkArn\"\n                    }\n                },\n                \"OdbNetworkArn\": {\n                    \"target\": \"com.amazonaws.ec2#OdbNetworkArn\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OdbNetworkArn\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the ODB network.</p>\",\n                        \"smithy.api#xmlName\": \"odbNetworkArn\"\n                    }\n                },\n                \"IpAddress\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpAddress\",\n                        \"smithy.api#documentation\": \"<p>The next hop IP address for routes propagated by VPC Route \\n            Server into VPC route tables.</p>\",\n                        \"smithy.api#xmlName\": \"ipAddress\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a route in a route table.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#RouteGatewayId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#RouteList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#Route\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#RouteOrigin\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"CreateRouteTable\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"CreateRouteTable\"\n                    }\n                },\n                \"CreateRoute\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"CreateRoute\"\n                    }\n                },\n                \"EnableVgwRoutePropagation\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"EnableVgwRoutePropagation\"\n                    }\n                },\n                \"Advertisement\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Advertisement\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#RouteServer\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RouteServerId\": {\n                    \"target\": \"com.amazonaws.ec2#RouteServerId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RouteServerId\",\n                        \"smithy.api#documentation\": \"<p>The unique identifier of the route server.</p>\",\n                        \"smithy.api#xmlName\": \"routeServerId\"\n                    }\n                },\n                \"AmazonSideAsn\": {\n                    \"target\": \"com.amazonaws.ec2#Long\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AmazonSideAsn\",\n                        \"smithy.api#documentation\": \"<p>The Border Gateway Protocol (BGP) Autonomous System Number (ASN) for the appliance. Valid values are from 1 to 4294967295. We recommend using a private ASN in the 64512–65534 (16-bit ASN) or 4200000000–4294967294 (32-bit ASN) range.</p>\",\n                        \"smithy.api#xmlName\": \"amazonSideAsn\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#RouteServerState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The current state of the route server.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>Any tags assigned to the route server.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                },\n                \"PersistRoutesState\": {\n                    \"target\": \"com.amazonaws.ec2#RouteServerPersistRoutesState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PersistRoutesState\",\n                        \"smithy.api#documentation\": \"<p>The current state of route persistence for the route server.</p>\",\n                        \"smithy.api#xmlName\": \"persistRoutesState\"\n                    }\n                },\n                \"PersistRoutesDuration\": {\n                    \"target\": \"com.amazonaws.ec2#BoxedLong\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PersistRoutesDuration\",\n                        \"smithy.api#documentation\": \"<p>The number of minutes a route server will wait after BGP is re-established to unpersist the routes in the FIB and RIB. Value must be in the range of 1-5. The default value is 1. Only valid if <code>persistRoutesState</code> is 'enabled'.</p>\\n         <p>If you set the duration to 1 minute, then when your network appliance re-establishes BGP with route server, it has 1 minute to relearn it's adjacent network and advertise those routes to route server before route server resumes normal functionality. In most cases, 1 minute is probably sufficient. If, however, you have concerns that your BGP network may not be capable of fully re-establishing and re-learning everything in 1 minute, you can increase the duration up to 5 minutes.</p>\",\n                        \"smithy.api#xmlName\": \"persistRoutesDuration\"\n                    }\n                },\n                \"SnsNotificationsEnabled\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SnsNotificationsEnabled\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether SNS notifications are enabled for the route server. Enabling SNS notifications persists BGP status changes to an SNS topic provisioned by Amazon Web Services.</p>\",\n                        \"smithy.api#xmlName\": \"snsNotificationsEnabled\"\n                    }\n                },\n                \"SnsTopicArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SnsTopicArn\",\n                        \"smithy.api#documentation\": \"<p>The ARN of the SNS topic where notifications are published.</p>\",\n                        \"smithy.api#xmlName\": \"snsTopicArn\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a route server and its configuration.</p>\\n         <p>Amazon VPC Route Server simplifies routing for traffic between workloads that are deployed within a VPC and its internet gateways. With this feature, \\nVPC Route Server dynamically updates VPC and internet gateway route tables with your preferred IPv4 or IPv6 routes to achieve routing fault tolerance for those workloads. This enables you to automatically reroute traffic within a VPC, which increases the manageability of VPC routing and interoperability with third-party workloads.</p>\\n         <p>Route server supports the follow route table types:</p>\\n         <ul>\\n            <li>\\n               <p>VPC route tables not associated with subnets</p>\\n            </li>\\n            <li>\\n               <p>Subnet route tables</p>\\n            </li>\\n            <li>\\n               <p>Internet gateway route tables</p>\\n            </li>\\n         </ul>\\n         <p>Route server does not support route tables associated with virtual private gateways. To propagate routes into a transit gateway route table, use <a href=\\\"https://docs.aws.amazon.com/vpc/latest/tgw/tgw-connect.html\\\">Transit Gateway Connect</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#RouteServerAssociation\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RouteServerId\": {\n                    \"target\": \"com.amazonaws.ec2#RouteServerId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RouteServerId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the associated route server.</p>\",\n                        \"smithy.api#xmlName\": \"routeServerId\"\n                    }\n                },\n                \"VpcId\": {\n                    \"target\": \"com.amazonaws.ec2#VpcId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the associated VPC.</p>\",\n                        \"smithy.api#xmlName\": \"vpcId\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#RouteServerAssociationState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The current state of the association.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the association between a route server and a VPC.</p>\\n         <p>A route server association is the connection established between a route server and a VPC.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#RouteServerAssociationState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ASSOCIATING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"associating\"\n                    }\n                },\n                \"ASSOCIATED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"associated\"\n                    }\n                },\n                \"DISASSOCIATING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"disassociating\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#RouteServerAssociationsList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#RouteServerAssociation\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#RouteServerBfdState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"UP\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"up\"\n                    }\n                },\n                \"DOWN\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"down\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#RouteServerBfdStatus\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Status\": {\n                    \"target\": \"com.amazonaws.ec2#RouteServerBfdState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Status\",\n                        \"smithy.api#documentation\": \"<p>The operational status of the BFD session.</p>\",\n                        \"smithy.api#xmlName\": \"status\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The current status of Bidirectional Forwarding Detection (BFD) for a BGP session.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#RouteServerBgpOptions\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PeerAsn\": {\n                    \"target\": \"com.amazonaws.ec2#Long\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PeerAsn\",\n                        \"smithy.api#documentation\": \"<p>The Border Gateway Protocol (BGP) Autonomous System Number (ASN) for the appliance. Valid values are from 1 to 4294967295. We recommend using a private ASN in the 64512–65534 (16-bit ASN) or 4200000000–4294967294 (32-bit ASN) range.</p>\",\n                        \"smithy.api#xmlName\": \"peerAsn\"\n                    }\n                },\n                \"PeerLivenessDetection\": {\n                    \"target\": \"com.amazonaws.ec2#RouteServerPeerLivenessMode\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PeerLivenessDetection\",\n                        \"smithy.api#documentation\": \"<p>The liveness detection protocol used for the BGP peer.</p>\\n         <p>The requested liveness detection protocol for the BGP peer.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>bgp-keepalive</code>: The standard BGP keep alive mechanism (<a href=\\\"https://www.rfc-editor.org/rfc/rfc4271#page-21\\\">RFC4271</a>) that is stable but may take longer to fail-over in cases of network impact or router failure.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>bfd</code>: An additional Bidirectional Forwarding Detection (BFD) protocol (<a href=\\\"https://www.rfc-editor.org/rfc/rfc5880\\\">RFC5880</a>) that enables fast failover by using more sensitive liveness detection.</p>\\n            </li>\\n         </ul>\\n         <p>Defaults to <code>bgp-keepalive</code>.</p>\",\n                        \"smithy.api#xmlName\": \"peerLivenessDetection\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The BGP configuration options for a route server peer.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#RouteServerBgpOptionsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PeerAsn\": {\n                    \"target\": \"com.amazonaws.ec2#Long\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The Border Gateway Protocol (BGP) Autonomous System Number (ASN) for the appliance. Valid values are from 1 to 4294967295. We recommend using a private ASN in the 64512–65534 (16-bit ASN) or 4200000000–4294967294 (32-bit ASN) range.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"PeerLivenessDetection\": {\n                    \"target\": \"com.amazonaws.ec2#RouteServerPeerLivenessMode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The requested liveness detection protocol for the BGP peer.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>bgp-keepalive</code>: The standard BGP keep alive mechanism (<a href=\\\"https://www.rfc-editor.org/rfc/rfc4271#page-21\\\">RFC4271</a>) that is stable but may take longer to fail-over in cases of network impact or router failure.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>bfd</code>: An additional Bidirectional Forwarding Detection (BFD) protocol (<a href=\\\"https://www.rfc-editor.org/rfc/rfc5880\\\">RFC5880</a>) that enables fast failover by using more sensitive liveness detection.</p>\\n            </li>\\n         </ul>\\n         <p>Defaults to <code>bgp-keepalive</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The BGP configuration options requested for a route server peer.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#RouteServerBgpState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"UP\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"up\"\n                    }\n                },\n                \"DOWN\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"down\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#RouteServerBgpStatus\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Status\": {\n                    \"target\": \"com.amazonaws.ec2#RouteServerBgpState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Status\",\n                        \"smithy.api#documentation\": \"<p>The operational status of the BGP session. The status enables you to monitor session liveness if you lack monitoring on your router/appliance.</p>\",\n                        \"smithy.api#xmlName\": \"status\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The current status of a BGP session.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#RouteServerEndpoint\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RouteServerId\": {\n                    \"target\": \"com.amazonaws.ec2#RouteServerId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RouteServerId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the route server associated with this endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"routeServerId\"\n                    }\n                },\n                \"RouteServerEndpointId\": {\n                    \"target\": \"com.amazonaws.ec2#RouteServerEndpointId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RouteServerEndpointId\",\n                        \"smithy.api#documentation\": \"<p>The unique identifier of the route server endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"routeServerEndpointId\"\n                    }\n                },\n                \"VpcId\": {\n                    \"target\": \"com.amazonaws.ec2#VpcId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the VPC containing the endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"vpcId\"\n                    }\n                },\n                \"SubnetId\": {\n                    \"target\": \"com.amazonaws.ec2#SubnetId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SubnetId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the subnet to place the route server endpoint into.</p>\",\n                        \"smithy.api#xmlName\": \"subnetId\"\n                    }\n                },\n                \"EniId\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInterfaceId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EniId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Elastic network interface for the endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"eniId\"\n                    }\n                },\n                \"EniAddress\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EniAddress\",\n                        \"smithy.api#documentation\": \"<p>The IP address of the Elastic network interface for the endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"eniAddress\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#RouteServerEndpointState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The current state of the route server endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                },\n                \"FailureReason\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"FailureReason\",\n                        \"smithy.api#documentation\": \"<p>The reason for any failure in endpoint creation or operation.</p>\",\n                        \"smithy.api#xmlName\": \"failureReason\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>Any tags assigned to the route server endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a route server endpoint and its properties.</p>\\n         <p>A route server endpoint is an Amazon Web Services-managed component inside a subnet that facilitates <a href=\\\"https://en.wikipedia.org/wiki/Border_Gateway_Protocol\\\">BGP (Border Gateway Protocol)</a> connections between your route server and your BGP peers.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#RouteServerEndpointId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#RouteServerEndpointIdsList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#RouteServerEndpointId\"\n            }\n        },\n        \"com.amazonaws.ec2#RouteServerEndpointState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"PENDING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"pending\"\n                    }\n                },\n                \"AVAILABLE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"available\"\n                    }\n                },\n                \"DELETING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"deleting\"\n                    }\n                },\n                \"DELETED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"deleted\"\n                    }\n                },\n                \"FAILING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"failing\"\n                    }\n                },\n                \"FAILED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"failed\"\n                    }\n                },\n                \"DELETE_FAILED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"delete-failed\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#RouteServerEndpointsList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#RouteServerEndpoint\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#RouteServerId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#RouteServerIdsList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#RouteServerId\"\n            }\n        },\n        \"com.amazonaws.ec2#RouteServerMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 5,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.ec2#RouteServerPeer\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RouteServerPeerId\": {\n                    \"target\": \"com.amazonaws.ec2#RouteServerPeerId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RouteServerPeerId\",\n                        \"smithy.api#documentation\": \"<p>The unique identifier of the route server peer.</p>\",\n                        \"smithy.api#xmlName\": \"routeServerPeerId\"\n                    }\n                },\n                \"RouteServerEndpointId\": {\n                    \"target\": \"com.amazonaws.ec2#RouteServerEndpointId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RouteServerEndpointId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the route server endpoint associated with this peer.</p>\",\n                        \"smithy.api#xmlName\": \"routeServerEndpointId\"\n                    }\n                },\n                \"RouteServerId\": {\n                    \"target\": \"com.amazonaws.ec2#RouteServerId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RouteServerId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the route server associated with this peer.</p>\",\n                        \"smithy.api#xmlName\": \"routeServerId\"\n                    }\n                },\n                \"VpcId\": {\n                    \"target\": \"com.amazonaws.ec2#VpcId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the VPC containing the route server peer.</p>\",\n                        \"smithy.api#xmlName\": \"vpcId\"\n                    }\n                },\n                \"SubnetId\": {\n                    \"target\": \"com.amazonaws.ec2#SubnetId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SubnetId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the subnet containing the route server peer.</p>\",\n                        \"smithy.api#xmlName\": \"subnetId\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#RouteServerPeerState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The current state of the route server peer.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                },\n                \"FailureReason\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"FailureReason\",\n                        \"smithy.api#documentation\": \"<p>The reason for any failure in peer creation or operation.</p>\",\n                        \"smithy.api#xmlName\": \"failureReason\"\n                    }\n                },\n                \"EndpointEniId\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInterfaceId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EndpointEniId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Elastic network interface for the route server endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"endpointEniId\"\n                    }\n                },\n                \"EndpointEniAddress\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EndpointEniAddress\",\n                        \"smithy.api#documentation\": \"<p>The IP address of the Elastic network interface for the route server endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"endpointEniAddress\"\n                    }\n                },\n                \"PeerAddress\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PeerAddress\",\n                        \"smithy.api#documentation\": \"<p>The IPv4 address of the peer device.</p>\",\n                        \"smithy.api#xmlName\": \"peerAddress\"\n                    }\n                },\n                \"BgpOptions\": {\n                    \"target\": \"com.amazonaws.ec2#RouteServerBgpOptions\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"BgpOptions\",\n                        \"smithy.api#documentation\": \"<p>The BGP configuration options for this peer, including ASN (Autonomous System Number) and BFD (Bidrectional Forwarding Detection) settings.</p>\",\n                        \"smithy.api#xmlName\": \"bgpOptions\"\n                    }\n                },\n                \"BgpStatus\": {\n                    \"target\": \"com.amazonaws.ec2#RouteServerBgpStatus\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"BgpStatus\",\n                        \"smithy.api#documentation\": \"<p>The current status of the BGP session with this peer.</p>\",\n                        \"smithy.api#xmlName\": \"bgpStatus\"\n                    }\n                },\n                \"BfdStatus\": {\n                    \"target\": \"com.amazonaws.ec2#RouteServerBfdStatus\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"BfdStatus\",\n                        \"smithy.api#documentation\": \"<p>The current status of the BFD session with this peer.</p>\",\n                        \"smithy.api#xmlName\": \"bfdStatus\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>Any tags assigned to the route server peer.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a BGP peer configuration for a route server endpoint.</p>\\n         <p>A route server peer is a session between a route server endpoint and the device deployed in Amazon Web Services (such as a firewall appliance or other network security function running on an EC2 instance). The device must meet these requirements:</p>\\n         <ul>\\n            <li>\\n               <p>Have an elastic network interface in the VPC</p>\\n            </li>\\n            <li>\\n               <p>Support BGP (Border Gateway Protocol)</p>\\n            </li>\\n            <li>\\n               <p>Can initiate BGP sessions</p>\\n            </li>\\n         </ul>\"\n            }\n        },\n        \"com.amazonaws.ec2#RouteServerPeerId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#RouteServerPeerIdsList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#RouteServerPeerId\"\n            }\n        },\n        \"com.amazonaws.ec2#RouteServerPeerLivenessMode\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"BFD\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"bfd\"\n                    }\n                },\n                \"BGP_KEEPALIVE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"bgp-keepalive\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#RouteServerPeerState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"PENDING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"pending\"\n                    }\n                },\n                \"AVAILABLE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"available\"\n                    }\n                },\n                \"DELETING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"deleting\"\n                    }\n                },\n                \"DELETED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"deleted\"\n                    }\n                },\n                \"FAILING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"failing\"\n                    }\n                },\n                \"FAILED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"failed\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#RouteServerPeersList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#RouteServerPeer\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#RouteServerPersistRoutesAction\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ENABLE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"enable\"\n                    }\n                },\n                \"DISABLE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"disable\"\n                    }\n                },\n                \"RESET\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"reset\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#RouteServerPersistRoutesState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ENABLING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"enabling\"\n                    }\n                },\n                \"ENABLED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"enabled\"\n                    }\n                },\n                \"RESETTING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"resetting\"\n                    }\n                },\n                \"DISABLING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"disabling\"\n                    }\n                },\n                \"DISABLED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"disabled\"\n                    }\n                },\n                \"MODIFYING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"modifying\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#RouteServerPropagation\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RouteServerId\": {\n                    \"target\": \"com.amazonaws.ec2#RouteServerId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RouteServerId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the route server configured for route propagation.</p>\",\n                        \"smithy.api#xmlName\": \"routeServerId\"\n                    }\n                },\n                \"RouteTableId\": {\n                    \"target\": \"com.amazonaws.ec2#RouteTableId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RouteTableId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the route table configured for route server propagation.</p>\",\n                        \"smithy.api#xmlName\": \"routeTableId\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#RouteServerPropagationState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The current state of route propagation.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the route propagation configuration between a route server and a route table.</p>\\n         <p>When enabled, route server propagation installs the routes in the FIB on the route table you've specified. Route server supports IPv4 and IPv6 route propagation.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#RouteServerPropagationState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"PENDING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"pending\"\n                    }\n                },\n                \"AVAILABLE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"available\"\n                    }\n                },\n                \"DELETING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"deleting\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#RouteServerPropagationsList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#RouteServerPropagation\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#RouteServerRoute\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RouteServerEndpointId\": {\n                    \"target\": \"com.amazonaws.ec2#RouteServerEndpointId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RouteServerEndpointId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the route server endpoint that received this route.</p>\",\n                        \"smithy.api#xmlName\": \"routeServerEndpointId\"\n                    }\n                },\n                \"RouteServerPeerId\": {\n                    \"target\": \"com.amazonaws.ec2#RouteServerPeerId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RouteServerPeerId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the route server peer that advertised this route.</p>\",\n                        \"smithy.api#xmlName\": \"routeServerPeerId\"\n                    }\n                },\n                \"RouteInstallationDetails\": {\n                    \"target\": \"com.amazonaws.ec2#RouteServerRouteInstallationDetails\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RouteInstallationDetailSet\",\n                        \"smithy.api#documentation\": \"<p>Details about the installation status of this route in route tables.</p>\",\n                        \"smithy.api#xmlName\": \"routeInstallationDetailSet\"\n                    }\n                },\n                \"RouteStatus\": {\n                    \"target\": \"com.amazonaws.ec2#RouteServerRouteStatus\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RouteStatus\",\n                        \"smithy.api#documentation\": \"<p>The current status of the route in the routing database. Values are <code>in-rib</code> or <code>in-fib</code> depending on if the routes are in the RIB or the FIB database.</p>\\n         <p>The <a href=\\\"https://en.wikipedia.org/wiki/Routing_table\\\">Routing Information Base (RIB)</a> serves as a database that stores all the routing information and network topology data collected by a router or routing system, such as routes learned from BGP peers. The RIB is constantly updated as new routing information is received or existing routes change. This ensures that the route server always has the most current view of the network topology and can make optimal routing decisions.</p>\\n         <p>The <a href=\\\"https://en.wikipedia.org/wiki/Forwarding_information_base\\\">Forwarding Information Base (FIB)</a> serves as a forwarding table for what route server has determined are the best-path routes in the RIB after evaluating all available routing information and policies. The FIB routes are installed on the route tables. The FIB is recomputed whenever there are changes to the RIB.</p>\",\n                        \"smithy.api#xmlName\": \"routeStatus\"\n                    }\n                },\n                \"Prefix\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Prefix\",\n                        \"smithy.api#documentation\": \"<p>The destination CIDR block of the route.</p>\",\n                        \"smithy.api#xmlName\": \"prefix\"\n                    }\n                },\n                \"AsPaths\": {\n                    \"target\": \"com.amazonaws.ec2#AsPath\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AsPathSet\",\n                        \"smithy.api#documentation\": \"<p>The AS path attributes of the BGP route.</p>\",\n                        \"smithy.api#xmlName\": \"asPathSet\"\n                    }\n                },\n                \"Med\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Med\",\n                        \"smithy.api#documentation\": \"<p>The Multi-Exit Discriminator (MED) value of the BGP route.</p>\",\n                        \"smithy.api#xmlName\": \"med\"\n                    }\n                },\n                \"NextHopIp\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextHopIp\",\n                        \"smithy.api#documentation\": \"<p>The IP address for the next hop.</p>\",\n                        \"smithy.api#xmlName\": \"nextHopIp\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a route in the route server's routing database.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#RouteServerRouteInstallationDetail\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RouteTableId\": {\n                    \"target\": \"com.amazonaws.ec2#RouteTableId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RouteTableId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the route table where the route is being installed.</p>\",\n                        \"smithy.api#xmlName\": \"routeTableId\"\n                    }\n                },\n                \"RouteInstallationStatus\": {\n                    \"target\": \"com.amazonaws.ec2#RouteServerRouteInstallationStatus\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RouteInstallationStatus\",\n                        \"smithy.api#documentation\": \"<p>The current installation status of the route in the route table.</p>\",\n                        \"smithy.api#xmlName\": \"routeInstallationStatus\"\n                    }\n                },\n                \"RouteInstallationStatusReason\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RouteInstallationStatusReason\",\n                        \"smithy.api#documentation\": \"<p>The reason for the current installation status of the route.</p>\",\n                        \"smithy.api#xmlName\": \"routeInstallationStatusReason\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the installation status of a route in a route table.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#RouteServerRouteInstallationDetails\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#RouteServerRouteInstallationDetail\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#RouteServerRouteInstallationStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"INSTALLED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"installed\"\n                    }\n                },\n                \"REJECTED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"rejected\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#RouteServerRouteList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#RouteServerRoute\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#RouteServerRouteStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"IN_RIB\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"in-rib\"\n                    }\n                },\n                \"IN_FIB\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"in-fib\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#RouteServerState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"PENDING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"pending\"\n                    }\n                },\n                \"AVAILABLE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"available\"\n                    }\n                },\n                \"MODIFYING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"modifying\"\n                    }\n                },\n                \"DELETING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"deleting\"\n                    }\n                },\n                \"DELETED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"deleted\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#RouteServersList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#RouteServer\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#RouteState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"active\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"active\"\n                    }\n                },\n                \"blackhole\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"blackhole\"\n                    }\n                },\n                \"filtered\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"filtered\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#RouteTable\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Associations\": {\n                    \"target\": \"com.amazonaws.ec2#RouteTableAssociationList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AssociationSet\",\n                        \"smithy.api#documentation\": \"<p>The associations between the route table and your subnets or gateways.</p>\",\n                        \"smithy.api#xmlName\": \"associationSet\"\n                    }\n                },\n                \"PropagatingVgws\": {\n                    \"target\": \"com.amazonaws.ec2#PropagatingVgwList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PropagatingVgwSet\",\n                        \"smithy.api#documentation\": \"<p>Any virtual private gateway (VGW) propagating routes.</p>\",\n                        \"smithy.api#xmlName\": \"propagatingVgwSet\"\n                    }\n                },\n                \"RouteTableId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RouteTableId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the route table.</p>\",\n                        \"smithy.api#xmlName\": \"routeTableId\"\n                    }\n                },\n                \"Routes\": {\n                    \"target\": \"com.amazonaws.ec2#RouteList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RouteSet\",\n                        \"smithy.api#documentation\": \"<p>The routes in the route table.</p>\",\n                        \"smithy.api#xmlName\": \"routeSet\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>Any tags assigned to the route table.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                },\n                \"VpcId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the VPC.</p>\",\n                        \"smithy.api#xmlName\": \"vpcId\"\n                    }\n                },\n                \"OwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OwnerId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Amazon Web Services account that owns the route table.</p>\",\n                        \"smithy.api#xmlName\": \"ownerId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a route table.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#RouteTableAssociation\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Main\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Main\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether this is the main route table.</p>\",\n                        \"smithy.api#xmlName\": \"main\"\n                    }\n                },\n                \"RouteTableAssociationId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RouteTableAssociationId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the association.</p>\",\n                        \"smithy.api#xmlName\": \"routeTableAssociationId\"\n                    }\n                },\n                \"RouteTableId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RouteTableId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the route table.</p>\",\n                        \"smithy.api#xmlName\": \"routeTableId\"\n                    }\n                },\n                \"SubnetId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SubnetId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the subnet. A subnet ID is not returned for an implicit association.</p>\",\n                        \"smithy.api#xmlName\": \"subnetId\"\n                    }\n                },\n                \"GatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"GatewayId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the internet gateway or virtual private gateway.</p>\",\n                        \"smithy.api#xmlName\": \"gatewayId\"\n                    }\n                },\n                \"PublicIpv4Pool\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PublicIpv4Pool\",\n                        \"smithy.api#documentation\": \"<p>The ID of a public IPv4 pool. A public IPv4 pool is a pool of IPv4 addresses that you've brought to Amazon Web Services with BYOIP.</p>\",\n                        \"smithy.api#xmlName\": \"publicIpv4Pool\"\n                    }\n                },\n                \"AssociationState\": {\n                    \"target\": \"com.amazonaws.ec2#RouteTableAssociationState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AssociationState\",\n                        \"smithy.api#documentation\": \"<p>The state of the association.</p>\",\n                        \"smithy.api#xmlName\": \"associationState\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes an association between a route table and a subnet or gateway.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#RouteTableAssociationId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#RouteTableAssociationList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#RouteTableAssociation\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#RouteTableAssociationState\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#RouteTableAssociationStateCode\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The state of the association.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                },\n                \"StatusMessage\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"StatusMessage\",\n                        \"smithy.api#documentation\": \"<p>The status message, if applicable.</p>\",\n                        \"smithy.api#xmlName\": \"statusMessage\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the state of an association between a route table and a subnet or gateway.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#RouteTableAssociationStateCode\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"associating\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"associating\"\n                    }\n                },\n                \"associated\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"associated\"\n                    }\n                },\n                \"disassociating\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"disassociating\"\n                    }\n                },\n                \"disassociated\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"disassociated\"\n                    }\n                },\n                \"failed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"failed\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#RouteTableId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#RouteTableIdStringList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#RouteTableId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#RouteTableList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#RouteTable\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#RuleAction\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"allow\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"allow\"\n                    }\n                },\n                \"deny\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"deny\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#RuleGroupRuleOptionsPair\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RuleGroupArn\": {\n                    \"target\": \"com.amazonaws.ec2#ResourceArn\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RuleGroupArn\",\n                        \"smithy.api#documentation\": \"<p>The ARN of the rule group.</p>\",\n                        \"smithy.api#xmlName\": \"ruleGroupArn\"\n                    }\n                },\n                \"RuleOptions\": {\n                    \"target\": \"com.amazonaws.ec2#RuleOptionList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RuleOptionSet\",\n                        \"smithy.api#documentation\": \"<p>The rule options.</p>\",\n                        \"smithy.api#xmlName\": \"ruleOptionSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the rule options for a stateful rule group.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#RuleGroupRuleOptionsPairList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#RuleGroupRuleOptionsPair\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#RuleGroupTypePair\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RuleGroupArn\": {\n                    \"target\": \"com.amazonaws.ec2#ResourceArn\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RuleGroupArn\",\n                        \"smithy.api#documentation\": \"<p>The ARN of the rule group.</p>\",\n                        \"smithy.api#xmlName\": \"ruleGroupArn\"\n                    }\n                },\n                \"RuleGroupType\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RuleGroupType\",\n                        \"smithy.api#documentation\": \"<p>The rule group type. The possible values are <code>Domain List</code> and <code>Suricata</code>.</p>\",\n                        \"smithy.api#xmlName\": \"ruleGroupType\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the type of a stateful rule group.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#RuleGroupTypePairList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#RuleGroupTypePair\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#RuleOption\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Keyword\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Keyword\",\n                        \"smithy.api#documentation\": \"<p>The Suricata keyword.</p>\",\n                        \"smithy.api#xmlName\": \"keyword\"\n                    }\n                },\n                \"Settings\": {\n                    \"target\": \"com.amazonaws.ec2#StringList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SettingSet\",\n                        \"smithy.api#documentation\": \"<p>The settings for the keyword.</p>\",\n                        \"smithy.api#xmlName\": \"settingSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes additional settings for a stateful rule.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#RuleOptionList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#RuleOption\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#RunInstances\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#RunInstancesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#Reservation\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Launches the specified number of instances using an AMI for which you have\\n            permissions.</p>\\n         <p>You can specify a number of options, or leave the default options. The following rules\\n            apply:</p>\\n         <ul>\\n            <li>\\n               <p>If you don't specify a subnet ID, we choose a default subnet from\\n                    your default VPC for you. If you don't have a default VPC, you must specify a\\n                    subnet ID in the request.</p>\\n            </li>\\n            <li>\\n               <p>All instances have a network interface with a primary private IPv4\\n                    address. If you don't specify this address, we choose one from the IPv4 range of\\n                    your subnet.</p>\\n            </li>\\n            <li>\\n               <p>Not all instance types support IPv6 addresses. For more information, see\\n                        <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-types.html\\\">Instance\\n                    types</a>.</p>\\n            </li>\\n            <li>\\n               <p>If you don't specify a security group ID, we use the default security group\\n                    for the VPC. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-network-security.html\\\">Security\\n                        groups</a>.</p>\\n            </li>\\n            <li>\\n               <p>If any of the AMIs have a product code attached for which the user has not\\n                    subscribed, the request fails.</p>\\n            </li>\\n         </ul>\\n         <p>You can create a <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-launch-templates.html\\\">launch template</a>,\\n            which is a resource that contains the parameters to launch an instance. When you launch\\n            an instance using <a>RunInstances</a>, you can specify the launch template\\n            instead of specifying the launch parameters.</p>\\n         <p>To ensure faster instance launches, break up large requests into smaller batches. For\\n            example, create five separate launch requests for 100 instances each instead of one\\n            launch request for 500 instances.</p>\\n         <p>\\n            <code>RunInstances</code> is subject to both request rate limiting and resource rate\\n            limiting. For more information, see <a href=\\\"https://docs.aws.amazon.com/ec2/latest/devguide/ec2-api-throttling.html\\\">Request throttling</a>.</p>\\n         <p>An instance is ready for you to use when it's in the <code>running</code> state. You\\n            can check the state of your instance using <a>DescribeInstances</a>. You can\\n            tag instances and EBS volumes during launch, after launch, or both. For more\\n            information, see <a>CreateTags</a> and <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Tags.html\\\">Tagging your Amazon EC2\\n                resources</a>.</p>\\n         <p>Linux instances have access to the public key of the key pair at boot. You can use\\n            this key to provide secure access to the instance. Amazon EC2 public images use this\\n            feature to provide secure access without passwords. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-key-pairs.html\\\">Key\\n                pairs</a>.</p>\\n         <p>For troubleshooting, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_InstanceStraightToTerminated.html\\\">What to do if\\n                an instance immediately terminates</a>, and <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/TroubleshootingInstancesConnecting.html\\\">Troubleshooting connecting to your instance</a>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To launch an instance\",\n                        \"documentation\": \"This example launches an instance using the specified AMI, instance type, security group, subnet, block device mapping, and tags.\",\n                        \"input\": {\n                            \"BlockDeviceMappings\": [\n                                {\n                                    \"DeviceName\": \"/dev/sdh\",\n                                    \"Ebs\": {\n                                        \"VolumeSize\": 100\n                                    }\n                                }\n                            ],\n                            \"ImageId\": \"ami-abc12345\",\n                            \"InstanceType\": \"t2.micro\",\n                            \"KeyName\": \"my-key-pair\",\n                            \"MaxCount\": 1,\n                            \"MinCount\": 1,\n                            \"SecurityGroupIds\": [\n                                \"sg-1a2b3c4d\"\n                            ],\n                            \"SubnetId\": \"subnet-6e7f829e\",\n                            \"TagSpecifications\": [\n                                {\n                                    \"ResourceType\": \"instance\",\n                                    \"Tags\": [\n                                        {\n                                            \"Key\": \"Purpose\",\n                                            \"Value\": \"test\"\n                                        }\n                                    ]\n                                }\n                            ]\n                        },\n                        \"output\": {}\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#RunInstancesMonitoringEnabled\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Enabled\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Enabled\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>Indicates whether detailed monitoring is enabled. Otherwise, basic monitoring is\\n            enabled.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"enabled\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the monitoring of an instance.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#RunInstancesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"BlockDeviceMappings\": {\n                    \"target\": \"com.amazonaws.ec2#BlockDeviceMappingRequestList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The block device mapping, which defines the EBS volumes and instance store volumes to\\n            attach to the instance at launch. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/block-device-mapping-concepts.html\\\">Block device\\n                mappings</a> in the <i>Amazon EC2 User Guide</i>.</p>\",\n                        \"smithy.api#xmlName\": \"BlockDeviceMapping\"\n                    }\n                },\n                \"ImageId\": {\n                    \"target\": \"com.amazonaws.ec2#ImageId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the AMI. An AMI ID is required to launch an instance and must be specified\\n            here or in a launch template.</p>\"\n                    }\n                },\n                \"InstanceType\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The instance type. For more information, see <a href=\\\"https://docs.aws.amazon.com/ec2/latest/instancetypes/instance-types.html\\\">Amazon EC2 Instance\\n                Types Guide</a>.</p>\"\n                    }\n                },\n                \"Ipv6AddressCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of IPv6 addresses to associate with the primary network\\n            interface. Amazon EC2 chooses the IPv6 addresses from the range of your subnet. You\\n            cannot specify this option and the option to assign specific IPv6 addresses in the same\\n            request. You can specify this option if you've specified a minimum number of instances\\n            to launch.</p>\\n         <p>You cannot specify this option and the network interfaces option in the same\\n            request.</p>\"\n                    }\n                },\n                \"Ipv6Addresses\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceIpv6AddressList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IPv6 addresses from the range of the subnet to associate with the\\n            primary network interface. You cannot specify this option and the option to assign a\\n            number of IPv6 addresses in the same request. You cannot specify this option if you've\\n            specified a minimum number of instances to launch.</p>\\n         <p>You cannot specify this option and the network interfaces option in the same\\n            request.</p>\",\n                        \"smithy.api#xmlName\": \"Ipv6Address\"\n                    }\n                },\n                \"KernelId\": {\n                    \"target\": \"com.amazonaws.ec2#KernelId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the kernel.</p>\\n         <important>\\n            <p>We recommend that you use PV-GRUB instead of kernels and RAM disks. For more\\n                information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/UserProvidedkernels.html\\\">PV-GRUB</a> in the\\n                    <i>Amazon EC2 User Guide</i>.</p>\\n         </important>\"\n                    }\n                },\n                \"KeyName\": {\n                    \"target\": \"com.amazonaws.ec2#KeyPairName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the key pair. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/create-key-pairs.html\\\">Create a key pair for your EC2 instance</a>.</p>\\n         <important>\\n            <p>If you do not specify a key pair, you can't connect to the instance unless you\\n                choose an AMI that is configured to allow users another way to log in.</p>\\n         </important>\"\n                    }\n                },\n                \"MaxCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The maximum number of instances to launch. If you specify a value that is more\\n            capacity than Amazon EC2 can launch in the target Availability Zone, Amazon EC2 \\n            launches the largest possible number of instances above the specified minimum\\n            count.</p>\\n         <p>Constraints: Between 1 and the quota for the specified instance type for your account for this Region. \\n            For more information, see <a href=\\\"https://docs.aws.amazon.com/ec2/latest/instancetypes/ec2-instance-quotas.html\\\">Amazon EC2 instance type quotas</a>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"MinCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The minimum number of instances to launch. If you specify a value that is more\\n            capacity than Amazon EC2 can provide in the target Availability Zone, Amazon EC2 does\\n            not launch any instances.</p>\\n         <p>Constraints: Between 1 and the quota for the specified instance type for your account for this Region.\\n            For more information, see <a href=\\\"https://docs.aws.amazon.com/ec2/latest/instancetypes/ec2-instance-quotas.html\\\">Amazon EC2 instance type quotas</a>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Monitoring\": {\n                    \"target\": \"com.amazonaws.ec2#RunInstancesMonitoringEnabled\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies whether detailed monitoring is enabled for the instance.</p>\"\n                    }\n                },\n                \"Placement\": {\n                    \"target\": \"com.amazonaws.ec2#Placement\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The placement for the instance.</p>\"\n                    }\n                },\n                \"RamdiskId\": {\n                    \"target\": \"com.amazonaws.ec2#RamdiskId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the RAM disk to select. Some kernels require additional drivers at launch.\\n            Check the kernel requirements for information about whether you need to specify a RAM\\n            disk. To find kernel requirements, go to the Amazon Web Services Resource Center and\\n            search for the kernel ID.</p>\\n         <important>\\n            <p>We recommend that you use PV-GRUB instead of kernels and RAM disks. For more\\n                information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/UserProvidedkernels.html\\\">PV-GRUB</a> in the\\n                    <i>Amazon EC2 User Guide</i>.</p>\\n         </important>\"\n                    }\n                },\n                \"SecurityGroupIds\": {\n                    \"target\": \"com.amazonaws.ec2#SecurityGroupIdStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the security groups.</p>\\n         <p>If you specify a network interface, you must specify any security groups as part of\\n            the network interface instead of using this parameter.</p>\",\n                        \"smithy.api#xmlName\": \"SecurityGroupId\"\n                    }\n                },\n                \"SecurityGroups\": {\n                    \"target\": \"com.amazonaws.ec2#SecurityGroupStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>[Default VPC] The names of the security groups.</p>\\n         <p>If you specify a network interface, you must specify any security groups as part of\\n            the network interface instead of using this parameter.</p>\\n         <p>Default: Amazon EC2 uses the default security group.</p>\",\n                        \"smithy.api#xmlName\": \"SecurityGroup\"\n                    }\n                },\n                \"SubnetId\": {\n                    \"target\": \"com.amazonaws.ec2#SubnetId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the subnet to launch the instance into.</p>\\n         <p>If you specify a network interface, you must specify any subnets as part of the\\n            network interface instead of using this parameter.</p>\"\n                    }\n                },\n                \"UserData\": {\n                    \"target\": \"com.amazonaws.ec2#RunInstancesUserData\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The user data to make available to the instance. User data must be base64-encoded.\\n            Depending on the tool or SDK that you're using, the base64-encoding might be performed for you.\\n            For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/user-data.html\\\">Run commands at launch using instance user data</a>.</p>\"\n                    }\n                },\n                \"ElasticGpuSpecification\": {\n                    \"target\": \"com.amazonaws.ec2#ElasticGpuSpecifications\",\n                    \"traits\": {\n                        \"smithy.api#deprecated\": {\n                            \"since\": \"2024-01-08\",\n                            \"message\": \"Specifying Elastic Graphics accelerators is no longer supported on the RunInstances API.\"\n                        },\n                        \"smithy.api#documentation\": \"<p>An elastic GPU to associate with the instance.</p>\\n         <note>\\n            <p>Amazon Elastic Graphics reached end of life on January 8, 2024.</p>\\n         </note>\"\n                    }\n                },\n                \"ElasticInferenceAccelerators\": {\n                    \"target\": \"com.amazonaws.ec2#ElasticInferenceAccelerators\",\n                    \"traits\": {\n                        \"smithy.api#deprecated\": {\n                            \"since\": \"2024-01-08\",\n                            \"message\": \"Specifying Elastic Inference accelerators is no longer supported on the RunInstances API.\"\n                        },\n                        \"smithy.api#documentation\": \"<p>An elastic inference accelerator to associate with the instance.</p>\\n         <note>\\n            <p>Amazon Elastic Inference is no longer available.</p>\\n         </note>\",\n                        \"smithy.api#xmlName\": \"ElasticInferenceAccelerator\"\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags to apply to the resources that are created during instance launch.</p>\\n         <p>You can specify tags for the following resources only:</p>\\n         <ul>\\n            <li>\\n               <p>Instances</p>\\n            </li>\\n            <li>\\n               <p>Volumes</p>\\n            </li>\\n            <li>\\n               <p>Spot Instance requests</p>\\n            </li>\\n            <li>\\n               <p>Network interfaces</p>\\n            </li>\\n         </ul>\\n         <p>To tag a resource after it has been created, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateTags.html\\\">CreateTags</a>.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                },\n                \"LaunchTemplate\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplateSpecification\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The launch template. Any additional parameters that you specify for the new instance \\n            overwrite the corresponding parameters included in the launch template.</p>\"\n                    }\n                },\n                \"InstanceMarketOptions\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceMarketOptionsRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The market (purchasing) option for the instances.</p>\\n         <p>For <a>RunInstances</a>, persistent Spot Instance requests are\\n            only supported when <b>InstanceInterruptionBehavior</b> is set\\n            to either <code>hibernate</code> or <code>stop</code>.</p>\"\n                    }\n                },\n                \"CreditSpecification\": {\n                    \"target\": \"com.amazonaws.ec2#CreditSpecificationRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The credit option for CPU usage of the burstable performance instance. Valid values\\n            are <code>standard</code> and <code>unlimited</code>. To change this attribute after\\n            launch, use <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyInstanceCreditSpecification.html\\\">\\n                ModifyInstanceCreditSpecification</a>. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/burstable-performance-instances.html\\\">Burstable\\n                performance instances</a> in the <i>Amazon EC2 User Guide</i>.</p>\\n         <p>Default: <code>standard</code> (T2 instances) or <code>unlimited</code> (T3/T3a/T4g\\n            instances)</p>\\n         <p>For T3 instances with <code>host</code> tenancy, only <code>standard</code> is\\n            supported.</p>\"\n                    }\n                },\n                \"CpuOptions\": {\n                    \"target\": \"com.amazonaws.ec2#CpuOptionsRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The CPU options for the instance. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/instance-optimize-cpu.html\\\">Optimize CPU options</a> in the <i>Amazon EC2 User Guide</i>.</p>\"\n                    }\n                },\n                \"CapacityReservationSpecification\": {\n                    \"target\": \"com.amazonaws.ec2#CapacityReservationSpecification\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Information about the Capacity Reservation targeting option. If you do not specify this parameter, the\\n            instance's Capacity Reservation preference defaults to <code>open</code>, which enables\\n            it to run in any open Capacity Reservation that has matching attributes (instance type,\\n            platform, Availability Zone, and tenancy).</p>\"\n                    }\n                },\n                \"HibernationOptions\": {\n                    \"target\": \"com.amazonaws.ec2#HibernationOptionsRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether an instance is enabled for hibernation. This parameter is valid only\\n            if the instance meets the <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/hibernating-prerequisites.html\\\">hibernation\\n                prerequisites</a>. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Hibernate.html\\\">Hibernate your Amazon EC2\\n                instance</a> in the <i>Amazon EC2 User Guide</i>.</p>\\n         <p>You can't enable hibernation and Amazon Web Services Nitro Enclaves on the same\\n            instance.</p>\"\n                    }\n                },\n                \"LicenseSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#LicenseSpecificationListRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The license configurations.</p>\",\n                        \"smithy.api#xmlName\": \"LicenseSpecification\"\n                    }\n                },\n                \"MetadataOptions\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceMetadataOptionsRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The metadata options for the instance. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/configuring-instance-metadata-options.html\\\">Configure the Instance Metadata Service options</a>.</p>\"\n                    }\n                },\n                \"EnclaveOptions\": {\n                    \"target\": \"com.amazonaws.ec2#EnclaveOptionsRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether the instance is enabled for Amazon Web Services Nitro Enclaves. For\\n            more information, see <a href=\\\"https://docs.aws.amazon.com/enclaves/latest/user/\\\">Amazon Web Services Nitro\\n                Enclaves User Guide</a>.</p>\\n         <p>You can't enable Amazon Web Services Nitro Enclaves and hibernation on the same\\n            instance.</p>\"\n                    }\n                },\n                \"PrivateDnsNameOptions\": {\n                    \"target\": \"com.amazonaws.ec2#PrivateDnsNameOptionsRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The options for the instance hostname. \\n            The default values are inherited from the subnet.\\n            Applies only if creating a network interface, not attaching an existing one.</p>\"\n                    }\n                },\n                \"MaintenanceOptions\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceMaintenanceOptionsRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maintenance and recovery options for the instance.</p>\"\n                    }\n                },\n                \"DisableApiStop\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether an instance is enabled for stop protection. For more information,\\n            see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-stop-protection.html\\\">Enable stop protection for your EC2 instances</a>.</p>\"\n                    }\n                },\n                \"EnablePrimaryIpv6\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If you’re launching an instance into a dual-stack or IPv6-only subnet, you can enable\\n            assigning a primary IPv6 address. A primary IPv6 address is an IPv6 GUA address\\n            associated with an ENI that you have enabled to use a primary IPv6 address. Use this\\n            option if an instance relies on its IPv6 address not changing. When you launch the\\n            instance, Amazon Web Services will automatically assign an IPv6 address associated with\\n            the ENI attached to your instance to be the primary IPv6 address. Once you enable an\\n            IPv6 GUA address to be a primary IPv6, you cannot disable it. When you enable an IPv6\\n            GUA address to be a primary IPv6, the first IPv6 GUA will be made the primary IPv6\\n            address until the instance is terminated or the network interface is detached. If you\\n            have multiple IPv6 addresses associated with an ENI attached to your instance and you\\n            enable a primary IPv6 address, the first IPv6 GUA address associated with the ENI\\n            becomes the primary IPv6 address.</p>\"\n                    }\n                },\n                \"NetworkPerformanceOptions\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceNetworkPerformanceOptionsRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Contains settings for the network performance options for the instance.</p>\"\n                    }\n                },\n                \"Operator\": {\n                    \"target\": \"com.amazonaws.ec2#OperatorRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Reserved for internal use.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the operation, without actually making the \\n  request, and provides an error response. If you have the required permissions, the error response is \\n  <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"DisableApiTermination\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DisableApiTermination\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether termination protection is enabled for the instance. The default\\n            is <code>false</code>, which means that you can terminate the instance using\\n            the Amazon EC2 console, command line tools, or API. You can enable termination protection\\n            when you launch an instance, while the instance is running, or while the instance\\n            is stopped.</p>\",\n                        \"smithy.api#xmlName\": \"disableApiTermination\"\n                    }\n                },\n                \"InstanceInitiatedShutdownBehavior\": {\n                    \"target\": \"com.amazonaws.ec2#ShutdownBehavior\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceInitiatedShutdownBehavior\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether an instance stops or terminates when you initiate shutdown from the\\n            instance (using the operating system command for system shutdown).</p>\\n         <p>Default: <code>stop</code>\\n         </p>\",\n                        \"smithy.api#xmlName\": \"instanceInitiatedShutdownBehavior\"\n                    }\n                },\n                \"PrivateIpAddress\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PrivateIpAddress\",\n                        \"smithy.api#documentation\": \"<p>The primary IPv4 address. You must specify a value from the IPv4 address\\n            range of the subnet.</p>\\n         <p>Only one private IP address can be designated as primary. You can't specify this\\n            option if you've specified the option to designate a private IP address as the primary\\n            IP address in a network interface specification. You cannot specify this option if\\n            you're launching more than one instance in the request.</p>\\n         <p>You cannot specify this option and the network interfaces option in the same\\n            request.</p>\",\n                        \"smithy.api#xmlName\": \"privateIpAddress\"\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ClientToken\",\n                        \"smithy.api#documentation\": \"<p>Unique, case-sensitive identifier you provide to ensure the idempotency of the\\n            request. If you do not specify a client token, a randomly generated token is used for\\n            the request to ensure idempotency.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/ec2/latest/devguide/ec2-api-idempotency.html\\\">Ensuring idempotency in Amazon EC2 API requests</a>.</p>\\n         <p>Constraints: Maximum 64 ASCII characters</p>\",\n                        \"smithy.api#idempotencyToken\": {},\n                        \"smithy.api#xmlName\": \"clientToken\"\n                    }\n                },\n                \"AdditionalInfo\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AdditionalInfo\",\n                        \"smithy.api#documentation\": \"<p>Reserved.</p>\",\n                        \"smithy.api#xmlName\": \"additionalInfo\"\n                    }\n                },\n                \"NetworkInterfaces\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceNetworkInterfaceSpecificationList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkInterface\",\n                        \"smithy.api#documentation\": \"<p>The network interfaces to associate with the instance.</p>\",\n                        \"smithy.api#xmlName\": \"networkInterface\"\n                    }\n                },\n                \"IamInstanceProfile\": {\n                    \"target\": \"com.amazonaws.ec2#IamInstanceProfileSpecification\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IamInstanceProfile\",\n                        \"smithy.api#documentation\": \"<p>The name or Amazon Resource Name (ARN) of an IAM instance\\n            profile.</p>\",\n                        \"smithy.api#xmlName\": \"iamInstanceProfile\"\n                    }\n                },\n                \"EbsOptimized\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EbsOptimized\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether the instance is optimized for Amazon EBS I/O. This optimization\\n            provides dedicated throughput to Amazon EBS and an optimized configuration stack to\\n            provide optimal Amazon EBS I/O performance. This optimization isn't available with all\\n            instance types. Additional usage charges apply when using an EBS-optimized\\n            instance.</p>\\n         <p>Default: <code>false</code>\\n         </p>\",\n                        \"smithy.api#xmlName\": \"ebsOptimized\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#RunInstancesUserData\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#sensitive\": {}\n            }\n        },\n        \"com.amazonaws.ec2#RunScheduledInstances\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#RunScheduledInstancesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#RunScheduledInstancesResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Launches the specified Scheduled Instances.</p>\\n         <p>Before you can launch a Scheduled Instance, you must purchase it and obtain an identifier using <a>PurchaseScheduledInstances</a>.</p>\\n         <p>You must launch a Scheduled Instance during its scheduled time period. You can't stop or\\n         reboot a Scheduled Instance, but you can terminate it as needed. If you terminate a\\n         Scheduled Instance before the current scheduled time period ends, you can launch it again\\n         after a few minutes.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#RunScheduledInstancesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Unique, case-sensitive identifier that ensures the idempotency of the request. \\n         For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Run_Instance_Idempotency.html\\\">Ensuring Idempotency</a>.</p>\",\n                        \"smithy.api#idempotencyToken\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"InstanceCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of instances.</p>\\n         <p>Default: 1</p>\"\n                    }\n                },\n                \"LaunchSpecification\": {\n                    \"target\": \"com.amazonaws.ec2#ScheduledInstancesLaunchSpecification\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The launch specification. You must match the instance type, Availability Zone, \\n         network, and platform of the schedule that you purchased.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ScheduledInstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#ScheduledInstanceId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The Scheduled Instance ID.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the parameters for RunScheduledInstances.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#RunScheduledInstancesResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceIdSet\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceIdSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceIdSet\",\n                        \"smithy.api#documentation\": \"<p>The IDs of the newly launched instances.</p>\",\n                        \"smithy.api#xmlName\": \"instanceIdSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the output of RunScheduledInstances.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#S3ObjectTag\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Key\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The key of the tag.</p>\\n         <p>Constraints: Tag keys are case-sensitive and can be up to 128 Unicode characters in\\n      length. May not begin with <code>aws</code>:.</p>\"\n                    }\n                },\n                \"Value\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The value of the tag.</p>\\n         <p>Constraints: Tag values are case-sensitive and can be up to 256 Unicode characters in\\n      length.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The tags to apply to the AMI object that will be stored in the Amazon S3 bucket. For more\\n      information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-tagging.html\\\">Categorizing your storage using\\n        tags</a> in the <i>Amazon Simple Storage Service User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#S3ObjectTagList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#S3ObjectTag\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#S3Storage\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AWSAccessKeyId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The access key ID of the owner of the bucket. Before you specify a value for your access\\n      key ID, review and follow the guidance in <a href=\\\"https://docs.aws.amazon.com/accounts/latest/reference/best-practices.html\\\">Best Practices for Amazon Web Services\\n        accounts</a> in the <i>Account ManagementReference Guide</i>.</p>\"\n                    }\n                },\n                \"Bucket\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Bucket\",\n                        \"smithy.api#documentation\": \"<p>The bucket in which to store the AMI. You can specify a bucket that you already own or a\\n      new bucket that Amazon EC2 creates on your behalf. If you specify a bucket that belongs to someone\\n      else, Amazon EC2 returns an error.</p>\",\n                        \"smithy.api#xmlName\": \"bucket\"\n                    }\n                },\n                \"Prefix\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Prefix\",\n                        \"smithy.api#documentation\": \"<p>The beginning of the file name of the AMI.</p>\",\n                        \"smithy.api#xmlName\": \"prefix\"\n                    }\n                },\n                \"UploadPolicy\": {\n                    \"target\": \"com.amazonaws.ec2#Blob\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"UploadPolicy\",\n                        \"smithy.api#documentation\": \"<p>An Amazon S3 upload policy that gives Amazon EC2 permission to upload items into Amazon S3 on your\\n      behalf.</p>\",\n                        \"smithy.api#xmlName\": \"uploadPolicy\"\n                    }\n                },\n                \"UploadPolicySignature\": {\n                    \"target\": \"com.amazonaws.ec2#S3StorageUploadPolicySignature\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"UploadPolicySignature\",\n                        \"smithy.api#documentation\": \"<p>The signature of the JSON document.</p>\",\n                        \"smithy.api#xmlName\": \"uploadPolicySignature\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the storage parameters for Amazon S3 and Amazon S3 buckets for an instance store-backed\\n      AMI.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#S3StorageUploadPolicySignature\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#sensitive\": {}\n            }\n        },\n        \"com.amazonaws.ec2#SSEType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"sse_ebs\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"sse-ebs\"\n                    }\n                },\n                \"sse_kms\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"sse-kms\"\n                    }\n                },\n                \"none\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"none\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ScheduledInstance\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AvailabilityZone\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AvailabilityZone\",\n                        \"smithy.api#documentation\": \"<p>The Availability Zone.</p>\",\n                        \"smithy.api#xmlName\": \"availabilityZone\"\n                    }\n                },\n                \"CreateDate\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CreateDate\",\n                        \"smithy.api#documentation\": \"<p>The date when the Scheduled Instance was purchased.</p>\",\n                        \"smithy.api#xmlName\": \"createDate\"\n                    }\n                },\n                \"HourlyPrice\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"HourlyPrice\",\n                        \"smithy.api#documentation\": \"<p>The hourly price for a single instance.</p>\",\n                        \"smithy.api#xmlName\": \"hourlyPrice\"\n                    }\n                },\n                \"InstanceCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceCount\",\n                        \"smithy.api#documentation\": \"<p>The number of instances.</p>\",\n                        \"smithy.api#xmlName\": \"instanceCount\"\n                    }\n                },\n                \"InstanceType\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceType\",\n                        \"smithy.api#documentation\": \"<p>The instance type.</p>\",\n                        \"smithy.api#xmlName\": \"instanceType\"\n                    }\n                },\n                \"NetworkPlatform\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkPlatform\",\n                        \"smithy.api#documentation\": \"<p>The network platform.</p>\",\n                        \"smithy.api#xmlName\": \"networkPlatform\"\n                    }\n                },\n                \"NextSlotStartTime\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextSlotStartTime\",\n                        \"smithy.api#documentation\": \"<p>The time for the next schedule to start.</p>\",\n                        \"smithy.api#xmlName\": \"nextSlotStartTime\"\n                    }\n                },\n                \"Platform\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Platform\",\n                        \"smithy.api#documentation\": \"<p>The platform (<code>Linux/UNIX</code> or <code>Windows</code>).</p>\",\n                        \"smithy.api#xmlName\": \"platform\"\n                    }\n                },\n                \"PreviousSlotEndTime\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PreviousSlotEndTime\",\n                        \"smithy.api#documentation\": \"<p>The time that the previous schedule ended or will end.</p>\",\n                        \"smithy.api#xmlName\": \"previousSlotEndTime\"\n                    }\n                },\n                \"Recurrence\": {\n                    \"target\": \"com.amazonaws.ec2#ScheduledInstanceRecurrence\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Recurrence\",\n                        \"smithy.api#documentation\": \"<p>The schedule recurrence.</p>\",\n                        \"smithy.api#xmlName\": \"recurrence\"\n                    }\n                },\n                \"ScheduledInstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ScheduledInstanceId\",\n                        \"smithy.api#documentation\": \"<p>The Scheduled Instance ID.</p>\",\n                        \"smithy.api#xmlName\": \"scheduledInstanceId\"\n                    }\n                },\n                \"SlotDurationInHours\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SlotDurationInHours\",\n                        \"smithy.api#documentation\": \"<p>The number of hours in the schedule.</p>\",\n                        \"smithy.api#xmlName\": \"slotDurationInHours\"\n                    }\n                },\n                \"TermEndDate\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TermEndDate\",\n                        \"smithy.api#documentation\": \"<p>The end date for the Scheduled Instance.</p>\",\n                        \"smithy.api#xmlName\": \"termEndDate\"\n                    }\n                },\n                \"TermStartDate\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TermStartDate\",\n                        \"smithy.api#documentation\": \"<p>The start date for the Scheduled Instance.</p>\",\n                        \"smithy.api#xmlName\": \"termStartDate\"\n                    }\n                },\n                \"TotalScheduledInstanceHours\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TotalScheduledInstanceHours\",\n                        \"smithy.api#documentation\": \"<p>The total number of hours for a single instance for the entire term.</p>\",\n                        \"smithy.api#xmlName\": \"totalScheduledInstanceHours\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a Scheduled Instance.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ScheduledInstanceAvailability\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AvailabilityZone\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AvailabilityZone\",\n                        \"smithy.api#documentation\": \"<p>The Availability Zone.</p>\",\n                        \"smithy.api#xmlName\": \"availabilityZone\"\n                    }\n                },\n                \"AvailableInstanceCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AvailableInstanceCount\",\n                        \"smithy.api#documentation\": \"<p>The number of available instances.</p>\",\n                        \"smithy.api#xmlName\": \"availableInstanceCount\"\n                    }\n                },\n                \"FirstSlotStartTime\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"FirstSlotStartTime\",\n                        \"smithy.api#documentation\": \"<p>The time period for the first schedule to start.</p>\",\n                        \"smithy.api#xmlName\": \"firstSlotStartTime\"\n                    }\n                },\n                \"HourlyPrice\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"HourlyPrice\",\n                        \"smithy.api#documentation\": \"<p>The hourly price for a single instance.</p>\",\n                        \"smithy.api#xmlName\": \"hourlyPrice\"\n                    }\n                },\n                \"InstanceType\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceType\",\n                        \"smithy.api#documentation\": \"<p>The instance type. You can specify one of the C3, C4, M4, or R3 instance types.</p>\",\n                        \"smithy.api#xmlName\": \"instanceType\"\n                    }\n                },\n                \"MaxTermDurationInDays\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MaxTermDurationInDays\",\n                        \"smithy.api#documentation\": \"<p>The maximum term. The only possible value is 365 days.</p>\",\n                        \"smithy.api#xmlName\": \"maxTermDurationInDays\"\n                    }\n                },\n                \"MinTermDurationInDays\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MinTermDurationInDays\",\n                        \"smithy.api#documentation\": \"<p>The minimum term. The only possible value is 365 days.</p>\",\n                        \"smithy.api#xmlName\": \"minTermDurationInDays\"\n                    }\n                },\n                \"NetworkPlatform\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkPlatform\",\n                        \"smithy.api#documentation\": \"<p>The network platform.</p>\",\n                        \"smithy.api#xmlName\": \"networkPlatform\"\n                    }\n                },\n                \"Platform\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Platform\",\n                        \"smithy.api#documentation\": \"<p>The platform (<code>Linux/UNIX</code> or <code>Windows</code>).</p>\",\n                        \"smithy.api#xmlName\": \"platform\"\n                    }\n                },\n                \"PurchaseToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PurchaseToken\",\n                        \"smithy.api#documentation\": \"<p>The purchase token. This token expires in two hours.</p>\",\n                        \"smithy.api#xmlName\": \"purchaseToken\"\n                    }\n                },\n                \"Recurrence\": {\n                    \"target\": \"com.amazonaws.ec2#ScheduledInstanceRecurrence\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Recurrence\",\n                        \"smithy.api#documentation\": \"<p>The schedule recurrence.</p>\",\n                        \"smithy.api#xmlName\": \"recurrence\"\n                    }\n                },\n                \"SlotDurationInHours\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SlotDurationInHours\",\n                        \"smithy.api#documentation\": \"<p>The number of hours in the schedule.</p>\",\n                        \"smithy.api#xmlName\": \"slotDurationInHours\"\n                    }\n                },\n                \"TotalScheduledInstanceHours\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TotalScheduledInstanceHours\",\n                        \"smithy.api#documentation\": \"<p>The total number of hours for a single instance for the entire term.</p>\",\n                        \"smithy.api#xmlName\": \"totalScheduledInstanceHours\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a schedule that is available for your Scheduled Instances.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ScheduledInstanceAvailabilitySet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ScheduledInstanceAvailability\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ScheduledInstanceId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#ScheduledInstanceIdRequestSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ScheduledInstanceId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"ScheduledInstanceId\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ScheduledInstanceRecurrence\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Frequency\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Frequency\",\n                        \"smithy.api#documentation\": \"<p>The frequency (<code>Daily</code>, <code>Weekly</code>, or <code>Monthly</code>).</p>\",\n                        \"smithy.api#xmlName\": \"frequency\"\n                    }\n                },\n                \"Interval\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Interval\",\n                        \"smithy.api#documentation\": \"<p>The interval quantity. The interval unit depends on the value of <code>frequency</code>. For example, every 2\\n         weeks or every 2 months.</p>\",\n                        \"smithy.api#xmlName\": \"interval\"\n                    }\n                },\n                \"OccurrenceDaySet\": {\n                    \"target\": \"com.amazonaws.ec2#OccurrenceDaySet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OccurrenceDaySet\",\n                        \"smithy.api#documentation\": \"<p>The days. For a monthly schedule, this is one or more days of the month (1-31). For a weekly schedule, this is one or more days of the week (1-7, where 1 is Sunday).</p>\",\n                        \"smithy.api#xmlName\": \"occurrenceDaySet\"\n                    }\n                },\n                \"OccurrenceRelativeToEnd\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OccurrenceRelativeToEnd\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether the occurrence is relative to the end of the specified week or month.</p>\",\n                        \"smithy.api#xmlName\": \"occurrenceRelativeToEnd\"\n                    }\n                },\n                \"OccurrenceUnit\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OccurrenceUnit\",\n                        \"smithy.api#documentation\": \"<p>The unit for <code>occurrenceDaySet</code> (<code>DayOfWeek</code> or <code>DayOfMonth</code>).</p>\",\n                        \"smithy.api#xmlName\": \"occurrenceUnit\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the recurring schedule for a Scheduled Instance.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ScheduledInstanceRecurrenceRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Frequency\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The frequency (<code>Daily</code>, <code>Weekly</code>, or <code>Monthly</code>).</p>\"\n                    }\n                },\n                \"Interval\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The interval quantity. The interval unit depends on the value of <code>Frequency</code>. For example, every 2 \\n         weeks or every 2 months.</p>\"\n                    }\n                },\n                \"OccurrenceDays\": {\n                    \"target\": \"com.amazonaws.ec2#OccurrenceDayRequestSet\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The days. For a monthly schedule, this is one or more days of the month (1-31). For a weekly schedule, this is one or more days of the week (1-7, where 1 is Sunday). You can't specify this value with a daily schedule. If the occurrence is relative to the end of the month, you can specify only a single day.</p>\",\n                        \"smithy.api#xmlName\": \"OccurrenceDay\"\n                    }\n                },\n                \"OccurrenceRelativeToEnd\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether the occurrence is relative to the end of the specified week or month. You can't specify this value with a daily schedule.</p>\"\n                    }\n                },\n                \"OccurrenceUnit\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The unit for <code>OccurrenceDays</code> (<code>DayOfWeek</code> or <code>DayOfMonth</code>).\\n        This value is required for a monthly schedule.\\n        You can't specify <code>DayOfWeek</code> with a weekly schedule.\\n        You can't specify this value with a daily schedule.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the recurring schedule for a Scheduled Instance.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ScheduledInstanceSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ScheduledInstance\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ScheduledInstancesBlockDeviceMapping\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DeviceName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The device name (for example, <code>/dev/sdh</code> or <code>xvdh</code>).</p>\"\n                    }\n                },\n                \"Ebs\": {\n                    \"target\": \"com.amazonaws.ec2#ScheduledInstancesEbs\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Parameters used to set up EBS volumes automatically when the instance is launched.</p>\"\n                    }\n                },\n                \"NoDevice\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>To omit the device from the block device mapping, specify an empty string.</p>\"\n                    }\n                },\n                \"VirtualName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The virtual device name (<code>ephemeral</code>N). Instance store volumes are numbered\\n         starting from 0. An instance type with two available instance store volumes can specify mappings\\n         for <code>ephemeral0</code> and <code>ephemeral1</code>. The number of available instance store\\n         volumes depends on the instance type. After you connect to the instance, you must mount the\\n         volume.</p>\\n         <p>Constraints: For M3 instances, you must specify instance store volumes in the block device \\n         mapping for the instance. When you launch an M3 instance, we ignore any instance store volumes \\n         specified in the block device mapping for the AMI.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a block device mapping for a Scheduled Instance.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ScheduledInstancesBlockDeviceMappingSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ScheduledInstancesBlockDeviceMapping\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"BlockDeviceMapping\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ScheduledInstancesEbs\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DeleteOnTermination\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether the volume is deleted on instance termination.</p>\"\n                    }\n                },\n                \"Encrypted\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether the volume is encrypted. You can attached encrypted volumes only to instances that \\n         support them.</p>\"\n                    }\n                },\n                \"Iops\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of I/O operations per second (IOPS) to provision for a <code>gp3</code>, <code>io1</code>, or <code>io2</code> \\n   \\t   volume.</p>\"\n                    }\n                },\n                \"SnapshotId\": {\n                    \"target\": \"com.amazonaws.ec2#SnapshotId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the snapshot.</p>\"\n                    }\n                },\n                \"VolumeSize\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The size of the volume, in GiB.</p>\\n         <p>Default: If you're creating the volume from a snapshot and don't specify a volume size, the default \\n         is the snapshot size.</p>\"\n                    }\n                },\n                \"VolumeType\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The volume type.</p>\\n         <p>Default: <code>gp2</code>\\n         </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes an EBS volume for a Scheduled Instance.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ScheduledInstancesIamInstanceProfile\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Arn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN).</p>\"\n                    }\n                },\n                \"Name\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes an IAM instance profile for a Scheduled Instance.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ScheduledInstancesIpv6Address\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Ipv6Address\": {\n                    \"target\": \"com.amazonaws.ec2#Ipv6Address\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IPv6 address.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes an IPv6 address.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ScheduledInstancesIpv6AddressList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ScheduledInstancesIpv6Address\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"Ipv6Address\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ScheduledInstancesLaunchSpecification\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"BlockDeviceMappings\": {\n                    \"target\": \"com.amazonaws.ec2#ScheduledInstancesBlockDeviceMappingSet\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The block device mapping entries.</p>\",\n                        \"smithy.api#xmlName\": \"BlockDeviceMapping\"\n                    }\n                },\n                \"EbsOptimized\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether the instances are optimized for EBS I/O. This optimization provides dedicated throughput to Amazon EBS and an optimized configuration stack to provide optimal EBS I/O performance. This optimization isn't available with all instance types. Additional usage charges apply when using an EBS-optimized instance.</p>\\n         <p>Default: <code>false</code>\\n         </p>\"\n                    }\n                },\n                \"IamInstanceProfile\": {\n                    \"target\": \"com.amazonaws.ec2#ScheduledInstancesIamInstanceProfile\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IAM instance profile.</p>\"\n                    }\n                },\n                \"ImageId\": {\n                    \"target\": \"com.amazonaws.ec2#ImageId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the Amazon Machine Image (AMI).</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"InstanceType\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The instance type.</p>\"\n                    }\n                },\n                \"KernelId\": {\n                    \"target\": \"com.amazonaws.ec2#KernelId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the kernel.</p>\"\n                    }\n                },\n                \"KeyName\": {\n                    \"target\": \"com.amazonaws.ec2#KeyPairName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the key pair.</p>\"\n                    }\n                },\n                \"Monitoring\": {\n                    \"target\": \"com.amazonaws.ec2#ScheduledInstancesMonitoring\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Enable or disable monitoring for the instances.</p>\"\n                    }\n                },\n                \"NetworkInterfaces\": {\n                    \"target\": \"com.amazonaws.ec2#ScheduledInstancesNetworkInterfaceSet\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The network interfaces.</p>\",\n                        \"smithy.api#xmlName\": \"NetworkInterface\"\n                    }\n                },\n                \"Placement\": {\n                    \"target\": \"com.amazonaws.ec2#ScheduledInstancesPlacement\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The placement information.</p>\"\n                    }\n                },\n                \"RamdiskId\": {\n                    \"target\": \"com.amazonaws.ec2#RamdiskId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the RAM disk.</p>\"\n                    }\n                },\n                \"SecurityGroupIds\": {\n                    \"target\": \"com.amazonaws.ec2#ScheduledInstancesSecurityGroupIdSet\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the security groups.</p>\",\n                        \"smithy.api#xmlName\": \"SecurityGroupId\"\n                    }\n                },\n                \"SubnetId\": {\n                    \"target\": \"com.amazonaws.ec2#SubnetId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the subnet in which to launch the instances.</p>\"\n                    }\n                },\n                \"UserData\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The base64-encoded MIME user data.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the launch specification for a Scheduled Instance.</p>\\n         <p>If you are launching the Scheduled Instance in EC2-VPC, you must specify the ID of the subnet.\\n          You can specify the subnet using either <code>SubnetId</code> or <code>NetworkInterface</code>.</p>\",\n                \"smithy.api#sensitive\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ScheduledInstancesMonitoring\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Enabled\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether monitoring is enabled.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes whether monitoring is enabled for a Scheduled Instance.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ScheduledInstancesNetworkInterface\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AssociatePublicIpAddress\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether to assign a public IPv4 address to instances launched in a VPC. The\\n         public IPv4 address can only be assigned to a network interface for eth0, and can only be\\n         assigned to a new network interface, not an existing one. You cannot specify more than one\\n         network interface in the request. If launching into a default subnet, the default value is\\n         <code>true</code>.</p>\\n         <p>Amazon Web Services charges for all public IPv4 addresses, including public IPv4 addresses \\nassociated with running instances and Elastic IP addresses. For more information, see the <i>Public IPv4 Address</i> tab on the <a href=\\\"http://aws.amazon.com/vpc/pricing/\\\">Amazon VPC pricing page</a>.</p>\"\n                    }\n                },\n                \"DeleteOnTermination\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether to delete the interface when the instance is terminated.</p>\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The description.</p>\"\n                    }\n                },\n                \"DeviceIndex\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The index of the device for the network interface attachment.</p>\"\n                    }\n                },\n                \"Groups\": {\n                    \"target\": \"com.amazonaws.ec2#ScheduledInstancesSecurityGroupIdSet\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the security groups.</p>\",\n                        \"smithy.api#xmlName\": \"Group\"\n                    }\n                },\n                \"Ipv6AddressCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of IPv6 addresses to assign to the network interface. The IPv6 addresses are automatically selected from the subnet range.</p>\"\n                    }\n                },\n                \"Ipv6Addresses\": {\n                    \"target\": \"com.amazonaws.ec2#ScheduledInstancesIpv6AddressList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The specific IPv6 addresses from the subnet range.</p>\",\n                        \"smithy.api#xmlName\": \"Ipv6Address\"\n                    }\n                },\n                \"NetworkInterfaceId\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInterfaceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the network interface.</p>\"\n                    }\n                },\n                \"PrivateIpAddress\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IPv4 address of the network interface within the subnet.</p>\"\n                    }\n                },\n                \"PrivateIpAddressConfigs\": {\n                    \"target\": \"com.amazonaws.ec2#PrivateIpAddressConfigSet\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The private IPv4 addresses.</p>\",\n                        \"smithy.api#xmlName\": \"PrivateIpAddressConfig\"\n                    }\n                },\n                \"SecondaryPrivateIpAddressCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of secondary private IPv4 addresses.</p>\"\n                    }\n                },\n                \"SubnetId\": {\n                    \"target\": \"com.amazonaws.ec2#SubnetId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the subnet.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a network interface for a Scheduled Instance.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ScheduledInstancesNetworkInterfaceSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ScheduledInstancesNetworkInterface\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"NetworkInterface\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ScheduledInstancesPlacement\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AvailabilityZone\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Availability Zone.</p>\"\n                    }\n                },\n                \"GroupName\": {\n                    \"target\": \"com.amazonaws.ec2#PlacementGroupName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the placement group.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the placement for a Scheduled Instance.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ScheduledInstancesPrivateIpAddressConfig\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Primary\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether this is a primary IPv4 address. Otherwise, this is a secondary IPv4 address.</p>\"\n                    }\n                },\n                \"PrivateIpAddress\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IPv4 address.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a private IPv4 address for a Scheduled Instance.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ScheduledInstancesSecurityGroupIdSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#SecurityGroupId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"SecurityGroupId\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#SearchLocalGatewayRoutes\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#SearchLocalGatewayRoutesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#SearchLocalGatewayRoutesResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Searches for routes in the specified local gateway route table.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"Routes\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#SearchLocalGatewayRoutesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LocalGatewayRouteTableId\": {\n                    \"target\": \"com.amazonaws.ec2#LocalGatewayRoutetableId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the local gateway route table.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more filters.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>prefix-list-id</code> - The ID of the prefix list.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>route-search.exact-match</code> - The exact match of the specified filter.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>route-search.longest-prefix-match</code> - The longest prefix that matches the route.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>route-search.subnet-of-match</code> - The routes with a subnet that match the specified CIDR filter.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>route-search.supernet-of-match</code> - The routes with a CIDR that encompass the CIDR filter. \\n               For example, if you have 10.0.1.0/29 and 10.0.1.0/31 routes in your route table and you specify <code>supernet-of-match</code> \\n               as 10.0.1.0/30, then the result returns 10.0.1.0/29.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>state</code> - The state of the route.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>type</code> - The route type.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#MaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return with a single call.\\n\\tTo retrieve the remaining results, make another call with the returned <code>nextToken</code> value.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next page of results.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#SearchLocalGatewayRoutesResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Routes\": {\n                    \"target\": \"com.amazonaws.ec2#LocalGatewayRouteList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RouteSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the routes.</p>\",\n                        \"smithy.api#xmlName\": \"routeSet\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#SearchTransitGatewayMulticastGroups\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#SearchTransitGatewayMulticastGroupsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#SearchTransitGatewayMulticastGroupsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Searches one or more  transit gateway multicast groups and returns the group membership information.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"MulticastGroups\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#SearchTransitGatewayMulticastGroupsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayMulticastDomainId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayMulticastDomainId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the transit gateway multicast domain.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more filters. The possible values are:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>group-ip-address</code> - The IP address of the  transit gateway multicast group.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>is-group-member</code> - The resource is a group member. Valid values are <code>true</code> | <code>false</code>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>is-group-source</code> - The resource is a group source. Valid values are <code>true</code> | <code>false</code>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>member-type</code> - The member type. Valid values are <code>igmp</code> | <code>static</code>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>resource-id</code> - The ID of the resource.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>resource-type</code> - The type of resource. Valid values are <code>vpc</code> | <code>vpn</code> | <code>direct-connect-gateway</code> | <code>tgw-peering</code>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>source-type</code> - The source type. Valid values are <code>igmp</code> | <code>static</code>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>subnet-id</code> - The ID of the subnet.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>transit-gateway-attachment-id</code> - The id of the transit gateway attachment.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of results to return with a single call.\\n\\tTo retrieve the remaining results, make another call with the returned <code>nextToken</code> value.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next page of results.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#SearchTransitGatewayMulticastGroupsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"MulticastGroups\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayMulticastGroupList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MulticastGroups\",\n                        \"smithy.api#documentation\": \"<p>Information about the  transit gateway multicast group.</p>\",\n                        \"smithy.api#xmlName\": \"multicastGroups\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NextToken\",\n                        \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is <code>null</code> when there are no more results to return.</p>\",\n                        \"smithy.api#xmlName\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#SearchTransitGatewayRoutes\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#SearchTransitGatewayRoutesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#SearchTransitGatewayRoutesResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Searches for routes in the specified transit gateway route table.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#SearchTransitGatewayRoutesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayRouteTableId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayRouteTableId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the transit gateway route table.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.ec2#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>One or more filters. The possible values are:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>attachment.transit-gateway-attachment-id</code>- The id of the transit gateway attachment.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>attachment.resource-id</code> - The resource id of the transit gateway attachment.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>attachment.resource-type</code> - The attachment resource type. Valid values\\n                    are <code>vpc</code> | <code>vpn</code> | <code>direct-connect-gateway</code> |\\n                        <code>peering</code> | <code>connect</code>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>prefix-list-id</code> - The ID of the prefix list.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>route-search.exact-match</code> - The exact match of the specified filter.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>route-search.longest-prefix-match</code> - The longest prefix that matches the route.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>route-search.subnet-of-match</code> - The routes with a subnet that match the specified CIDR filter.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>route-search.supernet-of-match</code> - The routes with a CIDR that encompass the CIDR filter. For example, if you have 10.0.1.0/29 and 10.0.1.0/31 routes in your route table and you specify supernet-of-match as 10.0.1.0/30, then the result returns 10.0.1.0/29.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>state</code> - The state of the route (<code>active</code> | <code>blackhole</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>type</code> - The type of route (<code>propagated</code> |\\n                  <code>static</code>).</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"Filter\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayMaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of routes to return. If a value is not provided, the default is\\n         1000.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#SearchTransitGatewayRoutesResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Routes\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayRouteList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RouteSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the routes.</p>\",\n                        \"smithy.api#xmlName\": \"routeSet\"\n                    }\n                },\n                \"AdditionalRoutesAvailable\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AdditionalRoutesAvailable\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether there are additional routes available.</p>\",\n                        \"smithy.api#xmlName\": \"additionalRoutesAvailable\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#SecurityGroup\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"GroupId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"GroupId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the security group.</p>\",\n                        \"smithy.api#xmlName\": \"groupId\"\n                    }\n                },\n                \"IpPermissionsEgress\": {\n                    \"target\": \"com.amazonaws.ec2#IpPermissionList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpPermissionsEgress\",\n                        \"smithy.api#documentation\": \"<p>The outbound rules associated with the security group.</p>\",\n                        \"smithy.api#xmlName\": \"ipPermissionsEgress\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>Any tags assigned to the security group.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                },\n                \"VpcId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the VPC for the security group.</p>\",\n                        \"smithy.api#xmlName\": \"vpcId\"\n                    }\n                },\n                \"SecurityGroupArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SecurityGroupArn\",\n                        \"smithy.api#documentation\": \"<p>The ARN of the security group.</p>\",\n                        \"smithy.api#xmlName\": \"securityGroupArn\"\n                    }\n                },\n                \"OwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OwnerId\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID of the owner of the security group.</p>\",\n                        \"smithy.api#xmlName\": \"ownerId\"\n                    }\n                },\n                \"GroupName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"GroupName\",\n                        \"smithy.api#documentation\": \"<p>The name of the security group.</p>\",\n                        \"smithy.api#xmlName\": \"groupName\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"GroupDescription\",\n                        \"smithy.api#documentation\": \"<p>A description of the security group.</p>\",\n                        \"smithy.api#xmlName\": \"groupDescription\"\n                    }\n                },\n                \"IpPermissions\": {\n                    \"target\": \"com.amazonaws.ec2#IpPermissionList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpPermissions\",\n                        \"smithy.api#documentation\": \"<p>The inbound rules associated with the security group.</p>\",\n                        \"smithy.api#xmlName\": \"ipPermissions\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a security group.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#SecurityGroupForVpc\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Description\",\n                        \"smithy.api#documentation\": \"<p>The security group's description.</p>\",\n                        \"smithy.api#xmlName\": \"description\"\n                    }\n                },\n                \"GroupName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"GroupName\",\n                        \"smithy.api#documentation\": \"<p>The security group name.</p>\",\n                        \"smithy.api#xmlName\": \"groupName\"\n                    }\n                },\n                \"OwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OwnerId\",\n                        \"smithy.api#documentation\": \"<p>The security group owner ID.</p>\",\n                        \"smithy.api#xmlName\": \"ownerId\"\n                    }\n                },\n                \"GroupId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"GroupId\",\n                        \"smithy.api#documentation\": \"<p>The security group ID.</p>\",\n                        \"smithy.api#xmlName\": \"groupId\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>The security group tags.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                },\n                \"PrimaryVpcId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PrimaryVpcId\",\n                        \"smithy.api#documentation\": \"<p>The VPC ID in which the security group was created.</p>\",\n                        \"smithy.api#xmlName\": \"primaryVpcId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A security group that can be used by interfaces in the VPC.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#SecurityGroupForVpcList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#SecurityGroupForVpc\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#SecurityGroupId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#SecurityGroupIdList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#SecurityGroupId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#SecurityGroupIdSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#SecurityGroupId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#SecurityGroupIdStringList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#SecurityGroupId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"SecurityGroupId\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#SecurityGroupIdStringListRequest\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#SecurityGroupId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"SecurityGroupId\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 16\n                }\n            }\n        },\n        \"com.amazonaws.ec2#SecurityGroupIdentifier\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"GroupId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"GroupId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the security group.</p>\",\n                        \"smithy.api#xmlName\": \"groupId\"\n                    }\n                },\n                \"GroupName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"GroupName\",\n                        \"smithy.api#documentation\": \"<p>The name of the security group.</p>\",\n                        \"smithy.api#xmlName\": \"groupName\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a security group.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#SecurityGroupList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#SecurityGroup\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#SecurityGroupName\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#SecurityGroupReference\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"GroupId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"GroupId\",\n                        \"smithy.api#documentation\": \"<p>The ID of your security group.</p>\",\n                        \"smithy.api#xmlName\": \"groupId\"\n                    }\n                },\n                \"ReferencingVpcId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ReferencingVpcId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the VPC with the referencing security group.</p>\",\n                        \"smithy.api#xmlName\": \"referencingVpcId\"\n                    }\n                },\n                \"VpcPeeringConnectionId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcPeeringConnectionId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the VPC peering connection (if applicable). For more information about security group referencing for peering connections, see \\n          <a href=\\\"https://docs.aws.amazon.com/vpc/latest/peering/vpc-peering-security-groups.html\\\">Update your security groups to reference peer security groups</a> \\n          in the <i>VPC Peering Guide</i>.</p>\",\n                        \"smithy.api#xmlName\": \"vpcPeeringConnectionId\"\n                    }\n                },\n                \"TransitGatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the transit gateway (if applicable).</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a VPC with a security group that references your security group.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#SecurityGroupReferences\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#SecurityGroupReference\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#SecurityGroupReferencingSupportValue\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"enable\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"enable\"\n                    }\n                },\n                \"disable\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"disable\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#SecurityGroupRule\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SecurityGroupRuleId\": {\n                    \"target\": \"com.amazonaws.ec2#SecurityGroupRuleId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SecurityGroupRuleId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the security group rule.</p>\",\n                        \"smithy.api#xmlName\": \"securityGroupRuleId\"\n                    }\n                },\n                \"GroupId\": {\n                    \"target\": \"com.amazonaws.ec2#SecurityGroupId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"GroupId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the security group.</p>\",\n                        \"smithy.api#xmlName\": \"groupId\"\n                    }\n                },\n                \"GroupOwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"GroupOwnerId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Amazon Web Services account that owns the security group. </p>\",\n                        \"smithy.api#xmlName\": \"groupOwnerId\"\n                    }\n                },\n                \"IsEgress\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IsEgress\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether the security group rule is an outbound rule.</p>\",\n                        \"smithy.api#xmlName\": \"isEgress\"\n                    }\n                },\n                \"IpProtocol\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpProtocol\",\n                        \"smithy.api#documentation\": \"<p>The IP protocol name (<code>tcp</code>, <code>udp</code>, <code>icmp</code>,\\n                <code>icmpv6</code>) or number (see <a href=\\\"http://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml\\\">Protocol Numbers</a>). </p>\\n         <p>Use <code>-1</code> to specify all protocols.</p>\",\n                        \"smithy.api#xmlName\": \"ipProtocol\"\n                    }\n                },\n                \"FromPort\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"FromPort\",\n                        \"smithy.api#documentation\": \"<p>If the protocol is TCP or UDP, this is the start of the port range.\\n            If the protocol is ICMP or ICMPv6, this is the ICMP type or -1 (all ICMP types).</p>\",\n                        \"smithy.api#xmlName\": \"fromPort\"\n                    }\n                },\n                \"ToPort\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ToPort\",\n                        \"smithy.api#documentation\": \"<p>If the protocol is TCP or UDP, this is the end of the port range.\\n            If the protocol is ICMP or ICMPv6, this is the ICMP code or -1 (all ICMP codes). \\n            If the start port is -1 (all ICMP types), then the end port must be -1 (all ICMP codes).</p>\",\n                        \"smithy.api#xmlName\": \"toPort\"\n                    }\n                },\n                \"CidrIpv4\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CidrIpv4\",\n                        \"smithy.api#documentation\": \"<p>The IPv4 CIDR range.</p>\",\n                        \"smithy.api#xmlName\": \"cidrIpv4\"\n                    }\n                },\n                \"CidrIpv6\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CidrIpv6\",\n                        \"smithy.api#documentation\": \"<p>The IPv6 CIDR range.</p>\",\n                        \"smithy.api#xmlName\": \"cidrIpv6\"\n                    }\n                },\n                \"PrefixListId\": {\n                    \"target\": \"com.amazonaws.ec2#PrefixListResourceId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PrefixListId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the prefix list.</p>\",\n                        \"smithy.api#xmlName\": \"prefixListId\"\n                    }\n                },\n                \"ReferencedGroupInfo\": {\n                    \"target\": \"com.amazonaws.ec2#ReferencedSecurityGroup\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ReferencedGroupInfo\",\n                        \"smithy.api#documentation\": \"<p>Describes the security group that is referenced in the rule.</p>\",\n                        \"smithy.api#xmlName\": \"referencedGroupInfo\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Description\",\n                        \"smithy.api#documentation\": \"<p>The security group rule description.</p>\",\n                        \"smithy.api#xmlName\": \"description\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>The tags applied to the security group rule.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                },\n                \"SecurityGroupRuleArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SecurityGroupRuleArn\",\n                        \"smithy.api#documentation\": \"<p>The ARN of the security group rule.</p>\",\n                        \"smithy.api#xmlName\": \"securityGroupRuleArn\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a security group rule.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#SecurityGroupRuleDescription\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SecurityGroupRuleId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the security group rule.</p>\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The description of the security group rule.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the description of a security group rule.</p>\\n         <p>You can use this when you want to update the security group rule description for either an inbound or outbound rule.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#SecurityGroupRuleDescriptionList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#SecurityGroupRuleDescription\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#SecurityGroupRuleId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#SecurityGroupRuleIdList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#String\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#SecurityGroupRuleList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#SecurityGroupRule\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#SecurityGroupRuleRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"IpProtocol\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IP protocol name (<code>tcp</code>, <code>udp</code>, <code>icmp</code>,\\n                <code>icmpv6</code>) or number (see <a href=\\\"http://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml\\\">Protocol Numbers</a>). </p>\\n         <p>Use <code>-1</code> to specify all protocols.</p>\"\n                    }\n                },\n                \"FromPort\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If the protocol is TCP or UDP, this is the start of the port range.\\n            If the protocol is ICMP or ICMPv6, this is the ICMP type or -1 (all ICMP types).</p>\"\n                    }\n                },\n                \"ToPort\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If the protocol is TCP or UDP, this is the end of the port range.\\n            If the protocol is ICMP or ICMPv6, this is the ICMP code or -1 (all ICMP codes). \\n            If the start port is -1 (all ICMP types), then the end port must be -1 (all ICMP codes).</p>\"\n                    }\n                },\n                \"CidrIpv4\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IPv4 CIDR range. To specify a single IPv4 address, use the /32 prefix length. </p>\"\n                    }\n                },\n                \"CidrIpv6\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IPv6 CIDR range. To specify a single IPv6 address, use the /128 prefix length.</p>\"\n                    }\n                },\n                \"PrefixListId\": {\n                    \"target\": \"com.amazonaws.ec2#PrefixListResourceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the prefix list.</p>\"\n                    }\n                },\n                \"ReferencedGroupId\": {\n                    \"target\": \"com.amazonaws.ec2#SecurityGroupId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the security group that is referenced in the security group rule.</p>\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The description of the security group rule.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a security group rule.</p>\\n         <p>You must specify exactly one of the following parameters, based on the rule type:</p>\\n         <ul>\\n            <li>\\n               <p>CidrIpv4</p>\\n            </li>\\n            <li>\\n               <p>CidrIpv6</p>\\n            </li>\\n            <li>\\n               <p>PrefixListId</p>\\n            </li>\\n            <li>\\n               <p>ReferencedGroupId</p>\\n            </li>\\n         </ul>\\n         <note>\\n            <p>\\n                Amazon Web Services <a href=\\\"https://en.wikipedia.org/wiki/Canonicalization\\\">canonicalizes</a> IPv4 and IPv6 CIDRs. For example, if you specify 100.68.0.18/18 for the CIDR block, \\n              Amazon Web Services canonicalizes the CIDR block to 100.68.0.0/18. Any subsequent DescribeSecurityGroups and DescribeSecurityGroupRules calls will \\n              return the canonicalized form of the CIDR block. Additionally, if you attempt to add another rule with the \\n              non-canonical form of the CIDR (such as 100.68.0.18/18) and there is already a rule for the canonicalized \\n              form of the CIDR block (such as 100.68.0.0/18), the API throws an duplicate rule error.</p>\\n         </note>\\n         <p>When you modify a rule, you cannot change the rule type. For example, if the rule  \\n            uses an IPv4 address range, you must use <code>CidrIpv4</code> to specify a new IPv4 \\n            address range.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#SecurityGroupRuleUpdate\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SecurityGroupRuleId\": {\n                    \"target\": \"com.amazonaws.ec2#SecurityGroupRuleId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the security group rule.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"SecurityGroupRule\": {\n                    \"target\": \"com.amazonaws.ec2#SecurityGroupRuleRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Information about the security group rule.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes an update to a security group rule.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#SecurityGroupRuleUpdateList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#SecurityGroupRuleUpdate\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#SecurityGroupStringList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#SecurityGroupName\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"SecurityGroup\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#SecurityGroupVpcAssociation\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"GroupId\": {\n                    \"target\": \"com.amazonaws.ec2#SecurityGroupId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"GroupId\",\n                        \"smithy.api#documentation\": \"<p>The association's security group ID.</p>\",\n                        \"smithy.api#xmlName\": \"groupId\"\n                    }\n                },\n                \"VpcId\": {\n                    \"target\": \"com.amazonaws.ec2#VpcId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcId\",\n                        \"smithy.api#documentation\": \"<p>The association's VPC ID.</p>\",\n                        \"smithy.api#xmlName\": \"vpcId\"\n                    }\n                },\n                \"VpcOwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcOwnerId\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID of the owner of the VPC.</p>\",\n                        \"smithy.api#xmlName\": \"vpcOwnerId\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#SecurityGroupVpcAssociationState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The association's state.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                },\n                \"StateReason\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"StateReason\",\n                        \"smithy.api#documentation\": \"<p>The association's state reason.</p>\",\n                        \"smithy.api#xmlName\": \"stateReason\"\n                    }\n                },\n                \"GroupOwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"GroupOwnerId\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID of the owner of the security group.</p>\",\n                        \"smithy.api#xmlName\": \"groupOwnerId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A security group association with a VPC that you made with <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_AssociateSecurityGroupVpc.html\\\">AssociateSecurityGroupVpc</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#SecurityGroupVpcAssociationList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#SecurityGroupVpcAssociation\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#SecurityGroupVpcAssociationState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"associating\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"associating\"\n                    }\n                },\n                \"associated\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"associated\"\n                    }\n                },\n                \"association_failed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"association-failed\"\n                    }\n                },\n                \"disassociating\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"disassociating\"\n                    }\n                },\n                \"disassociated\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"disassociated\"\n                    }\n                },\n                \"disassociation_failed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"disassociation-failed\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#SelfServicePortal\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"enabled\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"enabled\"\n                    }\n                },\n                \"disabled\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"disabled\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#SendDiagnosticInterrupt\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#SendDiagnosticInterruptRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Sends a diagnostic interrupt to the specified Amazon EC2 instance to trigger a\\n                <i>kernel panic</i> (on Linux instances), or a <i>blue\\n                screen</i>/<i>stop error</i> (on Windows instances). For\\n            instances based on Intel and AMD processors, the interrupt is received as a\\n                <i>non-maskable interrupt</i> (NMI).</p>\\n         <p>In general, the operating system crashes and reboots when a kernel panic or stop error\\n            is triggered. The operating system can also be configured to perform diagnostic tasks,\\n            such as generating a memory dump file, loading a secondary kernel, or obtaining a call\\n            trace.</p>\\n         <p>Before sending a diagnostic interrupt to your instance, ensure that its operating\\n            system is configured to perform the required diagnostic tasks.</p>\\n         <p>For more information about configuring your operating system to generate a crash dump\\n            when a kernel panic or stop error occurs, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/diagnostic-interrupt.html\\\">Send a diagnostic interrupt\\n                (for advanced users)</a> in the <i>Amazon EC2 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#SendDiagnosticInterruptRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the instance.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the operation, without actually making the \\n  request, and provides an error response. If you have the required permissions, the error response is \\n  <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#SensitiveMacCredentials\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#sensitive\": {}\n            }\n        },\n        \"com.amazonaws.ec2#SensitiveUrl\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#sensitive\": {}\n            }\n        },\n        \"com.amazonaws.ec2#SensitiveUserData\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#sensitive\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ServiceConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ServiceType\": {\n                    \"target\": \"com.amazonaws.ec2#ServiceTypeDetailSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ServiceType\",\n                        \"smithy.api#documentation\": \"<p>The type of service.</p>\",\n                        \"smithy.api#xmlName\": \"serviceType\"\n                    }\n                },\n                \"ServiceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ServiceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the service.</p>\",\n                        \"smithy.api#xmlName\": \"serviceId\"\n                    }\n                },\n                \"ServiceName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ServiceName\",\n                        \"smithy.api#documentation\": \"<p>The name of the service.</p>\",\n                        \"smithy.api#xmlName\": \"serviceName\"\n                    }\n                },\n                \"ServiceState\": {\n                    \"target\": \"com.amazonaws.ec2#ServiceState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ServiceState\",\n                        \"smithy.api#documentation\": \"<p>The service state.</p>\",\n                        \"smithy.api#xmlName\": \"serviceState\"\n                    }\n                },\n                \"AvailabilityZoneIds\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AvailabilityZoneIdSet\",\n                        \"smithy.api#documentation\": \"<p>The IDs of the Availability Zones in which the service is available.</p>\\n         <p>Either <code>AvailabilityZone</code> or <code>AvailabilityZoneId</code> can be specified, but not both</p>\",\n                        \"smithy.api#xmlName\": \"availabilityZoneIdSet\"\n                    }\n                },\n                \"AvailabilityZones\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AvailabilityZoneSet\",\n                        \"smithy.api#documentation\": \"<p>The Availability Zones in which the service is available.</p>\\n         <p>Either <code>AvailabilityZone</code> or <code>AvailabilityZoneId</code> can be specified, but not both</p>\",\n                        \"smithy.api#xmlName\": \"availabilityZoneSet\"\n                    }\n                },\n                \"AcceptanceRequired\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AcceptanceRequired\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether requests from other Amazon Web Services accounts to create an endpoint to the service must first be accepted.</p>\",\n                        \"smithy.api#xmlName\": \"acceptanceRequired\"\n                    }\n                },\n                \"ManagesVpcEndpoints\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ManagesVpcEndpoints\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether the service manages its VPC endpoints. Management of the service VPC\\n            endpoints using the VPC endpoint API is restricted.</p>\",\n                        \"smithy.api#xmlName\": \"managesVpcEndpoints\"\n                    }\n                },\n                \"NetworkLoadBalancerArns\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkLoadBalancerArnSet\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Names (ARNs) of the Network Load Balancers for the service.</p>\",\n                        \"smithy.api#xmlName\": \"networkLoadBalancerArnSet\"\n                    }\n                },\n                \"GatewayLoadBalancerArns\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"GatewayLoadBalancerArnSet\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Names (ARNs) of the Gateway Load Balancers for the service.</p>\",\n                        \"smithy.api#xmlName\": \"gatewayLoadBalancerArnSet\"\n                    }\n                },\n                \"SupportedIpAddressTypes\": {\n                    \"target\": \"com.amazonaws.ec2#SupportedIpAddressTypes\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SupportedIpAddressTypeSet\",\n                        \"smithy.api#documentation\": \"<p>The supported IP address types.</p>\",\n                        \"smithy.api#xmlName\": \"supportedIpAddressTypeSet\"\n                    }\n                },\n                \"BaseEndpointDnsNames\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"BaseEndpointDnsNameSet\",\n                        \"smithy.api#documentation\": \"<p>The DNS names for the service.</p>\",\n                        \"smithy.api#xmlName\": \"baseEndpointDnsNameSet\"\n                    }\n                },\n                \"PrivateDnsName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PrivateDnsName\",\n                        \"smithy.api#documentation\": \"<p>The private DNS name for the service.</p>\",\n                        \"smithy.api#xmlName\": \"privateDnsName\"\n                    }\n                },\n                \"PrivateDnsNameConfiguration\": {\n                    \"target\": \"com.amazonaws.ec2#PrivateDnsNameConfiguration\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PrivateDnsNameConfiguration\",\n                        \"smithy.api#documentation\": \"<p>Information about the endpoint service private DNS name configuration.</p>\",\n                        \"smithy.api#xmlName\": \"privateDnsNameConfiguration\"\n                    }\n                },\n                \"PayerResponsibility\": {\n                    \"target\": \"com.amazonaws.ec2#PayerResponsibility\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PayerResponsibility\",\n                        \"smithy.api#documentation\": \"<p>The payer responsibility.</p>\",\n                        \"smithy.api#xmlName\": \"payerResponsibility\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>The tags assigned to the service.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                },\n                \"SupportedRegions\": {\n                    \"target\": \"com.amazonaws.ec2#SupportedRegionSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SupportedRegionSet\",\n                        \"smithy.api#documentation\": \"<p>The supported Regions.</p>\",\n                        \"smithy.api#xmlName\": \"supportedRegionSet\"\n                    }\n                },\n                \"RemoteAccessEnabled\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RemoteAccessEnabled\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether consumers can access the service from a Region other than the \\n            Region where the service is hosted.</p>\",\n                        \"smithy.api#xmlName\": \"remoteAccessEnabled\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a service configuration for a VPC endpoint service.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ServiceConfigurationSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ServiceConfiguration\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ServiceConnectivityType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ipv4\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ipv4\"\n                    }\n                },\n                \"ipv6\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ipv6\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ServiceDetail\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ServiceName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ServiceName\",\n                        \"smithy.api#documentation\": \"<p>The name of the service.</p>\",\n                        \"smithy.api#xmlName\": \"serviceName\"\n                    }\n                },\n                \"ServiceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ServiceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the endpoint service.</p>\",\n                        \"smithy.api#xmlName\": \"serviceId\"\n                    }\n                },\n                \"ServiceType\": {\n                    \"target\": \"com.amazonaws.ec2#ServiceTypeDetailSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ServiceType\",\n                        \"smithy.api#documentation\": \"<p>The type of service.</p>\",\n                        \"smithy.api#xmlName\": \"serviceType\"\n                    }\n                },\n                \"ServiceRegion\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ServiceRegion\",\n                        \"smithy.api#documentation\": \"<p>The Region where the service is hosted.</p>\",\n                        \"smithy.api#xmlName\": \"serviceRegion\"\n                    }\n                },\n                \"AvailabilityZoneIds\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AvailabilityZoneIdSet\",\n                        \"smithy.api#documentation\": \"<p>The IDs of the Availability Zones in which the service is available.</p>\\n         <p>Either <code>AvailabilityZone</code> or <code>AvailabilityZoneId</code> can be specified, but not both</p>\",\n                        \"smithy.api#xmlName\": \"availabilityZoneIdSet\"\n                    }\n                },\n                \"AvailabilityZones\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AvailabilityZoneSet\",\n                        \"smithy.api#documentation\": \"<p>The Availability Zones in which the service is available.</p>\\n         <p>Either <code>AvailabilityZone</code> or <code>AvailabilityZoneId</code> can be specified, but not both</p>\",\n                        \"smithy.api#xmlName\": \"availabilityZoneSet\"\n                    }\n                },\n                \"Owner\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Owner\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID of the service owner.</p>\",\n                        \"smithy.api#xmlName\": \"owner\"\n                    }\n                },\n                \"BaseEndpointDnsNames\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"BaseEndpointDnsNameSet\",\n                        \"smithy.api#documentation\": \"<p>The DNS names for the service.</p>\",\n                        \"smithy.api#xmlName\": \"baseEndpointDnsNameSet\"\n                    }\n                },\n                \"PrivateDnsName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PrivateDnsName\",\n                        \"smithy.api#documentation\": \"<p>The private DNS name for the service.</p>\",\n                        \"smithy.api#xmlName\": \"privateDnsName\"\n                    }\n                },\n                \"PrivateDnsNames\": {\n                    \"target\": \"com.amazonaws.ec2#PrivateDnsDetailsSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PrivateDnsNameSet\",\n                        \"smithy.api#documentation\": \"<p>The private DNS names assigned to the VPC endpoint service.</p>\",\n                        \"smithy.api#xmlName\": \"privateDnsNameSet\"\n                    }\n                },\n                \"VpcEndpointPolicySupported\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcEndpointPolicySupported\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether the service supports endpoint policies.</p>\",\n                        \"smithy.api#xmlName\": \"vpcEndpointPolicySupported\"\n                    }\n                },\n                \"AcceptanceRequired\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AcceptanceRequired\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether VPC endpoint connection requests to the service must be accepted by the service owner.</p>\",\n                        \"smithy.api#xmlName\": \"acceptanceRequired\"\n                    }\n                },\n                \"ManagesVpcEndpoints\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ManagesVpcEndpoints\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether the service manages its VPC endpoints. Management of the service VPC\\n            endpoints using the VPC endpoint API is restricted.</p>\",\n                        \"smithy.api#xmlName\": \"managesVpcEndpoints\"\n                    }\n                },\n                \"PayerResponsibility\": {\n                    \"target\": \"com.amazonaws.ec2#PayerResponsibility\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PayerResponsibility\",\n                        \"smithy.api#documentation\": \"<p>The payer responsibility.</p>\",\n                        \"smithy.api#xmlName\": \"payerResponsibility\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>The tags assigned to the service.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                },\n                \"PrivateDnsNameVerificationState\": {\n                    \"target\": \"com.amazonaws.ec2#DnsNameState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PrivateDnsNameVerificationState\",\n                        \"smithy.api#documentation\": \"<p>The verification state of the VPC endpoint service.</p>\\n         <p>Consumers of the endpoint service cannot use the private name when the state is not <code>verified</code>.</p>\",\n                        \"smithy.api#xmlName\": \"privateDnsNameVerificationState\"\n                    }\n                },\n                \"SupportedIpAddressTypes\": {\n                    \"target\": \"com.amazonaws.ec2#SupportedIpAddressTypes\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SupportedIpAddressTypeSet\",\n                        \"smithy.api#documentation\": \"<p>The supported IP address types.</p>\",\n                        \"smithy.api#xmlName\": \"supportedIpAddressTypeSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a VPC endpoint service.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ServiceDetailSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ServiceDetail\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ServiceLinkMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 5,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ServiceLinkVirtualInterface\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ServiceLinkVirtualInterfaceId\": {\n                    \"target\": \"com.amazonaws.ec2#ServiceLinkVirtualInterfaceId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ServiceLinkVirtualInterfaceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the service link virtual interface.</p>\",\n                        \"smithy.api#xmlName\": \"serviceLinkVirtualInterfaceId\"\n                    }\n                },\n                \"ServiceLinkVirtualInterfaceArn\": {\n                    \"target\": \"com.amazonaws.ec2#ResourceArn\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ServiceLinkVirtualInterfaceArn\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Number (ARN) for the service link virtual interface. </p>\",\n                        \"smithy.api#xmlName\": \"serviceLinkVirtualInterfaceArn\"\n                    }\n                },\n                \"OutpostId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OutpostId\",\n                        \"smithy.api#documentation\": \"<p>The Outpost ID for the service link virtual interface.</p>\",\n                        \"smithy.api#xmlName\": \"outpostId\"\n                    }\n                },\n                \"OutpostArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OutpostArn\",\n                        \"smithy.api#documentation\": \"<p>The Outpost Amazon Resource Number (ARN) for the service link virtual interface.</p>\",\n                        \"smithy.api#xmlName\": \"outpostArn\"\n                    }\n                },\n                \"OwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OwnerId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Amazon Web Services account that owns the service link virtual interface..</p>\",\n                        \"smithy.api#xmlName\": \"ownerId\"\n                    }\n                },\n                \"LocalAddress\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LocalAddress\",\n                        \"smithy.api#documentation\": \"<p>The IPv4 address assigned to the local gateway virtual interface on the Outpost side.</p>\",\n                        \"smithy.api#xmlName\": \"localAddress\"\n                    }\n                },\n                \"PeerAddress\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PeerAddress\",\n                        \"smithy.api#documentation\": \"<p>The IPv4 peer address for the service link virtual interface.</p>\",\n                        \"smithy.api#xmlName\": \"peerAddress\"\n                    }\n                },\n                \"PeerBgpAsn\": {\n                    \"target\": \"com.amazonaws.ec2#Long\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PeerBgpAsn\",\n                        \"smithy.api#documentation\": \"<p>The ASN for the Border Gateway Protocol (BGP) associated with the service link virtual interface.</p>\",\n                        \"smithy.api#xmlName\": \"peerBgpAsn\"\n                    }\n                },\n                \"Vlan\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Vlan\",\n                        \"smithy.api#documentation\": \"<p>The virtual local area network for the service link virtual interface.</p>\",\n                        \"smithy.api#xmlName\": \"vlan\"\n                    }\n                },\n                \"OutpostLagId\": {\n                    \"target\": \"com.amazonaws.ec2#OutpostLagId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OutpostLagId\",\n                        \"smithy.api#documentation\": \"<p>The link aggregation group (LAG) ID for the service link virtual interface.</p>\",\n                        \"smithy.api#xmlName\": \"outpostLagId\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>The tags associated with the service link virtual interface.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                },\n                \"ConfigurationState\": {\n                    \"target\": \"com.amazonaws.ec2#ServiceLinkVirtualInterfaceConfigurationState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ConfigurationState\",\n                        \"smithy.api#documentation\": \"<p>The current state of the service link virtual interface.</p>\",\n                        \"smithy.api#xmlName\": \"configurationState\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the service link virtual interfaces that establish connectivity between Amazon Web Services Outpost and on-premises networks.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ServiceLinkVirtualInterfaceConfigurationState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"pending\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"pending\"\n                    }\n                },\n                \"available\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"available\"\n                    }\n                },\n                \"deleting\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"deleting\"\n                    }\n                },\n                \"deleted\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"deleted\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ServiceLinkVirtualInterfaceId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#ServiceLinkVirtualInterfaceIdSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ServiceLinkVirtualInterfaceId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ServiceLinkVirtualInterfaceSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ServiceLinkVirtualInterface\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ServiceManaged\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"alb\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"alb\"\n                    }\n                },\n                \"nlb\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"nlb\"\n                    }\n                },\n                \"rnat\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"rnat\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ServiceNetworkArn\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#ServiceState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"Pending\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Pending\"\n                    }\n                },\n                \"Available\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Available\"\n                    }\n                },\n                \"Deleting\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Deleting\"\n                    }\n                },\n                \"Deleted\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Deleted\"\n                    }\n                },\n                \"Failed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Failed\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ServiceType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"Interface\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Interface\"\n                    }\n                },\n                \"Gateway\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Gateway\"\n                    }\n                },\n                \"GatewayLoadBalancer\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"GatewayLoadBalancer\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ServiceTypeDetail\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ServiceType\": {\n                    \"target\": \"com.amazonaws.ec2#ServiceType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ServiceType\",\n                        \"smithy.api#documentation\": \"<p>The type of service.</p>\",\n                        \"smithy.api#xmlName\": \"serviceType\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the type of service for a VPC endpoint.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ServiceTypeDetailSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ServiceTypeDetail\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ShutdownBehavior\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"stop\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"stop\"\n                    }\n                },\n                \"terminate\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"terminate\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#SlotDateTimeRangeRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"EarliestTime\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The earliest date and time, in UTC, for the Scheduled Instance to start.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"LatestTime\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The latest date and time, in UTC, for the Scheduled Instance to start. This value must be later than or equal to the earliest date and at most three months in the future.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the time period for a Scheduled Instance to start its first schedule. The time period must span less than one day.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#SlotStartTimeRangeRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"EarliestTime\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The earliest date and time, in UTC, for the Scheduled Instance to start.</p>\"\n                    }\n                },\n                \"LatestTime\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The latest date and time, in UTC, for the Scheduled Instance to start.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the time period for a Scheduled Instance to start its first schedule.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#Snapshot\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"OwnerAlias\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OwnerAlias\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services owner alias, from an Amazon-maintained list (<code>amazon</code>). This is not  \\n      the user-configured Amazon Web Services account alias set using the IAM console.</p>\",\n                        \"smithy.api#xmlName\": \"ownerAlias\"\n                    }\n                },\n                \"OutpostArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OutpostArn\",\n                        \"smithy.api#documentation\": \"<p>The ARN of the Outpost on which the snapshot is stored. For more information, see <a href=\\\"https://docs.aws.amazon.com/ebs/latest/userguide/snapshots-outposts.html\\\">Amazon EBS local snapshots on Outposts</a> in the \\n  \\t\\t<i>Amazon EBS User Guide</i>.</p>\",\n                        \"smithy.api#xmlName\": \"outpostArn\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>Any tags assigned to the snapshot.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                },\n                \"StorageTier\": {\n                    \"target\": \"com.amazonaws.ec2#StorageTier\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"StorageTier\",\n                        \"smithy.api#documentation\": \"<p>The storage tier in which the snapshot is stored. <code>standard</code> indicates \\n      that the snapshot is stored in the standard snapshot storage tier and that it is ready \\n      for use. <code>archive</code> indicates that the snapshot is currently archived and that \\n      it must be restored before it can be used.</p>\",\n                        \"smithy.api#xmlName\": \"storageTier\"\n                    }\n                },\n                \"RestoreExpiryTime\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RestoreExpiryTime\",\n                        \"smithy.api#documentation\": \"<p>Only for archived snapshots that are temporarily restored. Indicates the date and \\n      time when a temporarily restored snapshot will be automatically re-archived.</p>\",\n                        \"smithy.api#xmlName\": \"restoreExpiryTime\"\n                    }\n                },\n                \"SseType\": {\n                    \"target\": \"com.amazonaws.ec2#SSEType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SseType\",\n                        \"smithy.api#documentation\": \"<p>Reserved for future use.</p>\",\n                        \"smithy.api#xmlName\": \"sseType\"\n                    }\n                },\n                \"AvailabilityZone\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AvailabilityZone\",\n                        \"smithy.api#documentation\": \"<p>The Availability Zone or Local Zone of the snapshot. For example, <code>us-west-1a</code> \\n      (Availability Zone) or <code>us-west-2-lax-1a</code> (Local Zone).</p>\",\n                        \"smithy.api#xmlName\": \"availabilityZone\"\n                    }\n                },\n                \"TransferType\": {\n                    \"target\": \"com.amazonaws.ec2#TransferType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransferType\",\n                        \"smithy.api#documentation\": \"<note>\\n            <p>Only for snapshot copies.</p>\\n         </note>\\n         <p>Indicates whether the snapshot copy was created with a standard or time-based \\n      snapshot copy operation. Time-based snapshot copy operations complete within the \\n      completion duration specified in the request. Standard snapshot copy operations \\n      are completed on a best-effort basis.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>standard</code> - The snapshot copy was created with a standard \\n          snapshot copy operation.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>time-based</code> - The snapshot copy was created with a time-based \\n          snapshot copy operation.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"transferType\"\n                    }\n                },\n                \"CompletionDurationMinutes\": {\n                    \"target\": \"com.amazonaws.ec2#SnapshotCompletionDurationMinutesResponse\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CompletionDurationMinutes\",\n                        \"smithy.api#documentation\": \"<note>\\n            <p>Only for snapshot copies created with time-based snapshot copy operations.</p>\\n         </note>\\n         <p>The completion duration requested for the time-based snapshot copy operation.</p>\",\n                        \"smithy.api#xmlName\": \"completionDurationMinutes\"\n                    }\n                },\n                \"CompletionTime\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CompletionTime\",\n                        \"smithy.api#documentation\": \"<p>The time stamp when the snapshot was completed.</p>\",\n                        \"smithy.api#xmlName\": \"completionTime\"\n                    }\n                },\n                \"FullSnapshotSizeInBytes\": {\n                    \"target\": \"com.amazonaws.ec2#Long\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"FullSnapshotSizeInBytes\",\n                        \"smithy.api#documentation\": \"<p>The full size of the snapshot, in bytes.</p>\\n         <important>\\n            <p>This is <b>not</b> the incremental size of the snapshot. \\n        This is the full snapshot size and represents the size of all the blocks that were \\n        written to the source volume at the time the snapshot was created.</p>\\n         </important>\",\n                        \"smithy.api#xmlName\": \"fullSnapshotSizeInBytes\"\n                    }\n                },\n                \"SnapshotId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SnapshotId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the snapshot. Each snapshot receives a unique identifier when it is\\n      created.</p>\",\n                        \"smithy.api#xmlName\": \"snapshotId\"\n                    }\n                },\n                \"VolumeId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VolumeId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the volume that was used to create the snapshot. Snapshots created by a copy\\n      snapshot operation have an arbitrary volume ID that you should not use for any purpose.</p>\",\n                        \"smithy.api#xmlName\": \"volumeId\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#SnapshotState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Status\",\n                        \"smithy.api#documentation\": \"<p>The snapshot state.</p>\",\n                        \"smithy.api#xmlName\": \"status\"\n                    }\n                },\n                \"StateMessage\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"StatusMessage\",\n                        \"smithy.api#documentation\": \"<p>Encrypted Amazon EBS snapshots are copied asynchronously. If a snapshot copy operation fails\\n      (for example, if the proper KMS permissions are not obtained) this field displays error\\n      state details to help you diagnose why the error occurred. This parameter is only returned by\\n      <a>DescribeSnapshots</a>.</p>\",\n                        \"smithy.api#xmlName\": \"statusMessage\"\n                    }\n                },\n                \"StartTime\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"StartTime\",\n                        \"smithy.api#documentation\": \"<p>The time stamp when the snapshot was initiated.</p>\",\n                        \"smithy.api#xmlName\": \"startTime\"\n                    }\n                },\n                \"Progress\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Progress\",\n                        \"smithy.api#documentation\": \"<p>The progress of the snapshot, as a percentage.</p>\",\n                        \"smithy.api#xmlName\": \"progress\"\n                    }\n                },\n                \"OwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OwnerId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Amazon Web Services account that owns the EBS snapshot.</p>\",\n                        \"smithy.api#xmlName\": \"ownerId\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Description\",\n                        \"smithy.api#documentation\": \"<p>The description for the snapshot.</p>\",\n                        \"smithy.api#xmlName\": \"description\"\n                    }\n                },\n                \"VolumeSize\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VolumeSize\",\n                        \"smithy.api#documentation\": \"<p>The size of the volume, in GiB.</p>\",\n                        \"smithy.api#xmlName\": \"volumeSize\"\n                    }\n                },\n                \"Encrypted\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Encrypted\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether the snapshot is encrypted.</p>\",\n                        \"smithy.api#xmlName\": \"encrypted\"\n                    }\n                },\n                \"KmsKeyId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"KmsKeyId\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the KMS key that was used to protect the\\n      volume encryption key for the parent volume.</p>\",\n                        \"smithy.api#xmlName\": \"kmsKeyId\"\n                    }\n                },\n                \"DataEncryptionKeyId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DataEncryptionKeyId\",\n                        \"smithy.api#documentation\": \"<p>The data encryption key identifier for the snapshot. This value is a unique identifier\\n      that corresponds to the data encryption key that was used to encrypt the original volume or\\n      snapshot copy. Because data encryption keys are inherited by volumes created from snapshots,\\n      and vice versa, if snapshots share the same data encryption key identifier, then they belong\\n      to the same volume/snapshot lineage. This parameter is only returned by <a>DescribeSnapshots</a>.</p>\",\n                        \"smithy.api#xmlName\": \"dataEncryptionKeyId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a snapshot.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#SnapshotAttributeName\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"productCodes\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"productCodes\"\n                    }\n                },\n                \"createVolumePermission\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"createVolumePermission\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#SnapshotBlockPublicAccessState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"block_all_sharing\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"block-all-sharing\"\n                    }\n                },\n                \"block_new_sharing\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"block-new-sharing\"\n                    }\n                },\n                \"unblocked\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"unblocked\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#SnapshotCompletionDurationMinutesRequest\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 2880\n                }\n            }\n        },\n        \"com.amazonaws.ec2#SnapshotCompletionDurationMinutesResponse\": {\n            \"type\": \"integer\"\n        },\n        \"com.amazonaws.ec2#SnapshotDetail\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Description\",\n                        \"smithy.api#documentation\": \"<p>A description for the snapshot.</p>\",\n                        \"smithy.api#xmlName\": \"description\"\n                    }\n                },\n                \"DeviceName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DeviceName\",\n                        \"smithy.api#documentation\": \"<p>The block device mapping for the snapshot.</p>\",\n                        \"smithy.api#xmlName\": \"deviceName\"\n                    }\n                },\n                \"DiskImageSize\": {\n                    \"target\": \"com.amazonaws.ec2#Double\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DiskImageSize\",\n                        \"smithy.api#documentation\": \"<p>The size of the disk in the snapshot, in GiB.</p>\",\n                        \"smithy.api#xmlName\": \"diskImageSize\"\n                    }\n                },\n                \"Format\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Format\",\n                        \"smithy.api#documentation\": \"<p>The format of the disk image from which the snapshot is created.</p>\",\n                        \"smithy.api#xmlName\": \"format\"\n                    }\n                },\n                \"Progress\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Progress\",\n                        \"smithy.api#documentation\": \"<p>The percentage of progress for the task.</p>\",\n                        \"smithy.api#xmlName\": \"progress\"\n                    }\n                },\n                \"SnapshotId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SnapshotId\",\n                        \"smithy.api#documentation\": \"<p>The snapshot ID of the disk being imported.</p>\",\n                        \"smithy.api#xmlName\": \"snapshotId\"\n                    }\n                },\n                \"Status\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Status\",\n                        \"smithy.api#documentation\": \"<p>A brief status of the snapshot creation.</p>\",\n                        \"smithy.api#xmlName\": \"status\"\n                    }\n                },\n                \"StatusMessage\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"StatusMessage\",\n                        \"smithy.api#documentation\": \"<p>A detailed status message for the snapshot creation.</p>\",\n                        \"smithy.api#xmlName\": \"statusMessage\"\n                    }\n                },\n                \"Url\": {\n                    \"target\": \"com.amazonaws.ec2#SensitiveUrl\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Url\",\n                        \"smithy.api#documentation\": \"<p>The URL used to access the disk image.</p>\",\n                        \"smithy.api#xmlName\": \"url\"\n                    }\n                },\n                \"UserBucket\": {\n                    \"target\": \"com.amazonaws.ec2#UserBucketDetails\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"UserBucket\",\n                        \"smithy.api#documentation\": \"<p>The Amazon S3 bucket for the disk image.</p>\",\n                        \"smithy.api#xmlName\": \"userBucket\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the snapshot created from the imported disk.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#SnapshotDetailList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#SnapshotDetail\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#SnapshotDiskContainer\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The description of the disk image being imported.</p>\"\n                    }\n                },\n                \"Format\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The format of the disk image being imported.</p>\\n         <p>Valid values: <code>VHD</code> | <code>VMDK</code> | <code>RAW</code>\\n         </p>\"\n                    }\n                },\n                \"Url\": {\n                    \"target\": \"com.amazonaws.ec2#SensitiveUrl\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The URL to the Amazon S3-based disk image being imported. It can either be a https URL (https://..) or an Amazon\\n   S3 URL (s3://..).</p>\"\n                    }\n                },\n                \"UserBucket\": {\n                    \"target\": \"com.amazonaws.ec2#UserBucket\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon S3 bucket for the disk image.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The disk container object for the import snapshot request.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#SnapshotId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#SnapshotIdStringList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#SnapshotId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"SnapshotId\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#SnapshotInfo\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Description\",\n                        \"smithy.api#documentation\": \"<p>Description specified by the CreateSnapshotRequest that has been applied to all \\n    snapshots.</p>\",\n                        \"smithy.api#xmlName\": \"description\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>Tags associated with this snapshot.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                },\n                \"Encrypted\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Encrypted\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether the snapshot is encrypted.</p>\",\n                        \"smithy.api#xmlName\": \"encrypted\"\n                    }\n                },\n                \"VolumeId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VolumeId\",\n                        \"smithy.api#documentation\": \"<p>Source volume from which this snapshot was created.</p>\",\n                        \"smithy.api#xmlName\": \"volumeId\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#SnapshotState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>Current state of the snapshot.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                },\n                \"VolumeSize\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VolumeSize\",\n                        \"smithy.api#documentation\": \"<p>Size of the volume from which this snapshot was created.</p>\",\n                        \"smithy.api#xmlName\": \"volumeSize\"\n                    }\n                },\n                \"StartTime\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"StartTime\",\n                        \"smithy.api#documentation\": \"<p>Time this snapshot was started. This is the same for all snapshots initiated by the\\n    same request.</p>\",\n                        \"smithy.api#xmlName\": \"startTime\"\n                    }\n                },\n                \"Progress\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Progress\",\n                        \"smithy.api#documentation\": \"<p>Progress this snapshot has made towards completing.</p>\",\n                        \"smithy.api#xmlName\": \"progress\"\n                    }\n                },\n                \"OwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OwnerId\",\n                        \"smithy.api#documentation\": \"<p>Account id used when creating this snapshot.</p>\",\n                        \"smithy.api#xmlName\": \"ownerId\"\n                    }\n                },\n                \"SnapshotId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SnapshotId\",\n                        \"smithy.api#documentation\": \"<p>Snapshot id that can be used to describe this snapshot.</p>\",\n                        \"smithy.api#xmlName\": \"snapshotId\"\n                    }\n                },\n                \"OutpostArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OutpostArn\",\n                        \"smithy.api#documentation\": \"<p>The ARN of the Outpost on which the snapshot is stored. For more information, see <a href=\\\"https://docs.aws.amazon.com/ebs/latest/userguide/snapshots-outposts.html\\\">Amazon EBS local snapshots on Outposts</a> in the \\n  \\t\\t<i>Amazon EBS User Guide</i>.</p>\",\n                        \"smithy.api#xmlName\": \"outpostArn\"\n                    }\n                },\n                \"SseType\": {\n                    \"target\": \"com.amazonaws.ec2#SSEType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SseType\",\n                        \"smithy.api#documentation\": \"<p>Reserved for future use.</p>\",\n                        \"smithy.api#xmlName\": \"sseType\"\n                    }\n                },\n                \"AvailabilityZone\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AvailabilityZone\",\n                        \"smithy.api#documentation\": \"<p>The Availability Zone or Local Zone of the snapshots. For example, <code>us-west-1a</code> \\n      (Availability Zone) or <code>us-west-2-lax-1a</code> (Local Zone).</p>\",\n                        \"smithy.api#xmlName\": \"availabilityZone\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about a snapshot.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#SnapshotList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#Snapshot\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#SnapshotLocationEnum\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"REGIONAL\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"regional\"\n                    }\n                },\n                \"LOCAL\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"local\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#SnapshotRecycleBinInfo\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SnapshotId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SnapshotId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the snapshot.</p>\",\n                        \"smithy.api#xmlName\": \"snapshotId\"\n                    }\n                },\n                \"RecycleBinEnterTime\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RecycleBinEnterTime\",\n                        \"smithy.api#documentation\": \"<p>The date and time when the snapshot entered the Recycle Bin.</p>\",\n                        \"smithy.api#xmlName\": \"recycleBinEnterTime\"\n                    }\n                },\n                \"RecycleBinExitTime\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RecycleBinExitTime\",\n                        \"smithy.api#documentation\": \"<p>The date and time when the snapshot is to be permanently deleted from the Recycle Bin.</p>\",\n                        \"smithy.api#xmlName\": \"recycleBinExitTime\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Description\",\n                        \"smithy.api#documentation\": \"<p>The description for the snapshot.</p>\",\n                        \"smithy.api#xmlName\": \"description\"\n                    }\n                },\n                \"VolumeId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VolumeId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the volume from which the snapshot was created.</p>\",\n                        \"smithy.api#xmlName\": \"volumeId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about a snapshot that is currently in the Recycle Bin.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#SnapshotRecycleBinInfoList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#SnapshotRecycleBinInfo\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#SnapshotReturnCodes\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"SUCCESS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"success\"\n                    }\n                },\n                \"WARN_SKIPPED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"skipped\"\n                    }\n                },\n                \"ERROR_MISSING_PERMISSIONS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"missing-permissions\"\n                    }\n                },\n                \"ERROR_CODE_INTERNAL_ERROR\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"internal-error\"\n                    }\n                },\n                \"ERROR_CODE_CLIENT_ERROR\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"client-error\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#SnapshotSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#SnapshotInfo\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#SnapshotState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"pending\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"pending\"\n                    }\n                },\n                \"completed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"completed\"\n                    }\n                },\n                \"error\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"error\"\n                    }\n                },\n                \"recoverable\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"recoverable\"\n                    }\n                },\n                \"recovering\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"recovering\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#SnapshotTaskDetail\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Description\",\n                        \"smithy.api#documentation\": \"<p>The description of the disk image being imported.</p>\",\n                        \"smithy.api#xmlName\": \"description\"\n                    }\n                },\n                \"DiskImageSize\": {\n                    \"target\": \"com.amazonaws.ec2#Double\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DiskImageSize\",\n                        \"smithy.api#documentation\": \"<p>The size of the disk in the snapshot, in GiB.</p>\",\n                        \"smithy.api#xmlName\": \"diskImageSize\"\n                    }\n                },\n                \"Encrypted\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Encrypted\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether the snapshot is encrypted.</p>\",\n                        \"smithy.api#xmlName\": \"encrypted\"\n                    }\n                },\n                \"Format\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Format\",\n                        \"smithy.api#documentation\": \"<p>The format of the disk image from which the snapshot is created.</p>\",\n                        \"smithy.api#xmlName\": \"format\"\n                    }\n                },\n                \"KmsKeyId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"KmsKeyId\",\n                        \"smithy.api#documentation\": \"<p>The identifier for the KMS key that was used to create the encrypted snapshot.</p>\",\n                        \"smithy.api#xmlName\": \"kmsKeyId\"\n                    }\n                },\n                \"Progress\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Progress\",\n                        \"smithy.api#documentation\": \"<p>The percentage of completion for the import snapshot task.</p>\",\n                        \"smithy.api#xmlName\": \"progress\"\n                    }\n                },\n                \"SnapshotId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SnapshotId\",\n                        \"smithy.api#documentation\": \"<p>The snapshot ID of the disk being imported.</p>\",\n                        \"smithy.api#xmlName\": \"snapshotId\"\n                    }\n                },\n                \"Status\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Status\",\n                        \"smithy.api#documentation\": \"<p>A brief status for the import snapshot task.</p>\",\n                        \"smithy.api#xmlName\": \"status\"\n                    }\n                },\n                \"StatusMessage\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"StatusMessage\",\n                        \"smithy.api#documentation\": \"<p>A detailed status message for the import snapshot task.</p>\",\n                        \"smithy.api#xmlName\": \"statusMessage\"\n                    }\n                },\n                \"Url\": {\n                    \"target\": \"com.amazonaws.ec2#SensitiveUrl\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Url\",\n                        \"smithy.api#documentation\": \"<p>The URL of the disk image from which the snapshot is created.</p>\",\n                        \"smithy.api#xmlName\": \"url\"\n                    }\n                },\n                \"UserBucket\": {\n                    \"target\": \"com.amazonaws.ec2#UserBucketDetails\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"UserBucket\",\n                        \"smithy.api#documentation\": \"<p>The Amazon S3 bucket for the disk image.</p>\",\n                        \"smithy.api#xmlName\": \"userBucket\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Details about the import snapshot task.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#SnapshotTierStatus\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SnapshotId\": {\n                    \"target\": \"com.amazonaws.ec2#SnapshotId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SnapshotId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the snapshot.</p>\",\n                        \"smithy.api#xmlName\": \"snapshotId\"\n                    }\n                },\n                \"VolumeId\": {\n                    \"target\": \"com.amazonaws.ec2#VolumeId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VolumeId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the volume from which the snapshot was created.</p>\",\n                        \"smithy.api#xmlName\": \"volumeId\"\n                    }\n                },\n                \"Status\": {\n                    \"target\": \"com.amazonaws.ec2#SnapshotState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Status\",\n                        \"smithy.api#documentation\": \"<p>The state of the snapshot.</p>\",\n                        \"smithy.api#xmlName\": \"status\"\n                    }\n                },\n                \"OwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OwnerId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Amazon Web Services account that owns the snapshot.</p>\",\n                        \"smithy.api#xmlName\": \"ownerId\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>The tags that are assigned to the snapshot.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                },\n                \"StorageTier\": {\n                    \"target\": \"com.amazonaws.ec2#StorageTier\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"StorageTier\",\n                        \"smithy.api#documentation\": \"<p>The storage tier in which the snapshot is stored. <code>standard</code> indicates \\n      that the snapshot is stored in the standard snapshot storage tier and that it is ready \\n      for use. <code>archive</code> indicates that the snapshot is currently archived and that \\n      it must be restored before it can be used.</p>\",\n                        \"smithy.api#xmlName\": \"storageTier\"\n                    }\n                },\n                \"LastTieringStartTime\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LastTieringStartTime\",\n                        \"smithy.api#documentation\": \"<p>The date and time when the last archive or restore process was started.</p>\",\n                        \"smithy.api#xmlName\": \"lastTieringStartTime\"\n                    }\n                },\n                \"LastTieringProgress\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LastTieringProgress\",\n                        \"smithy.api#documentation\": \"<p>The progress of the last archive or restore process, as a percentage.</p>\",\n                        \"smithy.api#xmlName\": \"lastTieringProgress\"\n                    }\n                },\n                \"LastTieringOperationStatus\": {\n                    \"target\": \"com.amazonaws.ec2#TieringOperationStatus\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LastTieringOperationStatus\",\n                        \"smithy.api#documentation\": \"<p>The status of the last archive or restore process.</p>\",\n                        \"smithy.api#xmlName\": \"lastTieringOperationStatus\"\n                    }\n                },\n                \"LastTieringOperationStatusDetail\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LastTieringOperationStatusDetail\",\n                        \"smithy.api#documentation\": \"<p>A message describing the status of the last archive or restore process.</p>\",\n                        \"smithy.api#xmlName\": \"lastTieringOperationStatusDetail\"\n                    }\n                },\n                \"ArchivalCompleteTime\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ArchivalCompleteTime\",\n                        \"smithy.api#documentation\": \"<p>The date and time when the last archive process was completed.</p>\",\n                        \"smithy.api#xmlName\": \"archivalCompleteTime\"\n                    }\n                },\n                \"RestoreExpiryTime\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RestoreExpiryTime\",\n                        \"smithy.api#documentation\": \"<p>Only for archived snapshots that are temporarily restored. Indicates the date and \\n      time when a temporarily restored snapshot will be automatically re-archived.</p>\",\n                        \"smithy.api#xmlName\": \"restoreExpiryTime\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Provides information about a snapshot's storage tier.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#SpotAllocationStrategy\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"LOWEST_PRICE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"lowest-price\"\n                    }\n                },\n                \"DIVERSIFIED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"diversified\"\n                    }\n                },\n                \"CAPACITY_OPTIMIZED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"capacity-optimized\"\n                    }\n                },\n                \"CAPACITY_OPTIMIZED_PRIORITIZED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"capacity-optimized-prioritized\"\n                    }\n                },\n                \"PRICE_CAPACITY_OPTIMIZED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"price-capacity-optimized\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#SpotCapacityRebalance\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ReplacementStrategy\": {\n                    \"target\": \"com.amazonaws.ec2#ReplacementStrategy\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ReplacementStrategy\",\n                        \"smithy.api#documentation\": \"<p>The replacement strategy to use. Only available for fleets of type\\n            <code>maintain</code>.</p>\\n         <p>\\n            <code>launch</code> - Spot Fleet launches a new replacement Spot Instance when a\\n            rebalance notification is emitted for an existing Spot Instance in the fleet. Spot Fleet\\n            does not terminate the instances that receive a rebalance notification. You can\\n            terminate the old instances, or you can leave them running. You are charged for all\\n            instances while they are running. </p>\\n         <p>\\n            <code>launch-before-terminate</code> - Spot Fleet launches a new replacement Spot\\n            Instance when a rebalance notification is emitted for an existing Spot Instance in the\\n            fleet, and then, after a delay that you specify (in <code>TerminationDelay</code>),\\n            terminates the instances that received a rebalance notification.</p>\",\n                        \"smithy.api#xmlName\": \"replacementStrategy\"\n                    }\n                },\n                \"TerminationDelay\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TerminationDelay\",\n                        \"smithy.api#documentation\": \"<p>The amount of time (in seconds) that Amazon EC2 waits before terminating the old Spot\\n            Instance after launching a new replacement Spot Instance.</p>\\n         <p>Required when <code>ReplacementStrategy</code> is set to <code>launch-before-terminate</code>.</p>\\n         <p>Not valid when <code>ReplacementStrategy</code> is set to <code>launch</code>.</p>\\n         <p>Valid values: Minimum value of <code>120</code> seconds. Maximum value of <code>7200</code> seconds.</p>\",\n                        \"smithy.api#xmlName\": \"terminationDelay\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The Spot Instance replacement strategy to use when Amazon EC2 emits a signal that your\\n            Spot Instance is at an elevated risk of being interrupted. For more information, see\\n                <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-fleet-capacity-rebalance.html\\\">Capacity\\n                rebalancing</a> in the <i>Amazon EC2 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#SpotDatafeedSubscription\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Bucket\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Bucket\",\n                        \"smithy.api#documentation\": \"<p>The name of the Amazon S3 bucket where the Spot Instance data feed is located.</p>\",\n                        \"smithy.api#xmlName\": \"bucket\"\n                    }\n                },\n                \"Fault\": {\n                    \"target\": \"com.amazonaws.ec2#SpotInstanceStateFault\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Fault\",\n                        \"smithy.api#documentation\": \"<p>The fault codes for the Spot Instance request, if any.</p>\",\n                        \"smithy.api#xmlName\": \"fault\"\n                    }\n                },\n                \"OwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OwnerId\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID of the account.</p>\",\n                        \"smithy.api#xmlName\": \"ownerId\"\n                    }\n                },\n                \"Prefix\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Prefix\",\n                        \"smithy.api#documentation\": \"<p>The prefix for the data feed files.</p>\",\n                        \"smithy.api#xmlName\": \"prefix\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#DatafeedSubscriptionState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The state of the Spot Instance data feed subscription.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the data feed for a Spot Instance.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#SpotFleetLaunchSpecification\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AddressingType\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AddressingType\",\n                        \"smithy.api#documentation\": \"<p>Deprecated.</p>\",\n                        \"smithy.api#xmlName\": \"addressingType\"\n                    }\n                },\n                \"BlockDeviceMappings\": {\n                    \"target\": \"com.amazonaws.ec2#BlockDeviceMappingList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"BlockDeviceMapping\",\n                        \"smithy.api#documentation\": \"<p>One or more block devices that are mapped to the Spot Instances. You can't specify both\\n            a snapshot ID and an encryption value. This is because only blank volumes can be\\n            encrypted on creation. If a snapshot is the basis for a volume, it is not blank and its\\n            encryption status is used for the volume encryption status.</p>\",\n                        \"smithy.api#xmlName\": \"blockDeviceMapping\"\n                    }\n                },\n                \"EbsOptimized\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EbsOptimized\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether the instances are optimized for EBS I/O. This optimization provides dedicated throughput to Amazon EBS and an optimized configuration stack to provide optimal EBS I/O performance. This optimization isn't available with all instance types. Additional usage charges apply when using an EBS Optimized instance.</p>\\n         <p>Default: <code>false</code>\\n         </p>\",\n                        \"smithy.api#xmlName\": \"ebsOptimized\"\n                    }\n                },\n                \"IamInstanceProfile\": {\n                    \"target\": \"com.amazonaws.ec2#IamInstanceProfileSpecification\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IamInstanceProfile\",\n                        \"smithy.api#documentation\": \"<p>The IAM instance profile.</p>\",\n                        \"smithy.api#xmlName\": \"iamInstanceProfile\"\n                    }\n                },\n                \"ImageId\": {\n                    \"target\": \"com.amazonaws.ec2#ImageId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ImageId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the AMI.</p>\",\n                        \"smithy.api#xmlName\": \"imageId\"\n                    }\n                },\n                \"InstanceType\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceType\",\n                        \"smithy.api#documentation\": \"<p>The instance type.</p>\",\n                        \"smithy.api#xmlName\": \"instanceType\"\n                    }\n                },\n                \"KernelId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"KernelId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the kernel.</p>\",\n                        \"smithy.api#xmlName\": \"kernelId\"\n                    }\n                },\n                \"KeyName\": {\n                    \"target\": \"com.amazonaws.ec2#KeyPairName\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"KeyName\",\n                        \"smithy.api#documentation\": \"<p>The name of the key pair.</p>\",\n                        \"smithy.api#xmlName\": \"keyName\"\n                    }\n                },\n                \"Monitoring\": {\n                    \"target\": \"com.amazonaws.ec2#SpotFleetMonitoring\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Monitoring\",\n                        \"smithy.api#documentation\": \"<p>Enable or disable monitoring for the instances.</p>\",\n                        \"smithy.api#xmlName\": \"monitoring\"\n                    }\n                },\n                \"NetworkInterfaces\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceNetworkInterfaceSpecificationList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkInterfaceSet\",\n                        \"smithy.api#documentation\": \"<p>The network interfaces.</p>\\n         <note>\\n            <p>\\n               <code>SpotFleetLaunchSpecification</code> does not support Elastic Fabric Adapter (EFA). \\n             You must use <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_LaunchTemplateConfig.html\\\">LaunchTemplateConfig</a> instead.</p>\\n         </note>\",\n                        \"smithy.api#xmlName\": \"networkInterfaceSet\"\n                    }\n                },\n                \"Placement\": {\n                    \"target\": \"com.amazonaws.ec2#SpotPlacement\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Placement\",\n                        \"smithy.api#documentation\": \"<p>The placement information.</p>\",\n                        \"smithy.api#xmlName\": \"placement\"\n                    }\n                },\n                \"RamdiskId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RamdiskId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the RAM disk. Some kernels require additional drivers at launch. Check the kernel \\n          requirements for information about whether you need to specify a RAM disk. To find kernel \\n          requirements, refer to the Amazon Web Services Resource Center and search for the kernel ID.</p>\",\n                        \"smithy.api#xmlName\": \"ramdiskId\"\n                    }\n                },\n                \"SpotPrice\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SpotPrice\",\n                        \"smithy.api#documentation\": \"<p>The maximum price per unit hour that you are willing to pay for a Spot Instance. We do not recommend using this parameter because it can lead to \\n          increased interruptions. If you do not specify this parameter, you will pay the current Spot price.</p>\\n         <important>\\n            <p>If you specify a maximum price, your instances will be interrupted more frequently than if you do not specify this parameter.</p>\\n         </important>\",\n                        \"smithy.api#xmlName\": \"spotPrice\"\n                    }\n                },\n                \"SubnetId\": {\n                    \"target\": \"com.amazonaws.ec2#SubnetId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SubnetId\",\n                        \"smithy.api#documentation\": \"<p>The IDs of the subnets in which to launch the instances. To specify multiple subnets, separate\\n         them using commas; for example, \\\"subnet-1234abcdeexample1, subnet-0987cdef6example2\\\".</p>\\n         <p>If you specify a network interface, you must specify any subnets as part of the\\n         network interface instead of using this parameter.</p>\",\n                        \"smithy.api#xmlName\": \"subnetId\"\n                    }\n                },\n                \"UserData\": {\n                    \"target\": \"com.amazonaws.ec2#SensitiveUserData\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"UserData\",\n                        \"smithy.api#documentation\": \"<p>The base64-encoded user data that instances use when starting up. User data is limited to 16 KB.</p>\",\n                        \"smithy.api#xmlName\": \"userData\"\n                    }\n                },\n                \"WeightedCapacity\": {\n                    \"target\": \"com.amazonaws.ec2#Double\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"WeightedCapacity\",\n                        \"smithy.api#documentation\": \"<p>The number of units provided by the specified instance type. These are the same units\\n        that you chose to set the target capacity in terms of instances, or a performance\\n        characteristic such as vCPUs, memory, or I/O.</p>\\n         <p>If the target capacity divided by this value is not a whole number, Amazon EC2 rounds the\\n        number of instances to the next whole number. If this value is not specified, the default\\n        is 1.</p>\\n         <note>\\n            <p>When specifying weights, the price used in the <code>lowestPrice</code> and\\n           <code>priceCapacityOptimized</code> allocation strategies is per\\n           <i>unit</i> hour (where the instance price is divided by the specified\\n           weight). However, if all the specified weights are above the requested\\n           <code>TargetCapacity</code>, resulting in only 1 instance being launched, the price\\n           used is per <i>instance</i> hour.</p>\\n         </note>\",\n                        \"smithy.api#xmlName\": \"weightedCapacity\"\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#SpotFleetTagSpecificationList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSpecificationSet\",\n                        \"smithy.api#documentation\": \"<p>The tags to apply during creation.</p>\",\n                        \"smithy.api#xmlName\": \"tagSpecificationSet\"\n                    }\n                },\n                \"InstanceRequirements\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceRequirements\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceRequirements\",\n                        \"smithy.api#documentation\": \"<p>The attributes for the instance types. When you specify instance attributes, Amazon EC2 will\\n         identify instance types with those attributes.</p>\\n         <note>\\n            <p>If you specify <code>InstanceRequirements</code>, you can't specify\\n            <code>InstanceType</code>.</p>\\n         </note>\",\n                        \"smithy.api#xmlName\": \"instanceRequirements\"\n                    }\n                },\n                \"SecurityGroups\": {\n                    \"target\": \"com.amazonaws.ec2#GroupIdentifierList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"GroupSet\",\n                        \"smithy.api#documentation\": \"<p>The security groups.</p>\\n         <p>If you specify a network interface, you must specify any security groups as part of\\n        the network interface instead of using this parameter.</p>\",\n                        \"smithy.api#xmlName\": \"groupSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the launch specification for one or more Spot Instances. If you include\\n          On-Demand capacity in your fleet request or want to specify an EFA network device, you\\n          can't use <code>SpotFleetLaunchSpecification</code>; you must use <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_LaunchTemplateConfig.html\\\">LaunchTemplateConfig</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#SpotFleetMonitoring\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Enabled\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Enabled\",\n                        \"smithy.api#documentation\": \"<p>Enables monitoring for the instance.</p>\\n         <p>Default: <code>false</code>\\n         </p>\",\n                        \"smithy.api#xmlName\": \"enabled\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes whether monitoring is enabled.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#SpotFleetRequestConfig\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ActivityStatus\": {\n                    \"target\": \"com.amazonaws.ec2#ActivityStatus\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ActivityStatus\",\n                        \"smithy.api#documentation\": \"<p>The progress of the Spot Fleet request. \\n          If there is an error, the status is <code>error</code>.\\n          After all requests are placed, the status is <code>pending_fulfillment</code>.\\n          If the size of the fleet is equal to or greater than its target capacity, the status is <code>fulfilled</code>.\\n          If the size of the fleet is decreased, the status is <code>pending_termination</code>\\n          while Spot Instances are terminating.</p>\",\n                        \"smithy.api#xmlName\": \"activityStatus\"\n                    }\n                },\n                \"CreateTime\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CreateTime\",\n                        \"smithy.api#documentation\": \"<p>The creation date and time of the request.</p>\",\n                        \"smithy.api#xmlName\": \"createTime\"\n                    }\n                },\n                \"SpotFleetRequestConfig\": {\n                    \"target\": \"com.amazonaws.ec2#SpotFleetRequestConfigData\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SpotFleetRequestConfig\",\n                        \"smithy.api#documentation\": \"<p>The configuration of the Spot Fleet request.</p>\",\n                        \"smithy.api#xmlName\": \"spotFleetRequestConfig\"\n                    }\n                },\n                \"SpotFleetRequestId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SpotFleetRequestId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Spot Fleet request.</p>\",\n                        \"smithy.api#xmlName\": \"spotFleetRequestId\"\n                    }\n                },\n                \"SpotFleetRequestState\": {\n                    \"target\": \"com.amazonaws.ec2#BatchState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SpotFleetRequestState\",\n                        \"smithy.api#documentation\": \"<p>The state of the Spot Fleet request.</p>\",\n                        \"smithy.api#xmlName\": \"spotFleetRequestState\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>The tags for a Spot Fleet resource.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a Spot Fleet request.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#SpotFleetRequestConfigData\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AllocationStrategy\": {\n                    \"target\": \"com.amazonaws.ec2#AllocationStrategy\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AllocationStrategy\",\n                        \"smithy.api#documentation\": \"<p>The strategy that determines how to allocate the target Spot Instance capacity across the Spot Instance\\n            pools specified by the Spot Fleet launch configuration. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-fleet-allocation-strategy.html\\\">Allocation\\n                strategies for Spot Instances</a> in the <i>Amazon EC2 User Guide</i>.</p>\\n         <dl>\\n            <dt>priceCapacityOptimized (recommended)</dt>\\n            <dd>\\n               <p>Spot Fleet identifies the pools with  \\n                   the highest capacity availability for the number of instances that are launching. This means \\n                   that we will request Spot Instances from the pools that we believe have the lowest chance of interruption \\n                   in the near term. Spot Fleet then requests Spot Instances from the lowest priced of these pools.</p>\\n            </dd>\\n            <dt>capacityOptimized</dt>\\n            <dd>\\n               <p>Spot Fleet identifies the pools with  \\n                   the highest capacity availability for the number of instances that are launching. This means \\n                   that we will request Spot Instances from the pools that we believe have the lowest chance of interruption \\n                   in the near term. To give certain\\n          instance types a higher chance of launching first, use\\n          <code>capacityOptimizedPrioritized</code>. Set a priority for each instance type by\\n          using the <code>Priority</code> parameter for <code>LaunchTemplateOverrides</code>. You can\\n          assign the same priority to different <code>LaunchTemplateOverrides</code>. EC2 implements\\n          the priorities on a best-effort basis, but optimizes for capacity first.\\n          <code>capacityOptimizedPrioritized</code> is supported only if your Spot Fleet uses a\\n          launch template. Note that if the <code>OnDemandAllocationStrategy</code> is set to\\n          <code>prioritized</code>, the same priority is applied when fulfilling On-Demand\\n          capacity.</p>\\n            </dd>\\n            <dt>diversified</dt>\\n            <dd>\\n               <p>Spot Fleet requests instances from all of the Spot Instance pools that you\\n          specify.</p>\\n            </dd>\\n            <dt>lowestPrice (not recommended)</dt>\\n            <dd>\\n               <important>\\n                  <p>We don't recommend the <code>lowestPrice</code> allocation strategy because\\n                     it has the highest risk of interruption for your Spot Instances.</p>\\n               </important>\\n               <p>Spot Fleet requests instances from the lowest priced Spot Instance pool that has available\\n                  capacity. If the lowest priced pool doesn't have available capacity, the Spot Instances\\n                  come from the next lowest priced pool that has available capacity. If a pool runs\\n                  out of capacity before fulfilling your desired capacity, Spot Fleet will continue to\\n                  fulfill your request by drawing from the next lowest priced pool. To ensure that\\n                  your desired capacity is met, you might receive Spot Instances from several pools. Because\\n                  this strategy only considers instance price and not capacity availability, it\\n                  might lead to high interruption rates.</p>\\n            </dd>\\n         </dl>\\n         <p>Default: <code>lowestPrice</code>\\n         </p>\",\n                        \"smithy.api#xmlName\": \"allocationStrategy\"\n                    }\n                },\n                \"OnDemandAllocationStrategy\": {\n                    \"target\": \"com.amazonaws.ec2#OnDemandAllocationStrategy\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OnDemandAllocationStrategy\",\n                        \"smithy.api#documentation\": \"<p>The order of the launch template overrides to use in fulfilling On-Demand capacity. If\\n            you specify <code>lowestPrice</code>, Spot Fleet uses price to determine the order, launching\\n            the lowest price first. If you specify <code>prioritized</code>, Spot Fleet uses the priority\\n            that you assign to each Spot Fleet launch template override, launching the highest priority\\n            first. If you do not specify a value, Spot Fleet defaults to <code>lowestPrice</code>.</p>\",\n                        \"smithy.api#xmlName\": \"onDemandAllocationStrategy\"\n                    }\n                },\n                \"SpotMaintenanceStrategies\": {\n                    \"target\": \"com.amazonaws.ec2#SpotMaintenanceStrategies\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SpotMaintenanceStrategies\",\n                        \"smithy.api#documentation\": \"<p>The strategies for managing your Spot Instances that are at an elevated risk of being\\n            interrupted.</p>\",\n                        \"smithy.api#xmlName\": \"spotMaintenanceStrategies\"\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ClientToken\",\n                        \"smithy.api#documentation\": \"<p>A unique, case-sensitive identifier that you provide to ensure the idempotency of your\\n            listings. This helps to avoid duplicate listings. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/Run_Instance_Idempotency.html\\\">Ensuring Idempotency</a>.</p>\",\n                        \"smithy.api#xmlName\": \"clientToken\"\n                    }\n                },\n                \"ExcessCapacityTerminationPolicy\": {\n                    \"target\": \"com.amazonaws.ec2#ExcessCapacityTerminationPolicy\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ExcessCapacityTerminationPolicy\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether running instances should be terminated if you decrease the\\n            target capacity of the Spot Fleet request below the current size of the Spot Fleet.</p>\\n         <p>Supported only for fleets of type <code>maintain</code>.</p>\",\n                        \"smithy.api#xmlName\": \"excessCapacityTerminationPolicy\"\n                    }\n                },\n                \"FulfilledCapacity\": {\n                    \"target\": \"com.amazonaws.ec2#Double\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"FulfilledCapacity\",\n                        \"smithy.api#documentation\": \"<p>The number of units fulfilled by this request compared to the set target capacity. You\\n            cannot set this value.</p>\",\n                        \"smithy.api#xmlName\": \"fulfilledCapacity\"\n                    }\n                },\n                \"OnDemandFulfilledCapacity\": {\n                    \"target\": \"com.amazonaws.ec2#Double\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OnDemandFulfilledCapacity\",\n                        \"smithy.api#documentation\": \"<p>The number of On-Demand units fulfilled by this request compared to the set target\\n            On-Demand capacity.</p>\",\n                        \"smithy.api#xmlName\": \"onDemandFulfilledCapacity\"\n                    }\n                },\n                \"IamFleetRole\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IamFleetRole\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of an Identity and Access Management (IAM) role\\n         that grants the Spot Fleet the permission to request, launch, terminate, and tag instances\\n         on your behalf. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-fleet-requests.html#spot-fleet-prerequisites\\\">Spot\\n            Fleet prerequisites</a> in the <i>Amazon EC2 User Guide</i>. Spot Fleet can\\n         terminate Spot Instances on your behalf when you cancel its Spot Fleet request using <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CancelSpotFleetRequests\\\">CancelSpotFleetRequests</a> or when the Spot Fleet request expires, if you set\\n            <code>TerminateInstancesWithExpiration</code>.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"iamFleetRole\"\n                    }\n                },\n                \"LaunchSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchSpecsList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LaunchSpecifications\",\n                        \"smithy.api#documentation\": \"<p>The launch specifications for the Spot Fleet request. If you specify\\n                <code>LaunchSpecifications</code>, you can't specify\\n                <code>LaunchTemplateConfigs</code>. If you include On-Demand capacity in your\\n            request, you must use <code>LaunchTemplateConfigs</code>.</p>\\n         <note>\\n            <p>If an AMI specified in a launch specification is deregistered or disabled, no new\\n            instances can be launched from the AMI. For fleets of type <code>maintain</code>, the\\n            target capacity will not be maintained.</p>\\n         </note>\",\n                        \"smithy.api#xmlName\": \"launchSpecifications\"\n                    }\n                },\n                \"LaunchTemplateConfigs\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchTemplateConfigList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LaunchTemplateConfigs\",\n                        \"smithy.api#documentation\": \"<p>The launch template and overrides. If you specify <code>LaunchTemplateConfigs</code>,\\n            you can't specify <code>LaunchSpecifications</code>. If you include On-Demand capacity\\n            in your request, you must use <code>LaunchTemplateConfigs</code>.</p>\",\n                        \"smithy.api#xmlName\": \"launchTemplateConfigs\"\n                    }\n                },\n                \"SpotPrice\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SpotPrice\",\n                        \"smithy.api#documentation\": \"<p>The maximum price per unit hour that you are willing to pay for a Spot Instance. We do not recommend \\n            using this parameter because it can lead to increased interruptions. If you do not specify this parameter, you will pay the current Spot price.</p>\\n         <important>\\n            <p>If you specify a maximum price, your instances will be interrupted more frequently than if you do not specify this parameter.</p>\\n         </important>\",\n                        \"smithy.api#xmlName\": \"spotPrice\"\n                    }\n                },\n                \"TargetCapacity\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TargetCapacity\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The number of units to request for the Spot Fleet. You can choose to set the target\\n            capacity in terms of instances or a performance characteristic that is important to your\\n            application workload, such as vCPUs, memory, or I/O. If the request type is\\n                <code>maintain</code>, you can specify a target capacity of 0 and add capacity\\n            later.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"targetCapacity\"\n                    }\n                },\n                \"OnDemandTargetCapacity\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OnDemandTargetCapacity\",\n                        \"smithy.api#documentation\": \"<p>The number of On-Demand units to request. You can choose to set the target capacity in\\n            terms of instances or a performance characteristic that is important to your application\\n            workload, such as vCPUs, memory, or I/O. If the request type is <code>maintain</code>,\\n            you can specify a target capacity of 0 and add capacity later.</p>\",\n                        \"smithy.api#xmlName\": \"onDemandTargetCapacity\"\n                    }\n                },\n                \"OnDemandMaxTotalPrice\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OnDemandMaxTotalPrice\",\n                        \"smithy.api#documentation\": \"<p>The maximum amount per hour for On-Demand Instances that you're willing to pay. You\\n            can use the <code>onDemandMaxTotalPrice</code> parameter, the\\n                <code>spotMaxTotalPrice</code> parameter, or both parameters to ensure that your\\n            fleet cost does not exceed your budget. If you set a maximum price per hour for the\\n            On-Demand Instances and Spot Instances in your request, Spot Fleet will launch instances until it reaches the\\n            maximum amount you're willing to pay. When the maximum amount you're willing to pay is\\n            reached, the fleet stops launching instances even if it hasn’t met the target\\n            capacity.</p>\\n         <note>\\n            <p>If your fleet includes T instances that are configured as <code>unlimited</code>,\\n            and if their average CPU usage exceeds the baseline utilization, you will incur a charge\\n            for surplus credits. The <code>onDemandMaxTotalPrice</code> does not account for surplus\\n            credits, and, if you use surplus credits, your final cost might be higher than what you\\n            specified for <code>onDemandMaxTotalPrice</code>. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/burstable-performance-instances-unlimited-mode-concepts.html#unlimited-mode-surplus-credits\\\">Surplus credits can incur charges</a> in the\\n               <i>Amazon EC2 User Guide</i>.</p>\\n         </note>\",\n                        \"smithy.api#xmlName\": \"onDemandMaxTotalPrice\"\n                    }\n                },\n                \"SpotMaxTotalPrice\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SpotMaxTotalPrice\",\n                        \"smithy.api#documentation\": \"<p>The maximum amount per hour for Spot Instances that you're willing to pay. You can use\\n         the <code>spotMaxTotalPrice</code> parameter, the <code>onDemandMaxTotalPrice</code>\\n         parameter, or both parameters to ensure that your fleet cost does not exceed your budget.\\n         If you set a maximum price per hour for the On-Demand Instances and Spot Instances in your request, Spot Fleet will\\n         launch instances until it reaches the maximum amount you're willing to pay. When the\\n         maximum amount you're willing to pay is reached, the fleet stops launching instances even\\n         if it hasn’t met the target capacity.</p>\\n         <note>\\n            <p>If your fleet includes T instances that are configured as <code>unlimited</code>,\\n            and if their average CPU usage exceeds the baseline utilization, you will incur a charge\\n            for surplus credits. The <code>spotMaxTotalPrice</code> does not account for surplus\\n            credits, and, if you use surplus credits, your final cost might be higher than what you\\n            specified for <code>spotMaxTotalPrice</code>. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/burstable-performance-instances-unlimited-mode-concepts.html#unlimited-mode-surplus-credits\\\">Surplus credits can incur charges</a> in the\\n               <i>Amazon EC2 User Guide</i>.</p>\\n         </note>\",\n                        \"smithy.api#xmlName\": \"spotMaxTotalPrice\"\n                    }\n                },\n                \"TerminateInstancesWithExpiration\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TerminateInstancesWithExpiration\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether running Spot Instances are terminated when the Spot Fleet request\\n            expires.</p>\",\n                        \"smithy.api#xmlName\": \"terminateInstancesWithExpiration\"\n                    }\n                },\n                \"Type\": {\n                    \"target\": \"com.amazonaws.ec2#FleetType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Type\",\n                        \"smithy.api#documentation\": \"<p>The type of request. Indicates whether the Spot Fleet only requests the target\\n            capacity or also attempts to maintain it. When this value is <code>request</code>, the\\n            Spot Fleet only places the required requests. It does not attempt to replenish Spot\\n            Instances if capacity is diminished, nor does it submit requests in alternative Spot\\n            pools if capacity is not available. When this value is <code>maintain</code>, the Spot\\n            Fleet maintains the target capacity. The Spot Fleet places the required requests to meet\\n            capacity and automatically replenishes any interrupted instances. Default:\\n                <code>maintain</code>. <code>instant</code> is listed but is not used by Spot\\n            Fleet.</p>\",\n                        \"smithy.api#xmlName\": \"type\"\n                    }\n                },\n                \"ValidFrom\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ValidFrom\",\n                        \"smithy.api#documentation\": \"<p>The start date and time of the request, in UTC format\\n                (<i>YYYY</i>-<i>MM</i>-<i>DD</i>T<i>HH</i>:<i>MM</i>:<i>SS</i>Z).\\n            By default, Amazon EC2 starts fulfilling the request immediately.</p>\",\n                        \"smithy.api#xmlName\": \"validFrom\"\n                    }\n                },\n                \"ValidUntil\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ValidUntil\",\n                        \"smithy.api#documentation\": \"<p>The end date and time of the request, in UTC format\\n                (<i>YYYY</i>-<i>MM</i>-<i>DD</i>T<i>HH</i>:<i>MM</i>:<i>SS</i>Z).\\n            After the end date and time, no new Spot Instance requests are placed or able to fulfill\\n            the request. If no value is specified, the Spot Fleet request remains until you cancel\\n            it.</p>\",\n                        \"smithy.api#xmlName\": \"validUntil\"\n                    }\n                },\n                \"ReplaceUnhealthyInstances\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ReplaceUnhealthyInstances\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether Spot Fleet should replace unhealthy instances.</p>\",\n                        \"smithy.api#xmlName\": \"replaceUnhealthyInstances\"\n                    }\n                },\n                \"InstanceInterruptionBehavior\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceInterruptionBehavior\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceInterruptionBehavior\",\n                        \"smithy.api#documentation\": \"<p>The behavior when a Spot Instance is interrupted. The default is\\n                <code>terminate</code>.</p>\",\n                        \"smithy.api#xmlName\": \"instanceInterruptionBehavior\"\n                    }\n                },\n                \"LoadBalancersConfig\": {\n                    \"target\": \"com.amazonaws.ec2#LoadBalancersConfig\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LoadBalancersConfig\",\n                        \"smithy.api#documentation\": \"<p>One or more Classic Load Balancers and target groups to attach to the Spot Fleet\\n            request. Spot Fleet registers the running Spot Instances with the specified Classic Load\\n            Balancers and target groups.</p>\\n         <p>With Network Load Balancers, Spot Fleet cannot register instances that have the\\n            following instance types: C1, CC1, CC2, CG1, CG2, CR1, CS1, G1, G2, HI1, HS1, M1, M2,\\n            M3, and T1.</p>\",\n                        \"smithy.api#xmlName\": \"loadBalancersConfig\"\n                    }\n                },\n                \"InstancePoolsToUseCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstancePoolsToUseCount\",\n                        \"smithy.api#documentation\": \"<p>The number of Spot pools across which to allocate your target Spot capacity. Valid\\n            only when Spot <b>AllocationStrategy</b> is set to\\n                <code>lowest-price</code>. Spot Fleet selects the cheapest Spot pools and evenly\\n            allocates your target Spot capacity across the number of Spot pools that you\\n            specify.</p>\\n         <p>Note that Spot Fleet attempts to draw Spot Instances from the number of pools that you specify on a\\n            best effort basis. If a pool runs out of Spot capacity before fulfilling your target\\n            capacity, Spot Fleet will continue to fulfill your request by drawing from the next cheapest\\n            pool. To ensure that your target capacity is met, you might receive Spot Instances from more than\\n            the number of pools that you specified. Similarly, if most of the pools have no Spot\\n            capacity, you might receive your full target capacity from fewer than the number of\\n            pools that you specified.</p>\",\n                        \"smithy.api#xmlName\": \"instancePoolsToUseCount\"\n                    }\n                },\n                \"Context\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Context\",\n                        \"smithy.api#documentation\": \"<p>Reserved.</p>\",\n                        \"smithy.api#xmlName\": \"context\"\n                    }\n                },\n                \"TargetCapacityUnitType\": {\n                    \"target\": \"com.amazonaws.ec2#TargetCapacityUnitType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TargetCapacityUnitType\",\n                        \"smithy.api#documentation\": \"<p>The unit for the target capacity. You can specify this parameter only when \\n         using attribute-based instance type selection.</p>\\n         <p>Default: <code>units</code> (the number of instances)</p>\",\n                        \"smithy.api#xmlName\": \"targetCapacityUnitType\"\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The key-value pair for tagging the Spot Fleet request on creation. The value for\\n                <code>ResourceType</code> must be <code>spot-fleet-request</code>, otherwise the\\n            Spot Fleet request fails. To tag instances at launch, specify the tags in the <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-launch-templates.html#create-launch-template\\\">launch\\n                template</a> (valid only if you use <code>LaunchTemplateConfigs</code>) or in\\n            the <code>\\n               <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_SpotFleetTagSpecification.html\\\">SpotFleetTagSpecification</a>\\n            </code> (valid only if you use\\n                <code>LaunchSpecifications</code>). For information about tagging after launch, see\\n                <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Tags.html#tag-resources\\\">Tag your resources</a>.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the configuration of a Spot Fleet request.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#SpotFleetRequestConfigSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#SpotFleetRequestConfig\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#SpotFleetRequestId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#SpotFleetRequestIdList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#SpotFleetRequestId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#SpotFleetTagSpecification\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ResourceType\": {\n                    \"target\": \"com.amazonaws.ec2#ResourceType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResourceType\",\n                        \"smithy.api#documentation\": \"<p>The type of resource. Currently, the only resource type that is supported is\\n                <code>instance</code>. To tag the Spot Fleet request on creation, use the\\n                <code>TagSpecifications</code> parameter in <code>\\n               <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_SpotFleetRequestConfigData.html\\\">SpotFleetRequestConfigData</a>\\n            </code>.</p>\",\n                        \"smithy.api#xmlName\": \"resourceType\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Tag\",\n                        \"smithy.api#documentation\": \"<p>The tags.</p>\",\n                        \"smithy.api#xmlName\": \"tag\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The tags for a Spot Fleet resource.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#SpotFleetTagSpecificationList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#SpotFleetTagSpecification\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#SpotInstanceInterruptionBehavior\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"hibernate\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"hibernate\"\n                    }\n                },\n                \"stop\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"stop\"\n                    }\n                },\n                \"terminate\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"terminate\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#SpotInstanceRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ActualBlockHourlyPrice\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ActualBlockHourlyPrice\",\n                        \"smithy.api#documentation\": \"<p>Deprecated.</p>\",\n                        \"smithy.api#xmlName\": \"actualBlockHourlyPrice\"\n                    }\n                },\n                \"AvailabilityZoneGroup\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AvailabilityZoneGroup\",\n                        \"smithy.api#documentation\": \"<p>The Availability Zone group. If you specify the same Availability Zone group for all Spot Instance requests, all Spot Instances are launched in the same Availability Zone.</p>\",\n                        \"smithy.api#xmlName\": \"availabilityZoneGroup\"\n                    }\n                },\n                \"BlockDurationMinutes\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"BlockDurationMinutes\",\n                        \"smithy.api#documentation\": \"<p>Deprecated.</p>\",\n                        \"smithy.api#xmlName\": \"blockDurationMinutes\"\n                    }\n                },\n                \"CreateTime\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CreateTime\",\n                        \"smithy.api#documentation\": \"<p>The date and time when the Spot Instance request was created, in UTC format (for example, <i>YYYY</i>-<i>MM</i>-<i>DD</i>T<i>HH</i>:<i>MM</i>:<i>SS</i>Z).</p>\",\n                        \"smithy.api#xmlName\": \"createTime\"\n                    }\n                },\n                \"Fault\": {\n                    \"target\": \"com.amazonaws.ec2#SpotInstanceStateFault\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Fault\",\n                        \"smithy.api#documentation\": \"<p>The fault codes for the Spot Instance request, if any.</p>\",\n                        \"smithy.api#xmlName\": \"fault\"\n                    }\n                },\n                \"InstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceId\",\n                        \"smithy.api#documentation\": \"<p>The instance ID, if an instance has been launched to fulfill the Spot Instance request.</p>\",\n                        \"smithy.api#xmlName\": \"instanceId\"\n                    }\n                },\n                \"LaunchGroup\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LaunchGroup\",\n                        \"smithy.api#documentation\": \"<p>The instance launch group. Launch groups are Spot Instances that launch together and terminate together.</p>\",\n                        \"smithy.api#xmlName\": \"launchGroup\"\n                    }\n                },\n                \"LaunchSpecification\": {\n                    \"target\": \"com.amazonaws.ec2#LaunchSpecification\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LaunchSpecification\",\n                        \"smithy.api#documentation\": \"<p>Additional information for launching instances.</p>\",\n                        \"smithy.api#xmlName\": \"launchSpecification\"\n                    }\n                },\n                \"LaunchedAvailabilityZone\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LaunchedAvailabilityZone\",\n                        \"smithy.api#documentation\": \"<p>The Availability Zone in which the request is launched.</p>\\n         <p>Either <code>launchedAvailabilityZone</code> or <code>launchedAvailabilityZoneId</code> can be specified, but not both</p>\",\n                        \"smithy.api#xmlName\": \"launchedAvailabilityZone\"\n                    }\n                },\n                \"LaunchedAvailabilityZoneId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LaunchedAvailabilityZoneId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Availability Zone in which the request is launched.</p>\\n         <p>Either <code>launchedAvailabilityZone</code> or <code>launchedAvailabilityZoneId</code> can be specified, but not both</p>\",\n                        \"smithy.api#xmlName\": \"launchedAvailabilityZoneId\"\n                    }\n                },\n                \"ProductDescription\": {\n                    \"target\": \"com.amazonaws.ec2#RIProductDescription\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ProductDescription\",\n                        \"smithy.api#documentation\": \"<p>The product description associated with the Spot Instance.</p>\",\n                        \"smithy.api#xmlName\": \"productDescription\"\n                    }\n                },\n                \"SpotInstanceRequestId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SpotInstanceRequestId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Spot Instance request.</p>\",\n                        \"smithy.api#xmlName\": \"spotInstanceRequestId\"\n                    }\n                },\n                \"SpotPrice\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SpotPrice\",\n                        \"smithy.api#documentation\": \"<p>The maximum price per unit hour that you are willing to pay for a Spot Instance. We do not recommend \\n            using this parameter because it can lead to increased interruptions. If you do not specify this parameter, you will pay the current Spot price.</p>\\n         <important>\\n            <p>If you specify a maximum price, your instances will be interrupted more frequently than if you do not specify this parameter.</p>\\n         </important>\",\n                        \"smithy.api#xmlName\": \"spotPrice\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#SpotInstanceState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The state of the Spot Instance request. Spot request status information helps track your Spot\\n            Instance requests. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-request-status.html\\\">Spot request status</a> in the\\n                <i>Amazon EC2 User Guide</i>.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                },\n                \"Status\": {\n                    \"target\": \"com.amazonaws.ec2#SpotInstanceStatus\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Status\",\n                        \"smithy.api#documentation\": \"<p>The status code and status message describing the Spot Instance request.</p>\",\n                        \"smithy.api#xmlName\": \"status\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>Any tags assigned to the resource.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                },\n                \"Type\": {\n                    \"target\": \"com.amazonaws.ec2#SpotInstanceType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Type\",\n                        \"smithy.api#documentation\": \"<p>The Spot Instance request type.</p>\",\n                        \"smithy.api#xmlName\": \"type\"\n                    }\n                },\n                \"ValidFrom\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ValidFrom\",\n                        \"smithy.api#documentation\": \"<p>The start date of the request, in UTC format (for example,\\n                <i>YYYY</i>-<i>MM</i>-<i>DD</i>T<i>HH</i>:<i>MM</i>:<i>SS</i>Z).\\n            The request becomes active at this date and time.</p>\",\n                        \"smithy.api#xmlName\": \"validFrom\"\n                    }\n                },\n                \"ValidUntil\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ValidUntil\",\n                        \"smithy.api#documentation\": \"<p>The end date of the request, in UTC format\\n                (<i>YYYY</i>-<i>MM</i>-<i>DD</i>T<i>HH</i>:<i>MM</i>:<i>SS</i>Z).</p>\\n         <ul>\\n            <li>\\n               <p>For a persistent request, the request remains active until the <code>validUntil</code> date\\n                    and time is reached. Otherwise, the request remains active until you cancel it.\\n                </p>\\n            </li>\\n            <li>\\n               <p>For a one-time request, the request remains active until all instances launch,\\n                    the request is canceled, or the <code>validUntil</code> date and time is reached. By default, the\\n                    request is valid for 7 days from the date the request was created.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"validUntil\"\n                    }\n                },\n                \"InstanceInterruptionBehavior\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceInterruptionBehavior\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceInterruptionBehavior\",\n                        \"smithy.api#documentation\": \"<p>The behavior when a Spot Instance is interrupted.</p>\",\n                        \"smithy.api#xmlName\": \"instanceInterruptionBehavior\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a Spot Instance request.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#SpotInstanceRequestId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#SpotInstanceRequestIdList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#SpotInstanceRequestId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"SpotInstanceRequestId\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#SpotInstanceRequestList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#SpotInstanceRequest\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#SpotInstanceState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"open\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"open\"\n                    }\n                },\n                \"active\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"active\"\n                    }\n                },\n                \"closed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"closed\"\n                    }\n                },\n                \"cancelled\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"cancelled\"\n                    }\n                },\n                \"failed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"failed\"\n                    }\n                },\n                \"disabled\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"disabled\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#SpotInstanceStateFault\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Code\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Code\",\n                        \"smithy.api#documentation\": \"<p>The reason code for the Spot Instance state change.</p>\",\n                        \"smithy.api#xmlName\": \"code\"\n                    }\n                },\n                \"Message\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Message\",\n                        \"smithy.api#documentation\": \"<p>The message for the Spot Instance state change.</p>\",\n                        \"smithy.api#xmlName\": \"message\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a Spot Instance state change.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#SpotInstanceStatus\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Code\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Code\",\n                        \"smithy.api#documentation\": \"<p>The status code. For a list of status codes, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-request-status.html#spot-instance-request-status-understand\\\">Spot request status codes</a> in the <i>Amazon EC2 User Guide</i>.</p>\",\n                        \"smithy.api#xmlName\": \"code\"\n                    }\n                },\n                \"Message\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Message\",\n                        \"smithy.api#documentation\": \"<p>The description for the status code.</p>\",\n                        \"smithy.api#xmlName\": \"message\"\n                    }\n                },\n                \"UpdateTime\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"UpdateTime\",\n                        \"smithy.api#documentation\": \"<p>The date and time of the most recent status update, in UTC format (for example,\\n                <i>YYYY</i>-<i>MM</i>-<i>DD</i>T<i>HH</i>:<i>MM</i>:<i>SS</i>Z).</p>\",\n                        \"smithy.api#xmlName\": \"updateTime\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the status of a Spot Instance request.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#SpotInstanceType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"one_time\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"one-time\"\n                    }\n                },\n                \"persistent\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"persistent\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#SpotMaintenanceStrategies\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CapacityRebalance\": {\n                    \"target\": \"com.amazonaws.ec2#SpotCapacityRebalance\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CapacityRebalance\",\n                        \"smithy.api#documentation\": \"<p>The Spot Instance replacement strategy to use when Amazon EC2 emits a signal that your\\n            Spot Instance is at an elevated risk of being interrupted. For more information, see\\n                <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/spot-fleet-capacity-rebalance.html\\\">Capacity\\n                rebalancing</a> in the <i>Amazon EC2 User Guide</i>.</p>\",\n                        \"smithy.api#xmlName\": \"capacityRebalance\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The strategies for managing your Spot Instances that are at an elevated risk of being\\n            interrupted.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#SpotMarketOptions\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"MaxPrice\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum hourly price that you're willing to pay for a Spot Instance. We do not\\n            recommend using this parameter because it can lead to increased interruptions. If you do\\n            not specify this parameter, you will pay the current Spot price.</p>\\n         <important>\\n            <p>If you specify a maximum price, your Spot Instances will be interrupted more\\n                frequently than if you do not specify this parameter.</p>\\n            <p>If you specify a maximum price, it must be more than USD $0.001. Specifying a value\\n                below USD $0.001 will result in an <code>InvalidParameterValue</code> error\\n                message.</p>\\n         </important>\"\n                    }\n                },\n                \"SpotInstanceType\": {\n                    \"target\": \"com.amazonaws.ec2#SpotInstanceType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Spot Instance request type. For <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RunInstances\\\">RunInstances</a>, persistent\\n            Spot Instance requests are only supported when the instance interruption behavior is\\n            either <code>hibernate</code> or <code>stop</code>.</p>\"\n                    }\n                },\n                \"BlockDurationMinutes\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Deprecated.</p>\"\n                    }\n                },\n                \"ValidUntil\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The end date of the request, in UTC format\\n                (<i>YYYY</i>-<i>MM</i>-<i>DD</i>T<i>HH</i>:<i>MM</i>:<i>SS</i>Z).\\n            Supported only for persistent requests.</p>\\n         <ul>\\n            <li>\\n               <p>For a persistent request, the request remains active until the\\n                        <code>ValidUntil</code> date and time is reached. Otherwise, the request\\n                    remains active until you cancel it.</p>\\n            </li>\\n            <li>\\n               <p>For a one-time request, <code>ValidUntil</code> is not supported. The request\\n                    remains active until all instances launch or you cancel the request.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"InstanceInterruptionBehavior\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceInterruptionBehavior\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The behavior when a Spot Instance is interrupted.</p>\\n         <p>If <code>Configured</code> (for <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_HibernationOptionsRequest.html\\\">\\n               <code>HibernationOptions</code>\\n            </a>) is set to <code>true</code>, the\\n                <code>InstanceInterruptionBehavior</code> parameter is automatically set to\\n                <code>hibernate</code>. If you set it to <code>stop</code> or\\n            <code>terminate</code>, you'll get an error.</p>\\n         <p>If <code>Configured</code> (for <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_HibernationOptionsRequest.html\\\">\\n               <code>HibernationOptions</code>\\n            </a>) is set to <code>false</code> or\\n                <code>null</code>, the <code>InstanceInterruptionBehavior</code> parameter is\\n            automatically set to <code>terminate</code>. You can also set it to <code>stop</code> or\\n                <code>hibernate</code>.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/interruption-behavior.html\\\">Interruption\\n                behavior</a> in the <i>Amazon EC2 User Guide</i>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The options for Spot Instances.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#SpotOptions\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AllocationStrategy\": {\n                    \"target\": \"com.amazonaws.ec2#SpotAllocationStrategy\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AllocationStrategy\",\n                        \"smithy.api#documentation\": \"<p>The strategy that determines how to allocate the target Spot Instance capacity across the Spot Instance\\n         pools specified by the EC2 Fleet launch configuration. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-fleet-allocation-strategy.html\\\">Allocation strategies for Spot Instances</a> in the\\n         <i>Amazon EC2 User Guide</i>.</p>\\n         <dl>\\n            <dt>price-capacity-optimized (recommended)</dt>\\n            <dd>\\n               <p>EC2 Fleet identifies the pools with  \\n                  the highest capacity availability for the number of instances that are launching. This means \\n                  that we will request Spot Instances from the pools that we believe have the lowest chance of interruption \\n                  in the near term. EC2 Fleet then requests Spot Instances from the lowest priced of these pools.</p>\\n            </dd>\\n            <dt>capacity-optimized</dt>\\n            <dd>\\n               <p>EC2 Fleet identifies the pools with  \\n                  the highest capacity availability for the number of instances that are launching. This means \\n                  that we will request Spot Instances from the pools that we believe have the lowest chance of interruption \\n                  in the near term. To give certain\\n                  instance types a higher chance of launching first, use\\n                  <code>capacity-optimized-prioritized</code>. Set a priority for each instance type by\\n                  using the <code>Priority</code> parameter for <code>LaunchTemplateOverrides</code>. You can\\n                  assign the same priority to different <code>LaunchTemplateOverrides</code>. EC2 implements\\n                  the priorities on a best-effort basis, but optimizes for capacity first.\\n                  <code>capacity-optimized-prioritized</code> is supported only if your EC2 Fleet uses a\\n                  launch template. Note that if the On-Demand <code>AllocationStrategy</code> is set to\\n                  <code>prioritized</code>, the same priority is applied when fulfilling On-Demand\\n                  capacity.</p>\\n            </dd>\\n            <dt>diversified</dt>\\n            <dd>\\n               <p>EC2 Fleet requests instances from all of the Spot Instance pools that you\\n                  specify.</p>\\n            </dd>\\n            <dt>lowest-price (not recommended)</dt>\\n            <dd>\\n               <important>\\n                  <p>We don't recommend the <code>lowest-price</code> allocation strategy because\\n                     it has the highest risk of interruption for your Spot Instances.</p>\\n               </important>\\n               <p>EC2 Fleet requests instances from the lowest priced Spot Instance pool that has available\\n                  capacity. If the lowest priced pool doesn't have available capacity, the Spot Instances\\n                  come from the next lowest priced pool that has available capacity. If a pool runs\\n                  out of capacity before fulfilling your desired capacity, EC2 Fleet will continue to\\n                  fulfill your request by drawing from the next lowest priced pool. To ensure that\\n                  your desired capacity is met, you might receive Spot Instances from several pools. Because\\n                  this strategy only considers instance price and not capacity availability, it\\n                  might lead to high interruption rates.</p>\\n            </dd>\\n         </dl>\\n         <p>Default: <code>lowest-price</code>\\n         </p>\",\n                        \"smithy.api#xmlName\": \"allocationStrategy\"\n                    }\n                },\n                \"MaintenanceStrategies\": {\n                    \"target\": \"com.amazonaws.ec2#FleetSpotMaintenanceStrategies\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MaintenanceStrategies\",\n                        \"smithy.api#documentation\": \"<p>The strategies for managing your workloads on your Spot Instances that will be\\n         interrupted. Currently only the capacity rebalance strategy is available.</p>\",\n                        \"smithy.api#xmlName\": \"maintenanceStrategies\"\n                    }\n                },\n                \"InstanceInterruptionBehavior\": {\n                    \"target\": \"com.amazonaws.ec2#SpotInstanceInterruptionBehavior\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceInterruptionBehavior\",\n                        \"smithy.api#documentation\": \"<p>The behavior when a Spot Instance is interrupted.</p>\\n         <p>Default: <code>terminate</code>\\n         </p>\",\n                        \"smithy.api#xmlName\": \"instanceInterruptionBehavior\"\n                    }\n                },\n                \"InstancePoolsToUseCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstancePoolsToUseCount\",\n                        \"smithy.api#documentation\": \"<p>The number of Spot pools across which to allocate your target Spot capacity. Supported\\n         only when <code>AllocationStrategy</code> is set to <code>lowest-price</code>. EC2 Fleet selects\\n         the cheapest Spot pools and evenly allocates your target Spot capacity across the number of\\n         Spot pools that you specify.</p>\\n         <p>Note that EC2 Fleet attempts to draw Spot Instances from the number of pools that you specify on a\\n         best effort basis. If a pool runs out of Spot capacity before fulfilling your target\\n         capacity, EC2 Fleet will continue to fulfill your request by drawing from the next cheapest\\n         pool. To ensure that your target capacity is met, you might receive Spot Instances from more than\\n         the number of pools that you specified. Similarly, if most of the pools have no Spot\\n         capacity, you might receive your full target capacity from fewer than the number of pools\\n         that you specified.</p>\",\n                        \"smithy.api#xmlName\": \"instancePoolsToUseCount\"\n                    }\n                },\n                \"SingleInstanceType\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SingleInstanceType\",\n                        \"smithy.api#documentation\": \"<p>Indicates that the fleet uses a single instance type to launch all Spot Instances in the\\n         fleet.</p>\\n         <p>Supported only for fleets of type <code>instant</code>.</p>\",\n                        \"smithy.api#xmlName\": \"singleInstanceType\"\n                    }\n                },\n                \"SingleAvailabilityZone\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SingleAvailabilityZone\",\n                        \"smithy.api#documentation\": \"<p>Indicates that the fleet launches all Spot Instances into a single Availability Zone.</p>\\n         <p>Supported only for fleets of type <code>instant</code>.</p>\",\n                        \"smithy.api#xmlName\": \"singleAvailabilityZone\"\n                    }\n                },\n                \"MinTargetCapacity\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MinTargetCapacity\",\n                        \"smithy.api#documentation\": \"<p>The minimum target capacity for Spot Instances in the fleet. If this minimum capacity isn't\\n         reached, no instances are launched.</p>\\n         <p>Constraints: Maximum value of <code>1000</code>. Supported only for fleets of type\\n            <code>instant</code>.</p>\\n         <p>At least one of the following must be specified: <code>SingleAvailabilityZone</code> |\\n            <code>SingleInstanceType</code>\\n         </p>\",\n                        \"smithy.api#xmlName\": \"minTargetCapacity\"\n                    }\n                },\n                \"MaxTotalPrice\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MaxTotalPrice\",\n                        \"smithy.api#documentation\": \"<p>The maximum amount per hour for Spot Instances that you're willing to pay. We do not recommend\\n         using this parameter because it can lead to increased interruptions. If you do not specify\\n         this parameter, you will pay the current Spot price.</p>\\n         <important>\\n            <p>If you specify a maximum price, your Spot Instances will be interrupted more frequently than if you do not specify this parameter.</p>\\n         </important>\\n         <note>\\n            <p>If your fleet includes T instances that are configured as <code>unlimited</code>, and\\n            if their average CPU usage exceeds the baseline utilization, you will incur a charge for\\n            surplus credits. The <code>maxTotalPrice</code> does not account for surplus credits,\\n            and, if you use surplus credits, your final cost might be higher than what you specified\\n            for <code>maxTotalPrice</code>. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/burstable-performance-instances-unlimited-mode-concepts.html#unlimited-mode-surplus-credits\\\">Surplus credits can incur charges</a> in the\\n               <i>Amazon EC2 User Guide</i>.</p>\\n         </note>\",\n                        \"smithy.api#xmlName\": \"maxTotalPrice\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the configuration of Spot Instances in an EC2 Fleet.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#SpotOptionsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AllocationStrategy\": {\n                    \"target\": \"com.amazonaws.ec2#SpotAllocationStrategy\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The strategy that determines how to allocate the target Spot Instance capacity across the Spot Instance\\n         pools specified by the EC2 Fleet launch configuration. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-fleet-allocation-strategy.html\\\">Allocation strategies for Spot Instances</a> in the\\n         <i>Amazon EC2 User Guide</i>.</p>\\n         <dl>\\n            <dt>price-capacity-optimized (recommended)</dt>\\n            <dd>\\n               <p>EC2 Fleet identifies the pools with  \\n                  the highest capacity availability for the number of instances that are launching. This means \\n                  that we will request Spot Instances from the pools that we believe have the lowest chance of interruption \\n                  in the near term. EC2 Fleet then requests Spot Instances from the lowest priced of these pools.</p>\\n            </dd>\\n            <dt>capacity-optimized</dt>\\n            <dd>\\n               <p>EC2 Fleet identifies the pools with  \\n                  the highest capacity availability for the number of instances that are launching. This means \\n                  that we will request Spot Instances from the pools that we believe have the lowest chance of interruption \\n                  in the near term. To give certain\\n                  instance types a higher chance of launching first, use\\n                  <code>capacity-optimized-prioritized</code>. Set a priority for each instance type by\\n                  using the <code>Priority</code> parameter for <code>LaunchTemplateOverrides</code>. You can\\n                  assign the same priority to different <code>LaunchTemplateOverrides</code>. EC2 implements\\n                  the priorities on a best-effort basis, but optimizes for capacity first.\\n                  <code>capacity-optimized-prioritized</code> is supported only if your EC2 Fleet uses a\\n                  launch template. Note that if the On-Demand <code>AllocationStrategy</code> is set to\\n                  <code>prioritized</code>, the same priority is applied when fulfilling On-Demand\\n                  capacity.</p>\\n            </dd>\\n            <dt>diversified</dt>\\n            <dd>\\n               <p>EC2 Fleet requests instances from all of the Spot Instance pools that you\\n                  specify.</p>\\n            </dd>\\n            <dt>lowest-price (not recommended)</dt>\\n            <dd>\\n               <important>\\n                  <p>We don't recommend the <code>lowest-price</code> allocation strategy because\\n                     it has the highest risk of interruption for your Spot Instances.</p>\\n               </important>\\n               <p>EC2 Fleet requests instances from the lowest priced Spot Instance pool that\\n                  has available capacity. If the lowest priced pool doesn't have available capacity, the Spot Instances\\n                  come from the next lowest priced pool that has available capacity. If a pool runs out of\\n                  capacity before fulfilling your desired capacity, EC2 Fleet will continue to fulfill your\\n                  request by drawing from the next lowest priced pool. To ensure that your desired capacity is\\n                  met, you might receive Spot Instances from several pools. Because this strategy only considers instance \\n                  price and not capacity availability, it might lead to high interruption rates.</p>\\n            </dd>\\n         </dl>\\n         <p>Default: <code>lowest-price</code>\\n         </p>\"\n                    }\n                },\n                \"MaintenanceStrategies\": {\n                    \"target\": \"com.amazonaws.ec2#FleetSpotMaintenanceStrategiesRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The strategies for managing your Spot Instances that are at an elevated risk of being\\n         interrupted.</p>\"\n                    }\n                },\n                \"InstanceInterruptionBehavior\": {\n                    \"target\": \"com.amazonaws.ec2#SpotInstanceInterruptionBehavior\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The behavior when a Spot Instance is interrupted.</p>\\n         <p>Default: <code>terminate</code>\\n         </p>\"\n                    }\n                },\n                \"InstancePoolsToUseCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of Spot pools across which to allocate your target Spot capacity. Supported\\n         only when Spot <code>AllocationStrategy</code> is set to <code>lowest-price</code>. EC2 Fleet\\n         selects the cheapest Spot pools and evenly allocates your target Spot capacity across the\\n         number of Spot pools that you specify.</p>\\n         <p>Note that EC2 Fleet attempts to draw Spot Instances from the number of pools that you specify on a\\n         best effort basis. If a pool runs out of Spot capacity before fulfilling your target\\n         capacity, EC2 Fleet will continue to fulfill your request by drawing from the next cheapest\\n         pool. To ensure that your target capacity is met, you might receive Spot Instances from more than\\n         the number of pools that you specified. Similarly, if most of the pools have no Spot\\n         capacity, you might receive your full target capacity from fewer than the number of pools\\n         that you specified.</p>\"\n                    }\n                },\n                \"SingleInstanceType\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates that the fleet uses a single instance type to launch all Spot Instances in the\\n         fleet.</p>\\n         <p>Supported only for fleets of type <code>instant</code>.</p>\"\n                    }\n                },\n                \"SingleAvailabilityZone\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates that the fleet launches all Spot Instances into a single Availability Zone.</p>\\n         <p>Supported only for fleets of type <code>instant</code>.</p>\"\n                    }\n                },\n                \"MinTargetCapacity\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The minimum target capacity for Spot Instances in the fleet. If this minimum capacity isn't\\n         reached, no instances are launched.</p>\\n         <p>Constraints: Maximum value of <code>1000</code>. Supported only for fleets of type\\n            <code>instant</code>.</p>\\n         <p>At least one of the following must be specified: <code>SingleAvailabilityZone</code> |\\n         <code>SingleInstanceType</code>\\n         </p>\"\n                    }\n                },\n                \"MaxTotalPrice\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum amount per hour for Spot Instances that you're willing to pay. We do not recommend\\n         using this parameter because it can lead to increased interruptions. If you do not specify\\n         this parameter, you will pay the current Spot price.</p>\\n         <important>\\n            <p>If you specify a maximum price, your Spot Instances will be interrupted more frequently than if you do not specify this parameter.</p>\\n         </important>\\n         <note>\\n            <p>If your fleet includes T instances that are configured as <code>unlimited</code>, and\\n            if their average CPU usage exceeds the baseline utilization, you will incur a charge for\\n            surplus credits. The <code>MaxTotalPrice</code> does not account for surplus credits,\\n            and, if you use surplus credits, your final cost might be higher than what you specified\\n            for <code>MaxTotalPrice</code>. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/burstable-performance-instances-unlimited-mode-concepts.html#unlimited-mode-surplus-credits\\\">Surplus credits can incur charges</a> in the\\n               <i>Amazon EC2 User Guide</i>.</p>\\n         </note>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the configuration of Spot Instances in an EC2 Fleet request.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#SpotPlacement\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AvailabilityZone\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AvailabilityZone\",\n                        \"smithy.api#documentation\": \"<p>The Availability Zone.</p>\\n         <p>[Spot Fleet only] To specify multiple Availability Zones, separate them using commas;\\n            for example, \\\"us-west-2a, us-west-2b\\\".</p>\",\n                        \"smithy.api#xmlName\": \"availabilityZone\"\n                    }\n                },\n                \"GroupName\": {\n                    \"target\": \"com.amazonaws.ec2#PlacementGroupName\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"GroupName\",\n                        \"smithy.api#documentation\": \"<p>The name of the placement group.</p>\",\n                        \"smithy.api#xmlName\": \"groupName\"\n                    }\n                },\n                \"Tenancy\": {\n                    \"target\": \"com.amazonaws.ec2#Tenancy\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Tenancy\",\n                        \"smithy.api#documentation\": \"<p>The tenancy of the instance (if the instance is running in a VPC). An instance with a\\n            tenancy of <code>dedicated</code> runs on single-tenant hardware. The <code>host</code>\\n            tenancy is not supported for Spot Instances.</p>\",\n                        \"smithy.api#xmlName\": \"tenancy\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes Spot Instance placement.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#SpotPlacementScore\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Region\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Region\",\n                        \"smithy.api#documentation\": \"<p>The Region.</p>\",\n                        \"smithy.api#xmlName\": \"region\"\n                    }\n                },\n                \"AvailabilityZoneId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AvailabilityZoneId\",\n                        \"smithy.api#documentation\": \"<p>The Availability Zone.</p>\",\n                        \"smithy.api#xmlName\": \"availabilityZoneId\"\n                    }\n                },\n                \"Score\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Score\",\n                        \"smithy.api#documentation\": \"<p>The placement score, on a scale from <code>1</code> to <code>10</code>. A score of\\n            <code>10</code> indicates that your Spot request is highly likely to succeed in this\\n         Region or Availability Zone. A score of <code>1</code> indicates that your Spot request is\\n         not likely to succeed. </p>\",\n                        \"smithy.api#xmlName\": \"score\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The Spot placement score for this Region or Availability Zone. The score is calculated\\n         based on the assumption that the <code>capacity-optimized</code> allocation strategy is\\n         used and that all of the Availability Zones in the Region can be used.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#SpotPlacementScores\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#SpotPlacementScore\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#SpotPlacementScoresMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 10,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.ec2#SpotPlacementScoresTargetCapacity\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 2000000000\n                }\n            }\n        },\n        \"com.amazonaws.ec2#SpotPrice\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AvailabilityZone\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AvailabilityZone\",\n                        \"smithy.api#documentation\": \"<p>The Availability Zone.</p>\",\n                        \"smithy.api#xmlName\": \"availabilityZone\"\n                    }\n                },\n                \"AvailabilityZoneId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AvailabilityZoneId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Availability Zone.</p>\",\n                        \"smithy.api#xmlName\": \"availabilityZoneId\"\n                    }\n                },\n                \"InstanceType\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceType\",\n                        \"smithy.api#documentation\": \"<p>The instance type.</p>\",\n                        \"smithy.api#xmlName\": \"instanceType\"\n                    }\n                },\n                \"ProductDescription\": {\n                    \"target\": \"com.amazonaws.ec2#RIProductDescription\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ProductDescription\",\n                        \"smithy.api#documentation\": \"<p>A general description of the AMI.</p>\",\n                        \"smithy.api#xmlName\": \"productDescription\"\n                    }\n                },\n                \"SpotPrice\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SpotPrice\",\n                        \"smithy.api#documentation\": \"<p>The maximum price per unit hour that you are willing to pay for a Spot Instance. We do not recommend \\n            using this parameter because it can lead to increased interruptions. If you do not specify this parameter, you will pay the current Spot price.</p>\\n         <important>\\n            <p>If you specify a maximum price, your instances will be interrupted more frequently than if you do not specify this parameter.</p>\\n         </important>\",\n                        \"smithy.api#xmlName\": \"spotPrice\"\n                    }\n                },\n                \"Timestamp\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Timestamp\",\n                        \"smithy.api#documentation\": \"<p>The date and time the request was created, in UTC format (for example,\\n                <i>YYYY</i>-<i>MM</i>-<i>DD</i>T<i>HH</i>:<i>MM</i>:<i>SS</i>Z).</p>\",\n                        \"smithy.api#xmlName\": \"timestamp\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The maximum price per unit hour that you are willing to pay for a Spot Instance. We do not recommend \\n            using this parameter because it can lead to increased interruptions. If you do not specify this parameter, you will pay the current Spot price.</p>\\n         <important>\\n            <p>If you specify a maximum price, your instances will be interrupted more frequently than if you do not specify this parameter.</p>\\n         </important>\"\n            }\n        },\n        \"com.amazonaws.ec2#SpotPriceHistoryList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#SpotPrice\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#SpreadLevel\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"host\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"host\"\n                    }\n                },\n                \"rack\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"rack\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#StaleIpPermission\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"FromPort\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"FromPort\",\n                        \"smithy.api#documentation\": \"<p>If the protocol is TCP or UDP, this is the start of the port range. \\n          If the protocol is ICMP or ICMPv6, this is the ICMP type or -1 (all ICMP types).</p>\",\n                        \"smithy.api#xmlName\": \"fromPort\"\n                    }\n                },\n                \"IpProtocol\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpProtocol\",\n                        \"smithy.api#documentation\": \"<p>The IP protocol name (<code>tcp</code>, <code>udp</code>, <code>icmp</code>, <code>icmpv6</code>) or number\\n          (see <a href=\\\"http://www.iana.org/assignments/protocol-numbers/protocol-numbers.xhtml\\\">Protocol Numbers)</a>.</p>\",\n                        \"smithy.api#xmlName\": \"ipProtocol\"\n                    }\n                },\n                \"IpRanges\": {\n                    \"target\": \"com.amazonaws.ec2#IpRanges\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpRanges\",\n                        \"smithy.api#documentation\": \"<p>The IP ranges. Not applicable for stale security group rules.</p>\",\n                        \"smithy.api#xmlName\": \"ipRanges\"\n                    }\n                },\n                \"PrefixListIds\": {\n                    \"target\": \"com.amazonaws.ec2#PrefixListIdSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PrefixListIds\",\n                        \"smithy.api#documentation\": \"<p>The prefix list IDs. Not applicable for stale security group rules.</p>\",\n                        \"smithy.api#xmlName\": \"prefixListIds\"\n                    }\n                },\n                \"ToPort\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ToPort\",\n                        \"smithy.api#documentation\": \"<p>If the protocol is TCP or UDP, this is the end of the port range.\\n          If the protocol is ICMP or ICMPv6, this is the ICMP code or -1 (all ICMP codes).</p>\",\n                        \"smithy.api#xmlName\": \"toPort\"\n                    }\n                },\n                \"UserIdGroupPairs\": {\n                    \"target\": \"com.amazonaws.ec2#UserIdGroupPairSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Groups\",\n                        \"smithy.api#documentation\": \"<p>The security group pairs. Returns the ID of the referenced security group and VPC, and the ID and status of the VPC peering connection.</p>\",\n                        \"smithy.api#xmlName\": \"groups\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a stale rule in a security group.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#StaleIpPermissionSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#StaleIpPermission\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#StaleSecurityGroup\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Description\",\n                        \"smithy.api#documentation\": \"<p>The description of the security group.</p>\",\n                        \"smithy.api#xmlName\": \"description\"\n                    }\n                },\n                \"GroupId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"GroupId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the security group.</p>\",\n                        \"smithy.api#xmlName\": \"groupId\"\n                    }\n                },\n                \"GroupName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"GroupName\",\n                        \"smithy.api#documentation\": \"<p>The name of the security group.</p>\",\n                        \"smithy.api#xmlName\": \"groupName\"\n                    }\n                },\n                \"StaleIpPermissions\": {\n                    \"target\": \"com.amazonaws.ec2#StaleIpPermissionSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"StaleIpPermissions\",\n                        \"smithy.api#documentation\": \"<p>Information about the stale inbound rules in the security group.</p>\",\n                        \"smithy.api#xmlName\": \"staleIpPermissions\"\n                    }\n                },\n                \"StaleIpPermissionsEgress\": {\n                    \"target\": \"com.amazonaws.ec2#StaleIpPermissionSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"StaleIpPermissionsEgress\",\n                        \"smithy.api#documentation\": \"<p>Information about the stale outbound rules in the security group.</p>\",\n                        \"smithy.api#xmlName\": \"staleIpPermissionsEgress\"\n                    }\n                },\n                \"VpcId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the VPC for the security group.</p>\",\n                        \"smithy.api#xmlName\": \"vpcId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a stale security group (a security group that contains stale rules).</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#StaleSecurityGroupSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#StaleSecurityGroup\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#StartDeclarativePoliciesReport\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#StartDeclarativePoliciesReportRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#StartDeclarativePoliciesReportResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Generates an account status report. The report is generated asynchronously, and can\\n            take several hours to complete.</p>\\n         <p>The report provides the current status of all attributes supported by declarative\\n            policies for the accounts within the specified scope. The scope is determined by the\\n            specified <code>TargetId</code>, which can represent an individual account, or all the\\n            accounts that fall under the specified organizational unit (OU) or root (the entire\\n                Amazon Web Services Organization).</p>\\n         <p>The report is saved to your specified S3 bucket, using the following path structure\\n            (with the capitalized placeholders representing your specific values):</p>\\n         <p>\\n            <code>s3://AMZN-S3-DEMO-BUCKET/YOUR-OPTIONAL-S3-PREFIX/ec2_TARGETID_REPORTID_YYYYMMDDTHHMMZ.csv</code>\\n         </p>\\n         <p class=\\\"title\\\">\\n            <b>Prerequisites for generating a report</b>\\n         </p>\\n         <ul>\\n            <li>\\n               <p>The <code>StartDeclarativePoliciesReport</code> API can only be called by the\\n                    management account or delegated administrators for the organization.</p>\\n            </li>\\n            <li>\\n               <p>An S3 bucket must be available before generating the report (you can create a\\n                    new one or use an existing one), it must be in the same Region where the report\\n                    generation request is made, and it must have an appropriate bucket policy. For a\\n                    sample S3 policy, see <i>Sample Amazon S3 policy</i> under <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_StartDeclarativePoliciesReport.html#API_StartDeclarativePoliciesReport_Examples\\\">Examples</a>.</p>\\n            </li>\\n            <li>\\n               <p>Trusted access must be enabled for the service for which the declarative\\n                    policy will enforce a baseline configuration. If you use the Amazon Web Services Organizations\\n                    console, this is done automatically when you enable declarative policies. The\\n                    API uses the following service principal to identify the EC2 service:\\n                        <code>ec2.amazonaws.com</code>. For more information on how to enable\\n                    trusted access with the Amazon Web Services CLI and Amazon Web Services SDKs, see <a href=\\\"https://docs.aws.amazon.com/organizations/latest/userguide/orgs_integrate_services.html\\\">Using\\n                        Organizations with other Amazon Web Services services</a> in the\\n                        <i>Amazon Web Services Organizations User Guide</i>.</p>\\n            </li>\\n            <li>\\n               <p>Only one report per organization can be generated at a time. Attempting to\\n                    generate a report while another is in progress will result in an error.</p>\\n            </li>\\n         </ul>\\n         <p>For more information, including the required IAM permissions to run this API, see\\n                <a href=\\\"https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_declarative_status-report.html\\\">Generating the account status report for declarative policies</a> in the\\n                <i>Amazon Web Services Organizations User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#StartDeclarativePoliciesReportRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"S3Bucket\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The name of the S3 bucket where the report will be saved. The bucket must be in the\\n            same Region where the report generation request is made.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"S3Prefix\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The prefix for your S3 object.</p>\"\n                    }\n                },\n                \"TargetId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The root ID, organizational unit ID, or account ID.</p>\\n         <p>Format:</p>\\n         <ul>\\n            <li>\\n               <p>For root: <code>r-ab12</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>For OU: <code>ou-ab12-cdef1234</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>For account: <code>123456789012</code>\\n               </p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags to apply.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#StartDeclarativePoliciesReportResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ReportId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ReportId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the report.</p>\",\n                        \"smithy.api#xmlName\": \"reportId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#StartInstances\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#StartInstancesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#StartInstancesResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Starts an Amazon EBS-backed instance that you've previously stopped.</p>\\n         <p>Instances that use Amazon EBS volumes as their root devices can be quickly stopped and\\n            started. When an instance is stopped, the compute resources are released and you are not\\n            billed for instance usage. However, your root partition Amazon EBS volume remains and\\n            continues to persist your data, and you are charged for Amazon EBS volume usage. You can\\n            restart your instance at any time. Every time you start your instance, Amazon EC2\\n            charges a one-minute minimum for instance usage, and thereafter charges per second for\\n            instance usage.</p>\\n         <p>Before stopping an instance, make sure it is in a state from which it can be\\n            restarted. Stopping an instance does not preserve data stored in RAM.</p>\\n         <p>Performing this operation on an instance that uses an instance store as its root\\n            device returns an error.</p>\\n         <p>If you attempt to start a T3 instance with <code>host</code> tenancy and the\\n                <code>unlimited</code> CPU credit option, the request fails. The\\n                <code>unlimited</code> CPU credit option is not supported on Dedicated Hosts. Before\\n            you start the instance, either change its CPU credit option to <code>standard</code>, or\\n            change its tenancy to <code>default</code> or <code>dedicated</code>.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Stop_Start.html\\\">Stop and start Amazon EC2\\n                instances</a> in the <i>Amazon EC2 User Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To start a stopped EC2 instance\",\n                        \"documentation\": \"This example starts the specified EC2 instance.\",\n                        \"input\": {\n                            \"InstanceIds\": [\n                                \"i-1234567890abcdef0\"\n                            ]\n                        },\n                        \"output\": {\n                            \"StartingInstances\": [\n                                {\n                                    \"InstanceId\": \"i-1234567890abcdef0\",\n                                    \"CurrentState\": {\n                                        \"Code\": 0,\n                                        \"Name\": \"pending\"\n                                    },\n                                    \"PreviousState\": {\n                                        \"Code\": 80,\n                                        \"Name\": \"stopped\"\n                                    }\n                                }\n                            ]\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#StartInstancesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceIds\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceIdStringList\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The IDs of the instances.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"InstanceId\"\n                    }\n                },\n                \"AdditionalInfo\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AdditionalInfo\",\n                        \"smithy.api#documentation\": \"<p>Reserved.</p>\",\n                        \"smithy.api#xmlName\": \"additionalInfo\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the operation, without actually making the \\n  request, and provides an error response. If you have the required permissions, the error response is \\n  <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#StartInstancesResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"StartingInstances\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceStateChangeList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstancesSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the started instances.</p>\",\n                        \"smithy.api#xmlName\": \"instancesSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#StartNetworkInsightsAccessScopeAnalysis\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#StartNetworkInsightsAccessScopeAnalysisRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#StartNetworkInsightsAccessScopeAnalysisResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Starts analyzing the specified Network Access Scope.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#StartNetworkInsightsAccessScopeAnalysisRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NetworkInsightsAccessScopeId\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInsightsAccessScopeId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the Network Access Scope.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags to apply.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>Unique, case-sensitive identifier that you provide to ensure the idempotency of the request. For more information, \\n   see <a href=\\\"https://docs.aws.amazon.com/ec2/latest/devguide/ec2-api-idempotency.html\\\">How to ensure idempotency</a>.</p>\",\n                        \"smithy.api#idempotencyToken\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#StartNetworkInsightsAccessScopeAnalysisResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NetworkInsightsAccessScopeAnalysis\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInsightsAccessScopeAnalysis\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkInsightsAccessScopeAnalysis\",\n                        \"smithy.api#documentation\": \"<p>The Network Access Scope analysis.</p>\",\n                        \"smithy.api#xmlName\": \"networkInsightsAccessScopeAnalysis\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#StartNetworkInsightsAnalysis\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#StartNetworkInsightsAnalysisRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#StartNetworkInsightsAnalysisResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Starts analyzing the specified path. If the path is reachable, the\\n         operation returns the shortest feasible path.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#StartNetworkInsightsAnalysisRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NetworkInsightsPathId\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInsightsPathId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the path.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"AdditionalAccounts\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The member accounts that contain resources that the path can traverse.</p>\",\n                        \"smithy.api#xmlName\": \"AdditionalAccount\"\n                    }\n                },\n                \"FilterInArns\": {\n                    \"target\": \"com.amazonaws.ec2#ArnList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Names (ARN) of the resources that the path must traverse.</p>\",\n                        \"smithy.api#xmlName\": \"FilterInArn\"\n                    }\n                },\n                \"FilterOutArns\": {\n                    \"target\": \"com.amazonaws.ec2#ArnList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Names (ARN) of the resources that the path will ignore.</p>\",\n                        \"smithy.api#xmlName\": \"FilterOutArn\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"TagSpecifications\": {\n                    \"target\": \"com.amazonaws.ec2#TagSpecificationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags to apply.</p>\",\n                        \"smithy.api#xmlName\": \"TagSpecification\"\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>Unique, case-sensitive identifier that you provide to ensure the idempotency of the request. For more information, \\n   see <a href=\\\"https://docs.aws.amazon.com/ec2/latest/devguide/ec2-api-idempotency.html\\\">How to ensure idempotency</a>.</p>\",\n                        \"smithy.api#idempotencyToken\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#StartNetworkInsightsAnalysisResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NetworkInsightsAnalysis\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInsightsAnalysis\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkInsightsAnalysis\",\n                        \"smithy.api#documentation\": \"<p>Information about the network insights analysis.</p>\",\n                        \"smithy.api#xmlName\": \"networkInsightsAnalysis\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#StartVpcEndpointServicePrivateDnsVerification\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#StartVpcEndpointServicePrivateDnsVerificationRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#StartVpcEndpointServicePrivateDnsVerificationResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Initiates the verification process to prove that the service provider owns the private\\n            DNS name domain for the endpoint service.</p>\\n         <p>The service provider must successfully perform the verification before the consumer can use the name to access the service.</p>\\n         <p>Before the service provider runs this command, they must add a record to the DNS server.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#StartVpcEndpointServicePrivateDnsVerificationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"ServiceId\": {\n                    \"target\": \"com.amazonaws.ec2#VpcEndpointServiceId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the endpoint service.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#StartVpcEndpointServicePrivateDnsVerificationResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ReturnValue\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Return\",\n                        \"smithy.api#documentation\": \"<p>Returns <code>true</code> if the request succeeds; otherwise, it returns an error.</p>\",\n                        \"smithy.api#xmlName\": \"return\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#State\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"PendingAcceptance\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"PendingAcceptance\"\n                    }\n                },\n                \"Pending\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Pending\"\n                    }\n                },\n                \"Available\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Available\"\n                    }\n                },\n                \"Deleting\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Deleting\"\n                    }\n                },\n                \"Deleted\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Deleted\"\n                    }\n                },\n                \"Rejected\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Rejected\"\n                    }\n                },\n                \"Failed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Failed\"\n                    }\n                },\n                \"Expired\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Expired\"\n                    }\n                },\n                \"Partial\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Partial\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#StateReason\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Code\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Code\",\n                        \"smithy.api#documentation\": \"<p>The reason code for the state change.</p>\",\n                        \"smithy.api#xmlName\": \"code\"\n                    }\n                },\n                \"Message\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Message\",\n                        \"smithy.api#documentation\": \"<p>The message for the state change.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>Server.InsufficientInstanceCapacity</code>: There was insufficient\\n                    capacity available to satisfy the launch request.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>Server.InternalError</code>: An internal error caused the instance to\\n                    terminate during launch.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>Server.ScheduledStop</code>: The instance was stopped due to a scheduled\\n                    retirement.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>Server.SpotInstanceShutdown</code>: The instance was stopped because the\\n                    number of Spot requests with a maximum price equal to or higher than the Spot\\n                    price exceeded available capacity or because of an increase in the Spot\\n                    price.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>Server.SpotInstanceTermination</code>: The instance was terminated\\n                    because the number of Spot requests with a maximum price equal to or higher than\\n                    the Spot price exceeded available capacity or because of an increase in the Spot\\n                    price.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>Client.InstanceInitiatedShutdown</code>: The instance was shut down\\n                    from the operating system of the instance.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>Client.InstanceTerminated</code>: The instance was terminated or\\n                    rebooted during AMI creation.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>Client.InternalError</code>: A client error caused the instance to\\n                    terminate during launch.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>Client.InvalidSnapshot.NotFound</code>: The specified snapshot was not\\n                    found.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>Client.UserInitiatedHibernate</code>: Hibernation was initiated on the\\n                    instance.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>Client.UserInitiatedShutdown</code>: The instance was shut down using\\n                    the Amazon EC2 API.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>Client.VolumeLimitExceeded</code>: The limit on the number of EBS\\n                    volumes or total storage was exceeded. Decrease usage or request an increase in\\n                    your account limits.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"message\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a state change.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#StaticSourcesSupportValue\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"enable\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"enable\"\n                    }\n                },\n                \"disable\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"disable\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#StatisticType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"p50\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"p50\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#Status\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"moveInProgress\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"MoveInProgress\"\n                    }\n                },\n                \"inVpc\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"InVpc\"\n                    }\n                },\n                \"inClassic\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"InClassic\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#StatusName\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"reachability\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"reachability\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#StatusType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"passed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"passed\"\n                    }\n                },\n                \"failed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"failed\"\n                    }\n                },\n                \"insufficient_data\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"insufficient-data\"\n                    }\n                },\n                \"initializing\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"initializing\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#StopInstances\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#StopInstancesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#StopInstancesResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Stops an Amazon EBS-backed instance. You can restart your instance at any time using\\n            the <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_StartInstances.html\\\">StartInstances</a> API. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Stop_Start.html\\\">Stop and start Amazon EC2\\n                instances</a> in the <i>Amazon EC2 User Guide</i>.</p>\\n         <p>When you stop or hibernate an instance, we shut it down. By default, this includes a\\n            graceful operating system (OS) shutdown. To bypass the graceful shutdown, use the\\n                <code>skipOsShutdown</code> parameter; however, this might risk data\\n            integrity.</p>\\n         <p>You can use the StopInstances operation together with the <code>Hibernate</code>\\n            parameter to hibernate an instance if the instance is <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/enabling-hibernation.html\\\">enabled for\\n                hibernation</a> and meets the <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/hibernating-prerequisites.html\\\">hibernation\\n                prerequisites</a>. Stopping an instance doesn't preserve data stored in RAM,\\n            while hibernation does. If hibernation fails, a normal shutdown occurs. For more\\n            information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Hibernate.html\\\">Hibernate your Amazon EC2\\n                instance</a> in the <i>Amazon EC2 User Guide</i>.</p>\\n         <p>If your instance appears stuck in the <code>stopping</code> state, there might be an\\n            issue with the underlying host computer. You can use the StopInstances operation\\n            together with the Force parameter to force stop your instance. For more information, see\\n                <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/TroubleshootingInstancesStopping.html\\\">Troubleshoot\\n                    Amazon EC2 instance stop issues</a> in the\\n                <i>Amazon EC2 User Guide</i>.</p>\\n         <p>Stopping and hibernating an instance differs from rebooting or terminating it. For\\n            example, a stopped or hibernated instance retains its root volume and any data volumes,\\n            unlike terminated instances where these volumes are automatically deleted. For more\\n            information about the differences between stopping, hibernating, rebooting, and\\n            terminating instances, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-lifecycle.html\\\">Amazon EC2\\n                instance state changes</a> in the <i>Amazon EC2 User Guide</i>.</p>\\n         <p>We don't charge for instance usage or data transfer fees when an instance is stopped.\\n            However, the root volume and any data volumes remain and continue to persist your data,\\n            and you're charged for volume usage. Every time you start your instance, Amazon EC2 charges a one-minute minimum for instance usage, followed by per-second\\n            billing.</p>\\n         <p>You can't stop or hibernate instance store-backed instances.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To stop a running EC2 instance\",\n                        \"documentation\": \"This example stops the specified EC2 instance.\",\n                        \"input\": {\n                            \"InstanceIds\": [\n                                \"i-1234567890abcdef0\"\n                            ]\n                        },\n                        \"output\": {\n                            \"StoppingInstances\": [\n                                {\n                                    \"InstanceId\": \"i-1234567890abcdef0\",\n                                    \"CurrentState\": {\n                                        \"Code\": 64,\n                                        \"Name\": \"stopping\"\n                                    },\n                                    \"PreviousState\": {\n                                        \"Code\": 16,\n                                        \"Name\": \"running\"\n                                    }\n                                }\n                            ]\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#StopInstancesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceIds\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceIdStringList\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The IDs of the instances.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"InstanceId\"\n                    }\n                },\n                \"Hibernate\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Hibernates the instance if the instance was enabled for hibernation at launch. If the\\n            instance cannot hibernate successfully, a normal shutdown occurs. For more information,\\n            see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Hibernate.html\\\">Hibernate\\n                your Amazon EC2 instance</a> in the\\n                <i>Amazon EC2 User Guide</i>.</p>\\n         <p> Default: <code>false</code>\\n         </p>\"\n                    }\n                },\n                \"SkipOsShutdown\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies whether to bypass the graceful OS shutdown process when the instance is\\n            stopped.</p>\\n         <important>\\n            <p>Bypassing the graceful OS shutdown might result in data loss or corruption (for\\n                example, memory contents not flushed to disk or loss of in-flight IOs) or skipped\\n                shutdown scripts.</p>\\n         </important>\\n         <p>Default: <code>false</code>\\n         </p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the operation, without actually making the \\n  request, and provides an error response. If you have the required permissions, the error response is \\n  <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                },\n                \"Force\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Force\",\n                        \"smithy.api#documentation\": \"<p>Forces the instance to stop. The instance will first attempt a graceful shutdown,\\n            which includes flushing file system caches and metadata. If the graceful shutdown fails\\n            to complete within the timeout period, the instance shuts down forcibly without flushing\\n            the file system caches and metadata.</p>\\n         <p>After using this option, you must perform file system check and repair procedures.\\n            This option is not recommended for Windows instances. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/TroubleshootingInstancesStopping.html\\\">Troubleshoot\\n                    Amazon EC2 instance stop issues</a> in the\\n                <i>Amazon EC2 User Guide</i>.</p>\\n         <p>Default: <code>false</code>\\n         </p>\",\n                        \"smithy.api#xmlName\": \"force\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#StopInstancesResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"StoppingInstances\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceStateChangeList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstancesSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the stopped instances.</p>\",\n                        \"smithy.api#xmlName\": \"instancesSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#Storage\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"S3\": {\n                    \"target\": \"com.amazonaws.ec2#S3Storage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An Amazon S3 storage location.</p>\",\n                        \"smithy.api#xmlName\": \"S3\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the storage location for an instance store-backed AMI.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#StorageLocation\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Bucket\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the S3 bucket.</p>\"\n                    }\n                },\n                \"Key\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The key.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a storage location in Amazon S3.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#StorageTier\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"archive\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"archive\"\n                    }\n                },\n                \"standard\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"standard\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#StoreImageTaskResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AmiId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AmiId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the AMI that is being stored.</p>\",\n                        \"smithy.api#xmlName\": \"amiId\"\n                    }\n                },\n                \"TaskStartTime\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TaskStartTime\",\n                        \"smithy.api#documentation\": \"<p>The time the task started.</p>\",\n                        \"smithy.api#xmlName\": \"taskStartTime\"\n                    }\n                },\n                \"Bucket\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Bucket\",\n                        \"smithy.api#documentation\": \"<p>The name of the Amazon S3 bucket that contains the stored AMI object.</p>\",\n                        \"smithy.api#xmlName\": \"bucket\"\n                    }\n                },\n                \"S3objectKey\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"S3objectKey\",\n                        \"smithy.api#documentation\": \"<p>The name of the stored AMI object in the bucket.</p>\",\n                        \"smithy.api#xmlName\": \"s3objectKey\"\n                    }\n                },\n                \"ProgressPercentage\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ProgressPercentage\",\n                        \"smithy.api#documentation\": \"<p>The progress of the task as a percentage.</p>\",\n                        \"smithy.api#xmlName\": \"progressPercentage\"\n                    }\n                },\n                \"StoreTaskState\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"StoreTaskState\",\n                        \"smithy.api#documentation\": \"<p>The state of the store task (<code>InProgress</code>, <code>Completed</code>, or\\n      <code>Failed</code>).</p>\",\n                        \"smithy.api#xmlName\": \"storeTaskState\"\n                    }\n                },\n                \"StoreTaskFailureReason\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"StoreTaskFailureReason\",\n                        \"smithy.api#documentation\": \"<p>If the tasks fails, the reason for the failure is returned. If the task succeeds,\\n      <code>null</code> is returned.</p>\",\n                        \"smithy.api#xmlName\": \"storeTaskFailureReason\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The information about the AMI store task, including the progress of the task.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#StoreImageTaskResultSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#StoreImageTaskResult\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#String\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#StringList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#String\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#StringType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 64000\n                }\n            }\n        },\n        \"com.amazonaws.ec2#Subnet\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AvailabilityZoneId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AvailabilityZoneId\",\n                        \"smithy.api#documentation\": \"<p>The AZ ID of the subnet.</p>\",\n                        \"smithy.api#xmlName\": \"availabilityZoneId\"\n                    }\n                },\n                \"EnableLniAtDeviceIndex\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EnableLniAtDeviceIndex\",\n                        \"smithy.api#documentation\": \"<p>\\n            Indicates the device position for local network interfaces in this subnet. For example, \\n            <code>1</code> indicates local network interfaces in this subnet are the secondary \\n            network interface (eth1). \\n        </p>\",\n                        \"smithy.api#xmlName\": \"enableLniAtDeviceIndex\"\n                    }\n                },\n                \"MapCustomerOwnedIpOnLaunch\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MapCustomerOwnedIpOnLaunch\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether a network interface created in this subnet (including a network\\n            interface created by <a>RunInstances</a>) receives a customer-owned IPv4 address.</p>\",\n                        \"smithy.api#xmlName\": \"mapCustomerOwnedIpOnLaunch\"\n                    }\n                },\n                \"CustomerOwnedIpv4Pool\": {\n                    \"target\": \"com.amazonaws.ec2#CoipPoolId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CustomerOwnedIpv4Pool\",\n                        \"smithy.api#documentation\": \"<p>The customer-owned IPv4 address pool associated with the subnet.</p>\",\n                        \"smithy.api#xmlName\": \"customerOwnedIpv4Pool\"\n                    }\n                },\n                \"OwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OwnerId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Amazon Web Services account that owns the subnet.</p>\",\n                        \"smithy.api#xmlName\": \"ownerId\"\n                    }\n                },\n                \"AssignIpv6AddressOnCreation\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AssignIpv6AddressOnCreation\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether a network interface created in this subnet (including a network\\n            interface created by <a>RunInstances</a>) receives an IPv6 address.</p>\",\n                        \"smithy.api#xmlName\": \"assignIpv6AddressOnCreation\"\n                    }\n                },\n                \"Ipv6CidrBlockAssociationSet\": {\n                    \"target\": \"com.amazonaws.ec2#SubnetIpv6CidrBlockAssociationSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Ipv6CidrBlockAssociationSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the IPv6 CIDR blocks associated with the subnet.</p>\",\n                        \"smithy.api#xmlName\": \"ipv6CidrBlockAssociationSet\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>Any tags assigned to the subnet.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                },\n                \"SubnetArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SubnetArn\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the subnet.</p>\",\n                        \"smithy.api#xmlName\": \"subnetArn\"\n                    }\n                },\n                \"OutpostArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OutpostArn\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the Outpost.</p>\",\n                        \"smithy.api#xmlName\": \"outpostArn\"\n                    }\n                },\n                \"EnableDns64\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EnableDns64\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether DNS queries made to the Amazon-provided DNS Resolver in this subnet \\n            should return synthetic IPv6 addresses for IPv4-only destinations.</p>\",\n                        \"smithy.api#xmlName\": \"enableDns64\"\n                    }\n                },\n                \"Ipv6Native\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Ipv6Native\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether this is an IPv6 only subnet.</p>\",\n                        \"smithy.api#xmlName\": \"ipv6Native\"\n                    }\n                },\n                \"PrivateDnsNameOptionsOnLaunch\": {\n                    \"target\": \"com.amazonaws.ec2#PrivateDnsNameOptionsOnLaunch\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PrivateDnsNameOptionsOnLaunch\",\n                        \"smithy.api#documentation\": \"<p>The type of hostnames to assign to instances in the subnet at launch. An instance hostname\\n            is based on the IPv4 address or ID of the instance.</p>\",\n                        \"smithy.api#xmlName\": \"privateDnsNameOptionsOnLaunch\"\n                    }\n                },\n                \"BlockPublicAccessStates\": {\n                    \"target\": \"com.amazonaws.ec2#BlockPublicAccessStates\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"BlockPublicAccessStates\",\n                        \"smithy.api#documentation\": \"<p>The state of VPC Block Public Access (BPA).</p>\",\n                        \"smithy.api#xmlName\": \"blockPublicAccessStates\"\n                    }\n                },\n                \"Type\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Type\",\n                        \"smithy.api#documentation\": \"<p>Indicates if this is a subnet used with Amazon Elastic VMware Service (EVS).\\n            Possible values are <code>Elastic VMware Service</code> or no value. For more\\n            information about Amazon EVS, see <a href=\\\"https://docs.aws.amazon.com/evs/latest/APIReference/Welcome.html\\\">\\n               <i>Amazon Elastic VMware Service\\n                    API Reference</i>\\n            </a>.</p>\",\n                        \"smithy.api#xmlName\": \"type\"\n                    }\n                },\n                \"SubnetId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SubnetId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the subnet.</p>\",\n                        \"smithy.api#xmlName\": \"subnetId\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#SubnetState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The current state of the subnet.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>failed</code>: The underlying infrastructure to support the subnet failed to provision\\n                    as expected.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>failed-insufficient-capacity</code>: The underlying infrastructure to support the subnet\\n                    failed to provision due to a shortage of EC2 instance capacity.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                },\n                \"VpcId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the VPC the subnet is in.</p>\",\n                        \"smithy.api#xmlName\": \"vpcId\"\n                    }\n                },\n                \"CidrBlock\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CidrBlock\",\n                        \"smithy.api#documentation\": \"<p>The IPv4 CIDR block assigned to the subnet.</p>\",\n                        \"smithy.api#xmlName\": \"cidrBlock\"\n                    }\n                },\n                \"AvailableIpAddressCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AvailableIpAddressCount\",\n                        \"smithy.api#documentation\": \"<p>The number of unused private IPv4 addresses in the subnet. The IPv4 addresses for any\\n\\t\\t\\tstopped instances are considered unavailable.</p>\",\n                        \"smithy.api#xmlName\": \"availableIpAddressCount\"\n                    }\n                },\n                \"AvailabilityZone\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AvailabilityZone\",\n                        \"smithy.api#documentation\": \"<p>The Availability Zone of the subnet.</p>\",\n                        \"smithy.api#xmlName\": \"availabilityZone\"\n                    }\n                },\n                \"DefaultForAz\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DefaultForAz\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether this is the default subnet for the Availability Zone.</p>\",\n                        \"smithy.api#xmlName\": \"defaultForAz\"\n                    }\n                },\n                \"MapPublicIpOnLaunch\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MapPublicIpOnLaunch\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether instances launched in this subnet receive a public IPv4 address.</p>\\n         <p>Amazon Web Services charges for all public IPv4 addresses, including public IPv4 addresses \\nassociated with running instances and Elastic IP addresses. For more information, see the <i>Public IPv4 Address</i> tab on the <a href=\\\"http://aws.amazon.com/vpc/pricing/\\\">Amazon VPC pricing page</a>.</p>\",\n                        \"smithy.api#xmlName\": \"mapPublicIpOnLaunch\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a subnet.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#SubnetAssociation\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SubnetId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SubnetId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the subnet.</p>\",\n                        \"smithy.api#xmlName\": \"subnetId\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayMulitcastDomainAssociationState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The state of the subnet association.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the subnet association with the transit gateway multicast domain.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#SubnetAssociationList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#SubnetAssociation\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#SubnetCidrAssociationId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#SubnetCidrBlockState\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#SubnetCidrBlockStateCode\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The state of a CIDR block.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                },\n                \"StatusMessage\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"StatusMessage\",\n                        \"smithy.api#documentation\": \"<p>A message about the status of the CIDR block, if applicable.</p>\",\n                        \"smithy.api#xmlName\": \"statusMessage\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the state of a CIDR block.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#SubnetCidrBlockStateCode\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"associating\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"associating\"\n                    }\n                },\n                \"associated\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"associated\"\n                    }\n                },\n                \"disassociating\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"disassociating\"\n                    }\n                },\n                \"disassociated\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"disassociated\"\n                    }\n                },\n                \"failing\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"failing\"\n                    }\n                },\n                \"failed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"failed\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#SubnetCidrReservation\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SubnetCidrReservationId\": {\n                    \"target\": \"com.amazonaws.ec2#SubnetCidrReservationId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SubnetCidrReservationId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the subnet CIDR reservation.</p>\",\n                        \"smithy.api#xmlName\": \"subnetCidrReservationId\"\n                    }\n                },\n                \"SubnetId\": {\n                    \"target\": \"com.amazonaws.ec2#SubnetId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SubnetId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the subnet.</p>\",\n                        \"smithy.api#xmlName\": \"subnetId\"\n                    }\n                },\n                \"Cidr\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Cidr\",\n                        \"smithy.api#documentation\": \"<p>The CIDR that has been reserved.</p>\",\n                        \"smithy.api#xmlName\": \"cidr\"\n                    }\n                },\n                \"ReservationType\": {\n                    \"target\": \"com.amazonaws.ec2#SubnetCidrReservationType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ReservationType\",\n                        \"smithy.api#documentation\": \"<p>The type of reservation. </p>\",\n                        \"smithy.api#xmlName\": \"reservationType\"\n                    }\n                },\n                \"OwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OwnerId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the account that owns the subnet CIDR reservation. </p>\",\n                        \"smithy.api#xmlName\": \"ownerId\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Description\",\n                        \"smithy.api#documentation\": \"<p>The description assigned to the subnet CIDR reservation.</p>\",\n                        \"smithy.api#xmlName\": \"description\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>The tags assigned to the subnet CIDR reservation.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a subnet CIDR reservation.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#SubnetCidrReservationId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#SubnetCidrReservationList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#SubnetCidrReservation\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#SubnetCidrReservationType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"prefix\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"prefix\"\n                    }\n                },\n                \"explicit\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"explicit\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#SubnetConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SubnetId\": {\n                    \"target\": \"com.amazonaws.ec2#SubnetId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the subnet.</p>\"\n                    }\n                },\n                \"Ipv4\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IPv4 address to assign to the endpoint network interface in the subnet. You must provide \\n            an IPv4 address if the VPC endpoint supports IPv4.</p>\\n         <p>If you specify an IPv4 address when modifying a VPC endpoint, we replace the existing \\n            endpoint network interface with a new endpoint network interface with this IP address. \\n            This process temporarily disconnects the subnet and the VPC endpoint.</p>\"\n                    }\n                },\n                \"Ipv6\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IPv6 address to assign to the endpoint network interface in the subnet. You must provide \\n            an IPv6 address if the VPC endpoint supports IPv6.</p>\\n         <p>If you specify an IPv6 address when modifying a VPC endpoint, we replace the existing \\n            endpoint network interface with a new endpoint network interface with this IP address. \\n            This process temporarily disconnects the subnet and the VPC endpoint.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the configuration of a subnet for a VPC endpoint.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#SubnetConfigurationsList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#SubnetConfiguration\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#SubnetId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#SubnetIdList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#SubnetId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"AssociatedSubnetId\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#SubnetIdStringList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#SubnetId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"SubnetId\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#SubnetIpPrefixes\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SubnetId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SubnetId\",\n                        \"smithy.api#documentation\": \"<p>ID of the subnet.</p>\",\n                        \"smithy.api#xmlName\": \"subnetId\"\n                    }\n                },\n                \"IpPrefixes\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpPrefixSet\",\n                        \"smithy.api#documentation\": \"<p>Array of SubnetIpPrefixes objects.</p>\",\n                        \"smithy.api#xmlName\": \"ipPrefixSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Prefixes of the subnet IP.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#SubnetIpPrefixesList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#SubnetIpPrefixes\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#SubnetIpv6CidrBlockAssociation\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AssociationId\": {\n                    \"target\": \"com.amazonaws.ec2#SubnetCidrAssociationId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AssociationId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the association.</p>\",\n                        \"smithy.api#xmlName\": \"associationId\"\n                    }\n                },\n                \"Ipv6CidrBlock\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Ipv6CidrBlock\",\n                        \"smithy.api#documentation\": \"<p>The IPv6 CIDR block.</p>\",\n                        \"smithy.api#xmlName\": \"ipv6CidrBlock\"\n                    }\n                },\n                \"Ipv6CidrBlockState\": {\n                    \"target\": \"com.amazonaws.ec2#SubnetCidrBlockState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Ipv6CidrBlockState\",\n                        \"smithy.api#documentation\": \"<p>The state of the CIDR block.</p>\",\n                        \"smithy.api#xmlName\": \"ipv6CidrBlockState\"\n                    }\n                },\n                \"Ipv6AddressAttribute\": {\n                    \"target\": \"com.amazonaws.ec2#Ipv6AddressAttribute\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Ipv6AddressAttribute\",\n                        \"smithy.api#documentation\": \"<p>Public IPv6 addresses are those advertised on the internet from Amazon Web Services. Private IP addresses are not and cannot be advertised on the internet from Amazon Web Services.</p>\",\n                        \"smithy.api#xmlName\": \"ipv6AddressAttribute\"\n                    }\n                },\n                \"IpSource\": {\n                    \"target\": \"com.amazonaws.ec2#IpSource\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpSource\",\n                        \"smithy.api#documentation\": \"<p>The source that allocated the IP address space. <code>byoip</code> or <code>amazon</code> indicates public IP address space allocated by Amazon or space that you have allocated with Bring your own IP (BYOIP). <code>none</code> indicates private space.</p>\",\n                        \"smithy.api#xmlName\": \"ipSource\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes an association between a subnet and an IPv6 CIDR block.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#SubnetIpv6CidrBlockAssociationSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#SubnetIpv6CidrBlockAssociation\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#SubnetList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#Subnet\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#SubnetState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"pending\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"pending\"\n                    }\n                },\n                \"available\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"available\"\n                    }\n                },\n                \"unavailable\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"unavailable\"\n                    }\n                },\n                \"failed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"failed\"\n                    }\n                },\n                \"failed_insufficient_capacity\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"failed-insufficient-capacity\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#Subscription\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Source\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Source\",\n                        \"smithy.api#documentation\": \"<p>The Region or Availability Zone that's the source for the subscription. For example, <code>us-east-1</code>.</p>\",\n                        \"smithy.api#xmlName\": \"source\"\n                    }\n                },\n                \"Destination\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Destination\",\n                        \"smithy.api#documentation\": \"<p>The Region or Availability Zone that's the target for the subscription. For example, <code>eu-west-1</code>.</p>\",\n                        \"smithy.api#xmlName\": \"destination\"\n                    }\n                },\n                \"Metric\": {\n                    \"target\": \"com.amazonaws.ec2#MetricType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Metric\",\n                        \"smithy.api#documentation\": \"<p>The metric used for the subscription.</p>\",\n                        \"smithy.api#xmlName\": \"metric\"\n                    }\n                },\n                \"Statistic\": {\n                    \"target\": \"com.amazonaws.ec2#StatisticType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Statistic\",\n                        \"smithy.api#documentation\": \"<p>The statistic used for the subscription.</p>\",\n                        \"smithy.api#xmlName\": \"statistic\"\n                    }\n                },\n                \"Period\": {\n                    \"target\": \"com.amazonaws.ec2#PeriodType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Period\",\n                        \"smithy.api#documentation\": \"<p>The data aggregation time for the subscription.</p>\",\n                        \"smithy.api#xmlName\": \"period\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes an Infrastructure Performance subscription.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#SubscriptionList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#Subscription\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#SuccessfulInstanceCreditSpecificationItem\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the instance.</p>\",\n                        \"smithy.api#xmlName\": \"instanceId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the burstable performance instance whose credit option for CPU usage was\\n            successfully modified.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#SuccessfulInstanceCreditSpecificationSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#SuccessfulInstanceCreditSpecificationItem\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#SuccessfulQueuedPurchaseDeletion\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ReservedInstancesId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ReservedInstancesId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Reserved Instance.</p>\",\n                        \"smithy.api#xmlName\": \"reservedInstancesId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a Reserved Instance whose queued purchase was successfully deleted.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#SuccessfulQueuedPurchaseDeletionSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#SuccessfulQueuedPurchaseDeletion\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#SummaryStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ok\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ok\"\n                    }\n                },\n                \"impaired\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"impaired\"\n                    }\n                },\n                \"insufficient_data\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"insufficient-data\"\n                    }\n                },\n                \"not_applicable\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"not-applicable\"\n                    }\n                },\n                \"initializing\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"initializing\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#SupportedAdditionalProcessorFeature\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"AMD_SEV_SNP\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"amd-sev-snp\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#SupportedAdditionalProcessorFeatureList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#SupportedAdditionalProcessorFeature\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#SupportedIpAddressTypes\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ServiceConnectivityType\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 2\n                }\n            }\n        },\n        \"com.amazonaws.ec2#SupportedRegionDetail\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Region\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Region\",\n                        \"smithy.api#documentation\": \"<p>The Region code.</p>\",\n                        \"smithy.api#xmlName\": \"region\"\n                    }\n                },\n                \"ServiceState\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ServiceState\",\n                        \"smithy.api#documentation\": \"<p>The service state. The possible values are <code>Pending</code>, <code>Available</code>, \\n            <code>Deleting</code>, <code>Deleted</code>, <code>Failed</code>, and <code>Closed</code>.</p>\",\n                        \"smithy.api#xmlName\": \"serviceState\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a supported Region.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#SupportedRegionSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#SupportedRegionDetail\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#Tag\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Key\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Key\",\n                        \"smithy.api#documentation\": \"<p>The key of the tag.</p>\\n         <p>Constraints: Tag keys are case-sensitive and accept a maximum of 127 Unicode characters. \\n         May not begin with <code>aws:</code>.</p>\",\n                        \"smithy.api#xmlName\": \"key\"\n                    }\n                },\n                \"Value\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Value\",\n                        \"smithy.api#documentation\": \"<p>The value of the tag.</p>\\n         <p>Constraints: Tag values are case-sensitive and accept a maximum of 256 Unicode characters.</p>\",\n                        \"smithy.api#xmlName\": \"value\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a tag.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#TagDescription\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Key\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Key\",\n                        \"smithy.api#documentation\": \"<p>The tag key.</p>\",\n                        \"smithy.api#xmlName\": \"key\"\n                    }\n                },\n                \"ResourceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResourceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the resource.</p>\",\n                        \"smithy.api#xmlName\": \"resourceId\"\n                    }\n                },\n                \"ResourceType\": {\n                    \"target\": \"com.amazonaws.ec2#ResourceType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResourceType\",\n                        \"smithy.api#documentation\": \"<p>The resource type.</p>\",\n                        \"smithy.api#xmlName\": \"resourceType\"\n                    }\n                },\n                \"Value\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Value\",\n                        \"smithy.api#documentation\": \"<p>The tag value.</p>\",\n                        \"smithy.api#xmlName\": \"value\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a tag.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#TagDescriptionList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#TagDescription\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TagList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#Tag\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TagSpecification\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ResourceType\": {\n                    \"target\": \"com.amazonaws.ec2#ResourceType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResourceType\",\n                        \"smithy.api#documentation\": \"<p>The type of resource to tag on creation.</p>\",\n                        \"smithy.api#xmlName\": \"resourceType\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags to apply to the resource.</p>\",\n                        \"smithy.api#xmlName\": \"Tag\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The tags to apply to a resource when the resource is being created. When you specify a tag, you must \\n       specify the resource type to tag, otherwise the request will fail.</p>\\n         <note>\\n            <p>The <code>Valid Values</code> lists all the resource types that can be tagged.\\n            However, the action you're using might not support tagging all of these resource types.\\n            If you try to tag a resource type that is unsupported for the action you're using,\\n            you'll get an error.</p>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.ec2#TagSpecificationList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#TagSpecification\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TaggableResourceId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#TargetCapacitySpecification\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TotalTargetCapacity\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TotalTargetCapacity\",\n                        \"smithy.api#documentation\": \"<p>The number of units to request, filled the default target capacity type.</p>\",\n                        \"smithy.api#xmlName\": \"totalTargetCapacity\"\n                    }\n                },\n                \"OnDemandTargetCapacity\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OnDemandTargetCapacity\",\n                        \"smithy.api#documentation\": \"<p>The number of On-Demand units to request. If you specify a target capacity for Spot units, you cannot specify a target capacity for On-Demand units.</p>\",\n                        \"smithy.api#xmlName\": \"onDemandTargetCapacity\"\n                    }\n                },\n                \"SpotTargetCapacity\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SpotTargetCapacity\",\n                        \"smithy.api#documentation\": \"<p>The maximum number of Spot units to launch. If you specify a target capacity for On-Demand units, you cannot specify a target capacity for Spot units.</p>\",\n                        \"smithy.api#xmlName\": \"spotTargetCapacity\"\n                    }\n                },\n                \"DefaultTargetCapacityType\": {\n                    \"target\": \"com.amazonaws.ec2#DefaultTargetCapacityType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DefaultTargetCapacityType\",\n                        \"smithy.api#documentation\": \"<p>The default target capacity type.</p>\",\n                        \"smithy.api#xmlName\": \"defaultTargetCapacityType\"\n                    }\n                },\n                \"TargetCapacityUnitType\": {\n                    \"target\": \"com.amazonaws.ec2#TargetCapacityUnitType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TargetCapacityUnitType\",\n                        \"smithy.api#documentation\": \"<p>The unit for the target capacity.</p>\",\n                        \"smithy.api#xmlName\": \"targetCapacityUnitType\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The number of units to request. You can choose to set the target capacity in terms of\\n         instances or a performance characteristic that is important to your application workload,\\n         such as vCPUs, memory, or I/O. If the request type is <code>maintain</code>, you can\\n         specify a target capacity of 0 and add capacity later.</p>\\n         <p>You can use the On-Demand Instance <code>MaxTotalPrice</code> parameter, the Spot Instance\\n            <code>MaxTotalPrice</code>, or both to ensure that your fleet cost does not exceed your\\n         budget. If you set a maximum price per hour for the On-Demand Instances and Spot Instances in your request, EC2 Fleet\\n         will launch instances until it reaches the maximum amount that you're willing to pay. When\\n         the maximum amount you're willing to pay is reached, the fleet stops launching instances\\n         even if it hasn’t met the target capacity. The <code>MaxTotalPrice</code> parameters are\\n         located in <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_OnDemandOptions.html\\\">OnDemandOptions</a> \\n         and <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_SpotOptions\\\">SpotOptions</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#TargetCapacitySpecificationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TotalTargetCapacity\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The number of units to request, filled using the default target capacity type.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"OnDemandTargetCapacity\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of On-Demand units to request.</p>\"\n                    }\n                },\n                \"SpotTargetCapacity\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of Spot units to request.</p>\"\n                    }\n                },\n                \"DefaultTargetCapacityType\": {\n                    \"target\": \"com.amazonaws.ec2#DefaultTargetCapacityType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The default target capacity type.</p>\"\n                    }\n                },\n                \"TargetCapacityUnitType\": {\n                    \"target\": \"com.amazonaws.ec2#TargetCapacityUnitType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The unit for the target capacity. You can specify this parameter only when using\\n         attributed-based instance type selection.</p>\\n         <p>Default: <code>units</code> (the number of instances)</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The number of units to request. You can choose to set the target capacity as the number of \\n         instances. Or you can set the target capacity to a performance characteristic that is important to your application workload,\\n         such as vCPUs, memory, or I/O. If the request type is <code>maintain</code>, you can\\n         specify a target capacity of 0 and add capacity later.</p>\\n         <p>You can use the On-Demand Instance <code>MaxTotalPrice</code> parameter, the Spot Instance\\n            <code>MaxTotalPrice</code> parameter, or both parameters to ensure that your fleet cost\\n         does not exceed your budget. If you set a maximum price per hour for the On-Demand Instances and Spot Instances\\n         in your request, EC2 Fleet will launch instances until it reaches the maximum amount that you're\\n         willing to pay. When the maximum amount you're willing to pay is reached, the fleet stops\\n         launching instances even if it hasn't met the target capacity. The\\n         <code>MaxTotalPrice</code> parameters are located in <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_OnDemandOptionsRequest\\\">OnDemandOptionsRequest</a> \\n         and <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_SpotOptionsRequest\\\">SpotOptionsRequest</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#TargetCapacityUnitType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"VCPU\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"vcpu\"\n                    }\n                },\n                \"MEMORY_MIB\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"memory-mib\"\n                    }\n                },\n                \"UNITS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"units\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TargetConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceCount\",\n                        \"smithy.api#documentation\": \"<p>The number of instances the Convertible Reserved Instance offering can be applied to. This\\n      parameter is reserved and cannot be specified in a request</p>\",\n                        \"smithy.api#xmlName\": \"instanceCount\"\n                    }\n                },\n                \"OfferingId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OfferingId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Convertible Reserved Instance offering.</p>\",\n                        \"smithy.api#xmlName\": \"offeringId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about the Convertible Reserved Instance offering.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#TargetConfigurationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of instances the Convertible Reserved Instance offering can be applied to. This\\n      parameter is reserved and cannot be specified in a request</p>\"\n                    }\n                },\n                \"OfferingId\": {\n                    \"target\": \"com.amazonaws.ec2#ReservedInstancesOfferingId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The Convertible Reserved Instance offering ID.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Details about the target configuration.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#TargetConfigurationRequestSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#TargetConfigurationRequest\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"TargetConfigurationRequest\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TargetGroup\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Arn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Arn\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the target group.</p>\",\n                        \"smithy.api#xmlName\": \"arn\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a load balancer target group.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#TargetGroups\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#TargetGroup\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 5\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TargetGroupsConfig\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TargetGroups\": {\n                    \"target\": \"com.amazonaws.ec2#TargetGroups\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TargetGroups\",\n                        \"smithy.api#documentation\": \"<p>One or more target groups.</p>\",\n                        \"smithy.api#xmlName\": \"targetGroups\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the target groups to attach to a Spot Fleet. Spot Fleet registers the\\n            running Spot Instances with these target groups.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#TargetNetwork\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AssociationId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AssociationId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the association.</p>\",\n                        \"smithy.api#xmlName\": \"associationId\"\n                    }\n                },\n                \"VpcId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the VPC in which the target network (subnet) is located.</p>\",\n                        \"smithy.api#xmlName\": \"vpcId\"\n                    }\n                },\n                \"TargetNetworkId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TargetNetworkId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the subnet specified as the target network.</p>\",\n                        \"smithy.api#xmlName\": \"targetNetworkId\"\n                    }\n                },\n                \"ClientVpnEndpointId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ClientVpnEndpointId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Client VPN endpoint with which the target network is associated.</p>\",\n                        \"smithy.api#xmlName\": \"clientVpnEndpointId\"\n                    }\n                },\n                \"Status\": {\n                    \"target\": \"com.amazonaws.ec2#AssociationStatus\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Status\",\n                        \"smithy.api#documentation\": \"<p>The current state of the target network association.</p>\",\n                        \"smithy.api#xmlName\": \"status\"\n                    }\n                },\n                \"SecurityGroups\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SecurityGroups\",\n                        \"smithy.api#documentation\": \"<p>The IDs of the security groups applied to the target network association.</p>\",\n                        \"smithy.api#xmlName\": \"securityGroups\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a target network associated with a Client VPN endpoint.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#TargetNetworkSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#TargetNetwork\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TargetReservationValue\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ReservationValue\": {\n                    \"target\": \"com.amazonaws.ec2#ReservationValue\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ReservationValue\",\n                        \"smithy.api#documentation\": \"<p>The total value of the Convertible Reserved Instances that make up the exchange. This is\\n      the sum of the list value, remaining upfront price, and additional upfront cost of the\\n      exchange.</p>\",\n                        \"smithy.api#xmlName\": \"reservationValue\"\n                    }\n                },\n                \"TargetConfiguration\": {\n                    \"target\": \"com.amazonaws.ec2#TargetConfiguration\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TargetConfiguration\",\n                        \"smithy.api#documentation\": \"<p>The configuration of the Convertible Reserved Instances that make up the exchange.</p>\",\n                        \"smithy.api#xmlName\": \"targetConfiguration\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The total value of the new Convertible Reserved Instances.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#TargetReservationValueSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#TargetReservationValue\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TargetStorageTier\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"archive\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"archive\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TelemetryStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"UP\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"UP\"\n                    }\n                },\n                \"DOWN\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DOWN\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#Tenancy\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"default\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"default\"\n                    }\n                },\n                \"dedicated\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"dedicated\"\n                    }\n                },\n                \"host\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"host\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TerminateClientVpnConnections\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#TerminateClientVpnConnectionsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#TerminateClientVpnConnectionsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Terminates active Client VPN endpoint connections. This action can be used to terminate a specific client connection, or up to five connections established by a specific user.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#TerminateClientVpnConnectionsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ClientVpnEndpointId\": {\n                    \"target\": \"com.amazonaws.ec2#ClientVpnEndpointId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the Client VPN endpoint to which the client is connected.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ConnectionId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the client connection to be terminated.</p>\"\n                    }\n                },\n                \"Username\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the user who initiated the connection. Use this option to terminate all active connections for \\n\\t\\t\\tthe specified user. This option can only be used if the user has established up to five connections.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#TerminateClientVpnConnectionsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ClientVpnEndpointId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ClientVpnEndpointId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Client VPN endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"clientVpnEndpointId\"\n                    }\n                },\n                \"Username\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Username\",\n                        \"smithy.api#documentation\": \"<p>The user who established the terminated client connections.</p>\",\n                        \"smithy.api#xmlName\": \"username\"\n                    }\n                },\n                \"ConnectionStatuses\": {\n                    \"target\": \"com.amazonaws.ec2#TerminateConnectionStatusSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ConnectionStatuses\",\n                        \"smithy.api#documentation\": \"<p>The current state of the client connections.</p>\",\n                        \"smithy.api#xmlName\": \"connectionStatuses\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#TerminateConnectionStatus\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConnectionId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ConnectionId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the client connection.</p>\",\n                        \"smithy.api#xmlName\": \"connectionId\"\n                    }\n                },\n                \"PreviousStatus\": {\n                    \"target\": \"com.amazonaws.ec2#ClientVpnConnectionStatus\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PreviousStatus\",\n                        \"smithy.api#documentation\": \"<p>The state of the client connection.</p>\",\n                        \"smithy.api#xmlName\": \"previousStatus\"\n                    }\n                },\n                \"CurrentStatus\": {\n                    \"target\": \"com.amazonaws.ec2#ClientVpnConnectionStatus\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CurrentStatus\",\n                        \"smithy.api#documentation\": \"<p>A message about the status of the client connection, if applicable.</p>\",\n                        \"smithy.api#xmlName\": \"currentStatus\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about a terminated Client VPN endpoint client connection.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#TerminateConnectionStatusSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#TerminateConnectionStatus\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TerminateInstances\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#TerminateInstancesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#TerminateInstancesResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Shuts down the specified instances. This operation is <a href=\\\"https://docs.aws.amazon.com/ec2/latest/devguide/ec2-api-idempotency.html\\\">idempotent</a>; if you\\n            terminate an instance more than once, each call succeeds.</p>\\n         <p>If you specify multiple instances and the request fails (for example, because of a\\n            single incorrect instance ID), none of the instances are terminated.</p>\\n         <p>If you terminate multiple instances across multiple Availability Zones, and one or\\n            more of the specified instances are enabled for termination protection, the request\\n            fails with the following results:</p>\\n         <ul>\\n            <li>\\n               <p>The specified instances that are in the same Availability Zone as the\\n                    protected instance are not terminated.</p>\\n            </li>\\n            <li>\\n               <p>The specified instances that are in different Availability Zones, where no\\n                    other specified instances are protected, are successfully terminated.</p>\\n            </li>\\n         </ul>\\n         <p>For example, say you have the following instances:</p>\\n         <ul>\\n            <li>\\n               <p>Instance A: <code>us-east-1a</code>; Not protected</p>\\n            </li>\\n            <li>\\n               <p>Instance B: <code>us-east-1a</code>; Not protected</p>\\n            </li>\\n            <li>\\n               <p>Instance C: <code>us-east-1b</code>; Protected</p>\\n            </li>\\n            <li>\\n               <p>Instance D: <code>us-east-1b</code>; not protected</p>\\n            </li>\\n         </ul>\\n         <p>If you attempt to terminate all of these instances in the same request, the request\\n            reports failure with the following results:</p>\\n         <ul>\\n            <li>\\n               <p>Instance A and Instance B are successfully terminated because none of the\\n                    specified instances in <code>us-east-1a</code> are enabled for termination\\n                    protection.</p>\\n            </li>\\n            <li>\\n               <p>Instance C and Instance D fail to terminate because at least one of the\\n                    specified instances in <code>us-east-1b</code> (Instance C) is enabled for\\n                    termination protection.</p>\\n            </li>\\n         </ul>\\n         <p>Terminated instances remain visible after termination (for approximately one\\n            hour).</p>\\n         <p>By default, Amazon EC2 deletes all EBS volumes that were attached when the instance\\n            launched. Volumes attached after instance launch continue running.</p>\\n         <p>By default, the TerminateInstances operation includes a graceful operating system (OS)\\n            shutdown. To bypass the graceful shutdown, use the <code>skipOsShutdown</code>\\n            parameter; however, this might risk data integrity.</p>\\n         <p>You can stop, start, and terminate EBS-backed instances. You can only terminate\\n            instance store-backed instances. What happens to an instance differs if you stop or\\n            terminate it. For example, when you stop an instance, the root device and any other\\n            devices attached to the instance persist. When you terminate an instance, any attached\\n            EBS volumes with the <code>DeleteOnTermination</code> block device mapping parameter set\\n            to <code>true</code> are automatically deleted. For more information about the\\n            differences between stopping and terminating instances, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-lifecycle.html\\\">Amazon EC2\\n                instance state changes</a> in the <i>Amazon EC2 User Guide</i>.</p>\\n         <p>When you terminate an instance, we attempt to terminate it forcibly after a short\\n            while. If your instance appears stuck in the shutting-down state after a period of time,\\n            there might be an issue with the underlying host computer. For more information about\\n            terminating and troubleshooting terminating your instances, see <a href=\\\"https://docs.aws.amazon.com/\\\">Terminate Amazon EC2 instances</a> and\\n                <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/TroubleshootingInstancesShuttingDown.html\\\">Troubleshooting terminating your instance</a> in the\\n                <i>Amazon EC2 User Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To terminate an EC2 instance\",\n                        \"documentation\": \"This example terminates the specified EC2 instance.\",\n                        \"input\": {\n                            \"InstanceIds\": [\n                                \"i-1234567890abcdef0\"\n                            ]\n                        },\n                        \"output\": {\n                            \"TerminatingInstances\": [\n                                {\n                                    \"InstanceId\": \"i-1234567890abcdef0\",\n                                    \"CurrentState\": {\n                                        \"Code\": 32,\n                                        \"Name\": \"shutting-down\"\n                                    },\n                                    \"PreviousState\": {\n                                        \"Code\": 16,\n                                        \"Name\": \"running\"\n                                    }\n                                }\n                            ]\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#TerminateInstancesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceIds\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceIdStringList\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The IDs of the instances.</p>\\n         <p>Constraints: Up to 1000 instance IDs. We recommend breaking up this request into\\n            smaller batches.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"InstanceId\"\n                    }\n                },\n                \"Force\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Forces the instances to terminate. The instance will first attempt a graceful\\n            shutdown, which includes flushing file system caches and metadata. If the graceful\\n            shutdown fails to complete within the timeout period, the instance shuts down forcibly\\n            without flushing the file system caches and metadata.</p>\"\n                    }\n                },\n                \"SkipOsShutdown\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies whether to bypass the graceful OS shutdown process when the instance is\\n            terminated.</p>\\n         <p>Default: <code>false</code>\\n         </p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the operation, without actually making the \\n  request, and provides an error response. If you have the required permissions, the error response is \\n  <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#TerminateInstancesResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TerminatingInstances\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceStateChangeList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstancesSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the terminated instances.</p>\",\n                        \"smithy.api#xmlName\": \"instancesSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ThreadsPerCore\": {\n            \"type\": \"integer\"\n        },\n        \"com.amazonaws.ec2#ThreadsPerCoreList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ThreadsPerCore\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ThroughResourcesStatement\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ResourceStatement\": {\n                    \"target\": \"com.amazonaws.ec2#ResourceStatement\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResourceStatement\",\n                        \"smithy.api#documentation\": \"<p>The resource statement.</p>\",\n                        \"smithy.api#xmlName\": \"resourceStatement\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a through resource statement.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ThroughResourcesStatementList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ThroughResourcesStatement\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ThroughResourcesStatementRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ResourceStatement\": {\n                    \"target\": \"com.amazonaws.ec2#ResourceStatementRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The resource statement.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a through resource statement.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ThroughResourcesStatementRequestList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#ThroughResourcesStatementRequest\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TieringOperationStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"archival_in_progress\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"archival-in-progress\"\n                    }\n                },\n                \"archival_completed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"archival-completed\"\n                    }\n                },\n                \"archival_failed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"archival-failed\"\n                    }\n                },\n                \"temporary_restore_in_progress\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"temporary-restore-in-progress\"\n                    }\n                },\n                \"temporary_restore_completed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"temporary-restore-completed\"\n                    }\n                },\n                \"temporary_restore_failed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"temporary-restore-failed\"\n                    }\n                },\n                \"permanent_restore_in_progress\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"permanent-restore-in-progress\"\n                    }\n                },\n                \"permanent_restore_completed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"permanent-restore-completed\"\n                    }\n                },\n                \"permanent_restore_failed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"permanent-restore-failed\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TokenState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"valid\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"valid\"\n                    }\n                },\n                \"expired\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"expired\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TotalLocalStorageGB\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Min\": {\n                    \"target\": \"com.amazonaws.ec2#Double\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Min\",\n                        \"smithy.api#documentation\": \"<p>The minimum amount of total local storage, in GB. If this parameter is not specified, there is\\n         no minimum limit.</p>\",\n                        \"smithy.api#xmlName\": \"min\"\n                    }\n                },\n                \"Max\": {\n                    \"target\": \"com.amazonaws.ec2#Double\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Max\",\n                        \"smithy.api#documentation\": \"<p>The maximum amount of total local storage, in GB. If this parameter is not specified, there is\\n         no maximum limit.</p>\",\n                        \"smithy.api#xmlName\": \"max\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The minimum and maximum amount of total local storage, in GB.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#TotalLocalStorageGBRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Min\": {\n                    \"target\": \"com.amazonaws.ec2#Double\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The minimum amount of total local storage, in GB. To specify no minimum limit, omit this\\n         parameter.</p>\"\n                    }\n                },\n                \"Max\": {\n                    \"target\": \"com.amazonaws.ec2#Double\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum amount of total local storage, in GB. To specify no maximum limit, omit this\\n         parameter.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The minimum and maximum amount of total local storage, in GB.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#TotalMediaMemory\": {\n            \"type\": \"integer\"\n        },\n        \"com.amazonaws.ec2#TotalNeuronMemory\": {\n            \"type\": \"integer\"\n        },\n        \"com.amazonaws.ec2#TpmSupportValues\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"v2_0\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"v2.0\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TrafficDirection\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ingress\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ingress\"\n                    }\n                },\n                \"egress\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"egress\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TrafficIpAddressType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ipv4\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ipv4\"\n                    }\n                },\n                \"ipv6\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ipv6\"\n                    }\n                },\n                \"dual_stack\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"dual-stack\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TrafficMirrorFilter\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TrafficMirrorFilterId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TrafficMirrorFilterId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Traffic Mirror filter.</p>\",\n                        \"smithy.api#xmlName\": \"trafficMirrorFilterId\"\n                    }\n                },\n                \"IngressFilterRules\": {\n                    \"target\": \"com.amazonaws.ec2#TrafficMirrorFilterRuleList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IngressFilterRuleSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the ingress rules that are associated with the Traffic Mirror filter.</p>\",\n                        \"smithy.api#xmlName\": \"ingressFilterRuleSet\"\n                    }\n                },\n                \"EgressFilterRules\": {\n                    \"target\": \"com.amazonaws.ec2#TrafficMirrorFilterRuleList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EgressFilterRuleSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the egress rules that are associated with the Traffic Mirror filter.</p>\",\n                        \"smithy.api#xmlName\": \"egressFilterRuleSet\"\n                    }\n                },\n                \"NetworkServices\": {\n                    \"target\": \"com.amazonaws.ec2#TrafficMirrorNetworkServiceList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkServiceSet\",\n                        \"smithy.api#documentation\": \"<p>The network service traffic that is associated with the Traffic Mirror filter.</p>\",\n                        \"smithy.api#xmlName\": \"networkServiceSet\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Description\",\n                        \"smithy.api#documentation\": \"<p>The description of the Traffic Mirror filter.</p>\",\n                        \"smithy.api#xmlName\": \"description\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>The tags assigned to the Traffic Mirror filter.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the Traffic Mirror filter.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#TrafficMirrorFilterId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#TrafficMirrorFilterIdList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#TrafficMirrorFilterId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TrafficMirrorFilterRule\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TrafficMirrorFilterRuleId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TrafficMirrorFilterRuleId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Traffic Mirror rule.</p>\",\n                        \"smithy.api#xmlName\": \"trafficMirrorFilterRuleId\"\n                    }\n                },\n                \"TrafficMirrorFilterId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TrafficMirrorFilterId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Traffic Mirror filter that the rule is associated with.</p>\",\n                        \"smithy.api#xmlName\": \"trafficMirrorFilterId\"\n                    }\n                },\n                \"TrafficDirection\": {\n                    \"target\": \"com.amazonaws.ec2#TrafficDirection\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TrafficDirection\",\n                        \"smithy.api#documentation\": \"<p>The traffic direction assigned to the Traffic Mirror rule.</p>\",\n                        \"smithy.api#xmlName\": \"trafficDirection\"\n                    }\n                },\n                \"RuleNumber\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RuleNumber\",\n                        \"smithy.api#documentation\": \"<p>The rule number of the Traffic Mirror rule.</p>\",\n                        \"smithy.api#xmlName\": \"ruleNumber\"\n                    }\n                },\n                \"RuleAction\": {\n                    \"target\": \"com.amazonaws.ec2#TrafficMirrorRuleAction\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RuleAction\",\n                        \"smithy.api#documentation\": \"<p>The action assigned to the Traffic Mirror rule.</p>\",\n                        \"smithy.api#xmlName\": \"ruleAction\"\n                    }\n                },\n                \"Protocol\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Protocol\",\n                        \"smithy.api#documentation\": \"<p>The protocol assigned to the Traffic Mirror rule.</p>\",\n                        \"smithy.api#xmlName\": \"protocol\"\n                    }\n                },\n                \"DestinationPortRange\": {\n                    \"target\": \"com.amazonaws.ec2#TrafficMirrorPortRange\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DestinationPortRange\",\n                        \"smithy.api#documentation\": \"<p>The destination port range assigned to the Traffic Mirror rule.</p>\",\n                        \"smithy.api#xmlName\": \"destinationPortRange\"\n                    }\n                },\n                \"SourcePortRange\": {\n                    \"target\": \"com.amazonaws.ec2#TrafficMirrorPortRange\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SourcePortRange\",\n                        \"smithy.api#documentation\": \"<p>The source port range assigned to the Traffic Mirror rule.</p>\",\n                        \"smithy.api#xmlName\": \"sourcePortRange\"\n                    }\n                },\n                \"DestinationCidrBlock\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DestinationCidrBlock\",\n                        \"smithy.api#documentation\": \"<p>The destination CIDR block assigned to the Traffic Mirror rule.</p>\",\n                        \"smithy.api#xmlName\": \"destinationCidrBlock\"\n                    }\n                },\n                \"SourceCidrBlock\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SourceCidrBlock\",\n                        \"smithy.api#documentation\": \"<p>The source CIDR block assigned to the Traffic Mirror rule.</p>\",\n                        \"smithy.api#xmlName\": \"sourceCidrBlock\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Description\",\n                        \"smithy.api#documentation\": \"<p>The description of the Traffic Mirror rule.</p>\",\n                        \"smithy.api#xmlName\": \"description\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>Tags on Traffic Mirroring filter rules.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the Traffic Mirror rule.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#TrafficMirrorFilterRuleField\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"destination_port_range\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"destination-port-range\"\n                    }\n                },\n                \"source_port_range\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"source-port-range\"\n                    }\n                },\n                \"protocol\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"protocol\"\n                    }\n                },\n                \"description\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"description\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TrafficMirrorFilterRuleFieldList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#TrafficMirrorFilterRuleField\"\n            }\n        },\n        \"com.amazonaws.ec2#TrafficMirrorFilterRuleIdList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#TrafficMirrorFilterRuleIdWithResolver\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TrafficMirrorFilterRuleIdWithResolver\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#TrafficMirrorFilterRuleList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#TrafficMirrorFilterRule\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TrafficMirrorFilterRuleSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#TrafficMirrorFilterRule\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TrafficMirrorFilterSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#TrafficMirrorFilter\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TrafficMirrorNetworkService\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"amazon_dns\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"amazon-dns\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TrafficMirrorNetworkServiceList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#TrafficMirrorNetworkService\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TrafficMirrorPortRange\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"FromPort\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"FromPort\",\n                        \"smithy.api#documentation\": \"<p>The start of the Traffic Mirror port range. This applies to the TCP and UDP protocols.</p>\",\n                        \"smithy.api#xmlName\": \"fromPort\"\n                    }\n                },\n                \"ToPort\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ToPort\",\n                        \"smithy.api#documentation\": \"<p>The end of the Traffic Mirror port range. This applies to the TCP and UDP protocols.</p>\",\n                        \"smithy.api#xmlName\": \"toPort\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the Traffic Mirror port range.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#TrafficMirrorPortRangeRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"FromPort\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The first port in the Traffic Mirror port range. This applies to the TCP and UDP protocols.</p>\"\n                    }\n                },\n                \"ToPort\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The last port in the Traffic Mirror port range. This applies to the TCP and UDP protocols.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about the Traffic Mirror filter rule port range.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#TrafficMirrorRuleAction\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"accept\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"accept\"\n                    }\n                },\n                \"reject\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"reject\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TrafficMirrorSession\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TrafficMirrorSessionId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TrafficMirrorSessionId\",\n                        \"smithy.api#documentation\": \"<p>The ID for the Traffic Mirror session.</p>\",\n                        \"smithy.api#xmlName\": \"trafficMirrorSessionId\"\n                    }\n                },\n                \"TrafficMirrorTargetId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TrafficMirrorTargetId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Traffic Mirror target.</p>\",\n                        \"smithy.api#xmlName\": \"trafficMirrorTargetId\"\n                    }\n                },\n                \"TrafficMirrorFilterId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TrafficMirrorFilterId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Traffic Mirror filter.</p>\",\n                        \"smithy.api#xmlName\": \"trafficMirrorFilterId\"\n                    }\n                },\n                \"NetworkInterfaceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkInterfaceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Traffic Mirror session's network interface.</p>\",\n                        \"smithy.api#xmlName\": \"networkInterfaceId\"\n                    }\n                },\n                \"OwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OwnerId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the account that owns the Traffic Mirror session.</p>\",\n                        \"smithy.api#xmlName\": \"ownerId\"\n                    }\n                },\n                \"PacketLength\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PacketLength\",\n                        \"smithy.api#documentation\": \"<p>The number of bytes in each packet to mirror. These are the bytes after the VXLAN header. To mirror a subset, set this to the length (in bytes) to mirror. For example, if you set this value to 100, then the first 100 bytes that meet the filter criteria are copied to the target. Do not specify this parameter when you want to mirror the entire packet</p>\",\n                        \"smithy.api#xmlName\": \"packetLength\"\n                    }\n                },\n                \"SessionNumber\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SessionNumber\",\n                        \"smithy.api#documentation\": \"<p>The session number determines the order in which sessions are evaluated when an interface is used by multiple sessions. The first session with a matching filter is the one that mirrors the packets.</p>\\n         <p>Valid values are 1-32766.</p>\",\n                        \"smithy.api#xmlName\": \"sessionNumber\"\n                    }\n                },\n                \"VirtualNetworkId\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VirtualNetworkId\",\n                        \"smithy.api#documentation\": \"<p>The virtual network ID associated with the Traffic Mirror session.</p>\",\n                        \"smithy.api#xmlName\": \"virtualNetworkId\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Description\",\n                        \"smithy.api#documentation\": \"<p>The description of the Traffic Mirror session.</p>\",\n                        \"smithy.api#xmlName\": \"description\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>The tags assigned to the Traffic Mirror session.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a Traffic Mirror session.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#TrafficMirrorSessionField\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"packet_length\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"packet-length\"\n                    }\n                },\n                \"description\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"description\"\n                    }\n                },\n                \"virtual_network_id\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"virtual-network-id\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TrafficMirrorSessionFieldList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#TrafficMirrorSessionField\"\n            }\n        },\n        \"com.amazonaws.ec2#TrafficMirrorSessionId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#TrafficMirrorSessionIdList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#TrafficMirrorSessionId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TrafficMirrorSessionSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#TrafficMirrorSession\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TrafficMirrorTarget\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TrafficMirrorTargetId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TrafficMirrorTargetId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Traffic Mirror target.</p>\",\n                        \"smithy.api#xmlName\": \"trafficMirrorTargetId\"\n                    }\n                },\n                \"NetworkInterfaceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkInterfaceId\",\n                        \"smithy.api#documentation\": \"<p>The network interface ID that is attached to the target.</p>\",\n                        \"smithy.api#xmlName\": \"networkInterfaceId\"\n                    }\n                },\n                \"NetworkLoadBalancerArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkLoadBalancerArn\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the Network Load Balancer.</p>\",\n                        \"smithy.api#xmlName\": \"networkLoadBalancerArn\"\n                    }\n                },\n                \"Type\": {\n                    \"target\": \"com.amazonaws.ec2#TrafficMirrorTargetType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Type\",\n                        \"smithy.api#documentation\": \"<p>The type of Traffic Mirror target.</p>\",\n                        \"smithy.api#xmlName\": \"type\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Description\",\n                        \"smithy.api#documentation\": \"<p>Information about the Traffic Mirror target.</p>\",\n                        \"smithy.api#xmlName\": \"description\"\n                    }\n                },\n                \"OwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OwnerId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the account that owns the Traffic Mirror target.</p>\",\n                        \"smithy.api#xmlName\": \"ownerId\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>The tags assigned to the Traffic Mirror target.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                },\n                \"GatewayLoadBalancerEndpointId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"GatewayLoadBalancerEndpointId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Gateway Load Balancer endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"gatewayLoadBalancerEndpointId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a Traffic Mirror target.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#TrafficMirrorTargetId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#TrafficMirrorTargetIdList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#TrafficMirrorTargetId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TrafficMirrorTargetSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#TrafficMirrorTarget\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TrafficMirrorTargetType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"network_interface\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"network-interface\"\n                    }\n                },\n                \"network_load_balancer\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"network-load-balancer\"\n                    }\n                },\n                \"gateway_load_balancer_endpoint\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"gateway-load-balancer-endpoint\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TrafficMirroringMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 5,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TrafficType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ACCEPT\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ACCEPT\"\n                    }\n                },\n                \"REJECT\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"REJECT\"\n                    }\n                },\n                \"ALL\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ALL\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TransferType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"time_based\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"time-based\"\n                    }\n                },\n                \"standard\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"standard\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TransitAssociationGatewayId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#TransitGateway\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the transit gateway.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayId\"\n                    }\n                },\n                \"TransitGatewayArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayArn\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the transit gateway.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayArn\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The state of the transit gateway.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                },\n                \"OwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OwnerId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Amazon Web Services account that owns the transit gateway.</p>\",\n                        \"smithy.api#xmlName\": \"ownerId\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Description\",\n                        \"smithy.api#documentation\": \"<p>The description of the transit gateway.</p>\",\n                        \"smithy.api#xmlName\": \"description\"\n                    }\n                },\n                \"CreationTime\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CreationTime\",\n                        \"smithy.api#documentation\": \"<p>The creation time.</p>\",\n                        \"smithy.api#xmlName\": \"creationTime\"\n                    }\n                },\n                \"Options\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayOptions\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Options\",\n                        \"smithy.api#documentation\": \"<p>The transit gateway options.</p>\",\n                        \"smithy.api#xmlName\": \"options\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>The tags for the transit gateway.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a transit gateway.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayAssociation\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayRouteTableId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayRouteTableId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayRouteTableId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the transit gateway route table.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayRouteTableId\"\n                    }\n                },\n                \"TransitGatewayAttachmentId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayAttachmentId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayAttachmentId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the attachment.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayAttachmentId\"\n                    }\n                },\n                \"ResourceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResourceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the resource.</p>\",\n                        \"smithy.api#xmlName\": \"resourceId\"\n                    }\n                },\n                \"ResourceType\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayAttachmentResourceType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResourceType\",\n                        \"smithy.api#documentation\": \"<p>The resource type. Note that the <code>tgw-peering</code> resource type has been deprecated.</p>\",\n                        \"smithy.api#xmlName\": \"resourceType\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayAssociationState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The state of the association.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes an association between a resource attachment and a transit gateway route table.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayAssociationState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"associating\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"associating\"\n                    }\n                },\n                \"associated\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"associated\"\n                    }\n                },\n                \"disassociating\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"disassociating\"\n                    }\n                },\n                \"disassociated\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"disassociated\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayAttachment\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayAttachmentId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayAttachmentId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the attachment.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayAttachmentId\"\n                    }\n                },\n                \"TransitGatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the transit gateway.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayId\"\n                    }\n                },\n                \"TransitGatewayOwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayOwnerId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Amazon Web Services account that owns the transit gateway.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayOwnerId\"\n                    }\n                },\n                \"ResourceOwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResourceOwnerId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Amazon Web Services account that owns the resource.</p>\",\n                        \"smithy.api#xmlName\": \"resourceOwnerId\"\n                    }\n                },\n                \"ResourceType\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayAttachmentResourceType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResourceType\",\n                        \"smithy.api#documentation\": \"<p>The resource type. Note that the <code>tgw-peering</code> resource type has been deprecated.</p>\",\n                        \"smithy.api#xmlName\": \"resourceType\"\n                    }\n                },\n                \"ResourceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResourceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the resource.</p>\",\n                        \"smithy.api#xmlName\": \"resourceId\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayAttachmentState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The attachment state. Note that the <code>initiating</code> state has been deprecated.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                },\n                \"Association\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayAttachmentAssociation\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Association\",\n                        \"smithy.api#documentation\": \"<p>The association.</p>\",\n                        \"smithy.api#xmlName\": \"association\"\n                    }\n                },\n                \"CreationTime\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CreationTime\",\n                        \"smithy.api#documentation\": \"<p>The creation time.</p>\",\n                        \"smithy.api#xmlName\": \"creationTime\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>The tags for the attachment.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes an attachment between a resource and a transit gateway.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayAttachmentAssociation\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayRouteTableId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayRouteTableId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the route table for the transit gateway.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayRouteTableId\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayAssociationState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The state of the association.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes an association.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayAttachmentBgpConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayAsn\": {\n                    \"target\": \"com.amazonaws.ec2#Long\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayAsn\",\n                        \"smithy.api#documentation\": \"<p>The transit gateway Autonomous System Number (ASN).</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayAsn\"\n                    }\n                },\n                \"PeerAsn\": {\n                    \"target\": \"com.amazonaws.ec2#Long\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PeerAsn\",\n                        \"smithy.api#documentation\": \"<p>The peer Autonomous System Number (ASN).</p>\",\n                        \"smithy.api#xmlName\": \"peerAsn\"\n                    }\n                },\n                \"TransitGatewayAddress\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayAddress\",\n                        \"smithy.api#documentation\": \"<p>The interior BGP peer IP address for the transit gateway.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayAddress\"\n                    }\n                },\n                \"PeerAddress\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PeerAddress\",\n                        \"smithy.api#documentation\": \"<p>The interior BGP peer IP address for the appliance.</p>\",\n                        \"smithy.api#xmlName\": \"peerAddress\"\n                    }\n                },\n                \"BgpStatus\": {\n                    \"target\": \"com.amazonaws.ec2#BgpStatus\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"BgpStatus\",\n                        \"smithy.api#documentation\": \"<p>The BGP status.</p>\",\n                        \"smithy.api#xmlName\": \"bgpStatus\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The BGP configuration information.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayAttachmentBgpConfigurationList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#TransitGatewayAttachmentBgpConfiguration\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayAttachmentId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#TransitGatewayAttachmentIdStringList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#TransitGatewayAttachmentId\"\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayAttachmentList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#TransitGatewayAttachment\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayAttachmentPropagation\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayRouteTableId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayRouteTableId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the propagation route table.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayRouteTableId\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayPropagationState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The state of the propagation route table.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a propagation route table.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayAttachmentPropagationList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#TransitGatewayAttachmentPropagation\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayAttachmentResourceType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"vpc\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"vpc\"\n                    }\n                },\n                \"vpn\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"vpn\"\n                    }\n                },\n                \"direct_connect_gateway\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"direct-connect-gateway\"\n                    }\n                },\n                \"connect\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"connect\"\n                    }\n                },\n                \"peering\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"peering\"\n                    }\n                },\n                \"tgw_peering\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"tgw-peering\"\n                    }\n                },\n                \"network_function\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"network-function\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayAttachmentState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"initiating\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"initiating\"\n                    }\n                },\n                \"initiatingRequest\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"initiatingRequest\"\n                    }\n                },\n                \"pendingAcceptance\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"pendingAcceptance\"\n                    }\n                },\n                \"rollingBack\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"rollingBack\"\n                    }\n                },\n                \"pending\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"pending\"\n                    }\n                },\n                \"available\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"available\"\n                    }\n                },\n                \"modifying\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"modifying\"\n                    }\n                },\n                \"deleting\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"deleting\"\n                    }\n                },\n                \"deleted\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"deleted\"\n                    }\n                },\n                \"failed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"failed\"\n                    }\n                },\n                \"rejected\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"rejected\"\n                    }\n                },\n                \"rejecting\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"rejecting\"\n                    }\n                },\n                \"failing\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"failing\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayCidrBlockStringList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#String\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayConnect\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayAttachmentId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayAttachmentId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayAttachmentId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Connect attachment.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayAttachmentId\"\n                    }\n                },\n                \"TransportTransitGatewayAttachmentId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayAttachmentId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransportTransitGatewayAttachmentId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the attachment from which the Connect attachment was created.</p>\",\n                        \"smithy.api#xmlName\": \"transportTransitGatewayAttachmentId\"\n                    }\n                },\n                \"TransitGatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the transit gateway.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayId\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayAttachmentState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The state of the attachment.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                },\n                \"CreationTime\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CreationTime\",\n                        \"smithy.api#documentation\": \"<p>The creation time.</p>\",\n                        \"smithy.api#xmlName\": \"creationTime\"\n                    }\n                },\n                \"Options\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayConnectOptions\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Options\",\n                        \"smithy.api#documentation\": \"<p>The Connect attachment options.</p>\",\n                        \"smithy.api#xmlName\": \"options\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>The tags for the attachment.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a transit gateway Connect attachment.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayConnectList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#TransitGatewayConnect\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayConnectOptions\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Protocol\": {\n                    \"target\": \"com.amazonaws.ec2#ProtocolValue\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Protocol\",\n                        \"smithy.api#documentation\": \"<p>The tunnel protocol.</p>\",\n                        \"smithy.api#xmlName\": \"protocol\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the Connect attachment options.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayConnectPeer\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayAttachmentId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayAttachmentId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayAttachmentId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Connect attachment.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayAttachmentId\"\n                    }\n                },\n                \"TransitGatewayConnectPeerId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayConnectPeerId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayConnectPeerId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Connect peer.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayConnectPeerId\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayConnectPeerState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The state of the Connect peer.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                },\n                \"CreationTime\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CreationTime\",\n                        \"smithy.api#documentation\": \"<p>The creation time.</p>\",\n                        \"smithy.api#xmlName\": \"creationTime\"\n                    }\n                },\n                \"ConnectPeerConfiguration\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayConnectPeerConfiguration\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ConnectPeerConfiguration\",\n                        \"smithy.api#documentation\": \"<p>The Connect peer details.</p>\",\n                        \"smithy.api#xmlName\": \"connectPeerConfiguration\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>The tags for the Connect peer.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a transit gateway Connect peer.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayConnectPeerConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayAddress\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayAddress\",\n                        \"smithy.api#documentation\": \"<p>The Connect peer IP address on the transit gateway side of the tunnel.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayAddress\"\n                    }\n                },\n                \"PeerAddress\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PeerAddress\",\n                        \"smithy.api#documentation\": \"<p>The Connect peer IP address on the appliance side of the tunnel.</p>\",\n                        \"smithy.api#xmlName\": \"peerAddress\"\n                    }\n                },\n                \"InsideCidrBlocks\": {\n                    \"target\": \"com.amazonaws.ec2#InsideCidrBlocksStringList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InsideCidrBlocks\",\n                        \"smithy.api#documentation\": \"<p>The range of interior BGP peer IP addresses.</p>\",\n                        \"smithy.api#xmlName\": \"insideCidrBlocks\"\n                    }\n                },\n                \"Protocol\": {\n                    \"target\": \"com.amazonaws.ec2#ProtocolValue\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Protocol\",\n                        \"smithy.api#documentation\": \"<p>The tunnel protocol.</p>\",\n                        \"smithy.api#xmlName\": \"protocol\"\n                    }\n                },\n                \"BgpConfigurations\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayAttachmentBgpConfigurationList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"BgpConfigurations\",\n                        \"smithy.api#documentation\": \"<p>The BGP configuration details.</p>\",\n                        \"smithy.api#xmlName\": \"bgpConfigurations\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the Connect peer details.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayConnectPeerId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#TransitGatewayConnectPeerIdStringList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#TransitGatewayConnectPeerId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayConnectPeerList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#TransitGatewayConnectPeer\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayConnectPeerState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"pending\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"pending\"\n                    }\n                },\n                \"available\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"available\"\n                    }\n                },\n                \"deleting\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"deleting\"\n                    }\n                },\n                \"deleted\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"deleted\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayConnectRequestBgpOptions\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PeerAsn\": {\n                    \"target\": \"com.amazonaws.ec2#Long\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The peer Autonomous System Number (ASN).</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The BGP options for the Connect attachment.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#TransitGatewayIdStringList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#TransitGatewayId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#TransitGateway\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayMaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 5,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayMulitcastDomainAssociationState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"pendingAcceptance\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"pendingAcceptance\"\n                    }\n                },\n                \"associating\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"associating\"\n                    }\n                },\n                \"associated\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"associated\"\n                    }\n                },\n                \"disassociating\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"disassociating\"\n                    }\n                },\n                \"disassociated\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"disassociated\"\n                    }\n                },\n                \"rejected\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"rejected\"\n                    }\n                },\n                \"failed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"failed\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayMulticastDeregisteredGroupMembers\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayMulticastDomainId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayMulticastDomainId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the transit gateway multicast domain.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayMulticastDomainId\"\n                    }\n                },\n                \"DeregisteredNetworkInterfaceIds\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DeregisteredNetworkInterfaceIds\",\n                        \"smithy.api#documentation\": \"<p>The network interface IDs of the deregistered members.</p>\",\n                        \"smithy.api#xmlName\": \"deregisteredNetworkInterfaceIds\"\n                    }\n                },\n                \"GroupIpAddress\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"GroupIpAddress\",\n                        \"smithy.api#documentation\": \"<p>The IP address assigned to the  transit gateway multicast group.</p>\",\n                        \"smithy.api#xmlName\": \"groupIpAddress\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the deregistered  transit gateway multicast group members.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayMulticastDeregisteredGroupSources\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayMulticastDomainId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayMulticastDomainId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the transit gateway multicast domain.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayMulticastDomainId\"\n                    }\n                },\n                \"DeregisteredNetworkInterfaceIds\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DeregisteredNetworkInterfaceIds\",\n                        \"smithy.api#documentation\": \"<p>The network interface IDs of the non-registered members.</p>\",\n                        \"smithy.api#xmlName\": \"deregisteredNetworkInterfaceIds\"\n                    }\n                },\n                \"GroupIpAddress\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"GroupIpAddress\",\n                        \"smithy.api#documentation\": \"<p>The IP address assigned to the  transit gateway multicast group.</p>\",\n                        \"smithy.api#xmlName\": \"groupIpAddress\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the deregistered  transit gateway multicast group sources.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayMulticastDomain\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayMulticastDomainId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayMulticastDomainId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the transit gateway multicast domain.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayMulticastDomainId\"\n                    }\n                },\n                \"TransitGatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the transit gateway.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayId\"\n                    }\n                },\n                \"TransitGatewayMulticastDomainArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayMulticastDomainArn\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the transit gateway multicast domain.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayMulticastDomainArn\"\n                    }\n                },\n                \"OwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OwnerId\",\n                        \"smithy.api#documentation\": \"<p> The ID of the Amazon Web Services account that owns the transit gateway multicast domain.</p>\",\n                        \"smithy.api#xmlName\": \"ownerId\"\n                    }\n                },\n                \"Options\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayMulticastDomainOptions\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Options\",\n                        \"smithy.api#documentation\": \"<p>The options for the transit gateway multicast domain.</p>\",\n                        \"smithy.api#xmlName\": \"options\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayMulticastDomainState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The state of the transit gateway multicast domain.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                },\n                \"CreationTime\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CreationTime\",\n                        \"smithy.api#documentation\": \"<p>The time the transit gateway multicast domain was created.</p>\",\n                        \"smithy.api#xmlName\": \"creationTime\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>The tags for the transit gateway multicast domain.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the transit gateway multicast domain.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayMulticastDomainAssociation\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayAttachmentId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayAttachmentId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the transit gateway attachment.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayAttachmentId\"\n                    }\n                },\n                \"ResourceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResourceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the resource.</p>\",\n                        \"smithy.api#xmlName\": \"resourceId\"\n                    }\n                },\n                \"ResourceType\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayAttachmentResourceType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResourceType\",\n                        \"smithy.api#documentation\": \"<p>The type of resource, for example a VPC attachment.</p>\",\n                        \"smithy.api#xmlName\": \"resourceType\"\n                    }\n                },\n                \"ResourceOwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResourceOwnerId\",\n                        \"smithy.api#documentation\": \"<p> The ID of the Amazon Web Services account that owns the transit gateway multicast domain association resource.</p>\",\n                        \"smithy.api#xmlName\": \"resourceOwnerId\"\n                    }\n                },\n                \"Subnet\": {\n                    \"target\": \"com.amazonaws.ec2#SubnetAssociation\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Subnet\",\n                        \"smithy.api#documentation\": \"<p>The subnet associated with the transit gateway multicast domain.</p>\",\n                        \"smithy.api#xmlName\": \"subnet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the resources associated with the transit gateway multicast domain.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayMulticastDomainAssociationList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#TransitGatewayMulticastDomainAssociation\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayMulticastDomainAssociations\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayMulticastDomainId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayMulticastDomainId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the transit gateway multicast domain.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayMulticastDomainId\"\n                    }\n                },\n                \"TransitGatewayAttachmentId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayAttachmentId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the transit gateway attachment.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayAttachmentId\"\n                    }\n                },\n                \"ResourceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResourceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the resource.</p>\",\n                        \"smithy.api#xmlName\": \"resourceId\"\n                    }\n                },\n                \"ResourceType\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayAttachmentResourceType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResourceType\",\n                        \"smithy.api#documentation\": \"<p>The type of resource, for example a VPC attachment.</p>\",\n                        \"smithy.api#xmlName\": \"resourceType\"\n                    }\n                },\n                \"ResourceOwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResourceOwnerId\",\n                        \"smithy.api#documentation\": \"<p> The ID of the Amazon Web Services account that owns the resource.</p>\",\n                        \"smithy.api#xmlName\": \"resourceOwnerId\"\n                    }\n                },\n                \"Subnets\": {\n                    \"target\": \"com.amazonaws.ec2#SubnetAssociationList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Subnets\",\n                        \"smithy.api#documentation\": \"<p>The subnets associated with the multicast domain.</p>\",\n                        \"smithy.api#xmlName\": \"subnets\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the multicast domain associations.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayMulticastDomainId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#TransitGatewayMulticastDomainIdStringList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#TransitGatewayMulticastDomainId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayMulticastDomainList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#TransitGatewayMulticastDomain\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayMulticastDomainOptions\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Igmpv2Support\": {\n                    \"target\": \"com.amazonaws.ec2#Igmpv2SupportValue\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Igmpv2Support\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether Internet Group Management Protocol (IGMP) version 2 is turned on for the transit gateway multicast domain.</p>\",\n                        \"smithy.api#xmlName\": \"igmpv2Support\"\n                    }\n                },\n                \"StaticSourcesSupport\": {\n                    \"target\": \"com.amazonaws.ec2#StaticSourcesSupportValue\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"StaticSourcesSupport\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether support for statically configuring transit gateway multicast group sources is turned on.</p>\",\n                        \"smithy.api#xmlName\": \"staticSourcesSupport\"\n                    }\n                },\n                \"AutoAcceptSharedAssociations\": {\n                    \"target\": \"com.amazonaws.ec2#AutoAcceptSharedAssociationsValue\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AutoAcceptSharedAssociations\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether to automatically cross-account subnet associations that are associated with the transit gateway multicast domain.</p>\",\n                        \"smithy.api#xmlName\": \"autoAcceptSharedAssociations\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the options for a transit gateway multicast domain.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayMulticastDomainState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"pending\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"pending\"\n                    }\n                },\n                \"available\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"available\"\n                    }\n                },\n                \"deleting\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"deleting\"\n                    }\n                },\n                \"deleted\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"deleted\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayMulticastGroup\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"GroupIpAddress\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"GroupIpAddress\",\n                        \"smithy.api#documentation\": \"<p>The IP address assigned to the  transit gateway multicast group.</p>\",\n                        \"smithy.api#xmlName\": \"groupIpAddress\"\n                    }\n                },\n                \"TransitGatewayAttachmentId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayAttachmentId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the transit gateway attachment.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayAttachmentId\"\n                    }\n                },\n                \"SubnetId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SubnetId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the subnet.</p>\",\n                        \"smithy.api#xmlName\": \"subnetId\"\n                    }\n                },\n                \"ResourceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResourceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the resource.</p>\",\n                        \"smithy.api#xmlName\": \"resourceId\"\n                    }\n                },\n                \"ResourceType\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayAttachmentResourceType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResourceType\",\n                        \"smithy.api#documentation\": \"<p>The type of resource, for example a VPC attachment.</p>\",\n                        \"smithy.api#xmlName\": \"resourceType\"\n                    }\n                },\n                \"ResourceOwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResourceOwnerId\",\n                        \"smithy.api#documentation\": \"<p> The ID of the Amazon Web Services account that owns the transit gateway multicast domain group resource.</p>\",\n                        \"smithy.api#xmlName\": \"resourceOwnerId\"\n                    }\n                },\n                \"NetworkInterfaceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkInterfaceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the transit gateway attachment.</p>\",\n                        \"smithy.api#xmlName\": \"networkInterfaceId\"\n                    }\n                },\n                \"GroupMember\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"GroupMember\",\n                        \"smithy.api#documentation\": \"<p>Indicates that the resource is a  transit gateway multicast group member.</p>\",\n                        \"smithy.api#xmlName\": \"groupMember\"\n                    }\n                },\n                \"GroupSource\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"GroupSource\",\n                        \"smithy.api#documentation\": \"<p>Indicates that the resource is a  transit gateway multicast group member.</p>\",\n                        \"smithy.api#xmlName\": \"groupSource\"\n                    }\n                },\n                \"MemberType\": {\n                    \"target\": \"com.amazonaws.ec2#MembershipType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MemberType\",\n                        \"smithy.api#documentation\": \"<p>The member type (for example, <code>static</code>).</p>\",\n                        \"smithy.api#xmlName\": \"memberType\"\n                    }\n                },\n                \"SourceType\": {\n                    \"target\": \"com.amazonaws.ec2#MembershipType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SourceType\",\n                        \"smithy.api#documentation\": \"<p>The source type.</p>\",\n                        \"smithy.api#xmlName\": \"sourceType\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the  transit gateway multicast group resources.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayMulticastGroupList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#TransitGatewayMulticastGroup\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayMulticastRegisteredGroupMembers\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayMulticastDomainId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayMulticastDomainId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the transit gateway multicast domain.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayMulticastDomainId\"\n                    }\n                },\n                \"RegisteredNetworkInterfaceIds\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RegisteredNetworkInterfaceIds\",\n                        \"smithy.api#documentation\": \"<p>The ID of the registered network interfaces.</p>\",\n                        \"smithy.api#xmlName\": \"registeredNetworkInterfaceIds\"\n                    }\n                },\n                \"GroupIpAddress\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"GroupIpAddress\",\n                        \"smithy.api#documentation\": \"<p>The IP address assigned to the  transit gateway multicast group.</p>\",\n                        \"smithy.api#xmlName\": \"groupIpAddress\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the registered  transit gateway multicast group members.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayMulticastRegisteredGroupSources\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayMulticastDomainId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayMulticastDomainId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the transit gateway multicast domain.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayMulticastDomainId\"\n                    }\n                },\n                \"RegisteredNetworkInterfaceIds\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RegisteredNetworkInterfaceIds\",\n                        \"smithy.api#documentation\": \"<p>The IDs of the network interfaces members registered with the  transit gateway multicast group.</p>\",\n                        \"smithy.api#xmlName\": \"registeredNetworkInterfaceIds\"\n                    }\n                },\n                \"GroupIpAddress\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"GroupIpAddress\",\n                        \"smithy.api#documentation\": \"<p>The IP address assigned to the  transit gateway multicast group.</p>\",\n                        \"smithy.api#xmlName\": \"groupIpAddress\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the members registered with the  transit gateway multicast group.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayNetworkInterfaceIdList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#NetworkInterfaceId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayOptions\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AmazonSideAsn\": {\n                    \"target\": \"com.amazonaws.ec2#Long\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AmazonSideAsn\",\n                        \"smithy.api#documentation\": \"<p>A private Autonomous System Number (ASN) for the Amazon side of a BGP session. \\n         The range is 64512 to 65534 for 16-bit ASNs and 4200000000 to 4294967294 for 32-bit ASNs.</p>\",\n                        \"smithy.api#xmlName\": \"amazonSideAsn\"\n                    }\n                },\n                \"TransitGatewayCidrBlocks\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayCidrBlocks\",\n                        \"smithy.api#documentation\": \"<p>The transit gateway CIDR blocks.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayCidrBlocks\"\n                    }\n                },\n                \"AutoAcceptSharedAttachments\": {\n                    \"target\": \"com.amazonaws.ec2#AutoAcceptSharedAttachmentsValue\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AutoAcceptSharedAttachments\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether attachment requests are automatically accepted.</p>\",\n                        \"smithy.api#xmlName\": \"autoAcceptSharedAttachments\"\n                    }\n                },\n                \"DefaultRouteTableAssociation\": {\n                    \"target\": \"com.amazonaws.ec2#DefaultRouteTableAssociationValue\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DefaultRouteTableAssociation\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether resource attachments are automatically associated with the default\\n         association route table. Enabled by default. Either <code>defaultRouteTableAssociation</code> or <code>defaultRouteTablePropagation</code> must be set to <code>enable</code> for Amazon Web Services Transit Gateway to create the default transit gateway route table.</p>\",\n                        \"smithy.api#xmlName\": \"defaultRouteTableAssociation\"\n                    }\n                },\n                \"AssociationDefaultRouteTableId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AssociationDefaultRouteTableId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the default association route table.</p>\",\n                        \"smithy.api#xmlName\": \"associationDefaultRouteTableId\"\n                    }\n                },\n                \"DefaultRouteTablePropagation\": {\n                    \"target\": \"com.amazonaws.ec2#DefaultRouteTablePropagationValue\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DefaultRouteTablePropagation\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether resource attachments automatically propagate routes to the default\\n         propagation route table. Enabled by default. If <code>defaultRouteTablePropagation</code>\\n         is set to <code>enable</code>,\\n         Amazon Web Services Transit Gateway creates the default transit gateway route\\n         table.</p>\",\n                        \"smithy.api#xmlName\": \"defaultRouteTablePropagation\"\n                    }\n                },\n                \"PropagationDefaultRouteTableId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PropagationDefaultRouteTableId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the default propagation route table.</p>\",\n                        \"smithy.api#xmlName\": \"propagationDefaultRouteTableId\"\n                    }\n                },\n                \"VpnEcmpSupport\": {\n                    \"target\": \"com.amazonaws.ec2#VpnEcmpSupportValue\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpnEcmpSupport\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether Equal Cost Multipath Protocol support is enabled.</p>\",\n                        \"smithy.api#xmlName\": \"vpnEcmpSupport\"\n                    }\n                },\n                \"DnsSupport\": {\n                    \"target\": \"com.amazonaws.ec2#DnsSupportValue\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DnsSupport\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether DNS support is enabled.</p>\",\n                        \"smithy.api#xmlName\": \"dnsSupport\"\n                    }\n                },\n                \"SecurityGroupReferencingSupport\": {\n                    \"target\": \"com.amazonaws.ec2#SecurityGroupReferencingSupportValue\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SecurityGroupReferencingSupport\",\n                        \"smithy.api#documentation\": \"<p>Enables you to reference a security group across VPCs attached to a transit gateway to simplify security group management.\\n\\n</p>\\n         <p>This option is disabled by default.</p>\",\n                        \"smithy.api#xmlName\": \"securityGroupReferencingSupport\"\n                    }\n                },\n                \"MulticastSupport\": {\n                    \"target\": \"com.amazonaws.ec2#MulticastSupportValue\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MulticastSupport\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether multicast is enabled on the transit gateway</p>\",\n                        \"smithy.api#xmlName\": \"multicastSupport\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the options for a transit gateway.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayPeeringAttachment\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayAttachmentId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayAttachmentId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the transit gateway peering attachment.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayAttachmentId\"\n                    }\n                },\n                \"AccepterTransitGatewayAttachmentId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AccepterTransitGatewayAttachmentId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the accepter transit gateway attachment.</p>\",\n                        \"smithy.api#xmlName\": \"accepterTransitGatewayAttachmentId\"\n                    }\n                },\n                \"RequesterTgwInfo\": {\n                    \"target\": \"com.amazonaws.ec2#PeeringTgwInfo\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RequesterTgwInfo\",\n                        \"smithy.api#documentation\": \"<p>Information about the requester transit gateway.</p>\",\n                        \"smithy.api#xmlName\": \"requesterTgwInfo\"\n                    }\n                },\n                \"AccepterTgwInfo\": {\n                    \"target\": \"com.amazonaws.ec2#PeeringTgwInfo\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AccepterTgwInfo\",\n                        \"smithy.api#documentation\": \"<p>Information about the accepter transit gateway.</p>\",\n                        \"smithy.api#xmlName\": \"accepterTgwInfo\"\n                    }\n                },\n                \"Options\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayPeeringAttachmentOptions\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Options\",\n                        \"smithy.api#documentation\": \"<p>Details about the transit gateway peering attachment.</p>\",\n                        \"smithy.api#xmlName\": \"options\"\n                    }\n                },\n                \"Status\": {\n                    \"target\": \"com.amazonaws.ec2#PeeringAttachmentStatus\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Status\",\n                        \"smithy.api#documentation\": \"<p>The status of the transit gateway peering attachment.</p>\",\n                        \"smithy.api#xmlName\": \"status\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayAttachmentState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The state of the transit gateway peering attachment. Note that the <code>initiating</code> state has been deprecated.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                },\n                \"CreationTime\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CreationTime\",\n                        \"smithy.api#documentation\": \"<p>The time the transit gateway peering attachment was created.</p>\",\n                        \"smithy.api#xmlName\": \"creationTime\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>The tags for the transit gateway peering attachment.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the transit gateway peering attachment.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayPeeringAttachmentList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#TransitGatewayPeeringAttachment\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayPeeringAttachmentOptions\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DynamicRouting\": {\n                    \"target\": \"com.amazonaws.ec2#DynamicRoutingValue\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DynamicRouting\",\n                        \"smithy.api#documentation\": \"<p>Describes whether dynamic routing is enabled or disabled for the transit gateway peering attachment.</p>\",\n                        \"smithy.api#xmlName\": \"dynamicRouting\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes dynamic routing for the transit gateway peering attachment.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayPolicyRule\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SourceCidrBlock\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SourceCidrBlock\",\n                        \"smithy.api#documentation\": \"<p>The source CIDR block for the transit gateway policy rule.</p>\",\n                        \"smithy.api#xmlName\": \"sourceCidrBlock\"\n                    }\n                },\n                \"SourcePortRange\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SourcePortRange\",\n                        \"smithy.api#documentation\": \"<p>The port range for the transit gateway policy rule. Currently this is set to * (all).</p>\",\n                        \"smithy.api#xmlName\": \"sourcePortRange\"\n                    }\n                },\n                \"DestinationCidrBlock\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DestinationCidrBlock\",\n                        \"smithy.api#documentation\": \"<p>The destination CIDR block for the transit gateway policy rule.</p>\",\n                        \"smithy.api#xmlName\": \"destinationCidrBlock\"\n                    }\n                },\n                \"DestinationPortRange\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DestinationPortRange\",\n                        \"smithy.api#documentation\": \"<p>The port range for the transit gateway policy rule. Currently this is set to * (all).</p>\",\n                        \"smithy.api#xmlName\": \"destinationPortRange\"\n                    }\n                },\n                \"Protocol\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Protocol\",\n                        \"smithy.api#documentation\": \"<p>The protocol used by the transit gateway policy rule.</p>\",\n                        \"smithy.api#xmlName\": \"protocol\"\n                    }\n                },\n                \"MetaData\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayPolicyRuleMetaData\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MetaData\",\n                        \"smithy.api#documentation\": \"<p>The meta data tags used for the transit gateway policy rule.</p>\",\n                        \"smithy.api#xmlName\": \"metaData\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a rule associated with a transit gateway policy.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayPolicyRuleMetaData\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"MetaDataKey\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MetaDataKey\",\n                        \"smithy.api#documentation\": \"<p>The key name for the transit gateway policy rule meta data tag.</p>\",\n                        \"smithy.api#xmlName\": \"metaDataKey\"\n                    }\n                },\n                \"MetaDataValue\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MetaDataValue\",\n                        \"smithy.api#documentation\": \"<p>The value of the key for the transit gateway policy rule meta data tag.</p>\",\n                        \"smithy.api#xmlName\": \"metaDataValue\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the meta data tags associated with a transit gateway policy rule.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayPolicyTable\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayPolicyTableId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayPolicyTableId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayPolicyTableId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the transit gateway policy table.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayPolicyTableId\"\n                    }\n                },\n                \"TransitGatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the transit gateway.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayId\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayPolicyTableState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The state of the transit gateway policy table</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                },\n                \"CreationTime\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CreationTime\",\n                        \"smithy.api#documentation\": \"<p>The timestamp when the transit gateway policy table was created.</p>\",\n                        \"smithy.api#xmlName\": \"creationTime\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>he key-value pairs associated with the transit gateway policy table.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a transit gateway policy table.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayPolicyTableAssociation\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayPolicyTableId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayPolicyTableId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayPolicyTableId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the transit gateway policy table.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayPolicyTableId\"\n                    }\n                },\n                \"TransitGatewayAttachmentId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayAttachmentId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayAttachmentId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the transit gateway attachment.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayAttachmentId\"\n                    }\n                },\n                \"ResourceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResourceId\",\n                        \"smithy.api#documentation\": \"<p>The resource ID of the transit gateway attachment.</p>\",\n                        \"smithy.api#xmlName\": \"resourceId\"\n                    }\n                },\n                \"ResourceType\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayAttachmentResourceType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResourceType\",\n                        \"smithy.api#documentation\": \"<p>The resource type for the transit gateway policy table association.</p>\",\n                        \"smithy.api#xmlName\": \"resourceType\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayAssociationState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The state of the transit gateway policy table association.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a transit gateway policy table association.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayPolicyTableAssociationList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#TransitGatewayPolicyTableAssociation\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayPolicyTableEntry\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PolicyRuleNumber\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PolicyRuleNumber\",\n                        \"smithy.api#documentation\": \"<p>The rule number for the transit gateway policy table entry.</p>\",\n                        \"smithy.api#xmlName\": \"policyRuleNumber\"\n                    }\n                },\n                \"PolicyRule\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayPolicyRule\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PolicyRule\",\n                        \"smithy.api#documentation\": \"<p>The policy rule associated with the transit gateway policy table.</p>\",\n                        \"smithy.api#xmlName\": \"policyRule\"\n                    }\n                },\n                \"TargetRouteTableId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayRouteTableId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TargetRouteTableId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the target route table.</p>\",\n                        \"smithy.api#xmlName\": \"targetRouteTableId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a transit gateway policy table entry</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayPolicyTableEntryList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#TransitGatewayPolicyTableEntry\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayPolicyTableId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#TransitGatewayPolicyTableIdStringList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#TransitGatewayPolicyTableId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayPolicyTableList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#TransitGatewayPolicyTable\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayPolicyTableState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"pending\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"pending\"\n                    }\n                },\n                \"available\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"available\"\n                    }\n                },\n                \"deleting\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"deleting\"\n                    }\n                },\n                \"deleted\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"deleted\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayPrefixListAttachment\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayAttachmentId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayAttachmentId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayAttachmentId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the attachment.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayAttachmentId\"\n                    }\n                },\n                \"ResourceType\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayAttachmentResourceType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResourceType\",\n                        \"smithy.api#documentation\": \"<p>The resource type. Note that the <code>tgw-peering</code> resource type has been deprecated.</p>\",\n                        \"smithy.api#xmlName\": \"resourceType\"\n                    }\n                },\n                \"ResourceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResourceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the resource.</p>\",\n                        \"smithy.api#xmlName\": \"resourceId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a transit gateway prefix list attachment.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayPrefixListReference\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayRouteTableId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayRouteTableId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayRouteTableId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the transit gateway route table.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayRouteTableId\"\n                    }\n                },\n                \"PrefixListId\": {\n                    \"target\": \"com.amazonaws.ec2#PrefixListResourceId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PrefixListId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the prefix list.</p>\",\n                        \"smithy.api#xmlName\": \"prefixListId\"\n                    }\n                },\n                \"PrefixListOwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PrefixListOwnerId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the prefix list owner.</p>\",\n                        \"smithy.api#xmlName\": \"prefixListOwnerId\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayPrefixListReferenceState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The state of the prefix list reference.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                },\n                \"Blackhole\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Blackhole\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether traffic that matches this route is dropped.</p>\",\n                        \"smithy.api#xmlName\": \"blackhole\"\n                    }\n                },\n                \"TransitGatewayAttachment\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayPrefixListAttachment\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayAttachment\",\n                        \"smithy.api#documentation\": \"<p>Information about the transit gateway attachment.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayAttachment\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a prefix list reference.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayPrefixListReferenceSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#TransitGatewayPrefixListReference\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayPrefixListReferenceState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"pending\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"pending\"\n                    }\n                },\n                \"available\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"available\"\n                    }\n                },\n                \"modifying\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"modifying\"\n                    }\n                },\n                \"deleting\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"deleting\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayPropagation\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayAttachmentId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayAttachmentId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayAttachmentId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the attachment.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayAttachmentId\"\n                    }\n                },\n                \"ResourceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResourceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the resource.</p>\",\n                        \"smithy.api#xmlName\": \"resourceId\"\n                    }\n                },\n                \"ResourceType\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayAttachmentResourceType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResourceType\",\n                        \"smithy.api#documentation\": \"<p>The resource type. Note that the <code>tgw-peering</code> resource type has been deprecated.</p>\",\n                        \"smithy.api#xmlName\": \"resourceType\"\n                    }\n                },\n                \"TransitGatewayRouteTableId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayRouteTableId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the transit gateway route table.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayRouteTableId\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayPropagationState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The state.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                },\n                \"TransitGatewayRouteTableAnnouncementId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayRouteTableAnnouncementId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayRouteTableAnnouncementId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the transit gateway route table announcement.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayRouteTableAnnouncementId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes route propagation.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayPropagationState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"enabling\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"enabling\"\n                    }\n                },\n                \"enabled\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"enabled\"\n                    }\n                },\n                \"disabling\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"disabling\"\n                    }\n                },\n                \"disabled\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"disabled\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayRequestOptions\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AmazonSideAsn\": {\n                    \"target\": \"com.amazonaws.ec2#Long\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A private Autonomous System Number (ASN) for the Amazon side of a BGP session. \\n         The range is 64512 to 65534 for 16-bit ASNs and 4200000000 to 4294967294 for 32-bit ASNs. The default is <code>64512</code>.</p>\"\n                    }\n                },\n                \"AutoAcceptSharedAttachments\": {\n                    \"target\": \"com.amazonaws.ec2#AutoAcceptSharedAttachmentsValue\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Enable or disable automatic acceptance of attachment requests. Disabled by default.</p>\"\n                    }\n                },\n                \"DefaultRouteTableAssociation\": {\n                    \"target\": \"com.amazonaws.ec2#DefaultRouteTableAssociationValue\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Enable or disable automatic association with the default association route table. Enabled by default.</p>\"\n                    }\n                },\n                \"DefaultRouteTablePropagation\": {\n                    \"target\": \"com.amazonaws.ec2#DefaultRouteTablePropagationValue\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Enable or disable automatic propagation of routes to the default propagation route table. Enabled by default.</p>\"\n                    }\n                },\n                \"VpnEcmpSupport\": {\n                    \"target\": \"com.amazonaws.ec2#VpnEcmpSupportValue\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Enable or disable Equal Cost Multipath Protocol support. Enabled by default.</p>\"\n                    }\n                },\n                \"DnsSupport\": {\n                    \"target\": \"com.amazonaws.ec2#DnsSupportValue\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Enable or disable DNS support. Enabled by default.</p>\"\n                    }\n                },\n                \"SecurityGroupReferencingSupport\": {\n                    \"target\": \"com.amazonaws.ec2#SecurityGroupReferencingSupportValue\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Enables you to reference a security group across VPCs attached to a transit gateway to simplify security group management.\\n\\n</p>\\n         <p>This option is disabled by default.</p>\\n         <p>For more information about security group referencing, see  <a href=\\\"https://docs.aws.amazon.com/vpc/latest/tgw/tgw-vpc-attachments.html#vpc-attachment-security\\\">Security group referencing</a> in the <i>Amazon Web Services Transit Gateways Guide</i>.</p>\"\n                    }\n                },\n                \"MulticastSupport\": {\n                    \"target\": \"com.amazonaws.ec2#MulticastSupportValue\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether multicast is enabled on the transit gateway</p>\"\n                    }\n                },\n                \"TransitGatewayCidrBlocks\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayCidrBlockStringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more IPv4 or IPv6 CIDR blocks for the transit gateway. Must be a size /24 CIDR block or larger for IPv4, or a size /64 CIDR block or larger for IPv6.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the options for a transit gateway.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayRoute\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DestinationCidrBlock\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DestinationCidrBlock\",\n                        \"smithy.api#documentation\": \"<p>The CIDR block used for destination matches.</p>\",\n                        \"smithy.api#xmlName\": \"destinationCidrBlock\"\n                    }\n                },\n                \"PrefixListId\": {\n                    \"target\": \"com.amazonaws.ec2#PrefixListResourceId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PrefixListId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the prefix list used for destination matches.</p>\",\n                        \"smithy.api#xmlName\": \"prefixListId\"\n                    }\n                },\n                \"TransitGatewayRouteTableAnnouncementId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayRouteTableAnnouncementId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayRouteTableAnnouncementId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the transit gateway route table announcement. </p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayRouteTableAnnouncementId\"\n                    }\n                },\n                \"TransitGatewayAttachments\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayRouteAttachmentList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayAttachments\",\n                        \"smithy.api#documentation\": \"<p>The attachments.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayAttachments\"\n                    }\n                },\n                \"Type\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayRouteType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Type\",\n                        \"smithy.api#documentation\": \"<p>The route type.</p>\",\n                        \"smithy.api#xmlName\": \"type\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayRouteState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The state of the route.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a route for a transit gateway route table.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayRouteAttachment\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ResourceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResourceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the resource.</p>\",\n                        \"smithy.api#xmlName\": \"resourceId\"\n                    }\n                },\n                \"TransitGatewayAttachmentId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayAttachmentId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the attachment.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayAttachmentId\"\n                    }\n                },\n                \"ResourceType\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayAttachmentResourceType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResourceType\",\n                        \"smithy.api#documentation\": \"<p>The resource type. Note that the <code>tgw-peering</code> resource type has been deprecated. </p>\",\n                        \"smithy.api#xmlName\": \"resourceType\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a route attachment.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayRouteAttachmentList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#TransitGatewayRouteAttachment\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayRouteList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#TransitGatewayRoute\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayRouteState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"pending\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"pending\"\n                    }\n                },\n                \"active\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"active\"\n                    }\n                },\n                \"blackhole\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"blackhole\"\n                    }\n                },\n                \"deleting\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"deleting\"\n                    }\n                },\n                \"deleted\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"deleted\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayRouteTable\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayRouteTableId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayRouteTableId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the transit gateway route table.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayRouteTableId\"\n                    }\n                },\n                \"TransitGatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the transit gateway.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayId\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayRouteTableState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The state of the transit gateway route table.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                },\n                \"DefaultAssociationRouteTable\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DefaultAssociationRouteTable\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether this is the default association route table for the transit gateway.</p>\",\n                        \"smithy.api#xmlName\": \"defaultAssociationRouteTable\"\n                    }\n                },\n                \"DefaultPropagationRouteTable\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DefaultPropagationRouteTable\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether this is the default propagation route table for the transit gateway.</p>\",\n                        \"smithy.api#xmlName\": \"defaultPropagationRouteTable\"\n                    }\n                },\n                \"CreationTime\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CreationTime\",\n                        \"smithy.api#documentation\": \"<p>The creation time.</p>\",\n                        \"smithy.api#xmlName\": \"creationTime\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>Any tags assigned to the route table.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a transit gateway route table.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayRouteTableAnnouncement\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayRouteTableAnnouncementId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayRouteTableAnnouncementId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayRouteTableAnnouncementId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the transit gateway route table announcement.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayRouteTableAnnouncementId\"\n                    }\n                },\n                \"TransitGatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the transit gateway.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayId\"\n                    }\n                },\n                \"CoreNetworkId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CoreNetworkId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the core network for the transit gateway route table announcement.</p>\",\n                        \"smithy.api#xmlName\": \"coreNetworkId\"\n                    }\n                },\n                \"PeerTransitGatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PeerTransitGatewayId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the peer transit gateway.</p>\",\n                        \"smithy.api#xmlName\": \"peerTransitGatewayId\"\n                    }\n                },\n                \"PeerCoreNetworkId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PeerCoreNetworkId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the core network ID for the peer.</p>\",\n                        \"smithy.api#xmlName\": \"peerCoreNetworkId\"\n                    }\n                },\n                \"PeeringAttachmentId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayAttachmentId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PeeringAttachmentId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the peering attachment.</p>\",\n                        \"smithy.api#xmlName\": \"peeringAttachmentId\"\n                    }\n                },\n                \"AnnouncementDirection\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayRouteTableAnnouncementDirection\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AnnouncementDirection\",\n                        \"smithy.api#documentation\": \"<p>The direction for the route table announcement.</p>\",\n                        \"smithy.api#xmlName\": \"announcementDirection\"\n                    }\n                },\n                \"TransitGatewayRouteTableId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayRouteTableId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayRouteTableId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the transit gateway route table.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayRouteTableId\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayRouteTableAnnouncementState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The state of the transit gateway announcement.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                },\n                \"CreationTime\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CreationTime\",\n                        \"smithy.api#documentation\": \"<p>The timestamp when the transit gateway route table announcement was created.</p>\",\n                        \"smithy.api#xmlName\": \"creationTime\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>The key-value pairs associated with the route table announcement.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a transit gateway route table announcement.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayRouteTableAnnouncementDirection\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"outgoing\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"outgoing\"\n                    }\n                },\n                \"incoming\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"incoming\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayRouteTableAnnouncementId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#TransitGatewayRouteTableAnnouncementIdStringList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#TransitGatewayRouteTableAnnouncementId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayRouteTableAnnouncementList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#TransitGatewayRouteTableAnnouncement\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayRouteTableAnnouncementState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"available\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"available\"\n                    }\n                },\n                \"pending\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"pending\"\n                    }\n                },\n                \"failing\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"failing\"\n                    }\n                },\n                \"failed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"failed\"\n                    }\n                },\n                \"deleting\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"deleting\"\n                    }\n                },\n                \"deleted\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"deleted\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayRouteTableAssociation\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayAttachmentId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayAttachmentId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the attachment.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayAttachmentId\"\n                    }\n                },\n                \"ResourceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResourceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the resource.</p>\",\n                        \"smithy.api#xmlName\": \"resourceId\"\n                    }\n                },\n                \"ResourceType\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayAttachmentResourceType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResourceType\",\n                        \"smithy.api#documentation\": \"<p>The resource type. Note that the <code>tgw-peering</code> resource type has been deprecated.</p>\",\n                        \"smithy.api#xmlName\": \"resourceType\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayAssociationState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The state of the association.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes an association between a route table and a resource attachment.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayRouteTableAssociationList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#TransitGatewayRouteTableAssociation\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayRouteTableId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#TransitGatewayRouteTableIdStringList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#TransitGatewayRouteTableId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayRouteTableList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#TransitGatewayRouteTable\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayRouteTablePropagation\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayAttachmentId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayAttachmentId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the attachment.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayAttachmentId\"\n                    }\n                },\n                \"ResourceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResourceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the resource.</p>\",\n                        \"smithy.api#xmlName\": \"resourceId\"\n                    }\n                },\n                \"ResourceType\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayAttachmentResourceType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResourceType\",\n                        \"smithy.api#documentation\": \"<p>The type of resource. Note that the <code>tgw-peering</code> resource type has been deprecated.</p>\",\n                        \"smithy.api#xmlName\": \"resourceType\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayPropagationState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The state of the resource.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                },\n                \"TransitGatewayRouteTableAnnouncementId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayRouteTableAnnouncementId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayRouteTableAnnouncementId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the transit gateway route table announcement.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayRouteTableAnnouncementId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a route table propagation.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayRouteTablePropagationList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#TransitGatewayRouteTablePropagation\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayRouteTableRoute\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DestinationCidr\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DestinationCidr\",\n                        \"smithy.api#documentation\": \"<p>The CIDR block used for destination matches.</p>\",\n                        \"smithy.api#xmlName\": \"destinationCidr\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The state of the route.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                },\n                \"RouteOrigin\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RouteOrigin\",\n                        \"smithy.api#documentation\": \"<p>The route origin. The following are the possible values:</p>\\n         <ul>\\n            <li>\\n               <p>static</p>\\n            </li>\\n            <li>\\n               <p>propagated</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"routeOrigin\"\n                    }\n                },\n                \"PrefixListId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PrefixListId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the prefix list.</p>\",\n                        \"smithy.api#xmlName\": \"prefixListId\"\n                    }\n                },\n                \"AttachmentId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AttachmentId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the route attachment.</p>\",\n                        \"smithy.api#xmlName\": \"attachmentId\"\n                    }\n                },\n                \"ResourceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResourceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the resource for the route attachment.</p>\",\n                        \"smithy.api#xmlName\": \"resourceId\"\n                    }\n                },\n                \"ResourceType\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResourceType\",\n                        \"smithy.api#documentation\": \"<p>The resource type for the route attachment.</p>\",\n                        \"smithy.api#xmlName\": \"resourceType\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a route in a transit gateway route table.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayRouteTableState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"pending\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"pending\"\n                    }\n                },\n                \"available\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"available\"\n                    }\n                },\n                \"deleting\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"deleting\"\n                    }\n                },\n                \"deleted\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"deleted\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayRouteType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"static\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"static\"\n                    }\n                },\n                \"propagated\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"propagated\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"pending\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"pending\"\n                    }\n                },\n                \"available\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"available\"\n                    }\n                },\n                \"modifying\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"modifying\"\n                    }\n                },\n                \"deleting\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"deleting\"\n                    }\n                },\n                \"deleted\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"deleted\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewaySubnetIdList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#SubnetId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayVpcAttachment\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TransitGatewayAttachmentId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayAttachmentId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the attachment.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayAttachmentId\"\n                    }\n                },\n                \"TransitGatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the transit gateway.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayId\"\n                    }\n                },\n                \"VpcId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the VPC.</p>\",\n                        \"smithy.api#xmlName\": \"vpcId\"\n                    }\n                },\n                \"VpcOwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcOwnerId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Amazon Web Services account that owns the VPC.</p>\",\n                        \"smithy.api#xmlName\": \"vpcOwnerId\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayAttachmentState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The state of the VPC attachment. Note that the <code>initiating</code> state has been deprecated.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                },\n                \"SubnetIds\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SubnetIds\",\n                        \"smithy.api#documentation\": \"<p>The IDs of the subnets.</p>\",\n                        \"smithy.api#xmlName\": \"subnetIds\"\n                    }\n                },\n                \"CreationTime\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CreationTime\",\n                        \"smithy.api#documentation\": \"<p>The creation time.</p>\",\n                        \"smithy.api#xmlName\": \"creationTime\"\n                    }\n                },\n                \"Options\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayVpcAttachmentOptions\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Options\",\n                        \"smithy.api#documentation\": \"<p>The VPC attachment options.</p>\",\n                        \"smithy.api#xmlName\": \"options\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>The tags for the VPC attachment.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a VPC attachment.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayVpcAttachmentList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#TransitGatewayVpcAttachment\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TransitGatewayVpcAttachmentOptions\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DnsSupport\": {\n                    \"target\": \"com.amazonaws.ec2#DnsSupportValue\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DnsSupport\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether DNS support is enabled.</p>\",\n                        \"smithy.api#xmlName\": \"dnsSupport\"\n                    }\n                },\n                \"SecurityGroupReferencingSupport\": {\n                    \"target\": \"com.amazonaws.ec2#SecurityGroupReferencingSupportValue\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SecurityGroupReferencingSupport\",\n                        \"smithy.api#documentation\": \"<p>Enables you to reference a security group across VPCs attached to a transit gateway to simplify security group management.</p>\\n         <p>This option is enabled by default.</p>\\n         <p>For more information about security group referencing, see  <a href=\\\"https://docs.aws.amazon.com/vpc/latest/tgw/tgw-vpc-attachments.html#vpc-attachment-security\\\">Security group referencing</a> in the <i>Amazon Web Services Transit Gateways Guide</i>.</p>\",\n                        \"smithy.api#xmlName\": \"securityGroupReferencingSupport\"\n                    }\n                },\n                \"Ipv6Support\": {\n                    \"target\": \"com.amazonaws.ec2#Ipv6SupportValue\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Ipv6Support\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether IPv6 support is disabled.</p>\",\n                        \"smithy.api#xmlName\": \"ipv6Support\"\n                    }\n                },\n                \"ApplianceModeSupport\": {\n                    \"target\": \"com.amazonaws.ec2#ApplianceModeSupportValue\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ApplianceModeSupport\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether appliance mode support is enabled.</p>\",\n                        \"smithy.api#xmlName\": \"applianceModeSupport\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the VPC attachment options.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#TransportProtocol\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"tcp\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"tcp\"\n                    }\n                },\n                \"udp\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"udp\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TrunkInterfaceAssociation\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AssociationId\": {\n                    \"target\": \"com.amazonaws.ec2#TrunkInterfaceAssociationId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AssociationId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the association.</p>\",\n                        \"smithy.api#xmlName\": \"associationId\"\n                    }\n                },\n                \"BranchInterfaceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"BranchInterfaceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the branch network interface.</p>\",\n                        \"smithy.api#xmlName\": \"branchInterfaceId\"\n                    }\n                },\n                \"TrunkInterfaceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TrunkInterfaceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the trunk network interface.</p>\",\n                        \"smithy.api#xmlName\": \"trunkInterfaceId\"\n                    }\n                },\n                \"InterfaceProtocol\": {\n                    \"target\": \"com.amazonaws.ec2#InterfaceProtocolType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InterfaceProtocol\",\n                        \"smithy.api#documentation\": \"<p>The interface protocol. Valid values are <code>VLAN</code> and <code>GRE</code>.</p>\",\n                        \"smithy.api#xmlName\": \"interfaceProtocol\"\n                    }\n                },\n                \"VlanId\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VlanId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the VLAN when you use the VLAN protocol.</p>\",\n                        \"smithy.api#xmlName\": \"vlanId\"\n                    }\n                },\n                \"GreKey\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"GreKey\",\n                        \"smithy.api#documentation\": \"<p>The application key when you use the GRE protocol.</p>\",\n                        \"smithy.api#xmlName\": \"greKey\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>The tags for the trunk interface association.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about an association between a branch network interface with a trunk network interface.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#TrunkInterfaceAssociationId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#TrunkInterfaceAssociationIdList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#TrunkInterfaceAssociationId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TrunkInterfaceAssociationList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#TrunkInterfaceAssociation\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TrustProviderType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"user\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"user\"\n                    }\n                },\n                \"device\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"device\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TunnelInsideIpVersion\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ipv4\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ipv4\"\n                    }\n                },\n                \"ipv6\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ipv6\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#TunnelOption\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"OutsideIpAddress\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OutsideIpAddress\",\n                        \"smithy.api#documentation\": \"<p>The external IP address of the VPN tunnel.</p>\",\n                        \"smithy.api#xmlName\": \"outsideIpAddress\"\n                    }\n                },\n                \"TunnelInsideCidr\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TunnelInsideCidr\",\n                        \"smithy.api#documentation\": \"<p>The range of inside IPv4 addresses for the tunnel.</p>\",\n                        \"smithy.api#xmlName\": \"tunnelInsideCidr\"\n                    }\n                },\n                \"TunnelInsideIpv6Cidr\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TunnelInsideIpv6Cidr\",\n                        \"smithy.api#documentation\": \"<p>The range of inside IPv6 addresses for the tunnel.</p>\",\n                        \"smithy.api#xmlName\": \"tunnelInsideIpv6Cidr\"\n                    }\n                },\n                \"PreSharedKey\": {\n                    \"target\": \"com.amazonaws.ec2#preSharedKey\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PreSharedKey\",\n                        \"smithy.api#documentation\": \"<p>The pre-shared key (PSK) to establish initial authentication between the virtual\\n            private gateway and the customer gateway.</p>\",\n                        \"smithy.api#xmlName\": \"preSharedKey\"\n                    }\n                },\n                \"Phase1LifetimeSeconds\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Phase1LifetimeSeconds\",\n                        \"smithy.api#documentation\": \"<p>The lifetime for phase 1 of the IKE negotiation, in seconds.</p>\",\n                        \"smithy.api#xmlName\": \"phase1LifetimeSeconds\"\n                    }\n                },\n                \"Phase2LifetimeSeconds\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Phase2LifetimeSeconds\",\n                        \"smithy.api#documentation\": \"<p>The lifetime for phase 2 of the IKE negotiation, in seconds.</p>\",\n                        \"smithy.api#xmlName\": \"phase2LifetimeSeconds\"\n                    }\n                },\n                \"RekeyMarginTimeSeconds\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RekeyMarginTimeSeconds\",\n                        \"smithy.api#documentation\": \"<p>The margin time, in seconds, before the phase 2 lifetime expires, during which the\\n                Amazon Web Services side of the VPN connection performs an IKE rekey.</p>\",\n                        \"smithy.api#xmlName\": \"rekeyMarginTimeSeconds\"\n                    }\n                },\n                \"RekeyFuzzPercentage\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RekeyFuzzPercentage\",\n                        \"smithy.api#documentation\": \"<p>The percentage of the rekey window determined by <code>RekeyMarginTimeSeconds</code>\\n            during which the rekey time is randomly selected.</p>\",\n                        \"smithy.api#xmlName\": \"rekeyFuzzPercentage\"\n                    }\n                },\n                \"ReplayWindowSize\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ReplayWindowSize\",\n                        \"smithy.api#documentation\": \"<p>The number of packets in an IKE replay window.</p>\",\n                        \"smithy.api#xmlName\": \"replayWindowSize\"\n                    }\n                },\n                \"DpdTimeoutSeconds\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DpdTimeoutSeconds\",\n                        \"smithy.api#documentation\": \"<p>The number of seconds after which a DPD timeout occurs.</p>\",\n                        \"smithy.api#xmlName\": \"dpdTimeoutSeconds\"\n                    }\n                },\n                \"DpdTimeoutAction\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DpdTimeoutAction\",\n                        \"smithy.api#documentation\": \"<p>The action to take after a DPD timeout occurs.</p>\",\n                        \"smithy.api#xmlName\": \"dpdTimeoutAction\"\n                    }\n                },\n                \"Phase1EncryptionAlgorithms\": {\n                    \"target\": \"com.amazonaws.ec2#Phase1EncryptionAlgorithmsList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Phase1EncryptionAlgorithmSet\",\n                        \"smithy.api#documentation\": \"<p>The permitted encryption algorithms for the VPN tunnel for phase 1 IKE\\n            negotiations.</p>\",\n                        \"smithy.api#xmlName\": \"phase1EncryptionAlgorithmSet\"\n                    }\n                },\n                \"Phase2EncryptionAlgorithms\": {\n                    \"target\": \"com.amazonaws.ec2#Phase2EncryptionAlgorithmsList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Phase2EncryptionAlgorithmSet\",\n                        \"smithy.api#documentation\": \"<p>The permitted encryption algorithms for the VPN tunnel for phase 2 IKE\\n            negotiations.</p>\",\n                        \"smithy.api#xmlName\": \"phase2EncryptionAlgorithmSet\"\n                    }\n                },\n                \"Phase1IntegrityAlgorithms\": {\n                    \"target\": \"com.amazonaws.ec2#Phase1IntegrityAlgorithmsList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Phase1IntegrityAlgorithmSet\",\n                        \"smithy.api#documentation\": \"<p>The permitted integrity algorithms for the VPN tunnel for phase 1 IKE\\n            negotiations.</p>\",\n                        \"smithy.api#xmlName\": \"phase1IntegrityAlgorithmSet\"\n                    }\n                },\n                \"Phase2IntegrityAlgorithms\": {\n                    \"target\": \"com.amazonaws.ec2#Phase2IntegrityAlgorithmsList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Phase2IntegrityAlgorithmSet\",\n                        \"smithy.api#documentation\": \"<p>The permitted integrity algorithms for the VPN tunnel for phase 2 IKE\\n            negotiations.</p>\",\n                        \"smithy.api#xmlName\": \"phase2IntegrityAlgorithmSet\"\n                    }\n                },\n                \"Phase1DHGroupNumbers\": {\n                    \"target\": \"com.amazonaws.ec2#Phase1DHGroupNumbersList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Phase1DHGroupNumberSet\",\n                        \"smithy.api#documentation\": \"<p>The permitted Diffie-Hellman group numbers for the VPN tunnel for phase 1 IKE\\n            negotiations.</p>\",\n                        \"smithy.api#xmlName\": \"phase1DHGroupNumberSet\"\n                    }\n                },\n                \"Phase2DHGroupNumbers\": {\n                    \"target\": \"com.amazonaws.ec2#Phase2DHGroupNumbersList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Phase2DHGroupNumberSet\",\n                        \"smithy.api#documentation\": \"<p>The permitted Diffie-Hellman group numbers for the VPN tunnel for phase 2 IKE\\n            negotiations.</p>\",\n                        \"smithy.api#xmlName\": \"phase2DHGroupNumberSet\"\n                    }\n                },\n                \"IkeVersions\": {\n                    \"target\": \"com.amazonaws.ec2#IKEVersionsList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IkeVersionSet\",\n                        \"smithy.api#documentation\": \"<p>The IKE versions that are permitted for the VPN tunnel.</p>\",\n                        \"smithy.api#xmlName\": \"ikeVersionSet\"\n                    }\n                },\n                \"StartupAction\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"StartupAction\",\n                        \"smithy.api#documentation\": \"<p>The action to take when the establishing the VPN tunnels for a VPN connection.</p>\",\n                        \"smithy.api#xmlName\": \"startupAction\"\n                    }\n                },\n                \"LogOptions\": {\n                    \"target\": \"com.amazonaws.ec2#VpnTunnelLogOptions\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LogOptions\",\n                        \"smithy.api#documentation\": \"<p>Options for logging VPN tunnel activity.</p>\",\n                        \"smithy.api#xmlName\": \"logOptions\"\n                    }\n                },\n                \"EnableTunnelLifecycleControl\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EnableTunnelLifecycleControl\",\n                        \"smithy.api#documentation\": \"<p>Status of tunnel endpoint lifecycle control feature.</p>\",\n                        \"smithy.api#xmlName\": \"enableTunnelLifecycleControl\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The VPN tunnel options.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#TunnelOptionsList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#TunnelOption\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#UnassignIpv6Addresses\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#UnassignIpv6AddressesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#UnassignIpv6AddressesResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Unassigns the specified IPv6 addresses or Prefix Delegation prefixes from a network\\n            interface.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#UnassignIpv6AddressesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Ipv6Prefixes\": {\n                    \"target\": \"com.amazonaws.ec2#IpPrefixList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IPv6 prefixes to unassign from the network interface.</p>\",\n                        \"smithy.api#xmlName\": \"Ipv6Prefix\"\n                    }\n                },\n                \"NetworkInterfaceId\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInterfaceId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkInterfaceId\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the network interface.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"networkInterfaceId\"\n                    }\n                },\n                \"Ipv6Addresses\": {\n                    \"target\": \"com.amazonaws.ec2#Ipv6AddressList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Ipv6Addresses\",\n                        \"smithy.api#documentation\": \"<p>The IPv6 addresses to unassign from the network interface.</p>\",\n                        \"smithy.api#xmlName\": \"ipv6Addresses\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#UnassignIpv6AddressesResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NetworkInterfaceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkInterfaceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the network interface.</p>\",\n                        \"smithy.api#xmlName\": \"networkInterfaceId\"\n                    }\n                },\n                \"UnassignedIpv6Addresses\": {\n                    \"target\": \"com.amazonaws.ec2#Ipv6AddressList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"UnassignedIpv6Addresses\",\n                        \"smithy.api#documentation\": \"<p>The IPv6 addresses that have been unassigned from the network interface.</p>\",\n                        \"smithy.api#xmlName\": \"unassignedIpv6Addresses\"\n                    }\n                },\n                \"UnassignedIpv6Prefixes\": {\n                    \"target\": \"com.amazonaws.ec2#IpPrefixList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"UnassignedIpv6PrefixSet\",\n                        \"smithy.api#documentation\": \"<p>The IPv6 prefixes that have been unassigned from  the network interface.</p>\",\n                        \"smithy.api#xmlName\": \"unassignedIpv6PrefixSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#UnassignPrivateIpAddresses\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#UnassignPrivateIpAddressesRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Unassigns the specified secondary private IP addresses or IPv4 Prefix Delegation\\n            prefixes from a network interface.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To unassign a secondary private IP address from a network interface\",\n                        \"documentation\": \"This example unassigns the specified private IP address from the specified network interface.\",\n                        \"input\": {\n                            \"NetworkInterfaceId\": \"eni-e5aa89a3\",\n                            \"PrivateIpAddresses\": [\n                                \"10.0.0.82\"\n                            ]\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#UnassignPrivateIpAddressesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Ipv4Prefixes\": {\n                    \"target\": \"com.amazonaws.ec2#IpPrefixList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IPv4 prefixes to unassign from  the network interface.</p>\",\n                        \"smithy.api#xmlName\": \"Ipv4Prefix\"\n                    }\n                },\n                \"NetworkInterfaceId\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInterfaceId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkInterfaceId\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the network interface.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"networkInterfaceId\"\n                    }\n                },\n                \"PrivateIpAddresses\": {\n                    \"target\": \"com.amazonaws.ec2#PrivateIpAddressStringList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PrivateIpAddress\",\n                        \"smithy.api#documentation\": \"<p>The secondary private IP addresses to unassign from the network interface. You can\\n            specify this option multiple times to unassign more than one IP address.</p>\",\n                        \"smithy.api#xmlName\": \"privateIpAddress\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the parameters for UnassignPrivateIpAddresses.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#UnassignPrivateNatGatewayAddress\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#UnassignPrivateNatGatewayAddressRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#UnassignPrivateNatGatewayAddressResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Unassigns secondary private IPv4 addresses from a private NAT gateway. You cannot unassign your primary private IP. For more information, \\n            see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/userguide/nat-gateway-working-with.html#nat-gateway-edit-secondary\\\">Edit secondary IP address associations</a> \\n            in the <i>Amazon VPC User Guide</i>.</p>\\n         <p>While unassigning is in progress, you cannot assign/unassign additional IP addresses while the connections are being drained. You are, however, allowed to delete the NAT gateway.</p>\\n         <p>A private IP address will only be released at the end of MaxDrainDurationSeconds. The\\n            private IP addresses stay associated and support the existing connections, but do not\\n            support any new connections (new connections are distributed across the remaining\\n            assigned private IP address). After the existing connections drain out, the private IP\\n            addresses are released.</p>\\n         <p></p>\\n         <p></p>\"\n            }\n        },\n        \"com.amazonaws.ec2#UnassignPrivateNatGatewayAddressRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NatGatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#NatGatewayId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the NAT gateway.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"PrivateIpAddresses\": {\n                    \"target\": \"com.amazonaws.ec2#IpList\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The private IPv4 addresses you want to unassign.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"PrivateIpAddress\"\n                    }\n                },\n                \"MaxDrainDurationSeconds\": {\n                    \"target\": \"com.amazonaws.ec2#DrainSeconds\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum amount of time to wait (in seconds) before forcibly releasing the IP addresses if connections are still in progress. Default value is 350 seconds.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#UnassignPrivateNatGatewayAddressResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NatGatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#NatGatewayId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NatGatewayId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the NAT gateway.</p>\",\n                        \"smithy.api#xmlName\": \"natGatewayId\"\n                    }\n                },\n                \"NatGatewayAddresses\": {\n                    \"target\": \"com.amazonaws.ec2#NatGatewayAddressList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NatGatewayAddressSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the NAT gateway IP addresses.</p>\",\n                        \"smithy.api#xmlName\": \"natGatewayAddressSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#UnlimitedSupportedInstanceFamily\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"t2\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"t2\"\n                    }\n                },\n                \"t3\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"t3\"\n                    }\n                },\n                \"t3a\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"t3a\"\n                    }\n                },\n                \"t4g\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"t4g\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#UnlockSnapshot\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#UnlockSnapshotRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#UnlockSnapshotResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Unlocks a snapshot that is locked in governance mode or that is locked in compliance mode \\n      but still in the cooling-off period. You can't unlock a snapshot that is locked in compliance \\n      mode after the cooling-off period has expired.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#UnlockSnapshotRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SnapshotId\": {\n                    \"target\": \"com.amazonaws.ec2#SnapshotId\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The ID of the snapshot to unlock.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#UnlockSnapshotResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SnapshotId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SnapshotId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the snapshot.</p>\",\n                        \"smithy.api#xmlName\": \"snapshotId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#UnmonitorInstances\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#UnmonitorInstancesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#UnmonitorInstancesResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Disables detailed monitoring for a running instance. For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-cloudwatch.html\\\">Monitoring\\n                your instances and volumes</a> in the\\n            <i>Amazon EC2 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#UnmonitorInstancesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceIds\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceIdStringList\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The IDs of the instances.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"InstanceId\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DryRun\",\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the operation, without actually making the \\n  request, and provides an error response. If you have the required permissions, the error response is \\n  <code>DryRunOperation</code>. Otherwise, it is <code>UnauthorizedOperation</code>.</p>\",\n                        \"smithy.api#xmlName\": \"dryRun\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#UnmonitorInstancesResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceMonitorings\": {\n                    \"target\": \"com.amazonaws.ec2#InstanceMonitoringList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstancesSet\",\n                        \"smithy.api#documentation\": \"<p>The monitoring information.</p>\",\n                        \"smithy.api#xmlName\": \"instancesSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#UnsuccessfulInstanceCreditSpecificationErrorCode\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"INVALID_INSTANCE_ID\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"InvalidInstanceID.Malformed\"\n                    }\n                },\n                \"INSTANCE_NOT_FOUND\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"InvalidInstanceID.NotFound\"\n                    }\n                },\n                \"INCORRECT_INSTANCE_STATE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"IncorrectInstanceState\"\n                    }\n                },\n                \"INSTANCE_CREDIT_SPECIFICATION_NOT_SUPPORTED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"InstanceCreditSpecification.NotSupported\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#UnsuccessfulInstanceCreditSpecificationItem\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the instance.</p>\",\n                        \"smithy.api#xmlName\": \"instanceId\"\n                    }\n                },\n                \"Error\": {\n                    \"target\": \"com.amazonaws.ec2#UnsuccessfulInstanceCreditSpecificationItemError\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Error\",\n                        \"smithy.api#documentation\": \"<p>The applicable error for the burstable performance instance whose credit option for\\n            CPU usage was not modified.</p>\",\n                        \"smithy.api#xmlName\": \"error\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the burstable performance instance whose credit option for CPU usage was not\\n            modified.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#UnsuccessfulInstanceCreditSpecificationItemError\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Code\": {\n                    \"target\": \"com.amazonaws.ec2#UnsuccessfulInstanceCreditSpecificationErrorCode\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Code\",\n                        \"smithy.api#documentation\": \"<p>The error code.</p>\",\n                        \"smithy.api#xmlName\": \"code\"\n                    }\n                },\n                \"Message\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Message\",\n                        \"smithy.api#documentation\": \"<p>The applicable error message.</p>\",\n                        \"smithy.api#xmlName\": \"message\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about the error for the burstable performance instance whose credit option\\n            for CPU usage was not modified.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#UnsuccessfulInstanceCreditSpecificationSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#UnsuccessfulInstanceCreditSpecificationItem\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#UnsuccessfulItem\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Error\": {\n                    \"target\": \"com.amazonaws.ec2#UnsuccessfulItemError\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Error\",\n                        \"smithy.api#documentation\": \"<p>Information about the error.</p>\",\n                        \"smithy.api#xmlName\": \"error\"\n                    }\n                },\n                \"ResourceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResourceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the resource.</p>\",\n                        \"smithy.api#xmlName\": \"resourceId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about items that were not successfully processed in a batch call.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#UnsuccessfulItemError\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Code\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Code\",\n                        \"smithy.api#documentation\": \"<p>The error code.</p>\",\n                        \"smithy.api#xmlName\": \"code\"\n                    }\n                },\n                \"Message\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Message\",\n                        \"smithy.api#documentation\": \"<p>The error message accompanying the error code.</p>\",\n                        \"smithy.api#xmlName\": \"message\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about the error that occurred. For more information about errors, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/errors-overview.html\\\">Error codes</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#UnsuccessfulItemList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#UnsuccessfulItem\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#UnsuccessfulItemSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#UnsuccessfulItem\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#UpdateSecurityGroupRuleDescriptionsEgress\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#UpdateSecurityGroupRuleDescriptionsEgressRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#UpdateSecurityGroupRuleDescriptionsEgressResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Updates the description of an egress (outbound) security group rule. You\\n\\t\\t\\tcan replace an existing description, or add a description to a rule that did not have one\\n\\t\\t\\tpreviously. You can remove a description for a security group rule by omitting the \\n\\t\\t\\tdescription parameter in the request.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To update an outbound security group rule description\",\n                        \"documentation\": \"This example updates the description for the specified security group rule.\",\n                        \"input\": {\n                            \"GroupId\": \"sg-123abc12\",\n                            \"IpPermissions\": [\n                                {\n                                    \"IpProtocol\": \"tcp\",\n                                    \"FromPort\": 80,\n                                    \"ToPort\": 80,\n                                    \"IpRanges\": [\n                                        {\n                                            \"CidrIp\": \"203.0.113.0/24\",\n                                            \"Description\": \"Outbound HTTP access to server 2\"\n                                        }\n                                    ]\n                                }\n                            ]\n                        },\n                        \"output\": {}\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#UpdateSecurityGroupRuleDescriptionsEgressRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"GroupId\": {\n                    \"target\": \"com.amazonaws.ec2#SecurityGroupId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the security group. You must specify either the security group ID or the\\n\\t\\t\\tsecurity group name in the request. For security groups in a nondefault VPC, you must\\n\\t\\t\\tspecify the security group ID.</p>\"\n                    }\n                },\n                \"GroupName\": {\n                    \"target\": \"com.amazonaws.ec2#SecurityGroupName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>[Default VPC] The name of the security group. You must specify either the security group\\n\\t\\t\\tID or the security group name.</p>\"\n                    }\n                },\n                \"IpPermissions\": {\n                    \"target\": \"com.amazonaws.ec2#IpPermissionList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IP permissions for the security group rule. You must specify either the IP permissions\\n\\t\\t    or the description.</p>\"\n                    }\n                },\n                \"SecurityGroupRuleDescriptions\": {\n                    \"target\": \"com.amazonaws.ec2#SecurityGroupRuleDescriptionList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The description for the egress security group rules. You must specify either the\\n            description or the IP permissions.</p>\",\n                        \"smithy.api#xmlName\": \"SecurityGroupRuleDescription\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#UpdateSecurityGroupRuleDescriptionsEgressResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Return\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Return\",\n                        \"smithy.api#documentation\": \"<p>Returns <code>true</code> if the request succeeds; otherwise, returns an error.</p>\",\n                        \"smithy.api#xmlName\": \"return\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#UpdateSecurityGroupRuleDescriptionsIngress\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#UpdateSecurityGroupRuleDescriptionsIngressRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#UpdateSecurityGroupRuleDescriptionsIngressResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Updates the description of an ingress (inbound) security group rule. You can replace an\\n\\t\\t\\texisting description, or add a description to a rule that did not have one previously.\\n\\t\\t    You can remove a description for a security group rule by omitting the description \\n\\t\\t    parameter in the request.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To update an inbound security group rule description\",\n                        \"documentation\": \"This example updates the description for the specified security group rule.\",\n                        \"input\": {\n                            \"GroupId\": \"sg-123abc12\",\n                            \"IpPermissions\": [\n                                {\n                                    \"IpProtocol\": \"tcp\",\n                                    \"FromPort\": 22,\n                                    \"ToPort\": 22,\n                                    \"IpRanges\": [\n                                        {\n                                            \"CidrIp\": \"203.0.113.0/16\",\n                                            \"Description\": \"SSH access from the LA office\"\n                                        }\n                                    ]\n                                }\n                            ]\n                        },\n                        \"output\": {}\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ec2#UpdateSecurityGroupRuleDescriptionsIngressRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                },\n                \"GroupId\": {\n                    \"target\": \"com.amazonaws.ec2#SecurityGroupId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the security group. You must specify either the security group ID or the\\n\\t\\t\\tsecurity group name in the request. For security groups in a nondefault VPC, you must\\n\\t\\t\\tspecify the security group ID.</p>\"\n                    }\n                },\n                \"GroupName\": {\n                    \"target\": \"com.amazonaws.ec2#SecurityGroupName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>[Default VPC] The name of the security group. You must specify either the\\n            security group ID or the security group name. For security groups in a\\n            nondefault VPC, you must specify the security group ID.</p>\"\n                    }\n                },\n                \"IpPermissions\": {\n                    \"target\": \"com.amazonaws.ec2#IpPermissionList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IP permissions for the security group rule. You must specify either IP permissions\\n\\t\\t    or a description.</p>\"\n                    }\n                },\n                \"SecurityGroupRuleDescriptions\": {\n                    \"target\": \"com.amazonaws.ec2#SecurityGroupRuleDescriptionList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The description for the ingress security group rules. You must specify either\\n            a description or IP permissions.</p>\",\n                        \"smithy.api#xmlName\": \"SecurityGroupRuleDescription\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#UpdateSecurityGroupRuleDescriptionsIngressResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Return\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Return\",\n                        \"smithy.api#documentation\": \"<p>Returns <code>true</code> if the request succeeds; otherwise, returns an error.</p>\",\n                        \"smithy.api#xmlName\": \"return\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#UsageClassType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"spot\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"spot\"\n                    }\n                },\n                \"on_demand\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"on-demand\"\n                    }\n                },\n                \"capacity_block\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"capacity-block\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#UsageClassTypeList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#UsageClassType\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#UserBucket\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"S3Bucket\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the Amazon S3 bucket where the disk image is located.</p>\"\n                    }\n                },\n                \"S3Key\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The file name of the disk image.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the Amazon S3 bucket for the disk image.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#UserBucketDetails\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"S3Bucket\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"S3Bucket\",\n                        \"smithy.api#documentation\": \"<p>The Amazon S3 bucket from which the disk image was created.</p>\",\n                        \"smithy.api#xmlName\": \"s3Bucket\"\n                    }\n                },\n                \"S3Key\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"S3Key\",\n                        \"smithy.api#documentation\": \"<p>The file name of the disk image.</p>\",\n                        \"smithy.api#xmlName\": \"s3Key\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the Amazon S3 bucket for the disk image.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#UserData\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Data\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Data\",\n                        \"smithy.api#documentation\": \"<p>The user data. If you are using an Amazon Web Services SDK or command line tool, Base64-encoding is performed for you, and you\\n   can load the text from a file. Otherwise, you must provide Base64-encoded text.</p>\",\n                        \"smithy.api#xmlName\": \"data\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the user data for an instance.</p>\",\n                \"smithy.api#sensitive\": {}\n            }\n        },\n        \"com.amazonaws.ec2#UserGroupStringList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#String\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"UserGroup\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#UserIdGroupPair\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Description\",\n                        \"smithy.api#documentation\": \"<p>A description for the security group rule that references this user ID group\\n\\t\\t\\tpair.</p>\\n         <p>Constraints: Up to 255 characters in length. Allowed characters are a-z, A-Z, 0-9,\\n      spaces, and ._-:/()#,@[]+=;{}!$*</p>\",\n                        \"smithy.api#xmlName\": \"description\"\n                    }\n                },\n                \"UserId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"UserId\",\n                        \"smithy.api#documentation\": \"<p>The ID of an Amazon Web Services account.</p>\\n         <p>For a referenced security group in another VPC, the account ID of the referenced\\n            security group is returned in the response. If the referenced security group is deleted,\\n            this value is not returned.</p>\",\n                        \"smithy.api#xmlName\": \"userId\"\n                    }\n                },\n                \"GroupName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"GroupName\",\n                        \"smithy.api#documentation\": \"<p>[Default VPC] The name of the security group. For a security group in a nondefault VPC, \\n         use the security group ID. </p>\\n         <p>For a referenced security group in another VPC, this value is not returned if the\\n            referenced security group is deleted.</p>\",\n                        \"smithy.api#xmlName\": \"groupName\"\n                    }\n                },\n                \"GroupId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"GroupId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the security group.</p>\",\n                        \"smithy.api#xmlName\": \"groupId\"\n                    }\n                },\n                \"VpcId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the VPC for the referenced security group, if applicable.</p>\",\n                        \"smithy.api#xmlName\": \"vpcId\"\n                    }\n                },\n                \"VpcPeeringConnectionId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcPeeringConnectionId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the VPC peering connection, if applicable.</p>\",\n                        \"smithy.api#xmlName\": \"vpcPeeringConnectionId\"\n                    }\n                },\n                \"PeeringStatus\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PeeringStatus\",\n                        \"smithy.api#documentation\": \"<p>The status of a VPC peering connection, if applicable.</p>\",\n                        \"smithy.api#xmlName\": \"peeringStatus\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a security group and Amazon Web Services account ID pair.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#UserIdGroupPairList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#UserIdGroupPair\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#UserIdGroupPairSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#UserIdGroupPair\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#UserIdList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#String\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#UserIdStringList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#String\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"UserId\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#UserTrustProviderType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"iam_identity_center\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"iam-identity-center\"\n                    }\n                },\n                \"oidc\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"oidc\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VCpuCount\": {\n            \"type\": \"integer\"\n        },\n        \"com.amazonaws.ec2#VCpuCountRange\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Min\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Min\",\n                        \"smithy.api#documentation\": \"<p>The minimum number of vCPUs. If the value is <code>0</code>, there is no minimum\\n         limit.</p>\",\n                        \"smithy.api#xmlName\": \"min\"\n                    }\n                },\n                \"Max\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Max\",\n                        \"smithy.api#documentation\": \"<p>The maximum number of vCPUs. If this parameter is not specified, there is no maximum\\n         limit.</p>\",\n                        \"smithy.api#xmlName\": \"max\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The minimum and maximum number of vCPUs.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#VCpuCountRangeRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Min\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The minimum number of vCPUs. To specify no minimum limit, specify <code>0</code>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Max\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of vCPUs. To specify no maximum limit, omit this parameter.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The minimum and maximum number of vCPUs.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#VCpuInfo\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DefaultVCpus\": {\n                    \"target\": \"com.amazonaws.ec2#VCpuCount\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DefaultVCpus\",\n                        \"smithy.api#documentation\": \"<p>The default number of vCPUs for the instance type.</p>\",\n                        \"smithy.api#xmlName\": \"defaultVCpus\"\n                    }\n                },\n                \"DefaultCores\": {\n                    \"target\": \"com.amazonaws.ec2#CoreCount\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DefaultCores\",\n                        \"smithy.api#documentation\": \"<p>The default number of cores for the instance type.</p>\",\n                        \"smithy.api#xmlName\": \"defaultCores\"\n                    }\n                },\n                \"DefaultThreadsPerCore\": {\n                    \"target\": \"com.amazonaws.ec2#ThreadsPerCore\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DefaultThreadsPerCore\",\n                        \"smithy.api#documentation\": \"<p>The default number of threads per core for the instance type.</p>\",\n                        \"smithy.api#xmlName\": \"defaultThreadsPerCore\"\n                    }\n                },\n                \"ValidCores\": {\n                    \"target\": \"com.amazonaws.ec2#CoreCountList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ValidCores\",\n                        \"smithy.api#documentation\": \"<p>The valid number of cores that can be configured for the instance type.</p>\",\n                        \"smithy.api#xmlName\": \"validCores\"\n                    }\n                },\n                \"ValidThreadsPerCore\": {\n                    \"target\": \"com.amazonaws.ec2#ThreadsPerCoreList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ValidThreadsPerCore\",\n                        \"smithy.api#documentation\": \"<p>The valid number of threads per core that can be configured for the instance type.</p>\",\n                        \"smithy.api#xmlName\": \"validThreadsPerCore\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the vCPU configurations for the instance type.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ValidationError\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Code\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Code\",\n                        \"smithy.api#documentation\": \"<p>The error code that indicates why the parameter or parameter combination is not valid.\\n            For more information about error codes, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/errors-overview.html\\\">Error codes</a>.</p>\",\n                        \"smithy.api#xmlName\": \"code\"\n                    }\n                },\n                \"Message\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Message\",\n                        \"smithy.api#documentation\": \"<p>The error message that describes why the parameter or parameter combination is not\\n            valid. For more information about error messages, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/errors-overview.html\\\">Error codes</a>.</p>\",\n                        \"smithy.api#xmlName\": \"message\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The error code and error message that is returned for a parameter or parameter\\n            combination that is not valid when a new launch template or new version of a launch\\n            template is created.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ValidationWarning\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Errors\": {\n                    \"target\": \"com.amazonaws.ec2#ErrorSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ErrorSet\",\n                        \"smithy.api#documentation\": \"<p>The error codes and error messages.</p>\",\n                        \"smithy.api#xmlName\": \"errorSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The error codes and error messages that are returned for the parameters or parameter\\n            combinations that are not valid when a new launch template or new version of a launch\\n            template is created.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#ValueStringList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#String\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VerificationMethod\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"remarks_x509\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"remarks-x509\"\n                    }\n                },\n                \"dns_token\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"dns-token\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VerifiedAccessEndpoint\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VerifiedAccessInstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VerifiedAccessInstanceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Amazon Web Services Verified Access instance.</p>\",\n                        \"smithy.api#xmlName\": \"verifiedAccessInstanceId\"\n                    }\n                },\n                \"VerifiedAccessGroupId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VerifiedAccessGroupId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Amazon Web Services Verified Access group.</p>\",\n                        \"smithy.api#xmlName\": \"verifiedAccessGroupId\"\n                    }\n                },\n                \"VerifiedAccessEndpointId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VerifiedAccessEndpointId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Amazon Web Services Verified Access endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"verifiedAccessEndpointId\"\n                    }\n                },\n                \"ApplicationDomain\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ApplicationDomain\",\n                        \"smithy.api#documentation\": \"<p>The DNS name for users to reach your application.</p>\",\n                        \"smithy.api#xmlName\": \"applicationDomain\"\n                    }\n                },\n                \"EndpointType\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessEndpointType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EndpointType\",\n                        \"smithy.api#documentation\": \"<p>The type of Amazon Web Services Verified Access endpoint. Incoming application requests will be sent to an IP\\n         address, load balancer or a network interface depending on the endpoint type\\n         specified.</p>\",\n                        \"smithy.api#xmlName\": \"endpointType\"\n                    }\n                },\n                \"AttachmentType\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessEndpointAttachmentType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AttachmentType\",\n                        \"smithy.api#documentation\": \"<p>The type of attachment used to provide connectivity between the Amazon Web Services Verified Access endpoint and the\\n         application.</p>\",\n                        \"smithy.api#xmlName\": \"attachmentType\"\n                    }\n                },\n                \"DomainCertificateArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DomainCertificateArn\",\n                        \"smithy.api#documentation\": \"<p>The ARN of a public TLS/SSL certificate imported into or created with ACM.</p>\",\n                        \"smithy.api#xmlName\": \"domainCertificateArn\"\n                    }\n                },\n                \"EndpointDomain\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EndpointDomain\",\n                        \"smithy.api#documentation\": \"<p>A DNS name that is generated for the endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"endpointDomain\"\n                    }\n                },\n                \"DeviceValidationDomain\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DeviceValidationDomain\",\n                        \"smithy.api#documentation\": \"<p>Returned if endpoint has a device trust provider attached.</p>\",\n                        \"smithy.api#xmlName\": \"deviceValidationDomain\"\n                    }\n                },\n                \"SecurityGroupIds\": {\n                    \"target\": \"com.amazonaws.ec2#SecurityGroupIdList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SecurityGroupIdSet\",\n                        \"smithy.api#documentation\": \"<p>The IDs of the security groups for the endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"securityGroupIdSet\"\n                    }\n                },\n                \"LoadBalancerOptions\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessEndpointLoadBalancerOptions\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LoadBalancerOptions\",\n                        \"smithy.api#documentation\": \"<p>The load balancer details if creating the Amazon Web Services Verified Access endpoint as\\n         <code>load-balancer</code>type.</p>\",\n                        \"smithy.api#xmlName\": \"loadBalancerOptions\"\n                    }\n                },\n                \"NetworkInterfaceOptions\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessEndpointEniOptions\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkInterfaceOptions\",\n                        \"smithy.api#documentation\": \"<p>The options for network-interface type endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"networkInterfaceOptions\"\n                    }\n                },\n                \"Status\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessEndpointStatus\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Status\",\n                        \"smithy.api#documentation\": \"<p>The endpoint status.</p>\",\n                        \"smithy.api#xmlName\": \"status\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Description\",\n                        \"smithy.api#documentation\": \"<p>A description for the Amazon Web Services Verified Access endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"description\"\n                    }\n                },\n                \"CreationTime\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CreationTime\",\n                        \"smithy.api#documentation\": \"<p>The creation time.</p>\",\n                        \"smithy.api#xmlName\": \"creationTime\"\n                    }\n                },\n                \"LastUpdatedTime\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LastUpdatedTime\",\n                        \"smithy.api#documentation\": \"<p>The last updated time.</p>\",\n                        \"smithy.api#xmlName\": \"lastUpdatedTime\"\n                    }\n                },\n                \"DeletionTime\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DeletionTime\",\n                        \"smithy.api#documentation\": \"<p>The deletion time.</p>\",\n                        \"smithy.api#xmlName\": \"deletionTime\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>The tags.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                },\n                \"SseSpecification\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessSseSpecificationResponse\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SseSpecification\",\n                        \"smithy.api#documentation\": \"<p>The options in use for server side encryption.</p>\",\n                        \"smithy.api#xmlName\": \"sseSpecification\"\n                    }\n                },\n                \"RdsOptions\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessEndpointRdsOptions\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RdsOptions\",\n                        \"smithy.api#documentation\": \"<p>The options for an RDS endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"rdsOptions\"\n                    }\n                },\n                \"CidrOptions\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessEndpointCidrOptions\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CidrOptions\",\n                        \"smithy.api#documentation\": \"<p>The options for a CIDR endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"cidrOptions\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>An Amazon Web Services Verified Access endpoint specifies the application that Amazon Web Services Verified Access provides access to. It must be\\n         attached to an Amazon Web Services Verified Access group. An Amazon Web Services Verified Access endpoint must also have an attached access policy\\n         before you attached it to a group.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#VerifiedAccessEndpointAttachmentType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"vpc\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"vpc\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VerifiedAccessEndpointCidrOptions\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Cidr\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Cidr\",\n                        \"smithy.api#documentation\": \"<p>The CIDR.</p>\",\n                        \"smithy.api#xmlName\": \"cidr\"\n                    }\n                },\n                \"PortRanges\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessEndpointPortRangeList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PortRangeSet\",\n                        \"smithy.api#documentation\": \"<p>The port ranges.</p>\",\n                        \"smithy.api#xmlName\": \"portRangeSet\"\n                    }\n                },\n                \"Protocol\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessEndpointProtocol\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Protocol\",\n                        \"smithy.api#documentation\": \"<p>The protocol.</p>\",\n                        \"smithy.api#xmlName\": \"protocol\"\n                    }\n                },\n                \"SubnetIds\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessEndpointSubnetIdList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SubnetIdSet\",\n                        \"smithy.api#documentation\": \"<p>The IDs of the subnets.</p>\",\n                        \"smithy.api#xmlName\": \"subnetIdSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the CIDR options for a Verified Access endpoint.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#VerifiedAccessEndpointEniOptions\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NetworkInterfaceId\": {\n                    \"target\": \"com.amazonaws.ec2#NetworkInterfaceId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkInterfaceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the network interface.</p>\",\n                        \"smithy.api#xmlName\": \"networkInterfaceId\"\n                    }\n                },\n                \"Protocol\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessEndpointProtocol\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Protocol\",\n                        \"smithy.api#documentation\": \"<p>The IP protocol.</p>\",\n                        \"smithy.api#xmlName\": \"protocol\"\n                    }\n                },\n                \"Port\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessEndpointPortNumber\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Port\",\n                        \"smithy.api#documentation\": \"<p>The IP port number.</p>\",\n                        \"smithy.api#xmlName\": \"port\"\n                    }\n                },\n                \"PortRanges\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessEndpointPortRangeList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PortRangeSet\",\n                        \"smithy.api#documentation\": \"<p>The port ranges.</p>\",\n                        \"smithy.api#xmlName\": \"portRangeSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Options for a network-interface type endpoint.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#VerifiedAccessEndpointId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#VerifiedAccessEndpointIdList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#VerifiedAccessEndpointId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VerifiedAccessEndpointList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#VerifiedAccessEndpoint\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VerifiedAccessEndpointLoadBalancerOptions\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Protocol\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessEndpointProtocol\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Protocol\",\n                        \"smithy.api#documentation\": \"<p>The IP protocol.</p>\",\n                        \"smithy.api#xmlName\": \"protocol\"\n                    }\n                },\n                \"Port\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessEndpointPortNumber\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Port\",\n                        \"smithy.api#documentation\": \"<p>The IP port number.</p>\",\n                        \"smithy.api#xmlName\": \"port\"\n                    }\n                },\n                \"LoadBalancerArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LoadBalancerArn\",\n                        \"smithy.api#documentation\": \"<p>The ARN of the load balancer.</p>\",\n                        \"smithy.api#xmlName\": \"loadBalancerArn\"\n                    }\n                },\n                \"SubnetIds\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessEndpointSubnetIdList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SubnetIdSet\",\n                        \"smithy.api#documentation\": \"<p>The IDs of the subnets.</p>\",\n                        \"smithy.api#xmlName\": \"subnetIdSet\"\n                    }\n                },\n                \"PortRanges\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessEndpointPortRangeList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PortRangeSet\",\n                        \"smithy.api#documentation\": \"<p>The port ranges.</p>\",\n                        \"smithy.api#xmlName\": \"portRangeSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a load balancer when creating an Amazon Web Services Verified Access endpoint using the\\n            <code>load-balancer</code> type.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#VerifiedAccessEndpointPortNumber\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 65535\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VerifiedAccessEndpointPortRange\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"FromPort\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessEndpointPortNumber\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"FromPort\",\n                        \"smithy.api#documentation\": \"<p>The start of the port range.</p>\",\n                        \"smithy.api#xmlName\": \"fromPort\"\n                    }\n                },\n                \"ToPort\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessEndpointPortNumber\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ToPort\",\n                        \"smithy.api#documentation\": \"<p>The end of the port range.</p>\",\n                        \"smithy.api#xmlName\": \"toPort\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a port range.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#VerifiedAccessEndpointPortRangeList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#VerifiedAccessEndpointPortRange\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VerifiedAccessEndpointProtocol\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"http\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"http\"\n                    }\n                },\n                \"https\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"https\"\n                    }\n                },\n                \"tcp\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"tcp\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VerifiedAccessEndpointRdsOptions\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Protocol\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessEndpointProtocol\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Protocol\",\n                        \"smithy.api#documentation\": \"<p>The protocol.</p>\",\n                        \"smithy.api#xmlName\": \"protocol\"\n                    }\n                },\n                \"Port\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessEndpointPortNumber\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Port\",\n                        \"smithy.api#documentation\": \"<p>The port.</p>\",\n                        \"smithy.api#xmlName\": \"port\"\n                    }\n                },\n                \"RdsDbInstanceArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RdsDbInstanceArn\",\n                        \"smithy.api#documentation\": \"<p>The ARN of the RDS instance.</p>\",\n                        \"smithy.api#xmlName\": \"rdsDbInstanceArn\"\n                    }\n                },\n                \"RdsDbClusterArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RdsDbClusterArn\",\n                        \"smithy.api#documentation\": \"<p>The ARN of the DB cluster.</p>\",\n                        \"smithy.api#xmlName\": \"rdsDbClusterArn\"\n                    }\n                },\n                \"RdsDbProxyArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RdsDbProxyArn\",\n                        \"smithy.api#documentation\": \"<p>The ARN of the RDS proxy.</p>\",\n                        \"smithy.api#xmlName\": \"rdsDbProxyArn\"\n                    }\n                },\n                \"RdsEndpoint\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RdsEndpoint\",\n                        \"smithy.api#documentation\": \"<p>The RDS endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"rdsEndpoint\"\n                    }\n                },\n                \"SubnetIds\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessEndpointSubnetIdList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SubnetIdSet\",\n                        \"smithy.api#documentation\": \"<p>The IDs of the subnets.</p>\",\n                        \"smithy.api#xmlName\": \"subnetIdSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the RDS options for a Verified Access endpoint.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#VerifiedAccessEndpointStatus\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Code\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessEndpointStatusCode\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Code\",\n                        \"smithy.api#documentation\": \"<p>The status code of the Verified Access endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"code\"\n                    }\n                },\n                \"Message\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Message\",\n                        \"smithy.api#documentation\": \"<p>The status message of the Verified Access endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"message\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the status of a Verified Access endpoint.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#VerifiedAccessEndpointStatusCode\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"pending\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"pending\"\n                    }\n                },\n                \"active\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"active\"\n                    }\n                },\n                \"updating\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"updating\"\n                    }\n                },\n                \"deleting\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"deleting\"\n                    }\n                },\n                \"deleted\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"deleted\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VerifiedAccessEndpointSubnetIdList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#SubnetId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VerifiedAccessEndpointTarget\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VerifiedAccessEndpointId\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessEndpointId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VerifiedAccessEndpointId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Verified Access endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"verifiedAccessEndpointId\"\n                    }\n                },\n                \"VerifiedAccessEndpointTargetIpAddress\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VerifiedAccessEndpointTargetIpAddress\",\n                        \"smithy.api#documentation\": \"<p>The IP address of the target.</p>\",\n                        \"smithy.api#xmlName\": \"verifiedAccessEndpointTargetIpAddress\"\n                    }\n                },\n                \"VerifiedAccessEndpointTargetDns\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VerifiedAccessEndpointTargetDns\",\n                        \"smithy.api#documentation\": \"<p>The DNS name of the target.</p>\",\n                        \"smithy.api#xmlName\": \"verifiedAccessEndpointTargetDns\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the targets for the specified Verified Access endpoint.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#VerifiedAccessEndpointTargetList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#VerifiedAccessEndpointTarget\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VerifiedAccessEndpointType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"load_balancer\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"load-balancer\"\n                    }\n                },\n                \"network_interface\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"network-interface\"\n                    }\n                },\n                \"rds\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"rds\"\n                    }\n                },\n                \"cidr\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"cidr\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VerifiedAccessGroup\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VerifiedAccessGroupId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VerifiedAccessGroupId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Verified Access group.</p>\",\n                        \"smithy.api#xmlName\": \"verifiedAccessGroupId\"\n                    }\n                },\n                \"VerifiedAccessInstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VerifiedAccessInstanceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Amazon Web Services Verified Access instance.</p>\",\n                        \"smithy.api#xmlName\": \"verifiedAccessInstanceId\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Description\",\n                        \"smithy.api#documentation\": \"<p>A description for the Amazon Web Services Verified Access group.</p>\",\n                        \"smithy.api#xmlName\": \"description\"\n                    }\n                },\n                \"Owner\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Owner\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account number that owns the group.</p>\",\n                        \"smithy.api#xmlName\": \"owner\"\n                    }\n                },\n                \"VerifiedAccessGroupArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VerifiedAccessGroupArn\",\n                        \"smithy.api#documentation\": \"<p>The ARN of the Verified Access group.</p>\",\n                        \"smithy.api#xmlName\": \"verifiedAccessGroupArn\"\n                    }\n                },\n                \"CreationTime\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CreationTime\",\n                        \"smithy.api#documentation\": \"<p>The creation time.</p>\",\n                        \"smithy.api#xmlName\": \"creationTime\"\n                    }\n                },\n                \"LastUpdatedTime\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LastUpdatedTime\",\n                        \"smithy.api#documentation\": \"<p>The last updated time.</p>\",\n                        \"smithy.api#xmlName\": \"lastUpdatedTime\"\n                    }\n                },\n                \"DeletionTime\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DeletionTime\",\n                        \"smithy.api#documentation\": \"<p>The deletion time.</p>\",\n                        \"smithy.api#xmlName\": \"deletionTime\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>The tags.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                },\n                \"SseSpecification\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessSseSpecificationResponse\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SseSpecification\",\n                        \"smithy.api#documentation\": \"<p>The options in use for server side encryption.</p>\",\n                        \"smithy.api#xmlName\": \"sseSpecification\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a Verified Access group.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#VerifiedAccessGroupId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#VerifiedAccessGroupIdList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#VerifiedAccessGroupId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VerifiedAccessGroupList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#VerifiedAccessGroup\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VerifiedAccessInstance\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VerifiedAccessInstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VerifiedAccessInstanceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Amazon Web Services Verified Access instance.</p>\",\n                        \"smithy.api#xmlName\": \"verifiedAccessInstanceId\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Description\",\n                        \"smithy.api#documentation\": \"<p>A description for the Amazon Web Services Verified Access instance.</p>\",\n                        \"smithy.api#xmlName\": \"description\"\n                    }\n                },\n                \"VerifiedAccessTrustProviders\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessTrustProviderCondensedList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VerifiedAccessTrustProviderSet\",\n                        \"smithy.api#documentation\": \"<p>The IDs of the Amazon Web Services Verified Access trust providers.</p>\",\n                        \"smithy.api#xmlName\": \"verifiedAccessTrustProviderSet\"\n                    }\n                },\n                \"CreationTime\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CreationTime\",\n                        \"smithy.api#documentation\": \"<p>The creation time.</p>\",\n                        \"smithy.api#xmlName\": \"creationTime\"\n                    }\n                },\n                \"LastUpdatedTime\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LastUpdatedTime\",\n                        \"smithy.api#documentation\": \"<p>The last updated time.</p>\",\n                        \"smithy.api#xmlName\": \"lastUpdatedTime\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>The tags.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                },\n                \"FipsEnabled\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"FipsEnabled\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether support for Federal Information Processing Standards (FIPS) is enabled on the instance.</p>\",\n                        \"smithy.api#xmlName\": \"fipsEnabled\"\n                    }\n                },\n                \"CidrEndpointsCustomSubDomain\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessInstanceCustomSubDomain\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CidrEndpointsCustomSubDomain\",\n                        \"smithy.api#documentation\": \"<p>The custom subdomain.</p>\",\n                        \"smithy.api#xmlName\": \"cidrEndpointsCustomSubDomain\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a Verified Access instance.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#VerifiedAccessInstanceCustomSubDomain\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SubDomain\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SubDomain\",\n                        \"smithy.api#documentation\": \"<p>The subdomain.</p>\",\n                        \"smithy.api#xmlName\": \"subDomain\"\n                    }\n                },\n                \"Nameservers\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NameserverSet\",\n                        \"smithy.api#documentation\": \"<p>The name servers.</p>\",\n                        \"smithy.api#xmlName\": \"nameserverSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a custom subdomain for a network CIDR endpoint for Verified Access.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#VerifiedAccessInstanceId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#VerifiedAccessInstanceIdList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#VerifiedAccessInstanceId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VerifiedAccessInstanceList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#VerifiedAccessInstance\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VerifiedAccessInstanceLoggingConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VerifiedAccessInstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VerifiedAccessInstanceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Amazon Web Services Verified Access instance.</p>\",\n                        \"smithy.api#xmlName\": \"verifiedAccessInstanceId\"\n                    }\n                },\n                \"AccessLogs\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessLogs\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AccessLogs\",\n                        \"smithy.api#documentation\": \"<p>Details about the logging options.</p>\",\n                        \"smithy.api#xmlName\": \"accessLogs\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes logging options for an Amazon Web Services Verified Access instance.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#VerifiedAccessInstanceLoggingConfigurationList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#VerifiedAccessInstanceLoggingConfiguration\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VerifiedAccessInstanceOpenVpnClientConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Config\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Config\",\n                        \"smithy.api#documentation\": \"<p>The base64-encoded Open VPN client configuration.</p>\",\n                        \"smithy.api#xmlName\": \"config\"\n                    }\n                },\n                \"Routes\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessInstanceOpenVpnClientConfigurationRouteList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RouteSet\",\n                        \"smithy.api#documentation\": \"<p>The routes.</p>\",\n                        \"smithy.api#xmlName\": \"routeSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a set of routes.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#VerifiedAccessInstanceOpenVpnClientConfigurationList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#VerifiedAccessInstanceOpenVpnClientConfiguration\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VerifiedAccessInstanceOpenVpnClientConfigurationRoute\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Cidr\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Cidr\",\n                        \"smithy.api#documentation\": \"<p>The CIDR block.</p>\",\n                        \"smithy.api#xmlName\": \"cidr\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a route.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#VerifiedAccessInstanceOpenVpnClientConfigurationRouteList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#VerifiedAccessInstanceOpenVpnClientConfigurationRoute\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VerifiedAccessInstanceUserTrustProviderClientConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Type\": {\n                    \"target\": \"com.amazonaws.ec2#UserTrustProviderType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Type\",\n                        \"smithy.api#documentation\": \"<p>The trust provider type.</p>\",\n                        \"smithy.api#xmlName\": \"type\"\n                    }\n                },\n                \"Scopes\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Scopes\",\n                        \"smithy.api#documentation\": \"<p>The set of user claims to be requested from the IdP.</p>\",\n                        \"smithy.api#xmlName\": \"scopes\"\n                    }\n                },\n                \"Issuer\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Issuer\",\n                        \"smithy.api#documentation\": \"<p>The OIDC issuer identifier of the IdP.</p>\",\n                        \"smithy.api#xmlName\": \"issuer\"\n                    }\n                },\n                \"AuthorizationEndpoint\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AuthorizationEndpoint\",\n                        \"smithy.api#documentation\": \"<p>The authorization endpoint of the IdP.</p>\",\n                        \"smithy.api#xmlName\": \"authorizationEndpoint\"\n                    }\n                },\n                \"PublicSigningKeyEndpoint\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PublicSigningKeyEndpoint\",\n                        \"smithy.api#documentation\": \"<p>The public signing key endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"publicSigningKeyEndpoint\"\n                    }\n                },\n                \"TokenEndpoint\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TokenEndpoint\",\n                        \"smithy.api#documentation\": \"<p>The token endpoint of the IdP.</p>\",\n                        \"smithy.api#xmlName\": \"tokenEndpoint\"\n                    }\n                },\n                \"UserInfoEndpoint\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"UserInfoEndpoint\",\n                        \"smithy.api#documentation\": \"<p>The user info endpoint of the IdP.</p>\",\n                        \"smithy.api#xmlName\": \"userInfoEndpoint\"\n                    }\n                },\n                \"ClientId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ClientId\",\n                        \"smithy.api#documentation\": \"<p>The OAuth 2.0 client identifier.</p>\",\n                        \"smithy.api#xmlName\": \"clientId\"\n                    }\n                },\n                \"ClientSecret\": {\n                    \"target\": \"com.amazonaws.ec2#ClientSecretType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ClientSecret\",\n                        \"smithy.api#documentation\": \"<p>The OAuth 2.0 client secret.</p>\",\n                        \"smithy.api#xmlName\": \"clientSecret\"\n                    }\n                },\n                \"PkceEnabled\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PkceEnabled\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether Proof of Key Code Exchange (PKCE) is enabled.</p>\",\n                        \"smithy.api#xmlName\": \"pkceEnabled\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the trust provider.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#VerifiedAccessLogCloudWatchLogsDestination\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Enabled\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Enabled\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether logging is enabled.</p>\",\n                        \"smithy.api#xmlName\": \"enabled\"\n                    }\n                },\n                \"DeliveryStatus\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessLogDeliveryStatus\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DeliveryStatus\",\n                        \"smithy.api#documentation\": \"<p>The delivery status for access logs.</p>\",\n                        \"smithy.api#xmlName\": \"deliveryStatus\"\n                    }\n                },\n                \"LogGroup\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LogGroup\",\n                        \"smithy.api#documentation\": \"<p>The ID of the CloudWatch Logs log group.</p>\",\n                        \"smithy.api#xmlName\": \"logGroup\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Options for CloudWatch Logs as a logging destination.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#VerifiedAccessLogCloudWatchLogsDestinationOptions\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Enabled\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>Indicates whether logging is enabled.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"LogGroup\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the CloudWatch Logs log group.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Options for CloudWatch Logs as a logging destination.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#VerifiedAccessLogDeliveryStatus\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Code\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessLogDeliveryStatusCode\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Code\",\n                        \"smithy.api#documentation\": \"<p>The status code.</p>\",\n                        \"smithy.api#xmlName\": \"code\"\n                    }\n                },\n                \"Message\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Message\",\n                        \"smithy.api#documentation\": \"<p>The status message.</p>\",\n                        \"smithy.api#xmlName\": \"message\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a log delivery status.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#VerifiedAccessLogDeliveryStatusCode\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"SUCCESS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"success\"\n                    }\n                },\n                \"FAILED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"failed\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VerifiedAccessLogKinesisDataFirehoseDestination\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Enabled\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Enabled\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether logging is enabled.</p>\",\n                        \"smithy.api#xmlName\": \"enabled\"\n                    }\n                },\n                \"DeliveryStatus\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessLogDeliveryStatus\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DeliveryStatus\",\n                        \"smithy.api#documentation\": \"<p>The delivery status.</p>\",\n                        \"smithy.api#xmlName\": \"deliveryStatus\"\n                    }\n                },\n                \"DeliveryStream\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DeliveryStream\",\n                        \"smithy.api#documentation\": \"<p>The ID of the delivery stream.</p>\",\n                        \"smithy.api#xmlName\": \"deliveryStream\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Options for Kinesis as a logging destination.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#VerifiedAccessLogKinesisDataFirehoseDestinationOptions\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Enabled\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>Indicates whether logging is enabled.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DeliveryStream\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the delivery stream.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes Amazon Kinesis Data Firehose logging options.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#VerifiedAccessLogOptions\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"S3\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessLogS3DestinationOptions\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Sends Verified Access logs to Amazon S3.</p>\"\n                    }\n                },\n                \"CloudWatchLogs\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessLogCloudWatchLogsDestinationOptions\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Sends Verified Access logs to CloudWatch Logs.</p>\"\n                    }\n                },\n                \"KinesisDataFirehose\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessLogKinesisDataFirehoseDestinationOptions\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Sends Verified Access logs to Kinesis.</p>\"\n                    }\n                },\n                \"LogVersion\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The logging version.</p>\\n         <p>Valid values: <code>ocsf-0.1</code> | <code>ocsf-1.0.0-rc.2</code>\\n         </p>\"\n                    }\n                },\n                \"IncludeTrustContext\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether to include trust data sent by trust providers in the logs.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Options for Verified Access logs.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#VerifiedAccessLogS3Destination\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Enabled\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Enabled\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether logging is enabled.</p>\",\n                        \"smithy.api#xmlName\": \"enabled\"\n                    }\n                },\n                \"DeliveryStatus\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessLogDeliveryStatus\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DeliveryStatus\",\n                        \"smithy.api#documentation\": \"<p>The delivery status.</p>\",\n                        \"smithy.api#xmlName\": \"deliveryStatus\"\n                    }\n                },\n                \"BucketName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"BucketName\",\n                        \"smithy.api#documentation\": \"<p>The bucket name.</p>\",\n                        \"smithy.api#xmlName\": \"bucketName\"\n                    }\n                },\n                \"Prefix\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Prefix\",\n                        \"smithy.api#documentation\": \"<p>The bucket prefix.</p>\",\n                        \"smithy.api#xmlName\": \"prefix\"\n                    }\n                },\n                \"BucketOwner\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"BucketOwner\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account number that owns the bucket.</p>\",\n                        \"smithy.api#xmlName\": \"bucketOwner\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Options for Amazon S3 as a logging destination.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#VerifiedAccessLogS3DestinationOptions\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Enabled\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>Indicates whether logging is enabled.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"BucketName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The bucket name.</p>\"\n                    }\n                },\n                \"Prefix\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The bucket prefix.</p>\"\n                    }\n                },\n                \"BucketOwner\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the Amazon Web Services account that owns the Amazon S3 bucket.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Options for Amazon S3 as a logging destination.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#VerifiedAccessLogs\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"S3\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessLogS3Destination\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"S3\",\n                        \"smithy.api#documentation\": \"<p>Amazon S3 logging options.</p>\",\n                        \"smithy.api#xmlName\": \"s3\"\n                    }\n                },\n                \"CloudWatchLogs\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessLogCloudWatchLogsDestination\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CloudWatchLogs\",\n                        \"smithy.api#documentation\": \"<p>CloudWatch Logs logging destination.</p>\",\n                        \"smithy.api#xmlName\": \"cloudWatchLogs\"\n                    }\n                },\n                \"KinesisDataFirehose\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessLogKinesisDataFirehoseDestination\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"KinesisDataFirehose\",\n                        \"smithy.api#documentation\": \"<p>Kinesis logging destination.</p>\",\n                        \"smithy.api#xmlName\": \"kinesisDataFirehose\"\n                    }\n                },\n                \"LogVersion\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LogVersion\",\n                        \"smithy.api#documentation\": \"<p>The log version.</p>\",\n                        \"smithy.api#xmlName\": \"logVersion\"\n                    }\n                },\n                \"IncludeTrustContext\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IncludeTrustContext\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether trust data is included in the logs.</p>\",\n                        \"smithy.api#xmlName\": \"includeTrustContext\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the options for Verified Access logs.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#VerifiedAccessSseSpecificationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CustomerManagedKeyEnabled\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>\\n         Enable or disable the use of customer managed KMS keys for server side encryption.\\n      </p>\\n         <p>Valid values: <code>True</code> | <code>False</code>\\n         </p>\"\n                    }\n                },\n                \"KmsKeyArn\": {\n                    \"target\": \"com.amazonaws.ec2#KmsKeyArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>\\n         The ARN of the KMS key.\\n      </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>\\n         Verified Access provides server side encryption by default to data at rest using Amazon Web Services-owned KMS keys. You also have the option of using customer managed KMS keys, which can be specified using the options below. \\n      </p>\"\n            }\n        },\n        \"com.amazonaws.ec2#VerifiedAccessSseSpecificationResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CustomerManagedKeyEnabled\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CustomerManagedKeyEnabled\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether customer managed KMS keys are in use for server side encryption.</p>\\n         <p>Valid values: <code>True</code> | <code>False</code>\\n         </p>\",\n                        \"smithy.api#xmlName\": \"customerManagedKeyEnabled\"\n                    }\n                },\n                \"KmsKeyArn\": {\n                    \"target\": \"com.amazonaws.ec2#KmsKeyArn\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"KmsKeyArn\",\n                        \"smithy.api#documentation\": \"<p>The ARN of the KMS key.</p>\",\n                        \"smithy.api#xmlName\": \"kmsKeyArn\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The options in use for server side encryption.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#VerifiedAccessTrustProvider\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VerifiedAccessTrustProviderId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VerifiedAccessTrustProviderId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Amazon Web Services Verified Access trust provider.</p>\",\n                        \"smithy.api#xmlName\": \"verifiedAccessTrustProviderId\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Description\",\n                        \"smithy.api#documentation\": \"<p>A description for the Amazon Web Services Verified Access trust provider.</p>\",\n                        \"smithy.api#xmlName\": \"description\"\n                    }\n                },\n                \"TrustProviderType\": {\n                    \"target\": \"com.amazonaws.ec2#TrustProviderType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TrustProviderType\",\n                        \"smithy.api#documentation\": \"<p>The type of Verified Access trust provider.</p>\",\n                        \"smithy.api#xmlName\": \"trustProviderType\"\n                    }\n                },\n                \"UserTrustProviderType\": {\n                    \"target\": \"com.amazonaws.ec2#UserTrustProviderType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"UserTrustProviderType\",\n                        \"smithy.api#documentation\": \"<p>The type of user-based trust provider.</p>\",\n                        \"smithy.api#xmlName\": \"userTrustProviderType\"\n                    }\n                },\n                \"DeviceTrustProviderType\": {\n                    \"target\": \"com.amazonaws.ec2#DeviceTrustProviderType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DeviceTrustProviderType\",\n                        \"smithy.api#documentation\": \"<p>The type of device-based trust provider.</p>\",\n                        \"smithy.api#xmlName\": \"deviceTrustProviderType\"\n                    }\n                },\n                \"OidcOptions\": {\n                    \"target\": \"com.amazonaws.ec2#OidcOptions\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OidcOptions\",\n                        \"smithy.api#documentation\": \"<p>The options for an OpenID Connect-compatible user-identity trust provider.</p>\",\n                        \"smithy.api#xmlName\": \"oidcOptions\"\n                    }\n                },\n                \"DeviceOptions\": {\n                    \"target\": \"com.amazonaws.ec2#DeviceOptions\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DeviceOptions\",\n                        \"smithy.api#documentation\": \"<p>The options for device-identity trust provider.</p>\",\n                        \"smithy.api#xmlName\": \"deviceOptions\"\n                    }\n                },\n                \"PolicyReferenceName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PolicyReferenceName\",\n                        \"smithy.api#documentation\": \"<p>The identifier to be used when working with policy rules.</p>\",\n                        \"smithy.api#xmlName\": \"policyReferenceName\"\n                    }\n                },\n                \"CreationTime\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CreationTime\",\n                        \"smithy.api#documentation\": \"<p>The creation time.</p>\",\n                        \"smithy.api#xmlName\": \"creationTime\"\n                    }\n                },\n                \"LastUpdatedTime\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LastUpdatedTime\",\n                        \"smithy.api#documentation\": \"<p>The last updated time.</p>\",\n                        \"smithy.api#xmlName\": \"lastUpdatedTime\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>The tags.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                },\n                \"SseSpecification\": {\n                    \"target\": \"com.amazonaws.ec2#VerifiedAccessSseSpecificationResponse\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SseSpecification\",\n                        \"smithy.api#documentation\": \"<p>The options in use for server side encryption.</p>\",\n                        \"smithy.api#xmlName\": \"sseSpecification\"\n                    }\n                },\n                \"NativeApplicationOidcOptions\": {\n                    \"target\": \"com.amazonaws.ec2#NativeApplicationOidcOptions\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NativeApplicationOidcOptions\",\n                        \"smithy.api#documentation\": \"<p>The OpenID Connect (OIDC) options.</p>\",\n                        \"smithy.api#xmlName\": \"nativeApplicationOidcOptions\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a Verified Access trust provider.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#VerifiedAccessTrustProviderCondensed\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VerifiedAccessTrustProviderId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VerifiedAccessTrustProviderId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the trust provider.</p>\",\n                        \"smithy.api#xmlName\": \"verifiedAccessTrustProviderId\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Description\",\n                        \"smithy.api#documentation\": \"<p>The description of trust provider.</p>\",\n                        \"smithy.api#xmlName\": \"description\"\n                    }\n                },\n                \"TrustProviderType\": {\n                    \"target\": \"com.amazonaws.ec2#TrustProviderType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TrustProviderType\",\n                        \"smithy.api#documentation\": \"<p>The type of trust provider (user- or device-based).</p>\",\n                        \"smithy.api#xmlName\": \"trustProviderType\"\n                    }\n                },\n                \"UserTrustProviderType\": {\n                    \"target\": \"com.amazonaws.ec2#UserTrustProviderType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"UserTrustProviderType\",\n                        \"smithy.api#documentation\": \"<p>The type of user-based trust provider.</p>\",\n                        \"smithy.api#xmlName\": \"userTrustProviderType\"\n                    }\n                },\n                \"DeviceTrustProviderType\": {\n                    \"target\": \"com.amazonaws.ec2#DeviceTrustProviderType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DeviceTrustProviderType\",\n                        \"smithy.api#documentation\": \"<p>The type of device-based trust provider.</p>\",\n                        \"smithy.api#xmlName\": \"deviceTrustProviderType\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Condensed information about a trust provider.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#VerifiedAccessTrustProviderCondensedList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#VerifiedAccessTrustProviderCondensed\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VerifiedAccessTrustProviderId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#VerifiedAccessTrustProviderIdList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#VerifiedAccessTrustProviderId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VerifiedAccessTrustProviderList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#VerifiedAccessTrustProvider\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VersionDescription\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 255\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VersionStringList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#String\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VgwTelemetry\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AcceptedRouteCount\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AcceptedRouteCount\",\n                        \"smithy.api#documentation\": \"<p>The number of accepted routes.</p>\",\n                        \"smithy.api#xmlName\": \"acceptedRouteCount\"\n                    }\n                },\n                \"LastStatusChange\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LastStatusChange\",\n                        \"smithy.api#documentation\": \"<p>The date and time of the last change in status. This field is updated when changes in IKE (Phase 1), IPSec (Phase 2), or BGP status are detected.</p>\",\n                        \"smithy.api#xmlName\": \"lastStatusChange\"\n                    }\n                },\n                \"OutsideIpAddress\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OutsideIpAddress\",\n                        \"smithy.api#documentation\": \"<p>The Internet-routable IP address of the virtual private gateway's outside\\n            interface.</p>\",\n                        \"smithy.api#xmlName\": \"outsideIpAddress\"\n                    }\n                },\n                \"Status\": {\n                    \"target\": \"com.amazonaws.ec2#TelemetryStatus\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Status\",\n                        \"smithy.api#documentation\": \"<p>The status of the VPN tunnel.</p>\",\n                        \"smithy.api#xmlName\": \"status\"\n                    }\n                },\n                \"StatusMessage\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"StatusMessage\",\n                        \"smithy.api#documentation\": \"<p>If an error occurs, a description of the error.</p>\",\n                        \"smithy.api#xmlName\": \"statusMessage\"\n                    }\n                },\n                \"CertificateArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CertificateArn\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the VPN tunnel endpoint certificate.</p>\",\n                        \"smithy.api#xmlName\": \"certificateArn\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes telemetry for a VPN tunnel.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#VgwTelemetryList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#VgwTelemetry\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VirtualizationType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"hvm\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"hvm\"\n                    }\n                },\n                \"paravirtual\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"paravirtual\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VirtualizationTypeList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#VirtualizationType\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VirtualizationTypeSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#VirtualizationType\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 2\n                }\n            }\n        },\n        \"com.amazonaws.ec2#Volume\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AvailabilityZoneId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AvailabilityZoneId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Availability Zone for the volume.</p>\",\n                        \"smithy.api#xmlName\": \"availabilityZoneId\"\n                    }\n                },\n                \"OutpostArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OutpostArn\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the Outpost.</p>\",\n                        \"smithy.api#xmlName\": \"outpostArn\"\n                    }\n                },\n                \"Iops\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Iops\",\n                        \"smithy.api#documentation\": \"<p>The number of I/O operations per second (IOPS). For <code>gp3</code>, <code>io1</code>, and <code>io2</code> volumes, this represents \\n      the number of IOPS that are provisioned for the volume. For <code>gp2</code> volumes, this represents the baseline \\n      performance of the volume and the rate at which the volume accumulates I/O credits for bursting.</p>\",\n                        \"smithy.api#xmlName\": \"iops\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>Any tags assigned to the volume.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                },\n                \"VolumeType\": {\n                    \"target\": \"com.amazonaws.ec2#VolumeType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VolumeType\",\n                        \"smithy.api#documentation\": \"<p>The volume type.</p>\",\n                        \"smithy.api#xmlName\": \"volumeType\"\n                    }\n                },\n                \"FastRestored\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"FastRestored\",\n                        \"smithy.api#documentation\": \"<note>\\n            <p>This parameter is not returned by CreateVolume.</p>\\n         </note>\\n         <p>Indicates whether the volume was created using fast snapshot restore.</p>\",\n                        \"smithy.api#xmlName\": \"fastRestored\"\n                    }\n                },\n                \"MultiAttachEnabled\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"MultiAttachEnabled\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether Amazon EBS Multi-Attach is enabled.</p>\",\n                        \"smithy.api#xmlName\": \"multiAttachEnabled\"\n                    }\n                },\n                \"Throughput\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Throughput\",\n                        \"smithy.api#documentation\": \"<p>The throughput that the volume supports, in MiB/s.</p>\",\n                        \"smithy.api#xmlName\": \"throughput\"\n                    }\n                },\n                \"SseType\": {\n                    \"target\": \"com.amazonaws.ec2#SSEType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SseType\",\n                        \"smithy.api#documentation\": \"<note>\\n            <p>This parameter is not returned by CreateVolume.</p>\\n         </note>\\n         <p>Reserved for future use.</p>\",\n                        \"smithy.api#xmlName\": \"sseType\"\n                    }\n                },\n                \"Operator\": {\n                    \"target\": \"com.amazonaws.ec2#OperatorResponse\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Operator\",\n                        \"smithy.api#documentation\": \"<p>The service provider that manages the volume.</p>\",\n                        \"smithy.api#xmlName\": \"operator\"\n                    }\n                },\n                \"VolumeInitializationRate\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VolumeInitializationRate\",\n                        \"smithy.api#documentation\": \"<p>The Amazon EBS Provisioned Rate for Volume Initialization (volume initialization rate) specified for the volume during creation, \\n      in MiB/s. If no volume initialization rate was specified, the value is <code>null</code>.</p>\",\n                        \"smithy.api#xmlName\": \"volumeInitializationRate\"\n                    }\n                },\n                \"VolumeId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VolumeId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the volume.</p>\",\n                        \"smithy.api#xmlName\": \"volumeId\"\n                    }\n                },\n                \"Size\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Size\",\n                        \"smithy.api#documentation\": \"<p>The size of the volume, in GiBs.</p>\",\n                        \"smithy.api#xmlName\": \"size\"\n                    }\n                },\n                \"SnapshotId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SnapshotId\",\n                        \"smithy.api#documentation\": \"<p>The snapshot from which the volume was created, if applicable.</p>\",\n                        \"smithy.api#xmlName\": \"snapshotId\"\n                    }\n                },\n                \"AvailabilityZone\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AvailabilityZone\",\n                        \"smithy.api#documentation\": \"<p>The Availability Zone for the volume.</p>\",\n                        \"smithy.api#xmlName\": \"availabilityZone\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#VolumeState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Status\",\n                        \"smithy.api#documentation\": \"<p>The volume state.</p>\",\n                        \"smithy.api#xmlName\": \"status\"\n                    }\n                },\n                \"CreateTime\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CreateTime\",\n                        \"smithy.api#documentation\": \"<p>The time stamp when volume creation was initiated.</p>\",\n                        \"smithy.api#xmlName\": \"createTime\"\n                    }\n                },\n                \"Attachments\": {\n                    \"target\": \"com.amazonaws.ec2#VolumeAttachmentList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AttachmentSet\",\n                        \"smithy.api#documentation\": \"<note>\\n            <p>This parameter is not returned by CreateVolume.</p>\\n         </note>\\n         <p>Information about the volume attachments.</p>\",\n                        \"smithy.api#xmlName\": \"attachmentSet\"\n                    }\n                },\n                \"Encrypted\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Encrypted\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether the volume is encrypted.</p>\",\n                        \"smithy.api#xmlName\": \"encrypted\"\n                    }\n                },\n                \"KmsKeyId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"KmsKeyId\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the KMS key that was used to protect the\\n      volume encryption key for the volume.</p>\",\n                        \"smithy.api#xmlName\": \"kmsKeyId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a volume.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#VolumeAttachment\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DeleteOnTermination\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DeleteOnTermination\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether the EBS volume is deleted on instance termination.</p>\",\n                        \"smithy.api#xmlName\": \"deleteOnTermination\"\n                    }\n                },\n                \"AssociatedResource\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AssociatedResource\",\n                        \"smithy.api#documentation\": \"<p>The ARN of the Amazon Web Services-managed resource \\n      to which the volume is attached.</p>\",\n                        \"smithy.api#xmlName\": \"associatedResource\"\n                    }\n                },\n                \"InstanceOwningService\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceOwningService\",\n                        \"smithy.api#documentation\": \"<p>The service principal of the Amazon Web Services service that owns the underlying \\n      resource to which the volume is attached.</p>\\n         <p>This parameter is returned only for volumes that are attached to \\n      Amazon Web Services-managed resources.</p>\",\n                        \"smithy.api#xmlName\": \"instanceOwningService\"\n                    }\n                },\n                \"VolumeId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VolumeId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the volume.</p>\",\n                        \"smithy.api#xmlName\": \"volumeId\"\n                    }\n                },\n                \"InstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the instance.</p>\\n         <p>If the volume is attached to an Amazon Web Services-managed resource, this parameter \\n      returns <code>null</code>.</p>\",\n                        \"smithy.api#xmlName\": \"instanceId\"\n                    }\n                },\n                \"Device\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Device\",\n                        \"smithy.api#documentation\": \"<p>The device name.</p>\\n         <p>If the volume is attached to an Amazon Web Services-managed resource, this parameter \\n      returns <code>null</code>.</p>\",\n                        \"smithy.api#xmlName\": \"device\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#VolumeAttachmentState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Status\",\n                        \"smithy.api#documentation\": \"<p>The attachment state of the volume.</p>\",\n                        \"smithy.api#xmlName\": \"status\"\n                    }\n                },\n                \"AttachTime\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AttachTime\",\n                        \"smithy.api#documentation\": \"<p>The time stamp when the attachment initiated.</p>\",\n                        \"smithy.api#xmlName\": \"attachTime\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes volume attachment details.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#VolumeAttachmentList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#VolumeAttachment\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VolumeAttachmentState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"attaching\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"attaching\"\n                    }\n                },\n                \"attached\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"attached\"\n                    }\n                },\n                \"detaching\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"detaching\"\n                    }\n                },\n                \"detached\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"detached\"\n                    }\n                },\n                \"busy\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"busy\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VolumeAttributeName\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"autoEnableIO\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"autoEnableIO\"\n                    }\n                },\n                \"productCodes\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"productCodes\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VolumeDetail\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Size\": {\n                    \"target\": \"com.amazonaws.ec2#Long\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Size\",\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The size of the volume, in GiB.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"size\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes an EBS volume.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#VolumeId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#VolumeIdStringList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#VolumeId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"VolumeId\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VolumeIdWithResolver\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#VolumeList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#Volume\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VolumeModification\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VolumeId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VolumeId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the volume.</p>\",\n                        \"smithy.api#xmlName\": \"volumeId\"\n                    }\n                },\n                \"ModificationState\": {\n                    \"target\": \"com.amazonaws.ec2#VolumeModificationState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ModificationState\",\n                        \"smithy.api#documentation\": \"<p>The current modification state.</p>\",\n                        \"smithy.api#xmlName\": \"modificationState\"\n                    }\n                },\n                \"StatusMessage\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"StatusMessage\",\n                        \"smithy.api#documentation\": \"<p>A status message about the modification progress or failure.</p>\",\n                        \"smithy.api#xmlName\": \"statusMessage\"\n                    }\n                },\n                \"TargetSize\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TargetSize\",\n                        \"smithy.api#documentation\": \"<p>The target size of the volume, in GiB.</p>\",\n                        \"smithy.api#xmlName\": \"targetSize\"\n                    }\n                },\n                \"TargetIops\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TargetIops\",\n                        \"smithy.api#documentation\": \"<p>The target IOPS rate of the volume.</p>\",\n                        \"smithy.api#xmlName\": \"targetIops\"\n                    }\n                },\n                \"TargetVolumeType\": {\n                    \"target\": \"com.amazonaws.ec2#VolumeType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TargetVolumeType\",\n                        \"smithy.api#documentation\": \"<p>The target EBS volume type of the volume.</p>\",\n                        \"smithy.api#xmlName\": \"targetVolumeType\"\n                    }\n                },\n                \"TargetThroughput\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TargetThroughput\",\n                        \"smithy.api#documentation\": \"<p>The target throughput of the volume, in MiB/s.</p>\",\n                        \"smithy.api#xmlName\": \"targetThroughput\"\n                    }\n                },\n                \"TargetMultiAttachEnabled\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TargetMultiAttachEnabled\",\n                        \"smithy.api#documentation\": \"<p>The target setting for Amazon EBS Multi-Attach.</p>\",\n                        \"smithy.api#xmlName\": \"targetMultiAttachEnabled\"\n                    }\n                },\n                \"OriginalSize\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OriginalSize\",\n                        \"smithy.api#documentation\": \"<p>The original size of the volume, in GiB.</p>\",\n                        \"smithy.api#xmlName\": \"originalSize\"\n                    }\n                },\n                \"OriginalIops\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OriginalIops\",\n                        \"smithy.api#documentation\": \"<p>The original IOPS rate of the volume.</p>\",\n                        \"smithy.api#xmlName\": \"originalIops\"\n                    }\n                },\n                \"OriginalVolumeType\": {\n                    \"target\": \"com.amazonaws.ec2#VolumeType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OriginalVolumeType\",\n                        \"smithy.api#documentation\": \"<p>The original EBS volume type of the volume.</p>\",\n                        \"smithy.api#xmlName\": \"originalVolumeType\"\n                    }\n                },\n                \"OriginalThroughput\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OriginalThroughput\",\n                        \"smithy.api#documentation\": \"<p>The original throughput of the volume, in MiB/s.</p>\",\n                        \"smithy.api#xmlName\": \"originalThroughput\"\n                    }\n                },\n                \"OriginalMultiAttachEnabled\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OriginalMultiAttachEnabled\",\n                        \"smithy.api#documentation\": \"<p>The original setting for Amazon EBS Multi-Attach.</p>\",\n                        \"smithy.api#xmlName\": \"originalMultiAttachEnabled\"\n                    }\n                },\n                \"Progress\": {\n                    \"target\": \"com.amazonaws.ec2#Long\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Progress\",\n                        \"smithy.api#documentation\": \"<p>The modification progress, from 0 to 100 percent complete.</p>\",\n                        \"smithy.api#xmlName\": \"progress\"\n                    }\n                },\n                \"StartTime\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"StartTime\",\n                        \"smithy.api#documentation\": \"<p>The modification start time.</p>\",\n                        \"smithy.api#xmlName\": \"startTime\"\n                    }\n                },\n                \"EndTime\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EndTime\",\n                        \"smithy.api#documentation\": \"<p>The modification completion or failure time.</p>\",\n                        \"smithy.api#xmlName\": \"endTime\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the modification status of an EBS volume.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#VolumeModificationList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#VolumeModification\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VolumeModificationState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"modifying\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"modifying\"\n                    }\n                },\n                \"optimizing\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"optimizing\"\n                    }\n                },\n                \"completed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"completed\"\n                    }\n                },\n                \"failed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"failed\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VolumeState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"creating\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"creating\"\n                    }\n                },\n                \"available\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"available\"\n                    }\n                },\n                \"in_use\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"in-use\"\n                    }\n                },\n                \"deleting\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"deleting\"\n                    }\n                },\n                \"deleted\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"deleted\"\n                    }\n                },\n                \"error\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"error\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VolumeStatusAction\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Code\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Code\",\n                        \"smithy.api#documentation\": \"<p>The code identifying the operation, for example, <code>enable-volume-io</code>.</p>\",\n                        \"smithy.api#xmlName\": \"code\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Description\",\n                        \"smithy.api#documentation\": \"<p>A description of the operation.</p>\",\n                        \"smithy.api#xmlName\": \"description\"\n                    }\n                },\n                \"EventId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EventId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the event associated with this operation.</p>\",\n                        \"smithy.api#xmlName\": \"eventId\"\n                    }\n                },\n                \"EventType\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EventType\",\n                        \"smithy.api#documentation\": \"<p>The event type associated with this operation.</p>\",\n                        \"smithy.api#xmlName\": \"eventType\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a volume status operation code.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#VolumeStatusActionsList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#VolumeStatusAction\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VolumeStatusAttachmentStatus\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"IoPerformance\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IoPerformance\",\n                        \"smithy.api#documentation\": \"<p>The maximum IOPS supported by the attached instance.</p>\",\n                        \"smithy.api#xmlName\": \"ioPerformance\"\n                    }\n                },\n                \"InstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the attached instance.</p>\",\n                        \"smithy.api#xmlName\": \"instanceId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about the instances to which the volume is attached.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#VolumeStatusAttachmentStatusList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#VolumeStatusAttachmentStatus\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VolumeStatusDetails\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Name\": {\n                    \"target\": \"com.amazonaws.ec2#VolumeStatusName\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Name\",\n                        \"smithy.api#documentation\": \"<p>The name of the volume status.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>io-enabled</code> - Indicates the volume I/O status. For more \\n          information, see <a href=\\\"https://docs.aws.amazon.com/ebs/latest/userguide/monitoring-volume-checks.html\\\">Amazon EBS volume \\n            status checks</a>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>io-performance</code> - Indicates the volume performance status. \\n          For more information, see <a href=\\\"https://docs.aws.amazon.com/ebs/latest/userguide/monitoring-volume-checks.html\\\">Amazon EBS volume \\n            status checks</a>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>initialization-state</code> - Indicates the status of the volume \\n          initialization process. For more information, see <a href=\\\"https://docs.aws.amazon.com/ebs/latest/userguide/initalize-volume.html\\\">Initialize Amazon EBS volumes</a>.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"name\"\n                    }\n                },\n                \"Status\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Status\",\n                        \"smithy.api#documentation\": \"<p>The intended status of the volume status.</p>\",\n                        \"smithy.api#xmlName\": \"status\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a volume status.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#VolumeStatusDetailsList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#VolumeStatusDetails\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VolumeStatusEvent\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Description\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Description\",\n                        \"smithy.api#documentation\": \"<p>A description of the event.</p>\",\n                        \"smithy.api#xmlName\": \"description\"\n                    }\n                },\n                \"EventId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EventId\",\n                        \"smithy.api#documentation\": \"<p>The ID of this event.</p>\",\n                        \"smithy.api#xmlName\": \"eventId\"\n                    }\n                },\n                \"EventType\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EventType\",\n                        \"smithy.api#documentation\": \"<p>The type of this event.</p>\",\n                        \"smithy.api#xmlName\": \"eventType\"\n                    }\n                },\n                \"NotAfter\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NotAfter\",\n                        \"smithy.api#documentation\": \"<p>The latest end time of the event.</p>\",\n                        \"smithy.api#xmlName\": \"notAfter\"\n                    }\n                },\n                \"NotBefore\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NotBefore\",\n                        \"smithy.api#documentation\": \"<p>The earliest start time of the event.</p>\",\n                        \"smithy.api#xmlName\": \"notBefore\"\n                    }\n                },\n                \"InstanceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the instance associated with the event.</p>\",\n                        \"smithy.api#xmlName\": \"instanceId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a volume status event.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#VolumeStatusEventsList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#VolumeStatusEvent\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VolumeStatusInfo\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Details\": {\n                    \"target\": \"com.amazonaws.ec2#VolumeStatusDetailsList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Details\",\n                        \"smithy.api#documentation\": \"<p>The details of the volume status.</p>\",\n                        \"smithy.api#xmlName\": \"details\"\n                    }\n                },\n                \"Status\": {\n                    \"target\": \"com.amazonaws.ec2#VolumeStatusInfoStatus\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Status\",\n                        \"smithy.api#documentation\": \"<p>The status of the volume.</p>\",\n                        \"smithy.api#xmlName\": \"status\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the status of a volume.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#VolumeStatusInfoStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ok\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ok\"\n                    }\n                },\n                \"impaired\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"impaired\"\n                    }\n                },\n                \"insufficient_data\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"insufficient-data\"\n                    }\n                },\n                \"warning\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"warning\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VolumeStatusItem\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Actions\": {\n                    \"target\": \"com.amazonaws.ec2#VolumeStatusActionsList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ActionsSet\",\n                        \"smithy.api#documentation\": \"<p>The details of the operation.</p>\",\n                        \"smithy.api#xmlName\": \"actionsSet\"\n                    }\n                },\n                \"AvailabilityZone\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AvailabilityZone\",\n                        \"smithy.api#documentation\": \"<p>The Availability Zone of the volume.</p>\",\n                        \"smithy.api#xmlName\": \"availabilityZone\"\n                    }\n                },\n                \"OutpostArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OutpostArn\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the Outpost.</p>\",\n                        \"smithy.api#xmlName\": \"outpostArn\"\n                    }\n                },\n                \"Events\": {\n                    \"target\": \"com.amazonaws.ec2#VolumeStatusEventsList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EventsSet\",\n                        \"smithy.api#documentation\": \"<p>A list of events associated with the volume.</p>\",\n                        \"smithy.api#xmlName\": \"eventsSet\"\n                    }\n                },\n                \"VolumeId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VolumeId\",\n                        \"smithy.api#documentation\": \"<p>The volume ID.</p>\",\n                        \"smithy.api#xmlName\": \"volumeId\"\n                    }\n                },\n                \"VolumeStatus\": {\n                    \"target\": \"com.amazonaws.ec2#VolumeStatusInfo\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VolumeStatus\",\n                        \"smithy.api#documentation\": \"<p>The volume status.</p>\",\n                        \"smithy.api#xmlName\": \"volumeStatus\"\n                    }\n                },\n                \"AttachmentStatuses\": {\n                    \"target\": \"com.amazonaws.ec2#VolumeStatusAttachmentStatusList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AttachmentStatuses\",\n                        \"smithy.api#documentation\": \"<p>Information about the instances to which the volume is attached.</p>\",\n                        \"smithy.api#xmlName\": \"attachmentStatuses\"\n                    }\n                },\n                \"InitializationStatusDetails\": {\n                    \"target\": \"com.amazonaws.ec2#InitializationStatusDetails\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InitializationStatusDetails\",\n                        \"smithy.api#documentation\": \"<p>Information about the volume initialization. It can take up to 5 minutes \\n      for the volume initialization information to be updated.</p>\\n         <p>Only available for volumes created from snapshots. Not available for empty \\n      volumes created without a snapshot.</p>\\n         <p>For more information, see \\n      <a href=\\\"https://docs.aws.amazon.com/ebs/latest/userguide/initalize-volume.html\\\">\\n        Initialize Amazon EBS volumes</a>.</p>\",\n                        \"smithy.api#xmlName\": \"initializationStatusDetails\"\n                    }\n                },\n                \"AvailabilityZoneId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AvailabilityZoneId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Availability Zone.</p>\",\n                        \"smithy.api#xmlName\": \"availabilityZoneId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the volume status.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#VolumeStatusList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#VolumeStatusItem\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VolumeStatusName\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"io_enabled\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"io-enabled\"\n                    }\n                },\n                \"io_performance\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"io-performance\"\n                    }\n                },\n                \"initialization_state\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"initialization-state\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VolumeType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"standard\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"standard\"\n                    }\n                },\n                \"io1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"io1\"\n                    }\n                },\n                \"io2\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"io2\"\n                    }\n                },\n                \"gp2\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"gp2\"\n                    }\n                },\n                \"sc1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"sc1\"\n                    }\n                },\n                \"st1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"st1\"\n                    }\n                },\n                \"gp3\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"gp3\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#Vpc\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"OwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OwnerId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Amazon Web Services account that owns the VPC.</p>\",\n                        \"smithy.api#xmlName\": \"ownerId\"\n                    }\n                },\n                \"InstanceTenancy\": {\n                    \"target\": \"com.amazonaws.ec2#Tenancy\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InstanceTenancy\",\n                        \"smithy.api#documentation\": \"<p>The allowed tenancy of instances launched into the VPC.</p>\",\n                        \"smithy.api#xmlName\": \"instanceTenancy\"\n                    }\n                },\n                \"Ipv6CidrBlockAssociationSet\": {\n                    \"target\": \"com.amazonaws.ec2#VpcIpv6CidrBlockAssociationSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Ipv6CidrBlockAssociationSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the IPv6 CIDR blocks associated with the VPC.</p>\",\n                        \"smithy.api#xmlName\": \"ipv6CidrBlockAssociationSet\"\n                    }\n                },\n                \"CidrBlockAssociationSet\": {\n                    \"target\": \"com.amazonaws.ec2#VpcCidrBlockAssociationSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CidrBlockAssociationSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the IPv4 CIDR blocks associated with the VPC.</p>\",\n                        \"smithy.api#xmlName\": \"cidrBlockAssociationSet\"\n                    }\n                },\n                \"IsDefault\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IsDefault\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether the VPC is the default VPC.</p>\",\n                        \"smithy.api#xmlName\": \"isDefault\"\n                    }\n                },\n                \"EncryptionControl\": {\n                    \"target\": \"com.amazonaws.ec2#VpcEncryptionControl\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EncryptionControl\",\n                        \"smithy.api#xmlName\": \"encryptionControl\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>Any tags assigned to the VPC.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                },\n                \"BlockPublicAccessStates\": {\n                    \"target\": \"com.amazonaws.ec2#BlockPublicAccessStates\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"BlockPublicAccessStates\",\n                        \"smithy.api#documentation\": \"<p>The state of VPC Block Public Access (BPA).</p>\",\n                        \"smithy.api#xmlName\": \"blockPublicAccessStates\"\n                    }\n                },\n                \"VpcId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the VPC.</p>\",\n                        \"smithy.api#xmlName\": \"vpcId\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#VpcState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The current state of the VPC.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                },\n                \"CidrBlock\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CidrBlock\",\n                        \"smithy.api#documentation\": \"<p>The primary IPv4 CIDR block for the VPC.</p>\",\n                        \"smithy.api#xmlName\": \"cidrBlock\"\n                    }\n                },\n                \"DhcpOptionsId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DhcpOptionsId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the set of DHCP options you've associated with the VPC.</p>\",\n                        \"smithy.api#xmlName\": \"dhcpOptionsId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a VPC.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#VpcAttachment\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VpcId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the VPC.</p>\",\n                        \"smithy.api#xmlName\": \"vpcId\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#AttachmentStatus\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The current state of the attachment.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes an attachment between a virtual private gateway and a VPC.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#VpcAttachmentList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#VpcAttachment\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VpcAttributeName\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"enableDnsSupport\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"enableDnsSupport\"\n                    }\n                },\n                \"enableDnsHostnames\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"enableDnsHostnames\"\n                    }\n                },\n                \"enableNetworkAddressUsageMetrics\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"enableNetworkAddressUsageMetrics\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VpcBlockPublicAccessExclusion\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ExclusionId\": {\n                    \"target\": \"com.amazonaws.ec2#VpcBlockPublicAccessExclusionId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ExclusionId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the exclusion.</p>\",\n                        \"smithy.api#xmlName\": \"exclusionId\"\n                    }\n                },\n                \"InternetGatewayExclusionMode\": {\n                    \"target\": \"com.amazonaws.ec2#InternetGatewayExclusionMode\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InternetGatewayExclusionMode\",\n                        \"smithy.api#documentation\": \"<p>The exclusion mode for internet gateway traffic.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>allow-bidirectional</code>: Allow all internet traffic to and from the excluded VPCs and subnets.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>allow-egress</code>: Allow outbound internet traffic from the excluded VPCs and subnets. Block inbound internet traffic to the excluded VPCs and subnets. Only applies when VPC Block Public Access is set to Bidirectional.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"internetGatewayExclusionMode\"\n                    }\n                },\n                \"ResourceArn\": {\n                    \"target\": \"com.amazonaws.ec2#ResourceArn\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResourceArn\",\n                        \"smithy.api#documentation\": \"<p>The ARN of the exclusion.</p>\",\n                        \"smithy.api#xmlName\": \"resourceArn\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#VpcBlockPublicAccessExclusionState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The state of the exclusion.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                },\n                \"Reason\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Reason\",\n                        \"smithy.api#documentation\": \"<p>The reason for the current exclusion state.</p>\",\n                        \"smithy.api#xmlName\": \"reason\"\n                    }\n                },\n                \"CreationTimestamp\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CreationTimestamp\",\n                        \"smithy.api#documentation\": \"<p>When the exclusion was created.</p>\",\n                        \"smithy.api#xmlName\": \"creationTimestamp\"\n                    }\n                },\n                \"LastUpdateTimestamp\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LastUpdateTimestamp\",\n                        \"smithy.api#documentation\": \"<p>When the exclusion was last updated.</p>\",\n                        \"smithy.api#xmlName\": \"lastUpdateTimestamp\"\n                    }\n                },\n                \"DeletionTimestamp\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DeletionTimestamp\",\n                        \"smithy.api#documentation\": \"<p>When the exclusion was deleted.</p>\",\n                        \"smithy.api#xmlName\": \"deletionTimestamp\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>\\n            <code>tag</code> - The key/value combination of a tag assigned to the resource. Use the tag key in the filter name and the tag value as the filter value.\\n    For example, to find all resources that have a tag with the key <code>Owner</code> and the value <code>TeamA</code>, specify <code>tag:Owner</code> for the filter name and <code>TeamA</code> for the filter value.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A VPC BPA exclusion is a mode that can be applied to a single VPC or subnet that exempts it from the account’s BPA mode and will allow bidirectional or egress-only access. You can create BPA exclusions for VPCs and subnets even when BPA is not enabled on the account to ensure that there is no traffic disruption to the exclusions when VPC BPA is turned on. To learn more about VPC BPA, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/userguide/security-vpc-bpa.html\\\">Block public access to VPCs and subnets</a> in the <i>Amazon VPC User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#VpcBlockPublicAccessExclusionId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#VpcBlockPublicAccessExclusionIdList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#VpcBlockPublicAccessExclusionId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VpcBlockPublicAccessExclusionList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#VpcBlockPublicAccessExclusion\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VpcBlockPublicAccessExclusionState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"create_in_progress\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"create-in-progress\"\n                    }\n                },\n                \"create_complete\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"create-complete\"\n                    }\n                },\n                \"create_failed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"create-failed\"\n                    }\n                },\n                \"update_in_progress\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"update-in-progress\"\n                    }\n                },\n                \"update_complete\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"update-complete\"\n                    }\n                },\n                \"update_failed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"update-failed\"\n                    }\n                },\n                \"delete_in_progress\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"delete-in-progress\"\n                    }\n                },\n                \"delete_complete\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"delete-complete\"\n                    }\n                },\n                \"disable_in_progress\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"disable-in-progress\"\n                    }\n                },\n                \"disable_complete\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"disable-complete\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VpcBlockPublicAccessExclusionsAllowed\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"allowed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"allowed\"\n                    }\n                },\n                \"not_allowed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"not-allowed\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VpcBlockPublicAccessOptions\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AwsAccountId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AwsAccountId\",\n                        \"smithy.api#documentation\": \"<p>An Amazon Web Services account ID.</p>\",\n                        \"smithy.api#xmlName\": \"awsAccountId\"\n                    }\n                },\n                \"AwsRegion\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AwsRegion\",\n                        \"smithy.api#documentation\": \"<p>An Amazon Web Services Region.</p>\",\n                        \"smithy.api#xmlName\": \"awsRegion\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#VpcBlockPublicAccessState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The current state of VPC BPA.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                },\n                \"InternetGatewayBlockMode\": {\n                    \"target\": \"com.amazonaws.ec2#InternetGatewayBlockMode\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InternetGatewayBlockMode\",\n                        \"smithy.api#documentation\": \"<p>The current mode of VPC BPA.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>off</code>: VPC BPA is not enabled and traffic is allowed to and from internet gateways and egress-only internet gateways in this Region.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>block-bidirectional</code>: Block all traffic to and from internet gateways and egress-only internet gateways in this Region (except for excluded VPCs and subnets).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>block-ingress</code>: Block all internet traffic to the VPCs in this Region (except for VPCs or subnets which are excluded). Only traffic to and from NAT gateways and egress-only internet gateways is allowed because these gateways only allow outbound connections to be established.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"internetGatewayBlockMode\"\n                    }\n                },\n                \"Reason\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Reason\",\n                        \"smithy.api#documentation\": \"<p>The reason for the current state.</p>\",\n                        \"smithy.api#xmlName\": \"reason\"\n                    }\n                },\n                \"LastUpdateTimestamp\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LastUpdateTimestamp\",\n                        \"smithy.api#documentation\": \"<p>The last time the VPC BPA mode was updated.</p>\",\n                        \"smithy.api#xmlName\": \"lastUpdateTimestamp\"\n                    }\n                },\n                \"ManagedBy\": {\n                    \"target\": \"com.amazonaws.ec2#ManagedBy\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ManagedBy\",\n                        \"smithy.api#documentation\": \"<p>The entity that manages the state of VPC BPA. Possible values include:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>account</code> - The state is managed by the account.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>declarative-policy</code> - The state is managed by a declarative policy\\n                    and can't be modified by the account.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#xmlName\": \"managedBy\"\n                    }\n                },\n                \"ExclusionsAllowed\": {\n                    \"target\": \"com.amazonaws.ec2#VpcBlockPublicAccessExclusionsAllowed\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ExclusionsAllowed\",\n                        \"smithy.api#documentation\": \"<p>Determines if exclusions are allowed. If you have <a href=\\\"https://docs.aws.amazon.com/vpc/latest/userguide/security-vpc-bpa.html#security-vpc-bpa-exclusions-orgs\\\">enabled VPC BPA at the Organization level</a>, exclusions may be\\n                <code>not-allowed</code>. Otherwise, they are <code>allowed</code>.</p>\",\n                        \"smithy.api#xmlName\": \"exclusionsAllowed\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>VPC Block Public Access (BPA) enables you to block resources in VPCs and subnets that you own in a Region from reaching or being reached from the internet through internet gateways and egress-only internet gateways. To learn more about VPC BPA, see <a href=\\\"https://docs.aws.amazon.com/vpc/latest/userguide/security-vpc-bpa.html\\\">Block public access to VPCs and subnets</a> in the <i>Amazon VPC User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#VpcBlockPublicAccessState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"default_state\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"default-state\"\n                    }\n                },\n                \"update_in_progress\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"update-in-progress\"\n                    }\n                },\n                \"update_complete\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"update-complete\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VpcCidrAssociationId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#VpcCidrBlockAssociation\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AssociationId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AssociationId\",\n                        \"smithy.api#documentation\": \"<p>The association ID for the IPv4 CIDR block.</p>\",\n                        \"smithy.api#xmlName\": \"associationId\"\n                    }\n                },\n                \"CidrBlock\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CidrBlock\",\n                        \"smithy.api#documentation\": \"<p>The IPv4 CIDR block.</p>\",\n                        \"smithy.api#xmlName\": \"cidrBlock\"\n                    }\n                },\n                \"CidrBlockState\": {\n                    \"target\": \"com.amazonaws.ec2#VpcCidrBlockState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CidrBlockState\",\n                        \"smithy.api#documentation\": \"<p>Information about the state of the CIDR block.</p>\",\n                        \"smithy.api#xmlName\": \"cidrBlockState\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes an IPv4 CIDR block associated with a VPC.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#VpcCidrBlockAssociationSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#VpcCidrBlockAssociation\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VpcCidrBlockState\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#VpcCidrBlockStateCode\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The state of the CIDR block.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                },\n                \"StatusMessage\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"StatusMessage\",\n                        \"smithy.api#documentation\": \"<p>A message about the status of the CIDR block, if applicable.</p>\",\n                        \"smithy.api#xmlName\": \"statusMessage\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the state of a CIDR block.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#VpcCidrBlockStateCode\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"associating\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"associating\"\n                    }\n                },\n                \"associated\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"associated\"\n                    }\n                },\n                \"disassociating\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"disassociating\"\n                    }\n                },\n                \"disassociated\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"disassociated\"\n                    }\n                },\n                \"failing\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"failing\"\n                    }\n                },\n                \"failed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"failed\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VpcClassicLink\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ClassicLinkEnabled\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ClassicLinkEnabled\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether the VPC is enabled for ClassicLink.</p>\",\n                        \"smithy.api#xmlName\": \"classicLinkEnabled\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>Any tags assigned to the VPC.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                },\n                \"VpcId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the VPC.</p>\",\n                        \"smithy.api#xmlName\": \"vpcId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>Deprecated.</p>\\n         </note>\\n         <p>Describes whether a VPC is enabled for ClassicLink.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#VpcClassicLinkIdList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#VpcId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"VpcId\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VpcClassicLinkList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#VpcClassicLink\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VpcEncryptionControl\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VpcId\": {\n                    \"target\": \"com.amazonaws.ec2#VpcId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcId\",\n                        \"smithy.api#xmlName\": \"vpcId\"\n                    }\n                },\n                \"VpcEncryptionControlId\": {\n                    \"target\": \"com.amazonaws.ec2#VpcEncryptionControlId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcEncryptionControlId\",\n                        \"smithy.api#xmlName\": \"vpcEncryptionControlId\"\n                    }\n                },\n                \"Mode\": {\n                    \"target\": \"com.amazonaws.ec2#VpcEncryptionControlMode\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Mode\",\n                        \"smithy.api#xmlName\": \"mode\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#VpcEncryptionControlState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                },\n                \"StateMessage\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"StateMessage\",\n                        \"smithy.api#xmlName\": \"stateMessage\"\n                    }\n                },\n                \"ResourceExclusions\": {\n                    \"target\": \"com.amazonaws.ec2#VpcEncryptionControlExclusions\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResourceExclusions\",\n                        \"smithy.api#xmlName\": \"resourceExclusions\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VpcEncryptionControlExclusion\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#VpcEncryptionControlExclusionState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                },\n                \"StateMessage\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"StateMessage\",\n                        \"smithy.api#xmlName\": \"stateMessage\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VpcEncryptionControlExclusionState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"enabling\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"enabling\"\n                    }\n                },\n                \"enabled\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"enabled\"\n                    }\n                },\n                \"disabling\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"disabling\"\n                    }\n                },\n                \"disabled\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"disabled\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VpcEncryptionControlExclusions\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InternetGateway\": {\n                    \"target\": \"com.amazonaws.ec2#VpcEncryptionControlExclusion\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"InternetGateway\",\n                        \"smithy.api#xmlName\": \"internetGateway\"\n                    }\n                },\n                \"EgressOnlyInternetGateway\": {\n                    \"target\": \"com.amazonaws.ec2#VpcEncryptionControlExclusion\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EgressOnlyInternetGateway\",\n                        \"smithy.api#xmlName\": \"egressOnlyInternetGateway\"\n                    }\n                },\n                \"NatGateway\": {\n                    \"target\": \"com.amazonaws.ec2#VpcEncryptionControlExclusion\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NatGateway\",\n                        \"smithy.api#xmlName\": \"natGateway\"\n                    }\n                },\n                \"VirtualPrivateGateway\": {\n                    \"target\": \"com.amazonaws.ec2#VpcEncryptionControlExclusion\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VirtualPrivateGateway\",\n                        \"smithy.api#xmlName\": \"virtualPrivateGateway\"\n                    }\n                },\n                \"VpcPeering\": {\n                    \"target\": \"com.amazonaws.ec2#VpcEncryptionControlExclusion\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcPeering\",\n                        \"smithy.api#xmlName\": \"vpcPeering\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VpcEncryptionControlId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#VpcEncryptionControlMode\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"monitor\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"monitor\"\n                    }\n                },\n                \"enforce\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"enforce\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VpcEncryptionControlState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"enforce_in_progress\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"enforce-in-progress\"\n                    }\n                },\n                \"monitor_in_progress\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"monitor-in-progress\"\n                    }\n                },\n                \"enforce_failed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"enforce-failed\"\n                    }\n                },\n                \"monitor_failed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"monitor-failed\"\n                    }\n                },\n                \"deleting\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"deleting\"\n                    }\n                },\n                \"deleted\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"deleted\"\n                    }\n                },\n                \"available\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"available\"\n                    }\n                },\n                \"creating\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"creating\"\n                    }\n                },\n                \"delete_failed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"delete-failed\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VpcEndpoint\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VpcEndpointId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcEndpointId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"vpcEndpointId\"\n                    }\n                },\n                \"VpcEndpointType\": {\n                    \"target\": \"com.amazonaws.ec2#VpcEndpointType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcEndpointType\",\n                        \"smithy.api#documentation\": \"<p>The type of endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"vpcEndpointType\"\n                    }\n                },\n                \"VpcId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the VPC to which the endpoint is associated.</p>\",\n                        \"smithy.api#xmlName\": \"vpcId\"\n                    }\n                },\n                \"ServiceName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ServiceName\",\n                        \"smithy.api#documentation\": \"<p>The name of the service to which the endpoint is associated.</p>\",\n                        \"smithy.api#xmlName\": \"serviceName\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#State\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The state of the endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                },\n                \"PolicyDocument\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PolicyDocument\",\n                        \"smithy.api#documentation\": \"<p>The policy document associated with the endpoint, if applicable.</p>\",\n                        \"smithy.api#xmlName\": \"policyDocument\"\n                    }\n                },\n                \"RouteTableIds\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RouteTableIdSet\",\n                        \"smithy.api#documentation\": \"<p>(Gateway endpoint) The IDs of the route tables associated with the endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"routeTableIdSet\"\n                    }\n                },\n                \"SubnetIds\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"SubnetIdSet\",\n                        \"smithy.api#documentation\": \"<p>(Interface endpoint) The subnets for the endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"subnetIdSet\"\n                    }\n                },\n                \"Groups\": {\n                    \"target\": \"com.amazonaws.ec2#GroupIdentifierSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"GroupSet\",\n                        \"smithy.api#documentation\": \"<p>(Interface endpoint) Information about the security groups that are associated with\\n            the network interface.</p>\",\n                        \"smithy.api#xmlName\": \"groupSet\"\n                    }\n                },\n                \"IpAddressType\": {\n                    \"target\": \"com.amazonaws.ec2#IpAddressType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpAddressType\",\n                        \"smithy.api#documentation\": \"<p>The IP address type for the endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"ipAddressType\"\n                    }\n                },\n                \"DnsOptions\": {\n                    \"target\": \"com.amazonaws.ec2#DnsOptions\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DnsOptions\",\n                        \"smithy.api#documentation\": \"<p>The DNS options for the endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"dnsOptions\"\n                    }\n                },\n                \"PrivateDnsEnabled\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PrivateDnsEnabled\",\n                        \"smithy.api#documentation\": \"<p>(Interface endpoint) Indicates whether the VPC is associated with a private hosted zone.</p>\",\n                        \"smithy.api#xmlName\": \"privateDnsEnabled\"\n                    }\n                },\n                \"RequesterManaged\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RequesterManaged\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether the endpoint is being managed by its service.</p>\",\n                        \"smithy.api#xmlName\": \"requesterManaged\"\n                    }\n                },\n                \"NetworkInterfaceIds\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkInterfaceIdSet\",\n                        \"smithy.api#documentation\": \"<p>(Interface endpoint) The network interfaces for the endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"networkInterfaceIdSet\"\n                    }\n                },\n                \"DnsEntries\": {\n                    \"target\": \"com.amazonaws.ec2#DnsEntrySet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DnsEntrySet\",\n                        \"smithy.api#documentation\": \"<p>(Interface endpoint) The DNS entries for the endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"dnsEntrySet\"\n                    }\n                },\n                \"CreationTimestamp\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CreationTimestamp\",\n                        \"smithy.api#documentation\": \"<p>The date and time that the endpoint was created.</p>\",\n                        \"smithy.api#xmlName\": \"creationTimestamp\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>The tags assigned to the endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                },\n                \"OwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OwnerId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Amazon Web Services account that owns the endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"ownerId\"\n                    }\n                },\n                \"LastError\": {\n                    \"target\": \"com.amazonaws.ec2#LastError\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LastError\",\n                        \"smithy.api#documentation\": \"<p>The last error that occurred for endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"lastError\"\n                    }\n                },\n                \"Ipv4Prefixes\": {\n                    \"target\": \"com.amazonaws.ec2#SubnetIpPrefixesList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Ipv4PrefixSet\",\n                        \"smithy.api#documentation\": \"<p>Array of IPv4 prefixes.</p>\",\n                        \"smithy.api#xmlName\": \"ipv4PrefixSet\"\n                    }\n                },\n                \"Ipv6Prefixes\": {\n                    \"target\": \"com.amazonaws.ec2#SubnetIpPrefixesList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Ipv6PrefixSet\",\n                        \"smithy.api#documentation\": \"<p>Array of IPv6 prefixes.</p>\",\n                        \"smithy.api#xmlName\": \"ipv6PrefixSet\"\n                    }\n                },\n                \"FailureReason\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"FailureReason\",\n                        \"smithy.api#documentation\": \"<p>Reason for the failure.</p>\",\n                        \"smithy.api#xmlName\": \"failureReason\"\n                    }\n                },\n                \"ServiceNetworkArn\": {\n                    \"target\": \"com.amazonaws.ec2#ServiceNetworkArn\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ServiceNetworkArn\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the service network.</p>\",\n                        \"smithy.api#xmlName\": \"serviceNetworkArn\"\n                    }\n                },\n                \"ResourceConfigurationArn\": {\n                    \"target\": \"com.amazonaws.ec2#ResourceConfigurationArn\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResourceConfigurationArn\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the resource configuration.</p>\",\n                        \"smithy.api#xmlName\": \"resourceConfigurationArn\"\n                    }\n                },\n                \"ServiceRegion\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ServiceRegion\",\n                        \"smithy.api#documentation\": \"<p>The Region where the service is hosted.</p>\",\n                        \"smithy.api#xmlName\": \"serviceRegion\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a VPC endpoint.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#VpcEndpointAssociation\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Id\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Id\",\n                        \"smithy.api#documentation\": \"<p>The ID of the VPC endpoint association.</p>\",\n                        \"smithy.api#xmlName\": \"id\"\n                    }\n                },\n                \"VpcEndpointId\": {\n                    \"target\": \"com.amazonaws.ec2#VpcEndpointId\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcEndpointId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the VPC endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"vpcEndpointId\"\n                    }\n                },\n                \"ServiceNetworkArn\": {\n                    \"target\": \"com.amazonaws.ec2#ServiceNetworkArn\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ServiceNetworkArn\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the service network.</p>\",\n                        \"smithy.api#xmlName\": \"serviceNetworkArn\"\n                    }\n                },\n                \"ServiceNetworkName\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ServiceNetworkName\",\n                        \"smithy.api#documentation\": \"<p>The name of the service network.</p>\",\n                        \"smithy.api#xmlName\": \"serviceNetworkName\"\n                    }\n                },\n                \"AssociatedResourceAccessibility\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AssociatedResourceAccessibility\",\n                        \"smithy.api#documentation\": \"<p>The connectivity status of the resources associated to a VPC endpoint. The resource is\\n         accessible if the associated resource configuration is <code>AVAILABLE</code>, otherwise\\n         the resource is inaccessible.</p>\",\n                        \"smithy.api#xmlName\": \"associatedResourceAccessibility\"\n                    }\n                },\n                \"FailureReason\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"FailureReason\",\n                        \"smithy.api#documentation\": \"<p>A message related to why an VPC endpoint association failed.</p>\",\n                        \"smithy.api#xmlName\": \"failureReason\"\n                    }\n                },\n                \"FailureCode\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"FailureCode\",\n                        \"smithy.api#documentation\": \"<p>An error code related to why an VPC endpoint association failed.</p>\",\n                        \"smithy.api#xmlName\": \"failureCode\"\n                    }\n                },\n                \"DnsEntry\": {\n                    \"target\": \"com.amazonaws.ec2#DnsEntry\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DnsEntry\",\n                        \"smithy.api#documentation\": \"<p>The DNS entry of the VPC endpoint association.</p>\",\n                        \"smithy.api#xmlName\": \"dnsEntry\"\n                    }\n                },\n                \"PrivateDnsEntry\": {\n                    \"target\": \"com.amazonaws.ec2#DnsEntry\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PrivateDnsEntry\",\n                        \"smithy.api#documentation\": \"<p>The private DNS entry of the VPC endpoint association.</p>\",\n                        \"smithy.api#xmlName\": \"privateDnsEntry\"\n                    }\n                },\n                \"AssociatedResourceArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AssociatedResourceArn\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the associated resource.</p>\",\n                        \"smithy.api#xmlName\": \"associatedResourceArn\"\n                    }\n                },\n                \"ResourceConfigurationGroupArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ResourceConfigurationGroupArn\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the resource configuration group.</p>\",\n                        \"smithy.api#xmlName\": \"resourceConfigurationGroupArn\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>The tags to apply to the VPC endpoint association.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the VPC resources, VPC endpoint services, Lattice services, or service\\n         networks associated with the VPC endpoint.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#VpcEndpointAssociationSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#VpcEndpointAssociation\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VpcEndpointConnection\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ServiceId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ServiceId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the service to which the endpoint is connected.</p>\",\n                        \"smithy.api#xmlName\": \"serviceId\"\n                    }\n                },\n                \"VpcEndpointId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcEndpointId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the VPC endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"vpcEndpointId\"\n                    }\n                },\n                \"VpcEndpointOwner\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcEndpointOwner\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Amazon Web Services account that owns the VPC endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"vpcEndpointOwner\"\n                    }\n                },\n                \"VpcEndpointState\": {\n                    \"target\": \"com.amazonaws.ec2#State\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcEndpointState\",\n                        \"smithy.api#documentation\": \"<p>The state of the VPC endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"vpcEndpointState\"\n                    }\n                },\n                \"CreationTimestamp\": {\n                    \"target\": \"com.amazonaws.ec2#MillisecondDateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CreationTimestamp\",\n                        \"smithy.api#documentation\": \"<p>The date and time that the VPC endpoint was created.</p>\",\n                        \"smithy.api#xmlName\": \"creationTimestamp\"\n                    }\n                },\n                \"DnsEntries\": {\n                    \"target\": \"com.amazonaws.ec2#DnsEntrySet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DnsEntrySet\",\n                        \"smithy.api#documentation\": \"<p>The DNS entries for the VPC endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"dnsEntrySet\"\n                    }\n                },\n                \"NetworkLoadBalancerArns\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkLoadBalancerArnSet\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Names (ARNs) of the network load balancers for the service.</p>\",\n                        \"smithy.api#xmlName\": \"networkLoadBalancerArnSet\"\n                    }\n                },\n                \"GatewayLoadBalancerArns\": {\n                    \"target\": \"com.amazonaws.ec2#ValueStringList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"GatewayLoadBalancerArnSet\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Names (ARNs) of the Gateway Load Balancers for the service.</p>\",\n                        \"smithy.api#xmlName\": \"gatewayLoadBalancerArnSet\"\n                    }\n                },\n                \"IpAddressType\": {\n                    \"target\": \"com.amazonaws.ec2#IpAddressType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpAddressType\",\n                        \"smithy.api#documentation\": \"<p>The IP address type for the endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"ipAddressType\"\n                    }\n                },\n                \"VpcEndpointConnectionId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcEndpointConnectionId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the VPC endpoint connection.</p>\",\n                        \"smithy.api#xmlName\": \"vpcEndpointConnectionId\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>The tags.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                },\n                \"VpcEndpointRegion\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcEndpointRegion\",\n                        \"smithy.api#documentation\": \"<p>The Region of the endpoint.</p>\",\n                        \"smithy.api#xmlName\": \"vpcEndpointRegion\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a VPC endpoint connection to a service.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#VpcEndpointConnectionSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#VpcEndpointConnection\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VpcEndpointId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#VpcEndpointIdList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#VpcEndpointId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VpcEndpointRouteTableIdList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#RouteTableId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VpcEndpointSecurityGroupIdList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#SecurityGroupId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VpcEndpointServiceId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#VpcEndpointServiceIdList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#VpcEndpointServiceId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VpcEndpointSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#VpcEndpoint\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VpcEndpointSubnetIdList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#SubnetId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VpcEndpointType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"Interface\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Interface\"\n                    }\n                },\n                \"Gateway\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Gateway\"\n                    }\n                },\n                \"GatewayLoadBalancer\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"GatewayLoadBalancer\"\n                    }\n                },\n                \"Resource\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Resource\"\n                    }\n                },\n                \"ServiceNetwork\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ServiceNetwork\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VpcFlowLogId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#VpcId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#VpcIdStringList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#VpcId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"VpcId\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VpcIpv6CidrBlockAssociation\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AssociationId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AssociationId\",\n                        \"smithy.api#documentation\": \"<p>The association ID for the IPv6 CIDR block.</p>\",\n                        \"smithy.api#xmlName\": \"associationId\"\n                    }\n                },\n                \"Ipv6CidrBlock\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Ipv6CidrBlock\",\n                        \"smithy.api#documentation\": \"<p>The IPv6 CIDR block.</p>\",\n                        \"smithy.api#xmlName\": \"ipv6CidrBlock\"\n                    }\n                },\n                \"Ipv6CidrBlockState\": {\n                    \"target\": \"com.amazonaws.ec2#VpcCidrBlockState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Ipv6CidrBlockState\",\n                        \"smithy.api#documentation\": \"<p>Information about the state of the CIDR block.</p>\",\n                        \"smithy.api#xmlName\": \"ipv6CidrBlockState\"\n                    }\n                },\n                \"NetworkBorderGroup\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"NetworkBorderGroup\",\n                        \"smithy.api#documentation\": \"<p>The name of the unique set of Availability Zones, Local Zones, or Wavelength Zones from\\n      which Amazon Web Services advertises IP addresses, for example, <code>us-east-1-wl1-bos-wlz-1</code>.</p>\",\n                        \"smithy.api#xmlName\": \"networkBorderGroup\"\n                    }\n                },\n                \"Ipv6Pool\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Ipv6Pool\",\n                        \"smithy.api#documentation\": \"<p>The ID of the IPv6 address pool from which the IPv6 CIDR block is allocated.</p>\",\n                        \"smithy.api#xmlName\": \"ipv6Pool\"\n                    }\n                },\n                \"Ipv6AddressAttribute\": {\n                    \"target\": \"com.amazonaws.ec2#Ipv6AddressAttribute\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Ipv6AddressAttribute\",\n                        \"smithy.api#documentation\": \"<p>Public IPv6 addresses are those advertised on the internet from Amazon Web Services. Private IP addresses are not and cannot be advertised on the internet from Amazon Web Services.</p>\",\n                        \"smithy.api#xmlName\": \"ipv6AddressAttribute\"\n                    }\n                },\n                \"IpSource\": {\n                    \"target\": \"com.amazonaws.ec2#IpSource\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"IpSource\",\n                        \"smithy.api#documentation\": \"<p>The source that allocated the IP address space. <code>byoip</code> or <code>amazon</code> indicates public IP address space allocated by Amazon or space that you have allocated with Bring your own IP (BYOIP). <code>none</code> indicates private space.</p>\",\n                        \"smithy.api#xmlName\": \"ipSource\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes an IPv6 CIDR block associated with a VPC.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#VpcIpv6CidrBlockAssociationSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#VpcIpv6CidrBlockAssociation\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VpcList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#Vpc\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VpcPeeringConnection\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccepterVpcInfo\": {\n                    \"target\": \"com.amazonaws.ec2#VpcPeeringConnectionVpcInfo\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AccepterVpcInfo\",\n                        \"smithy.api#documentation\": \"<p>Information about the accepter VPC. CIDR block information is only returned when describing an active VPC peering connection.</p>\",\n                        \"smithy.api#xmlName\": \"accepterVpcInfo\"\n                    }\n                },\n                \"ExpirationTime\": {\n                    \"target\": \"com.amazonaws.ec2#DateTime\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ExpirationTime\",\n                        \"smithy.api#documentation\": \"<p>The time that an unaccepted VPC peering connection will expire.</p>\",\n                        \"smithy.api#xmlName\": \"expirationTime\"\n                    }\n                },\n                \"RequesterVpcInfo\": {\n                    \"target\": \"com.amazonaws.ec2#VpcPeeringConnectionVpcInfo\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RequesterVpcInfo\",\n                        \"smithy.api#documentation\": \"<p>Information about the requester VPC. CIDR block information is only returned when describing an active VPC peering connection.</p>\",\n                        \"smithy.api#xmlName\": \"requesterVpcInfo\"\n                    }\n                },\n                \"Status\": {\n                    \"target\": \"com.amazonaws.ec2#VpcPeeringConnectionStateReason\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Status\",\n                        \"smithy.api#documentation\": \"<p>The status of the VPC peering connection.</p>\",\n                        \"smithy.api#xmlName\": \"status\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>Any tags assigned to the resource.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                },\n                \"VpcPeeringConnectionId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcPeeringConnectionId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the VPC peering connection.</p>\",\n                        \"smithy.api#xmlName\": \"vpcPeeringConnectionId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a VPC peering connection.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#VpcPeeringConnectionId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#VpcPeeringConnectionIdList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#VpcPeeringConnectionId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VpcPeeringConnectionIdWithResolver\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#VpcPeeringConnectionList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#VpcPeeringConnection\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VpcPeeringConnectionOptionsDescription\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AllowDnsResolutionFromRemoteVpc\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AllowDnsResolutionFromRemoteVpc\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether a local VPC can resolve public DNS hostnames to private IP addresses \\n        when queried from instances in a peer VPC.</p>\",\n                        \"smithy.api#xmlName\": \"allowDnsResolutionFromRemoteVpc\"\n                    }\n                },\n                \"AllowEgressFromLocalClassicLinkToRemoteVpc\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AllowEgressFromLocalClassicLinkToRemoteVpc\",\n                        \"smithy.api#documentation\": \"<p>Deprecated.</p>\",\n                        \"smithy.api#xmlName\": \"allowEgressFromLocalClassicLinkToRemoteVpc\"\n                    }\n                },\n                \"AllowEgressFromLocalVpcToRemoteClassicLink\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AllowEgressFromLocalVpcToRemoteClassicLink\",\n                        \"smithy.api#documentation\": \"<p>Deprecated.</p>\",\n                        \"smithy.api#xmlName\": \"allowEgressFromLocalVpcToRemoteClassicLink\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the VPC peering connection options.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#VpcPeeringConnectionStateReason\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Code\": {\n                    \"target\": \"com.amazonaws.ec2#VpcPeeringConnectionStateReasonCode\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Code\",\n                        \"smithy.api#documentation\": \"<p>The status of the VPC peering connection.</p>\",\n                        \"smithy.api#xmlName\": \"code\"\n                    }\n                },\n                \"Message\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Message\",\n                        \"smithy.api#documentation\": \"<p>A message that provides more information about the status, if applicable.</p>\",\n                        \"smithy.api#xmlName\": \"message\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the status of a VPC peering connection.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#VpcPeeringConnectionStateReasonCode\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"initiating_request\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"initiating-request\"\n                    }\n                },\n                \"pending_acceptance\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"pending-acceptance\"\n                    }\n                },\n                \"active\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"active\"\n                    }\n                },\n                \"deleted\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"deleted\"\n                    }\n                },\n                \"rejected\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"rejected\"\n                    }\n                },\n                \"failed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"failed\"\n                    }\n                },\n                \"expired\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"expired\"\n                    }\n                },\n                \"provisioning\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"provisioning\"\n                    }\n                },\n                \"deleting\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"deleting\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VpcPeeringConnectionVpcInfo\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CidrBlock\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CidrBlock\",\n                        \"smithy.api#documentation\": \"<p>The IPv4 CIDR block for the VPC.</p>\",\n                        \"smithy.api#xmlName\": \"cidrBlock\"\n                    }\n                },\n                \"Ipv6CidrBlockSet\": {\n                    \"target\": \"com.amazonaws.ec2#Ipv6CidrBlockSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Ipv6CidrBlockSet\",\n                        \"smithy.api#documentation\": \"<p>The IPv6 CIDR block for the VPC.</p>\",\n                        \"smithy.api#xmlName\": \"ipv6CidrBlockSet\"\n                    }\n                },\n                \"CidrBlockSet\": {\n                    \"target\": \"com.amazonaws.ec2#CidrBlockSet\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CidrBlockSet\",\n                        \"smithy.api#documentation\": \"<p>Information about the IPv4 CIDR blocks for the VPC.</p>\",\n                        \"smithy.api#xmlName\": \"cidrBlockSet\"\n                    }\n                },\n                \"OwnerId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OwnerId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the Amazon Web Services account that owns the VPC.</p>\",\n                        \"smithy.api#xmlName\": \"ownerId\"\n                    }\n                },\n                \"PeeringOptions\": {\n                    \"target\": \"com.amazonaws.ec2#VpcPeeringConnectionOptionsDescription\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PeeringOptions\",\n                        \"smithy.api#documentation\": \"<p>Information about the VPC peering connection options for the accepter or requester VPC.</p>\",\n                        \"smithy.api#xmlName\": \"peeringOptions\"\n                    }\n                },\n                \"VpcId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpcId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the VPC.</p>\",\n                        \"smithy.api#xmlName\": \"vpcId\"\n                    }\n                },\n                \"Region\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Region\",\n                        \"smithy.api#documentation\": \"<p>The Region in which the VPC is located.</p>\",\n                        \"smithy.api#xmlName\": \"region\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a VPC in a VPC peering connection.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#VpcState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"pending\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"pending\"\n                    }\n                },\n                \"available\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"available\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VpcTenancy\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"default\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"default\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VpnConnection\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Category\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Category\",\n                        \"smithy.api#documentation\": \"<p>The category of the VPN connection. A value of <code>VPN</code> indicates an Amazon Web Services VPN connection. A value of <code>VPN-Classic</code> indicates an Amazon Web Services Classic VPN connection.</p>\",\n                        \"smithy.api#xmlName\": \"category\"\n                    }\n                },\n                \"TransitGatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransitGatewayId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the transit gateway associated with the VPN connection.</p>\",\n                        \"smithy.api#xmlName\": \"transitGatewayId\"\n                    }\n                },\n                \"CoreNetworkArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CoreNetworkArn\",\n                        \"smithy.api#documentation\": \"<p>The ARN of the core network.</p>\",\n                        \"smithy.api#xmlName\": \"coreNetworkArn\"\n                    }\n                },\n                \"CoreNetworkAttachmentArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CoreNetworkAttachmentArn\",\n                        \"smithy.api#documentation\": \"<p>The ARN of the core network attachment.</p>\",\n                        \"smithy.api#xmlName\": \"coreNetworkAttachmentArn\"\n                    }\n                },\n                \"GatewayAssociationState\": {\n                    \"target\": \"com.amazonaws.ec2#GatewayAssociationState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"GatewayAssociationState\",\n                        \"smithy.api#documentation\": \"<p>The current state of the gateway association.</p>\",\n                        \"smithy.api#xmlName\": \"gatewayAssociationState\"\n                    }\n                },\n                \"Options\": {\n                    \"target\": \"com.amazonaws.ec2#VpnConnectionOptions\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Options\",\n                        \"smithy.api#documentation\": \"<p>The VPN connection options.</p>\",\n                        \"smithy.api#xmlName\": \"options\"\n                    }\n                },\n                \"Routes\": {\n                    \"target\": \"com.amazonaws.ec2#VpnStaticRouteList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Routes\",\n                        \"smithy.api#documentation\": \"<p>The static routes associated with the VPN connection.</p>\",\n                        \"smithy.api#xmlName\": \"routes\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>Any tags assigned to the VPN connection.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                },\n                \"VgwTelemetry\": {\n                    \"target\": \"com.amazonaws.ec2#VgwTelemetryList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VgwTelemetry\",\n                        \"smithy.api#documentation\": \"<p>Information about the VPN tunnel.</p>\",\n                        \"smithy.api#xmlName\": \"vgwTelemetry\"\n                    }\n                },\n                \"PreSharedKeyArn\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"PreSharedKeyArn\",\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the Secrets Manager secret storing the pre-shared key(s) for the VPN connection.</p>\",\n                        \"smithy.api#xmlName\": \"preSharedKeyArn\"\n                    }\n                },\n                \"VpnConnectionId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpnConnectionId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the VPN connection.</p>\",\n                        \"smithy.api#xmlName\": \"vpnConnectionId\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#VpnState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The current state of the VPN connection.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                },\n                \"CustomerGatewayConfiguration\": {\n                    \"target\": \"com.amazonaws.ec2#customerGatewayConfiguration\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CustomerGatewayConfiguration\",\n                        \"smithy.api#documentation\": \"<p>The configuration information for the VPN connection's customer gateway (in the native\\n            XML format). This element is always present in the <a>CreateVpnConnection</a>\\n            response; however, it's present in the <a>DescribeVpnConnections</a> response\\n            only if the VPN connection is in the <code>pending</code> or <code>available</code>\\n            state.</p>\",\n                        \"smithy.api#xmlName\": \"customerGatewayConfiguration\"\n                    }\n                },\n                \"Type\": {\n                    \"target\": \"com.amazonaws.ec2#GatewayType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Type\",\n                        \"smithy.api#documentation\": \"<p>The type of VPN connection.</p>\",\n                        \"smithy.api#xmlName\": \"type\"\n                    }\n                },\n                \"CustomerGatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CustomerGatewayId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the customer gateway at your end of the VPN connection.</p>\",\n                        \"smithy.api#xmlName\": \"customerGatewayId\"\n                    }\n                },\n                \"VpnGatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpnGatewayId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the virtual private gateway at the Amazon Web Services side of the VPN\\n            connection.</p>\",\n                        \"smithy.api#xmlName\": \"vpnGatewayId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a VPN connection.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#VpnConnectionDeviceSampleConfiguration\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#sensitive\": {}\n            }\n        },\n        \"com.amazonaws.ec2#VpnConnectionDeviceType\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VpnConnectionDeviceTypeId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpnConnectionDeviceTypeId\",\n                        \"smithy.api#documentation\": \"<p>Customer gateway device identifier.</p>\",\n                        \"smithy.api#xmlName\": \"vpnConnectionDeviceTypeId\"\n                    }\n                },\n                \"Vendor\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Vendor\",\n                        \"smithy.api#documentation\": \"<p>Customer gateway device vendor.</p>\",\n                        \"smithy.api#xmlName\": \"vendor\"\n                    }\n                },\n                \"Platform\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Platform\",\n                        \"smithy.api#documentation\": \"<p>Customer gateway device platform.</p>\",\n                        \"smithy.api#xmlName\": \"platform\"\n                    }\n                },\n                \"Software\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Software\",\n                        \"smithy.api#documentation\": \"<p>Customer gateway device software version.</p>\",\n                        \"smithy.api#xmlName\": \"software\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>List of customer gateway devices that have a sample configuration file available for\\n            use. You can also see the list of device types with sample configuration files available\\n            under <a href=\\\"https://docs.aws.amazon.com/vpn/latest/s2svpn/your-cgw.html\\\">Your customer\\n                gateway device</a> in the <i>Amazon Web Services Site-to-Site VPN User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#VpnConnectionDeviceTypeId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#VpnConnectionDeviceTypeList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#VpnConnectionDeviceType\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VpnConnectionId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#VpnConnectionIdStringList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#VpnConnectionId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"VpnConnectionId\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VpnConnectionList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#VpnConnection\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VpnConnectionOptions\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"EnableAcceleration\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"EnableAcceleration\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether acceleration is enabled for the VPN connection.</p>\",\n                        \"smithy.api#xmlName\": \"enableAcceleration\"\n                    }\n                },\n                \"StaticRoutesOnly\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"StaticRoutesOnly\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether the VPN connection uses static routes only. Static routes must be\\n            used for devices that don't support BGP.</p>\",\n                        \"smithy.api#xmlName\": \"staticRoutesOnly\"\n                    }\n                },\n                \"LocalIpv4NetworkCidr\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LocalIpv4NetworkCidr\",\n                        \"smithy.api#documentation\": \"<p>The IPv4 CIDR on the customer gateway (on-premises) side of the VPN connection.</p>\",\n                        \"smithy.api#xmlName\": \"localIpv4NetworkCidr\"\n                    }\n                },\n                \"RemoteIpv4NetworkCidr\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RemoteIpv4NetworkCidr\",\n                        \"smithy.api#documentation\": \"<p>The IPv4 CIDR on the Amazon Web Services side of the VPN connection.</p>\",\n                        \"smithy.api#xmlName\": \"remoteIpv4NetworkCidr\"\n                    }\n                },\n                \"LocalIpv6NetworkCidr\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"LocalIpv6NetworkCidr\",\n                        \"smithy.api#documentation\": \"<p>The IPv6 CIDR on the customer gateway (on-premises) side of the VPN connection.</p>\",\n                        \"smithy.api#xmlName\": \"localIpv6NetworkCidr\"\n                    }\n                },\n                \"RemoteIpv6NetworkCidr\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"RemoteIpv6NetworkCidr\",\n                        \"smithy.api#documentation\": \"<p>The IPv6 CIDR on the Amazon Web Services side of the VPN connection.</p>\",\n                        \"smithy.api#xmlName\": \"remoteIpv6NetworkCidr\"\n                    }\n                },\n                \"OutsideIpAddressType\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"OutsideIpAddressType\",\n                        \"smithy.api#documentation\": \"<p>The type of IPv4 address assigned to the outside interface of the customer gateway.</p>\\n         <p>Valid values: <code>PrivateIpv4</code> | <code>PublicIpv4</code> | <code>Ipv6</code>\\n         </p>\\n         <p>Default: <code>PublicIpv4</code>\\n         </p>\",\n                        \"smithy.api#xmlName\": \"outsideIpAddressType\"\n                    }\n                },\n                \"TransportTransitGatewayAttachmentId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TransportTransitGatewayAttachmentId\",\n                        \"smithy.api#documentation\": \"<p>The transit gateway attachment ID in use for the VPN tunnel.</p>\",\n                        \"smithy.api#xmlName\": \"transportTransitGatewayAttachmentId\"\n                    }\n                },\n                \"TunnelInsideIpVersion\": {\n                    \"target\": \"com.amazonaws.ec2#TunnelInsideIpVersion\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TunnelInsideIpVersion\",\n                        \"smithy.api#documentation\": \"<p>Indicates whether the VPN tunnels process IPv4 or IPv6 traffic.</p>\",\n                        \"smithy.api#xmlName\": \"tunnelInsideIpVersion\"\n                    }\n                },\n                \"TunnelOptions\": {\n                    \"target\": \"com.amazonaws.ec2#TunnelOptionsList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TunnelOptionSet\",\n                        \"smithy.api#documentation\": \"<p>Indicates the VPN tunnel options.</p>\",\n                        \"smithy.api#xmlName\": \"tunnelOptionSet\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes VPN connection options.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#VpnConnectionOptionsSpecification\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"EnableAcceleration\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicate whether to enable acceleration for the VPN connection.</p>\\n         <p>Default: <code>false</code>\\n         </p>\"\n                    }\n                },\n                \"TunnelInsideIpVersion\": {\n                    \"target\": \"com.amazonaws.ec2#TunnelInsideIpVersion\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicate whether the VPN tunnels process IPv4 or IPv6 traffic.</p>\\n         <p>Default: <code>ipv4</code>\\n         </p>\"\n                    }\n                },\n                \"TunnelOptions\": {\n                    \"target\": \"com.amazonaws.ec2#VpnTunnelOptionsSpecificationsList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tunnel options for the VPN connection.</p>\"\n                    }\n                },\n                \"LocalIpv4NetworkCidr\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IPv4 CIDR on the customer gateway (on-premises) side of the VPN connection.</p>\\n         <p>Default: <code>0.0.0.0/0</code>\\n         </p>\"\n                    }\n                },\n                \"RemoteIpv4NetworkCidr\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IPv4 CIDR on the Amazon Web Services side of the VPN connection.</p>\\n         <p>Default: <code>0.0.0.0/0</code>\\n         </p>\"\n                    }\n                },\n                \"LocalIpv6NetworkCidr\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IPv6 CIDR on the customer gateway (on-premises) side of the VPN connection.</p>\\n         <p>Default: <code>::/0</code>\\n         </p>\"\n                    }\n                },\n                \"RemoteIpv6NetworkCidr\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IPv6 CIDR on the Amazon Web Services side of the VPN connection.</p>\\n         <p>Default: <code>::/0</code>\\n         </p>\"\n                    }\n                },\n                \"OutsideIpAddressType\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of IP address assigned to the outside interface of the customer gateway device.</p>\\n         <p>Valid values: <code>PrivateIpv4</code> | <code>PublicIpv4</code>  | <code>Ipv6</code>\\n         </p>\\n         <p>Default: <code>PublicIpv4</code>\\n         </p>\"\n                    }\n                },\n                \"TransportTransitGatewayAttachmentId\": {\n                    \"target\": \"com.amazonaws.ec2#TransitGatewayAttachmentId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The transit gateway attachment ID to use for the VPN tunnel.</p>\\n         <p>Required if <code>OutsideIpAddressType</code> is set to <code>PrivateIpv4</code>.</p>\"\n                    }\n                },\n                \"StaticRoutesOnly\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"StaticRoutesOnly\",\n                        \"smithy.api#documentation\": \"<p>Indicate whether the VPN connection uses static routes only. If you are creating a VPN\\n            connection for a device that does not support BGP, you must specify <code>true</code>.\\n            Use <a>CreateVpnConnectionRoute</a> to create a static route.</p>\\n         <p>Default: <code>false</code>\\n         </p>\",\n                        \"smithy.api#xmlName\": \"staticRoutesOnly\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes VPN connection options.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#VpnEcmpSupportValue\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"enable\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"enable\"\n                    }\n                },\n                \"disable\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"disable\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VpnGateway\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AmazonSideAsn\": {\n                    \"target\": \"com.amazonaws.ec2#Long\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AmazonSideAsn\",\n                        \"smithy.api#documentation\": \"<p>The private Autonomous System Number (ASN) for the Amazon side of a BGP\\n            session.</p>\",\n                        \"smithy.api#xmlName\": \"amazonSideAsn\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.ec2#TagList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"TagSet\",\n                        \"smithy.api#documentation\": \"<p>Any tags assigned to the virtual private gateway.</p>\",\n                        \"smithy.api#xmlName\": \"tagSet\"\n                    }\n                },\n                \"VpnGatewayId\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"VpnGatewayId\",\n                        \"smithy.api#documentation\": \"<p>The ID of the virtual private gateway.</p>\",\n                        \"smithy.api#xmlName\": \"vpnGatewayId\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#VpnState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The current state of the virtual private gateway.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                },\n                \"Type\": {\n                    \"target\": \"com.amazonaws.ec2#GatewayType\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Type\",\n                        \"smithy.api#documentation\": \"<p>The type of VPN connection the virtual private gateway supports.</p>\",\n                        \"smithy.api#xmlName\": \"type\"\n                    }\n                },\n                \"AvailabilityZone\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"AvailabilityZone\",\n                        \"smithy.api#documentation\": \"<p>The Availability Zone where the virtual private gateway was created, if applicable.\\n            This field may be empty or not returned.</p>\",\n                        \"smithy.api#xmlName\": \"availabilityZone\"\n                    }\n                },\n                \"VpcAttachments\": {\n                    \"target\": \"com.amazonaws.ec2#VpcAttachmentList\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Attachments\",\n                        \"smithy.api#documentation\": \"<p>Any VPCs attached to the virtual private gateway.</p>\",\n                        \"smithy.api#xmlName\": \"attachments\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a virtual private gateway.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#VpnGatewayId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ec2#VpnGatewayIdStringList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#VpnGatewayId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"VpnGatewayId\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VpnGatewayList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#VpnGateway\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VpnProtocol\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"openvpn\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"openvpn\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VpnState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"pending\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"pending\"\n                    }\n                },\n                \"available\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"available\"\n                    }\n                },\n                \"deleting\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"deleting\"\n                    }\n                },\n                \"deleted\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"deleted\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VpnStaticRoute\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DestinationCidrBlock\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"DestinationCidrBlock\",\n                        \"smithy.api#documentation\": \"<p>The CIDR block associated with the local subnet of the customer data center.</p>\",\n                        \"smithy.api#xmlName\": \"destinationCidrBlock\"\n                    }\n                },\n                \"Source\": {\n                    \"target\": \"com.amazonaws.ec2#VpnStaticRouteSource\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"Source\",\n                        \"smithy.api#documentation\": \"<p>Indicates how the routes were provided.</p>\",\n                        \"smithy.api#xmlName\": \"source\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.ec2#VpnState\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"State\",\n                        \"smithy.api#documentation\": \"<p>The current state of the static route.</p>\",\n                        \"smithy.api#xmlName\": \"state\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a static route for a VPN connection.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#VpnStaticRouteList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#VpnStaticRoute\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VpnStaticRouteSource\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"Static\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Static\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#VpnTunnelLogOptions\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CloudWatchLogOptions\": {\n                    \"target\": \"com.amazonaws.ec2#CloudWatchLogOptions\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"CloudWatchLogOptions\",\n                        \"smithy.api#documentation\": \"<p>Options for sending VPN tunnel logs to CloudWatch.</p>\",\n                        \"smithy.api#xmlName\": \"cloudWatchLogOptions\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Options for logging VPN tunnel activity.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#VpnTunnelLogOptionsSpecification\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CloudWatchLogOptions\": {\n                    \"target\": \"com.amazonaws.ec2#CloudWatchLogOptionsSpecification\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Options for sending VPN tunnel logs to CloudWatch.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Options for logging VPN tunnel activity.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#VpnTunnelOptionsSpecification\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TunnelInsideCidr\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The range of inside IPv4 addresses for the tunnel. Any specified CIDR blocks must be\\n            unique across all VPN connections that use the same virtual private gateway. </p>\\n         <p>Constraints: A size /30 CIDR block from the <code>169.254.0.0/16</code> range. The\\n            following CIDR blocks are reserved and cannot be used:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>169.254.0.0/30</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>169.254.1.0/30</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>169.254.2.0/30</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>169.254.3.0/30</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>169.254.4.0/30</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>169.254.5.0/30</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>169.254.169.252/30</code>\\n               </p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"TunnelInsideIpv6Cidr\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The range of inside IPv6 addresses for the tunnel. Any specified CIDR blocks must be\\n            unique across all VPN connections that use the same transit gateway.</p>\\n         <p>Constraints: A size /126 CIDR block from the local <code>fd00::/8</code> range.</p>\"\n                    }\n                },\n                \"PreSharedKey\": {\n                    \"target\": \"com.amazonaws.ec2#preSharedKey\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The pre-shared key (PSK) to establish initial authentication between the virtual\\n            private gateway and customer gateway.</p>\\n         <p>Constraints: Allowed characters are alphanumeric characters, periods (.), and\\n            underscores (_). Must be between 8 and 64 characters in length and cannot start with\\n            zero (0).</p>\"\n                    }\n                },\n                \"Phase1LifetimeSeconds\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The lifetime for phase 1 of the IKE negotiation, in seconds.</p>\\n         <p>Constraints: A value between 900 and 28,800.</p>\\n         <p>Default: <code>28800</code>\\n         </p>\"\n                    }\n                },\n                \"Phase2LifetimeSeconds\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The lifetime for phase 2 of the IKE negotiation, in seconds.</p>\\n         <p>Constraints: A value between 900 and 3,600. The value must be less than the value for\\n                <code>Phase1LifetimeSeconds</code>.</p>\\n         <p>Default: <code>3600</code>\\n         </p>\"\n                    }\n                },\n                \"RekeyMarginTimeSeconds\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The margin time, in seconds, before the phase 2 lifetime expires, during which the\\n                Amazon Web Services side of the VPN connection performs an IKE rekey. The exact time\\n            of the rekey is randomly selected based on the value for\\n                <code>RekeyFuzzPercentage</code>.</p>\\n         <p>Constraints: A value between 60 and half of <code>Phase2LifetimeSeconds</code>.</p>\\n         <p>Default: <code>270</code>\\n         </p>\"\n                    }\n                },\n                \"RekeyFuzzPercentage\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The percentage of the rekey window (determined by <code>RekeyMarginTimeSeconds</code>)\\n            during which the rekey time is randomly selected.</p>\\n         <p>Constraints: A value between 0 and 100.</p>\\n         <p>Default: <code>100</code>\\n         </p>\"\n                    }\n                },\n                \"ReplayWindowSize\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of packets in an IKE replay window.</p>\\n         <p>Constraints: A value between 64 and 2048.</p>\\n         <p>Default: <code>1024</code>\\n         </p>\"\n                    }\n                },\n                \"DPDTimeoutSeconds\": {\n                    \"target\": \"com.amazonaws.ec2#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of seconds after which a DPD timeout occurs.</p>\\n         <p>Constraints: A value greater than or equal to 30.</p>\\n         <p>Default: <code>30</code>\\n         </p>\"\n                    }\n                },\n                \"DPDTimeoutAction\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The action to take after DPD timeout occurs. Specify <code>restart</code> to restart\\n            the IKE initiation. Specify <code>clear</code> to end the IKE session.</p>\\n         <p>Valid Values: <code>clear</code> | <code>none</code> | <code>restart</code>\\n         </p>\\n         <p>Default: <code>clear</code>\\n         </p>\"\n                    }\n                },\n                \"Phase1EncryptionAlgorithms\": {\n                    \"target\": \"com.amazonaws.ec2#Phase1EncryptionAlgorithmsRequestList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more encryption algorithms that are permitted for the VPN tunnel for phase 1\\n            IKE negotiations.</p>\\n         <p>Valid values: <code>AES128</code> | <code>AES256</code> | <code>AES128-GCM-16</code> |\\n                <code>AES256-GCM-16</code>\\n         </p>\",\n                        \"smithy.api#xmlName\": \"Phase1EncryptionAlgorithm\"\n                    }\n                },\n                \"Phase2EncryptionAlgorithms\": {\n                    \"target\": \"com.amazonaws.ec2#Phase2EncryptionAlgorithmsRequestList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more encryption algorithms that are permitted for the VPN tunnel for phase 2\\n            IKE negotiations.</p>\\n         <p>Valid values: <code>AES128</code> | <code>AES256</code> | <code>AES128-GCM-16</code> |\\n                <code>AES256-GCM-16</code>\\n         </p>\",\n                        \"smithy.api#xmlName\": \"Phase2EncryptionAlgorithm\"\n                    }\n                },\n                \"Phase1IntegrityAlgorithms\": {\n                    \"target\": \"com.amazonaws.ec2#Phase1IntegrityAlgorithmsRequestList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more integrity algorithms that are permitted for the VPN tunnel for phase 1 IKE\\n            negotiations.</p>\\n         <p>Valid values: <code>SHA1</code> | <code>SHA2-256</code> | <code>SHA2-384</code> |\\n                <code>SHA2-512</code>\\n         </p>\",\n                        \"smithy.api#xmlName\": \"Phase1IntegrityAlgorithm\"\n                    }\n                },\n                \"Phase2IntegrityAlgorithms\": {\n                    \"target\": \"com.amazonaws.ec2#Phase2IntegrityAlgorithmsRequestList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more integrity algorithms that are permitted for the VPN tunnel for phase 2 IKE\\n            negotiations.</p>\\n         <p>Valid values: <code>SHA1</code> | <code>SHA2-256</code> | <code>SHA2-384</code> |\\n                <code>SHA2-512</code>\\n         </p>\",\n                        \"smithy.api#xmlName\": \"Phase2IntegrityAlgorithm\"\n                    }\n                },\n                \"Phase1DHGroupNumbers\": {\n                    \"target\": \"com.amazonaws.ec2#Phase1DHGroupNumbersRequestList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more Diffie-Hellman group numbers that are permitted for the VPN tunnel for\\n            phase 1 IKE negotiations.</p>\\n         <p>Valid values: <code>2</code> | <code>14</code> | <code>15</code> | <code>16</code> |\\n                <code>17</code> | <code>18</code> | <code>19</code> | <code>20</code> |\\n                <code>21</code> | <code>22</code> | <code>23</code> | <code>24</code>\\n         </p>\",\n                        \"smithy.api#xmlName\": \"Phase1DHGroupNumber\"\n                    }\n                },\n                \"Phase2DHGroupNumbers\": {\n                    \"target\": \"com.amazonaws.ec2#Phase2DHGroupNumbersRequestList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more Diffie-Hellman group numbers that are permitted for the VPN tunnel for\\n            phase 2 IKE negotiations.</p>\\n         <p>Valid values: <code>2</code> | <code>5</code> | <code>14</code> | <code>15</code> |\\n                <code>16</code> | <code>17</code> | <code>18</code> | <code>19</code> |\\n                <code>20</code> | <code>21</code> | <code>22</code> | <code>23</code> |\\n                <code>24</code>\\n         </p>\",\n                        \"smithy.api#xmlName\": \"Phase2DHGroupNumber\"\n                    }\n                },\n                \"IKEVersions\": {\n                    \"target\": \"com.amazonaws.ec2#IKEVersionsRequestList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IKE versions that are permitted for the VPN tunnel.</p>\\n         <p>Valid values: <code>ikev1</code> | <code>ikev2</code>\\n         </p>\",\n                        \"smithy.api#xmlName\": \"IKEVersion\"\n                    }\n                },\n                \"StartupAction\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The action to take when the establishing the tunnel for the VPN connection. By\\n            default, your customer gateway device must initiate the IKE negotiation and bring up the\\n            tunnel. Specify <code>start</code> for Amazon Web Services to initiate the IKE\\n            negotiation.</p>\\n         <p>Valid Values: <code>add</code> | <code>start</code>\\n         </p>\\n         <p>Default: <code>add</code>\\n         </p>\"\n                    }\n                },\n                \"LogOptions\": {\n                    \"target\": \"com.amazonaws.ec2#VpnTunnelLogOptionsSpecification\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Options for logging VPN tunnel activity.</p>\"\n                    }\n                },\n                \"EnableTunnelLifecycleControl\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Turn on or off tunnel endpoint lifecycle control feature.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The tunnel options for a single VPN tunnel.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#VpnTunnelOptionsSpecificationsList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#VpnTunnelOptionsSpecification\"\n            }\n        },\n        \"com.amazonaws.ec2#VpnTunnelProvisioningStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"available\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"available\"\n                    }\n                },\n                \"pending\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"pending\"\n                    }\n                },\n                \"failed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"failed\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#WeekDay\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"sunday\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"sunday\"\n                    }\n                },\n                \"monday\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"monday\"\n                    }\n                },\n                \"tuesday\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"tuesday\"\n                    }\n                },\n                \"wednesday\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"wednesday\"\n                    }\n                },\n                \"thursday\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"thursday\"\n                    }\n                },\n                \"friday\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"friday\"\n                    }\n                },\n                \"saturday\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"saturday\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#WithdrawByoipCidr\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ec2#WithdrawByoipCidrRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ec2#WithdrawByoipCidrResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Stops advertising an address range that is provisioned as an address pool.</p>\\n         <p>You can perform this operation at most once every 10 seconds, even if you specify different \\n         address ranges each time.</p>\\n         <p>It can take a few minutes before traffic to the specified addresses stops routing to Amazon Web Services\\n          because of BGP propagation delays.</p>\"\n            }\n        },\n        \"com.amazonaws.ec2#WithdrawByoipCidrRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Cidr\": {\n                    \"target\": \"com.amazonaws.ec2#String\",\n                    \"traits\": {\n                        \"smithy.api#clientOptional\": {},\n                        \"smithy.api#documentation\": \"<p>The address range, in CIDR notation.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.ec2#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks whether you have the required permissions for the action, without actually making the request, \\n   and provides an error response. If you have the required permissions, the error response is <code>DryRunOperation</code>. \\n   Otherwise, it is <code>UnauthorizedOperation</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ec2#WithdrawByoipCidrResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ByoipCidr\": {\n                    \"target\": \"com.amazonaws.ec2#ByoipCidr\",\n                    \"traits\": {\n                        \"aws.protocols#ec2QueryName\": \"ByoipCidr\",\n                        \"smithy.api#documentation\": \"<p>Information about the address pool.</p>\",\n                        \"smithy.api#xmlName\": \"byoipCidr\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ec2#ZoneIdStringList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#String\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"ZoneId\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#ZoneNameStringList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#String\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"ZoneName\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#customerGatewayConfiguration\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#sensitive\": {}\n            }\n        },\n        \"com.amazonaws.ec2#preSharedKey\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#sensitive\": {}\n            }\n        },\n        \"com.amazonaws.ec2#scope\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"AVAILABILITY_ZONE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Availability Zone\"\n                    }\n                },\n                \"REGIONAL\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Region\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ec2#snapshotTierStatusSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ec2#SnapshotTierStatus\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ec2#totalFpgaMemory\": {\n            \"type\": \"integer\"\n        },\n        \"com.amazonaws.ec2#totalGpuMemory\": {\n            \"type\": \"integer\"\n        },\n        \"com.amazonaws.ec2#totalInferenceMemory\": {\n            \"type\": \"integer\"\n        }\n    }\n}\n"
  },
  {
    "path": "aws/sdk/aws-models/ecs.json",
    "content": "{\n    \"smithy\": \"2.0\",\n    \"metadata\": {\n        \"suppressions\": [\n            {\n                \"id\": \"HttpMethodSemantics\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"HttpResponseCodeSemantics\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"PaginatedTrait\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"HttpHeaderTrait\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"HttpUriConflict\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"Service\",\n                \"namespace\": \"*\"\n            }\n        ]\n    },\n    \"shapes\": {\n        \"com.amazonaws.ecs#AcceleratorCountRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"min\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedInteger\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The minimum number of accelerators. Instance types with fewer accelerators are excluded from selection.</p>\"\n                    }\n                },\n                \"max\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedInteger\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of accelerators. Instance types with more accelerators are excluded from selection.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The minimum and maximum number of accelerators (such as GPUs) for instance type selection. This is used for workloads that require specific numbers of accelerators.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#AcceleratorManufacturer\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"AMAZON_WEB_SERVICES\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"amazon-web-services\"\n                    }\n                },\n                \"AMD\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"amd\"\n                    }\n                },\n                \"NVIDIA\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"nvidia\"\n                    }\n                },\n                \"XILINX\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"xilinx\"\n                    }\n                },\n                \"HABANA\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"habana\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ecs#AcceleratorManufacturerSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#AcceleratorManufacturer\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ecs#AcceleratorName\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"A100\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"a100\"\n                    }\n                },\n                \"INFERENTIA\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"inferentia\"\n                    }\n                },\n                \"K520\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"k520\"\n                    }\n                },\n                \"K80\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"k80\"\n                    }\n                },\n                \"M60\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"m60\"\n                    }\n                },\n                \"RADEON_PRO_V520\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"radeon-pro-v520\"\n                    }\n                },\n                \"T4\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"t4\"\n                    }\n                },\n                \"VU9P\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"vu9p\"\n                    }\n                },\n                \"V100\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"v100\"\n                    }\n                },\n                \"A10G\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"a10g\"\n                    }\n                },\n                \"H100\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"h100\"\n                    }\n                },\n                \"T4G\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"t4g\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ecs#AcceleratorNameSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#AcceleratorName\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ecs#AcceleratorTotalMemoryMiBRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"min\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedInteger\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The minimum total accelerator memory in MiB. Instance types with less accelerator memory are excluded from selection.</p>\"\n                    }\n                },\n                \"max\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedInteger\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum total accelerator memory in MiB. Instance types with more accelerator memory are excluded from selection.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The minimum and maximum total accelerator memory in mebibytes (MiB) for instance type selection. This is important for GPU workloads that require specific amounts of video memory.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#AcceleratorType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"GPU\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"gpu\"\n                    }\n                },\n                \"FPGA\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"fpga\"\n                    }\n                },\n                \"INFERENCE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"inference\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ecs#AcceleratorTypeSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#AcceleratorType\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ecs#AccessDeniedException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> Message that describes the cause of the exception.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>You don't have authorization to perform the requested action.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.ecs#AdvancedConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"alternateTargetGroupArn\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the alternate target group for Amazon ECS blue/green deployments.</p>\"\n                    }\n                },\n                \"productionListenerRule\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) that that identifies the production listener rule (in the case of an Application Load Balancer) or\\n         listener (in the case for an Network Load Balancer) for routing production traffic.</p>\"\n                    }\n                },\n                \"testListenerRule\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) that identifies ) that identifies the test listener rule  (in the case of an Application Load Balancer) or\\n         listener (in the case for an Network Load Balancer) for routing test traffic.</p>\"\n                    }\n                },\n                \"roleArn\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the IAM role that grants Amazon ECS permission to call the Elastic Load Balancing APIs for you.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The advanced settings for a load balancer used in blue/green deployments. Specify the\\n         alternate target group, listener rules, and IAM role required for traffic shifting during\\n         blue/green deployments. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/blue-green-deployment-implementation.html\\\">Required resources for Amazon ECS\\n            blue/green deployments</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#AgentUpdateStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"PENDING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"PENDING\"\n                    }\n                },\n                \"STAGING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"STAGING\"\n                    }\n                },\n                \"STAGED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"STAGED\"\n                    }\n                },\n                \"UPDATING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"UPDATING\"\n                    }\n                },\n                \"UPDATED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"UPDATED\"\n                    }\n                },\n                \"FAILED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"FAILED\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ecs#AllowedInstanceType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 30\n                },\n                \"smithy.api#pattern\": \"^[a-zA-Z0-9\\\\.\\\\*\\\\-]+$\"\n            }\n        },\n        \"com.amazonaws.ecs#AllowedInstanceTypeSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#AllowedInstanceType\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 400\n                }\n            }\n        },\n        \"com.amazonaws.ecs#AmazonEC2ContainerServiceV20141113\": {\n            \"type\": \"service\",\n            \"version\": \"2014-11-13\",\n            \"operations\": [\n                {\n                    \"target\": \"com.amazonaws.ecs#CreateCapacityProvider\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#CreateCluster\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#CreateService\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#CreateTaskSet\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#DeleteAccountSetting\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#DeleteAttributes\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#DeleteCapacityProvider\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#DeleteCluster\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#DeleteService\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#DeleteTaskDefinitions\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#DeleteTaskSet\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#DeregisterContainerInstance\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#DeregisterTaskDefinition\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#DescribeCapacityProviders\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#DescribeClusters\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#DescribeContainerInstances\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#DescribeServiceDeployments\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#DescribeServiceRevisions\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#DescribeServices\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#DescribeTaskDefinition\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#DescribeTasks\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#DescribeTaskSets\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#DiscoverPollEndpoint\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ExecuteCommand\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#GetTaskProtection\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ListAccountSettings\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ListAttributes\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ListClusters\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ListContainerInstances\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ListServiceDeployments\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ListServices\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ListServicesByNamespace\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ListTagsForResource\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ListTaskDefinitionFamilies\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ListTaskDefinitions\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ListTasks\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#PutAccountSetting\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#PutAccountSettingDefault\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#PutAttributes\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#PutClusterCapacityProviders\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#RegisterContainerInstance\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#RegisterTaskDefinition\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#RunTask\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#StartTask\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#StopServiceDeployment\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#StopTask\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#SubmitAttachmentStateChanges\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#SubmitContainerStateChange\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#SubmitTaskStateChange\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#TagResource\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#UntagResource\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#UpdateCapacityProvider\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#UpdateCluster\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#UpdateClusterSettings\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#UpdateContainerAgent\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#UpdateContainerInstancesState\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#UpdateService\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#UpdateServicePrimaryTaskSet\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#UpdateTaskProtection\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#UpdateTaskSet\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#service\": {\n                    \"sdkId\": \"ECS\",\n                    \"arnNamespace\": \"ecs\",\n                    \"cloudFormationName\": \"ECS\",\n                    \"cloudTrailEventSource\": \"ecs.amazonaws.com\",\n                    \"endpointPrefix\": \"ecs\"\n                },\n                \"aws.auth#sigv4\": {\n                    \"name\": \"ecs\"\n                },\n                \"aws.protocols#awsJson1_1\": {},\n                \"smithy.api#documentation\": \"<fullname>Amazon Elastic Container Service</fullname>\\n         <p>Amazon Elastic Container Service (Amazon ECS) is a highly scalable, fast, container management service. It makes\\n\\t\\t\\tit easy to run, stop, and manage Docker containers. You can host your cluster on a\\n\\t\\t\\tserverless infrastructure that's managed by Amazon ECS by launching your services or tasks on\\n\\t\\t\\tFargate. For more control, you can host your tasks on a cluster of Amazon Elastic Compute Cloud (Amazon EC2)\\n\\t\\t\\tor External (on-premises) instances that you manage.</p>\\n         <p>Amazon ECS makes it easy to launch and stop container-based applications with simple API\\n\\t\\t\\tcalls. This makes it easy to get the state of your cluster from a centralized service,\\n\\t\\t\\tand gives you access to many familiar Amazon EC2 features.</p>\\n         <p>You can use Amazon ECS to schedule the placement of containers across your cluster based on\\n\\t\\t\\tyour resource needs, isolation policies, and availability requirements. With Amazon ECS, you\\n\\t\\t\\tdon't need to operate your own cluster management and configuration management systems.\\n\\t\\t\\tYou also don't need to worry about scaling your management infrastructure. </p>\",\n                \"smithy.api#title\": \"Amazon EC2 Container Service\",\n                \"smithy.api#xmlNamespace\": {\n                    \"uri\": \"http://ecs.amazonaws.com/doc/2014-11-13/\"\n                },\n                \"smithy.rules#endpointRuleSet\": {\n                    \"version\": \"1.0\",\n                    \"parameters\": {\n                        \"Region\": {\n                            \"builtIn\": \"AWS::Region\",\n                            \"required\": false,\n                            \"documentation\": \"The AWS region used to dispatch the request.\",\n                            \"type\": \"String\"\n                        },\n                        \"UseDualStack\": {\n                            \"builtIn\": \"AWS::UseDualStack\",\n                            \"required\": true,\n                            \"default\": false,\n                            \"documentation\": \"When true, use the dual-stack endpoint. If the configured endpoint does not support dual-stack, dispatching the request MAY return an error.\",\n                            \"type\": \"Boolean\"\n                        },\n                        \"UseFIPS\": {\n                            \"builtIn\": \"AWS::UseFIPS\",\n                            \"required\": true,\n                            \"default\": false,\n                            \"documentation\": \"When true, send this request to the FIPS-compliant regional endpoint. If the configured endpoint does not have a FIPS compliant endpoint, dispatching the request will return an error.\",\n                            \"type\": \"Boolean\"\n                        },\n                        \"Endpoint\": {\n                            \"builtIn\": \"SDK::Endpoint\",\n                            \"required\": false,\n                            \"documentation\": \"Override the endpoint used to send this request\",\n                            \"type\": \"String\"\n                        }\n                    },\n                    \"rules\": [\n                        {\n                            \"conditions\": [\n                                {\n                                    \"fn\": \"isSet\",\n                                    \"argv\": [\n                                        {\n                                            \"ref\": \"Endpoint\"\n                                        }\n                                    ]\n                                }\n                            ],\n                            \"rules\": [\n                                {\n                                    \"conditions\": [\n                                        {\n                                            \"fn\": \"booleanEquals\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"UseFIPS\"\n                                                },\n                                                true\n                                            ]\n                                        }\n                                    ],\n                                    \"error\": \"Invalid Configuration: FIPS and custom endpoint are not supported\",\n                                    \"type\": \"error\"\n                                },\n                                {\n                                    \"conditions\": [\n                                        {\n                                            \"fn\": \"booleanEquals\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"UseDualStack\"\n                                                },\n                                                true\n                                            ]\n                                        }\n                                    ],\n                                    \"error\": \"Invalid Configuration: Dualstack and custom endpoint are not supported\",\n                                    \"type\": \"error\"\n                                },\n                                {\n                                    \"conditions\": [],\n                                    \"endpoint\": {\n                                        \"url\": {\n                                            \"ref\": \"Endpoint\"\n                                        },\n                                        \"properties\": {},\n                                        \"headers\": {}\n                                    },\n                                    \"type\": \"endpoint\"\n                                }\n                            ],\n                            \"type\": \"tree\"\n                        },\n                        {\n                            \"conditions\": [\n                                {\n                                    \"fn\": \"isSet\",\n                                    \"argv\": [\n                                        {\n                                            \"ref\": \"Region\"\n                                        }\n                                    ]\n                                }\n                            ],\n                            \"rules\": [\n                                {\n                                    \"conditions\": [\n                                        {\n                                            \"fn\": \"aws.partition\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"Region\"\n                                                }\n                                            ],\n                                            \"assign\": \"PartitionResult\"\n                                        }\n                                    ],\n                                    \"rules\": [\n                                        {\n                                            \"conditions\": [\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseFIPS\"\n                                                        },\n                                                        true\n                                                    ]\n                                                },\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseDualStack\"\n                                                        },\n                                                        true\n                                                    ]\n                                                }\n                                            ],\n                                            \"rules\": [\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                true,\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"PartitionResult\"\n                                                                        },\n                                                                        \"supportsFIPS\"\n                                                                    ]\n                                                                }\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                true,\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"PartitionResult\"\n                                                                        },\n                                                                        \"supportsDualStack\"\n                                                                    ]\n                                                                }\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"rules\": [\n                                                        {\n                                                            \"conditions\": [],\n                                                            \"endpoint\": {\n                                                                \"url\": \"https://ecs-fips.{Region}.{PartitionResult#dualStackDnsSuffix}\",\n                                                                \"properties\": {},\n                                                                \"headers\": {}\n                                                            },\n                                                            \"type\": \"endpoint\"\n                                                        }\n                                                    ],\n                                                    \"type\": \"tree\"\n                                                },\n                                                {\n                                                    \"conditions\": [],\n                                                    \"error\": \"FIPS and DualStack are enabled, but this partition does not support one or both\",\n                                                    \"type\": \"error\"\n                                                }\n                                            ],\n                                            \"type\": \"tree\"\n                                        },\n                                        {\n                                            \"conditions\": [\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseFIPS\"\n                                                        },\n                                                        true\n                                                    ]\n                                                }\n                                            ],\n                                            \"rules\": [\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"PartitionResult\"\n                                                                        },\n                                                                        \"supportsFIPS\"\n                                                                    ]\n                                                                },\n                                                                true\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"rules\": [\n                                                        {\n                                                            \"conditions\": [],\n                                                            \"endpoint\": {\n                                                                \"url\": \"https://ecs-fips.{Region}.{PartitionResult#dnsSuffix}\",\n                                                                \"properties\": {},\n                                                                \"headers\": {}\n                                                            },\n                                                            \"type\": \"endpoint\"\n                                                        }\n                                                    ],\n                                                    \"type\": \"tree\"\n                                                },\n                                                {\n                                                    \"conditions\": [],\n                                                    \"error\": \"FIPS is enabled but this partition does not support FIPS\",\n                                                    \"type\": \"error\"\n                                                }\n                                            ],\n                                            \"type\": \"tree\"\n                                        },\n                                        {\n                                            \"conditions\": [\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseDualStack\"\n                                                        },\n                                                        true\n                                                    ]\n                                                }\n                                            ],\n                                            \"rules\": [\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                true,\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"PartitionResult\"\n                                                                        },\n                                                                        \"supportsDualStack\"\n                                                                    ]\n                                                                }\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"rules\": [\n                                                        {\n                                                            \"conditions\": [],\n                                                            \"endpoint\": {\n                                                                \"url\": \"https://ecs.{Region}.{PartitionResult#dualStackDnsSuffix}\",\n                                                                \"properties\": {},\n                                                                \"headers\": {}\n                                                            },\n                                                            \"type\": \"endpoint\"\n                                                        }\n                                                    ],\n                                                    \"type\": \"tree\"\n                                                },\n                                                {\n                                                    \"conditions\": [],\n                                                    \"error\": \"DualStack is enabled but this partition does not support DualStack\",\n                                                    \"type\": \"error\"\n                                                }\n                                            ],\n                                            \"type\": \"tree\"\n                                        },\n                                        {\n                                            \"conditions\": [],\n                                            \"endpoint\": {\n                                                \"url\": \"https://ecs.{Region}.{PartitionResult#dnsSuffix}\",\n                                                \"properties\": {},\n                                                \"headers\": {}\n                                            },\n                                            \"type\": \"endpoint\"\n                                        }\n                                    ],\n                                    \"type\": \"tree\"\n                                }\n                            ],\n                            \"type\": \"tree\"\n                        },\n                        {\n                            \"conditions\": [],\n                            \"error\": \"Invalid Configuration: Missing Region\",\n                            \"type\": \"error\"\n                        }\n                    ]\n                },\n                \"smithy.rules#endpointTests\": {\n                    \"testCases\": [\n                        {\n                            \"documentation\": \"For region af-south-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ecs.af-south-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"af-south-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ecs.ap-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-northeast-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ecs.ap-northeast-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-northeast-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-northeast-2 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ecs.ap-northeast-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-northeast-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-northeast-3 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ecs.ap-northeast-3.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-northeast-3\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-south-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ecs.ap-south-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-south-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-southeast-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ecs.ap-southeast-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-southeast-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-southeast-2 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ecs.ap-southeast-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-southeast-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-southeast-3 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ecs.ap-southeast-3.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-southeast-3\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ca-central-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ecs.ca-central-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ca-central-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-central-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ecs.eu-central-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-central-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-north-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ecs.eu-north-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-north-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-south-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ecs.eu-south-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-south-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-west-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ecs.eu-west-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-west-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-west-2 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ecs.eu-west-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-west-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-west-3 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ecs.eu-west-3.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-west-3\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region me-south-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ecs.me-south-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"me-south-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region sa-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ecs.sa-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"sa-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ecs.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ecs-fips.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-2 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ecs.us-east-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-2 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ecs-fips.us-east-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-2\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-west-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ecs.us-west-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-west-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-west-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ecs-fips.us-west-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-west-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-west-2 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ecs.us-west-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-west-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-west-2 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ecs-fips.us-west-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-west-2\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-1 with FIPS enabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ecs-fips.us-east-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-1 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ecs.us-east-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-north-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ecs.cn-north-1.amazonaws.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-north-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-northwest-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ecs.cn-northwest-1.amazonaws.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-northwest-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-north-1 with FIPS enabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ecs-fips.cn-north-1.api.amazonwebservices.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-north-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-north-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ecs-fips.cn-north-1.amazonaws.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-north-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-north-1 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ecs.cn-north-1.api.amazonwebservices.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-north-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ecs.us-gov-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-east-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ecs-fips.us-gov-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-west-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ecs.us-gov-west-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-west-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-west-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ecs-fips.us-gov-west-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-west-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-east-1 with FIPS enabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ecs-fips.us-gov-east-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-east-1 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ecs.us-gov-east-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-iso-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ecs.us-iso-east-1.c2s.ic.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-iso-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-iso-west-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ecs.us-iso-west-1.c2s.ic.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-iso-west-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-iso-east-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ecs-fips.us-iso-east-1.c2s.ic.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-iso-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-isob-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ecs.us-isob-east-1.sc2s.sgov.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-isob-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-isob-east-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ecs-fips.us-isob-east-1.sc2s.sgov.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-isob-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For custom endpoint with region set and fips disabled and dualstack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://example.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"For custom endpoint with region not set and fips disabled and dualstack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://example.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"For custom endpoint with fips enabled and dualstack disabled\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: FIPS and custom endpoint are not supported\"\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false,\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"For custom endpoint with fips disabled and dualstack enabled\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: Dualstack and custom endpoint are not supported\"\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true,\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"Missing region\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: Missing Region\"\n                            }\n                        }\n                    ],\n                    \"version\": \"1.0\"\n                }\n            }\n        },\n        \"com.amazonaws.ecs#ApplicationProtocol\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"HTTP\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"http\"\n                    }\n                },\n                \"HTTP2\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"http2\"\n                    }\n                },\n                \"GRPC\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"grpc\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ecs#AssignPublicIp\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ENABLED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ENABLED\"\n                    }\n                },\n                \"DISABLED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DISABLED\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ecs#Attachment\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"id\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The unique identifier for the attachment.</p>\"\n                    }\n                },\n                \"type\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of the attachment, such as <code>ElasticNetworkInterface</code>,\\n\\t\\t\\t\\t<code>Service Connect</code>, and <code>AmazonElasticBlockStorage</code>.</p>\"\n                    }\n                },\n                \"status\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The status of the attachment. Valid values are <code>PRECREATED</code>,\\n\\t\\t\\t\\t<code>CREATED</code>, <code>ATTACHING</code>, <code>ATTACHED</code>,\\n\\t\\t\\t\\t<code>DETACHING</code>, <code>DETACHED</code>, <code>DELETED</code>, and\\n\\t\\t\\t\\t<code>FAILED</code>.</p>\"\n                    }\n                },\n                \"details\": {\n                    \"target\": \"com.amazonaws.ecs#AttachmentDetails\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Details of the attachment.</p>\\n         <p>For elastic network interfaces, this includes the network interface ID, the MAC\\n\\t\\t\\taddress, the subnet ID, and the private IPv4 address.</p>\\n         <p>For Service Connect services, this includes <code>portName</code>,\\n\\t\\t\\t\\t<code>clientAliases</code>, <code>discoveryName</code>, and\\n\\t\\t\\t\\t<code>ingressPortOverride</code>.</p>\\n         <p>For Elastic Block Storage, this includes <code>roleArn</code>,\\n\\t\\t\\t\\t<code>deleteOnTermination</code>, <code>volumeName</code>, <code>volumeId</code>,\\n\\t\\t\\tand <code>statusReason</code> (only when the attachment fails to create or\\n\\t\\t\\tattach).</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>An object representing a container instance or task attachment.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#AttachmentDetails\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#KeyValuePair\"\n            }\n        },\n        \"com.amazonaws.ecs#AttachmentStateChange\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"attachmentArn\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the attachment.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"status\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The status of the attachment.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>An object representing a change in state for a task attachment.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#AttachmentStateChanges\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#AttachmentStateChange\"\n            }\n        },\n        \"com.amazonaws.ecs#Attachments\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#Attachment\"\n            }\n        },\n        \"com.amazonaws.ecs#Attribute\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"name\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the attribute. The <code>name</code> must contain between 1 and 128\\n\\t\\t\\tcharacters. The name may contain letters (uppercase and lowercase), numbers, hyphens\\n\\t\\t\\t(-), underscores (_), forward slashes (/), back slashes (\\\\), or periods (.).</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"value\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The value of the attribute. The <code>value</code> must contain between 1 and 128\\n\\t\\t\\tcharacters. It can contain letters (uppercase and lowercase), numbers, hyphens (-),\\n\\t\\t\\tunderscores (_), periods (.), at signs (@), forward slashes (/), back slashes (\\\\),\\n\\t\\t\\tcolons (:), or spaces. The value can't start or end with a space.</p>\"\n                    }\n                },\n                \"targetType\": {\n                    \"target\": \"com.amazonaws.ecs#TargetType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of the target to attach the attribute with. This parameter is required if you\\n\\t\\t\\tuse the short form ID for a resource instead of the full ARN.</p>\"\n                    }\n                },\n                \"targetId\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the target. You can specify the short form ID for a resource or the full\\n\\t\\t\\tAmazon Resource Name (ARN).</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>An attribute is a name-value pair that's associated with an Amazon ECS object. Use\\n\\t\\t\\tattributes to extend the Amazon ECS data model by adding custom metadata to your resources.\\n\\t\\t\\tFor more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-placement-constraints.html#attributes\\\">Attributes</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#AttributeLimitExceededException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> Message that describes the cause of the exception.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>You can apply up to 10 custom attributes for each resource. You can view the\\n\\t\\t\\tattributes of a resource with <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_ListAttributes.html\\\">ListAttributes</a>.\\n\\t\\t\\tYou can remove existing attributes on a resource with <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_DeleteAttributes.html\\\">DeleteAttributes</a>.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.ecs#Attributes\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#Attribute\"\n            }\n        },\n        \"com.amazonaws.ecs#AutoScalingGroupProvider\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"autoScalingGroupArn\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) that identifies the Auto Scaling group, or the Auto Scaling group\\n\\t\\t\\tname.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"managedScaling\": {\n                    \"target\": \"com.amazonaws.ecs#ManagedScaling\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The managed scaling settings for the Auto Scaling group capacity provider.</p>\"\n                    }\n                },\n                \"managedTerminationProtection\": {\n                    \"target\": \"com.amazonaws.ecs#ManagedTerminationProtection\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The managed termination protection setting to use for the Auto Scaling group capacity\\n\\t\\t\\tprovider. This determines whether the Auto Scaling group has managed termination\\n\\t\\t\\tprotection. The default is off.</p>\\n         <important>\\n            <p>When using managed termination protection, managed scaling must also be used\\n\\t\\t\\t\\totherwise managed termination protection doesn't work.</p>\\n         </important>\\n         <p>When managed termination protection is on, Amazon ECS prevents the Amazon EC2 instances in an\\n\\t\\t\\tAuto Scaling group that contain tasks from being terminated during a scale-in action.\\n\\t\\t\\tThe Auto Scaling group and each instance in the Auto Scaling group must have instance\\n\\t\\t\\tprotection from scale-in actions on as well. For more information, see <a href=\\\"https://docs.aws.amazon.com/autoscaling/ec2/userguide/as-instance-termination.html#instance-protection\\\">Instance Protection</a> in the <i>Auto Scaling User Guide</i>.</p>\\n         <p>When managed termination protection is off, your Amazon EC2 instances aren't protected from\\n\\t\\t\\ttermination when the Auto Scaling group scales in.</p>\"\n                    }\n                },\n                \"managedDraining\": {\n                    \"target\": \"com.amazonaws.ecs#ManagedDraining\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The managed draining option for the Auto Scaling group capacity provider. When you enable this, Amazon ECS manages and gracefully drains the EC2 container instances that are in the Auto Scaling group capacity provider.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The details of the Auto Scaling group for the capacity provider.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#AutoScalingGroupProviderUpdate\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"managedScaling\": {\n                    \"target\": \"com.amazonaws.ecs#ManagedScaling\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The managed scaling settings for the Auto Scaling group capacity provider.</p>\"\n                    }\n                },\n                \"managedTerminationProtection\": {\n                    \"target\": \"com.amazonaws.ecs#ManagedTerminationProtection\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The managed termination protection setting to use for the Auto Scaling group capacity\\n\\t\\t\\tprovider. This determines whether the Auto Scaling group has managed termination\\n\\t\\t\\tprotection.</p>\\n         <important>\\n            <p>When using managed termination protection, managed scaling must also be used\\n\\t\\t\\t\\totherwise managed termination protection doesn't work.</p>\\n         </important>\\n         <p>When managed termination protection is on, Amazon ECS prevents the Amazon EC2 instances in an\\n\\t\\t\\tAuto Scaling group that contain tasks from being terminated during a scale-in action.\\n\\t\\t\\tThe Auto Scaling group and each instance in the Auto Scaling group must have instance\\n\\t\\t\\tprotection from scale-in actions on. For more information, see <a href=\\\"https://docs.aws.amazon.com/autoscaling/ec2/userguide/as-instance-termination.html#instance-protection\\\">Instance Protection</a> in the <i>Auto Scaling User Guide</i>.</p>\\n         <p>When managed termination protection is off, your Amazon EC2 instances aren't protected from\\n\\t\\t\\ttermination when the Auto Scaling group scales in.</p>\"\n                    }\n                },\n                \"managedDraining\": {\n                    \"target\": \"com.amazonaws.ecs#ManagedDraining\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The managed draining option for the Auto Scaling group capacity provider. When you enable this, Amazon ECS manages and gracefully drains the EC2 container instances that are in the Auto Scaling group capacity provider.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The details of the Auto Scaling group capacity provider to update.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#AvailabilityZoneRebalancing\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ENABLED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ENABLED\"\n                    }\n                },\n                \"DISABLED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DISABLED\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ecs#AwsVpcConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"subnets\": {\n                    \"target\": \"com.amazonaws.ecs#StringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the subnets associated with the task or service. There's a limit of 16\\n\\t\\t\\tsubnets that can be specified.</p>\\n         <note>\\n            <p>All specified subnets must be from the same VPC.</p>\\n         </note>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"securityGroups\": {\n                    \"target\": \"com.amazonaws.ecs#StringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of the security groups associated with the task or service. If you don't\\n\\t\\t\\tspecify a security group, the default security group for the VPC is used. There's a\\n\\t\\t\\tlimit of 5 security groups that can be specified.</p>\\n         <note>\\n            <p>All specified security groups must be from the same VPC.</p>\\n         </note>\"\n                    }\n                },\n                \"assignPublicIp\": {\n                    \"target\": \"com.amazonaws.ecs#AssignPublicIp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Whether the task's elastic network interface receives a public IP address. </p>\\n         <p>Consider the following when you set this value:</p>\\n         <ul>\\n            <li>\\n               <p>When you use <code>create-service</code> or <code>update-service</code>, the\\n\\t\\t\\t\\t\\tdefault is <code>DISABLED</code>. </p>\\n            </li>\\n            <li>\\n               <p>When the service <code>deploymentController</code> is <code>ECS</code>, the\\n\\t\\t\\t\\t\\tvalue must be <code>DISABLED</code>. </p>\\n            </li>\\n         </ul>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>An object representing the networking details for a task or service. For example\\n\\t\\t\\t\\t<code>awsVpcConfiguration={subnets=[\\\"subnet-12344321\\\"],securityGroups=[\\\"sg-12344321\\\"]}</code>.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#BareMetal\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"INCLUDED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"included\"\n                    }\n                },\n                \"REQUIRED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"required\"\n                    }\n                },\n                \"EXCLUDED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"excluded\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ecs#BaselineEbsBandwidthMbpsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"min\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedInteger\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The minimum baseline Amazon EBS bandwidth in Mbps. Instance types with lower Amazon EBS bandwidth are excluded from selection.</p>\"\n                    }\n                },\n                \"max\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedInteger\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum baseline Amazon EBS bandwidth in Mbps. Instance types with higher Amazon EBS bandwidth are excluded from selection.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The minimum and maximum baseline Amazon EBS bandwidth in megabits per second (Mbps) for instance type selection. This is important for workloads with high storage I/O requirements.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#BlockedException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> Message that describes the cause of the exception.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Your Amazon Web Services account was blocked. For more information, contact <a href=\\\"http://aws.amazon.com/contact-us/\\\">\\n\\t\\t\\t\\tAmazon Web Services Support</a>.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.ecs#Boolean\": {\n            \"type\": \"boolean\",\n            \"traits\": {\n                \"smithy.api#default\": false\n            }\n        },\n        \"com.amazonaws.ecs#BoxedBoolean\": {\n            \"type\": \"boolean\"\n        },\n        \"com.amazonaws.ecs#BoxedDouble\": {\n            \"type\": \"double\"\n        },\n        \"com.amazonaws.ecs#BoxedInteger\": {\n            \"type\": \"integer\"\n        },\n        \"com.amazonaws.ecs#BurstablePerformance\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"INCLUDED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"included\"\n                    }\n                },\n                \"REQUIRED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"required\"\n                    }\n                },\n                \"EXCLUDED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"excluded\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ecs#CPUArchitecture\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"X86_64\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"X86_64\"\n                    }\n                },\n                \"ARM64\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ARM64\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ecs#CapacityProvider\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"capacityProviderArn\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) that identifies the capacity provider.</p>\"\n                    }\n                },\n                \"name\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the capacity provider.</p>\"\n                    }\n                },\n                \"cluster\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The cluster that this capacity provider is associated with. Managed instances capacity providers are cluster-scoped, meaning they can only be used within their associated cluster.</p>\"\n                    }\n                },\n                \"status\": {\n                    \"target\": \"com.amazonaws.ecs#CapacityProviderStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The current status of the capacity provider. Only capacity providers in an\\n\\t\\t\\t\\t<code>ACTIVE</code> state can be used in a cluster. When a capacity provider is\\n\\t\\t\\tsuccessfully deleted, it has an <code>INACTIVE</code> status.</p>\"\n                    }\n                },\n                \"autoScalingGroupProvider\": {\n                    \"target\": \"com.amazonaws.ecs#AutoScalingGroupProvider\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Auto Scaling group settings for the capacity provider.</p>\"\n                    }\n                },\n                \"managedInstancesProvider\": {\n                    \"target\": \"com.amazonaws.ecs#ManagedInstancesProvider\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The configuration for the Amazon ECS Managed Instances provider. This includes the infrastructure role, the launch template configuration, and tag propagation settings.</p>\"\n                    }\n                },\n                \"updateStatus\": {\n                    \"target\": \"com.amazonaws.ecs#CapacityProviderUpdateStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The update status of the capacity provider. The following are the possible states that\\n\\t\\t\\tis returned.</p>\\n         <dl>\\n            <dt>DELETE_IN_PROGRESS</dt>\\n            <dd>\\n               <p>The capacity provider is in the process of being deleted.</p>\\n            </dd>\\n            <dt>DELETE_COMPLETE</dt>\\n            <dd>\\n               <p>The capacity provider was successfully deleted and has an\\n\\t\\t\\t\\t\\t\\t\\t<code>INACTIVE</code> status.</p>\\n            </dd>\\n            <dt>DELETE_FAILED</dt>\\n            <dd>\\n               <p>The capacity provider can't be deleted. The update status reason provides\\n\\t\\t\\t\\t\\t\\tfurther details about why the delete failed.</p>\\n            </dd>\\n         </dl>\"\n                    }\n                },\n                \"updateStatusReason\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The update status reason. This provides further details about the update status for\\n\\t\\t\\tthe capacity provider.</p>\"\n                    }\n                },\n                \"tags\": {\n                    \"target\": \"com.amazonaws.ecs#Tags\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The metadata that you apply to the capacity provider to help you categorize and\\n\\t\\t\\torganize it. Each tag consists of a key and an optional value. You define both.</p>\\n         <p>The following basic restrictions apply to tags:</p>\\n         <ul>\\n            <li>\\n               <p>Maximum number of tags per resource - 50</p>\\n            </li>\\n            <li>\\n               <p>For each resource, each tag key must be unique, and each tag key can have only\\n                    one value.</p>\\n            </li>\\n            <li>\\n               <p>Maximum key length - 128 Unicode characters in UTF-8</p>\\n            </li>\\n            <li>\\n               <p>Maximum value length - 256 Unicode characters in UTF-8</p>\\n            </li>\\n            <li>\\n               <p>If your tagging schema is used across multiple services and resources,\\n                    remember that other services may have restrictions on allowed characters.\\n                    Generally allowed characters are: letters, numbers, and spaces representable in\\n                    UTF-8, and the following characters: + - = . _ : / @.</p>\\n            </li>\\n            <li>\\n               <p>Tag keys and values are case-sensitive.</p>\\n            </li>\\n            <li>\\n               <p>Do not use <code>aws:</code>, <code>AWS:</code>, or any upper or lowercase\\n                    combination of such as a prefix for either keys or values as it is reserved for\\n                    Amazon Web Services use. You cannot edit or delete tag keys or values with this prefix. Tags with\\n                    this prefix do not count against your tags per resource limit.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"type\": {\n                    \"target\": \"com.amazonaws.ecs#CapacityProviderType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of capacity provider. For Amazon ECS Managed Instances, this value is <code>MANAGED_INSTANCES</code>, indicating that Amazon ECS manages the underlying Amazon EC2 instances on your behalf.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The details for a capacity provider.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#CapacityProviderField\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"TAGS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"TAGS\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ecs#CapacityProviderFieldList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#CapacityProviderField\"\n            }\n        },\n        \"com.amazonaws.ecs#CapacityProviderStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"PROVISIONING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"PROVISIONING\"\n                    }\n                },\n                \"ACTIVE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ACTIVE\"\n                    }\n                },\n                \"DEPROVISIONING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DEPROVISIONING\"\n                    }\n                },\n                \"INACTIVE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"INACTIVE\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ecs#CapacityProviderStrategy\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#CapacityProviderStrategyItem\"\n            }\n        },\n        \"com.amazonaws.ecs#CapacityProviderStrategyItem\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"capacityProvider\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The short name of the capacity provider.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"weight\": {\n                    \"target\": \"com.amazonaws.ecs#CapacityProviderStrategyItemWeight\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The <i>weight</i> value designates the relative percentage of the total\\n\\t\\t\\tnumber of tasks launched that should use the specified capacity provider. The\\n\\t\\t\\t<code>weight</code> value is taken into consideration after the <code>base</code>\\n\\t\\t\\tvalue, if defined, is satisfied.</p>\\n         <p>If no <code>weight</code> value is specified, the default value of <code>0</code> is\\n\\t\\t\\tused. When multiple capacity providers are specified within a capacity provider\\n\\t\\t\\tstrategy, at least one of the capacity providers must have a weight value greater than\\n\\t\\t\\tzero and any capacity providers with a weight of <code>0</code> can't be used to place\\n\\t\\t\\ttasks. If you specify multiple capacity providers in a strategy that all have a weight\\n\\t\\t\\tof <code>0</code>, any <code>RunTask</code> or <code>CreateService</code> actions using\\n\\t\\t\\tthe capacity provider strategy will fail.</p>\\n         <p>Weight value characteristics:</p>\\n         <ul>\\n            <li>\\n               <p>Weight is considered after the base value is satisfied</p>\\n            </li>\\n            <li>\\n               <p>Default value is <code>0</code> if not specified</p>\\n            </li>\\n            <li>\\n               <p>Valid range: 0 to 1,000</p>\\n            </li>\\n            <li>\\n               <p>At least one capacity provider must have a weight greater than zero</p>\\n            </li>\\n            <li>\\n               <p>Capacity providers with weight of <code>0</code> cannot place tasks</p>\\n            </li>\\n         </ul>\\n         <p>Task distribution logic:</p>\\n         <ol>\\n            <li>\\n               <p>Base satisfaction: The minimum number of tasks specified by the base value are placed on that capacity provider</p>\\n            </li>\\n            <li>\\n               <p>Weight distribution: After base requirements are met, additional tasks are distributed according to weight ratios</p>\\n            </li>\\n         </ol>\\n         <p>Examples:</p>\\n         <p>Equal Distribution: Two capacity providers both with weight <code>1</code> will split tasks evenly after base requirements are met.</p>\\n         <p>Weighted Distribution: If capacityProviderA has weight <code>1</code> and capacityProviderB has weight <code>4</code>, then for every 1 task on A, 4 tasks will run on B.</p>\"\n                    }\n                },\n                \"base\": {\n                    \"target\": \"com.amazonaws.ecs#CapacityProviderStrategyItemBase\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The <i>base</i> value designates how many tasks, at a minimum, to run on\\n\\t\\t\\tthe specified capacity provider for each service. Only one capacity provider in a capacity provider\\n\\t\\t\\tstrategy can have a <i>base</i> defined. If no value is specified, the\\n\\t\\t\\tdefault value of <code>0</code> is used.</p>\\n         <p>Base value characteristics:</p>\\n         <ul>\\n            <li>\\n               <p>Only one capacity provider in a strategy can have a base defined</p>\\n            </li>\\n            <li>\\n               <p>Default value is <code>0</code> if not specified</p>\\n            </li>\\n            <li>\\n               <p>Valid range: 0 to 100,000</p>\\n            </li>\\n            <li>\\n               <p>Base requirements are satisfied first before weight distribution</p>\\n            </li>\\n         </ul>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The details of a capacity provider strategy. A capacity provider strategy can be set\\n\\t\\t\\twhen using the <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_RunTask.html\\\">RunTask</a>or <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_CreateCluster.html\\\">CreateCluster</a> APIs or as the default capacity provider strategy for a\\n\\t\\t\\tcluster with the <code>CreateCluster</code> API.</p>\\n         <p>Only capacity providers that are already associated with a cluster and have an\\n\\t\\t\\t\\t<code>ACTIVE</code> or <code>UPDATING</code> status can be used in a capacity\\n\\t\\t\\tprovider strategy. The <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_PutClusterCapacityProviders.html\\\">PutClusterCapacityProviders</a> API is used to associate a capacity provider\\n\\t\\t\\twith a cluster.</p>\\n         <p>If specifying a capacity provider that uses an Auto Scaling group, the capacity\\n\\t\\t\\tprovider must already be created. New Auto Scaling group capacity providers can be\\n\\t\\t\\tcreated with the <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_CreateClusterCapacityProvider.html\\\">CreateClusterCapacityProvider</a> API operation.</p>\\n         <p>To use a Fargate capacity provider, specify either the <code>FARGATE</code> or\\n\\t\\t\\t\\t<code>FARGATE_SPOT</code> capacity providers. The Fargate capacity providers are\\n\\t\\t\\tavailable to all accounts and only need to be associated with a cluster to be used in a\\n\\t\\t\\tcapacity provider strategy.</p>\\n         <p>With <code>FARGATE_SPOT</code>, you can run interruption tolerant tasks at a rate\\n\\t\\t\\tthat's discounted compared to the <code>FARGATE</code> price. <code>FARGATE_SPOT</code>\\n\\t\\t\\truns tasks on spare compute capacity. When Amazon Web Services needs the capacity back, your tasks are\\n\\t\\t\\tinterrupted with a two-minute warning. <code>FARGATE_SPOT</code> supports Linux tasks\\n\\t\\t\\twith the X86_64 architecture on platform version 1.3.0 or later.\\n\\t\\t\\t\\t<code>FARGATE_SPOT</code> supports Linux tasks with the ARM64 architecture on\\n\\t\\t\\tplatform version 1.4.0 or later.</p>\\n         <p>A capacity provider strategy can contain a maximum of 20 capacity providers.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#CapacityProviderStrategyItemBase\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#default\": 0,\n                \"smithy.api#range\": {\n                    \"min\": 0,\n                    \"max\": 100000\n                }\n            }\n        },\n        \"com.amazonaws.ecs#CapacityProviderStrategyItemWeight\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#default\": 0,\n                \"smithy.api#range\": {\n                    \"min\": 0,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.ecs#CapacityProviderType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"EC2_AUTOSCALING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"EC2_AUTOSCALING\"\n                    }\n                },\n                \"MANAGED_INSTANCES\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"MANAGED_INSTANCES\"\n                    }\n                },\n                \"FARGATE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"FARGATE\"\n                    }\n                },\n                \"FARGATE_SPOT\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"FARGATE_SPOT\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ecs#CapacityProviderUpdateStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"CREATE_IN_PROGRESS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"CREATE_IN_PROGRESS\"\n                    }\n                },\n                \"CREATE_COMPLETE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"CREATE_COMPLETE\"\n                    }\n                },\n                \"CREATE_FAILED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"CREATE_FAILED\"\n                    }\n                },\n                \"DELETE_IN_PROGRESS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DELETE_IN_PROGRESS\"\n                    }\n                },\n                \"DELETE_COMPLETE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DELETE_COMPLETE\"\n                    }\n                },\n                \"DELETE_FAILED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DELETE_FAILED\"\n                    }\n                },\n                \"UPDATE_IN_PROGRESS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"UPDATE_IN_PROGRESS\"\n                    }\n                },\n                \"UPDATE_COMPLETE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"UPDATE_COMPLETE\"\n                    }\n                },\n                \"UPDATE_FAILED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"UPDATE_FAILED\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ecs#CapacityProviders\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#CapacityProvider\"\n            }\n        },\n        \"com.amazonaws.ecs#ClientException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> Message that describes the cause of the exception.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>These errors are usually caused by a client action. This client action might be using\\n\\t\\t\\tan action or resource on behalf of a user that doesn't have permissions to use the\\n\\t\\t\\taction or resource. Or, it might be specifying an identifier that isn't valid.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.ecs#Cluster\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"clusterArn\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) that identifies the cluster. For more information about the ARN\\n\\t\\t\\tformat, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-account-settings.html#ecs-resource-ids\\\">Amazon Resource Name (ARN)</a> in the <i>Amazon ECS Developer Guide</i>.</p>\"\n                    }\n                },\n                \"clusterName\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A user-generated string that you use to identify your cluster.</p>\"\n                    }\n                },\n                \"configuration\": {\n                    \"target\": \"com.amazonaws.ecs#ClusterConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The execute command and managed storage configuration for the cluster.</p>\"\n                    }\n                },\n                \"status\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The status of the cluster. The following are the possible states that are\\n\\t\\t\\treturned.</p>\\n         <dl>\\n            <dt>ACTIVE</dt>\\n            <dd>\\n               <p>The cluster is ready to accept tasks and if applicable you can register\\n\\t\\t\\t\\t\\t\\tcontainer instances with the cluster.</p>\\n            </dd>\\n            <dt>PROVISIONING</dt>\\n            <dd>\\n               <p>The cluster has capacity providers that are associated with it and the\\n\\t\\t\\t\\t\\t\\tresources needed for the capacity provider are being created.</p>\\n            </dd>\\n            <dt>DEPROVISIONING</dt>\\n            <dd>\\n               <p>The cluster has capacity providers that are associated with it and the\\n\\t\\t\\t\\t\\t\\tresources needed for the capacity provider are being deleted.</p>\\n            </dd>\\n            <dt>FAILED</dt>\\n            <dd>\\n               <p>The cluster has capacity providers that are associated with it and the\\n\\t\\t\\t\\t\\t\\tresources needed for the capacity provider have failed to create.</p>\\n            </dd>\\n            <dt>INACTIVE</dt>\\n            <dd>\\n               <p>The cluster has been deleted. Clusters with an <code>INACTIVE</code>\\n\\t\\t\\t\\t\\t\\tstatus may remain discoverable in your account for a period of time.\\n\\t\\t\\t\\t\\t\\tHowever, this behavior is subject to change in the future. We don't\\n\\t\\t\\t\\t\\t\\trecommend that you rely on <code>INACTIVE</code> clusters persisting.</p>\\n            </dd>\\n         </dl>\"\n                    }\n                },\n                \"registeredContainerInstancesCount\": {\n                    \"target\": \"com.amazonaws.ecs#Integer\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The number of container instances registered into the cluster. This includes container\\n\\t\\t\\tinstances in both <code>ACTIVE</code> and <code>DRAINING</code> status.</p>\"\n                    }\n                },\n                \"runningTasksCount\": {\n                    \"target\": \"com.amazonaws.ecs#Integer\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The number of tasks in the cluster that are in the <code>RUNNING</code> state.</p>\"\n                    }\n                },\n                \"pendingTasksCount\": {\n                    \"target\": \"com.amazonaws.ecs#Integer\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The number of tasks in the cluster that are in the <code>PENDING</code> state.</p>\"\n                    }\n                },\n                \"activeServicesCount\": {\n                    \"target\": \"com.amazonaws.ecs#Integer\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The number of services that are running on the cluster in an <code>ACTIVE</code>\\n\\t\\t\\tstate. You can view these services with <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_ListServices.html\\\">ListServices</a>.</p>\"\n                    }\n                },\n                \"statistics\": {\n                    \"target\": \"com.amazonaws.ecs#Statistics\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Additional information about your clusters that are separated by launch type. They\\n\\t\\t\\tinclude the following:</p>\\n         <ul>\\n            <li>\\n               <p>runningEC2TasksCount</p>\\n            </li>\\n            <li>\\n               <p>RunningFargateTasksCount</p>\\n            </li>\\n            <li>\\n               <p>pendingEC2TasksCount</p>\\n            </li>\\n            <li>\\n               <p>pendingFargateTasksCount</p>\\n            </li>\\n            <li>\\n               <p>activeEC2ServiceCount</p>\\n            </li>\\n            <li>\\n               <p>activeFargateServiceCount</p>\\n            </li>\\n            <li>\\n               <p>drainingEC2ServiceCount</p>\\n            </li>\\n            <li>\\n               <p>drainingFargateServiceCount</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"tags\": {\n                    \"target\": \"com.amazonaws.ecs#Tags\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The metadata that you apply to the cluster to help you categorize and organize them.\\n\\t\\t\\tEach tag consists of a key and an optional value. You define both.</p>\\n         <p>The following basic restrictions apply to tags:</p>\\n         <ul>\\n            <li>\\n               <p>Maximum number of tags per resource - 50</p>\\n            </li>\\n            <li>\\n               <p>For each resource, each tag key must be unique, and each tag key can have only\\n                    one value.</p>\\n            </li>\\n            <li>\\n               <p>Maximum key length - 128 Unicode characters in UTF-8</p>\\n            </li>\\n            <li>\\n               <p>Maximum value length - 256 Unicode characters in UTF-8</p>\\n            </li>\\n            <li>\\n               <p>If your tagging schema is used across multiple services and resources,\\n                    remember that other services may have restrictions on allowed characters.\\n                    Generally allowed characters are: letters, numbers, and spaces representable in\\n                    UTF-8, and the following characters: + - = . _ : / @.</p>\\n            </li>\\n            <li>\\n               <p>Tag keys and values are case-sensitive.</p>\\n            </li>\\n            <li>\\n               <p>Do not use <code>aws:</code>, <code>AWS:</code>, or any upper or lowercase\\n                    combination of such as a prefix for either keys or values as it is reserved for\\n                    Amazon Web Services use. You cannot edit or delete tag keys or values with this prefix. Tags with\\n                    this prefix do not count against your tags per resource limit.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"settings\": {\n                    \"target\": \"com.amazonaws.ecs#ClusterSettings\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The settings for the cluster. This parameter indicates whether CloudWatch Container Insights\\n\\t\\t\\tis on or off for a cluster.</p>\"\n                    }\n                },\n                \"capacityProviders\": {\n                    \"target\": \"com.amazonaws.ecs#StringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The capacity providers associated with the cluster.</p>\"\n                    }\n                },\n                \"defaultCapacityProviderStrategy\": {\n                    \"target\": \"com.amazonaws.ecs#CapacityProviderStrategy\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The default capacity provider strategy for the cluster. When services or tasks are run\\n\\t\\t\\tin the cluster with no launch type or capacity provider strategy specified, the default\\n\\t\\t\\tcapacity provider strategy is used.</p>\"\n                    }\n                },\n                \"attachments\": {\n                    \"target\": \"com.amazonaws.ecs#Attachments\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The resources attached to a cluster. When using a capacity provider with a cluster,\\n\\t\\t\\tthe capacity provider and associated resources are returned as cluster\\n\\t\\t\\tattachments.</p>\"\n                    }\n                },\n                \"attachmentsStatus\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The status of the capacity providers associated with the cluster. The following are\\n\\t\\t\\tthe states that are returned.</p>\\n         <dl>\\n            <dt>UPDATE_IN_PROGRESS</dt>\\n            <dd>\\n               <p>The available capacity providers for the cluster are updating.</p>\\n            </dd>\\n            <dt>UPDATE_COMPLETE</dt>\\n            <dd>\\n               <p>The capacity providers have successfully updated.</p>\\n            </dd>\\n            <dt>UPDATE_FAILED</dt>\\n            <dd>\\n               <p>The capacity provider updates failed.</p>\\n            </dd>\\n         </dl>\"\n                    }\n                },\n                \"serviceConnectDefaults\": {\n                    \"target\": \"com.amazonaws.ecs#ClusterServiceConnectDefaults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter to set a default Service Connect namespace. After you set a default \\n\\tService Connect namespace, any new services with Service Connect turned on that are created in the cluster are added as\\n\\tclient services in the namespace. This setting only applies to new services that set the <code>enabled</code> parameter to\\n\\t<code>true</code> in the <code>ServiceConnectConfiguration</code>.\\n\\tYou can set the namespace of each service individually in the <code>ServiceConnectConfiguration</code> to override this default\\n\\tparameter.</p>\\n         <p>Tasks that run in a namespace can use short names to connect\\n\\tto services in the namespace. Tasks can connect to services across all of the clusters in the namespace.\\n\\tTasks connect through a managed proxy container\\n\\tthat collects logs and metrics for increased visibility.\\n\\tOnly the tasks that Amazon ECS services create are supported with Service Connect.\\n\\tFor more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-connect.html\\\">Service Connect</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A regional grouping of one or more container instances where you can run task\\n\\t\\t\\trequests. Each account receives a default cluster the first time you use the Amazon ECS\\n\\t\\t\\tservice, but you may also create other clusters. Clusters may contain more than one\\n\\t\\t\\tinstance type simultaneously.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#ClusterConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"executeCommandConfiguration\": {\n                    \"target\": \"com.amazonaws.ecs#ExecuteCommandConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The details of the execute command configuration.</p>\"\n                    }\n                },\n                \"managedStorageConfiguration\": {\n                    \"target\": \"com.amazonaws.ecs#ManagedStorageConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The details of the managed storage configuration.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The execute command and managed storage configuration for the cluster.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#ClusterContainsCapacityProviderException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> Message that describes the cause of the exception.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The cluster contains one or more capacity providers that prevent the requested operation. This exception occurs when you try to delete a cluster that still has active capacity providers, including Amazon ECS Managed Instances capacity providers. You must first delete all capacity providers from the cluster before you can delete the cluster itself.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.ecs#ClusterContainsContainerInstancesException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> Message that describes the cause of the exception.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>You can't delete a cluster that has registered container instances. First, deregister\\n\\t\\t\\tthe container instances before you can delete the cluster. For more information, see\\n\\t\\t\\t\\t<a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_DeregisterContainerInstance.html\\\">DeregisterContainerInstance</a>.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.ecs#ClusterContainsServicesException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> Message that describes the cause of the exception.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>You can't delete a cluster that contains services. First, update the service to reduce\\n\\t\\t\\tits desired task count to 0, and then delete the service. For more information, see\\n\\t\\t\\t\\t<a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_UpdateService.html\\\">UpdateService</a> and\\n\\t\\t\\t\\t<a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_DeleteService.html\\\">DeleteService</a>.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.ecs#ClusterContainsTasksException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> Message that describes the cause of the exception.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>You can't delete a cluster that has active tasks.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.ecs#ClusterField\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ATTACHMENTS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ATTACHMENTS\"\n                    }\n                },\n                \"CONFIGURATIONS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"CONFIGURATIONS\"\n                    }\n                },\n                \"SETTINGS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"SETTINGS\"\n                    }\n                },\n                \"STATISTICS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"STATISTICS\"\n                    }\n                },\n                \"TAGS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"TAGS\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ecs#ClusterFieldList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#ClusterField\"\n            }\n        },\n        \"com.amazonaws.ecs#ClusterNotFoundException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> Message that describes the cause of the exception.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The specified cluster wasn't found. You can view your available clusters with <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_ListClusters.html\\\">ListClusters</a>. Amazon ECS clusters are Region specific.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.ecs#ClusterServiceConnectDefaults\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"namespace\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The namespace name or full Amazon Resource Name (ARN) of the Cloud Map namespace. When you create a service and don't specify a\\n\\t\\t\\tService Connect configuration, this namespace is used.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Use this parameter to set a default Service Connect namespace. After you set a default \\n\\tService Connect namespace, any new services with Service Connect turned on that are created in the cluster are added as\\n\\tclient services in the namespace. This setting only applies to new services that set the <code>enabled</code> parameter to\\n\\t<code>true</code> in the <code>ServiceConnectConfiguration</code>.\\n\\tYou can set the namespace of each service individually in the <code>ServiceConnectConfiguration</code> to override this default\\n\\tparameter.</p>\\n         <p>Tasks that run in a namespace can use short names to connect\\n\\tto services in the namespace. Tasks can connect to services across all of the clusters in the namespace.\\n\\tTasks connect through a managed proxy container\\n\\tthat collects logs and metrics for increased visibility.\\n\\tOnly the tasks that Amazon ECS services create are supported with Service Connect.\\n\\tFor more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-connect.html\\\">Service Connect</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#ClusterServiceConnectDefaultsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"namespace\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The namespace name or full Amazon Resource Name (ARN) of the Cloud Map namespace that's used when you create a service and don't specify\\n\\t\\t\\ta Service Connect configuration. The namespace name can include up to 1024 characters.\\n\\t\\t\\tThe name is case-sensitive. The name can't include greater than (>), less than\\n\\t\\t\\t(<), double quotation marks (\\\"), or slash (/).</p>\\n         <p>If you enter an existing namespace name or ARN, then that namespace will be used.\\n\\t\\t\\tAny namespace type is supported. The namespace must be in this account and this Amazon Web Services\\n\\t\\t\\tRegion.</p>\\n         <p>If you enter a new name, a Cloud Map namespace will be created. Amazon ECS creates a\\n\\t\\t\\tCloud Map namespace with the \\\"API calls\\\" method of instance discovery only. This instance\\n\\t\\t\\tdiscovery method is the \\\"HTTP\\\" namespace type in the Command Line Interface. Other types of instance\\n\\t\\t\\tdiscovery aren't used by Service Connect.</p>\\n         <p>If you update the cluster with an empty string <code>\\\"\\\"</code> for the namespace name,\\n\\t\\t\\tthe cluster configuration for Service Connect is removed. Note that the namespace will\\n\\t\\t\\tremain in Cloud Map and must be deleted separately.</p>\\n         <p>For more information about Cloud Map, see <a href=\\\"https://docs.aws.amazon.com/cloud-map/latest/dg/working-with-services.html\\\">Working with Services</a>\\n\\t\\t\\tin the <i>Cloud Map Developer Guide</i>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Use this parameter to set a default Service Connect namespace. After you set a default \\n\\tService Connect namespace, any new services with Service Connect turned on that are created in the cluster are added as\\n\\tclient services in the namespace. This setting only applies to new services that set the <code>enabled</code> parameter to\\n\\t<code>true</code> in the <code>ServiceConnectConfiguration</code>.\\n\\tYou can set the namespace of each service individually in the <code>ServiceConnectConfiguration</code> to override this default\\n\\tparameter.</p>\\n         <p>Tasks that run in a namespace can use short names to connect\\n\\tto services in the namespace. Tasks can connect to services across all of the clusters in the namespace.\\n\\tTasks connect through a managed proxy container\\n\\tthat collects logs and metrics for increased visibility.\\n\\tOnly the tasks that Amazon ECS services create are supported with Service Connect.\\n\\tFor more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-connect.html\\\">Service Connect</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#ClusterSetting\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"name\": {\n                    \"target\": \"com.amazonaws.ecs#ClusterSettingName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the cluster setting. The value is <code>containerInsights</code>.</p>\"\n                    }\n                },\n                \"value\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The value to set for the cluster setting. The supported values are\\n\\t\\t\\t\\t<code>enhanced</code>, <code>enabled</code>, and <code>disabled</code>. </p>\\n         <p>To use Container Insights with enhanced observability, set the\\n\\t\\t\\t\\t<code>containerInsights</code> account setting to <code>enhanced</code>.</p>\\n         <p>To use Container Insights, set the <code>containerInsights</code> account setting to\\n\\t\\t\\t\\t<code>enabled</code>.</p>\\n         <p>If a cluster value is specified, it will override the <code>containerInsights</code>\\n\\t\\t\\tvalue set with <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_PutAccountSetting.html\\\">PutAccountSetting</a> or <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_PutAccountSettingDefault.html\\\">PutAccountSettingDefault</a>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The settings to use when creating a cluster. This parameter is used to turn on CloudWatch\\n\\t\\t\\tContainer Insights with enhanced observability or CloudWatch Container Insights for a\\n\\t\\t\\tcluster.</p>\\n         <p>Container Insights with enhanced observability provides all the Container Insights\\n\\t\\t\\tmetrics, plus additional task and container metrics. This version supports enhanced\\n\\t\\t\\tobservability for Amazon ECS clusters using the Amazon EC2 and Fargate launch types. After you\\n\\t\\t\\tconfigure Container Insights with enhanced observability on Amazon ECS, Container Insights\\n\\t\\t\\tauto-collects detailed infrastructure telemetry from the cluster level down to the\\n\\t\\t\\tcontainer level in your environment and displays these critical performance data in\\n\\t\\t\\tcurated dashboards removing the heavy lifting in observability set-up. </p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/cloudwatch-container-insights.html\\\">Monitor\\n\\t\\t\\t\\tAmazon ECS containers using Container Insights with enhanced observability</a> in the\\n\\t\\t\\t<i>Amazon Elastic Container Service Developer Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#ClusterSettingName\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"CONTAINER_INSIGHTS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"containerInsights\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ecs#ClusterSettings\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#ClusterSetting\"\n            }\n        },\n        \"com.amazonaws.ecs#Clusters\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#Cluster\"\n            }\n        },\n        \"com.amazonaws.ecs#Compatibility\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"EC2\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"EC2\"\n                    }\n                },\n                \"FARGATE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"FARGATE\"\n                    }\n                },\n                \"EXTERNAL\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"EXTERNAL\"\n                    }\n                },\n                \"MANAGED_INSTANCES\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"MANAGED_INSTANCES\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ecs#CompatibilityList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#Compatibility\"\n            }\n        },\n        \"com.amazonaws.ecs#ConflictException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"resourceIds\": {\n                    \"target\": \"com.amazonaws.ecs#ResourceIds\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The existing task ARNs which are already associated with the\\n\\t\\t\\t\\t<code>clientToken</code>.</p>\"\n                    }\n                },\n                \"message\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> Message that describes the cause of the exception.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The request could not be processed because of conflict in the current state of the resource. </p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.ecs#Connectivity\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"CONNECTED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"CONNECTED\"\n                    }\n                },\n                \"DISCONNECTED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DISCONNECTED\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ecs#Container\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"containerArn\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the container.</p>\"\n                    }\n                },\n                \"taskArn\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the task.</p>\"\n                    }\n                },\n                \"name\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the container.</p>\"\n                    }\n                },\n                \"image\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The image used for the container.</p>\"\n                    }\n                },\n                \"imageDigest\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The container image manifest digest.</p>\"\n                    }\n                },\n                \"runtimeId\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the Docker container.</p>\"\n                    }\n                },\n                \"lastStatus\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The last known status of the container.</p>\"\n                    }\n                },\n                \"exitCode\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedInteger\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The exit code returned from the container.</p>\"\n                    }\n                },\n                \"reason\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A short (1024 max characters) human-readable string to provide additional details about a\\n\\t\\t\\trunning or stopped container.</p>\"\n                    }\n                },\n                \"networkBindings\": {\n                    \"target\": \"com.amazonaws.ecs#NetworkBindings\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The network bindings associated with the container.</p>\"\n                    }\n                },\n                \"networkInterfaces\": {\n                    \"target\": \"com.amazonaws.ecs#NetworkInterfaces\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The network interfaces associated with the container.</p>\"\n                    }\n                },\n                \"healthStatus\": {\n                    \"target\": \"com.amazonaws.ecs#HealthStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The health status of the container. If health checks aren't configured for this\\n\\t\\t\\tcontainer in its task definition, then it reports the health status as\\n\\t\\t\\t\\t<code>UNKNOWN</code>.</p>\"\n                    }\n                },\n                \"managedAgents\": {\n                    \"target\": \"com.amazonaws.ecs#ManagedAgents\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The details of any Amazon ECS managed agents associated with the container.</p>\"\n                    }\n                },\n                \"cpu\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of CPU units set for the container. The value is <code>0</code> if no value\\n\\t\\t\\twas specified in the container definition when the task definition was\\n\\t\\t\\tregistered.</p>\"\n                    }\n                },\n                \"memory\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The hard limit (in MiB) of memory set for the container.</p>\"\n                    }\n                },\n                \"memoryReservation\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The soft limit (in MiB) of memory set for the container.</p>\"\n                    }\n                },\n                \"gpuIds\": {\n                    \"target\": \"com.amazonaws.ecs#GpuIds\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IDs of each GPU assigned to the container.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A Docker container that's part of a task.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#ContainerCondition\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"START\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"START\"\n                    }\n                },\n                \"COMPLETE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"COMPLETE\"\n                    }\n                },\n                \"SUCCESS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"SUCCESS\"\n                    }\n                },\n                \"HEALTHY\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"HEALTHY\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ecs#ContainerDefinition\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"name\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of a container. If you're linking multiple containers together in a task\\n\\t\\t\\tdefinition, the <code>name</code> of one container can be entered in the\\n\\t\\t\\t\\t<code>links</code> of another container to connect the containers.\\n\\t\\t\\tUp to 255 letters (uppercase and lowercase), numbers, underscores, and hyphens are allowed. This parameter maps to <code>name</code> in the docker container\\n\\t\\t\\tcreate command and the <code>--name</code> option to docker run. </p>\"\n                    }\n                },\n                \"image\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The image used to start a container. This string is passed directly to the Docker\\n\\t\\t\\tdaemon. By default, images in the Docker Hub registry are available. Other repositories\\n\\t\\t\\tare specified with either <code>\\n               <i>repository-url</i>/<i>image</i>:<i>tag</i>\\n            </code> or <code>\\n               <i>repository-url</i>/<i>image</i>@<i>digest</i>\\n            </code>. For images using tags (repository-url/image:tag), up to 255 characters total are allowed, including letters (uppercase and lowercase), numbers, hyphens, underscores, colons, periods, forward slashes, and number signs (#). For images using digests (repository-url/image@digest), the 255 character limit applies only to the repository URL and image name (everything before the @ sign). The only supported hash function is sha256, and the hash value after sha256: must be exactly 64 characters (only letters A-F, a-f, and numbers 0-9 are allowed). This parameter maps to <code>Image</code> in the docker\\n\\t\\t\\tcontainer create command and the <code>IMAGE</code> parameter of docker run.</p>\\n         <ul>\\n            <li>\\n               <p>When a new task starts, the Amazon ECS container agent pulls the latest version of\\n\\t\\t\\t\\t\\tthe specified image and tag for the container to use. However, subsequent\\n\\t\\t\\t\\t\\tupdates to a repository image aren't propagated to already running tasks.</p>\\n            </li>\\n            <li>\\n               <p>Images in Amazon ECR repositories can be specified by either using the full\\n\\t\\t\\t\\t\\t\\t<code>registry/repository:tag</code> or\\n\\t\\t\\t\\t\\t\\t<code>registry/repository@digest</code>. For example,\\n\\t\\t\\t\\t\\t\\t<code>012345678910.dkr.ecr.<region-name>.amazonaws.com/<repository-name>:latest</code>\\n\\t\\t\\t\\t\\tor\\n\\t\\t\\t\\t\\t\\t<code>012345678910.dkr.ecr.<region-name>.amazonaws.com/<repository-name>@sha256:94afd1f2e64d908bc90dbca0035a5b567EXAMPLE</code>.\\n\\t\\t\\t\\t</p>\\n            </li>\\n            <li>\\n               <p>Images in official repositories on Docker Hub use a single name (for example,\\n\\t\\t\\t\\t\\t\\t<code>ubuntu</code> or <code>mongo</code>).</p>\\n            </li>\\n            <li>\\n               <p>Images in other repositories on Docker Hub are qualified with an organization\\n\\t\\t\\t\\t\\tname (for example, <code>amazon/amazon-ecs-agent</code>).</p>\\n            </li>\\n            <li>\\n               <p>Images in other online repositories are qualified further by a domain name\\n\\t\\t\\t\\t\\t(for example, <code>quay.io/assemblyline/ubuntu</code>).</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"repositoryCredentials\": {\n                    \"target\": \"com.amazonaws.ecs#RepositoryCredentials\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The private repository authentication credentials to use.</p>\"\n                    }\n                },\n                \"cpu\": {\n                    \"target\": \"com.amazonaws.ecs#Integer\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The number of <code>cpu</code> units reserved for the container. This parameter maps\\n\\t\\t\\tto <code>CpuShares</code> in the docker container create commandand the\\n\\t\\t\\t\\t<code>--cpu-shares</code> option to docker run.</p>\\n         <p>This field is optional for tasks using the Fargate launch type, and the\\n\\t\\t\\tonly requirement is that the total amount of CPU reserved for all containers within a\\n\\t\\t\\ttask be lower than the task-level <code>cpu</code> value.</p>\\n         <note>\\n            <p>You can determine the number of CPU units that are available per EC2 instance type\\n\\t\\t\\t\\tby multiplying the vCPUs listed for that instance type on the <a href=\\\"http://aws.amazon.com/ec2/instance-types/\\\">Amazon EC2 Instances</a> detail page\\n\\t\\t\\t\\tby 1,024.</p>\\n         </note>\\n         <p>Linux containers share unallocated CPU units with other containers on the container\\n\\t\\t\\tinstance with the same ratio as their allocated amount. For example, if you run a\\n\\t\\t\\tsingle-container task on a single-core instance type with 512 CPU units specified for\\n\\t\\t\\tthat container, and that's the only task running on the container instance, that\\n\\t\\t\\tcontainer could use the full 1,024 CPU unit share at any given time. However, if you\\n\\t\\t\\tlaunched another copy of the same task on that container instance, each task is\\n\\t\\t\\tguaranteed a minimum of 512 CPU units when needed. Moreover, each container could float\\n\\t\\t\\tto higher CPU usage if the other container was not using it. If both tasks were 100%\\n\\t\\t\\tactive all of the time, they would be limited to 512 CPU units.</p>\\n         <p>On Linux container instances, the Docker daemon on the container instance uses the CPU\\n\\t\\t\\tvalue to calculate the relative CPU share ratios for running containers. The minimum\\n\\t\\t\\tvalid CPU share value that the Linux kernel allows is 2, and the maximum valid CPU share\\n\\t\\t\\tvalue that the Linux kernel allows is 262144. However, the CPU parameter isn't required,\\n\\t\\t\\tand you can use CPU values below 2 or above 262144 in your container definitions. For\\n\\t\\t\\tCPU values below 2 (including null) or above 262144, the behavior varies based on your\\n\\t\\t\\tAmazon ECS container agent version:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <b>Agent versions less than or equal to 1.1.0:</b>\\n\\t\\t\\t\\t\\tNull and zero CPU values are passed to Docker as 0, which Docker then converts\\n\\t\\t\\t\\t\\tto 1,024 CPU shares. CPU values of 1 are passed to Docker as 1, which the Linux\\n\\t\\t\\t\\t\\tkernel converts to two CPU shares.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>Agent versions greater than or equal to 1.2.0:</b>\\n\\t\\t\\t\\t\\tNull, zero, and CPU values of 1 are passed to Docker as 2.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>Agent versions greater than or equal to\\n\\t\\t\\t\\t\\t\\t1.84.0:</b> CPU values greater than 256 vCPU are passed to Docker as\\n\\t\\t\\t\\t\\t256, which is equivalent to 262144 CPU shares.</p>\\n            </li>\\n         </ul>\\n         <p>On Windows container instances, the CPU limit is enforced as an absolute limit, or a\\n\\t\\t\\tquota. Windows containers only have access to the specified amount of CPU that's\\n\\t\\t\\tdescribed in the task definition. A null or zero CPU value is passed to Docker as\\n\\t\\t\\t\\t<code>0</code>, which Windows interprets as 1% of one CPU.</p>\"\n                    }\n                },\n                \"memory\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedInteger\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The amount (in MiB) of memory to present to the container. If your container attempts\\n\\t\\t\\tto exceed the memory specified here, the container is killed. The total amount of memory\\n\\t\\t\\treserved for all containers within a task must be lower than the task\\n\\t\\t\\t\\t<code>memory</code> value, if one is specified. This parameter maps to\\n\\t\\t\\t\\t<code>Memory</code> in the docker container create command and the\\n\\t\\t\\t\\t<code>--memory</code> option to docker run.</p>\\n         <p>If using the Fargate launch type, this parameter is optional.</p>\\n         <p>If using the EC2 launch type, you must specify either a task-level\\n\\t\\t\\tmemory value or a container-level memory value. If you specify both a container-level\\n\\t\\t\\t\\t<code>memory</code> and <code>memoryReservation</code> value, <code>memory</code>\\n\\t\\t\\tmust be greater than <code>memoryReservation</code>. If you specify\\n\\t\\t\\t\\t<code>memoryReservation</code>, then that value is subtracted from the available\\n\\t\\t\\tmemory resources for the container instance where the container is placed. Otherwise,\\n\\t\\t\\tthe value of <code>memory</code> is used.</p>\\n         <p>The Docker 20.10.0 or later daemon reserves a minimum of 6 MiB of memory for a\\n\\t\\t\\tcontainer. So, don't specify less than 6 MiB of memory for your containers. </p>\\n         <p>The Docker 19.03.13-ce or earlier daemon reserves a minimum of 4 MiB of memory for a\\n\\t\\t\\tcontainer. So, don't specify less than 4 MiB of memory for your containers.</p>\"\n                    }\n                },\n                \"memoryReservation\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedInteger\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The soft limit (in MiB) of memory to reserve for the container. When system memory is\\n\\t\\t\\tunder heavy contention, Docker attempts to keep the container memory to this soft limit.\\n\\t\\t\\tHowever, your container can consume more memory when it needs to, up to either the hard\\n\\t\\t\\tlimit specified with the <code>memory</code> parameter (if applicable), or all of the\\n\\t\\t\\tavailable memory on the container instance, whichever comes first. This parameter maps\\n\\t\\t\\tto <code>MemoryReservation</code> in the docker container create command and the\\n\\t\\t\\t\\t<code>--memory-reservation</code> option to docker run.</p>\\n         <p>If a task-level memory value is not specified, you must specify a non-zero integer for\\n\\t\\t\\tone or both of <code>memory</code> or <code>memoryReservation</code> in a container\\n\\t\\t\\tdefinition. If you specify both, <code>memory</code> must be greater than\\n\\t\\t\\t\\t<code>memoryReservation</code>. If you specify <code>memoryReservation</code>, then\\n\\t\\t\\tthat value is subtracted from the available memory resources for the container instance\\n\\t\\t\\twhere the container is placed. Otherwise, the value of <code>memory</code> is\\n\\t\\t\\tused.</p>\\n         <p>For example, if your container normally uses 128 MiB of memory, but occasionally\\n\\t\\t\\tbursts to 256 MiB of memory for short periods of time, you can set a\\n\\t\\t\\t\\t<code>memoryReservation</code> of 128 MiB, and a <code>memory</code> hard limit of\\n\\t\\t\\t300 MiB. This configuration would allow the container to only reserve 128 MiB of memory\\n\\t\\t\\tfrom the remaining resources on the container instance, but also allow the container to\\n\\t\\t\\tconsume more memory resources when needed.</p>\\n         <p>The Docker 20.10.0 or later daemon reserves a minimum of 6 MiB of memory for a\\n\\t\\t\\tcontainer. So, don't specify less than 6 MiB of memory for your containers. </p>\\n         <p>The Docker 19.03.13-ce or earlier daemon reserves a minimum of 4 MiB of memory for a\\n\\t\\t\\tcontainer. So, don't specify less than 4 MiB of memory for your containers.</p>\"\n                    }\n                },\n                \"links\": {\n                    \"target\": \"com.amazonaws.ecs#StringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>links</code> parameter allows containers to communicate with each other\\n\\t\\t\\twithout the need for port mappings. This parameter is only supported if the network mode\\n\\t\\t\\tof a task definition is <code>bridge</code>. The <code>name:internalName</code>\\n\\t\\t\\tconstruct is analogous to <code>name:alias</code> in Docker links.\\n\\t\\t\\tUp to 255 letters (uppercase and lowercase), numbers, underscores, and hyphens are allowed.. This parameter maps to <code>Links</code> in the docker\\n\\t\\t\\tcontainer create command and the <code>--link</code> option to docker run.</p>\\n         <note>\\n            <p>This parameter is not supported for Windows containers.</p>\\n         </note>\\n         <important>\\n            <p>Containers that are collocated on a single container instance may be able to\\n\\t\\t\\t\\tcommunicate with each other without requiring links or host port mappings. Network\\n\\t\\t\\t\\tisolation is achieved on the container instance using security groups and VPC\\n\\t\\t\\t\\tsettings.</p>\\n         </important>\"\n                    }\n                },\n                \"portMappings\": {\n                    \"target\": \"com.amazonaws.ecs#PortMappingList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The list of port mappings for the container. Port mappings allow containers to access\\n\\t\\t\\tports on the host container instance to send or receive traffic.</p>\\n         <p>For task definitions that use the <code>awsvpc</code> network mode, only specify the\\n\\t\\t\\t\\t<code>containerPort</code>. The <code>hostPort</code> can be left blank or it must\\n\\t\\t\\tbe the same value as the <code>containerPort</code>.</p>\\n         <p>Port mappings on Windows use the <code>NetNAT</code> gateway address rather than\\n\\t\\t\\t\\t<code>localhost</code>. There's no loopback for port mappings on Windows, so you\\n\\t\\t\\tcan't access a container's mapped port from the host itself. </p>\\n         <p>This parameter maps to <code>PortBindings</code> in the docker container create\\n\\t\\t\\tcommand and the <code>--publish</code> option to docker run. If the network mode of a\\n\\t\\t\\ttask definition is set to <code>none</code>, then you can't specify port mappings. If\\n\\t\\t\\tthe network mode of a task definition is set to <code>host</code>, then host ports must\\n\\t\\t\\teither be undefined or they must match the container port in the port mapping.</p>\\n         <note>\\n            <p>After a task reaches the <code>RUNNING</code> status, manual and automatic host\\n\\t\\t\\t\\tand container port assignments are visible in the <b>Network\\n\\t\\t\\t\\t\\tBindings</b> section of a container description for a selected task in\\n\\t\\t\\t\\tthe Amazon ECS console. The assignments are also visible in the\\n\\t\\t\\t\\t\\t<code>networkBindings</code> section <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_DescribeTasks.html\\\">DescribeTasks</a>\\n\\t\\t\\t\\tresponses.</p>\\n         </note>\"\n                    }\n                },\n                \"essential\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedBoolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If the <code>essential</code> parameter of a container is marked as <code>true</code>,\\n\\t\\t\\tand that container fails or stops for any reason, all other containers that are part of\\n\\t\\t\\tthe task are stopped. If the <code>essential</code> parameter of a container is marked\\n\\t\\t\\tas <code>false</code>, its failure doesn't affect the rest of the containers in a task.\\n\\t\\t\\tIf this parameter is omitted, a container is assumed to be essential.</p>\\n         <p>All tasks must have at least one essential container. If you have an application\\n\\t\\t\\tthat's composed of multiple containers, group containers that are used for a common\\n\\t\\t\\tpurpose into components, and separate the different components into multiple task\\n\\t\\t\\tdefinitions. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/application_architecture.html\\\">Application\\n\\t\\t\\t\\tArchitecture</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\"\n                    }\n                },\n                \"restartPolicy\": {\n                    \"target\": \"com.amazonaws.ecs#ContainerRestartPolicy\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The restart policy for a container. When you set up a restart policy, Amazon ECS can\\n\\t\\t\\trestart the container without needing to replace the task. For more information, see\\n\\t\\t\\t\\t<a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/container-restart-policy.html\\\">Restart\\n\\t\\t\\t\\tindividual containers in Amazon ECS tasks with container restart policies</a> in the\\n\\t\\t\\t<i>Amazon Elastic Container Service Developer Guide</i>.</p>\"\n                    }\n                },\n                \"entryPoint\": {\n                    \"target\": \"com.amazonaws.ecs#StringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<important>\\n            <p>Early versions of the Amazon ECS container agent don't properly handle\\n\\t\\t\\t\\t\\t<code>entryPoint</code> parameters. If you have problems using\\n\\t\\t\\t\\t\\t<code>entryPoint</code>, update your container agent or enter your commands and\\n\\t\\t\\t\\targuments as <code>command</code> array items instead.</p>\\n         </important>\\n         <p>The entry point that's passed to the container. This parameter maps to\\n\\t\\t\\t\\t<code>Entrypoint</code> in the docker container create command and the\\n\\t\\t\\t\\t<code>--entrypoint</code> option to docker run.</p>\"\n                    }\n                },\n                \"command\": {\n                    \"target\": \"com.amazonaws.ecs#StringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The command that's passed to the container. This parameter maps to <code>Cmd</code> in\\n\\t\\t\\tthe docker container create command and the <code>COMMAND</code> parameter to docker\\n\\t\\t\\trun. If there are multiple arguments, each argument is a separated string in the\\n\\t\\t\\tarray.</p>\"\n                    }\n                },\n                \"environment\": {\n                    \"target\": \"com.amazonaws.ecs#EnvironmentVariables\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The environment variables to pass to a container. This parameter maps to\\n\\t\\t\\t\\t<code>Env</code> in the docker container create command and the <code>--env</code>\\n\\t\\t\\toption to docker run.</p>\\n         <important>\\n            <p>We don't recommend that you use plaintext environment variables for sensitive\\n\\t\\t\\t\\tinformation, such as credential data.</p>\\n         </important>\"\n                    }\n                },\n                \"environmentFiles\": {\n                    \"target\": \"com.amazonaws.ecs#EnvironmentFiles\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of files containing the environment variables to pass to a container. This\\n\\t\\t\\tparameter maps to the <code>--env-file</code> option to docker run.</p>\\n         <p>You can specify up to ten environment files. The file must have a <code>.env</code>\\n\\t\\t\\tfile extension. Each line in an environment file contains an environment variable in\\n\\t\\t\\t\\t<code>VARIABLE=VALUE</code> format. Lines beginning with <code>#</code> are treated\\n\\t\\t\\tas comments and are ignored.</p>\\n         <p>If there are environment variables specified using the <code>environment</code>\\n\\t\\t\\tparameter in a container definition, they take precedence over the variables contained\\n\\t\\t\\twithin an environment file. If multiple environment files are specified that contain the\\n\\t\\t\\tsame variable, they're processed from the top down. We recommend that you use unique\\n\\t\\t\\tvariable names. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/taskdef-envfiles.html\\\">Specifying Environment\\n\\t\\t\\t\\tVariables</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\"\n                    }\n                },\n                \"mountPoints\": {\n                    \"target\": \"com.amazonaws.ecs#MountPointList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The mount points for data volumes in your container.</p>\\n         <p>This parameter maps to <code>Volumes</code> in the docker container create command and\\n\\t\\t\\tthe <code>--volume</code> option to docker run.</p>\\n         <p>Windows containers can mount whole directories on the same drive as\\n\\t\\t\\t\\t<code>$env:ProgramData</code>. Windows containers can't mount directories on a\\n\\t\\t\\tdifferent drive, and mount point can't be across drives.</p>\"\n                    }\n                },\n                \"volumesFrom\": {\n                    \"target\": \"com.amazonaws.ecs#VolumeFromList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Data volumes to mount from another container. This parameter maps to\\n\\t\\t\\t\\t<code>VolumesFrom</code> in the docker container create command and the\\n\\t\\t\\t\\t<code>--volumes-from</code> option to docker run.</p>\"\n                    }\n                },\n                \"linuxParameters\": {\n                    \"target\": \"com.amazonaws.ecs#LinuxParameters\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Linux-specific modifications that are applied to the default Docker container\\n\\t\\t\\tconfiguration, such as Linux kernel capabilities. For more information see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_KernelCapabilities.html\\\">KernelCapabilities</a>.</p>\\n         <note>\\n            <p>This parameter is not supported for Windows containers.</p>\\n         </note>\"\n                    }\n                },\n                \"secrets\": {\n                    \"target\": \"com.amazonaws.ecs#SecretList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The secrets to pass to the container. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/specifying-sensitive-data.html\\\">Specifying\\n\\t\\t\\t\\tSensitive Data</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\"\n                    }\n                },\n                \"dependsOn\": {\n                    \"target\": \"com.amazonaws.ecs#ContainerDependencies\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The dependencies defined for container startup and shutdown. A container can contain\\n\\t\\t\\tmultiple dependencies on other containers in a task definition. When a dependency is\\n\\t\\t\\tdefined for container startup, for container shutdown it is reversed.</p>\\n         <p>For tasks using the EC2 launch type, the container instances require at\\n\\t\\t\\tleast version 1.26.0 of the container agent to turn on container dependencies. However,\\n\\t\\t\\twe recommend using the latest container agent version. For information about checking\\n\\t\\t\\tyour agent version and updating to the latest version, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-agent-update.html\\\">Updating the Amazon ECS\\n\\t\\t\\t\\tContainer Agent</a> in the <i>Amazon Elastic Container Service Developer Guide</i>. If you're using an Amazon ECS-optimized Linux AMI,\\n\\t\\t\\tyour instance needs at least version 1.26.0-1 of the <code>ecs-init</code> package. If\\n\\t\\t\\tyour container instances are launched from version <code>20190301</code> or later, then\\n\\t\\t\\tthey contain the required versions of the container agent and <code>ecs-init</code>. For\\n\\t\\t\\tmore information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-optimized_AMI.html\\\">Amazon ECS-optimized Linux AMI</a>\\n\\t\\t\\tin the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\\n         <p>For tasks using the Fargate launch type, the task or service requires\\n\\t\\t\\tthe following platforms:</p>\\n         <ul>\\n            <li>\\n               <p>Linux platform version <code>1.3.0</code> or later.</p>\\n            </li>\\n            <li>\\n               <p>Windows platform version <code>1.0.0</code> or later.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"startTimeout\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedInteger\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Time duration (in seconds) to wait before giving up on resolving dependencies for a\\n\\t\\t\\tcontainer. For example, you specify two containers in a task definition with containerA\\n\\t\\t\\thaving a dependency on containerB reaching a <code>COMPLETE</code>,\\n\\t\\t\\t<code>SUCCESS</code>, or <code>HEALTHY</code> status. If a <code>startTimeout</code>\\n\\t\\t\\tvalue is specified for containerB and it doesn't reach the desired status within that\\n\\t\\t\\ttime then containerA gives up and not start. This results in the task transitioning to a\\n\\t\\t\\t\\t<code>STOPPED</code> state.</p>\\n         <note>\\n            <p>When the <code>ECS_CONTAINER_START_TIMEOUT</code> container agent configuration\\n\\t\\t\\t\\tvariable is used, it's enforced independently from this start timeout value.</p>\\n         </note>\\n         <p>For tasks using the Fargate launch type, the task or service requires\\n\\t\\t\\tthe following platforms:</p>\\n         <ul>\\n            <li>\\n               <p>Linux platform version <code>1.3.0</code> or later.</p>\\n            </li>\\n            <li>\\n               <p>Windows platform version <code>1.0.0</code> or later.</p>\\n            </li>\\n         </ul>\\n         <p>For tasks using the EC2 launch type, your container instances require at\\n\\t\\t\\tleast version <code>1.26.0</code> of the container agent to use a container start\\n\\t\\t\\ttimeout value. However, we recommend using the latest container agent version. For\\n\\t\\t\\tinformation about checking your agent version and updating to the latest version, see\\n\\t\\t\\t\\t<a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-agent-update.html\\\">Updating the Amazon ECS\\n\\t\\t\\t\\tContainer Agent</a> in the <i>Amazon Elastic Container Service Developer Guide</i>. If you're using an Amazon ECS-optimized Linux AMI,\\n\\t\\t\\tyour instance needs at least version <code>1.26.0-1</code> of the <code>ecs-init</code>\\n\\t\\t\\tpackage. If your container instances are launched from version <code>20190301</code> or\\n\\t\\t\\tlater, then they contain the required versions of the container agent and\\n\\t\\t\\t\\t<code>ecs-init</code>. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-optimized_AMI.html\\\">Amazon ECS-optimized Linux AMI</a>\\n\\t\\t\\tin the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\\n         <p>The valid values for Fargate are 2-120 seconds.</p>\"\n                    }\n                },\n                \"stopTimeout\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedInteger\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Time duration (in seconds) to wait before the container is forcefully killed if it\\n\\t\\t\\tdoesn't exit normally on its own.</p>\\n         <p>For tasks using the Fargate launch type, the task or service requires\\n\\t\\t\\tthe following platforms:</p>\\n         <ul>\\n            <li>\\n               <p>Linux platform version <code>1.3.0</code> or later.</p>\\n            </li>\\n            <li>\\n               <p>Windows platform version <code>1.0.0</code> or later.</p>\\n            </li>\\n         </ul>\\n         <p>For tasks that use the Fargate launch type, the max stop timeout value is 120\\n\\t\\t\\tseconds and if the parameter is not specified, the default value of 30 seconds is\\n\\t\\t\\tused.</p>\\n         <p>For tasks that use the EC2 launch type, if the <code>stopTimeout</code>\\n\\t\\t\\tparameter isn't specified, the value set for the Amazon ECS container agent configuration\\n\\t\\t\\tvariable <code>ECS_CONTAINER_STOP_TIMEOUT</code> is used. If neither the\\n\\t\\t\\t\\t<code>stopTimeout</code> parameter or the <code>ECS_CONTAINER_STOP_TIMEOUT</code>\\n\\t\\t\\tagent configuration variable are set, then the default values of 30 seconds for Linux\\n\\t\\t\\tcontainers and 30 seconds on Windows containers are used. Your container instances\\n\\t\\t\\trequire at least version 1.26.0 of the container agent to use a container stop timeout\\n\\t\\t\\tvalue. However, we recommend using the latest container agent version. For information\\n\\t\\t\\tabout checking your agent version and updating to the latest version, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-agent-update.html\\\">Updating the Amazon ECS Container Agent</a> in the <i>Amazon Elastic Container Service Developer Guide</i>. If you're using\\n\\t\\t\\tan Amazon ECS-optimized Linux AMI, your instance needs at least version 1.26.0-1 of the\\n\\t\\t\\t\\t<code>ecs-init</code> package. If your container instances are launched from version\\n\\t\\t\\t\\t<code>20190301</code> or later, then they contain the required versions of the\\n\\t\\t\\tcontainer agent and <code>ecs-init</code>. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-optimized_AMI.html\\\">Amazon ECS-optimized Linux AMI</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\\n         <p>The valid values for Fargate are 2-120 seconds.</p>\"\n                    }\n                },\n                \"versionConsistency\": {\n                    \"target\": \"com.amazonaws.ecs#VersionConsistency\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies whether Amazon ECS will resolve the container image tag provided in the container\\n\\t\\t\\tdefinition to an image digest. By default, the value is <code>enabled</code>. If you set\\n\\t\\t\\tthe value for a container as <code>disabled</code>, Amazon ECS will not resolve the provided\\n\\t\\t\\tcontainer image tag to a digest and will use the original image URI specified in the\\n\\t\\t\\tcontainer definition for deployment. For more information about container image\\n\\t\\t\\tresolution, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/deployment-type-ecs.html#deployment-container-image-stability\\\">Container image resolution</a> in the <i>Amazon ECS Developer\\n\\t\\t\\t\\tGuide</i>.</p>\"\n                    }\n                },\n                \"hostname\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The hostname to use for your container. This parameter maps to <code>Hostname</code>\\n\\t\\t\\tin the docker container create command and the <code>--hostname</code> option to docker\\n\\t\\t\\trun.</p>\\n         <note>\\n            <p>The <code>hostname</code> parameter is not supported if you're using the\\n\\t\\t\\t\\t\\t<code>awsvpc</code> network mode.</p>\\n         </note>\"\n                    }\n                },\n                \"user\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The user to use inside the container. This parameter maps to <code>User</code> in the\\n\\t\\t\\tdocker container create command and the <code>--user</code> option to docker run.</p>\\n         <important>\\n            <p>When running tasks using the <code>host</code> network mode, don't run containers\\n\\t\\t\\t\\tusing the root user (UID 0). We recommend using a non-root user for better\\n\\t\\t\\t\\tsecurity.</p>\\n         </important>\\n         <p>You can specify the <code>user</code> using the following formats. If specifying a UID\\n\\t\\t\\tor GID, you must specify it as a positive integer.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>user</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>user:group</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>uid</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>uid:gid</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>user:gid</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>uid:group</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <note>\\n            <p>This parameter is not supported for Windows containers.</p>\\n         </note>\"\n                    }\n                },\n                \"workingDirectory\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The working directory to run commands inside the container in. This parameter maps to\\n\\t\\t\\t\\t<code>WorkingDir</code> in the docker container create command and the\\n\\t\\t\\t\\t<code>--workdir</code> option to docker run.</p>\"\n                    }\n                },\n                \"disableNetworking\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedBoolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>When this parameter is true, networking is off within the container. This parameter\\n\\t\\t\\tmaps to <code>NetworkDisabled</code> in the docker container create command.</p>\\n         <note>\\n            <p>This parameter is not supported for Windows containers.</p>\\n         </note>\"\n                    }\n                },\n                \"privileged\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedBoolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>When this parameter is true, the container is given elevated privileges on the host\\n\\t\\t\\tcontainer instance (similar to the <code>root</code> user). This parameter maps to\\n\\t\\t\\t\\t<code>Privileged</code> in the docker container create command and the\\n\\t\\t\\t\\t<code>--privileged</code> option to docker run</p>\\n         <note>\\n            <p>This parameter is not supported for Windows containers or tasks run on Fargate.</p>\\n         </note>\"\n                    }\n                },\n                \"readonlyRootFilesystem\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedBoolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>When this parameter is true, the container is given read-only access to its root file\\n\\t\\t\\tsystem. This parameter maps to <code>ReadonlyRootfs</code> in the docker container\\n\\t\\t\\tcreate command and the <code>--read-only</code> option to docker run.</p>\\n         <note>\\n            <p>This parameter is not supported for Windows containers.</p>\\n         </note>\"\n                    }\n                },\n                \"dnsServers\": {\n                    \"target\": \"com.amazonaws.ecs#StringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of DNS servers that are presented to the container. This parameter maps to\\n\\t\\t\\t\\t<code>Dns</code> in the docker container create command and the <code>--dns</code>\\n\\t\\t\\toption to docker run.</p>\\n         <note>\\n            <p>This parameter is not supported for Windows containers.</p>\\n         </note>\"\n                    }\n                },\n                \"dnsSearchDomains\": {\n                    \"target\": \"com.amazonaws.ecs#StringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of DNS search domains that are presented to the container. This parameter maps\\n\\t\\t\\tto <code>DnsSearch</code> in the docker container create command and the\\n\\t\\t\\t\\t<code>--dns-search</code> option to docker run.</p>\\n         <note>\\n            <p>This parameter is not supported for Windows containers.</p>\\n         </note>\"\n                    }\n                },\n                \"extraHosts\": {\n                    \"target\": \"com.amazonaws.ecs#HostEntryList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of hostnames and IP address mappings to append to the <code>/etc/hosts</code>\\n\\t\\t\\tfile on the container. This parameter maps to <code>ExtraHosts</code> in the docker\\n\\t\\t\\tcontainer create command and the <code>--add-host</code> option to docker run.</p>\\n         <note>\\n            <p>This parameter isn't supported for Windows containers or tasks that use the\\n\\t\\t\\t\\t\\t<code>awsvpc</code> network mode.</p>\\n         </note>\"\n                    }\n                },\n                \"dockerSecurityOptions\": {\n                    \"target\": \"com.amazonaws.ecs#StringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of strings to provide custom configuration for multiple security systems. This\\n\\t\\t\\tfield isn't valid for containers in tasks using the Fargate launch\\n\\t\\t\\ttype.</p>\\n         <p>For Linux tasks on EC2, this parameter can be used to reference custom\\n\\t\\t\\tlabels for SELinux and AppArmor multi-level security systems.</p>\\n         <p>For any tasks on EC2, this parameter can be used to reference a\\n\\t\\t\\tcredential spec file that configures a container for Active Directory authentication.\\n\\t\\t\\tFor more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/windows-gmsa.html\\\">Using gMSAs for Windows\\n\\t\\t\\t\\tContainers</a> and <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/linux-gmsa.html\\\">Using gMSAs for Linux\\n\\t\\t\\t\\tContainers</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\\n         <p>This parameter maps to <code>SecurityOpt</code> in the docker container create command\\n\\t\\t\\tand the <code>--security-opt</code> option to docker run.</p>\\n         <note>\\n            <p>The Amazon ECS container agent running on a container instance must register with the\\n\\t\\t\\t\\t\\t<code>ECS_SELINUX_CAPABLE=true</code> or <code>ECS_APPARMOR_CAPABLE=true</code>\\n\\t\\t\\t\\tenvironment variables before containers placed on that instance can use these\\n\\t\\t\\t\\tsecurity options. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-agent-config.html\\\">Amazon ECS Container\\n\\t\\t\\t\\t\\tAgent Configuration</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\\n         </note>\\n         <p>Valid values: \\\"no-new-privileges\\\" | \\\"apparmor:PROFILE\\\" | \\\"label:value\\\" |\\n\\t\\t\\t\\\"credentialspec:CredentialSpecFilePath\\\"</p>\"\n                    }\n                },\n                \"interactive\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedBoolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>When this parameter is <code>true</code>, you can deploy containerized applications\\n\\t\\t\\tthat require <code>stdin</code> or a <code>tty</code> to be allocated. This parameter\\n\\t\\t\\tmaps to <code>OpenStdin</code> in the docker container create command and the\\n\\t\\t\\t\\t<code>--interactive</code> option to docker run.</p>\"\n                    }\n                },\n                \"pseudoTerminal\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedBoolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>When this parameter is <code>true</code>, a TTY is allocated. This parameter maps to\\n\\t\\t\\t\\t<code>Tty</code> in the docker container create command and the <code>--tty</code>\\n\\t\\t\\toption to docker run.</p>\"\n                    }\n                },\n                \"dockerLabels\": {\n                    \"target\": \"com.amazonaws.ecs#DockerLabelsMap\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A key/value map of labels to add to the container. This parameter maps to\\n\\t\\t\\t\\t<code>Labels</code> in the docker container create command and the\\n\\t\\t\\t\\t<code>--label</code> option to docker run. This parameter requires version 1.18 of the Docker Remote API or greater on your container instance. To check the Docker Remote API version on your container instance, log in to your container instance and run the following command: <code>sudo docker version --format '{{.Server.APIVersion}}'</code>\\n         </p>\"\n                    }\n                },\n                \"ulimits\": {\n                    \"target\": \"com.amazonaws.ecs#UlimitList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of <code>ulimits</code> to set in the container. If a <code>ulimit</code> value\\n\\t\\t\\tis specified in a task definition, it overrides the default values set by Docker. This\\n\\t\\t\\tparameter maps to <code>Ulimits</code> in the docker container create command and the\\n\\t\\t\\t\\t<code>--ulimit</code> option to docker run. Valid naming values are displayed in the\\n\\t\\t\\t\\t<a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_Ulimit.html\\\">Ulimit</a> data type.</p>\\n         <p>Amazon ECS tasks hosted on Fargate use the default\\n\\t\\t\\t\\t\\t\\t\\tresource limit values set by the operating system with the exception of\\n\\t\\t\\t\\t\\t\\t\\tthe <code>nofile</code> resource limit parameter which Fargate\\n\\t\\t\\t\\t\\t\\t\\toverrides. The <code>nofile</code> resource limit sets a restriction on\\n\\t\\t\\t\\t\\t\\t\\tthe number of open files that a container can use. The default\\n\\t\\t\\t\\t\\t\\t\\t\\t<code>nofile</code> soft limit is <code> 65535</code> and the default hard limit\\n\\t\\t\\t\\t\\t\\t\\tis <code>65535</code>.</p>\\n         <p>This parameter requires version 1.18 of the Docker Remote API or greater on your container instance. To check the Docker Remote API version on your container instance, log in to your container instance and run the following command: <code>sudo docker version --format '{{.Server.APIVersion}}'</code>\\n         </p>\\n         <note>\\n            <p>This parameter is not supported for Windows containers.</p>\\n         </note>\"\n                    }\n                },\n                \"logConfiguration\": {\n                    \"target\": \"com.amazonaws.ecs#LogConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The log configuration specification for the container.</p>\\n         <p>This parameter maps to <code>LogConfig</code> in the docker container create command\\n\\t\\t\\tand the <code>--log-driver</code> option to docker run. By default, containers use the\\n\\t\\t\\tsame logging driver that the Docker daemon uses. However the container can use a\\n\\t\\t\\tdifferent logging driver than the Docker daemon by specifying a log driver with this\\n\\t\\t\\tparameter in the container definition. To use a different logging driver for a\\n\\t\\t\\tcontainer, the log system must be configured properly on the container instance (or on a\\n\\t\\t\\tdifferent log server for remote logging options). </p>\\n         <note>\\n            <p>Amazon ECS currently supports a subset of the logging drivers available to the Docker\\n\\t\\t\\t\\tdaemon (shown in the <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_LogConfiguration.html\\\">LogConfiguration</a> data type). Additional log drivers may be available in\\n\\t\\t\\t\\tfuture releases of the Amazon ECS container agent.</p>\\n         </note>\\n         <p>This parameter requires version 1.18 of the Docker Remote API or greater on your container instance. To check the Docker Remote API version on your container instance, log in to your container instance and run the following command: <code>sudo docker version --format '{{.Server.APIVersion}}'</code>\\n         </p>\\n         <note>\\n            <p>The Amazon ECS container agent running on a container instance must register the\\n\\t\\t\\t\\tlogging drivers available on that instance with the\\n\\t\\t\\t\\t\\t<code>ECS_AVAILABLE_LOGGING_DRIVERS</code> environment variable before\\n\\t\\t\\t\\tcontainers placed on that instance can use these log configuration options. For more\\n\\t\\t\\t\\tinformation, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-agent-config.html\\\">Amazon ECS Container\\n\\t\\t\\t\\t\\tAgent Configuration</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\\n         </note>\"\n                    }\n                },\n                \"healthCheck\": {\n                    \"target\": \"com.amazonaws.ecs#HealthCheck\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The container health check command and associated configuration parameters for the\\n\\t\\t\\tcontainer. This parameter maps to <code>HealthCheck</code> in the docker container\\n\\t\\t\\tcreate command and the <code>HEALTHCHECK</code> parameter of docker run.</p>\"\n                    }\n                },\n                \"systemControls\": {\n                    \"target\": \"com.amazonaws.ecs#SystemControls\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of namespaced kernel parameters to set in the container. This parameter maps to\\n\\t\\t\\t\\t<code>Sysctls</code> in the docker container create command and the\\n\\t\\t\\t\\t<code>--sysctl</code> option to docker run. For example, you can configure\\n\\t\\t\\t\\t<code>net.ipv4.tcp_keepalive_time</code> setting to maintain longer lived\\n\\t\\t\\tconnections.</p>\"\n                    }\n                },\n                \"resourceRequirements\": {\n                    \"target\": \"com.amazonaws.ecs#ResourceRequirements\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type and amount of a resource to assign to a container. The only supported\\n\\t\\t\\tresource is a GPU.</p>\"\n                    }\n                },\n                \"firelensConfiguration\": {\n                    \"target\": \"com.amazonaws.ecs#FirelensConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The FireLens configuration for the container. This is used to specify and configure a\\n\\t\\t\\tlog router for container logs. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/using_firelens.html\\\">Custom Log Routing</a>\\n\\t\\t\\tin the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\"\n                    }\n                },\n                \"credentialSpecs\": {\n                    \"target\": \"com.amazonaws.ecs#StringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of ARNs in SSM or Amazon S3 to a credential spec (<code>CredSpec</code>) file that\\n\\t\\t\\tconfigures the container for Active Directory authentication. We recommend that you use\\n\\t\\t\\tthis parameter instead of the <code>dockerSecurityOptions</code>. The maximum number of\\n\\t\\t\\tARNs is 1.</p>\\n         <p>There are two formats for each ARN.</p>\\n         <dl>\\n            <dt>credentialspecdomainless:MyARN</dt>\\n            <dd>\\n               <p>You use <code>credentialspecdomainless:MyARN</code> to provide a\\n\\t\\t\\t\\t\\t\\t\\t<code>CredSpec</code> with an additional section for a secret in Secrets Manager.\\n\\t\\t\\t\\t\\t\\tYou provide the login credentials to the domain in the secret.</p>\\n               <p>Each task that runs on any container instance can join different\\n\\t\\t\\t\\t\\t\\tdomains.</p>\\n               <p>You can use this format without joining the container instance to a\\n\\t\\t\\t\\t\\t\\tdomain.</p>\\n            </dd>\\n            <dt>credentialspec:MyARN</dt>\\n            <dd>\\n               <p>You use <code>credentialspec:MyARN</code> to provide a\\n\\t\\t\\t\\t\\t\\t\\t<code>CredSpec</code> for a single domain.</p>\\n               <p>You must join the container instance to the domain before you start any\\n\\t\\t\\t\\t\\t\\ttasks that use this task definition.</p>\\n            </dd>\\n         </dl>\\n         <p>In both formats, replace <code>MyARN</code> with the ARN in SSM or Amazon S3.</p>\\n         <p>If you provide a <code>credentialspecdomainless:MyARN</code>, the\\n\\t\\t\\t\\t<code>credspec</code> must provide a ARN in Secrets Manager for a secret containing the\\n\\t\\t\\tusername, password, and the domain to connect to. For better security, the instance\\n\\t\\t\\tisn't joined to the domain for domainless authentication. Other applications on the\\n\\t\\t\\tinstance can't use the domainless credentials. You can use this parameter to run tasks\\n\\t\\t\\ton the same instance, even it the tasks need to join different domains. For more\\n\\t\\t\\tinformation, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/windows-gmsa.html\\\">Using gMSAs for Windows\\n\\t\\t\\t\\tContainers</a> and <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/linux-gmsa.html\\\">Using gMSAs for Linux\\n\\t\\t\\t\\tContainers</a>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Container definitions are used in task definitions to describe the different\\n\\t\\t\\tcontainers that are launched as part of a task.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#ContainerDefinitions\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#ContainerDefinition\"\n            }\n        },\n        \"com.amazonaws.ecs#ContainerDependencies\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#ContainerDependency\"\n            }\n        },\n        \"com.amazonaws.ecs#ContainerDependency\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"containerName\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of a container.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"condition\": {\n                    \"target\": \"com.amazonaws.ecs#ContainerCondition\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The dependency condition of the container. The following are the available conditions\\n\\t\\t\\tand their behavior:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>START</code> - This condition emulates the behavior of links and\\n\\t\\t\\t\\t\\tvolumes today. It validates that a dependent container is started before\\n\\t\\t\\t\\t\\tpermitting other containers to start.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>COMPLETE</code> - This condition validates that a dependent\\n\\t\\t\\t\\t\\tcontainer runs to completion (exits) before permitting other containers to\\n\\t\\t\\t\\t\\tstart. This can be useful for nonessential containers that run a script and then\\n\\t\\t\\t\\t\\texit. This condition can't be set on an essential container.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>SUCCESS</code> - This condition is the same as\\n\\t\\t\\t\\t\\t\\t<code>COMPLETE</code>, but it also requires that the container exits with a\\n\\t\\t\\t\\t\\t\\t<code>zero</code> status. This condition can't be set on an essential\\n\\t\\t\\t\\t\\tcontainer.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>HEALTHY</code> - This condition validates that the dependent\\n\\t\\t\\t\\t\\tcontainer passes its Docker health check before permitting other containers to\\n\\t\\t\\t\\t\\tstart. This requires that the dependent container has health checks configured.\\n\\t\\t\\t\\t\\tThis condition is confirmed only at task startup.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The dependencies defined for container startup and shutdown. A container can contain\\n\\t\\t\\tmultiple dependencies. When a dependency is defined for container startup, for container\\n\\t\\t\\tshutdown it is reversed.</p>\\n         <p>Your Amazon ECS container instances require at least version 1.26.0 of the container agent\\n\\t\\t\\tto use container dependencies. However, we recommend using the latest container agent\\n\\t\\t\\tversion. For information about checking your agent version and updating to the latest\\n\\t\\t\\tversion, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-agent-update.html\\\">Updating the Amazon ECS\\n\\t\\t\\t\\tContainer Agent</a> in the <i>Amazon Elastic Container Service Developer Guide</i>. If you're using an Amazon ECS-optimized Linux AMI,\\n\\t\\t\\tyour instance needs at least version 1.26.0-1 of the <code>ecs-init</code> package. If\\n\\t\\t\\tyour container instances are launched from version <code>20190301</code> or later, then\\n\\t\\t\\tthey contain the required versions of the container agent and <code>ecs-init</code>. For\\n\\t\\t\\tmore information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-optimized_AMI.html\\\">Amazon ECS-optimized Linux AMI</a>\\n\\t\\t\\tin the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\\n         <note>\\n            <p>For tasks that use the Fargate launch type, the task or service\\n\\t\\t\\t\\trequires the following platforms:</p>\\n            <ul>\\n               <li>\\n                  <p>Linux platform version <code>1.3.0</code> or later.</p>\\n               </li>\\n               <li>\\n                  <p>Windows platform version <code>1.0.0</code> or later.</p>\\n               </li>\\n            </ul>\\n         </note>\\n         <p>For more information about how to create a container dependency, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/example_task_definitions.html#example_task_definition-containerdependency\\\">Container dependency</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#ContainerImage\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"containerName\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the container.</p>\"\n                    }\n                },\n                \"imageDigest\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The container image digest.</p>\"\n                    }\n                },\n                \"image\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The container image. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The details about the container image a service revision uses. </p>\\n         <p>To ensure that all tasks in a service use the same container image, Amazon ECS\\n\\t\\t\\tresolves container image names and any image tags specified in the task definition to\\n\\t\\t\\tcontainer image digests. </p>\\n         <p>After the container image digest has been established, Amazon ECS uses the digest to\\n\\t\\t\\tstart any other desired tasks, and for any future service and service revision updates.\\n\\t\\t\\tThis leads to all tasks in a service always running identical container images,\\n\\t\\t\\tresulting in version consistency for your software. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/deployment-type-ecs.html#deployment-container-image-stability\\\">Container image resolution</a> in the Amazon ECS Developer Guide.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#ContainerImages\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#ContainerImage\"\n            }\n        },\n        \"com.amazonaws.ecs#ContainerInstance\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"containerInstanceArn\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the container instance. For more information about the ARN format,\\n\\t\\t\\tsee <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-account-settings.html#ecs-resource-ids\\\">Amazon Resource Name (ARN)</a> in the <i>Amazon ECS Developer Guide</i>.</p>\"\n                    }\n                },\n                \"ec2InstanceId\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the container instance. For Amazon EC2 instances, this value is the Amazon EC2\\n\\t\\t\\tinstance ID. For external instances, this value is the Amazon Web Services Systems Manager managed instance ID.</p>\"\n                    }\n                },\n                \"capacityProviderName\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The capacity provider that's associated with the container instance.</p>\"\n                    }\n                },\n                \"version\": {\n                    \"target\": \"com.amazonaws.ecs#Long\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The version counter for the container instance. Every time a container instance\\n\\t\\t\\texperiences a change that triggers a CloudWatch event, the version counter is\\n\\t\\t\\tincremented. If you're replicating your Amazon ECS container instance state with CloudWatch\\n\\t\\t\\tEvents, you can compare the version of a container instance reported by the Amazon ECS APIs\\n\\t\\t\\twith the version reported in CloudWatch Events for the container instance (inside the\\n\\t\\t\\t\\t<code>detail</code> object) to verify that the version in your event stream is\\n\\t\\t\\tcurrent.</p>\"\n                    }\n                },\n                \"versionInfo\": {\n                    \"target\": \"com.amazonaws.ecs#VersionInfo\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The version information for the Amazon ECS container agent and Docker daemon running on the\\n\\t\\t\\tcontainer instance.</p>\"\n                    }\n                },\n                \"remainingResources\": {\n                    \"target\": \"com.amazonaws.ecs#Resources\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>For CPU and memory resource types, this parameter describes the remaining CPU and\\n\\t\\t\\tmemory that wasn't already allocated to tasks and is therefore available for new tasks.\\n\\t\\t\\tFor port resource types, this parameter describes the ports that were reserved by the\\n\\t\\t\\tAmazon ECS container agent (at instance registration time) and any task containers that have\\n\\t\\t\\treserved port mappings on the host (with the <code>host</code> or <code>bridge</code>\\n\\t\\t\\tnetwork mode). Any port that's not specified here is available for new tasks.</p>\"\n                    }\n                },\n                \"registeredResources\": {\n                    \"target\": \"com.amazonaws.ecs#Resources\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>For CPU and memory resource types, this parameter describes the amount of each\\n\\t\\t\\tresource that was available on the container instance when the container agent\\n\\t\\t\\tregistered it with Amazon ECS. This value represents the total amount of CPU and memory that\\n\\t\\t\\tcan be allocated on this container instance to tasks. For port resource types, this\\n\\t\\t\\tparameter describes the ports that were reserved by the Amazon ECS container agent when it\\n\\t\\t\\tregistered the container instance with Amazon ECS.</p>\"\n                    }\n                },\n                \"status\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The status of the container instance. The valid values are <code>REGISTERING</code>,\\n\\t\\t\\t\\t<code>REGISTRATION_FAILED</code>, <code>ACTIVE</code>, <code>INACTIVE</code>,\\n\\t\\t\\t\\t<code>DEREGISTERING</code>, or <code>DRAINING</code>.</p>\\n         <p>If your account has opted in to the <code>awsvpcTrunking</code> account setting, then\\n\\t\\t\\tany newly registered container instance will transition to a <code>REGISTERING</code>\\n\\t\\t\\tstatus while the trunk elastic network interface is provisioned for the instance. If the\\n\\t\\t\\tregistration fails, the instance will transition to a <code>REGISTRATION_FAILED</code>\\n\\t\\t\\tstatus. You can describe the container instance and see the reason for failure in the\\n\\t\\t\\t\\t<code>statusReason</code> parameter. Once the container instance is terminated, the\\n\\t\\t\\tinstance transitions to a <code>DEREGISTERING</code> status while the trunk elastic\\n\\t\\t\\tnetwork interface is deprovisioned. The instance then transitions to an\\n\\t\\t\\t\\t<code>INACTIVE</code> status.</p>\\n         <p>The <code>ACTIVE</code> status indicates that the container instance can accept tasks.\\n\\t\\t\\tThe <code>DRAINING</code> indicates that new tasks aren't placed on the container\\n\\t\\t\\tinstance and any service tasks running on the container instance are removed if\\n\\t\\t\\tpossible. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/container-instance-draining.html\\\">Container instance draining</a> in the\\n\\t\\t\\t<i>Amazon Elastic Container Service Developer Guide</i>.</p>\"\n                    }\n                },\n                \"statusReason\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The reason that the container instance reached its current status.</p>\"\n                    }\n                },\n                \"agentConnected\": {\n                    \"target\": \"com.amazonaws.ecs#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>This parameter returns <code>true</code> if the agent is connected to Amazon ECS. An\\n\\t\\t\\tinstance with an agent that may be unhealthy or stopped return <code>false</code>. Only\\n\\t\\t\\tinstances connected to an agent can accept task placement requests.</p>\"\n                    }\n                },\n                \"runningTasksCount\": {\n                    \"target\": \"com.amazonaws.ecs#Integer\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The number of tasks on the container instance that have a desired status\\n\\t\\t\\t\\t(<code>desiredStatus</code>) of <code>RUNNING</code>.</p>\"\n                    }\n                },\n                \"pendingTasksCount\": {\n                    \"target\": \"com.amazonaws.ecs#Integer\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The number of tasks on the container instance that are in the <code>PENDING</code>\\n\\t\\t\\tstatus.</p>\"\n                    }\n                },\n                \"agentUpdateStatus\": {\n                    \"target\": \"com.amazonaws.ecs#AgentUpdateStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The status of the most recent agent update. If an update wasn't ever requested, this\\n\\t\\t\\tvalue is <code>NULL</code>.</p>\"\n                    }\n                },\n                \"attributes\": {\n                    \"target\": \"com.amazonaws.ecs#Attributes\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The attributes set for the container instance, either by the Amazon ECS container agent at\\n\\t\\t\\tinstance registration or manually with the <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_PutAttributes.html\\\">PutAttributes</a>\\n\\t\\t\\toperation.</p>\"\n                    }\n                },\n                \"registeredAt\": {\n                    \"target\": \"com.amazonaws.ecs#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Unix timestamp for the time when the container instance was registered.</p>\"\n                    }\n                },\n                \"attachments\": {\n                    \"target\": \"com.amazonaws.ecs#Attachments\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The resources attached to a container instance, such as an elastic network\\n\\t\\t\\tinterface.</p>\"\n                    }\n                },\n                \"tags\": {\n                    \"target\": \"com.amazonaws.ecs#Tags\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The metadata that you apply to the container instance to help you categorize and\\n\\t\\t\\torganize them. Each tag consists of a key and an optional value. You define both.</p>\\n         <p>The following basic restrictions apply to tags:</p>\\n         <ul>\\n            <li>\\n               <p>Maximum number of tags per resource - 50</p>\\n            </li>\\n            <li>\\n               <p>For each resource, each tag key must be unique, and each tag key can have only\\n                    one value.</p>\\n            </li>\\n            <li>\\n               <p>Maximum key length - 128 Unicode characters in UTF-8</p>\\n            </li>\\n            <li>\\n               <p>Maximum value length - 256 Unicode characters in UTF-8</p>\\n            </li>\\n            <li>\\n               <p>If your tagging schema is used across multiple services and resources,\\n                    remember that other services may have restrictions on allowed characters.\\n                    Generally allowed characters are: letters, numbers, and spaces representable in\\n                    UTF-8, and the following characters: + - = . _ : / @.</p>\\n            </li>\\n            <li>\\n               <p>Tag keys and values are case-sensitive.</p>\\n            </li>\\n            <li>\\n               <p>Do not use <code>aws:</code>, <code>AWS:</code>, or any upper or lowercase\\n                    combination of such as a prefix for either keys or values as it is reserved for\\n                    Amazon Web Services use. You cannot edit or delete tag keys or values with this prefix. Tags with\\n                    this prefix do not count against your tags per resource limit.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"healthStatus\": {\n                    \"target\": \"com.amazonaws.ecs#ContainerInstanceHealthStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An object representing the health status of the container instance.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>An Amazon EC2 or External instance that's running the Amazon ECS agent and has been registered\\n\\t\\t\\twith a cluster.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#ContainerInstanceField\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"TAGS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"TAGS\"\n                    }\n                },\n                \"CONTAINER_INSTANCE_HEALTH\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"CONTAINER_INSTANCE_HEALTH\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ecs#ContainerInstanceFieldList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#ContainerInstanceField\"\n            }\n        },\n        \"com.amazonaws.ecs#ContainerInstanceHealthStatus\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"overallStatus\": {\n                    \"target\": \"com.amazonaws.ecs#InstanceHealthCheckState\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The overall health status of the container instance. This is an aggregate status of\\n\\t\\t\\tall container instance health checks.</p>\"\n                    }\n                },\n                \"details\": {\n                    \"target\": \"com.amazonaws.ecs#InstanceHealthCheckResultList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An array of objects representing the details of the container instance health\\n\\t\\t\\tstatus.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>An object representing the health status of the container instance.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#ContainerInstanceStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ACTIVE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ACTIVE\"\n                    }\n                },\n                \"DRAINING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DRAINING\"\n                    }\n                },\n                \"REGISTERING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"REGISTERING\"\n                    }\n                },\n                \"DEREGISTERING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DEREGISTERING\"\n                    }\n                },\n                \"REGISTRATION_FAILED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"REGISTRATION_FAILED\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ecs#ContainerInstances\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#ContainerInstance\"\n            }\n        },\n        \"com.amazonaws.ecs#ContainerOverride\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"name\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the container that receives the override. This parameter is required if\\n\\t\\t\\tany override is specified.</p>\"\n                    }\n                },\n                \"command\": {\n                    \"target\": \"com.amazonaws.ecs#StringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The command to send to the container that overrides the default command from the\\n\\t\\t\\tDocker image or the task definition. You must also specify a container name.</p>\"\n                    }\n                },\n                \"environment\": {\n                    \"target\": \"com.amazonaws.ecs#EnvironmentVariables\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The environment variables to send to the container. You can add new environment\\n\\t\\t\\tvariables, which are added to the container at launch, or you can override the existing\\n\\t\\t\\tenvironment variables from the Docker image or the task definition. You must also\\n\\t\\t\\tspecify a container name.</p>\"\n                    }\n                },\n                \"environmentFiles\": {\n                    \"target\": \"com.amazonaws.ecs#EnvironmentFiles\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of files containing the environment variables to pass to a container, instead\\n\\t\\t\\tof the value from the container definition.</p>\"\n                    }\n                },\n                \"cpu\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedInteger\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of <code>cpu</code> units reserved for the container, instead of the\\n\\t\\t\\tdefault value from the task definition. You must also specify a container name.</p>\"\n                    }\n                },\n                \"memory\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedInteger\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The hard limit (in MiB) of memory to present to the container, instead of the default\\n\\t\\t\\tvalue from the task definition. If your container attempts to exceed the memory\\n\\t\\t\\tspecified here, the container is killed. You must also specify a container name.</p>\"\n                    }\n                },\n                \"memoryReservation\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedInteger\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The soft limit (in MiB) of memory to reserve for the container, instead of the default\\n\\t\\t\\tvalue from the task definition. You must also specify a container name.</p>\"\n                    }\n                },\n                \"resourceRequirements\": {\n                    \"target\": \"com.amazonaws.ecs#ResourceRequirements\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type and amount of a resource to assign to a container, instead of the default\\n\\t\\t\\tvalue from the task definition. The only supported resource is a GPU.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The overrides that are sent to a container. An empty container override can be passed\\n\\t\\t\\tin. An example of an empty container override is <code>{\\\"containerOverrides\\\": [ ]\\n\\t\\t\\t\\t}</code>. If a non-empty container override is specified, the <code>name</code>\\n\\t\\t\\tparameter must be included.</p>\\n         <p>You can use Secrets Manager or Amazon Web Services Systems Manager Parameter Store to store the\\n\\t\\t\\tsensitive data. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/secrets-envvar.html\\\">Retrieve secrets through\\n\\t\\t\\t\\tenvironment variables</a> in the Amazon ECS Developer Guide.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#ContainerOverrides\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#ContainerOverride\"\n            }\n        },\n        \"com.amazonaws.ecs#ContainerRestartPolicy\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"enabled\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedBoolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies whether a restart policy is enabled for the container.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ignoredExitCodes\": {\n                    \"target\": \"com.amazonaws.ecs#IntegerList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of exit codes that Amazon ECS will ignore and not attempt a restart on. You can\\n\\t\\t\\tspecify a maximum of 50 container exit codes. By default, Amazon ECS does not ignore any exit\\n\\t\\t\\tcodes.</p>\"\n                    }\n                },\n                \"restartAttemptPeriod\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedInteger\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A period of time (in seconds) that the container must run for before a restart can be\\n\\t\\t\\tattempted. A container can be restarted only once every\\n\\t\\t\\t\\t<code>restartAttemptPeriod</code> seconds. If a container isn't able to run for this\\n\\t\\t\\ttime period and exits early, it will not be restarted. You can set a minimum\\n\\t\\t\\t\\t<code>restartAttemptPeriod</code> of 60 seconds and a maximum\\n\\t\\t\\t\\t<code>restartAttemptPeriod</code> of 1800 seconds. By default, a container must run\\n\\t\\t\\tfor 300 seconds before it can be restarted.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>You can enable a restart policy for each container defined in your task definition, to\\n\\t\\t\\tovercome transient failures faster and maintain task availability. When you enable a\\n\\t\\t\\trestart policy for a container, Amazon ECS can restart the container if it exits, without\\n\\t\\t\\tneeding to replace the task. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/container-restart-policy.html\\\">Restart\\n\\t\\t\\t\\tindividual containers in Amazon ECS tasks with container restart policies</a> in the\\n\\t\\t\\t<i>Amazon Elastic Container Service Developer Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#ContainerStateChange\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"containerName\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the container.</p>\"\n                    }\n                },\n                \"imageDigest\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The container image SHA 256 digest.</p>\"\n                    }\n                },\n                \"runtimeId\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the Docker container.</p>\"\n                    }\n                },\n                \"exitCode\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedInteger\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The exit code for the container, if the state change is a result of the container\\n\\t\\t\\texiting.</p>\"\n                    }\n                },\n                \"networkBindings\": {\n                    \"target\": \"com.amazonaws.ecs#NetworkBindings\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Any network bindings that are associated with the container.</p>\"\n                    }\n                },\n                \"reason\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The reason for the state change.</p>\"\n                    }\n                },\n                \"status\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The status of the container.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>An object that represents a change in state for a container.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#ContainerStateChanges\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#ContainerStateChange\"\n            }\n        },\n        \"com.amazonaws.ecs#Containers\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#Container\"\n            }\n        },\n        \"com.amazonaws.ecs#CpuManufacturer\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"INTEL\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"intel\"\n                    }\n                },\n                \"AMD\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"amd\"\n                    }\n                },\n                \"AMAZON_WEB_SERVICES\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"amazon-web-services\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ecs#CpuManufacturerSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#CpuManufacturer\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ecs#CreateCapacityProvider\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ecs#CreateCapacityProviderRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ecs#CreateCapacityProviderResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.ecs#ClientException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ClusterNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ServerException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#UnsupportedFeatureException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#UpdateInProgressException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates a capacity provider. Capacity providers are associated with a cluster and are used in capacity provider strategies to facilitate cluster auto scaling. You can create capacity providers for Amazon ECS Managed Instances and EC2 instances. Fargate has the predefined <code>FARGATE</code> and <code>FARGATE_SPOT</code> capacity providers.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To create a capacity provider \",\n                        \"documentation\": \"This example creates a capacity provider that uses the specified Auto Scaling group MyASG and has managed scaling and manager termination protection enabled. \",\n                        \"input\": {\n                            \"name\": \"MyCapacityProvider\",\n                            \"autoScalingGroupProvider\": {\n                                \"autoScalingGroupArn\": \"arn:aws:autoscaling:us-east-1:123456789012:autoScalingGroup:57ffcb94-11f0-4d6d-bf60-3bac5EXAMPLE:autoScalingGroupName/MyASG\",\n                                \"managedScaling\": {\n                                    \"status\": \"ENABLED\",\n                                    \"targetCapacity\": 100\n                                },\n                                \"managedTerminationProtection\": \"ENABLED\"\n                            }\n                        },\n                        \"output\": {\n                            \"capacityProvider\": {\n                                \"capacityProviderArn\": \"arn:aws:ecs:us-east-1:123456789012:capacity-provider/MyCapacityProvider\",\n                                \"name\": \"MyCapacityProvider\",\n                                \"status\": \"ACTIVE\",\n                                \"autoScalingGroupProvider\": {\n                                    \"autoScalingGroupArn\": \"arn:aws:autoscaling:us-east-1:132456789012:autoScalingGroup:57ffcb94-11f0-4d6d-bf60-3bac5EXAMPLE:autoScalingGroupName/MyASG\",\n                                    \"managedScaling\": {\n                                        \"status\": \"ENABLED\",\n                                        \"targetCapacity\": 100,\n                                        \"minimumScalingStepSize\": 1,\n                                        \"maximumScalingStepSize\": 10000,\n                                        \"instanceWarmupPeriod\": 300\n                                    },\n                                    \"managedTerminationProtection\": \"ENABLED\"\n                                },\n                                \"tags\": []\n                            }\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ecs#CreateCapacityProviderRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"name\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the capacity provider. Up to 255 characters are allowed. They include\\n\\t\\t\\tletters (both upper and lowercase letters), numbers, underscores (_), and hyphens (-).\\n\\t\\t\\tThe name can't be prefixed with \\\"<code>aws</code>\\\", \\\"<code>ecs</code>\\\", or\\n\\t\\t\\t\\t\\\"<code>fargate</code>\\\".</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"cluster\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the cluster to associate with the capacity provider. When you create a capacity provider with Amazon ECS Managed Instances, it becomes available only within the specified cluster.</p>\"\n                    }\n                },\n                \"autoScalingGroupProvider\": {\n                    \"target\": \"com.amazonaws.ecs#AutoScalingGroupProvider\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The details of the Auto Scaling group for the capacity provider.</p>\"\n                    }\n                },\n                \"managedInstancesProvider\": {\n                    \"target\": \"com.amazonaws.ecs#CreateManagedInstancesProviderConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The configuration for the Amazon ECS Managed Instances provider. This configuration specifies how Amazon ECS manages Amazon EC2 instances on your behalf, including the infrastructure role, instance launch template, and tag propagation settings.</p>\"\n                    }\n                },\n                \"tags\": {\n                    \"target\": \"com.amazonaws.ecs#Tags\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The metadata that you apply to the capacity provider to categorize and organize them\\n\\t\\t\\tmore conveniently. Each tag consists of a key and an optional value. You define both of\\n\\t\\t\\tthem.</p>\\n         <p>The following basic restrictions apply to tags:</p>\\n         <ul>\\n            <li>\\n               <p>Maximum number of tags per resource - 50</p>\\n            </li>\\n            <li>\\n               <p>For each resource, each tag key must be unique, and each tag key can have only\\n                    one value.</p>\\n            </li>\\n            <li>\\n               <p>Maximum key length - 128 Unicode characters in UTF-8</p>\\n            </li>\\n            <li>\\n               <p>Maximum value length - 256 Unicode characters in UTF-8</p>\\n            </li>\\n            <li>\\n               <p>If your tagging schema is used across multiple services and resources,\\n                    remember that other services may have restrictions on allowed characters.\\n                    Generally allowed characters are: letters, numbers, and spaces representable in\\n                    UTF-8, and the following characters: + - = . _ : / @.</p>\\n            </li>\\n            <li>\\n               <p>Tag keys and values are case-sensitive.</p>\\n            </li>\\n            <li>\\n               <p>Do not use <code>aws:</code>, <code>AWS:</code>, or any upper or lowercase\\n                    combination of such as a prefix for either keys or values as it is reserved for\\n                    Amazon Web Services use. You cannot edit or delete tag keys or values with this prefix. Tags with\\n                    this prefix do not count against your tags per resource limit.</p>\\n            </li>\\n         </ul>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ecs#CreateCapacityProviderResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"capacityProvider\": {\n                    \"target\": \"com.amazonaws.ecs#CapacityProvider\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The full description of the new capacity provider.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ecs#CreateCluster\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ecs#CreateClusterRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ecs#CreateClusterResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.ecs#ClientException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#NamespaceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ServerException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates a new Amazon ECS cluster. By default, your account receives a <code>default</code>\\n\\t\\t\\tcluster when you launch your first container instance. However, you can create your own\\n\\t\\t\\tcluster with a unique name.</p>\\n         <note>\\n            <p>When you call the <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_CreateCluster.html\\\">CreateCluster</a>\\n\\t\\t\\t\\tAPI operation, Amazon ECS attempts to create the Amazon ECS service-linked role for your\\n\\t\\t\\t\\taccount. This is so that it can manage required resources in other Amazon Web Services services on\\n\\t\\t\\t\\tyour behalf. However, if the user that makes the call doesn't have permissions to\\n\\t\\t\\t\\tcreate the service-linked role, it isn't created. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/using-service-linked-roles.html\\\">Using\\n\\t\\t\\t\\t\\tservice-linked roles for Amazon ECS</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\\n         </note>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To create a new cluster\",\n                        \"documentation\": \"This example creates a cluster in your default region.\",\n                        \"input\": {\n                            \"clusterName\": \"my_cluster\"\n                        },\n                        \"output\": {\n                            \"cluster\": {\n                                \"status\": \"ACTIVE\",\n                                \"clusterName\": \"my_cluster\",\n                                \"registeredContainerInstancesCount\": 0,\n                                \"pendingTasksCount\": 0,\n                                \"runningTasksCount\": 0,\n                                \"activeServicesCount\": 0,\n                                \"clusterArn\": \"arn:aws:ecs:us-east-1:012345678910:cluster/my_cluster\"\n                            }\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ecs#CreateClusterRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"clusterName\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of your cluster. If you don't specify a name for your cluster, you create a\\n\\t\\t\\tcluster that's named <code>default</code>. Up to 255 letters (uppercase and lowercase), numbers, underscores, and hyphens are allowed. </p>\"\n                    }\n                },\n                \"tags\": {\n                    \"target\": \"com.amazonaws.ecs#Tags\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The metadata that you apply to the cluster to help you categorize and organize them.\\n\\t\\t\\tEach tag consists of a key and an optional value. You define both.</p>\\n         <p>The following basic restrictions apply to tags:</p>\\n         <ul>\\n            <li>\\n               <p>Maximum number of tags per resource - 50</p>\\n            </li>\\n            <li>\\n               <p>For each resource, each tag key must be unique, and each tag key can have only\\n                    one value.</p>\\n            </li>\\n            <li>\\n               <p>Maximum key length - 128 Unicode characters in UTF-8</p>\\n            </li>\\n            <li>\\n               <p>Maximum value length - 256 Unicode characters in UTF-8</p>\\n            </li>\\n            <li>\\n               <p>If your tagging schema is used across multiple services and resources,\\n                    remember that other services may have restrictions on allowed characters.\\n                    Generally allowed characters are: letters, numbers, and spaces representable in\\n                    UTF-8, and the following characters: + - = . _ : / @.</p>\\n            </li>\\n            <li>\\n               <p>Tag keys and values are case-sensitive.</p>\\n            </li>\\n            <li>\\n               <p>Do not use <code>aws:</code>, <code>AWS:</code>, or any upper or lowercase\\n                    combination of such as a prefix for either keys or values as it is reserved for\\n                    Amazon Web Services use. You cannot edit or delete tag keys or values with this prefix. Tags with\\n                    this prefix do not count against your tags per resource limit.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"settings\": {\n                    \"target\": \"com.amazonaws.ecs#ClusterSettings\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The setting to use when creating a cluster. This parameter is used to turn on CloudWatch\\n\\t\\t\\tContainer Insights for a cluster. If this value is specified, it overrides the\\n\\t\\t\\t\\t<code>containerInsights</code> value set with <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_PutAccountSetting.html\\\">PutAccountSetting</a> or <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_PutAccountSettingDefault.html\\\">PutAccountSettingDefault</a>.</p>\"\n                    }\n                },\n                \"configuration\": {\n                    \"target\": \"com.amazonaws.ecs#ClusterConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>execute</code> command configuration for the cluster.</p>\"\n                    }\n                },\n                \"capacityProviders\": {\n                    \"target\": \"com.amazonaws.ecs#StringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The short name of one or more capacity providers to associate with the cluster. A\\n\\t\\t\\tcapacity provider must be associated with a cluster before it can be included as part of\\n\\t\\t\\tthe default capacity provider strategy of the cluster or used in a capacity provider\\n\\t\\t\\tstrategy when calling the <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_CreateService.html\\\">CreateService</a> or\\n\\t\\t\\t\\t<a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_RunTask.html\\\">RunTask</a> actions.</p>\\n         <p>If specifying a capacity provider that uses an Auto Scaling group, the capacity\\n\\t\\t\\tprovider must be created but not associated with another cluster. New Auto Scaling group\\n\\t\\t\\tcapacity providers can be created with the <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_CreateCapacityProvider.html\\\">CreateCapacityProvider</a> API operation.</p>\\n         <p>To use a Fargate capacity provider, specify either the <code>FARGATE</code> or\\n\\t\\t\\t\\t<code>FARGATE_SPOT</code> capacity providers. The Fargate capacity providers are\\n\\t\\t\\tavailable to all accounts and only need to be associated with a cluster to be\\n\\t\\t\\tused.</p>\\n         <p>The <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_PutCapacityProvider.html\\\">PutCapacityProvider</a> API operation is used to update the list of available\\n\\t\\t\\tcapacity providers for a cluster after the cluster is created.</p>\"\n                    }\n                },\n                \"defaultCapacityProviderStrategy\": {\n                    \"target\": \"com.amazonaws.ecs#CapacityProviderStrategy\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The capacity provider strategy to set as the default for the cluster. After a default\\n\\t\\t\\tcapacity provider strategy is set for a cluster, when you call the <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_CreateService.html\\\">CreateService</a> or <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_RunTask.html\\\">RunTask</a> APIs with no\\n\\t\\t\\tcapacity provider strategy or launch type specified, the default capacity provider\\n\\t\\t\\tstrategy for the cluster is used.</p>\\n         <p>If a default capacity provider strategy isn't defined for a cluster when it was\\n\\t\\t\\tcreated, it can be defined later with the <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_PutClusterCapacityProviders.html\\\">PutClusterCapacityProviders</a> API operation.</p>\"\n                    }\n                },\n                \"serviceConnectDefaults\": {\n                    \"target\": \"com.amazonaws.ecs#ClusterServiceConnectDefaultsRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter to set a default Service Connect namespace. After you set a default \\n\\tService Connect namespace, any new services with Service Connect turned on that are created in the cluster are added as\\n\\tclient services in the namespace. This setting only applies to new services that set the <code>enabled</code> parameter to\\n\\t<code>true</code> in the <code>ServiceConnectConfiguration</code>.\\n\\tYou can set the namespace of each service individually in the <code>ServiceConnectConfiguration</code> to override this default\\n\\tparameter.</p>\\n         <p>Tasks that run in a namespace can use short names to connect\\n\\tto services in the namespace. Tasks can connect to services across all of the clusters in the namespace.\\n\\tTasks connect through a managed proxy container\\n\\tthat collects logs and metrics for increased visibility.\\n\\tOnly the tasks that Amazon ECS services create are supported with Service Connect.\\n\\tFor more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-connect.html\\\">Service Connect</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ecs#CreateClusterResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"cluster\": {\n                    \"target\": \"com.amazonaws.ecs#Cluster\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The full description of your new cluster.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ecs#CreateManagedInstancesProviderConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"infrastructureRoleArn\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the infrastructure role that Amazon ECS uses to manage instances on your behalf. This role must have permissions to launch, terminate, and manage Amazon EC2 instances, as well as access to other Amazon Web Services services required for Amazon ECS Managed Instances functionality.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/infrastructure_IAM_role.html\\\">Amazon ECS infrastructure IAM role</a> in the <i>Amazon ECS Developer Guide</i>.\\n\\t\\t</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"instanceLaunchTemplate\": {\n                    \"target\": \"com.amazonaws.ecs#InstanceLaunchTemplate\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The launch template configuration that specifies how Amazon ECS should launch Amazon EC2 instances. This includes the instance profile, network configuration, storage settings, and instance requirements for attribute-based instance type selection.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-launch-templates.html\\\">Store instance launch parameters in Amazon EC2 launch templates</a> in the <i>Amazon EC2 User Guide</i>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"propagateTags\": {\n                    \"target\": \"com.amazonaws.ecs#PropagateMITags\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies whether to propagate tags from the capacity provider to the Amazon ECS Managed Instances. When enabled, tags applied to the capacity provider are automatically applied to all instances launched by this provider.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The configuration for creating a Amazon ECS Managed Instances provider. This specifies how Amazon ECS should manage Amazon EC2 instances, including the infrastructure role, instance launch template, and whether to propagate tags from the capacity provider to the instances.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#CreateService\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ecs#CreateServiceRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ecs#CreateServiceResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.ecs#AccessDeniedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ClientException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ClusterNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#NamespaceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#PlatformTaskDefinitionIncompatibilityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#PlatformUnknownException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ServerException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#UnsupportedFeatureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Runs and maintains your desired number of tasks from a specified task definition. If\\n\\t\\t\\tthe number of tasks running in a service drops below the <code>desiredCount</code>,\\n\\t\\t\\tAmazon ECS runs another copy of the task in the specified cluster. To update an existing\\n\\t\\t\\tservice, use <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_UpdateService.html\\\">UpdateService</a>.</p>\\n         <note>\\n            <p>On March 21, 2024, a change was made to resolve the task definition revision before authorization. When a task definition revision is not specified, authorization will occur using the latest revision of a task definition.</p>\\n         </note>\\n         <note>\\n            <p>Amazon Elastic Inference (EI) is no longer available to customers.</p>\\n         </note>\\n         <p>In addition to maintaining the desired count of tasks in your service, you can\\n\\t\\t\\toptionally run your service behind one or more load balancers. The load balancers\\n\\t\\t\\tdistribute traffic across the tasks that are associated with the service. For more\\n\\t\\t\\tinformation, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-load-balancing.html\\\">Service load balancing</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\\n         <p>You can attach Amazon EBS volumes to Amazon ECS tasks by configuring the volume when creating or\\n\\t\\t\\tupdating a service. <code>volumeConfigurations</code> is only supported for REPLICA\\n\\t\\t\\tservice and not DAEMON service. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ebs-volumes.html#ebs-volume-types\\\">Amazon EBS volumes</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\\n         <p>Tasks for services that don't use a load balancer are considered healthy if they're in\\n\\t\\t\\tthe <code>RUNNING</code> state. Tasks for services that use a load balancer are\\n\\t\\t\\tconsidered healthy if they're in the <code>RUNNING</code> state and are reported as\\n\\t\\t\\thealthy by the load balancer.</p>\\n         <p>There are two service scheduler strategies available:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>REPLICA</code> - The replica scheduling strategy places and\\n\\t\\t\\t\\t\\tmaintains your desired number of tasks across your cluster. By default, the\\n\\t\\t\\t\\t\\tservice scheduler spreads tasks across Availability Zones. You can use task\\n\\t\\t\\t\\t\\tplacement strategies and constraints to customize task placement decisions. For\\n\\t\\t\\t\\t\\tmore information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs_services.html\\\">Service scheduler concepts</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>DAEMON</code> - The daemon scheduling strategy deploys exactly one\\n\\t\\t\\t\\t\\ttask on each active container instance that meets all of the task placement\\n\\t\\t\\t\\t\\tconstraints that you specify in your cluster. The service scheduler also\\n\\t\\t\\t\\t\\tevaluates the task placement constraints for running tasks. It also stops tasks\\n\\t\\t\\t\\t\\tthat don't meet the placement constraints. When using this strategy, you don't\\n\\t\\t\\t\\t\\tneed to specify a desired number of tasks, a task placement strategy, or use\\n\\t\\t\\t\\t\\tService Auto Scaling policies. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs_services.html\\\">Amazon ECS services</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\\n            </li>\\n         </ul>\\n         <p>The deployment controller is the mechanism that determines how tasks are deployed for\\n\\t\\t\\tyour service. The valid options are:</p>\\n         <ul>\\n            <li>\\n               <p>ECS</p>\\n               <p> When you create a service which uses the <code>ECS</code> deployment controller, you can\\n\\t\\t\\t\\t\\tchoose between the following deployment strategies (which you can set in the\\n\\t\\t\\t\\t\\t\\t“<code>strategy</code>” field in “<code>deploymentConfiguration</code>”):\\n\\t\\t\\t\\t\\t:</p>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <code>ROLLING</code>: When you create a service which uses the <i>rolling update</i>\\n\\t\\t\\t\\t\\t\\t\\t(<code>ROLLING</code>) deployment strategy, the Amazon ECS service scheduler replaces the\\n\\t\\t\\t\\t\\t\\t\\tcurrently running tasks with new tasks. The number of tasks that Amazon ECS adds or\\n\\t\\t\\t\\t\\t\\t\\tremoves from the service during a rolling update is controlled by the service\\n\\t\\t\\t\\t\\t\\t\\tdeployment configuration. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/deployment-type-ecs.html\\\">Deploy Amazon ECS services by replacing tasks</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\\n                     <p>Rolling update deployments are best suited for the following scenarios:</p>\\n                     <ul>\\n                        <li>\\n                           <p>Gradual service updates: You need to\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tupdate your service incrementally without taking the entire service\\n\\t\\t\\t\\t\\t\\t\\t\\t\\toffline at once.</p>\\n                        </li>\\n                        <li>\\n                           <p>Limited resource requirements: You\\n\\t\\t\\t\\t\\t\\t\\t\\t\\twant to avoid the additional resource costs of running two complete\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tenvironments simultaneously (as required by blue/green\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tdeployments).</p>\\n                        </li>\\n                        <li>\\n                           <p>Acceptable deployment time: Your\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tapplication can tolerate a longer deployment process, as rolling updates\\n\\t\\t\\t\\t\\t\\t\\t\\t\\treplace tasks one by one.</p>\\n                        </li>\\n                        <li>\\n                           <p>No need for instant roll back: Your\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tservice can tolerate a rollback process that takes minutes rather than\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tseconds.</p>\\n                        </li>\\n                        <li>\\n                           <p>Simple deployment process: You prefer\\n\\t\\t\\t\\t\\t\\t\\t\\t\\ta straightforward deployment approach without the complexity of managing\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tmultiple environments, target groups, and listeners.</p>\\n                        </li>\\n                        <li>\\n                           <p>No load balancer requirement: Your\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tservice doesn't use or require a load balancer, Application Load Balancer, Network Load Balancer, or Service Connect (which are required\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tfor blue/green deployments).</p>\\n                        </li>\\n                        <li>\\n                           <p>Stateful applications: Your\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tapplication maintains state that makes it difficult to run two parallel\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tenvironments.</p>\\n                        </li>\\n                        <li>\\n                           <p>Cost sensitivity: You want to\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tminimize deployment costs by not running duplicate environments during\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tdeployment.</p>\\n                        </li>\\n                     </ul>\\n                     <p>Rolling updates are the default deployment strategy for services and provide a\\n\\t\\t\\t\\t\\t\\t\\tbalance between deployment safety and resource efficiency for many common\\n\\t\\t\\t\\t\\t\\t\\tapplication scenarios.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <code>BLUE_GREEN</code>: A <i>blue/green</i> deployment strategy (<code>BLUE_GREEN</code>) is a release methodology that reduces downtime and\\n\\t\\t\\t\\t\\t\\t\\trisk by running two identical production environments called blue and green.\\n\\t\\t\\t\\t\\t\\t\\tWith Amazon ECS blue/green deployments, you can validate new service revisions before\\n\\t\\t\\t\\t\\t\\t\\tdirecting production traffic to them. This approach provides a safer way to\\n\\t\\t\\t\\t\\t\\t\\tdeploy changes with the ability to quickly roll back if needed. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/deployment-type-blue-green.html\\\">Amazon ECS blue/green deployments</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\\n                     <p>Amazon ECS blue/green deployments are best suited for the following scenarios:</p>\\n                     <ul>\\n                        <li>\\n                           <p>Service validation: When you need to\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tvalidate new service revisions before directing production traffic to\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tthem</p>\\n                        </li>\\n                        <li>\\n                           <p>Zero downtime: When your service\\n\\t\\t\\t\\t\\t\\t\\t\\t\\trequires zero-downtime deployments</p>\\n                        </li>\\n                        <li>\\n                           <p>Instant roll back: When you\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tneed the ability to quickly roll back if issues are detected</p>\\n                        </li>\\n                        <li>\\n                           <p>Load balancer requirement: When your\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tservice uses Application Load Balancer, Network Load Balancer, or Service Connect</p>\\n                        </li>\\n                     </ul>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <p>External</p>\\n               <p>Use a third-party deployment controller.</p>\\n            </li>\\n            <li>\\n               <p>Blue/green deployment (powered by CodeDeploy)</p>\\n               <p>CodeDeploy installs an updated version of the application as a new replacement task\\n\\t\\t\\t\\t\\tset and reroutes production traffic from the original application task set to\\n\\t\\t\\t\\t\\tthe replacement task set. The original task set is terminated after a successful\\n\\t\\t\\t\\t\\tdeployment. Use this deployment controller to verify a new deployment of a service\\n\\t\\t\\t\\t\\tbefore sending production traffic to it.</p>\\n            </li>\\n         </ul>\\n         <p>When creating a service that uses the <code>EXTERNAL</code> deployment controller, you\\n\\t\\t\\tcan specify only parameters that aren't controlled at the task set level. The only\\n\\t\\t\\trequired parameter is the service name. You control your services using the <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_CreateTaskSet.html\\\">CreateTaskSet</a>. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/deployment-types.html\\\">Amazon ECS deployment types</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\\n         <p>When the service scheduler launches new tasks, it determines task placement. For\\n\\t\\t\\tinformation about task placement and task placement strategies, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-placement.html\\\">Amazon ECS\\n\\t\\t\\t\\ttask placement</a> in the <i>Amazon Elastic Container Service Developer Guide</i>\\n         </p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To create a new service\",\n                        \"documentation\": \"This example creates a service in your default region called ``ecs-simple-service``. The service uses the ``hello_world`` task definition and it maintains 10 copies of that task.\",\n                        \"input\": {\n                            \"serviceName\": \"ecs-simple-service\",\n                            \"taskDefinition\": \"hello_world\",\n                            \"desiredCount\": 10\n                        },\n                        \"output\": {\n                            \"service\": {\n                                \"clusterArn\": \"arn:aws:ecs:us-east-1:012345678910:cluster/default\",\n                                \"createdAt\": \"2016-08-29T16:13:47.298Z\",\n                                \"deploymentConfiguration\": {\n                                    \"maximumPercent\": 200,\n                                    \"minimumHealthyPercent\": 100\n                                },\n                                \"deployments\": [\n                                    {\n                                        \"createdAt\": \"2016-08-29T16:13:47.298Z\",\n                                        \"desiredCount\": 10,\n                                        \"id\": \"ecs-svc/9223370564342348388\",\n                                        \"pendingCount\": 0,\n                                        \"runningCount\": 0,\n                                        \"status\": \"PRIMARY\",\n                                        \"taskDefinition\": \"arn:aws:ecs:us-east-1:012345678910:task-definition/hello_world:6\",\n                                        \"updatedAt\": \"2016-08-29T16:13:47.298Z\"\n                                    },\n                                    {\n                                        \"createdAt\": \"2016-08-29T15:52:44.481Z\",\n                                        \"desiredCount\": 0,\n                                        \"id\": \"ecs-svc/9223370564343611322\",\n                                        \"pendingCount\": 0,\n                                        \"runningCount\": 0,\n                                        \"status\": \"ACTIVE\",\n                                        \"taskDefinition\": \"arn:aws:ecs:us-east-1:012345678910:task-definition/hello_world:6\",\n                                        \"updatedAt\": \"2016-08-29T16:11:38.941Z\"\n                                    }\n                                ],\n                                \"desiredCount\": 10,\n                                \"events\": [],\n                                \"loadBalancers\": [],\n                                \"pendingCount\": 0,\n                                \"runningCount\": 0,\n                                \"serviceArn\": \"arn:aws:ecs:us-east-1:012345678910:service/default/ecs-simple-service\",\n                                \"serviceName\": \"ecs-simple-service\",\n                                \"status\": \"ACTIVE\",\n                                \"taskDefinition\": \"arn:aws:ecs:us-east-1:012345678910:task-definition/default/hello_world:6\"\n                            }\n                        }\n                    },\n                    {\n                        \"title\": \"To create a new service behind a load balancer\",\n                        \"documentation\": \"This example creates a service in your default region called ``ecs-simple-service-elb``. The service uses the ``ecs-demo`` task definition and it maintains 10 copies of that task. You must reference an existing load balancer in the same region by its name.\",\n                        \"input\": {\n                            \"loadBalancers\": [\n                                {\n                                    \"containerName\": \"simple-app\",\n                                    \"containerPort\": 80,\n                                    \"loadBalancerName\": \"EC2Contai-EcsElast-15DCDAURT3ZO2\"\n                                }\n                            ],\n                            \"serviceName\": \"ecs-simple-service-elb\",\n                            \"role\": \"ecsServiceRole\",\n                            \"taskDefinition\": \"console-sample-app-static\",\n                            \"desiredCount\": 10\n                        },\n                        \"output\": {\n                            \"service\": {\n                                \"clusterArn\": \"arn:aws:ecs:us-east-1:012345678910:cluster/default\",\n                                \"createdAt\": \"2016-08-29T16:02:54.884Z\",\n                                \"deploymentConfiguration\": {\n                                    \"maximumPercent\": 200,\n                                    \"minimumHealthyPercent\": 100\n                                },\n                                \"deployments\": [\n                                    {\n                                        \"createdAt\": \"2016-08-29T16:02:54.884Z\",\n                                        \"desiredCount\": 10,\n                                        \"id\": \"ecs-svc/9223370564343000923\",\n                                        \"pendingCount\": 0,\n                                        \"runningCount\": 0,\n                                        \"status\": \"PRIMARY\",\n                                        \"taskDefinition\": \"arn:aws:ecs:us-east-1:012345678910:task-definition/console-sample-app-static:6\",\n                                        \"updatedAt\": \"2016-08-29T16:02:54.884Z\"\n                                    }\n                                ],\n                                \"desiredCount\": 10,\n                                \"events\": [],\n                                \"loadBalancers\": [\n                                    {\n                                        \"containerName\": \"simple-app\",\n                                        \"containerPort\": 80,\n                                        \"loadBalancerName\": \"EC2Contai-EcsElast-15DCDAURT3ZO2\"\n                                    }\n                                ],\n                                \"pendingCount\": 0,\n                                \"roleArn\": \"arn:aws:iam::012345678910:role/ecsServiceRole\",\n                                \"runningCount\": 0,\n                                \"serviceArn\": \"arn:aws:ecs:us-east-1:012345678910:service/default/ecs-simple-service-elb\",\n                                \"serviceName\": \"ecs-simple-service-elb\",\n                                \"status\": \"ACTIVE\",\n                                \"taskDefinition\": \"arn:aws:ecs:us-east-1:012345678910:task-definition/default/console-sample-app-static:6\"\n                            }\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ecs#CreateServiceRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"cluster\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The short name or full Amazon Resource Name (ARN) of the cluster that you run your service on.\\n\\t\\t\\tIf you do not specify a cluster, the default cluster is assumed.</p>\"\n                    }\n                },\n                \"serviceName\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of your service. Up to 255 letters (uppercase and lowercase), numbers, underscores, and hyphens are allowed. Service names must be unique within\\n\\t\\t\\ta cluster, but you can have similarly named services in multiple clusters within a\\n\\t\\t\\tRegion or across multiple Regions.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"taskDefinition\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>family</code> and <code>revision</code> (<code>family:revision</code>) or\\n\\t\\t\\tfull ARN of the task definition to run in your service. If a <code>revision</code>\\n\\t\\t\\tisn't specified, the latest <code>ACTIVE</code> revision is used.</p>\\n         <p>A task definition must be specified if the service uses either the <code>ECS</code> or\\n\\t\\t\\t\\t<code>CODE_DEPLOY</code> deployment controllers.</p>\\n         <p>For more information about deployment types, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/deployment-types.html\\\">Amazon ECS deployment\\n\\t\\t\\t\\ttypes</a>.</p>\"\n                    }\n                },\n                \"availabilityZoneRebalancing\": {\n                    \"target\": \"com.amazonaws.ecs#AvailabilityZoneRebalancing\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether to use Availability Zone rebalancing for the service.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-rebalancing.html\\\">Balancing an Amazon ECS service across Availability Zones</a> in\\n\\t\\t\\tthe <i>\\n               <i>Amazon Elastic Container Service Developer Guide</i>\\n            </i>.</p>\\n         <p>The default behavior of <code>AvailabilityZoneRebalancing</code> differs between create and update requests:</p>\\n         <ul>\\n            <li>\\n               <p>For create service requests, when no value is specified for <code>AvailabilityZoneRebalancing</code>, Amazon ECS defaults the value to <code>ENABLED</code>.</p>\\n            </li>\\n            <li>\\n               <p>For update service requests, when no value is specified for <code>AvailabilityZoneRebalancing</code>, Amazon ECS defaults to the existing service’s <code>AvailabilityZoneRebalancing</code> value. If the service never had an <code>AvailabilityZoneRebalancing</code> value set, Amazon ECS treats this as <code>DISABLED</code>.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"loadBalancers\": {\n                    \"target\": \"com.amazonaws.ecs#LoadBalancers\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A load balancer object representing the load balancers to use with your service. For\\n\\t\\t\\tmore information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-load-balancing.html\\\">Service load balancing</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\\n         <p>If the service uses the <code>ECS</code> deployment controller and\\n\\t\\t\\tusing either an Application Load Balancer or Network Load Balancer, you must specify one or more target group ARNs to attach\\n\\t\\t\\tto the service. The service-linked role is required for services that use multiple\\n\\t\\t\\ttarget groups. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/using-service-linked-roles.html\\\">Using service-linked roles for Amazon ECS</a> in the\\n\\t\\t\\t<i>Amazon Elastic Container Service Developer Guide</i>.</p>\\n         <p>If the service uses the <code>CODE_DEPLOY</code> deployment controller, the service is\\n\\t\\t\\trequired to use either an Application Load Balancer or Network Load Balancer. When creating an CodeDeploy deployment group, you\\n\\t\\t\\tspecify two target groups (referred to as a <code>targetGroupPair</code>). During a\\n\\t\\t\\tdeployment, CodeDeploy determines which task set in your service has the status\\n\\t\\t\\t\\t<code>PRIMARY</code>, and it associates one target group with it. Then, it also\\n\\t\\t\\tassociates the other target group with the replacement task set. The load balancer can\\n\\t\\t\\talso have up to two listeners: a required listener for production traffic and an\\n\\t\\t\\toptional listener that you can use to perform validation tests with Lambda functions\\n\\t\\t\\tbefore routing production traffic to it.</p>\\n         <p>If you use the <code>CODE_DEPLOY</code> deployment controller, these values can be\\n\\t\\t\\tchanged when updating the service.</p>\\n         <p>For Application Load Balancers and Network Load Balancers, this object must contain the load balancer target group ARN,\\n\\t\\t\\tthe container name, and the container port to access from the load balancer. The\\n\\t\\t\\tcontainer name must be as it appears in a container definition. The load balancer name\\n\\t\\t\\tparameter must be omitted. When a task from this service is placed on a container\\n\\t\\t\\tinstance, the container instance and port combination is registered as a target in the\\n\\t\\t\\ttarget group that's specified here.</p>\\n         <p>For Classic Load Balancers, this object must contain the load balancer name, the container name , and\\n\\t\\t\\tthe container port to access from the load balancer. The container name must be as it\\n\\t\\t\\tappears in a container definition. The target group ARN parameter must be omitted.\\n\\t\\t\\tWhen a task from this service is placed on a container instance, the container instance\\n\\t\\t\\tis registered with the load balancer that's specified here.</p>\\n         <p>Services with tasks that use the <code>awsvpc</code> network mode (for example, those\\n\\t\\t\\twith the Fargate launch type) only support Application Load Balancers and Network Load Balancers. Classic Load Balancers\\n\\t\\t\\taren't supported. Also, when you create any target groups for these services, you must\\n\\t\\t\\tchoose <code>ip</code> as the target type, not <code>instance</code>. This is because\\n\\t\\t\\ttasks that use the <code>awsvpc</code> network mode are associated with an elastic\\n\\t\\t\\tnetwork interface, not an Amazon EC2 instance.</p>\"\n                    }\n                },\n                \"serviceRegistries\": {\n                    \"target\": \"com.amazonaws.ecs#ServiceRegistries\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The details of the service discovery registry to associate with this service. For more\\n\\t\\t\\tinformation, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-discovery.html\\\">Service\\n\\t\\t\\t\\tdiscovery</a>.</p>\\n         <note>\\n            <p>Each service may be associated with one service registry. Multiple service\\n\\t\\t\\t\\tregistries for each service isn't supported.</p>\\n         </note>\"\n                    }\n                },\n                \"desiredCount\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedInteger\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of instantiations of the specified task definition to place and keep\\n\\t\\t\\trunning in your service.</p>\\n         <p>This is required if <code>schedulingStrategy</code> is <code>REPLICA</code> or isn't\\n\\t\\t\\tspecified. If <code>schedulingStrategy</code> is <code>DAEMON</code> then this isn't\\n\\t\\t\\trequired.</p>\"\n                    }\n                },\n                \"clientToken\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An identifier that you provide to ensure the idempotency of the request. It must be\\n\\t\\t\\tunique and is case sensitive. Up to 36 ASCII characters in the range of 33-126 (inclusive) are allowed.</p>\"\n                    }\n                },\n                \"launchType\": {\n                    \"target\": \"com.amazonaws.ecs#LaunchType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The infrastructure that you run your service on. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/launch_types.html\\\">Amazon ECS\\n\\t\\t\\t\\tlaunch types</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\\n         <p>The <code>FARGATE</code> launch type runs your tasks on Fargate On-Demand\\n\\t\\t\\tinfrastructure.</p>\\n         <note>\\n            <p>Fargate Spot infrastructure is available for use but a capacity provider\\n\\t\\t\\t\\tstrategy must be used. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/fargate-capacity-providers.html\\\">Fargate capacity providers</a> in the <i>Amazon ECS\\n\\t\\t\\t\\t\\tDeveloper Guide</i>.</p>\\n         </note>\\n         <p>The <code>EC2</code> launch type runs your tasks on Amazon EC2 instances registered to your\\n\\t\\t\\tcluster.</p>\\n         <p>The <code>EXTERNAL</code> launch type runs your tasks on your on-premises server or\\n\\t\\t\\tvirtual machine (VM) capacity registered to your cluster.</p>\\n         <p>A service can use either a launch type or a capacity provider strategy. If a\\n\\t\\t\\t\\t<code>launchType</code> is specified, the <code>capacityProviderStrategy</code>\\n\\t\\t\\tparameter must be omitted.</p>\"\n                    }\n                },\n                \"capacityProviderStrategy\": {\n                    \"target\": \"com.amazonaws.ecs#CapacityProviderStrategy\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The capacity provider strategy to use for the service.</p>\\n         <p>If a <code>capacityProviderStrategy</code> is specified, the <code>launchType</code>\\n\\t\\t\\tparameter must be omitted. If no <code>capacityProviderStrategy</code> or\\n\\t\\t\\t\\t<code>launchType</code> is specified, the\\n\\t\\t\\t\\t<code>defaultCapacityProviderStrategy</code> for the cluster is used.</p>\\n         <p>A capacity provider strategy can contain a maximum of 20 capacity providers.</p>\"\n                    }\n                },\n                \"platformVersion\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The platform version that your tasks in the service are running on. A platform version\\n\\t\\t\\tis specified only for tasks using the Fargate launch type. If one isn't\\n\\t\\t\\tspecified, the <code>LATEST</code> platform version is used. For more information, see\\n\\t\\t\\t\\t<a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/platform_versions.html\\\">Fargate platform\\n\\t\\t\\t\\tversions</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\"\n                    }\n                },\n                \"role\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name or full Amazon Resource Name (ARN) of the IAM role that allows Amazon ECS to make calls to your\\n\\t\\t\\tload balancer on your behalf. This parameter is only permitted if you are using a load\\n\\t\\t\\tbalancer with your service and your task definition doesn't use the <code>awsvpc</code>\\n\\t\\t\\tnetwork mode. If you specify the <code>role</code> parameter, you must also specify a\\n\\t\\t\\tload balancer object with the <code>loadBalancers</code> parameter.</p>\\n         <important>\\n            <p>If your account has already created the Amazon ECS service-linked role, that role is\\n\\t\\t\\t\\tused for your service unless you specify a role here. The service-linked role is\\n\\t\\t\\t\\trequired if your task definition uses the <code>awsvpc</code> network mode or if the\\n\\t\\t\\t\\tservice is configured to use service discovery, an external deployment controller,\\n\\t\\t\\t\\tmultiple target groups, or Elastic Inference accelerators in which case you don't\\n\\t\\t\\t\\tspecify a role here. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/using-service-linked-roles.html\\\">Using\\n\\t\\t\\t\\t\\tservice-linked roles for Amazon ECS</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\\n         </important>\\n         <p>If your specified role has a path other than <code>/</code>, then you must either\\n\\t\\t\\tspecify the full role ARN (this is recommended) or prefix the role name with the path.\\n\\t\\t\\tFor example, if a role with the name <code>bar</code> has a path of <code>/foo/</code>\\n\\t\\t\\tthen you would specify <code>/foo/bar</code> as the role name. For more information, see\\n\\t\\t\\t\\t<a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html#identifiers-friendly-names\\\">Friendly names and paths</a> in the <i>IAM User\\n\\t\\t\\tGuide</i>.</p>\"\n                    }\n                },\n                \"deploymentConfiguration\": {\n                    \"target\": \"com.amazonaws.ecs#DeploymentConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Optional deployment parameters that control how many tasks run during the deployment\\n\\t\\t\\tand the ordering of stopping and starting tasks.</p>\"\n                    }\n                },\n                \"placementConstraints\": {\n                    \"target\": \"com.amazonaws.ecs#PlacementConstraints\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An array of placement constraint objects to use for tasks in your service. You can\\n\\t\\t\\tspecify a maximum of 10 constraints for each task. This limit includes constraints in\\n\\t\\t\\tthe task definition and those specified at runtime.</p>\"\n                    }\n                },\n                \"placementStrategy\": {\n                    \"target\": \"com.amazonaws.ecs#PlacementStrategies\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The placement strategy objects to use for tasks in your service. You can specify a\\n\\t\\t\\tmaximum of 5 strategy rules for each service.</p>\"\n                    }\n                },\n                \"networkConfiguration\": {\n                    \"target\": \"com.amazonaws.ecs#NetworkConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The network configuration for the service. This parameter is required for task\\n\\t\\t\\tdefinitions that use the <code>awsvpc</code> network mode to receive their own elastic\\n\\t\\t\\tnetwork interface, and it isn't supported for other network modes. For more information,\\n\\t\\t\\tsee <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-networking.html\\\">Task networking</a>\\n\\t\\t\\tin the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\"\n                    }\n                },\n                \"healthCheckGracePeriodSeconds\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedInteger\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The period of time, in seconds, that the Amazon ECS service scheduler ignores unhealthy Elastic Load Balancing, VPC Lattice, and container health checks after a task has first started. If you do not specify a health check grace period value, the default value of 0 is used. If you do not use any of the health checks, then <code>healthCheckGracePeriodSeconds</code> is unused.</p>\\n         <p>If your service has more running tasks than desired, unhealthy tasks in the grace period might be stopped to reach the desired count.</p>\"\n                    }\n                },\n                \"schedulingStrategy\": {\n                    \"target\": \"com.amazonaws.ecs#SchedulingStrategy\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The scheduling strategy to use for the service. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs_services.html\\\">Services</a>.</p>\\n         <p>There are two service scheduler strategies available:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>REPLICA</code>-The replica scheduling strategy places and\\n\\t\\t\\t\\t\\tmaintains the desired number of tasks across your cluster. By default, the\\n\\t\\t\\t\\t\\tservice scheduler spreads tasks across Availability Zones. You can use task\\n\\t\\t\\t\\t\\tplacement strategies and constraints to customize task placement decisions. This\\n\\t\\t\\t\\t\\tscheduler strategy is required if the service uses the <code>CODE_DEPLOY</code>\\n\\t\\t\\t\\t\\tor <code>EXTERNAL</code> deployment controller types.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>DAEMON</code>-The daemon scheduling strategy deploys exactly one\\n\\t\\t\\t\\t\\ttask on each active container instance that meets all of the task placement\\n\\t\\t\\t\\t\\tconstraints that you specify in your cluster. The service scheduler also\\n\\t\\t\\t\\t\\tevaluates the task placement constraints for running tasks and will stop tasks\\n\\t\\t\\t\\t\\tthat don't meet the placement constraints. When you're using this strategy, you\\n\\t\\t\\t\\t\\tdon't need to specify a desired number of tasks, a task placement strategy, or\\n\\t\\t\\t\\t\\tuse Service Auto Scaling policies.</p>\\n               <note>\\n                  <p>Tasks using the Fargate launch type or the\\n\\t\\t\\t\\t\\t\\t\\t<code>CODE_DEPLOY</code> or <code>EXTERNAL</code> deployment controller\\n\\t\\t\\t\\t\\t\\ttypes don't support the <code>DAEMON</code> scheduling strategy.</p>\\n               </note>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"deploymentController\": {\n                    \"target\": \"com.amazonaws.ecs#DeploymentController\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The deployment controller to use for the service. If no deployment controller is\\n\\t\\t\\tspecified, the default value of <code>ECS</code> is used.</p>\"\n                    }\n                },\n                \"tags\": {\n                    \"target\": \"com.amazonaws.ecs#Tags\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The metadata that you apply to the service to help you categorize and organize them.\\n\\t\\t\\tEach tag consists of a key and an optional value, both of which you define. When a\\n\\t\\t\\tservice is deleted, the tags are deleted as well.</p>\\n         <p>The following basic restrictions apply to tags:</p>\\n         <ul>\\n            <li>\\n               <p>Maximum number of tags per resource - 50</p>\\n            </li>\\n            <li>\\n               <p>For each resource, each tag key must be unique, and each tag key can have only\\n                    one value.</p>\\n            </li>\\n            <li>\\n               <p>Maximum key length - 128 Unicode characters in UTF-8</p>\\n            </li>\\n            <li>\\n               <p>Maximum value length - 256 Unicode characters in UTF-8</p>\\n            </li>\\n            <li>\\n               <p>If your tagging schema is used across multiple services and resources,\\n                    remember that other services may have restrictions on allowed characters.\\n                    Generally allowed characters are: letters, numbers, and spaces representable in\\n                    UTF-8, and the following characters: + - = . _ : / @.</p>\\n            </li>\\n            <li>\\n               <p>Tag keys and values are case-sensitive.</p>\\n            </li>\\n            <li>\\n               <p>Do not use <code>aws:</code>, <code>AWS:</code>, or any upper or lowercase\\n                    combination of such as a prefix for either keys or values as it is reserved for\\n                    Amazon Web Services use. You cannot edit or delete tag keys or values with this prefix. Tags with\\n                    this prefix do not count against your tags per resource limit.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"enableECSManagedTags\": {\n                    \"target\": \"com.amazonaws.ecs#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Specifies whether to turn on Amazon ECS managed tags for the tasks within the service. For\\n\\t\\t\\tmore information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-using-tags.html\\\">Tagging your Amazon ECS\\n\\t\\t\\t\\tresources</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\\n         <p>When you use Amazon ECS managed tags, you must set the <code>propagateTags</code>\\n\\t\\t\\trequest parameter.</p>\"\n                    }\n                },\n                \"propagateTags\": {\n                    \"target\": \"com.amazonaws.ecs#PropagateTags\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies whether to propagate the tags from the task definition to the task. If no\\n\\t\\t\\tvalue is specified, the tags aren't propagated. Tags can only be propagated to the task\\n\\t\\t\\tduring task creation. To add tags to a task after task creation, use the <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_TagResource.html\\\">TagResource</a> API action.</p>\\n         <p>You must set this to a value other than <code>NONE</code> when you use Cost Explorer.\\n\\t\\t\\tFor more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/usage-reports.html\\\">Amazon ECS usage reports</a>\\n\\t\\t\\tin the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\\n         <p>The default is <code>NONE</code>.</p>\"\n                    }\n                },\n                \"enableExecuteCommand\": {\n                    \"target\": \"com.amazonaws.ecs#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Determines whether the execute command functionality is turned on for the service. If\\n\\t\\t\\t\\t<code>true</code>, this enables execute command functionality on all containers in\\n\\t\\t\\tthe service tasks.</p>\"\n                    }\n                },\n                \"serviceConnectConfiguration\": {\n                    \"target\": \"com.amazonaws.ecs#ServiceConnectConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The configuration for this service to discover and connect to\\n\\tservices, and be discovered by, and connected from, other services within a namespace.</p>\\n         <p>Tasks that run in a namespace can use short names to connect\\n\\tto services in the namespace. Tasks can connect to services across all of the clusters in the namespace.\\n\\tTasks connect through a managed proxy container\\n\\tthat collects logs and metrics for increased visibility.\\n\\tOnly the tasks that Amazon ECS services create are supported with Service Connect.\\n\\tFor more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-connect.html\\\">Service Connect</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\"\n                    }\n                },\n                \"volumeConfigurations\": {\n                    \"target\": \"com.amazonaws.ecs#ServiceVolumeConfigurations\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The configuration for a volume specified in the task definition as a volume that is\\n\\t\\t\\tconfigured at launch time. Currently, the only supported volume type is an Amazon EBS\\n\\t\\t\\tvolume.</p>\"\n                    }\n                },\n                \"vpcLatticeConfigurations\": {\n                    \"target\": \"com.amazonaws.ecs#VpcLatticeConfigurations\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The VPC Lattice configuration for the service being created.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ecs#CreateServiceResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"service\": {\n                    \"target\": \"com.amazonaws.ecs#Service\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The full description of your service following the create call.</p>\\n         <p>A service will return either a <code>capacityProviderStrategy</code> or\\n\\t\\t\\t\\t<code>launchType</code> parameter, but not both, depending where one was specified\\n\\t\\t\\twhen it was created.</p>\\n         <p>If a service is using the <code>ECS</code> deployment controller, the\\n\\t\\t\\t\\t<code>deploymentController</code> and <code>taskSets</code> parameters will not be\\n\\t\\t\\treturned.</p>\\n         <p>if the service uses the <code>CODE_DEPLOY</code> deployment controller, the\\n\\t\\t\\t\\t<code>deploymentController</code>, <code>taskSets</code> and\\n\\t\\t\\t\\t<code>deployments</code> parameters will be returned, however the\\n\\t\\t\\t\\t<code>deployments</code> parameter will be an empty list.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ecs#CreateTaskSet\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ecs#CreateTaskSetRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ecs#CreateTaskSetResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.ecs#AccessDeniedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ClientException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ClusterNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#NamespaceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#PlatformTaskDefinitionIncompatibilityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#PlatformUnknownException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ServerException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ServiceNotActiveException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ServiceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#UnsupportedFeatureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Create a task set in the specified cluster and service. This is used when a service\\n\\t\\t\\tuses the <code>EXTERNAL</code> deployment controller type. For more information, see\\n\\t\\t\\t\\t<a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/deployment-types.html\\\">Amazon ECS deployment\\n\\t\\t\\t\\ttypes</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\\n         <note>\\n            <p>On March 21, 2024, a change was made to resolve the task definition revision before authorization. When a task definition revision is not specified, authorization will occur using the latest revision of a task definition.</p>\\n         </note>\\n         <p>For information about the maximum number of task sets and other quotas, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-quotas.html\\\">Amazon ECS\\n\\t\\t\\t\\tservice quotas</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To create a task set\",\n                        \"documentation\": \"This example creates a task set in a service that uses the EXTERNAL deployment controller.\",\n                        \"input\": {\n                            \"service\": \"MyService\",\n                            \"cluster\": \"MyCluster\",\n                            \"taskDefinition\": \"MyTaskDefinition:2\",\n                            \"networkConfiguration\": {\n                                \"awsvpcConfiguration\": {\n                                    \"subnets\": [\n                                        \"subnet-12344321\"\n                                    ],\n                                    \"securityGroups\": [\n                                        \"sg-12344321\"\n                                    ]\n                                }\n                            }\n                        },\n                        \"output\": {\n                            \"taskSet\": {\n                                \"id\": \"ecs-svc/1234567890123456789\",\n                                \"taskSetArn\": \"arn:aws:ecs:us-west-2:123456789012:task-set/MyCluster/MyService/ecs-svc/1234567890123456789\",\n                                \"status\": \"ACTIVE\",\n                                \"taskDefinition\": \"arn:aws:ecs:us-west-2:123456789012:task-definition/MyTaskDefinition:2\",\n                                \"computedDesiredCount\": 0,\n                                \"pendingCount\": 0,\n                                \"runningCount\": 0,\n                                \"createdAt\": 1.557128360711E9,\n                                \"updatedAt\": 1.557128360711E9,\n                                \"launchType\": \"EC2\",\n                                \"networkConfiguration\": {\n                                    \"awsvpcConfiguration\": {\n                                        \"subnets\": [\n                                            \"subnet-12344321\"\n                                        ],\n                                        \"securityGroups\": [\n                                            \"sg-12344321\"\n                                        ],\n                                        \"assignPublicIp\": \"DISABLED\"\n                                    }\n                                },\n                                \"loadBalancers\": [],\n                                \"serviceRegistries\": [],\n                                \"scale\": {\n                                    \"value\": 0,\n                                    \"unit\": \"PERCENT\"\n                                },\n                                \"stabilityStatus\": \"STABILIZING\",\n                                \"stabilityStatusAt\": 1.557128360711E9\n                            }\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ecs#CreateTaskSetRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"service\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The short name or full Amazon Resource Name (ARN) of the service to create the task set in.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"cluster\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The short name or full Amazon Resource Name (ARN) of the cluster that hosts the service to create the\\n\\t\\t\\ttask set in.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"externalId\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An optional non-unique tag that identifies this task set in external systems. If the\\n\\t\\t\\ttask set is associated with a service discovery registry, the tasks in this task set\\n\\t\\t\\twill have the <code>ECS_TASK_SET_EXTERNAL_ID</code> Cloud Map attribute set to the provided\\n\\t\\t\\tvalue.</p>\"\n                    }\n                },\n                \"taskDefinition\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The task definition for the tasks in the task set to use. If a revision isn't\\n\\t\\t\\tspecified, the latest <code>ACTIVE</code> revision is used.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"networkConfiguration\": {\n                    \"target\": \"com.amazonaws.ecs#NetworkConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An object representing the network configuration for a task set.</p>\"\n                    }\n                },\n                \"loadBalancers\": {\n                    \"target\": \"com.amazonaws.ecs#LoadBalancers\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A load balancer object representing the load balancer to use with the task set. The\\n\\t\\t\\tsupported load balancer types are either an Application Load Balancer or a Network Load Balancer.</p>\"\n                    }\n                },\n                \"serviceRegistries\": {\n                    \"target\": \"com.amazonaws.ecs#ServiceRegistries\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The details of the service discovery registries to assign to this task set. For more\\n\\t\\t\\tinformation, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-discovery.html\\\">Service\\n\\t\\t\\t\\tdiscovery</a>.</p>\"\n                    }\n                },\n                \"launchType\": {\n                    \"target\": \"com.amazonaws.ecs#LaunchType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The launch type that new tasks in the task set uses. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/launch_types.html\\\">Amazon ECS\\n\\t\\t\\t\\tlaunch types</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\\n         <p>If a <code>launchType</code> is specified, the <code>capacityProviderStrategy</code>\\n\\t\\t\\tparameter must be omitted.</p>\"\n                    }\n                },\n                \"capacityProviderStrategy\": {\n                    \"target\": \"com.amazonaws.ecs#CapacityProviderStrategy\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The capacity provider strategy to use for the task set.</p>\\n         <p>A capacity provider strategy consists of one or more capacity providers along with the\\n\\t\\t\\t\\t<code>base</code> and <code>weight</code> to assign to them. A capacity provider\\n\\t\\t\\tmust be associated with the cluster to be used in a capacity provider strategy. The\\n\\t\\t\\t\\t<a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_PutClusterCapacityProviders.html\\\">PutClusterCapacityProviders</a> API is used to associate a capacity provider\\n\\t\\t\\twith a cluster. Only capacity providers with an <code>ACTIVE</code> or\\n\\t\\t\\t\\t<code>UPDATING</code> status can be used.</p>\\n         <p>If a <code>capacityProviderStrategy</code> is specified, the <code>launchType</code>\\n\\t\\t\\tparameter must be omitted. If no <code>capacityProviderStrategy</code> or\\n\\t\\t\\t\\t<code>launchType</code> is specified, the\\n\\t\\t\\t\\t<code>defaultCapacityProviderStrategy</code> for the cluster is used.</p>\\n         <p>If specifying a capacity provider that uses an Auto Scaling group, the capacity\\n\\t\\t\\tprovider must already be created. New capacity providers can be created with the <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_CreateCapacityProviderProvider.html\\\">CreateCapacityProviderProvider</a>API operation.</p>\\n         <p>To use a Fargate capacity provider, specify either the <code>FARGATE</code> or\\n\\t\\t\\t\\t<code>FARGATE_SPOT</code> capacity providers. The Fargate capacity providers are\\n\\t\\t\\tavailable to all accounts and only need to be associated with a cluster to be\\n\\t\\t\\tused.</p>\\n         <p>The <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_PutClusterCapacityProviders.html\\\">PutClusterCapacityProviders</a> API operation is used to update the list of\\n\\t\\t\\tavailable capacity providers for a cluster after the cluster is created.</p>\"\n                    }\n                },\n                \"platformVersion\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The platform version that the tasks in the task set uses. A platform version is\\n\\t\\t\\tspecified only for tasks using the Fargate launch type. If one isn't\\n\\t\\t\\tspecified, the <code>LATEST</code> platform version is used.</p>\"\n                    }\n                },\n                \"scale\": {\n                    \"target\": \"com.amazonaws.ecs#Scale\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A floating-point percentage of the desired number of tasks to place and keep running\\n\\t\\t\\tin the task set.</p>\"\n                    }\n                },\n                \"clientToken\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An identifier that you provide to ensure the idempotency of the request. It must be\\n\\t\\t\\tunique and is case sensitive. Up to 36 ASCII characters in the range of 33-126 (inclusive) are allowed.</p>\"\n                    }\n                },\n                \"tags\": {\n                    \"target\": \"com.amazonaws.ecs#Tags\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The metadata that you apply to the task set to help you categorize and organize them.\\n\\t\\t\\tEach tag consists of a key and an optional value. You define both. When a service is\\n\\t\\t\\tdeleted, the tags are deleted.</p>\\n         <p>The following basic restrictions apply to tags:</p>\\n         <ul>\\n            <li>\\n               <p>Maximum number of tags per resource - 50</p>\\n            </li>\\n            <li>\\n               <p>For each resource, each tag key must be unique, and each tag key can have only\\n                    one value.</p>\\n            </li>\\n            <li>\\n               <p>Maximum key length - 128 Unicode characters in UTF-8</p>\\n            </li>\\n            <li>\\n               <p>Maximum value length - 256 Unicode characters in UTF-8</p>\\n            </li>\\n            <li>\\n               <p>If your tagging schema is used across multiple services and resources,\\n                    remember that other services may have restrictions on allowed characters.\\n                    Generally allowed characters are: letters, numbers, and spaces representable in\\n                    UTF-8, and the following characters: + - = . _ : / @.</p>\\n            </li>\\n            <li>\\n               <p>Tag keys and values are case-sensitive.</p>\\n            </li>\\n            <li>\\n               <p>Do not use <code>aws:</code>, <code>AWS:</code>, or any upper or lowercase\\n                    combination of such as a prefix for either keys or values as it is reserved for\\n                    Amazon Web Services use. You cannot edit or delete tag keys or values with this prefix. Tags with\\n                    this prefix do not count against your tags per resource limit.</p>\\n            </li>\\n         </ul>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ecs#CreateTaskSetResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"taskSet\": {\n                    \"target\": \"com.amazonaws.ecs#TaskSet\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Information about a set of Amazon ECS tasks in either an CodeDeploy or an\\n\\t\\t\\t\\t<code>EXTERNAL</code> deployment. A task set includes details such as the desired\\n\\t\\t\\tnumber of tasks, how many tasks are running, and whether the task set serves production\\n\\t\\t\\ttraffic.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ecs#CreatedAt\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"before\": {\n                    \"target\": \"com.amazonaws.ecs#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Include service deployments in the result that were created before this time. The\\n\\t\\t\\tformat is yyyy-MM-dd HH:mm:ss.SSSSSS.</p>\"\n                    }\n                },\n                \"after\": {\n                    \"target\": \"com.amazonaws.ecs#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Include service deployments in the result that were created after this time. The\\n\\t\\t\\tformat is yyyy-MM-dd HH:mm:ss.SSSSSS.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The optional filter to narrow the <code>ListServiceDeployment</code> results.</p>\\n         <p> If you do not specify a value, service deployments that were created before the\\n\\t\\t\\tcurrent time are included in the result.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#DeleteAccountSetting\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ecs#DeleteAccountSettingRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ecs#DeleteAccountSettingResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.ecs#ClientException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ServerException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Disables an account setting for a specified user, role, or the root user for an\\n\\t\\t\\taccount.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To delete the account settings for a specific IAM user or IAM role\",\n                        \"documentation\": \"This example deletes the account setting for a specific IAM user or IAM role for the specified resource type. Only the root user can view or modify the account settings for another user.\",\n                        \"input\": {\n                            \"name\": \"containerInstanceLongArnFormat\",\n                            \"principalArn\": \"arn:aws:iam::<aws_account_id>:user/principalName\"\n                        },\n                        \"output\": {\n                            \"setting\": {\n                                \"name\": \"containerInstanceLongArnFormat\",\n                                \"value\": \"enabled\",\n                                \"principalArn\": \"arn:aws:iam::<aws_account_id>:user/principalName\"\n                            }\n                        }\n                    },\n                    {\n                        \"title\": \"To delete your account setting\",\n                        \"documentation\": \"This example deletes the account setting for your user for the specified resource type.\",\n                        \"input\": {\n                            \"name\": \"serviceLongArnFormat\"\n                        },\n                        \"output\": {\n                            \"setting\": {\n                                \"name\": \"serviceLongArnFormat\",\n                                \"value\": \"enabled\",\n                                \"principalArn\": \"arn:aws:iam::<aws_account_id>:user/principalName\"\n                            }\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ecs#DeleteAccountSettingRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"name\": {\n                    \"target\": \"com.amazonaws.ecs#SettingName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The resource name to disable the account setting for. If\\n\\t\\t\\t\\t<code>serviceLongArnFormat</code> is specified, the ARN for your Amazon ECS services is\\n\\t\\t\\taffected. If <code>taskLongArnFormat</code> is specified, the ARN and resource ID for\\n\\t\\t\\tyour Amazon ECS tasks is affected. If <code>containerInstanceLongArnFormat</code> is\\n\\t\\t\\tspecified, the ARN and resource ID for your Amazon ECS container instances is affected. If\\n\\t\\t\\t\\t<code>awsvpcTrunking</code> is specified, the ENI limit for your Amazon ECS container\\n\\t\\t\\tinstances is affected.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"principalArn\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the principal. It can be a user, role, or the\\n\\t\\t\\troot user. If you specify the root user, it disables the account setting for all users, roles,\\n\\t\\t\\tand the root user of the account unless a user or role explicitly overrides these settings.\\n\\t\\t\\tIf this field is omitted, the setting is changed only for the authenticated user.</p>\\n         <p>In order to use this parameter, you must be the root user, or the principal.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ecs#DeleteAccountSettingResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"setting\": {\n                    \"target\": \"com.amazonaws.ecs#Setting\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The account setting for the specified principal ARN.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ecs#DeleteAttributes\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ecs#DeleteAttributesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ecs#DeleteAttributesResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.ecs#ClusterNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#TargetNotFoundException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes one or more custom attributes from an Amazon ECS resource.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To delete a custom attribute from an Amazon ECS instance\",\n                        \"documentation\": \"This example deletes an attribute named stack from a container instance. \",\n                        \"input\": {\n                            \"attributes\": [\n                                {\n                                    \"name\": \"stack\",\n                                    \"targetId\": \"aws:ecs:us-west-2:130757420319:container-instance/1c3be8ed-df30-47b4-8f1e-6e68ebd01f34\"\n                                }\n                            ]\n                        },\n                        \"output\": {\n                            \"attributes\": [\n                                {\n                                    \"name\": \"stack\",\n                                    \"targetId\": \"aws:ecs:us-west-2:130757420319:container-instance/1c3be8ed-df30-47b4-8f1e-6e68ebd01f34\",\n                                    \"value\": \"production\"\n                                }\n                            ]\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ecs#DeleteAttributesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"cluster\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The short name or full Amazon Resource Name (ARN) of the cluster that contains the resource to delete\\n\\t\\t\\tattributes. If you do not specify a cluster, the default cluster is assumed.</p>\"\n                    }\n                },\n                \"attributes\": {\n                    \"target\": \"com.amazonaws.ecs#Attributes\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The attributes to delete from your resource. You can specify up to 10 attributes for\\n\\t\\t\\teach request. For custom attributes, specify the attribute name and target ID, but don't\\n\\t\\t\\tspecify the value. If you specify the target ID using the short form, you must also\\n\\t\\t\\tspecify the target type.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ecs#DeleteAttributesResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"attributes\": {\n                    \"target\": \"com.amazonaws.ecs#Attributes\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of attribute objects that were successfully deleted from your resource.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ecs#DeleteCapacityProvider\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ecs#DeleteCapacityProviderRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ecs#DeleteCapacityProviderResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.ecs#ClientException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ClusterNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ServerException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#UnsupportedFeatureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the specified capacity provider.</p>\\n         <note>\\n            <p>The <code>FARGATE</code> and <code>FARGATE_SPOT</code> capacity providers are\\n\\t\\t\\t\\treserved and can't be deleted. You can disassociate them from a cluster using either\\n\\t\\t\\t\\t\\t<a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_PutClusterCapacityProviders.html\\\">PutClusterCapacityProviders</a> or by deleting the cluster.</p>\\n         </note>\\n         <p>Prior to a capacity provider being deleted, the capacity provider must be removed from\\n\\t\\t\\tthe capacity provider strategy from all services. The <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_UpdateService.html\\\">UpdateService</a> API\\n\\t\\t\\tcan be used to remove a capacity provider from a service's capacity provider strategy.\\n\\t\\t\\tWhen updating a service, the <code>forceNewDeployment</code> option can be used to\\n\\t\\t\\tensure that any tasks using the Amazon EC2 instance capacity provided by the capacity\\n\\t\\t\\tprovider are transitioned to use the capacity from the remaining capacity providers.\\n\\t\\t\\tOnly capacity providers that aren't associated with a cluster can be deleted. To remove\\n\\t\\t\\ta capacity provider from a cluster, you can either use <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_PutClusterCapacityProviders.html\\\">PutClusterCapacityProviders</a> or delete the cluster.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To delete a specified capacity provider\",\n                        \"documentation\": \"This example deletes a specified capacity provider. \",\n                        \"input\": {\n                            \"capacityProvider\": \"arn:aws:ecs:us-west-2:123456789012:capacity-provider/ExampleCapacityProvider\"\n                        },\n                        \"output\": {\n                            \"capacityProvider\": {\n                                \"capacityProviderArn\": \"arn:aws:ecs:us-west-2:123456789012:capacity-provider/ExampleCapacityProvider\",\n                                \"name\": \"ExampleCapacityProvider\",\n                                \"status\": \"ACTIVE\",\n                                \"autoScalingGroupProvider\": {\n                                    \"autoScalingGroupArn\": \"arn:aws:autoscaling:us-west-2:123456789012:autoScalingGroup:a1b2c3d4-5678-90ab-cdef-EXAMPLE11111:autoScalingGroupName/MyAutoScalingGroup\",\n                                    \"managedScaling\": {\n                                        \"status\": \"ENABLED\",\n                                        \"targetCapacity\": 100,\n                                        \"minimumScalingStepSize\": 1,\n                                        \"maximumScalingStepSize\": 10000\n                                    },\n                                    \"managedTerminationProtection\": \"DISABLED\"\n                                },\n                                \"updateStatus\": \"DELETE_IN_PROGRESS\",\n                                \"tags\": []\n                            }\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ecs#DeleteCapacityProviderRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"capacityProvider\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The short name or full Amazon Resource Name (ARN) of the capacity provider to delete.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"cluster\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the cluster that contains the capacity provider to delete. Managed instances capacity providers are cluster-scoped and can only be deleted from their associated cluster.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ecs#DeleteCapacityProviderResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"capacityProvider\": {\n                    \"target\": \"com.amazonaws.ecs#CapacityProvider\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The details of the capacity provider.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ecs#DeleteCluster\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ecs#DeleteClusterRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ecs#DeleteClusterResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.ecs#ClientException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ClusterContainsCapacityProviderException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ClusterContainsContainerInstancesException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ClusterContainsServicesException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ClusterContainsTasksException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ClusterNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ServerException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#UpdateInProgressException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the specified cluster. The cluster transitions to the <code>INACTIVE</code>\\n\\t\\t\\tstate. Clusters with an <code>INACTIVE</code> status might remain discoverable in your\\n\\t\\t\\taccount for a period of time. However, this behavior is subject to change in the future.\\n\\t\\t\\tWe don't recommend that you rely on <code>INACTIVE</code> clusters persisting.</p>\\n         <p>You must deregister all container instances from this cluster before you may delete\\n\\t\\t\\tit. You can list the container instances in a cluster with <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_ListContainerInstances.html\\\">ListContainerInstances</a> and deregister them with <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_DeregisterContainerInstance.html\\\">DeregisterContainerInstance</a>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To delete an empty cluster\",\n                        \"documentation\": \"This example deletes an empty cluster in your default region.\",\n                        \"input\": {\n                            \"cluster\": \"my_cluster\"\n                        },\n                        \"output\": {\n                            \"cluster\": {\n                                \"activeServicesCount\": 0,\n                                \"clusterArn\": \"arn:aws:ecs:us-east-1:012345678910:cluster/my_cluster\",\n                                \"clusterName\": \"my_cluster\",\n                                \"pendingTasksCount\": 0,\n                                \"registeredContainerInstancesCount\": 0,\n                                \"runningTasksCount\": 0,\n                                \"status\": \"INACTIVE\"\n                            }\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ecs#DeleteClusterRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"cluster\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The short name or full Amazon Resource Name (ARN) of the cluster to delete.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ecs#DeleteClusterResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"cluster\": {\n                    \"target\": \"com.amazonaws.ecs#Cluster\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The full description of the deleted cluster.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ecs#DeleteService\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ecs#DeleteServiceRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ecs#DeleteServiceResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.ecs#ClientException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ClusterNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ServerException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ServiceNotFoundException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes a specified service within a cluster. You can delete a service if you have no\\n\\t\\t\\trunning tasks in it and the desired task count is zero. If the service is actively\\n\\t\\t\\tmaintaining tasks, you can't delete it, and you must update the service to a desired\\n\\t\\t\\ttask count of zero. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_UpdateService.html\\\">UpdateService</a>.</p>\\n         <note>\\n            <p>When you delete a service, if there are still running tasks that require cleanup,\\n\\t\\t\\t\\tthe service status moves from <code>ACTIVE</code> to <code>DRAINING</code>, and the\\n\\t\\t\\t\\tservice is no longer visible in the console or in the <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_ListServices.html\\\">ListServices</a>\\n\\t\\t\\t\\tAPI operation. After all tasks have transitioned to either <code>STOPPING</code> or\\n\\t\\t\\t\\t\\t<code>STOPPED</code> status, the service status moves from <code>DRAINING</code>\\n\\t\\t\\t\\tto <code>INACTIVE</code>. Services in the <code>DRAINING</code> or\\n\\t\\t\\t\\t\\t<code>INACTIVE</code> status can still be viewed with the <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_DescribeServices.html\\\">DescribeServices</a> API operation. However, in the future,\\n\\t\\t\\t\\t\\t<code>INACTIVE</code> services may be cleaned up and purged from Amazon ECS record\\n\\t\\t\\t\\tkeeping, and <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_DescribeServices.html\\\">DescribeServices</a> calls on those services return a\\n\\t\\t\\t\\t\\t<code>ServiceNotFoundException</code> error.</p>\\n         </note>\\n         <important>\\n            <p>If you attempt to create a new service with the same name as an existing service\\n\\t\\t\\t\\tin either <code>ACTIVE</code> or <code>DRAINING</code> status, you receive an\\n\\t\\t\\t\\terror.</p>\\n         </important>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To delete a service\",\n                        \"documentation\": \"This example deletes the my-http-service service. The service must have a desired count and running count of 0 before you can delete it.\",\n                        \"input\": {\n                            \"service\": \"my-http-service\"\n                        },\n                        \"output\": {}\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ecs#DeleteServiceRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"cluster\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The short name or full Amazon Resource Name (ARN) of the cluster that hosts the service to delete.\\n\\t\\t\\tIf you do not specify a cluster, the default cluster is assumed.</p>\"\n                    }\n                },\n                \"service\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the service to delete.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"force\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedBoolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If <code>true</code>, allows you to delete a service even if it wasn't scaled down to\\n\\t\\t\\tzero tasks. It's only necessary to use this if the service uses the <code>REPLICA</code>\\n\\t\\t\\tscheduling strategy.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ecs#DeleteServiceResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"service\": {\n                    \"target\": \"com.amazonaws.ecs#Service\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The full description of the deleted service.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ecs#DeleteTaskDefinitions\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ecs#DeleteTaskDefinitionsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ecs#DeleteTaskDefinitionsResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.ecs#AccessDeniedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ClientException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ServerException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes one or more task definitions.</p>\\n         <p>You must deregister a task definition revision before you delete it. For more\\n\\t\\t\\tinformation, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_DeregisterTaskDefinition.html\\\">DeregisterTaskDefinition</a>.</p>\\n         <p>When you delete a task definition revision, it is immediately transitions from the\\n\\t\\t\\t\\t<code>INACTIVE</code> to <code>DELETE_IN_PROGRESS</code>. Existing tasks and\\n\\t\\t\\tservices that reference a <code>DELETE_IN_PROGRESS</code> task definition revision\\n\\t\\t\\tcontinue to run without disruption. Existing services that reference a\\n\\t\\t\\t\\t<code>DELETE_IN_PROGRESS</code> task definition revision can still scale up or down\\n\\t\\t\\tby modifying the service's desired count.</p>\\n         <p>You can't use a <code>DELETE_IN_PROGRESS</code> task definition revision to run new\\n\\t\\t\\ttasks or create new services. You also can't update an existing service to reference a\\n\\t\\t\\t\\t<code>DELETE_IN_PROGRESS</code> task definition revision.</p>\\n         <p> A task definition revision will stay in <code>DELETE_IN_PROGRESS</code> status until\\n\\t\\t\\tall the associated tasks and services have been terminated.</p>\\n         <p>When you delete all <code>INACTIVE</code> task definition revisions, the task\\n\\t\\t\\tdefinition name is not displayed in the console and not returned in the API. If a task\\n\\t\\t\\tdefinition revisions are in the <code>DELETE_IN_PROGRESS</code> state, the task\\n\\t\\t\\tdefinition name is displayed in the console and returned in the API. The task definition\\n\\t\\t\\tname is retained by Amazon ECS and the revision is incremented the next time you create a\\n\\t\\t\\ttask definition with that name.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To delete a task definition that has been deregistered\",\n                        \"documentation\": \"This example deletes a specified deregistered task definition. \",\n                        \"input\": {\n                            \"taskDefinitions\": [\n                                \"Example-task-definition:1\"\n                            ]\n                        },\n                        \"output\": {\n                            \"failures\": [],\n                            \"taskDefinitions\": [\n                                {\n                                    \"containerDefinitions\": [\n                                        {\n                                            \"command\": [\n                                                \"apt-get update; apt-get install stress; while true; do stress --cpu $(( RANDOM % 4 )) -t $(( RANDOM % 10 )); done\"\n                                            ],\n                                            \"cpu\": 50,\n                                            \"entryPoint\": [\n                                                \"bash\",\n                                                \"-c\"\n                                            ],\n                                            \"environment\": [],\n                                            \"essential\": true,\n                                            \"image\": \"public.ecr.aws/docker/library/ubuntu:latest\",\n                                            \"memory\": 100,\n                                            \"mountPoints\": [],\n                                            \"name\": \"wave\",\n                                            \"portMappings\": [],\n                                            \"volumesFrom\": []\n                                        }\n                                    ],\n                                    \"family\": \"cpu-wave\",\n                                    \"revision\": 1,\n                                    \"status\": \"DELETE_IN_PROGRESS\",\n                                    \"taskDefinitionArn\": \"arn:aws:ecs:us-east-1:012345678910:task-definition/Example-task-definition:1\",\n                                    \"volumes\": []\n                                }\n                            ]\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ecs#DeleteTaskDefinitionsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"taskDefinitions\": {\n                    \"target\": \"com.amazonaws.ecs#StringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>family</code> and <code>revision</code> (<code>family:revision</code>) or\\n\\t\\t\\tfull Amazon Resource Name (ARN) of the task definition to delete. You must specify a\\n\\t\\t\\t\\t<code>revision</code>.</p>\\n         <p>You can specify up to 10 task definitions as a comma separated list.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ecs#DeleteTaskDefinitionsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"taskDefinitions\": {\n                    \"target\": \"com.amazonaws.ecs#TaskDefinitionList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The list of deleted task definitions.</p>\"\n                    }\n                },\n                \"failures\": {\n                    \"target\": \"com.amazonaws.ecs#Failures\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Any failures associated with the call.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ecs#DeleteTaskSet\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ecs#DeleteTaskSetRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ecs#DeleteTaskSetResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.ecs#AccessDeniedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ClientException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ClusterNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ServerException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ServiceNotActiveException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ServiceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#TaskSetNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#UnsupportedFeatureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes a specified task set within a service. This is used when a service uses the\\n\\t\\t\\t\\t<code>EXTERNAL</code> deployment controller type. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/deployment-types.html\\\">Amazon ECS deployment types</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To delete a task set within a service that uses the EXTERNAL deployment controller type\",\n                        \"documentation\": \"This example deletes a task set and uses the force flag to force deletion if it hasn't scaled to zero.\",\n                        \"input\": {\n                            \"cluster\": \"MyCluster\",\n                            \"service\": \"MyService\",\n                            \"taskSet\": \"arn:aws:ecs:us-west-2:123456789012:task-set/MyCluster/MyService/ecs-svc/1234567890123456789\",\n                            \"force\": true\n                        },\n                        \"output\": {\n                            \"taskSet\": {\n                                \"id\": \"ecs-svc/1234567890123456789\",\n                                \"taskSetArn\": \"arn:aws:ecs:us-west-2:123456789012:task-set/MyCluster/MyService/ecs-svc/1234567890123456789\",\n                                \"status\": \"DRAINING\",\n                                \"taskDefinition\": \"arn:aws:ecs:us-west-2:123456789012:task-definition/sample-fargate:2\",\n                                \"computedDesiredCount\": 0,\n                                \"pendingCount\": 0,\n                                \"runningCount\": 0,\n                                \"createdAt\": 1.557130260276E9,\n                                \"updatedAt\": 1.557130290707E9,\n                                \"launchType\": \"EC2\",\n                                \"networkConfiguration\": {\n                                    \"awsvpcConfiguration\": {\n                                        \"subnets\": [\n                                            \"subnet-12345678\"\n                                        ],\n                                        \"securityGroups\": [\n                                            \"sg-12345678\"\n                                        ],\n                                        \"assignPublicIp\": \"DISABLED\"\n                                    }\n                                },\n                                \"loadBalancers\": [],\n                                \"serviceRegistries\": [],\n                                \"scale\": {\n                                    \"value\": 0,\n                                    \"unit\": \"PERCENT\"\n                                },\n                                \"stabilityStatus\": \"STABILIZING\",\n                                \"stabilityStatusAt\": 1.557130290707E9\n                            }\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ecs#DeleteTaskSetRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"cluster\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The short name or full Amazon Resource Name (ARN) of the cluster that hosts the service that the task\\n\\t\\t\\tset found in to delete.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"service\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The short name or full Amazon Resource Name (ARN) of the service that hosts the task set to\\n\\t\\t\\tdelete.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"taskSet\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The task set ID or full Amazon Resource Name (ARN) of the task set to delete.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"force\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedBoolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If <code>true</code>, you can delete a task set even if it hasn't been scaled down to\\n\\t\\t\\tzero.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ecs#DeleteTaskSetResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"taskSet\": {\n                    \"target\": \"com.amazonaws.ecs#TaskSet\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Details about the task set.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ecs#Deployment\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"id\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the deployment.</p>\"\n                    }\n                },\n                \"status\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The status of the deployment. The following describes each state.</p>\\n         <dl>\\n            <dt>PRIMARY</dt>\\n            <dd>\\n               <p>The most recent deployment of a service.</p>\\n            </dd>\\n            <dt>ACTIVE</dt>\\n            <dd>\\n               <p>A service deployment that still has running tasks, but are in the process\\n\\t\\t\\t\\t\\t\\tof being replaced with a new <code>PRIMARY</code> deployment.</p>\\n            </dd>\\n            <dt>INACTIVE</dt>\\n            <dd>\\n               <p>A deployment that has been completely replaced.</p>\\n            </dd>\\n         </dl>\"\n                    }\n                },\n                \"taskDefinition\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The most recent task definition that was specified for the tasks in the service to\\n\\t\\t\\tuse.</p>\"\n                    }\n                },\n                \"desiredCount\": {\n                    \"target\": \"com.amazonaws.ecs#Integer\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The most recent desired count of tasks that was specified for the service to deploy or\\n\\t\\t\\tmaintain.</p>\"\n                    }\n                },\n                \"pendingCount\": {\n                    \"target\": \"com.amazonaws.ecs#Integer\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The number of tasks in the deployment that are in the <code>PENDING</code>\\n\\t\\t\\tstatus.</p>\"\n                    }\n                },\n                \"runningCount\": {\n                    \"target\": \"com.amazonaws.ecs#Integer\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The number of tasks in the deployment that are in the <code>RUNNING</code>\\n\\t\\t\\tstatus.</p>\"\n                    }\n                },\n                \"failedTasks\": {\n                    \"target\": \"com.amazonaws.ecs#Integer\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The number of consecutively failed tasks in the deployment. A task is considered a\\n\\t\\t\\tfailure if the service scheduler can't launch the task, the task doesn't transition to a\\n\\t\\t\\t\\t<code>RUNNING</code> state, or if it fails any of its defined health checks and is\\n\\t\\t\\tstopped.</p>\\n         <note>\\n            <p>Once a service deployment has one or more successfully running tasks, the failed\\n\\t\\t\\t\\ttask count resets to zero and stops being evaluated.</p>\\n         </note>\"\n                    }\n                },\n                \"createdAt\": {\n                    \"target\": \"com.amazonaws.ecs#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Unix timestamp for the time when the service deployment was created.</p>\"\n                    }\n                },\n                \"updatedAt\": {\n                    \"target\": \"com.amazonaws.ecs#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Unix timestamp for the time when the service deployment was last updated.</p>\"\n                    }\n                },\n                \"capacityProviderStrategy\": {\n                    \"target\": \"com.amazonaws.ecs#CapacityProviderStrategy\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The capacity provider strategy that the deployment is using.</p>\"\n                    }\n                },\n                \"launchType\": {\n                    \"target\": \"com.amazonaws.ecs#LaunchType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The launch type the tasks in the service are using. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/launch_types.html\\\">Amazon ECS\\n\\t\\t\\t\\tLaunch Types</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\"\n                    }\n                },\n                \"platformVersion\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The platform version that your tasks in the service run on. A platform version is only\\n\\t\\t\\tspecified for tasks using the Fargate launch type. If one isn't specified,\\n\\t\\t\\tthe <code>LATEST</code> platform version is used. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/platform_versions.html\\\">Fargate Platform Versions</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\"\n                    }\n                },\n                \"platformFamily\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The operating system that your tasks in the service, or tasks are running on. A\\n\\t\\t\\tplatform family is specified only for tasks using the Fargate launch type. </p>\\n         <p> All tasks that run as part of this service must use the same\\n\\t\\t\\t\\t<code>platformFamily</code> value as the service, for example, <code>\\n\\t\\t\\tLINUX.</code>.</p>\"\n                    }\n                },\n                \"networkConfiguration\": {\n                    \"target\": \"com.amazonaws.ecs#NetworkConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The VPC subnet and security group configuration for tasks that receive their own\\n            elastic network interface by using the <code>awsvpc</code> networking mode.</p>\"\n                    }\n                },\n                \"rolloutState\": {\n                    \"target\": \"com.amazonaws.ecs#DeploymentRolloutState\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<note>\\n            <p>The <code>rolloutState</code> of a service is only returned for services that use\\n\\t\\t\\t\\tthe rolling update (<code>ECS</code>) deployment type that aren't behind a\\n\\t\\t\\t\\tClassic Load Balancer.</p>\\n         </note>\\n         <p>The rollout state of the deployment. When a service deployment is started, it begins\\n\\t\\t\\tin an <code>IN_PROGRESS</code> state. When the service reaches a steady state, the\\n\\t\\t\\tdeployment transitions to a <code>COMPLETED</code> state. If the service fails to reach\\n\\t\\t\\ta steady state and circuit breaker is turned on, the deployment transitions to a\\n\\t\\t\\t\\t<code>FAILED</code> state. A deployment in <code>FAILED</code> state doesn't launch\\n\\t\\t\\tany new tasks. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_DeploymentCircuitBreaker.html\\\">DeploymentCircuitBreaker</a>.</p>\"\n                    }\n                },\n                \"rolloutStateReason\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A description of the rollout state of a deployment.</p>\"\n                    }\n                },\n                \"serviceConnectConfiguration\": {\n                    \"target\": \"com.amazonaws.ecs#ServiceConnectConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The details of the Service Connect configuration that's used by this deployment.\\n\\t\\t\\tCompare the configuration between multiple deployments when troubleshooting issues with\\n\\t\\t\\tnew deployments.</p>\\n         <p>The configuration for this service to discover and connect to\\n\\tservices, and be discovered by, and connected from, other services within a namespace.</p>\\n         <p>Tasks that run in a namespace can use short names to connect\\n\\tto services in the namespace. Tasks can connect to services across all of the clusters in the namespace.\\n\\tTasks connect through a managed proxy container\\n\\tthat collects logs and metrics for increased visibility.\\n\\tOnly the tasks that Amazon ECS services create are supported with Service Connect.\\n\\tFor more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-connect.html\\\">Service Connect</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\"\n                    }\n                },\n                \"serviceConnectResources\": {\n                    \"target\": \"com.amazonaws.ecs#ServiceConnectServiceResourceList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The list of Service Connect resources that are associated with this deployment. Each\\n\\t\\t\\tlist entry maps a discovery name to a Cloud Map service name.</p>\"\n                    }\n                },\n                \"volumeConfigurations\": {\n                    \"target\": \"com.amazonaws.ecs#ServiceVolumeConfigurations\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The details of the volume that was <code>configuredAtLaunch</code>. You can configure\\n\\t\\t\\tdifferent settings like the size, throughput, volumeType, and ecryption in <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_ServiceManagedEBSVolumeConfiguration.html\\\">ServiceManagedEBSVolumeConfiguration</a>. The <code>name</code> of the volume\\n\\t\\t\\tmust match the <code>name</code> from the task definition.</p>\"\n                    }\n                },\n                \"fargateEphemeralStorage\": {\n                    \"target\": \"com.amazonaws.ecs#DeploymentEphemeralStorage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Fargate ephemeral storage settings for the deployment.</p>\"\n                    }\n                },\n                \"vpcLatticeConfigurations\": {\n                    \"target\": \"com.amazonaws.ecs#VpcLatticeConfigurations\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The VPC Lattice configuration for the service deployment.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The details of an Amazon ECS service deployment. This is used only when a service uses the\\n\\t\\t\\t\\t<code>ECS</code> deployment controller type.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#DeploymentAlarms\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"alarmNames\": {\n                    \"target\": \"com.amazonaws.ecs#StringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more CloudWatch alarm names. Use a \\\",\\\" to separate the alarms.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"rollback\": {\n                    \"target\": \"com.amazonaws.ecs#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Determines whether to configure Amazon ECS to roll back the service if a service deployment\\n\\t\\t\\tfails. If rollback is used, when a service deployment fails, the service is rolled back\\n\\t\\t\\tto the last deployment that completed successfully.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"enable\": {\n                    \"target\": \"com.amazonaws.ecs#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Determines whether to use the CloudWatch alarm option in the service deployment\\n\\t\\t\\tprocess.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>One of the methods which provide a way for you to quickly identify when a deployment\\n\\t\\t\\thas failed, and then to optionally roll back the failure to the last working\\n\\t\\t\\tdeployment.</p>\\n         <p>When the alarms are generated, Amazon ECS sets the service deployment to failed. Set the\\n\\t\\t\\trollback parameter to have Amazon ECS to roll back your service to the last completed\\n\\t\\t\\tdeployment after a failure.</p>\\n         <p>You can only use the <code>DeploymentAlarms</code> method to detect failures when the\\n\\t\\t\\t\\t<code>DeploymentController</code> is set to <code>ECS</code>.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/deployment-type-ecs.html\\\">Rolling\\n\\t\\t\\t\\tupdate</a> in the <i>\\n               <i>Amazon Elastic Container Service Developer Guide</i>\\n            </i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#DeploymentCircuitBreaker\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"enable\": {\n                    \"target\": \"com.amazonaws.ecs#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Determines whether to use the deployment circuit breaker logic for the service.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"rollback\": {\n                    \"target\": \"com.amazonaws.ecs#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Determines whether to configure Amazon ECS to roll back the service if a service deployment\\n\\t\\t\\tfails. If rollback is on, when a service deployment fails, the service is rolled back to\\n\\t\\t\\tthe last deployment that completed successfully.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>The deployment circuit breaker can only be used for services using the rolling\\n\\t\\t\\t\\tupdate (<code>ECS</code>) deployment type.</p>\\n         </note>\\n         <p>The <b>deployment circuit breaker</b> determines whether a\\n\\t\\t\\tservice deployment will fail if the service can't reach a steady state. If it is turned\\n\\t\\t\\ton, a service deployment will transition to a failed state and stop launching new tasks.\\n\\t\\t\\tYou can also configure Amazon ECS to roll back your service to the last completed deployment\\n\\t\\t\\tafter a failure. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/deployment-type-ecs.html\\\">Rolling\\n\\t\\t\\t\\tupdate</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\\n         <p>For more information about API failure reasons, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/api_failures_messages.html\\\">API failure\\n\\t\\t\\t\\treasons</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#DeploymentConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"deploymentCircuitBreaker\": {\n                    \"target\": \"com.amazonaws.ecs#DeploymentCircuitBreaker\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<note>\\n            <p>The deployment circuit breaker can only be used for services using the rolling\\n\\t\\t\\t\\tupdate (<code>ECS</code>) deployment type.</p>\\n         </note>\\n         <p>The <b>deployment circuit breaker</b> determines whether a\\n\\t\\t\\tservice deployment will fail if the service can't reach a steady state. If you use the\\n\\t\\t\\tdeployment circuit breaker, a service deployment will transition to a failed state and\\n\\t\\t\\tstop launching new tasks. If you use the rollback option, when a service deployment\\n\\t\\t\\tfails, the service is rolled back to the last deployment that completed successfully.\\n\\t\\t\\tFor more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/deployment-type-ecs.html\\\">Rolling\\n\\t\\t\\t\\tupdate</a> in the <i>Amazon Elastic Container Service Developer\\n\\t\\t\\t\\tGuide</i>\\n         </p>\"\n                    }\n                },\n                \"maximumPercent\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedInteger\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If a service is using the rolling update (<code>ECS</code>) deployment type, the\\n\\t\\t\\t\\t<code>maximumPercent</code> parameter represents an upper limit on the number of\\n\\t\\t\\tyour service's tasks that are allowed in the <code>RUNNING</code> or\\n\\t\\t\\t\\t<code>PENDING</code> state during a deployment, as a percentage of the\\n\\t\\t\\t\\t<code>desiredCount</code> (rounded down to the nearest integer). This parameter\\n\\t\\t\\tenables you to define the deployment batch size. For example, if your service is using\\n\\t\\t\\tthe <code>REPLICA</code> service scheduler and has a <code>desiredCount</code> of four\\n\\t\\t\\ttasks and a <code>maximumPercent</code> value of 200%, the scheduler may start four new\\n\\t\\t\\ttasks before stopping the four older tasks (provided that the cluster resources required\\n\\t\\t\\tto do this are available). The default <code>maximumPercent</code> value for a service\\n\\t\\t\\tusing the <code>REPLICA</code> service scheduler is 200%.</p>\\n         <p>The Amazon ECS scheduler uses this parameter to replace unhealthy tasks by starting\\n\\t\\t\\treplacement tasks first and then stopping the unhealthy tasks, as long as cluster\\n\\t\\t\\tresources for starting replacement tasks are available. For more information about how\\n\\t\\t\\tthe scheduler replaces unhealthy tasks, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs_services.html\\\">Amazon ECS\\n\\t\\t\\tservices</a>.</p>\\n         <p>If a service is using either the blue/green (<code>CODE_DEPLOY</code>) or\\n\\t\\t\\t\\t<code>EXTERNAL</code> deployment types, and tasks in the service use the\\n\\t\\t\\tEC2 launch type, the <b>maximum percent</b>\\n\\t\\t\\tvalue is set to the default value. The <b>maximum percent</b>\\n\\t\\t\\tvalue is used to define the upper limit on the number of the tasks in the service that\\n\\t\\t\\tremain in the <code>RUNNING</code> state while the container instances are in the\\n\\t\\t\\t\\t<code>DRAINING</code> state.</p>\\n         <note>\\n            <p>You can't specify a custom <code>maximumPercent</code> value for a service that\\n\\t\\t\\t\\tuses either the blue/green (<code>CODE_DEPLOY</code>) or <code>EXTERNAL</code>\\n\\t\\t\\t\\tdeployment types and has tasks that use the EC2 launch type.</p>\\n         </note>\\n         <p>If the service uses either the blue/green (<code>CODE_DEPLOY</code>) or\\n\\t\\t\\t\\t<code>EXTERNAL</code> deployment types, and the tasks in the service use the\\n\\t\\t\\tFargate launch type, the maximum percent value is not used. The value is\\n\\t\\t\\tstill returned when describing your service.</p>\"\n                    }\n                },\n                \"minimumHealthyPercent\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedInteger\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If a service is using the rolling update (<code>ECS</code>) deployment type, the\\n\\t\\t\\t\\t<code>minimumHealthyPercent</code> represents a lower limit on the number of your\\n\\t\\t\\tservice's tasks that must remain in the <code>RUNNING</code> state during a deployment,\\n\\t\\t\\tas a percentage of the <code>desiredCount</code> (rounded up to the nearest integer).\\n\\t\\t\\tThis parameter enables you to deploy without using additional cluster capacity. For\\n\\t\\t\\texample, if your service has a <code>desiredCount</code> of four tasks and a\\n\\t\\t\\t\\t<code>minimumHealthyPercent</code> of 50%, the service scheduler may stop two\\n\\t\\t\\texisting tasks to free up cluster capacity before starting two new tasks. </p>\\n         <p> If any tasks are unhealthy and if <code>maximumPercent</code> doesn't allow the Amazon ECS\\n\\t\\t\\tscheduler to start replacement tasks, the scheduler stops the unhealthy tasks one-by-one\\n\\t\\t\\t— using the <code>minimumHealthyPercent</code> as a constraint — to clear up capacity to\\n\\t\\t\\tlaunch replacement tasks. For more information about how the scheduler replaces\\n\\t\\t\\tunhealthy tasks, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs_services.html\\\">Amazon ECS services</a>. </p>\\n         <p>For services that <i>do not</i> use a load balancer, the following\\n\\t\\t\\tshould be noted:</p>\\n         <ul>\\n            <li>\\n               <p>A service is considered healthy if all essential containers within the tasks\\n\\t\\t\\t\\t\\tin the service pass their health checks.</p>\\n            </li>\\n            <li>\\n               <p>If a task has no essential containers with a health check defined, the service\\n\\t\\t\\t\\t\\tscheduler will wait for 40 seconds after a task reaches a <code>RUNNING</code>\\n\\t\\t\\t\\t\\tstate before the task is counted towards the minimum healthy percent\\n\\t\\t\\t\\t\\ttotal.</p>\\n            </li>\\n            <li>\\n               <p>If a task has one or more essential containers with a health check defined,\\n\\t\\t\\t\\t\\tthe service scheduler will wait for the task to reach a healthy status before\\n\\t\\t\\t\\t\\tcounting it towards the minimum healthy percent total. A task is considered\\n\\t\\t\\t\\t\\thealthy when all essential containers within the task have passed their health\\n\\t\\t\\t\\t\\tchecks. The amount of time the service scheduler can wait for is determined by\\n\\t\\t\\t\\t\\tthe container health check settings. </p>\\n            </li>\\n         </ul>\\n         <p>For services that <i>do</i> use a load balancer, the following should be\\n\\t\\t\\tnoted:</p>\\n         <ul>\\n            <li>\\n               <p>If a task has no essential containers with a health check defined, the service\\n\\t\\t\\t\\t\\tscheduler will wait for the load balancer target group health check to return a\\n\\t\\t\\t\\t\\thealthy status before counting the task towards the minimum healthy percent\\n\\t\\t\\t\\t\\ttotal.</p>\\n            </li>\\n            <li>\\n               <p>If a task has an essential container with a health check defined, the service\\n\\t\\t\\t\\t\\tscheduler will wait for both the task to reach a healthy status and the load\\n\\t\\t\\t\\t\\tbalancer target group health check to return a healthy status before counting\\n\\t\\t\\t\\t\\tthe task towards the minimum healthy percent total.</p>\\n            </li>\\n         </ul>\\n         <p>The default value for a replica service for <code>minimumHealthyPercent</code> is\\n\\t\\t\\t100%. The default <code>minimumHealthyPercent</code> value for a service using the\\n\\t\\t\\t\\t<code>DAEMON</code> service schedule is 0% for the CLI, the Amazon Web Services SDKs, and the\\n\\t\\t\\tAPIs and 50% for the Amazon Web Services Management Console.</p>\\n         <p>The minimum number of healthy tasks during a deployment is the\\n\\t\\t\\t\\t<code>desiredCount</code> multiplied by the <code>minimumHealthyPercent</code>/100,\\n\\t\\t\\trounded up to the nearest integer value.</p>\\n         <p>If a service is using either the blue/green (<code>CODE_DEPLOY</code>) or\\n\\t\\t\\t\\t<code>EXTERNAL</code> deployment types and is running tasks that use the\\n\\t\\t\\tEC2 launch type, the <b>minimum healthy\\n\\t\\t\\t\\tpercent</b> value is set to the default value. The <b>minimum healthy percent</b> value is used to define the lower limit on the\\n\\t\\t\\tnumber of the tasks in the service that remain in the <code>RUNNING</code> state while\\n\\t\\t\\tthe container instances are in the <code>DRAINING</code> state.</p>\\n         <note>\\n            <p>You can't specify a custom <code>minimumHealthyPercent</code> value for a service\\n\\t\\t\\t\\tthat uses either the blue/green (<code>CODE_DEPLOY</code>) or <code>EXTERNAL</code>\\n\\t\\t\\t\\tdeployment types and has tasks that use the EC2 launch type.</p>\\n         </note>\\n         <p>If a service is using either the blue/green (<code>CODE_DEPLOY</code>) or\\n\\t\\t\\t\\t<code>EXTERNAL</code> deployment types and is running tasks that use the\\n\\t\\t\\tFargate launch type, the minimum healthy percent value is not used,\\n\\t\\t\\talthough it is returned when describing your service.</p>\"\n                    }\n                },\n                \"alarms\": {\n                    \"target\": \"com.amazonaws.ecs#DeploymentAlarms\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Information about the CloudWatch alarms.</p>\"\n                    }\n                },\n                \"strategy\": {\n                    \"target\": \"com.amazonaws.ecs#DeploymentStrategy\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The deployment strategy for the service. Choose from these valid values:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>ROLLING</code> - When you create a service which uses the rolling update\\n                  (<code>ROLLING</code>) deployment strategy, the Amazon ECS service scheduler replaces\\n               the currently running tasks with new tasks. The number of tasks that Amazon ECS adds or\\n               removes from the service during a rolling update is controlled by the service\\n               deployment configuration.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>BLUE_GREEN</code> - A blue/green deployment strategy\\n                  (<code>BLUE_GREEN</code>) is a release methodology that reduces downtime and risk\\n               by running two identical production environments called blue and green. With Amazon ECS\\n               blue/green deployments, you can validate new service revisions before directing\\n               production traffic to them. This approach provides a safer way to deploy changes with\\n               the ability to quickly roll back if needed.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"bakeTimeInMinutes\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedInteger\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time period when both blue and green service revisions are running simultaneously after the production traffic has shifted.</p>\\n         <p>You must provide this parameter when you use the <code>BLUE_GREEN</code> deployment\\n         strategy.</p>\"\n                    }\n                },\n                \"lifecycleHooks\": {\n                    \"target\": \"com.amazonaws.ecs#DeploymentLifecycleHookList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An array of deployment lifecycle hook objects to run custom logic at specific stages of the deployment lifecycle.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Optional deployment parameters that control how many tasks run during a deployment and\\n\\t\\t\\tthe ordering of stopping and starting tasks.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#DeploymentController\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"type\": {\n                    \"target\": \"com.amazonaws.ecs#DeploymentControllerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The deployment controller type to use.</p>\\n         <p>The deployment controller is the mechanism that determines how tasks are deployed for\\n\\t\\t\\tyour service. The valid options are:</p>\\n         <ul>\\n            <li>\\n               <p>ECS</p>\\n               <p>When you create a service which uses the <code>ECS</code> deployment controller, you can choose between the following deployment strategies:</p>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <code>ROLLING</code>: When you create a service which uses the <i>rolling update</i>\\n\\t\\t\\t\\t\\t\\t\\t(<code>ROLLING</code>) deployment strategy, the Amazon ECS service scheduler replaces the\\n\\t\\t\\t\\t\\t\\t\\tcurrently running tasks with new tasks. The number of tasks that Amazon ECS adds or\\n\\t\\t\\t\\t\\t\\t\\tremoves from the service during a rolling update is controlled by the service\\n\\t\\t\\t\\t\\t\\t\\tdeployment configuration. </p>\\n                     <p>Rolling update deployments are best suited for the following scenarios:</p>\\n                     <ul>\\n                        <li>\\n                           <p>Gradual service updates: You need to\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tupdate your service incrementally without taking the entire service\\n\\t\\t\\t\\t\\t\\t\\t\\t\\toffline at once.</p>\\n                        </li>\\n                        <li>\\n                           <p>Limited resource requirements: You\\n\\t\\t\\t\\t\\t\\t\\t\\t\\twant to avoid the additional resource costs of running two complete\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tenvironments simultaneously (as required by blue/green\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tdeployments).</p>\\n                        </li>\\n                        <li>\\n                           <p>Acceptable deployment time: Your\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tapplication can tolerate a longer deployment process, as rolling updates\\n\\t\\t\\t\\t\\t\\t\\t\\t\\treplace tasks one by one.</p>\\n                        </li>\\n                        <li>\\n                           <p>No need for instant roll back: Your\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tservice can tolerate a rollback process that takes minutes rather than\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tseconds.</p>\\n                        </li>\\n                        <li>\\n                           <p>Simple deployment process: You prefer\\n\\t\\t\\t\\t\\t\\t\\t\\t\\ta straightforward deployment approach without the complexity of managing\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tmultiple environments, target groups, and listeners.</p>\\n                        </li>\\n                        <li>\\n                           <p>No load balancer requirement: Your\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tservice doesn't use or require a load balancer, Application Load Balancer, Network Load Balancer, or Service Connect (which are required\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tfor blue/green deployments).</p>\\n                        </li>\\n                        <li>\\n                           <p>Stateful applications: Your\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tapplication maintains state that makes it difficult to run two parallel\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tenvironments.</p>\\n                        </li>\\n                        <li>\\n                           <p>Cost sensitivity: You want to\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tminimize deployment costs by not running duplicate environments during\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tdeployment.</p>\\n                        </li>\\n                     </ul>\\n                     <p>Rolling updates are the default deployment strategy for services and provide a\\n\\t\\t\\t\\t\\t\\t\\tbalance between deployment safety and resource efficiency for many common\\n\\t\\t\\t\\t\\t\\t\\tapplication scenarios.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <code>BLUE_GREEN</code>: A <i>blue/green</i> deployment strategy (<code>BLUE_GREEN</code>) is a release methodology that reduces downtime and\\n\\t\\t\\t\\t\\t\\t\\trisk by running two identical production environments called blue and green.\\n\\t\\t\\t\\t\\t\\t\\tWith Amazon ECS blue/green deployments, you can validate new service revisions before\\n\\t\\t\\t\\t\\t\\t\\tdirecting production traffic to them. This approach provides a safer way to\\n\\t\\t\\t\\t\\t\\t\\tdeploy changes with the ability to quickly roll back if needed.</p>\\n                     <p>Amazon ECS blue/green deployments are best suited for the following scenarios:</p>\\n                     <ul>\\n                        <li>\\n                           <p>Service validation: When you need to\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tvalidate new service revisions before directing production traffic to\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tthem</p>\\n                        </li>\\n                        <li>\\n                           <p>Zero downtime: When your service\\n\\t\\t\\t\\t\\t\\t\\t\\t\\trequires zero-downtime deployments</p>\\n                        </li>\\n                        <li>\\n                           <p>Instant roll back: When you\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tneed the ability to quickly roll back if issues are detected</p>\\n                        </li>\\n                        <li>\\n                           <p>Load balancer requirement: When your\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tservice uses Application Load Balancer, Network Load Balancer, or Service Connect</p>\\n                        </li>\\n                     </ul>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <p>External</p>\\n               <p>Use a third-party deployment controller.</p>\\n            </li>\\n            <li>\\n               <p>Blue/green deployment (powered by CodeDeploy)</p>\\n               <p>CodeDeploy installs an updated version of the application as a new replacement task\\n\\t\\t\\t\\t\\tset and reroutes production traffic from the original application task set to\\n\\t\\t\\t\\t\\tthe replacement task set. The original task set is terminated after a successful\\n\\t\\t\\t\\t\\tdeployment. Use this deployment controller to verify a new deployment of a service\\n\\t\\t\\t\\t\\tbefore sending production traffic to it.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The deployment controller to use for the service. </p>\"\n            }\n        },\n        \"com.amazonaws.ecs#DeploymentControllerType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ECS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ECS\"\n                    }\n                },\n                \"CODE_DEPLOY\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"CODE_DEPLOY\"\n                    }\n                },\n                \"EXTERNAL\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"EXTERNAL\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ecs#DeploymentEphemeralStorage\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"kmsKeyId\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify an Key Management Service key ID to encrypt the ephemeral storage for\\n\\t\\t\\tdeployment.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The amount of ephemeral storage to allocate for the deployment.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#DeploymentLifecycleHook\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"hookTargetArn\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the hook target. Currently, only Lambda function ARNs are supported.</p>\\n         <p>You must provide this parameter when configuring a deployment lifecycle hook.</p>\"\n                    }\n                },\n                \"roleArn\": {\n                    \"target\": \"com.amazonaws.ecs#IAMRoleArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the IAM role that grants Amazon ECS permission to call Lambda functions on your behalf.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/blue-green-permissions.html\\\">Permissions required\\n            for Lambda functions in Amazon ECS blue/green deployments</a> in the <i>\\n            Amazon Elastic Container Service Developer Guide</i>.</p>\"\n                    }\n                },\n                \"lifecycleStages\": {\n                    \"target\": \"com.amazonaws.ecs#DeploymentLifecycleHookStageList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The lifecycle stages at which to run the hook. Choose from these valid values:</p>\\n         <ul>\\n            <li>\\n               <p>RECONCILE_SERVICE</p>\\n               <p>The reconciliation stage that only happens when you start a new service deployment with more than 1 service revision in an ACTIVE state.</p>\\n               <p>You can use a lifecycle hook for this stage.</p>\\n            </li>\\n            <li>\\n               <p>PRE_SCALE_UP</p>\\n               <p>The green service revision has not started. The blue service revision is handling 100% of the production traffic. There is no test traffic.</p>\\n               <p>You can use a lifecycle hook for this stage.</p>\\n            </li>\\n            <li>\\n               <p>POST_SCALE_UP</p>\\n               <p>The green service revision has started. The blue service revision is handling 100% of the production traffic. There is no test traffic.</p>\\n               <p>You can use a lifecycle hook for this stage.</p>\\n            </li>\\n            <li>\\n               <p>TEST_TRAFFIC_SHIFT</p>\\n               <p>The blue and green service revisions are running. The blue service revision handles 100% of the production traffic. The green service revision is migrating from 0% to 100% of test traffic.</p>\\n               <p>You can use a lifecycle hook for this stage.</p>\\n            </li>\\n            <li>\\n               <p>POST_TEST_TRAFFIC_SHIFT</p>\\n               <p>The test traffic shift is complete. The green service revision handles 100% of the test traffic.</p>\\n               <p>You can use a lifecycle hook for this stage.</p>\\n            </li>\\n            <li>\\n               <p>PRODUCTION_TRAFFIC_SHIFT</p>\\n               <p>Production traffic is shifting to the green service revision. The green service revision is migrating from 0% to 100% of production traffic.</p>\\n               <p>You can use a lifecycle hook for this stage.</p>\\n            </li>\\n            <li>\\n               <p>POST_PRODUCTION_TRAFFIC_SHIFT</p>\\n               <p>The production traffic shift is complete.</p>\\n               <p>You can use a lifecycle hook for this stage.</p>\\n            </li>\\n         </ul>\\n         <p>You must provide this parameter when configuring a deployment lifecycle hook.</p>\"\n                    }\n                },\n                \"hookDetails\": {\n                    \"target\": \"com.amazonaws.ecs#HookDetails\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this field to specify custom parameters that Amazon ECS will pass to your hook target invocations (such as a Lambda function).</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A deployment lifecycle hook runs custom logic at specific stages of the deployment process. Currently, you can use Lambda functions as hook targets.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/deployment-lifecycle-hooks.html\\\">Lifecycle hooks for Amazon ECS service deployments</a> in the <i>\\n            Amazon Elastic Container Service Developer Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#DeploymentLifecycleHookList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#DeploymentLifecycleHook\"\n            }\n        },\n        \"com.amazonaws.ecs#DeploymentLifecycleHookStage\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"RECONCILE_SERVICE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"RECONCILE_SERVICE\"\n                    }\n                },\n                \"PRE_SCALE_UP\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"PRE_SCALE_UP\"\n                    }\n                },\n                \"POST_SCALE_UP\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"POST_SCALE_UP\"\n                    }\n                },\n                \"TEST_TRAFFIC_SHIFT\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"TEST_TRAFFIC_SHIFT\"\n                    }\n                },\n                \"POST_TEST_TRAFFIC_SHIFT\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"POST_TEST_TRAFFIC_SHIFT\"\n                    }\n                },\n                \"PRODUCTION_TRAFFIC_SHIFT\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"PRODUCTION_TRAFFIC_SHIFT\"\n                    }\n                },\n                \"POST_PRODUCTION_TRAFFIC_SHIFT\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"POST_PRODUCTION_TRAFFIC_SHIFT\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ecs#DeploymentLifecycleHookStageList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#DeploymentLifecycleHookStage\"\n            }\n        },\n        \"com.amazonaws.ecs#DeploymentRolloutState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"COMPLETED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"COMPLETED\"\n                    }\n                },\n                \"FAILED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"FAILED\"\n                    }\n                },\n                \"IN_PROGRESS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"IN_PROGRESS\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ecs#DeploymentStrategy\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ROLLING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ROLLING\"\n                    }\n                },\n                \"BLUE_GREEN\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"BLUE_GREEN\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ecs#Deployments\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#Deployment\"\n            }\n        },\n        \"com.amazonaws.ecs#DeregisterContainerInstance\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ecs#DeregisterContainerInstanceRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ecs#DeregisterContainerInstanceResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.ecs#ClientException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ClusterNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ServerException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deregisters an Amazon ECS container instance from the specified cluster. This instance is\\n\\t\\t\\tno longer available to run tasks.</p>\\n         <p>If you intend to use the container instance for some other purpose after\\n\\t\\t\\tderegistration, we recommend that you stop all of the tasks running on the container\\n\\t\\t\\tinstance before deregistration. That prevents any orphaned tasks from consuming\\n\\t\\t\\tresources.</p>\\n         <p>Deregistering a container instance removes the instance from a cluster, but it doesn't\\n\\t\\t\\tterminate the EC2 instance. If you are finished using the instance, be sure to terminate\\n\\t\\t\\tit in the Amazon EC2 console to stop billing.</p>\\n         <note>\\n            <p>If you terminate a running container instance, Amazon ECS automatically deregisters the\\n\\t\\t\\t\\tinstance from your cluster (stopped container instances or instances with\\n\\t\\t\\t\\tdisconnected agents aren't automatically deregistered when terminated).</p>\\n         </note>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To deregister a container instance from a cluster\",\n                        \"documentation\": \"This example deregisters a container instance from the specified cluster in your default region. If there are still tasks running on the container instance, you must either stop those tasks before deregistering, or use the force option.\",\n                        \"input\": {\n                            \"cluster\": \"default\",\n                            \"force\": true,\n                            \"containerInstance\": \"container_instance_UUID\"\n                        },\n                        \"output\": {}\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ecs#DeregisterContainerInstanceRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"cluster\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The short name or full Amazon Resource Name (ARN) of the cluster that hosts the container instance to\\n\\t\\t\\tderegister. If you do not specify a cluster, the default cluster is assumed.</p>\"\n                    }\n                },\n                \"containerInstance\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The container instance ID or full ARN of the container instance to deregister. For\\n\\t\\t\\tmore information about the ARN format, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-account-settings.html#ecs-resource-ids\\\">Amazon Resource Name (ARN)</a> in the <i>Amazon ECS Developer Guide</i>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"force\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedBoolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Forces the container instance to be deregistered. If you have tasks running on the\\n\\t\\t\\tcontainer instance when you deregister it with the <code>force</code> option, these\\n\\t\\t\\ttasks remain running until you terminate the instance or the tasks stop through some\\n\\t\\t\\tother means, but they're orphaned (no longer monitored or accounted for by Amazon ECS). If an\\n\\t\\t\\torphaned task on your container instance is part of an Amazon ECS service, then the service\\n\\t\\t\\tscheduler starts another copy of that task, on a different container instance if\\n\\t\\t\\tpossible. </p>\\n         <p>Any containers in orphaned service tasks that are registered with a Classic Load Balancer or an Application Load Balancer\\n\\t\\t\\ttarget group are deregistered. They begin connection draining according to the settings\\n\\t\\t\\ton the load balancer or target group.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ecs#DeregisterContainerInstanceResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"containerInstance\": {\n                    \"target\": \"com.amazonaws.ecs#ContainerInstance\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The container instance that was deregistered.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ecs#DeregisterTaskDefinition\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ecs#DeregisterTaskDefinitionRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ecs#DeregisterTaskDefinitionResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.ecs#ClientException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ServerException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deregisters the specified task definition by family and revision. Upon deregistration,\\n\\t\\t\\tthe task definition is marked as <code>INACTIVE</code>. Existing tasks and services that\\n\\t\\t\\treference an <code>INACTIVE</code> task definition continue to run without disruption.\\n\\t\\t\\tExisting services that reference an <code>INACTIVE</code> task definition can still\\n\\t\\t\\tscale up or down by modifying the service's desired count. If you want to delete a task\\n\\t\\t\\tdefinition revision, you must first deregister the task definition revision.</p>\\n         <p>You can't use an <code>INACTIVE</code> task definition to run new tasks or create new\\n\\t\\t\\tservices, and you can't update an existing service to reference an <code>INACTIVE</code>\\n\\t\\t\\ttask definition. However, there may be up to a 10-minute window following deregistration\\n\\t\\t\\twhere these restrictions have not yet taken effect.</p>\\n         <note>\\n            <p>At this time, <code>INACTIVE</code> task definitions remain discoverable in your\\n\\t\\t\\t\\taccount indefinitely. However, this behavior is subject to change in the future. We\\n\\t\\t\\t\\tdon't recommend that you rely on <code>INACTIVE</code> task definitions persisting\\n\\t\\t\\t\\tbeyond the lifecycle of any associated tasks and services.</p>\\n         </note>\\n         <p>You must deregister a task definition revision before you delete it. For more\\n\\t\\t\\tinformation, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_DeleteTaskDefinitions.html\\\">DeleteTaskDefinitions</a>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To deregister a revision of a task definition\",\n                        \"documentation\": \"This example deregisters the first revision of the fargate-task task definition\",\n                        \"input\": {\n                            \"taskDefinition\": \"fargate-task:1\"\n                        },\n                        \"output\": {\n                            \"taskDefinition\": {\n                                \"status\": \"INACTIVE\",\n                                \"family\": \"fargate-task\",\n                                \"volumes\": [],\n                                \"taskDefinitionArn\": \"arn:aws:ecs:us-west-2:123456789012:task-definition/fargate-task:1\",\n                                \"containerDefinitions\": [\n                                    {\n                                        \"memory\": 128,\n                                        \"cpu\": 256,\n                                        \"portMappings\": [\n                                            {\n                                                \"hostPort\": 80,\n                                                \"containerPort\": 80,\n                                                \"protocol\": \"tcp\"\n                                            }\n                                        ],\n                                        \"essential\": true,\n                                        \"name\": \"nginx\",\n                                        \"image\": \"public.ecr.aws/docker/library/nginx:latest\"\n                                    }\n                                ]\n                            }\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ecs#DeregisterTaskDefinitionRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"taskDefinition\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>family</code> and <code>revision</code> (<code>family:revision</code>) or\\n\\t\\t\\tfull Amazon Resource Name (ARN) of the task definition to deregister. You must specify a\\n\\t\\t\\t\\t<code>revision</code>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ecs#DeregisterTaskDefinitionResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"taskDefinition\": {\n                    \"target\": \"com.amazonaws.ecs#TaskDefinition\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The full description of the deregistered task.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ecs#DescribeCapacityProviders\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ecs#DescribeCapacityProvidersRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ecs#DescribeCapacityProvidersResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.ecs#ClientException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ClusterNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ServerException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#UnsupportedFeatureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes one or more of your capacity providers.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To describe a specific capacity provider\",\n                        \"documentation\": \"This example retrieves details about the capacity provider MyCapacityProvider\",\n                        \"input\": {\n                            \"capacityProviders\": [\n                                \"MyCapacityProvider\"\n                            ],\n                            \"include\": [\n                                \"TAGS\"\n                            ]\n                        },\n                        \"output\": {\n                            \"capacityProviders\": [\n                                {\n                                    \"capacityProviderArn\": \"arn:aws:ecs:us-west-2:123456789012:capacity-provider/MyCapacityProvider\",\n                                    \"name\": \"MyCapacityProvider\",\n                                    \"status\": \"ACTIVE\",\n                                    \"autoScalingGroupProvider\": {\n                                        \"autoScalingGroupArn\": \"arn:aws:autoscaling:us-west-2:123456789012:autoScalingGroup:a1b2c3d4-5678-90ab-cdef-EXAMPLE11111:autoScalingGroupName/MyAutoScalingGroup\",\n                                        \"managedScaling\": {\n                                            \"status\": \"ENABLED\",\n                                            \"targetCapacity\": 100,\n                                            \"minimumScalingStepSize\": 1,\n                                            \"maximumScalingStepSize\": 1000\n                                        },\n                                        \"managedTerminationProtection\": \"ENABLED\"\n                                    },\n                                    \"tags\": [\n                                        {\n                                            \"key\": \"environment\",\n                                            \"value\": \"production\"\n                                        }\n                                    ]\n                                }\n                            ]\n                        }\n                    },\n                    {\n                        \"title\": \"To describe all capacity providers\",\n                        \"documentation\": \"This example retrieves details about all capacity providers. \",\n                        \"output\": {\n                            \"capacityProviders\": [\n                                {\n                                    \"capacityProviderArn\": \"arn:aws:ecs:us-west-2:123456789012:capacity-provider/MyCapacityProvider\",\n                                    \"name\": \"MyCapacityProvider\",\n                                    \"status\": \"ACTIVE\",\n                                    \"autoScalingGroupProvider\": {\n                                        \"autoScalingGroupArn\": \"arn:aws:autoscaling:us-west-2:123456789012:autoScalingGroup:a1b2c3d4-5678-90ab-cdef-EXAMPLE11111:autoScalingGroupName/MyAutoScalingGroup\",\n                                        \"managedScaling\": {\n                                            \"status\": \"ENABLED\",\n                                            \"targetCapacity\": 100,\n                                            \"minimumScalingStepSize\": 1,\n                                            \"maximumScalingStepSize\": 1000\n                                        },\n                                        \"managedTerminationProtection\": \"ENABLED\"\n                                    },\n                                    \"tags\": []\n                                },\n                                {\n                                    \"capacityProviderArn\": \"arn:aws:ecs:us-west-2:123456789012:capacity-provider/FARGATE\",\n                                    \"name\": \"FARGATE\",\n                                    \"status\": \"ACTIVE\",\n                                    \"tags\": []\n                                },\n                                {\n                                    \"capacityProviderArn\": \"arn:aws:ecs:us-west-2:123456789012:capacity-provider/FARGATE_SPOT\",\n                                    \"name\": \"FARGATE_SPOT\",\n                                    \"status\": \"ACTIVE\",\n                                    \"tags\": []\n                                }\n                            ]\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ecs#DescribeCapacityProvidersRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"capacityProviders\": {\n                    \"target\": \"com.amazonaws.ecs#StringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The short name or full Amazon Resource Name (ARN) of one or more capacity providers. Up to\\n\\t\\t\\t\\t<code>100</code> capacity providers can be described in an action.</p>\"\n                    }\n                },\n                \"cluster\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the cluster to describe capacity providers for. When specified, only capacity providers associated with this cluster are returned, including Amazon ECS Managed Instances capacity providers.</p>\"\n                    }\n                },\n                \"include\": {\n                    \"target\": \"com.amazonaws.ecs#CapacityProviderFieldList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies whether or not you want to see the resource tags for the capacity provider.\\n\\t\\t\\tIf <code>TAGS</code> is specified, the tags are included in the response. If this field\\n\\t\\t\\tis omitted, tags aren't included in the response.</p>\"\n                    }\n                },\n                \"maxResults\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedInteger\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of account setting results returned by\\n\\t\\t\\t\\t<code>DescribeCapacityProviders</code> in paginated output. When this parameter is\\n\\t\\t\\tused, <code>DescribeCapacityProviders</code> only returns <code>maxResults</code>\\n\\t\\t\\tresults in a single page along with a <code>nextToken</code> response element. The\\n\\t\\t\\tremaining results of the initial request can be seen by sending another\\n\\t\\t\\t\\t<code>DescribeCapacityProviders</code> request with the returned\\n\\t\\t\\t\\t<code>nextToken</code> value. This value can be between\\n\\t\\t\\t1 and 10. If this\\n\\t\\t\\tparameter is not used, then <code>DescribeCapacityProviders</code> returns up to\\n\\t\\t\\t10 results and a <code>nextToken</code> value\\n\\t\\t\\tif applicable.</p>\"\n                    }\n                },\n                \"nextToken\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>nextToken</code> value returned from a previous paginated\\n\\t\\t\\t\\t<code>DescribeCapacityProviders</code> request where <code>maxResults</code> was\\n\\t\\t\\tused and the results exceeded the value of that parameter. Pagination continues from the\\n\\t\\t\\tend of the previous results that returned the <code>nextToken</code> value.</p>\\n         <note>\\n            <p>This token should be treated as an opaque identifier that is only used to\\n                retrieve the next items in a list and not for other programmatic purposes.</p>\\n         </note>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ecs#DescribeCapacityProvidersResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"capacityProviders\": {\n                    \"target\": \"com.amazonaws.ecs#CapacityProviders\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The list of capacity providers.</p>\"\n                    }\n                },\n                \"failures\": {\n                    \"target\": \"com.amazonaws.ecs#Failures\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Any failures associated with the call.</p>\"\n                    }\n                },\n                \"nextToken\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>nextToken</code> value to include in a future\\n\\t\\t\\t\\t<code>DescribeCapacityProviders</code> request. When the results of a\\n\\t\\t\\t\\t<code>DescribeCapacityProviders</code> request exceed <code>maxResults</code>, this\\n\\t\\t\\tvalue can be used to retrieve the next page of results. This value is <code>null</code>\\n\\t\\t\\twhen there are no more results to return.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ecs#DescribeClusters\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ecs#DescribeClustersRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ecs#DescribeClustersResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.ecs#ClientException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ServerException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes one or more of your clusters.</p>\\n         <p> For CLI examples, see <a href=\\\"https://github.com/aws/aws-cli/blob/develop/awscli/examples/ecs/describe-clusters.rst\\\">describe-clusters.rst</a> on GitHub.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To describe a cluster\",\n                        \"documentation\": \"This example provides a description of the specified cluster in your default region.\",\n                        \"input\": {\n                            \"clusters\": [\n                                \"default\"\n                            ]\n                        },\n                        \"output\": {\n                            \"clusters\": [\n                                {\n                                    \"clusterName\": \"default\",\n                                    \"status\": \"ACTIVE\",\n                                    \"clusterArn\": \"arn:aws:ecs:us-east-1:aws_account_id:cluster/default\"\n                                }\n                            ],\n                            \"failures\": []\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ecs#DescribeClustersRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"clusters\": {\n                    \"target\": \"com.amazonaws.ecs#StringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of up to 100 cluster names or full cluster Amazon Resource Name (ARN) entries.\\n\\t\\t\\tIf you do not specify a cluster, the default cluster is assumed.</p>\"\n                    }\n                },\n                \"include\": {\n                    \"target\": \"com.amazonaws.ecs#ClusterFieldList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Determines whether to include additional information about the clusters in the\\n\\t\\t\\tresponse. If this field is omitted, this information isn't included.</p>\\n         <p>If <code>ATTACHMENTS</code> is specified, the attachments for the container instances\\n\\t\\t\\tor tasks within the cluster are included, for example the capacity providers.</p>\\n         <p>If <code>SETTINGS</code> is specified, the settings for the cluster are\\n\\t\\t\\tincluded.</p>\\n         <p>If <code>CONFIGURATIONS</code> is specified, the configuration for the cluster is\\n\\t\\t\\tincluded.</p>\\n         <p>If <code>STATISTICS</code> is specified, the task and service count is included,\\n\\t\\t\\tseparated by launch type.</p>\\n         <p>If <code>TAGS</code> is specified, the metadata tags associated with the cluster are\\n\\t\\t\\tincluded.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ecs#DescribeClustersResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"clusters\": {\n                    \"target\": \"com.amazonaws.ecs#Clusters\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The list of clusters.</p>\"\n                    }\n                },\n                \"failures\": {\n                    \"target\": \"com.amazonaws.ecs#Failures\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Any failures associated with the call.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ecs#DescribeContainerInstances\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ecs#DescribeContainerInstancesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ecs#DescribeContainerInstancesResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.ecs#ClientException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ClusterNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ServerException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes one or more container instances. Returns metadata about each container\\n\\t\\t\\tinstance requested.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To describe container instance\",\n                        \"documentation\": \"This example provides a description of the specified container instance in your default region, using the container instance UUID as an identifier.\",\n                        \"input\": {\n                            \"cluster\": \"default\",\n                            \"containerInstances\": [\n                                \"f2756532-8f13-4d53-87c9-aed50dc94cd7\"\n                            ]\n                        },\n                        \"output\": {\n                            \"failures\": [],\n                            \"containerInstances\": [\n                                {\n                                    \"status\": \"ACTIVE\",\n                                    \"registeredResources\": [\n                                        {\n                                            \"doubleValue\": 0.0,\n                                            \"type\": \"INTEGER\",\n                                            \"longValue\": 0,\n                                            \"integerValue\": 2048,\n                                            \"name\": \"CPU\"\n                                        },\n                                        {\n                                            \"doubleValue\": 0.0,\n                                            \"type\": \"INTEGER\",\n                                            \"longValue\": 0,\n                                            \"integerValue\": 3768,\n                                            \"name\": \"MEMORY\"\n                                        },\n                                        {\n                                            \"name\": \"PORTS\",\n                                            \"longValue\": 0,\n                                            \"doubleValue\": 0.0,\n                                            \"stringSetValue\": [\n                                                \"2376\",\n                                                \"22\",\n                                                \"51678\",\n                                                \"2375\"\n                                            ],\n                                            \"type\": \"STRINGSET\",\n                                            \"integerValue\": 0\n                                        }\n                                    ],\n                                    \"ec2InstanceId\": \"i-807f3249\",\n                                    \"agentConnected\": true,\n                                    \"containerInstanceArn\": \"arn:aws:ecs:us-east-1:012345678910:container-instance/default/f2756532-8f13-4d53-87c9-aed50dc94cd7\",\n                                    \"pendingTasksCount\": 0,\n                                    \"remainingResources\": [\n                                        {\n                                            \"doubleValue\": 0.0,\n                                            \"type\": \"INTEGER\",\n                                            \"longValue\": 0,\n                                            \"integerValue\": 1948,\n                                            \"name\": \"CPU\"\n                                        },\n                                        {\n                                            \"doubleValue\": 0.0,\n                                            \"type\": \"INTEGER\",\n                                            \"longValue\": 0,\n                                            \"integerValue\": 3668,\n                                            \"name\": \"MEMORY\"\n                                        },\n                                        {\n                                            \"name\": \"PORTS\",\n                                            \"longValue\": 0,\n                                            \"doubleValue\": 0.0,\n                                            \"stringSetValue\": [\n                                                \"2376\",\n                                                \"22\",\n                                                \"80\",\n                                                \"51678\",\n                                                \"2375\"\n                                            ],\n                                            \"type\": \"STRINGSET\",\n                                            \"integerValue\": 0\n                                        }\n                                    ],\n                                    \"runningTasksCount\": 1\n                                }\n                            ]\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ecs#DescribeContainerInstancesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"cluster\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The short name or full Amazon Resource Name (ARN) of the cluster that hosts the container instances to\\n\\t\\t\\tdescribe. If you do not specify a cluster, the default cluster is assumed. This parameter is required if the container instance\\n\\t\\t\\tor container instances you are describing were launched in any cluster other than the\\n\\t\\t\\tdefault cluster.</p>\"\n                    }\n                },\n                \"containerInstances\": {\n                    \"target\": \"com.amazonaws.ecs#StringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of up to 100 container instance IDs or full Amazon Resource Name (ARN) entries.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"include\": {\n                    \"target\": \"com.amazonaws.ecs#ContainerInstanceFieldList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies whether you want to see the resource tags for the container instance. If\\n\\t\\t\\t\\t<code>TAGS</code> is specified, the tags are included in the response. If\\n\\t\\t\\t\\t<code>CONTAINER_INSTANCE_HEALTH</code> is specified, the container instance health\\n\\t\\t\\tis included in the response. If this field is omitted, tags and container instance\\n\\t\\t\\thealth status aren't included in the response.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ecs#DescribeContainerInstancesResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"containerInstances\": {\n                    \"target\": \"com.amazonaws.ecs#ContainerInstances\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The list of container instances.</p>\"\n                    }\n                },\n                \"failures\": {\n                    \"target\": \"com.amazonaws.ecs#Failures\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Any failures associated with the call.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ecs#DescribeServiceDeployments\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ecs#DescribeServiceDeploymentsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ecs#DescribeServiceDeploymentsResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.ecs#AccessDeniedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ClientException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ClusterNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ServerException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ServiceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#UnsupportedFeatureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes one or more of your service deployments.</p>\\n         <p>A service deployment happens when you release a software update for the service. For\\n\\t\\t\\tmore information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-deployment.html\\\">View service history using Amazon ECS service deployments</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#DescribeServiceDeploymentsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"serviceDeploymentArns\": {\n                    \"target\": \"com.amazonaws.ecs#StringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the service deployment.</p>\\n         <p>You can specify a maximum of 20 ARNs.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ecs#DescribeServiceDeploymentsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"serviceDeployments\": {\n                    \"target\": \"com.amazonaws.ecs#ServiceDeployments\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The list of service deployments described.</p>\"\n                    }\n                },\n                \"failures\": {\n                    \"target\": \"com.amazonaws.ecs#Failures\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Any failures associated with the call.</p>\\n         <p>If you decsribe a deployment with a service revision created before October 25, 2024,\\n\\t\\t\\tthe call fails. The failure includes the service revision ARN and the reason set to\\n\\t\\t\\t\\t<code>MISSING</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ecs#DescribeServiceRevisions\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ecs#DescribeServiceRevisionsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ecs#DescribeServiceRevisionsResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.ecs#AccessDeniedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ClientException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ClusterNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ServerException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ServiceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#UnsupportedFeatureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes one or more service revisions.</p>\\n         <p>A service revision is a version of the service that includes the values for the Amazon\\n\\t\\t\\tECS resources (for example, task definition) and the environment resources (for example,\\n\\t\\t\\tload balancers, subnets, and security groups). For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-revision.html\\\">Amazon ECS service revisions</a>.</p>\\n         <p>You can't describe a service revision that was created before October 25, 2024.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#DescribeServiceRevisionsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"serviceRevisionArns\": {\n                    \"target\": \"com.amazonaws.ecs#StringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the service revision. </p>\\n         <p>You can specify a maximum of 20 ARNs.</p>\\n         <p>You can call <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_ListServiceDeployments.html\\\">ListServiceDeployments</a> to get the ARNs.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ecs#DescribeServiceRevisionsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"serviceRevisions\": {\n                    \"target\": \"com.amazonaws.ecs#ServiceRevisions\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The list of service revisions described.</p>\"\n                    }\n                },\n                \"failures\": {\n                    \"target\": \"com.amazonaws.ecs#Failures\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Any failures associated with the call.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ecs#DescribeServices\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ecs#DescribeServicesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ecs#DescribeServicesResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.ecs#ClientException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ClusterNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ServerException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the specified services running in your cluster.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To describe a service\",\n                        \"documentation\": \"This example provides descriptive information about the service named ``ecs-simple-service``.\",\n                        \"input\": {\n                            \"services\": [\n                                \"ecs-simple-service\"\n                            ]\n                        },\n                        \"output\": {\n                            \"failures\": [],\n                            \"services\": [\n                                {\n                                    \"clusterArn\": \"arn:aws:ecs:us-east-1:012345678910:cluster/default\",\n                                    \"createdAt\": \"2016-08-29T16:25:52.130Z\",\n                                    \"deploymentConfiguration\": {\n                                        \"maximumPercent\": 200,\n                                        \"minimumHealthyPercent\": 100\n                                    },\n                                    \"deployments\": [\n                                        {\n                                            \"createdAt\": \"2016-08-29T16:25:52.130Z\",\n                                            \"desiredCount\": 1,\n                                            \"id\": \"ecs-svc/9223370564341623665\",\n                                            \"pendingCount\": 0,\n                                            \"runningCount\": 0,\n                                            \"status\": \"PRIMARY\",\n                                            \"taskDefinition\": \"arn:aws:ecs:us-east-1:012345678910:task-definition/hello_world:6\",\n                                            \"updatedAt\": \"2016-08-29T16:25:52.130Z\"\n                                        }\n                                    ],\n                                    \"desiredCount\": 1,\n                                    \"events\": [\n                                        {\n                                            \"createdAt\": \"2016-08-29T16:25:58.520Z\",\n                                            \"id\": \"38c285e5-d335-4b68-8b15-e46dedc8e88d\",\n                                            \"message\": \"(service ecs-simple-service) was unable to place a task because no container instance met all of its requirements. The closest matching (container-instance 3f4de1c5-ffdd-4954-af7e-75b4be0c8841) is already using a port required by your task. For more information, see the Troubleshooting section of the Amazon ECS Developer Guide.\"\n                                        }\n                                    ],\n                                    \"loadBalancers\": [],\n                                    \"pendingCount\": 0,\n                                    \"runningCount\": 0,\n                                    \"serviceArn\": \"arn:aws:ecs:us-east-1:012345678910:service/default/ecs-simple-service\",\n                                    \"serviceName\": \"ecs-simple-service\",\n                                    \"status\": \"ACTIVE\",\n                                    \"taskDefinition\": \"arn:aws:ecs:us-east-1:012345678910:task-definition/default/hello_world:6\"\n                                }\n                            ]\n                        }\n                    }\n                ],\n                \"smithy.waiters#waitable\": {\n                    \"ServicesInactive\": {\n                        \"acceptors\": [\n                            {\n                                \"state\": \"failure\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"failures[].reason\",\n                                        \"expected\": \"MISSING\",\n                                        \"comparator\": \"anyStringEquals\"\n                                    }\n                                }\n                            },\n                            {\n                                \"state\": \"success\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"services[].status\",\n                                        \"expected\": \"INACTIVE\",\n                                        \"comparator\": \"anyStringEquals\"\n                                    }\n                                }\n                            }\n                        ],\n                        \"minDelay\": 15\n                    },\n                    \"ServicesStable\": {\n                        \"acceptors\": [\n                            {\n                                \"state\": \"failure\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"failures[].reason\",\n                                        \"expected\": \"MISSING\",\n                                        \"comparator\": \"anyStringEquals\"\n                                    }\n                                }\n                            },\n                            {\n                                \"state\": \"failure\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"services[].status\",\n                                        \"expected\": \"DRAINING\",\n                                        \"comparator\": \"anyStringEquals\"\n                                    }\n                                }\n                            },\n                            {\n                                \"state\": \"failure\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"services[].status\",\n                                        \"expected\": \"INACTIVE\",\n                                        \"comparator\": \"anyStringEquals\"\n                                    }\n                                }\n                            },\n                            {\n                                \"state\": \"success\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"length(services[?!(length(deployments) == `1` && runningCount == desiredCount)]) == `0`\",\n                                        \"expected\": \"true\",\n                                        \"comparator\": \"booleanEquals\"\n                                    }\n                                }\n                            }\n                        ],\n                        \"minDelay\": 15\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ecs#DescribeServicesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"cluster\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The short name or full Amazon Resource Name (ARN)the cluster that hosts the service to describe.\\n\\t\\t\\tIf you do not specify a cluster, the default cluster is assumed. This parameter is required if the service or services you are\\n\\t\\t\\tdescribing were launched in any cluster other than the default cluster.</p>\"\n                    }\n                },\n                \"services\": {\n                    \"target\": \"com.amazonaws.ecs#StringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of services to describe. You may specify up to 10 services to describe in a\\n\\t\\t\\tsingle operation.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"include\": {\n                    \"target\": \"com.amazonaws.ecs#ServiceFieldList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Determines whether you want to see the resource tags for the service. If\\n\\t\\t\\t\\t<code>TAGS</code> is specified, the tags are included in the response. If this field\\n\\t\\t\\tis omitted, tags aren't included in the response.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ecs#DescribeServicesResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"services\": {\n                    \"target\": \"com.amazonaws.ecs#Services\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The list of services described.</p>\"\n                    }\n                },\n                \"failures\": {\n                    \"target\": \"com.amazonaws.ecs#Failures\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Any failures associated with the call.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ecs#DescribeTaskDefinition\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ecs#DescribeTaskDefinitionRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ecs#DescribeTaskDefinitionResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.ecs#ClientException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ServerException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a task definition. You can specify a <code>family</code> and\\n\\t\\t\\t\\t<code>revision</code> to find information about a specific task definition, or you\\n\\t\\t\\tcan simply specify the family to find the latest <code>ACTIVE</code> revision in that\\n\\t\\t\\tfamily.</p>\\n         <note>\\n            <p>You can only describe <code>INACTIVE</code> task definitions while an active task\\n\\t\\t\\t\\tor service references them.</p>\\n         </note>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To describe a task definition\",\n                        \"documentation\": \"This example provides a description of the specified task definition.\",\n                        \"input\": {\n                            \"taskDefinition\": \"hello_world:8\"\n                        },\n                        \"output\": {\n                            \"taskDefinition\": {\n                                \"family\": \"hello_world\",\n                                \"taskDefinitionArn\": \"arn:aws:ecs:us-east-1:<aws_account_id>:task-definition/hello_world:8\",\n                                \"containerDefinitions\": [\n                                    {\n                                        \"mountPoints\": [],\n                                        \"name\": \"wordpress\",\n                                        \"links\": [\n                                            \"mysql\"\n                                        ],\n                                        \"image\": \"wordpress\",\n                                        \"cpu\": 10,\n                                        \"environment\": [],\n                                        \"memory\": 500,\n                                        \"portMappings\": [\n                                            {\n                                                \"containerPort\": 80,\n                                                \"hostPort\": 80\n                                            }\n                                        ],\n                                        \"essential\": true,\n                                        \"volumesFrom\": []\n                                    },\n                                    {\n                                        \"mountPoints\": [],\n                                        \"name\": \"mysql\",\n                                        \"image\": \"mysql\",\n                                        \"cpu\": 10,\n                                        \"environment\": [\n                                            {\n                                                \"name\": \"MYSQL_ROOT_PASSWORD\",\n                                                \"value\": \"password\"\n                                            }\n                                        ],\n                                        \"memory\": 500,\n                                        \"portMappings\": [],\n                                        \"volumesFrom\": [],\n                                        \"essential\": true\n                                    }\n                                ],\n                                \"volumes\": [],\n                                \"revision\": 8\n                            }\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ecs#DescribeTaskDefinitionRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"taskDefinition\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>family</code> for the latest <code>ACTIVE</code> revision,\\n\\t\\t\\t\\t<code>family</code> and <code>revision</code> (<code>family:revision</code>) for a\\n\\t\\t\\tspecific revision in the family, or full Amazon Resource Name (ARN) of the task definition to\\n\\t\\t\\tdescribe.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"include\": {\n                    \"target\": \"com.amazonaws.ecs#TaskDefinitionFieldList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Determines whether to see the resource tags for the task definition. If\\n\\t\\t\\t\\t<code>TAGS</code> is specified, the tags are included in the response. If this field\\n\\t\\t\\tis omitted, tags aren't included in the response.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ecs#DescribeTaskDefinitionResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"taskDefinition\": {\n                    \"target\": \"com.amazonaws.ecs#TaskDefinition\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The full task definition description.</p>\"\n                    }\n                },\n                \"tags\": {\n                    \"target\": \"com.amazonaws.ecs#Tags\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The metadata that's applied to the task definition to help you categorize and organize\\n\\t\\t\\tthem. Each tag consists of a key and an optional value. You define both.</p>\\n         <p>The following basic restrictions apply to tags:</p>\\n         <ul>\\n            <li>\\n               <p>Maximum number of tags per resource - 50</p>\\n            </li>\\n            <li>\\n               <p>For each resource, each tag key must be unique, and each tag key can have only\\n                    one value.</p>\\n            </li>\\n            <li>\\n               <p>Maximum key length - 128 Unicode characters in UTF-8</p>\\n            </li>\\n            <li>\\n               <p>Maximum value length - 256 Unicode characters in UTF-8</p>\\n            </li>\\n            <li>\\n               <p>If your tagging schema is used across multiple services and resources,\\n                    remember that other services may have restrictions on allowed characters.\\n                    Generally allowed characters are: letters, numbers, and spaces representable in\\n                    UTF-8, and the following characters: + - = . _ : / @.</p>\\n            </li>\\n            <li>\\n               <p>Tag keys and values are case-sensitive.</p>\\n            </li>\\n            <li>\\n               <p>Do not use <code>aws:</code>, <code>AWS:</code>, or any upper or lowercase\\n                    combination of such as a prefix for either keys or values as it is reserved for\\n                    Amazon Web Services use. You cannot edit or delete tag keys or values with this prefix. Tags with\\n                    this prefix do not count against your tags per resource limit.</p>\\n            </li>\\n         </ul>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ecs#DescribeTaskSets\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ecs#DescribeTaskSetsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ecs#DescribeTaskSetsResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.ecs#AccessDeniedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ClientException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ClusterNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ServerException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ServiceNotActiveException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ServiceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#UnsupportedFeatureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the task sets in the specified cluster and service. This is used when a\\n\\t\\t\\tservice uses the <code>EXTERNAL</code> deployment controller type. For more information,\\n\\t\\t\\tsee <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/deployment-types.html\\\">Amazon ECS Deployment\\n\\t\\t\\t\\tTypes</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To describe a task set \",\n                        \"documentation\": \"This example describes a task set in service MyService that uses an EXTERNAL deployment controller. \",\n                        \"input\": {\n                            \"cluster\": \"MyCluster\",\n                            \"service\": \"MyService\",\n                            \"taskSets\": [\n                                \"arn:aws:ecs:us-west-2:123456789012:task-set/MyCluster/MyService/ecs-svc/1234567890123456789\"\n                            ]\n                        },\n                        \"output\": {\n                            \"taskSets\": [\n                                {\n                                    \"id\": \"ecs-svc/1234567890123456789\",\n                                    \"taskSetArn\": \"arn:aws:ecs:us-west-2:123456789012:task-set/MyCluster/MyService/ecs-svc/1234567890123456789\",\n                                    \"status\": \"ACTIVE\",\n                                    \"taskDefinition\": \"arn:aws:ecs:us-west-2:123456789012:task-definition/sample-fargate:2\",\n                                    \"computedDesiredCount\": 0,\n                                    \"pendingCount\": 0,\n                                    \"runningCount\": 0,\n                                    \"createdAt\": 1.557207715195E9,\n                                    \"updatedAt\": 1.557207740014E9,\n                                    \"launchType\": \"EC2\",\n                                    \"networkConfiguration\": {\n                                        \"awsvpcConfiguration\": {\n                                            \"subnets\": [\n                                                \"subnet-12344321\"\n                                            ],\n                                            \"securityGroups\": [\n                                                \"sg-1234431\"\n                                            ],\n                                            \"assignPublicIp\": \"DISABLED\"\n                                        }\n                                    },\n                                    \"loadBalancers\": [],\n                                    \"serviceRegistries\": [],\n                                    \"scale\": {\n                                        \"value\": 0,\n                                        \"unit\": \"PERCENT\"\n                                    },\n                                    \"stabilityStatus\": \"STEADY_STATE\",\n                                    \"stabilityStatusAt\": 1.557207740014E9\n                                }\n                            ],\n                            \"failures\": []\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ecs#DescribeTaskSetsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"cluster\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The short name or full Amazon Resource Name (ARN) of the cluster that hosts the service that the task\\n\\t\\t\\tsets exist in.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"service\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The short name or full Amazon Resource Name (ARN) of the service that the task sets exist in.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"taskSets\": {\n                    \"target\": \"com.amazonaws.ecs#StringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID or full Amazon Resource Name (ARN) of task sets to\\n\\t\\t\\tdescribe.</p>\"\n                    }\n                },\n                \"include\": {\n                    \"target\": \"com.amazonaws.ecs#TaskSetFieldList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies whether to see the resource tags for the task set. If <code>TAGS</code> is\\n\\t\\t\\tspecified, the tags are included in the response. If this field is omitted, tags aren't\\n\\t\\t\\tincluded in the response.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ecs#DescribeTaskSetsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"taskSets\": {\n                    \"target\": \"com.amazonaws.ecs#TaskSets\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The list of task sets described.</p>\"\n                    }\n                },\n                \"failures\": {\n                    \"target\": \"com.amazonaws.ecs#Failures\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Any failures associated with the call.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ecs#DescribeTasks\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ecs#DescribeTasksRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ecs#DescribeTasksResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.ecs#ClientException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ClusterNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ServerException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes a specified task or tasks.</p>\\n         <p>Currently, stopped tasks appear in the returned results for at least one hour.</p>\\n         <p>If you have tasks with tags, and then delete the cluster, the tagged tasks are\\n\\t\\t\\treturned in the response. If you create a new cluster with the same name as the deleted\\n\\t\\t\\tcluster, the tagged tasks are not included in the response.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To describe a task\",\n                        \"documentation\": \"This example provides a description of the specified task, using the task UUID as an identifier.\",\n                        \"input\": {\n                            \"tasks\": [\n                                \"c5cba4eb-5dad-405e-96db-71ef8eefe6a8\"\n                            ]\n                        },\n                        \"output\": {\n                            \"failures\": [],\n                            \"tasks\": [\n                                {\n                                    \"taskArn\": \"arn:aws:ecs:<region>:<aws_account_id>:task/default/c5cba4eb-5dad-405e-96db-71ef8eefe6a8\",\n                                    \"overrides\": {\n                                        \"containerOverrides\": [\n                                            {\n                                                \"name\": \"ecs-demo\"\n                                            }\n                                        ]\n                                    },\n                                    \"lastStatus\": \"RUNNING\",\n                                    \"containerInstanceArn\": \"arn:aws:ecs:<region>:<aws_account_id>:container-instance/default/18f9eda5-27d7-4c19-b133-45adc516e8fb\",\n                                    \"clusterArn\": \"arn:aws:ecs:<region>:<aws_account_id>:cluster/default\",\n                                    \"desiredStatus\": \"RUNNING\",\n                                    \"taskDefinitionArn\": \"arn:aws:ecs:<region>:<aws_account_id>:task-definition/amazon-ecs-sample:1\",\n                                    \"startedBy\": \"ecs-svc/9223370608528463088\",\n                                    \"containers\": [\n                                        {\n                                            \"containerArn\": \"arn:aws:ecs:<region>:<aws_account_id>:container/7c01765b-c588-45b3-8290-4ba38bd6c5a6\",\n                                            \"taskArn\": \"arn:aws:ecs:<region>:<aws_account_id>:task/default/c5cba4eb-5dad-405e-96db-71ef8eefe6a8\",\n                                            \"lastStatus\": \"RUNNING\",\n                                            \"name\": \"ecs-demo\",\n                                            \"networkBindings\": [\n                                                {\n                                                    \"bindIP\": \"0.0.0.0\",\n                                                    \"containerPort\": 80,\n                                                    \"hostPort\": 80\n                                                }\n                                            ]\n                                        }\n                                    ]\n                                }\n                            ]\n                        }\n                    }\n                ],\n                \"smithy.waiters#waitable\": {\n                    \"TasksRunning\": {\n                        \"acceptors\": [\n                            {\n                                \"state\": \"failure\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"tasks[].lastStatus\",\n                                        \"expected\": \"STOPPED\",\n                                        \"comparator\": \"anyStringEquals\"\n                                    }\n                                }\n                            },\n                            {\n                                \"state\": \"failure\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"failures[].reason\",\n                                        \"expected\": \"MISSING\",\n                                        \"comparator\": \"anyStringEquals\"\n                                    }\n                                }\n                            },\n                            {\n                                \"state\": \"success\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"tasks[].lastStatus\",\n                                        \"expected\": \"RUNNING\",\n                                        \"comparator\": \"allStringEquals\"\n                                    }\n                                }\n                            }\n                        ],\n                        \"minDelay\": 6\n                    },\n                    \"TasksStopped\": {\n                        \"acceptors\": [\n                            {\n                                \"state\": \"success\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"tasks[].lastStatus\",\n                                        \"expected\": \"STOPPED\",\n                                        \"comparator\": \"allStringEquals\"\n                                    }\n                                }\n                            }\n                        ],\n                        \"minDelay\": 6\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ecs#DescribeTasksRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"cluster\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The short name or full Amazon Resource Name (ARN) of the cluster that hosts the task or tasks to\\n\\t\\t\\tdescribe. If you do not specify a cluster, the default cluster is assumed.</p>\"\n                    }\n                },\n                \"tasks\": {\n                    \"target\": \"com.amazonaws.ecs#StringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of up to 100 task IDs or full ARN entries.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"include\": {\n                    \"target\": \"com.amazonaws.ecs#TaskFieldList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies whether you want to see the resource tags for the task. If <code>TAGS</code>\\n\\t\\t\\tis specified, the tags are included in the response. If this field is omitted, tags\\n\\t\\t\\taren't included in the response.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ecs#DescribeTasksResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"tasks\": {\n                    \"target\": \"com.amazonaws.ecs#Tasks\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The list of tasks.</p>\"\n                    }\n                },\n                \"failures\": {\n                    \"target\": \"com.amazonaws.ecs#Failures\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Any failures associated with the call.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ecs#DesiredStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"RUNNING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"RUNNING\"\n                    }\n                },\n                \"PENDING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"PENDING\"\n                    }\n                },\n                \"STOPPED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"STOPPED\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ecs#Device\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"hostPath\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The path for the device on the host container instance.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"containerPath\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The path inside the container at which to expose the host device.</p>\"\n                    }\n                },\n                \"permissions\": {\n                    \"target\": \"com.amazonaws.ecs#DeviceCgroupPermissions\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The explicit permissions to provide to the container for the device. By default, the\\n\\t\\t\\tcontainer has permissions for <code>read</code>, <code>write</code>, and\\n\\t\\t\\t\\t<code>mknod</code> for the device.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>An object representing a container instance host device.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#DeviceCgroupPermission\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"READ\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"read\"\n                    }\n                },\n                \"WRITE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"write\"\n                    }\n                },\n                \"MKNOD\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"mknod\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ecs#DeviceCgroupPermissions\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#DeviceCgroupPermission\"\n            }\n        },\n        \"com.amazonaws.ecs#DevicesList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#Device\"\n            }\n        },\n        \"com.amazonaws.ecs#DiscoverPollEndpoint\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ecs#DiscoverPollEndpointRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ecs#DiscoverPollEndpointResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.ecs#ClientException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ServerException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>This action is only used by the Amazon ECS agent, and it is not intended for use outside of the agent.</p>\\n         </note>\\n         <p>Returns an endpoint for the Amazon ECS agent to poll for updates.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#DiscoverPollEndpointRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"containerInstance\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The container instance ID or full ARN of the container instance. For more\\n\\t\\t\\tinformation about the ARN format, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-account-settings.html#ecs-resource-ids\\\">Amazon Resource Name (ARN)</a> in the <i>Amazon ECS Developer Guide</i>.</p>\"\n                    }\n                },\n                \"cluster\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The short name or full Amazon Resource Name (ARN) of the cluster that the container instance belongs\\n\\t\\t\\tto.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ecs#DiscoverPollEndpointResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"endpoint\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The endpoint for the Amazon ECS agent to poll.</p>\"\n                    }\n                },\n                \"telemetryEndpoint\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The telemetry endpoint for the Amazon ECS agent.</p>\"\n                    }\n                },\n                \"serviceConnectEndpoint\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The endpoint for the Amazon ECS agent to poll for Service Connect configuration.\\n\\t\\t\\tFor more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-connect.html\\\">Service Connect</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ecs#DockerLabelsMap\": {\n            \"type\": \"map\",\n            \"key\": {\n                \"target\": \"com.amazonaws.ecs#String\"\n            },\n            \"value\": {\n                \"target\": \"com.amazonaws.ecs#String\"\n            }\n        },\n        \"com.amazonaws.ecs#DockerVolumeConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"scope\": {\n                    \"target\": \"com.amazonaws.ecs#Scope\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The scope for the Docker volume that determines its lifecycle. Docker volumes that are\\n\\t\\t\\tscoped to a <code>task</code> are automatically provisioned when the task starts and\\n\\t\\t\\tdestroyed when the task stops. Docker volumes that are scoped as <code>shared</code>\\n\\t\\t\\tpersist after the task stops.</p>\"\n                    }\n                },\n                \"autoprovision\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedBoolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If this value is <code>true</code>, the Docker volume is created if it doesn't already\\n\\t\\t\\texist.</p>\\n         <note>\\n            <p>This field is only used if the <code>scope</code> is <code>shared</code>.</p>\\n         </note>\"\n                    }\n                },\n                \"driver\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Docker volume driver to use. The driver value must match the driver name provided\\n\\t\\t\\tby Docker because it is used for task placement. If the driver was installed using the\\n\\t\\t\\tDocker plugin CLI, use <code>docker plugin ls</code> to retrieve the driver name from\\n\\t\\t\\tyour container instance. If the driver was installed using another method, use Docker\\n\\t\\t\\tplugin discovery to retrieve the driver name. This parameter maps to <code>Driver</code>\\n\\t\\t\\tin the docker container create command and the <code>xxdriver</code> option to docker\\n\\t\\t\\tvolume create.</p>\"\n                    }\n                },\n                \"driverOpts\": {\n                    \"target\": \"com.amazonaws.ecs#StringMap\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A map of Docker driver-specific options passed through. This parameter maps to\\n\\t\\t\\t\\t<code>DriverOpts</code> in the docker create-volume command and the\\n\\t\\t\\t\\t<code>xxopt</code> option to docker volume create.</p>\"\n                    }\n                },\n                \"labels\": {\n                    \"target\": \"com.amazonaws.ecs#StringMap\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Custom metadata to add to your Docker volume. This parameter maps to\\n\\t\\t\\t\\t<code>Labels</code> in the docker container create command and the\\n\\t\\t\\t\\t<code>xxlabel</code> option to docker volume create.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This parameter is specified when you're using Docker volumes. Docker volumes are only\\n\\t\\t\\tsupported when you're using the EC2 launch type. Windows containers only\\n\\t\\t\\tsupport the use of the <code>local</code> driver. To use bind mounts, specify a\\n\\t\\t\\t\\t<code>host</code> instead.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#Double\": {\n            \"type\": \"double\",\n            \"traits\": {\n                \"smithy.api#default\": 0\n            }\n        },\n        \"com.amazonaws.ecs#Duration\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 0,\n                    \"max\": 2147483647\n                }\n            }\n        },\n        \"com.amazonaws.ecs#EBSKMSKeyId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ecs#EBSResourceType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"VOLUME\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"volume\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ecs#EBSSnapshotId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ecs#EBSTagSpecification\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"resourceType\": {\n                    \"target\": \"com.amazonaws.ecs#EBSResourceType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of volume resource.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"tags\": {\n                    \"target\": \"com.amazonaws.ecs#Tags\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags applied to this Amazon EBS volume. <code>AmazonECSCreated</code> and\\n\\t\\t\\t\\t<code>AmazonECSManaged</code> are reserved tags that can't be used.</p>\"\n                    }\n                },\n                \"propagateTags\": {\n                    \"target\": \"com.amazonaws.ecs#PropagateTags\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Determines whether to propagate the tags from the task definition to \\u2028the Amazon EBS\\n\\t\\t\\tvolume. Tags can only propagate to a <code>SERVICE</code> specified in\\n\\t\\t\\t\\t\\u2028<code>ServiceVolumeConfiguration</code>. If no value is specified, the tags aren't\\n\\t\\t\\t\\u2028propagated.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The tag specifications of an Amazon EBS volume.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#EBSTagSpecifications\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#EBSTagSpecification\"\n            }\n        },\n        \"com.amazonaws.ecs#EBSVolumeType\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ecs#ECSVolumeName\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ecs#EFSAuthorizationConfig\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"accessPointId\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon EFS access point ID to use. If an access point is specified, the root directory\\n\\t\\t\\tvalue specified in the <code>EFSVolumeConfiguration</code> must either be omitted or set\\n\\t\\t\\tto <code>/</code> which will enforce the path set on the EFS access point. If an access\\n\\t\\t\\tpoint is used, transit encryption must be on in the <code>EFSVolumeConfiguration</code>.\\n\\t\\t\\tFor more information, see <a href=\\\"https://docs.aws.amazon.com/efs/latest/ug/efs-access-points.html\\\">Working with Amazon EFS access\\n\\t\\t\\t\\tpoints</a> in the <i>Amazon Elastic File System User Guide</i>.</p>\"\n                    }\n                },\n                \"iam\": {\n                    \"target\": \"com.amazonaws.ecs#EFSAuthorizationConfigIAM\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Determines whether to use the Amazon ECS task role defined in a task definition when\\n\\t\\t\\tmounting the Amazon EFS file system. If it is turned on, transit encryption must be turned on\\n\\t\\t\\tin the <code>EFSVolumeConfiguration</code>. If this parameter is omitted, the default\\n\\t\\t\\tvalue of <code>DISABLED</code> is used. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/efs-volumes.html#efs-volume-accesspoints\\\">Using\\n\\t\\t\\t\\tAmazon EFS access points</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The authorization configuration details for the Amazon EFS file system.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#EFSAuthorizationConfigIAM\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ENABLED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ENABLED\"\n                    }\n                },\n                \"DISABLED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DISABLED\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ecs#EFSTransitEncryption\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ENABLED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ENABLED\"\n                    }\n                },\n                \"DISABLED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DISABLED\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ecs#EFSVolumeConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"fileSystemId\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon EFS file system ID to use.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"rootDirectory\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The directory within the Amazon EFS file system to mount as the root directory inside the\\n\\t\\t\\thost. If this parameter is omitted, the root of the Amazon EFS volume will be used.\\n\\t\\t\\tSpecifying <code>/</code> will have the same effect as omitting this parameter.</p>\\n         <important>\\n            <p>If an EFS access point is specified in the <code>authorizationConfig</code>, the\\n\\t\\t\\t\\troot directory parameter must either be omitted or set to <code>/</code> which will\\n\\t\\t\\t\\tenforce the path set on the EFS access point.</p>\\n         </important>\"\n                    }\n                },\n                \"transitEncryption\": {\n                    \"target\": \"com.amazonaws.ecs#EFSTransitEncryption\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Determines whether to use encryption for Amazon EFS data in transit between the Amazon ECS host\\n\\t\\t\\tand the Amazon EFS server. Transit encryption must be turned on if Amazon EFS IAM authorization\\n\\t\\t\\tis used. If this parameter is omitted, the default value of <code>DISABLED</code> is\\n\\t\\t\\tused. For more information, see <a href=\\\"https://docs.aws.amazon.com/efs/latest/ug/encryption-in-transit.html\\\">Encrypting data in transit</a> in\\n\\t\\t\\tthe <i>Amazon Elastic File System User Guide</i>.</p>\"\n                    }\n                },\n                \"transitEncryptionPort\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedInteger\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The port to use when sending encrypted data between the Amazon ECS host and the Amazon EFS\\n\\t\\t\\tserver. If you do not specify a transit encryption port, it will use the port selection\\n\\t\\t\\tstrategy that the Amazon EFS mount helper uses. For more information, see <a href=\\\"https://docs.aws.amazon.com/efs/latest/ug/efs-mount-helper.html\\\">EFS mount\\n\\t\\t\\t\\thelper</a> in the <i>Amazon Elastic File System User Guide</i>.</p>\"\n                    }\n                },\n                \"authorizationConfig\": {\n                    \"target\": \"com.amazonaws.ecs#EFSAuthorizationConfig\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The authorization configuration details for the Amazon EFS file system.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This parameter is specified when you're using an Amazon Elastic File System file system for task\\n\\t\\t\\tstorage. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/efs-volumes.html\\\">Amazon EFS volumes</a> in the\\n\\t\\t\\t<i>Amazon Elastic Container Service Developer Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#EnvironmentFile\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"value\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the Amazon S3 object containing the environment\\n\\t\\t\\tvariable file.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"type\": {\n                    \"target\": \"com.amazonaws.ecs#EnvironmentFileType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The file type to use. Environment files are objects in Amazon S3. The only supported value\\n\\t\\t\\tis <code>s3</code>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A list of files containing the environment variables to pass to a container. You can\\n\\t\\t\\tspecify up to ten environment files. The file must have a <code>.env</code> file\\n\\t\\t\\textension. Each line in an environment file should contain an environment variable in\\n\\t\\t\\t\\t<code>VARIABLE=VALUE</code> format. Lines beginning with <code>#</code> are treated\\n\\t\\t\\tas comments and are ignored.</p>\\n         <p>If there are environment variables specified using the <code>environment</code>\\n\\t\\t\\tparameter in a container definition, they take precedence over the variables contained\\n\\t\\t\\twithin an environment file. If multiple environment files are specified that contain the\\n\\t\\t\\tsame variable, they're processed from the top down. We recommend that you use unique\\n\\t\\t\\tvariable names. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/use-environment-file.html\\\">Use a file to pass\\n\\t\\t\\t\\tenvironment variables to a container</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\\n         <p>Environment variable files are objects in Amazon S3 and all Amazon S3 security considerations\\n\\t\\t\\tapply. </p>\\n         <p>You must use the following platforms for the Fargate launch type:</p>\\n         <ul>\\n            <li>\\n               <p>Linux platform version <code>1.4.0</code> or later.</p>\\n            </li>\\n            <li>\\n               <p>Windows platform version <code>1.0.0</code> or later.</p>\\n            </li>\\n         </ul>\\n         <p>Consider the following when using the Fargate launch type:</p>\\n         <ul>\\n            <li>\\n               <p>The file is handled like a native Docker env-file.</p>\\n            </li>\\n            <li>\\n               <p>There is no support for shell escape handling.</p>\\n            </li>\\n            <li>\\n               <p>The container entry point interperts the <code>VARIABLE</code> values.</p>\\n            </li>\\n         </ul>\"\n            }\n        },\n        \"com.amazonaws.ecs#EnvironmentFileType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"S3\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"s3\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ecs#EnvironmentFiles\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#EnvironmentFile\"\n            }\n        },\n        \"com.amazonaws.ecs#EnvironmentVariables\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#KeyValuePair\"\n            }\n        },\n        \"com.amazonaws.ecs#EphemeralStorage\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"sizeInGiB\": {\n                    \"target\": \"com.amazonaws.ecs#Integer\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The total amount, in GiB, of ephemeral storage to set for the task. The minimum\\n\\t\\t\\tsupported value is <code>21</code> GiB and the maximum supported value is\\n\\t\\t\\t\\t<code>200</code> GiB.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The amount of ephemeral storage to allocate for the task. This parameter is used to\\n\\t\\t\\texpand the total amount of ephemeral storage available, beyond the default amount, for\\n\\t\\t\\ttasks hosted on Fargate. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/using_data_volumes.html\\\">Using data volumes in\\n\\t\\t\\t\\ttasks</a> in the <i>Amazon ECS Developer Guide;</i>.</p>\\n         <note>\\n            <p>For tasks using the Fargate launch type, the task requires the\\n\\t\\t\\t\\tfollowing platforms:</p>\\n            <ul>\\n               <li>\\n                  <p>Linux platform version <code>1.4.0</code> or later.</p>\\n               </li>\\n               <li>\\n                  <p>Windows platform version <code>1.0.0</code> or later.</p>\\n               </li>\\n            </ul>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.ecs#ExcludedInstanceType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 30\n                },\n                \"smithy.api#pattern\": \"^[a-zA-Z0-9\\\\.\\\\*\\\\-]+$\"\n            }\n        },\n        \"com.amazonaws.ecs#ExcludedInstanceTypeSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#ExcludedInstanceType\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 400\n                }\n            }\n        },\n        \"com.amazonaws.ecs#ExecuteCommand\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ecs#ExecuteCommandRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ecs#ExecuteCommandResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.ecs#AccessDeniedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ClientException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ClusterNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ServerException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#TargetNotConnectedException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Runs a command remotely on a container within a task.</p>\\n         <p>If you use a condition key in your IAM policy to refine the conditions for the\\n\\t\\t\\tpolicy statement, for example limit the actions to a specific cluster, you receive an\\n\\t\\t\\t\\t<code>AccessDeniedException</code> when there is a mismatch between the condition\\n\\t\\t\\tkey value and the corresponding parameter value.</p>\\n         <p>For information about required permissions and considerations, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-exec.html\\\">Using Amazon ECS\\n\\t\\t\\t\\tExec for debugging</a> in the <i>Amazon ECS Developer Guide</i>.\\n\\t\\t</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To run a command remotely on a container in a task\",\n                        \"documentation\": \"This example runs an interactive /bin/sh command on a container MyContainer. \",\n                        \"input\": {\n                            \"cluster\": \"MyCluster\",\n                            \"container\": \"MyContainer\",\n                            \"command\": \"/bin/sh\",\n                            \"interactive\": true,\n                            \"task\": \"arn:aws:ecs:us-east-1:123456789012:task/MyCluster/d789e94343414c25b9f6bd59eEXAMPLE\"\n                        },\n                        \"output\": {\n                            \"clusterArn\": \"arn:aws:ecs:us-east-1:123456789012:cluster/MyCluster\",\n                            \"containerArn\": \"arn:aws:ecs:us-east-1:123456789012:container/MyCluster/d789e94343414c25b9f6bd59eEXAMPLE/43ba4b77-37f7-4a41-b923-69d4abEXAMPLE\",\n                            \"containerName\": \"MyContainer\",\n                            \"interactive\": true,\n                            \"session\": {\n                                \"sessionId\": \"ecs-execute-command-794nnsxobsg4p2hiur6gxu9a9e\",\n                                \"streamUrl\": \"wss://ssmmessages.us-east-1.amazonaws.com/v1/data-channel/ecs-execute-command-794nnsxobsg4p2hiur6gxu9a9e?role=publish_subscribe&cell-number=AAEAAfiZG4oybxqsYj3Zhm15s4J0W1k7d9nxVRenNO8Kl5nzAAAAAGdbWGl479/y/4IrTWPadUic3eBrMu3vmB7aPvI+s12lbpDc142y1KZy\",\n                                \"tokenValue\": \"AAEAAcVb7ww10N9aNUI5Cl7K7DbHjbD2Ed4Mw6uaGYIc+UFNAAAAAGdbWGmMDaPbGfDkzrVIhyKEsc4CPT2hcToPU6yzlddPm7rRZvYQtpaAgsvQdjbCAd9OB6ohtDYfqZI9gzMqLKegXq0E+KbDcGPnQVODFNHmQxnR1BvC6vNcHqh6HAJuKnQD7RSYx/J5bfYNHj4hCYHuN0HNcueSDOOTRB/MBt5DBDY7Djv2uzs9FD0N1kcsGljZkZWLuPTVKHHyrU3zh0awfrFFC3RXvgaUCBnloIIvZeq2CjTesxn9JJS+3N4I0DVxfkHdWWBbBY/5+wH82JVTJpqN3yOAt74u/W7TvYBd7Xu2lQbvtpuAnEszl++bFG2ZoV3dfnmBkSnfD/qV1FJcEskbxUHKgmqe0Paouv4zwrQKNfWYfcv9xkWskqcExh07IeaxZz1tp/WegZ5D76sD6xYeuH+35TMNXMoY7oudLgxIXsA7b39ElM7orGi4Jy3W2tLyuNIvDoI2JI6ww4tYdEjYZnld9rhKwV9rDHk1Z8wjHMs++3BIkHrFQRsv7BFUWlZ9lyqO9GWlXeBe7dQtOeFNahBuJUE9z/xLHJn1x13VkdROKqUVHTJrT4sXAnI5roWiGPoQPVY7aHVYJnwjSxrPRWJBsgyHiVN3dAWTmeVMjp0VbOiJaLlpBI+AUWs8OeVRzuJSZ+1alETpK7Ukag7ma9K4lxq/N7IxYo2ub0cG/bvX42zQqdJAW+9St9sQ1QMaMvkSq1tdbLoOuY0QjN7JrkuKLFQA5bhs+o1YwItzIp7bNrzQ9Z9IN51qoGL5HDXQzi1kNFfYtAryhwt6BgtQU9Z0k+RpE+V5G+V68E0MMUvb313f0nRBYj1u5VKonWb708wADPbUU+s7nvbWuD5oLp1Z6A4iqI9Om0R4RrFASj/7fVY7r3raNXcIYA=\"\n                            },\n                            \"taskArn\": \"arn:aws:ecs:us-east-1:123456789012:task/MyCluster/d789e94343414c25b9f6bd59eEXAMPLE\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ecs#ExecuteCommandConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"kmsKeyId\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify an Key Management Service key ID to encrypt the data between the local client\\n\\t\\t\\tand the container.</p>\"\n                    }\n                },\n                \"logging\": {\n                    \"target\": \"com.amazonaws.ecs#ExecuteCommandLogging\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The log setting to use for redirecting logs for your execute command results. The\\n\\t\\t\\tfollowing log settings are available.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>NONE</code>: The execute command session is not logged.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>DEFAULT</code>: The <code>awslogs</code> configuration in the task\\n\\t\\t\\t\\t\\tdefinition is used. If no logging parameter is specified, it defaults to this\\n\\t\\t\\t\\t\\tvalue. If no <code>awslogs</code> log driver is configured in the task\\n\\t\\t\\t\\t\\tdefinition, the output won't be logged.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>OVERRIDE</code>: Specify the logging details as a part of\\n\\t\\t\\t\\t\\t\\t<code>logConfiguration</code>. If the <code>OVERRIDE</code> logging option\\n\\t\\t\\t\\t\\tis specified, the <code>logConfiguration</code> is required.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"logConfiguration\": {\n                    \"target\": \"com.amazonaws.ecs#ExecuteCommandLogConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The log configuration for the results of the execute command actions. The logs can be\\n\\t\\t\\tsent to CloudWatch Logs or an Amazon S3 bucket. When <code>logging=OVERRIDE</code> is\\n\\t\\t\\tspecified, a <code>logConfiguration</code> must be provided.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The details of the execute command configuration.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#ExecuteCommandLogConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"cloudWatchLogGroupName\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the CloudWatch log group to send logs to.</p>\\n         <note>\\n            <p>The CloudWatch log group must already be created.</p>\\n         </note>\"\n                    }\n                },\n                \"cloudWatchEncryptionEnabled\": {\n                    \"target\": \"com.amazonaws.ecs#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Determines whether to use encryption on the CloudWatch logs. If not specified,\\n\\t\\t\\tencryption will be off.</p>\"\n                    }\n                },\n                \"s3BucketName\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the S3 bucket to send logs to.</p>\\n         <note>\\n            <p>The S3 bucket must already be created.</p>\\n         </note>\"\n                    }\n                },\n                \"s3EncryptionEnabled\": {\n                    \"target\": \"com.amazonaws.ecs#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Determines whether to use encryption on the S3 logs. If not specified, encryption is\\n\\t\\t\\tnot used.</p>\"\n                    }\n                },\n                \"s3KeyPrefix\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An optional folder in the S3 bucket to place logs in.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The log configuration for the results of the execute command actions. The logs can be\\n\\t\\t\\tsent to CloudWatch Logs or an Amazon S3 bucket.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#ExecuteCommandLogging\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"NONE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"NONE\"\n                    }\n                },\n                \"DEFAULT\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DEFAULT\"\n                    }\n                },\n                \"OVERRIDE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"OVERRIDE\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ecs#ExecuteCommandRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"cluster\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) or short name of the cluster the task is running in.\\n\\t\\t\\tIf you do not specify a cluster, the default cluster is assumed.</p>\"\n                    }\n                },\n                \"container\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the container to execute the command on. A container name only needs to be\\n\\t\\t\\tspecified for tasks containing multiple containers.</p>\"\n                    }\n                },\n                \"command\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The command to run on the container.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"interactive\": {\n                    \"target\": \"com.amazonaws.ecs#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Use this flag to run your command in interactive mode.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"task\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) or ID of the task the container is part of.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ecs#ExecuteCommandResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"clusterArn\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the cluster.</p>\"\n                    }\n                },\n                \"containerArn\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the container.</p>\"\n                    }\n                },\n                \"containerName\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the container.</p>\"\n                    }\n                },\n                \"interactive\": {\n                    \"target\": \"com.amazonaws.ecs#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Determines whether the execute command session is running in interactive mode. Amazon ECS\\n\\t\\t\\tonly supports initiating interactive sessions, so you must specify <code>true</code> for\\n\\t\\t\\tthis value.</p>\"\n                    }\n                },\n                \"session\": {\n                    \"target\": \"com.amazonaws.ecs#Session\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The details of the SSM session that was created for this instance of\\n\\t\\t\\texecute-command.</p>\"\n                    }\n                },\n                \"taskArn\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the task.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ecs#FSxWindowsFileServerAuthorizationConfig\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"credentialsParameter\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The authorization credential option to use. The authorization credential options can\\n\\t\\t\\tbe provided using either the Amazon Resource Name (ARN) of an Secrets Manager secret or SSM Parameter Store\\n\\t\\t\\tparameter. The ARN refers to the stored credentials.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"domain\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A fully qualified domain name hosted by an <a href=\\\"https://docs.aws.amazon.com/directoryservice/latest/admin-guide/directory_microsoft_ad.html\\\">Directory Service</a> Managed Microsoft AD (Active Directory) or self-hosted AD on\\n\\t\\t\\tAmazon EC2.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The authorization configuration details for Amazon FSx for Windows File Server file system. See <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_FSxWindowsFileServerVolumeConfiguration.html\\\">FSxWindowsFileServerVolumeConfiguration</a> in the <i>Amazon ECS API\\n\\t\\t\\t\\tReference</i>.</p>\\n         <p>For more information and the input format, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/wfsx-volumes.html\\\">Amazon FSx for Windows File Server Volumes</a>\\n\\t\\t\\tin the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#FSxWindowsFileServerVolumeConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"fileSystemId\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon FSx for Windows File Server file system ID to use.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"rootDirectory\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The directory within the Amazon FSx for Windows File Server file system to mount as the root directory\\n\\t\\t\\tinside the host.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"authorizationConfig\": {\n                    \"target\": \"com.amazonaws.ecs#FSxWindowsFileServerAuthorizationConfig\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The authorization configuration details for the Amazon FSx for Windows File Server file system.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This parameter is specified when you're using <a href=\\\"https://docs.aws.amazon.com/fsx/latest/WindowsGuide/what-is.html\\\">Amazon FSx for Windows File Server</a> file system for task\\n\\t\\t\\tstorage.</p>\\n         <p>For more information and the input format, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/wfsx-volumes.html\\\">Amazon FSx for Windows File Server volumes</a>\\n\\t\\t\\tin the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#Failure\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"arn\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the failed resource.</p>\"\n                    }\n                },\n                \"reason\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The reason for the failure.</p>\"\n                    }\n                },\n                \"detail\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The details of the failure.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A failed resource. For a list of common causes, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/api_failures_messages.html\\\">API failure\\n\\t\\t\\t\\treasons</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#Failures\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#Failure\"\n            }\n        },\n        \"com.amazonaws.ecs#FirelensConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"type\": {\n                    \"target\": \"com.amazonaws.ecs#FirelensConfigurationType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The log router to use. The valid values are <code>fluentd</code> or\\n\\t\\t\\t\\t<code>fluentbit</code>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"options\": {\n                    \"target\": \"com.amazonaws.ecs#FirelensConfigurationOptionsMap\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The options to use when configuring the log router. This field is optional and can be\\n\\t\\t\\tused to specify a custom configuration file or to add additional metadata, such as the\\n\\t\\t\\ttask, task definition, cluster, and container instance details to the log event. If\\n\\t\\t\\tspecified, the syntax to use is\\n\\t\\t\\t\\t<code>\\\"options\\\":{\\\"enable-ecs-log-metadata\\\":\\\"true|false\\\",\\\"config-file-type:\\\"s3|file\\\",\\\"config-file-value\\\":\\\"arn:aws:s3:::mybucket/fluent.conf|filepath\\\"}</code>.\\n\\t\\t\\tFor more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/using_firelens.html#firelens-taskdef\\\">Creating\\n\\t\\t\\t\\ta task definition that uses a FireLens configuration</a> in the\\n\\t\\t\\t<i>Amazon Elastic Container Service Developer Guide</i>.</p>\\n         <note>\\n            <p>Tasks hosted on Fargate only support the <code>file</code> configuration file\\n\\t\\t\\t\\ttype.</p>\\n         </note>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The FireLens configuration for the container. This is used to specify and configure a\\n\\t\\t\\tlog router for container logs. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/using_firelens.html\\\">Custom log routing</a>\\n\\t\\t\\tin the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#FirelensConfigurationOptionsMap\": {\n            \"type\": \"map\",\n            \"key\": {\n                \"target\": \"com.amazonaws.ecs#String\"\n            },\n            \"value\": {\n                \"target\": \"com.amazonaws.ecs#String\"\n            }\n        },\n        \"com.amazonaws.ecs#FirelensConfigurationType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"FLUENTD\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"fluentd\"\n                    }\n                },\n                \"FLUENTBIT\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"fluentbit\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ecs#GetTaskProtection\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ecs#GetTaskProtectionRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ecs#GetTaskProtectionResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.ecs#AccessDeniedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ClientException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ClusterNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ServerException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#UnsupportedFeatureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Retrieves the protection status of tasks in an Amazon ECS service.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To get the protection status of a task\",\n                        \"documentation\": \"In this example, we get the protection status for a single task.\",\n                        \"input\": {\n                            \"cluster\": \"test-task-protection\",\n                            \"tasks\": [\n                                \"b8b1cf532d0e46ba8d44a40d1de16772\"\n                            ]\n                        },\n                        \"output\": {\n                            \"protectedTasks\": [\n                                {\n                                    \"taskArn\": \"arn:aws:ecs:us-west-2:012345678910:task/default/b8b1cf532d0e46ba8d44a40d1de16772\",\n                                    \"protectionEnabled\": true,\n                                    \"expirationDate\": \"2022-11-02T06:56:32.553Z\"\n                                }\n                            ],\n                            \"failures\": []\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ecs#GetTaskProtectionRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"cluster\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The short name or full Amazon Resource Name (ARN) of the cluster that hosts the service that the task\\n\\t\\t\\tsets exist in.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"tasks\": {\n                    \"target\": \"com.amazonaws.ecs#StringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of up to 100 task IDs or full ARN entries.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ecs#GetTaskProtectionResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"protectedTasks\": {\n                    \"target\": \"com.amazonaws.ecs#ProtectedTasks\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of tasks with the following information.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>taskArn</code>: The task ARN.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>protectionEnabled</code>: The protection status of the task. If scale-in\\n\\t\\t\\t\\t\\tprotection is turned on for a task, the value is <code>true</code>. Otherwise,\\n\\t\\t\\t\\t\\tit is <code>false</code>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>expirationDate</code>: The epoch time when protection for the task will\\n\\t\\t\\t\\t\\texpire.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"failures\": {\n                    \"target\": \"com.amazonaws.ecs#Failures\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Any failures associated with the call.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ecs#GpuIds\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#String\"\n            }\n        },\n        \"com.amazonaws.ecs#HealthCheck\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"command\": {\n                    \"target\": \"com.amazonaws.ecs#StringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A string array representing the command that the container runs to determine if it is\\n\\t\\t\\thealthy. The string array must start with <code>CMD</code> to run the command arguments\\n\\t\\t\\tdirectly, or <code>CMD-SHELL</code> to run the command with the container's default\\n\\t\\t\\tshell. </p>\\n         <p> When you use the Amazon Web Services Management Console JSON panel, the Command Line Interface, or the APIs, enclose the list\\n\\t\\t\\tof commands in double quotes and brackets.</p>\\n         <p>\\n            <code>[ \\\"CMD-SHELL\\\", \\\"curl -f http://localhost/ || exit 1\\\" ]</code>\\n         </p>\\n         <p>You don't include the double quotes and brackets when you use the Amazon Web Services Management Console.</p>\\n         <p>\\n            <code> CMD-SHELL, curl -f http://localhost/ || exit 1</code>\\n         </p>\\n         <p>An exit code of 0 indicates success, and non-zero exit code indicates failure. For\\n\\t\\t\\tmore information, see <code>HealthCheck</code> in the docker container create\\n\\t\\t\\tcommand.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"interval\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedInteger\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time period in seconds between each health check execution. You may specify\\n\\t\\t\\tbetween 5 and 300 seconds. The default value is 30 seconds. This value applies only when\\n\\t\\t\\tyou specify a <code>command</code>. </p>\"\n                    }\n                },\n                \"timeout\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedInteger\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time period in seconds to wait for a health check to succeed before it is\\n\\t\\t\\tconsidered a failure. You may specify between 2 and 60 seconds. The default value is 5.\\n\\t\\t\\tThis value applies only when you specify a <code>command</code>. </p>\"\n                    }\n                },\n                \"retries\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedInteger\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of times to retry a failed health check before the container is considered\\n\\t\\t\\tunhealthy. You may specify between 1 and 10 retries. The default value is 3. This value\\n\\t\\t\\tapplies only when you specify a <code>command</code>. </p>\"\n                    }\n                },\n                \"startPeriod\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedInteger\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The optional grace period to provide containers time to bootstrap before failed health\\n\\t\\t\\tchecks count towards the maximum number of retries. You can specify between 0 and 300\\n\\t\\t\\tseconds. By default, the <code>startPeriod</code> is off. This value applies only when\\n\\t\\t\\tyou specify a <code>command</code>. </p>\\n         <note>\\n            <p>If a health check succeeds within the <code>startPeriod</code>, then the container\\n\\t\\t\\t\\tis considered healthy and any subsequent failures count toward the maximum number of\\n\\t\\t\\t\\tretries.</p>\\n         </note>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>An object representing a container health check. Health check parameters that are\\n\\t\\t\\tspecified in a container definition override any Docker health checks that exist in the\\n\\t\\t\\tcontainer image (such as those specified in a parent image or from the image's\\n\\t\\t\\tDockerfile). This configuration maps to the <code>HEALTHCHECK</code> parameter of docker\\n\\t\\t\\trun.</p>\\n         <note>\\n            <p>The Amazon ECS container agent only monitors and reports on the health checks specified\\n\\t\\t\\t\\tin the task definition. Amazon ECS does not monitor Docker health checks that are\\n\\t\\t\\t\\tembedded in a container image and not specified in the container definition. Health\\n\\t\\t\\t\\tcheck parameters that are specified in a container definition override any Docker\\n\\t\\t\\t\\thealth checks that exist in the container image.</p>\\n         </note>\\n         <p>You can view the health status of both individual containers and a task with the\\n\\t\\t\\tDescribeTasks API operation or when viewing the task details in the console.</p>\\n         <p>The health check is designed to make sure that your containers survive agent restarts,\\n\\t\\t\\tupgrades, or temporary unavailability.</p>\\n         <p>Amazon ECS performs health checks on containers with the default that launched the\\n\\t\\t\\tcontainer instance or the task.</p>\\n         <p>The following describes the possible <code>healthStatus</code> values for a\\n\\t\\t\\tcontainer:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>HEALTHY</code>-The container health check has passed\\n\\t\\t\\t\\t\\tsuccessfully.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>UNHEALTHY</code>-The container health check has failed.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>UNKNOWN</code>-The container health check is being evaluated,\\n\\t\\t\\t\\t\\tthere's no container health check defined, or Amazon ECS doesn't have the health\\n\\t\\t\\t\\t\\tstatus of the container.</p>\\n            </li>\\n         </ul>\\n         <p>The following describes the possible <code>healthStatus</code> values based on the\\n\\t\\t\\tcontainer health checker status of essential containers in the task with the following\\n\\t\\t\\tpriority order (high to low):</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>UNHEALTHY</code>-One or more essential containers have failed\\n\\t\\t\\t\\t\\ttheir health check.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>UNKNOWN</code>-Any essential container running within the task is\\n\\t\\t\\t\\t\\tin an <code>UNKNOWN</code> state and no other essential containers have an\\n\\t\\t\\t\\t\\t\\t<code>UNHEALTHY</code> state.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>HEALTHY</code>-All essential containers within the task have\\n\\t\\t\\t\\t\\tpassed their health checks.</p>\\n            </li>\\n         </ul>\\n         <p>Consider the following task health example with 2 containers.</p>\\n         <ul>\\n            <li>\\n               <p>If Container1 is <code>UNHEALTHY</code> and Container2 is\\n\\t\\t\\t\\t\\t<code>UNKNOWN</code>, the task health is <code>UNHEALTHY</code>.</p>\\n            </li>\\n            <li>\\n               <p>If Container1 is <code>UNHEALTHY</code> and Container2 is\\n\\t\\t\\t\\t\\t<code>HEALTHY</code>, the task health is <code>UNHEALTHY</code>.</p>\\n            </li>\\n            <li>\\n               <p>If Container1 is <code>HEALTHY</code> and Container2 is <code>UNKNOWN</code>,\\n\\t\\t\\t\\t\\tthe task health is <code>UNKNOWN</code>.</p>\\n            </li>\\n            <li>\\n               <p>If Container1 is <code>HEALTHY</code> and Container2 is <code>HEALTHY</code>,\\n\\t\\t\\t\\t\\tthe task health is <code>HEALTHY</code>.</p>\\n            </li>\\n         </ul>\\n         <p>Consider the following task health example with 3 containers.</p>\\n         <ul>\\n            <li>\\n               <p>If Container1 is <code>UNHEALTHY</code> and Container2 is\\n\\t\\t\\t\\t\\t<code>UNKNOWN</code>, and Container3 is <code>UNKNOWN</code>, the task health is\\n\\t\\t\\t\\t\\t\\t<code>UNHEALTHY</code>.</p>\\n            </li>\\n            <li>\\n               <p>If Container1 is <code>UNHEALTHY</code> and Container2 is\\n\\t\\t\\t\\t\\t<code>UNKNOWN</code>, and Container3 is <code>HEALTHY</code>, the task health is\\n\\t\\t\\t\\t\\t\\t<code>UNHEALTHY</code>.</p>\\n            </li>\\n            <li>\\n               <p>If Container1 is <code>UNHEALTHY</code> and Container2 is\\n\\t\\t\\t\\t\\t<code>HEALTHY</code>, and Container3 is <code>HEALTHY</code>, the task health is\\n\\t\\t\\t\\t\\t\\t<code>UNHEALTHY</code>.</p>\\n            </li>\\n            <li>\\n               <p>If Container1 is <code>HEALTHY</code> and Container2 is <code>UNKNOWN</code>,\\n\\t\\t\\t\\t\\tand Container3 is <code>HEALTHY</code>, the task health is\\n\\t\\t\\t\\t\\t<code>UNKNOWN</code>.</p>\\n            </li>\\n            <li>\\n               <p>If Container1 is <code>HEALTHY</code> and Container2 is <code>UNKNOWN</code>,\\n\\t\\t\\t\\t\\tand Container3 is <code>UNKNOWN</code>, the task health is\\n\\t\\t\\t\\t\\t<code>UNKNOWN</code>.</p>\\n            </li>\\n            <li>\\n               <p>If Container1 is <code>HEALTHY</code> and Container2 is <code>HEALTHY</code>,\\n\\t\\t\\t\\t\\tand Container3 is <code>HEALTHY</code>, the task health is\\n\\t\\t\\t\\t\\t<code>HEALTHY</code>.</p>\\n            </li>\\n         </ul>\\n         <p>If a task is run manually, and not as part of a service, the task will continue its\\n\\t\\t\\tlifecycle regardless of its health status. For tasks that are part of a service, if the\\n\\t\\t\\ttask reports as unhealthy then the task will be stopped and the service scheduler will\\n\\t\\t\\treplace it.</p>\\n         <p>When a container health check fails for a task that is part of a service, the following process occurs:</p>\\n         <ol>\\n            <li>\\n               <p>The task is marked as <code>UNHEALTHY</code>.</p>\\n            </li>\\n            <li>\\n               <p>The unhealthy task will be stopped, and during the stopping process, it will go through the following states:</p>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <code>DEACTIVATING</code> - In this state, Amazon ECS performs additional steps before stopping the\\n\\t\\t\\t\\t\\t\\t\\ttask. For example, for tasks that are part of services configured to use\\n\\t\\t\\t\\t\\t\\t\\tElastic Load Balancing target groups, target groups will be deregistered\\n\\t\\t\\t\\t\\t\\t\\tin this state.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <code>STOPPING</code> - The task is in the process of being stopped.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <code>DEPROVISIONING</code> - Resources associated with the task are being cleaned up.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <code>STOPPED</code> - The task has been completely stopped.</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <p>After the old task stops, a new task will be launched to ensure service operation, and the new task will go through the following lifecycle:</p>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <code>PROVISIONING</code> - Resources required for the task are being provisioned.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <code>PENDING</code> - The task is waiting to be placed on a container instance.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <code>ACTIVATING</code> - In this state, Amazon ECS pulls container images, creates containers,\\n\\t\\t\\t\\t\\t\\t\\tconfigures task networking, registers load balancer target groups, and\\n\\t\\t\\t\\t\\t\\t\\tconfigures service discovery status.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <code>RUNNING</code> - The task is running and performing its work.</p>\\n                  </li>\\n               </ul>\\n            </li>\\n         </ol>\\n         <p>For more detailed information about task lifecycle states, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-lifecycle-explanation.html\\\">Task lifecycle</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\\n         <p>The following are notes about container health check support:</p>\\n         <ul>\\n            <li>\\n               <p>If the Amazon ECS container agent becomes disconnected from the Amazon ECS service, this\\n\\t\\t\\t\\t\\twon't cause a container to transition to an <code>UNHEALTHY</code> status. This\\n\\t\\t\\t\\t\\tis by design, to ensure that containers remain running during agent restarts or\\n\\t\\t\\t\\t\\ttemporary unavailability. The health check status is the \\\"last heard from\\\"\\n\\t\\t\\t\\t\\tresponse from the Amazon ECS agent, so if the container was considered\\n\\t\\t\\t\\t\\t\\t<code>HEALTHY</code> prior to the disconnect, that status will remain until\\n\\t\\t\\t\\t\\tthe agent reconnects and another health check occurs. There are no assumptions\\n\\t\\t\\t\\t\\tmade about the status of the container health checks.</p>\\n            </li>\\n            <li>\\n               <p>Container health checks require version <code>1.17.0</code> or greater of the\\n\\t\\t\\t\\t\\tAmazon ECS container agent. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-agent-update.html\\\">Updating the\\n\\t\\t\\t\\t\\t\\tAmazon ECS container agent</a>.</p>\\n            </li>\\n            <li>\\n               <p>Container health checks are supported for Fargate tasks if\\n\\t\\t\\t\\t\\tyou're using platform version <code>1.1.0</code> or greater. For more\\n\\t\\t\\t\\t\\tinformation, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/platform_versions.html\\\">Fargate\\n\\t\\t\\t\\t\\t\\tplatform versions</a>.</p>\\n            </li>\\n            <li>\\n               <p>Container health checks aren't supported for tasks that are part of a service\\n\\t\\t\\t\\t\\tthat's configured to use a Classic Load Balancer.</p>\\n            </li>\\n         </ul>\\n         <p>For an example of how to specify a task definition with multiple containers where\\n\\t\\t\\tcontainer dependency is specified, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/example_task_definitions.html#example_task_definition-containerdependency\\\">Container dependency</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#HealthStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"HEALTHY\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"HEALTHY\"\n                    }\n                },\n                \"UNHEALTHY\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"UNHEALTHY\"\n                    }\n                },\n                \"UNKNOWN\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"UNKNOWN\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ecs#HookDetails\": {\n            \"type\": \"document\"\n        },\n        \"com.amazonaws.ecs#HostEntry\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"hostname\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The hostname to use in the <code>/etc/hosts</code> entry.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ipAddress\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IP address to use in the <code>/etc/hosts</code> entry.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Hostnames and IP address entries that are added to the <code>/etc/hosts</code> file of\\n\\t\\t\\ta container via the <code>extraHosts</code> parameter of its <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_ContainerDefinition.html\\\">ContainerDefinition</a>. </p>\"\n            }\n        },\n        \"com.amazonaws.ecs#HostEntryList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#HostEntry\"\n            }\n        },\n        \"com.amazonaws.ecs#HostVolumeProperties\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"sourcePath\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>When the <code>host</code> parameter is used, specify a <code>sourcePath</code> to\\n\\t\\t\\tdeclare the path on the host container instance that's presented to the container. If\\n\\t\\t\\tthis parameter is empty, then the Docker daemon has assigned a host path for you. If the\\n\\t\\t\\t\\t<code>host</code> parameter contains a <code>sourcePath</code> file location, then\\n\\t\\t\\tthe data volume persists at the specified location on the host container instance until\\n\\t\\t\\tyou delete it manually. If the <code>sourcePath</code> value doesn't exist on the host\\n\\t\\t\\tcontainer instance, the Docker daemon creates it. If the location does exist, the\\n\\t\\t\\tcontents of the source path folder are exported.</p>\\n         <p>If you're using the Fargate launch type, the <code>sourcePath</code>\\n\\t\\t\\tparameter is not supported.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Details on a container instance bind mount host volume.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#IAMRoleArn\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ecs#InferenceAccelerator\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"deviceName\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Elastic Inference accelerator device name. The <code>deviceName</code> must also\\n\\t\\t\\tbe referenced in a container definition as a <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_ResourceRequirement.html\\\">ResourceRequirement</a>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"deviceType\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Elastic Inference accelerator type to use.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Details on an Elastic Inference accelerator. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-inference.html\\\">Working with Amazon Elastic Inference on Amazon ECS</a> in the\\n\\t\\t\\t<i>Amazon Elastic Container Service Developer Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#InferenceAcceleratorOverride\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"deviceName\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Elastic Inference accelerator device name to override for the task. This parameter\\n\\t\\t\\tmust match a <code>deviceName</code> specified in the task definition.</p>\"\n                    }\n                },\n                \"deviceType\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Elastic Inference accelerator type to use.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Details on an Elastic Inference accelerator task override. This parameter is used to\\n\\t\\t\\toverride the Elastic Inference accelerator specified in the task definition. For more\\n\\t\\t\\tinformation, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-inference.html\\\">Working with Amazon\\n\\t\\t\\t\\tElastic Inference on Amazon ECS</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#InferenceAcceleratorOverrides\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#InferenceAcceleratorOverride\"\n            }\n        },\n        \"com.amazonaws.ecs#InferenceAccelerators\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#InferenceAccelerator\"\n            }\n        },\n        \"com.amazonaws.ecs#InstanceGeneration\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"CURRENT\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"current\"\n                    }\n                },\n                \"PREVIOUS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"previous\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ecs#InstanceGenerationSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#InstanceGeneration\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ecs#InstanceHealthCheckResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"type\": {\n                    \"target\": \"com.amazonaws.ecs#InstanceHealthCheckType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of container instance health status that was verified.</p>\"\n                    }\n                },\n                \"status\": {\n                    \"target\": \"com.amazonaws.ecs#InstanceHealthCheckState\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The container instance health status.</p>\"\n                    }\n                },\n                \"lastUpdated\": {\n                    \"target\": \"com.amazonaws.ecs#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Unix timestamp for when the container instance health status was last\\n\\t\\t\\tupdated.</p>\"\n                    }\n                },\n                \"lastStatusChange\": {\n                    \"target\": \"com.amazonaws.ecs#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Unix timestamp for when the container instance health status last changed.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>An object representing the result of a container instance health status check.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#InstanceHealthCheckResultList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#InstanceHealthCheckResult\"\n            }\n        },\n        \"com.amazonaws.ecs#InstanceHealthCheckState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"OK\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"OK\"\n                    }\n                },\n                \"IMPAIRED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"IMPAIRED\"\n                    }\n                },\n                \"INSUFFICIENT_DATA\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"INSUFFICIENT_DATA\"\n                    }\n                },\n                \"INITIALIZING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"INITIALIZING\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ecs#InstanceHealthCheckType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"CONTAINER_RUNTIME\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"CONTAINER_RUNTIME\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ecs#InstanceLaunchTemplate\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ec2InstanceProfileArn\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the instance profile that Amazon ECS applies to Amazon ECS Managed Instances. This instance profile must include the necessary permissions for your tasks to access Amazon Web Services services and resources.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/managed-instances-instance-profile.html\\\">Amazon ECS instance profile for Managed Instances</a> in the <i>Amazon ECS Developer Guide</i>.\\n\\t\\t </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"networkConfiguration\": {\n                    \"target\": \"com.amazonaws.ecs#ManagedInstancesNetworkConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The network configuration for Amazon ECS Managed Instances. This specifies the subnets and security groups that instances use for network connectivity.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"storageConfiguration\": {\n                    \"target\": \"com.amazonaws.ecs#ManagedInstancesStorageConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The storage configuration for Amazon ECS Managed Instances. This defines the root volume size and type for the instances.</p>\"\n                    }\n                },\n                \"monitoring\": {\n                    \"target\": \"com.amazonaws.ecs#ManagedInstancesMonitoringOptions\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>CloudWatch provides two categories of monitoring: basic monitoring and detailed monitoring. By default, your managed instance is configured for basic monitoring. You can optionally enable detailed monitoring to help you more quickly identify and act on operational issues. You can enable or turn off detailed monitoring at launch or when the managed instance is running or stopped. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/detailed-monitoring-managed-instances.html\\\">Detailed monitoring  for Amazon ECS Managed Instances</a> in the Amazon ECS Developer Guide.</p>\"\n                    }\n                },\n                \"instanceRequirements\": {\n                    \"target\": \"com.amazonaws.ecs#InstanceRequirementsRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The instance requirements. You can specify:</p>\\n         <ul>\\n            <li>\\n               <p>The instance types</p>\\n            </li>\\n            <li>\\n               <p>Instance requirements such as vCPU count, memory, network performance, and accelerator specifications</p>\\n            </li>\\n         </ul>\\n         <p>Amazon ECS automatically selects the instances that match the specified criteria.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The launch template configuration for Amazon ECS Managed Instances. This defines how Amazon ECS launches Amazon EC2 instances, including the instance profile for your tasks, network and storage configuration, capacity options, and instance requirements for flexible instance type selection.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#InstanceLaunchTemplateUpdate\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ec2InstanceProfileArn\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The updated Amazon Resource Name (ARN) of the instance profile. The new instance profile must have the necessary permissions for your tasks.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/managed-instances-instance-profile.html\\\">Amazon ECS instance profile for Managed Instances</a> in the <i>Amazon ECS Developer Guide</i>.\\n\\t\\t</p>\"\n                    }\n                },\n                \"networkConfiguration\": {\n                    \"target\": \"com.amazonaws.ecs#ManagedInstancesNetworkConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The updated network configuration for Amazon ECS Managed Instances. Changes to subnets and security groups affect new instances launched after the update.</p>\"\n                    }\n                },\n                \"storageConfiguration\": {\n                    \"target\": \"com.amazonaws.ecs#ManagedInstancesStorageConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The updated storage configuration for Amazon ECS Managed Instances. Changes to storage settings apply to new instances launched after the update.</p>\"\n                    }\n                },\n                \"monitoring\": {\n                    \"target\": \"com.amazonaws.ecs#ManagedInstancesMonitoringOptions\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>CloudWatch provides two categories of monitoring: basic monitoring and detailed monitoring. By default, your managed instance is configured for basic monitoring. You can optionally enable detailed monitoring to help you more quickly identify and act on operational issues. You can enable or turn off detailed monitoring at launch or when the managed instance is running or stopped. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/detailed-monitoring-managed-instances.html\\\">Detailed monitoring  for Amazon ECS Managed Instances</a> in the Amazon ECS Developer Guide.</p>\"\n                    }\n                },\n                \"instanceRequirements\": {\n                    \"target\": \"com.amazonaws.ecs#InstanceRequirementsRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The updated instance requirements for attribute-based instance type selection. Changes to instance requirements affect which instance types Amazon ECS selects for new instances.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The updated launch template configuration for Amazon ECS Managed Instances. You can modify the instance profile, network configuration, storage settings, and instance requirements. Changes apply to new instances launched after the update.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-launch-templates.html\\\">Store instance launch parameters in Amazon EC2 launch templates</a> in the <i>Amazon EC2 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#InstanceRequirementsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"vCpuCount\": {\n                    \"target\": \"com.amazonaws.ecs#VCpuCountRangeRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The minimum and maximum number of vCPUs for the instance types. Amazon ECS selects instance types that have vCPU counts within this range.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"memoryMiB\": {\n                    \"target\": \"com.amazonaws.ecs#MemoryMiBRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The minimum and maximum amount of memory in mebibytes (MiB) for the instance types. Amazon ECS selects instance types that have memory within this range.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"cpuManufacturers\": {\n                    \"target\": \"com.amazonaws.ecs#CpuManufacturerSet\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The CPU manufacturers to include or exclude. You can specify <code>intel</code>, <code>amd</code>, or <code>amazon-web-services</code> to control which CPU types are used for your workloads.</p>\",\n                        \"smithy.api#xmlName\": \"CpuManufacturer\"\n                    }\n                },\n                \"memoryGiBPerVCpu\": {\n                    \"target\": \"com.amazonaws.ecs#MemoryGiBPerVCpuRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The minimum and maximum amount of memory per vCPU in gibibytes (GiB). This helps ensure that instance types have the appropriate memory-to-CPU ratio for your workloads.</p>\"\n                    }\n                },\n                \"excludedInstanceTypes\": {\n                    \"target\": \"com.amazonaws.ecs#ExcludedInstanceTypeSet\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The instance types to exclude from selection. Use this to prevent Amazon ECS from selecting specific instance types that may not be suitable for your workloads.</p>\",\n                        \"smithy.api#xmlName\": \"ExcludedInstanceType\"\n                    }\n                },\n                \"instanceGenerations\": {\n                    \"target\": \"com.amazonaws.ecs#InstanceGenerationSet\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The instance generations to include. You can specify <code>current</code> to use the latest generation instances, or <code>previous</code> to include previous generation instances for cost optimization.</p>\",\n                        \"smithy.api#xmlName\": \"InstanceGeneration\"\n                    }\n                },\n                \"spotMaxPricePercentageOverLowestPrice\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedInteger\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum price for Spot instances as a percentage over the lowest priced On-Demand instance. This helps control Spot instance costs while maintaining access to capacity.</p>\"\n                    }\n                },\n                \"onDemandMaxPricePercentageOverLowestPrice\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedInteger\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The price protection threshold for On-Demand Instances, as a percentage higher than an identified On-Demand price. The identified On-Demand price is the price of the lowest priced current generation C, M, or R instance type with your specified attributes. If no current generation C, M, or R instance type matches your attributes, then the identified price is from either the lowest priced current generation instance types or, failing that, the lowest priced previous generation instance types that match your attributes. When Amazon ECS selects instance types with your attributes, we will exclude instance types whose price exceeds your specified threshold.</p>\"\n                    }\n                },\n                \"bareMetal\": {\n                    \"target\": \"com.amazonaws.ecs#BareMetal\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether to include bare metal instance types. Set to <code>included</code> to allow bare metal instances, <code>excluded</code> to exclude them, or <code>required</code> to use only bare metal instances.</p>\"\n                    }\n                },\n                \"burstablePerformance\": {\n                    \"target\": \"com.amazonaws.ecs#BurstablePerformance\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether to include burstable performance instance types (T2, T3, T3a, T4g). Set to <code>included</code> to allow burstable instances, <code>excluded</code> to exclude them, or <code>required</code> to use only burstable instances.</p>\"\n                    }\n                },\n                \"requireHibernateSupport\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedBoolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether the instance types must support hibernation. When set to <code>true</code>, only instance types that support hibernation are selected.</p>\"\n                    }\n                },\n                \"networkInterfaceCount\": {\n                    \"target\": \"com.amazonaws.ecs#NetworkInterfaceCountRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The minimum and maximum number of network interfaces for the instance types. This is useful for workloads that require multiple network interfaces.</p>\"\n                    }\n                },\n                \"localStorage\": {\n                    \"target\": \"com.amazonaws.ecs#LocalStorage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether to include instance types with local storage. Set to <code>included</code> to allow local storage, <code>excluded</code> to exclude it, or <code>required</code> to use only instances with local storage.</p>\"\n                    }\n                },\n                \"localStorageTypes\": {\n                    \"target\": \"com.amazonaws.ecs#LocalStorageTypeSet\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The local storage types to include. You can specify <code>hdd</code> for hard disk drives, <code>ssd</code> for solid state drives, or both.</p>\",\n                        \"smithy.api#xmlName\": \"LocalStorageType\"\n                    }\n                },\n                \"totalLocalStorageGB\": {\n                    \"target\": \"com.amazonaws.ecs#TotalLocalStorageGBRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The minimum and maximum total local storage in gigabytes (GB) for instance types with local storage.</p>\"\n                    }\n                },\n                \"baselineEbsBandwidthMbps\": {\n                    \"target\": \"com.amazonaws.ecs#BaselineEbsBandwidthMbpsRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The minimum and maximum baseline Amazon EBS bandwidth in megabits per second (Mbps). This is important for workloads with high storage I/O requirements.</p>\"\n                    }\n                },\n                \"acceleratorTypes\": {\n                    \"target\": \"com.amazonaws.ecs#AcceleratorTypeSet\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The accelerator types to include. You can specify <code>gpu</code> for graphics processing units, <code>fpga</code> for field programmable gate arrays, or <code>inference</code> for machine learning inference accelerators.</p>\",\n                        \"smithy.api#xmlName\": \"AcceleratorType\"\n                    }\n                },\n                \"acceleratorCount\": {\n                    \"target\": \"com.amazonaws.ecs#AcceleratorCountRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The minimum and maximum number of accelerators for the instance types. This is used when you need instances with specific numbers of GPUs or other accelerators.</p>\"\n                    }\n                },\n                \"acceleratorManufacturers\": {\n                    \"target\": \"com.amazonaws.ecs#AcceleratorManufacturerSet\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The accelerator manufacturers to include. You can specify <code>nvidia</code>, <code>amd</code>, <code>amazon-web-services</code>, or <code>xilinx</code> depending on your accelerator requirements.</p>\",\n                        \"smithy.api#xmlName\": \"AcceleratorManufacturer\"\n                    }\n                },\n                \"acceleratorNames\": {\n                    \"target\": \"com.amazonaws.ecs#AcceleratorNameSet\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The specific accelerator names to include. For example, you can specify <code>a100</code>, <code>v100</code>, <code>k80</code>, or other specific accelerator models.</p>\",\n                        \"smithy.api#xmlName\": \"AcceleratorName\"\n                    }\n                },\n                \"acceleratorTotalMemoryMiB\": {\n                    \"target\": \"com.amazonaws.ecs#AcceleratorTotalMemoryMiBRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The minimum and maximum total accelerator memory in mebibytes (MiB). This is important for GPU workloads that require specific amounts of video memory.</p>\"\n                    }\n                },\n                \"networkBandwidthGbps\": {\n                    \"target\": \"com.amazonaws.ecs#NetworkBandwidthGbpsRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The minimum and maximum network bandwidth in gigabits per second (Gbps). This is crucial for network-intensive workloads that require high throughput.</p>\"\n                    }\n                },\n                \"allowedInstanceTypes\": {\n                    \"target\": \"com.amazonaws.ecs#AllowedInstanceTypeSet\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The instance types to include in the selection. When specified, Amazon ECS only considers these instance types, subject to the other requirements specified.</p>\",\n                        \"smithy.api#xmlName\": \"AllowedInstanceType\"\n                    }\n                },\n                \"maxSpotPriceAsPercentageOfOptimalOnDemandPrice\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedInteger\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum price for Spot instances as a percentage of the optimal On-Demand price. This provides more precise cost control for Spot instance selection.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The instance requirements for attribute-based instance type selection. Instead of specifying exact instance types, you define requirements such as vCPU count, memory size, network performance, and accelerator specifications. Amazon ECS automatically selects Amazon EC2 instance types that match these requirements, providing flexibility and helping to mitigate capacity constraints.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#Integer\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#default\": 0\n            }\n        },\n        \"com.amazonaws.ecs#IntegerList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#BoxedInteger\"\n            }\n        },\n        \"com.amazonaws.ecs#InvalidParameterException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> Message that describes the cause of the exception.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The specified parameter isn't valid. Review the available parameters for the API\\n\\t\\t\\trequest.</p>\\n         <p>For more information about service event errors, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-event-messages-list.html\\\">Amazon ECS service\\n\\t\\t\\t\\tevent messages</a>. </p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.ecs#IpcMode\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"HOST\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"host\"\n                    }\n                },\n                \"TASK\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"task\"\n                    }\n                },\n                \"NONE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"none\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ecs#KernelCapabilities\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"add\": {\n                    \"target\": \"com.amazonaws.ecs#StringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Linux capabilities for the container that have been added to the default\\n\\t\\t\\tconfiguration provided by Docker. This parameter maps to <code>CapAdd</code> in the\\n\\t\\t\\tdocker container create command and the <code>--cap-add</code> option to docker\\n\\t\\t\\trun.</p>\\n         <note>\\n            <p>Tasks launched on Fargate only support adding the <code>SYS_PTRACE</code> kernel\\n\\t\\t\\t\\tcapability.</p>\\n         </note>\\n         <p>Valid values: <code>\\\"ALL\\\" | \\\"AUDIT_CONTROL\\\" | \\\"AUDIT_WRITE\\\" | \\\"BLOCK_SUSPEND\\\" |\\n\\t\\t\\t\\t\\\"CHOWN\\\" | \\\"DAC_OVERRIDE\\\" | \\\"DAC_READ_SEARCH\\\" | \\\"FOWNER\\\" | \\\"FSETID\\\" | \\\"IPC_LOCK\\\" |\\n\\t\\t\\t\\t\\\"IPC_OWNER\\\" | \\\"KILL\\\" | \\\"LEASE\\\" | \\\"LINUX_IMMUTABLE\\\" | \\\"MAC_ADMIN\\\" | \\\"MAC_OVERRIDE\\\" |\\n\\t\\t\\t\\t\\\"MKNOD\\\" | \\\"NET_ADMIN\\\" | \\\"NET_BIND_SERVICE\\\" | \\\"NET_BROADCAST\\\" | \\\"NET_RAW\\\" | \\\"SETFCAP\\\"\\n\\t\\t\\t\\t| \\\"SETGID\\\" | \\\"SETPCAP\\\" | \\\"SETUID\\\" | \\\"SYS_ADMIN\\\" | \\\"SYS_BOOT\\\" | \\\"SYS_CHROOT\\\" |\\n\\t\\t\\t\\t\\\"SYS_MODULE\\\" | \\\"SYS_NICE\\\" | \\\"SYS_PACCT\\\" | \\\"SYS_PTRACE\\\" | \\\"SYS_RAWIO\\\" |\\n\\t\\t\\t\\t\\\"SYS_RESOURCE\\\" | \\\"SYS_TIME\\\" | \\\"SYS_TTY_CONFIG\\\" | \\\"SYSLOG\\\" |\\n\\t\\t\\t\\\"WAKE_ALARM\\\"</code>\\n         </p>\"\n                    }\n                },\n                \"drop\": {\n                    \"target\": \"com.amazonaws.ecs#StringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Linux capabilities for the container that have been removed from the default\\n\\t\\t\\tconfiguration provided by Docker. This parameter maps to <code>CapDrop</code> in the\\n\\t\\t\\tdocker container create command and the <code>--cap-drop</code> option to docker\\n\\t\\t\\trun.</p>\\n         <p>Valid values: <code>\\\"ALL\\\" | \\\"AUDIT_CONTROL\\\" | \\\"AUDIT_WRITE\\\" | \\\"BLOCK_SUSPEND\\\" |\\n\\t\\t\\t\\t\\\"CHOWN\\\" | \\\"DAC_OVERRIDE\\\" | \\\"DAC_READ_SEARCH\\\" | \\\"FOWNER\\\" | \\\"FSETID\\\" | \\\"IPC_LOCK\\\" |\\n\\t\\t\\t\\t\\\"IPC_OWNER\\\" | \\\"KILL\\\" | \\\"LEASE\\\" | \\\"LINUX_IMMUTABLE\\\" | \\\"MAC_ADMIN\\\" | \\\"MAC_OVERRIDE\\\" |\\n\\t\\t\\t\\t\\\"MKNOD\\\" | \\\"NET_ADMIN\\\" | \\\"NET_BIND_SERVICE\\\" | \\\"NET_BROADCAST\\\" | \\\"NET_RAW\\\" | \\\"SETFCAP\\\"\\n\\t\\t\\t\\t| \\\"SETGID\\\" | \\\"SETPCAP\\\" | \\\"SETUID\\\" | \\\"SYS_ADMIN\\\" | \\\"SYS_BOOT\\\" | \\\"SYS_CHROOT\\\" |\\n\\t\\t\\t\\t\\\"SYS_MODULE\\\" | \\\"SYS_NICE\\\" | \\\"SYS_PACCT\\\" | \\\"SYS_PTRACE\\\" | \\\"SYS_RAWIO\\\" |\\n\\t\\t\\t\\t\\\"SYS_RESOURCE\\\" | \\\"SYS_TIME\\\" | \\\"SYS_TTY_CONFIG\\\" | \\\"SYSLOG\\\" |\\n\\t\\t\\t\\\"WAKE_ALARM\\\"</code>\\n         </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The Linux capabilities to add or remove from the default Docker configuration for a\\n\\t\\t\\tcontainer defined in the task definition. For more detailed information about these\\n\\t\\t\\tLinux capabilities, see the <a href=\\\"http://man7.org/linux/man-pages/man7/capabilities.7.html\\\">capabilities(7)</a> Linux manual page.</p>\\n         <p>The following describes how Docker processes the Linux capabilities specified in the\\n\\t\\t\\t\\t<code>add</code> and <code>drop</code> request parameters. For information about the\\n\\t\\t\\tlatest behavior, see <a href=\\\"https://forums.docker.com/t/docker-compose-order-of-cap-drop-and-cap-add/97136/1\\\">Docker Compose: order of cap_drop and cap_add</a> in the Docker Community\\n\\t\\t\\tForum.</p>\\n         <ul>\\n            <li>\\n               <p>When the container is a privleged container, the container capabilities are\\n\\t\\t\\t\\t\\tall of the default Docker capabilities. The capabilities specified in the\\n\\t\\t\\t\\t\\t\\t<code>add</code> request parameter, and the <code>drop</code> request\\n\\t\\t\\t\\t\\tparameter are ignored.</p>\\n            </li>\\n            <li>\\n               <p>When the <code>add</code> request parameter is set to ALL, the container\\n\\t\\t\\t\\t\\tcapabilities are all of the default Docker capabilities, excluding those\\n\\t\\t\\t\\t\\tspecified in the <code>drop</code> request parameter.</p>\\n            </li>\\n            <li>\\n               <p>When the <code>drop</code> request parameter is set to ALL, the container\\n\\t\\t\\t\\t\\tcapabilities are the capabilities specified in the <code>add</code> request\\n\\t\\t\\t\\t\\tparameter.</p>\\n            </li>\\n            <li>\\n               <p>When the <code>add</code> request parameter and the <code>drop</code> request\\n\\t\\t\\t\\t\\tparameter are both empty, the capabilities the container capabilities are all of\\n\\t\\t\\t\\t\\tthe default Docker capabilities.</p>\\n            </li>\\n            <li>\\n               <p>The default is to first drop the capabilities specified in the\\n\\t\\t\\t\\t\\t\\t<code>drop</code> request parameter, and then add the capabilities specified\\n\\t\\t\\t\\t\\tin the <code>add</code> request parameter.</p>\\n            </li>\\n         </ul>\"\n            }\n        },\n        \"com.amazonaws.ecs#KeyValuePair\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"name\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the key-value pair. For environment variables, this is the name of the\\n\\t\\t\\tenvironment variable.</p>\"\n                    }\n                },\n                \"value\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The value of the key-value pair. For environment variables, this is the value of the\\n\\t\\t\\tenvironment variable.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A key-value pair object.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#LaunchType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"EC2\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"EC2\"\n                    }\n                },\n                \"FARGATE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"FARGATE\"\n                    }\n                },\n                \"EXTERNAL\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"EXTERNAL\"\n                    }\n                },\n                \"MANAGED_INSTANCES\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"MANAGED_INSTANCES\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ecs#LimitExceededException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> Message that describes the cause of the exception.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The limit for the resource was exceeded.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.ecs#LinuxParameters\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"capabilities\": {\n                    \"target\": \"com.amazonaws.ecs#KernelCapabilities\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Linux capabilities for the container that are added to or dropped from the default\\n\\t\\t\\tconfiguration provided by Docker.</p>\\n         <note>\\n            <p>For tasks that use the Fargate launch type,\\n\\t\\t\\t\\t\\t<code>capabilities</code> is supported for all platform versions but the\\n\\t\\t\\t\\t\\t<code>add</code> parameter is only supported if using platform version 1.4.0 or\\n\\t\\t\\t\\tlater.</p>\\n         </note>\"\n                    }\n                },\n                \"devices\": {\n                    \"target\": \"com.amazonaws.ecs#DevicesList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Any host devices to expose to the container. This parameter maps to\\n\\t\\t\\t\\t<code>Devices</code> in the docker container create command and the\\n\\t\\t\\t\\t<code>--device</code> option to docker run.</p>\\n         <note>\\n            <p>If you're using tasks that use the Fargate launch type, the\\n\\t\\t\\t\\t\\t<code>devices</code> parameter isn't supported.</p>\\n         </note>\"\n                    }\n                },\n                \"initProcessEnabled\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedBoolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Run an <code>init</code> process inside the container that forwards signals and reaps\\n\\t\\t\\tprocesses. This parameter maps to the <code>--init</code> option to docker run.\\n\\t\\t\\tThis parameter requires version 1.25 of the Docker Remote API or greater on your container instance. To check the Docker Remote API version on your container instance, log in to your container instance and run the following command: <code>sudo docker version --format '{{.Server.APIVersion}}'</code>\\n         </p>\"\n                    }\n                },\n                \"sharedMemorySize\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedInteger\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The value for the size (in MiB) of the <code>/dev/shm</code> volume. This parameter\\n\\t\\t\\tmaps to the <code>--shm-size</code> option to docker run.</p>\\n         <note>\\n            <p>If you are using tasks that use the Fargate launch type, the\\n\\t\\t\\t\\t\\t<code>sharedMemorySize</code> parameter is not supported.</p>\\n         </note>\"\n                    }\n                },\n                \"tmpfs\": {\n                    \"target\": \"com.amazonaws.ecs#TmpfsList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The container path, mount options, and size (in MiB) of the tmpfs mount. This\\n\\t\\t\\tparameter maps to the <code>--tmpfs</code> option to docker run.</p>\\n         <note>\\n            <p>If you're using tasks that use the Fargate launch type, the\\n\\t\\t\\t\\t\\t<code>tmpfs</code> parameter isn't supported.</p>\\n         </note>\"\n                    }\n                },\n                \"maxSwap\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedInteger\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The total amount of swap memory (in MiB) a container can use. This parameter will be\\n\\t\\t\\ttranslated to the <code>--memory-swap</code> option to docker run where the value would\\n\\t\\t\\tbe the sum of the container memory plus the <code>maxSwap</code> value.</p>\\n         <p>If a <code>maxSwap</code> value of <code>0</code> is specified, the container will not\\n\\t\\t\\tuse swap. Accepted values are <code>0</code> or any positive integer. If the\\n\\t\\t\\t\\t<code>maxSwap</code> parameter is omitted, the container will use the swap\\n\\t\\t\\tconfiguration for the container instance it is running on. A <code>maxSwap</code> value\\n\\t\\t\\tmust be set for the <code>swappiness</code> parameter to be used.</p>\\n         <note>\\n            <p>If you're using tasks that use the Fargate launch type, the\\n\\t\\t\\t\\t\\t<code>maxSwap</code> parameter isn't supported.</p>\\n            <p>If you're using tasks on Amazon Linux 2023 the <code>swappiness</code> parameter isn't\\n\\t\\t\\t\\tsupported.</p>\\n         </note>\"\n                    }\n                },\n                \"swappiness\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedInteger\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>This allows you to tune a container's memory swappiness behavior. A\\n\\t\\t\\t\\t<code>swappiness</code> value of <code>0</code> will cause swapping to not happen\\n\\t\\t\\tunless absolutely necessary. A <code>swappiness</code> value of <code>100</code> will\\n\\t\\t\\tcause pages to be swapped very aggressively. Accepted values are whole numbers between\\n\\t\\t\\t\\t<code>0</code> and <code>100</code>. If the <code>swappiness</code> parameter is not\\n\\t\\t\\tspecified, a default value of <code>60</code> is used. If a value is not specified for\\n\\t\\t\\t\\t<code>maxSwap</code> then this parameter is ignored. This parameter maps to the\\n\\t\\t\\t\\t<code>--memory-swappiness</code> option to docker run.</p>\\n         <note>\\n            <p>If you're using tasks that use the Fargate launch type, the\\n\\t\\t\\t\\t\\t<code>swappiness</code> parameter isn't supported.</p>\\n            <p>If you're using tasks on Amazon Linux 2023 the <code>swappiness</code> parameter isn't\\n\\t\\t\\t\\tsupported.</p>\\n         </note>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The Linux-specific options that are applied to the container, such as Linux <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_KernelCapabilities.html\\\">KernelCapabilities</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#ListAccountSettings\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ecs#ListAccountSettingsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ecs#ListAccountSettingsResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.ecs#ClientException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ServerException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Lists the account settings for a specified principal.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To view the effective account settings for a specific IAM user or IAM role\",\n                        \"documentation\": \"This example displays the effective account settings for the specified user or role.\",\n                        \"input\": {\n                            \"effectiveSettings\": true,\n                            \"principalArn\": \"arn:aws:iam::<aws_account_id>:user/principalName\"\n                        },\n                        \"output\": {\n                            \"settings\": [\n                                {\n                                    \"name\": \"containerInstanceLongArnFormat\",\n                                    \"value\": \"disabled\",\n                                    \"principalArn\": \"arn:aws:iam::<aws_account_id>:user/principalName\"\n                                },\n                                {\n                                    \"name\": \"serviceLongArnFormat\",\n                                    \"value\": \"enabled\",\n                                    \"principalArn\": \"arn:aws:iam::<aws_account_id>:user/principalName\"\n                                },\n                                {\n                                    \"name\": \"taskLongArnFormat\",\n                                    \"value\": \"disabled\",\n                                    \"principalArn\": \"arn:aws:iam::<aws_account_id>:user/principalName\"\n                                }\n                            ]\n                        }\n                    },\n                    {\n                        \"title\": \"To view your effective account settings\",\n                        \"documentation\": \"This example displays the effective account settings for your account.\",\n                        \"input\": {\n                            \"effectiveSettings\": true\n                        },\n                        \"output\": {\n                            \"settings\": [\n                                {\n                                    \"name\": \"containerInstanceLongArnFormat\",\n                                    \"value\": \"disabled\",\n                                    \"principalArn\": \"arn:aws:iam::<aws_account_id>:user/principalName\"\n                                },\n                                {\n                                    \"name\": \"serviceLongArnFormat\",\n                                    \"value\": \"enabled\",\n                                    \"principalArn\": \"arn:aws:iam::<aws_account_id>:user/principalName\"\n                                },\n                                {\n                                    \"name\": \"taskLongArnFormat\",\n                                    \"value\": \"disabled\",\n                                    \"principalArn\": \"arn:aws:iam::<aws_account_id>:user/principalName\"\n                                }\n                            ]\n                        }\n                    }\n                ],\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"nextToken\",\n                    \"outputToken\": \"nextToken\",\n                    \"items\": \"settings\",\n                    \"pageSize\": \"maxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ecs#ListAccountSettingsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"name\": {\n                    \"target\": \"com.amazonaws.ecs#SettingName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the account setting you want to list the settings for.</p>\"\n                    }\n                },\n                \"value\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The value of the account settings to filter results with. You must also specify an\\n\\t\\t\\taccount setting name to use this parameter.</p>\"\n                    }\n                },\n                \"principalArn\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the principal, which can be a user, role, or the root user. If this field is\\n\\t\\t\\tomitted, the account settings are listed only for the authenticated user.</p>\\n         <p>In order to use this parameter, you must be the root user, or the principal.</p>\\n         <note>\\n            <p>Federated users assume the account setting of the root user and can't have explicit\\n\\t\\t\\t\\taccount settings set for them.</p>\\n         </note>\"\n                    }\n                },\n                \"effectiveSettings\": {\n                    \"target\": \"com.amazonaws.ecs#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Determines whether to return the effective settings. If <code>true</code>, the account\\n\\t\\t\\tsettings for the root user or the default setting for the <code>principalArn</code> are\\n\\t\\t\\treturned. If <code>false</code>, the account settings for the <code>principalArn</code>\\n\\t\\t\\tare returned if they're set. Otherwise, no account settings are returned.</p>\"\n                    }\n                },\n                \"nextToken\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>nextToken</code> value returned from a <code>ListAccountSettings</code>\\n\\t\\t\\trequest indicating that more results are available to fulfill the request and further\\n\\t\\t\\tcalls will be needed. If <code>maxResults</code> was provided, it's possible the number\\n\\t\\t\\tof results to be fewer than <code>maxResults</code>.</p>\\n         <note>\\n            <p>This token should be treated as an opaque identifier that is only used to\\n                retrieve the next items in a list and not for other programmatic purposes.</p>\\n         </note>\"\n                    }\n                },\n                \"maxResults\": {\n                    \"target\": \"com.amazonaws.ecs#Integer\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The maximum number of account setting results returned by\\n\\t\\t\\t\\t<code>ListAccountSettings</code> in paginated output. When this parameter is used,\\n\\t\\t\\t\\t<code>ListAccountSettings</code> only returns <code>maxResults</code> results in a\\n\\t\\t\\tsingle page along with a <code>nextToken</code> response element. The remaining results\\n\\t\\t\\tof the initial request can be seen by sending another <code>ListAccountSettings</code>\\n\\t\\t\\trequest with the returned <code>nextToken</code> value. This value can be between\\n\\t\\t\\t1 and 10. If this\\n\\t\\t\\tparameter isn't used, then <code>ListAccountSettings</code> returns up to\\n\\t\\t\\t10 results and a <code>nextToken</code> value\\n\\t\\t\\tif applicable.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ecs#ListAccountSettingsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"settings\": {\n                    \"target\": \"com.amazonaws.ecs#Settings\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The account settings for the resource.</p>\"\n                    }\n                },\n                \"nextToken\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>nextToken</code> value to include in a future\\n\\t\\t\\t\\t<code>ListAccountSettings</code> request. When the results of a\\n\\t\\t\\t\\t<code>ListAccountSettings</code> request exceed <code>maxResults</code>, this value\\n\\t\\t\\tcan be used to retrieve the next page of results. This value is <code>null</code> when\\n\\t\\t\\tthere are no more results to return.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ecs#ListAttributes\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ecs#ListAttributesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ecs#ListAttributesResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.ecs#ClusterNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#InvalidParameterException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Lists the attributes for Amazon ECS resources within a specified target type and cluster.\\n\\t\\t\\tWhen you specify a target type and cluster, <code>ListAttributes</code> returns a list\\n\\t\\t\\tof attribute objects, one for each attribute on each resource. You can filter the list\\n\\t\\t\\tof results to a single attribute name to only return results that have that name. You\\n\\t\\t\\tcan also filter the results by attribute name and value. You can do this, for example,\\n\\t\\t\\tto see which container instances in a cluster are running a Linux AMI\\n\\t\\t\\t\\t(<code>ecs.os-type=linux</code>). </p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To list container instances that have a specific attribute\",\n                        \"documentation\": \"This example lists attributes for a container instance with the attribute \\\"stack\\\" equal to the value \\\"production\\\".\",\n                        \"input\": {\n                            \"cluster\": \"MyCluster\",\n                            \"targetType\": \"container-instance\",\n                            \"attributeName\": \"stack\",\n                            \"attributeValue\": \"production\"\n                        },\n                        \"output\": {\n                            \"attributes\": [\n                                {\n                                    \"name\": \"stack\",\n                                    \"targetId\": \"arn:aws:ecs:us-west-2:123456789012:container-instance/1c3be8ed-df30-47b4-8f1e-6e68ebd01f34\",\n                                    \"value\": \"production\"\n                                }\n                            ]\n                        }\n                    }\n                ],\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"nextToken\",\n                    \"outputToken\": \"nextToken\",\n                    \"items\": \"attributes\",\n                    \"pageSize\": \"maxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ecs#ListAttributesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"cluster\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The short name or full Amazon Resource Name (ARN) of the cluster to list attributes.\\n\\t\\t\\tIf you do not specify a cluster, the default cluster is assumed.</p>\"\n                    }\n                },\n                \"targetType\": {\n                    \"target\": \"com.amazonaws.ecs#TargetType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of the target to list attributes with.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"attributeName\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the attribute to filter the results with. </p>\"\n                    }\n                },\n                \"attributeValue\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The value of the attribute to filter results with. You must also specify an attribute\\n\\t\\t\\tname to use this parameter.</p>\"\n                    }\n                },\n                \"nextToken\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>nextToken</code> value returned from a <code>ListAttributes</code> request\\n\\t\\t\\tindicating that more results are available to fulfill the request and further calls are\\n\\t\\t\\tneeded. If <code>maxResults</code> was provided, it's possible the number of results to\\n\\t\\t\\tbe fewer than <code>maxResults</code>.</p>\\n         <note>\\n            <p>This token should be treated as an opaque identifier that is only used to\\n                retrieve the next items in a list and not for other programmatic purposes.</p>\\n         </note>\"\n                    }\n                },\n                \"maxResults\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedInteger\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of cluster results that <code>ListAttributes</code> returned in\\n\\t\\t\\tpaginated output. When this parameter is used, <code>ListAttributes</code> only returns\\n\\t\\t\\t\\t<code>maxResults</code> results in a single page along with a <code>nextToken</code>\\n\\t\\t\\tresponse element. The remaining results of the initial request can be seen by sending\\n\\t\\t\\tanother <code>ListAttributes</code> request with the returned <code>nextToken</code>\\n\\t\\t\\tvalue. This value can be between 1 and 100. If this\\n\\t\\t\\tparameter isn't used, then <code>ListAttributes</code> returns up to\\n\\t\\t\\t100 results and a <code>nextToken</code> value if applicable.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ecs#ListAttributesResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"attributes\": {\n                    \"target\": \"com.amazonaws.ecs#Attributes\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of attribute objects that meet the criteria of the request.</p>\"\n                    }\n                },\n                \"nextToken\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>nextToken</code> value to include in a future <code>ListAttributes</code>\\n\\t\\t\\trequest. When the results of a <code>ListAttributes</code> request exceed\\n\\t\\t\\t\\t<code>maxResults</code>, this value can be used to retrieve the next page of\\n\\t\\t\\tresults. This value is <code>null</code> when there are no more results to\\n\\t\\t\\treturn.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ecs#ListClusters\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ecs#ListClustersRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ecs#ListClustersResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.ecs#ClientException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ServerException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns a list of existing clusters.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To list your available clusters\",\n                        \"documentation\": \"This example lists all of your available clusters in your default region.\",\n                        \"output\": {\n                            \"clusterArns\": [\n                                \"arn:aws:ecs:us-east-1:<aws_account_id>:cluster/test\",\n                                \"arn:aws:ecs:us-east-1:<aws_account_id>:cluster/default\"\n                            ]\n                        }\n                    }\n                ],\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"nextToken\",\n                    \"outputToken\": \"nextToken\",\n                    \"items\": \"clusterArns\",\n                    \"pageSize\": \"maxResults\"\n                },\n                \"smithy.test#smokeTests\": [\n                    {\n                        \"id\": \"ListClustersSuccess\",\n                        \"params\": {},\n                        \"vendorParams\": {\n                            \"region\": \"us-west-2\"\n                        },\n                        \"vendorParamsShape\": \"aws.test#AwsVendorParams\",\n                        \"expect\": {\n                            \"success\": {}\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ecs#ListClustersRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"nextToken\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>nextToken</code> value returned from a <code>ListClusters</code> request\\n\\t\\t\\tindicating that more results are available to fulfill the request and further calls are\\n\\t\\t\\tneeded. If <code>maxResults</code> was provided, it's possible the number of results to\\n\\t\\t\\tbe fewer than <code>maxResults</code>.</p>\\n         <note>\\n            <p>This token should be treated as an opaque identifier that is only used to\\n                retrieve the next items in a list and not for other programmatic purposes.</p>\\n         </note>\"\n                    }\n                },\n                \"maxResults\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedInteger\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of cluster results that <code>ListClusters</code> returned in\\n\\t\\t\\tpaginated output. When this parameter is used, <code>ListClusters</code> only returns\\n\\t\\t\\t\\t<code>maxResults</code> results in a single page along with a <code>nextToken</code>\\n\\t\\t\\tresponse element. The remaining results of the initial request can be seen by sending\\n\\t\\t\\tanother <code>ListClusters</code> request with the returned <code>nextToken</code>\\n\\t\\t\\tvalue. This value can be between 1 and 100. If this\\n\\t\\t\\tparameter isn't used, then <code>ListClusters</code> returns up to 100\\n\\t\\t\\tresults and a <code>nextToken</code> value if applicable.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ecs#ListClustersResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"clusterArns\": {\n                    \"target\": \"com.amazonaws.ecs#StringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The list of full Amazon Resource Name (ARN) entries for each cluster that's associated with your\\n\\t\\t\\taccount.</p>\"\n                    }\n                },\n                \"nextToken\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>nextToken</code> value to include in a future <code>ListClusters</code>\\n\\t\\t\\trequest. When the results of a <code>ListClusters</code> request exceed\\n\\t\\t\\t\\t<code>maxResults</code>, this value can be used to retrieve the next page of\\n\\t\\t\\tresults. This value is <code>null</code> when there are no more results to\\n\\t\\t\\treturn.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ecs#ListContainerInstances\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ecs#ListContainerInstancesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ecs#ListContainerInstancesResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.ecs#ClientException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ClusterNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ServerException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns a list of container instances in a specified cluster. You can filter the\\n\\t\\t\\tresults of a <code>ListContainerInstances</code> operation with cluster query language\\n\\t\\t\\tstatements inside the <code>filter</code> parameter. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/cluster-query-language.html\\\">Cluster Query Language</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To list your available container instances in a cluster\",\n                        \"documentation\": \"This example lists all of your available container instances in the specified cluster in your default region.\",\n                        \"input\": {\n                            \"cluster\": \"default\"\n                        },\n                        \"output\": {\n                            \"containerInstanceArns\": [\n                                \"arn:aws:ecs:us-east-1:<aws_account_id>:container-instance/default/f6bbb147-5370-4ace-8c73-c7181ded911f\",\n                                \"arn:aws:ecs:us-east-1:<aws_account_id>:container-instance/default/ffe3d344-77e2-476c-a4d0-bf560ad50acb\"\n                            ]\n                        }\n                    }\n                ],\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"nextToken\",\n                    \"outputToken\": \"nextToken\",\n                    \"items\": \"containerInstanceArns\",\n                    \"pageSize\": \"maxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ecs#ListContainerInstancesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"cluster\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The short name or full Amazon Resource Name (ARN) of the cluster that hosts the container instances to\\n\\t\\t\\tlist. If you do not specify a cluster, the default cluster is assumed.</p>\"\n                    }\n                },\n                \"filter\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>You can filter the results of a <code>ListContainerInstances</code> operation with\\n\\t\\t\\tcluster query language statements. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/cluster-query-language.html\\\">Cluster Query Language</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\"\n                    }\n                },\n                \"nextToken\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>nextToken</code> value returned from a <code>ListContainerInstances</code>\\n\\t\\t\\trequest indicating that more results are available to fulfill the request and further\\n\\t\\t\\tcalls are needed. If <code>maxResults</code> was provided, it's possible the number of\\n\\t\\t\\tresults to be fewer than <code>maxResults</code>.</p>\\n         <note>\\n            <p>This token should be treated as an opaque identifier that is only used to\\n                retrieve the next items in a list and not for other programmatic purposes.</p>\\n         </note>\"\n                    }\n                },\n                \"maxResults\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedInteger\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of container instance results that\\n\\t\\t\\t\\t<code>ListContainerInstances</code> returned in paginated output. When this\\n\\t\\t\\tparameter is used, <code>ListContainerInstances</code> only returns\\n\\t\\t\\t\\t<code>maxResults</code> results in a single page along with a <code>nextToken</code>\\n\\t\\t\\tresponse element. The remaining results of the initial request can be seen by sending\\n\\t\\t\\tanother <code>ListContainerInstances</code> request with the returned\\n\\t\\t\\t\\t<code>nextToken</code> value. This value can be between 1 and\\n\\t\\t\\t100. If this parameter isn't used, then\\n\\t\\t\\t\\t<code>ListContainerInstances</code> returns up to 100 results and\\n\\t\\t\\ta <code>nextToken</code> value if applicable.</p>\"\n                    }\n                },\n                \"status\": {\n                    \"target\": \"com.amazonaws.ecs#ContainerInstanceStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Filters the container instances by status. For example, if you specify the\\n\\t\\t\\t\\t<code>DRAINING</code> status, the results include only container instances that have\\n\\t\\t\\tbeen set to <code>DRAINING</code> using <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_UpdateContainerInstancesState.html\\\">UpdateContainerInstancesState</a>. If you don't specify this parameter, the\\n\\t\\t\\tdefault is to include container instances set to all states other than\\n\\t\\t\\t\\t<code>INACTIVE</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ecs#ListContainerInstancesResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"containerInstanceArns\": {\n                    \"target\": \"com.amazonaws.ecs#StringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The list of container instances with full ARN entries for each container instance\\n\\t\\t\\tassociated with the specified cluster.</p>\"\n                    }\n                },\n                \"nextToken\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>nextToken</code> value to include in a future\\n\\t\\t\\t\\t<code>ListContainerInstances</code> request. When the results of a\\n\\t\\t\\t\\t<code>ListContainerInstances</code> request exceed <code>maxResults</code>, this\\n\\t\\t\\tvalue can be used to retrieve the next page of results. This value is <code>null</code>\\n\\t\\t\\twhen there are no more results to return.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ecs#ListServiceDeployments\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ecs#ListServiceDeploymentsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ecs#ListServiceDeploymentsResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.ecs#AccessDeniedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ClientException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ServerException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ServiceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#UnsupportedFeatureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This operation lists all the service deployments that meet the specified filter\\n\\t\\t\\tcriteria.</p>\\n         <p>A service deployment happens when you release a software update for the service. You\\n\\t\\t\\troute traffic from the running service revisions to the new service revison and control\\n\\t\\t\\tthe number of running tasks. </p>\\n         <p>This API returns the values that you use for the request parameters in <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_DescribeServiceRevisions.html\\\">DescribeServiceRevisions</a>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To list service deployments that meet the specified criteria\",\n                        \"documentation\": \"This example lists all successful service deployments for the service \\\"sd-example\\\" in the cluster \\\"example\\\".\",\n                        \"input\": {\n                            \"service\": \"sd-example\",\n                            \"cluster\": \"example\",\n                            \"status\": [\n                                \"SUCCESSFUL\"\n                            ]\n                        },\n                        \"output\": {\n                            \"serviceDeployments\": [\n                                {\n                                    \"serviceDeploymentArn\": \"arn:aws:ecs:us-west-2:123456789012:service-deployment/example/sd-example/NCWGC2ZR-taawPAYrIaU5\",\n                                    \"serviceArn\": \"arn:aws:ecs:us-west-2:123456789012:service/example/sd-example\",\n                                    \"clusterArn\": \"arn:aws:ecs:us-west-2:123456789012:cluster/example\",\n                                    \"targetServiceRevisionArn\": \"arn:aws:ecs:us-west-2:123456789012:service-revision/example/sd-example/4980306466373577095\",\n                                    \"status\": \"SUCCESSFUL\"\n                                }\n                            ]\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ecs#ListServiceDeploymentsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"service\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN or name of the service</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"cluster\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The cluster that hosts the service. This can either be the cluster name or ARN.\\n\\t\\t\\tStarting April 15, 2023, Amazon Web Services will not onboard new customers to Amazon\\n\\t\\t\\tElastic Inference (EI), and will help current customers migrate their workloads to\\n\\t\\t\\toptions that offer better price and performance. If you don't specify a cluster,\\n\\t\\t\\t\\t<code>default</code> is used.</p>\"\n                    }\n                },\n                \"status\": {\n                    \"target\": \"com.amazonaws.ecs#ServiceDeploymentStatusList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An optional filter you can use to narrow the results. If you do not specify a status,\\n\\t\\t\\tthen all status values are included in the result.</p>\"\n                    }\n                },\n                \"createdAt\": {\n                    \"target\": \"com.amazonaws.ecs#CreatedAt\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An optional filter you can use to narrow the results by the service creation date. If\\n\\t\\t\\tyou do not specify a value, the result includes all services created before the current\\n\\t\\t\\ttime. The format is yyyy-MM-dd HH:mm:ss.SSSSSS.</p>\"\n                    }\n                },\n                \"nextToken\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>nextToken</code> value returned from a <code>ListServiceDeployments</code>\\n\\t\\t\\trequest indicating that more results are available to fulfill the request and further\\n\\t\\t\\tcalls are needed. If you provided <code>maxResults</code>, it's possible the number of\\n\\t\\t\\tresults is fewer than <code>maxResults</code>.</p>\"\n                    }\n                },\n                \"maxResults\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedInteger\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of service deployment results that\\n\\t\\t\\t\\t<code>ListServiceDeployments</code> returned in paginated output. When this\\n\\t\\t\\tparameter is used, <code>ListServiceDeployments</code> only returns\\n\\t\\t\\t\\t<code>maxResults</code> results in a single page along with a <code>nextToken</code>\\n\\t\\t\\tresponse element. The remaining results of the initial request can be seen by sending\\n\\t\\t\\tanother <code>ListServiceDeployments</code> request with the returned\\n\\t\\t\\t\\t<code>nextToken</code> value. This value can be between 1 and 100. If this parameter\\n\\t\\t\\tisn't used, then <code>ListServiceDeployments</code> returns up to 20 results and a\\n\\t\\t\\t\\t<code>nextToken</code> value if applicable.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ecs#ListServiceDeploymentsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"serviceDeployments\": {\n                    \"target\": \"com.amazonaws.ecs#ServiceDeploymentsBrief\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An overview of the service deployment, including the following properties:</p>\\n         <ul>\\n            <li>\\n               <p>The ARN of the service deployment.</p>\\n            </li>\\n            <li>\\n               <p>The ARN of the service being deployed.</p>\\n            </li>\\n            <li>\\n               <p>The ARN of the cluster that hosts the service in the service\\n\\t\\t\\t\\t\\tdeployment.</p>\\n            </li>\\n            <li>\\n               <p>The time that the service deployment started.</p>\\n            </li>\\n            <li>\\n               <p>The time that the service deployment completed.</p>\\n            </li>\\n            <li>\\n               <p>The service deployment status.</p>\\n            </li>\\n            <li>\\n               <p>Information about why the service deployment is in the current state.</p>\\n            </li>\\n            <li>\\n               <p>The ARN of the service revision that is being deployed.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"nextToken\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>nextToken</code> value to include in a future\\n\\t\\t\\t\\t<code>ListServiceDeployments</code> request. When the results of a\\n\\t\\t\\t\\t<code>ListServiceDeployments</code> request exceed <code>maxResults</code>, this\\n\\t\\t\\tvalue can be used to retrieve the next page of results. This value is null when there\\n\\t\\t\\tare no more results to return.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ecs#ListServices\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ecs#ListServicesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ecs#ListServicesResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.ecs#ClientException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ClusterNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ServerException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns a list of services. You can filter the results by cluster, launch type, and\\n\\t\\t\\tscheduling strategy.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To list the services in a cluster\",\n                        \"documentation\": \"This example lists the services running in the default cluster for an account.\",\n                        \"output\": {\n                            \"serviceArns\": [\n                                \"arn:aws:ecs:us-east-1:012345678910:service/default/my-http-service\"\n                            ]\n                        }\n                    }\n                ],\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"nextToken\",\n                    \"outputToken\": \"nextToken\",\n                    \"items\": \"serviceArns\",\n                    \"pageSize\": \"maxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ecs#ListServicesByNamespace\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ecs#ListServicesByNamespaceRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ecs#ListServicesByNamespaceResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.ecs#ClientException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#NamespaceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ServerException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This operation lists all of the services that are associated with a Cloud Map\\n\\t\\t\\tnamespace. This list might include services in different clusters. In contrast,\\n\\t\\t\\t\\t<code>ListServices</code> can only list services in one cluster at a time. If you\\n\\t\\t\\tneed to filter the list of services in a single cluster by various parameters, use\\n\\t\\t\\t\\t<code>ListServices</code>. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-connect.html\\\">Service Connect</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"nextToken\",\n                    \"outputToken\": \"nextToken\",\n                    \"items\": \"serviceArns\",\n                    \"pageSize\": \"maxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ecs#ListServicesByNamespaceRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"namespace\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The namespace name or full Amazon Resource Name (ARN) of the Cloud Map namespace to list the services in.</p>\\n         <p>Tasks that run in a namespace can use short names to connect\\n\\tto services in the namespace. Tasks can connect to services across all of the clusters in the namespace.\\n\\tTasks connect through a managed proxy container\\n\\tthat collects logs and metrics for increased visibility.\\n\\tOnly the tasks that Amazon ECS services create are supported with Service Connect.\\n\\tFor more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-connect.html\\\">Service Connect</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"nextToken\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>nextToken</code> value that's returned from a\\n\\t\\t\\t\\t<code>ListServicesByNamespace</code> request. It indicates that more results are\\n\\t\\t\\tavailable to fulfill the request and further calls are needed. If\\n\\t\\t\\t\\t<code>maxResults</code> is returned, it is possible the number of results is less\\n\\t\\t\\tthan <code>maxResults</code>.</p>\"\n                    }\n                },\n                \"maxResults\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedInteger\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of service results that <code>ListServicesByNamespace</code>\\n\\t\\t\\treturns in paginated output. When this parameter is used,\\n\\t\\t\\t\\t<code>ListServicesByNamespace</code> only returns <code>maxResults</code> results in\\n\\t\\t\\ta single page along with a <code>nextToken</code> response element. The remaining\\n\\t\\t\\tresults of the initial request can be seen by sending another\\n\\t\\t\\t\\t<code>ListServicesByNamespace</code> request with the returned\\n\\t\\t\\t\\t<code>nextToken</code> value. This value can be between 1 and\\n\\t\\t\\t100. If this parameter isn't used, then\\n\\t\\t\\t\\t<code>ListServicesByNamespace</code> returns up to\\n\\t\\t\\t10 results and a <code>nextToken</code>\\n\\t\\t\\tvalue if applicable.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ecs#ListServicesByNamespaceResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"serviceArns\": {\n                    \"target\": \"com.amazonaws.ecs#StringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The list of full ARN entries for each service that's associated with the specified\\n\\t\\t\\tnamespace.</p>\"\n                    }\n                },\n                \"nextToken\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>nextToken</code> value to include in a future\\n\\t\\t\\t\\t<code>ListServicesByNamespace</code> request. When the results of a\\n\\t\\t\\t\\t<code>ListServicesByNamespace</code> request exceed <code>maxResults</code>, this\\n\\t\\t\\tvalue can be used to retrieve the next page of results. When there are no more results\\n\\t\\t\\tto return, this value is <code>null</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ecs#ListServicesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"cluster\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The short name or full Amazon Resource Name (ARN) of the cluster to use when filtering the\\n\\t\\t\\t\\t<code>ListServices</code> results. If you do not specify a cluster, the default cluster is assumed.</p>\"\n                    }\n                },\n                \"nextToken\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>nextToken</code> value returned from a <code>ListServices</code> request\\n\\t\\t\\tindicating that more results are available to fulfill the request and further calls will\\n\\t\\t\\tbe needed. If <code>maxResults</code> was provided, it is possible the number of results\\n\\t\\t\\tto be fewer than <code>maxResults</code>.</p>\\n         <note>\\n            <p>This token should be treated as an opaque identifier that is only used to\\n                retrieve the next items in a list and not for other programmatic purposes.</p>\\n         </note>\"\n                    }\n                },\n                \"maxResults\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedInteger\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of service results that <code>ListServices</code> returned in\\n\\t\\t\\tpaginated output. When this parameter is used, <code>ListServices</code> only returns\\n\\t\\t\\t\\t<code>maxResults</code> results in a single page along with a <code>nextToken</code>\\n\\t\\t\\tresponse element. The remaining results of the initial request can be seen by sending\\n\\t\\t\\tanother <code>ListServices</code> request with the returned <code>nextToken</code>\\n\\t\\t\\tvalue. This value can be between 1 and 100. If\\n\\t\\t\\tthis parameter isn't used, then <code>ListServices</code> returns up to\\n\\t\\t\\t10 results and a <code>nextToken</code> value if\\n\\t\\t\\tapplicable.</p>\"\n                    }\n                },\n                \"launchType\": {\n                    \"target\": \"com.amazonaws.ecs#LaunchType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The launch type to use when filtering the <code>ListServices</code> results.</p>\"\n                    }\n                },\n                \"schedulingStrategy\": {\n                    \"target\": \"com.amazonaws.ecs#SchedulingStrategy\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The scheduling strategy to use when filtering the <code>ListServices</code>\\n\\t\\t\\tresults.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ecs#ListServicesResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"serviceArns\": {\n                    \"target\": \"com.amazonaws.ecs#StringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The list of full ARN entries for each service that's associated with the specified\\n\\t\\t\\tcluster.</p>\"\n                    }\n                },\n                \"nextToken\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>nextToken</code> value to include in a future <code>ListServices</code>\\n\\t\\t\\trequest. When the results of a <code>ListServices</code> request exceed\\n\\t\\t\\t\\t<code>maxResults</code>, this value can be used to retrieve the next page of\\n\\t\\t\\tresults. This value is <code>null</code> when there are no more results to\\n\\t\\t\\treturn.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ecs#ListTagsForResource\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ecs#ListTagsForResourceRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ecs#ListTagsForResourceResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.ecs#ClientException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ClusterNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ServerException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>List the tags for an Amazon ECS resource.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To list the tags for a cluster.\",\n                        \"documentation\": \"This example lists the tags for the 'dev' cluster.\",\n                        \"input\": {\n                            \"resourceArn\": \"arn:aws:ecs:region:aws_account_id:cluster/dev\"\n                        },\n                        \"output\": {\n                            \"tags\": [\n                                {\n                                    \"key\": \"team\",\n                                    \"value\": \"dev\"\n                                }\n                            ]\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ecs#ListTagsForResourceRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"resourceArn\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) that identifies the resource to list the tags for. Currently, the\\n\\t\\t\\tsupported resources are Amazon ECS tasks, services, task definitions, clusters, and container\\n\\t\\t\\tinstances.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ecs#ListTagsForResourceResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"tags\": {\n                    \"target\": \"com.amazonaws.ecs#Tags\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags for the resource.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ecs#ListTaskDefinitionFamilies\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ecs#ListTaskDefinitionFamiliesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ecs#ListTaskDefinitionFamiliesResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.ecs#ClientException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ServerException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns a list of task definition families that are registered to your account. This\\n\\t\\t\\tlist includes task definition families that no longer have any <code>ACTIVE</code> task\\n\\t\\t\\tdefinition revisions.</p>\\n         <p>You can filter out task definition families that don't contain any <code>ACTIVE</code>\\n\\t\\t\\ttask definition revisions by setting the <code>status</code> parameter to\\n\\t\\t\\t\\t<code>ACTIVE</code>. You can also filter the results with the\\n\\t\\t\\t\\t<code>familyPrefix</code> parameter.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To filter your registered task definition families\",\n                        \"documentation\": \"This example lists the task definition revisions that start with \\\"hpcc\\\".\",\n                        \"input\": {\n                            \"familyPrefix\": \"hpcc\"\n                        },\n                        \"output\": {\n                            \"families\": [\n                                \"hpcc\",\n                                \"hpcc-c4-8xlarge\"\n                            ]\n                        }\n                    },\n                    {\n                        \"title\": \"To list your registered task definition families\",\n                        \"documentation\": \"This example lists all of your registered task definition families.\",\n                        \"output\": {\n                            \"families\": [\n                                \"node-js-app\",\n                                \"web-timer\",\n                                \"hpcc\",\n                                \"hpcc-c4-8xlarge\"\n                            ]\n                        }\n                    }\n                ],\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"nextToken\",\n                    \"outputToken\": \"nextToken\",\n                    \"items\": \"families\",\n                    \"pageSize\": \"maxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ecs#ListTaskDefinitionFamiliesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"familyPrefix\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>familyPrefix</code> is a string that's used to filter the results of\\n\\t\\t\\t\\t<code>ListTaskDefinitionFamilies</code>. If you specify a <code>familyPrefix</code>,\\n\\t\\t\\tonly task definition family names that begin with the <code>familyPrefix</code> string\\n\\t\\t\\tare returned.</p>\"\n                    }\n                },\n                \"status\": {\n                    \"target\": \"com.amazonaws.ecs#TaskDefinitionFamilyStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The task definition family status to filter the\\n\\t\\t\\t\\t<code>ListTaskDefinitionFamilies</code> results with. By default, both\\n\\t\\t\\t\\t<code>ACTIVE</code> and <code>INACTIVE</code> task definition families are listed.\\n\\t\\t\\tIf this parameter is set to <code>ACTIVE</code>, only task definition families that have\\n\\t\\t\\tan <code>ACTIVE</code> task definition revision are returned. If this parameter is set\\n\\t\\t\\tto <code>INACTIVE</code>, only task definition families that do not have any\\n\\t\\t\\t\\t<code>ACTIVE</code> task definition revisions are returned. If you paginate the\\n\\t\\t\\tresulting output, be sure to keep the <code>status</code> value constant in each\\n\\t\\t\\tsubsequent request.</p>\"\n                    }\n                },\n                \"nextToken\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>nextToken</code> value returned from a\\n\\t\\t\\t\\t<code>ListTaskDefinitionFamilies</code> request indicating that more results are\\n\\t\\t\\tavailable to fulfill the request and further calls will be needed. If\\n\\t\\t\\t\\t<code>maxResults</code> was provided, it is possible the number of results to be\\n\\t\\t\\tfewer than <code>maxResults</code>.</p>\\n         <note>\\n            <p>This token should be treated as an opaque identifier that is only used to\\n                retrieve the next items in a list and not for other programmatic purposes.</p>\\n         </note>\"\n                    }\n                },\n                \"maxResults\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedInteger\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of task definition family results that\\n\\t\\t\\t\\t<code>ListTaskDefinitionFamilies</code> returned in paginated output. When this\\n\\t\\t\\tparameter is used, <code>ListTaskDefinitions</code> only returns <code>maxResults</code>\\n\\t\\t\\tresults in a single page along with a <code>nextToken</code> response element. The\\n\\t\\t\\tremaining results of the initial request can be seen by sending another\\n\\t\\t\\t\\t<code>ListTaskDefinitionFamilies</code> request with the returned\\n\\t\\t\\t\\t<code>nextToken</code> value. This value can be between 1 and\\n\\t\\t\\t100. If this parameter isn't used, then\\n\\t\\t\\t\\t<code>ListTaskDefinitionFamilies</code> returns up to 100 results\\n\\t\\t\\tand a <code>nextToken</code> value if applicable.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ecs#ListTaskDefinitionFamiliesResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"families\": {\n                    \"target\": \"com.amazonaws.ecs#StringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The list of task definition family names that match the\\n\\t\\t\\t\\t<code>ListTaskDefinitionFamilies</code> request.</p>\"\n                    }\n                },\n                \"nextToken\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>nextToken</code> value to include in a future\\n\\t\\t\\t\\t<code>ListTaskDefinitionFamilies</code> request. When the results of a\\n\\t\\t\\t\\t<code>ListTaskDefinitionFamilies</code> request exceed <code>maxResults</code>, this\\n\\t\\t\\tvalue can be used to retrieve the next page of results. This value is <code>null</code>\\n\\t\\t\\twhen there are no more results to return.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ecs#ListTaskDefinitions\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ecs#ListTaskDefinitionsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ecs#ListTaskDefinitionsResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.ecs#ClientException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ServerException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns a list of task definitions that are registered to your account. You can filter\\n\\t\\t\\tthe results by family name with the <code>familyPrefix</code> parameter or by status\\n\\t\\t\\twith the <code>status</code> parameter.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To list the registered task definitions in a family\",\n                        \"documentation\": \"This example lists the task definition revisions of a specified family.\",\n                        \"input\": {\n                            \"familyPrefix\": \"wordpress\"\n                        },\n                        \"output\": {\n                            \"taskDefinitionArns\": [\n                                \"arn:aws:ecs:us-east-1:<aws_account_id>:task-definition/wordpress:3\",\n                                \"arn:aws:ecs:us-east-1:<aws_account_id>:task-definition/wordpress:4\",\n                                \"arn:aws:ecs:us-east-1:<aws_account_id>:task-definition/wordpress:5\",\n                                \"arn:aws:ecs:us-east-1:<aws_account_id>:task-definition/wordpress:6\"\n                            ]\n                        }\n                    },\n                    {\n                        \"title\": \"To list your registered task definitions\",\n                        \"documentation\": \"This example lists all of your registered task definitions.\",\n                        \"output\": {\n                            \"taskDefinitionArns\": [\n                                \"arn:aws:ecs:us-east-1:<aws_account_id>:task-definition/sleep300:2\",\n                                \"arn:aws:ecs:us-east-1:<aws_account_id>:task-definition/sleep360:1\",\n                                \"arn:aws:ecs:us-east-1:<aws_account_id>:task-definition/wordpress:3\",\n                                \"arn:aws:ecs:us-east-1:<aws_account_id>:task-definition/wordpress:4\",\n                                \"arn:aws:ecs:us-east-1:<aws_account_id>:task-definition/wordpress:5\",\n                                \"arn:aws:ecs:us-east-1:<aws_account_id>:task-definition/wordpress:6\"\n                            ]\n                        }\n                    }\n                ],\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"nextToken\",\n                    \"outputToken\": \"nextToken\",\n                    \"items\": \"taskDefinitionArns\",\n                    \"pageSize\": \"maxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ecs#ListTaskDefinitionsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"familyPrefix\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The full family name to filter the <code>ListTaskDefinitions</code> results with.\\n\\t\\t\\tSpecifying a <code>familyPrefix</code> limits the listed task definitions to task\\n\\t\\t\\tdefinition revisions that belong to that family.</p>\"\n                    }\n                },\n                \"status\": {\n                    \"target\": \"com.amazonaws.ecs#TaskDefinitionStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The task definition status to filter the <code>ListTaskDefinitions</code> results\\n\\t\\t\\twith. By default, only <code>ACTIVE</code> task definitions are listed. By setting this\\n\\t\\t\\tparameter to <code>INACTIVE</code>, you can view task definitions that are\\n\\t\\t\\t\\t<code>INACTIVE</code> as long as an active task or service still references them. If\\n\\t\\t\\tyou paginate the resulting output, be sure to keep the <code>status</code> value\\n\\t\\t\\tconstant in each subsequent request.</p>\"\n                    }\n                },\n                \"sort\": {\n                    \"target\": \"com.amazonaws.ecs#SortOrder\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The order to sort the results in. Valid values are <code>ASC</code> and\\n\\t\\t\\t\\t<code>DESC</code>. By default, (<code>ASC</code>) task definitions are listed\\n\\t\\t\\tlexicographically by family name and in ascending numerical order by revision so that\\n\\t\\t\\tthe newest task definitions in a family are listed last. Setting this parameter to\\n\\t\\t\\t\\t<code>DESC</code> reverses the sort order on family name and revision. This is so\\n\\t\\t\\tthat the newest task definitions in a family are listed first.</p>\"\n                    }\n                },\n                \"nextToken\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>nextToken</code> value returned from a <code>ListTaskDefinitions</code>\\n\\t\\t\\trequest indicating that more results are available to fulfill the request and further\\n\\t\\t\\tcalls will be needed. If <code>maxResults</code> was provided, it is possible the number\\n\\t\\t\\tof results to be fewer than <code>maxResults</code>.</p>\\n         <note>\\n            <p>This token should be treated as an opaque identifier that is only used to\\n                retrieve the next items in a list and not for other programmatic purposes.</p>\\n         </note>\"\n                    }\n                },\n                \"maxResults\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedInteger\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of task definition results that <code>ListTaskDefinitions</code>\\n\\t\\t\\treturned in paginated output. When this parameter is used,\\n\\t\\t\\t\\t<code>ListTaskDefinitions</code> only returns <code>maxResults</code> results in a\\n\\t\\t\\tsingle page along with a <code>nextToken</code> response element. The remaining results\\n\\t\\t\\tof the initial request can be seen by sending another <code>ListTaskDefinitions</code>\\n\\t\\t\\trequest with the returned <code>nextToken</code> value. This value can be between\\n\\t\\t\\t1 and 100. If this parameter isn't used, then\\n\\t\\t\\t\\t<code>ListTaskDefinitions</code> returns up to 100 results and a\\n\\t\\t\\t\\t<code>nextToken</code> value if applicable.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ecs#ListTaskDefinitionsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"taskDefinitionArns\": {\n                    \"target\": \"com.amazonaws.ecs#StringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The list of task definition Amazon Resource Name (ARN) entries for the <code>ListTaskDefinitions</code>\\n\\t\\t\\trequest.</p>\"\n                    }\n                },\n                \"nextToken\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>nextToken</code> value to include in a future\\n\\t\\t\\t\\t<code>ListTaskDefinitions</code> request. When the results of a\\n\\t\\t\\t\\t<code>ListTaskDefinitions</code> request exceed <code>maxResults</code>, this value\\n\\t\\t\\tcan be used to retrieve the next page of results. This value is <code>null</code> when\\n\\t\\t\\tthere are no more results to return.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ecs#ListTasks\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ecs#ListTasksRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ecs#ListTasksResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.ecs#ClientException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ClusterNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ServerException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ServiceNotFoundException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns a list of tasks. You can filter the results by cluster, task definition\\n\\t\\t\\tfamily, container instance, launch type, what IAM principal started the task, or by\\n\\t\\t\\tthe desired status of the task.</p>\\n         <p>Recently stopped tasks might appear in the returned results. </p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To list the tasks on a particular container instance\",\n                        \"documentation\": \"This example lists the tasks of a specified container instance. Specifying a ``containerInstance`` value limits  the  results  to  tasks  that belong to that container instance.\",\n                        \"input\": {\n                            \"cluster\": \"default\",\n                            \"containerInstance\": \"f6bbb147-5370-4ace-8c73-c7181ded911f\"\n                        },\n                        \"output\": {\n                            \"taskArns\": [\n                                \"arn:aws:ecs:us-east-1:012345678910:task/default/0cc43cdb-3bee-4407-9c26-c0e6ea5bee84\"\n                            ]\n                        }\n                    },\n                    {\n                        \"title\": \"To list the tasks in a cluster\",\n                        \"documentation\": \"This example lists all of the tasks in a cluster.\",\n                        \"input\": {\n                            \"cluster\": \"default\"\n                        },\n                        \"output\": {\n                            \"taskArns\": [\n                                \"arn:aws:ecs:us-east-1:012345678910:task/default/0cc43cdb-3bee-4407-9c26-c0e6ea5bee84\",\n                                \"arn:aws:ecs:us-east-1:012345678910:task/default/6b809ef6-c67e-4467-921f-ee261c15a0a1\"\n                            ]\n                        }\n                    }\n                ],\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"nextToken\",\n                    \"outputToken\": \"nextToken\",\n                    \"items\": \"taskArns\",\n                    \"pageSize\": \"maxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.ecs#ListTasksRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"cluster\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The short name or full Amazon Resource Name (ARN) of the cluster to use when filtering the\\n\\t\\t\\t\\t<code>ListTasks</code> results. If you do not specify a cluster, the default cluster is assumed.</p>\"\n                    }\n                },\n                \"containerInstance\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The container instance ID or full ARN of the container instance to use when\\n\\t\\t\\tfiltering the <code>ListTasks</code> results. Specifying a\\n\\t\\t\\t\\t<code>containerInstance</code> limits the results to tasks that belong to that\\n\\t\\t\\tcontainer instance.</p>\"\n                    }\n                },\n                \"family\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the task definition family to use when filtering the\\n\\t\\t\\t\\t<code>ListTasks</code> results. Specifying a <code>family</code> limits the results\\n\\t\\t\\tto tasks that belong to that family.</p>\"\n                    }\n                },\n                \"nextToken\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>nextToken</code> value returned from a <code>ListTasks</code> request\\n\\t\\t\\tindicating that more results are available to fulfill the request and further calls will\\n\\t\\t\\tbe needed. If <code>maxResults</code> was provided, it's possible the number of results\\n\\t\\t\\tto be fewer than <code>maxResults</code>.</p>\\n         <note>\\n            <p>This token should be treated as an opaque identifier that is only used to\\n                retrieve the next items in a list and not for other programmatic purposes.</p>\\n         </note>\"\n                    }\n                },\n                \"maxResults\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedInteger\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of task results that <code>ListTasks</code> returned in paginated\\n\\t\\t\\toutput. When this parameter is used, <code>ListTasks</code> only returns\\n\\t\\t\\t\\t<code>maxResults</code> results in a single page along with a <code>nextToken</code>\\n\\t\\t\\tresponse element. The remaining results of the initial request can be seen by sending\\n\\t\\t\\tanother <code>ListTasks</code> request with the returned <code>nextToken</code> value.\\n\\t\\t\\tThis value can be between 1 and 100. If this parameter\\n\\t\\t\\tisn't used, then <code>ListTasks</code> returns up to 100 results and\\n\\t\\t\\ta <code>nextToken</code> value if applicable.</p>\"\n                    }\n                },\n                \"startedBy\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>startedBy</code> value to filter the task results with. Specifying a\\n\\t\\t\\t\\t<code>startedBy</code> value limits the results to tasks that were started with that\\n\\t\\t\\tvalue.</p>\\n         <p>When you specify <code>startedBy</code> as the filter, it must be the only filter that\\n\\t\\t\\tyou use.</p>\"\n                    }\n                },\n                \"serviceName\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the service to use when filtering the <code>ListTasks</code> results.\\n\\t\\t\\tSpecifying a <code>serviceName</code> limits the results to tasks that belong to that\\n\\t\\t\\tservice.</p>\"\n                    }\n                },\n                \"desiredStatus\": {\n                    \"target\": \"com.amazonaws.ecs#DesiredStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The task desired status to use when filtering the <code>ListTasks</code> results.\\n\\t\\t\\tSpecifying a <code>desiredStatus</code> of <code>STOPPED</code> limits the results to\\n\\t\\t\\ttasks that Amazon ECS has set the desired status to <code>STOPPED</code>. This can be useful\\n\\t\\t\\tfor debugging tasks that aren't starting properly or have died or finished. The default\\n\\t\\t\\tstatus filter is <code>RUNNING</code>, which shows tasks that Amazon ECS has set the desired\\n\\t\\t\\tstatus to <code>RUNNING</code>.</p>\\n         <note>\\n            <p>Although you can filter results based on a desired status of <code>PENDING</code>,\\n\\t\\t\\t\\tthis doesn't return any results. Amazon ECS never sets the desired status of a task to\\n\\t\\t\\t\\tthat value (only a task's <code>lastStatus</code> may have a value of\\n\\t\\t\\t\\t\\t<code>PENDING</code>).</p>\\n         </note>\"\n                    }\n                },\n                \"launchType\": {\n                    \"target\": \"com.amazonaws.ecs#LaunchType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The launch type to use when filtering the <code>ListTasks</code> results.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ecs#ListTasksResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"taskArns\": {\n                    \"target\": \"com.amazonaws.ecs#StringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The list of task ARN entries for the <code>ListTasks</code> request.</p>\"\n                    }\n                },\n                \"nextToken\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>nextToken</code> value to include in a future <code>ListTasks</code>\\n\\t\\t\\trequest. When the results of a <code>ListTasks</code> request exceed\\n\\t\\t\\t\\t<code>maxResults</code>, this value can be used to retrieve the next page of\\n\\t\\t\\tresults. This value is <code>null</code> when there are no more results to\\n\\t\\t\\treturn.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ecs#LoadBalancer\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"targetGroupArn\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The full Amazon Resource Name (ARN) of the Elastic Load Balancing target group or groups associated with a service or\\n\\t\\t\\ttask set.</p>\\n         <p>A target group ARN is only specified when using an Application Load Balancer or Network Load Balancer. </p>\\n         <p>For services using the <code>ECS</code> deployment controller, you can specify one or\\n\\t\\t\\tmultiple target groups. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/register-multiple-targetgroups.html\\\">Registering multiple target groups with a service</a> in\\n\\t\\t\\tthe <i>Amazon Elastic Container Service Developer Guide</i>.</p>\\n         <p>For services using the <code>CODE_DEPLOY</code> deployment controller, you're required\\n\\t\\t\\tto define two target groups for the load balancer. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/deployment-type-bluegreen.html\\\">Blue/green deployment with CodeDeploy</a> in the\\n\\t\\t\\t<i>Amazon Elastic Container Service Developer Guide</i>.</p>\\n         <important>\\n            <p>If your service's task definition uses the <code>awsvpc</code> network mode, you\\n\\t\\t\\t\\tmust choose <code>ip</code> as the target type, not <code>instance</code>. Do this\\n\\t\\t\\t\\twhen creating your target groups because tasks that use the <code>awsvpc</code>\\n\\t\\t\\t\\tnetwork mode are associated with an elastic network interface, not an Amazon EC2\\n\\t\\t\\t\\tinstance. This network mode is required for the Fargate launch\\n\\t\\t\\t\\ttype.</p>\\n         </important>\"\n                    }\n                },\n                \"loadBalancerName\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the load balancer to associate with the Amazon ECS service or task set.</p>\\n         <p>If you are using an Application Load Balancer or a Network Load Balancer the load balancer name parameter should be\\n\\t\\t\\tomitted.</p>\"\n                    }\n                },\n                \"containerName\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the container (as it appears in a container definition) to associate with\\n\\t\\t\\tthe load balancer.</p>\\n         <p>You need to specify the container name when configuring the target group for an Amazon ECS\\n\\t\\t\\tload balancer.</p>\"\n                    }\n                },\n                \"containerPort\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedInteger\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The port on the container to associate with the load balancer. This port must\\n\\t\\t\\tcorrespond to a <code>containerPort</code> in the task definition the tasks in the\\n\\t\\t\\tservice are using. For tasks that use the EC2 launch type, the container\\n\\t\\t\\tinstance they're launched on must allow ingress traffic on the <code>hostPort</code> of\\n\\t\\t\\tthe port mapping.</p>\"\n                    }\n                },\n                \"advancedConfiguration\": {\n                    \"target\": \"com.amazonaws.ecs#AdvancedConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The advanced settings for the load balancer used in blue/green deployments. Specify the alternate target group, listener rules, and IAM role required for traffic shifting during blue/green deployments.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The load balancer configuration to use with a service or task set.</p>\\n         <p>When you add, update, or remove a load balancer configuration, Amazon ECS starts a new\\n\\t\\t\\tdeployment with the updated Elastic Load Balancing configuration. This causes tasks to register to and\\n\\t\\t\\tderegister from load balancers.</p>\\n         <p>We recommend that you verify this on a test environment before you update the Elastic Load Balancing\\n\\t\\t\\tconfiguration. </p>\\n         <p>A service-linked role is required for services that use multiple target groups. For\\n\\t\\t\\tmore information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/using-service-linked-roles.html\\\">Using\\n\\t\\t\\t\\tservice-linked roles</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#LoadBalancers\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#LoadBalancer\"\n            }\n        },\n        \"com.amazonaws.ecs#LocalStorage\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"INCLUDED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"included\"\n                    }\n                },\n                \"REQUIRED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"required\"\n                    }\n                },\n                \"EXCLUDED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"excluded\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ecs#LocalStorageType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"HDD\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"hdd\"\n                    }\n                },\n                \"SSD\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ssd\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ecs#LocalStorageTypeSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#LocalStorageType\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"item\"\n                }\n            }\n        },\n        \"com.amazonaws.ecs#LogConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"logDriver\": {\n                    \"target\": \"com.amazonaws.ecs#LogDriver\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The log driver to use for the container.</p>\\n         <p>For tasks on Fargate, the supported log drivers are <code>awslogs</code>,\\n\\t\\t\\t\\t<code>splunk</code>, and <code>awsfirelens</code>.</p>\\n         <p>For tasks hosted on Amazon EC2 instances, the supported log drivers are\\n\\t\\t\\t\\t<code>awslogs</code>, <code>fluentd</code>, <code>gelf</code>,\\n\\t\\t\\t\\t<code>json-file</code>, <code>journald</code>, <code>syslog</code>,\\n\\t\\t\\t\\t<code>splunk</code>, and <code>awsfirelens</code>.</p>\\n         <p>For more information about using the <code>awslogs</code> log driver, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/using_awslogs.html\\\">Send\\n\\t\\t\\t\\tAmazon ECS logs to CloudWatch</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\\n         <p>For more information about using the <code>awsfirelens</code> log driver, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/using_firelens.html\\\">Send\\n\\t\\t\\t\\tAmazon ECS logs to an Amazon Web Services service or Amazon Web Services Partner</a>.</p>\\n         <note>\\n            <p>If you have a custom driver that isn't listed, you can fork the Amazon ECS container\\n\\t\\t\\t\\tagent project that's <a href=\\\"https://github.com/aws/amazon-ecs-agent\\\">available\\n\\t\\t\\t\\t\\ton GitHub</a> and customize it to work with that driver. We encourage you to\\n\\t\\t\\t\\tsubmit pull requests for changes that you would like to have included. However, we\\n\\t\\t\\t\\tdon't currently provide support for running modified copies of this software.</p>\\n         </note>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"options\": {\n                    \"target\": \"com.amazonaws.ecs#LogConfigurationOptionsMap\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The configuration options to send to the log driver.</p>\\n         <p>The options you can specify depend on the log driver. Some of the options you can\\n\\t\\t\\tspecify when you use the <code>awslogs</code> log driver to route logs to Amazon CloudWatch\\n\\t\\t\\tinclude the following:</p>\\n         <dl>\\n            <dt>awslogs-create-group</dt>\\n            <dd>\\n               <p>Required: No</p>\\n               <p>Specify whether you want the log group to be created automatically. If\\n\\t\\t\\t\\t\\t\\tthis option isn't specified, it defaults to <code>false</code>.</p>\\n               <note>\\n                  <p>Your IAM policy must include the <code>logs:CreateLogGroup</code>\\n\\t\\t\\t\\t\\t\\t\\tpermission before you attempt to use\\n\\t\\t\\t\\t\\t\\t\\t<code>awslogs-create-group</code>.</p>\\n               </note>\\n            </dd>\\n            <dt>awslogs-region</dt>\\n            <dd>\\n               <p>Required: Yes</p>\\n               <p>Specify the Amazon Web Services Region that the <code>awslogs</code> log driver is to\\n\\t\\t\\t\\t\\t\\tsend your Docker logs to. You can choose to send all of your logs from\\n\\t\\t\\t\\t\\t\\tclusters in different Regions to a single region in CloudWatch Logs. This is so that\\n\\t\\t\\t\\t\\t\\tthey're all visible in one location. Otherwise, you can separate them by\\n\\t\\t\\t\\t\\t\\tRegion for more granularity. Make sure that the specified log group exists\\n\\t\\t\\t\\t\\t\\tin the Region that you specify with this option.</p>\\n            </dd>\\n            <dt>awslogs-group</dt>\\n            <dd>\\n               <p>Required: Yes</p>\\n               <p>Make sure to specify a log group that the <code>awslogs</code> log driver\\n\\t\\t\\t\\t\\t\\tsends its log streams to.</p>\\n            </dd>\\n            <dt>awslogs-stream-prefix</dt>\\n            <dd>\\n               <p>Required: Yes, when using Fargate.Optional when using EC2.</p>\\n               <p>Use the <code>awslogs-stream-prefix</code> option to associate a log\\n\\t\\t\\t\\t\\t\\tstream with the specified prefix, the container name, and the ID of the\\n\\t\\t\\t\\t\\t\\tAmazon ECS task that the container belongs to. If you specify a prefix with this\\n\\t\\t\\t\\t\\t\\toption, then the log stream takes the format\\n\\t\\t\\t\\t\\t\\t\\t<code>prefix-name/container-name/ecs-task-id</code>.</p>\\n               <p>If you don't specify a prefix with this option, then the log stream is\\n\\t\\t\\t\\t\\t\\tnamed after the container ID that's assigned by the Docker daemon on the\\n\\t\\t\\t\\t\\t\\tcontainer instance. Because it's difficult to trace logs back to the\\n\\t\\t\\t\\t\\t\\tcontainer that sent them with just the Docker container ID (which is only\\n\\t\\t\\t\\t\\t\\tavailable on the container instance), we recommend that you specify a prefix\\n\\t\\t\\t\\t\\t\\twith this option.</p>\\n               <p>For Amazon ECS services, you can use the service name as the prefix. Doing so,\\n\\t\\t\\t\\t\\t\\tyou can trace log streams to the service that the container belongs to, the\\n\\t\\t\\t\\t\\t\\tname of the container that sent them, and the ID of the task that the\\n\\t\\t\\t\\t\\t\\tcontainer belongs to.</p>\\n               <p>You must specify a stream-prefix for your logs to have your logs appear in\\n\\t\\t\\t\\t\\t\\tthe Log pane when using the Amazon ECS console.</p>\\n            </dd>\\n            <dt>awslogs-datetime-format</dt>\\n            <dd>\\n               <p>Required: No</p>\\n               <p>This option defines a multiline start pattern in Python\\n\\t\\t\\t\\t\\t\\t\\t<code>strftime</code> format. A log message consists of a line that\\n\\t\\t\\t\\t\\t\\tmatches the pattern and any following lines that don’t match the pattern.\\n\\t\\t\\t\\t\\t\\tThe matched line is the delimiter between log messages.</p>\\n               <p>One example of a use case for using this format is for parsing output such\\n\\t\\t\\t\\t\\t\\tas a stack dump, which might otherwise be logged in multiple entries. The\\n\\t\\t\\t\\t\\t\\tcorrect pattern allows it to be captured in a single entry.</p>\\n               <p>For more information, see <a href=\\\"https://docs.docker.com/config/containers/logging/awslogs/#awslogs-datetime-format\\\">awslogs-datetime-format</a>.</p>\\n               <p>You cannot configure both the <code>awslogs-datetime-format</code> and\\n\\t\\t\\t\\t\\t\\t\\t<code>awslogs-multiline-pattern</code> options.</p>\\n               <note>\\n                  <p>Multiline logging performs regular expression parsing and matching of\\n\\t\\t\\t\\t\\t\\t\\tall log messages. This might have a negative impact on logging\\n\\t\\t\\t\\t\\t\\t\\tperformance.</p>\\n               </note>\\n            </dd>\\n            <dt>awslogs-multiline-pattern</dt>\\n            <dd>\\n               <p>Required: No</p>\\n               <p>This option defines a multiline start pattern that uses a regular\\n\\t\\t\\t\\t\\t\\texpression. A log message consists of a line that matches the pattern and\\n\\t\\t\\t\\t\\t\\tany following lines that don’t match the pattern. The matched line is the\\n\\t\\t\\t\\t\\t\\tdelimiter between log messages.</p>\\n               <p>For more information, see <a href=\\\"https://docs.docker.com/config/containers/logging/awslogs/#awslogs-multiline-pattern\\\">awslogs-multiline-pattern</a>.</p>\\n               <p>This option is ignored if <code>awslogs-datetime-format</code> is also\\n\\t\\t\\t\\t\\t\\tconfigured.</p>\\n               <p>You cannot configure both the <code>awslogs-datetime-format</code> and\\n\\t\\t\\t\\t\\t\\t\\t<code>awslogs-multiline-pattern</code> options.</p>\\n               <note>\\n                  <p>Multiline logging performs regular expression parsing and matching of\\n\\t\\t\\t\\t\\t\\t\\tall log messages. This might have a negative impact on logging\\n\\t\\t\\t\\t\\t\\t\\tperformance.</p>\\n               </note>\\n            </dd>\\n         </dl>\\n         <p>The following options apply to all supported log drivers.</p>\\n         <dl>\\n            <dt>mode</dt>\\n            <dd>\\n               <p>Required: No</p>\\n               <p>Valid values: <code>non-blocking</code> | <code>blocking</code>\\n               </p>\\n               <p>This option defines the delivery mode of log messages from the container\\n\\t\\t\\t\\t\\t\\tto the log driver specified using <code>logDriver</code>. The delivery mode\\n\\t\\t\\t\\t\\t\\tyou choose affects application availability when the flow of logs from\\n\\t\\t\\t\\t\\t\\tcontainer is interrupted.</p>\\n               <p>If you use the <code>blocking</code> mode and the flow of logs is\\n\\t\\t\\t\\t\\t\\tinterrupted, calls from container code to write to the <code>stdout</code>\\n\\t\\t\\t\\t\\t\\tand <code>stderr</code> streams will block. The logging thread of the\\n\\t\\t\\t\\t\\t\\tapplication will block as a result. This may cause the application to become\\n\\t\\t\\t\\t\\t\\tunresponsive and lead to container healthcheck failure. </p>\\n               <p>If you use the <code>non-blocking</code> mode, the container's logs are\\n\\t\\t\\t\\t\\t\\tinstead stored in an in-memory intermediate buffer configured with the\\n\\t\\t\\t\\t\\t\\t\\t<code>max-buffer-size</code> option. This prevents the application from\\n\\t\\t\\t\\t\\t\\tbecoming unresponsive when logs cannot be sent. We recommend using this mode\\n\\t\\t\\t\\t\\t\\tif you want to ensure service availability and are okay with some log loss.\\n\\t\\t\\t\\t\\t\\tFor more information, see <a href=\\\"http://aws.amazon.com/blogs/containers/preventing-log-loss-with-non-blocking-mode-in-the-awslogs-container-log-driver/\\\">Preventing log loss with non-blocking mode in the <code>awslogs</code>\\n\\t\\t\\t\\t\\t\\t\\tcontainer log driver</a>.</p>\\n               <p>You can set a default <code>mode</code> for all containers in a specific\\n\\t\\t\\t\\t\\t\\tAmazon Web Services Region by using the <code>defaultLogDriverMode</code> account setting.\\n\\t\\t\\t\\t\\t\\tIf you don't specify the <code>mode</code> option or\\n\\t\\t\\t\\t\\t\\tconfigure the account setting, Amazon ECS will default to the\\n\\t\\t\\t\\t\\t\\t\\t<code>non-blocking</code> mode. For more information about the account setting, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-account-settings.html#default-log-driver-mode\\\">Default log driver mode</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\\n               <note>\\n                  <p>On June 25, 2025, Amazon ECS changed the default log driver mode from <code>blocking</code> to <code>non-blocking</code> to prioritize task availability over logging. To continue using the <code>blocking</code> mode after this change, do one of the following:</p>\\n                  <ul>\\n                     <li>\\n                        <p>Set the <code>mode</code> option in your container definition's <code>logConfiguration</code> as <code>blocking</code>.</p>\\n                     </li>\\n                     <li>\\n                        <p>Set the <code>defaultLogDriverMode</code> account setting to <code>blocking</code>.</p>\\n                     </li>\\n                  </ul>\\n               </note>\\n            </dd>\\n            <dt>max-buffer-size</dt>\\n            <dd>\\n               <p>Required: No</p>\\n               <p>Default value: <code>10m</code>\\n               </p>\\n               <p>When <code>non-blocking</code> mode is used, the\\n\\t\\t\\t\\t\\t\\t\\t<code>max-buffer-size</code> log option controls the size of the buffer\\n\\t\\t\\t\\t\\t\\tthat's used for intermediate message storage. Make sure to specify an\\n\\t\\t\\t\\t\\t\\tadequate buffer size based on your application. When the buffer fills up,\\n\\t\\t\\t\\t\\t\\tfurther logs cannot be stored. Logs that cannot be stored are lost. </p>\\n            </dd>\\n         </dl>\\n         <p>To route logs using the <code>splunk</code> log router, you need to specify a\\n\\t\\t\\t\\t<code>splunk-token</code> and a <code>splunk-url</code>.</p>\\n         <p>When you use the <code>awsfirelens</code> log router to route logs to an Amazon Web Services Service\\n\\t\\t\\tor Amazon Web Services Partner Network destination for log storage and analytics, you can set the\\n\\t\\t\\t\\t<code>log-driver-buffer-limit</code> option to limit the number of events that are\\n\\t\\t\\tbuffered in memory, before being sent to the log router container. It can help to\\n\\t\\t\\tresolve potential log loss issue because high throughput might result in memory running\\n\\t\\t\\tout for the buffer inside of Docker.</p>\\n         <p>Other options you can specify when using <code>awsfirelens</code> to route logs depend\\n\\t\\t\\ton the destination. When you export logs to Amazon Data Firehose, you can specify the Amazon Web Services Region\\n\\t\\t\\twith <code>region</code> and a name for the log stream with\\n\\t\\t\\t<code>delivery_stream</code>.</p>\\n         <p>When you export logs to Amazon Kinesis Data Streams, you can specify an Amazon Web Services Region with\\n\\t\\t\\t\\t<code>region</code> and a data stream name with <code>stream</code>.</p>\\n         <p> When you export logs to Amazon OpenSearch Service, you can specify options like <code>Name</code>,\\n\\t\\t\\t\\t<code>Host</code> (OpenSearch Service endpoint without protocol), <code>Port</code>,\\n\\t\\t\\t\\t<code>Index</code>, <code>Type</code>, <code>Aws_auth</code>,\\n\\t\\t\\t\\t<code>Aws_region</code>, <code>Suppress_Type_Name</code>, and <code>tls</code>. For\\n\\t\\t\\tmore information, see <a href=\\\"http://aws.amazon.com/blogs/containers/under-the-hood-firelens-for-amazon-ecs-tasks/\\\">Under the hood:\\n\\t\\t\\t\\tFireLens for Amazon ECS Tasks</a>.</p>\\n         <p>When you export logs to Amazon S3, you can specify the bucket using the <code>bucket</code>\\n\\t\\t\\toption. You can also specify <code>region</code>, <code>total_file_size</code>,\\n\\t\\t\\t\\t<code>upload_timeout</code>, and <code>use_put_object</code> as options.</p>\\n         <p>This parameter requires version 1.19 of the Docker Remote API or greater on your container instance. To check the Docker Remote API version on your container instance, log in to your container instance and run the following command: <code>sudo docker version --format '{{.Server.APIVersion}}'</code>\\n         </p>\"\n                    }\n                },\n                \"secretOptions\": {\n                    \"target\": \"com.amazonaws.ecs#SecretList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The secrets to pass to the log configuration. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/specifying-sensitive-data.html\\\">Specifying\\n\\t\\t\\t\\tsensitive data</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The log configuration for the container. This parameter maps to <code>LogConfig</code>\\n\\t\\t\\tin the docker container create command and the <code>--log-driver</code> option to\\n\\t\\t\\tdocker run.</p>\\n         <p>By default, containers use the same logging driver that the Docker daemon uses.\\n\\t\\t\\tHowever, the container might use a different logging driver than the Docker daemon by\\n\\t\\t\\tspecifying a log driver configuration in the container definition.</p>\\n         <p>Understand the following when specifying a log configuration for your\\n\\t\\t\\tcontainers.</p>\\n         <ul>\\n            <li>\\n               <p>Amazon ECS currently supports a subset of the logging drivers available to the\\n\\t\\t\\t\\t\\tDocker daemon. Additional log drivers may be available in future releases of the\\n\\t\\t\\t\\t\\tAmazon ECS container agent.</p>\\n               <p>For tasks on Fargate, the supported log drivers are <code>awslogs</code>,\\n\\t\\t\\t\\t\\t\\t<code>splunk</code>, and <code>awsfirelens</code>.</p>\\n               <p>For tasks hosted on Amazon EC2 instances, the supported log drivers are\\n\\t\\t\\t\\t\\t\\t<code>awslogs</code>, <code>fluentd</code>, <code>gelf</code>,\\n\\t\\t\\t\\t\\t\\t<code>json-file</code>, <code>journald</code>,<code>syslog</code>,\\n\\t\\t\\t\\t\\t\\t<code>splunk</code>, and <code>awsfirelens</code>.</p>\\n            </li>\\n            <li>\\n               <p>This parameter requires version 1.18 of the Docker Remote API or greater on\\n\\t\\t\\t\\t\\tyour container instance.</p>\\n            </li>\\n            <li>\\n               <p>For tasks that are hosted on Amazon EC2 instances, the Amazon ECS container agent must\\n\\t\\t\\t\\t\\tregister the available logging drivers with the\\n\\t\\t\\t\\t\\t\\t<code>ECS_AVAILABLE_LOGGING_DRIVERS</code> environment variable before\\n\\t\\t\\t\\t\\tcontainers placed on that instance can use these log configuration options. For\\n\\t\\t\\t\\t\\tmore information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-agent-config.html\\\">Amazon ECS container agent configuration</a> in the\\n\\t\\t\\t\\t\\t<i>Amazon Elastic Container Service Developer Guide</i>.</p>\\n            </li>\\n            <li>\\n               <p>For tasks that are on Fargate, because you don't have access to the\\n\\t\\t\\t\\t\\tunderlying infrastructure your tasks are hosted on, any additional software\\n\\t\\t\\t\\t\\tneeded must be installed outside of the task. For example, the Fluentd output\\n\\t\\t\\t\\t\\taggregators or a remote host running Logstash to send Gelf logs to.</p>\\n            </li>\\n         </ul>\"\n            }\n        },\n        \"com.amazonaws.ecs#LogConfigurationOptionsMap\": {\n            \"type\": \"map\",\n            \"key\": {\n                \"target\": \"com.amazonaws.ecs#String\"\n            },\n            \"value\": {\n                \"target\": \"com.amazonaws.ecs#String\"\n            }\n        },\n        \"com.amazonaws.ecs#LogDriver\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"JSON_FILE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"json-file\"\n                    }\n                },\n                \"SYSLOG\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"syslog\"\n                    }\n                },\n                \"JOURNALD\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"journald\"\n                    }\n                },\n                \"GELF\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"gelf\"\n                    }\n                },\n                \"FLUENTD\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"fluentd\"\n                    }\n                },\n                \"AWSLOGS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"awslogs\"\n                    }\n                },\n                \"SPLUNK\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"splunk\"\n                    }\n                },\n                \"AWSFIRELENS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"awsfirelens\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ecs#Long\": {\n            \"type\": \"long\",\n            \"traits\": {\n                \"smithy.api#default\": 0\n            }\n        },\n        \"com.amazonaws.ecs#ManagedAgent\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"lastStartedAt\": {\n                    \"target\": \"com.amazonaws.ecs#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Unix timestamp for the time when the managed agent was last started.</p>\"\n                    }\n                },\n                \"name\": {\n                    \"target\": \"com.amazonaws.ecs#ManagedAgentName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the managed agent. When the execute command feature is turned on, the\\n\\t\\t\\tmanaged agent name is <code>ExecuteCommandAgent</code>.</p>\"\n                    }\n                },\n                \"reason\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The reason for why the managed agent is in the state it is in.</p>\"\n                    }\n                },\n                \"lastStatus\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The last known status of the managed agent.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Details about the managed agent status for the container.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#ManagedAgentName\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ExecuteCommandAgent\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ExecuteCommandAgent\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ecs#ManagedAgentStateChange\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"containerName\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the container that's associated with the managed agent.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"managedAgentName\": {\n                    \"target\": \"com.amazonaws.ecs#ManagedAgentName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the managed agent.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"status\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The status of the managed agent.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"reason\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The reason for the status of the managed agent.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>An object representing a change in state for a managed agent.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#ManagedAgentStateChanges\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#ManagedAgentStateChange\"\n            }\n        },\n        \"com.amazonaws.ecs#ManagedAgents\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#ManagedAgent\"\n            }\n        },\n        \"com.amazonaws.ecs#ManagedDraining\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ENABLED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ENABLED\"\n                    }\n                },\n                \"DISABLED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DISABLED\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ecs#ManagedInstancesMonitoringOptions\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"BASIC\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"BASIC\"\n                    }\n                },\n                \"DETAILED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DETAILED\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ecs#ManagedInstancesNetworkConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"subnets\": {\n                    \"target\": \"com.amazonaws.ecs#StringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The list of subnet IDs where Amazon ECS can launch Amazon ECS Managed Instances. Instances are distributed across the specified subnets for high availability. All subnets must be in the same VPC.</p>\"\n                    }\n                },\n                \"securityGroups\": {\n                    \"target\": \"com.amazonaws.ecs#StringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The list of security group IDs to apply to Amazon ECS Managed Instances. These security groups control the network traffic allowed to and from the instances.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The network configuration for Amazon ECS Managed Instances. This specifies the VPC subnets and security groups that instances use for network connectivity. Amazon ECS Managed Instances support multiple network modes including <code>awsvpc</code> (instances receive ENIs for task isolation), <code>host</code> (instances share network namespace with tasks), and <code>none</code> (no external network connectivity), ensuring backward compatibility for migrating workloads from Fargate or Amazon EC2.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#ManagedInstancesProvider\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"infrastructureRoleArn\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the infrastructure role that Amazon ECS assumes to manage instances. This role must include permissions for Amazon EC2 instance lifecycle management, networking, and any additional Amazon Web Services services required for your workloads.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/infrastructure_IAM_role.html\\\">Amazon ECS infrastructure IAM role</a> in the <i>Amazon ECS Developer Guide</i>.</p>\"\n                    }\n                },\n                \"instanceLaunchTemplate\": {\n                    \"target\": \"com.amazonaws.ecs#InstanceLaunchTemplate\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The launch template that defines how Amazon ECS launches Amazon ECS Managed Instances. This includes the instance profile for your tasks, network and storage configuration, and instance requirements that determine which Amazon EC2 instance types can be used.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-launch-templates.html\\\">Store instance launch parameters in Amazon EC2 launch templates</a> in the <i>Amazon EC2 User Guide</i>.</p>\"\n                    }\n                },\n                \"propagateTags\": {\n                    \"target\": \"com.amazonaws.ecs#PropagateMITags\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Determines whether tags from the capacity provider are automatically applied to Amazon ECS Managed Instances. This helps with cost allocation and resource management by ensuring consistent tagging across your infrastructure.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The configuration for a Amazon ECS Managed Instances provider. Amazon ECS uses this configuration to automatically launch, manage, and terminate Amazon EC2 instances on your behalf. Managed instances provide access to the full range of Amazon EC2 instance types and features while offloading infrastructure management to Amazon Web Services.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#ManagedInstancesStorageConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"storageSizeGiB\": {\n                    \"target\": \"com.amazonaws.ecs#TaskVolumeStorageGiB\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The size of the tasks volume.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The storage configuration for Amazon ECS Managed Instances. This defines the root volume configuration for the instances.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#ManagedScaling\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"status\": {\n                    \"target\": \"com.amazonaws.ecs#ManagedScalingStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Determines whether to use managed scaling for the capacity provider.</p>\"\n                    }\n                },\n                \"targetCapacity\": {\n                    \"target\": \"com.amazonaws.ecs#ManagedScalingTargetCapacity\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The target capacity utilization as a percentage for the capacity provider. The\\n\\t\\t\\tspecified value must be greater than <code>0</code> and less than or equal to\\n\\t\\t\\t\\t<code>100</code>. For example, if you want the capacity provider to maintain 10%\\n\\t\\t\\tspare capacity, then that means the utilization is 90%, so use a\\n\\t\\t\\t\\t<code>targetCapacity</code> of <code>90</code>. The default value of\\n\\t\\t\\t\\t<code>100</code> percent results in the Amazon EC2 instances in your Auto Scaling group\\n\\t\\t\\tbeing completely used.</p>\"\n                    }\n                },\n                \"minimumScalingStepSize\": {\n                    \"target\": \"com.amazonaws.ecs#ManagedScalingStepSize\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The minimum number of Amazon EC2 instances that Amazon ECS will scale out at one time. The scale\\n\\t\\t\\tin process is not affected by this parameter If this parameter is omitted, the default\\n\\t\\t\\tvalue of <code>1</code> is used.</p>\\n         <p>When additional capacity is required, Amazon ECS will scale up the minimum scaling step\\n\\t\\t\\tsize even if the actual demand is less than the minimum scaling step size.</p>\"\n                    }\n                },\n                \"maximumScalingStepSize\": {\n                    \"target\": \"com.amazonaws.ecs#ManagedScalingStepSize\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of Amazon EC2 instances that Amazon ECS will scale out at one time. If this\\n\\t\\t\\tparameter is omitted, the default value of <code>10000</code> is used.</p>\"\n                    }\n                },\n                \"instanceWarmupPeriod\": {\n                    \"target\": \"com.amazonaws.ecs#ManagedScalingInstanceWarmupPeriod\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The period of time, in seconds, after a newly launched Amazon EC2 instance can contribute\\n\\t\\t\\tto CloudWatch metrics for Auto Scaling group. If this parameter is omitted, the default value\\n\\t\\t\\tof <code>300</code> seconds is used.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The managed scaling settings for the Auto Scaling group capacity provider.</p>\\n         <p>When managed scaling is turned on, Amazon ECS manages the scale-in and scale-out actions of\\n\\t\\t\\tthe Auto Scaling group. Amazon ECS manages a target tracking scaling policy using an Amazon ECS\\n\\t\\t\\tmanaged CloudWatch metric with the specified <code>targetCapacity</code> value as the target\\n\\t\\t\\tvalue for the metric. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/asg-capacity-providers.html#asg-capacity-providers-managed-scaling\\\">Using managed scaling</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\\n         <p>If managed scaling is off, the user must manage the scaling of the Auto Scaling\\n\\t\\t\\tgroup.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#ManagedScalingInstanceWarmupPeriod\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 0,\n                    \"max\": 10000\n                }\n            }\n        },\n        \"com.amazonaws.ecs#ManagedScalingStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ENABLED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ENABLED\"\n                    }\n                },\n                \"DISABLED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DISABLED\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ecs#ManagedScalingStepSize\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 10000\n                }\n            }\n        },\n        \"com.amazonaws.ecs#ManagedScalingTargetCapacity\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 100\n                }\n            }\n        },\n        \"com.amazonaws.ecs#ManagedStorageConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"kmsKeyId\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify a Key Management Service key ID to encrypt Amazon ECS managed storage.</p>\\n         <p> When you specify a <code>kmsKeyId</code>, Amazon ECS uses the key to encrypt data volumes\\n\\t\\t\\tmanaged by Amazon ECS that are attached to tasks in the cluster. The following data volumes\\n\\t\\t\\tare managed by Amazon ECS: Amazon EBS. For more information about encryption of Amazon EBS volumes\\n\\t\\t\\tattached to Amazon ECS tasks, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ebs-kms-encryption.html\\\">Encrypt data stored in Amazon EBS volumes for Amazon ECS</a> in the\\n\\t\\t\\t<i>Amazon Elastic Container Service Developer Guide</i>.</p>\\n         <p>The key must be a single Region key.</p>\"\n                    }\n                },\n                \"fargateEphemeralStorageKmsKeyId\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify the Key Management Service key ID for Fargate ephemeral storage.</p>\\n         <p>When you specify a <code>fargateEphemeralStorageKmsKeyId</code>, Amazon Web Services Fargate uses\\n\\t\\t\\tthe key to encrypt data at rest in ephemeral storage. For more information about\\n\\t\\t\\tFargate ephemeral storage encryption, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/fargate-storage-encryption.html\\\">Customer managed keys for Amazon Web Services Fargate ephemeral storage for\\n\\t\\t\\t\\tAmazon ECS</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\\n         <p>The key must be a single Region key.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The managed storage configuration for the cluster.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#ManagedTerminationProtection\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ENABLED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ENABLED\"\n                    }\n                },\n                \"DISABLED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DISABLED\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ecs#MemoryGiBPerVCpuRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"min\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedDouble\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The minimum amount of memory per vCPU in GiB. Instance types with a lower memory-to-vCPU ratio are excluded from selection.</p>\"\n                    }\n                },\n                \"max\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedDouble\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum amount of memory per vCPU in GiB. Instance types with a higher memory-to-vCPU ratio are excluded from selection.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The minimum and maximum amount of memory per vCPU in gibibytes (GiB). This helps ensure that instance types have the appropriate memory-to-CPU ratio for your workloads.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#MemoryMiBRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"min\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedInteger\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The minimum amount of memory in MiB. Instance types with less memory than this value are excluded from selection.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"max\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedInteger\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum amount of memory in MiB. Instance types with more memory than this value are excluded from selection.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The minimum and maximum amount of memory in mebibytes (MiB) for instance type selection. This ensures that selected instance types have adequate memory for your workloads.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#MissingVersionException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> Message that describes the cause of the exception.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Amazon ECS can't determine the current version of the Amazon ECS container agent on the\\n\\t\\t\\tcontainer instance and doesn't have enough information to proceed with an update. This\\n\\t\\t\\tcould be because the agent running on the container instance is a previous or custom\\n\\t\\t\\tversion that doesn't use our version information.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.ecs#MountPoint\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"sourceVolume\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the volume to mount. Must be a volume name referenced in the\\n\\t\\t\\t\\t<code>name</code> parameter of task definition <code>volume</code>.</p>\"\n                    }\n                },\n                \"containerPath\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The path on the container to mount the host volume at.</p>\"\n                    }\n                },\n                \"readOnly\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedBoolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If this value is <code>true</code>, the container has read-only access to the volume.\\n\\t\\t\\tIf this value is <code>false</code>, then the container can write to the volume. The\\n\\t\\t\\tdefault value is <code>false</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The details for a volume mount point that's used in a container definition.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#MountPointList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#MountPoint\"\n            }\n        },\n        \"com.amazonaws.ecs#NamespaceNotFoundException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> Message that describes the cause of the exception.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The specified namespace wasn't found.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.ecs#NetworkBandwidthGbpsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"min\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedDouble\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The minimum network bandwidth in Gbps. Instance types with lower network bandwidth are excluded from selection.</p>\"\n                    }\n                },\n                \"max\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedDouble\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum network bandwidth in Gbps. Instance types with higher network bandwidth are excluded from selection.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The minimum and maximum network bandwidth in gigabits per second (Gbps) for instance type selection. This is important for network-intensive workloads.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#NetworkBinding\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"bindIP\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IP address that the container is bound to on the container instance.</p>\"\n                    }\n                },\n                \"containerPort\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedInteger\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The port number on the container that's used with the network binding.</p>\"\n                    }\n                },\n                \"hostPort\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedInteger\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The port number on the host that's used with the network binding.</p>\"\n                    }\n                },\n                \"protocol\": {\n                    \"target\": \"com.amazonaws.ecs#TransportProtocol\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The protocol used for the network binding.</p>\"\n                    }\n                },\n                \"containerPortRange\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The port number range on the container that's bound to the dynamically mapped host\\n\\t\\t\\tport range.</p>\\n         <p>The following rules apply when you specify a <code>containerPortRange</code>:</p>\\n         <ul>\\n            <li>\\n               <p>You must use either the <code>bridge</code> network mode or the <code>awsvpc</code>\\n\\t\\t\\t\\t\\tnetwork mode.</p>\\n            </li>\\n            <li>\\n               <p>This parameter is available for both the EC2 and Fargate launch types.</p>\\n            </li>\\n            <li>\\n               <p>This parameter is available for both the Linux and Windows operating systems.</p>\\n            </li>\\n            <li>\\n               <p>The container instance must have at least version 1.67.0 of the container agent\\n\\t\\t\\t\\t\\tand at least version 1.67.0-1 of the <code>ecs-init</code> package </p>\\n            </li>\\n            <li>\\n               <p>You can specify a maximum of 100 port ranges per container.</p>\\n            </li>\\n            <li>\\n               <p>You do not specify a <code>hostPortRange</code>. The value of the <code>hostPortRange</code> is set\\n\\t\\t\\t\\t\\tas follows:</p>\\n               <ul>\\n                  <li>\\n                     <p>For containers in a task with the <code>awsvpc</code> network mode,\\n\\t\\t\\t\\t\\t\\t\\tthe <code>hostPortRange</code> is set to the same value as the\\n\\t\\t\\t\\t\\t\\t\\t\\t<code>containerPortRange</code>. This is a static mapping\\n\\t\\t\\t\\t\\t\\t\\tstrategy.</p>\\n                  </li>\\n                  <li>\\n                     <p>For containers in a task with the <code>bridge</code> network mode, the Amazon ECS agent finds open host ports from the default ephemeral range and passes it to docker to bind them to the container ports.</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <p>The <code>containerPortRange</code> valid values are between 1 and\\n\\t\\t\\t\\t\\t65535.</p>\\n            </li>\\n            <li>\\n               <p>A port can only be included in one port mapping per container.</p>\\n            </li>\\n            <li>\\n               <p>You cannot specify overlapping port ranges.</p>\\n            </li>\\n            <li>\\n               <p>The first port in the range must be less than last port in the range.</p>\\n            </li>\\n            <li>\\n               <p>Docker recommends that you turn off the docker-proxy in the Docker daemon config file when you have a large number of ports.</p>\\n               <p>For more information, see <a href=\\\"https://github.com/moby/moby/issues/11185\\\"> Issue #11185</a> on the Github website.</p>\\n               <p>For information about how to  turn off the docker-proxy in the Docker daemon config file, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/bootstrap_container_instance.html#bootstrap_docker_daemon\\\">Docker daemon</a> in the <i>Amazon ECS Developer Guide</i>.</p>\\n            </li>\\n         </ul>\\n         <p>You can call <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_DescribeTasks.html\\\">\\n               <code>DescribeTasks</code>\\n            </a> to view the <code>hostPortRange</code> which\\n\\t\\t\\tare the host ports that are bound to the container ports.</p>\"\n                    }\n                },\n                \"hostPortRange\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The port number range on the host that's used with the network binding. This is\\n\\t\\t\\tassigned is assigned by Docker and delivered by the Amazon ECS agent.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Details on the network bindings between a container and its host container instance.\\n\\t\\t\\tAfter a task reaches the <code>RUNNING</code> status, manual and automatic host and\\n\\t\\t\\tcontainer port assignments are visible in the <code>networkBindings</code> section of\\n\\t\\t\\t\\t<a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_DescribeTasks.html\\\">DescribeTasks</a> API\\n\\t\\t\\tresponses.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#NetworkBindings\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#NetworkBinding\"\n            }\n        },\n        \"com.amazonaws.ecs#NetworkConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"awsvpcConfiguration\": {\n                    \"target\": \"com.amazonaws.ecs#AwsVpcConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The VPC subnets and security groups that are associated with a task.</p>\\n         <note>\\n            <p>All specified subnets and security groups must be from the same VPC.</p>\\n         </note>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The network configuration for a task or service.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#NetworkInterface\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"attachmentId\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The attachment ID for the network interface.</p>\"\n                    }\n                },\n                \"privateIpv4Address\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The private IPv4 address for the network interface.</p>\"\n                    }\n                },\n                \"ipv6Address\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The private IPv6 address for the network interface.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>An object representing the elastic network interface for tasks that use the\\n\\t\\t\\t\\t<code>awsvpc</code> network mode.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#NetworkInterfaceCountRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"min\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedInteger\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The minimum number of network interfaces. Instance types that support fewer network interfaces are excluded from selection.</p>\"\n                    }\n                },\n                \"max\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedInteger\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of network interfaces. Instance types that support more network interfaces are excluded from selection.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The minimum and maximum number of network interfaces for instance type selection. This is useful for workloads that require multiple network interfaces.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#NetworkInterfaces\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#NetworkInterface\"\n            }\n        },\n        \"com.amazonaws.ecs#NetworkMode\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"BRIDGE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"bridge\"\n                    }\n                },\n                \"HOST\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"host\"\n                    }\n                },\n                \"AWSVPC\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"awsvpc\"\n                    }\n                },\n                \"NONE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"none\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ecs#NoUpdateAvailableException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> Message that describes the cause of the exception.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>There's no update available for this Amazon ECS container agent. This might be because the\\n\\t\\t\\tagent is already running the latest version or because it's so old that there's no\\n\\t\\t\\tupdate path to the current version.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.ecs#OSFamily\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"WINDOWS_SERVER_2019_FULL\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"WINDOWS_SERVER_2019_FULL\"\n                    }\n                },\n                \"WINDOWS_SERVER_2019_CORE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"WINDOWS_SERVER_2019_CORE\"\n                    }\n                },\n                \"WINDOWS_SERVER_2016_FULL\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"WINDOWS_SERVER_2016_FULL\"\n                    }\n                },\n                \"WINDOWS_SERVER_2004_CORE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"WINDOWS_SERVER_2004_CORE\"\n                    }\n                },\n                \"WINDOWS_SERVER_2022_CORE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"WINDOWS_SERVER_2022_CORE\"\n                    }\n                },\n                \"WINDOWS_SERVER_2022_FULL\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"WINDOWS_SERVER_2022_FULL\"\n                    }\n                },\n                \"WINDOWS_SERVER_2025_CORE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"WINDOWS_SERVER_2025_CORE\"\n                    }\n                },\n                \"WINDOWS_SERVER_2025_FULL\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"WINDOWS_SERVER_2025_FULL\"\n                    }\n                },\n                \"WINDOWS_SERVER_20H2_CORE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"WINDOWS_SERVER_20H2_CORE\"\n                    }\n                },\n                \"LINUX\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"LINUX\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ecs#PidMode\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"HOST\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"host\"\n                    }\n                },\n                \"TASK\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"task\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ecs#PlacementConstraint\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"type\": {\n                    \"target\": \"com.amazonaws.ecs#PlacementConstraintType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of constraint. Use <code>distinctInstance</code> to ensure that each task in\\n\\t\\t\\ta particular group is running on a different container instance. Use\\n\\t\\t\\t\\t<code>memberOf</code> to restrict the selection to a group of valid\\n\\t\\t\\tcandidates.</p>\"\n                    }\n                },\n                \"expression\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A cluster query language expression to apply to the constraint. The expression can\\n\\t\\t\\thave a maximum length of 2000 characters. You can't specify an expression if the\\n\\t\\t\\tconstraint type is <code>distinctInstance</code>. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/cluster-query-language.html\\\">Cluster query language</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>An object representing a constraint on task placement. For more information, see\\n\\t\\t\\t\\t<a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-placement-constraints.html\\\">Task placement constraints</a> in the\\n\\t\\t\\t<i>Amazon Elastic Container Service Developer Guide</i>.</p>\\n         <note>\\n            <p>If you're using the Fargate launch type, task placement constraints\\n\\t\\t\\t\\taren't supported.</p>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.ecs#PlacementConstraintType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"DISTINCT_INSTANCE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"distinctInstance\"\n                    }\n                },\n                \"MEMBER_OF\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"memberOf\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ecs#PlacementConstraints\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#PlacementConstraint\"\n            }\n        },\n        \"com.amazonaws.ecs#PlacementStrategies\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#PlacementStrategy\"\n            }\n        },\n        \"com.amazonaws.ecs#PlacementStrategy\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"type\": {\n                    \"target\": \"com.amazonaws.ecs#PlacementStrategyType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of placement strategy. The <code>random</code> placement strategy randomly\\n\\t\\t\\tplaces tasks on available candidates. The <code>spread</code> placement strategy spreads\\n\\t\\t\\tplacement across available candidates evenly based on the <code>field</code> parameter.\\n\\t\\t\\tThe <code>binpack</code> strategy places tasks on available candidates that have the\\n\\t\\t\\tleast available amount of the resource that's specified with the <code>field</code>\\n\\t\\t\\tparameter. For example, if you binpack on memory, a task is placed on the instance with\\n\\t\\t\\tthe least amount of remaining memory but still enough to run the task.</p>\"\n                    }\n                },\n                \"field\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The field to apply the placement strategy against. For the <code>spread</code>\\n\\t\\t\\tplacement strategy, valid values are <code>instanceId</code> (or <code>host</code>,\\n\\t\\t\\twhich has the same effect), or any platform or custom attribute that's applied to a\\n\\t\\t\\tcontainer instance, such as <code>attribute:ecs.availability-zone</code>. For the\\n\\t\\t\\t\\t<code>binpack</code> placement strategy, valid values are <code>cpu</code> and\\n\\t\\t\\t\\t<code>memory</code>. For the <code>random</code> placement strategy, this field is\\n\\t\\t\\tnot used.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The task placement strategy for a task or service. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-placement-strategies.html\\\">Task placement strategies</a> in the\\n\\t\\t\\t<i>Amazon Elastic Container Service Developer Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#PlacementStrategyType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"RANDOM\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"random\"\n                    }\n                },\n                \"SPREAD\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"spread\"\n                    }\n                },\n                \"BINPACK\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"binpack\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ecs#PlatformDevice\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"id\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID for the GPUs on the container instance. The available GPU IDs can also be\\n\\t\\t\\tobtained on the container instance in the\\n\\t\\t\\t\\t<code>/var/lib/ecs/gpu/nvidia_gpu_info.json</code> file.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"type\": {\n                    \"target\": \"com.amazonaws.ecs#PlatformDeviceType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of device that's available on the container instance. The only supported\\n\\t\\t\\tvalue is <code>GPU</code>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The devices that are available on the container instance. The only supported device\\n\\t\\t\\ttype is a GPU.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#PlatformDeviceType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"GPU\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"GPU\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ecs#PlatformDevices\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#PlatformDevice\"\n            }\n        },\n        \"com.amazonaws.ecs#PlatformTaskDefinitionIncompatibilityException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> Message that describes the cause of the exception.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The specified platform version doesn't satisfy the required capabilities of the task\\n\\t\\t\\tdefinition.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.ecs#PlatformUnknownException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> Message that describes the cause of the exception.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The specified platform version doesn't exist.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.ecs#PortMapping\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"containerPort\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedInteger\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The port number on the container that's bound to the user-specified or automatically\\n\\t\\t\\tassigned host port.</p>\\n         <p>If you use containers in a task with the <code>awsvpc</code> or <code>host</code>\\n\\t\\t\\tnetwork mode, specify the exposed ports using <code>containerPort</code>.</p>\\n         <p>If you use containers in a task with the <code>bridge</code> network mode and you\\n\\t\\t\\tspecify a container port and not a host port, your container automatically receives a\\n\\t\\t\\thost port in the ephemeral port range. For more information, see <code>hostPort</code>.\\n\\t\\t\\tPort mappings that are automatically assigned in this way do not count toward the 100\\n\\t\\t\\treserved ports limit of a container instance.</p>\"\n                    }\n                },\n                \"hostPort\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedInteger\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The port number on the container instance to reserve for your container.</p>\\n         <p>If you specify a <code>containerPortRange</code>, leave this field empty and the value\\n\\t\\t\\tof the <code>hostPort</code> is set as follows:</p>\\n         <ul>\\n            <li>\\n               <p>For containers in a task with the <code>awsvpc</code> network mode, the\\n\\t\\t\\t\\t\\t\\t<code>hostPort</code> is set to the same value as the\\n\\t\\t\\t\\t\\t\\t<code>containerPort</code>. This is a static mapping strategy.</p>\\n            </li>\\n            <li>\\n               <p>For containers in a task with the <code>bridge</code> network mode, the Amazon ECS\\n\\t\\t\\t\\t\\tagent finds open ports on the host and automatically binds them to the container\\n\\t\\t\\t\\t\\tports. This is a dynamic mapping strategy.</p>\\n            </li>\\n         </ul>\\n         <p>If you use containers in a task with the <code>awsvpc</code> or <code>host</code>\\n\\t\\t\\tnetwork mode, the <code>hostPort</code> can either be left blank or set to the same\\n\\t\\t\\tvalue as the <code>containerPort</code>.</p>\\n         <p>If you use containers in a task with the <code>bridge</code> network mode, you can\\n\\t\\t\\tspecify a non-reserved host port for your container port mapping, or you can omit the\\n\\t\\t\\t\\t<code>hostPort</code> (or set it to <code>0</code>) while specifying a\\n\\t\\t\\t\\t<code>containerPort</code> and your container automatically receives a port in the\\n\\t\\t\\tephemeral port range for your container instance operating system and Docker\\n\\t\\t\\tversion.</p>\\n         <p>The default ephemeral port range for Docker version 1.6.0 and later is listed on the\\n\\t\\t\\tinstance under <code>/proc/sys/net/ipv4/ip_local_port_range</code>. If this kernel\\n\\t\\t\\tparameter is unavailable, the default ephemeral port range from 49153 through 65535\\n\\t\\t\\t(Linux) or 49152 through 65535 (Windows) is used. Do not attempt to specify a host port\\n\\t\\t\\tin the ephemeral port range as these are reserved for automatic assignment. In general,\\n\\t\\t\\tports below 32768 are outside of the ephemeral port range.</p>\\n         <p>The default reserved ports are 22 for SSH, the Docker ports 2375 and 2376, and the\\n\\t\\t\\tAmazon ECS container agent ports 51678-51680. Any host port that was previously specified in\\n\\t\\t\\ta running task is also reserved while the task is running. That is, after a task stops,\\n\\t\\t\\tthe host port is released. The current reserved ports are displayed in the\\n\\t\\t\\t\\t<code>remainingResources</code> of <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_DescribeContainerInstances.html\\\">DescribeContainerInstances</a> output. A container instance can have up to 100\\n\\t\\t\\treserved ports at a time. This number includes the default reserved ports. Automatically\\n\\t\\t\\tassigned ports aren't included in the 100 reserved ports quota.</p>\"\n                    }\n                },\n                \"protocol\": {\n                    \"target\": \"com.amazonaws.ecs#TransportProtocol\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The protocol used for the port mapping. Valid values are <code>tcp</code> and\\n\\t\\t\\t\\t<code>udp</code>. The default is <code>tcp</code>. <code>protocol</code> is\\n\\t\\t\\timmutable in a Service Connect service. Updating this field requires a service deletion\\n\\t\\t\\tand redeployment. </p>\"\n                    }\n                },\n                \"name\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name that's used for the port mapping. This parameter is the name that you use in\\n\\t\\t\\tthe <code>serviceConnectConfiguration</code> and the\\n\\t\\t\\t\\t<code>vpcLatticeConfigurations</code> of a service. The name can include up to 64\\n\\t\\t\\tcharacters. The characters can include lowercase letters, numbers, underscores (_), and\\n\\t\\t\\thyphens (-). The name can't start with a hyphen.</p>\"\n                    }\n                },\n                \"appProtocol\": {\n                    \"target\": \"com.amazonaws.ecs#ApplicationProtocol\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The application protocol that's used for the port mapping. This parameter only applies\\n\\t\\t\\tto Service Connect. We recommend that you set this parameter to be consistent with the\\n\\t\\t\\tprotocol that your application uses. If you set this parameter, Amazon ECS adds\\n\\t\\t\\tprotocol-specific connection handling to the Service Connect proxy. If you set this\\n\\t\\t\\tparameter, Amazon ECS adds protocol-specific telemetry in the Amazon ECS console and CloudWatch.</p>\\n         <p>If you don't set a value for this parameter, then TCP is used. However, Amazon ECS doesn't\\n\\t\\t\\tadd protocol-specific telemetry for TCP.</p>\\n         <p>\\n            <code>appProtocol</code> is immutable in a Service Connect service. Updating this\\n\\t\\t\\tfield requires a service deletion and redeployment.</p>\\n         <p>Tasks that run in a namespace can use short names to connect\\n\\tto services in the namespace. Tasks can connect to services across all of the clusters in the namespace.\\n\\tTasks connect through a managed proxy container\\n\\tthat collects logs and metrics for increased visibility.\\n\\tOnly the tasks that Amazon ECS services create are supported with Service Connect.\\n\\tFor more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-connect.html\\\">Service Connect</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\"\n                    }\n                },\n                \"containerPortRange\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The port number range on the container that's bound to the dynamically mapped host\\n\\t\\t\\tport range. </p>\\n         <p>The following rules apply when you specify a <code>containerPortRange</code>:</p>\\n         <ul>\\n            <li>\\n               <p>You must use either the <code>bridge</code> network mode or the <code>awsvpc</code>\\n\\t\\t\\t\\t\\tnetwork mode.</p>\\n            </li>\\n            <li>\\n               <p>This parameter is available for both the EC2 and Fargate launch types.</p>\\n            </li>\\n            <li>\\n               <p>This parameter is available for both the Linux and Windows operating systems.</p>\\n            </li>\\n            <li>\\n               <p>The container instance must have at least version 1.67.0 of the container agent\\n\\t\\t\\t\\t\\tand at least version 1.67.0-1 of the <code>ecs-init</code> package </p>\\n            </li>\\n            <li>\\n               <p>You can specify a maximum of 100 port ranges per container.</p>\\n            </li>\\n            <li>\\n               <p>You do not specify a <code>hostPortRange</code>. The value of the <code>hostPortRange</code> is set\\n\\t\\t\\t\\t\\tas follows:</p>\\n               <ul>\\n                  <li>\\n                     <p>For containers in a task with the <code>awsvpc</code> network mode,\\n\\t\\t\\t\\t\\t\\t\\tthe <code>hostPortRange</code> is set to the same value as the\\n\\t\\t\\t\\t\\t\\t\\t\\t<code>containerPortRange</code>. This is a static mapping\\n\\t\\t\\t\\t\\t\\t\\tstrategy.</p>\\n                  </li>\\n                  <li>\\n                     <p>For containers in a task with the <code>bridge</code> network mode, the Amazon ECS agent finds open host ports from the default ephemeral range and passes it to docker to bind them to the container ports.</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <p>The <code>containerPortRange</code> valid values are between 1 and\\n\\t\\t\\t\\t\\t65535.</p>\\n            </li>\\n            <li>\\n               <p>A port can only be included in one port mapping per container.</p>\\n            </li>\\n            <li>\\n               <p>You cannot specify overlapping port ranges.</p>\\n            </li>\\n            <li>\\n               <p>The first port in the range must be less than last port in the range.</p>\\n            </li>\\n            <li>\\n               <p>Docker recommends that you turn off the docker-proxy in the Docker daemon config file when you have a large number of ports.</p>\\n               <p>For more information, see <a href=\\\"https://github.com/moby/moby/issues/11185\\\"> Issue #11185</a> on the Github website.</p>\\n               <p>For information about how to  turn off the docker-proxy in the Docker daemon config file, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/bootstrap_container_instance.html#bootstrap_docker_daemon\\\">Docker daemon</a> in the <i>Amazon ECS Developer Guide</i>.</p>\\n            </li>\\n         </ul>\\n         <p>You can call <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_DescribeTasks.html\\\">\\n               <code>DescribeTasks</code>\\n            </a> to view the <code>hostPortRange</code> which\\n\\t\\t\\tare the host ports that are bound to the container ports.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Port mappings allow containers to access ports on the host container instance to send\\n\\t\\t\\tor receive traffic. Port mappings are specified as part of the container\\n\\t\\t\\tdefinition.</p>\\n         <p>If you use containers in a task with the <code>awsvpc</code> or <code>host</code>\\n\\t\\t\\tnetwork mode, specify the exposed ports using <code>containerPort</code>. The\\n\\t\\t\\t\\t<code>hostPort</code> can be left blank or it must be the same value as the\\n\\t\\t\\t\\t<code>containerPort</code>.</p>\\n         <p>Most fields of this parameter (<code>containerPort</code>, <code>hostPort</code>,\\n\\t\\t\\t\\t<code>protocol</code>) maps to <code>PortBindings</code> in the docker container\\n\\t\\t\\tcreate command and the <code>--publish</code> option to <code>docker run</code>. If the\\n\\t\\t\\tnetwork mode of a task definition is set to <code>host</code>, host ports must either be\\n\\t\\t\\tundefined or match the container port in the port mapping.</p>\\n         <note>\\n            <p>You can't expose the same container port for multiple protocols. If you attempt\\n\\t\\t\\t\\tthis, an error is returned.</p>\\n         </note>\\n         <p>After a task reaches the <code>RUNNING</code> status, manual and automatic host and\\n\\t\\t\\tcontainer port assignments are visible in the <code>networkBindings</code> section of\\n\\t\\t\\t\\t<a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_DescribeTasks.html\\\">DescribeTasks</a> API\\n\\t\\t\\tresponses.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#PortMappingList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#PortMapping\"\n            }\n        },\n        \"com.amazonaws.ecs#PortNumber\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 0,\n                    \"max\": 65535\n                }\n            }\n        },\n        \"com.amazonaws.ecs#PropagateMITags\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"CAPACITY_PROVIDER\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"CAPACITY_PROVIDER\"\n                    }\n                },\n                \"NONE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"NONE\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ecs#PropagateTags\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"TASK_DEFINITION\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"TASK_DEFINITION\"\n                    }\n                },\n                \"SERVICE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"SERVICE\"\n                    }\n                },\n                \"NONE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"NONE\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ecs#ProtectedTask\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"taskArn\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The task ARN.</p>\"\n                    }\n                },\n                \"protectionEnabled\": {\n                    \"target\": \"com.amazonaws.ecs#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>The protection status of the task. If scale-in protection is on for a task, the value\\n\\t\\t\\tis <code>true</code>. Otherwise, it is <code>false</code>.</p>\"\n                    }\n                },\n                \"expirationDate\": {\n                    \"target\": \"com.amazonaws.ecs#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The epoch time when protection for the task will expire.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>An object representing the protection status details for a task. You can set the\\n\\t\\t\\tprotection status with the <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_UpdateTaskProtection.html\\\">UpdateTaskProtection</a> API and get the status of tasks with the <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_GetTaskProtection.html\\\">GetTaskProtection</a> API.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#ProtectedTasks\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#ProtectedTask\"\n            }\n        },\n        \"com.amazonaws.ecs#ProxyConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"type\": {\n                    \"target\": \"com.amazonaws.ecs#ProxyConfigurationType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The proxy type. The only supported value is <code>APPMESH</code>.</p>\"\n                    }\n                },\n                \"containerName\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the container that will serve as the App Mesh proxy.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"properties\": {\n                    \"target\": \"com.amazonaws.ecs#ProxyConfigurationProperties\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The set of network configuration parameters to provide the Container Network Interface\\n\\t\\t\\t(CNI) plugin, specified as key-value pairs.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>IgnoredUID</code> - (Required) The user ID (UID) of the proxy\\n\\t\\t\\t\\t\\tcontainer as defined by the <code>user</code> parameter in a container\\n\\t\\t\\t\\t\\tdefinition. This is used to ensure the proxy ignores its own traffic. If\\n\\t\\t\\t\\t\\t\\t<code>IgnoredGID</code> is specified, this field can be empty.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>IgnoredGID</code> - (Required) The group ID (GID) of the proxy\\n\\t\\t\\t\\t\\tcontainer as defined by the <code>user</code> parameter in a container\\n\\t\\t\\t\\t\\tdefinition. This is used to ensure the proxy ignores its own traffic. If\\n\\t\\t\\t\\t\\t\\t<code>IgnoredUID</code> is specified, this field can be empty.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>AppPorts</code> - (Required) The list of ports that the\\n\\t\\t\\t\\t\\tapplication uses. Network traffic to these ports is forwarded to the\\n\\t\\t\\t\\t\\t\\t<code>ProxyIngressPort</code> and <code>ProxyEgressPort</code>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ProxyIngressPort</code> - (Required) Specifies the port that\\n\\t\\t\\t\\t\\tincoming traffic to the <code>AppPorts</code> is directed to.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ProxyEgressPort</code> - (Required) Specifies the port that\\n\\t\\t\\t\\t\\toutgoing traffic from the <code>AppPorts</code> is directed to.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>EgressIgnoredPorts</code> - (Required) The egress traffic going to\\n\\t\\t\\t\\t\\tthe specified ports is ignored and not redirected to the\\n\\t\\t\\t\\t\\t\\t<code>ProxyEgressPort</code>. It can be an empty list.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>EgressIgnoredIPs</code> - (Required) The egress traffic going to\\n\\t\\t\\t\\t\\tthe specified IP addresses is ignored and not redirected to the\\n\\t\\t\\t\\t\\t\\t<code>ProxyEgressPort</code>. It can be an empty list.</p>\\n            </li>\\n         </ul>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The configuration details for the App Mesh proxy.</p>\\n         <p>For tasks that use the EC2 launch type, the container instances require\\n\\t\\t\\tat least version 1.26.0 of the container agent and at least version 1.26.0-1 of the\\n\\t\\t\\t\\t<code>ecs-init</code> package to use a proxy configuration. If your container\\n\\t\\t\\tinstances are launched from the Amazon ECS optimized AMI version <code>20190301</code> or\\n\\t\\t\\tlater, then they contain the required versions of the container agent and\\n\\t\\t\\t\\t<code>ecs-init</code>. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-optimized_AMI.html\\\">Amazon ECS-optimized Linux AMI</a>\\n         </p>\"\n            }\n        },\n        \"com.amazonaws.ecs#ProxyConfigurationProperties\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#KeyValuePair\"\n            }\n        },\n        \"com.amazonaws.ecs#ProxyConfigurationType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"APPMESH\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"APPMESH\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ecs#PutAccountSetting\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ecs#PutAccountSettingRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ecs#PutAccountSettingResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.ecs#ClientException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ServerException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Modifies an account setting. Account settings are set on a per-Region basis.</p>\\n         <p>If you change the root user account setting, the default settings are reset for users and\\n\\t\\t\\troles that do not have specified individual account settings. For more information, see\\n\\t\\t\\t\\t<a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-account-settings.html\\\">Account\\n\\t\\t\\t\\tSettings</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To modify the account settings for a specific IAM user or IAM role\",\n                        \"documentation\": \"This example modifies the account setting for a specific IAM user or IAM role to opt in to the new ARN and resource ID format for Amazon ECS container instances. If you’re using this command as the root user, then changes apply to the entire AWS account, unless an IAM user or role explicitly overrides these settings for themselves.\",\n                        \"input\": {\n                            \"name\": \"containerInstanceLongArnFormat\",\n                            \"value\": \"enabled\",\n                            \"principalArn\": \"arn:aws:iam::<aws_account_id>:user/principalName\"\n                        },\n                        \"output\": {\n                            \"setting\": {\n                                \"name\": \"containerInstanceLongArnFormat\",\n                                \"value\": \"enabled\",\n                                \"principalArn\": \"arn:aws:iam::<aws_account_id>:user/principalName\"\n                            }\n                        }\n                    },\n                    {\n                        \"title\": \"To modify your account settings\",\n                        \"documentation\": \"This example modifies your account settings to opt in to the new ARN and resource ID format for Amazon ECS services. If you’re using this command as the root user, then changes apply to the entire AWS account, unless an IAM user or role explicitly overrides these settings for themselves.\",\n                        \"input\": {\n                            \"name\": \"serviceLongArnFormat\",\n                            \"value\": \"enabled\"\n                        },\n                        \"output\": {\n                            \"setting\": {\n                                \"name\": \"serviceLongArnFormat\",\n                                \"value\": \"enabled\",\n                                \"principalArn\": \"arn:aws:iam::<aws_account_id>:user/principalName\"\n                            }\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ecs#PutAccountSettingDefault\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ecs#PutAccountSettingDefaultRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ecs#PutAccountSettingDefaultResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.ecs#ClientException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ServerException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Modifies an account setting for all users on an account for whom no individual account\\n\\t\\t\\tsetting has been specified. Account settings are set on a per-Region basis.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To modify the default account settings for all IAM users or roles on an account\",\n                        \"documentation\": \"This example modifies the default account setting for the specified resource for all IAM users or roles on an account. These changes apply to the entire AWS account, unless an IAM user or role explicitly overrides these settings for themselves.\",\n                        \"input\": {\n                            \"name\": \"serviceLongArnFormat\",\n                            \"value\": \"enabled\"\n                        },\n                        \"output\": {\n                            \"setting\": {\n                                \"name\": \"serviceLongArnFormat\",\n                                \"value\": \"enabled\",\n                                \"principalArn\": \"arn:aws:iam::<aws_account_id>:root\"\n                            }\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ecs#PutAccountSettingDefaultRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"name\": {\n                    \"target\": \"com.amazonaws.ecs#SettingName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The resource name for which to modify the account setting.</p>\\n         <p>The following are the valid values for the account setting name.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>serviceLongArnFormat</code> - When modified, the Amazon Resource Name\\n\\t\\t\\t\\t\\t(ARN) and resource ID format of the resource type for a specified user, role, or\\n\\t\\t\\t\\t\\tthe root user for an account is affected. The opt-in and opt-out account setting\\n\\t\\t\\t\\t\\tmust be set for each Amazon ECS resource separately. The ARN and resource ID format\\n\\t\\t\\t\\t\\tof a resource is defined by the opt-in status of the user or role that created\\n\\t\\t\\t\\t\\tthe resource. You must turn on this setting to use Amazon ECS features such as\\n\\t\\t\\t\\t\\tresource tagging.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>taskLongArnFormat</code> - When modified, the Amazon Resource Name (ARN)\\n\\t\\t\\t\\t\\tand resource ID format of the resource type for a specified user, role, or the\\n\\t\\t\\t\\t\\troot user for an account is affected. The opt-in and opt-out account setting must\\n\\t\\t\\t\\t\\tbe set for each Amazon ECS resource separately. The ARN and resource ID format of a\\n\\t\\t\\t\\t\\tresource is defined by the opt-in status of the user or role that created the\\n\\t\\t\\t\\t\\tresource. You must turn on this setting to use Amazon ECS features such as resource\\n\\t\\t\\t\\t\\ttagging.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>containerInstanceLongArnFormat</code> - When modified, the Amazon\\n\\t\\t\\t\\t\\tResource Name (ARN) and resource ID format of the resource type for a specified\\n\\t\\t\\t\\t\\tuser, role, or the root user for an account is affected. The opt-in and opt-out\\n\\t\\t\\t\\t\\taccount setting must be set for each Amazon ECS resource separately. The ARN and\\n\\t\\t\\t\\t\\tresource ID format of a resource is defined by the opt-in status of the user or\\n\\t\\t\\t\\t\\trole that created the resource. You must turn on this setting to use Amazon ECS\\n\\t\\t\\t\\t\\tfeatures such as resource tagging.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>awsvpcTrunking</code> - When modified, the elastic network interface\\n\\t\\t\\t\\t\\t(ENI) limit for any new container instances that support the feature is changed.\\n\\t\\t\\t\\t\\tIf <code>awsvpcTrunking</code> is turned on, any new container instances that\\n\\t\\t\\t\\t\\tsupport the feature are launched have the increased ENI limits available to\\n\\t\\t\\t\\t\\tthem. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/container-instance-eni.html\\\">Elastic\\n\\t\\t\\t\\t\\t\\tNetwork Interface Trunking</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>containerInsights</code> - Container Insights with enhanced\\n\\t\\t\\t\\t\\tobservability provides all the Container Insights metrics, plus additional task\\n\\t\\t\\t\\t\\tand container metrics. This version supports enhanced observability for Amazon ECS\\n\\t\\t\\t\\t\\tclusters using the Amazon EC2 and Fargate launch types. After you configure\\n\\t\\t\\t\\t\\tContainer Insights with enhanced observability on Amazon ECS, Container Insights\\n\\t\\t\\t\\t\\tauto-collects detailed infrastructure telemetry from the cluster level down to\\n\\t\\t\\t\\t\\tthe container level in your environment and displays these critical performance\\n\\t\\t\\t\\t\\tdata in curated dashboards removing the heavy lifting in observability set-up. </p>\\n               <p>To use Container Insights with enhanced observability, set the\\n\\t\\t\\t\\t\\t\\t<code>containerInsights</code> account setting to\\n\\t\\t\\t\\t\\t<code>enhanced</code>.</p>\\n               <p>To use Container Insights, set the <code>containerInsights</code> account\\n\\t\\t\\t\\t\\tsetting to <code>enabled</code>.</p>\\n               <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/cloudwatch-container-insights.html\\\">Monitor Amazon ECS containers using Container Insights with enhanced\\n\\t\\t\\t\\t\\t\\tobservability</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>dualStackIPv6</code> - When turned on, when using a VPC in dual stack\\n\\t\\t\\t\\t\\tmode, your tasks using the <code>awsvpc</code> network mode can have an IPv6\\n\\t\\t\\t\\t\\taddress assigned. For more information on using IPv6 with tasks launched on\\n\\t\\t\\t\\t\\tAmazon EC2 instances, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-networking-awsvpc.html#task-networking-vpc-dual-stack\\\">Using a VPC in dual-stack mode</a>. For more information on using IPv6\\n\\t\\t\\t\\t\\twith tasks launched on Fargate, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/fargate-task-networking.html#fargate-task-networking-vpc-dual-stack\\\">Using a VPC in dual-stack mode</a>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>fargateFIPSMode</code> - If you specify <code>fargateFIPSMode</code>,\\n\\t\\t\\t\\t\\tFargate FIPS 140 compliance is affected.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>fargateTaskRetirementWaitPeriod</code> - When Amazon Web Services determines that a\\n\\t\\t\\t\\t\\tsecurity or infrastructure update is needed for an Amazon ECS task hosted on\\n\\t\\t\\t\\t\\tFargate, the tasks need to be stopped and new tasks launched to replace them.\\n\\t\\t\\t\\t\\tUse <code>fargateTaskRetirementWaitPeriod</code> to configure the wait time to\\n\\t\\t\\t\\t\\tretire a Fargate task. For information about the Fargate tasks maintenance,\\n\\t\\t\\t\\t\\tsee <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-maintenance.html\\\">Amazon Web Services Fargate\\n\\t\\t\\t\\t\\t\\ttask maintenance</a> in the <i>Amazon ECS Developer\\n\\t\\t\\t\\t\\tGuide</i>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tagResourceAuthorization</code> - Amazon ECS is introducing tagging\\n\\t\\t\\t\\t\\tauthorization for resource creation. Users must have permissions for actions\\n\\t\\t\\t\\t\\tthat create the resource, such as <code>ecsCreateCluster</code>. If tags are\\n\\t\\t\\t\\t\\tspecified when you create a resource, Amazon Web Services performs additional authorization to\\n\\t\\t\\t\\t\\tverify if users or roles have permissions to create tags. Therefore, you must\\n\\t\\t\\t\\t\\tgrant explicit permissions to use the <code>ecs:TagResource</code> action. For\\n\\t\\t\\t\\t\\tmore information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/supported-iam-actions-tagging.html\\\">Grant permission to tag resources on creation</a> in the\\n\\t\\t\\t\\t\\t\\t<i>Amazon ECS Developer Guide</i>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>defaultLogDriverMode</code> -Amazon ECS supports setting a default delivery\\n\\t\\t\\t\\t\\tmode of log messages from a container to the <code>logDriver</code> that you specify in the container's <code>logConfiguration</code>. The delivery mode affects\\n\\t\\t\\t\\t\\tapplication stability when the flow of logs from the container to the log driver is\\n\\t\\t\\t\\t\\tinterrupted. The <code>defaultLogDriverMode</code> setting supports two values:\\n\\t\\t\\t\\t\\t\\t<code>blocking</code> and <code>non-blocking</code>. If you don't specify a\\n\\t\\t\\t\\t\\tdelivery mode in your container definition's <code>logConfiguration</code>, the\\n\\t\\t\\t\\t\\tmode you specify using this account setting will be used as the default. For\\n\\t\\t\\t\\t\\tmore information about log delivery modes, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_LogConfiguration.html\\\">LogConfiguration</a>.</p>\\n               <note>\\n                  <p>On June 25, 2025, Amazon ECS changed the default log driver mode from <code>blocking</code> to <code>non-blocking</code> to prioritize task availability over logging. To continue using the <code>blocking</code> mode after this change, do one of the following:</p>\\n                  <ul>\\n                     <li>\\n                        <p>Set the <code>mode</code> option in your container definition's <code>logConfiguration</code> as <code>blocking</code>.</p>\\n                     </li>\\n                     <li>\\n                        <p>Set the <code>defaultLogDriverMode</code> account setting to <code>blocking</code>.</p>\\n                     </li>\\n                  </ul>\\n               </note>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>guardDutyActivate</code> - The <code>guardDutyActivate</code> parameter is read-only in Amazon ECS and indicates whether\\n\\t\\t\\tAmazon ECS Runtime Monitoring is enabled or disabled by your security administrator in your\\n\\t\\t\\tAmazon ECS account. Amazon GuardDuty controls this account setting on your behalf. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-guard-duty-integration.html\\\">Protecting Amazon ECS workloads with Amazon ECS Runtime Monitoring</a>.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"value\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The account setting value for the specified principal ARN. Accepted values are\\n\\t\\t\\t\\t<code>enabled</code>, <code>disabled</code>, <code>on</code>, <code>enhanced</code>,\\n\\t\\t\\tand <code>off</code>.</p>\\n         <p>When you specify <code>fargateTaskRetirementWaitPeriod</code> for the\\n\\t\\t\\t\\t<code>name</code>, the following are the valid values:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>0</code> - Amazon Web Services sends the notification, and immediately retires the\\n\\t\\t\\t\\t\\taffected tasks.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>7</code> - Amazon Web Services sends the notification, and waits 7 calendar days to\\n\\t\\t\\t\\t\\tretire the tasks.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>14</code> - Amazon Web Services sends the notification, and waits 14 calendar days to\\n\\t\\t\\t\\t\\tretire the tasks.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ecs#PutAccountSettingDefaultResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"setting\": {\n                    \"target\": \"com.amazonaws.ecs#Setting\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The current setting for a resource.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ecs#PutAccountSettingRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"name\": {\n                    \"target\": \"com.amazonaws.ecs#SettingName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon ECS account setting name to modify.</p>\\n         <p>The following are the valid values for the account setting name.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>serviceLongArnFormat</code> - When modified, the Amazon Resource Name\\n\\t\\t\\t\\t\\t(ARN) and resource ID format of the resource type for a specified user, role, or\\n\\t\\t\\t\\t\\tthe root user for an account is affected. The opt-in and opt-out account setting\\n\\t\\t\\t\\t\\tmust be set for each Amazon ECS resource separately. The ARN and resource ID format\\n\\t\\t\\t\\t\\tof a resource is defined by the opt-in status of the user or role that created\\n\\t\\t\\t\\t\\tthe resource. You must turn on this setting to use Amazon ECS features such as\\n\\t\\t\\t\\t\\tresource tagging.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>taskLongArnFormat</code> - When modified, the Amazon Resource Name (ARN)\\n\\t\\t\\t\\t\\tand resource ID format of the resource type for a specified user, role, or the\\n\\t\\t\\t\\t\\troot user for an account is affected. The opt-in and opt-out account setting must\\n\\t\\t\\t\\t\\tbe set for each Amazon ECS resource separately. The ARN and resource ID format of a\\n\\t\\t\\t\\t\\tresource is defined by the opt-in status of the user or role that created the\\n\\t\\t\\t\\t\\tresource. You must turn on this setting to use Amazon ECS features such as resource\\n\\t\\t\\t\\t\\ttagging.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>containerInstanceLongArnFormat</code> - When modified, the Amazon\\n\\t\\t\\t\\t\\tResource Name (ARN) and resource ID format of the resource type for a specified\\n\\t\\t\\t\\t\\tuser, role, or the root user for an account is affected. The opt-in and opt-out\\n\\t\\t\\t\\t\\taccount setting must be set for each Amazon ECS resource separately. The ARN and\\n\\t\\t\\t\\t\\tresource ID format of a resource is defined by the opt-in status of the user or\\n\\t\\t\\t\\t\\trole that created the resource. You must turn on this setting to use Amazon ECS\\n\\t\\t\\t\\t\\tfeatures such as resource tagging.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>awsvpcTrunking</code> - When modified, the elastic network interface\\n\\t\\t\\t\\t\\t(ENI) limit for any new container instances that support the feature is changed.\\n\\t\\t\\t\\t\\tIf <code>awsvpcTrunking</code> is turned on, any new container instances that\\n\\t\\t\\t\\t\\tsupport the feature are launched have the increased ENI limits available to\\n\\t\\t\\t\\t\\tthem. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/container-instance-eni.html\\\">Elastic\\n\\t\\t\\t\\t\\t\\tNetwork Interface Trunking</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>containerInsights</code> - Container Insights with enhanced\\n\\t\\t\\t\\t\\tobservability provides all the Container Insights metrics, plus additional task\\n\\t\\t\\t\\t\\tand container metrics. This version supports enhanced observability for Amazon ECS\\n\\t\\t\\t\\t\\tclusters using the Amazon EC2 and Fargate launch types. After you configure\\n\\t\\t\\t\\t\\tContainer Insights with enhanced observability on Amazon ECS, Container Insights\\n\\t\\t\\t\\t\\tauto-collects detailed infrastructure telemetry from the cluster level down to\\n\\t\\t\\t\\t\\tthe container level in your environment and displays these critical performance\\n\\t\\t\\t\\t\\tdata in curated dashboards removing the heavy lifting in observability set-up. </p>\\n               <p>To use Container Insights with enhanced observability, set the\\n\\t\\t\\t\\t\\t\\t<code>containerInsights</code> account setting to\\n\\t\\t\\t\\t\\t<code>enhanced</code>.</p>\\n               <p>To use Container Insights, set the <code>containerInsights</code> account\\n\\t\\t\\t\\t\\tsetting to <code>enabled</code>.</p>\\n               <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/cloudwatch-container-insights.html\\\">Monitor Amazon ECS containers using Container Insights with enhanced\\n\\t\\t\\t\\t\\t\\tobservability</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>dualStackIPv6</code> - When turned on, when using a VPC in dual stack\\n\\t\\t\\t\\t\\tmode, your tasks using the <code>awsvpc</code> network mode can have an IPv6\\n\\t\\t\\t\\t\\taddress assigned. For more information on using IPv6 with tasks launched on\\n\\t\\t\\t\\t\\tAmazon EC2 instances, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-networking-awsvpc.html#task-networking-vpc-dual-stack\\\">Using a VPC in dual-stack mode</a>. For more information on using IPv6\\n\\t\\t\\t\\t\\twith tasks launched on Fargate, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/fargate-task-networking.html#fargate-task-networking-vpc-dual-stack\\\">Using a VPC in dual-stack mode</a>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>fargateTaskRetirementWaitPeriod</code> - When Amazon Web Services determines that a\\n\\t\\t\\t\\t\\tsecurity or infrastructure update is needed for an Amazon ECS task hosted on\\n\\t\\t\\t\\t\\tFargate, the tasks need to be stopped and new tasks launched to replace them.\\n\\t\\t\\t\\t\\tUse <code>fargateTaskRetirementWaitPeriod</code> to configure the wait time to\\n\\t\\t\\t\\t\\tretire a Fargate task. For information about the Fargate tasks maintenance,\\n\\t\\t\\t\\t\\tsee <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-maintenance.html\\\">Amazon Web Services Fargate\\n\\t\\t\\t\\t\\t\\ttask maintenance</a> in the <i>Amazon ECS Developer\\n\\t\\t\\t\\t\\tGuide</i>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>tagResourceAuthorization</code> - Amazon ECS is introducing tagging\\n\\t\\t\\t\\t\\tauthorization for resource creation. Users must have permissions for actions\\n\\t\\t\\t\\t\\tthat create the resource, such as <code>ecsCreateCluster</code>. If tags are\\n\\t\\t\\t\\t\\tspecified when you create a resource, Amazon Web Services performs additional authorization to\\n\\t\\t\\t\\t\\tverify if users or roles have permissions to create tags. Therefore, you must\\n\\t\\t\\t\\t\\tgrant explicit permissions to use the <code>ecs:TagResource</code> action. For\\n\\t\\t\\t\\t\\tmore information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/supported-iam-actions-tagging.html\\\">Grant permission to tag resources on creation</a> in the\\n\\t\\t\\t\\t\\t\\t<i>Amazon ECS Developer Guide</i>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>defaultLogDriverMode</code> - Amazon ECS supports setting a default delivery\\n\\t\\t\\t\\t\\tmode of log messages from a container to the <code>logDriver</code> that you specify in the container's <code>logConfiguration</code>. The delivery mode affects\\n\\t\\t\\t\\t\\tapplication stability when the flow of logs from the container to the log driver is\\n\\t\\t\\t\\t\\tinterrupted. The <code>defaultLogDriverMode</code> setting supports two values:\\n\\t\\t\\t\\t\\t<code>blocking</code> and <code>non-blocking</code>. If you don't specify a\\n\\t\\t\\t\\t\\tdelivery mode in your container definition's <code>logConfiguration</code>, the\\n\\t\\t\\t\\t\\tmode you specify using this account setting will be used as the default. For\\n\\t\\t\\t\\t\\tmore information about log delivery modes, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_LogConfiguration.html\\\">LogConfiguration</a>.\\n\\t\\t\\t\\t</p>\\n               <note>\\n                  <p>On June 25, 2025, Amazon ECS changed the default log driver mode from <code>blocking</code> to <code>non-blocking</code> to prioritize task availability over logging. To continue using the <code>blocking</code> mode after this change, do one of the following:</p>\\n                  <ul>\\n                     <li>\\n                        <p>Set the <code>mode</code> option in your container definition's <code>logConfiguration</code> as <code>blocking</code>.</p>\\n                     </li>\\n                     <li>\\n                        <p>Set the <code>defaultLogDriverMode</code> account setting to <code>blocking</code>.</p>\\n                     </li>\\n                  </ul>\\n               </note>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>guardDutyActivate</code> - The <code>guardDutyActivate</code> parameter is read-only in Amazon ECS and indicates whether\\n\\t\\t\\tAmazon ECS Runtime Monitoring is enabled or disabled by your security administrator in your\\n\\t\\t\\tAmazon ECS account. Amazon GuardDuty controls this account setting on your behalf. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-guard-duty-integration.html\\\">Protecting Amazon ECS workloads with Amazon ECS Runtime Monitoring</a>.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"value\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The account setting value for the specified principal ARN. Accepted values are\\n\\t\\t\\t\\t<code>enabled</code>, <code>disabled</code>, <code>enhanced</code>, <code>on</code>,\\n\\t\\t\\tand <code>off</code>.</p>\\n         <p>When you specify <code>fargateTaskRetirementWaitPeriod</code> for the\\n\\t\\t\\t\\t<code>name</code>, the following are the valid values:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>0</code> - Amazon Web Services sends the notification, and immediately retires the\\n\\t\\t\\t\\t\\taffected tasks.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>7</code> - Amazon Web Services sends the notification, and waits 7 calendar days to\\n\\t\\t\\t\\t\\tretire the tasks.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>14</code> - Amazon Web Services sends the notification, and waits 14 calendar days to\\n\\t\\t\\t\\t\\tretire the tasks.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"principalArn\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the principal, which can be a user, role, or the root user. If you specify\\n\\t\\t\\tthe root user, it modifies the account setting for all users, roles, and the root user of the\\n\\t\\t\\taccount unless a user or role explicitly overrides these settings. If this field is\\n\\t\\t\\tomitted, the setting is changed only for the authenticated user.</p>\\n         <p>In order to use this parameter, you must be the root user, or the principal.</p>\\n         <note>\\n            <p>You must use the root user when you set the Fargate wait time\\n\\t\\t\\t\\t\\t(<code>fargateTaskRetirementWaitPeriod</code>). </p>\\n            <p>Federated users assume the account setting of the root user and can't have explicit\\n\\t\\t\\t\\taccount settings set for them.</p>\\n         </note>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ecs#PutAccountSettingResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"setting\": {\n                    \"target\": \"com.amazonaws.ecs#Setting\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The current account setting for a resource.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ecs#PutAttributes\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ecs#PutAttributesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ecs#PutAttributesResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.ecs#AttributeLimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ClusterNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#TargetNotFoundException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Create or update an attribute on an Amazon ECS resource. If the attribute doesn't exist,\\n\\t\\t\\tit's created. If the attribute exists, its value is replaced with the specified value.\\n\\t\\t\\tTo delete an attribute, use <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_DeleteAttributes.html\\\">DeleteAttributes</a>. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-placement-constraints.html#attributes\\\">Attributes</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To create or update an attribute on a resource\",\n                        \"documentation\": \"This example adds an attribute \\\"stack\\\" with the value \\\"production\\\" to a container instance.\",\n                        \"input\": {\n                            \"cluster\": \"MyCluster\",\n                            \"attributes\": [\n                                {\n                                    \"targetId\": \"arn:aws:ecs:us-west-2:123456789012:container-instance/1c3be8ed-df30-47b4-8f1e-6e68ebd01f34\",\n                                    \"name\": \"stack\",\n                                    \"value\": \"production\"\n                                }\n                            ]\n                        },\n                        \"output\": {\n                            \"attributes\": [\n                                {\n                                    \"name\": \"stack\",\n                                    \"targetId\": \"arn:aws:ecs:us-west-2:123456789012:container-instance/1c3be8ed-df30-47b4-8f1e-6e68ebd01f34\",\n                                    \"value\": \"production\"\n                                }\n                            ]\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ecs#PutAttributesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"cluster\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The short name or full Amazon Resource Name (ARN) of the cluster that contains the resource to apply\\n\\t\\t\\tattributes. If you do not specify a cluster, the default cluster is assumed.</p>\"\n                    }\n                },\n                \"attributes\": {\n                    \"target\": \"com.amazonaws.ecs#Attributes\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The attributes to apply to your resource. You can specify up to 10 custom attributes\\n\\t\\t\\tfor each resource. You can specify up to 10 attributes in a single call.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ecs#PutAttributesResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"attributes\": {\n                    \"target\": \"com.amazonaws.ecs#Attributes\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The attributes applied to your resource.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ecs#PutClusterCapacityProviders\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ecs#PutClusterCapacityProvidersRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ecs#PutClusterCapacityProvidersResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.ecs#ClientException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ClusterNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ResourceInUseException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ServerException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#UpdateInProgressException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Modifies the available capacity providers and the default capacity provider strategy\\n\\t\\t\\tfor a cluster.</p>\\n         <p>You must specify both the available capacity providers and a default capacity provider\\n\\t\\t\\tstrategy for the cluster. If the specified cluster has existing capacity providers\\n\\t\\t\\tassociated with it, you must specify all existing capacity providers in addition to any\\n\\t\\t\\tnew ones you want to add. Any existing capacity providers that are associated with a\\n\\t\\t\\tcluster that are omitted from a <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_PutClusterCapacityProviders.html\\\">PutClusterCapacityProviders</a> API call will be disassociated with the\\n\\t\\t\\tcluster. You can only disassociate an existing capacity provider from a cluster if it's\\n\\t\\t\\tnot being used by any existing tasks.</p>\\n         <p>When creating a service or running a task on a cluster, if no capacity provider or\\n\\t\\t\\tlaunch type is specified, then the cluster's default capacity provider strategy is used.\\n\\t\\t\\tWe recommend that you define a default capacity provider strategy for your cluster.\\n\\t\\t\\tHowever, you must specify an empty array (<code>[]</code>) to bypass defining a default\\n\\t\\t\\tstrategy.</p>\\n         <p>Amazon ECS Managed Instances doesn't support this, because when you create a capacity provider with Amazon ECS Managed Instances, it becomes available only within the specified cluster.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To add an existing capacity provider to a cluuster\",\n                        \"documentation\": \"This example adds an existing capacity provider \\\"MyCapacityProvider2\\\" to a cluster that already has the capacity provider \\\"MyCapacityProvider1\\\" associated with it. Both \\\"MyCapacityProvider2\\\" and \\\"MyCapacityProvider1\\\" need to be specified. \",\n                        \"input\": {\n                            \"cluster\": \"MyCluster\",\n                            \"capacityProviders\": [\n                                \"MyCapacityProvider1\",\n                                \"MyCapacityProvider2\"\n                            ],\n                            \"defaultCapacityProviderStrategy\": [\n                                {\n                                    \"capacityProvider\": \"MyCapacityProvider1\",\n                                    \"weight\": 1\n                                },\n                                {\n                                    \"capacityProvider\": \"MyCapacityProvider2\",\n                                    \"weight\": 1\n                                }\n                            ]\n                        },\n                        \"output\": {\n                            \"cluster\": {\n                                \"clusterArn\": \"arn:aws:ecs:us-west-2:123456789012:cluster/MyCluster\",\n                                \"clusterName\": \"MyCluster\",\n                                \"status\": \"ACTIVE\",\n                                \"registeredContainerInstancesCount\": 0,\n                                \"runningTasksCount\": 0,\n                                \"pendingTasksCount\": 0,\n                                \"activeServicesCount\": 0,\n                                \"statistics\": [],\n                                \"tags\": [],\n                                \"settings\": [\n                                    {\n                                        \"name\": \"containerInsights\",\n                                        \"value\": \"enabled\"\n                                    }\n                                ],\n                                \"capacityProviders\": [\n                                    \"MyCapacityProvider1\",\n                                    \"MyCapacityProvider2\"\n                                ],\n                                \"defaultCapacityProviderStrategy\": [\n                                    {\n                                        \"capacityProvider\": \"MyCapacityProvider1\",\n                                        \"weight\": 1,\n                                        \"base\": 0\n                                    },\n                                    {\n                                        \"capacityProvider\": \"MyCapacityProvider2\",\n                                        \"weight\": 1,\n                                        \"base\": 0\n                                    }\n                                ],\n                                \"attachments\": [\n                                    {\n                                        \"id\": \"0fb0c8f4-6edd-4de1-9b09-17e470ee1918\",\n                                        \"type\": \"as_policy\",\n                                        \"status\": \"ACTIVE\",\n                                        \"details\": [\n                                            {\n                                                \"name\": \"capacityProviderName\",\n                                                \"value\": \"MyCapacityProvider1\"\n                                            },\n                                            {\n                                                \"name\": \"scalingPolicyName\",\n                                                \"value\": \"ECSManagedAutoScalingPolicy-a1b2c3d4-5678-90ab-cdef-EXAMPLE11111\"\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"id\": \"ae592060-2382-4663-9476-b015c685593c\",\n                                        \"type\": \"as_policy\",\n                                        \"status\": \"ACTIVE\",\n                                        \"details\": [\n                                            {\n                                                \"name\": \"capacityProviderName\",\n                                                \"value\": \"MyCapacityProvider2\"\n                                            },\n                                            {\n                                                \"name\": \"scalingPolicyName\",\n                                                \"value\": \"ECSManagedAutoScalingPolicy-a1b2c3d4-5678-90ab-cdef-EXAMPLE22222\"\n                                            }\n                                        ]\n                                    }\n                                ],\n                                \"attachmentsStatus\": \"UPDATE_IN_PROGRESS\"\n                            }\n                        }\n                    },\n                    {\n                        \"title\": \"To remove a capacity provider from a cluster\",\n                        \"documentation\": \"This example removes a capacity provider \\\"MyCapacityProvider2\\\" from a cluster that has both \\\"MyCapacityProvider2\\\" and \\\"MyCapacityProvider1\\\" associated with it. Only \\\"MyCapacityProvider1\\\" needs to be specified in this scenario. \",\n                        \"input\": {\n                            \"cluster\": \"MyCluster\",\n                            \"capacityProviders\": [\n                                \"MyCapacityProvider1\"\n                            ],\n                            \"defaultCapacityProviderStrategy\": [\n                                {\n                                    \"capacityProvider\": \"MyCapacityProvider1\",\n                                    \"weight\": 1,\n                                    \"base\": 0\n                                }\n                            ]\n                        },\n                        \"output\": {\n                            \"cluster\": {\n                                \"clusterArn\": \"arn:aws:ecs:us-west-2:123456789012:cluster/MyCluster\",\n                                \"clusterName\": \"MyCluster\",\n                                \"status\": \"ACTIVE\",\n                                \"registeredContainerInstancesCount\": 0,\n                                \"runningTasksCount\": 0,\n                                \"pendingTasksCount\": 0,\n                                \"activeServicesCount\": 0,\n                                \"statistics\": [],\n                                \"tags\": [],\n                                \"settings\": [\n                                    {\n                                        \"name\": \"containerInsights\",\n                                        \"value\": \"enabled\"\n                                    }\n                                ],\n                                \"capacityProviders\": [\n                                    \"MyCapacityProvider1\"\n                                ],\n                                \"defaultCapacityProviderStrategy\": [\n                                    {\n                                        \"capacityProvider\": \"MyCapacityProvider1\",\n                                        \"weight\": 1,\n                                        \"base\": 0\n                                    }\n                                ],\n                                \"attachments\": [\n                                    {\n                                        \"id\": \"0fb0c8f4-6edd-4de1-9b09-17e470ee1918\",\n                                        \"type\": \"as_policy\",\n                                        \"status\": \"ACTIVE\",\n                                        \"details\": [\n                                            {\n                                                \"name\": \"capacityProviderName\",\n                                                \"value\": \"MyCapacityProvider1\"\n                                            },\n                                            {\n                                                \"name\": \"scalingPolicyName\",\n                                                \"value\": \"ECSManagedAutoScalingPolicy-a1b2c3d4-5678-90ab-cdef-EXAMPLE11111\"\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"id\": \"ae592060-2382-4663-9476-b015c685593c\",\n                                        \"type\": \"as_policy\",\n                                        \"status\": \"DELETING\",\n                                        \"details\": [\n                                            {\n                                                \"name\": \"capacityProviderName\",\n                                                \"value\": \"MyCapacityProvider2\"\n                                            },\n                                            {\n                                                \"name\": \"scalingPolicyName\",\n                                                \"value\": \"ECSManagedAutoScalingPolicy-a1b2c3d4-5678-90ab-cdef-EXAMPLE22222\"\n                                            }\n                                        ]\n                                    }\n                                ],\n                                \"attachmentsStatus\": \"UPDATE_IN_PROGRESS\"\n                            }\n                        }\n                    },\n                    {\n                        \"title\": \"To remove all capacity providers from a cluster\",\n                        \"documentation\": \"This example removes all capacity providers associated with a cluster. \",\n                        \"input\": {\n                            \"cluster\": \"MyCluster\",\n                            \"capacityProviders\": [],\n                            \"defaultCapacityProviderStrategy\": []\n                        },\n                        \"output\": {\n                            \"cluster\": {\n                                \"clusterArn\": \"arn:aws:ecs:us-west-2:123456789012:cluster/MyCluster\",\n                                \"clusterName\": \"MyCluster\",\n                                \"status\": \"ACTIVE\",\n                                \"registeredContainerInstancesCount\": 0,\n                                \"runningTasksCount\": 0,\n                                \"pendingTasksCount\": 0,\n                                \"activeServicesCount\": 0,\n                                \"statistics\": [],\n                                \"tags\": [],\n                                \"settings\": [\n                                    {\n                                        \"name\": \"containerInsights\",\n                                        \"value\": \"enabled\"\n                                    }\n                                ],\n                                \"capacityProviders\": [],\n                                \"defaultCapacityProviderStrategy\": [],\n                                \"attachments\": [\n                                    {\n                                        \"id\": \"0fb0c8f4-6edd-4de1-9b09-17e470ee1918\",\n                                        \"type\": \"as_policy\",\n                                        \"status\": \"DELETING\",\n                                        \"details\": [\n                                            {\n                                                \"name\": \"capacityProviderName\",\n                                                \"value\": \"MyCapacityProvider1\"\n                                            },\n                                            {\n                                                \"name\": \"scalingPolicyName\",\n                                                \"value\": \"ECSManagedAutoScalingPolicy-a1b2c3d4-5678-90ab-cdef-EXAMPLE11111\"\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"id\": \"ae592060-2382-4663-9476-b015c685593c\",\n                                        \"type\": \"as_policy\",\n                                        \"status\": \"DELETING\",\n                                        \"details\": [\n                                            {\n                                                \"name\": \"capacityProviderName\",\n                                                \"value\": \"MyCapacityProvider2\"\n                                            },\n                                            {\n                                                \"name\": \"scalingPolicyName\",\n                                                \"value\": \"ECSManagedAutoScalingPolicy-a1b2c3d4-5678-90ab-cdef-EXAMPLE22222\"\n                                            }\n                                        ]\n                                    }\n                                ],\n                                \"attachmentsStatus\": \"UPDATE_IN_PROGRESS\"\n                            }\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ecs#PutClusterCapacityProvidersRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"cluster\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The short name or full Amazon Resource Name (ARN) of the cluster to modify the capacity provider\\n\\t\\t\\tsettings for. If you don't specify a cluster, the default cluster is assumed.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"capacityProviders\": {\n                    \"target\": \"com.amazonaws.ecs#StringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of one or more capacity providers to associate with the cluster.</p>\\n         <p>If specifying a capacity provider that uses an Auto Scaling group, the capacity\\n\\t\\t\\tprovider must already be created. New capacity providers can be created with the <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_CreateCapacityProvider.html\\\">CreateCapacityProvider</a> API operation.</p>\\n         <p>To use a Fargate capacity provider, specify either the <code>FARGATE</code> or\\n\\t\\t\\t\\t<code>FARGATE_SPOT</code> capacity providers. The Fargate capacity providers are\\n\\t\\t\\tavailable to all accounts and only need to be associated with a cluster to be\\n\\t\\t\\tused.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"defaultCapacityProviderStrategy\": {\n                    \"target\": \"com.amazonaws.ecs#CapacityProviderStrategy\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The capacity provider strategy to use by default for the cluster.</p>\\n         <p>When creating a service or running a task on a cluster, if no capacity provider or\\n\\t\\t\\tlaunch type is specified then the default capacity provider strategy for the cluster is\\n\\t\\t\\tused.</p>\\n         <p>A capacity provider strategy consists of one or more capacity providers along with the\\n\\t\\t\\t\\t<code>base</code> and <code>weight</code> to assign to them. A capacity provider\\n\\t\\t\\tmust be associated with the cluster to be used in a capacity provider strategy. The\\n\\t\\t\\t\\t<a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_PutClusterCapacityProviders.html\\\">PutClusterCapacityProviders</a> API is used to associate a capacity provider\\n\\t\\t\\twith a cluster. Only capacity providers with an <code>ACTIVE</code> or\\n\\t\\t\\t\\t<code>UPDATING</code> status can be used.</p>\\n         <p>If specifying a capacity provider that uses an Auto Scaling group, the capacity\\n\\t\\t\\tprovider must already be created. New capacity providers can be created with the <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_CreateCapacityProvider.html\\\">CreateCapacityProvider</a> API operation.</p>\\n         <p>To use a Fargate capacity provider, specify either the <code>FARGATE</code> or\\n\\t\\t\\t\\t<code>FARGATE_SPOT</code> capacity providers. The Fargate capacity providers are\\n\\t\\t\\tavailable to all accounts and only need to be associated with a cluster to be\\n\\t\\t\\tused.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ecs#PutClusterCapacityProvidersResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"cluster\": {\n                    \"target\": \"com.amazonaws.ecs#Cluster\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Details about the cluster.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ecs#RegisterContainerInstance\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ecs#RegisterContainerInstanceRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ecs#RegisterContainerInstanceResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.ecs#ClientException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ServerException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>This action is only used by the Amazon ECS agent, and it is not intended for use outside of the agent.</p>\\n         </note>\\n         <p>Registers an EC2 instance into the specified cluster. This instance becomes available\\n\\t\\t\\tto place containers on.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#RegisterContainerInstanceRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"cluster\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The short name or full Amazon Resource Name (ARN) of the cluster to register your container instance\\n\\t\\t\\twith. If you do not specify a cluster, the default cluster is assumed.</p>\"\n                    }\n                },\n                \"instanceIdentityDocument\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The instance identity document for the EC2 instance to register. This document can be\\n\\t\\t\\tfound by running the following command from the instance: <code>curl\\n\\t\\t\\t\\thttp://169.254.169.254/latest/dynamic/instance-identity/document/</code>\\n         </p>\"\n                    }\n                },\n                \"instanceIdentityDocumentSignature\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The instance identity document signature for the EC2 instance to register. This\\n\\t\\t\\tsignature can be found by running the following command from the instance: <code>curl\\n\\t\\t\\t\\thttp://169.254.169.254/latest/dynamic/instance-identity/signature/</code>\\n         </p>\"\n                    }\n                },\n                \"totalResources\": {\n                    \"target\": \"com.amazonaws.ecs#Resources\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The resources available on the instance.</p>\"\n                    }\n                },\n                \"versionInfo\": {\n                    \"target\": \"com.amazonaws.ecs#VersionInfo\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The version information for the Amazon ECS container agent and Docker daemon that runs on\\n\\t\\t\\tthe container instance.</p>\"\n                    }\n                },\n                \"containerInstanceArn\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the container instance (if it was previously registered).</p>\"\n                    }\n                },\n                \"attributes\": {\n                    \"target\": \"com.amazonaws.ecs#Attributes\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The container instance attributes that this container instance supports.</p>\"\n                    }\n                },\n                \"platformDevices\": {\n                    \"target\": \"com.amazonaws.ecs#PlatformDevices\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The devices that are available on the container instance. The only supported device\\n\\t\\t\\ttype is a GPU.</p>\"\n                    }\n                },\n                \"tags\": {\n                    \"target\": \"com.amazonaws.ecs#Tags\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The metadata that you apply to the container instance to help you categorize and\\n\\t\\t\\torganize them. Each tag consists of a key and an optional value. You define both.</p>\\n         <p>The following basic restrictions apply to tags:</p>\\n         <ul>\\n            <li>\\n               <p>Maximum number of tags per resource - 50</p>\\n            </li>\\n            <li>\\n               <p>For each resource, each tag key must be unique, and each tag key can have only\\n                    one value.</p>\\n            </li>\\n            <li>\\n               <p>Maximum key length - 128 Unicode characters in UTF-8</p>\\n            </li>\\n            <li>\\n               <p>Maximum value length - 256 Unicode characters in UTF-8</p>\\n            </li>\\n            <li>\\n               <p>If your tagging schema is used across multiple services and resources,\\n                    remember that other services may have restrictions on allowed characters.\\n                    Generally allowed characters are: letters, numbers, and spaces representable in\\n                    UTF-8, and the following characters: + - = . _ : / @.</p>\\n            </li>\\n            <li>\\n               <p>Tag keys and values are case-sensitive.</p>\\n            </li>\\n            <li>\\n               <p>Do not use <code>aws:</code>, <code>AWS:</code>, or any upper or lowercase\\n                    combination of such as a prefix for either keys or values as it is reserved for\\n                    Amazon Web Services use. You cannot edit or delete tag keys or values with this prefix. Tags with\\n                    this prefix do not count against your tags per resource limit.</p>\\n            </li>\\n         </ul>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ecs#RegisterContainerInstanceResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"containerInstance\": {\n                    \"target\": \"com.amazonaws.ecs#ContainerInstance\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The container instance that was registered.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ecs#RegisterTaskDefinition\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ecs#RegisterTaskDefinitionRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ecs#RegisterTaskDefinitionResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.ecs#ClientException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ServerException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Registers a new task definition from the supplied <code>family</code> and\\n\\t\\t\\t\\t<code>containerDefinitions</code>. Optionally, you can add data volumes to your\\n\\t\\t\\tcontainers with the <code>volumes</code> parameter. For more information about task\\n\\t\\t\\tdefinition parameters and defaults, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_defintions.html\\\">Amazon ECS Task\\n\\t\\t\\t\\tDefinitions</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\\n         <p>You can specify a role for your task with the <code>taskRoleArn</code> parameter. When\\n\\t\\t\\tyou specify a role for a task, its containers can then use the latest versions of the\\n\\t\\t\\tCLI or SDKs to make API requests to the Amazon Web Services services that are specified in the\\n\\t\\t\\tpolicy that's associated with the role. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-iam-roles.html\\\">IAM\\n\\t\\t\\t\\tRoles for Tasks</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\\n         <p>You can specify a Docker networking mode for the containers in your task definition\\n\\t\\t\\twith the <code>networkMode</code> parameter. If you specify the <code>awsvpc</code>\\n\\t\\t\\tnetwork mode, the task is allocated an elastic network interface, and you must specify a\\n\\t\\t\\t\\t<a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_NetworkConfiguration.html\\\">NetworkConfiguration</a> when you create a service or run a task with the task\\n\\t\\t\\tdefinition. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-networking.html\\\">Task Networking</a>\\n\\t\\t\\tin the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To register a task definition\",\n                        \"documentation\": \"This example registers a task definition to the specified family.\",\n                        \"input\": {\n                            \"family\": \"sleep360\",\n                            \"taskRoleArn\": \"\",\n                            \"containerDefinitions\": [\n                                {\n                                    \"name\": \"sleep\",\n                                    \"image\": \"public.ecr.aws/docker/library/busybox:latest\",\n                                    \"cpu\": 10,\n                                    \"command\": [\n                                        \"sleep\",\n                                        \"360\"\n                                    ],\n                                    \"memory\": 10,\n                                    \"essential\": true\n                                }\n                            ],\n                            \"volumes\": []\n                        },\n                        \"output\": {\n                            \"taskDefinition\": {\n                                \"volumes\": [],\n                                \"taskDefinitionArn\": \"arn:aws:ecs:us-east-1:<aws_account_id>:task-definition/sleep360:19\",\n                                \"containerDefinitions\": [\n                                    {\n                                        \"environment\": [],\n                                        \"name\": \"sleep\",\n                                        \"mountPoints\": [],\n                                        \"image\": \"public.ecr.aws/docker/library/busybox:latest\",\n                                        \"cpu\": 10,\n                                        \"portMappings\": [],\n                                        \"command\": [\n                                            \"sleep\",\n                                            \"360\"\n                                        ],\n                                        \"memory\": 10,\n                                        \"essential\": true,\n                                        \"volumesFrom\": []\n                                    }\n                                ],\n                                \"family\": \"sleep360\",\n                                \"revision\": 1\n                            }\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ecs#RegisterTaskDefinitionRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"family\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>You must specify a <code>family</code> for a task definition. You can use it track\\n\\t\\t\\tmultiple versions of the same task definition. The <code>family</code> is used as a name\\n\\t\\t\\tfor your task definition. Up to 255 letters (uppercase and lowercase), numbers, underscores, and hyphens are allowed.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"taskRoleArn\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The short name or full Amazon Resource Name (ARN) of the IAM role that containers in this task can\\n\\t\\t\\tassume. All containers in this task are granted the permissions that are specified in\\n\\t\\t\\tthis role. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-iam-roles.html\\\">IAM Roles for\\n\\t\\t\\t\\tTasks</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\"\n                    }\n                },\n                \"executionRoleArn\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the task execution role that grants the Amazon ECS container agent\\n            permission to make Amazon Web Services API calls on your behalf. For informationabout the required IAM roles for Amazon ECS, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/security-ecs-iam-role-overview.html\\\">IAM roles for Amazon ECS</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\"\n                    }\n                },\n                \"networkMode\": {\n                    \"target\": \"com.amazonaws.ecs#NetworkMode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Docker networking mode to use for the containers in the task. The valid values are\\n                <code>none</code>, <code>bridge</code>, <code>awsvpc</code>, and <code>host</code>.\\n            If no network mode is specified, the default is <code>bridge</code>.</p>\\n         <p>For Amazon ECS tasks on Fargate, the <code>awsvpc</code> network mode is required. \\n            For Amazon ECS tasks on Amazon EC2 Linux instances, any network mode can be used.  For Amazon ECS tasks on Amazon EC2 Windows instances, <code><default></code> or <code>awsvpc</code> can be used. If the network\\n            mode is set to <code>none</code>, you cannot specify port mappings in your container\\n            definitions, and the tasks containers do not have external connectivity. The\\n                <code>host</code> and <code>awsvpc</code> network modes offer the highest networking\\n            performance for containers because they use the EC2 network stack instead of the\\n            virtualized network stack provided by the <code>bridge</code> mode.</p>\\n         <p>With the <code>host</code> and <code>awsvpc</code> network modes, exposed container\\n            ports are mapped directly to the corresponding host port (for the <code>host</code>\\n            network mode) or the attached elastic network interface port (for the\\n                <code>awsvpc</code> network mode), so you cannot take advantage of dynamic host port\\n            mappings. </p>\\n         <important>\\n            <p>When using the <code>host</code> network mode, you should not run\\n                            containers using the root user (UID 0). It is considered best practice\\n                            to use a non-root user.</p>\\n         </important>\\n         <p>If the network mode is <code>awsvpc</code>, the task is allocated an elastic network\\n            interface, and you must specify a <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_NetworkConfiguration.html\\\">NetworkConfiguration</a> value when you create\\n            a service or run a task with the task definition. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-networking.html\\\">Task Networking</a> in the\\n                <i>Amazon Elastic Container Service Developer Guide</i>.</p>\\n         <p>If the network mode is <code>host</code>, you cannot run multiple instantiations of the\\n            same task on a single container instance when port mappings are used.</p>\"\n                    }\n                },\n                \"containerDefinitions\": {\n                    \"target\": \"com.amazonaws.ecs#ContainerDefinitions\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of container definitions in JSON format that describe the different containers\\n\\t\\t\\tthat make up your task.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"volumes\": {\n                    \"target\": \"com.amazonaws.ecs#VolumeList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of volume definitions in JSON format that containers in your task might\\n\\t\\t\\tuse.</p>\"\n                    }\n                },\n                \"placementConstraints\": {\n                    \"target\": \"com.amazonaws.ecs#TaskDefinitionPlacementConstraints\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An array of placement constraint objects to use for the task. You can specify a\\n\\t\\t\\tmaximum of 10 constraints for each task. This limit includes constraints in the task\\n\\t\\t\\tdefinition and those specified at runtime.</p>\"\n                    }\n                },\n                \"requiresCompatibilities\": {\n                    \"target\": \"com.amazonaws.ecs#CompatibilityList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The task launch type that Amazon ECS validates the task definition against. A client\\n\\t\\t\\texception is returned if the task definition doesn't validate against the\\n\\t\\t\\tcompatibilities specified. If no value is specified, the parameter is omitted from the\\n\\t\\t\\tresponse.</p>\"\n                    }\n                },\n                \"cpu\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of CPU units used by the task. It can be expressed as an integer using CPU\\n\\t\\t\\tunits (for example, <code>1024</code>) or as a string using vCPUs (for example, <code>1\\n\\t\\t\\t\\tvCPU</code> or <code>1 vcpu</code>) in a task definition. String values are\\n\\t\\t\\tconverted to an integer indicating the CPU units when the task definition is\\n\\t\\t\\tregistered.</p>\\n         <note>\\n            <p>Task-level CPU and memory parameters are ignored for Windows containers. We\\n\\t\\t\\t\\trecommend specifying container-level resources for Windows containers.</p>\\n         </note>\\n         <p>If you're using the EC2 launch type or external launch type, this field\\n\\t\\t\\tis optional. Supported values are between <code>128</code> CPU units (<code>0.125</code>\\n\\t\\t\\tvCPUs) and <code>196608</code> CPU units (<code>192</code> vCPUs). If you do not specify\\n\\t\\t\\ta value, the parameter is ignored.</p>\\n         <p>This field is required for Fargate. For information about the valid values, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html#task_size\\\">Task size</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\"\n                    }\n                },\n                \"memory\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The amount of memory (in MiB) used by the task. It can be expressed as an integer\\n\\t\\t\\tusing MiB (for example ,<code>1024</code>) or as a string using GB (for example,\\n\\t\\t\\t\\t<code>1GB</code> or <code>1 GB</code>) in a task definition. String values are\\n\\t\\t\\tconverted to an integer indicating the MiB when the task definition is\\n\\t\\t\\tregistered.</p>\\n         <note>\\n            <p>Task-level CPU and memory parameters are ignored for Windows containers. We\\n\\t\\t\\t\\trecommend specifying container-level resources for Windows containers.</p>\\n         </note>\\n         <p>If using the EC2 launch type, this field is optional.</p>\\n         <p>If using the Fargate launch type, this field is required and you must\\n\\t\\t\\tuse one of the following values. This determines your range of supported values for the\\n\\t\\t\\t\\t<code>cpu</code> parameter.</p>\\n         <p>The CPU units cannot be less than 1 vCPU when you use Windows containers on\\n\\t\\t\\tFargate.</p>\\n         <ul>\\n            <li>\\n               <p>512 (0.5 GB), 1024 (1 GB), 2048 (2 GB) - Available <code>cpu</code> values: 256 (.25 vCPU)</p>\\n            </li>\\n            <li>\\n               <p>1024 (1 GB), 2048 (2 GB), 3072 (3 GB), 4096 (4 GB) - Available <code>cpu</code> values: 512 (.5 vCPU)</p>\\n            </li>\\n            <li>\\n               <p>2048 (2 GB), 3072 (3 GB), 4096 (4 GB), 5120 (5 GB), 6144 (6 GB), 7168 (7 GB), 8192 (8 GB) - Available <code>cpu</code> values: 1024 (1 vCPU)</p>\\n            </li>\\n            <li>\\n               <p>Between 4096 (4 GB) and 16384 (16 GB) in increments of 1024 (1 GB) - Available <code>cpu</code> values: 2048 (2 vCPU)</p>\\n            </li>\\n            <li>\\n               <p>Between 8192 (8 GB) and 30720 (30 GB) in increments of 1024 (1 GB) - Available <code>cpu</code> values: 4096 (4 vCPU)</p>\\n            </li>\\n            <li>\\n               <p>Between 16 GB and 60 GB in 4 GB increments - Available <code>cpu</code> values: 8192 (8 vCPU)</p>\\n               <p>This option requires Linux platform <code>1.4.0</code> or\\n                                        later.</p>\\n            </li>\\n            <li>\\n               <p>Between 32GB and 120 GB in 8 GB increments - Available <code>cpu</code> values: 16384 (16 vCPU)</p>\\n               <p>This option requires Linux platform <code>1.4.0</code> or\\n                                        later.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"tags\": {\n                    \"target\": \"com.amazonaws.ecs#Tags\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The metadata that you apply to the task definition to help you categorize and organize\\n\\t\\t\\tthem. Each tag consists of a key and an optional value. You define both of them.</p>\\n         <p>The following basic restrictions apply to tags:</p>\\n         <ul>\\n            <li>\\n               <p>Maximum number of tags per resource - 50</p>\\n            </li>\\n            <li>\\n               <p>For each resource, each tag key must be unique, and each tag key can have only\\n                    one value.</p>\\n            </li>\\n            <li>\\n               <p>Maximum key length - 128 Unicode characters in UTF-8</p>\\n            </li>\\n            <li>\\n               <p>Maximum value length - 256 Unicode characters in UTF-8</p>\\n            </li>\\n            <li>\\n               <p>If your tagging schema is used across multiple services and resources,\\n                    remember that other services may have restrictions on allowed characters.\\n                    Generally allowed characters are: letters, numbers, and spaces representable in\\n                    UTF-8, and the following characters: + - = . _ : / @.</p>\\n            </li>\\n            <li>\\n               <p>Tag keys and values are case-sensitive.</p>\\n            </li>\\n            <li>\\n               <p>Do not use <code>aws:</code>, <code>AWS:</code>, or any upper or lowercase\\n                    combination of such as a prefix for either keys or values as it is reserved for\\n                    Amazon Web Services use. You cannot edit or delete tag keys or values with this prefix. Tags with\\n                    this prefix do not count against your tags per resource limit.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"pidMode\": {\n                    \"target\": \"com.amazonaws.ecs#PidMode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The process namespace to use for the containers in the task. The valid\\n                            values are <code>host</code> or <code>task</code>. On Fargate for\\n                            Linux containers, the only valid value is <code>task</code>. For\\n                            example, monitoring sidecars might need <code>pidMode</code> to access\\n                            information about other containers running in the same task.</p>\\n         <p>If <code>host</code> is specified, all containers within the tasks\\n                            that specified the <code>host</code> PID mode on the same container\\n                            instance share the same process namespace with the host Amazon EC2\\n                            instance.</p>\\n         <p>If <code>task</code> is specified, all containers within the specified\\n                            task share the same process namespace.</p>\\n         <p>If no value is specified, the\\n                            default is a private namespace for each container.</p>\\n         <p>If the <code>host</code> PID mode is used, there's a heightened risk\\n                            of undesired process namespace exposure.</p>\\n         <note>\\n            <p>This parameter is not supported for Windows containers.</p>\\n         </note>\\n         <note>\\n            <p>This parameter is only supported for tasks that are hosted on\\n        Fargate if the tasks are using platform version <code>1.4.0</code> or later\\n        (Linux). This isn't supported for Windows containers on\\n        Fargate.</p>\\n         </note>\"\n                    }\n                },\n                \"ipcMode\": {\n                    \"target\": \"com.amazonaws.ecs#IpcMode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IPC resource namespace to use for the containers in the task. The valid values are\\n                <code>host</code>, <code>task</code>, or <code>none</code>. If <code>host</code> is\\n            specified, then all containers within the tasks that specified the <code>host</code> IPC\\n            mode on the same container instance share the same IPC resources with the host Amazon EC2\\n            instance. If <code>task</code> is specified, all containers within the specified task\\n            share the same IPC resources. If <code>none</code> is specified, then IPC resources\\n            within the containers of a task are private and not shared with other containers in a\\n            task or on the container instance. If no value is specified, then the IPC resource\\n            namespace sharing depends on the Docker daemon setting on the container instance.</p>\\n         <p>If the <code>host</code> IPC mode is used, be aware that there is a heightened risk of\\n            undesired IPC namespace expose.</p>\\n         <p>If you are setting namespaced kernel parameters using <code>systemControls</code> for\\n            the containers in the task, the following will apply to your IPC resource namespace. For\\n            more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html\\\">System\\n                Controls</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\\n         <ul>\\n            <li>\\n               <p>For tasks that use the <code>host</code> IPC mode, IPC namespace related\\n                        <code>systemControls</code> are not supported.</p>\\n            </li>\\n            <li>\\n               <p>For tasks that use the <code>task</code> IPC mode, IPC namespace related\\n                        <code>systemControls</code> will apply to all containers within a\\n                    task.</p>\\n            </li>\\n         </ul>\\n         <note>\\n            <p>This parameter is not supported for Windows containers or tasks run on Fargate.</p>\\n         </note>\"\n                    }\n                },\n                \"proxyConfiguration\": {\n                    \"target\": \"com.amazonaws.ecs#ProxyConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The configuration details for the App Mesh proxy.</p>\\n         <p>For tasks hosted on Amazon EC2 instances, the container instances require at least version\\n\\t\\t\\t\\t<code>1.26.0</code> of the container agent and at least version\\n\\t\\t\\t\\t<code>1.26.0-1</code> of the <code>ecs-init</code> package to use a proxy\\n\\t\\t\\tconfiguration. If your container instances are launched from the Amazon ECS-optimized\\n\\t\\t\\tAMI version <code>20190301</code> or later, then they contain the required versions of\\n\\t\\t\\tthe container agent and <code>ecs-init</code>. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-ami-versions.html\\\">Amazon ECS-optimized AMI versions</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\"\n                    }\n                },\n                \"inferenceAccelerators\": {\n                    \"target\": \"com.amazonaws.ecs#InferenceAccelerators\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Elastic Inference accelerators to use for the containers in the task.</p>\"\n                    }\n                },\n                \"ephemeralStorage\": {\n                    \"target\": \"com.amazonaws.ecs#EphemeralStorage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The amount of ephemeral storage to allocate for the task. This parameter is used to\\n\\t\\t\\texpand the total amount of ephemeral storage available, beyond the default amount, for\\n\\t\\t\\ttasks hosted on Fargate. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/using_data_volumes.html\\\">Using data volumes in\\n\\t\\t\\t\\ttasks</a> in the <i>Amazon ECS Developer Guide</i>.</p>\\n         <note>\\n            <p>For tasks using the Fargate launch type, the task requires the\\n\\t\\t\\t\\tfollowing platforms:</p>\\n            <ul>\\n               <li>\\n                  <p>Linux platform version <code>1.4.0</code> or later.</p>\\n               </li>\\n               <li>\\n                  <p>Windows platform version <code>1.0.0</code> or later.</p>\\n               </li>\\n            </ul>\\n         </note>\"\n                    }\n                },\n                \"runtimePlatform\": {\n                    \"target\": \"com.amazonaws.ecs#RuntimePlatform\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The operating system that your tasks definitions run on. A platform family is\\n\\t\\t\\tspecified only for tasks using the Fargate launch type. </p>\"\n                    }\n                },\n                \"enableFaultInjection\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedBoolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Enables fault injection when you register your task definition and allows for fault\\n\\t\\t\\tinjection requests to be accepted from the task's containers. The default value is\\n\\t\\t\\t\\t<code>false</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ecs#RegisterTaskDefinitionResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"taskDefinition\": {\n                    \"target\": \"com.amazonaws.ecs#TaskDefinition\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The full description of the registered task definition.</p>\"\n                    }\n                },\n                \"tags\": {\n                    \"target\": \"com.amazonaws.ecs#Tags\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The list of tags associated with the task definition.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ecs#RepositoryCredentials\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"credentialsParameter\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the secret containing the private repository\\n\\t\\t\\tcredentials.</p>\\n         <note>\\n            <p>When you use the Amazon ECS API, CLI, or Amazon Web Services SDK, if the secret exists in the same\\n\\t\\t\\t\\tRegion as the task that you're launching then you can use either the full ARN or\\n\\t\\t\\t\\tthe name of the secret. When you use the Amazon Web Services Management Console, you must specify the full ARN\\n\\t\\t\\t\\tof the secret.</p>\\n         </note>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The repository credentials for private registry authentication.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#RequiresAttributes\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#Attribute\"\n            }\n        },\n        \"com.amazonaws.ecs#ResolvedConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"loadBalancers\": {\n                    \"target\": \"com.amazonaws.ecs#ServiceRevisionLoadBalancers\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The resolved load balancer configuration for the service revision. This includes information about which target groups serve traffic and which listener rules direct traffic to them.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The resolved configuration for a service revision, which contains the actual resources your service revision uses, such as which target groups serve traffic.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#Resource\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"name\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the resource, such as <code>CPU</code>, <code>MEMORY</code>,\\n\\t\\t\\t\\t<code>PORTS</code>, <code>PORTS_UDP</code>, or a user-defined resource.</p>\"\n                    }\n                },\n                \"type\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of the resource. Valid values: <code>INTEGER</code>, <code>DOUBLE</code>,\\n\\t\\t\\t\\t<code>LONG</code>, or <code>STRINGSET</code>.</p>\"\n                    }\n                },\n                \"doubleValue\": {\n                    \"target\": \"com.amazonaws.ecs#Double\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>When the <code>doubleValue</code> type is set, the value of the resource must be a\\n\\t\\t\\tdouble precision floating-point type.</p>\"\n                    }\n                },\n                \"longValue\": {\n                    \"target\": \"com.amazonaws.ecs#Long\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>When the <code>longValue</code> type is set, the value of the resource must be an\\n\\t\\t\\textended precision floating-point type.</p>\"\n                    }\n                },\n                \"integerValue\": {\n                    \"target\": \"com.amazonaws.ecs#Integer\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>When the <code>integerValue</code> type is set, the value of the resource must be an\\n\\t\\t\\tinteger.</p>\"\n                    }\n                },\n                \"stringSetValue\": {\n                    \"target\": \"com.amazonaws.ecs#StringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>When the <code>stringSetValue</code> type is set, the value of the resource must be a\\n\\t\\t\\tstring type.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the resources available for a container instance.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#ResourceIds\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#String\"\n            }\n        },\n        \"com.amazonaws.ecs#ResourceInUseException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> Message that describes the cause of the exception.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The specified resource is in-use and can't be removed.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.ecs#ResourceNotFoundException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> Message that describes the cause of the exception.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The specified resource wasn't found.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.ecs#ResourceRequirement\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"value\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The value for the specified resource type.</p>\\n         <p>When the type is <code>GPU</code>, the value is the number of physical\\n\\t\\t\\t\\t<code>GPUs</code> the Amazon ECS container agent reserves for the container. The number\\n\\t\\t\\tof GPUs that's reserved for all containers in a task can't exceed the number of\\n\\t\\t\\tavailable GPUs on the container instance that the task is launched on.</p>\\n         <p>When the type is <code>InferenceAccelerator</code>, the <code>value</code> matches the\\n\\t\\t\\t\\t<code>deviceName</code> for an <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_InferenceAccelerator.html\\\">InferenceAccelerator</a> specified in a task definition.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"type\": {\n                    \"target\": \"com.amazonaws.ecs#ResourceType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of resource to assign to a container. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The type and amount of a resource to assign to a container. The supported resource\\n\\t\\t\\ttypes are GPUs and Elastic Inference accelerators. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-gpu.html\\\">Working with\\n\\t\\t\\t\\tGPUs on Amazon ECS</a> or <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-inference.html\\\">Working with Amazon Elastic\\n\\t\\t\\t\\tInference on Amazon ECS</a> in the <i>Amazon Elastic Container Service Developer Guide</i>\\n         </p>\"\n            }\n        },\n        \"com.amazonaws.ecs#ResourceRequirements\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#ResourceRequirement\"\n            }\n        },\n        \"com.amazonaws.ecs#ResourceType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"GPU\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"GPU\"\n                    }\n                },\n                \"INFERENCE_ACCELERATOR\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"InferenceAccelerator\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ecs#Resources\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#Resource\"\n            }\n        },\n        \"com.amazonaws.ecs#Rollback\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"reason\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The reason the rollback happened. For example, the circuit breaker initiated the\\n\\t\\t\\trollback operation.</p>\"\n                    }\n                },\n                \"startedAt\": {\n                    \"target\": \"com.amazonaws.ecs#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Time time that the rollback started. The format is yyyy-MM-dd HH:mm:ss.SSSSSS.</p>\"\n                    }\n                },\n                \"serviceRevisionArn\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the service revision deployed as part of the rollback.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about the service deployment rollback.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#RunTask\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ecs#RunTaskRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ecs#RunTaskResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.ecs#AccessDeniedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#BlockedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ClientException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ClusterNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ConflictException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#PlatformTaskDefinitionIncompatibilityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#PlatformUnknownException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ServerException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#UnsupportedFeatureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Starts a new task using the specified task definition.</p>\\n         <note>\\n            <p>On March 21, 2024, a change was made to resolve the task definition revision before authorization. When a task definition revision is not specified, authorization will occur using the latest revision of a task definition.</p>\\n         </note>\\n         <note>\\n            <p>Amazon Elastic Inference (EI) is no longer available to customers.</p>\\n         </note>\\n         <p>You can allow Amazon ECS to place tasks for you, or you can customize how Amazon ECS places\\n\\t\\t\\ttasks using placement constraints and placement strategies. For more information, see\\n\\t\\t\\t\\t<a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/scheduling_tasks.html\\\">Scheduling Tasks</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\\n         <p>Alternatively, you can use <code>StartTask</code> to use your own scheduler or place\\n\\t\\t\\ttasks manually on specific container instances.</p>\\n         <p>You can attach Amazon EBS volumes to Amazon ECS tasks by configuring the volume when creating or\\n\\t\\t\\tupdating a service. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ebs-volumes.html#ebs-volume-types\\\">Amazon EBS volumes</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\\n         <p>The Amazon ECS API follows an eventual consistency model. This is because of the\\n\\t\\t\\tdistributed nature of the system supporting the API. This means that the result of an\\n\\t\\t\\tAPI command you run that affects your Amazon ECS resources might not be immediately visible\\n\\t\\t\\tto all subsequent commands you run. Keep this in mind when you carry out an API command\\n\\t\\t\\tthat immediately follows a previous API command.</p>\\n         <p>To manage eventual consistency, you can do the following:</p>\\n         <ul>\\n            <li>\\n               <p>Confirm the state of the resource before you run a command to modify it. Run\\n\\t\\t\\t\\t\\tthe DescribeTasks command using an exponential backoff algorithm to ensure that\\n\\t\\t\\t\\t\\tyou allow enough time for the previous command to propagate through the system.\\n\\t\\t\\t\\t\\tTo do this, run the DescribeTasks command repeatedly, starting with a couple of\\n\\t\\t\\t\\t\\tseconds of wait time and increasing gradually up to five minutes of wait\\n\\t\\t\\t\\t\\ttime.</p>\\n            </li>\\n            <li>\\n               <p>Add wait time between subsequent commands, even if the DescribeTasks command\\n\\t\\t\\t\\t\\treturns an accurate response. Apply an exponential backoff algorithm starting\\n\\t\\t\\t\\t\\twith a couple of seconds of wait time, and increase gradually up to about five\\n\\t\\t\\t\\t\\tminutes of wait time.</p>\\n            </li>\\n         </ul>\\n         <p>If you get a <code>ConflictException</code> error, the <code>RunTask</code> request could\\n\\t\\t\\tnot be processed due to conflicts. The provided <code>clientToken</code> is already in\\n\\t\\t\\tuse with a different <code>RunTask</code> request. The <code>resourceIds</code> are the\\n\\t\\t\\texisting task ARNs which are already associated with the <code>clientToken</code>. </p>\\n         <p>To fix this issue:</p>\\n         <ul>\\n            <li>\\n               <p>Run <code>RunTask</code> with a unique <code>clientToken</code>.</p>\\n            </li>\\n            <li>\\n               <p>Run <code>RunTask</code> with the <code>clientToken</code> and the original\\n\\t\\t\\t\\t\\tset of parameters</p>\\n            </li>\\n         </ul>\\n         <p>If you get a <code>ClientException</code>error, the <code>RunTask</code> could not be processed because you use managed\\n\\t\\t\\t\\t\\tscaling and there is a capacity error because the quota of tasks in the\\n\\t\\t\\t\\t\\t<code>PROVISIONING</code> per cluster has been reached. For information\\n\\t\\t\\t\\t\\tabout the service quotas, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-quotas.html\\\">Amazon ECS\\n\\t\\t\\t\\t\\t\\tservice quotas</a>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To run a task on your default cluster\",\n                        \"documentation\": \"This example runs the specified task definition on your default cluster.\",\n                        \"input\": {\n                            \"cluster\": \"default\",\n                            \"taskDefinition\": \"sleep360:1\"\n                        },\n                        \"output\": {\n                            \"tasks\": [\n                                {\n                                    \"taskArn\": \"arn:aws:ecs:us-east-1:<aws_account_id>:task/default/a9f21ea7-c9f5-44b1-b8e6-b31f50ed33c0\",\n                                    \"overrides\": {\n                                        \"containerOverrides\": [\n                                            {\n                                                \"name\": \"sleep\"\n                                            }\n                                        ]\n                                    },\n                                    \"lastStatus\": \"PENDING\",\n                                    \"containerInstanceArn\": \"arn:aws:ecs:us-east-1:<aws_account_id>:container-instance/default/ffe3d344-77e2-476c-a4d0-bf560ad50acb\",\n                                    \"desiredStatus\": \"RUNNING\",\n                                    \"taskDefinitionArn\": \"arn:aws:ecs:us-east-1:<aws_account_id>:task-definition/sleep360:1\",\n                                    \"containers\": [\n                                        {\n                                            \"containerArn\": \"arn:aws:ecs:us-east-1:<aws_account_id>:container/default/58591c8e-be29-4ddf-95aa-ee459d4c59fd\",\n                                            \"taskArn\": \"arn:aws:ecs:us-east-1:<aws_account_id>:task/default/a9f21ea7-c9f5-44b1-b8e6-b31f50ed33c0\",\n                                            \"lastStatus\": \"PENDING\",\n                                            \"name\": \"sleep\"\n                                        }\n                                    ]\n                                }\n                            ]\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ecs#RunTaskRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"capacityProviderStrategy\": {\n                    \"target\": \"com.amazonaws.ecs#CapacityProviderStrategy\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The capacity provider strategy to use for the task.</p>\\n         <p>If a <code>capacityProviderStrategy</code> is specified, the <code>launchType</code>\\n\\t\\t\\tparameter must be omitted. If no <code>capacityProviderStrategy</code> or\\n\\t\\t\\t\\t<code>launchType</code> is specified, the\\n\\t\\t\\t\\t<code>defaultCapacityProviderStrategy</code> for the cluster is used.</p>\\n         <p>When you use cluster auto scaling, you must specify\\n\\t\\t\\t\\t<code>capacityProviderStrategy</code> and not <code>launchType</code>. </p>\\n         <p>A capacity provider strategy can contain a maximum of 20 capacity providers.</p>\"\n                    }\n                },\n                \"cluster\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The short name or full Amazon Resource Name (ARN) of the cluster to run your task on.\\n\\t\\t\\tIf you do not specify a cluster, the default cluster is assumed.</p>\\n         <p>Each account receives a default cluster the first time you use the service, but you\\n\\t\\t\\tmay also create other clusters.</p>\"\n                    }\n                },\n                \"count\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedInteger\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of instantiations of the specified task to place on your cluster. You can\\n\\t\\t\\tspecify up to 10 tasks for each call.</p>\"\n                    }\n                },\n                \"enableECSManagedTags\": {\n                    \"target\": \"com.amazonaws.ecs#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Specifies whether to use Amazon ECS managed tags for the task. For more information, see\\n\\t\\t\\t\\t<a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-using-tags.html\\\">Tagging Your Amazon ECS\\n\\t\\t\\t\\tResources</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\"\n                    }\n                },\n                \"enableExecuteCommand\": {\n                    \"target\": \"com.amazonaws.ecs#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Determines whether to use the execute command functionality for the containers in this\\n\\t\\t\\ttask. If <code>true</code>, this enables execute command functionality on all containers\\n\\t\\t\\tin the task.</p>\\n         <p>If <code>true</code>, then the task definition must have a task role, or you must\\n\\t\\t\\tprovide one as an override.</p>\"\n                    }\n                },\n                \"group\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the task group to associate with the task. The default value is the family\\n\\t\\t\\tname of the task definition (for example, <code>family:my-family-name</code>).</p>\"\n                    }\n                },\n                \"launchType\": {\n                    \"target\": \"com.amazonaws.ecs#LaunchType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The infrastructure to run your standalone task on. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/launch_types.html\\\">Amazon ECS\\n\\t\\t\\t\\tlaunch types</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\\n         <p>The <code>FARGATE</code> launch type runs your tasks on Fargate On-Demand\\n\\t\\t\\tinfrastructure.</p>\\n         <note>\\n            <p>Fargate Spot infrastructure is available for use but a capacity provider\\n\\t\\t\\t\\tstrategy must be used. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/fargate-capacity-providers.html\\\">Fargate capacity providers</a> in the\\n\\t\\t\\t\\t\\t<i>Amazon ECS Developer Guide</i>.</p>\\n         </note>\\n         <p>The <code>EC2</code> launch type runs your tasks on Amazon EC2 instances registered to your\\n\\t\\t\\tcluster.</p>\\n         <p>The <code>EXTERNAL</code> launch type runs your tasks on your on-premises server or\\n\\t\\t\\tvirtual machine (VM) capacity registered to your cluster.</p>\\n         <p>A task can use either a launch type or a capacity provider strategy. If a\\n\\t\\t\\t\\t<code>launchType</code> is specified, the <code>capacityProviderStrategy</code>\\n\\t\\t\\tparameter must be omitted.</p>\\n         <p>When you use cluster auto scaling, you must specify\\n\\t\\t\\t\\t<code>capacityProviderStrategy</code> and not <code>launchType</code>. </p>\"\n                    }\n                },\n                \"networkConfiguration\": {\n                    \"target\": \"com.amazonaws.ecs#NetworkConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The network configuration for the task. This parameter is required for task\\n\\t\\t\\tdefinitions that use the <code>awsvpc</code> network mode to receive their own elastic\\n\\t\\t\\tnetwork interface, and it isn't supported for other network modes. For more information,\\n\\t\\t\\tsee <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-networking.html\\\">Task networking</a>\\n\\t\\t\\tin the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\"\n                    }\n                },\n                \"overrides\": {\n                    \"target\": \"com.amazonaws.ecs#TaskOverride\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of container overrides in JSON format that specify the name of a container in\\n\\t\\t\\tthe specified task definition and the overrides it should receive. You can override the\\n\\t\\t\\tdefault command for a container (that's specified in the task definition or Docker\\n\\t\\t\\timage) with a <code>command</code> override. You can also override existing environment\\n\\t\\t\\tvariables (that are specified in the task definition or Docker image) on a container or\\n\\t\\t\\tadd new environment variables to it with an <code>environment</code> override.</p>\\n         <p>A total of 8192 characters are allowed for overrides. This limit includes the JSON\\n\\t\\t\\tformatting characters of the override structure.</p>\"\n                    }\n                },\n                \"placementConstraints\": {\n                    \"target\": \"com.amazonaws.ecs#PlacementConstraints\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An array of placement constraint objects to use for the task. You can specify up to 10\\n\\t\\t\\tconstraints for each task (including constraints in the task definition and those\\n\\t\\t\\tspecified at runtime).</p>\"\n                    }\n                },\n                \"placementStrategy\": {\n                    \"target\": \"com.amazonaws.ecs#PlacementStrategies\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The placement strategy objects to use for the task. You can specify a maximum of 5\\n\\t\\t\\tstrategy rules for each task.</p>\"\n                    }\n                },\n                \"platformVersion\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The platform version the task uses. A platform version is only specified for tasks\\n\\t\\t\\thosted on Fargate. If one isn't specified, the <code>LATEST</code>\\n\\t\\t\\tplatform version is used. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/platform_versions.html\\\">Fargate platform\\n\\t\\t\\t\\tversions</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\"\n                    }\n                },\n                \"propagateTags\": {\n                    \"target\": \"com.amazonaws.ecs#PropagateTags\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies whether to propagate the tags from the task definition to the task. If no\\n\\t\\t\\tvalue is specified, the tags aren't propagated. Tags can only be propagated to the task\\n\\t\\t\\tduring task creation. To add tags to a task after task creation, use the<a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_TagResource.html\\\">TagResource</a> API action.</p>\\n         <note>\\n            <p>An error will be received if you specify the <code>SERVICE</code> option when\\n\\t\\t\\t\\trunning a task.</p>\\n         </note>\"\n                    }\n                },\n                \"referenceId\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>This parameter is only used by Amazon ECS. It is not intended for use by customers.</p>\"\n                    }\n                },\n                \"startedBy\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An optional tag specified when a task is started. For example, if you automatically\\n\\t\\t\\ttrigger a task to run a batch process job, you could apply a unique identifier for that\\n\\t\\t\\tjob to your task with the <code>startedBy</code> parameter. You can then identify which\\n\\t\\t\\ttasks belong to that job by filtering the results of a <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_ListTasks.html\\\">ListTasks</a> call with\\n\\t\\t\\tthe <code>startedBy</code> value. Up to 128 letters (uppercase and lowercase), numbers,\\n\\t\\t\\thyphens (-), forward slash (/), and underscores (_) are allowed.</p>\\n         <p>If a task is started by an Amazon ECS service, then the <code>startedBy</code> parameter\\n\\t\\t\\tcontains the deployment ID of the service that starts it.</p>\"\n                    }\n                },\n                \"tags\": {\n                    \"target\": \"com.amazonaws.ecs#Tags\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The metadata that you apply to the task to help you categorize and organize them. Each\\n\\t\\t\\ttag consists of a key and an optional value, both of which you define.</p>\\n         <p>The following basic restrictions apply to tags:</p>\\n         <ul>\\n            <li>\\n               <p>Maximum number of tags per resource - 50</p>\\n            </li>\\n            <li>\\n               <p>For each resource, each tag key must be unique, and each tag key can have only\\n                    one value.</p>\\n            </li>\\n            <li>\\n               <p>Maximum key length - 128 Unicode characters in UTF-8</p>\\n            </li>\\n            <li>\\n               <p>Maximum value length - 256 Unicode characters in UTF-8</p>\\n            </li>\\n            <li>\\n               <p>If your tagging schema is used across multiple services and resources,\\n                    remember that other services may have restrictions on allowed characters.\\n                    Generally allowed characters are: letters, numbers, and spaces representable in\\n                    UTF-8, and the following characters: + - = . _ : / @.</p>\\n            </li>\\n            <li>\\n               <p>Tag keys and values are case-sensitive.</p>\\n            </li>\\n            <li>\\n               <p>Do not use <code>aws:</code>, <code>AWS:</code>, or any upper or lowercase\\n                    combination of such as a prefix for either keys or values as it is reserved for\\n                    Amazon Web Services use. You cannot edit or delete tag keys or values with this prefix. Tags with\\n                    this prefix do not count against your tags per resource limit.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"taskDefinition\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>family</code> and <code>revision</code> (<code>family:revision</code>) or\\n\\t\\t\\tfull ARN of the task definition to run. If a <code>revision</code> isn't specified,\\n\\t\\t\\tthe latest <code>ACTIVE</code> revision is used.</p>\\n         <p>The full ARN value must match the value that you specified as the\\n\\t\\t\\t\\t<code>Resource</code> of the principal's permissions policy.</p>\\n         <p>When you specify a task definition, you must either specify a specific revision, or\\n\\t\\t\\tall revisions in the ARN.</p>\\n         <p>To specify a specific revision, include the revision number in the ARN. For example,\\n\\t\\t\\tto specify revision 2, use\\n\\t\\t\\t\\t<code>arn:aws:ecs:us-east-1:111122223333:task-definition/TaskFamilyName:2</code>.</p>\\n         <p>To specify all revisions, use the wildcard (*) in the ARN. For example, to specify\\n\\t\\t\\tall revisions, use\\n\\t\\t\\t\\t<code>arn:aws:ecs:us-east-1:111122223333:task-definition/TaskFamilyName:*</code>.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/security_iam_service-with-iam.html#security_iam_service-with-iam-id-based-policies-resources\\\">Policy Resources for Amazon ECS</a> in the Amazon Elastic Container Service Developer Guide.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"clientToken\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An identifier that you provide to ensure the idempotency of the request. It must be\\n\\t\\t\\tunique and is case sensitive. Up to 64 characters are allowed. The valid characters are\\n\\t\\t\\tcharacters in the range of 33-126, inclusive. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/ECS_Idempotency.html\\\">Ensuring idempotency</a>.</p>\",\n                        \"smithy.api#idempotencyToken\": {}\n                    }\n                },\n                \"volumeConfigurations\": {\n                    \"target\": \"com.amazonaws.ecs#TaskVolumeConfigurations\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The details of the volume that was <code>configuredAtLaunch</code>. You can configure\\n\\t\\t\\tthe size, volumeType, IOPS, throughput, snapshot and encryption in <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_TaskManagedEBSVolumeConfiguration.html\\\">TaskManagedEBSVolumeConfiguration</a>. The <code>name</code> of the volume must\\n\\t\\t\\tmatch the <code>name</code> from the task definition.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ecs#RunTaskResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"tasks\": {\n                    \"target\": \"com.amazonaws.ecs#Tasks\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A full description of the tasks that were run. The tasks that were successfully placed\\n\\t\\t\\ton your cluster are described here.</p>\"\n                    }\n                },\n                \"failures\": {\n                    \"target\": \"com.amazonaws.ecs#Failures\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Any failures associated with the call.</p>\\n         <p>For information about how to address failures, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-event-messages.html#service-event-messages-list\\\">Service event messages</a> and <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/api_failures_messages.html\\\">API failure\\n\\t\\t\\t\\treasons</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ecs#RuntimePlatform\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"cpuArchitecture\": {\n                    \"target\": \"com.amazonaws.ecs#CPUArchitecture\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The CPU architecture.</p>\\n         <p>You can run your Linux tasks on an ARM-based platform by setting the value to\\n\\t\\t\\t\\t<code>ARM64</code>. This option is available for tasks that run on Linux Amazon EC2\\n\\t\\t\\tinstance or Linux containers on Fargate.</p>\"\n                    }\n                },\n                \"operatingSystemFamily\": {\n                    \"target\": \"com.amazonaws.ecs#OSFamily\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The operating system.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about the platform for the Amazon ECS service or task.</p>\\n         <p>For more information about <code>RuntimePlatform</code>, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html#runtime-platform\\\">RuntimePlatform</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#Scale\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"value\": {\n                    \"target\": \"com.amazonaws.ecs#Double\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The value, specified as a percent total of a service's <code>desiredCount</code>, to\\n\\t\\t\\tscale the task set. Accepted values are numbers between 0 and 100.</p>\"\n                    }\n                },\n                \"unit\": {\n                    \"target\": \"com.amazonaws.ecs#ScaleUnit\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The unit of measure for the scale value.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A floating-point percentage of the desired number of tasks to place and keep running\\n\\t\\t\\tin the task set.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#ScaleUnit\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"PERCENT\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"PERCENT\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ecs#SchedulingStrategy\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"REPLICA\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"REPLICA\"\n                    }\n                },\n                \"DAEMON\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DAEMON\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ecs#Scope\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"TASK\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"task\"\n                    }\n                },\n                \"SHARED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"shared\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ecs#Secret\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"name\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the secret.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"valueFrom\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The secret to expose to the container. The supported values are either the full ARN\\n\\t\\t\\tof the Secrets Manager secret or the full ARN of the parameter in the SSM\\n\\t\\t\\tParameter Store.</p>\\n         <p>For information about the require Identity and Access Management permissions, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/specifying-sensitive-data-secrets.html#secrets-iam\\\">Required IAM permissions for Amazon ECS secrets</a> (for Secrets Manager) or\\n\\t\\t\\t\\t<a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/specifying-sensitive-data-parameters.html\\\">Required IAM permissions for Amazon ECS secrets</a> (for Systems Manager Parameter\\n\\t\\t\\tstore) in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\\n         <note>\\n            <p>If the SSM Parameter Store parameter exists in the same Region as the task\\n\\t\\t\\t\\tyou're launching, then you can use either the full ARN or name of the parameter.\\n\\t\\t\\t\\tIf the parameter exists in a different Region, then the full ARN must be\\n\\t\\t\\t\\tspecified.</p>\\n         </note>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>An object representing the secret to expose to your container. Secrets can be exposed\\n\\t\\t\\tto a container in the following ways:</p>\\n         <ul>\\n            <li>\\n               <p>To inject sensitive data into your containers as environment variables, use\\n\\t\\t\\t\\t\\tthe <code>secrets</code> container definition parameter.</p>\\n            </li>\\n            <li>\\n               <p>To reference sensitive information in the log configuration of a container,\\n\\t\\t\\t\\t\\tuse the <code>secretOptions</code> container definition parameter.</p>\\n            </li>\\n         </ul>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/specifying-sensitive-data.html\\\">Specifying\\n\\t\\t\\t\\tsensitive data</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#SecretList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#Secret\"\n            }\n        },\n        \"com.amazonaws.ecs#SensitiveString\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#sensitive\": {}\n            }\n        },\n        \"com.amazonaws.ecs#ServerException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> Message that describes the cause of the exception.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>These errors are usually caused by a server issue.</p>\",\n                \"smithy.api#error\": \"server\"\n            }\n        },\n        \"com.amazonaws.ecs#Service\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"serviceArn\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN that identifies the service. For more information about the ARN format,\\n\\t\\t\\tsee <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-account-settings.html#ecs-resource-ids\\\">Amazon Resource Name (ARN)</a> in the <i>Amazon ECS Developer Guide</i>.</p>\"\n                    }\n                },\n                \"serviceName\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of your service. Up to 255 letters (uppercase and lowercase), numbers, underscores, and hyphens are allowed. Service names must be unique within\\n\\t\\t\\ta cluster. However, you can have similarly named services in multiple clusters within a\\n\\t\\t\\tRegion or across multiple Regions.</p>\"\n                    }\n                },\n                \"clusterArn\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the cluster that hosts the service.</p>\"\n                    }\n                },\n                \"loadBalancers\": {\n                    \"target\": \"com.amazonaws.ecs#LoadBalancers\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of Elastic Load Balancing load balancer objects. It contains the load balancer name, the\\n\\t\\t\\tcontainer name, and the container port to access from the load balancer. The container\\n\\t\\t\\tname is as it appears in a container definition.</p>\"\n                    }\n                },\n                \"serviceRegistries\": {\n                    \"target\": \"com.amazonaws.ecs#ServiceRegistries\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The details for the service discovery registries to assign to this service. For more\\n\\t\\t\\tinformation, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-discovery.html\\\">Service\\n\\t\\t\\t\\tDiscovery</a>.</p>\"\n                    }\n                },\n                \"status\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The status of the service. The valid values are <code>ACTIVE</code>,\\n\\t\\t\\t\\t<code>DRAINING</code>, or <code>INACTIVE</code>.</p>\"\n                    }\n                },\n                \"desiredCount\": {\n                    \"target\": \"com.amazonaws.ecs#Integer\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The desired number of instantiations of the task definition to keep running on the\\n\\t\\t\\tservice. This value is specified when the service is created with <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_CreateService.html\\\">CreateService</a> , and it can be modified with <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_UpdateService.html\\\">UpdateService</a>.</p>\"\n                    }\n                },\n                \"runningCount\": {\n                    \"target\": \"com.amazonaws.ecs#Integer\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The number of tasks in the cluster that are in the <code>RUNNING</code> state.</p>\"\n                    }\n                },\n                \"pendingCount\": {\n                    \"target\": \"com.amazonaws.ecs#Integer\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The number of tasks in the cluster that are in the <code>PENDING</code> state.</p>\"\n                    }\n                },\n                \"launchType\": {\n                    \"target\": \"com.amazonaws.ecs#LaunchType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The launch type the service is using. When using the DescribeServices API, this field\\n\\t\\t\\tis omitted if the service was created using a capacity provider strategy.</p>\"\n                    }\n                },\n                \"capacityProviderStrategy\": {\n                    \"target\": \"com.amazonaws.ecs#CapacityProviderStrategy\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The capacity provider strategy the service uses. When using the DescribeServices API,\\n\\t\\t\\tthis field is omitted if the service was created using a launch type.</p>\"\n                    }\n                },\n                \"platformVersion\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The platform version to run your service on. A platform version is only specified for\\n\\t\\t\\ttasks that are hosted on Fargate. If one isn't specified, the <code>LATEST</code>\\n\\t\\t\\tplatform version is used. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/platform_versions.html\\\">Fargate Platform\\n\\t\\t\\t\\tVersions</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\"\n                    }\n                },\n                \"platformFamily\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The operating system that your tasks in the service run on. A platform family is\\n\\t\\t\\tspecified only for tasks using the Fargate launch type. </p>\\n         <p> All tasks that run as part of this service must use the same\\n\\t\\t\\t\\t<code>platformFamily</code> value as the service (for example,\\n\\t\\t\\t<code>LINUX</code>).</p>\"\n                    }\n                },\n                \"taskDefinition\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The task definition to use for tasks in the service. This value is specified when the\\n\\t\\t\\tservice is created with <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_CreateService.html\\\">CreateService</a>,\\n\\t\\t\\tand it can be modified with <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_UpdateService.html\\\">UpdateService</a>.</p>\"\n                    }\n                },\n                \"deploymentConfiguration\": {\n                    \"target\": \"com.amazonaws.ecs#DeploymentConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Optional deployment parameters that control how many tasks run during the deployment\\n\\t\\t\\tand the ordering of stopping and starting tasks.</p>\"\n                    }\n                },\n                \"taskSets\": {\n                    \"target\": \"com.amazonaws.ecs#TaskSets\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Information about a set of Amazon ECS tasks in either an CodeDeploy or an <code>EXTERNAL</code>\\n\\t\\t\\tdeployment. An Amazon ECS task set includes details such as the desired number of tasks, how\\n\\t\\t\\tmany tasks are running, and whether the task set serves production traffic.</p>\"\n                    }\n                },\n                \"deployments\": {\n                    \"target\": \"com.amazonaws.ecs#Deployments\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The current state of deployments for the service.</p>\"\n                    }\n                },\n                \"roleArn\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the IAM role that's associated with the service. It allows the Amazon ECS\\n\\t\\t\\tcontainer agent to register container instances with an Elastic Load Balancing load balancer.</p>\"\n                    }\n                },\n                \"events\": {\n                    \"target\": \"com.amazonaws.ecs#ServiceEvents\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The event stream for your service. A maximum of 100 of the latest events are\\n\\t\\t\\tdisplayed.</p>\"\n                    }\n                },\n                \"createdAt\": {\n                    \"target\": \"com.amazonaws.ecs#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Unix timestamp for the time when the service was created.</p>\"\n                    }\n                },\n                \"placementConstraints\": {\n                    \"target\": \"com.amazonaws.ecs#PlacementConstraints\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The placement constraints for the tasks in the service.</p>\"\n                    }\n                },\n                \"placementStrategy\": {\n                    \"target\": \"com.amazonaws.ecs#PlacementStrategies\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The placement strategy that determines how tasks for the service are placed.</p>\"\n                    }\n                },\n                \"networkConfiguration\": {\n                    \"target\": \"com.amazonaws.ecs#NetworkConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The VPC subnet and security group configuration for tasks that receive their own\\n            elastic network interface by using the <code>awsvpc</code> networking mode.</p>\"\n                    }\n                },\n                \"healthCheckGracePeriodSeconds\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedInteger\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The period of time, in seconds, that the Amazon ECS service scheduler ignores unhealthy\\n\\t\\t\\tElastic Load Balancing, VPC Lattice, and container health checks after a task has first started.</p>\\n         <p>If your service has more running tasks than desired, unhealthy tasks in the grace period might be stopped to reach the desired count.</p>\"\n                    }\n                },\n                \"schedulingStrategy\": {\n                    \"target\": \"com.amazonaws.ecs#SchedulingStrategy\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The scheduling strategy to use for the service. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs_services.html\\\">Services</a>.</p>\\n         <p>There are two service scheduler strategies available.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>REPLICA</code>-The replica scheduling strategy places and\\n\\t\\t\\t\\t\\tmaintains the desired number of tasks across your cluster. By default, the\\n\\t\\t\\t\\t\\tservice scheduler spreads tasks across Availability Zones. You can use task\\n\\t\\t\\t\\t\\tplacement strategies and constraints to customize task placement\\n\\t\\t\\t\\t\\tdecisions.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>DAEMON</code>-The daemon scheduling strategy deploys exactly one\\n\\t\\t\\t\\t\\ttask on each active container instance. This task meets all of the task\\n\\t\\t\\t\\t\\tplacement constraints that you specify in your cluster. The service scheduler\\n\\t\\t\\t\\t\\talso evaluates the task placement constraints for running tasks. It stop tasks\\n\\t\\t\\t\\t\\tthat don't meet the placement constraints.</p>\\n               <note>\\n                  <p>Fargate tasks don't support the <code>DAEMON</code>\\n\\t\\t\\t\\t\\t\\tscheduling strategy.</p>\\n               </note>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"deploymentController\": {\n                    \"target\": \"com.amazonaws.ecs#DeploymentController\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The deployment controller type the service is using. </p>\"\n                    }\n                },\n                \"tags\": {\n                    \"target\": \"com.amazonaws.ecs#Tags\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The metadata that you apply to the service to help you categorize and organize them.\\n\\t\\t\\tEach tag consists of a key and an optional value. You define bot the key and\\n\\t\\t\\tvalue.</p>\\n         <p>The following basic restrictions apply to tags:</p>\\n         <ul>\\n            <li>\\n               <p>Maximum number of tags per resource - 50</p>\\n            </li>\\n            <li>\\n               <p>For each resource, each tag key must be unique, and each tag key can have only\\n                    one value.</p>\\n            </li>\\n            <li>\\n               <p>Maximum key length - 128 Unicode characters in UTF-8</p>\\n            </li>\\n            <li>\\n               <p>Maximum value length - 256 Unicode characters in UTF-8</p>\\n            </li>\\n            <li>\\n               <p>If your tagging schema is used across multiple services and resources,\\n                    remember that other services may have restrictions on allowed characters.\\n                    Generally allowed characters are: letters, numbers, and spaces representable in\\n                    UTF-8, and the following characters: + - = . _ : / @.</p>\\n            </li>\\n            <li>\\n               <p>Tag keys and values are case-sensitive.</p>\\n            </li>\\n            <li>\\n               <p>Do not use <code>aws:</code>, <code>AWS:</code>, or any upper or lowercase\\n                    combination of such as a prefix for either keys or values as it is reserved for\\n                    Amazon Web Services use. You cannot edit or delete tag keys or values with this prefix. Tags with\\n                    this prefix do not count against your tags per resource limit.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"createdBy\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The principal that created the service.</p>\"\n                    }\n                },\n                \"enableECSManagedTags\": {\n                    \"target\": \"com.amazonaws.ecs#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Determines whether to use Amazon ECS managed tags for the tasks in the service. For more\\n\\t\\t\\tinformation, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-using-tags.html\\\">Tagging Your Amazon ECS\\n\\t\\t\\t\\tResources</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\"\n                    }\n                },\n                \"propagateTags\": {\n                    \"target\": \"com.amazonaws.ecs#PropagateTags\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Determines whether to propagate the tags from the task definition or the service to\\n\\t\\t\\tthe task. If no value is specified, the tags aren't propagated.</p>\"\n                    }\n                },\n                \"enableExecuteCommand\": {\n                    \"target\": \"com.amazonaws.ecs#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Determines whether the execute command functionality is turned on for the service. If\\n\\t\\t\\t\\t<code>true</code>, the execute command functionality is turned on for all containers\\n\\t\\t\\tin tasks as part of the service.</p>\"\n                    }\n                },\n                \"availabilityZoneRebalancing\": {\n                    \"target\": \"com.amazonaws.ecs#AvailabilityZoneRebalancing\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether to use Availability Zone rebalancing for the service.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-rebalancing.html\\\">Balancing an Amazon ECS service across Availability Zones</a> in\\n\\t\\t\\tthe <i>\\n               <i>Amazon Elastic Container Service Developer Guide</i>\\n            </i>.</p>\\n         <p>The default behavior of <code>AvailabilityZoneRebalancing</code> differs between create and update requests:</p>\\n         <ul>\\n            <li>\\n               <p>For create service requests, when no value is specified for <code>AvailabilityZoneRebalancing</code>, Amazon ECS defaults the value to <code>ENABLED</code>.</p>\\n            </li>\\n            <li>\\n               <p>For update service requests, when no value is specified for <code>AvailabilityZoneRebalancing</code>, Amazon ECS defaults to the existing service’s <code>AvailabilityZoneRebalancing</code> value. If the service never had an <code>AvailabilityZoneRebalancing</code> value set, Amazon ECS treats this as <code>DISABLED</code>.</p>\\n            </li>\\n         </ul>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Details on a service within a cluster.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#ServiceConnectClientAlias\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"port\": {\n                    \"target\": \"com.amazonaws.ecs#PortNumber\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The listening port number for the Service Connect proxy. This port is available\\n\\t\\t\\tinside of all of the tasks within the same namespace.</p>\\n         <p>To avoid changing your applications in client Amazon ECS services, set this to the same\\n\\t\\t\\tport that the client application uses by default. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-connect.html\\\">Service Connect</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"dnsName\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>dnsName</code> is the name that you use in the applications of client tasks\\n\\t\\t\\tto connect to this service. The name must be a valid DNS name but doesn't need to be\\n\\t\\t\\tfully-qualified. The name can include up to 127 characters. The name can include\\n\\t\\t\\tlowercase letters, numbers, underscores (_), hyphens (-), and periods (.). The name\\n\\t\\t\\tcan't start with a hyphen.</p>\\n         <p>If this parameter isn't specified, the default value of <code>discoveryName.namespace</code> is used. If the <code>discoveryName</code> isn't specified, the port mapping name from the task definition is used in <code>portName.namespace</code>.</p>\\n         <p>To avoid changing your applications in client Amazon ECS services, set this to the same\\n\\t\\t\\tname that the client application uses by default. For example, a few common names are\\n\\t\\t\\t\\t<code>database</code>, <code>db</code>, or the lowercase name of a database, such as\\n\\t\\t\\t\\t<code>mysql</code> or <code>redis</code>. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-connect.html\\\">Service Connect</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\"\n                    }\n                },\n                \"testTrafficRules\": {\n                    \"target\": \"com.amazonaws.ecs#ServiceConnectTestTrafficRules\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The configuration for test traffic routing rules used during blue/green deployments with Amazon ECS Service Connect. This allows you to route a portion of traffic to the new service revision of your service for testing before shifting all production traffic.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Each alias (\\\"endpoint\\\") is a fully-qualified name and port number that other tasks\\n\\t\\t\\t(\\\"clients\\\") can use to connect to this service.</p>\\n         <p>Each name and port mapping must be unique within the namespace.</p>\\n         <p>Tasks that run in a namespace can use short names to connect\\n\\tto services in the namespace. Tasks can connect to services across all of the clusters in the namespace.\\n\\tTasks connect through a managed proxy container\\n\\tthat collects logs and metrics for increased visibility.\\n\\tOnly the tasks that Amazon ECS services create are supported with Service Connect.\\n\\tFor more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-connect.html\\\">Service Connect</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#ServiceConnectClientAliasList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#ServiceConnectClientAlias\"\n            }\n        },\n        \"com.amazonaws.ecs#ServiceConnectConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"enabled\": {\n                    \"target\": \"com.amazonaws.ecs#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Specifies whether to use Service Connect with this service.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"namespace\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The namespace name or full Amazon Resource Name (ARN) of the Cloud Map namespace for use with Service Connect. The namespace must be in\\n\\t\\t\\tthe same Amazon Web Services Region as the Amazon ECS service and cluster. The type of namespace doesn't\\n\\t\\t\\taffect Service Connect. For more information about Cloud Map, see <a href=\\\"https://docs.aws.amazon.com/cloud-map/latest/dg/working-with-services.html\\\">Working\\n\\t\\t\\t\\twith Services</a> in the <i>Cloud Map Developer Guide</i>.</p>\"\n                    }\n                },\n                \"services\": {\n                    \"target\": \"com.amazonaws.ecs#ServiceConnectServiceList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The list of Service Connect service objects. These are names and aliases (also known\\n\\t\\t\\tas endpoints) that are used by other Amazon ECS services to connect to this service.\\n\\t\\t\\t</p>\\n         <p>This field is not required for a \\\"client\\\" Amazon ECS service that's a member of a namespace\\n\\t\\t\\tonly to connect to other services within the namespace. An example of this would be a\\n\\t\\t\\tfrontend application that accepts incoming requests from either a load balancer that's\\n\\t\\t\\tattached to the service or by other means.</p>\\n         <p>An object selects a port from the task definition, assigns a name for the Cloud Map\\n\\t\\t\\tservice, and a list of aliases (endpoints) and ports for client applications to refer to\\n\\t\\t\\tthis service.</p>\"\n                    }\n                },\n                \"logConfiguration\": {\n                    \"target\": \"com.amazonaws.ecs#LogConfiguration\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The Service Connect configuration of your Amazon ECS service. The configuration for this\\n\\t\\t\\tservice to discover and connect to services, and be discovered by, and connected from,\\n\\t\\t\\tother services within a namespace.</p>\\n         <p>Tasks that run in a namespace can use short names to connect\\n\\tto services in the namespace. Tasks can connect to services across all of the clusters in the namespace.\\n\\tTasks connect through a managed proxy container\\n\\tthat collects logs and metrics for increased visibility.\\n\\tOnly the tasks that Amazon ECS services create are supported with Service Connect.\\n\\tFor more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-connect.html\\\">Service Connect</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#ServiceConnectService\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"portName\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>portName</code> must match the name of one of the <code>portMappings</code>\\n\\t\\t\\tfrom all the containers in the task definition of this Amazon ECS service.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"discoveryName\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>discoveryName</code> is the name of the new Cloud Map service that Amazon ECS creates\\n\\t\\t\\tfor this Amazon ECS service. This must be unique within the Cloud Map namespace. The name can contain up to 64 characters. The name can include lowercase letters,\\n\\t\\t\\tnumbers, underscores (_), and hyphens (-). The name can't start with a hyphen.</p>\\n         <p>If the <code>discoveryName</code> isn't specified, the port mapping name from the task definition is used in <code>portName.namespace</code>.</p>\"\n                    }\n                },\n                \"clientAliases\": {\n                    \"target\": \"com.amazonaws.ecs#ServiceConnectClientAliasList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The list of client aliases for this Service Connect service. You use these to assign\\n\\t\\t\\tnames that can be used by client applications. The maximum number of client aliases that\\n\\t\\t\\tyou can have in this list is 1.</p>\\n         <p>Each alias (\\\"endpoint\\\") is a fully-qualified name and port number that other Amazon ECS\\n\\t\\t\\ttasks (\\\"clients\\\") can use to connect to this service.</p>\\n         <p>Each name and port mapping must be unique within the namespace.</p>\\n         <p>For each <code>ServiceConnectService</code>, you must provide at least one\\n\\t\\t\\t\\t<code>clientAlias</code> with one <code>port</code>.</p>\"\n                    }\n                },\n                \"ingressPortOverride\": {\n                    \"target\": \"com.amazonaws.ecs#PortNumber\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The port number for the Service Connect proxy to listen on.</p>\\n         <p>Use the value of this field to bypass the proxy for traffic on the port number\\n\\t\\t\\tspecified in the named <code>portMapping</code> in the task definition of this\\n\\t\\t\\tapplication, and then use it in your VPC security groups to allow traffic into the proxy\\n\\t\\t\\tfor this Amazon ECS service.</p>\\n         <p>In <code>awsvpc</code> mode and Fargate, the default value is the container port\\n\\t\\t\\tnumber. The container port number is in the <code>portMapping</code> in the task\\n\\t\\t\\tdefinition. In bridge mode, the default value is the ephemeral port of the\\n\\t\\t\\tService Connect proxy.</p>\"\n                    }\n                },\n                \"timeout\": {\n                    \"target\": \"com.amazonaws.ecs#TimeoutConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A reference to an object that represents the configured timeouts for\\n\\t\\t\\tService Connect.</p>\"\n                    }\n                },\n                \"tls\": {\n                    \"target\": \"com.amazonaws.ecs#ServiceConnectTlsConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A reference to an object that represents a Transport Layer Security (TLS)\\n\\t\\t\\tconfiguration.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The Service Connect service object configuration. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-connect.html\\\">Service Connect</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#ServiceConnectServiceList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#ServiceConnectService\"\n            }\n        },\n        \"com.amazonaws.ecs#ServiceConnectServiceResource\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"discoveryName\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The discovery name of this Service Connect resource.</p>\\n         <p>The <code>discoveryName</code> is the name of the new Cloud Map service that Amazon ECS creates\\n\\t\\t\\tfor this Amazon ECS service. This must be unique within the Cloud Map namespace. The name can contain up to 64 characters. The name can include lowercase letters,\\n\\t\\t\\tnumbers, underscores (_), and hyphens (-). The name can't start with a hyphen.</p>\\n         <p>If the <code>discoveryName</code> isn't specified, the port mapping name from the task definition is used in <code>portName.namespace</code>.</p>\"\n                    }\n                },\n                \"discoveryArn\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) for the service in Cloud Map that matches the discovery name for this\\n\\t\\t\\tService Connect resource. You can use this ARN in other integrations with Cloud Map.\\n\\t\\t\\tHowever, Service Connect can't ensure connectivity outside of Amazon ECS.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The Service Connect resource. Each configuration maps a discovery name to a\\n\\t\\t\\tCloud Map service name. The data is stored in Cloud Map as part of the\\n\\t\\t\\tService Connect configuration for each discovery name of this Amazon ECS service.</p>\\n         <p>A task can resolve the <code>dnsName</code> for each of the <code>clientAliases</code>\\n\\t\\t\\tof a service. However a task can't resolve the discovery names. If you want to connect\\n\\t\\t\\tto a service, refer to the <code>ServiceConnectConfiguration</code> of that service for\\n\\t\\t\\tthe list of <code>clientAliases</code> that you can use.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#ServiceConnectServiceResourceList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#ServiceConnectServiceResource\"\n            }\n        },\n        \"com.amazonaws.ecs#ServiceConnectTestTrafficHeaderMatchRules\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"exact\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The exact value that the HTTP header must match for the test traffic routing rule to apply. This provides precise control over which requests are routed to the new service revision during blue/green deployments.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The header matching rules for test traffic routing in Amazon ECS blue/green deployments.\\n         These rules determine how incoming requests are matched based on HTTP headers to route test\\n         traffic to the new service revision.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#ServiceConnectTestTrafficHeaderRules\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"name\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the HTTP header to examine for test traffic routing. Common examples include custom headers like <code>X-Test-Version</code> or <code>X-Canary-Request</code> that can be used to identify test traffic.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"value\": {\n                    \"target\": \"com.amazonaws.ecs#ServiceConnectTestTrafficHeaderMatchRules\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The header value matching configuration that determines how the HTTP header value is evaluated for test traffic routing decisions.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The HTTP header rules used to identify and route test traffic during Amazon ECS blue/green\\n         deployments. These rules specify which HTTP headers to examine and what values to match for\\n         routing decisions.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-connect-blue-green.html\\\">Service Connect for Amazon ECS blue/green deployments</a> in the <i>\\n               Amazon Elastic Container Service Developer Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#ServiceConnectTestTrafficRules\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"header\": {\n                    \"target\": \"com.amazonaws.ecs#ServiceConnectTestTrafficHeaderRules\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The HTTP header-based routing rules that determine which requests should be routed to the new service version during blue/green deployment testing. These rules provide fine-grained control over test traffic routing based on request headers.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The test traffic routing configuration for Amazon ECS blue/green deployments. This\\n         configuration allows you to define rules for routing specific traffic to the new service\\n         revision during the deployment process, allowing for safe testing before full production\\n         traffic shift.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-connect-blue-green.html\\\">Service Connect for Amazon ECS blue/green deployments</a> in the <i>\\n               Amazon Elastic Container Service Developer Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#ServiceConnectTlsCertificateAuthority\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"awsPcaAuthorityArn\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the Amazon Web Services Private Certificate Authority certificate.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The certificate root authority that secures your service.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#ServiceConnectTlsConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"issuerCertificateAuthority\": {\n                    \"target\": \"com.amazonaws.ecs#ServiceConnectTlsCertificateAuthority\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The signer certificate authority.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"kmsKey\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services Key Management Service key.</p>\"\n                    }\n                },\n                \"roleArn\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the IAM role that's associated with the Service Connect TLS.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The key that encrypts and decrypts your resources for Service Connect TLS.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#ServiceDeployment\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"serviceDeploymentArn\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the service deployment.</p>\"\n                    }\n                },\n                \"serviceArn\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the service for this service deployment.</p>\"\n                    }\n                },\n                \"clusterArn\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the cluster that hosts the service.</p>\"\n                    }\n                },\n                \"createdAt\": {\n                    \"target\": \"com.amazonaws.ecs#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time the service deployment was created. The format is yyyy-MM-dd\\n\\t\\t\\tHH:mm:ss.SSSSSS.</p>\"\n                    }\n                },\n                \"startedAt\": {\n                    \"target\": \"com.amazonaws.ecs#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time the service deployment statred. The format is yyyy-MM-dd\\n\\t\\t\\tHH:mm:ss.SSSSSS.</p>\"\n                    }\n                },\n                \"finishedAt\": {\n                    \"target\": \"com.amazonaws.ecs#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time the service deployment finished. The format is yyyy-MM-dd\\n\\t\\t\\tHH:mm:ss.SSSSSS.</p>\"\n                    }\n                },\n                \"stoppedAt\": {\n                    \"target\": \"com.amazonaws.ecs#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time the service deployment stopped. The format is yyyy-MM-dd\\n\\t\\t\\tHH:mm:ss.SSSSSS.</p>\\n         <p>The service deployment stops when any of the following actions happen:</p>\\n         <ul>\\n            <li>\\n               <p>A user manually stops the deployment</p>\\n            </li>\\n            <li>\\n               <p>The rollback option is not in use for the failure detection mechanism (the\\n\\t\\t\\t\\t\\tcircuit breaker or alarm-based) and the service fails.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"updatedAt\": {\n                    \"target\": \"com.amazonaws.ecs#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time that the service deployment was last updated. The format is yyyy-MM-dd\\n\\t\\t\\tHH:mm:ss.SSSSSS.</p>\"\n                    }\n                },\n                \"sourceServiceRevisions\": {\n                    \"target\": \"com.amazonaws.ecs#ServiceRevisionsSummaryList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The currently deployed workload configuration.</p>\"\n                    }\n                },\n                \"targetServiceRevision\": {\n                    \"target\": \"com.amazonaws.ecs#ServiceRevisionSummary\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The workload configuration being deployed.</p>\"\n                    }\n                },\n                \"status\": {\n                    \"target\": \"com.amazonaws.ecs#ServiceDeploymentStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The service deployment state.</p>\"\n                    }\n                },\n                \"statusReason\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Information about why the service deployment is in the current status. For example,\\n\\t\\t\\tthe circuit breaker detected a failure.</p>\"\n                    }\n                },\n                \"lifecycleStage\": {\n                    \"target\": \"com.amazonaws.ecs#ServiceDeploymentLifecycleStage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The current lifecycle stage of the deployment. Possible values include:</p>\\n         <ul>\\n            <li>\\n               <p>RECONCILE_SERVICE</p>\\n               <p>The reconciliation stage that only happens when you start a new service deployment with more than 1 service revision in an ACTIVE state.</p>\\n            </li>\\n            <li>\\n               <p>PRE_SCALE_UP</p>\\n               <p>The green service revision has not started. The blue service revision is handling 100% of the production traffic. There is no test traffic.</p>\\n            </li>\\n            <li>\\n               <p>SCALE_UP</p>\\n               <p>The stage when the green service revision scales up to 100% and launches new tasks. The green service revision is not serving any traffic at this point.</p>\\n            </li>\\n            <li>\\n               <p>POST_SCALE_UP</p>\\n               <p>The green service revision has started. The blue service revision is handling 100% of the production traffic. There is no test traffic.</p>\\n            </li>\\n            <li>\\n               <p>TEST_TRAFFIC_SHIFT</p>\\n               <p>The blue and green service revisions are running. The blue service revision handles 100% of the production traffic. The green service revision is migrating from 0% to 100% of test traffic.</p>\\n            </li>\\n            <li>\\n               <p>POST_TEST_TRAFFIC_SHIFT</p>\\n               <p>The test traffic shift is complete. The green service revision handles 100% of the test traffic.</p>\\n            </li>\\n            <li>\\n               <p>PRODUCTION_TRAFFIC_SHIFT</p>\\n               <p>Production traffic is shifting to the green service revision. The green service revision is migrating from 0% to 100% of production traffic.</p>\\n            </li>\\n            <li>\\n               <p>POST_PRODUCTION_TRAFFIC_SHIFT</p>\\n               <p>The production traffic shift is complete.</p>\\n            </li>\\n            <li>\\n               <p>BAKE_TIME</p>\\n               <p>The stage when both blue and green service revisions are running simultaneously after the production traffic has shifted.</p>\\n            </li>\\n            <li>\\n               <p>CLEAN_UP</p>\\n               <p>The stage when the blue service revision has completely scaled down to 0 running tasks. The green service revision is now the production service revision after this stage.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"deploymentConfiguration\": {\n                    \"target\": \"com.amazonaws.ecs#DeploymentConfiguration\"\n                },\n                \"rollback\": {\n                    \"target\": \"com.amazonaws.ecs#Rollback\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The rollback options the service deployment uses when the deployment fails.</p>\"\n                    }\n                },\n                \"deploymentCircuitBreaker\": {\n                    \"target\": \"com.amazonaws.ecs#ServiceDeploymentCircuitBreaker\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The circuit breaker configuration that determines a service deployment failed.</p>\"\n                    }\n                },\n                \"alarms\": {\n                    \"target\": \"com.amazonaws.ecs#ServiceDeploymentAlarms\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The CloudWatch alarms that determine when a service deployment fails.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about the service deployment.</p>\\n         <p>Service deployments provide a comprehensive view of your deployments. For information\\n\\t\\t\\tabout service deployments, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-deployment.html\\\">View service history using Amazon ECS service deployments</a> in the\\n\\t\\t\\t<i>\\n               <i>Amazon Elastic Container Service Developer Guide</i>\\n            </i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#ServiceDeploymentAlarms\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"status\": {\n                    \"target\": \"com.amazonaws.ecs#ServiceDeploymentRollbackMonitorsStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The status of the alarms check. Amazon ECS is not using alarms for service deployment\\n\\t\\t\\tfailures when the status is <code>DISABLED</code>.</p>\"\n                    }\n                },\n                \"alarmNames\": {\n                    \"target\": \"com.amazonaws.ecs#StringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the CloudWatch alarms that determine when a service deployment failed. A\\n\\t\\t\\t\\\",\\\" separates the alarms.</p>\"\n                    }\n                },\n                \"triggeredAlarmNames\": {\n                    \"target\": \"com.amazonaws.ecs#StringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more CloudWatch alarm names that have been triggered during the service\\n\\t\\t\\tdeployment. A \\\",\\\" separates the alarm names.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The CloudWatch alarms used to determine a service deployment failed. </p>\\n         <p>Amazon ECS considers the service deployment as failed when any of the alarms move to\\n\\t\\t\\tthe <code>ALARM</code> state. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/deployment-alarm-failure.html\\\">How CloudWatch\\n\\t\\t\\t\\talarms detect Amazon ECS deployment failures</a> in the Amazon ECS Developer\\n\\t\\t\\tGuide.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#ServiceDeploymentBrief\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"serviceDeploymentArn\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the service deployment.</p>\"\n                    }\n                },\n                \"serviceArn\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the service for this service deployment.</p>\"\n                    }\n                },\n                \"clusterArn\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the cluster that hosts the service.</p>\"\n                    }\n                },\n                \"startedAt\": {\n                    \"target\": \"com.amazonaws.ecs#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time that the service deployment statred. The format is yyyy-MM-dd\\n\\t\\t\\tHH:mm:ss.SSSSSS.</p>\"\n                    }\n                },\n                \"createdAt\": {\n                    \"target\": \"com.amazonaws.ecs#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time that the service deployment was created. The format is yyyy-MM-dd\\n\\t\\t\\tHH:mm:ss.SSSSSS.</p>\"\n                    }\n                },\n                \"finishedAt\": {\n                    \"target\": \"com.amazonaws.ecs#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time that the service deployment completed. The format is yyyy-MM-dd\\n\\t\\t\\tHH:mm:ss.SSSSSS.</p>\"\n                    }\n                },\n                \"targetServiceRevisionArn\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the service revision being deplyed.</p>\"\n                    }\n                },\n                \"status\": {\n                    \"target\": \"com.amazonaws.ecs#ServiceDeploymentStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The status of the service deployment</p>\"\n                    }\n                },\n                \"statusReason\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Information about why the service deployment is in the current status. For example,\\n\\t\\t\\tthe circuit breaker detected a deployment failure.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The service deployment properties that are retured when you call\\n\\t\\t\\t\\t<code>ListServiceDeployments</code>.</p>\\n         <p>This provides a high-level overview of the service deployment. </p>\"\n            }\n        },\n        \"com.amazonaws.ecs#ServiceDeploymentCircuitBreaker\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"status\": {\n                    \"target\": \"com.amazonaws.ecs#ServiceDeploymentRollbackMonitorsStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The circuit breaker status. Amazon ECS is not using the circuit breaker for service\\n\\t\\t\\tdeployment failures when the status is <code>DISABLED</code>.</p>\"\n                    }\n                },\n                \"failureCount\": {\n                    \"target\": \"com.amazonaws.ecs#Integer\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The number of times the circuit breaker detected a service deploymeny failure.</p>\"\n                    }\n                },\n                \"threshold\": {\n                    \"target\": \"com.amazonaws.ecs#Integer\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The threshhold which determines that the service deployment failed.</p>\\n         <p>The deployment circuit breaker calculates the threshold value, and then uses the value\\n\\t\\t\\tto determine when to move the deployment to a FAILED state. The deployment circuit\\n\\t\\t\\tbreaker has a minimum threshold of 3 and a maximum threshold of 200. and uses the values\\n\\t\\t\\tin the following formula to determine the deployment failure.</p>\\n         <p>\\n            <code>0.5 * desired task count</code>\\n         </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about the circuit breaker used to determine when a service deployment has\\n\\t\\t\\tfailed.</p>\\n         <p>The deployment circuit breaker is the rolling update mechanism that determines if the\\n\\t\\t\\ttasks reach a steady state. The deployment circuit breaker has an option that will\\n\\t\\t\\tautomatically roll back a failed deployment to the last cpompleted service revision. For\\n\\t\\t\\tmore information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/deployment-circuit-breaker.html\\\">How the Amazon\\n\\t\\t\\t\\tECS deployment circuit breaker detects failures</a> in the<i> Amazon ECS\\n\\t\\t\\t\\tDeveloper Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#ServiceDeploymentLifecycleStage\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"RECONCILE_SERVICE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"RECONCILE_SERVICE\"\n                    }\n                },\n                \"PRE_SCALE_UP\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"PRE_SCALE_UP\"\n                    }\n                },\n                \"SCALE_UP\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"SCALE_UP\"\n                    }\n                },\n                \"POST_SCALE_UP\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"POST_SCALE_UP\"\n                    }\n                },\n                \"TEST_TRAFFIC_SHIFT\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"TEST_TRAFFIC_SHIFT\"\n                    }\n                },\n                \"POST_TEST_TRAFFIC_SHIFT\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"POST_TEST_TRAFFIC_SHIFT\"\n                    }\n                },\n                \"PRODUCTION_TRAFFIC_SHIFT\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"PRODUCTION_TRAFFIC_SHIFT\"\n                    }\n                },\n                \"POST_PRODUCTION_TRAFFIC_SHIFT\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"POST_PRODUCTION_TRAFFIC_SHIFT\"\n                    }\n                },\n                \"BAKE_TIME\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"BAKE_TIME\"\n                    }\n                },\n                \"CLEAN_UP\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"CLEAN_UP\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ecs#ServiceDeploymentNotFoundException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> Message that describes the cause of the exception.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The service deploy ARN that you specified in the <code>StopServiceDeployment</code> doesn't exist. You can use <code>ListServiceDeployments</code> to retrieve the service deployment ARNs.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.ecs#ServiceDeploymentRollbackMonitorsStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"TRIGGERED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"TRIGGERED\"\n                    }\n                },\n                \"MONITORING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"MONITORING\"\n                    }\n                },\n                \"MONITORING_COMPLETE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"MONITORING_COMPLETE\"\n                    }\n                },\n                \"DISABLED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DISABLED\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ecs#ServiceDeploymentStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"PENDING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"PENDING\"\n                    }\n                },\n                \"SUCCESSFUL\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"SUCCESSFUL\"\n                    }\n                },\n                \"STOPPED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"STOPPED\"\n                    }\n                },\n                \"STOP_REQUESTED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"STOP_REQUESTED\"\n                    }\n                },\n                \"IN_PROGRESS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"IN_PROGRESS\"\n                    }\n                },\n                \"ROLLBACK_REQUESTED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ROLLBACK_REQUESTED\"\n                    }\n                },\n                \"ROLLBACK_IN_PROGRESS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ROLLBACK_IN_PROGRESS\"\n                    }\n                },\n                \"ROLLBACK_SUCCESSFUL\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ROLLBACK_SUCCESSFUL\"\n                    }\n                },\n                \"ROLLBACK_FAILED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ROLLBACK_FAILED\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ecs#ServiceDeploymentStatusList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#ServiceDeploymentStatus\"\n            }\n        },\n        \"com.amazonaws.ecs#ServiceDeployments\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#ServiceDeployment\"\n            }\n        },\n        \"com.amazonaws.ecs#ServiceDeploymentsBrief\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#ServiceDeploymentBrief\"\n            }\n        },\n        \"com.amazonaws.ecs#ServiceEvent\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"id\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID string for the event.</p>\"\n                    }\n                },\n                \"createdAt\": {\n                    \"target\": \"com.amazonaws.ecs#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Unix timestamp for the time when the event was triggered.</p>\"\n                    }\n                },\n                \"message\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The event message.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The details for an event that's associated with a service.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#ServiceEvents\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#ServiceEvent\"\n            }\n        },\n        \"com.amazonaws.ecs#ServiceField\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"TAGS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"TAGS\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ecs#ServiceFieldList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#ServiceField\"\n            }\n        },\n        \"com.amazonaws.ecs#ServiceManagedEBSVolumeConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"encrypted\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedBoolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether the volume should be encrypted. If you turn on Region-level Amazon EBS\\n\\t\\t\\tencryption by default but set this value as <code>false</code>, the setting is\\n\\t\\t\\toverridden and the volume is encrypted with the KMS key specified for Amazon EBS encryption\\n\\t\\t\\tby default. This parameter maps 1:1 with the <code>Encrypted</code> parameter of the\\n\\t\\t\\t\\t<a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateVolume.html\\\">CreateVolume API</a> in the <i>Amazon EC2 API Reference</i>.</p>\"\n                    }\n                },\n                \"kmsKeyId\": {\n                    \"target\": \"com.amazonaws.ecs#EBSKMSKeyId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) identifier of the Amazon Web Services Key Management Service key to use for Amazon EBS encryption. When a key\\n\\t\\t\\tis specified using this parameter, it overrides Amazon EBS default encryption or any KMS key\\n\\t\\t\\tthat you specified for cluster-level managed storage encryption. This parameter maps 1:1\\n\\t\\t\\twith the <code>KmsKeyId</code> parameter of the <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateVolume.html\\\">CreateVolume API</a> in\\n\\t\\t\\tthe <i>Amazon EC2 API Reference</i>. For more information about encrypting\\n\\t\\t\\tAmazon EBS volumes attached to tasks, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ebs-kms-encryption.html\\\">Encrypt data stored in Amazon EBS volumes attached to Amazon ECS tasks</a>.</p>\\n         <important>\\n            <p>Amazon Web Services authenticates the Amazon Web Services Key Management Service key asynchronously. Therefore, if you specify an\\n\\t\\t\\t\\tID, alias, or ARN that is invalid, the action can appear to complete, but\\n\\t\\t\\t\\teventually fails.</p>\\n         </important>\"\n                    }\n                },\n                \"volumeType\": {\n                    \"target\": \"com.amazonaws.ecs#EBSVolumeType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The volume type. This parameter maps 1:1 with the <code>VolumeType</code> parameter of\\n\\t\\t\\tthe <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateVolume.html\\\">CreateVolume API</a> in the <i>Amazon EC2 API Reference</i>. For more\\n\\t\\t\\tinformation, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-volume-types.html\\\">Amazon EBS volume types</a> in\\n\\t\\t\\tthe <i>Amazon EC2 User Guide</i>.</p>\\n         <p>The following are the supported volume types.</p>\\n         <ul>\\n            <li>\\n               <p>General Purpose SSD: <code>gp2</code>|<code>gp3</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Provisioned IOPS SSD: <code>io1</code>|<code>io2</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Throughput Optimized HDD: <code>st1</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Cold HDD: <code>sc1</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Magnetic: <code>standard</code>\\n               </p>\\n               <note>\\n                  <p>The magnetic volume type is not supported on Fargate.</p>\\n               </note>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"sizeInGiB\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedInteger\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The size of the volume in GiB. You must specify either a volume size or a snapshot ID.\\n\\t\\t\\tIf you specify a snapshot ID, the snapshot size is used for the volume size by default.\\n\\t\\t\\tYou can optionally specify a volume size greater than or equal to the snapshot size.\\n\\t\\t\\tThis parameter maps 1:1 with the <code>Size</code> parameter of the <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateVolume.html\\\">CreateVolume API</a> in the <i>Amazon EC2 API Reference</i>.</p>\\n         <p>The following are the supported volume size values for each volume type.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>gp2</code> and <code>gp3</code>: 1-16,384</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>io1</code> and <code>io2</code>: 4-16,384</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>st1</code> and <code>sc1</code>: 125-16,384</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>standard</code>: 1-1,024</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"snapshotId\": {\n                    \"target\": \"com.amazonaws.ecs#EBSSnapshotId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The snapshot that Amazon ECS uses to create volumes for attachment to tasks maintained by\\n\\t\\t\\tthe service. You must specify either <code>snapshotId</code> or <code>sizeInGiB</code>\\n\\t\\t\\tin your volume configuration. This parameter maps 1:1 with the <code>SnapshotId</code>\\n\\t\\t\\tparameter of the <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateVolume.html\\\">CreateVolume API</a> in\\n\\t\\t\\tthe <i>Amazon EC2 API Reference</i>.</p>\"\n                    }\n                },\n                \"volumeInitializationRate\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedInteger\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The rate, in MiB/s, at which data is fetched from a snapshot of an existing EBS volume\\n\\t\\t\\tto create new volumes for attachment to the tasks maintained by the service. This\\n\\t\\t\\tproperty can be specified only if you specify a <code>snapshotId</code>. For more\\n\\t\\t\\tinformation, see <a href=\\\"https://docs.aws.amazon.com/ebs/latest/userguide/initalize-volume.html\\\">Initialize Amazon EBS volumes</a> in the <i>Amazon EBS User\\n\\t\\t\\t\\tGuide</i>.</p>\"\n                    }\n                },\n                \"iops\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedInteger\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of I/O operations per second (IOPS). For <code>gp3</code>,\\n\\t\\t\\t<code>io1</code>, and <code>io2</code> volumes, this represents the number of IOPS that\\n\\t\\t\\tare provisioned for the volume. For <code>gp2</code> volumes, this represents the\\n\\t\\t\\tbaseline performance of the volume and the rate at which the volume accumulates I/O\\n\\t\\t\\tcredits for bursting.</p>\\n         <p>The following are the supported values for each volume type.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>gp3</code>: 3,000 - 16,000 IOPS</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>io1</code>: 100 - 64,000 IOPS</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>io2</code>: 100 - 256,000 IOPS</p>\\n            </li>\\n         </ul>\\n         <p>This parameter is required for <code>io1</code> and <code>io2</code> volume types. The\\n\\t\\t\\tdefault for <code>gp3</code> volumes is <code>3,000 IOPS</code>. This parameter is not\\n\\t\\t\\tsupported for <code>st1</code>, <code>sc1</code>, or <code>standard</code> volume\\n\\t\\t\\ttypes.</p>\\n         <p>This parameter maps 1:1 with the <code>Iops</code> parameter of the <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateVolume.html\\\">CreateVolume API</a> in the <i>Amazon EC2 API Reference</i>.</p>\"\n                    }\n                },\n                \"throughput\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedInteger\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The throughput to provision for a volume, in MiB/s, with a maximum of 1,000 MiB/s.\\n\\t\\t\\tThis parameter maps 1:1 with the <code>Throughput</code> parameter of the <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateVolume.html\\\">CreateVolume API</a> in the <i>Amazon EC2 API Reference</i>.</p>\\n         <important>\\n            <p>This parameter is only supported for the <code>gp3</code> volume type.</p>\\n         </important>\"\n                    }\n                },\n                \"tagSpecifications\": {\n                    \"target\": \"com.amazonaws.ecs#EBSTagSpecifications\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags to apply to the volume. Amazon ECS applies service-managed tags by default. This\\n\\t\\t\\tparameter maps 1:1 with the <code>TagSpecifications.N</code> parameter of the <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateVolume.html\\\">CreateVolume API</a> in the <i>Amazon EC2 API Reference</i>.</p>\"\n                    }\n                },\n                \"roleArn\": {\n                    \"target\": \"com.amazonaws.ecs#IAMRoleArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the IAM role to associate with this volume. This is the Amazon ECS\\n\\t\\t\\tinfrastructure IAM role that is used to manage your Amazon Web Services infrastructure. We recommend\\n\\t\\t\\tusing the Amazon ECS-managed <code>AmazonECSInfrastructureRolePolicyForVolumes</code> IAM\\n\\t\\t\\tpolicy with this role. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/infrastructure_IAM_role.html\\\">Amazon ECS\\n\\t\\t\\t\\tinfrastructure IAM role</a> in the <i>Amazon ECS Developer\\n\\t\\t\\tGuide</i>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"filesystemType\": {\n                    \"target\": \"com.amazonaws.ecs#TaskFilesystemType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The filesystem type for the volume. For volumes created from a snapshot, you must\\n\\t\\t\\tspecify the same filesystem type that the volume was using when the snapshot was\\n\\t\\t\\tcreated. If there is a filesystem type mismatch, the tasks will fail to start.</p>\\n         <p>The available Linux filesystem types are\\u2028 <code>ext3</code>, <code>ext4</code>, and\\n\\t\\t\\t\\t<code>xfs</code>. If no value is specified, the <code>xfs</code> filesystem type is\\n\\t\\t\\tused by default.</p>\\n         <p>The available Windows filesystem types are <code>NTFS</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The configuration for the Amazon EBS volume that Amazon ECS creates and manages on your behalf.\\n\\t\\t\\tThese settings are used to create each Amazon EBS volume, with one volume created for each\\n\\t\\t\\ttask in the service. For information about the supported launch types and operating\\n\\t\\t\\tsystems, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ebs-volumes.html#ebs-volumes-configuration\\\">Supported operating systems and launch types</a> in the<i> Amazon Elastic Container Service\\n\\t\\t\\t\\tDeveloper Guide</i>.</p>\\n         <p>Many of these parameters map 1:1 with the Amazon EBS <code>CreateVolume</code> API request\\n\\t\\t\\tparameters.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#ServiceNotActiveException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> Message that describes the cause of the exception.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The specified service isn't active. You can't update a service that's inactive. If you\\n\\t\\t\\thave previously deleted a service, you can re-create it with <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_CreateService.html\\\">CreateService</a>.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.ecs#ServiceNotFoundException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> Message that describes the cause of the exception.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The specified service wasn't found. You can view your available services with <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_ListServices.html\\\">ListServices</a>. Amazon ECS services are cluster specific and Region\\n\\t\\t\\tspecific.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.ecs#ServiceRegistries\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#ServiceRegistry\"\n            }\n        },\n        \"com.amazonaws.ecs#ServiceRegistry\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"registryArn\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the service registry. The currently supported service registry is\\n\\t\\t\\tCloud Map. For more information, see <a href=\\\"https://docs.aws.amazon.com/cloud-map/latest/api/API_CreateService.html\\\">CreateService</a>.</p>\"\n                    }\n                },\n                \"port\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedInteger\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The port value used if your service discovery service specified an SRV record. This\\n\\t\\t\\tfield might be used if both the <code>awsvpc</code> network mode and SRV records are\\n\\t\\t\\tused.</p>\"\n                    }\n                },\n                \"containerName\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The container name value to be used for your service discovery service. It's already\\n\\t\\t\\tspecified in the task definition. If the task definition that your service task\\n\\t\\t\\tspecifies uses the <code>bridge</code> or <code>host</code> network mode, you must\\n\\t\\t\\tspecify a <code>containerName</code> and <code>containerPort</code> combination from the\\n\\t\\t\\ttask definition. If the task definition that your service task specifies uses the\\n\\t\\t\\t\\t<code>awsvpc</code> network mode and a type SRV DNS record is used, you must specify\\n\\t\\t\\teither a <code>containerName</code> and <code>containerPort</code> combination or a\\n\\t\\t\\t\\t<code>port</code> value. However, you can't specify both.</p>\"\n                    }\n                },\n                \"containerPort\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedInteger\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The port value to be used for your service discovery service. It's already specified\\n\\t\\t\\tin the task definition. If the task definition your service task specifies uses the\\n\\t\\t\\t\\t<code>bridge</code> or <code>host</code> network mode, you must specify a\\n\\t\\t\\t\\t<code>containerName</code> and <code>containerPort</code> combination from the task\\n\\t\\t\\tdefinition. If the task definition your service task specifies uses the\\n\\t\\t\\t\\t<code>awsvpc</code> network mode and a type SRV DNS record is used, you must specify\\n\\t\\t\\teither a <code>containerName</code> and <code>containerPort</code> combination or a\\n\\t\\t\\t\\t<code>port</code> value. However, you can't specify both.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The details for the service registry.</p>\\n         <p>Each service may be associated with one service registry. Multiple service registries\\n\\t\\t\\tfor each service are not supported.</p>\\n         <p>When you add, update, or remove the service registries configuration, Amazon ECS starts a\\n\\t\\t\\tnew deployment. New tasks are registered and deregistered to the updated service\\n\\t\\t\\tregistry configuration.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#ServiceRevision\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"serviceRevisionArn\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the service revision.</p>\"\n                    }\n                },\n                \"serviceArn\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the service for the service revision.</p>\"\n                    }\n                },\n                \"clusterArn\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the cluster that hosts the service.</p>\"\n                    }\n                },\n                \"taskDefinition\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The task definition the service revision uses.</p>\"\n                    }\n                },\n                \"capacityProviderStrategy\": {\n                    \"target\": \"com.amazonaws.ecs#CapacityProviderStrategy\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The capacity provider strategy the service revision uses.</p>\"\n                    }\n                },\n                \"launchType\": {\n                    \"target\": \"com.amazonaws.ecs#LaunchType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The launch type the service revision uses.</p>\"\n                    }\n                },\n                \"platformVersion\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>For the Fargate launch type, the platform version the service revision uses.</p>\"\n                    }\n                },\n                \"platformFamily\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The platform family the service revision uses.</p>\"\n                    }\n                },\n                \"loadBalancers\": {\n                    \"target\": \"com.amazonaws.ecs#LoadBalancers\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The load balancers the service revision uses.</p>\"\n                    }\n                },\n                \"serviceRegistries\": {\n                    \"target\": \"com.amazonaws.ecs#ServiceRegistries\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The service registries (for Service Discovery) the service revision uses.</p>\"\n                    }\n                },\n                \"networkConfiguration\": {\n                    \"target\": \"com.amazonaws.ecs#NetworkConfiguration\"\n                },\n                \"containerImages\": {\n                    \"target\": \"com.amazonaws.ecs#ContainerImages\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The container images the service revision uses.</p>\"\n                    }\n                },\n                \"guardDutyEnabled\": {\n                    \"target\": \"com.amazonaws.ecs#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Indicates whether Runtime Monitoring is turned on.</p>\"\n                    }\n                },\n                \"serviceConnectConfiguration\": {\n                    \"target\": \"com.amazonaws.ecs#ServiceConnectConfiguration\"\n                },\n                \"volumeConfigurations\": {\n                    \"target\": \"com.amazonaws.ecs#ServiceVolumeConfigurations\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The volumes that are configured at deployment that the service revision uses.</p>\"\n                    }\n                },\n                \"fargateEphemeralStorage\": {\n                    \"target\": \"com.amazonaws.ecs#DeploymentEphemeralStorage\"\n                },\n                \"createdAt\": {\n                    \"target\": \"com.amazonaws.ecs#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time that the service revision was created. The format is yyyy-mm-dd\\n\\t\\t\\tHH:mm:ss.SSSSS.</p>\"\n                    }\n                },\n                \"vpcLatticeConfigurations\": {\n                    \"target\": \"com.amazonaws.ecs#VpcLatticeConfigurations\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The VPC Lattice configuration for the service revision.</p>\"\n                    }\n                },\n                \"resolvedConfiguration\": {\n                    \"target\": \"com.amazonaws.ecs#ResolvedConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The resolved configuration for the service revision which contains the actual resources your service revision uses, such as which target groups serve traffic.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about the service revision.</p>\\n         <p>A service revision contains a record of the workload configuration Amazon ECS is attempting\\n\\t\\t\\tto deploy. Whenever you create or deploy a service, Amazon ECS automatically creates and\\n\\t\\t\\tcaptures the configuration that you're trying to deploy in the service revision. For\\n\\t\\t\\tinformation about service revisions, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-revision.html\\\">Amazon ECS service\\n\\t\\t\\t\\trevisions</a> in the <i>\\n               <i>Amazon Elastic Container Service Developer Guide</i>\\n            </i>.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#ServiceRevisionLoadBalancer\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"targetGroupArn\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the target group associated with the service revision.</p>\"\n                    }\n                },\n                \"productionListenerRule\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the production listener rule or listener that directs traffic to the target group associated with the service revision.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The resolved load balancer configuration for a service revision. This includes information about which target groups serve traffic and which listener rules direct traffic to them.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#ServiceRevisionLoadBalancers\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#ServiceRevisionLoadBalancer\"\n            }\n        },\n        \"com.amazonaws.ecs#ServiceRevisionSummary\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"arn\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the service revision.</p>\"\n                    }\n                },\n                \"requestedTaskCount\": {\n                    \"target\": \"com.amazonaws.ecs#Integer\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The number of requested tasks for the service revision.</p>\"\n                    }\n                },\n                \"runningTaskCount\": {\n                    \"target\": \"com.amazonaws.ecs#Integer\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The number of running tasks for the service revision.</p>\"\n                    }\n                },\n                \"pendingTaskCount\": {\n                    \"target\": \"com.amazonaws.ecs#Integer\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The number of pending tasks for the service revision.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The information about the number of requested, pending, and running tasks for a\\n\\t\\t\\tservice revision.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#ServiceRevisions\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#ServiceRevision\"\n            }\n        },\n        \"com.amazonaws.ecs#ServiceRevisionsSummaryList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#ServiceRevisionSummary\"\n            }\n        },\n        \"com.amazonaws.ecs#ServiceVolumeConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"name\": {\n                    \"target\": \"com.amazonaws.ecs#ECSVolumeName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the volume. This value must match the volume name from the\\n\\t\\t\\t\\t<code>Volume</code> object in the task definition.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"managedEBSVolume\": {\n                    \"target\": \"com.amazonaws.ecs#ServiceManagedEBSVolumeConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The configuration for the Amazon EBS volume that Amazon ECS creates and manages on your behalf.\\n\\t\\t\\tThese settings are used to create each Amazon EBS volume, with one volume created for each\\n\\t\\t\\ttask in the service. The Amazon EBS volumes are visible in your account in the Amazon EC2 console\\n\\t\\t\\tonce they are created.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The configuration for a volume specified in the task definition as a volume that is\\n\\t\\t\\tconfigured at launch time. Currently, the only supported volume type is an Amazon EBS\\n\\t\\t\\tvolume.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#ServiceVolumeConfigurations\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#ServiceVolumeConfiguration\"\n            }\n        },\n        \"com.amazonaws.ecs#Services\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#Service\"\n            }\n        },\n        \"com.amazonaws.ecs#Session\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"sessionId\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the execute command session.</p>\"\n                    }\n                },\n                \"streamUrl\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A URL to the managed agent on the container that the SSM Session Manager client uses\\n\\t\\t\\tto send commands and receive output from the container.</p>\"\n                    }\n                },\n                \"tokenValue\": {\n                    \"target\": \"com.amazonaws.ecs#SensitiveString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An encrypted token value containing session and caller information. It's used to\\n\\t\\t\\tauthenticate the connection to the container.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The details for the execute command session.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#Setting\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"name\": {\n                    \"target\": \"com.amazonaws.ecs#SettingName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon ECS resource name.</p>\"\n                    }\n                },\n                \"value\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Determines whether the account setting is on or off for the specified resource.</p>\"\n                    }\n                },\n                \"principalArn\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the principal. It can be a user, role, or the root user. If this field is\\n\\t\\t\\tomitted, the authenticated user is assumed.</p>\"\n                    }\n                },\n                \"type\": {\n                    \"target\": \"com.amazonaws.ecs#SettingType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether Amazon Web Services manages the account setting, or if the user manages it.</p>\\n         <p>\\n            <code>aws_managed</code> account settings are read-only, as Amazon Web Services manages such on the\\n\\t\\t\\tcustomer's behalf. Currently, the <code>guardDutyActivate</code> account setting is the\\n\\t\\t\\tonly one Amazon Web Services manages.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The current account setting for a resource.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#SettingName\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"SERVICE_LONG_ARN_FORMAT\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"serviceLongArnFormat\"\n                    }\n                },\n                \"TASK_LONG_ARN_FORMAT\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"taskLongArnFormat\"\n                    }\n                },\n                \"CONTAINER_INSTANCE_LONG_ARN_FORMAT\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"containerInstanceLongArnFormat\"\n                    }\n                },\n                \"AWSVPC_TRUNKING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"awsvpcTrunking\"\n                    }\n                },\n                \"CONTAINER_INSIGHTS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"containerInsights\"\n                    }\n                },\n                \"FARGATE_FIPS_MODE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"fargateFIPSMode\"\n                    }\n                },\n                \"TAG_RESOURCE_AUTHORIZATION\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"tagResourceAuthorization\"\n                    }\n                },\n                \"FARGATE_TASK_RETIREMENT_WAIT_PERIOD\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"fargateTaskRetirementWaitPeriod\"\n                    }\n                },\n                \"GUARD_DUTY_ACTIVATE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"guardDutyActivate\"\n                    }\n                },\n                \"DEFAULT_LOG_DRIVER_MODE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"defaultLogDriverMode\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ecs#SettingType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"USER\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"user\"\n                    }\n                },\n                \"AWS_MANAGED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"aws_managed\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ecs#Settings\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#Setting\"\n            }\n        },\n        \"com.amazonaws.ecs#SortOrder\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ASC\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ASC\"\n                    }\n                },\n                \"DESC\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DESC\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ecs#StabilityStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"STEADY_STATE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"STEADY_STATE\"\n                    }\n                },\n                \"STABILIZING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"STABILIZING\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ecs#StartTask\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ecs#StartTaskRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ecs#StartTaskResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.ecs#ClientException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ClusterNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ServerException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#UnsupportedFeatureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Starts a new task from the specified task definition on the specified container\\n\\t\\t\\tinstance or instances.</p>\\n         <note>\\n            <p>On March 21, 2024, a change was made to resolve the task definition revision before authorization. When a task definition revision is not specified, authorization will occur using the latest revision of a task definition.</p>\\n         </note>\\n         <note>\\n            <p>Amazon Elastic Inference (EI) is no longer available to customers.</p>\\n         </note>\\n         <p>Alternatively, you can use<code>RunTask</code> to place tasks for you. For more\\n\\t\\t\\tinformation, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/scheduling_tasks.html\\\">Scheduling Tasks</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\\n         <p>You can attach Amazon EBS volumes to Amazon ECS tasks by configuring the volume when creating or\\n\\t\\t\\tupdating a service. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ebs-volumes.html#ebs-volume-types\\\">Amazon EBS volumes</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To start a new task\",\n                        \"documentation\": \"This example starts a new task in the cluster \\\"MyCluster\\\" on the specified container instance using the latest revision of the \\\"hello-world\\\" task definition.\",\n                        \"input\": {\n                            \"cluster\": \"MyCluster\",\n                            \"containerInstances\": [\n                                \"4c543eed-f83f-47da-b1d8-3d23f1da4c64\"\n                            ],\n                            \"taskDefinition\": \"hello-world\"\n                        },\n                        \"output\": {\n                            \"tasks\": [\n                                {\n                                    \"clusterArn\": \"arn:aws:ecs:us-east-1:012345678910:cluster/default\",\n                                    \"containerInstanceArn\": \"arn:aws:ecs:us-east-1:012345678910:container-instance/default/4c543eed-f83f-47da-b1d8-3d23f1da4c64\",\n                                    \"containers\": [\n                                        {\n                                            \"containerArn\": \"arn:aws:ecs:us-east-1:012345678910:container/e76594d4-27e1-4c74-98b5-46a6435eb769\",\n                                            \"lastStatus\": \"PENDING\",\n                                            \"name\": \"wordpress\",\n                                            \"taskArn\": \"arn:aws:ecs:us-east-1:012345678910:task/default/fdf2c302-468c-4e55-b884-5331d816e7fb\"\n                                        },\n                                        {\n                                            \"containerArn\": \"arn:aws:ecs:us-east-1:012345678910:container/default/b19106ea-4fa8-4f1d-9767-96922c82b070\",\n                                            \"lastStatus\": \"PENDING\",\n                                            \"name\": \"mysql\",\n                                            \"taskArn\": \"arn:aws:ecs:us-east-1:012345678910:task/default/fdf2c302-468c-4e55-b884-5331d816e7fb\"\n                                        }\n                                    ],\n                                    \"createdAt\": 1.479765460842E9,\n                                    \"desiredStatus\": \"RUNNING\",\n                                    \"lastStatus\": \"PENDING\",\n                                    \"overrides\": {\n                                        \"containerOverrides\": [\n                                            {\n                                                \"name\": \"wordpress\"\n                                            },\n                                            {\n                                                \"name\": \"mysql\"\n                                            }\n                                        ]\n                                    },\n                                    \"taskArn\": \"arn:aws:ecs:us-east-1:012345678910:task/default/fdf2c302-468c-4e55-b884-5331d816e7fb\",\n                                    \"taskDefinitionArn\": \"arn:aws:ecs:us-east-1:012345678910:task-definition/hello_world:6\",\n                                    \"version\": 1\n                                }\n                            ],\n                            \"failures\": []\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ecs#StartTaskRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"cluster\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The short name or full Amazon Resource Name (ARN) of the cluster where to start your task.\\n\\t\\t\\tIf you do not specify a cluster, the default cluster is assumed.</p>\"\n                    }\n                },\n                \"containerInstances\": {\n                    \"target\": \"com.amazonaws.ecs#StringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The container instance IDs or full ARN entries for the container instances where you\\n\\t\\t\\twould like to place your task. You can specify up to 10 container instances.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"enableECSManagedTags\": {\n                    \"target\": \"com.amazonaws.ecs#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Specifies whether to use Amazon ECS managed tags for the task. For more information, see\\n\\t\\t\\t\\t<a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-using-tags.html\\\">Tagging Your Amazon ECS\\n\\t\\t\\t\\tResources</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\"\n                    }\n                },\n                \"enableExecuteCommand\": {\n                    \"target\": \"com.amazonaws.ecs#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Whether or not the execute command functionality is turned on for the task. If\\n\\t\\t\\t\\t<code>true</code>, this turns on the execute command functionality on all containers\\n\\t\\t\\tin the task.</p>\"\n                    }\n                },\n                \"group\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the task group to associate with the task. The default value is the family\\n\\t\\t\\tname of the task definition (for example, family:my-family-name).</p>\"\n                    }\n                },\n                \"networkConfiguration\": {\n                    \"target\": \"com.amazonaws.ecs#NetworkConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The VPC subnet and security group configuration for tasks that receive their own\\n            elastic network interface by using the <code>awsvpc</code> networking mode.</p>\"\n                    }\n                },\n                \"overrides\": {\n                    \"target\": \"com.amazonaws.ecs#TaskOverride\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of container overrides in JSON format that specify the name of a container in\\n\\t\\t\\tthe specified task definition and the overrides it receives. You can override the\\n\\t\\t\\tdefault command for a container (that's specified in the task definition or Docker\\n\\t\\t\\timage) with a <code>command</code> override. You can also override existing environment\\n\\t\\t\\tvariables (that are specified in the task definition or Docker image) on a container or\\n\\t\\t\\tadd new environment variables to it with an <code>environment</code> override.</p>\\n         <note>\\n            <p>A total of 8192 characters are allowed for overrides. This limit includes the JSON\\n\\t\\t\\t\\tformatting characters of the override structure.</p>\\n         </note>\"\n                    }\n                },\n                \"propagateTags\": {\n                    \"target\": \"com.amazonaws.ecs#PropagateTags\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies whether to propagate the tags from the task definition or the service to the\\n\\t\\t\\ttask. If no value is specified, the tags aren't propagated.</p>\"\n                    }\n                },\n                \"referenceId\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>This parameter is only used by Amazon ECS. It is not intended for use by customers.</p>\"\n                    }\n                },\n                \"startedBy\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An optional tag specified when a task is started. For example, if you automatically\\n\\t\\t\\ttrigger a task to run a batch process job, you could apply a unique identifier for that\\n\\t\\t\\tjob to your task with the <code>startedBy</code> parameter. You can then identify which\\n\\t\\t\\ttasks belong to that job by filtering the results of a <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_ListTasks.html\\\">ListTasks</a> call with\\n\\t\\t\\tthe <code>startedBy</code> value. Up to 36 letters (uppercase and lowercase), numbers,\\n\\t\\t\\thyphens (-), forward slash (/), and underscores (_) are allowed.</p>\\n         <p>If a task is started by an Amazon ECS service, the <code>startedBy</code> parameter\\n\\t\\t\\tcontains the deployment ID of the service that starts it.</p>\"\n                    }\n                },\n                \"tags\": {\n                    \"target\": \"com.amazonaws.ecs#Tags\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The metadata that you apply to the task to help you categorize and organize them. Each\\n\\t\\t\\ttag consists of a key and an optional value, both of which you define.</p>\\n         <p>The following basic restrictions apply to tags:</p>\\n         <ul>\\n            <li>\\n               <p>Maximum number of tags per resource - 50</p>\\n            </li>\\n            <li>\\n               <p>For each resource, each tag key must be unique, and each tag key can have only\\n                    one value.</p>\\n            </li>\\n            <li>\\n               <p>Maximum key length - 128 Unicode characters in UTF-8</p>\\n            </li>\\n            <li>\\n               <p>Maximum value length - 256 Unicode characters in UTF-8</p>\\n            </li>\\n            <li>\\n               <p>If your tagging schema is used across multiple services and resources,\\n                    remember that other services may have restrictions on allowed characters.\\n                    Generally allowed characters are: letters, numbers, and spaces representable in\\n                    UTF-8, and the following characters: + - = . _ : / @.</p>\\n            </li>\\n            <li>\\n               <p>Tag keys and values are case-sensitive.</p>\\n            </li>\\n            <li>\\n               <p>Do not use <code>aws:</code>, <code>AWS:</code>, or any upper or lowercase\\n                    combination of such as a prefix for either keys or values as it is reserved for\\n                    Amazon Web Services use. You cannot edit or delete tag keys or values with this prefix. Tags with\\n                    this prefix do not count against your tags per resource limit.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"taskDefinition\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>family</code> and <code>revision</code> (<code>family:revision</code>) or\\n\\t\\t\\tfull ARN of the task definition to start. If a <code>revision</code> isn't specified,\\n\\t\\t\\tthe latest <code>ACTIVE</code> revision is used.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"volumeConfigurations\": {\n                    \"target\": \"com.amazonaws.ecs#TaskVolumeConfigurations\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The details of the volume that was <code>configuredAtLaunch</code>. You can configure\\n\\t\\t\\tthe size, volumeType, IOPS, throughput, snapshot and encryption in <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_TaskManagedEBSVolumeConfiguration.html\\\">TaskManagedEBSVolumeConfiguration</a>. The <code>name</code> of the volume must\\n\\t\\t\\tmatch the <code>name</code> from the task definition.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ecs#StartTaskResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"tasks\": {\n                    \"target\": \"com.amazonaws.ecs#Tasks\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A full description of the tasks that were started. Each task that was successfully\\n\\t\\t\\tplaced on your container instances is described.</p>\"\n                    }\n                },\n                \"failures\": {\n                    \"target\": \"com.amazonaws.ecs#Failures\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Any failures associated with the call.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ecs#Statistics\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#KeyValuePair\"\n            }\n        },\n        \"com.amazonaws.ecs#StopServiceDeployment\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ecs#StopServiceDeploymentRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ecs#StopServiceDeploymentResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.ecs#AccessDeniedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ClientException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ConflictException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ServerException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ServiceDeploymentNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#UnsupportedFeatureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Stops an ongoing service deployment.</p>\\n         <p>The following stop types are avaiable:</p>\\n         <ul>\\n            <li>\\n               <p>ROLLBACK - This option rolls back the service deployment to the previous\\n\\t\\t\\t\\t\\tservice revision. </p>\\n               <p>You can use this option even if you didn't configure the service deployment\\n\\t\\t\\t\\t\\tfor the rollback option. </p>\\n            </li>\\n         </ul>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/stop-service-deployment.html\\\">Stopping Amazon ECS\\n\\t\\t\\t\\tservice deployments</a> in the <i>Amazon Elastic Container Service Developer\\n\\t\\t\\tGuide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To stop a service deployment\",\n                        \"documentation\": \"This example stops the service deployment using the ROLLBACK option.\",\n                        \"input\": {\n                            \"serviceDeploymentArn\": \"arn:aws:ecs:us-east-1:123456789012:service-deployment/MyCluster/MyService/r9i43YFjvgF_xlg7m2eJ1r\",\n                            \"stopType\": \"ROLLBACK\"\n                        },\n                        \"output\": {\n                            \"serviceDeploymentArn\": \"arn:aws:ecs:us-east-1:123456789012:service-deployment/MyCluster/MyService/r9i43YFjvgF_xlg7m2eJ1r\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ecs#StopServiceDeploymentRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"serviceDeploymentArn\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the service deployment that you want to stop.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"stopType\": {\n                    \"target\": \"com.amazonaws.ecs#StopServiceDeploymentStopType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>How you want Amazon ECS to stop the service. </p>\\n         <p>The valid values are <code>ROLLBACK</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ecs#StopServiceDeploymentResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"serviceDeploymentArn\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the stopped service deployment.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ecs#StopServiceDeploymentStopType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ABORT\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ABORT\"\n                    }\n                },\n                \"ROLLBACK\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ROLLBACK\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ecs#StopTask\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ecs#StopTaskRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ecs#StopTaskResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.ecs#ClientException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ClusterNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ServerException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Stops a running task. Any tags associated with the task will be deleted.</p>\\n         <p>When you call <code>StopTask</code> on a task, the equivalent of <code>docker\\n\\t\\t\\t\\tstop</code> is issued to the containers running in the task. This results in a\\n\\t\\t\\t\\t<code>SIGTERM</code> value and a default 30-second timeout, after which the\\n\\t\\t\\t\\t<code>SIGKILL</code> value is sent and the containers are forcibly stopped. If the\\n\\t\\t\\tcontainer handles the <code>SIGTERM</code> value gracefully and exits within 30 seconds\\n\\t\\t\\tfrom receiving it, no <code>SIGKILL</code> value is sent.</p>\\n         <p>For Windows containers, POSIX signals do not work and runtime stops the container by\\n\\t\\t\\tsending a <code>CTRL_SHUTDOWN_EVENT</code>. For more information, see <a href=\\\"https://github.com/moby/moby/issues/25982\\\">Unable to react to graceful shutdown\\n\\t\\t\\t\\tof (Windows) container #25982</a> on GitHub.</p>\\n         <note>\\n            <p>The default 30-second timeout can be configured on the Amazon ECS container agent with\\n\\t\\t\\t\\tthe <code>ECS_CONTAINER_STOP_TIMEOUT</code> variable. For more information, see\\n\\t\\t\\t\\t\\t<a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-agent-config.html\\\">Amazon ECS Container Agent Configuration</a> in the\\n\\t\\t\\t\\t<i>Amazon Elastic Container Service Developer Guide</i>.</p>\\n         </note>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To stop a task\",\n                        \"documentation\": \"This example stops a task with ID \\\"1dc5c17a-422b-4dc4-b493-371970c6c4d6\\\" in cluster \\\"MyCluster\\\".\",\n                        \"input\": {\n                            \"cluster\": \"MyCluster\",\n                            \"task\": \"1dc5c17a-422b-4dc4-b493-371970c6c4d6\",\n                            \"reason\": \"testing stop task.\"\n                        },\n                        \"output\": {\n                            \"task\": {\n                                \"clusterArn\": \"arn:aws:ecs:us-east-1:012345678910:cluster/MyCluster\",\n                                \"containerInstanceArn\": \"arn:aws:ecs:us-east-1:012345678910:container-instance/MyCluster/5991d8da-1d59-49d2-a31f-4230f9e73140\",\n                                \"containers\": [\n                                    {\n                                        \"containerArn\": \"arn:aws:ecs:us-east-1:012345678910:container/4df26bb4-f057-467b-a079-961675296e64\",\n                                        \"lastStatus\": \"RUNNING\",\n                                        \"name\": \"simple-app\",\n                                        \"networkBindings\": [\n                                            {\n                                                \"bindIP\": \"0.0.0.0\",\n                                                \"containerPort\": 80,\n                                                \"hostPort\": 32774,\n                                                \"protocol\": \"tcp\"\n                                            }\n                                        ],\n                                        \"taskArn\": \"arn:aws:ecs:us-east-1:012345678910:task/MyCluster/1dc5c17a-422b-4dc4-b493-371970c6c4d6\"\n                                    },\n                                    {\n                                        \"containerArn\": \"arn:aws:ecs:us-east-1:012345678910:container/e09064f7-7361-4c87-8ab9-8d073bbdbcb9\",\n                                        \"lastStatus\": \"RUNNING\",\n                                        \"name\": \"busybox\",\n                                        \"networkBindings\": [],\n                                        \"taskArn\": \"arn:aws:ecs:us-east-1:012345678910:task/MyCluster/1dc5c17a-422b-4dc4-b493-371970c6c4d6\"\n                                    }\n                                ],\n                                \"createdAt\": 1.476822811295E9,\n                                \"desiredStatus\": \"STOPPED\",\n                                \"lastStatus\": \"RUNNING\",\n                                \"overrides\": {\n                                    \"containerOverrides\": [\n                                        {\n                                            \"name\": \"simple-app\"\n                                        },\n                                        {\n                                            \"name\": \"busybox\"\n                                        }\n                                    ]\n                                },\n                                \"startedAt\": 1.476822833998E9,\n                                \"startedBy\": \"ecs-svc/9223370560032507596\",\n                                \"stoppedReason\": \"testing stop task.\",\n                                \"taskArn\": \"arn:aws:ecs:us-east-1:012345678910:task/1dc5c17a-422b-4dc4-b493-371970c6c4d6\",\n                                \"taskDefinitionArn\": \"arn:aws:ecs:us-east-1:012345678910:task-definition/console-sample-app-dynamic-ports:1\",\n                                \"version\": 0\n                            }\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ecs#StopTaskRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"cluster\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The short name or full Amazon Resource Name (ARN) of the cluster that hosts the task to stop.\\n\\t\\t\\tIf you do not specify a cluster, the default cluster is assumed.</p>\"\n                    }\n                },\n                \"task\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Thefull Amazon Resource Name (ARN) of the task.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"reason\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An optional message specified when a task is stopped. For example, if you're using a\\n\\t\\t\\tcustom scheduler, you can use this parameter to specify the reason for stopping the task\\n\\t\\t\\there, and the message appears in subsequent <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_DescribeTasks.html\\\">DescribeTasks</a>>\\n\\t\\t\\tAPI operations on this task.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ecs#StopTaskResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"task\": {\n                    \"target\": \"com.amazonaws.ecs#Task\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The task that was stopped.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ecs#String\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ecs#StringList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#String\"\n            }\n        },\n        \"com.amazonaws.ecs#StringMap\": {\n            \"type\": \"map\",\n            \"key\": {\n                \"target\": \"com.amazonaws.ecs#String\"\n            },\n            \"value\": {\n                \"target\": \"com.amazonaws.ecs#String\"\n            }\n        },\n        \"com.amazonaws.ecs#SubmitAttachmentStateChanges\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ecs#SubmitAttachmentStateChangesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ecs#SubmitAttachmentStateChangesResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.ecs#AccessDeniedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ClientException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ServerException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>This action is only used by the Amazon ECS agent, and it is not intended for use outside of the agent.</p>\\n         </note>\\n         <p>Sent to acknowledge that an attachment changed states.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#SubmitAttachmentStateChangesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"cluster\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The short name or full ARN of the cluster that hosts the container instance the\\n\\t\\t\\tattachment belongs to.</p>\"\n                    }\n                },\n                \"attachments\": {\n                    \"target\": \"com.amazonaws.ecs#AttachmentStateChanges\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Any attachments associated with the state change request.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ecs#SubmitAttachmentStateChangesResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"acknowledgment\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Acknowledgement of the state change.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ecs#SubmitContainerStateChange\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ecs#SubmitContainerStateChangeRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ecs#SubmitContainerStateChangeResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.ecs#AccessDeniedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ClientException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ServerException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>This action is only used by the Amazon ECS agent, and it is not intended for use outside of the agent.</p>\\n         </note>\\n         <p>Sent to acknowledge that a container changed states.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#SubmitContainerStateChangeRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"cluster\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The short name or full ARN of the cluster that hosts the container.</p>\"\n                    }\n                },\n                \"task\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The task ID or full Amazon Resource Name (ARN) of the task that hosts the container.</p>\"\n                    }\n                },\n                \"containerName\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the container.</p>\"\n                    }\n                },\n                \"runtimeId\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the Docker container.</p>\"\n                    }\n                },\n                \"status\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The status of the state change request.</p>\"\n                    }\n                },\n                \"exitCode\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedInteger\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The exit code that's returned for the state change request.</p>\"\n                    }\n                },\n                \"reason\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The reason for the state change request.</p>\"\n                    }\n                },\n                \"networkBindings\": {\n                    \"target\": \"com.amazonaws.ecs#NetworkBindings\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The network bindings of the container.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ecs#SubmitContainerStateChangeResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"acknowledgment\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Acknowledgement of the state change.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ecs#SubmitTaskStateChange\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ecs#SubmitTaskStateChangeRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ecs#SubmitTaskStateChangeResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.ecs#AccessDeniedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ClientException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ServerException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>This action is only used by the Amazon ECS agent, and it is not intended for use outside of the agent.</p>\\n         </note>\\n         <p>Sent to acknowledge that a task changed states.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#SubmitTaskStateChangeRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"cluster\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The short name or full Amazon Resource Name (ARN) of the cluster that hosts the task.</p>\"\n                    }\n                },\n                \"task\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The task ID or full ARN of the task in the state change request.</p>\"\n                    }\n                },\n                \"status\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The status of the state change request.</p>\"\n                    }\n                },\n                \"reason\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The reason for the state change request.</p>\"\n                    }\n                },\n                \"containers\": {\n                    \"target\": \"com.amazonaws.ecs#ContainerStateChanges\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Any containers that's associated with the state change request.</p>\"\n                    }\n                },\n                \"attachments\": {\n                    \"target\": \"com.amazonaws.ecs#AttachmentStateChanges\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Any attachments associated with the state change request.</p>\"\n                    }\n                },\n                \"managedAgents\": {\n                    \"target\": \"com.amazonaws.ecs#ManagedAgentStateChanges\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The details for the managed agent that's associated with the task.</p>\"\n                    }\n                },\n                \"pullStartedAt\": {\n                    \"target\": \"com.amazonaws.ecs#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Unix timestamp for the time when the container image pull started.</p>\"\n                    }\n                },\n                \"pullStoppedAt\": {\n                    \"target\": \"com.amazonaws.ecs#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Unix timestamp for the time when the container image pull completed.</p>\"\n                    }\n                },\n                \"executionStoppedAt\": {\n                    \"target\": \"com.amazonaws.ecs#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Unix timestamp for the time when the task execution stopped.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ecs#SubmitTaskStateChangeResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"acknowledgment\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Acknowledgement of the state change.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ecs#SystemControl\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"namespace\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The namespaced kernel parameter to set a <code>value</code> for.</p>\"\n                    }\n                },\n                \"value\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The namespaced kernel parameter to set a <code>value</code> for.</p>\\n         <p>Valid IPC namespace values: <code>\\\"kernel.msgmax\\\" | \\\"kernel.msgmnb\\\" | \\\"kernel.msgmni\\\"\\n\\t\\t\\t\\t| \\\"kernel.sem\\\" | \\\"kernel.shmall\\\" | \\\"kernel.shmmax\\\" | \\\"kernel.shmmni\\\" |\\n\\t\\t\\t\\t\\\"kernel.shm_rmid_forced\\\"</code>, and <code>Sysctls</code> that start with\\n\\t\\t\\t\\t<code>\\\"fs.mqueue.*\\\"</code>\\n         </p>\\n         <p>Valid network namespace values: <code>Sysctls</code> that start with\\n\\t\\t\\t\\t<code>\\\"net.*\\\"</code>. Only namespaced <code>Sysctls</code> that exist within the\\n\\t\\t\\tcontainer starting with \\\"net.* are accepted.</p>\\n         <p>All of these values are supported by Fargate.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A list of namespaced kernel parameters to set in the container. This parameter maps to\\n\\t\\t\\t\\t<code>Sysctls</code> in the docker container create command and the\\n\\t\\t\\t\\t<code>--sysctl</code> option to docker run. For example, you can configure\\n\\t\\t\\t\\t<code>net.ipv4.tcp_keepalive_time</code> setting to maintain longer lived\\n\\t\\t\\tconnections.</p>\\n         <p>We don't recommend that you specify network-related <code>systemControls</code>\\n\\t\\t\\tparameters for multiple containers in a single task that also uses either the\\n\\t\\t\\t\\t<code>awsvpc</code> or <code>host</code> network mode. Doing this has the following\\n\\t\\t\\tdisadvantages:</p>\\n         <ul>\\n            <li>\\n               <p>For tasks that use the <code>awsvpc</code> network mode including Fargate,\\n\\t\\t\\t\\t\\tif you set <code>systemControls</code> for any container, it applies to all\\n\\t\\t\\t\\t\\tcontainers in the task. If you set different <code>systemControls</code> for\\n\\t\\t\\t\\t\\tmultiple containers in a single task, the container that's started last\\n\\t\\t\\t\\t\\tdetermines which <code>systemControls</code> take effect.</p>\\n            </li>\\n            <li>\\n               <p>For tasks that use the <code>host</code> network mode, the network namespace\\n\\t\\t\\t\\t\\t\\t<code>systemControls</code> aren't supported.</p>\\n            </li>\\n         </ul>\\n         <p>If you're setting an IPC resource namespace to use for the containers in the task, the\\n\\t\\t\\tfollowing conditions apply to your system controls. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html#task_definition_ipcmode\\\">IPC mode</a>.</p>\\n         <ul>\\n            <li>\\n               <p>For tasks that use the <code>host</code> IPC mode, IPC namespace\\n\\t\\t\\t\\t\\t\\t<code>systemControls</code> aren't supported.</p>\\n            </li>\\n            <li>\\n               <p>For tasks that use the <code>task</code> IPC mode, IPC namespace\\n\\t\\t\\t\\t\\t\\t<code>systemControls</code> values apply to all containers within a\\n\\t\\t\\t\\t\\ttask.</p>\\n            </li>\\n         </ul>\\n         <note>\\n            <p>This parameter is not supported for Windows containers.</p>\\n         </note>\\n         <note>\\n            <p>This parameter is only supported for tasks that are hosted on\\n        Fargate if the tasks are using platform version <code>1.4.0</code> or later\\n        (Linux). This isn't supported for Windows containers on\\n        Fargate.</p>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.ecs#SystemControls\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#SystemControl\"\n            }\n        },\n        \"com.amazonaws.ecs#Tag\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"key\": {\n                    \"target\": \"com.amazonaws.ecs#TagKey\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One part of a key-value pair that make up a tag. A <code>key</code> is a general label\\n\\t\\t\\tthat acts like a category for more specific tag values.</p>\"\n                    }\n                },\n                \"value\": {\n                    \"target\": \"com.amazonaws.ecs#TagValue\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The optional part of a key-value pair that make up a tag. A <code>value</code> acts as\\n\\t\\t\\ta descriptor within a tag category (key).</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The metadata that you apply to a resource to help you categorize and organize them.\\n\\t\\t\\tEach tag consists of a key and an optional value. You define them.</p>\\n         <p>The following basic restrictions apply to tags:</p>\\n         <ul>\\n            <li>\\n               <p>Maximum number of tags per resource - 50</p>\\n            </li>\\n            <li>\\n               <p>For each resource, each tag key must be unique, and each tag key can have only\\n                    one value.</p>\\n            </li>\\n            <li>\\n               <p>Maximum key length - 128 Unicode characters in UTF-8</p>\\n            </li>\\n            <li>\\n               <p>Maximum value length - 256 Unicode characters in UTF-8</p>\\n            </li>\\n            <li>\\n               <p>If your tagging schema is used across multiple services and resources,\\n                    remember that other services may have restrictions on allowed characters.\\n                    Generally allowed characters are: letters, numbers, and spaces representable in\\n                    UTF-8, and the following characters: + - = . _ : / @.</p>\\n            </li>\\n            <li>\\n               <p>Tag keys and values are case-sensitive.</p>\\n            </li>\\n            <li>\\n               <p>Do not use <code>aws:</code>, <code>AWS:</code>, or any upper or lowercase\\n                    combination of such as a prefix for either keys or values as it is reserved for\\n                    Amazon Web Services use. You cannot edit or delete tag keys or values with this prefix. Tags with\\n                    this prefix do not count against your tags per resource limit.</p>\\n            </li>\\n         </ul>\"\n            }\n        },\n        \"com.amazonaws.ecs#TagKey\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 128\n                },\n                \"smithy.api#pattern\": \"^([\\\\p{L}\\\\p{Z}\\\\p{N}_.:/=+\\\\-@]*)$\"\n            }\n        },\n        \"com.amazonaws.ecs#TagKeys\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#TagKey\"\n            }\n        },\n        \"com.amazonaws.ecs#TagResource\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ecs#TagResourceRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ecs#TagResourceResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.ecs#ClientException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ClusterNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ServerException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Associates the specified tags to a resource with the specified\\n\\t\\t\\t\\t<code>resourceArn</code>. If existing tags on a resource aren't specified in the\\n\\t\\t\\trequest parameters, they aren't changed. When a resource is deleted, the tags that are\\n\\t\\t\\tassociated with that resource are deleted as well.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To tag a cluster.\",\n                        \"documentation\": \"This example tags the 'dev' cluster with key 'team' and value 'dev'.\",\n                        \"input\": {\n                            \"resourceArn\": \"arn:aws:ecs:region:aws_account_id:cluster/dev\",\n                            \"tags\": [\n                                {\n                                    \"key\": \"team\",\n                                    \"value\": \"dev\"\n                                }\n                            ]\n                        },\n                        \"output\": {}\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ecs#TagResourceRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"resourceArn\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the resource to add tags to. Currently, the supported resources are\\n\\t\\t\\tAmazon ECS capacity providers, tasks, services, task definitions, clusters, and container\\n\\t\\t\\tinstances.</p>\\n         <p>In order to tag a service that has the following ARN format, you need to migrate the\\n\\t\\t\\tservice to the long ARN. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-arn-migration.html\\\">Migrate an Amazon ECS short service ARN to a long ARN</a> in the <i>Amazon Elastic Container Service\\n\\t\\t\\t\\tDeveloper Guide</i>.</p>\\n         <p>\\n            <code>arn:aws:ecs:region:aws_account_id:service/service-name</code>\\n         </p>\\n         <p>After the migration is complete, the service has the long ARN format, as shown below. Use this ARN to tag the service.</p>\\n         <p>\\n            <code>arn:aws:ecs:region:aws_account_id:service/cluster-name/service-name</code>\\n         </p>\\n         <p>If you try to tag a service with a short ARN, you receive an\\n\\t\\t\\t\\t<code>InvalidParameterException</code> error.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"tags\": {\n                    \"target\": \"com.amazonaws.ecs#Tags\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags to add to the resource. A tag is an array of key-value pairs.</p>\\n         <p>The following basic restrictions apply to tags:</p>\\n         <ul>\\n            <li>\\n               <p>Maximum number of tags per resource - 50</p>\\n            </li>\\n            <li>\\n               <p>For each resource, each tag key must be unique, and each tag key can have only\\n                    one value.</p>\\n            </li>\\n            <li>\\n               <p>Maximum key length - 128 Unicode characters in UTF-8</p>\\n            </li>\\n            <li>\\n               <p>Maximum value length - 256 Unicode characters in UTF-8</p>\\n            </li>\\n            <li>\\n               <p>If your tagging schema is used across multiple services and resources,\\n                    remember that other services may have restrictions on allowed characters.\\n                    Generally allowed characters are: letters, numbers, and spaces representable in\\n                    UTF-8, and the following characters: + - = . _ : / @.</p>\\n            </li>\\n            <li>\\n               <p>Tag keys and values are case-sensitive.</p>\\n            </li>\\n            <li>\\n               <p>Do not use <code>aws:</code>, <code>AWS:</code>, or any upper or lowercase\\n                    combination of such as a prefix for either keys or values as it is reserved for\\n                    Amazon Web Services use. You cannot edit or delete tag keys or values with this prefix. Tags with\\n                    this prefix do not count against your tags per resource limit.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ecs#TagResourceResponse\": {\n            \"type\": \"structure\",\n            \"members\": {},\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ecs#TagValue\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 256\n                },\n                \"smithy.api#pattern\": \"^([\\\\p{L}\\\\p{Z}\\\\p{N}_.:/=+\\\\-@]*)$\"\n            }\n        },\n        \"com.amazonaws.ecs#Tags\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#Tag\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 50\n                }\n            }\n        },\n        \"com.amazonaws.ecs#TargetNotConnectedException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> Message that describes the cause of the exception.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The execute command cannot run. This error can be caused by any of the following\\n\\t\\t\\tconfiguration issues:</p>\\n         <ul>\\n            <li>\\n               <p>Incorrect IAM permissions</p>\\n            </li>\\n            <li>\\n               <p>The SSM agent is not installed or is not running</p>\\n            </li>\\n            <li>\\n               <p> There is an interface Amazon VPC endpoint for Amazon ECS, but there is not one for\\n\\t\\t\\t\\t\\tSystems Manager Session Manager</p>\\n            </li>\\n         </ul>\\n         <p>For information about how to troubleshoot the issues, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-exec.html\\\">Troubleshooting issues with ECS\\n\\t\\t\\t\\tExec</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.ecs#TargetNotFoundException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> Message that describes the cause of the exception.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The specified target wasn't found. You can view your available container instances\\n\\t\\t\\twith <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_ListContainerInstances.html\\\">ListContainerInstances</a>. Amazon ECS container instances are cluster-specific and\\n\\t\\t\\tRegion-specific.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.ecs#TargetType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"CONTAINER_INSTANCE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"container-instance\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ecs#Task\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"attachments\": {\n                    \"target\": \"com.amazonaws.ecs#Attachments\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Elastic Network Adapter that's associated with the task if the task uses the\\n\\t\\t\\t\\t<code>awsvpc</code> network mode.</p>\"\n                    }\n                },\n                \"attributes\": {\n                    \"target\": \"com.amazonaws.ecs#Attributes\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The attributes of the task</p>\"\n                    }\n                },\n                \"availabilityZone\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Availability Zone for the task.</p>\"\n                    }\n                },\n                \"capacityProviderName\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The capacity provider that's associated with the task.</p>\"\n                    }\n                },\n                \"clusterArn\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the cluster that hosts the task.</p>\"\n                    }\n                },\n                \"connectivity\": {\n                    \"target\": \"com.amazonaws.ecs#Connectivity\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The connectivity status of a task.</p>\"\n                    }\n                },\n                \"connectivityAt\": {\n                    \"target\": \"com.amazonaws.ecs#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Unix timestamp for the time when the task last went into <code>CONNECTED</code>\\n\\t\\t\\tstatus.</p>\"\n                    }\n                },\n                \"containerInstanceArn\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the container instances that host the task.</p>\"\n                    }\n                },\n                \"containers\": {\n                    \"target\": \"com.amazonaws.ecs#Containers\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The containers that's associated with the task.</p>\"\n                    }\n                },\n                \"cpu\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of CPU units used by the task as expressed in a task definition. It can be\\n\\t\\t\\texpressed as an integer using CPU units (for example, <code>1024</code>). It can also be\\n\\t\\t\\texpressed as a string using vCPUs (for example, <code>1 vCPU</code> or <code>1\\n\\t\\t\\t\\tvcpu</code>). String values are converted to an integer that indicates the CPU units\\n\\t\\t\\twhen the task definition is registered.</p>\\n         <p>If you're using the EC2 launch type or the external launch type, this field is\\n\\t\\t\\toptional. Supported values are between <code>128</code> CPU units (<code>0.125</code>\\n\\t\\t\\tvCPUs) and <code>196608</code> CPU units (<code>192</code> vCPUs). If you do not specify\\n\\t\\t\\ta value, the parameter is ignored.</p>\\n         <p>This field is required for Fargate. For information about the valid values, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html#task_size\\\">Task size</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\"\n                    }\n                },\n                \"createdAt\": {\n                    \"target\": \"com.amazonaws.ecs#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Unix timestamp for the time when the task was created. More specifically, it's for\\n\\t\\t\\tthe time when the task entered the <code>PENDING</code> state.</p>\"\n                    }\n                },\n                \"desiredStatus\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The desired status of the task. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-lifecycle.html\\\">Task\\n\\t\\t\\tLifecycle</a>.</p>\"\n                    }\n                },\n                \"enableExecuteCommand\": {\n                    \"target\": \"com.amazonaws.ecs#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Determines whether execute command functionality is turned on for this task. If\\n\\t\\t\\t\\t<code>true</code>, execute command functionality is turned on all the containers in\\n\\t\\t\\tthe task.</p>\"\n                    }\n                },\n                \"executionStoppedAt\": {\n                    \"target\": \"com.amazonaws.ecs#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Unix timestamp for the time when the task execution stopped.</p>\"\n                    }\n                },\n                \"group\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the task group that's associated with the task.</p>\"\n                    }\n                },\n                \"healthStatus\": {\n                    \"target\": \"com.amazonaws.ecs#HealthStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The health status for the task. It's determined by the health of the essential\\n\\t\\t\\tcontainers in the task. If all essential containers in the task are reporting as\\n\\t\\t\\t\\t<code>HEALTHY</code>, the task status also reports as <code>HEALTHY</code>. If any\\n\\t\\t\\tessential containers in the task are reporting as <code>UNHEALTHY</code> or\\n\\t\\t\\t\\t<code>UNKNOWN</code>, the task status also reports as <code>UNHEALTHY</code> or\\n\\t\\t\\t\\t<code>UNKNOWN</code>.</p>\\n         <note>\\n            <p>The Amazon ECS container agent doesn't monitor or report on Docker health checks that\\n\\t\\t\\t\\tare embedded in a container image and not specified in the container definition. For\\n\\t\\t\\t\\texample, this includes those specified in a parent image or from the image's\\n\\t\\t\\t\\tDockerfile. Health check parameters that are specified in a container definition\\n\\t\\t\\t\\toverride any Docker health checks that are found in the container image.</p>\\n         </note>\"\n                    }\n                },\n                \"inferenceAccelerators\": {\n                    \"target\": \"com.amazonaws.ecs#InferenceAccelerators\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Elastic Inference accelerator that's associated with the task.</p>\"\n                    }\n                },\n                \"lastStatus\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The last known status for the task. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-lifecycle.html\\\">Task\\n\\t\\t\\t\\tLifecycle</a>.</p>\"\n                    }\n                },\n                \"launchType\": {\n                    \"target\": \"com.amazonaws.ecs#LaunchType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The infrastructure where your task runs on. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/launch_types.html\\\">Amazon ECS\\n\\t\\t\\t\\tlaunch types</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\"\n                    }\n                },\n                \"memory\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The amount of memory (in MiB) that the task uses as expressed in a task definition. It\\n\\t\\t\\tcan be expressed as an integer using MiB (for example, <code>1024</code>). If it's\\n\\t\\t\\texpressed as a string using GB (for example, <code>1GB</code> or <code>1 GB</code>),\\n\\t\\t\\tit's converted to an integer indicating the MiB when the task definition is\\n\\t\\t\\tregistered.</p>\\n         <p>If you use the EC2 launch type, this field is optional.</p>\\n         <p>If you use the Fargate launch type, this field is required. You must use\\n\\t\\t\\tone of the following values. The value that you choose determines the range of supported\\n\\t\\t\\tvalues for the <code>cpu</code> parameter.</p>\\n         <ul>\\n            <li>\\n               <p>512 (0.5 GB), 1024 (1 GB), 2048 (2 GB) - Available <code>cpu</code> values: 256 (.25 vCPU)</p>\\n            </li>\\n            <li>\\n               <p>1024 (1 GB), 2048 (2 GB), 3072 (3 GB), 4096 (4 GB) - Available <code>cpu</code> values: 512 (.5 vCPU)</p>\\n            </li>\\n            <li>\\n               <p>2048 (2 GB), 3072 (3 GB), 4096 (4 GB), 5120 (5 GB), 6144 (6 GB), 7168 (7 GB), 8192 (8 GB) - Available <code>cpu</code> values: 1024 (1 vCPU)</p>\\n            </li>\\n            <li>\\n               <p>Between 4096 (4 GB) and 16384 (16 GB) in increments of 1024 (1 GB) - Available <code>cpu</code> values: 2048 (2 vCPU)</p>\\n            </li>\\n            <li>\\n               <p>Between 8192 (8 GB) and 30720 (30 GB) in increments of 1024 (1 GB) - Available <code>cpu</code> values: 4096 (4 vCPU)</p>\\n            </li>\\n            <li>\\n               <p>Between 16 GB and 60 GB in 4 GB increments - Available <code>cpu</code> values: 8192 (8 vCPU)</p>\\n               <p>This option requires Linux platform <code>1.4.0</code> or\\n                                        later.</p>\\n            </li>\\n            <li>\\n               <p>Between 32GB and 120 GB in 8 GB increments - Available <code>cpu</code> values: 16384 (16 vCPU)</p>\\n               <p>This option requires Linux platform <code>1.4.0</code> or\\n                                        later.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"overrides\": {\n                    \"target\": \"com.amazonaws.ecs#TaskOverride\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more container overrides.</p>\"\n                    }\n                },\n                \"platformVersion\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The platform version where your task runs on. A platform version is only specified for\\n\\t\\t\\ttasks that use the Fargate launch type. If you didn't specify one, the\\n\\t\\t\\t\\t<code>LATEST</code> platform version is used. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/platform_versions.html\\\">Fargate Platform Versions</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\"\n                    }\n                },\n                \"platformFamily\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The operating system that your tasks are running on. A platform family is specified\\n\\t\\t\\tonly for tasks that use the Fargate launch type. </p>\\n         <p> All tasks that run as part of this service must use the same\\n\\t\\t\\t\\t<code>platformFamily</code> value as the service (for example,\\n\\t\\t\\t<code>LINUX.</code>).</p>\"\n                    }\n                },\n                \"pullStartedAt\": {\n                    \"target\": \"com.amazonaws.ecs#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Unix timestamp for the time when the container image pull began.</p>\"\n                    }\n                },\n                \"pullStoppedAt\": {\n                    \"target\": \"com.amazonaws.ecs#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Unix timestamp for the time when the container image pull completed.</p>\"\n                    }\n                },\n                \"startedAt\": {\n                    \"target\": \"com.amazonaws.ecs#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Unix timestamp for the time when the task started. More specifically, it's for the\\n\\t\\t\\ttime when the task transitioned from the <code>PENDING</code> state to the\\n\\t\\t\\t\\t<code>RUNNING</code> state.</p>\"\n                    }\n                },\n                \"startedBy\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tag specified when a task is started. If an Amazon ECS service started the task, the\\n\\t\\t\\t\\t<code>startedBy</code> parameter contains the deployment ID of that service.</p>\"\n                    }\n                },\n                \"stopCode\": {\n                    \"target\": \"com.amazonaws.ecs#TaskStopCode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The stop code indicating why a task was stopped. The <code>stoppedReason</code> might\\n\\t\\t\\tcontain additional details. </p>\\n         <p>For more information about stop code, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/stopped-task-error-codes.html\\\">Stopped tasks\\n\\t\\t\\t\\terror codes</a> in the <i>Amazon ECS Developer Guide</i>.</p>\"\n                    }\n                },\n                \"stoppedAt\": {\n                    \"target\": \"com.amazonaws.ecs#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Unix timestamp for the time when the task was stopped. More specifically, it's for\\n\\t\\t\\tthe time when the task transitioned from the <code>RUNNING</code> state to the\\n\\t\\t\\t\\t<code>STOPPED</code> state.</p>\"\n                    }\n                },\n                \"stoppedReason\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The reason that the task was stopped.</p>\"\n                    }\n                },\n                \"stoppingAt\": {\n                    \"target\": \"com.amazonaws.ecs#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Unix timestamp for the time when the task stops. More specifically, it's for the\\n\\t\\t\\ttime when the task transitions from the <code>RUNNING</code> state to\\n\\t\\t\\t\\t<code>STOPPING</code>.</p>\"\n                    }\n                },\n                \"tags\": {\n                    \"target\": \"com.amazonaws.ecs#Tags\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The metadata that you apply to the task to help you categorize and organize the task.\\n\\t\\t\\tEach tag consists of a key and an optional value. You define both the key and\\n\\t\\t\\tvalue.</p>\\n         <p>The following basic restrictions apply to tags:</p>\\n         <ul>\\n            <li>\\n               <p>Maximum number of tags per resource - 50</p>\\n            </li>\\n            <li>\\n               <p>For each resource, each tag key must be unique, and each tag key can have only\\n                    one value.</p>\\n            </li>\\n            <li>\\n               <p>Maximum key length - 128 Unicode characters in UTF-8</p>\\n            </li>\\n            <li>\\n               <p>Maximum value length - 256 Unicode characters in UTF-8</p>\\n            </li>\\n            <li>\\n               <p>If your tagging schema is used across multiple services and resources,\\n                    remember that other services may have restrictions on allowed characters.\\n                    Generally allowed characters are: letters, numbers, and spaces representable in\\n                    UTF-8, and the following characters: + - = . _ : / @.</p>\\n            </li>\\n            <li>\\n               <p>Tag keys and values are case-sensitive.</p>\\n            </li>\\n            <li>\\n               <p>Do not use <code>aws:</code>, <code>AWS:</code>, or any upper or lowercase\\n                    combination of such as a prefix for either keys or values as it is reserved for\\n                    Amazon Web Services use. You cannot edit or delete tag keys or values with this prefix. Tags with\\n                    this prefix do not count against your tags per resource limit.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"taskArn\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the task.</p>\"\n                    }\n                },\n                \"taskDefinitionArn\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the task definition that creates the task.</p>\"\n                    }\n                },\n                \"version\": {\n                    \"target\": \"com.amazonaws.ecs#Long\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The version counter for the task. Every time a task experiences a change that starts a\\n\\t\\t\\tCloudWatch event, the version counter is incremented. If you replicate your Amazon ECS task state\\n\\t\\t\\twith CloudWatch Events, you can compare the version of a task reported by the Amazon ECS API\\n\\t\\t\\tactions with the version reported in CloudWatch Events for the task (inside the\\n\\t\\t\\t\\t<code>detail</code> object) to verify that the version in your event stream is\\n\\t\\t\\tcurrent.</p>\"\n                    }\n                },\n                \"ephemeralStorage\": {\n                    \"target\": \"com.amazonaws.ecs#EphemeralStorage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ephemeral storage settings for the task.</p>\"\n                    }\n                },\n                \"fargateEphemeralStorage\": {\n                    \"target\": \"com.amazonaws.ecs#TaskEphemeralStorage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Fargate ephemeral storage settings for the task.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Details on a task in a cluster.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#TaskDefinition\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"taskDefinitionArn\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The full Amazon Resource Name (ARN) of the task definition.</p>\"\n                    }\n                },\n                \"containerDefinitions\": {\n                    \"target\": \"com.amazonaws.ecs#ContainerDefinitions\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of container definitions in JSON format that describe the different containers\\n\\t\\t\\tthat make up your task. For more information about container definition parameters and\\n\\t\\t\\tdefaults, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_defintions.html\\\">Amazon ECS Task\\n\\t\\t\\t\\tDefinitions</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\"\n                    }\n                },\n                \"family\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of a family that this task definition is registered to. Up to 255 characters\\n\\t\\t\\tare allowed. Letters (both uppercase and lowercase letters), numbers, hyphens (-), and\\n\\t\\t\\tunderscores (_) are allowed.</p>\\n         <p>A family groups multiple versions of a task definition. Amazon ECS gives the first task\\n\\t\\t\\tdefinition that you registered to a family a revision number of 1. Amazon ECS gives\\n\\t\\t\\tsequential revision numbers to each task definition that you add.</p>\"\n                    }\n                },\n                \"taskRoleArn\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The short name or full Amazon Resource Name (ARN) of the Identity and Access Management role that grants containers in the\\n\\t\\t\\ttask permission to call Amazon Web Services APIs on your behalf. For informationabout the required\\n\\t\\t\\tIAM roles for Amazon ECS, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/security-ecs-iam-role-overview.html\\\">IAM\\n\\t\\t\\t\\troles for Amazon ECS</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\"\n                    }\n                },\n                \"executionRoleArn\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the task execution role that grants the Amazon ECS container agent\\n            permission to make Amazon Web Services API calls on your behalf. For informationabout the required IAM roles for Amazon ECS, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/security-ecs-iam-role-overview.html\\\">IAM roles for Amazon ECS</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\"\n                    }\n                },\n                \"networkMode\": {\n                    \"target\": \"com.amazonaws.ecs#NetworkMode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Docker networking mode to use for the containers in the task. The valid values are\\n                <code>none</code>, <code>bridge</code>, <code>awsvpc</code>, and <code>host</code>.\\n            If no network mode is specified, the default is <code>bridge</code>.</p>\\n         <p>For Amazon ECS tasks on Fargate, the <code>awsvpc</code> network mode is required. \\n            For Amazon ECS tasks on Amazon EC2 Linux instances, any network mode can be used.  For Amazon ECS tasks on Amazon EC2 Windows instances, <code><default></code> or <code>awsvpc</code> can be used. If the network\\n            mode is set to <code>none</code>, you cannot specify port mappings in your container\\n            definitions, and the tasks containers do not have external connectivity. The\\n                <code>host</code> and <code>awsvpc</code> network modes offer the highest networking\\n            performance for containers because they use the EC2 network stack instead of the\\n            virtualized network stack provided by the <code>bridge</code> mode.</p>\\n         <p>With the <code>host</code> and <code>awsvpc</code> network modes, exposed container\\n            ports are mapped directly to the corresponding host port (for the <code>host</code>\\n            network mode) or the attached elastic network interface port (for the\\n                <code>awsvpc</code> network mode), so you cannot take advantage of dynamic host port\\n            mappings. </p>\\n         <important>\\n            <p>When using the <code>host</code> network mode, you should not run\\n                            containers using the root user (UID 0). It is considered best practice\\n                            to use a non-root user.</p>\\n         </important>\\n         <p>If the network mode is <code>awsvpc</code>, the task is allocated an elastic network\\n            interface, and you must specify a <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_NetworkConfiguration.html\\\">NetworkConfiguration</a> value when you create\\n            a service or run a task with the task definition. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-networking.html\\\">Task Networking</a> in the\\n                <i>Amazon Elastic Container Service Developer Guide</i>.</p>\\n         <p>If the network mode is <code>host</code>, you cannot run multiple instantiations of the\\n            same task on a single container instance when port mappings are used.</p>\"\n                    }\n                },\n                \"revision\": {\n                    \"target\": \"com.amazonaws.ecs#Integer\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The revision of the task in a particular family. The revision is a version number of a\\n\\t\\t\\ttask definition in a family. When you register a task definition for the first time, the\\n\\t\\t\\trevision is <code>1</code>. Each time that you register a new revision of a task\\n\\t\\t\\tdefinition in the same family, the revision value always increases by one. This is even\\n\\t\\t\\tif you deregistered previous revisions in this family.</p>\"\n                    }\n                },\n                \"volumes\": {\n                    \"target\": \"com.amazonaws.ecs#VolumeList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The list of data volume definitions for the task. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/using_data_volumes.html\\\">Using data volumes in tasks</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\\n         <note>\\n            <p>The <code>host</code> and <code>sourcePath</code> parameters aren't supported for\\n\\t\\t\\t\\ttasks run on Fargate. </p>\\n         </note>\"\n                    }\n                },\n                \"status\": {\n                    \"target\": \"com.amazonaws.ecs#TaskDefinitionStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The status of the task definition.</p>\"\n                    }\n                },\n                \"requiresAttributes\": {\n                    \"target\": \"com.amazonaws.ecs#RequiresAttributes\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The container instance attributes required by your task. When an Amazon EC2 instance is\\n\\t\\t\\tregistered to your cluster, the Amazon ECS container agent assigns some standard attributes\\n\\t\\t\\tto the instance. You can apply custom attributes. These are specified as key-value pairs\\n\\t\\t\\tusing the Amazon ECS console or the <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_PutAttributes.html\\\">PutAttributes</a>\\n\\t\\t\\tAPI. These attributes are used when determining task placement for tasks hosted on Amazon EC2\\n\\t\\t\\tinstances. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-placement-constraints.html#attributes\\\">Attributes</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\\n         <note>\\n            <p>This parameter isn't supported for tasks run on Fargate.</p>\\n         </note>\"\n                    }\n                },\n                \"placementConstraints\": {\n                    \"target\": \"com.amazonaws.ecs#TaskDefinitionPlacementConstraints\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An array of placement constraint objects to use for tasks.</p>\\n         <note>\\n            <p>This parameter isn't supported for tasks run on Fargate.</p>\\n         </note>\"\n                    }\n                },\n                \"compatibilities\": {\n                    \"target\": \"com.amazonaws.ecs#CompatibilityList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Amazon ECS validates the task definition parameters with those supported by the launch\\n\\t\\t\\ttype. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/launch_types.html\\\">Amazon ECS launch types</a>\\n\\t\\t\\tin the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\"\n                    }\n                },\n                \"runtimePlatform\": {\n                    \"target\": \"com.amazonaws.ecs#RuntimePlatform\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The operating system that your task definitions are running on. A platform family is\\n\\t\\t\\tspecified only for tasks using the Fargate launch type. </p>\\n         <p>When you specify a task in a service, this value must match the\\n\\t\\t\\t\\t<code>runtimePlatform</code> value of the service.</p>\"\n                    }\n                },\n                \"requiresCompatibilities\": {\n                    \"target\": \"com.amazonaws.ecs#CompatibilityList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The task launch types the task definition was validated against. The valid values are\\n\\t\\t\\t\\t<code>EC2</code>, <code>FARGATE</code>, and <code>EXTERNAL</code>. For more\\n\\t\\t\\tinformation, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/launch_types.html\\\">Amazon ECS launch types</a>\\n\\t\\t\\tin the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\"\n                    }\n                },\n                \"cpu\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of <code>cpu</code> units used by the task. If you use the EC2 launch type,\\n\\t\\t\\tthis field is optional. Any value can be used. If you use the Fargate launch type, this\\n\\t\\t\\tfield is required. You must use one of the following values. The value that you choose\\n\\t\\t\\tdetermines your range of valid values for the <code>memory</code> parameter.</p>\\n         <p>If you're using the EC2 launch type or the external launch type, this\\n\\t\\t\\tfield is optional. Supported values are between <code>128</code> CPU units\\n\\t\\t\\t\\t(<code>0.125</code> vCPUs) and <code>196608</code> CPU units (<code>192</code>\\n\\t\\t\\tvCPUs). </p>\\n         <p>This field is required for Fargate. For information about the valid values, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html#task_size\\\">Task size</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\"\n                    }\n                },\n                \"memory\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The amount (in MiB) of memory used by the task.</p>\\n         <p>If your tasks runs on Amazon EC2 instances, you must specify either a task-level memory\\n\\t\\t\\tvalue or a container-level memory value. This field is optional and any value can be\\n\\t\\t\\tused. If a task-level memory value is specified, the container-level memory value is\\n\\t\\t\\toptional. For more information regarding container-level memory and memory reservation,\\n\\t\\t\\tsee <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_ContainerDefinition.html\\\">ContainerDefinition</a>.</p>\\n         <p>If your tasks runs on Fargate, this field is required. You must use one of the\\n\\t\\t\\tfollowing values. The value you choose determines your range of valid values for the\\n\\t\\t\\t\\t<code>cpu</code> parameter.</p>\\n         <ul>\\n            <li>\\n               <p>512 (0.5 GB), 1024 (1 GB), 2048 (2 GB) - Available <code>cpu</code> values: 256 (.25 vCPU)</p>\\n            </li>\\n            <li>\\n               <p>1024 (1 GB), 2048 (2 GB), 3072 (3 GB), 4096 (4 GB) - Available <code>cpu</code> values: 512 (.5 vCPU)</p>\\n            </li>\\n            <li>\\n               <p>2048 (2 GB), 3072 (3 GB), 4096 (4 GB), 5120 (5 GB), 6144 (6 GB), 7168 (7 GB), 8192 (8 GB) - Available <code>cpu</code> values: 1024 (1 vCPU)</p>\\n            </li>\\n            <li>\\n               <p>Between 4096 (4 GB) and 16384 (16 GB) in increments of 1024 (1 GB) - Available <code>cpu</code> values: 2048 (2 vCPU)</p>\\n            </li>\\n            <li>\\n               <p>Between 8192 (8 GB) and 30720 (30 GB) in increments of 1024 (1 GB) - Available <code>cpu</code> values: 4096 (4 vCPU)</p>\\n            </li>\\n            <li>\\n               <p>Between 16 GB and 60 GB in 4 GB increments - Available <code>cpu</code> values: 8192 (8 vCPU)</p>\\n               <p>This option requires Linux platform <code>1.4.0</code> or\\n                                        later.</p>\\n            </li>\\n            <li>\\n               <p>Between 32GB and 120 GB in 8 GB increments - Available <code>cpu</code> values: 16384 (16 vCPU)</p>\\n               <p>This option requires Linux platform <code>1.4.0</code> or\\n                                        later.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"inferenceAccelerators\": {\n                    \"target\": \"com.amazonaws.ecs#InferenceAccelerators\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Elastic Inference accelerator that's associated with the task.</p>\"\n                    }\n                },\n                \"pidMode\": {\n                    \"target\": \"com.amazonaws.ecs#PidMode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The process namespace to use for the containers in the task. The valid\\n                            values are <code>host</code> or <code>task</code>. On Fargate for\\n                            Linux containers, the only valid value is <code>task</code>. For\\n                            example, monitoring sidecars might need <code>pidMode</code> to access\\n                            information about other containers running in the same task.</p>\\n         <p>If <code>host</code> is specified, all containers within the tasks\\n                            that specified the <code>host</code> PID mode on the same container\\n                            instance share the same process namespace with the host Amazon EC2\\n                            instance.</p>\\n         <p>If <code>task</code> is specified, all containers within the specified\\n                            task share the same process namespace.</p>\\n         <p>If no value is specified, the\\n                            default is a private namespace for each container.</p>\\n         <p>If the <code>host</code> PID mode is used, there's a heightened risk\\n                            of undesired process namespace exposure.</p>\\n         <note>\\n            <p>This parameter is not supported for Windows containers.</p>\\n         </note>\\n         <note>\\n            <p>This parameter is only supported for tasks that are hosted on\\n        Fargate if the tasks are using platform version <code>1.4.0</code> or later\\n        (Linux). This isn't supported for Windows containers on\\n        Fargate.</p>\\n         </note>\"\n                    }\n                },\n                \"ipcMode\": {\n                    \"target\": \"com.amazonaws.ecs#IpcMode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IPC resource namespace to use for the containers in the task. The valid values are\\n                <code>host</code>, <code>task</code>, or <code>none</code>. If <code>host</code> is\\n            specified, then all containers within the tasks that specified the <code>host</code> IPC\\n            mode on the same container instance share the same IPC resources with the host Amazon EC2\\n            instance. If <code>task</code> is specified, all containers within the specified task\\n            share the same IPC resources. If <code>none</code> is specified, then IPC resources\\n            within the containers of a task are private and not shared with other containers in a\\n            task or on the container instance. If no value is specified, then the IPC resource\\n            namespace sharing depends on the Docker daemon setting on the container instance.</p>\\n         <p>If the <code>host</code> IPC mode is used, be aware that there is a heightened risk of\\n            undesired IPC namespace expose.</p>\\n         <p>If you are setting namespaced kernel parameters using <code>systemControls</code> for\\n            the containers in the task, the following will apply to your IPC resource namespace. For\\n            more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html\\\">System\\n                Controls</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\\n         <ul>\\n            <li>\\n               <p>For tasks that use the <code>host</code> IPC mode, IPC namespace related\\n                        <code>systemControls</code> are not supported.</p>\\n            </li>\\n            <li>\\n               <p>For tasks that use the <code>task</code> IPC mode, IPC namespace related\\n                        <code>systemControls</code> will apply to all containers within a\\n                    task.</p>\\n            </li>\\n         </ul>\\n         <note>\\n            <p>This parameter is not supported for Windows containers or tasks run on Fargate.</p>\\n         </note>\"\n                    }\n                },\n                \"proxyConfiguration\": {\n                    \"target\": \"com.amazonaws.ecs#ProxyConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The configuration details for the App Mesh proxy.</p>\\n         <p>Your Amazon ECS container instances require at least version 1.26.0 of the container agent\\n\\t\\t\\tand at least version 1.26.0-1 of the <code>ecs-init</code> package to use a proxy\\n\\t\\t\\tconfiguration. If your container instances are launched from the Amazon ECS optimized AMI\\n\\t\\t\\tversion <code>20190301</code> or later, they contain the required versions of the\\n\\t\\t\\tcontainer agent and <code>ecs-init</code>. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-optimized_AMI.html\\\">Amazon ECS-optimized Linux AMI</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\"\n                    }\n                },\n                \"registeredAt\": {\n                    \"target\": \"com.amazonaws.ecs#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Unix timestamp for the time when the task definition was registered.</p>\"\n                    }\n                },\n                \"deregisteredAt\": {\n                    \"target\": \"com.amazonaws.ecs#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Unix timestamp for the time when the task definition was deregistered.</p>\"\n                    }\n                },\n                \"registeredBy\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The principal that registered the task definition.</p>\"\n                    }\n                },\n                \"ephemeralStorage\": {\n                    \"target\": \"com.amazonaws.ecs#EphemeralStorage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ephemeral storage settings to use for tasks run with the task definition.</p>\"\n                    }\n                },\n                \"enableFaultInjection\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedBoolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Enables fault injection and allows for fault injection requests to be accepted from\\n\\t\\t\\tthe task's containers. The default value is <code>false</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The details of a task definition which describes the container and volume definitions\\n\\t\\t\\tof an Amazon Elastic Container Service task. You can specify which Docker images to use, the required\\n\\t\\t\\tresources, and other configurations related to launching the task definition through an\\n\\t\\t\\tAmazon ECS service or task.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#TaskDefinitionFamilyStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ACTIVE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ACTIVE\"\n                    }\n                },\n                \"INACTIVE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"INACTIVE\"\n                    }\n                },\n                \"ALL\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ALL\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ecs#TaskDefinitionField\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"TAGS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"TAGS\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ecs#TaskDefinitionFieldList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#TaskDefinitionField\"\n            }\n        },\n        \"com.amazonaws.ecs#TaskDefinitionList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#TaskDefinition\"\n            }\n        },\n        \"com.amazonaws.ecs#TaskDefinitionPlacementConstraint\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"type\": {\n                    \"target\": \"com.amazonaws.ecs#TaskDefinitionPlacementConstraintType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of constraint. The <code>MemberOf</code> constraint restricts selection to be\\n\\t\\t\\tfrom a group of valid candidates.</p>\"\n                    }\n                },\n                \"expression\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A cluster query language expression to apply to the constraint. For more information,\\n\\t\\t\\tsee <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/cluster-query-language.html\\\">Cluster query language</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The constraint on task placement in the task definition. For more information, see\\n\\t\\t\\t\\t<a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-placement-constraints.html\\\">Task placement constraints</a> in the\\n\\t\\t\\t<i>Amazon Elastic Container Service Developer Guide</i>.</p>\\n         <note>\\n            <p>Task placement constraints aren't supported for tasks run on Fargate.</p>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.ecs#TaskDefinitionPlacementConstraintType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"MEMBER_OF\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"memberOf\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ecs#TaskDefinitionPlacementConstraints\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#TaskDefinitionPlacementConstraint\"\n            }\n        },\n        \"com.amazonaws.ecs#TaskDefinitionStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ACTIVE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ACTIVE\"\n                    }\n                },\n                \"INACTIVE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"INACTIVE\"\n                    }\n                },\n                \"DELETE_IN_PROGRESS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DELETE_IN_PROGRESS\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ecs#TaskEphemeralStorage\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"sizeInGiB\": {\n                    \"target\": \"com.amazonaws.ecs#Integer\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The total amount, in GiB, of the ephemeral storage to set for the task. The minimum\\n\\t\\t\\tsupported value is <code>20</code> GiB and the maximum supported value is\\u2028\\n\\t\\t\\t\\t<code>200</code> GiB.</p>\"\n                    }\n                },\n                \"kmsKeyId\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify an Key Management Service key ID to encrypt the ephemeral storage for the\\n\\t\\t\\ttask.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The amount of ephemeral storage to allocate for the task.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#TaskField\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"TAGS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"TAGS\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ecs#TaskFieldList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#TaskField\"\n            }\n        },\n        \"com.amazonaws.ecs#TaskFilesystemType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"EXT3\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ext3\"\n                    }\n                },\n                \"EXT4\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ext4\"\n                    }\n                },\n                \"XFS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"xfs\"\n                    }\n                },\n                \"NTFS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ntfs\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ecs#TaskManagedEBSVolumeConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"encrypted\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedBoolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether the volume should be encrypted. If you turn on Region-level Amazon EBS\\n\\t\\t\\tencryption by default but set this value as <code>false</code>, the setting is\\n\\t\\t\\toverridden and the volume is encrypted with the KMS key specified for Amazon EBS encryption\\n\\t\\t\\tby default. This parameter maps 1:1 with the <code>Encrypted</code> parameter of the\\n\\t\\t\\t\\t<a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateVolume.html\\\">CreateVolume API</a> in the <i>Amazon EC2 API Reference</i>.</p>\"\n                    }\n                },\n                \"kmsKeyId\": {\n                    \"target\": \"com.amazonaws.ecs#EBSKMSKeyId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) identifier of the Amazon Web Services Key Management Service key to use for Amazon EBS encryption. When a key\\n\\t\\t\\tis specified using this parameter, it overrides Amazon EBS default encryption or any KMS key\\n\\t\\t\\tthat you specified for cluster-level managed storage encryption. This parameter maps 1:1\\n\\t\\t\\twith the <code>KmsKeyId</code> parameter of the <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateVolume.html\\\">CreateVolume API</a> in\\n\\t\\t\\tthe <i>Amazon EC2 API Reference</i>. For more information about encrypting\\n\\t\\t\\tAmazon EBS volumes attached to a task, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ebs-kms-encryption.html\\\">Encrypt data stored in Amazon EBS volumes attached to Amazon ECS tasks</a>.</p>\\n         <important>\\n            <p>Amazon Web Services authenticates the Amazon Web Services Key Management Service key asynchronously. Therefore, if you specify an\\n\\t\\t\\t\\tID, alias, or ARN that is invalid, the action can appear to complete, but\\n\\t\\t\\t\\teventually fails.</p>\\n         </important>\"\n                    }\n                },\n                \"volumeType\": {\n                    \"target\": \"com.amazonaws.ecs#EBSVolumeType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The volume type. This parameter maps 1:1 with the <code>VolumeType</code> parameter of\\n\\t\\t\\tthe <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateVolume.html\\\">CreateVolume API</a> in the <i>Amazon EC2 API Reference</i>. For more\\n\\t\\t\\tinformation, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-volume-types.html\\\">Amazon EBS volume types</a> in\\n\\t\\t\\tthe <i>Amazon EC2 User Guide</i>.</p>\\n         <p>The following are the supported volume types.</p>\\n         <ul>\\n            <li>\\n               <p>General Purpose SSD: <code>gp2</code>|<code>gp3</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Provisioned IOPS SSD: <code>io1</code>|<code>io2</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Throughput Optimized HDD: <code>st1</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Cold HDD: <code>sc1</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Magnetic: <code>standard</code>\\n               </p>\\n               <note>\\n                  <p>The magnetic volume type is not supported on Fargate.</p>\\n               </note>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"sizeInGiB\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedInteger\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The size of the volume in GiB. You must specify either a volume size or a snapshot ID.\\n\\t\\t\\tIf you specify a snapshot ID, the snapshot size is used for the volume size by default.\\n\\t\\t\\tYou can optionally specify a volume size greater than or equal to the snapshot size.\\n\\t\\t\\tThis parameter maps 1:1 with the <code>Size</code> parameter of the <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateVolume.html\\\">CreateVolume API</a> in the <i>Amazon EC2 API Reference</i>.</p>\\n         <p>The following are the supported volume size values for each volume type.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>gp2</code> and <code>gp3</code>: 1-16,384</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>io1</code> and <code>io2</code>: 4-16,384</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>st1</code> and <code>sc1</code>: 125-16,384</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>standard</code>: 1-1,024</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"snapshotId\": {\n                    \"target\": \"com.amazonaws.ecs#EBSSnapshotId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The snapshot that Amazon ECS uses to create the volume. You must specify either a snapshot\\n\\t\\t\\tID or a volume size. This parameter maps 1:1 with the <code>SnapshotId</code> parameter\\n\\t\\t\\tof the <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateVolume.html\\\">CreateVolume API</a> in\\n\\t\\t\\tthe <i>Amazon EC2 API Reference</i>.</p>\"\n                    }\n                },\n                \"volumeInitializationRate\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedInteger\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The rate, in MiB/s, at which data is fetched from a snapshot of an existing Amazon EBS\\n\\t\\t\\tvolume to create a new volume for attachment to the task. This property can be specified\\n\\t\\t\\tonly if you specify a <code>snapshotId</code>. For more information, see <a href=\\\"https://docs.aws.amazon.com/ebs/latest/userguide/initalize-volume.html\\\">Initialize Amazon EBS volumes</a> in the <i>Amazon EBS User\\n\\t\\t\\t\\tGuide</i>.</p>\"\n                    }\n                },\n                \"iops\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedInteger\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of I/O operations per second (IOPS). For <code>gp3</code>,\\n\\t\\t\\t<code>io1</code>, and <code>io2</code> volumes, this represents the number of IOPS that\\n\\t\\t\\tare provisioned for the volume. For <code>gp2</code> volumes, this represents the\\n\\t\\t\\tbaseline performance of the volume and the rate at which the volume accumulates I/O\\n\\t\\t\\tcredits for bursting.</p>\\n         <p>The following are the supported values for each volume type.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>gp3</code>: 3,000 - 16,000 IOPS</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>io1</code>: 100 - 64,000 IOPS</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>io2</code>: 100 - 256,000 IOPS</p>\\n            </li>\\n         </ul>\\n         <p>This parameter is required for <code>io1</code> and <code>io2</code> volume types. The\\n\\t\\t\\tdefault for <code>gp3</code> volumes is <code>3,000 IOPS</code>. This parameter is not\\n\\t\\t\\tsupported for <code>st1</code>, <code>sc1</code>, or <code>standard</code> volume\\n\\t\\t\\ttypes.</p>\\n         <p>This parameter maps 1:1 with the <code>Iops</code> parameter of the <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateVolume.html\\\">CreateVolume API</a> in the <i>Amazon EC2 API Reference</i>.</p>\"\n                    }\n                },\n                \"throughput\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedInteger\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The throughput to provision for a volume, in MiB/s, with a maximum of 1,000 MiB/s.\\n\\t\\t\\tThis parameter maps 1:1 with the <code>Throughput</code> parameter of the <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateVolume.html\\\">CreateVolume API</a> in the <i>Amazon EC2 API Reference</i>.</p>\\n         <important>\\n            <p>This parameter is only supported for the <code>gp3</code> volume type.</p>\\n         </important>\"\n                    }\n                },\n                \"tagSpecifications\": {\n                    \"target\": \"com.amazonaws.ecs#EBSTagSpecifications\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags to apply to the volume. Amazon ECS applies service-managed tags by default. This\\n\\t\\t\\tparameter maps 1:1 with the <code>TagSpecifications.N</code> parameter of the <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateVolume.html\\\">CreateVolume API</a> in the <i>Amazon EC2 API Reference</i>.</p>\"\n                    }\n                },\n                \"roleArn\": {\n                    \"target\": \"com.amazonaws.ecs#IAMRoleArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the IAM role to associate with this volume. This is the Amazon ECS\\n\\t\\t\\tinfrastructure IAM role that is used to manage your Amazon Web Services infrastructure. We recommend\\n\\t\\t\\tusing the Amazon ECS-managed <code>AmazonECSInfrastructureRolePolicyForVolumes</code> IAM\\n\\t\\t\\tpolicy with this role. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/infrastructure_IAM_role.html\\\">Amazon ECS\\n\\t\\t\\t\\tinfrastructure IAM role</a> in the <i>Amazon ECS Developer\\n\\t\\t\\tGuide</i>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"terminationPolicy\": {\n                    \"target\": \"com.amazonaws.ecs#TaskManagedEBSVolumeTerminationPolicy\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The termination policy for the volume when the task exits. This provides a way to\\n\\t\\t\\tcontrol whether Amazon ECS terminates the Amazon EBS volume when the task stops.</p>\"\n                    }\n                },\n                \"filesystemType\": {\n                    \"target\": \"com.amazonaws.ecs#TaskFilesystemType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Linux filesystem type for the volume. For volumes created from a snapshot, you\\n\\t\\t\\tmust specify the same filesystem type that the volume was using when the snapshot was\\n\\t\\t\\tcreated. If there is a filesystem type mismatch, the task will fail to start.</p>\\n         <p>The available filesystem types are\\u2028 <code>ext3</code>, <code>ext4</code>, and\\n\\t\\t\\t\\t<code>xfs</code>. If no value is specified, the <code>xfs</code> filesystem type is\\n\\t\\t\\tused by default.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The configuration for the Amazon EBS volume that Amazon ECS creates and manages on your behalf.\\n\\t\\t\\tThese settings are used to create each Amazon EBS volume, with one volume created for each\\n\\t\\t\\ttask.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#TaskManagedEBSVolumeTerminationPolicy\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"deleteOnTermination\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedBoolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether the volume should be deleted on when the task stops. If a value of\\n\\t\\t\\t\\t<code>true</code> is specified, \\u2028Amazon ECS deletes the Amazon EBS volume on your behalf when\\n\\t\\t\\tthe task goes into the <code>STOPPED</code> state. If no value is specified, the\\n\\t\\t\\t\\u2028default value is <code>true</code> is used. When set to <code>false</code>, Amazon ECS\\n\\t\\t\\tleaves the volume in your \\u2028account.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The termination policy for the Amazon EBS volume when the task exits. For more information,\\n\\t\\t\\tsee <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ebs-volumes.html#ebs-volume-types\\\">Amazon ECS volume termination policy</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#TaskOverride\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"containerOverrides\": {\n                    \"target\": \"com.amazonaws.ecs#ContainerOverrides\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more container overrides that are sent to a task.</p>\"\n                    }\n                },\n                \"cpu\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The CPU override for the task.</p>\"\n                    }\n                },\n                \"inferenceAcceleratorOverrides\": {\n                    \"target\": \"com.amazonaws.ecs#InferenceAcceleratorOverrides\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Elastic Inference accelerator override for the task.</p>\"\n                    }\n                },\n                \"executionRoleArn\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the task execution role override for the task. For more information,\\n\\t\\t\\tsee <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_execution_IAM_role.html\\\">Amazon ECS task\\n\\t\\t\\t\\texecution IAM role</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\"\n                    }\n                },\n                \"memory\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The memory override for the task.</p>\"\n                    }\n                },\n                \"taskRoleArn\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the role that containers in this task can assume. All containers in\\n\\t\\t\\tthis task are granted the permissions that are specified in this role. For more\\n\\t\\t\\tinformation, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-iam-roles.html\\\">IAM Role for Tasks</a>\\n\\t\\t\\tin the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\"\n                    }\n                },\n                \"ephemeralStorage\": {\n                    \"target\": \"com.amazonaws.ecs#EphemeralStorage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ephemeral storage setting override for the task.</p>\\n         <note>\\n            <p>This parameter is only supported for tasks hosted on Fargate that\\n\\t\\t\\t\\tuse the following platform versions:</p>\\n            <ul>\\n               <li>\\n                  <p>Linux platform version <code>1.4.0</code> or later.</p>\\n               </li>\\n               <li>\\n                  <p>Windows platform version <code>1.0.0</code> or later.</p>\\n               </li>\\n            </ul>\\n         </note>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The overrides that are associated with a task.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#TaskSet\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"id\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the task set.</p>\"\n                    }\n                },\n                \"taskSetArn\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the task set.</p>\"\n                    }\n                },\n                \"serviceArn\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the service the task set exists in.</p>\"\n                    }\n                },\n                \"clusterArn\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the cluster that the service that hosts the task set exists\\n\\t\\t\\tin.</p>\"\n                    }\n                },\n                \"startedBy\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tag specified when a task set is started. If an CodeDeploy deployment created the task\\n\\t\\t\\tset, the <code>startedBy</code> parameter is <code>CODE_DEPLOY</code>. If an external\\n\\t\\t\\tdeployment created the task set, the <code>startedBy</code> field isn't used.</p>\"\n                    }\n                },\n                \"externalId\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The external ID associated with the task set.</p>\\n         <p>If an CodeDeploy deployment created a task set, the <code>externalId</code> parameter\\n\\t\\t\\tcontains the CodeDeploy deployment ID.</p>\\n         <p>If a task set is created for an external deployment and is associated with a service\\n\\t\\t\\tdiscovery registry, the <code>externalId</code> parameter contains the\\n\\t\\t\\t\\t<code>ECS_TASK_SET_EXTERNAL_ID</code> Cloud Map attribute.</p>\"\n                    }\n                },\n                \"status\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The status of the task set. The following describes each state.</p>\\n         <dl>\\n            <dt>PRIMARY</dt>\\n            <dd>\\n               <p>The task set is serving production traffic.</p>\\n            </dd>\\n            <dt>ACTIVE</dt>\\n            <dd>\\n               <p>The task set isn't serving production traffic.</p>\\n            </dd>\\n            <dt>DRAINING</dt>\\n            <dd>\\n               <p>The tasks in the task set are being stopped, and their corresponding\\n\\t\\t\\t\\t\\t\\ttargets are being deregistered from their target group.</p>\\n            </dd>\\n         </dl>\"\n                    }\n                },\n                \"taskDefinition\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The task definition that the task set is using.</p>\"\n                    }\n                },\n                \"computedDesiredCount\": {\n                    \"target\": \"com.amazonaws.ecs#Integer\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The computed desired count for the task set. This is calculated by multiplying the\\n\\t\\t\\tservice's <code>desiredCount</code> by the task set's <code>scale</code> percentage. The\\n\\t\\t\\tresult is always rounded up. For example, if the computed desired count is 1.2, it\\n\\t\\t\\trounds up to 2 tasks.</p>\"\n                    }\n                },\n                \"pendingCount\": {\n                    \"target\": \"com.amazonaws.ecs#Integer\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The number of tasks in the task set that are in the <code>PENDING</code> status during\\n\\t\\t\\ta deployment. A task in the <code>PENDING</code> state is preparing to enter the\\n\\t\\t\\t\\t<code>RUNNING</code> state. A task set enters the <code>PENDING</code> status when\\n\\t\\t\\tit launches for the first time or when it's restarted after being in the\\n\\t\\t\\t\\t<code>STOPPED</code> state.</p>\"\n                    }\n                },\n                \"runningCount\": {\n                    \"target\": \"com.amazonaws.ecs#Integer\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The number of tasks in the task set that are in the <code>RUNNING</code> status during\\n\\t\\t\\ta deployment. A task in the <code>RUNNING</code> state is running and ready for\\n\\t\\t\\tuse.</p>\"\n                    }\n                },\n                \"createdAt\": {\n                    \"target\": \"com.amazonaws.ecs#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Unix timestamp for the time when the task set was created.</p>\"\n                    }\n                },\n                \"updatedAt\": {\n                    \"target\": \"com.amazonaws.ecs#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Unix timestamp for the time when the task set was last updated.</p>\"\n                    }\n                },\n                \"launchType\": {\n                    \"target\": \"com.amazonaws.ecs#LaunchType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The launch type the tasks in the task set are using. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/launch_types.html\\\">Amazon ECS\\n\\t\\t\\t\\tlaunch types</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\"\n                    }\n                },\n                \"capacityProviderStrategy\": {\n                    \"target\": \"com.amazonaws.ecs#CapacityProviderStrategy\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The capacity provider strategy that are associated with the task set.</p>\"\n                    }\n                },\n                \"platformVersion\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Fargate platform version where the tasks in the task set are running. A platform\\n\\t\\t\\tversion is only specified for tasks run on Fargate. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/platform_versions.html\\\">Fargate platform versions</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\"\n                    }\n                },\n                \"platformFamily\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The operating system that your tasks in the set are running on. A platform family is\\n\\t\\t\\tspecified only for tasks that use the Fargate launch type. </p>\\n         <p> All tasks in the set must have the same value.</p>\"\n                    }\n                },\n                \"networkConfiguration\": {\n                    \"target\": \"com.amazonaws.ecs#NetworkConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The network configuration for the task set.</p>\"\n                    }\n                },\n                \"loadBalancers\": {\n                    \"target\": \"com.amazonaws.ecs#LoadBalancers\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Details on a load balancer that are used with a task set.</p>\"\n                    }\n                },\n                \"serviceRegistries\": {\n                    \"target\": \"com.amazonaws.ecs#ServiceRegistries\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The details for the service discovery registries to assign to this task set. For more\\n\\t\\t\\tinformation, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-discovery.html\\\">Service\\n\\t\\t\\t\\tdiscovery</a>.</p>\"\n                    }\n                },\n                \"scale\": {\n                    \"target\": \"com.amazonaws.ecs#Scale\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A floating-point percentage of your desired number of tasks to place and keep running\\n\\t\\t\\tin the task set.</p>\"\n                    }\n                },\n                \"stabilityStatus\": {\n                    \"target\": \"com.amazonaws.ecs#StabilityStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The stability status. This indicates whether the task set has reached a steady state.\\n\\t\\t\\tIf the following conditions are met, the task set are in\\n\\t\\t\\t<code>STEADY_STATE</code>:</p>\\n         <ul>\\n            <li>\\n               <p>The task <code>runningCount</code> is equal to the\\n\\t\\t\\t\\t\\t\\t<code>computedDesiredCount</code>.</p>\\n            </li>\\n            <li>\\n               <p>The <code>pendingCount</code> is <code>0</code>.</p>\\n            </li>\\n            <li>\\n               <p>There are no tasks that are running on container instances in the\\n\\t\\t\\t\\t\\t\\t<code>DRAINING</code> status.</p>\\n            </li>\\n            <li>\\n               <p>All tasks are reporting a healthy status from the load balancers, service\\n\\t\\t\\t\\t\\tdiscovery, and container health checks.</p>\\n            </li>\\n         </ul>\\n         <p>If any of those conditions aren't met, the stability status returns\\n\\t\\t\\t\\t<code>STABILIZING</code>.</p>\"\n                    }\n                },\n                \"stabilityStatusAt\": {\n                    \"target\": \"com.amazonaws.ecs#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Unix timestamp for the time when the task set stability status was\\n\\t\\t\\tretrieved.</p>\"\n                    }\n                },\n                \"tags\": {\n                    \"target\": \"com.amazonaws.ecs#Tags\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The metadata that you apply to the task set to help you categorize and organize them.\\n\\t\\t\\tEach tag consists of a key and an optional value. You define both.</p>\\n         <p>The following basic restrictions apply to tags:</p>\\n         <ul>\\n            <li>\\n               <p>Maximum number of tags per resource - 50</p>\\n            </li>\\n            <li>\\n               <p>For each resource, each tag key must be unique, and each tag key can have only\\n                    one value.</p>\\n            </li>\\n            <li>\\n               <p>Maximum key length - 128 Unicode characters in UTF-8</p>\\n            </li>\\n            <li>\\n               <p>Maximum value length - 256 Unicode characters in UTF-8</p>\\n            </li>\\n            <li>\\n               <p>If your tagging schema is used across multiple services and resources,\\n                    remember that other services may have restrictions on allowed characters.\\n                    Generally allowed characters are: letters, numbers, and spaces representable in\\n                    UTF-8, and the following characters: + - = . _ : / @.</p>\\n            </li>\\n            <li>\\n               <p>Tag keys and values are case-sensitive.</p>\\n            </li>\\n            <li>\\n               <p>Do not use <code>aws:</code>, <code>AWS:</code>, or any upper or lowercase\\n                    combination of such as a prefix for either keys or values as it is reserved for\\n                    Amazon Web Services use. You cannot edit or delete tag keys or values with this prefix. Tags with\\n                    this prefix do not count against your tags per resource limit.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"fargateEphemeralStorage\": {\n                    \"target\": \"com.amazonaws.ecs#DeploymentEphemeralStorage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Fargate ephemeral storage settings for the task set.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about a set of Amazon ECS tasks in either an CodeDeploy or an <code>EXTERNAL</code>\\n\\t\\t\\tdeployment. An Amazon ECS task set includes details such as the desired number of tasks, how\\n\\t\\t\\tmany tasks are running, and whether the task set serves production traffic.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#TaskSetField\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"TAGS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"TAGS\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ecs#TaskSetFieldList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#TaskSetField\"\n            }\n        },\n        \"com.amazonaws.ecs#TaskSetNotFoundException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> Message that describes the cause of the exception.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The specified task set wasn't found. You can view your available task sets with <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_DescribeTaskSets.html\\\">DescribeTaskSets</a>. Task sets are specific to each cluster, service and\\n\\t\\t\\tRegion.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.ecs#TaskSets\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#TaskSet\"\n            }\n        },\n        \"com.amazonaws.ecs#TaskStopCode\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"TASK_FAILED_TO_START\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"TaskFailedToStart\"\n                    }\n                },\n                \"ESSENTIAL_CONTAINER_EXITED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"EssentialContainerExited\"\n                    }\n                },\n                \"USER_INITIATED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"UserInitiated\"\n                    }\n                },\n                \"SERVICE_SCHEDULER_INITIATED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ServiceSchedulerInitiated\"\n                    }\n                },\n                \"SPOT_INTERRUPTION\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"SpotInterruption\"\n                    }\n                },\n                \"TERMINATION_NOTICE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"TerminationNotice\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ecs#TaskVolumeConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"name\": {\n                    \"target\": \"com.amazonaws.ecs#ECSVolumeName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the volume. This value must match the volume name from the\\n\\t\\t\\t\\t<code>Volume</code> object in the task definition.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"managedEBSVolume\": {\n                    \"target\": \"com.amazonaws.ecs#TaskManagedEBSVolumeConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The configuration for the Amazon EBS volume that Amazon ECS creates and manages on your behalf.\\n\\t\\t\\tThese settings are used to create each Amazon EBS volume, with one volume created for each\\n\\t\\t\\ttask. The Amazon EBS volumes are visible in your account in the Amazon EC2 console once they are\\n\\t\\t\\tcreated.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Configuration settings for the task volume that was <code>configuredAtLaunch</code>\\n\\t\\t\\tthat weren't set during <code>RegisterTaskDef</code>.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#TaskVolumeConfigurations\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#TaskVolumeConfiguration\"\n            }\n        },\n        \"com.amazonaws.ecs#TaskVolumeStorageGiB\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1\n                }\n            }\n        },\n        \"com.amazonaws.ecs#Tasks\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#Task\"\n            }\n        },\n        \"com.amazonaws.ecs#TimeoutConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"idleTimeoutSeconds\": {\n                    \"target\": \"com.amazonaws.ecs#Duration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The amount of time in seconds a connection will stay active while idle. A value of\\n\\t\\t\\t\\t<code>0</code> can be set to disable <code>idleTimeout</code>.</p>\\n         <p>The <code>idleTimeout</code> default for\\n\\t\\t\\t\\t<code>HTTP</code>/<code>HTTP2</code>/<code>GRPC</code> is 5 minutes.</p>\\n         <p>The <code>idleTimeout</code> default for <code>TCP</code> is 1 hour.</p>\"\n                    }\n                },\n                \"perRequestTimeoutSeconds\": {\n                    \"target\": \"com.amazonaws.ecs#Duration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The amount of time waiting for the upstream to respond with a complete response per\\n\\t\\t\\trequest. A value of <code>0</code> can be set to disable <code>perRequestTimeout</code>.\\n\\t\\t\\t\\t<code>perRequestTimeout</code> can only be set if Service Connect\\n\\t\\t\\t\\t<code>appProtocol</code> isn't <code>TCP</code>. Only <code>idleTimeout</code> is\\n\\t\\t\\tallowed for <code>TCP</code>\\n            <code>appProtocol</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>An object that represents the timeout configurations for Service Connect.</p>\\n         <note>\\n            <p>If <code>idleTimeout</code> is set to a time that is less than\\n\\t\\t\\t\\t\\t<code>perRequestTimeout</code>, the connection will close when the\\n\\t\\t\\t\\t\\t<code>idleTimeout</code> is reached and not the\\n\\t\\t\\t\\t<code>perRequestTimeout</code>.</p>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.ecs#Timestamp\": {\n            \"type\": \"timestamp\"\n        },\n        \"com.amazonaws.ecs#Tmpfs\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"containerPath\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The absolute file path where the tmpfs volume is to be mounted.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"size\": {\n                    \"target\": \"com.amazonaws.ecs#Integer\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The maximum size (in MiB) of the tmpfs volume.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"mountOptions\": {\n                    \"target\": \"com.amazonaws.ecs#StringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The list of tmpfs volume mount options.</p>\\n         <p>Valid values: <code>\\\"defaults\\\" | \\\"ro\\\" | \\\"rw\\\" | \\\"suid\\\" | \\\"nosuid\\\" | \\\"dev\\\" | \\\"nodev\\\" |\\n\\t\\t\\t\\t\\\"exec\\\" | \\\"noexec\\\" | \\\"sync\\\" | \\\"async\\\" | \\\"dirsync\\\" | \\\"remount\\\" | \\\"mand\\\" | \\\"nomand\\\" |\\n\\t\\t\\t\\t\\\"atime\\\" | \\\"noatime\\\" | \\\"diratime\\\" | \\\"nodiratime\\\" | \\\"bind\\\" | \\\"rbind\\\" | \\\"unbindable\\\" |\\n\\t\\t\\t\\t\\\"runbindable\\\" | \\\"private\\\" | \\\"rprivate\\\" | \\\"shared\\\" | \\\"rshared\\\" | \\\"slave\\\" | \\\"rslave\\\" |\\n\\t\\t\\t\\t\\\"relatime\\\" | \\\"norelatime\\\" | \\\"strictatime\\\" | \\\"nostrictatime\\\" | \\\"mode\\\" | \\\"uid\\\" | \\\"gid\\\"\\n\\t\\t\\t\\t| \\\"nr_inodes\\\" | \\\"nr_blocks\\\" | \\\"mpol\\\"</code>\\n         </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The container path, mount options, and size of the tmpfs mount.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#TmpfsList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#Tmpfs\"\n            }\n        },\n        \"com.amazonaws.ecs#TotalLocalStorageGBRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"min\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedDouble\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The minimum total local storage in GB. Instance types with less local storage are excluded from selection.</p>\"\n                    }\n                },\n                \"max\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedDouble\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum total local storage in GB. Instance types with more local storage are excluded from selection.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The minimum and maximum total local storage in gigabytes (GB) for instance types with local storage. This is useful for workloads that require local storage for temporary data or caching.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#TransportProtocol\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"TCP\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"tcp\"\n                    }\n                },\n                \"UDP\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"udp\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ecs#Ulimit\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"name\": {\n                    \"target\": \"com.amazonaws.ecs#UlimitName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>type</code> of the <code>ulimit</code>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"softLimit\": {\n                    \"target\": \"com.amazonaws.ecs#Integer\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The soft limit for the <code>ulimit</code> type. The value can be specified in bytes,\\n\\t\\t\\tseconds, or as a count, depending on the <code>type</code> of the\\n\\t\\t\\t<code>ulimit</code>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"hardLimit\": {\n                    \"target\": \"com.amazonaws.ecs#Integer\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The hard limit for the <code>ulimit</code> type. The value can be specified in bytes,\\n\\t\\t\\tseconds, or as a count, depending on the <code>type</code> of the\\n\\t\\t\\t<code>ulimit</code>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The <code>ulimit</code> settings to pass to the container.</p>\\n         <p>Amazon ECS tasks hosted on Fargate use the default\\n\\t\\t\\t\\t\\t\\t\\tresource limit values set by the operating system with the exception of\\n\\t\\t\\t\\t\\t\\t\\tthe <code>nofile</code> resource limit parameter which Fargate\\n\\t\\t\\t\\t\\t\\t\\toverrides. The <code>nofile</code> resource limit sets a restriction on\\n\\t\\t\\t\\t\\t\\t\\tthe number of open files that a container can use. The default\\n\\t\\t\\t\\t\\t\\t\\t\\t<code>nofile</code> soft limit is <code> 65535</code> and the default hard limit\\n\\t\\t\\t\\t\\t\\t\\tis <code>65535</code>.</p>\\n         <p>You can specify the <code>ulimit</code> settings for a container in a task\\n\\t\\t\\tdefinition.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#UlimitList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#Ulimit\"\n            }\n        },\n        \"com.amazonaws.ecs#UlimitName\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"CORE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"core\"\n                    }\n                },\n                \"CPU\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"cpu\"\n                    }\n                },\n                \"DATA\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"data\"\n                    }\n                },\n                \"FSIZE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"fsize\"\n                    }\n                },\n                \"LOCKS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"locks\"\n                    }\n                },\n                \"MEMLOCK\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"memlock\"\n                    }\n                },\n                \"MSGQUEUE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"msgqueue\"\n                    }\n                },\n                \"NICE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"nice\"\n                    }\n                },\n                \"NOFILE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"nofile\"\n                    }\n                },\n                \"NPROC\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"nproc\"\n                    }\n                },\n                \"RSS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"rss\"\n                    }\n                },\n                \"RTPRIO\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"rtprio\"\n                    }\n                },\n                \"RTTIME\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"rttime\"\n                    }\n                },\n                \"SIGPENDING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"sigpending\"\n                    }\n                },\n                \"STACK\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"stack\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ecs#UnsupportedFeatureException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> Message that describes the cause of the exception.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The specified task isn't supported in this Region.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.ecs#UntagResource\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ecs#UntagResourceRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ecs#UntagResourceResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.ecs#ClientException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ClusterNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ServerException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes specified tags from a resource.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To untag a cluster.\",\n                        \"documentation\": \"This example deletes the 'team' tag from the 'dev' cluster.\",\n                        \"input\": {\n                            \"resourceArn\": \"arn:aws:ecs:region:aws_account_id:cluster/dev\",\n                            \"tagKeys\": [\n                                \"team\"\n                            ]\n                        },\n                        \"output\": {}\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ecs#UntagResourceRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"resourceArn\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the resource to delete tags from. Currently, the supported resources\\n\\t\\t\\tare Amazon ECS capacity providers, tasks, services, task definitions, clusters, and container\\n\\t\\t\\tinstances.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"tagKeys\": {\n                    \"target\": \"com.amazonaws.ecs#TagKeys\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The keys of the tags to be removed.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ecs#UntagResourceResponse\": {\n            \"type\": \"structure\",\n            \"members\": {},\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ecs#UpdateCapacityProvider\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ecs#UpdateCapacityProviderRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ecs#UpdateCapacityProviderResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.ecs#ClientException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ClusterNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ServerException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#UnsupportedFeatureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Modifies the parameters for a capacity provider.</p>\\n         <p>These changes only apply to new Amazon ECS Managed Instances, or EC2 instances, not existing ones.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To update a capacity provider's parameters\",\n                        \"documentation\": \"This example updates the targetCapacity and instanceWarmupPeriod parameters for the capacity provider MyCapacityProvider to 90 and 150 respectively.\",\n                        \"input\": {\n                            \"name\": \"MyCapacityProvider\",\n                            \"autoScalingGroupProvider\": {\n                                \"managedScaling\": {\n                                    \"status\": \"ENABLED\",\n                                    \"targetCapacity\": 90,\n                                    \"instanceWarmupPeriod\": 150\n                                }\n                            }\n                        },\n                        \"output\": {\n                            \"capacityProvider\": {\n                                \"capacityProviderArn\": \"arn:aws:ecs:us-east-1:123456789012:capacity-provider/MyCapacityProvider\",\n                                \"name\": \"MyCapacityProvider\",\n                                \"status\": \"ACTIVE\",\n                                \"autoScalingGroupProvider\": {\n                                    \"autoScalingGroupArn\": \"arn:aws:autoscaling:us-east-1:132456789012:autoScalingGroup:57ffcb94-11f0-4d6d-bf60-3bac5EXAMPLE:autoScalingGroupName/MyASG\",\n                                    \"managedScaling\": {\n                                        \"status\": \"ENABLED\",\n                                        \"targetCapacity\": 90,\n                                        \"minimumScalingStepSize\": 1,\n                                        \"maximumScalingStepSize\": 10000,\n                                        \"instanceWarmupPeriod\": 150\n                                    },\n                                    \"managedTerminationProtection\": \"ENABLED\"\n                                },\n                                \"updateStatus\": \"UPDATE_COMPLETE\",\n                                \"tags\": []\n                            }\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ecs#UpdateCapacityProviderRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"name\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the capacity provider to update.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"cluster\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the cluster that contains the capacity provider to update. Managed instances capacity providers are cluster-scoped and can only be updated within their associated cluster.</p>\"\n                    }\n                },\n                \"autoScalingGroupProvider\": {\n                    \"target\": \"com.amazonaws.ecs#AutoScalingGroupProviderUpdate\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An object that represent the parameters to update for the Auto Scaling group capacity\\n\\t\\t\\tprovider.</p>\"\n                    }\n                },\n                \"managedInstancesProvider\": {\n                    \"target\": \"com.amazonaws.ecs#UpdateManagedInstancesProviderConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The updated configuration for the Amazon ECS Managed Instances provider. You can modify the infrastructure role, instance launch template, and tag propagation settings. Changes take effect for new instances launched after the update.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ecs#UpdateCapacityProviderResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"capacityProvider\": {\n                    \"target\": \"com.amazonaws.ecs#CapacityProvider\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Details about the capacity provider.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ecs#UpdateCluster\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ecs#UpdateClusterRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ecs#UpdateClusterResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.ecs#ClientException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ClusterNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#NamespaceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ServerException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Updates the cluster.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To update a cluster's observability settings.\",\n                        \"documentation\": \"This example turns on enhanced containerInsights in an existing cluster. \",\n                        \"input\": {\n                            \"cluster\": \"ECS-project-update-cluster\",\n                            \"settings\": [\n                                {\n                                    \"name\": \"containerInsights\",\n                                    \"value\": \"enhanced\"\n                                }\n                            ]\n                        },\n                        \"output\": {\n                            \"cluster\": {\n                                \"clusterArn\": \"arn:aws:ecs:us-west-2:123456789012:cluster/ECS-project-update-cluster\",\n                                \"clusterName\": \"ECS-project-update-cluster\",\n                                \"status\": \"ACTIVE\",\n                                \"registeredContainerInstancesCount\": 0,\n                                \"runningTasksCount\": 0,\n                                \"pendingTasksCount\": 0,\n                                \"activeServicesCount\": 0,\n                                \"statistics\": [],\n                                \"tags\": [],\n                                \"settings\": [\n                                    {\n                                        \"name\": \"containerInsights\",\n                                        \"value\": \"enhanced\"\n                                    }\n                                ],\n                                \"capacityProviders\": [\n                                    \"Infra-ECS-Cluster-ECS-project-update-cluster-d6bb6d5b-EC2CapacityProvider-3fIpdkLywwFt\"\n                                ],\n                                \"defaultCapacityProviderStrategy\": [\n                                    {\n                                        \"capacityProvider\": \"Infra-ECS-Cluster-ECS-project-update-cluster-d6bb6d5b-EC2CapacityProvider-3fIpdkLywwFt\",\n                                        \"weight\": 1,\n                                        \"base\": 0\n                                    }\n                                ],\n                                \"attachments\": [\n                                    {\n                                        \"id\": \"069d002b-7634-42e4-b1d4-544f4c8f6380\",\n                                        \"type\": \"as_policy\",\n                                        \"status\": \"CREATED\",\n                                        \"details\": [\n                                            {\n                                                \"name\": \"capacityProviderName\",\n                                                \"value\": \"Infra-ECS-Cluster-ECS-project-update-cluster-d6bb6d5b-EC2CapacityProvider-3fIpdkLywwFt\"\n                                            },\n                                            {\n                                                \"name\": \"scalingPolicyName\",\n                                                \"value\": \"ECSManagedAutoScalingPolicy-152363a6-8c65-484c-b721-42c3e070ae93\"\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"id\": \"08b5b6ca-45e9-4209-a65d-e962a27c490a\",\n                                        \"type\": \"managed_draining\",\n                                        \"status\": \"CREATED\",\n                                        \"details\": [\n                                            {\n                                                \"name\": \"capacityProviderName\",\n                                                \"value\": \"Infra-ECS-Cluster-ECS-project-update-cluster-d6bb6d5b-EC2CapacityProvider-3fIpdkLywwFt\"\n                                            },\n                                            {\n                                                \"name\": \"autoScalingLifecycleHookName\",\n                                                \"value\": \"ecs-managed-draining-termination-hook\"\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"id\": \"45d0b36f-8cff-46b6-9380-1288744802ab\",\n                                        \"type\": \"sc\",\n                                        \"status\": \"ATTACHED\",\n                                        \"details\": []\n                                    }\n                                ],\n                                \"attachmentsStatus\": \"UPDATE_COMPLETE\",\n                                \"serviceConnectDefaults\": {\n                                    \"namespace\": \"arn:aws:servicediscovery:us-west-2:123456789012:namespace/ns-igwrsylmy3kwvcdx\"\n                                }\n                            }\n                        }\n                    },\n                    {\n                        \"title\": \"To update a cluster's Service Connect defaults.\",\n                        \"documentation\": \"This example sets a default Service Connect namespace. \",\n                        \"input\": {\n                            \"cluster\": \"ECS-project-update-cluster\",\n                            \"serviceConnectDefaults\": {\n                                \"namespace\": \"test\"\n                            }\n                        },\n                        \"output\": {\n                            \"cluster\": {\n                                \"clusterArn\": \"arn:aws:ecs:us-west-2:123456789012:cluster/ECS-project-update-cluster\",\n                                \"clusterName\": \"ECS-project-update-cluster\",\n                                \"status\": \"ACTIVE\",\n                                \"registeredContainerInstancesCount\": 0,\n                                \"runningTasksCount\": 0,\n                                \"pendingTasksCount\": 0,\n                                \"activeServicesCount\": 0,\n                                \"statistics\": [],\n                                \"tags\": [],\n                                \"settings\": [\n                                    {\n                                        \"name\": \"containerInsights\",\n                                        \"value\": \"enhanced\"\n                                    }\n                                ],\n                                \"capacityProviders\": [\n                                    \"Infra-ECS-Cluster-ECS-project-update-cluster-d6bb6d5b-EC2CapacityProvider-3fIpdkLywwFt\"\n                                ],\n                                \"defaultCapacityProviderStrategy\": [\n                                    {\n                                        \"capacityProvider\": \"Infra-ECS-Cluster-ECS-project-update-cluster-d6bb6d5b-EC2CapacityProvider-3fIpdkLywwFt\",\n                                        \"weight\": 1,\n                                        \"base\": 0\n                                    }\n                                ],\n                                \"attachments\": [\n                                    {\n                                        \"id\": \"069d002b-7634-42e4-b1d4-544f4c8f6380\",\n                                        \"type\": \"as_policy\",\n                                        \"status\": \"CREATED\",\n                                        \"details\": [\n                                            {\n                                                \"name\": \"capacityProviderName\",\n                                                \"value\": \"Infra-ECS-Cluster-ECS-project-update-cluster-d6bb6d5b-EC2CapacityProvider-3fIpdkLywwFt\"\n                                            },\n                                            {\n                                                \"name\": \"scalingPolicyName\",\n                                                \"value\": \"ECSManagedAutoScalingPolicy-152363a6-8c65-484c-b721-42c3e070ae93\"\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"id\": \"08b5b6ca-45e9-4209-a65d-e962a27c490a\",\n                                        \"type\": \"managed_draining\",\n                                        \"status\": \"CREATED\",\n                                        \"details\": [\n                                            {\n                                                \"name\": \"capacityProviderName\",\n                                                \"value\": \"Infra-ECS-Cluster-ECS-project-update-cluster-d6bb6d5b-EC2CapacityProvider-3fIpdkLywwFt\"\n                                            },\n                                            {\n                                                \"name\": \"autoScalingLifecycleHookName\",\n                                                \"value\": \"ecs-managed-draining-termination-hook\"\n                                            }\n                                        ]\n                                    },\n                                    {\n                                        \"id\": \"45d0b36f-8cff-46b6-9380-1288744802ab\",\n                                        \"type\": \"sc\",\n                                        \"status\": \"DELETED\",\n                                        \"details\": []\n                                    },\n                                    {\n                                        \"id\": \"3e6890c3-609c-4832-91de-d6ca891b3ef1\",\n                                        \"type\": \"sc\",\n                                        \"status\": \"ATTACHED\",\n                                        \"details\": []\n                                    },\n                                    {\n                                        \"id\": \"961b8ec1-c2f1-4070-8495-e669b7668e90\",\n                                        \"type\": \"sc\",\n                                        \"status\": \"DELETED\",\n                                        \"details\": []\n                                    }\n                                ],\n                                \"attachmentsStatus\": \"UPDATE_COMPLETE\",\n                                \"serviceConnectDefaults\": {\n                                    \"namespace\": \"arn:aws:servicediscovery:us-west-2:123456789012:namespace/ns-dtjmxqpfi46ht7dr\"\n                                }\n                            }\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ecs#UpdateClusterRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"cluster\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the cluster to modify the settings for.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"settings\": {\n                    \"target\": \"com.amazonaws.ecs#ClusterSettings\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The cluster settings for your cluster.</p>\"\n                    }\n                },\n                \"configuration\": {\n                    \"target\": \"com.amazonaws.ecs#ClusterConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The execute command configuration for the cluster.</p>\"\n                    }\n                },\n                \"serviceConnectDefaults\": {\n                    \"target\": \"com.amazonaws.ecs#ClusterServiceConnectDefaultsRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter to set a default Service Connect namespace. After you set a default \\n\\tService Connect namespace, any new services with Service Connect turned on that are created in the cluster are added as\\n\\tclient services in the namespace. This setting only applies to new services that set the <code>enabled</code> parameter to\\n\\t<code>true</code> in the <code>ServiceConnectConfiguration</code>.\\n\\tYou can set the namespace of each service individually in the <code>ServiceConnectConfiguration</code> to override this default\\n\\tparameter.</p>\\n         <p>Tasks that run in a namespace can use short names to connect\\n\\tto services in the namespace. Tasks can connect to services across all of the clusters in the namespace.\\n\\tTasks connect through a managed proxy container\\n\\tthat collects logs and metrics for increased visibility.\\n\\tOnly the tasks that Amazon ECS services create are supported with Service Connect.\\n\\tFor more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-connect.html\\\">Service Connect</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ecs#UpdateClusterResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"cluster\": {\n                    \"target\": \"com.amazonaws.ecs#Cluster\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Details about the cluster.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ecs#UpdateClusterSettings\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ecs#UpdateClusterSettingsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ecs#UpdateClusterSettingsResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.ecs#ClientException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ClusterNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ServerException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Modifies the settings to use for a cluster.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To update a cluster's settings\",\n                        \"documentation\": \"This example enables CloudWatch Container Insights for the default cluster.\",\n                        \"input\": {\n                            \"cluster\": \"default\",\n                            \"settings\": [\n                                {\n                                    \"name\": \"containerInsights\",\n                                    \"value\": \"enabled\"\n                                }\n                            ]\n                        },\n                        \"output\": {\n                            \"cluster\": {\n                                \"clusterArn\": \"arn:aws:ecs:us-west-2:123456789012:cluster/MyCluster\",\n                                \"clusterName\": \"default\",\n                                \"status\": \"ACTIVE\",\n                                \"registeredContainerInstancesCount\": 0,\n                                \"runningTasksCount\": 0,\n                                \"pendingTasksCount\": 0,\n                                \"activeServicesCount\": 0,\n                                \"statistics\": [],\n                                \"tags\": [],\n                                \"settings\": [\n                                    {\n                                        \"name\": \"containerInsights\",\n                                        \"value\": \"enabled\"\n                                    }\n                                ]\n                            }\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ecs#UpdateClusterSettingsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"cluster\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the cluster to modify the settings for.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"settings\": {\n                    \"target\": \"com.amazonaws.ecs#ClusterSettings\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The setting to use by default for a cluster. This parameter is used to turn on CloudWatch\\n\\t\\t\\tContainer Insights for a cluster. If this value is specified, it overrides the\\n\\t\\t\\t\\t<code>containerInsights</code> value set with <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_PutAccountSetting.html\\\">PutAccountSetting</a> or <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_PutAccountSettingDefault.html\\\">PutAccountSettingDefault</a>.</p>\\n         <important>\\n            <p>Currently, if you delete an existing cluster that does not have Container Insights\\n\\t\\t\\t\\tturned on, and then create a new cluster with the same name with Container Insights\\n\\t\\t\\t\\ttuned on, Container Insights will not actually be turned on. If you want to preserve\\n\\t\\t\\t\\tthe same name for your existing cluster and turn on Container Insights, you must\\n\\t\\t\\t\\twait 7 days before you can re-create it.</p>\\n         </important>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ecs#UpdateClusterSettingsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"cluster\": {\n                    \"target\": \"com.amazonaws.ecs#Cluster\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Details about the cluster</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ecs#UpdateContainerAgent\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ecs#UpdateContainerAgentRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ecs#UpdateContainerAgentResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.ecs#ClientException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ClusterNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#MissingVersionException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#NoUpdateAvailableException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ServerException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#UpdateInProgressException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Updates the Amazon ECS container agent on a specified container instance. Updating the\\n\\t\\t\\tAmazon ECS container agent doesn't interrupt running tasks or services on the container\\n\\t\\t\\tinstance. The process for updating the agent differs depending on whether your container\\n\\t\\t\\tinstance was launched with the Amazon ECS-optimized AMI or another operating system.</p>\\n         <note>\\n            <p>The <code>UpdateContainerAgent</code> API isn't supported for container instances\\n\\t\\t\\t\\tusing the Amazon ECS-optimized Amazon Linux 2 (arm64) AMI. To update the container agent,\\n\\t\\t\\t\\tyou can update the <code>ecs-init</code> package. This updates the agent. For more\\n\\t\\t\\t\\tinformation, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/agent-update-ecs-ami.html\\\">Updating the\\n\\t\\t\\t\\t\\tAmazon ECS container agent</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\\n         </note>\\n         <note>\\n            <p>Agent updates with the <code>UpdateContainerAgent</code> API operation do not\\n\\t\\t\\t\\tapply to Windows container instances. We recommend that you launch new container\\n\\t\\t\\t\\tinstances to update the agent version in your Windows clusters.</p>\\n         </note>\\n         <p>The <code>UpdateContainerAgent</code> API requires an Amazon ECS-optimized AMI or Amazon\\n\\t\\t\\tLinux AMI with the <code>ecs-init</code> service installed and running. For help\\n\\t\\t\\tupdating the Amazon ECS container agent on other operating systems, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-agent-update.html#manually_update_agent\\\">Manually updating the Amazon ECS container agent</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To update the container agent version on a container instance\",\n                        \"documentation\": \"This example updates the container agent version on the specified container instance in cluster MyCluster.\",\n                        \"input\": {\n                            \"cluster\": \"MyCluster\",\n                            \"containerInstance\": \"53ac7152-dcd1-4102-81f5-208962864132\"\n                        },\n                        \"output\": {\n                            \"containerInstance\": {\n                                \"agentConnected\": true,\n                                \"agentUpdateStatus\": \"PENDING\",\n                                \"versionInfo\": {\n                                    \"agentHash\": \"4023248\",\n                                    \"agentVersion\": \"1.0.0\",\n                                    \"dockerVersion\": \"DockerVersion: 1.5.0\"\n                                }\n                            }\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ecs#UpdateContainerAgentRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"cluster\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The short name or full Amazon Resource Name (ARN) of the cluster that your container instance is\\n\\t\\t\\trunning on. If you do not specify a cluster, the default cluster is assumed.</p>\"\n                    }\n                },\n                \"containerInstance\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The container instance ID or full ARN entries for the container instance where you\\n\\t\\t\\twould like to update the Amazon ECS container agent.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ecs#UpdateContainerAgentResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"containerInstance\": {\n                    \"target\": \"com.amazonaws.ecs#ContainerInstance\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The container instance that the container agent was updated for.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ecs#UpdateContainerInstancesState\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ecs#UpdateContainerInstancesStateRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ecs#UpdateContainerInstancesStateResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.ecs#ClientException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ClusterNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ServerException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Modifies the status of an Amazon ECS container instance.</p>\\n         <p>Once a container instance has reached an <code>ACTIVE</code> state, you can change the\\n\\t\\t\\tstatus of a container instance to <code>DRAINING</code> to manually remove an instance\\n\\t\\t\\tfrom a cluster, for example to perform system updates, update the Docker daemon, or\\n\\t\\t\\tscale down the cluster size.</p>\\n         <important>\\n            <p>A container instance can't be changed to <code>DRAINING</code> until it has\\n\\t\\t\\t\\treached an <code>ACTIVE</code> status. If the instance is in any other status, an\\n\\t\\t\\t\\terror will be received.</p>\\n         </important>\\n         <p>When you set a container instance to <code>DRAINING</code>, Amazon ECS prevents new tasks\\n\\t\\t\\tfrom being scheduled for placement on the container instance and replacement service\\n\\t\\t\\ttasks are started on other container instances in the cluster if the resources are\\n\\t\\t\\tavailable. Service tasks on the container instance that are in the <code>PENDING</code>\\n\\t\\t\\tstate are stopped immediately.</p>\\n         <p>Service tasks on the container instance that are in the <code>RUNNING</code> state are\\n\\t\\t\\tstopped and replaced according to the service's deployment configuration parameters,\\n\\t\\t\\t\\t<code>minimumHealthyPercent</code> and <code>maximumPercent</code>. You can change\\n\\t\\t\\tthe deployment configuration of your service using <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_UpdateService.html\\\">UpdateService</a>.</p>\\n         <ul>\\n            <li>\\n               <p>If <code>minimumHealthyPercent</code> is below 100%, the scheduler can ignore\\n\\t\\t\\t\\t\\t\\t<code>desiredCount</code> temporarily during task replacement. For example,\\n\\t\\t\\t\\t\\t\\t<code>desiredCount</code> is four tasks, a minimum of 50% allows the\\n\\t\\t\\t\\t\\tscheduler to stop two existing tasks before starting two new tasks. If the\\n\\t\\t\\t\\t\\tminimum is 100%, the service scheduler can't remove existing tasks until the\\n\\t\\t\\t\\t\\treplacement tasks are considered healthy. Tasks for services that do not use a\\n\\t\\t\\t\\t\\tload balancer are considered healthy if they're in the <code>RUNNING</code>\\n\\t\\t\\t\\t\\tstate. Tasks for services that use a load balancer are considered healthy if\\n\\t\\t\\t\\t\\tthey're in the <code>RUNNING</code> state and are reported as healthy by the\\n\\t\\t\\t\\t\\tload balancer.</p>\\n            </li>\\n            <li>\\n               <p>The <code>maximumPercent</code> parameter represents an upper limit on the\\n\\t\\t\\t\\t\\tnumber of running tasks during task replacement. You can use this to define the\\n\\t\\t\\t\\t\\treplacement batch size. For example, if <code>desiredCount</code> is four tasks,\\n\\t\\t\\t\\t\\ta maximum of 200% starts four new tasks before stopping the four tasks to be\\n\\t\\t\\t\\t\\tdrained, provided that the cluster resources required to do this are available.\\n\\t\\t\\t\\t\\tIf the maximum is 100%, then replacement tasks can't start until the draining\\n\\t\\t\\t\\t\\ttasks have stopped.</p>\\n            </li>\\n         </ul>\\n         <p>Any <code>PENDING</code> or <code>RUNNING</code> tasks that do not belong to a service\\n\\t\\t\\taren't affected. You must wait for them to finish or stop them manually.</p>\\n         <p>A container instance has completed draining when it has no more <code>RUNNING</code>\\n\\t\\t\\ttasks. You can verify this using <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_ListTasks.html\\\">ListTasks</a>.</p>\\n         <p>When a container instance has been drained, you can set a container instance to\\n\\t\\t\\t\\t<code>ACTIVE</code> status and once it has reached that status the Amazon ECS scheduler\\n\\t\\t\\tcan begin scheduling tasks on the instance again.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To update the state of a container instance\",\n                        \"documentation\": \"This example updates the state of the specified container instance in the default cluster to DRAINING. \",\n                        \"input\": {\n                            \"cluster\": \"default\",\n                            \"containerInstances\": [\n                                \"1c3be8ed-df30-47b4-8f1e-6e68ebd01f34\"\n                            ],\n                            \"status\": \"DRAINING\"\n                        },\n                        \"output\": {\n                            \"containerInstances\": [\n                                {\n                                    \"agentConnected\": true,\n                                    \"attributes\": [\n                                        {\n                                            \"name\": \"ecs.availability-zone\",\n                                            \"value\": \"us-west-2b\"\n                                        },\n                                        {\n                                            \"name\": \"com.amazonaws.ecs.capability.logging-driver.syslog\"\n                                        },\n                                        {\n                                            \"name\": \"ecs.instance-type\",\n                                            \"value\": \"c4.xlarge\"\n                                        },\n                                        {\n                                            \"name\": \"ecs.ami-id\",\n                                            \"value\": \"ami-a2ca61c2\"\n                                        },\n                                        {\n                                            \"name\": \"com.amazonaws.ecs.capability.task-iam-role-network-host\"\n                                        },\n                                        {\n                                            \"name\": \"com.amazonaws.ecs.capability.logging-driver.awslogs\"\n                                        },\n                                        {\n                                            \"name\": \"com.amazonaws.ecs.capability.logging-driver.json-file\"\n                                        },\n                                        {\n                                            \"name\": \"com.amazonaws.ecs.capability.docker-remote-api.1.17\"\n                                        },\n                                        {\n                                            \"name\": \"com.amazonaws.ecs.capability.privileged-container\"\n                                        },\n                                        {\n                                            \"name\": \"com.amazonaws.ecs.capability.docker-remote-api.1.18\"\n                                        },\n                                        {\n                                            \"name\": \"com.amazonaws.ecs.capability.docker-remote-api.1.19\"\n                                        },\n                                        {\n                                            \"name\": \"com.amazonaws.ecs.capability.ecr-auth\"\n                                        },\n                                        {\n                                            \"name\": \"ecs.os-type\",\n                                            \"value\": \"linux\"\n                                        },\n                                        {\n                                            \"name\": \"com.amazonaws.ecs.capability.docker-remote-api.1.20\"\n                                        },\n                                        {\n                                            \"name\": \"com.amazonaws.ecs.capability.docker-remote-api.1.21\"\n                                        },\n                                        {\n                                            \"name\": \"com.amazonaws.ecs.capability.docker-remote-api.1.22\"\n                                        },\n                                        {\n                                            \"name\": \"com.amazonaws.ecs.capability.task-iam-role\"\n                                        },\n                                        {\n                                            \"name\": \"com.amazonaws.ecs.capability.docker-remote-api.1.23\"\n                                        }\n                                    ],\n                                    \"containerInstanceArn\": \"arn:aws:ecs:us-west-2:012345678910:container-instance/default/1c3be8ed-df30-47b4-8f1e-6e68ebd01f34\",\n                                    \"ec2InstanceId\": \"i-05d99c76955727ec6\",\n                                    \"pendingTasksCount\": 0,\n                                    \"registeredResources\": [\n                                        {\n                                            \"doubleValue\": 0,\n                                            \"integerValue\": 4096,\n                                            \"longValue\": 0,\n                                            \"name\": \"CPU\",\n                                            \"type\": \"INTEGER\"\n                                        },\n                                        {\n                                            \"doubleValue\": 0,\n                                            \"integerValue\": 7482,\n                                            \"longValue\": 0,\n                                            \"name\": \"MEMORY\",\n                                            \"type\": \"INTEGER\"\n                                        },\n                                        {\n                                            \"doubleValue\": 0,\n                                            \"integerValue\": 0,\n                                            \"longValue\": 0,\n                                            \"name\": \"PORTS\",\n                                            \"stringSetValue\": [\n                                                \"22\",\n                                                \"2376\",\n                                                \"2375\",\n                                                \"51678\",\n                                                \"51679\"\n                                            ],\n                                            \"type\": \"STRINGSET\"\n                                        },\n                                        {\n                                            \"doubleValue\": 0,\n                                            \"integerValue\": 0,\n                                            \"longValue\": 0,\n                                            \"name\": \"PORTS_UDP\",\n                                            \"stringSetValue\": [],\n                                            \"type\": \"STRINGSET\"\n                                        }\n                                    ],\n                                    \"remainingResources\": [\n                                        {\n                                            \"doubleValue\": 0,\n                                            \"integerValue\": 4096,\n                                            \"longValue\": 0,\n                                            \"name\": \"CPU\",\n                                            \"type\": \"INTEGER\"\n                                        },\n                                        {\n                                            \"doubleValue\": 0,\n                                            \"integerValue\": 7482,\n                                            \"longValue\": 0,\n                                            \"name\": \"MEMORY\",\n                                            \"type\": \"INTEGER\"\n                                        },\n                                        {\n                                            \"doubleValue\": 0,\n                                            \"integerValue\": 0,\n                                            \"longValue\": 0,\n                                            \"name\": \"PORTS\",\n                                            \"stringSetValue\": [\n                                                \"22\",\n                                                \"2376\",\n                                                \"2375\",\n                                                \"51678\",\n                                                \"51679\"\n                                            ],\n                                            \"type\": \"STRINGSET\"\n                                        },\n                                        {\n                                            \"doubleValue\": 0,\n                                            \"integerValue\": 0,\n                                            \"longValue\": 0,\n                                            \"name\": \"PORTS_UDP\",\n                                            \"stringSetValue\": [],\n                                            \"type\": \"STRINGSET\"\n                                        }\n                                    ],\n                                    \"runningTasksCount\": 0,\n                                    \"status\": \"DRAINING\",\n                                    \"version\": 30,\n                                    \"versionInfo\": {\n                                        \"agentHash\": \"efe53c6\",\n                                        \"agentVersion\": \"1.13.1\",\n                                        \"dockerVersion\": \"DockerVersion: 1.11.2\"\n                                    }\n                                }\n                            ],\n                            \"failures\": []\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ecs#UpdateContainerInstancesStateRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"cluster\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The short name or full Amazon Resource Name (ARN) of the cluster that hosts the container instance to\\n\\t\\t\\tupdate. If you do not specify a cluster, the default cluster is assumed.</p>\"\n                    }\n                },\n                \"containerInstances\": {\n                    \"target\": \"com.amazonaws.ecs#StringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of up to 10 container instance IDs or full ARN entries.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"status\": {\n                    \"target\": \"com.amazonaws.ecs#ContainerInstanceStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The container instance state to update the container instance with. The only valid\\n\\t\\t\\tvalues for this action are <code>ACTIVE</code> and <code>DRAINING</code>. A container\\n\\t\\t\\tinstance can only be updated to <code>DRAINING</code> status once it has reached an\\n\\t\\t\\t\\t<code>ACTIVE</code> state. If a container instance is in <code>REGISTERING</code>,\\n\\t\\t\\t\\t<code>DEREGISTERING</code>, or <code>REGISTRATION_FAILED</code> state you can\\n\\t\\t\\tdescribe the container instance but can't update the container instance state.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ecs#UpdateContainerInstancesStateResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"containerInstances\": {\n                    \"target\": \"com.amazonaws.ecs#ContainerInstances\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The list of container instances.</p>\"\n                    }\n                },\n                \"failures\": {\n                    \"target\": \"com.amazonaws.ecs#Failures\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Any failures associated with the call.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ecs#UpdateInProgressException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> Message that describes the cause of the exception.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>There's already a current Amazon ECS container agent update in progress on the container\\n\\t\\t\\tinstance that's specified. If the container agent becomes disconnected while it's in a\\n\\t\\t\\ttransitional stage, such as <code>PENDING</code> or <code>STAGING</code>, the update\\n\\t\\t\\tprocess can get stuck in that state. However, when the agent reconnects, it resumes\\n\\t\\t\\twhere it stopped previously.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.ecs#UpdateManagedInstancesProviderConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"infrastructureRoleArn\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The updated Amazon Resource Name (ARN) of the infrastructure role. The new role must have the necessary permissions to manage instances and access required Amazon Web Services services.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/infrastructure_IAM_role.html\\\">Amazon ECS infrastructure IAM role</a> in the <i>Amazon ECS Developer Guide</i>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"instanceLaunchTemplate\": {\n                    \"target\": \"com.amazonaws.ecs#InstanceLaunchTemplateUpdate\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The updated launch template configuration. Changes to the launch template affect new instances launched after the update, while existing instances continue to use their original configuration.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"propagateTags\": {\n                    \"target\": \"com.amazonaws.ecs#PropagateMITags\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The updated tag propagation setting. When changed, this affects only new instances launched after the update.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The updated configuration for a Amazon ECS Managed Instances provider. You can modify the infrastructure role, instance launch template, and tag propagation settings. Changes apply to new instances launched after the update.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#UpdateService\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ecs#UpdateServiceRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ecs#UpdateServiceResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.ecs#AccessDeniedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ClientException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ClusterNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#NamespaceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#PlatformTaskDefinitionIncompatibilityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#PlatformUnknownException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ServerException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ServiceNotActiveException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ServiceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#UnsupportedFeatureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Modifies the parameters of a service.</p>\\n         <note>\\n            <p>On March 21, 2024, a change was made to resolve the task definition revision before authorization. When a task definition revision is not specified, authorization will occur using the latest revision of a task definition.</p>\\n         </note>\\n         <p>For services using the rolling update (<code>ECS</code>) you can update the desired\\n\\t\\t\\tcount, deployment configuration, network configuration, load balancers, service\\n\\t\\t\\tregistries, enable ECS managed tags option, propagate tags option, task placement\\n\\t\\t\\tconstraints and strategies, and task definition. When you update any of these\\n\\t\\t\\tparameters, Amazon ECS starts new tasks with the new configuration. </p>\\n         <p>You can attach Amazon EBS volumes to Amazon ECS tasks by configuring the volume when starting or\\n\\t\\t\\trunning a task, or when creating or updating a service. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ebs-volumes.html#ebs-volume-types\\\">Amazon EBS volumes</a> in the <i>Amazon Elastic Container Service Developer Guide</i>. You can update\\n\\t\\t\\tyour volume configurations and trigger a new deployment.\\n\\t\\t\\t\\t<code>volumeConfigurations</code> is only supported for REPLICA service and not\\n\\t\\t\\tDAEMON service. If you leave <code>volumeConfigurations</code>\\n            <code>null</code>, it doesn't trigger a new deployment. For more information on volumes,\\n\\t\\t\\tsee <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ebs-volumes.html#ebs-volume-types\\\">Amazon EBS volumes</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\\n         <p>For services using the blue/green (<code>CODE_DEPLOY</code>) deployment controller,\\n\\t\\t\\tonly the desired count, deployment configuration, health check grace period, task\\n\\t\\t\\tplacement constraints and strategies, enable ECS managed tags option, and propagate tags\\n\\t\\t\\tcan be updated using this API. If the network configuration, platform version, task\\n\\t\\t\\tdefinition, or load balancer need to be updated, create a new CodeDeploy deployment. For more\\n\\t\\t\\tinformation, see <a href=\\\"https://docs.aws.amazon.com/codedeploy/latest/APIReference/API_CreateDeployment.html\\\">CreateDeployment</a> in the <i>CodeDeploy API Reference</i>.</p>\\n         <p>For services using an external deployment controller, you can update only the desired\\n\\t\\t\\tcount, task placement constraints and strategies, health check grace period, enable ECS\\n\\t\\t\\tmanaged tags option, and propagate tags option, using this API. If the launch type, load\\n\\t\\t\\tbalancer, network configuration, platform version, or task definition need to be\\n\\t\\t\\tupdated, create a new task set For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_CreateTaskSet.html\\\">CreateTaskSet</a>.</p>\\n         <p>You can add to or subtract from the number of instantiations of a task definition in a\\n\\t\\t\\tservice by specifying the cluster that the service is running in and a new\\n\\t\\t\\t\\t<code>desiredCount</code> parameter.</p>\\n         <p>You can attach Amazon EBS volumes to Amazon ECS tasks by configuring the volume when starting or\\n\\t\\t\\trunning a task, or when creating or updating a service. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ebs-volumes.html#ebs-volume-types\\\">Amazon EBS volumes</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\\n         <p>If you have updated the container image of your application, you can create a new task\\n\\t\\t\\tdefinition with that image and deploy it to your service. The service scheduler uses the\\n\\t\\t\\tminimum healthy percent and maximum percent parameters (in the service's deployment\\n\\t\\t\\tconfiguration) to determine the deployment strategy.</p>\\n         <note>\\n            <p>If your updated Docker image uses the same tag as what is in the existing task\\n\\t\\t\\t\\tdefinition for your service (for example, <code>my_image:latest</code>), you don't\\n\\t\\t\\t\\tneed to create a new revision of your task definition. You can update the service\\n\\t\\t\\t\\tusing the <code>forceNewDeployment</code> option. The new tasks launched by the\\n\\t\\t\\t\\tdeployment pull the current image/tag combination from your repository when they\\n\\t\\t\\t\\tstart.</p>\\n         </note>\\n         <p>You can also update the deployment configuration of a service. When a deployment is\\n\\t\\t\\ttriggered by updating the task definition of a service, the service scheduler uses the\\n\\t\\t\\tdeployment configuration parameters, <code>minimumHealthyPercent</code> and\\n\\t\\t\\t\\t<code>maximumPercent</code>, to determine the deployment strategy.</p>\\n         <ul>\\n            <li>\\n               <p>If <code>minimumHealthyPercent</code> is below 100%, the scheduler can ignore\\n\\t\\t\\t\\t\\t\\t<code>desiredCount</code> temporarily during a deployment. For example, if\\n\\t\\t\\t\\t\\t\\t<code>desiredCount</code> is four tasks, a minimum of 50% allows the\\n\\t\\t\\t\\t\\tscheduler to stop two existing tasks before starting two new tasks. Tasks for\\n\\t\\t\\t\\t\\tservices that don't use a load balancer are considered healthy if they're in the\\n\\t\\t\\t\\t\\t\\t<code>RUNNING</code> state. Tasks for services that use a load balancer are\\n\\t\\t\\t\\t\\tconsidered healthy if they're in the <code>RUNNING</code> state and are reported\\n\\t\\t\\t\\t\\tas healthy by the load balancer.</p>\\n            </li>\\n            <li>\\n               <p>The <code>maximumPercent</code> parameter represents an upper limit on the\\n\\t\\t\\t\\t\\tnumber of running tasks during a deployment. You can use it to define the\\n\\t\\t\\t\\t\\tdeployment batch size. For example, if <code>desiredCount</code> is four tasks,\\n\\t\\t\\t\\t\\ta maximum of 200% starts four new tasks before stopping the four older tasks\\n\\t\\t\\t\\t\\t(provided that the cluster resources required to do this are available).</p>\\n            </li>\\n         </ul>\\n         <p>When <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_UpdateService.html\\\">UpdateService</a>\\n\\t\\t\\tstops a task during a deployment, the equivalent of <code>docker stop</code> is issued\\n\\t\\t\\tto the containers running in the task. This results in a <code>SIGTERM</code> and a\\n\\t\\t\\t30-second timeout. After this, <code>SIGKILL</code> is sent and the containers are\\n\\t\\t\\tforcibly stopped. If the container handles the <code>SIGTERM</code> gracefully and exits\\n\\t\\t\\twithin 30 seconds from receiving it, no <code>SIGKILL</code> is sent.</p>\\n         <p>When the service scheduler launches new tasks, it determines task placement in your\\n\\t\\t\\tcluster with the following logic.</p>\\n         <ul>\\n            <li>\\n               <p>Determine which of the container instances in your cluster can support your\\n\\t\\t\\t\\t\\tservice's task definition. For example, they have the required CPU, memory,\\n\\t\\t\\t\\t\\tports, and container instance attributes.</p>\\n            </li>\\n            <li>\\n               <p>By default, the service scheduler attempts to balance tasks across\\n\\t\\t\\t\\t\\tAvailability Zones in this manner even though you can choose a different\\n\\t\\t\\t\\t\\tplacement strategy.</p>\\n               <ul>\\n                  <li>\\n                     <p>Sort the valid container instances by the fewest number of running\\n\\t\\t\\t\\t\\t\\t\\ttasks for this service in the same Availability Zone as the instance.\\n\\t\\t\\t\\t\\t\\t\\tFor example, if zone A has one running service task and zones B and C\\n\\t\\t\\t\\t\\t\\t\\teach have zero, valid container instances in either zone B or C are\\n\\t\\t\\t\\t\\t\\t\\tconsidered optimal for placement.</p>\\n                  </li>\\n                  <li>\\n                     <p>Place the new service task on a valid container instance in an optimal\\n\\t\\t\\t\\t\\t\\t\\tAvailability Zone (based on the previous steps), favoring container\\n\\t\\t\\t\\t\\t\\t\\tinstances with the fewest number of running tasks for this\\n\\t\\t\\t\\t\\t\\t\\tservice.</p>\\n                  </li>\\n               </ul>\\n            </li>\\n         </ul>\\n         <p>When the service scheduler stops running tasks, it attempts to maintain balance across\\n\\t\\t\\tthe Availability Zones in your cluster using the following logic: </p>\\n         <ul>\\n            <li>\\n               <p>Sort the container instances by the largest number of running tasks for this\\n\\t\\t\\t\\t\\tservice in the same Availability Zone as the instance. For example, if zone A\\n\\t\\t\\t\\t\\thas one running service task and zones B and C each have two, container\\n\\t\\t\\t\\t\\tinstances in either zone B or C are considered optimal for termination.</p>\\n            </li>\\n            <li>\\n               <p>Stop the task on a container instance in an optimal Availability Zone (based\\n\\t\\t\\t\\t\\ton the previous steps), favoring container instances with the largest number of\\n\\t\\t\\t\\t\\trunning tasks for this service.</p>\\n            </li>\\n         </ul>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To change the number of tasks in a service\",\n                        \"documentation\": \"This example updates the desired count of the my-http-service service to 10.\",\n                        \"input\": {\n                            \"service\": \"my-http-service\",\n                            \"desiredCount\": 10\n                        },\n                        \"output\": {}\n                    },\n                    {\n                        \"title\": \"To change the task definition used in a service\",\n                        \"documentation\": \"This example updates the my-http-service service to use the amazon-ecs-sample task definition.\",\n                        \"input\": {\n                            \"service\": \"my-http-service\",\n                            \"taskDefinition\": \"amazon-ecs-sample\"\n                        },\n                        \"output\": {}\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ecs#UpdateServicePrimaryTaskSet\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ecs#UpdateServicePrimaryTaskSetRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ecs#UpdateServicePrimaryTaskSetResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.ecs#AccessDeniedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ClientException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ClusterNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ServerException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ServiceNotActiveException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ServiceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#TaskSetNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#UnsupportedFeatureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Modifies which task set in a service is the primary task set. Any parameters that are\\n\\t\\t\\tupdated on the primary task set in a service will transition to the service. This is\\n\\t\\t\\tused when a service uses the <code>EXTERNAL</code> deployment controller type. For more\\n\\t\\t\\tinformation, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/deployment-types.html\\\">Amazon ECS Deployment\\n\\t\\t\\t\\tTypes</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To update the primary task set for a service\",\n                        \"documentation\": \"This example updates the primary task set for a service MyService that uses the EXTERNAL deployment controller type. \",\n                        \"input\": {\n                            \"cluster\": \"MyCluster\",\n                            \"service\": \"MyService\",\n                            \"primaryTaskSet\": \"arn:aws:ecs:us-west-2:123456789012:task-set/MyCluster/MyService/ecs-svc/1234567890123456789\"\n                        },\n                        \"output\": {\n                            \"taskSet\": {\n                                \"id\": \"ecs-svc/1234567890123456789\",\n                                \"taskSetArn\": \"arn:aws:ecs:us-west-2:123456789012:task-set/MyCluster/MyService/ecs-svc/1234567890123456789\",\n                                \"status\": \"PRIMARY\",\n                                \"taskDefinition\": \"arn:aws:ecs:us-west-2:123456789012:task-definition/sample-fargate:2\",\n                                \"computedDesiredCount\": 1,\n                                \"pendingCount\": 0,\n                                \"runningCount\": 0,\n                                \"createdAt\": 1.557128360711E9,\n                                \"updatedAt\": 1.557129412653E9,\n                                \"launchType\": \"EC2\",\n                                \"networkConfiguration\": {\n                                    \"awsvpcConfiguration\": {\n                                        \"subnets\": [\n                                            \"subnet-12344321\"\n                                        ],\n                                        \"securityGroups\": [\n                                            \"sg-12344312\"\n                                        ],\n                                        \"assignPublicIp\": \"DISABLED\"\n                                    }\n                                },\n                                \"loadBalancers\": [],\n                                \"serviceRegistries\": [],\n                                \"scale\": {\n                                    \"value\": 50,\n                                    \"unit\": \"PERCENT\"\n                                },\n                                \"stabilityStatus\": \"STABILIZING\",\n                                \"stabilityStatusAt\": 1.557129279914E9\n                            }\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ecs#UpdateServicePrimaryTaskSetRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"cluster\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The short name or full Amazon Resource Name (ARN) of the cluster that hosts the service that the task\\n\\t\\t\\tset exists in.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"service\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The short name or full Amazon Resource Name (ARN) of the service that the task set exists in.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"primaryTaskSet\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The short name or full Amazon Resource Name (ARN) of the task set to set as the primary task set in the\\n\\t\\t\\tdeployment.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ecs#UpdateServicePrimaryTaskSetResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"taskSet\": {\n                    \"target\": \"com.amazonaws.ecs#TaskSet\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The details about the task set.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ecs#UpdateServiceRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"cluster\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The short name or full Amazon Resource Name (ARN) of the cluster that your service runs on.\\n\\t\\t\\tIf you do not specify a cluster, the default cluster is assumed.</p>\\n         <p>You can't change the cluster name.</p>\"\n                    }\n                },\n                \"service\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the service to update.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"desiredCount\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedInteger\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of instantiations of the task to place and keep running in your\\n\\t\\t\\tservice.</p>\\n         <p>This parameter doesn't trigger a new service deployment.</p>\"\n                    }\n                },\n                \"taskDefinition\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>family</code> and <code>revision</code> (<code>family:revision</code>) or\\n\\t\\t\\tfull ARN of the task definition to run in your service. If a <code>revision</code> is\\n\\t\\t\\tnot specified, the latest <code>ACTIVE</code> revision is used. If you modify the task\\n\\t\\t\\tdefinition with <code>UpdateService</code>, Amazon ECS spawns a task with the new version of\\n\\t\\t\\tthe task definition and then stops an old task after the new version is running.</p>\\n         <p>This parameter triggers a new service deployment.</p>\"\n                    }\n                },\n                \"capacityProviderStrategy\": {\n                    \"target\": \"com.amazonaws.ecs#CapacityProviderStrategy\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The details of a capacity provider strategy. You can set a capacity provider when you\\n\\t\\t\\tcreate a cluster, run a task, or update a service.</p>\\n         <p>When you use Fargate, the capacity providers are <code>FARGATE</code> or\\n\\t\\t\\t\\t<code>FARGATE_SPOT</code>.</p>\\n         <p>When you use Amazon EC2, the capacity providers are Auto Scaling groups.</p>\\n         <p>You can change capacity providers for rolling deployments and blue/green\\n\\t\\t\\tdeployments.</p>\\n         <p>The following list provides the valid transitions:</p>\\n         <ul>\\n            <li>\\n               <p>Update the Fargate launch type to an Auto Scaling group capacity provider.</p>\\n            </li>\\n            <li>\\n               <p>Update the Amazon EC2 launch type to a Fargate capacity provider.</p>\\n            </li>\\n            <li>\\n               <p>Update the Fargate capacity provider to an Auto Scaling group capacity provider.</p>\\n            </li>\\n            <li>\\n               <p>Update the Amazon EC2 capacity provider to a Fargate capacity provider. </p>\\n            </li>\\n            <li>\\n               <p>Update the Auto Scaling group or Fargate capacity provider back to the launch type.</p>\\n               <p>Pass an empty list in the <code>capacityProviderStrategy</code> parameter.</p>\\n            </li>\\n         </ul>\\n         <p>For information about Amazon Web Services CDK considerations, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/update-service-parameters.html\\\">Amazon Web Services CDK considerations</a>.</p>\\n         <p>This parameter doesn't trigger a new service deployment.</p>\"\n                    }\n                },\n                \"deploymentConfiguration\": {\n                    \"target\": \"com.amazonaws.ecs#DeploymentConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Optional deployment parameters that control how many tasks run during the deployment\\n\\t\\t\\tand the ordering of stopping and starting tasks.</p>\\n         <p>This parameter doesn't trigger a new service deployment.</p>\"\n                    }\n                },\n                \"availabilityZoneRebalancing\": {\n                    \"target\": \"com.amazonaws.ecs#AvailabilityZoneRebalancing\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether to use Availability Zone rebalancing for the service.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-rebalancing.html\\\">Balancing an Amazon ECS service across Availability Zones</a> in\\n\\t\\t\\tthe <i>\\n               <i>Amazon Elastic Container Service Developer Guide</i>\\n            </i>.</p>\\n         <p>The default behavior of <code>AvailabilityZoneRebalancing</code> differs between create and update requests:</p>\\n         <ul>\\n            <li>\\n               <p>For create service requests, when no value is specified for <code>AvailabilityZoneRebalancing</code>, Amazon ECS defaults the value to <code>ENABLED</code>.</p>\\n            </li>\\n            <li>\\n               <p>For update service requests, when no value is specified for <code>AvailabilityZoneRebalancing</code>, Amazon ECS defaults to the existing service’s <code>AvailabilityZoneRebalancing</code> value. If the service never had an <code>AvailabilityZoneRebalancing</code> value set, Amazon ECS treats this as <code>DISABLED</code>.</p>\\n            </li>\\n         </ul>\\n         <p>This parameter doesn't trigger a new service deployment.</p>\"\n                    }\n                },\n                \"networkConfiguration\": {\n                    \"target\": \"com.amazonaws.ecs#NetworkConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An object representing the network configuration for the service.</p>\\n         <p>This parameter triggers a new service deployment.</p>\"\n                    }\n                },\n                \"placementConstraints\": {\n                    \"target\": \"com.amazonaws.ecs#PlacementConstraints\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An array of task placement constraint objects to update the service to use. If no\\n\\t\\t\\tvalue is specified, the existing placement constraints for the service will remain\\n\\t\\t\\tunchanged. If this value is specified, it will override any existing placement\\n\\t\\t\\tconstraints defined for the service. To remove all existing placement constraints,\\n\\t\\t\\tspecify an empty array.</p>\\n         <p>You can specify a maximum of 10 constraints for each task. This limit includes\\n\\t\\t\\tconstraints in the task definition and those specified at runtime.</p>\\n         <p>This parameter doesn't trigger a new service deployment.</p>\"\n                    }\n                },\n                \"placementStrategy\": {\n                    \"target\": \"com.amazonaws.ecs#PlacementStrategies\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The task placement strategy objects to update the service to use. If no value is\\n\\t\\t\\tspecified, the existing placement strategy for the service will remain unchanged. If\\n\\t\\t\\tthis value is specified, it will override the existing placement strategy defined for\\n\\t\\t\\tthe service. To remove an existing placement strategy, specify an empty object.</p>\\n         <p>You can specify a maximum of five strategy rules for each service.</p>\\n         <p>This parameter doesn't trigger a new service deployment.</p>\"\n                    }\n                },\n                \"platformVersion\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The platform version that your tasks in the service run on. A platform version is only\\n\\t\\t\\tspecified for tasks using the Fargate launch type. If a platform version\\n\\t\\t\\tis not specified, the <code>LATEST</code> platform version is used. For more\\n\\t\\t\\tinformation, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/platform_versions.html\\\">Fargate Platform\\n\\t\\t\\t\\tVersions</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\\n         <p>This parameter triggers a new service deployment.</p>\"\n                    }\n                },\n                \"forceNewDeployment\": {\n                    \"target\": \"com.amazonaws.ecs#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Determines whether to force a new deployment of the service. By default, deployments\\n\\t\\t\\taren't forced. You can use this option to start a new deployment with no service\\n\\t\\t\\tdefinition changes. For example, you can update a service's tasks to use a newer Docker\\n\\t\\t\\timage with the same image/tag combination (<code>my_image:latest</code>) or to roll\\n\\t\\t\\tFargate tasks onto a newer platform version.</p>\"\n                    }\n                },\n                \"healthCheckGracePeriodSeconds\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedInteger\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The period of time, in seconds, that the Amazon ECS service scheduler ignores unhealthy\\n\\t\\t\\tElastic Load Balancing, VPC Lattice, and container health checks after a task has first started. If you don't\\n\\t\\t\\tspecify a health check grace period value, the default value of <code>0</code> is used.\\n\\t\\t\\tIf you don't use any of the health checks, then\\n\\t\\t\\t\\t<code>healthCheckGracePeriodSeconds</code> is unused.</p>\\n         <p>If your service's tasks take a while to start and respond to health checks, you can\\n\\t\\t\\tspecify a health check grace period of up to 2,147,483,647 seconds (about 69 years).\\n\\t\\t\\tDuring that time, the Amazon ECS service scheduler ignores health check status. This grace\\n\\t\\t\\tperiod can prevent the service scheduler from marking tasks as unhealthy and stopping\\n\\t\\t\\tthem before they have time to come up.</p>\\n         <p>If your service has more running tasks than desired, unhealthy tasks in the grace period might be stopped to reach the desired count.</p>\\n         <p>This parameter doesn't trigger a new service deployment.</p>\"\n                    }\n                },\n                \"deploymentController\": {\n                    \"target\": \"com.amazonaws.ecs#DeploymentController\"\n                },\n                \"enableExecuteCommand\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedBoolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If <code>true</code>, this enables execute command functionality on all task\\n\\t\\t\\tcontainers.</p>\\n         <p>If you do not want to override the value that was set when the service was created,\\n\\t\\t\\tyou can set this to <code>null</code> when performing this action.</p>\\n         <p>This parameter doesn't trigger a new service deployment.</p>\"\n                    }\n                },\n                \"enableECSManagedTags\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedBoolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Determines whether to turn on Amazon ECS managed tags for the tasks in the service. For\\n\\t\\t\\tmore information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-using-tags.html\\\">Tagging Your Amazon ECS\\n\\t\\t\\t\\tResources</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\\n         <p>Only tasks launched after the update will reflect the update. To update the tags on\\n\\t\\t\\tall tasks, set <code>forceNewDeployment</code> to <code>true</code>, so that Amazon ECS\\n\\t\\t\\tstarts new tasks with the updated tags.</p>\\n         <p>This parameter doesn't trigger a new service deployment.</p>\"\n                    }\n                },\n                \"loadBalancers\": {\n                    \"target\": \"com.amazonaws.ecs#LoadBalancers\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<note>\\n            <p>You must have a service-linked role when you update this property</p>\\n         </note>\\n         <p>A list of Elastic Load Balancing load balancer objects. It contains the load balancer name, the\\n\\t\\t\\tcontainer name, and the container port to access from the load balancer. The container\\n\\t\\t\\tname is as it appears in a container definition.</p>\\n         <p>When you add, update, or remove a load balancer configuration, Amazon ECS starts new tasks\\n\\t\\t\\twith the updated Elastic Load Balancing configuration, and then stops the old tasks when the new tasks\\n\\t\\t\\tare running.</p>\\n         <p>For services that use rolling updates, you can add, update, or remove Elastic Load Balancing target\\n\\t\\t\\tgroups. You can update from a single target group to multiple target groups and from\\n\\t\\t\\tmultiple target groups to a single target group.</p>\\n         <p>For services that use blue/green deployments, you can update Elastic Load Balancing target groups by\\n\\t\\t\\tusing <code>\\n               <a href=\\\"https://docs.aws.amazon.com/codedeploy/latest/APIReference/API_CreateDeployment.html\\\">CreateDeployment</a>\\n            </code> through CodeDeploy. Note that multiple target groups\\n\\t\\t\\tare not supported for blue/green deployments. For more information see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/register-multiple-targetgroups.html\\\">Register\\n\\t\\t\\t\\tmultiple target groups with a service</a> in the <i>Amazon Elastic Container Service Developer Guide</i>. </p>\\n         <p>For services that use the external deployment controller, you can add, update, or\\n\\t\\t\\tremove load balancers by using <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_CreateTaskSet.html\\\">CreateTaskSet</a>.\\n\\t\\t\\tNote that multiple target groups are not supported for external deployments. For more\\n\\t\\t\\tinformation see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/register-multiple-targetgroups.html\\\">Register\\n\\t\\t\\t\\tmultiple target groups with a service</a> in the <i>Amazon Elastic Container Service Developer Guide</i>. </p>\\n         <p>You can remove existing <code>loadBalancers</code> by passing an empty list.</p>\\n         <p>This parameter triggers a new service deployment.</p>\"\n                    }\n                },\n                \"propagateTags\": {\n                    \"target\": \"com.amazonaws.ecs#PropagateTags\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Determines whether to propagate the tags from the task definition or the service to\\n\\t\\t\\tthe task. If no value is specified, the tags aren't propagated.</p>\\n         <p>Only tasks launched after the update will reflect the update. To update the tags on\\n\\t\\t\\tall tasks, set <code>forceNewDeployment</code> to <code>true</code>, so that Amazon ECS\\n\\t\\t\\tstarts new tasks with the updated tags.</p>\\n         <p>This parameter doesn't trigger a new service deployment.</p>\"\n                    }\n                },\n                \"serviceRegistries\": {\n                    \"target\": \"com.amazonaws.ecs#ServiceRegistries\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<note>\\n            <p>You must have a service-linked role when you update this property.</p>\\n            <p>For more information about the role see the <code>CreateService</code> request\\n\\t\\t\\t\\tparameter <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_CreateService.html#ECS-CreateService-request-role\\\">\\n                  <code>role</code>\\n               </a>. </p>\\n         </note>\\n         <p>The details for the service discovery registries to assign to this service. For more\\n\\t\\t\\tinformation, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-discovery.html\\\">Service\\n\\t\\t\\t\\tDiscovery</a>.</p>\\n         <p>When you add, update, or remove the service registries configuration, Amazon ECS starts new\\n\\t\\t\\ttasks with the updated service registries configuration, and then stops the old tasks\\n\\t\\t\\twhen the new tasks are running.</p>\\n         <p>You can remove existing <code>serviceRegistries</code> by passing an empty\\n\\t\\t\\tlist.</p>\\n         <p>This parameter triggers a new service deployment.</p>\"\n                    }\n                },\n                \"serviceConnectConfiguration\": {\n                    \"target\": \"com.amazonaws.ecs#ServiceConnectConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The configuration for this service to discover and connect to\\n\\tservices, and be discovered by, and connected from, other services within a namespace.</p>\\n         <p>Tasks that run in a namespace can use short names to connect\\n\\tto services in the namespace. Tasks can connect to services across all of the clusters in the namespace.\\n\\tTasks connect through a managed proxy container\\n\\tthat collects logs and metrics for increased visibility.\\n\\tOnly the tasks that Amazon ECS services create are supported with Service Connect.\\n\\tFor more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-connect.html\\\">Service Connect</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\\n         <p>This parameter triggers a new service deployment.</p>\"\n                    }\n                },\n                \"volumeConfigurations\": {\n                    \"target\": \"com.amazonaws.ecs#ServiceVolumeConfigurations\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The details of the volume that was <code>configuredAtLaunch</code>. You can configure\\n\\t\\t\\tthe size, volumeType, IOPS, throughput, snapshot and encryption in <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/APIReference/API_ServiceManagedEBSVolumeConfiguration.html\\\">ServiceManagedEBSVolumeConfiguration</a>. The <code>name</code> of the volume\\n\\t\\t\\tmust match the <code>name</code> from the task definition. If set to null, no new\\n\\t\\t\\tdeployment is triggered. Otherwise, if this configuration differs from the existing one,\\n\\t\\t\\tit triggers a new deployment.</p>\\n         <p>This parameter triggers a new service deployment.</p>\"\n                    }\n                },\n                \"vpcLatticeConfigurations\": {\n                    \"target\": \"com.amazonaws.ecs#VpcLatticeConfigurations\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An object representing the VPC Lattice configuration for the service being\\n\\t\\t\\tupdated.</p>\\n         <p>This parameter triggers a new service deployment.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ecs#UpdateServiceResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"service\": {\n                    \"target\": \"com.amazonaws.ecs#Service\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The full description of your service following the update call.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ecs#UpdateTaskProtection\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ecs#UpdateTaskProtectionRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ecs#UpdateTaskProtectionResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.ecs#AccessDeniedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ClientException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ClusterNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ServerException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#UnsupportedFeatureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Updates the protection status of a task. You can set <code>protectionEnabled</code> to\\n\\t\\t\\t\\t<code>true</code> to protect your task from termination during scale-in events from\\n\\t\\t\\t\\t<a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-auto-scaling.html\\\">Service\\n\\t\\t\\t\\tAutoscaling</a> or <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/deployment-types.html\\\">deployments</a>.</p>\\n         <p>Task-protection, by default, expires after 2 hours at which point Amazon ECS clears the\\n\\t\\t\\t\\t<code>protectionEnabled</code> property making the task eligible for termination by\\n\\t\\t\\ta subsequent scale-in event.</p>\\n         <p>You can specify a custom expiration period for task protection from 1 minute to up to\\n\\t\\t\\t2,880 minutes (48 hours). To specify the custom expiration period, set the\\n\\t\\t\\t\\t<code>expiresInMinutes</code> property. The <code>expiresInMinutes</code> property\\n\\t\\t\\tis always reset when you invoke this operation for a task that already has\\n\\t\\t\\t\\t<code>protectionEnabled</code> set to <code>true</code>. You can keep extending the\\n\\t\\t\\tprotection expiration period of a task by invoking this operation repeatedly.</p>\\n         <p>To learn more about Amazon ECS task protection, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-scale-in-protection.html\\\">Task scale-in\\n\\t\\t\\t\\tprotection</a> in the <i>\\n               <i>Amazon Elastic Container Service Developer Guide</i>\\n            </i>.</p>\\n         <note>\\n            <p>This operation is only supported for tasks belonging to an Amazon ECS service. Invoking\\n\\t\\t\\t\\tthis operation for a standalone task will result in an <code>TASK_NOT_VALID</code>\\n\\t\\t\\t\\tfailure. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/api_failures_messages.html\\\">API failure\\n\\t\\t\\t\\t\\treasons</a>.</p>\\n         </note>\\n         <important>\\n            <p>If you prefer to set task protection from within the container, we recommend using\\n\\t\\t\\t\\tthe <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-scale-in-protection-endpoint.html\\\">Task scale-in protection endpoint</a>.</p>\\n         </important>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To remove task scale-in protection\",\n                        \"documentation\": \"This example removes scale-in protection for a task.\",\n                        \"input\": {\n                            \"cluster\": \"test-task-protection\",\n                            \"tasks\": [\n                                \"b8b1cf532d0e46ba8d44a40d1de16772\"\n                            ],\n                            \"protectionEnabled\": false\n                        },\n                        \"output\": {\n                            \"protectedTasks\": [\n                                {\n                                    \"taskArn\": \"arn:aws:ecs:us-west-2:012345678910:task/default/b8b1cf532d0e46ba8d44a40d1de16772\",\n                                    \"protectionEnabled\": false\n                                }\n                            ],\n                            \"failures\": []\n                        }\n                    },\n                    {\n                        \"title\": \"To set task scale-in protection for a task for 60 minutes\",\n                        \"documentation\": \"This example enables scale-in protection for a task for 60 minutes.\",\n                        \"input\": {\n                            \"cluster\": \"test-task-protection\",\n                            \"tasks\": [\n                                \"b8b1cf532d0e46ba8d44a40d1de16772\"\n                            ],\n                            \"protectionEnabled\": true,\n                            \"expiresInMinutes\": 60\n                        },\n                        \"output\": {\n                            \"protectedTasks\": [\n                                {\n                                    \"taskArn\": \"arn:aws:ecs:us-west-2:012345678910:task/default/b8b1cf532d0e46ba8d44a40d1de16772\",\n                                    \"protectionEnabled\": true,\n                                    \"expirationDate\": \"2022-11-02T06:56:32.553Z\"\n                                }\n                            ],\n                            \"failures\": []\n                        }\n                    },\n                    {\n                        \"title\": \"To set task scale-in protection for the default time period in minutes\",\n                        \"documentation\": \"This example enables task scale-in protection for a task, without specifying the expiresInMinutes parameter, for the default protection period of 120 minutes.\",\n                        \"input\": {\n                            \"cluster\": \"test-task-protection\",\n                            \"tasks\": [\n                                \"b8b1cf532d0e46ba8d44a40d1de16772\"\n                            ],\n                            \"protectionEnabled\": true\n                        },\n                        \"output\": {\n                            \"protectedTasks\": [\n                                {\n                                    \"taskArn\": \"arn:aws:ecs:us-west-2:012345678910:task/default/b8b1cf532d0e46ba8d44a40d1de16772\",\n                                    \"protectionEnabled\": true,\n                                    \"expirationDate\": \"2022-11-02T06:56:32.553Z\"\n                                }\n                            ],\n                            \"failures\": []\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ecs#UpdateTaskProtectionRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"cluster\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The short name or full Amazon Resource Name (ARN) of the cluster that hosts the service that the task\\n\\t\\t\\tsets exist in.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"tasks\": {\n                    \"target\": \"com.amazonaws.ecs#StringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of up to 10 task IDs or full ARN entries.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"protectionEnabled\": {\n                    \"target\": \"com.amazonaws.ecs#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Specify <code>true</code> to mark a task for protection and <code>false</code> to\\n\\t\\t\\tunset protection, making it eligible for termination.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"expiresInMinutes\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedInteger\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If you set <code>protectionEnabled</code> to <code>true</code>, you can specify the\\n\\t\\t\\tduration for task protection in minutes. You can specify a value from 1 minute to up to\\n\\t\\t\\t2,880 minutes (48 hours). During this time, your task will not be terminated by scale-in\\n\\t\\t\\tevents from Service Auto Scaling or deployments. After this time period lapses,\\n\\t\\t\\t\\t<code>protectionEnabled</code> will be reset to <code>false</code>.</p>\\n         <p>If you don’t specify the time, then the task is automatically protected for 120\\n\\t\\t\\tminutes (2 hours).</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ecs#UpdateTaskProtectionResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"protectedTasks\": {\n                    \"target\": \"com.amazonaws.ecs#ProtectedTasks\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of tasks with the following information.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>taskArn</code>: The task ARN.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>protectionEnabled</code>: The protection status of the task. If scale-in\\n\\t\\t\\t\\t\\tprotection is turned on for a task, the value is <code>true</code>. Otherwise,\\n\\t\\t\\t\\t\\tit is <code>false</code>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>expirationDate</code>: The epoch time when protection for the task will\\n\\t\\t\\t\\t\\texpire.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"failures\": {\n                    \"target\": \"com.amazonaws.ecs#Failures\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Any failures associated with the call.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ecs#UpdateTaskSet\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ecs#UpdateTaskSetRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ecs#UpdateTaskSetResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.ecs#AccessDeniedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ClientException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ClusterNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#InvalidParameterException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ServerException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ServiceNotActiveException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#ServiceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#TaskSetNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ecs#UnsupportedFeatureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Modifies a task set. This is used when a service uses the <code>EXTERNAL</code>\\n\\t\\t\\tdeployment controller type. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/deployment-types.html\\\">Amazon ECS Deployment\\n\\t\\t\\t\\tTypes</a> in the <i>Amazon Elastic Container Service Developer Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To update a task set\",\n                        \"documentation\": \"This example updates the task set to adjust the scale.\",\n                        \"input\": {\n                            \"cluster\": \"MyCluster\",\n                            \"service\": \"MyService\",\n                            \"taskSet\": \"arn:aws:ecs:us-west-2:123456789012:task-set/MyCluster/MyService/ecs-svc/1234567890123456789\",\n                            \"scale\": {\n                                \"value\": 50,\n                                \"unit\": \"PERCENT\"\n                            }\n                        },\n                        \"output\": {\n                            \"taskSet\": {\n                                \"id\": \"ecs-svc/1234567890123456789\",\n                                \"taskSetArn\": \"arn:aws:ecs:us-west-2:123456789012:task-set/MyCluster/MyService/ecs-svc/1234567890123456789\",\n                                \"status\": \"ACTIVE\",\n                                \"taskDefinition\": \"arn:aws:ecs:us-west-2:123456789012:task-definition/sample-fargate:2\",\n                                \"computedDesiredCount\": 0,\n                                \"pendingCount\": 0,\n                                \"runningCount\": 0,\n                                \"createdAt\": 1.557128360711E9,\n                                \"updatedAt\": 1.557129279914E9,\n                                \"launchType\": \"EC2\",\n                                \"networkConfiguration\": {\n                                    \"awsvpcConfiguration\": {\n                                        \"subnets\": [\n                                            \"subnet-12344321\"\n                                        ],\n                                        \"securityGroups\": [\n                                            \"sg-12344321\"\n                                        ],\n                                        \"assignPublicIp\": \"DISABLED\"\n                                    }\n                                },\n                                \"loadBalancers\": [],\n                                \"serviceRegistries\": [],\n                                \"scale\": {\n                                    \"value\": 50,\n                                    \"unit\": \"PERCENT\"\n                                },\n                                \"stabilityStatus\": \"STABILIZING\",\n                                \"stabilityStatusAt\": 1.557129279914E9\n                            }\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.ecs#UpdateTaskSetRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"cluster\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The short name or full Amazon Resource Name (ARN) of the cluster that hosts the service that the task\\n\\t\\t\\tset is found in.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"service\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The short name or full Amazon Resource Name (ARN) of the service that the task set is found in.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"taskSet\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The short name or full Amazon Resource Name (ARN) of the task set to update.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"scale\": {\n                    \"target\": \"com.amazonaws.ecs#Scale\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A floating-point percentage of the desired number of tasks to place and keep running\\n\\t\\t\\tin the task set.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ecs#UpdateTaskSetResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"taskSet\": {\n                    \"target\": \"com.amazonaws.ecs#TaskSet\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Details about the task set.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ecs#VCpuCountRangeRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"min\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedInteger\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The minimum number of vCPUs. Instance types with fewer vCPUs than this value are excluded from selection.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"max\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedInteger\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of vCPUs. Instance types with more vCPUs than this value are excluded from selection.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The minimum and maximum number of vCPUs for instance type selection. This allows you to specify a range of vCPU counts that meet your workload requirements.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#VersionConsistency\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ENABLED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"enabled\"\n                    }\n                },\n                \"DISABLED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"disabled\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ecs#VersionInfo\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"agentVersion\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The version number of the Amazon ECS container agent.</p>\"\n                    }\n                },\n                \"agentHash\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Git commit hash for the Amazon ECS container agent build on the <a href=\\\"https://github.com/aws/amazon-ecs-agent\\\">amazon-ecs-agent\\n\\t\\t\\t</a> GitHub repository.</p>\"\n                    }\n                },\n                \"dockerVersion\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Docker version that's running on the container instance.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The Docker and Amazon ECS container agent version information about a container\\n\\t\\t\\tinstance.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#Volume\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"name\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the volume. Up to 255 letters (uppercase and lowercase), numbers, underscores, and hyphens are allowed.</p>\\n         <p>When using a volume configured at launch, the <code>name</code> is required and must\\n\\t\\t\\talso be specified as the volume name in the <code>ServiceVolumeConfiguration</code> or\\n\\t\\t\\t\\t<code>TaskVolumeConfiguration</code> parameter when creating your service or\\n\\t\\t\\tstandalone task.</p>\\n         <p>For all other types of volumes, this name is referenced in the\\n\\t\\t\\t\\t<code>sourceVolume</code> parameter of the <code>mountPoints</code> object in the\\n\\t\\t\\tcontainer definition.</p>\\n         <p>When a volume is using the <code>efsVolumeConfiguration</code>, the name is\\n\\t\\t\\trequired.</p>\"\n                    }\n                },\n                \"host\": {\n                    \"target\": \"com.amazonaws.ecs#HostVolumeProperties\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>This parameter is specified when you use bind mount host volumes. The contents of the\\n\\t\\t\\t\\t<code>host</code> parameter determine whether your bind mount host volume persists\\n\\t\\t\\ton the host container instance and where it's stored. If the <code>host</code> parameter\\n\\t\\t\\tis empty, then the Docker daemon assigns a host path for your data volume. However, the\\n\\t\\t\\tdata isn't guaranteed to persist after the containers that are associated with it stop\\n\\t\\t\\trunning.</p>\\n         <p>Windows containers can mount whole directories on the same drive as\\n\\t\\t\\t\\t<code>$env:ProgramData</code>. Windows containers can't mount directories on a\\n\\t\\t\\tdifferent drive, and mount point can't be across drives. For example, you can mount\\n\\t\\t\\t\\t<code>C:\\\\my\\\\path:C:\\\\my\\\\path</code> and <code>D:\\\\:D:\\\\</code>, but not\\n\\t\\t\\t\\t<code>D:\\\\my\\\\path:C:\\\\my\\\\path</code> or <code>D:\\\\:C:\\\\my\\\\path</code>.</p>\"\n                    }\n                },\n                \"dockerVolumeConfiguration\": {\n                    \"target\": \"com.amazonaws.ecs#DockerVolumeConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>This parameter is specified when you use Docker volumes.</p>\\n         <p>Windows containers only support the use of the <code>local</code> driver. To use bind\\n\\t\\t\\tmounts, specify the <code>host</code> parameter instead.</p>\\n         <note>\\n            <p>Docker volumes aren't supported by tasks run on Fargate.</p>\\n         </note>\"\n                    }\n                },\n                \"efsVolumeConfiguration\": {\n                    \"target\": \"com.amazonaws.ecs#EFSVolumeConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>This parameter is specified when you use an Amazon Elastic File System file system for task\\n\\t\\t\\tstorage.</p>\"\n                    }\n                },\n                \"fsxWindowsFileServerVolumeConfiguration\": {\n                    \"target\": \"com.amazonaws.ecs#FSxWindowsFileServerVolumeConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>This parameter is specified when you use Amazon FSx for Windows File Server file system for task\\n\\t\\t\\tstorage.</p>\"\n                    }\n                },\n                \"configuredAtLaunch\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedBoolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether the volume should be configured at launch time. This is used to\\n\\t\\t\\tcreate Amazon EBS volumes for standalone tasks or tasks created as part of a service. Each\\n\\t\\t\\ttask definition revision may only have one volume configured at launch in the volume\\n\\t\\t\\tconfiguration.</p>\\n         <p>To configure a volume at launch time, use this task definition revision and specify a\\n\\t\\t\\t\\t<code>volumeConfigurations</code> object when calling the\\n\\t\\t\\t<code>CreateService</code>, <code>UpdateService</code>, <code>RunTask</code> or\\n\\t\\t\\t\\t<code>StartTask</code> APIs.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The data volume configuration for tasks launched using this task definition.\\n\\t\\t\\tSpecifying a volume configuration in a task definition is optional. The volume\\n\\t\\t\\tconfiguration may contain multiple volumes but only one volume configured at launch is\\n\\t\\t\\tsupported. Each volume defined in the volume configuration may only specify a\\n\\t\\t\\t\\t<code>name</code> and one of either <code>configuredAtLaunch</code>,\\n\\t\\t\\t\\t<code>dockerVolumeConfiguration</code>, <code>efsVolumeConfiguration</code>,\\n\\t\\t\\t\\t<code>fsxWindowsFileServerVolumeConfiguration</code>, or <code>host</code>. If an\\n\\t\\t\\tempty volume configuration is specified, by default Amazon ECS uses a host volume. For more\\n\\t\\t\\tinformation, see <a href=\\\"https://docs.aws.amazon.com/AmazonECS/latest/developerguide/using_data_volumes.html\\\">Using data volumes in\\n\\t\\t\\t\\ttasks</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#VolumeFrom\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"sourceContainer\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of another container within the same task definition to mount volumes\\n\\t\\t\\tfrom.</p>\"\n                    }\n                },\n                \"readOnly\": {\n                    \"target\": \"com.amazonaws.ecs#BoxedBoolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If this value is <code>true</code>, the container has read-only access to the volume.\\n\\t\\t\\tIf this value is <code>false</code>, then the container can write to the volume. The\\n\\t\\t\\tdefault value is <code>false</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Details on a data volume from another container in the same task definition.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#VolumeFromList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#VolumeFrom\"\n            }\n        },\n        \"com.amazonaws.ecs#VolumeList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#Volume\"\n            }\n        },\n        \"com.amazonaws.ecs#VpcLatticeConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"roleArn\": {\n                    \"target\": \"com.amazonaws.ecs#IAMRoleArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the IAM role to associate with this VPC Lattice configuration. This is the\\n\\t\\t\\tAmazon ECS\\u2028 infrastructure IAM role that is used to manage your VPC Lattice\\n\\t\\t\\tinfrastructure.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"targetGroupArn\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The full Amazon Resource Name (ARN) of the target group or groups associated with the VPC Lattice\\n\\t\\t\\tconfiguration that the Amazon ECS tasks will be registered to.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"portName\": {\n                    \"target\": \"com.amazonaws.ecs#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the port mapping to register in the VPC Lattice target group. This is the name\\n\\t\\t\\tof the <code>portMapping</code> you defined in your task definition.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The VPC Lattice configuration for your service that holds the information for the target\\n\\t\\t\\tgroup(s) Amazon ECS tasks will be registered to.</p>\"\n            }\n        },\n        \"com.amazonaws.ecs#VpcLatticeConfigurations\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ecs#VpcLatticeConfiguration\"\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "aws/sdk/aws-models/glacier.json",
    "content": "{\n    \"smithy\": \"2.0\",\n    \"metadata\": {\n        \"suppressions\": [\n            {\n                \"id\": \"HttpMethodSemantics\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"HttpResponseCodeSemantics\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"PaginatedTrait\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"HttpHeaderTrait\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"HttpUriConflict\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"Service\",\n                \"namespace\": \"*\"\n            }\n        ]\n    },\n    \"shapes\": {\n        \"com.amazonaws.glacier#AbortMultipartUpload\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.glacier#AbortMultipartUploadInput\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.glacier#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#MissingParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This operation aborts a multipart upload identified by the upload ID.</p>\\n\\n\\n         <p>After the Abort Multipart Upload request succeeds, you cannot upload any more parts\\n         to the multipart upload or complete the multipart upload. Aborting a completed upload\\n         fails. However, aborting an already-aborted upload will succeed, for a short time. For more\\n         information about uploading a part and completing a multipart upload, see <a>UploadMultipartPart</a> and <a>CompleteMultipartUpload</a>.</p>\\n\\n         <p>This operation is idempotent.</p>\\n\\n         <p>An AWS account has full permission to perform all operations (actions). However, AWS\\n         Identity and Access Management (IAM) users don't have any permissions by default. You must\\n         grant them explicit permission to perform specific actions. For more information, see\\n            <a href=\\\"https://docs.aws.amazon.com/amazonglacier/latest/dev/using-iam-with-amazon-glacier.html\\\">Access Control Using\\n            AWS Identity and Access Management (IAM)</a>.</p>\\n         <p> For conceptual information and underlying REST API, see <a href=\\\"https://docs.aws.amazon.com/amazonglacier/latest/dev/working-with-archives.html\\\">Working with Archives in\\n            Amazon S3 Glacier</a> and <a href=\\\"https://docs.aws.amazon.com/amazonglacier/latest/dev/api-multipart-abort-upload.html\\\">Abort Multipart\\n            Upload</a> in the <i>Amazon Glacier Developer Guide</i>. </p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To abort a multipart upload identified by the upload ID\",\n                        \"documentation\": \"The example deletes an in-progress multipart upload to a vault named my-vault:\",\n                        \"input\": {\n                            \"accountId\": \"-\",\n                            \"vaultName\": \"my-vault\",\n                            \"uploadId\": \"19gaRezEXAMPLES6Ry5YYdqthHOC_kGRCT03L9yetr220UmPtBYKk-OssZtLqyFu7sY1_lR7vgFuJV6NtcV5zpsJ\"\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"DELETE\",\n                    \"uri\": \"/{accountId}/vaults/{vaultName}/multipart-uploads/{uploadId}\",\n                    \"code\": 204\n                }\n            }\n        },\n        \"com.amazonaws.glacier#AbortMultipartUploadInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"accountId\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>AccountId</code> value is the AWS account ID of the account that owns the\\n         vault. You can either specify an AWS account ID or optionally a single '<code>-</code>'\\n         (hyphen), in which case Amazon S3 Glacier uses the AWS account ID associated with the\\n         credentials used to sign the request. If you use an account ID, do not include any hyphens\\n         ('-') in the ID.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"vaultName\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the vault.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"uploadId\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The upload ID of the multipart upload to delete.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Provides options to abort a multipart upload identified by the upload ID.</p>\\n\\n         <p>For information about the underlying REST API, see <a href=\\\"https://docs.aws.amazon.com/amazonglacier/latest/dev/api-multipart-abort-upload.html\\\">Abort Multipart\\n            Upload</a>. For conceptual information, see <a href=\\\"https://docs.aws.amazon.com/amazonglacier/latest/dev/working-with-archives.html\\\">Working with Archives in\\n            Amazon S3 Glacier</a>.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.glacier#AbortVaultLock\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.glacier#AbortVaultLockInput\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.glacier#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#MissingParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This operation aborts the vault locking process if the vault lock is not in the\\n            <code>Locked</code> state. If the vault lock is in the <code>Locked</code> state when\\n         this operation is requested, the operation returns an <code>AccessDeniedException</code>\\n         error. Aborting the vault locking process removes the vault lock policy from the specified\\n         vault. </p>\\n         <p>A vault lock is put into the <code>InProgress</code> state by calling <a>InitiateVaultLock</a>. A vault lock is put into the <code>Locked</code> state by\\n         calling <a>CompleteVaultLock</a>. You can get the state of a vault lock by\\n         calling <a>GetVaultLock</a>. For more information about the vault locking\\n         process, see <a href=\\\"https://docs.aws.amazon.com/amazonglacier/latest/dev/vault-lock.html\\\">Amazon Glacier Vault Lock</a>. For more information about vault lock policies, see\\n            <a href=\\\"https://docs.aws.amazon.com/amazonglacier/latest/dev/vault-lock-policy.html\\\">Amazon\\n            Glacier Access Control with Vault Lock Policies</a>. </p>\\n         <p>This operation is idempotent. You can successfully invoke this operation multiple\\n         times, if the vault lock is in the <code>InProgress</code> state or if there is no policy\\n         associated with the vault.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To abort a vault lock\",\n                        \"documentation\": \"The example aborts the vault locking process if the vault lock is not in the Locked state for the vault named examplevault.\",\n                        \"input\": {\n                            \"accountId\": \"-\",\n                            \"vaultName\": \"examplevault\"\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"DELETE\",\n                    \"uri\": \"/{accountId}/vaults/{vaultName}/lock-policy\",\n                    \"code\": 204\n                }\n            }\n        },\n        \"com.amazonaws.glacier#AbortVaultLockInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"accountId\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>AccountId</code> value is the AWS account ID. This value must match the AWS\\n         account ID associated with the credentials used to sign the request. You can either specify\\n         an AWS account ID or optionally a single '<code>-</code>' (hyphen), in which case Amazon\\n         Glacier uses the AWS account ID associated with the credentials used to sign the request.\\n         If you specify your account ID, do not include any hyphens ('-') in the ID.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"vaultName\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the vault.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The input values for <code>AbortVaultLock</code>.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.glacier#AccessControlPolicyList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.glacier#Grant\"\n            }\n        },\n        \"com.amazonaws.glacier#ActionCode\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ArchiveRetrieval\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ArchiveRetrieval\"\n                    }\n                },\n                \"InventoryRetrieval\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"InventoryRetrieval\"\n                    }\n                },\n                \"Select\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Select\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.glacier#AddTagsToVault\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.glacier#AddTagsToVaultInput\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.glacier#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#MissingParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This operation adds the specified tags to a vault. Each tag is composed of a key and\\n         a value. Each vault can have up to 10 tags. If your request would cause the tag limit for\\n         the vault to be exceeded, the operation throws the <code>LimitExceededException</code>\\n         error. If a tag already exists on the vault under a specified key, the existing key value\\n         will be overwritten. For more information about tags, see <a href=\\\"https://docs.aws.amazon.com/amazonglacier/latest/dev/tagging.html\\\">Tagging Amazon S3 Glacier Resources</a>.\\n      </p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To add tags to a vault\",\n                        \"documentation\": \"The example adds two tags to a my-vault.\",\n                        \"input\": {\n                            \"accountId\": \"-\",\n                            \"vaultName\": \"my-vault\",\n                            \"Tags\": {\n                                \"examplekey1\": \"examplevalue1\",\n                                \"examplekey2\": \"examplevalue2\"\n                            }\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"POST\",\n                    \"uri\": \"/{accountId}/vaults/{vaultName}/tags?operation=add\",\n                    \"code\": 204\n                }\n            }\n        },\n        \"com.amazonaws.glacier#AddTagsToVaultInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"accountId\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>AccountId</code> value is the AWS account ID of the account that owns the\\n         vault. You can either specify an AWS account ID or optionally a single '<code>-</code>'\\n         (hyphen), in which case Amazon S3 Glacier uses the AWS account ID associated with the\\n         credentials used to sign the request. If you use an account ID, do not include any hyphens\\n         ('-') in the ID.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"vaultName\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the vault.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.glacier#TagMap\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags to add to the vault. Each tag is composed of a key and a value. The value\\n         can be an empty string.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The input values for <code>AddTagsToVault</code>.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.glacier#ArchiveCreationOutput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"location\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The relative URI path of the newly added archive resource.</p>\",\n                        \"smithy.api#httpHeader\": \"Location\"\n                    }\n                },\n                \"checksum\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The checksum of the archive computed by Amazon S3 Glacier.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amz-sha256-tree-hash\"\n                    }\n                },\n                \"archiveId\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the archive. This value is also included as part of the location.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amz-archive-id\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the Amazon S3 Glacier response to your request.</p>\\n         <p>For information about the underlying REST API, see <a href=\\\"https://docs.aws.amazon.com/amazonglacier/latest/dev/api-archive-post.html\\\">Upload Archive</a>. For\\n         conceptual information, see <a href=\\\"https://docs.aws.amazon.com/amazonglacier/latest/dev/working-with-archives.html\\\">Working with Archives in\\n            Amazon S3 Glacier</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.glacier#CSVInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"FileHeaderInfo\": {\n                    \"target\": \"com.amazonaws.glacier#FileHeaderInfo\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Describes the first line of input. Valid values are <code>None</code>,\\n                <code>Ignore</code>, and <code>Use</code>.</p>\"\n                    }\n                },\n                \"Comments\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A single character used to indicate that a row should be ignored when the character is\\n            present at the start of that row.</p>\"\n                    }\n                },\n                \"QuoteEscapeCharacter\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A single character used for escaping the quotation-mark character inside an already\\n            escaped value.</p>\"\n                    }\n                },\n                \"RecordDelimiter\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A value used to separate individual records from each other.</p>\"\n                    }\n                },\n                \"FieldDelimiter\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A value used to separate individual fields from each other within a record.</p>\"\n                    }\n                },\n                \"QuoteCharacter\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A value used as an escape character where the field delimiter is part of the\\n            value.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains information about the comma-separated value (CSV) file to select from.</p>\"\n            }\n        },\n        \"com.amazonaws.glacier#CSVOutput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"QuoteFields\": {\n                    \"target\": \"com.amazonaws.glacier#QuoteFields\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A value that indicates whether all output fields should be contained within quotation\\n            marks.</p>\"\n                    }\n                },\n                \"QuoteEscapeCharacter\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A single character used for escaping the quotation-mark character inside an already\\n            escaped value.</p>\"\n                    }\n                },\n                \"RecordDelimiter\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A value used to separate individual records from each other.</p>\"\n                    }\n                },\n                \"FieldDelimiter\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A value used to separate individual fields from each other within a record.</p>\"\n                    }\n                },\n                \"QuoteCharacter\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A value used as an escape character where the field delimiter is part of the\\n            value.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains information about the comma-separated value (CSV) file that the job results\\n            are stored in.</p>\"\n            }\n        },\n        \"com.amazonaws.glacier#CannedACL\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"Private\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"private\"\n                    }\n                },\n                \"PublicRead\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"public-read\"\n                    }\n                },\n                \"PublicReadWrite\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"public-read-write\"\n                    }\n                },\n                \"AwsExecRead\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"aws-exec-read\"\n                    }\n                },\n                \"AuthenticatedRead\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"authenticated-read\"\n                    }\n                },\n                \"BucketOwnerRead\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"bucket-owner-read\"\n                    }\n                },\n                \"BucketOwnerFullControl\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"bucket-owner-full-control\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.glacier#CompleteMultipartUpload\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.glacier#CompleteMultipartUploadInput\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.glacier#ArchiveCreationOutput\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.glacier#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#MissingParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>You call this operation to inform Amazon S3 Glacier (Glacier) that all the archive parts have been\\n         uploaded and that Glacier can now assemble the archive from the uploaded parts.\\n         After assembling and saving the archive to the vault, Glacier returns the URI path\\n         of the newly created archive resource. Using the URI path, you can then access the archive.\\n         After you upload an archive, you should save the archive ID returned to retrieve the\\n         archive at a later point. You can also get the vault inventory to obtain a list of archive\\n         IDs in a vault. For more information, see <a>InitiateJob</a>.</p>\\n\\n         <p>In the request, you must include the computed SHA256 tree hash of the entire archive\\n         you have uploaded. For information about computing a SHA256 tree hash, see <a href=\\\"https://docs.aws.amazon.com/amazonglacier/latest/dev/checksum-calculations.html\\\">Computing\\n            Checksums</a>. On the server side, Glacier also constructs the SHA256 tree\\n         hash of the assembled archive. If the values match, Glacier saves the archive to the\\n         vault; otherwise, it returns an error, and the operation fails. The <a>ListParts</a> operation returns a list of parts uploaded for a specific\\n         multipart upload. It includes checksum information for each uploaded part that can be used\\n         to debug a bad checksum issue.</p>\\n\\n         <p>Additionally, Glacier also checks for any missing content ranges when\\n         assembling the archive, if missing content ranges are found, Glacier returns an\\n         error and the operation fails.</p>\\n\\n         <p>Complete Multipart Upload is an idempotent operation. After your first successful\\n         complete multipart upload, if you call the operation again within a short period, the\\n         operation will succeed and return the same archive ID. This is useful in the event you\\n         experience a network issue that causes an aborted connection or receive a 500 server error,\\n         in which case you can repeat your Complete Multipart Upload request and get the same\\n         archive ID without creating duplicate archives. Note, however, that after the multipart\\n         upload completes, you cannot call the List Parts operation and the multipart upload will\\n         not appear in List Multipart Uploads response, even if idempotent complete is\\n         possible.</p>\\n\\n         <p>An AWS account has full permission to perform all operations (actions). However, AWS\\n         Identity and Access Management (IAM) users don't have any permissions by default. You must\\n         grant them explicit permission to perform specific actions. For more information, see\\n            <a href=\\\"https://docs.aws.amazon.com/amazonglacier/latest/dev/using-iam-with-amazon-glacier.html\\\">Access Control Using\\n            AWS Identity and Access Management (IAM)</a>.</p>\\n         <p> For conceptual information and underlying REST API, see <a href=\\\"https://docs.aws.amazon.com/amazonglacier/latest/dev/uploading-archive-mpu.html\\\">Uploading Large Archives in\\n            Parts (Multipart Upload)</a> and <a href=\\\"https://docs.aws.amazon.com/amazonglacier/latest/dev/api-multipart-complete-upload.html\\\">Complete Multipart\\n            Upload</a> in the <i>Amazon Glacier Developer Guide</i>. </p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To complete a multipart upload\",\n                        \"documentation\": \"The example completes a multipart upload for a 3 MiB archive.\",\n                        \"input\": {\n                            \"checksum\": \"9628195fcdbcbbe76cdde456d4646fa7de5f219fb39823836d81f0cc0e18aa67\",\n                            \"vaultName\": \"my-vault\",\n                            \"uploadId\": \"19gaRezEXAMPLES6Ry5YYdqthHOC_kGRCT03L9yetr220UmPtBYKk-OssZtLqyFu7sY1_lR7vgFuJV6NtcV5zpsJ\",\n                            \"archiveSize\": \"3145728\",\n                            \"accountId\": \"-\"\n                        },\n                        \"output\": {\n                            \"location\": \"/111122223333/vaults/my-vault/archives/NkbByEejwEggmBz2fTHgJrg0XBoDfjP4q6iu87-TjhqG6eGoOY9Z8i1_AUyUsuhPAdTqLHy8pTl5nfCFJmDl2yEZONi5L26Omw12vcs01MNGntHEQL8MBfGlqrEXAMPLEArchiveId\",\n                            \"checksum\": \"9628195fcdbcbbe76cdde456d4646fa7de5f219fb39823836d81f0cc0e18aa67\",\n                            \"archiveId\": \"NkbByEejwEggmBz2fTHgJrg0XBoDfjP4q6iu87-TjhqG6eGoOY9Z8i1_AUyUsuhPAdTqLHy8pTl5nfCFJmDl2yEZONi5L26Omw12vcs01MNGntHEQL8MBfGlqrEXAMPLEArchiveId\"\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"POST\",\n                    \"uri\": \"/{accountId}/vaults/{vaultName}/multipart-uploads/{uploadId}\",\n                    \"code\": 201\n                }\n            }\n        },\n        \"com.amazonaws.glacier#CompleteMultipartUploadInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"accountId\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>AccountId</code> value is the AWS account ID of the account that owns the\\n         vault. You can either specify an AWS account ID or optionally a single '<code>-</code>'\\n         (hyphen), in which case Amazon S3 Glacier uses the AWS account ID associated with the\\n         credentials used to sign the request. If you use an account ID, do not include any hyphens\\n         ('-') in the ID.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"vaultName\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the vault.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"uploadId\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The upload ID of the multipart upload.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"archiveSize\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The total size, in bytes, of the entire archive. This value should be the sum of all\\n         the sizes of the individual parts that you uploaded.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amz-archive-size\"\n                    }\n                },\n                \"checksum\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The SHA256 tree hash of the entire archive. It is the tree hash of SHA256 tree hash\\n         of the individual parts. If the value you specify in the request does not match the SHA256\\n         tree hash of the final assembled archive as computed by Amazon S3 Glacier (Glacier), \\n         Glacier returns an error and the request fails.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amz-sha256-tree-hash\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Provides options to complete a multipart upload operation. This informs Amazon\\n         Glacier that all the archive parts have been uploaded and Amazon S3 Glacier (Glacier) can now assemble\\n         the archive from the uploaded parts. After assembling and saving the archive to the vault,\\n         Glacier returns the URI path of the newly created archive resource.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.glacier#CompleteVaultLock\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.glacier#CompleteVaultLockInput\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.glacier#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#MissingParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This operation completes the vault locking process by transitioning the vault lock\\n         from the <code>InProgress</code> state to the <code>Locked</code> state, which causes the\\n         vault lock policy to become unchangeable. A vault lock is put into the\\n            <code>InProgress</code> state by calling <a>InitiateVaultLock</a>. You can\\n         obtain the state of the vault lock by calling <a>GetVaultLock</a>. For more\\n         information about the vault locking process, <a href=\\\"https://docs.aws.amazon.com/amazonglacier/latest/dev/vault-lock.html\\\">Amazon Glacier Vault Lock</a>. </p>\\n         <p>This operation is idempotent. This request is always successful if the vault lock is\\n         in the <code>Locked</code> state and the provided lock ID matches the lock ID originally\\n         used to lock the vault.</p>\\n         <p>If an invalid lock ID is passed in the request when the vault lock is in the\\n            <code>Locked</code> state, the operation returns an <code>AccessDeniedException</code>\\n         error. If an invalid lock ID is passed in the request when the vault lock is in the\\n            <code>InProgress</code> state, the operation throws an <code>InvalidParameter</code>\\n         error.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To complete a vault lock\",\n                        \"documentation\": \"The example completes the vault locking process by transitioning the vault lock from the InProgress state to the Locked state.\",\n                        \"input\": {\n                            \"accountId\": \"-\",\n                            \"vaultName\": \"example-vault\",\n                            \"lockId\": \"AE863rKkWZU53SLW5be4DUcW\"\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"POST\",\n                    \"uri\": \"/{accountId}/vaults/{vaultName}/lock-policy/{lockId}\",\n                    \"code\": 204\n                }\n            }\n        },\n        \"com.amazonaws.glacier#CompleteVaultLockInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"accountId\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>AccountId</code> value is the AWS account ID. This value must match the AWS\\n         account ID associated with the credentials used to sign the request. You can either specify\\n         an AWS account ID or optionally a single '<code>-</code>' (hyphen), in which case Amazon\\n         Glacier uses the AWS account ID associated with the credentials used to sign the request.\\n         If you specify your account ID, do not include any hyphens ('-') in the ID.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"vaultName\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the vault.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"lockId\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>lockId</code> value is the lock ID obtained from a <a>InitiateVaultLock</a> request.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The input values for <code>CompleteVaultLock</code>.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.glacier#CreateVault\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.glacier#CreateVaultInput\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.glacier#CreateVaultOutput\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.glacier#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#MissingParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This operation creates a new vault with the specified name. The name of the vault\\n         must be unique within a region for an AWS account. You can create up to 1,000 vaults per\\n         account. If you need to create more vaults, contact Amazon S3 Glacier.</p>\\n         <p>You must use the following guidelines when naming a vault.</p>\\n         <ul>\\n            <li>\\n               <p>Names can be between 1 and 255 characters long.</p>\\n            </li>\\n            <li>\\n               <p>Allowed characters are a-z, A-Z, 0-9, '_' (underscore), '-' (hyphen), and '.'\\n               (period).</p>\\n            </li>\\n         </ul>\\n\\n         <p>This operation is idempotent.</p>\\n\\n         <p>An AWS account has full permission to perform all operations (actions). However, AWS\\n         Identity and Access Management (IAM) users don't have any permissions by default. You must\\n         grant them explicit permission to perform specific actions. For more information, see\\n            <a href=\\\"https://docs.aws.amazon.com/amazonglacier/latest/dev/using-iam-with-amazon-glacier.html\\\">Access Control Using\\n            AWS Identity and Access Management (IAM)</a>.</p>\\n         <p> For conceptual information and underlying REST API, see <a href=\\\"https://docs.aws.amazon.com/amazonglacier/latest/dev/creating-vaults.html\\\">Creating a Vault in Amazon\\n            Glacier</a> and <a href=\\\"https://docs.aws.amazon.com/amazonglacier/latest/dev/api-vault-put.html\\\">Create Vault </a> in the\\n            <i>Amazon Glacier Developer Guide</i>. </p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To create a new vault\",\n                        \"documentation\": \"The following example creates a new vault named my-vault.\",\n                        \"input\": {\n                            \"vaultName\": \"my-vault\",\n                            \"accountId\": \"-\"\n                        },\n                        \"output\": {\n                            \"location\": \"/111122223333/vaults/my-vault\"\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"PUT\",\n                    \"uri\": \"/{accountId}/vaults/{vaultName}\",\n                    \"code\": 201\n                }\n            }\n        },\n        \"com.amazonaws.glacier#CreateVaultInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"accountId\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>AccountId</code> value is the AWS account ID. This value must match the AWS\\n         account ID associated with the credentials used to sign the request. You can either specify\\n         an AWS account ID or optionally a single '<code>-</code>' (hyphen), in which case Amazon S3\\n         Glacier uses the AWS account ID associated with the credentials used to sign the request.\\n         If you specify your account ID, do not include any hyphens ('-') in the ID.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"vaultName\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the vault.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Provides options to create a vault.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.glacier#CreateVaultOutput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"location\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The URI of the vault that was created.</p>\",\n                        \"smithy.api#httpHeader\": \"Location\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the Amazon S3 Glacier response to your request.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.glacier#DataRetrievalPolicy\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Rules\": {\n                    \"target\": \"com.amazonaws.glacier#DataRetrievalRulesList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The policy rule. Although this is a list type, currently there must be only one rule,\\n         which contains a Strategy field and optionally a BytesPerHour field.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Data retrieval policy.</p>\"\n            }\n        },\n        \"com.amazonaws.glacier#DataRetrievalRule\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Strategy\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of data retrieval policy to set.</p>\\n         <p>Valid values: BytesPerHour|FreeTier|None</p>\"\n                    }\n                },\n                \"BytesPerHour\": {\n                    \"target\": \"com.amazonaws.glacier#NullableLong\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of bytes that can be retrieved in an hour.</p>\\n         <p>This field is required only if the value of the Strategy field is\\n            <code>BytesPerHour</code>. Your PUT operation will be rejected if the Strategy field is\\n         not set to <code>BytesPerHour</code> and you set this field.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Data retrieval policy rule.</p>\"\n            }\n        },\n        \"com.amazonaws.glacier#DataRetrievalRulesList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.glacier#DataRetrievalRule\"\n            }\n        },\n        \"com.amazonaws.glacier#DateTime\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.glacier#DeleteArchive\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.glacier#DeleteArchiveInput\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.glacier#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#MissingParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This operation deletes an archive from a vault. Subsequent requests to initiate a\\n         retrieval of this archive will fail. Archive retrievals that are in progress for this\\n         archive ID may or may not succeed according to the following scenarios:</p>\\n         <ul>\\n            <li>\\n               <p>If the archive retrieval job is actively preparing the data for download when\\n               Amazon S3 Glacier receives the delete archive request, the archival retrieval operation\\n               might fail.</p>\\n            </li>\\n            <li>\\n               <p>If the archive retrieval job has successfully prepared the archive for download\\n               when Amazon S3 Glacier receives the delete archive request, you will be able to download\\n               the output.</p>\\n            </li>\\n         </ul>\\n\\n         <p>This operation is idempotent. Attempting to delete an already-deleted archive does\\n         not result in an error.</p>\\n\\n         <p>An AWS account has full permission to perform all operations (actions). However, AWS\\n         Identity and Access Management (IAM) users don't have any permissions by default. You must\\n         grant them explicit permission to perform specific actions. For more information, see\\n            <a href=\\\"https://docs.aws.amazon.com/amazonglacier/latest/dev/using-iam-with-amazon-glacier.html\\\">Access Control Using\\n            AWS Identity and Access Management (IAM)</a>.</p>\\n         <p> For conceptual information and underlying REST API, see <a href=\\\"https://docs.aws.amazon.com/amazonglacier/latest/dev/deleting-an-archive.html\\\">Deleting an Archive in Amazon\\n            Glacier</a> and <a href=\\\"https://docs.aws.amazon.com/amazonglacier/latest/dev/api-archive-delete.html\\\">Delete Archive</a> in the\\n            <i>Amazon Glacier Developer Guide</i>. </p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To delete an archive\",\n                        \"documentation\": \"The example deletes the archive specified by the archive ID.\",\n                        \"input\": {\n                            \"accountId\": \"-\",\n                            \"vaultName\": \"examplevault\",\n                            \"archiveId\": \"NkbByEejwEggmBz2fTHgJrg0XBoDfjP4q6iu87-TjhqG6eGoOY9Z8i1_AUyUsuhPAdTqLHy8pTl5nfCFJmDl2yEZONi5L26Omw12vcs01MNGntHEQL8MBfGlqrEXAMPLEArchiveId\"\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"DELETE\",\n                    \"uri\": \"/{accountId}/vaults/{vaultName}/archives/{archiveId}\",\n                    \"code\": 204\n                }\n            }\n        },\n        \"com.amazonaws.glacier#DeleteArchiveInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"accountId\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>AccountId</code> value is the AWS account ID of the account that owns the\\n         vault. You can either specify an AWS account ID or optionally a single '<code>-</code>'\\n         (hyphen), in which case Amazon S3 Glacier uses the AWS account ID associated with the\\n         credentials used to sign the request. If you use an account ID, do not include any hyphens\\n         ('-') in the ID.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"vaultName\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the vault.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"archiveId\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the archive to delete.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Provides options for deleting an archive from an Amazon S3 Glacier vault.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.glacier#DeleteVault\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.glacier#DeleteVaultInput\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.glacier#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#MissingParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This operation deletes a vault. Amazon S3 Glacier will delete a vault only if there are\\n         no archives in the vault as of the last inventory and there have been no writes to the\\n         vault since the last inventory. If either of these conditions is not satisfied, the vault\\n         deletion fails (that is, the vault is not removed) and Amazon S3 Glacier returns an error. You\\n         can use <a>DescribeVault</a> to return the number of archives in a vault, and\\n         you can use <a href=\\\"https://docs.aws.amazon.com/amazonglacier/latest/dev/api-initiate-job-post.html\\\">Initiate a Job (POST\\n            jobs)</a> to initiate a new inventory retrieval for a vault. The inventory contains\\n         the archive IDs you use to delete archives using <a href=\\\"https://docs.aws.amazon.com/amazonglacier/latest/dev/api-archive-delete.html\\\">Delete Archive (DELETE\\n            archive)</a>.</p>\\n\\n         <p>This operation is idempotent.</p>\\n\\n         <p>An AWS account has full permission to perform all operations (actions). However, AWS\\n         Identity and Access Management (IAM) users don't have any permissions by default. You must\\n         grant them explicit permission to perform specific actions. For more information, see\\n            <a href=\\\"https://docs.aws.amazon.com/amazonglacier/latest/dev/using-iam-with-amazon-glacier.html\\\">Access Control Using\\n            AWS Identity and Access Management (IAM)</a>.</p>\\n         <p> For conceptual information and underlying REST API, see <a href=\\\"https://docs.aws.amazon.com/amazonglacier/latest/dev/deleting-vaults.html\\\">Deleting a Vault in Amazon\\n            Glacier</a> and <a href=\\\"https://docs.aws.amazon.com/amazonglacier/latest/dev/api-vault-delete.html\\\">Delete Vault </a> in the\\n            <i>Amazon S3 Glacier Developer Guide</i>. </p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To delete a vault\",\n                        \"documentation\": \"The example deletes a vault named my-vault:\",\n                        \"input\": {\n                            \"vaultName\": \"my-vault\",\n                            \"accountId\": \"-\"\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"DELETE\",\n                    \"uri\": \"/{accountId}/vaults/{vaultName}\",\n                    \"code\": 204\n                }\n            }\n        },\n        \"com.amazonaws.glacier#DeleteVaultAccessPolicy\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.glacier#DeleteVaultAccessPolicyInput\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.glacier#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#MissingParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This operation deletes the access policy associated with the specified vault. The\\n         operation is eventually consistent; that is, it might take some time for Amazon S3 Glacier to\\n         completely remove the access policy, and you might still see the effect of the policy for a\\n         short time after you send the delete request.</p>\\n         <p>This operation is idempotent. You can invoke delete multiple times, even if there is\\n         no policy associated with the vault. For more information about vault access policies, see\\n            <a href=\\\"https://docs.aws.amazon.com/amazonglacier/latest/dev/vault-access-policy.html\\\">Amazon Glacier Access Control with Vault Access Policies</a>. </p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To delete the vault access policy\",\n                        \"documentation\": \"The example deletes the access policy associated with the vault named examplevault.\",\n                        \"input\": {\n                            \"accountId\": \"-\",\n                            \"vaultName\": \"examplevault\"\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"DELETE\",\n                    \"uri\": \"/{accountId}/vaults/{vaultName}/access-policy\",\n                    \"code\": 204\n                }\n            }\n        },\n        \"com.amazonaws.glacier#DeleteVaultAccessPolicyInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"accountId\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>AccountId</code> value is the AWS account ID of the account that owns the\\n         vault. You can either specify an AWS account ID or optionally a single '<code>-</code>'\\n         (hyphen), in which case Amazon S3 Glacier uses the AWS account ID associated with the\\n         credentials used to sign the request. If you use an account ID, do not include any hyphens\\n         ('-') in the ID. </p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"vaultName\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the vault.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>DeleteVaultAccessPolicy input.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.glacier#DeleteVaultInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"accountId\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>AccountId</code> value is the AWS account ID of the account that owns the\\n         vault. You can either specify an AWS account ID or optionally a single '<code>-</code>'\\n         (hyphen), in which case Amazon S3 Glacier uses the AWS account ID associated with the\\n         credentials used to sign the request. If you use an account ID, do not include any hyphens\\n         ('-') in the ID.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"vaultName\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the vault.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Provides options for deleting a vault from Amazon S3 Glacier.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.glacier#DeleteVaultNotifications\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.glacier#DeleteVaultNotificationsInput\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.glacier#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#MissingParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This operation deletes the notification configuration set for a vault. The operation\\n         is eventually consistent; that is, it might take some time for Amazon S3 Glacier to completely\\n         disable the notifications and you might still receive some notifications for a short time\\n         after you send the delete request.</p>\\n\\n         <p>An AWS account has full permission to perform all operations (actions). However, AWS\\n         Identity and Access Management (IAM) users don't have any permissions by default. You must\\n         grant them explicit permission to perform specific actions. For more information, see\\n         <a href=\\\"https://docs.aws.amazon.com/amazonglacier/latest/dev/using-iam-with-amazon-glacier.html\\\">Access\\n            Control Using AWS Identity and Access Management (IAM)</a>.</p>\\n         <p> For conceptual information and underlying REST API, see <a href=\\\"https://docs.aws.amazon.com/amazonglacier/latest/dev/configuring-notifications.html\\\">Configuring Vault\\n            Notifications in Amazon S3 Glacier</a> and <a href=\\\"https://docs.aws.amazon.com/amazonglacier/latest/dev/api-vault-notifications-delete.html\\\">Delete Vault\\n            Notification Configuration </a> in the Amazon S3 Glacier Developer Guide. </p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To delete the notification configuration set for a vault\",\n                        \"documentation\": \"The example deletes the notification configuration set for the vault named examplevault.\",\n                        \"input\": {\n                            \"accountId\": \"-\",\n                            \"vaultName\": \"examplevault\"\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"DELETE\",\n                    \"uri\": \"/{accountId}/vaults/{vaultName}/notification-configuration\",\n                    \"code\": 204\n                }\n            }\n        },\n        \"com.amazonaws.glacier#DeleteVaultNotificationsInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"accountId\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>AccountId</code> value is the AWS account ID of the account that owns the\\n         vault. You can either specify an AWS account ID or optionally a single '<code>-</code>'\\n         (hyphen), in which case Amazon S3 Glacier uses the AWS account ID associated with the\\n         credentials used to sign the request. If you use an account ID, do not include any hyphens\\n         ('-') in the ID. </p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"vaultName\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the vault.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Provides options for deleting a vault notification configuration from an Amazon\\n         Glacier vault.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.glacier#DescribeJob\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.glacier#DescribeJobInput\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.glacier#GlacierJobDescription\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.glacier#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#MissingParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This operation returns information about a job you previously initiated, including\\n         the job initiation date, the user who initiated the job, the job status code/message and\\n         the Amazon SNS topic to notify after Amazon S3 Glacier (Glacier) completes the job. For more information\\n         about initiating a job, see <a>InitiateJob</a>. </p>\\n\\n         <note>\\n            <p>This operation enables you to check the status of your job. However, it is\\n            strongly recommended that you set up an Amazon SNS topic and specify it in your initiate\\n            job request so that Glacier can notify the topic after it completes the\\n            job.</p>\\n         </note>\\n\\n         <p>A job ID will not expire for at least 24 hours after Glacier completes the\\n         job.</p>\\n\\n         <p>An AWS account has full permission to perform all operations (actions). However, AWS\\n         Identity and Access Management (IAM) users don't have any permissions by default. You must\\n         grant them explicit permission to perform specific actions. For more information, see\\n            <a href=\\\"https://docs.aws.amazon.com/amazonglacier/latest/dev/using-iam-with-amazon-glacier.html\\\">Access Control Using\\n            AWS Identity and Access Management (IAM)</a>.</p>\\n\\n         <p> For more information about using this operation, \\n         see the documentation for the underlying REST API <a href=\\\"https://docs.aws.amazon.com/amazonglacier/latest/dev/api-describe-job-get.html\\\">Describe Job</a> \\n         in the <i>Amazon Glacier Developer Guide</i>. </p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To get information about a previously initiated job\",\n                        \"documentation\": \"The example returns information about the previously initiated job specified by the job ID.\",\n                        \"input\": {\n                            \"accountId\": \"-\",\n                            \"vaultName\": \"my-vault\",\n                            \"jobId\": \"zbxcm3Z_3z5UkoroF7SuZKrxgGoDc3RloGduS7Eg-RO47Yc6FxsdGBgf_Q2DK5Ejh18CnTS5XW4_XqlNHS61dsO4Cn\"\n                        },\n                        \"output\": {\n                            \"InventoryRetrievalParameters\": {\n                                \"Format\": \"JSON\"\n                            },\n                            \"VaultARN\": \"arn:aws:glacier:us-west-2:0123456789012:vaults/my-vault\",\n                            \"Completed\": false,\n                            \"JobId\": \"zbxcm3Z_3z5UkoroF7SuZKrxgGoDc3RloGduS7Eg-RO47Yc6FxsdGBgf_Q2DK5Ejh18CnTS5XW4_XqlNHS61dsO4CnMW\",\n                            \"Action\": \"InventoryRetrieval\",\n                            \"CreationDate\": \"2015-07-17T20:23:41.616Z\",\n                            \"StatusCode\": \"InProgress\"\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/{accountId}/vaults/{vaultName}/jobs/{jobId}\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.glacier#DescribeJobInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"accountId\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>AccountId</code> value is the AWS account ID of the account that owns the\\n         vault. You can either specify an AWS account ID or optionally a single '<code>-</code>'\\n         (hyphen), in which case Amazon S3 Glacier uses the AWS account ID associated with the\\n         credentials used to sign the request. If you use an account ID, do not include any hyphens\\n         ('-') in the ID. </p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"vaultName\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the vault.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"jobId\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the job to describe.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Provides options for retrieving a job description.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.glacier#DescribeVault\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.glacier#DescribeVaultInput\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.glacier#DescribeVaultOutput\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.glacier#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#MissingParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This operation returns information about a vault, including the vault's Amazon\\n         Resource Name (ARN), the date the vault was created, the number of archives it contains,\\n         and the total size of all the archives in the vault. The number of archives and their total\\n         size are as of the last inventory generation. This means that if you add or remove an\\n         archive from a vault, and then immediately use Describe Vault, the change in contents will\\n         not be immediately reflected. If you want to retrieve the latest inventory of the vault,\\n         use <a>InitiateJob</a>. Amazon S3 Glacier generates vault inventories approximately\\n         daily. For more information, see <a href=\\\"https://docs.aws.amazon.com/amazonglacier/latest/dev/vault-inventory.html\\\">Downloading a Vault Inventory in\\n            Amazon S3 Glacier</a>. </p>\\n\\n         <p>An AWS account has full permission to perform all operations (actions). However, AWS\\n         Identity and Access Management (IAM) users don't have any permissions by default. You must\\n         grant them explicit permission to perform specific actions. For more information, see\\n            <a href=\\\"https://docs.aws.amazon.com/amazonglacier/latest/dev/using-iam-with-amazon-glacier.html\\\">Access Control Using\\n            AWS Identity and Access Management (IAM)</a>.</p>\\n         <p>For conceptual information and underlying REST API, see <a href=\\\"https://docs.aws.amazon.com/amazonglacier/latest/dev/retrieving-vault-info.html\\\">Retrieving Vault Metadata in\\n            Amazon S3 Glacier</a> and <a href=\\\"https://docs.aws.amazon.com/amazonglacier/latest/dev/api-vault-get.html\\\">Describe Vault </a> in the\\n            <i>Amazon Glacier Developer Guide</i>. </p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To retrieve information about a vault\",\n                        \"documentation\": \"The example retrieves data about a vault named my-vault.\",\n                        \"input\": {\n                            \"vaultName\": \"my-vault\",\n                            \"accountId\": \"-\"\n                        },\n                        \"output\": {\n                            \"SizeInBytes\": 0,\n                            \"VaultARN\": \"arn:aws:glacier:us-west-2:111122223333:vaults/my-vault\",\n                            \"NumberOfArchives\": 0,\n                            \"CreationDate\": \"2016-09-23T19:27:18.665Z\",\n                            \"VaultName\": \"my-vault\"\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/{accountId}/vaults/{vaultName}\",\n                    \"code\": 200\n                },\n                \"smithy.waiters#waitable\": {\n                    \"VaultExists\": {\n                        \"acceptors\": [\n                            {\n                                \"state\": \"success\",\n                                \"matcher\": {\n                                    \"success\": true\n                                }\n                            },\n                            {\n                                \"state\": \"retry\",\n                                \"matcher\": {\n                                    \"errorType\": \"ResourceNotFoundException\"\n                                }\n                            }\n                        ],\n                        \"minDelay\": 3\n                    },\n                    \"VaultNotExists\": {\n                        \"acceptors\": [\n                            {\n                                \"state\": \"retry\",\n                                \"matcher\": {\n                                    \"success\": true\n                                }\n                            },\n                            {\n                                \"state\": \"success\",\n                                \"matcher\": {\n                                    \"errorType\": \"ResourceNotFoundException\"\n                                }\n                            }\n                        ],\n                        \"minDelay\": 3\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.glacier#DescribeVaultInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"accountId\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>AccountId</code> value is the AWS account ID of the account that owns the\\n         vault. You can either specify an AWS account ID or optionally a single '<code>-</code>'\\n         (hyphen), in which case Amazon S3 Glacier uses the AWS account ID associated with the\\n         credentials used to sign the request. If you use an account ID, do not include any hyphens\\n         ('-') in the ID. </p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"vaultName\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the vault.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Provides options for retrieving metadata for a specific vault in Amazon\\n         Glacier.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.glacier#DescribeVaultOutput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VaultARN\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the vault.</p>\"\n                    }\n                },\n                \"VaultName\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the vault.</p>\"\n                    }\n                },\n                \"CreationDate\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Universal Coordinated Time (UTC) date when the vault was created. This value\\n         should be a string in the ISO 8601 date format, for example\\n            <code>2012-03-20T17:03:43.221Z</code>.</p>\"\n                    }\n                },\n                \"LastInventoryDate\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Universal Coordinated Time (UTC) date when Amazon S3 Glacier completed the last\\n         vault inventory.  This value should be a string in the ISO 8601 date format, for example\\n            <code>2012-03-20T17:03:43.221Z</code>.</p>\"\n                    }\n                },\n                \"NumberOfArchives\": {\n                    \"target\": \"com.amazonaws.glacier#long\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The number of archives in the vault as of the last inventory date. This field will\\n         return <code>null</code> if an inventory has not yet run on the vault, for example if you\\n         just created the vault.</p>\"\n                    }\n                },\n                \"SizeInBytes\": {\n                    \"target\": \"com.amazonaws.glacier#long\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>Total size, in bytes, of the archives in the vault as of the last inventory date.\\n         This field will return null if an inventory has not yet run on the vault, for example if\\n         you just created the vault.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the Amazon S3 Glacier response to your request.</p>\"\n            }\n        },\n        \"com.amazonaws.glacier#Encryption\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"EncryptionType\": {\n                    \"target\": \"com.amazonaws.glacier#EncryptionType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The server-side encryption algorithm used when storing job results in Amazon S3, for\\n            example <code>AES256</code> or <code>aws:kms</code>.</p>\"\n                    }\n                },\n                \"KMSKeyId\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The AWS KMS key ID to use for object encryption. All GET and PUT requests for an\\n            object protected by AWS KMS fail if not made by using Secure Sockets Layer (SSL) or\\n            Signature Version 4. </p>\"\n                    }\n                },\n                \"KMSContext\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Optional. If the encryption type is <code>aws:kms</code>, you can use this value to\\n            specify the encryption context for the job results.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains information about the encryption used to store the job results in Amazon S3. </p>\"\n            }\n        },\n        \"com.amazonaws.glacier#EncryptionType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"KMS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"aws:kms\"\n                    }\n                },\n                \"S3\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AES256\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.glacier#ExpressionType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"SQL\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"SQL\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.glacier#FileHeaderInfo\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"Use\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"USE\"\n                    }\n                },\n                \"Ignore\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"IGNORE\"\n                    }\n                },\n                \"None\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"NONE\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.glacier#GetDataRetrievalPolicy\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.glacier#GetDataRetrievalPolicyInput\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.glacier#GetDataRetrievalPolicyOutput\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.glacier#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#MissingParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This operation returns the current data retrieval policy for the account and region\\n         specified in the GET request. For more information about data retrieval policies, see\\n            <a href=\\\"https://docs.aws.amazon.com/amazonglacier/latest/dev/data-retrieval-policy.html\\\">Amazon Glacier Data Retrieval Policies</a>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To get the current data retrieval policy for an account\",\n                        \"documentation\": \"The example returns the current data retrieval policy for the account.\",\n                        \"input\": {\n                            \"accountId\": \"-\"\n                        },\n                        \"output\": {\n                            \"Policy\": {\n                                \"Rules\": [\n                                    {\n                                        \"BytesPerHour\": 10737418240,\n                                        \"Strategy\": \"BytesPerHour\"\n                                    }\n                                ]\n                            }\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/{accountId}/policies/data-retrieval\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.glacier#GetDataRetrievalPolicyInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"accountId\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>AccountId</code> value is the AWS account ID. This value must match the AWS\\n         account ID associated with the credentials used to sign the request. You can either specify\\n         an AWS account ID or optionally a single '<code>-</code>' (hyphen), in which case Amazon\\n         Glacier uses the AWS account ID associated with the credentials used to sign the request.\\n         If you specify your account ID, do not include any hyphens ('-') in the ID. </p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Input for GetDataRetrievalPolicy.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.glacier#GetDataRetrievalPolicyOutput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Policy\": {\n                    \"target\": \"com.amazonaws.glacier#DataRetrievalPolicy\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Contains the returned data retrieval policy in JSON format.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the Amazon S3 Glacier response to the <code>GetDataRetrievalPolicy</code>\\n         request.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.glacier#GetJobOutput\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.glacier#GetJobOutputInput\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.glacier#GetJobOutputOutput\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.glacier#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#MissingParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This operation downloads the output of the job you initiated using <a>InitiateJob</a>. Depending on the job type you specified when you initiated the\\n         job, the output will be either the content of an archive or a vault inventory.</p>\\n\\n         <p>You can download all the job output or download a portion of the output by specifying\\n         a byte range. In the case of an archive retrieval job, depending on the byte range you\\n         specify, Amazon S3 Glacier (Glacier) returns the checksum for the portion of the data. You can compute the\\n         checksum on the client and verify that the values match to ensure the portion you downloaded\\n         is the correct data.</p>\\n         <p>A job ID will not expire for at least 24 hours after Glacier completes the job. That\\n         a byte range. For both archive and inventory retrieval jobs, you should verify the downloaded \\n         size against the size returned in the headers from the \\n         <b>Get Job Output</b> response.</p>\\n         <p>For archive retrieval jobs, you should also verify that the size is what you expected. If\\n         you download a portion of the output, the expected size is based on the range of bytes\\n         you specified. For example, if you specify a range of <code>bytes=0-1048575</code>, you should\\n         verify your download size is 1,048,576 bytes. If you download an entire archive, the\\n         expected size is the size of the archive when you uploaded it to Amazon S3 Glacier\\n         The expected size is also returned in the headers from the \\n         <b>Get Job Output</b> response.</p>\\n         <p>In the case of an archive retrieval job, depending on the byte range you\\n         specify, Glacier returns the checksum for the portion of the data. To ensure the portion you downloaded \\n         is the correct data, compute the checksum on the client, verify that the values match, \\n         and verify that the size is what you expected.</p>\\n      \\n         <p>A job ID does not expire for at least 24 hours after Glacier completes the\\n         job. That is, you can download the job output within the 24 hours period after Amazon\\n         Glacier completes the job.</p>    \\n\\n         <p>An AWS account has full permission to perform all operations (actions). However, AWS\\n         Identity and Access Management (IAM) users don't have any permissions by default. You must\\n         grant them explicit permission to perform specific actions. For more information, see\\n            <a href=\\\"https://docs.aws.amazon.com/amazonglacier/latest/dev/using-iam-with-amazon-glacier.html\\\">Access Control Using\\n            AWS Identity and Access Management (IAM)</a>.</p>\\n         <p>For conceptual information and the underlying REST API, see <a href=\\\"https://docs.aws.amazon.com/amazonglacier/latest/dev/vault-inventory.html\\\">Downloading a\\n            Vault Inventory</a>, <a href=\\\"https://docs.aws.amazon.com/amazonglacier/latest/dev/downloading-an-archive.html\\\">Downloading an\\n            Archive</a>, and <a href=\\\"https://docs.aws.amazon.com/amazonglacier/latest/dev/api-job-output-get.html\\\">Get Job Output </a>\\n         </p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To get the output of a previously initiated job\",\n                        \"documentation\": \"The example downloads the output of a previously initiated inventory retrieval job that is identified by the job ID.\",\n                        \"input\": {\n                            \"accountId\": \"-\",\n                            \"vaultName\": \"my-vaul\",\n                            \"jobId\": \"zbxcm3Z_3z5UkoroF7SuZKrxgGoDc3RloGduS7Eg-RO47Yc6FxsdGBgf_Q2DK5Ejh18CnTS5XW4_XqlNHS61dsO4CnMW\",\n                            \"range\": \"\"\n                        },\n                        \"output\": {\n                            \"status\": 200,\n                            \"acceptRanges\": \"bytes\",\n                            \"contentType\": \"application/json\",\n                            \"body\": \"inventory-data\"\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/{accountId}/vaults/{vaultName}/jobs/{jobId}/output\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.glacier#GetJobOutputInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"accountId\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>AccountId</code> value is the AWS account ID of the account that owns the\\n         vault. You can either specify an AWS account ID or optionally a single '<code>-</code>'\\n         (hyphen), in which case Amazon S3 Glacier uses the AWS account ID associated with the\\n         credentials used to sign the request. If you use an account ID, do not include any hyphens\\n         ('-') in the ID.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"vaultName\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the vault.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"jobId\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The job ID whose data is downloaded.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"range\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The range of bytes to retrieve from the output. For example, if you want to download\\n         the first 1,048,576 bytes, specify the range as <code>bytes=0-1048575</code>. By default, this operation\\n         downloads the entire output.</p>\\n      \\n         <p>If the job output is large, then you can use a range to\\n         retrieve a portion of the output. This allows you to download the entire output in smaller\\n         chunks of bytes. For example, suppose you have 1 GB of job output you want to download and\\n         you decide to download 128 MB chunks of data at a time, which is a total of eight Get Job\\n         Output requests. You use the following process to download the job output:</p>\\n     \\n         <ol>\\n            <li>\\n               <p>Download a 128 MB chunk of output by specifying the appropriate byte range.\\n                  Verify that all 128 MB of data was received.</p>\\n            </li>\\n            <li>\\n               <p>Along with the data, the response includes a SHA256 tree hash of the payload.\\n                  You compute the checksum of the payload on the client and compare it with the\\n                  checksum you received in the response to ensure you received all the expected\\n                  data.</p>\\n            </li>\\n            <li>\\n               <p>Repeat steps 1 and 2 for all the eight 128 MB chunks of output data, each time\\n                  specifying the appropriate byte range.</p>\\n            </li>\\n            <li>\\n               <p>After downloading all the parts of the job output, you have a list of eight\\n                  checksum values. Compute the tree hash of these values to find the checksum of the\\n                  entire output. Using the <a>DescribeJob</a> API, obtain job information of\\n                  the job that provided you the output. The response includes the checksum of the\\n                  entire archive stored in Amazon S3 Glacier. You compare this value with the checksum you\\n                  computed to ensure you have downloaded the entire archive content with no\\n                  errors.</p>\\n               <p></p>\\n            </li>\\n         </ol>\",\n                        \"smithy.api#httpHeader\": \"Range\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Provides options for downloading output of an Amazon S3 Glacier job.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.glacier#GetJobOutputOutput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"body\": {\n                    \"target\": \"com.amazonaws.glacier#Stream\",\n                    \"traits\": {\n                        \"smithy.api#default\": \"\",\n                        \"smithy.api#documentation\": \"<p>The job data, either archive data or inventory data.</p>\",\n                        \"smithy.api#httpPayload\": {}\n                    }\n                },\n                \"checksum\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The checksum of the data in the response. This header is returned only when\\n         retrieving the output for an archive retrieval job. Furthermore, this header appears only\\n         under the following conditions:</p>\\n         <ul>\\n            <li>\\n                <p>You get the entire range of the archive.</p>\\n            </li>\\n            <li>\\n               <p>You request a range to return of the archive that starts and ends on a multiple\\n               of 1 MB. For example, if you have an 3.1 MB archive and you specify a range to return\\n               that starts at 1 MB and ends at 2 MB, then the x-amz-sha256-tree-hash is returned as\\n               a response header.</p>\\n            </li>\\n            <li>\\n               <p>You request a range of the archive to return that starts on a multiple of 1 MB\\n               and goes to the end of the archive. For example, if you have a 3.1 MB archive and you\\n               specify a range that starts at 2 MB and ends at 3.1 MB (the end of the archive), then\\n               the x-amz-sha256-tree-hash is returned as a response header.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#httpHeader\": \"x-amz-sha256-tree-hash\"\n                    }\n                },\n                \"status\": {\n                    \"target\": \"com.amazonaws.glacier#httpstatus\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The HTTP response code for a job output request. The value depends on whether a range\\n         was specified in the request.</p>\",\n                        \"smithy.api#httpResponseCode\": {}\n                    }\n                },\n                \"contentRange\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The range of bytes returned by Amazon S3 Glacier. If only partial output is downloaded,\\n         the response provides the range of bytes Amazon S3 Glacier returned. For example, bytes\\n         0-1048575/8388608 returns the first 1 MB from 8 MB.</p>\",\n                        \"smithy.api#httpHeader\": \"Content-Range\"\n                    }\n                },\n                \"acceptRanges\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates the range units accepted. For more information, see <a href=\\\"http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html\\\">RFC2616</a>. </p>\",\n                        \"smithy.api#httpHeader\": \"Accept-Ranges\"\n                    }\n                },\n                \"contentType\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Content-Type depends on whether the job output is an archive or a vault\\n         inventory. For archive data, the Content-Type is application/octet-stream. For vault\\n         inventory, if you requested CSV format when you initiated the job, the Content-Type is\\n         text/csv. Otherwise, by default, vault inventory is returned as JSON, and the Content-Type\\n         is application/json.</p>\",\n                        \"smithy.api#httpHeader\": \"Content-Type\"\n                    }\n                },\n                \"archiveDescription\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The description of an archive.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amz-archive-description\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the Amazon S3 Glacier response to your request.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.glacier#GetVaultAccessPolicy\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.glacier#GetVaultAccessPolicyInput\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.glacier#GetVaultAccessPolicyOutput\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.glacier#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#MissingParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This operation retrieves the <code>access-policy</code> subresource set on the vault;\\n         for more information on setting this subresource, see <a href=\\\"https://docs.aws.amazon.com/amazonglacier/latest/dev/api-SetVaultAccessPolicy.html\\\">Set Vault Access Policy\\n            (PUT access-policy)</a>. If there is no access policy set on the vault, the\\n         operation returns a <code>404 Not found</code> error. For more information about vault\\n         access policies, see <a href=\\\"https://docs.aws.amazon.com/amazonglacier/latest/dev/vault-access-policy.html\\\">Amazon Glacier Access Control\\n            with Vault Access Policies</a>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To  get the access-policy set on the vault\",\n                        \"documentation\": \"The example retrieves the access-policy set on the vault named example-vault.\",\n                        \"input\": {\n                            \"accountId\": \"-\",\n                            \"vaultName\": \"example-vault\"\n                        },\n                        \"output\": {\n                            \"policy\": {\n                                \"Policy\": \"{\\\"Version\\\":\\\"2012-10-17\\\",\\\"Statement\\\":[{\\\"Sid\\\":\\\"Define-owner-access-rights\\\",\\\"Effect\\\":\\\"Allow\\\",\\\"Principal\\\":{\\\"AWS\\\":\\\"arn:aws:iam::999999999999:root\\\"},\\\"Action\\\":\\\"glacier:DeleteArchive\\\",\\\"Resource\\\":\\\"arn:aws:glacier:us-west-2:999999999999:vaults/examplevault\\\"}]}\"\n                            }\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/{accountId}/vaults/{vaultName}/access-policy\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.glacier#GetVaultAccessPolicyInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"accountId\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>AccountId</code> value is the AWS account ID of the account that owns the\\n         vault. You can either specify an AWS account ID or optionally a single '<code>-</code>'\\n         (hyphen), in which case Amazon S3 Glacier uses the AWS account ID associated with the\\n         credentials used to sign the request. If you use an account ID, do not include any hyphens\\n         ('-') in the ID.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"vaultName\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the vault.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Input for GetVaultAccessPolicy.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.glacier#GetVaultAccessPolicyOutput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"policy\": {\n                    \"target\": \"com.amazonaws.glacier#VaultAccessPolicy\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Contains the returned vault access policy as a JSON string.</p>\",\n                        \"smithy.api#httpPayload\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Output for GetVaultAccessPolicy.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.glacier#GetVaultLock\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.glacier#GetVaultLockInput\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.glacier#GetVaultLockOutput\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.glacier#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#MissingParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This operation retrieves the following attributes from the <code>lock-policy</code>\\n         subresource set on the specified vault: </p>\\n         <ul>\\n            <li>\\n               <p>The vault lock policy set on the vault.</p>\\n            </li>\\n            <li>\\n               <p>The state of the vault lock, which is either <code>InProgess</code> or\\n                  <code>Locked</code>.</p>\\n            </li>\\n            <li>\\n               <p>When the lock ID expires. The lock ID is used to complete the vault locking\\n               process.</p>\\n            </li>\\n            <li>\\n               <p>When the vault lock was initiated and put into the <code>InProgress</code>\\n               state.</p>\\n            </li>\\n         </ul>\\n\\n         <p>A vault lock is put into the <code>InProgress</code> state by calling <a>InitiateVaultLock</a>. A vault lock is put into the <code>Locked</code> state by\\n         calling <a>CompleteVaultLock</a>. You can abort the vault locking process by\\n         calling <a>AbortVaultLock</a>. For more information about the vault locking\\n         process, <a href=\\\"https://docs.aws.amazon.com/amazonglacier/latest/dev/vault-lock.html\\\">Amazon\\n            Glacier Vault Lock</a>. </p>\\n         <p>If there is no vault lock policy set on the vault, the operation returns a <code>404\\n            Not found</code> error. For more information about vault lock policies, <a href=\\\"https://docs.aws.amazon.com/amazonglacier/latest/dev/vault-lock-policy.html\\\">Amazon\\n            Glacier Access Control with Vault Lock Policies</a>. </p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To retrieve vault lock-policy related attributes that are set on a vault\",\n                        \"documentation\": \"The example retrieves the attributes from the lock-policy subresource set on the vault named examplevault.\",\n                        \"input\": {\n                            \"accountId\": \"-\",\n                            \"vaultName\": \"examplevault\"\n                        },\n                        \"output\": {\n                            \"Policy\": \"{\\\"Version\\\":\\\"2012-10-17\\\",\\\"Statement\\\":[{\\\"Sid\\\":\\\"Define-vault-lock\\\",\\\"Effect\\\":\\\"Deny\\\",\\\"Principal\\\":{\\\"AWS\\\":\\\"arn:aws:iam::999999999999:root\\\"},\\\"Action\\\":\\\"glacier:DeleteArchive\\\",\\\"Resource\\\":\\\"arn:aws:glacier:us-west-2:999999999999:vaults/examplevault\\\",\\\"Condition\\\":{\\\"NumericLessThanEquals\\\":{\\\"glacier:ArchiveAgeinDays\\\":\\\"365\\\"}}}]}\",\n                            \"State\": \"InProgress\",\n                            \"ExpirationDate\": \"exampledate\",\n                            \"CreationDate\": \"exampledate\"\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/{accountId}/vaults/{vaultName}/lock-policy\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.glacier#GetVaultLockInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"accountId\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>AccountId</code> value is the AWS account ID of the account that owns the\\n         vault. You can either specify an AWS account ID or optionally a single '<code>-</code>'\\n         (hyphen), in which case Amazon S3 Glacier uses the AWS account ID associated with the\\n         credentials used to sign the request. If you use an account ID, do not include any hyphens\\n         ('-') in the ID.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"vaultName\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the vault.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The input values for <code>GetVaultLock</code>.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.glacier#GetVaultLockOutput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Policy\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The vault lock policy as a JSON string, which uses \\\"\\\\\\\" as an escape\\n         character.</p>\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The state of the vault lock. <code>InProgress</code> or\\n         <code>Locked</code>.</p>\"\n                    }\n                },\n                \"ExpirationDate\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The UTC date and time at which the lock ID expires. This value can be\\n            <code>null</code> if the vault lock is in a <code>Locked</code> state.</p>\"\n                    }\n                },\n                \"CreationDate\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The UTC date and time at which the vault lock was put into the\\n            <code>InProgress</code> state.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the Amazon S3 Glacier response to your request.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.glacier#GetVaultNotifications\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.glacier#GetVaultNotificationsInput\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.glacier#GetVaultNotificationsOutput\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.glacier#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#MissingParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This operation retrieves the <code>notification-configuration</code> subresource of\\n         the specified vault.</p>\\n\\n         <p>For information about setting a notification configuration on a vault, see <a>SetVaultNotifications</a>. If a notification configuration for a vault is not\\n         set, the operation returns a <code>404 Not Found</code> error. For more information about\\n         vault notifications, see <a href=\\\"https://docs.aws.amazon.com/amazonglacier/latest/dev/configuring-notifications.html\\\">Configuring Vault\\n            Notifications in Amazon S3 Glacier</a>. </p>\\n\\n         <p>An AWS account has full permission to perform all operations (actions). However, AWS\\n         Identity and Access Management (IAM) users don't have any permissions by default. You must\\n         grant them explicit permission to perform specific actions. For more information, see\\n            <a href=\\\"https://docs.aws.amazon.com/amazonglacier/latest/dev/using-iam-with-amazon-glacier.html\\\">Access Control Using\\n            AWS Identity and Access Management (IAM)</a>.</p>\\n         <p>For conceptual information and underlying REST API, see <a href=\\\"https://docs.aws.amazon.com/amazonglacier/latest/dev/configuring-notifications.html\\\">Configuring Vault\\n            Notifications in Amazon S3 Glacier</a> and <a href=\\\"https://docs.aws.amazon.com/amazonglacier/latest/dev/api-vault-notifications-get.html\\\">Get Vault Notification\\n            Configuration </a> in the <i>Amazon Glacier Developer Guide</i>. </p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To get the notification-configuration for the specified vault\",\n                        \"documentation\": \"The example retrieves the notification-configuration for the vault named my-vault.\",\n                        \"input\": {\n                            \"accountId\": \"-\",\n                            \"vaultName\": \"my-vault\"\n                        },\n                        \"output\": {\n                            \"vaultNotificationConfig\": {\n                                \"Events\": [\n                                    \"InventoryRetrievalCompleted\",\n                                    \"ArchiveRetrievalCompleted\"\n                                ],\n                                \"SNSTopic\": \"arn:aws:sns:us-west-2:0123456789012:my-vault\"\n                            }\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/{accountId}/vaults/{vaultName}/notification-configuration\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.glacier#GetVaultNotificationsInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"accountId\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>AccountId</code> value is the AWS account ID of the account that owns the\\n         vault. You can either specify an AWS account ID or optionally a single '<code>-</code>'\\n         (hyphen), in which case Amazon S3 Glacier uses the AWS account ID associated with the\\n         credentials used to sign the request. If you use an account ID, do not include any hyphens\\n         ('-') in the ID.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"vaultName\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the vault.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Provides options for retrieving the notification configuration set on an Amazon\\n         Glacier vault.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.glacier#GetVaultNotificationsOutput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"vaultNotificationConfig\": {\n                    \"target\": \"com.amazonaws.glacier#VaultNotificationConfig\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Returns the notification configuration set on the vault.</p>\",\n                        \"smithy.api#httpPayload\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the Amazon S3 Glacier response to your request.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.glacier#Glacier\": {\n            \"type\": \"service\",\n            \"version\": \"2012-06-01\",\n            \"operations\": [\n                {\n                    \"target\": \"com.amazonaws.glacier#AbortMultipartUpload\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#AbortVaultLock\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#AddTagsToVault\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#CompleteMultipartUpload\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#CompleteVaultLock\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#CreateVault\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#DeleteArchive\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#DeleteVault\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#DeleteVaultAccessPolicy\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#DeleteVaultNotifications\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#DescribeJob\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#DescribeVault\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#GetDataRetrievalPolicy\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#GetJobOutput\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#GetVaultAccessPolicy\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#GetVaultLock\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#GetVaultNotifications\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#InitiateJob\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#InitiateMultipartUpload\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#InitiateVaultLock\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#ListJobs\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#ListMultipartUploads\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#ListParts\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#ListProvisionedCapacity\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#ListTagsForVault\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#ListVaults\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#PurchaseProvisionedCapacity\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#RemoveTagsFromVault\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#SetDataRetrievalPolicy\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#SetVaultAccessPolicy\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#SetVaultNotifications\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#UploadArchive\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#UploadMultipartPart\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#service\": {\n                    \"sdkId\": \"Glacier\",\n                    \"arnNamespace\": \"glacier\",\n                    \"cloudFormationName\": \"Glacier\",\n                    \"cloudTrailEventSource\": \"glacier.amazonaws.com\",\n                    \"endpointPrefix\": \"glacier\"\n                },\n                \"aws.auth#sigv4\": {\n                    \"name\": \"glacier\"\n                },\n                \"aws.protocols#restJson1\": {},\n                \"smithy.api#documentation\": \"<p> Amazon S3 Glacier (Glacier) is a storage solution for \\\"cold data.\\\"</p>\\n\\n         <p>Glacier is an extremely low-cost storage service that provides secure,\\n         durable, and easy-to-use storage for data backup and archival. With Glacier,\\n         customers can store their data cost effectively for months, years, or decades. \\n         Glacier also enables customers to offload the administrative burdens of operating and\\n         scaling storage to AWS, so they don't have to worry about capacity planning, hardware\\n         provisioning, data replication, hardware failure and recovery, or time-consuming hardware\\n         migrations.</p>\\n\\n         <p>Glacier is a great storage choice when low storage cost is paramount and your\\n         data is rarely retrieved. If your\\n         application requires fast or frequent access to your data, consider using Amazon S3. For\\n         more information, see <a href=\\\"http://aws.amazon.com/s3/\\\">Amazon Simple Storage Service\\n            (Amazon S3)</a>.</p>\\n\\n         <p>You can store any kind of data in any format. There is no maximum limit on the total\\n         amount of data you can store in Glacier.</p>\\n\\n         <p>If you are a first-time user of Glacier, we recommend that you begin by\\n         reading the following sections in the <i>Amazon S3 Glacier Developer\\n         Guide</i>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/amazonglacier/latest/dev/introduction.html\\\">What is\\n                  Amazon S3 Glacier</a> - This section of the Developer Guide describes the\\n               underlying data model, the operations it supports, and the AWS SDKs that you can use\\n               to interact with the service.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/amazonglacier/latest/dev/amazon-glacier-getting-started.html\\\">Getting Started\\n                  with Amazon S3 Glacier</a> - The Getting Started section walks you through the\\n               process of creating a vault, uploading archives, creating jobs to download archives,\\n               retrieving the job output, and deleting archives.</p>\\n            </li>\\n         </ul>\",\n                \"smithy.api#title\": \"Amazon Glacier\",\n                \"smithy.api#xmlNamespace\": {\n                    \"uri\": \"http://glacier.amazonaws.com/doc/2012-06-01/\"\n                },\n                \"smithy.rules#endpointRuleSet\": {\n                    \"version\": \"1.0\",\n                    \"parameters\": {\n                        \"Region\": {\n                            \"builtIn\": \"AWS::Region\",\n                            \"required\": false,\n                            \"documentation\": \"The AWS region used to dispatch the request.\",\n                            \"type\": \"String\"\n                        },\n                        \"UseDualStack\": {\n                            \"builtIn\": \"AWS::UseDualStack\",\n                            \"required\": true,\n                            \"default\": false,\n                            \"documentation\": \"When true, use the dual-stack endpoint. If the configured endpoint does not support dual-stack, dispatching the request MAY return an error.\",\n                            \"type\": \"Boolean\"\n                        },\n                        \"UseFIPS\": {\n                            \"builtIn\": \"AWS::UseFIPS\",\n                            \"required\": true,\n                            \"default\": false,\n                            \"documentation\": \"When true, send this request to the FIPS-compliant regional endpoint. If the configured endpoint does not have a FIPS compliant endpoint, dispatching the request will return an error.\",\n                            \"type\": \"Boolean\"\n                        },\n                        \"Endpoint\": {\n                            \"builtIn\": \"SDK::Endpoint\",\n                            \"required\": false,\n                            \"documentation\": \"Override the endpoint used to send this request\",\n                            \"type\": \"String\"\n                        }\n                    },\n                    \"rules\": [\n                        {\n                            \"conditions\": [\n                                {\n                                    \"fn\": \"isSet\",\n                                    \"argv\": [\n                                        {\n                                            \"ref\": \"Endpoint\"\n                                        }\n                                    ]\n                                }\n                            ],\n                            \"rules\": [\n                                {\n                                    \"conditions\": [\n                                        {\n                                            \"fn\": \"booleanEquals\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"UseFIPS\"\n                                                },\n                                                true\n                                            ]\n                                        }\n                                    ],\n                                    \"error\": \"Invalid Configuration: FIPS and custom endpoint are not supported\",\n                                    \"type\": \"error\"\n                                },\n                                {\n                                    \"conditions\": [\n                                        {\n                                            \"fn\": \"booleanEquals\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"UseDualStack\"\n                                                },\n                                                true\n                                            ]\n                                        }\n                                    ],\n                                    \"error\": \"Invalid Configuration: Dualstack and custom endpoint are not supported\",\n                                    \"type\": \"error\"\n                                },\n                                {\n                                    \"conditions\": [],\n                                    \"endpoint\": {\n                                        \"url\": {\n                                            \"ref\": \"Endpoint\"\n                                        },\n                                        \"properties\": {},\n                                        \"headers\": {}\n                                    },\n                                    \"type\": \"endpoint\"\n                                }\n                            ],\n                            \"type\": \"tree\"\n                        },\n                        {\n                            \"conditions\": [\n                                {\n                                    \"fn\": \"isSet\",\n                                    \"argv\": [\n                                        {\n                                            \"ref\": \"Region\"\n                                        }\n                                    ]\n                                }\n                            ],\n                            \"rules\": [\n                                {\n                                    \"conditions\": [\n                                        {\n                                            \"fn\": \"aws.partition\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"Region\"\n                                                }\n                                            ],\n                                            \"assign\": \"PartitionResult\"\n                                        }\n                                    ],\n                                    \"rules\": [\n                                        {\n                                            \"conditions\": [\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseFIPS\"\n                                                        },\n                                                        true\n                                                    ]\n                                                },\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseDualStack\"\n                                                        },\n                                                        true\n                                                    ]\n                                                }\n                                            ],\n                                            \"rules\": [\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                true,\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"PartitionResult\"\n                                                                        },\n                                                                        \"supportsFIPS\"\n                                                                    ]\n                                                                }\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                true,\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"PartitionResult\"\n                                                                        },\n                                                                        \"supportsDualStack\"\n                                                                    ]\n                                                                }\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"rules\": [\n                                                        {\n                                                            \"conditions\": [],\n                                                            \"endpoint\": {\n                                                                \"url\": \"https://glacier-fips.{Region}.{PartitionResult#dualStackDnsSuffix}\",\n                                                                \"properties\": {},\n                                                                \"headers\": {}\n                                                            },\n                                                            \"type\": \"endpoint\"\n                                                        }\n                                                    ],\n                                                    \"type\": \"tree\"\n                                                },\n                                                {\n                                                    \"conditions\": [],\n                                                    \"error\": \"FIPS and DualStack are enabled, but this partition does not support one or both\",\n                                                    \"type\": \"error\"\n                                                }\n                                            ],\n                                            \"type\": \"tree\"\n                                        },\n                                        {\n                                            \"conditions\": [\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseFIPS\"\n                                                        },\n                                                        true\n                                                    ]\n                                                }\n                                            ],\n                                            \"rules\": [\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"PartitionResult\"\n                                                                        },\n                                                                        \"supportsFIPS\"\n                                                                    ]\n                                                                },\n                                                                true\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"rules\": [\n                                                        {\n                                                            \"conditions\": [\n                                                                {\n                                                                    \"fn\": \"stringEquals\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"fn\": \"getAttr\",\n                                                                            \"argv\": [\n                                                                                {\n                                                                                    \"ref\": \"PartitionResult\"\n                                                                                },\n                                                                                \"name\"\n                                                                            ]\n                                                                        },\n                                                                        \"aws-us-gov\"\n                                                                    ]\n                                                                }\n                                                            ],\n                                                            \"endpoint\": {\n                                                                \"url\": \"https://glacier.{Region}.amazonaws.com\",\n                                                                \"properties\": {},\n                                                                \"headers\": {}\n                                                            },\n                                                            \"type\": \"endpoint\"\n                                                        },\n                                                        {\n                                                            \"conditions\": [],\n                                                            \"endpoint\": {\n                                                                \"url\": \"https://glacier-fips.{Region}.{PartitionResult#dnsSuffix}\",\n                                                                \"properties\": {},\n                                                                \"headers\": {}\n                                                            },\n                                                            \"type\": \"endpoint\"\n                                                        }\n                                                    ],\n                                                    \"type\": \"tree\"\n                                                },\n                                                {\n                                                    \"conditions\": [],\n                                                    \"error\": \"FIPS is enabled but this partition does not support FIPS\",\n                                                    \"type\": \"error\"\n                                                }\n                                            ],\n                                            \"type\": \"tree\"\n                                        },\n                                        {\n                                            \"conditions\": [\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseDualStack\"\n                                                        },\n                                                        true\n                                                    ]\n                                                }\n                                            ],\n                                            \"rules\": [\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                true,\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"PartitionResult\"\n                                                                        },\n                                                                        \"supportsDualStack\"\n                                                                    ]\n                                                                }\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"rules\": [\n                                                        {\n                                                            \"conditions\": [],\n                                                            \"endpoint\": {\n                                                                \"url\": \"https://glacier.{Region}.{PartitionResult#dualStackDnsSuffix}\",\n                                                                \"properties\": {},\n                                                                \"headers\": {}\n                                                            },\n                                                            \"type\": \"endpoint\"\n                                                        }\n                                                    ],\n                                                    \"type\": \"tree\"\n                                                },\n                                                {\n                                                    \"conditions\": [],\n                                                    \"error\": \"DualStack is enabled but this partition does not support DualStack\",\n                                                    \"type\": \"error\"\n                                                }\n                                            ],\n                                            \"type\": \"tree\"\n                                        },\n                                        {\n                                            \"conditions\": [],\n                                            \"endpoint\": {\n                                                \"url\": \"https://glacier.{Region}.{PartitionResult#dnsSuffix}\",\n                                                \"properties\": {},\n                                                \"headers\": {}\n                                            },\n                                            \"type\": \"endpoint\"\n                                        }\n                                    ],\n                                    \"type\": \"tree\"\n                                }\n                            ],\n                            \"type\": \"tree\"\n                        },\n                        {\n                            \"conditions\": [],\n                            \"error\": \"Invalid Configuration: Missing Region\",\n                            \"type\": \"error\"\n                        }\n                    ]\n                },\n                \"smithy.rules#endpointTests\": {\n                    \"testCases\": [\n                        {\n                            \"documentation\": \"For region af-south-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://glacier.af-south-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"af-south-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://glacier.ap-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-northeast-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://glacier.ap-northeast-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-northeast-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-northeast-2 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://glacier.ap-northeast-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-northeast-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-northeast-3 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://glacier.ap-northeast-3.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-northeast-3\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-south-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://glacier.ap-south-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-south-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-southeast-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://glacier.ap-southeast-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-southeast-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-southeast-2 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://glacier.ap-southeast-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-southeast-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-southeast-3 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://glacier.ap-southeast-3.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-southeast-3\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ca-central-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://glacier.ca-central-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ca-central-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ca-central-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://glacier-fips.ca-central-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ca-central-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-central-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://glacier.eu-central-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-central-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-north-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://glacier.eu-north-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-north-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-south-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://glacier.eu-south-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-south-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-west-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://glacier.eu-west-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-west-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-west-2 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://glacier.eu-west-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-west-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-west-3 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://glacier.eu-west-3.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-west-3\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region me-south-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://glacier.me-south-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"me-south-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region sa-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://glacier.sa-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"sa-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://glacier.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://glacier-fips.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-2 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://glacier.us-east-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-2 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://glacier-fips.us-east-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-2\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-west-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://glacier.us-west-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-west-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-west-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://glacier-fips.us-west-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-west-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-west-2 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://glacier.us-west-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-west-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-west-2 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://glacier-fips.us-west-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-west-2\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-1 with FIPS enabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://glacier-fips.us-east-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-1 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://glacier.us-east-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-north-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://glacier.cn-north-1.amazonaws.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-north-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-northwest-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://glacier.cn-northwest-1.amazonaws.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-northwest-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-north-1 with FIPS enabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://glacier-fips.cn-north-1.api.amazonwebservices.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-north-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-north-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://glacier-fips.cn-north-1.amazonaws.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-north-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-north-1 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://glacier.cn-north-1.api.amazonwebservices.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-north-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://glacier.us-gov-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-east-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://glacier.us-gov-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-west-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://glacier.us-gov-west-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-west-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-west-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://glacier.us-gov-west-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-west-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-east-1 with FIPS enabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://glacier-fips.us-gov-east-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-east-1 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://glacier.us-gov-east-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-iso-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://glacier.us-iso-east-1.c2s.ic.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-iso-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-iso-west-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://glacier.us-iso-west-1.c2s.ic.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-iso-west-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-iso-east-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://glacier-fips.us-iso-east-1.c2s.ic.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-iso-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-isob-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://glacier.us-isob-east-1.sc2s.sgov.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-isob-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-isob-east-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://glacier-fips.us-isob-east-1.sc2s.sgov.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-isob-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For custom endpoint with region set and fips disabled and dualstack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://example.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"For custom endpoint with region not set and fips disabled and dualstack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://example.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"For custom endpoint with fips enabled and dualstack disabled\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: FIPS and custom endpoint are not supported\"\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false,\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"For custom endpoint with fips disabled and dualstack enabled\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: Dualstack and custom endpoint are not supported\"\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true,\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"Missing region\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: Missing Region\"\n                            }\n                        }\n                    ],\n                    \"version\": \"1.0\"\n                }\n            }\n        },\n        \"com.amazonaws.glacier#GlacierJobDescription\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"JobId\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An opaque string that identifies an Amazon S3 Glacier job.</p>\"\n                    }\n                },\n                \"JobDescription\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The job description provided when initiating the job.</p>\"\n                    }\n                },\n                \"Action\": {\n                    \"target\": \"com.amazonaws.glacier#ActionCode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The job type. This value is either <code>ArchiveRetrieval</code>,\\n                <code>InventoryRetrieval</code>, or\\n            <code>Select</code>. </p>\"\n                    }\n                },\n                \"ArchiveId\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The archive ID requested for a select job or archive retrieval. Otherwise, this\\n            field is null.</p>\"\n                    }\n                },\n                \"VaultARN\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the vault from which an archive retrieval was\\n            requested.</p>\"\n                    }\n                },\n                \"CreationDate\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The UTC date when the job was created. This value is a string representation of ISO\\n            8601 date format, for example <code>\\\"2012-03-20T17:03:43.221Z\\\"</code>.</p>\"\n                    }\n                },\n                \"Completed\": {\n                    \"target\": \"com.amazonaws.glacier#boolean\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>The job status. When a job is completed, you get the job's output using Get Job\\n            Output (GET output).</p>\"\n                    }\n                },\n                \"StatusCode\": {\n                    \"target\": \"com.amazonaws.glacier#StatusCode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The status code can be <code>InProgress</code>, <code>Succeeded</code>, or\\n                <code>Failed</code>, and indicates the status of the job.</p>\"\n                    }\n                },\n                \"StatusMessage\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A friendly message that describes the job status.</p>\"\n                    }\n                },\n                \"ArchiveSizeInBytes\": {\n                    \"target\": \"com.amazonaws.glacier#Size\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>For an archive retrieval job, this value is the size in bytes of the archive being\\n            requested for download. For an inventory retrieval or select job, this value is\\n            null.</p>\"\n                    }\n                },\n                \"InventorySizeInBytes\": {\n                    \"target\": \"com.amazonaws.glacier#Size\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>For an inventory retrieval job, this value is the size in bytes of the inventory\\n            requested for download. For an archive retrieval or select job, this value is\\n            null.</p>\"\n                    }\n                },\n                \"SNSTopic\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An Amazon SNS topic that receives notification.</p>\"\n                    }\n                },\n                \"CompletionDate\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The UTC time that the job request completed. While the job is in progress, the\\n            value is null.</p>\"\n                    }\n                },\n                \"SHA256TreeHash\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>For an archive retrieval job, this value is the checksum of the archive. Otherwise,\\n            this value is null.</p>\\n        <p>The SHA256 tree hash value for the requested range of an archive. If the <b>InitiateJob</b> request for an archive specified a tree-hash\\n            aligned range, then this field returns a value.</p>\\n        <p>If the whole archive is retrieved, this value is the same as the\\n            ArchiveSHA256TreeHash value.</p>\\n        <p>This field is null for the following:</p>\\n        <ul>\\n            <li>\\n                <p>Archive retrieval jobs that specify a range that is not tree-hash\\n                    aligned</p>\\n            </li>\\n         </ul>\\n        <ul>\\n            <li>\\n                <p>Archival jobs that specify a range that is equal to the whole archive, when\\n                    the job status is <code>InProgress</code>\\n               </p>\\n            </li>\\n         </ul>\\n        <ul>\\n            <li>\\n                <p>Inventory jobs</p>\\n            </li>\\n            <li>\\n                <p>Select jobs</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"ArchiveSHA256TreeHash\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The SHA256 tree hash of the entire archive for an archive retrieval. For inventory\\n            retrieval or select jobs, this field is null.</p>\"\n                    }\n                },\n                \"RetrievalByteRange\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The retrieved byte range for archive retrieval jobs in the form\\n                <i>StartByteValue</i>-<i>EndByteValue</i>. If no range\\n            was specified in the archive retrieval, then the whole archive is retrieved. In this\\n            case, <i>StartByteValue</i> equals 0 and <i>EndByteValue</i>\\n            equals the size of the archive minus 1. For inventory retrieval or select jobs, this\\n            field is null. </p>\"\n                    }\n                },\n                \"Tier\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tier to use for a select or an archive retrieval. Valid values are\\n                <code>Expedited</code>, <code>Standard</code>, or <code>Bulk</code>.\\n                <code>Standard</code> is the default.</p>\"\n                    }\n                },\n                \"InventoryRetrievalParameters\": {\n                    \"target\": \"com.amazonaws.glacier#InventoryRetrievalJobDescription\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Parameters used for range inventory retrieval.</p>\"\n                    }\n                },\n                \"JobOutputPath\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Contains the job output location.</p>\"\n                    }\n                },\n                \"SelectParameters\": {\n                    \"target\": \"com.amazonaws.glacier#SelectParameters\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Contains the parameters used for a select.</p>\"\n                    }\n                },\n                \"OutputLocation\": {\n                    \"target\": \"com.amazonaws.glacier#OutputLocation\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Contains the location where the data from the select job is stored.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the description of an Amazon S3 Glacier job.</p>\"\n            }\n        },\n        \"com.amazonaws.glacier#Grant\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Grantee\": {\n                    \"target\": \"com.amazonaws.glacier#Grantee\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The grantee.</p>\"\n                    }\n                },\n                \"Permission\": {\n                    \"target\": \"com.amazonaws.glacier#Permission\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the permission given to the grantee. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains information about a grant.</p>\"\n            }\n        },\n        \"com.amazonaws.glacier#Grantee\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Type\": {\n                    \"target\": \"com.amazonaws.glacier#Type\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Type of grantee</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DisplayName\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Screen name of the grantee.</p>\"\n                    }\n                },\n                \"URI\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>URI of the grantee group.</p>\"\n                    }\n                },\n                \"ID\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The canonical user ID of the grantee.</p>\"\n                    }\n                },\n                \"EmailAddress\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Email address of the grantee.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains information about the grantee.</p>\"\n            }\n        },\n        \"com.amazonaws.glacier#InitiateJob\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.glacier#InitiateJobInput\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.glacier#InitiateJobOutput\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.glacier#InsufficientCapacityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#MissingParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#PolicyEnforcedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This operation initiates a job of the specified type, which can be a select, an archival retrieval,\\n         or a vault retrieval. For more information about using this operation, \\n         see the documentation for the underlying REST API <a href=\\\"https://docs.aws.amazon.com/amazonglacier/latest/dev/api-initiate-job-post.html\\\">Initiate\\n            a Job</a>.\\n      </p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To initiate an inventory-retrieval job\",\n                        \"documentation\": \"The example initiates an inventory-retrieval job for the vault named examplevault.\",\n                        \"input\": {\n                            \"accountId\": \"-\",\n                            \"vaultName\": \"examplevault\",\n                            \"jobParameters\": {\n                                \"Type\": \"inventory-retrieval\",\n                                \"Description\": \"My inventory job\",\n                                \"Format\": \"CSV\",\n                                \"SNSTopic\": \"arn:aws:sns:us-west-2:111111111111:Glacier-InventoryRetrieval-topic-Example\"\n                            }\n                        },\n                        \"output\": {\n                            \"location\": \"/111122223333/vaults/examplevault/jobs/HkF9p6o7yjhFx-K3CGl6fuSm6VzW9T7esGQfco8nUXVYwS0jlb5gq1JZ55yHgt5vP54ZShjoQzQVVh7vEXAMPLEjobID\",\n                            \"jobId\": \" HkF9p6o7yjhFx-K3CGl6fuSm6VzW9T7esGQfco8nUXVYwS0jlb5gq1JZ55yHgt5vP54ZShjoQzQVVh7vEXAMPLEjobID\"\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"POST\",\n                    \"uri\": \"/{accountId}/vaults/{vaultName}/jobs\",\n                    \"code\": 202\n                }\n            }\n        },\n        \"com.amazonaws.glacier#InitiateJobInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"accountId\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>AccountId</code> value is the AWS account ID of the account that owns the\\n         vault. You can either specify an AWS account ID or optionally a single '<code>-</code>'\\n         (hyphen), in which case Amazon S3 Glacier uses the AWS account ID associated with the\\n         credentials used to sign the request. If you use an account ID, do not include any hyphens\\n         ('-') in the ID.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"vaultName\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the vault.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"jobParameters\": {\n                    \"target\": \"com.amazonaws.glacier#JobParameters\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Provides options for specifying job information.</p>\",\n                        \"smithy.api#httpPayload\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Provides options for initiating an Amazon S3 Glacier job.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.glacier#InitiateJobOutput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"location\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The relative URI path of the job.</p>\",\n                        \"smithy.api#httpHeader\": \"Location\"\n                    }\n                },\n                \"jobId\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the job.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amz-job-id\"\n                    }\n                },\n                \"jobOutputPath\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The path to the location of where the select results are stored.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amz-job-output-path\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the Amazon S3 Glacier response to your request.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.glacier#InitiateMultipartUpload\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.glacier#InitiateMultipartUploadInput\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.glacier#InitiateMultipartUploadOutput\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.glacier#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#MissingParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This operation initiates a multipart upload. Amazon S3 Glacier creates a multipart\\n         upload resource and returns its ID in the response. The multipart upload ID is used in\\n         subsequent requests to upload parts of an archive (see <a>UploadMultipartPart</a>).</p>\\n\\n         <p>When you initiate a multipart upload, you specify the part size in number of bytes.\\n         The part size must be a megabyte (1024 KB) multiplied by a power of 2-for example, 1048576\\n         (1 MB), 2097152 (2 MB), 4194304 (4 MB), 8388608 (8 MB), and so on. The minimum allowable\\n         part size is 1 MB, and the maximum is 4 GB.</p>\\n\\n         <p>Every part you upload to this resource (see <a>UploadMultipartPart</a>),\\n         except the last one, must have the same size. The last one can be the same size or smaller.\\n         For example, suppose you want to upload a 16.2 MB file. If you initiate the multipart\\n         upload with a part size of 4 MB, you will upload four parts of 4 MB each and one part of\\n         0.2 MB. </p>\\n\\n         <note>\\n            <p>You don't need to know the size of the archive when you start a multipart upload\\n            because Amazon S3 Glacier does not require you to specify the overall archive\\n            size.</p>\\n         </note>\\n\\n         <p>After you complete the multipart upload, Amazon S3 Glacier (Glacier) removes the multipart upload\\n         resource referenced by the ID. Glacier also removes the multipart upload resource if\\n         you cancel the multipart upload or it may be removed if there is no activity for a period\\n         of 24 hours.</p>\\n\\n         <p>An AWS account has full permission to perform all operations (actions). However, AWS\\n         Identity and Access Management (IAM) users don't have any permissions by default. You must\\n         grant them explicit permission to perform specific actions. For more information, see\\n            <a href=\\\"https://docs.aws.amazon.com/amazonglacier/latest/dev/using-iam-with-amazon-glacier.html\\\">Access Control Using\\n            AWS Identity and Access Management (IAM)</a>.</p>\\n         <p>For conceptual information and underlying REST API, see <a href=\\\"https://docs.aws.amazon.com/amazonglacier/latest/dev/uploading-archive-mpu.html\\\">Uploading Large Archives in\\n            Parts (Multipart Upload)</a> and <a href=\\\"https://docs.aws.amazon.com/amazonglacier/latest/dev/api-multipart-initiate-upload.html\\\">Initiate Multipart\\n            Upload</a> in the <i>Amazon Glacier Developer Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To initiate a multipart upload\",\n                        \"documentation\": \"The example initiates a multipart upload to a vault named my-vault with a part size of 1 MiB (1024 x 1024 bytes) per file.\",\n                        \"input\": {\n                            \"accountId\": \"-\",\n                            \"partSize\": \"1048576\",\n                            \"vaultName\": \"my-vault\"\n                        },\n                        \"output\": {\n                            \"location\": \"/111122223333/vaults/my-vault/multipart-uploads/19gaRezEXAMPLES6Ry5YYdqthHOC_kGRCT03L9yetr220UmPtBYKk-OssZtLqyFu7sY1_lR7vgFuJV6NtcV5zpsJ\",\n                            \"uploadId\": \"19gaRezEXAMPLES6Ry5YYdqthHOC_kGRCT03L9yetr220UmPtBYKk-OssZtLqyFu7sY1_lR7vgFuJV6NtcV5zpsJ\"\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"POST\",\n                    \"uri\": \"/{accountId}/vaults/{vaultName}/multipart-uploads\",\n                    \"code\": 201\n                }\n            }\n        },\n        \"com.amazonaws.glacier#InitiateMultipartUploadInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"accountId\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>AccountId</code> value is the AWS account ID of the account that owns the\\n         vault. You can either specify an AWS account ID or optionally a single '<code>-</code>'\\n         (hyphen), in which case Amazon S3 Glacier uses the AWS account ID associated with the\\n         credentials used to sign the request. If you use an account ID, do not include any hyphens\\n         ('-') in the ID. </p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"vaultName\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the vault.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"archiveDescription\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The archive description that you are uploading in parts.</p>\\n         <p>The part size must be a megabyte (1024 KB) multiplied by a power of 2, for example\\n         1048576 (1 MB), 2097152 (2 MB), 4194304 (4 MB), 8388608 (8 MB), and so on. The minimum\\n         allowable part size is 1 MB, and the maximum is 4 GB (4096 MB).</p>\",\n                        \"smithy.api#httpHeader\": \"x-amz-archive-description\"\n                    }\n                },\n                \"partSize\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The size of each part except the last, in bytes. The last part can be smaller than\\n         this part size.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amz-part-size\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Provides options for initiating a multipart upload to an Amazon S3 Glacier\\n         vault.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.glacier#InitiateMultipartUploadOutput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"location\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The relative URI path of the multipart upload ID Amazon S3 Glacier created.</p>\",\n                        \"smithy.api#httpHeader\": \"Location\"\n                    }\n                },\n                \"uploadId\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the multipart upload. This value is also included as part of the\\n         location.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amz-multipart-upload-id\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The Amazon S3 Glacier response to your request.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.glacier#InitiateVaultLock\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.glacier#InitiateVaultLockInput\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.glacier#InitiateVaultLockOutput\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.glacier#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#MissingParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This operation initiates the vault locking process by doing the following:</p>\\n         <ul>\\n            <li>\\n               <p>Installing a vault lock policy on the specified vault.</p>\\n            </li>\\n            <li>\\n               <p>Setting the lock state of vault lock to <code>InProgress</code>.</p>\\n            </li>\\n            <li>\\n               <p>Returning a lock ID, which is used to complete the vault locking\\n               process.</p>\\n            </li>\\n         </ul>\\n\\n         <p>You can set one vault lock policy for each vault and this policy can be up to 20 KB\\n         in size. For more information about vault lock policies, see <a href=\\\"https://docs.aws.amazon.com/amazonglacier/latest/dev/vault-lock-policy.html\\\">Amazon Glacier Access Control with\\n            Vault Lock Policies</a>. </p>\\n         <p>You must complete the vault locking process within 24 hours after the vault lock\\n         enters the <code>InProgress</code> state. After the 24 hour window ends, the lock ID\\n         expires, the vault automatically exits the <code>InProgress</code> state, and the vault\\n         lock policy is removed from the vault. You call <a>CompleteVaultLock</a> to\\n         complete the vault locking process by setting the state of the vault lock to\\n            <code>Locked</code>. </p>\\n         <p>After a vault lock is in the <code>Locked</code> state, you cannot initiate a new\\n         vault lock for the vault.</p>\\n\\n         <p>You can abort the vault locking process by calling <a>AbortVaultLock</a>.\\n         You can get the state of the vault lock by calling <a>GetVaultLock</a>. For more\\n         information about the vault locking process, <a href=\\\"https://docs.aws.amazon.com/amazonglacier/latest/dev/vault-lock.html\\\">Amazon Glacier Vault\\n         Lock</a>.</p>\\n\\n         <p>If this operation is called when the vault lock is in the <code>InProgress</code>\\n         state, the operation returns an <code>AccessDeniedException</code> error. When the vault\\n         lock is in the <code>InProgress</code> state you must call <a>AbortVaultLock</a>\\n         before you can initiate a new vault lock policy. </p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To initiate the vault locking process\",\n                        \"documentation\": \"The example initiates the vault locking process for the vault named my-vault.\",\n                        \"input\": {\n                            \"accountId\": \"-\",\n                            \"vaultName\": \"my-vault\",\n                            \"policy\": {\n                                \"Policy\": \"{\\\"Version\\\":\\\"2012-10-17\\\",\\\"Statement\\\":[{\\\"Sid\\\":\\\"Define-vault-lock\\\",\\\"Effect\\\":\\\"Deny\\\",\\\"Principal\\\":{\\\"AWS\\\":\\\"arn:aws:iam::999999999999:root\\\"},\\\"Action\\\":\\\"glacier:DeleteArchive\\\",\\\"Resource\\\":\\\"arn:aws:glacier:us-west-2:999999999999:vaults/examplevault\\\",\\\"Condition\\\":{\\\"NumericLessThanEquals\\\":{\\\"glacier:ArchiveAgeinDays\\\":\\\"365\\\"}}}]}\"\n                            }\n                        },\n                        \"output\": {\n                            \"lockId\": \"AE863rKkWZU53SLW5be4DUcW\"\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"POST\",\n                    \"uri\": \"/{accountId}/vaults/{vaultName}/lock-policy\",\n                    \"code\": 201\n                }\n            }\n        },\n        \"com.amazonaws.glacier#InitiateVaultLockInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"accountId\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>AccountId</code> value is the AWS account ID. This value must match the AWS\\n         account ID associated with the credentials used to sign the request. You can either specify\\n         an AWS account ID or optionally a single '<code>-</code>' (hyphen), in which case Amazon\\n         Glacier uses the AWS account ID associated with the credentials used to sign the request.\\n         If you specify your account ID, do not include any hyphens ('-') in the ID.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"vaultName\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the vault.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"policy\": {\n                    \"target\": \"com.amazonaws.glacier#VaultLockPolicy\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The vault lock policy as a JSON string, which uses \\\"\\\\\\\" as an escape\\n         character.</p>\",\n                        \"smithy.api#httpPayload\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The input values for <code>InitiateVaultLock</code>.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.glacier#InitiateVaultLockOutput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"lockId\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The lock ID, which is used to complete the vault locking process.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amz-lock-id\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the Amazon S3 Glacier response to your request.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.glacier#InputSerialization\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"csv\": {\n                    \"target\": \"com.amazonaws.glacier#CSVInput\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Describes the serialization of a CSV-encoded object.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes how the archive is serialized.</p>\"\n            }\n        },\n        \"com.amazonaws.glacier#InsufficientCapacityException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"type\": {\n                    \"target\": \"com.amazonaws.glacier#string\"\n                },\n                \"code\": {\n                    \"target\": \"com.amazonaws.glacier#string\"\n                },\n                \"message\": {\n                    \"target\": \"com.amazonaws.glacier#string\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returned if there is insufficient capacity to process this expedited request. This\\n         error only applies to expedited retrievals and not to standard or bulk\\n         retrievals.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.glacier#InvalidParameterValueException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"type\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Client</p>\"\n                    }\n                },\n                \"code\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>400 Bad Request</p>\"\n                    }\n                },\n                \"message\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Returned if a parameter of the request is incorrectly specified.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returned if a parameter of the request is incorrectly specified.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.glacier#InventoryRetrievalJobDescription\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Format\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The output format for the vault inventory list, which is set by the <b>InitiateJob</b> request when initiating a job to retrieve a vault\\n            inventory. Valid values are <code>CSV</code> and <code>JSON</code>.</p>\"\n                    }\n                },\n                \"StartDate\": {\n                    \"target\": \"com.amazonaws.glacier#DateTime\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The start of the date range in Universal Coordinated Time (UTC) for vault inventory\\n            retrieval that includes archives created on or after this date. This value should be a\\n            string in the ISO 8601 date format, for example\\n            <code>2013-03-20T17:03:43Z</code>.</p>\"\n                    }\n                },\n                \"EndDate\": {\n                    \"target\": \"com.amazonaws.glacier#DateTime\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The end of the date range in UTC for vault inventory retrieval that includes\\n            archives created before this date. This value should be a string in the ISO 8601 date\\n            format, for example <code>2013-03-20T17:03:43Z</code>.</p>\"\n                    }\n                },\n                \"Limit\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of inventory items returned per vault inventory retrieval\\n            request. This limit is set when initiating the job with the a <b>InitiateJob</b> request. </p>\"\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An opaque string that represents where to continue pagination of the vault\\n            inventory retrieval results. You use the marker in a new <b>InitiateJob</b> request to obtain additional inventory items. If there are\\n            no more inventory items, this value is <code>null</code>. For more information, see\\n                <a href=\\\"https://docs.aws.amazon.com/amazonglacier/latest/dev/api-initiate-job-post.html#api-initiate-job-post-vault-inventory-list-filtering\\\"> Range Inventory Retrieval</a>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the options for a range inventory retrieval job.</p>\"\n            }\n        },\n        \"com.amazonaws.glacier#InventoryRetrievalJobInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"StartDate\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The start of the date range in UTC for vault inventory retrieval that includes\\n         archives created on or after this date. This value should be a string in the ISO 8601 date\\n         format, for example <code>2013-03-20T17:03:43Z</code>.</p>\"\n                    }\n                },\n                \"EndDate\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The end of the date range in UTC for vault inventory retrieval that includes archives\\n         created before this date. This value should be a string in the ISO 8601 date format, for\\n         example <code>2013-03-20T17:03:43Z</code>.</p>\"\n                    }\n                },\n                \"Limit\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the maximum number of inventory items returned per vault inventory\\n         retrieval request. Valid values are greater than or equal to 1.</p>\"\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An opaque string that represents where to continue pagination of the vault inventory\\n         retrieval results. You use the marker in a new <b>InitiateJob</b>\\n         request to obtain additional inventory items. If there are no more inventory items, this\\n         value is <code>null</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Provides options for specifying a range inventory retrieval job.</p>\"\n            }\n        },\n        \"com.amazonaws.glacier#JobList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.glacier#GlacierJobDescription\"\n            }\n        },\n        \"com.amazonaws.glacier#JobParameters\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Format\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>When initiating a job to retrieve a vault inventory, you can optionally add this\\n         parameter to your request to specify the output format. If you are initiating an inventory\\n         job and do not specify a Format field, JSON is the default format. Valid values are \\\"CSV\\\"\\n         and \\\"JSON\\\".</p>\"\n                    }\n                },\n                \"Type\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The job type. You can initiate a job to perform a select query on an archive, \\n         retrieve an archive, or get an inventory of a vault. \\n         Valid values are \\\"select\\\", \\\"archive-retrieval\\\" and \\\"inventory-retrieval\\\".</p>\"\n                    }\n                },\n                \"ArchiveId\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the archive that you want to retrieve. This field is required only if\\n            <code>Type</code> is set to <code>select</code> or <code>archive-retrieval</code>code>. \\n         An error occurs if you specify this\\n         request parameter for an inventory retrieval job request. </p>\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The optional description for the job. The description must be less than or equal to\\n         1,024 bytes. The allowable characters are 7-bit ASCII without control codes-specifically,\\n         ASCII values 32-126 decimal or 0x20-0x7E hexadecimal.</p>\"\n                    }\n                },\n                \"SNSTopic\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon SNS topic ARN to which Amazon S3 Glacier sends a notification when the job is\\n         completed and the output is ready for you to download. The specified topic publishes the\\n         notification to its subscribers. The SNS topic must exist.</p>\"\n                    }\n                },\n                \"RetrievalByteRange\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The byte range to retrieve for an archive retrieval. in the form\\n            \\\"<i>StartByteValue</i>-<i>EndByteValue</i>\\\" If not\\n         specified, the whole archive is retrieved. If specified, the byte range must be megabyte\\n         (1024*1024) aligned which means that <i>StartByteValue</i> must be divisible\\n         by 1 MB and <i>EndByteValue</i> plus 1 must be divisible by 1 MB or be the\\n         end of the archive specified as the archive byte size value minus 1. If RetrievalByteRange\\n         is not megabyte aligned, this operation returns a 400 response. </p>\\n         <p>An error occurs if you specify this field for an inventory retrieval job\\n         request.</p>\"\n                    }\n                },\n                \"Tier\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tier to use for a select or an archive retrieval job. Valid values are\\n            <code>Expedited</code>, <code>Standard</code>, or <code>Bulk</code>.\\n            <code>Standard</code> is the default.</p>\"\n                    }\n                },\n                \"InventoryRetrievalParameters\": {\n                    \"target\": \"com.amazonaws.glacier#InventoryRetrievalJobInput\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Input parameters used for range inventory retrieval.</p>\"\n                    }\n                },\n                \"SelectParameters\": {\n                    \"target\": \"com.amazonaws.glacier#SelectParameters\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Contains the parameters that define a job.</p>\"\n                    }\n                },\n                \"OutputLocation\": {\n                    \"target\": \"com.amazonaws.glacier#OutputLocation\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Contains information about the location where the select job results are stored.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Provides options for defining a job.</p>\"\n            }\n        },\n        \"com.amazonaws.glacier#LimitExceededException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"type\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Client</p>\"\n                    }\n                },\n                \"code\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>400 Bad Request</p>\"\n                    }\n                },\n                \"message\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Returned if the request results in a vault limit or tags limit being exceeded.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returned if the request results in a vault or account limit being exceeded.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.glacier#ListJobs\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.glacier#ListJobsInput\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.glacier#ListJobsOutput\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.glacier#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#MissingParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This operation lists jobs for a vault, including jobs that are in-progress and jobs\\n         that have recently finished. The List Job operation returns a list of these jobs sorted by job initiation\\n         time.</p>\\n\\n         <note>\\n            <p>Amazon Glacier retains recently completed jobs for a period before deleting them;\\n            however, it eventually removes completed jobs. The output of completed jobs can be\\n            retrieved. Retaining completed jobs for a period of time after they have completed\\n            enables you to get a job output in the event you miss the job completion notification or\\n            your first attempt to download it fails. For example, suppose you start an archive\\n            retrieval job to download an archive. After the job completes, you start to download the\\n            archive but encounter a network error. In this scenario, you can retry and download the\\n            archive while the job exists.</p>\\n         </note>\\n\\n         <p>The List Jobs operation supports pagination. You should always check the response <code>Marker</code> field. \\n         If there are no more jobs to list, the <code>Marker</code> field is set to <code>null</code>. If there are more jobs to list, \\n         the <code>Marker</code> field is set to a non-null value, which you can use to continue the pagination of the list. \\n         To return a list of jobs that begins at a specific job, \\n         set the marker request parameter to the <code>Marker</code> value for that job that you obtained from a previous List Jobs request.</p>\\n      \\n         <p>You can set a maximum limit for the number of jobs returned in the response by\\n         specifying the <code>limit</code> parameter in the request. The default limit is 50. The\\n         number of jobs returned might be fewer than the limit, but the number of returned jobs\\n         never exceeds the limit.</p>\\n\\n        <p>Additionally, you can filter the jobs list returned by specifying the optional\\n            <code>statuscode</code> parameter or <code>completed</code> parameter, or both. Using\\n         the <code>statuscode</code> parameter, you can specify to return only jobs that match\\n         either the <code>InProgress</code>, <code>Succeeded</code>, or <code>Failed</code> status.\\n         Using the <code>completed</code> parameter, you can specify to return only jobs that were\\n         completed (<code>true</code>) or jobs that were not completed\\n         (<code>false</code>).</p>\\n\\n         <p>For more information about using this operation, \\n         see the documentation for the underlying REST API <a href=\\\"https://docs.aws.amazon.com/amazonglacier/latest/dev/api-jobs-get.html\\\">List Jobs</a>. </p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To list jobs for a vault\",\n                        \"documentation\": \"The example lists jobs for the vault named my-vault.\",\n                        \"input\": {\n                            \"accountId\": \"-\",\n                            \"vaultName\": \"my-vault\"\n                        },\n                        \"output\": {\n                            \"JobList\": [\n                                {\n                                    \"VaultARN\": \"arn:aws:glacier:us-west-2:0123456789012:vaults/my-vault\",\n                                    \"RetrievalByteRange\": \"0-3145727\",\n                                    \"SNSTopic\": \"arn:aws:sns:us-west-2:0123456789012:my-vault\",\n                                    \"Completed\": false,\n                                    \"SHA256TreeHash\": \"9628195fcdbcbbe76cdde932d4646fa7de5f219fb39823836d81f0cc0e18aa67\",\n                                    \"JobId\": \"l7IL5-EkXyEY9Ws95fClzIbk2O5uLYaFdAYOi-azsX_Z8V6NH4yERHzars8wTKYQMX6nBDI9cMNHzyZJO59-8N9aHWav\",\n                                    \"ArchiveId\": \"kKB7ymWJVpPSwhGP6ycSOAekp9ZYe_--zM_mw6k76ZFGEIWQX-ybtRDvc2VkPSDtfKmQrj0IRQLSGsNuDp-AJVlu2ccmDSyDUmZwKbwbpAdGATGDiB3hHO0bjbGehXTcApVud_wyDw\",\n                                    \"JobDescription\": \"Retrieve archive on 2015-07-17\",\n                                    \"ArchiveSizeInBytes\": 3145728,\n                                    \"Action\": \"ArchiveRetrieval\",\n                                    \"ArchiveSHA256TreeHash\": \"9628195fcdbcbbe76cdde932d4646fa7de5f219fb39823836d81f0cc0e18aa67\",\n                                    \"CreationDate\": \"2015-07-17T21:16:13.840Z\",\n                                    \"StatusCode\": \"InProgress\"\n                                },\n                                {\n                                    \"InventoryRetrievalParameters\": {\n                                        \"Format\": \"JSON\"\n                                    },\n                                    \"VaultARN\": \"arn:aws:glacier:us-west-2:0123456789012:vaults/my-vault\",\n                                    \"Completed\": false,\n                                    \"JobId\": \"zbxcm3Z_3z5UkoroF7SuZKrxgGoDc3RloGduS7Eg-RO47Yc6FxsdGBgf_Q2DK5Ejh18CnTS5XW4_XqlNHS61dsO4CnMW\",\n                                    \"Action\": \"InventoryRetrieval\",\n                                    \"CreationDate\": \"2015-07-17T20:23:41.616Z\",\n                                    \"StatusCode\": \"InProgress\"\n                                }\n                            ]\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/{accountId}/vaults/{vaultName}/jobs\",\n                    \"code\": 200\n                },\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"marker\",\n                    \"outputToken\": \"Marker\",\n                    \"items\": \"JobList\",\n                    \"pageSize\": \"limit\"\n                }\n            }\n        },\n        \"com.amazonaws.glacier#ListJobsInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"accountId\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>AccountId</code> value is the AWS account ID of the account that owns the\\n         vault. You can either specify an AWS account ID or optionally a single '<code>-</code>'\\n         (hyphen), in which case Amazon S3 Glacier uses the AWS account ID associated with the\\n         credentials used to sign the request. If you use an account ID, do not include any hyphens\\n         ('-') in the ID. </p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"vaultName\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the vault.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"limit\": {\n                    \"target\": \"smithy.api#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of jobs to be returned. The default limit is 50. The number of\\n         jobs returned might be fewer than the specified limit, but the number of returned jobs\\n         never exceeds the limit.</p>\",\n                        \"smithy.api#httpQuery\": \"limit\"\n                    }\n                },\n                \"marker\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An opaque string used for pagination. This value specifies the job at which the\\n         listing of jobs should begin. Get the marker value from a previous List Jobs response. You\\n         only need to include the marker if you are continuing the pagination of results started in\\n         a previous List Jobs request.</p>\",\n                        \"smithy.api#httpQuery\": \"marker\"\n                    }\n                },\n                \"statuscode\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of job status to return. You can specify the following values:\\n            <code>InProgress</code>, <code>Succeeded</code>, or <code>Failed</code>.</p>\",\n                        \"smithy.api#httpQuery\": \"statuscode\"\n                    }\n                },\n                \"completed\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The state of the jobs to return. You can specify <code>true</code> or\\n            <code>false</code>.</p>\",\n                        \"smithy.api#httpQuery\": \"completed\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Provides options for retrieving a job list for an Amazon S3 Glacier vault.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.glacier#ListJobsOutput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"JobList\": {\n                    \"target\": \"com.amazonaws.glacier#JobList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of job objects. Each job object contains metadata describing the\\n         job.</p>\"\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>\\t\\n         An opaque string used for pagination that specifies the job at which the listing of jobs should begin. \\n         You get the <code>marker</code> value from a previous List Jobs response.\\n         You only need to include the marker if you are continuing the pagination of the results started in a \\n         previous List Jobs request. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the Amazon S3 Glacier response to your request.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.glacier#ListMultipartUploads\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.glacier#ListMultipartUploadsInput\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.glacier#ListMultipartUploadsOutput\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.glacier#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#MissingParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This operation lists in-progress multipart uploads for the specified vault. An\\n         in-progress multipart upload is a multipart upload that has been initiated by an <a>InitiateMultipartUpload</a> request, but has not yet been completed or aborted.\\n         The list returned in the List Multipart Upload response has no guaranteed order. </p>\\n\\n         <p>The List Multipart Uploads operation supports pagination. By default, this operation\\n         returns up to 50 multipart uploads in the response. You should always check the response\\n         for a <code>marker</code> at which to continue the list; if there are no more items the\\n            <code>marker</code> is <code>null</code>. To return a list of multipart uploads that\\n         begins at a specific upload, set the <code>marker</code> request parameter to the value you\\n         obtained from a previous List Multipart Upload request. You can also limit the number of\\n         uploads returned in the response by specifying the <code>limit</code> parameter in the\\n         request.</p>\\n\\n         <p>Note the difference between this operation and listing parts (<a>ListParts</a>). The List Multipart Uploads operation lists all multipart uploads\\n         for a vault and does not require a multipart upload ID. The List Parts operation requires a\\n         multipart upload ID since parts are associated with a single upload.</p>\\n\\n         <p>An AWS account has full permission to perform all operations (actions). However, AWS\\n         Identity and Access Management (IAM) users don't have any permissions by default. You must\\n         grant them explicit permission to perform specific actions. For more information, see\\n            <a href=\\\"https://docs.aws.amazon.com/amazonglacier/latest/dev/using-iam-with-amazon-glacier.html\\\">Access Control Using\\n            AWS Identity and Access Management (IAM)</a>.</p>\\n\\n         <p>For conceptual information and the underlying REST API, see <a href=\\\"https://docs.aws.amazon.com/amazonglacier/latest/dev/working-with-archives.html\\\">Working\\n            with Archives in Amazon S3 Glacier</a> and <a href=\\\"https://docs.aws.amazon.com/amazonglacier/latest/dev/api-multipart-list-uploads.html\\\">List Multipart Uploads\\n         </a> in the <i>Amazon Glacier Developer Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To list all the in-progress multipart uploads for a vault\",\n                        \"documentation\": \"The example lists all the in-progress multipart uploads for the vault named examplevault.\",\n                        \"input\": {\n                            \"accountId\": \"-\",\n                            \"vaultName\": \"examplevault\"\n                        },\n                        \"output\": {\n                            \"Marker\": \"null\",\n                            \"UploadsList\": [\n                                {\n                                    \"ArchiveDescription\": \"archive 1\",\n                                    \"CreationDate\": \"2012-03-19T23:20:59.130Z\",\n                                    \"MultipartUploadId\": \"xsQdFIRsfJr20CW2AbZBKpRZAFTZSJIMtL2hYf8mvp8dM0m4RUzlaqoEye6g3h3ecqB_zqwB7zLDMeSWhwo65re4C4Ev\",\n                                    \"PartSizeInBytes\": 4194304,\n                                    \"VaultARN\": \"arn:aws:glacier:us-west-2:012345678901:vaults/examplevault\"\n                                },\n                                {\n                                    \"ArchiveDescription\": \"archive 2\",\n                                    \"CreationDate\": \"2012-04-01T15:00:00.000Z\",\n                                    \"MultipartUploadId\": \"nPyGOnyFcx67qqX7E-0tSGiRi88hHMOwOxR-_jNyM6RjVMFfV29lFqZ3rNsSaWBugg6OP92pRtufeHdQH7ClIpSF6uJc\",\n                                    \"PartSizeInBytes\": 4194304,\n                                    \"VaultARN\": \"arn:aws:glacier:us-west-2:012345678901:vaults/examplevault\"\n                                },\n                                {\n                                    \"ArchiveDescription\": \"archive 3\",\n                                    \"CreationDate\": \"2012-03-20T17:03:43.221Z\",\n                                    \"MultipartUploadId\": \"qt-RBst_7yO8gVIonIBsAxr2t-db0pE4s8MNeGjKjGdNpuU-cdSAcqG62guwV9r5jh5mLyFPzFEitTpNE7iQfHiu1XoV\",\n                                    \"PartSizeInBytes\": 4194304,\n                                    \"VaultARN\": \"arn:aws:glacier:us-west-2:012345678901:vaults/examplevault\"\n                                }\n                            ]\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/{accountId}/vaults/{vaultName}/multipart-uploads\",\n                    \"code\": 200\n                },\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"marker\",\n                    \"outputToken\": \"Marker\",\n                    \"items\": \"UploadsList\",\n                    \"pageSize\": \"limit\"\n                }\n            }\n        },\n        \"com.amazonaws.glacier#ListMultipartUploadsInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"accountId\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>AccountId</code> value is the AWS account ID of the account that owns the\\n         vault. You can either specify an AWS account ID or optionally a single '<code>-</code>'\\n         (hyphen), in which case Amazon S3 Glacier uses the AWS account ID associated with the\\n         credentials used to sign the request. If you use an account ID, do not include any hyphens\\n         ('-') in the ID. </p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"vaultName\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the vault.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"limit\": {\n                    \"target\": \"smithy.api#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the maximum number of uploads returned in the response body. If this value\\n         is not specified, the List Uploads operation returns up to 50 uploads.</p>\",\n                        \"smithy.api#httpQuery\": \"limit\"\n                    }\n                },\n                \"marker\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An opaque string used for pagination. This value specifies the upload at which the\\n         listing of uploads should begin. Get the marker value from a previous List Uploads\\n         response. You need only include the marker if you are continuing the pagination of results\\n         started in a previous List Uploads request.</p>\",\n                        \"smithy.api#httpQuery\": \"marker\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Provides options for retrieving list of in-progress multipart uploads for an Amazon\\n         Glacier vault.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.glacier#ListMultipartUploadsOutput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"UploadsList\": {\n                    \"target\": \"com.amazonaws.glacier#UploadsList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of in-progress multipart uploads.</p>\"\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An opaque string that represents where to continue pagination of the results. You use\\n         the marker in a new List Multipart Uploads request to obtain more uploads in the list. If\\n         there are no more uploads, this value is <code>null</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the Amazon S3 Glacier response to your request.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.glacier#ListParts\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.glacier#ListPartsInput\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.glacier#ListPartsOutput\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.glacier#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#MissingParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This operation lists the parts of an archive that have been uploaded in a specific\\n         multipart upload. You can make this request at any time during an in-progress multipart\\n         upload before you complete the upload (see <a>CompleteMultipartUpload</a>. List\\n         Parts returns an error for completed uploads. The list returned in the List Parts response\\n         is sorted by part range. </p>\\n\\n         <p>The List Parts operation supports pagination. By default, this operation returns up\\n         to 50 uploaded parts in the response. You should always check the response for a\\n            <code>marker</code> at which to continue the list; if there are no more items the\\n            <code>marker</code> is <code>null</code>. To return a list of parts that begins at a\\n         specific part, set the <code>marker</code> request parameter to the value you obtained from\\n         a previous List Parts request. You can also limit the number of parts returned in the\\n         response by specifying the <code>limit</code> parameter in the request. </p>\\n\\n         <p>An AWS account has full permission to perform all operations (actions). However, AWS\\n         Identity and Access Management (IAM) users don't have any permissions by default. You must\\n         grant them explicit permission to perform specific actions. For more information, see\\n            <a href=\\\"https://docs.aws.amazon.com/amazonglacier/latest/dev/using-iam-with-amazon-glacier.html\\\">Access Control Using\\n            AWS Identity and Access Management (IAM)</a>.</p>\\n         <p>For conceptual information and the underlying REST API, see <a href=\\\"https://docs.aws.amazon.com/amazonglacier/latest/dev/working-with-archives.html\\\">Working\\n            with Archives in Amazon S3 Glacier</a> and <a href=\\\"https://docs.aws.amazon.com/amazonglacier/latest/dev/api-multipart-list-parts.html\\\">List Parts</a> in the\\n            <i>Amazon Glacier Developer Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To list the parts of an archive that have been uploaded in a multipart upload\",\n                        \"documentation\": \"The example lists all the parts of a multipart upload.\",\n                        \"input\": {\n                            \"accountId\": \"-\",\n                            \"vaultName\": \"examplevault\",\n                            \"uploadId\": \"OW2fM5iVylEpFEMM9_HpKowRapC3vn5sSL39_396UW9zLFUWVrnRHaPjUJddQ5OxSHVXjYtrN47NBZ-khxOjyEXAMPLE\"\n                        },\n                        \"output\": {\n                            \"ArchiveDescription\": \"archive description\",\n                            \"CreationDate\": \"2012-03-20T17:03:43.221Z\",\n                            \"Marker\": \"null\",\n                            \"MultipartUploadId\": \"OW2fM5iVylEpFEMM9_HpKowRapC3vn5sSL39_396UW9zLFUWVrnRHaPjUJddQ5OxSHVXjYtrN47NBZ-khxOjyEXAMPLE\",\n                            \"PartSizeInBytes\": 4194304,\n                            \"Parts\": [\n                                {\n                                    \"RangeInBytes\": \"0-4194303\",\n                                    \"SHA256TreeHash\": \"01d34dabf7be316472c93b1ef80721f5d4\"\n                                },\n                                {\n                                    \"RangeInBytes\": \"4194304-8388607\",\n                                    \"SHA256TreeHash\": \"0195875365afda349fc21c84c099987164\"\n                                }\n                            ],\n                            \"VaultARN\": \"arn:aws:glacier:us-west-2:012345678901:vaults/demo1-vault\"\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/{accountId}/vaults/{vaultName}/multipart-uploads/{uploadId}\",\n                    \"code\": 200\n                },\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"marker\",\n                    \"outputToken\": \"Marker\",\n                    \"items\": \"Parts\",\n                    \"pageSize\": \"limit\"\n                }\n            }\n        },\n        \"com.amazonaws.glacier#ListPartsInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"accountId\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>AccountId</code> value is the AWS account ID of the account that owns the\\n         vault. You can either specify an AWS account ID or optionally a single '<code>-</code>'\\n         (hyphen), in which case Amazon S3 Glacier uses the AWS account ID associated with the\\n         credentials used to sign the request. If you use an account ID, do not include any hyphens\\n         ('-') in the ID. </p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"vaultName\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the vault.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"uploadId\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The upload ID of the multipart upload.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"marker\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An opaque string used for pagination. This value specifies the part at which the\\n         listing of parts should begin. Get the marker value from the response of a previous List\\n         Parts response. You need only include the marker if you are continuing the pagination of\\n         results started in a previous List Parts request.</p>\",\n                        \"smithy.api#httpQuery\": \"marker\"\n                    }\n                },\n                \"limit\": {\n                    \"target\": \"smithy.api#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of parts to be returned. The default limit is 50. The number of\\n         parts returned might be fewer than the specified limit, but the number of returned parts\\n         never exceeds the limit.</p>\",\n                        \"smithy.api#httpQuery\": \"limit\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Provides options for retrieving a list of parts of an archive that have been uploaded\\n         in a specific multipart upload.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.glacier#ListPartsOutput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"MultipartUploadId\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the upload to which the parts are associated.</p>\"\n                    }\n                },\n                \"VaultARN\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the vault to which the multipart upload was\\n         initiated.</p>\"\n                    }\n                },\n                \"ArchiveDescription\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The description of the archive that was specified in the Initiate Multipart Upload\\n         request.</p>\"\n                    }\n                },\n                \"PartSizeInBytes\": {\n                    \"target\": \"com.amazonaws.glacier#long\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The part size in bytes. This is the same value that you specified in the Initiate\\n         Multipart Upload request.</p>\"\n                    }\n                },\n                \"CreationDate\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The UTC time at which the multipart upload was initiated.</p>\"\n                    }\n                },\n                \"Parts\": {\n                    \"target\": \"com.amazonaws.glacier#PartList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of the part sizes of the multipart upload. Each object in the array contains a\\n         <code>RangeBytes</code> and <code>sha256-tree-hash</code> name/value\\n         pair.</p>\"\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An opaque string that represents where to continue pagination of the results. You use\\n         the marker in a new List Parts request to obtain more jobs in the list. If there are no\\n         more parts, this value is <code>null</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the Amazon S3 Glacier response to your request.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.glacier#ListProvisionedCapacity\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.glacier#ListProvisionedCapacityInput\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.glacier#ListProvisionedCapacityOutput\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.glacier#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#MissingParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This operation lists the provisioned capacity units for the specified AWS\\n         account.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To list the provisioned capacity units for an account\",\n                        \"documentation\": \"The example lists the provisioned capacity units for an account.\",\n                        \"input\": {\n                            \"accountId\": \"-\"\n                        },\n                        \"output\": {\n                            \"ProvisionedCapacityList\": [\n                                {\n                                    \"CapacityId\": \"zSaq7NzHFQDANTfQkDen4V7z\",\n                                    \"StartDate\": \"2016-11-11T20:11:51.095Z\",\n                                    \"ExpirationDate\": \"2016-12-12T00:00:00.000Z\"\n                                },\n                                {\n                                    \"CapacityId\": \"yXaq7NzHFQNADTfQkDen4V7z\",\n                                    \"StartDate\": \"2016-12-13T20:11:51.095Z\",\n                                    \"ExpirationDate\": \"2017-01-15T00:00:00.000Z\"\n                                }\n                            ]\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/{accountId}/provisioned-capacity\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.glacier#ListProvisionedCapacityInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"accountId\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The AWS account ID of the account that owns the vault. You can either specify an AWS\\n         account ID or optionally a single '-' (hyphen), in which case Amazon S3 Glacier uses the AWS\\n         account ID associated with the credentials used to sign the request. If you use an account\\n         ID, don't include any hyphens ('-') in the ID. </p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.glacier#ListProvisionedCapacityOutput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ProvisionedCapacityList\": {\n                    \"target\": \"com.amazonaws.glacier#ProvisionedCapacityList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The response body contains the following JSON fields.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.glacier#ListTagsForVault\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.glacier#ListTagsForVaultInput\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.glacier#ListTagsForVaultOutput\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.glacier#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#MissingParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This operation lists all the tags attached to a vault. The operation returns an empty\\n         map if there are no tags. For more information about tags, see <a href=\\\"https://docs.aws.amazon.com/amazonglacier/latest/dev/tagging.html\\\">Tagging Amazon S3 Glacier\\n         Resources</a>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To list the tags for a vault\",\n                        \"documentation\": \"The example lists all the tags attached to the vault examplevault.\",\n                        \"input\": {\n                            \"accountId\": \"-\",\n                            \"vaultName\": \"examplevault\"\n                        },\n                        \"output\": {\n                            \"Tags\": {\n                                \"date\": \"july2015\",\n                                \"id\": \"1234\"\n                            }\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/{accountId}/vaults/{vaultName}/tags\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.glacier#ListTagsForVaultInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"accountId\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>AccountId</code> value is the AWS account ID of the account that owns the\\n         vault. You can either specify an AWS account ID or optionally a single '<code>-</code>'\\n         (hyphen), in which case Amazon S3 Glacier uses the AWS account ID associated with the\\n         credentials used to sign the request. If you use an account ID, do not include any hyphens\\n         ('-') in the ID.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"vaultName\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the vault.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The input value for <code>ListTagsForVaultInput</code>.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.glacier#ListTagsForVaultOutput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.glacier#TagMap\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags attached to the vault. Each tag is composed of a key and a value.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the Amazon S3 Glacier response to your request.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.glacier#ListVaults\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.glacier#ListVaultsInput\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.glacier#ListVaultsOutput\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.glacier#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#MissingParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This operation lists all vaults owned by the calling user's account. The list\\n         returned in the response is ASCII-sorted by vault name.</p>\\n\\n         <p>By default, this operation returns up to 10 items. If there are more vaults to\\n         list, the response <code>marker</code> field contains the vault Amazon Resource Name (ARN)\\n         at which to continue the list with a new List Vaults request; otherwise, the\\n            <code>marker</code> field is <code>null</code>. To return a list of vaults that begins\\n         at a specific vault, set the <code>marker</code> request parameter to the vault ARN you\\n         obtained from a previous List Vaults request. You can also limit the number of vaults\\n         returned in the response by specifying the <code>limit</code> parameter in the request. </p>\\n\\n         <p>An AWS account has full permission to perform all operations (actions). However, AWS\\n         Identity and Access Management (IAM) users don't have any permissions by default. You must\\n         grant them explicit permission to perform specific actions. For more information, see\\n            <a href=\\\"https://docs.aws.amazon.com/amazonglacier/latest/dev/using-iam-with-amazon-glacier.html\\\">Access Control Using\\n            AWS Identity and Access Management (IAM)</a>.</p>\\n         <p>For conceptual information and underlying REST API, see <a href=\\\"https://docs.aws.amazon.com/amazonglacier/latest/dev/retrieving-vault-info.html\\\">Retrieving Vault Metadata in\\n            Amazon S3 Glacier</a> and <a href=\\\"https://docs.aws.amazon.com/amazonglacier/latest/dev/api-vaults-get.html\\\">List Vaults </a> in the\\n            <i>Amazon Glacier Developer Guide</i>. </p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/{accountId}/vaults\",\n                    \"code\": 200\n                },\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"marker\",\n                    \"outputToken\": \"Marker\",\n                    \"items\": \"VaultList\",\n                    \"pageSize\": \"limit\"\n                }\n            }\n        },\n        \"com.amazonaws.glacier#ListVaultsInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"accountId\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>AccountId</code> value is the AWS account ID. This value must match the AWS\\n         account ID associated with the credentials used to sign the request. You can either specify\\n         an AWS account ID or optionally a single '<code>-</code>' (hyphen), in which case Amazon\\n         Glacier uses the AWS account ID associated with the credentials used to sign the request.\\n         If you specify your account ID, do not include any hyphens ('-') in the ID.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"marker\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A string used for pagination. The marker specifies the vault ARN after which the\\n         listing of vaults should begin.</p>\",\n                        \"smithy.api#httpQuery\": \"marker\"\n                    }\n                },\n                \"limit\": {\n                    \"target\": \"smithy.api#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of vaults to be returned. The default limit is 10. The number of\\n         vaults returned might be fewer than the specified limit, but the number of returned vaults\\n         never exceeds the limit.</p>\",\n                        \"smithy.api#httpQuery\": \"limit\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Provides options to retrieve the vault list owned by the calling user's account. The\\n         list provides metadata information for each vault.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.glacier#ListVaultsOutput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VaultList\": {\n                    \"target\": \"com.amazonaws.glacier#VaultList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>List of vaults.</p>\"\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The vault ARN at which to continue pagination of the results. You use the marker in\\n         another List Vaults request to obtain more vaults in the list.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the Amazon S3 Glacier response to your request.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.glacier#MissingParameterValueException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"type\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Client.</p>\"\n                    }\n                },\n                \"code\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>400 Bad Request</p>\"\n                    }\n                },\n                \"message\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Returned if no authentication data is found for the request.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returned if a required header or parameter is missing from the request.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.glacier#NotificationEventList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.glacier#string\"\n            }\n        },\n        \"com.amazonaws.glacier#NullableLong\": {\n            \"type\": \"long\"\n        },\n        \"com.amazonaws.glacier#OutputLocation\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"S3\": {\n                    \"target\": \"com.amazonaws.glacier#S3Location\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Describes an S3 location that will receive the results of the job request.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains information about the location where the select job results are stored.</p>\"\n            }\n        },\n        \"com.amazonaws.glacier#OutputSerialization\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"csv\": {\n                    \"target\": \"com.amazonaws.glacier#CSVOutput\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Describes the serialization of CSV-encoded query results.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes how the select output is serialized.</p>\"\n            }\n        },\n        \"com.amazonaws.glacier#PartList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.glacier#PartListElement\"\n            }\n        },\n        \"com.amazonaws.glacier#PartListElement\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RangeInBytes\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The byte range of a part, inclusive of the upper value of the range.</p>\"\n                    }\n                },\n                \"SHA256TreeHash\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The SHA256 tree hash value that Amazon S3 Glacier calculated for the part. This field is\\n         never <code>null</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A list of the part sizes of the multipart upload.</p>\"\n            }\n        },\n        \"com.amazonaws.glacier#Permission\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"FULL_CONTROL\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"FULL_CONTROL\"\n                    }\n                },\n                \"WRITE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"WRITE\"\n                    }\n                },\n                \"WRITE_ACP\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"WRITE_ACP\"\n                    }\n                },\n                \"READ\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"READ\"\n                    }\n                },\n                \"READ_ACP\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"READ_ACP\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.glacier#PolicyEnforcedException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"type\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Client</p>\"\n                    }\n                },\n                \"code\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>PolicyEnforcedException</p>\"\n                    }\n                },\n                \"message\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>InitiateJob request denied by current data retrieval policy.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returned if a retrieval job would exceed the current data policy's retrieval rate\\n         limit. For more information about data retrieval policies,</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.glacier#ProvisionedCapacityDescription\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CapacityId\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID that identifies the provisioned capacity unit.</p>\"\n                    }\n                },\n                \"StartDate\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date that the provisioned capacity unit was purchased, in Universal Coordinated Time (UTC).</p>\"\n                    }\n                },\n                \"ExpirationDate\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date that the provisioned capacity unit expires, in Universal Coordinated Time (UTC).</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The definition for a provisioned capacity unit.</p>\"\n            }\n        },\n        \"com.amazonaws.glacier#ProvisionedCapacityList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.glacier#ProvisionedCapacityDescription\"\n            }\n        },\n        \"com.amazonaws.glacier#PurchaseProvisionedCapacity\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.glacier#PurchaseProvisionedCapacityInput\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.glacier#PurchaseProvisionedCapacityOutput\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.glacier#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#MissingParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This operation purchases a provisioned capacity unit for an AWS account. </p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To purchases a provisioned capacity unit for an AWS account\",\n                        \"documentation\": \"The example purchases provisioned capacity unit for an AWS account.\",\n                        \"input\": {\n                            \"accountId\": \"-\"\n                        },\n                        \"output\": {\n                            \"capacityId\": \"zSaq7NzHFQDANTfQkDen4V7z\"\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"POST\",\n                    \"uri\": \"/{accountId}/provisioned-capacity\",\n                    \"code\": 201\n                }\n            }\n        },\n        \"com.amazonaws.glacier#PurchaseProvisionedCapacityInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"accountId\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The AWS account ID of the account that owns the vault. You can either specify an AWS\\n         account ID or optionally a single '-' (hyphen), in which case Amazon S3 Glacier uses the AWS\\n         account ID associated with the credentials used to sign the request. If you use an account\\n         ID, don't include any hyphens ('-') in the ID. </p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.glacier#PurchaseProvisionedCapacityOutput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"capacityId\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID that identifies the provisioned capacity unit.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amz-capacity-id\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.glacier#QuoteFields\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"Always\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ALWAYS\"\n                    }\n                },\n                \"AsNeeded\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ASNEEDED\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.glacier#RemoveTagsFromVault\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.glacier#RemoveTagsFromVaultInput\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.glacier#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#MissingParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This operation removes one or more tags from the set of tags attached to a vault. For\\n         more information about tags, see <a href=\\\"https://docs.aws.amazon.com/amazonglacier/latest/dev/tagging.html\\\">Tagging Amazon S3 Glacier Resources</a>.\\n         This operation is idempotent. The operation will be successful, even if there are no tags\\n         attached to the vault. </p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To remove tags from a vault\",\n                        \"documentation\": \"The example removes two tags from the vault named examplevault.\",\n                        \"input\": {\n                            \"accountId\": \"-\",\n                            \"vaultName\": \"examplevault\",\n                            \"TagKeys\": [\n                                \"examplekey1\",\n                                \"examplekey2\"\n                            ]\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"POST\",\n                    \"uri\": \"/{accountId}/vaults/{vaultName}/tags?operation=remove\",\n                    \"code\": 204\n                }\n            }\n        },\n        \"com.amazonaws.glacier#RemoveTagsFromVaultInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"accountId\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>AccountId</code> value is the AWS account ID of the account that owns the\\n         vault. You can either specify an AWS account ID or optionally a single '<code>-</code>'\\n         (hyphen), in which case Amazon S3 Glacier uses the AWS account ID associated with the\\n         credentials used to sign the request. If you use an account ID, do not include any hyphens\\n         ('-') in the ID.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"vaultName\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the vault.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TagKeys\": {\n                    \"target\": \"com.amazonaws.glacier#TagKeyList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of tag keys. Each corresponding tag is removed from the vault.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The input value for <code>RemoveTagsFromVaultInput</code>.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.glacier#RequestTimeoutException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"type\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Client</p>\"\n                    }\n                },\n                \"code\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>408 Request Timeout</p>\"\n                    }\n                },\n                \"message\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Returned if, when uploading an archive, Amazon S3 Glacier times out while receiving the\\n         upload.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returned if, when uploading an archive, Amazon S3 Glacier times out while receiving the\\n         upload.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 408\n            }\n        },\n        \"com.amazonaws.glacier#ResourceNotFoundException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"type\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Client</p>\"\n                    }\n                },\n                \"code\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>404 Not Found</p>\"\n                    }\n                },\n                \"message\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Returned if the specified resource (such as a vault, upload ID, or job ID) doesn't\\n         exist.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returned if the specified resource (such as a vault, upload ID, or job ID) doesn't\\n         exist.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 404\n            }\n        },\n        \"com.amazonaws.glacier#S3Location\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"BucketName\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the Amazon S3 bucket where the job results are stored.</p>\"\n                    }\n                },\n                \"Prefix\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The prefix that is prepended to the results for this request.</p>\"\n                    }\n                },\n                \"Encryption\": {\n                    \"target\": \"com.amazonaws.glacier#Encryption\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Contains information about the encryption used to store the job results in Amazon S3.</p>\"\n                    }\n                },\n                \"CannedACL\": {\n                    \"target\": \"com.amazonaws.glacier#CannedACL\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The canned access control list (ACL) to apply to the job results.</p>\"\n                    }\n                },\n                \"AccessControlList\": {\n                    \"target\": \"com.amazonaws.glacier#AccessControlPolicyList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of grants that control access to the staged results.</p>\"\n                    }\n                },\n                \"Tagging\": {\n                    \"target\": \"com.amazonaws.glacier#hashmap\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tag-set that is applied to the job results.</p>\"\n                    }\n                },\n                \"UserMetadata\": {\n                    \"target\": \"com.amazonaws.glacier#hashmap\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A map of metadata to store with the job results in Amazon S3.</p>\"\n                    }\n                },\n                \"StorageClass\": {\n                    \"target\": \"com.amazonaws.glacier#StorageClass\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The storage class used to store the job results.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains information about the location in Amazon S3 where the select job results are stored.</p>\"\n            }\n        },\n        \"com.amazonaws.glacier#SelectParameters\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InputSerialization\": {\n                    \"target\": \"com.amazonaws.glacier#InputSerialization\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Describes the serialization format of the object.</p>\"\n                    }\n                },\n                \"ExpressionType\": {\n                    \"target\": \"com.amazonaws.glacier#ExpressionType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of the provided expression, for example <code>SQL</code>.</p>\"\n                    }\n                },\n                \"Expression\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The expression that is used to select the object.</p>\"\n                    }\n                },\n                \"OutputSerialization\": {\n                    \"target\": \"com.amazonaws.glacier#OutputSerialization\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Describes how the results of the select job are serialized.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains information about the parameters used for a select.</p>\"\n            }\n        },\n        \"com.amazonaws.glacier#ServiceUnavailableException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"type\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Server</p>\"\n                    }\n                },\n                \"code\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>500 Internal Server Error</p>\"\n                    }\n                },\n                \"message\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Returned if the service cannot complete the request.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returned if the service cannot complete the request.</p>\",\n                \"smithy.api#error\": \"server\",\n                \"smithy.api#httpError\": 500\n            }\n        },\n        \"com.amazonaws.glacier#SetDataRetrievalPolicy\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.glacier#SetDataRetrievalPolicyInput\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.glacier#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#MissingParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This operation sets and then enacts a data retrieval policy in the region specified\\n         in the PUT request. You can set one policy per region for an AWS account. The policy is\\n         enacted within a few minutes of a successful PUT operation.</p>\\n         <p>The set policy operation does not affect retrieval jobs that were in progress before\\n         the policy was enacted. For more information about data retrieval policies, see <a href=\\\"https://docs.aws.amazon.com/amazonglacier/latest/dev/data-retrieval-policy.html\\\">Amazon\\n            Glacier Data Retrieval Policies</a>. </p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To set and then enact a data retrieval policy \",\n                        \"documentation\": \"The example sets and then enacts a data retrieval policy.\",\n                        \"input\": {\n                            \"accountId\": \"-\",\n                            \"Policy\": {\n                                \"Rules\": [\n                                    {\n                                        \"Strategy\": \"BytesPerHour\",\n                                        \"BytesPerHour\": 10737418240\n                                    }\n                                ]\n                            }\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"PUT\",\n                    \"uri\": \"/{accountId}/policies/data-retrieval\",\n                    \"code\": 204\n                }\n            }\n        },\n        \"com.amazonaws.glacier#SetDataRetrievalPolicyInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"accountId\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>AccountId</code> value is the AWS account ID. This value must match the AWS\\n         account ID associated with the credentials used to sign the request. You can either specify\\n         an AWS account ID or optionally a single '<code>-</code>' (hyphen), in which case Amazon\\n         Glacier uses the AWS account ID associated with the credentials used to sign the request.\\n         If you specify your account ID, do not include any hyphens ('-') in the ID.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Policy\": {\n                    \"target\": \"com.amazonaws.glacier#DataRetrievalPolicy\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The data retrieval policy in JSON format.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>SetDataRetrievalPolicy input.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.glacier#SetVaultAccessPolicy\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.glacier#SetVaultAccessPolicyInput\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.glacier#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#MissingParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This operation configures an access policy for a vault and will overwrite an existing\\n         policy. To configure a vault access policy, send a PUT request to the\\n            <code>access-policy</code> subresource of the vault. An access policy is specific to a\\n         vault and is also called a vault subresource. You can set one access policy per vault and\\n         the policy can be up to 20 KB in size. For more information about vault access policies,\\n         see <a href=\\\"https://docs.aws.amazon.com/amazonglacier/latest/dev/vault-access-policy.html\\\">Amazon Glacier Access Control with Vault Access Policies</a>. </p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To set the access-policy on a vault\",\n                        \"documentation\": \"The example configures an access policy for the vault named examplevault.\",\n                        \"input\": {\n                            \"accountId\": \"-\",\n                            \"vaultName\": \"examplevault\",\n                            \"policy\": {\n                                \"Policy\": \"{\\\"Version\\\":\\\"2012-10-17\\\",\\\"Statement\\\":[{\\\"Sid\\\":\\\"Define-owner-access-rights\\\",\\\"Effect\\\":\\\"Allow\\\",\\\"Principal\\\":{\\\"AWS\\\":\\\"arn:aws:iam::999999999999:root\\\"},\\\"Action\\\":\\\"glacier:DeleteArchive\\\",\\\"Resource\\\":\\\"arn:aws:glacier:us-west-2:999999999999:vaults/examplevault\\\"}]}\"\n                            }\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"PUT\",\n                    \"uri\": \"/{accountId}/vaults/{vaultName}/access-policy\",\n                    \"code\": 204\n                }\n            }\n        },\n        \"com.amazonaws.glacier#SetVaultAccessPolicyInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"accountId\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>AccountId</code> value is the AWS account ID of the account that owns the\\n         vault. You can either specify an AWS account ID or optionally a single '<code>-</code>'\\n         (hyphen), in which case Amazon S3 Glacier uses the AWS account ID associated with the\\n         credentials used to sign the request. If you use an account ID, do not include any hyphens\\n         ('-') in the ID.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"vaultName\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the vault.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"policy\": {\n                    \"target\": \"com.amazonaws.glacier#VaultAccessPolicy\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The vault access policy as a JSON string.</p>\",\n                        \"smithy.api#httpPayload\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>SetVaultAccessPolicy input.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.glacier#SetVaultNotifications\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.glacier#SetVaultNotificationsInput\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.glacier#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#MissingParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This operation configures notifications that will be sent when specific events happen\\n         to a vault. By default, you don't get any notifications.</p>\\n\\n         <p>To configure vault notifications, send a PUT request to the\\n            <code>notification-configuration</code> subresource of the vault. The request should\\n         include a JSON document that provides an Amazon SNS topic and specific events for which you\\n         want Amazon S3 Glacier to send notifications to the topic.</p>\\n\\n         <p>Amazon SNS topics must grant permission to the vault to be allowed to publish\\n         notifications to the topic. You can configure a vault to publish a notification for the\\n         following vault events:</p>\\n\\n         <ul>\\n            <li>\\n                <p>\\n                  <b>ArchiveRetrievalCompleted</b> This event occurs when a\\n               job that was initiated for an archive retrieval is completed (<a>InitiateJob</a>). The status of the completed job can be \\\"Succeeded\\\" or\\n               \\\"Failed\\\". The notification sent to the SNS topic is the same output as returned from\\n                  <a>DescribeJob</a>. </p>\\n            </li>\\n            <li>\\n\\n               <p>\\n                  <b>InventoryRetrievalCompleted</b> This event occurs when a\\n               job that was initiated for an inventory retrieval is completed (<a>InitiateJob</a>). The status of the completed job can be \\\"Succeeded\\\" or\\n               \\\"Failed\\\". The notification sent to the SNS topic is the same output as returned from\\n                  <a>DescribeJob</a>. </p>\\n            </li>\\n         </ul>\\n\\n         <p>An AWS account has full permission to perform all operations (actions). However, AWS\\n         Identity and Access Management (IAM) users don't have any permissions by default. You must\\n         grant them explicit permission to perform specific actions. For more information, see\\n            <a href=\\\"https://docs.aws.amazon.com/amazonglacier/latest/dev/using-iam-with-amazon-glacier.html\\\">Access Control Using\\n            AWS Identity and Access Management (IAM)</a>.</p>\\n         <p>For conceptual information and underlying REST API, see <a href=\\\"https://docs.aws.amazon.com/amazonglacier/latest/dev/configuring-notifications.html\\\">Configuring Vault\\n            Notifications in Amazon S3 Glacier</a> and <a href=\\\"https://docs.aws.amazon.com/amazonglacier/latest/dev/api-vault-notifications-put.html\\\">Set Vault Notification\\n            Configuration </a> in the <i>Amazon Glacier Developer Guide</i>. </p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To configure a vault to post a message to an Amazon SNS topic when jobs complete\",\n                        \"documentation\": \"The example sets the examplevault notification configuration.\",\n                        \"input\": {\n                            \"accountId\": \"-\",\n                            \"vaultName\": \"examplevault\",\n                            \"vaultNotificationConfig\": {\n                                \"Events\": [\n                                    \"ArchiveRetrievalCompleted\",\n                                    \"InventoryRetrievalCompleted\"\n                                ],\n                                \"SNSTopic\": \"arn:aws:sns:us-west-2:012345678901:mytopic\"\n                            }\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"PUT\",\n                    \"uri\": \"/{accountId}/vaults/{vaultName}/notification-configuration\",\n                    \"code\": 204\n                }\n            }\n        },\n        \"com.amazonaws.glacier#SetVaultNotificationsInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"accountId\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>AccountId</code> value is the AWS account ID of the account that owns the\\n         vault. You can either specify an AWS account ID or optionally a single '<code>-</code>'\\n         (hyphen), in which case Amazon S3 Glacier uses the AWS account ID associated with the\\n         credentials used to sign the request. If you use an account ID, do not include any hyphens\\n         ('-') in the ID.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"vaultName\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the vault.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"vaultNotificationConfig\": {\n                    \"target\": \"com.amazonaws.glacier#VaultNotificationConfig\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Provides options for specifying notification configuration.</p>\",\n                        \"smithy.api#httpPayload\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Provides options to configure notifications that will be sent when specific events\\n         happen to a vault.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.glacier#Size\": {\n            \"type\": \"long\"\n        },\n        \"com.amazonaws.glacier#StatusCode\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"InProgress\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"InProgress\"\n                    }\n                },\n                \"Succeeded\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Succeeded\"\n                    }\n                },\n                \"Failed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Failed\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.glacier#StorageClass\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"Standard\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"STANDARD\"\n                    }\n                },\n                \"ReducedRedundancy\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"REDUCED_REDUNDANCY\"\n                    }\n                },\n                \"StandardInfrequentAccess\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"STANDARD_IA\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.glacier#Stream\": {\n            \"type\": \"blob\",\n            \"traits\": {\n                \"smithy.api#streaming\": {}\n            }\n        },\n        \"com.amazonaws.glacier#TagKey\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.glacier#TagKeyList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.glacier#string\"\n            }\n        },\n        \"com.amazonaws.glacier#TagMap\": {\n            \"type\": \"map\",\n            \"key\": {\n                \"target\": \"com.amazonaws.glacier#TagKey\"\n            },\n            \"value\": {\n                \"target\": \"com.amazonaws.glacier#TagValue\"\n            }\n        },\n        \"com.amazonaws.glacier#TagValue\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.glacier#Type\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"AmazonCustomerByEmail\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AmazonCustomerByEmail\"\n                    }\n                },\n                \"CanonicalUser\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"CanonicalUser\"\n                    }\n                },\n                \"Group\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Group\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.glacier#UploadArchive\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.glacier#UploadArchiveInput\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.glacier#ArchiveCreationOutput\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.glacier#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#MissingParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#RequestTimeoutException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This operation adds an archive to a vault. This is a synchronous operation, and for a\\n         successful upload, your data is durably persisted. Amazon S3 Glacier returns the archive ID in\\n         the <code>x-amz-archive-id</code> header of the response. </p>\\n\\n         <p>You must use the archive ID to access your data in Amazon S3 Glacier. After you upload\\n         an archive, you should save the archive ID returned so that you can retrieve or delete the\\n         archive later. Besides saving the archive ID, you can also index it and give it a friendly\\n         name to allow for better searching. You can also use the optional archive description field\\n         to specify how the archive is referred to in an external index of archives, such as you\\n         might create in Amazon DynamoDB. You can also get the vault inventory to obtain a list of\\n         archive IDs in a vault. For more information, see <a>InitiateJob</a>. </p>\\n\\n         <p>You must provide a SHA256 tree hash of the data you are uploading. For information\\n         about computing a SHA256 tree hash, see <a href=\\\"https://docs.aws.amazon.com/amazonglacier/latest/dev/checksum-calculations.html\\\">Computing Checksums</a>. </p>\\n\\n         <p>You can optionally specify an archive description of up to 1,024 printable ASCII\\n         characters. You can get the archive description when you either retrieve the archive or get\\n         the vault inventory. For more information, see <a>InitiateJob</a>. Amazon\\n         Glacier does not interpret the description in any way. An archive description does not need\\n         to be unique. You cannot use the description to retrieve or sort the archive list. </p>\\n\\n         <p>Archives are immutable. After you upload an archive, you cannot edit the archive or\\n         its description.</p>\\n\\n         <p>An AWS account has full permission to perform all operations (actions). However, AWS\\n         Identity and Access Management (IAM) users don't have any permissions by default. You must\\n         grant them explicit permission to perform specific actions. For more information, see\\n            <a href=\\\"https://docs.aws.amazon.com/amazonglacier/latest/dev/using-iam-with-amazon-glacier.html\\\">Access Control Using\\n            AWS Identity and Access Management (IAM)</a>.</p>\\n         <p> For conceptual information and underlying REST API, see <a href=\\\"https://docs.aws.amazon.com/amazonglacier/latest/dev/uploading-an-archive.html\\\">Uploading an Archive in Amazon\\n            Glacier</a> and <a href=\\\"https://docs.aws.amazon.com/amazonglacier/latest/dev/api-archive-post.html\\\">Upload Archive</a> in the\\n            <i>Amazon Glacier Developer Guide</i>. </p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To upload an archive\",\n                        \"documentation\": \"The example adds an archive to a vault.\",\n                        \"input\": {\n                            \"vaultName\": \"my-vault\",\n                            \"accountId\": \"-\",\n                            \"archiveDescription\": \"\",\n                            \"checksum\": \"\",\n                            \"body\": \"example-data-to-upload\"\n                        },\n                        \"output\": {\n                            \"archiveId\": \"kKB7ymWJVpPSwhGP6ycSOAekp9ZYe_--zM_mw6k76ZFGEIWQX-ybtRDvc2VkPSDtfKmQrj0IRQLSGsNuDp-AJVlu2ccmDSyDUmZwKbwbpAdGATGDiB3hHO0bjbGehXTcApVud_wyDw\",\n                            \"checksum\": \"969fb39823836d81f0cc028195fcdbcbbe76cdde932d4646fa7de5f21e18aa67\",\n                            \"location\": \"/0123456789012/vaults/my-vault/archives/kKB7ymWJVpPSwhGP6ycSOAekp9ZYe_--zM_mw6k76ZFGEIWQX-ybtRDvc2VkPSDtfKmQrj0IRQLSGsNuDp-AJVlu2ccmDSyDUmZwKbwbpAdGATGDiB3hHO0bjbGehXTcApVud_wyDw\"\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"POST\",\n                    \"uri\": \"/{accountId}/vaults/{vaultName}/archives\",\n                    \"code\": 201\n                }\n            }\n        },\n        \"com.amazonaws.glacier#UploadArchiveInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"vaultName\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the vault.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"accountId\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>AccountId</code> value is the AWS account ID of the account that owns the\\n         vault. You can either specify an AWS account ID or optionally a single '<code>-</code>'\\n         (hyphen), in which case Amazon S3 Glacier uses the AWS account ID associated with the\\n         credentials used to sign the request. If you use an account ID, do not include any hyphens\\n         ('-') in the ID. </p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"archiveDescription\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The optional description of the archive you are uploading.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amz-archive-description\"\n                    }\n                },\n                \"checksum\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The SHA256 tree hash of the data being uploaded.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amz-sha256-tree-hash\"\n                    }\n                },\n                \"body\": {\n                    \"target\": \"com.amazonaws.glacier#Stream\",\n                    \"traits\": {\n                        \"smithy.api#default\": \"\",\n                        \"smithy.api#documentation\": \"<p>The data to upload.</p>\",\n                        \"smithy.api#httpPayload\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Provides options to add an archive to a vault.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.glacier#UploadListElement\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"MultipartUploadId\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of a multipart upload.</p>\"\n                    }\n                },\n                \"VaultARN\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the vault that contains the archive.</p>\"\n                    }\n                },\n                \"ArchiveDescription\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The description of the archive that was specified in the Initiate Multipart Upload\\n         request.</p>\"\n                    }\n                },\n                \"PartSizeInBytes\": {\n                    \"target\": \"com.amazonaws.glacier#long\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The part size, in bytes, specified in the Initiate Multipart Upload request. This is\\n         the size of all the parts in the upload except the last part, which may be smaller than\\n         this size.</p>\"\n                    }\n                },\n                \"CreationDate\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The UTC time at which the multipart upload was initiated.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A list of in-progress multipart uploads for a vault.</p>\"\n            }\n        },\n        \"com.amazonaws.glacier#UploadMultipartPart\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.glacier#UploadMultipartPartInput\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.glacier#UploadMultipartPartOutput\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.glacier#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#MissingParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#RequestTimeoutException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.glacier#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This operation uploads a part of an archive. You can upload archive parts in any\\n         order. You can also upload them in parallel. You can upload up to 10,000 parts for a\\n         multipart upload.</p>\\n\\n         <p>Amazon Glacier rejects your upload part request if any of the following conditions is\\n         true:</p>\\n\\n         <ul>\\n            <li>\\n               <p>\\n                  <b>SHA256 tree hash does not match</b>To ensure that part\\n               data is not corrupted in transmission, you compute a SHA256 tree hash of the part and\\n               include it in your request. Upon receiving the part data, Amazon S3 Glacier also\\n               computes a SHA256 tree hash. If these hash values don't match, the operation fails.\\n               For information about computing a SHA256 tree hash, see <a href=\\\"https://docs.aws.amazon.com/amazonglacier/latest/dev/checksum-calculations.html\\\">Computing\\n                  Checksums</a>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>Part size does not match</b>The size of each part except\\n               the last must match the size specified in the corresponding <a>InitiateMultipartUpload</a> request. The size of the last part must be the\\n               same size as, or smaller than, the specified size.</p>\\n               <note>\\n                  <p>If you upload a part whose size is smaller than the part size you specified\\n                  in your initiate multipart upload request and that part is not the last part, then\\n                  the upload part request will succeed. However, the subsequent Complete Multipart\\n                  Upload request will fail.</p>\\n               </note>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>Range does not align</b>The byte range value in the\\n               request does not align with the part size specified in the corresponding initiate\\n               request. For example, if you specify a part size of 4194304 bytes (4 MB), then 0 to\\n               4194303 bytes (4 MB - 1) and 4194304 (4 MB) to 8388607 (8 MB - 1) are valid part\\n               ranges. However, if you set a range value of 2 MB to 6 MB, the range does not align\\n               with the part size and the upload will fail. </p>\\n            </li>\\n         </ul>\\n\\n         <p>This operation is idempotent. If you upload the same part multiple times, the data\\n         included in the most recent request overwrites the previously uploaded data.</p>\\n\\n         <p>An AWS account has full permission to perform all operations (actions). However, AWS\\n         Identity and Access Management (IAM) users don't have any permissions by default. You must\\n         grant them explicit permission to perform specific actions. For more information, see\\n            <a href=\\\"https://docs.aws.amazon.com/amazonglacier/latest/dev/using-iam-with-amazon-glacier.html\\\">Access Control Using\\n            AWS Identity and Access Management (IAM)</a>.</p>\\n         <p> For conceptual information and underlying REST API, see <a href=\\\"https://docs.aws.amazon.com/amazonglacier/latest/dev/uploading-archive-mpu.html\\\">Uploading Large Archives in\\n            Parts (Multipart Upload)</a> and <a href=\\\"https://docs.aws.amazon.com/amazonglacier/latest/dev/api-upload-part.html\\\">Upload Part </a> in the\\n            <i>Amazon Glacier Developer Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To upload the first part of an archive\",\n                        \"documentation\": \"The example uploads the first 1 MiB (1024 x 1024 bytes) part of an archive.\",\n                        \"input\": {\n                            \"accountId\": \"-\",\n                            \"vaultName\": \"examplevault\",\n                            \"uploadId\": \"19gaRezEXAMPLES6Ry5YYdqthHOC_kGRCT03L9yetr220UmPtBYKk-OssZtLqyFu7sY1_lR7vgFuJV6NtcV5zpsJ\",\n                            \"checksum\": \"c06f7cd4baacb087002a99a5f48bf953\",\n                            \"range\": \"bytes 0-1048575/*\",\n                            \"body\": \"part1\"\n                        },\n                        \"output\": {\n                            \"checksum\": \"c06f7cd4baacb087002a99a5f48bf953\"\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"PUT\",\n                    \"uri\": \"/{accountId}/vaults/{vaultName}/multipart-uploads/{uploadId}\",\n                    \"code\": 204\n                }\n            }\n        },\n        \"com.amazonaws.glacier#UploadMultipartPartInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"accountId\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>AccountId</code> value is the AWS account ID of the account that owns the\\n         vault. You can either specify an AWS account ID or optionally a single '<code>-</code>'\\n         (hyphen), in which case Amazon S3 Glacier uses the AWS account ID associated with the\\n         credentials used to sign the request. If you use an account ID, do not include any hyphens\\n         ('-') in the ID. </p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"vaultName\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the vault.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"uploadId\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The upload ID of the multipart upload.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"checksum\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The SHA256 tree hash of the data being uploaded.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amz-sha256-tree-hash\"\n                    }\n                },\n                \"range\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Identifies the range of bytes in the assembled archive that will be uploaded in this\\n         part. Amazon S3 Glacier uses this information to assemble the archive in the proper sequence.\\n         The format of this header follows RFC 2616. An example header is Content-Range:bytes\\n         0-4194303/*.</p>\",\n                        \"smithy.api#httpHeader\": \"Content-Range\"\n                    }\n                },\n                \"body\": {\n                    \"target\": \"com.amazonaws.glacier#Stream\",\n                    \"traits\": {\n                        \"smithy.api#default\": \"\",\n                        \"smithy.api#documentation\": \"<p>The data to upload.</p>\",\n                        \"smithy.api#httpPayload\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Provides options to upload a part of an archive in a multipart upload\\n         operation.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.glacier#UploadMultipartPartOutput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"checksum\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The SHA256 tree hash that Amazon S3 Glacier computed for the uploaded part.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amz-sha256-tree-hash\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the Amazon S3 Glacier response to your request.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.glacier#UploadsList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.glacier#UploadListElement\"\n            }\n        },\n        \"com.amazonaws.glacier#VaultAccessPolicy\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Policy\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The vault access policy.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the vault access policy.</p>\"\n            }\n        },\n        \"com.amazonaws.glacier#VaultList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.glacier#DescribeVaultOutput\"\n            }\n        },\n        \"com.amazonaws.glacier#VaultLockPolicy\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Policy\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The vault lock policy.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the vault lock policy.</p>\"\n            }\n        },\n        \"com.amazonaws.glacier#VaultNotificationConfig\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SNSTopic\": {\n                    \"target\": \"com.amazonaws.glacier#string\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Simple Notification Service (Amazon SNS) topic Amazon Resource Name\\n         (ARN).</p>\"\n                    }\n                },\n                \"Events\": {\n                    \"target\": \"com.amazonaws.glacier#NotificationEventList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of one or more events for which Amazon S3 Glacier will send a notification to the\\n         specified Amazon SNS topic.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents a vault's notification configuration.</p>\"\n            }\n        },\n        \"com.amazonaws.glacier#boolean\": {\n            \"type\": \"boolean\",\n            \"traits\": {\n                \"smithy.api#default\": false\n            }\n        },\n        \"com.amazonaws.glacier#hashmap\": {\n            \"type\": \"map\",\n            \"key\": {\n                \"target\": \"com.amazonaws.glacier#string\"\n            },\n            \"value\": {\n                \"target\": \"com.amazonaws.glacier#string\"\n            }\n        },\n        \"com.amazonaws.glacier#httpstatus\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#default\": 0\n            }\n        },\n        \"com.amazonaws.glacier#long\": {\n            \"type\": \"long\",\n            \"traits\": {\n                \"smithy.api#default\": 0\n            }\n        },\n        \"com.amazonaws.glacier#string\": {\n            \"type\": \"string\"\n        }\n    }\n}\n"
  },
  {
    "path": "aws/sdk/aws-models/iam.json",
    "content": "{\n    \"smithy\": \"2.0\",\n    \"metadata\": {\n        \"suppressions\": [\n            {\n                \"id\": \"HttpMethodSemantics\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"HttpResponseCodeSemantics\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"PaginatedTrait\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"HttpHeaderTrait\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"HttpUriConflict\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"Service\",\n                \"namespace\": \"*\"\n            }\n        ]\n    },\n    \"shapes\": {\n        \"com.amazonaws.iam#AWSIdentityManagementV20100508\": {\n            \"type\": \"service\",\n            \"version\": \"2010-05-08\",\n            \"operations\": [\n                {\n                    \"target\": \"com.amazonaws.iam#AddClientIDToOpenIDConnectProvider\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#AddRoleToInstanceProfile\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#AddUserToGroup\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#AttachGroupPolicy\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#AttachRolePolicy\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#AttachUserPolicy\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ChangePassword\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#CreateAccessKey\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#CreateAccountAlias\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#CreateGroup\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#CreateInstanceProfile\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#CreateLoginProfile\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#CreateOpenIDConnectProvider\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#CreatePolicy\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#CreatePolicyVersion\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#CreateRole\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#CreateSAMLProvider\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#CreateServiceLinkedRole\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#CreateServiceSpecificCredential\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#CreateUser\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#CreateVirtualMFADevice\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#DeactivateMFADevice\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#DeleteAccessKey\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#DeleteAccountAlias\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#DeleteAccountPasswordPolicy\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#DeleteGroup\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#DeleteGroupPolicy\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#DeleteInstanceProfile\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#DeleteLoginProfile\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#DeleteOpenIDConnectProvider\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#DeletePolicy\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#DeletePolicyVersion\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#DeleteRole\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#DeleteRolePermissionsBoundary\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#DeleteRolePolicy\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#DeleteSAMLProvider\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#DeleteServerCertificate\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#DeleteServiceLinkedRole\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#DeleteServiceSpecificCredential\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#DeleteSigningCertificate\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#DeleteSSHPublicKey\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#DeleteUser\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#DeleteUserPermissionsBoundary\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#DeleteUserPolicy\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#DeleteVirtualMFADevice\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#DetachGroupPolicy\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#DetachRolePolicy\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#DetachUserPolicy\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#DisableOrganizationsRootCredentialsManagement\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#DisableOrganizationsRootSessions\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#EnableMFADevice\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#EnableOrganizationsRootCredentialsManagement\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#EnableOrganizationsRootSessions\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#GenerateCredentialReport\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#GenerateOrganizationsAccessReport\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#GenerateServiceLastAccessedDetails\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#GetAccessKeyLastUsed\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#GetAccountAuthorizationDetails\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#GetAccountPasswordPolicy\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#GetAccountSummary\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#GetContextKeysForCustomPolicy\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#GetContextKeysForPrincipalPolicy\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#GetCredentialReport\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#GetGroup\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#GetGroupPolicy\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#GetInstanceProfile\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#GetLoginProfile\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#GetMFADevice\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#GetOpenIDConnectProvider\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#GetOrganizationsAccessReport\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#GetPolicy\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#GetPolicyVersion\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#GetRole\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#GetRolePolicy\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#GetSAMLProvider\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#GetServerCertificate\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#GetServiceLastAccessedDetails\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#GetServiceLastAccessedDetailsWithEntities\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#GetServiceLinkedRoleDeletionStatus\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#GetSSHPublicKey\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#GetUser\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#GetUserPolicy\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ListAccessKeys\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ListAccountAliases\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ListAttachedGroupPolicies\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ListAttachedRolePolicies\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ListAttachedUserPolicies\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ListEntitiesForPolicy\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ListGroupPolicies\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ListGroups\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ListGroupsForUser\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ListInstanceProfiles\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ListInstanceProfilesForRole\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ListInstanceProfileTags\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ListMFADevices\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ListMFADeviceTags\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ListOpenIDConnectProviders\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ListOpenIDConnectProviderTags\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ListOrganizationsFeatures\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ListPolicies\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ListPoliciesGrantingServiceAccess\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ListPolicyTags\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ListPolicyVersions\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ListRolePolicies\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ListRoles\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ListRoleTags\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ListSAMLProviders\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ListSAMLProviderTags\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ListServerCertificates\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ListServerCertificateTags\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ListServiceSpecificCredentials\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ListSigningCertificates\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ListSSHPublicKeys\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ListUserPolicies\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ListUsers\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ListUserTags\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ListVirtualMFADevices\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#PutGroupPolicy\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#PutRolePermissionsBoundary\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#PutRolePolicy\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#PutUserPermissionsBoundary\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#PutUserPolicy\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#RemoveClientIDFromOpenIDConnectProvider\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#RemoveRoleFromInstanceProfile\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#RemoveUserFromGroup\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ResetServiceSpecificCredential\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ResyncMFADevice\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#SetDefaultPolicyVersion\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#SetSecurityTokenServicePreferences\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#SimulateCustomPolicy\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#SimulatePrincipalPolicy\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#TagInstanceProfile\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#TagMFADevice\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#TagOpenIDConnectProvider\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#TagPolicy\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#TagRole\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#TagSAMLProvider\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#TagServerCertificate\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#TagUser\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#UntagInstanceProfile\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#UntagMFADevice\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#UntagOpenIDConnectProvider\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#UntagPolicy\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#UntagRole\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#UntagSAMLProvider\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#UntagServerCertificate\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#UntagUser\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#UpdateAccessKey\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#UpdateAccountPasswordPolicy\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#UpdateAssumeRolePolicy\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#UpdateGroup\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#UpdateLoginProfile\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#UpdateOpenIDConnectProviderThumbprint\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#UpdateRole\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#UpdateRoleDescription\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#UpdateSAMLProvider\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#UpdateServerCertificate\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#UpdateServiceSpecificCredential\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#UpdateSigningCertificate\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#UpdateSSHPublicKey\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#UpdateUser\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#UploadServerCertificate\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#UploadSigningCertificate\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#UploadSSHPublicKey\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#service\": {\n                    \"sdkId\": \"IAM\",\n                    \"arnNamespace\": \"iam\",\n                    \"cloudFormationName\": \"IAM\",\n                    \"cloudTrailEventSource\": \"iam.amazonaws.com\",\n                    \"endpointPrefix\": \"iam\"\n                },\n                \"aws.auth#sigv4\": {\n                    \"name\": \"iam\"\n                },\n                \"aws.protocols#awsQuery\": {},\n                \"smithy.api#documentation\": \"<fullname>Identity and Access Management</fullname>\\n         <p>Identity and Access Management (IAM) is a web service for securely controlling \\n      access to Amazon Web Services services. With IAM, you can centrally manage users, security credentials\\n      such as access keys, and permissions that control which Amazon Web Services resources users and \\n      applications can access. For more information about IAM, see <a href=\\\"http://aws.amazon.com/iam/\\\">Identity and Access Management (IAM)</a> and the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/\\\">Identity and Access Management User Guide</a>.</p>\",\n                \"smithy.api#title\": \"AWS Identity and Access Management\",\n                \"smithy.api#xmlNamespace\": {\n                    \"uri\": \"https://iam.amazonaws.com/doc/2010-05-08/\"\n                },\n                \"smithy.rules#endpointRuleSet\": {\n                    \"version\": \"1.0\",\n                    \"parameters\": {\n                        \"UseDualStack\": {\n                            \"builtIn\": \"AWS::UseDualStack\",\n                            \"required\": true,\n                            \"default\": false,\n                            \"documentation\": \"When true, use the dual-stack endpoint. If the configured endpoint does not support dual-stack, dispatching the request MAY return an error.\",\n                            \"type\": \"Boolean\"\n                        },\n                        \"UseFIPS\": {\n                            \"builtIn\": \"AWS::UseFIPS\",\n                            \"required\": true,\n                            \"default\": false,\n                            \"documentation\": \"When true, send this request to the FIPS-compliant regional endpoint. If the configured endpoint does not have a FIPS compliant endpoint, dispatching the request will return an error.\",\n                            \"type\": \"Boolean\"\n                        },\n                        \"Endpoint\": {\n                            \"builtIn\": \"SDK::Endpoint\",\n                            \"required\": false,\n                            \"documentation\": \"Override the endpoint used to send this request\",\n                            \"type\": \"String\"\n                        },\n                        \"Region\": {\n                            \"builtIn\": \"AWS::Region\",\n                            \"required\": false,\n                            \"documentation\": \"The AWS region used to dispatch the request.\",\n                            \"type\": \"String\"\n                        }\n                    },\n                    \"rules\": [\n                        {\n                            \"conditions\": [\n                                {\n                                    \"fn\": \"isSet\",\n                                    \"argv\": [\n                                        {\n                                            \"ref\": \"Endpoint\"\n                                        }\n                                    ]\n                                }\n                            ],\n                            \"rules\": [\n                                {\n                                    \"conditions\": [\n                                        {\n                                            \"fn\": \"booleanEquals\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"UseFIPS\"\n                                                },\n                                                true\n                                            ]\n                                        }\n                                    ],\n                                    \"error\": \"Invalid Configuration: FIPS and custom endpoint are not supported\",\n                                    \"type\": \"error\"\n                                },\n                                {\n                                    \"conditions\": [],\n                                    \"rules\": [\n                                        {\n                                            \"conditions\": [\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseDualStack\"\n                                                        },\n                                                        true\n                                                    ]\n                                                }\n                                            ],\n                                            \"error\": \"Invalid Configuration: Dualstack and custom endpoint are not supported\",\n                                            \"type\": \"error\"\n                                        },\n                                        {\n                                            \"conditions\": [],\n                                            \"endpoint\": {\n                                                \"url\": {\n                                                    \"ref\": \"Endpoint\"\n                                                },\n                                                \"properties\": {},\n                                                \"headers\": {}\n                                            },\n                                            \"type\": \"endpoint\"\n                                        }\n                                    ],\n                                    \"type\": \"tree\"\n                                }\n                            ],\n                            \"type\": \"tree\"\n                        },\n                        {\n                            \"conditions\": [],\n                            \"rules\": [\n                                {\n                                    \"conditions\": [\n                                        {\n                                            \"fn\": \"isSet\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"Region\"\n                                                }\n                                            ]\n                                        }\n                                    ],\n                                    \"rules\": [\n                                        {\n                                            \"conditions\": [\n                                                {\n                                                    \"fn\": \"aws.partition\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"Region\"\n                                                        }\n                                                    ],\n                                                    \"assign\": \"PartitionResult\"\n                                                }\n                                            ],\n                                            \"rules\": [\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"stringEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"PartitionResult\"\n                                                                        },\n                                                                        \"name\"\n                                                                    ]\n                                                                },\n                                                                \"aws\"\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"UseFIPS\"\n                                                                },\n                                                                false\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"UseDualStack\"\n                                                                },\n                                                                true\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"endpoint\": {\n                                                        \"url\": \"https://iam.global.api.aws\",\n                                                        \"properties\": {\n                                                            \"authSchemes\": [\n                                                                {\n                                                                    \"name\": \"sigv4\",\n                                                                    \"signingRegion\": \"us-east-1\"\n                                                                }\n                                                            ]\n                                                        },\n                                                        \"headers\": {}\n                                                    },\n                                                    \"type\": \"endpoint\"\n                                                },\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"stringEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"PartitionResult\"\n                                                                        },\n                                                                        \"name\"\n                                                                    ]\n                                                                },\n                                                                \"aws\"\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"UseFIPS\"\n                                                                },\n                                                                true\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"UseDualStack\"\n                                                                },\n                                                                true\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"endpoint\": {\n                                                        \"url\": \"https://iam-fips.global.api.aws\",\n                                                        \"properties\": {\n                                                            \"authSchemes\": [\n                                                                {\n                                                                    \"name\": \"sigv4\",\n                                                                    \"signingRegion\": \"us-east-1\"\n                                                                }\n                                                            ]\n                                                        },\n                                                        \"headers\": {}\n                                                    },\n                                                    \"type\": \"endpoint\"\n                                                },\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"stringEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"PartitionResult\"\n                                                                        },\n                                                                        \"name\"\n                                                                    ]\n                                                                },\n                                                                \"aws-cn\"\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"UseFIPS\"\n                                                                },\n                                                                false\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"UseDualStack\"\n                                                                },\n                                                                true\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"endpoint\": {\n                                                        \"url\": \"https://iam.global.api.amazonwebservices.com.cn\",\n                                                        \"properties\": {\n                                                            \"authSchemes\": [\n                                                                {\n                                                                    \"name\": \"sigv4\",\n                                                                    \"signingRegion\": \"cn-north-1\"\n                                                                }\n                                                            ]\n                                                        },\n                                                        \"headers\": {}\n                                                    },\n                                                    \"type\": \"endpoint\"\n                                                },\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"stringEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"PartitionResult\"\n                                                                        },\n                                                                        \"name\"\n                                                                    ]\n                                                                },\n                                                                \"aws-cn\"\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"UseFIPS\"\n                                                                },\n                                                                false\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"UseDualStack\"\n                                                                },\n                                                                false\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"endpoint\": {\n                                                        \"url\": \"https://iam.cn-north-1.amazonaws.com.cn\",\n                                                        \"properties\": {\n                                                            \"authSchemes\": [\n                                                                {\n                                                                    \"name\": \"sigv4\",\n                                                                    \"signingRegion\": \"cn-north-1\"\n                                                                }\n                                                            ]\n                                                        },\n                                                        \"headers\": {}\n                                                    },\n                                                    \"type\": \"endpoint\"\n                                                },\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"stringEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"PartitionResult\"\n                                                                        },\n                                                                        \"name\"\n                                                                    ]\n                                                                },\n                                                                \"aws-us-gov\"\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"UseFIPS\"\n                                                                },\n                                                                false\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"UseDualStack\"\n                                                                },\n                                                                true\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"endpoint\": {\n                                                        \"url\": \"https://iam.us-gov.api.aws\",\n                                                        \"properties\": {\n                                                            \"authSchemes\": [\n                                                                {\n                                                                    \"name\": \"sigv4\",\n                                                                    \"signingRegion\": \"us-gov-west-1\"\n                                                                }\n                                                            ]\n                                                        },\n                                                        \"headers\": {}\n                                                    },\n                                                    \"type\": \"endpoint\"\n                                                },\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"stringEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"PartitionResult\"\n                                                                        },\n                                                                        \"name\"\n                                                                    ]\n                                                                },\n                                                                \"aws-us-gov\"\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"UseFIPS\"\n                                                                },\n                                                                true\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"UseDualStack\"\n                                                                },\n                                                                true\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"endpoint\": {\n                                                        \"url\": \"https://iam.us-gov.api.aws\",\n                                                        \"properties\": {\n                                                            \"authSchemes\": [\n                                                                {\n                                                                    \"name\": \"sigv4\",\n                                                                    \"signingRegion\": \"us-gov-west-1\"\n                                                                }\n                                                            ]\n                                                        },\n                                                        \"headers\": {}\n                                                    },\n                                                    \"type\": \"endpoint\"\n                                                },\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"stringEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"PartitionResult\"\n                                                                        },\n                                                                        \"name\"\n                                                                    ]\n                                                                },\n                                                                \"aws-us-gov\"\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"UseFIPS\"\n                                                                },\n                                                                false\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"UseDualStack\"\n                                                                },\n                                                                false\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"endpoint\": {\n                                                        \"url\": \"https://iam.us-gov.amazonaws.com\",\n                                                        \"properties\": {\n                                                            \"authSchemes\": [\n                                                                {\n                                                                    \"name\": \"sigv4\",\n                                                                    \"signingRegion\": \"us-gov-west-1\"\n                                                                }\n                                                            ]\n                                                        },\n                                                        \"headers\": {}\n                                                    },\n                                                    \"type\": \"endpoint\"\n                                                },\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"stringEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"PartitionResult\"\n                                                                        },\n                                                                        \"name\"\n                                                                    ]\n                                                                },\n                                                                \"aws-us-gov\"\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"UseFIPS\"\n                                                                },\n                                                                true\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"UseDualStack\"\n                                                                },\n                                                                false\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"endpoint\": {\n                                                        \"url\": \"https://iam.us-gov.amazonaws.com\",\n                                                        \"properties\": {\n                                                            \"authSchemes\": [\n                                                                {\n                                                                    \"name\": \"sigv4\",\n                                                                    \"signingRegion\": \"us-gov-west-1\"\n                                                                }\n                                                            ]\n                                                        },\n                                                        \"headers\": {}\n                                                    },\n                                                    \"type\": \"endpoint\"\n                                                },\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"stringEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"PartitionResult\"\n                                                                        },\n                                                                        \"name\"\n                                                                    ]\n                                                                },\n                                                                \"aws-iso\"\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"UseFIPS\"\n                                                                },\n                                                                false\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"UseDualStack\"\n                                                                },\n                                                                false\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"endpoint\": {\n                                                        \"url\": \"https://iam.us-iso-east-1.c2s.ic.gov\",\n                                                        \"properties\": {\n                                                            \"authSchemes\": [\n                                                                {\n                                                                    \"name\": \"sigv4\",\n                                                                    \"signingRegion\": \"us-iso-east-1\"\n                                                                }\n                                                            ]\n                                                        },\n                                                        \"headers\": {}\n                                                    },\n                                                    \"type\": \"endpoint\"\n                                                },\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"stringEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"PartitionResult\"\n                                                                        },\n                                                                        \"name\"\n                                                                    ]\n                                                                },\n                                                                \"aws-iso\"\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"UseFIPS\"\n                                                                },\n                                                                true\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"UseDualStack\"\n                                                                },\n                                                                false\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"endpoint\": {\n                                                        \"url\": \"https://iam-fips.us-iso-east-1.c2s.ic.gov\",\n                                                        \"properties\": {\n                                                            \"authSchemes\": [\n                                                                {\n                                                                    \"name\": \"sigv4\",\n                                                                    \"signingRegion\": \"us-iso-east-1\"\n                                                                }\n                                                            ]\n                                                        },\n                                                        \"headers\": {}\n                                                    },\n                                                    \"type\": \"endpoint\"\n                                                },\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"stringEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"PartitionResult\"\n                                                                        },\n                                                                        \"name\"\n                                                                    ]\n                                                                },\n                                                                \"aws-iso-b\"\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"UseFIPS\"\n                                                                },\n                                                                false\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"UseDualStack\"\n                                                                },\n                                                                false\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"endpoint\": {\n                                                        \"url\": \"https://iam.us-isob-east-1.sc2s.sgov.gov\",\n                                                        \"properties\": {\n                                                            \"authSchemes\": [\n                                                                {\n                                                                    \"name\": \"sigv4\",\n                                                                    \"signingRegion\": \"us-isob-east-1\"\n                                                                }\n                                                            ]\n                                                        },\n                                                        \"headers\": {}\n                                                    },\n                                                    \"type\": \"endpoint\"\n                                                },\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"stringEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"PartitionResult\"\n                                                                        },\n                                                                        \"name\"\n                                                                    ]\n                                                                },\n                                                                \"aws-iso-b\"\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"UseFIPS\"\n                                                                },\n                                                                true\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"UseDualStack\"\n                                                                },\n                                                                false\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"endpoint\": {\n                                                        \"url\": \"https://iam-fips.us-isob-east-1.sc2s.sgov.gov\",\n                                                        \"properties\": {\n                                                            \"authSchemes\": [\n                                                                {\n                                                                    \"name\": \"sigv4\",\n                                                                    \"signingRegion\": \"us-isob-east-1\"\n                                                                }\n                                                            ]\n                                                        },\n                                                        \"headers\": {}\n                                                    },\n                                                    \"type\": \"endpoint\"\n                                                },\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"stringEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"PartitionResult\"\n                                                                        },\n                                                                        \"name\"\n                                                                    ]\n                                                                },\n                                                                \"aws-iso-e\"\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"UseFIPS\"\n                                                                },\n                                                                false\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"UseDualStack\"\n                                                                },\n                                                                false\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"endpoint\": {\n                                                        \"url\": \"https://iam.eu-isoe-west-1.cloud.adc-e.uk\",\n                                                        \"properties\": {\n                                                            \"authSchemes\": [\n                                                                {\n                                                                    \"name\": \"sigv4\",\n                                                                    \"signingRegion\": \"eu-isoe-west-1\"\n                                                                }\n                                                            ]\n                                                        },\n                                                        \"headers\": {}\n                                                    },\n                                                    \"type\": \"endpoint\"\n                                                },\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"stringEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"PartitionResult\"\n                                                                        },\n                                                                        \"name\"\n                                                                    ]\n                                                                },\n                                                                \"aws-iso-f\"\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"UseFIPS\"\n                                                                },\n                                                                false\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"UseDualStack\"\n                                                                },\n                                                                false\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"endpoint\": {\n                                                        \"url\": \"https://iam.us-isof-south-1.csp.hci.ic.gov\",\n                                                        \"properties\": {\n                                                            \"authSchemes\": [\n                                                                {\n                                                                    \"name\": \"sigv4\",\n                                                                    \"signingRegion\": \"us-isof-south-1\"\n                                                                }\n                                                            ]\n                                                        },\n                                                        \"headers\": {}\n                                                    },\n                                                    \"type\": \"endpoint\"\n                                                },\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"stringEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"PartitionResult\"\n                                                                        },\n                                                                        \"name\"\n                                                                    ]\n                                                                },\n                                                                \"aws-eusc\"\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"UseFIPS\"\n                                                                },\n                                                                false\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"UseDualStack\"\n                                                                },\n                                                                false\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"endpoint\": {\n                                                        \"url\": \"https://iam.eusc-de-east-1.amazonaws.eu\",\n                                                        \"properties\": {\n                                                            \"authSchemes\": [\n                                                                {\n                                                                    \"name\": \"sigv4\",\n                                                                    \"signingRegion\": \"eusc-de-east-1\"\n                                                                }\n                                                            ]\n                                                        },\n                                                        \"headers\": {}\n                                                    },\n                                                    \"type\": \"endpoint\"\n                                                },\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"UseFIPS\"\n                                                                },\n                                                                true\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"UseDualStack\"\n                                                                },\n                                                                true\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"rules\": [\n                                                        {\n                                                            \"conditions\": [\n                                                                {\n                                                                    \"fn\": \"booleanEquals\",\n                                                                    \"argv\": [\n                                                                        true,\n                                                                        {\n                                                                            \"fn\": \"getAttr\",\n                                                                            \"argv\": [\n                                                                                {\n                                                                                    \"ref\": \"PartitionResult\"\n                                                                                },\n                                                                                \"supportsFIPS\"\n                                                                            ]\n                                                                        }\n                                                                    ]\n                                                                },\n                                                                {\n                                                                    \"fn\": \"booleanEquals\",\n                                                                    \"argv\": [\n                                                                        true,\n                                                                        {\n                                                                            \"fn\": \"getAttr\",\n                                                                            \"argv\": [\n                                                                                {\n                                                                                    \"ref\": \"PartitionResult\"\n                                                                                },\n                                                                                \"supportsDualStack\"\n                                                                            ]\n                                                                        }\n                                                                    ]\n                                                                }\n                                                            ],\n                                                            \"rules\": [\n                                                                {\n                                                                    \"conditions\": [],\n                                                                    \"endpoint\": {\n                                                                        \"url\": \"https://iam-fips.{PartitionResult#dualStackDnsSuffix}\",\n                                                                        \"properties\": {\n                                                                            \"authSchemes\": [\n                                                                                {\n                                                                                    \"name\": \"sigv4\",\n                                                                                    \"signingRegion\": \"{PartitionResult#implicitGlobalRegion}\"\n                                                                                }\n                                                                            ]\n                                                                        },\n                                                                        \"headers\": {}\n                                                                    },\n                                                                    \"type\": \"endpoint\"\n                                                                }\n                                                            ],\n                                                            \"type\": \"tree\"\n                                                        },\n                                                        {\n                                                            \"conditions\": [],\n                                                            \"error\": \"FIPS and DualStack are enabled, but this partition does not support one or both\",\n                                                            \"type\": \"error\"\n                                                        }\n                                                    ],\n                                                    \"type\": \"tree\"\n                                                },\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"UseFIPS\"\n                                                                },\n                                                                true\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"UseDualStack\"\n                                                                },\n                                                                false\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"rules\": [\n                                                        {\n                                                            \"conditions\": [\n                                                                {\n                                                                    \"fn\": \"booleanEquals\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"fn\": \"getAttr\",\n                                                                            \"argv\": [\n                                                                                {\n                                                                                    \"ref\": \"PartitionResult\"\n                                                                                },\n                                                                                \"supportsFIPS\"\n                                                                            ]\n                                                                        },\n                                                                        true\n                                                                    ]\n                                                                }\n                                                            ],\n                                                            \"rules\": [\n                                                                {\n                                                                    \"conditions\": [],\n                                                                    \"endpoint\": {\n                                                                        \"url\": \"https://iam-fips.{PartitionResult#dnsSuffix}\",\n                                                                        \"properties\": {\n                                                                            \"authSchemes\": [\n                                                                                {\n                                                                                    \"name\": \"sigv4\",\n                                                                                    \"signingRegion\": \"{PartitionResult#implicitGlobalRegion}\"\n                                                                                }\n                                                                            ]\n                                                                        },\n                                                                        \"headers\": {}\n                                                                    },\n                                                                    \"type\": \"endpoint\"\n                                                                }\n                                                            ],\n                                                            \"type\": \"tree\"\n                                                        },\n                                                        {\n                                                            \"conditions\": [],\n                                                            \"error\": \"FIPS is enabled but this partition does not support FIPS\",\n                                                            \"type\": \"error\"\n                                                        }\n                                                    ],\n                                                    \"type\": \"tree\"\n                                                },\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"UseFIPS\"\n                                                                },\n                                                                false\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"UseDualStack\"\n                                                                },\n                                                                true\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"rules\": [\n                                                        {\n                                                            \"conditions\": [\n                                                                {\n                                                                    \"fn\": \"booleanEquals\",\n                                                                    \"argv\": [\n                                                                        true,\n                                                                        {\n                                                                            \"fn\": \"getAttr\",\n                                                                            \"argv\": [\n                                                                                {\n                                                                                    \"ref\": \"PartitionResult\"\n                                                                                },\n                                                                                \"supportsDualStack\"\n                                                                            ]\n                                                                        }\n                                                                    ]\n                                                                }\n                                                            ],\n                                                            \"rules\": [\n                                                                {\n                                                                    \"conditions\": [],\n                                                                    \"endpoint\": {\n                                                                        \"url\": \"https://iam.{PartitionResult#dualStackDnsSuffix}\",\n                                                                        \"properties\": {\n                                                                            \"authSchemes\": [\n                                                                                {\n                                                                                    \"name\": \"sigv4\",\n                                                                                    \"signingRegion\": \"{PartitionResult#implicitGlobalRegion}\"\n                                                                                }\n                                                                            ]\n                                                                        },\n                                                                        \"headers\": {}\n                                                                    },\n                                                                    \"type\": \"endpoint\"\n                                                                }\n                                                            ],\n                                                            \"type\": \"tree\"\n                                                        },\n                                                        {\n                                                            \"conditions\": [],\n                                                            \"error\": \"DualStack is enabled but this partition does not support DualStack\",\n                                                            \"type\": \"error\"\n                                                        }\n                                                    ],\n                                                    \"type\": \"tree\"\n                                                },\n                                                {\n                                                    \"conditions\": [],\n                                                    \"endpoint\": {\n                                                        \"url\": \"https://iam.{PartitionResult#dnsSuffix}\",\n                                                        \"properties\": {\n                                                            \"authSchemes\": [\n                                                                {\n                                                                    \"name\": \"sigv4\",\n                                                                    \"signingRegion\": \"{PartitionResult#implicitGlobalRegion}\"\n                                                                }\n                                                            ]\n                                                        },\n                                                        \"headers\": {}\n                                                    },\n                                                    \"type\": \"endpoint\"\n                                                }\n                                            ],\n                                            \"type\": \"tree\"\n                                        }\n                                    ],\n                                    \"type\": \"tree\"\n                                },\n                                {\n                                    \"conditions\": [],\n                                    \"error\": \"Invalid Configuration: Missing Region\",\n                                    \"type\": \"error\"\n                                }\n                            ],\n                            \"type\": \"tree\"\n                        }\n                    ]\n                },\n                \"smithy.rules#endpointTests\": {\n                    \"testCases\": [\n                        {\n                            \"documentation\": \"For custom endpoint with region not set and fips disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://example.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Endpoint\": \"https://example.com\",\n                                \"UseFIPS\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For custom endpoint with fips enabled\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: FIPS and custom endpoint are not supported\"\n                            },\n                            \"params\": {\n                                \"Endpoint\": \"https://example.com\",\n                                \"UseFIPS\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For custom endpoint with fips disabled and dualstack enabled\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: Dualstack and custom endpoint are not supported\"\n                            },\n                            \"params\": {\n                                \"Endpoint\": \"https://example.com\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-1 with FIPS enabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingRegion\": \"us-east-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://iam-fips.global.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingRegion\": \"us-east-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://iam-fips.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-1 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingRegion\": \"us-east-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://iam.global.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingRegion\": \"us-east-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://iam.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-northwest-1 with FIPS enabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingRegion\": \"cn-northwest-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://iam-fips.api.amazonwebservices.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-northwest-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-northwest-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingRegion\": \"cn-northwest-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://iam-fips.amazonaws.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-northwest-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-northwest-1 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingRegion\": \"cn-north-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://iam.global.api.amazonwebservices.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-northwest-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-northwest-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingRegion\": \"cn-north-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://iam.cn-north-1.amazonaws.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-northwest-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-west-1 with FIPS enabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingRegion\": \"us-gov-west-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://iam.us-gov.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-west-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-west-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingRegion\": \"us-gov-west-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://iam.us-gov.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-west-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-west-1 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingRegion\": \"us-gov-west-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://iam.us-gov.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-west-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-west-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingRegion\": \"us-gov-west-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://iam.us-gov.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-west-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-iso-east-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingRegion\": \"us-iso-east-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://iam-fips.us-iso-east-1.c2s.ic.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-iso-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-iso-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingRegion\": \"us-iso-east-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://iam.us-iso-east-1.c2s.ic.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-iso-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-isob-east-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingRegion\": \"us-isob-east-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://iam-fips.us-isob-east-1.sc2s.sgov.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-isob-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-isob-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingRegion\": \"us-isob-east-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://iam.us-isob-east-1.sc2s.sgov.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-isob-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-isoe-west-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingRegion\": \"eu-isoe-west-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://iam-fips.cloud.adc-e.uk\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-isoe-west-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-isoe-west-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingRegion\": \"eu-isoe-west-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://iam.eu-isoe-west-1.cloud.adc-e.uk\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-isoe-west-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-isof-south-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingRegion\": \"us-isof-south-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://iam-fips.csp.hci.ic.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-isof-south-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-isof-south-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingRegion\": \"us-isof-south-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://iam.us-isof-south-1.csp.hci.ic.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-isof-south-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eusc-de-east-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingRegion\": \"eusc-de-east-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://iam-fips.amazonaws.eu\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eusc-de-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eusc-de-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingRegion\": \"eusc-de-east-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://iam.eusc-de-east-1.amazonaws.eu\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eusc-de-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"Missing region\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: Missing Region\"\n                            }\n                        }\n                    ],\n                    \"version\": \"1.0\"\n                }\n            }\n        },\n        \"com.amazonaws.iam#AccessAdvisorUsageGranularityType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"SERVICE_LEVEL\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"SERVICE_LEVEL\"\n                    }\n                },\n                \"ACTION_LEVEL\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ACTION_LEVEL\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.iam#AccessDetail\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ServiceName\": {\n                    \"target\": \"com.amazonaws.iam#serviceNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the service in which access was attempted.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ServiceNamespace\": {\n                    \"target\": \"com.amazonaws.iam#serviceNamespaceType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The namespace of the service in which access was attempted.</p>\\n         <p>To learn the service namespace of a service, see <a href=\\\"https://docs.aws.amazon.com/service-authorization/latest/reference/reference_policies_actions-resources-contextkeys.html\\\">Actions, resources, and condition keys for Amazon Web Services services</a> in the\\n            <i>Service Authorization Reference</i>. Choose the name of the service to\\n         view details for that service. In the first paragraph, find the service prefix. For\\n         example, <code>(service prefix: a4b)</code>. For more information about service namespaces,\\n         see <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html#genref-aws-service-namespaces\\\">Amazon Web Services\\n            service namespaces</a> in the <i>Amazon Web Services General Reference</i>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Region\": {\n                    \"target\": \"com.amazonaws.iam#stringType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Region where the last service access attempt occurred.</p>\\n         <p>This field is null if no principals in the reported Organizations entity attempted to access the\\n         service within the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_access-advisor.html#service-last-accessed-reporting-period\\\">tracking period</a>.</p>\"\n                    }\n                },\n                \"EntityPath\": {\n                    \"target\": \"com.amazonaws.iam#organizationsEntityPathType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The path of the Organizations entity (root, organizational unit, or account) from which an\\n         authenticated principal last attempted to access the service. Amazon Web Services does not report\\n         unauthenticated requests.</p>\\n         <p>This field is null if no principals (IAM users, IAM roles, or root user) in the\\n         reported Organizations entity attempted to access the service within the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_access-advisor.html#service-last-accessed-reporting-period\\\">tracking period</a>.</p>\"\n                    }\n                },\n                \"LastAuthenticatedTime\": {\n                    \"target\": \"com.amazonaws.iam#dateType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time, in <a href=\\\"http://www.iso.org/iso/iso8601\\\">ISO 8601 date-time\\n            format</a>, when an authenticated principal most recently attempted to access the\\n         service. Amazon Web Services does not report unauthenticated requests.</p>\\n         <p>This field is null if no principals in the reported Organizations entity attempted to access the\\n         service within the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_access-advisor.html#service-last-accessed-reporting-period\\\">tracking period</a>.</p>\"\n                    }\n                },\n                \"TotalAuthenticatedEntities\": {\n                    \"target\": \"com.amazonaws.iam#integerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of accounts with authenticated principals (root user, IAM users, and IAM\\n         roles) that attempted to access the service in the tracking period.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>An object that contains details about when a principal in the reported Organizations entity\\n         last attempted to access an Amazon Web Services service. A principal can be an IAM user, an IAM role,\\n         or the Amazon Web Services account root user within the reported Organizations entity.</p>\\n         <p>This data type is a response element in the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetOrganizationsAccessReport.html\\\">GetOrganizationsAccessReport</a> operation.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#AccessDetails\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.iam#AccessDetail\"\n            }\n        },\n        \"com.amazonaws.iam#AccessKey\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"UserName\": {\n                    \"target\": \"com.amazonaws.iam#userNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the IAM user that the access key is associated with.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"AccessKeyId\": {\n                    \"target\": \"com.amazonaws.iam#accessKeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID for this access key.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Status\": {\n                    \"target\": \"com.amazonaws.iam#statusType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The status of the access key. <code>Active</code> means that the key is valid for API\\n         calls, while <code>Inactive</code> means it is not. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"SecretAccessKey\": {\n                    \"target\": \"com.amazonaws.iam#accessKeySecretType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The secret key used to sign requests.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"CreateDate\": {\n                    \"target\": \"com.amazonaws.iam#dateType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date when the access key was created.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains information about an Amazon Web Services access key.</p>\\n         <p> This data type is used as a response element in the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateAccessKey.html\\\">CreateAccessKey</a> and\\n            <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListAccessKeys.html\\\">ListAccessKeys</a> operations. </p>\\n         <note>\\n            <p>The <code>SecretAccessKey</code> value is returned only in response to <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateAccessKey.html\\\">CreateAccessKey</a>. You can get a secret access key only when you first create\\n            an access key; you cannot recover the secret access key later. If you lose a secret\\n            access key, you must create a new access key.</p>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.iam#AccessKeyLastUsed\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LastUsedDate\": {\n                    \"target\": \"com.amazonaws.iam#dateType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time, in <a href=\\\"http://www.iso.org/iso/iso8601\\\">ISO 8601 date-time\\n            format</a>, when the access key was most recently used. This field is null in the\\n         following situations:</p>\\n         <ul>\\n            <li>\\n               <p>The user does not have an access key.</p>\\n            </li>\\n            <li>\\n               <p>An access key exists but has not been used since IAM began tracking this\\n               information.</p>\\n            </li>\\n            <li>\\n               <p>There is no sign-in data associated with the user.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"ServiceName\": {\n                    \"target\": \"com.amazonaws.iam#stringType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the Amazon Web Services service with which this access key was most recently used. The\\n         value of this field is \\\"N/A\\\" in the following situations:</p>\\n         <ul>\\n            <li>\\n               <p>The user does not have an access key.</p>\\n            </li>\\n            <li>\\n               <p>An access key exists but has not been used since IAM started tracking this\\n               information.</p>\\n            </li>\\n            <li>\\n               <p>There is no sign-in data associated with the user.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Region\": {\n                    \"target\": \"com.amazonaws.iam#stringType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services Region where this access key was most recently used. The value for this field\\n         is \\\"N/A\\\" in the following situations:</p>\\n         <ul>\\n            <li>\\n               <p>The user does not have an access key.</p>\\n            </li>\\n            <li>\\n               <p>An access key exists but has not been used since IAM began tracking this\\n               information.</p>\\n            </li>\\n            <li>\\n               <p>There is no sign-in data associated with the user.</p>\\n            </li>\\n         </ul>\\n         <p>For more information about Amazon Web Services Regions, see <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/rande.html\\\">Regions and endpoints</a> in the Amazon Web Services\\n         General Reference.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains information about the last time an Amazon Web Services access key was used since IAM began\\n         tracking this information on April 22, 2015.</p>\\n         <p>This data type is used as a response element in the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetAccessKeyLastUsed.html\\\">GetAccessKeyLastUsed</a>\\n         operation.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#AccessKeyMetadata\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"UserName\": {\n                    \"target\": \"com.amazonaws.iam#userNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the IAM user that the key is associated with.</p>\"\n                    }\n                },\n                \"AccessKeyId\": {\n                    \"target\": \"com.amazonaws.iam#accessKeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID for this access key.</p>\"\n                    }\n                },\n                \"Status\": {\n                    \"target\": \"com.amazonaws.iam#statusType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The status of the access key. <code>Active</code> means that the key is valid for API\\n         calls; <code>Inactive</code> means it is not.</p>\"\n                    }\n                },\n                \"CreateDate\": {\n                    \"target\": \"com.amazonaws.iam#dateType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date when the access key was created.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains information about an Amazon Web Services access key, without its secret key.</p>\\n         <p>This data type is used as a response element in the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListAccessKeys.html\\\">ListAccessKeys</a>\\n         operation.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#AccountNotManagementOrDelegatedAdministratorException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Message\": {\n                    \"target\": \"com.amazonaws.iam#ExceptionMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The request was rejected because the account making the request is not the management\\n      account or delegated administrator account for <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_root-user.html#id_root-user-access-management\\\">centralized root\\n        access</a>.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.iam#ActionNameListType\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.iam#ActionNameType\"\n            }\n        },\n        \"com.amazonaws.iam#ActionNameType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 3,\n                    \"max\": 128\n                }\n            }\n        },\n        \"com.amazonaws.iam#AddClientIDToOpenIDConnectProvider\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#AddClientIDToOpenIDConnectProviderRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#InvalidInputException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Adds a new client ID (also known as audience) to the list of client IDs already\\n            registered for the specified IAM OpenID Connect (OIDC) provider resource.</p>\\n         <p>This operation is idempotent; it does not fail or return an error if you add an\\n            existing client ID to the provider.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To add a client ID (audience) to an Open-ID Connect (OIDC) provider\",\n                        \"documentation\": \"The following add-client-id-to-open-id-connect-provider command adds the client ID my-application-ID to the OIDC provider named server.example.com:\",\n                        \"input\": {\n                            \"ClientID\": \"my-application-ID\",\n                            \"OpenIDConnectProviderArn\": \"arn:aws:iam::123456789012:oidc-provider/server.example.com\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.iam#AddClientIDToOpenIDConnectProviderRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"OpenIDConnectProviderArn\": {\n                    \"target\": \"com.amazonaws.iam#arnType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the IAM OpenID Connect (OIDC) provider resource to\\n            add the client ID to. You can get a list of OIDC provider ARNs by using the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListOpenIDConnectProviders.html\\\">ListOpenIDConnectProviders</a> operation.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ClientID\": {\n                    \"target\": \"com.amazonaws.iam#clientIDType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The client ID (also known as audience) to add to the IAM OpenID Connect provider\\n            resource.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#AddRoleToInstanceProfile\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#AddRoleToInstanceProfileRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#EntityAlreadyExistsException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#UnmodifiableEntityException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Adds the specified IAM role to the specified instance profile. An instance profile\\n            can contain only one role, and this quota cannot be increased. You can remove the\\n            existing role and then add a different role to an instance profile. You must then wait\\n            for the change to appear across all of Amazon Web Services because of <a href=\\\"https://en.wikipedia.org/wiki/Eventual_consistency\\\">eventual\\n                consistency</a>. To force the change, you must <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DisassociateIamInstanceProfile.html\\\">disassociate the instance profile</a> and then <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_AssociateIamInstanceProfile.html\\\">associate the\\n                instance profile</a>, or you can stop your instance and then restart it.</p>\\n         <note>\\n            <p>The caller of this operation must be granted the <code>PassRole</code> permission\\n                on the IAM role by a permissions policy.</p>\\n         </note>\\n         <important>\\n            <p>When using the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_iam-condition-keys.html#available-keys-for-iam\\\">iam:AssociatedResourceArn</a> condition in a policy to restrict the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_passrole.html\\\">PassRole</a> IAM action, special considerations apply if the policy is\\n                intended to define access for the <code>AddRoleToInstanceProfile</code> action. In\\n                this case, you cannot specify a Region or instance ID in the EC2 instance ARN. The\\n                ARN value must be <code>arn:aws:ec2:*:CallerAccountId:instance/*</code>. Using any\\n                other ARN value may lead to unexpected evaluation results.</p>\\n         </important>\\n         <p> For more information about roles, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html\\\">IAM roles</a> in the\\n                <i>IAM User Guide</i>. For more information about instance profiles,\\n            see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-ec2_instance-profiles.html\\\">Using\\n                instance profiles</a> in the <i>IAM User Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To add a role to an instance profile\",\n                        \"documentation\": \"The following command adds the role named S3Access to the instance profile named Webserver:\",\n                        \"input\": {\n                            \"RoleName\": \"S3Access\",\n                            \"InstanceProfileName\": \"Webserver\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.iam#AddRoleToInstanceProfileRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceProfileName\": {\n                    \"target\": \"com.amazonaws.iam#instanceProfileNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the instance profile to update.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"RoleName\": {\n                    \"target\": \"com.amazonaws.iam#roleNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the role to add.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#AddUserToGroup\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#AddUserToGroupRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Adds the specified user to the specified group.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To add a user to an IAM group\",\n                        \"documentation\": \"The following command adds an IAM user named Bob to the IAM group named Admins:\",\n                        \"input\": {\n                            \"UserName\": \"Bob\",\n                            \"GroupName\": \"Admins\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.iam#AddUserToGroupRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"GroupName\": {\n                    \"target\": \"com.amazonaws.iam#groupNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the group to update.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"UserName\": {\n                    \"target\": \"com.amazonaws.iam#existingUserNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the user to add.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#ArnListType\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.iam#arnType\"\n            }\n        },\n        \"com.amazonaws.iam#AttachGroupPolicy\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#AttachGroupPolicyRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#InvalidInputException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#PolicyNotAttachableException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Attaches the specified managed policy to the specified IAM group.</p>\\n         <p>You use this operation to attach a managed policy to a group. To embed an inline\\n            policy in a group, use <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_PutGroupPolicy.html\\\">\\n               <code>PutGroupPolicy</code>\\n            </a>.</p>\\n         <p>As a best practice, you can validate your IAM policies. \\n     To learn more, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_policy-validator.html\\\">Validating IAM policies</a> \\n            in the <i>IAM User Guide</i>.</p>\\n         <p>For more information about policies, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/policies-managed-vs-inline.html\\\">Managed policies and inline\\n                policies</a> in the <i>IAM User Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To attach a managed policy to an IAM group\",\n                        \"documentation\": \"The following command attaches the AWS managed policy named ReadOnlyAccess to the IAM group named Finance.\",\n                        \"input\": {\n                            \"GroupName\": \"Finance\",\n                            \"PolicyArn\": \"arn:aws:iam::aws:policy/ReadOnlyAccess\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.iam#AttachGroupPolicyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"GroupName\": {\n                    \"target\": \"com.amazonaws.iam#groupNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name (friendly name, not ARN) of the group to attach the policy to.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"PolicyArn\": {\n                    \"target\": \"com.amazonaws.iam#arnType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the IAM policy you want to attach.</p>\\n         <p>For more information about ARNs, see <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html\\\">Amazon Resource Names (ARNs)</a> in the <i>Amazon Web Services General Reference</i>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#AttachRolePolicy\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#AttachRolePolicyRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#InvalidInputException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#PolicyNotAttachableException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#UnmodifiableEntityException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Attaches the specified managed policy to the specified IAM role. When you attach a\\n            managed policy to a role, the managed policy becomes part of the role's permission\\n            (access) policy.</p>\\n         <note>\\n            <p>You cannot use a managed policy as the role's trust policy. The role's trust\\n                policy is created at the same time as the role, using <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateRole.html\\\">\\n                  <code>CreateRole</code>\\n               </a>. You can update a role's trust policy using\\n                    <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_UpdateAssumeRolePolicy.html\\\">\\n                  <code>UpdateAssumerolePolicy</code>\\n               </a>.</p>\\n         </note>\\n         <p>Use this operation to attach a <i>managed</i> policy to a role. To embed\\n            an inline policy in a role, use <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_PutRolePolicy.html\\\">\\n               <code>PutRolePolicy</code>\\n            </a>. For more information about policies, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/policies-managed-vs-inline.html\\\">Managed\\n                policies and inline policies</a> in the\\n            <i>IAM User Guide</i>.</p>\\n         <p>As a best practice, you can validate your IAM policies. \\n     To learn more, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_policy-validator.html\\\">Validating IAM policies</a> \\n            in the <i>IAM User Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To attach a managed policy to an IAM role\",\n                        \"documentation\": \"The following command attaches the AWS managed policy named ReadOnlyAccess to the IAM role named ReadOnlyRole.\",\n                        \"input\": {\n                            \"RoleName\": \"ReadOnlyRole\",\n                            \"PolicyArn\": \"arn:aws:iam::aws:policy/ReadOnlyAccess\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.iam#AttachRolePolicyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RoleName\": {\n                    \"target\": \"com.amazonaws.iam#roleNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name (friendly name, not ARN) of the role to attach the policy to.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"PolicyArn\": {\n                    \"target\": \"com.amazonaws.iam#arnType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the IAM policy you want to attach.</p>\\n         <p>For more information about ARNs, see <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html\\\">Amazon Resource Names (ARNs)</a> in the <i>Amazon Web Services General Reference</i>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#AttachUserPolicy\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#AttachUserPolicyRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#InvalidInputException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#PolicyNotAttachableException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Attaches the specified managed policy to the specified user.</p>\\n         <p>You use this operation to attach a <i>managed</i> policy to a user. To\\n            embed an inline policy in a user, use <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_PutUserPolicy.html\\\">\\n               <code>PutUserPolicy</code>\\n            </a>.</p>\\n         <p>As a best practice, you can validate your IAM policies. \\n     To learn more, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_policy-validator.html\\\">Validating IAM policies</a> \\n            in the <i>IAM User Guide</i>.</p>\\n         <p>For more information about policies, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/policies-managed-vs-inline.html\\\">Managed policies and inline\\n                policies</a> in the <i>IAM User Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To attach a managed policy to an IAM user\",\n                        \"documentation\": \"The following command attaches the AWS managed policy named AdministratorAccess to the IAM user named Alice.\",\n                        \"input\": {\n                            \"UserName\": \"Alice\",\n                            \"PolicyArn\": \"arn:aws:iam::aws:policy/AdministratorAccess\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.iam#AttachUserPolicyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"UserName\": {\n                    \"target\": \"com.amazonaws.iam#userNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name (friendly name, not ARN) of the IAM user to attach the policy to.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"PolicyArn\": {\n                    \"target\": \"com.amazonaws.iam#arnType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the IAM policy you want to attach.</p>\\n         <p>For more information about ARNs, see <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html\\\">Amazon Resource Names (ARNs)</a> in the <i>Amazon Web Services General Reference</i>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#AttachedPermissionsBoundary\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PermissionsBoundaryType\": {\n                    \"target\": \"com.amazonaws.iam#PermissionsBoundaryAttachmentType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The permissions boundary usage type that indicates what type of IAM resource is used\\n         as the permissions boundary for an entity. This data type can only have a value of\\n            <code>Policy</code>.</p>\"\n                    }\n                },\n                \"PermissionsBoundaryArn\": {\n                    \"target\": \"com.amazonaws.iam#arnType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The ARN of the policy used to set the permissions boundary for the user or role.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains information about an attached permissions boundary.</p>\\n         <p>An attached permissions boundary is a managed policy that has been attached to a user or\\n         role to set the permissions boundary.</p>\\n         <p>For more information about permissions boundaries, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_boundaries.html\\\">Permissions boundaries for IAM\\n            identities </a> in the <i>IAM User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#AttachedPolicy\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PolicyName\": {\n                    \"target\": \"com.amazonaws.iam#policyNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The friendly name of the attached policy.</p>\"\n                    }\n                },\n                \"PolicyArn\": {\n                    \"target\": \"com.amazonaws.iam#arnType\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains information about an attached policy.</p>\\n         <p>An attached policy is a managed policy that has been attached to a user, group, or role.\\n         This data type is used as a response element in the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListAttachedGroupPolicies.html\\\">ListAttachedGroupPolicies</a>, <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListAttachedRolePolicies.html\\\">ListAttachedRolePolicies</a>, <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListAttachedUserPolicies.html\\\">ListAttachedUserPolicies</a>, and <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetAccountAuthorizationDetails.html\\\">GetAccountAuthorizationDetails</a> operations. </p>\\n         <p>For more information about managed policies, refer to <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/policies-managed-vs-inline.html\\\">Managed policies and inline\\n            policies</a> in the <i>IAM User Guide</i>. </p>\"\n            }\n        },\n        \"com.amazonaws.iam#BootstrapDatum\": {\n            \"type\": \"blob\",\n            \"traits\": {\n                \"smithy.api#sensitive\": {}\n            }\n        },\n        \"com.amazonaws.iam#CallerIsNotManagementAccountException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Message\": {\n                    \"target\": \"com.amazonaws.iam#ExceptionMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The request was rejected because the account making the request is not the management\\n      account for the organization.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.iam#CertificationKeyType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 128\n                },\n                \"smithy.api#pattern\": \"^[\\\\u0020-\\\\u00FF]+$\"\n            }\n        },\n        \"com.amazonaws.iam#CertificationMapType\": {\n            \"type\": \"map\",\n            \"key\": {\n                \"target\": \"com.amazonaws.iam#CertificationKeyType\"\n            },\n            \"value\": {\n                \"target\": \"com.amazonaws.iam#CertificationValueType\"\n            }\n        },\n        \"com.amazonaws.iam#CertificationValueType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 32\n                },\n                \"smithy.api#pattern\": \"^[\\\\u0020-\\\\u00FF]+$\"\n            }\n        },\n        \"com.amazonaws.iam#ChangePassword\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#ChangePasswordRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#EntityTemporarilyUnmodifiableException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#InvalidUserTypeException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#PasswordPolicyViolationException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Changes the password of the IAM user who is calling this operation. This operation\\n            can be performed using the CLI, the Amazon Web Services API, or the <b>My\\n                Security Credentials</b> page in the Amazon Web Services Management Console. The Amazon Web Services account root user password is\\n            not affected by this operation.</p>\\n         <p>Use <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_UpdateLoginProfile.html\\\">UpdateLoginProfile</a>\\n            to use the CLI, the Amazon Web Services API, or the <b>Users</b> page in\\n            the IAM console to change the password for any IAM user. For more information about\\n            modifying passwords, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/Using_ManagingLogins.html\\\">Managing passwords</a> in the\\n                <i>IAM User Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To change the password for your IAM user\",\n                        \"documentation\": \"The following command changes the password for the current IAM user.\",\n                        \"input\": {\n                            \"NewPassword\": \"]35d/{pB9Fo9wJ\",\n                            \"OldPassword\": \"3s0K_;xh4~8XXI\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.iam#ChangePasswordRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"OldPassword\": {\n                    \"target\": \"com.amazonaws.iam#passwordType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IAM user's current password.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"NewPassword\": {\n                    \"target\": \"com.amazonaws.iam#passwordType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The new password. The new password must conform to the Amazon Web Services account's password\\n            policy, if one exists.</p>\\n         <p>The <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a> \\n    that is used to validate this parameter is a string of characters. That string can include almost any printable \\n    ASCII character from the space (<code>\\\\u0020</code>) through the end of the ASCII character range (<code>\\\\u00FF</code>). \\n    You can also include the tab (<code>\\\\u0009</code>), line feed (<code>\\\\u000A</code>), and carriage return (<code>\\\\u000D</code>) \\n    characters. Any of these characters are valid in a password. However, many tools, such \\n    as the Amazon Web Services Management Console, might restrict the ability to type certain characters because they have \\n    special meaning within that tool.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#ColumnNumber\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#default\": 0\n            }\n        },\n        \"com.amazonaws.iam#ConcurrentModificationException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.iam#ConcurrentModificationMessage\"\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"ConcurrentModification\",\n                    \"httpResponseCode\": 409\n                },\n                \"smithy.api#documentation\": \"<p>The request was rejected because multiple requests to change this object were submitted\\n      simultaneously. Wait a few minutes and submit your request again.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 409\n            }\n        },\n        \"com.amazonaws.iam#ConcurrentModificationMessage\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.iam#ContextEntry\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ContextKeyName\": {\n                    \"target\": \"com.amazonaws.iam#ContextKeyNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The full name of a condition context key, including the service prefix. For example,\\n            <code>aws:SourceIp</code> or <code>s3:VersionId</code>.</p>\"\n                    }\n                },\n                \"ContextKeyValues\": {\n                    \"target\": \"com.amazonaws.iam#ContextKeyValueListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The value (or values, if the condition context key supports multiple values) to provide\\n         to the simulation when the key is referenced by a <code>Condition</code> element in an\\n         input policy.</p>\"\n                    }\n                },\n                \"ContextKeyType\": {\n                    \"target\": \"com.amazonaws.iam#ContextKeyTypeEnum\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The data type of the value (or values) specified in the <code>ContextKeyValues</code>\\n         parameter.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains information about a condition context key. It includes the name of the key and\\n         specifies the value (or values, if the context key supports multiple values) to use in the\\n         simulation. This information is used when evaluating the <code>Condition</code> elements of\\n         the input policies.</p>\\n         <p>This data type is used as an input parameter to <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_SimulateCustomPolicy.html\\\">SimulateCustomPolicy</a>\\n         and <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_SimulatePrincipalPolicy.html\\\">SimulatePrincipalPolicy</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#ContextEntryListType\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.iam#ContextEntry\"\n            }\n        },\n        \"com.amazonaws.iam#ContextKeyNameType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 5,\n                    \"max\": 256\n                }\n            }\n        },\n        \"com.amazonaws.iam#ContextKeyNamesResultListType\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.iam#ContextKeyNameType\"\n            }\n        },\n        \"com.amazonaws.iam#ContextKeyTypeEnum\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"STRING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"string\"\n                    }\n                },\n                \"STRING_LIST\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"stringList\"\n                    }\n                },\n                \"NUMERIC\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"numeric\"\n                    }\n                },\n                \"NUMERIC_LIST\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"numericList\"\n                    }\n                },\n                \"BOOLEAN\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"boolean\"\n                    }\n                },\n                \"BOOLEAN_LIST\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"booleanList\"\n                    }\n                },\n                \"IP\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ip\"\n                    }\n                },\n                \"IP_LIST\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ipList\"\n                    }\n                },\n                \"BINARY\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"binary\"\n                    }\n                },\n                \"BINARY_LIST\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"binaryList\"\n                    }\n                },\n                \"DATE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"date\"\n                    }\n                },\n                \"DATE_LIST\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"dateList\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.iam#ContextKeyValueListType\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.iam#ContextKeyValueType\"\n            }\n        },\n        \"com.amazonaws.iam#ContextKeyValueType\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.iam#CreateAccessKey\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#CreateAccessKeyRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#CreateAccessKeyResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p> Creates a new Amazon Web Services secret access key and corresponding Amazon Web Services access key ID for the\\n            specified user. The default status for new keys is <code>Active</code>.</p>\\n         <p>If you do not specify a user name, IAM determines the user name implicitly based on\\n            the Amazon Web Services access key ID signing the request. This operation works for access keys under\\n            the Amazon Web Services account. Consequently, you can use this operation to manage Amazon Web Services account root\\n            user credentials. This is true even if the Amazon Web Services account has no associated users.</p>\\n         <p> For information about quotas on the number of keys you can create, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_iam-quotas.html\\\">IAM and STS\\n                quotas</a> in the <i>IAM User Guide</i>.</p>\\n         <important>\\n            <p>To ensure the security of your Amazon Web Services account, the secret access key is accessible\\n                only during key and user creation. You must save the key (for example, in a text\\n                file) if you want to be able to access it again. If a secret key is lost, you can\\n                delete the access keys for the associated user and then create new keys.</p>\\n         </important>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To create an access key for an IAM user\",\n                        \"documentation\": \"The following command creates an access key (access key ID and secret access key) for the IAM user named Bob.\",\n                        \"input\": {\n                            \"UserName\": \"Bob\"\n                        },\n                        \"output\": {\n                            \"AccessKey\": {\n                                \"UserName\": \"Bob\",\n                                \"Status\": \"Active\",\n                                \"CreateDate\": \"2015-03-09T18:39:23.411Z\",\n                                \"SecretAccessKey\": \"wJalrXUtnFEMI/K7MDENG/bPxRfiCYzEXAMPLEKEY\",\n                                \"AccessKeyId\": \"AKIAIOSFODNN7EXAMPLE\"\n                            }\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.iam#CreateAccessKeyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"UserName\": {\n                    \"target\": \"com.amazonaws.iam#existingUserNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the IAM user that the new key will belong to.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#CreateAccessKeyResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccessKey\": {\n                    \"target\": \"com.amazonaws.iam#AccessKey\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A structure with details about the access key.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the response to a successful <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateAccessKey.html\\\">CreateAccessKey</a> request.\\n    </p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#CreateAccountAlias\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#CreateAccountAliasRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#ConcurrentModificationException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#EntityAlreadyExistsException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates an alias for your Amazon Web Services account. For information about using an Amazon Web Services account\\n            alias, see <a href=\\\"https://docs.aws.amazon.com/signin/latest/userguide/CreateAccountAlias.html\\\">Creating, deleting, and\\n                listing an Amazon Web Services account alias</a> in the <i>Amazon Web Services Sign-In User\\n                Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To create an account alias\",\n                        \"documentation\": \"The following command associates the alias examplecorp to your AWS account.\",\n                        \"input\": {\n                            \"AccountAlias\": \"examplecorp\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.iam#CreateAccountAliasRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountAlias\": {\n                    \"target\": \"com.amazonaws.iam#accountAliasType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The account alias to create.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of \\n    lowercase letters, digits, and dashes. You cannot start or finish with a dash, nor can you have \\n    two dashes in a row.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#CreateGroup\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#CreateGroupRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#CreateGroupResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#EntityAlreadyExistsException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates a new group.</p>\\n         <p> For information about the number of groups you can create, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_iam-quotas.html\\\">IAM and STS\\n                quotas</a> in the <i>IAM User Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To create an IAM group\",\n                        \"documentation\": \"The following command creates an IAM group named Admins.\",\n                        \"input\": {\n                            \"GroupName\": \"Admins\"\n                        },\n                        \"output\": {\n                            \"Group\": {\n                                \"Path\": \"/\",\n                                \"CreateDate\": \"2015-03-09T20:30:24.940Z\",\n                                \"GroupId\": \"AIDGPMS9RO4H3FEXAMPLE\",\n                                \"Arn\": \"arn:aws:iam::123456789012:group/Admins\",\n                                \"GroupName\": \"Admins\"\n                            }\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.iam#CreateGroupRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Path\": {\n                    \"target\": \"com.amazonaws.iam#pathType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The path to the group. For more information about paths, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/Using_Identifiers.html\\\">IAM\\n                identifiers</a> in the <i>IAM User Guide</i>.</p>\\n         <p>This parameter is optional. If it is not included, it defaults to a slash (/).</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting \\n    of either a forward slash (/) by itself or a string that must begin and end with forward slashes.\\n    In addition, it can contain any ASCII character from the ! (<code>\\\\u0021</code>) through the DEL character (<code>\\\\u007F</code>), including \\n    most punctuation characters, digits, and upper and lowercased letters.</p>\"\n                    }\n                },\n                \"GroupName\": {\n                    \"target\": \"com.amazonaws.iam#groupNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the group to create. Do not include the path in this value.</p>\\n         <p>IAM user, group, role, and policy names must be unique within the account. Names are\\n            not distinguished by case. For example, you cannot create resources named both\\n            \\\"MyResource\\\" and \\\"myresource\\\".</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#CreateGroupResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Group\": {\n                    \"target\": \"com.amazonaws.iam#Group\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A structure containing details about the new group.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the response to a successful <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateGroup.html\\\">CreateGroup</a> request. </p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#CreateInstanceProfile\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#CreateInstanceProfileRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#CreateInstanceProfileResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#ConcurrentModificationException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#EntityAlreadyExistsException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#InvalidInputException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p> Creates a new instance profile. For information about instance profiles, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-ec2.html\\\">Using\\n                roles for applications on Amazon EC2</a> in the\\n            <i>IAM User Guide</i>, and <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html#ec2-instance-profile\\\">Instance profiles</a> in the <i>Amazon EC2 User Guide</i>.</p>\\n         <p> For information about the number of instance profiles you can create, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_iam-quotas.html\\\">IAM object\\n                quotas</a> in the <i>IAM User Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To create an instance profile\",\n                        \"documentation\": \"The following command creates an instance profile named Webserver that is ready to have a role attached and then be associated with an EC2 instance.\",\n                        \"input\": {\n                            \"InstanceProfileName\": \"Webserver\"\n                        },\n                        \"output\": {\n                            \"InstanceProfile\": {\n                                \"InstanceProfileId\": \"AIPAJMBYC7DLSPEXAMPLE\",\n                                \"Roles\": [],\n                                \"CreateDate\": \"2015-03-09T20:33:19.626Z\",\n                                \"InstanceProfileName\": \"Webserver\",\n                                \"Path\": \"/\",\n                                \"Arn\": \"arn:aws:iam::123456789012:instance-profile/Webserver\"\n                            }\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.iam#CreateInstanceProfileRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceProfileName\": {\n                    \"target\": \"com.amazonaws.iam#instanceProfileNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the instance profile to create.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Path\": {\n                    \"target\": \"com.amazonaws.iam#pathType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The path to the instance profile. For more information about paths, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/Using_Identifiers.html\\\">IAM\\n                Identifiers</a> in the <i>IAM User Guide</i>.</p>\\n         <p>This parameter is optional. If it is not included, it defaults to a slash (/).</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting \\n    of either a forward slash (/) by itself or a string that must begin and end with forward slashes.\\n    In addition, it can contain any ASCII character from the ! (<code>\\\\u0021</code>) through the DEL character (<code>\\\\u007F</code>), including \\n    most punctuation characters, digits, and upper and lowercased letters.</p>\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.iam#tagListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of tags that you want to attach to the newly created IAM instance profile.\\n      Each tag consists of a key name and an associated value. For more information about tagging, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_tags.html\\\">Tagging IAM resources</a> in the\\n      <i>IAM User Guide</i>.</p>\\n         <note>\\n            <p>If any one of the tags is invalid or if you exceed the allowed maximum number of tags, then the entire request \\n   fails and the resource is not created.</p>\\n         </note>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#CreateInstanceProfileResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceProfile\": {\n                    \"target\": \"com.amazonaws.iam#InstanceProfile\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A structure containing details about the new instance profile.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the response to a successful <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateInstanceProfile.html\\\">CreateInstanceProfile</a>\\n      request. </p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#CreateLoginProfile\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#CreateLoginProfileRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#CreateLoginProfileResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#EntityAlreadyExistsException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#PasswordPolicyViolationException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates a password for the specified IAM user. A password allows an IAM user to\\n            access Amazon Web Services services through the Amazon Web Services Management Console.</p>\\n         <p>You can use the CLI, the Amazon Web Services API, or the <b>Users</b>\\n            page in the IAM console to create a password for any IAM user. Use <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_ChangePassword.html\\\">ChangePassword</a> to update your own existing password in the <b>My Security Credentials</b> page in the Amazon Web Services Management Console.</p>\\n         <p>For more information about managing passwords, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/Using_ManagingLogins.html\\\">Managing passwords</a> in the\\n                <i>IAM User Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To create an instance profile\",\n                        \"documentation\": \"The following command changes IAM user Bob's password and sets the flag that required Bob to change the password the next time he signs in.\",\n                        \"input\": {\n                            \"UserName\": \"Bob\",\n                            \"Password\": \"h]6EszR}vJ*m\",\n                            \"PasswordResetRequired\": true\n                        },\n                        \"output\": {\n                            \"LoginProfile\": {\n                                \"UserName\": \"Bob\",\n                                \"CreateDate\": \"2015-03-10T20:55:40.274Z\",\n                                \"PasswordResetRequired\": true\n                            }\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.iam#CreateLoginProfileRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"UserName\": {\n                    \"target\": \"com.amazonaws.iam#userNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the IAM user to create a password for. The user must already\\n            exist.</p>\\n         <p>This parameter is optional. If no user name is included, it defaults to the principal\\n            making the request. When you make this request with root user credentials, you must use\\n            an <a href=\\\"https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoot.html\\\">AssumeRoot</a> session to omit the user name.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\"\n                    }\n                },\n                \"Password\": {\n                    \"target\": \"com.amazonaws.iam#passwordType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The new password for the user.</p>\\n         <p>This parameter must be omitted when you make the request with an <a href=\\\"https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoot.html\\\">AssumeRoot</a> session. It is required in all other cases.</p>\\n         <p>The <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a> \\n    that is used to validate this parameter is a string of characters. That string can include almost any printable \\n    ASCII character from the space (<code>\\\\u0020</code>) through the end of the ASCII character range (<code>\\\\u00FF</code>). \\n    You can also include the tab (<code>\\\\u0009</code>), line feed (<code>\\\\u000A</code>), and carriage return (<code>\\\\u000D</code>) \\n    characters. Any of these characters are valid in a password. However, many tools, such \\n    as the Amazon Web Services Management Console, might restrict the ability to type certain characters because they have \\n    special meaning within that tool.</p>\"\n                    }\n                },\n                \"PasswordResetRequired\": {\n                    \"target\": \"com.amazonaws.iam#booleanType\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Specifies whether the user is required to set a new password on next sign-in.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#CreateLoginProfileResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LoginProfile\": {\n                    \"target\": \"com.amazonaws.iam#LoginProfile\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A structure containing the user name and password create date.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the response to a successful <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateLoginProfile.html\\\">CreateLoginProfile</a>\\n      request. </p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#CreateOpenIDConnectProvider\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#CreateOpenIDConnectProviderRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#CreateOpenIDConnectProviderResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#ConcurrentModificationException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#EntityAlreadyExistsException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#InvalidInputException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#OpenIdIdpCommunicationErrorException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates an IAM entity to describe an identity provider (IdP) that supports <a href=\\\"http://openid.net/connect/\\\">OpenID Connect (OIDC)</a>.</p>\\n         <p>The OIDC provider that you create with this operation can be used as a principal in a\\n            role's trust policy. Such a policy establishes a trust relationship between Amazon Web Services and\\n            the OIDC provider.</p>\\n         <p>If you are using an OIDC identity provider from Google, Facebook, or Amazon Cognito, you don't\\n            need to create a separate IAM identity provider. These OIDC identity providers are\\n            already built-in to Amazon Web Services and are available for your use. Instead, you can move directly\\n            to creating new roles using your identity provider. To learn more, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-idp_oidc.html\\\">Creating\\n                a role for web identity or OpenID connect federation</a> in the <i>IAM\\n                User Guide</i>.</p>\\n         <p>When you create the IAM OIDC provider, you specify the following:</p>\\n         <ul>\\n            <li>\\n               <p>The URL of the OIDC identity provider (IdP) to trust</p>\\n            </li>\\n            <li>\\n               <p>A list of client IDs (also known as audiences) that identify the application\\n                    or applications allowed to authenticate using the OIDC provider</p>\\n            </li>\\n            <li>\\n               <p>A list of tags that are attached to the specified IAM OIDC provider</p>\\n            </li>\\n            <li>\\n               <p>A list of thumbprints of one or more server certificates that the IdP\\n                    uses</p>\\n            </li>\\n         </ul>\\n         <p>You get all of this information from the OIDC IdP you want to use to access\\n            Amazon Web Services.</p>\\n         <note>\\n            <p>Amazon Web Services secures communication with OIDC identity providers (IdPs) using our library of\\n            trusted root certificate authorities (CAs) to verify the JSON Web Key Set (JWKS)\\n            endpoint's TLS certificate. If your OIDC IdP relies on a certificate that is not signed\\n            by one of these trusted CAs, only then we secure communication using the thumbprints set\\n            in the IdP's configuration.</p>\\n         </note>\\n         <note>\\n            <p>The trust for the OIDC provider is derived from the IAM provider that this\\n                operation creates. Therefore, it is best to limit access to the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateOpenIDConnectProvider.html\\\">CreateOpenIDConnectProvider</a> operation to highly privileged\\n                users.</p>\\n         </note>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To create an instance profile\",\n                        \"documentation\": \"The following example defines a new OIDC provider in IAM with a client ID of my-application-id and pointing at the server with a URL of https://server.example.com.\",\n                        \"input\": {\n                            \"ClientIDList\": [\n                                \"my-application-id\"\n                            ],\n                            \"ThumbprintList\": [\n                                \"3768084dfb3d2b68b7897bf5f565da8efEXAMPLE\"\n                            ],\n                            \"Url\": \"https://server.example.com\"\n                        },\n                        \"output\": {\n                            \"OpenIDConnectProviderArn\": \"arn:aws:iam::123456789012:oidc-provider/server.example.com\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.iam#CreateOpenIDConnectProviderRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Url\": {\n                    \"target\": \"com.amazonaws.iam#OpenIDConnectProviderUrlType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The URL of the identity provider. The URL must begin with <code>https://</code> and\\n            should correspond to the <code>iss</code> claim in the provider's OpenID Connect ID\\n            tokens. Per the OIDC standard, path components are allowed but query parameters are not.\\n            Typically the URL consists of only a hostname, like\\n                <code>https://server.example.org</code> or <code>https://example.com</code>. The URL\\n            should not contain a port number. </p>\\n         <p>You cannot register the same provider multiple times in a single Amazon Web Services account. If you\\n            try to submit a URL that has already been used for an OpenID Connect provider in the\\n            Amazon Web Services account, you will get an error.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ClientIDList\": {\n                    \"target\": \"com.amazonaws.iam#clientIDListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Provides a list of client IDs, also known as audiences. When a mobile or web app\\n            registers with an OpenID Connect provider, they establish a value that identifies the\\n            application. This is the value that's sent as the <code>client_id</code> parameter on\\n            OAuth requests.</p>\\n         <p>You can register multiple client IDs with the same provider. For example, you might\\n            have multiple applications that use the same OIDC provider. You cannot register more\\n            than 100 client IDs with a single IAM OIDC provider.</p>\\n         <p>There is no defined format for a client ID. The\\n                <code>CreateOpenIDConnectProviderRequest</code> operation accepts client IDs up to\\n            255 characters long.</p>\"\n                    }\n                },\n                \"ThumbprintList\": {\n                    \"target\": \"com.amazonaws.iam#thumbprintListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of server certificate thumbprints for the OpenID Connect (OIDC) identity\\n            provider's server certificates. Typically this list includes only one entry. However,\\n            IAM lets you have up to five thumbprints for an OIDC provider. This lets you maintain\\n            multiple thumbprints if the identity provider is rotating certificates.</p>\\n         <p>This parameter is optional. If it is not included, IAM will retrieve and use the top\\n            intermediate certificate authority (CA) thumbprint of the OpenID Connect identity\\n            provider server certificate.</p>\\n         <p>The server certificate thumbprint is the hex-encoded SHA-1 hash value of the X.509\\n            certificate used by the domain where the OpenID Connect provider makes its keys\\n            available. It is always a 40-character string.</p>\\n         <p>For example, assume that the OIDC provider is <code>server.example.com</code> and the\\n            provider stores its keys at https://keys.server.example.com/openid-connect. In that\\n            case, the thumbprint string would be the hex-encoded SHA-1 hash value of the certificate\\n            used by <code>https://keys.server.example.com.</code>\\n         </p>\\n         <p>For more information about obtaining the OIDC provider thumbprint, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/identity-providers-oidc-obtain-thumbprint.html\\\">Obtaining the\\n                thumbprint for an OpenID Connect provider</a> in the <i>IAM user\\n                Guide</i>.</p>\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.iam#tagListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of tags that you want to attach to the new IAM OpenID Connect (OIDC) provider.\\n      Each tag consists of a key name and an associated value. For more information about tagging, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_tags.html\\\">Tagging IAM resources</a> in the\\n      <i>IAM User Guide</i>.</p>\\n         <note>\\n            <p>If any one of the tags is invalid or if you exceed the allowed maximum number of tags, then the entire request \\n   fails and the resource is not created.</p>\\n         </note>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#CreateOpenIDConnectProviderResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"OpenIDConnectProviderArn\": {\n                    \"target\": \"com.amazonaws.iam#arnType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the new IAM OpenID Connect provider that is\\n            created. For more information, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_OpenIDConnectProviderListEntry.html\\\">OpenIDConnectProviderListEntry</a>. </p>\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.iam#tagListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of tags that are attached to the new IAM OIDC provider. The returned list of\\n      tags is sorted by tag key. For more information about tagging, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_tags.html\\\">Tagging IAM resources</a> in the\\n      <i>IAM User Guide</i>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the response to a successful <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateOpenIDConnectProvider.html\\\">CreateOpenIDConnectProvider</a> request. </p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#CreatePolicy\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#CreatePolicyRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#CreatePolicyResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#ConcurrentModificationException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#EntityAlreadyExistsException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#InvalidInputException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#MalformedPolicyDocumentException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates a new managed policy for your Amazon Web Services account.</p>\\n         <p>This operation creates a policy version with a version identifier of <code>v1</code>\\n            and sets v1 as the policy's default version. For more information about policy versions,\\n            see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/policies-managed-versions.html\\\">Versioning for managed policies</a> in the\\n                <i>IAM User Guide</i>.</p>\\n         <p>As a best practice, you can validate your IAM policies. \\n     To learn more, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_policy-validator.html\\\">Validating IAM policies</a> \\n            in the <i>IAM User Guide</i>.</p>\\n         <p>For more information about managed policies in general, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/policies-managed-vs-inline.html\\\">Managed\\n                policies and inline policies</a> in the\\n            <i>IAM User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#CreatePolicyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PolicyName\": {\n                    \"target\": \"com.amazonaws.iam#policyNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The friendly name of the policy.</p>\\n         <p>IAM user, group, role, and policy names must be unique within the account. Names are\\n            not distinguished by case. For example, you cannot create resources named both\\n            \\\"MyResource\\\" and \\\"myresource\\\".</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Path\": {\n                    \"target\": \"com.amazonaws.iam#policyPathType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The path for the policy.</p>\\n         <p>For more information about paths, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/Using_Identifiers.html\\\">IAM identifiers</a> in the\\n                <i>IAM User Guide</i>.</p>\\n         <p>This parameter is optional. If it is not included, it defaults to a slash (/).</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting \\n    of either a forward slash (/) by itself or a string that must begin and end with forward slashes.\\n    In addition, it can contain any ASCII character from the ! (<code>\\\\u0021</code>) through the DEL character (<code>\\\\u007F</code>), including \\n    most punctuation characters, digits, and upper and lowercased letters.</p>\\n         <note>\\n            <p>You cannot use an asterisk (*) in the path name.</p>\\n         </note>\"\n                    }\n                },\n                \"PolicyDocument\": {\n                    \"target\": \"com.amazonaws.iam#policyDocumentType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The JSON policy document that you want to use as the content for the new\\n            policy.</p>\\n         <p>You must provide policies in JSON format in IAM. However, for CloudFormation\\n            templates formatted in YAML, you can provide the policy in JSON or YAML format. CloudFormation always converts a YAML policy to JSON format before submitting it to\\n            IAM.</p>\\n         <p>The maximum length of the policy document that you can pass in this operation,\\n            including whitespace, is listed below. To view the maximum character counts of a managed policy with no whitespaces, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_iam-quotas.html#reference_iam-quotas-entity-length\\\">IAM and STS character quotas</a>.</p>\\n         <p>To learn more about JSON policy grammar, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_grammar.html\\\">Grammar of the IAM JSON\\n                policy language</a> in the <i>IAM User Guide</i>. </p>\\n         <p>The <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a> \\n    used to validate this parameter is a string of characters consisting of the following:</p>\\n         <ul>\\n            <li>\\n               <p>Any printable ASCII \\n    character ranging from the space character (<code>\\\\u0020</code>) through the end of the ASCII character range</p>\\n            </li>\\n            <li>\\n               <p>The printable characters in the Basic Latin and  Latin-1 Supplement character set \\n    (through <code>\\\\u00FF</code>)</p>\\n            </li>\\n            <li>\\n               <p>The special characters tab (<code>\\\\u0009</code>), line feed (<code>\\\\u000A</code>), and \\n    carriage return (<code>\\\\u000D</code>)</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.iam#policyDescriptionType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A friendly description of the policy.</p>\\n         <p>Typically used to store information about the permissions defined in the policy. For\\n            example, \\\"Grants access to production DynamoDB tables.\\\"</p>\\n         <p>The policy description is immutable. After a value is assigned, it cannot be\\n            changed.</p>\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.iam#tagListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of tags that you want to attach to the new IAM customer managed policy.\\n      Each tag consists of a key name and an associated value. For more information about tagging, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_tags.html\\\">Tagging IAM resources</a> in the\\n      <i>IAM User Guide</i>.</p>\\n         <note>\\n            <p>If any one of the tags is invalid or if you exceed the allowed maximum number of tags, then the entire request \\n   fails and the resource is not created.</p>\\n         </note>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#CreatePolicyResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Policy\": {\n                    \"target\": \"com.amazonaws.iam#Policy\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A structure containing details about the new policy.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the response to a successful <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreatePolicy.html\\\">CreatePolicy</a> request. </p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#CreatePolicyVersion\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#CreatePolicyVersionRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#CreatePolicyVersionResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#InvalidInputException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#MalformedPolicyDocumentException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates a new version of the specified managed policy. To update a managed policy, you\\n            create a new policy version. A managed policy can have up to five versions. If the\\n            policy has five versions, you must delete an existing version using <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_DeletePolicyVersion.html\\\">DeletePolicyVersion</a> before you create a new version.</p>\\n         <p>Optionally, you can set the new version as the policy's default version. The default\\n            version is the version that is in effect for the IAM users, groups, and roles to which\\n            the policy is attached.</p>\\n         <p>For more information about managed policy versions, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/policies-managed-versions.html\\\">Versioning for managed\\n                policies</a> in the <i>IAM User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#CreatePolicyVersionRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PolicyArn\": {\n                    \"target\": \"com.amazonaws.iam#arnType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the IAM policy to which you want to add a new\\n            version.</p>\\n         <p>For more information about ARNs, see <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html\\\">Amazon Resource Names (ARNs)</a> in the <i>Amazon Web Services General Reference</i>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"PolicyDocument\": {\n                    \"target\": \"com.amazonaws.iam#policyDocumentType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The JSON policy document that you want to use as the content for this new version of\\n            the policy.</p>\\n         <p>You must provide policies in JSON format in IAM. However, for CloudFormation\\n            templates formatted in YAML, you can provide the policy in JSON or YAML format. CloudFormation always converts a YAML policy to JSON format before submitting it to\\n            IAM.</p>\\n         <p>The maximum length of the policy document that you can pass in this operation,\\n            including whitespace, is listed below. To view the maximum character counts of a managed policy with no whitespaces, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_iam-quotas.html#reference_iam-quotas-entity-length\\\">IAM and STS character quotas</a>.</p>\\n         <p>The <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a> \\n    used to validate this parameter is a string of characters consisting of the following:</p>\\n         <ul>\\n            <li>\\n               <p>Any printable ASCII \\n    character ranging from the space character (<code>\\\\u0020</code>) through the end of the ASCII character range</p>\\n            </li>\\n            <li>\\n               <p>The printable characters in the Basic Latin and  Latin-1 Supplement character set \\n    (through <code>\\\\u00FF</code>)</p>\\n            </li>\\n            <li>\\n               <p>The special characters tab (<code>\\\\u0009</code>), line feed (<code>\\\\u000A</code>), and \\n    carriage return (<code>\\\\u000D</code>)</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"SetAsDefault\": {\n                    \"target\": \"com.amazonaws.iam#booleanType\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Specifies whether to set this version as the policy's default version.</p>\\n         <p>When this parameter is <code>true</code>, the new policy version becomes the operative\\n            version. That is, it becomes the version that is in effect for the IAM users, groups,\\n            and roles that the policy is attached to.</p>\\n         <p>For more information about managed policy versions, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/policies-managed-versions.html\\\">Versioning for managed\\n                policies</a> in the <i>IAM User Guide</i>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#CreatePolicyVersionResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PolicyVersion\": {\n                    \"target\": \"com.amazonaws.iam#PolicyVersion\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A structure containing details about the new policy version.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the response to a successful <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreatePolicyVersion.html\\\">CreatePolicyVersion</a>\\n      request. </p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#CreateRole\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#CreateRoleRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#CreateRoleResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#ConcurrentModificationException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#EntityAlreadyExistsException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#InvalidInputException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#MalformedPolicyDocumentException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates a new role for your Amazon Web Services account.</p>\\n         <p> For more information about roles, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html\\\">IAM roles</a> in the\\n                <i>IAM User Guide</i>. For information about quotas for role names\\n            and the number of roles you can create, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_iam-quotas.html\\\">IAM and STS quotas</a> in the\\n                <i>IAM User Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To create an IAM role\",\n                        \"documentation\": \"The following command creates a role named Test-Role and attaches a trust policy that you must convert from JSON to a string. Upon success, the response includes the same policy as a URL-encoded JSON string.\",\n                        \"input\": {\n                            \"AssumeRolePolicyDocument\": \"<Stringified-JSON>\",\n                            \"Path\": \"/\",\n                            \"RoleName\": \"Test-Role\"\n                        },\n                        \"output\": {\n                            \"Role\": {\n                                \"Arn\": \"arn:aws:iam::123456789012:role/Test-Role\",\n                                \"AssumeRolePolicyDocument\": \"<URL-encoded-JSON>\",\n                                \"CreateDate\": \"2013-06-07T20:43:32.821Z\",\n                                \"Path\": \"/\",\n                                \"RoleId\": \"AKIAIOSFODNN7EXAMPLE\",\n                                \"RoleName\": \"Test-Role\"\n                            }\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.iam#CreateRoleRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Path\": {\n                    \"target\": \"com.amazonaws.iam#pathType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The path to the role. For more information about paths, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/Using_Identifiers.html\\\">IAM\\n                Identifiers</a> in the <i>IAM User Guide</i>.</p>\\n         <p>This parameter is optional. If it is not included, it defaults to a slash (/).</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting \\n    of either a forward slash (/) by itself or a string that must begin and end with forward slashes.\\n    In addition, it can contain any ASCII character from the ! (<code>\\\\u0021</code>) through the DEL character (<code>\\\\u007F</code>), including \\n    most punctuation characters, digits, and upper and lowercased letters.</p>\"\n                    }\n                },\n                \"RoleName\": {\n                    \"target\": \"com.amazonaws.iam#roleNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the role to create.</p>\\n         <p>IAM user, group, role, and policy names must be unique within the account. Names are\\n            not distinguished by case. For example, you cannot create resources named both\\n            \\\"MyResource\\\" and \\\"myresource\\\".</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"AssumeRolePolicyDocument\": {\n                    \"target\": \"com.amazonaws.iam#policyDocumentType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The trust relationship policy document that grants an entity permission to assume the\\n            role.</p>\\n         <p>In IAM, you must provide a JSON policy that has been converted to a string. However,\\n            for CloudFormation templates formatted in YAML, you can provide the policy in JSON or YAML\\n            format. CloudFormation always converts a YAML policy to JSON format before submitting it to\\n            IAM.</p>\\n         <p>The <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a> \\n    used to validate this parameter is a string of characters consisting of the following:</p>\\n         <ul>\\n            <li>\\n               <p>Any printable ASCII \\n    character ranging from the space character (<code>\\\\u0020</code>) through the end of the ASCII character range</p>\\n            </li>\\n            <li>\\n               <p>The printable characters in the Basic Latin and  Latin-1 Supplement character set \\n    (through <code>\\\\u00FF</code>)</p>\\n            </li>\\n            <li>\\n               <p>The special characters tab (<code>\\\\u0009</code>), line feed (<code>\\\\u000A</code>), and \\n    carriage return (<code>\\\\u000D</code>)</p>\\n            </li>\\n         </ul>\\n         <p> Upon success, the response includes the same trust policy in JSON format.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.iam#roleDescriptionType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A description of the role.</p>\"\n                    }\n                },\n                \"MaxSessionDuration\": {\n                    \"target\": \"com.amazonaws.iam#roleMaxSessionDurationType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum session duration (in seconds) that you want to set for the specified role.\\n            If you do not specify a value for this setting, the default value of one hour is\\n            applied. This setting can have a value from 1 hour to 12 hours.</p>\\n         <p>Anyone who assumes the role from the CLI or API can use the\\n                <code>DurationSeconds</code> API parameter or the <code>duration-seconds</code>\\n            CLI parameter to request a longer session. The <code>MaxSessionDuration</code> setting\\n            determines the maximum duration that can be requested using the\\n                <code>DurationSeconds</code> parameter. If users don't specify a value for the\\n                <code>DurationSeconds</code> parameter, their security credentials are valid for one\\n            hour by default. This applies when you use the <code>AssumeRole*</code> API operations\\n            or the <code>assume-role*</code> CLI operations but does not apply when you use those\\n            operations to create a console URL. For more information, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html\\\">Using IAM\\n                roles</a> in the <i>IAM User Guide</i>.</p>\"\n                    }\n                },\n                \"PermissionsBoundary\": {\n                    \"target\": \"com.amazonaws.iam#arnType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the managed policy that is used to set the permissions boundary for the\\n            role.</p>\\n         <p>A permissions boundary policy defines the maximum permissions that identity-based\\n            policies can grant to an entity, but does not grant permissions. Permissions boundaries\\n            do not define the maximum permissions that a resource-based policy can grant to an\\n            entity. To learn more, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_boundaries.html\\\">Permissions boundaries\\n                for IAM entities</a> in the <i>IAM User Guide</i>.</p>\\n         <p>For more information about policy types, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#access_policy-types\\\">Policy types\\n            </a> in the <i>IAM User Guide</i>.</p>\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.iam#tagListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of tags that you want to attach to the new role. Each tag consists of a key name and an associated value.\\n      For more information about tagging, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_tags.html\\\">Tagging IAM resources</a> in the\\n      <i>IAM User Guide</i>.</p>\\n         <note>\\n            <p>If any one of the tags is invalid or if you exceed the allowed maximum number of tags, then the entire request \\n   fails and the resource is not created.</p>\\n         </note>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#CreateRoleResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Role\": {\n                    \"target\": \"com.amazonaws.iam#Role\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A structure containing details about the new role.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the response to a successful <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateRole.html\\\">CreateRole</a> request. </p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#CreateSAMLProvider\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#CreateSAMLProviderRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#CreateSAMLProviderResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#ConcurrentModificationException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#EntityAlreadyExistsException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#InvalidInputException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates an IAM resource that describes an identity provider (IdP) that supports SAML\\n            2.0.</p>\\n         <p>The SAML provider resource that you create with this operation can be used as a\\n            principal in an IAM role's trust policy. Such a policy can enable federated users who\\n            sign in using the SAML IdP to assume the role. You can create an IAM role that\\n            supports Web-based single sign-on (SSO) to the Amazon Web Services Management Console or one that supports API access\\n            to Amazon Web Services.</p>\\n         <p>When you create the SAML provider resource, you upload a SAML metadata document that\\n            you get from your IdP. That document includes the issuer's name, expiration information,\\n            and keys that can be used to validate the SAML authentication response (assertions) that\\n            the IdP sends. You must generate the metadata document using the identity management\\n            software that is used as your organization's IdP.</p>\\n         <note>\\n            <p> This operation requires <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html\\\">Signature Version 4</a>.</p>\\n         </note>\\n         <p> For more information, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_enable-console-saml.html\\\">Enabling SAML 2.0\\n                federated users to access the Amazon Web Services Management Console</a> and <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_saml.html\\\">About SAML 2.0-based\\n                federation</a> in the <i>IAM User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#CreateSAMLProviderRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SAMLMetadataDocument\": {\n                    \"target\": \"com.amazonaws.iam#SAMLMetadataDocumentType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An XML document generated by an identity provider (IdP) that supports SAML 2.0. The\\n            document includes the issuer's name, expiration information, and keys that can be used\\n            to validate the SAML authentication response (assertions) that are received from the\\n            IdP. You must generate the metadata document using the identity management software that\\n            is used as your organization's IdP.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_saml.html\\\">About SAML 2.0-based\\n                federation</a> in the <i>IAM User Guide</i>\\n         </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Name\": {\n                    \"target\": \"com.amazonaws.iam#SAMLProviderNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the provider to create.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.iam#tagListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of tags that you want to attach to the new IAM SAML provider.\\n      Each tag consists of a key name and an associated value. For more information about tagging, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_tags.html\\\">Tagging IAM resources</a> in the\\n      <i>IAM User Guide</i>.</p>\\n         <note>\\n            <p>If any one of the tags is invalid or if you exceed the allowed maximum number of tags, then the entire request \\n   fails and the resource is not created.</p>\\n         </note>\"\n                    }\n                },\n                \"AssertionEncryptionMode\": {\n                    \"target\": \"com.amazonaws.iam#assertionEncryptionModeType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the encryption setting for the SAML provider.</p>\"\n                    }\n                },\n                \"AddPrivateKey\": {\n                    \"target\": \"com.amazonaws.iam#privateKeyType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The private key generated from your external identity provider. The private key must\\n            be a .pem file that uses AES-GCM or AES-CBC encryption algorithm to decrypt SAML\\n            assertions.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#CreateSAMLProviderResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SAMLProviderArn\": {\n                    \"target\": \"com.amazonaws.iam#arnType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the new SAML provider resource in IAM.</p>\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.iam#tagListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of tags that are attached to the new IAM SAML provider. The returned list of tags is sorted by tag key.\\n      For more information about tagging, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_tags.html\\\">Tagging IAM resources</a> in the\\n      <i>IAM User Guide</i>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the response to a successful <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateSAMLProvider.html\\\">CreateSAMLProvider</a>\\n      request. </p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#CreateServiceLinkedRole\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#CreateServiceLinkedRoleRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#CreateServiceLinkedRoleResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#InvalidInputException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates an IAM role that is linked to a specific Amazon Web Services service. The service controls\\n            the attached policies and when the role can be deleted. This helps ensure that the\\n            service is not broken by an unexpectedly changed or deleted role, which could put your\\n            Amazon Web Services resources into an unknown state. Allowing the service to control the role helps\\n            improve service stability and proper cleanup when a service and its role are no longer\\n            needed. For more information, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/using-service-linked-roles.html\\\">Using service-linked\\n                roles</a> in the <i>IAM User Guide</i>. </p>\\n         <p>To attach a policy to this service-linked role, you must make the request using the\\n            Amazon Web Services service that depends on this role.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#CreateServiceLinkedRoleRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AWSServiceName\": {\n                    \"target\": \"com.amazonaws.iam#groupNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The service principal for the Amazon Web Services service to which this role is attached. You use a\\n            string similar to a URL but without the http:// in front. For example:\\n                <code>elasticbeanstalk.amazonaws.com</code>. </p>\\n         <p>Service principals are unique and case-sensitive. To find the exact service principal\\n            for your service-linked role, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_aws-services-that-work-with-iam.html\\\">Amazon Web Services services\\n                that work with IAM</a> in the <i>IAM User Guide</i>. Look for\\n            the services that have <b>Yes </b>in the <b>Service-Linked Role</b> column. Choose the <b>Yes</b> link to view the service-linked role documentation for that\\n            service.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.iam#roleDescriptionType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The description of the role.</p>\"\n                    }\n                },\n                \"CustomSuffix\": {\n                    \"target\": \"com.amazonaws.iam#customSuffixType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\\n         <p>A string that you provide, which is combined with the service-provided prefix to form\\n            the complete role name. If you make multiple requests for the same service, then you\\n            must supply a different <code>CustomSuffix</code> for each request. Otherwise the\\n            request fails with a duplicate role name error. For example, you could add\\n                <code>-1</code> or <code>-debug</code> to the suffix.</p>\\n         <p>Some services do not support the <code>CustomSuffix</code> parameter. If you provide\\n            an optional suffix and the operation fails, try the operation again without the\\n            suffix.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#CreateServiceLinkedRoleResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Role\": {\n                    \"target\": \"com.amazonaws.iam#Role\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_Role.html\\\">Role</a>\\n            object that contains details about the newly created role.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#CreateServiceSpecificCredential\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#CreateServiceSpecificCredentialRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#CreateServiceSpecificCredentialResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceNotSupportedException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Generates a set of credentials consisting of a user name and password that can be used\\n            to access the service specified in the request. These credentials are generated by\\n            IAM, and can be used only for the specified service. </p>\\n         <p>You can have a maximum of two sets of service-specific credentials for each supported\\n            service per user.</p>\\n         <p>You can create service-specific credentials for Amazon Bedrock, CodeCommit and Amazon Keyspaces (for Apache Cassandra).</p>\\n         <p>You can reset the password to a new service-generated value by calling <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_ResetServiceSpecificCredential.html\\\">ResetServiceSpecificCredential</a>.</p>\\n         <p>For more information about service-specific credentials, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_bedrock.html\\\">Service-specific credentials for IAM users</a> in the\\n                <i>IAM User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#CreateServiceSpecificCredentialRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"UserName\": {\n                    \"target\": \"com.amazonaws.iam#userNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the IAM user that is to be associated with the credentials. The new\\n            service-specific credentials have the same permissions as the associated user except\\n            that they can be used only to access the specified service.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ServiceName\": {\n                    \"target\": \"com.amazonaws.iam#serviceName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the Amazon Web Services service that is to be associated with the credentials. The\\n            service you specify here is the only service that can be accessed using these\\n            credentials.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"CredentialAgeDays\": {\n                    \"target\": \"com.amazonaws.iam#credentialAgeDays\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of days until the service specific credential expires. This field is only\\n            valid for Bedrock API keys and must be a positive integer. When not specified, the\\n            credential will not expire.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#CreateServiceSpecificCredentialResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ServiceSpecificCredential\": {\n                    \"target\": \"com.amazonaws.iam#ServiceSpecificCredential\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A structure that contains information about the newly created service-specific\\n            credential.</p>\\n         <important>\\n            <p>This is the only time that the password for this credential set is available. It\\n                cannot be recovered later. Instead, you must reset the password with <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_ResetServiceSpecificCredential.html\\\">ResetServiceSpecificCredential</a>.</p>\\n         </important>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#CreateUser\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#CreateUserRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#CreateUserResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#ConcurrentModificationException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#EntityAlreadyExistsException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#InvalidInputException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates a new IAM user for your Amazon Web Services account.</p>\\n         <p> For information about quotas for the number of IAM users you can create, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_iam-quotas.html\\\">IAM and STS\\n                quotas</a> in the <i>IAM User Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To create an IAM user\",\n                        \"documentation\": \"The following create-user command creates an IAM user named Bob in the current account.\",\n                        \"input\": {\n                            \"UserName\": \"Bob\"\n                        },\n                        \"output\": {\n                            \"User\": {\n                                \"UserName\": \"Bob\",\n                                \"Path\": \"/\",\n                                \"CreateDate\": \"2013-06-08T03:20:41.270Z\",\n                                \"UserId\": \"AKIAIOSFODNN7EXAMPLE\",\n                                \"Arn\": \"arn:aws:iam::123456789012:user/Bob\"\n                            }\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.iam#CreateUserRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Path\": {\n                    \"target\": \"com.amazonaws.iam#pathType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The path for the user name. For more information about paths, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/Using_Identifiers.html\\\">IAM\\n                identifiers</a> in the <i>IAM User Guide</i>.</p>\\n         <p>This parameter is optional. If it is not included, it defaults to a slash (/).</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting \\n    of either a forward slash (/) by itself or a string that must begin and end with forward slashes.\\n    In addition, it can contain any ASCII character from the ! (<code>\\\\u0021</code>) through the DEL character (<code>\\\\u007F</code>), including \\n    most punctuation characters, digits, and upper and lowercased letters.</p>\"\n                    }\n                },\n                \"UserName\": {\n                    \"target\": \"com.amazonaws.iam#userNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the user to create.</p>\\n         <p>IAM user, group, role, and policy names must be unique within the account. Names are\\n            not distinguished by case. For example, you cannot create resources named both\\n            \\\"MyResource\\\" and \\\"myresource\\\".</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"PermissionsBoundary\": {\n                    \"target\": \"com.amazonaws.iam#arnType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the managed policy that is used to set the permissions boundary for the\\n            user.</p>\\n         <p>A permissions boundary policy defines the maximum permissions that identity-based\\n            policies can grant to an entity, but does not grant permissions. Permissions boundaries\\n            do not define the maximum permissions that a resource-based policy can grant to an\\n            entity. To learn more, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_boundaries.html\\\">Permissions boundaries\\n                for IAM entities</a> in the <i>IAM User Guide</i>.</p>\\n         <p>For more information about policy types, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#access_policy-types\\\">Policy types\\n            </a> in the <i>IAM User Guide</i>.</p>\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.iam#tagListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of tags that you want to attach to the new user. Each tag consists of a key name and an associated value.\\n      For more information about tagging, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_tags.html\\\">Tagging IAM resources</a> in the\\n      <i>IAM User Guide</i>.</p>\\n         <note>\\n            <p>If any one of the tags is invalid or if you exceed the allowed maximum number of tags, then the entire request \\n   fails and the resource is not created.</p>\\n         </note>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#CreateUserResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"User\": {\n                    \"target\": \"com.amazonaws.iam#User\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A structure with details about the new IAM user.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the response to a successful <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateUser.html\\\">CreateUser</a> request. </p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#CreateVirtualMFADevice\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#CreateVirtualMFADeviceRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#CreateVirtualMFADeviceResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#ConcurrentModificationException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#EntityAlreadyExistsException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#InvalidInputException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates a new virtual MFA device for the Amazon Web Services account. After creating the virtual\\n            MFA, use <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_EnableMFADevice.html\\\">EnableMFADevice</a> to\\n            attach the MFA device to an IAM user. For more information about creating and working\\n            with virtual MFA devices, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/Using_VirtualMFA.html\\\">Using a virtual MFA device</a> in the\\n                <i>IAM User Guide</i>.</p>\\n         <p>For information about the maximum number of MFA devices you can create, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_iam-quotas.html\\\">IAM and STS\\n                quotas</a> in the <i>IAM User Guide</i>.</p>\\n         <important>\\n            <p>The seed information contained in the QR code and the Base32 string should be\\n                treated like any other secret access information. In other words, protect the seed\\n                information as you would your Amazon Web Services access keys or your passwords. After you\\n                provision your virtual device, you should ensure that the information is destroyed\\n                following secure procedures.</p>\\n         </important>\"\n            }\n        },\n        \"com.amazonaws.iam#CreateVirtualMFADeviceRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Path\": {\n                    \"target\": \"com.amazonaws.iam#pathType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The path for the virtual MFA device. For more information about paths, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/Using_Identifiers.html\\\">IAM\\n                identifiers</a> in the <i>IAM User Guide</i>.</p>\\n         <p>This parameter is optional. If it is not included, it defaults to a slash (/).</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting \\n    of either a forward slash (/) by itself or a string that must begin and end with forward slashes.\\n    In addition, it can contain any ASCII character from the ! (<code>\\\\u0021</code>) through the DEL character (<code>\\\\u007F</code>), including \\n    most punctuation characters, digits, and upper and lowercased letters.</p>\"\n                    }\n                },\n                \"VirtualMFADeviceName\": {\n                    \"target\": \"com.amazonaws.iam#virtualMFADeviceName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the virtual MFA device, which must be unique. Use with path to uniquely\\n            identify a virtual MFA device.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.iam#tagListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of tags that you want to attach to the new IAM virtual MFA device.\\n      Each tag consists of a key name and an associated value. For more information about tagging, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_tags.html\\\">Tagging IAM resources</a> in the\\n      <i>IAM User Guide</i>.</p>\\n         <note>\\n            <p>If any one of the tags is invalid or if you exceed the allowed maximum number of tags, then the entire request \\n   fails and the resource is not created.</p>\\n         </note>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#CreateVirtualMFADeviceResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VirtualMFADevice\": {\n                    \"target\": \"com.amazonaws.iam#VirtualMFADevice\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A structure containing details about the new virtual MFA device.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the response to a successful <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateVirtualMFADevice.html\\\">CreateVirtualMFADevice</a>\\n      request. </p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#CredentialReportExpiredException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.iam#credentialReportExpiredExceptionMessage\"\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"ReportExpired\",\n                    \"httpResponseCode\": 410\n                },\n                \"smithy.api#documentation\": \"<p>The request was rejected because the most recent credential report has expired. To\\n      generate a new credential report, use <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GenerateCredentialReport.html\\\">GenerateCredentialReport</a>. For more information about credential report expiration,\\n      see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/credential-reports.html\\\">Getting\\n        credential reports</a> in the <i>IAM User Guide</i>.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 410\n            }\n        },\n        \"com.amazonaws.iam#CredentialReportNotPresentException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.iam#credentialReportNotPresentExceptionMessage\"\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"ReportNotPresent\",\n                    \"httpResponseCode\": 410\n                },\n                \"smithy.api#documentation\": \"<p>The request was rejected because the credential report does not exist. To generate a\\n      credential report, use <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GenerateCredentialReport.html\\\">GenerateCredentialReport</a>.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 410\n            }\n        },\n        \"com.amazonaws.iam#CredentialReportNotReadyException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.iam#credentialReportNotReadyExceptionMessage\"\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"ReportInProgress\",\n                    \"httpResponseCode\": 404\n                },\n                \"smithy.api#documentation\": \"<p>The request was rejected because the credential report is still being generated.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 404\n            }\n        },\n        \"com.amazonaws.iam#DeactivateMFADevice\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#DeactivateMFADeviceRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#ConcurrentModificationException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#EntityTemporarilyUnmodifiableException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deactivates the specified MFA device and removes it from association with the user\\n            name for which it was originally enabled.</p>\\n         <p>For more information about creating and working with virtual MFA devices, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/Using_VirtualMFA.html\\\">Enabling a virtual\\n                multi-factor authentication (MFA) device</a> in the\\n                <i>IAM User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#DeactivateMFADeviceRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"UserName\": {\n                    \"target\": \"com.amazonaws.iam#existingUserNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the user whose MFA device you want to deactivate.</p>\\n         <p>This parameter is optional. If no user name is included, it defaults to the principal\\n            making the request. When you make this request with root user credentials, you must use\\n            an <a href=\\\"https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoot.html\\\">AssumeRoot</a> session to omit the user name.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\"\n                    }\n                },\n                \"SerialNumber\": {\n                    \"target\": \"com.amazonaws.iam#serialNumberType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The serial number that uniquely identifies the MFA device. For virtual MFA devices,\\n            the serial number is the device ARN.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting \\n    of upper and lowercase alphanumeric characters with no spaces. You can also include any of the \\n    following characters: =,.@:/-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#DeleteAccessKey\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#DeleteAccessKeyRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the access key pair associated with the specified IAM user.</p>\\n         <p>If you do not specify a user name, IAM determines the user name implicitly based on\\n            the Amazon Web Services access key ID signing the request. This operation works for access keys under\\n            the Amazon Web Services account. Consequently, you can use this operation to manage Amazon Web Services account root\\n            user credentials even if the Amazon Web Services account has no associated users.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To delete an access key for an IAM user\",\n                        \"documentation\": \"The following command deletes one access key (access key ID and secret access key) assigned to the IAM user named Bob.\",\n                        \"input\": {\n                            \"UserName\": \"Bob\",\n                            \"AccessKeyId\": \"AKIDPMS9RO4H3FEXAMPLE\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.iam#DeleteAccessKeyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"UserName\": {\n                    \"target\": \"com.amazonaws.iam#existingUserNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the user whose access key pair you want to delete.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\"\n                    }\n                },\n                \"AccessKeyId\": {\n                    \"target\": \"com.amazonaws.iam#accessKeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The access key ID for the access key ID and secret access key you want to\\n            delete.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters that can \\n    consist of any upper or lowercased letter or digit.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#DeleteAccountAlias\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#DeleteAccountAliasRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#ConcurrentModificationException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p> Deletes the specified Amazon Web Services account alias. For information about using an Amazon Web Services\\n            account alias, see <a href=\\\"https://docs.aws.amazon.com/signin/latest/userguide/CreateAccountAlias.html\\\">Creating, deleting, and\\n                listing an Amazon Web Services account alias</a> in the <i>Amazon Web Services Sign-In User\\n                Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To delete an account alias\",\n                        \"documentation\": \"The following command removes the alias mycompany from the current AWS account:\",\n                        \"input\": {\n                            \"AccountAlias\": \"mycompany\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.iam#DeleteAccountAliasRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountAlias\": {\n                    \"target\": \"com.amazonaws.iam#accountAliasType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the account alias to delete.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of \\n    lowercase letters, digits, and dashes. You cannot start or finish with a dash, nor can you have \\n    two dashes in a row.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#DeleteAccountPasswordPolicy\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the password policy for the Amazon Web Services account. There are no parameters.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To delete the current account password policy\",\n                        \"documentation\": \"The following command removes the password policy from the current AWS account:\"\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.iam#DeleteConflictException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.iam#deleteConflictMessage\"\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"DeleteConflict\",\n                    \"httpResponseCode\": 409\n                },\n                \"smithy.api#documentation\": \"<p>The request was rejected because it attempted to delete a resource that has attached\\n      subordinate entities. The error message describes these entities.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 409\n            }\n        },\n        \"com.amazonaws.iam#DeleteGroup\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#DeleteGroupRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#DeleteConflictException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the specified IAM group. The group must not contain any users or have any\\n            attached policies.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#DeleteGroupPolicy\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#DeleteGroupPolicyRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the specified inline policy that is embedded in the specified IAM\\n            group.</p>\\n         <p>A group can also have managed policies attached to it. To detach a managed policy from\\n            a group, use <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_DetachGroupPolicy.html\\\">DetachGroupPolicy</a>.\\n            For more information about policies, refer to <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/policies-managed-vs-inline.html\\\">Managed policies and inline\\n                policies</a> in the <i>IAM User Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To delete a policy from an IAM group\",\n                        \"documentation\": \"The following command deletes the policy named ExamplePolicy from the group named Admins:\",\n                        \"input\": {\n                            \"GroupName\": \"Admins\",\n                            \"PolicyName\": \"ExamplePolicy\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.iam#DeleteGroupPolicyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"GroupName\": {\n                    \"target\": \"com.amazonaws.iam#groupNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name (friendly name, not ARN) identifying the group that the policy is embedded\\n            in.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"PolicyName\": {\n                    \"target\": \"com.amazonaws.iam#policyNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name identifying the policy document to delete.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#DeleteGroupRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"GroupName\": {\n                    \"target\": \"com.amazonaws.iam#groupNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the IAM group to delete.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#DeleteInstanceProfile\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#DeleteInstanceProfileRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#DeleteConflictException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the specified instance profile. The instance profile must not have an\\n            associated role.</p>\\n         <important>\\n            <p>Make sure that you do not have any Amazon EC2 instances running with the instance\\n                profile you are about to delete. Deleting a role or instance profile that is\\n                associated with a running instance will break any applications running on the\\n                instance.</p>\\n         </important>\\n         <p>For more information about instance profiles, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-ec2_instance-profiles.html\\\">Using\\n                instance profiles</a> in the <i>IAM User Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To delete an instance profile\",\n                        \"documentation\": \"The following command deletes the instance profile named ExampleInstanceProfile\",\n                        \"input\": {\n                            \"InstanceProfileName\": \"ExampleInstanceProfile\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.iam#DeleteInstanceProfileRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceProfileName\": {\n                    \"target\": \"com.amazonaws.iam#instanceProfileNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the instance profile to delete.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#DeleteLoginProfile\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#DeleteLoginProfileRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#EntityTemporarilyUnmodifiableException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the password for the specified IAM user or root user, For more information, see\\n                <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_passwords_admin-change-user.html\\\">Managing\\n                passwords for IAM users</a>.</p>\\n         <p>You can use the CLI, the Amazon Web Services API, or the <b>Users</b>\\n            page in the IAM console to delete a password for any IAM user. You can use <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_ChangePassword.html\\\">ChangePassword</a> to update, but not delete, your own password in the\\n                <b>My Security Credentials</b> page in the\\n            Amazon Web Services Management Console.</p>\\n         <important>\\n            <p>Deleting a user's password does not prevent a user from accessing Amazon Web Services through\\n                the command line interface or the API. To prevent all user access, you must also\\n                either make any access keys inactive or delete them. For more information about\\n                making keys inactive or deleting them, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_UpdateAccessKey.html\\\">UpdateAccessKey</a>\\n                and <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_DeleteAccessKey.html\\\">DeleteAccessKey</a>.</p>\\n         </important>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To delete a password for an IAM user\",\n                        \"documentation\": \"The following command deletes the password for the IAM user named Bob.\",\n                        \"input\": {\n                            \"UserName\": \"Bob\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.iam#DeleteLoginProfileRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"UserName\": {\n                    \"target\": \"com.amazonaws.iam#userNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the user whose password you want to delete.</p>\\n         <p>This parameter is optional. If no user name is included, it defaults to the principal\\n            making the request. When you make this request with root user credentials, you must use\\n            an <a href=\\\"https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoot.html\\\">AssumeRoot</a> session to omit the user name.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#DeleteOpenIDConnectProvider\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#DeleteOpenIDConnectProviderRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#InvalidInputException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes an OpenID Connect identity provider (IdP) resource object in IAM.</p>\\n         <p>Deleting an IAM OIDC provider resource does not update any roles that reference the\\n            provider as a principal in their trust policies. Any attempt to assume a role that\\n            references a deleted provider fails.</p>\\n         <p>This operation is idempotent; it does not fail or return an error if you call the\\n            operation for a provider that does not exist.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#DeleteOpenIDConnectProviderRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"OpenIDConnectProviderArn\": {\n                    \"target\": \"com.amazonaws.iam#arnType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the IAM OpenID Connect provider resource object to\\n            delete. You can get a list of OpenID Connect provider resource ARNs by using the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListOpenIDConnectProviders.html\\\">ListOpenIDConnectProviders</a> operation.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#DeletePolicy\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#DeletePolicyRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#DeleteConflictException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#InvalidInputException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the specified managed policy.</p>\\n         <p>Before you can delete a managed policy, you must first detach the policy from all\\n            users, groups, and roles that it is attached to. In addition, you must delete all the\\n            policy's versions. The following steps describe the process for deleting a managed\\n            policy:</p>\\n         <ul>\\n            <li>\\n               <p>Detach the policy from all users, groups, and roles that the policy is\\n                    attached to, using <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_DetachUserPolicy.html\\\">DetachUserPolicy</a>, <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_DetachGroupPolicy.html\\\">DetachGroupPolicy</a>, or <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_DetachRolePolicy.html\\\">DetachRolePolicy</a>. To list all the users, groups, and roles that a\\n                    policy is attached to, use <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListEntitiesForPolicy.html\\\">ListEntitiesForPolicy</a>.</p>\\n            </li>\\n            <li>\\n               <p>Delete all versions of the policy using <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_DeletePolicyVersion.html\\\">DeletePolicyVersion</a>. To list the policy's versions, use <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListPolicyVersions.html\\\">ListPolicyVersions</a>. You cannot use <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_DeletePolicyVersion.html\\\">DeletePolicyVersion</a> to delete the version that is marked as the\\n                    default version. You delete the policy's default version in the next step of the\\n                    process.</p>\\n            </li>\\n            <li>\\n               <p>Delete the policy (this automatically deletes the policy's default version)\\n                    using this operation.</p>\\n            </li>\\n         </ul>\\n         <p>For information about managed policies, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/policies-managed-vs-inline.html\\\">Managed policies and inline\\n                policies</a> in the <i>IAM User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#DeletePolicyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PolicyArn\": {\n                    \"target\": \"com.amazonaws.iam#arnType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the IAM policy you want to delete.</p>\\n         <p>For more information about ARNs, see <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html\\\">Amazon Resource Names (ARNs)</a> in the <i>Amazon Web Services General Reference</i>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#DeletePolicyVersion\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#DeletePolicyVersionRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#DeleteConflictException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#InvalidInputException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the specified version from the specified managed policy.</p>\\n         <p>You cannot delete the default version from a policy using this operation. To delete\\n            the default version from a policy, use <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_DeletePolicy.html\\\">DeletePolicy</a>. To find\\n            out which version of a policy is marked as the default version, use <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListPolicyVersions.html\\\">ListPolicyVersions</a>.</p>\\n         <p>For information about versions for managed policies, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/policies-managed-versions.html\\\">Versioning for managed\\n                policies</a> in the <i>IAM User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#DeletePolicyVersionRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PolicyArn\": {\n                    \"target\": \"com.amazonaws.iam#arnType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the IAM policy from which you want to delete a\\n            version.</p>\\n         <p>For more information about ARNs, see <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html\\\">Amazon Resource Names (ARNs)</a> in the <i>Amazon Web Services General Reference</i>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"VersionId\": {\n                    \"target\": \"com.amazonaws.iam#policyVersionIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The policy version to delete.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters that \\n    consists of the lowercase letter 'v' followed by one or two digits, and optionally \\n    followed by a period '.' and a string of letters and digits.</p>\\n         <p>For more information about managed policy versions, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/policies-managed-versions.html\\\">Versioning for managed\\n                policies</a> in the <i>IAM User Guide</i>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#DeleteRole\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#DeleteRoleRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#ConcurrentModificationException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#DeleteConflictException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#UnmodifiableEntityException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the specified role. Unlike the Amazon Web Services Management Console, when you delete a role\\n            programmatically, you must delete the items attached to the role manually, or the\\n            deletion fails. For more information, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_manage_delete.html#roles-managingrole-deleting-cli\\\">Deleting an IAM role</a>. Before attempting to delete a role, remove the\\n            following attached items: </p>\\n         <ul>\\n            <li>\\n               <p>Inline policies (<a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_DeleteRolePolicy.html\\\">DeleteRolePolicy</a>)</p>\\n            </li>\\n            <li>\\n               <p>Attached managed policies (<a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_DetachRolePolicy.html\\\">DetachRolePolicy</a>)</p>\\n            </li>\\n            <li>\\n               <p>Instance profile (<a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_RemoveRoleFromInstanceProfile.html\\\">RemoveRoleFromInstanceProfile</a>)</p>\\n            </li>\\n            <li>\\n               <p>Optional – Delete instance profile after detaching from role for\\n                    resource clean up (<a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_DeleteInstanceProfile.html\\\">DeleteInstanceProfile</a>)</p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>Make sure that you do not have any Amazon EC2 instances running with the role you are\\n                about to delete. Deleting a role or instance profile that is associated with a\\n                running instance will break any applications running on the instance.</p>\\n         </important>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To delete an IAM role\",\n                        \"documentation\": \"The following command removes the role named Test-Role.\",\n                        \"input\": {\n                            \"RoleName\": \"Test-Role\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.iam#DeleteRolePermissionsBoundary\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#DeleteRolePermissionsBoundaryRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#UnmodifiableEntityException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the permissions boundary for the specified IAM role. </p>\\n         <p>You cannot set the boundary for a service-linked role.</p>\\n         <important>\\n            <p>Deleting the permissions boundary for a role might increase its permissions. For\\n                example, it might allow anyone who assumes the role to perform all the actions\\n                granted in its permissions policies.</p>\\n         </important>\"\n            }\n        },\n        \"com.amazonaws.iam#DeleteRolePermissionsBoundaryRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RoleName\": {\n                    \"target\": \"com.amazonaws.iam#roleNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name (friendly name, not ARN) of the IAM role from which you want to remove the\\n            permissions boundary.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#DeleteRolePolicy\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#DeleteRolePolicyRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#UnmodifiableEntityException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the specified inline policy that is embedded in the specified IAM\\n            role.</p>\\n         <p>A role can also have managed policies attached to it. To detach a managed policy from\\n            a role, use <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_DetachRolePolicy.html\\\">DetachRolePolicy</a>.\\n            For more information about policies, refer to <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/policies-managed-vs-inline.html\\\">Managed policies and inline\\n                policies</a> in the <i>IAM User Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To remove a policy from an IAM role\",\n                        \"documentation\": \"The following command removes the policy named ExamplePolicy from the role named Test-Role.\",\n                        \"input\": {\n                            \"RoleName\": \"Test-Role\",\n                            \"PolicyName\": \"ExamplePolicy\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.iam#DeleteRolePolicyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RoleName\": {\n                    \"target\": \"com.amazonaws.iam#roleNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name (friendly name, not ARN) identifying the role that the policy is embedded\\n            in.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"PolicyName\": {\n                    \"target\": \"com.amazonaws.iam#policyNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the inline policy to delete from the specified IAM role.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#DeleteRoleRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RoleName\": {\n                    \"target\": \"com.amazonaws.iam#roleNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the role to delete.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#DeleteSAMLProvider\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#DeleteSAMLProviderRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#InvalidInputException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes a SAML provider resource in IAM.</p>\\n         <p>Deleting the provider resource from IAM does not update any roles that reference the\\n            SAML provider resource's ARN as a principal in their trust policies. Any attempt to\\n            assume a role that references a non-existent provider resource ARN fails.</p>\\n         <note>\\n            <p> This operation requires <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html\\\">Signature Version 4</a>.</p>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.iam#DeleteSAMLProviderRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SAMLProviderArn\": {\n                    \"target\": \"com.amazonaws.iam#arnType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the SAML provider to delete.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#DeleteSSHPublicKey\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#DeleteSSHPublicKeyRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the specified SSH public key.</p>\\n         <p>The SSH public key deleted by this operation is used only for authenticating the\\n            associated IAM user to an CodeCommit repository. For more information about using SSH keys\\n            to authenticate to an CodeCommit repository, see <a href=\\\"https://docs.aws.amazon.com/codecommit/latest/userguide/setting-up-credentials-ssh.html\\\">Set up CodeCommit for\\n                SSH connections</a> in the <i>CodeCommit User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#DeleteSSHPublicKeyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"UserName\": {\n                    \"target\": \"com.amazonaws.iam#userNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the IAM user associated with the SSH public key.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"SSHPublicKeyId\": {\n                    \"target\": \"com.amazonaws.iam#publicKeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The unique identifier for the SSH public key.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters that can \\n    consist of any upper or lowercased letter or digit.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#DeleteServerCertificate\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#DeleteServerCertificateRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#DeleteConflictException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the specified server certificate.</p>\\n         <p>For more information about working with server certificates, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_server-certs.html\\\">Working\\n                with server certificates</a> in the <i>IAM User Guide</i>. This\\n            topic also includes a list of Amazon Web Services services that can use the server certificates that\\n            you manage with IAM.</p>\\n         <important>\\n            <p> If you are using a server certificate with Elastic Load Balancing, deleting the\\n                certificate could have implications for your application. If Elastic Load Balancing\\n                doesn't detect the deletion of bound certificates, it may continue to use the\\n                certificates. This could cause Elastic Load Balancing to stop accepting traffic. We\\n                recommend that you remove the reference to the certificate from Elastic Load\\n                Balancing before using this command to delete the certificate. For more information,\\n                see <a href=\\\"https://docs.aws.amazon.com/ElasticLoadBalancing/latest/APIReference/API_DeleteLoadBalancerListeners.html\\\">DeleteLoadBalancerListeners</a> in the <i>Elastic Load Balancing API\\n                    Reference</i>.</p>\\n         </important>\"\n            }\n        },\n        \"com.amazonaws.iam#DeleteServerCertificateRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ServerCertificateName\": {\n                    \"target\": \"com.amazonaws.iam#serverCertificateNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the server certificate you want to delete.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#DeleteServiceLinkedRole\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#DeleteServiceLinkedRoleRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#DeleteServiceLinkedRoleResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Submits a service-linked role deletion request and returns a\\n                <code>DeletionTaskId</code>, which you can use to check the status of the deletion.\\n            Before you call this operation, confirm that the role has no active sessions and that\\n            any resources used by the role in the linked service are deleted. If you call this\\n            operation more than once for the same service-linked role and an earlier deletion task\\n            is not complete, then the <code>DeletionTaskId</code> of the earlier request is\\n            returned.</p>\\n         <p>If you submit a deletion request for a service-linked role whose linked service is\\n            still accessing a resource, then the deletion task fails. If it fails, the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetServiceLinkedRoleDeletionStatus.html\\\">GetServiceLinkedRoleDeletionStatus</a> operation returns the reason for the\\n            failure, usually including the resources that must be deleted. To delete the\\n            service-linked role, you must first remove those resources from the linked service and\\n            then submit the deletion request again. Resources are specific to the service that is\\n            linked to the role. For more information about removing resources from a service, see\\n            the <a href=\\\"http://docs.aws.amazon.com/\\\">Amazon Web Services documentation</a> for your\\n            service.</p>\\n         <p>For more information about service-linked roles, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_terms-and-concepts.html#iam-term-service-linked-role\\\">Roles terms and concepts: Amazon Web Services service-linked role</a> in the\\n                <i>IAM User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#DeleteServiceLinkedRoleRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RoleName\": {\n                    \"target\": \"com.amazonaws.iam#roleNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the service-linked role to be deleted.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#DeleteServiceLinkedRoleResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DeletionTaskId\": {\n                    \"target\": \"com.amazonaws.iam#DeletionTaskIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The deletion task identifier that you can use to check the status of the deletion.\\n            This identifier is returned in the format\\n                <code>task/aws-service-role/<service-principal-name>/<role-name>/<task-uuid></code>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#DeleteServiceSpecificCredential\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#DeleteServiceSpecificCredentialRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the specified service-specific credential.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#DeleteServiceSpecificCredentialRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"UserName\": {\n                    \"target\": \"com.amazonaws.iam#userNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the IAM user associated with the service-specific credential. If this\\n            value is not specified, then the operation assumes the user whose credentials are used\\n            to call the operation.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\"\n                    }\n                },\n                \"ServiceSpecificCredentialId\": {\n                    \"target\": \"com.amazonaws.iam#serviceSpecificCredentialId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The unique identifier of the service-specific credential. You can get this value by\\n            calling <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListServiceSpecificCredentials.html\\\">ListServiceSpecificCredentials</a>.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters that can \\n    consist of any upper or lowercased letter or digit.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#DeleteSigningCertificate\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#DeleteSigningCertificateRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#ConcurrentModificationException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes a signing certificate associated with the specified IAM user.</p>\\n         <p>If you do not specify a user name, IAM determines the user name implicitly based on\\n            the Amazon Web Services access key ID signing the request. This operation works for access keys under\\n            the Amazon Web Services account. Consequently, you can use this operation to manage Amazon Web Services account root\\n            user credentials even if the Amazon Web Services account has no associated IAM users.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To delete a signing certificate for an IAM user\",\n                        \"documentation\": \"The following command deletes the specified signing certificate for the IAM user named Anika.\",\n                        \"input\": {\n                            \"UserName\": \"Anika\",\n                            \"CertificateId\": \"TA7SMP42TDN5Z26OBPJE7EXAMPLE\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.iam#DeleteSigningCertificateRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"UserName\": {\n                    \"target\": \"com.amazonaws.iam#existingUserNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the user the signing certificate belongs to.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\"\n                    }\n                },\n                \"CertificateId\": {\n                    \"target\": \"com.amazonaws.iam#certificateIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the signing certificate to delete.</p>\\n         <p>The format of this parameter, as described by its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex</a> pattern, is a string of\\n            characters that can be upper- or lower-cased letters or digits.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#DeleteUser\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#DeleteUserRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#ConcurrentModificationException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#DeleteConflictException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the specified IAM user. Unlike the Amazon Web Services Management Console, when you delete a user\\n            programmatically, you must delete the items attached to the user manually, or the\\n            deletion fails. For more information, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_manage.html#id_users_deleting_cli\\\">Deleting an IAM\\n                user</a>. Before attempting to delete a user, remove the following items:</p>\\n         <ul>\\n            <li>\\n               <p>Password (<a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_DeleteLoginProfile.html\\\">DeleteLoginProfile</a>)</p>\\n            </li>\\n            <li>\\n               <p>Access keys (<a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_DeleteAccessKey.html\\\">DeleteAccessKey</a>)</p>\\n            </li>\\n            <li>\\n               <p>Signing certificate (<a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_DeleteSigningCertificate.html\\\">DeleteSigningCertificate</a>)</p>\\n            </li>\\n            <li>\\n               <p>SSH public key (<a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_DeleteSSHPublicKey.html\\\">DeleteSSHPublicKey</a>)</p>\\n            </li>\\n            <li>\\n               <p>Git credentials (<a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_DeleteServiceSpecificCredential.html\\\">DeleteServiceSpecificCredential</a>)</p>\\n            </li>\\n            <li>\\n               <p>Multi-factor authentication (MFA) device (<a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_DeactivateMFADevice.html\\\">DeactivateMFADevice</a>, <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_DeleteVirtualMFADevice.html\\\">DeleteVirtualMFADevice</a>)</p>\\n            </li>\\n            <li>\\n               <p>Inline policies (<a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_DeleteUserPolicy.html\\\">DeleteUserPolicy</a>)</p>\\n            </li>\\n            <li>\\n               <p>Attached managed policies (<a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_DetachUserPolicy.html\\\">DetachUserPolicy</a>)</p>\\n            </li>\\n            <li>\\n               <p>Group memberships (<a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_RemoveUserFromGroup.html\\\">RemoveUserFromGroup</a>)</p>\\n            </li>\\n         </ul>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To delete an IAM user\",\n                        \"documentation\": \"The following command removes the IAM user named Bob from the current account.\",\n                        \"input\": {\n                            \"UserName\": \"Bob\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.iam#DeleteUserPermissionsBoundary\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#DeleteUserPermissionsBoundaryRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the permissions boundary for the specified IAM user.</p>\\n         <important>\\n            <p>Deleting the permissions boundary for a user might increase its permissions by\\n                allowing the user to perform all the actions granted in its permissions policies.\\n            </p>\\n         </important>\"\n            }\n        },\n        \"com.amazonaws.iam#DeleteUserPermissionsBoundaryRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"UserName\": {\n                    \"target\": \"com.amazonaws.iam#userNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name (friendly name, not ARN) of the IAM user from which you want to remove the\\n            permissions boundary.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#DeleteUserPolicy\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#DeleteUserPolicyRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the specified inline policy that is embedded in the specified IAM\\n            user.</p>\\n         <p>A user can also have managed policies attached to it. To detach a managed policy from\\n            a user, use <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_DetachUserPolicy.html\\\">DetachUserPolicy</a>.\\n            For more information about policies, refer to <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/policies-managed-vs-inline.html\\\">Managed policies and inline\\n                policies</a> in the <i>IAM User Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To remove a policy from an IAM user\",\n                        \"documentation\": \"The following delete-user-policy command removes the specified policy from the IAM user named Juan:\",\n                        \"input\": {\n                            \"UserName\": \"Juan\",\n                            \"PolicyName\": \"ExamplePolicy\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.iam#DeleteUserPolicyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"UserName\": {\n                    \"target\": \"com.amazonaws.iam#existingUserNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name (friendly name, not ARN) identifying the user that the policy is embedded\\n            in.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"PolicyName\": {\n                    \"target\": \"com.amazonaws.iam#policyNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name identifying the policy document to delete.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#DeleteUserRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"UserName\": {\n                    \"target\": \"com.amazonaws.iam#existingUserNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the user to delete.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#DeleteVirtualMFADevice\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#DeleteVirtualMFADeviceRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#ConcurrentModificationException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#DeleteConflictException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes a virtual MFA device.</p>\\n         <note>\\n            <p> You must deactivate a user's virtual MFA device before you can delete it. For\\n                information about deactivating MFA devices, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_DeactivateMFADevice.html\\\">DeactivateMFADevice</a>. </p>\\n         </note>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To remove a virtual MFA device\",\n                        \"documentation\": \"The following delete-virtual-mfa-device command removes the specified MFA device from the current AWS account.\",\n                        \"input\": {\n                            \"SerialNumber\": \"arn:aws:iam::123456789012:mfa/ExampleName\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.iam#DeleteVirtualMFADeviceRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SerialNumber\": {\n                    \"target\": \"com.amazonaws.iam#serialNumberType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The serial number that uniquely identifies the MFA device. For virtual MFA devices,\\n            the serial number is the same as the ARN.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting \\n    of upper and lowercase alphanumeric characters with no spaces. You can also include any of the \\n    following characters: =,.@:/-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#DeletionTaskFailureReasonType\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Reason\": {\n                    \"target\": \"com.amazonaws.iam#ReasonType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A short description of the reason that the service-linked role deletion failed.</p>\"\n                    }\n                },\n                \"RoleUsageList\": {\n                    \"target\": \"com.amazonaws.iam#RoleUsageListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of objects that contains details about the service-linked role deletion failure,\\n         if that information is returned by the service. If the service-linked role has active\\n         sessions or if any resources that were used by the role have not been deleted from the\\n         linked service, the role can't be deleted. This parameter includes a list of the resources\\n         that are associated with the role and the Region in which the resources are being\\n         used.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The reason that the service-linked role deletion failed.</p>\\n         <p>This data type is used as a response element in the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetServiceLinkedRoleDeletionStatus.html\\\">GetServiceLinkedRoleDeletionStatus</a> operation.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#DeletionTaskIdType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.iam#DeletionTaskStatusType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"SUCCEEDED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"SUCCEEDED\"\n                    }\n                },\n                \"IN_PROGRESS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"IN_PROGRESS\"\n                    }\n                },\n                \"FAILED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"FAILED\"\n                    }\n                },\n                \"NOT_STARTED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"NOT_STARTED\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.iam#DetachGroupPolicy\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#DetachGroupPolicyRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#InvalidInputException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Removes the specified managed policy from the specified IAM group.</p>\\n         <p>A group can also have inline policies embedded with it. To delete an inline policy,\\n            use <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_DeleteGroupPolicy.html\\\">DeleteGroupPolicy</a>. For information about policies, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/policies-managed-vs-inline.html\\\">Managed\\n                policies and inline policies</a> in the\\n            <i>IAM User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#DetachGroupPolicyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"GroupName\": {\n                    \"target\": \"com.amazonaws.iam#groupNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name (friendly name, not ARN) of the IAM group to detach the policy from.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"PolicyArn\": {\n                    \"target\": \"com.amazonaws.iam#arnType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the IAM policy you want to detach.</p>\\n         <p>For more information about ARNs, see <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html\\\">Amazon Resource Names (ARNs)</a> in the <i>Amazon Web Services General Reference</i>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#DetachRolePolicy\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#DetachRolePolicyRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#InvalidInputException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#UnmodifiableEntityException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Removes the specified managed policy from the specified role.</p>\\n         <p>A role can also have inline policies embedded with it. To delete an inline policy, use\\n                <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_DeleteRolePolicy.html\\\">DeleteRolePolicy</a>. For information about policies, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/policies-managed-vs-inline.html\\\">Managed\\n                policies and inline policies</a> in the\\n            <i>IAM User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#DetachRolePolicyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RoleName\": {\n                    \"target\": \"com.amazonaws.iam#roleNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name (friendly name, not ARN) of the IAM role to detach the policy from.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"PolicyArn\": {\n                    \"target\": \"com.amazonaws.iam#arnType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the IAM policy you want to detach.</p>\\n         <p>For more information about ARNs, see <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html\\\">Amazon Resource Names (ARNs)</a> in the <i>Amazon Web Services General Reference</i>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#DetachUserPolicy\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#DetachUserPolicyRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#InvalidInputException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Removes the specified managed policy from the specified user.</p>\\n         <p>A user can also have inline policies embedded with it. To delete an inline policy, use\\n                <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_DeleteUserPolicy.html\\\">DeleteUserPolicy</a>. For information about policies, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/policies-managed-vs-inline.html\\\">Managed\\n                policies and inline policies</a> in the\\n            <i>IAM User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#DetachUserPolicyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"UserName\": {\n                    \"target\": \"com.amazonaws.iam#userNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name (friendly name, not ARN) of the IAM user to detach the policy from.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"PolicyArn\": {\n                    \"target\": \"com.amazonaws.iam#arnType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the IAM policy you want to detach.</p>\\n         <p>For more information about ARNs, see <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html\\\">Amazon Resource Names (ARNs)</a> in the <i>Amazon Web Services General Reference</i>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#DisableOrganizationsRootCredentialsManagement\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#DisableOrganizationsRootCredentialsManagementRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#DisableOrganizationsRootCredentialsManagementResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#AccountNotManagementOrDelegatedAdministratorException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#OrganizationNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#OrganizationNotInAllFeaturesModeException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceAccessNotEnabledException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Disables the management of privileged root user credentials across member accounts in\\n            your organization. When you disable this feature, the management account and the\\n            delegated administrator for IAM can no longer manage root user credentials for member\\n            accounts in your organization.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To disable the RootCredentialsManagement feature in your organization\",\n                        \"documentation\": \"The following command disables the management of privileged root user credentials across member accounts in your organization.\",\n                        \"output\": {\n                            \"OrganizationId\": \"o-aa111bb222\",\n                            \"EnabledFeatures\": [\n                                \"RootSessions\"\n                            ]\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.iam#DisableOrganizationsRootCredentialsManagementRequest\": {\n            \"type\": \"structure\",\n            \"members\": {},\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#DisableOrganizationsRootCredentialsManagementResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"OrganizationId\": {\n                    \"target\": \"com.amazonaws.iam#OrganizationIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The unique identifier (ID) of an organization.</p>\"\n                    }\n                },\n                \"EnabledFeatures\": {\n                    \"target\": \"com.amazonaws.iam#FeaturesListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The features enabled for centralized root access for member accounts in your\\n            organization.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#DisableOrganizationsRootSessions\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#DisableOrganizationsRootSessionsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#DisableOrganizationsRootSessionsResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#AccountNotManagementOrDelegatedAdministratorException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#OrganizationNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#OrganizationNotInAllFeaturesModeException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceAccessNotEnabledException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Disables root user sessions for privileged tasks across member accounts in your\\n            organization. When you disable this feature, the management account and the delegated\\n            administrator for IAM can no longer perform privileged tasks on member accounts in\\n            your organization.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To disable the RootSessions feature in your organization\",\n                        \"documentation\": \"The following command disables root user sessions for privileged tasks across member accounts in your organization.\",\n                        \"output\": {\n                            \"OrganizationId\": \"o-aa111bb222\",\n                            \"EnabledFeatures\": [\n                                \"RootCredentialsManagement\"\n                            ]\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.iam#DisableOrganizationsRootSessionsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {},\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#DisableOrganizationsRootSessionsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"OrganizationId\": {\n                    \"target\": \"com.amazonaws.iam#OrganizationIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The unique identifier (ID) of an organization.</p>\"\n                    }\n                },\n                \"EnabledFeatures\": {\n                    \"target\": \"com.amazonaws.iam#FeaturesListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The features you have enabled for centralized root access of member accounts in your\\n            organization.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#DuplicateCertificateException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.iam#duplicateCertificateMessage\"\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"DuplicateCertificate\",\n                    \"httpResponseCode\": 409\n                },\n                \"smithy.api#documentation\": \"<p>The request was rejected because the same certificate is associated with an IAM user in\\n      the account.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 409\n            }\n        },\n        \"com.amazonaws.iam#DuplicateSSHPublicKeyException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.iam#duplicateSSHPublicKeyMessage\"\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"DuplicateSSHPublicKey\",\n                    \"httpResponseCode\": 400\n                },\n                \"smithy.api#documentation\": \"<p>The request was rejected because the SSH public key is already associated with the\\n      specified IAM user.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.iam#EnableMFADevice\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#EnableMFADeviceRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#ConcurrentModificationException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#EntityAlreadyExistsException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#EntityTemporarilyUnmodifiableException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#InvalidAuthenticationCodeException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Enables the specified MFA device and associates it with the specified IAM user. When\\n            enabled, the MFA device is required for every subsequent login by the IAM user\\n            associated with the device.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#EnableMFADeviceRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"UserName\": {\n                    \"target\": \"com.amazonaws.iam#existingUserNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the IAM user for whom you want to enable the MFA device.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"SerialNumber\": {\n                    \"target\": \"com.amazonaws.iam#serialNumberType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The serial number that uniquely identifies the MFA device. For virtual MFA devices,\\n            the serial number is the device ARN.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting \\n    of upper and lowercase alphanumeric characters with no spaces. You can also include any of the \\n    following characters: =,.@:/-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"AuthenticationCode1\": {\n                    \"target\": \"com.amazonaws.iam#authenticationCodeType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An authentication code emitted by the device. </p>\\n         <p>The format for this parameter is a string of six digits.</p>\\n         <important>\\n            <p>Submit your request immediately after generating the authentication codes. If you\\n                generate the codes and then wait too long to submit the request, the MFA device\\n                successfully associates with the user but the MFA device becomes out of sync. This\\n                happens because time-based one-time passwords (TOTP) expire after a short period of\\n                time. If this happens, you can <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_mfa_sync.html\\\">resync the\\n                device</a>.</p>\\n         </important>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"AuthenticationCode2\": {\n                    \"target\": \"com.amazonaws.iam#authenticationCodeType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A subsequent authentication code emitted by the device.</p>\\n         <p>The format for this parameter is a string of six digits.</p>\\n         <important>\\n            <p>Submit your request immediately after generating the authentication codes. If you\\n                generate the codes and then wait too long to submit the request, the MFA device\\n                successfully associates with the user but the MFA device becomes out of sync. This\\n                happens because time-based one-time passwords (TOTP) expire after a short period of\\n                time. If this happens, you can <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_mfa_sync.html\\\">resync the\\n                device</a>.</p>\\n         </important>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#EnableOrganizationsRootCredentialsManagement\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#EnableOrganizationsRootCredentialsManagementRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#EnableOrganizationsRootCredentialsManagementResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#AccountNotManagementOrDelegatedAdministratorException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#CallerIsNotManagementAccountException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#OrganizationNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#OrganizationNotInAllFeaturesModeException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceAccessNotEnabledException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Enables the management of privileged root user credentials across member accounts in your\\n            organization. When you enable root credentials management for <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_root-user.html#id_root-user-access-management\\\">centralized root access</a>, the management account and the delegated\\n            administrator for IAM can manage root user credentials for member accounts in your\\n            organization.</p>\\n         <p>Before you enable centralized root access, you must have an account configured with\\n            the following settings:</p>\\n         <ul>\\n            <li>\\n               <p>You must manage your Amazon Web Services accounts in <a href=\\\"https://docs.aws.amazon.com/organizations/latest/userguide/orgs_introduction.html\\\">Organizations</a>.</p>\\n            </li>\\n            <li>\\n               <p>Enable trusted access for Identity and Access Management in Organizations. For details, see\\n                        <a href=\\\"https://docs.aws.amazon.com/organizations/latest/userguide/services-that-can-integrate-iam.html\\\">IAM and Organizations</a> in the <i>Organizations User\\n                        Guide</i>.</p>\\n            </li>\\n         </ul>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To enable the RootCredentialsManagement feature in your organization\",\n                        \"documentation\": \"The following command enables the management of privileged root user credentials across member accounts in your organization.\",\n                        \"output\": {\n                            \"OrganizationId\": \"o-aa111bb222\",\n                            \"EnabledFeatures\": [\n                                \"RootCredentialsManagement\"\n                            ]\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.iam#EnableOrganizationsRootCredentialsManagementRequest\": {\n            \"type\": \"structure\",\n            \"members\": {},\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#EnableOrganizationsRootCredentialsManagementResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"OrganizationId\": {\n                    \"target\": \"com.amazonaws.iam#OrganizationIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The unique identifier (ID) of an organization.</p>\"\n                    }\n                },\n                \"EnabledFeatures\": {\n                    \"target\": \"com.amazonaws.iam#FeaturesListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The features you have enabled for centralized root access.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#EnableOrganizationsRootSessions\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#EnableOrganizationsRootSessionsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#EnableOrganizationsRootSessionsResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#AccountNotManagementOrDelegatedAdministratorException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#CallerIsNotManagementAccountException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#OrganizationNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#OrganizationNotInAllFeaturesModeException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceAccessNotEnabledException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Allows the management account or delegated administrator to perform privileged tasks\\n            on member accounts in your organization. For more information, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_root-user.html#id_root-user-access-management\\\">Centrally manage root access for member accounts</a> in the <i>Identity and Access Management\\n                User Guide</i>.</p>\\n         <p>Before you enable this feature, you must have an account configured with the following\\n            settings:</p>\\n         <ul>\\n            <li>\\n               <p>You must manage your Amazon Web Services accounts in <a href=\\\"https://docs.aws.amazon.com/organizations/latest/userguide/orgs_introduction.html\\\">Organizations</a>.</p>\\n            </li>\\n            <li>\\n               <p>Enable trusted access for Identity and Access Management in Organizations. For details, see\\n                        <a href=\\\"https://docs.aws.amazon.com/organizations/latest/userguide/services-that-can-integrate-ra.html\\\">IAM and Organizations</a> in the <i>Organizations User\\n                        Guide</i>.</p>\\n            </li>\\n         </ul>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To enable the RootSessions feature in your organization\",\n                        \"documentation\": \"The following command allows the management account or delegated administrator to perform privileged tasks on member accounts in your organization.\",\n                        \"output\": {\n                            \"OrganizationId\": \"o-aa111bb222\",\n                            \"EnabledFeatures\": [\n                                \"RootCredentialsManagement\",\n                                \"RootSessions\"\n                            ]\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.iam#EnableOrganizationsRootSessionsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {},\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#EnableOrganizationsRootSessionsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"OrganizationId\": {\n                    \"target\": \"com.amazonaws.iam#OrganizationIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The unique identifier (ID) of an organization.</p>\"\n                    }\n                },\n                \"EnabledFeatures\": {\n                    \"target\": \"com.amazonaws.iam#FeaturesListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The features you have enabled for centralized root access.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#EntityAlreadyExistsException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.iam#entityAlreadyExistsMessage\"\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"EntityAlreadyExists\",\n                    \"httpResponseCode\": 409\n                },\n                \"smithy.api#documentation\": \"<p>The request was rejected because it attempted to create a resource that already\\n      exists.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 409\n            }\n        },\n        \"com.amazonaws.iam#EntityDetails\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"EntityInfo\": {\n                    \"target\": \"com.amazonaws.iam#EntityInfo\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>EntityInfo</code> object that contains details about the entity (user or\\n         role).</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"LastAuthenticated\": {\n                    \"target\": \"com.amazonaws.iam#dateType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time, in <a href=\\\"http://www.iso.org/iso/iso8601\\\">ISO 8601 date-time\\n            format</a>, when the authenticated entity last attempted to access Amazon Web Services. Amazon Web Services does\\n         not report unauthenticated requests.</p>\\n         <p>This field is null if no IAM entities attempted to access the service within the\\n            <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_access-advisor.html#service-last-accessed-reporting-period\\\">tracking period</a>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>An object that contains details about when the IAM entities (users or roles) were last\\n         used in an attempt to access the specified Amazon Web Services service.</p>\\n         <p>This data type is a response element in the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetServiceLastAccessedDetailsWithEntities.html\\\">GetServiceLastAccessedDetailsWithEntities</a> operation.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#EntityInfo\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Arn\": {\n                    \"target\": \"com.amazonaws.iam#arnType\",\n                    \"traits\": {\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Name\": {\n                    \"target\": \"com.amazonaws.iam#userNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the entity (user or role).</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Type\": {\n                    \"target\": \"com.amazonaws.iam#policyOwnerEntityType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of entity (user or role).</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Id\": {\n                    \"target\": \"com.amazonaws.iam#idType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The identifier of the entity (user or role).</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Path\": {\n                    \"target\": \"com.amazonaws.iam#pathType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The path to the entity (user or role). For more information about paths, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/Using_Identifiers.html\\\">IAM\\n            identifiers</a> in the <i>IAM User Guide</i>. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains details about the specified entity (user or role).</p>\\n         <p>This data type is an element of the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_EntityDetails.html\\\">EntityDetails</a>\\n         object.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#EntityTemporarilyUnmodifiableException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.iam#entityTemporarilyUnmodifiableMessage\"\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"EntityTemporarilyUnmodifiable\",\n                    \"httpResponseCode\": 409\n                },\n                \"smithy.api#documentation\": \"<p>The request was rejected because it referenced an entity that is temporarily unmodifiable,\\n      such as a user name that was deleted and then recreated. The error indicates that the request\\n      is likely to succeed if you try again after waiting several minutes. The error message\\n      describes the entity.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 409\n            }\n        },\n        \"com.amazonaws.iam#EntityType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"User\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"User\"\n                    }\n                },\n                \"Role\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Role\"\n                    }\n                },\n                \"Group\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Group\"\n                    }\n                },\n                \"LocalManagedPolicy\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"LocalManagedPolicy\"\n                    }\n                },\n                \"AWSManagedPolicy\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWSManagedPolicy\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.iam#ErrorDetails\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Message\": {\n                    \"target\": \"com.amazonaws.iam#stringType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Detailed information about the reason that the operation failed.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Code\": {\n                    \"target\": \"com.amazonaws.iam#stringType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The error code associated with the operation failure.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains information about the reason that the operation failed.</p>\\n         <p>This data type is used as a response element in the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetOrganizationsAccessReport.html\\\">GetOrganizationsAccessReport</a>, <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetServiceLastAccessedDetails.html\\\">GetServiceLastAccessedDetails</a>, and <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetServiceLastAccessedDetailsWithEntities.html\\\">GetServiceLastAccessedDetailsWithEntities</a> operations.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#EvalDecisionDetailsType\": {\n            \"type\": \"map\",\n            \"key\": {\n                \"target\": \"com.amazonaws.iam#EvalDecisionSourceType\"\n            },\n            \"value\": {\n                \"target\": \"com.amazonaws.iam#PolicyEvaluationDecisionType\"\n            }\n        },\n        \"com.amazonaws.iam#EvalDecisionSourceType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 3,\n                    \"max\": 256\n                }\n            }\n        },\n        \"com.amazonaws.iam#EvaluationResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"EvalActionName\": {\n                    \"target\": \"com.amazonaws.iam#ActionNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the API operation tested on the indicated resource.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"EvalResourceName\": {\n                    \"target\": \"com.amazonaws.iam#ResourceNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the resource that the indicated API operation was tested on.</p>\"\n                    }\n                },\n                \"EvalDecision\": {\n                    \"target\": \"com.amazonaws.iam#PolicyEvaluationDecisionType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The result of the simulation.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"MatchedStatements\": {\n                    \"target\": \"com.amazonaws.iam#StatementListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of the statements in the input policies that determine the result for this\\n         scenario. Remember that even if multiple statements allow the operation on the resource, if\\n         only one statement denies that operation, then the explicit deny overrides any allow. In\\n         addition, the deny statement is the only entry included in the result.</p>\"\n                    }\n                },\n                \"MissingContextValues\": {\n                    \"target\": \"com.amazonaws.iam#ContextKeyNamesResultListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of context keys that are required by the included input policies but that were\\n         not provided by one of the input parameters. This list is used when the resource in a\\n         simulation is \\\"*\\\", either explicitly, or when the <code>ResourceArns</code> parameter\\n         blank. If you include a list of resources, then any missing context values are instead\\n         included under the <code>ResourceSpecificResults</code> section. To discover the context\\n         keys used by a set of policies, you can call <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetContextKeysForCustomPolicy.html\\\">GetContextKeysForCustomPolicy</a> or <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetContextKeysForPrincipalPolicy.html\\\">GetContextKeysForPrincipalPolicy</a>.</p>\"\n                    }\n                },\n                \"OrganizationsDecisionDetail\": {\n                    \"target\": \"com.amazonaws.iam#OrganizationsDecisionDetail\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A structure that details how Organizations and its service control policies affect the results of\\n         the simulation. Only applies if the simulated user's account is part of an\\n         organization.</p>\"\n                    }\n                },\n                \"PermissionsBoundaryDecisionDetail\": {\n                    \"target\": \"com.amazonaws.iam#PermissionsBoundaryDecisionDetail\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Contains information about the effect that a permissions boundary has on a policy\\n         simulation when the boundary is applied to an IAM entity.</p>\"\n                    }\n                },\n                \"EvalDecisionDetails\": {\n                    \"target\": \"com.amazonaws.iam#EvalDecisionDetailsType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Additional details about the results of the cross-account evaluation decision. This\\n         parameter is populated for only cross-account simulations. It contains a brief summary of\\n         how each policy type contributes to the final evaluation decision.</p>\\n         <p>If the simulation evaluates policies within the same account and includes a resource\\n         ARN, then the parameter is present but the response is empty. If the simulation evaluates\\n         policies within the same account and specifies all resources (<code>*</code>), then the\\n         parameter is not returned.</p>\\n         <p>When you make a cross-account request, Amazon Web Services evaluates the request in the trusting\\n         account and the trusted account. The request is allowed only if both evaluations return\\n            <code>true</code>. For more information about how policies are evaluated, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_evaluation-logic.html#policy-eval-basics\\\">Evaluating policies within a single account</a>.</p>\\n         <p>If an Organizations SCP included in the evaluation denies access, the simulation ends. In\\n         this case, policy evaluation does not proceed any further and this parameter is not\\n         returned.</p>\"\n                    }\n                },\n                \"ResourceSpecificResults\": {\n                    \"target\": \"com.amazonaws.iam#ResourceSpecificResultListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The individual results of the simulation of the API operation specified in\\n         EvalActionName on each resource.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the results of a simulation.</p>\\n         <p>This data type is used by the return parameter of <code>\\n               <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_SimulateCustomPolicy.html\\\">SimulateCustomPolicy</a>\\n            </code> and <code>\\n               <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_SimulatePrincipalPolicy.html\\\">SimulatePrincipalPolicy</a>\\n            </code>.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#EvaluationResultsListType\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.iam#EvaluationResult\"\n            }\n        },\n        \"com.amazonaws.iam#ExceptionMessage\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.iam#FeatureType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ROOT_CREDENTIALS_MANAGEMENT\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"RootCredentialsManagement\"\n                    }\n                },\n                \"ROOT_SESSIONS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"RootSessions\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.iam#FeaturesListType\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.iam#FeatureType\"\n            }\n        },\n        \"com.amazonaws.iam#GenerateCredentialReport\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#GenerateCredentialReportResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p> Generates a credential report for the Amazon Web Services account. For more information about the\\n            credential report, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/credential-reports.html\\\">Getting credential reports</a> in\\n            the <i>IAM User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#GenerateCredentialReportResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"State\": {\n                    \"target\": \"com.amazonaws.iam#ReportStateType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Information about the state of the credential report.</p>\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.iam#ReportStateDescriptionType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Information about the credential report.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the response to a successful <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GenerateCredentialReport.html\\\">GenerateCredentialReport</a> request. </p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#GenerateOrganizationsAccessReport\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#GenerateOrganizationsAccessReportRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#GenerateOrganizationsAccessReportResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#ReportGenerationLimitExceededException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Generates a report for service last accessed data for Organizations. You can generate a\\n            report for any entities (organization root, organizational unit, or account) or policies\\n            in your organization.</p>\\n         <p>To call this operation, you must be signed in using your Organizations management account\\n            credentials. You can use your long-term IAM user or root user credentials, or temporary\\n            credentials from assuming an IAM role. SCPs must be enabled for your organization\\n            root. You must have the required IAM and Organizations permissions. For more information, see\\n                <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_access-advisor.html\\\">Refining permissions using service last accessed data</a> in the\\n                <i>IAM User Guide</i>.</p>\\n         <p>You can generate a service last accessed data report for entities by specifying only\\n            the entity's path. This data includes a list of services that are allowed by any service\\n            control policies (SCPs) that apply to the entity.</p>\\n         <p>You can generate a service last accessed data report for a policy by specifying an\\n            entity's path and an optional Organizations policy ID. This data includes a list of services that\\n            are allowed by the specified SCP.</p>\\n         <p>For each service in both report types, the data includes the most recent account\\n            activity that the policy allows to account principals in the entity or the entity's\\n            children. For important information about the data, reporting period, permissions\\n            required, troubleshooting, and supported Regions see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_access-advisor.html\\\">Reducing permissions using\\n                service last accessed data</a> in the\\n            <i>IAM User Guide</i>.</p>\\n         <important>\\n            <p>The data includes all attempts to access Amazon Web Services, not just the successful ones. This\\n                includes all attempts that were made using the Amazon Web Services Management Console, the Amazon Web Services API through any\\n                of the SDKs, or any of the command line tools. An unexpected entry in the service\\n                last accessed data does not mean that an account has been compromised, because the\\n                request might have been denied. Refer to your CloudTrail logs as the authoritative\\n                source for information about all API calls and whether they were successful or\\n                denied access. For more information, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/cloudtrail-integration.html\\\">Logging IAM events with\\n                    CloudTrail</a> in the <i>IAM User Guide</i>.</p>\\n         </important>\\n         <p>This operation returns a <code>JobId</code>. Use this parameter in the <code>\\n               <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetOrganizationsAccessReport.html\\\">GetOrganizationsAccessReport</a>\\n            </code> operation to check the status of\\n            the report generation. To check the status of this request, use the <code>JobId</code>\\n            parameter in the <code>\\n               <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetOrganizationsAccessReport.html\\\">GetOrganizationsAccessReport</a>\\n            </code> operation and test the\\n                <code>JobStatus</code> response parameter. When the job is complete, you can\\n            retrieve the report.</p>\\n         <p>To generate a service last accessed data report for entities, specify an entity path\\n            without specifying the optional Organizations policy ID. The type of entity that you specify\\n            determines the data returned in the report.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <b>Root</b> – When you specify the\\n                    organizations root as the entity, the resulting report lists all of the services\\n                    allowed by SCPs that are attached to your root. For each service, the report\\n                    includes data for all accounts in your organization except the\\n                    management account, because the management account is not limited by SCPs.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>OU</b> – When you specify an\\n                    organizational unit (OU) as the entity, the resulting report lists all of the\\n                    services allowed by SCPs that are attached to the OU and its parents. For each\\n                    service, the report includes data for all accounts in the OU or its children.\\n                    This data excludes the management account, because the management account is not\\n                    limited by SCPs.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>management account</b> – When you specify the\\n                    management account, the resulting report lists all Amazon Web Services services, because the\\n                    management account is not limited by SCPs. For each service, the report includes\\n                    data for only the management account.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>Account</b> – When you specify another\\n                    account as the entity, the resulting report lists all of the services allowed by\\n                    SCPs that are attached to the account and its parents. For each service, the\\n                    report includes data for only the specified account.</p>\\n            </li>\\n         </ul>\\n         <p>To generate a service last accessed data report for policies, specify an entity path\\n            and the optional Organizations policy ID. The type of entity that you specify determines the data\\n            returned for each service.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <b>Root</b> – When you specify the root\\n                    entity and a policy ID, the resulting report lists all of the services that are\\n                    allowed by the specified SCP. For each service, the report includes data for all\\n                    accounts in your organization to which the SCP applies. This data excludes the\\n                    management account, because the management account is not limited by SCPs. If the\\n                    SCP is not attached to any entities in the organization, then the report will\\n                    return a list of services with no data.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>OU</b> – When you specify an OU entity and\\n                    a policy ID, the resulting report lists all of the services that are allowed by\\n                    the specified SCP. For each service, the report includes data for all accounts\\n                    in the OU or its children to which the SCP applies. This means that other\\n                    accounts outside the OU that are affected by the SCP might not be included in\\n                    the data. This data excludes the management account, because the\\n                    management account is not limited by SCPs. If the SCP is not attached to the OU\\n                    or one of its children, the report will return a list of services with no\\n                    data.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>management account</b> – When you specify the\\n                    management account, the resulting report lists all Amazon Web Services services, because the\\n                    management account is not limited by SCPs. If you specify a policy ID in the CLI\\n                    or API, the policy is ignored. For each service, the report includes data for\\n                    only the management account.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>Account</b> – When you specify another\\n                    account entity and a policy ID, the resulting report lists all of the services\\n                    that are allowed by the specified SCP. For each service, the report includes\\n                    data for only the specified account. This means that other accounts in the\\n                    organization that are affected by the SCP might not be included in the data. If\\n                    the SCP is not attached to the account, the report will return a list of\\n                    services with no data.</p>\\n            </li>\\n         </ul>\\n         <note>\\n            <p>Service last accessed data does not use other policy types when determining\\n                whether a principal could access a service. These other policy types include\\n                identity-based policies, resource-based policies, access control lists, IAM\\n                permissions boundaries, and STS assume role policies. It only applies SCP logic.\\n                For more about the evaluation of policy types, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_evaluation-logic.html#policy-eval-basics\\\">Evaluating policies</a> in the\\n                <i>IAM User Guide</i>.</p>\\n         </note>\\n         <p>For more information about service last accessed data, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_access-advisor.html\\\">Reducing policy scope by\\n                viewing user activity</a> in the <i>IAM User Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To generate a service last accessed data report for an organizational unit\",\n                        \"documentation\": \"The following operation generates a report for the organizational unit ou-rge0-awexample\",\n                        \"input\": {\n                            \"EntityPath\": \"o-a1b2c3d4e5/r-f6g7h8i9j0example/ou-1a2b3c-k9l8m7n6o5example\"\n                        },\n                        \"output\": {\n                            \"JobId\": \"examplea-1234-b567-cde8-90fg123abcd4\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.iam#GenerateOrganizationsAccessReportRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"EntityPath\": {\n                    \"target\": \"com.amazonaws.iam#organizationsEntityPathType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The path of the Organizations entity (root, OU, or account). You can build an entity path\\n            using the known structure of your organization. For example, assume that your account ID\\n            is <code>123456789012</code> and its parent OU ID is <code>ou-rge0-awsabcde</code>. The\\n            organization root ID is <code>r-f6g7h8i9j0example</code> and your organization ID is\\n                <code>o-a1b2c3d4e5</code>. Your entity path is\\n                <code>o-a1b2c3d4e5/r-f6g7h8i9j0example/ou-rge0-awsabcde/123456789012</code>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"OrganizationsPolicyId\": {\n                    \"target\": \"com.amazonaws.iam#organizationsPolicyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The identifier of the Organizations service control policy (SCP). This parameter is\\n            optional.</p>\\n         <p>This ID is used to generate information about when an account principal that is\\n            limited by the SCP attempted to access an Amazon Web Services service.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#GenerateOrganizationsAccessReportResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"JobId\": {\n                    \"target\": \"com.amazonaws.iam#jobIDType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The job identifier that you can use in the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetOrganizationsAccessReport.html\\\">GetOrganizationsAccessReport</a> operation.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#GenerateServiceLastAccessedDetails\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#GenerateServiceLastAccessedDetailsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#GenerateServiceLastAccessedDetailsResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#InvalidInputException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Generates a report that includes details about when an IAM resource (user, group,\\n            role, or policy) was last used in an attempt to access Amazon Web Services services. Recent activity\\n            usually appears within four hours. IAM reports activity for at least the last 400\\n            days, or less if your Region began supporting this feature within the last year. For\\n            more information, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_access-advisor.html#access-advisor_tracking-period\\\">Regions where data is tracked</a>. For more information about services and\\n            actions for which action last accessed information is displayed, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_access-advisor-action-last-accessed.html\\\">IAM\\n                action last accessed information services and actions</a>.</p>\\n         <important>\\n            <p>The service last accessed data includes all attempts to access an Amazon Web Services API, not\\n                just the successful ones. This includes all attempts that were made using the\\n                Amazon Web Services Management Console, the Amazon Web Services API through any of the SDKs, or any of the command line tools.\\n                An unexpected entry in the service last accessed data does not mean that your\\n                account has been compromised, because the request might have been denied. Refer to\\n                your CloudTrail logs as the authoritative source for information about all API calls\\n                and whether they were successful or denied access. For more information, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/cloudtrail-integration.html\\\">Logging\\n                    IAM events with CloudTrail</a> in the\\n                    <i>IAM User Guide</i>.</p>\\n         </important>\\n         <p>The <code>GenerateServiceLastAccessedDetails</code> operation returns a\\n                <code>JobId</code>. Use this parameter in the following operations to retrieve the\\n            following details from your report: </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetServiceLastAccessedDetails.html\\\">GetServiceLastAccessedDetails</a> – Use this operation for\\n                    users, groups, roles, or policies to list every Amazon Web Services service that the resource\\n                    could access using permissions policies. For each service, the response includes\\n                    information about the most recent access attempt.</p>\\n               <p>The <code>JobId</code> returned by\\n                        <code>GenerateServiceLastAccessedDetail</code> must be used by the same role\\n                    within a session, or by the same user when used to call\\n                        <code>GetServiceLastAccessedDetail</code>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetServiceLastAccessedDetailsWithEntities.html\\\">GetServiceLastAccessedDetailsWithEntities</a> – Use this\\n                    operation for groups and policies to list information about the associated\\n                    entities (users or roles) that attempted to access a specific Amazon Web Services service.\\n                </p>\\n            </li>\\n         </ul>\\n         <p>To check the status of the <code>GenerateServiceLastAccessedDetails</code> request,\\n            use the <code>JobId</code> parameter in the same operations and test the\\n                <code>JobStatus</code> response parameter.</p>\\n         <p>For additional information about the permissions policies that allow an identity\\n            (user, group, or role) to access specific services, use the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListPoliciesGrantingServiceAccess.html\\\">ListPoliciesGrantingServiceAccess</a> operation.</p>\\n         <note>\\n            <p>Service last accessed data does not use other policy types when determining\\n                whether a resource could access a service. These other policy types include\\n                resource-based policies, access control lists, Organizations policies, IAM permissions\\n                boundaries, and STS assume role policies. It only applies permissions policy\\n                logic. For more about the evaluation of policy types, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_evaluation-logic.html#policy-eval-basics\\\">Evaluating policies</a> in the\\n                <i>IAM User Guide</i>.</p>\\n         </note>\\n         <p>For more information about service and action last accessed data, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_access-advisor.html\\\">Reducing permissions using service last accessed data</a> in the\\n                <i>IAM User Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To generate a service last accessed data report for a policy\",\n                        \"documentation\": \"The following operation generates a report for the policy: ExamplePolicy1\",\n                        \"input\": {\n                            \"Arn\": \"arn:aws:iam::123456789012:policy/ExamplePolicy1\"\n                        },\n                        \"output\": {\n                            \"JobId\": \"examplef-1305-c245-eba4-71fe298bcda7\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.iam#GenerateServiceLastAccessedDetailsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Arn\": {\n                    \"target\": \"com.amazonaws.iam#arnType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the IAM resource (user, group, role, or managed policy) used to generate\\n            information about when the resource was last used in an attempt to access an Amazon Web Services\\n            service.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Granularity\": {\n                    \"target\": \"com.amazonaws.iam#AccessAdvisorUsageGranularityType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The level of detail that you want to generate. You can specify whether you want to\\n            generate information about the last attempt to access services or actions. If you\\n            specify service-level granularity, this operation generates only service data. If you\\n            specify action-level granularity, it generates service and action data. If you don't\\n            include this optional parameter, the operation generates service data.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#GenerateServiceLastAccessedDetailsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"JobId\": {\n                    \"target\": \"com.amazonaws.iam#jobIDType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>JobId</code> that you can use in the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetServiceLastAccessedDetails.html\\\">GetServiceLastAccessedDetails</a> or <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetServiceLastAccessedDetailsWithEntities.html\\\">GetServiceLastAccessedDetailsWithEntities</a> operations. The\\n                <code>JobId</code> returned by <code>GenerateServiceLastAccessedDetail</code> must\\n            be used by the same role within a session, or by the same user when used to call\\n                <code>GetServiceLastAccessedDetail</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#GetAccessKeyLastUsed\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#GetAccessKeyLastUsedRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#GetAccessKeyLastUsedResponse\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Retrieves information about when the specified access key was last used. The\\n            information includes the date and time of last use, along with the Amazon Web Services service and\\n            Region that were specified in the last request made with that key.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#GetAccessKeyLastUsedRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccessKeyId\": {\n                    \"target\": \"com.amazonaws.iam#accessKeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The identifier of an access key.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters that can \\n    consist of any upper or lowercased letter or digit.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#GetAccessKeyLastUsedResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"UserName\": {\n                    \"target\": \"com.amazonaws.iam#existingUserNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the IAM user that owns this access key.</p>\\n         <p></p>\"\n                    }\n                },\n                \"AccessKeyLastUsed\": {\n                    \"target\": \"com.amazonaws.iam#AccessKeyLastUsed\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Contains information about the last time the access key was used.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the response to a successful <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetAccessKeyLastUsed.html\\\">GetAccessKeyLastUsed</a>\\n      request. It is also returned as a member of the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_AccessKeyMetaData.html\\\">AccessKeyMetaData</a> structure\\n      returned by the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListAccessKeys.html\\\">ListAccessKeys</a> action.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#GetAccountAuthorizationDetails\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#GetAccountAuthorizationDetailsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#GetAccountAuthorizationDetailsResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Retrieves information about all IAM users, groups, roles, and policies in your Amazon Web Services\\n            account, including their relationships to one another. Use this operation to obtain a\\n            snapshot of the configuration of IAM permissions (users, groups, roles, and policies)\\n            in your account.</p>\\n         <note>\\n            <p>Policies returned by this operation are URL-encoded compliant \\n    with <a href=\\\"https://tools.ietf.org/html/rfc3986\\\">RFC 3986</a>. You can use a URL \\n    decoding method to convert the policy back to plain JSON text. For example, if you use Java, you \\n    can use the <code>decode</code> method of the <code>java.net.URLDecoder</code> utility class in \\n    the Java SDK. Other languages and SDKs provide similar functionality, and some SDKs do this decoding \\n    automatically.</p>\\n         </note>\\n         <p>You can optionally filter the results using the <code>Filter</code> parameter. You can\\n            paginate the results using the <code>MaxItems</code> and <code>Marker</code>\\n            parameters.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"Marker\",\n                    \"outputToken\": \"Marker\",\n                    \"pageSize\": \"MaxItems\"\n                }\n            }\n        },\n        \"com.amazonaws.iam#GetAccountAuthorizationDetailsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Filter\": {\n                    \"target\": \"com.amazonaws.iam#entityListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of entity types used to filter the results. Only the entities that match the\\n            types you specify are included in the output. Use the value\\n                <code>LocalManagedPolicy</code> to include customer managed policies.</p>\\n         <p>The format for this parameter is a comma-separated (if more than one) list of strings.\\n            Each string value in the list must be one of the valid values listed below.</p>\"\n                    }\n                },\n                \"MaxItems\": {\n                    \"target\": \"com.amazonaws.iam#maxItemsType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this only when paginating results to indicate the \\n    maximum number of items you want in the response. If additional items exist beyond the maximum \\n    you specify, the <code>IsTruncated</code> response element is <code>true</code>.</p>\\n         <p>If you do not include this parameter, the number of items defaults to 100. Note that\\n    IAM might return fewer results, even when there are more results available. In that case, the\\n    <code>IsTruncated</code> response element returns <code>true</code>, and <code>Marker</code> \\n    contains a value to include in the subsequent call that tells the service where to continue \\n    from.</p>\"\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.iam#markerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter only when paginating results and only after \\n    you receive a response indicating that the results are truncated. Set it to the value of the\\n    <code>Marker</code> element in the response that you received to indicate where the next call \\n    should start.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#GetAccountAuthorizationDetailsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"UserDetailList\": {\n                    \"target\": \"com.amazonaws.iam#userDetailListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list containing information about IAM users.</p>\"\n                    }\n                },\n                \"GroupDetailList\": {\n                    \"target\": \"com.amazonaws.iam#groupDetailListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list containing information about IAM groups.</p>\"\n                    }\n                },\n                \"RoleDetailList\": {\n                    \"target\": \"com.amazonaws.iam#roleDetailListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list containing information about IAM roles.</p>\"\n                    }\n                },\n                \"Policies\": {\n                    \"target\": \"com.amazonaws.iam#ManagedPolicyDetailListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list containing information about managed policies.</p>\"\n                    }\n                },\n                \"IsTruncated\": {\n                    \"target\": \"com.amazonaws.iam#booleanType\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>A flag that indicates whether there are more items to return. If your \\n    results were truncated, you can make a subsequent pagination request using the <code>Marker</code>\\n    request parameter to retrieve more items. Note that IAM might return fewer than the \\n    <code>MaxItems</code> number of results even when there are more results available. We recommend \\n    that you check <code>IsTruncated</code> after every call to ensure that you receive all your \\n    results.</p>\"\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.iam#responseMarkerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>When <code>IsTruncated</code> is <code>true</code>, this element\\n    is present and contains the value to use for the <code>Marker</code> parameter in a subsequent \\n    pagination request.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the response to a successful <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetAccountAuthorizationDetails.html\\\">GetAccountAuthorizationDetails</a> request. </p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#GetAccountPasswordPolicy\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#GetAccountPasswordPolicyResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Retrieves the password policy for the Amazon Web Services account. This tells you the complexity\\n            requirements and mandatory rotation periods for the IAM user passwords in your account.\\n            For more information about using a password policy, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/Using_ManagingPasswordPolicies.html\\\">Managing an IAM password\\n                policy</a>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To see the current account password policy\",\n                        \"documentation\": \"The following command displays details about the password policy for the current AWS account.\",\n                        \"output\": {\n                            \"PasswordPolicy\": {\n                                \"AllowUsersToChangePassword\": false,\n                                \"RequireNumbers\": true,\n                                \"RequireLowercaseCharacters\": false,\n                                \"RequireUppercaseCharacters\": false,\n                                \"MinimumPasswordLength\": 8,\n                                \"RequireSymbols\": true,\n                                \"ExpirePasswords\": false,\n                                \"PasswordReusePrevention\": 12,\n                                \"MaxPasswordAge\": 90,\n                                \"HardExpiry\": false\n                            }\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.iam#GetAccountPasswordPolicyResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PasswordPolicy\": {\n                    \"target\": \"com.amazonaws.iam#PasswordPolicy\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A structure that contains details about the account's password policy.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the response to a successful <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetAccountPasswordPolicy.html\\\">GetAccountPasswordPolicy</a> request. </p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#GetAccountSummary\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#GetAccountSummaryResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Retrieves information about IAM entity usage and IAM quotas in the Amazon Web Services\\n            account.</p>\\n         <p> For information about IAM quotas, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_iam-quotas.html\\\">IAM and STS quotas</a> in the\\n                <i>IAM User Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To get information about IAM entity quotas and usage in the current account\",\n                        \"documentation\": \"The following command returns information about the IAM entity quotas and usage in the current AWS account.\",\n                        \"output\": {\n                            \"SummaryMap\": {\n                                \"Users\": 27,\n                                \"UsersQuota\": 5000,\n                                \"Groups\": 15,\n                                \"GroupsQuota\": 100,\n                                \"Policies\": 8,\n                                \"PoliciesQuota\": 1000,\n                                \"PolicySizeQuota\": 5120,\n                                \"PolicyVersionsInUse\": 22,\n                                \"PolicyVersionsInUseQuota\": 10000,\n                                \"VersionsPerPolicyQuota\": 5,\n                                \"ServerCertificates\": 1,\n                                \"ServerCertificatesQuota\": 20,\n                                \"UserPolicySizeQuota\": 2048,\n                                \"GroupPolicySizeQuota\": 5120,\n                                \"GroupsPerUserQuota\": 10,\n                                \"GlobalEndpointTokenVersion\": 2,\n                                \"SigningCertificatesPerUserQuota\": 2,\n                                \"AccessKeysPerUserQuota\": 2,\n                                \"MFADevices\": 6,\n                                \"MFADevicesInUse\": 3,\n                                \"AccountMFAEnabled\": 0,\n                                \"AccountAccessKeysPresent\": 1,\n                                \"AccountSigningCertificatesPresent\": 0,\n                                \"AttachedPoliciesPerGroupQuota\": 10,\n                                \"AttachedPoliciesPerRoleQuota\": 10,\n                                \"AttachedPoliciesPerUserQuota\": 10\n                            }\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.iam#GetAccountSummaryResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SummaryMap\": {\n                    \"target\": \"com.amazonaws.iam#summaryMapType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A set of key–value pairs containing information about IAM entity usage and\\n            IAM quotas.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the response to a successful <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetAccountSummary.html\\\">GetAccountSummary</a> request.\\n    </p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#GetContextKeysForCustomPolicy\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#GetContextKeysForCustomPolicyRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#GetContextKeysForPolicyResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#InvalidInputException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Gets a list of all of the context keys referenced in the input policies. The policies\\n            are supplied as a list of one or more strings. To get the context keys from policies\\n            associated with an IAM user, group, or role, use <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetContextKeysForPrincipalPolicy.html\\\">GetContextKeysForPrincipalPolicy</a>.</p>\\n         <p>Context keys are variables maintained by Amazon Web Services and its services that provide details\\n            about the context of an API query request. Context keys can be evaluated by testing\\n            against a value specified in an IAM policy. Use\\n                <code>GetContextKeysForCustomPolicy</code> to understand what key names and values\\n            you must supply when you call <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_SimulateCustomPolicy.html\\\">SimulateCustomPolicy</a>. Note that all parameters are shown in unencoded form\\n            here for clarity but must be URL encoded to be included as a part of a real HTML\\n            request.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#GetContextKeysForCustomPolicyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PolicyInputList\": {\n                    \"target\": \"com.amazonaws.iam#SimulationPolicyListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of policies for which you want the list of context keys referenced in those\\n            policies. Each document is specified as a string containing the complete, valid JSON\\n            text of an IAM policy.</p>\\n         <p>The <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a> \\n    used to validate this parameter is a string of characters consisting of the following:</p>\\n         <ul>\\n            <li>\\n               <p>Any printable ASCII \\n    character ranging from the space character (<code>\\\\u0020</code>) through the end of the ASCII character range</p>\\n            </li>\\n            <li>\\n               <p>The printable characters in the Basic Latin and  Latin-1 Supplement character set \\n    (through <code>\\\\u00FF</code>)</p>\\n            </li>\\n            <li>\\n               <p>The special characters tab (<code>\\\\u0009</code>), line feed (<code>\\\\u000A</code>), and \\n    carriage return (<code>\\\\u000D</code>)</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#GetContextKeysForPolicyResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ContextKeyNames\": {\n                    \"target\": \"com.amazonaws.iam#ContextKeyNamesResultListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The list of context keys that are referenced in the input policies.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the response to a successful <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetContextKeysForPrincipalPolicy.html\\\">GetContextKeysForPrincipalPolicy</a> or <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetContextKeysForCustomPolicy.html\\\">GetContextKeysForCustomPolicy</a> request. </p>\"\n            }\n        },\n        \"com.amazonaws.iam#GetContextKeysForPrincipalPolicy\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#GetContextKeysForPrincipalPolicyRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#GetContextKeysForPolicyResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#InvalidInputException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Gets a list of all of the context keys referenced in all the IAM policies that are\\n            attached to the specified IAM entity. The entity can be an IAM user, group, or role.\\n            If you specify a user, then the request also includes all of the policies attached to\\n            groups that the user is a member of.</p>\\n         <p>You can optionally include a list of one or more additional policies, specified as\\n            strings. If you want to include <i>only</i> a list of policies by string,\\n            use <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetContextKeysForCustomPolicy.html\\\">GetContextKeysForCustomPolicy</a> instead.</p>\\n         <p>\\n            <b>Note:</b> This operation discloses information about the\\n            permissions granted to other users. If you do not want users to see other user's\\n            permissions, then consider allowing them to use <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetContextKeysForCustomPolicy.html\\\">GetContextKeysForCustomPolicy</a> instead.</p>\\n         <p>Context keys are variables maintained by Amazon Web Services and its services that provide details\\n            about the context of an API query request. Context keys can be evaluated by testing\\n            against a value in an IAM policy. Use <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetContextKeysForPrincipalPolicy.html\\\">GetContextKeysForPrincipalPolicy</a> to understand what key names and values\\n            you must supply when you call <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_SimulatePrincipalPolicy.html\\\">SimulatePrincipalPolicy</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#GetContextKeysForPrincipalPolicyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PolicySourceArn\": {\n                    \"target\": \"com.amazonaws.iam#arnType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of a user, group, or role whose policies contain the context keys that you\\n            want listed. If you specify a user, the list includes context keys that are found in all\\n            policies that are attached to the user. The list also includes all groups that the user\\n            is a member of. If you pick a group or a role, then it includes only those context keys\\n            that are found in policies attached to that entity. Note that all parameters are shown\\n            in unencoded form here for clarity, but must be URL encoded to be included as a part of\\n            a real HTML request.</p>\\n         <p>For more information about ARNs, see <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html\\\">Amazon Resource Names (ARNs)</a> in the <i>Amazon Web Services General Reference</i>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"PolicyInputList\": {\n                    \"target\": \"com.amazonaws.iam#SimulationPolicyListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An optional list of additional policies for which you want the list of context keys\\n            that are referenced.</p>\\n         <p>The <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a> \\n    used to validate this parameter is a string of characters consisting of the following:</p>\\n         <ul>\\n            <li>\\n               <p>Any printable ASCII \\n    character ranging from the space character (<code>\\\\u0020</code>) through the end of the ASCII character range</p>\\n            </li>\\n            <li>\\n               <p>The printable characters in the Basic Latin and  Latin-1 Supplement character set \\n    (through <code>\\\\u00FF</code>)</p>\\n            </li>\\n            <li>\\n               <p>The special characters tab (<code>\\\\u0009</code>), line feed (<code>\\\\u000A</code>), and \\n    carriage return (<code>\\\\u000D</code>)</p>\\n            </li>\\n         </ul>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#GetCredentialReport\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#GetCredentialReportResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#CredentialReportExpiredException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#CredentialReportNotPresentException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#CredentialReportNotReadyException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p> Retrieves a credential report for the Amazon Web Services account. For more information about the\\n            credential report, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/credential-reports.html\\\">Getting credential reports</a> in\\n            the <i>IAM User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#GetCredentialReportResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Content\": {\n                    \"target\": \"com.amazonaws.iam#ReportContentType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Contains the credential report. The report is Base64-encoded.</p>\"\n                    }\n                },\n                \"ReportFormat\": {\n                    \"target\": \"com.amazonaws.iam#ReportFormatType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The format (MIME type) of the credential report.</p>\"\n                    }\n                },\n                \"GeneratedTime\": {\n                    \"target\": \"com.amazonaws.iam#dateType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The date and time when the credential report was created, in <a href=\\\"http://www.iso.org/iso/iso8601\\\">ISO 8601 date-time format</a>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the response to a successful <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetCredentialReport.html\\\">GetCredentialReport</a>\\n      request. </p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#GetGroup\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#GetGroupRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#GetGroupResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p> Returns a list of IAM users that are in the specified IAM group. You can paginate\\n            the results using the <code>MaxItems</code> and <code>Marker</code> parameters.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"Marker\",\n                    \"outputToken\": \"Marker\",\n                    \"items\": \"Users\",\n                    \"pageSize\": \"MaxItems\"\n                }\n            }\n        },\n        \"com.amazonaws.iam#GetGroupPolicy\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#GetGroupPolicyRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#GetGroupPolicyResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Retrieves the specified inline policy document that is embedded in the specified IAM\\n            group.</p>\\n         <note>\\n            <p>Policies returned by this operation are URL-encoded compliant \\n    with <a href=\\\"https://tools.ietf.org/html/rfc3986\\\">RFC 3986</a>. You can use a URL \\n    decoding method to convert the policy back to plain JSON text. For example, if you use Java, you \\n    can use the <code>decode</code> method of the <code>java.net.URLDecoder</code> utility class in \\n    the Java SDK. Other languages and SDKs provide similar functionality, and some SDKs do this decoding \\n    automatically.</p>\\n         </note>\\n         <p>An IAM group can also have managed policies attached to it. To retrieve a managed\\n            policy document that is attached to a group, use <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetPolicy.html\\\">GetPolicy</a> to determine the\\n            policy's default version, then use <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetPolicyVersion.html\\\">GetPolicyVersion</a> to\\n            retrieve the policy document.</p>\\n         <p>For more information about policies, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/policies-managed-vs-inline.html\\\">Managed policies and inline\\n                policies</a> in the <i>IAM User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#GetGroupPolicyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"GroupName\": {\n                    \"target\": \"com.amazonaws.iam#groupNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the group the policy is associated with.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"PolicyName\": {\n                    \"target\": \"com.amazonaws.iam#policyNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the policy document to get.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#GetGroupPolicyResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"GroupName\": {\n                    \"target\": \"com.amazonaws.iam#groupNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The group the policy is associated with.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"PolicyName\": {\n                    \"target\": \"com.amazonaws.iam#policyNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the policy.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"PolicyDocument\": {\n                    \"target\": \"com.amazonaws.iam#policyDocumentType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The policy document.</p>\\n         <p>IAM stores policies in JSON format. However, resources that were created using CloudFormation\\n            templates can be formatted in YAML. CloudFormation always converts a YAML policy to JSON format\\n            before submitting it to IAM.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the response to a successful <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetGroupPolicy.html\\\">GetGroupPolicy</a> request.\\n    </p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#GetGroupRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"GroupName\": {\n                    \"target\": \"com.amazonaws.iam#groupNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the group.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.iam#markerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter only when paginating results and only after \\n    you receive a response indicating that the results are truncated. Set it to the value of the\\n    <code>Marker</code> element in the response that you received to indicate where the next call \\n    should start.</p>\"\n                    }\n                },\n                \"MaxItems\": {\n                    \"target\": \"com.amazonaws.iam#maxItemsType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this only when paginating results to indicate the \\n    maximum number of items you want in the response. If additional items exist beyond the maximum \\n    you specify, the <code>IsTruncated</code> response element is <code>true</code>.</p>\\n         <p>If you do not include this parameter, the number of items defaults to 100. Note that\\n    IAM might return fewer results, even when there are more results available. In that case, the\\n    <code>IsTruncated</code> response element returns <code>true</code>, and <code>Marker</code> \\n    contains a value to include in the subsequent call that tells the service where to continue \\n    from.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#GetGroupResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Group\": {\n                    \"target\": \"com.amazonaws.iam#Group\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A structure that contains details about the group.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Users\": {\n                    \"target\": \"com.amazonaws.iam#userListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of users in the group.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"IsTruncated\": {\n                    \"target\": \"com.amazonaws.iam#booleanType\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>A flag that indicates whether there are more items to return. If your \\n    results were truncated, you can make a subsequent pagination request using the <code>Marker</code>\\n    request parameter to retrieve more items. Note that IAM might return fewer than the \\n    <code>MaxItems</code> number of results even when there are more results available. We recommend \\n    that you check <code>IsTruncated</code> after every call to ensure that you receive all your \\n    results.</p>\"\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.iam#responseMarkerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>When <code>IsTruncated</code> is <code>true</code>, this element\\n    is present and contains the value to use for the <code>Marker</code> parameter in a subsequent \\n    pagination request.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the response to a successful <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetGroup.html\\\">GetGroup</a> request. </p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#GetInstanceProfile\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#GetInstanceProfileRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#GetInstanceProfileResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p> Retrieves information about the specified instance profile, including the instance\\n            profile's path, GUID, ARN, and role. For more information about instance profiles, see\\n                <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-ec2_instance-profiles.html\\\">Using\\n                instance profiles</a> in the <i>IAM User Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To get information about an instance profile\",\n                        \"documentation\": \"The following command gets information about the instance profile named ExampleInstanceProfile.\",\n                        \"input\": {\n                            \"InstanceProfileName\": \"ExampleInstanceProfile\"\n                        },\n                        \"output\": {\n                            \"InstanceProfile\": {\n                                \"InstanceProfileId\": \"AID2MAB8DPLSRHEXAMPLE\",\n                                \"Roles\": [\n                                    {\n                                        \"AssumeRolePolicyDocument\": \"<URL-encoded-JSON>\",\n                                        \"RoleId\": \"AIDGPMS9RO4H3FEXAMPLE\",\n                                        \"CreateDate\": \"2013-01-09T06:33:26Z\",\n                                        \"Path\": \"/\",\n                                        \"RoleName\": \"Test-Role\",\n                                        \"Arn\": \"arn:aws:iam::336924118301:role/Test-Role\"\n                                    }\n                                ],\n                                \"CreateDate\": \"2013-06-12T23:52:02Z\",\n                                \"InstanceProfileName\": \"ExampleInstanceProfile\",\n                                \"Path\": \"/\",\n                                \"Arn\": \"arn:aws:iam::336924118301:instance-profile/ExampleInstanceProfile\"\n                            }\n                        }\n                    }\n                ],\n                \"smithy.waiters#waitable\": {\n                    \"InstanceProfileExists\": {\n                        \"acceptors\": [\n                            {\n                                \"state\": \"success\",\n                                \"matcher\": {\n                                    \"success\": true\n                                }\n                            },\n                            {\n                                \"state\": \"retry\",\n                                \"matcher\": {\n                                    \"errorType\": \"NoSuchEntityException\"\n                                }\n                            }\n                        ],\n                        \"minDelay\": 1\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.iam#GetInstanceProfileRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceProfileName\": {\n                    \"target\": \"com.amazonaws.iam#instanceProfileNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the instance profile to get information about.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#GetInstanceProfileResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceProfile\": {\n                    \"target\": \"com.amazonaws.iam#InstanceProfile\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A structure containing details about the instance profile.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the response to a successful <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetInstanceProfile.html\\\">GetInstanceProfile</a>\\n      request. </p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#GetLoginProfile\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#GetLoginProfileRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#GetLoginProfileResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Retrieves the user name for the specified IAM user. A login profile is created when\\n            you create a password for the user to access the Amazon Web Services Management Console. If the user does not exist\\n            or does not have a password, the operation returns a 404 (<code>NoSuchEntity</code>)\\n            error.</p>\\n         <p>If you create an IAM user with access to the console, the <code>CreateDate</code>\\n            reflects the date you created the initial password for the user.</p>\\n         <p>If you create an IAM user with programmatic access, and then later add a password\\n            for the user to access the Amazon Web Services Management Console, the <code>CreateDate</code> reflects the initial\\n            password creation date. A user with programmatic access does not have a login profile\\n            unless you create a password for the user to access the Amazon Web Services Management Console.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To get password information for an IAM user\",\n                        \"documentation\": \"The following command gets information about the password for the IAM user named Anika.\",\n                        \"input\": {\n                            \"UserName\": \"Anika\"\n                        },\n                        \"output\": {\n                            \"LoginProfile\": {\n                                \"UserName\": \"Anika\",\n                                \"CreateDate\": \"2012-09-21T23:03:39Z\"\n                            }\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.iam#GetLoginProfileRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"UserName\": {\n                    \"target\": \"com.amazonaws.iam#userNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the user whose login profile you want to retrieve.</p>\\n         <p>This parameter is optional. If no user name is included, it defaults to the principal\\n            making the request. When you make this request with root user credentials, you must use\\n            an <a href=\\\"https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoot.html\\\">AssumeRoot</a> session to omit the user name.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#GetLoginProfileResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LoginProfile\": {\n                    \"target\": \"com.amazonaws.iam#LoginProfile\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A structure containing the user name and the profile creation date for the\\n            user.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the response to a successful <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetLoginProfile.html\\\">GetLoginProfile</a> request.\\n    </p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#GetMFADevice\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#GetMFADeviceRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#GetMFADeviceResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Retrieves information about an MFA device for a specified user.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#GetMFADeviceRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SerialNumber\": {\n                    \"target\": \"com.amazonaws.iam#serialNumberType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Serial number that uniquely identifies the MFA device. For this API, we only accept\\n            FIDO security key <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/reference-arns.html\\\">ARNs</a>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"UserName\": {\n                    \"target\": \"com.amazonaws.iam#userNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The friendly name identifying the user.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#GetMFADeviceResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"UserName\": {\n                    \"target\": \"com.amazonaws.iam#userNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The friendly name identifying the user.</p>\"\n                    }\n                },\n                \"SerialNumber\": {\n                    \"target\": \"com.amazonaws.iam#serialNumberType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Serial number that uniquely identifies the MFA device. For this API, we only accept\\n            FIDO security key <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/reference-arns.html\\\">ARNs</a>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"EnableDate\": {\n                    \"target\": \"com.amazonaws.iam#dateType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date that a specified user's MFA device was first enabled.</p>\"\n                    }\n                },\n                \"Certifications\": {\n                    \"target\": \"com.amazonaws.iam#CertificationMapType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The certifications of a specified user's MFA device. We currently provide FIPS-140-2,\\n            FIPS-140-3, and FIDO certification levels obtained from <a href=\\\"https://fidoalliance.org/metadata/\\\"> FIDO Alliance Metadata Service\\n                (MDS)</a>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#GetOpenIDConnectProvider\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#GetOpenIDConnectProviderRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#GetOpenIDConnectProviderResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#InvalidInputException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns information about the specified OpenID Connect (OIDC) provider resource object\\n            in IAM.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#GetOpenIDConnectProviderRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"OpenIDConnectProviderArn\": {\n                    \"target\": \"com.amazonaws.iam#arnType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the OIDC provider resource object in IAM to get\\n            information for. You can get a list of OIDC provider resource ARNs by using the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListOpenIDConnectProviders.html\\\">ListOpenIDConnectProviders</a> operation.</p>\\n         <p>For more information about ARNs, see <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html\\\">Amazon Resource Names (ARNs)</a> in the <i>Amazon Web Services General Reference</i>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#GetOpenIDConnectProviderResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Url\": {\n                    \"target\": \"com.amazonaws.iam#OpenIDConnectProviderUrlType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The URL that the IAM OIDC provider resource object is associated with. For more\\n            information, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateOpenIDConnectProvider.html\\\">CreateOpenIDConnectProvider</a>.</p>\"\n                    }\n                },\n                \"ClientIDList\": {\n                    \"target\": \"com.amazonaws.iam#clientIDListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of client IDs (also known as audiences) that are associated with the specified\\n            IAM OIDC provider resource object. For more information, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateOpenIDConnectProvider.html\\\">CreateOpenIDConnectProvider</a>.</p>\"\n                    }\n                },\n                \"ThumbprintList\": {\n                    \"target\": \"com.amazonaws.iam#thumbprintListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of certificate thumbprints that are associated with the specified IAM OIDC\\n            provider resource object. For more information, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateOpenIDConnectProvider.html\\\">CreateOpenIDConnectProvider</a>. </p>\"\n                    }\n                },\n                \"CreateDate\": {\n                    \"target\": \"com.amazonaws.iam#dateType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time when the IAM OIDC provider resource object was created in the\\n            Amazon Web Services account.</p>\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.iam#tagListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of tags that are attached to the specified IAM OIDC provider. The returned list of tags is sorted by tag key.\\n      For more information about tagging, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_tags.html\\\">Tagging IAM resources</a> in the\\n      <i>IAM User Guide</i>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the response to a successful <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetOpenIDConnectProvider.html\\\">GetOpenIDConnectProvider</a> request. </p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#GetOrganizationsAccessReport\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#GetOrganizationsAccessReportRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#GetOrganizationsAccessReportResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Retrieves the service last accessed data report for Organizations that was previously\\n            generated using the <code>\\n               <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GenerateOrganizationsAccessReport.html\\\">GenerateOrganizationsAccessReport</a>\\n            </code> operation. This operation\\n            retrieves the status of your report job and the report contents.</p>\\n         <p>Depending on the parameters that you passed when you generated the report, the data\\n            returned could include different information. For details, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GenerateOrganizationsAccessReport.html\\\">GenerateOrganizationsAccessReport</a>.</p>\\n         <p>To call this operation, you must be signed in to the management account in your\\n            organization. SCPs must be enabled for your organization root. You must have permissions\\n            to perform this operation. For more information, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_access-advisor.html\\\">Refining permissions using\\n                service last accessed data</a> in the\\n            <i>IAM User Guide</i>.</p>\\n         <p>For each service that principals in an account (root user, IAM users, or IAM roles)\\n            could access using SCPs, the operation returns details about the most recent access\\n            attempt. If there was no attempt, the service is listed without details about the most\\n            recent attempt to access the service. If the operation fails, it returns the reason that\\n            it failed.</p>\\n         <p>By default, the list is sorted by service namespace.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To get details from a previously generated organizational unit report\",\n                        \"documentation\": \"The following operation gets details about the report with the job ID: examplea-1234-b567-cde8-90fg123abcd4\",\n                        \"input\": {\n                            \"JobId\": \"examplea-1234-b567-cde8-90fg123abcd4\"\n                        },\n                        \"output\": {\n                            \"IsTruncated\": false,\n                            \"JobCompletionDate\": \"2019-06-18T19:47:35.241Z\",\n                            \"JobCreationDate\": \"2019-06-18T19:47:31.466Z\",\n                            \"JobStatus\": \"COMPLETED\",\n                            \"NumberOfServicesAccessible\": 3,\n                            \"NumberOfServicesNotAccessed\": 1,\n                            \"AccessDetails\": [\n                                {\n                                    \"EntityPath\": \"o-a1b2c3d4e5/r-f6g7h8i9j0example/ou-1a2b3c-k9l8m7n6o5example/111122223333\",\n                                    \"LastAuthenticatedTime\": \"2019-05-25T16:29:52Z\",\n                                    \"Region\": \"us-east-1\",\n                                    \"ServiceName\": \"Amazon DynamoDB\",\n                                    \"ServiceNamespace\": \"dynamodb\",\n                                    \"TotalAuthenticatedEntities\": 2\n                                },\n                                {\n                                    \"EntityPath\": \"o-a1b2c3d4e5/r-f6g7h8i9j0example/ou-1a2b3c-k9l8m7n6o5example/123456789012\",\n                                    \"LastAuthenticatedTime\": \"2019-06-15T13:12:06Z\",\n                                    \"Region\": \"us-east-1\",\n                                    \"ServiceName\": \"AWS Identity and Access Management\",\n                                    \"ServiceNamespace\": \"iam\",\n                                    \"TotalAuthenticatedEntities\": 4\n                                },\n                                {\n                                    \"ServiceName\": \"Amazon Simple Storage Service\",\n                                    \"ServiceNamespace\": \"s3\",\n                                    \"TotalAuthenticatedEntities\": 0\n                                }\n                            ]\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.iam#GetOrganizationsAccessReportRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"JobId\": {\n                    \"target\": \"com.amazonaws.iam#jobIDType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The identifier of the request generated by the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GenerateOrganizationsAccessReport.html\\\">GenerateOrganizationsAccessReport</a> operation.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"MaxItems\": {\n                    \"target\": \"com.amazonaws.iam#maxItemsType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this only when paginating results to indicate the \\n    maximum number of items you want in the response. If additional items exist beyond the maximum \\n    you specify, the <code>IsTruncated</code> response element is <code>true</code>.</p>\\n         <p>If you do not include this parameter, the number of items defaults to 100. Note that\\n    IAM might return fewer results, even when there are more results available. In that case, the\\n    <code>IsTruncated</code> response element returns <code>true</code>, and <code>Marker</code> \\n    contains a value to include in the subsequent call that tells the service where to continue \\n    from.</p>\"\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.iam#markerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter only when paginating results and only after \\n    you receive a response indicating that the results are truncated. Set it to the value of the\\n    <code>Marker</code> element in the response that you received to indicate where the next call \\n    should start.</p>\"\n                    }\n                },\n                \"SortKey\": {\n                    \"target\": \"com.amazonaws.iam#sortKeyType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The key that is used to sort the results. If you choose the namespace key, the results\\n            are returned in alphabetical order. If you choose the time key, the results are sorted\\n            numerically by the date and time.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#GetOrganizationsAccessReportResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"JobStatus\": {\n                    \"target\": \"com.amazonaws.iam#jobStatusType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The status of the job.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"JobCreationDate\": {\n                    \"target\": \"com.amazonaws.iam#dateType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time, in <a href=\\\"http://www.iso.org/iso/iso8601\\\">ISO 8601 date-time\\n                format</a>, when the report job was created.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"JobCompletionDate\": {\n                    \"target\": \"com.amazonaws.iam#dateType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time, in <a href=\\\"http://www.iso.org/iso/iso8601\\\">ISO 8601 date-time\\n                format</a>, when the generated report job was completed or failed.</p>\\n         <p>This field is null if the job is still in progress, as indicated by a job status value\\n            of <code>IN_PROGRESS</code>.</p>\"\n                    }\n                },\n                \"NumberOfServicesAccessible\": {\n                    \"target\": \"com.amazonaws.iam#integerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of services that the applicable SCPs allow account principals to\\n            access.</p>\"\n                    }\n                },\n                \"NumberOfServicesNotAccessed\": {\n                    \"target\": \"com.amazonaws.iam#integerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of services that account principals are allowed but did not attempt to\\n            access.</p>\"\n                    }\n                },\n                \"AccessDetails\": {\n                    \"target\": \"com.amazonaws.iam#AccessDetails\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An object that contains details about the most recent attempt to access the\\n            service.</p>\"\n                    }\n                },\n                \"IsTruncated\": {\n                    \"target\": \"com.amazonaws.iam#booleanType\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>A flag that indicates whether there are more items to return. If your \\n    results were truncated, you can make a subsequent pagination request using the <code>Marker</code>\\n    request parameter to retrieve more items. Note that IAM might return fewer than the \\n    <code>MaxItems</code> number of results even when there are more results available. We recommend \\n    that you check <code>IsTruncated</code> after every call to ensure that you receive all your \\n    results.</p>\"\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.iam#markerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>When <code>IsTruncated</code> is <code>true</code>, this element\\n    is present and contains the value to use for the <code>Marker</code> parameter in a subsequent \\n    pagination request.</p>\"\n                    }\n                },\n                \"ErrorDetails\": {\n                    \"target\": \"com.amazonaws.iam#ErrorDetails\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#GetPolicy\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#GetPolicyRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#GetPolicyResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#InvalidInputException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Retrieves information about the specified managed policy, including the policy's\\n            default version and the total number of IAM users, groups, and roles to which the\\n            policy is attached. To retrieve the list of the specific users, groups, and roles that\\n            the policy is attached to, use <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListEntitiesForPolicy.html\\\">ListEntitiesForPolicy</a>. This operation returns metadata about the policy. To\\n            retrieve the actual policy document for a specific version of the policy, use <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetPolicyVersion.html\\\">GetPolicyVersion</a>.</p>\\n         <p>This operation retrieves information about managed policies. To retrieve information\\n            about an inline policy that is embedded with an IAM user, group, or role, use <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetUserPolicy.html\\\">GetUserPolicy</a>, <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetGroupPolicy.html\\\">GetGroupPolicy</a>, or\\n                <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetRolePolicy.html\\\">GetRolePolicy</a>.</p>\\n         <p>For more information about policies, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/policies-managed-vs-inline.html\\\">Managed policies and inline\\n                policies</a> in the <i>IAM User Guide</i>.</p>\",\n                \"smithy.api#suppress\": [\n                    \"WaitableTraitInvalidErrorType\"\n                ],\n                \"smithy.waiters#waitable\": {\n                    \"PolicyExists\": {\n                        \"acceptors\": [\n                            {\n                                \"state\": \"success\",\n                                \"matcher\": {\n                                    \"success\": true\n                                }\n                            },\n                            {\n                                \"state\": \"retry\",\n                                \"matcher\": {\n                                    \"errorType\": \"NoSuchEntity\"\n                                }\n                            }\n                        ],\n                        \"minDelay\": 1\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.iam#GetPolicyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PolicyArn\": {\n                    \"target\": \"com.amazonaws.iam#arnType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the managed policy that you want information\\n            about.</p>\\n         <p>For more information about ARNs, see <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html\\\">Amazon Resource Names (ARNs)</a> in the <i>Amazon Web Services General Reference</i>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#GetPolicyResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Policy\": {\n                    \"target\": \"com.amazonaws.iam#Policy\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A structure containing details about the policy.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the response to a successful <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetPolicy.html\\\">GetPolicy</a> request. </p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#GetPolicyVersion\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#GetPolicyVersionRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#GetPolicyVersionResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#InvalidInputException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Retrieves information about the specified version of the specified managed policy,\\n            including the policy document.</p>\\n         <note>\\n            <p>Policies returned by this operation are URL-encoded compliant \\n    with <a href=\\\"https://tools.ietf.org/html/rfc3986\\\">RFC 3986</a>. You can use a URL \\n    decoding method to convert the policy back to plain JSON text. For example, if you use Java, you \\n    can use the <code>decode</code> method of the <code>java.net.URLDecoder</code> utility class in \\n    the Java SDK. Other languages and SDKs provide similar functionality, and some SDKs do this decoding \\n    automatically.</p>\\n         </note>\\n         <p>To list the available versions for a policy, use <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListPolicyVersions.html\\\">ListPolicyVersions</a>.</p>\\n         <p>This operation retrieves information about managed policies. To retrieve information\\n            about an inline policy that is embedded in a user, group, or role, use <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetUserPolicy.html\\\">GetUserPolicy</a>, <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetGroupPolicy.html\\\">GetGroupPolicy</a>, or\\n                <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetRolePolicy.html\\\">GetRolePolicy</a>.</p>\\n         <p>For more information about the types of policies, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/policies-managed-vs-inline.html\\\">Managed policies and inline\\n                policies</a> in the <i>IAM User Guide</i>.</p>\\n         <p>For more information about managed policy versions, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/policies-managed-versions.html\\\">Versioning for managed\\n                policies</a> in the <i>IAM User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#GetPolicyVersionRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PolicyArn\": {\n                    \"target\": \"com.amazonaws.iam#arnType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the managed policy that you want information\\n            about.</p>\\n         <p>For more information about ARNs, see <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html\\\">Amazon Resource Names (ARNs)</a> in the <i>Amazon Web Services General Reference</i>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"VersionId\": {\n                    \"target\": \"com.amazonaws.iam#policyVersionIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Identifies the policy version to retrieve.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters that \\n    consists of the lowercase letter 'v' followed by one or two digits, and optionally \\n    followed by a period '.' and a string of letters and digits.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#GetPolicyVersionResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PolicyVersion\": {\n                    \"target\": \"com.amazonaws.iam#PolicyVersion\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A structure containing details about the policy version.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the response to a successful <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetPolicyVersion.html\\\">GetPolicyVersion</a> request.\\n    </p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#GetRole\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#GetRoleRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#GetRoleResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Retrieves information about the specified role, including the role's path, GUID, ARN,\\n            and the role's trust policy that grants permission to assume the role. For more\\n            information about roles, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html\\\">IAM roles</a> in the\\n                <i>IAM User Guide</i>.</p>\\n         <note>\\n            <p>Policies returned by this operation are URL-encoded compliant \\n    with <a href=\\\"https://tools.ietf.org/html/rfc3986\\\">RFC 3986</a>. You can use a URL \\n    decoding method to convert the policy back to plain JSON text. For example, if you use Java, you \\n    can use the <code>decode</code> method of the <code>java.net.URLDecoder</code> utility class in \\n    the Java SDK. Other languages and SDKs provide similar functionality, and some SDKs do this decoding \\n    automatically.</p>\\n         </note>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To get information about an IAM role\",\n                        \"documentation\": \"The following command gets information about the role named Test-Role.\",\n                        \"input\": {\n                            \"RoleName\": \"Test-Role\"\n                        },\n                        \"output\": {\n                            \"Role\": {\n                                \"Arn\": \"arn:aws:iam::123456789012:role/Test-Role\",\n                                \"AssumeRolePolicyDocument\": \"<URL-encoded-JSON>\",\n                                \"CreateDate\": \"2013-04-18T05:01:58Z\",\n                                \"MaxSessionDuration\": 3600,\n                                \"Path\": \"/\",\n                                \"RoleId\": \"AROADBQP57FF2AEXAMPLE\",\n                                \"RoleLastUsed\": {\n                                    \"LastUsedDate\": \"2019-11-18T05:01:58Z\",\n                                    \"Region\": \"us-east-1\"\n                                },\n                                \"RoleName\": \"Test-Role\"\n                            }\n                        }\n                    }\n                ],\n                \"smithy.api#suppress\": [\n                    \"WaitableTraitInvalidErrorType\"\n                ],\n                \"smithy.waiters#waitable\": {\n                    \"RoleExists\": {\n                        \"acceptors\": [\n                            {\n                                \"state\": \"success\",\n                                \"matcher\": {\n                                    \"success\": true\n                                }\n                            },\n                            {\n                                \"state\": \"retry\",\n                                \"matcher\": {\n                                    \"errorType\": \"NoSuchEntity\"\n                                }\n                            }\n                        ],\n                        \"minDelay\": 1\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.iam#GetRolePolicy\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#GetRolePolicyRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#GetRolePolicyResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Retrieves the specified inline policy document that is embedded with the specified\\n            IAM role.</p>\\n         <note>\\n            <p>Policies returned by this operation are URL-encoded compliant \\n    with <a href=\\\"https://tools.ietf.org/html/rfc3986\\\">RFC 3986</a>. You can use a URL \\n    decoding method to convert the policy back to plain JSON text. For example, if you use Java, you \\n    can use the <code>decode</code> method of the <code>java.net.URLDecoder</code> utility class in \\n    the Java SDK. Other languages and SDKs provide similar functionality, and some SDKs do this decoding \\n    automatically.</p>\\n         </note>\\n         <p>An IAM role can also have managed policies attached to it. To retrieve a managed\\n            policy document that is attached to a role, use <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetPolicy.html\\\">GetPolicy</a> to determine the\\n            policy's default version, then use <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetPolicyVersion.html\\\">GetPolicyVersion</a> to\\n            retrieve the policy document.</p>\\n         <p>For more information about policies, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/policies-managed-vs-inline.html\\\">Managed policies and inline\\n                policies</a> in the <i>IAM User Guide</i>.</p>\\n         <p> For more information about roles, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html\\\">IAM roles</a> in the\\n                <i>IAM User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#GetRolePolicyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RoleName\": {\n                    \"target\": \"com.amazonaws.iam#roleNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the role associated with the policy.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"PolicyName\": {\n                    \"target\": \"com.amazonaws.iam#policyNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the policy document to get.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#GetRolePolicyResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RoleName\": {\n                    \"target\": \"com.amazonaws.iam#roleNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The role the policy is associated with.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"PolicyName\": {\n                    \"target\": \"com.amazonaws.iam#policyNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the policy.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"PolicyDocument\": {\n                    \"target\": \"com.amazonaws.iam#policyDocumentType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The policy document.</p>\\n         <p>IAM stores policies in JSON format. However, resources that were created using CloudFormation\\n            templates can be formatted in YAML. CloudFormation always converts a YAML policy to JSON format\\n            before submitting it to IAM.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the response to a successful <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetRolePolicy.html\\\">GetRolePolicy</a> request. </p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#GetRoleRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RoleName\": {\n                    \"target\": \"com.amazonaws.iam#roleNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the IAM role to get information about.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#GetRoleResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Role\": {\n                    \"target\": \"com.amazonaws.iam#Role\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A structure containing details about the IAM role.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the response to a successful <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetRole.html\\\">GetRole</a> request. </p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#GetSAMLProvider\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#GetSAMLProviderRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#GetSAMLProviderResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#InvalidInputException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns the SAML provider metadocument that was uploaded when the IAM SAML provider\\n            resource object was created or updated.</p>\\n         <note>\\n            <p>This operation requires <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html\\\">Signature Version 4</a>.</p>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.iam#GetSAMLProviderRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SAMLProviderArn\": {\n                    \"target\": \"com.amazonaws.iam#arnType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the SAML provider resource object in IAM to get\\n            information about.</p>\\n         <p>For more information about ARNs, see <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html\\\">Amazon Resource Names (ARNs)</a> in the <i>Amazon Web Services General Reference</i>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#GetSAMLProviderResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SAMLProviderUUID\": {\n                    \"target\": \"com.amazonaws.iam#privateKeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The unique identifier assigned to the SAML provider.</p>\"\n                    }\n                },\n                \"SAMLMetadataDocument\": {\n                    \"target\": \"com.amazonaws.iam#SAMLMetadataDocumentType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The XML metadata document that includes information about an identity provider.</p>\"\n                    }\n                },\n                \"CreateDate\": {\n                    \"target\": \"com.amazonaws.iam#dateType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time when the SAML provider was created.</p>\"\n                    }\n                },\n                \"ValidUntil\": {\n                    \"target\": \"com.amazonaws.iam#dateType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The expiration date and time for the SAML provider.</p>\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.iam#tagListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of tags that are attached to the specified IAM SAML provider. The returned list of tags is sorted by tag key.\\n      For more information about tagging, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_tags.html\\\">Tagging IAM resources</a> in the\\n      <i>IAM User Guide</i>.</p>\"\n                    }\n                },\n                \"AssertionEncryptionMode\": {\n                    \"target\": \"com.amazonaws.iam#assertionEncryptionModeType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the encryption setting for the SAML provider.</p>\"\n                    }\n                },\n                \"PrivateKeyList\": {\n                    \"target\": \"com.amazonaws.iam#privateKeyList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The private key metadata for the SAML provider.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the response to a successful <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetSAMLProvider.html\\\">GetSAMLProvider</a> request.\\n    </p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#GetSSHPublicKey\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#GetSSHPublicKeyRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#GetSSHPublicKeyResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#UnrecognizedPublicKeyEncodingException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Retrieves the specified SSH public key, including metadata about the key.</p>\\n         <p>The SSH public key retrieved by this operation is used only for authenticating the\\n            associated IAM user to an CodeCommit repository. For more information about using SSH keys\\n            to authenticate to an CodeCommit repository, see <a href=\\\"https://docs.aws.amazon.com/codecommit/latest/userguide/setting-up-credentials-ssh.html\\\">Set up CodeCommit for SSH\\n                connections</a> in the <i>CodeCommit User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#GetSSHPublicKeyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"UserName\": {\n                    \"target\": \"com.amazonaws.iam#userNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the IAM user associated with the SSH public key.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"SSHPublicKeyId\": {\n                    \"target\": \"com.amazonaws.iam#publicKeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The unique identifier for the SSH public key.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters that can \\n    consist of any upper or lowercased letter or digit.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Encoding\": {\n                    \"target\": \"com.amazonaws.iam#encodingType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the public key encoding format to use in the response. To retrieve the\\n            public key in ssh-rsa format, use <code>SSH</code>. To retrieve the public key in PEM\\n            format, use <code>PEM</code>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#GetSSHPublicKeyResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SSHPublicKey\": {\n                    \"target\": \"com.amazonaws.iam#SSHPublicKey\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A structure containing details about the SSH public key.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the response to a successful <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetSSHPublicKey.html\\\">GetSSHPublicKey</a>\\n      request.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#GetServerCertificate\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#GetServerCertificateRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#GetServerCertificateResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Retrieves information about the specified server certificate stored in IAM.</p>\\n         <p>For more information about working with server certificates, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_server-certs.html\\\">Working\\n                with server certificates</a> in the <i>IAM User Guide</i>. This\\n            topic includes a list of Amazon Web Services services that can use the server certificates that you\\n            manage with IAM.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#GetServerCertificateRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ServerCertificateName\": {\n                    \"target\": \"com.amazonaws.iam#serverCertificateNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the server certificate you want to retrieve information about.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#GetServerCertificateResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ServerCertificate\": {\n                    \"target\": \"com.amazonaws.iam#ServerCertificate\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A structure containing details about the server certificate.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the response to a successful <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetServerCertificate.html\\\">GetServerCertificate</a>\\n      request. </p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#GetServiceLastAccessedDetails\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#GetServiceLastAccessedDetailsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#GetServiceLastAccessedDetailsResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#InvalidInputException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Retrieves a service last accessed report that was created using the\\n                <code>GenerateServiceLastAccessedDetails</code> operation. You can use the\\n                <code>JobId</code> parameter in <code>GetServiceLastAccessedDetails</code> to\\n            retrieve the status of your report job. When the report is complete, you can retrieve\\n            the generated report. The report includes a list of Amazon Web Services services that the resource\\n            (user, group, role, or managed policy) can access.</p>\\n         <note>\\n            <p>Service last accessed data does not use other policy types when determining\\n                whether a resource could access a service. These other policy types include\\n                resource-based policies, access control lists, Organizations policies, IAM permissions\\n                boundaries, and STS assume role policies. It only applies permissions policy\\n                logic. For more about the evaluation of policy types, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_evaluation-logic.html#policy-eval-basics\\\">Evaluating policies</a> in the\\n                <i>IAM User Guide</i>.</p>\\n         </note>\\n         <p>For each service that the resource could access using permissions policies, the\\n            operation returns details about the most recent access attempt. If there was no attempt,\\n            the service is listed without details about the most recent attempt to access the\\n            service. If the operation fails, the <code>GetServiceLastAccessedDetails</code>\\n            operation returns the reason that it failed.</p>\\n         <p>The <code>GetServiceLastAccessedDetails</code> operation returns a list of services.\\n            This list includes the number of entities that have attempted to access the service and\\n            the date and time of the last attempt. It also returns the ARN of the following entity,\\n            depending on the resource ARN that you used to generate the report:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <b>User</b> – Returns the user ARN that you\\n                    used to generate the report</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>Group</b> – Returns the ARN of the group\\n                    member (user) that last attempted to access the service</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>Role</b> – Returns the role ARN that you\\n                    used to generate the report</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>Policy</b> – Returns the ARN of the user\\n                    or role that last used the policy to attempt to access the service</p>\\n            </li>\\n         </ul>\\n         <p>By default, the list is sorted by service namespace.</p>\\n         <p>If you specified <code>ACTION_LEVEL</code> granularity when you generated the report,\\n            this operation returns service and action last accessed data. This includes the most\\n            recent access attempt for each tracked action within a service. Otherwise, this\\n            operation returns only service data.</p>\\n         <p>For more information about service and action last accessed data, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_access-advisor.html\\\">Reducing permissions using service last accessed data</a> in the\\n                <i>IAM User Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To get details from a previously-generated report\",\n                        \"documentation\": \"The following operation gets details about the report with the job ID: examplef-1305-c245-eba4-71fe298bcda7\",\n                        \"input\": {\n                            \"JobId\": \"examplef-1305-c245-eba4-71fe298bcda7\"\n                        },\n                        \"output\": {\n                            \"JobStatus\": \"COMPLETED\",\n                            \"JobCreationDate\": \"2018-10-24T19:47:31.466Z\",\n                            \"ServicesLastAccessed\": [\n                                {\n                                    \"TotalAuthenticatedEntities\": 2,\n                                    \"LastAuthenticated\": \"2018-10-24T19:11:00Z\",\n                                    \"ServiceNamespace\": \"iam\",\n                                    \"LastAuthenticatedEntity\": \"arn:aws:iam::123456789012:user/AWSExampleUser01\",\n                                    \"ServiceName\": \"AWS Identity and Access Management\"\n                                },\n                                {\n                                    \"TotalAuthenticatedEntities\": 0,\n                                    \"ServiceNamespace\": \"s3\",\n                                    \"ServiceName\": \"Amazon Simple Storage Service\"\n                                }\n                            ],\n                            \"JobCompletionDate\": \"2018-10-24T19:47:35.241Z\",\n                            \"IsTruncated\": false\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.iam#GetServiceLastAccessedDetailsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"JobId\": {\n                    \"target\": \"com.amazonaws.iam#jobIDType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the request generated by the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GenerateServiceLastAccessedDetails.html\\\">GenerateServiceLastAccessedDetails</a> operation. The <code>JobId</code>\\n            returned by <code>GenerateServiceLastAccessedDetail</code> must be used by the same role\\n            within a session, or by the same user when used to call\\n                <code>GetServiceLastAccessedDetail</code>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"MaxItems\": {\n                    \"target\": \"com.amazonaws.iam#maxItemsType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this only when paginating results to indicate the \\n    maximum number of items you want in the response. If additional items exist beyond the maximum \\n    you specify, the <code>IsTruncated</code> response element is <code>true</code>.</p>\\n         <p>If you do not include this parameter, the number of items defaults to 100. Note that\\n    IAM might return fewer results, even when there are more results available. In that case, the\\n    <code>IsTruncated</code> response element returns <code>true</code>, and <code>Marker</code> \\n    contains a value to include in the subsequent call that tells the service where to continue \\n    from.</p>\"\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.iam#markerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter only when paginating results and only after \\n    you receive a response indicating that the results are truncated. Set it to the value of the\\n    <code>Marker</code> element in the response that you received to indicate where the next call \\n    should start.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#GetServiceLastAccessedDetailsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"JobStatus\": {\n                    \"target\": \"com.amazonaws.iam#jobStatusType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The status of the job.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"JobType\": {\n                    \"target\": \"com.amazonaws.iam#AccessAdvisorUsageGranularityType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of job. Service jobs return information about when each service was last\\n            accessed. Action jobs also include information about when tracked actions within the\\n            service were last accessed.</p>\"\n                    }\n                },\n                \"JobCreationDate\": {\n                    \"target\": \"com.amazonaws.iam#dateType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time, in <a href=\\\"http://www.iso.org/iso/iso8601\\\">ISO 8601 date-time\\n                format</a>, when the report job was created.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ServicesLastAccessed\": {\n                    \"target\": \"com.amazonaws.iam#ServicesLastAccessed\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> A <code>ServiceLastAccessed</code> object that contains details about the most recent\\n            attempt to access the service.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"JobCompletionDate\": {\n                    \"target\": \"com.amazonaws.iam#dateType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time, in <a href=\\\"http://www.iso.org/iso/iso8601\\\">ISO 8601 date-time\\n                format</a>, when the generated report job was completed or failed.</p>\\n         <p>This field is null if the job is still in progress, as indicated by a job status value\\n            of <code>IN_PROGRESS</code>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"IsTruncated\": {\n                    \"target\": \"com.amazonaws.iam#booleanType\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>A flag that indicates whether there are more items to return. If your \\n    results were truncated, you can make a subsequent pagination request using the <code>Marker</code>\\n    request parameter to retrieve more items. Note that IAM might return fewer than the \\n    <code>MaxItems</code> number of results even when there are more results available. We recommend \\n    that you check <code>IsTruncated</code> after every call to ensure that you receive all your \\n    results.</p>\"\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.iam#responseMarkerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>When <code>IsTruncated</code> is <code>true</code>, this element\\n    is present and contains the value to use for the <code>Marker</code> parameter in a subsequent \\n    pagination request.</p>\"\n                    }\n                },\n                \"Error\": {\n                    \"target\": \"com.amazonaws.iam#ErrorDetails\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An object that contains details about the reason the operation failed.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#GetServiceLastAccessedDetailsWithEntities\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#GetServiceLastAccessedDetailsWithEntitiesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#GetServiceLastAccessedDetailsWithEntitiesResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#InvalidInputException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>After you generate a group or policy report using the\\n                <code>GenerateServiceLastAccessedDetails</code> operation, you can use the\\n                <code>JobId</code> parameter in\\n                <code>GetServiceLastAccessedDetailsWithEntities</code>. This operation retrieves the\\n            status of your report job and a list of entities that could have used group or policy\\n            permissions to access the specified service.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <b>Group</b> – For a group report, this\\n                    operation returns a list of users in the group that could have used the group’s\\n                    policies in an attempt to access the service.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>Policy</b> – For a policy report, this\\n                    operation returns a list of entities (users or roles) that could have used the\\n                    policy in an attempt to access the service.</p>\\n            </li>\\n         </ul>\\n         <p>You can also use this operation for user or role reports to retrieve details about\\n            those entities.</p>\\n         <p>If the operation fails, the <code>GetServiceLastAccessedDetailsWithEntities</code>\\n            operation returns the reason that it failed.</p>\\n         <p>By default, the list of associated entities is sorted by date, with the most recent\\n            access listed first.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To get sntity details from a previously-generated report\",\n                        \"documentation\": \"The following operation returns details about the entities that attempted to access the IAM service.\",\n                        \"input\": {\n                            \"JobId\": \"examplef-1305-c245-eba4-71fe298bcda7\",\n                            \"ServiceNamespace\": \"iam\"\n                        },\n                        \"output\": {\n                            \"JobStatus\": \"COMPLETED\",\n                            \"JobCreationDate\": \"2018-10-24T19:47:31.466Z\",\n                            \"JobCompletionDate\": \"2018-10-24T19:47:35.241Z\",\n                            \"EntityDetailsList\": [\n                                {\n                                    \"EntityInfo\": {\n                                        \"Id\": \"AIDAEX2EXAMPLEB6IGCDC\",\n                                        \"Name\": \"AWSExampleUser01\",\n                                        \"Type\": \"USER\",\n                                        \"Path\": \"/\",\n                                        \"Arn\": \"arn:aws:iam::123456789012:user/AWSExampleUser01\"\n                                    },\n                                    \"LastAuthenticated\": \"2018-10-24T19:10:00Z\"\n                                },\n                                {\n                                    \"EntityInfo\": {\n                                        \"Id\": \"AROAEAEXAMPLEIANXSIU4\",\n                                        \"Name\": \"AWSExampleRole01\",\n                                        \"Type\": \"ROLE\",\n                                        \"Path\": \"/\",\n                                        \"Arn\": \"arn:aws:iam::123456789012:role/AWSExampleRole01\"\n                                    }\n                                }\n                            ],\n                            \"IsTruncated\": false\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.iam#GetServiceLastAccessedDetailsWithEntitiesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"JobId\": {\n                    \"target\": \"com.amazonaws.iam#jobIDType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the request generated by the <code>GenerateServiceLastAccessedDetails</code>\\n            operation.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ServiceNamespace\": {\n                    \"target\": \"com.amazonaws.iam#serviceNamespaceType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The service namespace for an Amazon Web Services service. Provide the service namespace to learn\\n            when the IAM entity last attempted to access the specified service.</p>\\n         <p>To learn the service namespace for a service, see <a href=\\\"https://docs.aws.amazon.com/service-authorization/latest/reference/reference_policies_actions-resources-contextkeys.html\\\">Actions, resources, and condition keys for Amazon Web Services services</a> in the\\n                <i>IAM User Guide</i>. Choose the name of the service to view\\n            details for that service. In the first paragraph, find the service prefix. For example,\\n                <code>(service prefix: a4b)</code>. For more information about service namespaces,\\n            see <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html#genref-aws-service-namespaces\\\">Amazon Web Services\\n                service namespaces</a> in the <i>Amazon Web Services General Reference</i>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"MaxItems\": {\n                    \"target\": \"com.amazonaws.iam#maxItemsType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this only when paginating results to indicate the \\n    maximum number of items you want in the response. If additional items exist beyond the maximum \\n    you specify, the <code>IsTruncated</code> response element is <code>true</code>.</p>\\n         <p>If you do not include this parameter, the number of items defaults to 100. Note that\\n    IAM might return fewer results, even when there are more results available. In that case, the\\n    <code>IsTruncated</code> response element returns <code>true</code>, and <code>Marker</code> \\n    contains a value to include in the subsequent call that tells the service where to continue \\n    from.</p>\"\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.iam#markerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter only when paginating results and only after \\n    you receive a response indicating that the results are truncated. Set it to the value of the\\n    <code>Marker</code> element in the response that you received to indicate where the next call \\n    should start.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#GetServiceLastAccessedDetailsWithEntitiesResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"JobStatus\": {\n                    \"target\": \"com.amazonaws.iam#jobStatusType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The status of the job.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"JobCreationDate\": {\n                    \"target\": \"com.amazonaws.iam#dateType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time, in <a href=\\\"http://www.iso.org/iso/iso8601\\\">ISO 8601 date-time\\n                format</a>, when the report job was created.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"JobCompletionDate\": {\n                    \"target\": \"com.amazonaws.iam#dateType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time, in <a href=\\\"http://www.iso.org/iso/iso8601\\\">ISO 8601 date-time\\n                format</a>, when the generated report job was completed or failed.</p>\\n         <p>This field is null if the job is still in progress, as indicated by a job status value\\n            of <code>IN_PROGRESS</code>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"EntityDetailsList\": {\n                    \"target\": \"com.amazonaws.iam#entityDetailsListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An <code>EntityDetailsList</code> object that contains details about when an IAM\\n            entity (user or role) used group or policy permissions in an attempt to access the\\n            specified Amazon Web Services service.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"IsTruncated\": {\n                    \"target\": \"com.amazonaws.iam#booleanType\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>A flag that indicates whether there are more items to return. If your \\n    results were truncated, you can make a subsequent pagination request using the <code>Marker</code>\\n    request parameter to retrieve more items. Note that IAM might return fewer than the \\n    <code>MaxItems</code> number of results even when there are more results available. We recommend \\n    that you check <code>IsTruncated</code> after every call to ensure that you receive all your \\n    results.</p>\"\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.iam#responseMarkerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>When <code>IsTruncated</code> is <code>true</code>, this element\\n    is present and contains the value to use for the <code>Marker</code> parameter in a subsequent \\n    pagination request.</p>\"\n                    }\n                },\n                \"Error\": {\n                    \"target\": \"com.amazonaws.iam#ErrorDetails\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An object that contains details about the reason the operation failed.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#GetServiceLinkedRoleDeletionStatus\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#GetServiceLinkedRoleDeletionStatusRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#GetServiceLinkedRoleDeletionStatusResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#InvalidInputException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Retrieves the status of your service-linked role deletion. After you use <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_DeleteServiceLinkedRole.html\\\">DeleteServiceLinkedRole</a> to submit a service-linked role for deletion, you\\n            can use the <code>DeletionTaskId</code> parameter in\\n                <code>GetServiceLinkedRoleDeletionStatus</code> to check the status of the deletion.\\n            If the deletion fails, this operation returns the reason that it failed, if that\\n            information is returned by the service.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#GetServiceLinkedRoleDeletionStatusRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DeletionTaskId\": {\n                    \"target\": \"com.amazonaws.iam#DeletionTaskIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The deletion task identifier. This identifier is returned by the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_DeleteServiceLinkedRole.html\\\">DeleteServiceLinkedRole</a> operation in the format\\n                <code>task/aws-service-role/<service-principal-name>/<role-name>/<task-uuid></code>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#GetServiceLinkedRoleDeletionStatusResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Status\": {\n                    \"target\": \"com.amazonaws.iam#DeletionTaskStatusType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The status of the deletion.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Reason\": {\n                    \"target\": \"com.amazonaws.iam#DeletionTaskFailureReasonType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An object that contains details about the reason the deletion failed.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#GetUser\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#GetUserRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#GetUserResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Retrieves information about the specified IAM user, including the user's creation\\n            date, path, unique ID, and ARN.</p>\\n         <p>If you do not specify a user name, IAM determines the user name implicitly based on\\n            the Amazon Web Services access key ID used to sign the request to this operation.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To get information about an IAM user\",\n                        \"documentation\": \"The following command gets information about the IAM user named Bob.\",\n                        \"input\": {\n                            \"UserName\": \"Bob\"\n                        },\n                        \"output\": {\n                            \"User\": {\n                                \"UserName\": \"Bob\",\n                                \"Path\": \"/\",\n                                \"CreateDate\": \"2012-09-21T23:03:13Z\",\n                                \"UserId\": \"AKIAIOSFODNN7EXAMPLE\",\n                                \"Arn\": \"arn:aws:iam::123456789012:user/Bob\"\n                            }\n                        }\n                    }\n                ],\n                \"smithy.api#suppress\": [\n                    \"WaitableTraitInvalidErrorType\"\n                ],\n                \"smithy.test#smokeTests\": [\n                    {\n                        \"id\": \"GetUserFailure\",\n                        \"params\": {\n                            \"UserName\": \"fake_user\"\n                        },\n                        \"vendorParams\": {\n                            \"region\": \"us-east-1\"\n                        },\n                        \"vendorParamsShape\": \"aws.test#AwsVendorParams\",\n                        \"expect\": {\n                            \"failure\": {}\n                        }\n                    }\n                ],\n                \"smithy.waiters#waitable\": {\n                    \"UserExists\": {\n                        \"acceptors\": [\n                            {\n                                \"state\": \"success\",\n                                \"matcher\": {\n                                    \"success\": true\n                                }\n                            },\n                            {\n                                \"state\": \"retry\",\n                                \"matcher\": {\n                                    \"errorType\": \"NoSuchEntity\"\n                                }\n                            }\n                        ],\n                        \"minDelay\": 1\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.iam#GetUserPolicy\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#GetUserPolicyRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#GetUserPolicyResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Retrieves the specified inline policy document that is embedded in the specified IAM\\n            user.</p>\\n         <note>\\n            <p>Policies returned by this operation are URL-encoded compliant \\n    with <a href=\\\"https://tools.ietf.org/html/rfc3986\\\">RFC 3986</a>. You can use a URL \\n    decoding method to convert the policy back to plain JSON text. For example, if you use Java, you \\n    can use the <code>decode</code> method of the <code>java.net.URLDecoder</code> utility class in \\n    the Java SDK. Other languages and SDKs provide similar functionality, and some SDKs do this decoding \\n    automatically.</p>\\n         </note>\\n         <p>An IAM user can also have managed policies attached to it. To retrieve a managed\\n            policy document that is attached to a user, use <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetPolicy.html\\\">GetPolicy</a> to determine the\\n            policy's default version. Then use <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetPolicyVersion.html\\\">GetPolicyVersion</a> to\\n            retrieve the policy document.</p>\\n         <p>For more information about policies, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/policies-managed-vs-inline.html\\\">Managed policies and inline\\n                policies</a> in the <i>IAM User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#GetUserPolicyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"UserName\": {\n                    \"target\": \"com.amazonaws.iam#existingUserNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the user who the policy is associated with.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"PolicyName\": {\n                    \"target\": \"com.amazonaws.iam#policyNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the policy document to get.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#GetUserPolicyResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"UserName\": {\n                    \"target\": \"com.amazonaws.iam#existingUserNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The user the policy is associated with.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"PolicyName\": {\n                    \"target\": \"com.amazonaws.iam#policyNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the policy.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"PolicyDocument\": {\n                    \"target\": \"com.amazonaws.iam#policyDocumentType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The policy document.</p>\\n         <p>IAM stores policies in JSON format. However, resources that were created using CloudFormation\\n            templates can be formatted in YAML. CloudFormation always converts a YAML policy to JSON format\\n            before submitting it to IAM.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the response to a successful <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetUserPolicy.html\\\">GetUserPolicy</a> request. </p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#GetUserRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"UserName\": {\n                    \"target\": \"com.amazonaws.iam#existingUserNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the user to get information about.</p>\\n         <p>This parameter is optional. If it is not included, it defaults to the user making the\\n            request. This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#GetUserResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"User\": {\n                    \"target\": \"com.amazonaws.iam#User\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A structure containing details about the IAM user.</p>\\n         <important>\\n            <p>Due to a service issue, password last used data does not include password use from\\n                May 3, 2018 22:50 PDT to May 23, 2018 14:08 PDT. This affects <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_finding-unused.html\\\">last sign-in</a> dates shown in the IAM console and password last used\\n                dates in the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_getting-report.html\\\">IAM credential\\n                    report</a>, and returned by this operation. If users signed in during the\\n                affected time, the password last used date that is returned is the date the user\\n                last signed in before May 3, 2018. For users that signed in after May 23, 2018 14:08\\n                PDT, the returned password last used date is accurate.</p>\\n            <p>You can use password last used information to identify unused credentials for\\n                deletion. For example, you might delete users who did not sign in to Amazon Web Services in the\\n                last 90 days. In cases like this, we recommend that you adjust your evaluation\\n                window to include dates after May 23, 2018. Alternatively, if your users use access\\n                keys to access Amazon Web Services programmatically you can refer to access key last used\\n                information because it is accurate for all dates. </p>\\n         </important>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the response to a successful <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetUser.html\\\">GetUser</a> request. </p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#Group\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Path\": {\n                    \"target\": \"com.amazonaws.iam#pathType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The path to the group. For more information about paths, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/Using_Identifiers.html\\\">IAM identifiers</a> in the\\n            <i>IAM User Guide</i>. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"GroupName\": {\n                    \"target\": \"com.amazonaws.iam#groupNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The friendly name that identifies the group.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"GroupId\": {\n                    \"target\": \"com.amazonaws.iam#idType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The stable and unique string identifying the group. For more information about IDs, see\\n            <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/Using_Identifiers.html\\\">IAM\\n            identifiers</a> in the <i>IAM User Guide</i>. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Arn\": {\n                    \"target\": \"com.amazonaws.iam#arnType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The Amazon Resource Name (ARN) specifying the group. For more information about ARNs\\n         and how to use them in policies, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/Using_Identifiers.html\\\">IAM identifiers</a> in the\\n            <i>IAM User Guide</i>. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"CreateDate\": {\n                    \"target\": \"com.amazonaws.iam#dateType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time, in <a href=\\\"http://www.iso.org/iso/iso8601\\\">ISO 8601 date-time\\n            format</a>, when the group was created.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains information about an IAM group entity.</p>\\n         <p>This data type is used as a response element in the following operations:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateGroup.html\\\">CreateGroup</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetGroup.html\\\">GetGroup</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListGroups.html\\\">ListGroups</a>\\n               </p>\\n            </li>\\n         </ul>\"\n            }\n        },\n        \"com.amazonaws.iam#GroupDetail\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Path\": {\n                    \"target\": \"com.amazonaws.iam#pathType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The path to the group. For more information about paths, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/Using_Identifiers.html\\\">IAM identifiers</a> in the\\n            <i>IAM User Guide</i>.</p>\"\n                    }\n                },\n                \"GroupName\": {\n                    \"target\": \"com.amazonaws.iam#groupNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The friendly name that identifies the group.</p>\"\n                    }\n                },\n                \"GroupId\": {\n                    \"target\": \"com.amazonaws.iam#idType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The stable and unique string identifying the group. For more information about IDs, see\\n            <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/Using_Identifiers.html\\\">IAM\\n            identifiers</a> in the <i>IAM User Guide</i>.</p>\"\n                    }\n                },\n                \"Arn\": {\n                    \"target\": \"com.amazonaws.iam#arnType\"\n                },\n                \"CreateDate\": {\n                    \"target\": \"com.amazonaws.iam#dateType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time, in <a href=\\\"http://www.iso.org/iso/iso8601\\\">ISO 8601 date-time\\n            format</a>, when the group was created.</p>\"\n                    }\n                },\n                \"GroupPolicyList\": {\n                    \"target\": \"com.amazonaws.iam#policyDetailListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of the inline policies embedded in the group.</p>\"\n                    }\n                },\n                \"AttachedManagedPolicies\": {\n                    \"target\": \"com.amazonaws.iam#attachedPoliciesListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of the managed policies attached to the group.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains information about an IAM group, including all of the group's policies.</p>\\n         <p>This data type is used as a response element in the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetAccountAuthorizationDetails.html\\\">GetAccountAuthorizationDetails</a> operation.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#InstanceProfile\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Path\": {\n                    \"target\": \"com.amazonaws.iam#pathType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The path to the instance profile. For more information about paths, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/Using_Identifiers.html\\\">IAM\\n            identifiers</a> in the <i>IAM User Guide</i>. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"InstanceProfileName\": {\n                    \"target\": \"com.amazonaws.iam#instanceProfileNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name identifying the instance profile.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"InstanceProfileId\": {\n                    \"target\": \"com.amazonaws.iam#idType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The stable and unique string identifying the instance profile. For more information\\n         about IDs, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/Using_Identifiers.html\\\">IAM identifiers</a> in the <i>IAM User Guide</i>. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Arn\": {\n                    \"target\": \"com.amazonaws.iam#arnType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The Amazon Resource Name (ARN) specifying the instance profile. For more information\\n         about ARNs and how to use them in policies, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/Using_Identifiers.html\\\">IAM identifiers</a> in the\\n            <i>IAM User Guide</i>. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"CreateDate\": {\n                    \"target\": \"com.amazonaws.iam#dateType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date when the instance profile was created.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Roles\": {\n                    \"target\": \"com.amazonaws.iam#roleListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The role associated with the instance profile.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.iam#tagListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of tags that are attached to the instance profile. For more information about tagging, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_tags.html\\\">Tagging IAM resources</a> in the\\n      <i>IAM User Guide</i>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains information about an instance profile.</p>\\n         <p>This data type is used as a response element in the following operations:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateInstanceProfile.html\\\">CreateInstanceProfile</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetInstanceProfile.html\\\">GetInstanceProfile</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListInstanceProfiles.html\\\">ListInstanceProfiles</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListInstanceProfilesForRole.html\\\">ListInstanceProfilesForRole</a>\\n               </p>\\n            </li>\\n         </ul>\"\n            }\n        },\n        \"com.amazonaws.iam#InvalidAuthenticationCodeException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.iam#invalidAuthenticationCodeMessage\"\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"InvalidAuthenticationCode\",\n                    \"httpResponseCode\": 403\n                },\n                \"smithy.api#documentation\": \"<p>The request was rejected because the authentication code was not recognized. The error\\n      message describes the specific error.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 403\n            }\n        },\n        \"com.amazonaws.iam#InvalidCertificateException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.iam#invalidCertificateMessage\"\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"InvalidCertificate\",\n                    \"httpResponseCode\": 400\n                },\n                \"smithy.api#documentation\": \"<p>The request was rejected because the certificate is invalid.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.iam#InvalidInputException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.iam#invalidInputMessage\"\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"InvalidInput\",\n                    \"httpResponseCode\": 400\n                },\n                \"smithy.api#documentation\": \"<p>The request was rejected because an invalid or out-of-range value was supplied for an\\n      input parameter.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.iam#InvalidPublicKeyException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.iam#invalidPublicKeyMessage\"\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"InvalidPublicKey\",\n                    \"httpResponseCode\": 400\n                },\n                \"smithy.api#documentation\": \"<p>The request was rejected because the public key is malformed or otherwise invalid.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.iam#InvalidUserTypeException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.iam#invalidUserTypeMessage\"\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"InvalidUserType\",\n                    \"httpResponseCode\": 400\n                },\n                \"smithy.api#documentation\": \"<p>The request was rejected because the type of user for the transaction was\\n      incorrect.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.iam#KeyPairMismatchException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.iam#keyPairMismatchMessage\"\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"KeyPairMismatch\",\n                    \"httpResponseCode\": 400\n                },\n                \"smithy.api#documentation\": \"<p>The request was rejected because the public key certificate and the private key do not\\n      match.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.iam#LimitExceededException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.iam#limitExceededMessage\"\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"LimitExceeded\",\n                    \"httpResponseCode\": 409\n                },\n                \"smithy.api#documentation\": \"<p>The request was rejected because it attempted to create resources beyond the current\\n      Amazon Web Services account limits. The error message describes the limit exceeded.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 409\n            }\n        },\n        \"com.amazonaws.iam#LineNumber\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#default\": 0\n            }\n        },\n        \"com.amazonaws.iam#ListAccessKeys\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#ListAccessKeysRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#ListAccessKeysResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns information about the access key IDs associated with the specified IAM user.\\n            If there is none, the operation returns an empty list.</p>\\n         <p>Although each user is limited to a small number of keys, you can still paginate the\\n            results using the <code>MaxItems</code> and <code>Marker</code> parameters.</p>\\n         <p>If the <code>UserName</code> is not specified, the user name is determined implicitly\\n            based on the Amazon Web Services access key ID used to sign the request. If a temporary access key is\\n            used, then <code>UserName</code> is required. If a long-term key is assigned to the\\n            user, then <code>UserName</code> is not required.</p>\\n         <p>This operation works for access keys under the Amazon Web Services account. If the Amazon Web Services account has\\n            no associated users, the root user returns it's own access key IDs by running this\\n            command.</p>\\n         <note>\\n            <p>To ensure the security of your Amazon Web Services account, the secret access key is accessible\\n                only during key and user creation.</p>\\n         </note>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To list the access key IDs for an IAM user\",\n                        \"documentation\": \"The following command lists the access keys IDs for the IAM user named Alice.\",\n                        \"input\": {\n                            \"UserName\": \"Alice\"\n                        },\n                        \"output\": {\n                            \"AccessKeyMetadata\": [\n                                {\n                                    \"UserName\": \"Alice\",\n                                    \"Status\": \"Active\",\n                                    \"CreateDate\": \"2016-12-01T22:19:58Z\",\n                                    \"AccessKeyId\": \"AKIA111111111EXAMPLE\"\n                                },\n                                {\n                                    \"UserName\": \"Alice\",\n                                    \"Status\": \"Active\",\n                                    \"CreateDate\": \"2016-12-01T22:20:01Z\",\n                                    \"AccessKeyId\": \"AKIA222222222EXAMPLE\"\n                                }\n                            ]\n                        }\n                    }\n                ],\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"Marker\",\n                    \"outputToken\": \"Marker\",\n                    \"items\": \"AccessKeyMetadata\",\n                    \"pageSize\": \"MaxItems\"\n                }\n            }\n        },\n        \"com.amazonaws.iam#ListAccessKeysRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"UserName\": {\n                    \"target\": \"com.amazonaws.iam#existingUserNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the user.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\"\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.iam#markerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter only when paginating results and only after \\n    you receive a response indicating that the results are truncated. Set it to the value of the\\n    <code>Marker</code> element in the response that you received to indicate where the next call \\n    should start.</p>\"\n                    }\n                },\n                \"MaxItems\": {\n                    \"target\": \"com.amazonaws.iam#maxItemsType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this only when paginating results to indicate the \\n    maximum number of items you want in the response. If additional items exist beyond the maximum \\n    you specify, the <code>IsTruncated</code> response element is <code>true</code>.</p>\\n         <p>If you do not include this parameter, the number of items defaults to 100. Note that\\n    IAM might return fewer results, even when there are more results available. In that case, the\\n    <code>IsTruncated</code> response element returns <code>true</code>, and <code>Marker</code> \\n    contains a value to include in the subsequent call that tells the service where to continue \\n    from.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#ListAccessKeysResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccessKeyMetadata\": {\n                    \"target\": \"com.amazonaws.iam#accessKeyMetadataListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of objects containing metadata about the access keys.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"IsTruncated\": {\n                    \"target\": \"com.amazonaws.iam#booleanType\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>A flag that indicates whether there are more items to return. If your \\n    results were truncated, you can make a subsequent pagination request using the <code>Marker</code>\\n    request parameter to retrieve more items. Note that IAM might return fewer than the \\n    <code>MaxItems</code> number of results even when there are more results available. We recommend \\n    that you check <code>IsTruncated</code> after every call to ensure that you receive all your \\n    results.</p>\"\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.iam#responseMarkerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>When <code>IsTruncated</code> is <code>true</code>, this element\\n    is present and contains the value to use for the <code>Marker</code> parameter in a subsequent \\n    pagination request.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the response to a successful <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListAccessKeys.html\\\">ListAccessKeys</a> request.\\n    </p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#ListAccountAliases\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#ListAccountAliasesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#ListAccountAliasesResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Lists the account alias associated with the Amazon Web Services account (Note: you can have only\\n            one). For information about using an Amazon Web Services account alias, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/console_account-alias.html#CreateAccountAlias\\\">Creating,\\n                deleting, and listing an Amazon Web Services account alias</a> in the\\n                <i>IAM User Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To list account aliases\",\n                        \"documentation\": \"The following command lists the aliases for the current account.\",\n                        \"output\": {\n                            \"AccountAliases\": [\n                                \"exmaple-corporation\"\n                            ]\n                        }\n                    }\n                ],\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"Marker\",\n                    \"outputToken\": \"Marker\",\n                    \"items\": \"AccountAliases\",\n                    \"pageSize\": \"MaxItems\"\n                }\n            }\n        },\n        \"com.amazonaws.iam#ListAccountAliasesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.iam#markerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter only when paginating results and only after \\n    you receive a response indicating that the results are truncated. Set it to the value of the\\n    <code>Marker</code> element in the response that you received to indicate where the next call \\n    should start.</p>\"\n                    }\n                },\n                \"MaxItems\": {\n                    \"target\": \"com.amazonaws.iam#maxItemsType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this only when paginating results to indicate the \\n    maximum number of items you want in the response. If additional items exist beyond the maximum \\n    you specify, the <code>IsTruncated</code> response element is <code>true</code>.</p>\\n         <p>If you do not include this parameter, the number of items defaults to 100. Note that\\n    IAM might return fewer results, even when there are more results available. In that case, the\\n    <code>IsTruncated</code> response element returns <code>true</code>, and <code>Marker</code> \\n    contains a value to include in the subsequent call that tells the service where to continue \\n    from.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#ListAccountAliasesResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountAliases\": {\n                    \"target\": \"com.amazonaws.iam#accountAliasListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of aliases associated with the account. Amazon Web Services supports only one alias per\\n            account.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"IsTruncated\": {\n                    \"target\": \"com.amazonaws.iam#booleanType\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>A flag that indicates whether there are more items to return. If your \\n    results were truncated, you can make a subsequent pagination request using the <code>Marker</code>\\n    request parameter to retrieve more items. Note that IAM might return fewer than the \\n    <code>MaxItems</code> number of results even when there are more results available. We recommend \\n    that you check <code>IsTruncated</code> after every call to ensure that you receive all your \\n    results.</p>\"\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.iam#responseMarkerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>When <code>IsTruncated</code> is <code>true</code>, this element\\n    is present and contains the value to use for the <code>Marker</code> parameter in a subsequent \\n    pagination request.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the response to a successful <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListAccountAliases.html\\\">ListAccountAliases</a>\\n      request. </p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#ListAttachedGroupPolicies\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#ListAttachedGroupPoliciesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#ListAttachedGroupPoliciesResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#InvalidInputException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Lists all managed policies that are attached to the specified IAM group.</p>\\n         <p>An IAM group can also have inline policies embedded with it. To list the inline\\n            policies for a group, use <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListGroupPolicies.html\\\">ListGroupPolicies</a>.\\n            For information about policies, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/policies-managed-vs-inline.html\\\">Managed policies and inline\\n                policies</a> in the <i>IAM User Guide</i>.</p>\\n         <p>You can paginate the results using the <code>MaxItems</code> and <code>Marker</code>\\n            parameters. You can use the <code>PathPrefix</code> parameter to limit the list of\\n            policies to only those matching the specified path prefix. If there are no policies\\n            attached to the specified group (or none that match the specified path prefix), the\\n            operation returns an empty list.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"Marker\",\n                    \"outputToken\": \"Marker\",\n                    \"items\": \"AttachedPolicies\",\n                    \"pageSize\": \"MaxItems\"\n                }\n            }\n        },\n        \"com.amazonaws.iam#ListAttachedGroupPoliciesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"GroupName\": {\n                    \"target\": \"com.amazonaws.iam#groupNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name (friendly name, not ARN) of the group to list attached policies for.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"PathPrefix\": {\n                    \"target\": \"com.amazonaws.iam#policyPathType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The path prefix for filtering the results. This parameter is optional. If it is not\\n            included, it defaults to a slash (/), listing all policies.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting \\n    of either a forward slash (/) by itself or a string that must begin and end with forward slashes.\\n    In addition, it can contain any ASCII character from the ! (<code>\\\\u0021</code>) through the DEL character (<code>\\\\u007F</code>), including \\n    most punctuation characters, digits, and upper and lowercased letters.</p>\"\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.iam#markerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter only when paginating results and only after \\n    you receive a response indicating that the results are truncated. Set it to the value of the\\n    <code>Marker</code> element in the response that you received to indicate where the next call \\n    should start.</p>\"\n                    }\n                },\n                \"MaxItems\": {\n                    \"target\": \"com.amazonaws.iam#maxItemsType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this only when paginating results to indicate the \\n    maximum number of items you want in the response. If additional items exist beyond the maximum \\n    you specify, the <code>IsTruncated</code> response element is <code>true</code>.</p>\\n         <p>If you do not include this parameter, the number of items defaults to 100. Note that\\n    IAM might return fewer results, even when there are more results available. In that case, the\\n    <code>IsTruncated</code> response element returns <code>true</code>, and <code>Marker</code> \\n    contains a value to include in the subsequent call that tells the service where to continue \\n    from.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#ListAttachedGroupPoliciesResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AttachedPolicies\": {\n                    \"target\": \"com.amazonaws.iam#attachedPoliciesListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of the attached policies.</p>\"\n                    }\n                },\n                \"IsTruncated\": {\n                    \"target\": \"com.amazonaws.iam#booleanType\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>A flag that indicates whether there are more items to return. If your \\n    results were truncated, you can make a subsequent pagination request using the <code>Marker</code>\\n    request parameter to retrieve more items. Note that IAM might return fewer than the \\n    <code>MaxItems</code> number of results even when there are more results available. We recommend \\n    that you check <code>IsTruncated</code> after every call to ensure that you receive all your \\n    results.</p>\"\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.iam#responseMarkerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>When <code>IsTruncated</code> is <code>true</code>, this element\\n    is present and contains the value to use for the <code>Marker</code> parameter in a subsequent \\n    pagination request.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the response to a successful <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListAttachedGroupPolicies.html\\\">ListAttachedGroupPolicies</a> request. </p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#ListAttachedRolePolicies\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#ListAttachedRolePoliciesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#ListAttachedRolePoliciesResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#InvalidInputException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Lists all managed policies that are attached to the specified IAM role.</p>\\n         <p>An IAM role can also have inline policies embedded with it. To list the inline\\n            policies for a role, use <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListRolePolicies.html\\\">ListRolePolicies</a>.\\n            For information about policies, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/policies-managed-vs-inline.html\\\">Managed policies and inline\\n                policies</a> in the <i>IAM User Guide</i>.</p>\\n         <p>You can paginate the results using the <code>MaxItems</code> and <code>Marker</code>\\n            parameters. You can use the <code>PathPrefix</code> parameter to limit the list of\\n            policies to only those matching the specified path prefix. If there are no policies\\n            attached to the specified role (or none that match the specified path prefix), the\\n            operation returns an empty list.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"Marker\",\n                    \"outputToken\": \"Marker\",\n                    \"items\": \"AttachedPolicies\",\n                    \"pageSize\": \"MaxItems\"\n                }\n            }\n        },\n        \"com.amazonaws.iam#ListAttachedRolePoliciesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RoleName\": {\n                    \"target\": \"com.amazonaws.iam#roleNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name (friendly name, not ARN) of the role to list attached policies for.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"PathPrefix\": {\n                    \"target\": \"com.amazonaws.iam#policyPathType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The path prefix for filtering the results. This parameter is optional. If it is not\\n            included, it defaults to a slash (/), listing all policies.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting \\n    of either a forward slash (/) by itself or a string that must begin and end with forward slashes.\\n    In addition, it can contain any ASCII character from the ! (<code>\\\\u0021</code>) through the DEL character (<code>\\\\u007F</code>), including \\n    most punctuation characters, digits, and upper and lowercased letters.</p>\"\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.iam#markerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter only when paginating results and only after \\n    you receive a response indicating that the results are truncated. Set it to the value of the\\n    <code>Marker</code> element in the response that you received to indicate where the next call \\n    should start.</p>\"\n                    }\n                },\n                \"MaxItems\": {\n                    \"target\": \"com.amazonaws.iam#maxItemsType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this only when paginating results to indicate the \\n    maximum number of items you want in the response. If additional items exist beyond the maximum \\n    you specify, the <code>IsTruncated</code> response element is <code>true</code>.</p>\\n         <p>If you do not include this parameter, the number of items defaults to 100. Note that\\n    IAM might return fewer results, even when there are more results available. In that case, the\\n    <code>IsTruncated</code> response element returns <code>true</code>, and <code>Marker</code> \\n    contains a value to include in the subsequent call that tells the service where to continue \\n    from.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#ListAttachedRolePoliciesResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AttachedPolicies\": {\n                    \"target\": \"com.amazonaws.iam#attachedPoliciesListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of the attached policies.</p>\"\n                    }\n                },\n                \"IsTruncated\": {\n                    \"target\": \"com.amazonaws.iam#booleanType\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>A flag that indicates whether there are more items to return. If your \\n    results were truncated, you can make a subsequent pagination request using the <code>Marker</code>\\n    request parameter to retrieve more items. Note that IAM might return fewer than the \\n    <code>MaxItems</code> number of results even when there are more results available. We recommend \\n    that you check <code>IsTruncated</code> after every call to ensure that you receive all your \\n    results.</p>\"\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.iam#responseMarkerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>When <code>IsTruncated</code> is <code>true</code>, this element\\n    is present and contains the value to use for the <code>Marker</code> parameter in a subsequent \\n    pagination request.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the response to a successful <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListAttachedRolePolicies.html\\\">ListAttachedRolePolicies</a> request. </p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#ListAttachedUserPolicies\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#ListAttachedUserPoliciesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#ListAttachedUserPoliciesResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#InvalidInputException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Lists all managed policies that are attached to the specified IAM user.</p>\\n         <p>An IAM user can also have inline policies embedded with it. To list the inline\\n            policies for a user, use <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListUserPolicies.html\\\">ListUserPolicies</a>.\\n            For information about policies, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/policies-managed-vs-inline.html\\\">Managed policies and inline\\n                policies</a> in the <i>IAM User Guide</i>.</p>\\n         <p>You can paginate the results using the <code>MaxItems</code> and <code>Marker</code>\\n            parameters. You can use the <code>PathPrefix</code> parameter to limit the list of\\n            policies to only those matching the specified path prefix. If there are no policies\\n            attached to the specified group (or none that match the specified path prefix), the\\n            operation returns an empty list.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"Marker\",\n                    \"outputToken\": \"Marker\",\n                    \"items\": \"AttachedPolicies\",\n                    \"pageSize\": \"MaxItems\"\n                }\n            }\n        },\n        \"com.amazonaws.iam#ListAttachedUserPoliciesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"UserName\": {\n                    \"target\": \"com.amazonaws.iam#userNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name (friendly name, not ARN) of the user to list attached policies for.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"PathPrefix\": {\n                    \"target\": \"com.amazonaws.iam#policyPathType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The path prefix for filtering the results. This parameter is optional. If it is not\\n            included, it defaults to a slash (/), listing all policies.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting \\n    of either a forward slash (/) by itself or a string that must begin and end with forward slashes.\\n    In addition, it can contain any ASCII character from the ! (<code>\\\\u0021</code>) through the DEL character (<code>\\\\u007F</code>), including \\n    most punctuation characters, digits, and upper and lowercased letters.</p>\"\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.iam#markerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter only when paginating results and only after \\n    you receive a response indicating that the results are truncated. Set it to the value of the\\n    <code>Marker</code> element in the response that you received to indicate where the next call \\n    should start.</p>\"\n                    }\n                },\n                \"MaxItems\": {\n                    \"target\": \"com.amazonaws.iam#maxItemsType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this only when paginating results to indicate the \\n    maximum number of items you want in the response. If additional items exist beyond the maximum \\n    you specify, the <code>IsTruncated</code> response element is <code>true</code>.</p>\\n         <p>If you do not include this parameter, the number of items defaults to 100. Note that\\n    IAM might return fewer results, even when there are more results available. In that case, the\\n    <code>IsTruncated</code> response element returns <code>true</code>, and <code>Marker</code> \\n    contains a value to include in the subsequent call that tells the service where to continue \\n    from.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#ListAttachedUserPoliciesResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AttachedPolicies\": {\n                    \"target\": \"com.amazonaws.iam#attachedPoliciesListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of the attached policies.</p>\"\n                    }\n                },\n                \"IsTruncated\": {\n                    \"target\": \"com.amazonaws.iam#booleanType\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>A flag that indicates whether there are more items to return. If your \\n    results were truncated, you can make a subsequent pagination request using the <code>Marker</code>\\n    request parameter to retrieve more items. Note that IAM might return fewer than the \\n    <code>MaxItems</code> number of results even when there are more results available. We recommend \\n    that you check <code>IsTruncated</code> after every call to ensure that you receive all your \\n    results.</p>\"\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.iam#responseMarkerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>When <code>IsTruncated</code> is <code>true</code>, this element\\n    is present and contains the value to use for the <code>Marker</code> parameter in a subsequent \\n    pagination request.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the response to a successful <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListAttachedUserPolicies.html\\\">ListAttachedUserPolicies</a> request. </p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#ListEntitiesForPolicy\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#ListEntitiesForPolicyRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#ListEntitiesForPolicyResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#InvalidInputException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Lists all IAM users, groups, and roles that the specified managed policy is attached\\n            to.</p>\\n         <p>You can use the optional <code>EntityFilter</code> parameter to limit the results to a\\n            particular type of entity (users, groups, or roles). For example, to list only the roles\\n            that are attached to the specified policy, set <code>EntityFilter</code> to\\n                <code>Role</code>.</p>\\n         <p>You can paginate the results using the <code>MaxItems</code> and <code>Marker</code>\\n            parameters.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"Marker\",\n                    \"outputToken\": \"Marker\",\n                    \"pageSize\": \"MaxItems\"\n                }\n            }\n        },\n        \"com.amazonaws.iam#ListEntitiesForPolicyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PolicyArn\": {\n                    \"target\": \"com.amazonaws.iam#arnType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the IAM policy for which you want the\\n            versions.</p>\\n         <p>For more information about ARNs, see <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html\\\">Amazon Resource Names (ARNs)</a> in the <i>Amazon Web Services General Reference</i>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"EntityFilter\": {\n                    \"target\": \"com.amazonaws.iam#EntityType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The entity type to use for filtering the results.</p>\\n         <p>For example, when <code>EntityFilter</code> is <code>Role</code>, only the roles that\\n            are attached to the specified policy are returned. This parameter is optional. If it is\\n            not included, all attached entities (users, groups, and roles) are returned. The\\n            argument for this parameter must be one of the valid values listed below.</p>\"\n                    }\n                },\n                \"PathPrefix\": {\n                    \"target\": \"com.amazonaws.iam#pathType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The path prefix for filtering the results. This parameter is optional. If it is not\\n            included, it defaults to a slash (/), listing all entities.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting \\n    of either a forward slash (/) by itself or a string that must begin and end with forward slashes.\\n    In addition, it can contain any ASCII character from the ! (<code>\\\\u0021</code>) through the DEL character (<code>\\\\u007F</code>), including \\n    most punctuation characters, digits, and upper and lowercased letters.</p>\"\n                    }\n                },\n                \"PolicyUsageFilter\": {\n                    \"target\": \"com.amazonaws.iam#PolicyUsageType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The policy usage method to use for filtering the results.</p>\\n         <p>To list only permissions policies,\\n                set <code>PolicyUsageFilter</code> to <code>PermissionsPolicy</code>. To list only\\n            the policies used to set permissions boundaries, set the value\\n                to <code>PermissionsBoundary</code>.</p>\\n         <p>This parameter is optional. If it is not included, all policies are returned. </p>\"\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.iam#markerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter only when paginating results and only after \\n    you receive a response indicating that the results are truncated. Set it to the value of the\\n    <code>Marker</code> element in the response that you received to indicate where the next call \\n    should start.</p>\"\n                    }\n                },\n                \"MaxItems\": {\n                    \"target\": \"com.amazonaws.iam#maxItemsType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this only when paginating results to indicate the \\n    maximum number of items you want in the response. If additional items exist beyond the maximum \\n    you specify, the <code>IsTruncated</code> response element is <code>true</code>.</p>\\n         <p>If you do not include this parameter, the number of items defaults to 100. Note that\\n    IAM might return fewer results, even when there are more results available. In that case, the\\n    <code>IsTruncated</code> response element returns <code>true</code>, and <code>Marker</code> \\n    contains a value to include in the subsequent call that tells the service where to continue \\n    from.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#ListEntitiesForPolicyResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PolicyGroups\": {\n                    \"target\": \"com.amazonaws.iam#PolicyGroupListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of IAM groups that the policy is attached to.</p>\"\n                    }\n                },\n                \"PolicyUsers\": {\n                    \"target\": \"com.amazonaws.iam#PolicyUserListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of IAM users that the policy is attached to.</p>\"\n                    }\n                },\n                \"PolicyRoles\": {\n                    \"target\": \"com.amazonaws.iam#PolicyRoleListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of IAM roles that the policy is attached to.</p>\"\n                    }\n                },\n                \"IsTruncated\": {\n                    \"target\": \"com.amazonaws.iam#booleanType\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>A flag that indicates whether there are more items to return. If your \\n    results were truncated, you can make a subsequent pagination request using the <code>Marker</code>\\n    request parameter to retrieve more items. Note that IAM might return fewer than the \\n    <code>MaxItems</code> number of results even when there are more results available. We recommend \\n    that you check <code>IsTruncated</code> after every call to ensure that you receive all your \\n    results.</p>\"\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.iam#responseMarkerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>When <code>IsTruncated</code> is <code>true</code>, this element\\n    is present and contains the value to use for the <code>Marker</code> parameter in a subsequent \\n    pagination request.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the response to a successful <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListEntitiesForPolicy.html\\\">ListEntitiesForPolicy</a>\\n      request. </p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#ListGroupPolicies\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#ListGroupPoliciesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#ListGroupPoliciesResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Lists the names of the inline policies that are embedded in the specified IAM\\n            group.</p>\\n         <p>An IAM group can also have managed policies attached to it. To list the managed\\n            policies that are attached to a group, use <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListAttachedGroupPolicies.html\\\">ListAttachedGroupPolicies</a>. For more information about policies, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/policies-managed-vs-inline.html\\\">Managed\\n                policies and inline policies</a> in the\\n            <i>IAM User Guide</i>.</p>\\n         <p>You can paginate the results using the <code>MaxItems</code> and <code>Marker</code>\\n            parameters. If there are no inline policies embedded with the specified group, the\\n            operation returns an empty list.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To list the in-line policies for an IAM group\",\n                        \"documentation\": \"The following command lists the names of in-line policies that are embedded in the IAM group named Admins.\",\n                        \"input\": {\n                            \"GroupName\": \"Admins\"\n                        },\n                        \"output\": {\n                            \"PolicyNames\": [\n                                \"AdminRoot\",\n                                \"KeyPolicy\"\n                            ]\n                        }\n                    }\n                ],\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"Marker\",\n                    \"outputToken\": \"Marker\",\n                    \"items\": \"PolicyNames\",\n                    \"pageSize\": \"MaxItems\"\n                }\n            }\n        },\n        \"com.amazonaws.iam#ListGroupPoliciesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"GroupName\": {\n                    \"target\": \"com.amazonaws.iam#groupNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the group to list policies for.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.iam#markerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter only when paginating results and only after \\n    you receive a response indicating that the results are truncated. Set it to the value of the\\n    <code>Marker</code> element in the response that you received to indicate where the next call \\n    should start.</p>\"\n                    }\n                },\n                \"MaxItems\": {\n                    \"target\": \"com.amazonaws.iam#maxItemsType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this only when paginating results to indicate the \\n    maximum number of items you want in the response. If additional items exist beyond the maximum \\n    you specify, the <code>IsTruncated</code> response element is <code>true</code>.</p>\\n         <p>If you do not include this parameter, the number of items defaults to 100. Note that\\n    IAM might return fewer results, even when there are more results available. In that case, the\\n    <code>IsTruncated</code> response element returns <code>true</code>, and <code>Marker</code> \\n    contains a value to include in the subsequent call that tells the service where to continue \\n    from.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#ListGroupPoliciesResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PolicyNames\": {\n                    \"target\": \"com.amazonaws.iam#policyNameListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of policy names.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"IsTruncated\": {\n                    \"target\": \"com.amazonaws.iam#booleanType\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>A flag that indicates whether there are more items to return. If your \\n    results were truncated, you can make a subsequent pagination request using the <code>Marker</code>\\n    request parameter to retrieve more items. Note that IAM might return fewer than the \\n    <code>MaxItems</code> number of results even when there are more results available. We recommend \\n    that you check <code>IsTruncated</code> after every call to ensure that you receive all your \\n    results.</p>\"\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.iam#responseMarkerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>When <code>IsTruncated</code> is <code>true</code>, this element\\n    is present and contains the value to use for the <code>Marker</code> parameter in a subsequent \\n    pagination request.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the response to a successful <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListGroupPolicies.html\\\">ListGroupPolicies</a> request.\\n    </p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#ListGroups\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#ListGroupsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#ListGroupsResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Lists the IAM groups that have the specified path prefix.</p>\\n         <p> You can paginate the results using the <code>MaxItems</code> and <code>Marker</code>\\n            parameters.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To list the IAM groups for the current account\",\n                        \"documentation\": \"The following command lists the IAM groups in the current account:\",\n                        \"output\": {\n                            \"Groups\": [\n                                {\n                                    \"Path\": \"/division_abc/subdivision_xyz/\",\n                                    \"GroupName\": \"Admins\",\n                                    \"CreateDate\": \"2016-12-15T21:40:08.121Z\",\n                                    \"GroupId\": \"AGPA1111111111EXAMPLE\",\n                                    \"Arn\": \"arn:aws:iam::123456789012:group/Admins\"\n                                },\n                                {\n                                    \"Path\": \"/division_abc/subdivision_xyz/product_1234/engineering/\",\n                                    \"GroupName\": \"Test\",\n                                    \"CreateDate\": \"2016-11-30T14:10:01.156Z\",\n                                    \"GroupId\": \"AGP22222222222EXAMPLE\",\n                                    \"Arn\": \"arn:aws:iam::123456789012:group/division_abc/subdivision_xyz/product_1234/engineering/Test\"\n                                },\n                                {\n                                    \"Path\": \"/division_abc/subdivision_xyz/product_1234/\",\n                                    \"GroupName\": \"Managers\",\n                                    \"CreateDate\": \"2016-06-12T20:14:52.032Z\",\n                                    \"GroupId\": \"AGPI3333333333EXAMPLE\",\n                                    \"Arn\": \"arn:aws:iam::123456789012:group/division_abc/subdivision_xyz/product_1234/Managers\"\n                                }\n                            ]\n                        }\n                    }\n                ],\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"Marker\",\n                    \"outputToken\": \"Marker\",\n                    \"items\": \"Groups\",\n                    \"pageSize\": \"MaxItems\"\n                }\n            }\n        },\n        \"com.amazonaws.iam#ListGroupsForUser\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#ListGroupsForUserRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#ListGroupsForUserResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Lists the IAM groups that the specified IAM user belongs to.</p>\\n         <p>You can paginate the results using the <code>MaxItems</code> and <code>Marker</code>\\n            parameters.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To list the groups that an IAM user belongs to\",\n                        \"documentation\": \"The following command displays the groups that the IAM user named Bob belongs to.\",\n                        \"input\": {\n                            \"UserName\": \"Bob\"\n                        },\n                        \"output\": {\n                            \"Groups\": [\n                                {\n                                    \"Path\": \"/division_abc/subdivision_xyz/product_1234/engineering/\",\n                                    \"GroupName\": \"Test\",\n                                    \"CreateDate\": \"2016-11-30T14:10:01.156Z\",\n                                    \"GroupId\": \"AGP2111111111EXAMPLE\",\n                                    \"Arn\": \"arn:aws:iam::123456789012:group/division_abc/subdivision_xyz/product_1234/engineering/Test\"\n                                },\n                                {\n                                    \"Path\": \"/division_abc/subdivision_xyz/product_1234/\",\n                                    \"GroupName\": \"Managers\",\n                                    \"CreateDate\": \"2016-06-12T20:14:52.032Z\",\n                                    \"GroupId\": \"AGPI222222222SEXAMPLE\",\n                                    \"Arn\": \"arn:aws:iam::123456789012:group/division_abc/subdivision_xyz/product_1234/Managers\"\n                                }\n                            ]\n                        }\n                    }\n                ],\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"Marker\",\n                    \"outputToken\": \"Marker\",\n                    \"items\": \"Groups\",\n                    \"pageSize\": \"MaxItems\"\n                }\n            }\n        },\n        \"com.amazonaws.iam#ListGroupsForUserRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"UserName\": {\n                    \"target\": \"com.amazonaws.iam#existingUserNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the user to list groups for.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.iam#markerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter only when paginating results and only after \\n    you receive a response indicating that the results are truncated. Set it to the value of the\\n    <code>Marker</code> element in the response that you received to indicate where the next call \\n    should start.</p>\"\n                    }\n                },\n                \"MaxItems\": {\n                    \"target\": \"com.amazonaws.iam#maxItemsType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this only when paginating results to indicate the \\n    maximum number of items you want in the response. If additional items exist beyond the maximum \\n    you specify, the <code>IsTruncated</code> response element is <code>true</code>.</p>\\n         <p>If you do not include this parameter, the number of items defaults to 100. Note that\\n    IAM might return fewer results, even when there are more results available. In that case, the\\n    <code>IsTruncated</code> response element returns <code>true</code>, and <code>Marker</code> \\n    contains a value to include in the subsequent call that tells the service where to continue \\n    from.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#ListGroupsForUserResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Groups\": {\n                    \"target\": \"com.amazonaws.iam#groupListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of groups.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"IsTruncated\": {\n                    \"target\": \"com.amazonaws.iam#booleanType\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>A flag that indicates whether there are more items to return. If your \\n    results were truncated, you can make a subsequent pagination request using the <code>Marker</code>\\n    request parameter to retrieve more items. Note that IAM might return fewer than the \\n    <code>MaxItems</code> number of results even when there are more results available. We recommend \\n    that you check <code>IsTruncated</code> after every call to ensure that you receive all your \\n    results.</p>\"\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.iam#responseMarkerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>When <code>IsTruncated</code> is <code>true</code>, this element\\n    is present and contains the value to use for the <code>Marker</code> parameter in a subsequent \\n    pagination request.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the response to a successful <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListGroupsForUser.html\\\">ListGroupsForUser</a> request.\\n    </p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#ListGroupsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PathPrefix\": {\n                    \"target\": \"com.amazonaws.iam#pathPrefixType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The path prefix for filtering the results. For example, the prefix\\n                <code>/division_abc/subdivision_xyz/</code> gets all groups whose path starts with\\n                <code>/division_abc/subdivision_xyz/</code>.</p>\\n         <p>This parameter is optional. If it is not included, it defaults to a slash (/), listing\\n            all groups. This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting \\n    of either a forward slash (/) by itself or a string that must begin and end with forward slashes.\\n    In addition, it can contain any ASCII character from the ! (<code>\\\\u0021</code>) through the DEL character (<code>\\\\u007F</code>), including \\n    most punctuation characters, digits, and upper and lowercased letters.</p>\"\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.iam#markerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter only when paginating results and only after \\n    you receive a response indicating that the results are truncated. Set it to the value of the\\n    <code>Marker</code> element in the response that you received to indicate where the next call \\n    should start.</p>\"\n                    }\n                },\n                \"MaxItems\": {\n                    \"target\": \"com.amazonaws.iam#maxItemsType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this only when paginating results to indicate the \\n    maximum number of items you want in the response. If additional items exist beyond the maximum \\n    you specify, the <code>IsTruncated</code> response element is <code>true</code>.</p>\\n         <p>If you do not include this parameter, the number of items defaults to 100. Note that\\n    IAM might return fewer results, even when there are more results available. In that case, the\\n    <code>IsTruncated</code> response element returns <code>true</code>, and <code>Marker</code> \\n    contains a value to include in the subsequent call that tells the service where to continue \\n    from.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#ListGroupsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Groups\": {\n                    \"target\": \"com.amazonaws.iam#groupListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of groups.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"IsTruncated\": {\n                    \"target\": \"com.amazonaws.iam#booleanType\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>A flag that indicates whether there are more items to return. If your \\n    results were truncated, you can make a subsequent pagination request using the <code>Marker</code>\\n    request parameter to retrieve more items. Note that IAM might return fewer than the \\n    <code>MaxItems</code> number of results even when there are more results available. We recommend \\n    that you check <code>IsTruncated</code> after every call to ensure that you receive all your \\n    results.</p>\"\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.iam#responseMarkerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>When <code>IsTruncated</code> is <code>true</code>, this element\\n    is present and contains the value to use for the <code>Marker</code> parameter in a subsequent \\n    pagination request.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the response to a successful <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListGroups.html\\\">ListGroups</a> request. </p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#ListInstanceProfileTags\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#ListInstanceProfileTagsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#ListInstanceProfileTagsResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Lists the tags that are attached to the specified IAM instance profile. The returned list of tags is sorted by tag key.\\n      For more information about tagging, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_tags.html\\\">Tagging IAM resources</a> in the\\n      <i>IAM User Guide</i>.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"Marker\",\n                    \"outputToken\": \"Marker\",\n                    \"items\": \"Tags\",\n                    \"pageSize\": \"MaxItems\"\n                }\n            }\n        },\n        \"com.amazonaws.iam#ListInstanceProfileTagsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceProfileName\": {\n                    \"target\": \"com.amazonaws.iam#instanceProfileNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the IAM instance profile whose tags you want to see.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.iam#markerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter only when paginating results and only after \\n    you receive a response indicating that the results are truncated. Set it to the value of the\\n    <code>Marker</code> element in the response that you received to indicate where the next call \\n    should start.</p>\"\n                    }\n                },\n                \"MaxItems\": {\n                    \"target\": \"com.amazonaws.iam#maxItemsType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this only when paginating results to indicate the \\n    maximum number of items you want in the response. If additional items exist beyond the maximum \\n    you specify, the <code>IsTruncated</code> response element is <code>true</code>.</p>\\n         <p>If you do not include this parameter, the number of items defaults to 100. Note that\\n    IAM might return fewer results, even when there are more results available. In that case, the\\n    <code>IsTruncated</code> response element returns <code>true</code>, and <code>Marker</code> \\n    contains a value to include in the subsequent call that tells the service where to continue \\n    from.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#ListInstanceProfileTagsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.iam#tagListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The list of tags that are currently attached to the IAM instance profile. Each tag consists of a key name and an associated value. If no tags are attached to the specified resource, the response contains an empty list.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"IsTruncated\": {\n                    \"target\": \"com.amazonaws.iam#booleanType\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>A flag that indicates whether there are more items to return. If your \\n    results were truncated, you can make a subsequent pagination request using the <code>Marker</code>\\n    request parameter to retrieve more items. Note that IAM might return fewer than the \\n    <code>MaxItems</code> number of results even when there are more results available. We recommend \\n    that you check <code>IsTruncated</code> after every call to ensure that you receive all your \\n    results.</p>\"\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.iam#responseMarkerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>When <code>IsTruncated</code> is <code>true</code>, this element\\n    is present and contains the value to use for the <code>Marker</code> parameter in a subsequent \\n    pagination request.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#ListInstanceProfiles\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#ListInstanceProfilesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#ListInstanceProfilesResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Lists the instance profiles that have the specified path prefix. If there are none,\\n            the operation returns an empty list. For more information about instance profiles, see\\n                <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-ec2_instance-profiles.html\\\">Using\\n                instance profiles</a> in the <i>IAM User Guide</i>.</p>\\n         <note>\\n            <p>IAM resource-listing operations return a subset of the available \\n   attributes for the resource. For example, this operation does not return tags, even though they are an attribute of the returned object. To view all of the information for an instance profile, see\\n                    <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetInstanceProfile.html\\\">GetInstanceProfile</a>.</p>\\n         </note>\\n         <p>You can paginate the results using the <code>MaxItems</code> and <code>Marker</code>\\n            parameters.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"Marker\",\n                    \"outputToken\": \"Marker\",\n                    \"items\": \"InstanceProfiles\",\n                    \"pageSize\": \"MaxItems\"\n                }\n            }\n        },\n        \"com.amazonaws.iam#ListInstanceProfilesForRole\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#ListInstanceProfilesForRoleRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#ListInstanceProfilesForRoleResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Lists the instance profiles that have the specified associated IAM role. If there\\n            are none, the operation returns an empty list. For more information about instance\\n            profiles, go to <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-ec2_instance-profiles.html\\\">Using\\n                instance profiles</a> in the <i>IAM User Guide</i>.</p>\\n         <p>You can paginate the results using the <code>MaxItems</code> and <code>Marker</code>\\n            parameters.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"Marker\",\n                    \"outputToken\": \"Marker\",\n                    \"items\": \"InstanceProfiles\",\n                    \"pageSize\": \"MaxItems\"\n                }\n            }\n        },\n        \"com.amazonaws.iam#ListInstanceProfilesForRoleRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RoleName\": {\n                    \"target\": \"com.amazonaws.iam#roleNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the role to list instance profiles for.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.iam#markerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter only when paginating results and only after \\n    you receive a response indicating that the results are truncated. Set it to the value of the\\n    <code>Marker</code> element in the response that you received to indicate where the next call \\n    should start.</p>\"\n                    }\n                },\n                \"MaxItems\": {\n                    \"target\": \"com.amazonaws.iam#maxItemsType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this only when paginating results to indicate the \\n    maximum number of items you want in the response. If additional items exist beyond the maximum \\n    you specify, the <code>IsTruncated</code> response element is <code>true</code>.</p>\\n         <p>If you do not include this parameter, the number of items defaults to 100. Note that\\n    IAM might return fewer results, even when there are more results available. In that case, the\\n    <code>IsTruncated</code> response element returns <code>true</code>, and <code>Marker</code> \\n    contains a value to include in the subsequent call that tells the service where to continue \\n    from.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#ListInstanceProfilesForRoleResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceProfiles\": {\n                    \"target\": \"com.amazonaws.iam#instanceProfileListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of instance profiles.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"IsTruncated\": {\n                    \"target\": \"com.amazonaws.iam#booleanType\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>A flag that indicates whether there are more items to return. If your \\n    results were truncated, you can make a subsequent pagination request using the <code>Marker</code>\\n    request parameter to retrieve more items. Note that IAM might return fewer than the \\n    <code>MaxItems</code> number of results even when there are more results available. We recommend \\n    that you check <code>IsTruncated</code> after every call to ensure that you receive all your \\n    results.</p>\"\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.iam#responseMarkerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>When <code>IsTruncated</code> is <code>true</code>, this element\\n    is present and contains the value to use for the <code>Marker</code> parameter in a subsequent \\n    pagination request.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the response to a successful <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListInstanceProfilesForRole.html\\\">ListInstanceProfilesForRole</a> request. </p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#ListInstanceProfilesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PathPrefix\": {\n                    \"target\": \"com.amazonaws.iam#pathPrefixType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The path prefix for filtering the results. For example, the prefix\\n                <code>/application_abc/component_xyz/</code> gets all instance profiles whose path\\n            starts with <code>/application_abc/component_xyz/</code>.</p>\\n         <p>This parameter is optional. If it is not included, it defaults to a slash (/), listing\\n            all instance profiles. This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting \\n    of either a forward slash (/) by itself or a string that must begin and end with forward slashes.\\n    In addition, it can contain any ASCII character from the ! (<code>\\\\u0021</code>) through the DEL character (<code>\\\\u007F</code>), including \\n    most punctuation characters, digits, and upper and lowercased letters.</p>\"\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.iam#markerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter only when paginating results and only after \\n    you receive a response indicating that the results are truncated. Set it to the value of the\\n    <code>Marker</code> element in the response that you received to indicate where the next call \\n    should start.</p>\"\n                    }\n                },\n                \"MaxItems\": {\n                    \"target\": \"com.amazonaws.iam#maxItemsType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this only when paginating results to indicate the \\n    maximum number of items you want in the response. If additional items exist beyond the maximum \\n    you specify, the <code>IsTruncated</code> response element is <code>true</code>.</p>\\n         <p>If you do not include this parameter, the number of items defaults to 100. Note that\\n    IAM might return fewer results, even when there are more results available. In that case, the\\n    <code>IsTruncated</code> response element returns <code>true</code>, and <code>Marker</code> \\n    contains a value to include in the subsequent call that tells the service where to continue \\n    from.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#ListInstanceProfilesResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceProfiles\": {\n                    \"target\": \"com.amazonaws.iam#instanceProfileListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of instance profiles.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"IsTruncated\": {\n                    \"target\": \"com.amazonaws.iam#booleanType\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>A flag that indicates whether there are more items to return. If your \\n    results were truncated, you can make a subsequent pagination request using the <code>Marker</code>\\n    request parameter to retrieve more items. Note that IAM might return fewer than the \\n    <code>MaxItems</code> number of results even when there are more results available. We recommend \\n    that you check <code>IsTruncated</code> after every call to ensure that you receive all your \\n    results.</p>\"\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.iam#responseMarkerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>When <code>IsTruncated</code> is <code>true</code>, this element\\n    is present and contains the value to use for the <code>Marker</code> parameter in a subsequent \\n    pagination request.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the response to a successful <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListInstanceProfiles.html\\\">ListInstanceProfiles</a>\\n      request. </p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#ListMFADeviceTags\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#ListMFADeviceTagsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#ListMFADeviceTagsResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#InvalidInputException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Lists the tags that are attached to the specified IAM virtual multi-factor authentication (MFA) device. The returned list of tags is\\n      sorted by tag key. For more information about tagging, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_tags.html\\\">Tagging IAM resources</a> in the\\n      <i>IAM User Guide</i>.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"Marker\",\n                    \"outputToken\": \"Marker\",\n                    \"items\": \"Tags\",\n                    \"pageSize\": \"MaxItems\"\n                }\n            }\n        },\n        \"com.amazonaws.iam#ListMFADeviceTagsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SerialNumber\": {\n                    \"target\": \"com.amazonaws.iam#serialNumberType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The unique identifier for the IAM virtual MFA device whose tags you want to see.\\n      For virtual MFA devices, the serial number is the same as the ARN.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.iam#markerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter only when paginating results and only after \\n    you receive a response indicating that the results are truncated. Set it to the value of the\\n    <code>Marker</code> element in the response that you received to indicate where the next call \\n    should start.</p>\"\n                    }\n                },\n                \"MaxItems\": {\n                    \"target\": \"com.amazonaws.iam#maxItemsType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this only when paginating results to indicate the \\n    maximum number of items you want in the response. If additional items exist beyond the maximum \\n    you specify, the <code>IsTruncated</code> response element is <code>true</code>.</p>\\n         <p>If you do not include this parameter, the number of items defaults to 100. Note that\\n    IAM might return fewer results, even when there are more results available. In that case, the\\n    <code>IsTruncated</code> response element returns <code>true</code>, and <code>Marker</code> \\n    contains a value to include in the subsequent call that tells the service where to continue \\n    from.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#ListMFADeviceTagsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.iam#tagListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The list of tags that are currently attached to the virtual MFA device. Each tag consists of a key name and an associated value. If no tags are attached to the specified resource, the response contains an empty list.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"IsTruncated\": {\n                    \"target\": \"com.amazonaws.iam#booleanType\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>A flag that indicates whether there are more items to return. If your \\n    results were truncated, you can make a subsequent pagination request using the <code>Marker</code>\\n    request parameter to retrieve more items. Note that IAM might return fewer than the \\n    <code>MaxItems</code> number of results even when there are more results available. We recommend \\n    that you check <code>IsTruncated</code> after every call to ensure that you receive all your \\n    results.</p>\"\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.iam#responseMarkerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>When <code>IsTruncated</code> is <code>true</code>, this element\\n    is present and contains the value to use for the <code>Marker</code> parameter in a subsequent \\n    pagination request.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#ListMFADevices\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#ListMFADevicesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#ListMFADevicesResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Lists the MFA devices for an IAM user. If the request includes a IAM user name,\\n            then this operation lists all the MFA devices associated with the specified user. If you\\n            do not specify a user name, IAM determines the user name implicitly based on the Amazon Web Services\\n            access key ID signing the request for this operation.</p>\\n         <p>You can paginate the results using the <code>MaxItems</code> and <code>Marker</code>\\n            parameters.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"Marker\",\n                    \"outputToken\": \"Marker\",\n                    \"items\": \"MFADevices\",\n                    \"pageSize\": \"MaxItems\"\n                }\n            }\n        },\n        \"com.amazonaws.iam#ListMFADevicesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"UserName\": {\n                    \"target\": \"com.amazonaws.iam#existingUserNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the user whose MFA devices you want to list.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\"\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.iam#markerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter only when paginating results and only after \\n    you receive a response indicating that the results are truncated. Set it to the value of the\\n    <code>Marker</code> element in the response that you received to indicate where the next call \\n    should start.</p>\"\n                    }\n                },\n                \"MaxItems\": {\n                    \"target\": \"com.amazonaws.iam#maxItemsType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this only when paginating results to indicate the \\n    maximum number of items you want in the response. If additional items exist beyond the maximum \\n    you specify, the <code>IsTruncated</code> response element is <code>true</code>.</p>\\n         <p>If you do not include this parameter, the number of items defaults to 100. Note that\\n    IAM might return fewer results, even when there are more results available. In that case, the\\n    <code>IsTruncated</code> response element returns <code>true</code>, and <code>Marker</code> \\n    contains a value to include in the subsequent call that tells the service where to continue \\n    from.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#ListMFADevicesResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"MFADevices\": {\n                    \"target\": \"com.amazonaws.iam#mfaDeviceListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of MFA devices.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"IsTruncated\": {\n                    \"target\": \"com.amazonaws.iam#booleanType\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>A flag that indicates whether there are more items to return. If your \\n    results were truncated, you can make a subsequent pagination request using the <code>Marker</code>\\n    request parameter to retrieve more items. Note that IAM might return fewer than the \\n    <code>MaxItems</code> number of results even when there are more results available. We recommend \\n    that you check <code>IsTruncated</code> after every call to ensure that you receive all your \\n    results.</p>\"\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.iam#responseMarkerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>When <code>IsTruncated</code> is <code>true</code>, this element\\n    is present and contains the value to use for the <code>Marker</code> parameter in a subsequent \\n    pagination request.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the response to a successful <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListMFADevices.html\\\">ListMFADevices</a> request.\\n    </p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#ListOpenIDConnectProviderTags\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#ListOpenIDConnectProviderTagsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#ListOpenIDConnectProviderTagsResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#InvalidInputException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Lists the tags that are attached to the specified OpenID Connect (OIDC)-compatible\\n      identity provider. The returned list of tags is sorted by tag key. For more information, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_oidc.html\\\">About web identity\\n      federation</a>.</p>\\n         <p>For more information about tagging, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_tags.html\\\">Tagging IAM resources</a> in the\\n      <i>IAM User Guide</i>.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"Marker\",\n                    \"outputToken\": \"Marker\",\n                    \"items\": \"Tags\",\n                    \"pageSize\": \"MaxItems\"\n                }\n            }\n        },\n        \"com.amazonaws.iam#ListOpenIDConnectProviderTagsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"OpenIDConnectProviderArn\": {\n                    \"target\": \"com.amazonaws.iam#arnType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the OpenID Connect (OIDC) identity provider whose tags you want to\\n      see.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.iam#markerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter only when paginating results and only after \\n    you receive a response indicating that the results are truncated. Set it to the value of the\\n    <code>Marker</code> element in the response that you received to indicate where the next call \\n    should start.</p>\"\n                    }\n                },\n                \"MaxItems\": {\n                    \"target\": \"com.amazonaws.iam#maxItemsType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this only when paginating results to indicate the \\n    maximum number of items you want in the response. If additional items exist beyond the maximum \\n    you specify, the <code>IsTruncated</code> response element is <code>true</code>.</p>\\n         <p>If you do not include this parameter, the number of items defaults to 100. Note that\\n    IAM might return fewer results, even when there are more results available. In that case, the\\n    <code>IsTruncated</code> response element returns <code>true</code>, and <code>Marker</code> \\n    contains a value to include in the subsequent call that tells the service where to continue \\n    from.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#ListOpenIDConnectProviderTagsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.iam#tagListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The list of tags that are currently attached to the OpenID Connect (OIDC) identity\\n      provider. Each tag consists of a key name and an associated value. If no tags are attached to the specified resource, the response contains an empty list.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"IsTruncated\": {\n                    \"target\": \"com.amazonaws.iam#booleanType\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>A flag that indicates whether there are more items to return. If your \\n    results were truncated, you can make a subsequent pagination request using the <code>Marker</code>\\n    request parameter to retrieve more items. Note that IAM might return fewer than the \\n    <code>MaxItems</code> number of results even when there are more results available. We recommend \\n    that you check <code>IsTruncated</code> after every call to ensure that you receive all your \\n    results.</p>\"\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.iam#responseMarkerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>When <code>IsTruncated</code> is <code>true</code>, this element\\n    is present and contains the value to use for the <code>Marker</code> parameter in a subsequent \\n    pagination request.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#ListOpenIDConnectProviders\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#ListOpenIDConnectProvidersRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#ListOpenIDConnectProvidersResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Lists information about the IAM OpenID Connect (OIDC) provider resource objects\\n            defined in the Amazon Web Services account.</p>\\n         <note>\\n            <p>IAM resource-listing operations return a subset of the available \\n   attributes for the resource. For example, this operation does not return tags, even though they are an attribute of the returned object. To view all of the information for an OIDC provider, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetOpenIDConnectProvider.html\\\">GetOpenIDConnectProvider</a>.</p>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.iam#ListOpenIDConnectProvidersRequest\": {\n            \"type\": \"structure\",\n            \"members\": {},\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#ListOpenIDConnectProvidersResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"OpenIDConnectProviderList\": {\n                    \"target\": \"com.amazonaws.iam#OpenIDConnectProviderListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The list of IAM OIDC provider resource objects defined in the Amazon Web Services account.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the response to a successful <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListOpenIDConnectProviders.html\\\">ListOpenIDConnectProviders</a> request. </p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#ListOrganizationsFeatures\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#ListOrganizationsFeaturesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#ListOrganizationsFeaturesResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#AccountNotManagementOrDelegatedAdministratorException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#OrganizationNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#OrganizationNotInAllFeaturesModeException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceAccessNotEnabledException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Lists the centralized root access features enabled for your organization. For more\\n            information, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_root-user.html#id_root-user-access-management\\\">Centrally manage root access for member accounts</a>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To list the centralized root access features enabled for your organization\",\n                        \"documentation\": \"he following command lists the centralized root access features enabled for your organization.\",\n                        \"output\": {\n                            \"OrganizationId\": \"o-aa111bb222\",\n                            \"EnabledFeatures\": [\n                                \"RootCredentialsManagement\"\n                            ]\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.iam#ListOrganizationsFeaturesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {},\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#ListOrganizationsFeaturesResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"OrganizationId\": {\n                    \"target\": \"com.amazonaws.iam#OrganizationIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The unique identifier (ID) of an organization.</p>\"\n                    }\n                },\n                \"EnabledFeatures\": {\n                    \"target\": \"com.amazonaws.iam#FeaturesListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the features that are currently available in your organization.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#ListPolicies\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#ListPoliciesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#ListPoliciesResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Lists all the managed policies that are available in your Amazon Web Services account, including\\n            your own customer-defined managed policies and all Amazon Web Services managed policies.</p>\\n         <p>You can filter the list of policies that is returned using the optional\\n                <code>OnlyAttached</code>, <code>Scope</code>, and <code>PathPrefix</code>\\n            parameters. For example, to list only the customer managed policies in your Amazon Web Services\\n            account, set <code>Scope</code> to <code>Local</code>. To list only Amazon Web Services managed\\n            policies, set <code>Scope</code> to <code>AWS</code>.</p>\\n         <p>You can paginate the results using the <code>MaxItems</code> and <code>Marker</code>\\n            parameters.</p>\\n         <p>For more information about managed policies, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/policies-managed-vs-inline.html\\\">Managed policies and inline\\n                policies</a> in the <i>IAM User Guide</i>.</p>\\n         <note>\\n            <p>IAM resource-listing operations return a subset of the available \\n   attributes for the resource. For example, this operation does not return tags, even though they are an attribute of the returned object. To view all of the information for a customer manged policy, see\\n                    <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetPolicy.html\\\">GetPolicy</a>.</p>\\n         </note>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"Marker\",\n                    \"outputToken\": \"Marker\",\n                    \"items\": \"Policies\",\n                    \"pageSize\": \"MaxItems\"\n                }\n            }\n        },\n        \"com.amazonaws.iam#ListPoliciesGrantingServiceAccess\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#ListPoliciesGrantingServiceAccessRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#ListPoliciesGrantingServiceAccessResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#InvalidInputException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Retrieves a list of policies that the IAM identity (user, group, or role) can use to\\n            access each specified service.</p>\\n         <note>\\n            <p>This operation does not use other policy types when determining whether a resource\\n                could access a service. These other policy types include resource-based policies,\\n                access control lists, Organizations policies, IAM permissions boundaries, and STS\\n                assume role policies. It only applies permissions policy logic. For more about the\\n                evaluation of policy types, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_evaluation-logic.html#policy-eval-basics\\\">Evaluating policies</a> in the\\n                <i>IAM User Guide</i>.</p>\\n         </note>\\n         <p>The list of policies returned by the operation depends on the ARN of the identity that\\n            you provide.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <b>User</b> – The list of policies includes\\n                    the managed and inline policies that are attached to the user directly. The list\\n                    also includes any additional managed and inline policies that are attached to\\n                    the group to which the user belongs. </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>Group</b> – The list of policies includes\\n                    only the managed and inline policies that are attached to the group directly.\\n                    Policies that are attached to the group’s user are not included.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>Role</b> – The list of policies includes\\n                    only the managed and inline policies that are attached to the role.</p>\\n            </li>\\n         </ul>\\n         <p>For each managed policy, this operation returns the ARN and policy name. For each\\n            inline policy, it returns the policy name and the entity to which it is attached. Inline\\n            policies do not have an ARN. For more information about these policy types, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html\\\">Managed policies and inline policies</a> in the\\n                <i>IAM User Guide</i>.</p>\\n         <p>Policies that are attached to users and roles as permissions boundaries are not\\n            returned. To view which managed policy is currently used to set the permissions boundary\\n            for a user or role, use the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetUser.html\\\">GetUser</a> or <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetRole.html\\\">GetRole</a>\\n            operations.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To list policies that allow access to a service\",\n                        \"documentation\": \"The following operation lists policies that allow ExampleUser01 to access IAM or EC2.\",\n                        \"input\": {\n                            \"Arn\": \"arn:aws:iam::123456789012:user/ExampleUser01\",\n                            \"ServiceNamespaces\": [\n                                \"iam\",\n                                \"ec2\"\n                            ]\n                        },\n                        \"output\": {\n                            \"IsTruncated\": false,\n                            \"PoliciesGrantingServiceAccess\": [\n                                {\n                                    \"Policies\": [\n                                        {\n                                            \"PolicyArn\": \"arn:aws:iam::123456789012:policy/ExampleIamPolicy\",\n                                            \"PolicyType\": \"MANAGED\",\n                                            \"PolicyName\": \"ExampleIamPolicy\"\n                                        },\n                                        {\n                                            \"EntityName\": \"AWSExampleGroup1\",\n                                            \"EntityType\": \"GROUP\",\n                                            \"PolicyType\": \"INLINE\",\n                                            \"PolicyName\": \"ExampleGroup1Policy\"\n                                        }\n                                    ],\n                                    \"ServiceNamespace\": \"iam\"\n                                },\n                                {\n                                    \"Policies\": [\n                                        {\n                                            \"PolicyArn\": \"arn:aws:iam::123456789012:policy/ExampleEc2Policy\",\n                                            \"PolicyType\": \"MANAGED\",\n                                            \"PolicyName\": \"ExampleEc2Policy\"\n                                        }\n                                    ],\n                                    \"ServiceNamespace\": \"ec2\"\n                                }\n                            ]\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.iam#ListPoliciesGrantingServiceAccessEntry\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ServiceNamespace\": {\n                    \"target\": \"com.amazonaws.iam#serviceNamespaceType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The namespace of the service that was accessed.</p>\\n         <p>To learn the service namespace of a service, see <a href=\\\"https://docs.aws.amazon.com/service-authorization/latest/reference/reference_policies_actions-resources-contextkeys.html\\\">Actions, resources, and condition keys for Amazon Web Services services</a> in the\\n            <i>Service Authorization Reference</i>. Choose the name of the service to\\n         view details for that service. In the first paragraph, find the service prefix. For\\n         example, <code>(service prefix: a4b)</code>. For more information about service namespaces,\\n         see <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html#genref-aws-service-namespaces\\\">Amazon Web Services\\n            service namespaces</a> in the <i>Amazon Web Services General Reference</i>.</p>\"\n                    }\n                },\n                \"Policies\": {\n                    \"target\": \"com.amazonaws.iam#policyGrantingServiceAccessListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>PoliciesGrantingServiceAccess</code> object that contains details about the\\n         policy.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains details about the permissions policies that are attached to the specified\\n         identity (user, group, or role).</p>\\n         <p>This data type is used as a response element in the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListPoliciesGrantingServiceAccess.html\\\">ListPoliciesGrantingServiceAccess</a> operation.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#ListPoliciesGrantingServiceAccessRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.iam#markerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter only when paginating results and only after \\n    you receive a response indicating that the results are truncated. Set it to the value of the\\n    <code>Marker</code> element in the response that you received to indicate where the next call \\n    should start.</p>\"\n                    }\n                },\n                \"Arn\": {\n                    \"target\": \"com.amazonaws.iam#arnType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the IAM identity (user, group, or role) whose policies you want to\\n            list.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ServiceNamespaces\": {\n                    \"target\": \"com.amazonaws.iam#serviceNamespaceListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The service namespace for the Amazon Web Services services whose policies you want to list.</p>\\n         <p>To learn the service namespace for a service, see <a href=\\\"https://docs.aws.amazon.com/service-authorization/latest/reference/reference_policies_actions-resources-contextkeys.html\\\">Actions, resources, and condition keys for Amazon Web Services services</a> in the\\n                <i>IAM User Guide</i>. Choose the name of the service to view\\n            details for that service. In the first paragraph, find the service prefix. For example,\\n                <code>(service prefix: a4b)</code>. For more information about service namespaces,\\n            see <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html#genref-aws-service-namespaces\\\">Amazon Web Services\\n                service namespaces</a> in the <i>Amazon Web Services General Reference</i>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#ListPoliciesGrantingServiceAccessResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PoliciesGrantingServiceAccess\": {\n                    \"target\": \"com.amazonaws.iam#listPolicyGrantingServiceAccessResponseListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A <code>ListPoliciesGrantingServiceAccess</code> object that contains details about\\n            the permissions policies attached to the specified identity (user, group, or\\n            role).</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"IsTruncated\": {\n                    \"target\": \"com.amazonaws.iam#booleanType\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>A flag that indicates whether there are more items to return. If your results were\\n            truncated, you can make a subsequent pagination request using the <code>Marker</code>\\n            request parameter to retrieve more items. We recommend that you check\\n                <code>IsTruncated</code> after every call to ensure that you receive all your\\n            results.</p>\"\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.iam#responseMarkerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>When <code>IsTruncated</code> is <code>true</code>, this element\\n    is present and contains the value to use for the <code>Marker</code> parameter in a subsequent \\n    pagination request.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#ListPoliciesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Scope\": {\n                    \"target\": \"com.amazonaws.iam#policyScopeType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The scope to use for filtering the results.</p>\\n         <p>To list only Amazon Web Services managed policies, set <code>Scope</code> to <code>AWS</code>. To\\n            list only the customer managed policies in your Amazon Web Services account, set <code>Scope</code> to\\n                <code>Local</code>.</p>\\n         <p>This parameter is optional. If it is not included, or if it is set to\\n            <code>All</code>, all policies are returned.</p>\"\n                    }\n                },\n                \"OnlyAttached\": {\n                    \"target\": \"com.amazonaws.iam#booleanType\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>A flag to filter the results to only the attached policies.</p>\\n         <p>When <code>OnlyAttached</code> is <code>true</code>, the returned list contains only\\n            the policies that are attached to an IAM user, group, or role. When\\n                <code>OnlyAttached</code> is <code>false</code>, or when the parameter is not\\n            included, all policies are returned.</p>\"\n                    }\n                },\n                \"PathPrefix\": {\n                    \"target\": \"com.amazonaws.iam#policyPathType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The path prefix for filtering the results. This parameter is optional. If it is not\\n            included, it defaults to a slash (/), listing all policies. This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting \\n    of either a forward slash (/) by itself or a string that must begin and end with forward slashes.\\n    In addition, it can contain any ASCII character from the ! (<code>\\\\u0021</code>) through the DEL character (<code>\\\\u007F</code>), including \\n    most punctuation characters, digits, and upper and lowercased letters.</p>\"\n                    }\n                },\n                \"PolicyUsageFilter\": {\n                    \"target\": \"com.amazonaws.iam#PolicyUsageType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The policy usage method to use for filtering the results.</p>\\n         <p>To list only permissions policies,\\n                set <code>PolicyUsageFilter</code> to <code>PermissionsPolicy</code>. To list only\\n            the policies used to set permissions boundaries, set the value\\n                to <code>PermissionsBoundary</code>.</p>\\n         <p>This parameter is optional. If it is not included, all policies are returned. </p>\"\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.iam#markerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter only when paginating results and only after \\n    you receive a response indicating that the results are truncated. Set it to the value of the\\n    <code>Marker</code> element in the response that you received to indicate where the next call \\n    should start.</p>\"\n                    }\n                },\n                \"MaxItems\": {\n                    \"target\": \"com.amazonaws.iam#maxItemsType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this only when paginating results to indicate the \\n    maximum number of items you want in the response. If additional items exist beyond the maximum \\n    you specify, the <code>IsTruncated</code> response element is <code>true</code>.</p>\\n         <p>If you do not include this parameter, the number of items defaults to 100. Note that\\n    IAM might return fewer results, even when there are more results available. In that case, the\\n    <code>IsTruncated</code> response element returns <code>true</code>, and <code>Marker</code> \\n    contains a value to include in the subsequent call that tells the service where to continue \\n    from.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#ListPoliciesResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Policies\": {\n                    \"target\": \"com.amazonaws.iam#policyListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of policies.</p>\"\n                    }\n                },\n                \"IsTruncated\": {\n                    \"target\": \"com.amazonaws.iam#booleanType\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>A flag that indicates whether there are more items to return. If your \\n    results were truncated, you can make a subsequent pagination request using the <code>Marker</code>\\n    request parameter to retrieve more items. Note that IAM might return fewer than the \\n    <code>MaxItems</code> number of results even when there are more results available. We recommend \\n    that you check <code>IsTruncated</code> after every call to ensure that you receive all your \\n    results.</p>\"\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.iam#responseMarkerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>When <code>IsTruncated</code> is <code>true</code>, this element\\n    is present and contains the value to use for the <code>Marker</code> parameter in a subsequent \\n    pagination request.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the response to a successful <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListPolicies.html\\\">ListPolicies</a> request. </p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#ListPolicyTags\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#ListPolicyTagsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#ListPolicyTagsResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#InvalidInputException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Lists the tags that are attached to the specified IAM customer managed policy.\\n      The returned list of tags is sorted by tag key. For more information about tagging, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_tags.html\\\">Tagging IAM resources</a> in the\\n      <i>IAM User Guide</i>.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"Marker\",\n                    \"outputToken\": \"Marker\",\n                    \"items\": \"Tags\",\n                    \"pageSize\": \"MaxItems\"\n                }\n            }\n        },\n        \"com.amazonaws.iam#ListPolicyTagsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PolicyArn\": {\n                    \"target\": \"com.amazonaws.iam#arnType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the IAM customer managed policy whose tags you want to see.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.iam#markerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter only when paginating results and only after \\n    you receive a response indicating that the results are truncated. Set it to the value of the\\n    <code>Marker</code> element in the response that you received to indicate where the next call \\n    should start.</p>\"\n                    }\n                },\n                \"MaxItems\": {\n                    \"target\": \"com.amazonaws.iam#maxItemsType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this only when paginating results to indicate the \\n    maximum number of items you want in the response. If additional items exist beyond the maximum \\n    you specify, the <code>IsTruncated</code> response element is <code>true</code>.</p>\\n         <p>If you do not include this parameter, the number of items defaults to 100. Note that\\n    IAM might return fewer results, even when there are more results available. In that case, the\\n    <code>IsTruncated</code> response element returns <code>true</code>, and <code>Marker</code> \\n    contains a value to include in the subsequent call that tells the service where to continue \\n    from.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#ListPolicyTagsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.iam#tagListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The list of tags that are currently attached to the IAM customer managed policy.\\n      Each tag consists of a key name and an associated value. If no tags are attached to the specified resource, the response contains an empty list.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"IsTruncated\": {\n                    \"target\": \"com.amazonaws.iam#booleanType\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>A flag that indicates whether there are more items to return. If your \\n    results were truncated, you can make a subsequent pagination request using the <code>Marker</code>\\n    request parameter to retrieve more items. Note that IAM might return fewer than the \\n    <code>MaxItems</code> number of results even when there are more results available. We recommend \\n    that you check <code>IsTruncated</code> after every call to ensure that you receive all your \\n    results.</p>\"\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.iam#responseMarkerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>When <code>IsTruncated</code> is <code>true</code>, this element\\n    is present and contains the value to use for the <code>Marker</code> parameter in a subsequent \\n    pagination request.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#ListPolicyVersions\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#ListPolicyVersionsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#ListPolicyVersionsResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#InvalidInputException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Lists information about the versions of the specified managed policy, including the\\n            version that is currently set as the policy's default version.</p>\\n         <p>For more information about managed policies, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/policies-managed-vs-inline.html\\\">Managed policies and inline\\n                policies</a> in the <i>IAM User Guide</i>.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"Marker\",\n                    \"outputToken\": \"Marker\",\n                    \"items\": \"Versions\",\n                    \"pageSize\": \"MaxItems\"\n                }\n            }\n        },\n        \"com.amazonaws.iam#ListPolicyVersionsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PolicyArn\": {\n                    \"target\": \"com.amazonaws.iam#arnType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the IAM policy for which you want the\\n            versions.</p>\\n         <p>For more information about ARNs, see <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html\\\">Amazon Resource Names (ARNs)</a> in the <i>Amazon Web Services General Reference</i>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.iam#markerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter only when paginating results and only after \\n    you receive a response indicating that the results are truncated. Set it to the value of the\\n    <code>Marker</code> element in the response that you received to indicate where the next call \\n    should start.</p>\"\n                    }\n                },\n                \"MaxItems\": {\n                    \"target\": \"com.amazonaws.iam#maxItemsType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this only when paginating results to indicate the \\n    maximum number of items you want in the response. If additional items exist beyond the maximum \\n    you specify, the <code>IsTruncated</code> response element is <code>true</code>.</p>\\n         <p>If you do not include this parameter, the number of items defaults to 100. Note that\\n    IAM might return fewer results, even when there are more results available. In that case, the\\n    <code>IsTruncated</code> response element returns <code>true</code>, and <code>Marker</code> \\n    contains a value to include in the subsequent call that tells the service where to continue \\n    from.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#ListPolicyVersionsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Versions\": {\n                    \"target\": \"com.amazonaws.iam#policyDocumentVersionListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of policy versions.</p>\\n         <p>For more information about managed policy versions, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/policies-managed-versions.html\\\">Versioning for managed\\n                policies</a> in the <i>IAM User Guide</i>.</p>\"\n                    }\n                },\n                \"IsTruncated\": {\n                    \"target\": \"com.amazonaws.iam#booleanType\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>A flag that indicates whether there are more items to return. If your \\n    results were truncated, you can make a subsequent pagination request using the <code>Marker</code>\\n    request parameter to retrieve more items. Note that IAM might return fewer than the \\n    <code>MaxItems</code> number of results even when there are more results available. We recommend \\n    that you check <code>IsTruncated</code> after every call to ensure that you receive all your \\n    results.</p>\"\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.iam#responseMarkerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>When <code>IsTruncated</code> is <code>true</code>, this element\\n    is present and contains the value to use for the <code>Marker</code> parameter in a subsequent \\n    pagination request.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the response to a successful <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListPolicyVersions.html\\\">ListPolicyVersions</a>\\n      request. </p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#ListRolePolicies\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#ListRolePoliciesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#ListRolePoliciesResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Lists the names of the inline policies that are embedded in the specified IAM\\n            role.</p>\\n         <p>An IAM role can also have managed policies attached to it. To list the managed\\n            policies that are attached to a role, use <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListAttachedRolePolicies.html\\\">ListAttachedRolePolicies</a>. For more information about policies, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/policies-managed-vs-inline.html\\\">Managed\\n                policies and inline policies</a> in the\\n            <i>IAM User Guide</i>.</p>\\n         <p>You can paginate the results using the <code>MaxItems</code> and <code>Marker</code>\\n            parameters. If there are no inline policies embedded with the specified role, the\\n            operation returns an empty list.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"Marker\",\n                    \"outputToken\": \"Marker\",\n                    \"items\": \"PolicyNames\",\n                    \"pageSize\": \"MaxItems\"\n                }\n            }\n        },\n        \"com.amazonaws.iam#ListRolePoliciesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RoleName\": {\n                    \"target\": \"com.amazonaws.iam#roleNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the role to list policies for.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.iam#markerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter only when paginating results and only after \\n    you receive a response indicating that the results are truncated. Set it to the value of the\\n    <code>Marker</code> element in the response that you received to indicate where the next call \\n    should start.</p>\"\n                    }\n                },\n                \"MaxItems\": {\n                    \"target\": \"com.amazonaws.iam#maxItemsType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this only when paginating results to indicate the \\n    maximum number of items you want in the response. If additional items exist beyond the maximum \\n    you specify, the <code>IsTruncated</code> response element is <code>true</code>.</p>\\n         <p>If you do not include this parameter, the number of items defaults to 100. Note that\\n    IAM might return fewer results, even when there are more results available. In that case, the\\n    <code>IsTruncated</code> response element returns <code>true</code>, and <code>Marker</code> \\n    contains a value to include in the subsequent call that tells the service where to continue \\n    from.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#ListRolePoliciesResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PolicyNames\": {\n                    \"target\": \"com.amazonaws.iam#policyNameListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of policy names.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"IsTruncated\": {\n                    \"target\": \"com.amazonaws.iam#booleanType\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>A flag that indicates whether there are more items to return. If your \\n    results were truncated, you can make a subsequent pagination request using the <code>Marker</code>\\n    request parameter to retrieve more items. Note that IAM might return fewer than the \\n    <code>MaxItems</code> number of results even when there are more results available. We recommend \\n    that you check <code>IsTruncated</code> after every call to ensure that you receive all your \\n    results.</p>\"\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.iam#responseMarkerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>When <code>IsTruncated</code> is <code>true</code>, this element\\n    is present and contains the value to use for the <code>Marker</code> parameter in a subsequent \\n    pagination request.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the response to a successful <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListRolePolicies.html\\\">ListRolePolicies</a> request.\\n    </p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#ListRoleTags\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#ListRoleTagsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#ListRoleTagsResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Lists the tags that are attached to the specified role. The returned list of tags is\\n      sorted by tag key. For more information about tagging, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_tags.html\\\">Tagging IAM resources</a> in the\\n      <i>IAM User Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To list the tags attached to an IAM role\",\n                        \"documentation\": \"The following example shows how to list the tags attached to a role.\",\n                        \"input\": {\n                            \"RoleName\": \"taggedrole1\"\n                        },\n                        \"output\": {\n                            \"Tags\": [\n                                {\n                                    \"Key\": \"Dept\",\n                                    \"Value\": \"12345\"\n                                },\n                                {\n                                    \"Key\": \"Team\",\n                                    \"Value\": \"Accounting\"\n                                }\n                            ],\n                            \"IsTruncated\": false\n                        }\n                    }\n                ],\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"Marker\",\n                    \"outputToken\": \"Marker\",\n                    \"items\": \"Tags\",\n                    \"pageSize\": \"MaxItems\"\n                }\n            }\n        },\n        \"com.amazonaws.iam#ListRoleTagsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RoleName\": {\n                    \"target\": \"com.amazonaws.iam#roleNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the IAM role for which you want to see the list of tags.</p>\\n         <p>This parameter accepts (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters that consist of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.iam#markerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter only when paginating results and only after \\n    you receive a response indicating that the results are truncated. Set it to the value of the\\n    <code>Marker</code> element in the response that you received to indicate where the next call \\n    should start.</p>\"\n                    }\n                },\n                \"MaxItems\": {\n                    \"target\": \"com.amazonaws.iam#maxItemsType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this only when paginating results to indicate the \\n    maximum number of items you want in the response. If additional items exist beyond the maximum \\n    you specify, the <code>IsTruncated</code> response element is <code>true</code>.</p>\\n         <p>If you do not include this parameter, the number of items defaults to 100. Note that\\n    IAM might return fewer results, even when there are more results available. In that case, the\\n    <code>IsTruncated</code> response element returns <code>true</code>, and <code>Marker</code> \\n    contains a value to include in the subsequent call that tells the service where to continue \\n    from.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#ListRoleTagsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.iam#tagListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The list of tags that are currently attached to the role. Each tag consists of a key name and an associated value. If no tags are attached to the specified resource, the response contains an empty list.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"IsTruncated\": {\n                    \"target\": \"com.amazonaws.iam#booleanType\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>A flag that indicates whether there are more items to return. If your \\n    results were truncated, you can make a subsequent pagination request using the <code>Marker</code>\\n    request parameter to retrieve more items. Note that IAM might return fewer than the \\n    <code>MaxItems</code> number of results even when there are more results available. We recommend \\n    that you check <code>IsTruncated</code> after every call to ensure that you receive all your \\n    results.</p>\"\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.iam#responseMarkerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>When <code>IsTruncated</code> is <code>true</code>, this element\\n    is present and contains the value to use for the <code>Marker</code> parameter in a subsequent \\n    pagination request.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#ListRoles\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#ListRolesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#ListRolesResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Lists the IAM roles that have the specified path prefix. If there are none, the\\n            operation returns an empty list. For more information about roles, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html\\\">IAM roles</a> in the\\n                <i>IAM User Guide</i>.</p>\\n         <note>\\n            <p>IAM resource-listing operations return a subset of the available \\n   attributes for the resource. This operation does not return the following attributes, even though they are an attribute of the returned object:</p>\\n            <ul>\\n               <li>\\n                  <p>PermissionsBoundary</p>\\n               </li>\\n               <li>\\n                  <p>RoleLastUsed</p>\\n               </li>\\n               <li>\\n                  <p>Tags</p>\\n               </li>\\n            </ul>\\n            <p>To view all of the information for a role, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetRole.html\\\">GetRole</a>.</p>\\n         </note>\\n         <p>You can paginate the results using the <code>MaxItems</code> and <code>Marker</code>\\n            parameters.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"Marker\",\n                    \"outputToken\": \"Marker\",\n                    \"items\": \"Roles\",\n                    \"pageSize\": \"MaxItems\"\n                }\n            }\n        },\n        \"com.amazonaws.iam#ListRolesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PathPrefix\": {\n                    \"target\": \"com.amazonaws.iam#pathPrefixType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The path prefix for filtering the results. For example, the prefix\\n                <code>/application_abc/component_xyz/</code> gets all roles whose path starts with\\n                <code>/application_abc/component_xyz/</code>.</p>\\n         <p>This parameter is optional. If it is not included, it defaults to a slash (/), listing\\n            all roles. This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting \\n    of either a forward slash (/) by itself or a string that must begin and end with forward slashes.\\n    In addition, it can contain any ASCII character from the ! (<code>\\\\u0021</code>) through the DEL character (<code>\\\\u007F</code>), including \\n    most punctuation characters, digits, and upper and lowercased letters.</p>\"\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.iam#markerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter only when paginating results and only after \\n    you receive a response indicating that the results are truncated. Set it to the value of the\\n    <code>Marker</code> element in the response that you received to indicate where the next call \\n    should start.</p>\"\n                    }\n                },\n                \"MaxItems\": {\n                    \"target\": \"com.amazonaws.iam#maxItemsType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this only when paginating results to indicate the \\n    maximum number of items you want in the response. If additional items exist beyond the maximum \\n    you specify, the <code>IsTruncated</code> response element is <code>true</code>.</p>\\n         <p>If you do not include this parameter, the number of items defaults to 100. Note that\\n    IAM might return fewer results, even when there are more results available. In that case, the\\n    <code>IsTruncated</code> response element returns <code>true</code>, and <code>Marker</code> \\n    contains a value to include in the subsequent call that tells the service where to continue \\n    from.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#ListRolesResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Roles\": {\n                    \"target\": \"com.amazonaws.iam#roleListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of roles.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"IsTruncated\": {\n                    \"target\": \"com.amazonaws.iam#booleanType\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>A flag that indicates whether there are more items to return. If your \\n    results were truncated, you can make a subsequent pagination request using the <code>Marker</code>\\n    request parameter to retrieve more items. Note that IAM might return fewer than the \\n    <code>MaxItems</code> number of results even when there are more results available. We recommend \\n    that you check <code>IsTruncated</code> after every call to ensure that you receive all your \\n    results.</p>\"\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.iam#responseMarkerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>When <code>IsTruncated</code> is <code>true</code>, this element\\n    is present and contains the value to use for the <code>Marker</code> parameter in a subsequent \\n    pagination request.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the response to a successful <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListRoles.html\\\">ListRoles</a> request. </p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#ListSAMLProviderTags\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#ListSAMLProviderTagsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#ListSAMLProviderTagsResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#InvalidInputException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Lists the tags that are attached to the specified Security Assertion Markup Language\\n      (SAML) identity provider. The returned list of tags is sorted by tag key. For more information, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_saml.html\\\">About SAML 2.0-based\\n      federation</a>.</p>\\n         <p>For more information about tagging, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_tags.html\\\">Tagging IAM resources</a> in the\\n      <i>IAM User Guide</i>.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"Marker\",\n                    \"outputToken\": \"Marker\",\n                    \"items\": \"Tags\",\n                    \"pageSize\": \"MaxItems\"\n                }\n            }\n        },\n        \"com.amazonaws.iam#ListSAMLProviderTagsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SAMLProviderArn\": {\n                    \"target\": \"com.amazonaws.iam#arnType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the Security Assertion Markup Language (SAML) identity provider whose tags\\n      you want to see.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.iam#markerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter only when paginating results and only after \\n    you receive a response indicating that the results are truncated. Set it to the value of the\\n    <code>Marker</code> element in the response that you received to indicate where the next call \\n    should start.</p>\"\n                    }\n                },\n                \"MaxItems\": {\n                    \"target\": \"com.amazonaws.iam#maxItemsType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this only when paginating results to indicate the \\n    maximum number of items you want in the response. If additional items exist beyond the maximum \\n    you specify, the <code>IsTruncated</code> response element is <code>true</code>.</p>\\n         <p>If you do not include this parameter, the number of items defaults to 100. Note that\\n    IAM might return fewer results, even when there are more results available. In that case, the\\n    <code>IsTruncated</code> response element returns <code>true</code>, and <code>Marker</code> \\n    contains a value to include in the subsequent call that tells the service where to continue \\n    from.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#ListSAMLProviderTagsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.iam#tagListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The list of tags that are currently attached to the Security Assertion Markup Language\\n      (SAML) identity provider. Each tag consists of a key name and an associated value. If no tags are attached to the specified resource, the response contains an empty list.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"IsTruncated\": {\n                    \"target\": \"com.amazonaws.iam#booleanType\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>A flag that indicates whether there are more items to return. If your \\n    results were truncated, you can make a subsequent pagination request using the <code>Marker</code>\\n    request parameter to retrieve more items. Note that IAM might return fewer than the \\n    <code>MaxItems</code> number of results even when there are more results available. We recommend \\n    that you check <code>IsTruncated</code> after every call to ensure that you receive all your \\n    results.</p>\"\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.iam#responseMarkerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>When <code>IsTruncated</code> is <code>true</code>, this element\\n    is present and contains the value to use for the <code>Marker</code> parameter in a subsequent \\n    pagination request.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#ListSAMLProviders\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#ListSAMLProvidersRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#ListSAMLProvidersResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Lists the SAML provider resource objects defined in IAM in the account.\\n            IAM resource-listing operations return a subset of the available \\n   attributes for the resource. For example, this operation does not return tags, even though they are an attribute of the returned object. To view all of the information for a SAML provider, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetSAMLProvider.html\\\">GetSAMLProvider</a>.</p>\\n         <important>\\n            <p> This operation requires <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html\\\">Signature Version 4</a>.</p>\\n         </important>\"\n            }\n        },\n        \"com.amazonaws.iam#ListSAMLProvidersRequest\": {\n            \"type\": \"structure\",\n            \"members\": {},\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#ListSAMLProvidersResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SAMLProviderList\": {\n                    \"target\": \"com.amazonaws.iam#SAMLProviderListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The list of SAML provider resource objects defined in IAM for this Amazon Web Services\\n            account.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the response to a successful <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListSAMLProviders.html\\\">ListSAMLProviders</a> request.\\n    </p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#ListSSHPublicKeys\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#ListSSHPublicKeysRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#ListSSHPublicKeysResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns information about the SSH public keys associated with the specified IAM\\n            user. If none exists, the operation returns an empty list.</p>\\n         <p>The SSH public keys returned by this operation are used only for authenticating the\\n            IAM user to an CodeCommit repository. For more information about using SSH keys to\\n            authenticate to an CodeCommit repository, see <a href=\\\"https://docs.aws.amazon.com/codecommit/latest/userguide/setting-up-credentials-ssh.html\\\">Set up CodeCommit for\\n                SSH connections</a> in the <i>CodeCommit User Guide</i>.</p>\\n         <p>Although each user is limited to a small number of keys, you can still paginate the\\n            results using the <code>MaxItems</code> and <code>Marker</code> parameters.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"Marker\",\n                    \"outputToken\": \"Marker\",\n                    \"items\": \"SSHPublicKeys\",\n                    \"pageSize\": \"MaxItems\"\n                }\n            }\n        },\n        \"com.amazonaws.iam#ListSSHPublicKeysRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"UserName\": {\n                    \"target\": \"com.amazonaws.iam#userNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the IAM user to list SSH public keys for. If none is specified, the\\n                <code>UserName</code> field is determined implicitly based on the Amazon Web Services access key\\n            used to sign the request.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\"\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.iam#markerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter only when paginating results and only after \\n    you receive a response indicating that the results are truncated. Set it to the value of the\\n    <code>Marker</code> element in the response that you received to indicate where the next call \\n    should start.</p>\"\n                    }\n                },\n                \"MaxItems\": {\n                    \"target\": \"com.amazonaws.iam#maxItemsType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this only when paginating results to indicate the \\n    maximum number of items you want in the response. If additional items exist beyond the maximum \\n    you specify, the <code>IsTruncated</code> response element is <code>true</code>.</p>\\n         <p>If you do not include this parameter, the number of items defaults to 100. Note that\\n    IAM might return fewer results, even when there are more results available. In that case, the\\n    <code>IsTruncated</code> response element returns <code>true</code>, and <code>Marker</code> \\n    contains a value to include in the subsequent call that tells the service where to continue \\n    from.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#ListSSHPublicKeysResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SSHPublicKeys\": {\n                    \"target\": \"com.amazonaws.iam#SSHPublicKeyListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of the SSH public keys assigned to IAM user.</p>\"\n                    }\n                },\n                \"IsTruncated\": {\n                    \"target\": \"com.amazonaws.iam#booleanType\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>A flag that indicates whether there are more items to return. If your \\n    results were truncated, you can make a subsequent pagination request using the <code>Marker</code>\\n    request parameter to retrieve more items. Note that IAM might return fewer than the \\n    <code>MaxItems</code> number of results even when there are more results available. We recommend \\n    that you check <code>IsTruncated</code> after every call to ensure that you receive all your \\n    results.</p>\"\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.iam#responseMarkerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>When <code>IsTruncated</code> is <code>true</code>, this element\\n    is present and contains the value to use for the <code>Marker</code> parameter in a subsequent \\n    pagination request.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the response to a successful <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListSSHPublicKeys.html\\\">ListSSHPublicKeys</a>\\n      request.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#ListServerCertificateTags\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#ListServerCertificateTagsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#ListServerCertificateTagsResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Lists the tags that are attached to the specified IAM server certificate. The\\n      returned list of tags is sorted by tag key. For more information about tagging, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_tags.html\\\">Tagging IAM resources</a> in the\\n      <i>IAM User Guide</i>.</p>\\n         <note>\\n            <p>For certificates in a Region supported by Certificate Manager (ACM), we\\n        recommend that you don't use IAM server certificates. Instead, use ACM to provision,\\n        manage, and deploy your server certificates. For more information about IAM server\\n        certificates, <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_server-certs.html\\\">Working with server\\n          certificates</a> in the <i>IAM User Guide</i>.</p>\\n         </note>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"Marker\",\n                    \"outputToken\": \"Marker\",\n                    \"items\": \"Tags\",\n                    \"pageSize\": \"MaxItems\"\n                }\n            }\n        },\n        \"com.amazonaws.iam#ListServerCertificateTagsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ServerCertificateName\": {\n                    \"target\": \"com.amazonaws.iam#serverCertificateNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the IAM server certificate whose tags you want to see.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.iam#markerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter only when paginating results and only after \\n    you receive a response indicating that the results are truncated. Set it to the value of the\\n    <code>Marker</code> element in the response that you received to indicate where the next call \\n    should start.</p>\"\n                    }\n                },\n                \"MaxItems\": {\n                    \"target\": \"com.amazonaws.iam#maxItemsType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this only when paginating results to indicate the \\n    maximum number of items you want in the response. If additional items exist beyond the maximum \\n    you specify, the <code>IsTruncated</code> response element is <code>true</code>.</p>\\n         <p>If you do not include this parameter, the number of items defaults to 100. Note that\\n    IAM might return fewer results, even when there are more results available. In that case, the\\n    <code>IsTruncated</code> response element returns <code>true</code>, and <code>Marker</code> \\n    contains a value to include in the subsequent call that tells the service where to continue \\n    from.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#ListServerCertificateTagsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.iam#tagListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The list of tags that are currently attached to the IAM server certificate.\\n      Each tag consists of a key name and an associated value. If no tags are attached to the specified resource, the response contains an empty list.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"IsTruncated\": {\n                    \"target\": \"com.amazonaws.iam#booleanType\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>A flag that indicates whether there are more items to return. If your \\n    results were truncated, you can make a subsequent pagination request using the <code>Marker</code>\\n    request parameter to retrieve more items. Note that IAM might return fewer than the \\n    <code>MaxItems</code> number of results even when there are more results available. We recommend \\n    that you check <code>IsTruncated</code> after every call to ensure that you receive all your \\n    results.</p>\"\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.iam#responseMarkerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>When <code>IsTruncated</code> is <code>true</code>, this element\\n    is present and contains the value to use for the <code>Marker</code> parameter in a subsequent \\n    pagination request.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#ListServerCertificates\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#ListServerCertificatesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#ListServerCertificatesResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Lists the server certificates stored in IAM that have the specified path prefix. If\\n            none exist, the operation returns an empty list.</p>\\n         <p> You can paginate the results using the <code>MaxItems</code> and <code>Marker</code>\\n            parameters.</p>\\n         <p>For more information about working with server certificates, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_server-certs.html\\\">Working\\n                with server certificates</a> in the <i>IAM User Guide</i>. This\\n            topic also includes a list of Amazon Web Services services that can use the server certificates that\\n            you manage with IAM.</p>\\n         <note>\\n            <p>IAM resource-listing operations return a subset of the available \\n   attributes for the resource. For example, this operation does not return tags, even though they are an attribute of the returned object. To view all of the information for a servercertificate, see\\n                    <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetServerCertificate.html\\\">GetServerCertificate</a>.</p>\\n         </note>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"Marker\",\n                    \"outputToken\": \"Marker\",\n                    \"items\": \"ServerCertificateMetadataList\",\n                    \"pageSize\": \"MaxItems\"\n                }\n            }\n        },\n        \"com.amazonaws.iam#ListServerCertificatesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PathPrefix\": {\n                    \"target\": \"com.amazonaws.iam#pathPrefixType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The path prefix for filtering the results. For example:\\n                <code>/company/servercerts</code> would get all server certificates for which the\\n            path starts with <code>/company/servercerts</code>.</p>\\n         <p>This parameter is optional. If it is not included, it defaults to a slash (/), listing\\n            all server certificates. This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting \\n    of either a forward slash (/) by itself or a string that must begin and end with forward slashes.\\n    In addition, it can contain any ASCII character from the ! (<code>\\\\u0021</code>) through the DEL character (<code>\\\\u007F</code>), including \\n    most punctuation characters, digits, and upper and lowercased letters.</p>\"\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.iam#markerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter only when paginating results and only after \\n    you receive a response indicating that the results are truncated. Set it to the value of the\\n    <code>Marker</code> element in the response that you received to indicate where the next call \\n    should start.</p>\"\n                    }\n                },\n                \"MaxItems\": {\n                    \"target\": \"com.amazonaws.iam#maxItemsType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this only when paginating results to indicate the \\n    maximum number of items you want in the response. If additional items exist beyond the maximum \\n    you specify, the <code>IsTruncated</code> response element is <code>true</code>.</p>\\n         <p>If you do not include this parameter, the number of items defaults to 100. Note that\\n    IAM might return fewer results, even when there are more results available. In that case, the\\n    <code>IsTruncated</code> response element returns <code>true</code>, and <code>Marker</code> \\n    contains a value to include in the subsequent call that tells the service where to continue \\n    from.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#ListServerCertificatesResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ServerCertificateMetadataList\": {\n                    \"target\": \"com.amazonaws.iam#serverCertificateMetadataListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of server certificates.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"IsTruncated\": {\n                    \"target\": \"com.amazonaws.iam#booleanType\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>A flag that indicates whether there are more items to return. If your \\n    results were truncated, you can make a subsequent pagination request using the <code>Marker</code>\\n    request parameter to retrieve more items. Note that IAM might return fewer than the \\n    <code>MaxItems</code> number of results even when there are more results available. We recommend \\n    that you check <code>IsTruncated</code> after every call to ensure that you receive all your \\n    results.</p>\"\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.iam#responseMarkerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>When <code>IsTruncated</code> is <code>true</code>, this element\\n    is present and contains the value to use for the <code>Marker</code> parameter in a subsequent \\n    pagination request.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the response to a successful <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListServerCertificates.html\\\">ListServerCertificates</a>\\n      request. </p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#ListServiceSpecificCredentials\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#ListServiceSpecificCredentialsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#ListServiceSpecificCredentialsResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceNotSupportedException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns information about the service-specific credentials associated with the\\n            specified IAM user. If none exists, the operation returns an empty list. The\\n            service-specific credentials returned by this operation are used only for authenticating\\n            the IAM user to a specific service. For more information about using service-specific\\n            credentials to authenticate to an Amazon Web Services service, see <a href=\\\"https://docs.aws.amazon.com/codecommit/latest/userguide/setting-up-gc.html\\\">Set up service-specific credentials</a>\\n            in the CodeCommit User Guide.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#ListServiceSpecificCredentialsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"UserName\": {\n                    \"target\": \"com.amazonaws.iam#userNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the user whose service-specific credentials you want information about. If\\n            this value is not specified, then the operation assumes the user whose credentials are\\n            used to call the operation.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\"\n                    }\n                },\n                \"ServiceName\": {\n                    \"target\": \"com.amazonaws.iam#serviceName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Filters the returned results to only those for the specified Amazon Web Services service. If not\\n            specified, then Amazon Web Services returns service-specific credentials for all services.</p>\"\n                    }\n                },\n                \"AllUsers\": {\n                    \"target\": \"com.amazonaws.iam#allUsers\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A flag indicating whether to list service specific credentials for all users. This\\n            parameter cannot be specified together with UserName. When true, returns all credentials\\n            associated with the specified service.</p>\"\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.iam#markerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter only when paginating results and only after you receive a response\\n            indicating that the results are truncated. Set it to the value of the Marker from the\\n            response that you received to indicate where the next call should start.</p>\"\n                    }\n                },\n                \"MaxItems\": {\n                    \"target\": \"com.amazonaws.iam#maxItemsType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this only when paginating results to indicate the maximum number of items you want\\n            in the response. If additional items exist beyond the maximum you specify, the\\n            IsTruncated response element is true.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#ListServiceSpecificCredentialsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ServiceSpecificCredentials\": {\n                    \"target\": \"com.amazonaws.iam#ServiceSpecificCredentialsListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of structures that each contain details about a service-specific\\n            credential.</p>\"\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.iam#responseMarkerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>When IsTruncated is true, this element is present and contains the value to use for\\n            the Marker parameter in a subsequent pagination request.</p>\"\n                    }\n                },\n                \"IsTruncated\": {\n                    \"target\": \"com.amazonaws.iam#booleanType\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>A flag that indicates whether there are more items to return. If your results were\\n            truncated, you can make a subsequent pagination request using the Marker request\\n            parameter to retrieve more items.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#ListSigningCertificates\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#ListSigningCertificatesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#ListSigningCertificatesResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns information about the signing certificates associated with the specified IAM\\n            user. If none exists, the operation returns an empty list.</p>\\n         <p>Although each user is limited to a small number of signing certificates, you can still\\n            paginate the results using the <code>MaxItems</code> and <code>Marker</code>\\n            parameters.</p>\\n         <p>If the <code>UserName</code> field is not specified, the user name is determined\\n            implicitly based on the Amazon Web Services access key ID used to sign the request for this operation.\\n            This operation works for access keys under the Amazon Web Services account. Consequently, you can use\\n            this operation to manage Amazon Web Services account root user credentials even if the Amazon Web Services account has no\\n            associated users.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To list the signing certificates for an IAM user\",\n                        \"documentation\": \"The following command lists the signing certificates for the IAM user named Bob.\",\n                        \"input\": {\n                            \"UserName\": \"Bob\"\n                        },\n                        \"output\": {\n                            \"Certificates\": [\n                                {\n                                    \"UserName\": \"Bob\",\n                                    \"Status\": \"Active\",\n                                    \"CertificateBody\": \"-----BEGIN CERTIFICATE-----<certificate-body>-----END CERTIFICATE-----\",\n                                    \"CertificateId\": \"TA7SMP42TDN5Z26OBPJE7EXAMPLE\",\n                                    \"UploadDate\": \"2013-06-06T21:40:08Z\"\n                                }\n                            ]\n                        }\n                    }\n                ],\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"Marker\",\n                    \"outputToken\": \"Marker\",\n                    \"items\": \"Certificates\",\n                    \"pageSize\": \"MaxItems\"\n                }\n            }\n        },\n        \"com.amazonaws.iam#ListSigningCertificatesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"UserName\": {\n                    \"target\": \"com.amazonaws.iam#existingUserNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the IAM user whose signing certificates you want to examine.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\"\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.iam#markerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter only when paginating results and only after \\n    you receive a response indicating that the results are truncated. Set it to the value of the\\n    <code>Marker</code> element in the response that you received to indicate where the next call \\n    should start.</p>\"\n                    }\n                },\n                \"MaxItems\": {\n                    \"target\": \"com.amazonaws.iam#maxItemsType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this only when paginating results to indicate the \\n    maximum number of items you want in the response. If additional items exist beyond the maximum \\n    you specify, the <code>IsTruncated</code> response element is <code>true</code>.</p>\\n         <p>If you do not include this parameter, the number of items defaults to 100. Note that\\n    IAM might return fewer results, even when there are more results available. In that case, the\\n    <code>IsTruncated</code> response element returns <code>true</code>, and <code>Marker</code> \\n    contains a value to include in the subsequent call that tells the service where to continue \\n    from.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#ListSigningCertificatesResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Certificates\": {\n                    \"target\": \"com.amazonaws.iam#certificateListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of the user's signing certificate information.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"IsTruncated\": {\n                    \"target\": \"com.amazonaws.iam#booleanType\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>A flag that indicates whether there are more items to return. If your \\n    results were truncated, you can make a subsequent pagination request using the <code>Marker</code>\\n    request parameter to retrieve more items. Note that IAM might return fewer than the \\n    <code>MaxItems</code> number of results even when there are more results available. We recommend \\n    that you check <code>IsTruncated</code> after every call to ensure that you receive all your \\n    results.</p>\"\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.iam#responseMarkerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>When <code>IsTruncated</code> is <code>true</code>, this element\\n    is present and contains the value to use for the <code>Marker</code> parameter in a subsequent \\n    pagination request.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the response to a successful <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListSigningCertificates.html\\\">ListSigningCertificates</a> request. </p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#ListUserPolicies\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#ListUserPoliciesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#ListUserPoliciesResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Lists the names of the inline policies embedded in the specified IAM user.</p>\\n         <p>An IAM user can also have managed policies attached to it. To list the managed\\n            policies that are attached to a user, use <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListAttachedUserPolicies.html\\\">ListAttachedUserPolicies</a>. For more information about policies, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/policies-managed-vs-inline.html\\\">Managed\\n                policies and inline policies</a> in the\\n            <i>IAM User Guide</i>.</p>\\n         <p>You can paginate the results using the <code>MaxItems</code> and <code>Marker</code>\\n            parameters. If there are no inline policies embedded with the specified user, the\\n            operation returns an empty list.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"Marker\",\n                    \"outputToken\": \"Marker\",\n                    \"items\": \"PolicyNames\",\n                    \"pageSize\": \"MaxItems\"\n                }\n            }\n        },\n        \"com.amazonaws.iam#ListUserPoliciesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"UserName\": {\n                    \"target\": \"com.amazonaws.iam#existingUserNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the user to list policies for.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.iam#markerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter only when paginating results and only after \\n    you receive a response indicating that the results are truncated. Set it to the value of the\\n    <code>Marker</code> element in the response that you received to indicate where the next call \\n    should start.</p>\"\n                    }\n                },\n                \"MaxItems\": {\n                    \"target\": \"com.amazonaws.iam#maxItemsType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this only when paginating results to indicate the \\n    maximum number of items you want in the response. If additional items exist beyond the maximum \\n    you specify, the <code>IsTruncated</code> response element is <code>true</code>.</p>\\n         <p>If you do not include this parameter, the number of items defaults to 100. Note that\\n    IAM might return fewer results, even when there are more results available. In that case, the\\n    <code>IsTruncated</code> response element returns <code>true</code>, and <code>Marker</code> \\n    contains a value to include in the subsequent call that tells the service where to continue \\n    from.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#ListUserPoliciesResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PolicyNames\": {\n                    \"target\": \"com.amazonaws.iam#policyNameListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of policy names.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"IsTruncated\": {\n                    \"target\": \"com.amazonaws.iam#booleanType\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>A flag that indicates whether there are more items to return. If your \\n    results were truncated, you can make a subsequent pagination request using the <code>Marker</code>\\n    request parameter to retrieve more items. Note that IAM might return fewer than the \\n    <code>MaxItems</code> number of results even when there are more results available. We recommend \\n    that you check <code>IsTruncated</code> after every call to ensure that you receive all your \\n    results.</p>\"\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.iam#responseMarkerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>When <code>IsTruncated</code> is <code>true</code>, this element\\n    is present and contains the value to use for the <code>Marker</code> parameter in a subsequent \\n    pagination request.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the response to a successful <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListUserPolicies.html\\\">ListUserPolicies</a> request.\\n    </p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#ListUserTags\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#ListUserTagsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#ListUserTagsResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Lists the tags that are attached to the specified IAM user. The returned list of tags is sorted by tag key. For more information about tagging, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_tags.html\\\">Tagging IAM resources</a> in the\\n      <i>IAM User Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To list the tags attached to an IAM user\",\n                        \"documentation\": \"The following example shows how to list the tags attached to a user.\",\n                        \"input\": {\n                            \"UserName\": \"anika\"\n                        },\n                        \"output\": {\n                            \"Tags\": [\n                                {\n                                    \"Key\": \"Dept\",\n                                    \"Value\": \"12345\"\n                                },\n                                {\n                                    \"Key\": \"Team\",\n                                    \"Value\": \"Accounting\"\n                                }\n                            ],\n                            \"IsTruncated\": false\n                        }\n                    }\n                ],\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"Marker\",\n                    \"outputToken\": \"Marker\",\n                    \"items\": \"Tags\",\n                    \"pageSize\": \"MaxItems\"\n                }\n            }\n        },\n        \"com.amazonaws.iam#ListUserTagsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"UserName\": {\n                    \"target\": \"com.amazonaws.iam#existingUserNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the IAM user whose tags you want to see.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.iam#markerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter only when paginating results and only after \\n    you receive a response indicating that the results are truncated. Set it to the value of the\\n    <code>Marker</code> element in the response that you received to indicate where the next call \\n    should start.</p>\"\n                    }\n                },\n                \"MaxItems\": {\n                    \"target\": \"com.amazonaws.iam#maxItemsType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this only when paginating results to indicate the \\n    maximum number of items you want in the response. If additional items exist beyond the maximum \\n    you specify, the <code>IsTruncated</code> response element is <code>true</code>.</p>\\n         <p>If you do not include this parameter, the number of items defaults to 100. Note that\\n    IAM might return fewer results, even when there are more results available. In that case, the\\n    <code>IsTruncated</code> response element returns <code>true</code>, and <code>Marker</code> \\n    contains a value to include in the subsequent call that tells the service where to continue \\n    from.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#ListUserTagsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.iam#tagListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The list of tags that are currently attached to the user. Each tag consists of a key name and an associated value. If no tags are attached to the specified resource, the response contains an empty list.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"IsTruncated\": {\n                    \"target\": \"com.amazonaws.iam#booleanType\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>A flag that indicates whether there are more items to return. If your \\n    results were truncated, you can make a subsequent pagination request using the <code>Marker</code>\\n    request parameter to retrieve more items. Note that IAM might return fewer than the \\n    <code>MaxItems</code> number of results even when there are more results available. We recommend \\n    that you check <code>IsTruncated</code> after every call to ensure that you receive all your \\n    results.</p>\"\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.iam#responseMarkerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>When <code>IsTruncated</code> is <code>true</code>, this element\\n    is present and contains the value to use for the <code>Marker</code> parameter in a subsequent \\n    pagination request.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#ListUsers\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#ListUsersRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#ListUsersResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Lists the IAM users that have the specified path prefix. If no path prefix is\\n            specified, the operation returns all users in the Amazon Web Services account. If there are none, the\\n            operation returns an empty list.</p>\\n         <note>\\n            <p>IAM resource-listing operations return a subset of the available \\n   attributes for the resource. This operation does not return the following attributes, even though they are an attribute of the returned object:</p>\\n            <ul>\\n               <li>\\n                  <p>PermissionsBoundary</p>\\n               </li>\\n               <li>\\n                  <p>Tags</p>\\n               </li>\\n            </ul>\\n            <p>To view all of the information for a user, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetUser.html\\\">GetUser</a>.</p>\\n         </note>\\n         <p>You can paginate the results using the <code>MaxItems</code> and <code>Marker</code>\\n            parameters.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To list IAM users\",\n                        \"documentation\": \"The following command lists the IAM users in the current account.\",\n                        \"output\": {\n                            \"Users\": [\n                                {\n                                    \"UserId\": \"AID2MAB8DPLSRHEXAMPLE\",\n                                    \"Path\": \"/division_abc/subdivision_xyz/engineering/\",\n                                    \"UserName\": \"Juan\",\n                                    \"Arn\": \"arn:aws:iam::123456789012:user/division_abc/subdivision_xyz/engineering/Juan\",\n                                    \"CreateDate\": \"2012-09-05T19:38:48Z\",\n                                    \"PasswordLastUsed\": \"2016-09-08T21:47:36Z\"\n                                },\n                                {\n                                    \"UserId\": \"AIDIODR4TAW7CSEXAMPLE\",\n                                    \"Path\": \"/division_abc/subdivision_xyz/engineering/\",\n                                    \"UserName\": \"Anika\",\n                                    \"Arn\": \"arn:aws:iam::123456789012:user/division_abc/subdivision_xyz/engineering/Anika\",\n                                    \"CreateDate\": \"2014-04-09T15:43:45Z\",\n                                    \"PasswordLastUsed\": \"2016-09-24T16:18:07Z\"\n                                }\n                            ]\n                        }\n                    }\n                ],\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"Marker\",\n                    \"outputToken\": \"Marker\",\n                    \"items\": \"Users\",\n                    \"pageSize\": \"MaxItems\"\n                },\n                \"smithy.test#smokeTests\": [\n                    {\n                        \"id\": \"ListUsersSuccess\",\n                        \"params\": {},\n                        \"vendorParams\": {\n                            \"region\": \"us-east-1\"\n                        },\n                        \"vendorParamsShape\": \"aws.test#AwsVendorParams\",\n                        \"expect\": {\n                            \"success\": {}\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.iam#ListUsersRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PathPrefix\": {\n                    \"target\": \"com.amazonaws.iam#pathPrefixType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The path prefix for filtering the results. For example:\\n                <code>/division_abc/subdivision_xyz/</code>, which would get all user names whose\\n            path starts with <code>/division_abc/subdivision_xyz/</code>.</p>\\n         <p>This parameter is optional. If it is not included, it defaults to a slash (/), listing\\n            all user names. This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting \\n    of either a forward slash (/) by itself or a string that must begin and end with forward slashes.\\n    In addition, it can contain any ASCII character from the ! (<code>\\\\u0021</code>) through the DEL character (<code>\\\\u007F</code>), including \\n    most punctuation characters, digits, and upper and lowercased letters.</p>\"\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.iam#markerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter only when paginating results and only after \\n    you receive a response indicating that the results are truncated. Set it to the value of the\\n    <code>Marker</code> element in the response that you received to indicate where the next call \\n    should start.</p>\"\n                    }\n                },\n                \"MaxItems\": {\n                    \"target\": \"com.amazonaws.iam#maxItemsType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this only when paginating results to indicate the \\n    maximum number of items you want in the response. If additional items exist beyond the maximum \\n    you specify, the <code>IsTruncated</code> response element is <code>true</code>.</p>\\n         <p>If you do not include this parameter, the number of items defaults to 100. Note that\\n    IAM might return fewer results, even when there are more results available. In that case, the\\n    <code>IsTruncated</code> response element returns <code>true</code>, and <code>Marker</code> \\n    contains a value to include in the subsequent call that tells the service where to continue \\n    from.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#ListUsersResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Users\": {\n                    \"target\": \"com.amazonaws.iam#userListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of users.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"IsTruncated\": {\n                    \"target\": \"com.amazonaws.iam#booleanType\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>A flag that indicates whether there are more items to return. If your \\n    results were truncated, you can make a subsequent pagination request using the <code>Marker</code>\\n    request parameter to retrieve more items. Note that IAM might return fewer than the \\n    <code>MaxItems</code> number of results even when there are more results available. We recommend \\n    that you check <code>IsTruncated</code> after every call to ensure that you receive all your \\n    results.</p>\"\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.iam#responseMarkerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>When <code>IsTruncated</code> is <code>true</code>, this element\\n    is present and contains the value to use for the <code>Marker</code> parameter in a subsequent \\n    pagination request.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the response to a successful <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListUsers.html\\\">ListUsers</a> request. </p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#ListVirtualMFADevices\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#ListVirtualMFADevicesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#ListVirtualMFADevicesResponse\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Lists the virtual MFA devices defined in the Amazon Web Services account by assignment status. If\\n            you do not specify an assignment status, the operation returns a list of all virtual MFA\\n            devices. Assignment status can be <code>Assigned</code>, <code>Unassigned</code>, or\\n                <code>Any</code>.</p>\\n         <note>\\n            <p>IAM resource-listing operations return a subset of the available \\n   attributes for the resource. For example, this operation does not return tags, even though they are an attribute of the returned object. To view tag information for a virtual MFA device, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListMFADeviceTags.html\\\">ListMFADeviceTags</a>.</p>\\n         </note>\\n         <p>You can paginate the results using the <code>MaxItems</code> and <code>Marker</code>\\n            parameters.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To list virtual MFA devices\",\n                        \"documentation\": \"The following command lists the virtual MFA devices that have been configured for the current account.\",\n                        \"output\": {\n                            \"VirtualMFADevices\": [\n                                {\n                                    \"SerialNumber\": \"arn:aws:iam::123456789012:mfa/ExampleMFADevice\"\n                                },\n                                {\n                                    \"SerialNumber\": \"arn:aws:iam::123456789012:mfa/Juan\"\n                                }\n                            ]\n                        }\n                    }\n                ],\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"Marker\",\n                    \"outputToken\": \"Marker\",\n                    \"items\": \"VirtualMFADevices\",\n                    \"pageSize\": \"MaxItems\"\n                }\n            }\n        },\n        \"com.amazonaws.iam#ListVirtualMFADevicesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AssignmentStatus\": {\n                    \"target\": \"com.amazonaws.iam#assignmentStatusType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The status (<code>Unassigned</code> or <code>Assigned</code>) of the devices to list.\\n            If you do not specify an <code>AssignmentStatus</code>, the operation defaults to\\n                <code>Any</code>, which lists both assigned and unassigned virtual MFA\\n            devices.,</p>\"\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.iam#markerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter only when paginating results and only after \\n    you receive a response indicating that the results are truncated. Set it to the value of the\\n    <code>Marker</code> element in the response that you received to indicate where the next call \\n    should start.</p>\"\n                    }\n                },\n                \"MaxItems\": {\n                    \"target\": \"com.amazonaws.iam#maxItemsType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this only when paginating results to indicate the \\n    maximum number of items you want in the response. If additional items exist beyond the maximum \\n    you specify, the <code>IsTruncated</code> response element is <code>true</code>.</p>\\n         <p>If you do not include this parameter, the number of items defaults to 100. Note that\\n    IAM might return fewer results, even when there are more results available. In that case, the\\n    <code>IsTruncated</code> response element returns <code>true</code>, and <code>Marker</code> \\n    contains a value to include in the subsequent call that tells the service where to continue \\n    from.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#ListVirtualMFADevicesResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VirtualMFADevices\": {\n                    \"target\": \"com.amazonaws.iam#virtualMFADeviceListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The list of virtual MFA devices in the current account that match the\\n                <code>AssignmentStatus</code> value that was passed in the request.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"IsTruncated\": {\n                    \"target\": \"com.amazonaws.iam#booleanType\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>A flag that indicates whether there are more items to return. If your \\n    results were truncated, you can make a subsequent pagination request using the <code>Marker</code>\\n    request parameter to retrieve more items. Note that IAM might return fewer than the \\n    <code>MaxItems</code> number of results even when there are more results available. We recommend \\n    that you check <code>IsTruncated</code> after every call to ensure that you receive all your \\n    results.</p>\"\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.iam#responseMarkerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>When <code>IsTruncated</code> is <code>true</code>, this element is present and\\n            contains the value to use for the <code>Marker</code> parameter in a subsequent\\n            pagination request.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the response to a successful <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListVirtualMFADevices.html\\\">ListVirtualMFADevices</a>\\n      request. </p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#LoginProfile\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"UserName\": {\n                    \"target\": \"com.amazonaws.iam#userNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the user, which can be used for signing in to the Amazon Web Services Management Console.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"CreateDate\": {\n                    \"target\": \"com.amazonaws.iam#dateType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date when the password for the user was created.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"PasswordResetRequired\": {\n                    \"target\": \"com.amazonaws.iam#booleanType\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Specifies whether the user is required to set a new password on next sign-in.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the user name and password create date for a user.</p>\\n         <p> This data type is used as a response element in the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateLoginProfile.html\\\">CreateLoginProfile</a> and\\n            <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetLoginProfile.html\\\">GetLoginProfile</a> operations. </p>\"\n            }\n        },\n        \"com.amazonaws.iam#MFADevice\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"UserName\": {\n                    \"target\": \"com.amazonaws.iam#userNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The user with whom the MFA device is associated.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"SerialNumber\": {\n                    \"target\": \"com.amazonaws.iam#serialNumberType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The serial number that uniquely identifies the MFA device. For virtual MFA devices, the\\n         serial number is the device ARN.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"EnableDate\": {\n                    \"target\": \"com.amazonaws.iam#dateType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date when the MFA device was enabled for the user.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains information about an MFA device.</p>\\n         <p>This data type is used as a response element in the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListMFADevices.html\\\">ListMFADevices</a>\\n         operation.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#MalformedCertificateException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.iam#malformedCertificateMessage\"\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"MalformedCertificate\",\n                    \"httpResponseCode\": 400\n                },\n                \"smithy.api#documentation\": \"<p>The request was rejected because the certificate was malformed or expired. The error\\n      message describes the specific error.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.iam#MalformedPolicyDocumentException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.iam#malformedPolicyDocumentMessage\"\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"MalformedPolicyDocument\",\n                    \"httpResponseCode\": 400\n                },\n                \"smithy.api#documentation\": \"<p>The request was rejected because the policy document was malformed. The error message\\n      describes the specific error.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.iam#ManagedPolicyDetail\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PolicyName\": {\n                    \"target\": \"com.amazonaws.iam#policyNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The friendly name (not ARN) identifying the policy.</p>\"\n                    }\n                },\n                \"PolicyId\": {\n                    \"target\": \"com.amazonaws.iam#idType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The stable and unique string identifying the policy.</p>\\n         <p>For more information about IDs, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/Using_Identifiers.html\\\">IAM identifiers</a> in the\\n            <i>IAM User Guide</i>.</p>\"\n                    }\n                },\n                \"Arn\": {\n                    \"target\": \"com.amazonaws.iam#arnType\"\n                },\n                \"Path\": {\n                    \"target\": \"com.amazonaws.iam#policyPathType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The path to the policy.</p>\\n         <p>For more information about paths, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/Using_Identifiers.html\\\">IAM identifiers</a> in the\\n            <i>IAM User Guide</i>.</p>\"\n                    }\n                },\n                \"DefaultVersionId\": {\n                    \"target\": \"com.amazonaws.iam#policyVersionIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The identifier for the version of the policy that is set as the default (operative)\\n         version.</p>\\n         <p>For more information about policy versions, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/policies-managed-versions.html\\\">Versioning for managed\\n            policies</a> in the <i>IAM User Guide</i>. </p>\"\n                    }\n                },\n                \"AttachmentCount\": {\n                    \"target\": \"com.amazonaws.iam#attachmentCountType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of principal entities (users, groups, and roles) that the policy is attached\\n         to.</p>\"\n                    }\n                },\n                \"PermissionsBoundaryUsageCount\": {\n                    \"target\": \"com.amazonaws.iam#attachmentCountType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of entities (users and roles) for which the policy is used as the permissions\\n         boundary. </p>\\n         <p>For more information about permissions boundaries, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_boundaries.html\\\">Permissions boundaries for IAM\\n            identities </a> in the <i>IAM User Guide</i>.</p>\"\n                    }\n                },\n                \"IsAttachable\": {\n                    \"target\": \"com.amazonaws.iam#booleanType\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Specifies whether the policy can be attached to an IAM user, group, or role.</p>\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.iam#policyDescriptionType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A friendly description of the policy.</p>\"\n                    }\n                },\n                \"CreateDate\": {\n                    \"target\": \"com.amazonaws.iam#dateType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time, in <a href=\\\"http://www.iso.org/iso/iso8601\\\">ISO 8601 date-time\\n            format</a>, when the policy was created.</p>\"\n                    }\n                },\n                \"UpdateDate\": {\n                    \"target\": \"com.amazonaws.iam#dateType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time, in <a href=\\\"http://www.iso.org/iso/iso8601\\\">ISO 8601 date-time\\n            format</a>, when the policy was last updated.</p>\\n         <p>When a policy has only one version, this field contains the date and time when the\\n         policy was created. When a policy has more than one version, this field contains the date\\n         and time when the most recent policy version was created.</p>\"\n                    }\n                },\n                \"PolicyVersionList\": {\n                    \"target\": \"com.amazonaws.iam#policyDocumentVersionListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list containing information about the versions of the policy.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains information about a managed policy, including the policy's ARN, versions, and\\n         the number of principal entities (users, groups, and roles) that the policy is attached\\n         to.</p>\\n         <p>This data type is used as a response element in the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetAccountAuthorizationDetails.html\\\">GetAccountAuthorizationDetails</a> operation.</p>\\n         <p>For more information about managed policies, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/policies-managed-vs-inline.html\\\">Managed policies and inline\\n            policies</a> in the <i>IAM User Guide</i>. </p>\"\n            }\n        },\n        \"com.amazonaws.iam#ManagedPolicyDetailListType\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.iam#ManagedPolicyDetail\"\n            }\n        },\n        \"com.amazonaws.iam#NoSuchEntityException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.iam#noSuchEntityMessage\"\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"NoSuchEntity\",\n                    \"httpResponseCode\": 404\n                },\n                \"smithy.api#documentation\": \"<p>The request was rejected because it referenced a resource entity that does not exist. The\\n      error message describes the resource.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 404\n            }\n        },\n        \"com.amazonaws.iam#OpenIDConnectProviderListEntry\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Arn\": {\n                    \"target\": \"com.amazonaws.iam#arnType\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the Amazon Resource Name (ARN) for an IAM OpenID Connect provider.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#OpenIDConnectProviderListType\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.iam#OpenIDConnectProviderListEntry\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains a list of IAM OpenID Connect providers.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#OpenIDConnectProviderUrlType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains a URL that specifies the endpoint for an OpenID Connect provider.</p>\",\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 255\n                }\n            }\n        },\n        \"com.amazonaws.iam#OpenIdIdpCommunicationErrorException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.iam#openIdIdpCommunicationErrorExceptionMessage\"\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"OpenIdIdpCommunicationError\",\n                    \"httpResponseCode\": 400\n                },\n                \"smithy.api#documentation\": \"<p>The request failed because IAM cannot connect to the OpenID Connect identity provider\\n      URL.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.iam#OrganizationIdType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 34\n                },\n                \"smithy.api#pattern\": \"^o-[a-z0-9]{10,32}$\"\n            }\n        },\n        \"com.amazonaws.iam#OrganizationNotFoundException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Message\": {\n                    \"target\": \"com.amazonaws.iam#ExceptionMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The request was rejected because no organization is associated with your account.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.iam#OrganizationNotInAllFeaturesModeException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Message\": {\n                    \"target\": \"com.amazonaws.iam#ExceptionMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The request was rejected because your organization does not have All features enabled. For\\n      more information, see <a href=\\\"https://docs.aws.amazon.com/organizations/latest/userguide/orgs_getting-started_concepts.html#feature-set\\\">Available feature sets</a> in the <i>Organizations User\\n      Guide</i>.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.iam#OrganizationsDecisionDetail\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AllowedByOrganizations\": {\n                    \"target\": \"com.amazonaws.iam#booleanType\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Specifies whether the simulated operation is allowed by the Organizations service control\\n         policies that impact the simulated user's account.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains information about the effect that Organizations has on a policy simulation.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#PasswordPolicy\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"MinimumPasswordLength\": {\n                    \"target\": \"com.amazonaws.iam#minimumPasswordLengthType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Minimum length to require for IAM user passwords.</p>\"\n                    }\n                },\n                \"RequireSymbols\": {\n                    \"target\": \"com.amazonaws.iam#booleanType\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Specifies whether IAM user passwords must contain at least one of the following\\n         symbols:</p>\\n         <p>! @ # $ % ^ & * ( ) _ + - = [ ] { } | '</p>\"\n                    }\n                },\n                \"RequireNumbers\": {\n                    \"target\": \"com.amazonaws.iam#booleanType\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Specifies whether IAM user passwords must contain at least one numeric character (0 to\\n         9).</p>\"\n                    }\n                },\n                \"RequireUppercaseCharacters\": {\n                    \"target\": \"com.amazonaws.iam#booleanType\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Specifies whether IAM user passwords must contain at least one uppercase character (A\\n         to Z).</p>\"\n                    }\n                },\n                \"RequireLowercaseCharacters\": {\n                    \"target\": \"com.amazonaws.iam#booleanType\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Specifies whether IAM user passwords must contain at least one lowercase character (a\\n         to z).</p>\"\n                    }\n                },\n                \"AllowUsersToChangePassword\": {\n                    \"target\": \"com.amazonaws.iam#booleanType\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Specifies whether IAM users are allowed to change their own password. Gives IAM\\n         users permissions to <code>iam:ChangePassword</code> for only their user and to the\\n            <code>iam:GetAccountPasswordPolicy</code> action. This option does not attach a\\n         permissions policy to each user, rather the permissions are applied at the account-level\\n         for all users by IAM.</p>\"\n                    }\n                },\n                \"ExpirePasswords\": {\n                    \"target\": \"com.amazonaws.iam#booleanType\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Indicates whether passwords in the account expire. Returns true if\\n            <code>MaxPasswordAge</code> contains a value greater than 0. Returns false if\\n         MaxPasswordAge is 0 or not present.</p>\"\n                    }\n                },\n                \"MaxPasswordAge\": {\n                    \"target\": \"com.amazonaws.iam#maxPasswordAgeType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of days that an IAM user password is valid.</p>\"\n                    }\n                },\n                \"PasswordReusePrevention\": {\n                    \"target\": \"com.amazonaws.iam#passwordReusePreventionType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the number of previous passwords that IAM users are prevented from\\n         reusing.</p>\"\n                    }\n                },\n                \"HardExpiry\": {\n                    \"target\": \"com.amazonaws.iam#booleanObjectType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies whether IAM users are prevented from setting a new password via the\\n         Amazon Web Services Management Console after their password has expired. The IAM user cannot access the console until\\n         an administrator resets the password. IAM users with <code>iam:ChangePassword</code>\\n         permission and active access keys can reset their own expired console password using the\\n         CLI or API.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains information about the account password policy.</p>\\n         <p> This data type is used as a response element in the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetAccountPasswordPolicy.html\\\">GetAccountPasswordPolicy</a> operation. </p>\"\n            }\n        },\n        \"com.amazonaws.iam#PasswordPolicyViolationException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.iam#passwordPolicyViolationMessage\"\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"PasswordPolicyViolation\",\n                    \"httpResponseCode\": 400\n                },\n                \"smithy.api#documentation\": \"<p>The request was rejected because the provided password did not meet the requirements\\n      imposed by the account password policy.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.iam#PermissionsBoundaryAttachmentType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"Policy\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"PermissionsBoundaryPolicy\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.iam#PermissionsBoundaryDecisionDetail\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AllowedByPermissionsBoundary\": {\n                    \"target\": \"com.amazonaws.iam#booleanType\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Specifies whether an action is allowed by a permissions boundary that is applied to an\\n         IAM entity (user or role). A value of <code>true</code> means that the permissions\\n         boundary does not deny the action. This means that the policy includes an\\n            <code>Allow</code> statement that matches the request. In this case, if an\\n         identity-based policy also allows the action, the request is allowed. A value of\\n            <code>false</code> means that either the requested action is not allowed (implicitly\\n         denied) or that the action is explicitly denied by the permissions boundary. In both of\\n         these cases, the action is not allowed, regardless of the identity-based policy.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains information about the effect that a permissions boundary has on a policy\\n         simulation when the boundary is applied to an IAM entity.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#Policy\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PolicyName\": {\n                    \"target\": \"com.amazonaws.iam#policyNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The friendly name (not ARN) identifying the policy.</p>\"\n                    }\n                },\n                \"PolicyId\": {\n                    \"target\": \"com.amazonaws.iam#idType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The stable and unique string identifying the policy.</p>\\n         <p>For more information about IDs, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/Using_Identifiers.html\\\">IAM identifiers</a> in the\\n            <i>IAM User Guide</i>.</p>\"\n                    }\n                },\n                \"Arn\": {\n                    \"target\": \"com.amazonaws.iam#arnType\"\n                },\n                \"Path\": {\n                    \"target\": \"com.amazonaws.iam#policyPathType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The path to the policy.</p>\\n         <p>For more information about paths, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/Using_Identifiers.html\\\">IAM identifiers</a> in the\\n            <i>IAM User Guide</i>.</p>\"\n                    }\n                },\n                \"DefaultVersionId\": {\n                    \"target\": \"com.amazonaws.iam#policyVersionIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The identifier for the version of the policy that is set as the default version.</p>\"\n                    }\n                },\n                \"AttachmentCount\": {\n                    \"target\": \"com.amazonaws.iam#attachmentCountType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of entities (users, groups, and roles) that the policy is attached to.</p>\"\n                    }\n                },\n                \"PermissionsBoundaryUsageCount\": {\n                    \"target\": \"com.amazonaws.iam#attachmentCountType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of entities (users and roles) for which the policy is used to set the\\n         permissions boundary. </p>\\n         <p>For more information about permissions boundaries, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_boundaries.html\\\">Permissions boundaries for IAM\\n            identities </a> in the <i>IAM User Guide</i>.</p>\"\n                    }\n                },\n                \"IsAttachable\": {\n                    \"target\": \"com.amazonaws.iam#booleanType\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Specifies whether the policy can be attached to an IAM user, group, or role.</p>\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.iam#policyDescriptionType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A friendly description of the policy.</p>\\n         <p>This element is included in the response to the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetPolicy.html\\\">GetPolicy</a> operation. It is not\\n         included in the response to the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListPolicies.html\\\">ListPolicies</a> operation.\\n      </p>\"\n                    }\n                },\n                \"CreateDate\": {\n                    \"target\": \"com.amazonaws.iam#dateType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time, in <a href=\\\"http://www.iso.org/iso/iso8601\\\">ISO 8601 date-time\\n            format</a>, when the policy was created.</p>\"\n                    }\n                },\n                \"UpdateDate\": {\n                    \"target\": \"com.amazonaws.iam#dateType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time, in <a href=\\\"http://www.iso.org/iso/iso8601\\\">ISO 8601 date-time\\n            format</a>, when the policy was last updated.</p>\\n         <p>When a policy has only one version, this field contains the date and time when the\\n         policy was created. When a policy has more than one version, this field contains the date\\n         and time when the most recent policy version was created.</p>\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.iam#tagListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of tags that are attached to the instance profile. For more information about tagging, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_tags.html\\\">Tagging IAM resources</a> in the\\n      <i>IAM User Guide</i>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains information about a managed policy.</p>\\n         <p>This data type is used as a response element in the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreatePolicy.html\\\">CreatePolicy</a>, <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetPolicy.html\\\">GetPolicy</a>,\\n         and <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListPolicies.html\\\">ListPolicies</a> operations. </p>\\n         <p>For more information about managed policies, refer to <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/policies-managed-vs-inline.html\\\">Managed policies and inline\\n            policies</a> in the <i>IAM User Guide</i>. </p>\"\n            }\n        },\n        \"com.amazonaws.iam#PolicyDetail\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PolicyName\": {\n                    \"target\": \"com.amazonaws.iam#policyNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the policy.</p>\"\n                    }\n                },\n                \"PolicyDocument\": {\n                    \"target\": \"com.amazonaws.iam#policyDocumentType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The policy document.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains information about an IAM policy, including the policy document.</p>\\n         <p>This data type is used as a response element in the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetAccountAuthorizationDetails.html\\\">GetAccountAuthorizationDetails</a> operation.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#PolicyEvaluationDecisionType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ALLOWED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"allowed\"\n                    }\n                },\n                \"EXPLICIT_DENY\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"explicitDeny\"\n                    }\n                },\n                \"IMPLICIT_DENY\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"implicitDeny\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.iam#PolicyEvaluationException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.iam#policyEvaluationErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"PolicyEvaluation\",\n                    \"httpResponseCode\": 500\n                },\n                \"smithy.api#documentation\": \"<p>The request failed because a provided policy could not be successfully evaluated. An\\n      additional detailed message indicates the source of the failure.</p>\",\n                \"smithy.api#error\": \"server\",\n                \"smithy.api#httpError\": 500\n            }\n        },\n        \"com.amazonaws.iam#PolicyGrantingServiceAccess\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PolicyName\": {\n                    \"target\": \"com.amazonaws.iam#policyNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The policy name.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"PolicyType\": {\n                    \"target\": \"com.amazonaws.iam#policyType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The policy type. For more information about these policy types, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html\\\">Managed\\n            policies and inline policies</a> in the\\n         <i>IAM User Guide</i>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"PolicyArn\": {\n                    \"target\": \"com.amazonaws.iam#arnType\"\n                },\n                \"EntityType\": {\n                    \"target\": \"com.amazonaws.iam#policyOwnerEntityType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of entity (user or role) that used the policy to access the service to which\\n         the inline policy is attached.</p>\\n         <p>This field is null for managed policies. For more information about these policy types,\\n         see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html\\\">Managed policies and inline policies</a> in the\\n            <i>IAM User Guide</i>.</p>\"\n                    }\n                },\n                \"EntityName\": {\n                    \"target\": \"com.amazonaws.iam#entityNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the entity (user or role) to which the inline policy is attached.</p>\\n         <p>This field is null for managed policies. For more information about these policy types,\\n         see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-vs-inline.html\\\">Managed policies and inline policies</a> in the\\n            <i>IAM User Guide</i>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains details about the permissions policies that are attached to the specified\\n         identity (user, group, or role).</p>\\n         <p>This data type is an element of the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListPoliciesGrantingServiceAccessEntry.html\\\">ListPoliciesGrantingServiceAccessEntry</a> object.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#PolicyGroup\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"GroupName\": {\n                    \"target\": \"com.amazonaws.iam#groupNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name (friendly name, not ARN) identifying the group.</p>\"\n                    }\n                },\n                \"GroupId\": {\n                    \"target\": \"com.amazonaws.iam#idType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The stable and unique string identifying the group. For more information about IDs, see\\n            <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html\\\">IAM\\n            identifiers</a> in the <i>IAM User Guide</i>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains information about a group that a managed policy is attached to.</p>\\n         <p>This data type is used as a response element in the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListEntitiesForPolicy.html\\\">ListEntitiesForPolicy</a> operation. </p>\\n         <p>For more information about managed policies, refer to <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/policies-managed-vs-inline.html\\\">Managed policies and inline\\n            policies</a> in the <i>IAM User Guide</i>. </p>\"\n            }\n        },\n        \"com.amazonaws.iam#PolicyGroupListType\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.iam#PolicyGroup\"\n            }\n        },\n        \"com.amazonaws.iam#PolicyIdentifierType\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.iam#PolicyNotAttachableException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.iam#policyNotAttachableMessage\"\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"PolicyNotAttachable\",\n                    \"httpResponseCode\": 400\n                },\n                \"smithy.api#documentation\": \"<p>The request failed because Amazon Web Services service role policies can only be attached to the\\n      service-linked role for that service.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.iam#PolicyRole\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RoleName\": {\n                    \"target\": \"com.amazonaws.iam#roleNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name (friendly name, not ARN) identifying the role.</p>\"\n                    }\n                },\n                \"RoleId\": {\n                    \"target\": \"com.amazonaws.iam#idType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The stable and unique string identifying the role. For more information about IDs, see\\n            <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html\\\">IAM\\n            identifiers</a> in the <i>IAM User Guide</i>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains information about a role that a managed policy is attached to.</p>\\n         <p>This data type is used as a response element in the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListEntitiesForPolicy.html\\\">ListEntitiesForPolicy</a> operation. </p>\\n         <p>For more information about managed policies, refer to <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/policies-managed-vs-inline.html\\\">Managed policies and inline\\n            policies</a> in the <i>IAM User Guide</i>. </p>\"\n            }\n        },\n        \"com.amazonaws.iam#PolicyRoleListType\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.iam#PolicyRole\"\n            }\n        },\n        \"com.amazonaws.iam#PolicySourceType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"USER\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"user\"\n                    }\n                },\n                \"GROUP\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"group\"\n                    }\n                },\n                \"ROLE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"role\"\n                    }\n                },\n                \"AWS_MANAGED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"aws-managed\"\n                    }\n                },\n                \"USER_MANAGED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"user-managed\"\n                    }\n                },\n                \"RESOURCE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"resource\"\n                    }\n                },\n                \"NONE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"none\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.iam#PolicyUsageType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"PermissionsPolicy\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"PermissionsPolicy\"\n                    }\n                },\n                \"PermissionsBoundary\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"PermissionsBoundary\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The policy usage type that indicates whether the policy is used as a permissions policy\\n         or as the permissions boundary for an entity.</p>\\n         <p>For more information about permissions boundaries, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_boundaries.html\\\">Permissions boundaries for IAM\\n            identities </a> in the <i>IAM User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#PolicyUser\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"UserName\": {\n                    \"target\": \"com.amazonaws.iam#userNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name (friendly name, not ARN) identifying the user.</p>\"\n                    }\n                },\n                \"UserId\": {\n                    \"target\": \"com.amazonaws.iam#idType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The stable and unique string identifying the user. For more information about IDs, see\\n            <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html\\\">IAM\\n            identifiers</a> in the <i>IAM User Guide</i>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains information about a user that a managed policy is attached to.</p>\\n         <p>This data type is used as a response element in the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListEntitiesForPolicy.html\\\">ListEntitiesForPolicy</a> operation. </p>\\n         <p>For more information about managed policies, refer to <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/policies-managed-vs-inline.html\\\">Managed policies and inline\\n            policies</a> in the <i>IAM User Guide</i>. </p>\"\n            }\n        },\n        \"com.amazonaws.iam#PolicyUserListType\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.iam#PolicyUser\"\n            }\n        },\n        \"com.amazonaws.iam#PolicyVersion\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Document\": {\n                    \"target\": \"com.amazonaws.iam#policyDocumentType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The policy document.</p>\\n         <p>The policy document is returned in the response to the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetPolicyVersion.html\\\">GetPolicyVersion</a> and\\n            <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetAccountAuthorizationDetails.html\\\">GetAccountAuthorizationDetails</a> operations. It is not returned in the response\\n         to the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreatePolicyVersion.html\\\">CreatePolicyVersion</a>\\n         or <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListPolicyVersions.html\\\">ListPolicyVersions</a> operations. </p>\\n         <p>The policy document returned in this structure is URL-encoded compliant with <a href=\\\"https://tools.ietf.org/html/rfc3986\\\">RFC 3986</a>. You can use a URL decoding\\n         method to convert the policy back to plain JSON text. For example, if you use Java, you can\\n         use the <code>decode</code> method of the <code>java.net.URLDecoder</code> utility class in\\n         the Java SDK. Other languages and SDKs provide similar functionality.</p>\"\n                    }\n                },\n                \"VersionId\": {\n                    \"target\": \"com.amazonaws.iam#policyVersionIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The identifier for the policy version.</p>\\n         <p>Policy version identifiers always begin with <code>v</code> (always lowercase). When a\\n         policy is created, the first policy version is <code>v1</code>. </p>\"\n                    }\n                },\n                \"IsDefaultVersion\": {\n                    \"target\": \"com.amazonaws.iam#booleanType\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Specifies whether the policy version is set as the policy's default version.</p>\"\n                    }\n                },\n                \"CreateDate\": {\n                    \"target\": \"com.amazonaws.iam#dateType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time, in <a href=\\\"http://www.iso.org/iso/iso8601\\\">ISO 8601 date-time\\n            format</a>, when the policy version was created.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains information about a version of a managed policy.</p>\\n         <p>This data type is used as a response element in the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreatePolicyVersion.html\\\">CreatePolicyVersion</a>,\\n            <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetPolicyVersion.html\\\">GetPolicyVersion</a>, <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListPolicyVersions.html\\\">ListPolicyVersions</a>,\\n         and <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetAccountAuthorizationDetails.html\\\">GetAccountAuthorizationDetails</a> operations. </p>\\n         <p>For more information about managed policies, refer to <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/policies-managed-vs-inline.html\\\">Managed policies and inline\\n            policies</a> in the <i>IAM User Guide</i>. </p>\"\n            }\n        },\n        \"com.amazonaws.iam#Position\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Line\": {\n                    \"target\": \"com.amazonaws.iam#LineNumber\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The line containing the specified position in the document.</p>\"\n                    }\n                },\n                \"Column\": {\n                    \"target\": \"com.amazonaws.iam#ColumnNumber\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The column in the line containing the specified position in the document.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the row and column of a location of a <code>Statement</code> element in a\\n         policy document.</p>\\n         <p>This data type is used as a member of the <code>\\n               <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_Statement.html\\\">Statement</a>\\n            </code> type.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#PutGroupPolicy\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#PutGroupPolicyRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#MalformedPolicyDocumentException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Adds or updates an inline policy document that is embedded in the specified IAM\\n            group.</p>\\n         <p>A user can also have managed policies attached to it. To attach a managed policy to a\\n            group, use <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_AttachGroupPolicy.html\\\">\\n               <code>AttachGroupPolicy</code>\\n            </a>. To create a new managed policy, use\\n                <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreatePolicy.html\\\">\\n               <code>CreatePolicy</code>\\n            </a>. For information about policies, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/policies-managed-vs-inline.html\\\">Managed\\n                policies and inline policies</a> in the\\n            <i>IAM User Guide</i>.</p>\\n         <p>For information about the maximum number of inline policies that you can embed in a\\n            group, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_iam-quotas.html\\\">IAM and STS quotas</a> in the <i>IAM User Guide</i>.</p>\\n         <note>\\n            <p>Because policy documents can be large, you should use POST rather than GET when\\n                calling <code>PutGroupPolicy</code>. For general information about using the Query\\n                API with IAM, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/IAM_UsingQueryAPI.html\\\">Making query requests</a> in the\\n                    <i>IAM User Guide</i>.</p>\\n         </note>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To add a policy to a group\",\n                        \"documentation\": \"The following command adds a policy named IAMReadAccess to the IAM group named PowerUsers.\",\n                        \"input\": {\n                            \"GroupName\": \"PowerUsers\",\n                            \"PolicyName\": \"IAMReadAccess\",\n                            \"PolicyDocument\": \"{\\\"Version\\\":\\\"2012-10-17\\\",\\\"Statement\\\":{\\\"Effect\\\":\\\"Allow\\\",\\\"Action\\\":[\\\"iam:Get*\\\",\\\"iam:List*\\\",\\\"iam:Generate*\\\"],\\\"Resource\\\":\\\"*\\\"}}\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.iam#PutGroupPolicyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"GroupName\": {\n                    \"target\": \"com.amazonaws.iam#groupNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the group to associate the policy with.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"PolicyName\": {\n                    \"target\": \"com.amazonaws.iam#policyNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the policy document.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"PolicyDocument\": {\n                    \"target\": \"com.amazonaws.iam#policyDocumentType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The policy document.</p>\\n         <p>You must provide policies in JSON format in IAM. However, for CloudFormation templates\\n            formatted in YAML, you can provide the policy in JSON or YAML format. CloudFormation always\\n            converts a YAML policy to JSON format before submitting it to IAM.</p>\\n         <p>The <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a> \\n    used to validate this parameter is a string of characters consisting of the following:</p>\\n         <ul>\\n            <li>\\n               <p>Any printable ASCII \\n    character ranging from the space character (<code>\\\\u0020</code>) through the end of the ASCII character range</p>\\n            </li>\\n            <li>\\n               <p>The printable characters in the Basic Latin and  Latin-1 Supplement character set \\n    (through <code>\\\\u00FF</code>)</p>\\n            </li>\\n            <li>\\n               <p>The special characters tab (<code>\\\\u0009</code>), line feed (<code>\\\\u000A</code>), and \\n    carriage return (<code>\\\\u000D</code>)</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#PutRolePermissionsBoundary\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#PutRolePermissionsBoundaryRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#InvalidInputException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#PolicyNotAttachableException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#UnmodifiableEntityException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Adds or updates the policy that is specified as the IAM role's permissions boundary.\\n            You can use an Amazon Web Services managed policy or a customer managed policy to set the boundary for\\n            a role. Use the boundary to control the maximum permissions that the role can have.\\n            Setting a permissions boundary is an advanced feature that can affect the permissions\\n            for the role.</p>\\n         <p>You cannot set the boundary for a service-linked role.</p>\\n         <important>\\n            <p>Policies used as permissions boundaries do not provide permissions. You must also\\n                attach a permissions policy to the role. To learn how the effective permissions for\\n                a role are evaluated, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_evaluation-logic.html\\\">IAM JSON policy\\n                    evaluation logic</a> in the IAM User Guide. </p>\\n         </important>\"\n            }\n        },\n        \"com.amazonaws.iam#PutRolePermissionsBoundaryRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RoleName\": {\n                    \"target\": \"com.amazonaws.iam#roleNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name (friendly name, not ARN) of the IAM role for which you want to set the\\n            permissions boundary.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"PermissionsBoundary\": {\n                    \"target\": \"com.amazonaws.iam#arnType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the managed policy that is used to set the permissions boundary for the\\n            role.</p>\\n         <p>A permissions boundary policy defines the maximum permissions that identity-based\\n            policies can grant to an entity, but does not grant permissions. Permissions boundaries\\n            do not define the maximum permissions that a resource-based policy can grant to an\\n            entity. To learn more, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_boundaries.html\\\">Permissions boundaries\\n                for IAM entities</a> in the <i>IAM User Guide</i>.</p>\\n         <p>For more information about policy types, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#access_policy-types\\\">Policy types\\n            </a> in the <i>IAM User Guide</i>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#PutRolePolicy\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#PutRolePolicyRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#MalformedPolicyDocumentException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#UnmodifiableEntityException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Adds or updates an inline policy document that is embedded in the specified IAM\\n            role.</p>\\n         <p>When you embed an inline policy in a role, the inline policy is used as part of the\\n            role's access (permissions) policy. The role's trust policy is created at the same time\\n            as the role, using <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateRole.html\\\">\\n               <code>CreateRole</code>\\n            </a>.\\n            You can update a role's trust policy using <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_UpdateAssumeRolePolicy.html\\\">\\n               <code>UpdateAssumeRolePolicy</code>\\n            </a>. For more information about roles,\\n            see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/roles-toplevel.html\\\">IAM\\n                roles</a> in the <i>IAM User Guide</i>.</p>\\n         <p>A role can also have a managed policy attached to it. To attach a managed policy to a\\n            role, use <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_AttachRolePolicy.html\\\">\\n               <code>AttachRolePolicy</code>\\n            </a>. To create a new managed policy, use\\n                <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreatePolicy.html\\\">\\n               <code>CreatePolicy</code>\\n            </a>. For information about policies, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/policies-managed-vs-inline.html\\\">Managed\\n                policies and inline policies</a> in the\\n            <i>IAM User Guide</i>.</p>\\n         <p>For information about the maximum number of inline policies that you can embed with a\\n            role, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_iam-quotas.html\\\">IAM and STS quotas</a> in the <i>IAM User Guide</i>.</p>\\n         <note>\\n            <p>Because policy documents can be large, you should use POST rather than GET when\\n                calling <code>PutRolePolicy</code>. For general information about using the Query\\n                API with IAM, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/IAM_UsingQueryAPI.html\\\">Making query requests</a> in the\\n                    <i>IAM User Guide</i>.</p>\\n         </note>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To attach a permissions policy to an IAM role\",\n                        \"documentation\": \"The following command adds a permissions policy to the role named Test-Role.\",\n                        \"input\": {\n                            \"RoleName\": \"S3Access\",\n                            \"PolicyName\": \"S3AccessPolicy\",\n                            \"PolicyDocument\": \"{\\\"Version\\\":\\\"2012-10-17\\\",\\\"Statement\\\":{\\\"Effect\\\":\\\"Allow\\\",\\\"Action\\\":\\\"s3:*\\\",\\\"Resource\\\":\\\"*\\\"}}\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.iam#PutRolePolicyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RoleName\": {\n                    \"target\": \"com.amazonaws.iam#roleNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the role to associate the policy with.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"PolicyName\": {\n                    \"target\": \"com.amazonaws.iam#policyNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the policy document.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"PolicyDocument\": {\n                    \"target\": \"com.amazonaws.iam#policyDocumentType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The policy document.</p>\\n         <p>You must provide policies in JSON format in IAM. However, for CloudFormation\\n            templates formatted in YAML, you can provide the policy in JSON or YAML format. CloudFormation always converts a YAML policy to JSON format before submitting it to\\n            IAM.</p>\\n         <p>The <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a> \\n    used to validate this parameter is a string of characters consisting of the following:</p>\\n         <ul>\\n            <li>\\n               <p>Any printable ASCII \\n    character ranging from the space character (<code>\\\\u0020</code>) through the end of the ASCII character range</p>\\n            </li>\\n            <li>\\n               <p>The printable characters in the Basic Latin and  Latin-1 Supplement character set \\n    (through <code>\\\\u00FF</code>)</p>\\n            </li>\\n            <li>\\n               <p>The special characters tab (<code>\\\\u0009</code>), line feed (<code>\\\\u000A</code>), and \\n    carriage return (<code>\\\\u000D</code>)</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#PutUserPermissionsBoundary\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#PutUserPermissionsBoundaryRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#InvalidInputException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#PolicyNotAttachableException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Adds or updates the policy that is specified as the IAM user's permissions\\n            boundary. You can use an Amazon Web Services managed policy or a customer managed policy to set the\\n            boundary for a user. Use the boundary to control the maximum permissions that the user\\n            can have. Setting a permissions boundary is an advanced feature that can affect the\\n            permissions for the user.</p>\\n         <important>\\n            <p>Policies that are used as permissions boundaries do not provide permissions. You\\n                must also attach a permissions policy to the user. To learn how the effective\\n                permissions for a user are evaluated, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_evaluation-logic.html\\\">IAM JSON policy\\n                    evaluation logic</a> in the IAM User Guide. </p>\\n         </important>\"\n            }\n        },\n        \"com.amazonaws.iam#PutUserPermissionsBoundaryRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"UserName\": {\n                    \"target\": \"com.amazonaws.iam#userNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name (friendly name, not ARN) of the IAM user for which you want to set the\\n            permissions boundary.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"PermissionsBoundary\": {\n                    \"target\": \"com.amazonaws.iam#arnType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the managed policy that is used to set the permissions boundary for the\\n            user.</p>\\n         <p>A permissions boundary policy defines the maximum permissions that identity-based\\n            policies can grant to an entity, but does not grant permissions. Permissions boundaries\\n            do not define the maximum permissions that a resource-based policy can grant to an\\n            entity. To learn more, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_boundaries.html\\\">Permissions boundaries\\n                for IAM entities</a> in the <i>IAM User Guide</i>.</p>\\n         <p>For more information about policy types, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#access_policy-types\\\">Policy types\\n            </a> in the <i>IAM User Guide</i>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#PutUserPolicy\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#PutUserPolicyRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#MalformedPolicyDocumentException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Adds or updates an inline policy document that is embedded in the specified IAM\\n            user.</p>\\n         <p>An IAM user can also have a managed policy attached to it. To attach a managed\\n            policy to a user, use <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_AttachUserPolicy.html\\\">\\n               <code>AttachUserPolicy</code>\\n            </a>. To create a new managed policy, use\\n                <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreatePolicy.html\\\">\\n               <code>CreatePolicy</code>\\n            </a>. For information about policies, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/policies-managed-vs-inline.html\\\">Managed\\n                policies and inline policies</a> in the\\n            <i>IAM User Guide</i>.</p>\\n         <p>For information about the maximum number of inline policies that you can embed in a\\n            user, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_iam-quotas.html\\\">IAM and STS quotas</a> in the <i>IAM User Guide</i>.</p>\\n         <note>\\n            <p>Because policy documents can be large, you should use POST rather than GET when\\n                calling <code>PutUserPolicy</code>. For general information about using the Query\\n                API with IAM, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/IAM_UsingQueryAPI.html\\\">Making query requests</a> in the\\n                    <i>IAM User Guide</i>.</p>\\n         </note>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To attach a policy to an IAM user\",\n                        \"documentation\": \"The following command attaches a policy to the IAM user named Bob.\",\n                        \"input\": {\n                            \"UserName\": \"Bob\",\n                            \"PolicyName\": \"AllAccessPolicy\",\n                            \"PolicyDocument\": \"{\\\"Version\\\":\\\"2012-10-17\\\",\\\"Statement\\\":{\\\"Effect\\\":\\\"Allow\\\",\\\"Action\\\":\\\"*\\\",\\\"Resource\\\":\\\"*\\\"}}\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.iam#PutUserPolicyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"UserName\": {\n                    \"target\": \"com.amazonaws.iam#existingUserNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the user to associate the policy with.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"PolicyName\": {\n                    \"target\": \"com.amazonaws.iam#policyNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the policy document.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"PolicyDocument\": {\n                    \"target\": \"com.amazonaws.iam#policyDocumentType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The policy document.</p>\\n         <p>You must provide policies in JSON format in IAM. However, for CloudFormation\\n            templates formatted in YAML, you can provide the policy in JSON or YAML format. CloudFormation always converts a YAML policy to JSON format before submitting it to\\n            IAM.</p>\\n         <p>The <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a> \\n    used to validate this parameter is a string of characters consisting of the following:</p>\\n         <ul>\\n            <li>\\n               <p>Any printable ASCII \\n    character ranging from the space character (<code>\\\\u0020</code>) through the end of the ASCII character range</p>\\n            </li>\\n            <li>\\n               <p>The printable characters in the Basic Latin and  Latin-1 Supplement character set \\n    (through <code>\\\\u00FF</code>)</p>\\n            </li>\\n            <li>\\n               <p>The special characters tab (<code>\\\\u0009</code>), line feed (<code>\\\\u000A</code>), and \\n    carriage return (<code>\\\\u000D</code>)</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#ReasonType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.iam#RegionNameType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 100\n                }\n            }\n        },\n        \"com.amazonaws.iam#RemoveClientIDFromOpenIDConnectProvider\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#RemoveClientIDFromOpenIDConnectProviderRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#InvalidInputException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Removes the specified client ID (also known as audience) from the list of client IDs\\n            registered for the specified IAM OpenID Connect (OIDC) provider resource\\n            object.</p>\\n         <p>This operation is idempotent; it does not fail or return an error if you try to remove\\n            a client ID that does not exist.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#RemoveClientIDFromOpenIDConnectProviderRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"OpenIDConnectProviderArn\": {\n                    \"target\": \"com.amazonaws.iam#arnType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the IAM OIDC provider resource to remove the\\n            client ID from. You can get a list of OIDC provider ARNs by using the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListOpenIDConnectProviders.html\\\">ListOpenIDConnectProviders</a> operation.</p>\\n         <p>For more information about ARNs, see <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html\\\">Amazon Resource Names (ARNs)</a> in the <i>Amazon Web Services General Reference</i>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ClientID\": {\n                    \"target\": \"com.amazonaws.iam#clientIDType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The client ID (also known as audience) to remove from the IAM OIDC provider\\n            resource. For more information about client IDs, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateOpenIDConnectProvider.html\\\">CreateOpenIDConnectProvider</a>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#RemoveRoleFromInstanceProfile\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#RemoveRoleFromInstanceProfileRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#UnmodifiableEntityException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Removes the specified IAM role from the specified Amazon EC2 instance profile.</p>\\n         <important>\\n            <p>Make sure that you do not have any Amazon EC2 instances running with the role you are\\n                about to remove from the instance profile. Removing a role from an instance profile\\n                that is associated with a running instance might break any applications running on\\n                the instance.</p>\\n         </important>\\n         <p> For more information about roles, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html\\\">IAM roles</a> in the\\n                <i>IAM User Guide</i>. For more information about instance profiles,\\n            see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_switch-role-ec2_instance-profiles.html\\\">Using\\n                instance profiles</a> in the <i>IAM User Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To remove a role from an instance profile\",\n                        \"documentation\": \"The following command removes the role named Test-Role from the instance profile named ExampleInstanceProfile.\",\n                        \"input\": {\n                            \"RoleName\": \"Test-Role\",\n                            \"InstanceProfileName\": \"ExampleInstanceProfile\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.iam#RemoveRoleFromInstanceProfileRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceProfileName\": {\n                    \"target\": \"com.amazonaws.iam#instanceProfileNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the instance profile to update.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"RoleName\": {\n                    \"target\": \"com.amazonaws.iam#roleNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the role to remove.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#RemoveUserFromGroup\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#RemoveUserFromGroupRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Removes the specified user from the specified group.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To remove a user from an IAM group\",\n                        \"documentation\": \"The following command removes the user named Bob from the IAM group named Admins.\",\n                        \"input\": {\n                            \"UserName\": \"Bob\",\n                            \"GroupName\": \"Admins\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.iam#RemoveUserFromGroupRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"GroupName\": {\n                    \"target\": \"com.amazonaws.iam#groupNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the group to update.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"UserName\": {\n                    \"target\": \"com.amazonaws.iam#existingUserNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the user to remove.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#ReportContentType\": {\n            \"type\": \"blob\"\n        },\n        \"com.amazonaws.iam#ReportFormatType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"text_csv\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"text/csv\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.iam#ReportGenerationLimitExceededException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.iam#reportGenerationLimitExceededMessage\"\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"ReportGenerationLimitExceeded\",\n                    \"httpResponseCode\": 409\n                },\n                \"smithy.api#documentation\": \"<p>The request failed because the maximum number of concurrent requests for this account are\\n      already running.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 409\n            }\n        },\n        \"com.amazonaws.iam#ReportStateDescriptionType\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.iam#ReportStateType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"STARTED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"STARTED\"\n                    }\n                },\n                \"INPROGRESS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"INPROGRESS\"\n                    }\n                },\n                \"COMPLETE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"COMPLETE\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.iam#ResetServiceSpecificCredential\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#ResetServiceSpecificCredentialRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#ResetServiceSpecificCredentialResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Resets the password for a service-specific credential. The new password is Amazon Web Services\\n            generated and cryptographically strong. It cannot be configured by the user. Resetting\\n            the password immediately invalidates the previous password associated with this\\n            user.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#ResetServiceSpecificCredentialRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"UserName\": {\n                    \"target\": \"com.amazonaws.iam#userNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the IAM user associated with the service-specific credential. If this\\n            value is not specified, then the operation assumes the user whose credentials are used\\n            to call the operation.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\"\n                    }\n                },\n                \"ServiceSpecificCredentialId\": {\n                    \"target\": \"com.amazonaws.iam#serviceSpecificCredentialId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The unique identifier of the service-specific credential.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters that can \\n    consist of any upper or lowercased letter or digit.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#ResetServiceSpecificCredentialResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ServiceSpecificCredential\": {\n                    \"target\": \"com.amazonaws.iam#ServiceSpecificCredential\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A structure with details about the updated service-specific credential, including the\\n            new password.</p>\\n         <important>\\n            <p>This is the <b>only</b> time that you can access the\\n                password. You cannot recover the password later, but you can reset it again.</p>\\n         </important>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#ResourceHandlingOptionType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 64\n                }\n            }\n        },\n        \"com.amazonaws.iam#ResourceNameListType\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.iam#ResourceNameType\"\n            }\n        },\n        \"com.amazonaws.iam#ResourceNameType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 2048\n                }\n            }\n        },\n        \"com.amazonaws.iam#ResourceSpecificResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"EvalResourceName\": {\n                    \"target\": \"com.amazonaws.iam#ResourceNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the simulated resource, in Amazon Resource Name (ARN) format.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"EvalResourceDecision\": {\n                    \"target\": \"com.amazonaws.iam#PolicyEvaluationDecisionType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The result of the simulation of the simulated API operation on the resource specified in\\n            <code>EvalResourceName</code>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"MatchedStatements\": {\n                    \"target\": \"com.amazonaws.iam#StatementListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of the statements in the input policies that determine the result for this part\\n         of the simulation. Remember that even if multiple statements allow the operation on the\\n         resource, if <i>any</i> statement denies that operation, then the explicit\\n         deny overrides any allow. In addition, the deny statement is the only entry included in the\\n         result.</p>\"\n                    }\n                },\n                \"MissingContextValues\": {\n                    \"target\": \"com.amazonaws.iam#ContextKeyNamesResultListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of context keys that are required by the included input policies but that were\\n         not provided by one of the input parameters. This list is used when a list of ARNs is\\n         included in the <code>ResourceArns</code> parameter instead of \\\"*\\\". If you do not specify\\n         individual resources, by setting <code>ResourceArns</code> to \\\"*\\\" or by not including the\\n            <code>ResourceArns</code> parameter, then any missing context values are instead\\n         included under the <code>EvaluationResults</code> section. To discover the context keys\\n         used by a set of policies, you can call <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetContextKeysForCustomPolicy.html\\\">GetContextKeysForCustomPolicy</a> or <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetContextKeysForPrincipalPolicy.html\\\">GetContextKeysForPrincipalPolicy</a>.</p>\"\n                    }\n                },\n                \"EvalDecisionDetails\": {\n                    \"target\": \"com.amazonaws.iam#EvalDecisionDetailsType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Additional details about the results of the evaluation decision on a single resource.\\n         This parameter is returned only for cross-account simulations. This parameter explains how\\n         each policy type contributes to the resource-specific evaluation decision.</p>\"\n                    }\n                },\n                \"PermissionsBoundaryDecisionDetail\": {\n                    \"target\": \"com.amazonaws.iam#PermissionsBoundaryDecisionDetail\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Contains information about the effect that a permissions boundary has on a policy\\n         simulation when that boundary is applied to an IAM entity.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the result of the simulation of a single API operation call on a single\\n         resource.</p>\\n         <p>This data type is used by a member of the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_EvaluationResult.html\\\">EvaluationResult</a> data\\n         type.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#ResourceSpecificResultListType\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.iam#ResourceSpecificResult\"\n            }\n        },\n        \"com.amazonaws.iam#ResyncMFADevice\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#ResyncMFADeviceRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#ConcurrentModificationException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#InvalidAuthenticationCodeException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Synchronizes the specified MFA device with its IAM resource object on the Amazon Web Services\\n            servers.</p>\\n         <p>For more information about creating and working with virtual MFA devices, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/Using_VirtualMFA.html\\\">Using a virtual MFA\\n                device</a> in the <i>IAM User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#ResyncMFADeviceRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"UserName\": {\n                    \"target\": \"com.amazonaws.iam#existingUserNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the user whose MFA device you want to resynchronize.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"SerialNumber\": {\n                    \"target\": \"com.amazonaws.iam#serialNumberType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Serial number that uniquely identifies the MFA device.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"AuthenticationCode1\": {\n                    \"target\": \"com.amazonaws.iam#authenticationCodeType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An authentication code emitted by the device.</p>\\n         <p>The format for this parameter is a sequence of six digits.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"AuthenticationCode2\": {\n                    \"target\": \"com.amazonaws.iam#authenticationCodeType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A subsequent authentication code emitted by the device.</p>\\n         <p>The format for this parameter is a sequence of six digits.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#Role\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Path\": {\n                    \"target\": \"com.amazonaws.iam#pathType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The path to the role. For more information about paths, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/Using_Identifiers.html\\\">IAM identifiers</a> in the\\n            <i>IAM User Guide</i>. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"RoleName\": {\n                    \"target\": \"com.amazonaws.iam#roleNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The friendly name that identifies the role.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"RoleId\": {\n                    \"target\": \"com.amazonaws.iam#idType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The stable and unique string identifying the role. For more information about IDs, see\\n            <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/Using_Identifiers.html\\\">IAM\\n            identifiers</a> in the <i>IAM User Guide</i>. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Arn\": {\n                    \"target\": \"com.amazonaws.iam#arnType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The Amazon Resource Name (ARN) specifying the role. For more information about ARNs and\\n         how to use them in policies, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/Using_Identifiers.html\\\">IAM identifiers</a> in the\\n            <i>IAM User Guide</i> guide. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"CreateDate\": {\n                    \"target\": \"com.amazonaws.iam#dateType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time, in <a href=\\\"http://www.iso.org/iso/iso8601\\\">ISO 8601 date-time\\n            format</a>, when the role was created.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"AssumeRolePolicyDocument\": {\n                    \"target\": \"com.amazonaws.iam#policyDocumentType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The policy that grants an entity permission to assume the role.</p>\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.iam#roleDescriptionType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A description of the role that you provide.</p>\"\n                    }\n                },\n                \"MaxSessionDuration\": {\n                    \"target\": \"com.amazonaws.iam#roleMaxSessionDurationType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum session duration (in seconds) for the specified role. Anyone who uses the\\n         CLI, or API to assume the role can specify the duration using the optional\\n            <code>DurationSeconds</code> API parameter or <code>duration-seconds</code> CLI\\n         parameter.</p>\"\n                    }\n                },\n                \"PermissionsBoundary\": {\n                    \"target\": \"com.amazonaws.iam#AttachedPermissionsBoundary\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the policy used to set the permissions boundary for the role.</p>\\n         <p>For more information about permissions boundaries, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_boundaries.html\\\">Permissions boundaries for IAM\\n            identities </a> in the <i>IAM User Guide</i>.</p>\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.iam#tagListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of tags that are attached to the role. For more information about tagging, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_tags.html\\\">Tagging IAM resources</a> in the\\n      <i>IAM User Guide</i>.</p>\"\n                    }\n                },\n                \"RoleLastUsed\": {\n                    \"target\": \"com.amazonaws.iam#RoleLastUsed\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Contains information about the last time that an IAM role was used. This includes the\\n         date and time and the Region in which the role was last used. Activity is only reported for\\n         the trailing 400 days. This period can be shorter if your Region began supporting these\\n         features within the last year. The role might have been used more than 400 days ago. For\\n         more information, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_access-advisor.html#access-advisor_tracking-period\\\">Regions where data is tracked</a> in the <i>IAM user\\n         Guide</i>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains information about an IAM role. This structure is returned as a response\\n         element in several API operations that interact with roles.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#RoleDetail\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Path\": {\n                    \"target\": \"com.amazonaws.iam#pathType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The path to the role. For more information about paths, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/Using_Identifiers.html\\\">IAM identifiers</a> in the\\n            <i>IAM User Guide</i>.</p>\"\n                    }\n                },\n                \"RoleName\": {\n                    \"target\": \"com.amazonaws.iam#roleNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The friendly name that identifies the role.</p>\"\n                    }\n                },\n                \"RoleId\": {\n                    \"target\": \"com.amazonaws.iam#idType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The stable and unique string identifying the role. For more information about IDs, see\\n            <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/Using_Identifiers.html\\\">IAM\\n            identifiers</a> in the <i>IAM User Guide</i>.</p>\"\n                    }\n                },\n                \"Arn\": {\n                    \"target\": \"com.amazonaws.iam#arnType\"\n                },\n                \"CreateDate\": {\n                    \"target\": \"com.amazonaws.iam#dateType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time, in <a href=\\\"http://www.iso.org/iso/iso8601\\\">ISO 8601 date-time\\n            format</a>, when the role was created.</p>\"\n                    }\n                },\n                \"AssumeRolePolicyDocument\": {\n                    \"target\": \"com.amazonaws.iam#policyDocumentType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The trust policy that grants permission to assume the role.</p>\"\n                    }\n                },\n                \"InstanceProfileList\": {\n                    \"target\": \"com.amazonaws.iam#instanceProfileListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of instance profiles that contain this role.</p>\"\n                    }\n                },\n                \"RolePolicyList\": {\n                    \"target\": \"com.amazonaws.iam#policyDetailListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of inline policies embedded in the role. These policies are the role's access\\n         (permissions) policies.</p>\"\n                    }\n                },\n                \"AttachedManagedPolicies\": {\n                    \"target\": \"com.amazonaws.iam#attachedPoliciesListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of managed policies attached to the role. These policies are the role's access\\n         (permissions) policies.</p>\"\n                    }\n                },\n                \"PermissionsBoundary\": {\n                    \"target\": \"com.amazonaws.iam#AttachedPermissionsBoundary\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the policy used to set the permissions boundary for the role.</p>\\n         <p>For more information about permissions boundaries, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_boundaries.html\\\">Permissions boundaries for IAM\\n            identities </a> in the <i>IAM User Guide</i>.</p>\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.iam#tagListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of tags that are attached to the role. For more information about tagging, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_tags.html\\\">Tagging IAM resources</a> in the\\n      <i>IAM User Guide</i>.</p>\"\n                    }\n                },\n                \"RoleLastUsed\": {\n                    \"target\": \"com.amazonaws.iam#RoleLastUsed\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Contains information about the last time that an IAM role was used. This includes the\\n         date and time and the Region in which the role was last used. Activity is only reported for\\n         the trailing 400 days. This period can be shorter if your Region began supporting these\\n         features within the last year. The role might have been used more than 400 days ago. For\\n         more information, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_access-advisor.html#access-advisor_tracking-period\\\">Regions where data is tracked</a> in the\\n         <i>IAM User Guide</i>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains information about an IAM role, including all of the role's policies.</p>\\n         <p>This data type is used as a response element in the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetAccountAuthorizationDetails.html\\\">GetAccountAuthorizationDetails</a> operation.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#RoleLastUsed\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LastUsedDate\": {\n                    \"target\": \"com.amazonaws.iam#dateType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time, in <a href=\\\"http://www.iso.org/iso/iso8601\\\">ISO 8601 date-time\\n            format</a> that the role was last used.</p>\\n         <p>This field is null if the role has not been used within the IAM tracking period. For\\n         more information about the tracking period, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_access-advisor.html#access-advisor_tracking-period\\\">Regions where data is tracked</a> in the <i>IAM User Guide</i>.\\n      </p>\"\n                    }\n                },\n                \"Region\": {\n                    \"target\": \"com.amazonaws.iam#stringType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the Amazon Web Services Region in which the role was last used.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains information about the last time that an IAM role was used. This includes the\\n         date and time and the Region in which the role was last used. Activity is only reported for\\n         the trailing 400 days. This period can be shorter if your Region began supporting these\\n         features within the last year. The role might have been used more than 400 days ago. For\\n         more information, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_access-advisor.html#access-advisor_tracking-period\\\">Regions where data is tracked</a> in the <i>IAM user\\n         Guide</i>.</p>\\n         <p>This data type is returned as a response element in the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetRole.html\\\">GetRole</a> and <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetAccountAuthorizationDetails.html\\\">GetAccountAuthorizationDetails</a> operations.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#RoleUsageListType\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.iam#RoleUsageType\"\n            }\n        },\n        \"com.amazonaws.iam#RoleUsageType\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Region\": {\n                    \"target\": \"com.amazonaws.iam#RegionNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the Region where the service-linked role is being used.</p>\"\n                    }\n                },\n                \"Resources\": {\n                    \"target\": \"com.amazonaws.iam#ArnListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the resource that is using the service-linked role.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>An object that contains details about how a service-linked role is used, if that\\n         information is returned by the service.</p>\\n         <p>This data type is used as a response element in the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetServiceLinkedRoleDeletionStatus.html\\\">GetServiceLinkedRoleDeletionStatus</a> operation.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#SAMLMetadataDocumentType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1000,\n                    \"max\": 10000000\n                }\n            }\n        },\n        \"com.amazonaws.iam#SAMLPrivateKey\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"KeyId\": {\n                    \"target\": \"com.amazonaws.iam#privateKeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The unique identifier for the SAML private key.</p>\"\n                    }\n                },\n                \"Timestamp\": {\n                    \"target\": \"com.amazonaws.iam#dateType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time, in <a href=\\\"http://www.iso.org/iso/iso8601\\\">ISO 8601 date-time\\n         </a> format, when the private key was uploaded.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the private keys for the SAML provider.</p>\\n         <p>This data type is used as a response element in the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetSAMLProvider.html\\\">GetSAMLProvider</a>\\n         operation.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#SAMLProviderListEntry\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Arn\": {\n                    \"target\": \"com.amazonaws.iam#arnType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the SAML provider.</p>\"\n                    }\n                },\n                \"ValidUntil\": {\n                    \"target\": \"com.amazonaws.iam#dateType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The expiration date and time for the SAML provider.</p>\"\n                    }\n                },\n                \"CreateDate\": {\n                    \"target\": \"com.amazonaws.iam#dateType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time when the SAML provider was created.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the list of SAML providers for this account.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#SAMLProviderListType\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.iam#SAMLProviderListEntry\"\n            }\n        },\n        \"com.amazonaws.iam#SAMLProviderNameType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 128\n                },\n                \"smithy.api#pattern\": \"^[\\\\w._-]+$\"\n            }\n        },\n        \"com.amazonaws.iam#SSHPublicKey\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"UserName\": {\n                    \"target\": \"com.amazonaws.iam#userNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the IAM user associated with the SSH public key.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"SSHPublicKeyId\": {\n                    \"target\": \"com.amazonaws.iam#publicKeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The unique identifier for the SSH public key.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Fingerprint\": {\n                    \"target\": \"com.amazonaws.iam#publicKeyFingerprintType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The MD5 message digest of the SSH public key.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"SSHPublicKeyBody\": {\n                    \"target\": \"com.amazonaws.iam#publicKeyMaterialType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The SSH public key.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Status\": {\n                    \"target\": \"com.amazonaws.iam#statusType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The status of the SSH public key. <code>Active</code> means that the key can be used for\\n         authentication with an CodeCommit repository. <code>Inactive</code> means that the key cannot be\\n         used.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"UploadDate\": {\n                    \"target\": \"com.amazonaws.iam#dateType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time, in <a href=\\\"http://www.iso.org/iso/iso8601\\\">ISO 8601 date-time\\n            format</a>, when the SSH public key was uploaded.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains information about an SSH public key.</p>\\n         <p>This data type is used as a response element in the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetSSHPublicKey.html\\\">GetSSHPublicKey</a> and\\n            <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_UploadSSHPublicKey.html\\\">UploadSSHPublicKey</a> operations. </p>\"\n            }\n        },\n        \"com.amazonaws.iam#SSHPublicKeyListType\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.iam#SSHPublicKeyMetadata\"\n            }\n        },\n        \"com.amazonaws.iam#SSHPublicKeyMetadata\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"UserName\": {\n                    \"target\": \"com.amazonaws.iam#userNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the IAM user associated with the SSH public key.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"SSHPublicKeyId\": {\n                    \"target\": \"com.amazonaws.iam#publicKeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The unique identifier for the SSH public key.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Status\": {\n                    \"target\": \"com.amazonaws.iam#statusType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The status of the SSH public key. <code>Active</code> means that the key can be used for\\n         authentication with an CodeCommit repository. <code>Inactive</code> means that the key cannot be\\n         used.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"UploadDate\": {\n                    \"target\": \"com.amazonaws.iam#dateType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time, in <a href=\\\"http://www.iso.org/iso/iso8601\\\">ISO 8601 date-time\\n            format</a>, when the SSH public key was uploaded.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains information about an SSH public key, without the key's body or\\n         fingerprint.</p>\\n         <p>This data type is used as a response element in the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListSSHPublicKeys.html\\\">ListSSHPublicKeys</a>\\n         operation.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#ServerCertificate\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ServerCertificateMetadata\": {\n                    \"target\": \"com.amazonaws.iam#ServerCertificateMetadata\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The meta information of the server certificate, such as its name, path, ID, and\\n         ARN.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"CertificateBody\": {\n                    \"target\": \"com.amazonaws.iam#certificateBodyType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The contents of the public key certificate.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"CertificateChain\": {\n                    \"target\": \"com.amazonaws.iam#certificateChainType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The contents of the public key certificate chain.</p>\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.iam#tagListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of tags that are attached to the server certificate. For more information about tagging, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_tags.html\\\">Tagging IAM resources</a> in the\\n      <i>IAM User Guide</i>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains information about a server certificate.</p>\\n         <p> This data type is used as a response element in the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetServerCertificate.html\\\">GetServerCertificate</a>\\n         operation. </p>\"\n            }\n        },\n        \"com.amazonaws.iam#ServerCertificateMetadata\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Path\": {\n                    \"target\": \"com.amazonaws.iam#pathType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The path to the server certificate. For more information about paths, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/Using_Identifiers.html\\\">IAM\\n            identifiers</a> in the <i>IAM User Guide</i>. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ServerCertificateName\": {\n                    \"target\": \"com.amazonaws.iam#serverCertificateNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name that identifies the server certificate.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ServerCertificateId\": {\n                    \"target\": \"com.amazonaws.iam#idType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The stable and unique string identifying the server certificate. For more information\\n         about IDs, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/Using_Identifiers.html\\\">IAM identifiers</a> in the <i>IAM User Guide</i>. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Arn\": {\n                    \"target\": \"com.amazonaws.iam#arnType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The Amazon Resource Name (ARN) specifying the server certificate. For more information\\n         about ARNs and how to use them in policies, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/Using_Identifiers.html\\\">IAM identifiers</a> in the\\n            <i>IAM User Guide</i>. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"UploadDate\": {\n                    \"target\": \"com.amazonaws.iam#dateType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date when the server certificate was uploaded.</p>\"\n                    }\n                },\n                \"Expiration\": {\n                    \"target\": \"com.amazonaws.iam#dateType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date on which the certificate is set to expire.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains information about a server certificate without its certificate body,\\n         certificate chain, and private key.</p>\\n         <p> This data type is used as a response element in the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_UploadServerCertificate.html\\\">UploadServerCertificate</a> and <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListServerCertificates.html\\\">ListServerCertificates</a> operations. </p>\"\n            }\n        },\n        \"com.amazonaws.iam#ServiceAccessNotEnabledException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Message\": {\n                    \"target\": \"com.amazonaws.iam#ExceptionMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The request was rejected because trusted access is not enabled for IAM in Organizations. For details, see IAM and Organizations in the <i>Organizations User Guide</i>.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.iam#ServiceFailureException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.iam#serviceFailureExceptionMessage\"\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"ServiceFailure\",\n                    \"httpResponseCode\": 500\n                },\n                \"smithy.api#documentation\": \"<p>The request processing has failed because of an unknown error, exception or\\n      failure.</p>\",\n                \"smithy.api#error\": \"server\",\n                \"smithy.api#httpError\": 500\n            }\n        },\n        \"com.amazonaws.iam#ServiceLastAccessed\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ServiceName\": {\n                    \"target\": \"com.amazonaws.iam#serviceNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the service in which access was attempted.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"LastAuthenticated\": {\n                    \"target\": \"com.amazonaws.iam#dateType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time, in <a href=\\\"http://www.iso.org/iso/iso8601\\\">ISO 8601 date-time\\n            format</a>, when an authenticated entity most recently attempted to access the\\n         service. Amazon Web Services does not report unauthenticated requests.</p>\\n         <p>This field is null if no IAM entities attempted to access the service within the\\n            <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_access-advisor.html#service-last-accessed-reporting-period\\\">tracking period</a>.</p>\"\n                    }\n                },\n                \"ServiceNamespace\": {\n                    \"target\": \"com.amazonaws.iam#serviceNamespaceType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The namespace of the service in which access was attempted.</p>\\n         <p>To learn the service namespace of a service, see <a href=\\\"https://docs.aws.amazon.com/service-authorization/latest/reference/reference_policies_actions-resources-contextkeys.html\\\">Actions, resources, and condition keys for Amazon Web Services services</a> in the\\n            <i>Service Authorization Reference</i>. Choose the name of the service to\\n         view details for that service. In the first paragraph, find the service prefix. For\\n         example, <code>(service prefix: a4b)</code>. For more information about service namespaces,\\n         see <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html#genref-aws-service-namespaces\\\">Amazon Web Services\\n            Service Namespaces</a> in the <i>Amazon Web Services General Reference</i>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"LastAuthenticatedEntity\": {\n                    \"target\": \"com.amazonaws.iam#arnType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the authenticated entity (user or role) that last attempted to access the\\n         service. Amazon Web Services does not report unauthenticated requests.</p>\\n         <p>This field is null if no IAM entities attempted to access the service within the\\n            <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_access-advisor.html#service-last-accessed-reporting-period\\\">tracking period</a>.</p>\"\n                    }\n                },\n                \"LastAuthenticatedRegion\": {\n                    \"target\": \"com.amazonaws.iam#stringType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Region from which the authenticated entity (user or role) last attempted to access\\n         the service. Amazon Web Services does not report unauthenticated requests.</p>\\n         <p>This field is null if no IAM entities attempted to access the service within the\\n            <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_access-advisor.html#service-last-accessed-reporting-period\\\">tracking period</a>.</p>\"\n                    }\n                },\n                \"TotalAuthenticatedEntities\": {\n                    \"target\": \"com.amazonaws.iam#integerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The total number of authenticated principals (root user, IAM users, or IAM roles) that\\n         have attempted to access the service.</p>\\n         <p>This field is null if no principals attempted to access the service within the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_access-advisor.html#service-last-accessed-reporting-period\\\">tracking period</a>.</p>\"\n                    }\n                },\n                \"TrackedActionsLastAccessed\": {\n                    \"target\": \"com.amazonaws.iam#TrackedActionsLastAccessed\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An object that contains details about the most recent attempt to access a tracked action\\n         within the service.</p>\\n         <p>This field is null if there no tracked actions or if the principal did not use the\\n         tracked actions within the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_access-advisor.html#service-last-accessed-reporting-period\\\">tracking period</a>. This field is also null if the report was generated at the\\n         service level and not the action level. For more information, see the\\n            <code>Granularity</code> field in <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GenerateServiceLastAccessedDetails.html\\\">GenerateServiceLastAccessedDetails</a>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains details about the most recent attempt to access the service.</p>\\n         <p>This data type is used as a response element in the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetServiceLastAccessedDetails.html\\\">GetServiceLastAccessedDetails</a> operation.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#ServiceNotSupportedException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.iam#serviceNotSupportedMessage\"\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"NotSupportedService\",\n                    \"httpResponseCode\": 404\n                },\n                \"smithy.api#documentation\": \"<p>The specified service does not support service-specific credentials.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 404\n            }\n        },\n        \"com.amazonaws.iam#ServiceSpecificCredential\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CreateDate\": {\n                    \"target\": \"com.amazonaws.iam#dateType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time, in <a href=\\\"http://www.iso.org/iso/iso8601\\\">ISO 8601 date-time\\n            format</a>, when the service-specific credential were created.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ExpirationDate\": {\n                    \"target\": \"com.amazonaws.iam#dateType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time when the service specific credential expires. This field is only\\n         present for Bedrock API keys that were created with an expiration period.</p>\"\n                    }\n                },\n                \"ServiceName\": {\n                    \"target\": \"com.amazonaws.iam#serviceName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the service associated with the service-specific credential.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ServiceUserName\": {\n                    \"target\": \"com.amazonaws.iam#serviceUserName\",\n                    \"traits\": {\n                        \"smithy.api#addedDefault\": {},\n                        \"smithy.api#default\": \"\",\n                        \"smithy.api#documentation\": \"<p>The generated user name for the service-specific credential. This value is generated by\\n         combining the IAM user's name combined with the ID number of the Amazon Web Services account, as in\\n            <code>jane-at-123456789012</code>, for example. This value cannot be configured by the\\n         user.</p>\"\n                    }\n                },\n                \"ServicePassword\": {\n                    \"target\": \"com.amazonaws.iam#servicePassword\",\n                    \"traits\": {\n                        \"smithy.api#addedDefault\": {},\n                        \"smithy.api#default\": \"\",\n                        \"smithy.api#documentation\": \"<p>The generated password for the service-specific credential.</p>\"\n                    }\n                },\n                \"ServiceCredentialAlias\": {\n                    \"target\": \"com.amazonaws.iam#serviceCredentialAlias\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>For Bedrock API keys, this is the public portion of the credential that includes the IAM\\n         user name and a suffix containing version and creation information.</p>\"\n                    }\n                },\n                \"ServiceCredentialSecret\": {\n                    \"target\": \"com.amazonaws.iam#serviceCredentialSecret\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>For Bedrock API keys, this is the secret portion of the credential that should be used\\n         to authenticate API calls. This value is returned only when the credential is\\n         created.</p>\"\n                    }\n                },\n                \"ServiceSpecificCredentialId\": {\n                    \"target\": \"com.amazonaws.iam#serviceSpecificCredentialId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The unique identifier for the service-specific credential.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"UserName\": {\n                    \"target\": \"com.amazonaws.iam#userNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the IAM user associated with the service-specific credential.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Status\": {\n                    \"target\": \"com.amazonaws.iam#statusType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The status of the service-specific credential. <code>Active</code> means that the key is\\n         valid for API calls, while <code>Inactive</code> means it is not.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the details of a service-specific credential.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#ServiceSpecificCredentialMetadata\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"UserName\": {\n                    \"target\": \"com.amazonaws.iam#userNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the IAM user associated with the service-specific credential.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Status\": {\n                    \"target\": \"com.amazonaws.iam#statusType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The status of the service-specific credential. <code>Active</code> means that the key is\\n         valid for API calls, while <code>Inactive</code> means it is not.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ServiceUserName\": {\n                    \"target\": \"com.amazonaws.iam#serviceUserName\",\n                    \"traits\": {\n                        \"smithy.api#addedDefault\": {},\n                        \"smithy.api#default\": \"\",\n                        \"smithy.api#documentation\": \"<p>The generated user name for the service-specific credential.</p>\"\n                    }\n                },\n                \"ServiceCredentialAlias\": {\n                    \"target\": \"com.amazonaws.iam#serviceCredentialAlias\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>For Bedrock API keys, this is the public portion of the credential that includes the IAM\\n         user name and a suffix containing version and creation information.</p>\"\n                    }\n                },\n                \"CreateDate\": {\n                    \"target\": \"com.amazonaws.iam#dateType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time, in <a href=\\\"http://www.iso.org/iso/iso8601\\\">ISO 8601 date-time\\n            format</a>, when the service-specific credential were created.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ExpirationDate\": {\n                    \"target\": \"com.amazonaws.iam#dateType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time when the service specific credential expires. This field is only\\n         present for Bedrock API keys that were created with an expiration period.</p>\"\n                    }\n                },\n                \"ServiceSpecificCredentialId\": {\n                    \"target\": \"com.amazonaws.iam#serviceSpecificCredentialId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The unique identifier for the service-specific credential.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ServiceName\": {\n                    \"target\": \"com.amazonaws.iam#serviceName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the service associated with the service-specific credential.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains additional details about a service-specific credential.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#ServiceSpecificCredentialsListType\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.iam#ServiceSpecificCredentialMetadata\"\n            }\n        },\n        \"com.amazonaws.iam#ServicesLastAccessed\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.iam#ServiceLastAccessed\"\n            }\n        },\n        \"com.amazonaws.iam#SetDefaultPolicyVersion\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#SetDefaultPolicyVersionRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#InvalidInputException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Sets the specified version of the specified policy as the policy's default (operative)\\n            version.</p>\\n         <p>This operation affects all users, groups, and roles that the policy is attached to. To\\n            list the users, groups, and roles that the policy is attached to, use <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListEntitiesForPolicy.html\\\">ListEntitiesForPolicy</a>.</p>\\n         <p>For information about managed policies, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/policies-managed-vs-inline.html\\\">Managed policies and inline\\n                policies</a> in the <i>IAM User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#SetDefaultPolicyVersionRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PolicyArn\": {\n                    \"target\": \"com.amazonaws.iam#arnType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the IAM policy whose default version you want to\\n            set.</p>\\n         <p>For more information about ARNs, see <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html\\\">Amazon Resource Names (ARNs)</a> in the <i>Amazon Web Services General Reference</i>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"VersionId\": {\n                    \"target\": \"com.amazonaws.iam#policyVersionIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The version of the policy to set as the default (operative) version.</p>\\n         <p>For more information about managed policy versions, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/policies-managed-versions.html\\\">Versioning for managed\\n                policies</a> in the <i>IAM User Guide</i>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#SetSecurityTokenServicePreferences\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#SetSecurityTokenServicePreferencesRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Sets the specified version of the global endpoint token as the token version used for\\n            the Amazon Web Services account.</p>\\n         <p>By default, Security Token Service (STS) is available as a global service, and all STS requests\\n            go to a single endpoint at <code>https://sts.amazonaws.com</code>. Amazon Web Services recommends\\n            using Regional STS endpoints to reduce latency, build in redundancy, and increase\\n            session token availability. For information about Regional endpoints for STS, see\\n                <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/sts.html\\\">Security Token Service\\n                endpoints and quotas</a> in the <i>Amazon Web Services General Reference</i>.</p>\\n         <p>If you make an STS call to the global endpoint, the resulting session tokens might\\n            be valid in some Regions but not others. It depends on the version that is set in this\\n            operation. Version 1 tokens are valid only in Amazon Web Services Regions that are\\n            available by default. These tokens do not work in manually enabled Regions, such as Asia\\n            Pacific (Hong Kong). Version 2 tokens are valid in all Regions. However, version 2\\n            tokens are longer and might affect systems where you temporarily store tokens. For\\n            information, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html\\\">Activating and\\n                deactivating STS in an Amazon Web Services Region</a> in the\\n                <i>IAM User Guide</i>.</p>\\n         <p>To view the current session token version, see the\\n                <code>GlobalEndpointTokenVersion</code> entry in the response of the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetAccountSummary.html\\\">GetAccountSummary</a> operation.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To delete an access key for an IAM user\",\n                        \"documentation\": \"The following command sets the STS global endpoint token to version 2. Version 2 tokens are valid in all Regions.\",\n                        \"input\": {\n                            \"GlobalEndpointTokenVersion\": \"v2Token\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.iam#SetSecurityTokenServicePreferencesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"GlobalEndpointTokenVersion\": {\n                    \"target\": \"com.amazonaws.iam#globalEndpointTokenVersion\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The version of the global endpoint token. Version 1 tokens are valid only in Amazon Web Services Regions that are available by default. These tokens do not work in\\n            manually enabled Regions, such as Asia Pacific (Hong Kong). Version 2 tokens are valid\\n            in all Regions. However, version 2 tokens are longer and might affect systems where you\\n            temporarily store tokens.</p>\\n         <p>For information, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html\\\">Activating and\\n                deactivating STS in an Amazon Web Services Region</a> in the\\n                <i>IAM User Guide</i>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#SigningCertificate\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"UserName\": {\n                    \"target\": \"com.amazonaws.iam#userNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the user the signing certificate is associated with.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"CertificateId\": {\n                    \"target\": \"com.amazonaws.iam#certificateIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID for the signing certificate.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"CertificateBody\": {\n                    \"target\": \"com.amazonaws.iam#certificateBodyType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The contents of the signing certificate.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Status\": {\n                    \"target\": \"com.amazonaws.iam#statusType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The status of the signing certificate. <code>Active</code> means that the key is valid\\n         for API calls, while <code>Inactive</code> means it is not.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"UploadDate\": {\n                    \"target\": \"com.amazonaws.iam#dateType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date when the signing certificate was uploaded.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains information about an X.509 signing certificate.</p>\\n         <p>This data type is used as a response element in the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_UploadSigningCertificate.html\\\">UploadSigningCertificate</a> and <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListSigningCertificates.html\\\">ListSigningCertificates</a> operations. </p>\"\n            }\n        },\n        \"com.amazonaws.iam#SimulateCustomPolicy\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#SimulateCustomPolicyRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#SimulatePolicyResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#InvalidInputException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#PolicyEvaluationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Simulate how a set of IAM policies and optionally a resource-based policy works with\\n            a list of API operations and Amazon Web Services resources to determine the policies' effective\\n            permissions. The policies are provided as strings.</p>\\n         <p>The simulation does not perform the API operations; it only checks the authorization\\n            to determine if the simulated policies allow or deny the operations. You can simulate\\n            resources that don't exist in your account.</p>\\n         <p>If you want to simulate existing policies that are attached to an IAM user, group,\\n            or role, use <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_SimulatePrincipalPolicy.html\\\">SimulatePrincipalPolicy</a> instead.</p>\\n         <p>Context keys are variables that are maintained by Amazon Web Services and its services and which\\n            provide details about the context of an API query request. You can use the\\n                <code>Condition</code> element of an IAM policy to evaluate context keys. To get\\n            the list of context keys that the policies require for correct simulation, use <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetContextKeysForCustomPolicy.html\\\">GetContextKeysForCustomPolicy</a>.</p>\\n         <p>If the output is long, you can use <code>MaxItems</code> and <code>Marker</code>\\n            parameters to paginate the results.</p>\\n         <note>\\n            <p>The IAM policy simulator evaluates statements in the identity-based policy and\\n                the inputs that you provide during simulation. The policy simulator results can\\n                differ from your live Amazon Web Services environment. We recommend that you check your policies\\n                against your live Amazon Web Services environment after testing using the policy simulator to\\n                confirm that you have the desired results. For more information about using the\\n                policy simulator, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_testing-policies.html\\\">Testing IAM\\n                    policies with the IAM policy simulator </a>in the\\n                    <i>IAM User Guide</i>.</p>\\n         </note>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"Marker\",\n                    \"outputToken\": \"Marker\",\n                    \"items\": \"EvaluationResults\",\n                    \"pageSize\": \"MaxItems\"\n                }\n            }\n        },\n        \"com.amazonaws.iam#SimulateCustomPolicyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PolicyInputList\": {\n                    \"target\": \"com.amazonaws.iam#SimulationPolicyListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of policy documents to include in the simulation. Each document is specified as\\n            a string containing the complete, valid JSON text of an IAM policy. Do not include any\\n            resource-based policies in this parameter. Any resource-based policy must be submitted\\n            with the <code>ResourcePolicy</code> parameter. The policies cannot be \\\"scope-down\\\"\\n            policies, such as you could include in a call to <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetFederationToken.html\\\">GetFederationToken</a> or one of\\n            the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_AssumeRole.html\\\">AssumeRole</a> API operations. In other words, do not use policies designed to\\n            restrict what a user can do while using the temporary credentials.</p>\\n         <p>The maximum length of the policy document that you can pass in this operation,\\n            including whitespace, is listed below. To view the maximum character counts of a managed policy with no whitespaces, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_iam-quotas.html#reference_iam-quotas-entity-length\\\">IAM and STS character quotas</a>.</p>\\n         <p>The <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a> \\n    used to validate this parameter is a string of characters consisting of the following:</p>\\n         <ul>\\n            <li>\\n               <p>Any printable ASCII \\n    character ranging from the space character (<code>\\\\u0020</code>) through the end of the ASCII character range</p>\\n            </li>\\n            <li>\\n               <p>The printable characters in the Basic Latin and  Latin-1 Supplement character set \\n    (through <code>\\\\u00FF</code>)</p>\\n            </li>\\n            <li>\\n               <p>The special characters tab (<code>\\\\u0009</code>), line feed (<code>\\\\u000A</code>), and \\n    carriage return (<code>\\\\u000D</code>)</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"PermissionsBoundaryPolicyInputList\": {\n                    \"target\": \"com.amazonaws.iam#SimulationPolicyListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IAM permissions boundary policy to simulate. The permissions boundary sets the\\n            maximum permissions that an IAM entity can have. You can input only one permissions\\n            boundary when you pass a policy to this operation. For more information about\\n            permissions boundaries, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_boundaries.html\\\">Permissions boundaries for IAM\\n                entities</a> in the <i>IAM User Guide</i>. The policy input is\\n            specified as a string that contains the complete, valid JSON text of a permissions\\n            boundary policy.</p>\\n         <p>The maximum length of the policy document that you can pass in this operation,\\n            including whitespace, is listed below. To view the maximum character counts of a managed policy with no whitespaces, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_iam-quotas.html#reference_iam-quotas-entity-length\\\">IAM and STS character quotas</a>.</p>\\n         <p>The <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a> \\n    used to validate this parameter is a string of characters consisting of the following:</p>\\n         <ul>\\n            <li>\\n               <p>Any printable ASCII \\n    character ranging from the space character (<code>\\\\u0020</code>) through the end of the ASCII character range</p>\\n            </li>\\n            <li>\\n               <p>The printable characters in the Basic Latin and  Latin-1 Supplement character set \\n    (through <code>\\\\u00FF</code>)</p>\\n            </li>\\n            <li>\\n               <p>The special characters tab (<code>\\\\u0009</code>), line feed (<code>\\\\u000A</code>), and \\n    carriage return (<code>\\\\u000D</code>)</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"ActionNames\": {\n                    \"target\": \"com.amazonaws.iam#ActionNameListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of names of API operations to evaluate in the simulation. Each operation is\\n            evaluated against each resource. Each operation must include the service identifier,\\n            such as <code>iam:CreateUser</code>. This operation does not support using wildcards (*)\\n            in an action name.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ResourceArns\": {\n                    \"target\": \"com.amazonaws.iam#ResourceNameListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of ARNs of Amazon Web Services resources to include in the simulation. If this parameter is\\n            not provided, then the value defaults to <code>*</code> (all resources). Each API in the\\n                <code>ActionNames</code> parameter is evaluated for each resource in this list. The\\n            simulation determines the access result (allowed or denied) of each combination and\\n            reports it in the response. You can simulate resources that don't exist in your\\n            account.</p>\\n         <p>The simulation does not automatically retrieve policies for the specified resources.\\n            If you want to include a resource policy in the simulation, then you must include the\\n            policy as a string in the <code>ResourcePolicy</code> parameter.</p>\\n         <p>If you include a <code>ResourcePolicy</code>, then it must be applicable to all of the\\n            resources included in the simulation or you receive an invalid input error.</p>\\n         <p>For more information about ARNs, see <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html\\\">Amazon Resource Names (ARNs)</a> in the <i>Amazon Web Services General Reference</i>.</p>\\n         <note>\\n            <p>Simulation of resource-based policies isn't supported for IAM roles.</p>\\n         </note>\"\n                    }\n                },\n                \"ResourcePolicy\": {\n                    \"target\": \"com.amazonaws.iam#policyDocumentType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A resource-based policy to include in the simulation provided as a string. Each\\n            resource in the simulation is treated as if it had this policy attached. You can include\\n            only one resource-based policy in a simulation.</p>\\n         <p>The maximum length of the policy document that you can pass in this operation,\\n            including whitespace, is listed below. To view the maximum character counts of a managed policy with no whitespaces, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_iam-quotas.html#reference_iam-quotas-entity-length\\\">IAM and STS character quotas</a>.</p>\\n         <p>The <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a> \\n    used to validate this parameter is a string of characters consisting of the following:</p>\\n         <ul>\\n            <li>\\n               <p>Any printable ASCII \\n    character ranging from the space character (<code>\\\\u0020</code>) through the end of the ASCII character range</p>\\n            </li>\\n            <li>\\n               <p>The printable characters in the Basic Latin and  Latin-1 Supplement character set \\n    (through <code>\\\\u00FF</code>)</p>\\n            </li>\\n            <li>\\n               <p>The special characters tab (<code>\\\\u0009</code>), line feed (<code>\\\\u000A</code>), and \\n    carriage return (<code>\\\\u000D</code>)</p>\\n            </li>\\n         </ul>\\n         <note>\\n            <p>Simulation of resource-based policies isn't supported for IAM roles.</p>\\n         </note>\"\n                    }\n                },\n                \"ResourceOwner\": {\n                    \"target\": \"com.amazonaws.iam#ResourceNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An ARN representing the Amazon Web Services account ID that specifies the owner of any simulated\\n            resource that does not identify its owner in the resource ARN. Examples of resource ARNs\\n            include an S3 bucket or object. If <code>ResourceOwner</code> is specified, it is also\\n            used as the account owner of any <code>ResourcePolicy</code> included in the simulation.\\n            If the <code>ResourceOwner</code> parameter is not specified, then the owner of the\\n            resources and the resource policy defaults to the account of the identity provided in\\n                <code>CallerArn</code>. This parameter is required only if you specify a\\n            resource-based policy and account that owns the resource is different from the account\\n            that owns the simulated calling user <code>CallerArn</code>.</p>\\n         <p>The ARN for an account uses the following syntax:\\n                    <code>arn:aws:iam::<i>AWS-account-ID</i>:root</code>. For example,\\n            to represent the account with the 112233445566 ID, use the following ARN:\\n                <code>arn:aws:iam::112233445566-ID:root</code>. </p>\"\n                    }\n                },\n                \"CallerArn\": {\n                    \"target\": \"com.amazonaws.iam#ResourceNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the IAM user that you want to use as the simulated caller of the API\\n            operations. <code>CallerArn</code> is required if you include a\\n                <code>ResourcePolicy</code> so that the policy's <code>Principal</code> element has\\n            a value to use in evaluating the policy.</p>\\n         <p>You can specify only the ARN of an IAM user. You cannot specify the ARN of an\\n            assumed role, federated user, or a service principal.</p>\"\n                    }\n                },\n                \"ContextEntries\": {\n                    \"target\": \"com.amazonaws.iam#ContextEntryListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of context keys and corresponding values for the simulation to use. Whenever a\\n            context key is evaluated in one of the simulated IAM permissions policies, the\\n            corresponding value is supplied.</p>\"\n                    }\n                },\n                \"ResourceHandlingOption\": {\n                    \"target\": \"com.amazonaws.iam#ResourceHandlingOptionType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the type of simulation to run. Different API operations that support\\n            resource-based policies require different combinations of resources. By specifying the\\n            type of simulation to run, you enable the policy simulator to enforce the presence of\\n            the required resources to ensure reliable simulation results. If your simulation does\\n            not match one of the following scenarios, then you can omit this parameter. The\\n            following list shows each of the supported scenario values and the resources that you\\n            must define to run the simulation.</p>\\n         <p>Each of the Amazon EC2 scenarios requires that you specify instance, image, and security\\n            group resources. If your scenario includes an EBS volume, then you must specify that\\n            volume as a resource. If the Amazon EC2 scenario includes VPC, then you must supply the\\n            network interface resource. If it includes an IP subnet, then you must specify the\\n            subnet resource. For more information on the Amazon EC2 scenario options, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-supported-platforms.html\\\">Supported platforms</a> in the <i>Amazon EC2 User Guide</i>.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <b>EC2-VPC-InstanceStore</b>\\n               </p>\\n               <p>instance, image, security group, network interface</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>EC2-VPC-InstanceStore-Subnet</b>\\n               </p>\\n               <p>instance, image, security group, network interface, subnet</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>EC2-VPC-EBS</b>\\n               </p>\\n               <p>instance, image, security group, network interface, volume</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>EC2-VPC-EBS-Subnet</b>\\n               </p>\\n               <p>instance, image, security group, network interface, subnet, volume</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"MaxItems\": {\n                    \"target\": \"com.amazonaws.iam#maxItemsType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this only when paginating results to indicate the \\n    maximum number of items you want in the response. If additional items exist beyond the maximum \\n    you specify, the <code>IsTruncated</code> response element is <code>true</code>.</p>\\n         <p>If you do not include this parameter, the number of items defaults to 100. Note that\\n    IAM might return fewer results, even when there are more results available. In that case, the\\n    <code>IsTruncated</code> response element returns <code>true</code>, and <code>Marker</code> \\n    contains a value to include in the subsequent call that tells the service where to continue \\n    from.</p>\"\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.iam#markerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter only when paginating results and only after \\n    you receive a response indicating that the results are truncated. Set it to the value of the\\n    <code>Marker</code> element in the response that you received to indicate where the next call \\n    should start.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#SimulatePolicyResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"EvaluationResults\": {\n                    \"target\": \"com.amazonaws.iam#EvaluationResultsListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The results of the simulation.</p>\"\n                    }\n                },\n                \"IsTruncated\": {\n                    \"target\": \"com.amazonaws.iam#booleanType\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>A flag that indicates whether there are more items to return. If your \\n    results were truncated, you can make a subsequent pagination request using the <code>Marker</code>\\n    request parameter to retrieve more items. Note that IAM might return fewer than the \\n    <code>MaxItems</code> number of results even when there are more results available. We recommend \\n    that you check <code>IsTruncated</code> after every call to ensure that you receive all your \\n    results.</p>\"\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.iam#responseMarkerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>When <code>IsTruncated</code> is <code>true</code>, this element\\n    is present and contains the value to use for the <code>Marker</code> parameter in a subsequent \\n    pagination request.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the response to a successful <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_SimulatePrincipalPolicy.html\\\">SimulatePrincipalPolicy</a> or <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_SimulateCustomPolicy.html\\\">SimulateCustomPolicy</a>\\n      request.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#SimulatePrincipalPolicy\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#SimulatePrincipalPolicyRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#SimulatePolicyResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#InvalidInputException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#PolicyEvaluationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Simulate how a set of IAM policies attached to an IAM entity works with a list of\\n            API operations and Amazon Web Services resources to determine the policies' effective permissions. The\\n            entity can be an IAM user, group, or role. If you specify a user, then the simulation\\n            also includes all of the policies that are attached to groups that the user belongs to.\\n            You can simulate resources that don't exist in your account.</p>\\n         <p>You can optionally include a list of one or more additional policies specified as\\n            strings to include in the simulation. If you want to simulate only policies specified as\\n            strings, use <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_SimulateCustomPolicy.html\\\">SimulateCustomPolicy</a> instead.</p>\\n         <p>You can also optionally include one resource-based policy to be evaluated with each of\\n            the resources included in the simulation for IAM users only.</p>\\n         <p>The simulation does not perform the API operations; it only checks the authorization\\n            to determine if the simulated policies allow or deny the operations.</p>\\n         <p>\\n            <b>Note:</b> This operation discloses information about the\\n            permissions granted to other users. If you do not want users to see other user's\\n            permissions, then consider allowing them to use <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_SimulateCustomPolicy.html\\\">SimulateCustomPolicy</a> instead.</p>\\n         <p>Context keys are variables maintained by Amazon Web Services and its services that provide details\\n            about the context of an API query request. You can use the <code>Condition</code>\\n            element of an IAM policy to evaluate context keys. To get the list of context keys\\n            that the policies require for correct simulation, use <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetContextKeysForPrincipalPolicy.html\\\">GetContextKeysForPrincipalPolicy</a>.</p>\\n         <p>If the output is long, you can use the <code>MaxItems</code> and <code>Marker</code>\\n            parameters to paginate the results.</p>\\n         <note>\\n            <p>The IAM policy simulator evaluates statements in the identity-based policy and\\n                the inputs that you provide during simulation. The policy simulator results can\\n                differ from your live Amazon Web Services environment. We recommend that you check your policies\\n                against your live Amazon Web Services environment after testing using the policy simulator to\\n                confirm that you have the desired results. For more information about using the\\n                policy simulator, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_testing-policies.html\\\">Testing IAM\\n                    policies with the IAM policy simulator </a>in the\\n                    <i>IAM User Guide</i>.</p>\\n         </note>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"Marker\",\n                    \"outputToken\": \"Marker\",\n                    \"items\": \"EvaluationResults\",\n                    \"pageSize\": \"MaxItems\"\n                }\n            }\n        },\n        \"com.amazonaws.iam#SimulatePrincipalPolicyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PolicySourceArn\": {\n                    \"target\": \"com.amazonaws.iam#arnType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of a user, group, or role whose policies you want to\\n            include in the simulation. If you specify a user, group, or role, the simulation\\n            includes all policies that are associated with that entity. If you specify a user, the\\n            simulation also includes all policies that are attached to any groups the user belongs\\n            to.</p>\\n         <p>The maximum length of the policy document that you can pass in this operation,\\n            including whitespace, is listed below. To view the maximum character counts of a managed policy with no whitespaces, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_iam-quotas.html#reference_iam-quotas-entity-length\\\">IAM and STS character quotas</a>.</p>\\n         <p>For more information about ARNs, see <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html\\\">Amazon Resource Names (ARNs)</a> in the <i>Amazon Web Services General Reference</i>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"PolicyInputList\": {\n                    \"target\": \"com.amazonaws.iam#SimulationPolicyListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An optional list of additional policy documents to include in the simulation. Each\\n            document is specified as a string containing the complete, valid JSON text of an IAM\\n            policy.</p>\\n         <p>The <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a> \\n    used to validate this parameter is a string of characters consisting of the following:</p>\\n         <ul>\\n            <li>\\n               <p>Any printable ASCII \\n    character ranging from the space character (<code>\\\\u0020</code>) through the end of the ASCII character range</p>\\n            </li>\\n            <li>\\n               <p>The printable characters in the Basic Latin and  Latin-1 Supplement character set \\n    (through <code>\\\\u00FF</code>)</p>\\n            </li>\\n            <li>\\n               <p>The special characters tab (<code>\\\\u0009</code>), line feed (<code>\\\\u000A</code>), and \\n    carriage return (<code>\\\\u000D</code>)</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"PermissionsBoundaryPolicyInputList\": {\n                    \"target\": \"com.amazonaws.iam#SimulationPolicyListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IAM permissions boundary policy to simulate. The permissions boundary sets the\\n            maximum permissions that the entity can have. You can input only one permissions\\n            boundary when you pass a policy to this operation. An IAM entity can only have one\\n            permissions boundary in effect at a time. For example, if a permissions boundary is\\n            attached to an entity and you pass in a different permissions boundary policy using this\\n            parameter, then the new permissions boundary policy is used for the simulation. For more\\n            information about permissions boundaries, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_boundaries.html\\\">Permissions boundaries for IAM\\n                entities</a> in the <i>IAM User Guide</i>. The policy input is\\n            specified as a string containing the complete, valid JSON text of a permissions boundary\\n            policy.</p>\\n         <p>The maximum length of the policy document that you can pass in this operation,\\n            including whitespace, is listed below. To view the maximum character counts of a managed policy with no whitespaces, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_iam-quotas.html#reference_iam-quotas-entity-length\\\">IAM and STS character quotas</a>.</p>\\n         <p>The <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a> \\n    used to validate this parameter is a string of characters consisting of the following:</p>\\n         <ul>\\n            <li>\\n               <p>Any printable ASCII \\n    character ranging from the space character (<code>\\\\u0020</code>) through the end of the ASCII character range</p>\\n            </li>\\n            <li>\\n               <p>The printable characters in the Basic Latin and  Latin-1 Supplement character set \\n    (through <code>\\\\u00FF</code>)</p>\\n            </li>\\n            <li>\\n               <p>The special characters tab (<code>\\\\u0009</code>), line feed (<code>\\\\u000A</code>), and \\n    carriage return (<code>\\\\u000D</code>)</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"ActionNames\": {\n                    \"target\": \"com.amazonaws.iam#ActionNameListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of names of API operations to evaluate in the simulation. Each operation is\\n            evaluated for each resource. Each operation must include the service identifier, such as\\n                <code>iam:CreateUser</code>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ResourceArns\": {\n                    \"target\": \"com.amazonaws.iam#ResourceNameListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of ARNs of Amazon Web Services resources to include in the simulation. If this parameter is\\n            not provided, then the value defaults to <code>*</code> (all resources). Each API in the\\n                <code>ActionNames</code> parameter is evaluated for each resource in this list. The\\n            simulation determines the access result (allowed or denied) of each combination and\\n            reports it in the response. You can simulate resources that don't exist in your\\n            account.</p>\\n         <p>The simulation does not automatically retrieve policies for the specified resources.\\n            If you want to include a resource policy in the simulation, then you must include the\\n            policy as a string in the <code>ResourcePolicy</code> parameter.</p>\\n         <p>For more information about ARNs, see <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html\\\">Amazon Resource Names (ARNs)</a> in the <i>Amazon Web Services General Reference</i>.</p>\\n         <note>\\n            <p>Simulation of resource-based policies isn't supported for IAM roles.</p>\\n         </note>\"\n                    }\n                },\n                \"ResourcePolicy\": {\n                    \"target\": \"com.amazonaws.iam#policyDocumentType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A resource-based policy to include in the simulation provided as a string. Each\\n            resource in the simulation is treated as if it had this policy attached. You can include\\n            only one resource-based policy in a simulation.</p>\\n         <p>The maximum length of the policy document that you can pass in this operation,\\n            including whitespace, is listed below. To view the maximum character counts of a managed policy with no whitespaces, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_iam-quotas.html#reference_iam-quotas-entity-length\\\">IAM and STS character quotas</a>.</p>\\n         <p>The <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a> \\n    used to validate this parameter is a string of characters consisting of the following:</p>\\n         <ul>\\n            <li>\\n               <p>Any printable ASCII \\n    character ranging from the space character (<code>\\\\u0020</code>) through the end of the ASCII character range</p>\\n            </li>\\n            <li>\\n               <p>The printable characters in the Basic Latin and  Latin-1 Supplement character set \\n    (through <code>\\\\u00FF</code>)</p>\\n            </li>\\n            <li>\\n               <p>The special characters tab (<code>\\\\u0009</code>), line feed (<code>\\\\u000A</code>), and \\n    carriage return (<code>\\\\u000D</code>)</p>\\n            </li>\\n         </ul>\\n         <note>\\n            <p>Simulation of resource-based policies isn't supported for IAM roles.</p>\\n         </note>\"\n                    }\n                },\n                \"ResourceOwner\": {\n                    \"target\": \"com.amazonaws.iam#ResourceNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An Amazon Web Services account ID that specifies the owner of any simulated resource that does not\\n            identify its owner in the resource ARN. Examples of resource ARNs include an S3 bucket\\n            or object. If <code>ResourceOwner</code> is specified, it is also used as the account\\n            owner of any <code>ResourcePolicy</code> included in the simulation. If the\\n                <code>ResourceOwner</code> parameter is not specified, then the owner of the\\n            resources and the resource policy defaults to the account of the identity provided in\\n                <code>CallerArn</code>. This parameter is required only if you specify a\\n            resource-based policy and account that owns the resource is different from the account\\n            that owns the simulated calling user <code>CallerArn</code>.</p>\"\n                    }\n                },\n                \"CallerArn\": {\n                    \"target\": \"com.amazonaws.iam#ResourceNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the IAM user that you want to specify as the simulated caller of the API\\n            operations. If you do not specify a <code>CallerArn</code>, it defaults to the ARN of\\n            the user that you specify in <code>PolicySourceArn</code>, if you specified a user. If\\n            you include both a <code>PolicySourceArn</code> (for example,\\n                <code>arn:aws:iam::123456789012:user/David</code>) and a <code>CallerArn</code> (for\\n            example, <code>arn:aws:iam::123456789012:user/Bob</code>), the result is that you\\n            simulate calling the API operations as Bob, as if Bob had David's policies.</p>\\n         <p>You can specify only the ARN of an IAM user. You cannot specify the ARN of an\\n            assumed role, federated user, or a service principal.</p>\\n         <p>\\n            <code>CallerArn</code> is required if you include a <code>ResourcePolicy</code> and\\n            the <code>PolicySourceArn</code> is not the ARN for an IAM user. This is required so\\n            that the resource-based policy's <code>Principal</code> element has a value to use in\\n            evaluating the policy.</p>\\n         <p>For more information about ARNs, see <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html\\\">Amazon Resource Names (ARNs)</a> in the <i>Amazon Web Services General Reference</i>.</p>\"\n                    }\n                },\n                \"ContextEntries\": {\n                    \"target\": \"com.amazonaws.iam#ContextEntryListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of context keys and corresponding values for the simulation to use. Whenever a\\n            context key is evaluated in one of the simulated IAM permissions policies, the\\n            corresponding value is supplied.</p>\"\n                    }\n                },\n                \"ResourceHandlingOption\": {\n                    \"target\": \"com.amazonaws.iam#ResourceHandlingOptionType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the type of simulation to run. Different API operations that support\\n            resource-based policies require different combinations of resources. By specifying the\\n            type of simulation to run, you enable the policy simulator to enforce the presence of\\n            the required resources to ensure reliable simulation results. If your simulation does\\n            not match one of the following scenarios, then you can omit this parameter. The\\n            following list shows each of the supported scenario values and the resources that you\\n            must define to run the simulation.</p>\\n         <p>Each of the Amazon EC2 scenarios requires that you specify instance, image, and security\\n            group resources. If your scenario includes an EBS volume, then you must specify that\\n            volume as a resource. If the Amazon EC2 scenario includes VPC, then you must supply the\\n            network interface resource. If it includes an IP subnet, then you must specify the\\n            subnet resource. For more information on the Amazon EC2 scenario options, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-supported-platforms.html\\\">Supported platforms</a> in the <i>Amazon EC2 User Guide</i>.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <b>EC2-VPC-InstanceStore</b>\\n               </p>\\n               <p>instance, image, security group, network interface</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>EC2-VPC-InstanceStore-Subnet</b>\\n               </p>\\n               <p>instance, image, security group, network interface, subnet</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>EC2-VPC-EBS</b>\\n               </p>\\n               <p>instance, image, security group, network interface, volume</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>EC2-VPC-EBS-Subnet</b>\\n               </p>\\n               <p>instance, image, security group, network interface, subnet, volume</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"MaxItems\": {\n                    \"target\": \"com.amazonaws.iam#maxItemsType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this only when paginating results to indicate the \\n    maximum number of items you want in the response. If additional items exist beyond the maximum \\n    you specify, the <code>IsTruncated</code> response element is <code>true</code>.</p>\\n         <p>If you do not include this parameter, the number of items defaults to 100. Note that\\n    IAM might return fewer results, even when there are more results available. In that case, the\\n    <code>IsTruncated</code> response element returns <code>true</code>, and <code>Marker</code> \\n    contains a value to include in the subsequent call that tells the service where to continue \\n    from.</p>\"\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.iam#markerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter only when paginating results and only after \\n    you receive a response indicating that the results are truncated. Set it to the value of the\\n    <code>Marker</code> element in the response that you received to indicate where the next call \\n    should start.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#SimulationPolicyListType\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.iam#policyDocumentType\"\n            }\n        },\n        \"com.amazonaws.iam#Statement\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SourcePolicyId\": {\n                    \"target\": \"com.amazonaws.iam#PolicyIdentifierType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The identifier of the policy that was provided as an input.</p>\"\n                    }\n                },\n                \"SourcePolicyType\": {\n                    \"target\": \"com.amazonaws.iam#PolicySourceType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of the policy.</p>\"\n                    }\n                },\n                \"StartPosition\": {\n                    \"target\": \"com.amazonaws.iam#Position\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The row and column of the beginning of the <code>Statement</code> in an IAM\\n         policy.</p>\"\n                    }\n                },\n                \"EndPosition\": {\n                    \"target\": \"com.amazonaws.iam#Position\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The row and column of the end of a <code>Statement</code> in an IAM policy.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains a reference to a <code>Statement</code> element in a policy document that\\n         determines the result of the simulation.</p>\\n         <p>This data type is used by the <code>MatchedStatements</code> member of the <code>\\n               <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_EvaluationResult.html\\\">EvaluationResult</a>\\n            </code> type.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#StatementListType\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.iam#Statement\"\n            }\n        },\n        \"com.amazonaws.iam#Tag\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Key\": {\n                    \"target\": \"com.amazonaws.iam#tagKeyType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The key name that can be used to look up or retrieve the associated value. For example,\\n        <code>Department</code> or <code>Cost Center</code> are common choices.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Value\": {\n                    \"target\": \"com.amazonaws.iam#tagValueType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The value associated with this tag. For example, tags with a key name of\\n        <code>Department</code> could have values such as <code>Human Resources</code>,\\n        <code>Accounting</code>, and <code>Support</code>. Tags with a key name of <code>Cost\\n        Center</code> might have values that consist of the number associated with the different\\n      cost centers in your company. Typically, many resources have tags with the same key name but\\n      with different values.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A structure that represents user-provided metadata that can be associated with an IAM\\n      resource. For more information about tagging, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_tags.html\\\">Tagging IAM resources</a> in the\\n      <i>IAM User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#TagInstanceProfile\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#TagInstanceProfileRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#ConcurrentModificationException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#InvalidInputException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Adds one or more tags to an IAM instance profile. If a tag with the same key name\\n      already exists, then that tag is overwritten with the new value.</p>\\n         <p>Each tag consists of a key name and an associated value. By assigning tags to your resources, you can do the\\n      following:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <b>Administrative grouping and discovery</b> - Attach\\n          tags to resources to aid in organization and search. For example, you could search for all\\n          resources with the key name <i>Project</i> and the value\\n            <i>MyImportantProject</i>. Or search for all resources with the key name\\n            <i>Cost Center</i> and the value <i>41200</i>. </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>Access control</b> - Include tags in IAM user-based\\n          and resource-based policies. You can use tags to restrict access to only an IAM instance\\n          profile that has a specified tag attached. For examples of policies that show how to use\\n          tags to control access, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_tags.html\\\">Control access using IAM tags</a> in the\\n            <i>IAM User Guide</i>.</p>\\n            </li>\\n         </ul>\\n         <note>\\n            <ul>\\n               <li>\\n                  <p>If any one of the tags is invalid or if you exceed the allowed maximum number of tags, then the entire request \\n   fails and the resource is not created. For more information about tagging, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_tags.html\\\">Tagging IAM resources</a> in the\\n      <i>IAM User Guide</i>.</p>\\n               </li>\\n               <li>\\n                  <p>Amazon Web Services always interprets the tag <code>Value</code> as a single string. If you\\n            need to store an array, you can store comma-separated values in the string. However, you\\n            must interpret the value in your code.</p>\\n               </li>\\n            </ul>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.iam#TagInstanceProfileRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceProfileName\": {\n                    \"target\": \"com.amazonaws.iam#instanceProfileNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the IAM instance profile to which you want to add tags.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.iam#tagListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The list of tags that you want to attach to the IAM instance profile.\\n      Each tag consists of a key name and an associated value.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#TagMFADevice\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#TagMFADeviceRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#ConcurrentModificationException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#InvalidInputException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Adds one or more tags to an IAM virtual multi-factor authentication (MFA) device. If\\n      a tag with the same key name already exists, then that tag is overwritten with the new\\n      value.</p>\\n         <p>A tag consists of a key name and an associated value. By assigning tags to your\\n      resources, you can do the following:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <b>Administrative grouping and discovery</b> - Attach\\n          tags to resources to aid in organization and search. For example, you could search for all\\n          resources with the key name <i>Project</i> and the value\\n            <i>MyImportantProject</i>. Or search for all resources with the key name\\n            <i>Cost Center</i> and the value <i>41200</i>. </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>Access control</b> - Include tags in IAM user-based\\n          and resource-based policies. You can use tags to restrict access to only an IAM virtual\\n          MFA device that has a specified tag attached. For examples of policies that show how to\\n          use tags to control access, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_tags.html\\\">Control access using IAM tags</a> in the\\n            <i>IAM User Guide</i>.</p>\\n            </li>\\n         </ul>\\n         <note>\\n            <ul>\\n               <li>\\n                  <p>If any one of the tags is invalid or if you exceed the allowed maximum number of tags, then the entire request \\n   fails and the resource is not created. For more information about tagging, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_tags.html\\\">Tagging IAM resources</a> in the\\n      <i>IAM User Guide</i>.</p>\\n               </li>\\n               <li>\\n                  <p>Amazon Web Services always interprets the tag <code>Value</code> as a single string. If you\\n            need to store an array, you can store comma-separated values in the string. However, you\\n            must interpret the value in your code.</p>\\n               </li>\\n            </ul>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.iam#TagMFADeviceRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SerialNumber\": {\n                    \"target\": \"com.amazonaws.iam#serialNumberType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The unique identifier for the IAM virtual MFA device to which you want to add tags.\\n      For virtual MFA devices, the serial number is the same as the ARN.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.iam#tagListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The list of tags that you want to attach to the IAM virtual MFA device.\\n      Each tag consists of a key name and an associated value.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#TagOpenIDConnectProvider\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#TagOpenIDConnectProviderRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#ConcurrentModificationException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#InvalidInputException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Adds one or more tags to an OpenID Connect (OIDC)-compatible identity provider. For\\n      more information about these providers, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_oidc.html\\\">About web identity federation</a>. If\\n      a tag with the same key name already exists, then that tag is overwritten with the new\\n      value.</p>\\n         <p>A tag consists of a key name and an associated value. By assigning tags to your\\n      resources, you can do the following:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <b>Administrative grouping and discovery</b> - Attach\\n          tags to resources to aid in organization and search. For example, you could search for all\\n          resources with the key name <i>Project</i> and the value\\n            <i>MyImportantProject</i>. Or search for all resources with the key name\\n            <i>Cost Center</i> and the value <i>41200</i>. </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>Access control</b> - Include tags in IAM identity-based\\n          and resource-based policies. You can use tags to restrict access to only an OIDC provider\\n          that has a specified tag attached. For examples of policies that show how to use tags to\\n          control access, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_tags.html\\\">Control access using IAM tags</a> in the\\n          <i>IAM User Guide</i>.</p>\\n            </li>\\n         </ul>\\n         <note>\\n            <ul>\\n               <li>\\n                  <p>If any one of the tags is invalid or if you exceed the allowed maximum number of tags, then the entire request \\n   fails and the resource is not created. For more information about tagging, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_tags.html\\\">Tagging IAM resources</a> in the\\n      <i>IAM User Guide</i>.</p>\\n               </li>\\n               <li>\\n                  <p>Amazon Web Services always interprets the tag <code>Value</code> as a single string. If you\\n            need to store an array, you can store comma-separated values in the string. However, you\\n            must interpret the value in your code.</p>\\n               </li>\\n            </ul>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.iam#TagOpenIDConnectProviderRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"OpenIDConnectProviderArn\": {\n                    \"target\": \"com.amazonaws.iam#arnType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the OIDC identity provider in IAM to which you want to add tags.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.iam#tagListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The list of tags that you want to attach to the OIDC identity provider in IAM.\\n      Each tag consists of a key name and an associated value.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#TagPolicy\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#TagPolicyRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#ConcurrentModificationException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#InvalidInputException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Adds one or more tags to an IAM customer managed policy. If a tag with the same key\\n      name already exists, then that tag is overwritten with the new value.</p>\\n         <p>A tag consists of a key name and an associated value. By assigning tags to your\\n      resources, you can do the following:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <b>Administrative grouping and discovery</b> - Attach\\n          tags to resources to aid in organization and search. For example, you could search for all\\n          resources with the key name <i>Project</i> and the value\\n            <i>MyImportantProject</i>. Or search for all resources with the key name\\n            <i>Cost Center</i> and the value <i>41200</i>. </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>Access control</b> - Include tags in IAM user-based\\n          and resource-based policies. You can use tags to restrict access to only an IAM customer\\n          managed policy that has a specified tag attached. For examples of policies that show how\\n          to use tags to control access, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_tags.html\\\">Control access using IAM tags</a> in the\\n            <i>IAM User Guide</i>.</p>\\n            </li>\\n         </ul>\\n         <note>\\n            <ul>\\n               <li>\\n                  <p>If any one of the tags is invalid or if you exceed the allowed maximum number of tags, then the entire request \\n   fails and the resource is not created. For more information about tagging, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_tags.html\\\">Tagging IAM resources</a> in the\\n      <i>IAM User Guide</i>.</p>\\n               </li>\\n               <li>\\n                  <p>Amazon Web Services always interprets the tag <code>Value</code> as a single string. If you\\n            need to store an array, you can store comma-separated values in the string. However, you\\n            must interpret the value in your code.</p>\\n               </li>\\n            </ul>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.iam#TagPolicyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PolicyArn\": {\n                    \"target\": \"com.amazonaws.iam#arnType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the IAM customer managed policy to which you want to add tags.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.iam#tagListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The list of tags that you want to attach to the IAM customer managed policy.\\n      Each tag consists of a key name and an associated value.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#TagRole\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#TagRoleRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#ConcurrentModificationException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#InvalidInputException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Adds one or more tags to an IAM role. The role can be a regular role or a\\n      service-linked role. If a tag with the same key name already exists, then that tag is\\n      overwritten with the new value.</p>\\n         <p>A tag consists of a key name and an associated value. By assigning tags to your\\n      resources, you can do the following:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <b>Administrative grouping and discovery</b> - Attach\\n          tags to resources to aid in organization and search. For example, you could search for all\\n          resources with the key name <i>Project</i> and the value\\n            <i>MyImportantProject</i>. Or search for all resources with the key name\\n            <i>Cost Center</i> and the value <i>41200</i>. </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>Access control</b> - Include tags in IAM user-based\\n          and resource-based policies. You can use tags to restrict access to only an IAM role\\n          that has a specified tag attached. You can also restrict access to only those resources\\n          that have a certain tag attached. For examples of policies that show how to use tags to\\n          control access, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_tags.html\\\">Control access using IAM tags</a> in the\\n          <i>IAM User Guide</i>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>Cost allocation</b> - Use tags to help track which\\n          individuals and teams are using which Amazon Web Services resources.</p>\\n            </li>\\n         </ul>\\n         <note>\\n            <ul>\\n               <li>\\n                  <p>If any one of the tags is invalid or if you exceed the allowed maximum number of tags, then the entire request \\n   fails and the resource is not created. For more information about tagging, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_tags.html\\\">Tagging IAM resources</a> in the\\n      <i>IAM User Guide</i>.</p>\\n               </li>\\n               <li>\\n                  <p>Amazon Web Services always interprets the tag <code>Value</code> as a single string. If you\\n            need to store an array, you can store comma-separated values in the string. However, you\\n            must interpret the value in your code.</p>\\n               </li>\\n            </ul>\\n         </note>\\n         <p>For more information about tagging, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_tags.html\\\">Tagging IAM identities</a> in the\\n        <i>IAM User Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To add a tag key and value to an IAM role\",\n                        \"documentation\": \"The following example shows how to add tags to an existing role.\",\n                        \"input\": {\n                            \"RoleName\": \"taggedrole\",\n                            \"Tags\": [\n                                {\n                                    \"Key\": \"Dept\",\n                                    \"Value\": \"Accounting\"\n                                },\n                                {\n                                    \"Key\": \"CostCenter\",\n                                    \"Value\": \"12345\"\n                                }\n                            ]\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.iam#TagRoleRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RoleName\": {\n                    \"target\": \"com.amazonaws.iam#roleNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the IAM role to which you want to add tags.</p>\\n         <p>This parameter accepts (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters that consist of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.iam#tagListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The list of tags that you want to attach to the IAM role. Each tag consists of a key name and an associated value.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#TagSAMLProvider\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#TagSAMLProviderRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#ConcurrentModificationException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#InvalidInputException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Adds one or more tags to a Security Assertion Markup Language (SAML) identity provider.\\n      For more information about these providers, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_saml.html\\\">About SAML 2.0-based federation </a>.\\n      If a tag with the same key name already exists, then that tag is overwritten with the new\\n      value.</p>\\n         <p>A tag consists of a key name and an associated value. By assigning tags to your\\n      resources, you can do the following:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <b>Administrative grouping and discovery</b> - Attach\\n          tags to resources to aid in organization and search. For example, you could search for all\\n          resources with the key name <i>Project</i> and the value\\n            <i>MyImportantProject</i>. Or search for all resources with the key name\\n            <i>Cost Center</i> and the value <i>41200</i>. </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>Access control</b> - Include tags in IAM user-based\\n          and resource-based policies. You can use tags to restrict access to only a SAML identity\\n          provider that has a specified tag attached. For examples of policies that show how to use\\n          tags to control access, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_tags.html\\\">Control access using IAM tags</a> in the\\n            <i>IAM User Guide</i>.</p>\\n            </li>\\n         </ul>\\n         <note>\\n            <ul>\\n               <li>\\n                  <p>If any one of the tags is invalid or if you exceed the allowed maximum number of tags, then the entire request \\n   fails and the resource is not created. For more information about tagging, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_tags.html\\\">Tagging IAM resources</a> in the\\n      <i>IAM User Guide</i>.</p>\\n               </li>\\n               <li>\\n                  <p>Amazon Web Services always interprets the tag <code>Value</code> as a single string. If you\\n            need to store an array, you can store comma-separated values in the string. However, you\\n            must interpret the value in your code.</p>\\n               </li>\\n            </ul>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.iam#TagSAMLProviderRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SAMLProviderArn\": {\n                    \"target\": \"com.amazonaws.iam#arnType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the SAML identity provider in IAM to which you want to add tags.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.iam#tagListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The list of tags that you want to attach to the SAML identity provider in IAM.\\n      Each tag consists of a key name and an associated value.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#TagServerCertificate\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#TagServerCertificateRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#ConcurrentModificationException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#InvalidInputException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Adds one or more tags to an IAM server certificate. If a tag with the same key name\\n      already exists, then that tag is overwritten with the new value.</p>\\n         <note>\\n            <p>For certificates in a Region supported by Certificate Manager (ACM), we\\n        recommend that you don't use IAM server certificates. Instead, use ACM to provision,\\n        manage, and deploy your server certificates. For more information about IAM server\\n        certificates, <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_server-certs.html\\\">Working with server\\n          certificates</a> in the <i>IAM User Guide</i>.</p>\\n         </note>\\n         <p>A tag consists of a key name and an associated value. By assigning tags to your\\n      resources, you can do the following:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <b>Administrative grouping and discovery</b> - Attach\\n          tags to resources to aid in organization and search. For example, you could search for all\\n          resources with the key name <i>Project</i> and the value\\n            <i>MyImportantProject</i>. Or search for all resources with the key name\\n            <i>Cost Center</i> and the value <i>41200</i>. </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>Access control</b> - Include tags in IAM user-based\\n          and resource-based policies. You can use tags to restrict access to only a server\\n          certificate that has a specified tag attached. For examples of policies that show how to\\n          use tags to control access, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_tags.html\\\">Control access using IAM tags</a> in the\\n            <i>IAM User Guide</i>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>Cost allocation</b> - Use tags to help track which\\n          individuals and teams are using which Amazon Web Services resources.</p>\\n            </li>\\n         </ul>\\n         <note>\\n            <ul>\\n               <li>\\n                  <p>If any one of the tags is invalid or if you exceed the allowed maximum number of tags, then the entire request \\n   fails and the resource is not created. For more information about tagging, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_tags.html\\\">Tagging IAM resources</a> in the\\n      <i>IAM User Guide</i>.</p>\\n               </li>\\n               <li>\\n                  <p>Amazon Web Services always interprets the tag <code>Value</code> as a single string. If you\\n            need to store an array, you can store comma-separated values in the string. However, you\\n            must interpret the value in your code.</p>\\n               </li>\\n            </ul>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.iam#TagServerCertificateRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ServerCertificateName\": {\n                    \"target\": \"com.amazonaws.iam#serverCertificateNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the IAM server certificate to which you want to add tags.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.iam#tagListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The list of tags that you want to attach to the IAM server certificate.\\n      Each tag consists of a key name and an associated value.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#TagUser\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#TagUserRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#ConcurrentModificationException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#InvalidInputException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Adds one or more tags to an IAM user. If a tag with the same key name already exists,\\n      then that tag is overwritten with the new value.</p>\\n         <p>A tag consists of a key name and an associated value. By assigning tags to your\\n      resources, you can do the following:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <b>Administrative grouping and discovery</b> - Attach\\n          tags to resources to aid in organization and search. For example, you could search for all\\n          resources with the key name <i>Project</i> and the value\\n            <i>MyImportantProject</i>. Or search for all resources with the key name\\n            <i>Cost Center</i> and the value <i>41200</i>. </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>Access control</b> - Include tags in IAM identity-based\\n          and resource-based policies. You can use tags to restrict access to only an IAM\\n          requesting user that has a specified tag attached. You can also restrict access to only\\n          those resources that have a certain tag attached. For examples of policies that show how\\n          to use tags to control access, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_tags.html\\\">Control access using IAM tags</a> in the\\n            <i>IAM User Guide</i>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>Cost allocation</b> - Use tags to help track which\\n          individuals and teams are using which Amazon Web Services resources.</p>\\n            </li>\\n         </ul>\\n         <note>\\n            <ul>\\n               <li>\\n                  <p>If any one of the tags is invalid or if you exceed the allowed maximum number of tags, then the entire request \\n   fails and the resource is not created. For more information about tagging, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_tags.html\\\">Tagging IAM resources</a> in the\\n      <i>IAM User Guide</i>.</p>\\n               </li>\\n               <li>\\n                  <p>Amazon Web Services always interprets the tag <code>Value</code> as a single string. If you\\n            need to store an array, you can store comma-separated values in the string. However, you\\n            must interpret the value in your code.</p>\\n               </li>\\n            </ul>\\n         </note>\\n         <p>For more information about tagging, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_tags.html\\\">Tagging IAM identities</a> in the\\n        <i>IAM User Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To add a tag key and value to an IAM user\",\n                        \"documentation\": \"The following example shows how to add tags to an existing user.\",\n                        \"input\": {\n                            \"UserName\": \"anika\",\n                            \"Tags\": [\n                                {\n                                    \"Key\": \"Dept\",\n                                    \"Value\": \"Accounting\"\n                                },\n                                {\n                                    \"Key\": \"CostCenter\",\n                                    \"Value\": \"12345\"\n                                }\n                            ]\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.iam#TagUserRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"UserName\": {\n                    \"target\": \"com.amazonaws.iam#existingUserNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the IAM user to which you want to add tags.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.iam#tagListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The list of tags that you want to attach to the IAM user. Each tag consists of a key name and an associated value.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#TrackedActionLastAccessed\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ActionName\": {\n                    \"target\": \"com.amazonaws.iam#stringType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the tracked action to which access was attempted. Tracked actions are\\n         actions that report activity to IAM.</p>\"\n                    }\n                },\n                \"LastAccessedEntity\": {\n                    \"target\": \"com.amazonaws.iam#arnType\"\n                },\n                \"LastAccessedTime\": {\n                    \"target\": \"com.amazonaws.iam#dateType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time, in <a href=\\\"http://www.iso.org/iso/iso8601\\\">ISO 8601 date-time\\n            format</a>, when an authenticated entity most recently attempted to access the\\n         tracked service. Amazon Web Services does not report unauthenticated requests.</p>\\n         <p>This field is null if no IAM entities attempted to access the service within the\\n            <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_access-advisor.html#service-last-accessed-reporting-period\\\">tracking period</a>.</p>\"\n                    }\n                },\n                \"LastAccessedRegion\": {\n                    \"target\": \"com.amazonaws.iam#stringType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Region from which the authenticated entity (user or role) last attempted to access\\n         the tracked action. Amazon Web Services does not report unauthenticated requests.</p>\\n         <p>This field is null if no IAM entities attempted to access the service within the\\n            <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_access-advisor.html#service-last-accessed-reporting-period\\\">tracking period</a>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains details about the most recent attempt to access an action within the\\n         service.</p>\\n         <p>This data type is used as a response element in the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetServiceLastAccessedDetails.html\\\">GetServiceLastAccessedDetails</a> operation.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#TrackedActionsLastAccessed\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.iam#TrackedActionLastAccessed\"\n            }\n        },\n        \"com.amazonaws.iam#UnmodifiableEntityException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.iam#unmodifiableEntityMessage\"\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"UnmodifiableEntity\",\n                    \"httpResponseCode\": 400\n                },\n                \"smithy.api#documentation\": \"<p>The request was rejected because service-linked roles are protected Amazon Web Services resources. Only\\n      the service that depends on the service-linked role can modify or delete the role on your\\n      behalf. The error message includes the name of the service that depends on this service-linked\\n      role. You must request the change through that service.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.iam#UnrecognizedPublicKeyEncodingException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.iam#unrecognizedPublicKeyEncodingMessage\"\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"UnrecognizedPublicKeyEncoding\",\n                    \"httpResponseCode\": 400\n                },\n                \"smithy.api#documentation\": \"<p>The request was rejected because the public key encoding format is unsupported or\\n      unrecognized.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.iam#UntagInstanceProfile\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#UntagInstanceProfileRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#ConcurrentModificationException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#InvalidInputException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Removes the specified tags from the IAM instance profile. For more information about tagging, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_tags.html\\\">Tagging IAM resources</a> in the\\n      <i>IAM User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#UntagInstanceProfileRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InstanceProfileName\": {\n                    \"target\": \"com.amazonaws.iam#instanceProfileNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the IAM instance profile from which you want to remove tags.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TagKeys\": {\n                    \"target\": \"com.amazonaws.iam#tagKeyListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of key names as a simple array of strings. The tags with matching keys are\\n      removed from the specified instance profile.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#UntagMFADevice\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#UntagMFADeviceRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#ConcurrentModificationException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#InvalidInputException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Removes the specified tags from the IAM virtual multi-factor authentication (MFA)\\n      device. For more information about tagging, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_tags.html\\\">Tagging IAM resources</a> in the\\n      <i>IAM User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#UntagMFADeviceRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SerialNumber\": {\n                    \"target\": \"com.amazonaws.iam#serialNumberType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The unique identifier for the IAM virtual MFA device from which you want to remove\\n      tags. For virtual MFA devices, the serial number is the same as the ARN.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TagKeys\": {\n                    \"target\": \"com.amazonaws.iam#tagKeyListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of key names as a simple array of strings. The tags with matching keys are\\n      removed from the specified instance profile.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#UntagOpenIDConnectProvider\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#UntagOpenIDConnectProviderRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#ConcurrentModificationException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#InvalidInputException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Removes the specified tags from the specified OpenID Connect (OIDC)-compatible identity\\n      provider in IAM. For more information about OIDC providers, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_oidc.html\\\">About web identity federation</a>.\\n      For more information about tagging, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_tags.html\\\">Tagging IAM resources</a> in the\\n      <i>IAM User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#UntagOpenIDConnectProviderRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"OpenIDConnectProviderArn\": {\n                    \"target\": \"com.amazonaws.iam#arnType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the OIDC provider in IAM from which you want to remove tags.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TagKeys\": {\n                    \"target\": \"com.amazonaws.iam#tagKeyListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of key names as a simple array of strings. The tags with matching keys are\\n      removed from the specified OIDC provider.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#UntagPolicy\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#UntagPolicyRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#ConcurrentModificationException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#InvalidInputException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Removes the specified tags from the customer managed policy. For more information about tagging, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_tags.html\\\">Tagging IAM resources</a> in the\\n      <i>IAM User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#UntagPolicyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PolicyArn\": {\n                    \"target\": \"com.amazonaws.iam#arnType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the IAM customer managed policy from which you want to remove\\n      tags.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TagKeys\": {\n                    \"target\": \"com.amazonaws.iam#tagKeyListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of key names as a simple array of strings. The tags with matching keys are\\n      removed from the specified policy.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#UntagRole\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#UntagRoleRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#ConcurrentModificationException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Removes the specified tags from the role. For more information about tagging, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_tags.html\\\">Tagging IAM resources</a> in the\\n      <i>IAM User Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To remove a tag from an IAM role\",\n                        \"documentation\": \"The following example shows how to remove a tag with the key 'Dept' from a role named 'taggedrole'.\",\n                        \"input\": {\n                            \"RoleName\": \"taggedrole\",\n                            \"TagKeys\": [\n                                \"Dept\"\n                            ]\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.iam#UntagRoleRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RoleName\": {\n                    \"target\": \"com.amazonaws.iam#roleNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the IAM role from which you want to remove tags.</p>\\n         <p>This parameter accepts (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters that consist of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TagKeys\": {\n                    \"target\": \"com.amazonaws.iam#tagKeyListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of key names as a simple array of strings. The tags with matching keys are\\n      removed from the specified role.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#UntagSAMLProvider\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#UntagSAMLProviderRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#ConcurrentModificationException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#InvalidInputException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Removes the specified tags from the specified Security Assertion Markup Language (SAML)\\n      identity provider in IAM. For more information about these providers, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_oidc.html\\\">About web identity\\n        federation</a>. For more information about tagging, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_tags.html\\\">Tagging IAM resources</a> in the\\n      <i>IAM User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#UntagSAMLProviderRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SAMLProviderArn\": {\n                    \"target\": \"com.amazonaws.iam#arnType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the SAML identity provider in IAM from which you want to remove\\n      tags.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TagKeys\": {\n                    \"target\": \"com.amazonaws.iam#tagKeyListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of key names as a simple array of strings. The tags with matching keys are\\n      removed from the specified SAML identity provider.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#UntagServerCertificate\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#UntagServerCertificateRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#ConcurrentModificationException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#InvalidInputException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Removes the specified tags from the IAM server certificate.\\n      For more information about tagging, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_tags.html\\\">Tagging IAM resources</a> in the\\n      <i>IAM User Guide</i>.</p>\\n         <note>\\n            <p>For certificates in a Region supported by Certificate Manager (ACM), we\\n        recommend that you don't use IAM server certificates. Instead, use ACM to provision,\\n        manage, and deploy your server certificates. For more information about IAM server\\n        certificates, <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_server-certs.html\\\">Working with server\\n          certificates</a> in the <i>IAM User Guide</i>.</p>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.iam#UntagServerCertificateRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ServerCertificateName\": {\n                    \"target\": \"com.amazonaws.iam#serverCertificateNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the IAM server certificate from which you want to remove tags.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TagKeys\": {\n                    \"target\": \"com.amazonaws.iam#tagKeyListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of key names as a simple array of strings. The tags with matching keys are\\n      removed from the specified IAM server certificate.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#UntagUser\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#UntagUserRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#ConcurrentModificationException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Removes the specified tags from the user. For more information about tagging, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_tags.html\\\">Tagging IAM resources</a> in the\\n      <i>IAM User Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To remove a tag from an IAM user\",\n                        \"documentation\": \"The following example shows how to remove tags that are attached to a user named 'anika'.\",\n                        \"input\": {\n                            \"UserName\": \"anika\",\n                            \"TagKeys\": [\n                                \"Dept\"\n                            ]\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.iam#UntagUserRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"UserName\": {\n                    \"target\": \"com.amazonaws.iam#existingUserNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the IAM user from which you want to remove tags.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TagKeys\": {\n                    \"target\": \"com.amazonaws.iam#tagKeyListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of key names as a simple array of strings. The tags with matching keys are\\n      removed from the specified user.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#UpdateAccessKey\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#UpdateAccessKeyRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#InvalidInputException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Changes the status of the specified access key from Active to Inactive, or vice versa.\\n            This operation can be used to disable a user's key as part of a key rotation\\n            workflow.</p>\\n         <p>If the <code>UserName</code> is not specified, the user name is determined implicitly\\n            based on the Amazon Web Services access key ID used to sign the request. If a temporary access key is\\n            used, then <code>UserName</code> is required. If a long-term key is assigned to the\\n            user, then <code>UserName</code> is not required. This operation works for access keys\\n            under the Amazon Web Services account. Consequently, you can use this operation to manage Amazon Web Services account root user\\n            credentials even if the Amazon Web Services account has no associated users.</p>\\n         <p>For information about rotating keys, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/ManagingCredentials.html\\\">Managing keys and certificates</a>\\n            in the <i>IAM User Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To activate or deactivate an access key for an IAM user\",\n                        \"documentation\": \"The following command deactivates the specified access key (access key ID and secret access key) for the IAM user named Bob.\",\n                        \"input\": {\n                            \"UserName\": \"Bob\",\n                            \"Status\": \"Inactive\",\n                            \"AccessKeyId\": \"AKIAIOSFODNN7EXAMPLE\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.iam#UpdateAccessKeyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"UserName\": {\n                    \"target\": \"com.amazonaws.iam#existingUserNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the user whose key you want to update.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\"\n                    }\n                },\n                \"AccessKeyId\": {\n                    \"target\": \"com.amazonaws.iam#accessKeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The access key ID of the secret access key you want to update.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters that can \\n    consist of any upper or lowercased letter or digit.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Status\": {\n                    \"target\": \"com.amazonaws.iam#statusType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The status you want to assign to the secret access key. <code>Active</code> means\\n            that the key can be used for programmatic calls to Amazon Web Services, while <code>Inactive</code>\\n            means that the key cannot be used.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#UpdateAccountPasswordPolicy\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#UpdateAccountPasswordPolicyRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#MalformedPolicyDocumentException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Updates the password policy settings for the Amazon Web Services account.</p>\\n         <note>\\n            <p>This operation does not support partial updates. No parameters are required, but\\n                if you do not specify a parameter, that parameter's value reverts to its default\\n                value. See the <b>Request Parameters</b> section for each\\n                parameter's default value. Also note that some parameters do not allow the default\\n                parameter to be explicitly set. Instead, to invoke the default value, do not include\\n                that parameter when you invoke the operation.</p>\\n         </note>\\n         <p> For more information about using a password policy, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/Using_ManagingPasswordPolicies.html\\\">Managing an IAM password\\n                policy</a> in the <i>IAM User Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To set or change the current account password policy\",\n                        \"documentation\": \"The following command sets the password policy to require a minimum length of eight characters and to require one or more numbers in the password:\",\n                        \"input\": {\n                            \"MinimumPasswordLength\": 8,\n                            \"RequireNumbers\": true\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.iam#UpdateAccountPasswordPolicyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"MinimumPasswordLength\": {\n                    \"target\": \"com.amazonaws.iam#minimumPasswordLengthType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The minimum number of characters allowed in an IAM user password.</p>\\n         <p>If you do not specify a value for this parameter, then the operation uses the default\\n            value of <code>6</code>.</p>\"\n                    }\n                },\n                \"RequireSymbols\": {\n                    \"target\": \"com.amazonaws.iam#booleanType\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Specifies whether IAM user passwords must contain at least one of the following\\n            non-alphanumeric characters:</p>\\n         <p>! @ # $ % ^ & * ( ) _ + - = [ ] { } | '</p>\\n         <p>If you do not specify a value for this parameter, then the operation uses the default\\n            value of <code>false</code>. The result is that passwords do not require at least one\\n            symbol character.</p>\"\n                    }\n                },\n                \"RequireNumbers\": {\n                    \"target\": \"com.amazonaws.iam#booleanType\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Specifies whether IAM user passwords must contain at least one numeric character (0\\n            to 9).</p>\\n         <p>If you do not specify a value for this parameter, then the operation uses the default\\n            value of <code>false</code>. The result is that passwords do not require at least one\\n            numeric character.</p>\"\n                    }\n                },\n                \"RequireUppercaseCharacters\": {\n                    \"target\": \"com.amazonaws.iam#booleanType\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Specifies whether IAM user passwords must contain at least one uppercase character\\n            from the ISO basic Latin alphabet (A to Z).</p>\\n         <p>If you do not specify a value for this parameter, then the operation uses the default\\n            value of <code>false</code>. The result is that passwords do not require at least one\\n            uppercase character.</p>\"\n                    }\n                },\n                \"RequireLowercaseCharacters\": {\n                    \"target\": \"com.amazonaws.iam#booleanType\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Specifies whether IAM user passwords must contain at least one lowercase character\\n            from the ISO basic Latin alphabet (a to z).</p>\\n         <p>If you do not specify a value for this parameter, then the operation uses the default\\n            value of <code>false</code>. The result is that passwords do not require at least one\\n            lowercase character.</p>\"\n                    }\n                },\n                \"AllowUsersToChangePassword\": {\n                    \"target\": \"com.amazonaws.iam#booleanType\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p> Allows all IAM users in your account to use the Amazon Web Services Management Console to change their own\\n            passwords. For more information, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_passwords_enable-user-change.html\\\">Permitting\\n                IAM users to change their own passwords</a> in the\\n                <i>IAM User Guide</i>.</p>\\n         <p>If you do not specify a value for this parameter, then the operation uses the default\\n            value of <code>false</code>. The result is that IAM users in the account do not\\n            automatically have permissions to change their own password.</p>\"\n                    }\n                },\n                \"MaxPasswordAge\": {\n                    \"target\": \"com.amazonaws.iam#maxPasswordAgeType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of days that an IAM user password is valid.</p>\\n         <p>If you do not specify a value for this parameter, then the operation uses the default\\n            value of <code>0</code>. The result is that IAM user passwords never expire.</p>\"\n                    }\n                },\n                \"PasswordReusePrevention\": {\n                    \"target\": \"com.amazonaws.iam#passwordReusePreventionType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the number of previous passwords that IAM users are prevented from\\n            reusing.</p>\\n         <p>If you do not specify a value for this parameter, then the operation uses the default\\n            value of <code>0</code>. The result is that IAM users are not prevented from reusing\\n            previous passwords.</p>\"\n                    }\n                },\n                \"HardExpiry\": {\n                    \"target\": \"com.amazonaws.iam#booleanObjectType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> Prevents IAM users who are accessing the account via the Amazon Web Services Management Console from setting a\\n            new console password after their password has expired. The IAM user cannot access the\\n            console until an administrator resets the password.</p>\\n         <p>If you do not specify a value for this parameter, then the operation uses the default\\n            value of <code>false</code>. The result is that IAM users can change their passwords\\n            after they expire and continue to sign in as the user.</p>\\n         <note>\\n            <p> In the Amazon Web Services Management Console, the custom password policy option <b>Allow\\n                    users to change their own password</b> gives IAM users permissions to\\n                    <code>iam:ChangePassword</code> for only their user and to the\\n                    <code>iam:GetAccountPasswordPolicy</code> action. This option does not attach a\\n                permissions policy to each user, rather the permissions are applied at the\\n                account-level for all users by IAM. IAM users with\\n                    <code>iam:ChangePassword</code> permission and active access keys can reset\\n                their own expired console password using the CLI or API.</p>\\n         </note>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#UpdateAssumeRolePolicy\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#UpdateAssumeRolePolicyRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#MalformedPolicyDocumentException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#UnmodifiableEntityException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Updates the policy that grants an IAM entity permission to assume a role. This is\\n            typically referred to as the \\\"role trust policy\\\". For more information about roles, see\\n                <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/roles-toplevel.html\\\">Using roles to\\n                delegate permissions and federate identities</a>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To update the trust policy for an IAM role\",\n                        \"documentation\": \"The following command updates the role trust policy for the role named Test-Role:\",\n                        \"input\": {\n                            \"PolicyDocument\": \"{\\\"Version\\\":\\\"2012-10-17\\\",\\\"Statement\\\":[{\\\"Effect\\\":\\\"Allow\\\",\\\"Principal\\\":{\\\"Service\\\":[\\\"ec2.amazonaws.com\\\"]},\\\"Action\\\":[\\\"sts:AssumeRole\\\"]}]}\",\n                            \"RoleName\": \"S3AccessForEC2Instances\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.iam#UpdateAssumeRolePolicyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RoleName\": {\n                    \"target\": \"com.amazonaws.iam#roleNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the role to update with the new policy.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"PolicyDocument\": {\n                    \"target\": \"com.amazonaws.iam#policyDocumentType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The policy that grants an entity permission to assume the role.</p>\\n         <p>You must provide policies in JSON format in IAM. However, for CloudFormation\\n            templates formatted in YAML, you can provide the policy in JSON or YAML format. CloudFormation always converts a YAML policy to JSON format before submitting it to\\n            IAM.</p>\\n         <p>The <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a> \\n    used to validate this parameter is a string of characters consisting of the following:</p>\\n         <ul>\\n            <li>\\n               <p>Any printable ASCII \\n    character ranging from the space character (<code>\\\\u0020</code>) through the end of the ASCII character range</p>\\n            </li>\\n            <li>\\n               <p>The printable characters in the Basic Latin and  Latin-1 Supplement character set \\n    (through <code>\\\\u00FF</code>)</p>\\n            </li>\\n            <li>\\n               <p>The special characters tab (<code>\\\\u0009</code>), line feed (<code>\\\\u000A</code>), and \\n    carriage return (<code>\\\\u000D</code>)</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#UpdateGroup\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#UpdateGroupRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#EntityAlreadyExistsException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Updates the name and/or the path of the specified IAM group.</p>\\n         <important>\\n            <p> You should understand the implications of changing a group's path or name. For\\n                more information, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/Using_WorkingWithGroupsAndUsers.html\\\">Renaming users and\\n                    groups</a> in the <i>IAM User Guide</i>.</p>\\n         </important>\\n         <note>\\n            <p>The person making the request (the principal), must have permission to change the\\n                role group with the old name and the new name. For example, to change the group\\n                named <code>Managers</code> to <code>MGRs</code>, the principal must have a policy\\n                that allows them to update both groups. If the principal has permission to update\\n                the <code>Managers</code> group, but not the <code>MGRs</code> group, then the\\n                update fails. For more information about permissions, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access.html\\\">Access management</a>.\\n            </p>\\n         </note>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To rename an IAM group\",\n                        \"documentation\": \"The following command changes the name of the IAM group Test to Test-1.\",\n                        \"input\": {\n                            \"GroupName\": \"Test\",\n                            \"NewGroupName\": \"Test-1\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.iam#UpdateGroupRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"GroupName\": {\n                    \"target\": \"com.amazonaws.iam#groupNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Name of the IAM group to update. If you're changing the name of the group, this is\\n            the original name.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"NewPath\": {\n                    \"target\": \"com.amazonaws.iam#pathType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>New path for the IAM group. Only include this if changing the group's path.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting \\n    of either a forward slash (/) by itself or a string that must begin and end with forward slashes.\\n    In addition, it can contain any ASCII character from the ! (<code>\\\\u0021</code>) through the DEL character (<code>\\\\u007F</code>), including \\n    most punctuation characters, digits, and upper and lowercased letters.</p>\"\n                    }\n                },\n                \"NewGroupName\": {\n                    \"target\": \"com.amazonaws.iam#groupNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>New name for the IAM group. Only include this if changing the group's name.</p>\\n         <p>IAM user, group, role, and policy names must be unique within the account. Names are\\n            not distinguished by case. For example, you cannot create resources named both\\n            \\\"MyResource\\\" and \\\"myresource\\\".</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#UpdateLoginProfile\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#UpdateLoginProfileRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#EntityTemporarilyUnmodifiableException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#PasswordPolicyViolationException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Changes the password for the specified IAM user. You can use the CLI, the Amazon Web Services\\n            API, or the <b>Users</b> page in the IAM console to change\\n            the password for any IAM user. Use <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_ChangePassword.html\\\">ChangePassword</a> to\\n            change your own password in the <b>My Security Credentials</b>\\n            page in the Amazon Web Services Management Console.</p>\\n         <p>For more information about modifying passwords, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/Using_ManagingLogins.html\\\">Managing passwords</a> in the\\n                <i>IAM User Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To change the password for an IAM user\",\n                        \"documentation\": \"The following command creates or changes the password for the IAM user named Bob.\",\n                        \"input\": {\n                            \"UserName\": \"Bob\",\n                            \"Password\": \"SomeKindOfPassword123!@#\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.iam#UpdateLoginProfileRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"UserName\": {\n                    \"target\": \"com.amazonaws.iam#userNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the user whose password you want to update.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Password\": {\n                    \"target\": \"com.amazonaws.iam#passwordType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The new password for the specified IAM user.</p>\\n         <p>The <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a> \\n    used to validate this parameter is a string of characters consisting of the following:</p>\\n         <ul>\\n            <li>\\n               <p>Any printable ASCII \\n    character ranging from the space character (<code>\\\\u0020</code>) through the end of the ASCII character range</p>\\n            </li>\\n            <li>\\n               <p>The printable characters in the Basic Latin and  Latin-1 Supplement character set \\n    (through <code>\\\\u00FF</code>)</p>\\n            </li>\\n            <li>\\n               <p>The special characters tab (<code>\\\\u0009</code>), line feed (<code>\\\\u000A</code>), and \\n    carriage return (<code>\\\\u000D</code>)</p>\\n            </li>\\n         </ul>\\n         <p>However, the format can be further restricted by the account administrator by setting\\n            a password policy on the Amazon Web Services account. For more information, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_UpdateAccountPasswordPolicy.html\\\">UpdateAccountPasswordPolicy</a>.</p>\"\n                    }\n                },\n                \"PasswordResetRequired\": {\n                    \"target\": \"com.amazonaws.iam#booleanObjectType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Allows this new password to be used only once by requiring the specified IAM user to\\n            set a new password on next sign-in.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#UpdateOpenIDConnectProviderThumbprint\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#UpdateOpenIDConnectProviderThumbprintRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#InvalidInputException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Replaces the existing list of server certificate thumbprints associated with an OpenID\\n            Connect (OIDC) provider resource object with a new list of thumbprints.</p>\\n         <p>The list that you pass with this operation completely replaces the existing list of\\n            thumbprints. (The lists are not merged.)</p>\\n         <p>Typically, you need to update a thumbprint only when the identity provider certificate\\n            changes, which occurs rarely. However, if the provider's certificate\\n                <i>does</i> change, any attempt to assume an IAM role that specifies\\n            the OIDC provider as a principal fails until the certificate thumbprint is\\n            updated.</p>\\n         <note>\\n            <p>Amazon Web Services secures communication with OIDC identity providers (IdPs) using our library of\\n            trusted root certificate authorities (CAs) to verify the JSON Web Key Set (JWKS)\\n            endpoint's TLS certificate. If your OIDC IdP relies on a certificate that is not signed\\n            by one of these trusted CAs, only then we secure communication using the thumbprints set\\n            in the IdP's configuration.</p>\\n         </note>\\n         <note>\\n            <p>Trust for the OIDC provider is derived from the provider certificate and is\\n                validated by the thumbprint. Therefore, it is best to limit access to the\\n                    <code>UpdateOpenIDConnectProviderThumbprint</code> operation to highly\\n                privileged users.</p>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.iam#UpdateOpenIDConnectProviderThumbprintRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"OpenIDConnectProviderArn\": {\n                    \"target\": \"com.amazonaws.iam#arnType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the IAM OIDC provider resource object for which\\n            you want to update the thumbprint. You can get a list of OIDC provider ARNs by using the\\n                <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListOpenIDConnectProviders.html\\\">ListOpenIDConnectProviders</a> operation.</p>\\n         <p>For more information about ARNs, see <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html\\\">Amazon Resource Names (ARNs)</a> in the <i>Amazon Web Services General Reference</i>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ThumbprintList\": {\n                    \"target\": \"com.amazonaws.iam#thumbprintListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of certificate thumbprints that are associated with the specified IAM OpenID\\n            Connect provider. For more information, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateOpenIDConnectProvider.html\\\">CreateOpenIDConnectProvider</a>. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#UpdateRole\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#UpdateRoleRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#UpdateRoleResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#UnmodifiableEntityException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Updates the description or maximum session duration setting of a role.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#UpdateRoleDescription\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#UpdateRoleDescriptionRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#UpdateRoleDescriptionResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#UnmodifiableEntityException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Use <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_UpdateRole.html\\\">UpdateRole</a> instead.</p>\\n         <p>Modifies only the description of a role. This operation performs the same function as\\n            the <code>Description</code> parameter in the <code>UpdateRole</code> operation.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#UpdateRoleDescriptionRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RoleName\": {\n                    \"target\": \"com.amazonaws.iam#roleNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the role that you want to modify.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.iam#roleDescriptionType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The new description that you want to apply to the specified role.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#UpdateRoleDescriptionResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Role\": {\n                    \"target\": \"com.amazonaws.iam#Role\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A structure that contains details about the modified role.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#UpdateRoleRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RoleName\": {\n                    \"target\": \"com.amazonaws.iam#roleNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the role that you want to modify.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.iam#roleDescriptionType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The new description that you want to apply to the specified role.</p>\"\n                    }\n                },\n                \"MaxSessionDuration\": {\n                    \"target\": \"com.amazonaws.iam#roleMaxSessionDurationType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum session duration (in seconds) that you want to set for the specified role.\\n            If you do not specify a value for this setting, the default value of one hour is\\n            applied. This setting can have a value from 1 hour to 12 hours.</p>\\n         <p>Anyone who assumes the role from the CLI or API can use the\\n                <code>DurationSeconds</code> API parameter or the <code>duration-seconds</code>\\n            CLI parameter to request a longer session. The <code>MaxSessionDuration</code> setting\\n            determines the maximum duration that can be requested using the\\n                <code>DurationSeconds</code> parameter. If users don't specify a value for the\\n                <code>DurationSeconds</code> parameter, their security credentials are valid for one\\n            hour by default. This applies when you use the <code>AssumeRole*</code> API operations\\n            or the <code>assume-role*</code> CLI operations but does not apply when you use those\\n            operations to create a console URL. For more information, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html\\\">Using IAM\\n                roles</a> in the <i>IAM User Guide</i>.</p>\\n         <note>\\n            <p>IAM role credentials provided by Amazon EC2 instances assigned to the role are not\\n                subject to the specified maximum session duration.</p>\\n         </note>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#UpdateRoleResponse\": {\n            \"type\": \"structure\",\n            \"members\": {},\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#UpdateSAMLProvider\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#UpdateSAMLProviderRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#UpdateSAMLProviderResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#InvalidInputException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Updates the metadata document, SAML encryption settings, and private keys for an\\n            existing SAML provider. To rotate private keys, add your new private key and then remove\\n            the old key in a separate request.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#UpdateSAMLProviderRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SAMLMetadataDocument\": {\n                    \"target\": \"com.amazonaws.iam#SAMLMetadataDocumentType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An XML document generated by an identity provider (IdP) that supports SAML 2.0. The\\n            document includes the issuer's name, expiration information, and keys that can be used\\n            to validate the SAML authentication response (assertions) that are received from the\\n            IdP. You must generate the metadata document using the identity management software that\\n            is used as your IdP.</p>\"\n                    }\n                },\n                \"SAMLProviderArn\": {\n                    \"target\": \"com.amazonaws.iam#arnType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the SAML provider to update.</p>\\n         <p>For more information about ARNs, see <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html\\\">Amazon Resource Names (ARNs)</a> in the <i>Amazon Web Services General Reference</i>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"AssertionEncryptionMode\": {\n                    \"target\": \"com.amazonaws.iam#assertionEncryptionModeType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the encryption setting for the SAML provider.</p>\"\n                    }\n                },\n                \"AddPrivateKey\": {\n                    \"target\": \"com.amazonaws.iam#privateKeyType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the new private key from your external identity provider. The private key\\n            must be a .pem file that uses AES-GCM or AES-CBC encryption algorithm to decrypt SAML\\n            assertions.</p>\"\n                    }\n                },\n                \"RemovePrivateKey\": {\n                    \"target\": \"com.amazonaws.iam#privateKeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Key ID of the private key to remove.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#UpdateSAMLProviderResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SAMLProviderArn\": {\n                    \"target\": \"com.amazonaws.iam#arnType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the SAML provider that was updated.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the response to a successful <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_UpdateSAMLProvider.html\\\">UpdateSAMLProvider</a>\\n      request. </p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#UpdateSSHPublicKey\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#UpdateSSHPublicKeyRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#InvalidInputException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Sets the status of an IAM user's SSH public key to active or inactive. SSH public\\n            keys that are inactive cannot be used for authentication. This operation can be used to\\n            disable a user's SSH public key as part of a key rotation work flow.</p>\\n         <p>The SSH public key affected by this operation is used only for authenticating the\\n            associated IAM user to an CodeCommit repository. For more information about using SSH keys\\n            to authenticate to an CodeCommit repository, see <a href=\\\"https://docs.aws.amazon.com/codecommit/latest/userguide/setting-up-credentials-ssh.html\\\">Set up CodeCommit for\\n                SSH connections</a> in the <i>CodeCommit User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#UpdateSSHPublicKeyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"UserName\": {\n                    \"target\": \"com.amazonaws.iam#userNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the IAM user associated with the SSH public key.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"SSHPublicKeyId\": {\n                    \"target\": \"com.amazonaws.iam#publicKeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The unique identifier for the SSH public key.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters that can \\n    consist of any upper or lowercased letter or digit.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Status\": {\n                    \"target\": \"com.amazonaws.iam#statusType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The status to assign to the SSH public key. <code>Active</code> means that the key can\\n            be used for authentication with an CodeCommit repository. <code>Inactive</code> means that\\n            the key cannot be used.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#UpdateServerCertificate\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#UpdateServerCertificateRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#EntityAlreadyExistsException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Updates the name and/or the path of the specified server certificate stored in\\n            IAM.</p>\\n         <p>For more information about working with server certificates, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_server-certs.html\\\">Working\\n                with server certificates</a> in the <i>IAM User Guide</i>. This\\n            topic also includes a list of Amazon Web Services services that can use the server certificates that\\n            you manage with IAM.</p>\\n         <important>\\n            <p>You should understand the implications of changing a server certificate's path or\\n                name. For more information, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_server-certs_manage.html#RenamingServerCerts\\\">Renaming a server certificate</a> in the\\n                    <i>IAM User Guide</i>.</p>\\n         </important>\\n         <note>\\n            <p>The person making the request (the principal), must have permission to change the\\n                server certificate with the old name and the new name. For example, to change the\\n                certificate named <code>ProductionCert</code> to <code>ProdCert</code>, the\\n                principal must have a policy that allows them to update both certificates. If the\\n                principal has permission to update the <code>ProductionCert</code> group, but not\\n                the <code>ProdCert</code> certificate, then the update fails. For more information\\n                about permissions, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access.html\\\">Access management</a> in the <i>IAM User Guide</i>.</p>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.iam#UpdateServerCertificateRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ServerCertificateName\": {\n                    \"target\": \"com.amazonaws.iam#serverCertificateNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the server certificate that you want to update.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"NewPath\": {\n                    \"target\": \"com.amazonaws.iam#pathType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The new path for the server certificate. Include this only if you are updating the\\n            server certificate's path.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting \\n    of either a forward slash (/) by itself or a string that must begin and end with forward slashes.\\n    In addition, it can contain any ASCII character from the ! (<code>\\\\u0021</code>) through the DEL character (<code>\\\\u007F</code>), including \\n    most punctuation characters, digits, and upper and lowercased letters.</p>\"\n                    }\n                },\n                \"NewServerCertificateName\": {\n                    \"target\": \"com.amazonaws.iam#serverCertificateNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The new name for the server certificate. Include this only if you are updating the\\n            server certificate's name. The name of the certificate cannot contain any spaces.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#UpdateServiceSpecificCredential\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#UpdateServiceSpecificCredentialRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Sets the status of a service-specific credential to <code>Active</code> or\\n                <code>Inactive</code>. Service-specific credentials that are inactive cannot be used\\n            for authentication to the service. This operation can be used to disable a user's\\n            service-specific credential as part of a credential rotation work flow.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#UpdateServiceSpecificCredentialRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"UserName\": {\n                    \"target\": \"com.amazonaws.iam#userNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the IAM user associated with the service-specific credential. If you do\\n            not specify this value, then the operation assumes the user whose credentials are used\\n            to call the operation.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\"\n                    }\n                },\n                \"ServiceSpecificCredentialId\": {\n                    \"target\": \"com.amazonaws.iam#serviceSpecificCredentialId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The unique identifier of the service-specific credential.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters that can \\n    consist of any upper or lowercased letter or digit.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Status\": {\n                    \"target\": \"com.amazonaws.iam#statusType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The status to be assigned to the service-specific credential.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#UpdateSigningCertificate\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#UpdateSigningCertificateRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#InvalidInputException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Changes the status of the specified user signing certificate from active to disabled,\\n            or vice versa. This operation can be used to disable an IAM user's signing\\n            certificate as part of a certificate rotation work flow.</p>\\n         <p>If the <code>UserName</code> field is not specified, the user name is determined\\n            implicitly based on the Amazon Web Services access key ID used to sign the request. This operation\\n            works for access keys under the Amazon Web Services account. Consequently, you can use this operation\\n            to manage Amazon Web Services account root user credentials even if the Amazon Web Services account has no associated\\n            users.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To change the active status of a signing certificate for an IAM user\",\n                        \"documentation\": \"The following command changes the status of a signing certificate for a user named Bob to Inactive.\",\n                        \"input\": {\n                            \"UserName\": \"Bob\",\n                            \"CertificateId\": \"TA7SMP42TDN5Z26OBPJE7EXAMPLE\",\n                            \"Status\": \"Inactive\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.iam#UpdateSigningCertificateRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"UserName\": {\n                    \"target\": \"com.amazonaws.iam#existingUserNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the IAM user the signing certificate belongs to.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\"\n                    }\n                },\n                \"CertificateId\": {\n                    \"target\": \"com.amazonaws.iam#certificateIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the signing certificate you want to update.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters that can \\n    consist of any upper or lowercased letter or digit.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Status\": {\n                    \"target\": \"com.amazonaws.iam#statusType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The status you want to assign to the certificate. <code>Active</code> means that the\\n            certificate can be used for programmatic calls to Amazon Web Services <code>Inactive</code> means that\\n            the certificate cannot be used.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#UpdateUser\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#UpdateUserRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#ConcurrentModificationException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#EntityAlreadyExistsException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#EntityTemporarilyUnmodifiableException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Updates the name and/or the path of the specified IAM user.</p>\\n         <important>\\n            <p> You should understand the implications of changing an IAM user's path or\\n                name. For more information, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_manage.html#id_users_renaming\\\">Renaming an IAM\\n                    user</a> and <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_groups_manage_rename.html\\\">Renaming an IAM\\n                    group</a> in the <i>IAM User Guide</i>.</p>\\n         </important>\\n         <note>\\n            <p> To change a user name, the requester must have appropriate permissions on both\\n                the source object and the target object. For example, to change Bob to Robert, the\\n                entity making the request must have permission on Bob and Robert, or must have\\n                permission on all (*). For more information about permissions, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/PermissionsAndPolicies.html\\\">Permissions and policies</a>. </p>\\n         </note>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To change an IAM user's name\",\n                        \"documentation\": \"The following command changes the name of the IAM user Bob to Robert. It does not change the user's path.\",\n                        \"input\": {\n                            \"UserName\": \"Bob\",\n                            \"NewUserName\": \"Robert\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.iam#UpdateUserRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"UserName\": {\n                    \"target\": \"com.amazonaws.iam#existingUserNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Name of the user to update. If you're changing the name of the user, this is the\\n            original user name.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"NewPath\": {\n                    \"target\": \"com.amazonaws.iam#pathType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>New path for the IAM user. Include this parameter only if you're changing the user's\\n            path.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting \\n    of either a forward slash (/) by itself or a string that must begin and end with forward slashes.\\n    In addition, it can contain any ASCII character from the ! (<code>\\\\u0021</code>) through the DEL character (<code>\\\\u007F</code>), including \\n    most punctuation characters, digits, and upper and lowercased letters.</p>\"\n                    }\n                },\n                \"NewUserName\": {\n                    \"target\": \"com.amazonaws.iam#userNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>New name for the user. Include this parameter only if you're changing the user's\\n            name.</p>\\n         <p>IAM user, group, role, and policy names must be unique within the account. Names are\\n            not distinguished by case. For example, you cannot create resources named both\\n            \\\"MyResource\\\" and \\\"myresource\\\".</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#UploadSSHPublicKey\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#UploadSSHPublicKeyRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#UploadSSHPublicKeyResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#DuplicateSSHPublicKeyException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#InvalidPublicKeyException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#UnrecognizedPublicKeyEncodingException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Uploads an SSH public key and associates it with the specified IAM user.</p>\\n         <p>The SSH public key uploaded by this operation can be used only for authenticating the\\n            associated IAM user to an CodeCommit repository. For more information about using SSH keys\\n            to authenticate to an CodeCommit repository, see <a href=\\\"https://docs.aws.amazon.com/codecommit/latest/userguide/setting-up-credentials-ssh.html\\\">Set up CodeCommit for\\n                SSH connections</a> in the <i>CodeCommit User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#UploadSSHPublicKeyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"UserName\": {\n                    \"target\": \"com.amazonaws.iam#userNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the IAM user to associate the SSH public key with.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"SSHPublicKeyBody\": {\n                    \"target\": \"com.amazonaws.iam#publicKeyMaterialType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The SSH public key. The public key must be encoded in ssh-rsa format or PEM format.\\n            The minimum bit-length of the public key is 2048 bits. For example, you can generate a\\n            2048-bit key, and the resulting PEM file is 1679 bytes long.</p>\\n         <p>The <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a> \\n    used to validate this parameter is a string of characters consisting of the following:</p>\\n         <ul>\\n            <li>\\n               <p>Any printable ASCII \\n    character ranging from the space character (<code>\\\\u0020</code>) through the end of the ASCII character range</p>\\n            </li>\\n            <li>\\n               <p>The printable characters in the Basic Latin and  Latin-1 Supplement character set \\n    (through <code>\\\\u00FF</code>)</p>\\n            </li>\\n            <li>\\n               <p>The special characters tab (<code>\\\\u0009</code>), line feed (<code>\\\\u000A</code>), and \\n    carriage return (<code>\\\\u000D</code>)</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#UploadSSHPublicKeyResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SSHPublicKey\": {\n                    \"target\": \"com.amazonaws.iam#SSHPublicKey\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Contains information about the SSH public key.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the response to a successful <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_UploadSSHPublicKey.html\\\">UploadSSHPublicKey</a>\\n      request.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#UploadServerCertificate\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#UploadServerCertificateRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#UploadServerCertificateResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#ConcurrentModificationException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#EntityAlreadyExistsException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#InvalidInputException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#KeyPairMismatchException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#MalformedCertificateException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Uploads a server certificate entity for the Amazon Web Services account. The server certificate\\n            entity includes a public key certificate, a private key, and an optional certificate\\n            chain, which should all be PEM-encoded.</p>\\n         <p>We recommend that you use <a href=\\\"https://docs.aws.amazon.com/acm/\\\">Certificate Manager</a> to\\n            provision, manage, and deploy your server certificates. With ACM you can request a\\n            certificate, deploy it to Amazon Web Services resources, and let ACM handle certificate renewals for\\n            you. Certificates provided by ACM are free. For more information about using ACM,\\n            see the <a href=\\\"https://docs.aws.amazon.com/acm/latest/userguide/\\\">Certificate Manager User\\n                Guide</a>.</p>\\n         <p>For more information about working with server certificates, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_server-certs.html\\\">Working\\n                with server certificates</a> in the <i>IAM User Guide</i>. This\\n            topic includes a list of Amazon Web Services services that can use the server certificates that you\\n            manage with IAM.</p>\\n         <p>For information about the number of server certificates you can upload, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_iam-quotas.html\\\">IAM and STS\\n                quotas</a> in the <i>IAM User Guide</i>.</p>\\n         <note>\\n            <p>Because the body of the public key certificate, private key, and the certificate\\n                chain can be large, you should use POST rather than GET when calling\\n                    <code>UploadServerCertificate</code>. For information about setting up\\n                signatures and authorization through the API, see <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/signing_aws_api_requests.html\\\">Signing Amazon Web Services API\\n                    requests</a> in the <i>Amazon Web Services General Reference</i>. For general\\n                information about using the Query API with IAM, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/programming.html\\\">Calling the API by making HTTP query\\n                    requests</a> in the <i>IAM User Guide</i>.</p>\\n         </note>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To upload a server certificate to your AWS account\",\n                        \"documentation\": \"The following upload-server-certificate command uploads a server certificate to your AWS account:\",\n                        \"input\": {\n                            \"ServerCertificateName\": \"ProdServerCert\",\n                            \"Path\": \"/company/servercerts/\",\n                            \"CertificateBody\": \"-----BEGIN CERTIFICATE-----<a very long certificate text string>-----END CERTIFICATE-----\",\n                            \"PrivateKey\": \"-----BEGIN DSA PRIVATE KEY-----<a very long private key string>-----END DSA PRIVATE KEY-----\"\n                        },\n                        \"output\": {\n                            \"ServerCertificateMetadata\": {\n                                \"ServerCertificateName\": \"ProdServerCert\",\n                                \"Path\": \"/company/servercerts/\",\n                                \"Arn\": \"arn:aws:iam::123456789012:server-certificate/company/servercerts/ProdServerCert\",\n                                \"UploadDate\": \"2010-05-08T01:02:03.004Z\",\n                                \"ServerCertificateId\": \"ASCA1111111111EXAMPLE\",\n                                \"Expiration\": \"2012-05-08T01:02:03.004Z\"\n                            }\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.iam#UploadServerCertificateRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Path\": {\n                    \"target\": \"com.amazonaws.iam#pathType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The path for the server certificate. For more information about paths, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/Using_Identifiers.html\\\">IAM\\n                identifiers</a> in the <i>IAM User Guide</i>.</p>\\n         <p>This parameter is optional. If it is not included, it defaults to a slash (/).\\n            This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting \\n    of either a forward slash (/) by itself or a string that must begin and end with forward slashes.\\n    In addition, it can contain any ASCII character from the ! (<code>\\\\u0021</code>) through the DEL character (<code>\\\\u007F</code>), including \\n    most punctuation characters, digits, and upper and lowercased letters.</p>\\n         <note>\\n            <p> If you are uploading a server certificate specifically for use with Amazon\\n                CloudFront distributions, you must specify a path using the <code>path</code>\\n                parameter. The path must begin with <code>/cloudfront</code> and must include a\\n                trailing slash (for example, <code>/cloudfront/test/</code>).</p>\\n         </note>\"\n                    }\n                },\n                \"ServerCertificateName\": {\n                    \"target\": \"com.amazonaws.iam#serverCertificateNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name for the server certificate. Do not include the path in this value. The name\\n            of the certificate cannot contain any spaces.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"CertificateBody\": {\n                    \"target\": \"com.amazonaws.iam#certificateBodyType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The contents of the public key certificate in PEM-encoded format.</p>\\n         <p>The <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a> \\n    used to validate this parameter is a string of characters consisting of the following:</p>\\n         <ul>\\n            <li>\\n               <p>Any printable ASCII \\n    character ranging from the space character (<code>\\\\u0020</code>) through the end of the ASCII character range</p>\\n            </li>\\n            <li>\\n               <p>The printable characters in the Basic Latin and  Latin-1 Supplement character set \\n    (through <code>\\\\u00FF</code>)</p>\\n            </li>\\n            <li>\\n               <p>The special characters tab (<code>\\\\u0009</code>), line feed (<code>\\\\u000A</code>), and \\n    carriage return (<code>\\\\u000D</code>)</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"PrivateKey\": {\n                    \"target\": \"com.amazonaws.iam#privateKeyType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The contents of the private key in PEM-encoded format.</p>\\n         <p>The <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a> \\n    used to validate this parameter is a string of characters consisting of the following:</p>\\n         <ul>\\n            <li>\\n               <p>Any printable ASCII \\n    character ranging from the space character (<code>\\\\u0020</code>) through the end of the ASCII character range</p>\\n            </li>\\n            <li>\\n               <p>The printable characters in the Basic Latin and  Latin-1 Supplement character set \\n    (through <code>\\\\u00FF</code>)</p>\\n            </li>\\n            <li>\\n               <p>The special characters tab (<code>\\\\u0009</code>), line feed (<code>\\\\u000A</code>), and \\n    carriage return (<code>\\\\u000D</code>)</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"CertificateChain\": {\n                    \"target\": \"com.amazonaws.iam#certificateChainType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The contents of the certificate chain. This is typically a concatenation of the\\n            PEM-encoded public key certificates of the chain.</p>\\n         <p>The <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a> \\n    used to validate this parameter is a string of characters consisting of the following:</p>\\n         <ul>\\n            <li>\\n               <p>Any printable ASCII \\n    character ranging from the space character (<code>\\\\u0020</code>) through the end of the ASCII character range</p>\\n            </li>\\n            <li>\\n               <p>The printable characters in the Basic Latin and  Latin-1 Supplement character set \\n    (through <code>\\\\u00FF</code>)</p>\\n            </li>\\n            <li>\\n               <p>The special characters tab (<code>\\\\u0009</code>), line feed (<code>\\\\u000A</code>), and \\n    carriage return (<code>\\\\u000D</code>)</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.iam#tagListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of tags that you want to attach to the new IAM server certificate resource.\\n      Each tag consists of a key name and an associated value. For more information about tagging, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_tags.html\\\">Tagging IAM resources</a> in the\\n      <i>IAM User Guide</i>.</p>\\n         <note>\\n            <p>If any one of the tags is invalid or if you exceed the allowed maximum number of tags, then the entire request \\n   fails and the resource is not created.</p>\\n         </note>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#UploadServerCertificateResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ServerCertificateMetadata\": {\n                    \"target\": \"com.amazonaws.iam#ServerCertificateMetadata\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The meta information of the uploaded server certificate without its certificate body,\\n            certificate chain, and private key.</p>\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.iam#tagListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of tags that are attached to the new IAM server certificate. The returned list of tags is sorted by tag key.\\n      For more information about tagging, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_tags.html\\\">Tagging IAM resources</a> in the\\n      <i>IAM User Guide</i>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the response to a successful <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_UploadServerCertificate.html\\\">UploadServerCertificate</a> request. </p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#UploadSigningCertificate\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.iam#UploadSigningCertificateRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.iam#UploadSigningCertificateResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.iam#ConcurrentModificationException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#DuplicateCertificateException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#EntityAlreadyExistsException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#InvalidCertificateException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#MalformedCertificateException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#NoSuchEntityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.iam#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Uploads an X.509 signing certificate and associates it with the specified IAM user.\\n            Some Amazon Web Services services require you to use certificates to validate requests that are signed\\n            with a corresponding private key. When you upload the certificate, its default status is\\n                <code>Active</code>.</p>\\n         <p>For information about when you would use an X.509 signing certificate, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_server-certs.html\\\">Managing\\n                server certificates in IAM</a> in the\\n            <i>IAM User Guide</i>.</p>\\n         <p>If the <code>UserName</code> is not specified, the IAM user name is determined\\n            implicitly based on the Amazon Web Services access key ID used to sign the request. This operation\\n            works for access keys under the Amazon Web Services account. Consequently, you can use this operation\\n            to manage Amazon Web Services account root user credentials even if the Amazon Web Services account has no associated\\n            users.</p>\\n         <note>\\n            <p>Because the body of an X.509 certificate can be large, you should use POST rather\\n                than GET when calling <code>UploadSigningCertificate</code>. For information about\\n                setting up signatures and authorization through the API, see <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/signing_aws_api_requests.html\\\">Signing\\n                    Amazon Web Services API requests</a> in the <i>Amazon Web Services General Reference</i>. For\\n                general information about using the Query API with IAM, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/IAM_UsingQueryAPI.html\\\">Making query\\n                    requests</a> in the <i>IAM User Guide</i>.</p>\\n         </note>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To upload a signing certificate for an IAM user\",\n                        \"documentation\": \"The following command uploads a signing certificate for the IAM user named Bob.\",\n                        \"input\": {\n                            \"UserName\": \"Bob\",\n                            \"CertificateBody\": \"-----BEGIN CERTIFICATE-----<certificate-body>-----END CERTIFICATE-----\"\n                        },\n                        \"output\": {\n                            \"Certificate\": {\n                                \"CertificateId\": \"ID123456789012345EXAMPLE\",\n                                \"UserName\": \"Bob\",\n                                \"Status\": \"Active\",\n                                \"CertificateBody\": \"-----BEGIN CERTIFICATE-----<certificate-body>-----END CERTIFICATE-----\",\n                                \"UploadDate\": \"2015-06-06T21:40:08.121Z\"\n                            }\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.iam#UploadSigningCertificateRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"UserName\": {\n                    \"target\": \"com.amazonaws.iam#existingUserNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the user the signing certificate is for.</p>\\n         <p>This parameter allows (through its <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a>) a string of characters consisting of upper and lowercase alphanumeric \\n    characters with no spaces. You can also include any of the following characters: _+=,.@-</p>\"\n                    }\n                },\n                \"CertificateBody\": {\n                    \"target\": \"com.amazonaws.iam#certificateBodyType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The contents of the signing certificate.</p>\\n         <p>The <a href=\\\"http://wikipedia.org/wiki/regex\\\">regex pattern</a> \\n    used to validate this parameter is a string of characters consisting of the following:</p>\\n         <ul>\\n            <li>\\n               <p>Any printable ASCII \\n    character ranging from the space character (<code>\\\\u0020</code>) through the end of the ASCII character range</p>\\n            </li>\\n            <li>\\n               <p>The printable characters in the Basic Latin and  Latin-1 Supplement character set \\n    (through <code>\\\\u00FF</code>)</p>\\n            </li>\\n            <li>\\n               <p>The special characters tab (<code>\\\\u0009</code>), line feed (<code>\\\\u000A</code>), and \\n    carriage return (<code>\\\\u000D</code>)</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.iam#UploadSigningCertificateResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Certificate\": {\n                    \"target\": \"com.amazonaws.iam#SigningCertificate\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Information about the certificate.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the response to a successful <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_UploadSigningCertificate.html\\\">UploadSigningCertificate</a> request. </p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.iam#User\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Path\": {\n                    \"target\": \"com.amazonaws.iam#pathType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The path to the user. For more information about paths, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/Using_Identifiers.html\\\">IAM identifiers</a> in the\\n            <i>IAM User Guide</i>.</p>\\n         <p>The ARN of the policy used to set the permissions boundary for the user.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"UserName\": {\n                    \"target\": \"com.amazonaws.iam#userNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The friendly name identifying the user.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"UserId\": {\n                    \"target\": \"com.amazonaws.iam#idType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The stable and unique string identifying the user. For more information about IDs, see\\n            <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/Using_Identifiers.html\\\">IAM\\n            identifiers</a> in the <i>IAM User Guide</i>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Arn\": {\n                    \"target\": \"com.amazonaws.iam#arnType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) that identifies the user. For more information about ARNs\\n         and how to use ARNs in policies, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/Using_Identifiers.html\\\">IAM Identifiers</a> in the\\n            <i>IAM User Guide</i>. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"CreateDate\": {\n                    \"target\": \"com.amazonaws.iam#dateType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time, in <a href=\\\"http://www.iso.org/iso/iso8601\\\">ISO 8601 date-time\\n            format</a>, when the user was created.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"PasswordLastUsed\": {\n                    \"target\": \"com.amazonaws.iam#dateType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time, in <a href=\\\"http://www.iso.org/iso/iso8601\\\">ISO 8601 date-time\\n            format</a>, when the user's password was last used to sign in to an Amazon Web Services website.\\n         For a list of Amazon Web Services websites that capture a user's last sign-in time, see the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/credential-reports.html\\\">Credential\\n            reports</a> topic in the <i>IAM User Guide</i>. If a password is\\n         used more than once in a five-minute span, only the first use is returned in this field. If\\n         the field is null (no value), then it indicates that they never signed in with a password.\\n         This can be because:</p>\\n         <ul>\\n            <li>\\n               <p>The user never had a password.</p>\\n            </li>\\n            <li>\\n               <p>A password exists but has not been used since IAM started tracking this\\n               information on October 20, 2014.</p>\\n            </li>\\n         </ul>\\n         <p>A null value does not mean that the user <i>never</i> had a password.\\n         Also, if the user does not currently have a password but had one in the past, then this\\n         field contains the date and time the most recent password was used.</p>\\n         <p>This value is returned only in the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetUser.html\\\">GetUser</a> and <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListUsers.html\\\">ListUsers</a>\\n         operations. </p>\"\n                    }\n                },\n                \"PermissionsBoundary\": {\n                    \"target\": \"com.amazonaws.iam#AttachedPermissionsBoundary\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>For more information about permissions boundaries, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_boundaries.html\\\">Permissions boundaries for IAM\\n            identities </a> in the <i>IAM User Guide</i>.</p>\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.iam#tagListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of tags that are associated with the user. For more information about tagging, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_tags.html\\\">Tagging IAM resources</a> in the\\n      <i>IAM User Guide</i>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains information about an IAM user entity.</p>\\n         <p>This data type is used as a response element in the following operations:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_CreateUser.html\\\">CreateUser</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetUser.html\\\">GetUser</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListUsers.html\\\">ListUsers</a>\\n               </p>\\n            </li>\\n         </ul>\"\n            }\n        },\n        \"com.amazonaws.iam#UserDetail\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Path\": {\n                    \"target\": \"com.amazonaws.iam#pathType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The path to the user. For more information about paths, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/Using_Identifiers.html\\\">IAM identifiers</a> in the\\n            <i>IAM User Guide</i>.</p>\"\n                    }\n                },\n                \"UserName\": {\n                    \"target\": \"com.amazonaws.iam#userNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The friendly name identifying the user.</p>\"\n                    }\n                },\n                \"UserId\": {\n                    \"target\": \"com.amazonaws.iam#idType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The stable and unique string identifying the user. For more information about IDs, see\\n            <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/Using_Identifiers.html\\\">IAM\\n            identifiers</a> in the <i>IAM User Guide</i>.</p>\"\n                    }\n                },\n                \"Arn\": {\n                    \"target\": \"com.amazonaws.iam#arnType\"\n                },\n                \"CreateDate\": {\n                    \"target\": \"com.amazonaws.iam#dateType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time, in <a href=\\\"http://www.iso.org/iso/iso8601\\\">ISO 8601 date-time\\n            format</a>, when the user was created.</p>\"\n                    }\n                },\n                \"UserPolicyList\": {\n                    \"target\": \"com.amazonaws.iam#policyDetailListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of the inline policies embedded in the user.</p>\"\n                    }\n                },\n                \"GroupList\": {\n                    \"target\": \"com.amazonaws.iam#groupNameListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of IAM groups that the user is in.</p>\"\n                    }\n                },\n                \"AttachedManagedPolicies\": {\n                    \"target\": \"com.amazonaws.iam#attachedPoliciesListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of the managed policies attached to the user.</p>\"\n                    }\n                },\n                \"PermissionsBoundary\": {\n                    \"target\": \"com.amazonaws.iam#AttachedPermissionsBoundary\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the policy used to set the permissions boundary for the user.</p>\\n         <p>For more information about permissions boundaries, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_boundaries.html\\\">Permissions boundaries for IAM\\n            identities </a> in the <i>IAM User Guide</i>.</p>\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.iam#tagListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of tags that are associated with the user. For more information about tagging, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_tags.html\\\">Tagging IAM resources</a> in the\\n      <i>IAM User Guide</i>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains information about an IAM user, including all the user's policies and all the\\n         IAM groups the user is in.</p>\\n         <p>This data type is used as a response element in the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetAccountAuthorizationDetails.html\\\">GetAccountAuthorizationDetails</a> operation.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#VirtualMFADevice\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SerialNumber\": {\n                    \"target\": \"com.amazonaws.iam#serialNumberType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The serial number associated with <code>VirtualMFADevice</code>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Base32StringSeed\": {\n                    \"target\": \"com.amazonaws.iam#BootstrapDatum\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The base32 seed defined as specified in <a href=\\\"https://tools.ietf.org/html/rfc3548.txt\\\">RFC3548</a>. The <code>Base32StringSeed</code> is base32-encoded. </p>\"\n                    }\n                },\n                \"QRCodePNG\": {\n                    \"target\": \"com.amazonaws.iam#BootstrapDatum\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> A QR code PNG image that encodes\\n            <code>otpauth://totp/$virtualMFADeviceName@$AccountName?secret=$Base32String</code>\\n         where <code>$virtualMFADeviceName</code> is one of the create call arguments.\\n            <code>AccountName</code> is the user name if set (otherwise, the account ID otherwise),\\n         and <code>Base32String</code> is the seed in base32 format. The <code>Base32String</code>\\n         value is base64-encoded. </p>\"\n                    }\n                },\n                \"User\": {\n                    \"target\": \"com.amazonaws.iam#User\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IAM user associated with this virtual MFA device.</p>\"\n                    }\n                },\n                \"EnableDate\": {\n                    \"target\": \"com.amazonaws.iam#dateType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time on which the virtual MFA device was enabled.</p>\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.iam#tagListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of tags that are attached to the virtual MFA device. For more information about tagging, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_tags.html\\\">Tagging IAM resources</a> in the\\n      <i>IAM User Guide</i>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains information about a virtual MFA device.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#accessKeyIdType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 16,\n                    \"max\": 128\n                },\n                \"smithy.api#pattern\": \"^[\\\\w]+$\"\n            }\n        },\n        \"com.amazonaws.iam#accessKeyMetadataListType\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.iam#AccessKeyMetadata\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains a list of access key metadata.</p>\\n         <p>This data type is used as a response element in the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListAccessKeys.html\\\">ListAccessKeys</a>\\n         operation.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#accessKeySecretType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#sensitive\": {}\n            }\n        },\n        \"com.amazonaws.iam#accountAliasListType\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.iam#accountAliasType\"\n            }\n        },\n        \"com.amazonaws.iam#accountAliasType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 3,\n                    \"max\": 63\n                },\n                \"smithy.api#pattern\": \"^[a-z0-9]([a-z0-9]|-(?!-)){1,61}[a-z0-9]$\"\n            }\n        },\n        \"com.amazonaws.iam#allUsers\": {\n            \"type\": \"boolean\"\n        },\n        \"com.amazonaws.iam#arnType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN). ARNs are unique identifiers for Amazon Web Services resources.</p>\\n         <p>For more information about ARNs, go to <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html\\\">Amazon Resource Names (ARNs)</a> in\\n         the <i>Amazon Web Services General Reference</i>. </p>\",\n                \"smithy.api#length\": {\n                    \"min\": 20,\n                    \"max\": 2048\n                }\n            }\n        },\n        \"com.amazonaws.iam#assertionEncryptionModeType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"Required\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Required\"\n                    }\n                },\n                \"Allowed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Allowed\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.iam#assignmentStatusType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"Assigned\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Assigned\"\n                    }\n                },\n                \"Unassigned\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Unassigned\"\n                    }\n                },\n                \"Any\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Any\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.iam#attachedPoliciesListType\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.iam#AttachedPolicy\"\n            }\n        },\n        \"com.amazonaws.iam#attachmentCountType\": {\n            \"type\": \"integer\"\n        },\n        \"com.amazonaws.iam#authenticationCodeType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 6,\n                    \"max\": 6\n                },\n                \"smithy.api#pattern\": \"^[\\\\d]+$\"\n            }\n        },\n        \"com.amazonaws.iam#booleanObjectType\": {\n            \"type\": \"boolean\"\n        },\n        \"com.amazonaws.iam#booleanType\": {\n            \"type\": \"boolean\",\n            \"traits\": {\n                \"smithy.api#default\": false\n            }\n        },\n        \"com.amazonaws.iam#certificateBodyType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 16384\n                },\n                \"smithy.api#pattern\": \"^[\\\\u0009\\\\u000A\\\\u000D\\\\u0020-\\\\u00FF]+$\"\n            }\n        },\n        \"com.amazonaws.iam#certificateChainType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 2097152\n                },\n                \"smithy.api#pattern\": \"^[\\\\u0009\\\\u000A\\\\u000D\\\\u0020-\\\\u00FF]+$\"\n            }\n        },\n        \"com.amazonaws.iam#certificateIdType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 24,\n                    \"max\": 128\n                },\n                \"smithy.api#pattern\": \"^[\\\\w]+$\"\n            }\n        },\n        \"com.amazonaws.iam#certificateListType\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.iam#SigningCertificate\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains a list of signing certificates.</p>\\n         <p>This data type is used as a response element in the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListSigningCertificates.html\\\">ListSigningCertificates</a> operation.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#clientIDListType\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.iam#clientIDType\"\n            }\n        },\n        \"com.amazonaws.iam#clientIDType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 255\n                }\n            }\n        },\n        \"com.amazonaws.iam#credentialAgeDays\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 36600\n                }\n            }\n        },\n        \"com.amazonaws.iam#credentialReportExpiredExceptionMessage\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.iam#credentialReportNotPresentExceptionMessage\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.iam#credentialReportNotReadyExceptionMessage\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.iam#customSuffixType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 64\n                },\n                \"smithy.api#pattern\": \"^[\\\\w+=,.@-]+$\"\n            }\n        },\n        \"com.amazonaws.iam#dateType\": {\n            \"type\": \"timestamp\"\n        },\n        \"com.amazonaws.iam#deleteConflictMessage\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.iam#duplicateCertificateMessage\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.iam#duplicateSSHPublicKeyMessage\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.iam#encodingType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"SSH\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"SSH\"\n                    }\n                },\n                \"PEM\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"PEM\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.iam#entityAlreadyExistsMessage\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.iam#entityDetailsListType\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.iam#EntityDetails\"\n            }\n        },\n        \"com.amazonaws.iam#entityListType\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.iam#EntityType\"\n            }\n        },\n        \"com.amazonaws.iam#entityNameType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 128\n                },\n                \"smithy.api#pattern\": \"^[\\\\w+=,.@-]+$\"\n            }\n        },\n        \"com.amazonaws.iam#entityTemporarilyUnmodifiableMessage\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.iam#existingUserNameType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 128\n                },\n                \"smithy.api#pattern\": \"^[\\\\w+=,.@-]+$\"\n            }\n        },\n        \"com.amazonaws.iam#globalEndpointTokenVersion\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"v1Token\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"v1Token\"\n                    }\n                },\n                \"v2Token\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"v2Token\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.iam#groupDetailListType\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.iam#GroupDetail\"\n            }\n        },\n        \"com.amazonaws.iam#groupListType\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.iam#Group\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains a list of IAM groups.</p>\\n         <p>This data type is used as a response element in the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListGroups.html\\\">ListGroups</a> operation.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#groupNameListType\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.iam#groupNameType\"\n            }\n        },\n        \"com.amazonaws.iam#groupNameType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 128\n                },\n                \"smithy.api#pattern\": \"^[\\\\w+=,.@-]+$\"\n            }\n        },\n        \"com.amazonaws.iam#idType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 16,\n                    \"max\": 128\n                },\n                \"smithy.api#pattern\": \"^[\\\\w]+$\"\n            }\n        },\n        \"com.amazonaws.iam#instanceProfileListType\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.iam#InstanceProfile\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains a list of instance profiles.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#instanceProfileNameType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 128\n                },\n                \"smithy.api#pattern\": \"^[\\\\w+=,.@-]+$\"\n            }\n        },\n        \"com.amazonaws.iam#integerType\": {\n            \"type\": \"integer\"\n        },\n        \"com.amazonaws.iam#invalidAuthenticationCodeMessage\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.iam#invalidCertificateMessage\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.iam#invalidInputMessage\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.iam#invalidPublicKeyMessage\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.iam#invalidUserTypeMessage\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.iam#jobIDType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 36,\n                    \"max\": 36\n                }\n            }\n        },\n        \"com.amazonaws.iam#jobStatusType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"IN_PROGRESS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"IN_PROGRESS\"\n                    }\n                },\n                \"COMPLETED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"COMPLETED\"\n                    }\n                },\n                \"FAILED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"FAILED\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.iam#keyPairMismatchMessage\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.iam#limitExceededMessage\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.iam#listPolicyGrantingServiceAccessResponseListType\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.iam#ListPoliciesGrantingServiceAccessEntry\"\n            }\n        },\n        \"com.amazonaws.iam#malformedCertificateMessage\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.iam#malformedPolicyDocumentMessage\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.iam#markerType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 320\n                },\n                \"smithy.api#pattern\": \"^[\\\\u0020-\\\\u00FF]+$\"\n            }\n        },\n        \"com.amazonaws.iam#maxItemsType\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.iam#maxPasswordAgeType\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 1095\n                }\n            }\n        },\n        \"com.amazonaws.iam#mfaDeviceListType\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.iam#MFADevice\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains a list of MFA devices.</p>\\n         <p>This data type is used as a response element in the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListMFADevices.html\\\">ListMFADevices</a> and <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListVirtualMFADevices.html\\\">ListVirtualMFADevices</a> operations. </p>\"\n            }\n        },\n        \"com.amazonaws.iam#minimumPasswordLengthType\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 6,\n                    \"max\": 128\n                }\n            }\n        },\n        \"com.amazonaws.iam#noSuchEntityMessage\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.iam#openIdIdpCommunicationErrorExceptionMessage\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.iam#organizationsEntityPathType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 19,\n                    \"max\": 427\n                },\n                \"smithy.api#pattern\": \"^o-[0-9a-z]{10,32}\\\\/r-[0-9a-z]{4,32}[0-9a-z-\\\\/]*$\"\n            }\n        },\n        \"com.amazonaws.iam#organizationsPolicyIdType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#pattern\": \"^p-[0-9a-zA-Z_]{8,128}$\"\n            }\n        },\n        \"com.amazonaws.iam#passwordPolicyViolationMessage\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.iam#passwordReusePreventionType\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 24\n                }\n            }\n        },\n        \"com.amazonaws.iam#passwordType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 128\n                },\n                \"smithy.api#pattern\": \"^[\\\\u0009\\\\u000A\\\\u000D\\\\u0020-\\\\u00FF]+$\",\n                \"smithy.api#sensitive\": {}\n            }\n        },\n        \"com.amazonaws.iam#pathPrefixType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 512\n                },\n                \"smithy.api#pattern\": \"^\\\\u002F[\\\\u0021-\\\\u007F]*$\"\n            }\n        },\n        \"com.amazonaws.iam#pathType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 512\n                },\n                \"smithy.api#pattern\": \"^(\\\\u002F)|(\\\\u002F[\\\\u0021-\\\\u007E]+\\\\u002F)$\"\n            }\n        },\n        \"com.amazonaws.iam#policyDescriptionType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.iam#policyDetailListType\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.iam#PolicyDetail\"\n            }\n        },\n        \"com.amazonaws.iam#policyDocumentType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 131072\n                },\n                \"smithy.api#pattern\": \"^[\\\\u0009\\\\u000A\\\\u000D\\\\u0020-\\\\u00FF]+$\"\n            }\n        },\n        \"com.amazonaws.iam#policyDocumentVersionListType\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.iam#PolicyVersion\"\n            }\n        },\n        \"com.amazonaws.iam#policyEvaluationErrorMessage\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.iam#policyGrantingServiceAccessListType\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.iam#PolicyGrantingServiceAccess\"\n            }\n        },\n        \"com.amazonaws.iam#policyListType\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.iam#Policy\"\n            }\n        },\n        \"com.amazonaws.iam#policyNameListType\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.iam#policyNameType\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains a list of policy names.</p>\\n         <p>This data type is used as a response element in the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListPolicies.html\\\">ListPolicies</a>\\n         operation.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#policyNameType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 128\n                },\n                \"smithy.api#pattern\": \"^[\\\\w+=,.@-]+$\"\n            }\n        },\n        \"com.amazonaws.iam#policyNotAttachableMessage\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.iam#policyOwnerEntityType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"USER\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"USER\"\n                    }\n                },\n                \"ROLE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ROLE\"\n                    }\n                },\n                \"GROUP\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"GROUP\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.iam#policyPathType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 512\n                },\n                \"smithy.api#pattern\": \"^((/[A-Za-z0-9\\\\.,\\\\+@=_-]+)*)/$\"\n            }\n        },\n        \"com.amazonaws.iam#policyScopeType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"All\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"All\"\n                    }\n                },\n                \"AWS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS\"\n                    }\n                },\n                \"Local\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Local\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.iam#policyType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"INLINE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"INLINE\"\n                    }\n                },\n                \"MANAGED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"MANAGED\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.iam#policyVersionIdType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#pattern\": \"^v[1-9][0-9]*(\\\\.[A-Za-z0-9-]*)?$\"\n            }\n        },\n        \"com.amazonaws.iam#privateKeyIdType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 22,\n                    \"max\": 64\n                },\n                \"smithy.api#pattern\": \"^[A-Z0-9]+$\"\n            }\n        },\n        \"com.amazonaws.iam#privateKeyList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.iam#SAMLPrivateKey\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 2\n                }\n            }\n        },\n        \"com.amazonaws.iam#privateKeyType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 16384\n                },\n                \"smithy.api#pattern\": \"^[\\\\u0009\\\\u000A\\\\u000D\\\\u0020-\\\\u00FF]+$\",\n                \"smithy.api#sensitive\": {}\n            }\n        },\n        \"com.amazonaws.iam#publicKeyFingerprintType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 48,\n                    \"max\": 48\n                },\n                \"smithy.api#pattern\": \"^[:\\\\w]+$\"\n            }\n        },\n        \"com.amazonaws.iam#publicKeyIdType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 20,\n                    \"max\": 128\n                },\n                \"smithy.api#pattern\": \"^[\\\\w]+$\"\n            }\n        },\n        \"com.amazonaws.iam#publicKeyMaterialType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 16384\n                },\n                \"smithy.api#pattern\": \"^[\\\\u0009\\\\u000A\\\\u000D\\\\u0020-\\\\u00FF]+$\"\n            }\n        },\n        \"com.amazonaws.iam#reportGenerationLimitExceededMessage\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.iam#responseMarkerType\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.iam#roleDescriptionType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 1000\n                },\n                \"smithy.api#pattern\": \"^[\\\\u0009\\\\u000A\\\\u000D\\\\u0020-\\\\u007E\\\\u00A1-\\\\u00FF]*$\"\n            }\n        },\n        \"com.amazonaws.iam#roleDetailListType\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.iam#RoleDetail\"\n            }\n        },\n        \"com.amazonaws.iam#roleListType\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.iam#Role\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains a list of IAM roles.</p>\\n         <p>This data type is used as a response element in the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListRoles.html\\\">ListRoles</a> operation.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#roleMaxSessionDurationType\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 3600,\n                    \"max\": 43200\n                }\n            }\n        },\n        \"com.amazonaws.iam#roleNameType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 64\n                },\n                \"smithy.api#pattern\": \"^[\\\\w+=,.@-]+$\"\n            }\n        },\n        \"com.amazonaws.iam#serialNumberType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 9,\n                    \"max\": 256\n                },\n                \"smithy.api#pattern\": \"^[\\\\w+=/:,.@-]+$\"\n            }\n        },\n        \"com.amazonaws.iam#serverCertificateMetadataListType\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.iam#ServerCertificateMetadata\"\n            }\n        },\n        \"com.amazonaws.iam#serverCertificateNameType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 128\n                },\n                \"smithy.api#pattern\": \"^[\\\\w+=,.@-]+$\"\n            }\n        },\n        \"com.amazonaws.iam#serviceCredentialAlias\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 200\n                },\n                \"smithy.api#pattern\": \"^[\\\\w+=,.@-]+$\"\n            }\n        },\n        \"com.amazonaws.iam#serviceCredentialSecret\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#sensitive\": {}\n            }\n        },\n        \"com.amazonaws.iam#serviceFailureExceptionMessage\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.iam#serviceName\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.iam#serviceNameType\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.iam#serviceNamespaceListType\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.iam#serviceNamespaceType\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 200\n                }\n            }\n        },\n        \"com.amazonaws.iam#serviceNamespaceType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 64\n                },\n                \"smithy.api#pattern\": \"^[\\\\w-]*$\"\n            }\n        },\n        \"com.amazonaws.iam#serviceNotSupportedMessage\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.iam#servicePassword\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#sensitive\": {}\n            }\n        },\n        \"com.amazonaws.iam#serviceSpecificCredentialId\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 20,\n                    \"max\": 128\n                },\n                \"smithy.api#pattern\": \"^[\\\\w]+$\"\n            }\n        },\n        \"com.amazonaws.iam#serviceUserName\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 200\n                },\n                \"smithy.api#pattern\": \"^[\\\\w+=,.@-]*$\"\n            }\n        },\n        \"com.amazonaws.iam#sortKeyType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"SERVICE_NAMESPACE_ASCENDING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"SERVICE_NAMESPACE_ASCENDING\"\n                    }\n                },\n                \"SERVICE_NAMESPACE_DESCENDING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"SERVICE_NAMESPACE_DESCENDING\"\n                    }\n                },\n                \"LAST_AUTHENTICATED_TIME_ASCENDING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"LAST_AUTHENTICATED_TIME_ASCENDING\"\n                    }\n                },\n                \"LAST_AUTHENTICATED_TIME_DESCENDING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"LAST_AUTHENTICATED_TIME_DESCENDING\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.iam#statusType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"Active\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Active\"\n                    }\n                },\n                \"Inactive\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Inactive\"\n                    }\n                },\n                \"Expired\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Expired\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.iam#stringType\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.iam#summaryKeyType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"Users\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Users\"\n                    }\n                },\n                \"UsersQuota\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"UsersQuota\"\n                    }\n                },\n                \"Groups\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Groups\"\n                    }\n                },\n                \"GroupsQuota\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"GroupsQuota\"\n                    }\n                },\n                \"ServerCertificates\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ServerCertificates\"\n                    }\n                },\n                \"ServerCertificatesQuota\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ServerCertificatesQuota\"\n                    }\n                },\n                \"UserPolicySizeQuota\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"UserPolicySizeQuota\"\n                    }\n                },\n                \"GroupPolicySizeQuota\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"GroupPolicySizeQuota\"\n                    }\n                },\n                \"GroupsPerUserQuota\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"GroupsPerUserQuota\"\n                    }\n                },\n                \"SigningCertificatesPerUserQuota\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"SigningCertificatesPerUserQuota\"\n                    }\n                },\n                \"AccessKeysPerUserQuota\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AccessKeysPerUserQuota\"\n                    }\n                },\n                \"MFADevices\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"MFADevices\"\n                    }\n                },\n                \"MFADevicesInUse\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"MFADevicesInUse\"\n                    }\n                },\n                \"AccountMFAEnabled\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AccountMFAEnabled\"\n                    }\n                },\n                \"AccountAccessKeysPresent\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AccountAccessKeysPresent\"\n                    }\n                },\n                \"AccountPasswordPresent\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AccountPasswordPresent\"\n                    }\n                },\n                \"AccountSigningCertificatesPresent\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AccountSigningCertificatesPresent\"\n                    }\n                },\n                \"AttachedPoliciesPerGroupQuota\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AttachedPoliciesPerGroupQuota\"\n                    }\n                },\n                \"AttachedPoliciesPerRoleQuota\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AttachedPoliciesPerRoleQuota\"\n                    }\n                },\n                \"AttachedPoliciesPerUserQuota\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AttachedPoliciesPerUserQuota\"\n                    }\n                },\n                \"Policies\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Policies\"\n                    }\n                },\n                \"PoliciesQuota\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"PoliciesQuota\"\n                    }\n                },\n                \"PolicySizeQuota\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"PolicySizeQuota\"\n                    }\n                },\n                \"PolicyVersionsInUse\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"PolicyVersionsInUse\"\n                    }\n                },\n                \"PolicyVersionsInUseQuota\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"PolicyVersionsInUseQuota\"\n                    }\n                },\n                \"VersionsPerPolicyQuota\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"VersionsPerPolicyQuota\"\n                    }\n                },\n                \"GlobalEndpointTokenVersion\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"GlobalEndpointTokenVersion\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.iam#summaryMapType\": {\n            \"type\": \"map\",\n            \"key\": {\n                \"target\": \"com.amazonaws.iam#summaryKeyType\"\n            },\n            \"value\": {\n                \"target\": \"com.amazonaws.iam#summaryValueType\"\n            }\n        },\n        \"com.amazonaws.iam#summaryValueType\": {\n            \"type\": \"integer\"\n        },\n        \"com.amazonaws.iam#tagKeyListType\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.iam#tagKeyType\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 50\n                }\n            }\n        },\n        \"com.amazonaws.iam#tagKeyType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 128\n                },\n                \"smithy.api#pattern\": \"^[\\\\p{L}\\\\p{Z}\\\\p{N}_.:/=+\\\\-@]+$\"\n            }\n        },\n        \"com.amazonaws.iam#tagListType\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.iam#Tag\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 50\n                }\n            }\n        },\n        \"com.amazonaws.iam#tagValueType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 256\n                },\n                \"smithy.api#pattern\": \"^[\\\\p{L}\\\\p{Z}\\\\p{N}_.:/=+\\\\-@]*$\"\n            }\n        },\n        \"com.amazonaws.iam#thumbprintListType\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.iam#thumbprintType\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains a list of thumbprints of identity provider server certificates.</p>\"\n            }\n        },\n        \"com.amazonaws.iam#thumbprintType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains a thumbprint for an identity provider's server certificate.</p>\\n         <p>The identity provider's server certificate thumbprint is the hex-encoded SHA-1 hash\\n         value of the self-signed X.509 certificate. This thumbprint is used by the domain where the\\n         OpenID Connect provider makes its keys available. The thumbprint is always a 40-character\\n         string.</p>\",\n                \"smithy.api#length\": {\n                    \"min\": 40,\n                    \"max\": 40\n                }\n            }\n        },\n        \"com.amazonaws.iam#unmodifiableEntityMessage\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.iam#unrecognizedPublicKeyEncodingMessage\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.iam#userDetailListType\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.iam#UserDetail\"\n            }\n        },\n        \"com.amazonaws.iam#userListType\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.iam#User\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains a list of users.</p>\\n         <p>This data type is used as a response element in the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetGroup.html\\\">GetGroup</a> and <a href=\\\"https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListUsers.html\\\">ListUsers</a>\\n         operations. </p>\"\n            }\n        },\n        \"com.amazonaws.iam#userNameType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 64\n                },\n                \"smithy.api#pattern\": \"^[\\\\w+=,.@-]+$\"\n            }\n        },\n        \"com.amazonaws.iam#virtualMFADeviceListType\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.iam#VirtualMFADevice\"\n            }\n        },\n        \"com.amazonaws.iam#virtualMFADeviceName\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1\n                },\n                \"smithy.api#pattern\": \"^[\\\\w+=,.@-]+$\"\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "aws/sdk/aws-models/kms.json",
    "content": "{\n    \"smithy\": \"2.0\",\n    \"metadata\": {\n        \"suppressions\": [\n            {\n                \"id\": \"HttpMethodSemantics\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"HttpResponseCodeSemantics\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"PaginatedTrait\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"HttpHeaderTrait\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"HttpUriConflict\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"Service\",\n                \"namespace\": \"*\"\n            }\n        ]\n    },\n    \"shapes\": {\n        \"com.amazonaws.kms#AWSAccountIdType\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.kms#AlgorithmSpec\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"RSAES_PKCS1_V1_5\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"RSAES_PKCS1_V1_5\"\n                    }\n                },\n                \"RSAES_OAEP_SHA_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"RSAES_OAEP_SHA_1\"\n                    }\n                },\n                \"RSAES_OAEP_SHA_256\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"RSAES_OAEP_SHA_256\"\n                    }\n                },\n                \"RSA_AES_KEY_WRAP_SHA_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"RSA_AES_KEY_WRAP_SHA_1\"\n                    }\n                },\n                \"RSA_AES_KEY_WRAP_SHA_256\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"RSA_AES_KEY_WRAP_SHA_256\"\n                    }\n                },\n                \"SM2PKE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"SM2PKE\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.kms#AliasList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.kms#AliasListEntry\"\n            }\n        },\n        \"com.amazonaws.kms#AliasListEntry\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AliasName\": {\n                    \"target\": \"com.amazonaws.kms#AliasNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>String that contains the alias. This value begins with <code>alias/</code>.</p>\"\n                    }\n                },\n                \"AliasArn\": {\n                    \"target\": \"com.amazonaws.kms#ArnType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>String that contains the key ARN.</p>\"\n                    }\n                },\n                \"TargetKeyId\": {\n                    \"target\": \"com.amazonaws.kms#KeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>String that contains the key identifier of the KMS key associated with the alias.</p>\"\n                    }\n                },\n                \"CreationDate\": {\n                    \"target\": \"com.amazonaws.kms#DateType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Date and time that the alias was most recently created in the account and Region.\\n      Formatted as Unix time.</p>\"\n                    }\n                },\n                \"LastUpdatedDate\": {\n                    \"target\": \"com.amazonaws.kms#DateType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Date and time that the alias was most recently associated with a KMS key in the account\\n      and Region. Formatted as Unix time.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains information about an alias.</p>\"\n            }\n        },\n        \"com.amazonaws.kms#AliasNameType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 256\n                },\n                \"smithy.api#pattern\": \"^[a-zA-Z0-9:/_-]+$\"\n            }\n        },\n        \"com.amazonaws.kms#AlreadyExistsException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.kms#ErrorMessageType\"\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"AlreadyExists\",\n                    \"httpResponseCode\": 409\n                },\n                \"smithy.api#documentation\": \"<p>The request was rejected because it attempted to create a resource that already\\n      exists.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 409\n            }\n        },\n        \"com.amazonaws.kms#ArnType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 20,\n                    \"max\": 2048\n                }\n            }\n        },\n        \"com.amazonaws.kms#AttestationDocumentType\": {\n            \"type\": \"blob\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 262144\n                }\n            }\n        },\n        \"com.amazonaws.kms#BackingKeyIdResponseType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 64\n                },\n                \"smithy.api#pattern\": \"^[a-f0-9]+$\"\n            }\n        },\n        \"com.amazonaws.kms#BackingKeyIdType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 64,\n                    \"max\": 64\n                },\n                \"smithy.api#pattern\": \"^[a-f0-9]+$\"\n            }\n        },\n        \"com.amazonaws.kms#BooleanType\": {\n            \"type\": \"boolean\",\n            \"traits\": {\n                \"smithy.api#default\": false\n            }\n        },\n        \"com.amazonaws.kms#CancelKeyDeletion\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.kms#CancelKeyDeletionRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.kms#CancelKeyDeletionResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.kms#DependencyTimeoutException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#InvalidArnException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInternalException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInvalidStateException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#NotFoundException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Cancels the deletion of a KMS key. When this operation succeeds, the key state of the KMS\\n      key is <code>Disabled</code>. To enable the KMS key, use <a>EnableKey</a>. </p>\\n         <p>For more information about scheduling and canceling deletion of a KMS key, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/deleting-keys.html\\\">Deleting KMS keys</a> in the\\n      <i>Key Management Service Developer Guide</i>.</p>\\n         <p>The KMS key that you use for this operation must be in a compatible key state. For\\ndetails, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/key-state.html\\\">Key states of KMS keys</a> in the <i>Key Management Service Developer Guide</i>.</p>\\n         <p>\\n            <b>Cross-account use</b>: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.</p>\\n         <p>\\n            <b>Required permissions</b>: <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/kms-api-permissions-reference.html\\\">kms:CancelKeyDeletion</a> (key policy)</p>\\n         <p>\\n            <b>Related operations</b>: <a>ScheduleKeyDeletion</a>\\n         </p>\\n         <p>\\n            <b>Eventual consistency</b>: The KMS API follows an eventual consistency model. \\n  For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/accessing-kms.html#programming-eventual-consistency\\\">KMS eventual consistency</a>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To cancel deletion of a KMS key\",\n                        \"documentation\": \"The following example cancels deletion of the specified KMS key.\",\n                        \"input\": {\n                            \"KeyId\": \"1234abcd-12ab-34cd-56ef-1234567890ab\"\n                        },\n                        \"output\": {\n                            \"KeyId\": \"arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.kms#CancelKeyDeletionRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"KeyId\": {\n                    \"target\": \"com.amazonaws.kms#KeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Identifies the KMS key whose deletion is being canceled.</p>\\n         <p>Specify the key ID or key ARN of the KMS key.</p>\\n         <p>For example:</p>\\n         <ul>\\n            <li>\\n               <p>Key ID: <code>1234abcd-12ab-34cd-56ef-1234567890ab</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Key ARN: <code>arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>To get the key ID and key ARN for a KMS key, use <a>ListKeys</a> or <a>DescribeKey</a>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.kms#CancelKeyDeletionResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"KeyId\": {\n                    \"target\": \"com.amazonaws.kms#KeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (<a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-id-key-ARN\\\">key ARN</a>) of the KMS key whose deletion is canceled.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.kms#CiphertextType\": {\n            \"type\": \"blob\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 6144\n                }\n            }\n        },\n        \"com.amazonaws.kms#CloudHsmClusterIdType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 19,\n                    \"max\": 24\n                },\n                \"smithy.api#pattern\": \"^cluster-[2-7a-zA-Z]{11,16}$\"\n            }\n        },\n        \"com.amazonaws.kms#CloudHsmClusterInUseException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.kms#ErrorMessageType\"\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"CloudHsmClusterInUseException\",\n                    \"httpResponseCode\": 400\n                },\n                \"smithy.api#documentation\": \"<p>The request was rejected because the specified CloudHSM cluster is already associated with an\\n      CloudHSM key store in the account, or it shares a backup history with an CloudHSM key store in the\\n      account. Each CloudHSM key store in the account must be associated with a different CloudHSM\\n      cluster.</p>\\n         <p>CloudHSM clusters that share a backup history have the same cluster certificate. To view the\\n      cluster certificate of an CloudHSM cluster, use the <a href=\\\"https://docs.aws.amazon.com/cloudhsm/latest/APIReference/API_DescribeClusters.html\\\">DescribeClusters</a> operation.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.kms#CloudHsmClusterInvalidConfigurationException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.kms#ErrorMessageType\"\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"CloudHsmClusterInvalidConfigurationException\",\n                    \"httpResponseCode\": 400\n                },\n                \"smithy.api#documentation\": \"<p>The request was rejected because the associated CloudHSM cluster did not meet the\\n      configuration requirements for an CloudHSM key store.</p>\\n         <ul>\\n            <li>\\n               <p>The CloudHSM cluster must be configured with private subnets in at least two different\\n          Availability Zones in the Region.</p>\\n            </li>\\n            <li>\\n               <p>The <a href=\\\"https://docs.aws.amazon.com/cloudhsm/latest/userguide/configure-sg.html\\\">security group for\\n            the cluster</a> (cloudhsm-cluster-<i><cluster-id></i>-sg) must\\n          include inbound rules and outbound rules that allow TCP traffic on ports 2223-2225. The\\n            <b>Source</b> in the inbound rules and the <b>Destination</b> in the outbound rules must match the security group\\n          ID. These rules are set by default when you create the CloudHSM cluster. Do not delete or\\n          change them. To get information about a particular security group, use the <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeSecurityGroups.html\\\">DescribeSecurityGroups</a> operation.</p>\\n            </li>\\n            <li>\\n               <p>The CloudHSM cluster must contain at least as many HSMs as the operation requires. To add\\n          HSMs, use the CloudHSM <a href=\\\"https://docs.aws.amazon.com/cloudhsm/latest/APIReference/API_CreateHsm.html\\\">CreateHsm</a> operation.</p>\\n               <p>For the <a>CreateCustomKeyStore</a>, <a>UpdateCustomKeyStore</a>, and <a>CreateKey</a> operations, the CloudHSM cluster must have at least two\\n          active HSMs, each in a different Availability Zone. For the <a>ConnectCustomKeyStore</a> operation, the CloudHSM must contain at least one active\\n          HSM.</p>\\n            </li>\\n         </ul>\\n         <p>For information about the requirements for an CloudHSM cluster that is associated with an\\n      CloudHSM key store, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/create-keystore.html#before-keystore\\\">Assemble the Prerequisites</a>\\n      in the <i>Key Management Service Developer Guide</i>. For information about creating a private subnet for an CloudHSM cluster,\\n      see <a href=\\\"https://docs.aws.amazon.com/cloudhsm/latest/userguide/create-subnets.html\\\">Create a Private\\n        Subnet</a> in the <i>CloudHSM User Guide</i>. For information about cluster security groups, see\\n        <a href=\\\"https://docs.aws.amazon.com/cloudhsm/latest/userguide/configure-sg.html\\\">Configure a Default Security\\n        Group</a> in the <i>\\n               <i>CloudHSM User Guide</i>\\n            </i>. </p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.kms#CloudHsmClusterNotActiveException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.kms#ErrorMessageType\"\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"CloudHsmClusterNotActiveException\",\n                    \"httpResponseCode\": 400\n                },\n                \"smithy.api#documentation\": \"<p>The request was rejected because the CloudHSM cluster associated with the CloudHSM key store is\\n      not active. Initialize and activate the cluster and try the command again. For detailed\\n      instructions, see <a href=\\\"https://docs.aws.amazon.com/cloudhsm/latest/userguide/getting-started.html\\\">Getting\\n        Started</a> in the <i>CloudHSM User Guide</i>.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.kms#CloudHsmClusterNotFoundException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.kms#ErrorMessageType\"\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"CloudHsmClusterNotFoundException\",\n                    \"httpResponseCode\": 400\n                },\n                \"smithy.api#documentation\": \"<p>The request was rejected because KMS cannot find the CloudHSM cluster with the specified\\n      cluster ID. Retry the request with a different cluster ID.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.kms#CloudHsmClusterNotRelatedException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.kms#ErrorMessageType\"\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"CloudHsmClusterNotRelatedException\",\n                    \"httpResponseCode\": 400\n                },\n                \"smithy.api#documentation\": \"<p>The request was rejected because the specified CloudHSM cluster has a different cluster\\n      certificate than the original cluster. You cannot use the operation to specify an unrelated\\n      cluster for an CloudHSM key store.</p>\\n         <p>Specify an CloudHSM cluster that shares a backup history with the original cluster. This\\n      includes clusters that were created from a backup of the current cluster, and clusters that\\n      were created from the same backup that produced the current cluster.</p>\\n         <p>CloudHSM clusters that share a backup history have the same cluster certificate. To view the\\n      cluster certificate of an CloudHSM cluster, use the <a href=\\\"https://docs.aws.amazon.com/cloudhsm/latest/APIReference/API_DescribeClusters.html\\\">DescribeClusters</a> operation.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.kms#ConflictException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.kms#ErrorMessageType\"\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"ConflictException\",\n                    \"httpResponseCode\": 409\n                },\n                \"smithy.api#documentation\": \"<p>The request was rejected because an automatic rotation of this key is currently in\\n      progress or scheduled to begin within the next 20 minutes. </p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 409\n            }\n        },\n        \"com.amazonaws.kms#ConnectCustomKeyStore\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.kms#ConnectCustomKeyStoreRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.kms#ConnectCustomKeyStoreResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.kms#CloudHsmClusterInvalidConfigurationException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#CloudHsmClusterNotActiveException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#CustomKeyStoreInvalidStateException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#CustomKeyStoreNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInternalException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Connects or reconnects a <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/key-store-overview.html\\\">custom key store</a> to its backing key store. For an CloudHSM key\\n      store, <code>ConnectCustomKeyStore</code> connects the key store to its associated CloudHSM\\n      cluster. For an external key store, <code>ConnectCustomKeyStore</code> connects the key store\\n      to the external key store proxy that communicates with your external key manager.</p>\\n         <p>The custom key store must be connected before you can create KMS keys in the key store or\\n      use the KMS keys it contains. You can disconnect and reconnect a custom key store at any\\n      time.</p>\\n         <p>The connection process for a custom key store can take an extended amount of time to\\n      complete. This operation starts the connection process, but it does not wait for it to\\n      complete. When it succeeds, this operation quickly returns an HTTP 200 response and a JSON\\n      object with no properties. However, this response does not indicate that the custom key store\\n      is connected. To get the connection state of the custom key store, use the <a>DescribeCustomKeyStores</a> operation.</p>\\n         <p> This operation is part of the custom key stores feature in KMS, which\\ncombines the convenience and extensive integration of KMS with the isolation and control of a\\nkey store that you own and manage.</p>\\n         <p>The <code>ConnectCustomKeyStore</code> operation might fail for various reasons. To find\\n      the reason, use the <a>DescribeCustomKeyStores</a> operation and see the\\n        <code>ConnectionErrorCode</code> in the response. For help interpreting the\\n        <code>ConnectionErrorCode</code>, see <a>CustomKeyStoresListEntry</a>.</p>\\n         <p>To fix the failure, use the <a>DisconnectCustomKeyStore</a> operation to\\n      disconnect the custom key store, correct the error, use the <a>UpdateCustomKeyStore</a> operation if necessary, and then use\\n        <code>ConnectCustomKeyStore</code> again.</p>\\n         <p>\\n            <b>CloudHSM key store</b>\\n         </p>\\n         <p>During the connection process for an CloudHSM key store, KMS finds the CloudHSM cluster that\\n      is associated with the custom key store, creates the connection infrastructure, connects to\\n      the cluster, logs into the CloudHSM client as the <code>kmsuser</code> CU, and rotates its\\n      password.</p>\\n         <p>To connect an CloudHSM key store, its associated CloudHSM cluster must have at least one active\\n      HSM. To get the number of active HSMs in a cluster, use the <a href=\\\"https://docs.aws.amazon.com/cloudhsm/latest/APIReference/API_DescribeClusters.html\\\">DescribeClusters</a> operation. To add HSMs\\n      to the cluster, use the <a href=\\\"https://docs.aws.amazon.com/cloudhsm/latest/APIReference/API_CreateHsm.html\\\">CreateHsm</a> operation. Also, the <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/keystore-cloudhsm.html#concept-kmsuser\\\">\\n               <code>kmsuser</code> crypto\\n        user</a> (CU) must not be logged into the cluster. This prevents KMS from using this\\n      account to log in.</p>\\n         <p>If you are having trouble connecting or disconnecting a CloudHSM key store, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/fix-keystore.html\\\">Troubleshooting an CloudHSM key\\n        store</a> in the <i>Key Management Service Developer Guide</i>.</p>\\n         <p>\\n            <b>External key store</b>\\n         </p>\\n         <p>When you connect an external key store that uses public endpoint connectivity, KMS tests\\n      its ability to communicate with your external key manager by sending a request via the\\n      external key store proxy.</p>\\n         <p>When you connect to an external key store that uses VPC endpoint service connectivity,\\n      KMS establishes the networking elements that it needs to communicate with your external key\\n      manager via the external key store proxy. This includes creating an interface endpoint to the\\n      VPC endpoint service and a private hosted zone for traffic between KMS and the VPC endpoint\\n      service.</p>\\n         <p>To connect an external key store, KMS must be able to connect to the external key store\\n      proxy, the external key store proxy must be able to communicate with your external key\\n      manager, and the external key manager must be available for cryptographic operations.</p>\\n         <p>If you are having trouble connecting or disconnecting an external key store, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/xks-troubleshooting.html\\\">Troubleshooting an external\\n        key store</a> in the <i>Key Management Service Developer Guide</i>.</p>\\n         <p>\\n            <b>Cross-account use</b>: No. You cannot perform this operation on a custom key store in a different Amazon Web Services account.</p>\\n         <p>\\n            <b>Required permissions</b>: <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/kms-api-permissions-reference.html\\\">kms:ConnectCustomKeyStore</a> (IAM policy)</p>\\n         <p>\\n            <b>Related operations</b>\\n         </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a>CreateCustomKeyStore</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>DeleteCustomKeyStore</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>DescribeCustomKeyStores</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>DisconnectCustomKeyStore</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>UpdateCustomKeyStore</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>\\n            <b>Eventual consistency</b>: The KMS API follows an eventual consistency model. \\n  For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/accessing-kms.html#programming-eventual-consistency\\\">KMS eventual consistency</a>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To connect a custom key store\",\n                        \"documentation\": \"This example connects an AWS KMS custom key store to its backing key store. For an AWS CloudHSM key store, it connects the key store to its AWS CloudHSM cluster. For an external key store, it connects the key store to the external key store proxy that communicates with your external key manager. This operation does not return any data. To verify that the custom key store is connected, use the <code>DescribeCustomKeyStores</code> operation.\",\n                        \"input\": {\n                            \"CustomKeyStoreId\": \"cks-1234567890abcdef0\"\n                        },\n                        \"output\": {}\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.kms#ConnectCustomKeyStoreRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CustomKeyStoreId\": {\n                    \"target\": \"com.amazonaws.kms#CustomKeyStoreIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Enter the key store ID of the custom key store that you want to connect.\\n      To find the ID of a custom key store, use the <a>DescribeCustomKeyStores</a> operation.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.kms#ConnectCustomKeyStoreResponse\": {\n            \"type\": \"structure\",\n            \"members\": {},\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.kms#ConnectionErrorCodeType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"INVALID_CREDENTIALS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"INVALID_CREDENTIALS\"\n                    }\n                },\n                \"CLUSTER_NOT_FOUND\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"CLUSTER_NOT_FOUND\"\n                    }\n                },\n                \"NETWORK_ERRORS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"NETWORK_ERRORS\"\n                    }\n                },\n                \"INTERNAL_ERROR\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"INTERNAL_ERROR\"\n                    }\n                },\n                \"INSUFFICIENT_CLOUDHSM_HSMS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"INSUFFICIENT_CLOUDHSM_HSMS\"\n                    }\n                },\n                \"USER_LOCKED_OUT\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"USER_LOCKED_OUT\"\n                    }\n                },\n                \"USER_NOT_FOUND\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"USER_NOT_FOUND\"\n                    }\n                },\n                \"USER_LOGGED_IN\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"USER_LOGGED_IN\"\n                    }\n                },\n                \"SUBNET_NOT_FOUND\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"SUBNET_NOT_FOUND\"\n                    }\n                },\n                \"INSUFFICIENT_FREE_ADDRESSES_IN_SUBNET\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"INSUFFICIENT_FREE_ADDRESSES_IN_SUBNET\"\n                    }\n                },\n                \"XKS_PROXY_ACCESS_DENIED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"XKS_PROXY_ACCESS_DENIED\"\n                    }\n                },\n                \"XKS_PROXY_NOT_REACHABLE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"XKS_PROXY_NOT_REACHABLE\"\n                    }\n                },\n                \"XKS_VPC_ENDPOINT_SERVICE_NOT_FOUND\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"XKS_VPC_ENDPOINT_SERVICE_NOT_FOUND\"\n                    }\n                },\n                \"XKS_PROXY_INVALID_RESPONSE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"XKS_PROXY_INVALID_RESPONSE\"\n                    }\n                },\n                \"XKS_PROXY_INVALID_CONFIGURATION\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"XKS_PROXY_INVALID_CONFIGURATION\"\n                    }\n                },\n                \"XKS_VPC_ENDPOINT_SERVICE_INVALID_CONFIGURATION\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"XKS_VPC_ENDPOINT_SERVICE_INVALID_CONFIGURATION\"\n                    }\n                },\n                \"XKS_PROXY_TIMED_OUT\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"XKS_PROXY_TIMED_OUT\"\n                    }\n                },\n                \"XKS_PROXY_INVALID_TLS_CONFIGURATION\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"XKS_PROXY_INVALID_TLS_CONFIGURATION\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.kms#ConnectionStateType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"CONNECTED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"CONNECTED\"\n                    }\n                },\n                \"CONNECTING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"CONNECTING\"\n                    }\n                },\n                \"FAILED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"FAILED\"\n                    }\n                },\n                \"DISCONNECTED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DISCONNECTED\"\n                    }\n                },\n                \"DISCONNECTING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DISCONNECTING\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.kms#CreateAlias\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.kms#CreateAliasRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.kms#AlreadyExistsException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#DependencyTimeoutException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#InvalidAliasNameException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInternalException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInvalidStateException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#NotFoundException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates a friendly name for a KMS key. </p>\\n         <note>\\n            <p>Adding, deleting, or updating an alias can allow or deny permission to the KMS key. For details, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/abac.html\\\">ABAC for KMS</a> in the <i>Key Management Service Developer Guide</i>.</p>\\n         </note>\\n         <p>You can use an alias to identify a KMS key in the KMS console, in the <a>DescribeKey</a> operation and in <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/kms-cryptography.html#cryptographic-operations\\\">cryptographic operations</a>, such as <a>Encrypt</a> and\\n        <a>GenerateDataKey</a>. You can also change the KMS key that's associated with\\n      the alias (<a>UpdateAlias</a>) or delete the alias (<a>DeleteAlias</a>)\\n      at any time. These operations don't affect the underlying KMS key. </p>\\n         <p>You can associate the alias with any customer managed key in the same Amazon Web Services Region. Each\\n      alias is associated with only one KMS key at a time, but a KMS key can have multiple aliases.\\n      A valid KMS key is required. You can't create an alias without a KMS key.</p>\\n         <p>The alias must be unique in the account and Region, but you can have aliases with the same\\n      name in different Regions. For detailed information about aliases, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/kms-alias.html\\\">Aliases in KMS</a> in the\\n      <i>Key Management Service Developer Guide</i>.</p>\\n         <p>This operation does not return a response. To get the alias that you created, use the\\n        <a>ListAliases</a> operation.</p>\\n         <p>The KMS key that you use for this operation must be in a compatible key state. For\\ndetails, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/key-state.html\\\">Key states of KMS keys</a> in the <i>Key Management Service Developer Guide</i>.</p>\\n         <p>\\n            <b>Cross-account use</b>: No. You cannot perform this operation on an alias in a different Amazon Web Services account.</p>\\n         <p>\\n            <b>Required permissions</b>\\n         </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/kms-api-permissions-reference.html\\\">kms:CreateAlias</a> on\\n          the alias (IAM policy).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/kms-api-permissions-reference.html\\\">kms:CreateAlias</a> on\\n          the KMS key (key policy).</p>\\n            </li>\\n         </ul>\\n         <p>For details, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/alias-access.html\\\">Controlling access to aliases</a> in the <i>Key Management Service Developer Guide</i>.</p>\\n         <p>\\n            <b>Related operations:</b>\\n         </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a>DeleteAlias</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>ListAliases</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>UpdateAlias</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>\\n            <b>Eventual consistency</b>: The KMS API follows an eventual consistency model. \\n  For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/accessing-kms.html#programming-eventual-consistency\\\">KMS eventual consistency</a>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To create an alias\",\n                        \"documentation\": \"The following example creates an alias for the specified KMS key.\",\n                        \"input\": {\n                            \"AliasName\": \"alias/ExampleAlias\",\n                            \"TargetKeyId\": \"1234abcd-12ab-34cd-56ef-1234567890ab\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.kms#CreateAliasRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AliasName\": {\n                    \"target\": \"com.amazonaws.kms#AliasNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the alias name. This value must begin with <code>alias/</code> followed by a\\n      name, such as <code>alias/ExampleAlias</code>. </p>\\n         <important>\\n            <p>Do not include confidential or sensitive information in this field. This field may be displayed in plaintext in CloudTrail logs and other output.</p>\\n         </important>\\n         <p>The <code>AliasName</code> value must be string of 1-256 characters. It can contain only\\n      alphanumeric characters, forward slashes (/), underscores (_), and dashes (-). The alias name\\n      cannot begin with <code>alias/aws/</code>. The <code>alias/aws/</code> prefix is reserved for\\n        <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-key\\\">Amazon Web Services managed\\n        keys</a>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TargetKeyId\": {\n                    \"target\": \"com.amazonaws.kms#KeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Associates the alias with the specified <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-mgn-key\\\">customer managed key</a>. The KMS key\\n      must be in the same Amazon Web Services Region. </p>\\n         <p>A valid key ID is required. If you supply a null or empty string value, this operation\\n      returns an error.</p>\\n         <p>For help finding the key ID and ARN, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/find-cmk-id-arn.html\\\">Find the key ID and key ARN</a> in\\n      the <i>\\n               <i>Key Management Service Developer Guide</i>\\n            </i>.</p>\\n         <p>Specify the key ID or key ARN of the KMS key.</p>\\n         <p>For example:</p>\\n         <ul>\\n            <li>\\n               <p>Key ID: <code>1234abcd-12ab-34cd-56ef-1234567890ab</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Key ARN: <code>arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>To get the key ID and key ARN for a KMS key, use <a>ListKeys</a> or <a>DescribeKey</a>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.kms#CreateCustomKeyStore\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.kms#CreateCustomKeyStoreRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.kms#CreateCustomKeyStoreResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.kms#CloudHsmClusterInUseException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#CloudHsmClusterInvalidConfigurationException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#CloudHsmClusterNotActiveException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#CloudHsmClusterNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#CustomKeyStoreNameInUseException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#IncorrectTrustAnchorException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInternalException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#XksProxyIncorrectAuthenticationCredentialException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#XksProxyInvalidConfigurationException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#XksProxyInvalidResponseException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#XksProxyUriEndpointInUseException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#XksProxyUriInUseException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#XksProxyUriUnreachableException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#XksProxyVpcEndpointServiceInUseException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#XksProxyVpcEndpointServiceInvalidConfigurationException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#XksProxyVpcEndpointServiceNotFoundException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates a <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/key-store-overview.html\\\">custom key store</a> backed by a key store that you own and manage. When you use a\\n      KMS key in a custom key store for a cryptographic operation, the cryptographic operation is\\n      actually performed in your key store using your keys. KMS supports <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/keystore-cloudhsm.html\\\">CloudHSM key stores</a>\\n      backed by an <a href=\\\"https://docs.aws.amazon.com/cloudhsm/latest/userguide/clusters.html\\\">CloudHSM cluster</a>\\n      and <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/keystore-external.html\\\">external key\\n        stores</a> backed by an external key store proxy and external key manager outside of\\n      Amazon Web Services.</p>\\n         <p> This operation is part of the custom key stores feature in KMS, which\\ncombines the convenience and extensive integration of KMS with the isolation and control of a\\nkey store that you own and manage.</p>\\n         <p>Before you create the custom key store, the required elements must be in place and\\n      operational. We recommend that you use the test tools that KMS provides to verify the\\n      configuration your external key store proxy. For details about the required elements and\\n      verification tests, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/create-keystore.html#before-keystore\\\">Assemble the prerequisites (for\\n        CloudHSM key stores)</a> or <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/create-xks-keystore.html#xks-requirements\\\">Assemble the prerequisites (for\\n        external key stores)</a> in the <i>Key Management Service Developer Guide</i>.</p>\\n         <p>To create a custom key store, use the following parameters.</p>\\n         <ul>\\n            <li>\\n               <p>To create an CloudHSM key store, specify the <code>CustomKeyStoreName</code>,\\n            <code>CloudHsmClusterId</code>, <code>KeyStorePassword</code>, and\\n            <code>TrustAnchorCertificate</code>. The <code>CustomKeyStoreType</code> parameter is\\n          optional for CloudHSM key stores. If you include it, set it to the default value,\\n            <code>AWS_CLOUDHSM</code>. For help with failures, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/fix-keystore.html\\\">Troubleshooting an CloudHSM key store</a> in the\\n          <i>Key Management Service Developer Guide</i>.</p>\\n            </li>\\n            <li>\\n               <p>To create an external key store, specify the <code>CustomKeyStoreName</code> and a\\n            <code>CustomKeyStoreType</code> of <code>EXTERNAL_KEY_STORE</code>. Also, specify values\\n          for <code>XksProxyConnectivity</code>, <code>XksProxyAuthenticationCredential</code>,\\n            <code>XksProxyUriEndpoint</code>, and <code>XksProxyUriPath</code>. If your\\n            <code>XksProxyConnectivity</code> value is <code>VPC_ENDPOINT_SERVICE</code>, specify\\n          the <code>XksProxyVpcEndpointServiceName</code> parameter. For help with failures, see\\n            <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/xks-troubleshooting.html\\\">Troubleshooting\\n            an external key store</a> in the <i>Key Management Service Developer Guide</i>.</p>\\n            </li>\\n         </ul>\\n         <note>\\n            <p>For external key stores:</p>\\n            <p>Some external key managers provide a simpler method for creating an external key store.\\n        For details, see your external key manager documentation.</p>\\n            <p>When creating an external key store in the KMS console, you can upload a JSON-based\\n        proxy configuration file with the desired values. You cannot use a proxy configuration with\\n        the <code>CreateCustomKeyStore</code> operation. However, you can use the values in the file\\n        to help you determine the correct values for the <code>CreateCustomKeyStore</code>\\n        parameters.</p>\\n         </note>\\n         <p>When the operation completes successfully, it returns the ID of the new custom key store.\\n      Before you can use your new custom key store, you need to use the <a>ConnectCustomKeyStore</a> operation to connect a new CloudHSM key store to its CloudHSM\\n      cluster, or to connect a new external key store to the external key store proxy for your\\n      external key manager. Even if you are not going to use your custom key store immediately, you\\n      might want to connect it to verify that all settings are correct and then disconnect it until\\n      you are ready to use it.</p>\\n         <p>\\n            <b>Cross-account use</b>: No. You cannot perform this operation on a custom key store in a different Amazon Web Services account.</p>\\n         <p>\\n            <b>Required permissions</b>: <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/kms-api-permissions-reference.html\\\">kms:CreateCustomKeyStore</a> (IAM policy).</p>\\n         <p>\\n            <b>Related operations:</b>\\n         </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a>ConnectCustomKeyStore</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>DeleteCustomKeyStore</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>DescribeCustomKeyStores</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>DisconnectCustomKeyStore</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>UpdateCustomKeyStore</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>\\n            <b>Eventual consistency</b>: The KMS API follows an eventual consistency model. \\n  For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/accessing-kms.html#programming-eventual-consistency\\\">KMS eventual consistency</a>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To create an AWS CloudHSM key store\",\n                        \"documentation\": \"This example creates a custom key store that is associated with an AWS CloudHSM cluster.\",\n                        \"input\": {\n                            \"CustomKeyStoreName\": \"ExampleKeyStore\",\n                            \"CloudHsmClusterId\": \"cluster-234abcdefABC\",\n                            \"TrustAnchorCertificate\": \"<certificate-goes-here>\",\n                            \"KeyStorePassword\": \"kmsPswd\"\n                        },\n                        \"output\": {\n                            \"CustomKeyStoreId\": \"cks-1234567890abcdef0\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.kms#CreateCustomKeyStoreRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CustomKeyStoreName\": {\n                    \"target\": \"com.amazonaws.kms#CustomKeyStoreNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies a friendly name for the custom key store. The name must be unique in your\\n      Amazon Web Services account and Region. This parameter is required for all custom key stores.</p>\\n         <important>\\n            <p>Do not include confidential or sensitive information in this field. This field may be displayed in plaintext in CloudTrail logs and other output.</p>\\n         </important>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"CloudHsmClusterId\": {\n                    \"target\": \"com.amazonaws.kms#CloudHsmClusterIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Identifies the CloudHSM cluster for an CloudHSM key store. This parameter is required for custom\\n      key stores with <code>CustomKeyStoreType</code> of <code>AWS_CLOUDHSM</code>.</p>\\n         <p>Enter the cluster ID of any active CloudHSM cluster that is not already associated with a\\n      custom key store. To find the cluster ID, use the <a href=\\\"https://docs.aws.amazon.com/cloudhsm/latest/APIReference/API_DescribeClusters.html\\\">DescribeClusters</a> operation.</p>\"\n                    }\n                },\n                \"TrustAnchorCertificate\": {\n                    \"target\": \"com.amazonaws.kms#TrustAnchorCertificateType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the certificate for an CloudHSM key store. This parameter is required for custom\\n      key stores with a <code>CustomKeyStoreType</code> of <code>AWS_CLOUDHSM</code>.</p>\\n         <p>Enter the content of the trust anchor certificate for the CloudHSM cluster. This is the\\n      content of the <code>customerCA.crt</code> file that you created when you <a href=\\\"https://docs.aws.amazon.com/cloudhsm/latest/userguide/initialize-cluster.html\\\">initialized the\\n        cluster</a>.</p>\"\n                    }\n                },\n                \"KeyStorePassword\": {\n                    \"target\": \"com.amazonaws.kms#KeyStorePasswordType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the <code>kmsuser</code> password for an CloudHSM key store. This parameter is\\n      required for custom key stores with a <code>CustomKeyStoreType</code> of\\n        <code>AWS_CLOUDHSM</code>.</p>\\n         <p>Enter the password of the <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/keystore-cloudhsm.html#concept-kmsuser\\\">\\n               <code>kmsuser</code> crypto user\\n        (CU) account</a> in the specified CloudHSM cluster. KMS logs into the cluster as this\\n      user to manage key material on your behalf.</p>\\n         <p>The password must be a string of 7 to 32 characters. Its value is case sensitive.</p>\\n         <p>This parameter tells KMS the <code>kmsuser</code> account password; it does not change\\n      the password in the CloudHSM cluster.</p>\"\n                    }\n                },\n                \"CustomKeyStoreType\": {\n                    \"target\": \"com.amazonaws.kms#CustomKeyStoreType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the type of custom key store. The default value is\\n      <code>AWS_CLOUDHSM</code>.</p>\\n         <p>For a custom key store backed by an CloudHSM cluster, omit the parameter or enter\\n        <code>AWS_CLOUDHSM</code>. For a custom key store backed by an external key manager outside\\n      of Amazon Web Services, enter <code>EXTERNAL_KEY_STORE</code>. You cannot change this property after the key\\n      store is created.</p>\"\n                    }\n                },\n                \"XksProxyUriEndpoint\": {\n                    \"target\": \"com.amazonaws.kms#XksProxyUriEndpointType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the endpoint that KMS uses to send requests to the external key store proxy\\n      (XKS proxy). This parameter is required for custom key stores with a\\n        <code>CustomKeyStoreType</code> of <code>EXTERNAL_KEY_STORE</code>.</p>\\n         <p>The protocol must be HTTPS. KMS communicates on port 443. Do not specify the port in the\\n        <code>XksProxyUriEndpoint</code> value.</p>\\n         <p>For external key stores with <code>XksProxyConnectivity</code> value of\\n        <code>VPC_ENDPOINT_SERVICE</code>, specify <code>https://</code> followed by the private DNS\\n      name of the VPC endpoint service.</p>\\n         <p>For external key stores with <code>PUBLIC_ENDPOINT</code> connectivity, this endpoint must\\n      be reachable before you create the custom key store. KMS connects to the external key store\\n      proxy while creating the custom key store. For external key stores with\\n        <code>VPC_ENDPOINT_SERVICE</code> connectivity, KMS connects when you call the <a>ConnectCustomKeyStore</a> operation.</p>\\n         <p>The value of this parameter must begin with <code>https://</code>. The remainder can\\n      contain upper and lower case letters (A-Z and a-z), numbers (0-9), dots (<code>.</code>), and\\n      hyphens (<code>-</code>). Additional slashes (<code>/</code> and <code>\\\\</code>) are not\\n      permitted.</p>\\n         <p>\\n            <b>Uniqueness requirements: </b>\\n         </p>\\n         <ul>\\n            <li>\\n               <p>The combined <code>XksProxyUriEndpoint</code> and <code>XksProxyUriPath</code> values\\n          must be unique in the Amazon Web Services account and Region.</p>\\n            </li>\\n            <li>\\n               <p>An external key store with <code>PUBLIC_ENDPOINT</code> connectivity cannot use the\\n          same <code>XksProxyUriEndpoint</code> value as an external key store with\\n            <code>VPC_ENDPOINT_SERVICE</code> connectivity in this Amazon Web Services Region.</p>\\n            </li>\\n            <li>\\n               <p>Each external key store with <code>VPC_ENDPOINT_SERVICE</code> connectivity must have\\n          its own private DNS name. The <code>XksProxyUriEndpoint</code> value for external key\\n          stores with <code>VPC_ENDPOINT_SERVICE</code> connectivity (private DNS name) must be\\n          unique in the Amazon Web Services account and Region.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"XksProxyUriPath\": {\n                    \"target\": \"com.amazonaws.kms#XksProxyUriPathType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the base path to the proxy APIs for this external key store. To find this value,\\n      see the documentation for your external key store proxy. This parameter is required for all\\n      custom key stores with a <code>CustomKeyStoreType</code> of\\n      <code>EXTERNAL_KEY_STORE</code>.</p>\\n         <p>The value must start with <code>/</code> and must end with <code>/kms/xks/v1</code> where\\n        <code>v1</code> represents the version of the KMS external key store proxy API. This path\\n      can include an optional prefix between the required elements such as\\n          <code>/<i>prefix</i>/kms/xks/v1</code>.</p>\\n         <p>\\n            <b>Uniqueness requirements: </b>\\n         </p>\\n         <ul>\\n            <li>\\n               <p>The combined <code>XksProxyUriEndpoint</code> and <code>XksProxyUriPath</code> values\\n          must be unique in the Amazon Web Services account and Region.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"XksProxyVpcEndpointServiceName\": {\n                    \"target\": \"com.amazonaws.kms#XksProxyVpcEndpointServiceNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the name of the Amazon VPC endpoint service for interface endpoints that is used to\\n      communicate with your external key store proxy (XKS proxy). This parameter is required when\\n      the value of <code>CustomKeyStoreType</code> is <code>EXTERNAL_KEY_STORE</code> and the value\\n      of <code>XksProxyConnectivity</code> is <code>VPC_ENDPOINT_SERVICE</code>.</p>\\n         <p>The Amazon VPC endpoint service must <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/create-xks-keystore.html#xks-requirements\\\">fulfill all\\n        requirements</a> for use with an external key store. </p>\\n         <p>\\n            <b>Uniqueness requirements:</b>\\n         </p>\\n         <ul>\\n            <li>\\n               <p>External key stores with <code>VPC_ENDPOINT_SERVICE</code> connectivity can share an\\n          Amazon VPC, but each external key store must have its own VPC endpoint service and private DNS\\n          name.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"XksProxyAuthenticationCredential\": {\n                    \"target\": \"com.amazonaws.kms#XksProxyAuthenticationCredentialType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies an authentication credential for the external key store proxy (XKS proxy). This\\n      parameter is required for all custom key stores with a <code>CustomKeyStoreType</code> of\\n        <code>EXTERNAL_KEY_STORE</code>.</p>\\n         <p>The <code>XksProxyAuthenticationCredential</code> has two required elements:\\n        <code>RawSecretAccessKey</code>, a secret key, and <code>AccessKeyId</code>, a unique\\n      identifier for the <code>RawSecretAccessKey</code>. For character requirements, see <a href=\\\"API_XksProxyAuthenticationCredentialType.html\\\">XksProxyAuthenticationCredentialType</a>.</p>\\n         <p>KMS uses this authentication credential to sign requests to the external key store proxy\\n      on your behalf. This credential is unrelated to Identity and Access Management (IAM) and Amazon Web Services credentials.</p>\\n         <p>This parameter doesn't set or change the authentication credentials on the XKS proxy. It\\n      just tells KMS the credential that you established on your external key store proxy. If you\\n      rotate your proxy authentication credential, use the <a>UpdateCustomKeyStore</a>\\n      operation to provide the new credential to KMS.</p>\"\n                    }\n                },\n                \"XksProxyConnectivity\": {\n                    \"target\": \"com.amazonaws.kms#XksProxyConnectivityType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates how KMS communicates with the external key store proxy. This parameter is\\n      required for custom key stores with a <code>CustomKeyStoreType</code> of\\n        <code>EXTERNAL_KEY_STORE</code>.</p>\\n         <p>If the external key store proxy uses a public endpoint, specify\\n        <code>PUBLIC_ENDPOINT</code>. If the external key store proxy uses a Amazon VPC\\n      endpoint service for communication with KMS, specify <code>VPC_ENDPOINT_SERVICE</code>. For\\n      help making this choice, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/choose-xks-connectivity.html\\\">Choosing a connectivity option</a> in\\n      the <i>Key Management Service Developer Guide</i>.</p>\\n         <p>An Amazon VPC endpoint service keeps your communication with KMS in a private address space\\n      entirely within Amazon Web Services, but it requires more configuration, including establishing a Amazon VPC with multiple subnets, a VPC endpoint service, a network load balancer, and a\\n      verified private DNS name. A public endpoint is simpler to set up, but it might be slower and\\n      might not fulfill your security requirements. You might consider testing with a public\\n      endpoint, and then establishing a VPC endpoint service for production tasks. Note that this\\n      choice does not determine the location of the external key store proxy. Even if you choose a\\n      VPC endpoint service, the proxy can be hosted within the VPC or outside of Amazon Web Services such as in\\n      your corporate data center.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.kms#CreateCustomKeyStoreResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CustomKeyStoreId\": {\n                    \"target\": \"com.amazonaws.kms#CustomKeyStoreIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A unique identifier for the new custom key store.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.kms#CreateGrant\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.kms#CreateGrantRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.kms#CreateGrantResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.kms#DependencyTimeoutException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#DisabledException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#DryRunOperationException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#InvalidArnException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#InvalidGrantTokenException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInternalException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInvalidStateException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#NotFoundException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Adds a grant to a KMS key. </p>\\n         <p>A <i>grant</i> is a policy instrument that allows Amazon Web Services principals to use\\n      KMS keys in cryptographic operations. It also can allow them to view a KMS key (<a>DescribeKey</a>) and create and manage grants. When authorizing access to a KMS key,\\n      grants are considered along with key policies and IAM policies. Grants are often used for\\n      temporary permissions because you can create one, use its permissions, and delete it without\\n      changing your key policies or IAM policies. </p>\\n         <p>For detailed information about grants, including grant terminology, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/grants.html\\\">Grants in KMS</a> in the\\n        <i>\\n               <i>Key Management Service Developer Guide</i>\\n            </i>. For examples of creating grants in several\\n      programming languages, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/example_kms_CreateGrant_section.html\\\">Use CreateGrant with an Amazon Web Services SDK or CLI</a>. </p>\\n         <p>The <code>CreateGrant</code> operation returns a <code>GrantToken</code> and a\\n        <code>GrantId</code>.</p>\\n         <ul>\\n            <li>\\n               <p>When you create, retire, or revoke a grant, there might be a brief delay, usually less than five minutes, until the grant is available throughout KMS. This state is known as <i>eventual consistency</i>. Once the grant has achieved eventual consistency, the grantee\\n          principal can use the permissions in the grant without identifying the grant. </p>\\n               <p>However, to use the permissions in the grant immediately, use the\\n            <code>GrantToken</code> that <code>CreateGrant</code> returns. For details, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/using-grant-token.html\\\">Using a grant\\n            token</a> in the <i>\\n                     <i>Key Management Service Developer Guide</i>\\n                  </i>.</p>\\n            </li>\\n            <li>\\n               <p>The <code>CreateGrant</code> operation also returns a <code>GrantId</code>. You can\\n          use the <code>GrantId</code> and a key identifier to identify the grant in the <a>RetireGrant</a> and <a>RevokeGrant</a> operations. To find the grant\\n          ID, use the <a>ListGrants</a> or <a>ListRetirableGrants</a>\\n          operations.</p>\\n            </li>\\n         </ul>\\n         <p>The KMS key that you use for this operation must be in a compatible key state. For\\ndetails, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/key-state.html\\\">Key states of KMS keys</a> in the <i>Key Management Service Developer Guide</i>.</p>\\n         <p>\\n            <b>Cross-account use</b>: Yes. To perform this operation on a KMS key in a different Amazon Web Services account, specify the key\\n  ARN in the value of the <code>KeyId</code> parameter. </p>\\n         <p>\\n            <b>Required permissions</b>: <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/kms-api-permissions-reference.html\\\">kms:CreateGrant</a> (key policy)</p>\\n         <p>\\n            <b>Related operations:</b>\\n         </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a>ListGrants</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>ListRetirableGrants</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>RetireGrant</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>RevokeGrant</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>\\n            <b>Eventual consistency</b>: The KMS API follows an eventual consistency model. \\n  For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/accessing-kms.html#programming-eventual-consistency\\\">KMS eventual consistency</a>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To create a grant\",\n                        \"documentation\": \"The following example creates a grant that allows the specified IAM role to encrypt data with the specified KMS key.\",\n                        \"input\": {\n                            \"KeyId\": \"arn:aws:kms:us-east-2:444455556666:key/1234abcd-12ab-34cd-56ef-1234567890ab\",\n                            \"GranteePrincipal\": \"arn:aws:iam::111122223333:role/ExampleRole\",\n                            \"Operations\": [\n                                \"Encrypt\",\n                                \"Decrypt\"\n                            ]\n                        },\n                        \"output\": {\n                            \"GrantToken\": \"AQpAM2RhZTk1MGMyNTk2ZmZmMzEyYWVhOWViN2I1MWM4Mzc0MWFiYjc0ZDE1ODkyNGFlNTIzODZhMzgyZjBlNGY3NiKIAgEBAgB4Pa6VDCWW__MSrqnre1HIN0Grt00ViSSuUjhqOC8OT3YAAADfMIHcBgkqhkiG9w0BBwaggc4wgcsCAQAwgcUGCSqGSIb3DQEHATAeBglghkgBZQMEAS4wEQQMmqLyBTAegIn9XlK5AgEQgIGXZQjkBcl1dykDdqZBUQ6L1OfUivQy7JVYO2-ZJP7m6f1g8GzV47HX5phdtONAP7K_HQIflcgpkoCqd_fUnE114mSmiagWkbQ5sqAVV3ov-VeqgrvMe5ZFEWLMSluvBAqdjHEdMIkHMlhlj4ENZbzBfo9Wxk8b8SnwP4kc4gGivedzFXo-dwN8fxjjq_ZZ9JFOj2ijIbj5FyogDCN0drOfi8RORSEuCEmPvjFRMFAwcmwFkN2NPp89amA\",\n                            \"GrantId\": \"0c237476b39f8bc44e45212e08498fbe3151305030726c0590dd8d3e9f3d6a60\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.kms#CreateGrantRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"KeyId\": {\n                    \"target\": \"com.amazonaws.kms#KeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Identifies the KMS key for the grant. The grant gives principals permission to use this\\n      KMS key.</p>\\n         <p>Specify the key ID or key ARN of the KMS key. To specify a KMS key in a\\ndifferent Amazon Web Services account, you must use the key ARN.</p>\\n         <p>For example:</p>\\n         <ul>\\n            <li>\\n               <p>Key ID: <code>1234abcd-12ab-34cd-56ef-1234567890ab</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Key ARN: <code>arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>To get the key ID and key ARN for a KMS key, use <a>ListKeys</a> or <a>DescribeKey</a>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"GranteePrincipal\": {\n                    \"target\": \"com.amazonaws.kms#PrincipalIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The identity that gets the permissions specified in the grant.</p>\\n         <p>To specify the grantee principal, use the Amazon Resource Name (ARN) of an Amazon Web Services\\n      principal. Valid principals include Amazon Web Services accounts, IAM users, IAM roles,\\n      federated users, and assumed role users. For help with the ARN syntax for a principal, see\\n        <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html#identifiers-arns\\\">IAM ARNs</a> in the <i>\\n               <i>Identity and Access Management User Guide</i>\\n            </i>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"RetiringPrincipal\": {\n                    \"target\": \"com.amazonaws.kms#PrincipalIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The principal that has permission to use the <a>RetireGrant</a> operation to\\n      retire the grant. </p>\\n         <p>To specify the principal, use the <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html\\\">Amazon Resource Name (ARN)</a> of an\\n      Amazon Web Services principal. Valid principals include Amazon Web Services accounts, IAM users, IAM roles,\\n      federated users, and assumed role users. For help with the ARN syntax for a principal, see\\n        <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html#identifiers-arns\\\">IAM ARNs</a> in the <i>\\n               <i>Identity and Access Management User Guide</i>\\n            </i>.</p>\\n         <p>The grant determines the retiring principal. Other principals might have permission to\\n      retire the grant or revoke the grant. For details, see <a>RevokeGrant</a> and\\n        <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/grant-delete.html\\\">Retiring and revoking\\n        grants</a> in the <i>Key Management Service Developer Guide</i>. </p>\"\n                    }\n                },\n                \"Operations\": {\n                    \"target\": \"com.amazonaws.kms#GrantOperationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of operations that the grant permits. </p>\\n         <p>This list must include only operations that are permitted in a grant. Also, the operation\\n      must be supported on the KMS key. For example, you cannot create a grant for a symmetric\\n      encryption KMS key that allows the <a>Sign</a> operation, or a grant for an\\n      asymmetric KMS key that allows the <a>GenerateDataKey</a> operation. If you try,\\n      KMS returns a <code>ValidationError</code> exception. For details, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/grants.html#terms-grant-operations\\\">Grant\\n        operations</a> in the <i>Key Management Service Developer Guide</i>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Constraints\": {\n                    \"target\": \"com.amazonaws.kms#GrantConstraints\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies a grant constraint.</p>\\n         <important>\\n            <p>Do not include confidential or sensitive information in this field. This field may be displayed in plaintext in CloudTrail logs and other output.</p>\\n         </important>\\n         <p>KMS supports the <code>EncryptionContextEquals</code> and\\n        <code>EncryptionContextSubset</code> grant constraints, which allow the permissions in the\\n      grant only when the encryption context in the request matches\\n        (<code>EncryptionContextEquals</code>) or includes (<code>EncryptionContextSubset</code>)\\n      the encryption context specified in the constraint. </p>\\n         <p>The encryption context grant constraints are supported only on <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/grants.html#terms-grant-operations\\\">grant operations</a> that include\\n      an <code>EncryptionContext</code> parameter, such as cryptographic operations on symmetric\\n      encryption KMS keys. Grants with grant constraints can include the <a>DescribeKey</a> and <a>RetireGrant</a> operations, but the constraint doesn't apply to these\\n      operations. If a grant with a grant constraint includes the <code>CreateGrant</code>\\n      operation, the constraint requires that any grants created with the <code>CreateGrant</code>\\n      permission have an equally strict or stricter encryption context constraint.</p>\\n         <p>You cannot use an encryption context grant constraint for cryptographic operations with\\n      asymmetric KMS keys or HMAC KMS keys. Operations with these keys don't support an encryption\\n      context.</p>\\n         <p>Each constraint value can include up to 8 encryption context pairs. The encryption context\\n      value in each constraint cannot exceed 384 characters. For information about grant\\n      constraints, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/create-grant-overview.html#grant-constraints\\\">Using grant\\n        constraints</a> in the <i>Key Management Service Developer Guide</i>. For more information about encryption context,\\n      see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#encrypt_context\\\">Encryption\\n        context</a> in the <i>\\n               <i>Key Management Service Developer Guide</i>\\n            </i>. </p>\"\n                    }\n                },\n                \"GrantTokens\": {\n                    \"target\": \"com.amazonaws.kms#GrantTokenList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of grant tokens. </p>\\n         <p>Use a grant token when your permission to call this operation comes from a new grant that has not yet achieved <i>eventual consistency</i>. For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/grants.html#grant_token\\\">Grant token</a> and <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/using-grant-token.html\\\">Using a grant token</a> in the\\n    <i>Key Management Service Developer Guide</i>.</p>\"\n                    }\n                },\n                \"Name\": {\n                    \"target\": \"com.amazonaws.kms#GrantNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A friendly name for the grant. Use this value to prevent the unintended creation of\\n      duplicate grants when retrying this request.</p>\\n         <important>\\n            <p>Do not include confidential or sensitive information in this field. This field may be displayed in plaintext in CloudTrail logs and other output.</p>\\n         </important>\\n         <p>When this value is absent, all <code>CreateGrant</code> requests result in a new grant\\n      with a unique <code>GrantId</code> even if all the supplied parameters are identical. This can\\n      result in unintended duplicates when you retry the <code>CreateGrant</code> request.</p>\\n         <p>When this value is present, you can retry a <code>CreateGrant</code> request with\\n      identical parameters; if the grant already exists, the original <code>GrantId</code> is\\n      returned without creating a new grant. Note that the returned grant token is unique with every\\n        <code>CreateGrant</code> request, even when a duplicate <code>GrantId</code> is returned.\\n      All grant tokens for the same grant ID can be used interchangeably.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.kms#NullableBooleanType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks if your request will succeed. <code>DryRun</code> is an optional parameter. </p>\\n         <p>To learn more about how to use this parameter, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/testing-permissions.html\\\">Testing your permissions</a> in the <i>Key Management Service Developer Guide</i>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.kms#CreateGrantResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"GrantToken\": {\n                    \"target\": \"com.amazonaws.kms#GrantTokenType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The grant token.</p>\\n         <p>Use a grant token when your permission to call this operation comes from a new grant that has not yet achieved <i>eventual consistency</i>. For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/grants.html#grant_token\\\">Grant token</a> and <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/using-grant-token.html\\\">Using a grant token</a> in the\\n    <i>Key Management Service Developer Guide</i>.</p>\"\n                    }\n                },\n                \"GrantId\": {\n                    \"target\": \"com.amazonaws.kms#GrantIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The unique identifier for the grant.</p>\\n         <p>You can use the <code>GrantId</code> in a <a>ListGrants</a>, <a>RetireGrant</a>, or <a>RevokeGrant</a> operation.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.kms#CreateKey\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.kms#CreateKeyRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.kms#CreateKeyResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.kms#CloudHsmClusterInvalidConfigurationException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#CustomKeyStoreInvalidStateException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#CustomKeyStoreNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#DependencyTimeoutException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#InvalidArnException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInternalException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#MalformedPolicyDocumentException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#TagException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#UnsupportedOperationException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#XksKeyAlreadyInUseException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#XksKeyInvalidConfigurationException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#XksKeyNotFoundException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates a unique customer managed <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#kms-keys\\\">KMS key</a> in your Amazon Web Services account and Region.\\n      You can use a KMS key in cryptographic operations, such as encryption and signing. Some Amazon Web Services\\n      services let you use KMS keys that you create and manage to protect your service\\n      resources.</p>\\n         <p>A KMS key is a logical representation of a cryptographic key. In addition to the key\\n      material used in cryptographic operations, a KMS key includes metadata, such as the key ID,\\n      key policy, creation date, description, and key state. </p>\\n         <p>Use the parameters of <code>CreateKey</code> to specify the type of KMS key, the source of\\n      its key material, its key policy, description, tags, and other properties.</p>\\n         <note>\\n            <p>KMS has replaced the term <i>customer master key (CMK)</i> with <i>Key Management Service key</i> \\n  and <i>KMS key</i>. The concept has not changed. To prevent breaking changes, KMS is keeping some variations of this term.</p>\\n         </note>\\n         <p>To create different types of KMS keys, use the following guidance:</p>\\n         <dl>\\n            <dt>Symmetric encryption KMS key</dt>\\n            <dd>\\n               <p>By default, <code>CreateKey</code> creates a symmetric encryption KMS key with key\\n            material that KMS generates. This is the basic and most widely used type of KMS key, and\\n            provides the best performance.</p>\\n               <p>To create a symmetric encryption KMS key, you don't need to specify any parameters.\\n            The default value for <code>KeySpec</code>, <code>SYMMETRIC_DEFAULT</code>, the default\\n            value for <code>KeyUsage</code>, <code>ENCRYPT_DECRYPT</code>, and the default value for\\n              <code>Origin</code>, <code>AWS_KMS</code>, create a symmetric encryption KMS key with\\n            KMS key material.</p>\\n               <p>If you need a key for basic encryption and decryption or you are creating a KMS key\\n            to protect your resources in an Amazon Web Services service, create a symmetric encryption KMS key.\\n            The key material in a symmetric encryption key never leaves KMS unencrypted. You can\\n            use a symmetric encryption KMS key to encrypt and decrypt data up to 4,096 bytes, but\\n            they are typically used to generate data keys and data keys pairs. For details, see\\n              <a>GenerateDataKey</a> and <a>GenerateDataKeyPair</a>.</p>\\n               <p> </p>\\n            </dd>\\n            <dt>Asymmetric KMS keys</dt>\\n            <dd>\\n               <p>To create an asymmetric KMS key, use the <code>KeySpec</code> parameter to specify\\n            the type of key material in the KMS key. Then, use the <code>KeyUsage</code> parameter\\n            to determine whether the KMS key will be used to encrypt and decrypt or sign and verify.\\n            You can't change these properties after the KMS key is created.</p>\\n               <p>Asymmetric KMS keys contain an RSA key pair, Elliptic Curve (ECC) key pair, ML-DSA\\n            key pair or an SM2 key pair (China Regions only). The private key in an asymmetric KMS\\n            key never leaves KMS unencrypted. However, you can use the <a>GetPublicKey</a> operation to download the public key so it can be used\\n            outside of KMS. Each KMS key can have only one key usage. KMS keys with RSA key pairs\\n            can be used to encrypt and decrypt data or sign and verify messages (but not both). KMS\\n            keys with NIST-recommended ECC key pairs can be used to sign and verify messages or\\n            derive shared secrets (but not both). KMS keys with <code>ECC_SECG_P256K1</code> can be\\n            used only to sign and verify messages. KMS keys with ML-DSA key pairs can be used to\\n            sign and verify messages. KMS keys with SM2 key pairs (China Regions only) can be used\\n            to either encrypt and decrypt data, sign and verify messages, or derive shared secrets\\n            (you must choose one key usage type). For information about asymmetric KMS keys, see\\n              <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/symmetric-asymmetric.html\\\">Asymmetric\\n              KMS keys</a> in the <i>Key Management Service Developer Guide</i>.</p>\\n               <p> </p>\\n            </dd>\\n            <dt>HMAC KMS key</dt>\\n            <dd>\\n               <p>To create an HMAC KMS key, set the <code>KeySpec</code> parameter to a key spec\\n            value for HMAC KMS keys. Then set the <code>KeyUsage</code> parameter to\\n              <code>GENERATE_VERIFY_MAC</code>. You must set the key usage even though\\n              <code>GENERATE_VERIFY_MAC</code> is the only valid key usage value for HMAC KMS keys.\\n            You can't change these properties after the KMS key is created.</p>\\n               <p>HMAC KMS keys are symmetric keys that never leave KMS unencrypted. You can use\\n            HMAC keys to generate (<a>GenerateMac</a>) and verify (<a>VerifyMac</a>) HMAC codes for messages up to 4096 bytes.</p>\\n               <p> </p>\\n            </dd>\\n            <dt>Multi-Region primary keys</dt>\\n            <dt>Imported key material</dt>\\n            <dd>\\n               <p>To create a multi-Region <i>primary key</i> in the local Amazon Web Services Region,\\n            use the <code>MultiRegion</code> parameter with a value of <code>True</code>. To create\\n            a multi-Region <i>replica key</i>, that is, a KMS key with the same key ID\\n            and key material as a primary key, but in a different Amazon Web Services Region, use the <a>ReplicateKey</a> operation. To change a replica key to a primary key, and its\\n            primary key to a replica key, use the <a>UpdatePrimaryRegion</a>\\n            operation.</p>\\n               <p>You can create multi-Region KMS keys for all supported KMS key types: symmetric\\n            encryption KMS keys, HMAC KMS keys, asymmetric encryption KMS keys, and asymmetric\\n            signing KMS keys. You can also create multi-Region keys with imported key material.\\n            However, you can't create multi-Region keys in a custom key store.</p>\\n               <p>This operation supports <i>multi-Region keys</i>, an KMS feature that lets you create multiple\\n      interoperable KMS keys in different Amazon Web Services Regions. Because these KMS keys have the same key ID, key\\n      material, and other metadata, you can use them interchangeably to encrypt data in one Amazon Web Services Region and decrypt\\n      it in a different Amazon Web Services Region without re-encrypting the data or making a cross-Region call. For more information about multi-Region keys, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/multi-region-keys-overview.html\\\">Multi-Region keys in KMS</a> in the <i>Key Management Service Developer Guide</i>.</p>\\n               <p> </p>\\n            </dd>\\n            <dd>\\n               <p>To import your own key material into a KMS key, begin by creating a KMS key with no\\n            key material. To do this, use the <code>Origin</code> parameter of\\n              <code>CreateKey</code> with a value of <code>EXTERNAL</code>. Next, use <a>GetParametersForImport</a> operation to get a public key and import token. Use\\n            the wrapping public key to encrypt your key material. Then, use <a>ImportKeyMaterial</a> with your import token to import the key material. For\\n            step-by-step instructions, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/importing-keys.html\\\">Importing Key Material</a> in the <i>\\n                     <i>Key Management Service Developer Guide</i>\\n                  </i>.</p>\\n               <p>You can import key material into KMS keys of all supported KMS key types: symmetric\\n            encryption KMS keys, HMAC KMS keys, asymmetric encryption KMS keys, and asymmetric\\n            signing KMS keys. You can also create multi-Region keys with imported key material.\\n            However, you can't import key material into a KMS key in a custom key store.</p>\\n               <p>To create a multi-Region primary key with imported key material, use the\\n              <code>Origin</code> parameter of <code>CreateKey</code> with a value of\\n              <code>EXTERNAL</code> and the <code>MultiRegion</code> parameter with a value of\\n              <code>True</code>. To create replicas of the multi-Region primary key, use the <a>ReplicateKey</a> operation. For instructions, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/importing-keys-create-cmk.html \\\">Importing key material step\\n              1</a>. For more information about multi-Region keys, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/multi-region-keys-overview.html\\\">Multi-Region keys in KMS</a> in the <i>Key Management Service Developer Guide</i>.</p>\\n               <p> </p>\\n            </dd>\\n            <dt>Custom key store</dt>\\n            <dd>\\n               <p>A <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/key-store-overview.html\\\">custom key store</a> lets you protect your Amazon Web Services resources using keys in a backing key\\n            store that you own and manage. When you request a cryptographic operation with a KMS key\\n            in a custom key store, the operation is performed in the backing key store using its\\n            cryptographic keys.</p>\\n               <p>KMS supports <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/keystore-cloudhsm.html\\\">CloudHSM key stores</a> backed by an CloudHSM cluster and <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/keystore-external.html\\\">external key stores</a> backed by an\\n            external key manager outside of Amazon Web Services. When you create a KMS key in an CloudHSM key store,\\n            KMS generates an encryption key in the CloudHSM cluster and associates it with the KMS\\n            key. When you create a KMS key in an external key store, you specify an existing\\n            encryption key in the external key manager.</p>\\n               <note>\\n                  <p>Some external key managers provide a simpler method for creating a KMS key in an\\n              external key store. For details, see your external key manager documentation.</p>\\n               </note>\\n               <p>Before you create a KMS key in a custom key store, the <code>ConnectionState</code>\\n            of the key store must be <code>CONNECTED</code>. To connect the custom key store, use\\n            the <a>ConnectCustomKeyStore</a> operation. To find the\\n              <code>ConnectionState</code>, use the <a>DescribeCustomKeyStores</a>\\n            operation.</p>\\n               <p>To create a KMS key in a custom key store, use the <code>CustomKeyStoreId</code>.\\n            Use the default <code>KeySpec</code> value, <code>SYMMETRIC_DEFAULT</code>, and the\\n            default <code>KeyUsage</code> value, <code>ENCRYPT_DECRYPT</code> to create a symmetric\\n            encryption key. No other key type is supported in a custom key store.</p>\\n               <p>To create a KMS key in an <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/create-cmk-keystore.html\\\">CloudHSM key store</a>, use the\\n              <code>Origin</code> parameter with a value of <code>AWS_CLOUDHSM</code>. The CloudHSM\\n            cluster that is associated with the custom key store must have at least two active HSMs\\n            in different Availability Zones in the Amazon Web Services Region.</p>\\n               <p>To create a KMS key in an <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/create-xks-keys.html\\\">external key store</a>, use the\\n              <code>Origin</code> parameter with a value of <code>EXTERNAL_KEY_STORE</code> and an\\n              <code>XksKeyId</code> parameter that identifies an existing external key.</p>\\n               <note>\\n                  <p>Some external key managers provide a simpler method for creating a KMS key in an\\n              external key store. For details, see your external key manager documentation.</p>\\n               </note>\\n            </dd>\\n         </dl>\\n         <p>\\n            <b>Cross-account use</b>: No. You cannot use this operation to\\n      create a KMS key in a different Amazon Web Services account.</p>\\n         <p>\\n            <b>Required permissions</b>: <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/kms-api-permissions-reference.html\\\">kms:CreateKey</a> (IAM policy). To use the\\n        <code>Tags</code> parameter, <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/kms-api-permissions-reference.html\\\">kms:TagResource</a> (IAM policy). For examples and information about related\\n      permissions, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/customer-managed-policies.html#iam-policy-example-create-key\\\">Allow a user\\n        to create KMS keys</a> in the <i>Key Management Service Developer Guide</i>.</p>\\n         <p>\\n            <b>Related operations:</b>\\n         </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a>DescribeKey</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>ListKeys</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>ScheduleKeyDeletion</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>\\n            <b>Eventual consistency</b>: The KMS API follows an eventual consistency model. \\n  For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/accessing-kms.html#programming-eventual-consistency\\\">KMS eventual consistency</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.kms#CreateKeyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Policy\": {\n                    \"target\": \"com.amazonaws.kms#PolicyType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The key policy to attach to the KMS key.</p>\\n         <p>If you provide a key policy, it must meet the following criteria:</p>\\n         <ul>\\n            <li>\\n               <p>The key policy must allow the calling principal to make a\\n          subsequent <code>PutKeyPolicy</code> request on the KMS key.  This reduces the risk that\\n          the KMS key becomes unmanageable. For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/key-policy-default.html#prevent-unmanageable-key\\\">Default key policy</a> in the <i>Key Management Service Developer Guide</i>. (To omit\\n          this condition, set <code>BypassPolicyLockoutSafetyCheck</code> to true.)</p>\\n            </li>\\n            <li>\\n               <p>Each statement in the key policy must contain one or more principals. The principals\\n          in the key policy must exist and be visible to KMS. When you create a new Amazon Web Services\\n          principal, you might need to enforce a delay before including the new principal in a key\\n          policy because the new principal might not be immediately visible to KMS. For more\\n          information, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/troubleshoot_general.html#troubleshoot_general_eventual-consistency\\\">Changes that I make are not always immediately visible</a> in the <i>Amazon Web Services\\n            Identity and Access Management User Guide</i>.</p>\\n            </li>\\n         </ul>\\n         <note>\\n            <p>If either of the required <code>Resource</code> or <code>Action</code> elements are\\n        missing from a key policy statement, the policy statement has no effect. When a key policy\\n        statement is missing one of these elements, the KMS console correctly reports an error,\\n        but the <code>CreateKey</code> and <code>PutKeyPolicy</code> API requests succeed, even\\n        though the policy statement is ineffective.</p>\\n            <p>For more information on required key policy elements, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/key-policy-overview.html#key-policy-elements\\\">Elements in a key\\n          policy</a> in the <i>Key Management Service Developer Guide</i>.</p>\\n         </note>\\n         <p>If you do not provide a key policy, KMS attaches a default key policy to the KMS key.\\n      For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/key-policy-default.html\\\">Default key policy</a> in the\\n      <i>Key Management Service Developer Guide</i>. </p>\\n         <note>\\n            <p>If the key policy exceeds the length constraint, KMS returns a\\n          <code>LimitExceededException</code>.</p>\\n         </note>\\n         <p>For help writing and formatting a JSON policy document, see the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies.html\\\">IAM JSON Policy Reference</a> in the <i>\\n               <i>Identity and Access Management User Guide</i>\\n            </i>.</p>\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.kms#DescriptionType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A description of the KMS key. Use a description that helps you decide whether the KMS key\\n      is appropriate for a task. The default value is an empty string (no description).</p>\\n         <important>\\n            <p>Do not include confidential or sensitive information in this field. This field may be displayed in plaintext in CloudTrail logs and other output.</p>\\n         </important>\\n         <p>To set or change the description after the key is created, use <a>UpdateKeyDescription</a>.</p>\"\n                    }\n                },\n                \"KeyUsage\": {\n                    \"target\": \"com.amazonaws.kms#KeyUsageType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Determines the <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/kms-cryptography.html#cryptographic-operations\\\">cryptographic operations</a> for which you can use the KMS key. The default value is\\n        <code>ENCRYPT_DECRYPT</code>. This parameter is optional when you are creating a symmetric\\n      encryption KMS key; otherwise, it is required. You can't change the <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html#key-usage\\\">\\n               <code>KeyUsage</code>\\n            </a> value after the KMS key is created. Each KMS key can have\\n      only one key usage. This follows key usage best practices according to <a href=\\\"https://csrc.nist.gov/pubs/sp/800/57/pt1/r5/final\\\">NIST SP 800-57 Recommendations for\\n        Key Management</a>, section 5.2, Key usage.</p>\\n         <p>Select only one valid value.</p>\\n         <ul>\\n            <li>\\n               <p>For symmetric encryption KMS keys, omit the parameter or specify\\n            <code>ENCRYPT_DECRYPT</code>.</p>\\n            </li>\\n            <li>\\n               <p>For HMAC KMS keys (symmetric), specify <code>GENERATE_VERIFY_MAC</code>.</p>\\n            </li>\\n            <li>\\n               <p>For asymmetric KMS keys with RSA key pairs, specify <code>ENCRYPT_DECRYPT</code> or\\n            <code>SIGN_VERIFY</code>.</p>\\n            </li>\\n            <li>\\n               <p>For asymmetric KMS keys with NIST-recommended elliptic curve key pairs, specify\\n            <code>SIGN_VERIFY</code> or <code>KEY_AGREEMENT</code>.</p>\\n            </li>\\n            <li>\\n               <p>For asymmetric KMS keys with <code>ECC_SECG_P256K1</code> key pairs, specify\\n            <code>SIGN_VERIFY</code>.</p>\\n            </li>\\n            <li>\\n               <p>For asymmetric KMS keys with ML-DSA key pairs, specify\\n          <code>SIGN_VERIFY</code>.</p>\\n            </li>\\n            <li>\\n               <p>For asymmetric KMS keys with SM2 key pairs (China Regions only), specify\\n            <code>ENCRYPT_DECRYPT</code>, <code>SIGN_VERIFY</code>, or\\n          <code>KEY_AGREEMENT</code>.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"CustomerMasterKeySpec\": {\n                    \"target\": \"com.amazonaws.kms#CustomerMasterKeySpec\",\n                    \"traits\": {\n                        \"smithy.api#deprecated\": {\n                            \"message\": \"This parameter has been deprecated. Instead, use the KeySpec parameter.\"\n                        },\n                        \"smithy.api#documentation\": \"<p>Instead, use the <code>KeySpec</code> parameter.</p>\\n         <p>The <code>KeySpec</code> and <code>CustomerMasterKeySpec</code> parameters work the same\\n      way. Only the names differ. We recommend that you use <code>KeySpec</code> parameter in your\\n      code. However, to avoid breaking changes, KMS supports both parameters.</p>\"\n                    }\n                },\n                \"KeySpec\": {\n                    \"target\": \"com.amazonaws.kms#KeySpec\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the type of KMS key to create. The default value,\\n      <code>SYMMETRIC_DEFAULT</code>, creates a KMS key with a 256-bit AES-GCM key that is used for\\n      encryption and decryption, except in China Regions, where it creates a 128-bit symmetric key\\n      that uses SM4 encryption. For a detailed description of all supported key specs, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/symm-asymm-choose-key-spec.html\\\">Key spec\\n        reference</a> in the <i>\\n               <i>Key Management Service Developer Guide</i>\\n            </i>.</p>\\n         <p>The <code>KeySpec</code> determines whether the KMS key contains a symmetric key or an\\n      asymmetric key pair. It also determines the algorithms that the KMS key supports. You can't\\n      change the <code>KeySpec</code> after the KMS key is created. To further restrict the\\n      algorithms that can be used with the KMS key, use a condition key in its key policy or IAM\\n      policy. For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/conditions-kms.html#conditions-kms-encryption-algorithm\\\">kms:EncryptionAlgorithm</a>, <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/conditions-kms.html#conditions-kms-mac-algorithm\\\">kms:MacAlgorithm</a>, <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/conditions-kms.html#conditions-kms-key-agreement-algorithm\\\">kms:KeyAgreementAlgorithm</a>, or <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/conditions-kms.html#conditions-kms-signing-algorithm\\\">kms:SigningAlgorithm</a> in the <i>\\n               <i>Key Management Service Developer Guide</i>\\n            </i>.</p>\\n         <important>\\n            <p>\\n               <a href=\\\"http://aws.amazon.com/kms/features/#AWS_Service_Integration\\\">Amazon Web Services services that\\n          are integrated with KMS</a> use symmetric encryption KMS keys to protect your data.\\n        These services do not support asymmetric KMS keys or HMAC KMS keys.</p>\\n         </important>\\n         <p>KMS supports the following key specs for KMS keys:</p>\\n         <ul>\\n            <li>\\n               <p>Symmetric encryption key (default)</p>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <code>SYMMETRIC_DEFAULT</code>\\n                     </p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <p>HMAC keys (symmetric)</p>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <code>HMAC_224</code>\\n                     </p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <code>HMAC_256</code>\\n                     </p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <code>HMAC_384</code>\\n                     </p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <code>HMAC_512</code>\\n                     </p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <p>Asymmetric RSA key pairs (encryption and decryption -or- signing and\\n          verification)</p>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <code>RSA_2048</code>\\n                     </p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <code>RSA_3072</code>\\n                     </p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <code>RSA_4096</code>\\n                     </p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <p>Asymmetric NIST-recommended elliptic curve key pairs (signing and verification -or-\\n          deriving shared secrets)</p>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <code>ECC_NIST_P256</code> (secp256r1)</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <code>ECC_NIST_P384</code> (secp384r1)</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <code>ECC_NIST_P521</code> (secp521r1)</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <p>Other asymmetric elliptic curve key pairs (signing and verification)</p>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <code>ECC_SECG_P256K1</code> (secp256k1), commonly used for\\n              cryptocurrencies.</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <p>Asymmetric ML-DSA key pairs (signing and verification)</p>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <code>ML_DSA_44</code>\\n                     </p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <code>ML_DSA_65</code>\\n                     </p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <code>ML_DSA_87</code>\\n                     </p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <p>SM2 key pairs (encryption and decryption -or- signing and verification -or- deriving\\n          shared secrets)</p>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <code>SM2</code> (China Regions only)</p>\\n                  </li>\\n               </ul>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"Origin\": {\n                    \"target\": \"com.amazonaws.kms#OriginType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The source of the key material for the KMS key. You cannot change the origin after you\\n      create the KMS key. The default is <code>AWS_KMS</code>, which means that KMS creates the\\n      key material.</p>\\n         <p>To <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/importing-keys-create-cmk.html\\\">create a\\n        KMS key with no key material</a> (for imported key material), set this value to\\n        <code>EXTERNAL</code>. For more information about importing key material into KMS, see\\n        <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/importing-keys.html\\\">Importing Key\\n        Material</a> in the <i>Key Management Service Developer Guide</i>. The <code>EXTERNAL</code> origin value is valid\\n      only for symmetric KMS keys.</p>\\n         <p>To <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/create-cmk-keystore.html\\\">create a KMS\\n        key in an CloudHSM key store</a> and create its key material in the associated CloudHSM\\n      cluster, set this value to <code>AWS_CLOUDHSM</code>. You must also use the\\n        <code>CustomKeyStoreId</code> parameter to identify the CloudHSM key store. The\\n        <code>KeySpec</code> value must be <code>SYMMETRIC_DEFAULT</code>.</p>\\n         <p>To <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/create-xks-keys.html\\\">create a KMS key in\\n        an external key store</a>, set this value to <code>EXTERNAL_KEY_STORE</code>. You must\\n      also use the <code>CustomKeyStoreId</code> parameter to identify the external key store and\\n      the <code>XksKeyId</code> parameter to identify the associated external key. The\\n        <code>KeySpec</code> value must be <code>SYMMETRIC_DEFAULT</code>.</p>\"\n                    }\n                },\n                \"CustomKeyStoreId\": {\n                    \"target\": \"com.amazonaws.kms#CustomKeyStoreIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Creates the KMS key in the specified <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/key-store-overview.html\\\">custom key store</a>. The <code>ConnectionState</code> of\\n      the custom key store must be <code>CONNECTED</code>. To find the CustomKeyStoreID and\\n      ConnectionState use the <a>DescribeCustomKeyStores</a> operation.</p>\\n         <p>This parameter is valid only for symmetric encryption KMS keys in a single Region. You\\n      cannot create any other type of KMS key in a custom key store.</p>\\n         <p>When you create a KMS key in an CloudHSM key store, KMS generates a non-exportable 256-bit\\n      symmetric key in its associated CloudHSM cluster and associates it with the KMS key. When you\\n      create a KMS key in an external key store, you must use the <code>XksKeyId</code> parameter to\\n      specify an external key that serves as key material for the KMS key.</p>\"\n                    }\n                },\n                \"BypassPolicyLockoutSafetyCheck\": {\n                    \"target\": \"com.amazonaws.kms#BooleanType\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Skips (\\\"bypasses\\\") the key policy lockout safety check. The default value is false.</p>\\n         <important>\\n            <p>Setting this value to true increases the risk that the KMS key becomes unmanageable. Do\\n        not set this value to true indiscriminately.</p>\\n            <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/key-policy-default.html#prevent-unmanageable-key\\\">Default key policy</a> in the <i>Key Management Service Developer Guide</i>.</p>\\n         </important>\\n         <p>Use this parameter only when you intend to prevent the principal that is making the\\n      request from making a subsequent <a href=\\\"https://docs.aws.amazon.com/kms/latest/APIReference/API_PutKeyPolicy.html\\\">PutKeyPolicy</a>\\n      request on the KMS key.</p>\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.kms#TagList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Assigns one or more tags to the KMS key. Use this parameter to tag the KMS key when it is\\n      created. To tag an existing KMS key, use the <a>TagResource</a> operation.</p>\\n         <important>\\n            <p>Do not include confidential or sensitive information in this field. This field may be displayed in plaintext in CloudTrail logs and other output.</p>\\n         </important>\\n         <note>\\n            <p>Tagging or untagging a KMS key can allow or deny permission to the KMS key. For details, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/abac.html\\\">ABAC for KMS</a> in the <i>Key Management Service Developer Guide</i>.</p>\\n         </note>\\n         <p>To use this parameter, you must have <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/kms-api-permissions-reference.html\\\">kms:TagResource</a> permission in an IAM policy.</p>\\n         <p>Each tag consists of a tag key and a tag value. Both the tag key and the tag value are\\n      required, but the tag value can be an empty (null) string. You cannot have more than one tag\\n      on a KMS key with the same tag key. If you specify an existing tag key with a different tag\\n      value, KMS replaces the current tag value with the specified one.</p>\\n         <p>When you add tags to an Amazon Web Services resource, Amazon Web Services generates a cost allocation\\n              report with usage and costs aggregated by tags. Tags can also be used to control access to a KMS key. For details,\\n              see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/tagging-keys.html\\\">Tags in KMS</a>.</p>\"\n                    }\n                },\n                \"MultiRegion\": {\n                    \"target\": \"com.amazonaws.kms#NullableBooleanType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Creates a multi-Region primary key that you can replicate into other Amazon Web Services Regions. You\\n      cannot change this value after you create the KMS key. </p>\\n         <p>For a multi-Region key, set this parameter to <code>True</code>. For a single-Region KMS\\n      key, omit this parameter or set it to <code>False</code>. The default value is\\n        <code>False</code>.</p>\\n         <p>This operation supports <i>multi-Region keys</i>, an KMS feature that lets you create multiple\\n      interoperable KMS keys in different Amazon Web Services Regions. Because these KMS keys have the same key ID, key\\n      material, and other metadata, you can use them interchangeably to encrypt data in one Amazon Web Services Region and decrypt\\n      it in a different Amazon Web Services Region without re-encrypting the data or making a cross-Region call. For more information about multi-Region keys, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/multi-region-keys-overview.html\\\">Multi-Region keys in KMS</a> in the <i>Key Management Service Developer Guide</i>.</p>\\n         <p>This value creates a <i>primary key</i>, not a replica. To create a\\n        <i>replica key</i>, use the <a>ReplicateKey</a> operation. </p>\\n         <p>You can create a symmetric or asymmetric multi-Region key, and you can create a\\n      multi-Region key with imported key material. However, you cannot create a multi-Region key in\\n      a custom key store.</p>\"\n                    }\n                },\n                \"XksKeyId\": {\n                    \"target\": \"com.amazonaws.kms#XksKeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Identifies the <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/keystore-external.html#concept-external-key\\\">external key</a> that\\n      serves as key material for the KMS key in an <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/keystore-external.html\\\">external key store</a>. Specify the ID that\\n      the <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/keystore-external.html#concept-xks-proxy\\\">external key store proxy</a> uses to refer to the external key. For help, see the\\n      documentation for your external key store proxy.</p>\\n         <p>This parameter is required for a KMS key with an <code>Origin</code> value of\\n        <code>EXTERNAL_KEY_STORE</code>. It is not valid for KMS keys with any other\\n        <code>Origin</code> value.</p>\\n         <p>The external key must be an existing 256-bit AES symmetric encryption key hosted outside\\n      of Amazon Web Services in an external key manager associated with the external key store specified by the\\n        <code>CustomKeyStoreId</code> parameter. This key must be enabled and configured to perform\\n      encryption and decryption. Each KMS key in an external key store must use a different external\\n      key. For details, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/create-xks-keys.html#xks-key-requirements\\\">Requirements for a KMS key in\\n        an external key store</a> in the <i>Key Management Service Developer Guide</i>.</p>\\n         <p>Each KMS key in an external key store is associated two backing keys. One is key material\\n      that KMS generates. The other is the external key specified by this parameter. When you use\\n      the KMS key in an external key store to encrypt data, the encryption operation is performed\\n      first by KMS using the KMS key material, and then by the external key manager using the\\n      specified external key, a process known as <i>double encryption</i>. For\\n      details, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/keystore-external.html#concept-double-encryption\\\">Double\\n        encryption</a> in the <i>Key Management Service Developer Guide</i>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.kms#CreateKeyResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"KeyMetadata\": {\n                    \"target\": \"com.amazonaws.kms#KeyMetadata\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Metadata associated with the KMS key.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.kms#CustomKeyStoreHasCMKsException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.kms#ErrorMessageType\"\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"CustomKeyStoreHasCMKsException\",\n                    \"httpResponseCode\": 400\n                },\n                \"smithy.api#documentation\": \"<p>The request was rejected because the custom key store contains KMS keys. After verifying\\n      that you do not need to use the KMS keys, use the <a>ScheduleKeyDeletion</a>\\n      operation to delete the KMS keys. After they are deleted, you can delete the custom key\\n      store.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.kms#CustomKeyStoreIdType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 64\n                }\n            }\n        },\n        \"com.amazonaws.kms#CustomKeyStoreInvalidStateException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.kms#ErrorMessageType\"\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"CustomKeyStoreInvalidStateException\",\n                    \"httpResponseCode\": 400\n                },\n                \"smithy.api#documentation\": \"<p>The request was rejected because of the <code>ConnectionState</code> of the custom key\\n      store. To get the <code>ConnectionState</code> of a custom key store, use the <a>DescribeCustomKeyStores</a> operation.</p>\\n         <p>This exception is thrown under the following conditions:</p>\\n         <ul>\\n            <li>\\n               <p>You requested the <a>ConnectCustomKeyStore</a> operation on a custom key\\n          store with a <code>ConnectionState</code> of <code>DISCONNECTING</code> or\\n            <code>FAILED</code>. This operation is valid for all other <code>ConnectionState</code>\\n          values. To reconnect a custom key store in a <code>FAILED</code> state, disconnect it\\n            (<a>DisconnectCustomKeyStore</a>), then connect it\\n            (<code>ConnectCustomKeyStore</code>).</p>\\n            </li>\\n            <li>\\n               <p>You requested the <a>CreateKey</a> operation in a custom key store that is\\n          not connected. This operations is valid only when the custom key store\\n            <code>ConnectionState</code> is <code>CONNECTED</code>.</p>\\n            </li>\\n            <li>\\n               <p>You requested the <a>DisconnectCustomKeyStore</a> operation on a custom key\\n          store with a <code>ConnectionState</code> of <code>DISCONNECTING</code> or\\n            <code>DISCONNECTED</code>. This operation is valid for all other\\n            <code>ConnectionState</code> values.</p>\\n            </li>\\n            <li>\\n               <p>You requested the <a>UpdateCustomKeyStore</a> or <a>DeleteCustomKeyStore</a> operation on a custom key store that is not\\n          disconnected. This operation is valid only when the custom key store\\n            <code>ConnectionState</code> is <code>DISCONNECTED</code>.</p>\\n            </li>\\n            <li>\\n               <p>You requested the <a>GenerateRandom</a> operation in an CloudHSM key store\\n          that is not connected. This operation is valid only when the CloudHSM key store\\n            <code>ConnectionState</code> is <code>CONNECTED</code>. </p>\\n            </li>\\n         </ul>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.kms#CustomKeyStoreNameInUseException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.kms#ErrorMessageType\"\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"CustomKeyStoreNameInUseException\",\n                    \"httpResponseCode\": 400\n                },\n                \"smithy.api#documentation\": \"<p>The request was rejected because the specified custom key store name is already assigned\\n      to another custom key store in the account. Try again with a custom key store name that is\\n      unique in the account.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.kms#CustomKeyStoreNameType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 256\n                }\n            }\n        },\n        \"com.amazonaws.kms#CustomKeyStoreNotFoundException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.kms#ErrorMessageType\"\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"CustomKeyStoreNotFoundException\",\n                    \"httpResponseCode\": 400\n                },\n                \"smithy.api#documentation\": \"<p>The request was rejected because KMS cannot find a custom key store with the specified\\n      key store name or ID.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.kms#CustomKeyStoreType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"AWS_CLOUDHSM\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS_CLOUDHSM\"\n                    }\n                },\n                \"EXTERNAL_KEY_STORE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"EXTERNAL_KEY_STORE\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.kms#CustomKeyStoresList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.kms#CustomKeyStoresListEntry\"\n            }\n        },\n        \"com.amazonaws.kms#CustomKeyStoresListEntry\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CustomKeyStoreId\": {\n                    \"target\": \"com.amazonaws.kms#CustomKeyStoreIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A unique identifier for the custom key store.</p>\"\n                    }\n                },\n                \"CustomKeyStoreName\": {\n                    \"target\": \"com.amazonaws.kms#CustomKeyStoreNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The user-specified friendly name for the custom key store.</p>\"\n                    }\n                },\n                \"CloudHsmClusterId\": {\n                    \"target\": \"com.amazonaws.kms#CloudHsmClusterIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A unique identifier for the CloudHSM cluster that is associated with an CloudHSM key store. This\\n      field appears only when the <code>CustomKeyStoreType</code> is\\n      <code>AWS_CLOUDHSM</code>.</p>\"\n                    }\n                },\n                \"TrustAnchorCertificate\": {\n                    \"target\": \"com.amazonaws.kms#TrustAnchorCertificateType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The trust anchor certificate of the CloudHSM cluster associated with an CloudHSM key store. When\\n      you <a href=\\\"https://docs.aws.amazon.com/cloudhsm/latest/userguide/initialize-cluster.html#sign-csr\\\">initialize\\n        the cluster</a>, you create this certificate and save it in the\\n        <code>customerCA.crt</code> file.</p>\\n         <p>This field appears only when the <code>CustomKeyStoreType</code> is\\n        <code>AWS_CLOUDHSM</code>.</p>\"\n                    }\n                },\n                \"ConnectionState\": {\n                    \"target\": \"com.amazonaws.kms#ConnectionStateType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether the custom key store is connected to its backing key store. For an CloudHSM\\n      key store, the <code>ConnectionState</code> indicates whether it is connected to its CloudHSM\\n      cluster. For an external key store, the <code>ConnectionState</code> indicates whether it is\\n      connected to the external key store proxy that communicates with your external key\\n      manager.</p>\\n         <p>You can create and use KMS keys in your custom key stores only when its\\n        <code>ConnectionState</code> is <code>CONNECTED</code>.</p>\\n         <p>The <code>ConnectionState</code> value is <code>DISCONNECTED</code> only if the key store\\n      has never been connected or you use the <a>DisconnectCustomKeyStore</a> operation\\n      to disconnect it. If the value is <code>CONNECTED</code> but you are having trouble using the\\n      custom key store, make sure that the backing key store is reachable and active. For an CloudHSM\\n      key store, verify that its associated CloudHSM cluster is active and contains at least one active\\n      HSM. For an external key store, verify that the external key store proxy and external key\\n      manager are connected and enabled.</p>\\n         <p>A value of <code>FAILED</code> indicates that an attempt to connect was unsuccessful. The\\n        <code>ConnectionErrorCode</code> field in the response indicates the cause of the failure.\\n      For help resolving a connection failure, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/fix-keystore.html\\\">Troubleshooting a custom key store</a> in the\\n      <i>Key Management Service Developer Guide</i>.</p>\"\n                    }\n                },\n                \"ConnectionErrorCode\": {\n                    \"target\": \"com.amazonaws.kms#ConnectionErrorCodeType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Describes the connection error. This field appears in the response only when the\\n        <code>ConnectionState</code> is <code>FAILED</code>.</p>\\n         <p>Many failures can be resolved by updating the properties of the custom key store. To\\n      update a custom key store, disconnect it (<a>DisconnectCustomKeyStore</a>), correct\\n      the errors (<a>UpdateCustomKeyStore</a>), and try to connect again (<a>ConnectCustomKeyStore</a>). For additional help resolving these errors, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/fix-keystore.html#fix-keystore-failed\\\">How to Fix a\\n        Connection Failure</a> in <i>Key Management Service Developer Guide</i>.</p>\\n         <p>\\n            <b>All custom key stores:</b>\\n         </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>INTERNAL_ERROR</code> — KMS could not complete the request due to an\\n          internal error. Retry the request. For <code>ConnectCustomKeyStore</code> requests,\\n          disconnect the custom key store before trying to connect again.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>NETWORK_ERRORS</code> — Network errors are preventing KMS from\\n          connecting the custom key store to its backing key store.</p>\\n            </li>\\n         </ul>\\n         <p>\\n            <b>CloudHSM key stores:</b>\\n         </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>CLUSTER_NOT_FOUND</code> — KMS cannot find the CloudHSM cluster with the\\n          specified cluster ID.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>INSUFFICIENT_CLOUDHSM_HSMS</code> — The associated CloudHSM cluster does not\\n          contain any active HSMs. To connect a custom key store to its CloudHSM cluster, the cluster\\n          must contain at least one active HSM.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>INSUFFICIENT_FREE_ADDRESSES_IN_SUBNET</code> — At least one private\\n          subnet associated with the CloudHSM cluster doesn't have any available IP addresses. A CloudHSM\\n          key store connection requires one free IP address in each of the associated private\\n          subnets, although two are preferable. For details, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/fix-keystore.html#fix-keystore-failed\\\">How to Fix a Connection\\n            Failure</a> in the <i>Key Management Service Developer Guide</i>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>INVALID_CREDENTIALS</code> — The <code>KeyStorePassword</code> for the\\n          custom key store doesn't match the current password of the <code>kmsuser</code> crypto\\n          user in the CloudHSM cluster. Before you can connect your custom key store to its CloudHSM\\n          cluster, you must change the <code>kmsuser</code> account password and update the\\n            <code>KeyStorePassword</code> value for the custom key store.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>SUBNET_NOT_FOUND</code> — A subnet in the CloudHSM cluster configuration was\\n          deleted. If KMS cannot find all of the subnets in the cluster configuration, attempts to\\n          connect the custom key store to the CloudHSM cluster fail. To fix this error, create a\\n          cluster from a recent backup and associate it with your custom key store. (This process\\n          creates a new cluster configuration with a VPC and private subnets.) For details, see\\n            <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/fix-keystore.html#fix-keystore-failed\\\">How\\n            to Fix a Connection Failure</a> in the <i>Key Management Service Developer Guide</i>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>USER_LOCKED_OUT</code> — The <code>kmsuser</code> CU account is locked\\n          out of the associated CloudHSM cluster due to too many failed password attempts. Before you\\n          can connect your custom key store to its CloudHSM cluster, you must change the\\n            <code>kmsuser</code> account password and update the key store password value for the\\n          custom key store.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>USER_LOGGED_IN</code> — The <code>kmsuser</code> CU account is logged\\n          into the associated CloudHSM cluster. This prevents KMS from rotating the\\n            <code>kmsuser</code> account password and logging into the cluster. Before you can\\n          connect your custom key store to its CloudHSM cluster, you must log the <code>kmsuser</code>\\n          CU out of the cluster. If you changed the <code>kmsuser</code> password to log into the\\n          cluster, you must also and update the key store password value for the custom key store.\\n          For help, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/fix-keystore.html#login-kmsuser-2\\\">How to Log Out and\\n            Reconnect</a> in the <i>Key Management Service Developer Guide</i>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>USER_NOT_FOUND</code> — KMS cannot find a <code>kmsuser</code> CU\\n          account in the associated CloudHSM cluster. Before you can connect your custom key store to\\n          its CloudHSM cluster, you must create a <code>kmsuser</code> CU account in the cluster, and\\n          then update the key store password value for the custom key store.</p>\\n            </li>\\n         </ul>\\n         <p>\\n            <b>External key stores:</b>\\n         </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>INVALID_CREDENTIALS</code> — One or both of the\\n            <code>XksProxyAuthenticationCredential</code> values is not valid on the specified\\n          external key store proxy.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>XKS_PROXY_ACCESS_DENIED</code> — KMS requests are denied access to the\\n          external key store proxy. If the external key store proxy has authorization rules, verify\\n          that they permit KMS to communicate with the proxy on your behalf.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>XKS_PROXY_INVALID_CONFIGURATION</code> — A configuration error is\\n          preventing the external key store from connecting to its proxy. Verify the value of the\\n            <code>XksProxyUriPath</code>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>XKS_PROXY_INVALID_RESPONSE</code> — KMS cannot interpret the response\\n          from the external key store proxy. If you see this connection error code repeatedly,\\n          notify your external key store proxy vendor.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>XKS_PROXY_INVALID_TLS_CONFIGURATION</code> — KMS cannot connect to the\\n          external key store proxy because the TLS configuration is invalid. Verify that the XKS\\n          proxy supports TLS 1.2 or 1.3. Also, verify that the TLS certificate is not expired, and\\n          that it matches the hostname in the <code>XksProxyUriEndpoint</code> value, and that it is\\n          signed by a certificate authority included in the <a href=\\\"https://github.com/aws/aws-kms-xksproxy-api-spec/blob/main/TrustedCertificateAuthorities\\\">Trusted Certificate Authorities</a> list.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>XKS_PROXY_NOT_REACHABLE</code> — KMS can't communicate with your\\n          external key store proxy. Verify that the <code>XksProxyUriEndpoint</code> and\\n            <code>XksProxyUriPath</code> are correct. Use the tools for your external key store\\n          proxy to verify that the proxy is active and available on its network. Also, verify that\\n          your external key manager instances are operating properly. Connection attempts fail with\\n          this connection error code if the proxy reports that all external key manager instances\\n          are unavailable.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>XKS_PROXY_TIMED_OUT</code> — KMS can connect to the external key store\\n          proxy, but the proxy does not respond to KMS in the time allotted. If you see this\\n          connection error code repeatedly, notify your external key store proxy vendor.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>XKS_VPC_ENDPOINT_SERVICE_INVALID_CONFIGURATION</code> — The Amazon VPC\\n          endpoint service configuration doesn't conform to the requirements for an KMS external\\n          key store.</p>\\n               <ul>\\n                  <li>\\n                     <p>The VPC endpoint service must be an endpoint service for interface endpoints in the caller's Amazon Web Services account.</p>\\n                  </li>\\n                  <li>\\n                     <p>It must have a network load balancer (NLB) connected to at least two subnets, each in a different Availability Zone.</p>\\n                  </li>\\n                  <li>\\n                     <p>The <code>Allow principals</code> list must include \\n\\t         the KMS service principal for the Region, <code>cks.kms.<region>.amazonaws.com</code>,  \\n\\t         such as <code>cks.kms.us-east-1.amazonaws.com</code>.</p>\\n                  </li>\\n                  <li>\\n                     <p>It must <i>not</i> require <a href=\\\"https://docs.aws.amazon.com/vpc/latest/privatelink/create-endpoint-service.html\\\">acceptance</a> of connection requests.</p>\\n                  </li>\\n                  <li>\\n                     <p>It must have a private DNS name. The private DNS name for an external key store with <code>VPC_ENDPOINT_SERVICE</code> connectivity\\n\\t       must be unique in its Amazon Web Services Region.</p>\\n                  </li>\\n                  <li>\\n                     <p>The domain of the private DNS name must have a <a href=\\\"https://docs.aws.amazon.com/vpc/latest/privatelink/verify-domains.html\\\">verification status</a> of\\n\\t         <code>verified</code>.</p>\\n                  </li>\\n                  <li>\\n                     <p>The <a href=\\\"https://docs.aws.amazon.com/elasticloadbalancing/latest/network/create-tls-listener.html\\\">TLS certificate</a> specifies the private DNS hostname at which the endpoint is reachable.</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>XKS_VPC_ENDPOINT_SERVICE_NOT_FOUND</code> — KMS can't find the VPC\\n          endpoint service that it uses to communicate with the external key store proxy. Verify\\n          that the <code>XksProxyVpcEndpointServiceName</code> is correct and the KMS service\\n          principal has service consumer permissions on the Amazon VPC endpoint service.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"CreationDate\": {\n                    \"target\": \"com.amazonaws.kms#DateType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time when the custom key store was created.</p>\"\n                    }\n                },\n                \"CustomKeyStoreType\": {\n                    \"target\": \"com.amazonaws.kms#CustomKeyStoreType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates the type of the custom key store. <code>AWS_CLOUDHSM</code> indicates a custom\\n      key store backed by an CloudHSM cluster. <code>EXTERNAL_KEY_STORE</code> indicates a custom key\\n      store backed by an external key store proxy and external key manager outside of Amazon Web Services.</p>\"\n                    }\n                },\n                \"XksProxyConfiguration\": {\n                    \"target\": \"com.amazonaws.kms#XksProxyConfigurationType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Configuration settings for the external key store proxy (XKS proxy). The external key\\n      store proxy translates KMS requests into a format that your external key manager can\\n      understand. The proxy configuration includes connection information that KMS\\n      requires.</p>\\n         <p>This field appears only when the <code>CustomKeyStoreType</code> is\\n        <code>EXTERNAL_KEY_STORE</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains information about each custom key store in the custom key store list.</p>\"\n            }\n        },\n        \"com.amazonaws.kms#CustomerMasterKeySpec\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"RSA_2048\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"RSA_2048\"\n                    }\n                },\n                \"RSA_3072\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"RSA_3072\"\n                    }\n                },\n                \"RSA_4096\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"RSA_4096\"\n                    }\n                },\n                \"ECC_NIST_P256\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ECC_NIST_P256\"\n                    }\n                },\n                \"ECC_NIST_P384\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ECC_NIST_P384\"\n                    }\n                },\n                \"ECC_NIST_P521\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ECC_NIST_P521\"\n                    }\n                },\n                \"ECC_SECG_P256K1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ECC_SECG_P256K1\"\n                    }\n                },\n                \"SYMMETRIC_DEFAULT\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"SYMMETRIC_DEFAULT\"\n                    }\n                },\n                \"HMAC_224\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"HMAC_224\"\n                    }\n                },\n                \"HMAC_256\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"HMAC_256\"\n                    }\n                },\n                \"HMAC_384\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"HMAC_384\"\n                    }\n                },\n                \"HMAC_512\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"HMAC_512\"\n                    }\n                },\n                \"SM2\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"SM2\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#deprecated\": {\n                    \"message\": \"This enum has been deprecated. Instead, use the KeySpec enum.\"\n                }\n            }\n        },\n        \"com.amazonaws.kms#DataKeyPairSpec\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"RSA_2048\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"RSA_2048\"\n                    }\n                },\n                \"RSA_3072\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"RSA_3072\"\n                    }\n                },\n                \"RSA_4096\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"RSA_4096\"\n                    }\n                },\n                \"ECC_NIST_P256\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ECC_NIST_P256\"\n                    }\n                },\n                \"ECC_NIST_P384\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ECC_NIST_P384\"\n                    }\n                },\n                \"ECC_NIST_P521\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ECC_NIST_P521\"\n                    }\n                },\n                \"ECC_SECG_P256K1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ECC_SECG_P256K1\"\n                    }\n                },\n                \"SM2\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"SM2\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.kms#DataKeySpec\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"AES_256\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AES_256\"\n                    }\n                },\n                \"AES_128\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AES_128\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.kms#DateType\": {\n            \"type\": \"timestamp\"\n        },\n        \"com.amazonaws.kms#Decrypt\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.kms#DecryptRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.kms#DecryptResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.kms#DependencyTimeoutException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#DisabledException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#DryRunOperationException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#IncorrectKeyException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#InvalidCiphertextException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#InvalidGrantTokenException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#InvalidKeyUsageException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KeyUnavailableException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInternalException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInvalidStateException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#NotFoundException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Decrypts ciphertext that was encrypted by a KMS key using any of the following\\n      operations:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a>Encrypt</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>GenerateDataKey</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>GenerateDataKeyPair</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>GenerateDataKeyWithoutPlaintext</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>GenerateDataKeyPairWithoutPlaintext</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>You can use this operation to decrypt ciphertext that was encrypted under a symmetric\\n      encryption KMS key or an asymmetric encryption KMS key. When the KMS key is asymmetric, you\\n      must specify the KMS key and the encryption algorithm that was used to encrypt the ciphertext.\\n      For information about asymmetric KMS keys, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/symmetric-asymmetric.html\\\">Asymmetric KMS keys</a> in the <i>Key Management Service Developer Guide</i>.</p>\\n         <p>The <code>Decrypt</code> operation also decrypts ciphertext that was encrypted outside of\\n      KMS by the public key in an KMS asymmetric KMS key. However, it cannot decrypt symmetric\\n      ciphertext produced by other libraries, such as the <a href=\\\"https://docs.aws.amazon.com/encryption-sdk/latest/developer-guide/\\\">Amazon Web Services Encryption SDK</a> or <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingClientSideEncryption.html\\\">Amazon S3 client-side encryption</a>.\\n      These libraries return a ciphertext format that is incompatible with KMS.</p>\\n         <p>If the ciphertext was encrypted under a symmetric encryption KMS key, the\\n        <code>KeyId</code> parameter is optional. KMS can get this information from metadata that\\n      it adds to the symmetric ciphertext blob. This feature adds durability to your implementation\\n      by ensuring that authorized users can decrypt ciphertext decades after it was encrypted, even\\n      if they've lost track of the key ID. However, specifying the KMS key is always recommended as\\n      a best practice. When you use the <code>KeyId</code> parameter to specify a KMS key, KMS\\n      only uses the KMS key you specify. If the ciphertext was encrypted under a different KMS key,\\n      the <code>Decrypt</code> operation fails. This practice ensures that you use the KMS key that\\n      you intend.</p>\\n         <p>Whenever possible, use key policies to give users permission to call the\\n        <code>Decrypt</code> operation on a particular KMS key, instead of using IAM policies.\\n      Otherwise, you might create an IAM policy that gives the user <code>Decrypt</code>\\n      permission on all KMS keys. This user could decrypt ciphertext that was encrypted by KMS keys\\n      in other accounts if the key policy for the cross-account KMS key permits it. If you must use\\n      an IAM policy for <code>Decrypt</code> permissions, limit the user to particular KMS keys or\\n      particular trusted accounts. For details, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/iam-policies.html#iam-policies-best-practices\\\">Best practices for IAM\\n        policies</a> in the <i>Key Management Service Developer Guide</i>.</p>\\n         <p>\\n            <code>Decrypt</code> also supports <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/nitro-enclave.html\\\">Amazon Web Services Nitro Enclaves</a> and NitroTPM, which provide \\n      attested environments in Amazon EC2. To call <code>Decrypt</code> for a Nitro enclave or NitroTPM, use\\n      the <a href=\\\"https://docs.aws.amazon.com/enclaves/latest/user/developing-applications.html#sdk\\\">Amazon Web Services Nitro Enclaves SDK</a> or any Amazon Web Services SDK. Use the <code>Recipient</code> parameter to provide the\\n      attestation document for the attested environment. Instead of the plaintext data, the response \\n      includes the plaintext data encrypted with the public key from the attestation document\\n        (<code>CiphertextForRecipient</code>). For information about the interaction between KMS and Amazon Web Services Nitro Enclaves or Amazon Web Services NitroTPM, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/cryptographic-attestation.html\\\">Cryptographic attestation support in KMS</a> in the <i>Key Management Service Developer Guide</i>.</p>\\n         <p>The KMS key that you use for this operation must be in a compatible key state. For\\ndetails, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/key-state.html\\\">Key states of KMS keys</a> in the <i>Key Management Service Developer Guide</i>.</p>\\n         <p>\\n            <b>Cross-account use</b>: Yes. If you use the <code>KeyId</code>\\n      parameter to identify a KMS key in a different Amazon Web Services account, specify the key ARN or the alias\\n      ARN of the KMS key.</p>\\n         <p>\\n            <b>Required permissions</b>: <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/kms-api-permissions-reference.html\\\">kms:Decrypt</a> (key policy)</p>\\n         <p>\\n            <b>Related operations:</b>\\n         </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a>Encrypt</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>GenerateDataKey</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>GenerateDataKeyPair</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>ReEncrypt</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>\\n            <b>Eventual consistency</b>: The KMS API follows an eventual consistency model. \\n  For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/accessing-kms.html#programming-eventual-consistency\\\">KMS eventual consistency</a>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To decrypt data with an asymmetric encryption KMS key\",\n                        \"documentation\": \"The following example decrypts data that was encrypted with an asymmetric encryption KMS key. When the KMS encryption key is asymmetric, you must specify the KMS key ID and the encryption algorithm that was used to encrypt the data.\",\n                        \"input\": {\n                            \"CiphertextBlob\": \"<binary data>\",\n                            \"KeyId\": \"0987dcba-09fe-87dc-65ba-ab0987654321\",\n                            \"EncryptionAlgorithm\": \"RSAES_OAEP_SHA_256\"\n                        },\n                        \"output\": {\n                            \"KeyId\": \"arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321\",\n                            \"Plaintext\": \"<binary data>\",\n                            \"EncryptionAlgorithm\": \"RSAES_OAEP_SHA_256\"\n                        }\n                    },\n                    {\n                        \"title\": \"To decrypt data with a symmetric encryption KMS key\",\n                        \"documentation\": \"The following example decrypts data that was encrypted with a symmetric encryption KMS key. The KeyId is not required when decrypting with a symmetric encryption key, but it is a best practice.\",\n                        \"input\": {\n                            \"CiphertextBlob\": \"<binary data>\",\n                            \"KeyId\": \"arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab\"\n                        },\n                        \"output\": {\n                            \"KeyId\": \"arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab\",\n                            \"Plaintext\": \"<binary data>\",\n                            \"EncryptionAlgorithm\": \"SYMMETRIC_DEFAULT\",\n                            \"KeyMaterialId\": \"0b7fd7ddbac6eef27907413567cad8c810e2883dc8a7534067a82ee1142fc1e6\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.kms#DecryptRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CiphertextBlob\": {\n                    \"target\": \"com.amazonaws.kms#CiphertextType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Ciphertext to be decrypted. The blob includes metadata.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"EncryptionContext\": {\n                    \"target\": \"com.amazonaws.kms#EncryptionContextType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the encryption context to use when decrypting the data.\\n      An encryption context is valid only for <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/kms-cryptography.html#cryptographic-operations\\\">cryptographic operations</a> with a symmetric encryption KMS key. The standard asymmetric encryption algorithms and HMAC algorithms that KMS uses do not support an encryption context.</p>\\n         <p>An <i>encryption context</i> is a collection of non-secret key-value pairs that represent additional authenticated data. \\nWhen you use an encryption context to encrypt data, you must specify the same (an exact case-sensitive match) encryption context to decrypt the data. An encryption context is supported\\nonly on operations with symmetric encryption KMS keys. On operations with symmetric encryption KMS keys, an encryption context is optional, but it is strongly recommended.</p>\\n         <p>For more information, see\\n<a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/encrypt_context.html\\\">Encryption context</a> in the <i>Key Management Service Developer Guide</i>.</p>\"\n                    }\n                },\n                \"GrantTokens\": {\n                    \"target\": \"com.amazonaws.kms#GrantTokenList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of grant tokens. </p>\\n         <p>Use a grant token when your permission to call this operation comes from a new grant that has not yet achieved <i>eventual consistency</i>. For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/grants.html#grant_token\\\">Grant token</a> and <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/using-grant-token.html\\\">Using a grant token</a> in the\\n    <i>Key Management Service Developer Guide</i>.</p>\"\n                    }\n                },\n                \"KeyId\": {\n                    \"target\": \"com.amazonaws.kms#KeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the KMS key that KMS uses to decrypt the ciphertext.</p>\\n         <p>Enter a key ID of the KMS key that was used to encrypt the ciphertext. If you identify a\\n      different KMS key, the <code>Decrypt</code> operation throws an\\n        <code>IncorrectKeyException</code>.</p>\\n         <p>This parameter is required only when the ciphertext was encrypted under an asymmetric KMS\\n      key. If you used a symmetric encryption KMS key, KMS can get the KMS key from metadata that\\n      it adds to the symmetric ciphertext blob. However, it is always recommended as a best\\n      practice. This practice ensures that you use the KMS key that you intend.</p>\\n         <p>To specify a KMS key, use its key ID, key ARN, alias name, or alias ARN. When using an alias name, prefix it with <code>\\\"alias/\\\"</code>. To specify a KMS key in a different Amazon Web Services account, you must use the key ARN or alias ARN.</p>\\n         <p>For example:</p>\\n         <ul>\\n            <li>\\n               <p>Key ID: <code>1234abcd-12ab-34cd-56ef-1234567890ab</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Key ARN: <code>arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Alias name: <code>alias/ExampleAlias</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Alias ARN: <code>arn:aws:kms:us-east-2:111122223333:alias/ExampleAlias</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>To get the key ID and key ARN for a KMS key, use <a>ListKeys</a> or <a>DescribeKey</a>. To get the alias name and alias ARN, use <a>ListAliases</a>.</p>\"\n                    }\n                },\n                \"EncryptionAlgorithm\": {\n                    \"target\": \"com.amazonaws.kms#EncryptionAlgorithmSpec\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the encryption algorithm that will be used to decrypt the ciphertext. Specify\\n      the same algorithm that was used to encrypt the data. If you specify a different algorithm,\\n      the <code>Decrypt</code> operation fails.</p>\\n         <p>This parameter is required only when the ciphertext was encrypted under an asymmetric KMS\\n      key. The default value, <code>SYMMETRIC_DEFAULT</code>, represents the only supported\\n      algorithm that is valid for symmetric encryption KMS keys.</p>\"\n                    }\n                },\n                \"Recipient\": {\n                    \"target\": \"com.amazonaws.kms#RecipientInfo\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A signed <a href=\\\"https://docs.aws.amazon.com/enclaves/latest/user/nitro-enclave-concepts.html#term-attestdoc\\\">attestation\\n        document</a> from an Amazon Web Services Nitro enclave or NitroTPM, and the encryption algorithm to use with the\\n      public key in the attestation document. The only valid encryption algorithm is <code>RSAES_OAEP_SHA_256</code>. </p>\\n         <p>This parameter supports the <a href=\\\"https://docs.aws.amazon.com/enclaves/latest/user/developing-applications.html#sdk\\\">Amazon Web Services Nitro Enclaves SDK</a> or any Amazon Web Services SDK for Amazon Web Services Nitro Enclaves. It supports \\n      any Amazon Web Services SDK for Amazon Web Services NitroTPM.\\n    </p>\\n         <p>When you use this parameter, instead of returning the plaintext data, KMS encrypts the\\n      plaintext data with the public key in the attestation document, and returns the resulting\\n      ciphertext in the <code>CiphertextForRecipient</code> field in the response. This ciphertext\\n      can be decrypted only with the private key in the attested environment. The <code>Plaintext</code> field in\\n      the response is null or empty.</p>\\n         <p>For information about the interaction between KMS and Amazon Web Services Nitro Enclaves or Amazon Web Services NitroTPM, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/cryptographic-attestation.html\\\">Cryptographic attestation support in KMS</a> in the <i>Key Management Service Developer Guide</i>.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.kms#NullableBooleanType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks if your request will succeed. <code>DryRun</code> is an optional parameter. </p>\\n         <p>To learn more about how to use this parameter, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/testing-permissions.html\\\">Testing your permissions</a> in the <i>Key Management Service Developer Guide</i>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.kms#DecryptResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"KeyId\": {\n                    \"target\": \"com.amazonaws.kms#KeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (<a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-id-key-ARN\\\">key ARN</a>) of the KMS key that was used to decrypt the ciphertext.</p>\"\n                    }\n                },\n                \"Plaintext\": {\n                    \"target\": \"com.amazonaws.kms#PlaintextType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Decrypted plaintext data. When you use the HTTP API or the Amazon Web Services CLI, the value is Base64-encoded. Otherwise, it is not Base64-encoded.</p>\\n         <p>If the response includes the <code>CiphertextForRecipient</code> field, the\\n        <code>Plaintext</code> field is null or empty.</p>\"\n                    }\n                },\n                \"EncryptionAlgorithm\": {\n                    \"target\": \"com.amazonaws.kms#EncryptionAlgorithmSpec\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The encryption algorithm that was used to decrypt the ciphertext.</p>\"\n                    }\n                },\n                \"CiphertextForRecipient\": {\n                    \"target\": \"com.amazonaws.kms#CiphertextType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The plaintext data encrypted with the public key from the attestation document. This\\n      ciphertext can be decrypted only by using a private key from the attested environment. </p>\\n         <p>This field is included in the response only when the <code>Recipient</code> parameter in\\n      the request includes a valid attestation document from an Amazon Web Services Nitro enclave or NitroTPM.\\n      For information about the interaction between KMS and Amazon Web Services Nitro Enclaves or Amazon Web Services NitroTPM, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/cryptographic-attestation.html\\\">Cryptographic attestation support in KMS</a> in the <i>Key Management Service Developer Guide</i>.</p>\"\n                    }\n                },\n                \"KeyMaterialId\": {\n                    \"target\": \"com.amazonaws.kms#BackingKeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The identifier of the key material used to decrypt the ciphertext. This field is present\\n      only when the operation uses a symmetric encryption KMS key. This field is omitted if the\\n      request includes the <code>Recipient</code> parameter.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.kms#DeleteAlias\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.kms#DeleteAliasRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.kms#DependencyTimeoutException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInternalException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInvalidStateException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#NotFoundException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the specified alias. </p>\\n         <note>\\n            <p>Adding, deleting, or updating an alias can allow or deny permission to the KMS key. For details, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/abac.html\\\">ABAC for KMS</a> in the <i>Key Management Service Developer Guide</i>.</p>\\n         </note>\\n         <p>Because an alias is not a property of a KMS key, you can delete and change the aliases of\\n      a KMS key without affecting the KMS key. Also, aliases do not appear in the response from the\\n        <a>DescribeKey</a> operation. To get the aliases of all KMS keys, use the <a>ListAliases</a> operation. </p>\\n         <p>Each KMS key can have multiple aliases. To change the alias of a KMS key, use <a>DeleteAlias</a> to delete the current alias and <a>CreateAlias</a> to\\n      create a new alias. To associate an existing alias with a different KMS key, call <a>UpdateAlias</a>.</p>\\n         <p>\\n            <b>Cross-account use</b>: No. You cannot perform this operation on an alias in a different Amazon Web Services account.</p>\\n         <p>\\n            <b>Required permissions</b>\\n         </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/kms-api-permissions-reference.html\\\">kms:DeleteAlias</a> on\\n          the alias (IAM policy).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/kms-api-permissions-reference.html\\\">kms:DeleteAlias</a> on\\n          the KMS key (key policy).</p>\\n            </li>\\n         </ul>\\n         <p>For details, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/kms-alias.html#alias-access\\\">Controlling access to aliases</a> in the\\n      <i>Key Management Service Developer Guide</i>.</p>\\n         <p>\\n            <b>Related operations:</b>\\n         </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a>CreateAlias</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>ListAliases</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>UpdateAlias</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>\\n            <b>Eventual consistency</b>: The KMS API follows an eventual consistency model. \\n  For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/accessing-kms.html#programming-eventual-consistency\\\">KMS eventual consistency</a>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To delete an alias\",\n                        \"documentation\": \"The following example deletes the specified alias.\",\n                        \"input\": {\n                            \"AliasName\": \"alias/ExampleAlias\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.kms#DeleteAliasRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AliasName\": {\n                    \"target\": \"com.amazonaws.kms#AliasNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The alias to be deleted. The alias name must begin with <code>alias/</code> followed by\\n      the alias name, such as <code>alias/ExampleAlias</code>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.kms#DeleteCustomKeyStore\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.kms#DeleteCustomKeyStoreRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.kms#DeleteCustomKeyStoreResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.kms#CustomKeyStoreHasCMKsException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#CustomKeyStoreInvalidStateException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#CustomKeyStoreNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInternalException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes a <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/key-store-overview.html\\\">custom key store</a>. This operation does not affect any backing elements of the\\n      custom key store. It does not delete the CloudHSM cluster that is associated with an CloudHSM key\\n      store, or affect any users or keys in the cluster. For an external key store, it does not\\n      affect the external key store proxy, external key manager, or any external keys.</p>\\n         <p> This operation is part of the custom key stores feature in KMS, which\\ncombines the convenience and extensive integration of KMS with the isolation and control of a\\nkey store that you own and manage.</p>\\n         <p>The custom key store that you delete cannot contain any <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#kms_keys\\\">KMS keys</a>. Before deleting the key store,\\n      verify that you will never need to use any of the KMS keys in the key store for any\\n      <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/kms-cryptography.html#cryptographic-operations\\\">cryptographic operations</a>. Then, use <a>ScheduleKeyDeletion</a> to delete the KMS keys from the\\n      key store. After the required waiting period expires and all KMS keys are deleted from the\\n      custom key store, use <a>DisconnectCustomKeyStore</a> to disconnect the key store\\n      from KMS. Then, you can delete the custom key store.</p>\\n         <p>For keys in an CloudHSM key store, the <code>ScheduleKeyDeletion</code> operation makes a\\n      best effort to delete the key material from the associated cluster. However, you might need to\\n      manually <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/fix-keystore.html#fix-keystore-orphaned-key\\\">delete the orphaned key\\n        material</a> from the cluster and its backups. KMS never creates, manages, or deletes\\n      cryptographic keys in the external key manager associated with an external key store. You must\\n      manage them using your external key manager tools.</p>\\n         <p>Instead of deleting the custom key store, consider using the <a>DisconnectCustomKeyStore</a> operation to disconnect the custom key store from its\\n      backing key store. While the key store is disconnected, you cannot create or use the KMS keys\\n      in the key store. But, you do not need to delete KMS keys and you can reconnect a disconnected\\n      custom key store at any time.</p>\\n         <p>If the operation succeeds, it returns a JSON object with no\\nproperties.</p>\\n         <p>\\n            <b>Cross-account use</b>: No. You cannot perform this operation on a custom key store in a different Amazon Web Services account.</p>\\n         <p>\\n            <b>Required permissions</b>: <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/kms-api-permissions-reference.html\\\">kms:DeleteCustomKeyStore</a> (IAM policy)</p>\\n         <p>\\n            <b>Related operations:</b>\\n         </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a>ConnectCustomKeyStore</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>CreateCustomKeyStore</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>DescribeCustomKeyStores</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>DisconnectCustomKeyStore</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>UpdateCustomKeyStore</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>\\n            <b>Eventual consistency</b>: The KMS API follows an eventual consistency model. \\n  For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/accessing-kms.html#programming-eventual-consistency\\\">KMS eventual consistency</a>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To delete a custom key store from AWS KMS\",\n                        \"documentation\": \"This example deletes a custom key store from AWS KMS. This operation does not affect the backing key store, such as a CloudHSM cluster, external key store proxy, or your external key manager. This operation doesn't return any data. To verify that the operation was successful, use the DescribeCustomKeyStores operation.\",\n                        \"input\": {\n                            \"CustomKeyStoreId\": \"cks-1234567890abcdef0\"\n                        },\n                        \"output\": {}\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.kms#DeleteCustomKeyStoreRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CustomKeyStoreId\": {\n                    \"target\": \"com.amazonaws.kms#CustomKeyStoreIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Enter the ID of the custom key store you want to delete. To find the ID of a custom key store, use the <a>DescribeCustomKeyStores</a> operation.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.kms#DeleteCustomKeyStoreResponse\": {\n            \"type\": \"structure\",\n            \"members\": {},\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.kms#DeleteImportedKeyMaterial\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.kms#DeleteImportedKeyMaterialRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.kms#DeleteImportedKeyMaterialResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.kms#DependencyTimeoutException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#InvalidArnException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInternalException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInvalidStateException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#NotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#UnsupportedOperationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes key material that was previously imported. This operation makes the specified KMS\\n      key temporarily unusable. To restore the usability of the KMS key, reimport the same key\\n      material. For more information about importing key material into KMS, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/importing-keys.html\\\">Importing Key Material</a>\\n      in the <i>Key Management Service Developer Guide</i>.</p>\\n         <p>When the specified KMS key is in the <code>PendingDeletion</code> state, this operation\\n      does not change the KMS key's state. Otherwise, it changes the KMS key's state to\\n        <code>PendingImport</code>.</p>\\n         <p>The KMS key that you use for this operation must be in a compatible key state. For\\ndetails, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/key-state.html\\\">Key states of KMS keys</a> in the <i>Key Management Service Developer Guide</i>.</p>\\n         <p>\\n            <b>Cross-account use</b>: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.</p>\\n         <p>\\n            <b>Required permissions</b>: <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/kms-api-permissions-reference.html\\\">kms:DeleteImportedKeyMaterial</a> (key policy)</p>\\n         <p>\\n            <b>Related operations:</b>\\n         </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a>GetParametersForImport</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>ListKeyRotations</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>ImportKeyMaterial</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>\\n            <b>Eventual consistency</b>: The KMS API follows an eventual consistency model. \\n  For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/accessing-kms.html#programming-eventual-consistency\\\">KMS eventual consistency</a>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To delete imported key material\",\n                        \"documentation\": \"The following example deletes the imported key material from the specified KMS key.\",\n                        \"input\": {\n                            \"KeyId\": \"1234abcd-12ab-34cd-56ef-1234567890ab\",\n                            \"KeyMaterialId\": \"0b7fd7ddbac6eef27907413567cad8c810e2883dc8a7534067a82ee1142fc1e6\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.kms#DeleteImportedKeyMaterialRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"KeyId\": {\n                    \"target\": \"com.amazonaws.kms#KeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Identifies the KMS key from which you are deleting imported key material. The\\n        <code>Origin</code> of the KMS key must be <code>EXTERNAL</code>.</p>\\n         <p>Specify the key ID or key ARN of the KMS key.</p>\\n         <p>For example:</p>\\n         <ul>\\n            <li>\\n               <p>Key ID: <code>1234abcd-12ab-34cd-56ef-1234567890ab</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Key ARN: <code>arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>To get the key ID and key ARN for a KMS key, use <a>ListKeys</a> or <a>DescribeKey</a>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"KeyMaterialId\": {\n                    \"target\": \"com.amazonaws.kms#BackingKeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Identifies the imported key material you are deleting. </p>\\n         <important>\\n            <p>If no KeyMaterialId is specified, KMS deletes the current key material.</p>\\n         </important>\\n         <p>To get the list of key material IDs associated with a KMS key, use <a>ListKeyRotations</a>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.kms#DeleteImportedKeyMaterialResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"KeyId\": {\n                    \"target\": \"com.amazonaws.kms#KeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (<a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-id-key-ARN\\\">key ARN</a>) of the KMS key from which the key material was deleted.</p>\"\n                    }\n                },\n                \"KeyMaterialId\": {\n                    \"target\": \"com.amazonaws.kms#BackingKeyIdResponseType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Identifies the deleted key material.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.kms#DependencyTimeoutException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.kms#ErrorMessageType\"\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"DependencyTimeout\",\n                    \"httpResponseCode\": 503\n                },\n                \"smithy.api#documentation\": \"<p>The system timed out while trying to fulfill the request. You can retry the\\n      request.</p>\",\n                \"smithy.api#error\": \"server\",\n                \"smithy.api#httpError\": 503\n            }\n        },\n        \"com.amazonaws.kms#DeriveSharedSecret\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.kms#DeriveSharedSecretRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.kms#DeriveSharedSecretResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.kms#DependencyTimeoutException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#DisabledException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#DryRunOperationException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#InvalidGrantTokenException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#InvalidKeyUsageException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KeyUnavailableException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInternalException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInvalidStateException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#NotFoundException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Derives a shared secret using a key agreement algorithm.</p>\\n         <note>\\n            <p>You must use an asymmetric NIST-recommended elliptic curve (ECC) or SM2 (China Regions\\n        only) KMS key pair with a <code>KeyUsage</code>\\n        value of <code>KEY_AGREEMENT</code> to call DeriveSharedSecret.</p>\\n         </note>\\n         <p>DeriveSharedSecret uses the <a href=\\\"https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-56Ar3.pdf#page=60\\\">Elliptic Curve Cryptography Cofactor Diffie-Hellman Primitive</a> (ECDH) to establish a\\n      key agreement between two peers by deriving a shared secret from their elliptic curve\\n      public-private key pairs. You can use the raw shared secret that DeriveSharedSecret returns to\\n      derive a symmetric key that can encrypt and decrypt data that is sent between the two peers,\\n      or that can generate and verify HMACs. KMS recommends that you follow <a href=\\\"https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-56Cr2.pdf\\\">NIST\\n        recommendations for key derivation</a> when using the raw shared secret to derive a\\n      symmetric key.</p>\\n         <p>The following workflow demonstrates how to establish key agreement over an insecure\\n      communication channel using DeriveSharedSecret.</p>\\n         <ol>\\n            <li>\\n               <p>\\n                  <b>Alice</b> calls <a>CreateKey</a> to create an\\n          asymmetric KMS key pair with a <code>KeyUsage</code> value of\\n          <code>KEY_AGREEMENT</code>.</p>\\n               <p>The asymmetric KMS key must use a NIST-recommended elliptic curve (ECC) or SM2 (China\\n          Regions only) key spec.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>Bob</b> creates an elliptic curve key pair.</p>\\n               <p>Bob can call <a>CreateKey</a> to create an asymmetric KMS key pair or\\n          generate a key pair outside of KMS. Bob's key pair must use the same NIST-recommended\\n          elliptic curve (ECC) or SM2 (China Regions ony) curve as Alice.</p>\\n            </li>\\n            <li>\\n               <p>Alice and Bob <b>exchange their public keys</b> through an\\n          insecure communication channel (like the internet).</p>\\n               <p>Use <a>GetPublicKey</a> to download the public key of your asymmetric KMS\\n          key pair.</p>\\n               <note>\\n                  <p>KMS strongly recommends verifying that the public key you receive came from the\\n            expected party before using it to derive a shared secret.</p>\\n               </note>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>Alice</b> calls DeriveSharedSecret.</p>\\n               <p>KMS uses the private key from the KMS key pair generated in <b>Step 1</b>, Bob's public key, and the Elliptic Curve Cryptography Cofactor\\n          Diffie-Hellman Primitive to derive the shared secret. The private key in your KMS key pair\\n          never leaves KMS unencrypted. DeriveSharedSecret returns the raw shared secret.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>Bob</b> uses the Elliptic Curve Cryptography Cofactor\\n          Diffie-Hellman Primitive to calculate the same raw secret using his private key and\\n          Alice's public key.</p>\\n            </li>\\n         </ol>\\n         <p>To derive a shared secret you must provide a key agreement algorithm, the private key of\\n      the caller's asymmetric NIST-recommended elliptic curve or SM2 (China Regions only) KMS key\\n      pair, and the public key from your peer's NIST-recommended elliptic curve or SM2 (China\\n      Regions only) key pair. The public key can be from another asymmetric KMS key pair or from a\\n      key pair generated outside of KMS, but both key pairs must be on the same elliptic\\n      curve.</p>\\n         <p>The KMS key that you use for this operation must be in a compatible key state. For\\ndetails, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/key-state.html\\\">Key states of KMS keys</a> in the <i>Key Management Service Developer Guide</i>.</p>\\n         <p>\\n            <b>Cross-account use</b>: Yes. To perform this operation with a KMS key in a different Amazon Web Services account, specify\\n  the key ARN or alias ARN in the value of the <code>KeyId</code> parameter.</p>\\n         <p>\\n            <b>Required permissions</b>: <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/kms-api-permissions-reference.html\\\">kms:DeriveSharedSecret</a> (key policy)</p>\\n         <p>\\n            <b>Related operations:</b>\\n         </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a>CreateKey</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>GetPublicKey</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>DescribeKey</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>\\n            <b>Eventual consistency</b>: The KMS API follows an eventual consistency model. \\n  For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/accessing-kms.html#programming-eventual-consistency\\\">KMS eventual consistency</a>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To derive a shared secret\",\n                        \"documentation\": \"The following example derives a shared secret using a key agreement algorithm.\",\n                        \"input\": {\n                            \"KeyId\": \"1234abcd-12ab-34cd-56ef-1234567890ab\",\n                            \"KeyAgreementAlgorithm\": \"ECDH\",\n                            \"PublicKey\": \"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAvH3Yj0wbkLEpUl95Cv1cJVjsVNSjwGq3tCLnzXfhVwVvmzGN8pYj3U8nKwgouaHbBWNJYjP5VutbbkKS4Kv4GojwZBJyHN17kmxo8yTjRmjR15SKIQ8cqRA2uaERMLnpztIXdZp232PQPbWGxDyXYJ0aJ5EFSag\"\n                        },\n                        \"output\": {\n                            \"KeyId\": \"1234abcd-12ab-34cd-56ef-1234567890ab\",\n                            \"SharedSecret\": \"MEYCIQCKZLWyTk5runarx6XiAkU9gv3lbwPO/pHa+DXFehzdDwIhANwpsIV2g/9SPWLLsF6p/hiSskuIXMTRwqrMdVKWTMHG\",\n                            \"KeyAgreementAlgorithm\": \"ECDH\",\n                            \"KeyOrigin\": \"AWS_KMS\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.kms#DeriveSharedSecretRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"KeyId\": {\n                    \"target\": \"com.amazonaws.kms#KeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Identifies an asymmetric NIST-recommended ECC or SM2 (China Regions only) KMS key. KMS\\n      uses the private key in the specified key pair to derive the shared secret. The key usage of\\n      the KMS key must be <code>KEY_AGREEMENT</code>. To find the <code>KeyUsage</code> of a KMS\\n      key, use the <a>DescribeKey</a> operation.</p>\\n         <p>To specify a KMS key, use its key ID, key ARN, alias name, or alias ARN. When using an alias name, prefix it with <code>\\\"alias/\\\"</code>. To specify a KMS key in a different Amazon Web Services account, you must use the key ARN or alias ARN.</p>\\n         <p>For example:</p>\\n         <ul>\\n            <li>\\n               <p>Key ID: <code>1234abcd-12ab-34cd-56ef-1234567890ab</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Key ARN: <code>arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Alias name: <code>alias/ExampleAlias</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Alias ARN: <code>arn:aws:kms:us-east-2:111122223333:alias/ExampleAlias</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>To get the key ID and key ARN for a KMS key, use <a>ListKeys</a> or <a>DescribeKey</a>. To get the alias name and alias ARN, use <a>ListAliases</a>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"KeyAgreementAlgorithm\": {\n                    \"target\": \"com.amazonaws.kms#KeyAgreementAlgorithmSpec\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the key agreement algorithm used to derive the shared secret. The only valid\\n      value is <code>ECDH</code>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"PublicKey\": {\n                    \"target\": \"com.amazonaws.kms#PublicKeyType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the public key in your peer's NIST-recommended elliptic curve (ECC) or SM2\\n      (China Regions only) key pair.</p>\\n         <p>The public key must be a DER-encoded X.509 public key, also known as\\n        <code>SubjectPublicKeyInfo</code> (SPKI), as defined in <a href=\\\"https://tools.ietf.org/html/rfc5280\\\">RFC 5280</a>.</p>\\n         <p>\\n            <a>GetPublicKey</a> returns the public key of an asymmetric KMS key pair in the\\n      required DER-encoded format.</p>\\n         <note>\\n            <p>If you use <a href=\\\"https://docs.aws.amazon.com/cli/v1/userguide/cli-chap-welcome.html\\\">Amazon Web Services CLI version 1</a>, you must provide the DER-encoded X.509 public key in a file.\\n        Otherwise, the Amazon Web Services CLI Base64-encodes the public key a second time, resulting in a\\n          <code>ValidationException</code>.</p>\\n         </note>\\n         <p>You can specify the public key as binary data in a file using fileb\\n        (<code>fileb://<path-to-file></code>) or in-line using a Base64 encoded string.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"GrantTokens\": {\n                    \"target\": \"com.amazonaws.kms#GrantTokenList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of grant tokens.</p>\\n         <p>Use a grant token when your permission to call this operation comes from a new grant that has not yet achieved <i>eventual consistency</i>. For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/grants.html#grant_token\\\">Grant token</a> and <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/using-grant-token.html\\\">Using a grant token</a> in the\\n    <i>Key Management Service Developer Guide</i>.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.kms#NullableBooleanType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks if your request will succeed. <code>DryRun</code> is an optional parameter. </p>\\n         <p>To learn more about how to use this parameter, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/testing-permissions.html\\\">Testing your permissions</a> in the <i>Key Management Service Developer Guide</i>.</p>\"\n                    }\n                },\n                \"Recipient\": {\n                    \"target\": \"com.amazonaws.kms#RecipientInfo\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A signed <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/nitro-enclave-how.html#term-attestdoc\\\">attestation document</a> from\\n      an Amazon Web Services Nitro enclave or NitroTPM, and the encryption algorithm to use with the public key in the attestation document. The\\n      only valid encryption algorithm is <code>RSAES_OAEP_SHA_256</code>. </p>\\n         <p>This parameter only supports attestation documents for Amazon Web Services Nitro Enclaves or Amazon Web Services NitroTPM. To call\\n      DeriveSharedSecret generate an attestation document use either <a href=\\\"https://docs.aws.amazon.com/enclaves/latest/user/developing-applications.html#sdk\\\">Amazon Web Services Nitro Enclaves SDK</a> for an Amazon Web Services Nitro Enclaves or\\n      <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/attestation-get-doc.html\\\">Amazon Web Services NitroTPM tools</a> for Amazon Web Services NitroTPM. Then use the Recipient parameter from any Amazon Web Services SDK to provide the\\n      attestation document for the attested environment.</p>\\n         <p>When you use this parameter, instead of returning a plaintext copy of the shared secret,\\n      KMS encrypts the plaintext shared secret under the public key in the attestation document,\\n      and returns the resulting ciphertext in the <code>CiphertextForRecipient</code> field in the\\n      response. This ciphertext can be decrypted only with the private key in the attested environment. The\\n        <code>CiphertextBlob</code> field in the response contains the encrypted shared secret\\n      derived from the KMS key specified by the <code>KeyId</code> parameter and public key\\n      specified by the <code>PublicKey</code> parameter. The <code>SharedSecret</code> field in the\\n      response is null or empty.</p>\\n         <p>For information about the interaction between KMS and Amazon Web Services Nitro Enclaves or Amazon Web Services NitroTPM, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/cryptographic-attestation.html\\\">Cryptographic attestation support in KMS</a> in the <i>Key Management Service Developer Guide</i>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.kms#DeriveSharedSecretResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"KeyId\": {\n                    \"target\": \"com.amazonaws.kms#KeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Identifies the KMS key used to derive the shared secret.</p>\"\n                    }\n                },\n                \"SharedSecret\": {\n                    \"target\": \"com.amazonaws.kms#PlaintextType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The raw secret derived from the specified key agreement algorithm, private key in the\\n      asymmetric KMS key, and your peer's public key.</p>\\n         <p>If the response includes the <code>CiphertextForRecipient</code> field, the\\n        <code>SharedSecret</code> field is null or empty.</p>\"\n                    }\n                },\n                \"CiphertextForRecipient\": {\n                    \"target\": \"com.amazonaws.kms#CiphertextType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The plaintext shared secret encrypted with the public key from the attestation document. This\\n      ciphertext can be decrypted only by using a private key from the attested environment. </p>\\n         <p>This field is included in the response only when the <code>Recipient</code> parameter in\\n      the request includes a valid attestation document from an Amazon Web Services Nitro enclave or NitroTPM.\\n      For information about the interaction between KMS and Amazon Web Services Nitro Enclaves or Amazon Web Services NitroTPM, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/cryptographic-attestation.html\\\">Cryptographic attestation support in KMS</a> in the <i>Key Management Service Developer Guide</i>.</p>\"\n                    }\n                },\n                \"KeyAgreementAlgorithm\": {\n                    \"target\": \"com.amazonaws.kms#KeyAgreementAlgorithmSpec\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Identifies the key agreement algorithm used to derive the shared secret.</p>\"\n                    }\n                },\n                \"KeyOrigin\": {\n                    \"target\": \"com.amazonaws.kms#OriginType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The source of the key material for the specified KMS key.</p>\\n         <p>When this value is <code>AWS_KMS</code>, KMS created the key material. When this value\\n      is <code>EXTERNAL</code>, the key material was imported or the KMS key doesn't have any key\\n      material.</p>\\n         <p>The only valid values for DeriveSharedSecret are <code>AWS_KMS</code> and\\n        <code>EXTERNAL</code>. DeriveSharedSecret does not support KMS keys with a\\n        <code>KeyOrigin</code> value of <code>AWS_CLOUDHSM</code> or\\n      <code>EXTERNAL_KEY_STORE</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.kms#DescribeCustomKeyStores\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.kms#DescribeCustomKeyStoresRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.kms#DescribeCustomKeyStoresResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.kms#CustomKeyStoreNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#InvalidMarkerException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInternalException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Gets information about <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/key-store-overview.html\\\">custom key stores</a> in the account and Region.</p>\\n         <p> This operation is part of the custom key stores feature in KMS, which\\ncombines the convenience and extensive integration of KMS with the isolation and control of a\\nkey store that you own and manage.</p>\\n         <p>By default, this operation returns information about all custom key stores in the account\\n      and Region. To get only information about a particular custom key store, use either the\\n        <code>CustomKeyStoreName</code> or <code>CustomKeyStoreId</code> parameter (but not\\n      both).</p>\\n         <p>To determine whether the custom key store is connected to its CloudHSM cluster or external\\n      key store proxy, use the <code>ConnectionState</code> element in the response. If an attempt\\n      to connect the custom key store failed, the <code>ConnectionState</code> value is\\n        <code>FAILED</code> and the <code>ConnectionErrorCode</code> element in the response\\n      indicates the cause of the failure. For help interpreting the\\n      <code>ConnectionErrorCode</code>, see <a>CustomKeyStoresListEntry</a>.</p>\\n         <p>Custom key stores have a <code>DISCONNECTED</code> connection state if the key store has\\n      never been connected or you used the <a>DisconnectCustomKeyStore</a> operation to\\n      disconnect it. Otherwise, the connection state is CONNECTED. If your custom key store\\n      connection state is <code>CONNECTED</code> but you are having trouble using it, verify that\\n      the backing store is active and available. For an CloudHSM key store, verify that the associated\\n      CloudHSM cluster is active and contains the minimum number of HSMs required for the operation, if\\n      any. For an external key store, verify that the external key store proxy and its associated\\n      external key manager are reachable and enabled.</p>\\n         <p> For help repairing your CloudHSM key store, see the <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/fix-keystore.html\\\">Troubleshooting CloudHSM key stores</a>. For help\\n      repairing your external key store, see the <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/xks-troubleshooting.html\\\">Troubleshooting external key stores</a>.\\n      Both topics are in the <i>Key Management Service Developer Guide</i>.</p>\\n         <p>\\n            <b>Cross-account use</b>: No. You cannot perform this operation on a custom key store in a different Amazon Web Services account.</p>\\n         <p>\\n            <b>Required permissions</b>: <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/kms-api-permissions-reference.html\\\">kms:DescribeCustomKeyStores</a> (IAM policy)</p>\\n         <p>\\n            <b>Related operations:</b>\\n         </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a>ConnectCustomKeyStore</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>CreateCustomKeyStore</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>DeleteCustomKeyStore</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>DisconnectCustomKeyStore</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>UpdateCustomKeyStore</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>\\n            <b>Eventual consistency</b>: The KMS API follows an eventual consistency model. \\n  For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/accessing-kms.html#programming-eventual-consistency\\\">KMS eventual consistency</a>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To get detailed information about custom key stores in the account and Region\",\n                        \"documentation\": \"This example gets detailed information about all AWS KMS custom key stores in an AWS account and Region. To get all key stores, do not enter a custom key store name or ID.\",\n                        \"output\": {\n                            \"CustomKeyStores\": []\n                        }\n                    }\n                ],\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"Marker\",\n                    \"outputToken\": \"NextMarker\",\n                    \"items\": \"CustomKeyStores\",\n                    \"pageSize\": \"Limit\"\n                }\n            }\n        },\n        \"com.amazonaws.kms#DescribeCustomKeyStoresRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CustomKeyStoreId\": {\n                    \"target\": \"com.amazonaws.kms#CustomKeyStoreIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Gets only information about the specified custom key store. Enter the key store ID.</p>\\n         <p>By default, this operation gets information about all custom key stores in the account and\\n      Region. To limit the output to a particular custom key store, provide either the\\n        <code>CustomKeyStoreId</code> or <code>CustomKeyStoreName</code> parameter, but not\\n      both.</p>\"\n                    }\n                },\n                \"CustomKeyStoreName\": {\n                    \"target\": \"com.amazonaws.kms#CustomKeyStoreNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Gets only information about the specified custom key store. Enter the friendly name of the\\n      custom key store.</p>\\n         <p>By default, this operation gets information about all custom key stores in the account and\\n      Region. To limit the output to a particular custom key store, provide either the\\n        <code>CustomKeyStoreId</code> or <code>CustomKeyStoreName</code> parameter, but not\\n      both.</p>\"\n                    }\n                },\n                \"Limit\": {\n                    \"target\": \"com.amazonaws.kms#LimitType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter to specify the maximum number of items to return. When this\\n    value is present, KMS does not return more than the specified number of items, but it might\\n    return fewer.</p>\"\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.kms#MarkerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter in a subsequent request after you receive a response with\\n    truncated results. Set it to the value of <code>NextMarker</code> from the truncated response\\n    you just received.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.kms#DescribeCustomKeyStoresResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CustomKeyStores\": {\n                    \"target\": \"com.amazonaws.kms#CustomKeyStoresList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Contains metadata about each custom key store.</p>\"\n                    }\n                },\n                \"NextMarker\": {\n                    \"target\": \"com.amazonaws.kms#MarkerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>When <code>Truncated</code> is true, this element is present and contains the\\n    value to use for the <code>Marker</code> parameter in a subsequent request.</p>\"\n                    }\n                },\n                \"Truncated\": {\n                    \"target\": \"com.amazonaws.kms#BooleanType\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>A flag that indicates whether there are more items in the list. When this\\n    value is true, the list in this response is truncated. To get more items, pass the value of\\n    the <code>NextMarker</code> element in this response to the <code>Marker</code> parameter in a\\n    subsequent request.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.kms#DescribeKey\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.kms#DescribeKeyRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.kms#DescribeKeyResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.kms#DependencyTimeoutException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#InvalidArnException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInternalException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#NotFoundException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Provides detailed information about a KMS key. You can run <code>DescribeKey</code> on a\\n        <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-mgn-key\\\">customer\\n        managed key</a> or an <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-key\\\">Amazon Web Services managed key</a>.</p>\\n         <p>This detailed information includes the key ARN, creation date (and deletion date, if\\n      applicable), the key state, and the origin and expiration date (if any) of the key material.\\n      It includes fields, like <code>KeySpec</code>, that help you distinguish different types of\\n      KMS keys. It also displays the key usage (encryption, signing, or generating and verifying\\n      MACs) and the algorithms that the KMS key supports. </p>\\n         <p>For <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/multi-region-keys-overview.html\\\">multi-Region keys</a>, <code>DescribeKey</code> displays the primary key and all\\n      related replica keys. For KMS keys in <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/keystore-cloudhsm.html\\\">CloudHSM key stores</a>, it includes information\\n      about the key store, such as the key store ID and the CloudHSM cluster ID. For KMS keys in <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/keystore-external.html\\\">external key stores</a>,\\n      it includes the custom key store ID and the ID of the external key.</p>\\n         <p>\\n            <code>DescribeKey</code> does not return the following information:</p>\\n         <ul>\\n            <li>\\n               <p>Aliases associated with the KMS key. To get this information, use <a>ListAliases</a>.</p>\\n            </li>\\n            <li>\\n               <p>Whether automatic key rotation is enabled on the KMS key. To get this information, use\\n            <a>GetKeyRotationStatus</a>. Also, some key states prevent a KMS key from\\n          being automatically rotated. For details, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/rotate-keys.html#rotate-keys-how-it-works\\\">How key rotation\\n            works</a> in the <i>Key Management Service Developer Guide</i>.</p>\\n            </li>\\n            <li>\\n               <p>Tags on the KMS key. To get this information, use <a>ListResourceTags</a>.</p>\\n            </li>\\n            <li>\\n               <p>Key policies and grants on the KMS key. To get this information, use <a>GetKeyPolicy</a> and <a>ListGrants</a>.</p>\\n            </li>\\n         </ul>\\n         <p>In general, <code>DescribeKey</code> is a non-mutating operation. It returns data about\\n      KMS keys, but doesn't change them. However, Amazon Web Services services use <code>DescribeKey</code> to\\n      create <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-key\\\">Amazon Web Services\\n        managed keys</a> from a <i>predefined Amazon Web Services alias</i> with no key\\n      ID.</p>\\n         <p>\\n            <b>Cross-account use</b>: Yes. To perform this operation with a KMS key in a different Amazon Web Services account, specify\\n  the key ARN or alias ARN in the value of the <code>KeyId</code> parameter.</p>\\n         <p>\\n            <b>Required permissions</b>: <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/kms-api-permissions-reference.html\\\">kms:DescribeKey</a> (key policy)</p>\\n         <p>\\n            <b>Related operations:</b>\\n         </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a>GetKeyPolicy</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>GetKeyRotationStatus</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>ListAliases</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>ListGrants</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>ListKeys</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>ListResourceTags</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>ListRetirableGrants</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>\\n            <b>Eventual consistency</b>: The KMS API follows an eventual consistency model. \\n  For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/accessing-kms.html#programming-eventual-consistency\\\">KMS eventual consistency</a>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To get details about a KMS key in an AWS CloudHSM key store\",\n                        \"documentation\": \"The following example gets the metadata of a KMS key in an AWS CloudHSM key store.\",\n                        \"input\": {\n                            \"KeyId\": \"arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab\"\n                        },\n                        \"output\": {\n                            \"KeyMetadata\": {\n                                \"AWSAccountId\": \"123456789012\",\n                                \"KeyId\": \"1234abcd-12ab-34cd-56ef-1234567890ab\",\n                                \"Arn\": \"arn:aws:kms:us-west-2:123456789012:key/1234abcd-12ab-34cd-56ef-1234567890ab\",\n                                \"CreationDate\": 1.646160362664E9,\n                                \"Description\": \"CloudHSM key store test key\",\n                                \"Enabled\": true,\n                                \"MultiRegion\": false,\n                                \"KeyManager\": \"CUSTOMER\",\n                                \"KeyState\": \"Enabled\",\n                                \"KeyUsage\": \"ENCRYPT_DECRYPT\",\n                                \"Origin\": \"AWS_CLOUDHSM\",\n                                \"CloudHsmClusterId\": \"cluster-234abcdefABC\",\n                                \"CustomKeyStoreId\": \"cks-1234567890abcdef0\",\n                                \"KeySpec\": \"SYMMETRIC_DEFAULT\",\n                                \"CustomerMasterKeySpec\": \"SYMMETRIC_DEFAULT\",\n                                \"EncryptionAlgorithms\": [\n                                    \"SYMMETRIC_DEFAULT\"\n                                ]\n                            }\n                        }\n                    },\n                    {\n                        \"title\": \"To get details about a KMS key in an external key store\",\n                        \"documentation\": \"The following example gets the metadata of a KMS key in an external key store.\",\n                        \"input\": {\n                            \"KeyId\": \"arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab\"\n                        },\n                        \"output\": {\n                            \"KeyMetadata\": {\n                                \"Arn\": \"arn:aws:kms:us-west-2:123456789012:key/1234abcd-12ab-34cd-56ef-1234567890ab\",\n                                \"AWSAccountId\": \"123456789012\",\n                                \"CreationDate\": 1.646160362664E9,\n                                \"CustomerMasterKeySpec\": \"SYMMETRIC_DEFAULT\",\n                                \"CustomKeyStoreId\": \"cks-1234567890abcdef0\",\n                                \"Description\": \"External key store test key\",\n                                \"Enabled\": true,\n                                \"EncryptionAlgorithms\": [\n                                    \"SYMMETRIC_DEFAULT\"\n                                ],\n                                \"KeyId\": \"1234abcd-12ab-34cd-56ef-1234567890ab\",\n                                \"KeyManager\": \"CUSTOMER\",\n                                \"KeySpec\": \"SYMMETRIC_DEFAULT\",\n                                \"KeyState\": \"Enabled\",\n                                \"KeyUsage\": \"ENCRYPT_DECRYPT\",\n                                \"MultiRegion\": false,\n                                \"Origin\": \"EXTERNAL_KEY_STORE\",\n                                \"XksKeyConfiguration\": {\n                                    \"Id\": \"bb8562717f809024\"\n                                }\n                            }\n                        }\n                    },\n                    {\n                        \"title\": \"To get details about a multi-Region key\",\n                        \"documentation\": \"The following example gets metadata for a multi-Region replica key. This multi-Region key is a symmetric encryption key. DescribeKey returns information about the primary key and all of its replicas.\",\n                        \"input\": {\n                            \"KeyId\": \"arn:aws:kms:ap-northeast-1:111122223333:key/mrk-1234abcd12ab34cd56ef1234567890ab\"\n                        },\n                        \"output\": {\n                            \"KeyMetadata\": {\n                                \"MultiRegion\": true,\n                                \"AWSAccountId\": \"111122223333\",\n                                \"Arn\": \"arn:aws:kms:ap-northeast-1:111122223333:key/mrk-1234abcd12ab34cd56ef1234567890ab\",\n                                \"CreationDate\": 1.586329200918E9,\n                                \"Description\": \"\",\n                                \"Enabled\": true,\n                                \"KeyId\": \"mrk-1234abcd12ab34cd56ef1234567890ab\",\n                                \"KeyManager\": \"CUSTOMER\",\n                                \"KeyState\": \"Enabled\",\n                                \"KeyUsage\": \"ENCRYPT_DECRYPT\",\n                                \"Origin\": \"AWS_KMS\",\n                                \"CustomerMasterKeySpec\": \"SYMMETRIC_DEFAULT\",\n                                \"CurrentKeyMaterialId\": \"0b7fd7ddbac6eef27907413567cad8c810e2883dc8a7534067a82ee1142fc1e6\",\n                                \"EncryptionAlgorithms\": [\n                                    \"SYMMETRIC_DEFAULT\"\n                                ],\n                                \"MultiRegionConfiguration\": {\n                                    \"MultiRegionKeyType\": \"PRIMARY\",\n                                    \"PrimaryKey\": {\n                                        \"Arn\": \"arn:aws:kms:us-west-2:111122223333:key/mrk-1234abcd12ab34cd56ef1234567890ab\",\n                                        \"Region\": \"us-west-2\"\n                                    },\n                                    \"ReplicaKeys\": [\n                                        {\n                                            \"Arn\": \"arn:aws:kms:eu-west-1:111122223333:key/mrk-1234abcd12ab34cd56ef1234567890ab\",\n                                            \"Region\": \"eu-west-1\"\n                                        },\n                                        {\n                                            \"Arn\": \"arn:aws:kms:ap-northeast-1:111122223333:key/mrk-1234abcd12ab34cd56ef1234567890ab\",\n                                            \"Region\": \"ap-northeast-1\"\n                                        },\n                                        {\n                                            \"Arn\": \"arn:aws:kms:sa-east-1:111122223333:key/mrk-1234abcd12ab34cd56ef1234567890ab\",\n                                            \"Region\": \"sa-east-1\"\n                                        }\n                                    ]\n                                }\n                            }\n                        }\n                    },\n                    {\n                        \"title\": \"To get details about an HMAC KMS key\",\n                        \"documentation\": \"The following example gets the metadata of an HMAC KMS key.\",\n                        \"input\": {\n                            \"KeyId\": \"arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab\"\n                        },\n                        \"output\": {\n                            \"KeyMetadata\": {\n                                \"AWSAccountId\": \"123456789012\",\n                                \"KeyId\": \"1234abcd-12ab-34cd-56ef-1234567890ab\",\n                                \"Arn\": \"arn:aws:kms:us-west-2:123456789012:key/1234abcd-12ab-34cd-56ef-1234567890ab\",\n                                \"CreationDate\": 1.566160362664E9,\n                                \"Enabled\": true,\n                                \"Description\": \"Development test key\",\n                                \"KeyUsage\": \"GENERATE_VERIFY_MAC\",\n                                \"KeyState\": \"Enabled\",\n                                \"Origin\": \"AWS_KMS\",\n                                \"KeyManager\": \"CUSTOMER\",\n                                \"CustomerMasterKeySpec\": \"HMAC_256\",\n                                \"MacAlgorithms\": [\n                                    \"HMAC_SHA_256\"\n                                ],\n                                \"MultiRegion\": false\n                            }\n                        }\n                    },\n                    {\n                        \"title\": \"To get details about an RSA asymmetric KMS key\",\n                        \"documentation\": \"The following example gets metadata for an asymmetric RSA KMS key used for signing and verification.\",\n                        \"input\": {\n                            \"KeyId\": \"1234abcd-12ab-34cd-56ef-1234567890ab\"\n                        },\n                        \"output\": {\n                            \"KeyMetadata\": {\n                                \"AWSAccountId\": \"111122223333\",\n                                \"KeyId\": \"1234abcd-12ab-34cd-56ef-1234567890ab\",\n                                \"Arn\": \"arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab\",\n                                \"CreationDate\": 1.571767572317E9,\n                                \"CustomerMasterKeySpec\": \"RSA_2048\",\n                                \"Enabled\": false,\n                                \"Description\": \"\",\n                                \"KeyState\": \"Disabled\",\n                                \"Origin\": \"AWS_KMS\",\n                                \"MultiRegion\": false,\n                                \"KeyManager\": \"CUSTOMER\",\n                                \"KeySpec\": \"RSA_2048\",\n                                \"KeyUsage\": \"SIGN_VERIFY\",\n                                \"SigningAlgorithms\": [\n                                    \"RSASSA_PKCS1_V1_5_SHA_256\",\n                                    \"RSASSA_PKCS1_V1_5_SHA_384\",\n                                    \"RSASSA_PKCS1_V1_5_SHA_512\",\n                                    \"RSASSA_PSS_SHA_256\",\n                                    \"RSASSA_PSS_SHA_384\",\n                                    \"RSASSA_PSS_SHA_512\"\n                                ]\n                            }\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.kms#DescribeKeyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"KeyId\": {\n                    \"target\": \"com.amazonaws.kms#KeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Describes the specified KMS key. </p>\\n         <p>If you specify a predefined Amazon Web Services alias (an Amazon Web Services alias with no key ID), KMS associates\\n      the alias with an <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-key\\\">Amazon Web Services managed key</a> and returns its <code>KeyId</code> and <code>Arn</code> in the\\n      response.</p>\\n         <p>To specify a KMS key, use its key ID, key ARN, alias name, or alias ARN. When using an alias name, prefix it with <code>\\\"alias/\\\"</code>. To specify a KMS key in a different Amazon Web Services account, you must use the key ARN or alias ARN.</p>\\n         <p>For example:</p>\\n         <ul>\\n            <li>\\n               <p>Key ID: <code>1234abcd-12ab-34cd-56ef-1234567890ab</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Key ARN: <code>arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Alias name: <code>alias/ExampleAlias</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Alias ARN: <code>arn:aws:kms:us-east-2:111122223333:alias/ExampleAlias</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>To get the key ID and key ARN for a KMS key, use <a>ListKeys</a> or <a>DescribeKey</a>. To get the alias name and alias ARN, use <a>ListAliases</a>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"GrantTokens\": {\n                    \"target\": \"com.amazonaws.kms#GrantTokenList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of grant tokens.</p>\\n         <p>Use a grant token when your permission to call this operation comes from a new grant that has not yet achieved <i>eventual consistency</i>. For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/grants.html#grant_token\\\">Grant token</a> and <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/using-grant-token.html\\\">Using a grant token</a> in the\\n    <i>Key Management Service Developer Guide</i>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.kms#DescribeKeyResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"KeyMetadata\": {\n                    \"target\": \"com.amazonaws.kms#KeyMetadata\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Metadata associated with the key.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.kms#DescriptionType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 8192\n                }\n            }\n        },\n        \"com.amazonaws.kms#DisableKey\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.kms#DisableKeyRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.kms#DependencyTimeoutException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#InvalidArnException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInternalException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInvalidStateException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#NotFoundException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Sets the state of a KMS key to disabled. This change temporarily prevents use of the KMS\\n      key for <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/kms-cryptography.html#cryptographic-operations\\\">cryptographic operations</a>. </p>\\n         <p>The KMS key that you use for this operation must be in a compatible key state. For more\\n      information about how key state affects the use of a KMS key, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/key-state.html\\\">Key states of KMS keys</a> in the\\n        <i>\\n               <i>Key Management Service Developer Guide</i>\\n            </i>.</p>\\n         <p>\\n            <b>Cross-account use</b>: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.</p>\\n         <p>\\n            <b>Required permissions</b>: <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/kms-api-permissions-reference.html\\\">kms:DisableKey</a> (key policy)</p>\\n         <p>\\n            <b>Related operations</b>: <a>EnableKey</a>\\n         </p>\\n         <p>\\n            <b>Eventual consistency</b>: The KMS API follows an eventual consistency model. \\n  For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/accessing-kms.html#programming-eventual-consistency\\\">KMS eventual consistency</a>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To disable a KMS key\",\n                        \"documentation\": \"The following example disables the specified KMS key.\",\n                        \"input\": {\n                            \"KeyId\": \"1234abcd-12ab-34cd-56ef-1234567890ab\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.kms#DisableKeyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"KeyId\": {\n                    \"target\": \"com.amazonaws.kms#KeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Identifies the KMS key to disable.</p>\\n         <p>Specify the key ID or key ARN of the KMS key.</p>\\n         <p>For example:</p>\\n         <ul>\\n            <li>\\n               <p>Key ID: <code>1234abcd-12ab-34cd-56ef-1234567890ab</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Key ARN: <code>arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>To get the key ID and key ARN for a KMS key, use <a>ListKeys</a> or <a>DescribeKey</a>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.kms#DisableKeyRotation\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.kms#DisableKeyRotationRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.kms#DependencyTimeoutException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#DisabledException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#InvalidArnException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInternalException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInvalidStateException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#NotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#UnsupportedOperationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Disables <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/rotating-keys-enable-disable.html\\\">automatic rotation of the key material</a> of the specified symmetric encryption KMS\\n      key.</p>\\n         <p>Automatic key rotation is supported only on symmetric encryption KMS keys.\\n      You cannot enable automatic rotation of <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/symmetric-asymmetric.html\\\">asymmetric KMS keys</a>, <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/hmac.html\\\">HMAC KMS keys</a>, KMS keys with <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/importing-keys.html\\\">imported key material</a>, or KMS keys in a <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/key-store-overview.html\\\">custom key store</a>. To enable or disable automatic rotation of a set of related <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/rotate-keys.html#multi-region-rotate\\\">multi-Region keys</a>, set the property on the primary key.</p>\\n         <p>You can enable (<a>EnableKeyRotation</a>) and disable automatic rotation of the\\n      key material in <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-mgn-key\\\">customer managed KMS keys</a>. Key material rotation of <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-key\\\">Amazon Web Services managed KMS keys</a> is not\\n      configurable. KMS always rotates the key material for every year. Rotation of <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-owned-key\\\">Amazon Web Services owned KMS\\n        keys</a> varies.</p>\\n         <note>\\n            <p>In May 2022, KMS changed the rotation schedule for Amazon Web Services managed keys from every three\\n        years to every year. For details, see <a>EnableKeyRotation</a>.</p>\\n         </note>\\n         <p>The KMS key that you use for this operation must be in a compatible key state. For\\ndetails, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/key-state.html\\\">Key states of KMS keys</a> in the <i>Key Management Service Developer Guide</i>.</p>\\n         <p>\\n            <b>Cross-account use</b>: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.</p>\\n         <p>\\n            <b>Required permissions</b>: <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/kms-api-permissions-reference.html\\\">kms:DisableKeyRotation</a> (key policy)</p>\\n         <p>\\n            <b>Related operations:</b>\\n         </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a>EnableKeyRotation</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>GetKeyRotationStatus</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>ListKeyRotations</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>RotateKeyOnDemand</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>\\n            <b>Eventual consistency</b>: The KMS API follows an eventual consistency model. \\n  For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/accessing-kms.html#programming-eventual-consistency\\\">KMS eventual consistency</a>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To disable automatic rotation of key material\",\n                        \"documentation\": \"The following example disables automatic annual rotation of the key material for the specified KMS key.\",\n                        \"input\": {\n                            \"KeyId\": \"1234abcd-12ab-34cd-56ef-1234567890ab\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.kms#DisableKeyRotationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"KeyId\": {\n                    \"target\": \"com.amazonaws.kms#KeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Identifies a symmetric encryption KMS key. You cannot enable or disable automatic rotation\\n      of <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/symmetric-asymmetric.html#asymmetric-cmks\\\">asymmetric KMS keys</a>, <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/hmac.html\\\">HMAC\\n        KMS keys</a>, KMS keys with <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/importing-keys.html\\\">imported key material</a>, or KMS keys in a\\n      <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/key-store-overview.html\\\">custom key store</a>.</p>\\n         <p>Specify the key ID or key ARN of the KMS key.</p>\\n         <p>For example:</p>\\n         <ul>\\n            <li>\\n               <p>Key ID: <code>1234abcd-12ab-34cd-56ef-1234567890ab</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Key ARN: <code>arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>To get the key ID and key ARN for a KMS key, use <a>ListKeys</a> or <a>DescribeKey</a>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.kms#DisabledException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.kms#ErrorMessageType\"\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"Disabled\",\n                    \"httpResponseCode\": 409\n                },\n                \"smithy.api#documentation\": \"<p>The request was rejected because the specified KMS key is not enabled.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 409\n            }\n        },\n        \"com.amazonaws.kms#DisconnectCustomKeyStore\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.kms#DisconnectCustomKeyStoreRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.kms#DisconnectCustomKeyStoreResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.kms#CustomKeyStoreInvalidStateException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#CustomKeyStoreNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInternalException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Disconnects the <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/key-store-overview.html\\\">custom key store</a> from its backing key store. This operation disconnects an\\n      CloudHSM key store from its associated CloudHSM cluster or disconnects an external key store from\\n      the external key store proxy that communicates with your external key manager.</p>\\n         <p> This operation is part of the custom key stores feature in KMS, which\\ncombines the convenience and extensive integration of KMS with the isolation and control of a\\nkey store that you own and manage.</p>\\n         <p>While a custom key store is disconnected, you can manage the custom key store and its KMS\\n      keys, but you cannot create or use its KMS keys. You can reconnect the custom key store at any\\n      time.</p>\\n         <note>\\n            <p>While a custom key store is disconnected, all attempts to create KMS keys in the custom key store or to use existing KMS keys in <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/kms-cryptography.html#cryptographic-operations\\\">cryptographic operations</a> will\\n        fail. This action can prevent users from storing and accessing sensitive data.</p>\\n         </note>\\n         <p>When you disconnect a custom key store, its <code>ConnectionState</code> changes to\\n        <code>Disconnected</code>. To find the connection state of a custom key store, use the <a>DescribeCustomKeyStores</a> operation. To reconnect a custom key store, use the\\n        <a>ConnectCustomKeyStore</a> operation.</p>\\n         <p>If the operation succeeds, it returns a JSON object with no\\nproperties.</p>\\n         <p>\\n            <b>Cross-account use</b>: No. You cannot perform this operation on a custom key store in a different Amazon Web Services account.</p>\\n         <p>\\n            <b>Required permissions</b>: <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/kms-api-permissions-reference.html\\\">kms:DisconnectCustomKeyStore</a> (IAM policy)</p>\\n         <p>\\n            <b>Related operations:</b>\\n         </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a>ConnectCustomKeyStore</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>CreateCustomKeyStore</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>DeleteCustomKeyStore</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>DescribeCustomKeyStores</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>UpdateCustomKeyStore</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>\\n            <b>Eventual consistency</b>: The KMS API follows an eventual consistency model. \\n  For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/accessing-kms.html#programming-eventual-consistency\\\">KMS eventual consistency</a>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To disconnect a custom key store from its CloudHSM cluster\",\n                        \"documentation\": \"This example disconnects an AWS KMS custom key store from its backing key store. For an AWS CloudHSM key store, it disconnects the key store from its AWS CloudHSM cluster. For an external key store, it disconnects the key store from the external key store proxy that communicates with your external key manager. This operation doesn't return any data. To verify that the custom key store is disconnected, use the <code>DescribeCustomKeyStores</code> operation.\",\n                        \"input\": {\n                            \"CustomKeyStoreId\": \"cks-1234567890abcdef0\"\n                        },\n                        \"output\": {}\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.kms#DisconnectCustomKeyStoreRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CustomKeyStoreId\": {\n                    \"target\": \"com.amazonaws.kms#CustomKeyStoreIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Enter the ID of the custom key store you want to disconnect. To find the ID of a custom key store, use the <a>DescribeCustomKeyStores</a> operation.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.kms#DisconnectCustomKeyStoreResponse\": {\n            \"type\": \"structure\",\n            \"members\": {},\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.kms#DryRunOperationException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.kms#ErrorMessageType\"\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"DryRunOperation\",\n                    \"httpResponseCode\": 412\n                },\n                \"smithy.api#documentation\": \"<p> The request was rejected because the DryRun parameter was specified. </p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 412\n            }\n        },\n        \"com.amazonaws.kms#EnableKey\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.kms#EnableKeyRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.kms#DependencyTimeoutException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#InvalidArnException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInternalException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInvalidStateException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#NotFoundException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Sets the key state of a KMS key to enabled. This allows you to use the KMS key for\\n      <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/kms-cryptography.html#cryptographic-operations\\\">cryptographic operations</a>. </p>\\n         <p>The KMS key that you use for this operation must be in a compatible key state. For\\ndetails, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/key-state.html\\\">Key states of KMS keys</a> in the <i>Key Management Service Developer Guide</i>.</p>\\n         <p>\\n            <b>Cross-account use</b>: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.</p>\\n         <p>\\n            <b>Required permissions</b>: <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/kms-api-permissions-reference.html\\\">kms:EnableKey</a> (key policy)</p>\\n         <p>\\n            <b>Related operations</b>: <a>DisableKey</a>\\n         </p>\\n         <p>\\n            <b>Eventual consistency</b>: The KMS API follows an eventual consistency model. \\n  For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/accessing-kms.html#programming-eventual-consistency\\\">KMS eventual consistency</a>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To enable a KMS key\",\n                        \"documentation\": \"The following example enables the specified KMS key.\",\n                        \"input\": {\n                            \"KeyId\": \"1234abcd-12ab-34cd-56ef-1234567890ab\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.kms#EnableKeyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"KeyId\": {\n                    \"target\": \"com.amazonaws.kms#KeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Identifies the KMS key to enable.</p>\\n         <p>Specify the key ID or key ARN of the KMS key.</p>\\n         <p>For example:</p>\\n         <ul>\\n            <li>\\n               <p>Key ID: <code>1234abcd-12ab-34cd-56ef-1234567890ab</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Key ARN: <code>arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>To get the key ID and key ARN for a KMS key, use <a>ListKeys</a> or <a>DescribeKey</a>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.kms#EnableKeyRotation\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.kms#EnableKeyRotationRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.kms#DependencyTimeoutException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#DisabledException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#InvalidArnException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInternalException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInvalidStateException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#NotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#UnsupportedOperationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Enables <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/rotating-keys-enable-disable.html\\\">automatic rotation of the key material</a> of the specified symmetric encryption KMS\\n      key. </p>\\n         <p>By default, when you enable automatic rotation of a <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-mgn-key\\\">customer managed KMS key</a>, KMS\\n      rotates the key material of the KMS key one year (approximately 365 days) from the enable date\\n      and every year thereafter. You can use the optional <code>RotationPeriodInDays</code>\\n      parameter to specify a custom rotation period when you enable key rotation, or you can use\\n        <code>RotationPeriodInDays</code> to modify the rotation period of a key that you previously\\n      enabled automatic key rotation on.</p>\\n         <p>You can monitor rotation of the key material for your KMS keys in CloudTrail and Amazon CloudWatch. To disable rotation of the key material in a customer managed KMS key, use\\n      the <a>DisableKeyRotation</a> operation. You can use the <a>GetKeyRotationStatus</a> operation to identify any in progress rotations. You can\\n      use the <a>ListKeyRotations</a> operation to view the details of completed\\n      rotations.</p>\\n         <p>Automatic key rotation is supported only on symmetric encryption KMS keys. You cannot enable automatic rotation of <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/symmetric-asymmetric.html\\\">asymmetric KMS keys</a>, <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/hmac.html\\\">HMAC KMS keys</a>, KMS keys with <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/importing-keys.html\\\">imported key material</a>, or KMS keys in a <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/key-store-overview.html\\\">custom key store</a>. To enable or disable automatic rotation of a set of related <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/rotate-keys.html#multi-region-rotate\\\">multi-Region keys</a>, set the property on the primary key. </p>\\n         <p>You cannot enable or disable automatic rotation of <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-key\\\">Amazon Web Services managed KMS keys</a>. KMS\\n      always rotates the key material of Amazon Web Services managed keys every year. Rotation of <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-owned-key\\\">Amazon Web Services owned KMS\\n        keys</a> is managed by the Amazon Web Services service that owns the key.</p>\\n         <note>\\n            <p>In May 2022, KMS changed the rotation schedule for Amazon Web Services managed keys from every three\\n        years (approximately 1,095 days) to every year (approximately 365 days).</p>\\n            <p>New Amazon Web Services managed keys are automatically rotated one year after they are created, and\\n        approximately every year thereafter. </p>\\n            <p>Existing Amazon Web Services managed keys are automatically rotated one year after their most recent\\n        rotation, and every year thereafter.</p>\\n         </note>\\n         <p>The KMS key that you use for this operation must be in a compatible key state. For\\ndetails, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/key-state.html\\\">Key states of KMS keys</a> in the <i>Key Management Service Developer Guide</i>.</p>\\n         <p>\\n            <b>Cross-account use</b>: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.</p>\\n         <p>\\n            <b>Required permissions</b>: <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/kms-api-permissions-reference.html\\\">kms:EnableKeyRotation</a> (key policy)</p>\\n         <p>\\n            <b>Related operations:</b>\\n         </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a>DisableKeyRotation</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>GetKeyRotationStatus</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>ListKeyRotations</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>RotateKeyOnDemand</a>\\n               </p>\\n               <note>\\n                  <p>You can perform on-demand (<a>RotateKeyOnDemand</a>) rotation of the key\\n            material in customer managed KMS keys, regardless of whether or not automatic key\\n            rotation is enabled.</p>\\n               </note>\\n            </li>\\n         </ul>\\n         <p>\\n            <b>Eventual consistency</b>: The KMS API follows an eventual consistency model. \\n  For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/accessing-kms.html#programming-eventual-consistency\\\">KMS eventual consistency</a>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To enable automatic rotation of key material\",\n                        \"documentation\": \"The following example enables automatic rotation with a rotation period of 365 days for the specified KMS key.\",\n                        \"input\": {\n                            \"KeyId\": \"1234abcd-12ab-34cd-56ef-1234567890ab\",\n                            \"RotationPeriodInDays\": 365\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.kms#EnableKeyRotationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"KeyId\": {\n                    \"target\": \"com.amazonaws.kms#KeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Identifies a symmetric encryption KMS key. You cannot enable automatic rotation of <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/symmetric-asymmetric.html\\\">asymmetric KMS keys</a>, <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/hmac.html\\\">HMAC KMS keys</a>, KMS keys with <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/importing-keys.html\\\">imported key material</a>, or KMS keys in a <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/key-store-overview.html\\\">custom key store</a>. To enable or disable automatic rotation of a set of related <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/rotate-keys.html#multi-region-rotate\\\">multi-Region keys</a>, set the property on the primary key.</p>\\n         <p>Specify the key ID or key ARN of the KMS key.</p>\\n         <p>For example:</p>\\n         <ul>\\n            <li>\\n               <p>Key ID: <code>1234abcd-12ab-34cd-56ef-1234567890ab</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Key ARN: <code>arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>To get the key ID and key ARN for a KMS key, use <a>ListKeys</a> or <a>DescribeKey</a>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"RotationPeriodInDays\": {\n                    \"target\": \"com.amazonaws.kms#RotationPeriodInDaysType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter to specify a custom period of time between each rotation date. If no\\n      value is specified, the default value is 365 days.</p>\\n         <p>The rotation period defines the number of days after you enable automatic key rotation\\n      that KMS will rotate your key material, and the number of days between each automatic\\n      rotation thereafter.</p>\\n         <p>You can use the <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/conditions-kms.html#conditions-kms-rotation-period-in-days\\\">\\n               <code>kms:RotationPeriodInDays</code>\\n            </a> condition key to further constrain the\\n      values that principals can specify in the <code>RotationPeriodInDays</code> parameter.</p>\\n         <p> </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.kms#Encrypt\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.kms#EncryptRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.kms#EncryptResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.kms#DependencyTimeoutException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#DisabledException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#DryRunOperationException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#InvalidGrantTokenException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#InvalidKeyUsageException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KeyUnavailableException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInternalException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInvalidStateException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#NotFoundException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Encrypts plaintext of up to 4,096 bytes using a KMS key. You can use a symmetric or\\n      asymmetric KMS key with a <code>KeyUsage</code> of <code>ENCRYPT_DECRYPT</code>.</p>\\n         <p>You can use this operation to encrypt small amounts of arbitrary data, such as a personal\\n      identifier or database password, or other sensitive information. You don't need to use the\\n        <code>Encrypt</code> operation to encrypt a data key. The <a>GenerateDataKey</a>\\n      and <a>GenerateDataKeyPair</a> operations return a plaintext data key and an\\n      encrypted copy of that data key.</p>\\n         <p>If you use a symmetric encryption KMS key, you can use an encryption context to add\\n      additional security to your encryption operation. If you specify an\\n        <code>EncryptionContext</code> when encrypting data, you must specify the same encryption\\n      context (a case-sensitive exact match) when decrypting the data. Otherwise, the request to\\n      decrypt fails with an <code>InvalidCiphertextException</code>. For more information, see\\n        <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/encrypt_context.html\\\">Encryption\\n        Context</a> in the <i>Key Management Service Developer Guide</i>.</p>\\n         <p>If you specify an asymmetric KMS key, you must also specify the encryption algorithm. The\\n      algorithm must be compatible with the KMS key spec.</p>\\n         <important>\\n            <p>When you use an asymmetric KMS key to encrypt or reencrypt data, be sure to record the KMS key and encryption algorithm that you choose. You will be required to provide the same KMS key and encryption algorithm when you decrypt the data. If the KMS key and algorithm do not match the values used to encrypt the data, the decrypt operation fails.</p>\\n            <p>You are not required to supply the key ID and encryption algorithm when you decrypt with symmetric encryption KMS keys because KMS stores this information in the ciphertext blob. KMS cannot store metadata in ciphertext generated with asymmetric keys. The standard format for asymmetric key ciphertext does not include configurable fields.</p>\\n         </important>\\n         <p>The maximum size of the data that you can encrypt varies with the type of KMS key and the\\n      encryption algorithm that you choose.</p>\\n         <ul>\\n            <li>\\n               <p>Symmetric encryption KMS keys</p>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <code>SYMMETRIC_DEFAULT</code>: 4096 bytes</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>RSA_2048</code>\\n               </p>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <code>RSAES_OAEP_SHA_1</code>: 214 bytes</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <code>RSAES_OAEP_SHA_256</code>: 190 bytes</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>RSA_3072</code>\\n               </p>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <code>RSAES_OAEP_SHA_1</code>: 342 bytes</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <code>RSAES_OAEP_SHA_256</code>: 318 bytes</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>RSA_4096</code>\\n               </p>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <code>RSAES_OAEP_SHA_1</code>: 470 bytes</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <code>RSAES_OAEP_SHA_256</code>: 446 bytes</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>SM2PKE</code>: 1024 bytes (China Regions only)</p>\\n            </li>\\n         </ul>\\n         <p>The KMS key that you use for this operation must be in a compatible key state. For\\ndetails, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/key-state.html\\\">Key states of KMS keys</a> in the <i>Key Management Service Developer Guide</i>.</p>\\n         <p>\\n            <b>Cross-account use</b>: Yes. To perform this operation with a KMS key in a different Amazon Web Services account, specify\\n  the key ARN or alias ARN in the value of the <code>KeyId</code> parameter.</p>\\n         <p>\\n            <b>Required permissions</b>: <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/kms-api-permissions-reference.html\\\">kms:Encrypt</a> (key policy)</p>\\n         <p>\\n            <b>Related operations:</b>\\n         </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a>Decrypt</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>GenerateDataKey</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>GenerateDataKeyPair</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>\\n            <b>Eventual consistency</b>: The KMS API follows an eventual consistency model. \\n  For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/accessing-kms.html#programming-eventual-consistency\\\">KMS eventual consistency</a>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To encrypt data with a symmetric encryption KMS key\",\n                        \"documentation\": \"The following example encrypts data with the specified symmetric encryption KMS key.\",\n                        \"input\": {\n                            \"KeyId\": \"1234abcd-12ab-34cd-56ef-1234567890ab\",\n                            \"Plaintext\": \"<binary data>\"\n                        },\n                        \"output\": {\n                            \"CiphertextBlob\": \"<binary data>\",\n                            \"KeyId\": \"arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab\",\n                            \"EncryptionAlgorithm\": \"SYMMETRIC_DEFAULT\"\n                        }\n                    },\n                    {\n                        \"title\": \"To encrypt data with an asymmetric encryption KMS key\",\n                        \"documentation\": \"The following example encrypts data with the specified RSA asymmetric KMS key. When you encrypt with an asymmetric key, you must specify the encryption algorithm.\",\n                        \"input\": {\n                            \"KeyId\": \"0987dcba-09fe-87dc-65ba-ab0987654321\",\n                            \"Plaintext\": \"<binary data>\",\n                            \"EncryptionAlgorithm\": \"RSAES_OAEP_SHA_256\"\n                        },\n                        \"output\": {\n                            \"CiphertextBlob\": \"<binary data>\",\n                            \"KeyId\": \"arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321\",\n                            \"EncryptionAlgorithm\": \"RSAES_OAEP_SHA_256\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.kms#EncryptRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"KeyId\": {\n                    \"target\": \"com.amazonaws.kms#KeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Identifies the KMS key to use in the encryption operation. The KMS key must have a\\n        <code>KeyUsage</code> of <code>ENCRYPT_DECRYPT</code>. To find the <code>KeyUsage</code> of\\n      a KMS key, use the <a>DescribeKey</a> operation.</p>\\n         <p>To specify a KMS key, use its key ID, key ARN, alias name, or alias ARN. When using an alias name, prefix it with <code>\\\"alias/\\\"</code>. To specify a KMS key in a different Amazon Web Services account, you must use the key ARN or alias ARN.</p>\\n         <p>For example:</p>\\n         <ul>\\n            <li>\\n               <p>Key ID: <code>1234abcd-12ab-34cd-56ef-1234567890ab</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Key ARN: <code>arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Alias name: <code>alias/ExampleAlias</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Alias ARN: <code>arn:aws:kms:us-east-2:111122223333:alias/ExampleAlias</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>To get the key ID and key ARN for a KMS key, use <a>ListKeys</a> or <a>DescribeKey</a>. To get the alias name and alias ARN, use <a>ListAliases</a>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Plaintext\": {\n                    \"target\": \"com.amazonaws.kms#PlaintextType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Data to be encrypted.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"EncryptionContext\": {\n                    \"target\": \"com.amazonaws.kms#EncryptionContextType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the encryption context that will be used to encrypt the data.\\n      An encryption context is valid only for <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/kms-cryptography.html#cryptographic-operations\\\">cryptographic operations</a> with a symmetric encryption KMS key. The standard asymmetric encryption algorithms and HMAC algorithms that KMS uses do not support an encryption context. </p>\\n         <important>\\n            <p>Do not include confidential or sensitive information in this field. This field may be displayed in plaintext in CloudTrail logs and other output.</p>\\n         </important>\\n         <p>An <i>encryption context</i> is a collection of non-secret key-value pairs that represent additional authenticated data. \\nWhen you use an encryption context to encrypt data, you must specify the same (an exact case-sensitive match) encryption context to decrypt the data. An encryption context is supported\\nonly on operations with symmetric encryption KMS keys. On operations with symmetric encryption KMS keys, an encryption context is optional, but it is strongly recommended.</p>\\n         <p>For more information, see\\n<a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/encrypt_context.html\\\">Encryption context</a> in the <i>Key Management Service Developer Guide</i>.</p>\"\n                    }\n                },\n                \"GrantTokens\": {\n                    \"target\": \"com.amazonaws.kms#GrantTokenList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of grant tokens.</p>\\n         <p>Use a grant token when your permission to call this operation comes from a new grant that has not yet achieved <i>eventual consistency</i>. For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/grants.html#grant_token\\\">Grant token</a> and <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/using-grant-token.html\\\">Using a grant token</a> in the\\n    <i>Key Management Service Developer Guide</i>.</p>\"\n                    }\n                },\n                \"EncryptionAlgorithm\": {\n                    \"target\": \"com.amazonaws.kms#EncryptionAlgorithmSpec\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the encryption algorithm that KMS will use to encrypt the plaintext message.\\n      The algorithm must be compatible with the KMS key that you specify.</p>\\n         <p>This parameter is required only for asymmetric KMS keys. The default value,\\n        <code>SYMMETRIC_DEFAULT</code>, is the algorithm used for symmetric encryption KMS keys. If\\n      you are using an asymmetric KMS key, we recommend RSAES_OAEP_SHA_256.</p>\\n         <p>The SM2PKE algorithm is only available in China Regions.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.kms#NullableBooleanType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks if your request will succeed. <code>DryRun</code> is an optional parameter. </p>\\n         <p>To learn more about how to use this parameter, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/testing-permissions.html\\\">Testing your permissions</a> in the <i>Key Management Service Developer Guide</i>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.kms#EncryptResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CiphertextBlob\": {\n                    \"target\": \"com.amazonaws.kms#CiphertextType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The encrypted plaintext. When you use the HTTP API or the Amazon Web Services CLI, the value is Base64-encoded. Otherwise, it is not Base64-encoded.</p>\"\n                    }\n                },\n                \"KeyId\": {\n                    \"target\": \"com.amazonaws.kms#KeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (<a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-id-key-ARN\\\">key ARN</a>) of the KMS key that was used to encrypt the plaintext.</p>\"\n                    }\n                },\n                \"EncryptionAlgorithm\": {\n                    \"target\": \"com.amazonaws.kms#EncryptionAlgorithmSpec\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The encryption algorithm that was used to encrypt the plaintext.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.kms#EncryptionAlgorithmSpec\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"SYMMETRIC_DEFAULT\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"SYMMETRIC_DEFAULT\"\n                    }\n                },\n                \"RSAES_OAEP_SHA_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"RSAES_OAEP_SHA_1\"\n                    }\n                },\n                \"RSAES_OAEP_SHA_256\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"RSAES_OAEP_SHA_256\"\n                    }\n                },\n                \"SM2PKE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"SM2PKE\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.kms#EncryptionAlgorithmSpecList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.kms#EncryptionAlgorithmSpec\"\n            }\n        },\n        \"com.amazonaws.kms#EncryptionContextKey\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.kms#EncryptionContextType\": {\n            \"type\": \"map\",\n            \"key\": {\n                \"target\": \"com.amazonaws.kms#EncryptionContextKey\"\n            },\n            \"value\": {\n                \"target\": \"com.amazonaws.kms#EncryptionContextValue\"\n            }\n        },\n        \"com.amazonaws.kms#EncryptionContextValue\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.kms#ErrorMessageType\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.kms#ExpirationModelType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"KEY_MATERIAL_EXPIRES\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"KEY_MATERIAL_EXPIRES\"\n                    }\n                },\n                \"KEY_MATERIAL_DOES_NOT_EXPIRE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"KEY_MATERIAL_DOES_NOT_EXPIRE\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.kms#ExpiredImportTokenException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.kms#ErrorMessageType\"\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"ExpiredImportTokenException\",\n                    \"httpResponseCode\": 400\n                },\n                \"smithy.api#documentation\": \"<p>The request was rejected because the specified import token is expired. Use <a>GetParametersForImport</a> to get a new import token and public key, use the new\\n      public key to encrypt the key material, and then try the request again.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.kms#GenerateDataKey\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.kms#GenerateDataKeyRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.kms#GenerateDataKeyResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.kms#DependencyTimeoutException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#DisabledException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#DryRunOperationException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#InvalidGrantTokenException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#InvalidKeyUsageException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KeyUnavailableException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInternalException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInvalidStateException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#NotFoundException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns a unique symmetric data key for use outside of KMS. This operation returns a\\n      plaintext copy of the data key and a copy that is encrypted under a symmetric encryption KMS\\n      key that you specify. The bytes in the plaintext key are random; they are not related to the\\n      caller or the KMS key. You can use the plaintext key to encrypt your data outside of KMS and\\n      store the encrypted data key with the encrypted data.</p>\\n         <p>To generate a data key, specify the symmetric encryption KMS key that will be used to\\n      encrypt the data key. You cannot use an asymmetric KMS key to encrypt data keys. To get the\\n      type of your KMS key, use the <a>DescribeKey</a> operation.</p>\\n         <p>You must also specify the length of the data key. Use either the <code>KeySpec</code> or\\n        <code>NumberOfBytes</code> parameters (but not both). For 128-bit and 256-bit data keys, use\\n      the <code>KeySpec</code> parameter.</p>\\n         <p>To generate a 128-bit SM4 data key (China Regions only), specify a <code>KeySpec</code>\\n      value of <code>AES_128</code> or a <code>NumberOfBytes</code> value of <code>16</code>. The\\n      symmetric encryption key used in China Regions to encrypt your data key is an SM4 encryption\\n      key.</p>\\n         <p>To get only an encrypted copy of the data key, use <a>GenerateDataKeyWithoutPlaintext</a>. To generate an asymmetric data key pair, use\\n      the <a>GenerateDataKeyPair</a> or <a>GenerateDataKeyPairWithoutPlaintext</a> operation. To get a cryptographically secure\\n      random byte string, use <a>GenerateRandom</a>.</p>\\n         <p>You can use an optional encryption context to add additional security to the encryption\\n      operation. If you specify an <code>EncryptionContext</code>, you must specify the same\\n      encryption context (a case-sensitive exact match) when decrypting the encrypted data key.\\n      Otherwise, the request to decrypt fails with an <code>InvalidCiphertextException</code>. For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/encrypt_context.html\\\">Encryption Context</a> in the\\n      <i>Key Management Service Developer Guide</i>.</p>\\n         <p>\\n            <code>GenerateDataKey</code> also supports <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/nitro-enclave.html\\\">Amazon Web Services Nitro Enclaves</a>, which provide an\\n      isolated compute environment in Amazon EC2. To call <code>GenerateDataKey</code> for an Amazon Web Services Nitro\\n      enclave or NitroTPM, use the <a href=\\\"https://docs.aws.amazon.com/enclaves/latest/user/developing-applications.html#sdk\\\">Amazon Web Services Nitro Enclaves SDK</a> or any Amazon Web Services SDK. Use the <code>Recipient</code> parameter\\n      to provide the attestation document for the attested environment. <code>GenerateDataKey</code> returns a\\n      copy of the data key encrypted under the specified KMS key, as usual. But instead of a\\n      plaintext copy of the data key, the response includes a copy of the data key encrypted under\\n      the public key from the attestation document (<code>CiphertextForRecipient</code>).\\n      For information about the interaction between KMS and Amazon Web Services Nitro Enclaves or Amazon Web Services NitroTPM, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/cryptographic-attestation.html\\\">Cryptographic attestation support in KMS</a> in the <i>Key Management Service Developer Guide</i>.</p>\\n         <p>The KMS key that you use for this operation must be in a compatible key state. For\\ndetails, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/key-state.html\\\">Key states of KMS keys</a> in the <i>Key Management Service Developer Guide</i>.</p>\\n         <p>\\n            <b>How to use your data key</b>\\n         </p>\\n         <p>We recommend that you use the following pattern to encrypt data locally in your\\n      application. You can write your own code or use a client-side encryption library, such as the\\n        <a href=\\\"https://docs.aws.amazon.com/encryption-sdk/latest/developer-guide/\\\">Amazon Web Services Encryption SDK</a>, the\\n        <a href=\\\"https://docs.aws.amazon.com/dynamodb-encryption-client/latest/devguide/\\\">Amazon DynamoDB Encryption Client</a>,\\n      or <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingClientSideEncryption.html\\\">Amazon S3\\n        client-side encryption</a> to do these tasks for you.</p>\\n         <p>To encrypt data outside of KMS:</p>\\n         <ol>\\n            <li>\\n               <p>Use the <code>GenerateDataKey</code> operation to get a data key.</p>\\n            </li>\\n            <li>\\n               <p>Use the plaintext data key (in the <code>Plaintext</code> field of the response) to\\n          encrypt your data outside of KMS. Then erase the plaintext data key from memory.</p>\\n            </li>\\n            <li>\\n               <p>Store the encrypted data key (in the <code>CiphertextBlob</code> field of the\\n          response) with the encrypted data.</p>\\n            </li>\\n         </ol>\\n         <p>To decrypt data outside of KMS:</p>\\n         <ol>\\n            <li>\\n               <p>Use the <a>Decrypt</a> operation to decrypt the encrypted data key. The\\n          operation returns a plaintext copy of the data key.</p>\\n            </li>\\n            <li>\\n               <p>Use the plaintext data key to decrypt data outside of KMS, then erase the plaintext\\n          data key from memory.</p>\\n            </li>\\n         </ol>\\n         <p>\\n            <b>Cross-account use</b>: Yes. To perform this operation with a KMS key in a different Amazon Web Services account, specify\\n  the key ARN or alias ARN in the value of the <code>KeyId</code> parameter.</p>\\n         <p>\\n            <b>Required permissions</b>: <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/kms-api-permissions-reference.html\\\">kms:GenerateDataKey</a> (key policy)</p>\\n         <p>\\n            <b>Related operations:</b>\\n         </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a>Decrypt</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>Encrypt</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>GenerateDataKeyPair</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>GenerateDataKeyPairWithoutPlaintext</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>GenerateDataKeyWithoutPlaintext</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>\\n            <b>Eventual consistency</b>: The KMS API follows an eventual consistency model. \\n  For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/accessing-kms.html#programming-eventual-consistency\\\">KMS eventual consistency</a>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To generate a data key\",\n                        \"documentation\": \"The following example generates a 256-bit symmetric data encryption key (data key) in two formats. One is the unencrypted (plainext) data key, and the other is the data key encrypted with the specified KMS key.\",\n                        \"input\": {\n                            \"KeyId\": \"alias/ExampleAlias\",\n                            \"KeySpec\": \"AES_256\"\n                        },\n                        \"output\": {\n                            \"CiphertextBlob\": \"<binary data>\",\n                            \"Plaintext\": \"<binary data>\",\n                            \"KeyId\": \"arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab\",\n                            \"KeyMaterialId\": \"0b7fd7ddbac6eef27907413567cad8c810e2883dc8a7534067a82ee1142fc1e6\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.kms#GenerateDataKeyPair\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.kms#GenerateDataKeyPairRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.kms#GenerateDataKeyPairResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.kms#DependencyTimeoutException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#DisabledException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#DryRunOperationException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#InvalidGrantTokenException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#InvalidKeyUsageException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KeyUnavailableException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInternalException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInvalidStateException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#NotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#UnsupportedOperationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns a unique asymmetric data key pair for use outside of KMS. This operation returns\\n      a plaintext public key, a plaintext private key, and a copy of the private key that is\\n      encrypted under the symmetric encryption KMS key you specify. You can use the data key pair to\\n      perform asymmetric cryptography and implement digital signatures outside of KMS. The bytes\\n      in the keys are random; they are not related to the caller or to the KMS key that is used to\\n      encrypt the private key. </p>\\n         <p>You can use the public key that <code>GenerateDataKeyPair</code> returns to encrypt data\\n      or verify a signature outside of KMS. Then, store the encrypted private key with the data.\\n      When you are ready to decrypt data or sign a message, you can use the <a>Decrypt</a> operation to decrypt the encrypted private key.</p>\\n         <p>To generate a data key pair, you must specify a symmetric encryption KMS key to encrypt\\n      the private key in a data key pair. You cannot use an asymmetric KMS key or a KMS key in a\\n      custom key store. To get the type and origin of your KMS key, use the <a>DescribeKey</a> operation. </p>\\n         <p>Use the <code>KeyPairSpec</code> parameter to choose an RSA or Elliptic Curve (ECC) data\\n      key pair. In China Regions, you can also choose an SM2 data key pair. KMS recommends that\\n      you use ECC key pairs for signing, and use RSA and SM2 key pairs for either encryption or\\n      signing, but not both. However, KMS cannot enforce any restrictions on the use of data key\\n      pairs outside of KMS.</p>\\n         <p>If you are using the data key pair to encrypt data, or for any operation where you don't\\n      immediately need a private key, consider using the <a>GenerateDataKeyPairWithoutPlaintext</a> operation.\\n        <code>GenerateDataKeyPairWithoutPlaintext</code> returns a plaintext public key and an\\n      encrypted private key, but omits the plaintext private key that you need only to decrypt\\n      ciphertext or sign a message. Later, when you need to decrypt the data or sign a message, use\\n      the <a>Decrypt</a> operation to decrypt the encrypted private key in the data key\\n      pair.</p>\\n         <p>\\n            <code>GenerateDataKeyPair</code> returns a unique data key pair for each request. The\\n      bytes in the keys are random; they are not related to the caller or the KMS key that is used\\n      to encrypt the private key. The public key is a DER-encoded X.509 SubjectPublicKeyInfo, as\\n      specified in <a href=\\\"https://tools.ietf.org/html/rfc5280\\\">RFC 5280</a>. The private\\n      key is a DER-encoded PKCS8 PrivateKeyInfo, as specified in <a href=\\\"https://tools.ietf.org/html/rfc5958\\\">RFC 5958</a>.</p>\\n         <p>\\n            <code>GenerateDataKeyPair</code> also supports <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/nitro-enclave.html\\\">Amazon Web Services Nitro Enclaves</a>, which provide an\\n      isolated compute environment in Amazon EC2. To call <code>GenerateDataKeyPair</code> for an Amazon Web Services\\n      Nitro enclave or NitroTPM, use the <a href=\\\"https://docs.aws.amazon.com/enclaves/latest/user/developing-applications.html#sdk\\\">Amazon Web Services Nitro Enclaves SDK</a> or any Amazon Web Services SDK. Use the <code>Recipient</code>\\n      parameter to provide the attestation document for the attested environment.\\n        <code>GenerateDataKeyPair</code> returns the public data key and a copy of the private data\\n      key encrypted under the specified KMS key, as usual. But instead of a plaintext copy of the\\n      private data key (<code>PrivateKeyPlaintext</code>), the response includes a copy of the\\n      private data key encrypted under the public key from the attestation document\\n        (<code>CiphertextForRecipient</code>). For information about the interaction between KMS and Amazon Web Services Nitro Enclaves or Amazon Web Services NitroTPM, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/cryptographic-attestation.html\\\">Cryptographic attestation support in KMS</a> in the <i>Key Management Service Developer Guide</i>.</p>\\n         <p>You can use an optional encryption context to add additional security to the encryption\\n      operation. If you specify an <code>EncryptionContext</code>, you must specify the same\\n      encryption context (a case-sensitive exact match) when decrypting the encrypted data key.\\n      Otherwise, the request to decrypt fails with an <code>InvalidCiphertextException</code>. For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/encrypt_context.html\\\">Encryption Context</a> in the\\n      <i>Key Management Service Developer Guide</i>.</p>\\n         <p>The KMS key that you use for this operation must be in a compatible key state. For\\ndetails, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/key-state.html\\\">Key states of KMS keys</a> in the <i>Key Management Service Developer Guide</i>.</p>\\n         <p>\\n            <b>Cross-account use</b>: Yes. To perform this operation with a KMS key in a different Amazon Web Services account, specify\\n  the key ARN or alias ARN in the value of the <code>KeyId</code> parameter.</p>\\n         <p>\\n            <b>Required permissions</b>: <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/kms-api-permissions-reference.html\\\">kms:GenerateDataKeyPair</a> (key policy)</p>\\n         <p>\\n            <b>Related operations:</b>\\n         </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a>Decrypt</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>Encrypt</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>GenerateDataKey</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>GenerateDataKeyPairWithoutPlaintext</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>GenerateDataKeyWithoutPlaintext</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>\\n            <b>Eventual consistency</b>: The KMS API follows an eventual consistency model. \\n  For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/accessing-kms.html#programming-eventual-consistency\\\">KMS eventual consistency</a>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To generate an RSA key pair for encryption and decryption\",\n                        \"documentation\": \"This example generates an RSA data key pair for encryption and decryption. The operation returns a plaintext public key and private key, and a copy of the private key that is encrypted under a symmetric encryption KMS key that you specify.\",\n                        \"input\": {\n                            \"KeyId\": \"arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab\",\n                            \"KeyPairSpec\": \"RSA_3072\"\n                        },\n                        \"output\": {\n                            \"PrivateKeyCiphertextBlob\": \"<binary data>\",\n                            \"PrivateKeyPlaintext\": \"<binary data>\",\n                            \"PublicKey\": \"<binary data>\",\n                            \"KeyId\": \"arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab\",\n                            \"KeyMaterialId\": \"0b7fd7ddbac6eef27907413567cad8c810e2883dc8a7534067a82ee1142fc1e6\",\n                            \"KeyPairSpec\": \"RSA_3072\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.kms#GenerateDataKeyPairRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"EncryptionContext\": {\n                    \"target\": \"com.amazonaws.kms#EncryptionContextType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the encryption context that will be used when encrypting the private key in the\\n      data key pair.</p>\\n         <important>\\n            <p>Do not include confidential or sensitive information in this field. This field may be displayed in plaintext in CloudTrail logs and other output.</p>\\n         </important>\\n         <p>An <i>encryption context</i> is a collection of non-secret key-value pairs that represent additional authenticated data. \\nWhen you use an encryption context to encrypt data, you must specify the same (an exact case-sensitive match) encryption context to decrypt the data. An encryption context is supported\\nonly on operations with symmetric encryption KMS keys. On operations with symmetric encryption KMS keys, an encryption context is optional, but it is strongly recommended.</p>\\n         <p>For more information, see\\n<a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/encrypt_context.html\\\">Encryption context</a> in the <i>Key Management Service Developer Guide</i>.</p>\"\n                    }\n                },\n                \"KeyId\": {\n                    \"target\": \"com.amazonaws.kms#KeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the symmetric encryption KMS key that encrypts the private key in the data key\\n      pair. You cannot specify an asymmetric KMS key or a KMS key in a custom key store. To get the\\n      type and origin of your KMS key, use the <a>DescribeKey</a> operation.</p>\\n         <p>To specify a KMS key, use its key ID, key ARN, alias name, or alias ARN. When using an alias name, prefix it with <code>\\\"alias/\\\"</code>. To specify a KMS key in a different Amazon Web Services account, you must use the key ARN or alias ARN.</p>\\n         <p>For example:</p>\\n         <ul>\\n            <li>\\n               <p>Key ID: <code>1234abcd-12ab-34cd-56ef-1234567890ab</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Key ARN: <code>arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Alias name: <code>alias/ExampleAlias</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Alias ARN: <code>arn:aws:kms:us-east-2:111122223333:alias/ExampleAlias</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>To get the key ID and key ARN for a KMS key, use <a>ListKeys</a> or <a>DescribeKey</a>. To get the alias name and alias ARN, use <a>ListAliases</a>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"KeyPairSpec\": {\n                    \"target\": \"com.amazonaws.kms#DataKeyPairSpec\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Determines the type of data key pair that is generated. </p>\\n         <p>The KMS rule that restricts the use of asymmetric RSA and SM2 KMS keys to encrypt and decrypt or to sign and verify (but not both), the rule that permits you to use ECC KMS keys only to sign and verify, and the rule that permits you to use ML-DSA key pairs to sign and verify only are not effective on data key pairs, which are used outside of KMS. The SM2 key spec is only available in China Regions.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"GrantTokens\": {\n                    \"target\": \"com.amazonaws.kms#GrantTokenList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of grant tokens.</p>\\n         <p>Use a grant token when your permission to call this operation comes from a new grant that has not yet achieved <i>eventual consistency</i>. For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/grants.html#grant_token\\\">Grant token</a> and <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/using-grant-token.html\\\">Using a grant token</a> in the\\n    <i>Key Management Service Developer Guide</i>.</p>\"\n                    }\n                },\n                \"Recipient\": {\n                    \"target\": \"com.amazonaws.kms#RecipientInfo\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A signed <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/nitro-enclave-how.html#term-attestdoc\\\">attestation document</a> from\\n      an Amazon Web Services Nitro enclave or NitroTPM, and the encryption algorithm to use with the public key in the attestation document. The\\n      only valid encryption algorithm is <code>RSAES_OAEP_SHA_256</code>. </p>\\n         <p>This parameter only supports attestation documents for Amazon Web Services Nitro Enclaves or Amazon Web Services NitroTPM. To call\\n      GenerateDataKeyPair generate an attestation document use either <a href=\\\"https://docs.aws.amazon.com/enclaves/latest/user/developing-applications.html#sdk\\\">Amazon Web Services Nitro Enclaves SDK</a> for an Amazon Web Services Nitro Enclaves or\\n      <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/attestation-get-doc.html\\\">Amazon Web Services NitroTPM tools</a> for Amazon Web Services NitroTPM. Then use the Recipient parameter from any Amazon Web Services SDK to provide the\\n      attestation document for the attested environment.</p>\\n         <p>When you use this parameter, instead of returning a plaintext copy of the private data\\n      key, KMS encrypts the plaintext private data key under the public key in the attestation\\n      document, and returns the resulting ciphertext in the <code>CiphertextForRecipient</code>\\n      field in the response. This ciphertext can be decrypted only with the private key in the\\n      attested environment. The <code>CiphertextBlob</code> field in the response contains a copy of the private\\n      data key encrypted under the KMS key specified by the <code>KeyId</code> parameter. The\\n        <code>PrivateKeyPlaintext</code> field in the response is null or empty.</p>\\n         <p>For information about the interaction between KMS and Amazon Web Services Nitro Enclaves or Amazon Web Services NitroTPM, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/cryptographic-attestation.html\\\">Cryptographic attestation support in KMS</a> in the <i>Key Management Service Developer Guide</i>.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.kms#NullableBooleanType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks if your request will succeed. <code>DryRun</code> is an optional parameter. </p>\\n         <p>To learn more about how to use this parameter, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/testing-permissions.html\\\">Testing your permissions</a> in the <i>Key Management Service Developer Guide</i>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.kms#GenerateDataKeyPairResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PrivateKeyCiphertextBlob\": {\n                    \"target\": \"com.amazonaws.kms#CiphertextType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The encrypted copy of the private key. When you use the HTTP API or the Amazon Web Services CLI, the value is Base64-encoded. Otherwise, it is not Base64-encoded.</p>\"\n                    }\n                },\n                \"PrivateKeyPlaintext\": {\n                    \"target\": \"com.amazonaws.kms#PlaintextType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The plaintext copy of the private key. When you use the HTTP API or the Amazon Web Services CLI, the value is Base64-encoded. Otherwise, it is not Base64-encoded.</p>\\n         <p>If the response includes the <code>CiphertextForRecipient</code> field, the\\n        <code>PrivateKeyPlaintext</code> field is null or empty.</p>\"\n                    }\n                },\n                \"PublicKey\": {\n                    \"target\": \"com.amazonaws.kms#PublicKeyType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The public key (in plaintext). When you use the HTTP API or the Amazon Web Services CLI, the value is Base64-encoded. Otherwise, it is not Base64-encoded.</p>\"\n                    }\n                },\n                \"KeyId\": {\n                    \"target\": \"com.amazonaws.kms#KeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (<a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-id-key-ARN\\\">key ARN</a>) of the KMS key that encrypted the private key.</p>\"\n                    }\n                },\n                \"KeyPairSpec\": {\n                    \"target\": \"com.amazonaws.kms#DataKeyPairSpec\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of data key pair that was generated.</p>\"\n                    }\n                },\n                \"CiphertextForRecipient\": {\n                    \"target\": \"com.amazonaws.kms#CiphertextType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The plaintext private data key encrypted with the public key from the attestation document. This\\n      ciphertext can be decrypted only by using a private key from the attested environment. </p>\\n         <p>This field is included in the response only when the <code>Recipient</code> parameter in\\n      the request includes a valid attestation document from an Amazon Web Services Nitro enclave or NitroTPM.\\n      For information about the interaction between KMS and Amazon Web Services Nitro Enclaves or Amazon Web Services NitroTPM, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/cryptographic-attestation.html\\\">Cryptographic attestation support in KMS</a> in the <i>Key Management Service Developer Guide</i>.</p>\"\n                    }\n                },\n                \"KeyMaterialId\": {\n                    \"target\": \"com.amazonaws.kms#BackingKeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The identifier of the key material used to encrypt the private key.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.kms#GenerateDataKeyPairWithoutPlaintext\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.kms#GenerateDataKeyPairWithoutPlaintextRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.kms#GenerateDataKeyPairWithoutPlaintextResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.kms#DependencyTimeoutException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#DisabledException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#DryRunOperationException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#InvalidGrantTokenException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#InvalidKeyUsageException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KeyUnavailableException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInternalException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInvalidStateException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#NotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#UnsupportedOperationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns a unique asymmetric data key pair for use outside of KMS. This operation returns\\n      a plaintext public key and a copy of the private key that is encrypted under the symmetric\\n      encryption KMS key you specify. Unlike <a>GenerateDataKeyPair</a>, this operation\\n      does not return a plaintext private key. The bytes in the keys are random; they are not\\n      related to the caller or to the KMS key that is used to encrypt the private key. </p>\\n         <p>You can use the public key that <code>GenerateDataKeyPairWithoutPlaintext</code> returns\\n      to encrypt data or verify a signature outside of KMS. Then, store the encrypted private key\\n      with the data. When you are ready to decrypt data or sign a message, you can use the <a>Decrypt</a> operation to decrypt the encrypted private key.</p>\\n         <p>To generate a data key pair, you must specify a symmetric encryption KMS key to encrypt\\n      the private key in a data key pair. You cannot use an asymmetric KMS key or a KMS key in a\\n      custom key store. To get the type and origin of your KMS key, use the <a>DescribeKey</a> operation. </p>\\n         <p>Use the <code>KeyPairSpec</code> parameter to choose an RSA or Elliptic Curve (ECC) data\\n      key pair. In China Regions, you can also choose an SM2 data key pair. KMS recommends that\\n      you use ECC key pairs for signing, and use RSA and SM2 key pairs for either encryption or\\n      signing, but not both. However, KMS cannot enforce any restrictions on the use of data key\\n      pairs outside of KMS.</p>\\n         <p>\\n            <code>GenerateDataKeyPairWithoutPlaintext</code> returns a unique data key pair for each\\n      request. The bytes in the key are not related to the caller or KMS key that is used to encrypt\\n      the private key. The public key is a DER-encoded X.509 SubjectPublicKeyInfo, as specified in\\n        <a href=\\\"https://tools.ietf.org/html/rfc5280\\\">RFC 5280</a>.</p>\\n         <p>You can use an optional encryption context to add additional security to the encryption\\n      operation. If you specify an <code>EncryptionContext</code>, you must specify the same\\n      encryption context (a case-sensitive exact match) when decrypting the encrypted data key.\\n      Otherwise, the request to decrypt fails with an <code>InvalidCiphertextException</code>. For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/encrypt_context.html\\\">Encryption Context</a> in the\\n      <i>Key Management Service Developer Guide</i>.</p>\\n         <p>The KMS key that you use for this operation must be in a compatible key state. For\\ndetails, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/key-state.html\\\">Key states of KMS keys</a> in the <i>Key Management Service Developer Guide</i>.</p>\\n         <p>\\n            <b>Cross-account use</b>: Yes. To perform this operation with a KMS key in a different Amazon Web Services account, specify\\n  the key ARN or alias ARN in the value of the <code>KeyId</code> parameter.</p>\\n         <p>\\n            <b>Required permissions</b>: <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/kms-api-permissions-reference.html\\\">kms:GenerateDataKeyPairWithoutPlaintext</a> (key\\n      policy)</p>\\n         <p>\\n            <b>Related operations:</b>\\n         </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a>Decrypt</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>Encrypt</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>GenerateDataKey</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>GenerateDataKeyPair</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>GenerateDataKeyWithoutPlaintext</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>\\n            <b>Eventual consistency</b>: The KMS API follows an eventual consistency model. \\n  For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/accessing-kms.html#programming-eventual-consistency\\\">KMS eventual consistency</a>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To generate an asymmetric data key pair without a plaintext key\",\n                        \"documentation\": \"This example returns an asymmetric elliptic curve (ECC) data key pair. The private key is encrypted under the symmetric encryption KMS key that you specify. This operation doesn't return a plaintext (unencrypted) private key.\",\n                        \"input\": {\n                            \"KeyId\": \"arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab\",\n                            \"KeyPairSpec\": \"ECC_NIST_P521\"\n                        },\n                        \"output\": {\n                            \"PrivateKeyCiphertextBlob\": \"<binary data>\",\n                            \"PublicKey\": \"<binary data>\",\n                            \"KeyId\": \"arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab\",\n                            \"KeyMaterialId\": \"0b7fd7ddbac6eef27907413567cad8c810e2883dc8a7534067a82ee1142fc1e6\",\n                            \"KeyPairSpec\": \"ECC_NIST_P521\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.kms#GenerateDataKeyPairWithoutPlaintextRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"EncryptionContext\": {\n                    \"target\": \"com.amazonaws.kms#EncryptionContextType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the encryption context that will be used when encrypting the private key in the\\n      data key pair.</p>\\n         <important>\\n            <p>Do not include confidential or sensitive information in this field. This field may be displayed in plaintext in CloudTrail logs and other output.</p>\\n         </important>\\n         <p>An <i>encryption context</i> is a collection of non-secret key-value pairs that represent additional authenticated data. \\nWhen you use an encryption context to encrypt data, you must specify the same (an exact case-sensitive match) encryption context to decrypt the data. An encryption context is supported\\nonly on operations with symmetric encryption KMS keys. On operations with symmetric encryption KMS keys, an encryption context is optional, but it is strongly recommended.</p>\\n         <p>For more information, see\\n<a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/encrypt_context.html\\\">Encryption context</a> in the <i>Key Management Service Developer Guide</i>.</p>\"\n                    }\n                },\n                \"KeyId\": {\n                    \"target\": \"com.amazonaws.kms#KeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the symmetric encryption KMS key that encrypts the private key in the data key\\n      pair. You cannot specify an asymmetric KMS key or a KMS key in a custom key store. To get the\\n      type and origin of your KMS key, use the <a>DescribeKey</a> operation. </p>\\n         <p>To specify a KMS key, use its key ID, key ARN, alias name, or alias ARN. When using an alias name, prefix it with <code>\\\"alias/\\\"</code>. To specify a KMS key in a different Amazon Web Services account, you must use the key ARN or alias ARN.</p>\\n         <p>For example:</p>\\n         <ul>\\n            <li>\\n               <p>Key ID: <code>1234abcd-12ab-34cd-56ef-1234567890ab</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Key ARN: <code>arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Alias name: <code>alias/ExampleAlias</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Alias ARN: <code>arn:aws:kms:us-east-2:111122223333:alias/ExampleAlias</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>To get the key ID and key ARN for a KMS key, use <a>ListKeys</a> or <a>DescribeKey</a>. To get the alias name and alias ARN, use <a>ListAliases</a>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"KeyPairSpec\": {\n                    \"target\": \"com.amazonaws.kms#DataKeyPairSpec\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Determines the type of data key pair that is generated.</p>\\n         <p>The KMS rule that restricts the use of asymmetric RSA and SM2 KMS keys to encrypt and decrypt or to sign and verify (but not both), the rule that permits you to use ECC KMS keys only to sign and verify, and the rule that permits you to use ML-DSA key pairs to sign and verify only are not effective on data key pairs, which are used outside of KMS. The SM2 key spec is only available in China Regions.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"GrantTokens\": {\n                    \"target\": \"com.amazonaws.kms#GrantTokenList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of grant tokens.</p>\\n         <p>Use a grant token when your permission to call this operation comes from a new grant that has not yet achieved <i>eventual consistency</i>. For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/grants.html#grant_token\\\">Grant token</a> and <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/using-grant-token.html\\\">Using a grant token</a> in the\\n    <i>Key Management Service Developer Guide</i>.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.kms#NullableBooleanType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks if your request will succeed. <code>DryRun</code> is an optional parameter. </p>\\n         <p>To learn more about how to use this parameter, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/testing-permissions.html\\\">Testing your permissions</a> in the <i>Key Management Service Developer Guide</i>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.kms#GenerateDataKeyPairWithoutPlaintextResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PrivateKeyCiphertextBlob\": {\n                    \"target\": \"com.amazonaws.kms#CiphertextType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The encrypted copy of the private key. When you use the HTTP API or the Amazon Web Services CLI, the value is Base64-encoded. Otherwise, it is not Base64-encoded.</p>\"\n                    }\n                },\n                \"PublicKey\": {\n                    \"target\": \"com.amazonaws.kms#PublicKeyType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The public key (in plaintext). When you use the HTTP API or the Amazon Web Services CLI, the value is Base64-encoded. Otherwise, it is not Base64-encoded.</p>\"\n                    }\n                },\n                \"KeyId\": {\n                    \"target\": \"com.amazonaws.kms#KeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (<a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-id-key-ARN\\\">key ARN</a>) of the KMS key that encrypted the private key.</p>\"\n                    }\n                },\n                \"KeyPairSpec\": {\n                    \"target\": \"com.amazonaws.kms#DataKeyPairSpec\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of data key pair that was generated.</p>\"\n                    }\n                },\n                \"KeyMaterialId\": {\n                    \"target\": \"com.amazonaws.kms#BackingKeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The identifier of the key material used to encrypt the private key.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.kms#GenerateDataKeyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"KeyId\": {\n                    \"target\": \"com.amazonaws.kms#KeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the symmetric encryption KMS key that encrypts the data key. You cannot specify\\n      an asymmetric KMS key or a KMS key in a custom key store. To get the type and origin of your\\n      KMS key, use the <a>DescribeKey</a> operation.</p>\\n         <p>To specify a KMS key, use its key ID, key ARN, alias name, or alias ARN. When using an alias name, prefix it with <code>\\\"alias/\\\"</code>. To specify a KMS key in a different Amazon Web Services account, you must use the key ARN or alias ARN.</p>\\n         <p>For example:</p>\\n         <ul>\\n            <li>\\n               <p>Key ID: <code>1234abcd-12ab-34cd-56ef-1234567890ab</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Key ARN: <code>arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Alias name: <code>alias/ExampleAlias</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Alias ARN: <code>arn:aws:kms:us-east-2:111122223333:alias/ExampleAlias</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>To get the key ID and key ARN for a KMS key, use <a>ListKeys</a> or <a>DescribeKey</a>. To get the alias name and alias ARN, use <a>ListAliases</a>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"EncryptionContext\": {\n                    \"target\": \"com.amazonaws.kms#EncryptionContextType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the encryption context that will be used when encrypting the data key.</p>\\n         <important>\\n            <p>Do not include confidential or sensitive information in this field. This field may be displayed in plaintext in CloudTrail logs and other output.</p>\\n         </important>\\n         <p>An <i>encryption context</i> is a collection of non-secret key-value pairs that represent additional authenticated data. \\nWhen you use an encryption context to encrypt data, you must specify the same (an exact case-sensitive match) encryption context to decrypt the data. An encryption context is supported\\nonly on operations with symmetric encryption KMS keys. On operations with symmetric encryption KMS keys, an encryption context is optional, but it is strongly recommended.</p>\\n         <p>For more information, see\\n<a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/encrypt_context.html\\\">Encryption context</a> in the <i>Key Management Service Developer Guide</i>.</p>\"\n                    }\n                },\n                \"NumberOfBytes\": {\n                    \"target\": \"com.amazonaws.kms#NumberOfBytesType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the length of the data key in bytes. For example, use the value 64 to generate a\\n      512-bit data key (64 bytes is 512 bits). For 128-bit (16-byte) and 256-bit (32-byte) data\\n      keys, use the <code>KeySpec</code> parameter.</p>\\n         <p>You must specify either the <code>KeySpec</code> or the <code>NumberOfBytes</code>\\n      parameter (but not both) in every <code>GenerateDataKey</code> request.</p>\"\n                    }\n                },\n                \"KeySpec\": {\n                    \"target\": \"com.amazonaws.kms#DataKeySpec\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the length of the data key. Use <code>AES_128</code> to generate a 128-bit\\n      symmetric key, or <code>AES_256</code> to generate a 256-bit symmetric key.</p>\\n         <p>You must specify either the <code>KeySpec</code> or the <code>NumberOfBytes</code>\\n      parameter (but not both) in every <code>GenerateDataKey</code> request.</p>\"\n                    }\n                },\n                \"GrantTokens\": {\n                    \"target\": \"com.amazonaws.kms#GrantTokenList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of grant tokens.</p>\\n         <p>Use a grant token when your permission to call this operation comes from a new grant that has not yet achieved <i>eventual consistency</i>. For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/grants.html#grant_token\\\">Grant token</a> and <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/using-grant-token.html\\\">Using a grant token</a> in the\\n    <i>Key Management Service Developer Guide</i>.</p>\"\n                    }\n                },\n                \"Recipient\": {\n                    \"target\": \"com.amazonaws.kms#RecipientInfo\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A signed <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/nitro-enclave-how.html#term-attestdoc\\\">attestation document</a> from\\n      an Amazon Web Services Nitro enclave or NitroTPM, and the encryption algorithm to use with the public key in the attestation document. The\\n      only valid encryption algorithm is <code>RSAES_OAEP_SHA_256</code>. </p>\\n         <p>This parameter supports the <a href=\\\"https://docs.aws.amazon.com/enclaves/latest/user/developing-applications.html#sdk\\\">Amazon Web Services Nitro Enclaves SDK</a> or any Amazon Web Services SDK for Amazon Web Services Nitro Enclaves. It supports \\n      any Amazon Web Services SDK for Amazon Web Services NitroTPM.\\n    </p>\\n         <p>When you use this parameter, instead of returning the plaintext data key, KMS encrypts\\n      the plaintext data key under the public key in the attestation document, and returns the\\n      resulting ciphertext in the <code>CiphertextForRecipient</code> field in the response. This\\n      ciphertext can be decrypted only with the private key in the enclave. The\\n        <code>CiphertextBlob</code> field in the response contains a copy of the data key encrypted\\n      under the KMS key specified by the <code>KeyId</code> parameter. The <code>Plaintext</code>\\n      field in the response is null or empty.</p>\\n         <p>For information about the interaction between KMS and Amazon Web Services Nitro Enclaves or Amazon Web Services NitroTPM, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/cryptographic-attestation.html\\\">Cryptographic attestation support in KMS</a> in the <i>Key Management Service Developer Guide</i>.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.kms#NullableBooleanType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks if your request will succeed. <code>DryRun</code> is an optional parameter. </p>\\n         <p>To learn more about how to use this parameter, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/testing-permissions.html\\\">Testing your permissions</a> in the <i>Key Management Service Developer Guide</i>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.kms#GenerateDataKeyResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CiphertextBlob\": {\n                    \"target\": \"com.amazonaws.kms#CiphertextType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The encrypted copy of the data key. When you use the HTTP API or the Amazon Web Services CLI, the value is Base64-encoded. Otherwise, it is not Base64-encoded.</p>\"\n                    }\n                },\n                \"Plaintext\": {\n                    \"target\": \"com.amazonaws.kms#PlaintextType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The plaintext data key. When you use the HTTP API or the Amazon Web Services CLI, the value is Base64-encoded. Otherwise, it is not Base64-encoded. Use this data key to encrypt your data outside of\\n      KMS. Then, remove it from memory as soon as possible.</p>\\n         <p>If the response includes the <code>CiphertextForRecipient</code> field, the\\n        <code>Plaintext</code> field is null or empty.</p>\"\n                    }\n                },\n                \"KeyId\": {\n                    \"target\": \"com.amazonaws.kms#KeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (<a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-id-key-ARN\\\">key ARN</a>) of the KMS key that encrypted the data key.</p>\"\n                    }\n                },\n                \"CiphertextForRecipient\": {\n                    \"target\": \"com.amazonaws.kms#CiphertextType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The plaintext data key encrypted with the public key from the attestation document. This\\n      ciphertext can be decrypted only by using a private key from the attested environment. </p>\\n         <p>This field is included in the response only when the <code>Recipient</code> parameter in\\n      the request includes a valid attestation document from an Amazon Web Services Nitro enclave or NitroTPM.\\n      For information about the interaction between KMS and Amazon Web Services Nitro Enclaves or Amazon Web Services NitroTPM, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/cryptographic-attestation.html\\\">Cryptographic attestation support in KMS</a> in the <i>Key Management Service Developer Guide</i>.</p>\"\n                    }\n                },\n                \"KeyMaterialId\": {\n                    \"target\": \"com.amazonaws.kms#BackingKeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The identifier of the key material used to encrypt the data key. This field is omitted if\\n      the request includes the <code>Recipient</code> parameter.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.kms#GenerateDataKeyWithoutPlaintext\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.kms#GenerateDataKeyWithoutPlaintextRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.kms#GenerateDataKeyWithoutPlaintextResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.kms#DependencyTimeoutException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#DisabledException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#DryRunOperationException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#InvalidGrantTokenException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#InvalidKeyUsageException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KeyUnavailableException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInternalException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInvalidStateException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#NotFoundException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns a unique symmetric data key for use outside of KMS. This operation returns a\\n      data key that is encrypted under a symmetric encryption KMS key that you specify. The bytes in\\n      the key are random; they are not related to the caller or to the KMS key.</p>\\n         <p>\\n            <code>GenerateDataKeyWithoutPlaintext</code> is identical to the <a>GenerateDataKey</a> operation except that it does not return a plaintext copy of the\\n      data key. </p>\\n         <p>This operation is useful for systems that need to encrypt data at some point, but not\\n      immediately. When you need to encrypt the data, you call the <a>Decrypt</a>\\n      operation on the encrypted copy of the key.</p>\\n         <p>It's also useful in distributed systems with different levels of trust. For example, you\\n      might store encrypted data in containers. One component of your system creates new containers\\n      and stores an encrypted data key with each container. Then, a different component puts the\\n      data into the containers. That component first decrypts the data key, uses the plaintext data\\n      key to encrypt data, puts the encrypted data into the container, and then destroys the\\n      plaintext data key. In this system, the component that creates the containers never sees the\\n      plaintext data key.</p>\\n         <p>To request an asymmetric data key pair, use the <a>GenerateDataKeyPair</a> or\\n        <a>GenerateDataKeyPairWithoutPlaintext</a> operations.</p>\\n         <p>To generate a data key, you must specify the symmetric encryption KMS key that is used to\\n      encrypt the data key. You cannot use an asymmetric KMS key or a key in a custom key store to\\n      generate a data key. To get the type of your KMS key, use the <a>DescribeKey</a>\\n      operation.</p>\\n         <p>You must also specify the length of the data key. Use either the <code>KeySpec</code> or\\n        <code>NumberOfBytes</code> parameters (but not both). For 128-bit and 256-bit data keys, use\\n      the <code>KeySpec</code> parameter.</p>\\n         <p>To generate an SM4 data key (China Regions only), specify a <code>KeySpec</code> value of\\n        <code>AES_128</code> or <code>NumberOfBytes</code> value of <code>16</code>. The symmetric\\n      encryption key used in China Regions to encrypt your data key is an SM4 encryption key.</p>\\n         <p>If the operation succeeds, you will find the encrypted copy of the data key in the\\n        <code>CiphertextBlob</code> field.</p>\\n         <p>You can use an optional encryption context to add additional security to the encryption\\n      operation. If you specify an <code>EncryptionContext</code>, you must specify the same\\n      encryption context (a case-sensitive exact match) when decrypting the encrypted data key.\\n      Otherwise, the request to decrypt fails with an <code>InvalidCiphertextException</code>. For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/encrypt_context.html\\\">Encryption Context</a> in the\\n      <i>Key Management Service Developer Guide</i>.</p>\\n         <p>The KMS key that you use for this operation must be in a compatible key state. For\\ndetails, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/key-state.html\\\">Key states of KMS keys</a> in the <i>Key Management Service Developer Guide</i>.</p>\\n         <p>\\n            <b>Cross-account use</b>: Yes. To perform this operation with a KMS key in a different Amazon Web Services account, specify\\n  the key ARN or alias ARN in the value of the <code>KeyId</code> parameter.</p>\\n         <p>\\n            <b>Required permissions</b>: <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/kms-api-permissions-reference.html\\\">kms:GenerateDataKeyWithoutPlaintext</a> (key\\n      policy)</p>\\n         <p>\\n            <b>Related operations:</b>\\n         </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a>Decrypt</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>Encrypt</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>GenerateDataKey</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>GenerateDataKeyPair</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>GenerateDataKeyPairWithoutPlaintext</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>\\n            <b>Eventual consistency</b>: The KMS API follows an eventual consistency model. \\n  For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/accessing-kms.html#programming-eventual-consistency\\\">KMS eventual consistency</a>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To generate an encrypted data key\",\n                        \"documentation\": \"The following example generates an encrypted copy of a 256-bit symmetric data encryption key (data key). The data key is encrypted with the specified KMS key.\",\n                        \"input\": {\n                            \"KeyId\": \"alias/ExampleAlias\",\n                            \"KeySpec\": \"AES_256\"\n                        },\n                        \"output\": {\n                            \"CiphertextBlob\": \"<binary data>\",\n                            \"KeyId\": \"arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab\",\n                            \"KeyMaterialId\": \"0b7fd7ddbac6eef27907413567cad8c810e2883dc8a7534067a82ee1142fc1e6\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.kms#GenerateDataKeyWithoutPlaintextRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"KeyId\": {\n                    \"target\": \"com.amazonaws.kms#KeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the symmetric encryption KMS key that encrypts the data key. You cannot specify\\n      an asymmetric KMS key or a KMS key in a custom key store. To get the type and origin of your\\n      KMS key, use the <a>DescribeKey</a> operation.</p>\\n         <p>To specify a KMS key, use its key ID, key ARN, alias name, or alias ARN. When using an alias name, prefix it with <code>\\\"alias/\\\"</code>. To specify a KMS key in a different Amazon Web Services account, you must use the key ARN or alias ARN.</p>\\n         <p>For example:</p>\\n         <ul>\\n            <li>\\n               <p>Key ID: <code>1234abcd-12ab-34cd-56ef-1234567890ab</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Key ARN: <code>arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Alias name: <code>alias/ExampleAlias</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Alias ARN: <code>arn:aws:kms:us-east-2:111122223333:alias/ExampleAlias</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>To get the key ID and key ARN for a KMS key, use <a>ListKeys</a> or <a>DescribeKey</a>. To get the alias name and alias ARN, use <a>ListAliases</a>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"EncryptionContext\": {\n                    \"target\": \"com.amazonaws.kms#EncryptionContextType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the encryption context that will be used when encrypting the data key.</p>\\n         <important>\\n            <p>Do not include confidential or sensitive information in this field. This field may be displayed in plaintext in CloudTrail logs and other output.</p>\\n         </important>\\n         <p>An <i>encryption context</i> is a collection of non-secret key-value pairs that represent additional authenticated data. \\nWhen you use an encryption context to encrypt data, you must specify the same (an exact case-sensitive match) encryption context to decrypt the data. An encryption context is supported\\nonly on operations with symmetric encryption KMS keys. On operations with symmetric encryption KMS keys, an encryption context is optional, but it is strongly recommended.</p>\\n         <p>For more information, see\\n<a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/encrypt_context.html\\\">Encryption context</a> in the <i>Key Management Service Developer Guide</i>.</p>\"\n                    }\n                },\n                \"KeySpec\": {\n                    \"target\": \"com.amazonaws.kms#DataKeySpec\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The length of the data key. Use <code>AES_128</code> to generate a 128-bit symmetric key,\\n      or <code>AES_256</code> to generate a 256-bit symmetric key.</p>\"\n                    }\n                },\n                \"NumberOfBytes\": {\n                    \"target\": \"com.amazonaws.kms#NumberOfBytesType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The length of the data key in bytes. For example, use the value 64 to generate a 512-bit\\n      data key (64 bytes is 512 bits). For common key lengths (128-bit and 256-bit symmetric keys),\\n      we recommend that you use the <code>KeySpec</code> field instead of this one.</p>\"\n                    }\n                },\n                \"GrantTokens\": {\n                    \"target\": \"com.amazonaws.kms#GrantTokenList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of grant tokens.</p>\\n         <p>Use a grant token when your permission to call this operation comes from a new grant that has not yet achieved <i>eventual consistency</i>. For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/grants.html#grant_token\\\">Grant token</a> and <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/using-grant-token.html\\\">Using a grant token</a> in the\\n    <i>Key Management Service Developer Guide</i>.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.kms#NullableBooleanType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks if your request will succeed. <code>DryRun</code> is an optional parameter. </p>\\n         <p>To learn more about how to use this parameter, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/testing-permissions.html\\\">Testing your permissions</a> in the <i>Key Management Service Developer Guide</i>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.kms#GenerateDataKeyWithoutPlaintextResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CiphertextBlob\": {\n                    \"target\": \"com.amazonaws.kms#CiphertextType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The encrypted data key. When you use the HTTP API or the Amazon Web Services CLI, the value is Base64-encoded. Otherwise, it is not Base64-encoded.</p>\"\n                    }\n                },\n                \"KeyId\": {\n                    \"target\": \"com.amazonaws.kms#KeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (<a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-id-key-ARN\\\">key ARN</a>) of the KMS key that encrypted the data key.</p>\"\n                    }\n                },\n                \"KeyMaterialId\": {\n                    \"target\": \"com.amazonaws.kms#BackingKeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The identifier of the key material used to encrypt the data key.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.kms#GenerateMac\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.kms#GenerateMacRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.kms#GenerateMacResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.kms#DisabledException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#DryRunOperationException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#InvalidGrantTokenException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#InvalidKeyUsageException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KeyUnavailableException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInternalException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInvalidStateException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#NotFoundException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Generates a hash-based message authentication code (HMAC) for a message using an HMAC KMS\\n      key and a MAC algorithm that the key supports. HMAC KMS keys and the HMAC algorithms that\\n      KMS uses conform to industry standards defined in <a href=\\\"https://datatracker.ietf.org/doc/html/rfc2104\\\">RFC 2104</a>.</p>\\n         <p>You can use value that GenerateMac returns in the <a>VerifyMac</a> operation to\\n      demonstrate that the original message has not changed. Also, because a secret key is used to\\n      create the hash, you can verify that the party that generated the hash has the required secret\\n      key. You can also use the raw result to implement HMAC-based algorithms such as key derivation\\n      functions. This operation is part of KMS support for HMAC KMS keys. For\\n      details, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/hmac.html\\\">HMAC keys in\\n        KMS</a> in the <i>\\n               <i>Key Management Service Developer Guide</i>\\n            </i>.</p>\\n         <note>\\n            <p>Best practices recommend that you limit the time during which any signing mechanism,\\n        including an HMAC, is effective. This deters an attack where the actor uses a signed message\\n        to establish validity repeatedly or long after the message is superseded. HMAC tags do not\\n        include a timestamp, but you can include a timestamp in the token or message to help you\\n        detect when its time to refresh the HMAC. </p>\\n         </note>\\n         <p>The KMS key that you use for this operation must be in a compatible key state. For\\ndetails, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/key-state.html\\\">Key states of KMS keys</a> in the <i>Key Management Service Developer Guide</i>.</p>\\n         <p>\\n            <b>Cross-account use</b>: Yes. To perform this operation with a KMS key in a different Amazon Web Services account, specify\\n  the key ARN or alias ARN in the value of the <code>KeyId</code> parameter. </p>\\n         <p>\\n            <b>Required permissions</b>: <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/kms-api-permissions-reference.html\\\">kms:GenerateMac</a> (key policy)</p>\\n         <p>\\n            <b>Related operations</b>: <a>VerifyMac</a>\\n         </p>\\n         <p>\\n            <b>Eventual consistency</b>: The KMS API follows an eventual consistency model. \\n  For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/accessing-kms.html#programming-eventual-consistency\\\">KMS eventual consistency</a>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To generate an HMAC for a message\",\n                        \"documentation\": \"This example generates an HMAC for a message, an HMAC KMS key, and a MAC algorithm. The algorithm must be supported by the specified HMAC KMS key.\",\n                        \"input\": {\n                            \"Message\": \"Hello World\",\n                            \"KeyId\": \"1234abcd-12ab-34cd-56ef-1234567890ab\",\n                            \"MacAlgorithm\": \"HMAC_SHA_384\"\n                        },\n                        \"output\": {\n                            \"Mac\": \"<HMAC_TAG>\",\n                            \"MacAlgorithm\": \"HMAC_SHA_384\",\n                            \"KeyId\": \"arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.kms#GenerateMacRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Message\": {\n                    \"target\": \"com.amazonaws.kms#PlaintextType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The message to be hashed. Specify a message of up to 4,096 bytes. </p>\\n         <p>\\n            <code>GenerateMac</code> and <a>VerifyMac</a> do not provide special handling\\n      for message digests. If you generate an HMAC for a hash digest of a message, you must verify\\n      the HMAC of the same hash digest.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"KeyId\": {\n                    \"target\": \"com.amazonaws.kms#KeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The HMAC KMS key to use in the operation. The MAC algorithm computes the HMAC for the\\n      message and the key as described in <a href=\\\"https://datatracker.ietf.org/doc/html/rfc2104\\\">RFC 2104</a>.</p>\\n         <p>To identify an HMAC KMS key, use the <a>DescribeKey</a> operation and see the\\n        <code>KeySpec</code> field in the response.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"MacAlgorithm\": {\n                    \"target\": \"com.amazonaws.kms#MacAlgorithmSpec\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The MAC algorithm used in the operation.</p>\\n         <p> The algorithm must be compatible with the HMAC KMS key that you specify. To find the MAC\\n      algorithms that your HMAC KMS key supports, use the <a>DescribeKey</a> operation\\n      and see the <code>MacAlgorithms</code> field in the <code>DescribeKey</code> response.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"GrantTokens\": {\n                    \"target\": \"com.amazonaws.kms#GrantTokenList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of grant tokens.</p>\\n         <p>Use a grant token when your permission to call this operation comes from a new grant that has not yet achieved <i>eventual consistency</i>. For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/grants.html#grant_token\\\">Grant token</a> and <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/using-grant-token.html\\\">Using a grant token</a> in the\\n    <i>Key Management Service Developer Guide</i>.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.kms#NullableBooleanType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks if your request will succeed. <code>DryRun</code> is an optional parameter. </p>\\n         <p>To learn more about how to use this parameter, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/testing-permissions.html\\\">Testing your permissions</a> in the <i>Key Management Service Developer Guide</i>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.kms#GenerateMacResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Mac\": {\n                    \"target\": \"com.amazonaws.kms#CiphertextType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The hash-based message authentication code (HMAC) that was generated for the specified\\n      message, HMAC KMS key, and MAC algorithm.</p>\\n         <p>This is the standard, raw HMAC defined in <a href=\\\"https://datatracker.ietf.org/doc/html/rfc2104\\\">RFC 2104</a>.</p>\"\n                    }\n                },\n                \"MacAlgorithm\": {\n                    \"target\": \"com.amazonaws.kms#MacAlgorithmSpec\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The MAC algorithm that was used to generate the HMAC.</p>\"\n                    }\n                },\n                \"KeyId\": {\n                    \"target\": \"com.amazonaws.kms#KeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The HMAC KMS key used in the operation.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.kms#GenerateRandom\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.kms#GenerateRandomRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.kms#GenerateRandomResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.kms#CustomKeyStoreInvalidStateException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#CustomKeyStoreNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#DependencyTimeoutException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInternalException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#UnsupportedOperationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns a random byte string that is cryptographically secure.</p>\\n         <p>You must use the <code>NumberOfBytes</code> parameter to specify the length of the random\\n      byte string. There is no default value for string length.</p>\\n         <p>By default, the random byte string is generated in KMS. To generate the byte string in\\n      the CloudHSM cluster associated with an CloudHSM key store, use the <code>CustomKeyStoreId</code>\\n      parameter.</p>\\n         <p>\\n            <code>GenerateRandom</code> also supports <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/nitro-enclave.html\\\">Amazon Web Services Nitro Enclaves</a>, which provide an\\n      isolated compute environment in Amazon EC2. To call <code>GenerateRandom</code> for a Nitro\\n      enclave or NitroTPM, use the <a href=\\\"https://docs.aws.amazon.com/enclaves/latest/user/developing-applications.html#sdk\\\">Amazon Web Services Nitro Enclaves SDK</a> or any Amazon Web Services SDK. Use the <code>Recipient</code> parameter\\n      to provide the attestation document for the attested environment. Instead of plaintext bytes, the response\\n      includes the plaintext bytes encrypted under the public key from the attestation document\\n        (<code>CiphertextForRecipient</code>). For information about the interaction between KMS and Amazon Web Services Nitro Enclaves or Amazon Web Services NitroTPM, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/cryptographic-attestation.html\\\">Cryptographic attestation support in KMS</a> in the <i>Key Management Service Developer Guide</i>.</p>\\n         <p>For more information about entropy and random number generation, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/kms-cryptography.html#entropy-and-random-numbers\\\">Entropy and random number generation</a> in the <i>Key Management Service Developer Guide</i>.</p>\\n         <p>\\n            <b>Cross-account use</b>: Not applicable.\\n        <code>GenerateRandom</code> does not use any account-specific resources, such as KMS\\n      keys.</p>\\n         <p>\\n            <b>Required permissions</b>: <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/kms-api-permissions-reference.html\\\">kms:GenerateRandom</a> (IAM policy)</p>\\n         <p>\\n            <b>Eventual consistency</b>: The KMS API follows an eventual consistency model. \\n  For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/accessing-kms.html#programming-eventual-consistency\\\">KMS eventual consistency</a>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To generate random data\",\n                        \"documentation\": \"The following example generates 32 bytes of random data.\",\n                        \"input\": {\n                            \"NumberOfBytes\": 32\n                        },\n                        \"output\": {\n                            \"Plaintext\": \"<binary data>\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.kms#GenerateRandomRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NumberOfBytes\": {\n                    \"target\": \"com.amazonaws.kms#NumberOfBytesType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The length of the random byte string. This parameter is required.</p>\"\n                    }\n                },\n                \"CustomKeyStoreId\": {\n                    \"target\": \"com.amazonaws.kms#CustomKeyStoreIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Generates the random byte string in the CloudHSM cluster that is associated with the\\n      specified CloudHSM key store. To find the ID of a custom key store, use the <a>DescribeCustomKeyStores</a> operation.</p>\\n         <p>External key store IDs are not valid for this parameter. If you specify the ID of an\\n      external key store, <code>GenerateRandom</code> throws an\\n        <code>UnsupportedOperationException</code>.</p>\"\n                    }\n                },\n                \"Recipient\": {\n                    \"target\": \"com.amazonaws.kms#RecipientInfo\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A signed <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/nitro-enclave-how.html#term-attestdoc\\\">attestation document</a> from\\n      an Amazon Web Services Nitro enclave or NitroTPM, and the encryption algorithm to use with the public key in the attestation document. The\\n      only valid encryption algorithm is <code>RSAES_OAEP_SHA_256</code>. </p>\\n         <p>This parameter supports the <a href=\\\"https://docs.aws.amazon.com/enclaves/latest/user/developing-applications.html#sdk\\\">Amazon Web Services Nitro Enclaves SDK</a> or any Amazon Web Services SDK for Amazon Web Services Nitro Enclaves. It supports \\n      any Amazon Web Services SDK for Amazon Web Services NitroTPM.\\n    </p>\\n         <p>When you use this parameter, instead of returning plaintext bytes, KMS encrypts the\\n      plaintext bytes under the public key in the attestation document, and returns the resulting\\n      ciphertext in the <code>CiphertextForRecipient</code> field in the response. This ciphertext\\n      can be decrypted only with the private key in the attested environment. The <code>Plaintext</code> field in\\n      the response is null or empty.</p>\\n         <p>For information about the interaction between KMS and Amazon Web Services Nitro Enclaves or Amazon Web Services NitroTPM, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/cryptographic-attestation.html\\\">Cryptographic attestation support in KMS</a> in the <i>Key Management Service Developer Guide</i>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.kms#GenerateRandomResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Plaintext\": {\n                    \"target\": \"com.amazonaws.kms#PlaintextType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The random byte string. When you use the HTTP API or the Amazon Web Services CLI, the value is Base64-encoded. Otherwise, it is not Base64-encoded.</p>\\n         <p>If the response includes the <code>CiphertextForRecipient</code> field, the\\n        <code>Plaintext</code> field is null or empty.</p>\"\n                    }\n                },\n                \"CiphertextForRecipient\": {\n                    \"target\": \"com.amazonaws.kms#CiphertextType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The plaintext random bytes encrypted with the public key from the attestation document. This\\n      ciphertext can be decrypted only by using a private key from the attested environment. </p>\\n         <p>This field is included in the response only when the <code>Recipient</code> parameter in\\n      the request includes a valid attestation document from an Amazon Web Services Nitro enclave or NitroTPM.\\n      For information about the interaction between KMS and Amazon Web Services Nitro Enclaves or Amazon Web Services NitroTPM, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/cryptographic-attestation.html\\\">Cryptographic attestation support in KMS</a> in the <i>Key Management Service Developer Guide</i>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.kms#GetKeyPolicy\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.kms#GetKeyPolicyRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.kms#GetKeyPolicyResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.kms#DependencyTimeoutException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#InvalidArnException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInternalException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInvalidStateException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#NotFoundException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Gets a key policy attached to the specified KMS key.</p>\\n         <p>\\n            <b>Cross-account use</b>: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.</p>\\n         <p>\\n            <b>Required permissions</b>: <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/kms-api-permissions-reference.html\\\">kms:GetKeyPolicy</a> (key policy)</p>\\n         <p>\\n            <b>Related operations</b>: <a href=\\\"https://docs.aws.amazon.com/kms/latest/APIReference/API_PutKeyPolicy.html\\\">PutKeyPolicy</a>\\n         </p>\\n         <p>\\n            <b>Eventual consistency</b>: The KMS API follows an eventual consistency model. \\n  For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/accessing-kms.html#programming-eventual-consistency\\\">KMS eventual consistency</a>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To retrieve a key policy\",\n                        \"documentation\": \"The following example retrieves the key policy for the specified KMS key.\",\n                        \"input\": {\n                            \"KeyId\": \"1234abcd-12ab-34cd-56ef-1234567890ab\",\n                            \"PolicyName\": \"default\"\n                        },\n                        \"output\": {\n                            \"Policy\": \"{\\n  \\\"Version\\\" : \\\"2012-10-17\\\",\\n  \\\"Id\\\" : \\\"key-default-1\\\",\\n  \\\"Statement\\\" : [ {\\n    \\\"Sid\\\" : \\\"Enable IAM User Permissions\\\",\\n    \\\"Effect\\\" : \\\"Allow\\\",\\n    \\\"Principal\\\" : {\\n      \\\"AWS\\\" : \\\"arn:aws:iam::111122223333:root\\\"\\n    },\\n    \\\"Action\\\" : \\\"kms:*\\\",\\n    \\\"Resource\\\" : \\\"*\\\"\\n  } ]\\n}\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.kms#GetKeyPolicyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"KeyId\": {\n                    \"target\": \"com.amazonaws.kms#KeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Gets the key policy for the specified KMS key.</p>\\n         <p>Specify the key ID or key ARN of the KMS key.</p>\\n         <p>For example:</p>\\n         <ul>\\n            <li>\\n               <p>Key ID: <code>1234abcd-12ab-34cd-56ef-1234567890ab</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Key ARN: <code>arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>To get the key ID and key ARN for a KMS key, use <a>ListKeys</a> or <a>DescribeKey</a>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"PolicyName\": {\n                    \"target\": \"com.amazonaws.kms#PolicyNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the name of the key policy. If no policy name is specified, the default value is\\n        <code>default</code>. The only valid name is <code>default</code>. To get the names of key\\n      policies, use <a>ListKeyPolicies</a>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.kms#GetKeyPolicyResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Policy\": {\n                    \"target\": \"com.amazonaws.kms#PolicyType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A key policy document in JSON format.</p>\"\n                    }\n                },\n                \"PolicyName\": {\n                    \"target\": \"com.amazonaws.kms#PolicyNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the key policy. The only valid value is <code>default</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.kms#GetKeyRotationStatus\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.kms#GetKeyRotationStatusRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.kms#GetKeyRotationStatusResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.kms#DependencyTimeoutException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#InvalidArnException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInternalException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInvalidStateException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#NotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#UnsupportedOperationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Provides detailed information about the rotation status for a KMS key, including whether\\n        <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/rotating-keys-enable-disable.html\\\">automatic\\n        rotation of the key material</a> is enabled for the specified KMS key, the <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/rotate-keys.html#rotation-period\\\">rotation\\n        period</a>, and the next scheduled rotation date.</p>\\n         <p>Automatic key rotation is supported only on symmetric encryption KMS keys.\\n      You cannot enable automatic rotation of <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/symmetric-asymmetric.html\\\">asymmetric KMS keys</a>, <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/hmac.html\\\">HMAC KMS keys</a>, KMS keys with <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/importing-keys.html\\\">imported key material</a>, or KMS keys in a <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/key-store-overview.html\\\">custom key store</a>. To enable or disable automatic rotation of a set of related <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/rotate-keys.html#multi-region-rotate\\\">multi-Region keys</a>, set the property on the primary key.</p>\\n         <p>You can enable (<a>EnableKeyRotation</a>) and disable automatic rotation (<a>DisableKeyRotation</a>) of the key material in customer managed KMS keys. Key\\n      material rotation of <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-key\\\">Amazon Web Services managed KMS keys</a> is not\\n      configurable. KMS always rotates the key material in Amazon Web Services managed KMS keys every year. The\\n      key rotation status for Amazon Web Services managed KMS keys is always <code>true</code>.</p>\\n         <p>You can perform on-demand (<a>RotateKeyOnDemand</a>) rotation of the key\\n      material in customer managed KMS keys, regardless of whether or not automatic key rotation is\\n      enabled. You can use GetKeyRotationStatus to identify the date and time that an in progress\\n      on-demand rotation was initiated. You can use <a>ListKeyRotations</a> to view the\\n      details of completed rotations.</p>\\n         <note>\\n            <p>In May 2022, KMS changed the rotation schedule for Amazon Web Services managed keys from every three\\n        years to every year. For details, see <a>EnableKeyRotation</a>.</p>\\n         </note>\\n         <p>The KMS key that you use for this operation must be in a compatible key state. For\\ndetails, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/key-state.html\\\">Key states of KMS keys</a> in the <i>Key Management Service Developer Guide</i>.</p>\\n         <ul>\\n            <li>\\n               <p>Disabled: The key rotation status does not change when you disable a KMS key. However,\\n          while the KMS key is disabled, KMS does not rotate the key material. When you re-enable\\n          the KMS key, rotation resumes. If the key material in the re-enabled KMS key hasn't been\\n          rotated in one year, KMS rotates it immediately, and every year thereafter. If it's been\\n          less than a year since the key material in the re-enabled KMS key was rotated, the KMS key\\n          resumes its prior rotation schedule.</p>\\n            </li>\\n            <li>\\n               <p>Pending deletion: While a KMS key is pending deletion, its key rotation status is\\n            <code>false</code> and KMS does not rotate the key material. If you cancel the\\n          deletion, the original key rotation status returns to <code>true</code>.</p>\\n            </li>\\n         </ul>\\n         <p>\\n            <b>Cross-account use</b>: Yes. To perform this operation on a KMS key in a different Amazon Web Services account, specify the key\\n  ARN in the value of the <code>KeyId</code> parameter.</p>\\n         <p>\\n            <b>Required permissions</b>: <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/kms-api-permissions-reference.html\\\">kms:GetKeyRotationStatus</a> (key policy)</p>\\n         <p>\\n            <b>Related operations:</b>\\n         </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a>DisableKeyRotation</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>EnableKeyRotation</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>ListKeyRotations</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>RotateKeyOnDemand</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>\\n            <b>Eventual consistency</b>: The KMS API follows an eventual consistency model. \\n  For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/accessing-kms.html#programming-eventual-consistency\\\">KMS eventual consistency</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.kms#GetKeyRotationStatusRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"KeyId\": {\n                    \"target\": \"com.amazonaws.kms#KeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Gets the rotation status for the specified KMS key.</p>\\n         <p>Specify the key ID or key ARN of the KMS key. To specify a KMS key in a\\ndifferent Amazon Web Services account, you must use the key ARN.</p>\\n         <p>For example:</p>\\n         <ul>\\n            <li>\\n               <p>Key ID: <code>1234abcd-12ab-34cd-56ef-1234567890ab</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Key ARN: <code>arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>To get the key ID and key ARN for a KMS key, use <a>ListKeys</a> or <a>DescribeKey</a>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.kms#GetKeyRotationStatusResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"KeyRotationEnabled\": {\n                    \"target\": \"com.amazonaws.kms#BooleanType\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>A Boolean value that specifies whether key rotation is enabled.</p>\"\n                    }\n                },\n                \"KeyId\": {\n                    \"target\": \"com.amazonaws.kms#KeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Identifies the specified symmetric encryption KMS key.</p>\"\n                    }\n                },\n                \"RotationPeriodInDays\": {\n                    \"target\": \"com.amazonaws.kms#RotationPeriodInDaysType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of days between each automatic rotation. The default value is 365 days.</p>\"\n                    }\n                },\n                \"NextRotationDate\": {\n                    \"target\": \"com.amazonaws.kms#DateType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The next date that KMS will automatically rotate the key material.</p>\"\n                    }\n                },\n                \"OnDemandRotationStartDate\": {\n                    \"target\": \"com.amazonaws.kms#DateType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Identifies the date and time that an in progress on-demand rotation was initiated.</p>\\n         <p>KMS uses a background process to perform rotations. As a result, there might be a slight\\n      delay between initiating on-demand key rotation and the rotation's completion. Once the\\n      on-demand rotation is complete, KMS removes this field from the response. You can use <a>ListKeyRotations</a> to view the details of the completed on-demand rotation.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.kms#GetParametersForImport\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.kms#GetParametersForImportRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.kms#GetParametersForImportResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.kms#DependencyTimeoutException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#InvalidArnException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInternalException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInvalidStateException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#NotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#UnsupportedOperationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns the public key and an import token you need to import or reimport key material for\\n      a KMS key. </p>\\n         <p>By default, KMS keys are created with key material that KMS generates. This operation\\n      supports <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/importing-keys.html\\\">Importing key\\n        material</a>, an advanced feature that lets you generate and import the cryptographic\\n      key material for a KMS key.</p>\\n         <p>Before calling <code>GetParametersForImport</code>, use the <a>CreateKey</a>\\n      operation with an <code>Origin</code> value of <code>EXTERNAL</code> to create a KMS key with\\n      no key material. You can import key material for a symmetric encryption KMS key, HMAC KMS key,\\n      asymmetric encryption KMS key, or asymmetric signing KMS key. You can also import key material\\n      into a <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/multi-region-keys-overview.html\\\">multi-Region key</a> of any supported type. However, you can't import key material into\\n      a KMS key in a <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/key-store-overview.html\\\">custom\\n        key store</a>. You can also use <code>GetParametersForImport</code> to get a public key\\n      and import token to <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/importing-keys-import-key-material.html#reimport-key-material\\\">reimport\\n        the original key material</a> into a KMS key whose key material expired or was\\n      deleted.</p>\\n         <p>\\n            <code>GetParametersForImport</code> returns the items that you need to import your key\\n      material.</p>\\n         <ul>\\n            <li>\\n               <p>The public key (or \\\"wrapping key\\\") of an RSA key pair that KMS generates.</p>\\n               <p>You will use this public key to encrypt (\\\"wrap\\\") your key material while it's in\\n          transit to KMS. </p>\\n            </li>\\n            <li>\\n               <p>A import token that ensures that KMS can decrypt your key material and associate it\\n          with the correct KMS key.</p>\\n            </li>\\n         </ul>\\n         <p>The public key and its import token are permanently linked and must be used together. Each\\n      public key and import token set is valid for 24 hours. The expiration date and time appear in\\n      the <code>ParametersValidTo</code> field in the <code>GetParametersForImport</code> response.\\n      You cannot use an expired public key or import token in an <a>ImportKeyMaterial</a>\\n      request. If your key and token expire, send another <code>GetParametersForImport</code>\\n      request.</p>\\n         <p>\\n            <code>GetParametersForImport</code> requires the following information:</p>\\n         <ul>\\n            <li>\\n               <p>The key ID of the KMS key for which you are importing the key material.</p>\\n            </li>\\n            <li>\\n               <p>The key spec of the public key (\\\"wrapping key\\\") that you will use to encrypt your key\\n          material during import.</p>\\n            </li>\\n            <li>\\n               <p>The wrapping algorithm that you will use with the public key to encrypt your key\\n          material.</p>\\n            </li>\\n         </ul>\\n         <p>You can use the same or a different public key spec and wrapping algorithm each time you\\n      import or reimport the same key material. </p>\\n         <p>The KMS key that you use for this operation must be in a compatible key state. For\\ndetails, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/key-state.html\\\">Key states of KMS keys</a> in the <i>Key Management Service Developer Guide</i>.</p>\\n         <p>\\n            <b>Cross-account use</b>: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.</p>\\n         <p>\\n            <b>Required permissions</b>: <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/kms-api-permissions-reference.html\\\">kms:GetParametersForImport</a> (key policy)</p>\\n         <p>\\n            <b>Related operations:</b>\\n         </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a>ImportKeyMaterial</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>DeleteImportedKeyMaterial</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>\\n            <b>Eventual consistency</b>: The KMS API follows an eventual consistency model. \\n  For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/accessing-kms.html#programming-eventual-consistency\\\">KMS eventual consistency</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.kms#GetParametersForImportRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"KeyId\": {\n                    \"target\": \"com.amazonaws.kms#KeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The identifier of the KMS key that will be associated with the imported key material. The\\n        <code>Origin</code> of the KMS key must be <code>EXTERNAL</code>.</p>\\n         <p>All KMS key types are supported, including multi-Region keys. However, you cannot import\\n      key material into a KMS key in a custom key store.</p>\\n         <p>Specify the key ID or key ARN of the KMS key.</p>\\n         <p>For example:</p>\\n         <ul>\\n            <li>\\n               <p>Key ID: <code>1234abcd-12ab-34cd-56ef-1234567890ab</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Key ARN: <code>arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>To get the key ID and key ARN for a KMS key, use <a>ListKeys</a> or <a>DescribeKey</a>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"WrappingAlgorithm\": {\n                    \"target\": \"com.amazonaws.kms#AlgorithmSpec\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The algorithm you will use with the RSA public key (<code>PublicKey</code>) in the\\n      response to protect your key material during import. For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/importing-keys-get-public-key-and-token.html#select-wrapping-algorithm\\\">Select a wrapping algorithm</a> in the <i>Key Management Service Developer Guide</i>.</p>\\n         <p>For RSA_AES wrapping algorithms, you encrypt your key material with an AES key that you\\n      generate, then encrypt your AES key with the RSA public key from KMS. For RSAES wrapping\\n      algorithms, you encrypt your key material directly with the RSA public key from KMS.</p>\\n         <p>The wrapping algorithms that you can use depend on the type of key material that you are\\n      importing. To import an RSA private key, you must use an RSA_AES wrapping algorithm.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <b>RSA_AES_KEY_WRAP_SHA_256</b> — Supported for\\n          wrapping RSA and ECC key material.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>RSA_AES_KEY_WRAP_SHA_1</b> — Supported for\\n          wrapping RSA and ECC key material.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>RSAES_OAEP_SHA_256</b> — Supported for all types\\n          of key material, except RSA key material (private key).</p>\\n               <p>You cannot use the RSAES_OAEP_SHA_256 wrapping algorithm with the RSA_2048 wrapping\\n          key spec to wrap ECC_NIST_P521 key material.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>RSAES_OAEP_SHA_1</b> — Supported for all types of\\n          key material, except RSA key material (private key).</p>\\n               <p>You cannot use the RSAES_OAEP_SHA_1 wrapping algorithm with the RSA_2048 wrapping key\\n          spec to wrap ECC_NIST_P521 key material.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>RSAES_PKCS1_V1_5</b> (Deprecated) — As of October\\n          10, 2023, KMS does not support the RSAES_PKCS1_V1_5 wrapping algorithm.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"WrappingKeySpec\": {\n                    \"target\": \"com.amazonaws.kms#WrappingKeySpec\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of RSA public key to return in the response. You will use this wrapping key with\\n      the specified wrapping algorithm to protect your key material during import. </p>\\n         <p>Use the longest RSA wrapping key that is practical. </p>\\n         <p>You cannot use an RSA_2048 public key to directly wrap an ECC_NIST_P521 private key.\\n      Instead, use an RSA_AES wrapping algorithm or choose a longer RSA public key.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.kms#GetParametersForImportResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"KeyId\": {\n                    \"target\": \"com.amazonaws.kms#KeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (<a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-id-key-ARN\\\">key ARN</a>) of the KMS key to use in a subsequent <a>ImportKeyMaterial</a> request. This is the same KMS key specified in the <code>GetParametersForImport</code>\\n      request.</p>\"\n                    }\n                },\n                \"ImportToken\": {\n                    \"target\": \"com.amazonaws.kms#CiphertextType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The import token to send in a subsequent <a>ImportKeyMaterial</a>\\n      request.</p>\"\n                    }\n                },\n                \"PublicKey\": {\n                    \"target\": \"com.amazonaws.kms#PlaintextType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The public key to use to encrypt the key material before importing it with <a>ImportKeyMaterial</a>.</p>\"\n                    }\n                },\n                \"ParametersValidTo\": {\n                    \"target\": \"com.amazonaws.kms#DateType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time at which the import token and public key are no longer valid. After this time,\\n      you cannot use them to make an <a>ImportKeyMaterial</a> request and you must send\\n      another <code>GetParametersForImport</code> request to get new ones.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.kms#GetPublicKey\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.kms#GetPublicKeyRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.kms#GetPublicKeyResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.kms#DependencyTimeoutException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#DisabledException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#InvalidArnException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#InvalidGrantTokenException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#InvalidKeyUsageException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KeyUnavailableException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInternalException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInvalidStateException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#NotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#UnsupportedOperationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns the public key of an asymmetric KMS key. Unlike the private key of a asymmetric\\n      KMS key, which never leaves KMS unencrypted, callers with <code>kms:GetPublicKey</code>\\n      permission can download the public key of an asymmetric KMS key. You can share the public key\\n      to allow others to encrypt messages and verify signatures outside of KMS.\\n      For information about asymmetric KMS keys, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/symmetric-asymmetric.html\\\">Asymmetric KMS keys</a> in the <i>Key Management Service Developer Guide</i>.</p>\\n         <p>You do not need to download the public key. Instead, you can use the public key within\\n      KMS by calling the <a>Encrypt</a>, <a>ReEncrypt</a>, or <a>Verify</a> operations with the identifier of an asymmetric KMS key. When you use the\\n      public key within KMS, you benefit from the authentication, authorization, and logging that\\n      are part of every KMS operation. You also reduce of risk of encrypting data that cannot be\\n      decrypted. These features are not effective outside of KMS.</p>\\n         <p>To help you use the public key safely outside of KMS, <code>GetPublicKey</code> returns\\n      important information about the public key in the response, including:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/kms/latest/APIReference/API_GetPublicKey.html#KMS-GetPublicKey-response-KeySpec\\\">KeySpec</a>: The type of key material in the public key, such as\\n            <code>RSA_4096</code> or <code>ECC_NIST_P521</code>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/kms/latest/APIReference/API_GetPublicKey.html#KMS-GetPublicKey-response-KeyUsage\\\">KeyUsage</a>: Whether the key is used for encryption, signing, or deriving a shared\\n          secret.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/kms/latest/APIReference/API_GetPublicKey.html#KMS-GetPublicKey-response-EncryptionAlgorithms\\\">EncryptionAlgorithms</a>, <a href=\\\"https://docs.aws.amazon.com/kms/latest/APIReference/API_GetPublicKey.html#KMS-GetPublicKey-response-KeyAgreementAlgorithms\\\">KeyAgreementAlgorithms</a>, or <a href=\\\"https://docs.aws.amazon.com/kms/latest/APIReference/API_GetPublicKey.html#KMS-GetPublicKey-response-SigningAlgorithms\\\">SigningAlgorithms</a>: A list of the encryption algorithms, key agreement\\n          algorithms, or signing algorithms for the key.</p>\\n            </li>\\n         </ul>\\n         <p>Although KMS cannot enforce these restrictions on external operations, it is crucial\\n      that you use this information to prevent the public key from being used improperly. For\\n      example, you can prevent a public signing key from being used encrypt data, or prevent a\\n      public key from being used with an encryption algorithm that is not supported by KMS. You\\n      can also avoid errors, such as using the wrong signing algorithm in a verification\\n      operation.</p>\\n         <p>To verify a signature outside of KMS with an SM2 public key (China Regions only), you\\n      must specify the distinguishing ID. By default, KMS uses <code>1234567812345678</code> as\\n      the distinguishing ID. For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/offline-operations.html#key-spec-sm-offline-verification\\\">Offline\\n        verification with SM2 key pairs</a>.</p>\\n         <p>The KMS key that you use for this operation must be in a compatible key state. For\\ndetails, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/key-state.html\\\">Key states of KMS keys</a> in the <i>Key Management Service Developer Guide</i>.</p>\\n         <p>\\n            <b>Cross-account use</b>: Yes. To perform this operation with a KMS key in a different Amazon Web Services account, specify\\n  the key ARN or alias ARN in the value of the <code>KeyId</code> parameter.</p>\\n         <p>\\n            <b>Required permissions</b>: <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/kms-api-permissions-reference.html\\\">kms:GetPublicKey</a> (key policy)</p>\\n         <p>\\n            <b>Related operations</b>: <a>CreateKey</a>\\n         </p>\\n         <p>\\n            <b>Eventual consistency</b>: The KMS API follows an eventual consistency model. \\n  For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/accessing-kms.html#programming-eventual-consistency\\\">KMS eventual consistency</a>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To download the public key of an asymmetric KMS key\",\n                        \"documentation\": \"This example gets the public key of an asymmetric RSA KMS key used for encryption and decryption. The operation returns the key spec, key usage, and encryption or signing algorithms to help you use the public key correctly outside of AWS KMS.\",\n                        \"input\": {\n                            \"KeyId\": \"arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321\"\n                        },\n                        \"output\": {\n                            \"KeyId\": \"arn:aws:kms:us-west-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321\",\n                            \"PublicKey\": \"<binary data>\",\n                            \"CustomerMasterKeySpec\": \"RSA_4096\",\n                            \"KeyUsage\": \"ENCRYPT_DECRYPT\",\n                            \"EncryptionAlgorithms\": [\n                                \"RSAES_OAEP_SHA_1\",\n                                \"RSAES_OAEP_SHA_256\"\n                            ]\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.kms#GetPublicKeyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"KeyId\": {\n                    \"target\": \"com.amazonaws.kms#KeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Identifies the asymmetric KMS key that includes the public key.</p>\\n         <p>To specify a KMS key, use its key ID, key ARN, alias name, or alias ARN. When using an alias name, prefix it with <code>\\\"alias/\\\"</code>. To specify a KMS key in a different Amazon Web Services account, you must use the key ARN or alias ARN.</p>\\n         <p>For example:</p>\\n         <ul>\\n            <li>\\n               <p>Key ID: <code>1234abcd-12ab-34cd-56ef-1234567890ab</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Key ARN: <code>arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Alias name: <code>alias/ExampleAlias</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Alias ARN: <code>arn:aws:kms:us-east-2:111122223333:alias/ExampleAlias</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>To get the key ID and key ARN for a KMS key, use <a>ListKeys</a> or <a>DescribeKey</a>. To get the alias name and alias ARN, use <a>ListAliases</a>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"GrantTokens\": {\n                    \"target\": \"com.amazonaws.kms#GrantTokenList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of grant tokens.</p>\\n         <p>Use a grant token when your permission to call this operation comes from a new grant that has not yet achieved <i>eventual consistency</i>. For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/grants.html#grant_token\\\">Grant token</a> and <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/using-grant-token.html\\\">Using a grant token</a> in the\\n    <i>Key Management Service Developer Guide</i>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.kms#GetPublicKeyResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"KeyId\": {\n                    \"target\": \"com.amazonaws.kms#KeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (<a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-id-key-ARN\\\">key ARN</a>) of the asymmetric KMS key from which the public key was\\n      downloaded.</p>\"\n                    }\n                },\n                \"PublicKey\": {\n                    \"target\": \"com.amazonaws.kms#PublicKeyType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The exported public key. </p>\\n         <p>The value is a DER-encoded X.509 public key, also known as\\n        <code>SubjectPublicKeyInfo</code> (SPKI), as defined in <a href=\\\"https://tools.ietf.org/html/rfc5280\\\">RFC 5280</a>. When you use the HTTP API or the Amazon Web Services CLI, the value is Base64-encoded. Otherwise, it is not Base64-encoded.</p>\\n         <p></p>\"\n                    }\n                },\n                \"CustomerMasterKeySpec\": {\n                    \"target\": \"com.amazonaws.kms#CustomerMasterKeySpec\",\n                    \"traits\": {\n                        \"smithy.api#deprecated\": {\n                            \"message\": \"This field has been deprecated. Instead, use the KeySpec field.\"\n                        },\n                        \"smithy.api#documentation\": \"<p>Instead, use the <code>KeySpec</code> field in the <code>GetPublicKey</code>\\n      response.</p>\\n         <p>The <code>KeySpec</code> and <code>CustomerMasterKeySpec</code> fields have the same\\n      value. We recommend that you use the <code>KeySpec</code> field in your code. However, to\\n      avoid breaking changes, KMS supports both fields.</p>\"\n                    }\n                },\n                \"KeySpec\": {\n                    \"target\": \"com.amazonaws.kms#KeySpec\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of the of the public key that was downloaded.</p>\"\n                    }\n                },\n                \"KeyUsage\": {\n                    \"target\": \"com.amazonaws.kms#KeyUsageType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The permitted use of the public key. Valid values for asymmetric key pairs are\\n        <code>ENCRYPT_DECRYPT</code>, <code>SIGN_VERIFY</code>, and <code>KEY_AGREEMENT</code>. </p>\\n         <p>This information is critical. For example, if a public key with <code>SIGN_VERIFY</code>\\n      key usage encrypts data outside of KMS, the ciphertext cannot be decrypted. </p>\"\n                    }\n                },\n                \"EncryptionAlgorithms\": {\n                    \"target\": \"com.amazonaws.kms#EncryptionAlgorithmSpecList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The encryption algorithms that KMS supports for this key. </p>\\n         <p>This information is critical. If a public key encrypts data outside of KMS by using an\\n      unsupported encryption algorithm, the ciphertext cannot be decrypted. </p>\\n         <p>This field appears in the response only when the <code>KeyUsage</code> of the public key\\n      is <code>ENCRYPT_DECRYPT</code>.</p>\"\n                    }\n                },\n                \"SigningAlgorithms\": {\n                    \"target\": \"com.amazonaws.kms#SigningAlgorithmSpecList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The signing algorithms that KMS supports for this key.</p>\\n         <p>This field appears in the response only when the <code>KeyUsage</code> of the public key\\n      is <code>SIGN_VERIFY</code>.</p>\"\n                    }\n                },\n                \"KeyAgreementAlgorithms\": {\n                    \"target\": \"com.amazonaws.kms#KeyAgreementAlgorithmSpecList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The key agreement algorithm used to derive a shared secret. This field is present only\\n      when the KMS key has a <code>KeyUsage</code> value of <code>KEY_AGREEMENT</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.kms#GrantConstraints\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"EncryptionContextSubset\": {\n                    \"target\": \"com.amazonaws.kms#EncryptionContextType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of key-value pairs that must be included in the encryption context of the\\n      <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/kms-cryptography.html#cryptographic-operations\\\">cryptographic operation</a> request. The grant allows the cryptographic operation only when the encryption\\n      context in the request includes the key-value pairs specified in this constraint, although it\\n      can include additional key-value pairs.</p>\"\n                    }\n                },\n                \"EncryptionContextEquals\": {\n                    \"target\": \"com.amazonaws.kms#EncryptionContextType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of key-value pairs that must match the encryption context in the <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/kms-cryptography.html#cryptographic-operations\\\">cryptographic operation</a>\\n      request. The grant allows the operation only when the encryption context in the request is the\\n      same as the encryption context specified in this constraint.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Use this structure to allow <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/kms-cryptography.html#cryptographic-operations\\\">cryptographic operations</a> in the grant only when the operation request\\n      includes the specified <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/encrypt_context.html\\\">encryption context</a>. </p>\\n         <p>KMS applies the grant constraints only to cryptographic operations that support an\\n      encryption context, that is, all cryptographic operations with a symmetric KMS key. Grant\\n      constraints are not applied to operations that do not support an encryption context, such as\\n      cryptographic operations with asymmetric KMS keys and management operations, such as <a>DescribeKey</a> or <a>RetireGrant</a>.</p>\\n         <important>\\n            <p>In a cryptographic operation, the encryption context in the decryption operation must be\\n        an exact, case-sensitive match for the keys and values in the encryption context of the\\n        encryption operation. Only the order of the pairs can vary.</p>\\n            <p>However, in a grant constraint, the key in each key-value pair is not case sensitive,\\n        but the value is case sensitive.</p>\\n            <p>To avoid confusion, do not use multiple encryption context pairs that differ only by\\n        case. To require a fully case-sensitive encryption context, use the\\n          <code>kms:EncryptionContext:</code> and <code>kms:EncryptionContextKeys</code> conditions\\n        in an IAM or key policy. For details, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/conditions-kms.html#conditions-kms-encryption-context\\\">kms:EncryptionContext:context-key</a> in the\\n        <i>\\n                  <i>Key Management Service Developer Guide</i>\\n               </i>.</p>\\n         </important>\"\n            }\n        },\n        \"com.amazonaws.kms#GrantIdType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 128\n                }\n            }\n        },\n        \"com.amazonaws.kms#GrantList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.kms#GrantListEntry\"\n            }\n        },\n        \"com.amazonaws.kms#GrantListEntry\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"KeyId\": {\n                    \"target\": \"com.amazonaws.kms#KeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The unique identifier for the KMS key to which the grant applies.</p>\"\n                    }\n                },\n                \"GrantId\": {\n                    \"target\": \"com.amazonaws.kms#GrantIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The unique identifier for the grant.</p>\"\n                    }\n                },\n                \"Name\": {\n                    \"target\": \"com.amazonaws.kms#GrantNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The friendly name that identifies the grant. If a name was provided in the <a>CreateGrant</a> request, that name is returned. Otherwise this value is null.</p>\"\n                    }\n                },\n                \"CreationDate\": {\n                    \"target\": \"com.amazonaws.kms#DateType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time when the grant was created.</p>\"\n                    }\n                },\n                \"GranteePrincipal\": {\n                    \"target\": \"com.amazonaws.kms#PrincipalIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The identity that gets the permissions in the grant.</p>\\n         <p>The <code>GranteePrincipal</code> field in the <code>ListGrants</code> response usually contains the\\n        user or role designated as the grantee principal in the grant. However, when the grantee\\n        principal in the grant is an Amazon Web Services service, the <code>GranteePrincipal</code> field contains\\n        the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_principal.html#principal-services\\\">service\\n          principal</a>, which might represent several different grantee principals.</p>\"\n                    }\n                },\n                \"RetiringPrincipal\": {\n                    \"target\": \"com.amazonaws.kms#PrincipalIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The principal that can retire the grant.</p>\"\n                    }\n                },\n                \"IssuingAccount\": {\n                    \"target\": \"com.amazonaws.kms#PrincipalIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account under which the grant was issued.</p>\"\n                    }\n                },\n                \"Operations\": {\n                    \"target\": \"com.amazonaws.kms#GrantOperationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The list of operations permitted by the grant.</p>\"\n                    }\n                },\n                \"Constraints\": {\n                    \"target\": \"com.amazonaws.kms#GrantConstraints\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of key-value pairs that must be present in the encryption context of certain\\n      subsequent operations that the grant allows.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains information about a grant.</p>\"\n            }\n        },\n        \"com.amazonaws.kms#GrantNameType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 256\n                },\n                \"smithy.api#pattern\": \"^[a-zA-Z0-9:/_-]+$\"\n            }\n        },\n        \"com.amazonaws.kms#GrantOperation\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"Decrypt\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Decrypt\"\n                    }\n                },\n                \"Encrypt\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Encrypt\"\n                    }\n                },\n                \"GenerateDataKey\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"GenerateDataKey\"\n                    }\n                },\n                \"GenerateDataKeyWithoutPlaintext\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"GenerateDataKeyWithoutPlaintext\"\n                    }\n                },\n                \"ReEncryptFrom\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ReEncryptFrom\"\n                    }\n                },\n                \"ReEncryptTo\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ReEncryptTo\"\n                    }\n                },\n                \"Sign\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Sign\"\n                    }\n                },\n                \"Verify\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Verify\"\n                    }\n                },\n                \"GetPublicKey\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"GetPublicKey\"\n                    }\n                },\n                \"CreateGrant\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"CreateGrant\"\n                    }\n                },\n                \"RetireGrant\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"RetireGrant\"\n                    }\n                },\n                \"DescribeKey\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DescribeKey\"\n                    }\n                },\n                \"GenerateDataKeyPair\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"GenerateDataKeyPair\"\n                    }\n                },\n                \"GenerateDataKeyPairWithoutPlaintext\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"GenerateDataKeyPairWithoutPlaintext\"\n                    }\n                },\n                \"GenerateMac\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"GenerateMac\"\n                    }\n                },\n                \"VerifyMac\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"VerifyMac\"\n                    }\n                },\n                \"DeriveSharedSecret\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DeriveSharedSecret\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.kms#GrantOperationList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.kms#GrantOperation\"\n            }\n        },\n        \"com.amazonaws.kms#GrantTokenList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.kms#GrantTokenType\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 10\n                }\n            }\n        },\n        \"com.amazonaws.kms#GrantTokenType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 8192\n                }\n            }\n        },\n        \"com.amazonaws.kms#ImportKeyMaterial\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.kms#ImportKeyMaterialRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.kms#ImportKeyMaterialResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.kms#DependencyTimeoutException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#ExpiredImportTokenException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#IncorrectKeyMaterialException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#InvalidArnException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#InvalidCiphertextException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#InvalidImportTokenException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInternalException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInvalidStateException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#NotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#UnsupportedOperationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Imports or reimports key material into an existing KMS key that was created without key\\n      material. You can also use this operation to set or update the expiration model and expiration\\n      date of the imported key material.</p>\\n         <p>By default, KMS creates KMS keys with key material that it generates. You can also\\n      generate and import your own key material. For more information about importing key material,\\n      see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/importing-keys.html\\\">Importing key\\n        material</a>.</p>\\n         <p>For asymmetric, HMAC and multi-Region keys, you cannot change the key material after the\\n      initial import. You can import multiple key materials into single-Region, symmetric encryption\\n      keys and rotate the key material on demand using <code>RotateKeyOnDemand</code>.</p>\\n         <p>After you import key material, you can <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/importing-keys-import-key-material.html#reimport-key-material\\\">reimport\\n        the same key material</a> into that KMS key or, if the key supports on-demand rotation,\\n      import new key material. You can use the <code>ImportType</code> parameter to indicate whether\\n      you are importing new key material or re-importing previously imported key material. You might\\n      reimport key material to replace key material that expired or key material that you deleted.\\n      You might also reimport key material to change the expiration model or expiration date of the\\n      key material.</p>\\n         <p>Each time you import key material into KMS, you can determine whether\\n        (<code>ExpirationModel</code>) and when (<code>ValidTo</code>) the key material expires. To\\n      change the expiration of your key material, you must import it again, either by calling\\n        <code>ImportKeyMaterial</code> or using the <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/importing-keys-import-key-material.html#importing-keys-import-key-material-console\\\">import features</a> of the KMS console.</p>\\n         <p>Before you call <code>ImportKeyMaterial</code>, complete these steps:</p>\\n         <ul>\\n            <li>\\n               <p>Create or identify a KMS key with <code>EXTERNAL</code> origin, which indicates that\\n          the KMS key is designed for imported key material. </p>\\n               <p>To create a new KMS key for imported key material, call the <a>CreateKey</a> operation with an <code>Origin</code> value of <code>EXTERNAL</code>. You can create a\\n          symmetric encryption KMS key, HMAC KMS key, asymmetric encryption KMS key, asymmetric key\\n          agreement key, or asymmetric signing KMS key. You can also import key material into a\\n            <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/multi-region-keys-overview.html\\\">multi-Region key</a> of any supported type. However, you can't import key material\\n          into a KMS key in a <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/key-store-overview.html\\\">custom key store</a>.</p>\\n            </li>\\n            <li>\\n               <p>Call the <a>GetParametersForImport</a> operation to get a public key and\\n          import token set for importing key material. </p>\\n            </li>\\n            <li>\\n               <p>Use the public key in the <a>GetParametersForImport</a> response to encrypt\\n          your key material.</p>\\n            </li>\\n         </ul>\\n         <p> Then, in an <code>ImportKeyMaterial</code> request, you submit your encrypted key\\n      material and import token. When calling this operation, you must specify the following\\n      values:</p>\\n         <ul>\\n            <li>\\n               <p>The key ID or key ARN of the KMS key to associate with the imported key material. Its\\n            <code>Origin</code> must be <code>EXTERNAL</code> and its <code>KeyState</code> must be\\n            <code>PendingImport</code>. You cannot perform this operation on a KMS key in a\\n          <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/key-store-overview.html\\\">custom key store</a>, or on a KMS key in a different Amazon Web Services account. To get the\\n            <code>Origin</code> and <code>KeyState</code> of a KMS key, call <a>DescribeKey</a>.</p>\\n            </li>\\n            <li>\\n               <p>The encrypted key material. </p>\\n            </li>\\n            <li>\\n               <p>The import token that <a>GetParametersForImport</a> returned. You must use\\n          a public key and token from the same <code>GetParametersForImport</code> response.</p>\\n            </li>\\n            <li>\\n               <p>Whether the key material expires (<code>ExpirationModel</code>) and, if so, when\\n            (<code>ValidTo</code>). For help with this choice, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/importing-keys-import-key-material.html#importing-keys-expiration\\\">Setting an expiration time</a> in the <i>Key Management Service Developer Guide</i>.</p>\\n               <p>If you set an expiration date, KMS deletes the key material from the KMS key on the\\n          specified date, making the KMS key unusable. To use the KMS key in cryptographic\\n          operations again, you must reimport the same key material. However, you can delete and\\n          reimport the key material at any time, including before the key material expires. Each\\n          time you reimport, you can eliminate or reset the expiration time.</p>\\n            </li>\\n         </ul>\\n         <p>When this operation is successful, the key state of the KMS key changes from\\n        <code>PendingImport</code> to <code>Enabled</code>, and you can use the KMS key in\\n      cryptographic operations. For single-Region, symmetric encryption keys, you will need to\\n      import all of the key materials associated with the KMS key to change its state to\\n        <code>Enabled</code>. Use the <code>ListKeyRotations</code> operation to list the ID and\\n      import state of each key material associated with a KMS key.</p>\\n         <p>If this operation fails, use the exception to help determine the problem. If the error is\\n      related to the key material, the import token, or wrapping key, use <a>GetParametersForImport</a> to get a new public key and import token for the KMS key\\n      and repeat the import procedure. For help, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/importing-keys-conceptual.html\\\">Create a KMS key with imported key\\n        material</a> in the <i>Key Management Service Developer Guide</i>.</p>\\n         <p>The KMS key that you use for this operation must be in a compatible key state. For\\ndetails, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/key-state.html\\\">Key states of KMS keys</a> in the <i>Key Management Service Developer Guide</i>.</p>\\n         <p>\\n            <b>Cross-account use</b>: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.</p>\\n         <p>\\n            <b>Required permissions</b>: <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/kms-api-permissions-reference.html\\\">kms:ImportKeyMaterial</a> (key policy)</p>\\n         <p>\\n            <b>Related operations:</b>\\n         </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a>DeleteImportedKeyMaterial</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>GetParametersForImport</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>ListKeyRotations</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>RotateKeyOnDemand</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>\\n            <b>Eventual consistency</b>: The KMS API follows an eventual consistency model. \\n  For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/accessing-kms.html#programming-eventual-consistency\\\">KMS eventual consistency</a>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To import key material into a KMS key\",\n                        \"documentation\": \"The following example imports key material into the specified KMS key.\",\n                        \"input\": {\n                            \"KeyId\": \"1234abcd-12ab-34cd-56ef-1234567890ab\",\n                            \"ImportToken\": \"<binary data>\",\n                            \"EncryptedKeyMaterial\": \"<binary data>\",\n                            \"ExpirationModel\": \"KEY_MATERIAL_DOES_NOT_EXPIRE\"\n                        },\n                        \"output\": {\n                            \"KeyId\": \"arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab\",\n                            \"KeyMaterialId\": \"0b7fd7ddbac6eef27907413567cad8c810e2883dc8a7534067a82ee1142fc1e6\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.kms#ImportKeyMaterialRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"KeyId\": {\n                    \"target\": \"com.amazonaws.kms#KeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The identifier of the KMS key that will be associated with the imported key material. This\\n      must be the same KMS key specified in the <code>KeyID</code> parameter of the corresponding\\n        <a>GetParametersForImport</a> request. The <code>Origin</code> of the KMS key\\n      must be <code>EXTERNAL</code> and its <code>KeyState</code> must be\\n      <code>PendingImport</code>. </p>\\n         <p>The KMS key can be a symmetric encryption KMS key, HMAC KMS key, asymmetric encryption KMS\\n      key, or asymmetric signing KMS key, including a <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/multi-region-keys-overview.html\\\">multi-Region key</a> of any supported\\n      type. You cannot perform this operation on a KMS key in a custom key store, or on a KMS key in\\n      a different Amazon Web Services account.</p>\\n         <p>Specify the key ID or key ARN of the KMS key.</p>\\n         <p>For example:</p>\\n         <ul>\\n            <li>\\n               <p>Key ID: <code>1234abcd-12ab-34cd-56ef-1234567890ab</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Key ARN: <code>arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>To get the key ID and key ARN for a KMS key, use <a>ListKeys</a> or <a>DescribeKey</a>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ImportToken\": {\n                    \"target\": \"com.amazonaws.kms#CiphertextType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The import token that you received in the response to a previous <a>GetParametersForImport</a> request. It must be from the same response that contained\\n      the public key that you used to encrypt the key material.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"EncryptedKeyMaterial\": {\n                    \"target\": \"com.amazonaws.kms#CiphertextType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The encrypted key material to import. The key material must be encrypted under the public\\n      wrapping key that <a>GetParametersForImport</a> returned, using the wrapping\\n      algorithm that you specified in the same <code>GetParametersForImport</code> request.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ValidTo\": {\n                    \"target\": \"com.amazonaws.kms#DateType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time when the imported key material expires. This parameter is required when\\n      the value of the <code>ExpirationModel</code> parameter is <code>KEY_MATERIAL_EXPIRES</code>.\\n      Otherwise it is not valid.</p>\\n         <p>The value of this parameter must be a future date and time. The maximum value is 365 days\\n      from the request date.</p>\\n         <p>When the key material expires, KMS deletes the key material from the KMS key. Without\\n      its key material, the KMS key is unusable. To use the KMS key in cryptographic operations, you\\n      must reimport the same key material.</p>\\n         <p>You cannot change the <code>ExpirationModel</code> or <code>ValidTo</code> values for the\\n      current import after the request completes. To change either value, you must delete (<a>DeleteImportedKeyMaterial</a>) and reimport the key material.</p>\"\n                    }\n                },\n                \"ExpirationModel\": {\n                    \"target\": \"com.amazonaws.kms#ExpirationModelType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies whether the key material expires. The default is\\n        <code>KEY_MATERIAL_EXPIRES</code>. For help with this choice, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/importing-keys-import-key-material.html#importing-keys-expiration\\\">Setting\\n        an expiration time</a> in the <i>Key Management Service Developer Guide</i>.</p>\\n         <p>When the value of <code>ExpirationModel</code> is <code>KEY_MATERIAL_EXPIRES</code>, you\\n      must specify a value for the <code>ValidTo</code> parameter. When value is\\n        <code>KEY_MATERIAL_DOES_NOT_EXPIRE</code>, you must omit the <code>ValidTo</code>\\n      parameter.</p>\\n         <p>You cannot change the <code>ExpirationModel</code> or <code>ValidTo</code> values for the\\n      current import after the request completes. To change either value, you must reimport the key\\n      material.</p>\"\n                    }\n                },\n                \"ImportType\": {\n                    \"target\": \"com.amazonaws.kms#ImportType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether the key material being imported is previously associated with this KMS\\n      key or not. This parameter is optional and only usable with symmetric encryption keys. If no\\n      key material has ever been imported into the KMS key, and this parameter is omitted, the\\n      parameter defaults to <code>NEW_KEY_MATERIAL</code>. After the first key material is imported,\\n      if this parameter is omitted then the parameter defaults to\\n      <code>EXISTING_KEY_MATERIAL</code>.</p>\"\n                    }\n                },\n                \"KeyMaterialDescription\": {\n                    \"target\": \"com.amazonaws.kms#KeyMaterialDescriptionType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Description for the key material being imported. This parameter is optional and only\\n      usable with symmetric encryption keys. If you do not specify a key material description, KMS\\n      retains the value you specified when you last imported the same key material into this KMS\\n      key.</p>\"\n                    }\n                },\n                \"KeyMaterialId\": {\n                    \"target\": \"com.amazonaws.kms#BackingKeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Identifies the key material being imported. This parameter is optional and only usable\\n      with symmetric encryption keys. You cannot specify a key material ID with\\n        <code>ImportType</code> set to <code>NEW_KEY_MATERIAL</code>. Whenever you import key\\n      material into a symmetric encryption key, KMS assigns a unique identifier to the key\\n      material based on the KMS key ID and the imported key material. When you re-import key\\n      material with a specified key material ID, KMS:</p>\\n         <ul>\\n            <li>\\n               <p>Computes the identifier for the key material</p>\\n            </li>\\n            <li>\\n               <p>Matches the computed identifier against the specified key material ID</p>\\n            </li>\\n            <li>\\n               <p>Verifies that the key material ID is already associated with the KMS key</p>\\n            </li>\\n         </ul>\\n         <p>To get the list of key material IDs associated with a KMS key, use <a>ListKeyRotations</a>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.kms#ImportKeyMaterialResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"KeyId\": {\n                    \"target\": \"com.amazonaws.kms#KeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (<a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-id-key-ARN\\\">key ARN</a>) of the KMS key into which key material was imported.</p>\"\n                    }\n                },\n                \"KeyMaterialId\": {\n                    \"target\": \"com.amazonaws.kms#BackingKeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Identifies the imported key material.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.kms#ImportState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"IMPORTED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"IMPORTED\"\n                    }\n                },\n                \"PENDING_IMPORT\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"PENDING_IMPORT\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.kms#ImportType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"NEW_KEY_MATERIAL\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"NEW_KEY_MATERIAL\"\n                    }\n                },\n                \"EXISTING_KEY_MATERIAL\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"EXISTING_KEY_MATERIAL\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.kms#IncludeKeyMaterial\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ALL_KEY_MATERIAL\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ALL_KEY_MATERIAL\"\n                    }\n                },\n                \"ROTATIONS_ONLY\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ROTATIONS_ONLY\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.kms#IncorrectKeyException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.kms#ErrorMessageType\"\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"IncorrectKeyException\",\n                    \"httpResponseCode\": 400\n                },\n                \"smithy.api#documentation\": \"<p>The request was rejected because the specified KMS key cannot decrypt the data. The\\n        <code>KeyId</code> in a <a>Decrypt</a> request and the <code>SourceKeyId</code>\\n      in a <a>ReEncrypt</a> request must identify the same KMS key that was used to\\n      encrypt the ciphertext.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.kms#IncorrectKeyMaterialException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.kms#ErrorMessageType\"\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"IncorrectKeyMaterialException\",\n                    \"httpResponseCode\": 400\n                },\n                \"smithy.api#documentation\": \"<p>The request was rejected because the key material in the request is, expired, invalid, or\\n      does not meet expectations. For example, it is not the same key material that was previously\\n      imported or KMS expected new key material but the key material being imported is already\\n      associated with the KMS key.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.kms#IncorrectTrustAnchorException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.kms#ErrorMessageType\"\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"IncorrectTrustAnchorException\",\n                    \"httpResponseCode\": 400\n                },\n                \"smithy.api#documentation\": \"<p>The request was rejected because the trust anchor certificate in the request to create an\\n      CloudHSM key store is not the trust anchor certificate for the specified CloudHSM cluster.</p>\\n         <p>When you <a href=\\\"https://docs.aws.amazon.com/cloudhsm/latest/userguide/initialize-cluster.html#sign-csr\\\">initialize the CloudHSM cluster</a>, you create the trust anchor certificate and save it\\n      in the <code>customerCA.crt</code> file.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.kms#InvalidAliasNameException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.kms#ErrorMessageType\"\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"InvalidAliasName\",\n                    \"httpResponseCode\": 400\n                },\n                \"smithy.api#documentation\": \"<p>The request was rejected because the specified alias name is not valid.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.kms#InvalidArnException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.kms#ErrorMessageType\"\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"InvalidArn\",\n                    \"httpResponseCode\": 400\n                },\n                \"smithy.api#documentation\": \"<p>The request was rejected because a specified ARN, or an ARN in a key policy, is not\\n      valid.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.kms#InvalidCiphertextException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.kms#ErrorMessageType\"\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"InvalidCiphertext\",\n                    \"httpResponseCode\": 400\n                },\n                \"smithy.api#documentation\": \"<p>From the <a>Decrypt</a> or <a>ReEncrypt</a> operation, the request\\n      was rejected because the specified ciphertext, or additional authenticated data incorporated\\n      into the ciphertext, such as the encryption context, is corrupted, missing, or otherwise\\n      invalid.</p>\\n         <p>From the <a>ImportKeyMaterial</a> operation, the request was rejected because\\n      KMS could not decrypt the encrypted (wrapped) key material. </p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.kms#InvalidGrantIdException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.kms#ErrorMessageType\"\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"InvalidGrantId\",\n                    \"httpResponseCode\": 400\n                },\n                \"smithy.api#documentation\": \"<p>The request was rejected because the specified <code>GrantId</code> is not valid.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.kms#InvalidGrantTokenException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.kms#ErrorMessageType\"\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"InvalidGrantToken\",\n                    \"httpResponseCode\": 400\n                },\n                \"smithy.api#documentation\": \"<p>The request was rejected because the specified grant token is not valid.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.kms#InvalidImportTokenException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.kms#ErrorMessageType\"\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"InvalidImportTokenException\",\n                    \"httpResponseCode\": 400\n                },\n                \"smithy.api#documentation\": \"<p>The request was rejected because the provided import token is invalid or is associated\\n      with a different KMS key.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.kms#InvalidKeyUsageException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.kms#ErrorMessageType\"\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"InvalidKeyUsage\",\n                    \"httpResponseCode\": 400\n                },\n                \"smithy.api#documentation\": \"<p>The request was rejected for one of the following reasons: </p>\\n         <ul>\\n            <li>\\n               <p>The <code>KeyUsage</code> value of the KMS key is incompatible with the API\\n          operation.</p>\\n            </li>\\n            <li>\\n               <p>The encryption algorithm or signing algorithm specified for the operation is\\n          incompatible with the type of key material in the KMS key <code>(KeySpec</code>).</p>\\n            </li>\\n         </ul>\\n         <p>For encrypting, decrypting, re-encrypting, and generating data keys, the\\n        <code>KeyUsage</code> must be <code>ENCRYPT_DECRYPT</code>. For signing and verifying\\n      messages, the <code>KeyUsage</code> must be <code>SIGN_VERIFY</code>. For generating and\\n      verifying message authentication codes (MACs), the <code>KeyUsage</code> must be\\n        <code>GENERATE_VERIFY_MAC</code>. For deriving key agreement secrets, the\\n        <code>KeyUsage</code> must be <code>KEY_AGREEMENT</code>. To find the <code>KeyUsage</code>\\n      of a KMS key, use the <a>DescribeKey</a> operation.</p>\\n         <p>To find the encryption or signing algorithms supported for a particular KMS key, use the\\n        <a>DescribeKey</a> operation.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.kms#InvalidMarkerException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.kms#ErrorMessageType\"\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"InvalidMarker\",\n                    \"httpResponseCode\": 400\n                },\n                \"smithy.api#documentation\": \"<p>The request was rejected because the marker that specifies where pagination should next\\n      begin is not valid.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.kms#KMSInternalException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.kms#ErrorMessageType\"\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"KMSInternal\",\n                    \"httpResponseCode\": 500\n                },\n                \"smithy.api#documentation\": \"<p>The request was rejected because an internal exception occurred. The request can be\\n      retried.</p>\",\n                \"smithy.api#error\": \"server\",\n                \"smithy.api#httpError\": 500\n            }\n        },\n        \"com.amazonaws.kms#KMSInvalidMacException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.kms#ErrorMessageType\"\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"KMSInvalidMac\",\n                    \"httpResponseCode\": 400\n                },\n                \"smithy.api#documentation\": \"<p>The request was rejected because the HMAC verification failed. HMAC verification fails\\n      when the HMAC computed by using the specified message, HMAC KMS key, and MAC algorithm does\\n      not match the HMAC specified in the request.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.kms#KMSInvalidSignatureException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.kms#ErrorMessageType\"\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"KMSInvalidSignature\",\n                    \"httpResponseCode\": 400\n                },\n                \"smithy.api#documentation\": \"<p>The request was rejected because the signature verification failed. Signature verification\\n      fails when it cannot confirm that signature was produced by signing the specified message with\\n      the specified KMS key and signing algorithm.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.kms#KMSInvalidStateException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.kms#ErrorMessageType\"\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"KMSInvalidStateException\",\n                    \"httpResponseCode\": 409\n                },\n                \"smithy.api#documentation\": \"<p>The request was rejected because the state of the specified resource is not valid for this\\n      request.</p>\\n         <p>This exceptions means one of the following:</p>\\n         <ul>\\n            <li>\\n               <p>The key state of the KMS key is not compatible with the operation. </p>\\n               <p>To find the key state, use the <a>DescribeKey</a> operation. For more\\n          information about which key states are compatible with each KMS operation, see\\n          <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/key-state.html\\\">Key states of KMS keys</a> in the <i>\\n                     <i>Key Management Service Developer Guide</i>\\n                  </i>.</p>\\n            </li>\\n            <li>\\n               <p>For cryptographic operations on KMS keys in custom key stores, this exception\\n          represents a general failure with many possible causes. To identify the cause, see the\\n          error message that accompanies the exception.</p>\\n            </li>\\n         </ul>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 409\n            }\n        },\n        \"com.amazonaws.kms#KeyAgreementAlgorithmSpec\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ECDH\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ECDH\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.kms#KeyAgreementAlgorithmSpecList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.kms#KeyAgreementAlgorithmSpec\"\n            }\n        },\n        \"com.amazonaws.kms#KeyEncryptionMechanism\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"RSAES_OAEP_SHA_256\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"RSAES_OAEP_SHA_256\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.kms#KeyIdType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 2048\n                }\n            }\n        },\n        \"com.amazonaws.kms#KeyList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.kms#KeyListEntry\"\n            }\n        },\n        \"com.amazonaws.kms#KeyListEntry\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"KeyId\": {\n                    \"target\": \"com.amazonaws.kms#KeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Unique identifier of the key.</p>\"\n                    }\n                },\n                \"KeyArn\": {\n                    \"target\": \"com.amazonaws.kms#ArnType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>ARN of the key.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains information about each entry in the key list.</p>\"\n            }\n        },\n        \"com.amazonaws.kms#KeyManagerType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"AWS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS\"\n                    }\n                },\n                \"CUSTOMER\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"CUSTOMER\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.kms#KeyMaterialDescriptionType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 256\n                },\n                \"smithy.api#pattern\": \"^[a-zA-Z0-9:/_\\\\s.-]+$\"\n            }\n        },\n        \"com.amazonaws.kms#KeyMaterialState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"NON_CURRENT\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"NON_CURRENT\"\n                    }\n                },\n                \"CURRENT\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"CURRENT\"\n                    }\n                },\n                \"PENDING_ROTATION\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"PENDING_ROTATION\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.kms#KeyMetadata\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AWSAccountId\": {\n                    \"target\": \"com.amazonaws.kms#AWSAccountIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The twelve-digit account ID of the Amazon Web Services account that owns the KMS key.</p>\"\n                    }\n                },\n                \"KeyId\": {\n                    \"target\": \"com.amazonaws.kms#KeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The globally unique identifier for the KMS key.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Arn\": {\n                    \"target\": \"com.amazonaws.kms#ArnType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the KMS key. For examples, see <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html#arn-syntax-kms\\\">Key Management Service (KMS)</a> in the Example ARNs section of the <i>Amazon Web Services General\\n        Reference</i>.</p>\"\n                    }\n                },\n                \"CreationDate\": {\n                    \"target\": \"com.amazonaws.kms#DateType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time when the KMS key was created.</p>\"\n                    }\n                },\n                \"Enabled\": {\n                    \"target\": \"com.amazonaws.kms#BooleanType\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Specifies whether the KMS key is enabled. When <code>KeyState</code> is\\n        <code>Enabled</code> this value is true, otherwise it is false.</p>\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.kms#DescriptionType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The description of the KMS key.</p>\"\n                    }\n                },\n                \"KeyUsage\": {\n                    \"target\": \"com.amazonaws.kms#KeyUsageType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/kms-cryptography.html#cryptographic-operations\\\">cryptographic operations</a> for which you can use the KMS key.</p>\"\n                    }\n                },\n                \"KeyState\": {\n                    \"target\": \"com.amazonaws.kms#KeyState\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The current status of the KMS key.</p>\\n         <p>For more information about how key state affects the use of a KMS key, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/key-state.html\\\">Key states of KMS keys</a> in\\n      the <i>Key Management Service Developer Guide</i>.</p>\"\n                    }\n                },\n                \"DeletionDate\": {\n                    \"target\": \"com.amazonaws.kms#DateType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time after which KMS deletes this KMS key. This value is present only when\\n      the KMS key is scheduled for deletion, that is, when its <code>KeyState</code> is\\n        <code>PendingDeletion</code>.</p>\\n         <p>When the primary key in a multi-Region key is scheduled for deletion but still has replica\\n      keys, its key state is <code>PendingReplicaDeletion</code> and the length of its waiting\\n      period is displayed in the <code>PendingDeletionWindowInDays</code> field.</p>\"\n                    }\n                },\n                \"ValidTo\": {\n                    \"target\": \"com.amazonaws.kms#DateType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The earliest time at which any imported key material permanently associated with this KMS\\n      key expires. When a key material expires, KMS deletes the key material and the KMS key\\n      becomes unusable. This value is present only for KMS keys whose <code>Origin</code> is\\n        <code>EXTERNAL</code> and the <code>ExpirationModel</code> is\\n        <code>KEY_MATERIAL_EXPIRES</code>, otherwise this value is omitted.</p>\"\n                    }\n                },\n                \"Origin\": {\n                    \"target\": \"com.amazonaws.kms#OriginType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The source of the key material for the KMS key. When this value is <code>AWS_KMS</code>,\\n      KMS created the key material. When this value is <code>EXTERNAL</code>, the key material was\\n      imported or the KMS key doesn't have any key material. When this value is\\n        <code>AWS_CLOUDHSM</code>, the key material was created in the CloudHSM cluster associated with\\n      a custom key store.</p>\"\n                    }\n                },\n                \"CustomKeyStoreId\": {\n                    \"target\": \"com.amazonaws.kms#CustomKeyStoreIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A unique identifier for the <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/key-store-overview.html\\\">custom key store</a> that contains the KMS key. This field is\\n      present only when the KMS key is created in a custom key store.</p>\"\n                    }\n                },\n                \"CloudHsmClusterId\": {\n                    \"target\": \"com.amazonaws.kms#CloudHsmClusterIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The cluster ID of the CloudHSM cluster that contains the key material for the KMS key. When\\n      you create a KMS key in an CloudHSM <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/key-store-overview.html\\\">custom key store</a>, KMS creates the key material for the KMS\\n      key in the associated CloudHSM cluster. This field is present only when the KMS key is created in\\n      an CloudHSM key store.</p>\"\n                    }\n                },\n                \"ExpirationModel\": {\n                    \"target\": \"com.amazonaws.kms#ExpirationModelType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies whether the KMS key's key material expires. This value is present only when\\n        <code>Origin</code> is <code>EXTERNAL</code>, otherwise this value is omitted.</p>\"\n                    }\n                },\n                \"KeyManager\": {\n                    \"target\": \"com.amazonaws.kms#KeyManagerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The manager of the KMS key. KMS keys in your Amazon Web Services account are either customer managed or\\n      Amazon Web Services managed. For more information about the difference, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#kms_keys\\\">KMS keys</a> in the <i>Key Management Service Developer Guide</i>.</p>\"\n                    }\n                },\n                \"CustomerMasterKeySpec\": {\n                    \"target\": \"com.amazonaws.kms#CustomerMasterKeySpec\",\n                    \"traits\": {\n                        \"smithy.api#deprecated\": {\n                            \"message\": \"This field has been deprecated. Instead, use the KeySpec field.\"\n                        },\n                        \"smithy.api#documentation\": \"<p>Instead, use the <code>KeySpec</code> field.</p>\\n         <p>The <code>KeySpec</code> and <code>CustomerMasterKeySpec</code> fields have the same\\n      value. We recommend that you use the <code>KeySpec</code> field in your code. However, to\\n      avoid breaking changes, KMS supports both fields.</p>\"\n                    }\n                },\n                \"KeySpec\": {\n                    \"target\": \"com.amazonaws.kms#KeySpec\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Describes the type of key material in the KMS key.</p>\"\n                    }\n                },\n                \"EncryptionAlgorithms\": {\n                    \"target\": \"com.amazonaws.kms#EncryptionAlgorithmSpecList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The encryption algorithms that the KMS key supports. You cannot use the KMS key with other\\n      encryption algorithms within KMS.</p>\\n         <p>This value is present only when the <code>KeyUsage</code> of the KMS key is\\n        <code>ENCRYPT_DECRYPT</code>.</p>\"\n                    }\n                },\n                \"SigningAlgorithms\": {\n                    \"target\": \"com.amazonaws.kms#SigningAlgorithmSpecList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The signing algorithms that the KMS key supports. You cannot use the KMS key with other\\n      signing algorithms within KMS.</p>\\n         <p>This field appears only when the <code>KeyUsage</code> of the KMS key is\\n        <code>SIGN_VERIFY</code>.</p>\"\n                    }\n                },\n                \"KeyAgreementAlgorithms\": {\n                    \"target\": \"com.amazonaws.kms#KeyAgreementAlgorithmSpecList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The key agreement algorithm used to derive a shared secret.</p>\"\n                    }\n                },\n                \"MultiRegion\": {\n                    \"target\": \"com.amazonaws.kms#NullableBooleanType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether the KMS key is a multi-Region (<code>True</code>) or regional\\n        (<code>False</code>) key. This value is <code>True</code> for multi-Region primary and\\n      replica keys and <code>False</code> for regional KMS keys.</p>\\n         <p>For more information about multi-Region keys, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/multi-region-keys-overview.html\\\">Multi-Region keys in KMS</a> in the <i>Key Management Service Developer Guide</i>.</p>\"\n                    }\n                },\n                \"MultiRegionConfiguration\": {\n                    \"target\": \"com.amazonaws.kms#MultiRegionConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Lists the primary and replica keys in same multi-Region key. This field is present only\\n      when the value of the <code>MultiRegion</code> field is <code>True</code>.</p>\\n         <p>For more information about any listed KMS key, use the <a>DescribeKey</a>\\n      operation.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>MultiRegionKeyType</code> indicates whether the KMS key is a\\n            <code>PRIMARY</code> or <code>REPLICA</code> key.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>PrimaryKey</code> displays the key ARN and Region of the primary key. This field\\n          displays the current KMS key if it is the primary key.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ReplicaKeys</code> displays the key ARNs and Regions of all replica keys. This\\n          field includes the current KMS key if it is a replica key.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"PendingDeletionWindowInDays\": {\n                    \"target\": \"com.amazonaws.kms#PendingWindowInDaysType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The waiting period before the primary key in a multi-Region key is deleted. This waiting\\n      period begins when the last of its replica keys is deleted. This value is present only when\\n      the <code>KeyState</code> of the KMS key is <code>PendingReplicaDeletion</code>. That\\n      indicates that the KMS key is the primary key in a multi-Region key, it is scheduled for\\n      deletion, and it still has existing replica keys.</p>\\n         <p>When a single-Region KMS key or a multi-Region replica key is scheduled for deletion, its\\n      deletion date is displayed in the <code>DeletionDate</code> field. However, when the primary\\n      key in a multi-Region key is scheduled for deletion, its waiting period doesn't begin until\\n      all of its replica keys are deleted. This value displays that waiting period. When the last\\n      replica key in the multi-Region key is deleted, the <code>KeyState</code> of the scheduled\\n      primary key changes from <code>PendingReplicaDeletion</code> to <code>PendingDeletion</code>\\n      and the deletion date appears in the <code>DeletionDate</code> field.</p>\"\n                    }\n                },\n                \"MacAlgorithms\": {\n                    \"target\": \"com.amazonaws.kms#MacAlgorithmSpecList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The message authentication code (MAC) algorithm that the HMAC KMS key supports.</p>\\n         <p>This value is present only when the <code>KeyUsage</code> of the KMS key is\\n        <code>GENERATE_VERIFY_MAC</code>.</p>\"\n                    }\n                },\n                \"XksKeyConfiguration\": {\n                    \"target\": \"com.amazonaws.kms#XksKeyConfigurationType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Information about the external key that is associated with a KMS key in an external key\\n      store.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/keystore-external.html#concept-external-key\\\">External key</a> in the\\n      <i>Key Management Service Developer Guide</i>.</p>\"\n                    }\n                },\n                \"CurrentKeyMaterialId\": {\n                    \"target\": \"com.amazonaws.kms#BackingKeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Identifies the current key material. This value is present for symmetric encryption keys\\n      with <code>AWS_KMS</code> origin and single-Region, symmetric encryption keys with\\n        <code>EXTERNAL</code> origin. These KMS keys support automatic or on-demand key rotation and\\n      can have multiple key materials associated with them. KMS uses the current key material for\\n      both encryption and decryption, and the non-current key material for decryption operations\\n      only.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains metadata about a KMS key.</p>\\n         <p>This data type is used as a response element for the <a>CreateKey</a>, <a>DescribeKey</a>, and <a>ReplicateKey</a> operations.</p>\"\n            }\n        },\n        \"com.amazonaws.kms#KeySpec\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"RSA_2048\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"RSA_2048\"\n                    }\n                },\n                \"RSA_3072\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"RSA_3072\"\n                    }\n                },\n                \"RSA_4096\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"RSA_4096\"\n                    }\n                },\n                \"ECC_NIST_P256\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ECC_NIST_P256\"\n                    }\n                },\n                \"ECC_NIST_P384\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ECC_NIST_P384\"\n                    }\n                },\n                \"ECC_NIST_P521\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ECC_NIST_P521\"\n                    }\n                },\n                \"ECC_SECG_P256K1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ECC_SECG_P256K1\"\n                    }\n                },\n                \"SYMMETRIC_DEFAULT\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"SYMMETRIC_DEFAULT\"\n                    }\n                },\n                \"HMAC_224\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"HMAC_224\"\n                    }\n                },\n                \"HMAC_256\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"HMAC_256\"\n                    }\n                },\n                \"HMAC_384\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"HMAC_384\"\n                    }\n                },\n                \"HMAC_512\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"HMAC_512\"\n                    }\n                },\n                \"SM2\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"SM2\"\n                    }\n                },\n                \"ML_DSA_44\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ML_DSA_44\"\n                    }\n                },\n                \"ML_DSA_65\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ML_DSA_65\"\n                    }\n                },\n                \"ML_DSA_87\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ML_DSA_87\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.kms#KeyState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"Creating\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Creating\"\n                    }\n                },\n                \"Enabled\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Enabled\"\n                    }\n                },\n                \"Disabled\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Disabled\"\n                    }\n                },\n                \"PendingDeletion\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"PendingDeletion\"\n                    }\n                },\n                \"PendingImport\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"PendingImport\"\n                    }\n                },\n                \"PendingReplicaDeletion\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"PendingReplicaDeletion\"\n                    }\n                },\n                \"Unavailable\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Unavailable\"\n                    }\n                },\n                \"Updating\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Updating\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.kms#KeyStorePasswordType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 7,\n                    \"max\": 32\n                },\n                \"smithy.api#sensitive\": {}\n            }\n        },\n        \"com.amazonaws.kms#KeyUnavailableException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.kms#ErrorMessageType\"\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"KeyUnavailable\",\n                    \"httpResponseCode\": 500\n                },\n                \"smithy.api#documentation\": \"<p>The request was rejected because the specified KMS key was not available. You can retry\\n      the request.</p>\",\n                \"smithy.api#error\": \"server\",\n                \"smithy.api#httpError\": 500\n            }\n        },\n        \"com.amazonaws.kms#KeyUsageType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"SIGN_VERIFY\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"SIGN_VERIFY\"\n                    }\n                },\n                \"ENCRYPT_DECRYPT\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ENCRYPT_DECRYPT\"\n                    }\n                },\n                \"GENERATE_VERIFY_MAC\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"GENERATE_VERIFY_MAC\"\n                    }\n                },\n                \"KEY_AGREEMENT\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"KEY_AGREEMENT\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.kms#LimitExceededException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.kms#ErrorMessageType\"\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"LimitExceeded\",\n                    \"httpResponseCode\": 400\n                },\n                \"smithy.api#documentation\": \"<p>The request was rejected because a length constraint or quota was exceeded. For more\\n      information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/limits.html\\\">Quotas</a> in\\n      the <i>Key Management Service Developer Guide</i>.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.kms#LimitType\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.kms#ListAliases\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.kms#ListAliasesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.kms#ListAliasesResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.kms#DependencyTimeoutException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#InvalidArnException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#InvalidMarkerException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInternalException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#NotFoundException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Gets a list of aliases in the caller's Amazon Web Services account and region. For more information\\n      about aliases, see <a>CreateAlias</a>.</p>\\n         <p>By default, the <code>ListAliases</code> operation returns all aliases in the account and\\n      region. To get only the aliases associated with a particular KMS key, use the\\n        <code>KeyId</code> parameter.</p>\\n         <p>The <code>ListAliases</code> response can include aliases that you created and associated\\n      with your customer managed keys, and aliases that Amazon Web Services created and associated with Amazon Web Services\\n      managed keys in your account. You can recognize Amazon Web Services aliases because their names have the\\n      format <code>aws/<service-name></code>, such as <code>aws/dynamodb</code>.</p>\\n         <p>The response might also include aliases that have no <code>TargetKeyId</code> field. These\\n      are predefined aliases that Amazon Web Services has created but has not yet associated with a KMS key.\\n      Aliases that Amazon Web Services creates in your account, including predefined aliases, do not count against\\n      your <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/resource-limits.html#aliases-per-key\\\">KMS\\n        aliases quota</a>.</p>\\n         <p>\\n            <b>Cross-account use</b>: No. <code>ListAliases</code> does not\\n      return aliases in other Amazon Web Services accounts.</p>\\n         <p>\\n            <b>Required permissions</b>: <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/kms-api-permissions-reference.html\\\">kms:ListAliases</a> (IAM policy)</p>\\n         <p>For details, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/alias-access.html\\\">Controlling access to aliases</a> in the <i>Key Management Service Developer Guide</i>.</p>\\n         <p>\\n            <b>Related operations:</b>\\n         </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a>CreateAlias</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>DeleteAlias</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>UpdateAlias</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>\\n            <b>Eventual consistency</b>: The KMS API follows an eventual consistency model. \\n  For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/accessing-kms.html#programming-eventual-consistency\\\">KMS eventual consistency</a>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To list aliases\",\n                        \"documentation\": \"The following example lists aliases.\",\n                        \"output\": {\n                            \"Aliases\": [\n                                {\n                                    \"AliasArn\": \"arn:aws:kms:us-east-2:111122223333:alias/aws/acm\",\n                                    \"AliasName\": \"alias/aws/acm\",\n                                    \"TargetKeyId\": \"da03f6f7-d279-427a-9cae-de48d07e5b66\"\n                                },\n                                {\n                                    \"AliasArn\": \"arn:aws:kms:us-east-2:111122223333:alias/aws/ebs\",\n                                    \"AliasName\": \"alias/aws/ebs\",\n                                    \"TargetKeyId\": \"25a217e7-7170-4b8c-8bf6-045ea5f70e5b\"\n                                },\n                                {\n                                    \"AliasArn\": \"arn:aws:kms:us-east-2:111122223333:alias/aws/rds\",\n                                    \"AliasName\": \"alias/aws/rds\",\n                                    \"TargetKeyId\": \"7ec3104e-c3f2-4b5c-bf42-bfc4772c6685\"\n                                },\n                                {\n                                    \"AliasArn\": \"arn:aws:kms:us-east-2:111122223333:alias/aws/redshift\",\n                                    \"AliasName\": \"alias/aws/redshift\",\n                                    \"TargetKeyId\": \"08f7a25a-69e2-4fb5-8f10-393db27326fa\"\n                                },\n                                {\n                                    \"AliasArn\": \"arn:aws:kms:us-east-2:111122223333:alias/aws/s3\",\n                                    \"AliasName\": \"alias/aws/s3\",\n                                    \"TargetKeyId\": \"d2b0f1a3-580d-4f79-b836-bc983be8cfa5\"\n                                },\n                                {\n                                    \"AliasArn\": \"arn:aws:kms:us-east-2:111122223333:alias/example1\",\n                                    \"AliasName\": \"alias/example1\",\n                                    \"TargetKeyId\": \"4da1e216-62d0-46c5-a7c0-5f3a3d2f8046\"\n                                },\n                                {\n                                    \"AliasArn\": \"arn:aws:kms:us-east-2:111122223333:alias/example2\",\n                                    \"AliasName\": \"alias/example2\",\n                                    \"TargetKeyId\": \"f32fef59-2cc2-445b-8573-2d73328acbee\"\n                                },\n                                {\n                                    \"AliasArn\": \"arn:aws:kms:us-east-2:111122223333:alias/example3\",\n                                    \"AliasName\": \"alias/example3\",\n                                    \"TargetKeyId\": \"1374ef38-d34e-4d5f-b2c9-4e0daee38855\"\n                                }\n                            ],\n                            \"Truncated\": false\n                        }\n                    }\n                ],\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"Marker\",\n                    \"outputToken\": \"NextMarker\",\n                    \"items\": \"Aliases\",\n                    \"pageSize\": \"Limit\"\n                }\n            }\n        },\n        \"com.amazonaws.kms#ListAliasesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"KeyId\": {\n                    \"target\": \"com.amazonaws.kms#KeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Lists only aliases that are associated with the specified KMS key. Enter a KMS key in your\\n      Amazon Web Services account. </p>\\n         <p>This parameter is optional. If you omit it, <code>ListAliases</code> returns all aliases\\n      in the account and Region.</p>\\n         <p>Specify the key ID or key ARN of the KMS key.</p>\\n         <p>For example:</p>\\n         <ul>\\n            <li>\\n               <p>Key ID: <code>1234abcd-12ab-34cd-56ef-1234567890ab</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Key ARN: <code>arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>To get the key ID and key ARN for a KMS key, use <a>ListKeys</a> or <a>DescribeKey</a>.</p>\"\n                    }\n                },\n                \"Limit\": {\n                    \"target\": \"com.amazonaws.kms#LimitType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter to specify the maximum number of items to return. When this\\n    value is present, KMS does not return more than the specified number of items, but it might\\n    return fewer.</p>\\n         <p>This value is optional. If you include a value, it must be between 1\\n    and 100, inclusive. If you do not include a value, it defaults to 50.</p>\"\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.kms#MarkerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter in a subsequent request after you receive a response with\\n    truncated results. Set it to the value of <code>NextMarker</code> from the truncated response\\n    you just received.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.kms#ListAliasesResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Aliases\": {\n                    \"target\": \"com.amazonaws.kms#AliasList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of aliases.</p>\"\n                    }\n                },\n                \"NextMarker\": {\n                    \"target\": \"com.amazonaws.kms#MarkerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>When <code>Truncated</code> is true, this element is present and contains the\\n    value to use for the <code>Marker</code> parameter in a subsequent request.</p>\"\n                    }\n                },\n                \"Truncated\": {\n                    \"target\": \"com.amazonaws.kms#BooleanType\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>A flag that indicates whether there are more items in the list. When this\\n    value is true, the list in this response is truncated. To get more items, pass the value of\\n    the <code>NextMarker</code> element in this response to the <code>Marker</code> parameter in a\\n    subsequent request.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.kms#ListGrants\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.kms#ListGrantsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.kms#ListGrantsResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.kms#DependencyTimeoutException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#InvalidArnException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#InvalidGrantIdException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#InvalidMarkerException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInternalException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInvalidStateException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#NotFoundException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Gets a list of all grants for the specified KMS key. </p>\\n         <p>You must specify the KMS key in all requests. You can filter the grant list by grant ID or\\n      grantee principal.</p>\\n         <p>For detailed information about grants, including grant terminology, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/grants.html\\\">Grants in KMS</a> in the\\n        <i>\\n               <i>Key Management Service Developer Guide</i>\\n            </i>. For examples of creating grants in several\\n      programming languages, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/example_kms_CreateGrant_section.html\\\">Use CreateGrant with an Amazon Web Services SDK or CLI</a>. </p>\\n         <note>\\n            <p>The <code>GranteePrincipal</code> field in the <code>ListGrants</code> response usually contains the\\n        user or role designated as the grantee principal in the grant. However, when the grantee\\n        principal in the grant is an Amazon Web Services service, the <code>GranteePrincipal</code> field contains\\n        the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_principal.html#principal-services\\\">service\\n          principal</a>, which might represent several different grantee principals.</p>\\n         </note>\\n         <p>\\n            <b>Cross-account use</b>: Yes. To perform this operation on a KMS key in a different Amazon Web Services account, specify the key\\n  ARN in the value of the <code>KeyId</code> parameter.</p>\\n         <p>\\n            <b>Required permissions</b>: <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/kms-api-permissions-reference.html\\\">kms:ListGrants</a> (key policy)</p>\\n         <p>\\n            <b>Related operations:</b>\\n         </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a>CreateGrant</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>ListRetirableGrants</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>RetireGrant</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>RevokeGrant</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>\\n            <b>Eventual consistency</b>: The KMS API follows an eventual consistency model. \\n  For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/accessing-kms.html#programming-eventual-consistency\\\">KMS eventual consistency</a>.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"Marker\",\n                    \"outputToken\": \"NextMarker\",\n                    \"items\": \"Grants\",\n                    \"pageSize\": \"Limit\"\n                }\n            }\n        },\n        \"com.amazonaws.kms#ListGrantsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Limit\": {\n                    \"target\": \"com.amazonaws.kms#LimitType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter to specify the maximum number of items to return. When this\\n    value is present, KMS does not return more than the specified number of items, but it might\\n    return fewer.</p>\\n         <p>This value is optional. If you include a value, it must be between 1\\n    and 100, inclusive. If you do not include a value, it defaults to 50.</p>\"\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.kms#MarkerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter in a subsequent request after you receive a response with\\n    truncated results. Set it to the value of <code>NextMarker</code> from the truncated response\\n    you just received.</p>\"\n                    }\n                },\n                \"KeyId\": {\n                    \"target\": \"com.amazonaws.kms#KeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Returns only grants for the specified KMS key. This parameter is required.</p>\\n         <p>Specify the key ID or key ARN of the KMS key. To specify a KMS key in a\\ndifferent Amazon Web Services account, you must use the key ARN.</p>\\n         <p>For example:</p>\\n         <ul>\\n            <li>\\n               <p>Key ID: <code>1234abcd-12ab-34cd-56ef-1234567890ab</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Key ARN: <code>arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>To get the key ID and key ARN for a KMS key, use <a>ListKeys</a> or <a>DescribeKey</a>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"GrantId\": {\n                    \"target\": \"com.amazonaws.kms#GrantIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Returns only the grant with the specified grant ID. The grant ID uniquely identifies the\\n      grant. </p>\"\n                    }\n                },\n                \"GranteePrincipal\": {\n                    \"target\": \"com.amazonaws.kms#PrincipalIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Returns only grants where the specified principal is the grantee principal for the\\n      grant.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.kms#ListGrantsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Grants\": {\n                    \"target\": \"com.amazonaws.kms#GrantList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of grants.</p>\"\n                    }\n                },\n                \"NextMarker\": {\n                    \"target\": \"com.amazonaws.kms#MarkerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>When <code>Truncated</code> is true, this element is present and contains the\\n    value to use for the <code>Marker</code> parameter in a subsequent request.</p>\"\n                    }\n                },\n                \"Truncated\": {\n                    \"target\": \"com.amazonaws.kms#BooleanType\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>A flag that indicates whether there are more items in the list. When this\\n    value is true, the list in this response is truncated. To get more items, pass the value of\\n    the <code>NextMarker</code> element in this response to the <code>Marker</code> parameter in a\\n    subsequent request.</p>\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.kms#ListKeyPolicies\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.kms#ListKeyPoliciesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.kms#ListKeyPoliciesResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.kms#DependencyTimeoutException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#InvalidArnException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInternalException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInvalidStateException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#NotFoundException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Gets the names of the key policies that are attached to a KMS key. This operation is\\n      designed to get policy names that you can use in a <a>GetKeyPolicy</a> operation.\\n      However, the only valid policy name is <code>default</code>. </p>\\n         <p>\\n            <b>Cross-account use</b>: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.</p>\\n         <p>\\n            <b>Required permissions</b>: <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/kms-api-permissions-reference.html\\\">kms:ListKeyPolicies</a> (key policy)</p>\\n         <p>\\n            <b>Related operations:</b>\\n         </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a>GetKeyPolicy</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/kms/latest/APIReference/API_PutKeyPolicy.html\\\">PutKeyPolicy</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>\\n            <b>Eventual consistency</b>: The KMS API follows an eventual consistency model. \\n  For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/accessing-kms.html#programming-eventual-consistency\\\">KMS eventual consistency</a>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To list key policies for a KMS key\",\n                        \"documentation\": \"The following example lists key policies for the specified KMS key.\",\n                        \"input\": {\n                            \"KeyId\": \"1234abcd-12ab-34cd-56ef-1234567890ab\"\n                        },\n                        \"output\": {\n                            \"PolicyNames\": [\n                                \"default\"\n                            ],\n                            \"Truncated\": false\n                        }\n                    }\n                ],\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"Marker\",\n                    \"outputToken\": \"NextMarker\",\n                    \"items\": \"PolicyNames\",\n                    \"pageSize\": \"Limit\"\n                }\n            }\n        },\n        \"com.amazonaws.kms#ListKeyPoliciesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"KeyId\": {\n                    \"target\": \"com.amazonaws.kms#KeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Gets the names of key policies for the specified KMS key.</p>\\n         <p>Specify the key ID or key ARN of the KMS key.</p>\\n         <p>For example:</p>\\n         <ul>\\n            <li>\\n               <p>Key ID: <code>1234abcd-12ab-34cd-56ef-1234567890ab</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Key ARN: <code>arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>To get the key ID and key ARN for a KMS key, use <a>ListKeys</a> or <a>DescribeKey</a>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Limit\": {\n                    \"target\": \"com.amazonaws.kms#LimitType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter to specify the maximum number of items to return. When this\\n    value is present, KMS does not return more than the specified number of items, but it might\\n    return fewer.</p>\\n         <p>This value is optional. If you include a value, it must be between\\n    1 and 1000, inclusive. If you do not include a value, it defaults to 100.</p>\\n         <p>Only one policy can be attached to a key.</p>\"\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.kms#MarkerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter in a subsequent request after you receive a response with\\n    truncated results. Set it to the value of <code>NextMarker</code> from the truncated response\\n    you just received.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.kms#ListKeyPoliciesResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PolicyNames\": {\n                    \"target\": \"com.amazonaws.kms#PolicyNameList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of key policy names. The only valid value is <code>default</code>.</p>\"\n                    }\n                },\n                \"NextMarker\": {\n                    \"target\": \"com.amazonaws.kms#MarkerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>When <code>Truncated</code> is true, this element is present and contains the\\n    value to use for the <code>Marker</code> parameter in a subsequent request.</p>\"\n                    }\n                },\n                \"Truncated\": {\n                    \"target\": \"com.amazonaws.kms#BooleanType\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>A flag that indicates whether there are more items in the list. When this\\n    value is true, the list in this response is truncated. To get more items, pass the value of\\n    the <code>NextMarker</code> element in this response to the <code>Marker</code> parameter in a\\n    subsequent request.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.kms#ListKeyRotations\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.kms#ListKeyRotationsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.kms#ListKeyRotationsResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.kms#InvalidArnException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#InvalidMarkerException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInternalException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInvalidStateException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#NotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#UnsupportedOperationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns information about the key materials associated with the specified KMS key. You can\\n      use the optional <code>IncludeKeyMaterial</code> parameter to control which key materials are\\n      included in the response.</p>\\n         <p>You must specify the KMS key in all requests. You can refine the key rotations list by\\n      limiting the number of rotations returned.</p>\\n         <p>For detailed information about automatic and on-demand key rotations, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/rotate-keys.html\\\">Rotate KMS keys</a> in the\\n      <i>Key Management Service Developer Guide</i>.</p>\\n         <p>\\n            <b>Cross-account use</b>: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.</p>\\n         <p>\\n            <b>Required permissions</b>: <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/kms-api-permissions-reference.html\\\">kms:ListKeyRotations</a> (key policy)</p>\\n         <p>\\n            <b>Related operations:</b>\\n         </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a>EnableKeyRotation</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>DeleteImportedKeyMaterial</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>DisableKeyRotation</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>GetKeyRotationStatus</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>ImportKeyMaterial</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>RotateKeyOnDemand</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>\\n            <b>Eventual consistency</b>: The KMS API follows an eventual consistency model. \\n  For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/accessing-kms.html#programming-eventual-consistency\\\">KMS eventual consistency</a>.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"Marker\",\n                    \"outputToken\": \"NextMarker\",\n                    \"items\": \"Rotations\",\n                    \"pageSize\": \"Limit\"\n                }\n            }\n        },\n        \"com.amazonaws.kms#ListKeyRotationsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"KeyId\": {\n                    \"target\": \"com.amazonaws.kms#KeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Gets the key rotations for the specified KMS key.</p>\\n         <p>Specify the key ID or key ARN of the KMS key.</p>\\n         <p>For example:</p>\\n         <ul>\\n            <li>\\n               <p>Key ID: <code>1234abcd-12ab-34cd-56ef-1234567890ab</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Key ARN: <code>arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>To get the key ID and key ARN for a KMS key, use <a>ListKeys</a> or <a>DescribeKey</a>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"IncludeKeyMaterial\": {\n                    \"target\": \"com.amazonaws.kms#IncludeKeyMaterial\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this optional parameter to control which key materials associated with this key are\\n      listed in the response. The default value of this parameter is <code>ROTATIONS_ONLY</code>. If\\n      you omit this parameter, KMS returns information on the key materials created by automatic\\n      or on-demand key rotation. When you specify a value of <code>ALL_KEY_MATERIAL</code>, KMS\\n      adds the first key material and any imported key material pending rotation to the response.\\n      This parameter can only be used with KMS keys that support automatic or on-demand key\\n      rotation. </p>\"\n                    }\n                },\n                \"Limit\": {\n                    \"target\": \"com.amazonaws.kms#LimitType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter to specify the maximum number of items to return. When this\\n    value is present, KMS does not return more than the specified number of items, but it might\\n    return fewer.</p>\\n         <p>This value is optional. If you include a value, it must be between\\n    1 and 1000, inclusive. If you do not include a value, it defaults to 100.</p>\"\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.kms#MarkerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter in a subsequent request after you receive a response with\\n    truncated results. Set it to the value of <code>NextMarker</code> from the truncated response\\n    you just received.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.kms#ListKeyRotationsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Rotations\": {\n                    \"target\": \"com.amazonaws.kms#RotationsList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of completed key material rotations. When the optional input parameter\\n        <code>IncludeKeyMaterial</code> is specified with a value of <code>ALL_KEY_MATERIAL</code>,\\n      this list includes the first key material and any imported key material pending\\n      rotation.</p>\"\n                    }\n                },\n                \"NextMarker\": {\n                    \"target\": \"com.amazonaws.kms#MarkerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>When <code>Truncated</code> is true, this element is present and contains the\\n    value to use for the <code>Marker</code> parameter in a subsequent request.</p>\"\n                    }\n                },\n                \"Truncated\": {\n                    \"target\": \"com.amazonaws.kms#BooleanType\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>A flag that indicates whether there are more items in the list. When this\\n    value is true, the list in this response is truncated. To get more items, pass the value of\\n    the <code>NextMarker</code> element in this response to the <code>Marker</code> parameter in a\\n    subsequent request.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.kms#ListKeys\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.kms#ListKeysRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.kms#ListKeysResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.kms#DependencyTimeoutException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#InvalidMarkerException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInternalException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Gets a list of all KMS keys in the caller's Amazon Web Services account and Region.</p>\\n         <p>\\n            <b>Cross-account use</b>: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.</p>\\n         <p>\\n            <b>Required permissions</b>: <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/kms-api-permissions-reference.html\\\">kms:ListKeys</a> (IAM policy)</p>\\n         <p>\\n            <b>Related operations:</b>\\n         </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a>CreateKey</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>DescribeKey</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>ListAliases</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>ListResourceTags</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>\\n            <b>Eventual consistency</b>: The KMS API follows an eventual consistency model. \\n  For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/accessing-kms.html#programming-eventual-consistency\\\">KMS eventual consistency</a>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To list KMS keys\",\n                        \"documentation\": \"The following example lists KMS keys.\",\n                        \"output\": {\n                            \"Keys\": [\n                                {\n                                    \"KeyArn\": \"arn:aws:kms:us-east-2:111122223333:key/0d990263-018e-4e65-a703-eff731de951e\",\n                                    \"KeyId\": \"0d990263-018e-4e65-a703-eff731de951e\"\n                                },\n                                {\n                                    \"KeyArn\": \"arn:aws:kms:us-east-2:111122223333:key/144be297-0ae1-44ac-9c8f-93cd8c82f841\",\n                                    \"KeyId\": \"144be297-0ae1-44ac-9c8f-93cd8c82f841\"\n                                },\n                                {\n                                    \"KeyArn\": \"arn:aws:kms:us-east-2:111122223333:key/21184251-b765-428e-b852-2c7353e72571\",\n                                    \"KeyId\": \"21184251-b765-428e-b852-2c7353e72571\"\n                                },\n                                {\n                                    \"KeyArn\": \"arn:aws:kms:us-east-2:111122223333:key/214fe92f-5b03-4ae1-b350-db2a45dbe10c\",\n                                    \"KeyId\": \"214fe92f-5b03-4ae1-b350-db2a45dbe10c\"\n                                },\n                                {\n                                    \"KeyArn\": \"arn:aws:kms:us-east-2:111122223333:key/339963f2-e523-49d3-af24-a0fe752aa458\",\n                                    \"KeyId\": \"339963f2-e523-49d3-af24-a0fe752aa458\"\n                                },\n                                {\n                                    \"KeyArn\": \"arn:aws:kms:us-east-2:111122223333:key/b776a44b-df37-4438-9be4-a27494e4271a\",\n                                    \"KeyId\": \"b776a44b-df37-4438-9be4-a27494e4271a\"\n                                },\n                                {\n                                    \"KeyArn\": \"arn:aws:kms:us-east-2:111122223333:key/deaf6c9e-cf2c-46a6-bf6d-0b6d487cffbb\",\n                                    \"KeyId\": \"deaf6c9e-cf2c-46a6-bf6d-0b6d487cffbb\"\n                                }\n                            ],\n                            \"Truncated\": false\n                        }\n                    }\n                ],\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"Marker\",\n                    \"outputToken\": \"NextMarker\",\n                    \"items\": \"Keys\",\n                    \"pageSize\": \"Limit\"\n                }\n            }\n        },\n        \"com.amazonaws.kms#ListKeysRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Limit\": {\n                    \"target\": \"com.amazonaws.kms#LimitType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter to specify the maximum number of items to return. When this\\n    value is present, KMS does not return more than the specified number of items, but it might\\n    return fewer.</p>\\n         <p>This value is optional. If you include a value, it must be between\\n    1 and 1000, inclusive. If you do not include a value, it defaults to 100.</p>\"\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.kms#MarkerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter in a subsequent request after you receive a response with\\n    truncated results. Set it to the value of <code>NextMarker</code> from the truncated response\\n    you just received.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.kms#ListKeysResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Keys\": {\n                    \"target\": \"com.amazonaws.kms#KeyList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of KMS keys.</p>\"\n                    }\n                },\n                \"NextMarker\": {\n                    \"target\": \"com.amazonaws.kms#MarkerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>When <code>Truncated</code> is true, this element is present and contains the\\n    value to use for the <code>Marker</code> parameter in a subsequent request.</p>\"\n                    }\n                },\n                \"Truncated\": {\n                    \"target\": \"com.amazonaws.kms#BooleanType\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>A flag that indicates whether there are more items in the list. When this\\n    value is true, the list in this response is truncated. To get more items, pass the value of\\n    the <code>NextMarker</code> element in this response to the <code>Marker</code> parameter in a\\n    subsequent request.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.kms#ListResourceTags\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.kms#ListResourceTagsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.kms#ListResourceTagsResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.kms#InvalidArnException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#InvalidMarkerException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInternalException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#NotFoundException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns all tags on the specified KMS key.</p>\\n         <p>For general information about tags, including the format and syntax, see <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html\\\">Tagging Amazon Web Services resources</a> in\\n      the <i>Amazon Web Services General Reference</i>. For information about using\\n      tags in KMS, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/tagging-keys.html\\\">Tags in\\n        KMS</a>.</p>\\n         <p>\\n            <b>Cross-account use</b>: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.</p>\\n         <p>\\n            <b>Required permissions</b>: <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/kms-api-permissions-reference.html\\\">kms:ListResourceTags</a> (key policy)</p>\\n         <p>\\n            <b>Related operations:</b>\\n         </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a>CreateKey</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>ReplicateKey</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>TagResource</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>UntagResource</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>\\n            <b>Eventual consistency</b>: The KMS API follows an eventual consistency model. \\n  For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/accessing-kms.html#programming-eventual-consistency\\\">KMS eventual consistency</a>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To list tags for a KMS key\",\n                        \"documentation\": \"The following example lists tags for a KMS key.\",\n                        \"input\": {\n                            \"KeyId\": \"1234abcd-12ab-34cd-56ef-1234567890ab\"\n                        },\n                        \"output\": {\n                            \"Tags\": [\n                                {\n                                    \"TagKey\": \"CostCenter\",\n                                    \"TagValue\": \"87654\"\n                                },\n                                {\n                                    \"TagKey\": \"CreatedBy\",\n                                    \"TagValue\": \"ExampleUser\"\n                                },\n                                {\n                                    \"TagKey\": \"Purpose\",\n                                    \"TagValue\": \"Test\"\n                                }\n                            ],\n                            \"Truncated\": false\n                        }\n                    }\n                ],\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"Marker\",\n                    \"outputToken\": \"NextMarker\",\n                    \"items\": \"Tags\",\n                    \"pageSize\": \"Limit\"\n                }\n            }\n        },\n        \"com.amazonaws.kms#ListResourceTagsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"KeyId\": {\n                    \"target\": \"com.amazonaws.kms#KeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Gets tags on the specified KMS key.</p>\\n         <p>Specify the key ID or key ARN of the KMS key.</p>\\n         <p>For example:</p>\\n         <ul>\\n            <li>\\n               <p>Key ID: <code>1234abcd-12ab-34cd-56ef-1234567890ab</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Key ARN: <code>arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>To get the key ID and key ARN for a KMS key, use <a>ListKeys</a> or <a>DescribeKey</a>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Limit\": {\n                    \"target\": \"com.amazonaws.kms#LimitType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter to specify the maximum number of items to return. When this\\n    value is present, KMS does not return more than the specified number of items, but it might\\n    return fewer.</p>\\n         <p>This value is optional. If you include a value, it must be between 1 and 50, inclusive. If\\n      you do not include a value, it defaults to 50.</p>\"\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.kms#MarkerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter in a subsequent request after you receive a response with\\n    truncated results. Set it to the value of <code>NextMarker</code> from the truncated response\\n    you just received.</p>\\n         <p>Do not attempt to construct this value. Use only the value of <code>NextMarker</code> from\\n      the truncated response you just received.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.kms#ListResourceTagsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.kms#TagList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of tags. Each tag consists of a tag key and a tag value.</p>\\n         <note>\\n            <p>Tagging or untagging a KMS key can allow or deny permission to the KMS key. For details, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/abac.html\\\">ABAC for KMS</a> in the <i>Key Management Service Developer Guide</i>.</p>\\n         </note>\"\n                    }\n                },\n                \"NextMarker\": {\n                    \"target\": \"com.amazonaws.kms#MarkerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>When <code>Truncated</code> is true, this element is present and contains the\\n    value to use for the <code>Marker</code> parameter in a subsequent request.</p>\\n         <p>Do not assume or infer any information from this value.</p>\"\n                    }\n                },\n                \"Truncated\": {\n                    \"target\": \"com.amazonaws.kms#BooleanType\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>A flag that indicates whether there are more items in the list. When this\\n    value is true, the list in this response is truncated. To get more items, pass the value of\\n    the <code>NextMarker</code> element in this response to the <code>Marker</code> parameter in a\\n    subsequent request.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.kms#ListRetirableGrants\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.kms#ListRetirableGrantsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.kms#ListGrantsResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.kms#DependencyTimeoutException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#InvalidArnException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#InvalidMarkerException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInternalException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#NotFoundException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns information about all grants in the Amazon Web Services account and Region that have the\\n      specified retiring principal. </p>\\n         <p>You can specify any principal in your Amazon Web Services account. The grants that are returned include\\n      grants for KMS keys in your Amazon Web Services account and other Amazon Web Services accounts. You might use this\\n      operation to determine which grants you may retire. To retire a grant, use the <a>RetireGrant</a> operation.</p>\\n         <p>For detailed information about grants, including grant terminology, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/grants.html\\\">Grants in KMS</a> in the\\n        <i>\\n               <i>Key Management Service Developer Guide</i>\\n            </i>. For examples of creating grants in several\\n      programming languages, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/example_kms_CreateGrant_section.html\\\">Use CreateGrant with an Amazon Web Services SDK or CLI</a>. </p>\\n         <p>\\n            <b>Cross-account use</b>: You must specify a principal in your\\n      Amazon Web Services account. This operation returns a list of grants where the retiring principal specified\\n      in the <code>ListRetirableGrants</code> request is the same retiring principal on the grant.\\n      This can include grants on KMS keys owned by other Amazon Web Services accounts, but you do not need\\n        <code>kms:ListRetirableGrants</code> permission (or any other additional permission) in any\\n      Amazon Web Services account other than your own.</p>\\n         <p>\\n            <b>Required permissions</b>: <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/kms-api-permissions-reference.html\\\">kms:ListRetirableGrants</a> (IAM policy) in your\\n      Amazon Web Services account.</p>\\n         <note>\\n            <p>KMS authorizes <code>ListRetirableGrants</code> requests by evaluating the caller\\n        account's kms:ListRetirableGrants permissions. The authorized resource in\\n          <code>ListRetirableGrants</code> calls is the retiring principal specified in the request.\\n        KMS does not evaluate the caller's permissions to verify their access to any KMS keys or\\n        grants that might be returned by the <code>ListRetirableGrants</code> call.</p>\\n         </note>\\n         <p>\\n            <b>Related operations:</b>\\n         </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a>CreateGrant</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>ListGrants</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>RetireGrant</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>RevokeGrant</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>\\n            <b>Eventual consistency</b>: The KMS API follows an eventual consistency model. \\n  For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/accessing-kms.html#programming-eventual-consistency\\\">KMS eventual consistency</a>.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"Marker\",\n                    \"outputToken\": \"NextMarker\",\n                    \"items\": \"Grants\",\n                    \"pageSize\": \"Limit\"\n                }\n            }\n        },\n        \"com.amazonaws.kms#ListRetirableGrantsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Limit\": {\n                    \"target\": \"com.amazonaws.kms#LimitType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter to specify the maximum number of items to return. When this\\n    value is present, KMS does not return more than the specified number of items, but it might\\n    return fewer.</p>\\n         <p>This value is optional. If you include a value, it must be between 1\\n    and 100, inclusive. If you do not include a value, it defaults to 50.</p>\"\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.kms#MarkerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use this parameter in a subsequent request after you receive a response with\\n    truncated results. Set it to the value of <code>NextMarker</code> from the truncated response\\n    you just received.</p>\"\n                    }\n                },\n                \"RetiringPrincipal\": {\n                    \"target\": \"com.amazonaws.kms#PrincipalIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The retiring principal for which to list grants. Enter a principal in your\\n      Amazon Web Services account.</p>\\n         <p>To specify the retiring principal, use the <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html\\\">Amazon Resource Name (ARN)</a> of an\\n      Amazon Web Services principal. Valid principals include Amazon Web Services accounts, IAM users, IAM roles,\\n      federated users, and assumed role users. For help with the ARN syntax for a principal, see\\n        <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html#identifiers-arns\\\">IAM ARNs</a> in the <i>\\n               <i>Identity and Access Management User Guide</i>\\n            </i>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.kms#MacAlgorithmSpec\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"HMAC_SHA_224\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"HMAC_SHA_224\"\n                    }\n                },\n                \"HMAC_SHA_256\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"HMAC_SHA_256\"\n                    }\n                },\n                \"HMAC_SHA_384\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"HMAC_SHA_384\"\n                    }\n                },\n                \"HMAC_SHA_512\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"HMAC_SHA_512\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.kms#MacAlgorithmSpecList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.kms#MacAlgorithmSpec\"\n            }\n        },\n        \"com.amazonaws.kms#MalformedPolicyDocumentException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.kms#ErrorMessageType\"\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"MalformedPolicyDocument\",\n                    \"httpResponseCode\": 400\n                },\n                \"smithy.api#documentation\": \"<p>The request was rejected because the specified policy is not syntactically or semantically\\n      correct.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.kms#MarkerType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 1024\n                },\n                \"smithy.api#pattern\": \"^[\\\\u0020-\\\\u00FF]*$\"\n            }\n        },\n        \"com.amazonaws.kms#MessageType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"RAW\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"RAW\"\n                    }\n                },\n                \"DIGEST\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DIGEST\"\n                    }\n                },\n                \"EXTERNAL_MU\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"EXTERNAL_MU\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.kms#MultiRegionConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"MultiRegionKeyType\": {\n                    \"target\": \"com.amazonaws.kms#MultiRegionKeyType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether the KMS key is a <code>PRIMARY</code> or <code>REPLICA</code>\\n      key.</p>\"\n                    }\n                },\n                \"PrimaryKey\": {\n                    \"target\": \"com.amazonaws.kms#MultiRegionKey\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Displays the key ARN and Region of the primary key. This field includes the current KMS\\n      key if it is the primary key.</p>\"\n                    }\n                },\n                \"ReplicaKeys\": {\n                    \"target\": \"com.amazonaws.kms#MultiRegionKeyList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>displays the key ARNs and Regions of all replica keys. This field includes the current KMS\\n      key if it is a replica key.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the configuration of this multi-Region key. This field appears only when the KMS\\n      key is a primary or replica of a multi-Region key.</p>\\n         <p>For more information about any listed KMS key, use the <a>DescribeKey</a>\\n      operation.</p>\"\n            }\n        },\n        \"com.amazonaws.kms#MultiRegionKey\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Arn\": {\n                    \"target\": \"com.amazonaws.kms#ArnType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Displays the key ARN of a primary or replica key of a multi-Region key.</p>\"\n                    }\n                },\n                \"Region\": {\n                    \"target\": \"com.amazonaws.kms#RegionType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Displays the Amazon Web Services Region of a primary or replica key in a multi-Region key.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the primary or replica key in a multi-Region key.</p>\"\n            }\n        },\n        \"com.amazonaws.kms#MultiRegionKeyList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.kms#MultiRegionKey\"\n            }\n        },\n        \"com.amazonaws.kms#MultiRegionKeyType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"PRIMARY\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"PRIMARY\"\n                    }\n                },\n                \"REPLICA\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"REPLICA\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.kms#NotFoundException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.kms#ErrorMessageType\"\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"NotFound\",\n                    \"httpResponseCode\": 404\n                },\n                \"smithy.api#documentation\": \"<p>The request was rejected because the specified entity or resource could not be\\n      found.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 404\n            }\n        },\n        \"com.amazonaws.kms#NullableBooleanType\": {\n            \"type\": \"boolean\"\n        },\n        \"com.amazonaws.kms#NumberOfBytesType\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 1024\n                }\n            }\n        },\n        \"com.amazonaws.kms#OriginType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"AWS_KMS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS_KMS\"\n                    }\n                },\n                \"EXTERNAL\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"EXTERNAL\"\n                    }\n                },\n                \"AWS_CLOUDHSM\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS_CLOUDHSM\"\n                    }\n                },\n                \"EXTERNAL_KEY_STORE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"EXTERNAL_KEY_STORE\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.kms#PendingWindowInDaysType\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 365\n                }\n            }\n        },\n        \"com.amazonaws.kms#PlaintextType\": {\n            \"type\": \"blob\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 4096\n                },\n                \"smithy.api#sensitive\": {}\n            }\n        },\n        \"com.amazonaws.kms#PolicyNameList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.kms#PolicyNameType\"\n            }\n        },\n        \"com.amazonaws.kms#PolicyNameType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 128\n                },\n                \"smithy.api#pattern\": \"^[\\\\w]+$\"\n            }\n        },\n        \"com.amazonaws.kms#PolicyType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 131072\n                },\n                \"smithy.api#pattern\": \"^[\\\\u0009\\\\u000A\\\\u000D\\\\u0020-\\\\u00FF]+$\"\n            }\n        },\n        \"com.amazonaws.kms#PrincipalIdType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 256\n                },\n                \"smithy.api#pattern\": \"^[\\\\w+=,.@:/-]+$\"\n            }\n        },\n        \"com.amazonaws.kms#PublicKeyType\": {\n            \"type\": \"blob\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 8192\n                }\n            }\n        },\n        \"com.amazonaws.kms#PutKeyPolicy\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.kms#PutKeyPolicyRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.kms#DependencyTimeoutException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#InvalidArnException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInternalException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInvalidStateException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#MalformedPolicyDocumentException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#NotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#UnsupportedOperationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Attaches a key policy to the specified KMS key. </p>\\n         <p>For more information about key policies, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html\\\">Key Policies</a> in the <i>Key Management Service Developer Guide</i>.\\n      For help writing and formatting a JSON policy document, see the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies.html\\\">IAM JSON Policy Reference</a> in the <i>\\n               <i>Identity and Access Management User Guide</i>\\n            </i>. For examples of adding a key policy in multiple programming languages,\\n      see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/example_kms_PutKeyPolicy_section.html\\\">Use\\n        PutKeyPolicy with an Amazon Web Services SDK or CLI</a> in the <i>Key Management Service Developer Guide</i>.</p>\\n         <p>\\n            <b>Cross-account use</b>: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.</p>\\n         <p>\\n            <b>Required permissions</b>: <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/kms-api-permissions-reference.html\\\">kms:PutKeyPolicy</a> (key policy)</p>\\n         <p>\\n            <b>Related operations</b>: <a>GetKeyPolicy</a>\\n         </p>\\n         <p>\\n            <b>Eventual consistency</b>: The KMS API follows an eventual consistency model. \\n  For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/accessing-kms.html#programming-eventual-consistency\\\">KMS eventual consistency</a>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To attach a key policy to a KMS key\",\n                        \"documentation\": \"The following example attaches a key policy to the specified KMS key.\",\n                        \"input\": {\n                            \"KeyId\": \"1234abcd-12ab-34cd-56ef-1234567890ab\",\n                            \"PolicyName\": \"default\",\n                            \"Policy\": \"{\\n    \\\"Version\\\": \\\"2012-10-17\\\",\\n    \\\"Id\\\": \\\"custom-policy-2016-12-07\\\",\\n    \\\"Statement\\\": [\\n        {\\n            \\\"Sid\\\": \\\"Enable IAM User Permissions\\\",\\n            \\\"Effect\\\": \\\"Allow\\\",\\n            \\\"Principal\\\": {\\n                \\\"AWS\\\": \\\"arn:aws:iam::111122223333:root\\\"\\n            },\\n            \\\"Action\\\": \\\"kms:*\\\",\\n            \\\"Resource\\\": \\\"*\\\"\\n        },\\n        {\\n            \\\"Sid\\\": \\\"Allow access for Key Administrators\\\",\\n            \\\"Effect\\\": \\\"Allow\\\",\\n            \\\"Principal\\\": {\\n                \\\"AWS\\\": [\\n                    \\\"arn:aws:iam::111122223333:user/ExampleAdminUser\\\",\\n                    \\\"arn:aws:iam::111122223333:role/ExampleAdminRole\\\"\\n                ]\\n            },\\n            \\\"Action\\\": [\\n                \\\"kms:Create*\\\",\\n                \\\"kms:Describe*\\\",\\n                \\\"kms:Enable*\\\",\\n                \\\"kms:List*\\\",\\n                \\\"kms:Put*\\\",\\n                \\\"kms:Update*\\\",\\n                \\\"kms:Revoke*\\\",\\n                \\\"kms:Disable*\\\",\\n                \\\"kms:Get*\\\",\\n                \\\"kms:Delete*\\\",\\n                \\\"kms:ScheduleKeyDeletion\\\",\\n                \\\"kms:CancelKeyDeletion\\\"\\n            ],\\n            \\\"Resource\\\": \\\"*\\\"\\n        },\\n        {\\n            \\\"Sid\\\": \\\"Allow use of the key\\\",\\n            \\\"Effect\\\": \\\"Allow\\\",\\n            \\\"Principal\\\": {\\n                \\\"AWS\\\": \\\"arn:aws:iam::111122223333:role/ExamplePowerUserRole\\\"\\n            },\\n            \\\"Action\\\": [\\n                \\\"kms:Encrypt\\\",\\n                \\\"kms:Decrypt\\\",\\n                \\\"kms:ReEncrypt*\\\",\\n                \\\"kms:GenerateDataKey*\\\",\\n                \\\"kms:DescribeKey\\\"\\n            ],\\n            \\\"Resource\\\": \\\"*\\\"\\n        },\\n        {\\n            \\\"Sid\\\": \\\"Allow attachment of persistent resources\\\",\\n            \\\"Effect\\\": \\\"Allow\\\",\\n            \\\"Principal\\\": {\\n                \\\"AWS\\\": \\\"arn:aws:iam::111122223333:role/ExamplePowerUserRole\\\"\\n            },\\n            \\\"Action\\\": [\\n                \\\"kms:CreateGrant\\\",\\n                \\\"kms:ListGrants\\\",\\n                \\\"kms:RevokeGrant\\\"\\n            ],\\n            \\\"Resource\\\": \\\"*\\\",\\n            \\\"Condition\\\": {\\n                \\\"Bool\\\": {\\n                    \\\"kms:GrantIsForAWSResource\\\": \\\"true\\\"\\n                }\\n            }\\n        }\\n    ]\\n}\\n\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.kms#PutKeyPolicyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"KeyId\": {\n                    \"target\": \"com.amazonaws.kms#KeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Sets the key policy on the specified KMS key.</p>\\n         <p>Specify the key ID or key ARN of the KMS key.</p>\\n         <p>For example:</p>\\n         <ul>\\n            <li>\\n               <p>Key ID: <code>1234abcd-12ab-34cd-56ef-1234567890ab</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Key ARN: <code>arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>To get the key ID and key ARN for a KMS key, use <a>ListKeys</a> or <a>DescribeKey</a>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"PolicyName\": {\n                    \"target\": \"com.amazonaws.kms#PolicyNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the key policy. If no policy name is specified, the default value is\\n        <code>default</code>. The only valid value is <code>default</code>.</p>\"\n                    }\n                },\n                \"Policy\": {\n                    \"target\": \"com.amazonaws.kms#PolicyType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The key policy to attach to the KMS key.</p>\\n         <p>The key policy must meet the following criteria:</p>\\n         <ul>\\n            <li>\\n               <p>The key policy must allow the calling principal to make a\\n          subsequent <code>PutKeyPolicy</code> request on the KMS key.  This reduces the risk that\\n          the KMS key becomes unmanageable. For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/key-policy-default.html#prevent-unmanageable-key\\\">Default key policy</a> in the <i>Key Management Service Developer Guide</i>. (To omit\\n          this condition, set <code>BypassPolicyLockoutSafetyCheck</code> to true.)</p>\\n            </li>\\n            <li>\\n               <p>Each statement in the key policy must contain one or more principals. The principals\\n          in the key policy must exist and be visible to KMS. When you create a new Amazon Web Services\\n          principal, you might need to enforce a delay before including the new principal in a key\\n          policy because the new principal might not be immediately visible to KMS. For more\\n          information, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/troubleshoot_general.html#troubleshoot_general_eventual-consistency\\\">Changes that I make are not always immediately visible</a> in the <i>Amazon Web Services\\n            Identity and Access Management User Guide</i>.</p>\\n            </li>\\n         </ul>\\n         <note>\\n            <p>If either of the required <code>Resource</code> or <code>Action</code> elements are\\n        missing from a key policy statement, the policy statement has no effect. When a key policy\\n        statement is missing one of these elements, the KMS console correctly reports an error,\\n        but the <code>PutKeyPolicy</code> API request succeeds, even though the policy statement is\\n        ineffective.</p>\\n            <p>For more information on required key policy elements, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/key-policy-overview.html#key-policy-elements\\\">Elements in a key\\n          policy</a> in the <i>Key Management Service Developer Guide</i>.</p>\\n         </note>\\n         <p>A key policy document can include only the following characters:</p>\\n         <ul>\\n            <li>\\n               <p>Printable ASCII characters from the space character (<code>\\\\u0020</code>) through the end of the ASCII character range.</p>\\n            </li>\\n            <li>\\n               <p>Printable characters in the Basic Latin and Latin-1 Supplement character set (through <code>\\\\u00FF</code>).</p>\\n            </li>\\n            <li>\\n               <p>The tab (<code>\\\\u0009</code>), line feed (<code>\\\\u000A</code>), and carriage return (<code>\\\\u000D</code>) special characters</p>\\n            </li>\\n         </ul>\\n         <note>\\n            <p>If the key policy exceeds the length constraint, KMS returns a\\n          <code>LimitExceededException</code>.</p>\\n         </note>\\n         <p>For information about key policies, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html\\\">Key policies in KMS</a> in the\\n      <i>Key Management Service Developer Guide</i>.For help writing and formatting a JSON policy document, see the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies.html\\\">IAM JSON Policy Reference</a> in the <i>\\n               <i>Identity and Access Management User Guide</i>\\n            </i>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"BypassPolicyLockoutSafetyCheck\": {\n                    \"target\": \"com.amazonaws.kms#BooleanType\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Skips (\\\"bypasses\\\") the key policy lockout safety check. The default value is false.</p>\\n         <important>\\n            <p>Setting this value to true increases the risk that the KMS key becomes unmanageable. Do\\n        not set this value to true indiscriminately.</p>\\n            <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/key-policy-default.html#prevent-unmanageable-key\\\">Default key policy</a> in the <i>Key Management Service Developer Guide</i>.</p>\\n         </important>\\n         <p>Use this parameter only when you intend to prevent the principal that is making the\\n      request from making a subsequent <a href=\\\"https://docs.aws.amazon.com/kms/latest/APIReference/API_PutKeyPolicy.html\\\">PutKeyPolicy</a>\\n      request on the KMS key.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.kms#ReEncrypt\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.kms#ReEncryptRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.kms#ReEncryptResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.kms#DependencyTimeoutException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#DisabledException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#DryRunOperationException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#IncorrectKeyException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#InvalidCiphertextException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#InvalidGrantTokenException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#InvalidKeyUsageException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KeyUnavailableException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInternalException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInvalidStateException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#NotFoundException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Decrypts ciphertext and then reencrypts it entirely within KMS. You can use this\\n      operation to change the KMS key under which data is encrypted, such as when you <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/rotate-keys-manually.html\\\">manually rotate</a> a\\n      KMS key or change the KMS key that protects a ciphertext. You can also use it to reencrypt\\n      ciphertext under the same KMS key, such as to change the <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/encrypt_context.html\\\">encryption context</a> of a ciphertext.</p>\\n         <p>The <code>ReEncrypt</code> operation can decrypt ciphertext that was encrypted by using a\\n      KMS key in an KMS operation, such as <a>Encrypt</a> or <a>GenerateDataKey</a>. It can also decrypt ciphertext that was encrypted by using the\\n      public key of an <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/symmetric-asymmetric.html\\\">asymmetric KMS key</a> outside of KMS. However, it cannot decrypt ciphertext produced\\n      by other libraries, such as the <a href=\\\"https://docs.aws.amazon.com/encryption-sdk/latest/developer-guide/\\\">Amazon Web Services\\n        Encryption SDK</a> or <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingClientSideEncryption.html\\\">Amazon S3 client-side encryption</a>.\\n      These libraries return a ciphertext format that is incompatible with KMS.</p>\\n         <p>When you use the <code>ReEncrypt</code> operation, you need to provide information for the\\n      decrypt operation and the subsequent encrypt operation.</p>\\n         <ul>\\n            <li>\\n               <p>If your ciphertext was encrypted under an asymmetric KMS key, you must use the\\n            <code>SourceKeyId</code> parameter to identify the KMS key that encrypted the\\n          ciphertext. You must also supply the encryption algorithm that was used. This information\\n          is required to decrypt the data.</p>\\n            </li>\\n            <li>\\n               <p>If your ciphertext was encrypted under a symmetric encryption KMS key, the\\n            <code>SourceKeyId</code> parameter is optional. KMS can get this information from\\n          metadata that it adds to the symmetric ciphertext blob. This feature adds durability to\\n          your implementation by ensuring that authorized users can decrypt ciphertext decades after\\n          it was encrypted, even if they've lost track of the key ID. However, specifying the source\\n          KMS key is always recommended as a best practice. When you use the\\n            <code>SourceKeyId</code> parameter to specify a KMS key, KMS uses only the KMS key you\\n          specify. If the ciphertext was encrypted under a different KMS key, the\\n            <code>ReEncrypt</code> operation fails. This practice ensures that you use the KMS key\\n          that you intend.</p>\\n            </li>\\n            <li>\\n               <p>To reencrypt the data, you must use the <code>DestinationKeyId</code> parameter to\\n          specify the KMS key that re-encrypts the data after it is decrypted. If the destination\\n          KMS key is an asymmetric KMS key, you must also provide the encryption algorithm. The\\n          algorithm that you choose must be compatible with the KMS key.</p>\\n               <important>\\n                  <p>When you use an asymmetric KMS key to encrypt or reencrypt data, be sure to record the KMS key and encryption algorithm that you choose. You will be required to provide the same KMS key and encryption algorithm when you decrypt the data. If the KMS key and algorithm do not match the values used to encrypt the data, the decrypt operation fails.</p>\\n                  <p>You are not required to supply the key ID and encryption algorithm when you decrypt with symmetric encryption KMS keys because KMS stores this information in the ciphertext blob. KMS cannot store metadata in ciphertext generated with asymmetric keys. The standard format for asymmetric key ciphertext does not include configurable fields.</p>\\n               </important>\\n            </li>\\n         </ul>\\n         <p>The KMS key that you use for this operation must be in a compatible key state. For\\ndetails, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/key-state.html\\\">Key states of KMS keys</a> in the <i>Key Management Service Developer Guide</i>.</p>\\n         <p>\\n            <b>Cross-account use</b>: Yes. The source KMS key and\\n      destination KMS key can be in different Amazon Web Services accounts. Either or both KMS keys can be in a\\n      different account than the caller. To specify a KMS key in a different account, you must use\\n      its key ARN or alias ARN.</p>\\n         <p>\\n            <b>Required permissions</b>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/kms-api-permissions-reference.html\\\">kms:ReEncryptFrom</a>\\n          permission on the source KMS key (key policy)</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/kms-api-permissions-reference.html\\\">kms:ReEncryptTo</a>\\n          permission on the destination KMS key (key policy)</p>\\n            </li>\\n         </ul>\\n         <p>To permit reencryption from or to a KMS key, include the <code>\\\"kms:ReEncrypt*\\\"</code>\\n      permission in your <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html\\\">key policy</a>. This permission is\\n      automatically included in the key policy when you use the console to create a KMS key. But you\\n      must include it manually when you create a KMS key programmatically or when you use the <a>PutKeyPolicy</a> operation to set a key policy.</p>\\n         <p>\\n            <b>Related operations:</b>\\n         </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a>Decrypt</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>Encrypt</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>GenerateDataKey</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>GenerateDataKeyPair</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>\\n            <b>Eventual consistency</b>: The KMS API follows an eventual consistency model. \\n  For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/accessing-kms.html#programming-eventual-consistency\\\">KMS eventual consistency</a>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To reencrypt data\",\n                        \"documentation\": \"The following example reencrypts data with the specified KMS key.\",\n                        \"input\": {\n                            \"CiphertextBlob\": \"<binary data>\",\n                            \"DestinationKeyId\": \"0987dcba-09fe-87dc-65ba-ab0987654321\"\n                        },\n                        \"output\": {\n                            \"CiphertextBlob\": \"<binary data>\",\n                            \"KeyId\": \"arn:aws:kms:us-east-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321\",\n                            \"DestinationKeyMaterialId\": \"0b7fd7ddbac6eef27907413567cad8c810e2883dc8a7534067a82ee1142fc1e6\",\n                            \"DestinationEncryptionAlgorithm\": \"SYMMETRIC_DEFAULT\",\n                            \"SourceEncryptionAlgorithm\": \"SYMMETRIC_DEFAULT\",\n                            \"SourceKeyId\": \"arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab\",\n                            \"SourceKeyMaterialId\": \"1c6be7ddbac6eef27907413567cad8c810e2883dc8a7534067a82ee1142fc1e6\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.kms#ReEncryptRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CiphertextBlob\": {\n                    \"target\": \"com.amazonaws.kms#CiphertextType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Ciphertext of the data to reencrypt.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"SourceEncryptionContext\": {\n                    \"target\": \"com.amazonaws.kms#EncryptionContextType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the encryption context to use to decrypt the ciphertext. Enter the same\\n      encryption context that was used to encrypt the ciphertext.</p>\\n         <p>An <i>encryption context</i> is a collection of non-secret key-value pairs that represent additional authenticated data. \\nWhen you use an encryption context to encrypt data, you must specify the same (an exact case-sensitive match) encryption context to decrypt the data. An encryption context is supported\\nonly on operations with symmetric encryption KMS keys. On operations with symmetric encryption KMS keys, an encryption context is optional, but it is strongly recommended.</p>\\n         <p>For more information, see\\n<a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/encrypt_context.html\\\">Encryption context</a> in the <i>Key Management Service Developer Guide</i>.</p>\"\n                    }\n                },\n                \"SourceKeyId\": {\n                    \"target\": \"com.amazonaws.kms#KeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the KMS key that KMS will use to decrypt the ciphertext before it is\\n      re-encrypted.</p>\\n         <p>Enter a key ID of the KMS key that was used to encrypt the ciphertext. If you identify a\\n      different KMS key, the <code>ReEncrypt</code> operation throws an\\n        <code>IncorrectKeyException</code>.</p>\\n         <p>This parameter is required only when the ciphertext was encrypted under an asymmetric KMS\\n      key. If you used a symmetric encryption KMS key, KMS can get the KMS key from metadata that\\n      it adds to the symmetric ciphertext blob. However, it is always recommended as a best\\n      practice. This practice ensures that you use the KMS key that you intend.</p>\\n         <p>To specify a KMS key, use its key ID, key ARN, alias name, or alias ARN. When using an alias name, prefix it with <code>\\\"alias/\\\"</code>. To specify a KMS key in a different Amazon Web Services account, you must use the key ARN or alias ARN.</p>\\n         <p>For example:</p>\\n         <ul>\\n            <li>\\n               <p>Key ID: <code>1234abcd-12ab-34cd-56ef-1234567890ab</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Key ARN: <code>arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Alias name: <code>alias/ExampleAlias</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Alias ARN: <code>arn:aws:kms:us-east-2:111122223333:alias/ExampleAlias</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>To get the key ID and key ARN for a KMS key, use <a>ListKeys</a> or <a>DescribeKey</a>. To get the alias name and alias ARN, use <a>ListAliases</a>.</p>\"\n                    }\n                },\n                \"DestinationKeyId\": {\n                    \"target\": \"com.amazonaws.kms#KeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A unique identifier for the KMS key that is used to reencrypt the data. Specify a\\n      symmetric encryption KMS key or an asymmetric KMS key with a <code>KeyUsage</code> value of\\n        <code>ENCRYPT_DECRYPT</code>. To find the <code>KeyUsage</code> value of a KMS key, use the\\n        <a>DescribeKey</a> operation.</p>\\n         <p>To specify a KMS key, use its key ID, key ARN, alias name, or alias ARN. When using an alias name, prefix it with <code>\\\"alias/\\\"</code>. To specify a KMS key in a different Amazon Web Services account, you must use the key ARN or alias ARN.</p>\\n         <p>For example:</p>\\n         <ul>\\n            <li>\\n               <p>Key ID: <code>1234abcd-12ab-34cd-56ef-1234567890ab</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Key ARN: <code>arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Alias name: <code>alias/ExampleAlias</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Alias ARN: <code>arn:aws:kms:us-east-2:111122223333:alias/ExampleAlias</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>To get the key ID and key ARN for a KMS key, use <a>ListKeys</a> or <a>DescribeKey</a>. To get the alias name and alias ARN, use <a>ListAliases</a>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DestinationEncryptionContext\": {\n                    \"target\": \"com.amazonaws.kms#EncryptionContextType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies that encryption context to use when the reencrypting the data.</p>\\n         <important>\\n            <p>Do not include confidential or sensitive information in this field. This field may be displayed in plaintext in CloudTrail logs and other output.</p>\\n         </important>\\n         <p>A destination encryption context is valid only when the destination KMS key is a symmetric\\n      encryption KMS key. The standard ciphertext format for asymmetric KMS keys does not include\\n      fields for metadata.</p>\\n         <p>An <i>encryption context</i> is a collection of non-secret key-value pairs that represent additional authenticated data. \\nWhen you use an encryption context to encrypt data, you must specify the same (an exact case-sensitive match) encryption context to decrypt the data. An encryption context is supported\\nonly on operations with symmetric encryption KMS keys. On operations with symmetric encryption KMS keys, an encryption context is optional, but it is strongly recommended.</p>\\n         <p>For more information, see\\n<a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/encrypt_context.html\\\">Encryption context</a> in the <i>Key Management Service Developer Guide</i>.</p>\"\n                    }\n                },\n                \"SourceEncryptionAlgorithm\": {\n                    \"target\": \"com.amazonaws.kms#EncryptionAlgorithmSpec\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the encryption algorithm that KMS will use to decrypt the ciphertext before it\\n      is reencrypted. The default value, <code>SYMMETRIC_DEFAULT</code>, represents the algorithm\\n      used for symmetric encryption KMS keys.</p>\\n         <p>Specify the same algorithm that was used to encrypt the ciphertext. If you specify a\\n      different algorithm, the decrypt attempt fails.</p>\\n         <p>This parameter is required only when the ciphertext was encrypted under an asymmetric KMS\\n      key.</p>\"\n                    }\n                },\n                \"DestinationEncryptionAlgorithm\": {\n                    \"target\": \"com.amazonaws.kms#EncryptionAlgorithmSpec\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the encryption algorithm that KMS will use to reecrypt the data after it has\\n      decrypted it. The default value, <code>SYMMETRIC_DEFAULT</code>, represents the encryption\\n      algorithm used for symmetric encryption KMS keys.</p>\\n         <p>This parameter is required only when the destination KMS key is an asymmetric KMS\\n      key.</p>\"\n                    }\n                },\n                \"GrantTokens\": {\n                    \"target\": \"com.amazonaws.kms#GrantTokenList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of grant tokens.</p>\\n         <p>Use a grant token when your permission to call this operation comes from a new grant that has not yet achieved <i>eventual consistency</i>. For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/grants.html#grant_token\\\">Grant token</a> and <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/using-grant-token.html\\\">Using a grant token</a> in the\\n    <i>Key Management Service Developer Guide</i>.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.kms#NullableBooleanType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks if your request will succeed. <code>DryRun</code> is an optional parameter. </p>\\n         <p>To learn more about how to use this parameter, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/testing-permissions.html\\\">Testing your permissions</a> in the <i>Key Management Service Developer Guide</i>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.kms#ReEncryptResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CiphertextBlob\": {\n                    \"target\": \"com.amazonaws.kms#CiphertextType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The reencrypted data. When you use the HTTP API or the Amazon Web Services CLI, the value is Base64-encoded. Otherwise, it is not Base64-encoded.</p>\"\n                    }\n                },\n                \"SourceKeyId\": {\n                    \"target\": \"com.amazonaws.kms#KeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Unique identifier of the KMS key used to originally encrypt the data.</p>\"\n                    }\n                },\n                \"KeyId\": {\n                    \"target\": \"com.amazonaws.kms#KeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (<a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-id-key-ARN\\\">key ARN</a>) of the KMS key that was used to reencrypt the data.</p>\"\n                    }\n                },\n                \"SourceEncryptionAlgorithm\": {\n                    \"target\": \"com.amazonaws.kms#EncryptionAlgorithmSpec\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The encryption algorithm that was used to decrypt the ciphertext before it was\\n      reencrypted.</p>\"\n                    }\n                },\n                \"DestinationEncryptionAlgorithm\": {\n                    \"target\": \"com.amazonaws.kms#EncryptionAlgorithmSpec\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The encryption algorithm that was used to reencrypt the data.</p>\"\n                    }\n                },\n                \"SourceKeyMaterialId\": {\n                    \"target\": \"com.amazonaws.kms#BackingKeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The identifier of the key material used to originally encrypt the data. This field is\\n      present only when the original encryption used a symmetric encryption KMS key.</p>\"\n                    }\n                },\n                \"DestinationKeyMaterialId\": {\n                    \"target\": \"com.amazonaws.kms#BackingKeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The identifier of the key material used to reencrypt the data. This field is present only\\n      when data is reencrypted using a symmetric encryption KMS key.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.kms#RecipientInfo\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"KeyEncryptionAlgorithm\": {\n                    \"target\": \"com.amazonaws.kms#KeyEncryptionMechanism\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The encryption algorithm that KMS should use with the public key for an Amazon Web Services Nitro\\n      Enclave or NitroTPM to encrypt plaintext values for the response. The only valid value is\\n        <code>RSAES_OAEP_SHA_256</code>.</p>\"\n                    }\n                },\n                \"AttestationDocument\": {\n                    \"target\": \"com.amazonaws.kms#AttestationDocumentType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The attestation document for an Amazon Web Services Nitro Enclave or a NitroTPM. This document includes the enclave's\\n      public key.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains information about the party that receives the response from the API\\n      operation.</p>\\n         <p>This data type is designed to support Amazon Web Services Nitro Enclaves and Amazon Web Services NitroTPM, which lets you create an attested \\n      environment in Amazon EC2. For information about the interaction between KMS and Amazon Web Services Nitro Enclaves or Amazon Web Services NitroTPM, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/cryptographic-attestation.html\\\">Cryptographic attestation support in KMS</a> in the <i>Key Management Service Developer Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.kms#RegionType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 32\n                },\n                \"smithy.api#pattern\": \"^([a-z]+-){2,3}\\\\d+$\"\n            }\n        },\n        \"com.amazonaws.kms#ReplicateKey\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.kms#ReplicateKeyRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.kms#ReplicateKeyResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.kms#AlreadyExistsException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#DisabledException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#InvalidArnException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInternalException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInvalidStateException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#MalformedPolicyDocumentException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#NotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#TagException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#UnsupportedOperationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Replicates a multi-Region key into the specified Region. This operation creates a\\n      multi-Region replica key based on a multi-Region primary key in a different Region of the same\\n      Amazon Web Services partition. You can create multiple replicas of a primary key, but each must be in a\\n      different Region. To create a multi-Region primary key, use the <a>CreateKey</a>\\n      operation.</p>\\n         <p>This operation supports <i>multi-Region keys</i>, an KMS feature that lets you create multiple\\n      interoperable KMS keys in different Amazon Web Services Regions. Because these KMS keys have the same key ID, key\\n      material, and other metadata, you can use them interchangeably to encrypt data in one Amazon Web Services Region and decrypt\\n      it in a different Amazon Web Services Region without re-encrypting the data or making a cross-Region call. For more information about multi-Region keys, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/multi-region-keys-overview.html\\\">Multi-Region keys in KMS</a> in the <i>Key Management Service Developer Guide</i>.</p>\\n         <p>A <i>replica key</i> is a fully-functional KMS key that can be used\\n      independently of its primary and peer replica keys. A primary key and its replica keys share\\n      properties that make them interoperable. They have the same <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-id-key-id\\\">key ID</a> and key material. They also\\n      have the same key spec, key usage, key material origin, and automatic key rotation status.\\n      KMS automatically synchronizes these shared properties among related multi-Region keys. All\\n      other properties of a replica key can differ, including its <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html\\\">key policy</a>, <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/tagging-keys.html\\\">tags</a>, <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/kms-alias.html\\\">aliases</a>, and <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/key-state.html\\\">key state</a>. KMS pricing and quotas for KMS keys\\n      apply to each primary key and replica key.</p>\\n         <p>When this operation completes, the new replica key has a transient key state of\\n        <code>Creating</code>. This key state changes to <code>Enabled</code> (or\\n        <code>PendingImport</code>) after a few seconds when the process of creating the new replica\\n      key is complete. While the key state is <code>Creating</code>, you can manage key, but you\\n      cannot yet use it in cryptographic operations. If you are creating and using the replica key\\n      programmatically, retry on <code>KMSInvalidStateException</code> or call\\n        <code>DescribeKey</code> to check its <code>KeyState</code> value before using it. For\\n      details about the <code>Creating</code> key state, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/key-state.html\\\">Key states of KMS keys</a> in the\\n      <i>Key Management Service Developer Guide</i>.</p>\\n         <p>You cannot create more than one replica of a primary key in any Region. If the Region\\n      already includes a replica of the key you're trying to replicate, <code>ReplicateKey</code>\\n      returns an <code>AlreadyExistsException</code> error. If the key state of the existing replica\\n      is <code>PendingDeletion</code>, you can cancel the scheduled key deletion (<a>CancelKeyDeletion</a>) or wait for the key to be deleted. The new replica key you\\n      create will have the same <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/multi-region-keys-overview.html#mrk-sync-properties\\\">shared\\n        properties</a> as the original replica key.</p>\\n         <p>The CloudTrail log of a <code>ReplicateKey</code> operation records a\\n        <code>ReplicateKey</code> operation in the primary key's Region and a <a>CreateKey</a> operation in the replica key's Region.</p>\\n         <p>If you replicate a multi-Region primary key with imported key material, the replica key is\\n      created with no key material. You must import the same key material that you imported into the\\n      primary key.</p>\\n         <p>To convert a replica key to a primary key, use the <a>UpdatePrimaryRegion</a>\\n      operation.</p>\\n         <note>\\n            <p>\\n               <code>ReplicateKey</code> uses different default values for the <code>KeyPolicy</code>\\n        and <code>Tags</code> parameters than those used in the KMS console. For details, see the\\n        parameter descriptions.</p>\\n         </note>\\n         <p>\\n            <b>Cross-account use</b>: No. You cannot use this operation to\\n      create a replica key in a different Amazon Web Services account. </p>\\n         <p>\\n            <b>Required permissions</b>: </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>kms:ReplicateKey</code> on the primary key (in the primary key's Region).\\n          Include this permission in the primary key's key policy.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>kms:CreateKey</code> in an IAM policy in the replica Region.</p>\\n            </li>\\n            <li>\\n               <p>To use the <code>Tags</code> parameter, <code>kms:TagResource</code> in an IAM policy\\n          in the replica Region.</p>\\n            </li>\\n         </ul>\\n         <p>\\n            <b>Related operations</b>\\n         </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a>CreateKey</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>UpdatePrimaryRegion</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>\\n            <b>Eventual consistency</b>: The KMS API follows an eventual consistency model. \\n  For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/accessing-kms.html#programming-eventual-consistency\\\">KMS eventual consistency</a>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To replicate a multi-Region key in a different AWS Region\",\n                        \"documentation\": \"This example creates a multi-Region replica key in us-west-2 of a multi-Region primary key in us-east-1.\",\n                        \"input\": {\n                            \"KeyId\": \"arn:aws:kms:us-east-1:111122223333:key/mrk-1234abcd12ab34cd56ef1234567890ab\",\n                            \"ReplicaRegion\": \"us-west-2\"\n                        },\n                        \"output\": {\n                            \"ReplicaKeyMetadata\": {\n                                \"MultiRegion\": true,\n                                \"MultiRegionConfiguration\": {\n                                    \"MultiRegionKeyType\": \"REPLICA\",\n                                    \"PrimaryKey\": {\n                                        \"Arn\": \"arn:aws:kms:us-east-1:111122223333:key/mrk-1234abcd12ab34cd56ef1234567890ab\",\n                                        \"Region\": \"us-east-1\"\n                                    },\n                                    \"ReplicaKeys\": [\n                                        {\n                                            \"Arn\": \"arn:aws:kms:us-west-2:111122223333:key/mrk-1234abcd12ab34cd56ef1234567890ab\",\n                                            \"Region\": \"us-west-2\"\n                                        }\n                                    ]\n                                },\n                                \"AWSAccountId\": \"111122223333\",\n                                \"Arn\": \"arn:aws:kms:us-west-2:111122223333:key/mrk-1234abcd12ab34cd56ef1234567890ab\",\n                                \"CreationDate\": 1.607472987918E9,\n                                \"Description\": \"\",\n                                \"Enabled\": true,\n                                \"KeyId\": \"mrk-1234abcd12ab34cd56ef1234567890ab\",\n                                \"KeyManager\": \"CUSTOMER\",\n                                \"KeyState\": \"Enabled\",\n                                \"KeyUsage\": \"ENCRYPT_DECRYPT\",\n                                \"Origin\": \"AWS_KMS\",\n                                \"CustomerMasterKeySpec\": \"SYMMETRIC_DEFAULT\",\n                                \"EncryptionAlgorithms\": [\n                                    \"SYMMETRIC_DEFAULT\"\n                                ]\n                            },\n                            \"ReplicaPolicy\": \"{\\n  \\\"Version\\\" : \\\"2012-10-17\\\",\\n  \\\"Id\\\" : \\\"key-default-1\\\",...}\",\n                            \"ReplicaTags\": []\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.kms#ReplicateKeyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"KeyId\": {\n                    \"target\": \"com.amazonaws.kms#KeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Identifies the multi-Region primary key that is being replicated. To determine whether a\\n      KMS key is a multi-Region primary key, use the <a>DescribeKey</a> operation to\\n      check the value of the <code>MultiRegionKeyType</code> property.</p>\\n         <p>Specify the key ID or key ARN of a multi-Region primary key.</p>\\n         <p>For example:</p>\\n         <ul>\\n            <li>\\n               <p>Key ID: <code>mrk-1234abcd12ab34cd56ef1234567890ab</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Key ARN: <code>arn:aws:kms:us-east-2:111122223333:key/mrk-1234abcd12ab34cd56ef1234567890ab</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>To get the key ID and key ARN for a KMS key, use <a>ListKeys</a> or <a>DescribeKey</a>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ReplicaRegion\": {\n                    \"target\": \"com.amazonaws.kms#RegionType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Region ID of the Amazon Web Services Region for this replica key. </p>\\n         <p>Enter the Region ID, such as <code>us-east-1</code> or <code>ap-southeast-2</code>. For a\\n      list of Amazon Web Services Regions in which KMS is supported, see <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/kms.html#kms_region\\\">KMS service endpoints</a> in the\\n      <i>Amazon Web Services General Reference</i>.</p>\\n         <p>The replica must be in a different Amazon Web Services Region than its primary key and other replicas of\\n      that primary key, but in the same Amazon Web Services partition. KMS must be available in the replica\\n      Region. If the Region is not enabled by default, the Amazon Web Services account must be enabled in the\\n      Region. For information about Amazon Web Services partitions, see <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html\\\">Amazon Resource Names (ARNs)</a> in the\\n      <i>Amazon Web Services General Reference</i>. For information about enabling and disabling Regions, see <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/rande-manage.html#rande-manage-enable\\\">Enabling a\\n        Region</a> and <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/rande-manage.html#rande-manage-disable\\\">Disabling a Region</a> in the\\n      <i>Amazon Web Services General Reference</i>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Policy\": {\n                    \"target\": \"com.amazonaws.kms#PolicyType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The key policy to attach to the KMS key. This parameter is optional. If you do not provide\\n      a key policy, KMS attaches the <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/key-policy-default.html\\\">default key policy</a> to the KMS key.</p>\\n         <p>The key policy is not a shared property of multi-Region keys. You can specify the same key\\n      policy or a different key policy for each key in a set of related multi-Region keys. KMS\\n      does not synchronize this property.</p>\\n         <p>If you provide a key policy, it must meet the following criteria:</p>\\n         <ul>\\n            <li>\\n               <p>The key policy must allow the calling principal to make a\\n          subsequent <code>PutKeyPolicy</code> request on the KMS key.  This reduces the risk that\\n          the KMS key becomes unmanageable. For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/key-policy-default.html#prevent-unmanageable-key\\\">Default key policy</a> in the <i>Key Management Service Developer Guide</i>. (To omit\\n          this condition, set <code>BypassPolicyLockoutSafetyCheck</code> to true.)</p>\\n            </li>\\n            <li>\\n               <p>Each statement in the key policy must contain one or more principals. The principals\\n          in the key policy must exist and be visible to KMS. When you create a new Amazon Web Services\\n          principal, you might need to enforce a delay before including the new principal in a key\\n          policy because the new principal might not be immediately visible to KMS. For more\\n          information, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/troubleshoot_general.html#troubleshoot_general_eventual-consistency\\\">Changes that I make are not always immediately visible</a> in the <i>Amazon Web Services\\n            Identity and Access Management User Guide</i>.</p>\\n            </li>\\n         </ul>\\n         <p>A key policy document can include only the following characters:</p>\\n         <ul>\\n            <li>\\n               <p>Printable ASCII characters from the space character (<code>\\\\u0020</code>) through the end of the ASCII character range.</p>\\n            </li>\\n            <li>\\n               <p>Printable characters in the Basic Latin and Latin-1 Supplement character set (through <code>\\\\u00FF</code>).</p>\\n            </li>\\n            <li>\\n               <p>The tab (<code>\\\\u0009</code>), line feed (<code>\\\\u000A</code>), and carriage return (<code>\\\\u000D</code>) special characters</p>\\n            </li>\\n         </ul>\\n         <p>For information about key policies, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html\\\">Key policies in KMS</a> in the <i>Key Management Service Developer Guide</i>.\\n      For help writing and formatting a JSON policy document, see the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies.html\\\">IAM JSON Policy Reference</a> in the <i>\\n               <i>Identity and Access Management User Guide</i>\\n            </i>.</p>\"\n                    }\n                },\n                \"BypassPolicyLockoutSafetyCheck\": {\n                    \"target\": \"com.amazonaws.kms#BooleanType\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Skips (\\\"bypasses\\\") the key policy lockout safety check. The default value is false.</p>\\n         <important>\\n            <p>Setting this value to true increases the risk that the KMS key becomes unmanageable. Do\\n        not set this value to true indiscriminately.</p>\\n            <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/key-policy-default.html#prevent-unmanageable-key\\\">Default key policy</a> in the <i>Key Management Service Developer Guide</i>.</p>\\n         </important>\\n         <p>Use this parameter only when you intend to prevent the principal that is making the\\n      request from making a subsequent <a href=\\\"https://docs.aws.amazon.com/kms/latest/APIReference/API_PutKeyPolicy.html\\\">PutKeyPolicy</a>\\n      request on the KMS key.</p>\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.kms#DescriptionType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A description of the KMS key. The default value is an empty string (no\\n      description).</p>\\n         <important>\\n            <p>Do not include confidential or sensitive information in this field. This field may be displayed in plaintext in CloudTrail logs and other output.</p>\\n         </important>\\n         <p>The description is not a shared property of multi-Region keys. You can specify the same\\n      description or a different description for each key in a set of related multi-Region keys.\\n      KMS does not synchronize this property.</p>\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.kms#TagList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Assigns one or more tags to the replica key. Use this parameter to tag the KMS key when it\\n      is created. To tag an existing KMS key, use the <a>TagResource</a>\\n      operation.</p>\\n         <important>\\n            <p>Do not include confidential or sensitive information in this field. This field may be displayed in plaintext in CloudTrail logs and other output.</p>\\n         </important>\\n         <note>\\n            <p>Tagging or untagging a KMS key can allow or deny permission to the KMS key. For details, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/abac.html\\\">ABAC for KMS</a> in the <i>Key Management Service Developer Guide</i>.</p>\\n         </note>\\n         <p>To use this parameter, you must have <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/kms-api-permissions-reference.html\\\">kms:TagResource</a> permission in an IAM policy.</p>\\n         <p>Tags are not a shared property of multi-Region keys. You can specify the same tags or\\n      different tags for each key in a set of related multi-Region keys. KMS does not synchronize\\n      this property.</p>\\n         <p>Each tag consists of a tag key and a tag value. Both the tag key and the tag value are\\n      required, but the tag value can be an empty (null) string. You cannot have more than one tag\\n      on a KMS key with the same tag key. If you specify an existing tag key with a different tag\\n      value, KMS replaces the current tag value with the specified one.</p>\\n         <p>When you add tags to an Amazon Web Services resource, Amazon Web Services generates a cost allocation\\n              report with usage and costs aggregated by tags. Tags can also be used to control access to a KMS key. For details,\\n              see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/tagging-keys.html\\\">Tags in KMS</a>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.kms#ReplicateKeyResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ReplicaKeyMetadata\": {\n                    \"target\": \"com.amazonaws.kms#KeyMetadata\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Displays details about the new replica key, including its Amazon Resource Name (<a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-id-key-ARN\\\">key ARN</a>) and\\n      <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/key-state.html\\\">Key states of KMS keys</a>. It also includes the ARN and Amazon Web Services Region of its primary key and other\\n      replica keys.</p>\"\n                    }\n                },\n                \"ReplicaPolicy\": {\n                    \"target\": \"com.amazonaws.kms#PolicyType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The key policy of the new replica key. The value is a key policy document in JSON\\n      format.</p>\"\n                    }\n                },\n                \"ReplicaTags\": {\n                    \"target\": \"com.amazonaws.kms#TagList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags on the new replica key. The value is a list of tag key and tag value\\n      pairs.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.kms#RetireGrant\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.kms#RetireGrantRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.kms#DependencyTimeoutException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#DryRunOperationException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#InvalidArnException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#InvalidGrantIdException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#InvalidGrantTokenException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInternalException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInvalidStateException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#NotFoundException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes a grant. Typically, you retire a grant when you no longer need its permissions. To\\n      identify the grant to retire, use a <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/grants.html#grant_token\\\">grant token</a>, or both the grant ID and a\\n      key identifier (key ID or key ARN) of the KMS key. The <a>CreateGrant</a> operation\\n      returns both values.</p>\\n         <p>This operation can be called by the <i>retiring principal</i> for a grant,\\n      by the <i>grantee principal</i> if the grant allows the <code>RetireGrant</code>\\n      operation, and by the Amazon Web Services account in which the grant is created. It can also be called by\\n      principals to whom permission for retiring a grant is delegated.</p>\\n         <p>For detailed information about grants, including grant terminology, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/grants.html\\\">Grants in KMS</a> in the\\n        <i>\\n               <i>Key Management Service Developer Guide</i>\\n            </i>. For examples of creating grants in several\\n      programming languages, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/example_kms_CreateGrant_section.html\\\">Use CreateGrant with an Amazon Web Services SDK or CLI</a>. </p>\\n         <p>\\n            <b>Cross-account use</b>: Yes. You can retire a grant on a KMS\\n      key in a different Amazon Web Services account.</p>\\n         <p>\\n            <b>Required permissions</b>: Permission to retire a grant is\\n      determined primarily by the grant. For details, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/grant-delete.html\\\">Retiring and revoking grants</a> in the\\n      <i>Key Management Service Developer Guide</i>.</p>\\n         <p>\\n            <b>Related operations:</b>\\n         </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a>CreateGrant</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>ListGrants</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>ListRetirableGrants</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>RevokeGrant</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>\\n            <b>Eventual consistency</b>: The KMS API follows an eventual consistency model. \\n  For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/accessing-kms.html#programming-eventual-consistency\\\">KMS eventual consistency</a>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To retire a grant\",\n                        \"documentation\": \"The following example retires a grant.\",\n                        \"input\": {\n                            \"KeyId\": \"arn:aws:kms:us-east-2:444455556666:key/1234abcd-12ab-34cd-56ef-1234567890ab\",\n                            \"GrantId\": \"0c237476b39f8bc44e45212e08498fbe3151305030726c0590dd8d3e9f3d6a60\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.kms#RetireGrantRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"GrantToken\": {\n                    \"target\": \"com.amazonaws.kms#GrantTokenType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Identifies the grant to be retired. You can use a grant token to identify a new grant even\\n      before it has achieved eventual consistency.</p>\\n         <p>Only the <a>CreateGrant</a> operation returns a grant token. For details, see\\n        <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/grants.html#grant_token\\\">Grant token</a>\\n      and <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/grants.html#terms-eventual-consistency\\\">Eventual consistency</a> in the <i>Key Management Service Developer Guide</i>.</p>\"\n                    }\n                },\n                \"KeyId\": {\n                    \"target\": \"com.amazonaws.kms#KeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The key ARN KMS key associated with the grant. To find the key ARN, use the <a>ListKeys</a> operation.</p>\\n         <p>For example: <code>arn:aws:kms:us-east-2:444455556666:key/1234abcd-12ab-34cd-56ef-1234567890ab</code>\\n         </p>\"\n                    }\n                },\n                \"GrantId\": {\n                    \"target\": \"com.amazonaws.kms#GrantIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Identifies the grant to retire. To get the grant ID, use <a>CreateGrant</a>,\\n        <a>ListGrants</a>, or <a>ListRetirableGrants</a>.</p>\\n         <ul>\\n            <li>\\n               <p>Grant ID Example -\\n          0123456789012345678901234567890123456789012345678901234567890123</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.kms#NullableBooleanType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks if your request will succeed. <code>DryRun</code> is an optional parameter. </p>\\n         <p>To learn more about how to use this parameter, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/testing-permissions.html\\\">Testing your permissions</a> in the <i>Key Management Service Developer Guide</i>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.kms#RevokeGrant\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.kms#RevokeGrantRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.kms#DependencyTimeoutException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#DryRunOperationException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#InvalidArnException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#InvalidGrantIdException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInternalException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInvalidStateException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#NotFoundException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the specified grant. You revoke a grant to terminate the permissions that the\\n      grant allows. For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/grant-delete.html\\\">Retiring and revoking grants</a> in the\\n        <i>\\n               <i>Key Management Service Developer Guide</i>\\n            </i>.</p>\\n         <p>When you create, retire, or revoke a grant, there might be a brief delay, usually less than five minutes, until the grant is available throughout KMS. This state is known as <i>eventual consistency</i>. For details, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/grants.html#terms-eventual-consistency\\\">Eventual consistency</a> in\\n      the <i>\\n               <i>Key Management Service Developer Guide</i>\\n            </i>. </p>\\n         <p>For detailed information about grants, including grant terminology, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/grants.html\\\">Grants in KMS</a> in the\\n        <i>\\n               <i>Key Management Service Developer Guide</i>\\n            </i>. For examples of creating grants in several\\n      programming languages, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/example_kms_CreateGrant_section.html\\\">Use CreateGrant with an Amazon Web Services SDK or CLI</a>. </p>\\n         <p>\\n            <b>Cross-account use</b>: Yes. To perform this operation on a KMS key in a different Amazon Web Services account, specify the key\\n  ARN in the value of the <code>KeyId</code> parameter.</p>\\n         <p>\\n            <b>Required permissions</b>: <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/kms-api-permissions-reference.html\\\">kms:RevokeGrant</a> (key policy).</p>\\n         <p>\\n            <b>Related operations:</b>\\n         </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a>CreateGrant</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>ListGrants</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>ListRetirableGrants</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>RetireGrant</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>\\n            <b>Eventual consistency</b>: The KMS API follows an eventual consistency model. \\n  For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/accessing-kms.html#programming-eventual-consistency\\\">KMS eventual consistency</a>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To revoke a grant\",\n                        \"documentation\": \"The following example revokes a grant.\",\n                        \"input\": {\n                            \"KeyId\": \"1234abcd-12ab-34cd-56ef-1234567890ab\",\n                            \"GrantId\": \"0c237476b39f8bc44e45212e08498fbe3151305030726c0590dd8d3e9f3d6a60\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.kms#RevokeGrantRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"KeyId\": {\n                    \"target\": \"com.amazonaws.kms#KeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A unique identifier for the KMS key associated with the grant. To get the key ID and key\\n      ARN for a KMS key, use <a>ListKeys</a> or <a>DescribeKey</a>.</p>\\n         <p>Specify the key ID or key ARN of the KMS key. To specify a KMS key in a\\ndifferent Amazon Web Services account, you must use the key ARN.</p>\\n         <p>For example:</p>\\n         <ul>\\n            <li>\\n               <p>Key ID: <code>1234abcd-12ab-34cd-56ef-1234567890ab</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Key ARN: <code>arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>To get the key ID and key ARN for a KMS key, use <a>ListKeys</a> or <a>DescribeKey</a>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"GrantId\": {\n                    \"target\": \"com.amazonaws.kms#GrantIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Identifies the grant to revoke. To get the grant ID, use <a>CreateGrant</a>,\\n        <a>ListGrants</a>, or <a>ListRetirableGrants</a>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.kms#NullableBooleanType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks if your request will succeed. <code>DryRun</code> is an optional parameter. </p>\\n         <p>To learn more about how to use this parameter, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/testing-permissions.html\\\">Testing your permissions</a> in the <i>Key Management Service Developer Guide</i>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.kms#RotateKeyOnDemand\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.kms#RotateKeyOnDemandRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.kms#RotateKeyOnDemandResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.kms#ConflictException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#DependencyTimeoutException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#DisabledException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#InvalidArnException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInternalException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInvalidStateException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#NotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#UnsupportedOperationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Immediately initiates rotation of the key material of the specified symmetric encryption\\n      KMS key.</p>\\n         <p>You can perform <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/rotating-keys-on-demand.html\\\">on-demand rotation</a> of the key\\n      material in customer managed KMS keys, regardless of whether or not <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/rotating-keys-enable-disable.html\\\">automatic key\\n        rotation</a> is enabled. On-demand rotations do not change existing automatic rotation\\n      schedules. For example, consider a KMS key that has automatic key rotation enabled with a\\n      rotation period of 730 days. If the key is scheduled to automatically rotate on April 14,\\n      2024, and you perform an on-demand rotation on April 10, 2024, the key will automatically\\n      rotate, as scheduled, on April 14, 2024 and every 730 days thereafter.</p>\\n         <note>\\n            <p>You can perform on-demand key rotation a <b>maximum of 10\\n          times</b> per KMS key. You can use the KMS console to view the number of\\n        remaining on-demand rotations available for a KMS key.</p>\\n         </note>\\n         <p>You can use <a>GetKeyRotationStatus</a> to identify any in progress on-demand\\n      rotations. You can use <a>ListKeyRotations</a> to identify the date that completed\\n      on-demand rotations were performed. You can monitor rotation of the key material for your KMS\\n      keys in CloudTrail and Amazon CloudWatch.</p>\\n         <p>On-demand key rotation is supported only on symmetric encryption KMS keys. You cannot\\n      perform on-demand rotation of <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/symmetric-asymmetric.html\\\">asymmetric KMS keys</a>, <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/hmac.html\\\">HMAC KMS keys</a>, multi-Region KMS\\n      keys with <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/importing-keys.html\\\">imported key\\n        material</a>, or KMS keys in a <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/key-store-overview.html\\\">custom key store</a>. When you initiate on-demand key\\n      rotation on a symmetric encryption KMS key with imported key material, you must have already\\n      imported <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/importing-keys-import-key-material.html\\\">new key material</a> and that\\n      key material's state should be <code>PENDING_ROTATION</code>. Use the\\n        <code>ListKeyRotations</code> operation to check the state of all key materials associated\\n      with a KMS key. To perform on-demand rotation of a set of related <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/rotate-keys.html#multi-region-rotate\\\">multi-Region keys</a>, invoke\\n      the on-demand rotation on the primary key.</p>\\n         <p>You cannot initiate on-demand rotation of <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-key\\\">Amazon Web Services managed KMS keys</a>. KMS\\n      always rotates the key material of Amazon Web Services managed keys every year. Rotation of <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-owned-key\\\">Amazon Web Services owned KMS\\n        keys</a> is managed by the Amazon Web Services service that owns the key.</p>\\n         <p>The KMS key that you use for this operation must be in a compatible key state. For\\ndetails, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/key-state.html\\\">Key states of KMS keys</a> in the <i>Key Management Service Developer Guide</i>.</p>\\n         <p>\\n            <b>Cross-account use</b>: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.</p>\\n         <p>\\n            <b>Required permissions</b>: <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/kms-api-permissions-reference.html\\\">kms:RotateKeyOnDemand</a> (key policy)</p>\\n         <p>\\n            <b>Related operations:</b>\\n         </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a>EnableKeyRotation</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>DisableKeyRotation</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>GetKeyRotationStatus</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>ImportKeyMaterial</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>ListKeyRotations</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>\\n            <b>Eventual consistency</b>: The KMS API follows an eventual consistency model. \\n  For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/accessing-kms.html#programming-eventual-consistency\\\">KMS eventual consistency</a>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To perform on-demand rotation of key material\",\n                        \"documentation\": \"The following example immediately initiates rotation of the key material for the specified KMS key.\",\n                        \"input\": {\n                            \"KeyId\": \"1234abcd-12ab-34cd-56ef-1234567890ab\"\n                        },\n                        \"output\": {\n                            \"KeyId\": \"1234abcd-12ab-34cd-56ef-1234567890ab\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.kms#RotateKeyOnDemandRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"KeyId\": {\n                    \"target\": \"com.amazonaws.kms#KeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Identifies a symmetric encryption KMS key. You cannot perform on-demand rotation of <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/symmetric-asymmetric.html\\\">asymmetric KMS\\n        keys</a>, <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/hmac.html\\\">HMAC KMS\\n      keys</a>, multi-Region KMS keys with <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/importing-keys.html\\\">imported key material</a>, or KMS keys in a\\n      <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/key-store-overview.html\\\">custom key store</a>. To perform on-demand rotation of a set of related <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/rotate-keys.html#multi-region-rotate\\\">multi-Region\\n        keys</a>, invoke the on-demand rotation on the primary key.</p>\\n         <p>Specify the key ID or key ARN of the KMS key.</p>\\n         <p>For example:</p>\\n         <ul>\\n            <li>\\n               <p>Key ID: <code>1234abcd-12ab-34cd-56ef-1234567890ab</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Key ARN: <code>arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>To get the key ID and key ARN for a KMS key, use <a>ListKeys</a> or <a>DescribeKey</a>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.kms#RotateKeyOnDemandResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"KeyId\": {\n                    \"target\": \"com.amazonaws.kms#KeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Identifies the symmetric encryption KMS key that you initiated on-demand rotation\\n      on.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.kms#RotationPeriodInDaysType\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 90,\n                    \"max\": 2560\n                }\n            }\n        },\n        \"com.amazonaws.kms#RotationType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"AUTOMATIC\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AUTOMATIC\"\n                    }\n                },\n                \"ON_DEMAND\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ON_DEMAND\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.kms#RotationsList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.kms#RotationsListEntry\"\n            }\n        },\n        \"com.amazonaws.kms#RotationsListEntry\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"KeyId\": {\n                    \"target\": \"com.amazonaws.kms#KeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Unique identifier of the key.</p>\"\n                    }\n                },\n                \"KeyMaterialId\": {\n                    \"target\": \"com.amazonaws.kms#BackingKeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Unique identifier of the key material. </p>\"\n                    }\n                },\n                \"KeyMaterialDescription\": {\n                    \"target\": \"com.amazonaws.kms#KeyMaterialDescriptionType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>User-specified description of the key material. This field is only present for symmetric\\n      encryption KMS keys with <code>EXTERNAL</code> origin.</p>\"\n                    }\n                },\n                \"ImportState\": {\n                    \"target\": \"com.amazonaws.kms#ImportState\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates if the key material is currently imported into KMS. It has two possible\\n      values: <code>IMPORTED</code> or <code>PENDING_IMPORT</code>. This field is only present for\\n      symmetric encryption KMS keys with <code>EXTERNAL</code> origin.</p>\"\n                    }\n                },\n                \"KeyMaterialState\": {\n                    \"target\": \"com.amazonaws.kms#KeyMaterialState\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>There are three possible values for this field: <code>CURRENT</code>,\\n        <code>NON_CURRENT</code> and <code>PENDING_ROTATION</code>. KMS uses <code>CURRENT</code>\\n      key material for both encryption and decryption and <code>NON_CURRENT</code> key material only\\n      for decryption. <code>PENDING_ROTATION</code> identifies key material that has been imported\\n      for on-demand key rotation but the rotation hasn't completed. Key material in\\n        <code>PENDING_ROTATION</code> is not permanently associated with the KMS key. You can delete\\n      this key material and import different key material in its place. The\\n        <code>PENDING_ROTATION</code> value is only used in symmetric encryption keys with imported\\n      key material. The other values, <code>CURRENT</code> and <code>NON_CURRENT</code>, are used\\n      for all KMS keys that support automatic or on-demand key rotation.</p>\"\n                    }\n                },\n                \"ExpirationModel\": {\n                    \"target\": \"com.amazonaws.kms#ExpirationModelType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates if the key material is configured to automatically expire. There are two\\n      possible values for this field: <code>KEY_MATERIAL_EXPIRES</code> and\\n        <code>KEY_MATERIAL_DOES_NOT_EXPIRE</code>. For any key material that expires, the expiration\\n      date and time is indicated in <code>ValidTo</code>. This field is only present for symmetric\\n      encryption KMS keys with <code>EXTERNAL</code> origin.</p>\"\n                    }\n                },\n                \"ValidTo\": {\n                    \"target\": \"com.amazonaws.kms#DateType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Date and time at which the key material expires. This field is only present for symmetric\\n      encryption KMS keys with <code>EXTERNAL</code> origin in rotation list entries with an\\n        <code>ExpirationModel</code> value of <code>KEY_MATERIAL_EXPIRES</code>.</p>\"\n                    }\n                },\n                \"RotationDate\": {\n                    \"target\": \"com.amazonaws.kms#DateType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Date and time that the key material rotation completed. Formatted as Unix time. This field\\n      is not present for the first key material or an imported key material in\\n        <code>PENDING_ROTATION</code> state.</p>\"\n                    }\n                },\n                \"RotationType\": {\n                    \"target\": \"com.amazonaws.kms#RotationType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Identifies whether the key material rotation was a scheduled <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/rotating-keys-enable-disable.html\\\">automatic rotation</a> or an <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/rotating-keys-on-demand.html\\\">on-demand\\n        rotation</a>. This field is not present for the first key material or an imported key\\n      material in <code>PENDING_ROTATION</code> state.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Each entry contains information about one of the key materials associated with a KMS\\n      key.</p>\"\n            }\n        },\n        \"com.amazonaws.kms#ScheduleKeyDeletion\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.kms#ScheduleKeyDeletionRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.kms#ScheduleKeyDeletionResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.kms#DependencyTimeoutException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#InvalidArnException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInternalException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInvalidStateException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#NotFoundException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Schedules the deletion of a KMS key. By default, KMS applies a waiting period of 30\\n      days, but you can specify a waiting period of 7-30 days. When this operation is successful,\\n      the key state of the KMS key changes to <code>PendingDeletion</code> and the key can't be used\\n      in any cryptographic operations. It remains in this state for the duration of the waiting\\n      period. Before the waiting period ends, you can use <a>CancelKeyDeletion</a> to\\n      cancel the deletion of the KMS key. After the waiting period ends, KMS deletes the KMS key,\\n      its key material, and all KMS data associated with it, including all aliases that refer to\\n      it.</p>\\n         <important>\\n            <p>Deleting a KMS key is a destructive and potentially dangerous operation. When a KMS key\\n        is deleted, all data that was encrypted under the KMS key is unrecoverable. (The only\\n        exception is a <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/multi-region-keys-delete.html\\\">multi-Region replica key</a>, or an <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/deleting-keys.html#import-delete-key\\\">asymmetric or HMAC KMS key with\\n          imported key material</a>.) To prevent the use of a KMS key without deleting it, use\\n          <a>DisableKey</a>. </p>\\n         </important>\\n         <p>You can schedule the deletion of a multi-Region primary key and its replica keys at any\\n      time. However, KMS will not delete a multi-Region primary key with existing replica keys. If\\n      you schedule the deletion of a primary key with replicas, its key state changes to\\n        <code>PendingReplicaDeletion</code> and it cannot be replicated or used in cryptographic\\n      operations. This status can continue indefinitely. When the last of its replicas keys is\\n      deleted (not just scheduled), the key state of the primary key changes to\\n        <code>PendingDeletion</code> and its waiting period (<code>PendingWindowInDays</code>)\\n      begins. For details, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/deleting-keys.html#deleting-mrks\\\">Deleting multi-Region keys</a> in\\n      the <i>Key Management Service Developer Guide</i>.</p>\\n         <p>When KMS <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/deleting-keys.html#delete-cmk-keystore\\\">deletes a KMS key from an CloudHSM\\n        key store</a>, it makes a best effort to delete the associated key material from the\\n      associated CloudHSM cluster. However, you might need to manually <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/fix-keystore.html#fix-keystore-orphaned-key\\\">delete the orphaned key\\n        material</a> from the cluster and its backups. <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/deleting-keys.html#delete-xks-key\\\">Deleting a KMS key from an external key\\n        store</a> has no effect on the associated external key. However, for both types of\\n      custom key stores, deleting a KMS key is destructive and irreversible. You cannot decrypt\\n      ciphertext encrypted under the KMS key by using only its associated external key or CloudHSM key.\\n      Also, you cannot recreate a KMS key in an external key store by creating a new KMS key with\\n      the same key material.</p>\\n         <p>For more information about scheduling a KMS key for deletion, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/deleting-keys.html\\\">Deleting KMS keys</a> in the\\n      <i>Key Management Service Developer Guide</i>.</p>\\n         <p>The KMS key that you use for this operation must be in a compatible key state. For\\ndetails, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/key-state.html\\\">Key states of KMS keys</a> in the <i>Key Management Service Developer Guide</i>.</p>\\n         <p>\\n            <b>Cross-account use</b>: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.</p>\\n         <p>\\n            <b>Required permissions</b>: kms:ScheduleKeyDeletion (key\\n      policy)</p>\\n         <p>\\n            <b>Related operations</b>\\n         </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a>CancelKeyDeletion</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>DisableKey</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>\\n            <b>Eventual consistency</b>: The KMS API follows an eventual consistency model. \\n  For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/accessing-kms.html#programming-eventual-consistency\\\">KMS eventual consistency</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.kms#ScheduleKeyDeletionRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"KeyId\": {\n                    \"target\": \"com.amazonaws.kms#KeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The unique identifier of the KMS key to delete.</p>\\n         <p>Specify the key ID or key ARN of the KMS key.</p>\\n         <p>For example:</p>\\n         <ul>\\n            <li>\\n               <p>Key ID: <code>1234abcd-12ab-34cd-56ef-1234567890ab</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Key ARN: <code>arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>To get the key ID and key ARN for a KMS key, use <a>ListKeys</a> or <a>DescribeKey</a>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"PendingWindowInDays\": {\n                    \"target\": \"com.amazonaws.kms#PendingWindowInDaysType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The waiting period, specified in number of days. After the waiting period ends, KMS\\n      deletes the KMS key.</p>\\n         <p>If the KMS key is a multi-Region primary key with replica keys, the waiting period begins\\n      when the last of its replica keys is deleted. Otherwise, the waiting period begins\\n      immediately.</p>\\n         <p>This value is optional. If you include a value, it must be between 7 and 30, inclusive. If\\n      you do not include a value, it defaults to 30. You can use the <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/conditions-kms.html#conditions-kms-schedule-key-deletion-pending-window-in-days\\\">\\n               <code>kms:ScheduleKeyDeletionPendingWindowInDays</code>\\n            </a> condition key to further\\n      constrain the values that principals can specify in the <code>PendingWindowInDays</code>\\n      parameter.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.kms#ScheduleKeyDeletionResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"KeyId\": {\n                    \"target\": \"com.amazonaws.kms#KeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (<a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-id-key-ARN\\\">key ARN</a>) of the KMS key whose deletion is scheduled.</p>\"\n                    }\n                },\n                \"DeletionDate\": {\n                    \"target\": \"com.amazonaws.kms#DateType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time after which KMS deletes the KMS key.</p>\\n         <p>If the KMS key is a multi-Region primary key with replica keys, this field does not\\n      appear. The deletion date for the primary key isn't known until its last replica key is\\n      deleted.</p>\"\n                    }\n                },\n                \"KeyState\": {\n                    \"target\": \"com.amazonaws.kms#KeyState\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The current status of the KMS key.</p>\\n         <p>For more information about how key state affects the use of a KMS key, see\\n      <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/key-state.html\\\">Key states of KMS keys</a> in the <i>Key Management Service Developer Guide</i>.</p>\"\n                    }\n                },\n                \"PendingWindowInDays\": {\n                    \"target\": \"com.amazonaws.kms#PendingWindowInDaysType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The waiting period before the KMS key is deleted. </p>\\n         <p>If the KMS key is a multi-Region primary key with replicas, the waiting period begins when\\n      the last of its replica keys is deleted. Otherwise, the waiting period begins\\n      immediately.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.kms#Sign\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.kms#SignRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.kms#SignResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.kms#DependencyTimeoutException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#DisabledException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#DryRunOperationException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#InvalidGrantTokenException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#InvalidKeyUsageException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KeyUnavailableException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInternalException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInvalidStateException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#NotFoundException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates a <a href=\\\"https://en.wikipedia.org/wiki/Digital_signature\\\">digital\\n        signature</a> for a message or message digest by using the private key in an asymmetric\\n      signing KMS key. To verify the signature, use the <a>Verify</a> operation, or use\\n      the public key in the same asymmetric KMS key outside of KMS. For information about asymmetric KMS keys, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/symmetric-asymmetric.html\\\">Asymmetric KMS keys</a> in the <i>Key Management Service Developer Guide</i>.</p>\\n         <p>Digital signatures are generated and verified by using asymmetric key pair, such as an\\n      RSA, ECC, or ML-DSA pair that is represented by an asymmetric KMS key. The key owner (or an\\n      authorized user) uses their private key to sign a message. Anyone with the public key can\\n      verify that the message was signed with that particular private key and that the message\\n      hasn't changed since it was signed. </p>\\n         <p>To use the <code>Sign</code> operation, provide the following information:</p>\\n         <ul>\\n            <li>\\n               <p>Use the <code>KeyId</code> parameter to identify an asymmetric KMS key with a\\n            <code>KeyUsage</code> value of <code>SIGN_VERIFY</code>. To get the\\n            <code>KeyUsage</code> value of a KMS key, use the <a>DescribeKey</a>\\n          operation. The caller must have <code>kms:Sign</code> permission on the KMS key.</p>\\n            </li>\\n            <li>\\n               <p>Use the <code>Message</code> parameter to specify the message or message digest to\\n          sign. You can submit messages of up to 4096 bytes. To sign a larger message, generate a\\n          hash digest of the message, and then provide the hash digest in the <code>Message</code>\\n          parameter. To indicate whether the message is a full message, a digest, or an ML-DSA\\n          EXTERNAL_MU, use the <code>MessageType</code> parameter.</p>\\n            </li>\\n            <li>\\n               <p>Choose a signing algorithm that is compatible with the KMS key. </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>When signing a message, be sure to record the KMS key and the signing algorithm. This\\n        information is required to verify the signature.</p>\\n         </important>\\n         <note>\\n            <p>Best practices recommend that you limit the time during which any signature is\\n        effective. This deters an attack where the actor uses a signed message to establish validity\\n        repeatedly or long after the message is superseded. Signatures do not include a timestamp,\\n        but you can include a timestamp in the signed message to help you detect when its time to\\n        refresh the signature. </p>\\n         </note>\\n         <p>To verify the signature that this operation generates, use the <a>Verify</a>\\n      operation. Or use the <a>GetPublicKey</a> operation to download the public key and\\n      then use the public key to verify the signature outside of KMS. </p>\\n         <p>The KMS key that you use for this operation must be in a compatible key state. For\\ndetails, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/key-state.html\\\">Key states of KMS keys</a> in the <i>Key Management Service Developer Guide</i>.</p>\\n         <p>\\n            <b>Cross-account use</b>: Yes. To perform this operation with a KMS key in a different Amazon Web Services account, specify\\n  the key ARN or alias ARN in the value of the <code>KeyId</code> parameter.</p>\\n         <p>\\n            <b>Required permissions</b>: <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/kms-api-permissions-reference.html\\\">kms:Sign</a> (key policy)</p>\\n         <p>\\n            <b>Related operations</b>: <a>Verify</a>\\n         </p>\\n         <p>\\n            <b>Eventual consistency</b>: The KMS API follows an eventual consistency model. \\n  For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/accessing-kms.html#programming-eventual-consistency\\\">KMS eventual consistency</a>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To digitally sign a message digest with an asymmetric KMS key.\",\n                        \"documentation\": \"This operation uses the private key in an asymmetric RSA signing KMS key to generate a digital signature for a message digest. In this example, a large message was hashed and the resulting digest is provided in the Message parameter. To tell KMS not to hash the message again, the MessageType field is set to DIGEST\",\n                        \"input\": {\n                            \"KeyId\": \"alias/RSA_signing_key\",\n                            \"Message\": \"<message digest to be signed>\",\n                            \"MessageType\": \"DIGEST\",\n                            \"SigningAlgorithm\": \"RSASSA_PKCS1_V1_5_SHA_256\"\n                        },\n                        \"output\": {\n                            \"KeyId\": \"arn:aws:kms:us-east-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321\",\n                            \"Signature\": \"<binary data>\",\n                            \"SigningAlgorithm\": \"RSASSA_PKCS1_V1_5_SHA_256\"\n                        }\n                    },\n                    {\n                        \"title\": \"To digitally sign a message with an asymmetric KMS key.\",\n                        \"documentation\": \"This operation uses the private key in an asymmetric elliptic curve (ECC) KMS key to generate a digital signature for a given message.\",\n                        \"input\": {\n                            \"KeyId\": \"alias/ECC_signing_key\",\n                            \"Message\": \"<message to be signed>\",\n                            \"MessageType\": \"RAW\",\n                            \"SigningAlgorithm\": \"ECDSA_SHA_384\"\n                        },\n                        \"output\": {\n                            \"KeyId\": \"arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab\",\n                            \"Signature\": \"<binary data>\",\n                            \"SigningAlgorithm\": \"ECDSA_SHA_384\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.kms#SignRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"KeyId\": {\n                    \"target\": \"com.amazonaws.kms#KeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Identifies an asymmetric KMS key. KMS uses the private key in the asymmetric KMS key to\\n      sign the message. The <code>KeyUsage</code> type of the KMS key must be\\n        <code>SIGN_VERIFY</code>. To find the <code>KeyUsage</code> of a KMS key, use the <a>DescribeKey</a> operation.</p>\\n         <p>To specify a KMS key, use its key ID, key ARN, alias name, or alias ARN. When using an alias name, prefix it with <code>\\\"alias/\\\"</code>. To specify a KMS key in a different Amazon Web Services account, you must use the key ARN or alias ARN.</p>\\n         <p>For example:</p>\\n         <ul>\\n            <li>\\n               <p>Key ID: <code>1234abcd-12ab-34cd-56ef-1234567890ab</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Key ARN: <code>arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Alias name: <code>alias/ExampleAlias</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Alias ARN: <code>arn:aws:kms:us-east-2:111122223333:alias/ExampleAlias</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>To get the key ID and key ARN for a KMS key, use <a>ListKeys</a> or <a>DescribeKey</a>. To get the alias name and alias ARN, use <a>ListAliases</a>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Message\": {\n                    \"target\": \"com.amazonaws.kms#PlaintextType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the message or message digest to sign. Messages can be 0-4096 bytes. To sign a\\n      larger message, provide a message digest.</p>\\n         <p>If you provide a message digest, use the <code>DIGEST</code> value of\\n        <code>MessageType</code> to prevent the digest from being hashed again while signing.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"MessageType\": {\n                    \"target\": \"com.amazonaws.kms#MessageType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Tells KMS whether the value of the <code>Message</code> parameter should be hashed as\\n      part of the signing algorithm. Use <code>RAW</code> for unhashed messages; use\\n        <code>DIGEST</code> for message digests, which are already hashed; use\\n        <code>EXTERNAL_MU</code> for 64-byte representative μ used in ML-DSA signing as defined\\n      in NIST FIPS 204 Section 6.2.</p>\\n         <p>When the value of <code>MessageType</code> is <code>RAW</code>, KMS uses the standard\\n      signing algorithm, which begins with a hash function. When the value is <code>DIGEST</code>,\\n      KMS skips the hashing step in the signing algorithm. When the value is\\n        <code>EXTERNAL_MU</code> KMS skips the concatenated hashing of the public key hash and the\\n      message done in the ML-DSA signing algorithm.</p>\\n         <important>\\n            <p>Use the <code>DIGEST</code> or <code>EXTERNAL_MU</code> value only when the value of the\\n          <code>Message</code> parameter is a message digest. If you use the <code>DIGEST</code>\\n        value with an unhashed message, the security of the signing operation can be\\n        compromised.</p>\\n         </important>\\n         <p>When the value of <code>MessageType</code> is <code>DIGEST</code>, the length of the\\n        <code>Message</code> value must match the length of hashed messages for the specified\\n      signing algorithm.</p>\\n         <p>When the value of <code>MessageType</code> is <code>EXTERNAL_MU</code> the length of the\\n        <code>Message</code> value must be 64 bytes.</p>\\n         <p>You can submit a message digest and omit the <code>MessageType</code> or specify\\n        <code>RAW</code> so the digest is hashed again while signing. However, this can cause\\n      verification failures when verifying with a system that assumes a single hash.</p>\\n         <p>The hashing algorithm that <code>Sign</code> uses is based on the\\n        <code>SigningAlgorithm</code> value.</p>\\n         <ul>\\n            <li>\\n               <p>Signing algorithms that end in SHA_256 use the SHA_256 hashing algorithm.</p>\\n            </li>\\n            <li>\\n               <p>Signing algorithms that end in SHA_384 use the SHA_384 hashing algorithm.</p>\\n            </li>\\n            <li>\\n               <p>Signing algorithms that end in SHA_512 use the SHA_512 hashing algorithm.</p>\\n            </li>\\n            <li>\\n               <p>Signing algorithms that end in SHAKE_256 use the SHAKE_256 hashing algorithm.</p>\\n            </li>\\n            <li>\\n               <p>SM2DSA uses the SM3 hashing algorithm. For details, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/offline-operations.html#key-spec-sm-offline-verification\\\">Offline\\n            verification with SM2 key pairs</a>.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"GrantTokens\": {\n                    \"target\": \"com.amazonaws.kms#GrantTokenList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of grant tokens.</p>\\n         <p>Use a grant token when your permission to call this operation comes from a new grant that has not yet achieved <i>eventual consistency</i>. For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/grants.html#grant_token\\\">Grant token</a> and <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/using-grant-token.html\\\">Using a grant token</a> in the\\n    <i>Key Management Service Developer Guide</i>.</p>\"\n                    }\n                },\n                \"SigningAlgorithm\": {\n                    \"target\": \"com.amazonaws.kms#SigningAlgorithmSpec\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the signing algorithm to use when signing the message. </p>\\n         <p>Choose an algorithm that is compatible with the type and size of the specified asymmetric\\n      KMS key. When signing with RSA key pairs, RSASSA-PSS algorithms are preferred. We include\\n      RSASSA-PKCS1-v1_5 algorithms for compatibility with existing applications.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.kms#NullableBooleanType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks if your request will succeed. <code>DryRun</code> is an optional parameter. </p>\\n         <p>To learn more about how to use this parameter, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/testing-permissions.html\\\">Testing your permissions</a> in the <i>Key Management Service Developer Guide</i>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.kms#SignResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"KeyId\": {\n                    \"target\": \"com.amazonaws.kms#KeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (<a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-id-key-ARN\\\">key ARN</a>) of the asymmetric KMS key that was used to sign the message.</p>\"\n                    }\n                },\n                \"Signature\": {\n                    \"target\": \"com.amazonaws.kms#CiphertextType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The cryptographic signature that was generated for the message. </p>\\n         <ul>\\n            <li>\\n               <p>When used with the supported RSA signing algorithms, the encoding of this value is\\n          defined by <a href=\\\"https://tools.ietf.org/html/rfc8017\\\">PKCS #1 in RFC\\n          8017</a>.</p>\\n            </li>\\n            <li>\\n               <p>When used with the <code>ECDSA_SHA_256</code>, <code>ECDSA_SHA_384</code>, or\\n            <code>ECDSA_SHA_512</code> signing algorithms, this value is a DER-encoded object as\\n          defined by ANSI X9.62–2005 and <a href=\\\"https://tools.ietf.org/html/rfc3279#section-2.2.3\\\">RFC 3279 Section 2.2.3</a>.\\n          This is the most commonly used signature format and is appropriate for most uses.\\n          </p>\\n            </li>\\n         </ul>\\n         <p>When you use the HTTP API or the Amazon Web Services CLI, the value is Base64-encoded. Otherwise, it is not Base64-encoded.</p>\"\n                    }\n                },\n                \"SigningAlgorithm\": {\n                    \"target\": \"com.amazonaws.kms#SigningAlgorithmSpec\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The signing algorithm that was used to sign the message.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.kms#SigningAlgorithmSpec\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"RSASSA_PSS_SHA_256\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"RSASSA_PSS_SHA_256\"\n                    }\n                },\n                \"RSASSA_PSS_SHA_384\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"RSASSA_PSS_SHA_384\"\n                    }\n                },\n                \"RSASSA_PSS_SHA_512\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"RSASSA_PSS_SHA_512\"\n                    }\n                },\n                \"RSASSA_PKCS1_V1_5_SHA_256\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"RSASSA_PKCS1_V1_5_SHA_256\"\n                    }\n                },\n                \"RSASSA_PKCS1_V1_5_SHA_384\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"RSASSA_PKCS1_V1_5_SHA_384\"\n                    }\n                },\n                \"RSASSA_PKCS1_V1_5_SHA_512\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"RSASSA_PKCS1_V1_5_SHA_512\"\n                    }\n                },\n                \"ECDSA_SHA_256\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ECDSA_SHA_256\"\n                    }\n                },\n                \"ECDSA_SHA_384\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ECDSA_SHA_384\"\n                    }\n                },\n                \"ECDSA_SHA_512\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ECDSA_SHA_512\"\n                    }\n                },\n                \"SM2DSA\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"SM2DSA\"\n                    }\n                },\n                \"ML_DSA_SHAKE_256\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ML_DSA_SHAKE_256\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.kms#SigningAlgorithmSpecList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.kms#SigningAlgorithmSpec\"\n            }\n        },\n        \"com.amazonaws.kms#Tag\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TagKey\": {\n                    \"target\": \"com.amazonaws.kms#TagKeyType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The key of the tag.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TagValue\": {\n                    \"target\": \"com.amazonaws.kms#TagValueType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The value of the tag.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A key-value pair. A tag consists of a tag key and a tag value. Tag keys and tag values are\\n      both required, but tag values can be empty (null) strings.</p>\\n         <important>\\n            <p>Do not include confidential or sensitive information in this field. This field may be displayed in plaintext in CloudTrail logs and other output.</p>\\n         </important>\\n         <p>For information about the rules that apply to tag keys and tag values, see <a href=\\\"https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/allocation-tag-restrictions.html\\\">User-Defined Tag Restrictions</a> in the <i>Amazon Web Services Billing and Cost Management\\n        User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.kms#TagException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.kms#ErrorMessageType\"\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"TagException\",\n                    \"httpResponseCode\": 400\n                },\n                \"smithy.api#documentation\": \"<p>The request was rejected because one or more tags are not valid.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.kms#TagKeyList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.kms#TagKeyType\"\n            }\n        },\n        \"com.amazonaws.kms#TagKeyType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 128\n                }\n            }\n        },\n        \"com.amazonaws.kms#TagList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.kms#Tag\"\n            }\n        },\n        \"com.amazonaws.kms#TagResource\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.kms#TagResourceRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.kms#InvalidArnException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInternalException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInvalidStateException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#NotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#TagException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Adds or edits tags on a <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-mgn-key\\\">customer managed key</a>.</p>\\n         <note>\\n            <p>Tagging or untagging a KMS key can allow or deny permission to the KMS key. For details, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/abac.html\\\">ABAC for KMS</a> in the <i>Key Management Service Developer Guide</i>.</p>\\n         </note>\\n         <p>Each tag consists of a tag key and a tag value, both of which are case-sensitive strings.\\n      The tag value can be an empty (null) string. To add a tag, specify a new tag key and a tag\\n      value. To edit a tag, specify an existing tag key and a new tag value.</p>\\n         <p>You can use this operation to tag a <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-mgn-key\\\">customer managed key</a>, but you\\n      cannot tag an <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-key\\\">Amazon Web Services managed key</a>, an <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-owned-key\\\">Amazon Web Services owned key</a>, a <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/key-store-overview.html\\\">custom key store</a>,\\n      or an <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/kms-alias.html\\\">alias</a>.</p>\\n         <p>You can also add tags to a KMS key while creating it (<a>CreateKey</a>) or\\n      replicating it (<a>ReplicateKey</a>).</p>\\n         <p>For information about using tags in KMS, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/tagging-keys.html\\\">Tagging keys</a>. For general information about\\n      tags, including the format and syntax, see <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html\\\">Tagging Amazon Web Services resources</a> in the <i>Amazon\\n        Web Services General Reference</i>. </p>\\n         <p>The KMS key that you use for this operation must be in a compatible key state. For\\ndetails, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/key-state.html\\\">Key states of KMS keys</a> in the <i>Key Management Service Developer Guide</i>.</p>\\n         <p>\\n            <b>Cross-account use</b>: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account. </p>\\n         <p>\\n            <b>Required permissions</b>: <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/kms-api-permissions-reference.html\\\">kms:TagResource</a> (key policy)</p>\\n         <p>\\n            <b>Related operations</b>\\n         </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a>CreateKey</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>ListResourceTags</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>ReplicateKey</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>UntagResource</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>\\n            <b>Eventual consistency</b>: The KMS API follows an eventual consistency model. \\n  For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/accessing-kms.html#programming-eventual-consistency\\\">KMS eventual consistency</a>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To tag a KMS key\",\n                        \"documentation\": \"The following example tags a KMS key.\",\n                        \"input\": {\n                            \"KeyId\": \"1234abcd-12ab-34cd-56ef-1234567890ab\",\n                            \"Tags\": [\n                                {\n                                    \"TagKey\": \"Purpose\",\n                                    \"TagValue\": \"Test\"\n                                }\n                            ]\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.kms#TagResourceRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"KeyId\": {\n                    \"target\": \"com.amazonaws.kms#KeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Identifies a customer managed key in the account and Region.</p>\\n         <p>Specify the key ID or key ARN of the KMS key.</p>\\n         <p>For example:</p>\\n         <ul>\\n            <li>\\n               <p>Key ID: <code>1234abcd-12ab-34cd-56ef-1234567890ab</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Key ARN: <code>arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>To get the key ID and key ARN for a KMS key, use <a>ListKeys</a> or <a>DescribeKey</a>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.kms#TagList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more tags. Each tag consists of a tag key and a tag value. The tag value can be an\\n      empty (null) string. </p>\\n         <important>\\n            <p>Do not include confidential or sensitive information in this field. This field may be displayed in plaintext in CloudTrail logs and other output.</p>\\n         </important>\\n         <p>You cannot have more than one tag on a KMS key with the same tag key. If you specify an\\n      existing tag key with a different tag value, KMS replaces the current tag value with the\\n      specified one.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.kms#TagValueType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 256\n                }\n            }\n        },\n        \"com.amazonaws.kms#TrentService\": {\n            \"type\": \"service\",\n            \"version\": \"2014-11-01\",\n            \"operations\": [\n                {\n                    \"target\": \"com.amazonaws.kms#CancelKeyDeletion\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#ConnectCustomKeyStore\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#CreateAlias\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#CreateCustomKeyStore\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#CreateGrant\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#CreateKey\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#Decrypt\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#DeleteAlias\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#DeleteCustomKeyStore\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#DeleteImportedKeyMaterial\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#DeriveSharedSecret\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#DescribeCustomKeyStores\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#DescribeKey\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#DisableKey\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#DisableKeyRotation\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#DisconnectCustomKeyStore\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#EnableKey\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#EnableKeyRotation\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#Encrypt\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#GenerateDataKey\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#GenerateDataKeyPair\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#GenerateDataKeyPairWithoutPlaintext\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#GenerateDataKeyWithoutPlaintext\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#GenerateMac\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#GenerateRandom\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#GetKeyPolicy\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#GetKeyRotationStatus\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#GetParametersForImport\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#GetPublicKey\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#ImportKeyMaterial\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#ListAliases\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#ListGrants\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#ListKeyPolicies\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#ListKeyRotations\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#ListKeys\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#ListResourceTags\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#ListRetirableGrants\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#PutKeyPolicy\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#ReEncrypt\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#ReplicateKey\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#RetireGrant\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#RevokeGrant\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#RotateKeyOnDemand\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#ScheduleKeyDeletion\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#Sign\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#TagResource\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#UntagResource\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#UpdateAlias\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#UpdateCustomKeyStore\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#UpdateKeyDescription\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#UpdatePrimaryRegion\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#Verify\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#VerifyMac\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#service\": {\n                    \"sdkId\": \"KMS\",\n                    \"arnNamespace\": \"kms\",\n                    \"cloudFormationName\": \"KMS\",\n                    \"cloudTrailEventSource\": \"kms.amazonaws.com\",\n                    \"endpointPrefix\": \"kms\"\n                },\n                \"aws.auth#sigv4\": {\n                    \"name\": \"kms\"\n                },\n                \"aws.protocols#awsJson1_1\": {},\n                \"smithy.api#documentation\": \"<fullname>Key Management Service</fullname>\\n         <p>Key Management Service (KMS) is an encryption and key management web service. This guide describes\\n      the KMS operations that you can call programmatically. For general information about KMS,\\n      see the <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/\\\">\\n               <i>Key Management Service Developer Guide</i>\\n            </a>.</p>\\n         <note>\\n            <p>KMS has replaced the term <i>customer master key (CMK)</i> with <i>Key Management Service key</i> \\n  and <i>KMS key</i>. The concept has not changed. To prevent breaking changes, KMS is keeping some variations of this term.</p>\\n            <p>Amazon Web Services provides SDKs that consist of libraries and sample code for various programming\\n        languages and platforms (Java, Rust, Python, Ruby, .Net, macOS, Android, etc.). The SDKs\\n        provide a convenient way to create programmatic access to KMS and other Amazon Web Services services.\\n        For example, the SDKs take care of tasks such as signing requests (see below), managing\\n        errors, and retrying requests automatically. For more information about the Amazon Web Services SDKs,\\n        including how to download and install them, see <a href=\\\"http://aws.amazon.com/tools/\\\">Tools\\n          for Amazon Web Services</a>.</p>\\n         </note>\\n         <p>We recommend that you use the Amazon Web Services SDKs to make programmatic API calls to KMS.</p>\\n         <p>If you need to use FIPS 140-2 validated cryptographic modules when communicating with\\n      Amazon Web Services, use one of the FIPS endpoints in your preferred Amazon Web Services Region. If you need communicate\\n      over IPv6, use the dual-stack endpoint in your preferred Amazon Web Services Region. For more information\\n      see <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/kms.html#kms_region\\\">Service\\n        endpoints</a> in the Key Management Service topic of the <i>Amazon Web Services General Reference</i> and <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/ipv6-kms.html\\\">Dual-stack endpoint\\n        support</a> in the KMS Developer Guide.</p>\\n         <p>All KMS API calls must be signed and be transmitted using Transport Layer Security\\n      (TLS). KMS recommends you always use the latest supported TLS version. Clients must also\\n      support cipher suites with Perfect Forward Secrecy (PFS) such as Ephemeral Diffie-Hellman\\n      (DHE) or Elliptic Curve Ephemeral Diffie-Hellman (ECDHE). Most modern systems such as Java 7\\n      and later support these modes.</p>\\n         <p>\\n            <b>Signing Requests</b>\\n         </p>\\n         <p>Requests must be signed using an access key ID and a secret access key. We strongly\\n      recommend that you do not use your Amazon Web Services account root access key ID and secret access key for\\n      everyday work. You can use the access key ID and secret access key for an IAM user or you\\n      can use the Security Token Service (STS) to generate temporary security credentials and use those to sign\\n      requests. </p>\\n         <p>All KMS requests must be signed with <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html\\\">Signature Version 4</a>.</p>\\n         <p>\\n            <b>Logging API Requests</b>\\n         </p>\\n         <p>KMS supports CloudTrail, a service that logs Amazon Web Services API calls and related events for your\\n      Amazon Web Services account and delivers them to an Amazon S3 bucket that you specify. By using the\\n      information collected by CloudTrail, you can determine what requests were made to KMS, who made\\n      the request, when it was made, and so on. To learn more about CloudTrail, including how to turn it\\n      on and find your log files, see the <a href=\\\"https://docs.aws.amazon.com/awscloudtrail/latest/userguide/\\\">CloudTrail User Guide</a>.</p>\\n         <p>\\n            <b>Additional Resources</b>\\n         </p>\\n         <p>For more information about credentials and request signing, see the following:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/aws-security-credentials.html\\\">Amazon Web Services\\n            Security Credentials</a> - This topic provides general information about the types\\n          of credentials used to access Amazon Web Services.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp.html\\\">Temporary\\n            Security Credentials</a> - This section of the <i>IAM User Guide</i>\\n          describes how to create and use temporary security credentials.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html\\\">Signature Version\\n            4 Signing Process</a> - This set of topics walks you through the process of signing\\n          a request using an access key ID and a secret access key.</p>\\n            </li>\\n         </ul>\\n         <p>\\n            <b>Commonly Used API Operations</b>\\n         </p>\\n         <p>Of the API operations discussed in this guide, the following will prove the most useful\\n      for most applications. You will likely perform operations other than these, such as creating\\n      keys and assigning policies, by using the console.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a>Encrypt</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>Decrypt</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>GenerateDataKey</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>GenerateDataKeyWithoutPlaintext</a>\\n               </p>\\n            </li>\\n         </ul>\",\n                \"smithy.api#title\": \"AWS Key Management Service\",\n                \"smithy.api#xmlNamespace\": {\n                    \"uri\": \"https://trent.amazonaws.com/doc/2014-11-01/\"\n                },\n                \"smithy.rules#endpointRuleSet\": {\n                    \"version\": \"1.0\",\n                    \"parameters\": {\n                        \"Region\": {\n                            \"builtIn\": \"AWS::Region\",\n                            \"required\": false,\n                            \"documentation\": \"The AWS region used to dispatch the request.\",\n                            \"type\": \"String\"\n                        },\n                        \"UseDualStack\": {\n                            \"builtIn\": \"AWS::UseDualStack\",\n                            \"required\": true,\n                            \"default\": false,\n                            \"documentation\": \"When true, use the dual-stack endpoint. If the configured endpoint does not support dual-stack, dispatching the request MAY return an error.\",\n                            \"type\": \"Boolean\"\n                        },\n                        \"UseFIPS\": {\n                            \"builtIn\": \"AWS::UseFIPS\",\n                            \"required\": true,\n                            \"default\": false,\n                            \"documentation\": \"When true, send this request to the FIPS-compliant regional endpoint. If the configured endpoint does not have a FIPS compliant endpoint, dispatching the request will return an error.\",\n                            \"type\": \"Boolean\"\n                        },\n                        \"Endpoint\": {\n                            \"builtIn\": \"SDK::Endpoint\",\n                            \"required\": false,\n                            \"documentation\": \"Override the endpoint used to send this request\",\n                            \"type\": \"String\"\n                        }\n                    },\n                    \"rules\": [\n                        {\n                            \"conditions\": [\n                                {\n                                    \"fn\": \"isSet\",\n                                    \"argv\": [\n                                        {\n                                            \"ref\": \"Endpoint\"\n                                        }\n                                    ]\n                                }\n                            ],\n                            \"rules\": [\n                                {\n                                    \"conditions\": [\n                                        {\n                                            \"fn\": \"booleanEquals\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"UseFIPS\"\n                                                },\n                                                true\n                                            ]\n                                        }\n                                    ],\n                                    \"error\": \"Invalid Configuration: FIPS and custom endpoint are not supported\",\n                                    \"type\": \"error\"\n                                },\n                                {\n                                    \"conditions\": [\n                                        {\n                                            \"fn\": \"booleanEquals\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"UseDualStack\"\n                                                },\n                                                true\n                                            ]\n                                        }\n                                    ],\n                                    \"error\": \"Invalid Configuration: Dualstack and custom endpoint are not supported\",\n                                    \"type\": \"error\"\n                                },\n                                {\n                                    \"conditions\": [],\n                                    \"endpoint\": {\n                                        \"url\": {\n                                            \"ref\": \"Endpoint\"\n                                        },\n                                        \"properties\": {},\n                                        \"headers\": {}\n                                    },\n                                    \"type\": \"endpoint\"\n                                }\n                            ],\n                            \"type\": \"tree\"\n                        },\n                        {\n                            \"conditions\": [\n                                {\n                                    \"fn\": \"isSet\",\n                                    \"argv\": [\n                                        {\n                                            \"ref\": \"Region\"\n                                        }\n                                    ]\n                                }\n                            ],\n                            \"rules\": [\n                                {\n                                    \"conditions\": [\n                                        {\n                                            \"fn\": \"aws.partition\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"Region\"\n                                                }\n                                            ],\n                                            \"assign\": \"PartitionResult\"\n                                        }\n                                    ],\n                                    \"rules\": [\n                                        {\n                                            \"conditions\": [\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseFIPS\"\n                                                        },\n                                                        true\n                                                    ]\n                                                },\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseDualStack\"\n                                                        },\n                                                        true\n                                                    ]\n                                                }\n                                            ],\n                                            \"rules\": [\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                true,\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"PartitionResult\"\n                                                                        },\n                                                                        \"supportsFIPS\"\n                                                                    ]\n                                                                }\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                true,\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"PartitionResult\"\n                                                                        },\n                                                                        \"supportsDualStack\"\n                                                                    ]\n                                                                }\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"rules\": [\n                                                        {\n                                                            \"conditions\": [],\n                                                            \"endpoint\": {\n                                                                \"url\": \"https://kms-fips.{Region}.{PartitionResult#dualStackDnsSuffix}\",\n                                                                \"properties\": {},\n                                                                \"headers\": {}\n                                                            },\n                                                            \"type\": \"endpoint\"\n                                                        }\n                                                    ],\n                                                    \"type\": \"tree\"\n                                                },\n                                                {\n                                                    \"conditions\": [],\n                                                    \"error\": \"FIPS and DualStack are enabled, but this partition does not support one or both\",\n                                                    \"type\": \"error\"\n                                                }\n                                            ],\n                                            \"type\": \"tree\"\n                                        },\n                                        {\n                                            \"conditions\": [\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseFIPS\"\n                                                        },\n                                                        true\n                                                    ]\n                                                }\n                                            ],\n                                            \"rules\": [\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"PartitionResult\"\n                                                                        },\n                                                                        \"supportsFIPS\"\n                                                                    ]\n                                                                },\n                                                                true\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"rules\": [\n                                                        {\n                                                            \"conditions\": [],\n                                                            \"endpoint\": {\n                                                                \"url\": \"https://kms-fips.{Region}.{PartitionResult#dnsSuffix}\",\n                                                                \"properties\": {},\n                                                                \"headers\": {}\n                                                            },\n                                                            \"type\": \"endpoint\"\n                                                        }\n                                                    ],\n                                                    \"type\": \"tree\"\n                                                },\n                                                {\n                                                    \"conditions\": [],\n                                                    \"error\": \"FIPS is enabled but this partition does not support FIPS\",\n                                                    \"type\": \"error\"\n                                                }\n                                            ],\n                                            \"type\": \"tree\"\n                                        },\n                                        {\n                                            \"conditions\": [\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseDualStack\"\n                                                        },\n                                                        true\n                                                    ]\n                                                }\n                                            ],\n                                            \"rules\": [\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                true,\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"PartitionResult\"\n                                                                        },\n                                                                        \"supportsDualStack\"\n                                                                    ]\n                                                                }\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"rules\": [\n                                                        {\n                                                            \"conditions\": [],\n                                                            \"endpoint\": {\n                                                                \"url\": \"https://kms.{Region}.{PartitionResult#dualStackDnsSuffix}\",\n                                                                \"properties\": {},\n                                                                \"headers\": {}\n                                                            },\n                                                            \"type\": \"endpoint\"\n                                                        }\n                                                    ],\n                                                    \"type\": \"tree\"\n                                                },\n                                                {\n                                                    \"conditions\": [],\n                                                    \"error\": \"DualStack is enabled but this partition does not support DualStack\",\n                                                    \"type\": \"error\"\n                                                }\n                                            ],\n                                            \"type\": \"tree\"\n                                        },\n                                        {\n                                            \"conditions\": [],\n                                            \"endpoint\": {\n                                                \"url\": \"https://kms.{Region}.{PartitionResult#dnsSuffix}\",\n                                                \"properties\": {},\n                                                \"headers\": {}\n                                            },\n                                            \"type\": \"endpoint\"\n                                        }\n                                    ],\n                                    \"type\": \"tree\"\n                                }\n                            ],\n                            \"type\": \"tree\"\n                        },\n                        {\n                            \"conditions\": [],\n                            \"error\": \"Invalid Configuration: Missing Region\",\n                            \"type\": \"error\"\n                        }\n                    ]\n                },\n                \"smithy.rules#endpointTests\": {\n                    \"testCases\": [\n                        {\n                            \"documentation\": \"For region af-south-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://kms.af-south-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"af-south-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region af-south-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://kms-fips.af-south-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"af-south-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://kms.ap-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-east-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://kms-fips.ap-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-northeast-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://kms.ap-northeast-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-northeast-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-northeast-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://kms-fips.ap-northeast-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-northeast-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-northeast-2 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://kms.ap-northeast-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-northeast-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-northeast-2 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://kms-fips.ap-northeast-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-northeast-2\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-northeast-3 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://kms.ap-northeast-3.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-northeast-3\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-northeast-3 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://kms-fips.ap-northeast-3.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-northeast-3\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-south-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://kms.ap-south-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-south-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-south-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://kms-fips.ap-south-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-south-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-southeast-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://kms.ap-southeast-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-southeast-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-southeast-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://kms-fips.ap-southeast-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-southeast-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-southeast-2 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://kms.ap-southeast-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-southeast-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-southeast-2 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://kms-fips.ap-southeast-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-southeast-2\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-southeast-3 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://kms.ap-southeast-3.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-southeast-3\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-southeast-3 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://kms-fips.ap-southeast-3.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-southeast-3\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ca-central-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://kms.ca-central-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ca-central-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ca-central-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://kms-fips.ca-central-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ca-central-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-central-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://kms.eu-central-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-central-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-central-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://kms-fips.eu-central-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-central-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-north-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://kms.eu-north-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-north-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-north-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://kms-fips.eu-north-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-north-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-south-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://kms.eu-south-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-south-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-south-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://kms-fips.eu-south-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-south-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-west-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://kms.eu-west-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-west-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-west-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://kms-fips.eu-west-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-west-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-west-2 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://kms.eu-west-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-west-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-west-2 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://kms-fips.eu-west-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-west-2\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-west-3 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://kms.eu-west-3.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-west-3\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-west-3 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://kms-fips.eu-west-3.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-west-3\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region me-south-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://kms.me-south-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"me-south-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region me-south-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://kms-fips.me-south-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"me-south-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region sa-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://kms.sa-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"sa-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region sa-east-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://kms-fips.sa-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"sa-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://kms.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://kms-fips.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-2 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://kms.us-east-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-2 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://kms-fips.us-east-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-2\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-west-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://kms.us-west-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-west-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-west-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://kms-fips.us-west-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-west-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-west-2 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://kms.us-west-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-west-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-west-2 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://kms-fips.us-west-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-west-2\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-1 with FIPS enabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://kms-fips.us-east-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-1 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://kms.us-east-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-north-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://kms.cn-north-1.amazonaws.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-north-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-northwest-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://kms.cn-northwest-1.amazonaws.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-northwest-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-north-1 with FIPS enabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://kms-fips.cn-north-1.api.amazonwebservices.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-north-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-north-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://kms-fips.cn-north-1.amazonaws.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-north-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-north-1 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://kms.cn-north-1.api.amazonwebservices.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-north-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://kms.us-gov-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-east-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://kms-fips.us-gov-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-west-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://kms.us-gov-west-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-west-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-west-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://kms-fips.us-gov-west-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-west-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-east-1 with FIPS enabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://kms-fips.us-gov-east-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-east-1 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://kms.us-gov-east-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-iso-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://kms.us-iso-east-1.c2s.ic.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-iso-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-iso-east-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://kms-fips.us-iso-east-1.c2s.ic.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-iso-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-iso-west-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://kms.us-iso-west-1.c2s.ic.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-iso-west-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-iso-west-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://kms-fips.us-iso-west-1.c2s.ic.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-iso-west-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-isob-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://kms.us-isob-east-1.sc2s.sgov.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-isob-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-isob-east-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://kms-fips.us-isob-east-1.sc2s.sgov.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-isob-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For custom endpoint with region set and fips disabled and dualstack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://example.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"For custom endpoint with region not set and fips disabled and dualstack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://example.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"For custom endpoint with fips enabled and dualstack disabled\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: FIPS and custom endpoint are not supported\"\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false,\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"For custom endpoint with fips disabled and dualstack enabled\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: Dualstack and custom endpoint are not supported\"\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true,\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"Missing region\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: Missing Region\"\n                            }\n                        }\n                    ],\n                    \"version\": \"1.0\"\n                }\n            }\n        },\n        \"com.amazonaws.kms#TrustAnchorCertificateType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 5000\n                }\n            }\n        },\n        \"com.amazonaws.kms#UnsupportedOperationException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.kms#ErrorMessageType\"\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"UnsupportedOperation\",\n                    \"httpResponseCode\": 400\n                },\n                \"smithy.api#documentation\": \"<p>The request was rejected because a specified parameter is not supported or a specified\\n      resource is not valid for this operation.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.kms#UntagResource\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.kms#UntagResourceRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.kms#InvalidArnException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInternalException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInvalidStateException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#NotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#TagException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes tags from a <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-mgn-key\\\">customer managed key</a>. To delete a\\n      tag, specify the tag key and the KMS key.</p>\\n         <note>\\n            <p>Tagging or untagging a KMS key can allow or deny permission to the KMS key. For details, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/abac.html\\\">ABAC for KMS</a> in the <i>Key Management Service Developer Guide</i>.</p>\\n         </note>\\n         <p>When it succeeds, the <code>UntagResource</code> operation doesn't return any output.\\n      Also, if the specified tag key isn't found on the KMS key, it doesn't throw an exception or\\n      return a response. To confirm that the operation worked, use the <a>ListResourceTags</a> operation.</p>\\n         <p>For information about using tags in KMS, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/tagging-keys.html\\\">Tagging keys</a>. For general information about\\n      tags, including the format and syntax, see <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/aws_tagging.html\\\">Tagging Amazon Web Services resources</a> in the <i>Amazon\\n        Web Services General Reference</i>. </p>\\n         <p>The KMS key that you use for this operation must be in a compatible key state. For\\ndetails, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/key-state.html\\\">Key states of KMS keys</a> in the <i>Key Management Service Developer Guide</i>.</p>\\n         <p>\\n            <b>Cross-account use</b>: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account.</p>\\n         <p>\\n            <b>Required permissions</b>: <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/kms-api-permissions-reference.html\\\">kms:UntagResource</a> (key policy)</p>\\n         <p>\\n            <b>Related operations</b>\\n         </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a>CreateKey</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>ListResourceTags</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>ReplicateKey</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>TagResource</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>\\n            <b>Eventual consistency</b>: The KMS API follows an eventual consistency model. \\n  For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/accessing-kms.html#programming-eventual-consistency\\\">KMS eventual consistency</a>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To remove tags from a KMS key\",\n                        \"documentation\": \"The following example removes tags from a KMS key.\",\n                        \"input\": {\n                            \"KeyId\": \"1234abcd-12ab-34cd-56ef-1234567890ab\",\n                            \"TagKeys\": [\n                                \"Purpose\",\n                                \"CostCenter\"\n                            ]\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.kms#UntagResourceRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"KeyId\": {\n                    \"target\": \"com.amazonaws.kms#KeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Identifies the KMS key from which you are removing tags.</p>\\n         <p>Specify the key ID or key ARN of the KMS key.</p>\\n         <p>For example:</p>\\n         <ul>\\n            <li>\\n               <p>Key ID: <code>1234abcd-12ab-34cd-56ef-1234567890ab</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Key ARN: <code>arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>To get the key ID and key ARN for a KMS key, use <a>ListKeys</a> or <a>DescribeKey</a>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TagKeys\": {\n                    \"target\": \"com.amazonaws.kms#TagKeyList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>One or more tag keys. Specify only the tag keys, not the tag values.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.kms#UpdateAlias\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.kms#UpdateAliasRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.kms#DependencyTimeoutException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInternalException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInvalidStateException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#NotFoundException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Associates an existing KMS alias with a different KMS key. Each alias is associated with\\n      only one KMS key at a time, although a KMS key can have multiple aliases. The alias and the\\n      KMS key must be in the same Amazon Web Services account and Region.</p>\\n         <note>\\n            <p>Adding, deleting, or updating an alias can allow or deny permission to the KMS key. For details, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/abac.html\\\">ABAC for KMS</a> in the <i>Key Management Service Developer Guide</i>.</p>\\n         </note>\\n         <p>The current and new KMS key must be the same type (both symmetric or both asymmetric or\\n      both HMAC), and they must have the same key usage. This restriction prevents errors in code\\n      that uses aliases. If you must assign an alias to a different type of KMS key, use <a>DeleteAlias</a> to delete the old alias and <a>CreateAlias</a> to create\\n      a new alias.</p>\\n         <p>You cannot use <code>UpdateAlias</code> to change an alias name. To change an alias name,\\n      use <a>DeleteAlias</a> to delete the old alias and <a>CreateAlias</a> to\\n      create a new alias.</p>\\n         <p>Because an alias is not a property of a KMS key, you can create, update, and delete the\\n      aliases of a KMS key without affecting the KMS key. Also, aliases do not appear in the\\n      response from the <a>DescribeKey</a> operation. To get the aliases of all KMS keys\\n      in the account, use the <a>ListAliases</a> operation. </p>\\n         <p>The KMS key that you use for this operation must be in a compatible key state. For\\ndetails, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/key-state.html\\\">Key states of KMS keys</a> in the <i>Key Management Service Developer Guide</i>.</p>\\n         <p>\\n            <b>Cross-account use</b>: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account. </p>\\n         <p>\\n            <b>Required permissions</b>\\n         </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/kms-api-permissions-reference.html\\\">kms:UpdateAlias</a> on\\n          the alias (IAM policy).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/kms-api-permissions-reference.html\\\">kms:UpdateAlias</a> on\\n          the current KMS key (key policy).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/kms-api-permissions-reference.html\\\">kms:UpdateAlias</a> on\\n          the new KMS key (key policy).</p>\\n            </li>\\n         </ul>\\n         <p>For details, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/kms-alias.html#alias-access\\\">Controlling access to aliases</a> in the\\n      <i>Key Management Service Developer Guide</i>.</p>\\n         <p>\\n            <b>Related operations:</b>\\n         </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a>CreateAlias</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>DeleteAlias</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>ListAliases</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>\\n            <b>Eventual consistency</b>: The KMS API follows an eventual consistency model. \\n  For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/accessing-kms.html#programming-eventual-consistency\\\">KMS eventual consistency</a>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To update an alias\",\n                        \"documentation\": \"The following example updates the specified alias to refer to the specified KMS key.\",\n                        \"input\": {\n                            \"AliasName\": \"alias/ExampleAlias\",\n                            \"TargetKeyId\": \"1234abcd-12ab-34cd-56ef-1234567890ab\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.kms#UpdateAliasRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AliasName\": {\n                    \"target\": \"com.amazonaws.kms#AliasNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Identifies the alias that is changing its KMS key. This value must begin with\\n        <code>alias/</code> followed by the alias name, such as <code>alias/ExampleAlias</code>. You\\n      cannot use <code>UpdateAlias</code> to change the alias name.</p>\\n         <important>\\n            <p>Do not include confidential or sensitive information in this field. This field may be displayed in plaintext in CloudTrail logs and other output.</p>\\n         </important>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TargetKeyId\": {\n                    \"target\": \"com.amazonaws.kms#KeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Identifies the <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-mgn-key\\\">customer managed key</a> to associate\\n      with the alias. You don't have permission to associate an alias with an <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-key\\\">Amazon Web Services managed\\n        key</a>.</p>\\n         <p>The KMS key must be in the same Amazon Web Services account and Region as the alias. Also, the new\\n      target KMS key must be the same type as the current target KMS key (both symmetric or both\\n      asymmetric or both HMAC) and they must have the same key usage. </p>\\n         <p>Specify the key ID or key ARN of the KMS key.</p>\\n         <p>For example:</p>\\n         <ul>\\n            <li>\\n               <p>Key ID: <code>1234abcd-12ab-34cd-56ef-1234567890ab</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Key ARN: <code>arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>To get the key ID and key ARN for a KMS key, use <a>ListKeys</a> or <a>DescribeKey</a>.</p>\\n         <p>To verify that the alias is mapped to the correct KMS key, use <a>ListAliases</a>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.kms#UpdateCustomKeyStore\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.kms#UpdateCustomKeyStoreRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.kms#UpdateCustomKeyStoreResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.kms#CloudHsmClusterInvalidConfigurationException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#CloudHsmClusterNotActiveException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#CloudHsmClusterNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#CloudHsmClusterNotRelatedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#CustomKeyStoreInvalidStateException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#CustomKeyStoreNameInUseException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#CustomKeyStoreNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInternalException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#XksProxyIncorrectAuthenticationCredentialException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#XksProxyInvalidConfigurationException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#XksProxyInvalidResponseException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#XksProxyUriEndpointInUseException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#XksProxyUriInUseException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#XksProxyUriUnreachableException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#XksProxyVpcEndpointServiceInUseException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#XksProxyVpcEndpointServiceInvalidConfigurationException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#XksProxyVpcEndpointServiceNotFoundException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Changes the properties of a custom key store. You can use this operation to change the\\n      properties of an CloudHSM key store or an external key store.</p>\\n         <p>Use the required <code>CustomKeyStoreId</code> parameter to identify the custom key store.\\n      Use the remaining optional parameters to change its properties. This operation does not return\\n      any property values. To verify the updated property values, use the <a>DescribeCustomKeyStores</a> operation.</p>\\n         <p> This operation is part of the custom key stores feature in KMS, which\\ncombines the convenience and extensive integration of KMS with the isolation and control of a\\nkey store that you own and manage.</p>\\n         <important>\\n            <p>When updating the properties of an external key store, verify that the updated settings\\n        connect your key store, via the external key store proxy, to the same external key manager\\n        as the previous settings, or to a backup or snapshot of the external key manager with the\\n        same cryptographic keys. If the updated connection settings fail, you can fix them and\\n        retry, although an extended delay might disrupt Amazon Web Services services. However, if KMS\\n        permanently loses its access to cryptographic keys, ciphertext encrypted under those keys is\\n        unrecoverable.</p>\\n         </important>\\n         <note>\\n            <p>For external key stores:</p>\\n            <p>Some external key managers provide a simpler method for updating an external key store.\\n        For details, see your external key manager documentation.</p>\\n            <p>When updating an external key store in the KMS console, you can upload a JSON-based\\n        proxy configuration file with the desired values. You cannot upload the proxy configuration\\n        file to the <code>UpdateCustomKeyStore</code> operation. However, you can use the file to\\n        help you determine the correct values for the <code>UpdateCustomKeyStore</code>\\n        parameters.</p>\\n         </note>\\n         <p>For an CloudHSM key store, you can use this operation to change the custom key store friendly\\n      name (<code>NewCustomKeyStoreName</code>), to tell KMS about a change to the\\n        <code>kmsuser</code> crypto user password (<code>KeyStorePassword</code>), or to associate\\n      the custom key store with a different, but related, CloudHSM cluster\\n        (<code>CloudHsmClusterId</code>). To update any property of an CloudHSM key store, the\\n        <code>ConnectionState</code> of the CloudHSM key store must be <code>DISCONNECTED</code>. </p>\\n         <p>For an external key store, you can use this operation to change the custom key store\\n      friendly name (<code>NewCustomKeyStoreName</code>), or to tell KMS about a change to the\\n      external key store proxy authentication credentials\\n        (<code>XksProxyAuthenticationCredential</code>), connection method\\n        (<code>XksProxyConnectivity</code>), external proxy endpoint\\n        (<code>XksProxyUriEndpoint</code>) and path (<code>XksProxyUriPath</code>). For external key\\n      stores with an <code>XksProxyConnectivity</code> of <code>VPC_ENDPOINT_SERVICE</code>, you can\\n      also update the Amazon VPC endpoint service name (<code>XksProxyVpcEndpointServiceName</code>). To\\n      update most properties of an external key store, the <code>ConnectionState</code> of the\\n      external key store must be <code>DISCONNECTED</code>. However, you can update the\\n        <code>CustomKeyStoreName</code>, <code>XksProxyAuthenticationCredential</code>, and\\n        <code>XksProxyUriPath</code> of an external key store when it is in the CONNECTED or\\n      DISCONNECTED state. </p>\\n         <p>If your update requires a <code>DISCONNECTED</code> state, before using\\n        <code>UpdateCustomKeyStore</code>, use the <a>DisconnectCustomKeyStore</a>\\n      operation to disconnect the custom key store. After the <code>UpdateCustomKeyStore</code>\\n      operation completes, use the <a>ConnectCustomKeyStore</a> to reconnect the custom\\n      key store. To find the <code>ConnectionState</code> of the custom key store, use the <a>DescribeCustomKeyStores</a> operation. </p>\\n         <p>\\n    </p>\\n         <p>Before updating the custom key store, verify that the new values allow KMS to connect\\n      the custom key store to its backing key store. For example, before you change the\\n        <code>XksProxyUriPath</code> value, verify that the external key store proxy is reachable at\\n      the new path.</p>\\n         <p>If the operation succeeds, it returns a JSON object with no\\nproperties.</p>\\n         <p>\\n            <b>Cross-account use</b>: No. You cannot perform this operation on a custom key store in a different Amazon Web Services account.</p>\\n         <p>\\n            <b>Required permissions</b>: <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/kms-api-permissions-reference.html\\\">kms:UpdateCustomKeyStore</a> (IAM policy)</p>\\n         <p>\\n            <b>Related operations:</b>\\n         </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a>ConnectCustomKeyStore</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>CreateCustomKeyStore</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>DeleteCustomKeyStore</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>DescribeCustomKeyStores</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>DisconnectCustomKeyStore</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>\\n            <b>Eventual consistency</b>: The KMS API follows an eventual consistency model. \\n  For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/accessing-kms.html#programming-eventual-consistency\\\">KMS eventual consistency</a>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To edit the friendly name of a custom key store\",\n                        \"documentation\": \"This example changes the friendly name of the AWS KMS custom key store to the name that you specify. This operation does not return any data. To verify that the operation worked, use the DescribeCustomKeyStores operation.\",\n                        \"input\": {\n                            \"CustomKeyStoreId\": \"cks-1234567890abcdef0\",\n                            \"NewCustomKeyStoreName\": \"DevelopmentKeys\"\n                        },\n                        \"output\": {}\n                    },\n                    {\n                        \"title\": \"To edit the password of an AWS CloudHSM key store\",\n                        \"documentation\": \"This example tells AWS KMS the password for the kmsuser crypto user in the AWS CloudHSM cluster that is associated with the AWS KMS custom key store. (It does not change the password in the CloudHSM cluster.) This operation does not return any data.\",\n                        \"input\": {\n                            \"CustomKeyStoreId\": \"cks-1234567890abcdef0\",\n                            \"KeyStorePassword\": \"ExamplePassword\"\n                        },\n                        \"output\": {}\n                    },\n                    {\n                        \"title\": \"To update the proxy connectivity of an external key store to VPC_ENDPOINT_SERVICE\",\n                        \"documentation\": \"To change the external key store proxy connectivity option from public endpoint connectivity to VPC endpoint service connectivity, in addition to changing the <code>XksProxyConnectivity</code> value, you must change the <code>XksProxyUriEndpoint</code> value to reflect the private DNS name associated with the VPC endpoint service. You must also add an <code>XksProxyVpcEndpointServiceName</code> value.\",\n                        \"input\": {\n                            \"CustomKeyStoreId\": \"cks-1234567890abcdef0\",\n                            \"XksProxyConnectivity\": \"VPC_ENDPOINT_SERVICE\",\n                            \"XksProxyUriEndpoint\": \"https://myproxy-private.xks.example.com\",\n                            \"XksProxyVpcEndpointServiceName\": \"com.amazonaws.vpce.us-east-1.vpce-svc-example\"\n                        },\n                        \"output\": {}\n                    },\n                    {\n                        \"title\": \"To edit the proxy URI path of an external key store.\",\n                        \"documentation\": \"This example updates the proxy URI path for an external key store\",\n                        \"input\": {\n                            \"CustomKeyStoreId\": \"cks-1234567890abcdef0\",\n                            \"XksProxyUriPath\": \"/new-path/kms/xks/v1\"\n                        },\n                        \"output\": {}\n                    },\n                    {\n                        \"title\": \"To associate the custom key store with a different, but related, AWS CloudHSM cluster.\",\n                        \"documentation\": \"This example changes the AWS CloudHSM cluster that is associated with an AWS CloudHSM key store to a related cluster, such as a different backup of the same cluster. This operation does not return any data. To verify that the operation worked, use the DescribeCustomKeyStores operation.\",\n                        \"input\": {\n                            \"CustomKeyStoreId\": \"cks-1234567890abcdef0\",\n                            \"CloudHsmClusterId\": \"cluster-234abcdefABC\"\n                        },\n                        \"output\": {}\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.kms#UpdateCustomKeyStoreRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CustomKeyStoreId\": {\n                    \"target\": \"com.amazonaws.kms#CustomKeyStoreIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Identifies the custom key store that you want to update. Enter the ID of the custom key\\n      store. To find the ID of a custom key store, use the <a>DescribeCustomKeyStores</a> operation.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"NewCustomKeyStoreName\": {\n                    \"target\": \"com.amazonaws.kms#CustomKeyStoreNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Changes the friendly name of the custom key store to the value that you specify. The\\n      custom key store name must be unique in the Amazon Web Services account.</p>\\n         <important>\\n            <p>Do not include confidential or sensitive information in this field. This field may be displayed in plaintext in CloudTrail logs and other output.</p>\\n         </important>\\n         <p>To change this value, an CloudHSM key store must be disconnected. An external key store can\\n      be connected or disconnected.</p>\"\n                    }\n                },\n                \"KeyStorePassword\": {\n                    \"target\": \"com.amazonaws.kms#KeyStorePasswordType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Enter the current password of the <code>kmsuser</code> crypto user (CU) in the CloudHSM\\n      cluster that is associated with the custom key store. This parameter is valid only for custom\\n      key stores with a <code>CustomKeyStoreType</code> of <code>AWS_CLOUDHSM</code>.</p>\\n         <p>This parameter tells KMS the current password of the <code>kmsuser</code> crypto user\\n      (CU). It does not set or change the password of any users in the CloudHSM cluster.</p>\\n         <p>To change this value, the CloudHSM key store must be disconnected.</p>\"\n                    }\n                },\n                \"CloudHsmClusterId\": {\n                    \"target\": \"com.amazonaws.kms#CloudHsmClusterIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Associates the custom key store with a related CloudHSM cluster. This parameter is valid only\\n      for custom key stores with a <code>CustomKeyStoreType</code> of\\n      <code>AWS_CLOUDHSM</code>.</p>\\n         <p>Enter the cluster ID of the cluster that you used to create the custom key store or a\\n      cluster that shares a backup history and has the same cluster certificate as the original\\n      cluster. You cannot use this parameter to associate a custom key store with an unrelated\\n      cluster. In addition, the replacement cluster must <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/create-keystore.html#before-keystore\\\">fulfill the requirements</a> for\\n      a cluster associated with a custom key store. To view the cluster certificate of a cluster,\\n      use the <a href=\\\"https://docs.aws.amazon.com/cloudhsm/latest/APIReference/API_DescribeClusters.html\\\">DescribeClusters</a> operation.</p>\\n         <p>To change this value, the CloudHSM key store must be disconnected.</p>\"\n                    }\n                },\n                \"XksProxyUriEndpoint\": {\n                    \"target\": \"com.amazonaws.kms#XksProxyUriEndpointType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Changes the URI endpoint that KMS uses to connect to your external key store proxy (XKS\\n      proxy). This parameter is valid only for custom key stores with a\\n        <code>CustomKeyStoreType</code> of <code>EXTERNAL_KEY_STORE</code>.</p>\\n         <p>For external key stores with an <code>XksProxyConnectivity</code> value of\\n        <code>PUBLIC_ENDPOINT</code>, the protocol must be HTTPS.</p>\\n         <p>For external key stores with an <code>XksProxyConnectivity</code> value of\\n        <code>VPC_ENDPOINT_SERVICE</code>, specify <code>https://</code> followed by the private DNS\\n      name associated with the VPC endpoint service. Each external key store must use a different\\n      private DNS name.</p>\\n         <p>The combined <code>XksProxyUriEndpoint</code> and <code>XksProxyUriPath</code> values must\\n      be unique in the Amazon Web Services account and Region.</p>\\n         <p>To change this value, the external key store must be disconnected.</p>\"\n                    }\n                },\n                \"XksProxyUriPath\": {\n                    \"target\": \"com.amazonaws.kms#XksProxyUriPathType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Changes the base path to the proxy APIs for this external key store. To find this value,\\n      see the documentation for your external key manager and external key store proxy (XKS proxy).\\n      This parameter is valid only for custom key stores with a <code>CustomKeyStoreType</code> of\\n        <code>EXTERNAL_KEY_STORE</code>.</p>\\n         <p>The value must start with <code>/</code> and must end with <code>/kms/xks/v1</code>, where\\n        <code>v1</code> represents the version of the KMS external key store proxy API. You can\\n      include an optional prefix between the required elements such as\\n          <code>/<i>example</i>/kms/xks/v1</code>.</p>\\n         <p>The combined <code>XksProxyUriEndpoint</code> and <code>XksProxyUriPath</code> values must\\n      be unique in the Amazon Web Services account and Region.</p>\\n         <p>You can change this value when the external key store is connected or disconnected.</p>\"\n                    }\n                },\n                \"XksProxyVpcEndpointServiceName\": {\n                    \"target\": \"com.amazonaws.kms#XksProxyVpcEndpointServiceNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Changes the name that KMS uses to identify the Amazon VPC endpoint service for your external\\n      key store proxy (XKS proxy). This parameter is valid when the <code>CustomKeyStoreType</code>\\n      is <code>EXTERNAL_KEY_STORE</code> and the <code>XksProxyConnectivity</code> is\\n        <code>VPC_ENDPOINT_SERVICE</code>.</p>\\n         <p>To change this value, the external key store must be disconnected.</p>\"\n                    }\n                },\n                \"XksProxyAuthenticationCredential\": {\n                    \"target\": \"com.amazonaws.kms#XksProxyAuthenticationCredentialType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Changes the credentials that KMS uses to sign requests to the external key store proxy\\n      (XKS proxy). This parameter is valid only for custom key stores with a\\n        <code>CustomKeyStoreType</code> of <code>EXTERNAL_KEY_STORE</code>.</p>\\n         <p>You must specify both the <code>AccessKeyId</code> and <code>SecretAccessKey</code> value\\n      in the authentication credential, even if you are only updating one value.</p>\\n         <p>This parameter doesn't establish or change your authentication credentials on the proxy.\\n      It just tells KMS the credential that you established with your external key store proxy.\\n      For example, if you rotate the credential on your external key store proxy, you can use this\\n      parameter to update the credential in KMS.</p>\\n         <p>You can change this value when the external key store is connected or disconnected.</p>\"\n                    }\n                },\n                \"XksProxyConnectivity\": {\n                    \"target\": \"com.amazonaws.kms#XksProxyConnectivityType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Changes the connectivity setting for the external key store. To indicate that the external\\n      key store proxy uses a Amazon VPC endpoint service to communicate with KMS, specify\\n        <code>VPC_ENDPOINT_SERVICE</code>. Otherwise, specify <code>PUBLIC_ENDPOINT</code>.</p>\\n         <p>If you change the <code>XksProxyConnectivity</code> to <code>VPC_ENDPOINT_SERVICE</code>,\\n      you must also change the <code>XksProxyUriEndpoint</code> and add an\\n        <code>XksProxyVpcEndpointServiceName</code> value. </p>\\n         <p>If you change the <code>XksProxyConnectivity</code> to <code>PUBLIC_ENDPOINT</code>, you\\n      must also change the <code>XksProxyUriEndpoint</code> and specify a null or empty string for\\n      the <code>XksProxyVpcEndpointServiceName</code> value.</p>\\n         <p>To change this value, the external key store must be disconnected.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.kms#UpdateCustomKeyStoreResponse\": {\n            \"type\": \"structure\",\n            \"members\": {},\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.kms#UpdateKeyDescription\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.kms#UpdateKeyDescriptionRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.kms#DependencyTimeoutException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#InvalidArnException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInternalException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInvalidStateException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#NotFoundException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Updates the description of a KMS key. To see the description of a KMS key, use <a>DescribeKey</a>. </p>\\n         <p>The KMS key that you use for this operation must be in a compatible key state. For\\ndetails, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/key-state.html\\\">Key states of KMS keys</a> in the <i>Key Management Service Developer Guide</i>.</p>\\n         <p>\\n            <b>Cross-account use</b>: No. You cannot perform this operation on a KMS key in a different Amazon Web Services account. </p>\\n         <p>\\n            <b>Required permissions</b>: <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/kms-api-permissions-reference.html\\\">kms:UpdateKeyDescription</a> (key policy)</p>\\n         <p>\\n            <b>Related operations</b>\\n         </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a>CreateKey</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>DescribeKey</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>\\n            <b>Eventual consistency</b>: The KMS API follows an eventual consistency model. \\n  For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/accessing-kms.html#programming-eventual-consistency\\\">KMS eventual consistency</a>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To update the description of a KMS key\",\n                        \"documentation\": \"The following example updates the description of the specified KMS key.\",\n                        \"input\": {\n                            \"KeyId\": \"1234abcd-12ab-34cd-56ef-1234567890ab\",\n                            \"Description\": \"Example description that indicates the intended use of this KMS key.\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.kms#UpdateKeyDescriptionRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"KeyId\": {\n                    \"target\": \"com.amazonaws.kms#KeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Updates the description of the specified KMS key.</p>\\n         <p>Specify the key ID or key ARN of the KMS key.</p>\\n         <p>For example:</p>\\n         <ul>\\n            <li>\\n               <p>Key ID: <code>1234abcd-12ab-34cd-56ef-1234567890ab</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Key ARN: <code>arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>To get the key ID and key ARN for a KMS key, use <a>ListKeys</a> or <a>DescribeKey</a>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.kms#DescriptionType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>New description for the KMS key.</p>\\n         <important>\\n            <p>Do not include confidential or sensitive information in this field. This field may be displayed in plaintext in CloudTrail logs and other output.</p>\\n         </important>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.kms#UpdatePrimaryRegion\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.kms#UpdatePrimaryRegionRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.kms#DisabledException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#InvalidArnException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInternalException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInvalidStateException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#NotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#UnsupportedOperationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Changes the primary key of a multi-Region key. </p>\\n         <p>This operation changes the replica key in the specified Region to a primary key and\\n      changes the former primary key to a replica key. For example, suppose you have a primary key\\n      in <code>us-east-1</code> and a replica key in <code>eu-west-2</code>. If you run\\n        <code>UpdatePrimaryRegion</code> with a <code>PrimaryRegion</code> value of\\n        <code>eu-west-2</code>, the primary key is now the key in <code>eu-west-2</code>, and the\\n      key in <code>us-east-1</code> becomes a replica key. For details, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/multi-region-update.html\\\">Change the primary key in a\\n        set of multi-Region keys</a> in the <i>Key Management Service Developer Guide</i>.</p>\\n         <p>This operation supports <i>multi-Region keys</i>, an KMS feature that lets you create multiple\\n      interoperable KMS keys in different Amazon Web Services Regions. Because these KMS keys have the same key ID, key\\n      material, and other metadata, you can use them interchangeably to encrypt data in one Amazon Web Services Region and decrypt\\n      it in a different Amazon Web Services Region without re-encrypting the data or making a cross-Region call. For more information about multi-Region keys, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/multi-region-keys-overview.html\\\">Multi-Region keys in KMS</a> in the <i>Key Management Service Developer Guide</i>.</p>\\n         <p>The <i>primary key</i> of a multi-Region key is the source for properties\\n      that are always shared by primary and replica keys, including the key material, <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-id-key-id\\\">key ID</a>, <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-spec\\\">key spec</a>, <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-usage\\\">key usage</a>, <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-origin\\\">key material\\n      origin</a>, and <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/rotate-keys.html\\\">automatic\\n        key rotation</a>. It's the only key that can be replicated. You cannot <a href=\\\"https://docs.aws.amazon.com/kms/latest/APIReference/API_ScheduleKeyDeletion.html\\\">delete the primary\\n        key</a> until all replica keys are deleted.</p>\\n         <p>The key ID and primary Region that you specify uniquely identify the replica key that will\\n      become the primary key. The primary Region must already have a replica key. This operation\\n      does not create a KMS key in the specified Region. To find the replica keys, use the <a>DescribeKey</a> operation on the primary key or any replica key. To create a replica\\n      key, use the <a>ReplicateKey</a> operation.</p>\\n         <p>You can run this operation while using the affected multi-Region keys in cryptographic\\n      operations. This operation should not delay, interrupt, or cause failures in cryptographic\\n      operations. </p>\\n         <p>Even after this operation completes, the process of updating the primary Region might\\n      still be in progress for a few more seconds. Operations such as <code>DescribeKey</code> might\\n      display both the old and new primary keys as replicas. The old and new primary keys have a\\n      transient key state of <code>Updating</code>. The original key state is restored when the\\n      update is complete. While the key state is <code>Updating</code>, you can use the keys in\\n      cryptographic operations, but you cannot replicate the new primary key or perform certain\\n      management operations, such as enabling or disabling these keys. For details about the\\n        <code>Updating</code> key state, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/key-state.html\\\">Key states of KMS keys</a> in the <i>Key Management Service Developer Guide</i>.</p>\\n         <p>This operation does not return any output. To verify that primary key is changed, use the\\n        <a>DescribeKey</a> operation.</p>\\n         <p>\\n            <b>Cross-account use</b>: No. You cannot use this operation in a\\n      different Amazon Web Services account. </p>\\n         <p>\\n            <b>Required permissions</b>: </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>kms:UpdatePrimaryRegion</code> on the current primary key (in the primary key's\\n          Region). Include this permission primary key's key policy.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>kms:UpdatePrimaryRegion</code> on the current replica key (in the replica key's\\n          Region). Include this permission in the replica key's key policy.</p>\\n            </li>\\n         </ul>\\n         <p>\\n            <b>Related operations</b>\\n         </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a>CreateKey</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>ReplicateKey</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>\\n            <b>Eventual consistency</b>: The KMS API follows an eventual consistency model. \\n  For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/accessing-kms.html#programming-eventual-consistency\\\">KMS eventual consistency</a>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To update the primary Region of a multi-Region KMS key\",\n                        \"documentation\": \"The following UpdatePrimaryRegion example changes the multi-Region replica key in the eu-central-1 Region to the primary key. The current primary key in the us-west-1 Region becomes a replica key. \\n\\nThe KeyId parameter identifies the current primary key in the us-west-1 Region. The PrimaryRegion parameter indicates the Region of the replica key that will become the new primary key.\\n\\nThis operation does not return any output. To verify that primary key is changed, use the DescribeKey operation.\",\n                        \"input\": {\n                            \"KeyId\": \"arn:aws:kms:us-west-1:111122223333:key/mrk-1234abcd12ab34cd56ef1234567890ab\",\n                            \"PrimaryRegion\": \"eu-central-1\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.kms#UpdatePrimaryRegionRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"KeyId\": {\n                    \"target\": \"com.amazonaws.kms#KeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Identifies the current primary key. When the operation completes, this KMS key will be a\\n      replica key.</p>\\n         <p>Specify the key ID or key ARN of a multi-Region primary key.</p>\\n         <p>For example:</p>\\n         <ul>\\n            <li>\\n               <p>Key ID: <code>mrk-1234abcd12ab34cd56ef1234567890ab</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Key ARN: <code>arn:aws:kms:us-east-2:111122223333:key/mrk-1234abcd12ab34cd56ef1234567890ab</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>To get the key ID and key ARN for a KMS key, use <a>ListKeys</a> or <a>DescribeKey</a>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"PrimaryRegion\": {\n                    \"target\": \"com.amazonaws.kms#RegionType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services Region of the new primary key. Enter the Region ID, such as\\n        <code>us-east-1</code> or <code>ap-southeast-2</code>. There must be an existing replica key\\n      in this Region. </p>\\n         <p>When the operation completes, the multi-Region key in this Region will be the primary\\n      key.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.kms#Verify\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.kms#VerifyRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.kms#VerifyResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.kms#DependencyTimeoutException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#DisabledException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#DryRunOperationException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#InvalidGrantTokenException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#InvalidKeyUsageException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KeyUnavailableException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInternalException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInvalidSignatureException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInvalidStateException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#NotFoundException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Verifies a digital signature that was generated by the <a>Sign</a> operation. </p>\\n         <p></p>\\n         <p>Verification confirms that an authorized user signed the message with the specified KMS\\n      key and signing algorithm, and the message hasn't changed since it was signed. If the\\n      signature is verified, the value of the <code>SignatureValid</code> field in the response is\\n        <code>True</code>. If the signature verification fails, the <code>Verify</code> operation\\n      fails with an <code>KMSInvalidSignatureException</code> exception.</p>\\n         <p>A digital signature is generated by using the private key in an asymmetric KMS key. The\\n      signature is verified by using the public key in the same asymmetric KMS key.\\n      For information about asymmetric KMS keys, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/symmetric-asymmetric.html\\\">Asymmetric KMS keys</a> in the <i>Key Management Service Developer Guide</i>.</p>\\n         <p>To use the <code>Verify</code> operation, specify the same asymmetric KMS key, message,\\n      and signing algorithm that were used to produce the signature. The message type does not need\\n      to be the same as the one used for signing, but it must indicate whether the value of the\\n        <code>Message</code> parameter should be hashed as part of the verification process.</p>\\n         <p>You can also verify the digital signature by using the public key of the KMS key outside\\n      of KMS. Use the <a>GetPublicKey</a> operation to download the public key in the\\n      asymmetric KMS key and then use the public key to verify the signature outside of KMS. The\\n      advantage of using the <code>Verify</code> operation is that it is performed within KMS. As\\n      a result, it's easy to call, the operation is performed within the FIPS boundary, it is logged\\n      in CloudTrail, and you can use key policy and IAM policy to determine who is authorized to use\\n      the KMS key to verify signatures.</p>\\n         <p>To verify a signature outside of KMS with an SM2 public key (China Regions only), you\\n      must specify the distinguishing ID. By default, KMS uses <code>1234567812345678</code> as\\n      the distinguishing ID. For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/offline-operations.html#key-spec-sm-offline-verification\\\">Offline\\n        verification with SM2 key pairs</a>.</p>\\n         <p>The KMS key that you use for this operation must be in a compatible key state. For\\ndetails, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/key-state.html\\\">Key states of KMS keys</a> in the <i>Key Management Service Developer Guide</i>.</p>\\n         <p>\\n            <b>Cross-account use</b>: Yes. To perform this operation with a KMS key in a different Amazon Web Services account, specify\\n  the key ARN or alias ARN in the value of the <code>KeyId</code> parameter. </p>\\n         <p>\\n            <b>Required permissions</b>: <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/kms-api-permissions-reference.html\\\">kms:Verify</a> (key policy)</p>\\n         <p>\\n            <b>Related operations</b>: <a>Sign</a>\\n         </p>\\n         <p>\\n            <b>Eventual consistency</b>: The KMS API follows an eventual consistency model. \\n  For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/accessing-kms.html#programming-eventual-consistency\\\">KMS eventual consistency</a>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To use an asymmetric KMS key to verify a digital signature\",\n                        \"documentation\": \"This operation uses the public key in an elliptic curve (ECC) asymmetric key to verify a digital signature within AWS KMS.\",\n                        \"input\": {\n                            \"KeyId\": \"alias/ECC_signing_key\",\n                            \"Message\": \"<message to be verified>\",\n                            \"MessageType\": \"RAW\",\n                            \"Signature\": \"<binary data>\",\n                            \"SigningAlgorithm\": \"ECDSA_SHA_384\"\n                        },\n                        \"output\": {\n                            \"KeyId\": \"arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab\",\n                            \"SignatureValid\": true,\n                            \"SigningAlgorithm\": \"ECDSA_SHA_384\"\n                        }\n                    },\n                    {\n                        \"title\": \"To use an asymmetric KMS key to verify a digital signature on a message digest\",\n                        \"documentation\": \"This operation uses the public key in an RSA asymmetric signing key pair to verify the digital signature of a message digest. Hashing a message into a digest before sending it to KMS lets you verify messages that exceed the 4096-byte message size limit. To indicate that the value of Message is a digest, use the MessageType parameter \",\n                        \"input\": {\n                            \"KeyId\": \"arn:aws:kms:us-east-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321\",\n                            \"Message\": \"<message digest to be verified>\",\n                            \"MessageType\": \"DIGEST\",\n                            \"Signature\": \"<binary data>\",\n                            \"SigningAlgorithm\": \"RSASSA_PSS_SHA_512\"\n                        },\n                        \"output\": {\n                            \"KeyId\": \"arn:aws:kms:us-east-2:111122223333:key/0987dcba-09fe-87dc-65ba-ab0987654321\",\n                            \"SignatureValid\": true,\n                            \"SigningAlgorithm\": \"RSASSA_PSS_SHA_512\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.kms#VerifyMac\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.kms#VerifyMacRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.kms#VerifyMacResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.kms#DisabledException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#DryRunOperationException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#InvalidGrantTokenException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#InvalidKeyUsageException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KeyUnavailableException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInternalException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInvalidMacException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#KMSInvalidStateException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.kms#NotFoundException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Verifies the hash-based message authentication code (HMAC) for a specified message, HMAC\\n      KMS key, and MAC algorithm. To verify the HMAC, <code>VerifyMac</code> computes an HMAC using\\n      the message, HMAC KMS key, and MAC algorithm that you specify, and compares the computed HMAC\\n      to the HMAC that you specify. If the HMACs are identical, the verification succeeds;\\n      otherwise, it fails. Verification indicates that the message hasn't changed since the HMAC was\\n      calculated, and the specified key was used to generate and verify the HMAC.</p>\\n         <p>HMAC KMS keys and the HMAC algorithms that KMS uses conform to industry standards\\n      defined in <a href=\\\"https://datatracker.ietf.org/doc/html/rfc2104\\\">RFC 2104</a>.</p>\\n         <p>This operation is part of KMS support for HMAC KMS keys. For details, see\\n        <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/hmac.html\\\">HMAC keys in KMS</a> in the\\n      <i>Key Management Service Developer Guide</i>.</p>\\n         <p>The KMS key that you use for this operation must be in a compatible key state. For\\ndetails, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/key-state.html\\\">Key states of KMS keys</a> in the <i>Key Management Service Developer Guide</i>.</p>\\n         <p>\\n            <b>Cross-account use</b>: Yes. To perform this operation with a KMS key in a different Amazon Web Services account, specify\\n  the key ARN or alias ARN in the value of the <code>KeyId</code> parameter. </p>\\n         <p>\\n            <b>Required permissions</b>: <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/kms-api-permissions-reference.html\\\">kms:VerifyMac</a> (key policy)</p>\\n         <p>\\n            <b>Related operations</b>: <a>GenerateMac</a>\\n         </p>\\n         <p>\\n            <b>Eventual consistency</b>: The KMS API follows an eventual consistency model. \\n  For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/accessing-kms.html#programming-eventual-consistency\\\">KMS eventual consistency</a>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To verify an HMAC\",\n                        \"documentation\": \"This example verifies an HMAC for a particular message, HMAC KMS keys, and MAC algorithm. A value of 'true' in the MacValid value in the response indicates that the HMAC is valid.\",\n                        \"input\": {\n                            \"Message\": \"Hello World\",\n                            \"KeyId\": \"1234abcd-12ab-34cd-56ef-1234567890ab\",\n                            \"MacAlgorithm\": \"HMAC_SHA_384\",\n                            \"Mac\": \"<HMAC_TAG>\"\n                        },\n                        \"output\": {\n                            \"KeyId\": \"arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab\",\n                            \"MacValid\": true,\n                            \"MacAlgorithm\": \"HMAC_SHA_384\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.kms#VerifyMacRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Message\": {\n                    \"target\": \"com.amazonaws.kms#PlaintextType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The message that will be used in the verification. Enter the same message that was used to\\n      generate the HMAC.</p>\\n         <p>\\n            <a>GenerateMac</a> and <code>VerifyMac</code> do not provide special handling\\n      for message digests. If you generated an HMAC for a hash digest of a message, you must verify\\n      the HMAC for the same hash digest.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"KeyId\": {\n                    \"target\": \"com.amazonaws.kms#KeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The KMS key that will be used in the verification.</p>\\n         <p>Enter a key ID of the KMS key that was used to generate the HMAC. If you identify a\\n      different KMS key, the <code>VerifyMac</code> operation fails.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"MacAlgorithm\": {\n                    \"target\": \"com.amazonaws.kms#MacAlgorithmSpec\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The MAC algorithm that will be used in the verification. Enter the same MAC algorithm that\\n      was used to compute the HMAC. This algorithm must be supported by the HMAC KMS key identified\\n      by the <code>KeyId</code> parameter.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Mac\": {\n                    \"target\": \"com.amazonaws.kms#CiphertextType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The HMAC to verify. Enter the HMAC that was generated by the <a>GenerateMac</a>\\n      operation when you specified the same message, HMAC KMS key, and MAC algorithm as the values\\n      specified in this request.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"GrantTokens\": {\n                    \"target\": \"com.amazonaws.kms#GrantTokenList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of grant tokens.</p>\\n         <p>Use a grant token when your permission to call this operation comes from a new grant that has not yet achieved <i>eventual consistency</i>. For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/grants.html#grant_token\\\">Grant token</a> and <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/using-grant-token.html\\\">Using a grant token</a> in the\\n    <i>Key Management Service Developer Guide</i>.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.kms#NullableBooleanType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks if your request will succeed. <code>DryRun</code> is an optional parameter. </p>\\n         <p>To learn more about how to use this parameter, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/testing-permissions.html\\\">Testing your permissions</a> in the <i>Key Management Service Developer Guide</i>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.kms#VerifyMacResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"KeyId\": {\n                    \"target\": \"com.amazonaws.kms#KeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The HMAC KMS key used in the verification.</p>\"\n                    }\n                },\n                \"MacValid\": {\n                    \"target\": \"com.amazonaws.kms#BooleanType\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>A Boolean value that indicates whether the HMAC was verified. A value of <code>True</code>\\n      indicates that the HMAC (<code>Mac</code>) was generated with the specified\\n        <code>Message</code>, HMAC KMS key (<code>KeyID</code>) and\\n      <code>MacAlgorithm.</code>.</p>\\n         <p>If the HMAC is not verified, the <code>VerifyMac</code> operation fails with a\\n        <code>KMSInvalidMacException</code> exception. This exception indicates that one or more of\\n      the inputs changed since the HMAC was computed.</p>\"\n                    }\n                },\n                \"MacAlgorithm\": {\n                    \"target\": \"com.amazonaws.kms#MacAlgorithmSpec\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The MAC algorithm used in the verification.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.kms#VerifyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"KeyId\": {\n                    \"target\": \"com.amazonaws.kms#KeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Identifies the asymmetric KMS key that will be used to verify the signature. This must be\\n      the same KMS key that was used to generate the signature. If you specify a different KMS key,\\n      the signature verification fails.</p>\\n         <p>To specify a KMS key, use its key ID, key ARN, alias name, or alias ARN. When using an alias name, prefix it with <code>\\\"alias/\\\"</code>. To specify a KMS key in a different Amazon Web Services account, you must use the key ARN or alias ARN.</p>\\n         <p>For example:</p>\\n         <ul>\\n            <li>\\n               <p>Key ID: <code>1234abcd-12ab-34cd-56ef-1234567890ab</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Key ARN: <code>arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Alias name: <code>alias/ExampleAlias</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Alias ARN: <code>arn:aws:kms:us-east-2:111122223333:alias/ExampleAlias</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>To get the key ID and key ARN for a KMS key, use <a>ListKeys</a> or <a>DescribeKey</a>. To get the alias name and alias ARN, use <a>ListAliases</a>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Message\": {\n                    \"target\": \"com.amazonaws.kms#PlaintextType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the message that was signed. You can submit a raw message of up to 4096 bytes,\\n      or a hash digest of the message. If you submit a digest, use the <code>MessageType</code>\\n      parameter with a value of <code>DIGEST</code>.</p>\\n         <p>If the message specified here is different from the message that was signed, the signature\\n      verification fails. A message and its hash digest are considered to be the same\\n      message.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"MessageType\": {\n                    \"target\": \"com.amazonaws.kms#MessageType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Tells KMS whether the value of the <code>Message</code> parameter should be hashed as\\n      part of the signing algorithm. Use <code>RAW</code> for unhashed messages; use\\n        <code>DIGEST</code> for message digests, which are already hashed; use\\n        <code>EXTERNAL_MU</code> for 64-byte representative μ used in ML-DSA signing as defined\\n      in NIST FIPS 204 Section 6.2.</p>\\n         <p>When the value of <code>MessageType</code> is <code>RAW</code>, KMS uses the standard\\n      signing algorithm, which begins with a hash function. When the value is <code>DIGEST</code>,\\n      KMS skips the hashing step in the signing algorithm. When the value is\\n        <code>EXTERNAL_MU</code> KMS skips the concatenated hashing of the public key hash and the\\n      message done in the ML-DSA signing algorithm.</p>\\n         <important>\\n            <p>Use the <code>DIGEST</code> or <code>EXTERNAL_MU</code> value only when the value of the\\n          <code>Message</code> parameter is a message digest. If you use the <code>DIGEST</code>\\n        value with an unhashed message, the security of the signing operation can be\\n        compromised.</p>\\n         </important>\\n         <p>When the value of <code>MessageType</code> is <code>DIGEST</code>, the length of the\\n        <code>Message</code> value must match the length of hashed messages for the specified\\n      signing algorithm.</p>\\n         <p>When the value of <code>MessageType</code> is <code>EXTERNAL_MU</code> the length of the\\n        <code>Message</code> value must be 64 bytes.</p>\\n         <p>You can submit a message digest and omit the <code>MessageType</code> or specify\\n        <code>RAW</code> so the digest is hashed again while signing. However, if the signed message\\n      is hashed once while signing, but twice while verifying, verification fails, even when the\\n      message hasn't changed.</p>\\n         <p>The hashing algorithm that <code>Verify</code> uses is based on the\\n        <code>SigningAlgorithm</code> value.</p>\\n         <ul>\\n            <li>\\n               <p>Signing algorithms that end in SHA_256 use the SHA_256 hashing algorithm.</p>\\n            </li>\\n            <li>\\n               <p>Signing algorithms that end in SHA_384 use the SHA_384 hashing algorithm.</p>\\n            </li>\\n            <li>\\n               <p>Signing algorithms that end in SHA_512 use the SHA_512 hashing algorithm.</p>\\n            </li>\\n            <li>\\n               <p>Signing algorithms that end in SHAKE_256 use the SHAKE_256 hashing algorithm.</p>\\n            </li>\\n            <li>\\n               <p>SM2DSA uses the SM3 hashing algorithm. For details, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/offline-operations.html#key-spec-sm-offline-verification\\\">Offline\\n            verification with SM2 key pairs</a>.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"Signature\": {\n                    \"target\": \"com.amazonaws.kms#CiphertextType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The signature that the <code>Sign</code> operation generated.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"SigningAlgorithm\": {\n                    \"target\": \"com.amazonaws.kms#SigningAlgorithmSpec\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The signing algorithm that was used to sign the message. If you submit a different\\n      algorithm, the signature verification fails.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"GrantTokens\": {\n                    \"target\": \"com.amazonaws.kms#GrantTokenList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of grant tokens.</p>\\n         <p>Use a grant token when your permission to call this operation comes from a new grant that has not yet achieved <i>eventual consistency</i>. For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/grants.html#grant_token\\\">Grant token</a> and <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/using-grant-token.html\\\">Using a grant token</a> in the\\n    <i>Key Management Service Developer Guide</i>.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.kms#NullableBooleanType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Checks if your request will succeed. <code>DryRun</code> is an optional parameter. </p>\\n         <p>To learn more about how to use this parameter, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/testing-permissions.html\\\">Testing your permissions</a> in the <i>Key Management Service Developer Guide</i>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.kms#VerifyResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"KeyId\": {\n                    \"target\": \"com.amazonaws.kms#KeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (<a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-id-key-ARN\\\">key ARN</a>) of the asymmetric KMS key that was used to verify the signature.</p>\"\n                    }\n                },\n                \"SignatureValid\": {\n                    \"target\": \"com.amazonaws.kms#BooleanType\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>A Boolean value that indicates whether the signature was verified. A value of\\n        <code>True</code> indicates that the <code>Signature</code> was produced by signing the\\n        <code>Message</code> with the specified <code>KeyID</code> and\\n        <code>SigningAlgorithm.</code> If the signature is not verified, the <code>Verify</code>\\n      operation fails with a <code>KMSInvalidSignatureException</code> exception. </p>\"\n                    }\n                },\n                \"SigningAlgorithm\": {\n                    \"target\": \"com.amazonaws.kms#SigningAlgorithmSpec\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The signing algorithm that was used to verify the signature.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.kms#WrappingKeySpec\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"RSA_2048\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"RSA_2048\"\n                    }\n                },\n                \"RSA_3072\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"RSA_3072\"\n                    }\n                },\n                \"RSA_4096\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"RSA_4096\"\n                    }\n                },\n                \"SM2\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"SM2\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.kms#XksKeyAlreadyInUseException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.kms#ErrorMessageType\"\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"XksKeyAlreadyInUse\",\n                    \"httpResponseCode\": 400\n                },\n                \"smithy.api#documentation\": \"<p>The request was rejected because the (<code>XksKeyId</code>) is already associated with\\n      another KMS key in this external key store. Each KMS key in an external key store must be\\n      associated with a different external key.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.kms#XksKeyConfigurationType\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Id\": {\n                    \"target\": \"com.amazonaws.kms#XksKeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the external key in its external key manager. This is the ID that the external\\n      key store proxy uses to identify the external key.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about the <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/keystore-external.html#concept-external-key\\\">external key </a>that is\\n      associated with a KMS key in an external key store. </p>\\n         <p>This element appears in a <a>CreateKey</a> or <a>DescribeKey</a>\\n      response only for a KMS key in an external key store.</p>\\n         <p>The <i>external key</i> is a symmetric encryption key that is hosted by an\\n      external key manager outside of Amazon Web Services. When you use the KMS key in an external key store in a\\n      cryptographic operation, the cryptographic operation is performed in the external key manager\\n      using the specified external key. For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/keystore-external.html#concept-external-key\\\">External key</a> in the\\n      <i>Key Management Service Developer Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.kms#XksKeyIdType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 128\n                },\n                \"smithy.api#pattern\": \"^[a-zA-Z0-9-_.]+$\"\n            }\n        },\n        \"com.amazonaws.kms#XksKeyInvalidConfigurationException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.kms#ErrorMessageType\"\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"XksKeyInvalidConfiguration\",\n                    \"httpResponseCode\": 400\n                },\n                \"smithy.api#documentation\": \"<p>The request was rejected because the external key specified by the <code>XksKeyId</code>\\n      parameter did not meet the configuration requirements for an external key store.</p>\\n         <p>The external key must be an AES-256 symmetric key that is enabled and performs encryption\\n      and decryption.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.kms#XksKeyNotFoundException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.kms#ErrorMessageType\"\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"XksKeyNotFoundException\",\n                    \"httpResponseCode\": 400\n                },\n                \"smithy.api#documentation\": \"<p>The request was rejected because the external key store proxy could not find the external\\n      key. This exception is thrown when the value of the <code>XksKeyId</code> parameter doesn't\\n      identify a key in the external key manager associated with the external key proxy.</p>\\n         <p>Verify that the <code>XksKeyId</code> represents an existing key in the external key\\n      manager. Use the key identifier that the external key store proxy uses to identify the key.\\n      For details, see the documentation provided with your external key store proxy or key\\n      manager.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.kms#XksProxyAuthenticationAccessKeyIdType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 20,\n                    \"max\": 30\n                },\n                \"smithy.api#pattern\": \"^[A-Z2-7]+$\",\n                \"smithy.api#sensitive\": {}\n            }\n        },\n        \"com.amazonaws.kms#XksProxyAuthenticationCredentialType\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccessKeyId\": {\n                    \"target\": \"com.amazonaws.kms#XksProxyAuthenticationAccessKeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A unique identifier for the raw secret access key.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"RawSecretAccessKey\": {\n                    \"target\": \"com.amazonaws.kms#XksProxyAuthenticationRawSecretAccessKeyType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A secret string of 43-64 characters. Valid characters are a-z, A-Z, 0-9, /, +, and\\n      =.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>KMS uses the authentication credential to sign requests that it sends to the external\\n      key store proxy (XKS proxy) on your behalf. You establish these credentials on your external\\n      key store proxy and report them to KMS.</p>\\n         <p>The <code>XksProxyAuthenticationCredential</code> includes two required elements.</p>\"\n            }\n        },\n        \"com.amazonaws.kms#XksProxyAuthenticationRawSecretAccessKeyType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 43,\n                    \"max\": 64\n                },\n                \"smithy.api#pattern\": \"^[a-zA-Z0-9\\\\/+=]+$\",\n                \"smithy.api#sensitive\": {}\n            }\n        },\n        \"com.amazonaws.kms#XksProxyConfigurationType\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Connectivity\": {\n                    \"target\": \"com.amazonaws.kms#XksProxyConnectivityType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether the external key store proxy uses a public endpoint or an Amazon VPC endpoint\\n      service to communicate with KMS.</p>\"\n                    }\n                },\n                \"AccessKeyId\": {\n                    \"target\": \"com.amazonaws.kms#XksProxyAuthenticationAccessKeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The part of the external key store <a href=\\\"https://docs.aws.amazon.com/kms/latest/APIReference/API_CreateCustomKeyStore.html#KMS-CreateCustomKeyStore-request-XksProxyAuthenticationCredential\\\">proxy authentication credential</a> that uniquely identifies the secret access\\n      key.</p>\"\n                    }\n                },\n                \"UriEndpoint\": {\n                    \"target\": \"com.amazonaws.kms#XksProxyUriEndpointType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The URI endpoint for the external key store proxy.</p>\\n         <p>If the external key store proxy has a public endpoint, it is displayed here.</p>\\n         <p>If the external key store proxy uses an Amazon VPC endpoint service name, this field displays\\n      the private DNS name associated with the VPC endpoint service.</p>\"\n                    }\n                },\n                \"UriPath\": {\n                    \"target\": \"com.amazonaws.kms#XksProxyUriPathType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The path to the external key store proxy APIs.</p>\"\n                    }\n                },\n                \"VpcEndpointServiceName\": {\n                    \"target\": \"com.amazonaws.kms#XksProxyVpcEndpointServiceNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon VPC endpoint service used to communicate with the external key store proxy. This\\n      field appears only when the external key store proxy uses an Amazon VPC endpoint service to\\n      communicate with KMS.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Detailed information about the external key store proxy (XKS proxy). Your external key\\n      store proxy translates KMS requests into a format that your external key manager can\\n      understand. These fields appear in a <a>DescribeCustomKeyStores</a> response only\\n      when the <code>CustomKeyStoreType</code> is <code>EXTERNAL_KEY_STORE</code>.</p>\"\n            }\n        },\n        \"com.amazonaws.kms#XksProxyConnectivityType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"PUBLIC_ENDPOINT\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"PUBLIC_ENDPOINT\"\n                    }\n                },\n                \"VPC_ENDPOINT_SERVICE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"VPC_ENDPOINT_SERVICE\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.kms#XksProxyIncorrectAuthenticationCredentialException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.kms#ErrorMessageType\"\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"XksProxyIncorrectAuthenticationCredentialException\",\n                    \"httpResponseCode\": 400\n                },\n                \"smithy.api#documentation\": \"<p>The request was rejected because the proxy credentials failed to authenticate to the\\n      specified external key store proxy. The specified external key store proxy rejected a status\\n      request from KMS due to invalid credentials. This can indicate an error in the credentials\\n      or in the identification of the external key store proxy.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.kms#XksProxyInvalidConfigurationException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.kms#ErrorMessageType\"\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"XksProxyInvalidConfigurationException\",\n                    \"httpResponseCode\": 400\n                },\n                \"smithy.api#documentation\": \"<p>The request was rejected because the external key store proxy is not configured correctly.\\n      To identify the cause, see the error message that accompanies the exception.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.kms#XksProxyInvalidResponseException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.kms#ErrorMessageType\"\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"XksProxyInvalidResponseException\",\n                    \"httpResponseCode\": 400\n                },\n                \"smithy.api#documentation\": \"<p></p>\\n         <p>KMS cannot interpret the response it received from the external key store proxy. The\\n      problem might be a poorly constructed response, but it could also be a transient network\\n      issue. If you see this error repeatedly, report it to the proxy vendor.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.kms#XksProxyUriEndpointInUseException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.kms#ErrorMessageType\"\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"XksProxyUriEndpointInUseException\",\n                    \"httpResponseCode\": 400\n                },\n                \"smithy.api#documentation\": \"<p>The request was rejected because the <code>XksProxyUriEndpoint</code> is already\\n      associated with another external key store in this Amazon Web Services Region. To identify the cause, see\\n      the error message that accompanies the exception. </p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.kms#XksProxyUriEndpointType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 10,\n                    \"max\": 128\n                },\n                \"smithy.api#pattern\": \"^https://[a-zA-Z0-9.-]+$\"\n            }\n        },\n        \"com.amazonaws.kms#XksProxyUriInUseException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.kms#ErrorMessageType\"\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"XksProxyUriInUseException\",\n                    \"httpResponseCode\": 400\n                },\n                \"smithy.api#documentation\": \"<p>The request was rejected because the concatenation of the <code>XksProxyUriEndpoint</code>\\n      and <code>XksProxyUriPath</code> is already associated with another external key store in this\\n      Amazon Web Services Region. Each external key store in a Region must use a unique external key store proxy\\n      API address.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.kms#XksProxyUriPathType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 10,\n                    \"max\": 128\n                },\n                \"smithy.api#pattern\": \"^(/[a-zA-Z0-9\\\\/_-]+/kms/xks/v\\\\d{1,2})$|^(/kms/xks/v\\\\d{1,2})$\"\n            }\n        },\n        \"com.amazonaws.kms#XksProxyUriUnreachableException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.kms#ErrorMessageType\"\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"XksProxyUriUnreachableException\",\n                    \"httpResponseCode\": 400\n                },\n                \"smithy.api#documentation\": \"<p>KMS was unable to reach the specified <code>XksProxyUriPath</code>. The path must be\\n      reachable before you create the external key store or update its settings.</p>\\n         <p>This exception is also thrown when the external key store proxy response to a\\n        <code>GetHealthStatus</code> request indicates that all external key manager instances are\\n      unavailable.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.kms#XksProxyVpcEndpointServiceInUseException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.kms#ErrorMessageType\"\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"XksProxyVpcEndpointServiceInUseException\",\n                    \"httpResponseCode\": 400\n                },\n                \"smithy.api#documentation\": \"<p>The request was rejected because the specified Amazon VPC endpoint service is already\\n      associated with another external key store in this Amazon Web Services Region. Each external key store in a\\n      Region must use a different Amazon VPC endpoint service.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.kms#XksProxyVpcEndpointServiceInvalidConfigurationException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.kms#ErrorMessageType\"\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"XksProxyVpcEndpointServiceInvalidConfigurationException\",\n                    \"httpResponseCode\": 400\n                },\n                \"smithy.api#documentation\": \"<p>The request was rejected because the Amazon VPC endpoint service configuration does not fulfill\\n      the requirements for an external key store. To identify the cause, see the error message that\\n      accompanies the exception and <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/vpc-connectivity.html#xks-vpc-requirements\\\">review the\\n        requirements</a> for Amazon VPC endpoint service connectivity for an external key\\n      store.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.kms#XksProxyVpcEndpointServiceNameType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 20,\n                    \"max\": 64\n                },\n                \"smithy.api#pattern\": \"^com\\\\.amazonaws\\\\.vpce\\\\.([a-z]+-){2,3}\\\\d+\\\\.vpce-svc-[0-9a-z]+$\"\n            }\n        },\n        \"com.amazonaws.kms#XksProxyVpcEndpointServiceNotFoundException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.kms#ErrorMessageType\"\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"XksProxyVpcEndpointServiceNotFoundException\",\n                    \"httpResponseCode\": 400\n                },\n                \"smithy.api#documentation\": \"<p>The request was rejected because KMS could not find the specified VPC endpoint service.\\n      Use <a>DescribeCustomKeyStores</a> to verify the VPC endpoint service name for the\\n      external key store. Also, confirm that the <code>Allow principals</code> list for the VPC\\n      endpoint service includes the KMS service principal for the Region, such as\\n        <code>cks.kms.us-east-1.amazonaws.com</code>.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "aws/sdk/aws-models/lambda.json",
    "content": "{\n    \"smithy\": \"2.0\",\n    \"shapes\": {\n        \"com.amazonaws.lambda#AWSGirApiService\": {\n            \"type\": \"service\",\n            \"version\": \"2015-03-31\",\n            \"operations\": [\n                {\n                    \"target\": \"com.amazonaws.lambda#GetAccountSettings\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ListTags\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#TagResource\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#UntagResource\"\n                }\n            ],\n            \"resources\": [\n                {\n                    \"target\": \"com.amazonaws.lambda#CodeSigningConfigResource\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#EventSourceMapping\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#Function\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#FunctionAlias\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#FunctionVersionResource\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#LayerResource\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#LayerVersion\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#Permission\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ProvisionedConcurrencyConfig\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourcePolicy\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#service\": {\n                    \"sdkId\": \"Lambda\",\n                    \"arnNamespace\": \"lambda\",\n                    \"cloudFormationName\": \"Lambda\",\n                    \"cloudTrailEventSource\": \"lambda.amazonaws.com\",\n                    \"endpointPrefix\": \"lambda\"\n                },\n                \"aws.api#tagEnabled\": {\n                    \"disableDefaultOperations\": true\n                },\n                \"aws.auth#sigv4\": {\n                    \"name\": \"lambda\"\n                },\n                \"aws.iam#defineConditionKeys\": {\n                    \"lambda:VpcIds\": {\n                        \"type\": \"String\",\n                        \"documentation\": \"Filters access by the ID of the VPC configured for the AWS Lambda function\",\n                        \"relativeDocumentation\": \"lambda-api-permissions-ref.html\",\n                        \"required\": false\n                    },\n                    \"lambda:SubnetIds\": {\n                        \"type\": \"ArrayOfString\",\n                        \"documentation\": \"Filters access by the ID of subnets configured for the AWS Lambda function\",\n                        \"relativeDocumentation\": \"lambda-api-permissions-ref.html\",\n                        \"required\": false\n                    },\n                    \"lambda:Layer\": {\n                        \"type\": \"ArrayOfString\",\n                        \"documentation\": \"Filters access by the ARN of a version of an AWS Lambda layer\",\n                        \"relativeDocumentation\": \"lambda-api-permissions-ref.html\",\n                        \"required\": false\n                    },\n                    \"lambda:EventSourceToken\": {\n                        \"type\": \"String\",\n                        \"documentation\": \"Filters access by the ID from a non-AWS event source configured for the AWS Lambda function\",\n                        \"relativeDocumentation\": \"lambda-api-permissions-ref.html\",\n                        \"required\": false\n                    },\n                    \"lambda:FunctionUrlAuthType\": {\n                        \"type\": \"String\",\n                        \"documentation\": \"Filters access by authorization type specified in request. Available during CreateFunctionUrlConfig, UpdateFunctionUrlConfig, DeleteFunctionUrlConfig, GetFunctionUrlConfig, ListFunctionUrlConfig, AddPermission and RemovePermission operations\",\n                        \"relativeDocumentation\": \"lambda-api-permissions-ref.html\",\n                        \"required\": false\n                    },\n                    \"aws:RequestTag/${TagKey}\": {\n                        \"type\": \"String\",\n                        \"documentation\": \"Filters access by the tags that are passed in the request\",\n                        \"externalDocumentation\": \"${DocHomeURL}/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-requesttag\",\n                        \"required\": false\n                    },\n                    \"aws:ResourceTag/${TagKey}\": {\n                        \"type\": \"String\",\n                        \"documentation\": \"Filters access by the tags associated with the resource\",\n                        \"externalDocumentation\": \"${DocHomeURL}IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-resourcetag\",\n                        \"required\": false\n                    },\n                    \"lambda:CodeSigningConfigArn\": {\n                        \"type\": \"ARN\",\n                        \"documentation\": \"Filters access by the ARN of an AWS Lambda code signing config\",\n                        \"relativeDocumentation\": \"lambda-api-permissions-ref.html\",\n                        \"required\": false\n                    },\n                    \"lambda:FunctionArn\": {\n                        \"type\": \"ARN\",\n                        \"documentation\": \"Filters access by the ARN of an AWS Lambda function\",\n                        \"relativeDocumentation\": \"lambda-api-permissions-ref.html\",\n                        \"required\": false\n                    },\n                    \"aws:TagKeys\": {\n                        \"type\": \"ArrayOfString\",\n                        \"documentation\": \"Filters access by the tag keys that are passed in the request\",\n                        \"externalDocumentation\": \"${DocHomeURL}/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-tagkeys\",\n                        \"required\": false\n                    },\n                    \"lambda:SourceFunctionArn\": {\n                        \"type\": \"ARN\",\n                        \"documentation\": \"Filters access by the ARN of the AWS Lambda function from which the request originated\",\n                        \"relativeDocumentation\": \"lambda-api-permissions-ref.html\",\n                        \"required\": false\n                    },\n                    \"lambda:SecurityGroupIds\": {\n                        \"type\": \"ArrayOfString\",\n                        \"documentation\": \"Filters access by the ID of security groups configured for the AWS Lambda function\",\n                        \"relativeDocumentation\": \"lambda-api-permissions-ref.html\",\n                        \"required\": false\n                    },\n                    \"lambda:Principal\": {\n                        \"type\": \"String\",\n                        \"documentation\": \"Filters access by restricting the AWS service or account that can invoke a function\",\n                        \"relativeDocumentation\": \"lambda-api-permissions-ref.html\",\n                        \"required\": false\n                    }\n                },\n                \"aws.iam#disableConditionKeyInference\": {},\n                \"aws.iam#supportedPrincipalTypes\": [\n                    \"Root\",\n                    \"IAMUser\",\n                    \"IAMRole\",\n                    \"FederatedUser\"\n                ],\n                \"aws.protocols#restJson1\": {},\n                \"smithy.api#documentation\": \"<fullname>Lambda</fullname> <p> <b>Overview</b> </p> <p>Lambda is a compute service that lets you run code without provisioning or managing servers. Lambda runs your code on a high-availability compute infrastructure and performs all of the administration of the compute resources, including server and operating system maintenance, capacity provisioning and automatic scaling, code monitoring and logging. With Lambda, you can run code for virtually any type of application or backend service. For more information about the Lambda service, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/welcome.html\\\">What is Lambda</a> in the <b>Lambda Developer Guide</b>.</p> <p>The <i>Lambda API Reference</i> provides information about each of the API methods, including details about the parameters in each API request and response. </p> <p/> <p>You can use Software Development Kits (SDKs), Integrated Development Environment (IDE) Toolkits, and command line tools to access the API. For installation instructions, see <a href=\\\"http://aws.amazon.com/tools/\\\">Tools for Amazon Web Services</a>. </p> <p>For a list of Region-specific endpoints that Lambda supports, see <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/lambda-service.html\\\">Lambda endpoints and quotas </a> in the <i>Amazon Web Services General Reference.</i>. </p> <p>When making the API calls, you will need to authenticate your request by providing a signature. Lambda supports signature version 4. For more information, see <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html\\\">Signature Version 4 signing process</a> in the <i>Amazon Web Services General Reference.</i>. </p> <p> <b>CA certificates</b> </p> <p>Because Amazon Web Services SDKs use the CA certificates from your computer, changes to the certificates on the Amazon Web Services servers can cause connection failures when you attempt to use an SDK. You can prevent these failures by keeping your computer's CA certificates and operating system up-to-date. If you encounter this issue in a corporate environment and do not manage your own computer, you might need to ask an administrator to assist with the update process. The following list shows minimum operating system and Java versions:</p> <ul> <li> <p>Microsoft Windows versions that have updates from January 2005 or later installed contain at least one of the required CAs in their trust list. </p> </li> <li> <p>Mac OS X 10.4 with Java for Mac OS X 10.4 Release 5 (February 2007), Mac OS X 10.5 (October 2007), and later versions contain at least one of the required CAs in their trust list. </p> </li> <li> <p>Red Hat Enterprise Linux 5 (March 2007), 6, and 7 and CentOS 5, 6, and 7 all contain at least one of the required CAs in their default trusted CA list. </p> </li> <li> <p>Java 1.4.2_12 (May 2006), 5 Update 2 (March 2005), and all later versions, including Java 6 (December 2006), 7, and 8, contain at least one of the required CAs in their default trusted CA list. </p> </li> </ul> <p>When accessing the Lambda management console or Lambda API endpoints, whether through browsers or programmatically, you will need to ensure your client machines support any of the following CAs: </p> <ul> <li> <p>Amazon Root CA 1</p> </li> <li> <p>Starfield Services Root Certificate Authority - G2</p> </li> <li> <p>Starfield Class 2 Certification Authority</p> </li> </ul> <p>Root certificates from the first two authorities are available from <a href=\\\"https://www.amazontrust.com/repository/\\\">Amazon trust services</a>, but keeping your computer up-to-date is the more straightforward solution. To learn more about ACM-provided certificates, see <a href=\\\"http://aws.amazon.com/certificate-manager/faqs/#certificates\\\">Amazon Web Services Certificate Manager FAQs.</a> </p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"Marker\",\n                    \"outputToken\": \"NextMarker\",\n                    \"pageSize\": \"MaxItems\"\n                },\n                \"smithy.api#suppress\": [\n                    \"ServiceTagging\"\n                ],\n                \"smithy.api#title\": \"AWS Lambda\",\n                \"smithy.rules#endpointRuleSet\": {\n                    \"version\": \"1.0\",\n                    \"parameters\": {\n                        \"Region\": {\n                            \"builtIn\": \"AWS::Region\",\n                            \"required\": false,\n                            \"documentation\": \"The AWS region used to dispatch the request.\",\n                            \"type\": \"String\"\n                        },\n                        \"UseDualStack\": {\n                            \"builtIn\": \"AWS::UseDualStack\",\n                            \"required\": true,\n                            \"default\": false,\n                            \"documentation\": \"When true, use the dual-stack endpoint. If the configured endpoint does not support dual-stack, dispatching the request MAY return an error.\",\n                            \"type\": \"Boolean\"\n                        },\n                        \"UseFIPS\": {\n                            \"builtIn\": \"AWS::UseFIPS\",\n                            \"required\": true,\n                            \"default\": false,\n                            \"documentation\": \"When true, send this request to the FIPS-compliant regional endpoint. If the configured endpoint does not have a FIPS compliant endpoint, dispatching the request will return an error.\",\n                            \"type\": \"Boolean\"\n                        },\n                        \"Endpoint\": {\n                            \"builtIn\": \"SDK::Endpoint\",\n                            \"required\": false,\n                            \"documentation\": \"Override the endpoint used to send this request\",\n                            \"type\": \"String\"\n                        }\n                    },\n                    \"rules\": [\n                        {\n                            \"conditions\": [\n                                {\n                                    \"fn\": \"isSet\",\n                                    \"argv\": [\n                                        {\n                                            \"ref\": \"Endpoint\"\n                                        }\n                                    ]\n                                }\n                            ],\n                            \"rules\": [\n                                {\n                                    \"conditions\": [\n                                        {\n                                            \"fn\": \"booleanEquals\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"UseFIPS\"\n                                                },\n                                                true\n                                            ]\n                                        }\n                                    ],\n                                    \"error\": \"Invalid Configuration: FIPS and custom endpoint are not supported\",\n                                    \"type\": \"error\"\n                                },\n                                {\n                                    \"conditions\": [\n                                        {\n                                            \"fn\": \"booleanEquals\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"UseDualStack\"\n                                                },\n                                                true\n                                            ]\n                                        }\n                                    ],\n                                    \"error\": \"Invalid Configuration: Dualstack and custom endpoint are not supported\",\n                                    \"type\": \"error\"\n                                },\n                                {\n                                    \"conditions\": [],\n                                    \"endpoint\": {\n                                        \"url\": {\n                                            \"ref\": \"Endpoint\"\n                                        },\n                                        \"properties\": {},\n                                        \"headers\": {}\n                                    },\n                                    \"type\": \"endpoint\"\n                                }\n                            ],\n                            \"type\": \"tree\"\n                        },\n                        {\n                            \"conditions\": [\n                                {\n                                    \"fn\": \"isSet\",\n                                    \"argv\": [\n                                        {\n                                            \"ref\": \"Region\"\n                                        }\n                                    ]\n                                }\n                            ],\n                            \"rules\": [\n                                {\n                                    \"conditions\": [\n                                        {\n                                            \"fn\": \"aws.partition\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"Region\"\n                                                }\n                                            ],\n                                            \"assign\": \"PartitionResult\"\n                                        }\n                                    ],\n                                    \"rules\": [\n                                        {\n                                            \"conditions\": [\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseFIPS\"\n                                                        },\n                                                        true\n                                                    ]\n                                                },\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseDualStack\"\n                                                        },\n                                                        true\n                                                    ]\n                                                }\n                                            ],\n                                            \"rules\": [\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                true,\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"PartitionResult\"\n                                                                        },\n                                                                        \"supportsFIPS\"\n                                                                    ]\n                                                                }\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                true,\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"PartitionResult\"\n                                                                        },\n                                                                        \"supportsDualStack\"\n                                                                    ]\n                                                                }\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"rules\": [\n                                                        {\n                                                            \"conditions\": [],\n                                                            \"endpoint\": {\n                                                                \"url\": \"https://lambda-fips.{Region}.{PartitionResult#dualStackDnsSuffix}\",\n                                                                \"properties\": {},\n                                                                \"headers\": {}\n                                                            },\n                                                            \"type\": \"endpoint\"\n                                                        }\n                                                    ],\n                                                    \"type\": \"tree\"\n                                                },\n                                                {\n                                                    \"conditions\": [],\n                                                    \"error\": \"FIPS and DualStack are enabled, but this partition does not support one or both\",\n                                                    \"type\": \"error\"\n                                                }\n                                            ],\n                                            \"type\": \"tree\"\n                                        },\n                                        {\n                                            \"conditions\": [\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseFIPS\"\n                                                        },\n                                                        true\n                                                    ]\n                                                }\n                                            ],\n                                            \"rules\": [\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"PartitionResult\"\n                                                                        },\n                                                                        \"supportsFIPS\"\n                                                                    ]\n                                                                },\n                                                                true\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"rules\": [\n                                                        {\n                                                            \"conditions\": [],\n                                                            \"endpoint\": {\n                                                                \"url\": \"https://lambda-fips.{Region}.{PartitionResult#dnsSuffix}\",\n                                                                \"properties\": {},\n                                                                \"headers\": {}\n                                                            },\n                                                            \"type\": \"endpoint\"\n                                                        }\n                                                    ],\n                                                    \"type\": \"tree\"\n                                                },\n                                                {\n                                                    \"conditions\": [],\n                                                    \"error\": \"FIPS is enabled but this partition does not support FIPS\",\n                                                    \"type\": \"error\"\n                                                }\n                                            ],\n                                            \"type\": \"tree\"\n                                        },\n                                        {\n                                            \"conditions\": [\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseDualStack\"\n                                                        },\n                                                        true\n                                                    ]\n                                                }\n                                            ],\n                                            \"rules\": [\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                true,\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"PartitionResult\"\n                                                                        },\n                                                                        \"supportsDualStack\"\n                                                                    ]\n                                                                }\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"rules\": [\n                                                        {\n                                                            \"conditions\": [],\n                                                            \"endpoint\": {\n                                                                \"url\": \"https://lambda.{Region}.{PartitionResult#dualStackDnsSuffix}\",\n                                                                \"properties\": {},\n                                                                \"headers\": {}\n                                                            },\n                                                            \"type\": \"endpoint\"\n                                                        }\n                                                    ],\n                                                    \"type\": \"tree\"\n                                                },\n                                                {\n                                                    \"conditions\": [],\n                                                    \"error\": \"DualStack is enabled but this partition does not support DualStack\",\n                                                    \"type\": \"error\"\n                                                }\n                                            ],\n                                            \"type\": \"tree\"\n                                        },\n                                        {\n                                            \"conditions\": [],\n                                            \"endpoint\": {\n                                                \"url\": \"https://lambda.{Region}.{PartitionResult#dnsSuffix}\",\n                                                \"properties\": {},\n                                                \"headers\": {}\n                                            },\n                                            \"type\": \"endpoint\"\n                                        }\n                                    ],\n                                    \"type\": \"tree\"\n                                }\n                            ],\n                            \"type\": \"tree\"\n                        },\n                        {\n                            \"conditions\": [],\n                            \"error\": \"Invalid Configuration: Missing Region\",\n                            \"type\": \"error\"\n                        }\n                    ]\n                },\n                \"smithy.rules#endpointTests\": {\n                    \"testCases\": [\n                        {\n                            \"documentation\": \"For region af-south-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://lambda.af-south-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"af-south-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region af-south-1 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://lambda.af-south-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"af-south-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://lambda.ap-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-east-1 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://lambda.ap-east-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-northeast-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://lambda.ap-northeast-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-northeast-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-northeast-1 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://lambda.ap-northeast-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-northeast-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-northeast-2 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://lambda.ap-northeast-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-northeast-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-northeast-2 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://lambda.ap-northeast-2.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-northeast-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-northeast-3 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://lambda.ap-northeast-3.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-northeast-3\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-northeast-3 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://lambda.ap-northeast-3.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-northeast-3\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-south-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://lambda.ap-south-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-south-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-south-1 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://lambda.ap-south-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-south-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-southeast-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://lambda.ap-southeast-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-southeast-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-southeast-1 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://lambda.ap-southeast-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-southeast-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-southeast-2 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://lambda.ap-southeast-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-southeast-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-southeast-2 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://lambda.ap-southeast-2.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-southeast-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-southeast-3 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://lambda.ap-southeast-3.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-southeast-3\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-southeast-3 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://lambda.ap-southeast-3.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-southeast-3\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ca-central-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://lambda.ca-central-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ca-central-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ca-central-1 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://lambda.ca-central-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ca-central-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-central-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://lambda.eu-central-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-central-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-central-1 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://lambda.eu-central-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-central-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-north-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://lambda.eu-north-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-north-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-north-1 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://lambda.eu-north-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-north-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-south-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://lambda.eu-south-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-south-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-south-1 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://lambda.eu-south-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-south-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-west-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://lambda.eu-west-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-west-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-west-1 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://lambda.eu-west-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-west-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-west-2 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://lambda.eu-west-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-west-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-west-2 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://lambda.eu-west-2.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-west-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-west-3 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://lambda.eu-west-3.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-west-3\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-west-3 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://lambda.eu-west-3.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-west-3\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region me-south-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://lambda.me-south-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"me-south-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region me-south-1 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://lambda.me-south-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"me-south-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region sa-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://lambda.sa-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"sa-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region sa-east-1 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://lambda.sa-east-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"sa-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://lambda.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://lambda-fips.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-1 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://lambda.us-east-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-2 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://lambda.us-east-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-2 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://lambda-fips.us-east-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-2\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-2 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://lambda.us-east-2.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-west-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://lambda.us-west-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-west-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-west-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://lambda-fips.us-west-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-west-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-west-1 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://lambda.us-west-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-west-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-west-2 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://lambda.us-west-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-west-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-west-2 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://lambda-fips.us-west-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-west-2\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-west-2 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://lambda.us-west-2.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-west-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-1 with FIPS enabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://lambda-fips.us-east-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-north-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://lambda.cn-north-1.amazonaws.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-north-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-north-1 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://lambda.cn-north-1.api.amazonwebservices.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-north-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-northwest-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://lambda.cn-northwest-1.amazonaws.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-northwest-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-northwest-1 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://lambda.cn-northwest-1.api.amazonwebservices.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-northwest-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-north-1 with FIPS enabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://lambda-fips.cn-north-1.api.amazonwebservices.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-north-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-north-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://lambda-fips.cn-north-1.amazonaws.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-north-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://lambda.us-gov-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-east-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://lambda-fips.us-gov-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-west-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://lambda.us-gov-west-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-west-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-west-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://lambda-fips.us-gov-west-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-west-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-east-1 with FIPS enabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://lambda-fips.us-gov-east-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-east-1 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://lambda.us-gov-east-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-iso-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://lambda.us-iso-east-1.c2s.ic.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-iso-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-iso-west-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://lambda.us-iso-west-1.c2s.ic.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-iso-west-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-iso-east-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://lambda-fips.us-iso-east-1.c2s.ic.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-iso-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-isob-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://lambda.us-isob-east-1.sc2s.sgov.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-isob-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-isob-east-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://lambda-fips.us-isob-east-1.sc2s.sgov.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-isob-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For custom endpoint with region set and fips disabled and dualstack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://example.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"For custom endpoint with region not set and fips disabled and dualstack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://example.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"For custom endpoint with fips enabled and dualstack disabled\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: FIPS and custom endpoint are not supported\"\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false,\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"For custom endpoint with fips disabled and dualstack enabled\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: Dualstack and custom endpoint are not supported\"\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true,\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"Missing region\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: Missing Region\"\n                            }\n                        }\n                    ],\n                    \"version\": \"1.0\"\n                }\n            }\n        },\n        \"com.amazonaws.lambda#AccountLimit\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TotalCodeSize\": {\n                    \"target\": \"com.amazonaws.lambda#Long\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The amount of storage space that you can use for all deployment packages and layer archives.</p>\"\n                    }\n                },\n                \"CodeSizeUnzipped\": {\n                    \"target\": \"com.amazonaws.lambda#Long\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The maximum size of a function's deployment package and layers when they're extracted.</p>\"\n                    }\n                },\n                \"CodeSizeZipped\": {\n                    \"target\": \"com.amazonaws.lambda#Long\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The maximum size of a deployment package when it's uploaded directly to Lambda. Use Amazon S3 for larger files.</p>\"\n                    }\n                },\n                \"ConcurrentExecutions\": {\n                    \"target\": \"com.amazonaws.lambda#Integer\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The maximum number of simultaneous function executions.</p>\"\n                    }\n                },\n                \"UnreservedConcurrentExecutions\": {\n                    \"target\": \"com.amazonaws.lambda#UnreservedConcurrentExecutions\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of simultaneous function executions, minus the capacity that's reserved for individual functions with <a>PutFunctionConcurrency</a>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Limits that are related to concurrency and storage. All file and storage sizes are in bytes.</p>\"\n            }\n        },\n        \"com.amazonaws.lambda#AccountUsage\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TotalCodeSize\": {\n                    \"target\": \"com.amazonaws.lambda#Long\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The amount of storage space, in bytes, that's being used by deployment packages and layer archives.</p>\"\n                    }\n                },\n                \"FunctionCount\": {\n                    \"target\": \"com.amazonaws.lambda#Long\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The number of Lambda functions.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The number of functions and amount of storage in use.</p>\"\n            }\n        },\n        \"com.amazonaws.lambda#Action\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#pattern\": \"^(lambda:[*]|lambda:[a-zA-Z]+|[*])$\"\n            }\n        },\n        \"com.amazonaws.lambda#AddLayerVersionPermission\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.lambda#AddLayerVersionPermissionRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.lambda#AddLayerVersionPermissionResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.lambda#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#PolicyLengthExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#PreconditionFailedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceConflictException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ServiceException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#TooManyRequestsException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.iam#iamAction\": {\n                    \"documentation\": \"Grants permission to add permissions to the resource-based policy of a version of an AWS Lambda layer\",\n                    \"relativeDocumentation\": \"API_AddLayerVersionPermission.html\",\n                    \"resources\": {\n                        \"required\": {\n                            \"layerVersion\": {}\n                        }\n                    }\n                },\n                \"smithy.api#documentation\": \"<p>Adds permissions to the resource-based policy of a version of an <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html\\\">Lambda layer</a>. Use this action to grant layer usage permission to other accounts. You can grant permission to a single account, all accounts in an organization, or all Amazon Web Services accounts. </p> <p>To revoke permission, call <a>RemoveLayerVersionPermission</a> with the statement ID that you specified when you added it.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To add permissions to a layer version\",\n                        \"documentation\": \"The following example grants permission for the account 223456789012 to use version 1 of a layer named my-layer.\",\n                        \"input\": {\n                            \"LayerName\": \"my-layer\",\n                            \"VersionNumber\": 1,\n                            \"StatementId\": \"xaccount\",\n                            \"Action\": \"lambda:GetLayerVersion\",\n                            \"Principal\": \"223456789012\"\n                        },\n                        \"output\": {\n                            \"Statement\": \"{\\\"Sid\\\":\\\"xaccount\\\",\\\"Effect\\\":\\\"Allow\\\",\\\"Principal\\\":{\\\"AWS\\\":\\\"arn:aws:iam::223456789012:root\\\"},\\\"Action\\\":\\\"lambda:GetLayerVersion\\\",\\\"Resource\\\":\\\"arn:aws:lambda:us-east-2:123456789012:layer:my-layer:1\\\"}\",\n                            \"RevisionId\": \"35d87451-f796-4a3f-a618-95a3671b0a0c\"\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"POST\",\n                    \"uri\": \"/2018-10-31/layers/{LayerName}/versions/{VersionNumber}/policy\",\n                    \"code\": 201\n                }\n            }\n        },\n        \"com.amazonaws.lambda#AddLayerVersionPermissionRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LayerName\": {\n                    \"target\": \"com.amazonaws.lambda#LayerName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name or Amazon Resource Name (ARN) of the layer.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"VersionNumber\": {\n                    \"target\": \"com.amazonaws.lambda#LayerVersionNumber\",\n                    \"traits\": {\n                        \"smithy.api#default\": null,\n                        \"smithy.api#documentation\": \"<p>The version number.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"StatementId\": {\n                    \"target\": \"com.amazonaws.lambda#StatementId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An identifier that distinguishes the policy from others on the same layer version.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Action\": {\n                    \"target\": \"com.amazonaws.lambda#LayerPermissionAllowedAction\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The API action that grants access to the layer. For example, <code>lambda:GetLayerVersion</code>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Principal\": {\n                    \"target\": \"com.amazonaws.lambda#LayerPermissionAllowedPrincipal\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An account ID, or <code>*</code> to grant layer usage permission to all accounts in an organization, or all Amazon Web Services accounts (if <code>organizationId</code> is not specified). For the last case, make sure that you really do want all Amazon Web Services accounts to have usage permission to this layer. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"OrganizationId\": {\n                    \"target\": \"com.amazonaws.lambda#OrganizationId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>With the principal set to <code>*</code>, grant permission to all accounts in the specified organization.</p>\"\n                    }\n                },\n                \"RevisionId\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Only update the policy if the revision ID matches the ID specified. Use this option to avoid modifying a policy that has changed since you last read it.</p>\",\n                        \"smithy.api#httpQuery\": \"RevisionId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"aws.api#data\": \"permissions\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.lambda#AddLayerVersionPermissionResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Statement\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The permission statement.</p>\"\n                    }\n                },\n                \"RevisionId\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A unique identifier for the current revision of the policy.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.lambda#AddPermission\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.lambda#AddPermissionRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.lambda#AddPermissionResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.lambda#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#PolicyLengthExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#PreconditionFailedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceConflictException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ServiceException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#TooManyRequestsException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.iam#conditionKeys\": [\n                    \"lambda:FunctionUrlAuthType\",\n                    \"lambda:Principal\"\n                ],\n                \"aws.iam#iamAction\": {\n                    \"documentation\": \"Grants permission to give an AWS service or another account permission to use an AWS Lambda function\",\n                    \"relativeDocumentation\": \"API_AddPermission.html\",\n                    \"resources\": {\n                        \"required\": {\n                            \"function\": {}\n                        }\n                    }\n                },\n                \"smithy.api#documentation\": \"<p>Grants a <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_principal.html#Principal_specifying\\\">principal</a> permission to use a function. You can apply the policy at the function level, or specify a qualifier to restrict access to a single version or alias. If you use a qualifier, the invoker must use the full Amazon Resource Name (ARN) of that version or alias to invoke the function. Note: Lambda does not support adding policies to version $LATEST.</p> <p>To grant permission to another account, specify the account ID as the <code>Principal</code>. To grant permission to an organization defined in Organizations, specify the organization ID as the <code>PrincipalOrgID</code>. For Amazon Web Services services, the principal is a domain-style identifier that the service defines, such as <code>s3.amazonaws.com</code> or <code>sns.amazonaws.com</code>. For Amazon Web Services services, you can also specify the ARN of the associated resource as the <code>SourceArn</code>. If you grant permission to a service principal without specifying the source, other accounts could potentially configure resources in their account to invoke your Lambda function.</p> <p>This operation adds a statement to a resource-based permissions policy for the function. For more information about function policies, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/access-control-resource-based.html\\\">Using resource-based policies for Lambda</a>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To grant Amazon S3 permission to invoke a function\",\n                        \"documentation\": \"The following example adds permission for Amazon S3 to invoke a Lambda function named my-function for notifications from a bucket named my-bucket-1xpuxmplzrlbh in account 123456789012.\",\n                        \"input\": {\n                            \"FunctionName\": \"my-function\",\n                            \"StatementId\": \"s3\",\n                            \"Action\": \"lambda:InvokeFunction\",\n                            \"Principal\": \"s3.amazonaws.com\",\n                            \"SourceArn\": \"arn:aws:s3:::my-bucket-1xpuxmplzrlbh/*\",\n                            \"SourceAccount\": \"123456789012\"\n                        },\n                        \"output\": {\n                            \"Statement\": \"{\\\"Sid\\\":\\\"s3\\\",\\\"Effect\\\":\\\"Allow\\\",\\\"Principal\\\":{\\\"Service\\\":\\\"s3.amazonaws.com\\\"},\\\"Action\\\":\\\"lambda:InvokeFunction\\\",\\\"Resource\\\":\\\"arn:aws:lambda:us-east-2:123456789012:function:my-function\\\",\\\"Condition\\\":{\\\"StringEquals\\\":{\\\"AWS:SourceAccount\\\":\\\"123456789012\\\"},\\\"ArnLike\\\":{\\\"AWS:SourceArn\\\":\\\"arn:aws:s3:::my-bucket-1xpuxmplzrlbh\\\"}}}\"\n                        }\n                    },\n                    {\n                        \"title\": \"To grant another account permission to invoke a function\",\n                        \"documentation\": \"The following example adds permission for account 223456789012 invoke a Lambda function named my-function.\",\n                        \"input\": {\n                            \"FunctionName\": \"my-function\",\n                            \"StatementId\": \"xaccount\",\n                            \"Action\": \"lambda:InvokeFunction\",\n                            \"Principal\": \"223456789012\"\n                        },\n                        \"output\": {\n                            \"Statement\": \"{\\\"Sid\\\":\\\"xaccount\\\",\\\"Effect\\\":\\\"Allow\\\",\\\"Principal\\\":{\\\"AWS\\\":\\\"arn:aws:iam::223456789012:root\\\"},\\\"Action\\\":\\\"lambda:InvokeFunction\\\",\\\"Resource\\\":\\\"arn:aws:lambda:us-east-2:123456789012:function:my-function\\\"}\"\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"POST\",\n                    \"uri\": \"/2015-03-31/functions/{FunctionName}/policy\",\n                    \"code\": 201\n                }\n            }\n        },\n        \"com.amazonaws.lambda#AddPermissionRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"FunctionName\": {\n                    \"target\": \"com.amazonaws.lambda#FunctionName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name or ARN of the Lambda function, version, or alias.</p> <p class=\\\"title\\\"> <b>Name formats</b> </p> <ul> <li> <p> <b>Function name</b> – <code>my-function</code> (name-only), <code>my-function:v1</code> (with alias).</p> </li> <li> <p> <b>Function ARN</b> – <code>arn:aws:lambda:us-west-2:123456789012:function:my-function</code>.</p> </li> <li> <p> <b>Partial ARN</b> – <code>123456789012:function:my-function</code>.</p> </li> </ul> <p>You can append a version number or alias to any of the formats. The length constraint applies only to the full ARN. If you specify only the function name, it is limited to 64 characters in length.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"StatementId\": {\n                    \"target\": \"com.amazonaws.lambda#StatementId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A statement identifier that differentiates the statement from others in the same policy.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Action\": {\n                    \"target\": \"com.amazonaws.lambda#Action\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The action that the principal can use on the function. For example, <code>lambda:InvokeFunction</code> or <code>lambda:GetFunction</code>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Principal\": {\n                    \"target\": \"com.amazonaws.lambda#Principal\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services service, Amazon Web Services account, IAM user, or IAM role that invokes the function. If you specify a service, use <code>SourceArn</code> or <code>SourceAccount</code> to limit who can invoke the function through that service.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"SourceArn\": {\n                    \"target\": \"com.amazonaws.lambda#Arn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>For Amazon Web Services services, the ARN of the Amazon Web Services resource that invokes the function. For example, an Amazon S3 bucket or Amazon SNS topic.</p> <p>Note that Lambda configures the comparison using the <code>StringLike</code> operator.</p>\"\n                    }\n                },\n                \"SourceAccount\": {\n                    \"target\": \"com.amazonaws.lambda#SourceOwner\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>For Amazon Web Services service, the ID of the Amazon Web Services account that owns the resource. Use this together with <code>SourceArn</code> to ensure that the specified account owns the resource. It is possible for an Amazon S3 bucket to be deleted by its owner and recreated by another account.</p>\"\n                    }\n                },\n                \"EventSourceToken\": {\n                    \"target\": \"com.amazonaws.lambda#EventSourceToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>For Alexa Smart Home functions, a token that the invoker must supply.</p>\"\n                    }\n                },\n                \"Qualifier\": {\n                    \"target\": \"com.amazonaws.lambda#Qualifier\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify a version or alias to add permissions to a published version of the function.</p>\",\n                        \"smithy.api#httpQuery\": \"Qualifier\"\n                    }\n                },\n                \"RevisionId\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Update the policy only if the revision ID matches the ID that's specified. Use this option to avoid modifying a policy that has changed since you last read it.</p>\"\n                    }\n                },\n                \"PrincipalOrgID\": {\n                    \"target\": \"com.amazonaws.lambda#PrincipalOrgID\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The identifier for your organization in Organizations. Use this to grant permissions to all the Amazon Web Services accounts under this organization.</p>\"\n                    }\n                },\n                \"FunctionUrlAuthType\": {\n                    \"target\": \"com.amazonaws.lambda#FunctionUrlAuthType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of authentication that your function URL uses. Set to <code>AWS_IAM</code> if you want to restrict access to authenticated users only. Set to <code>NONE</code> if you want to bypass IAM authentication to create a public endpoint. For more information, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/urls-auth.html\\\">Security and auth model for Lambda function URLs</a>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"aws.api#data\": \"permissions\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.lambda#AddPermissionResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Statement\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The permission statement that's added to the function policy.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.lambda#AdditionalVersion\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 1024\n                },\n                \"smithy.api#pattern\": \"^[0-9]+$\"\n            }\n        },\n        \"com.amazonaws.lambda#AdditionalVersionWeights\": {\n            \"type\": \"map\",\n            \"key\": {\n                \"target\": \"com.amazonaws.lambda#AdditionalVersion\"\n            },\n            \"value\": {\n                \"target\": \"com.amazonaws.lambda#Weight\"\n            }\n        },\n        \"com.amazonaws.lambda#Alias\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 128\n                },\n                \"smithy.api#pattern\": \"^(?!^[0-9]+$)([a-zA-Z0-9-_]+)$\"\n            }\n        },\n        \"com.amazonaws.lambda#AliasConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AliasArn\": {\n                    \"target\": \"com.amazonaws.lambda#FunctionArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the alias.</p>\"\n                    }\n                },\n                \"Name\": {\n                    \"target\": \"com.amazonaws.lambda#Alias\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the alias.</p>\"\n                    }\n                },\n                \"FunctionVersion\": {\n                    \"target\": \"com.amazonaws.lambda#Version\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The function version that the alias invokes.</p>\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.lambda#Description\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A description of the alias.</p>\"\n                    }\n                },\n                \"RoutingConfig\": {\n                    \"target\": \"com.amazonaws.lambda#AliasRoutingConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/lambda-traffic-shifting-using-aliases.html\\\">routing configuration</a> of the alias.</p>\"\n                    }\n                },\n                \"RevisionId\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A unique identifier that changes when you update the alias.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Provides configuration information about a Lambda function <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/configuration-aliases.html\\\">alias</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.lambda#AliasList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.lambda#AliasConfiguration\"\n            }\n        },\n        \"com.amazonaws.lambda#AliasRoutingConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AdditionalVersionWeights\": {\n                    \"target\": \"com.amazonaws.lambda#AdditionalVersionWeights\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The second version, and the percentage of traffic that's routed to it.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/lambda-traffic-shifting-using-aliases.html\\\">traffic-shifting</a> configuration of a Lambda function alias.</p>\"\n            }\n        },\n        \"com.amazonaws.lambda#AllowCredentials\": {\n            \"type\": \"boolean\"\n        },\n        \"com.amazonaws.lambda#AllowMethodsList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.lambda#Method\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 6\n                }\n            }\n        },\n        \"com.amazonaws.lambda#AllowOriginsList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.lambda#Origin\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 100\n                }\n            }\n        },\n        \"com.amazonaws.lambda#AllowedPublishers\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SigningProfileVersionArns\": {\n                    \"target\": \"com.amazonaws.lambda#SigningProfileVersionArns\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) for each of the signing profiles. A signing profile defines a trusted user who can sign a code package. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>List of signing profiles that can sign a code package. </p>\"\n            }\n        },\n        \"com.amazonaws.lambda#AmazonManagedKafkaEventSourceConfig\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConsumerGroupId\": {\n                    \"target\": \"com.amazonaws.lambda#URI\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The identifier for the Kafka consumer group to join. The consumer group ID must be unique among all your Kafka event sources. After creating a Kafka event source mapping with the consumer group ID specified, you cannot update this value. For more information, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/with-msk.html#services-msk-consumer-group-id\\\">Customizable consumer group ID</a>.</p>\"\n                    }\n                },\n                \"SchemaRegistryConfig\": {\n                    \"target\": \"com.amazonaws.lambda#KafkaSchemaRegistryConfig\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specific configuration settings for a Kafka schema registry.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Specific configuration settings for an Amazon Managed Streaming for Apache Kafka (Amazon MSK) event source.</p>\"\n            }\n        },\n        \"com.amazonaws.lambda#ApplicationLogLevel\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"Trace\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"TRACE\"\n                    }\n                },\n                \"Debug\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DEBUG\"\n                    }\n                },\n                \"Info\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"INFO\"\n                    }\n                },\n                \"Warn\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"WARN\"\n                    }\n                },\n                \"Error\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ERROR\"\n                    }\n                },\n                \"Fatal\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"FATAL\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.lambda#Architecture\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"x86_64\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"x86_64\"\n                    }\n                },\n                \"arm64\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"arm64\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.lambda#ArchitecturesList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.lambda#Architecture\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 1\n                }\n            }\n        },\n        \"com.amazonaws.lambda#Arn\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#pattern\": \"^arn:(aws[a-zA-Z0-9-]*):([a-zA-Z0-9\\\\-])+:([a-z]{2}(-gov)?-[a-z]+-\\\\d{1})?:(\\\\d{12})?:(.*)$\"\n            }\n        },\n        \"com.amazonaws.lambda#BatchSize\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 10000\n                }\n            }\n        },\n        \"com.amazonaws.lambda#BisectBatchOnFunctionError\": {\n            \"type\": \"boolean\"\n        },\n        \"com.amazonaws.lambda#Blob\": {\n            \"type\": \"blob\",\n            \"traits\": {\n                \"smithy.api#sensitive\": {}\n            }\n        },\n        \"com.amazonaws.lambda#BlobStream\": {\n            \"type\": \"blob\",\n            \"traits\": {\n                \"smithy.api#streaming\": {}\n            }\n        },\n        \"com.amazonaws.lambda#Boolean\": {\n            \"type\": \"boolean\",\n            \"traits\": {\n                \"smithy.api#default\": false\n            }\n        },\n        \"com.amazonaws.lambda#CodeSigningConfig\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CodeSigningConfigId\": {\n                    \"target\": \"com.amazonaws.lambda#CodeSigningConfigId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Unique identifer for the Code signing configuration.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"CodeSigningConfigArn\": {\n                    \"target\": \"com.amazonaws.lambda#CodeSigningConfigArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the Code signing configuration.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.lambda#Description\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Code signing configuration description.</p>\"\n                    }\n                },\n                \"AllowedPublishers\": {\n                    \"target\": \"com.amazonaws.lambda#AllowedPublishers\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>List of allowed publishers.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"CodeSigningPolicies\": {\n                    \"target\": \"com.amazonaws.lambda#CodeSigningPolicies\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The code signing policy controls the validation failure action for signature mismatch or expiry.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"LastModified\": {\n                    \"target\": \"com.amazonaws.lambda#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time that the Code signing configuration was last modified, in ISO-8601 format (YYYY-MM-DDThh:mm:ss.sTZD). </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Details about a <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/configuration-codesigning.html\\\">Code signing configuration</a>. </p>\"\n            }\n        },\n        \"com.amazonaws.lambda#CodeSigningConfigArn\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 200\n                },\n                \"smithy.api#pattern\": \"^arn:(aws[a-zA-Z-]*)?:lambda:[a-z]{2}((-gov)|(-iso(b?)))?-[a-z]+-\\\\d{1}:\\\\d{12}:code-signing-config:csc-[a-z0-9]{17}$\"\n            }\n        },\n        \"com.amazonaws.lambda#CodeSigningConfigId\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#pattern\": \"^csc-[a-zA-Z0-9-_\\\\.]{17}$\"\n            }\n        },\n        \"com.amazonaws.lambda#CodeSigningConfigList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.lambda#CodeSigningConfig\"\n            }\n        },\n        \"com.amazonaws.lambda#CodeSigningConfigNotFoundException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Type\": {\n                    \"target\": \"com.amazonaws.lambda#String\"\n                },\n                \"Message\": {\n                    \"target\": \"com.amazonaws.lambda#String\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The specified code signing configuration does not exist.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 404\n            }\n        },\n        \"com.amazonaws.lambda#CodeSigningConfigResource\": {\n            \"type\": \"resource\",\n            \"identifiers\": {\n                \"CodeSigningConfigId\": {\n                    \"target\": \"com.amazonaws.lambda#CodeSigningConfigId\"\n                }\n            },\n            \"create\": {\n                \"target\": \"com.amazonaws.lambda#CreateCodeSigningConfig\"\n            },\n            \"list\": {\n                \"target\": \"com.amazonaws.lambda#ListCodeSigningConfigs\"\n            },\n            \"collectionOperations\": [\n                {\n                    \"target\": \"com.amazonaws.lambda#DeleteCodeSigningConfig\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#GetCodeSigningConfig\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ListFunctionsByCodeSigningConfig\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#UpdateCodeSigningConfig\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#arn\": {\n                    \"template\": \"code-signing-config:{CodeSigningConfigId}\"\n                },\n                \"aws.iam#conditionKeys\": [\n                    \"aws:ResourceTag/${TagKey}\"\n                ],\n                \"aws.iam#iamResource\": {\n                    \"disableConditionKeyInheritance\": true,\n                    \"name\": \"code signing config\",\n                    \"relativeDocumentation\": \"lambda-api-permissions-ref.html\"\n                },\n                \"smithy.api#documentation\": \"Represents an AWS Lambda code signing config\",\n                \"smithy.api#suppress\": [\n                    \"IamResourceTrait\"\n                ]\n            }\n        },\n        \"com.amazonaws.lambda#CodeSigningPolicies\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"UntrustedArtifactOnDeployment\": {\n                    \"target\": \"com.amazonaws.lambda#CodeSigningPolicy\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Code signing configuration policy for deployment validation failure. If you set the policy to <code>Enforce</code>, Lambda blocks the deployment request if signature validation checks fail. If you set the policy to <code>Warn</code>, Lambda allows the deployment and creates a CloudWatch log. </p> <p>Default value: <code>Warn</code> </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Code signing configuration <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/configuration-codesigning.html#config-codesigning-policies\\\">policies</a> specify the validation failure action for signature mismatch or expiry.</p>\"\n            }\n        },\n        \"com.amazonaws.lambda#CodeSigningPolicy\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"Warn\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Warn\"\n                    }\n                },\n                \"Enforce\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Enforce\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.lambda#CodeStorageExceededException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Type\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The exception type.</p>\"\n                    }\n                },\n                \"message\": {\n                    \"target\": \"com.amazonaws.lambda#String\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Your Amazon Web Services account has exceeded its maximum total code size. For more information, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html\\\">Lambda quotas</a>.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.lambda#CodeVerificationFailedException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Type\": {\n                    \"target\": \"com.amazonaws.lambda#String\"\n                },\n                \"Message\": {\n                    \"target\": \"com.amazonaws.lambda#String\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The code signature failed one or more of the validation checks for signature mismatch or expiry, and the code signing policy is set to ENFORCE. Lambda blocks the deployment.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.lambda#CollectionName\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 57\n                },\n                \"smithy.api#pattern\": \"^(^(?!(system\\\\x2e)))(^[_a-zA-Z0-9])([^$]*)$\"\n            }\n        },\n        \"com.amazonaws.lambda#CompatibleArchitectures\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.lambda#Architecture\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 2\n                }\n            }\n        },\n        \"com.amazonaws.lambda#CompatibleRuntimes\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.lambda#Runtime\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 15\n                }\n            }\n        },\n        \"com.amazonaws.lambda#Concurrency\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ReservedConcurrentExecutions\": {\n                    \"target\": \"com.amazonaws.lambda#ReservedConcurrentExecutions\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of concurrent executions that are reserved for this function. For more information, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/configuration-concurrency.html\\\">Managing Lambda reserved concurrency</a>.</p>\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.lambda#Cors\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AllowCredentials\": {\n                    \"target\": \"com.amazonaws.lambda#AllowCredentials\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Whether to allow cookies or other credentials in requests to your function URL. The default is <code>false</code>.</p>\"\n                    }\n                },\n                \"AllowHeaders\": {\n                    \"target\": \"com.amazonaws.lambda#HeadersList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The HTTP headers that origins can include in requests to your function URL. For example: <code>Date</code>, <code>Keep-Alive</code>, <code>X-Custom-Header</code>.</p>\"\n                    }\n                },\n                \"AllowMethods\": {\n                    \"target\": \"com.amazonaws.lambda#AllowMethodsList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The HTTP methods that are allowed when calling your function URL. For example: <code>GET</code>, <code>POST</code>, <code>DELETE</code>, or the wildcard character (<code>*</code>).</p>\"\n                    }\n                },\n                \"AllowOrigins\": {\n                    \"target\": \"com.amazonaws.lambda#AllowOriginsList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The origins that can access your function URL. You can list any number of specific origins, separated by a comma. For example: <code>https://www.example.com</code>, <code>http://localhost:60905</code>.</p> <p>Alternatively, you can grant access to all origins using the wildcard character (<code>*</code>).</p>\"\n                    }\n                },\n                \"ExposeHeaders\": {\n                    \"target\": \"com.amazonaws.lambda#HeadersList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The HTTP headers in your function response that you want to expose to origins that call your function URL. For example: <code>Date</code>, <code>Keep-Alive</code>, <code>X-Custom-Header</code>.</p>\"\n                    }\n                },\n                \"MaxAge\": {\n                    \"target\": \"com.amazonaws.lambda#MaxAge\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum amount of time, in seconds, that web browsers can cache results of a preflight request. By default, this is set to <code>0</code>, which means that the browser doesn't cache results.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The <a href=\\\"https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS\\\">cross-origin resource sharing (CORS)</a> settings for your Lambda function URL. Use CORS to grant access to your function URL from any origin. You can also use CORS to control access for specific HTTP headers and methods in requests to your function URL.</p>\"\n            }\n        },\n        \"com.amazonaws.lambda#CreateAlias\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.lambda#CreateAliasRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.lambda#AliasConfiguration\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.lambda#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceConflictException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ServiceException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#TooManyRequestsException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.iam#iamAction\": {\n                    \"documentation\": \"Grants permission to create an alias for a Lambda function version\",\n                    \"relativeDocumentation\": \"API_CreateAlias.html\",\n                    \"resources\": {\n                        \"required\": {\n                            \"function\": {}\n                        }\n                    }\n                },\n                \"smithy.api#documentation\": \"<p>Creates an <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/configuration-aliases.html\\\">alias</a> for a Lambda function version. Use aliases to provide clients with a function identifier that you can update to invoke a different version.</p> <p>You can also map an alias to split invocation requests between two versions. Use the <code>RoutingConfig</code> parameter to specify a second version and the percentage of invocation requests that it receives.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To create an alias for a Lambda function\",\n                        \"documentation\": \"The following example creates an alias named LIVE that points to version 1 of the my-function Lambda function.\",\n                        \"input\": {\n                            \"FunctionName\": \"my-function\",\n                            \"Name\": \"LIVE\",\n                            \"FunctionVersion\": \"1\",\n                            \"Description\": \"alias for live version of function\"\n                        },\n                        \"output\": {\n                            \"FunctionVersion\": \"1\",\n                            \"Name\": \"LIVE\",\n                            \"AliasArn\": \"arn:aws:lambda:us-east-2:123456789012:function:my-function:LIVE\",\n                            \"RevisionId\": \"873282ed-xmpl-4dc8-a069-d0c647e470c6\",\n                            \"Description\": \"alias for live version of function\"\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"POST\",\n                    \"uri\": \"/2015-03-31/functions/{FunctionName}/aliases\",\n                    \"code\": 201\n                },\n                \"smithy.api#idempotent\": {}\n            }\n        },\n        \"com.amazonaws.lambda#CreateAliasRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"FunctionName\": {\n                    \"target\": \"com.amazonaws.lambda#FunctionName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name or ARN of the Lambda function.</p> <p class=\\\"title\\\"> <b>Name formats</b> </p> <ul> <li> <p> <b>Function name</b> - <code>MyFunction</code>.</p> </li> <li> <p> <b>Function ARN</b> - <code>arn:aws:lambda:us-west-2:123456789012:function:MyFunction</code>.</p> </li> <li> <p> <b>Partial ARN</b> - <code>123456789012:function:MyFunction</code>.</p> </li> </ul> <p>The length constraint applies only to the full ARN. If you specify only the function name, it is limited to 64 characters in length.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Name\": {\n                    \"target\": \"com.amazonaws.lambda#Alias\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the alias.</p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.api#resourceIdentifier\": \"Alias\"\n                    }\n                },\n                \"FunctionVersion\": {\n                    \"target\": \"com.amazonaws.lambda#Version\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The function version that the alias invokes.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.lambda#Description\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A description of the alias.</p>\"\n                    }\n                },\n                \"RoutingConfig\": {\n                    \"target\": \"com.amazonaws.lambda#AliasRoutingConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/configuration-aliases.html#configuring-alias-routing\\\">routing configuration</a> of the alias.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.lambda#CreateCodeSigningConfig\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.lambda#CreateCodeSigningConfigRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.lambda#CreateCodeSigningConfigResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.lambda#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ServiceException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.iam#conditionKeys\": [\n                    \"aws:TagKeys\",\n                    \"aws:RequestTag/${TagKey}\"\n                ],\n                \"aws.iam#iamAction\": {\n                    \"createsResources\": [\n                        \"code signing config\"\n                    ],\n                    \"documentation\": \"Grants permission to create an AWS Lambda code signing config\",\n                    \"relativeDocumentation\": \"API_CreateCodeSigningConfig.html\"\n                },\n                \"smithy.api#documentation\": \"<p>Creates a code signing configuration. A <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/configuration-codesigning.html\\\">code signing configuration</a> defines a list of allowed signing profiles and defines the code-signing validation policy (action to be taken if deployment validation checks fail). </p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"POST\",\n                    \"uri\": \"/2020-04-22/code-signing-configs\",\n                    \"code\": 201\n                }\n            }\n        },\n        \"com.amazonaws.lambda#CreateCodeSigningConfigRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Description\": {\n                    \"target\": \"com.amazonaws.lambda#Description\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Descriptive name for this code signing configuration.</p>\"\n                    }\n                },\n                \"AllowedPublishers\": {\n                    \"target\": \"com.amazonaws.lambda#AllowedPublishers\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Signing profiles for this code signing configuration.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"CodeSigningPolicies\": {\n                    \"target\": \"com.amazonaws.lambda#CodeSigningPolicies\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The code signing policies define the actions to take if the validation checks fail. </p>\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.lambda#Tags\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of tags to add to the code signing configuration.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.lambda#CreateCodeSigningConfigResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CodeSigningConfig\": {\n                    \"target\": \"com.amazonaws.lambda#CodeSigningConfig\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The code signing configuration.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.lambda#CreateEventSourceMapping\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.lambda#CreateEventSourceMappingRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.lambda#EventSourceMappingConfiguration\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.lambda#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceConflictException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ServiceException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#TooManyRequestsException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.iam#conditionKeys\": [\n                    \"aws:RequestTag/${TagKey}\",\n                    \"lambda:FunctionArn\",\n                    \"aws:TagKeys\"\n                ],\n                \"aws.iam#iamAction\": {\n                    \"createsResources\": [\n                        \"eventSourceMapping\"\n                    ],\n                    \"documentation\": \"Grants permission to create a mapping between an event source and an AWS Lambda function\",\n                    \"relativeDocumentation\": \"API_CreateEventSourceMapping.html\"\n                },\n                \"smithy.api#documentation\": \"<p>Creates a mapping between an event source and an Lambda function. Lambda reads items from the event source and invokes the function.</p> <p>For details about how to configure different event sources, see the following topics. </p> <ul> <li> <p> <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/with-ddb.html#services-dynamodb-eventsourcemapping\\\"> Amazon DynamoDB Streams</a> </p> </li> <li> <p> <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/with-kinesis.html#services-kinesis-eventsourcemapping\\\"> Amazon Kinesis</a> </p> </li> <li> <p> <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/with-sqs.html#events-sqs-eventsource\\\"> Amazon SQS</a> </p> </li> <li> <p> <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/with-mq.html#services-mq-eventsourcemapping\\\"> Amazon MQ and RabbitMQ</a> </p> </li> <li> <p> <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/with-msk.html\\\"> Amazon MSK</a> </p> </li> <li> <p> <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/kafka-smaa.html\\\"> Apache Kafka</a> </p> </li> <li> <p> <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/with-documentdb.html\\\"> Amazon DocumentDB</a> </p> </li> </ul> <p>The following error handling options are available only for DynamoDB and Kinesis event sources:</p> <ul> <li> <p> <code>BisectBatchOnFunctionError</code> – If the function returns an error, split the batch in two and retry.</p> </li> <li> <p> <code>MaximumRecordAgeInSeconds</code> – Discard records older than the specified age. The default value is infinite (-1). When set to infinite (-1), failed records are retried until the record expires</p> </li> <li> <p> <code>MaximumRetryAttempts</code> – Discard records after the specified number of retries. The default value is infinite (-1). When set to infinite (-1), failed records are retried until the record expires.</p> </li> <li> <p> <code>ParallelizationFactor</code> – Process multiple batches from each shard concurrently.</p> </li> </ul> <p>For stream sources (DynamoDB, Kinesis, Amazon MSK, and self-managed Apache Kafka), the following option is also available:</p> <ul> <li> <p> <code>OnFailure</code> – Send discarded records to an Amazon SQS queue, Amazon SNS topic, or Amazon S3 bucket. For more information, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/invocation-async-retain-records.html#invocation-async-destinations\\\">Adding a destination</a>.</p> </li> </ul> <p>For information about which configuration parameters apply to each event source, see the following topics.</p> <ul> <li> <p> <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/with-ddb.html#services-ddb-params\\\"> Amazon DynamoDB Streams</a> </p> </li> <li> <p> <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/with-kinesis.html#services-kinesis-params\\\"> Amazon Kinesis</a> </p> </li> <li> <p> <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/with-sqs.html#services-sqs-params\\\"> Amazon SQS</a> </p> </li> <li> <p> <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/with-mq.html#services-mq-params\\\"> Amazon MQ and RabbitMQ</a> </p> </li> <li> <p> <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/with-msk.html#services-msk-parms\\\"> Amazon MSK</a> </p> </li> <li> <p> <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/with-kafka.html#services-kafka-parms\\\"> Apache Kafka</a> </p> </li> <li> <p> <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/with-documentdb.html#docdb-configuration\\\"> Amazon DocumentDB</a> </p> </li> </ul>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To create a mapping between an event source and an AWS Lambda function\",\n                        \"documentation\": \"The following example creates a mapping between an SQS queue and the my-function Lambda function.\",\n                        \"input\": {\n                            \"EventSourceArn\": \"arn:aws:sqs:us-west-2:123456789012:my-queue\",\n                            \"FunctionName\": \"my-function\",\n                            \"BatchSize\": 5\n                        },\n                        \"output\": {\n                            \"UUID\": \"a1b2c3d4-5678-90ab-cdef-11111EXAMPLE\",\n                            \"StateTransitionReason\": \"USER_INITIATED\",\n                            \"LastModified\": 1.569284520333E9,\n                            \"BatchSize\": 5,\n                            \"State\": \"Creating\",\n                            \"FunctionArn\": \"arn:aws:lambda:us-west-2:123456789012:function:my-function\",\n                            \"EventSourceArn\": \"arn:aws:sqs:us-west-2:123456789012:my-queue\"\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"POST\",\n                    \"uri\": \"/2015-03-31/event-source-mappings\",\n                    \"code\": 202\n                }\n            }\n        },\n        \"com.amazonaws.lambda#CreateEventSourceMappingRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"EventSourceArn\": {\n                    \"target\": \"com.amazonaws.lambda#Arn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the event source.</p> <ul> <li> <p> <b>Amazon Kinesis</b> – The ARN of the data stream or a stream consumer.</p> </li> <li> <p> <b>Amazon DynamoDB Streams</b> – The ARN of the stream.</p> </li> <li> <p> <b>Amazon Simple Queue Service</b> – The ARN of the queue.</p> </li> <li> <p> <b>Amazon Managed Streaming for Apache Kafka</b> – The ARN of the cluster or the ARN of the VPC connection (for <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/with-msk.html#msk-multi-vpc\\\">cross-account event source mappings</a>).</p> </li> <li> <p> <b>Amazon MQ</b> – The ARN of the broker.</p> </li> <li> <p> <b>Amazon DocumentDB</b> – The ARN of the DocumentDB change stream.</p> </li> </ul>\"\n                    }\n                },\n                \"FunctionName\": {\n                    \"target\": \"com.amazonaws.lambda#FunctionName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name or ARN of the Lambda function.</p> <p class=\\\"title\\\"> <b>Name formats</b> </p> <ul> <li> <p> <b>Function name</b> – <code>MyFunction</code>.</p> </li> <li> <p> <b>Function ARN</b> – <code>arn:aws:lambda:us-west-2:123456789012:function:MyFunction</code>.</p> </li> <li> <p> <b>Version or Alias ARN</b> – <code>arn:aws:lambda:us-west-2:123456789012:function:MyFunction:PROD</code>.</p> </li> <li> <p> <b>Partial ARN</b> – <code>123456789012:function:MyFunction</code>.</p> </li> </ul> <p>The length constraint applies only to the full ARN. If you specify only the function name, it's limited to 64 characters in length.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Enabled\": {\n                    \"target\": \"com.amazonaws.lambda#Enabled\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>When true, the event source mapping is active. When false, Lambda pauses polling and invocation.</p> <p>Default: True</p>\"\n                    }\n                },\n                \"BatchSize\": {\n                    \"target\": \"com.amazonaws.lambda#BatchSize\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of records in each batch that Lambda pulls from your stream or queue and sends to your function. Lambda passes all of the records in the batch to the function in a single call, up to the payload limit for synchronous invocation (6 MB).</p> <ul> <li> <p> <b>Amazon Kinesis</b> – Default 100. Max 10,000.</p> </li> <li> <p> <b>Amazon DynamoDB Streams</b> – Default 100. Max 10,000.</p> </li> <li> <p> <b>Amazon Simple Queue Service</b> – Default 10. For standard queues the max is 10,000. For FIFO queues the max is 10.</p> </li> <li> <p> <b>Amazon Managed Streaming for Apache Kafka</b> – Default 100. Max 10,000.</p> </li> <li> <p> <b>Self-managed Apache Kafka</b> – Default 100. Max 10,000.</p> </li> <li> <p> <b>Amazon MQ (ActiveMQ and RabbitMQ)</b> – Default 100. Max 10,000.</p> </li> <li> <p> <b>DocumentDB</b> – Default 100. Max 10,000.</p> </li> </ul>\"\n                    }\n                },\n                \"FilterCriteria\": {\n                    \"target\": \"com.amazonaws.lambda#FilterCriteria\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An object that defines the filter criteria that determine whether Lambda should process an event. For more information, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/invocation-eventfiltering.html\\\">Lambda event filtering</a>.</p>\"\n                    }\n                },\n                \"MaximumBatchingWindowInSeconds\": {\n                    \"target\": \"com.amazonaws.lambda#MaximumBatchingWindowInSeconds\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum amount of time, in seconds, that Lambda spends gathering records before invoking the function. You can configure <code>MaximumBatchingWindowInSeconds</code> to any value from 0 seconds to 300 seconds in increments of seconds.</p> <p>For Kinesis, DynamoDB, and Amazon SQS event sources, the default batching window is 0 seconds. For Amazon MSK, Self-managed Apache Kafka, Amazon MQ, and DocumentDB event sources, the default batching window is 500 ms. Note that because you can only change <code>MaximumBatchingWindowInSeconds</code> in increments of seconds, you cannot revert back to the 500 ms default batching window after you have changed it. To restore the default batching window, you must create a new event source mapping.</p> <p>Related setting: For Kinesis, DynamoDB, and Amazon SQS event sources, when you set <code>BatchSize</code> to a value greater than 10, you must set <code>MaximumBatchingWindowInSeconds</code> to at least 1.</p>\"\n                    }\n                },\n                \"ParallelizationFactor\": {\n                    \"target\": \"com.amazonaws.lambda#ParallelizationFactor\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>(Kinesis and DynamoDB Streams only) The number of batches to process from each shard concurrently.</p>\"\n                    }\n                },\n                \"StartingPosition\": {\n                    \"target\": \"com.amazonaws.lambda#EventSourcePosition\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The position in a stream from which to start reading. Required for Amazon Kinesis and Amazon DynamoDB Stream event sources. <code>AT_TIMESTAMP</code> is supported only for Amazon Kinesis streams, Amazon DocumentDB, Amazon MSK, and self-managed Apache Kafka.</p>\"\n                    }\n                },\n                \"StartingPositionTimestamp\": {\n                    \"target\": \"com.amazonaws.lambda#Date\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>With <code>StartingPosition</code> set to <code>AT_TIMESTAMP</code>, the time from which to start reading. <code>StartingPositionTimestamp</code> cannot be in the future.</p>\"\n                    }\n                },\n                \"DestinationConfig\": {\n                    \"target\": \"com.amazonaws.lambda#DestinationConfig\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>(Kinesis, DynamoDB Streams, Amazon MSK, and self-managed Kafka only) A configuration object that specifies the destination of an event after Lambda processes it.</p>\"\n                    }\n                },\n                \"MaximumRecordAgeInSeconds\": {\n                    \"target\": \"com.amazonaws.lambda#MaximumRecordAgeInSeconds\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>(Kinesis and DynamoDB Streams only) Discard records older than the specified age. The default value is infinite (-1).</p>\"\n                    }\n                },\n                \"BisectBatchOnFunctionError\": {\n                    \"target\": \"com.amazonaws.lambda#BisectBatchOnFunctionError\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>(Kinesis and DynamoDB Streams only) If the function returns an error, split the batch in two and retry.</p>\"\n                    }\n                },\n                \"MaximumRetryAttempts\": {\n                    \"target\": \"com.amazonaws.lambda#MaximumRetryAttemptsEventSourceMapping\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>(Kinesis and DynamoDB Streams only) Discard records after the specified number of retries. The default value is infinite (-1). When set to infinite (-1), failed records are retried until the record expires.</p>\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.lambda#Tags\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of tags to apply to the event source mapping.</p>\"\n                    }\n                },\n                \"TumblingWindowInSeconds\": {\n                    \"target\": \"com.amazonaws.lambda#TumblingWindowInSeconds\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>(Kinesis and DynamoDB Streams only) The duration in seconds of a processing window for DynamoDB and Kinesis Streams event sources. A value of 0 seconds indicates no tumbling window.</p>\"\n                    }\n                },\n                \"Topics\": {\n                    \"target\": \"com.amazonaws.lambda#Topics\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the Kafka topic.</p>\"\n                    }\n                },\n                \"Queues\": {\n                    \"target\": \"com.amazonaws.lambda#Queues\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> (MQ) The name of the Amazon MQ broker destination queue to consume. </p>\"\n                    }\n                },\n                \"SourceAccessConfigurations\": {\n                    \"target\": \"com.amazonaws.lambda#SourceAccessConfigurations\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An array of authentication protocols or VPC components required to secure your event source.</p>\"\n                    }\n                },\n                \"SelfManagedEventSource\": {\n                    \"target\": \"com.amazonaws.lambda#SelfManagedEventSource\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The self-managed Apache Kafka cluster to receive records from.</p>\"\n                    }\n                },\n                \"FunctionResponseTypes\": {\n                    \"target\": \"com.amazonaws.lambda#FunctionResponseTypeList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>(Kinesis, DynamoDB Streams, and Amazon SQS) A list of current response type enums applied to the event source mapping.</p>\"\n                    }\n                },\n                \"AmazonManagedKafkaEventSourceConfig\": {\n                    \"target\": \"com.amazonaws.lambda#AmazonManagedKafkaEventSourceConfig\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specific configuration settings for an Amazon Managed Streaming for Apache Kafka (Amazon MSK) event source.</p>\"\n                    }\n                },\n                \"SelfManagedKafkaEventSourceConfig\": {\n                    \"target\": \"com.amazonaws.lambda#SelfManagedKafkaEventSourceConfig\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specific configuration settings for a self-managed Apache Kafka event source.</p>\"\n                    }\n                },\n                \"ScalingConfig\": {\n                    \"target\": \"com.amazonaws.lambda#ScalingConfig\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>(Amazon SQS only) The scaling configuration for the event source. For more information, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/with-sqs.html#events-sqs-max-concurrency\\\">Configuring maximum concurrency for Amazon SQS event sources</a>.</p>\"\n                    }\n                },\n                \"DocumentDBEventSourceConfig\": {\n                    \"target\": \"com.amazonaws.lambda#DocumentDBEventSourceConfig\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specific configuration settings for a DocumentDB event source.</p>\"\n                    }\n                },\n                \"KMSKeyArn\": {\n                    \"target\": \"com.amazonaws.lambda#KMSKeyArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The ARN of the Key Management Service (KMS) customer managed key that Lambda uses to encrypt your function's <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/invocation-eventfiltering.html#filtering-basics\\\">filter criteria</a>. By default, Lambda does not encrypt your filter criteria object. Specify this property to encrypt data using your own customer managed key. </p>\"\n                    }\n                },\n                \"MetricsConfig\": {\n                    \"target\": \"com.amazonaws.lambda#EventSourceMappingMetricsConfig\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The metrics configuration for your event source. For more information, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/monitoring-metrics-types.html#event-source-mapping-metrics\\\">Event source mapping metrics</a>.</p>\"\n                    }\n                },\n                \"ProvisionedPollerConfig\": {\n                    \"target\": \"com.amazonaws.lambda#ProvisionedPollerConfig\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>(Amazon MSK and self-managed Apache Kafka only) The provisioned mode configuration for the event source. For more information, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/invocation-eventsourcemapping.html#invocation-eventsourcemapping-provisioned-mode\\\">provisioned mode</a>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.lambda#CreateFunction\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.lambda#CreateFunctionRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.lambda#FunctionConfiguration\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.lambda#CodeSigningConfigNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#CodeStorageExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#CodeVerificationFailedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#InvalidCodeSignatureException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceConflictException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ServiceException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#TooManyRequestsException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.iam#conditionKeys\": [\n                    \"lambda:VpcIds\",\n                    \"lambda:SubnetIds\",\n                    \"lambda:CodeSigningConfigArn\",\n                    \"lambda:Layer\",\n                    \"aws:RequestTag/${TagKey}\",\n                    \"aws:TagKeys\",\n                    \"lambda:SecurityGroupIds\"\n                ],\n                \"aws.iam#iamAction\": {\n                    \"createsResources\": [\n                        \"function\"\n                    ],\n                    \"documentation\": \"Grants permission to create an AWS Lambda function\",\n                    \"relativeDocumentation\": \"API_CreateFunction.html\",\n                    \"requiredActions\": [\n                        \"iam:PassRole\"\n                    ],\n                    \"resources\": {\n                        \"required\": {\n                            \"function\": {}\n                        }\n                    }\n                },\n                \"smithy.api#documentation\": \"<p>Creates a Lambda function. To create a function, you need a <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-package.html\\\">deployment package</a> and an <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/intro-permission-model.html#lambda-intro-execution-role\\\">execution role</a>. The deployment package is a .zip file archive or container image that contains your function code. The execution role grants the function permission to use Amazon Web Services services, such as Amazon CloudWatch Logs for log streaming and X-Ray for request tracing.</p> <p>If the deployment package is a <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/lambda-images.html\\\">container image</a>, then you set the package type to <code>Image</code>. For a container image, the code property must include the URI of a container image in the Amazon ECR registry. You do not need to specify the handler and runtime properties.</p> <p>If the deployment package is a <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-package.html#gettingstarted-package-zip\\\">.zip file archive</a>, then you set the package type to <code>Zip</code>. For a .zip file archive, the code property specifies the location of the .zip file. You must also specify the handler and runtime properties. The code in the deployment package must be compatible with the target instruction set architecture of the function (<code>x86-64</code> or <code>arm64</code>). If you do not specify the architecture, then the default value is <code>x86-64</code>.</p> <p>When you create a function, Lambda provisions an instance of the function and its supporting resources. If your function connects to a VPC, this process can take a minute or so. During this time, you can't invoke or modify the function. The <code>State</code>, <code>StateReason</code>, and <code>StateReasonCode</code> fields in the response from <a>GetFunctionConfiguration</a> indicate when the function is ready to invoke. For more information, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/functions-states.html\\\">Lambda function states</a>.</p> <p>A function has an unpublished version, and can have published versions and aliases. The unpublished version changes when you update your function's code and configuration. A published version is a snapshot of your function code and configuration that can't be changed. An alias is a named resource that maps to a version, and can be changed to map to a different version. Use the <code>Publish</code> parameter to create version <code>1</code> of your function from its initial configuration.</p> <p>The other parameters let you configure version-specific and function-level settings. You can modify version-specific settings later with <a>UpdateFunctionConfiguration</a>. Function-level settings apply to both the unpublished and published versions of the function, and include tags (<a>TagResource</a>) and per-function concurrency limits (<a>PutFunctionConcurrency</a>).</p> <p>You can use code signing if your deployment package is a .zip file archive. To enable code signing for this function, specify the ARN of a code-signing configuration. When a user attempts to deploy a code package with <a>UpdateFunctionCode</a>, Lambda checks that the code package has a valid signature from a trusted publisher. The code-signing configuration includes set of signing profiles, which define the trusted publishers for this function.</p> <p>If another Amazon Web Services account or an Amazon Web Services service invokes your function, use <a>AddPermission</a> to grant permission by creating a resource-based Identity and Access Management (IAM) policy. You can grant permissions at the function level, on a version, or on an alias.</p> <p>To invoke your function directly, use <a>Invoke</a>. To invoke your function in response to events in other Amazon Web Services services, create an event source mapping (<a>CreateEventSourceMapping</a>), or configure a function trigger in the other service. For more information, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/lambda-invocation.html\\\">Invoking Lambda functions</a>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To create a function\",\n                        \"documentation\": \"The following example creates a function with a deployment package in Amazon S3 and enables X-Ray tracing and environment variable encryption.\",\n                        \"input\": {\n                            \"FunctionName\": \"my-function\",\n                            \"Runtime\": \"nodejs12.x\",\n                            \"Role\": \"arn:aws:iam::123456789012:role/lambda-role\",\n                            \"Handler\": \"index.handler\",\n                            \"Code\": {\n                                \"S3Bucket\": \"my-bucket-1xpuxmplzrlbh\",\n                                \"S3Key\": \"function.zip\"\n                            },\n                            \"Description\": \"Process image objects from Amazon S3.\",\n                            \"Timeout\": 15,\n                            \"MemorySize\": 256,\n                            \"Publish\": true,\n                            \"Environment\": {\n                                \"Variables\": {\n                                    \"BUCKET\": \"my-bucket-1xpuxmplzrlbh\",\n                                    \"PREFIX\": \"inbound\"\n                                }\n                            },\n                            \"KMSKeyArn\": \"arn:aws:kms:us-west-2:123456789012:key/b0844d6c-xmpl-4463-97a4-d49f50839966\",\n                            \"TracingConfig\": {\n                                \"Mode\": \"Active\"\n                            },\n                            \"Tags\": {\n                                \"DEPARTMENT\": \"Assets\"\n                            }\n                        },\n                        \"output\": {\n                            \"FunctionName\": \"my-function\",\n                            \"FunctionArn\": \"arn:aws:lambda:us-west-2:123456789012:function:my-function\",\n                            \"Runtime\": \"nodejs12.x\",\n                            \"Role\": \"arn:aws:iam::123456789012:role/lambda-role\",\n                            \"Handler\": \"index.handler\",\n                            \"CodeSize\": 5797206,\n                            \"Description\": \"Process image objects from Amazon S3.\",\n                            \"Timeout\": 15,\n                            \"MemorySize\": 256,\n                            \"LastModified\": \"2020-04-10T19:06:32.563+0000\",\n                            \"CodeSha256\": \"YFgDgEKG3ugvF1+pX64gV6tu9qNuIYNUdgJm8nCxsm4=\",\n                            \"Version\": \"1\",\n                            \"Environment\": {\n                                \"Variables\": {\n                                    \"PREFIX\": \"inbound\",\n                                    \"BUCKET\": \"my-bucket-1xpuxmplzrlbh\"\n                                }\n                            },\n                            \"KMSKeyArn\": \"arn:aws:kms:us-west-2:123456789012:key/b0844d6c-xmpl-4463-97a4-d49f50839966\",\n                            \"TracingConfig\": {\n                                \"Mode\": \"Active\"\n                            },\n                            \"RevisionId\": \"b75dcd81-xmpl-48a8-a75a-93ba8b5b9727\",\n                            \"State\": \"Active\",\n                            \"LastUpdateStatus\": \"Successful\"\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"POST\",\n                    \"uri\": \"/2015-03-31/functions\",\n                    \"code\": 201\n                },\n                \"smithy.api#idempotent\": {},\n                \"smithy.api#suppress\": [\n                    \"TaggableResource\"\n                ]\n            }\n        },\n        \"com.amazonaws.lambda#CreateFunctionRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"FunctionName\": {\n                    \"target\": \"com.amazonaws.lambda#FunctionName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name or ARN of the Lambda function.</p> <p class=\\\"title\\\"> <b>Name formats</b> </p> <ul> <li> <p> <b>Function name</b> – <code>my-function</code>.</p> </li> <li> <p> <b>Function ARN</b> – <code>arn:aws:lambda:us-west-2:123456789012:function:my-function</code>.</p> </li> <li> <p> <b>Partial ARN</b> – <code>123456789012:function:my-function</code>.</p> </li> </ul> <p>The length constraint applies only to the full ARN. If you specify only the function name, it is limited to 64 characters in length.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Runtime\": {\n                    \"target\": \"com.amazonaws.lambda#Runtime\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The identifier of the function's <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html\\\"> runtime</a>. Runtime is required if the deployment package is a .zip file archive. Specifying a runtime results in an error if you're deploying a function using a container image.</p> <p>The following list includes deprecated runtimes. Lambda blocks creating new functions and updating existing functions shortly after each runtime is deprecated. For more information, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html#runtime-deprecation-levels\\\">Runtime use after deprecation</a>.</p> <p>For a list of all currently supported runtimes, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html#runtimes-supported\\\">Supported runtimes</a>.</p>\"\n                    }\n                },\n                \"Role\": {\n                    \"target\": \"com.amazonaws.lambda#RoleArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the function's execution role.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Handler\": {\n                    \"target\": \"com.amazonaws.lambda#Handler\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the method within your code that Lambda calls to run your function. Handler is required if the deployment package is a .zip file archive. The format includes the file name. It can also include namespaces and other qualifiers, depending on the runtime. For more information, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/foundation-progmodel.html\\\">Lambda programming model</a>.</p>\"\n                    }\n                },\n                \"Code\": {\n                    \"target\": \"com.amazonaws.lambda#FunctionCode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The code for the function.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.lambda#Description\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A description of the function.</p>\"\n                    }\n                },\n                \"Timeout\": {\n                    \"target\": \"com.amazonaws.lambda#Timeout\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The amount of time (in seconds) that Lambda allows a function to run before stopping it. The default is 3 seconds. The maximum allowed value is 900 seconds. For more information, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/runtimes-context.html\\\">Lambda execution environment</a>.</p>\"\n                    }\n                },\n                \"MemorySize\": {\n                    \"target\": \"com.amazonaws.lambda#MemorySize\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The amount of <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/configuration-function-common.html#configuration-memory-console\\\">memory available to the function</a> at runtime. Increasing the function memory also increases its CPU allocation. The default value is 128 MB. The value can be any multiple of 1 MB.</p>\"\n                    }\n                },\n                \"Publish\": {\n                    \"target\": \"com.amazonaws.lambda#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Set to true to publish the first version of the function during creation.</p>\"\n                    }\n                },\n                \"VpcConfig\": {\n                    \"target\": \"com.amazonaws.lambda#VpcConfig\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>For network connectivity to Amazon Web Services resources in a VPC, specify a list of security groups and subnets in the VPC. When you connect a function to a VPC, it can access resources and the internet only through that VPC. For more information, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/configuration-vpc.html\\\">Configuring a Lambda function to access resources in a VPC</a>.</p>\"\n                    }\n                },\n                \"PackageType\": {\n                    \"target\": \"com.amazonaws.lambda#PackageType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of deployment package. Set to <code>Image</code> for container image and set to <code>Zip</code> for .zip file archive.</p>\"\n                    }\n                },\n                \"DeadLetterConfig\": {\n                    \"target\": \"com.amazonaws.lambda#DeadLetterConfig\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A dead-letter queue configuration that specifies the queue or topic where Lambda sends asynchronous events when they fail processing. For more information, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/invocation-async.html#invocation-dlq\\\">Dead-letter queues</a>.</p>\"\n                    }\n                },\n                \"Environment\": {\n                    \"target\": \"com.amazonaws.lambda#Environment\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Environment variables that are accessible from function code during execution.</p>\"\n                    }\n                },\n                \"KMSKeyArn\": {\n                    \"target\": \"com.amazonaws.lambda#KMSKeyArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the Key Management Service (KMS) customer managed key that's used to encrypt the following resources:</p> <ul> <li> <p>The function's <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/configuration-envvars.html#configuration-envvars-encryption\\\">environment variables</a>.</p> </li> <li> <p>The function's <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/snapstart-security.html\\\">Lambda SnapStart</a> snapshots.</p> </li> <li> <p>When used with <code>SourceKMSKeyArn</code>, the unzipped version of the .zip deployment package that's used for function invocations. For more information, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/encrypt-zip-package.html#enable-zip-custom-encryption\\\"> Specifying a customer managed key for Lambda</a>.</p> </li> <li> <p>The optimized version of the container image that's used for function invocations. Note that this is not the same key that's used to protect your container image in the Amazon Elastic Container Registry (Amazon ECR). For more information, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/images-create.html#images-lifecycle\\\">Function lifecycle</a>.</p> </li> </ul> <p>If you don't provide a customer managed key, Lambda uses an <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-owned-cmk\\\">Amazon Web Services owned key</a> or an <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk\\\">Amazon Web Services managed key</a>.</p>\"\n                    }\n                },\n                \"TracingConfig\": {\n                    \"target\": \"com.amazonaws.lambda#TracingConfig\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Set <code>Mode</code> to <code>Active</code> to sample and trace a subset of incoming requests with <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/services-xray.html\\\">X-Ray</a>.</p>\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.lambda#Tags\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/tagging.html\\\">tags</a> to apply to the function.</p>\"\n                    }\n                },\n                \"Layers\": {\n                    \"target\": \"com.amazonaws.lambda#LayerList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html\\\">function layers</a> to add to the function's execution environment. Specify each layer by its ARN, including the version.</p>\"\n                    }\n                },\n                \"FileSystemConfigs\": {\n                    \"target\": \"com.amazonaws.lambda#FileSystemConfigList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Connection settings for an Amazon EFS file system.</p>\"\n                    }\n                },\n                \"ImageConfig\": {\n                    \"target\": \"com.amazonaws.lambda#ImageConfig\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Container image <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/images-create.html#images-parms\\\">configuration values</a> that override the values in the container image Dockerfile.</p>\"\n                    }\n                },\n                \"CodeSigningConfigArn\": {\n                    \"target\": \"com.amazonaws.lambda#CodeSigningConfigArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>To enable code signing for this function, specify the ARN of a code-signing configuration. A code-signing configuration includes a set of signing profiles, which define the trusted publishers for this function.</p>\"\n                    }\n                },\n                \"Architectures\": {\n                    \"target\": \"com.amazonaws.lambda#ArchitecturesList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The instruction set architecture that the function supports. Enter a string array with one of the valid values (arm64 or x86_64). The default value is <code>x86_64</code>.</p>\"\n                    }\n                },\n                \"EphemeralStorage\": {\n                    \"target\": \"com.amazonaws.lambda#EphemeralStorage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The size of the function's <code>/tmp</code> directory in MB. The default value is 512, but can be any whole number between 512 and 10,240 MB. For more information, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/configuration-function-common.html#configuration-ephemeral-storage\\\">Configuring ephemeral storage (console)</a>.</p>\"\n                    }\n                },\n                \"SnapStart\": {\n                    \"target\": \"com.amazonaws.lambda#SnapStart\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The function's <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/snapstart.html\\\">SnapStart</a> setting.</p>\"\n                    }\n                },\n                \"LoggingConfig\": {\n                    \"target\": \"com.amazonaws.lambda#LoggingConfig\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The function's Amazon CloudWatch Logs configuration settings.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.lambda#CreateFunctionUrlConfig\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.lambda#CreateFunctionUrlConfigRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.lambda#CreateFunctionUrlConfigResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.lambda#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceConflictException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ServiceException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#TooManyRequestsException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.iam#conditionKeys\": [\n                    \"lambda:FunctionArn\",\n                    \"lambda:FunctionUrlAuthType\"\n                ],\n                \"aws.iam#iamAction\": {\n                    \"documentation\": \"Grants permission to create a function url configuration for a Lambda function\",\n                    \"relativeDocumentation\": \"API_CreateFunctionUrlConfig.html\",\n                    \"resources\": {\n                        \"required\": {\n                            \"function\": {}\n                        }\n                    }\n                },\n                \"smithy.api#documentation\": \"<p>Creates a Lambda function URL with the specified configuration parameters. A function URL is a dedicated HTTP(S) endpoint that you can use to invoke your function.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"POST\",\n                    \"uri\": \"/2021-10-31/functions/{FunctionName}/url\",\n                    \"code\": 201\n                }\n            }\n        },\n        \"com.amazonaws.lambda#CreateFunctionUrlConfigRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"FunctionName\": {\n                    \"target\": \"com.amazonaws.lambda#FunctionName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name or ARN of the Lambda function.</p> <p class=\\\"title\\\"> <b>Name formats</b> </p> <ul> <li> <p> <b>Function name</b> – <code>my-function</code>.</p> </li> <li> <p> <b>Function ARN</b> – <code>arn:aws:lambda:us-west-2:123456789012:function:my-function</code>.</p> </li> <li> <p> <b>Partial ARN</b> – <code>123456789012:function:my-function</code>.</p> </li> </ul> <p>The length constraint applies only to the full ARN. If you specify only the function name, it is limited to 64 characters in length.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Qualifier\": {\n                    \"target\": \"com.amazonaws.lambda#FunctionUrlQualifier\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The alias name.</p>\",\n                        \"smithy.api#httpQuery\": \"Qualifier\"\n                    }\n                },\n                \"AuthType\": {\n                    \"target\": \"com.amazonaws.lambda#FunctionUrlAuthType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of authentication that your function URL uses. Set to <code>AWS_IAM</code> if you want to restrict access to authenticated users only. Set to <code>NONE</code> if you want to bypass IAM authentication to create a public endpoint. For more information, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/urls-auth.html\\\">Security and auth model for Lambda function URLs</a>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Cors\": {\n                    \"target\": \"com.amazonaws.lambda#Cors\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <a href=\\\"https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS\\\">cross-origin resource sharing (CORS)</a> settings for your function URL.</p>\"\n                    }\n                },\n                \"InvokeMode\": {\n                    \"target\": \"com.amazonaws.lambda#InvokeMode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use one of the following options:</p> <ul> <li> <p> <code>BUFFERED</code> – This is the default option. Lambda invokes your function using the <code>Invoke</code> API operation. Invocation results are available when the payload is complete. The maximum payload size is 6 MB.</p> </li> <li> <p> <code>RESPONSE_STREAM</code> – Your function streams payload results as they become available. Lambda invokes your function using the <code>InvokeWithResponseStream</code> API operation. The maximum response payload size is 200 MB.</p> </li> </ul>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.lambda#CreateFunctionUrlConfigResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"FunctionUrl\": {\n                    \"target\": \"com.amazonaws.lambda#FunctionUrl\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The HTTP URL endpoint for your function.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"FunctionArn\": {\n                    \"target\": \"com.amazonaws.lambda#FunctionArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of your function.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"AuthType\": {\n                    \"target\": \"com.amazonaws.lambda#FunctionUrlAuthType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of authentication that your function URL uses. Set to <code>AWS_IAM</code> if you want to restrict access to authenticated users only. Set to <code>NONE</code> if you want to bypass IAM authentication to create a public endpoint. For more information, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/urls-auth.html\\\">Security and auth model for Lambda function URLs</a>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Cors\": {\n                    \"target\": \"com.amazonaws.lambda#Cors\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <a href=\\\"https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS\\\">cross-origin resource sharing (CORS)</a> settings for your function URL.</p>\"\n                    }\n                },\n                \"CreationTime\": {\n                    \"target\": \"com.amazonaws.lambda#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>When the function URL was created, in <a href=\\\"https://www.w3.org/TR/NOTE-datetime\\\">ISO-8601 format</a> (YYYY-MM-DDThh:mm:ss.sTZD).</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"InvokeMode\": {\n                    \"target\": \"com.amazonaws.lambda#InvokeMode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use one of the following options:</p> <ul> <li> <p> <code>BUFFERED</code> – This is the default option. Lambda invokes your function using the <code>Invoke</code> API operation. Invocation results are available when the payload is complete. The maximum payload size is 6 MB.</p> </li> <li> <p> <code>RESPONSE_STREAM</code> – Your function streams payload results as they become available. Lambda invokes your function using the <code>InvokeWithResponseStream</code> API operation. The maximum response payload size is 200 MB.</p> </li> </ul>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.lambda#DatabaseName\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 63\n                },\n                \"smithy.api#pattern\": \"^[^ /\\\\.$\\\\x22]*$\"\n            }\n        },\n        \"com.amazonaws.lambda#Date\": {\n            \"type\": \"timestamp\"\n        },\n        \"com.amazonaws.lambda#DeadLetterConfig\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TargetArn\": {\n                    \"target\": \"com.amazonaws.lambda#ResourceArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of an Amazon SQS queue or Amazon SNS topic.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/invocation-async-retain-records.html#invocation-dlq\\\">dead-letter queue</a> for failed asynchronous invocations.</p>\"\n            }\n        },\n        \"com.amazonaws.lambda#DeleteAlias\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.lambda#DeleteAliasRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.lambda#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceConflictException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ServiceException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#TooManyRequestsException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.iam#iamAction\": {\n                    \"documentation\": \"Grants permission to delete an AWS Lambda function alias\",\n                    \"relativeDocumentation\": \"API_DeleteAlias.html\",\n                    \"resources\": {\n                        \"required\": {\n                            \"function\": {}\n                        }\n                    }\n                },\n                \"smithy.api#documentation\": \"<p>Deletes a Lambda function <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/configuration-aliases.html\\\">alias</a>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To delete a Lambda function alias\",\n                        \"documentation\": \"The following example deletes an alias named BLUE from a function named my-function\",\n                        \"input\": {\n                            \"FunctionName\": \"my-function\",\n                            \"Name\": \"BLUE\"\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"DELETE\",\n                    \"uri\": \"/2015-03-31/functions/{FunctionName}/aliases/{Name}\",\n                    \"code\": 204\n                },\n                \"smithy.api#idempotent\": {}\n            }\n        },\n        \"com.amazonaws.lambda#DeleteAliasRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"FunctionName\": {\n                    \"target\": \"com.amazonaws.lambda#FunctionName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name or ARN of the Lambda function.</p> <p class=\\\"title\\\"> <b>Name formats</b> </p> <ul> <li> <p> <b>Function name</b> - <code>MyFunction</code>.</p> </li> <li> <p> <b>Function ARN</b> - <code>arn:aws:lambda:us-west-2:123456789012:function:MyFunction</code>.</p> </li> <li> <p> <b>Partial ARN</b> - <code>123456789012:function:MyFunction</code>.</p> </li> </ul> <p>The length constraint applies only to the full ARN. If you specify only the function name, it is limited to 64 characters in length.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Name\": {\n                    \"target\": \"com.amazonaws.lambda#Alias\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the alias.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {},\n                        \"smithy.api#resourceIdentifier\": \"Alias\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.lambda#DeleteCodeSigningConfig\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.lambda#DeleteCodeSigningConfigRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.lambda#DeleteCodeSigningConfigResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.lambda#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceConflictException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ServiceException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.iam#iamAction\": {\n                    \"documentation\": \"Grants permission to delete an AWS Lambda code signing config\",\n                    \"relativeDocumentation\": \"API_DeleteCodeSigningConfig.html\",\n                    \"resources\": {\n                        \"required\": {\n                            \"code signing config\": {}\n                        }\n                    }\n                },\n                \"smithy.api#documentation\": \"<p>Deletes the code signing configuration. You can delete the code signing configuration only if no function is using it. </p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"DELETE\",\n                    \"uri\": \"/2020-04-22/code-signing-configs/{CodeSigningConfigArn}\",\n                    \"code\": 204\n                },\n                \"smithy.api#idempotent\": {}\n            }\n        },\n        \"com.amazonaws.lambda#DeleteCodeSigningConfigRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CodeSigningConfigArn\": {\n                    \"target\": \"com.amazonaws.lambda#CodeSigningConfigArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The The Amazon Resource Name (ARN) of the code signing configuration.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.lambda#DeleteCodeSigningConfigResponse\": {\n            \"type\": \"structure\",\n            \"members\": {},\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.lambda#DeleteEventSourceMapping\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.lambda#DeleteEventSourceMappingRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.lambda#EventSourceMappingConfiguration\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.lambda#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceConflictException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceInUseException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ServiceException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#TooManyRequestsException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.iam#conditionKeys\": [\n                    \"lambda:FunctionArn\"\n                ],\n                \"aws.iam#iamAction\": {\n                    \"documentation\": \"Grants permission to delete an AWS Lambda event source mapping\",\n                    \"relativeDocumentation\": \"API_DeleteEventSourceMapping.html\",\n                    \"resources\": {\n                        \"required\": {\n                            \"eventSourceMapping\": {}\n                        }\n                    }\n                },\n                \"smithy.api#documentation\": \"<p>Deletes an <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/intro-invocation-modes.html\\\">event source mapping</a>. You can get the identifier of a mapping from the output of <a>ListEventSourceMappings</a>.</p> <p>When you delete an event source mapping, it enters a <code>Deleting</code> state and might not be completely deleted for several seconds.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To delete a Lambda function event source mapping\",\n                        \"documentation\": \"The following example deletes an event source mapping. To get a mapping's UUID, use ListEventSourceMappings.\",\n                        \"input\": {\n                            \"UUID\": \"14e0db71-xmpl-4eb5-b481-8945cf9d10c2\"\n                        },\n                        \"output\": {\n                            \"UUID\": \"14e0db71-xmpl-4eb5-b481-8945cf9d10c2\",\n                            \"BatchSize\": 5,\n                            \"EventSourceArn\": \"arn:aws:sqs:us-west-2:123456789012:my-queue\",\n                            \"FunctionArn\": \"arn:aws:lambda:us-east-2:123456789012:function:my-function\",\n                            \"LastModified\": \"2016-11-21T19:49:20.006Z\",\n                            \"State\": \"Enabled\",\n                            \"StateTransitionReason\": \"USER_INITIATED\"\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"DELETE\",\n                    \"uri\": \"/2015-03-31/event-source-mappings/{UUID}\",\n                    \"code\": 202\n                },\n                \"smithy.api#idempotent\": {}\n            }\n        },\n        \"com.amazonaws.lambda#DeleteEventSourceMappingRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"UUID\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The identifier of the event source mapping.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.lambda#DeleteFunction\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.lambda#DeleteFunctionRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.lambda#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceConflictException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ServiceException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#TooManyRequestsException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.iam#iamAction\": {\n                    \"documentation\": \"Grants permission to delete an AWS Lambda function\",\n                    \"relativeDocumentation\": \"API_DeleteFunction.html\",\n                    \"resources\": {\n                        \"required\": {\n                            \"function\": {}\n                        }\n                    }\n                },\n                \"smithy.api#documentation\": \"<p>Deletes a Lambda function. To delete a specific function version, use the <code>Qualifier</code> parameter. Otherwise, all versions and aliases are deleted. This doesn't require the user to have explicit permissions for <a>DeleteAlias</a>.</p> <p>To delete Lambda event source mappings that invoke a function, use <a>DeleteEventSourceMapping</a>. For Amazon Web Services services and resources that invoke your function directly, delete the trigger in the service where you originally configured it.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To delete a version of a Lambda function\",\n                        \"documentation\": \"The following example deletes version 1 of a Lambda function named my-function.\",\n                        \"input\": {\n                            \"FunctionName\": \"my-function\",\n                            \"Qualifier\": \"1\"\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"DELETE\",\n                    \"uri\": \"/2015-03-31/functions/{FunctionName}\",\n                    \"code\": 204\n                },\n                \"smithy.api#idempotent\": {}\n            }\n        },\n        \"com.amazonaws.lambda#DeleteFunctionCodeSigningConfig\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.lambda#DeleteFunctionCodeSigningConfigRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.lambda#CodeSigningConfigNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceConflictException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ServiceException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#TooManyRequestsException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.iam#iamAction\": {\n                    \"documentation\": \"Grants permission to detach a code signing config from an AWS Lambda function\",\n                    \"relativeDocumentation\": \"API_DeleteFunctionCodeSigningConfig.html\",\n                    \"resources\": {\n                        \"required\": {\n                            \"function\": {}\n                        }\n                    }\n                },\n                \"smithy.api#documentation\": \"<p>Removes the code signing configuration from the function.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"DELETE\",\n                    \"uri\": \"/2020-06-30/functions/{FunctionName}/code-signing-config\",\n                    \"code\": 204\n                }\n            }\n        },\n        \"com.amazonaws.lambda#DeleteFunctionCodeSigningConfigRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"FunctionName\": {\n                    \"target\": \"com.amazonaws.lambda#FunctionName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name or ARN of the Lambda function.</p> <p class=\\\"title\\\"> <b>Name formats</b> </p> <ul> <li> <p> <b>Function name</b> - <code>MyFunction</code>.</p> </li> <li> <p> <b>Function ARN</b> - <code>arn:aws:lambda:us-west-2:123456789012:function:MyFunction</code>.</p> </li> <li> <p> <b>Partial ARN</b> - <code>123456789012:function:MyFunction</code>.</p> </li> </ul> <p>The length constraint applies only to the full ARN. If you specify only the function name, it is limited to 64 characters in length.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.lambda#DeleteFunctionConcurrency\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.lambda#DeleteFunctionConcurrencyRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.lambda#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceConflictException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ServiceException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#TooManyRequestsException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.iam#iamAction\": {\n                    \"documentation\": \"Grants permission to remove a concurrent execution limit from an AWS Lambda function\",\n                    \"relativeDocumentation\": \"API_DeleteFunctionConcurrency.html\",\n                    \"resources\": {\n                        \"required\": {\n                            \"function\": {}\n                        }\n                    }\n                },\n                \"smithy.api#documentation\": \"<p>Removes a concurrent execution limit from a function.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To remove the reserved concurrent execution limit from a function\",\n                        \"documentation\": \"The following example deletes the reserved concurrent execution limit from a function named my-function.\",\n                        \"input\": {\n                            \"FunctionName\": \"my-function\"\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"DELETE\",\n                    \"uri\": \"/2017-10-31/functions/{FunctionName}/concurrency\",\n                    \"code\": 204\n                }\n            }\n        },\n        \"com.amazonaws.lambda#DeleteFunctionConcurrencyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"FunctionName\": {\n                    \"target\": \"com.amazonaws.lambda#FunctionName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name or ARN of the Lambda function.</p> <p class=\\\"title\\\"> <b>Name formats</b> </p> <ul> <li> <p> <b>Function name</b> – <code>my-function</code>.</p> </li> <li> <p> <b>Function ARN</b> – <code>arn:aws:lambda:us-west-2:123456789012:function:my-function</code>.</p> </li> <li> <p> <b>Partial ARN</b> – <code>123456789012:function:my-function</code>.</p> </li> </ul> <p>The length constraint applies only to the full ARN. If you specify only the function name, it is limited to 64 characters in length.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.lambda#DeleteFunctionEventInvokeConfig\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.lambda#DeleteFunctionEventInvokeConfigRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.lambda#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceConflictException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ServiceException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#TooManyRequestsException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.iam#iamAction\": {\n                    \"documentation\": \"Grants permission to delete the configuration for asynchronous invocation for an AWS Lambda function, version, or alias\",\n                    \"relativeDocumentation\": \"API_DeleteFunctionEventInvokeConfig.html\",\n                    \"resources\": {\n                        \"required\": {\n                            \"function\": {}\n                        }\n                    }\n                },\n                \"smithy.api#documentation\": \"<p>Deletes the configuration for asynchronous invocation for a function, version, or alias.</p> <p>To configure options for asynchronous invocation, use <a>PutFunctionEventInvokeConfig</a>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To delete an asynchronous invocation configuration\",\n                        \"documentation\": \"The following example deletes the asynchronous invocation configuration for the GREEN alias of a function named my-function.\",\n                        \"input\": {\n                            \"FunctionName\": \"my-function\",\n                            \"Qualifier\": \"GREEN\"\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"DELETE\",\n                    \"uri\": \"/2019-09-25/functions/{FunctionName}/event-invoke-config\",\n                    \"code\": 204\n                }\n            }\n        },\n        \"com.amazonaws.lambda#DeleteFunctionEventInvokeConfigRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"FunctionName\": {\n                    \"target\": \"com.amazonaws.lambda#FunctionName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name or ARN of the Lambda function, version, or alias.</p> <p class=\\\"title\\\"> <b>Name formats</b> </p> <ul> <li> <p> <b>Function name</b> - <code>my-function</code> (name-only), <code>my-function:v1</code> (with alias).</p> </li> <li> <p> <b>Function ARN</b> - <code>arn:aws:lambda:us-west-2:123456789012:function:my-function</code>.</p> </li> <li> <p> <b>Partial ARN</b> - <code>123456789012:function:my-function</code>.</p> </li> </ul> <p>You can append a version number or alias to any of the formats. The length constraint applies only to the full ARN. If you specify only the function name, it is limited to 64 characters in length.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Qualifier\": {\n                    \"target\": \"com.amazonaws.lambda#Qualifier\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A version number or alias name.</p>\",\n                        \"smithy.api#httpQuery\": \"Qualifier\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.lambda#DeleteFunctionRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"FunctionName\": {\n                    \"target\": \"com.amazonaws.lambda#FunctionName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name or ARN of the Lambda function or version.</p> <p class=\\\"title\\\"> <b>Name formats</b> </p> <ul> <li> <p> <b>Function name</b> – <code>my-function</code> (name-only), <code>my-function:1</code> (with version).</p> </li> <li> <p> <b>Function ARN</b> – <code>arn:aws:lambda:us-west-2:123456789012:function:my-function</code>.</p> </li> <li> <p> <b>Partial ARN</b> – <code>123456789012:function:my-function</code>.</p> </li> </ul> <p>You can append a version number or alias to any of the formats. The length constraint applies only to the full ARN. If you specify only the function name, it is limited to 64 characters in length.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Qualifier\": {\n                    \"target\": \"com.amazonaws.lambda#Qualifier\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify a version to delete. You can't delete a version that an alias references.</p>\",\n                        \"smithy.api#httpQuery\": \"Qualifier\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.lambda#DeleteFunctionUrlConfig\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.lambda#DeleteFunctionUrlConfigRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceConflictException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ServiceException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#TooManyRequestsException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.iam#conditionKeys\": [\n                    \"lambda:FunctionArn\",\n                    \"lambda:FunctionUrlAuthType\"\n                ],\n                \"aws.iam#iamAction\": {\n                    \"documentation\": \"Grants permission to delete function url configuration for a Lambda function\",\n                    \"relativeDocumentation\": \"API_DeleteFunctionUrlConfig.html\",\n                    \"resources\": {\n                        \"required\": {\n                            \"function\": {}\n                        }\n                    }\n                },\n                \"smithy.api#documentation\": \"<p>Deletes a Lambda function URL. When you delete a function URL, you can't recover it. Creating a new function URL results in a different URL address.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"DELETE\",\n                    \"uri\": \"/2021-10-31/functions/{FunctionName}/url\",\n                    \"code\": 204\n                }\n            }\n        },\n        \"com.amazonaws.lambda#DeleteFunctionUrlConfigRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"FunctionName\": {\n                    \"target\": \"com.amazonaws.lambda#FunctionName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name or ARN of the Lambda function.</p> <p class=\\\"title\\\"> <b>Name formats</b> </p> <ul> <li> <p> <b>Function name</b> – <code>my-function</code>.</p> </li> <li> <p> <b>Function ARN</b> – <code>arn:aws:lambda:us-west-2:123456789012:function:my-function</code>.</p> </li> <li> <p> <b>Partial ARN</b> – <code>123456789012:function:my-function</code>.</p> </li> </ul> <p>The length constraint applies only to the full ARN. If you specify only the function name, it is limited to 64 characters in length.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Qualifier\": {\n                    \"target\": \"com.amazonaws.lambda#FunctionUrlQualifier\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The alias name.</p>\",\n                        \"smithy.api#httpQuery\": \"Qualifier\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.lambda#DeleteLayerVersion\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.lambda#DeleteLayerVersionRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.lambda#ServiceException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#TooManyRequestsException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.iam#iamAction\": {\n                    \"documentation\": \"Grants permission to delete a version of an AWS Lambda layer\",\n                    \"relativeDocumentation\": \"API_DeleteLayerVersion.html\",\n                    \"resources\": {\n                        \"required\": {\n                            \"layerVersion\": {}\n                        }\n                    }\n                },\n                \"smithy.api#documentation\": \"<p>Deletes a version of an <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html\\\">Lambda layer</a>. Deleted versions can no longer be viewed or added to functions. To avoid breaking functions, a copy of the version remains in Lambda until no functions refer to it.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To delete a version of a Lambda layer\",\n                        \"documentation\": \"The following example deletes version 2 of a layer named my-layer.\",\n                        \"input\": {\n                            \"LayerName\": \"my-layer\",\n                            \"VersionNumber\": 2\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"DELETE\",\n                    \"uri\": \"/2018-10-31/layers/{LayerName}/versions/{VersionNumber}\",\n                    \"code\": 204\n                },\n                \"smithy.api#idempotent\": {}\n            }\n        },\n        \"com.amazonaws.lambda#DeleteLayerVersionRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LayerName\": {\n                    \"target\": \"com.amazonaws.lambda#LayerName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name or Amazon Resource Name (ARN) of the layer.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"VersionNumber\": {\n                    \"target\": \"com.amazonaws.lambda#LayerVersionNumber\",\n                    \"traits\": {\n                        \"smithy.api#default\": null,\n                        \"smithy.api#documentation\": \"<p>The version number.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.lambda#DeleteProvisionedConcurrencyConfig\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.lambda#DeleteProvisionedConcurrencyConfigRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.lambda#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceConflictException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ServiceException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#TooManyRequestsException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.iam#iamAction\": {\n                    \"documentation\": \"Grants permission to delete the provisioned concurrency configuration for an AWS Lambda function\",\n                    \"relativeDocumentation\": \"API_DeleteProvisionedConcurrencyConfig.html\",\n                    \"resources\": {\n                        \"optional\": {\n                            \"function version\": {},\n                            \"function alias\": {}\n                        }\n                    }\n                },\n                \"smithy.api#documentation\": \"<p>Deletes the provisioned concurrency configuration for a function.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To delete a provisioned concurrency configuration\",\n                        \"documentation\": \"The following example deletes the provisioned concurrency configuration for the GREEN alias of a function named my-function.\",\n                        \"input\": {\n                            \"FunctionName\": \"my-function\",\n                            \"Qualifier\": \"GREEN\"\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"DELETE\",\n                    \"uri\": \"/2019-09-30/functions/{FunctionName}/provisioned-concurrency\",\n                    \"code\": 204\n                },\n                \"smithy.api#idempotent\": {}\n            }\n        },\n        \"com.amazonaws.lambda#DeleteProvisionedConcurrencyConfigRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"FunctionName\": {\n                    \"target\": \"com.amazonaws.lambda#FunctionName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name or ARN of the Lambda function.</p> <p class=\\\"title\\\"> <b>Name formats</b> </p> <ul> <li> <p> <b>Function name</b> – <code>my-function</code>.</p> </li> <li> <p> <b>Function ARN</b> – <code>arn:aws:lambda:us-west-2:123456789012:function:my-function</code>.</p> </li> <li> <p> <b>Partial ARN</b> – <code>123456789012:function:my-function</code>.</p> </li> </ul> <p>The length constraint applies only to the full ARN. If you specify only the function name, it is limited to 64 characters in length.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Qualifier\": {\n                    \"target\": \"com.amazonaws.lambda#Qualifier\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The version number or alias name.</p>\",\n                        \"smithy.api#httpQuery\": \"Qualifier\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.lambda#Description\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 256\n                }\n            }\n        },\n        \"com.amazonaws.lambda#DestinationArn\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 350\n                },\n                \"smithy.api#pattern\": \"^$|arn:(aws[a-zA-Z0-9-]*):([a-zA-Z0-9\\\\-])+:([a-z]{2}(-gov)?-[a-z]+-\\\\d{1})?:(\\\\d{12})?:(.*)$\"\n            }\n        },\n        \"com.amazonaws.lambda#DestinationConfig\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"OnSuccess\": {\n                    \"target\": \"com.amazonaws.lambda#OnSuccess\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The destination configuration for successful invocations. Not supported in <code>CreateEventSourceMapping</code> or <code>UpdateEventSourceMapping</code>.</p>\"\n                    }\n                },\n                \"OnFailure\": {\n                    \"target\": \"com.amazonaws.lambda#OnFailure\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The destination configuration for failed invocations.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A configuration object that specifies the destination of an event after Lambda processes it. For more information, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/invocation-async-retain-records.html#invocation-async-destinations\\\">Adding a destination</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.lambda#DocumentDBEventSourceConfig\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DatabaseName\": {\n                    \"target\": \"com.amazonaws.lambda#DatabaseName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The name of the database to consume within the DocumentDB cluster. </p>\"\n                    }\n                },\n                \"CollectionName\": {\n                    \"target\": \"com.amazonaws.lambda#CollectionName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The name of the collection to consume within the database. If you do not specify a collection, Lambda consumes all collections. </p>\"\n                    }\n                },\n                \"FullDocument\": {\n                    \"target\": \"com.amazonaws.lambda#FullDocument\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> Determines what DocumentDB sends to your event stream during document update operations. If set to UpdateLookup, DocumentDB sends a delta describing the changes, along with a copy of the entire document. Otherwise, DocumentDB sends only a partial document that contains the changes. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p> Specific configuration settings for a DocumentDB event source. </p>\"\n            }\n        },\n        \"com.amazonaws.lambda#EC2AccessDeniedException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Type\": {\n                    \"target\": \"com.amazonaws.lambda#String\"\n                },\n                \"Message\": {\n                    \"target\": \"com.amazonaws.lambda#String\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Need additional permissions to configure VPC settings.</p>\",\n                \"smithy.api#error\": \"server\",\n                \"smithy.api#httpError\": 502\n            }\n        },\n        \"com.amazonaws.lambda#EC2ThrottledException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Type\": {\n                    \"target\": \"com.amazonaws.lambda#String\"\n                },\n                \"Message\": {\n                    \"target\": \"com.amazonaws.lambda#String\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Amazon EC2 throttled Lambda during Lambda function initialization using the execution role provided for the function.</p>\",\n                \"smithy.api#error\": \"server\",\n                \"smithy.api#httpError\": 502\n            }\n        },\n        \"com.amazonaws.lambda#EC2UnexpectedException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Type\": {\n                    \"target\": \"com.amazonaws.lambda#String\"\n                },\n                \"Message\": {\n                    \"target\": \"com.amazonaws.lambda#String\"\n                },\n                \"EC2ErrorCode\": {\n                    \"target\": \"com.amazonaws.lambda#String\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Lambda received an unexpected Amazon EC2 client exception while setting up for the Lambda function.</p>\",\n                \"smithy.api#error\": \"server\",\n                \"smithy.api#httpError\": 502\n            }\n        },\n        \"com.amazonaws.lambda#EFSIOException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Type\": {\n                    \"target\": \"com.amazonaws.lambda#String\"\n                },\n                \"Message\": {\n                    \"target\": \"com.amazonaws.lambda#String\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>An error occurred when reading from or writing to a connected file system.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 410\n            }\n        },\n        \"com.amazonaws.lambda#EFSMountConnectivityException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Type\": {\n                    \"target\": \"com.amazonaws.lambda#String\"\n                },\n                \"Message\": {\n                    \"target\": \"com.amazonaws.lambda#String\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The Lambda function couldn't make a network connection to the configured file system.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 408\n            }\n        },\n        \"com.amazonaws.lambda#EFSMountFailureException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Type\": {\n                    \"target\": \"com.amazonaws.lambda#String\"\n                },\n                \"Message\": {\n                    \"target\": \"com.amazonaws.lambda#String\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The Lambda function couldn't mount the configured file system due to a permission or configuration issue.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 403\n            }\n        },\n        \"com.amazonaws.lambda#EFSMountTimeoutException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Type\": {\n                    \"target\": \"com.amazonaws.lambda#String\"\n                },\n                \"Message\": {\n                    \"target\": \"com.amazonaws.lambda#String\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The Lambda function made a network connection to the configured file system, but the mount operation timed out.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 408\n            }\n        },\n        \"com.amazonaws.lambda#ENILimitReachedException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Type\": {\n                    \"target\": \"com.amazonaws.lambda#String\"\n                },\n                \"Message\": {\n                    \"target\": \"com.amazonaws.lambda#String\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Lambda couldn't create an elastic network interface in the VPC, specified as part of Lambda function configuration, because the limit for network interfaces has been reached. For more information, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html\\\">Lambda quotas</a>.</p>\",\n                \"smithy.api#error\": \"server\",\n                \"smithy.api#httpError\": 502\n            }\n        },\n        \"com.amazonaws.lambda#Enabled\": {\n            \"type\": \"boolean\"\n        },\n        \"com.amazonaws.lambda#EndPointType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"KAFKA_BOOTSTRAP_SERVERS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"KAFKA_BOOTSTRAP_SERVERS\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.lambda#Endpoint\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 300\n                },\n                \"smithy.api#pattern\": \"^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\\\\-]*[a-zA-Z0-9])\\\\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\\\\-]*[A-Za-z0-9]):[0-9]{1,5}$\"\n            }\n        },\n        \"com.amazonaws.lambda#EndpointLists\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.lambda#Endpoint\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 10\n                }\n            }\n        },\n        \"com.amazonaws.lambda#Endpoints\": {\n            \"type\": \"map\",\n            \"key\": {\n                \"target\": \"com.amazonaws.lambda#EndPointType\"\n            },\n            \"value\": {\n                \"target\": \"com.amazonaws.lambda#EndpointLists\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 2\n                }\n            }\n        },\n        \"com.amazonaws.lambda#Environment\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Variables\": {\n                    \"target\": \"com.amazonaws.lambda#EnvironmentVariables\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Environment variable key-value pairs. For more information, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/configuration-envvars.html\\\">Using Lambda environment variables</a>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A function's environment variable settings. You can use environment variables to adjust your function's behavior without updating code. An environment variable is a pair of strings that are stored in a function's version-specific configuration.</p>\"\n            }\n        },\n        \"com.amazonaws.lambda#EnvironmentError\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ErrorCode\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The error code.</p>\"\n                    }\n                },\n                \"Message\": {\n                    \"target\": \"com.amazonaws.lambda#SensitiveString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The error message.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Error messages for environment variables that couldn't be applied.</p>\"\n            }\n        },\n        \"com.amazonaws.lambda#EnvironmentResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Variables\": {\n                    \"target\": \"com.amazonaws.lambda#EnvironmentVariables\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Environment variable key-value pairs. Omitted from CloudTrail logs.</p>\"\n                    }\n                },\n                \"Error\": {\n                    \"target\": \"com.amazonaws.lambda#EnvironmentError\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Error messages for environment variables that couldn't be applied.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The results of an operation to update or read environment variables. If the operation succeeds, the response contains the environment variables. If it fails, the response contains details about the error.</p>\"\n            }\n        },\n        \"com.amazonaws.lambda#EnvironmentVariableName\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#pattern\": \"^[a-zA-Z]([a-zA-Z0-9_])+$\",\n                \"smithy.api#sensitive\": {}\n            }\n        },\n        \"com.amazonaws.lambda#EnvironmentVariableValue\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#sensitive\": {}\n            }\n        },\n        \"com.amazonaws.lambda#EnvironmentVariables\": {\n            \"type\": \"map\",\n            \"key\": {\n                \"target\": \"com.amazonaws.lambda#EnvironmentVariableName\"\n            },\n            \"value\": {\n                \"target\": \"com.amazonaws.lambda#EnvironmentVariableValue\"\n            },\n            \"traits\": {\n                \"smithy.api#sensitive\": {}\n            }\n        },\n        \"com.amazonaws.lambda#EphemeralStorage\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Size\": {\n                    \"target\": \"com.amazonaws.lambda#EphemeralStorageSize\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The size of the function's <code>/tmp</code> directory.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The size of the function's <code>/tmp</code> directory in MB. The default value is 512, but can be any whole number between 512 and 10,240 MB. For more information, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/configuration-function-common.html#configuration-ephemeral-storage\\\">Configuring ephemeral storage (console)</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.lambda#EphemeralStorageSize\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 512,\n                    \"max\": 10240\n                }\n            }\n        },\n        \"com.amazonaws.lambda#EventSourceMapping\": {\n            \"type\": \"resource\",\n            \"identifiers\": {\n                \"UUID\": {\n                    \"target\": \"com.amazonaws.lambda#String\"\n                }\n            },\n            \"create\": {\n                \"target\": \"com.amazonaws.lambda#CreateEventSourceMapping\"\n            },\n            \"read\": {\n                \"target\": \"com.amazonaws.lambda#GetEventSourceMapping\"\n            },\n            \"update\": {\n                \"target\": \"com.amazonaws.lambda#UpdateEventSourceMapping\"\n            },\n            \"delete\": {\n                \"target\": \"com.amazonaws.lambda#DeleteEventSourceMapping\"\n            },\n            \"list\": {\n                \"target\": \"com.amazonaws.lambda#ListEventSourceMappings\"\n            },\n            \"traits\": {\n                \"aws.api#arn\": {\n                    \"template\": \"event-source-mapping:{UUID}\"\n                },\n                \"aws.iam#conditionKeys\": [\n                    \"aws:ResourceTag/${TagKey}\"\n                ],\n                \"aws.iam#iamResource\": {\n                    \"disableConditionKeyInheritance\": true,\n                    \"name\": \"eventSourceMapping\",\n                    \"relativeDocumentation\": \"lambda-api-permissions-ref.html\"\n                },\n                \"smithy.api#documentation\": \"Represents an AWS Lambda event source mapping\",\n                \"smithy.api#suppress\": [\n                    \"IamResourceTrait\"\n                ]\n            }\n        },\n        \"com.amazonaws.lambda#EventSourceMappingArn\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 85,\n                    \"max\": 120\n                },\n                \"smithy.api#pattern\": \"^arn:(aws[a-zA-Z-]*)?:lambda:[a-z]{2}((-gov)|(-iso([a-z]?)))?-[a-z]+-\\\\d{1}:\\\\d{12}:event-source-mapping:[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$\"\n            }\n        },\n        \"com.amazonaws.lambda#EventSourceMappingConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"UUID\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The identifier of the event source mapping.</p>\"\n                    }\n                },\n                \"StartingPosition\": {\n                    \"target\": \"com.amazonaws.lambda#EventSourcePosition\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The position in a stream from which to start reading. Required for Amazon Kinesis and Amazon DynamoDB Stream event sources. <code>AT_TIMESTAMP</code> is supported only for Amazon Kinesis streams, Amazon DocumentDB, Amazon MSK, and self-managed Apache Kafka.</p>\"\n                    }\n                },\n                \"StartingPositionTimestamp\": {\n                    \"target\": \"com.amazonaws.lambda#Date\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>With <code>StartingPosition</code> set to <code>AT_TIMESTAMP</code>, the time from which to start reading. <code>StartingPositionTimestamp</code> cannot be in the future.</p>\"\n                    }\n                },\n                \"BatchSize\": {\n                    \"target\": \"com.amazonaws.lambda#BatchSize\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of records in each batch that Lambda pulls from your stream or queue and sends to your function. Lambda passes all of the records in the batch to the function in a single call, up to the payload limit for synchronous invocation (6 MB).</p> <p>Default value: Varies by service. For Amazon SQS, the default is 10. For all other services, the default is 100.</p> <p>Related setting: When you set <code>BatchSize</code> to a value greater than 10, you must set <code>MaximumBatchingWindowInSeconds</code> to at least 1.</p>\"\n                    }\n                },\n                \"MaximumBatchingWindowInSeconds\": {\n                    \"target\": \"com.amazonaws.lambda#MaximumBatchingWindowInSeconds\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum amount of time, in seconds, that Lambda spends gathering records before invoking the function. You can configure <code>MaximumBatchingWindowInSeconds</code> to any value from 0 seconds to 300 seconds in increments of seconds.</p> <p>For streams and Amazon SQS event sources, the default batching window is 0 seconds. For Amazon MSK, Self-managed Apache Kafka, Amazon MQ, and DocumentDB event sources, the default batching window is 500 ms. Note that because you can only change <code>MaximumBatchingWindowInSeconds</code> in increments of seconds, you cannot revert back to the 500 ms default batching window after you have changed it. To restore the default batching window, you must create a new event source mapping.</p> <p>Related setting: For streams and Amazon SQS event sources, when you set <code>BatchSize</code> to a value greater than 10, you must set <code>MaximumBatchingWindowInSeconds</code> to at least 1.</p>\"\n                    }\n                },\n                \"ParallelizationFactor\": {\n                    \"target\": \"com.amazonaws.lambda#ParallelizationFactor\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>(Kinesis and DynamoDB Streams only) The number of batches to process concurrently from each shard. The default value is 1.</p>\"\n                    }\n                },\n                \"EventSourceArn\": {\n                    \"target\": \"com.amazonaws.lambda#Arn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the event source.</p>\"\n                    }\n                },\n                \"FilterCriteria\": {\n                    \"target\": \"com.amazonaws.lambda#FilterCriteria\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An object that defines the filter criteria that determine whether Lambda should process an event. For more information, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/invocation-eventfiltering.html\\\">Lambda event filtering</a>.</p> <p>If filter criteria is encrypted, this field shows up as <code>null</code> in the response of ListEventSourceMapping API calls. You can view this field in plaintext in the response of GetEventSourceMapping and DeleteEventSourceMapping calls if you have <code>kms:Decrypt</code> permissions for the correct KMS key.</p>\"\n                    }\n                },\n                \"FunctionArn\": {\n                    \"target\": \"com.amazonaws.lambda#FunctionArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the Lambda function.</p>\"\n                    }\n                },\n                \"LastModified\": {\n                    \"target\": \"com.amazonaws.lambda#Date\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date that the event source mapping was last updated or that its state changed.</p>\"\n                    }\n                },\n                \"LastProcessingResult\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The result of the event source mapping's last processing attempt.</p>\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The state of the event source mapping. It can be one of the following: <code>Creating</code>, <code>Enabling</code>, <code>Enabled</code>, <code>Disabling</code>, <code>Disabled</code>, <code>Updating</code>, or <code>Deleting</code>.</p>\"\n                    }\n                },\n                \"StateTransitionReason\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether a user or Lambda made the last change to the event source mapping.</p>\"\n                    }\n                },\n                \"DestinationConfig\": {\n                    \"target\": \"com.amazonaws.lambda#DestinationConfig\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>(Kinesis, DynamoDB Streams, Amazon MSK, and self-managed Apache Kafka event sources only) A configuration object that specifies the destination of an event after Lambda processes it.</p>\"\n                    }\n                },\n                \"Topics\": {\n                    \"target\": \"com.amazonaws.lambda#Topics\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the Kafka topic.</p>\"\n                    }\n                },\n                \"Queues\": {\n                    \"target\": \"com.amazonaws.lambda#Queues\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> (Amazon MQ) The name of the Amazon MQ broker destination queue to consume.</p>\"\n                    }\n                },\n                \"SourceAccessConfigurations\": {\n                    \"target\": \"com.amazonaws.lambda#SourceAccessConfigurations\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An array of the authentication protocol, VPC components, or virtual host to secure and define your event source.</p>\"\n                    }\n                },\n                \"SelfManagedEventSource\": {\n                    \"target\": \"com.amazonaws.lambda#SelfManagedEventSource\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The self-managed Apache Kafka cluster for your event source.</p>\"\n                    }\n                },\n                \"MaximumRecordAgeInSeconds\": {\n                    \"target\": \"com.amazonaws.lambda#MaximumRecordAgeInSeconds\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>(Kinesis and DynamoDB Streams only) Discard records older than the specified age. The default value is -1, which sets the maximum age to infinite. When the value is set to infinite, Lambda never discards old records.</p> <note> <p>The minimum valid value for maximum record age is 60s. Although values less than 60 and greater than -1 fall within the parameter's absolute range, they are not allowed</p> </note>\"\n                    }\n                },\n                \"BisectBatchOnFunctionError\": {\n                    \"target\": \"com.amazonaws.lambda#BisectBatchOnFunctionError\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>(Kinesis and DynamoDB Streams only) If the function returns an error, split the batch in two and retry. The default value is false.</p>\"\n                    }\n                },\n                \"MaximumRetryAttempts\": {\n                    \"target\": \"com.amazonaws.lambda#MaximumRetryAttemptsEventSourceMapping\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>(Kinesis and DynamoDB Streams only) Discard records after the specified number of retries. The default value is -1, which sets the maximum number of retries to infinite. When MaximumRetryAttempts is infinite, Lambda retries failed records until the record expires in the event source.</p>\"\n                    }\n                },\n                \"TumblingWindowInSeconds\": {\n                    \"target\": \"com.amazonaws.lambda#TumblingWindowInSeconds\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>(Kinesis and DynamoDB Streams only) The duration in seconds of a processing window for DynamoDB and Kinesis Streams event sources. A value of 0 seconds indicates no tumbling window.</p>\"\n                    }\n                },\n                \"FunctionResponseTypes\": {\n                    \"target\": \"com.amazonaws.lambda#FunctionResponseTypeList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>(Kinesis, DynamoDB Streams, and Amazon SQS) A list of current response type enums applied to the event source mapping.</p>\"\n                    }\n                },\n                \"AmazonManagedKafkaEventSourceConfig\": {\n                    \"target\": \"com.amazonaws.lambda#AmazonManagedKafkaEventSourceConfig\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specific configuration settings for an Amazon Managed Streaming for Apache Kafka (Amazon MSK) event source.</p>\"\n                    }\n                },\n                \"SelfManagedKafkaEventSourceConfig\": {\n                    \"target\": \"com.amazonaws.lambda#SelfManagedKafkaEventSourceConfig\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specific configuration settings for a self-managed Apache Kafka event source.</p>\"\n                    }\n                },\n                \"ScalingConfig\": {\n                    \"target\": \"com.amazonaws.lambda#ScalingConfig\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>(Amazon SQS only) The scaling configuration for the event source. For more information, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/with-sqs.html#events-sqs-max-concurrency\\\">Configuring maximum concurrency for Amazon SQS event sources</a>.</p>\"\n                    }\n                },\n                \"DocumentDBEventSourceConfig\": {\n                    \"target\": \"com.amazonaws.lambda#DocumentDBEventSourceConfig\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specific configuration settings for a DocumentDB event source.</p>\"\n                    }\n                },\n                \"KMSKeyArn\": {\n                    \"target\": \"com.amazonaws.lambda#KMSKeyArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The ARN of the Key Management Service (KMS) customer managed key that Lambda uses to encrypt your function's <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/invocation-eventfiltering.html#filtering-basics\\\">filter criteria</a>.</p>\"\n                    }\n                },\n                \"FilterCriteriaError\": {\n                    \"target\": \"com.amazonaws.lambda#FilterCriteriaError\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An object that contains details about an error related to filter criteria encryption.</p>\"\n                    }\n                },\n                \"EventSourceMappingArn\": {\n                    \"target\": \"com.amazonaws.lambda#EventSourceMappingArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the event source mapping.</p>\"\n                    }\n                },\n                \"MetricsConfig\": {\n                    \"target\": \"com.amazonaws.lambda#EventSourceMappingMetricsConfig\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The metrics configuration for your event source. For more information, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/monitoring-metrics-types.html#event-source-mapping-metrics\\\">Event source mapping metrics</a>.</p>\"\n                    }\n                },\n                \"ProvisionedPollerConfig\": {\n                    \"target\": \"com.amazonaws.lambda#ProvisionedPollerConfig\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>(Amazon MSK and self-managed Apache Kafka only) The provisioned mode configuration for the event source. For more information, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/invocation-eventsourcemapping.html#invocation-eventsourcemapping-provisioned-mode\\\">provisioned mode</a>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A mapping between an Amazon Web Services resource and a Lambda function. For details, see <a>CreateEventSourceMapping</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.lambda#EventSourceMappingMetric\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"EventCount\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"EventCount\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.lambda#EventSourceMappingMetricList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.lambda#EventSourceMappingMetric\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 1\n                }\n            }\n        },\n        \"com.amazonaws.lambda#EventSourceMappingMetricsConfig\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Metrics\": {\n                    \"target\": \"com.amazonaws.lambda#EventSourceMappingMetricList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The metrics you want your event source mapping to produce. Include <code>EventCount</code> to receive event source mapping metrics related to the number of events processed by your event source mapping. For more information about these metrics, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/monitoring-metrics-types.html#event-source-mapping-metrics\\\"> Event source mapping metrics</a>. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The metrics configuration for your event source. Use this configuration object to define which metrics you want your event source mapping to produce.</p>\"\n            }\n        },\n        \"com.amazonaws.lambda#EventSourceMappingsList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.lambda#EventSourceMappingConfiguration\"\n            }\n        },\n        \"com.amazonaws.lambda#EventSourcePosition\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"TRIM_HORIZON\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"TRIM_HORIZON\"\n                    }\n                },\n                \"LATEST\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"LATEST\"\n                    }\n                },\n                \"AT_TIMESTAMP\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AT_TIMESTAMP\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.lambda#EventSourceToken\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 256\n                },\n                \"smithy.api#pattern\": \"^[a-zA-Z0-9._\\\\-]+$\"\n            }\n        },\n        \"com.amazonaws.lambda#FileSystemArn\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 200\n                },\n                \"smithy.api#pattern\": \"^arn:aws[a-zA-Z-]*:elasticfilesystem:[a-z]{2}((-gov)|(-iso(b?)))?-[a-z]+-\\\\d{1}:\\\\d{12}:access-point/fsap-[a-f0-9]{17}$\"\n            }\n        },\n        \"com.amazonaws.lambda#FileSystemConfig\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Arn\": {\n                    \"target\": \"com.amazonaws.lambda#FileSystemArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the Amazon EFS access point that provides access to the file system.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"LocalMountPath\": {\n                    \"target\": \"com.amazonaws.lambda#LocalMountPath\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The path where the function can access the file system, starting with <code>/mnt/</code>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Details about the connection between a Lambda function and an <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/configuration-filesystem.html\\\">Amazon EFS file system</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.lambda#FileSystemConfigList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.lambda#FileSystemConfig\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 1\n                }\n            }\n        },\n        \"com.amazonaws.lambda#Filter\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Pattern\": {\n                    \"target\": \"com.amazonaws.lambda#Pattern\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> A filter pattern. For more information on the syntax of a filter pattern, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/invocation-eventfiltering.html#filtering-syntax\\\"> Filter rule syntax</a>. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p> A structure within a <code>FilterCriteria</code> object that defines an event filtering pattern. </p>\"\n            }\n        },\n        \"com.amazonaws.lambda#FilterCriteria\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Filters\": {\n                    \"target\": \"com.amazonaws.lambda#FilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> A list of filters. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p> An object that contains the filters for an event source. </p>\"\n            }\n        },\n        \"com.amazonaws.lambda#FilterCriteriaError\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ErrorCode\": {\n                    \"target\": \"com.amazonaws.lambda#FilterCriteriaErrorCode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The KMS exception that resulted from filter criteria encryption or decryption.</p>\"\n                    }\n                },\n                \"Message\": {\n                    \"target\": \"com.amazonaws.lambda#FilterCriteriaErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The error message.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>An object that contains details about an error related to filter criteria encryption.</p>\"\n            }\n        },\n        \"com.amazonaws.lambda#FilterCriteriaErrorCode\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 10,\n                    \"max\": 50\n                },\n                \"smithy.api#pattern\": \"^[A-Za-z]+Exception$\"\n            }\n        },\n        \"com.amazonaws.lambda#FilterCriteriaErrorMessage\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 10,\n                    \"max\": 2048\n                },\n                \"smithy.api#pattern\": \".*\"\n            }\n        },\n        \"com.amazonaws.lambda#FilterList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.lambda#Filter\"\n            }\n        },\n        \"com.amazonaws.lambda#FullDocument\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"UpdateLookup\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"UpdateLookup\"\n                    }\n                },\n                \"Default\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Default\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.lambda#Function\": {\n            \"type\": \"resource\",\n            \"identifiers\": {\n                \"FunctionName\": {\n                    \"target\": \"com.amazonaws.lambda#FunctionName\"\n                }\n            },\n            \"put\": {\n                \"target\": \"com.amazonaws.lambda#CreateFunction\"\n            },\n            \"delete\": {\n                \"target\": \"com.amazonaws.lambda#DeleteFunction\"\n            },\n            \"list\": {\n                \"target\": \"com.amazonaws.lambda#ListFunctions\"\n            },\n            \"operations\": [\n                {\n                    \"target\": \"com.amazonaws.lambda#CreateFunctionUrlConfig\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#DeleteFunctionCodeSigningConfig\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#DeleteFunctionConcurrency\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#DeleteFunctionEventInvokeConfig\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#DeleteFunctionUrlConfig\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#GetFunctionCodeSigningConfig\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#GetFunctionConcurrency\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#GetFunctionEventInvokeConfig\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#GetFunctionUrlConfig\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ListFunctionEventInvokeConfigs\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ListFunctionUrlConfigs\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ListProvisionedConcurrencyConfigs\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#PutFunctionCodeSigningConfig\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#PutFunctionConcurrency\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#PutFunctionEventInvokeConfig\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#PutRuntimeManagementConfig\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#UpdateFunctionCode\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#UpdateFunctionConfiguration\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#UpdateFunctionEventInvokeConfig\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#UpdateFunctionUrlConfig\"\n                }\n            ],\n            \"collectionOperations\": [\n                {\n                    \"target\": \"com.amazonaws.lambda#GetFunction\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#GetFunctionConfiguration\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#GetFunctionRecursionConfig\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#GetPolicy\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#GetRuntimeManagementConfig\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#Invoke\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#InvokeAsync\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#InvokeWithResponseStream\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#PutFunctionRecursionConfig\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#arn\": {\n                    \"template\": \"function:{FunctionName}\"\n                },\n                \"aws.api#taggable\": {\n                    \"property\": \"Tags\",\n                    \"disableSystemTags\": false\n                },\n                \"aws.iam#conditionKeys\": [\n                    \"aws:ResourceTag/${TagKey}\"\n                ],\n                \"aws.iam#iamResource\": {\n                    \"disableConditionKeyInheritance\": true,\n                    \"name\": \"function\",\n                    \"relativeDocumentation\": \"lambda-api-permissions-ref.html\"\n                },\n                \"smithy.api#documentation\": \"Represents an AWS Lambda function\",\n                \"smithy.api#suppress\": [\n                    \"TaggableResource\"\n                ]\n            }\n        },\n        \"com.amazonaws.lambda#FunctionAlias\": {\n            \"type\": \"resource\",\n            \"identifiers\": {\n                \"FunctionName\": {\n                    \"target\": \"com.amazonaws.lambda#FunctionName\"\n                },\n                \"Alias\": {\n                    \"target\": \"com.amazonaws.lambda#Alias\"\n                }\n            },\n            \"put\": {\n                \"target\": \"com.amazonaws.lambda#CreateAlias\"\n            },\n            \"read\": {\n                \"target\": \"com.amazonaws.lambda#GetAlias\"\n            },\n            \"update\": {\n                \"target\": \"com.amazonaws.lambda#UpdateAlias\"\n            },\n            \"delete\": {\n                \"target\": \"com.amazonaws.lambda#DeleteAlias\"\n            },\n            \"list\": {\n                \"target\": \"com.amazonaws.lambda#ListAliases\"\n            },\n            \"traits\": {\n                \"aws.api#arn\": {\n                    \"template\": \"function:{FunctionName}:{Alias}\"\n                },\n                \"aws.iam#conditionKeys\": [\n                    \"aws:ResourceTag/${TagKey}\"\n                ],\n                \"aws.iam#iamResource\": {\n                    \"disableConditionKeyInheritance\": true,\n                    \"name\": \"function alias\",\n                    \"relativeDocumentation\": \"lambda-api-permissions-ref.html\"\n                },\n                \"smithy.api#documentation\": \"A lambda function version or alias\",\n                \"smithy.api#suppress\": [\n                    \"IamResourceTrait\"\n                ]\n            }\n        },\n        \"com.amazonaws.lambda#FunctionArn\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#pattern\": \"^arn:(aws[a-zA-Z-]*)?:lambda:[a-z]{2}(-gov)?-[a-z]+-\\\\d{1}:\\\\d{12}:function:[a-zA-Z0-9-_]+(:(\\\\$LATEST|[a-zA-Z0-9-_]+))?$\"\n            }\n        },\n        \"com.amazonaws.lambda#FunctionArnList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.lambda#FunctionArn\"\n            }\n        },\n        \"com.amazonaws.lambda#FunctionCode\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ZipFile\": {\n                    \"target\": \"com.amazonaws.lambda#Blob\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The base64-encoded contents of the deployment package. Amazon Web Services SDK and CLI clients handle the encoding for you.</p>\"\n                    }\n                },\n                \"S3Bucket\": {\n                    \"target\": \"com.amazonaws.lambda#S3Bucket\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An Amazon S3 bucket in the same Amazon Web Services Region as your function. The bucket can be in a different Amazon Web Services account.</p>\"\n                    }\n                },\n                \"S3Key\": {\n                    \"target\": \"com.amazonaws.lambda#S3Key\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon S3 key of the deployment package.</p>\"\n                    }\n                },\n                \"S3ObjectVersion\": {\n                    \"target\": \"com.amazonaws.lambda#S3ObjectVersion\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>For versioned objects, the version of the deployment package object to use.</p>\"\n                    }\n                },\n                \"ImageUri\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>URI of a <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/lambda-images.html\\\">container image</a> in the Amazon ECR registry.</p>\"\n                    }\n                },\n                \"SourceKMSKeyArn\": {\n                    \"target\": \"com.amazonaws.lambda#KMSKeyArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the Key Management Service (KMS) customer managed key that's used to encrypt your function's .zip deployment package. If you don't provide a customer managed key, Lambda uses an <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-owned-cmk\\\">Amazon Web Services owned key</a>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The code for the Lambda function. You can either specify an object in Amazon S3, upload a .zip file archive deployment package directly, or specify the URI of a container image.</p>\"\n            }\n        },\n        \"com.amazonaws.lambda#FunctionCodeLocation\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RepositoryType\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The service that's hosting the file.</p>\"\n                    }\n                },\n                \"Location\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A presigned URL that you can use to download the deployment package.</p>\"\n                    }\n                },\n                \"ImageUri\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>URI of a container image in the Amazon ECR registry.</p>\"\n                    }\n                },\n                \"ResolvedImageUri\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The resolved URI for the image.</p>\"\n                    }\n                },\n                \"SourceKMSKeyArn\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the Key Management Service (KMS) customer managed key that's used to encrypt your function's .zip deployment package. If you don't provide a customer managed key, Lambda uses an <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-owned-cmk\\\">Amazon Web Services owned key</a>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Details about a function's deployment package.</p>\"\n            }\n        },\n        \"com.amazonaws.lambda#FunctionConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"FunctionName\": {\n                    \"target\": \"com.amazonaws.lambda#NamespacedFunctionName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the function.</p>\"\n                    }\n                },\n                \"FunctionArn\": {\n                    \"target\": \"com.amazonaws.lambda#NameSpacedFunctionArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The function's Amazon Resource Name (ARN).</p>\"\n                    }\n                },\n                \"Runtime\": {\n                    \"target\": \"com.amazonaws.lambda#Runtime\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The identifier of the function's <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html\\\"> runtime</a>. Runtime is required if the deployment package is a .zip file archive. Specifying a runtime results in an error if you're deploying a function using a container image.</p> <p>The following list includes deprecated runtimes. Lambda blocks creating new functions and updating existing functions shortly after each runtime is deprecated. For more information, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html#runtime-deprecation-levels\\\">Runtime use after deprecation</a>.</p> <p>For a list of all currently supported runtimes, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html#runtimes-supported\\\">Supported runtimes</a>.</p>\"\n                    }\n                },\n                \"Role\": {\n                    \"target\": \"com.amazonaws.lambda#RoleArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The function's execution role.</p>\"\n                    }\n                },\n                \"Handler\": {\n                    \"target\": \"com.amazonaws.lambda#Handler\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The function that Lambda calls to begin running your function.</p>\"\n                    }\n                },\n                \"CodeSize\": {\n                    \"target\": \"com.amazonaws.lambda#Long\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The size of the function's deployment package, in bytes.</p>\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.lambda#Description\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The function's description.</p>\"\n                    }\n                },\n                \"Timeout\": {\n                    \"target\": \"com.amazonaws.lambda#Timeout\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The amount of time in seconds that Lambda allows a function to run before stopping it.</p>\"\n                    }\n                },\n                \"MemorySize\": {\n                    \"target\": \"com.amazonaws.lambda#MemorySize\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The amount of memory available to the function at runtime.</p>\"\n                    }\n                },\n                \"LastModified\": {\n                    \"target\": \"com.amazonaws.lambda#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time that the function was last updated, in <a href=\\\"https://www.w3.org/TR/NOTE-datetime\\\">ISO-8601 format</a> (YYYY-MM-DDThh:mm:ss.sTZD).</p>\"\n                    }\n                },\n                \"CodeSha256\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The SHA256 hash of the function's deployment package.</p>\"\n                    }\n                },\n                \"Version\": {\n                    \"target\": \"com.amazonaws.lambda#Version\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The version of the Lambda function.</p>\"\n                    }\n                },\n                \"VpcConfig\": {\n                    \"target\": \"com.amazonaws.lambda#VpcConfigResponse\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The function's networking configuration.</p>\"\n                    }\n                },\n                \"DeadLetterConfig\": {\n                    \"target\": \"com.amazonaws.lambda#DeadLetterConfig\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The function's dead letter queue.</p>\"\n                    }\n                },\n                \"Environment\": {\n                    \"target\": \"com.amazonaws.lambda#EnvironmentResponse\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The function's <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/configuration-envvars.html\\\">environment variables</a>. Omitted from CloudTrail logs.</p>\"\n                    }\n                },\n                \"KMSKeyArn\": {\n                    \"target\": \"com.amazonaws.lambda#KMSKeyArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the Key Management Service (KMS) customer managed key that's used to encrypt the following resources:</p> <ul> <li> <p>The function's <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/configuration-envvars.html#configuration-envvars-encryption\\\">environment variables</a>.</p> </li> <li> <p>The function's <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/snapstart-security.html\\\">Lambda SnapStart</a> snapshots.</p> </li> <li> <p>When used with <code>SourceKMSKeyArn</code>, the unzipped version of the .zip deployment package that's used for function invocations. For more information, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/encrypt-zip-package.html#enable-zip-custom-encryption\\\"> Specifying a customer managed key for Lambda</a>.</p> </li> <li> <p>The optimized version of the container image that's used for function invocations. Note that this is not the same key that's used to protect your container image in the Amazon Elastic Container Registry (Amazon ECR). For more information, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/images-create.html#images-lifecycle\\\">Function lifecycle</a>.</p> </li> </ul> <p>If you don't provide a customer managed key, Lambda uses an <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-owned-cmk\\\">Amazon Web Services owned key</a> or an <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk\\\">Amazon Web Services managed key</a>.</p>\"\n                    }\n                },\n                \"TracingConfig\": {\n                    \"target\": \"com.amazonaws.lambda#TracingConfigResponse\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The function's X-Ray tracing configuration.</p>\"\n                    }\n                },\n                \"MasterArn\": {\n                    \"target\": \"com.amazonaws.lambda#FunctionArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>For Lambda@Edge functions, the ARN of the main function.</p>\"\n                    }\n                },\n                \"RevisionId\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The latest updated revision of the function or alias.</p>\"\n                    }\n                },\n                \"Layers\": {\n                    \"target\": \"com.amazonaws.lambda#LayersReferenceList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The function's <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html\\\">layers</a>.</p>\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.lambda#State\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The current state of the function. When the state is <code>Inactive</code>, you can reactivate the function by invoking it.</p>\"\n                    }\n                },\n                \"StateReason\": {\n                    \"target\": \"com.amazonaws.lambda#StateReason\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The reason for the function's current state.</p>\"\n                    }\n                },\n                \"StateReasonCode\": {\n                    \"target\": \"com.amazonaws.lambda#StateReasonCode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The reason code for the function's current state. When the code is <code>Creating</code>, you can't invoke or modify the function.</p>\"\n                    }\n                },\n                \"LastUpdateStatus\": {\n                    \"target\": \"com.amazonaws.lambda#LastUpdateStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The status of the last update that was performed on the function. This is first set to <code>Successful</code> after function creation completes.</p>\"\n                    }\n                },\n                \"LastUpdateStatusReason\": {\n                    \"target\": \"com.amazonaws.lambda#LastUpdateStatusReason\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The reason for the last update that was performed on the function.</p>\"\n                    }\n                },\n                \"LastUpdateStatusReasonCode\": {\n                    \"target\": \"com.amazonaws.lambda#LastUpdateStatusReasonCode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The reason code for the last update that was performed on the function.</p>\"\n                    }\n                },\n                \"FileSystemConfigs\": {\n                    \"target\": \"com.amazonaws.lambda#FileSystemConfigList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Connection settings for an <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/configuration-filesystem.html\\\">Amazon EFS file system</a>.</p>\"\n                    }\n                },\n                \"PackageType\": {\n                    \"target\": \"com.amazonaws.lambda#PackageType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of deployment package. Set to <code>Image</code> for container image and set <code>Zip</code> for .zip file archive.</p>\"\n                    }\n                },\n                \"ImageConfigResponse\": {\n                    \"target\": \"com.amazonaws.lambda#ImageConfigResponse\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The function's image configuration values.</p>\"\n                    }\n                },\n                \"SigningProfileVersionArn\": {\n                    \"target\": \"com.amazonaws.lambda#Arn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the signing profile version.</p>\"\n                    }\n                },\n                \"SigningJobArn\": {\n                    \"target\": \"com.amazonaws.lambda#Arn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the signing job.</p>\"\n                    }\n                },\n                \"Architectures\": {\n                    \"target\": \"com.amazonaws.lambda#ArchitecturesList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The instruction set architecture that the function supports. Architecture is a string array with one of the valid values. The default architecture value is <code>x86_64</code>.</p>\"\n                    }\n                },\n                \"EphemeralStorage\": {\n                    \"target\": \"com.amazonaws.lambda#EphemeralStorage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The size of the function's <code>/tmp</code> directory in MB. The default value is 512, but can be any whole number between 512 and 10,240 MB. For more information, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/configuration-function-common.html#configuration-ephemeral-storage\\\">Configuring ephemeral storage (console)</a>.</p>\"\n                    }\n                },\n                \"SnapStart\": {\n                    \"target\": \"com.amazonaws.lambda#SnapStartResponse\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Set <code>ApplyOn</code> to <code>PublishedVersions</code> to create a snapshot of the initialized execution environment when you publish a function version. For more information, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/snapstart.html\\\">Improving startup performance with Lambda SnapStart</a>.</p>\"\n                    }\n                },\n                \"RuntimeVersionConfig\": {\n                    \"target\": \"com.amazonaws.lambda#RuntimeVersionConfig\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the runtime and any errors that occured.</p>\"\n                    }\n                },\n                \"LoggingConfig\": {\n                    \"target\": \"com.amazonaws.lambda#LoggingConfig\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The function's Amazon CloudWatch Logs configuration settings.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Details about a function's configuration.</p>\"\n            }\n        },\n        \"com.amazonaws.lambda#FunctionEventInvokeConfig\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LastModified\": {\n                    \"target\": \"com.amazonaws.lambda#Date\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time that the configuration was last updated.</p>\"\n                    }\n                },\n                \"FunctionArn\": {\n                    \"target\": \"com.amazonaws.lambda#FunctionArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the function.</p>\"\n                    }\n                },\n                \"MaximumRetryAttempts\": {\n                    \"target\": \"com.amazonaws.lambda#MaximumRetryAttempts\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of times to retry when the function returns an error.</p>\"\n                    }\n                },\n                \"MaximumEventAgeInSeconds\": {\n                    \"target\": \"com.amazonaws.lambda#MaximumEventAgeInSeconds\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum age of a request that Lambda sends to a function for processing.</p>\"\n                    }\n                },\n                \"DestinationConfig\": {\n                    \"target\": \"com.amazonaws.lambda#DestinationConfig\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A destination for events after they have been sent to a function for processing.</p> <p class=\\\"title\\\"> <b>Destinations</b> </p> <ul> <li> <p> <b>Function</b> - The Amazon Resource Name (ARN) of a Lambda function.</p> </li> <li> <p> <b>Queue</b> - The ARN of a standard SQS queue.</p> </li> <li> <p> <b>Bucket</b> - The ARN of an Amazon S3 bucket.</p> </li> <li> <p> <b>Topic</b> - The ARN of a standard SNS topic.</p> </li> <li> <p> <b>Event Bus</b> - The ARN of an Amazon EventBridge event bus.</p> </li> </ul> <note> <p>S3 buckets are supported only for on-failure destinations. To retain records of successful invocations, use another destination type.</p> </note>\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.lambda#FunctionEventInvokeConfigList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.lambda#FunctionEventInvokeConfig\"\n            }\n        },\n        \"com.amazonaws.lambda#FunctionList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.lambda#FunctionConfiguration\"\n            }\n        },\n        \"com.amazonaws.lambda#FunctionName\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 140\n                },\n                \"smithy.api#pattern\": \"^(arn:(aws[a-zA-Z-]*)?:lambda:)?([a-z]{2}(-gov)?-[a-z]+-\\\\d{1}:)?(\\\\d{12}:)?(function:)?([a-zA-Z0-9-_]+)(:(\\\\$LATEST|[a-zA-Z0-9-_]+))?$\"\n            }\n        },\n        \"com.amazonaws.lambda#FunctionResponseType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ReportBatchItemFailures\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ReportBatchItemFailures\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.lambda#FunctionResponseTypeList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.lambda#FunctionResponseType\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 1\n                }\n            }\n        },\n        \"com.amazonaws.lambda#FunctionUrl\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 40,\n                    \"max\": 100\n                }\n            }\n        },\n        \"com.amazonaws.lambda#FunctionUrlAuthType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"NONE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"NONE\"\n                    }\n                },\n                \"AWS_IAM\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AWS_IAM\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.lambda#FunctionUrlConfig\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"FunctionUrl\": {\n                    \"target\": \"com.amazonaws.lambda#FunctionUrl\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The HTTP URL endpoint for your function.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"FunctionArn\": {\n                    \"target\": \"com.amazonaws.lambda#FunctionArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of your function.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"CreationTime\": {\n                    \"target\": \"com.amazonaws.lambda#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>When the function URL was created, in <a href=\\\"https://www.w3.org/TR/NOTE-datetime\\\">ISO-8601 format</a> (YYYY-MM-DDThh:mm:ss.sTZD).</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"LastModifiedTime\": {\n                    \"target\": \"com.amazonaws.lambda#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>When the function URL configuration was last updated, in <a href=\\\"https://www.w3.org/TR/NOTE-datetime\\\">ISO-8601 format</a> (YYYY-MM-DDThh:mm:ss.sTZD).</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Cors\": {\n                    \"target\": \"com.amazonaws.lambda#Cors\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <a href=\\\"https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS\\\">cross-origin resource sharing (CORS)</a> settings for your function URL.</p>\"\n                    }\n                },\n                \"AuthType\": {\n                    \"target\": \"com.amazonaws.lambda#FunctionUrlAuthType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of authentication that your function URL uses. Set to <code>AWS_IAM</code> if you want to restrict access to authenticated users only. Set to <code>NONE</code> if you want to bypass IAM authentication to create a public endpoint. For more information, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/urls-auth.html\\\">Security and auth model for Lambda function URLs</a>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"InvokeMode\": {\n                    \"target\": \"com.amazonaws.lambda#InvokeMode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use one of the following options:</p> <ul> <li> <p> <code>BUFFERED</code> – This is the default option. Lambda invokes your function using the <code>Invoke</code> API operation. Invocation results are available when the payload is complete. The maximum payload size is 6 MB.</p> </li> <li> <p> <code>RESPONSE_STREAM</code> – Your function streams payload results as they become available. Lambda invokes your function using the <code>InvokeWithResponseStream</code> API operation. The maximum response payload size is 200 MB.</p> </li> </ul>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Details about a Lambda function URL.</p>\"\n            }\n        },\n        \"com.amazonaws.lambda#FunctionUrlConfigList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.lambda#FunctionUrlConfig\"\n            }\n        },\n        \"com.amazonaws.lambda#FunctionUrlQualifier\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 128\n                },\n                \"smithy.api#pattern\": \"^(^\\\\$LATEST$)|((?!^[0-9]+$)([a-zA-Z0-9-_]+))$\"\n            }\n        },\n        \"com.amazonaws.lambda#FunctionVersion\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ALL\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ALL\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.lambda#FunctionVersionResource\": {\n            \"type\": \"resource\",\n            \"identifiers\": {\n                \"FunctionName\": {\n                    \"target\": \"com.amazonaws.lambda#FunctionName\"\n                },\n                \"Version\": {\n                    \"target\": \"com.amazonaws.lambda#Version\"\n                }\n            },\n            \"create\": {\n                \"target\": \"com.amazonaws.lambda#PublishVersion\"\n            },\n            \"collectionOperations\": [\n                {\n                    \"target\": \"com.amazonaws.lambda#ListVersionsByFunction\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#arn\": {\n                    \"template\": \"function:{FunctionName}:{Version}\"\n                },\n                \"aws.iam#conditionKeys\": [\n                    \"aws:ResourceTag/${TagKey}\"\n                ],\n                \"aws.iam#iamResource\": {\n                    \"disableConditionKeyInheritance\": true,\n                    \"name\": \"function version\",\n                    \"relativeDocumentation\": \"lambda-api-permissions-ref.html\"\n                },\n                \"smithy.api#documentation\": \"A lambda function version or alias\",\n                \"smithy.api#suppress\": [\n                    \"IamResourceTrait\"\n                ]\n            }\n        },\n        \"com.amazonaws.lambda#GetAccountSettings\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.lambda#GetAccountSettingsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.lambda#GetAccountSettingsResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.lambda#ServiceException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#TooManyRequestsException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.iam#iamAction\": {\n                    \"documentation\": \"Grants permission to view details about an account's limits and usage in an AWS Region\",\n                    \"relativeDocumentation\": \"API_GetAccountSettings.html\"\n                },\n                \"smithy.api#documentation\": \"<p>Retrieves details about your account's <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/limits.html\\\">limits</a> and usage in an Amazon Web Services Region.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To get account settings\",\n                        \"documentation\": \"This operation takes no parameters and returns details about storage and concurrency quotas in the current Region.\",\n                        \"output\": {\n                            \"AccountLimit\": {\n                                \"CodeSizeUnzipped\": 262144000,\n                                \"UnreservedConcurrentExecutions\": 1000,\n                                \"ConcurrentExecutions\": 1000,\n                                \"CodeSizeZipped\": 52428800,\n                                \"TotalCodeSize\": 80530636800\n                            },\n                            \"AccountUsage\": {\n                                \"FunctionCount\": 4,\n                                \"TotalCodeSize\": 9426\n                            }\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/2016-08-19/account-settings\",\n                    \"code\": 200\n                },\n                \"smithy.api#readonly\": {}\n            }\n        },\n        \"com.amazonaws.lambda#GetAccountSettingsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {},\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.lambda#GetAccountSettingsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountLimit\": {\n                    \"target\": \"com.amazonaws.lambda#AccountLimit\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Limits that are related to concurrency and code storage.</p>\"\n                    }\n                },\n                \"AccountUsage\": {\n                    \"target\": \"com.amazonaws.lambda#AccountUsage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of functions and amount of storage in use.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.lambda#GetAlias\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.lambda#GetAliasRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.lambda#AliasConfiguration\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.lambda#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ServiceException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#TooManyRequestsException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.iam#iamAction\": {\n                    \"documentation\": \"Grants permission to view details about an AWS Lambda function alias\",\n                    \"relativeDocumentation\": \"API_GetAlias.html\",\n                    \"resources\": {\n                        \"required\": {\n                            \"function\": {}\n                        }\n                    }\n                },\n                \"smithy.api#documentation\": \"<p>Returns details about a Lambda function <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/configuration-aliases.html\\\">alias</a>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To get a Lambda function alias\",\n                        \"documentation\": \"The following example returns details about an alias named BLUE for a function named my-function\",\n                        \"input\": {\n                            \"FunctionName\": \"my-function\",\n                            \"Name\": \"BLUE\"\n                        },\n                        \"output\": {\n                            \"AliasArn\": \"arn:aws:lambda:us-west-2:123456789012:function:my-function:BLUE\",\n                            \"Name\": \"BLUE\",\n                            \"FunctionVersion\": \"3\",\n                            \"RevisionId\": \"594f41fb-xmpl-4c20-95c7-6ca5f2a92c93\",\n                            \"Description\": \"Production environment BLUE.\"\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/2015-03-31/functions/{FunctionName}/aliases/{Name}\",\n                    \"code\": 200\n                },\n                \"smithy.api#readonly\": {}\n            }\n        },\n        \"com.amazonaws.lambda#GetAliasRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"FunctionName\": {\n                    \"target\": \"com.amazonaws.lambda#FunctionName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name or ARN of the Lambda function.</p> <p class=\\\"title\\\"> <b>Name formats</b> </p> <ul> <li> <p> <b>Function name</b> - <code>MyFunction</code>.</p> </li> <li> <p> <b>Function ARN</b> - <code>arn:aws:lambda:us-west-2:123456789012:function:MyFunction</code>.</p> </li> <li> <p> <b>Partial ARN</b> - <code>123456789012:function:MyFunction</code>.</p> </li> </ul> <p>The length constraint applies only to the full ARN. If you specify only the function name, it is limited to 64 characters in length.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Name\": {\n                    \"target\": \"com.amazonaws.lambda#Alias\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the alias.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {},\n                        \"smithy.api#resourceIdentifier\": \"Alias\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.lambda#GetCodeSigningConfig\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.lambda#GetCodeSigningConfigRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.lambda#GetCodeSigningConfigResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.lambda#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ServiceException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.iam#iamAction\": {\n                    \"documentation\": \"Grants permission to view details about an AWS Lambda code signing config\",\n                    \"relativeDocumentation\": \"API_GetCodeSigningConfig.html\",\n                    \"resources\": {\n                        \"required\": {\n                            \"code signing config\": {}\n                        }\n                    }\n                },\n                \"smithy.api#documentation\": \"<p>Returns information about the specified code signing configuration.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/2020-04-22/code-signing-configs/{CodeSigningConfigArn}\",\n                    \"code\": 200\n                },\n                \"smithy.api#readonly\": {}\n            }\n        },\n        \"com.amazonaws.lambda#GetCodeSigningConfigRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CodeSigningConfigArn\": {\n                    \"target\": \"com.amazonaws.lambda#CodeSigningConfigArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The The Amazon Resource Name (ARN) of the code signing configuration. </p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.lambda#GetCodeSigningConfigResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CodeSigningConfig\": {\n                    \"target\": \"com.amazonaws.lambda#CodeSigningConfig\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The code signing configuration</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.lambda#GetEventSourceMapping\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.lambda#GetEventSourceMappingRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.lambda#EventSourceMappingConfiguration\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.lambda#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ServiceException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#TooManyRequestsException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.iam#conditionKeys\": [\n                    \"lambda:FunctionArn\"\n                ],\n                \"aws.iam#iamAction\": {\n                    \"documentation\": \"Grants permission to view details about an AWS Lambda event source mapping\",\n                    \"relativeDocumentation\": \"API_GetEventSourceMapping.html\",\n                    \"resources\": {\n                        \"required\": {\n                            \"eventSourceMapping\": {}\n                        }\n                    }\n                },\n                \"smithy.api#documentation\": \"<p>Returns details about an event source mapping. You can get the identifier of a mapping from the output of <a>ListEventSourceMappings</a>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To get a Lambda function's event source mapping\",\n                        \"documentation\": \"The following example returns details about an event source mapping. To get a mapping's UUID, use ListEventSourceMappings.\",\n                        \"input\": {\n                            \"UUID\": \"14e0db71-xmpl-4eb5-b481-8945cf9d10c2\"\n                        },\n                        \"output\": {\n                            \"UUID\": \"14e0db71-xmpl-4eb5-b481-8945cf9d10c2\",\n                            \"BatchSize\": 500,\n                            \"EventSourceArn\": \"arn:aws:sqs:us-east-2:123456789012:mySQSqueue\",\n                            \"FunctionArn\": \"arn:aws:lambda:us-east-2:123456789012:function:myFunction\",\n                            \"LastModified\": \"2016-11-21T19:49:20.006Z\",\n                            \"LastProcessingResult\": \"No records processed\",\n                            \"State\": \"Creating\",\n                            \"StateTransitionReason\": \"User action\",\n                            \"DestinationConfig\": {},\n                            \"MaximumRecordAgeInSeconds\": 604800,\n                            \"BisectBatchOnFunctionError\": false,\n                            \"MaximumRetryAttempts\": 10000\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/2015-03-31/event-source-mappings/{UUID}\",\n                    \"code\": 200\n                },\n                \"smithy.api#readonly\": {}\n            }\n        },\n        \"com.amazonaws.lambda#GetEventSourceMappingRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"UUID\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The identifier of the event source mapping.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.lambda#GetFunction\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.lambda#GetFunctionRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.lambda#GetFunctionResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.lambda#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ServiceException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#TooManyRequestsException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.iam#iamAction\": {\n                    \"documentation\": \"Grants permission to view details about an AWS Lambda function\",\n                    \"relativeDocumentation\": \"API_GetFunction.html\",\n                    \"resources\": {\n                        \"required\": {\n                            \"function\": {}\n                        }\n                    }\n                },\n                \"smithy.api#documentation\": \"<p>Returns information about the function or function version, with a link to download the deployment package that's valid for 10 minutes. If you specify a function version, only details that are specific to that version are returned.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To get a Lambda function\",\n                        \"documentation\": \"The following example returns code and configuration details for version 1 of a function named my-function.\",\n                        \"input\": {\n                            \"FunctionName\": \"my-function\",\n                            \"Qualifier\": \"1\"\n                        },\n                        \"output\": {\n                            \"Configuration\": {\n                                \"FunctionName\": \"my-function\",\n                                \"FunctionArn\": \"arn:aws:lambda:us-west-2:123456789012:function:my-function\",\n                                \"Runtime\": \"nodejs12.x\",\n                                \"Role\": \"arn:aws:iam::123456789012:role/lambda-role\",\n                                \"Handler\": \"index.handler\",\n                                \"CodeSize\": 5797206,\n                                \"Description\": \"Process image objects from Amazon S3.\",\n                                \"Timeout\": 15,\n                                \"MemorySize\": 256,\n                                \"LastModified\": \"2020-04-10T19:06:32.563+0000\",\n                                \"CodeSha256\": \"YFgDgEKG3ugvF1+pX64gV6tu9qNuIYNUdgJm8nCxsm4=\",\n                                \"Version\": \"$LATEST\",\n                                \"Environment\": {\n                                    \"Variables\": {\n                                        \"PREFIX\": \"inbound\",\n                                        \"BUCKET\": \"my-bucket-1xpuxmplzrlbh\"\n                                    }\n                                },\n                                \"KMSKeyArn\": \"arn:aws:kms:us-west-2:123456789012:key/b0844d6c-xmpl-4463-97a4-d49f50839966\",\n                                \"TracingConfig\": {\n                                    \"Mode\": \"Active\"\n                                },\n                                \"RevisionId\": \"b75dcd81-xmpl-48a8-a75a-93ba8b5b9727\",\n                                \"State\": \"Active\",\n                                \"LastUpdateStatus\": \"Successful\"\n                            },\n                            \"Code\": {\n                                \"RepositoryType\": \"S3\",\n                                \"Location\": \"https://awslambda-us-west-2-tasks.s3.us-west-2.amazonaws.com/snapshots/123456789012/my-function-e7d9d1ed-xmpl-4f79-904a-4b87f2681f30?versionId=sH3TQwBOaUy...\"\n                            },\n                            \"Tags\": {\n                                \"DEPARTMENT\": \"Assets\"\n                            }\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/2015-03-31/functions/{FunctionName}\",\n                    \"code\": 200\n                },\n                \"smithy.api#readonly\": {},\n                \"smithy.waiters#waitable\": {\n                    \"FunctionActiveV2\": {\n                        \"documentation\": \"Waits for the function's State to be Active. This waiter uses GetFunction API. This should be used after new function creation.\",\n                        \"acceptors\": [\n                            {\n                                \"state\": \"success\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"Configuration.State\",\n                                        \"expected\": \"Active\",\n                                        \"comparator\": \"stringEquals\"\n                                    }\n                                }\n                            },\n                            {\n                                \"state\": \"failure\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"Configuration.State\",\n                                        \"expected\": \"Failed\",\n                                        \"comparator\": \"stringEquals\"\n                                    }\n                                }\n                            },\n                            {\n                                \"state\": \"retry\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"Configuration.State\",\n                                        \"expected\": \"Pending\",\n                                        \"comparator\": \"stringEquals\"\n                                    }\n                                }\n                            }\n                        ],\n                        \"minDelay\": 1,\n                        \"maxDelay\": 300\n                    },\n                    \"FunctionExists\": {\n                        \"acceptors\": [\n                            {\n                                \"state\": \"success\",\n                                \"matcher\": {\n                                    \"success\": true\n                                }\n                            },\n                            {\n                                \"state\": \"retry\",\n                                \"matcher\": {\n                                    \"errorType\": \"ResourceNotFoundException\"\n                                }\n                            }\n                        ],\n                        \"minDelay\": 1,\n                        \"maxDelay\": 20\n                    },\n                    \"FunctionUpdatedV2\": {\n                        \"documentation\": \"Waits for the function's LastUpdateStatus to be Successful. This waiter uses GetFunction API. This should be used after function updates.\",\n                        \"acceptors\": [\n                            {\n                                \"state\": \"success\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"Configuration.LastUpdateStatus\",\n                                        \"expected\": \"Successful\",\n                                        \"comparator\": \"stringEquals\"\n                                    }\n                                }\n                            },\n                            {\n                                \"state\": \"failure\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"Configuration.LastUpdateStatus\",\n                                        \"expected\": \"Failed\",\n                                        \"comparator\": \"stringEquals\"\n                                    }\n                                }\n                            },\n                            {\n                                \"state\": \"retry\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"Configuration.LastUpdateStatus\",\n                                        \"expected\": \"InProgress\",\n                                        \"comparator\": \"stringEquals\"\n                                    }\n                                }\n                            }\n                        ],\n                        \"minDelay\": 1,\n                        \"maxDelay\": 300\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.lambda#GetFunctionCodeSigningConfig\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.lambda#GetFunctionCodeSigningConfigRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.lambda#GetFunctionCodeSigningConfigResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.lambda#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ServiceException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#TooManyRequestsException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.iam#iamAction\": {\n                    \"documentation\": \"Grants permission to view the code signing config arn attached to an AWS Lambda function\",\n                    \"relativeDocumentation\": \"API_GetFunctionCodeSigningConfig.html\",\n                    \"resources\": {\n                        \"required\": {\n                            \"function\": {}\n                        }\n                    }\n                },\n                \"smithy.api#documentation\": \"<p>Returns the code signing configuration for the specified function.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/2020-06-30/functions/{FunctionName}/code-signing-config\",\n                    \"code\": 200\n                },\n                \"smithy.api#readonly\": {}\n            }\n        },\n        \"com.amazonaws.lambda#GetFunctionCodeSigningConfigRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"FunctionName\": {\n                    \"target\": \"com.amazonaws.lambda#FunctionName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name or ARN of the Lambda function.</p> <p class=\\\"title\\\"> <b>Name formats</b> </p> <ul> <li> <p> <b>Function name</b> - <code>MyFunction</code>.</p> </li> <li> <p> <b>Function ARN</b> - <code>arn:aws:lambda:us-west-2:123456789012:function:MyFunction</code>.</p> </li> <li> <p> <b>Partial ARN</b> - <code>123456789012:function:MyFunction</code>.</p> </li> </ul> <p>The length constraint applies only to the full ARN. If you specify only the function name, it is limited to 64 characters in length.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.lambda#GetFunctionCodeSigningConfigResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CodeSigningConfigArn\": {\n                    \"target\": \"com.amazonaws.lambda#CodeSigningConfigArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The The Amazon Resource Name (ARN) of the code signing configuration.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"FunctionName\": {\n                    \"target\": \"com.amazonaws.lambda#FunctionName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name or ARN of the Lambda function.</p> <p class=\\\"title\\\"> <b>Name formats</b> </p> <ul> <li> <p> <b>Function name</b> - <code>MyFunction</code>.</p> </li> <li> <p> <b>Function ARN</b> - <code>arn:aws:lambda:us-west-2:123456789012:function:MyFunction</code>.</p> </li> <li> <p> <b>Partial ARN</b> - <code>123456789012:function:MyFunction</code>.</p> </li> </ul> <p>The length constraint applies only to the full ARN. If you specify only the function name, it is limited to 64 characters in length.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.lambda#GetFunctionConcurrency\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.lambda#GetFunctionConcurrencyRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.lambda#GetFunctionConcurrencyResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.lambda#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ServiceException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#TooManyRequestsException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.iam#iamAction\": {\n                    \"documentation\": \"Grants permission to view details about the reserved concurrency configuration for a function\",\n                    \"relativeDocumentation\": \"API_GetFunctionConcurrency.html\",\n                    \"resources\": {\n                        \"required\": {\n                            \"function\": {}\n                        }\n                    }\n                },\n                \"smithy.api#documentation\": \"<p>Returns details about the reserved concurrency configuration for a function. To set a concurrency limit for a function, use <a>PutFunctionConcurrency</a>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To get the reserved concurrency setting for a function\",\n                        \"documentation\": \"The following example returns the reserved concurrency setting for a function named my-function.\",\n                        \"input\": {\n                            \"FunctionName\": \"my-function\"\n                        },\n                        \"output\": {\n                            \"ReservedConcurrentExecutions\": 250\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/2019-09-30/functions/{FunctionName}/concurrency\",\n                    \"code\": 200\n                },\n                \"smithy.api#readonly\": {}\n            }\n        },\n        \"com.amazonaws.lambda#GetFunctionConcurrencyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"FunctionName\": {\n                    \"target\": \"com.amazonaws.lambda#FunctionName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name or ARN of the Lambda function.</p> <p class=\\\"title\\\"> <b>Name formats</b> </p> <ul> <li> <p> <b>Function name</b> – <code>my-function</code>.</p> </li> <li> <p> <b>Function ARN</b> – <code>arn:aws:lambda:us-west-2:123456789012:function:my-function</code>.</p> </li> <li> <p> <b>Partial ARN</b> – <code>123456789012:function:my-function</code>.</p> </li> </ul> <p>The length constraint applies only to the full ARN. If you specify only the function name, it is limited to 64 characters in length.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.lambda#GetFunctionConcurrencyResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ReservedConcurrentExecutions\": {\n                    \"target\": \"com.amazonaws.lambda#ReservedConcurrentExecutions\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of simultaneous executions that are reserved for the function.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.lambda#GetFunctionConfiguration\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.lambda#GetFunctionConfigurationRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.lambda#FunctionConfiguration\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.lambda#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ServiceException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#TooManyRequestsException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.iam#iamAction\": {\n                    \"documentation\": \"Grants permission to view details about the version-specific settings of an AWS Lambda function or version\",\n                    \"relativeDocumentation\": \"API_GetFunctionConfiguration.html\",\n                    \"resources\": {\n                        \"required\": {\n                            \"function\": {}\n                        }\n                    }\n                },\n                \"smithy.api#documentation\": \"<p>Returns the version-specific settings of a Lambda function or version. The output includes only options that can vary between versions of a function. To modify these settings, use <a>UpdateFunctionConfiguration</a>.</p> <p>To get all of a function's details, including function-level settings, use <a>GetFunction</a>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To get a Lambda function's event source mapping\",\n                        \"documentation\": \"The following example returns and configuration details for version 1 of a function named my-function.\",\n                        \"input\": {\n                            \"FunctionName\": \"my-function\",\n                            \"Qualifier\": \"1\"\n                        },\n                        \"output\": {\n                            \"FunctionName\": \"my-function\",\n                            \"FunctionArn\": \"arn:aws:lambda:us-west-2:123456789012:function:my-function\",\n                            \"Runtime\": \"nodejs12.x\",\n                            \"Role\": \"arn:aws:iam::123456789012:role/lambda-role\",\n                            \"Handler\": \"index.handler\",\n                            \"CodeSize\": 5797206,\n                            \"Description\": \"Process image objects from Amazon S3.\",\n                            \"Timeout\": 15,\n                            \"MemorySize\": 256,\n                            \"LastModified\": \"2020-04-10T19:06:32.563+0000\",\n                            \"CodeSha256\": \"YFgDgEKG3ugvF1+pX64gV6tu9qNuIYNUdgJm8nCxsm4=\",\n                            \"Version\": \"$LATEST\",\n                            \"Environment\": {\n                                \"Variables\": {\n                                    \"PREFIX\": \"inbound\",\n                                    \"BUCKET\": \"my-bucket-1xpuxmplzrlbh\"\n                                }\n                            },\n                            \"KMSKeyArn\": \"arn:aws:kms:us-west-2:123456789012:key/b0844d6c-xmpl-4463-97a4-d49f50839966\",\n                            \"TracingConfig\": {\n                                \"Mode\": \"Active\"\n                            },\n                            \"RevisionId\": \"b75dcd81-xmpl-48a8-a75a-93ba8b5b9727\",\n                            \"State\": \"Active\",\n                            \"LastUpdateStatus\": \"Successful\"\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/2015-03-31/functions/{FunctionName}/configuration\",\n                    \"code\": 200\n                },\n                \"smithy.api#readonly\": {},\n                \"smithy.waiters#waitable\": {\n                    \"FunctionActive\": {\n                        \"documentation\": \"Waits for the function's State to be Active. This waiter uses GetFunctionConfiguration API. This should be used after new function creation.\",\n                        \"acceptors\": [\n                            {\n                                \"state\": \"success\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"State\",\n                                        \"expected\": \"Active\",\n                                        \"comparator\": \"stringEquals\"\n                                    }\n                                }\n                            },\n                            {\n                                \"state\": \"failure\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"State\",\n                                        \"expected\": \"Failed\",\n                                        \"comparator\": \"stringEquals\"\n                                    }\n                                }\n                            },\n                            {\n                                \"state\": \"retry\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"State\",\n                                        \"expected\": \"Pending\",\n                                        \"comparator\": \"stringEquals\"\n                                    }\n                                }\n                            }\n                        ],\n                        \"minDelay\": 5,\n                        \"maxDelay\": 300\n                    },\n                    \"FunctionUpdated\": {\n                        \"documentation\": \"Waits for the function's LastUpdateStatus to be Successful. This waiter uses GetFunctionConfiguration API. This should be used after function updates.\",\n                        \"acceptors\": [\n                            {\n                                \"state\": \"success\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"LastUpdateStatus\",\n                                        \"expected\": \"Successful\",\n                                        \"comparator\": \"stringEquals\"\n                                    }\n                                }\n                            },\n                            {\n                                \"state\": \"failure\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"LastUpdateStatus\",\n                                        \"expected\": \"Failed\",\n                                        \"comparator\": \"stringEquals\"\n                                    }\n                                }\n                            },\n                            {\n                                \"state\": \"retry\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"LastUpdateStatus\",\n                                        \"expected\": \"InProgress\",\n                                        \"comparator\": \"stringEquals\"\n                                    }\n                                }\n                            }\n                        ],\n                        \"minDelay\": 5,\n                        \"maxDelay\": 300\n                    },\n                    \"PublishedVersionActive\": {\n                        \"documentation\": \"Waits for the published version's State to be Active. This waiter uses GetFunctionConfiguration API. This should be used after new version is published.\",\n                        \"acceptors\": [\n                            {\n                                \"state\": \"success\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"State\",\n                                        \"expected\": \"Active\",\n                                        \"comparator\": \"stringEquals\"\n                                    }\n                                }\n                            },\n                            {\n                                \"state\": \"failure\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"State\",\n                                        \"expected\": \"Failed\",\n                                        \"comparator\": \"stringEquals\"\n                                    }\n                                }\n                            },\n                            {\n                                \"state\": \"retry\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"State\",\n                                        \"expected\": \"Pending\",\n                                        \"comparator\": \"stringEquals\"\n                                    }\n                                }\n                            }\n                        ],\n                        \"minDelay\": 5,\n                        \"maxDelay\": 1560\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.lambda#GetFunctionConfigurationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"FunctionName\": {\n                    \"target\": \"com.amazonaws.lambda#NamespacedFunctionName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name or ARN of the Lambda function, version, or alias.</p> <p class=\\\"title\\\"> <b>Name formats</b> </p> <ul> <li> <p> <b>Function name</b> – <code>my-function</code> (name-only), <code>my-function:v1</code> (with alias).</p> </li> <li> <p> <b>Function ARN</b> – <code>arn:aws:lambda:us-west-2:123456789012:function:my-function</code>.</p> </li> <li> <p> <b>Partial ARN</b> – <code>123456789012:function:my-function</code>.</p> </li> </ul> <p>You can append a version number or alias to any of the formats. The length constraint applies only to the full ARN. If you specify only the function name, it is limited to 64 characters in length.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Qualifier\": {\n                    \"target\": \"com.amazonaws.lambda#Qualifier\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify a version or alias to get details about a published version of the function.</p>\",\n                        \"smithy.api#httpQuery\": \"Qualifier\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.lambda#GetFunctionEventInvokeConfig\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.lambda#GetFunctionEventInvokeConfigRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.lambda#FunctionEventInvokeConfig\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.lambda#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ServiceException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#TooManyRequestsException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.iam#iamAction\": {\n                    \"documentation\": \"Grants permission to view the configuration for asynchronous invocation for a function, version, or alias\",\n                    \"relativeDocumentation\": \"API_GetFunctionEventInvokeConfig.html\",\n                    \"resources\": {\n                        \"required\": {\n                            \"function\": {}\n                        }\n                    }\n                },\n                \"smithy.api#documentation\": \"<p>Retrieves the configuration for asynchronous invocation for a function, version, or alias.</p> <p>To configure options for asynchronous invocation, use <a>PutFunctionEventInvokeConfig</a>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To get an asynchronous invocation configuration\",\n                        \"documentation\": \"The following example returns the asynchronous invocation configuration for the BLUE alias of a function named my-function.\",\n                        \"input\": {\n                            \"FunctionName\": \"my-function\",\n                            \"Qualifier\": \"BLUE\"\n                        },\n                        \"output\": {\n                            \"LastModified\": \"2016-11-21T19:49:20.006Z\",\n                            \"FunctionArn\": \"arn:aws:lambda:us-east-2:123456789012:function:my-function:BLUE\",\n                            \"MaximumRetryAttempts\": 0,\n                            \"MaximumEventAgeInSeconds\": 3600,\n                            \"DestinationConfig\": {\n                                \"OnSuccess\": {},\n                                \"OnFailure\": {\n                                    \"Destination\": \"arn:aws:sqs:us-east-2:123456789012:failed-invocations\"\n                                }\n                            }\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/2019-09-25/functions/{FunctionName}/event-invoke-config\",\n                    \"code\": 200\n                },\n                \"smithy.api#readonly\": {}\n            }\n        },\n        \"com.amazonaws.lambda#GetFunctionEventInvokeConfigRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"FunctionName\": {\n                    \"target\": \"com.amazonaws.lambda#FunctionName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name or ARN of the Lambda function, version, or alias.</p> <p class=\\\"title\\\"> <b>Name formats</b> </p> <ul> <li> <p> <b>Function name</b> - <code>my-function</code> (name-only), <code>my-function:v1</code> (with alias).</p> </li> <li> <p> <b>Function ARN</b> - <code>arn:aws:lambda:us-west-2:123456789012:function:my-function</code>.</p> </li> <li> <p> <b>Partial ARN</b> - <code>123456789012:function:my-function</code>.</p> </li> </ul> <p>You can append a version number or alias to any of the formats. The length constraint applies only to the full ARN. If you specify only the function name, it is limited to 64 characters in length.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Qualifier\": {\n                    \"target\": \"com.amazonaws.lambda#Qualifier\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A version number or alias name.</p>\",\n                        \"smithy.api#httpQuery\": \"Qualifier\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.lambda#GetFunctionRecursionConfig\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.lambda#GetFunctionRecursionConfigRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.lambda#GetFunctionRecursionConfigResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.lambda#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ServiceException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#TooManyRequestsException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.iam#iamAction\": {\n                    \"documentation\": \"Grants permission to view the recursion configuration of an AWS Lambda function\",\n                    \"relativeDocumentation\": \"API_GetFunctionRecursionConfig.html\",\n                    \"resources\": {\n                        \"required\": {\n                            \"function\": {}\n                        }\n                    }\n                },\n                \"smithy.api#documentation\": \"<p>Returns your function's <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/invocation-recursion.html\\\">recursive loop detection</a> configuration. </p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/2024-08-31/functions/{FunctionName}/recursion-config\",\n                    \"code\": 200\n                },\n                \"smithy.api#readonly\": {}\n            }\n        },\n        \"com.amazonaws.lambda#GetFunctionRecursionConfigRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"FunctionName\": {\n                    \"target\": \"com.amazonaws.lambda#UnqualifiedFunctionName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p/>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.lambda#GetFunctionRecursionConfigResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RecursiveLoop\": {\n                    \"target\": \"com.amazonaws.lambda#RecursiveLoop\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If your function's recursive loop detection configuration is <code>Allow</code>, Lambda doesn't take any action when it detects your function being invoked as part of a recursive loop.</p> <p>If your function's recursive loop detection configuration is <code>Terminate</code>, Lambda stops your function being invoked and notifies you when it detects your function being invoked as part of a recursive loop.</p> <p>By default, Lambda sets your function's configuration to <code>Terminate</code>. You can update this configuration using the <a>PutFunctionRecursionConfig</a> action.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.lambda#GetFunctionRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"FunctionName\": {\n                    \"target\": \"com.amazonaws.lambda#NamespacedFunctionName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name or ARN of the Lambda function, version, or alias.</p> <p class=\\\"title\\\"> <b>Name formats</b> </p> <ul> <li> <p> <b>Function name</b> – <code>my-function</code> (name-only), <code>my-function:v1</code> (with alias).</p> </li> <li> <p> <b>Function ARN</b> – <code>arn:aws:lambda:us-west-2:123456789012:function:my-function</code>.</p> </li> <li> <p> <b>Partial ARN</b> – <code>123456789012:function:my-function</code>.</p> </li> </ul> <p>You can append a version number or alias to any of the formats. The length constraint applies only to the full ARN. If you specify only the function name, it is limited to 64 characters in length.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Qualifier\": {\n                    \"target\": \"com.amazonaws.lambda#Qualifier\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify a version or alias to get details about a published version of the function.</p>\",\n                        \"smithy.api#httpQuery\": \"Qualifier\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.lambda#GetFunctionResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Configuration\": {\n                    \"target\": \"com.amazonaws.lambda#FunctionConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The configuration of the function or version.</p>\"\n                    }\n                },\n                \"Code\": {\n                    \"target\": \"com.amazonaws.lambda#FunctionCodeLocation\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The deployment package of the function or version.</p>\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.lambda#Tags\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The function's <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/tagging.html\\\">tags</a>. Lambda returns tag data only if you have explicit allow permissions for <a href=\\\"https://docs.aws.amazon.com/lambda/latest/api/API_ListTags.html\\\">lambda:ListTags</a>.</p>\"\n                    }\n                },\n                \"TagsError\": {\n                    \"target\": \"com.amazonaws.lambda#TagsError\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An object that contains details about an error related to retrieving tags.</p>\"\n                    }\n                },\n                \"Concurrency\": {\n                    \"target\": \"com.amazonaws.lambda#Concurrency\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The function's <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/concurrent-executions.html\\\">reserved concurrency</a>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.lambda#GetFunctionUrlConfig\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.lambda#GetFunctionUrlConfigRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.lambda#GetFunctionUrlConfigResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.lambda#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ServiceException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#TooManyRequestsException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.iam#conditionKeys\": [\n                    \"lambda:FunctionArn\",\n                    \"lambda:FunctionUrlAuthType\"\n                ],\n                \"aws.iam#iamAction\": {\n                    \"documentation\": \"Grants permission to read function url configuration for a Lambda function\",\n                    \"relativeDocumentation\": \"API_GetFunctionUrlConfig.html\",\n                    \"resources\": {\n                        \"required\": {\n                            \"function\": {}\n                        }\n                    }\n                },\n                \"smithy.api#documentation\": \"<p>Returns details about a Lambda function URL.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/2021-10-31/functions/{FunctionName}/url\",\n                    \"code\": 200\n                },\n                \"smithy.api#readonly\": {}\n            }\n        },\n        \"com.amazonaws.lambda#GetFunctionUrlConfigRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"FunctionName\": {\n                    \"target\": \"com.amazonaws.lambda#FunctionName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name or ARN of the Lambda function.</p> <p class=\\\"title\\\"> <b>Name formats</b> </p> <ul> <li> <p> <b>Function name</b> – <code>my-function</code>.</p> </li> <li> <p> <b>Function ARN</b> – <code>arn:aws:lambda:us-west-2:123456789012:function:my-function</code>.</p> </li> <li> <p> <b>Partial ARN</b> – <code>123456789012:function:my-function</code>.</p> </li> </ul> <p>The length constraint applies only to the full ARN. If you specify only the function name, it is limited to 64 characters in length.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Qualifier\": {\n                    \"target\": \"com.amazonaws.lambda#FunctionUrlQualifier\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The alias name.</p>\",\n                        \"smithy.api#httpQuery\": \"Qualifier\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.lambda#GetFunctionUrlConfigResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"FunctionUrl\": {\n                    \"target\": \"com.amazonaws.lambda#FunctionUrl\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The HTTP URL endpoint for your function.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"FunctionArn\": {\n                    \"target\": \"com.amazonaws.lambda#FunctionArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of your function.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"AuthType\": {\n                    \"target\": \"com.amazonaws.lambda#FunctionUrlAuthType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of authentication that your function URL uses. Set to <code>AWS_IAM</code> if you want to restrict access to authenticated users only. Set to <code>NONE</code> if you want to bypass IAM authentication to create a public endpoint. For more information, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/urls-auth.html\\\">Security and auth model for Lambda function URLs</a>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Cors\": {\n                    \"target\": \"com.amazonaws.lambda#Cors\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <a href=\\\"https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS\\\">cross-origin resource sharing (CORS)</a> settings for your function URL.</p>\"\n                    }\n                },\n                \"CreationTime\": {\n                    \"target\": \"com.amazonaws.lambda#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>When the function URL was created, in <a href=\\\"https://www.w3.org/TR/NOTE-datetime\\\">ISO-8601 format</a> (YYYY-MM-DDThh:mm:ss.sTZD).</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"LastModifiedTime\": {\n                    \"target\": \"com.amazonaws.lambda#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>When the function URL configuration was last updated, in <a href=\\\"https://www.w3.org/TR/NOTE-datetime\\\">ISO-8601 format</a> (YYYY-MM-DDThh:mm:ss.sTZD).</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"InvokeMode\": {\n                    \"target\": \"com.amazonaws.lambda#InvokeMode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use one of the following options:</p> <ul> <li> <p> <code>BUFFERED</code> – This is the default option. Lambda invokes your function using the <code>Invoke</code> API operation. Invocation results are available when the payload is complete. The maximum payload size is 6 MB.</p> </li> <li> <p> <code>RESPONSE_STREAM</code> – Your function streams payload results as they become available. Lambda invokes your function using the <code>InvokeWithResponseStream</code> API operation. The maximum response payload size is 200 MB.</p> </li> </ul>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.lambda#GetLayerVersion\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.lambda#GetLayerVersionRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.lambda#GetLayerVersionResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.lambda#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ServiceException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#TooManyRequestsException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.iam#iamAction\": {\n                    \"documentation\": \"Grants permission to view details about a version of an AWS Lambda layer. Note this action also supports GetLayerVersionByArn API\",\n                    \"relativeDocumentation\": \"API_GetLayerVersion.html\",\n                    \"resources\": {\n                        \"required\": {\n                            \"layerVersion\": {}\n                        }\n                    }\n                },\n                \"smithy.api#documentation\": \"<p>Returns information about a version of an <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html\\\">Lambda layer</a>, with a link to download the layer archive that's valid for 10 minutes.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To get information about a Lambda layer version\",\n                        \"documentation\": \"The following example returns information for version 1 of a layer named my-layer.\",\n                        \"input\": {\n                            \"LayerName\": \"my-layer\",\n                            \"VersionNumber\": 1\n                        },\n                        \"output\": {\n                            \"Content\": {\n                                \"Location\": \"https://awslambda-us-east-2-layers.s3.us-east-2.amazonaws.com/snapshots/123456789012/my-layer-4aaa2fbb-ff77-4b0a-ad92-5b78a716a96a?versionId=27iWyA73cCAYqyH...\",\n                                \"CodeSha256\": \"tv9jJO+rPbXUUXuRKi7CwHzKtLDkDRJLB3cC3Z/ouXo=\",\n                                \"CodeSize\": 169\n                            },\n                            \"LayerArn\": \"arn:aws:lambda:us-east-2:123456789012:layer:my-layer\",\n                            \"LayerVersionArn\": \"arn:aws:lambda:us-east-2:123456789012:layer:my-layer:1\",\n                            \"Description\": \"My Python layer\",\n                            \"CreatedDate\": \"2018-11-14T23:03:52.894+0000\",\n                            \"Version\": 1,\n                            \"LicenseInfo\": \"MIT\",\n                            \"CompatibleRuntimes\": [\n                                \"python3.6\",\n                                \"python3.7\"\n                            ]\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/2018-10-31/layers/{LayerName}/versions/{VersionNumber}\",\n                    \"code\": 200\n                },\n                \"smithy.api#readonly\": {}\n            }\n        },\n        \"com.amazonaws.lambda#GetLayerVersionByArn\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.lambda#GetLayerVersionByArnRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.lambda#GetLayerVersionResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.lambda#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ServiceException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#TooManyRequestsException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.iam#iamAction\": {\n                    \"name\": \"GetLayerVersion\",\n                    \"documentation\": \"Grants permission to view details about a version of an AWS Lambda layer. Note this action also supports GetLayerVersionByArn API\",\n                    \"relativeDocumentation\": \"API_GetLayerVersion.html\",\n                    \"resources\": {\n                        \"required\": {\n                            \"layerVersion\": {}\n                        }\n                    }\n                },\n                \"smithy.api#documentation\": \"<p>Returns information about a version of an <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html\\\">Lambda layer</a>, with a link to download the layer archive that's valid for 10 minutes.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To get information about a Lambda layer version\",\n                        \"documentation\": \"The following example returns information about the layer version with the specified Amazon Resource Name (ARN).\",\n                        \"input\": {\n                            \"Arn\": \"arn:aws:lambda:ca-central-1:123456789012:layer:blank-python-lib:3\"\n                        },\n                        \"output\": {\n                            \"Content\": {\n                                \"Location\": \"https://awslambda-us-east-2-layers.s3.us-east-2.amazonaws.com/snapshots/123456789012/blank-python-lib-e5212378-xmpl-44ee-8398-9d8ec5113949?versionId=WbZnvf...\",\n                                \"CodeSha256\": \"6x+xmpl/M3BnQUk7gS9sGmfeFsR/npojXoA3fZUv4eU=\",\n                                \"CodeSize\": 9529009\n                            },\n                            \"LayerArn\": \"arn:aws:lambda:us-east-2:123456789012:layer:blank-python-lib\",\n                            \"LayerVersionArn\": \"arn:aws:lambda:us-east-2:123456789012:layer:blank-python-lib:3\",\n                            \"Description\": \"Dependencies for the blank-python sample app.\",\n                            \"CreatedDate\": \"2020-03-31T00:35:18.949+0000\",\n                            \"Version\": 3,\n                            \"CompatibleRuntimes\": [\n                                \"python3.8\"\n                            ]\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/2018-10-31/layers?find=LayerVersion\",\n                    \"code\": 200\n                },\n                \"smithy.api#readonly\": {}\n            }\n        },\n        \"com.amazonaws.lambda#GetLayerVersionByArnRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Arn\": {\n                    \"target\": \"com.amazonaws.lambda#LayerVersionArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the layer version.</p>\",\n                        \"smithy.api#httpQuery\": \"Arn\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.lambda#GetLayerVersionPolicy\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.lambda#GetLayerVersionPolicyRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.lambda#GetLayerVersionPolicyResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.lambda#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ServiceException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#TooManyRequestsException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.iam#iamAction\": {\n                    \"documentation\": \"Grants permission to view the resource-based policy for a version of an AWS Lambda layer\",\n                    \"relativeDocumentation\": \"API_GetLayerVersionPolicy.html\",\n                    \"resources\": {\n                        \"required\": {\n                            \"layerVersion\": {}\n                        }\n                    }\n                },\n                \"smithy.api#documentation\": \"<p>Returns the permission policy for a version of an <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html\\\">Lambda layer</a>. For more information, see <a>AddLayerVersionPermission</a>.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/2018-10-31/layers/{LayerName}/versions/{VersionNumber}/policy\",\n                    \"code\": 200\n                },\n                \"smithy.api#readonly\": {}\n            }\n        },\n        \"com.amazonaws.lambda#GetLayerVersionPolicyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LayerName\": {\n                    \"target\": \"com.amazonaws.lambda#LayerName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name or Amazon Resource Name (ARN) of the layer.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"VersionNumber\": {\n                    \"target\": \"com.amazonaws.lambda#LayerVersionNumber\",\n                    \"traits\": {\n                        \"smithy.api#default\": null,\n                        \"smithy.api#documentation\": \"<p>The version number.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.lambda#GetLayerVersionPolicyResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Policy\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The policy document.</p>\"\n                    }\n                },\n                \"RevisionId\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A unique identifier for the current revision of the policy.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.lambda#GetLayerVersionRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LayerName\": {\n                    \"target\": \"com.amazonaws.lambda#LayerName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name or Amazon Resource Name (ARN) of the layer.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"VersionNumber\": {\n                    \"target\": \"com.amazonaws.lambda#LayerVersionNumber\",\n                    \"traits\": {\n                        \"smithy.api#default\": null,\n                        \"smithy.api#documentation\": \"<p>The version number.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.lambda#GetLayerVersionResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Content\": {\n                    \"target\": \"com.amazonaws.lambda#LayerVersionContentOutput\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Details about the layer version.</p>\"\n                    }\n                },\n                \"LayerArn\": {\n                    \"target\": \"com.amazonaws.lambda#LayerArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the layer.</p>\"\n                    }\n                },\n                \"LayerVersionArn\": {\n                    \"target\": \"com.amazonaws.lambda#LayerVersionArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the layer version.</p>\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.lambda#Description\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The description of the version.</p>\"\n                    }\n                },\n                \"CreatedDate\": {\n                    \"target\": \"com.amazonaws.lambda#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date that the layer version was created, in <a href=\\\"https://www.w3.org/TR/NOTE-datetime\\\">ISO-8601 format</a> (YYYY-MM-DDThh:mm:ss.sTZD).</p>\"\n                    }\n                },\n                \"Version\": {\n                    \"target\": \"com.amazonaws.lambda#LayerVersionNumber\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The version number.</p>\"\n                    }\n                },\n                \"CompatibleRuntimes\": {\n                    \"target\": \"com.amazonaws.lambda#CompatibleRuntimes\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The layer's compatible runtimes.</p> <p>The following list includes deprecated runtimes. For more information, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html#runtime-deprecation-levels\\\">Runtime use after deprecation</a>.</p> <p>For a list of all currently supported runtimes, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html#runtimes-supported\\\">Supported runtimes</a>.</p>\"\n                    }\n                },\n                \"LicenseInfo\": {\n                    \"target\": \"com.amazonaws.lambda#LicenseInfo\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The layer's software license.</p>\"\n                    }\n                },\n                \"CompatibleArchitectures\": {\n                    \"target\": \"com.amazonaws.lambda#CompatibleArchitectures\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of compatible <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/foundation-arch.html\\\">instruction set architectures</a>.</p>\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.lambda#GetPolicy\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.lambda#GetPolicyRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.lambda#GetPolicyResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.lambda#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ServiceException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#TooManyRequestsException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.iam#iamAction\": {\n                    \"documentation\": \"Grants permission to view the resource-based policy for an AWS Lambda function, version, or alias\",\n                    \"relativeDocumentation\": \"API_GetPolicy.html\",\n                    \"resources\": {\n                        \"required\": {\n                            \"function\": {}\n                        }\n                    }\n                },\n                \"smithy.api#documentation\": \"<p>Returns the <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/access-control-resource-based.html\\\">resource-based IAM policy</a> for a function, version, or alias.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To retrieve a Lambda function policy\",\n                        \"documentation\": \"The following example returns the resource-based policy for version 1 of a Lambda function named my-function.\",\n                        \"input\": {\n                            \"FunctionName\": \"my-function\",\n                            \"Qualifier\": \"1\"\n                        },\n                        \"output\": {\n                            \"Policy\": \"{\\\"Version\\\":\\\"2012-10-17\\\",\\\"Id\\\":\\\"default\\\",\\\"Statement\\\":[{\\\"Sid\\\":\\\"xaccount\\\",\\\"Effect\\\":\\\"Allow\\\",\\\"Principal\\\":{\\\"AWS\\\":\\\"arn:aws:iam::123456789012:root\\\"},\\\"Action\\\":\\\"lambda:InvokeFunction\\\",\\\"Resource\\\":\\\"arn:aws:lambda:us-east-2:123456789012:function:my-function:1\\\"}]}\",\n                            \"RevisionId\": \"4843f2f6-7c59-4fda-b484-afd0bc0e22b8\"\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/2015-03-31/functions/{FunctionName}/policy\",\n                    \"code\": 200\n                },\n                \"smithy.api#readonly\": {}\n            }\n        },\n        \"com.amazonaws.lambda#GetPolicyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"FunctionName\": {\n                    \"target\": \"com.amazonaws.lambda#NamespacedFunctionName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name or ARN of the Lambda function, version, or alias.</p> <p class=\\\"title\\\"> <b>Name formats</b> </p> <ul> <li> <p> <b>Function name</b> – <code>my-function</code> (name-only), <code>my-function:v1</code> (with alias).</p> </li> <li> <p> <b>Function ARN</b> – <code>arn:aws:lambda:us-west-2:123456789012:function:my-function</code>.</p> </li> <li> <p> <b>Partial ARN</b> – <code>123456789012:function:my-function</code>.</p> </li> </ul> <p>You can append a version number or alias to any of the formats. The length constraint applies only to the full ARN. If you specify only the function name, it is limited to 64 characters in length.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Qualifier\": {\n                    \"target\": \"com.amazonaws.lambda#Qualifier\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify a version or alias to get the policy for that resource.</p>\",\n                        \"smithy.api#httpQuery\": \"Qualifier\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.lambda#GetPolicyResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Policy\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The resource-based policy.</p>\"\n                    }\n                },\n                \"RevisionId\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A unique identifier for the current revision of the policy.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.lambda#GetProvisionedConcurrencyConfig\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.lambda#GetProvisionedConcurrencyConfigRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.lambda#GetProvisionedConcurrencyConfigResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.lambda#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ProvisionedConcurrencyConfigNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ServiceException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#TooManyRequestsException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.iam#iamAction\": {\n                    \"documentation\": \"Grants permission to view the provisioned concurrency configuration for an AWS Lambda function's alias or version\",\n                    \"relativeDocumentation\": \"API_GetProvisionedConcurrencyConfig.html\",\n                    \"resources\": {\n                        \"optional\": {\n                            \"function version\": {},\n                            \"function alias\": {}\n                        }\n                    }\n                },\n                \"smithy.api#documentation\": \"<p>Retrieves the provisioned concurrency configuration for a function's alias or version.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To get a provisioned concurrency configuration\",\n                        \"documentation\": \"The following example returns details for the provisioned concurrency configuration for the BLUE alias of the specified function.\",\n                        \"input\": {\n                            \"FunctionName\": \"my-function\",\n                            \"Qualifier\": \"BLUE\"\n                        },\n                        \"output\": {\n                            \"RequestedProvisionedConcurrentExecutions\": 100,\n                            \"AvailableProvisionedConcurrentExecutions\": 100,\n                            \"AllocatedProvisionedConcurrentExecutions\": 100,\n                            \"Status\": \"READY\",\n                            \"LastModified\": \"2019-12-31T20:28:49+0000\"\n                        }\n                    },\n                    {\n                        \"title\": \"To view a provisioned concurrency configuration\",\n                        \"documentation\": \"The following example displays details for the provisioned concurrency configuration for the BLUE alias of the specified function.\",\n                        \"input\": {\n                            \"FunctionName\": \"my-function\",\n                            \"Qualifier\": \"BLUE\"\n                        },\n                        \"output\": {\n                            \"RequestedProvisionedConcurrentExecutions\": 100,\n                            \"AvailableProvisionedConcurrentExecutions\": 100,\n                            \"AllocatedProvisionedConcurrentExecutions\": 100,\n                            \"Status\": \"READY\",\n                            \"LastModified\": \"2019-12-31T20:28:49+0000\"\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/2019-09-30/functions/{FunctionName}/provisioned-concurrency\",\n                    \"code\": 200\n                },\n                \"smithy.api#readonly\": {}\n            }\n        },\n        \"com.amazonaws.lambda#GetProvisionedConcurrencyConfigRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"FunctionName\": {\n                    \"target\": \"com.amazonaws.lambda#FunctionName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name or ARN of the Lambda function.</p> <p class=\\\"title\\\"> <b>Name formats</b> </p> <ul> <li> <p> <b>Function name</b> – <code>my-function</code>.</p> </li> <li> <p> <b>Function ARN</b> – <code>arn:aws:lambda:us-west-2:123456789012:function:my-function</code>.</p> </li> <li> <p> <b>Partial ARN</b> – <code>123456789012:function:my-function</code>.</p> </li> </ul> <p>The length constraint applies only to the full ARN. If you specify only the function name, it is limited to 64 characters in length.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Qualifier\": {\n                    \"target\": \"com.amazonaws.lambda#Qualifier\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The version number or alias name.</p>\",\n                        \"smithy.api#httpQuery\": \"Qualifier\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.lambda#GetProvisionedConcurrencyConfigResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RequestedProvisionedConcurrentExecutions\": {\n                    \"target\": \"com.amazonaws.lambda#PositiveInteger\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The amount of provisioned concurrency requested.</p>\"\n                    }\n                },\n                \"AvailableProvisionedConcurrentExecutions\": {\n                    \"target\": \"com.amazonaws.lambda#NonNegativeInteger\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The amount of provisioned concurrency available.</p>\"\n                    }\n                },\n                \"AllocatedProvisionedConcurrentExecutions\": {\n                    \"target\": \"com.amazonaws.lambda#NonNegativeInteger\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The amount of provisioned concurrency allocated. When a weighted alias is used during linear and canary deployments, this value fluctuates depending on the amount of concurrency that is provisioned for the function versions.</p>\"\n                    }\n                },\n                \"Status\": {\n                    \"target\": \"com.amazonaws.lambda#ProvisionedConcurrencyStatusEnum\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The status of the allocation process.</p>\"\n                    }\n                },\n                \"StatusReason\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>For failed allocations, the reason that provisioned concurrency could not be allocated.</p>\"\n                    }\n                },\n                \"LastModified\": {\n                    \"target\": \"com.amazonaws.lambda#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time that a user last updated the configuration, in <a href=\\\"https://www.iso.org/iso-8601-date-and-time-format.html\\\">ISO 8601 format</a>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.lambda#GetRuntimeManagementConfig\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.lambda#GetRuntimeManagementConfigRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.lambda#GetRuntimeManagementConfigResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.lambda#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ServiceException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#TooManyRequestsException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.iam#iamAction\": {\n                    \"documentation\": \"Grants permission to view the runtime management configuration of an AWS Lambda function\",\n                    \"relativeDocumentation\": \"API_GetRuntimeManagementConfig.html\",\n                    \"resources\": {\n                        \"required\": {\n                            \"function\": {}\n                        }\n                    }\n                },\n                \"smithy.api#documentation\": \"<p>Retrieves the runtime management configuration for a function's version. If the runtime update mode is <b>Manual</b>, this includes the ARN of the runtime version and the runtime update mode. If the runtime update mode is <b>Auto</b> or <b>Function update</b>, this includes the runtime update mode and <code>null</code> is returned for the ARN. For more information, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/runtimes-update.html\\\">Runtime updates</a>.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/2021-07-20/functions/{FunctionName}/runtime-management-config\",\n                    \"code\": 200\n                },\n                \"smithy.api#readonly\": {}\n            }\n        },\n        \"com.amazonaws.lambda#GetRuntimeManagementConfigRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"FunctionName\": {\n                    \"target\": \"com.amazonaws.lambda#NamespacedFunctionName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name or ARN of the Lambda function.</p> <p class=\\\"title\\\"> <b>Name formats</b> </p> <ul> <li> <p> <b>Function name</b> – <code>my-function</code>.</p> </li> <li> <p> <b>Function ARN</b> – <code>arn:aws:lambda:us-west-2:123456789012:function:my-function</code>.</p> </li> <li> <p> <b>Partial ARN</b> – <code>123456789012:function:my-function</code>.</p> </li> </ul> <p>The length constraint applies only to the full ARN. If you specify only the function name, it is limited to 64 characters in length.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Qualifier\": {\n                    \"target\": \"com.amazonaws.lambda#Qualifier\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify a version of the function. This can be <code>$LATEST</code> or a published version number. If no value is specified, the configuration for the <code>$LATEST</code> version is returned.</p>\",\n                        \"smithy.api#httpQuery\": \"Qualifier\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.lambda#GetRuntimeManagementConfigResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"UpdateRuntimeOn\": {\n                    \"target\": \"com.amazonaws.lambda#UpdateRuntimeOn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The current runtime update mode of the function.</p>\"\n                    }\n                },\n                \"RuntimeVersionArn\": {\n                    \"target\": \"com.amazonaws.lambda#RuntimeVersionArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the runtime the function is configured to use. If the runtime update mode is <b>Manual</b>, the ARN is returned, otherwise <code>null</code> is returned.</p>\"\n                    }\n                },\n                \"FunctionArn\": {\n                    \"target\": \"com.amazonaws.lambda#NameSpacedFunctionArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of your function.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.lambda#Handler\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 128\n                },\n                \"smithy.api#pattern\": \"^[^\\\\s]+$\"\n            }\n        },\n        \"com.amazonaws.lambda#Header\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 1024\n                },\n                \"smithy.api#pattern\": \".*\"\n            }\n        },\n        \"com.amazonaws.lambda#HeadersList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.lambda#Header\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 100\n                }\n            }\n        },\n        \"com.amazonaws.lambda#HttpStatus\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#default\": 0\n            }\n        },\n        \"com.amazonaws.lambda#ImageConfig\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"EntryPoint\": {\n                    \"target\": \"com.amazonaws.lambda#StringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the entry point to their application, which is typically the location of the runtime executable.</p>\"\n                    }\n                },\n                \"Command\": {\n                    \"target\": \"com.amazonaws.lambda#StringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies parameters that you want to pass in with ENTRYPOINT.</p>\"\n                    }\n                },\n                \"WorkingDirectory\": {\n                    \"target\": \"com.amazonaws.lambda#WorkingDirectory\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the working directory.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Configuration values that override the container image Dockerfile settings. For more information, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/images-create.html#images-parms\\\">Container image settings</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.lambda#ImageConfigError\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ErrorCode\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Error code.</p>\"\n                    }\n                },\n                \"Message\": {\n                    \"target\": \"com.amazonaws.lambda#SensitiveString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Error message.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Error response to <code>GetFunctionConfiguration</code>.</p>\"\n            }\n        },\n        \"com.amazonaws.lambda#ImageConfigResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ImageConfig\": {\n                    \"target\": \"com.amazonaws.lambda#ImageConfig\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Configuration values that override the container image Dockerfile.</p>\"\n                    }\n                },\n                \"Error\": {\n                    \"target\": \"com.amazonaws.lambda#ImageConfigError\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Error response to <code>GetFunctionConfiguration</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Response to a <code>GetFunctionConfiguration</code> request.</p>\"\n            }\n        },\n        \"com.amazonaws.lambda#Integer\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#default\": 0\n            }\n        },\n        \"com.amazonaws.lambda#InvalidCodeSignatureException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Type\": {\n                    \"target\": \"com.amazonaws.lambda#String\"\n                },\n                \"Message\": {\n                    \"target\": \"com.amazonaws.lambda#String\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The code signature failed the integrity check. If the integrity check fails, then Lambda blocks deployment, even if the code signing policy is set to WARN.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.lambda#InvalidParameterValueException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Type\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The exception type.</p>\"\n                    }\n                },\n                \"message\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The exception message.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>One of the parameters in the request is not valid.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.lambda#InvalidRequestContentException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Type\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The exception type.</p>\"\n                    }\n                },\n                \"message\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The exception message.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The request body could not be parsed as JSON, or a request header is invalid. For example, the 'x-amzn-RequestId' header is not a valid UUID string.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.lambda#InvalidRuntimeException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Type\": {\n                    \"target\": \"com.amazonaws.lambda#String\"\n                },\n                \"Message\": {\n                    \"target\": \"com.amazonaws.lambda#String\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The runtime or runtime version specified is not supported.</p>\",\n                \"smithy.api#error\": \"server\",\n                \"smithy.api#httpError\": 502\n            }\n        },\n        \"com.amazonaws.lambda#InvalidSecurityGroupIDException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Type\": {\n                    \"target\": \"com.amazonaws.lambda#String\"\n                },\n                \"Message\": {\n                    \"target\": \"com.amazonaws.lambda#String\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The security group ID provided in the Lambda function VPC configuration is not valid.</p>\",\n                \"smithy.api#error\": \"server\",\n                \"smithy.api#httpError\": 502\n            }\n        },\n        \"com.amazonaws.lambda#InvalidSubnetIDException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Type\": {\n                    \"target\": \"com.amazonaws.lambda#String\"\n                },\n                \"Message\": {\n                    \"target\": \"com.amazonaws.lambda#String\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The subnet ID provided in the Lambda function VPC configuration is not valid.</p>\",\n                \"smithy.api#error\": \"server\",\n                \"smithy.api#httpError\": 502\n            }\n        },\n        \"com.amazonaws.lambda#InvalidZipFileException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Type\": {\n                    \"target\": \"com.amazonaws.lambda#String\"\n                },\n                \"Message\": {\n                    \"target\": \"com.amazonaws.lambda#String\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Lambda could not unzip the deployment package.</p>\",\n                \"smithy.api#error\": \"server\",\n                \"smithy.api#httpError\": 502\n            }\n        },\n        \"com.amazonaws.lambda#InvocationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"FunctionName\": {\n                    \"target\": \"com.amazonaws.lambda#NamespacedFunctionName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name or ARN of the Lambda function, version, or alias.</p> <p class=\\\"title\\\"> <b>Name formats</b> </p> <ul> <li> <p> <b>Function name</b> – <code>my-function</code> (name-only), <code>my-function:v1</code> (with alias).</p> </li> <li> <p> <b>Function ARN</b> – <code>arn:aws:lambda:us-west-2:123456789012:function:my-function</code>.</p> </li> <li> <p> <b>Partial ARN</b> – <code>123456789012:function:my-function</code>.</p> </li> </ul> <p>You can append a version number or alias to any of the formats. The length constraint applies only to the full ARN. If you specify only the function name, it is limited to 64 characters in length.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"InvocationType\": {\n                    \"target\": \"com.amazonaws.lambda#InvocationType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Choose from the following options.</p> <ul> <li> <p> <code>RequestResponse</code> (default) – Invoke the function synchronously. Keep the connection open until the function returns a response or times out. The API response includes the function response and additional data.</p> </li> <li> <p> <code>Event</code> – Invoke the function asynchronously. Send events that fail multiple times to the function's dead-letter queue (if one is configured). The API response only includes a status code.</p> </li> <li> <p> <code>DryRun</code> – Validate parameter values and verify that the user or role has permission to invoke the function.</p> </li> </ul>\",\n                        \"smithy.api#httpHeader\": \"X-Amz-Invocation-Type\"\n                    }\n                },\n                \"LogType\": {\n                    \"target\": \"com.amazonaws.lambda#LogType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Set to <code>Tail</code> to include the execution log in the response. Applies to synchronously invoked functions only.</p>\",\n                        \"smithy.api#httpHeader\": \"X-Amz-Log-Type\"\n                    }\n                },\n                \"ClientContext\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Up to 3,583 bytes of base64-encoded data about the invoking client to pass to the function in the context object. Lambda passes the <code>ClientContext</code> object to your function for synchronous invocations only.</p>\",\n                        \"smithy.api#httpHeader\": \"X-Amz-Client-Context\"\n                    }\n                },\n                \"Payload\": {\n                    \"target\": \"com.amazonaws.lambda#Blob\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The JSON that you want to provide to your Lambda function as input.</p> <p>You can enter the JSON directly. For example, <code>--payload '{ \\\"key\\\": \\\"value\\\" }'</code>. You can also specify a file path. For example, <code>--payload file://payload.json</code>.</p>\",\n                        \"smithy.api#httpPayload\": {}\n                    }\n                },\n                \"Qualifier\": {\n                    \"target\": \"com.amazonaws.lambda#Qualifier\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify a version or alias to invoke a published version of the function.</p>\",\n                        \"smithy.api#httpQuery\": \"Qualifier\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.lambda#InvocationResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"StatusCode\": {\n                    \"target\": \"com.amazonaws.lambda#Integer\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The HTTP status code is in the 200 range for a successful request. For the <code>RequestResponse</code> invocation type, this status code is 200. For the <code>Event</code> invocation type, this status code is 202. For the <code>DryRun</code> invocation type, the status code is 204.</p>\",\n                        \"smithy.api#httpResponseCode\": {}\n                    }\n                },\n                \"FunctionError\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If present, indicates that an error occurred during function execution. Details about the error are included in the response payload.</p>\",\n                        \"smithy.api#httpHeader\": \"X-Amz-Function-Error\"\n                    }\n                },\n                \"LogResult\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The last 4 KB of the execution log, which is base64-encoded.</p>\",\n                        \"smithy.api#httpHeader\": \"X-Amz-Log-Result\"\n                    }\n                },\n                \"Payload\": {\n                    \"target\": \"com.amazonaws.lambda#Blob\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The response from the function, or an error object.</p>\",\n                        \"smithy.api#httpPayload\": {}\n                    }\n                },\n                \"ExecutedVersion\": {\n                    \"target\": \"com.amazonaws.lambda#Version\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The version of the function that executed. When you invoke a function with an alias, this indicates which version the alias resolved to.</p>\",\n                        \"smithy.api#httpHeader\": \"X-Amz-Executed-Version\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.lambda#InvocationType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"Event\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Event\"\n                    }\n                },\n                \"RequestResponse\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"RequestResponse\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DryRun\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.lambda#Invoke\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.lambda#InvocationRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.lambda#InvocationResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.lambda#EC2AccessDeniedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#EC2ThrottledException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#EC2UnexpectedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#EFSIOException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#EFSMountConnectivityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#EFSMountFailureException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#EFSMountTimeoutException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ENILimitReachedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#InvalidRequestContentException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#InvalidRuntimeException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#InvalidSecurityGroupIDException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#InvalidSubnetIDException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#InvalidZipFileException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#KMSAccessDeniedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#KMSDisabledException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#KMSInvalidStateException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#KMSNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#RecursiveInvocationException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#RequestTooLargeException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceConflictException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceNotReadyException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ServiceException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#SnapStartException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#SnapStartNotReadyException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#SnapStartTimeoutException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#SubnetIPAddressLimitReachedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#TooManyRequestsException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#UnsupportedMediaTypeException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.iam#conditionKeys\": [\n                    \"lambda:EventSourceToken\"\n                ],\n                \"aws.iam#iamAction\": {\n                    \"name\": \"InvokeFunction\",\n                    \"documentation\": \"Grants permission to invoke an AWS Lambda function\",\n                    \"relativeDocumentation\": \"API_Invoke.html\",\n                    \"resources\": {\n                        \"required\": {\n                            \"function\": {}\n                        }\n                    }\n                },\n                \"smithy.api#documentation\": \"<p>Invokes a Lambda function. You can invoke a function synchronously (and wait for the response), or asynchronously. By default, Lambda invokes your function synchronously (i.e. the<code>InvocationType</code> is <code>RequestResponse</code>). To invoke a function asynchronously, set <code>InvocationType</code> to <code>Event</code>. Lambda passes the <code>ClientContext</code> object to your function for synchronous invocations only.</p> <p>For <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/invocation-sync.html\\\">synchronous invocation</a>, details about the function response, including errors, are included in the response body and headers. For either invocation type, you can find more information in the <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/monitoring-functions.html\\\">execution log</a> and <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/lambda-x-ray.html\\\">trace</a>.</p> <p>When an error occurs, your function may be invoked multiple times. Retry behavior varies by error type, client, event source, and invocation type. For example, if you invoke a function asynchronously and it returns an error, Lambda executes the function up to two more times. For more information, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/invocation-retries.html\\\">Error handling and automatic retries in Lambda</a>.</p> <p>For <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/invocation-async.html\\\">asynchronous invocation</a>, Lambda adds events to a queue before sending them to your function. If your function does not have enough capacity to keep up with the queue, events may be lost. Occasionally, your function may receive the same event multiple times, even if no error occurs. To retain events that were not processed, configure your function with a <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/invocation-async.html#invocation-dlq\\\">dead-letter queue</a>.</p> <p>The status code in the API response doesn't reflect function errors. Error codes are reserved for errors that prevent your function from executing, such as permissions errors, <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html\\\">quota</a> errors, or issues with your function's code and configuration. For example, Lambda returns <code>TooManyRequestsException</code> if running the function would cause you to exceed a concurrency limit at either the account level (<code>ConcurrentInvocationLimitExceeded</code>) or function level (<code>ReservedFunctionConcurrentInvocationLimitExceeded</code>).</p> <p>For functions with a long timeout, your client might disconnect during synchronous invocation while it waits for a response. Configure your HTTP client, SDK, firewall, proxy, or operating system to allow for long connections with timeout or keep-alive settings.</p> <p>This operation requires permission for the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/list_awslambda.html\\\">lambda:InvokeFunction</a> action. For details on how to set up permissions for cross-account invocations, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/access-control-resource-based.html#permissions-resource-xaccountinvoke\\\">Granting function access to other accounts</a>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To invoke a Lambda function\",\n                        \"documentation\": \"The following example invokes version 1 of a function named my-function with an empty event payload.\",\n                        \"input\": {\n                            \"FunctionName\": \"my-function\",\n                            \"Payload\": \"{}\",\n                            \"Qualifier\": \"1\"\n                        },\n                        \"output\": {\n                            \"StatusCode\": 200,\n                            \"Payload\": \"200 SUCCESS\"\n                        }\n                    },\n                    {\n                        \"title\": \"To invoke a Lambda function asynchronously\",\n                        \"documentation\": \"The following example invokes version 1 of a function named my-function asynchronously.\",\n                        \"input\": {\n                            \"FunctionName\": \"my-function\",\n                            \"Payload\": \"{}\",\n                            \"InvocationType\": \"Event\",\n                            \"Qualifier\": \"1\"\n                        },\n                        \"output\": {\n                            \"StatusCode\": 202,\n                            \"Payload\": \"\"\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"POST\",\n                    \"uri\": \"/2015-03-31/functions/{FunctionName}/invocations\",\n                    \"code\": 200\n                },\n                \"smithy.test#smokeTests\": [\n                    {\n                        \"id\": \"ErrorInvalidFunctionName\",\n                        \"params\": {\n                            \"FunctionName\": \"bogus-function\"\n                        },\n                        \"expect\": {\n                            \"failure\": {\n                                \"errorId\": \"com.amazonaws.lambda#ResourceNotFoundException\"\n                            }\n                        },\n                        \"vendorParams\": {},\n                        \"vendorParamsShape\": \"aws.test#AwsVendorParams\"\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.lambda#InvokeAsync\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.lambda#InvokeAsyncRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.lambda#InvokeAsyncResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.lambda#InvalidRequestContentException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#InvalidRuntimeException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceConflictException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ServiceException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.iam#iamAction\": {\n                    \"documentation\": \"Grants permission to invoke a function asynchronously (Deprecated)\",\n                    \"relativeDocumentation\": \"API_InvokeAsync.html\",\n                    \"resources\": {\n                        \"required\": {\n                            \"function\": {}\n                        }\n                    }\n                },\n                \"smithy.api#deprecated\": {},\n                \"smithy.api#documentation\": \"<important> <p>For asynchronous function invocation, use <a>Invoke</a>.</p> </important> <p>Invokes a function asynchronously.</p> <note> <p>If you do use the InvokeAsync action, note that it doesn't support the use of X-Ray active tracing. Trace ID is not propagated to the function, even if X-Ray active tracing is turned on.</p> </note>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To invoke a Lambda function asynchronously\",\n                        \"documentation\": \"The following example invokes a Lambda function asynchronously\",\n                        \"input\": {\n                            \"FunctionName\": \"my-function\",\n                            \"InvokeArgs\": \"{}\"\n                        },\n                        \"output\": {\n                            \"Status\": 202\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"POST\",\n                    \"uri\": \"/2014-11-13/functions/{FunctionName}/invoke-async\",\n                    \"code\": 202\n                },\n                \"smithy.api#suppress\": [\n                    \"DeprecatedShape\"\n                ]\n            }\n        },\n        \"com.amazonaws.lambda#InvokeAsyncRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"FunctionName\": {\n                    \"target\": \"com.amazonaws.lambda#NamespacedFunctionName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name or ARN of the Lambda function.</p> <p class=\\\"title\\\"> <b>Name formats</b> </p> <ul> <li> <p> <b>Function name</b> – <code>my-function</code>.</p> </li> <li> <p> <b>Function ARN</b> – <code>arn:aws:lambda:us-west-2:123456789012:function:my-function</code>.</p> </li> <li> <p> <b>Partial ARN</b> – <code>123456789012:function:my-function</code>.</p> </li> </ul> <p>The length constraint applies only to the full ARN. If you specify only the function name, it is limited to 64 characters in length.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"InvokeArgs\": {\n                    \"target\": \"com.amazonaws.lambda#BlobStream\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The JSON that you want to provide to your Lambda function as input.</p>\",\n                        \"smithy.api#httpPayload\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#deprecated\": {},\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.lambda#InvokeAsyncResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Status\": {\n                    \"target\": \"com.amazonaws.lambda#HttpStatus\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The status code.</p>\",\n                        \"smithy.api#httpResponseCode\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#deprecated\": {},\n                \"smithy.api#documentation\": \"<p>A success response (<code>202 Accepted</code>) indicates that the request is queued for invocation.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.lambda#InvokeMode\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"BUFFERED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"BUFFERED\"\n                    }\n                },\n                \"RESPONSE_STREAM\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"RESPONSE_STREAM\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.lambda#InvokeResponseStreamUpdate\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Payload\": {\n                    \"target\": \"com.amazonaws.lambda#Blob\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Data returned by your Lambda function.</p>\",\n                        \"smithy.api#eventPayload\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A chunk of the streamed response payload.</p>\"\n            }\n        },\n        \"com.amazonaws.lambda#InvokeWithResponseStream\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.lambda#InvokeWithResponseStreamRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.lambda#InvokeWithResponseStreamResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.lambda#EC2AccessDeniedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#EC2ThrottledException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#EC2UnexpectedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#EFSIOException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#EFSMountConnectivityException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#EFSMountFailureException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#EFSMountTimeoutException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ENILimitReachedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#InvalidRequestContentException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#InvalidRuntimeException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#InvalidSecurityGroupIDException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#InvalidSubnetIDException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#InvalidZipFileException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#KMSAccessDeniedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#KMSDisabledException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#KMSInvalidStateException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#KMSNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#RecursiveInvocationException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#RequestTooLargeException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceConflictException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceNotReadyException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ServiceException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#SnapStartException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#SnapStartNotReadyException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#SnapStartTimeoutException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#SubnetIPAddressLimitReachedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#TooManyRequestsException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#UnsupportedMediaTypeException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.iam#conditionKeys\": [\n                    \"lambda:EventSourceToken\"\n                ],\n                \"aws.iam#iamAction\": {\n                    \"name\": \"InvokeFunction\",\n                    \"documentation\": \"Grants permission to invoke an AWS Lambda function\",\n                    \"relativeDocumentation\": \"API_Invoke.html\",\n                    \"resources\": {\n                        \"required\": {\n                            \"function\": {}\n                        }\n                    }\n                },\n                \"smithy.api#documentation\": \"<p>Configure your Lambda functions to stream response payloads back to clients. For more information, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/configuration-response-streaming.html\\\">Configuring a Lambda function to stream responses</a>.</p> <p>This operation requires permission for the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/list_awslambda.html\\\">lambda:InvokeFunction</a> action. For details on how to set up permissions for cross-account invocations, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/access-control-resource-based.html#permissions-resource-xaccountinvoke\\\">Granting function access to other accounts</a>.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"POST\",\n                    \"uri\": \"/2021-11-15/functions/{FunctionName}/response-streaming-invocations\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.lambda#InvokeWithResponseStreamCompleteEvent\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ErrorCode\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An error code.</p>\"\n                    }\n                },\n                \"ErrorDetails\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The details of any returned error.</p>\"\n                    }\n                },\n                \"LogResult\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The last 4 KB of the execution log, which is base64-encoded.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A response confirming that the event stream is complete.</p>\"\n            }\n        },\n        \"com.amazonaws.lambda#InvokeWithResponseStreamRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"FunctionName\": {\n                    \"target\": \"com.amazonaws.lambda#NamespacedFunctionName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name or ARN of the Lambda function.</p> <p class=\\\"title\\\"> <b>Name formats</b> </p> <ul> <li> <p> <b>Function name</b> – <code>my-function</code>.</p> </li> <li> <p> <b>Function ARN</b> – <code>arn:aws:lambda:us-west-2:123456789012:function:my-function</code>.</p> </li> <li> <p> <b>Partial ARN</b> – <code>123456789012:function:my-function</code>.</p> </li> </ul> <p>The length constraint applies only to the full ARN. If you specify only the function name, it is limited to 64 characters in length.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"InvocationType\": {\n                    \"target\": \"com.amazonaws.lambda#ResponseStreamingInvocationType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use one of the following options:</p> <ul> <li> <p> <code>RequestResponse</code> (default) – Invoke the function synchronously. Keep the connection open until the function returns a response or times out. The API operation response includes the function response and additional data.</p> </li> <li> <p> <code>DryRun</code> – Validate parameter values and verify that the IAM user or role has permission to invoke the function.</p> </li> </ul>\",\n                        \"smithy.api#httpHeader\": \"X-Amz-Invocation-Type\"\n                    }\n                },\n                \"LogType\": {\n                    \"target\": \"com.amazonaws.lambda#LogType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Set to <code>Tail</code> to include the execution log in the response. Applies to synchronously invoked functions only.</p>\",\n                        \"smithy.api#httpHeader\": \"X-Amz-Log-Type\"\n                    }\n                },\n                \"ClientContext\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Up to 3,583 bytes of base64-encoded data about the invoking client to pass to the function in the context object.</p>\",\n                        \"smithy.api#httpHeader\": \"X-Amz-Client-Context\"\n                    }\n                },\n                \"Qualifier\": {\n                    \"target\": \"com.amazonaws.lambda#Qualifier\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The alias name.</p>\",\n                        \"smithy.api#httpQuery\": \"Qualifier\"\n                    }\n                },\n                \"Payload\": {\n                    \"target\": \"com.amazonaws.lambda#Blob\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The JSON that you want to provide to your Lambda function as input.</p> <p>You can enter the JSON directly. For example, <code>--payload '{ \\\"key\\\": \\\"value\\\" }'</code>. You can also specify a file path. For example, <code>--payload file://payload.json</code>.</p>\",\n                        \"smithy.api#httpPayload\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.lambda#InvokeWithResponseStreamResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"StatusCode\": {\n                    \"target\": \"com.amazonaws.lambda#Integer\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>For a successful request, the HTTP status code is in the 200 range. For the <code>RequestResponse</code> invocation type, this status code is 200. For the <code>DryRun</code> invocation type, this status code is 204.</p>\",\n                        \"smithy.api#httpResponseCode\": {}\n                    }\n                },\n                \"ExecutedVersion\": {\n                    \"target\": \"com.amazonaws.lambda#Version\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The version of the function that executed. When you invoke a function with an alias, this indicates which version the alias resolved to.</p>\",\n                        \"smithy.api#httpHeader\": \"X-Amz-Executed-Version\"\n                    }\n                },\n                \"EventStream\": {\n                    \"target\": \"com.amazonaws.lambda#InvokeWithResponseStreamResponseEvent\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The stream of response payloads.</p>\",\n                        \"smithy.api#httpPayload\": {}\n                    }\n                },\n                \"ResponseStreamContentType\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of data the stream is returning.</p>\",\n                        \"smithy.api#httpHeader\": \"Content-Type\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.lambda#InvokeWithResponseStreamResponseEvent\": {\n            \"type\": \"union\",\n            \"members\": {\n                \"PayloadChunk\": {\n                    \"target\": \"com.amazonaws.lambda#InvokeResponseStreamUpdate\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A chunk of the streamed response payload.</p>\"\n                    }\n                },\n                \"InvokeComplete\": {\n                    \"target\": \"com.amazonaws.lambda#InvokeWithResponseStreamCompleteEvent\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An object that's returned when the stream has ended and all the payload chunks have been returned.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>An object that includes a chunk of the response payload. When the stream has ended, Lambda includes a <code>InvokeComplete</code> object.</p>\",\n                \"smithy.api#streaming\": {}\n            }\n        },\n        \"com.amazonaws.lambda#KMSAccessDeniedException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Type\": {\n                    \"target\": \"com.amazonaws.lambda#String\"\n                },\n                \"Message\": {\n                    \"target\": \"com.amazonaws.lambda#String\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Lambda couldn't decrypt the environment variables because KMS access was denied. Check the Lambda function's KMS permissions.</p>\",\n                \"smithy.api#error\": \"server\",\n                \"smithy.api#httpError\": 502\n            }\n        },\n        \"com.amazonaws.lambda#KMSDisabledException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Type\": {\n                    \"target\": \"com.amazonaws.lambda#String\"\n                },\n                \"Message\": {\n                    \"target\": \"com.amazonaws.lambda#String\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Lambda couldn't decrypt the environment variables because the KMS key used is disabled. Check the Lambda function's KMS key settings.</p>\",\n                \"smithy.api#error\": \"server\",\n                \"smithy.api#httpError\": 502\n            }\n        },\n        \"com.amazonaws.lambda#KMSInvalidStateException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Type\": {\n                    \"target\": \"com.amazonaws.lambda#String\"\n                },\n                \"Message\": {\n                    \"target\": \"com.amazonaws.lambda#String\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Lambda couldn't decrypt the environment variables because the state of the KMS key used is not valid for Decrypt. Check the function's KMS key settings.</p>\",\n                \"smithy.api#error\": \"server\",\n                \"smithy.api#httpError\": 502\n            }\n        },\n        \"com.amazonaws.lambda#KMSKeyArn\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#pattern\": \"^(arn:(aws[a-zA-Z-]*)?:[a-z0-9-.]+:.*)|()$\"\n            }\n        },\n        \"com.amazonaws.lambda#KMSNotFoundException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Type\": {\n                    \"target\": \"com.amazonaws.lambda#String\"\n                },\n                \"Message\": {\n                    \"target\": \"com.amazonaws.lambda#String\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Lambda couldn't decrypt the environment variables because the KMS key was not found. Check the function's KMS key settings.</p>\",\n                \"smithy.api#error\": \"server\",\n                \"smithy.api#httpError\": 502\n            }\n        },\n        \"com.amazonaws.lambda#KafkaSchemaRegistryAccessConfig\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Type\": {\n                    \"target\": \"com.amazonaws.lambda#KafkaSchemaRegistryAuthType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The type of authentication Lambda uses to access your schema registry. </p>\"\n                    }\n                },\n                \"URI\": {\n                    \"target\": \"com.amazonaws.lambda#Arn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The URI of the secret (Secrets Manager secret ARN) to authenticate with your schema registry. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Specific access configuration settings that tell Lambda how to authenticate with your schema registry.</p> <p>If you're working with an Glue schema registry, don't provide authentication details in this object. Instead, ensure that your execution role has the required permissions for Lambda to access your cluster.</p> <p>If you're working with a Confluent schema registry, choose the authentication method in the <code>Type</code> field, and provide the Secrets Manager secret ARN in the <code>URI</code> field.</p>\"\n            }\n        },\n        \"com.amazonaws.lambda#KafkaSchemaRegistryAccessConfigList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.lambda#KafkaSchemaRegistryAccessConfig\"\n            }\n        },\n        \"com.amazonaws.lambda#KafkaSchemaRegistryAuthType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"BASIC_AUTH\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"BASIC_AUTH\"\n                    }\n                },\n                \"CLIENT_CERTIFICATE_TLS_AUTH\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"CLIENT_CERTIFICATE_TLS_AUTH\"\n                    }\n                },\n                \"SERVER_ROOT_CA_CERTIFICATE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"SERVER_ROOT_CA_CERTIFICATE\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.lambda#KafkaSchemaRegistryConfig\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SchemaRegistryURI\": {\n                    \"target\": \"com.amazonaws.lambda#SchemaRegistryUri\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The URI for your schema registry. The correct URI format depends on the type of schema registry you're using.</p> <ul> <li> <p>For Glue schema registries, use the ARN of the registry.</p> </li> <li> <p>For Confluent schema registries, use the URL of the registry.</p> </li> </ul>\"\n                    }\n                },\n                \"EventRecordFormat\": {\n                    \"target\": \"com.amazonaws.lambda#SchemaRegistryEventRecordFormat\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The record format that Lambda delivers to your function after schema validation.</p> <ul> <li> <p>Choose <code>JSON</code> to have Lambda deliver the record to your function as a standard JSON object.</p> </li> <li> <p>Choose <code>SOURCE</code> to have Lambda deliver the record to your function in its original source format. Lambda removes all schema metadata, such as the schema ID, before sending the record to your function.</p> </li> </ul>\"\n                    }\n                },\n                \"AccessConfigs\": {\n                    \"target\": \"com.amazonaws.lambda#KafkaSchemaRegistryAccessConfigList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An array of access configuration objects that tell Lambda how to authenticate with your schema registry.</p>\"\n                    }\n                },\n                \"SchemaValidationConfigs\": {\n                    \"target\": \"com.amazonaws.lambda#KafkaSchemaValidationConfigList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An array of schema validation configuration objects, which tell Lambda the message attributes you want to validate and filter using your schema registry.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Specific configuration settings for a Kafka schema registry.</p>\"\n            }\n        },\n        \"com.amazonaws.lambda#KafkaSchemaValidationAttribute\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"KEY\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"KEY\"\n                    }\n                },\n                \"VALUE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"VALUE\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.lambda#KafkaSchemaValidationConfig\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Attribute\": {\n                    \"target\": \"com.amazonaws.lambda#KafkaSchemaValidationAttribute\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The attributes you want your schema registry to validate and filter for. If you selected <code>JSON</code> as the <code>EventRecordFormat</code>, Lambda also deserializes the selected message attributes. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Specific schema validation configuration settings that tell Lambda the message attributes you want to validate and filter using your schema registry.</p>\"\n            }\n        },\n        \"com.amazonaws.lambda#KafkaSchemaValidationConfigList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.lambda#KafkaSchemaValidationConfig\"\n            }\n        },\n        \"com.amazonaws.lambda#LastUpdateStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"Successful\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Successful\"\n                    }\n                },\n                \"Failed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Failed\"\n                    }\n                },\n                \"InProgress\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"InProgress\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.lambda#LastUpdateStatusReason\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.lambda#LastUpdateStatusReasonCode\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"EniLimitExceeded\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"EniLimitExceeded\"\n                    }\n                },\n                \"InsufficientRolePermissions\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"InsufficientRolePermissions\"\n                    }\n                },\n                \"InvalidConfiguration\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"InvalidConfiguration\"\n                    }\n                },\n                \"InternalError\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"InternalError\"\n                    }\n                },\n                \"SubnetOutOfIPAddresses\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"SubnetOutOfIPAddresses\"\n                    }\n                },\n                \"InvalidSubnet\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"InvalidSubnet\"\n                    }\n                },\n                \"InvalidSecurityGroup\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"InvalidSecurityGroup\"\n                    }\n                },\n                \"ImageDeleted\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ImageDeleted\"\n                    }\n                },\n                \"ImageAccessDenied\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ImageAccessDenied\"\n                    }\n                },\n                \"InvalidImage\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"InvalidImage\"\n                    }\n                },\n                \"KMSKeyAccessDenied\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"KMSKeyAccessDenied\"\n                    }\n                },\n                \"KMSKeyNotFound\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"KMSKeyNotFound\"\n                    }\n                },\n                \"InvalidStateKMSKey\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"InvalidStateKMSKey\"\n                    }\n                },\n                \"DisabledKMSKey\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DisabledKMSKey\"\n                    }\n                },\n                \"EFSIOError\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"EFSIOError\"\n                    }\n                },\n                \"EFSMountConnectivityError\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"EFSMountConnectivityError\"\n                    }\n                },\n                \"EFSMountFailure\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"EFSMountFailure\"\n                    }\n                },\n                \"EFSMountTimeout\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"EFSMountTimeout\"\n                    }\n                },\n                \"InvalidRuntime\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"InvalidRuntime\"\n                    }\n                },\n                \"InvalidZipFileException\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"InvalidZipFileException\"\n                    }\n                },\n                \"FunctionError\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"FunctionError\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.lambda#Layer\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Arn\": {\n                    \"target\": \"com.amazonaws.lambda#LayerVersionArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the function layer.</p>\"\n                    }\n                },\n                \"CodeSize\": {\n                    \"target\": \"com.amazonaws.lambda#Long\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The size of the layer archive in bytes.</p>\"\n                    }\n                },\n                \"SigningProfileVersionArn\": {\n                    \"target\": \"com.amazonaws.lambda#Arn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) for a signing profile version.</p>\"\n                    }\n                },\n                \"SigningJobArn\": {\n                    \"target\": \"com.amazonaws.lambda#Arn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of a signing job.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>An <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html\\\">Lambda layer</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.lambda#LayerArn\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 140\n                },\n                \"smithy.api#pattern\": \"^arn:[a-zA-Z0-9-]+:lambda:[a-zA-Z0-9-]+:\\\\d{12}:layer:[a-zA-Z0-9-_]+$\"\n            }\n        },\n        \"com.amazonaws.lambda#LayerList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.lambda#LayerVersionArn\"\n            }\n        },\n        \"com.amazonaws.lambda#LayerName\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 140\n                },\n                \"smithy.api#pattern\": \"^(arn:[a-zA-Z0-9-]+:lambda:[a-zA-Z0-9-]+:\\\\d{12}:layer:[a-zA-Z0-9-_]+)|[a-zA-Z0-9-_]+$\"\n            }\n        },\n        \"com.amazonaws.lambda#LayerPermissionAllowedAction\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 22\n                },\n                \"smithy.api#pattern\": \"^lambda:GetLayerVersion$\"\n            }\n        },\n        \"com.amazonaws.lambda#LayerPermissionAllowedPrincipal\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#pattern\": \"^\\\\d{12}|\\\\*|arn:(aws[a-zA-Z-]*):iam::\\\\d{12}:root$\"\n            }\n        },\n        \"com.amazonaws.lambda#LayerResource\": {\n            \"type\": \"resource\",\n            \"identifiers\": {\n                \"LayerName\": {\n                    \"target\": \"com.amazonaws.lambda#LayerName\"\n                }\n            },\n            \"list\": {\n                \"target\": \"com.amazonaws.lambda#ListLayers\"\n            },\n            \"traits\": {\n                \"aws.api#arn\": {\n                    \"template\": \"layer:{LayerName}\"\n                },\n                \"aws.iam#iamResource\": {\n                    \"disableConditionKeyInheritance\": true,\n                    \"name\": \"layer\",\n                    \"relativeDocumentation\": \"lambda-api-permissions-ref.html\"\n                },\n                \"smithy.api#documentation\": \"Represents an AWS Lambda function layer\"\n            }\n        },\n        \"com.amazonaws.lambda#LayerVersion\": {\n            \"type\": \"resource\",\n            \"identifiers\": {\n                \"LayerName\": {\n                    \"target\": \"com.amazonaws.lambda#LayerName\"\n                },\n                \"LayerVersion\": {\n                    \"target\": \"com.amazonaws.lambda#String\"\n                }\n            },\n            \"list\": {\n                \"target\": \"com.amazonaws.lambda#ListLayerVersions\"\n            },\n            \"collectionOperations\": [\n                {\n                    \"target\": \"com.amazonaws.lambda#AddLayerVersionPermission\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#DeleteLayerVersion\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#GetLayerVersion\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#GetLayerVersionByArn\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#GetLayerVersionPolicy\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#PublishLayerVersion\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#RemoveLayerVersionPermission\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#arn\": {\n                    \"template\": \"layer:{LayerName}:{LayerVersion}\"\n                },\n                \"aws.iam#iamResource\": {\n                    \"disableConditionKeyInheritance\": true,\n                    \"name\": \"layerVersion\",\n                    \"relativeDocumentation\": \"lambda-api-permissions-ref.html\"\n                },\n                \"smithy.api#documentation\": \"Represents a version of an AWS Lambda function layer\",\n                \"smithy.api#suppress\": [\n                    \"IamResourceTrait\"\n                ]\n            }\n        },\n        \"com.amazonaws.lambda#LayerVersionArn\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 140\n                },\n                \"smithy.api#pattern\": \"^arn:[a-zA-Z0-9-]+:lambda:[a-zA-Z0-9-]+:\\\\d{12}:layer:[a-zA-Z0-9-_]+:[0-9]+$\"\n            }\n        },\n        \"com.amazonaws.lambda#LayerVersionContentInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"S3Bucket\": {\n                    \"target\": \"com.amazonaws.lambda#S3Bucket\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon S3 bucket of the layer archive.</p>\"\n                    }\n                },\n                \"S3Key\": {\n                    \"target\": \"com.amazonaws.lambda#S3Key\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon S3 key of the layer archive.</p>\"\n                    }\n                },\n                \"S3ObjectVersion\": {\n                    \"target\": \"com.amazonaws.lambda#S3ObjectVersion\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>For versioned objects, the version of the layer archive object to use.</p>\"\n                    }\n                },\n                \"ZipFile\": {\n                    \"target\": \"com.amazonaws.lambda#Blob\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The base64-encoded contents of the layer archive. Amazon Web Services SDK and Amazon Web Services CLI clients handle the encoding for you.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A ZIP archive that contains the contents of an <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html\\\">Lambda layer</a>. You can specify either an Amazon S3 location, or upload a layer archive directly.</p>\"\n            }\n        },\n        \"com.amazonaws.lambda#LayerVersionContentOutput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Location\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A link to the layer archive in Amazon S3 that is valid for 10 minutes.</p>\"\n                    }\n                },\n                \"CodeSha256\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The SHA-256 hash of the layer archive.</p>\"\n                    }\n                },\n                \"CodeSize\": {\n                    \"target\": \"com.amazonaws.lambda#Long\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The size of the layer archive in bytes.</p>\"\n                    }\n                },\n                \"SigningProfileVersionArn\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) for a signing profile version.</p>\"\n                    }\n                },\n                \"SigningJobArn\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of a signing job.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Details about a version of an <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html\\\">Lambda layer</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.lambda#LayerVersionNumber\": {\n            \"type\": \"long\",\n            \"traits\": {\n                \"smithy.api#default\": 0\n            }\n        },\n        \"com.amazonaws.lambda#LayerVersionsList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.lambda#LayerVersionsListItem\"\n            }\n        },\n        \"com.amazonaws.lambda#LayerVersionsListItem\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LayerVersionArn\": {\n                    \"target\": \"com.amazonaws.lambda#LayerVersionArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the layer version.</p>\"\n                    }\n                },\n                \"Version\": {\n                    \"target\": \"com.amazonaws.lambda#LayerVersionNumber\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The version number.</p>\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.lambda#Description\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The description of the version.</p>\"\n                    }\n                },\n                \"CreatedDate\": {\n                    \"target\": \"com.amazonaws.lambda#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date that the version was created, in ISO 8601 format. For example, <code>2018-11-27T15:10:45.123+0000</code>.</p>\"\n                    }\n                },\n                \"CompatibleRuntimes\": {\n                    \"target\": \"com.amazonaws.lambda#CompatibleRuntimes\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The layer's compatible runtimes.</p> <p>The following list includes deprecated runtimes. For more information, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html#runtime-deprecation-levels\\\">Runtime use after deprecation</a>.</p> <p>For a list of all currently supported runtimes, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html#runtimes-supported\\\">Supported runtimes</a>.</p>\"\n                    }\n                },\n                \"LicenseInfo\": {\n                    \"target\": \"com.amazonaws.lambda#LicenseInfo\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The layer's open-source license.</p>\"\n                    }\n                },\n                \"CompatibleArchitectures\": {\n                    \"target\": \"com.amazonaws.lambda#CompatibleArchitectures\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of compatible <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/foundation-arch.html\\\">instruction set architectures</a>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Details about a version of an <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html\\\">Lambda layer</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.lambda#LayersList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.lambda#LayersListItem\"\n            }\n        },\n        \"com.amazonaws.lambda#LayersListItem\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LayerName\": {\n                    \"target\": \"com.amazonaws.lambda#LayerName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the layer.</p>\"\n                    }\n                },\n                \"LayerArn\": {\n                    \"target\": \"com.amazonaws.lambda#LayerArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the function layer.</p>\"\n                    }\n                },\n                \"LatestMatchingVersion\": {\n                    \"target\": \"com.amazonaws.lambda#LayerVersionsListItem\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The newest version of the layer.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Details about an <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html\\\">Lambda layer</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.lambda#LayersReferenceList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.lambda#Layer\"\n            }\n        },\n        \"com.amazonaws.lambda#LicenseInfo\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 512\n                }\n            }\n        },\n        \"com.amazonaws.lambda#ListAliases\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.lambda#ListAliasesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.lambda#ListAliasesResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.lambda#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ServiceException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#TooManyRequestsException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.iam#iamAction\": {\n                    \"documentation\": \"Grants permission to retrieve a list of aliases for an AWS Lambda function\",\n                    \"relativeDocumentation\": \"API_ListAliases.html\",\n                    \"resources\": {\n                        \"required\": {\n                            \"function\": {}\n                        }\n                    }\n                },\n                \"smithy.api#documentation\": \"<p>Returns a list of <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/configuration-aliases.html\\\">aliases</a> for a Lambda function.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To list a function's aliases\",\n                        \"documentation\": \"The following example returns a list of aliases for a function named my-function.\",\n                        \"input\": {\n                            \"FunctionName\": \"my-function\"\n                        },\n                        \"output\": {\n                            \"Aliases\": [\n                                {\n                                    \"AliasArn\": \"arn:aws:lambda:us-west-2:123456789012:function:my-function:BETA\",\n                                    \"RevisionId\": \"a410117f-xmpl-494e-8035-7e204bb7933b\",\n                                    \"FunctionVersion\": \"2\",\n                                    \"Name\": \"BLUE\",\n                                    \"Description\": \"Production environment BLUE.\",\n                                    \"RoutingConfig\": {\n                                        \"AdditionalVersionWeights\": {\n                                            \"1\": 0.7\n                                        }\n                                    }\n                                },\n                                {\n                                    \"AliasArn\": \"arn:aws:lambda:us-west-2:123456789012:function:my-function:LIVE\",\n                                    \"RevisionId\": \"21d40116-xmpl-40ba-9360-3ea284da1bb5\",\n                                    \"FunctionVersion\": \"1\",\n                                    \"Name\": \"GREEN\",\n                                    \"Description\": \"Production environment GREEN.\"\n                                }\n                            ]\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/2015-03-31/functions/{FunctionName}/aliases\",\n                    \"code\": 200\n                },\n                \"smithy.api#paginated\": {\n                    \"items\": \"Aliases\"\n                },\n                \"smithy.api#readonly\": {}\n            }\n        },\n        \"com.amazonaws.lambda#ListAliasesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"FunctionName\": {\n                    \"target\": \"com.amazonaws.lambda#FunctionName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name or ARN of the Lambda function.</p> <p class=\\\"title\\\"> <b>Name formats</b> </p> <ul> <li> <p> <b>Function name</b> - <code>MyFunction</code>.</p> </li> <li> <p> <b>Function ARN</b> - <code>arn:aws:lambda:us-west-2:123456789012:function:MyFunction</code>.</p> </li> <li> <p> <b>Partial ARN</b> - <code>123456789012:function:MyFunction</code>.</p> </li> </ul> <p>The length constraint applies only to the full ARN. If you specify only the function name, it is limited to 64 characters in length.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"FunctionVersion\": {\n                    \"target\": \"com.amazonaws.lambda#Version\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify a function version to only list aliases that invoke that version.</p>\",\n                        \"smithy.api#httpQuery\": \"FunctionVersion\"\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify the pagination token that's returned by a previous request to retrieve the next page of results.</p>\",\n                        \"smithy.api#httpQuery\": \"Marker\"\n                    }\n                },\n                \"MaxItems\": {\n                    \"target\": \"com.amazonaws.lambda#MaxListItems\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Limit the number of aliases returned.</p>\",\n                        \"smithy.api#httpQuery\": \"MaxItems\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.lambda#ListAliasesResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NextMarker\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The pagination token that's included if more results are available.</p>\"\n                    }\n                },\n                \"Aliases\": {\n                    \"target\": \"com.amazonaws.lambda#AliasList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of aliases.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.lambda#ListCodeSigningConfigs\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.lambda#ListCodeSigningConfigsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.lambda#ListCodeSigningConfigsResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.lambda#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ServiceException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.iam#iamAction\": {\n                    \"documentation\": \"Grants permission to retrieve a list of AWS Lambda code signing configs\",\n                    \"relativeDocumentation\": \"API_ListCodeSigningConfigs.html\"\n                },\n                \"smithy.api#documentation\": \"<p>Returns a list of <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/configuring-codesigning.html\\\">code signing configurations</a>. A request returns up to 10,000 configurations per call. You can use the <code>MaxItems</code> parameter to return fewer configurations per call. </p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/2020-04-22/code-signing-configs\",\n                    \"code\": 200\n                },\n                \"smithy.api#paginated\": {\n                    \"items\": \"CodeSigningConfigs\"\n                },\n                \"smithy.api#readonly\": {}\n            }\n        },\n        \"com.amazonaws.lambda#ListCodeSigningConfigsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify the pagination token that's returned by a previous request to retrieve the next page of results.</p>\",\n                        \"smithy.api#httpQuery\": \"Marker\"\n                    }\n                },\n                \"MaxItems\": {\n                    \"target\": \"com.amazonaws.lambda#MaxListItems\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Maximum number of items to return.</p>\",\n                        \"smithy.api#httpQuery\": \"MaxItems\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.lambda#ListCodeSigningConfigsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NextMarker\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The pagination token that's included if more results are available.</p>\"\n                    }\n                },\n                \"CodeSigningConfigs\": {\n                    \"target\": \"com.amazonaws.lambda#CodeSigningConfigList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The code signing configurations</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.lambda#ListEventSourceMappings\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.lambda#ListEventSourceMappingsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.lambda#ListEventSourceMappingsResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.lambda#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ServiceException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#TooManyRequestsException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.iam#iamAction\": {\n                    \"documentation\": \"Grants permission to retrieve a list of AWS Lambda event source mappings\",\n                    \"relativeDocumentation\": \"API_ListEventSourceMappings.html\"\n                },\n                \"smithy.api#documentation\": \"<p>Lists event source mappings. Specify an <code>EventSourceArn</code> to show only event source mappings for a single event source.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To list the event source mappings for a function\",\n                        \"documentation\": \"The following example returns a list of the event source mappings for a function named my-function.\",\n                        \"input\": {\n                            \"FunctionName\": \"my-function\"\n                        },\n                        \"output\": {\n                            \"EventSourceMappings\": [\n                                {\n                                    \"UUID\": \"a1b2c3d4-5678-90ab-cdef-11111EXAMPLE\",\n                                    \"StateTransitionReason\": \"USER_INITIATED\",\n                                    \"LastModified\": 1.569284520333E9,\n                                    \"BatchSize\": 5,\n                                    \"State\": \"Enabled\",\n                                    \"FunctionArn\": \"arn:aws:lambda:us-west-2:123456789012:function:my-function\",\n                                    \"EventSourceArn\": \"arn:aws:sqs:us-west-2:123456789012:mySQSqueue\"\n                                }\n                            ]\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/2015-03-31/event-source-mappings\",\n                    \"code\": 200\n                },\n                \"smithy.api#paginated\": {\n                    \"items\": \"EventSourceMappings\"\n                },\n                \"smithy.api#readonly\": {}\n            }\n        },\n        \"com.amazonaws.lambda#ListEventSourceMappingsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"EventSourceArn\": {\n                    \"target\": \"com.amazonaws.lambda#Arn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the event source.</p> <ul> <li> <p> <b>Amazon Kinesis</b> – The ARN of the data stream or a stream consumer.</p> </li> <li> <p> <b>Amazon DynamoDB Streams</b> – The ARN of the stream.</p> </li> <li> <p> <b>Amazon Simple Queue Service</b> – The ARN of the queue.</p> </li> <li> <p> <b>Amazon Managed Streaming for Apache Kafka</b> – The ARN of the cluster or the ARN of the VPC connection (for <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/with-msk.html#msk-multi-vpc\\\">cross-account event source mappings</a>).</p> </li> <li> <p> <b>Amazon MQ</b> – The ARN of the broker.</p> </li> <li> <p> <b>Amazon DocumentDB</b> – The ARN of the DocumentDB change stream.</p> </li> </ul>\",\n                        \"smithy.api#httpQuery\": \"EventSourceArn\"\n                    }\n                },\n                \"FunctionName\": {\n                    \"target\": \"com.amazonaws.lambda#FunctionName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name or ARN of the Lambda function.</p> <p class=\\\"title\\\"> <b>Name formats</b> </p> <ul> <li> <p> <b>Function name</b> – <code>MyFunction</code>.</p> </li> <li> <p> <b>Function ARN</b> – <code>arn:aws:lambda:us-west-2:123456789012:function:MyFunction</code>.</p> </li> <li> <p> <b>Version or Alias ARN</b> – <code>arn:aws:lambda:us-west-2:123456789012:function:MyFunction:PROD</code>.</p> </li> <li> <p> <b>Partial ARN</b> – <code>123456789012:function:MyFunction</code>.</p> </li> </ul> <p>The length constraint applies only to the full ARN. If you specify only the function name, it's limited to 64 characters in length.</p>\",\n                        \"smithy.api#httpQuery\": \"FunctionName\"\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A pagination token returned by a previous call.</p>\",\n                        \"smithy.api#httpQuery\": \"Marker\"\n                    }\n                },\n                \"MaxItems\": {\n                    \"target\": \"com.amazonaws.lambda#MaxListItems\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of event source mappings to return. Note that ListEventSourceMappings returns a maximum of 100 items in each response, even if you set the number higher.</p>\",\n                        \"smithy.api#httpQuery\": \"MaxItems\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.lambda#ListEventSourceMappingsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NextMarker\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A pagination token that's returned when the response doesn't contain all event source mappings.</p>\"\n                    }\n                },\n                \"EventSourceMappings\": {\n                    \"target\": \"com.amazonaws.lambda#EventSourceMappingsList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of event source mappings.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.lambda#ListFunctionEventInvokeConfigs\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.lambda#ListFunctionEventInvokeConfigsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.lambda#ListFunctionEventInvokeConfigsResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.lambda#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ServiceException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#TooManyRequestsException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.iam#iamAction\": {\n                    \"documentation\": \"Grants permission to retrieve a list of configurations for asynchronous invocation for a function\",\n                    \"relativeDocumentation\": \"API_ListFunctionEventInvokeConfigs.html\",\n                    \"resources\": {\n                        \"required\": {\n                            \"function\": {}\n                        }\n                    }\n                },\n                \"smithy.api#documentation\": \"<p>Retrieves a list of configurations for asynchronous invocation for a function.</p> <p>To configure options for asynchronous invocation, use <a>PutFunctionEventInvokeConfig</a>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To view a list of asynchronous invocation configurations\",\n                        \"documentation\": \"The following example returns a list of asynchronous invocation configurations for a function named my-function.\",\n                        \"input\": {\n                            \"FunctionName\": \"my-function\"\n                        },\n                        \"output\": {\n                            \"FunctionEventInvokeConfigs\": [\n                                {\n                                    \"LastModified\": 1.577824406719E9,\n                                    \"FunctionArn\": \"arn:aws:lambda:us-east-2:123456789012:function:my-function:GREEN\",\n                                    \"MaximumRetryAttempts\": 2,\n                                    \"MaximumEventAgeInSeconds\": 1800\n                                },\n                                {\n                                    \"LastModified\": 1.577824396653E9,\n                                    \"FunctionArn\": \"arn:aws:lambda:us-east-2:123456789012:function:my-function:BLUE\",\n                                    \"MaximumRetryAttempts\": 0,\n                                    \"MaximumEventAgeInSeconds\": 3600\n                                }\n                            ]\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/2019-09-25/functions/{FunctionName}/event-invoke-config/list\",\n                    \"code\": 200\n                },\n                \"smithy.api#paginated\": {\n                    \"items\": \"FunctionEventInvokeConfigs\"\n                },\n                \"smithy.api#readonly\": {}\n            }\n        },\n        \"com.amazonaws.lambda#ListFunctionEventInvokeConfigsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"FunctionName\": {\n                    \"target\": \"com.amazonaws.lambda#FunctionName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name or ARN of the Lambda function.</p> <p class=\\\"title\\\"> <b>Name formats</b> </p> <ul> <li> <p> <b>Function name</b> - <code>my-function</code>.</p> </li> <li> <p> <b>Function ARN</b> - <code>arn:aws:lambda:us-west-2:123456789012:function:my-function</code>.</p> </li> <li> <p> <b>Partial ARN</b> - <code>123456789012:function:my-function</code>.</p> </li> </ul> <p>The length constraint applies only to the full ARN. If you specify only the function name, it is limited to 64 characters in length.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify the pagination token that's returned by a previous request to retrieve the next page of results.</p>\",\n                        \"smithy.api#httpQuery\": \"Marker\"\n                    }\n                },\n                \"MaxItems\": {\n                    \"target\": \"com.amazonaws.lambda#MaxFunctionEventInvokeConfigListItems\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of configurations to return.</p>\",\n                        \"smithy.api#httpQuery\": \"MaxItems\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.lambda#ListFunctionEventInvokeConfigsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"FunctionEventInvokeConfigs\": {\n                    \"target\": \"com.amazonaws.lambda#FunctionEventInvokeConfigList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of configurations.</p>\"\n                    }\n                },\n                \"NextMarker\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The pagination token that's included if more results are available.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.lambda#ListFunctionUrlConfigs\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.lambda#ListFunctionUrlConfigsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.lambda#ListFunctionUrlConfigsResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.lambda#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ServiceException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#TooManyRequestsException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.iam#conditionKeys\": [\n                    \"lambda:FunctionUrlAuthType\"\n                ],\n                \"aws.iam#iamAction\": {\n                    \"documentation\": \"Grants permission to read function url configurations for a function\",\n                    \"relativeDocumentation\": \"API_ListFunctionUrlConfigs.html\",\n                    \"resources\": {\n                        \"required\": {\n                            \"function\": {}\n                        }\n                    }\n                },\n                \"smithy.api#documentation\": \"<p>Returns a list of Lambda function URLs for the specified function.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/2021-10-31/functions/{FunctionName}/urls\",\n                    \"code\": 200\n                },\n                \"smithy.api#paginated\": {\n                    \"items\": \"FunctionUrlConfigs\"\n                },\n                \"smithy.api#readonly\": {}\n            }\n        },\n        \"com.amazonaws.lambda#ListFunctionUrlConfigsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"FunctionName\": {\n                    \"target\": \"com.amazonaws.lambda#FunctionName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name or ARN of the Lambda function.</p> <p class=\\\"title\\\"> <b>Name formats</b> </p> <ul> <li> <p> <b>Function name</b> – <code>my-function</code>.</p> </li> <li> <p> <b>Function ARN</b> – <code>arn:aws:lambda:us-west-2:123456789012:function:my-function</code>.</p> </li> <li> <p> <b>Partial ARN</b> – <code>123456789012:function:my-function</code>.</p> </li> </ul> <p>The length constraint applies only to the full ARN. If you specify only the function name, it is limited to 64 characters in length.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify the pagination token that's returned by a previous request to retrieve the next page of results.</p>\",\n                        \"smithy.api#httpQuery\": \"Marker\"\n                    }\n                },\n                \"MaxItems\": {\n                    \"target\": \"com.amazonaws.lambda#MaxItems\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of function URLs to return in the response. Note that <code>ListFunctionUrlConfigs</code> returns a maximum of 50 items in each response, even if you set the number higher.</p>\",\n                        \"smithy.api#httpQuery\": \"MaxItems\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.lambda#ListFunctionUrlConfigsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"FunctionUrlConfigs\": {\n                    \"target\": \"com.amazonaws.lambda#FunctionUrlConfigList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of function URL configurations.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"NextMarker\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The pagination token that's included if more results are available.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.lambda#ListFunctions\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.lambda#ListFunctionsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.lambda#ListFunctionsResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.lambda#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ServiceException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#TooManyRequestsException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.iam#iamAction\": {\n                    \"documentation\": \"Grants permission to retrieve a list of AWS Lambda functions, with the version-specific configuration of each function\",\n                    \"relativeDocumentation\": \"API_ListFunctions.html\"\n                },\n                \"smithy.api#documentation\": \"<p>Returns a list of Lambda functions, with the version-specific configuration of each. Lambda returns up to 50 functions per call.</p> <p>Set <code>FunctionVersion</code> to <code>ALL</code> to include all published versions of each function in addition to the unpublished version.</p> <note> <p>The <code>ListFunctions</code> operation returns a subset of the <a>FunctionConfiguration</a> fields. To get the additional fields (State, StateReasonCode, StateReason, LastUpdateStatus, LastUpdateStatusReason, LastUpdateStatusReasonCode, RuntimeVersionConfig) for a function or version, use <a>GetFunction</a>.</p> </note>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To get a list of Lambda functions\",\n                        \"documentation\": \"This operation returns a list of Lambda functions.\",\n                        \"output\": {\n                            \"NextMarker\": \"\",\n                            \"Functions\": [\n                                {\n                                    \"TracingConfig\": {\n                                        \"Mode\": \"PassThrough\"\n                                    },\n                                    \"Version\": \"$LATEST\",\n                                    \"CodeSha256\": \"dBG9m8SGdmlEjw/JYXlhhvCrAv5TxvXsbL/RMr0fT/I=\",\n                                    \"FunctionName\": \"helloworld\",\n                                    \"MemorySize\": 128,\n                                    \"RevisionId\": \"1718e831-badf-4253-9518-d0644210af7b\",\n                                    \"CodeSize\": 294,\n                                    \"FunctionArn\": \"arn:aws:lambda:us-west-2:123456789012:function:helloworld\",\n                                    \"Handler\": \"helloworld.handler\",\n                                    \"Role\": \"arn:aws:iam::123456789012:role/service-role/MyTestFunction-role-zgur6bf4\",\n                                    \"Timeout\": 3,\n                                    \"LastModified\": \"2019-09-23T18:32:33.857+0000\",\n                                    \"Runtime\": \"nodejs10.x\",\n                                    \"Description\": \"\"\n                                },\n                                {\n                                    \"TracingConfig\": {\n                                        \"Mode\": \"PassThrough\"\n                                    },\n                                    \"Version\": \"$LATEST\",\n                                    \"CodeSha256\": \"sU0cJ2/hOZevwV/lTxCuQqK3gDZP3i8gUoqUUVRmY6E=\",\n                                    \"FunctionName\": \"my-function\",\n                                    \"VpcConfig\": {\n                                        \"SubnetIds\": [],\n                                        \"VpcId\": \"\",\n                                        \"SecurityGroupIds\": []\n                                    },\n                                    \"MemorySize\": 256,\n                                    \"RevisionId\": \"93017fc9-59cb-41dc-901b-4845ce4bf668\",\n                                    \"CodeSize\": 266,\n                                    \"FunctionArn\": \"arn:aws:lambda:us-west-2:123456789012:function:my-function\",\n                                    \"Handler\": \"index.handler\",\n                                    \"Role\": \"arn:aws:iam::123456789012:role/service-role/helloWorldPython-role-uy3l9qyq\",\n                                    \"Timeout\": 3,\n                                    \"LastModified\": \"2019-10-01T16:47:28.490+0000\",\n                                    \"Runtime\": \"nodejs10.x\",\n                                    \"Description\": \"\"\n                                }\n                            ]\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/2015-03-31/functions\",\n                    \"code\": 200\n                },\n                \"smithy.api#paginated\": {\n                    \"items\": \"Functions\"\n                },\n                \"smithy.api#readonly\": {},\n                \"smithy.test#smokeTests\": [\n                    {\n                        \"id\": \"ListFunctionsSuccess\",\n                        \"params\": {},\n                        \"expect\": {\n                            \"success\": {}\n                        },\n                        \"vendorParams\": {},\n                        \"vendorParamsShape\": \"aws.test#AwsVendorParams\"\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.lambda#ListFunctionsByCodeSigningConfig\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.lambda#ListFunctionsByCodeSigningConfigRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.lambda#ListFunctionsByCodeSigningConfigResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.lambda#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ServiceException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.iam#iamAction\": {\n                    \"documentation\": \"Grants permission to retrieve a list of AWS Lambda functions by the code signing config assigned \",\n                    \"relativeDocumentation\": \"API_ListFunctionsByCodeSigningConfig.html\",\n                    \"resources\": {\n                        \"required\": {\n                            \"code signing config\": {}\n                        }\n                    }\n                },\n                \"smithy.api#documentation\": \"<p>List the functions that use the specified code signing configuration. You can use this method prior to deleting a code signing configuration, to verify that no functions are using it.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/2020-04-22/code-signing-configs/{CodeSigningConfigArn}/functions\",\n                    \"code\": 200\n                },\n                \"smithy.api#paginated\": {\n                    \"items\": \"FunctionArns\"\n                },\n                \"smithy.api#readonly\": {}\n            }\n        },\n        \"com.amazonaws.lambda#ListFunctionsByCodeSigningConfigRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CodeSigningConfigArn\": {\n                    \"target\": \"com.amazonaws.lambda#CodeSigningConfigArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The The Amazon Resource Name (ARN) of the code signing configuration.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify the pagination token that's returned by a previous request to retrieve the next page of results.</p>\",\n                        \"smithy.api#httpQuery\": \"Marker\"\n                    }\n                },\n                \"MaxItems\": {\n                    \"target\": \"com.amazonaws.lambda#MaxListItems\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Maximum number of items to return.</p>\",\n                        \"smithy.api#httpQuery\": \"MaxItems\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.lambda#ListFunctionsByCodeSigningConfigResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NextMarker\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The pagination token that's included if more results are available.</p>\"\n                    }\n                },\n                \"FunctionArns\": {\n                    \"target\": \"com.amazonaws.lambda#FunctionArnList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The function ARNs. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.lambda#ListFunctionsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"MasterRegion\": {\n                    \"target\": \"com.amazonaws.lambda#MasterRegion\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>For Lambda@Edge functions, the Amazon Web Services Region of the master function. For example, <code>us-east-1</code> filters the list of functions to include only Lambda@Edge functions replicated from a master function in US East (N. Virginia). If specified, you must set <code>FunctionVersion</code> to <code>ALL</code>.</p>\",\n                        \"smithy.api#httpQuery\": \"MasterRegion\"\n                    }\n                },\n                \"FunctionVersion\": {\n                    \"target\": \"com.amazonaws.lambda#FunctionVersion\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Set to <code>ALL</code> to include entries for all published versions of each function.</p>\",\n                        \"smithy.api#httpQuery\": \"FunctionVersion\"\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify the pagination token that's returned by a previous request to retrieve the next page of results.</p>\",\n                        \"smithy.api#httpQuery\": \"Marker\"\n                    }\n                },\n                \"MaxItems\": {\n                    \"target\": \"com.amazonaws.lambda#MaxListItems\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of functions to return in the response. Note that <code>ListFunctions</code> returns a maximum of 50 items in each response, even if you set the number higher.</p>\",\n                        \"smithy.api#httpQuery\": \"MaxItems\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.lambda#ListFunctionsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NextMarker\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The pagination token that's included if more results are available.</p>\"\n                    }\n                },\n                \"Functions\": {\n                    \"target\": \"com.amazonaws.lambda#FunctionList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of Lambda functions.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A list of Lambda functions.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.lambda#ListLayerVersions\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.lambda#ListLayerVersionsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.lambda#ListLayerVersionsResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.lambda#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ServiceException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#TooManyRequestsException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.iam#iamAction\": {\n                    \"documentation\": \"Grants permission to retrieve a list of versions of an AWS Lambda layer\",\n                    \"relativeDocumentation\": \"API_ListLayerVersions.html\"\n                },\n                \"smithy.api#documentation\": \"<p>Lists the versions of an <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html\\\">Lambda layer</a>. Versions that have been deleted aren't listed. Specify a <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html\\\">runtime identifier</a> to list only versions that indicate that they're compatible with that runtime. Specify a compatible architecture to include only layer versions that are compatible with that architecture.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To list versions of a layer\",\n                        \"documentation\": \"The following example displays information about the versions for the layer named blank-java-lib\",\n                        \"input\": {\n                            \"LayerName\": \"blank-java-lib\"\n                        },\n                        \"output\": {\n                            \"LayerVersions\": [\n                                {\n                                    \"LayerVersionArn\": \"arn:aws:lambda:us-east-2:123456789012:layer:blank-java-lib:7\",\n                                    \"Version\": 7,\n                                    \"Description\": \"Dependencies for the blank-java sample app.\",\n                                    \"CreatedDate\": \"2020-03-18T23:38:42.284+0000\",\n                                    \"CompatibleRuntimes\": [\n                                        \"java8\"\n                                    ]\n                                },\n                                {\n                                    \"LayerVersionArn\": \"arn:aws:lambda:us-east-2:123456789012:layer:blank-java-lib:6\",\n                                    \"Version\": 6,\n                                    \"Description\": \"Dependencies for the blank-java sample app.\",\n                                    \"CreatedDate\": \"2020-03-17T07:24:21.960+0000\",\n                                    \"CompatibleRuntimes\": [\n                                        \"java8\"\n                                    ]\n                                }\n                            ]\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/2018-10-31/layers/{LayerName}/versions\",\n                    \"code\": 200\n                },\n                \"smithy.api#paginated\": {\n                    \"items\": \"LayerVersions\"\n                },\n                \"smithy.api#readonly\": {}\n            }\n        },\n        \"com.amazonaws.lambda#ListLayerVersionsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CompatibleRuntime\": {\n                    \"target\": \"com.amazonaws.lambda#Runtime\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A runtime identifier.</p> <p>The following list includes deprecated runtimes. For more information, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html#runtime-deprecation-levels\\\">Runtime use after deprecation</a>.</p> <p>For a list of all currently supported runtimes, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html#runtimes-supported\\\">Supported runtimes</a>.</p>\",\n                        \"smithy.api#httpQuery\": \"CompatibleRuntime\"\n                    }\n                },\n                \"LayerName\": {\n                    \"target\": \"com.amazonaws.lambda#LayerName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name or Amazon Resource Name (ARN) of the layer.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A pagination token returned by a previous call.</p>\",\n                        \"smithy.api#httpQuery\": \"Marker\"\n                    }\n                },\n                \"MaxItems\": {\n                    \"target\": \"com.amazonaws.lambda#MaxLayerListItems\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of versions to return.</p>\",\n                        \"smithy.api#httpQuery\": \"MaxItems\"\n                    }\n                },\n                \"CompatibleArchitecture\": {\n                    \"target\": \"com.amazonaws.lambda#Architecture\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The compatible <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/foundation-arch.html\\\">instruction set architecture</a>.</p>\",\n                        \"smithy.api#httpQuery\": \"CompatibleArchitecture\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.lambda#ListLayerVersionsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NextMarker\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A pagination token returned when the response doesn't contain all versions.</p>\"\n                    }\n                },\n                \"LayerVersions\": {\n                    \"target\": \"com.amazonaws.lambda#LayerVersionsList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of versions.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.lambda#ListLayers\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.lambda#ListLayersRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.lambda#ListLayersResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.lambda#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ServiceException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#TooManyRequestsException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.iam#iamAction\": {\n                    \"documentation\": \"Grants permission to retrieve a list of AWS Lambda layers, with details about the latest version of each layer\",\n                    \"relativeDocumentation\": \"API_ListLayers.html\"\n                },\n                \"smithy.api#documentation\": \"<p>Lists <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/invocation-layers.html\\\">Lambda layers</a> and shows information about the latest version of each. Specify a <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html\\\">runtime identifier</a> to list only layers that indicate that they're compatible with that runtime. Specify a compatible architecture to include only layers that are compatible with that <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/foundation-arch.html\\\">instruction set architecture</a>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To list the layers that are compatible with your function's runtime\",\n                        \"documentation\": \"The following example returns information about layers that are compatible with the Python 3.7 runtime.\",\n                        \"input\": {\n                            \"CompatibleRuntime\": \"python3.7\"\n                        },\n                        \"output\": {\n                            \"Layers\": [\n                                {\n                                    \"LayerName\": \"my-layer\",\n                                    \"LayerArn\": \"arn:aws:lambda:us-east-2:123456789012:layer:my-layer\",\n                                    \"LatestMatchingVersion\": {\n                                        \"LayerVersionArn\": \"arn:aws:lambda:us-east-2:123456789012:layer:my-layer:2\",\n                                        \"Version\": 2,\n                                        \"Description\": \"My layer\",\n                                        \"CreatedDate\": \"2018-11-15T00:37:46.592+0000\",\n                                        \"CompatibleRuntimes\": [\n                                            \"python3.6\",\n                                            \"python3.7\"\n                                        ]\n                                    }\n                                }\n                            ]\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/2018-10-31/layers\",\n                    \"code\": 200\n                },\n                \"smithy.api#paginated\": {\n                    \"items\": \"Layers\"\n                },\n                \"smithy.api#readonly\": {}\n            }\n        },\n        \"com.amazonaws.lambda#ListLayersRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CompatibleRuntime\": {\n                    \"target\": \"com.amazonaws.lambda#Runtime\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A runtime identifier.</p> <p>The following list includes deprecated runtimes. For more information, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html#runtime-deprecation-levels\\\">Runtime use after deprecation</a>.</p> <p>For a list of all currently supported runtimes, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html#runtimes-supported\\\">Supported runtimes</a>.</p>\",\n                        \"smithy.api#httpQuery\": \"CompatibleRuntime\"\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A pagination token returned by a previous call.</p>\",\n                        \"smithy.api#httpQuery\": \"Marker\"\n                    }\n                },\n                \"MaxItems\": {\n                    \"target\": \"com.amazonaws.lambda#MaxLayerListItems\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of layers to return.</p>\",\n                        \"smithy.api#httpQuery\": \"MaxItems\"\n                    }\n                },\n                \"CompatibleArchitecture\": {\n                    \"target\": \"com.amazonaws.lambda#Architecture\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The compatible <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/foundation-arch.html\\\">instruction set architecture</a>.</p>\",\n                        \"smithy.api#httpQuery\": \"CompatibleArchitecture\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.lambda#ListLayersResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NextMarker\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A pagination token returned when the response doesn't contain all layers.</p>\"\n                    }\n                },\n                \"Layers\": {\n                    \"target\": \"com.amazonaws.lambda#LayersList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of function layers.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.lambda#ListProvisionedConcurrencyConfigs\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.lambda#ListProvisionedConcurrencyConfigsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.lambda#ListProvisionedConcurrencyConfigsResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.lambda#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ServiceException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#TooManyRequestsException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.iam#iamAction\": {\n                    \"documentation\": \"Grants permission to retrieve a list of provisioned concurrency configurations for an AWS Lambda function\",\n                    \"relativeDocumentation\": \"API_ListProvisionedConcurrencyConfigs.html\",\n                    \"resources\": {\n                        \"required\": {\n                            \"function\": {}\n                        }\n                    }\n                },\n                \"smithy.api#documentation\": \"<p>Retrieves a list of provisioned concurrency configurations for a function.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To get a list of provisioned concurrency configurations\",\n                        \"documentation\": \"The following example returns a list of provisioned concurrency configurations for a function named my-function.\",\n                        \"input\": {\n                            \"FunctionName\": \"my-function\"\n                        },\n                        \"output\": {\n                            \"ProvisionedConcurrencyConfigs\": [\n                                {\n                                    \"FunctionArn\": \"arn:aws:lambda:us-east-2:123456789012:function:my-function:GREEN\",\n                                    \"RequestedProvisionedConcurrentExecutions\": 100,\n                                    \"AvailableProvisionedConcurrentExecutions\": 100,\n                                    \"AllocatedProvisionedConcurrentExecutions\": 100,\n                                    \"Status\": \"READY\",\n                                    \"LastModified\": \"2019-12-31T20:29:00+0000\"\n                                },\n                                {\n                                    \"FunctionArn\": \"arn:aws:lambda:us-east-2:123456789012:function:my-function:BLUE\",\n                                    \"RequestedProvisionedConcurrentExecutions\": 100,\n                                    \"AvailableProvisionedConcurrentExecutions\": 100,\n                                    \"AllocatedProvisionedConcurrentExecutions\": 100,\n                                    \"Status\": \"READY\",\n                                    \"LastModified\": \"2019-12-31T20:28:49+0000\"\n                                }\n                            ]\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/2019-09-30/functions/{FunctionName}/provisioned-concurrency?List=ALL\",\n                    \"code\": 200\n                },\n                \"smithy.api#paginated\": {\n                    \"items\": \"ProvisionedConcurrencyConfigs\"\n                },\n                \"smithy.api#readonly\": {}\n            }\n        },\n        \"com.amazonaws.lambda#ListProvisionedConcurrencyConfigsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"FunctionName\": {\n                    \"target\": \"com.amazonaws.lambda#FunctionName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name or ARN of the Lambda function.</p> <p class=\\\"title\\\"> <b>Name formats</b> </p> <ul> <li> <p> <b>Function name</b> – <code>my-function</code>.</p> </li> <li> <p> <b>Function ARN</b> – <code>arn:aws:lambda:us-west-2:123456789012:function:my-function</code>.</p> </li> <li> <p> <b>Partial ARN</b> – <code>123456789012:function:my-function</code>.</p> </li> </ul> <p>The length constraint applies only to the full ARN. If you specify only the function name, it is limited to 64 characters in length.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify the pagination token that's returned by a previous request to retrieve the next page of results.</p>\",\n                        \"smithy.api#httpQuery\": \"Marker\"\n                    }\n                },\n                \"MaxItems\": {\n                    \"target\": \"com.amazonaws.lambda#MaxProvisionedConcurrencyConfigListItems\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify a number to limit the number of configurations returned.</p>\",\n                        \"smithy.api#httpQuery\": \"MaxItems\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.lambda#ListProvisionedConcurrencyConfigsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ProvisionedConcurrencyConfigs\": {\n                    \"target\": \"com.amazonaws.lambda#ProvisionedConcurrencyConfigList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of provisioned concurrency configurations.</p>\"\n                    }\n                },\n                \"NextMarker\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The pagination token that's included if more results are available.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.lambda#ListTags\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.lambda#ListTagsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.lambda#ListTagsResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.lambda#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ServiceException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#TooManyRequestsException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.iam#iamAction\": {\n                    \"documentation\": \"Grants permission to retrieve a list of tags for an AWS Lambda function, event source mapping or code signing configuration resource\",\n                    \"relativeDocumentation\": \"API_ListTags.html\",\n                    \"resources\": {\n                        \"optional\": {\n                            \"eventSourceMapping\": {},\n                            \"function\": {},\n                            \"code signing config\": {}\n                        }\n                    }\n                },\n                \"smithy.api#documentation\": \"<p>Returns a function, event source mapping, or code signing configuration's <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/tagging.html\\\">tags</a>. You can also view function tags with <a>GetFunction</a>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To retrieve the list of tags for a Lambda function\",\n                        \"documentation\": \"The following example displays the tags attached to the my-function Lambda function.\",\n                        \"input\": {\n                            \"Resource\": \"arn:aws:lambda:us-west-2:123456789012:function:my-function\"\n                        },\n                        \"output\": {\n                            \"Tags\": {\n                                \"Category\": \"Web Tools\",\n                                \"Department\": \"Sales\"\n                            }\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/2017-03-31/tags/{Resource}\",\n                    \"code\": 200\n                },\n                \"smithy.api#readonly\": {}\n            }\n        },\n        \"com.amazonaws.lambda#ListTagsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Resource\": {\n                    \"target\": \"com.amazonaws.lambda#TaggableResource\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The resource's Amazon Resource Name (ARN). Note: Lambda does not support adding tags to function aliases or versions.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.lambda#ListTagsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.lambda#Tags\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The function's tags.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.lambda#ListVersionsByFunction\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.lambda#ListVersionsByFunctionRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.lambda#ListVersionsByFunctionResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.lambda#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ServiceException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#TooManyRequestsException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.iam#iamAction\": {\n                    \"documentation\": \"Grants permission to retrieve a list of versions for an AWS Lambda function\",\n                    \"relativeDocumentation\": \"API_ListVersionsByFunction.html\",\n                    \"resources\": {\n                        \"required\": {\n                            \"function\": {}\n                        }\n                    }\n                },\n                \"smithy.api#documentation\": \"<p>Returns a list of <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/versioning-aliases.html\\\">versions</a>, with the version-specific configuration of each. Lambda returns up to 50 versions per call.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To list versions of a function\",\n                        \"documentation\": \"The following example returns a list of versions of a function named my-function\",\n                        \"input\": {\n                            \"FunctionName\": \"my-function\"\n                        },\n                        \"output\": {\n                            \"Versions\": [\n                                {\n                                    \"FunctionName\": \"my-function\",\n                                    \"FunctionArn\": \"arn:aws:lambda:us-west-2:123456789012:function:my-function\",\n                                    \"Runtime\": \"nodejs12.x\",\n                                    \"Role\": \"arn:aws:iam::123456789012:role/lambda-role\",\n                                    \"Handler\": \"index.handler\",\n                                    \"CodeSize\": 5797206,\n                                    \"Description\": \"Process image objects from Amazon S3.\",\n                                    \"Timeout\": 15,\n                                    \"MemorySize\": 256,\n                                    \"LastModified\": \"2020-04-10T19:06:32.563+0000\",\n                                    \"CodeSha256\": \"YFgDgEKG3ugvF1+pX64gV6tu9qNuIYNUdgJm8nCxsm4=\",\n                                    \"Version\": \"$LATEST\",\n                                    \"Environment\": {\n                                        \"Variables\": {\n                                            \"PREFIX\": \"inbound\",\n                                            \"BUCKET\": \"my-bucket-1xpuxmplzrlbh\"\n                                        }\n                                    },\n                                    \"KMSKeyArn\": \"arn:aws:kms:us-west-2:123456789012:key/b0844d6c-xmpl-4463-97a4-d49f50839966\",\n                                    \"TracingConfig\": {\n                                        \"Mode\": \"Active\"\n                                    },\n                                    \"RevisionId\": \"850ca006-2d98-4ff4-86db-8766e9d32fe9\"\n                                },\n                                {\n                                    \"FunctionName\": \"my-function\",\n                                    \"FunctionArn\": \"arn:aws:lambda:us-west-2:123456789012:function:my-function\",\n                                    \"Runtime\": \"nodejs12.x\",\n                                    \"Role\": \"arn:aws:iam::123456789012:role/lambda-role\",\n                                    \"Handler\": \"index.handler\",\n                                    \"CodeSize\": 5797206,\n                                    \"Description\": \"Process image objects from Amazon S3.\",\n                                    \"Timeout\": 5,\n                                    \"MemorySize\": 256,\n                                    \"LastModified\": \"2020-04-10T19:06:32.563+0000\",\n                                    \"CodeSha256\": \"YFgDgEKG3ugvF1+pX64gV6tu9qNuIYNUdgJm8nCxsm4=\",\n                                    \"Version\": \"1\",\n                                    \"Environment\": {\n                                        \"Variables\": {\n                                            \"PREFIX\": \"inbound\",\n                                            \"BUCKET\": \"my-bucket-1xpuxmplzrlbh\"\n                                        }\n                                    },\n                                    \"KMSKeyArn\": \"arn:aws:kms:us-west-2:123456789012:key/b0844d6c-xmpl-4463-97a4-d49f50839966\",\n                                    \"TracingConfig\": {\n                                        \"Mode\": \"Active\"\n                                    },\n                                    \"RevisionId\": \"b75dcd81-xmpl-48a8-a75a-93ba8b5b9727\"\n                                }\n                            ]\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/2015-03-31/functions/{FunctionName}/versions\",\n                    \"code\": 200\n                },\n                \"smithy.api#paginated\": {\n                    \"items\": \"Versions\"\n                },\n                \"smithy.api#readonly\": {}\n            }\n        },\n        \"com.amazonaws.lambda#ListVersionsByFunctionRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"FunctionName\": {\n                    \"target\": \"com.amazonaws.lambda#NamespacedFunctionName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name or ARN of the Lambda function.</p> <p class=\\\"title\\\"> <b>Name formats</b> </p> <ul> <li> <p> <b>Function name</b> - <code>MyFunction</code>.</p> </li> <li> <p> <b>Function ARN</b> - <code>arn:aws:lambda:us-west-2:123456789012:function:MyFunction</code>.</p> </li> <li> <p> <b>Partial ARN</b> - <code>123456789012:function:MyFunction</code>.</p> </li> </ul> <p>The length constraint applies only to the full ARN. If you specify only the function name, it is limited to 64 characters in length.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify the pagination token that's returned by a previous request to retrieve the next page of results.</p>\",\n                        \"smithy.api#httpQuery\": \"Marker\"\n                    }\n                },\n                \"MaxItems\": {\n                    \"target\": \"com.amazonaws.lambda#MaxListItems\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of versions to return. Note that <code>ListVersionsByFunction</code> returns a maximum of 50 items in each response, even if you set the number higher.</p>\",\n                        \"smithy.api#httpQuery\": \"MaxItems\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.lambda#ListVersionsByFunctionResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NextMarker\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The pagination token that's included if more results are available.</p>\"\n                    }\n                },\n                \"Versions\": {\n                    \"target\": \"com.amazonaws.lambda#FunctionList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of Lambda function versions.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.lambda#LocalMountPath\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 160\n                },\n                \"smithy.api#pattern\": \"^/mnt/[a-zA-Z0-9-_.]+$\"\n            }\n        },\n        \"com.amazonaws.lambda#LogFormat\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"Json\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"JSON\"\n                    }\n                },\n                \"Text\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Text\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.lambda#LogGroup\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 512\n                },\n                \"smithy.api#pattern\": \"^[\\\\.\\\\-_/#A-Za-z0-9]+$\"\n            }\n        },\n        \"com.amazonaws.lambda#LogType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"None\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"None\"\n                    }\n                },\n                \"Tail\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Tail\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.lambda#LoggingConfig\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LogFormat\": {\n                    \"target\": \"com.amazonaws.lambda#LogFormat\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The format in which Lambda sends your function's application and system logs to CloudWatch. Select between plain text and structured JSON.</p>\"\n                    }\n                },\n                \"ApplicationLogLevel\": {\n                    \"target\": \"com.amazonaws.lambda#ApplicationLogLevel\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Set this property to filter the application logs for your function that Lambda sends to CloudWatch. Lambda only sends application logs at the selected level of detail and lower, where <code>TRACE</code> is the highest level and <code>FATAL</code> is the lowest.</p>\"\n                    }\n                },\n                \"SystemLogLevel\": {\n                    \"target\": \"com.amazonaws.lambda#SystemLogLevel\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Set this property to filter the system logs for your function that Lambda sends to CloudWatch. Lambda only sends system logs at the selected level of detail and lower, where <code>DEBUG</code> is the highest level and <code>WARN</code> is the lowest.</p>\"\n                    }\n                },\n                \"LogGroup\": {\n                    \"target\": \"com.amazonaws.lambda#LogGroup\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the Amazon CloudWatch log group the function sends logs to. By default, Lambda functions send logs to a default log group named <code>/aws/lambda/&lt;function name&gt;</code>. To use a different log group, enter an existing log group or enter a new log group name.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The function's Amazon CloudWatch Logs configuration settings.</p>\"\n            }\n        },\n        \"com.amazonaws.lambda#Long\": {\n            \"type\": \"long\",\n            \"traits\": {\n                \"smithy.api#default\": 0\n            }\n        },\n        \"com.amazonaws.lambda#MasterRegion\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#pattern\": \"^ALL|[a-z]{2}(-gov)?-[a-z]+-\\\\d{1}$\"\n            }\n        },\n        \"com.amazonaws.lambda#MaxAge\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 0,\n                    \"max\": 86400\n                }\n            }\n        },\n        \"com.amazonaws.lambda#MaxFunctionEventInvokeConfigListItems\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 50\n                }\n            }\n        },\n        \"com.amazonaws.lambda#MaxItems\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 50\n                }\n            }\n        },\n        \"com.amazonaws.lambda#MaxLayerListItems\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 50\n                }\n            }\n        },\n        \"com.amazonaws.lambda#MaxListItems\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 10000\n                }\n            }\n        },\n        \"com.amazonaws.lambda#MaxProvisionedConcurrencyConfigListItems\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 50\n                }\n            }\n        },\n        \"com.amazonaws.lambda#MaximumBatchingWindowInSeconds\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 0,\n                    \"max\": 300\n                }\n            }\n        },\n        \"com.amazonaws.lambda#MaximumConcurrency\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 2,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.lambda#MaximumEventAgeInSeconds\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 60,\n                    \"max\": 21600\n                }\n            }\n        },\n        \"com.amazonaws.lambda#MaximumNumberOfPollers\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 2000\n                }\n            }\n        },\n        \"com.amazonaws.lambda#MaximumRecordAgeInSeconds\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": -1,\n                    \"max\": 604800\n                }\n            }\n        },\n        \"com.amazonaws.lambda#MaximumRetryAttempts\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 0,\n                    \"max\": 2\n                }\n            }\n        },\n        \"com.amazonaws.lambda#MaximumRetryAttemptsEventSourceMapping\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": -1,\n                    \"max\": 10000\n                }\n            }\n        },\n        \"com.amazonaws.lambda#MemorySize\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 128,\n                    \"max\": 10240\n                }\n            }\n        },\n        \"com.amazonaws.lambda#Method\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 6\n                },\n                \"smithy.api#pattern\": \".*\"\n            }\n        },\n        \"com.amazonaws.lambda#MinimumNumberOfPollers\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 200\n                }\n            }\n        },\n        \"com.amazonaws.lambda#NameSpacedFunctionArn\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#pattern\": \"^arn:(aws[a-zA-Z-]*)?:lambda:[a-z]{2}(-gov)?-[a-z]+-\\\\d{1}:\\\\d{12}:function:[a-zA-Z0-9-_\\\\.]+(:(\\\\$LATEST|[a-zA-Z0-9-_]+))?$\"\n            }\n        },\n        \"com.amazonaws.lambda#NamespacedFunctionName\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 170\n                },\n                \"smithy.api#pattern\": \"^(arn:(aws[a-zA-Z-]*)?:lambda:)?([a-z]{2}(-gov)?-[a-z]+-\\\\d{1}:)?(\\\\d{12}:)?(function:)?([a-zA-Z0-9-_\\\\.]+)(:(\\\\$LATEST|[a-zA-Z0-9-_]+))?$\"\n            }\n        },\n        \"com.amazonaws.lambda#NamespacedStatementId\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 100\n                },\n                \"smithy.api#pattern\": \"^([a-zA-Z0-9-_.]+)$\"\n            }\n        },\n        \"com.amazonaws.lambda#NonNegativeInteger\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 0\n                }\n            }\n        },\n        \"com.amazonaws.lambda#NullableBoolean\": {\n            \"type\": \"boolean\"\n        },\n        \"com.amazonaws.lambda#OnFailure\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Destination\": {\n                    \"target\": \"com.amazonaws.lambda#DestinationArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the destination resource.</p> <p>To retain records of unsuccessful <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/invocation-async.html#invocation-async-destinations\\\">asynchronous invocations</a>, you can configure an Amazon SNS topic, Amazon SQS queue, Amazon S3 bucket, Lambda function, or Amazon EventBridge event bus as the destination.</p> <p>To retain records of failed invocations from <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/with-kinesis.html\\\">Kinesis</a>, <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/with-ddb.html\\\">DynamoDB</a>, <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/with-kafka.html#services-smaa-onfailure-destination\\\">self-managed Kafka</a> or <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/with-msk.html#services-msk-onfailure-destination\\\">Amazon MSK</a>, you can configure an Amazon SNS topic, Amazon SQS queue, or Amazon S3 bucket as the destination.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A destination for events that failed processing. For more information, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/invocation-async-retain-records.html#invocation-async-destinations\\\">Adding a destination</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.lambda#OnSuccess\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Destination\": {\n                    \"target\": \"com.amazonaws.lambda#DestinationArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the destination resource.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A destination for events that were processed successfully.</p> <p>To retain records of successful <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/invocation-async.html#invocation-async-destinations\\\">asynchronous invocations</a>, you can configure an Amazon SNS topic, Amazon SQS queue, Lambda function, or Amazon EventBridge event bus as the destination.</p> <note> <p> <code>OnSuccess</code> is not supported in <code>CreateEventSourceMapping</code> or <code>UpdateEventSourceMapping</code> requests.</p> </note>\"\n            }\n        },\n        \"com.amazonaws.lambda#OrganizationId\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 34\n                },\n                \"smithy.api#pattern\": \"^o-[a-z0-9]{10,32}$\"\n            }\n        },\n        \"com.amazonaws.lambda#Origin\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 253\n                },\n                \"smithy.api#pattern\": \".*\"\n            }\n        },\n        \"com.amazonaws.lambda#PackageType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"Zip\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Zip\"\n                    }\n                },\n                \"Image\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Image\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.lambda#ParallelizationFactor\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 10\n                }\n            }\n        },\n        \"com.amazonaws.lambda#Pattern\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 4096\n                },\n                \"smithy.api#pattern\": \".*\"\n            }\n        },\n        \"com.amazonaws.lambda#Permission\": {\n            \"type\": \"resource\",\n            \"identifiers\": {\n                \"FunctionName\": {\n                    \"target\": \"com.amazonaws.lambda#FunctionName\"\n                },\n                \"StatementId\": {\n                    \"target\": \"com.amazonaws.lambda#StatementId\"\n                }\n            },\n            \"operations\": [\n                {\n                    \"target\": \"com.amazonaws.lambda#AddPermission\"\n                }\n            ],\n            \"collectionOperations\": [\n                {\n                    \"target\": \"com.amazonaws.lambda#RemovePermission\"\n                }\n            ]\n        },\n        \"com.amazonaws.lambda#PolicyLengthExceededException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Type\": {\n                    \"target\": \"com.amazonaws.lambda#String\"\n                },\n                \"message\": {\n                    \"target\": \"com.amazonaws.lambda#String\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The permissions policy for the resource is too large. For more information, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html\\\">Lambda quotas</a>.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.lambda#PositiveInteger\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1\n                }\n            }\n        },\n        \"com.amazonaws.lambda#PreconditionFailedException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Type\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The exception type.</p>\"\n                    }\n                },\n                \"message\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The exception message.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The RevisionId provided does not match the latest RevisionId for the Lambda function or alias.</p> <ul> <li> <p> <b>For AddPermission and RemovePermission API operations:</b> Call <code>GetPolicy</code> to retrieve the latest RevisionId for your resource.</p> </li> <li> <p> <b>For all other API operations:</b> Call <code>GetFunction</code> or <code>GetAlias</code> to retrieve the latest RevisionId for your resource.</p> </li> </ul>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 412\n            }\n        },\n        \"com.amazonaws.lambda#Principal\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#pattern\": \"^[^\\\\s]+$\"\n            }\n        },\n        \"com.amazonaws.lambda#PrincipalOrgID\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 12,\n                    \"max\": 34\n                },\n                \"smithy.api#pattern\": \"^o-[a-z0-9]{10,32}$\"\n            }\n        },\n        \"com.amazonaws.lambda#ProvisionedConcurrencyConfig\": {\n            \"type\": \"resource\",\n            \"identifiers\": {\n                \"FunctionName\": {\n                    \"target\": \"com.amazonaws.lambda#FunctionName\"\n                },\n                \"Qualifier\": {\n                    \"target\": \"com.amazonaws.lambda#Qualifier\"\n                }\n            },\n            \"put\": {\n                \"target\": \"com.amazonaws.lambda#PutProvisionedConcurrencyConfig\"\n            },\n            \"read\": {\n                \"target\": \"com.amazonaws.lambda#GetProvisionedConcurrencyConfig\"\n            },\n            \"delete\": {\n                \"target\": \"com.amazonaws.lambda#DeleteProvisionedConcurrencyConfig\"\n            }\n        },\n        \"com.amazonaws.lambda#ProvisionedConcurrencyConfigList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.lambda#ProvisionedConcurrencyConfigListItem\"\n            }\n        },\n        \"com.amazonaws.lambda#ProvisionedConcurrencyConfigListItem\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"FunctionArn\": {\n                    \"target\": \"com.amazonaws.lambda#FunctionArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the alias or version.</p>\"\n                    }\n                },\n                \"RequestedProvisionedConcurrentExecutions\": {\n                    \"target\": \"com.amazonaws.lambda#PositiveInteger\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The amount of provisioned concurrency requested.</p>\"\n                    }\n                },\n                \"AvailableProvisionedConcurrentExecutions\": {\n                    \"target\": \"com.amazonaws.lambda#NonNegativeInteger\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The amount of provisioned concurrency available.</p>\"\n                    }\n                },\n                \"AllocatedProvisionedConcurrentExecutions\": {\n                    \"target\": \"com.amazonaws.lambda#NonNegativeInteger\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The amount of provisioned concurrency allocated. When a weighted alias is used during linear and canary deployments, this value fluctuates depending on the amount of concurrency that is provisioned for the function versions.</p>\"\n                    }\n                },\n                \"Status\": {\n                    \"target\": \"com.amazonaws.lambda#ProvisionedConcurrencyStatusEnum\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The status of the allocation process.</p>\"\n                    }\n                },\n                \"StatusReason\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>For failed allocations, the reason that provisioned concurrency could not be allocated.</p>\"\n                    }\n                },\n                \"LastModified\": {\n                    \"target\": \"com.amazonaws.lambda#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time that a user last updated the configuration, in <a href=\\\"https://www.iso.org/iso-8601-date-and-time-format.html\\\">ISO 8601 format</a>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Details about the provisioned concurrency configuration for a function alias or version.</p>\"\n            }\n        },\n        \"com.amazonaws.lambda#ProvisionedConcurrencyConfigNotFoundException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Type\": {\n                    \"target\": \"com.amazonaws.lambda#String\"\n                },\n                \"message\": {\n                    \"target\": \"com.amazonaws.lambda#String\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The specified configuration does not exist.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 404\n            }\n        },\n        \"com.amazonaws.lambda#ProvisionedConcurrencyStatusEnum\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"IN_PROGRESS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"IN_PROGRESS\"\n                    }\n                },\n                \"READY\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"READY\"\n                    }\n                },\n                \"FAILED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"FAILED\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.lambda#ProvisionedPollerConfig\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"MinimumPollers\": {\n                    \"target\": \"com.amazonaws.lambda#MinimumNumberOfPollers\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The minimum number of event pollers this event source can scale down to.</p>\"\n                    }\n                },\n                \"MaximumPollers\": {\n                    \"target\": \"com.amazonaws.lambda#MaximumNumberOfPollers\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of event pollers this event source can scale up to.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/invocation-eventsourcemapping.html#invocation-eventsourcemapping-provisioned-mode\\\"> provisioned mode</a> configuration for the event source. Use Provisioned Mode to customize the minimum and maximum number of event pollers for your event source. An event poller is a compute unit that provides approximately 5 MBps of throughput.</p>\"\n            }\n        },\n        \"com.amazonaws.lambda#PublishLayerVersion\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.lambda#PublishLayerVersionRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.lambda#PublishLayerVersionResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.lambda#CodeStorageExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ServiceException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#TooManyRequestsException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.iam#iamAction\": {\n                    \"createsResources\": [\n                        \"layerVersion\"\n                    ],\n                    \"documentation\": \"Grants permission to create an AWS Lambda layer\",\n                    \"relativeDocumentation\": \"API_PublishLayerVersion.html\",\n                    \"resources\": {\n                        \"required\": {\n                            \"layer\": {}\n                        }\n                    }\n                },\n                \"smithy.api#documentation\": \"<p>Creates an <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html\\\">Lambda layer</a> from a ZIP archive. Each time you call <code>PublishLayerVersion</code> with the same layer name, a new version is created.</p> <p>Add layers to your function with <a>CreateFunction</a> or <a>UpdateFunctionConfiguration</a>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To create a Lambda layer version\",\n                        \"documentation\": \"The following example creates a new Python library layer version. The command retrieves the layer content a file named layer.zip in the specified S3 bucket.\",\n                        \"input\": {\n                            \"LayerName\": \"my-layer\",\n                            \"Description\": \"My Python layer\",\n                            \"Content\": {\n                                \"S3Bucket\": \"lambda-layers-us-west-2-123456789012\",\n                                \"S3Key\": \"layer.zip\"\n                            },\n                            \"CompatibleRuntimes\": [\n                                \"python3.6\",\n                                \"python3.7\"\n                            ],\n                            \"LicenseInfo\": \"MIT\"\n                        },\n                        \"output\": {\n                            \"Content\": {\n                                \"Location\": \"https://awslambda-us-west-2-layers.s3.us-west-2.amazonaws.com/snapshots/123456789012/my-layer-4aaa2fbb-ff77-4b0a-ad92-5b78a716a96a?versionId=27iWyA73cCAYqyH...\",\n                                \"CodeSha256\": \"tv9jJO+rPbXUUXuRKi7CwHzKtLDkDRJLB3cC3Z/ouXo=\",\n                                \"CodeSize\": 169\n                            },\n                            \"LayerArn\": \"arn:aws:lambda:us-west-2:123456789012:layer:my-layer\",\n                            \"LayerVersionArn\": \"arn:aws:lambda:us-west-2:123456789012:layer:my-layer:1\",\n                            \"Description\": \"My Python layer\",\n                            \"CreatedDate\": \"2018-11-14T23:03:52.894+0000\",\n                            \"Version\": 1,\n                            \"LicenseInfo\": \"MIT\",\n                            \"CompatibleRuntimes\": [\n                                \"python3.6\",\n                                \"python3.7\"\n                            ]\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"POST\",\n                    \"uri\": \"/2018-10-31/layers/{LayerName}/versions\",\n                    \"code\": 201\n                }\n            }\n        },\n        \"com.amazonaws.lambda#PublishLayerVersionRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LayerName\": {\n                    \"target\": \"com.amazonaws.lambda#LayerName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name or Amazon Resource Name (ARN) of the layer.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.lambda#Description\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The description of the version.</p>\"\n                    }\n                },\n                \"Content\": {\n                    \"target\": \"com.amazonaws.lambda#LayerVersionContentInput\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The function layer archive.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"CompatibleRuntimes\": {\n                    \"target\": \"com.amazonaws.lambda#CompatibleRuntimes\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of compatible <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html\\\">function runtimes</a>. Used for filtering with <a>ListLayers</a> and <a>ListLayerVersions</a>.</p> <p>The following list includes deprecated runtimes. For more information, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html#runtime-support-policy\\\">Runtime deprecation policy</a>.</p>\"\n                    }\n                },\n                \"LicenseInfo\": {\n                    \"target\": \"com.amazonaws.lambda#LicenseInfo\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The layer's software license. It can be any of the following:</p> <ul> <li> <p>An <a href=\\\"https://spdx.org/licenses/\\\">SPDX license identifier</a>. For example, <code>MIT</code>.</p> </li> <li> <p>The URL of a license hosted on the internet. For example, <code>https://opensource.org/licenses/MIT</code>.</p> </li> <li> <p>The full text of the license.</p> </li> </ul>\"\n                    }\n                },\n                \"CompatibleArchitectures\": {\n                    \"target\": \"com.amazonaws.lambda#CompatibleArchitectures\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of compatible <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/foundation-arch.html\\\">instruction set architectures</a>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.lambda#PublishLayerVersionResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Content\": {\n                    \"target\": \"com.amazonaws.lambda#LayerVersionContentOutput\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Details about the layer version.</p>\"\n                    }\n                },\n                \"LayerArn\": {\n                    \"target\": \"com.amazonaws.lambda#LayerArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the layer.</p>\"\n                    }\n                },\n                \"LayerVersionArn\": {\n                    \"target\": \"com.amazonaws.lambda#LayerVersionArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the layer version.</p>\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.lambda#Description\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The description of the version.</p>\"\n                    }\n                },\n                \"CreatedDate\": {\n                    \"target\": \"com.amazonaws.lambda#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date that the layer version was created, in <a href=\\\"https://www.w3.org/TR/NOTE-datetime\\\">ISO-8601 format</a> (YYYY-MM-DDThh:mm:ss.sTZD).</p>\"\n                    }\n                },\n                \"Version\": {\n                    \"target\": \"com.amazonaws.lambda#LayerVersionNumber\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The version number.</p>\"\n                    }\n                },\n                \"CompatibleRuntimes\": {\n                    \"target\": \"com.amazonaws.lambda#CompatibleRuntimes\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The layer's compatible runtimes.</p> <p>The following list includes deprecated runtimes. For more information, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html#runtime-deprecation-levels\\\">Runtime use after deprecation</a>.</p> <p>For a list of all currently supported runtimes, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html#runtimes-supported\\\">Supported runtimes</a>.</p>\"\n                    }\n                },\n                \"LicenseInfo\": {\n                    \"target\": \"com.amazonaws.lambda#LicenseInfo\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The layer's software license.</p>\"\n                    }\n                },\n                \"CompatibleArchitectures\": {\n                    \"target\": \"com.amazonaws.lambda#CompatibleArchitectures\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of compatible <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/foundation-arch.html\\\">instruction set architectures</a>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.lambda#PublishVersion\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.lambda#PublishVersionRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.lambda#FunctionConfiguration\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.lambda#CodeStorageExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#PreconditionFailedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceConflictException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ServiceException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#TooManyRequestsException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.iam#iamAction\": {\n                    \"documentation\": \"Grants permission to create an AWS Lambda function version\",\n                    \"relativeDocumentation\": \"API_PublishVersion.html\",\n                    \"resources\": {\n                        \"required\": {\n                            \"function\": {}\n                        }\n                    }\n                },\n                \"smithy.api#documentation\": \"<p>Creates a <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/versioning-aliases.html\\\">version</a> from the current code and configuration of a function. Use versions to create a snapshot of your function code and configuration that doesn't change.</p> <p>Lambda doesn't publish a version if the function's configuration and code haven't changed since the last version. Use <a>UpdateFunctionCode</a> or <a>UpdateFunctionConfiguration</a> to update the function before publishing a version.</p> <p>Clients can invoke versions directly or with an alias. To create an alias, use <a>CreateAlias</a>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To publish a version of a Lambda function\",\n                        \"documentation\": \"This operation publishes a version of a Lambda function\",\n                        \"input\": {\n                            \"FunctionName\": \"myFunction\",\n                            \"CodeSha256\": \"\",\n                            \"Description\": \"\"\n                        },\n                        \"output\": {\n                            \"FunctionName\": \"my-function\",\n                            \"FunctionArn\": \"arn:aws:lambda:us-west-2:123456789012:function:my-function\",\n                            \"Runtime\": \"nodejs12.x\",\n                            \"Role\": \"arn:aws:iam::123456789012:role/lambda-role\",\n                            \"Handler\": \"index.handler\",\n                            \"CodeSize\": 5797206,\n                            \"Description\": \"Process image objects from Amazon S3.\",\n                            \"Timeout\": 5,\n                            \"MemorySize\": 256,\n                            \"LastModified\": \"2020-04-10T19:06:32.563+0000\",\n                            \"CodeSha256\": \"YFgDgEKG3ugvF1+pX64gV6tu9qNuIYNUdgJm8nCxsm4=\",\n                            \"Version\": \"1\",\n                            \"Environment\": {\n                                \"Variables\": {\n                                    \"PREFIX\": \"inbound\",\n                                    \"BUCKET\": \"my-bucket-1xpuxmplzrlbh\"\n                                }\n                            },\n                            \"KMSKeyArn\": \"arn:aws:kms:us-west-2:123456789012:key/b0844d6c-xmpl-4463-97a4-d49f50839966\",\n                            \"TracingConfig\": {\n                                \"Mode\": \"Active\"\n                            },\n                            \"RevisionId\": \"b75dcd81-xmpl-48a8-a75a-93ba8b5b9727\",\n                            \"State\": \"Active\",\n                            \"LastUpdateStatus\": \"Successful\"\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"POST\",\n                    \"uri\": \"/2015-03-31/functions/{FunctionName}/versions\",\n                    \"code\": 201\n                }\n            }\n        },\n        \"com.amazonaws.lambda#PublishVersionRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"FunctionName\": {\n                    \"target\": \"com.amazonaws.lambda#FunctionName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name or ARN of the Lambda function.</p> <p class=\\\"title\\\"> <b>Name formats</b> </p> <ul> <li> <p> <b>Function name</b> - <code>MyFunction</code>.</p> </li> <li> <p> <b>Function ARN</b> - <code>arn:aws:lambda:us-west-2:123456789012:function:MyFunction</code>.</p> </li> <li> <p> <b>Partial ARN</b> - <code>123456789012:function:MyFunction</code>.</p> </li> </ul> <p>The length constraint applies only to the full ARN. If you specify only the function name, it is limited to 64 characters in length.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"CodeSha256\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Only publish a version if the hash value matches the value that's specified. Use this option to avoid publishing a version if the function code has changed since you last updated it. You can get the hash for the version that you uploaded from the output of <a>UpdateFunctionCode</a>.</p>\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.lambda#Description\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A description for the version to override the description in the function configuration.</p>\"\n                    }\n                },\n                \"RevisionId\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Only update the function if the revision ID matches the ID that's specified. Use this option to avoid publishing a version if the function configuration has changed since you last updated it.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.lambda#PutFunctionCodeSigningConfig\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.lambda#PutFunctionCodeSigningConfigRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.lambda#PutFunctionCodeSigningConfigResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.lambda#CodeSigningConfigNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceConflictException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ServiceException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#TooManyRequestsException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.iam#conditionKeys\": [\n                    \"lambda:CodeSigningConfigArn\"\n                ],\n                \"aws.iam#iamAction\": {\n                    \"documentation\": \"Grants permission to attach a code signing config to an AWS Lambda function\",\n                    \"relativeDocumentation\": \"API_PutFunctionCodeSigningConfig.html\",\n                    \"resources\": {\n                        \"required\": {\n                            \"function\": {},\n                            \"code signing config\": {}\n                        }\n                    }\n                },\n                \"smithy.api#documentation\": \"<p>Update the code signing configuration for the function. Changes to the code signing configuration take effect the next time a user tries to deploy a code package to the function. </p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"PUT\",\n                    \"uri\": \"/2020-06-30/functions/{FunctionName}/code-signing-config\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.lambda#PutFunctionCodeSigningConfigRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CodeSigningConfigArn\": {\n                    \"target\": \"com.amazonaws.lambda#CodeSigningConfigArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The The Amazon Resource Name (ARN) of the code signing configuration.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"FunctionName\": {\n                    \"target\": \"com.amazonaws.lambda#FunctionName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name or ARN of the Lambda function.</p> <p class=\\\"title\\\"> <b>Name formats</b> </p> <ul> <li> <p> <b>Function name</b> - <code>MyFunction</code>.</p> </li> <li> <p> <b>Function ARN</b> - <code>arn:aws:lambda:us-west-2:123456789012:function:MyFunction</code>.</p> </li> <li> <p> <b>Partial ARN</b> - <code>123456789012:function:MyFunction</code>.</p> </li> </ul> <p>The length constraint applies only to the full ARN. If you specify only the function name, it is limited to 64 characters in length.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.lambda#PutFunctionCodeSigningConfigResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CodeSigningConfigArn\": {\n                    \"target\": \"com.amazonaws.lambda#CodeSigningConfigArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The The Amazon Resource Name (ARN) of the code signing configuration.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"FunctionName\": {\n                    \"target\": \"com.amazonaws.lambda#FunctionName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name or ARN of the Lambda function.</p> <p class=\\\"title\\\"> <b>Name formats</b> </p> <ul> <li> <p> <b>Function name</b> - <code>MyFunction</code>.</p> </li> <li> <p> <b>Function ARN</b> - <code>arn:aws:lambda:us-west-2:123456789012:function:MyFunction</code>.</p> </li> <li> <p> <b>Partial ARN</b> - <code>123456789012:function:MyFunction</code>.</p> </li> </ul> <p>The length constraint applies only to the full ARN. If you specify only the function name, it is limited to 64 characters in length.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.lambda#PutFunctionConcurrency\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.lambda#PutFunctionConcurrencyRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.lambda#Concurrency\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.lambda#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceConflictException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ServiceException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#TooManyRequestsException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.iam#iamAction\": {\n                    \"documentation\": \"Grants permission to configure reserved concurrency for an AWS Lambda function\",\n                    \"relativeDocumentation\": \"API_PutFunctionConcurrency.html\",\n                    \"resources\": {\n                        \"required\": {\n                            \"function\": {}\n                        }\n                    }\n                },\n                \"smithy.api#documentation\": \"<p>Sets the maximum number of simultaneous executions for a function, and reserves capacity for that concurrency level.</p> <p>Concurrency settings apply to the function as a whole, including all published versions and the unpublished version. Reserving concurrency both ensures that your function has capacity to process the specified number of events simultaneously, and prevents it from scaling beyond that level. Use <a>GetFunction</a> to see the current setting for a function.</p> <p>Use <a>GetAccountSettings</a> to see your Regional concurrency limit. You can reserve concurrency for as many functions as you like, as long as you leave at least 100 simultaneous executions unreserved for functions that aren't configured with a per-function limit. For more information, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/invocation-scaling.html\\\">Lambda function scaling</a>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To configure a reserved concurrency limit for a function\",\n                        \"documentation\": \"The following example configures 100 reserved concurrent executions for the my-function function.\",\n                        \"input\": {\n                            \"FunctionName\": \"my-function\",\n                            \"ReservedConcurrentExecutions\": 100\n                        },\n                        \"output\": {\n                            \"ReservedConcurrentExecutions\": 100\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"PUT\",\n                    \"uri\": \"/2017-10-31/functions/{FunctionName}/concurrency\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.lambda#PutFunctionConcurrencyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"FunctionName\": {\n                    \"target\": \"com.amazonaws.lambda#FunctionName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name or ARN of the Lambda function.</p> <p class=\\\"title\\\"> <b>Name formats</b> </p> <ul> <li> <p> <b>Function name</b> – <code>my-function</code>.</p> </li> <li> <p> <b>Function ARN</b> – <code>arn:aws:lambda:us-west-2:123456789012:function:my-function</code>.</p> </li> <li> <p> <b>Partial ARN</b> – <code>123456789012:function:my-function</code>.</p> </li> </ul> <p>The length constraint applies only to the full ARN. If you specify only the function name, it is limited to 64 characters in length.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ReservedConcurrentExecutions\": {\n                    \"target\": \"com.amazonaws.lambda#ReservedConcurrentExecutions\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of simultaneous executions to reserve for the function.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.lambda#PutFunctionEventInvokeConfig\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.lambda#PutFunctionEventInvokeConfigRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.lambda#FunctionEventInvokeConfig\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.lambda#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceConflictException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ServiceException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#TooManyRequestsException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.iam#iamAction\": {\n                    \"documentation\": \"Grants permission to configures options for asynchronous invocation on an AWS Lambda function, version, or alias\",\n                    \"relativeDocumentation\": \"API_PutFunctionEventInvokeConfig.html\",\n                    \"resources\": {\n                        \"required\": {\n                            \"function\": {}\n                        }\n                    }\n                },\n                \"smithy.api#documentation\": \"<p>Configures options for <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/invocation-async.html\\\">asynchronous invocation</a> on a function, version, or alias. If a configuration already exists for a function, version, or alias, this operation overwrites it. If you exclude any settings, they are removed. To set one option without affecting existing settings for other options, use <a>UpdateFunctionEventInvokeConfig</a>.</p> <p>By default, Lambda retries an asynchronous invocation twice if the function returns an error. It retains events in a queue for up to six hours. When an event fails all processing attempts or stays in the asynchronous invocation queue for too long, Lambda discards it. To retain discarded events, configure a dead-letter queue with <a>UpdateFunctionConfiguration</a>.</p> <p>To send an invocation record to a queue, topic, S3 bucket, function, or event bus, specify a <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/invocation-async.html#invocation-async-destinations\\\">destination</a>. You can configure separate destinations for successful invocations (on-success) and events that fail all processing attempts (on-failure). You can configure destinations in addition to or instead of a dead-letter queue.</p> <note> <p>S3 buckets are supported only for on-failure destinations. To retain records of successful invocations, use another destination type.</p> </note>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To configure error handling for asynchronous invocation\",\n                        \"documentation\": \"The following example sets a maximum event age of one hour and disables retries for the specified function.\",\n                        \"input\": {\n                            \"FunctionName\": \"my-function\",\n                            \"MaximumRetryAttempts\": 0,\n                            \"MaximumEventAgeInSeconds\": 3600\n                        },\n                        \"output\": {\n                            \"LastModified\": \"2016-11-21T19:49:20.006Z\",\n                            \"FunctionArn\": \"arn:aws:lambda:us-east-2:123456789012:function:my-function:$LATEST\",\n                            \"MaximumRetryAttempts\": 0,\n                            \"MaximumEventAgeInSeconds\": 3600,\n                            \"DestinationConfig\": {\n                                \"OnSuccess\": {},\n                                \"OnFailure\": {}\n                            }\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"PUT\",\n                    \"uri\": \"/2019-09-25/functions/{FunctionName}/event-invoke-config\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.lambda#PutFunctionEventInvokeConfigRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"FunctionName\": {\n                    \"target\": \"com.amazonaws.lambda#FunctionName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name or ARN of the Lambda function, version, or alias.</p> <p class=\\\"title\\\"> <b>Name formats</b> </p> <ul> <li> <p> <b>Function name</b> - <code>my-function</code> (name-only), <code>my-function:v1</code> (with alias).</p> </li> <li> <p> <b>Function ARN</b> - <code>arn:aws:lambda:us-west-2:123456789012:function:my-function</code>.</p> </li> <li> <p> <b>Partial ARN</b> - <code>123456789012:function:my-function</code>.</p> </li> </ul> <p>You can append a version number or alias to any of the formats. The length constraint applies only to the full ARN. If you specify only the function name, it is limited to 64 characters in length.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Qualifier\": {\n                    \"target\": \"com.amazonaws.lambda#Qualifier\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A version number or alias name.</p>\",\n                        \"smithy.api#httpQuery\": \"Qualifier\"\n                    }\n                },\n                \"MaximumRetryAttempts\": {\n                    \"target\": \"com.amazonaws.lambda#MaximumRetryAttempts\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of times to retry when the function returns an error.</p>\"\n                    }\n                },\n                \"MaximumEventAgeInSeconds\": {\n                    \"target\": \"com.amazonaws.lambda#MaximumEventAgeInSeconds\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum age of a request that Lambda sends to a function for processing.</p>\"\n                    }\n                },\n                \"DestinationConfig\": {\n                    \"target\": \"com.amazonaws.lambda#DestinationConfig\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A destination for events after they have been sent to a function for processing.</p> <p class=\\\"title\\\"> <b>Destinations</b> </p> <ul> <li> <p> <b>Function</b> - The Amazon Resource Name (ARN) of a Lambda function.</p> </li> <li> <p> <b>Queue</b> - The ARN of a standard SQS queue.</p> </li> <li> <p> <b>Bucket</b> - The ARN of an Amazon S3 bucket.</p> </li> <li> <p> <b>Topic</b> - The ARN of a standard SNS topic.</p> </li> <li> <p> <b>Event Bus</b> - The ARN of an Amazon EventBridge event bus.</p> </li> </ul> <note> <p>S3 buckets are supported only for on-failure destinations. To retain records of successful invocations, use another destination type.</p> </note>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.lambda#PutFunctionRecursionConfig\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.lambda#PutFunctionRecursionConfigRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.lambda#PutFunctionRecursionConfigResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.lambda#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceConflictException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ServiceException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#TooManyRequestsException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.iam#iamAction\": {\n                    \"documentation\": \"Grants permission to update the recursion configuration of an AWS Lambda function\",\n                    \"relativeDocumentation\": \"API_PutFunctionRecursionConfig.html\",\n                    \"resources\": {\n                        \"required\": {\n                            \"function\": {}\n                        }\n                    }\n                },\n                \"smithy.api#documentation\": \"<p>Sets your function's <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/invocation-recursion.html\\\">recursive loop detection</a> configuration.</p> <p>When you configure a Lambda function to output to the same service or resource that invokes the function, it's possible to create an infinite recursive loop. For example, a Lambda function might write a message to an Amazon Simple Queue Service (Amazon SQS) queue, which then invokes the same function. This invocation causes the function to write another message to the queue, which in turn invokes the function again.</p> <p>Lambda can detect certain types of recursive loops shortly after they occur. When Lambda detects a recursive loop and your function's recursive loop detection configuration is set to <code>Terminate</code>, it stops your function being invoked and notifies you.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"PUT\",\n                    \"uri\": \"/2024-08-31/functions/{FunctionName}/recursion-config\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.lambda#PutFunctionRecursionConfigRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"FunctionName\": {\n                    \"target\": \"com.amazonaws.lambda#UnqualifiedFunctionName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name or ARN of the Lambda function.</p> <p class=\\\"title\\\"> <b>Name formats</b> </p> <ul> <li> <p> <b>Function name</b> – <code>my-function</code>.</p> </li> <li> <p> <b>Function ARN</b> – <code>arn:aws:lambda:us-west-2:123456789012:function:my-function</code>.</p> </li> <li> <p> <b>Partial ARN</b> – <code>123456789012:function:my-function</code>.</p> </li> </ul> <p>The length constraint applies only to the full ARN. If you specify only the function name, it is limited to 64 characters in length.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"RecursiveLoop\": {\n                    \"target\": \"com.amazonaws.lambda#RecursiveLoop\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If you set your function's recursive loop detection configuration to <code>Allow</code>, Lambda doesn't take any action when it detects your function being invoked as part of a recursive loop. We recommend that you only use this setting if your design intentionally uses a Lambda function to write data back to the same Amazon Web Services resource that invokes it.</p> <p>If you set your function's recursive loop detection configuration to <code>Terminate</code>, Lambda stops your function being invoked and notifies you when it detects your function being invoked as part of a recursive loop.</p> <p>By default, Lambda sets your function's configuration to <code>Terminate</code>.</p> <important> <p>If your design intentionally uses a Lambda function to write data back to the same Amazon Web Services resource that invokes the function, then use caution and implement suitable guard rails to prevent unexpected charges being billed to your Amazon Web Services account. To learn more about best practices for using recursive invocation patterns, see <a href=\\\"https://serverlessland.com/content/service/lambda/guides/aws-lambda-operator-guide/recursive-runaway\\\">Recursive patterns that cause run-away Lambda functions</a> in Serverless Land.</p> </important>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.lambda#PutFunctionRecursionConfigResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RecursiveLoop\": {\n                    \"target\": \"com.amazonaws.lambda#RecursiveLoop\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The status of your function's recursive loop detection configuration.</p> <p>When this value is set to <code>Allow</code>and Lambda detects your function being invoked as part of a recursive loop, it doesn't take any action.</p> <p>When this value is set to <code>Terminate</code> and Lambda detects your function being invoked as part of a recursive loop, it stops your function being invoked and notifies you. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.lambda#PutProvisionedConcurrencyConfig\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.lambda#PutProvisionedConcurrencyConfigRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.lambda#PutProvisionedConcurrencyConfigResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.lambda#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceConflictException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ServiceException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#TooManyRequestsException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.iam#iamAction\": {\n                    \"documentation\": \"Grants permission to configure provisioned concurrency for an AWS Lambda function's alias or version\",\n                    \"relativeDocumentation\": \"API_PutProvisionedConcurrencyConfig.html\",\n                    \"resources\": {\n                        \"optional\": {\n                            \"function version\": {},\n                            \"function alias\": {}\n                        }\n                    }\n                },\n                \"smithy.api#documentation\": \"<p>Adds a provisioned concurrency configuration to a function's alias or version.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To allocate provisioned concurrency\",\n                        \"documentation\": \"The following example allocates 100 provisioned concurrency for the BLUE alias of the specified function.\",\n                        \"input\": {\n                            \"FunctionName\": \"my-function\",\n                            \"Qualifier\": \"BLUE\",\n                            \"ProvisionedConcurrentExecutions\": 100\n                        },\n                        \"output\": {\n                            \"RequestedProvisionedConcurrentExecutions\": 100,\n                            \"AllocatedProvisionedConcurrentExecutions\": 0,\n                            \"Status\": \"IN_PROGRESS\",\n                            \"LastModified\": \"2019-11-21T19:32:12+0000\"\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"PUT\",\n                    \"uri\": \"/2019-09-30/functions/{FunctionName}/provisioned-concurrency\",\n                    \"code\": 202\n                },\n                \"smithy.api#idempotent\": {}\n            }\n        },\n        \"com.amazonaws.lambda#PutProvisionedConcurrencyConfigRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"FunctionName\": {\n                    \"target\": \"com.amazonaws.lambda#FunctionName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name or ARN of the Lambda function.</p> <p class=\\\"title\\\"> <b>Name formats</b> </p> <ul> <li> <p> <b>Function name</b> – <code>my-function</code>.</p> </li> <li> <p> <b>Function ARN</b> – <code>arn:aws:lambda:us-west-2:123456789012:function:my-function</code>.</p> </li> <li> <p> <b>Partial ARN</b> – <code>123456789012:function:my-function</code>.</p> </li> </ul> <p>The length constraint applies only to the full ARN. If you specify only the function name, it is limited to 64 characters in length.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Qualifier\": {\n                    \"target\": \"com.amazonaws.lambda#Qualifier\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The version number or alias name.</p>\",\n                        \"smithy.api#httpQuery\": \"Qualifier\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ProvisionedConcurrentExecutions\": {\n                    \"target\": \"com.amazonaws.lambda#PositiveInteger\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The amount of provisioned concurrency to allocate for the version or alias.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.lambda#PutProvisionedConcurrencyConfigResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RequestedProvisionedConcurrentExecutions\": {\n                    \"target\": \"com.amazonaws.lambda#PositiveInteger\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The amount of provisioned concurrency requested.</p>\"\n                    }\n                },\n                \"AvailableProvisionedConcurrentExecutions\": {\n                    \"target\": \"com.amazonaws.lambda#NonNegativeInteger\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The amount of provisioned concurrency available.</p>\"\n                    }\n                },\n                \"AllocatedProvisionedConcurrentExecutions\": {\n                    \"target\": \"com.amazonaws.lambda#NonNegativeInteger\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The amount of provisioned concurrency allocated. When a weighted alias is used during linear and canary deployments, this value fluctuates depending on the amount of concurrency that is provisioned for the function versions.</p>\"\n                    }\n                },\n                \"Status\": {\n                    \"target\": \"com.amazonaws.lambda#ProvisionedConcurrencyStatusEnum\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The status of the allocation process.</p>\"\n                    }\n                },\n                \"StatusReason\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>For failed allocations, the reason that provisioned concurrency could not be allocated.</p>\"\n                    }\n                },\n                \"LastModified\": {\n                    \"target\": \"com.amazonaws.lambda#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time that a user last updated the configuration, in <a href=\\\"https://www.iso.org/iso-8601-date-and-time-format.html\\\">ISO 8601 format</a>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.lambda#PutRuntimeManagementConfig\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.lambda#PutRuntimeManagementConfigRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.lambda#PutRuntimeManagementConfigResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.lambda#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceConflictException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ServiceException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#TooManyRequestsException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.iam#iamAction\": {\n                    \"documentation\": \"Grants permission to update the runtime management configuration of an AWS Lambda function\",\n                    \"relativeDocumentation\": \"API_PutRuntimeManagementConfig.html\",\n                    \"resources\": {\n                        \"required\": {\n                            \"function\": {}\n                        }\n                    }\n                },\n                \"smithy.api#documentation\": \"<p>Sets the runtime management configuration for a function's version. For more information, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/runtimes-update.html\\\">Runtime updates</a>.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"PUT\",\n                    \"uri\": \"/2021-07-20/functions/{FunctionName}/runtime-management-config\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.lambda#PutRuntimeManagementConfigRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"FunctionName\": {\n                    \"target\": \"com.amazonaws.lambda#FunctionName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name or ARN of the Lambda function.</p> <p class=\\\"title\\\"> <b>Name formats</b> </p> <ul> <li> <p> <b>Function name</b> – <code>my-function</code>.</p> </li> <li> <p> <b>Function ARN</b> – <code>arn:aws:lambda:us-west-2:123456789012:function:my-function</code>.</p> </li> <li> <p> <b>Partial ARN</b> – <code>123456789012:function:my-function</code>.</p> </li> </ul> <p>The length constraint applies only to the full ARN. If you specify only the function name, it is limited to 64 characters in length.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Qualifier\": {\n                    \"target\": \"com.amazonaws.lambda#Qualifier\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify a version of the function. This can be <code>$LATEST</code> or a published version number. If no value is specified, the configuration for the <code>$LATEST</code> version is returned.</p>\",\n                        \"smithy.api#httpQuery\": \"Qualifier\"\n                    }\n                },\n                \"UpdateRuntimeOn\": {\n                    \"target\": \"com.amazonaws.lambda#UpdateRuntimeOn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify the runtime update mode.</p> <ul> <li> <p> <b>Auto (default)</b> - Automatically update to the most recent and secure runtime version using a <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/runtimes-update.html#runtime-management-two-phase\\\">Two-phase runtime version rollout</a>. This is the best choice for most customers to ensure they always benefit from runtime updates.</p> </li> <li> <p> <b>Function update</b> - Lambda updates the runtime of your function to the most recent and secure runtime version when you update your function. This approach synchronizes runtime updates with function deployments, giving you control over when runtime updates are applied and allowing you to detect and mitigate rare runtime update incompatibilities early. When using this setting, you need to regularly update your functions to keep their runtime up-to-date.</p> </li> <li> <p> <b>Manual</b> - You specify a runtime version in your function configuration. The function will use this runtime version indefinitely. In the rare case where a new runtime version is incompatible with an existing function, this allows you to roll back your function to an earlier runtime version. For more information, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/runtimes-update.html#runtime-management-rollback\\\">Roll back a runtime version</a>.</p> </li> </ul>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"RuntimeVersionArn\": {\n                    \"target\": \"com.amazonaws.lambda#RuntimeVersionArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the runtime version you want the function to use.</p> <note> <p>This is only required if you're using the <b>Manual</b> runtime update mode.</p> </note>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.lambda#PutRuntimeManagementConfigResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"UpdateRuntimeOn\": {\n                    \"target\": \"com.amazonaws.lambda#UpdateRuntimeOn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The runtime update mode.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"FunctionArn\": {\n                    \"target\": \"com.amazonaws.lambda#FunctionArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the function</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"RuntimeVersionArn\": {\n                    \"target\": \"com.amazonaws.lambda#RuntimeVersionArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the runtime the function is configured to use. If the runtime update mode is <b>manual</b>, the ARN is returned, otherwise <code>null</code> is returned.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.lambda#Qualifier\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 128\n                },\n                \"smithy.api#pattern\": \"^(|[a-zA-Z0-9$_-]+)$\"\n            }\n        },\n        \"com.amazonaws.lambda#Queue\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 1000\n                },\n                \"smithy.api#pattern\": \"^[\\\\s\\\\S]*$\"\n            }\n        },\n        \"com.amazonaws.lambda#Queues\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.lambda#Queue\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 1\n                }\n            }\n        },\n        \"com.amazonaws.lambda#RecursiveInvocationException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Type\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The exception type.</p>\"\n                    }\n                },\n                \"Message\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The exception message.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Lambda has detected your function being invoked in a recursive loop with other Amazon Web Services resources and stopped your function's invocation.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.lambda#RecursiveLoop\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"Allow\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Allow\"\n                    }\n                },\n                \"Terminate\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Terminate\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.lambda#RemoveLayerVersionPermission\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.lambda#RemoveLayerVersionPermissionRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.lambda#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#PreconditionFailedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ServiceException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#TooManyRequestsException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.iam#iamAction\": {\n                    \"documentation\": \"Grants permission to remove a statement from the permissions policy for a version of an AWS Lambda layer\",\n                    \"relativeDocumentation\": \"API_RemoveLayerVersionPermission.html\",\n                    \"resources\": {\n                        \"required\": {\n                            \"layerVersion\": {}\n                        }\n                    }\n                },\n                \"smithy.api#documentation\": \"<p>Removes a statement from the permissions policy for a version of an <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html\\\">Lambda layer</a>. For more information, see <a>AddLayerVersionPermission</a>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To delete layer-version permissions\",\n                        \"documentation\": \"The following example deletes permission for an account to configure a layer version.\",\n                        \"input\": {\n                            \"LayerName\": \"my-layer\",\n                            \"VersionNumber\": 1,\n                            \"StatementId\": \"xaccount\"\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"DELETE\",\n                    \"uri\": \"/2018-10-31/layers/{LayerName}/versions/{VersionNumber}/policy/{StatementId}\",\n                    \"code\": 204\n                }\n            }\n        },\n        \"com.amazonaws.lambda#RemoveLayerVersionPermissionRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LayerName\": {\n                    \"target\": \"com.amazonaws.lambda#LayerName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name or Amazon Resource Name (ARN) of the layer.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"VersionNumber\": {\n                    \"target\": \"com.amazonaws.lambda#LayerVersionNumber\",\n                    \"traits\": {\n                        \"smithy.api#default\": null,\n                        \"smithy.api#documentation\": \"<p>The version number.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"StatementId\": {\n                    \"target\": \"com.amazonaws.lambda#StatementId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The identifier that was specified when the statement was added.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"RevisionId\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Only update the policy if the revision ID matches the ID specified. Use this option to avoid modifying a policy that has changed since you last read it.</p>\",\n                        \"smithy.api#httpQuery\": \"RevisionId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"aws.api#data\": \"permissions\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.lambda#RemovePermission\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.lambda#RemovePermissionRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.lambda#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#PreconditionFailedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ServiceException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#TooManyRequestsException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.iam#conditionKeys\": [\n                    \"lambda:FunctionUrlAuthType\",\n                    \"lambda:Principal\"\n                ],\n                \"aws.iam#iamAction\": {\n                    \"documentation\": \"Grants permission to revoke function-use permission from an AWS service or another account\",\n                    \"relativeDocumentation\": \"API_RemovePermission.html\",\n                    \"resources\": {\n                        \"required\": {\n                            \"function\": {}\n                        }\n                    }\n                },\n                \"smithy.api#documentation\": \"<p>Revokes function-use permission from an Amazon Web Services service or another Amazon Web Services account. You can get the ID of the statement from the output of <a>GetPolicy</a>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To remove a Lambda function's permissions\",\n                        \"documentation\": \"The following example removes a permissions statement named xaccount from the PROD alias of a function named my-function.\",\n                        \"input\": {\n                            \"FunctionName\": \"my-function\",\n                            \"StatementId\": \"xaccount\",\n                            \"Qualifier\": \"PROD\"\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"DELETE\",\n                    \"uri\": \"/2015-03-31/functions/{FunctionName}/policy/{StatementId}\",\n                    \"code\": 204\n                }\n            }\n        },\n        \"com.amazonaws.lambda#RemovePermissionRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"FunctionName\": {\n                    \"target\": \"com.amazonaws.lambda#FunctionName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name or ARN of the Lambda function, version, or alias.</p> <p class=\\\"title\\\"> <b>Name formats</b> </p> <ul> <li> <p> <b>Function name</b> – <code>my-function</code> (name-only), <code>my-function:v1</code> (with alias).</p> </li> <li> <p> <b>Function ARN</b> – <code>arn:aws:lambda:us-west-2:123456789012:function:my-function</code>.</p> </li> <li> <p> <b>Partial ARN</b> – <code>123456789012:function:my-function</code>.</p> </li> </ul> <p>You can append a version number or alias to any of the formats. The length constraint applies only to the full ARN. If you specify only the function name, it is limited to 64 characters in length.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"StatementId\": {\n                    \"target\": \"com.amazonaws.lambda#NamespacedStatementId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Statement ID of the permission to remove.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Qualifier\": {\n                    \"target\": \"com.amazonaws.lambda#Qualifier\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify a version or alias to remove permissions from a published version of the function.</p>\",\n                        \"smithy.api#httpQuery\": \"Qualifier\"\n                    }\n                },\n                \"RevisionId\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Update the policy only if the revision ID matches the ID that's specified. Use this option to avoid modifying a policy that has changed since you last read it.</p>\",\n                        \"smithy.api#httpQuery\": \"RevisionId\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"aws.api#data\": \"permissions\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.lambda#RequestTooLargeException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Type\": {\n                    \"target\": \"com.amazonaws.lambda#String\"\n                },\n                \"message\": {\n                    \"target\": \"com.amazonaws.lambda#String\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The request payload exceeded the <code>Invoke</code> request body JSON input quota. For more information, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html\\\">Lambda quotas</a>.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 413\n            }\n        },\n        \"com.amazonaws.lambda#ReservedConcurrentExecutions\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 0\n                }\n            }\n        },\n        \"com.amazonaws.lambda#ResourceArn\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#pattern\": \"^(arn:(aws[a-zA-Z-]*)?:[a-z0-9-.]+:.*)|()$\"\n            }\n        },\n        \"com.amazonaws.lambda#ResourceConflictException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Type\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The exception type.</p>\"\n                    }\n                },\n                \"message\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The exception message.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The resource already exists, or another operation is in progress.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 409\n            }\n        },\n        \"com.amazonaws.lambda#ResourceInUseException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Type\": {\n                    \"target\": \"com.amazonaws.lambda#String\"\n                },\n                \"Message\": {\n                    \"target\": \"com.amazonaws.lambda#String\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The operation conflicts with the resource's availability. For example, you tried to update an event source mapping in the CREATING state, or you tried to delete an event source mapping currently UPDATING.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.lambda#ResourceNotFoundException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Type\": {\n                    \"target\": \"com.amazonaws.lambda#String\"\n                },\n                \"Message\": {\n                    \"target\": \"com.amazonaws.lambda#String\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The resource specified in the request does not exist.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 404\n            }\n        },\n        \"com.amazonaws.lambda#ResourceNotReadyException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Type\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The exception type.</p>\"\n                    }\n                },\n                \"message\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The exception message.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The function is inactive and its VPC connection is no longer available. Wait for the VPC connection to reestablish and try again.</p>\",\n                \"smithy.api#error\": \"server\",\n                \"smithy.api#httpError\": 502\n            }\n        },\n        \"com.amazonaws.lambda#ResourcePolicy\": {\n            \"type\": \"resource\",\n            \"identifiers\": {\n                \"TargetArn\": {\n                    \"target\": \"com.amazonaws.lambda#ResourceArn\"\n                }\n            }\n        },\n        \"com.amazonaws.lambda#ResponseStreamingInvocationType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"RequestResponse\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"RequestResponse\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DryRun\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.lambda#RoleArn\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#pattern\": \"^arn:(aws[a-zA-Z-]*)?:iam::\\\\d{12}:role/?[a-zA-Z_0-9+=,.@\\\\-_/]+$\"\n            }\n        },\n        \"com.amazonaws.lambda#Runtime\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"nodejs\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"nodejs\"\n                    }\n                },\n                \"nodejs43\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"nodejs4.3\"\n                    }\n                },\n                \"nodejs610\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"nodejs6.10\"\n                    }\n                },\n                \"nodejs810\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"nodejs8.10\"\n                    }\n                },\n                \"nodejs10x\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"nodejs10.x\"\n                    }\n                },\n                \"nodejs12x\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"nodejs12.x\"\n                    }\n                },\n                \"nodejs14x\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"nodejs14.x\"\n                    }\n                },\n                \"nodejs16x\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"nodejs16.x\"\n                    }\n                },\n                \"java8\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"java8\"\n                    }\n                },\n                \"java8al2\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"java8.al2\"\n                    }\n                },\n                \"java11\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"java11\"\n                    }\n                },\n                \"python27\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"python2.7\"\n                    }\n                },\n                \"python36\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"python3.6\"\n                    }\n                },\n                \"python37\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"python3.7\"\n                    }\n                },\n                \"python38\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"python3.8\"\n                    }\n                },\n                \"python39\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"python3.9\"\n                    }\n                },\n                \"dotnetcore10\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"dotnetcore1.0\"\n                    }\n                },\n                \"dotnetcore20\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"dotnetcore2.0\"\n                    }\n                },\n                \"dotnetcore21\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"dotnetcore2.1\"\n                    }\n                },\n                \"dotnetcore31\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"dotnetcore3.1\"\n                    }\n                },\n                \"dotnet6\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"dotnet6\"\n                    }\n                },\n                \"dotnet8\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"dotnet8\"\n                    }\n                },\n                \"nodejs43edge\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"nodejs4.3-edge\"\n                    }\n                },\n                \"go1x\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"go1.x\"\n                    }\n                },\n                \"ruby25\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ruby2.5\"\n                    }\n                },\n                \"ruby27\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ruby2.7\"\n                    }\n                },\n                \"provided\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"provided\"\n                    }\n                },\n                \"providedal2\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"provided.al2\"\n                    }\n                },\n                \"nodejs18x\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"nodejs18.x\"\n                    }\n                },\n                \"python310\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"python3.10\"\n                    }\n                },\n                \"java17\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"java17\"\n                    }\n                },\n                \"ruby32\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ruby3.2\"\n                    }\n                },\n                \"ruby33\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ruby3.3\"\n                    }\n                },\n                \"ruby34\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ruby3.4\"\n                    }\n                },\n                \"python311\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"python3.11\"\n                    }\n                },\n                \"nodejs20x\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"nodejs20.x\"\n                    }\n                },\n                \"providedal2023\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"provided.al2023\"\n                    }\n                },\n                \"python312\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"python3.12\"\n                    }\n                },\n                \"java21\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"java21\"\n                    }\n                },\n                \"python313\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"python3.13\"\n                    }\n                },\n                \"nodejs22x\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"nodejs22.x\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.lambda#RuntimeVersionArn\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 26,\n                    \"max\": 2048\n                },\n                \"smithy.api#pattern\": \"^arn:(aws[a-zA-Z-]*):lambda:[a-z]{2}((-gov)|(-iso(b?)))?-[a-z]+-\\\\d{1}::runtime:.+$\"\n            }\n        },\n        \"com.amazonaws.lambda#RuntimeVersionConfig\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RuntimeVersionArn\": {\n                    \"target\": \"com.amazonaws.lambda#RuntimeVersionArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the runtime version you want the function to use.</p>\"\n                    }\n                },\n                \"Error\": {\n                    \"target\": \"com.amazonaws.lambda#RuntimeVersionError\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Error response when Lambda is unable to retrieve the runtime version for a function.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The ARN of the runtime and any errors that occured.</p>\"\n            }\n        },\n        \"com.amazonaws.lambda#RuntimeVersionError\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ErrorCode\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The error code.</p>\"\n                    }\n                },\n                \"Message\": {\n                    \"target\": \"com.amazonaws.lambda#SensitiveString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The error message.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Any error returned when the runtime version information for the function could not be retrieved.</p>\"\n            }\n        },\n        \"com.amazonaws.lambda#S3Bucket\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 3,\n                    \"max\": 63\n                },\n                \"smithy.api#pattern\": \"^[0-9A-Za-z\\\\.\\\\-_]*(?<!\\\\.)$\"\n            }\n        },\n        \"com.amazonaws.lambda#S3Key\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 1024\n                }\n            }\n        },\n        \"com.amazonaws.lambda#S3ObjectVersion\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 1024\n                }\n            }\n        },\n        \"com.amazonaws.lambda#ScalingConfig\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"MaximumConcurrency\": {\n                    \"target\": \"com.amazonaws.lambda#MaximumConcurrency\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Limits the number of concurrent instances that the Amazon SQS event source can invoke.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>(Amazon SQS only) The scaling configuration for the event source. To remove the configuration, pass an empty value.</p>\"\n            }\n        },\n        \"com.amazonaws.lambda#SchemaRegistryEventRecordFormat\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"JSON\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"JSON\"\n                    }\n                },\n                \"SOURCE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"SOURCE\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.lambda#SchemaRegistryUri\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 10000\n                },\n                \"smithy.api#pattern\": \"^[a-zA-Z0-9-\\\\/*:_+=.@-]*$\"\n            }\n        },\n        \"com.amazonaws.lambda#SecurityGroupId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.lambda#SecurityGroupIds\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.lambda#SecurityGroupId\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 5\n                }\n            }\n        },\n        \"com.amazonaws.lambda#SelfManagedEventSource\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Endpoints\": {\n                    \"target\": \"com.amazonaws.lambda#Endpoints\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The list of bootstrap servers for your Kafka brokers in the following format: <code>\\\"KAFKA_BOOTSTRAP_SERVERS\\\": [\\\"abc.xyz.com:xxxx\\\",\\\"abc2.xyz.com:xxxx\\\"]</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The self-managed Apache Kafka cluster for your event source.</p>\"\n            }\n        },\n        \"com.amazonaws.lambda#SelfManagedKafkaEventSourceConfig\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConsumerGroupId\": {\n                    \"target\": \"com.amazonaws.lambda#URI\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The identifier for the Kafka consumer group to join. The consumer group ID must be unique among all your Kafka event sources. After creating a Kafka event source mapping with the consumer group ID specified, you cannot update this value. For more information, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/with-kafka-process.html#services-smaa-topic-add\\\">Customizable consumer group ID</a>.</p>\"\n                    }\n                },\n                \"SchemaRegistryConfig\": {\n                    \"target\": \"com.amazonaws.lambda#KafkaSchemaRegistryConfig\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specific configuration settings for a Kafka schema registry.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Specific configuration settings for a self-managed Apache Kafka event source.</p>\"\n            }\n        },\n        \"com.amazonaws.lambda#SensitiveString\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#sensitive\": {}\n            }\n        },\n        \"com.amazonaws.lambda#ServiceException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Type\": {\n                    \"target\": \"com.amazonaws.lambda#String\"\n                },\n                \"Message\": {\n                    \"target\": \"com.amazonaws.lambda#String\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The Lambda service encountered an internal error.</p>\",\n                \"smithy.api#error\": \"server\",\n                \"smithy.api#httpError\": 500\n            }\n        },\n        \"com.amazonaws.lambda#SigningProfileVersionArns\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.lambda#Arn\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 20\n                }\n            }\n        },\n        \"com.amazonaws.lambda#SnapStart\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ApplyOn\": {\n                    \"target\": \"com.amazonaws.lambda#SnapStartApplyOn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Set to <code>PublishedVersions</code> to create a snapshot of the initialized execution environment when you publish a function version.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The function's <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/snapstart.html\\\">Lambda SnapStart</a> setting. Set <code>ApplyOn</code> to <code>PublishedVersions</code> to create a snapshot of the initialized execution environment when you publish a function version.</p>\"\n            }\n        },\n        \"com.amazonaws.lambda#SnapStartApplyOn\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"PublishedVersions\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"PublishedVersions\"\n                    }\n                },\n                \"None\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"None\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.lambda#SnapStartException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Type\": {\n                    \"target\": \"com.amazonaws.lambda#String\"\n                },\n                \"Message\": {\n                    \"target\": \"com.amazonaws.lambda#String\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The <code>afterRestore()</code> <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/snapstart-runtime-hooks.html\\\">runtime hook</a> encountered an error. For more information, check the Amazon CloudWatch logs.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.lambda#SnapStartNotReadyException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Type\": {\n                    \"target\": \"com.amazonaws.lambda#String\"\n                },\n                \"Message\": {\n                    \"target\": \"com.amazonaws.lambda#String\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Lambda is initializing your function. You can invoke the function when the <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/functions-states.html\\\">function state</a> becomes <code>Active</code>.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 409\n            }\n        },\n        \"com.amazonaws.lambda#SnapStartOptimizationStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"On\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"On\"\n                    }\n                },\n                \"Off\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Off\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.lambda#SnapStartResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ApplyOn\": {\n                    \"target\": \"com.amazonaws.lambda#SnapStartApplyOn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>When set to <code>PublishedVersions</code>, Lambda creates a snapshot of the execution environment when you publish a function version.</p>\"\n                    }\n                },\n                \"OptimizationStatus\": {\n                    \"target\": \"com.amazonaws.lambda#SnapStartOptimizationStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>When you provide a <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/configuration-versions.html#versioning-versions-using\\\">qualified Amazon Resource Name (ARN)</a>, this response element indicates whether SnapStart is activated for the specified function version.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The function's <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/snapstart.html\\\">SnapStart</a> setting.</p>\"\n            }\n        },\n        \"com.amazonaws.lambda#SnapStartTimeoutException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Type\": {\n                    \"target\": \"com.amazonaws.lambda#String\"\n                },\n                \"Message\": {\n                    \"target\": \"com.amazonaws.lambda#String\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Lambda couldn't restore the snapshot within the timeout limit.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 408\n            }\n        },\n        \"com.amazonaws.lambda#SourceAccessConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Type\": {\n                    \"target\": \"com.amazonaws.lambda#SourceAccessType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of authentication protocol, VPC components, or virtual host for your event source. For example: <code>\\\"Type\\\":\\\"SASL_SCRAM_512_AUTH\\\"</code>.</p> <ul> <li> <p> <code>BASIC_AUTH</code> – (Amazon MQ) The Secrets Manager secret that stores your broker credentials.</p> </li> <li> <p> <code>BASIC_AUTH</code> – (Self-managed Apache Kafka) The Secrets Manager ARN of your secret key used for SASL/PLAIN authentication of your Apache Kafka brokers.</p> </li> <li> <p> <code>VPC_SUBNET</code> – (Self-managed Apache Kafka) The subnets associated with your VPC. Lambda connects to these subnets to fetch data from your self-managed Apache Kafka cluster.</p> </li> <li> <p> <code>VPC_SECURITY_GROUP</code> – (Self-managed Apache Kafka) The VPC security group used to manage access to your self-managed Apache Kafka brokers.</p> </li> <li> <p> <code>SASL_SCRAM_256_AUTH</code> – (Self-managed Apache Kafka) The Secrets Manager ARN of your secret key used for SASL SCRAM-256 authentication of your self-managed Apache Kafka brokers.</p> </li> <li> <p> <code>SASL_SCRAM_512_AUTH</code> – (Amazon MSK, Self-managed Apache Kafka) The Secrets Manager ARN of your secret key used for SASL SCRAM-512 authentication of your self-managed Apache Kafka brokers.</p> </li> <li> <p> <code>VIRTUAL_HOST</code> –- (RabbitMQ) The name of the virtual host in your RabbitMQ broker. Lambda uses this RabbitMQ host as the event source. This property cannot be specified in an UpdateEventSourceMapping API call.</p> </li> <li> <p> <code>CLIENT_CERTIFICATE_TLS_AUTH</code> – (Amazon MSK, self-managed Apache Kafka) The Secrets Manager ARN of your secret key containing the certificate chain (X.509 PEM), private key (PKCS#8 PEM), and private key password (optional) used for mutual TLS authentication of your MSK/Apache Kafka brokers.</p> </li> <li> <p> <code>SERVER_ROOT_CA_CERTIFICATE</code> – (Self-managed Apache Kafka) The Secrets Manager ARN of your secret key containing the root CA certificate (X.509 PEM) used for TLS encryption of your Apache Kafka brokers. </p> </li> </ul>\"\n                    }\n                },\n                \"URI\": {\n                    \"target\": \"com.amazonaws.lambda#URI\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The value for your chosen configuration in <code>Type</code>. For example: <code>\\\"URI\\\": \\\"arn:aws:secretsmanager:us-east-1:01234567890:secret:MyBrokerSecretName\\\"</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>To secure and define access to your event source, you can specify the authentication protocol, VPC components, or virtual host.</p>\"\n            }\n        },\n        \"com.amazonaws.lambda#SourceAccessConfigurations\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.lambda#SourceAccessConfiguration\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 22\n                }\n            }\n        },\n        \"com.amazonaws.lambda#SourceAccessType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"BASIC_AUTH\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"BASIC_AUTH\"\n                    }\n                },\n                \"VPC_SUBNET\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"VPC_SUBNET\"\n                    }\n                },\n                \"VPC_SECURITY_GROUP\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"VPC_SECURITY_GROUP\"\n                    }\n                },\n                \"SASL_SCRAM_512_AUTH\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"SASL_SCRAM_512_AUTH\"\n                    }\n                },\n                \"SASL_SCRAM_256_AUTH\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"SASL_SCRAM_256_AUTH\"\n                    }\n                },\n                \"VIRTUAL_HOST\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"VIRTUAL_HOST\"\n                    }\n                },\n                \"CLIENT_CERTIFICATE_TLS_AUTH\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"CLIENT_CERTIFICATE_TLS_AUTH\"\n                    }\n                },\n                \"SERVER_ROOT_CA_CERTIFICATE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"SERVER_ROOT_CA_CERTIFICATE\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.lambda#SourceOwner\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 12\n                },\n                \"smithy.api#pattern\": \"^\\\\d{12}$\"\n            }\n        },\n        \"com.amazonaws.lambda#State\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"Pending\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Pending\"\n                    }\n                },\n                \"Active\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Active\"\n                    }\n                },\n                \"Inactive\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Inactive\"\n                    }\n                },\n                \"Failed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Failed\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.lambda#StateReason\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.lambda#StateReasonCode\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"Idle\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Idle\"\n                    }\n                },\n                \"Creating\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Creating\"\n                    }\n                },\n                \"Restoring\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Restoring\"\n                    }\n                },\n                \"EniLimitExceeded\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"EniLimitExceeded\"\n                    }\n                },\n                \"InsufficientRolePermissions\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"InsufficientRolePermissions\"\n                    }\n                },\n                \"InvalidConfiguration\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"InvalidConfiguration\"\n                    }\n                },\n                \"InternalError\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"InternalError\"\n                    }\n                },\n                \"SubnetOutOfIPAddresses\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"SubnetOutOfIPAddresses\"\n                    }\n                },\n                \"InvalidSubnet\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"InvalidSubnet\"\n                    }\n                },\n                \"InvalidSecurityGroup\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"InvalidSecurityGroup\"\n                    }\n                },\n                \"ImageDeleted\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ImageDeleted\"\n                    }\n                },\n                \"ImageAccessDenied\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ImageAccessDenied\"\n                    }\n                },\n                \"InvalidImage\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"InvalidImage\"\n                    }\n                },\n                \"KMSKeyAccessDenied\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"KMSKeyAccessDenied\"\n                    }\n                },\n                \"KMSKeyNotFound\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"KMSKeyNotFound\"\n                    }\n                },\n                \"InvalidStateKMSKey\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"InvalidStateKMSKey\"\n                    }\n                },\n                \"DisabledKMSKey\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DisabledKMSKey\"\n                    }\n                },\n                \"EFSIOError\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"EFSIOError\"\n                    }\n                },\n                \"EFSMountConnectivityError\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"EFSMountConnectivityError\"\n                    }\n                },\n                \"EFSMountFailure\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"EFSMountFailure\"\n                    }\n                },\n                \"EFSMountTimeout\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"EFSMountTimeout\"\n                    }\n                },\n                \"InvalidRuntime\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"InvalidRuntime\"\n                    }\n                },\n                \"InvalidZipFileException\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"InvalidZipFileException\"\n                    }\n                },\n                \"FunctionError\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"FunctionError\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.lambda#StatementId\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 100\n                },\n                \"smithy.api#pattern\": \"^([a-zA-Z0-9-_]+)$\"\n            }\n        },\n        \"com.amazonaws.lambda#String\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.lambda#StringList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.lambda#String\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 1500\n                }\n            }\n        },\n        \"com.amazonaws.lambda#SubnetIPAddressLimitReachedException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Type\": {\n                    \"target\": \"com.amazonaws.lambda#String\"\n                },\n                \"Message\": {\n                    \"target\": \"com.amazonaws.lambda#String\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Lambda couldn't set up VPC access for the Lambda function because one or more configured subnets has no available IP addresses.</p>\",\n                \"smithy.api#error\": \"server\",\n                \"smithy.api#httpError\": 502\n            }\n        },\n        \"com.amazonaws.lambda#SubnetId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.lambda#SubnetIds\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.lambda#SubnetId\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 16\n                }\n            }\n        },\n        \"com.amazonaws.lambda#SystemLogLevel\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"Debug\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DEBUG\"\n                    }\n                },\n                \"Info\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"INFO\"\n                    }\n                },\n                \"Warn\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"WARN\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.lambda#TagKey\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.lambda#TagKeyList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.lambda#TagKey\"\n            }\n        },\n        \"com.amazonaws.lambda#TagResource\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.lambda#TagResourceRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.lambda#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceConflictException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ServiceException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#TooManyRequestsException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.iam#conditionKeys\": [\n                    \"aws:TagKeys\",\n                    \"aws:RequestTag/${TagKey}\"\n                ],\n                \"aws.iam#iamAction\": {\n                    \"documentation\": \"Grants permission to add tags to an AWS Lambda function, event source mapping or code signing configuration resource\",\n                    \"relativeDocumentation\": \"API_TagResources.html\",\n                    \"resources\": {\n                        \"optional\": {\n                            \"eventSourceMapping\": {},\n                            \"function\": {},\n                            \"code signing config\": {}\n                        }\n                    }\n                },\n                \"smithy.api#documentation\": \"<p>Adds <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/tagging.html\\\">tags</a> to a function, event source mapping, or code signing configuration.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To add tags to an existing Lambda function\",\n                        \"documentation\": \"The following example adds a tag with the key name DEPARTMENT and a value of 'Department A' to the specified Lambda function.\",\n                        \"input\": {\n                            \"Resource\": \"arn:aws:lambda:us-west-2:123456789012:function:my-function\",\n                            \"Tags\": {\n                                \"DEPARTMENT\": \"Department A\"\n                            }\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"POST\",\n                    \"uri\": \"/2017-03-31/tags/{Resource}\",\n                    \"code\": 204\n                }\n            }\n        },\n        \"com.amazonaws.lambda#TagResourceRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Resource\": {\n                    \"target\": \"com.amazonaws.lambda#TaggableResource\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The resource's Amazon Resource Name (ARN).</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.lambda#Tags\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of tags to apply to the resource.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.lambda#TagValue\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.lambda#TaggableResource\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 256\n                },\n                \"smithy.api#pattern\": \"^arn:(aws[a-zA-Z-]*):lambda:[a-z]{2}((-gov)|(-iso([a-z]?)))?-[a-z]+-\\\\d{1}:\\\\d{12}:(function:[a-zA-Z0-9-_]+(:(\\\\$LATEST|[a-zA-Z0-9-_]+))?|code-signing-config:csc-[a-z0-9]{17}|event-source-mapping:[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12})$\"\n            }\n        },\n        \"com.amazonaws.lambda#Tags\": {\n            \"type\": \"map\",\n            \"key\": {\n                \"target\": \"com.amazonaws.lambda#TagKey\"\n            },\n            \"value\": {\n                \"target\": \"com.amazonaws.lambda#TagValue\"\n            }\n        },\n        \"com.amazonaws.lambda#TagsError\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ErrorCode\": {\n                    \"target\": \"com.amazonaws.lambda#TagsErrorCode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The error code.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Message\": {\n                    \"target\": \"com.amazonaws.lambda#TagsErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The error message.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>An object that contains details about an error related to retrieving tags.</p>\"\n            }\n        },\n        \"com.amazonaws.lambda#TagsErrorCode\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 10,\n                    \"max\": 21\n                },\n                \"smithy.api#pattern\": \"^[A-Za-z]+Exception$\"\n            }\n        },\n        \"com.amazonaws.lambda#TagsErrorMessage\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 84,\n                    \"max\": 1000\n                },\n                \"smithy.api#pattern\": \"^.*$\"\n            }\n        },\n        \"com.amazonaws.lambda#ThrottleReason\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ConcurrentInvocationLimitExceeded\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ConcurrentInvocationLimitExceeded\"\n                    }\n                },\n                \"FunctionInvocationRateLimitExceeded\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"FunctionInvocationRateLimitExceeded\"\n                    }\n                },\n                \"ReservedFunctionConcurrentInvocationLimitExceeded\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ReservedFunctionConcurrentInvocationLimitExceeded\"\n                    }\n                },\n                \"ReservedFunctionInvocationRateLimitExceeded\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ReservedFunctionInvocationRateLimitExceeded\"\n                    }\n                },\n                \"CallerRateLimitExceeded\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"CallerRateLimitExceeded\"\n                    }\n                },\n                \"ConcurrentSnapshotCreateLimitExceeded\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ConcurrentSnapshotCreateLimitExceeded\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.lambda#Timeout\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1\n                }\n            }\n        },\n        \"com.amazonaws.lambda#Timestamp\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.lambda#TooManyRequestsException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"retryAfterSeconds\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of seconds the caller should wait before retrying.</p>\",\n                        \"smithy.api#httpHeader\": \"Retry-After\"\n                    }\n                },\n                \"Type\": {\n                    \"target\": \"com.amazonaws.lambda#String\"\n                },\n                \"message\": {\n                    \"target\": \"com.amazonaws.lambda#String\"\n                },\n                \"Reason\": {\n                    \"target\": \"com.amazonaws.lambda#ThrottleReason\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The request throughput limit was exceeded. For more information, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html#api-requests\\\">Lambda quotas</a>.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 429\n            }\n        },\n        \"com.amazonaws.lambda#Topic\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 249\n                },\n                \"smithy.api#pattern\": \"^[^.]([a-zA-Z0-9\\\\-_.]+)$\"\n            }\n        },\n        \"com.amazonaws.lambda#Topics\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.lambda#Topic\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 1\n                }\n            }\n        },\n        \"com.amazonaws.lambda#TracingConfig\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Mode\": {\n                    \"target\": \"com.amazonaws.lambda#TracingMode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tracing mode.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The function's <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/services-xray.html\\\">X-Ray</a> tracing configuration. To sample and record incoming requests, set <code>Mode</code> to <code>Active</code>.</p>\"\n            }\n        },\n        \"com.amazonaws.lambda#TracingConfigResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Mode\": {\n                    \"target\": \"com.amazonaws.lambda#TracingMode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tracing mode.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The function's X-Ray tracing configuration.</p>\"\n            }\n        },\n        \"com.amazonaws.lambda#TracingMode\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"Active\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Active\"\n                    }\n                },\n                \"PassThrough\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"PassThrough\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.lambda#TumblingWindowInSeconds\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 0,\n                    \"max\": 900\n                }\n            }\n        },\n        \"com.amazonaws.lambda#URI\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 200\n                },\n                \"smithy.api#pattern\": \"^[a-zA-Z0-9-\\\\/*:_+=.@-]*$\"\n            }\n        },\n        \"com.amazonaws.lambda#UnqualifiedFunctionName\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 140\n                },\n                \"smithy.api#pattern\": \"^(arn:(aws[a-zA-Z-]*)?:lambda:)?([a-z]{2}((-gov)|(-iso([a-z]?)))?-[a-z]+-\\\\d{1}:)?(\\\\d{12}:)?(function:)?([a-zA-Z0-9-_]+)$\"\n            }\n        },\n        \"com.amazonaws.lambda#UnreservedConcurrentExecutions\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 0\n                }\n            }\n        },\n        \"com.amazonaws.lambda#UnsupportedMediaTypeException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Type\": {\n                    \"target\": \"com.amazonaws.lambda#String\"\n                },\n                \"message\": {\n                    \"target\": \"com.amazonaws.lambda#String\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The content type of the <code>Invoke</code> request body is not JSON.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 415\n            }\n        },\n        \"com.amazonaws.lambda#UntagResource\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.lambda#UntagResourceRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.lambda#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceConflictException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ServiceException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#TooManyRequestsException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.iam#conditionKeys\": [\n                    \"aws:TagKeys\"\n                ],\n                \"aws.iam#iamAction\": {\n                    \"documentation\": \"Grants permission to remove tags from an AWS Lambda function, event source mapping or code signing configuration resource\",\n                    \"relativeDocumentation\": \"API_UntagResource.html\",\n                    \"resources\": {\n                        \"optional\": {\n                            \"eventSourceMapping\": {},\n                            \"function\": {},\n                            \"code signing config\": {}\n                        }\n                    }\n                },\n                \"smithy.api#documentation\": \"<p>Removes <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/tagging.html\\\">tags</a> from a function, event source mapping, or code signing configuration.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To remove tags from an existing Lambda function\",\n                        \"documentation\": \"The following example removes the tag with the key name DEPARTMENT tag from the my-function Lambda function.\",\n                        \"input\": {\n                            \"Resource\": \"arn:aws:lambda:us-west-2:123456789012:function:my-function\",\n                            \"TagKeys\": [\n                                \"DEPARTMENT\"\n                            ]\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"DELETE\",\n                    \"uri\": \"/2017-03-31/tags/{Resource}\",\n                    \"code\": 204\n                }\n            }\n        },\n        \"com.amazonaws.lambda#UntagResourceRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Resource\": {\n                    \"target\": \"com.amazonaws.lambda#TaggableResource\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The resource's Amazon Resource Name (ARN).</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TagKeys\": {\n                    \"target\": \"com.amazonaws.lambda#TagKeyList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of tag keys to remove from the resource.</p>\",\n                        \"smithy.api#httpQuery\": \"tagKeys\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.lambda#UpdateAlias\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.lambda#UpdateAliasRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.lambda#AliasConfiguration\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.lambda#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#PreconditionFailedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceConflictException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ServiceException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#TooManyRequestsException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.iam#iamAction\": {\n                    \"documentation\": \"Grants permission to update the configuration of an AWS Lambda function's alias\",\n                    \"relativeDocumentation\": \"API_UpdateAlias.html\",\n                    \"resources\": {\n                        \"required\": {\n                            \"function\": {}\n                        }\n                    }\n                },\n                \"smithy.api#documentation\": \"<p>Updates the configuration of a Lambda function <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/configuration-aliases.html\\\">alias</a>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To update a function alias\",\n                        \"documentation\": \"The following example updates the alias named BLUE to send 30% of traffic to version 2 and 70% to version 1.\",\n                        \"input\": {\n                            \"FunctionName\": \"my-function\",\n                            \"Name\": \"BLUE\",\n                            \"FunctionVersion\": \"2\",\n                            \"RoutingConfig\": {\n                                \"AdditionalVersionWeights\": {\n                                    \"1\": 0.7\n                                }\n                            }\n                        },\n                        \"output\": {\n                            \"FunctionVersion\": \"2\",\n                            \"Name\": \"BLUE\",\n                            \"AliasArn\": \"arn:aws:lambda:us-west-2:123456789012:function:my-function:BLUE\",\n                            \"RevisionId\": \"594f41fb-xmpl-4c20-95c7-6ca5f2a92c93\",\n                            \"Description\": \"Production environment BLUE.\",\n                            \"RoutingConfig\": {\n                                \"AdditionalVersionWeights\": {\n                                    \"1\": 0.7\n                                }\n                            }\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"PUT\",\n                    \"uri\": \"/2015-03-31/functions/{FunctionName}/aliases/{Name}\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.lambda#UpdateAliasRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"FunctionName\": {\n                    \"target\": \"com.amazonaws.lambda#FunctionName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name or ARN of the Lambda function.</p> <p class=\\\"title\\\"> <b>Name formats</b> </p> <ul> <li> <p> <b>Function name</b> - <code>MyFunction</code>.</p> </li> <li> <p> <b>Function ARN</b> - <code>arn:aws:lambda:us-west-2:123456789012:function:MyFunction</code>.</p> </li> <li> <p> <b>Partial ARN</b> - <code>123456789012:function:MyFunction</code>.</p> </li> </ul> <p>The length constraint applies only to the full ARN. If you specify only the function name, it is limited to 64 characters in length.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Name\": {\n                    \"target\": \"com.amazonaws.lambda#Alias\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the alias.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {},\n                        \"smithy.api#resourceIdentifier\": \"Alias\"\n                    }\n                },\n                \"FunctionVersion\": {\n                    \"target\": \"com.amazonaws.lambda#Version\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The function version that the alias invokes.</p>\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.lambda#Description\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A description of the alias.</p>\"\n                    }\n                },\n                \"RoutingConfig\": {\n                    \"target\": \"com.amazonaws.lambda#AliasRoutingConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/configuration-aliases.html#configuring-alias-routing\\\">routing configuration</a> of the alias.</p>\"\n                    }\n                },\n                \"RevisionId\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Only update the alias if the revision ID matches the ID that's specified. Use this option to avoid modifying an alias that has changed since you last read it.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.lambda#UpdateCodeSigningConfig\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.lambda#UpdateCodeSigningConfigRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.lambda#UpdateCodeSigningConfigResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.lambda#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ServiceException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.iam#iamAction\": {\n                    \"documentation\": \"Grants permission to update an AWS Lambda code signing config\",\n                    \"relativeDocumentation\": \"API_UpdateCodeSigningConfig.html\",\n                    \"resources\": {\n                        \"required\": {\n                            \"code signing config\": {}\n                        }\n                    }\n                },\n                \"smithy.api#documentation\": \"<p>Update the code signing configuration. Changes to the code signing configuration take effect the next time a user tries to deploy a code package to the function. </p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"PUT\",\n                    \"uri\": \"/2020-04-22/code-signing-configs/{CodeSigningConfigArn}\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.lambda#UpdateCodeSigningConfigRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CodeSigningConfigArn\": {\n                    \"target\": \"com.amazonaws.lambda#CodeSigningConfigArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The The Amazon Resource Name (ARN) of the code signing configuration.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.lambda#Description\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Descriptive name for this code signing configuration.</p>\"\n                    }\n                },\n                \"AllowedPublishers\": {\n                    \"target\": \"com.amazonaws.lambda#AllowedPublishers\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Signing profiles for this code signing configuration.</p>\"\n                    }\n                },\n                \"CodeSigningPolicies\": {\n                    \"target\": \"com.amazonaws.lambda#CodeSigningPolicies\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The code signing policy.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.lambda#UpdateCodeSigningConfigResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CodeSigningConfig\": {\n                    \"target\": \"com.amazonaws.lambda#CodeSigningConfig\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The code signing configuration</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.lambda#UpdateEventSourceMapping\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.lambda#UpdateEventSourceMappingRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.lambda#EventSourceMappingConfiguration\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.lambda#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceConflictException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceInUseException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ServiceException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#TooManyRequestsException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.iam#conditionKeys\": [\n                    \"lambda:FunctionArn\"\n                ],\n                \"aws.iam#iamAction\": {\n                    \"documentation\": \"Grants permission to update the configuration of an AWS Lambda event source mapping\",\n                    \"relativeDocumentation\": \"API_UpdateEventSourceMapping.html\",\n                    \"resources\": {\n                        \"required\": {\n                            \"eventSourceMapping\": {}\n                        }\n                    }\n                },\n                \"smithy.api#documentation\": \"<p>Updates an event source mapping. You can change the function that Lambda invokes, or pause invocation and resume later from the same location.</p> <p>For details about how to configure different event sources, see the following topics. </p> <ul> <li> <p> <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/with-ddb.html#services-dynamodb-eventsourcemapping\\\"> Amazon DynamoDB Streams</a> </p> </li> <li> <p> <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/with-kinesis.html#services-kinesis-eventsourcemapping\\\"> Amazon Kinesis</a> </p> </li> <li> <p> <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/with-sqs.html#events-sqs-eventsource\\\"> Amazon SQS</a> </p> </li> <li> <p> <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/with-mq.html#services-mq-eventsourcemapping\\\"> Amazon MQ and RabbitMQ</a> </p> </li> <li> <p> <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/with-msk.html\\\"> Amazon MSK</a> </p> </li> <li> <p> <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/kafka-smaa.html\\\"> Apache Kafka</a> </p> </li> <li> <p> <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/with-documentdb.html\\\"> Amazon DocumentDB</a> </p> </li> </ul> <p>The following error handling options are available only for DynamoDB and Kinesis event sources:</p> <ul> <li> <p> <code>BisectBatchOnFunctionError</code> – If the function returns an error, split the batch in two and retry.</p> </li> <li> <p> <code>MaximumRecordAgeInSeconds</code> – Discard records older than the specified age. The default value is infinite (-1). When set to infinite (-1), failed records are retried until the record expires</p> </li> <li> <p> <code>MaximumRetryAttempts</code> – Discard records after the specified number of retries. The default value is infinite (-1). When set to infinite (-1), failed records are retried until the record expires.</p> </li> <li> <p> <code>ParallelizationFactor</code> – Process multiple batches from each shard concurrently.</p> </li> </ul> <p>For stream sources (DynamoDB, Kinesis, Amazon MSK, and self-managed Apache Kafka), the following option is also available:</p> <ul> <li> <p> <code>OnFailure</code> – Send discarded records to an Amazon SQS queue, Amazon SNS topic, or Amazon S3 bucket. For more information, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/invocation-async-retain-records.html#invocation-async-destinations\\\">Adding a destination</a>.</p> </li> </ul> <p>For information about which configuration parameters apply to each event source, see the following topics.</p> <ul> <li> <p> <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/with-ddb.html#services-ddb-params\\\"> Amazon DynamoDB Streams</a> </p> </li> <li> <p> <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/with-kinesis.html#services-kinesis-params\\\"> Amazon Kinesis</a> </p> </li> <li> <p> <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/with-sqs.html#services-sqs-params\\\"> Amazon SQS</a> </p> </li> <li> <p> <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/with-mq.html#services-mq-params\\\"> Amazon MQ and RabbitMQ</a> </p> </li> <li> <p> <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/with-msk.html#services-msk-parms\\\"> Amazon MSK</a> </p> </li> <li> <p> <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/with-kafka.html#services-kafka-parms\\\"> Apache Kafka</a> </p> </li> <li> <p> <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/with-documentdb.html#docdb-configuration\\\"> Amazon DocumentDB</a> </p> </li> </ul>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To update a Lambda function event source mapping\",\n                        \"documentation\": \"This operation updates a Lambda function event source mapping\",\n                        \"input\": {\n                            \"UUID\": \"1234xCy789012\",\n                            \"FunctionName\": \"myFunction\",\n                            \"Enabled\": true,\n                            \"BatchSize\": 123\n                        },\n                        \"output\": {\n                            \"UUID\": \"1234xCy789012\",\n                            \"BatchSize\": 123,\n                            \"EventSourceArn\": \"arn:aws:s3:::examplebucket/*\",\n                            \"FunctionArn\": \"arn:aws:lambda:us-west-2:123456789012:function:myFunction\",\n                            \"LastModified\": \"2016-11-21T19:49:20.006Z\",\n                            \"LastProcessingResult\": \"\",\n                            \"State\": \"\",\n                            \"StateTransitionReason\": \"\"\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"PUT\",\n                    \"uri\": \"/2015-03-31/event-source-mappings/{UUID}\",\n                    \"code\": 202\n                }\n            }\n        },\n        \"com.amazonaws.lambda#UpdateEventSourceMappingRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"UUID\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The identifier of the event source mapping.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"FunctionName\": {\n                    \"target\": \"com.amazonaws.lambda#FunctionName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name or ARN of the Lambda function.</p> <p class=\\\"title\\\"> <b>Name formats</b> </p> <ul> <li> <p> <b>Function name</b> – <code>MyFunction</code>.</p> </li> <li> <p> <b>Function ARN</b> – <code>arn:aws:lambda:us-west-2:123456789012:function:MyFunction</code>.</p> </li> <li> <p> <b>Version or Alias ARN</b> – <code>arn:aws:lambda:us-west-2:123456789012:function:MyFunction:PROD</code>.</p> </li> <li> <p> <b>Partial ARN</b> – <code>123456789012:function:MyFunction</code>.</p> </li> </ul> <p>The length constraint applies only to the full ARN. If you specify only the function name, it's limited to 64 characters in length.</p>\"\n                    }\n                },\n                \"Enabled\": {\n                    \"target\": \"com.amazonaws.lambda#Enabled\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>When true, the event source mapping is active. When false, Lambda pauses polling and invocation.</p> <p>Default: True</p>\"\n                    }\n                },\n                \"BatchSize\": {\n                    \"target\": \"com.amazonaws.lambda#BatchSize\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of records in each batch that Lambda pulls from your stream or queue and sends to your function. Lambda passes all of the records in the batch to the function in a single call, up to the payload limit for synchronous invocation (6 MB).</p> <ul> <li> <p> <b>Amazon Kinesis</b> – Default 100. Max 10,000.</p> </li> <li> <p> <b>Amazon DynamoDB Streams</b> – Default 100. Max 10,000.</p> </li> <li> <p> <b>Amazon Simple Queue Service</b> – Default 10. For standard queues the max is 10,000. For FIFO queues the max is 10.</p> </li> <li> <p> <b>Amazon Managed Streaming for Apache Kafka</b> – Default 100. Max 10,000.</p> </li> <li> <p> <b>Self-managed Apache Kafka</b> – Default 100. Max 10,000.</p> </li> <li> <p> <b>Amazon MQ (ActiveMQ and RabbitMQ)</b> – Default 100. Max 10,000.</p> </li> <li> <p> <b>DocumentDB</b> – Default 100. Max 10,000.</p> </li> </ul>\"\n                    }\n                },\n                \"FilterCriteria\": {\n                    \"target\": \"com.amazonaws.lambda#FilterCriteria\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An object that defines the filter criteria that determine whether Lambda should process an event. For more information, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/invocation-eventfiltering.html\\\">Lambda event filtering</a>.</p>\"\n                    }\n                },\n                \"MaximumBatchingWindowInSeconds\": {\n                    \"target\": \"com.amazonaws.lambda#MaximumBatchingWindowInSeconds\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum amount of time, in seconds, that Lambda spends gathering records before invoking the function. You can configure <code>MaximumBatchingWindowInSeconds</code> to any value from 0 seconds to 300 seconds in increments of seconds.</p> <p>For Kinesis, DynamoDB, and Amazon SQS event sources, the default batching window is 0 seconds. For Amazon MSK, Self-managed Apache Kafka, Amazon MQ, and DocumentDB event sources, the default batching window is 500 ms. Note that because you can only change <code>MaximumBatchingWindowInSeconds</code> in increments of seconds, you cannot revert back to the 500 ms default batching window after you have changed it. To restore the default batching window, you must create a new event source mapping.</p> <p>Related setting: For Kinesis, DynamoDB, and Amazon SQS event sources, when you set <code>BatchSize</code> to a value greater than 10, you must set <code>MaximumBatchingWindowInSeconds</code> to at least 1.</p>\"\n                    }\n                },\n                \"DestinationConfig\": {\n                    \"target\": \"com.amazonaws.lambda#DestinationConfig\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>(Kinesis, DynamoDB Streams, Amazon MSK, and self-managed Kafka only) A configuration object that specifies the destination of an event after Lambda processes it.</p>\"\n                    }\n                },\n                \"MaximumRecordAgeInSeconds\": {\n                    \"target\": \"com.amazonaws.lambda#MaximumRecordAgeInSeconds\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>(Kinesis and DynamoDB Streams only) Discard records older than the specified age. The default value is infinite (-1).</p>\"\n                    }\n                },\n                \"BisectBatchOnFunctionError\": {\n                    \"target\": \"com.amazonaws.lambda#BisectBatchOnFunctionError\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>(Kinesis and DynamoDB Streams only) If the function returns an error, split the batch in two and retry.</p>\"\n                    }\n                },\n                \"MaximumRetryAttempts\": {\n                    \"target\": \"com.amazonaws.lambda#MaximumRetryAttemptsEventSourceMapping\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>(Kinesis and DynamoDB Streams only) Discard records after the specified number of retries. The default value is infinite (-1). When set to infinite (-1), failed records are retried until the record expires.</p>\"\n                    }\n                },\n                \"ParallelizationFactor\": {\n                    \"target\": \"com.amazonaws.lambda#ParallelizationFactor\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>(Kinesis and DynamoDB Streams only) The number of batches to process from each shard concurrently.</p>\"\n                    }\n                },\n                \"SourceAccessConfigurations\": {\n                    \"target\": \"com.amazonaws.lambda#SourceAccessConfigurations\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An array of authentication protocols or VPC components required to secure your event source.</p>\"\n                    }\n                },\n                \"TumblingWindowInSeconds\": {\n                    \"target\": \"com.amazonaws.lambda#TumblingWindowInSeconds\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>(Kinesis and DynamoDB Streams only) The duration in seconds of a processing window for DynamoDB and Kinesis Streams event sources. A value of 0 seconds indicates no tumbling window.</p>\"\n                    }\n                },\n                \"FunctionResponseTypes\": {\n                    \"target\": \"com.amazonaws.lambda#FunctionResponseTypeList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>(Kinesis, DynamoDB Streams, and Amazon SQS) A list of current response type enums applied to the event source mapping.</p>\"\n                    }\n                },\n                \"ScalingConfig\": {\n                    \"target\": \"com.amazonaws.lambda#ScalingConfig\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>(Amazon SQS only) The scaling configuration for the event source. For more information, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/with-sqs.html#events-sqs-max-concurrency\\\">Configuring maximum concurrency for Amazon SQS event sources</a>.</p>\"\n                    }\n                },\n                \"AmazonManagedKafkaEventSourceConfig\": {\n                    \"target\": \"com.amazonaws.lambda#AmazonManagedKafkaEventSourceConfig\"\n                },\n                \"SelfManagedKafkaEventSourceConfig\": {\n                    \"target\": \"com.amazonaws.lambda#SelfManagedKafkaEventSourceConfig\"\n                },\n                \"DocumentDBEventSourceConfig\": {\n                    \"target\": \"com.amazonaws.lambda#DocumentDBEventSourceConfig\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specific configuration settings for a DocumentDB event source.</p>\"\n                    }\n                },\n                \"KMSKeyArn\": {\n                    \"target\": \"com.amazonaws.lambda#KMSKeyArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The ARN of the Key Management Service (KMS) customer managed key that Lambda uses to encrypt your function's <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/invocation-eventfiltering.html#filtering-basics\\\">filter criteria</a>. By default, Lambda does not encrypt your filter criteria object. Specify this property to encrypt data using your own customer managed key. </p>\"\n                    }\n                },\n                \"MetricsConfig\": {\n                    \"target\": \"com.amazonaws.lambda#EventSourceMappingMetricsConfig\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The metrics configuration for your event source. For more information, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/monitoring-metrics-types.html#event-source-mapping-metrics\\\">Event source mapping metrics</a>.</p>\"\n                    }\n                },\n                \"ProvisionedPollerConfig\": {\n                    \"target\": \"com.amazonaws.lambda#ProvisionedPollerConfig\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>(Amazon MSK and self-managed Apache Kafka only) The provisioned mode configuration for the event source. For more information, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/invocation-eventsourcemapping.html#invocation-eventsourcemapping-provisioned-mode\\\">provisioned mode</a>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.lambda#UpdateFunctionCode\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.lambda#UpdateFunctionCodeRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.lambda#FunctionConfiguration\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.lambda#CodeSigningConfigNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#CodeStorageExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#CodeVerificationFailedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#InvalidCodeSignatureException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#PreconditionFailedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceConflictException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ServiceException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#TooManyRequestsException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.iam#iamAction\": {\n                    \"documentation\": \"Grants permission to update the code of an AWS Lambda function\",\n                    \"relativeDocumentation\": \"API_UpdateFunctionCode.html\",\n                    \"resources\": {\n                        \"required\": {\n                            \"function\": {}\n                        }\n                    }\n                },\n                \"smithy.api#documentation\": \"<p>Updates a Lambda function's code. If code signing is enabled for the function, the code package must be signed by a trusted publisher. For more information, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/configuration-codesigning.html\\\">Configuring code signing for Lambda</a>.</p> <p>If the function's package type is <code>Image</code>, then you must specify the code package in <code>ImageUri</code> as the URI of a <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/lambda-images.html\\\">container image</a> in the Amazon ECR registry.</p> <p>If the function's package type is <code>Zip</code>, then you must specify the deployment package as a <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-package.html#gettingstarted-package-zip\\\">.zip file archive</a>. Enter the Amazon S3 bucket and key of the code .zip file location. You can also provide the function code inline using the <code>ZipFile</code> field.</p> <p>The code in the deployment package must be compatible with the target instruction set architecture of the function (<code>x86-64</code> or <code>arm64</code>).</p> <p>The function's code is locked when you publish a version. You can't modify the code of a published version, only the unpublished version.</p> <note> <p>For a function defined as a container image, Lambda resolves the image tag to an image digest. In Amazon ECR, if you update the image tag to a new image, Lambda does not automatically update the function.</p> </note>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To update a Lambda function's code\",\n                        \"documentation\": \"The following example replaces the code of the unpublished ($LATEST) version of a function named my-function with the contents of the specified zip file in Amazon S3.\",\n                        \"input\": {\n                            \"FunctionName\": \"my-function\",\n                            \"S3Bucket\": \"my-bucket-1xpuxmplzrlbh\",\n                            \"S3Key\": \"function.zip\"\n                        },\n                        \"output\": {\n                            \"TracingConfig\": {\n                                \"Mode\": \"PassThrough\"\n                            },\n                            \"CodeSha256\": \"PFn4S+er27qk+UuZSTKEQfNKG/XNn7QJs90mJgq6oH8=\",\n                            \"FunctionName\": \"my-function\",\n                            \"CodeSize\": 308,\n                            \"RevisionId\": \"873282ed-xmpl-4dc8-a069-d0c647e470c6\",\n                            \"MemorySize\": 128,\n                            \"FunctionArn\": \"arn:aws:lambda:us-east-2:123456789012:function:my-function\",\n                            \"Version\": \"$LATEST\",\n                            \"Role\": \"arn:aws:iam::123456789012:role/lambda-role\",\n                            \"Timeout\": 3,\n                            \"LastModified\": \"2019-08-14T22:26:11.234+0000\",\n                            \"Handler\": \"index.handler\",\n                            \"Runtime\": \"nodejs12.x\",\n                            \"Description\": \"\"\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"PUT\",\n                    \"uri\": \"/2015-03-31/functions/{FunctionName}/code\",\n                    \"code\": 200\n                },\n                \"smithy.api#suppress\": [\n                    \"DefaultValueInUpdate\"\n                ]\n            }\n        },\n        \"com.amazonaws.lambda#UpdateFunctionCodeRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"FunctionName\": {\n                    \"target\": \"com.amazonaws.lambda#FunctionName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name or ARN of the Lambda function.</p> <p class=\\\"title\\\"> <b>Name formats</b> </p> <ul> <li> <p> <b>Function name</b> – <code>my-function</code>.</p> </li> <li> <p> <b>Function ARN</b> – <code>arn:aws:lambda:us-west-2:123456789012:function:my-function</code>.</p> </li> <li> <p> <b>Partial ARN</b> – <code>123456789012:function:my-function</code>.</p> </li> </ul> <p>The length constraint applies only to the full ARN. If you specify only the function name, it is limited to 64 characters in length.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ZipFile\": {\n                    \"target\": \"com.amazonaws.lambda#Blob\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The base64-encoded contents of the deployment package. Amazon Web Services SDK and CLI clients handle the encoding for you. Use only with a function defined with a .zip file archive deployment package.</p>\"\n                    }\n                },\n                \"S3Bucket\": {\n                    \"target\": \"com.amazonaws.lambda#S3Bucket\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An Amazon S3 bucket in the same Amazon Web Services Region as your function. The bucket can be in a different Amazon Web Services account. Use only with a function defined with a .zip file archive deployment package.</p>\"\n                    }\n                },\n                \"S3Key\": {\n                    \"target\": \"com.amazonaws.lambda#S3Key\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon S3 key of the deployment package. Use only with a function defined with a .zip file archive deployment package.</p>\"\n                    }\n                },\n                \"S3ObjectVersion\": {\n                    \"target\": \"com.amazonaws.lambda#S3ObjectVersion\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>For versioned objects, the version of the deployment package object to use.</p>\"\n                    }\n                },\n                \"ImageUri\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>URI of a container image in the Amazon ECR registry. Do not use for a function defined with a .zip file archive.</p>\"\n                    }\n                },\n                \"Publish\": {\n                    \"target\": \"com.amazonaws.lambda#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Set to true to publish a new version of the function after updating the code. This has the same effect as calling <a>PublishVersion</a> separately.</p>\"\n                    }\n                },\n                \"DryRun\": {\n                    \"target\": \"com.amazonaws.lambda#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Set to true to validate the request parameters and access permissions without modifying the function code.</p>\"\n                    }\n                },\n                \"RevisionId\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Update the function only if the revision ID matches the ID that's specified. Use this option to avoid modifying a function that has changed since you last read it.</p>\"\n                    }\n                },\n                \"Architectures\": {\n                    \"target\": \"com.amazonaws.lambda#ArchitecturesList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The instruction set architecture that the function supports. Enter a string array with one of the valid values (arm64 or x86_64). The default value is <code>x86_64</code>.</p>\"\n                    }\n                },\n                \"SourceKMSKeyArn\": {\n                    \"target\": \"com.amazonaws.lambda#KMSKeyArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the Key Management Service (KMS) customer managed key that's used to encrypt your function's .zip deployment package. If you don't provide a customer managed key, Lambda uses an Amazon Web Services managed key.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.lambda#UpdateFunctionConfiguration\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.lambda#UpdateFunctionConfigurationRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.lambda#FunctionConfiguration\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.lambda#CodeSigningConfigNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#CodeVerificationFailedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#InvalidCodeSignatureException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#PreconditionFailedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceConflictException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ServiceException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#TooManyRequestsException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.iam#conditionKeys\": [\n                    \"lambda:VpcIds\",\n                    \"lambda:SubnetIds\",\n                    \"lambda:SecurityGroupIds\",\n                    \"lambda:Layer\"\n                ],\n                \"aws.iam#iamAction\": {\n                    \"documentation\": \"Grants permission to modify the version-specific settings of an AWS Lambda function\",\n                    \"relativeDocumentation\": \"API_UpdateFunctionConfiguration.html\",\n                    \"resources\": {\n                        \"required\": {\n                            \"function\": {}\n                        }\n                    }\n                },\n                \"smithy.api#documentation\": \"<p>Modify the version-specific settings of a Lambda function.</p> <p>When you update a function, Lambda provisions an instance of the function and its supporting resources. If your function connects to a VPC, this process can take a minute. During this time, you can't modify the function, but you can still invoke it. The <code>LastUpdateStatus</code>, <code>LastUpdateStatusReason</code>, and <code>LastUpdateStatusReasonCode</code> fields in the response from <a>GetFunctionConfiguration</a> indicate when the update is complete and the function is processing events with the new configuration. For more information, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/functions-states.html\\\">Lambda function states</a>.</p> <p>These settings can vary between versions of a function and are locked when you publish a version. You can't modify the configuration of a published version, only the unpublished version.</p> <p>To configure function concurrency, use <a>PutFunctionConcurrency</a>. To grant invoke permissions to an Amazon Web Services account or Amazon Web Services service, use <a>AddPermission</a>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To update a Lambda function's configuration\",\n                        \"documentation\": \"The following example modifies the memory size to be 256 MB for the unpublished ($LATEST) version of a function named my-function.\",\n                        \"input\": {\n                            \"FunctionName\": \"my-function\",\n                            \"MemorySize\": 256\n                        },\n                        \"output\": {\n                            \"TracingConfig\": {\n                                \"Mode\": \"PassThrough\"\n                            },\n                            \"CodeSha256\": \"PFn4S+er27qk+UuZSTKEQfNKG/XNn7QJs90mJgq6oH8=\",\n                            \"FunctionName\": \"my-function\",\n                            \"CodeSize\": 308,\n                            \"RevisionId\": \"873282ed-xmpl-4dc8-a069-d0c647e470c6\",\n                            \"MemorySize\": 256,\n                            \"FunctionArn\": \"arn:aws:lambda:us-east-2:123456789012:function:my-function\",\n                            \"Version\": \"$LATEST\",\n                            \"Role\": \"arn:aws:iam::123456789012:role/lambda-role\",\n                            \"Timeout\": 3,\n                            \"LastModified\": \"2019-08-14T22:26:11.234+0000\",\n                            \"Handler\": \"index.handler\",\n                            \"Runtime\": \"nodejs12.x\",\n                            \"Description\": \"\"\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"PUT\",\n                    \"uri\": \"/2015-03-31/functions/{FunctionName}/configuration\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.lambda#UpdateFunctionConfigurationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"FunctionName\": {\n                    \"target\": \"com.amazonaws.lambda#FunctionName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name or ARN of the Lambda function.</p> <p class=\\\"title\\\"> <b>Name formats</b> </p> <ul> <li> <p> <b>Function name</b> – <code>my-function</code>.</p> </li> <li> <p> <b>Function ARN</b> – <code>arn:aws:lambda:us-west-2:123456789012:function:my-function</code>.</p> </li> <li> <p> <b>Partial ARN</b> – <code>123456789012:function:my-function</code>.</p> </li> </ul> <p>The length constraint applies only to the full ARN. If you specify only the function name, it is limited to 64 characters in length.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Role\": {\n                    \"target\": \"com.amazonaws.lambda#RoleArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the function's execution role.</p>\"\n                    }\n                },\n                \"Handler\": {\n                    \"target\": \"com.amazonaws.lambda#Handler\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the method within your code that Lambda calls to run your function. Handler is required if the deployment package is a .zip file archive. The format includes the file name. It can also include namespaces and other qualifiers, depending on the runtime. For more information, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/foundation-progmodel.html\\\">Lambda programming model</a>.</p>\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.lambda#Description\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A description of the function.</p>\"\n                    }\n                },\n                \"Timeout\": {\n                    \"target\": \"com.amazonaws.lambda#Timeout\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The amount of time (in seconds) that Lambda allows a function to run before stopping it. The default is 3 seconds. The maximum allowed value is 900 seconds. For more information, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/runtimes-context.html\\\">Lambda execution environment</a>.</p>\"\n                    }\n                },\n                \"MemorySize\": {\n                    \"target\": \"com.amazonaws.lambda#MemorySize\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The amount of <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/configuration-function-common.html#configuration-memory-console\\\">memory available to the function</a> at runtime. Increasing the function memory also increases its CPU allocation. The default value is 128 MB. The value can be any multiple of 1 MB.</p>\"\n                    }\n                },\n                \"VpcConfig\": {\n                    \"target\": \"com.amazonaws.lambda#VpcConfig\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>For network connectivity to Amazon Web Services resources in a VPC, specify a list of security groups and subnets in the VPC. When you connect a function to a VPC, it can access resources and the internet only through that VPC. For more information, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/configuration-vpc.html\\\">Configuring a Lambda function to access resources in a VPC</a>.</p>\"\n                    }\n                },\n                \"Environment\": {\n                    \"target\": \"com.amazonaws.lambda#Environment\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Environment variables that are accessible from function code during execution.</p>\"\n                    }\n                },\n                \"Runtime\": {\n                    \"target\": \"com.amazonaws.lambda#Runtime\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The identifier of the function's <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html\\\"> runtime</a>. Runtime is required if the deployment package is a .zip file archive. Specifying a runtime results in an error if you're deploying a function using a container image.</p> <p>The following list includes deprecated runtimes. Lambda blocks creating new functions and updating existing functions shortly after each runtime is deprecated. For more information, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html#runtime-deprecation-levels\\\">Runtime use after deprecation</a>.</p> <p>For a list of all currently supported runtimes, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/lambda-runtimes.html#runtimes-supported\\\">Supported runtimes</a>.</p>\"\n                    }\n                },\n                \"DeadLetterConfig\": {\n                    \"target\": \"com.amazonaws.lambda#DeadLetterConfig\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A dead-letter queue configuration that specifies the queue or topic where Lambda sends asynchronous events when they fail processing. For more information, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/invocation-async.html#invocation-dlq\\\">Dead-letter queues</a>.</p>\"\n                    }\n                },\n                \"KMSKeyArn\": {\n                    \"target\": \"com.amazonaws.lambda#KMSKeyArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the Key Management Service (KMS) customer managed key that's used to encrypt the following resources:</p> <ul> <li> <p>The function's <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/configuration-envvars.html#configuration-envvars-encryption\\\">environment variables</a>.</p> </li> <li> <p>The function's <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/snapstart-security.html\\\">Lambda SnapStart</a> snapshots.</p> </li> <li> <p>When used with <code>SourceKMSKeyArn</code>, the unzipped version of the .zip deployment package that's used for function invocations. For more information, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/encrypt-zip-package.html#enable-zip-custom-encryption\\\"> Specifying a customer managed key for Lambda</a>.</p> </li> <li> <p>The optimized version of the container image that's used for function invocations. Note that this is not the same key that's used to protect your container image in the Amazon Elastic Container Registry (Amazon ECR). For more information, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/images-create.html#images-lifecycle\\\">Function lifecycle</a>.</p> </li> </ul> <p>If you don't provide a customer managed key, Lambda uses an <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-owned-cmk\\\">Amazon Web Services owned key</a> or an <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk\\\">Amazon Web Services managed key</a>.</p>\"\n                    }\n                },\n                \"TracingConfig\": {\n                    \"target\": \"com.amazonaws.lambda#TracingConfig\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Set <code>Mode</code> to <code>Active</code> to sample and trace a subset of incoming requests with <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/services-xray.html\\\">X-Ray</a>.</p>\"\n                    }\n                },\n                \"RevisionId\": {\n                    \"target\": \"com.amazonaws.lambda#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Update the function only if the revision ID matches the ID that's specified. Use this option to avoid modifying a function that has changed since you last read it.</p>\"\n                    }\n                },\n                \"Layers\": {\n                    \"target\": \"com.amazonaws.lambda#LayerList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html\\\">function layers</a> to add to the function's execution environment. Specify each layer by its ARN, including the version.</p>\"\n                    }\n                },\n                \"FileSystemConfigs\": {\n                    \"target\": \"com.amazonaws.lambda#FileSystemConfigList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Connection settings for an Amazon EFS file system.</p>\"\n                    }\n                },\n                \"ImageConfig\": {\n                    \"target\": \"com.amazonaws.lambda#ImageConfig\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/images-create.html#images-parms\\\">Container image configuration values</a> that override the values in the container image Docker file.</p>\"\n                    }\n                },\n                \"EphemeralStorage\": {\n                    \"target\": \"com.amazonaws.lambda#EphemeralStorage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The size of the function's <code>/tmp</code> directory in MB. The default value is 512, but can be any whole number between 512 and 10,240 MB. For more information, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/configuration-function-common.html#configuration-ephemeral-storage\\\">Configuring ephemeral storage (console)</a>.</p>\"\n                    }\n                },\n                \"SnapStart\": {\n                    \"target\": \"com.amazonaws.lambda#SnapStart\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The function's <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/snapstart.html\\\">SnapStart</a> setting.</p>\"\n                    }\n                },\n                \"LoggingConfig\": {\n                    \"target\": \"com.amazonaws.lambda#LoggingConfig\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The function's Amazon CloudWatch Logs configuration settings.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.lambda#UpdateFunctionEventInvokeConfig\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.lambda#UpdateFunctionEventInvokeConfigRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.lambda#FunctionEventInvokeConfig\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.lambda#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceConflictException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ServiceException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#TooManyRequestsException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.iam#iamAction\": {\n                    \"documentation\": \"Grants permission to modify the configuration for asynchronous invocation for an AWS Lambda function, version, or alias\",\n                    \"relativeDocumentation\": \"API_UpdateFunctionEventInvokeConfig.html\",\n                    \"resources\": {\n                        \"required\": {\n                            \"function\": {}\n                        }\n                    }\n                },\n                \"smithy.api#documentation\": \"<p>Updates the configuration for asynchronous invocation for a function, version, or alias.</p> <p>To configure options for asynchronous invocation, use <a>PutFunctionEventInvokeConfig</a>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To update an asynchronous invocation configuration\",\n                        \"documentation\": \"The following example adds an on-failure destination to the existing asynchronous invocation configuration for a function named my-function.\",\n                        \"input\": {\n                            \"FunctionName\": \"my-function\",\n                            \"DestinationConfig\": {\n                                \"OnFailure\": {\n                                    \"Destination\": \"arn:aws:sqs:us-east-2:123456789012:destination\"\n                                }\n                            }\n                        },\n                        \"output\": {\n                            \"LastModified\": 1.573687896493E9,\n                            \"FunctionArn\": \"arn:aws:lambda:us-east-2:123456789012:function:my-function:$LATEST\",\n                            \"MaximumRetryAttempts\": 0,\n                            \"MaximumEventAgeInSeconds\": 3600,\n                            \"DestinationConfig\": {\n                                \"OnSuccess\": {},\n                                \"OnFailure\": {\n                                    \"Destination\": \"arn:aws:sqs:us-east-2:123456789012:destination\"\n                                }\n                            }\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"POST\",\n                    \"uri\": \"/2019-09-25/functions/{FunctionName}/event-invoke-config\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.lambda#UpdateFunctionEventInvokeConfigRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"FunctionName\": {\n                    \"target\": \"com.amazonaws.lambda#FunctionName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name or ARN of the Lambda function, version, or alias.</p> <p class=\\\"title\\\"> <b>Name formats</b> </p> <ul> <li> <p> <b>Function name</b> - <code>my-function</code> (name-only), <code>my-function:v1</code> (with alias).</p> </li> <li> <p> <b>Function ARN</b> - <code>arn:aws:lambda:us-west-2:123456789012:function:my-function</code>.</p> </li> <li> <p> <b>Partial ARN</b> - <code>123456789012:function:my-function</code>.</p> </li> </ul> <p>You can append a version number or alias to any of the formats. The length constraint applies only to the full ARN. If you specify only the function name, it is limited to 64 characters in length.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Qualifier\": {\n                    \"target\": \"com.amazonaws.lambda#Qualifier\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A version number or alias name.</p>\",\n                        \"smithy.api#httpQuery\": \"Qualifier\"\n                    }\n                },\n                \"MaximumRetryAttempts\": {\n                    \"target\": \"com.amazonaws.lambda#MaximumRetryAttempts\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of times to retry when the function returns an error.</p>\"\n                    }\n                },\n                \"MaximumEventAgeInSeconds\": {\n                    \"target\": \"com.amazonaws.lambda#MaximumEventAgeInSeconds\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum age of a request that Lambda sends to a function for processing.</p>\"\n                    }\n                },\n                \"DestinationConfig\": {\n                    \"target\": \"com.amazonaws.lambda#DestinationConfig\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A destination for events after they have been sent to a function for processing.</p> <p class=\\\"title\\\"> <b>Destinations</b> </p> <ul> <li> <p> <b>Function</b> - The Amazon Resource Name (ARN) of a Lambda function.</p> </li> <li> <p> <b>Queue</b> - The ARN of a standard SQS queue.</p> </li> <li> <p> <b>Bucket</b> - The ARN of an Amazon S3 bucket.</p> </li> <li> <p> <b>Topic</b> - The ARN of a standard SNS topic.</p> </li> <li> <p> <b>Event Bus</b> - The ARN of an Amazon EventBridge event bus.</p> </li> </ul> <note> <p>S3 buckets are supported only for on-failure destinations. To retain records of successful invocations, use another destination type.</p> </note>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.lambda#UpdateFunctionUrlConfig\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.lambda#UpdateFunctionUrlConfigRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.lambda#UpdateFunctionUrlConfigResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.lambda#InvalidParameterValueException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceConflictException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#ServiceException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.lambda#TooManyRequestsException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.iam#conditionKeys\": [\n                    \"lambda:FunctionArn\",\n                    \"lambda:FunctionUrlAuthType\"\n                ],\n                \"aws.iam#iamAction\": {\n                    \"documentation\": \"Grants permission to update a function url configuration for a Lambda function\",\n                    \"relativeDocumentation\": \"API_UpdateFunctionUrlConfig.html\",\n                    \"resources\": {\n                        \"required\": {\n                            \"function\": {}\n                        }\n                    }\n                },\n                \"smithy.api#documentation\": \"<p>Updates the configuration for a Lambda function URL.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"PUT\",\n                    \"uri\": \"/2021-10-31/functions/{FunctionName}/url\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.lambda#UpdateFunctionUrlConfigRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"FunctionName\": {\n                    \"target\": \"com.amazonaws.lambda#FunctionName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name or ARN of the Lambda function.</p> <p class=\\\"title\\\"> <b>Name formats</b> </p> <ul> <li> <p> <b>Function name</b> – <code>my-function</code>.</p> </li> <li> <p> <b>Function ARN</b> – <code>arn:aws:lambda:us-west-2:123456789012:function:my-function</code>.</p> </li> <li> <p> <b>Partial ARN</b> – <code>123456789012:function:my-function</code>.</p> </li> </ul> <p>The length constraint applies only to the full ARN. If you specify only the function name, it is limited to 64 characters in length.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Qualifier\": {\n                    \"target\": \"com.amazonaws.lambda#FunctionUrlQualifier\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The alias name.</p>\",\n                        \"smithy.api#httpQuery\": \"Qualifier\"\n                    }\n                },\n                \"AuthType\": {\n                    \"target\": \"com.amazonaws.lambda#FunctionUrlAuthType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of authentication that your function URL uses. Set to <code>AWS_IAM</code> if you want to restrict access to authenticated users only. Set to <code>NONE</code> if you want to bypass IAM authentication to create a public endpoint. For more information, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/urls-auth.html\\\">Security and auth model for Lambda function URLs</a>.</p>\"\n                    }\n                },\n                \"Cors\": {\n                    \"target\": \"com.amazonaws.lambda#Cors\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <a href=\\\"https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS\\\">cross-origin resource sharing (CORS)</a> settings for your function URL.</p>\"\n                    }\n                },\n                \"InvokeMode\": {\n                    \"target\": \"com.amazonaws.lambda#InvokeMode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use one of the following options:</p> <ul> <li> <p> <code>BUFFERED</code> – This is the default option. Lambda invokes your function using the <code>Invoke</code> API operation. Invocation results are available when the payload is complete. The maximum payload size is 6 MB.</p> </li> <li> <p> <code>RESPONSE_STREAM</code> – Your function streams payload results as they become available. Lambda invokes your function using the <code>InvokeWithResponseStream</code> API operation. The maximum response payload size is 200 MB.</p> </li> </ul>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.lambda#UpdateFunctionUrlConfigResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"FunctionUrl\": {\n                    \"target\": \"com.amazonaws.lambda#FunctionUrl\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The HTTP URL endpoint for your function.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"FunctionArn\": {\n                    \"target\": \"com.amazonaws.lambda#FunctionArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of your function.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"AuthType\": {\n                    \"target\": \"com.amazonaws.lambda#FunctionUrlAuthType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of authentication that your function URL uses. Set to <code>AWS_IAM</code> if you want to restrict access to authenticated users only. Set to <code>NONE</code> if you want to bypass IAM authentication to create a public endpoint. For more information, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/urls-auth.html\\\">Security and auth model for Lambda function URLs</a>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Cors\": {\n                    \"target\": \"com.amazonaws.lambda#Cors\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <a href=\\\"https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS\\\">cross-origin resource sharing (CORS)</a> settings for your function URL.</p>\"\n                    }\n                },\n                \"CreationTime\": {\n                    \"target\": \"com.amazonaws.lambda#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>When the function URL was created, in <a href=\\\"https://www.w3.org/TR/NOTE-datetime\\\">ISO-8601 format</a> (YYYY-MM-DDThh:mm:ss.sTZD).</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"LastModifiedTime\": {\n                    \"target\": \"com.amazonaws.lambda#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>When the function URL configuration was last updated, in <a href=\\\"https://www.w3.org/TR/NOTE-datetime\\\">ISO-8601 format</a> (YYYY-MM-DDThh:mm:ss.sTZD).</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"InvokeMode\": {\n                    \"target\": \"com.amazonaws.lambda#InvokeMode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Use one of the following options:</p> <ul> <li> <p> <code>BUFFERED</code> – This is the default option. Lambda invokes your function using the <code>Invoke</code> API operation. Invocation results are available when the payload is complete. The maximum payload size is 6 MB.</p> </li> <li> <p> <code>RESPONSE_STREAM</code> – Your function streams payload results as they become available. Lambda invokes your function using the <code>InvokeWithResponseStream</code> API operation. The maximum response payload size is 200 MB.</p> </li> </ul>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.lambda#UpdateRuntimeOn\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"Auto\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Auto\"\n                    }\n                },\n                \"Manual\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Manual\"\n                    }\n                },\n                \"FunctionUpdate\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"FunctionUpdate\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.lambda#Version\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 1024\n                },\n                \"smithy.api#pattern\": \"^(\\\\$LATEST|[0-9]+)$\"\n            }\n        },\n        \"com.amazonaws.lambda#VpcConfig\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SubnetIds\": {\n                    \"target\": \"com.amazonaws.lambda#SubnetIds\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of VPC subnet IDs.</p>\"\n                    }\n                },\n                \"SecurityGroupIds\": {\n                    \"target\": \"com.amazonaws.lambda#SecurityGroupIds\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of VPC security group IDs.</p>\"\n                    }\n                },\n                \"Ipv6AllowedForDualStack\": {\n                    \"target\": \"com.amazonaws.lambda#NullableBoolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Allows outbound IPv6 traffic on VPC functions that are connected to dual-stack subnets.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The VPC security groups and subnets that are attached to a Lambda function. For more information, see <a href=\\\"https://docs.aws.amazon.com/lambda/latest/dg/configuration-vpc.html\\\">Configuring a Lambda function to access resources in a VPC</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.lambda#VpcConfigResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SubnetIds\": {\n                    \"target\": \"com.amazonaws.lambda#SubnetIds\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of VPC subnet IDs.</p>\"\n                    }\n                },\n                \"SecurityGroupIds\": {\n                    \"target\": \"com.amazonaws.lambda#SecurityGroupIds\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of VPC security group IDs.</p>\"\n                    }\n                },\n                \"VpcId\": {\n                    \"target\": \"com.amazonaws.lambda#VpcId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the VPC.</p>\"\n                    }\n                },\n                \"Ipv6AllowedForDualStack\": {\n                    \"target\": \"com.amazonaws.lambda#NullableBoolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Allows outbound IPv6 traffic on VPC functions that are connected to dual-stack subnets.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The VPC security groups and subnets that are attached to a Lambda function.</p>\"\n            }\n        },\n        \"com.amazonaws.lambda#VpcId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.lambda#Weight\": {\n            \"type\": \"double\",\n            \"traits\": {\n                \"smithy.api#default\": 0,\n                \"smithy.api#range\": {\n                    \"min\": 0.0,\n                    \"max\": 1.0\n                }\n            }\n        },\n        \"com.amazonaws.lambda#WorkingDirectory\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 1000\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "aws/sdk/aws-models/polly.json",
    "content": "{\n    \"smithy\": \"2.0\",\n    \"metadata\": {\n        \"suppressions\": [\n            {\n                \"id\": \"HttpMethodSemantics\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"HttpResponseCodeSemantics\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"PaginatedTrait\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"HttpHeaderTrait\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"HttpUriConflict\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"Service\",\n                \"namespace\": \"*\"\n            }\n        ]\n    },\n    \"shapes\": {\n        \"com.amazonaws.polly#Alphabet\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.polly#AudioStream\": {\n            \"type\": \"blob\",\n            \"traits\": {\n                \"smithy.api#streaming\": {}\n            }\n        },\n        \"com.amazonaws.polly#ContentType\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.polly#DateTime\": {\n            \"type\": \"timestamp\"\n        },\n        \"com.amazonaws.polly#DeleteLexicon\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.polly#DeleteLexiconInput\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.polly#DeleteLexiconOutput\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.polly#LexiconNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.polly#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the specified pronunciation lexicon stored in an Amazon Web Services Region. A lexicon which has been deleted is not available for\\n      speech synthesis, nor is it possible to retrieve it using either the\\n        <code>GetLexicon</code> or <code>ListLexicon</code> APIs.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/polly/latest/dg/managing-lexicons.html\\\">Managing Lexicons</a>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To delete a lexicon\",\n                        \"documentation\": \"Deletes a specified pronunciation lexicon stored in an AWS Region.\",\n                        \"input\": {\n                            \"Name\": \"example\"\n                        },\n                        \"output\": {}\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"DELETE\",\n                    \"uri\": \"/v1/lexicons/{Name}\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.polly#DeleteLexiconInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Name\": {\n                    \"target\": \"com.amazonaws.polly#LexiconName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the lexicon to delete. Must be an existing lexicon in\\n      the region.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.polly#DeleteLexiconOutput\": {\n            \"type\": \"structure\",\n            \"members\": {},\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.polly#DescribeVoices\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.polly#DescribeVoicesInput\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.polly#DescribeVoicesOutput\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.polly#InvalidNextTokenException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.polly#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns the list of voices that are available for use when\\n      requesting speech synthesis. Each voice speaks a specified language, is\\n      either male or female, and is identified by an ID, which is the ASCII\\n      version of the voice name. </p>\\n         <p>When synthesizing speech ( <code>SynthesizeSpeech</code> ), you\\n      provide the voice ID for the voice you want from the list of voices\\n      returned by <code>DescribeVoices</code>.</p>\\n         <p>For example, you want your news reader application to read news in\\n      a specific language, but giving a user the option to choose the voice.\\n      Using the <code>DescribeVoices</code> operation you can provide the user\\n      with a list of available voices to select from.</p>\\n         <p> You can optionally specify a language code to filter the available\\n      voices. For example, if you specify <code>en-US</code>, the operation\\n      returns a list of all available US English voices. </p>\\n         <p>This operation requires permissions to perform the\\n        <code>polly:DescribeVoices</code> action.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To describe available voices\",\n                        \"documentation\": \"Returns the list of voices that are available for use when requesting speech synthesis. Displayed languages are those within the specified language code. If no language code is specified, voices for all available languages are displayed.\",\n                        \"input\": {\n                            \"LanguageCode\": \"en-GB\"\n                        },\n                        \"output\": {\n                            \"Voices\": [\n                                {\n                                    \"Gender\": \"Female\",\n                                    \"Name\": \"Emma\",\n                                    \"LanguageName\": \"British English\",\n                                    \"Id\": \"Emma\",\n                                    \"LanguageCode\": \"en-GB\"\n                                },\n                                {\n                                    \"Gender\": \"Male\",\n                                    \"Name\": \"Brian\",\n                                    \"LanguageName\": \"British English\",\n                                    \"Id\": \"Brian\",\n                                    \"LanguageCode\": \"en-GB\"\n                                },\n                                {\n                                    \"Gender\": \"Female\",\n                                    \"Name\": \"Amy\",\n                                    \"LanguageName\": \"British English\",\n                                    \"Id\": \"Amy\",\n                                    \"LanguageCode\": \"en-GB\"\n                                }\n                            ]\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/v1/voices\",\n                    \"code\": 200\n                },\n                \"smithy.test#smokeTests\": [\n                    {\n                        \"id\": \"DescribeVoicesSuccess\",\n                        \"params\": {},\n                        \"vendorParams\": {\n                            \"region\": \"us-west-2\"\n                        },\n                        \"vendorParamsShape\": \"aws.test#AwsVendorParams\",\n                        \"expect\": {\n                            \"success\": {}\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.polly#DescribeVoicesInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Engine\": {\n                    \"target\": \"com.amazonaws.polly#Engine\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the engine (<code>standard</code>, <code>neural</code>,\\n      <code>long-form</code> or <code>generative</code>) used by Amazon Polly when\\n      processing input text for speech synthesis. </p>\",\n                        \"smithy.api#httpQuery\": \"Engine\"\n                    }\n                },\n                \"LanguageCode\": {\n                    \"target\": \"com.amazonaws.polly#LanguageCode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The language identification tag (ISO 639 code for the language\\n      name-ISO 3166 country code) for filtering the list of voices returned. If\\n      you don't specify this optional parameter, all available voices are\\n      returned. </p>\",\n                        \"smithy.api#httpQuery\": \"LanguageCode\"\n                    }\n                },\n                \"IncludeAdditionalLanguageCodes\": {\n                    \"target\": \"com.amazonaws.polly#IncludeAdditionalLanguageCodes\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Boolean value indicating whether to return any bilingual voices that\\n      use the specified language as an additional language. For instance, if you\\n      request all languages that use US English (es-US), and there is an Italian\\n      voice that speaks both Italian (it-IT) and US English, that voice will be\\n      included if you specify <code>yes</code> but not if you specify\\n        <code>no</code>.</p>\",\n                        \"smithy.api#httpQuery\": \"IncludeAdditionalLanguageCodes\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.polly#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An opaque pagination token returned from the previous\\n        <code>DescribeVoices</code> operation. If present, this indicates where\\n      to continue the listing.</p>\",\n                        \"smithy.api#httpQuery\": \"NextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.polly#DescribeVoicesOutput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Voices\": {\n                    \"target\": \"com.amazonaws.polly#VoiceList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of voices with their properties.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.polly#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The pagination token to use in the next request to continue the\\n      listing of voices. <code>NextToken</code> is returned only if the response\\n      is truncated.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.polly#Engine\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"STANDARD\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"standard\"\n                    }\n                },\n                \"NEURAL\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"neural\"\n                    }\n                },\n                \"LONG_FORM\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"long-form\"\n                    }\n                },\n                \"GENERATIVE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"generative\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.polly#EngineList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.polly#Engine\"\n            }\n        },\n        \"com.amazonaws.polly#EngineNotSupportedException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.polly#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This engine is not compatible with the voice that you have designated.\\n      Choose a new voice that is compatible with the engine or change the engine\\n      and restart the operation.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.polly#ErrorMessage\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.polly#Gender\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"Female\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Female\"\n                    }\n                },\n                \"Male\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Male\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.polly#GetLexicon\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.polly#GetLexiconInput\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.polly#GetLexiconOutput\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.polly#LexiconNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.polly#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns the content of the specified pronunciation lexicon stored\\n      in an Amazon Web Services Region. For more information, see <a href=\\\"https://docs.aws.amazon.com/polly/latest/dg/managing-lexicons.html\\\">Managing Lexicons</a>.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/v1/lexicons/{Name}\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.polly#GetLexiconInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Name\": {\n                    \"target\": \"com.amazonaws.polly#LexiconName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Name of the lexicon.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.polly#GetLexiconOutput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Lexicon\": {\n                    \"target\": \"com.amazonaws.polly#Lexicon\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Lexicon object that provides name and the string content of the\\n      lexicon. </p>\"\n                    }\n                },\n                \"LexiconAttributes\": {\n                    \"target\": \"com.amazonaws.polly#LexiconAttributes\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Metadata of the lexicon, including phonetic alphabetic used,\\n      language code, lexicon ARN, number of lexemes defined in the lexicon, and\\n      size of lexicon in bytes.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.polly#GetSpeechSynthesisTask\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.polly#GetSpeechSynthesisTaskInput\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.polly#GetSpeechSynthesisTaskOutput\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.polly#InvalidTaskIdException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.polly#ServiceFailureException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.polly#SynthesisTaskNotFoundException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Retrieves a specific SpeechSynthesisTask object based on its TaskID.\\n      This object contains information about the given speech synthesis task,\\n      including the status of the task, and a link to the S3 bucket containing\\n      the output of the task.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/v1/synthesisTasks/{TaskId}\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.polly#GetSpeechSynthesisTaskInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TaskId\": {\n                    \"target\": \"com.amazonaws.polly#TaskId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Polly generated identifier for a speech synthesis task.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.polly#GetSpeechSynthesisTaskOutput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SynthesisTask\": {\n                    \"target\": \"com.amazonaws.polly#SynthesisTask\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>SynthesisTask object that provides information from the requested\\n      task, including output format, creation time, task status, and so\\n      on.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.polly#IncludeAdditionalLanguageCodes\": {\n            \"type\": \"boolean\",\n            \"traits\": {\n                \"smithy.api#default\": false\n            }\n        },\n        \"com.amazonaws.polly#InvalidLexiconException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.polly#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Amazon Polly can't find the specified lexicon. Verify that the lexicon's\\n      name is spelled correctly, and then try again.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.polly#InvalidNextTokenException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.polly#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The NextToken is invalid. Verify that it's spelled correctly, and\\n      then try again.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.polly#InvalidS3BucketException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.polly#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The provided Amazon S3 bucket name is invalid. Please check your input\\n      with S3 bucket naming requirements and try again.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.polly#InvalidS3KeyException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.polly#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The provided Amazon S3 key prefix is invalid. Please provide a valid\\n      S3 object key name.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.polly#InvalidSampleRateException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.polly#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The specified sample rate is not valid.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.polly#InvalidSnsTopicArnException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.polly#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The provided SNS topic ARN is invalid. Please provide a valid SNS\\n      topic ARN and try again.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.polly#InvalidSsmlException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.polly#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The SSML you provided is invalid. Verify the SSML syntax, spelling\\n      of tags and values, and then try again.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.polly#InvalidTaskIdException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.polly#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The provided Task ID is not valid. Please provide a valid Task ID and\\n      try again.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.polly#LanguageCode\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"arb\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"arb\"\n                    }\n                },\n                \"cmn_CN\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"cmn-CN\"\n                    }\n                },\n                \"cy_GB\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"cy-GB\"\n                    }\n                },\n                \"da_DK\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"da-DK\"\n                    }\n                },\n                \"de_DE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"de-DE\"\n                    }\n                },\n                \"en_AU\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"en-AU\"\n                    }\n                },\n                \"en_GB\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"en-GB\"\n                    }\n                },\n                \"en_GB_WLS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"en-GB-WLS\"\n                    }\n                },\n                \"en_IN\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"en-IN\"\n                    }\n                },\n                \"en_US\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"en-US\"\n                    }\n                },\n                \"es_ES\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"es-ES\"\n                    }\n                },\n                \"es_MX\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"es-MX\"\n                    }\n                },\n                \"es_US\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"es-US\"\n                    }\n                },\n                \"fr_CA\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"fr-CA\"\n                    }\n                },\n                \"fr_FR\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"fr-FR\"\n                    }\n                },\n                \"is_IS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"is-IS\"\n                    }\n                },\n                \"it_IT\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"it-IT\"\n                    }\n                },\n                \"ja_JP\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ja-JP\"\n                    }\n                },\n                \"hi_IN\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"hi-IN\"\n                    }\n                },\n                \"ko_KR\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ko-KR\"\n                    }\n                },\n                \"nb_NO\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"nb-NO\"\n                    }\n                },\n                \"nl_NL\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"nl-NL\"\n                    }\n                },\n                \"pl_PL\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"pl-PL\"\n                    }\n                },\n                \"pt_BR\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"pt-BR\"\n                    }\n                },\n                \"pt_PT\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"pt-PT\"\n                    }\n                },\n                \"ro_RO\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ro-RO\"\n                    }\n                },\n                \"ru_RU\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ru-RU\"\n                    }\n                },\n                \"sv_SE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"sv-SE\"\n                    }\n                },\n                \"tr_TR\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"tr-TR\"\n                    }\n                },\n                \"en_NZ\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"en-NZ\"\n                    }\n                },\n                \"en_ZA\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"en-ZA\"\n                    }\n                },\n                \"ca_ES\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ca-ES\"\n                    }\n                },\n                \"de_AT\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"de-AT\"\n                    }\n                },\n                \"yue_CN\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"yue-CN\"\n                    }\n                },\n                \"ar_AE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ar-AE\"\n                    }\n                },\n                \"fi_FI\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"fi-FI\"\n                    }\n                },\n                \"en_IE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"en-IE\"\n                    }\n                },\n                \"nl_BE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"nl-BE\"\n                    }\n                },\n                \"fr_BE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"fr-BE\"\n                    }\n                },\n                \"cs_CZ\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"cs-CZ\"\n                    }\n                },\n                \"de_CH\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"de-CH\"\n                    }\n                },\n                \"en_SG\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"en-SG\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.polly#LanguageCodeList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.polly#LanguageCode\"\n            }\n        },\n        \"com.amazonaws.polly#LanguageName\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.polly#LanguageNotSupportedException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.polly#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The language specified is not currently supported by Amazon Polly in this\\n      capacity.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.polly#LastModified\": {\n            \"type\": \"timestamp\"\n        },\n        \"com.amazonaws.polly#LexemesCount\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#default\": 0\n            }\n        },\n        \"com.amazonaws.polly#Lexicon\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Content\": {\n                    \"target\": \"com.amazonaws.polly#LexiconContent\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Lexicon content in string format. The content of a lexicon must be\\n      in PLS format.</p>\"\n                    }\n                },\n                \"Name\": {\n                    \"target\": \"com.amazonaws.polly#LexiconName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Name of the lexicon.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Provides lexicon name and lexicon content in string format. For\\n      more information, see <a href=\\\"https://www.w3.org/TR/pronunciation-lexicon/\\\">Pronunciation Lexicon\\n        Specification (PLS) Version 1.0</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.polly#LexiconArn\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.polly#LexiconAttributes\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Alphabet\": {\n                    \"target\": \"com.amazonaws.polly#Alphabet\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Phonetic alphabet used in the lexicon. Valid values are\\n        <code>ipa</code> and <code>x-sampa</code>.</p>\"\n                    }\n                },\n                \"LanguageCode\": {\n                    \"target\": \"com.amazonaws.polly#LanguageCode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Language code that the lexicon applies to. A lexicon with a\\n      language code such as \\\"en\\\" would be applied to all English languages\\n      (en-GB, en-US, en-AUS, en-WLS, and so on.</p>\"\n                    }\n                },\n                \"LastModified\": {\n                    \"target\": \"com.amazonaws.polly#LastModified\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Date lexicon was last modified (a timestamp value).</p>\"\n                    }\n                },\n                \"LexiconArn\": {\n                    \"target\": \"com.amazonaws.polly#LexiconArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Amazon Resource Name (ARN) of the lexicon.</p>\"\n                    }\n                },\n                \"LexemesCount\": {\n                    \"target\": \"com.amazonaws.polly#LexemesCount\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>Number of lexemes in the lexicon.</p>\"\n                    }\n                },\n                \"Size\": {\n                    \"target\": \"com.amazonaws.polly#Size\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>Total size of the lexicon, in characters.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains metadata describing the lexicon such as the number of\\n      lexemes, language code, and so on. For more information, see <a href=\\\"https://docs.aws.amazon.com/polly/latest/dg/managing-lexicons.html\\\">Managing Lexicons</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.polly#LexiconContent\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#sensitive\": {}\n            }\n        },\n        \"com.amazonaws.polly#LexiconDescription\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Name\": {\n                    \"target\": \"com.amazonaws.polly#LexiconName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Name of the lexicon.</p>\"\n                    }\n                },\n                \"Attributes\": {\n                    \"target\": \"com.amazonaws.polly#LexiconAttributes\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Provides lexicon metadata.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the content of the lexicon.</p>\"\n            }\n        },\n        \"com.amazonaws.polly#LexiconDescriptionList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.polly#LexiconDescription\"\n            }\n        },\n        \"com.amazonaws.polly#LexiconName\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#pattern\": \"^[0-9A-Za-z]{1,20}$\"\n            }\n        },\n        \"com.amazonaws.polly#LexiconNameList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.polly#LexiconName\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 5\n                }\n            }\n        },\n        \"com.amazonaws.polly#LexiconNotFoundException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.polly#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Amazon Polly can't find the specified lexicon. This could be caused by a\\n      lexicon that is missing, its name is misspelled or specifying a lexicon\\n      that is in a different region.</p>\\n         <p>Verify that the lexicon exists, is in the region (see <a>ListLexicons</a>) and that you spelled its name is spelled\\n      correctly. Then try again.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 404\n            }\n        },\n        \"com.amazonaws.polly#LexiconSizeExceededException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.polly#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The maximum size of the specified lexicon would be exceeded by this\\n      operation.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.polly#ListLexicons\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.polly#ListLexiconsInput\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.polly#ListLexiconsOutput\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.polly#InvalidNextTokenException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.polly#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns a list of pronunciation lexicons stored in an Amazon Web Services Region. For more information, see <a href=\\\"https://docs.aws.amazon.com/polly/latest/dg/managing-lexicons.html\\\">Managing Lexicons</a>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To list all lexicons in a region\",\n                        \"documentation\": \"Returns a list of pronunciation lexicons stored in an AWS Region.\",\n                        \"output\": {\n                            \"Lexicons\": [\n                                {\n                                    \"Attributes\": {\n                                        \"LanguageCode\": \"en-US\",\n                                        \"LastModified\": 1.478542980117E9,\n                                        \"Alphabet\": \"ipa\",\n                                        \"LexemesCount\": 1,\n                                        \"LexiconArn\": \"arn:aws:polly:us-east-1:123456789012:lexicon/example\",\n                                        \"Size\": 503\n                                    },\n                                    \"Name\": \"example\"\n                                }\n                            ]\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/v1/lexicons\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.polly#ListLexiconsInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.polly#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An opaque pagination token returned from previous\\n        <code>ListLexicons</code> operation. If present, indicates where to\\n      continue the list of lexicons.</p>\",\n                        \"smithy.api#httpQuery\": \"NextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.polly#ListLexiconsOutput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Lexicons\": {\n                    \"target\": \"com.amazonaws.polly#LexiconDescriptionList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of lexicon names and attributes.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.polly#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The pagination token to use in the next request to continue the\\n      listing of lexicons. <code>NextToken</code> is returned only if the\\n      response is truncated.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.polly#ListSpeechSynthesisTasks\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.polly#ListSpeechSynthesisTasksInput\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.polly#ListSpeechSynthesisTasksOutput\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.polly#InvalidNextTokenException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.polly#ServiceFailureException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns a list of SpeechSynthesisTask objects ordered by their\\n      creation date. This operation can filter the tasks by their status, for\\n      example, allowing users to list only tasks that are completed.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/v1/synthesisTasks\",\n                    \"code\": 200\n                },\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.polly#ListSpeechSynthesisTasksInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.polly#MaxResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Maximum number of speech synthesis tasks returned in a List\\n      operation.</p>\",\n                        \"smithy.api#httpQuery\": \"MaxResults\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.polly#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The pagination token to use in the next request to continue the\\n      listing of speech synthesis tasks. </p>\",\n                        \"smithy.api#httpQuery\": \"NextToken\"\n                    }\n                },\n                \"Status\": {\n                    \"target\": \"com.amazonaws.polly#TaskStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Status of the speech synthesis tasks returned in a List\\n      operation</p>\",\n                        \"smithy.api#httpQuery\": \"Status\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.polly#ListSpeechSynthesisTasksOutput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.polly#NextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An opaque pagination token returned from the previous List operation\\n      in this request. If present, this indicates where to continue the\\n      listing.</p>\"\n                    }\n                },\n                \"SynthesisTasks\": {\n                    \"target\": \"com.amazonaws.polly#SynthesisTasks\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>List of SynthesisTask objects that provides information from the\\n      specified task in the list request, including output format, creation\\n      time, task status, and so on.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.polly#MarksNotSupportedForFormatException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.polly#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Speech marks are not supported for the <code>OutputFormat</code>\\n      selected. Speech marks are only available for content in <code>json</code>\\n      format.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.polly#MaxLexemeLengthExceededException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.polly#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The maximum size of the lexeme would be exceeded by this\\n      operation.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.polly#MaxLexiconsNumberExceededException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.polly#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The maximum number of lexicons would be exceeded by this\\n      operation.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.polly#MaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 100\n                }\n            }\n        },\n        \"com.amazonaws.polly#NextToken\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 4096\n                }\n            }\n        },\n        \"com.amazonaws.polly#OutputFormat\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"JSON\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"json\"\n                    }\n                },\n                \"MP3\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"mp3\"\n                    }\n                },\n                \"OGG_OPUS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ogg_opus\"\n                    }\n                },\n                \"OGG_VORBIS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ogg_vorbis\"\n                    }\n                },\n                \"PCM\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"pcm\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.polly#OutputS3BucketName\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#pattern\": \"^[a-z0-9][\\\\.\\\\-a-z0-9]{1,61}[a-z0-9]$\"\n            }\n        },\n        \"com.amazonaws.polly#OutputS3KeyPrefix\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#pattern\": \"^[0-9a-zA-Z\\\\/\\\\!\\\\-_\\\\.\\\\*\\\\'\\\\(\\\\):;\\\\$@=+\\\\,\\\\?&]{0,800}$\"\n            }\n        },\n        \"com.amazonaws.polly#OutputUri\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.polly#Parrot_v1\": {\n            \"type\": \"service\",\n            \"version\": \"2016-06-10\",\n            \"operations\": [\n                {\n                    \"target\": \"com.amazonaws.polly#DeleteLexicon\"\n                },\n                {\n                    \"target\": \"com.amazonaws.polly#DescribeVoices\"\n                },\n                {\n                    \"target\": \"com.amazonaws.polly#GetLexicon\"\n                },\n                {\n                    \"target\": \"com.amazonaws.polly#GetSpeechSynthesisTask\"\n                },\n                {\n                    \"target\": \"com.amazonaws.polly#ListLexicons\"\n                },\n                {\n                    \"target\": \"com.amazonaws.polly#ListSpeechSynthesisTasks\"\n                },\n                {\n                    \"target\": \"com.amazonaws.polly#PutLexicon\"\n                },\n                {\n                    \"target\": \"com.amazonaws.polly#StartSpeechSynthesisTask\"\n                },\n                {\n                    \"target\": \"com.amazonaws.polly#SynthesizeSpeech\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#service\": {\n                    \"sdkId\": \"Polly\",\n                    \"arnNamespace\": \"polly\",\n                    \"cloudFormationName\": \"Polly\",\n                    \"cloudTrailEventSource\": \"polly.amazonaws.com\",\n                    \"endpointPrefix\": \"polly\"\n                },\n                \"aws.auth#sigv4\": {\n                    \"name\": \"polly\"\n                },\n                \"aws.protocols#restJson1\": {},\n                \"smithy.api#documentation\": \"<p>Amazon Polly is a web service that makes it easy to synthesize speech from\\n      text.</p>\\n         <p>The Amazon Polly service provides API operations for synthesizing\\n      high-quality speech from plain text and Speech Synthesis Markup Language\\n      (SSML), along with managing pronunciations lexicons that enable you to get\\n      the best results for your application domain.</p>\",\n                \"smithy.api#title\": \"Amazon Polly\",\n                \"smithy.api#xmlNamespace\": {\n                    \"uri\": \"http://polly.amazonaws.com/doc/v1\"\n                },\n                \"smithy.rules#endpointRuleSet\": {\n                    \"version\": \"1.0\",\n                    \"parameters\": {\n                        \"Region\": {\n                            \"builtIn\": \"AWS::Region\",\n                            \"required\": false,\n                            \"documentation\": \"The AWS region used to dispatch the request.\",\n                            \"type\": \"String\"\n                        },\n                        \"UseDualStack\": {\n                            \"builtIn\": \"AWS::UseDualStack\",\n                            \"required\": true,\n                            \"default\": false,\n                            \"documentation\": \"When true, use the dual-stack endpoint. If the configured endpoint does not support dual-stack, dispatching the request MAY return an error.\",\n                            \"type\": \"Boolean\"\n                        },\n                        \"UseFIPS\": {\n                            \"builtIn\": \"AWS::UseFIPS\",\n                            \"required\": true,\n                            \"default\": false,\n                            \"documentation\": \"When true, send this request to the FIPS-compliant regional endpoint. If the configured endpoint does not have a FIPS compliant endpoint, dispatching the request will return an error.\",\n                            \"type\": \"Boolean\"\n                        },\n                        \"Endpoint\": {\n                            \"builtIn\": \"SDK::Endpoint\",\n                            \"required\": false,\n                            \"documentation\": \"Override the endpoint used to send this request\",\n                            \"type\": \"String\"\n                        }\n                    },\n                    \"rules\": [\n                        {\n                            \"conditions\": [\n                                {\n                                    \"fn\": \"isSet\",\n                                    \"argv\": [\n                                        {\n                                            \"ref\": \"Endpoint\"\n                                        }\n                                    ]\n                                }\n                            ],\n                            \"rules\": [\n                                {\n                                    \"conditions\": [\n                                        {\n                                            \"fn\": \"booleanEquals\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"UseFIPS\"\n                                                },\n                                                true\n                                            ]\n                                        }\n                                    ],\n                                    \"error\": \"Invalid Configuration: FIPS and custom endpoint are not supported\",\n                                    \"type\": \"error\"\n                                },\n                                {\n                                    \"conditions\": [\n                                        {\n                                            \"fn\": \"booleanEquals\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"UseDualStack\"\n                                                },\n                                                true\n                                            ]\n                                        }\n                                    ],\n                                    \"error\": \"Invalid Configuration: Dualstack and custom endpoint are not supported\",\n                                    \"type\": \"error\"\n                                },\n                                {\n                                    \"conditions\": [],\n                                    \"endpoint\": {\n                                        \"url\": {\n                                            \"ref\": \"Endpoint\"\n                                        },\n                                        \"properties\": {},\n                                        \"headers\": {}\n                                    },\n                                    \"type\": \"endpoint\"\n                                }\n                            ],\n                            \"type\": \"tree\"\n                        },\n                        {\n                            \"conditions\": [\n                                {\n                                    \"fn\": \"isSet\",\n                                    \"argv\": [\n                                        {\n                                            \"ref\": \"Region\"\n                                        }\n                                    ]\n                                }\n                            ],\n                            \"rules\": [\n                                {\n                                    \"conditions\": [\n                                        {\n                                            \"fn\": \"aws.partition\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"Region\"\n                                                }\n                                            ],\n                                            \"assign\": \"PartitionResult\"\n                                        }\n                                    ],\n                                    \"rules\": [\n                                        {\n                                            \"conditions\": [\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseFIPS\"\n                                                        },\n                                                        true\n                                                    ]\n                                                },\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseDualStack\"\n                                                        },\n                                                        true\n                                                    ]\n                                                }\n                                            ],\n                                            \"rules\": [\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                true,\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"PartitionResult\"\n                                                                        },\n                                                                        \"supportsFIPS\"\n                                                                    ]\n                                                                }\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                true,\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"PartitionResult\"\n                                                                        },\n                                                                        \"supportsDualStack\"\n                                                                    ]\n                                                                }\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"rules\": [\n                                                        {\n                                                            \"conditions\": [],\n                                                            \"endpoint\": {\n                                                                \"url\": \"https://polly-fips.{Region}.{PartitionResult#dualStackDnsSuffix}\",\n                                                                \"properties\": {},\n                                                                \"headers\": {}\n                                                            },\n                                                            \"type\": \"endpoint\"\n                                                        }\n                                                    ],\n                                                    \"type\": \"tree\"\n                                                },\n                                                {\n                                                    \"conditions\": [],\n                                                    \"error\": \"FIPS and DualStack are enabled, but this partition does not support one or both\",\n                                                    \"type\": \"error\"\n                                                }\n                                            ],\n                                            \"type\": \"tree\"\n                                        },\n                                        {\n                                            \"conditions\": [\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseFIPS\"\n                                                        },\n                                                        true\n                                                    ]\n                                                }\n                                            ],\n                                            \"rules\": [\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"PartitionResult\"\n                                                                        },\n                                                                        \"supportsFIPS\"\n                                                                    ]\n                                                                },\n                                                                true\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"rules\": [\n                                                        {\n                                                            \"conditions\": [],\n                                                            \"endpoint\": {\n                                                                \"url\": \"https://polly-fips.{Region}.{PartitionResult#dnsSuffix}\",\n                                                                \"properties\": {},\n                                                                \"headers\": {}\n                                                            },\n                                                            \"type\": \"endpoint\"\n                                                        }\n                                                    ],\n                                                    \"type\": \"tree\"\n                                                },\n                                                {\n                                                    \"conditions\": [],\n                                                    \"error\": \"FIPS is enabled but this partition does not support FIPS\",\n                                                    \"type\": \"error\"\n                                                }\n                                            ],\n                                            \"type\": \"tree\"\n                                        },\n                                        {\n                                            \"conditions\": [\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseDualStack\"\n                                                        },\n                                                        true\n                                                    ]\n                                                }\n                                            ],\n                                            \"rules\": [\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                true,\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"PartitionResult\"\n                                                                        },\n                                                                        \"supportsDualStack\"\n                                                                    ]\n                                                                }\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"rules\": [\n                                                        {\n                                                            \"conditions\": [],\n                                                            \"endpoint\": {\n                                                                \"url\": \"https://polly.{Region}.{PartitionResult#dualStackDnsSuffix}\",\n                                                                \"properties\": {},\n                                                                \"headers\": {}\n                                                            },\n                                                            \"type\": \"endpoint\"\n                                                        }\n                                                    ],\n                                                    \"type\": \"tree\"\n                                                },\n                                                {\n                                                    \"conditions\": [],\n                                                    \"error\": \"DualStack is enabled but this partition does not support DualStack\",\n                                                    \"type\": \"error\"\n                                                }\n                                            ],\n                                            \"type\": \"tree\"\n                                        },\n                                        {\n                                            \"conditions\": [],\n                                            \"endpoint\": {\n                                                \"url\": \"https://polly.{Region}.{PartitionResult#dnsSuffix}\",\n                                                \"properties\": {},\n                                                \"headers\": {}\n                                            },\n                                            \"type\": \"endpoint\"\n                                        }\n                                    ],\n                                    \"type\": \"tree\"\n                                }\n                            ],\n                            \"type\": \"tree\"\n                        },\n                        {\n                            \"conditions\": [],\n                            \"error\": \"Invalid Configuration: Missing Region\",\n                            \"type\": \"error\"\n                        }\n                    ]\n                },\n                \"smithy.rules#endpointTests\": {\n                    \"testCases\": [\n                        {\n                            \"documentation\": \"For region af-south-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://polly.af-south-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"af-south-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://polly.ap-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-northeast-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://polly.ap-northeast-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-northeast-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-northeast-2 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://polly.ap-northeast-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-northeast-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-south-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://polly.ap-south-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-south-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-southeast-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://polly.ap-southeast-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-southeast-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-southeast-2 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://polly.ap-southeast-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-southeast-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ca-central-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://polly.ca-central-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ca-central-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-central-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://polly.eu-central-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-central-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-north-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://polly.eu-north-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-north-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-west-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://polly.eu-west-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-west-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-west-2 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://polly.eu-west-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-west-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-west-3 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://polly.eu-west-3.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-west-3\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region me-south-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://polly.me-south-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"me-south-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region sa-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://polly.sa-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"sa-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://polly.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://polly-fips.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-2 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://polly.us-east-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-2 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://polly-fips.us-east-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-2\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-west-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://polly.us-west-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-west-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-west-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://polly-fips.us-west-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-west-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-west-2 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://polly.us-west-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-west-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-west-2 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://polly-fips.us-west-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-west-2\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-1 with FIPS enabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://polly-fips.us-east-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-1 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://polly.us-east-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-northwest-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://polly.cn-northwest-1.amazonaws.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-northwest-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-north-1 with FIPS enabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://polly-fips.cn-north-1.api.amazonwebservices.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-north-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-north-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://polly-fips.cn-north-1.amazonaws.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-north-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-north-1 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://polly.cn-north-1.api.amazonwebservices.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-north-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-north-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://polly.cn-north-1.amazonaws.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-north-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-west-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://polly.us-gov-west-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-west-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-west-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://polly-fips.us-gov-west-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-west-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-east-1 with FIPS enabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://polly-fips.us-gov-east-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-east-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://polly-fips.us-gov-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-east-1 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://polly.us-gov-east-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://polly.us-gov-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-iso-east-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://polly-fips.us-iso-east-1.c2s.ic.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-iso-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-iso-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://polly.us-iso-east-1.c2s.ic.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-iso-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-isob-east-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://polly-fips.us-isob-east-1.sc2s.sgov.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-isob-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-isob-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://polly.us-isob-east-1.sc2s.sgov.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-isob-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For custom endpoint with region set and fips disabled and dualstack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://example.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"For custom endpoint with region not set and fips disabled and dualstack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://example.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"For custom endpoint with fips enabled and dualstack disabled\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: FIPS and custom endpoint are not supported\"\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false,\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"For custom endpoint with fips disabled and dualstack enabled\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: Dualstack and custom endpoint are not supported\"\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true,\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"Missing region\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: Missing Region\"\n                            }\n                        }\n                    ],\n                    \"version\": \"1.0\"\n                }\n            }\n        },\n        \"com.amazonaws.polly#PutLexicon\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.polly#PutLexiconInput\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.polly#PutLexiconOutput\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.polly#InvalidLexiconException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.polly#LexiconSizeExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.polly#MaxLexemeLengthExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.polly#MaxLexiconsNumberExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.polly#ServiceFailureException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.polly#UnsupportedPlsAlphabetException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.polly#UnsupportedPlsLanguageException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Stores a pronunciation lexicon in an Amazon Web Services Region. If\\n      a lexicon with the same name already exists in the region, it is\\n      overwritten by the new lexicon. Lexicon operations have eventual\\n      consistency, therefore, it might take some time before the lexicon is\\n      available to the SynthesizeSpeech operation.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/polly/latest/dg/managing-lexicons.html\\\">Managing Lexicons</a>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To save a lexicon\",\n                        \"documentation\": \"Stores a pronunciation lexicon in an AWS Region.\",\n                        \"input\": {\n                            \"Name\": \"W3C\",\n                            \"Content\": \"<Lexicon Content>\"\n                        },\n                        \"output\": {}\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"PUT\",\n                    \"uri\": \"/v1/lexicons/{Name}\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.polly#PutLexiconInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Name\": {\n                    \"target\": \"com.amazonaws.polly#LexiconName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Name of the lexicon. The name must follow the regular express\\n      format [0-9A-Za-z]{1,20}. That is, the name is a case-sensitive\\n      alphanumeric string up to 20 characters long. </p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Content\": {\n                    \"target\": \"com.amazonaws.polly#LexiconContent\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Content of the PLS lexicon as string data.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.polly#PutLexiconOutput\": {\n            \"type\": \"structure\",\n            \"members\": {},\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.polly#RequestCharacters\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#default\": 0\n            }\n        },\n        \"com.amazonaws.polly#SampleRate\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.polly#ServiceFailureException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.polly#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>An unknown condition has caused a service failure.</p>\",\n                \"smithy.api#error\": \"server\",\n                \"smithy.api#httpError\": 500\n            }\n        },\n        \"com.amazonaws.polly#Size\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#default\": 0\n            }\n        },\n        \"com.amazonaws.polly#SnsTopicArn\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#pattern\": \"^arn:aws(-(cn|iso(-b)?|us-gov))?:sns:[a-z0-9_-]{1,50}:\\\\d{12}:[a-zA-Z0-9_-]{1,251}([a-zA-Z0-9_-]{0,5}|\\\\.fifo)$\"\n            }\n        },\n        \"com.amazonaws.polly#SpeechMarkType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"SENTENCE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"sentence\"\n                    }\n                },\n                \"SSML\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ssml\"\n                    }\n                },\n                \"VISEME\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"viseme\"\n                    }\n                },\n                \"WORD\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"word\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.polly#SpeechMarkTypeList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.polly#SpeechMarkType\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 4\n                }\n            }\n        },\n        \"com.amazonaws.polly#SsmlMarksNotSupportedForTextTypeException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.polly#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>SSML speech marks are not supported for plain text-type\\n      input.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.polly#StartSpeechSynthesisTask\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.polly#StartSpeechSynthesisTaskInput\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.polly#StartSpeechSynthesisTaskOutput\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.polly#EngineNotSupportedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.polly#InvalidS3BucketException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.polly#InvalidS3KeyException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.polly#InvalidSampleRateException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.polly#InvalidSnsTopicArnException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.polly#InvalidSsmlException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.polly#LanguageNotSupportedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.polly#LexiconNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.polly#MarksNotSupportedForFormatException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.polly#ServiceFailureException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.polly#SsmlMarksNotSupportedForTextTypeException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.polly#TextLengthExceededException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Allows the creation of an asynchronous synthesis task, by starting a\\n      new <code>SpeechSynthesisTask</code>. This operation requires all the\\n      standard information needed for speech synthesis, plus the name of an\\n      Amazon S3 bucket for the service to store the output of the synthesis task\\n      and two optional parameters (<code>OutputS3KeyPrefix</code> and\\n        <code>SnsTopicArn</code>). Once the synthesis task is created, this\\n      operation will return a <code>SpeechSynthesisTask</code> object, which\\n      will include an identifier of this task as well as the current status. The\\n        <code>SpeechSynthesisTask</code> object is available for 72 hours after\\n      starting the asynchronous synthesis task.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"POST\",\n                    \"uri\": \"/v1/synthesisTasks\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.polly#StartSpeechSynthesisTaskInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Engine\": {\n                    \"target\": \"com.amazonaws.polly#Engine\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the engine (<code>standard</code>, <code>neural</code>,\\n      <code>long-form</code> or <code>generative</code>) for Amazon Polly to use\\n      when processing input text for speech synthesis. Using a voice that\\n      is not supported for the engine selected will result in an error.</p>\"\n                    }\n                },\n                \"LanguageCode\": {\n                    \"target\": \"com.amazonaws.polly#LanguageCode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Optional language code for the Speech Synthesis request. This is only\\n      necessary if using a bilingual voice, such as Aditi, which can be used for\\n      either Indian English (en-IN) or Hindi (hi-IN). </p>\\n         <p>If a bilingual voice is used and no language code is specified, Amazon Polly\\n      uses the default language of the bilingual voice. The default language for\\n      any voice is the one returned by the <a href=\\\"https://docs.aws.amazon.com/polly/latest/dg/API_DescribeVoices.html\\\">DescribeVoices</a> operation for the <code>LanguageCode</code>\\n      parameter. For example, if no language code is specified, Aditi will use\\n      Indian English rather than Hindi.</p>\"\n                    }\n                },\n                \"LexiconNames\": {\n                    \"target\": \"com.amazonaws.polly#LexiconNameList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>List of one or more pronunciation lexicon names you want the service\\n      to apply during synthesis. Lexicons are applied only if the language of\\n      the lexicon is the same as the language of the voice. </p>\"\n                    }\n                },\n                \"OutputFormat\": {\n                    \"target\": \"com.amazonaws.polly#OutputFormat\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The format in which the returned output will be encoded. For audio\\n      stream, this will be mp3, ogg_vorbis, or pcm. For speech marks, this will\\n      be json. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"OutputS3BucketName\": {\n                    \"target\": \"com.amazonaws.polly#OutputS3BucketName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Amazon S3 bucket name to which the output file will be saved.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"OutputS3KeyPrefix\": {\n                    \"target\": \"com.amazonaws.polly#OutputS3KeyPrefix\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon S3 key prefix for the output speech file.</p>\"\n                    }\n                },\n                \"SampleRate\": {\n                    \"target\": \"com.amazonaws.polly#SampleRate\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The audio frequency specified in Hz.</p>\\n         <p>The valid values for mp3 and ogg_vorbis are \\\"8000\\\", \\\"16000\\\", \\\"22050\\\",\\n      and \\\"24000\\\". The default value for standard voices is \\\"22050\\\". The default\\n      value for neural voices is \\\"24000\\\". The default value for long-form voices\\n      is \\\"24000\\\". The default value for generative voices is \\\"24000\\\".</p>\\n         <p>Valid values for pcm are \\\"8000\\\" and \\\"16000\\\" The default value is\\n      \\\"16000\\\". </p>\"\n                    }\n                },\n                \"SnsTopicArn\": {\n                    \"target\": \"com.amazonaws.polly#SnsTopicArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>ARN for the SNS topic optionally used for providing status\\n      notification for a speech synthesis task.</p>\"\n                    }\n                },\n                \"SpeechMarkTypes\": {\n                    \"target\": \"com.amazonaws.polly#SpeechMarkTypeList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of speech marks returned for the input text.</p>\"\n                    }\n                },\n                \"Text\": {\n                    \"target\": \"com.amazonaws.polly#Text\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The input text to synthesize. If you specify ssml as the TextType,\\n      follow the SSML format for the input text. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TextType\": {\n                    \"target\": \"com.amazonaws.polly#TextType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies whether the input text is plain text or SSML. The default\\n      value is plain text. </p>\"\n                    }\n                },\n                \"VoiceId\": {\n                    \"target\": \"com.amazonaws.polly#VoiceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Voice ID to use for the synthesis. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.polly#StartSpeechSynthesisTaskOutput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SynthesisTask\": {\n                    \"target\": \"com.amazonaws.polly#SynthesisTask\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>SynthesisTask object that provides information and attributes about a\\n      newly submitted speech synthesis task.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.polly#SynthesisTask\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Engine\": {\n                    \"target\": \"com.amazonaws.polly#Engine\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the engine (<code>standard</code>, <code>neural</code>,\\n      <code>long-form</code> or <code>generative</code>) for Amazon Polly to use\\n      when processing input text for speech synthesis. Using a voice that\\n      is not supported for the engine selected will result in an error.</p>\"\n                    }\n                },\n                \"TaskId\": {\n                    \"target\": \"com.amazonaws.polly#TaskId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Polly generated identifier for a speech synthesis task.</p>\"\n                    }\n                },\n                \"TaskStatus\": {\n                    \"target\": \"com.amazonaws.polly#TaskStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Current status of the individual speech synthesis task.</p>\"\n                    }\n                },\n                \"TaskStatusReason\": {\n                    \"target\": \"com.amazonaws.polly#TaskStatusReason\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Reason for the current status of a specific speech synthesis task,\\n      including errors if the task has failed.</p>\"\n                    }\n                },\n                \"OutputUri\": {\n                    \"target\": \"com.amazonaws.polly#OutputUri\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Pathway for the output speech file.</p>\"\n                    }\n                },\n                \"CreationTime\": {\n                    \"target\": \"com.amazonaws.polly#DateTime\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Timestamp for the time the synthesis task was started.</p>\"\n                    }\n                },\n                \"RequestCharacters\": {\n                    \"target\": \"com.amazonaws.polly#RequestCharacters\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>Number of billable characters synthesized.</p>\"\n                    }\n                },\n                \"SnsTopicArn\": {\n                    \"target\": \"com.amazonaws.polly#SnsTopicArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>ARN for the SNS topic optionally used for providing status\\n      notification for a speech synthesis task.</p>\"\n                    }\n                },\n                \"LexiconNames\": {\n                    \"target\": \"com.amazonaws.polly#LexiconNameList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>List of one or more pronunciation lexicon names you want the service\\n      to apply during synthesis. Lexicons are applied only if the language of\\n      the lexicon is the same as the language of the voice. </p>\"\n                    }\n                },\n                \"OutputFormat\": {\n                    \"target\": \"com.amazonaws.polly#OutputFormat\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The format in which the returned output will be encoded. For audio\\n      stream, this will be mp3, ogg_vorbis, or pcm. For speech marks, this will\\n      be json. </p>\"\n                    }\n                },\n                \"SampleRate\": {\n                    \"target\": \"com.amazonaws.polly#SampleRate\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The audio frequency specified in Hz.</p>\\n         <p>The valid values for mp3 and ogg_vorbis are \\\"8000\\\", \\\"16000\\\", \\\"22050\\\",\\n      and \\\"24000\\\". The default value for standard voices is \\\"22050\\\". The default\\n      value for neural voices is \\\"24000\\\". The default value for long-form voices\\n      is \\\"24000\\\". The default value for generative voices is \\\"24000\\\".</p>\\n         <p>Valid values for pcm are \\\"8000\\\" and \\\"16000\\\" The default value is\\n      \\\"16000\\\". </p>\"\n                    }\n                },\n                \"SpeechMarkTypes\": {\n                    \"target\": \"com.amazonaws.polly#SpeechMarkTypeList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of speech marks returned for the input text.</p>\"\n                    }\n                },\n                \"TextType\": {\n                    \"target\": \"com.amazonaws.polly#TextType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies whether the input text is plain text or SSML. The default\\n      value is plain text. </p>\"\n                    }\n                },\n                \"VoiceId\": {\n                    \"target\": \"com.amazonaws.polly#VoiceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Voice ID to use for the synthesis. </p>\"\n                    }\n                },\n                \"LanguageCode\": {\n                    \"target\": \"com.amazonaws.polly#LanguageCode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Optional language code for a synthesis task. This is only necessary if\\n      using a bilingual voice, such as Aditi, which can be used for either\\n      Indian English (en-IN) or Hindi (hi-IN). </p>\\n         <p>If a bilingual voice is used and no language code is specified, Amazon Polly\\n      uses the default language of the bilingual voice. The default language for\\n      any voice is the one returned by the <a href=\\\"https://docs.aws.amazon.com/polly/latest/dg/API_DescribeVoices.html\\\">DescribeVoices</a> operation for the <code>LanguageCode</code>\\n      parameter. For example, if no language code is specified, Aditi will use\\n      Indian English rather than Hindi.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>SynthesisTask object that provides information about a speech\\n      synthesis task.</p>\"\n            }\n        },\n        \"com.amazonaws.polly#SynthesisTaskNotFoundException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.polly#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The Speech Synthesis task with requested Task ID cannot be\\n      found.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.polly#SynthesisTasks\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.polly#SynthesisTask\"\n            }\n        },\n        \"com.amazonaws.polly#SynthesizeSpeech\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.polly#SynthesizeSpeechInput\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.polly#SynthesizeSpeechOutput\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.polly#EngineNotSupportedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.polly#InvalidSampleRateException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.polly#InvalidSsmlException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.polly#LanguageNotSupportedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.polly#LexiconNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.polly#MarksNotSupportedForFormatException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.polly#ServiceFailureException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.polly#SsmlMarksNotSupportedForTextTypeException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.polly#TextLengthExceededException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Synthesizes UTF-8 input, plain text or SSML, to a stream of bytes.\\n      SSML input must be valid, well-formed SSML. Some alphabets might not be\\n      available with all the voices (for example, Cyrillic might not be read at\\n      all by English voices) unless phoneme mapping is used. For more\\n      information, see <a href=\\\"https://docs.aws.amazon.com/polly/latest/dg/how-text-to-speech-works.html\\\">How it Works</a>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To synthesize speech\",\n                        \"documentation\": \"Synthesizes plain text or SSML into a file of human-like speech.\",\n                        \"input\": {\n                            \"LexiconNames\": [\n                                \"example\"\n                            ],\n                            \"OutputFormat\": \"mp3\",\n                            \"SampleRate\": \"8000\",\n                            \"Text\": \"All Gaul is divided into three parts\",\n                            \"TextType\": \"text\",\n                            \"VoiceId\": \"Joanna\"\n                        },\n                        \"output\": {\n                            \"AudioStream\": \"TEXT\",\n                            \"ContentType\": \"audio/mpeg\",\n                            \"RequestCharacters\": 37\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"POST\",\n                    \"uri\": \"/v1/speech\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.polly#SynthesizeSpeechInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Engine\": {\n                    \"target\": \"com.amazonaws.polly#Engine\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the engine (<code>standard</code>, <code>neural</code>,\\n      <code>long-form</code>, or <code>generative</code>) for Amazon Polly\\n      to use when processing input text for speech synthesis. Provide an engine\\n      that is supported by the voice you select. If you don't provide an engine,\\n      the standard engine is selected by default. If a chosen voice isn't supported\\n      by the standard engine, this will result in an error. For information on\\n      Amazon Polly voices and which voices are available for each engine, see <a href=\\\"https://docs.aws.amazon.com/polly/latest/dg/voicelist.html\\\">Available Voices</a>.</p>\"\n                    }\n                },\n                \"LanguageCode\": {\n                    \"target\": \"com.amazonaws.polly#LanguageCode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Optional language code for the Synthesize Speech request. This is only\\n      necessary if using a bilingual voice, such as Aditi, which can be used for\\n      either Indian English (en-IN) or Hindi (hi-IN). </p>\\n         <p>If a bilingual voice is used and no language code is specified, Amazon Polly\\n      uses the default language of the bilingual voice. The default language for\\n      any voice is the one returned by the <a href=\\\"https://docs.aws.amazon.com/polly/latest/dg/API_DescribeVoices.html\\\">DescribeVoices</a> operation for the <code>LanguageCode</code>\\n      parameter. For example, if no language code is specified, Aditi will use\\n      Indian English rather than Hindi.</p>\"\n                    }\n                },\n                \"LexiconNames\": {\n                    \"target\": \"com.amazonaws.polly#LexiconNameList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>List of one or more pronunciation lexicon names you want the\\n      service to apply during synthesis. Lexicons are applied only if the\\n      language of the lexicon is the same as the language of the voice. For\\n      information about storing lexicons, see <a href=\\\"https://docs.aws.amazon.com/polly/latest/dg/API_PutLexicon.html\\\">PutLexicon</a>.</p>\"\n                    }\n                },\n                \"OutputFormat\": {\n                    \"target\": \"com.amazonaws.polly#OutputFormat\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The format in which the returned output will be encoded. For audio\\n      stream, this will be mp3, ogg_vorbis, or pcm. For speech marks, this will\\n      be json. </p>\\n         <p>When pcm is used, the content returned is audio/pcm in a signed\\n      16-bit, 1 channel (mono), little-endian format. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"SampleRate\": {\n                    \"target\": \"com.amazonaws.polly#SampleRate\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The audio frequency specified in Hz.</p>\\n         <p>The valid values for mp3 and ogg_vorbis are \\\"8000\\\", \\\"16000\\\", \\\"22050\\\", \\\"24000\\\", \\\"44100\\\" and \\\"48000\\\". The default value for standard voices is \\\"22050\\\". The default\\n      value for neural voices is \\\"24000\\\". The default value for long-form voices\\n      is \\\"24000\\\". The default value for generative voices is \\\"24000\\\".</p>\\n         <p>Valid values for pcm are \\\"8000\\\" and \\\"16000\\\" The default value is\\n      \\\"16000\\\". </p>\"\n                    }\n                },\n                \"SpeechMarkTypes\": {\n                    \"target\": \"com.amazonaws.polly#SpeechMarkTypeList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of speech marks returned for the input text.</p>\"\n                    }\n                },\n                \"Text\": {\n                    \"target\": \"com.amazonaws.polly#Text\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> Input text to synthesize. If you specify <code>ssml</code> as the\\n        <code>TextType</code>, follow the SSML format for the input text.\\n    </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TextType\": {\n                    \"target\": \"com.amazonaws.polly#TextType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> Specifies whether the input text is plain text or SSML. The\\n      default value is plain text. For more information, see <a href=\\\"https://docs.aws.amazon.com/polly/latest/dg/ssml.html\\\">Using\\n        SSML</a>.</p>\"\n                    }\n                },\n                \"VoiceId\": {\n                    \"target\": \"com.amazonaws.polly#VoiceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> Voice ID to use for the synthesis. You can get a list of available\\n      voice IDs by calling the <a href=\\\"https://docs.aws.amazon.com/polly/latest/dg/API_DescribeVoices.html\\\">DescribeVoices</a> operation. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.polly#SynthesizeSpeechOutput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AudioStream\": {\n                    \"target\": \"com.amazonaws.polly#AudioStream\",\n                    \"traits\": {\n                        \"smithy.api#default\": \"\",\n                        \"smithy.api#documentation\": \"<p> Stream containing the synthesized speech. </p>\",\n                        \"smithy.api#httpPayload\": {}\n                    }\n                },\n                \"ContentType\": {\n                    \"target\": \"com.amazonaws.polly#ContentType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> Specifies the type audio stream. This should reflect the\\n        <code>OutputFormat</code> parameter in your request. </p>\\n         <ul>\\n            <li>\\n               <p> If you request <code>mp3</code> as the\\n            <code>OutputFormat</code>, the <code>ContentType</code> returned is\\n          audio/mpeg. </p>\\n            </li>\\n            <li>\\n               <p> If you request <code>ogg_vorbis</code> as the\\n            <code>OutputFormat</code>, the <code>ContentType</code> returned is\\n          audio/ogg. </p>\\n            </li>\\n            <li>\\n               <p> If you request <code>pcm</code> as the\\n            <code>OutputFormat</code>, the <code>ContentType</code> returned is\\n          audio/pcm in a signed 16-bit, 1 channel (mono), little-endian format.\\n        </p>\\n            </li>\\n            <li>\\n               <p>If you request <code>json</code> as the\\n            <code>OutputFormat</code>, the <code>ContentType</code> returned is\\n          application/x-json-stream.</p>\\n            </li>\\n         </ul>\\n         <p> </p>\",\n                        \"smithy.api#httpHeader\": \"Content-Type\"\n                    }\n                },\n                \"RequestCharacters\": {\n                    \"target\": \"com.amazonaws.polly#RequestCharacters\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>Number of characters synthesized.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-RequestCharacters\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.polly#TaskId\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#pattern\": \"^[a-zA-Z0-9_-]{1,100}$\"\n            }\n        },\n        \"com.amazonaws.polly#TaskStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"SCHEDULED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"scheduled\"\n                    }\n                },\n                \"IN_PROGRESS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"inProgress\"\n                    }\n                },\n                \"COMPLETED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"completed\"\n                    }\n                },\n                \"FAILED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"failed\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.polly#TaskStatusReason\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.polly#Text\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.polly#TextLengthExceededException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.polly#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The value of the \\\"Text\\\" parameter is longer than the accepted\\n      limits. For the <code>SynthesizeSpeech</code> API, the limit for input\\n      text is a maximum of 6000 characters total, of which no more than 3000 can\\n      be billed characters. For the <code>StartSpeechSynthesisTask</code> API,\\n      the maximum is 200,000 characters, of which no more than 100,000 can be\\n      billed characters. SSML tags are not counted as billed\\n      characters.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.polly#TextType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"SSML\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ssml\"\n                    }\n                },\n                \"TEXT\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"text\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.polly#UnsupportedPlsAlphabetException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.polly#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The alphabet specified by the lexicon is not a supported alphabet.\\n      Valid values are <code>x-sampa</code> and <code>ipa</code>.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.polly#UnsupportedPlsLanguageException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.polly#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The language specified in the lexicon is unsupported. For a list of\\n      supported languages, see <a href=\\\"https://docs.aws.amazon.com/polly/latest/dg/API_LexiconAttributes.html\\\">Lexicon Attributes</a>.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.polly#Voice\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Gender\": {\n                    \"target\": \"com.amazonaws.polly#Gender\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Gender of the voice.</p>\"\n                    }\n                },\n                \"Id\": {\n                    \"target\": \"com.amazonaws.polly#VoiceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Amazon Polly assigned voice ID. This is the ID that you specify when\\n      calling the <code>SynthesizeSpeech</code> operation.</p>\"\n                    }\n                },\n                \"LanguageCode\": {\n                    \"target\": \"com.amazonaws.polly#LanguageCode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Language code of the voice.</p>\"\n                    }\n                },\n                \"LanguageName\": {\n                    \"target\": \"com.amazonaws.polly#LanguageName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Human readable name of the language in English.</p>\"\n                    }\n                },\n                \"Name\": {\n                    \"target\": \"com.amazonaws.polly#VoiceName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Name of the voice (for example, Salli, Kendra, etc.). This provides\\n      a human readable voice name that you might display in your\\n      application.</p>\"\n                    }\n                },\n                \"AdditionalLanguageCodes\": {\n                    \"target\": \"com.amazonaws.polly#LanguageCodeList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Additional codes for languages available for the specified voice in\\n      addition to its default language. </p>\\n         <p>For example, the default language for Aditi is Indian English (en-IN)\\n      because it was first used for that language. Since Aditi is bilingual and\\n      fluent in both Indian English and Hindi, this parameter would show the\\n      code <code>hi-IN</code>.</p>\"\n                    }\n                },\n                \"SupportedEngines\": {\n                    \"target\": \"com.amazonaws.polly#EngineList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies which engines (<code>standard</code>, <code>neural</code>,\\n      <code>long-form</code> or <code>generative</code>) are supported by a given voice.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Description of the voice.</p>\"\n            }\n        },\n        \"com.amazonaws.polly#VoiceId\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"Aditi\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Aditi\"\n                    }\n                },\n                \"Amy\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Amy\"\n                    }\n                },\n                \"Astrid\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Astrid\"\n                    }\n                },\n                \"Bianca\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Bianca\"\n                    }\n                },\n                \"Brian\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Brian\"\n                    }\n                },\n                \"Camila\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Camila\"\n                    }\n                },\n                \"Carla\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Carla\"\n                    }\n                },\n                \"Carmen\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Carmen\"\n                    }\n                },\n                \"Celine\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Celine\"\n                    }\n                },\n                \"Chantal\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Chantal\"\n                    }\n                },\n                \"Conchita\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Conchita\"\n                    }\n                },\n                \"Cristiano\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Cristiano\"\n                    }\n                },\n                \"Dora\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Dora\"\n                    }\n                },\n                \"Emma\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Emma\"\n                    }\n                },\n                \"Enrique\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Enrique\"\n                    }\n                },\n                \"Ewa\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Ewa\"\n                    }\n                },\n                \"Filiz\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Filiz\"\n                    }\n                },\n                \"Gabrielle\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Gabrielle\"\n                    }\n                },\n                \"Geraint\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Geraint\"\n                    }\n                },\n                \"Giorgio\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Giorgio\"\n                    }\n                },\n                \"Gwyneth\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Gwyneth\"\n                    }\n                },\n                \"Hans\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Hans\"\n                    }\n                },\n                \"Ines\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Ines\"\n                    }\n                },\n                \"Ivy\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Ivy\"\n                    }\n                },\n                \"Jacek\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Jacek\"\n                    }\n                },\n                \"Jan\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Jan\"\n                    }\n                },\n                \"Joanna\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Joanna\"\n                    }\n                },\n                \"Joey\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Joey\"\n                    }\n                },\n                \"Justin\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Justin\"\n                    }\n                },\n                \"Karl\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Karl\"\n                    }\n                },\n                \"Kendra\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Kendra\"\n                    }\n                },\n                \"Kevin\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Kevin\"\n                    }\n                },\n                \"Kimberly\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Kimberly\"\n                    }\n                },\n                \"Lea\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Lea\"\n                    }\n                },\n                \"Liv\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Liv\"\n                    }\n                },\n                \"Lotte\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Lotte\"\n                    }\n                },\n                \"Lucia\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Lucia\"\n                    }\n                },\n                \"Lupe\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Lupe\"\n                    }\n                },\n                \"Mads\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Mads\"\n                    }\n                },\n                \"Maja\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Maja\"\n                    }\n                },\n                \"Marlene\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Marlene\"\n                    }\n                },\n                \"Mathieu\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Mathieu\"\n                    }\n                },\n                \"Matthew\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Matthew\"\n                    }\n                },\n                \"Maxim\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Maxim\"\n                    }\n                },\n                \"Mia\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Mia\"\n                    }\n                },\n                \"Miguel\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Miguel\"\n                    }\n                },\n                \"Mizuki\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Mizuki\"\n                    }\n                },\n                \"Naja\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Naja\"\n                    }\n                },\n                \"Nicole\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Nicole\"\n                    }\n                },\n                \"Olivia\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Olivia\"\n                    }\n                },\n                \"Penelope\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Penelope\"\n                    }\n                },\n                \"Raveena\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Raveena\"\n                    }\n                },\n                \"Ricardo\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Ricardo\"\n                    }\n                },\n                \"Ruben\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Ruben\"\n                    }\n                },\n                \"Russell\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Russell\"\n                    }\n                },\n                \"Salli\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Salli\"\n                    }\n                },\n                \"Seoyeon\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Seoyeon\"\n                    }\n                },\n                \"Takumi\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Takumi\"\n                    }\n                },\n                \"Tatyana\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Tatyana\"\n                    }\n                },\n                \"Vicki\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Vicki\"\n                    }\n                },\n                \"Vitoria\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Vitoria\"\n                    }\n                },\n                \"Zeina\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Zeina\"\n                    }\n                },\n                \"Zhiyu\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Zhiyu\"\n                    }\n                },\n                \"Aria\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Aria\"\n                    }\n                },\n                \"Ayanda\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Ayanda\"\n                    }\n                },\n                \"Arlet\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Arlet\"\n                    }\n                },\n                \"Hannah\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Hannah\"\n                    }\n                },\n                \"Arthur\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Arthur\"\n                    }\n                },\n                \"Daniel\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Daniel\"\n                    }\n                },\n                \"Liam\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Liam\"\n                    }\n                },\n                \"Pedro\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Pedro\"\n                    }\n                },\n                \"Kajal\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Kajal\"\n                    }\n                },\n                \"Hiujin\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Hiujin\"\n                    }\n                },\n                \"Laura\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Laura\"\n                    }\n                },\n                \"Elin\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Elin\"\n                    }\n                },\n                \"Ida\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Ida\"\n                    }\n                },\n                \"Suvi\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Suvi\"\n                    }\n                },\n                \"Ola\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Ola\"\n                    }\n                },\n                \"Hala\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Hala\"\n                    }\n                },\n                \"Andres\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Andres\"\n                    }\n                },\n                \"Sergio\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Sergio\"\n                    }\n                },\n                \"Remi\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Remi\"\n                    }\n                },\n                \"Adriano\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Adriano\"\n                    }\n                },\n                \"Thiago\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Thiago\"\n                    }\n                },\n                \"Ruth\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Ruth\"\n                    }\n                },\n                \"Stephen\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Stephen\"\n                    }\n                },\n                \"Kazuha\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Kazuha\"\n                    }\n                },\n                \"Tomoko\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Tomoko\"\n                    }\n                },\n                \"Niamh\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Niamh\"\n                    }\n                },\n                \"Sofie\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Sofie\"\n                    }\n                },\n                \"Lisa\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Lisa\"\n                    }\n                },\n                \"Isabelle\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Isabelle\"\n                    }\n                },\n                \"Zayd\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Zayd\"\n                    }\n                },\n                \"Danielle\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Danielle\"\n                    }\n                },\n                \"Gregory\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Gregory\"\n                    }\n                },\n                \"Burcu\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Burcu\"\n                    }\n                },\n                \"Jitka\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Jitka\"\n                    }\n                },\n                \"Sabrina\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Sabrina\"\n                    }\n                },\n                \"Jasmine\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Jasmine\"\n                    }\n                },\n                \"Jihye\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Jihye\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.polly#VoiceList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.polly#Voice\"\n            }\n        },\n        \"com.amazonaws.polly#VoiceName\": {\n            \"type\": \"string\"\n        }\n    }\n}\n"
  },
  {
    "path": "aws/sdk/aws-models/route-53.json",
    "content": "{\n    \"smithy\": \"2.0\",\n    \"metadata\": {\n        \"suppressions\": [\n            {\n                \"id\": \"HttpMethodSemantics\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"HttpResponseCodeSemantics\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"PaginatedTrait\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"HttpHeaderTrait\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"HttpUriConflict\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"Service\",\n                \"namespace\": \"*\"\n            }\n        ]\n    },\n    \"shapes\": {\n        \"com.amazonaws.route53#ARN\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 20,\n                    \"max\": 2048\n                },\n                \"smithy.api#pattern\": \"\\\\S\"\n            }\n        },\n        \"com.amazonaws.route53#AWSAccountID\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.route53#AWSDnsV20130401\": {\n            \"type\": \"service\",\n            \"version\": \"2013-04-01\",\n            \"operations\": [\n                {\n                    \"target\": \"com.amazonaws.route53#ActivateKeySigningKey\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#AssociateVPCWithHostedZone\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#ChangeCidrCollection\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#ChangeResourceRecordSets\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#ChangeTagsForResource\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#CreateCidrCollection\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#CreateHealthCheck\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#CreateHostedZone\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#CreateKeySigningKey\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#CreateQueryLoggingConfig\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#CreateReusableDelegationSet\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#CreateTrafficPolicy\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#CreateTrafficPolicyInstance\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#CreateTrafficPolicyVersion\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#CreateVPCAssociationAuthorization\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#DeactivateKeySigningKey\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#DeleteCidrCollection\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#DeleteHealthCheck\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#DeleteHostedZone\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#DeleteKeySigningKey\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#DeleteQueryLoggingConfig\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#DeleteReusableDelegationSet\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#DeleteTrafficPolicy\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#DeleteTrafficPolicyInstance\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#DeleteVPCAssociationAuthorization\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#DisableHostedZoneDNSSEC\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#DisassociateVPCFromHostedZone\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#EnableHostedZoneDNSSEC\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#GetAccountLimit\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#GetChange\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#GetCheckerIpRanges\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#GetDNSSEC\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#GetGeoLocation\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#GetHealthCheck\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#GetHealthCheckCount\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#GetHealthCheckLastFailureReason\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#GetHealthCheckStatus\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#GetHostedZone\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#GetHostedZoneCount\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#GetHostedZoneLimit\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#GetQueryLoggingConfig\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#GetReusableDelegationSet\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#GetReusableDelegationSetLimit\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#GetTrafficPolicy\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#GetTrafficPolicyInstance\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#GetTrafficPolicyInstanceCount\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#ListCidrBlocks\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#ListCidrCollections\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#ListCidrLocations\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#ListGeoLocations\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#ListHealthChecks\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#ListHostedZones\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#ListHostedZonesByName\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#ListHostedZonesByVPC\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#ListQueryLoggingConfigs\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#ListResourceRecordSets\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#ListReusableDelegationSets\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#ListTagsForResource\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#ListTagsForResources\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#ListTrafficPolicies\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#ListTrafficPolicyInstances\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#ListTrafficPolicyInstancesByHostedZone\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#ListTrafficPolicyInstancesByPolicy\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#ListTrafficPolicyVersions\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#ListVPCAssociationAuthorizations\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#TestDNSAnswer\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#UpdateHealthCheck\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#UpdateHostedZoneComment\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#UpdateTrafficPolicyComment\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#UpdateTrafficPolicyInstance\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#service\": {\n                    \"sdkId\": \"Route 53\",\n                    \"arnNamespace\": \"route53\",\n                    \"cloudFormationName\": \"Route53\",\n                    \"cloudTrailEventSource\": \"route53.amazonaws.com\",\n                    \"docId\": \"route53-2013-04-01\",\n                    \"endpointPrefix\": \"route53\"\n                },\n                \"aws.auth#sigv4\": {\n                    \"name\": \"route53\"\n                },\n                \"aws.protocols#restXml\": {},\n                \"smithy.api#documentation\": \"<p>Amazon Route 53 is a highly available and scalable Domain Name System (DNS) web\\n\\t\\t\\tservice.</p>\\n         <p>You can use Route 53 to:</p>\\n         <ul>\\n            <li>\\n               <p>Register domain names.</p>\\n               <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/welcome-domain-registration.html\\\">How domain registration works</a>.</p>\\n            </li>\\n            <li>\\n               <p>Route internet traffic to the resources for your domain</p>\\n               <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/welcome-dns-service.html\\\">How internet traffic is routed to your website or web application</a>.</p>\\n            </li>\\n            <li>\\n               <p>Check the health of your resources.</p>\\n               <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/welcome-health-checks.html\\\">How Route 53 checks the health of your resources</a>.</p>\\n            </li>\\n         </ul>\",\n                \"smithy.api#title\": \"Amazon Route 53\",\n                \"smithy.api#xmlNamespace\": {\n                    \"uri\": \"https://route53.amazonaws.com/doc/2013-04-01/\"\n                },\n                \"smithy.rules#endpointRuleSet\": {\n                    \"version\": \"1.0\",\n                    \"parameters\": {\n                        \"Region\": {\n                            \"builtIn\": \"AWS::Region\",\n                            \"required\": false,\n                            \"documentation\": \"The AWS region used to dispatch the request.\",\n                            \"type\": \"String\"\n                        },\n                        \"UseDualStack\": {\n                            \"builtIn\": \"AWS::UseDualStack\",\n                            \"required\": true,\n                            \"default\": false,\n                            \"documentation\": \"When true, use the dual-stack endpoint. If the configured endpoint does not support dual-stack, dispatching the request MAY return an error.\",\n                            \"type\": \"Boolean\"\n                        },\n                        \"UseFIPS\": {\n                            \"builtIn\": \"AWS::UseFIPS\",\n                            \"required\": true,\n                            \"default\": false,\n                            \"documentation\": \"When true, send this request to the FIPS-compliant regional endpoint. If the configured endpoint does not have a FIPS compliant endpoint, dispatching the request will return an error.\",\n                            \"type\": \"Boolean\"\n                        },\n                        \"Endpoint\": {\n                            \"builtIn\": \"SDK::Endpoint\",\n                            \"required\": false,\n                            \"documentation\": \"Override the endpoint used to send this request\",\n                            \"type\": \"String\"\n                        }\n                    },\n                    \"rules\": [\n                        {\n                            \"conditions\": [\n                                {\n                                    \"fn\": \"isSet\",\n                                    \"argv\": [\n                                        {\n                                            \"ref\": \"Endpoint\"\n                                        }\n                                    ]\n                                }\n                            ],\n                            \"rules\": [\n                                {\n                                    \"conditions\": [\n                                        {\n                                            \"fn\": \"booleanEquals\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"UseFIPS\"\n                                                },\n                                                true\n                                            ]\n                                        }\n                                    ],\n                                    \"error\": \"Invalid Configuration: FIPS and custom endpoint are not supported\",\n                                    \"type\": \"error\"\n                                },\n                                {\n                                    \"conditions\": [\n                                        {\n                                            \"fn\": \"booleanEquals\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"UseDualStack\"\n                                                },\n                                                true\n                                            ]\n                                        }\n                                    ],\n                                    \"error\": \"Invalid Configuration: Dualstack and custom endpoint are not supported\",\n                                    \"type\": \"error\"\n                                },\n                                {\n                                    \"conditions\": [],\n                                    \"endpoint\": {\n                                        \"url\": {\n                                            \"ref\": \"Endpoint\"\n                                        },\n                                        \"properties\": {},\n                                        \"headers\": {}\n                                    },\n                                    \"type\": \"endpoint\"\n                                }\n                            ],\n                            \"type\": \"tree\"\n                        },\n                        {\n                            \"conditions\": [\n                                {\n                                    \"fn\": \"isSet\",\n                                    \"argv\": [\n                                        {\n                                            \"ref\": \"Region\"\n                                        }\n                                    ]\n                                }\n                            ],\n                            \"rules\": [\n                                {\n                                    \"conditions\": [\n                                        {\n                                            \"fn\": \"aws.partition\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"Region\"\n                                                }\n                                            ],\n                                            \"assign\": \"PartitionResult\"\n                                        }\n                                    ],\n                                    \"rules\": [\n                                        {\n                                            \"conditions\": [\n                                                {\n                                                    \"fn\": \"stringEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"fn\": \"getAttr\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"PartitionResult\"\n                                                                },\n                                                                \"name\"\n                                                            ]\n                                                        },\n                                                        \"aws\"\n                                                    ]\n                                                },\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseFIPS\"\n                                                        },\n                                                        false\n                                                    ]\n                                                },\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseDualStack\"\n                                                        },\n                                                        false\n                                                    ]\n                                                }\n                                            ],\n                                            \"endpoint\": {\n                                                \"url\": \"https://route53.amazonaws.com\",\n                                                \"properties\": {\n                                                    \"authSchemes\": [\n                                                        {\n                                                            \"name\": \"sigv4\",\n                                                            \"signingName\": \"route53\",\n                                                            \"signingRegion\": \"us-east-1\"\n                                                        }\n                                                    ]\n                                                },\n                                                \"headers\": {}\n                                            },\n                                            \"type\": \"endpoint\"\n                                        },\n                                        {\n                                            \"conditions\": [\n                                                {\n                                                    \"fn\": \"stringEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"fn\": \"getAttr\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"PartitionResult\"\n                                                                },\n                                                                \"name\"\n                                                            ]\n                                                        },\n                                                        \"aws\"\n                                                    ]\n                                                },\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseFIPS\"\n                                                        },\n                                                        true\n                                                    ]\n                                                },\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseDualStack\"\n                                                        },\n                                                        false\n                                                    ]\n                                                }\n                                            ],\n                                            \"endpoint\": {\n                                                \"url\": \"https://route53-fips.amazonaws.com\",\n                                                \"properties\": {\n                                                    \"authSchemes\": [\n                                                        {\n                                                            \"name\": \"sigv4\",\n                                                            \"signingName\": \"route53\",\n                                                            \"signingRegion\": \"us-east-1\"\n                                                        }\n                                                    ]\n                                                },\n                                                \"headers\": {}\n                                            },\n                                            \"type\": \"endpoint\"\n                                        },\n                                        {\n                                            \"conditions\": [\n                                                {\n                                                    \"fn\": \"stringEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"fn\": \"getAttr\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"PartitionResult\"\n                                                                },\n                                                                \"name\"\n                                                            ]\n                                                        },\n                                                        \"aws-cn\"\n                                                    ]\n                                                },\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseFIPS\"\n                                                        },\n                                                        false\n                                                    ]\n                                                },\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseDualStack\"\n                                                        },\n                                                        false\n                                                    ]\n                                                }\n                                            ],\n                                            \"endpoint\": {\n                                                \"url\": \"https://route53.amazonaws.com.cn\",\n                                                \"properties\": {\n                                                    \"authSchemes\": [\n                                                        {\n                                                            \"name\": \"sigv4\",\n                                                            \"signingName\": \"route53\",\n                                                            \"signingRegion\": \"cn-northwest-1\"\n                                                        }\n                                                    ]\n                                                },\n                                                \"headers\": {}\n                                            },\n                                            \"type\": \"endpoint\"\n                                        },\n                                        {\n                                            \"conditions\": [\n                                                {\n                                                    \"fn\": \"stringEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"fn\": \"getAttr\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"PartitionResult\"\n                                                                },\n                                                                \"name\"\n                                                            ]\n                                                        },\n                                                        \"aws-us-gov\"\n                                                    ]\n                                                },\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseFIPS\"\n                                                        },\n                                                        false\n                                                    ]\n                                                },\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseDualStack\"\n                                                        },\n                                                        false\n                                                    ]\n                                                }\n                                            ],\n                                            \"endpoint\": {\n                                                \"url\": \"https://route53.us-gov.amazonaws.com\",\n                                                \"properties\": {\n                                                    \"authSchemes\": [\n                                                        {\n                                                            \"name\": \"sigv4\",\n                                                            \"signingName\": \"route53\",\n                                                            \"signingRegion\": \"us-gov-west-1\"\n                                                        }\n                                                    ]\n                                                },\n                                                \"headers\": {}\n                                            },\n                                            \"type\": \"endpoint\"\n                                        },\n                                        {\n                                            \"conditions\": [\n                                                {\n                                                    \"fn\": \"stringEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"fn\": \"getAttr\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"PartitionResult\"\n                                                                },\n                                                                \"name\"\n                                                            ]\n                                                        },\n                                                        \"aws-us-gov\"\n                                                    ]\n                                                },\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseFIPS\"\n                                                        },\n                                                        true\n                                                    ]\n                                                },\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseDualStack\"\n                                                        },\n                                                        false\n                                                    ]\n                                                }\n                                            ],\n                                            \"endpoint\": {\n                                                \"url\": \"https://route53.us-gov.amazonaws.com\",\n                                                \"properties\": {\n                                                    \"authSchemes\": [\n                                                        {\n                                                            \"name\": \"sigv4\",\n                                                            \"signingName\": \"route53\",\n                                                            \"signingRegion\": \"us-gov-west-1\"\n                                                        }\n                                                    ]\n                                                },\n                                                \"headers\": {}\n                                            },\n                                            \"type\": \"endpoint\"\n                                        },\n                                        {\n                                            \"conditions\": [\n                                                {\n                                                    \"fn\": \"stringEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"fn\": \"getAttr\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"PartitionResult\"\n                                                                },\n                                                                \"name\"\n                                                            ]\n                                                        },\n                                                        \"aws-iso\"\n                                                    ]\n                                                },\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseFIPS\"\n                                                        },\n                                                        false\n                                                    ]\n                                                },\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseDualStack\"\n                                                        },\n                                                        false\n                                                    ]\n                                                }\n                                            ],\n                                            \"endpoint\": {\n                                                \"url\": \"https://route53.c2s.ic.gov\",\n                                                \"properties\": {\n                                                    \"authSchemes\": [\n                                                        {\n                                                            \"name\": \"sigv4\",\n                                                            \"signingName\": \"route53\",\n                                                            \"signingRegion\": \"us-iso-east-1\"\n                                                        }\n                                                    ]\n                                                },\n                                                \"headers\": {}\n                                            },\n                                            \"type\": \"endpoint\"\n                                        },\n                                        {\n                                            \"conditions\": [\n                                                {\n                                                    \"fn\": \"stringEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"fn\": \"getAttr\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"PartitionResult\"\n                                                                },\n                                                                \"name\"\n                                                            ]\n                                                        },\n                                                        \"aws-iso-b\"\n                                                    ]\n                                                },\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseFIPS\"\n                                                        },\n                                                        false\n                                                    ]\n                                                },\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseDualStack\"\n                                                        },\n                                                        false\n                                                    ]\n                                                }\n                                            ],\n                                            \"endpoint\": {\n                                                \"url\": \"https://route53.sc2s.sgov.gov\",\n                                                \"properties\": {\n                                                    \"authSchemes\": [\n                                                        {\n                                                            \"name\": \"sigv4\",\n                                                            \"signingName\": \"route53\",\n                                                            \"signingRegion\": \"us-isob-east-1\"\n                                                        }\n                                                    ]\n                                                },\n                                                \"headers\": {}\n                                            },\n                                            \"type\": \"endpoint\"\n                                        },\n                                        {\n                                            \"conditions\": [\n                                                {\n                                                    \"fn\": \"stringEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"fn\": \"getAttr\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"PartitionResult\"\n                                                                },\n                                                                \"name\"\n                                                            ]\n                                                        },\n                                                        \"aws-iso-e\"\n                                                    ]\n                                                },\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseFIPS\"\n                                                        },\n                                                        false\n                                                    ]\n                                                },\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseDualStack\"\n                                                        },\n                                                        false\n                                                    ]\n                                                }\n                                            ],\n                                            \"endpoint\": {\n                                                \"url\": \"https://route53.cloud.adc-e.uk\",\n                                                \"properties\": {\n                                                    \"authSchemes\": [\n                                                        {\n                                                            \"name\": \"sigv4\",\n                                                            \"signingName\": \"route53\",\n                                                            \"signingRegion\": \"eu-isoe-west-1\"\n                                                        }\n                                                    ]\n                                                },\n                                                \"headers\": {}\n                                            },\n                                            \"type\": \"endpoint\"\n                                        },\n                                        {\n                                            \"conditions\": [\n                                                {\n                                                    \"fn\": \"stringEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"fn\": \"getAttr\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"PartitionResult\"\n                                                                },\n                                                                \"name\"\n                                                            ]\n                                                        },\n                                                        \"aws-iso-f\"\n                                                    ]\n                                                },\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseFIPS\"\n                                                        },\n                                                        false\n                                                    ]\n                                                },\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseDualStack\"\n                                                        },\n                                                        false\n                                                    ]\n                                                }\n                                            ],\n                                            \"endpoint\": {\n                                                \"url\": \"https://route53.csp.hci.ic.gov\",\n                                                \"properties\": {\n                                                    \"authSchemes\": [\n                                                        {\n                                                            \"name\": \"sigv4\",\n                                                            \"signingName\": \"route53\",\n                                                            \"signingRegion\": \"us-isof-south-1\"\n                                                        }\n                                                    ]\n                                                },\n                                                \"headers\": {}\n                                            },\n                                            \"type\": \"endpoint\"\n                                        },\n                                        {\n                                            \"conditions\": [\n                                                {\n                                                    \"fn\": \"stringEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"fn\": \"getAttr\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"PartitionResult\"\n                                                                },\n                                                                \"name\"\n                                                            ]\n                                                        },\n                                                        \"aws-eusc\"\n                                                    ]\n                                                },\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseFIPS\"\n                                                        },\n                                                        false\n                                                    ]\n                                                },\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseDualStack\"\n                                                        },\n                                                        false\n                                                    ]\n                                                }\n                                            ],\n                                            \"endpoint\": {\n                                                \"url\": \"https://route53.amazonaws.eu\",\n                                                \"properties\": {\n                                                    \"authSchemes\": [\n                                                        {\n                                                            \"name\": \"sigv4\",\n                                                            \"signingName\": \"route53\",\n                                                            \"signingRegion\": \"eusc-de-east-1\"\n                                                        }\n                                                    ]\n                                                },\n                                                \"headers\": {}\n                                            },\n                                            \"type\": \"endpoint\"\n                                        },\n                                        {\n                                            \"conditions\": [\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseFIPS\"\n                                                        },\n                                                        true\n                                                    ]\n                                                },\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseDualStack\"\n                                                        },\n                                                        true\n                                                    ]\n                                                }\n                                            ],\n                                            \"rules\": [\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                true,\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"PartitionResult\"\n                                                                        },\n                                                                        \"supportsFIPS\"\n                                                                    ]\n                                                                }\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                true,\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"PartitionResult\"\n                                                                        },\n                                                                        \"supportsDualStack\"\n                                                                    ]\n                                                                }\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"rules\": [\n                                                        {\n                                                            \"conditions\": [],\n                                                            \"endpoint\": {\n                                                                \"url\": \"https://route53-fips.{Region}.{PartitionResult#dualStackDnsSuffix}\",\n                                                                \"properties\": {},\n                                                                \"headers\": {}\n                                                            },\n                                                            \"type\": \"endpoint\"\n                                                        }\n                                                    ],\n                                                    \"type\": \"tree\"\n                                                },\n                                                {\n                                                    \"conditions\": [],\n                                                    \"error\": \"FIPS and DualStack are enabled, but this partition does not support one or both\",\n                                                    \"type\": \"error\"\n                                                }\n                                            ],\n                                            \"type\": \"tree\"\n                                        },\n                                        {\n                                            \"conditions\": [\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseFIPS\"\n                                                        },\n                                                        true\n                                                    ]\n                                                }\n                                            ],\n                                            \"rules\": [\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"PartitionResult\"\n                                                                        },\n                                                                        \"supportsFIPS\"\n                                                                    ]\n                                                                },\n                                                                true\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"rules\": [\n                                                        {\n                                                            \"conditions\": [],\n                                                            \"endpoint\": {\n                                                                \"url\": \"https://route53-fips.{Region}.{PartitionResult#dnsSuffix}\",\n                                                                \"properties\": {},\n                                                                \"headers\": {}\n                                                            },\n                                                            \"type\": \"endpoint\"\n                                                        }\n                                                    ],\n                                                    \"type\": \"tree\"\n                                                },\n                                                {\n                                                    \"conditions\": [],\n                                                    \"error\": \"FIPS is enabled but this partition does not support FIPS\",\n                                                    \"type\": \"error\"\n                                                }\n                                            ],\n                                            \"type\": \"tree\"\n                                        },\n                                        {\n                                            \"conditions\": [\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseDualStack\"\n                                                        },\n                                                        true\n                                                    ]\n                                                }\n                                            ],\n                                            \"rules\": [\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                true,\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"PartitionResult\"\n                                                                        },\n                                                                        \"supportsDualStack\"\n                                                                    ]\n                                                                }\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"rules\": [\n                                                        {\n                                                            \"conditions\": [],\n                                                            \"endpoint\": {\n                                                                \"url\": \"https://route53.{Region}.{PartitionResult#dualStackDnsSuffix}\",\n                                                                \"properties\": {},\n                                                                \"headers\": {}\n                                                            },\n                                                            \"type\": \"endpoint\"\n                                                        }\n                                                    ],\n                                                    \"type\": \"tree\"\n                                                },\n                                                {\n                                                    \"conditions\": [],\n                                                    \"error\": \"DualStack is enabled but this partition does not support DualStack\",\n                                                    \"type\": \"error\"\n                                                }\n                                            ],\n                                            \"type\": \"tree\"\n                                        },\n                                        {\n                                            \"conditions\": [],\n                                            \"endpoint\": {\n                                                \"url\": \"https://route53.{Region}.{PartitionResult#dnsSuffix}\",\n                                                \"properties\": {},\n                                                \"headers\": {}\n                                            },\n                                            \"type\": \"endpoint\"\n                                        }\n                                    ],\n                                    \"type\": \"tree\"\n                                }\n                            ],\n                            \"type\": \"tree\"\n                        },\n                        {\n                            \"conditions\": [],\n                            \"error\": \"Invalid Configuration: Missing Region\",\n                            \"type\": \"error\"\n                        }\n                    ]\n                },\n                \"smithy.rules#endpointTests\": {\n                    \"testCases\": [\n                        {\n                            \"documentation\": \"For region aws-global with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"route53\",\n                                                \"signingRegion\": \"us-east-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://route53.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"aws-global\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region aws-global with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"route53\",\n                                                \"signingRegion\": \"us-east-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://route53-fips.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"aws-global\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-1 with FIPS enabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://route53-fips.us-east-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"route53\",\n                                                \"signingRegion\": \"us-east-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://route53-fips.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-1 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://route53.us-east-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"route53\",\n                                                \"signingRegion\": \"us-east-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://route53.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region aws-cn-global with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"route53\",\n                                                \"signingRegion\": \"cn-northwest-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://route53.amazonaws.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"aws-cn-global\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-north-1 with FIPS enabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://route53-fips.cn-north-1.api.amazonwebservices.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-north-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-north-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://route53-fips.cn-north-1.amazonaws.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-north-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-north-1 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://route53.cn-north-1.api.amazonwebservices.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-north-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-north-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"route53\",\n                                                \"signingRegion\": \"cn-northwest-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://route53.amazonaws.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-north-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region aws-us-gov-global with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"route53\",\n                                                \"signingRegion\": \"us-gov-west-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://route53.us-gov.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"aws-us-gov-global\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region aws-us-gov-global with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"route53\",\n                                                \"signingRegion\": \"us-gov-west-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://route53.us-gov.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"aws-us-gov-global\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-east-1 with FIPS enabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://route53-fips.us-gov-east-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-east-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"route53\",\n                                                \"signingRegion\": \"us-gov-west-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://route53.us-gov.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-east-1 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://route53.us-gov-east-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"route53\",\n                                                \"signingRegion\": \"us-gov-west-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://route53.us-gov.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region aws-iso-global with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"route53\",\n                                                \"signingRegion\": \"us-iso-east-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://route53.c2s.ic.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"aws-iso-global\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-iso-east-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://route53-fips.us-iso-east-1.c2s.ic.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-iso-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-iso-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"route53\",\n                                                \"signingRegion\": \"us-iso-east-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://route53.c2s.ic.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-iso-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region aws-iso-b-global with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"route53\",\n                                                \"signingRegion\": \"us-isob-east-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://route53.sc2s.sgov.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"aws-iso-b-global\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-isob-east-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://route53-fips.us-isob-east-1.sc2s.sgov.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-isob-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-isob-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"route53\",\n                                                \"signingRegion\": \"us-isob-east-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://route53.sc2s.sgov.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-isob-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-isoe-west-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"route53\",\n                                                \"signingRegion\": \"eu-isoe-west-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://route53.cloud.adc-e.uk\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-isoe-west-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-isof-south-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"route53\",\n                                                \"signingRegion\": \"us-isof-south-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://route53.csp.hci.ic.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-isof-south-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For custom endpoint with region set and fips disabled and dualstack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://example.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"For custom endpoint with region not set and fips disabled and dualstack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://example.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"For custom endpoint with fips enabled and dualstack disabled\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: FIPS and custom endpoint are not supported\"\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false,\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"For custom endpoint with fips disabled and dualstack enabled\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: Dualstack and custom endpoint are not supported\"\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true,\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"Missing region\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: Missing Region\"\n                            }\n                        }\n                    ],\n                    \"version\": \"1.0\"\n                }\n            }\n        },\n        \"com.amazonaws.route53#AWSRegion\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 64\n                }\n            }\n        },\n        \"com.amazonaws.route53#AccountLimit\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Type\": {\n                    \"target\": \"com.amazonaws.route53#AccountLimitType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The limit that you requested. Valid values include the following:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <b>MAX_HEALTH_CHECKS_BY_OWNER</b>: The maximum\\n\\t\\t\\t\\t\\tnumber of health checks that you can create using the current account.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>MAX_HOSTED_ZONES_BY_OWNER</b>: The maximum number\\n\\t\\t\\t\\t\\tof hosted zones that you can create using the current account.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>MAX_REUSABLE_DELEGATION_SETS_BY_OWNER</b>: The\\n\\t\\t\\t\\t\\tmaximum number of reusable delegation sets that you can create using the current\\n\\t\\t\\t\\t\\taccount.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>MAX_TRAFFIC_POLICIES_BY_OWNER</b>: The maximum\\n\\t\\t\\t\\t\\tnumber of traffic policies that you can create using the current account.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>MAX_TRAFFIC_POLICY_INSTANCES_BY_OWNER</b>: The\\n\\t\\t\\t\\t\\tmaximum number of traffic policy instances that you can create using the current\\n\\t\\t\\t\\t\\taccount. (Traffic policy instances are referred to as traffic flow policy\\n\\t\\t\\t\\t\\trecords in the Amazon Route 53 console.)</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Value\": {\n                    \"target\": \"com.amazonaws.route53#LimitValue\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The current value for the limit that is specified by <a href=\\\"https://docs.aws.amazon.com/Route53/latest/APIReference/API_AccountLimit.html#Route53-Type-AccountLimit-Type\\\">Type</a>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that contains the type of limit that you specified in the request and\\n\\t\\t\\tthe current value for that limit.</p>\"\n            }\n        },\n        \"com.amazonaws.route53#AccountLimitType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"MAX_HEALTH_CHECKS_BY_OWNER\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"MAX_HEALTH_CHECKS_BY_OWNER\"\n                    }\n                },\n                \"MAX_HOSTED_ZONES_BY_OWNER\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"MAX_HOSTED_ZONES_BY_OWNER\"\n                    }\n                },\n                \"MAX_TRAFFIC_POLICY_INSTANCES_BY_OWNER\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"MAX_TRAFFIC_POLICY_INSTANCES_BY_OWNER\"\n                    }\n                },\n                \"MAX_REUSABLE_DELEGATION_SETS_BY_OWNER\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"MAX_REUSABLE_DELEGATION_SETS_BY_OWNER\"\n                    }\n                },\n                \"MAX_TRAFFIC_POLICIES_BY_OWNER\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"MAX_TRAFFIC_POLICIES_BY_OWNER\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.route53#ActivateKeySigningKey\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.route53#ActivateKeySigningKeyRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.route53#ActivateKeySigningKeyResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.route53#ConcurrentModification\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidInput\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidKeySigningKeyStatus\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidKMSArn\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidSigningStatus\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#NoSuchKeySigningKey\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Activates a key-signing key (KSK) so that it can be used for signing by DNSSEC. This\\n\\t\\t\\toperation changes the KSK status to <code>ACTIVE</code>.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"POST\",\n                    \"uri\": \"/2013-04-01/keysigningkey/{HostedZoneId}/{Name}/activate\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.route53#ActivateKeySigningKeyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"HostedZoneId\": {\n                    \"target\": \"com.amazonaws.route53#ResourceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A unique string used to identify a hosted zone.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Name\": {\n                    \"target\": \"com.amazonaws.route53#SigningKeyName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A string used to identify a key-signing key (KSK). <code>Name</code> can include\\n\\t\\t\\tnumbers, letters, and underscores (_). <code>Name</code> must be unique for each\\n\\t\\t\\tkey-signing key in the same hosted zone.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.route53#ActivateKeySigningKeyResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ChangeInfo\": {\n                    \"target\": \"com.amazonaws.route53#ChangeInfo\",\n                    \"traits\": {\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.route53#AlarmIdentifier\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Region\": {\n                    \"target\": \"com.amazonaws.route53#CloudWatchRegion\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>For the CloudWatch alarm that you want Route 53 health checkers to use to determine\\n\\t\\t\\twhether this health check is healthy, the region that the alarm was created in.</p>\\n         <p>For the current list of CloudWatch regions, see <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/cw_region.html\\\">Amazon CloudWatch endpoints and\\n\\t\\t\\t\\tquotas</a> in the <i>Amazon Web Services General\\n\\t\\t\\tReference</i>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Name\": {\n                    \"target\": \"com.amazonaws.route53#AlarmName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the CloudWatch alarm that you want Amazon Route 53 health checkers to use\\n\\t\\t\\tto determine whether this health check is healthy.</p>\\n         <note>\\n            <p>Route 53 supports CloudWatch alarms with the following features:</p>\\n            <ul>\\n               <li>\\n                  <p>Standard-resolution metrics. High-resolution metrics aren't supported. For\\n\\t\\t\\t\\t\\t\\tmore information, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/publishingMetrics.html#high-resolution-metrics\\\">High-Resolution Metrics</a> in the <i>Amazon CloudWatch User\\n\\t\\t\\t\\t\\t\\t\\tGuide</i>.</p>\\n               </li>\\n               <li>\\n                  <p>Statistics: Average, Minimum, Maximum, Sum, and SampleCount. Extended\\n\\t\\t\\t\\t\\t\\tstatistics aren't supported.</p>\\n               </li>\\n            </ul>\\n         </note>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that identifies the CloudWatch alarm that you want Amazon Route 53\\n\\t\\t\\thealth checkers to use to determine whether the specified health check is\\n\\t\\t\\thealthy.</p>\"\n            }\n        },\n        \"com.amazonaws.route53#AlarmName\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 256\n                }\n            }\n        },\n        \"com.amazonaws.route53#AliasHealthEnabled\": {\n            \"type\": \"boolean\",\n            \"traits\": {\n                \"smithy.api#default\": false\n            }\n        },\n        \"com.amazonaws.route53#AliasTarget\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"HostedZoneId\": {\n                    \"target\": \"com.amazonaws.route53#ResourceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>\\n            <i>Alias resource records sets only</i>: The value used depends on where\\n\\t\\t\\tyou want to route traffic:</p>\\n         <dl>\\n            <dt>Amazon API Gateway custom regional APIs and edge-optimized APIs</dt>\\n            <dd>\\n               <p>Specify the hosted zone ID for your API. You can get the applicable value\\n\\t\\t\\t\\t\\t\\tusing the CLI command <a href=\\\"https://docs.aws.amazon.com/cli/latest/reference/apigateway/get-domain-names.html\\\">get-domain-names</a>:</p>\\n               <ul>\\n                  <li>\\n                     <p>For regional APIs, specify the value of\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t<code>regionalHostedZoneId</code>.</p>\\n                  </li>\\n                  <li>\\n                     <p>For edge-optimized APIs, specify the value of\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t<code>distributionHostedZoneId</code>.</p>\\n                  </li>\\n               </ul>\\n            </dd>\\n            <dt>Amazon Virtual Private Cloud interface VPC endpoint</dt>\\n            <dd>\\n               <p>Specify the hosted zone ID for your interface endpoint. You can get the\\n\\t\\t\\t\\t\\t\\tvalue of <code>HostedZoneId</code> using the CLI command\\n\\t\\t\\t\\t\\t\\t\\t<a href=\\\"https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-vpc-endpoints.html\\\">describe-vpc-endpoints</a>.</p>\\n            </dd>\\n            <dt>CloudFront distribution</dt>\\n            <dd>\\n               <p>Specify <code>Z2FDTNDATAQYW2</code>.</p>\\n               <note>\\n                  <p>Alias resource record sets for CloudFront can't be created in a\\n\\t\\t\\t\\t\\t\\t\\tprivate zone.</p>\\n               </note>\\n            </dd>\\n            <dt>Elastic Beanstalk environment</dt>\\n            <dd>\\n               <p>Specify the hosted zone ID for the region that you created the environment in. The\\n\\t\\t\\t\\t\\t\\tenvironment must have a regionalized subdomain. For a list of regions and\\n\\t\\t\\t\\t\\t\\tthe corresponding hosted zone IDs, see <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/elasticbeanstalk.html\\\">Elastic Beanstalk\\n\\t\\t\\t\\t\\t\\t\\tendpoints and quotas</a> in the <i>Amazon Web Services\\n\\t\\t\\t\\t\\t\\t\\tGeneral Reference</i>.</p>\\n            </dd>\\n            <dt>ELB load balancer</dt>\\n            <dd>\\n               <p>Specify the value of the hosted zone ID for the load balancer. Use the\\n\\t\\t\\t\\t\\t\\tfollowing methods to get the hosted zone ID:</p>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/elb.html\\\">Elastic Load Balancing endpoints and quotas</a> topic in\\n\\t\\t\\t\\t\\t\\t\\t\\tthe <i>Amazon Web Services General Reference</i>: Use\\n\\t\\t\\t\\t\\t\\t\\t\\tthe value that corresponds with the region that you created your\\n\\t\\t\\t\\t\\t\\t\\t\\tload balancer in. Note that there are separate columns for\\n\\t\\t\\t\\t\\t\\t\\t\\tApplication and Classic Load Balancers and for Network Load\\n\\t\\t\\t\\t\\t\\t\\t\\tBalancers.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <b>Amazon Web Services Management Console</b>: Go to the\\n\\t\\t\\t\\t\\t\\t\\t\\tAmazon EC2 page, choose <b>Load\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tBalancers</b> in the navigation pane, select the load\\n\\t\\t\\t\\t\\t\\t\\t\\tbalancer, and get the value of the <b>Hosted\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tzone</b> field on the <b>Description</b> tab.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <b>Elastic Load Balancing API</b>: Use\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t<code>DescribeLoadBalancers</code> to get the applicable value.\\n\\t\\t\\t\\t\\t\\t\\t\\tFor more information, see the applicable guide:</p>\\n                     <ul>\\n                        <li>\\n                           <p>Classic Load Balancers: Use <a href=\\\"https://docs.aws.amazon.com/elasticloadbalancing/2012-06-01/APIReference/API_DescribeLoadBalancers.html\\\">DescribeLoadBalancers</a> to get the value of\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t<code>CanonicalHostedZoneNameId</code>.</p>\\n                        </li>\\n                        <li>\\n                           <p>Application and Network Load Balancers: Use <a href=\\\"https://docs.aws.amazon.com/elasticloadbalancing/latest/APIReference/API_DescribeLoadBalancers.html\\\">DescribeLoadBalancers</a> to get the value of\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t<code>CanonicalHostedZoneId</code>.</p>\\n                        </li>\\n                     </ul>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <b>CLI</b>: Use\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t<code>describe-load-balancers</code> to get the applicable\\n\\t\\t\\t\\t\\t\\t\\t\\tvalue. For more information, see the applicable guide:</p>\\n                     <ul>\\n                        <li>\\n                           <p>Classic Load Balancers: Use <a href=\\\"http://docs.aws.amazon.com/cli/latest/reference/elb/describe-load-balancers.html\\\">describe-load-balancers</a> to get the value of\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t<code>CanonicalHostedZoneNameId</code>.</p>\\n                        </li>\\n                        <li>\\n                           <p>Application and Network Load Balancers: Use <a href=\\\"http://docs.aws.amazon.com/cli/latest/reference/elbv2/describe-load-balancers.html\\\">describe-load-balancers</a> to get the value of\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t<code>CanonicalHostedZoneId</code>.</p>\\n                        </li>\\n                     </ul>\\n                  </li>\\n               </ul>\\n            </dd>\\n            <dt>Global Accelerator accelerator</dt>\\n            <dd>\\n               <p>Specify <code>Z2BJ6XQ5FK7U4H</code>.</p>\\n            </dd>\\n            <dt>An Amazon S3 bucket configured as a static website</dt>\\n            <dd>\\n               <p>Specify the hosted zone ID for the region that you created the bucket in.\\n\\t\\t\\t\\t\\t\\tFor more information about valid values, see the table <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/s3.html#s3_website_region_endpoints\\\">Amazon S3\\n\\t\\t\\t\\t\\t\\t\\tWebsite Endpoints</a> in the <i>Amazon Web Services General\\n\\t\\t\\t\\t\\t\\t\\tReference</i>.</p>\\n            </dd>\\n            <dt>Another Route 53 resource record set in your hosted zone</dt>\\n            <dd>\\n               <p>Specify the hosted zone ID of your hosted zone. (An alias resource record\\n\\t\\t\\t\\t\\t\\tset can't reference a resource record set in a different hosted\\n\\t\\t\\t\\t\\t\\tzone.)</p>\\n            </dd>\\n         </dl>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DNSName\": {\n                    \"target\": \"com.amazonaws.route53#DNSName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>\\n            <i>Alias resource record sets only:</i> The value that you specify\\n\\t\\t\\tdepends on where you want to route queries:</p>\\n         <dl>\\n            <dt>Amazon API Gateway custom regional APIs and edge-optimized APIs</dt>\\n            <dd>\\n               <p>Specify the applicable domain name for your API. You can get the\\n\\t\\t\\t\\t\\t\\tapplicable value using the CLI command <a href=\\\"https://docs.aws.amazon.com/cli/latest/reference/apigateway/get-domain-names.html\\\">get-domain-names</a>:</p>\\n               <ul>\\n                  <li>\\n                     <p>For regional APIs, specify the value of\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t<code>regionalDomainName</code>.</p>\\n                  </li>\\n                  <li>\\n                     <p>For edge-optimized APIs, specify the value of\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t<code>distributionDomainName</code>. This is the name of the\\n\\t\\t\\t\\t\\t\\t\\t\\tassociated CloudFront distribution, such as\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t<code>da1b2c3d4e5.cloudfront.net</code>.</p>\\n                  </li>\\n               </ul>\\n               <note>\\n                  <p>The name of the record that you're creating must match a custom domain\\n\\t\\t\\t\\t\\t\\t\\tname for your API, such as <code>api.example.com</code>.</p>\\n               </note>\\n            </dd>\\n            <dt>Amazon Virtual Private Cloud interface VPC endpoint</dt>\\n            <dd>\\n               <p>Enter the API endpoint for the interface endpoint, such as\\n\\t\\t\\t\\t\\t\\t\\t<code>vpce-123456789abcdef01-example-us-east-1a.elasticloadbalancing.us-east-1.vpce.amazonaws.com</code>.\\n\\t\\t\\t\\t\\t\\tFor edge-optimized APIs, this is the domain name for the corresponding\\n\\t\\t\\t\\t\\t\\tCloudFront distribution. You can get the value of <code>DnsName</code> using\\n\\t\\t\\t\\t\\t\\tthe CLI command <a href=\\\"https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-vpc-endpoints.html\\\">describe-vpc-endpoints</a>.</p>\\n            </dd>\\n            <dt>CloudFront distribution</dt>\\n            <dd>\\n               <p>Specify the domain name that CloudFront assigned when you created your\\n\\t\\t\\t\\t\\t\\tdistribution.</p>\\n               <p>Your CloudFront distribution must include an alternate domain name that\\n\\t\\t\\t\\t\\t\\tmatches the name of the resource record set. For example, if the name of the\\n\\t\\t\\t\\t\\t\\tresource record set is <i>acme.example.com</i>, your\\n\\t\\t\\t\\t\\t\\tCloudFront distribution must include <i>acme.example.com</i>\\n\\t\\t\\t\\t\\t\\tas one of the alternate domain names. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/CNAMEs.html\\\">Using Alternate\\n\\t\\t\\t\\t\\t\\t\\tDomain Names (CNAMEs)</a> in the <i>Amazon CloudFront\\n\\t\\t\\t\\t\\t\\t\\tDeveloper Guide</i>.</p>\\n               <p>You can't create a resource record set in a private hosted zone to route\\n\\t\\t\\t\\t\\t\\ttraffic to a CloudFront distribution.</p>\\n               <note>\\n                  <p>For failover alias records, you can't specify a CloudFront\\n\\t\\t\\t\\t\\t\\t\\tdistribution for both the primary and secondary records. A distribution\\n\\t\\t\\t\\t\\t\\t\\tmust include an alternate domain name that matches the name of the\\n\\t\\t\\t\\t\\t\\t\\trecord. However, the primary and secondary records have the same name,\\n\\t\\t\\t\\t\\t\\t\\tand you can't include the same alternate domain name in more than one\\n\\t\\t\\t\\t\\t\\t\\tdistribution. </p>\\n               </note>\\n            </dd>\\n            <dt>Elastic Beanstalk environment</dt>\\n            <dd>\\n               <p>If the domain name for your Elastic Beanstalk environment includes the\\n\\t\\t\\t\\t\\t\\tregion that you deployed the environment in, you can create an alias record\\n\\t\\t\\t\\t\\t\\tthat routes traffic to the environment. For example, the domain name\\n\\t\\t\\t\\t\\t\\t\\t\\t<code>my-environment.<i>us-west-2</i>.elasticbeanstalk.com</code>\\n\\t\\t\\t\\t\\t\\tis a regionalized domain name. </p>\\n               <important>\\n                  <p>For environments that were created before early 2016, the domain name\\n\\t\\t\\t\\t\\t\\t\\tdoesn't include the region. To route traffic to these environments, you\\n\\t\\t\\t\\t\\t\\t\\tmust create a CNAME record instead of an alias record. Note that you\\n\\t\\t\\t\\t\\t\\t\\tcan't create a CNAME record for the root domain name. For example, if\\n\\t\\t\\t\\t\\t\\t\\tyour domain name is example.com, you can create a record that routes\\n\\t\\t\\t\\t\\t\\t\\ttraffic for acme.example.com to your Elastic Beanstalk environment, but\\n\\t\\t\\t\\t\\t\\t\\tyou can't create a record that routes traffic for example.com to your\\n\\t\\t\\t\\t\\t\\t\\tElastic Beanstalk environment.</p>\\n               </important>\\n               <p>For Elastic Beanstalk environments that have regionalized subdomains,\\n\\t\\t\\t\\t\\t\\tspecify the <code>CNAME</code> attribute for the environment. You can use\\n\\t\\t\\t\\t\\t\\tthe following methods to get the value of the CNAME attribute:</p>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Amazon Web Services Management Console</i>: For information about\\n\\t\\t\\t\\t\\t\\t\\t\\thow to get the value by using the console, see <a href=\\\"https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/customdomains.html\\\">Using Custom\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tDomains with Elastic Beanstalk</a> in the\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t<i>Elastic Beanstalk Developer\\n\\t\\t\\t\\t\\t\\t\\t\\tGuide</i>.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Elastic Beanstalk API</i>: Use the\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t<code>DescribeEnvironments</code> action to get the value of the\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t<code>CNAME</code> attribute. For more information, see <a href=\\\"https://docs.aws.amazon.com/elasticbeanstalk/latest/api/API_DescribeEnvironments.html\\\">DescribeEnvironments</a> in the <i>Elastic Beanstalk API Reference</i>.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>CLI</i>: Use the\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t<code>describe-environments</code> command to get the value of\\n\\t\\t\\t\\t\\t\\t\\t\\tthe <code>CNAME</code> attribute. For more information, see <a href=\\\"https://docs.aws.amazon.com/cli/latest/reference/elasticbeanstalk/describe-environments.html\\\">describe-environments</a> in the <i>CLI Command Reference</i>.</p>\\n                  </li>\\n               </ul>\\n            </dd>\\n            <dt>ELB load balancer</dt>\\n            <dd>\\n               <p>Specify the DNS name that is associated with the load balancer. Get the\\n\\t\\t\\t\\t\\t\\tDNS name by using the Amazon Web Services Management Console, the ELB API, or the CLI. </p>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <b>Amazon Web Services Management Console</b>: Go to the\\n\\t\\t\\t\\t\\t\\t\\t\\tEC2 page, choose <b>Load Balancers</b> in\\n\\t\\t\\t\\t\\t\\t\\t\\tthe navigation pane, choose the load balancer, choose the <b>Description</b> tab, and get the value of the\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t<b>DNS name</b> field. </p>\\n                     <p>If you're routing traffic to a Classic Load Balancer, get the\\n\\t\\t\\t\\t\\t\\t\\t\\tvalue that begins with <b>dualstack</b>.\\n\\t\\t\\t\\t\\t\\t\\t\\tIf you're routing traffic to another type of load balancer, get the\\n\\t\\t\\t\\t\\t\\t\\t\\tvalue that applies to the record type, A or AAAA.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <b>Elastic Load Balancing API</b>: Use\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t<code>DescribeLoadBalancers</code> to get the value of\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t<code>DNSName</code>. For more information, see the applicable\\n\\t\\t\\t\\t\\t\\t\\t\\tguide:</p>\\n                     <ul>\\n                        <li>\\n                           <p>Classic Load Balancers: <a href=\\\"https://docs.aws.amazon.com/elasticloadbalancing/2012-06-01/APIReference/API_DescribeLoadBalancers.html\\\">DescribeLoadBalancers</a>\\n                           </p>\\n                        </li>\\n                        <li>\\n                           <p>Application and Network Load Balancers: <a href=\\\"https://docs.aws.amazon.com/elasticloadbalancing/latest/APIReference/API_DescribeLoadBalancers.html\\\">DescribeLoadBalancers</a>\\n                           </p>\\n                        </li>\\n                     </ul>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <b>CLI</b>: Use\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t<code>describe-load-balancers</code> to get the value of\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t<code>DNSName</code>. For more information, see the applicable\\n\\t\\t\\t\\t\\t\\t\\t\\tguide:</p>\\n                     <ul>\\n                        <li>\\n                           <p>Classic Load Balancers: <a href=\\\"http://docs.aws.amazon.com/cli/latest/reference/elb/describe-load-balancers.html\\\">describe-load-balancers</a>\\n                           </p>\\n                        </li>\\n                        <li>\\n                           <p>Application and Network Load Balancers: <a href=\\\"http://docs.aws.amazon.com/cli/latest/reference/elbv2/describe-load-balancers.html\\\">describe-load-balancers</a>\\n                           </p>\\n                        </li>\\n                     </ul>\\n                  </li>\\n               </ul>\\n            </dd>\\n            <dt>Global Accelerator accelerator</dt>\\n            <dd>\\n               <p>Specify the DNS name for your accelerator:</p>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <b>Global Accelerator API:</b> To get\\n\\t\\t\\t\\t\\t\\t\\t\\tthe DNS name, use <a href=\\\"https://docs.aws.amazon.com/global-accelerator/latest/api/API_DescribeAccelerator.html\\\">DescribeAccelerator</a>.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <b>CLI:</b> To get the\\n\\t\\t\\t\\t\\t\\t\\t\\tDNS name, use <a href=\\\"https://docs.aws.amazon.com/cli/latest/reference/globalaccelerator/describe-accelerator.html\\\">describe-accelerator</a>.</p>\\n                  </li>\\n               </ul>\\n            </dd>\\n            <dt>Amazon S3 bucket that is configured as a static website</dt>\\n            <dd>\\n               <p>Specify the domain name of the Amazon S3 website endpoint that you created\\n\\t\\t\\t\\t\\t\\tthe bucket in, for example, <code>s3-website.us-east-2.amazonaws.com</code>.\\n\\t\\t\\t\\t\\t\\tFor more information about valid values, see the table <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/s3.html#s3_website_region_endpoints\\\">Amazon S3\\n\\t\\t\\t\\t\\t\\t\\tWebsite Endpoints</a> in the <i>Amazon Web Services General\\n\\t\\t\\t\\t\\t\\t\\tReference</i>. For more information about using S3 buckets for\\n\\t\\t\\t\\t\\t\\twebsites, see <a href=\\\"https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/getting-started.html\\\">Getting Started\\n\\t\\t\\t\\t\\t\\t\\twith Amazon Route 53</a> in the <i>Amazon Route 53 Developer\\n\\t\\t\\t\\t\\t\\t\\tGuide.</i>\\n               </p>\\n            </dd>\\n            <dt>Another Route 53 resource record set</dt>\\n            <dd>\\n               <p>Specify the value of the <code>Name</code> element for a resource record\\n\\t\\t\\t\\t\\t\\tset in the current hosted zone.</p>\\n               <note>\\n                  <p>If you're creating an alias record that has the same name as the\\n\\t\\t\\t\\t\\t\\t\\thosted zone (known as the zone apex), you can't specify the domain name\\n\\t\\t\\t\\t\\t\\t\\tfor a record for which the value of <code>Type</code> is\\n\\t\\t\\t\\t\\t\\t\\t\\t<code>CNAME</code>. This is because the alias record must have the\\n\\t\\t\\t\\t\\t\\t\\tsame type as the record that you're routing traffic to, and creating a\\n\\t\\t\\t\\t\\t\\t\\tCNAME record for the zone apex isn't supported even for an alias\\n\\t\\t\\t\\t\\t\\t\\trecord.</p>\\n               </note>\\n            </dd>\\n         </dl>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"EvaluateTargetHealth\": {\n                    \"target\": \"com.amazonaws.route53#AliasHealthEnabled\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>\\n            <i>Applies only to alias, failover alias, geolocation alias, latency alias, and\\n\\t\\t\\t\\tweighted alias resource record sets:</i> When\\n\\t\\t\\t\\t<code>EvaluateTargetHealth</code> is <code>true</code>, an alias resource record set\\n\\t\\t\\tinherits the health of the referenced Amazon Web Services resource, such as an ELB load\\n\\t\\t\\tbalancer or another resource record set in the hosted zone.</p>\\n         <p>Note the following:</p>\\n         <dl>\\n            <dt>CloudFront distributions</dt>\\n            <dd>\\n               <p>You can't set <code>EvaluateTargetHealth</code> to <code>true</code> when\\n\\t\\t\\t\\t\\t\\tthe alias target is a CloudFront distribution.</p>\\n            </dd>\\n            <dt>Elastic Beanstalk environments that have regionalized subdomains</dt>\\n            <dd>\\n               <p>If you specify an Elastic Beanstalk environment in <code>DNSName</code>\\n\\t\\t\\t\\t\\t\\tand the environment contains an ELB load balancer, Elastic Load Balancing\\n\\t\\t\\t\\t\\t\\troutes queries only to the healthy Amazon EC2 instances that are registered\\n\\t\\t\\t\\t\\t\\twith the load balancer. (An environment automatically contains an ELB load\\n\\t\\t\\t\\t\\t\\tbalancer if it includes more than one Amazon EC2 instance.) If you set\\n\\t\\t\\t\\t\\t\\t\\t<code>EvaluateTargetHealth</code> to <code>true</code> and either no\\n\\t\\t\\t\\t\\t\\tAmazon EC2 instances are healthy or the load balancer itself is unhealthy,\\n\\t\\t\\t\\t\\t\\tRoute 53 routes queries to other available resources that are healthy, if\\n\\t\\t\\t\\t\\t\\tany. </p>\\n               <p>If the environment contains a single Amazon EC2 instance, there are no\\n\\t\\t\\t\\t\\t\\tspecial requirements.</p>\\n            </dd>\\n            <dt>ELB load balancers</dt>\\n            <dd>\\n               <p>Health checking behavior depends on the type of load balancer:</p>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <b>Classic Load Balancers</b>: If you\\n\\t\\t\\t\\t\\t\\t\\t\\tspecify an ELB Classic Load Balancer in <code>DNSName</code>,\\n\\t\\t\\t\\t\\t\\t\\t\\tElastic Load Balancing routes queries only to the healthy Amazon EC2\\n\\t\\t\\t\\t\\t\\t\\t\\tinstances that are registered with the load balancer. If you set\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t<code>EvaluateTargetHealth</code> to <code>true</code> and\\n\\t\\t\\t\\t\\t\\t\\t\\teither no EC2 instances are healthy or the load balancer itself is\\n\\t\\t\\t\\t\\t\\t\\t\\tunhealthy, Route 53 routes queries to other resources.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <b>Application and Network Load\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tBalancers</b>: If you specify an ELB Application or\\n\\t\\t\\t\\t\\t\\t\\t\\tNetwork Load Balancer and you set <code>EvaluateTargetHealth</code>\\n\\t\\t\\t\\t\\t\\t\\t\\tto <code>true</code>, Route 53 routes queries to the load balancer\\n\\t\\t\\t\\t\\t\\t\\t\\tbased on the health of the target groups that are associated with\\n\\t\\t\\t\\t\\t\\t\\t\\tthe load balancer:</p>\\n                     <ul>\\n                        <li>\\n                           <p>For an Application or Network Load Balancer to be\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\tconsidered healthy, every target group that contains targets\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\tmust contain at least one healthy target. If any target\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\tgroup contains only unhealthy targets, the load balancer is\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\tconsidered unhealthy, and Route 53 routes queries to other\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\tresources.</p>\\n                        </li>\\n                        <li>\\n                           <p>A target group that has no registered targets is\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\tconsidered unhealthy.</p>\\n                        </li>\\n                     </ul>\\n                  </li>\\n               </ul>\\n               <note>\\n                  <p>When you create a load balancer, you configure settings for Elastic\\n\\t\\t\\t\\t\\t\\t\\tLoad Balancing health checks; they're not Route 53 health checks, but\\n\\t\\t\\t\\t\\t\\t\\tthey perform a similar function. Do not create Route 53 health checks\\n\\t\\t\\t\\t\\t\\t\\tfor the EC2 instances that you register with an ELB load balancer.\\n\\t\\t\\t\\t\\t\\t</p>\\n               </note>\\n            </dd>\\n            <dt>S3 buckets</dt>\\n            <dd>\\n               <p>There are no special requirements for setting\\n\\t\\t\\t\\t\\t\\t\\t<code>EvaluateTargetHealth</code> to <code>true</code> when the alias\\n\\t\\t\\t\\t\\t\\ttarget is an S3 bucket.</p>\\n            </dd>\\n            <dt>Other records in the same hosted zone</dt>\\n            <dd>\\n               <p>If the Amazon Web Services resource that you specify in\\n\\t\\t\\t\\t\\t\\t\\t<code>DNSName</code> is a record or a group of records (for example, a\\n\\t\\t\\t\\t\\t\\tgroup of weighted records) but is not another alias record, we recommend\\n\\t\\t\\t\\t\\t\\tthat you associate a health check with all of the records in the alias\\n\\t\\t\\t\\t\\t\\ttarget. For more information, see <a href=\\\"https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/dns-failover-complex-configs.html#dns-failover-complex-configs-hc-omitting\\\">What Happens When You Omit Health Checks?</a> in the\\n\\t\\t\\t\\t\\t\\t\\t<i>Amazon Route 53 Developer Guide</i>.</p>\\n            </dd>\\n         </dl>\\n         <p>For more information and examples, see <a href=\\\"https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/dns-failover.html\\\">Amazon Route 53 Health Checks\\n\\t\\t\\t\\tand DNS Failover</a> in the <i>Amazon Route 53 Developer\\n\\t\\t\\tGuide</i>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>\\n            <i>Alias resource record sets only:</i> Information about the Amazon Web Services resource, such as a CloudFront distribution or an Amazon S3 bucket, that\\n\\t\\t\\tyou want to route traffic to.</p>\\n         <p>When creating resource record sets for a private hosted zone, note the\\n\\t\\t\\tfollowing:</p>\\n         <ul>\\n            <li>\\n               <p>For information about creating failover resource record sets in a private\\n\\t\\t\\t\\t\\thosted zone, see <a href=\\\"https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/dns-failover-private-hosted-zones.html\\\">Configuring Failover in a Private Hosted Zone</a>.</p>\\n            </li>\\n         </ul>\"\n            }\n        },\n        \"com.amazonaws.route53#AssociateVPCComment\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.route53#AssociateVPCWithHostedZone\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.route53#AssociateVPCWithHostedZoneRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.route53#AssociateVPCWithHostedZoneResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.route53#ConflictingDomainExists\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidInput\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidVPCId\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#LimitsExceeded\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#NoSuchHostedZone\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#NotAuthorizedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#PriorRequestNotComplete\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#PublicZoneVPCAssociation\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Associates an Amazon VPC with a private hosted zone. </p>\\n         <important>\\n            <p>To perform the association, the VPC and the private hosted zone must already\\n\\t\\t\\t\\texist. You can't convert a public hosted zone into a private hosted zone.</p>\\n         </important>\\n         <note>\\n            <p>If you want to associate a VPC that was created by using one Amazon Web Services account with a private hosted zone that was created by using a\\n\\t\\t\\t\\tdifferent account, the Amazon Web Services account that created the private hosted\\n\\t\\t\\t\\tzone must first submit a <code>CreateVPCAssociationAuthorization</code> request.\\n\\t\\t\\t\\tThen the account that created the VPC must submit an\\n\\t\\t\\t\\t\\t<code>AssociateVPCWithHostedZone</code> request.</p>\\n         </note>\\n         <note>\\n            <p>When granting access, the hosted zone and the Amazon VPC must belong to\\n\\t\\t\\t\\tthe same partition. A partition is a group of Amazon Web Services Regions. Each\\n\\t\\t\\t\\t\\tAmazon Web Services account is scoped to one partition.</p>\\n            <p>The following are the supported partitions:</p>\\n            <ul>\\n               <li>\\n                  <p>\\n                     <code>aws</code> - Amazon Web Services Regions</p>\\n               </li>\\n               <li>\\n                  <p>\\n                     <code>aws-cn</code> - China Regions</p>\\n               </li>\\n               <li>\\n                  <p>\\n                     <code>aws-us-gov</code> - Amazon Web Services GovCloud (US) Region</p>\\n               </li>\\n            </ul>\\n            <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html\\\">Access Management</a>\\n\\t\\t\\t\\tin the <i>Amazon Web Services General Reference</i>.</p>\\n         </note>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To associate a VPC with a hosted zone\",\n                        \"documentation\": \"The following example associates the VPC with ID vpc-1a2b3c4d with the hosted zone with ID Z3M3LMPEXAMPLE.\",\n                        \"input\": {\n                            \"HostedZoneId\": \"Z3M3LMPEXAMPLE\",\n                            \"VPC\": {\n                                \"VPCId\": \"vpc-1a2b3c4d\",\n                                \"VPCRegion\": \"us-east-2\"\n                            },\n                            \"Comment\": \"\"\n                        },\n                        \"output\": {\n                            \"ChangeInfo\": {\n                                \"Status\": \"INSYNC\",\n                                \"Comment\": \"\",\n                                \"SubmittedAt\": \"2017-01-31T01:36:41.958Z\",\n                                \"Id\": \"/change/C3HC6WDB2UANE2\"\n                            }\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"POST\",\n                    \"uri\": \"/2013-04-01/hostedzone/{HostedZoneId}/associatevpc\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.route53#AssociateVPCWithHostedZoneRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"HostedZoneId\": {\n                    \"target\": \"com.amazonaws.route53#ResourceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the private hosted zone that you want to associate an Amazon VPC\\n\\t\\t\\twith.</p>\\n         <p>Note that you can't associate a VPC with a hosted zone that doesn't have an existing\\n\\t\\t\\tVPC association.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"VPC\": {\n                    \"target\": \"com.amazonaws.route53#VPC\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A complex type that contains information about the VPC that you want to associate with\\n\\t\\t\\ta private hosted zone.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Comment\": {\n                    \"target\": \"com.amazonaws.route53#AssociateVPCComment\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>\\n            <i>Optional:</i> A comment about the association request.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that contains information about the request to associate a VPC with a\\n\\t\\t\\tprivate hosted zone.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.route53#AssociateVPCWithHostedZoneResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ChangeInfo\": {\n                    \"target\": \"com.amazonaws.route53#ChangeInfo\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A complex type that describes the changes made to your hosted zone.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that contains the response information for the\\n\\t\\t\\t\\t<code>AssociateVPCWithHostedZone</code> request.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.route53#Bias\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": -99,\n                    \"max\": 99\n                }\n            }\n        },\n        \"com.amazonaws.route53#Change\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Action\": {\n                    \"target\": \"com.amazonaws.route53#ChangeAction\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The action to perform:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>CREATE</code>: Creates a resource record set that has the specified\\n\\t\\t\\t\\t\\tvalues.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>DELETE</code>: Deletes a existing resource record set.</p>\\n               <important>\\n                  <p>To delete the resource record set that is associated with a traffic policy\\n\\t\\t\\t\\t\\t\\tinstance, use <a href=\\\"https://docs.aws.amazon.com/Route53/latest/APIReference/API_DeleteTrafficPolicyInstance.html\\\">DeleteTrafficPolicyInstance</a>. Amazon Route 53 will delete the\\n\\t\\t\\t\\t\\t\\tresource record set automatically. If you delete the resource record set by\\n\\t\\t\\t\\t\\t\\tusing <code>ChangeResourceRecordSets</code>, Route 53 doesn't automatically\\n\\t\\t\\t\\t\\t\\tdelete the traffic policy instance, and you'll continue to be charged for it\\n\\t\\t\\t\\t\\t\\teven though it's no longer in use. </p>\\n               </important>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>UPSERT</code>: If a resource record set doesn't already exist, Route 53\\n\\t\\t\\t\\t\\tcreates it. If a resource record set does exist, Route 53 updates it with the\\n\\t\\t\\t\\t\\tvalues in the request.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ResourceRecordSet\": {\n                    \"target\": \"com.amazonaws.route53#ResourceRecordSet\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Information about the resource record set to create, delete, or update.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The information for each resource record set that you want to change.</p>\"\n            }\n        },\n        \"com.amazonaws.route53#ChangeAction\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"CREATE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"CREATE\"\n                    }\n                },\n                \"DELETE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DELETE\"\n                    }\n                },\n                \"UPSERT\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"UPSERT\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.route53#ChangeBatch\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Comment\": {\n                    \"target\": \"com.amazonaws.route53#ResourceDescription\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>\\n            <i>Optional:</i> Any comments you want to include about a change batch\\n\\t\\t\\trequest.</p>\"\n                    }\n                },\n                \"Changes\": {\n                    \"target\": \"com.amazonaws.route53#Changes\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Information about the changes to make to the record sets.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The information for a change request.</p>\"\n            }\n        },\n        \"com.amazonaws.route53#ChangeCidrCollection\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.route53#ChangeCidrCollectionRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.route53#ChangeCidrCollectionResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.route53#CidrBlockInUseException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#CidrCollectionVersionMismatchException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#ConcurrentModification\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidInput\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#LimitsExceeded\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#NoSuchCidrCollectionException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates, changes, or deletes CIDR blocks within a collection. Contains authoritative\\n\\t\\t\\tIP information mapping blocks to one or multiple locations.</p>\\n         <p>A change request can update multiple locations in a collection at a time, which is\\n\\t\\t\\thelpful if you want to move one or more CIDR blocks from one location to another in one\\n\\t\\t\\ttransaction, without downtime. </p>\\n         <p>\\n            <b>Limits</b>\\n         </p>\\n         <p>The max number of CIDR blocks included in the request is 1000. As a result, big updates\\n\\t\\t\\trequire multiple API calls.</p>\\n         <p>\\n            <b> PUT and DELETE_IF_EXISTS</b>\\n         </p>\\n         <p>Use <code>ChangeCidrCollection</code> to perform the following actions:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>PUT</code>: Create a CIDR block within the specified collection.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code> DELETE_IF_EXISTS</code>: Delete an existing CIDR block from the\\n\\t\\t\\t\\t\\tcollection.</p>\\n            </li>\\n         </ul>\",\n                \"smithy.api#http\": {\n                    \"method\": \"POST\",\n                    \"uri\": \"/2013-04-01/cidrcollection/{Id}\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.route53#ChangeCidrCollectionRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Id\": {\n                    \"target\": \"com.amazonaws.route53#UUID\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The UUID of the CIDR collection to update.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"CollectionVersion\": {\n                    \"target\": \"com.amazonaws.route53#CollectionVersion\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A sequential counter that Amazon Route 53 sets to 1 when you create a\\n\\t\\t\\tcollection and increments it by 1 each time you update the collection.</p>\\n         <p>We recommend that you use <code>ListCidrCollection</code> to get the current value of\\n\\t\\t\\t\\t<code>CollectionVersion</code> for the collection that you want to update, and then\\n\\t\\t\\tinclude that value with the change request. This prevents Route 53 from\\n\\t\\t\\toverwriting an intervening update: </p>\\n         <ul>\\n            <li>\\n               <p>If the value in the request matches the value of\\n\\t\\t\\t\\t\\t\\t<code>CollectionVersion</code> in the collection, Route 53 updates\\n\\t\\t\\t\\t\\tthe collection.</p>\\n            </li>\\n            <li>\\n               <p>If the value of <code>CollectionVersion</code> in the collection is greater\\n\\t\\t\\t\\t\\tthan the value in the request, the collection was changed after you got the\\n\\t\\t\\t\\t\\tversion number. Route 53 does not update the collection, and it\\n\\t\\t\\t\\t\\treturns a <code>CidrCollectionVersionMismatch</code> error. </p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"Changes\": {\n                    \"target\": \"com.amazonaws.route53#CidrCollectionChanges\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> Information about changes to a CIDR collection.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.route53#ChangeCidrCollectionResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Id\": {\n                    \"target\": \"com.amazonaws.route53#ChangeId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID that is returned by <code>ChangeCidrCollection</code>. You can use it as input to\\n\\t\\t\\t\\t<code>GetChange</code> to see if a CIDR collection change has propagated or\\n\\t\\t\\tnot.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.route53#ChangeId\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 6500\n                }\n            }\n        },\n        \"com.amazonaws.route53#ChangeInfo\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Id\": {\n                    \"target\": \"com.amazonaws.route53#ResourceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>This element contains an ID that you use when performing a <a href=\\\"https://docs.aws.amazon.com/Route53/latest/APIReference/API_GetChange.html\\\">GetChange</a> action to get\\n\\t\\t\\tdetailed information about the change.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Status\": {\n                    \"target\": \"com.amazonaws.route53#ChangeStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The current state of the request. <code>PENDING</code> indicates that this request has\\n\\t\\t\\tnot yet been applied to all Amazon Route 53 DNS servers.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"SubmittedAt\": {\n                    \"target\": \"com.amazonaws.route53#TimeStamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time that the change request was submitted in <a href=\\\"https://en.wikipedia.org/wiki/ISO_8601\\\">ISO 8601 format</a> and Coordinated\\n\\t\\t\\tUniversal Time (UTC). For example, the value <code>2017-03-27T17:48:16.751Z</code>\\n\\t\\t\\trepresents March 27, 2017 at 17:48:16.751 UTC.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Comment\": {\n                    \"target\": \"com.amazonaws.route53#ResourceDescription\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A comment you can provide.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that describes change information about changes made to your hosted\\n\\t\\t\\tzone.</p>\"\n            }\n        },\n        \"com.amazonaws.route53#ChangeResourceRecordSets\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.route53#ChangeResourceRecordSetsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.route53#ChangeResourceRecordSetsResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidChangeBatch\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidInput\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#NoSuchHealthCheck\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#NoSuchHostedZone\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#PriorRequestNotComplete\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates, changes, or deletes a resource record set, which contains authoritative DNS\\n\\t\\t\\tinformation for a specified domain name or subdomain name. For example, you can use\\n\\t\\t\\t\\t<code>ChangeResourceRecordSets</code> to create a resource record set that routes\\n\\t\\t\\ttraffic for test.example.com to a web server that has an IP address of\\n\\t\\t\\t192.0.2.44.</p>\\n         <p>\\n            <b>Deleting Resource Record Sets</b>\\n         </p>\\n         <p>To delete a resource record set, you must specify all the same values that you\\n\\t\\t\\tspecified when you created it.</p>\\n         <p>\\n            <b>Change Batches and Transactional Changes</b>\\n         </p>\\n         <p>The request body must include a document with a\\n\\t\\t\\t\\t<code>ChangeResourceRecordSetsRequest</code> element. The request body contains a\\n\\t\\t\\tlist of change items, known as a change batch. Change batches are considered\\n\\t\\t\\ttransactional changes. Route 53 validates the changes in the request and then either\\n\\t\\t\\tmakes all or none of the changes in the change batch request. This ensures that DNS\\n\\t\\t\\trouting isn't adversely affected by partial changes to the resource record sets in a\\n\\t\\t\\thosted zone. </p>\\n         <p>For example, suppose a change batch request contains two changes: it deletes the\\n\\t\\t\\t\\t<code>CNAME</code> resource record set for www.example.com and creates an alias\\n\\t\\t\\tresource record set for www.example.com. If validation for both records succeeds, Route\\n\\t\\t\\t53 deletes the first resource record set and creates the second resource record set in a\\n\\t\\t\\tsingle operation. If validation for either the <code>DELETE</code> or the\\n\\t\\t\\t\\t<code>CREATE</code> action fails, then the request is canceled, and the original\\n\\t\\t\\t\\t<code>CNAME</code> record continues to exist.</p>\\n         <note>\\n            <p>If you try to delete the same resource record set more than once in a single\\n\\t\\t\\t\\tchange batch, Route 53 returns an <code>InvalidChangeBatch</code> error.</p>\\n         </note>\\n         <p>\\n            <b>Traffic Flow</b>\\n         </p>\\n         <p>To create resource record sets for complex routing configurations, use either the\\n\\t\\t\\ttraffic flow visual editor in the Route 53 console or the API actions for traffic\\n\\t\\t\\tpolicies and traffic policy instances. Save the configuration as a traffic policy, then\\n\\t\\t\\tassociate the traffic policy with one or more domain names (such as example.com) or\\n\\t\\t\\tsubdomain names (such as www.example.com), in the same hosted zone or in multiple hosted\\n\\t\\t\\tzones. You can roll back the updates if the new configuration isn't performing as\\n\\t\\t\\texpected. For more information, see <a href=\\\"https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/traffic-flow.html\\\">Using Traffic Flow to Route\\n\\t\\t\\t\\tDNS Traffic</a> in the <i>Amazon Route 53 Developer\\n\\t\\t\\tGuide</i>.</p>\\n         <p>\\n            <b>Create, Delete, and Upsert</b>\\n         </p>\\n         <p>Use <code>ChangeResourceRecordsSetsRequest</code> to perform the following\\n\\t\\t\\tactions:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>CREATE</code>: Creates a resource record set that has the specified\\n\\t\\t\\t\\t\\tvalues.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>DELETE</code>: Deletes an existing resource record set that has the\\n\\t\\t\\t\\t\\tspecified values.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>UPSERT</code>: If a resource set doesn't exist, Route 53 creates it. If a resource\\n\\t\\t\\t\\t\\tset exists Route 53 updates it with the values in the request. </p>\\n            </li>\\n         </ul>\\n         <p>\\n            <b>Syntaxes for Creating, Updating, and Deleting Resource Record\\n\\t\\t\\t\\tSets</b>\\n         </p>\\n         <p>The syntax for a request depends on the type of resource record set that you want to\\n\\t\\t\\tcreate, delete, or update, such as weighted, alias, or failover. The XML elements in\\n\\t\\t\\tyour request must appear in the order listed in the syntax. </p>\\n         <p>For an example for each type of resource record set, see \\\"Examples.\\\"</p>\\n         <p>Don't refer to the syntax in the \\\"Parameter Syntax\\\" section, which includes\\n\\t\\t\\tall of the elements for every kind of resource record set that you can create, delete,\\n\\t\\t\\tor update by using <code>ChangeResourceRecordSets</code>. </p>\\n         <p>\\n            <b>Change Propagation to Route 53 DNS Servers</b>\\n         </p>\\n         <p>When you submit a <code>ChangeResourceRecordSets</code> request, Route 53 propagates your\\n\\t\\t\\tchanges to all of the Route 53 authoritative DNS servers managing the hosted zone. While\\n\\t\\t\\tyour changes are propagating, <code>GetChange</code> returns a status of\\n\\t\\t\\t\\t<code>PENDING</code>. When propagation is complete, <code>GetChange</code> returns a\\n\\t\\t\\tstatus of <code>INSYNC</code>. Changes generally propagate to all Route 53 name servers\\n\\t\\t\\tmanaging the hosted zone within 60 seconds. For more information, see <a href=\\\"https://docs.aws.amazon.com/Route53/latest/APIReference/API_GetChange.html\\\">GetChange</a>.</p>\\n         <p>\\n            <b>Limits on ChangeResourceRecordSets Requests</b>\\n         </p>\\n         <p>For information about the limits on a <code>ChangeResourceRecordSets</code> request,\\n\\t\\t\\tsee <a href=\\\"https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/DNSLimitations.html\\\">Limits</a> in the <i>Amazon Route 53 Developer Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To create an alias resource record set\",\n                        \"documentation\": \"The following example creates an alias resource record set that routes traffic to a CloudFront distribution.\",\n                        \"input\": {\n                            \"HostedZoneId\": \"Z3M3LMPEXAMPLE\",\n                            \"ChangeBatch\": {\n                                \"Comment\": \"CloudFront distribution for example.com\",\n                                \"Changes\": [\n                                    {\n                                        \"Action\": \"CREATE\",\n                                        \"ResourceRecordSet\": {\n                                            \"Name\": \"example.com\",\n                                            \"Type\": \"A\",\n                                            \"AliasTarget\": {\n                                                \"HostedZoneId\": \"Z2FDTNDATAQYW2\",\n                                                \"DNSName\": \"d123rk29d0stfj.cloudfront.net\",\n                                                \"EvaluateTargetHealth\": false\n                                            }\n                                        }\n                                    }\n                                ]\n                            }\n                        },\n                        \"output\": {\n                            \"ChangeInfo\": {\n                                \"Comment\": \"CloudFront distribution for example.com\",\n                                \"Id\": \"/change/C2682N5HXP0BZ4\",\n                                \"Status\": \"PENDING\",\n                                \"SubmittedAt\": \"2017-02-10T01:36:41.958Z\"\n                            }\n                        }\n                    },\n                    {\n                        \"title\": \"To create failover alias resource record sets\",\n                        \"documentation\": \"The following example creates primary and secondary failover alias resource record sets that route traffic to ELB load balancers. Traffic is generally routed to the primary resource, in the Ohio region. If that resource is unavailable, traffic is routed to the secondary resource, in the Oregon region.\",\n                        \"input\": {\n                            \"HostedZoneId\": \"Z3M3LMPEXAMPLE\",\n                            \"ChangeBatch\": {\n                                \"Comment\": \"Failover alias configuration for example.com\",\n                                \"Changes\": [\n                                    {\n                                        \"Action\": \"CREATE\",\n                                        \"ResourceRecordSet\": {\n                                            \"Name\": \"example.com\",\n                                            \"Type\": \"A\",\n                                            \"SetIdentifier\": \"Ohio region\",\n                                            \"Failover\": \"PRIMARY\",\n                                            \"AliasTarget\": {\n                                                \"HostedZoneId\": \"Z3AADJGX6KTTL2\",\n                                                \"DNSName\": \"example-com-123456789.us-east-2.elb.amazonaws.com \",\n                                                \"EvaluateTargetHealth\": true\n                                            }\n                                        }\n                                    },\n                                    {\n                                        \"Action\": \"CREATE\",\n                                        \"ResourceRecordSet\": {\n                                            \"Name\": \"example.com\",\n                                            \"Type\": \"A\",\n                                            \"SetIdentifier\": \"Oregon region\",\n                                            \"Failover\": \"SECONDARY\",\n                                            \"AliasTarget\": {\n                                                \"HostedZoneId\": \"Z1H1FL5HABSF5\",\n                                                \"DNSName\": \"example-com-987654321.us-west-2.elb.amazonaws.com \",\n                                                \"EvaluateTargetHealth\": true\n                                            }\n                                        }\n                                    }\n                                ]\n                            }\n                        },\n                        \"output\": {\n                            \"ChangeInfo\": {\n                                \"Comment\": \"Failover alias configuration for example.com\",\n                                \"Id\": \"/change/C2682N5HXP0BZ4\",\n                                \"Status\": \"PENDING\",\n                                \"SubmittedAt\": \"2017-02-10T01:36:41.958Z\"\n                            }\n                        }\n                    },\n                    {\n                        \"title\": \"To create failover resource record sets\",\n                        \"documentation\": \"The following example creates primary and secondary failover resource record sets that route traffic to EC2 instances. Traffic is generally routed to the primary resource, in the Ohio region. If that resource is unavailable, traffic is routed to the secondary resource, in the Oregon region.\",\n                        \"input\": {\n                            \"HostedZoneId\": \"Z3M3LMPEXAMPLE\",\n                            \"ChangeBatch\": {\n                                \"Comment\": \"Failover configuration for example.com\",\n                                \"Changes\": [\n                                    {\n                                        \"Action\": \"CREATE\",\n                                        \"ResourceRecordSet\": {\n                                            \"Name\": \"example.com\",\n                                            \"Type\": \"A\",\n                                            \"SetIdentifier\": \"Ohio region\",\n                                            \"Failover\": \"PRIMARY\",\n                                            \"TTL\": 60,\n                                            \"ResourceRecords\": [\n                                                {\n                                                    \"Value\": \"192.0.2.44\"\n                                                }\n                                            ],\n                                            \"HealthCheckId\": \"abcdef11-2222-3333-4444-555555fedcba\"\n                                        }\n                                    },\n                                    {\n                                        \"Action\": \"CREATE\",\n                                        \"ResourceRecordSet\": {\n                                            \"Name\": \"example.com\",\n                                            \"Type\": \"A\",\n                                            \"SetIdentifier\": \"Oregon region\",\n                                            \"Failover\": \"SECONDARY\",\n                                            \"TTL\": 60,\n                                            \"ResourceRecords\": [\n                                                {\n                                                    \"Value\": \"192.0.2.45\"\n                                                }\n                                            ],\n                                            \"HealthCheckId\": \"abcdef66-7777-8888-9999-000000fedcba\"\n                                        }\n                                    }\n                                ]\n                            }\n                        },\n                        \"output\": {\n                            \"ChangeInfo\": {\n                                \"Comment\": \"Failover configuration for example.com\",\n                                \"Id\": \"/change/C2682N5HXP0BZ4\",\n                                \"Status\": \"PENDING\",\n                                \"SubmittedAt\": \"2017-02-10T01:36:41.958Z\"\n                            }\n                        }\n                    },\n                    {\n                        \"title\": \"To create geolocation alias resource record sets\",\n                        \"documentation\": \"The following example creates four geolocation alias resource record sets that route traffic to ELB load balancers. Traffic is routed to one of four IP addresses, for North America (NA), for South America (SA), for Europe (EU), and for all other locations (*).\",\n                        \"input\": {\n                            \"HostedZoneId\": \"Z3M3LMPEXAMPLE\",\n                            \"ChangeBatch\": {\n                                \"Comment\": \"Geolocation alias configuration for example.com\",\n                                \"Changes\": [\n                                    {\n                                        \"Action\": \"CREATE\",\n                                        \"ResourceRecordSet\": {\n                                            \"Name\": \"example.com\",\n                                            \"Type\": \"A\",\n                                            \"SetIdentifier\": \"North America\",\n                                            \"GeoLocation\": {\n                                                \"ContinentCode\": \"NA\"\n                                            },\n                                            \"AliasTarget\": {\n                                                \"HostedZoneId\": \"Z3AADJGX6KTTL2\",\n                                                \"DNSName\": \"example-com-123456789.us-east-2.elb.amazonaws.com \",\n                                                \"EvaluateTargetHealth\": true\n                                            }\n                                        }\n                                    },\n                                    {\n                                        \"Action\": \"CREATE\",\n                                        \"ResourceRecordSet\": {\n                                            \"Name\": \"example.com\",\n                                            \"Type\": \"A\",\n                                            \"SetIdentifier\": \"South America\",\n                                            \"GeoLocation\": {\n                                                \"ContinentCode\": \"SA\"\n                                            },\n                                            \"AliasTarget\": {\n                                                \"HostedZoneId\": \"Z2P70J7HTTTPLU\",\n                                                \"DNSName\": \"example-com-234567890.sa-east-1.elb.amazonaws.com \",\n                                                \"EvaluateTargetHealth\": true\n                                            }\n                                        }\n                                    },\n                                    {\n                                        \"Action\": \"CREATE\",\n                                        \"ResourceRecordSet\": {\n                                            \"Name\": \"example.com\",\n                                            \"Type\": \"A\",\n                                            \"SetIdentifier\": \"Europe\",\n                                            \"GeoLocation\": {\n                                                \"ContinentCode\": \"EU\"\n                                            },\n                                            \"AliasTarget\": {\n                                                \"HostedZoneId\": \"Z215JYRZR1TBD5\",\n                                                \"DNSName\": \"example-com-234567890.eu-central-1.elb.amazonaws.com \",\n                                                \"EvaluateTargetHealth\": true\n                                            }\n                                        }\n                                    },\n                                    {\n                                        \"Action\": \"CREATE\",\n                                        \"ResourceRecordSet\": {\n                                            \"Name\": \"example.com\",\n                                            \"Type\": \"A\",\n                                            \"SetIdentifier\": \"Other locations\",\n                                            \"GeoLocation\": {\n                                                \"CountryCode\": \"*\"\n                                            },\n                                            \"AliasTarget\": {\n                                                \"HostedZoneId\": \"Z1LMS91P8CMLE5\",\n                                                \"DNSName\": \"example-com-234567890.ap-southeast-1.elb.amazonaws.com \",\n                                                \"EvaluateTargetHealth\": true\n                                            }\n                                        }\n                                    }\n                                ]\n                            }\n                        },\n                        \"output\": {\n                            \"ChangeInfo\": {\n                                \"Comment\": \"Geolocation alias configuration for example.com\",\n                                \"Id\": \"/change/C2682N5HXP0BZ4\",\n                                \"Status\": \"PENDING\",\n                                \"SubmittedAt\": \"2017-02-10T01:36:41.958Z\"\n                            }\n                        }\n                    },\n                    {\n                        \"title\": \"To create geolocation resource record sets\",\n                        \"documentation\": \"The following example creates four geolocation resource record sets that use IPv4 addresses to route traffic to resources such as web servers running on EC2 instances. Traffic is routed to one of four IP addresses, for North America (NA), for South America (SA), for Europe (EU), and for all other locations (*).\",\n                        \"input\": {\n                            \"HostedZoneId\": \"Z3M3LMPEXAMPLE\",\n                            \"ChangeBatch\": {\n                                \"Comment\": \"Geolocation configuration for example.com\",\n                                \"Changes\": [\n                                    {\n                                        \"Action\": \"CREATE\",\n                                        \"ResourceRecordSet\": {\n                                            \"Name\": \"example.com\",\n                                            \"Type\": \"A\",\n                                            \"SetIdentifier\": \"North America\",\n                                            \"GeoLocation\": {\n                                                \"ContinentCode\": \"NA\"\n                                            },\n                                            \"TTL\": 60,\n                                            \"ResourceRecords\": [\n                                                {\n                                                    \"Value\": \"192.0.2.44\"\n                                                }\n                                            ]\n                                        }\n                                    },\n                                    {\n                                        \"Action\": \"CREATE\",\n                                        \"ResourceRecordSet\": {\n                                            \"Name\": \"example.com\",\n                                            \"Type\": \"A\",\n                                            \"SetIdentifier\": \"South America\",\n                                            \"GeoLocation\": {\n                                                \"ContinentCode\": \"SA\"\n                                            },\n                                            \"TTL\": 60,\n                                            \"ResourceRecords\": [\n                                                {\n                                                    \"Value\": \"192.0.2.45\"\n                                                }\n                                            ]\n                                        }\n                                    },\n                                    {\n                                        \"Action\": \"CREATE\",\n                                        \"ResourceRecordSet\": {\n                                            \"Name\": \"example.com\",\n                                            \"Type\": \"A\",\n                                            \"SetIdentifier\": \"Europe\",\n                                            \"GeoLocation\": {\n                                                \"ContinentCode\": \"EU\"\n                                            },\n                                            \"TTL\": 60,\n                                            \"ResourceRecords\": [\n                                                {\n                                                    \"Value\": \"192.0.2.46\"\n                                                }\n                                            ]\n                                        }\n                                    },\n                                    {\n                                        \"Action\": \"CREATE\",\n                                        \"ResourceRecordSet\": {\n                                            \"Name\": \"example.com\",\n                                            \"Type\": \"A\",\n                                            \"SetIdentifier\": \"Other locations\",\n                                            \"GeoLocation\": {\n                                                \"CountryCode\": \"*\"\n                                            },\n                                            \"TTL\": 60,\n                                            \"ResourceRecords\": [\n                                                {\n                                                    \"Value\": \"192.0.2.47\"\n                                                }\n                                            ]\n                                        }\n                                    }\n                                ]\n                            }\n                        },\n                        \"output\": {\n                            \"ChangeInfo\": {\n                                \"Comment\": \"Geolocation configuration for example.com\",\n                                \"Id\": \"/change/C2682N5HXP0BZ4\",\n                                \"Status\": \"PENDING\",\n                                \"SubmittedAt\": \"2017-02-10T01:36:41.958Z\"\n                            }\n                        }\n                    },\n                    {\n                        \"title\": \"To create latency alias resource record sets\",\n                        \"documentation\": \"The following example creates two latency alias resource record sets that route traffic for example.com to ELB load balancers. Requests are routed either to the Ohio region or the Oregon region, depending on the latency between the user and those regions.\",\n                        \"input\": {\n                            \"HostedZoneId\": \"Z3M3LMPEXAMPLE\",\n                            \"ChangeBatch\": {\n                                \"Comment\": \"ELB load balancers for example.com\",\n                                \"Changes\": [\n                                    {\n                                        \"Action\": \"CREATE\",\n                                        \"ResourceRecordSet\": {\n                                            \"Name\": \"example.com\",\n                                            \"Type\": \"A\",\n                                            \"SetIdentifier\": \"Ohio region\",\n                                            \"Region\": \"us-east-2\",\n                                            \"AliasTarget\": {\n                                                \"HostedZoneId\": \"Z3AADJGX6KTTL2\",\n                                                \"DNSName\": \"example-com-123456789.us-east-2.elb.amazonaws.com \",\n                                                \"EvaluateTargetHealth\": true\n                                            }\n                                        }\n                                    },\n                                    {\n                                        \"Action\": \"CREATE\",\n                                        \"ResourceRecordSet\": {\n                                            \"Name\": \"example.com\",\n                                            \"Type\": \"A\",\n                                            \"SetIdentifier\": \"Oregon region\",\n                                            \"Region\": \"us-west-2\",\n                                            \"AliasTarget\": {\n                                                \"HostedZoneId\": \"Z1H1FL5HABSF5\",\n                                                \"DNSName\": \"example-com-987654321.us-west-2.elb.amazonaws.com \",\n                                                \"EvaluateTargetHealth\": true\n                                            }\n                                        }\n                                    }\n                                ]\n                            }\n                        },\n                        \"output\": {\n                            \"ChangeInfo\": {\n                                \"Comment\": \"ELB load balancers for example.com\",\n                                \"Id\": \"/change/C2682N5HXP0BZ4\",\n                                \"Status\": \"PENDING\",\n                                \"SubmittedAt\": \"2017-02-10T01:36:41.958Z\"\n                            }\n                        }\n                    },\n                    {\n                        \"title\": \"To create latency resource record sets\",\n                        \"documentation\": \"The following example creates two latency resource record sets that route traffic to EC2 instances. Traffic for example.com is routed either to the Ohio region or the Oregon region, depending on the latency between the user and those regions.\",\n                        \"input\": {\n                            \"HostedZoneId\": \"Z3M3LMPEXAMPLE\",\n                            \"ChangeBatch\": {\n                                \"Comment\": \"EC2 instances for example.com\",\n                                \"Changes\": [\n                                    {\n                                        \"Action\": \"CREATE\",\n                                        \"ResourceRecordSet\": {\n                                            \"Name\": \"example.com\",\n                                            \"Type\": \"A\",\n                                            \"SetIdentifier\": \"Ohio region\",\n                                            \"Region\": \"us-east-2\",\n                                            \"TTL\": 60,\n                                            \"ResourceRecords\": [\n                                                {\n                                                    \"Value\": \"192.0.2.44\"\n                                                }\n                                            ],\n                                            \"HealthCheckId\": \"abcdef11-2222-3333-4444-555555fedcba\"\n                                        }\n                                    },\n                                    {\n                                        \"Action\": \"CREATE\",\n                                        \"ResourceRecordSet\": {\n                                            \"Name\": \"example.com\",\n                                            \"Type\": \"A\",\n                                            \"SetIdentifier\": \"Oregon region\",\n                                            \"Region\": \"us-west-2\",\n                                            \"TTL\": 60,\n                                            \"ResourceRecords\": [\n                                                {\n                                                    \"Value\": \"192.0.2.45\"\n                                                }\n                                            ],\n                                            \"HealthCheckId\": \"abcdef66-7777-8888-9999-000000fedcba\"\n                                        }\n                                    }\n                                ]\n                            }\n                        },\n                        \"output\": {\n                            \"ChangeInfo\": {\n                                \"Comment\": \"EC2 instances for example.com\",\n                                \"Id\": \"/change/C2682N5HXP0BZ4\",\n                                \"Status\": \"PENDING\",\n                                \"SubmittedAt\": \"2017-02-10T01:36:41.958Z\"\n                            }\n                        }\n                    },\n                    {\n                        \"title\": \"To create a basic resource record set\",\n                        \"documentation\": \"The following example creates a resource record set that routes Internet traffic to a resource with an IP address of 192.0.2.44.\",\n                        \"input\": {\n                            \"HostedZoneId\": \"Z3M3LMPEXAMPLE\",\n                            \"ChangeBatch\": {\n                                \"Comment\": \"Web server for example.com\",\n                                \"Changes\": [\n                                    {\n                                        \"Action\": \"CREATE\",\n                                        \"ResourceRecordSet\": {\n                                            \"Name\": \"example.com\",\n                                            \"Type\": \"A\",\n                                            \"TTL\": 60,\n                                            \"ResourceRecords\": [\n                                                {\n                                                    \"Value\": \"192.0.2.44\"\n                                                }\n                                            ]\n                                        }\n                                    }\n                                ]\n                            }\n                        },\n                        \"output\": {\n                            \"ChangeInfo\": {\n                                \"Comment\": \"Web server for example.com\",\n                                \"Id\": \"/change/C2682N5HXP0BZ4\",\n                                \"Status\": \"PENDING\",\n                                \"SubmittedAt\": \"2017-02-10T01:36:41.958Z\"\n                            }\n                        }\n                    },\n                    {\n                        \"title\": \"To create weighted alias resource record sets\",\n                        \"documentation\": \"The following example creates two weighted alias resource record sets that route traffic to ELB load balancers. The resource with a Weight of 100 will get 1/3rd of traffic (100/100+200), and the other resource will get the rest of the traffic for example.com.\",\n                        \"input\": {\n                            \"HostedZoneId\": \"Z3M3LMPEXAMPLE\",\n                            \"ChangeBatch\": {\n                                \"Comment\": \"ELB load balancers for example.com\",\n                                \"Changes\": [\n                                    {\n                                        \"Action\": \"CREATE\",\n                                        \"ResourceRecordSet\": {\n                                            \"Name\": \"example.com\",\n                                            \"Type\": \"A\",\n                                            \"SetIdentifier\": \"Ohio region\",\n                                            \"Weight\": 100,\n                                            \"AliasTarget\": {\n                                                \"HostedZoneId\": \"Z3AADJGX6KTTL2\",\n                                                \"DNSName\": \"example-com-123456789.us-east-2.elb.amazonaws.com \",\n                                                \"EvaluateTargetHealth\": true\n                                            }\n                                        }\n                                    },\n                                    {\n                                        \"Action\": \"CREATE\",\n                                        \"ResourceRecordSet\": {\n                                            \"Name\": \"example.com\",\n                                            \"Type\": \"A\",\n                                            \"SetIdentifier\": \"Oregon region\",\n                                            \"Weight\": 200,\n                                            \"AliasTarget\": {\n                                                \"HostedZoneId\": \"Z1H1FL5HABSF5\",\n                                                \"DNSName\": \"example-com-987654321.us-west-2.elb.amazonaws.com \",\n                                                \"EvaluateTargetHealth\": true\n                                            }\n                                        }\n                                    }\n                                ]\n                            }\n                        },\n                        \"output\": {\n                            \"ChangeInfo\": {\n                                \"Comment\": \"ELB load balancers for example.com\",\n                                \"Id\": \"/change/C2682N5HXP0BZ4\",\n                                \"Status\": \"PENDING\",\n                                \"SubmittedAt\": \"2017-02-10T01:36:41.958Z\"\n                            }\n                        }\n                    },\n                    {\n                        \"title\": \"To create weighted resource record sets\",\n                        \"documentation\": \"The following example creates two weighted resource record sets. The resource with a Weight of 100 will get 1/3rd of traffic (100/100+200), and the other resource will get the rest of the traffic for example.com.\",\n                        \"input\": {\n                            \"HostedZoneId\": \"Z3M3LMPEXAMPLE\",\n                            \"ChangeBatch\": {\n                                \"Comment\": \"Web servers for example.com\",\n                                \"Changes\": [\n                                    {\n                                        \"Action\": \"CREATE\",\n                                        \"ResourceRecordSet\": {\n                                            \"Name\": \"example.com\",\n                                            \"Type\": \"A\",\n                                            \"SetIdentifier\": \"Seattle data center\",\n                                            \"Weight\": 100,\n                                            \"TTL\": 60,\n                                            \"ResourceRecords\": [\n                                                {\n                                                    \"Value\": \"192.0.2.44\"\n                                                }\n                                            ],\n                                            \"HealthCheckId\": \"abcdef11-2222-3333-4444-555555fedcba\"\n                                        }\n                                    },\n                                    {\n                                        \"Action\": \"CREATE\",\n                                        \"ResourceRecordSet\": {\n                                            \"Name\": \"example.com\",\n                                            \"Type\": \"A\",\n                                            \"SetIdentifier\": \"Portland data center\",\n                                            \"Weight\": 200,\n                                            \"TTL\": 60,\n                                            \"ResourceRecords\": [\n                                                {\n                                                    \"Value\": \"192.0.2.45\"\n                                                }\n                                            ],\n                                            \"HealthCheckId\": \"abcdef66-7777-8888-9999-000000fedcba\"\n                                        }\n                                    }\n                                ]\n                            }\n                        },\n                        \"output\": {\n                            \"ChangeInfo\": {\n                                \"Comment\": \"Web servers for example.com\",\n                                \"Id\": \"/change/C2682N5HXP0BZ4\",\n                                \"Status\": \"PENDING\",\n                                \"SubmittedAt\": \"2017-02-10T01:36:41.958Z\"\n                            }\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"POST\",\n                    \"uri\": \"/2013-04-01/hostedzone/{HostedZoneId}/rrset\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.route53#ChangeResourceRecordSetsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"HostedZoneId\": {\n                    \"target\": \"com.amazonaws.route53#ResourceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the hosted zone that contains the resource record sets that you want to\\n\\t\\t\\tchange.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ChangeBatch\": {\n                    \"target\": \"com.amazonaws.route53#ChangeBatch\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A complex type that contains an optional comment and the <code>Changes</code>\\n\\t\\t\\telement.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that contains change information for the resource record set.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.route53#ChangeResourceRecordSetsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ChangeInfo\": {\n                    \"target\": \"com.amazonaws.route53#ChangeInfo\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A complex type that contains information about changes made to your hosted\\n\\t\\t\\tzone.</p>\\n         <p>This element contains an ID that you use when performing a <a href=\\\"https://docs.aws.amazon.com/Route53/latest/APIReference/API_GetChange.html\\\">GetChange</a> action to get\\n\\t\\t\\tdetailed information about the change.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type containing the response for the request.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.route53#ChangeStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"PENDING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"PENDING\"\n                    }\n                },\n                \"INSYNC\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"INSYNC\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.route53#ChangeTagsForResource\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.route53#ChangeTagsForResourceRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.route53#ChangeTagsForResourceResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidInput\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#NoSuchHealthCheck\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#NoSuchHostedZone\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#PriorRequestNotComplete\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#ThrottlingException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Adds, edits, or deletes tags for a health check or a hosted zone.</p>\\n         <p>For information about using tags for cost allocation, see <a href=\\\"https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/cost-alloc-tags.html\\\">Using Cost Allocation\\n\\t\\t\\t\\tTags</a> in the <i>Billing and Cost Management User Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To add or remove tags from a hosted zone or health check\",\n                        \"documentation\": \"The following example adds two tags and removes one tag from the hosted zone with ID Z3M3LMPEXAMPLE.\",\n                        \"input\": {\n                            \"ResourceType\": \"hostedzone\",\n                            \"ResourceId\": \"Z3M3LMPEXAMPLE\",\n                            \"AddTags\": [\n                                {\n                                    \"Key\": \"apex\",\n                                    \"Value\": \"3874\"\n                                },\n                                {\n                                    \"Key\": \"acme\",\n                                    \"Value\": \"4938\"\n                                }\n                            ],\n                            \"RemoveTagKeys\": [\n                                \"Nadir\"\n                            ]\n                        },\n                        \"output\": {}\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"POST\",\n                    \"uri\": \"/2013-04-01/tags/{ResourceType}/{ResourceId}\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.route53#ChangeTagsForResourceRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ResourceType\": {\n                    \"target\": \"com.amazonaws.route53#TagResourceType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of the resource.</p>\\n         <ul>\\n            <li>\\n               <p>The resource type for health checks is <code>healthcheck</code>.</p>\\n            </li>\\n            <li>\\n               <p>The resource type for hosted zones is <code>hostedzone</code>.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ResourceId\": {\n                    \"target\": \"com.amazonaws.route53#TagResourceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the resource for which you want to add, change, or delete tags.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"AddTags\": {\n                    \"target\": \"com.amazonaws.route53#TagList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A complex type that contains a list of the tags that you want to add to the specified\\n\\t\\t\\thealth check or hosted zone and/or the tags that you want to edit <code>Value</code>\\n\\t\\t\\tfor.</p>\\n         <p>You can add a maximum of 10 tags to a health check or a hosted zone.</p>\"\n                    }\n                },\n                \"RemoveTagKeys\": {\n                    \"target\": \"com.amazonaws.route53#TagKeyList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A complex type that contains a list of the tags that you want to delete from the\\n\\t\\t\\tspecified health check or hosted zone. You can specify up to 10 keys.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that contains information about the tags that you want to add, edit, or\\n\\t\\t\\tdelete.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.route53#ChangeTagsForResourceResponse\": {\n            \"type\": \"structure\",\n            \"members\": {},\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Empty response for the request.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.route53#Changes\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.route53#Change\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"Change\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1\n                }\n            }\n        },\n        \"com.amazonaws.route53#CheckerIpRanges\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.route53#IPAddressCidr\"\n            }\n        },\n        \"com.amazonaws.route53#ChildHealthCheckList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.route53#HealthCheckId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"ChildHealthCheck\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 256\n                }\n            }\n        },\n        \"com.amazonaws.route53#Cidr\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 50\n                },\n                \"smithy.api#pattern\": \"\\\\S\"\n            }\n        },\n        \"com.amazonaws.route53#CidrBlockInUseException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Message\": {\n                    \"target\": \"com.amazonaws.route53#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This CIDR block is already in use.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.route53#CidrBlockSummaries\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.route53#CidrBlockSummary\"\n            }\n        },\n        \"com.amazonaws.route53#CidrBlockSummary\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CidrBlock\": {\n                    \"target\": \"com.amazonaws.route53#Cidr\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Value for the CIDR block.</p>\"\n                    }\n                },\n                \"LocationName\": {\n                    \"target\": \"com.amazonaws.route53#CidrLocationNameDefaultNotAllowed\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The location name of the CIDR block.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that lists the CIDR blocks.</p>\"\n            }\n        },\n        \"com.amazonaws.route53#CidrCollection\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Arn\": {\n                    \"target\": \"com.amazonaws.route53#ARN\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the collection. Can be used to reference the collection in IAM policy or in\\n\\t\\t\\tanother Amazon Web Services account.</p>\"\n                    }\n                },\n                \"Id\": {\n                    \"target\": \"com.amazonaws.route53#UUID\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The unique ID of the CIDR collection.</p>\"\n                    }\n                },\n                \"Name\": {\n                    \"target\": \"com.amazonaws.route53#CollectionName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of a CIDR collection.</p>\"\n                    }\n                },\n                \"Version\": {\n                    \"target\": \"com.amazonaws.route53#CollectionVersion\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A sequential counter that Route 53 sets to 1 when you create a CIDR\\n\\t\\t\\tcollection and increments by 1 each time you update settings for the CIDR\\n\\t\\t\\tcollection.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex\\n\\t\\t\\ttype that\\n\\t\\t\\tidentifies a CIDR collection.</p>\"\n            }\n        },\n        \"com.amazonaws.route53#CidrCollectionAlreadyExistsException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Message\": {\n                    \"target\": \"com.amazonaws.route53#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A CIDR collection with this name and a different caller reference already exists in this account.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.route53#CidrCollectionChange\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LocationName\": {\n                    \"target\": \"com.amazonaws.route53#CidrLocationNameDefaultNotAllowed\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Name of the location that is associated with the CIDR collection.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Action\": {\n                    \"target\": \"com.amazonaws.route53#CidrCollectionChangeAction\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>CIDR collection change action. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"CidrList\": {\n                    \"target\": \"com.amazonaws.route53#CidrList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>List of CIDR blocks.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that contains information about the CIDR collection change.</p>\"\n            }\n        },\n        \"com.amazonaws.route53#CidrCollectionChangeAction\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"PUT\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"PUT\"\n                    }\n                },\n                \"DELETE_IF_EXISTS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DELETE_IF_EXISTS\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.route53#CidrCollectionChanges\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.route53#CidrCollectionChange\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.route53#CidrCollectionInUseException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Message\": {\n                    \"target\": \"com.amazonaws.route53#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This CIDR collection is in use, and isn't empty.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.route53#CidrCollectionVersionMismatchException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Message\": {\n                    \"target\": \"com.amazonaws.route53#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The CIDR collection version you provided, doesn't match the one in the\\n\\t\\t\\t\\t<code>ListCidrCollections</code> operation.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 409\n            }\n        },\n        \"com.amazonaws.route53#CidrList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.route53#Cidr\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"Cidr\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.route53#CidrLocationNameDefaultAllowed\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 16\n                },\n                \"smithy.api#pattern\": \"^[0-9A-Za-z_\\\\-\\\\*]+$\"\n            }\n        },\n        \"com.amazonaws.route53#CidrLocationNameDefaultNotAllowed\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 16\n                },\n                \"smithy.api#pattern\": \"^[0-9A-Za-z_\\\\-]+$\"\n            }\n        },\n        \"com.amazonaws.route53#CidrNonce\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 64\n                },\n                \"smithy.api#pattern\": \"^\\\\p{ASCII}+$\"\n            }\n        },\n        \"com.amazonaws.route53#CidrRoutingConfig\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CollectionId\": {\n                    \"target\": \"com.amazonaws.route53#UUID\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The CIDR collection ID.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"LocationName\": {\n                    \"target\": \"com.amazonaws.route53#CidrLocationNameDefaultAllowed\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The CIDR collection location name.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The object that is specified in resource record set object when you are linking a\\n\\t\\t\\tresource record set to a CIDR location.</p>\\n         <p>A <code>LocationName</code> with an asterisk “*” can be used to create a default CIDR\\n\\t\\t\\trecord. <code>CollectionId</code> is still required for default record.</p>\"\n            }\n        },\n        \"com.amazonaws.route53#CloudWatchAlarmConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"EvaluationPeriods\": {\n                    \"target\": \"com.amazonaws.route53#EvaluationPeriods\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>For the metric that the CloudWatch alarm is associated with, the number of periods\\n\\t\\t\\tthat the metric is compared to the threshold.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Threshold\": {\n                    \"target\": \"com.amazonaws.route53#Threshold\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>For the metric that the CloudWatch alarm is associated with, the value the metric is\\n\\t\\t\\tcompared with.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ComparisonOperator\": {\n                    \"target\": \"com.amazonaws.route53#ComparisonOperator\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>For the metric that the CloudWatch alarm is associated with, the arithmetic operation\\n\\t\\t\\tthat is used for the comparison.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Period\": {\n                    \"target\": \"com.amazonaws.route53#Period\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>For the metric that the CloudWatch alarm is associated with, the duration of one\\n\\t\\t\\tevaluation period in seconds.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"MetricName\": {\n                    \"target\": \"com.amazonaws.route53#MetricName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the CloudWatch metric that the alarm is associated with.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Namespace\": {\n                    \"target\": \"com.amazonaws.route53#Namespace\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The namespace of the metric that the alarm is associated with. For more information,\\n\\t\\t\\tsee <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/CW_Support_For_AWS.html\\\">Amazon\\n\\t\\t\\t\\tCloudWatch Namespaces, Dimensions, and Metrics Reference</a> in the\\n\\t\\t\\t\\t<i>Amazon CloudWatch User Guide</i>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Statistic\": {\n                    \"target\": \"com.amazonaws.route53#Statistic\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>For the metric that the CloudWatch alarm is associated with, the statistic that is\\n\\t\\t\\tapplied to the metric.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Dimensions\": {\n                    \"target\": \"com.amazonaws.route53#DimensionList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>For the metric that the CloudWatch alarm is associated with, a complex type that\\n\\t\\t\\tcontains information about the dimensions for the metric. For information, see <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/CW_Support_For_AWS.html\\\">Amazon\\n\\t\\t\\t\\tCloudWatch Namespaces, Dimensions, and Metrics Reference</a> in the\\n\\t\\t\\t\\t<i>Amazon CloudWatch User Guide</i>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that contains information about the CloudWatch alarm that Amazon Route\\n\\t\\t\\t53 is monitoring for this health check.</p>\"\n            }\n        },\n        \"com.amazonaws.route53#CloudWatchLogsLogGroupArn\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.route53#CloudWatchRegion\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"us_east_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"us-east-1\"\n                    }\n                },\n                \"us_east_2\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"us-east-2\"\n                    }\n                },\n                \"us_west_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"us-west-1\"\n                    }\n                },\n                \"us_west_2\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"us-west-2\"\n                    }\n                },\n                \"ca_central_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ca-central-1\"\n                    }\n                },\n                \"eu_central_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"eu-central-1\"\n                    }\n                },\n                \"eu_central_2\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"eu-central-2\"\n                    }\n                },\n                \"eu_west_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"eu-west-1\"\n                    }\n                },\n                \"eu_west_2\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"eu-west-2\"\n                    }\n                },\n                \"eu_west_3\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"eu-west-3\"\n                    }\n                },\n                \"ap_east_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ap-east-1\"\n                    }\n                },\n                \"me_south_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"me-south-1\"\n                    }\n                },\n                \"me_central_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"me-central-1\"\n                    }\n                },\n                \"ap_south_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ap-south-1\"\n                    }\n                },\n                \"ap_south_2\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ap-south-2\"\n                    }\n                },\n                \"ap_southeast_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ap-southeast-1\"\n                    }\n                },\n                \"ap_southeast_2\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ap-southeast-2\"\n                    }\n                },\n                \"ap_southeast_3\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ap-southeast-3\"\n                    }\n                },\n                \"ap_northeast_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ap-northeast-1\"\n                    }\n                },\n                \"ap_northeast_2\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ap-northeast-2\"\n                    }\n                },\n                \"ap_northeast_3\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ap-northeast-3\"\n                    }\n                },\n                \"eu_north_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"eu-north-1\"\n                    }\n                },\n                \"sa_east_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"sa-east-1\"\n                    }\n                },\n                \"cn_northwest_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"cn-northwest-1\"\n                    }\n                },\n                \"cn_north_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"cn-north-1\"\n                    }\n                },\n                \"af_south_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"af-south-1\"\n                    }\n                },\n                \"eu_south_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"eu-south-1\"\n                    }\n                },\n                \"eu_south_2\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"eu-south-2\"\n                    }\n                },\n                \"us_gov_west_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"us-gov-west-1\"\n                    }\n                },\n                \"us_gov_east_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"us-gov-east-1\"\n                    }\n                },\n                \"us_iso_east_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"us-iso-east-1\"\n                    }\n                },\n                \"us_iso_west_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"us-iso-west-1\"\n                    }\n                },\n                \"us_isob_east_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"us-isob-east-1\"\n                    }\n                },\n                \"ap_southeast_4\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ap-southeast-4\"\n                    }\n                },\n                \"il_central_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"il-central-1\"\n                    }\n                },\n                \"ca_west_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ca-west-1\"\n                    }\n                },\n                \"ap_southeast_5\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ap-southeast-5\"\n                    }\n                },\n                \"mx_central_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"mx-central-1\"\n                    }\n                },\n                \"us_isof_south_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"us-isof-south-1\"\n                    }\n                },\n                \"us_isof_east_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"us-isof-east-1\"\n                    }\n                },\n                \"ap_southeast_7\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ap-southeast-7\"\n                    }\n                },\n                \"ap_east_2\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ap-east-2\"\n                    }\n                },\n                \"eu_isoe_west_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"eu-isoe-west-1\"\n                    }\n                },\n                \"ap_southeast_6\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ap-southeast-6\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 64\n                }\n            }\n        },\n        \"com.amazonaws.route53#CollectionName\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 64\n                },\n                \"smithy.api#pattern\": \"^[0-9A-Za-z_\\\\-]+$\"\n            }\n        },\n        \"com.amazonaws.route53#CollectionSummaries\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.route53#CollectionSummary\"\n            }\n        },\n        \"com.amazonaws.route53#CollectionSummary\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Arn\": {\n                    \"target\": \"com.amazonaws.route53#ARN\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the collection summary. Can be used to reference the collection in IAM\\n\\t\\t\\tpolicy or cross-account.</p>\"\n                    }\n                },\n                \"Id\": {\n                    \"target\": \"com.amazonaws.route53#UUID\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Unique ID for the CIDR collection.</p>\"\n                    }\n                },\n                \"Name\": {\n                    \"target\": \"com.amazonaws.route53#CollectionName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of a CIDR collection.</p>\"\n                    }\n                },\n                \"Version\": {\n                    \"target\": \"com.amazonaws.route53#CollectionVersion\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A sequential counter that Route 53 sets to 1 when you create a CIDR\\n\\t\\t\\tcollection and increments by 1 each time you update settings for the CIDR\\n\\t\\t\\tcollection.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that is an entry in an <a href=\\\"https://docs.aws.amazon.com/Route53/latest/APIReference/API_CidrCollection.html\\\">CidrCollection</a>\\n\\t\\t\\tarray.</p>\"\n            }\n        },\n        \"com.amazonaws.route53#CollectionVersion\": {\n            \"type\": \"long\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1\n                }\n            }\n        },\n        \"com.amazonaws.route53#ComparisonOperator\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"GreaterThanOrEqualToThreshold\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"GreaterThanOrEqualToThreshold\"\n                    }\n                },\n                \"GreaterThanThreshold\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"GreaterThanThreshold\"\n                    }\n                },\n                \"LessThanThreshold\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"LessThanThreshold\"\n                    }\n                },\n                \"LessThanOrEqualToThreshold\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"LessThanOrEqualToThreshold\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.route53#ConcurrentModification\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.route53#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Another user submitted a request to create, update, or delete the object at the same\\n\\t\\t\\ttime that you did. Retry the request. </p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.route53#ConflictingDomainExists\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.route53#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The cause of this error depends on the operation that you're performing:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <b>Create a public hosted zone:</b> Two hosted zones\\n\\t\\t\\t\\t\\tthat have the same name or that have a parent/child relationship (example.com\\n\\t\\t\\t\\t\\tand test.example.com) can't have any common name servers. You tried to create a\\n\\t\\t\\t\\t\\thosted zone that has the same name as an existing hosted zone or that's the\\n\\t\\t\\t\\t\\tparent or child of an existing hosted zone, and you specified a delegation set\\n\\t\\t\\t\\t\\tthat shares one or more name servers with the existing hosted zone. For more\\n\\t\\t\\t\\t\\tinformation, see <a href=\\\"https://docs.aws.amazon.com/Route53/latest/APIReference/API_CreateReusableDelegationSet.html\\\">CreateReusableDelegationSet</a>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>Create a private hosted zone:</b> A hosted zone\\n\\t\\t\\t\\t\\twith the specified name already exists and is already associated with the Amazon\\n\\t\\t\\t\\t\\tVPC that you specified.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>Associate VPCs with a private hosted zone:</b>\\n\\t\\t\\t\\t\\tThe VPC that you specified is already associated with another hosted zone that\\n\\t\\t\\t\\t\\thas the same name.</p>\\n            </li>\\n         </ul>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.route53#ConflictingTypes\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.route53#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>You tried to update a traffic policy instance by using a traffic policy version that\\n\\t\\t\\thas a different DNS type than the current type for the instance. You specified the type\\n\\t\\t\\tin the JSON document in the <code>CreateTrafficPolicy</code> or\\n\\t\\t\\t\\t<code>CreateTrafficPolicyVersion</code>request. </p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.route53#Coordinates\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Latitude\": {\n                    \"target\": \"com.amazonaws.route53#Latitude\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> Specifies a coordinate of the north–south position of a geographic point on the surface of\\n\\t\\t\\tthe Earth (-90 - 90). </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Longitude\": {\n                    \"target\": \"com.amazonaws.route53#Longitude\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> Specifies a coordinate of the east–west position of a geographic point on the surface of\\n\\t\\t\\tthe Earth (-180 - 180). </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>\\n\\t\\t\\tA complex type that lists the coordinates for a geoproximity resource record.\\n\\t\\t</p>\"\n            }\n        },\n        \"com.amazonaws.route53#CreateCidrCollection\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.route53#CreateCidrCollectionRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.route53#CreateCidrCollectionResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.route53#CidrCollectionAlreadyExistsException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#ConcurrentModification\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidInput\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#LimitsExceeded\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates a CIDR collection in the current Amazon Web Services account.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"POST\",\n                    \"uri\": \"/2013-04-01/cidrcollection\",\n                    \"code\": 201\n                }\n            }\n        },\n        \"com.amazonaws.route53#CreateCidrCollectionRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Name\": {\n                    \"target\": \"com.amazonaws.route53#CollectionName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A unique identifier for the account that can be used to reference the collection from\\n\\t\\t\\tother API calls.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"CallerReference\": {\n                    \"target\": \"com.amazonaws.route53#CidrNonce\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A client-specific token that allows requests to be securely retried so that the\\n\\t\\t\\tintended outcome will only occur once, retries receive a similar response, and there are\\n\\t\\t\\tno additional edge cases to handle.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.route53#CreateCidrCollectionResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Collection\": {\n                    \"target\": \"com.amazonaws.route53#CidrCollection\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A complex type that contains information about the CIDR collection.</p>\"\n                    }\n                },\n                \"Location\": {\n                    \"target\": \"com.amazonaws.route53#ResourceURI\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A unique URL that represents the location for the CIDR collection.</p>\",\n                        \"smithy.api#httpHeader\": \"Location\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.route53#CreateHealthCheck\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.route53#CreateHealthCheckRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.route53#CreateHealthCheckResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.route53#HealthCheckAlreadyExists\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidInput\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#TooManyHealthChecks\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates a new health check.</p>\\n         <p>For information about adding health checks to resource record sets, see <a href=\\\"https://docs.aws.amazon.com/Route53/latest/APIReference/API_ResourceRecordSet.html#Route53-Type-ResourceRecordSet-HealthCheckId\\\">HealthCheckId</a> in <a href=\\\"https://docs.aws.amazon.com/Route53/latest/APIReference/API_ChangeResourceRecordSets.html\\\">ChangeResourceRecordSets</a>. </p>\\n         <p>\\n            <b>ELB Load Balancers</b>\\n         </p>\\n         <p>If you're registering EC2 instances with an Elastic Load Balancing (ELB) load\\n\\t\\t\\tbalancer, do not create Amazon Route 53 health checks for the EC2 instances. When you\\n\\t\\t\\tregister an EC2 instance with a load balancer, you configure settings for an ELB health\\n\\t\\t\\tcheck, which performs a similar function to a Route 53 health check.</p>\\n         <p>\\n            <b>Private Hosted Zones</b>\\n         </p>\\n         <p>You can associate health checks with failover resource record sets in a private hosted\\n\\t\\t\\tzone. Note the following:</p>\\n         <ul>\\n            <li>\\n               <p>Route 53 health checkers are outside the VPC. To check the health of an\\n\\t\\t\\t\\t\\tendpoint within a VPC by IP address, you must assign a public IP address to the\\n\\t\\t\\t\\t\\tinstance in the VPC.</p>\\n            </li>\\n            <li>\\n               <p>You can configure a health checker to check the health of an external resource\\n\\t\\t\\t\\t\\tthat the instance relies on, such as a database server.</p>\\n            </li>\\n            <li>\\n               <p>You can create a CloudWatch metric, associate an alarm with the metric, and\\n\\t\\t\\t\\t\\tthen create a health check that is based on the state of the alarm. For example,\\n\\t\\t\\t\\t\\tyou might create a CloudWatch metric that checks the status of the Amazon EC2\\n\\t\\t\\t\\t\\t\\t<code>StatusCheckFailed</code> metric, add an alarm to the metric, and then\\n\\t\\t\\t\\t\\tcreate a health check that is based on the state of the alarm. For information\\n\\t\\t\\t\\t\\tabout creating CloudWatch metrics and alarms by using the CloudWatch console,\\n\\t\\t\\t\\t\\tsee the <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/WhatIsCloudWatch.html\\\">Amazon\\n\\t\\t\\t\\t\\t\\tCloudWatch User Guide</a>.</p>\\n            </li>\\n         </ul>\",\n                \"smithy.api#http\": {\n                    \"method\": \"POST\",\n                    \"uri\": \"/2013-04-01/healthcheck\",\n                    \"code\": 201\n                }\n            }\n        },\n        \"com.amazonaws.route53#CreateHealthCheckRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CallerReference\": {\n                    \"target\": \"com.amazonaws.route53#HealthCheckNonce\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A unique string that identifies the request and that allows you to retry a failed\\n\\t\\t\\t\\t<code>CreateHealthCheck</code> request without the risk of creating two identical\\n\\t\\t\\thealth checks:</p>\\n         <ul>\\n            <li>\\n               <p>If you send a <code>CreateHealthCheck</code> request with the same\\n\\t\\t\\t\\t\\t\\t<code>CallerReference</code> and settings as a previous request, and if the\\n\\t\\t\\t\\t\\thealth check doesn't exist, Amazon Route 53 creates the health check. If the\\n\\t\\t\\t\\t\\thealth check does exist, Route 53 returns the settings for the existing health\\n\\t\\t\\t\\t\\tcheck.</p>\\n            </li>\\n            <li>\\n               <p>If you send a <code>CreateHealthCheck</code> request with the same\\n\\t\\t\\t\\t\\t\\t<code>CallerReference</code> as a deleted health check, regardless of the\\n\\t\\t\\t\\t\\tsettings, Route 53 returns a <code>HealthCheckAlreadyExists</code> error.</p>\\n            </li>\\n            <li>\\n               <p>If you send a <code>CreateHealthCheck</code> request with the same\\n\\t\\t\\t\\t\\t\\t<code>CallerReference</code> as an existing health check but with different\\n\\t\\t\\t\\t\\tsettings, Route 53 returns a <code>HealthCheckAlreadyExists</code> error.</p>\\n            </li>\\n            <li>\\n               <p>If you send a <code>CreateHealthCheck</code> request with a unique\\n\\t\\t\\t\\t\\t\\t<code>CallerReference</code> but settings identical to an existing health\\n\\t\\t\\t\\t\\tcheck, Route 53 creates the health check.</p>\\n            </li>\\n         </ul>\\n         <p> Route 53 does not store the <code>CallerReference</code> for a deleted health check indefinitely. \\n\\t\\t\\tThe <code>CallerReference</code> for a deleted health check will be deleted after a number of days.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"HealthCheckConfig\": {\n                    \"target\": \"com.amazonaws.route53#HealthCheckConfig\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A complex type that contains settings for a new health check.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that contains the health check request information.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.route53#CreateHealthCheckResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"HealthCheck\": {\n                    \"target\": \"com.amazonaws.route53#HealthCheck\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A complex type that contains identifying information about the health check.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Location\": {\n                    \"target\": \"com.amazonaws.route53#ResourceURI\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The unique URL representing the new health check.</p>\",\n                        \"smithy.api#httpHeader\": \"Location\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type containing the response information for the new health check.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.route53#CreateHostedZone\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.route53#CreateHostedZoneRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.route53#CreateHostedZoneResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.route53#ConflictingDomainExists\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#DelegationSetNotAvailable\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#DelegationSetNotReusable\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#HostedZoneAlreadyExists\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidDomainName\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidInput\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidVPCId\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#NoSuchDelegationSet\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#TooManyHostedZones\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates a new public or private hosted zone. You create records in a public hosted\\n\\t\\t\\tzone to define how you want to route traffic on the internet for a domain, such as\\n\\t\\t\\texample.com, and its subdomains (apex.example.com, acme.example.com). You create records\\n\\t\\t\\tin a private hosted zone to define how you want to route traffic for a domain and its\\n\\t\\t\\tsubdomains within one or more Amazon Virtual Private Clouds (Amazon VPCs). </p>\\n         <important>\\n            <p>You can't convert a public hosted zone to a private hosted zone or vice versa.\\n\\t\\t\\t\\tInstead, you must create a new hosted zone with the same name and create new\\n\\t\\t\\t\\tresource record sets.</p>\\n         </important>\\n         <p>For more information about charges for hosted zones, see <a href=\\\"http://aws.amazon.com/route53/pricing/\\\">Amazon Route 53 Pricing</a>.</p>\\n         <p>Note the following:</p>\\n         <ul>\\n            <li>\\n               <p>You can't create a hosted zone for a top-level domain (TLD) such as\\n\\t\\t\\t\\t\\t.com.</p>\\n            </li>\\n            <li>\\n               <p>For public hosted zones, Route 53 automatically creates a default SOA record\\n\\t\\t\\t\\t\\tand four NS records for the zone. For more information about SOA and NS records,\\n\\t\\t\\t\\t\\tsee <a href=\\\"https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/SOA-NSrecords.html\\\">NS and SOA Records\\n\\t\\t\\t\\t\\t\\tthat Route 53 Creates for a Hosted Zone</a> in the\\n\\t\\t\\t\\t\\t\\t<i>Amazon Route 53 Developer Guide</i>.</p>\\n               <p>If you want to use the same name servers for multiple public hosted zones, you\\n\\t\\t\\t\\t\\tcan optionally associate a reusable delegation set with the hosted zone. See the\\n\\t\\t\\t\\t\\t\\t<code>DelegationSetId</code> element.</p>\\n            </li>\\n            <li>\\n               <p>If your domain is registered with a registrar other than Route 53,\\n\\t\\t\\t\\t\\tyou must update the name servers with your registrar to make Route 53 the DNS\\n\\t\\t\\t\\t\\tservice for the domain. For more information, see <a href=\\\"https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/MigratingDNS.html\\\">Migrating DNS Service\\n\\t\\t\\t\\t\\t\\tfor an Existing Domain to Amazon Route 53</a> in the\\n\\t\\t\\t\\t\\t\\t<i>Amazon Route 53 Developer Guide</i>. </p>\\n            </li>\\n         </ul>\\n         <p>When you submit a <code>CreateHostedZone</code> request, the initial status of the\\n\\t\\t\\thosted zone is <code>PENDING</code>. For public hosted zones, this means that the NS and\\n\\t\\t\\tSOA records are not yet available on all Route 53 DNS servers. When the NS and\\n\\t\\t\\tSOA records are available, the status of the zone changes to <code>INSYNC</code>.</p>\\n         <p>The <code>CreateHostedZone</code> request requires the caller to have an\\n\\t\\t\\t\\t<code>ec2:DescribeVpcs</code> permission.</p>\\n         <note>\\n            <p>When creating private hosted zones, the Amazon VPC must belong to the same\\n\\t\\t\\t\\tpartition where the hosted zone is created. A partition is a group of Amazon Web Services Regions. Each Amazon Web Services account is scoped to one\\n\\t\\t\\t\\tpartition.</p>\\n            <p>The following are the supported partitions:</p>\\n            <ul>\\n               <li>\\n                  <p>\\n                     <code>aws</code> - Amazon Web Services Regions</p>\\n               </li>\\n               <li>\\n                  <p>\\n                     <code>aws-cn</code> - China Regions</p>\\n               </li>\\n               <li>\\n                  <p>\\n                     <code>aws-us-gov</code> - Amazon Web Services GovCloud (US) Region</p>\\n               </li>\\n            </ul>\\n            <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html\\\">Access Management</a>\\n\\t\\t\\t\\tin the <i>Amazon Web Services General Reference</i>.</p>\\n         </note>\",\n                \"smithy.api#http\": {\n                    \"method\": \"POST\",\n                    \"uri\": \"/2013-04-01/hostedzone\",\n                    \"code\": 201\n                }\n            }\n        },\n        \"com.amazonaws.route53#CreateHostedZoneRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Name\": {\n                    \"target\": \"com.amazonaws.route53#DNSName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the domain. Specify a fully qualified domain name, for example,\\n\\t\\t\\t\\t<i>www.example.com</i>. The trailing dot is optional; Amazon Route 53 assumes that the domain name is fully qualified. This means that\\n\\t\\t\\t\\tRoute 53 treats <i>www.example.com</i> (without a trailing\\n\\t\\t\\tdot) and <i>www.example.com.</i> (with a trailing dot) as\\n\\t\\t\\tidentical.</p>\\n         <p>If you're creating a public hosted zone, this is the name you have registered with\\n\\t\\t\\tyour DNS registrar. If your domain name is registered with a registrar other than\\n\\t\\t\\t\\tRoute 53, change the name servers for your domain to the set of\\n\\t\\t\\t\\t<code>NameServers</code> that <code>CreateHostedZone</code> returns in\\n\\t\\t\\t\\t<code>DelegationSet</code>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"VPC\": {\n                    \"target\": \"com.amazonaws.route53#VPC\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>(Private hosted zones only) A complex type that contains information about the Amazon\\n\\t\\t\\tVPC that you're associating with this hosted zone.</p>\\n         <p>You can specify only one Amazon VPC when you create a private hosted zone. If you are\\n\\t\\t\\tassociating a VPC with a hosted zone with this request, the paramaters\\n\\t\\t\\t\\t<code>VPCId</code> and <code>VPCRegion</code> are also required.</p>\\n         <p>To associate additional Amazon VPCs with the hosted zone, use <a href=\\\"https://docs.aws.amazon.com/Route53/latest/APIReference/API_AssociateVPCWithHostedZone.html\\\">AssociateVPCWithHostedZone</a> after you create a hosted zone.</p>\"\n                    }\n                },\n                \"CallerReference\": {\n                    \"target\": \"com.amazonaws.route53#Nonce\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A unique string that identifies the request and that allows failed\\n\\t\\t\\t\\t<code>CreateHostedZone</code> requests to be retried without the risk of executing\\n\\t\\t\\tthe operation twice. You must use a unique <code>CallerReference</code> string every\\n\\t\\t\\ttime you submit a <code>CreateHostedZone</code> request. <code>CallerReference</code>\\n\\t\\t\\tcan be any unique string, for example, a date/time stamp.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"HostedZoneConfig\": {\n                    \"target\": \"com.amazonaws.route53#HostedZoneConfig\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>(Optional) A complex type that contains the following optional values:</p>\\n         <ul>\\n            <li>\\n               <p>For public and private hosted zones, an optional comment</p>\\n            </li>\\n            <li>\\n               <p>For private hosted zones, an optional <code>PrivateZone</code> element</p>\\n            </li>\\n         </ul>\\n         <p>If you don't specify a comment or the <code>PrivateZone</code> element, omit\\n\\t\\t\\t\\t<code>HostedZoneConfig</code> and the other elements.</p>\"\n                    }\n                },\n                \"DelegationSetId\": {\n                    \"target\": \"com.amazonaws.route53#ResourceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If you want to associate a reusable delegation set with this hosted zone, the ID that\\n\\t\\t\\t\\tAmazon Route 53 assigned to the reusable delegation set when you created it.\\n\\t\\t\\tFor more information about reusable delegation sets, see <a href=\\\"https://docs.aws.amazon.com/Route53/latest/APIReference/API_CreateReusableDelegationSet.html\\\">CreateReusableDelegationSet</a>.</p>\\n         <p>If you are using a reusable delegation set to create a public hosted zone for a subdomain,\\n\\t\\t\\tmake sure that the parent hosted zone doesn't use one or more of the same name servers.\\n\\t\\t\\tIf you have overlapping nameservers, the operation will cause a\\n\\t\\t\\t\\t<code>ConflictingDomainsExist</code> error.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that contains information about the request to create a public or\\n\\t\\t\\tprivate hosted zone.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.route53#CreateHostedZoneResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"HostedZone\": {\n                    \"target\": \"com.amazonaws.route53#HostedZone\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A complex type that contains general information about the hosted zone.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ChangeInfo\": {\n                    \"target\": \"com.amazonaws.route53#ChangeInfo\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A complex type that contains information about the <code>CreateHostedZone</code>\\n\\t\\t\\trequest.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DelegationSet\": {\n                    \"target\": \"com.amazonaws.route53#DelegationSet\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A complex type that describes the name servers for this hosted zone.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"VPC\": {\n                    \"target\": \"com.amazonaws.route53#VPC\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A complex type that contains information about an Amazon VPC that you associated with\\n\\t\\t\\tthis hosted zone.</p>\"\n                    }\n                },\n                \"Location\": {\n                    \"target\": \"com.amazonaws.route53#ResourceURI\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The unique URL representing the new hosted zone.</p>\",\n                        \"smithy.api#httpHeader\": \"Location\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type containing the response information for the hosted zone.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.route53#CreateKeySigningKey\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.route53#CreateKeySigningKeyRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.route53#CreateKeySigningKeyResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.route53#ConcurrentModification\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidArgument\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidInput\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidKeySigningKeyName\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidKeySigningKeyStatus\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidKMSArn\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidSigningStatus\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#KeySigningKeyAlreadyExists\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#NoSuchHostedZone\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#TooManyKeySigningKeys\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates a new key-signing key (KSK) associated with a hosted zone. You can only have\\n\\t\\t\\ttwo KSKs per hosted zone.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"POST\",\n                    \"uri\": \"/2013-04-01/keysigningkey\",\n                    \"code\": 201\n                }\n            }\n        },\n        \"com.amazonaws.route53#CreateKeySigningKeyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CallerReference\": {\n                    \"target\": \"com.amazonaws.route53#Nonce\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A unique string that identifies the request.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"HostedZoneId\": {\n                    \"target\": \"com.amazonaws.route53#ResourceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The unique string (ID) used to identify a hosted zone.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"KeyManagementServiceArn\": {\n                    \"target\": \"com.amazonaws.route53#SigningKeyString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon resource name (ARN) for a customer managed key in Key Management Service\\n\\t\\t\\t\\t(KMS). The <code>KeyManagementServiceArn</code> must be unique for\\n\\t\\t\\teach key-signing key (KSK) in a single hosted zone. To see an example of\\n\\t\\t\\t\\t<code>KeyManagementServiceArn</code> that grants the correct permissions for DNSSEC,\\n\\t\\t\\tscroll down to <b>Example</b>. </p>\\n         <p>You must configure the customer managed customer managed key as follows:</p>\\n         <dl>\\n            <dt>Status</dt>\\n            <dd>\\n               <p>Enabled</p>\\n            </dd>\\n            <dt>Key spec</dt>\\n            <dd>\\n               <p>ECC_NIST_P256</p>\\n            </dd>\\n            <dt>Key usage</dt>\\n            <dd>\\n               <p>Sign and verify</p>\\n            </dd>\\n            <dt>Key policy</dt>\\n            <dd>\\n               <p>The key policy must give permission for the following actions:</p>\\n               <ul>\\n                  <li>\\n                     <p>DescribeKey</p>\\n                  </li>\\n                  <li>\\n                     <p>GetPublicKey</p>\\n                  </li>\\n                  <li>\\n                     <p>Sign</p>\\n                  </li>\\n               </ul>\\n               <p>The key policy must also include the Amazon Route 53 service in the\\n\\t\\t\\t\\t\\t\\tprincipal for your account. Specify the following:</p>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <code>\\\"Service\\\": \\\"dnssec-route53.amazonaws.com\\\"</code>\\n                     </p>\\n                  </li>\\n               </ul>\\n            </dd>\\n         </dl>\\n         <p>For more information about working with a customer managed key in KMS, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html\\\">Key Management Service concepts</a>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Name\": {\n                    \"target\": \"com.amazonaws.route53#SigningKeyName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A string used to identify a key-signing key (KSK). <code>Name</code> can include\\n\\t\\t\\tnumbers, letters, and underscores (_). <code>Name</code> must be unique for each\\n\\t\\t\\tkey-signing key in the same hosted zone.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Status\": {\n                    \"target\": \"com.amazonaws.route53#SigningKeyStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A string specifying the initial status of the key-signing key (KSK). You can set the\\n\\t\\t\\tvalue to <code>ACTIVE</code> or <code>INACTIVE</code>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.route53#CreateKeySigningKeyResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ChangeInfo\": {\n                    \"target\": \"com.amazonaws.route53#ChangeInfo\",\n                    \"traits\": {\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"KeySigningKey\": {\n                    \"target\": \"com.amazonaws.route53#KeySigningKey\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The key-signing key (KSK) that the request creates.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Location\": {\n                    \"target\": \"com.amazonaws.route53#ResourceURI\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The unique URL representing the new key-signing key (KSK).</p>\",\n                        \"smithy.api#httpHeader\": \"Location\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.route53#CreateQueryLoggingConfig\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.route53#CreateQueryLoggingConfigRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.route53#CreateQueryLoggingConfigResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.route53#ConcurrentModification\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#InsufficientCloudWatchLogsResourcePolicy\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidInput\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#NoSuchCloudWatchLogsLogGroup\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#NoSuchHostedZone\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#QueryLoggingConfigAlreadyExists\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates a configuration for DNS query logging. After you create a query logging\\n\\t\\t\\tconfiguration, Amazon Route 53 begins to publish log data to an Amazon CloudWatch Logs\\n\\t\\t\\tlog group.</p>\\n         <p>DNS query logs contain information about the queries that Route 53 receives for a\\n\\t\\t\\tspecified public hosted zone, such as the following:</p>\\n         <ul>\\n            <li>\\n               <p>Route 53 edge location that responded to the DNS query</p>\\n            </li>\\n            <li>\\n               <p>Domain or subdomain that was requested</p>\\n            </li>\\n            <li>\\n               <p>DNS record type, such as A or AAAA</p>\\n            </li>\\n            <li>\\n               <p>DNS response code, such as <code>NoError</code> or\\n\\t\\t\\t\\t\\t<code>ServFail</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <dl>\\n            <dt>Log Group and Resource Policy</dt>\\n            <dd>\\n               <p>Before you create a query logging configuration, perform the following\\n\\t\\t\\t\\t\\t\\toperations.</p>\\n               <note>\\n                  <p>If you create a query logging configuration using the Route 53\\n\\t\\t\\t\\t\\t\\t\\tconsole, Route 53 performs these operations automatically.</p>\\n               </note>\\n               <ol>\\n                  <li>\\n                     <p>Create a CloudWatch Logs log group, and make note of the ARN,\\n\\t\\t\\t\\t\\t\\t\\t\\twhich you specify when you create a query logging configuration.\\n\\t\\t\\t\\t\\t\\t\\t\\tNote the following:</p>\\n                     <ul>\\n                        <li>\\n                           <p>You must create the log group in the us-east-1\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\tregion.</p>\\n                        </li>\\n                        <li>\\n                           <p>You must use the same Amazon Web Services account to create\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\tthe log group and the hosted zone that you want to configure\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\tquery logging for.</p>\\n                        </li>\\n                        <li>\\n                           <p>When you create log groups for query logging, we recommend\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\tthat you use a consistent prefix, for example:</p>\\n                           <p>\\n                              <code>/aws/route53/<i>hosted zone\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\tname</i>\\n                              </code>\\n                           </p>\\n                           <p>In the next step, you'll create a resource policy, which\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\tcontrols access to one or more log groups and the associated\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\tAmazon Web Services resources, such as Route 53 hosted\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\tzones. There's a limit on the number of resource policies\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\tthat you can create, so we recommend that you use a\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\tconsistent prefix so you can use the same resource policy\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\tfor all the log groups that you create for query\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\tlogging.</p>\\n                        </li>\\n                     </ul>\\n                  </li>\\n                  <li>\\n                     <p>Create a CloudWatch Logs resource policy, and give it the\\n\\t\\t\\t\\t\\t\\t\\t\\tpermissions that Route 53 needs to create log streams and to send\\n\\t\\t\\t\\t\\t\\t\\t\\tquery logs to log streams. You must create the CloudWatch Logs resource policy in the us-east-1\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tregion. For the value of <code>Resource</code>,\\n\\t\\t\\t\\t\\t\\t\\t\\tspecify the ARN for the log group that you created in the previous\\n\\t\\t\\t\\t\\t\\t\\t\\tstep. To use the same resource policy for all the CloudWatch Logs\\n\\t\\t\\t\\t\\t\\t\\t\\tlog groups that you created for query logging configurations,\\n\\t\\t\\t\\t\\t\\t\\t\\treplace the hosted zone name with <code>*</code>, for\\n\\t\\t\\t\\t\\t\\t\\t\\texample:</p>\\n                     <p>\\n                        <code>arn:aws:logs:us-east-1:123412341234:log-group:/aws/route53/*</code>\\n                     </p>\\n                     <p>To avoid the confused deputy problem, a security issue where an\\n\\t\\t\\t\\t\\t\\t\\t\\tentity without a permission for an action can coerce a\\n\\t\\t\\t\\t\\t\\t\\t\\tmore-privileged entity to perform it, you can optionally limit the\\n\\t\\t\\t\\t\\t\\t\\t\\tpermissions that a service has to a resource in a resource-based\\n\\t\\t\\t\\t\\t\\t\\t\\tpolicy by supplying the following values:</p>\\n                     <ul>\\n                        <li>\\n                           <p>For <code>aws:SourceArn</code>, supply the hosted zone ARN\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\tused in creating the query logging configuration. For\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\texample, <code>aws:SourceArn:\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\tarn:aws:route53:::hostedzone/hosted zone\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\tID</code>.</p>\\n                        </li>\\n                        <li>\\n                           <p>For <code>aws:SourceAccount</code>, supply the account ID\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\tfor the account that creates the query logging\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\tconfiguration. For example,\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t\\t<code>aws:SourceAccount:111111111111</code>.</p>\\n                        </li>\\n                     </ul>\\n                     <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html\\\">The confused\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tdeputy problem</a> in the <i>Amazon Web Services\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tIAM User Guide</i>.</p>\\n                     <note>\\n                        <p>You can't use the CloudWatch console to create or edit a\\n\\t\\t\\t\\t\\t\\t\\t\\t\\tresource policy. You must use the CloudWatch API, one of the\\n\\t\\t\\t\\t\\t\\t\\t\\t\\t\\tAmazon Web Services SDKs, or the CLI.</p>\\n                     </note>\\n                  </li>\\n               </ol>\\n            </dd>\\n            <dt>Log Streams and Edge Locations</dt>\\n            <dd>\\n               <p>When Route 53 finishes creating the configuration for DNS query logging,\\n\\t\\t\\t\\t\\t\\tit does the following:</p>\\n               <ul>\\n                  <li>\\n                     <p>Creates a log stream for an edge location the first time that the\\n\\t\\t\\t\\t\\t\\t\\t\\tedge location responds to DNS queries for the specified hosted zone.\\n\\t\\t\\t\\t\\t\\t\\t\\tThat log stream is used to log all queries that Route 53 responds to\\n\\t\\t\\t\\t\\t\\t\\t\\tfor that edge location.</p>\\n                  </li>\\n                  <li>\\n                     <p>Begins to send query logs to the applicable log stream.</p>\\n                  </li>\\n               </ul>\\n               <p>The name of each log stream is in the following format:</p>\\n               <p>\\n                  <code>\\n                     <i>hosted zone ID</i>/<i>edge location\\n\\t\\t\\t\\t\\t\\t\\t\\tcode</i>\\n                  </code>\\n               </p>\\n               <p>The edge location code is a three-letter code and an arbitrarily assigned\\n\\t\\t\\t\\t\\t\\tnumber, for example, DFW3. The three-letter code typically corresponds with\\n\\t\\t\\t\\t\\t\\tthe International Air Transport Association airport code for an airport near\\n\\t\\t\\t\\t\\t\\tthe edge location. (These abbreviations might change in the future.) For a\\n\\t\\t\\t\\t\\t\\tlist of edge locations, see \\\"The Route 53 Global Network\\\" on the <a href=\\\"http://aws.amazon.com/route53/details/\\\">Route 53 Product Details</a>\\n\\t\\t\\t\\t\\t\\tpage.</p>\\n            </dd>\\n            <dt>Queries That Are Logged</dt>\\n            <dd>\\n               <p>Query logs contain only the queries that DNS resolvers forward to Route\\n\\t\\t\\t\\t\\t\\t53. If a DNS resolver has already cached the response to a query (such as\\n\\t\\t\\t\\t\\t\\tthe IP address for a load balancer for example.com), the resolver will\\n\\t\\t\\t\\t\\t\\tcontinue to return the cached response. It doesn't forward another query to\\n\\t\\t\\t\\t\\t\\tRoute 53 until the TTL for the corresponding resource record set expires.\\n\\t\\t\\t\\t\\t\\tDepending on how many DNS queries are submitted for a resource record set,\\n\\t\\t\\t\\t\\t\\tand depending on the TTL for that resource record set, query logs might\\n\\t\\t\\t\\t\\t\\tcontain information about only one query out of every several thousand\\n\\t\\t\\t\\t\\t\\tqueries that are submitted to DNS. For more information about how DNS works,\\n\\t\\t\\t\\t\\t\\tsee <a href=\\\"https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/welcome-dns-service.html\\\">Routing\\n\\t\\t\\t\\t\\t\\t\\tInternet Traffic to Your Website or Web Application</a> in the\\n\\t\\t\\t\\t\\t\\t\\t<i>Amazon Route 53 Developer Guide</i>.</p>\\n            </dd>\\n            <dt>Log File Format</dt>\\n            <dd>\\n               <p>For a list of the values in each query log and the format of each value,\\n\\t\\t\\t\\t\\t\\tsee <a href=\\\"https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/query-logs.html\\\">Logging DNS\\n\\t\\t\\t\\t\\t\\t\\tQueries</a> in the <i>Amazon Route 53 Developer\\n\\t\\t\\t\\t\\t\\t\\tGuide</i>.</p>\\n            </dd>\\n            <dt>Pricing</dt>\\n            <dd>\\n               <p>For information about charges for query logs, see <a href=\\\"http://aws.amazon.com/cloudwatch/pricing/\\\">Amazon CloudWatch Pricing</a>.</p>\\n            </dd>\\n            <dt>How to Stop Logging</dt>\\n            <dd>\\n               <p>If you want Route 53 to stop sending query logs to CloudWatch Logs, delete\\n\\t\\t\\t\\t\\t\\tthe query logging configuration. For more information, see <a href=\\\"https://docs.aws.amazon.com/Route53/latest/APIReference/API_DeleteQueryLoggingConfig.html\\\">DeleteQueryLoggingConfig</a>.</p>\\n            </dd>\\n         </dl>\",\n                \"smithy.api#http\": {\n                    \"method\": \"POST\",\n                    \"uri\": \"/2013-04-01/queryloggingconfig\",\n                    \"code\": 201\n                }\n            }\n        },\n        \"com.amazonaws.route53#CreateQueryLoggingConfigRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"HostedZoneId\": {\n                    \"target\": \"com.amazonaws.route53#ResourceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the hosted zone that you want to log queries for. You can log queries only\\n\\t\\t\\tfor public hosted zones.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"CloudWatchLogsLogGroupArn\": {\n                    \"target\": \"com.amazonaws.route53#CloudWatchLogsLogGroupArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) for the log group that you want to Amazon Route 53 to\\n\\t\\t\\tsend query logs to. This is the format of the ARN:</p>\\n         <p>arn:aws:logs:<i>region</i>:<i>account-id</i>:log-group:<i>log_group_name</i>\\n         </p>\\n         <p>To get the ARN for a log group, you can use the CloudWatch console, the <a href=\\\"https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_DescribeLogGroups.html\\\">DescribeLogGroups</a> API action, the <a href=\\\"https://docs.aws.amazon.com/cli/latest/reference/logs/describe-log-groups.html\\\">describe-log-groups</a>\\n\\t\\t\\tcommand, or the applicable command in one of the Amazon Web Services SDKs.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.route53#CreateQueryLoggingConfigResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"QueryLoggingConfig\": {\n                    \"target\": \"com.amazonaws.route53#QueryLoggingConfig\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A complex type that contains the ID for a query logging configuration, the ID of the\\n\\t\\t\\thosted zone that you want to log queries for, and the ARN for the log group that you\\n\\t\\t\\twant Amazon Route 53 to send query logs to.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Location\": {\n                    \"target\": \"com.amazonaws.route53#ResourceURI\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The unique URL representing the new query logging configuration.</p>\",\n                        \"smithy.api#httpHeader\": \"Location\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.route53#CreateReusableDelegationSet\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.route53#CreateReusableDelegationSetRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.route53#CreateReusableDelegationSetResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.route53#DelegationSetAlreadyCreated\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#DelegationSetAlreadyReusable\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#DelegationSetNotAvailable\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#HostedZoneNotFound\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidArgument\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidInput\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#LimitsExceeded\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates a delegation set (a group of four name servers) that can be reused by multiple\\n\\t\\t\\thosted zones that were created by the same Amazon Web Services account. </p>\\n         <p>You can also create a reusable delegation set that uses the four name servers that are\\n\\t\\t\\tassociated with an existing hosted zone. Specify the hosted zone ID in the\\n\\t\\t\\t\\t<code>CreateReusableDelegationSet</code> request.</p>\\n         <note>\\n            <p>You can't associate a reusable delegation set with a private hosted zone.</p>\\n         </note>\\n         <p>For information about using a reusable delegation set to configure white label name\\n\\t\\t\\tservers, see <a href=\\\"https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/white-label-name-servers.html\\\">Configuring White\\n\\t\\t\\t\\tLabel Name Servers</a>.</p>\\n         <p>The process for migrating existing hosted zones to use a reusable delegation set is\\n\\t\\t\\tcomparable to the process for configuring white label name servers. You need to perform\\n\\t\\t\\tthe following steps:</p>\\n         <ol>\\n            <li>\\n               <p>Create a reusable delegation set.</p>\\n            </li>\\n            <li>\\n               <p>Recreate hosted zones, and reduce the TTL to 60 seconds or less.</p>\\n            </li>\\n            <li>\\n               <p>Recreate resource record sets in the new hosted zones.</p>\\n            </li>\\n            <li>\\n               <p>Change the registrar's name servers to use the name servers for the new hosted\\n\\t\\t\\t\\t\\tzones.</p>\\n            </li>\\n            <li>\\n               <p>Monitor traffic for the website or application.</p>\\n            </li>\\n            <li>\\n               <p>Change TTLs back to their original values.</p>\\n            </li>\\n         </ol>\\n         <p>If you want to migrate existing hosted zones to use a reusable delegation set, the\\n\\t\\t\\texisting hosted zones can't use any of the name servers that are assigned to the\\n\\t\\t\\treusable delegation set. If one or more hosted zones do use one or more name servers\\n\\t\\t\\tthat are assigned to the reusable delegation set, you can do one of the\\n\\t\\t\\tfollowing:</p>\\n         <ul>\\n            <li>\\n               <p>For small numbers of hosted zones—up to a few hundred—it's\\n\\t\\t\\t\\t\\trelatively easy to create reusable delegation sets until you get one that has\\n\\t\\t\\t\\t\\tfour name servers that don't overlap with any of the name servers in your hosted\\n\\t\\t\\t\\t\\tzones.</p>\\n            </li>\\n            <li>\\n               <p>For larger numbers of hosted zones, the easiest solution is to use more than\\n\\t\\t\\t\\t\\tone reusable delegation set.</p>\\n            </li>\\n            <li>\\n               <p>For larger numbers of hosted zones, you can also migrate hosted zones that\\n\\t\\t\\t\\t\\thave overlapping name servers to hosted zones that don't have overlapping name\\n\\t\\t\\t\\t\\tservers, then migrate the hosted zones again to use the reusable delegation\\n\\t\\t\\t\\t\\tset.</p>\\n            </li>\\n         </ul>\",\n                \"smithy.api#http\": {\n                    \"method\": \"POST\",\n                    \"uri\": \"/2013-04-01/delegationset\",\n                    \"code\": 201\n                }\n            }\n        },\n        \"com.amazonaws.route53#CreateReusableDelegationSetRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CallerReference\": {\n                    \"target\": \"com.amazonaws.route53#Nonce\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A unique string that identifies the request, and that allows you to retry failed\\n\\t\\t\\t\\t<code>CreateReusableDelegationSet</code> requests without the risk of executing the\\n\\t\\t\\toperation twice. You must use a unique <code>CallerReference</code> string every time\\n\\t\\t\\tyou submit a <code>CreateReusableDelegationSet</code> request.\\n\\t\\t\\t\\t<code>CallerReference</code> can be any unique string, for example a date/time\\n\\t\\t\\tstamp.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"HostedZoneId\": {\n                    \"target\": \"com.amazonaws.route53#ResourceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If you want to mark the delegation set for an existing hosted zone as reusable, the ID\\n\\t\\t\\tfor that hosted zone.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.route53#CreateReusableDelegationSetResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DelegationSet\": {\n                    \"target\": \"com.amazonaws.route53#DelegationSet\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A complex type that contains name server information.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Location\": {\n                    \"target\": \"com.amazonaws.route53#ResourceURI\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The unique URL representing the new reusable delegation set.</p>\",\n                        \"smithy.api#httpHeader\": \"Location\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.route53#CreateTrafficPolicy\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.route53#CreateTrafficPolicyRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.route53#CreateTrafficPolicyResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidInput\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidTrafficPolicyDocument\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#TooManyTrafficPolicies\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#TrafficPolicyAlreadyExists\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates a traffic policy, which you use to create multiple DNS resource record sets\\n\\t\\t\\tfor one domain name (such as example.com) or one subdomain name (such as\\n\\t\\t\\twww.example.com).</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"POST\",\n                    \"uri\": \"/2013-04-01/trafficpolicy\",\n                    \"code\": 201\n                }\n            }\n        },\n        \"com.amazonaws.route53#CreateTrafficPolicyInstance\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.route53#CreateTrafficPolicyInstanceRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.route53#CreateTrafficPolicyInstanceResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidInput\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#NoSuchHostedZone\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#NoSuchTrafficPolicy\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#TooManyTrafficPolicyInstances\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#TrafficPolicyInstanceAlreadyExists\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates resource record sets in a specified hosted zone based on the settings in a\\n\\t\\t\\tspecified traffic policy version. In addition, <code>CreateTrafficPolicyInstance</code>\\n\\t\\t\\tassociates the resource record sets with a specified domain name (such as example.com)\\n\\t\\t\\tor subdomain name (such as www.example.com). Amazon Route 53 responds to DNS queries for\\n\\t\\t\\tthe domain or subdomain name by using the resource record sets that\\n\\t\\t\\t\\t<code>CreateTrafficPolicyInstance</code> created.</p>\\n         <note>\\n            <p>After you submit an <code>CreateTrafficPolicyInstance</code> request, there's a\\n\\t\\t\\t\\tbrief delay while Amazon Route 53 creates the resource record sets that are\\n\\t\\t\\t\\tspecified in the traffic policy definition. \\n\\t\\t\\t\\tUse <code>GetTrafficPolicyInstance</code> with the <code>id</code> of new traffic policy instance to confirm that the <code>CreateTrafficPolicyInstance</code>\\n\\t\\t\\t\\trequest completed successfully. For more information, see the\\n\\t\\t\\t\\t<code>State</code> response element.</p>\\n         </note>\",\n                \"smithy.api#http\": {\n                    \"method\": \"POST\",\n                    \"uri\": \"/2013-04-01/trafficpolicyinstance\",\n                    \"code\": 201\n                }\n            }\n        },\n        \"com.amazonaws.route53#CreateTrafficPolicyInstanceRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"HostedZoneId\": {\n                    \"target\": \"com.amazonaws.route53#ResourceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the hosted zone that you want Amazon Route 53 to create resource record sets\\n\\t\\t\\tin by using the configuration in a traffic policy.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Name\": {\n                    \"target\": \"com.amazonaws.route53#DNSName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The domain name (such as example.com) or subdomain name (such as www.example.com) for\\n\\t\\t\\twhich Amazon Route 53 responds to DNS queries by using the resource record sets that\\n\\t\\t\\tRoute 53 creates for this traffic policy instance.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TTL\": {\n                    \"target\": \"com.amazonaws.route53#TTL\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>(Optional) The TTL that you want Amazon Route 53 to assign to all of the resource\\n\\t\\t\\trecord sets that it creates in the specified hosted zone.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TrafficPolicyId\": {\n                    \"target\": \"com.amazonaws.route53#TrafficPolicyId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the traffic policy that you want to use to create resource record sets in\\n\\t\\t\\tthe specified hosted zone.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TrafficPolicyVersion\": {\n                    \"target\": \"com.amazonaws.route53#TrafficPolicyVersion\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The version of the traffic policy that you want to use to create resource record sets\\n\\t\\t\\tin the specified hosted zone.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that contains information about the resource record sets that you want\\n\\t\\t\\tto create based on a specified traffic policy.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.route53#CreateTrafficPolicyInstanceResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TrafficPolicyInstance\": {\n                    \"target\": \"com.amazonaws.route53#TrafficPolicyInstance\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A complex type that contains settings for the new traffic policy instance.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Location\": {\n                    \"target\": \"com.amazonaws.route53#ResourceURI\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A unique URL that represents a new traffic policy instance.</p>\",\n                        \"smithy.api#httpHeader\": \"Location\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that contains the response information for the\\n\\t\\t\\t\\t<code>CreateTrafficPolicyInstance</code> request.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.route53#CreateTrafficPolicyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Name\": {\n                    \"target\": \"com.amazonaws.route53#TrafficPolicyName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the traffic policy.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Document\": {\n                    \"target\": \"com.amazonaws.route53#TrafficPolicyDocument\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The definition of this traffic policy in JSON format. For more information, see <a href=\\\"https://docs.aws.amazon.com/Route53/latest/APIReference/api-policies-traffic-policy-document-format.html\\\">Traffic Policy Document Format</a>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Comment\": {\n                    \"target\": \"com.amazonaws.route53#TrafficPolicyComment\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>(Optional) Any comments that you want to include about the traffic policy.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that contains information about the traffic policy that you want to\\n\\t\\t\\tcreate.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.route53#CreateTrafficPolicyResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TrafficPolicy\": {\n                    \"target\": \"com.amazonaws.route53#TrafficPolicy\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A complex type that contains settings for the new traffic policy.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Location\": {\n                    \"target\": \"com.amazonaws.route53#ResourceURI\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A unique URL that represents a new traffic policy.</p>\",\n                        \"smithy.api#httpHeader\": \"Location\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that contains the response information for the\\n\\t\\t\\t\\t<code>CreateTrafficPolicy</code> request.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.route53#CreateTrafficPolicyVersion\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.route53#CreateTrafficPolicyVersionRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.route53#CreateTrafficPolicyVersionResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.route53#ConcurrentModification\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidInput\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidTrafficPolicyDocument\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#NoSuchTrafficPolicy\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#TooManyTrafficPolicyVersionsForCurrentPolicy\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates a new version of an existing traffic policy. When you create a new version of\\n\\t\\t\\ta traffic policy, you specify the ID of the traffic policy that you want to update and a\\n\\t\\t\\tJSON-formatted document that describes the new version. You use traffic policies to\\n\\t\\t\\tcreate multiple DNS resource record sets for one domain name (such as example.com) or\\n\\t\\t\\tone subdomain name (such as www.example.com). You can create a maximum of 1000 versions\\n\\t\\t\\tof a traffic policy. If you reach the limit and need to create another version, you'll\\n\\t\\t\\tneed to start a new traffic policy.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"POST\",\n                    \"uri\": \"/2013-04-01/trafficpolicy/{Id}\",\n                    \"code\": 201\n                }\n            }\n        },\n        \"com.amazonaws.route53#CreateTrafficPolicyVersionRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Id\": {\n                    \"target\": \"com.amazonaws.route53#TrafficPolicyId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the traffic policy for which you want to create a new version.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Document\": {\n                    \"target\": \"com.amazonaws.route53#TrafficPolicyDocument\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The definition of this version of the traffic policy, in JSON format. You specified\\n\\t\\t\\tthe JSON in the <code>CreateTrafficPolicyVersion</code> request. For more information\\n\\t\\t\\tabout the JSON format, see <a href=\\\"https://docs.aws.amazon.com/Route53/latest/APIReference/API_CreateTrafficPolicy.html\\\">CreateTrafficPolicy</a>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Comment\": {\n                    \"target\": \"com.amazonaws.route53#TrafficPolicyComment\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The comment that you specified in the <code>CreateTrafficPolicyVersion</code> request,\\n\\t\\t\\tif any.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that contains information about the traffic policy that you want to\\n\\t\\t\\tcreate a new version for.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.route53#CreateTrafficPolicyVersionResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TrafficPolicy\": {\n                    \"target\": \"com.amazonaws.route53#TrafficPolicy\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A complex type that contains settings for the new version of the traffic\\n\\t\\t\\tpolicy.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Location\": {\n                    \"target\": \"com.amazonaws.route53#ResourceURI\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A unique URL that represents a new traffic policy version.</p>\",\n                        \"smithy.api#httpHeader\": \"Location\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that contains the response information for the\\n\\t\\t\\t\\t<code>CreateTrafficPolicyVersion</code> request.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.route53#CreateVPCAssociationAuthorization\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.route53#CreateVPCAssociationAuthorizationRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.route53#CreateVPCAssociationAuthorizationResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.route53#ConcurrentModification\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidInput\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidVPCId\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#NoSuchHostedZone\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#TooManyVPCAssociationAuthorizations\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Authorizes the Amazon Web Services account that created a specified VPC to submit an\\n\\t\\t\\t\\t<code>AssociateVPCWithHostedZone</code> request to associate the VPC with a\\n\\t\\t\\tspecified hosted zone that was created by a different account. To submit a\\n\\t\\t\\t\\t<code>CreateVPCAssociationAuthorization</code> request, you must use the account\\n\\t\\t\\tthat created the hosted zone. After you authorize the association, use the account that\\n\\t\\t\\tcreated the VPC to submit an <code>AssociateVPCWithHostedZone</code> request.</p>\\n         <note>\\n            <p>If you want to associate multiple VPCs that you created by using one account with\\n\\t\\t\\t\\ta hosted zone that you created by using a different account, you must submit one\\n\\t\\t\\t\\tauthorization request for each VPC.</p>\\n         </note>\",\n                \"smithy.api#http\": {\n                    \"method\": \"POST\",\n                    \"uri\": \"/2013-04-01/hostedzone/{HostedZoneId}/authorizevpcassociation\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.route53#CreateVPCAssociationAuthorizationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"HostedZoneId\": {\n                    \"target\": \"com.amazonaws.route53#ResourceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the private hosted zone that you want to authorize associating a VPC\\n\\t\\t\\twith.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"VPC\": {\n                    \"target\": \"com.amazonaws.route53#VPC\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A complex type that contains the VPC ID and region for the VPC that you want to\\n\\t\\t\\tauthorize associating with your hosted zone.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that contains information about the request to authorize associating a\\n\\t\\t\\tVPC with your private hosted zone. Authorization is only required when a private hosted\\n\\t\\t\\tzone and a VPC were created by using different accounts.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.route53#CreateVPCAssociationAuthorizationResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"HostedZoneId\": {\n                    \"target\": \"com.amazonaws.route53#ResourceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the hosted zone that you authorized associating a VPC with.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"VPC\": {\n                    \"target\": \"com.amazonaws.route53#VPC\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The VPC that you authorized associating with a hosted zone.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that contains the response information from a\\n\\t\\t\\t\\t<code>CreateVPCAssociationAuthorization</code> request.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.route53#DNSName\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 1024\n                }\n            }\n        },\n        \"com.amazonaws.route53#DNSRCode\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.route53#DNSSECNotFound\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.route53#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The hosted zone doesn't have any DNSSEC resources.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.route53#DNSSECStatus\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ServeSignature\": {\n                    \"target\": \"com.amazonaws.route53#ServeSignature\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A string that represents the current hosted zone signing status.</p>\\n         <p>Status can have one of the following values:</p>\\n         <dl>\\n            <dt>SIGNING</dt>\\n            <dd>\\n               <p>DNSSEC signing is enabled for the hosted zone.</p>\\n            </dd>\\n            <dt>NOT_SIGNING</dt>\\n            <dd>\\n               <p>DNSSEC signing is not enabled for the hosted zone.</p>\\n            </dd>\\n            <dt>DELETING</dt>\\n            <dd>\\n               <p>DNSSEC signing is in the process of being removed for the hosted\\n\\t\\t\\t\\t\\t\\tzone.</p>\\n            </dd>\\n            <dt>ACTION_NEEDED</dt>\\n            <dd>\\n               <p>There is a problem with signing in the hosted zone that requires you to\\n\\t\\t\\t\\t\\t\\ttake action to resolve. For example, the customer managed key might have\\n\\t\\t\\t\\t\\t\\tbeen deleted, or the permissions for the customer managed key might have\\n\\t\\t\\t\\t\\t\\tbeen changed.</p>\\n            </dd>\\n            <dt>INTERNAL_FAILURE</dt>\\n            <dd>\\n               <p>There was an error during a request. Before you can continue to work with\\n\\t\\t\\t\\t\\t\\tDNSSEC signing, including with key-signing keys (KSKs), you must correct the\\n\\t\\t\\t\\t\\t\\tproblem by enabling or disabling DNSSEC signing for the hosted zone.</p>\\n            </dd>\\n         </dl>\"\n                    }\n                },\n                \"StatusMessage\": {\n                    \"target\": \"com.amazonaws.route53#SigningKeyStatusMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The status message provided for the following DNSSEC signing status:\\n\\t\\t\\t\\t<code>INTERNAL_FAILURE</code>. The status message includes information about what\\n\\t\\t\\tthe problem might be and steps that you can take to correct the issue.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A string representing the status of DNSSEC signing.</p>\"\n            }\n        },\n        \"com.amazonaws.route53#DeactivateKeySigningKey\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.route53#DeactivateKeySigningKeyRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.route53#DeactivateKeySigningKeyResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.route53#ConcurrentModification\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidInput\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidKeySigningKeyStatus\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidSigningStatus\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#KeySigningKeyInParentDSRecord\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#KeySigningKeyInUse\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#NoSuchKeySigningKey\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deactivates a key-signing key (KSK) so that it will not be used for signing by DNSSEC.\\n\\t\\t\\tThis operation changes the KSK status to <code>INACTIVE</code>.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"POST\",\n                    \"uri\": \"/2013-04-01/keysigningkey/{HostedZoneId}/{Name}/deactivate\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.route53#DeactivateKeySigningKeyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"HostedZoneId\": {\n                    \"target\": \"com.amazonaws.route53#ResourceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A unique string used to identify a hosted zone.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Name\": {\n                    \"target\": \"com.amazonaws.route53#SigningKeyName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A string used to identify a key-signing key (KSK).</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.route53#DeactivateKeySigningKeyResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ChangeInfo\": {\n                    \"target\": \"com.amazonaws.route53#ChangeInfo\",\n                    \"traits\": {\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.route53#DelegationSet\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Id\": {\n                    \"target\": \"com.amazonaws.route53#ResourceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID that Amazon Route 53 assigns to a reusable delegation set.</p>\"\n                    }\n                },\n                \"CallerReference\": {\n                    \"target\": \"com.amazonaws.route53#Nonce\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The value that you specified for <code>CallerReference</code> when you created the\\n\\t\\t\\treusable delegation set.</p>\"\n                    }\n                },\n                \"NameServers\": {\n                    \"target\": \"com.amazonaws.route53#DelegationSetNameServers\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A complex type that contains a list of the authoritative name servers for a hosted\\n\\t\\t\\tzone or for a reusable delegation set.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that lists the name servers in a delegation set, as well as the\\n\\t\\t\\t\\t<code>CallerReference</code> and the <code>ID</code> for the delegation set.</p>\"\n            }\n        },\n        \"com.amazonaws.route53#DelegationSetAlreadyCreated\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.route53#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A delegation set with the same owner and caller reference combination has already been\\n\\t\\t\\tcreated.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.route53#DelegationSetAlreadyReusable\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.route53#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The specified delegation set has already been marked as reusable.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.route53#DelegationSetInUse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.route53#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The specified delegation contains associated hosted zones which must be deleted before\\n\\t\\t\\tthe reusable delegation set can be deleted.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.route53#DelegationSetNameServers\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.route53#DNSName\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"NameServer\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1\n                }\n            }\n        },\n        \"com.amazonaws.route53#DelegationSetNotAvailable\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.route53#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>You can create a hosted zone that has the same name as an existing hosted zone\\n\\t\\t\\t(example.com is common), but there is a limit to the number of hosted zones that have\\n\\t\\t\\tthe same name. If you get this error, Amazon Route 53 has reached that limit. If you own\\n\\t\\t\\tthe domain name and Route 53 generates this error, contact Customer Support.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.route53#DelegationSetNotReusable\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.route53#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A reusable delegation set with the specified ID does not exist.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.route53#DelegationSets\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.route53#DelegationSet\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"DelegationSet\"\n                }\n            }\n        },\n        \"com.amazonaws.route53#DeleteCidrCollection\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.route53#DeleteCidrCollectionRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.route53#DeleteCidrCollectionResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.route53#CidrCollectionInUseException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#ConcurrentModification\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidInput\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#NoSuchCidrCollectionException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes a CIDR collection in the current Amazon Web Services account. The collection\\n\\t\\t\\tmust be empty before it can be deleted.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"DELETE\",\n                    \"uri\": \"/2013-04-01/cidrcollection/{Id}\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.route53#DeleteCidrCollectionRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Id\": {\n                    \"target\": \"com.amazonaws.route53#UUID\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The UUID of the collection to delete.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.route53#DeleteCidrCollectionResponse\": {\n            \"type\": \"structure\",\n            \"members\": {},\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.route53#DeleteHealthCheck\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.route53#DeleteHealthCheckRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.route53#DeleteHealthCheckResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.route53#HealthCheckInUse\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidInput\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#NoSuchHealthCheck\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes a health check.</p>\\n         <important>\\n            <p>Amazon Route 53 does not prevent you from deleting a health check even if the\\n\\t\\t\\t\\thealth check is associated with one or more resource record sets. If you delete a\\n\\t\\t\\t\\thealth check and you don't update the associated resource record sets, the future\\n\\t\\t\\t\\tstatus of the health check can't be predicted and may change. This will affect the\\n\\t\\t\\t\\trouting of DNS queries for your DNS failover configuration. For more information,\\n\\t\\t\\t\\tsee <a href=\\\"https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/health-checks-creating-deleting.html#health-checks-deleting.html\\\">Replacing and Deleting Health Checks</a> in the <i>Amazon Route 53\\n\\t\\t\\t\\t\\tDeveloper Guide</i>.</p>\\n         </important>\\n         <p>If you're using Cloud Map and you configured Cloud Map to create a Route 53\\n\\t\\t\\thealth check when you register an instance, you can't use the Route 53\\n\\t\\t\\t\\t<code>DeleteHealthCheck</code> command to delete the health check. The health check\\n\\t\\t\\tis deleted automatically when you deregister the instance; there can be a delay of\\n\\t\\t\\tseveral hours before the health check is deleted from Route 53. </p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"DELETE\",\n                    \"uri\": \"/2013-04-01/healthcheck/{HealthCheckId}\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.route53#DeleteHealthCheckRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"HealthCheckId\": {\n                    \"target\": \"com.amazonaws.route53#HealthCheckId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the health check that you want to delete.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This action deletes a health check.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.route53#DeleteHealthCheckResponse\": {\n            \"type\": \"structure\",\n            \"members\": {},\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>An empty element.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.route53#DeleteHostedZone\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.route53#DeleteHostedZoneRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.route53#DeleteHostedZoneResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.route53#HostedZoneNotEmpty\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidDomainName\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidInput\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#NoSuchHostedZone\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#PriorRequestNotComplete\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes a hosted zone.</p>\\n         <p>If the hosted zone was created by another service, such as Cloud Map, see\\n\\t\\t\\t\\t<a href=\\\"https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/DeleteHostedZone.html#delete-public-hosted-zone-created-by-another-service\\\">Deleting Public Hosted Zones That Were Created by Another Service</a> in the\\n\\t\\t\\t\\t\\t<i>Amazon Route 53 Developer Guide</i> for information\\n\\t\\t\\tabout how to delete it. (The process is the same for public and private hosted zones\\n\\t\\t\\tthat were created by another service.)</p>\\n         <p>If you want to keep your domain registration but you want to stop routing internet\\n\\t\\t\\ttraffic to your website or web application, we recommend that you delete resource record\\n\\t\\t\\tsets in the hosted zone instead of deleting the hosted zone.</p>\\n         <important>\\n            <p>If you delete a hosted zone, you can't undelete it. You must create a new hosted\\n\\t\\t\\t\\tzone and update the name servers for your domain registration, which can require up\\n\\t\\t\\t\\tto 48 hours to take effect. (If you delegated responsibility for a subdomain to a\\n\\t\\t\\t\\thosted zone and you delete the child hosted zone, you must update the name servers\\n\\t\\t\\t\\tin the parent hosted zone.) In addition, if you delete a hosted zone, someone could\\n\\t\\t\\t\\thijack the domain and route traffic to their own resources using your domain\\n\\t\\t\\t\\tname.</p>\\n         </important>\\n         <p>If you want to avoid the monthly charge for the hosted zone, you can transfer DNS\\n\\t\\t\\tservice for the domain to a free DNS service. When you transfer DNS service, you have to\\n\\t\\t\\tupdate the name servers for the domain registration. If the domain is registered with\\n\\t\\t\\t\\tRoute 53, see <a href=\\\"https://docs.aws.amazon.com/Route53/latest/APIReference/API_domains_UpdateDomainNameservers.html\\\">UpdateDomainNameservers</a> for information about how to replace Route 53 name servers with name servers for the new DNS service. If the domain is\\n\\t\\t\\tregistered with another registrar, use the method provided by the registrar to update\\n\\t\\t\\tname servers for the domain registration. For more information, perform an internet\\n\\t\\t\\tsearch on \\\"free DNS service.\\\"</p>\\n         <p>You can delete a hosted zone only if it contains only the default SOA record and NS\\n\\t\\t\\tresource record sets. If the hosted zone contains other resource record sets, you must\\n\\t\\t\\tdelete them before you can delete the hosted zone. If you try to delete a hosted zone\\n\\t\\t\\tthat contains other resource record sets, the request fails, and Route 53\\n\\t\\t\\treturns a <code>HostedZoneNotEmpty</code> error. For information about deleting records\\n\\t\\t\\tfrom your hosted zone, see <a href=\\\"https://docs.aws.amazon.com/Route53/latest/APIReference/API_ChangeResourceRecordSets.html\\\">ChangeResourceRecordSets</a>.</p>\\n         <p>To verify that the hosted zone has been deleted, do one of the following:</p>\\n         <ul>\\n            <li>\\n               <p>Use the <code>GetHostedZone</code> action to request information about the\\n\\t\\t\\t\\t\\thosted zone.</p>\\n            </li>\\n            <li>\\n               <p>Use the <code>ListHostedZones</code> action to get a list of the hosted zones\\n\\t\\t\\t\\t\\tassociated with the current Amazon Web Services account.</p>\\n            </li>\\n         </ul>\",\n                \"smithy.api#http\": {\n                    \"method\": \"DELETE\",\n                    \"uri\": \"/2013-04-01/hostedzone/{Id}\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.route53#DeleteHostedZoneRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Id\": {\n                    \"target\": \"com.amazonaws.route53#ResourceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the hosted zone you want to delete.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A request to delete a hosted zone.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.route53#DeleteHostedZoneResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ChangeInfo\": {\n                    \"target\": \"com.amazonaws.route53#ChangeInfo\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A complex type that contains the ID, the status, and the date and time of a request to\\n\\t\\t\\tdelete a hosted zone.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that contains the response to a <code>DeleteHostedZone</code>\\n\\t\\t\\trequest.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.route53#DeleteKeySigningKey\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.route53#DeleteKeySigningKeyRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.route53#DeleteKeySigningKeyResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.route53#ConcurrentModification\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidInput\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidKeySigningKeyStatus\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidKMSArn\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidSigningStatus\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#NoSuchKeySigningKey\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes a key-signing key (KSK). Before you can delete a KSK, you must deactivate it.\\n\\t\\t\\tThe KSK must be deactivated before you can delete it regardless of whether the hosted\\n\\t\\t\\tzone is enabled for DNSSEC signing.</p>\\n         <p>You can use <a href=\\\"https://docs.aws.amazon.com/Route53/latest/APIReference/API_DeactivateKeySigningKey.html\\\">DeactivateKeySigningKey</a> to deactivate the key before you delete it.</p>\\n         <p>Use <a href=\\\"https://docs.aws.amazon.com/Route53/latest/APIReference/API_GetDNSSEC.html\\\">GetDNSSEC</a> to verify that the KSK is in an <code>INACTIVE</code>\\n\\t\\t\\tstatus.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"DELETE\",\n                    \"uri\": \"/2013-04-01/keysigningkey/{HostedZoneId}/{Name}\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.route53#DeleteKeySigningKeyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"HostedZoneId\": {\n                    \"target\": \"com.amazonaws.route53#ResourceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A unique string used to identify a hosted zone.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Name\": {\n                    \"target\": \"com.amazonaws.route53#SigningKeyName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A string used to identify a key-signing key (KSK).</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.route53#DeleteKeySigningKeyResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ChangeInfo\": {\n                    \"target\": \"com.amazonaws.route53#ChangeInfo\",\n                    \"traits\": {\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.route53#DeleteQueryLoggingConfig\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.route53#DeleteQueryLoggingConfigRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.route53#DeleteQueryLoggingConfigResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.route53#ConcurrentModification\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidInput\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#NoSuchQueryLoggingConfig\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes a configuration for DNS query logging. If you delete a configuration, Amazon\\n\\t\\t\\tRoute 53 stops sending query logs to CloudWatch Logs. Route 53 doesn't delete any logs\\n\\t\\t\\tthat are already in CloudWatch Logs.</p>\\n         <p>For more information about DNS query logs, see <a href=\\\"https://docs.aws.amazon.com/Route53/latest/APIReference/API_CreateQueryLoggingConfig.html\\\">CreateQueryLoggingConfig</a>.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"DELETE\",\n                    \"uri\": \"/2013-04-01/queryloggingconfig/{Id}\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.route53#DeleteQueryLoggingConfigRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Id\": {\n                    \"target\": \"com.amazonaws.route53#QueryLoggingConfigId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the configuration that you want to delete. </p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.route53#DeleteQueryLoggingConfigResponse\": {\n            \"type\": \"structure\",\n            \"members\": {},\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.route53#DeleteReusableDelegationSet\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.route53#DeleteReusableDelegationSetRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.route53#DeleteReusableDelegationSetResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.route53#DelegationSetInUse\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#DelegationSetNotReusable\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidInput\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#NoSuchDelegationSet\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes a reusable delegation set.</p>\\n         <important>\\n            <p>You can delete a reusable delegation set only if it isn't associated with any\\n\\t\\t\\t\\thosted zones.</p>\\n         </important>\\n         <p>To verify that the reusable delegation set is not associated with any hosted zones,\\n\\t\\t\\tsubmit a <a href=\\\"https://docs.aws.amazon.com/Route53/latest/APIReference/API_GetReusableDelegationSet.html\\\">GetReusableDelegationSet</a> request and specify the ID of the reusable\\n\\t\\t\\tdelegation set that you want to delete.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"DELETE\",\n                    \"uri\": \"/2013-04-01/delegationset/{Id}\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.route53#DeleteReusableDelegationSetRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Id\": {\n                    \"target\": \"com.amazonaws.route53#ResourceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the reusable delegation set that you want to delete.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A request to delete a reusable delegation set.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.route53#DeleteReusableDelegationSetResponse\": {\n            \"type\": \"structure\",\n            \"members\": {},\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>An empty element.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.route53#DeleteTrafficPolicy\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.route53#DeleteTrafficPolicyRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.route53#DeleteTrafficPolicyResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.route53#ConcurrentModification\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidInput\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#NoSuchTrafficPolicy\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#TrafficPolicyInUse\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes a traffic policy.</p>\\n         <p>When you delete a traffic policy, Route 53 sets a flag on the policy to indicate that\\n\\t\\t\\tit has been deleted. However, Route 53 never fully deletes the traffic policy. Note the\\n\\t\\t\\tfollowing:</p>\\n         <ul>\\n            <li>\\n               <p>Deleted traffic policies aren't listed if you run <a href=\\\"https://docs.aws.amazon.com/Route53/latest/APIReference/API_ListTrafficPolicies.html\\\">ListTrafficPolicies</a>.</p>\\n            </li>\\n            <li>\\n               <p> There's no way to get a list of deleted policies.</p>\\n            </li>\\n            <li>\\n               <p>If you retain the ID of the policy, you can get information about the policy,\\n\\t\\t\\t\\t\\tincluding the traffic policy document, by running <a href=\\\"https://docs.aws.amazon.com/Route53/latest/APIReference/API_GetTrafficPolicy.html\\\">GetTrafficPolicy</a>.</p>\\n            </li>\\n         </ul>\",\n                \"smithy.api#http\": {\n                    \"method\": \"DELETE\",\n                    \"uri\": \"/2013-04-01/trafficpolicy/{Id}/{Version}\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.route53#DeleteTrafficPolicyInstance\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.route53#DeleteTrafficPolicyInstanceRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.route53#DeleteTrafficPolicyInstanceResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidInput\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#NoSuchTrafficPolicyInstance\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#PriorRequestNotComplete\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes a traffic policy instance and all of the resource record sets that Amazon\\n\\t\\t\\tRoute 53 created when you created the instance.</p>\\n         <note>\\n            <p>In the Route 53 console, traffic policy instances are known as policy\\n\\t\\t\\t\\trecords.</p>\\n         </note>\",\n                \"smithy.api#http\": {\n                    \"method\": \"DELETE\",\n                    \"uri\": \"/2013-04-01/trafficpolicyinstance/{Id}\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.route53#DeleteTrafficPolicyInstanceRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Id\": {\n                    \"target\": \"com.amazonaws.route53#TrafficPolicyInstanceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the traffic policy instance that you want to delete. </p>\\n         <important>\\n            <p>When you delete a traffic policy instance, Amazon Route 53 also deletes all of the\\n\\t\\t\\t\\tresource record sets that were created when you created the traffic policy\\n\\t\\t\\t\\tinstance.</p>\\n         </important>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A request to delete a specified traffic policy instance.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.route53#DeleteTrafficPolicyInstanceResponse\": {\n            \"type\": \"structure\",\n            \"members\": {},\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>An empty element.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.route53#DeleteTrafficPolicyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Id\": {\n                    \"target\": \"com.amazonaws.route53#TrafficPolicyId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the traffic policy that you want to delete.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Version\": {\n                    \"target\": \"com.amazonaws.route53#TrafficPolicyVersion\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The version number of the traffic policy that you want to delete.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A request to delete a specified traffic policy version.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.route53#DeleteTrafficPolicyResponse\": {\n            \"type\": \"structure\",\n            \"members\": {},\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>An empty element.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.route53#DeleteVPCAssociationAuthorization\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.route53#DeleteVPCAssociationAuthorizationRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.route53#DeleteVPCAssociationAuthorizationResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.route53#ConcurrentModification\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidInput\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidVPCId\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#NoSuchHostedZone\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#VPCAssociationAuthorizationNotFound\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Removes authorization to submit an <code>AssociateVPCWithHostedZone</code> request to\\n\\t\\t\\tassociate a specified VPC with a hosted zone that was created by a different account.\\n\\t\\t\\tYou must use the account that created the hosted zone to submit a\\n\\t\\t\\t\\t<code>DeleteVPCAssociationAuthorization</code> request.</p>\\n         <important>\\n            <p>Sending this request only prevents the Amazon Web Services account that created the\\n\\t\\t\\t\\tVPC from associating the VPC with the Amazon Route 53 hosted zone in the future. If\\n\\t\\t\\t\\tthe VPC is already associated with the hosted zone,\\n\\t\\t\\t\\t\\t<code>DeleteVPCAssociationAuthorization</code> won't disassociate the VPC from\\n\\t\\t\\t\\tthe hosted zone. If you want to delete an existing association, use\\n\\t\\t\\t\\t\\t<code>DisassociateVPCFromHostedZone</code>.</p>\\n         </important>\",\n                \"smithy.api#http\": {\n                    \"method\": \"POST\",\n                    \"uri\": \"/2013-04-01/hostedzone/{HostedZoneId}/deauthorizevpcassociation\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.route53#DeleteVPCAssociationAuthorizationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"HostedZoneId\": {\n                    \"target\": \"com.amazonaws.route53#ResourceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>When removing authorization to associate a VPC that was created by one Amazon Web Services account with a hosted zone that was created with a different Amazon Web Services account, the ID of the hosted zone.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"VPC\": {\n                    \"target\": \"com.amazonaws.route53#VPC\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>When removing authorization to associate a VPC that was created by one Amazon Web Services account with a hosted zone that was created with a different Amazon Web Services account, a complex type that includes the ID and region of the\\n\\t\\t\\tVPC.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that contains information about the request to remove authorization to\\n\\t\\t\\tassociate a VPC that was created by one Amazon Web Services account with a hosted zone\\n\\t\\t\\tthat was created with a different Amazon Web Services account. </p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.route53#DeleteVPCAssociationAuthorizationResponse\": {\n            \"type\": \"structure\",\n            \"members\": {},\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Empty response for the request.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.route53#Dimension\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Name\": {\n                    \"target\": \"com.amazonaws.route53#DimensionField\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>For the metric that the CloudWatch alarm is associated with, the name of one\\n\\t\\t\\tdimension.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Value\": {\n                    \"target\": \"com.amazonaws.route53#DimensionField\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>For the metric that the CloudWatch alarm is associated with, the value of one\\n\\t\\t\\tdimension.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>For the metric that the CloudWatch alarm is associated with, a complex type that\\n\\t\\t\\tcontains information about one dimension.</p>\"\n            }\n        },\n        \"com.amazonaws.route53#DimensionField\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 255\n                }\n            }\n        },\n        \"com.amazonaws.route53#DimensionList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.route53#Dimension\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"Dimension\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 10\n                }\n            }\n        },\n        \"com.amazonaws.route53#DisableHostedZoneDNSSEC\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.route53#DisableHostedZoneDNSSECRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.route53#DisableHostedZoneDNSSECResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.route53#ConcurrentModification\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#DNSSECNotFound\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidArgument\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidInput\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidKeySigningKeyStatus\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidKMSArn\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#KeySigningKeyInParentDSRecord\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#NoSuchHostedZone\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Disables DNSSEC signing in a specific hosted zone. This action does not deactivate any\\n\\t\\t\\tkey-signing keys (KSKs) that are active in the hosted zone.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"POST\",\n                    \"uri\": \"/2013-04-01/hostedzone/{HostedZoneId}/disable-dnssec\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.route53#DisableHostedZoneDNSSECRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"HostedZoneId\": {\n                    \"target\": \"com.amazonaws.route53#ResourceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A unique string used to identify a hosted zone.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.route53#DisableHostedZoneDNSSECResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ChangeInfo\": {\n                    \"target\": \"com.amazonaws.route53#ChangeInfo\",\n                    \"traits\": {\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.route53#Disabled\": {\n            \"type\": \"boolean\"\n        },\n        \"com.amazonaws.route53#DisassociateVPCComment\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.route53#DisassociateVPCFromHostedZone\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.route53#DisassociateVPCFromHostedZoneRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.route53#DisassociateVPCFromHostedZoneResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidInput\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidVPCId\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#LastVPCAssociation\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#NoSuchHostedZone\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#VPCAssociationNotFound\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Disassociates an Amazon Virtual Private Cloud (Amazon VPC) from an Amazon Route 53\\n\\t\\t\\tprivate hosted zone. Note the following:</p>\\n         <ul>\\n            <li>\\n               <p>You can't disassociate the last Amazon VPC from a private hosted zone.</p>\\n            </li>\\n            <li>\\n               <p>You can't convert a private hosted zone into a public hosted zone.</p>\\n            </li>\\n            <li>\\n               <p>You can submit a <code>DisassociateVPCFromHostedZone</code> request using\\n\\t\\t\\t\\t\\teither the account that created the hosted zone or the account that created the\\n\\t\\t\\t\\t\\tAmazon VPC.</p>\\n            </li>\\n            <li>\\n               <p>Some services, such as Cloud Map and Amazon Elastic File System\\n\\t\\t\\t\\t\\t(Amazon EFS) automatically create hosted zones and associate VPCs with the\\n\\t\\t\\t\\t\\thosted zones. A service can create a hosted zone using your account or using its\\n\\t\\t\\t\\t\\town account. You can disassociate a VPC from a hosted zone only if the service\\n\\t\\t\\t\\t\\tcreated the hosted zone using your account.</p>\\n               <p>When you run <a href=\\\"https://docs.aws.amazon.com/Route53/latest/APIReference/API_ListHostedZonesByVPC.html\\\">DisassociateVPCFromHostedZone</a>, if the hosted zone has a value for\\n\\t\\t\\t\\t\\t\\t<code>OwningAccount</code>, you can use\\n\\t\\t\\t\\t\\t\\t<code>DisassociateVPCFromHostedZone</code>. If the hosted zone has a value\\n\\t\\t\\t\\t\\tfor <code>OwningService</code>, you can't use\\n\\t\\t\\t\\t\\t\\t<code>DisassociateVPCFromHostedZone</code>.</p>\\n            </li>\\n         </ul>\\n         <note>\\n            <p>When revoking access, the hosted zone and the Amazon VPC must belong to\\n\\t\\t\\t\\tthe same partition. A partition is a group of Amazon Web Services Regions. Each\\n\\t\\t\\t\\t\\tAmazon Web Services account is scoped to one partition.</p>\\n            <p>The following are the supported partitions:</p>\\n            <ul>\\n               <li>\\n                  <p>\\n                     <code>aws</code> - Amazon Web Services Regions</p>\\n               </li>\\n               <li>\\n                  <p>\\n                     <code>aws-cn</code> - China Regions</p>\\n               </li>\\n               <li>\\n                  <p>\\n                     <code>aws-us-gov</code> - Amazon Web Services GovCloud (US) Region</p>\\n               </li>\\n            </ul>\\n            <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html\\\">Access Management</a>\\n\\t\\t\\t\\tin the <i>Amazon Web Services General Reference</i>.</p>\\n         </note>\",\n                \"smithy.api#http\": {\n                    \"method\": \"POST\",\n                    \"uri\": \"/2013-04-01/hostedzone/{HostedZoneId}/disassociatevpc\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.route53#DisassociateVPCFromHostedZoneRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"HostedZoneId\": {\n                    \"target\": \"com.amazonaws.route53#ResourceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the private hosted zone that you want to disassociate a VPC from.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"VPC\": {\n                    \"target\": \"com.amazonaws.route53#VPC\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A complex type that contains information about the VPC that you're disassociating from\\n\\t\\t\\tthe specified hosted zone.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Comment\": {\n                    \"target\": \"com.amazonaws.route53#DisassociateVPCComment\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>\\n            <i>Optional:</i> A comment about the disassociation request.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that contains information about the VPC that you want to disassociate\\n\\t\\t\\tfrom a specified private hosted zone.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.route53#DisassociateVPCFromHostedZoneResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ChangeInfo\": {\n                    \"target\": \"com.amazonaws.route53#ChangeInfo\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A complex type that describes the changes made to the specified private hosted\\n\\t\\t\\tzone.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that contains the response information for the disassociate\\n\\t\\t\\trequest.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.route53#EnableHostedZoneDNSSEC\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.route53#EnableHostedZoneDNSSECRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.route53#EnableHostedZoneDNSSECResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.route53#ConcurrentModification\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#DNSSECNotFound\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#HostedZonePartiallyDelegated\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidArgument\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidInput\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidKeySigningKeyStatus\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidKMSArn\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#KeySigningKeyWithActiveStatusNotFound\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#NoSuchHostedZone\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Enables DNSSEC signing in a specific hosted zone.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"POST\",\n                    \"uri\": \"/2013-04-01/hostedzone/{HostedZoneId}/enable-dnssec\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.route53#EnableHostedZoneDNSSECRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"HostedZoneId\": {\n                    \"target\": \"com.amazonaws.route53#ResourceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A unique string used to identify a hosted zone.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.route53#EnableHostedZoneDNSSECResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ChangeInfo\": {\n                    \"target\": \"com.amazonaws.route53#ChangeInfo\",\n                    \"traits\": {\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.route53#EnableSNI\": {\n            \"type\": \"boolean\"\n        },\n        \"com.amazonaws.route53#ErrorMessage\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.route53#ErrorMessages\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.route53#ErrorMessage\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"Message\"\n                }\n            }\n        },\n        \"com.amazonaws.route53#EvaluationPeriods\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1\n                }\n            }\n        },\n        \"com.amazonaws.route53#FailureThreshold\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 10\n                }\n            }\n        },\n        \"com.amazonaws.route53#FullyQualifiedDomainName\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 255\n                }\n            }\n        },\n        \"com.amazonaws.route53#GeoLocation\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ContinentCode\": {\n                    \"target\": \"com.amazonaws.route53#GeoLocationContinentCode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The two-letter code for the continent.</p>\\n         <p>Amazon Route 53 supports the following continent codes:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <b>AF</b>: Africa</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>AN</b>: Antarctica</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>AS</b>: Asia</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>EU</b>: Europe</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>OC</b>: Oceania</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>NA</b>: North America</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>SA</b>: South America</p>\\n            </li>\\n         </ul>\\n         <p>Constraint: Specifying <code>ContinentCode</code> with either <code>CountryCode</code>\\n\\t\\t\\tor <code>SubdivisionCode</code> returns an <code>InvalidInput</code> error.</p>\"\n                    }\n                },\n                \"CountryCode\": {\n                    \"target\": \"com.amazonaws.route53#GeoLocationCountryCode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>For geolocation resource record sets, the two-letter code for a country.</p>\\n         <p>Amazon Route 53 uses the two-letter country codes that are specified in <a href=\\\"https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2\\\">ISO standard 3166-1\\n\\t\\t\\t\\talpha-2</a>.</p>\\n         <p>Route 53 also supports the country code <b>UA</b> for\\n\\t\\t\\tUkraine.</p>\"\n                    }\n                },\n                \"SubdivisionCode\": {\n                    \"target\": \"com.amazonaws.route53#GeoLocationSubdivisionCode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>For geolocation resource record sets, the two-letter code for a state of the United\\n\\t\\t\\tStates. Route 53 doesn't support any other values for <code>SubdivisionCode</code>. For\\n\\t\\t\\ta list of state abbreviations, see <a href=\\\"https://pe.usps.com/text/pub28/28apb.htm\\\">Appendix B: Two–Letter State and Possession Abbreviations</a> on the United\\n\\t\\t\\tStates Postal Service website. </p>\\n         <p>If you specify <code>subdivisioncode</code>, you must also specify <code>US</code> for\\n\\t\\t\\t\\t<code>CountryCode</code>. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that contains information about a geographic location.</p>\"\n            }\n        },\n        \"com.amazonaws.route53#GeoLocationContinentCode\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 2,\n                    \"max\": 2\n                }\n            }\n        },\n        \"com.amazonaws.route53#GeoLocationContinentName\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 32\n                }\n            }\n        },\n        \"com.amazonaws.route53#GeoLocationCountryCode\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 2\n                }\n            }\n        },\n        \"com.amazonaws.route53#GeoLocationCountryName\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 64\n                }\n            }\n        },\n        \"com.amazonaws.route53#GeoLocationDetails\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ContinentCode\": {\n                    \"target\": \"com.amazonaws.route53#GeoLocationContinentCode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The two-letter code for the continent.</p>\"\n                    }\n                },\n                \"ContinentName\": {\n                    \"target\": \"com.amazonaws.route53#GeoLocationContinentName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The full name of the continent.</p>\"\n                    }\n                },\n                \"CountryCode\": {\n                    \"target\": \"com.amazonaws.route53#GeoLocationCountryCode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The two-letter code for the country.</p>\"\n                    }\n                },\n                \"CountryName\": {\n                    \"target\": \"com.amazonaws.route53#GeoLocationCountryName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the country.</p>\"\n                    }\n                },\n                \"SubdivisionCode\": {\n                    \"target\": \"com.amazonaws.route53#GeoLocationSubdivisionCode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The code for the subdivision, such as a particular state within the United States. For\\n\\t\\t\\ta list of US state abbreviations, see <a href=\\\"https://pe.usps.com/text/pub28/28apb.htm\\\">Appendix B: Two–Letter State and\\n\\t\\t\\t\\tPossession Abbreviations</a> on the United States Postal Service website. For a\\n\\t\\t\\tlist of all supported subdivision codes, use the <a href=\\\"https://docs.aws.amazon.com/Route53/latest/APIReference/API_ListGeoLocations.html\\\">ListGeoLocations</a>\\n\\t\\t\\tAPI.</p>\"\n                    }\n                },\n                \"SubdivisionName\": {\n                    \"target\": \"com.amazonaws.route53#GeoLocationSubdivisionName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The full name of the subdivision. Route 53 currently supports only states in the\\n\\t\\t\\tUnited States.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that contains the codes and full continent, country, and subdivision\\n\\t\\t\\tnames for the specified <code>geolocation</code> code.</p>\"\n            }\n        },\n        \"com.amazonaws.route53#GeoLocationDetailsList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.route53#GeoLocationDetails\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"GeoLocationDetails\"\n                }\n            }\n        },\n        \"com.amazonaws.route53#GeoLocationSubdivisionCode\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 3\n                }\n            }\n        },\n        \"com.amazonaws.route53#GeoLocationSubdivisionName\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 64\n                }\n            }\n        },\n        \"com.amazonaws.route53#GeoProximityLocation\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AWSRegion\": {\n                    \"target\": \"com.amazonaws.route53#AWSRegion\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The Amazon Web Services Region the resource you are directing DNS traffic to, is in. </p>\"\n                    }\n                },\n                \"LocalZoneGroup\": {\n                    \"target\": \"com.amazonaws.route53#LocalZoneGroup\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>\\n\\t\\t\\tSpecifies an Amazon Web Services Local Zone Group.\\n\\t\\t</p>\\n         <p>A local Zone Group is usually the Local Zone code without the ending character. For example, \\n\\t\\t\\tif the Local Zone is <code>us-east-1-bue-1a</code> the Local Zone Group is <code>us-east-1-bue-1</code>.</p>\\n         <p>You can identify the Local Zones Group for a specific Local Zone by using the <a href=\\\"https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-availability-zones.html\\\">describe-availability-zones</a> CLI command:</p>\\n         <p>This command returns: <code>\\\"GroupName\\\": \\\"us-west-2-den-1\\\"</code>, specifying that the Local Zone <code>us-west-2-den-1a</code> \\n\\t\\t\\tbelongs to the Local Zone Group <code>us-west-2-den-1</code>.</p>\"\n                    }\n                },\n                \"Coordinates\": {\n                    \"target\": \"com.amazonaws.route53#Coordinates\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> Contains the longitude and latitude for a geographic region. </p>\"\n                    }\n                },\n                \"Bias\": {\n                    \"target\": \"com.amazonaws.route53#Bias\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>\\n\\t\\t\\tThe bias increases or decreases the size of the geographic region from which Route 53 routes traffic to a resource.\\n\\t\\t</p>\\n         <p>To use <code>Bias</code> to change the size of the geographic region, specify the \\n\\t\\t\\tapplicable value for the bias:</p>\\n         <ul>\\n            <li>\\n               <p>To expand the size of the geographic region from which Route 53 routes traffic to a resource, specify a \\n\\t\\t\\t\\tpositive integer from 1 to 99 for the bias. Route 53 shrinks the size of adjacent regions. </p>\\n            </li>\\n            <li>\\n               <p>To shrink the size of the geographic region from which Route 53 routes traffic to a resource, specify a \\n\\t\\t\\t\\tnegative bias of -1 to -99. Route 53 expands the size of adjacent regions. </p>\\n            </li>\\n         </ul>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p> (Resource record sets only): A complex type that lets you specify where your resources are\\n\\t\\t\\tlocated. Only one of <code>LocalZoneGroup</code>, <code>Coordinates</code>, or\\n\\t\\t\\t\\t\\t<code>Amazon Web ServicesRegion</code> is allowed per request at a time.</p>\\n         <p>For more information about geoproximity routing, see <a href=\\\"https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/routing-policy-geoproximity.html\\\">Geoproximity routing</a> in the\\n\\t\\t\\t\\t\\t<i>Amazon Route 53 Developer Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.route53#GetAccountLimit\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.route53#GetAccountLimitRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.route53#GetAccountLimitResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidInput\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Gets the specified limit for the current account, for example, the maximum number of\\n\\t\\t\\thealth checks that you can create using the account.</p>\\n         <p>For the default limit, see <a href=\\\"https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/DNSLimitations.html\\\">Limits</a> in the\\n\\t\\t\\t\\t<i>Amazon Route 53 Developer Guide</i>. To request a higher limit,\\n\\t\\t\\t\\t<a href=\\\"https://console.aws.amazon.com/support/home#/case/create?issueType=service-limit-increase&limitType=service-code-route53\\\">open a case</a>.</p>\\n         <note>\\n            <p>You can also view account limits in Amazon Web Services Trusted Advisor. Sign in to\\n\\t\\t\\t\\tthe Amazon Web Services Management Console and open the Trusted Advisor console at <a href=\\\"https://console.aws.amazon.com/trustedadvisor\\\">https://console.aws.amazon.com/trustedadvisor/</a>. Then choose <b>Service limits</b> in the navigation pane.</p>\\n         </note>\",\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/2013-04-01/accountlimit/{Type}\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.route53#GetAccountLimitRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Type\": {\n                    \"target\": \"com.amazonaws.route53#AccountLimitType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The limit that you want to get. Valid values include the following:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <b>MAX_HEALTH_CHECKS_BY_OWNER</b>: The maximum\\n\\t\\t\\t\\t\\tnumber of health checks that you can create using the current account.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>MAX_HOSTED_ZONES_BY_OWNER</b>: The maximum number\\n\\t\\t\\t\\t\\tof hosted zones that you can create using the current account.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>MAX_REUSABLE_DELEGATION_SETS_BY_OWNER</b>: The\\n\\t\\t\\t\\t\\tmaximum number of reusable delegation sets that you can create using the current\\n\\t\\t\\t\\t\\taccount.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>MAX_TRAFFIC_POLICIES_BY_OWNER</b>: The maximum\\n\\t\\t\\t\\t\\tnumber of traffic policies that you can create using the current account.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>MAX_TRAFFIC_POLICY_INSTANCES_BY_OWNER</b>: The\\n\\t\\t\\t\\t\\tmaximum number of traffic policy instances that you can create using the current\\n\\t\\t\\t\\t\\taccount. (Traffic policy instances are referred to as traffic flow policy\\n\\t\\t\\t\\t\\trecords in the Amazon Route 53 console.)</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that contains information about the request to create a hosted\\n\\t\\t\\tzone.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.route53#GetAccountLimitResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Limit\": {\n                    \"target\": \"com.amazonaws.route53#AccountLimit\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The current setting for the specified limit. For example, if you specified\\n\\t\\t\\t\\t<code>MAX_HEALTH_CHECKS_BY_OWNER</code> for the value of <code>Type</code> in the\\n\\t\\t\\trequest, the value of <code>Limit</code> is the maximum number of health checks that you\\n\\t\\t\\tcan create using the current account.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Count\": {\n                    \"target\": \"com.amazonaws.route53#UsageCount\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The current number of entities that you have created of the specified type. For\\n\\t\\t\\texample, if you specified <code>MAX_HEALTH_CHECKS_BY_OWNER</code> for the value of\\n\\t\\t\\t\\t<code>Type</code> in the request, the value of <code>Count</code> is the current\\n\\t\\t\\tnumber of health checks that you have created using the current account.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that contains the requested limit. </p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.route53#GetChange\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.route53#GetChangeRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.route53#GetChangeResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidInput\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#NoSuchChange\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns the current status of a change batch request. The status is one of the\\n\\t\\t\\tfollowing values:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>PENDING</code> indicates that the changes in this request have not\\n\\t\\t\\t\\t\\tpropagated to all Amazon Route 53 DNS servers managing the hosted zone. This is the initial status of all\\n\\t\\t\\t\\t\\tchange batch requests.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>INSYNC</code> indicates that the changes have propagated to all Route 53\\n\\t\\t\\t\\t\\tDNS servers managing the hosted zone. </p>\\n            </li>\\n         </ul>\",\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/2013-04-01/change/{Id}\",\n                    \"code\": 200\n                },\n                \"smithy.waiters#waitable\": {\n                    \"ResourceRecordSetsChanged\": {\n                        \"acceptors\": [\n                            {\n                                \"state\": \"success\",\n                                \"matcher\": {\n                                    \"output\": {\n                                        \"path\": \"ChangeInfo.Status\",\n                                        \"expected\": \"INSYNC\",\n                                        \"comparator\": \"stringEquals\"\n                                    }\n                                }\n                            }\n                        ],\n                        \"minDelay\": 30\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.route53#GetChangeRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Id\": {\n                    \"target\": \"com.amazonaws.route53#ChangeId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the change batch request. The value that you specify here is the value that\\n\\t\\t\\t\\t<code>ChangeResourceRecordSets</code> returned in the <code>Id</code> element when\\n\\t\\t\\tyou submitted the request.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The input for a GetChange request.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.route53#GetChangeResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ChangeInfo\": {\n                    \"target\": \"com.amazonaws.route53#ChangeInfo\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A complex type that contains information about the specified change batch.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that contains the <code>ChangeInfo</code> element.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.route53#GetCheckerIpRanges\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.route53#GetCheckerIpRangesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.route53#GetCheckerIpRangesResponse\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Route 53 does not perform authorization for this API because it retrieves information\\n\\t\\t\\tthat is already available to the public.</p>\\n         <important>\\n            <p>\\n               <code>GetCheckerIpRanges</code> still works, but we recommend that you download\\n\\t\\t\\t\\tip-ranges.json, which includes IP address ranges for all Amazon Web Services\\n\\t\\t\\t\\tservices. For more information, see <a href=\\\"https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/route-53-ip-addresses.html\\\">IP Address Ranges\\n\\t\\t\\t\\t\\tof Amazon Route 53 Servers</a> in the <i>Amazon Route 53 Developer\\n\\t\\t\\t\\t\\tGuide</i>.</p>\\n         </important>\",\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/2013-04-01/checkeripranges\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.route53#GetCheckerIpRangesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {},\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Empty request.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.route53#GetCheckerIpRangesResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CheckerIpRanges\": {\n                    \"target\": \"com.amazonaws.route53#CheckerIpRanges\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A complex type that contains sorted list of IP ranges in CIDR format for Amazon Route\\n\\t\\t\\t53 health checkers.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that contains the <code>CheckerIpRanges</code> element.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.route53#GetDNSSEC\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.route53#GetDNSSECRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.route53#GetDNSSECResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidArgument\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidInput\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#NoSuchHostedZone\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns information about DNSSEC for a specific hosted zone, including the key-signing\\n\\t\\t\\tkeys (KSKs) in the hosted zone.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/2013-04-01/hostedzone/{HostedZoneId}/dnssec\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.route53#GetDNSSECRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"HostedZoneId\": {\n                    \"target\": \"com.amazonaws.route53#ResourceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A unique string used to identify a hosted zone.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.route53#GetDNSSECResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Status\": {\n                    \"target\": \"com.amazonaws.route53#DNSSECStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A string representing the status of DNSSEC.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"KeySigningKeys\": {\n                    \"target\": \"com.amazonaws.route53#KeySigningKeys\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The key-signing keys (KSKs) in your account.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.route53#GetGeoLocation\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.route53#GetGeoLocationRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.route53#GetGeoLocationResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidInput\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#NoSuchGeoLocation\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Gets information about whether a specified geographic location is supported for Amazon\\n\\t\\t\\tRoute 53 geolocation resource record sets.</p>\\n         <p>Route 53 does not perform authorization for this API because it retrieves information\\n\\t\\t\\tthat is already available to the public.</p>\\n         <p>Use the following syntax to determine whether a continent is supported for\\n\\t\\t\\tgeolocation:</p>\\n         <p>\\n            <code>GET /2013-04-01/geolocation?continentcode=<i>two-letter abbreviation for\\n\\t\\t\\t\\t\\ta continent</i>\\n            </code>\\n         </p>\\n         <p>Use the following syntax to determine whether a country is supported for\\n\\t\\t\\tgeolocation:</p>\\n         <p>\\n            <code>GET /2013-04-01/geolocation?countrycode=<i>two-character country\\n\\t\\t\\t\\t\\tcode</i>\\n            </code>\\n         </p>\\n         <p>Use the following syntax to determine whether a subdivision of a country is supported\\n\\t\\t\\tfor geolocation:</p>\\n         <p>\\n            <code>GET /2013-04-01/geolocation?countrycode=<i>two-character country\\n\\t\\t\\t\\t\\tcode</i>&subdivisioncode=<i>subdivision\\n\\t\\t\\tcode</i>\\n            </code>\\n         </p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/2013-04-01/geolocation\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.route53#GetGeoLocationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ContinentCode\": {\n                    \"target\": \"com.amazonaws.route53#GeoLocationContinentCode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>For geolocation resource record sets, a two-letter abbreviation that identifies a\\n\\t\\t\\tcontinent. Amazon Route 53 supports the following continent codes:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <b>AF</b>: Africa</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>AN</b>: Antarctica</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>AS</b>: Asia</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>EU</b>: Europe</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>OC</b>: Oceania</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>NA</b>: North America</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>SA</b>: South America</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#httpQuery\": \"continentcode\"\n                    }\n                },\n                \"CountryCode\": {\n                    \"target\": \"com.amazonaws.route53#GeoLocationCountryCode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Amazon Route 53 uses the two-letter country codes that are specified in <a href=\\\"https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2\\\">ISO standard 3166-1\\n\\t\\t\\t\\talpha-2</a>.</p>\\n         <p>Route 53 also supports the country code <b>UA</b> for\\n\\t\\t\\tUkraine.</p>\",\n                        \"smithy.api#httpQuery\": \"countrycode\"\n                    }\n                },\n                \"SubdivisionCode\": {\n                    \"target\": \"com.amazonaws.route53#GeoLocationSubdivisionCode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The code for the subdivision, such as a particular state within the United States. For\\n\\t\\t\\ta list of US state abbreviations, see <a href=\\\"https://pe.usps.com/text/pub28/28apb.htm\\\">Appendix B: Two–Letter State and\\n\\t\\t\\t\\tPossession Abbreviations</a> on the United States Postal Service website. For a\\n\\t\\t\\tlist of all supported subdivision codes, use the <a href=\\\"https://docs.aws.amazon.com/Route53/latest/APIReference/API_ListGeoLocations.html\\\">ListGeoLocations</a>\\n\\t\\t\\tAPI.</p>\",\n                        \"smithy.api#httpQuery\": \"subdivisioncode\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A request for information about whether a specified geographic location is supported\\n\\t\\t\\tfor Amazon Route 53 geolocation resource record sets.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.route53#GetGeoLocationResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"GeoLocationDetails\": {\n                    \"target\": \"com.amazonaws.route53#GeoLocationDetails\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A complex type that contains the codes and full continent, country, and subdivision\\n\\t\\t\\tnames for the specified geolocation code.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that contains the response information for the specified geolocation\\n\\t\\t\\tcode.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.route53#GetHealthCheck\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.route53#GetHealthCheckRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.route53#GetHealthCheckResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.route53#IncompatibleVersion\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidInput\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#NoSuchHealthCheck\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Gets information about a specified health check.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/2013-04-01/healthcheck/{HealthCheckId}\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.route53#GetHealthCheckCount\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.route53#GetHealthCheckCountRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.route53#GetHealthCheckCountResponse\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Retrieves the number of health checks that are associated with the current Amazon Web Services account.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/2013-04-01/healthcheckcount\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.route53#GetHealthCheckCountRequest\": {\n            \"type\": \"structure\",\n            \"members\": {},\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A request for the number of health checks that are associated with the current Amazon Web Services account.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.route53#GetHealthCheckCountResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"HealthCheckCount\": {\n                    \"target\": \"com.amazonaws.route53#HealthCheckCount\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of health checks associated with the current Amazon Web Services account.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that contains the response to a <code>GetHealthCheckCount</code>\\n\\t\\t\\trequest.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.route53#GetHealthCheckLastFailureReason\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.route53#GetHealthCheckLastFailureReasonRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.route53#GetHealthCheckLastFailureReasonResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidInput\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#NoSuchHealthCheck\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Gets the reason that a specified health check failed most recently.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/2013-04-01/healthcheck/{HealthCheckId}/lastfailurereason\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.route53#GetHealthCheckLastFailureReasonRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"HealthCheckId\": {\n                    \"target\": \"com.amazonaws.route53#HealthCheckId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID for the health check for which you want the last failure reason. When you\\n\\t\\t\\tcreated the health check, <code>CreateHealthCheck</code> returned the ID in the\\n\\t\\t\\tresponse, in the <code>HealthCheckId</code> element.</p>\\n         <note>\\n            <p>If you want to get the last failure reason for a calculated health check, you must\\n\\t\\t\\t\\tuse the Amazon Route 53 console or the CloudWatch console. You can't use\\n\\t\\t\\t\\t\\t<code>GetHealthCheckLastFailureReason</code> for a calculated health\\n\\t\\t\\t\\tcheck.</p>\\n         </note>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A request for the reason that a health check failed most recently.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.route53#GetHealthCheckLastFailureReasonResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"HealthCheckObservations\": {\n                    \"target\": \"com.amazonaws.route53#HealthCheckObservations\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list that contains one <code>Observation</code> element for each Amazon Route 53\\n\\t\\t\\thealth checker that is reporting a last failure reason. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that contains the response to a\\n\\t\\t\\t\\t<code>GetHealthCheckLastFailureReason</code> request.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.route53#GetHealthCheckRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"HealthCheckId\": {\n                    \"target\": \"com.amazonaws.route53#HealthCheckId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The identifier that Amazon Route 53 assigned to the health check when you created it.\\n\\t\\t\\tWhen you add or update a resource record set, you use this value to specify which health\\n\\t\\t\\tcheck to use. The value can be up to 64 characters long.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A request to get information about a specified health check. </p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.route53#GetHealthCheckResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"HealthCheck\": {\n                    \"target\": \"com.amazonaws.route53#HealthCheck\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A complex type that contains information about one health check that is associated\\n\\t\\t\\twith the current Amazon Web Services account.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that contains the response to a <code>GetHealthCheck</code>\\n\\t\\t\\trequest.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.route53#GetHealthCheckStatus\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.route53#GetHealthCheckStatusRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.route53#GetHealthCheckStatusResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidInput\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#NoSuchHealthCheck\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Gets status of a specified health check. </p>\\n         <important>\\n            <p>This API is intended for use during development to diagnose behavior. It doesn’t\\n\\t\\t\\t\\tsupport production use-cases with high query rates that require immediate and\\n\\t\\t\\t\\tactionable responses.</p>\\n         </important>\",\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/2013-04-01/healthcheck/{HealthCheckId}/status\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.route53#GetHealthCheckStatusRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"HealthCheckId\": {\n                    \"target\": \"com.amazonaws.route53#HealthCheckId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID for the health check that you want the current status for. When you created the\\n\\t\\t\\thealth check, <code>CreateHealthCheck</code> returned the ID in the response, in the\\n\\t\\t\\t\\t<code>HealthCheckId</code> element.</p>\\n         <note>\\n            <p>If you want to check the status of a calculated health check, you must use the\\n\\t\\t\\t\\tAmazon Route 53 console or the CloudWatch console. You can't use\\n\\t\\t\\t\\t\\t<code>GetHealthCheckStatus</code> to get the status of a calculated health\\n\\t\\t\\t\\tcheck.</p>\\n         </note>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A request to get the status for a health check.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.route53#GetHealthCheckStatusResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"HealthCheckObservations\": {\n                    \"target\": \"com.amazonaws.route53#HealthCheckObservations\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list that contains one <code>HealthCheckObservation</code> element for each Amazon\\n\\t\\t\\tRoute 53 health checker that is reporting a status about the health check\\n\\t\\t\\tendpoint.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that contains the response to a <code>GetHealthCheck</code>\\n\\t\\t\\trequest.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.route53#GetHostedZone\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.route53#GetHostedZoneRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.route53#GetHostedZoneResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidInput\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#NoSuchHostedZone\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Gets information about a specified hosted zone including the four name servers\\n\\t\\t\\tassigned to the hosted zone.</p>\\n         <p>\\n            <code></code> returns the VPCs associated with the specified hosted zone and does not reflect the VPC\\n\\t\\t\\tassociations by Route 53 Profiles. To get the associations to a Profile, call the <a href=\\\"https://docs.aws.amazon.com/Route53/latest/APIReference/API_route53profiles_ListProfileAssociations.html\\\">ListProfileAssociations</a> API.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To get information about a hosted zone\",\n                        \"documentation\": \"The following example gets information about the Z3M3LMPEXAMPLE hosted zone.\",\n                        \"input\": {\n                            \"Id\": \"Z3M3LMPEXAMPLE\"\n                        },\n                        \"output\": {\n                            \"HostedZone\": {\n                                \"ResourceRecordSetCount\": 8,\n                                \"CallerReference\": \"C741617D-04E4-F8DE-B9D7-0D150FC61C2E\",\n                                \"Config\": {\n                                    \"PrivateZone\": false\n                                },\n                                \"Id\": \"/hostedzone/Z3M3LMPEXAMPLE\",\n                                \"Name\": \"myawsbucket.com.\"\n                            },\n                            \"DelegationSet\": {\n                                \"NameServers\": [\n                                    \"ns-2048.awsdns-64.com\",\n                                    \"ns-2049.awsdns-65.net\",\n                                    \"ns-2050.awsdns-66.org\",\n                                    \"ns-2051.awsdns-67.co.uk\"\n                                ]\n                            }\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/2013-04-01/hostedzone/{Id}\",\n                    \"code\": 200\n                },\n                \"smithy.test#smokeTests\": [\n                    {\n                        \"id\": \"GetHostedZoneFailure\",\n                        \"params\": {\n                            \"Id\": \"fake-zone\"\n                        },\n                        \"vendorParams\": {\n                            \"region\": \"us-east-1\"\n                        },\n                        \"vendorParamsShape\": \"aws.test#AwsVendorParams\",\n                        \"expect\": {\n                            \"failure\": {}\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.route53#GetHostedZoneCount\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.route53#GetHostedZoneCountRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.route53#GetHostedZoneCountResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidInput\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Retrieves the number of hosted zones that are associated with the current Amazon Web Services account.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/2013-04-01/hostedzonecount\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.route53#GetHostedZoneCountRequest\": {\n            \"type\": \"structure\",\n            \"members\": {},\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A request to retrieve a count of all the hosted zones that are associated with the\\n\\t\\t\\tcurrent Amazon Web Services account.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.route53#GetHostedZoneCountResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"HostedZoneCount\": {\n                    \"target\": \"com.amazonaws.route53#HostedZoneCount\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The total number of public and private hosted zones that are associated with the\\n\\t\\t\\tcurrent Amazon Web Services account.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that contains the response to a <code>GetHostedZoneCount</code>\\n\\t\\t\\trequest.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.route53#GetHostedZoneLimit\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.route53#GetHostedZoneLimitRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.route53#GetHostedZoneLimitResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.route53#HostedZoneNotPrivate\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidInput\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#NoSuchHostedZone\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Gets the specified limit for a specified hosted zone, for example, the maximum number\\n\\t\\t\\tof records that you can create in the hosted zone. </p>\\n         <p>For the default limit, see <a href=\\\"https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/DNSLimitations.html\\\">Limits</a> in the\\n\\t\\t\\t\\t<i>Amazon Route 53 Developer Guide</i>. To request a higher limit,\\n\\t\\t\\t\\t<a href=\\\"https://console.aws.amazon.com/support/home#/case/create?issueType=service-limit-increase&limitType=service-code-route53\\\">open a case</a>.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/2013-04-01/hostedzonelimit/{HostedZoneId}/{Type}\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.route53#GetHostedZoneLimitRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Type\": {\n                    \"target\": \"com.amazonaws.route53#HostedZoneLimitType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The limit that you want to get. Valid values include the following:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <b>MAX_RRSETS_BY_ZONE</b>: The maximum number of\\n\\t\\t\\t\\t\\trecords that you can create in the specified hosted zone.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>MAX_VPCS_ASSOCIATED_BY_ZONE</b>: The maximum\\n\\t\\t\\t\\t\\tnumber of Amazon VPCs that you can associate with the specified private hosted\\n\\t\\t\\t\\t\\tzone.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"HostedZoneId\": {\n                    \"target\": \"com.amazonaws.route53#ResourceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the hosted zone that you want to get a limit for.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that contains information about the request to create a hosted\\n\\t\\t\\tzone.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.route53#GetHostedZoneLimitResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Limit\": {\n                    \"target\": \"com.amazonaws.route53#HostedZoneLimit\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The current setting for the specified limit. For example, if you specified\\n\\t\\t\\t\\t<code>MAX_RRSETS_BY_ZONE</code> for the value of <code>Type</code> in the request,\\n\\t\\t\\tthe value of <code>Limit</code> is the maximum number of records that you can create in\\n\\t\\t\\tthe specified hosted zone.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Count\": {\n                    \"target\": \"com.amazonaws.route53#UsageCount\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The current number of entities that you have created of the specified type. For\\n\\t\\t\\texample, if you specified <code>MAX_RRSETS_BY_ZONE</code> for the value of\\n\\t\\t\\t\\t<code>Type</code> in the request, the value of <code>Count</code> is the current\\n\\t\\t\\tnumber of records that you have created in the specified hosted zone.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that contains the requested limit. </p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.route53#GetHostedZoneRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Id\": {\n                    \"target\": \"com.amazonaws.route53#ResourceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the hosted zone that you want to get information about.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A request to get information about a specified hosted zone. </p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.route53#GetHostedZoneResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"HostedZone\": {\n                    \"target\": \"com.amazonaws.route53#HostedZone\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A complex type that contains general information about the specified hosted\\n\\t\\t\\tzone.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DelegationSet\": {\n                    \"target\": \"com.amazonaws.route53#DelegationSet\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A complex type that lists the Amazon Route 53 name servers for the specified hosted\\n\\t\\t\\tzone.</p>\"\n                    }\n                },\n                \"VPCs\": {\n                    \"target\": \"com.amazonaws.route53#VPCs\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A complex type that contains information about the VPCs that are associated with the\\n\\t\\t\\tspecified hosted zone.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that contain the response to a <code>GetHostedZone</code>\\n\\t\\t\\trequest.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.route53#GetQueryLoggingConfig\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.route53#GetQueryLoggingConfigRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.route53#GetQueryLoggingConfigResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidInput\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#NoSuchQueryLoggingConfig\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Gets information about a specified configuration for DNS query logging.</p>\\n         <p>For more information about DNS query logs, see <a href=\\\"https://docs.aws.amazon.com/Route53/latest/APIReference/API_CreateQueryLoggingConfig.html\\\">CreateQueryLoggingConfig</a> and <a href=\\\"https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/query-logs.html\\\">Logging DNS\\n\\t\\t\\tQueries</a>.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/2013-04-01/queryloggingconfig/{Id}\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.route53#GetQueryLoggingConfigRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Id\": {\n                    \"target\": \"com.amazonaws.route53#QueryLoggingConfigId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the configuration for DNS query logging that you want to get information\\n\\t\\t\\tabout.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.route53#GetQueryLoggingConfigResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"QueryLoggingConfig\": {\n                    \"target\": \"com.amazonaws.route53#QueryLoggingConfig\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A complex type that contains information about the query logging configuration that\\n\\t\\t\\tyou specified in a <a href=\\\"https://docs.aws.amazon.com/Route53/latest/APIReference/API_GetQueryLoggingConfig.html\\\">GetQueryLoggingConfig</a> request.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.route53#GetReusableDelegationSet\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.route53#GetReusableDelegationSetRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.route53#GetReusableDelegationSetResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.route53#DelegationSetNotReusable\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidInput\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#NoSuchDelegationSet\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Retrieves information about a specified reusable delegation set, including the four\\n\\t\\t\\tname servers that are assigned to the delegation set.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/2013-04-01/delegationset/{Id}\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.route53#GetReusableDelegationSetLimit\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.route53#GetReusableDelegationSetLimitRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.route53#GetReusableDelegationSetLimitResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidInput\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#NoSuchDelegationSet\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Gets the maximum number of hosted zones that you can associate with the specified\\n\\t\\t\\treusable delegation set.</p>\\n         <p>For the default limit, see <a href=\\\"https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/DNSLimitations.html\\\">Limits</a> in the\\n\\t\\t\\t\\t<i>Amazon Route 53 Developer Guide</i>. To request a higher limit,\\n\\t\\t\\t\\t<a href=\\\"https://console.aws.amazon.com/support/home#/case/create?issueType=service-limit-increase&limitType=service-code-route53\\\">open a case</a>.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/2013-04-01/reusabledelegationsetlimit/{DelegationSetId}/{Type}\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.route53#GetReusableDelegationSetLimitRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Type\": {\n                    \"target\": \"com.amazonaws.route53#ReusableDelegationSetLimitType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify <code>MAX_ZONES_BY_REUSABLE_DELEGATION_SET</code> to get the maximum number of\\n\\t\\t\\thosted zones that you can associate with the specified reusable delegation set.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DelegationSetId\": {\n                    \"target\": \"com.amazonaws.route53#ResourceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the delegation set that you want to get the limit for.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that contains information about the request to create a hosted\\n\\t\\t\\tzone.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.route53#GetReusableDelegationSetLimitResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Limit\": {\n                    \"target\": \"com.amazonaws.route53#ReusableDelegationSetLimit\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The current setting for the limit on hosted zones that you can associate with the\\n\\t\\t\\tspecified reusable delegation set.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Count\": {\n                    \"target\": \"com.amazonaws.route53#UsageCount\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The current number of hosted zones that you can associate with the specified reusable\\n\\t\\t\\tdelegation set.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that contains the requested limit. </p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.route53#GetReusableDelegationSetRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Id\": {\n                    \"target\": \"com.amazonaws.route53#ResourceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the reusable delegation set that you want to get a list of name servers\\n\\t\\t\\tfor.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A request to get information about a specified reusable delegation set.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.route53#GetReusableDelegationSetResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DelegationSet\": {\n                    \"target\": \"com.amazonaws.route53#DelegationSet\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A complex type that contains information about the reusable delegation set.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that contains the response to the <code>GetReusableDelegationSet</code>\\n\\t\\t\\trequest.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.route53#GetTrafficPolicy\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.route53#GetTrafficPolicyRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.route53#GetTrafficPolicyResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidInput\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#NoSuchTrafficPolicy\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Gets information about a specific traffic policy version.</p>\\n         <p>For information about how of deleting a traffic policy affects the response from\\n\\t\\t\\t\\t<code>GetTrafficPolicy</code>, see <a href=\\\"https://docs.aws.amazon.com/Route53/latest/APIReference/API_DeleteTrafficPolicy.html\\\">DeleteTrafficPolicy</a>. </p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/2013-04-01/trafficpolicy/{Id}/{Version}\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.route53#GetTrafficPolicyInstance\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.route53#GetTrafficPolicyInstanceRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.route53#GetTrafficPolicyInstanceResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidInput\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#NoSuchTrafficPolicyInstance\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Gets information about a specified traffic policy instance.</p>\\n         <note>\\n            <p>\\n\\t\\t\\t\\tUse <code>GetTrafficPolicyInstance</code> with the <code>id</code> of new traffic policy instance to confirm that the \\n\\t\\t\\t\\t<code>CreateTrafficPolicyInstance</code> or an <code>UpdateTrafficPolicyInstance</code> request completed successfully. \\n\\t\\t\\t\\tFor more information, see the <code>State</code> response\\n\\t\\t\\t\\telement.</p>\\n         </note>\\n         <note>\\n            <p>In the Route 53 console, traffic policy instances are known as policy\\n\\t\\t\\t\\trecords.</p>\\n         </note>\",\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/2013-04-01/trafficpolicyinstance/{Id}\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.route53#GetTrafficPolicyInstanceCount\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.route53#GetTrafficPolicyInstanceCountRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.route53#GetTrafficPolicyInstanceCountResponse\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Gets the number of traffic policy instances that are associated with the current\\n\\t\\t\\t\\tAmazon Web Services account.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/2013-04-01/trafficpolicyinstancecount\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.route53#GetTrafficPolicyInstanceCountRequest\": {\n            \"type\": \"structure\",\n            \"members\": {},\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Request to get the number of traffic policy instances that are associated with the\\n\\t\\t\\tcurrent Amazon Web Services account.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.route53#GetTrafficPolicyInstanceCountResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TrafficPolicyInstanceCount\": {\n                    \"target\": \"com.amazonaws.route53#TrafficPolicyInstanceCount\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of traffic policy instances that are associated with the current Amazon Web Services account.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that contains information about the resource record sets that Amazon\\n\\t\\t\\tRoute 53 created based on a specified traffic policy.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.route53#GetTrafficPolicyInstanceRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Id\": {\n                    \"target\": \"com.amazonaws.route53#TrafficPolicyInstanceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the traffic policy instance that you want to get information about.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Gets information about a specified traffic policy instance.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.route53#GetTrafficPolicyInstanceResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TrafficPolicyInstance\": {\n                    \"target\": \"com.amazonaws.route53#TrafficPolicyInstance\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A complex type that contains settings for the traffic policy instance.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that contains information about the resource record sets that Amazon\\n\\t\\t\\tRoute 53 created based on a specified traffic policy.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.route53#GetTrafficPolicyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Id\": {\n                    \"target\": \"com.amazonaws.route53#TrafficPolicyId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the traffic policy that you want to get information about.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Version\": {\n                    \"target\": \"com.amazonaws.route53#TrafficPolicyVersion\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The version number of the traffic policy that you want to get information\\n\\t\\t\\tabout.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Gets information about a specific traffic policy version.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.route53#GetTrafficPolicyResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TrafficPolicy\": {\n                    \"target\": \"com.amazonaws.route53#TrafficPolicy\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A complex type that contains settings for the specified traffic policy.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that contains the response information for the request.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.route53#HealthCheck\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Id\": {\n                    \"target\": \"com.amazonaws.route53#HealthCheckId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The identifier that Amazon Route 53 assigned to the health check when you created it.\\n\\t\\t\\tWhen you add or update a resource record set, you use this value to specify which health\\n\\t\\t\\tcheck to use. The value can be up to 64 characters long. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"CallerReference\": {\n                    \"target\": \"com.amazonaws.route53#HealthCheckNonce\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A unique string that you specified when you created the health check.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"LinkedService\": {\n                    \"target\": \"com.amazonaws.route53#LinkedService\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If the health check was created by another service, the service that created the\\n\\t\\t\\thealth check. When a health check is created by another service, you can't edit or\\n\\t\\t\\tdelete it using Amazon Route 53. </p>\"\n                    }\n                },\n                \"HealthCheckConfig\": {\n                    \"target\": \"com.amazonaws.route53#HealthCheckConfig\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A complex type that contains detailed information about one health check.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"HealthCheckVersion\": {\n                    \"target\": \"com.amazonaws.route53#HealthCheckVersion\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The version of the health check. You can optionally pass this value in a call to\\n\\t\\t\\t\\t<code>UpdateHealthCheck</code> to prevent overwriting another change to the health\\n\\t\\t\\tcheck.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"CloudWatchAlarmConfiguration\": {\n                    \"target\": \"com.amazonaws.route53#CloudWatchAlarmConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A complex type that contains information about the CloudWatch alarm that Amazon Route\\n\\t\\t\\t53 is monitoring for this health check.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that contains information about one health check that is associated\\n\\t\\t\\twith the current Amazon Web Services account.</p>\"\n            }\n        },\n        \"com.amazonaws.route53#HealthCheckAlreadyExists\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.route53#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p> The health check you're attempting to create already exists. Amazon Route 53 returns\\n\\t\\t\\tthis error when you submit a request that has the following values:</p>\\n         <ul>\\n            <li>\\n               <p>The same value for <code>CallerReference</code> as an existing health check,\\n\\t\\t\\t\\t\\tand one or more values that differ from the existing health check that has the\\n\\t\\t\\t\\t\\tsame caller reference.</p>\\n            </li>\\n            <li>\\n               <p>The same value for <code>CallerReference</code> as a health check that you\\n\\t\\t\\t\\t\\tcreated and later deleted, regardless of the other settings in the\\n\\t\\t\\t\\t\\trequest.</p>\\n            </li>\\n         </ul>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 409\n            }\n        },\n        \"com.amazonaws.route53#HealthCheckConfig\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"IPAddress\": {\n                    \"target\": \"com.amazonaws.route53#IPAddress\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IPv4 or IPv6 IP address of the endpoint that you want Amazon Route 53 to perform\\n\\t\\t\\thealth checks on. If you don't specify a value for <code>IPAddress</code>, Route 53\\n\\t\\t\\tsends a DNS request to resolve the domain name that you specify in\\n\\t\\t\\t\\t<code>FullyQualifiedDomainName</code> at the interval that you specify in\\n\\t\\t\\t\\t<code>RequestInterval</code>. Using an IP address returned by DNS, Route 53 then\\n\\t\\t\\tchecks the health of the endpoint.</p>\\n         <p>Use one of the following formats for the value of <code>IPAddress</code>: </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <b>IPv4 address</b>: four values between 0 and 255,\\n\\t\\t\\t\\t\\tseparated by periods (.), for example, <code>192.0.2.44</code>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>IPv6 address</b>: eight groups of four\\n\\t\\t\\t\\t\\thexadecimal values, separated by colons (:), for example,\\n\\t\\t\\t\\t\\t\\t<code>2001:0db8:85a3:0000:0000:abcd:0001:2345</code>. You can also shorten\\n\\t\\t\\t\\t\\tIPv6 addresses as described in RFC 5952, for example,\\n\\t\\t\\t\\t\\t\\t<code>2001:db8:85a3::abcd:1:2345</code>.</p>\\n            </li>\\n         </ul>\\n         <p>If the endpoint is an EC2 instance, we recommend that you create an Elastic IP\\n\\t\\t\\taddress, associate it with your EC2 instance, and specify the Elastic IP address for\\n\\t\\t\\t\\t<code>IPAddress</code>. This ensures that the IP address of your instance will never\\n\\t\\t\\tchange.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/Route53/latest/APIReference/API_UpdateHealthCheck.html#Route53-UpdateHealthCheck-request-FullyQualifiedDomainName\\\">FullyQualifiedDomainName</a>. </p>\\n         <p>Constraints: Route 53 can't check the health of endpoints for which the IP address is\\n\\t\\t\\tin local, private, non-routable, or multicast ranges. For more information about IP\\n\\t\\t\\taddresses for which you can't create health checks, see the following documents:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://tools.ietf.org/html/rfc5735\\\">RFC 5735, Special Use IPv4\\n\\t\\t\\t\\t\\t\\tAddresses</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://tools.ietf.org/html/rfc6598\\\">RFC 6598, IANA-Reserved IPv4\\n\\t\\t\\t\\t\\t\\tPrefix for Shared Address Space</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://tools.ietf.org/html/rfc5156\\\">RFC 5156, Special-Use IPv6\\n\\t\\t\\t\\t\\t\\tAddresses</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>When the value of <code>Type</code> is <code>CALCULATED</code> or\\n\\t\\t\\t\\t<code>CLOUDWATCH_METRIC</code>, omit <code>IPAddress</code>.</p>\"\n                    }\n                },\n                \"Port\": {\n                    \"target\": \"com.amazonaws.route53#Port\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The port on the endpoint that you want Amazon Route 53 to perform health checks\\n\\t\\t\\ton.</p>\\n         <note>\\n            <p>Don't specify a value for <code>Port</code> when you specify a value for\\n\\t\\t\\t\\t\\t<code>Type</code> of <code>CLOUDWATCH_METRIC</code> or\\n\\t\\t\\t\\t<code>CALCULATED</code>.</p>\\n         </note>\"\n                    }\n                },\n                \"Type\": {\n                    \"target\": \"com.amazonaws.route53#HealthCheckType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of health check that you want to create, which indicates how Amazon Route 53\\n\\t\\t\\tdetermines whether an endpoint is healthy.</p>\\n         <important>\\n            <p>You can't change the value of <code>Type</code> after you create a health\\n\\t\\t\\t\\tcheck.</p>\\n         </important>\\n         <p>You can create the following types of health checks:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <b>HTTP</b>: Route 53 tries to establish a TCP\\n\\t\\t\\t\\t\\tconnection. If successful, Route 53 submits an HTTP request and waits for an\\n\\t\\t\\t\\t\\tHTTP status code of 200 or greater and less than 400.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>HTTPS</b>: Route 53 tries to establish a TCP\\n\\t\\t\\t\\t\\tconnection. If successful, Route 53 submits an HTTPS request and waits for an\\n\\t\\t\\t\\t\\tHTTP status code of 200 or greater and less than 400.</p>\\n               <important>\\n                  <p>If you specify <code>HTTPS</code> for the value of <code>Type</code>, the endpoint must\\n\\t\\t\\t\\t\\t\\tsupport TLS v1.0, v1.1, or v1.2.</p>\\n               </important>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>HTTP_STR_MATCH</b>: Route 53 tries to establish a\\n\\t\\t\\t\\t\\tTCP connection. If successful, Route 53 submits an HTTP request and searches the\\n\\t\\t\\t\\t\\tfirst 5,120 bytes of the response body for the string that you specify in\\n\\t\\t\\t\\t\\t\\t<code>SearchString</code>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>HTTPS_STR_MATCH</b>: Route 53 tries to establish\\n\\t\\t\\t\\t\\ta TCP connection. If successful, Route 53 submits an <code>HTTPS</code> request\\n\\t\\t\\t\\t\\tand searches the first 5,120 bytes of the response body for the string that you\\n\\t\\t\\t\\t\\tspecify in <code>SearchString</code>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>TCP</b>: Route 53 tries to establish a TCP\\n\\t\\t\\t\\t\\tconnection.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>CLOUDWATCH_METRIC</b>: The health check is\\n\\t\\t\\t\\t\\tassociated with a CloudWatch alarm. If the state of the alarm is\\n\\t\\t\\t\\t\\t<code>OK</code>, the health check is considered healthy. If the state is\\n\\t\\t\\t\\t\\t\\t<code>ALARM</code>, the health check is considered unhealthy. If CloudWatch\\n\\t\\t\\t\\t\\tdoesn't have sufficient data to determine whether the state is <code>OK</code>\\n\\t\\t\\t\\t\\tor <code>ALARM</code>, the health check status depends on the setting for\\n\\t\\t\\t\\t\\t\\t<code>InsufficientDataHealthStatus</code>: <code>Healthy</code>,\\n\\t\\t\\t\\t\\t\\t<code>Unhealthy</code>, or <code>LastKnownStatus</code>. </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>CALCULATED</b>: For health checks that monitor\\n\\t\\t\\t\\t\\tthe status of other health checks, Route 53 adds up the number of health checks\\n\\t\\t\\t\\t\\tthat Route 53 health checkers consider to be healthy and compares that number\\n\\t\\t\\t\\t\\twith the value of <code>HealthThreshold</code>. </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>RECOVERY_CONTROL</b>: The health check is associated with a\\n\\t\\t\\t\\t\\tRoute53 Application Recovery Controller routing control. If the routing control\\n\\t\\t\\t\\t\\tstate is <code>ON</code>, the health check is considered healthy. If the state\\n\\t\\t\\t\\t\\tis <code>OFF</code>, the health check is considered unhealthy. </p>\\n            </li>\\n         </ul>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/dns-failover-determining-health-of-endpoints.html\\\">How Route 53 Determines Whether an Endpoint Is Healthy</a> in the\\n\\t\\t\\t\\t<i>Amazon Route 53 Developer Guide</i>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ResourcePath\": {\n                    \"target\": \"com.amazonaws.route53#ResourcePath\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The path, if any, that you want Amazon Route 53 to request when performing health\\n\\t\\t\\tchecks. The path can be any value for which your endpoint will return an HTTP status\\n\\t\\t\\tcode of 2xx or 3xx when the endpoint is healthy, for example, the file\\n\\t\\t\\t/docs/route53-health-check.html. You can also include query string parameters, for\\n\\t\\t\\texample, <code>/welcome.html?language=jp&login=y</code>. </p>\"\n                    }\n                },\n                \"FullyQualifiedDomainName\": {\n                    \"target\": \"com.amazonaws.route53#FullyQualifiedDomainName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Amazon Route 53 behavior depends on whether you specify a value for\\n\\t\\t\\t\\t<code>IPAddress</code>.</p>\\n         <p>\\n            <b>If you specify a value for</b>\\n            <code>IPAddress</code>:</p>\\n         <p>Amazon Route 53 sends health check requests to the specified IPv4 or IPv6 address and\\n\\t\\t\\tpasses the value of <code>FullyQualifiedDomainName</code> in the <code>Host</code>\\n\\t\\t\\theader for all health checks except TCP health checks. This is typically the fully\\n\\t\\t\\tqualified DNS name of the endpoint on which you want Route 53 to perform health\\n\\t\\t\\tchecks.</p>\\n         <p>When Route 53 checks the health of an endpoint, here is how it constructs the\\n\\t\\t\\t\\t<code>Host</code> header:</p>\\n         <ul>\\n            <li>\\n               <p>If you specify a value of <code>80</code> for <code>Port</code> and\\n\\t\\t\\t\\t\\t\\t<code>HTTP</code> or <code>HTTP_STR_MATCH</code> for <code>Type</code>,\\n\\t\\t\\t\\t\\tRoute 53 passes the value of <code>FullyQualifiedDomainName</code> to the\\n\\t\\t\\t\\t\\tendpoint in the Host header. </p>\\n            </li>\\n            <li>\\n               <p>If you specify a value of <code>443</code> for <code>Port</code> and\\n\\t\\t\\t\\t\\t\\t<code>HTTPS</code> or <code>HTTPS_STR_MATCH</code> for <code>Type</code>,\\n\\t\\t\\t\\t\\tRoute 53 passes the value of <code>FullyQualifiedDomainName</code> to the\\n\\t\\t\\t\\t\\tendpoint in the <code>Host</code> header.</p>\\n            </li>\\n            <li>\\n               <p>If you specify another value for <code>Port</code> and any value except\\n\\t\\t\\t\\t\\t\\t<code>TCP</code> for <code>Type</code>, Route 53 passes\\n\\t\\t\\t\\t\\t\\t<code>FullyQualifiedDomainName:Port</code> to the endpoint in the\\n\\t\\t\\t\\t\\t\\t<code>Host</code> header.</p>\\n            </li>\\n         </ul>\\n         <p>If you don't specify a value for <code>FullyQualifiedDomainName</code>, Route 53\\n\\t\\t\\tsubstitutes the value of <code>IPAddress</code> in the <code>Host</code> header in each\\n\\t\\t\\tof the preceding cases.</p>\\n         <p>\\n            <b>If you don't specify a value for</b>\\n            <code>IPAddress</code>:</p>\\n         <p>Route 53 sends a DNS request to the domain that you specify for\\n\\t\\t\\t\\t<code>FullyQualifiedDomainName</code> at the interval that you specify for\\n\\t\\t\\t\\t<code>RequestInterval</code>. Using an IPv4 address that DNS returns, Route 53 then\\n\\t\\t\\tchecks the health of the endpoint.</p>\\n         <note>\\n            <p>If you don't specify a value for <code>IPAddress</code>, Route 53 uses only IPv4\\n\\t\\t\\t\\tto send health checks to the endpoint. If there's no resource record set with a type\\n\\t\\t\\t\\tof A for the name that you specify for <code>FullyQualifiedDomainName</code>, the\\n\\t\\t\\t\\thealth check fails with a \\\"DNS resolution failed\\\" error.</p>\\n         </note>\\n         <p>If you want to check the health of weighted, latency, or failover resource record sets\\n\\t\\t\\tand you choose to specify the endpoint only by <code>FullyQualifiedDomainName</code>, we\\n\\t\\t\\trecommend that you create a separate health check for each endpoint. For example, create\\n\\t\\t\\ta health check for each HTTP server that is serving content for www.example.com. For the\\n\\t\\t\\tvalue of <code>FullyQualifiedDomainName</code>, specify the domain name of the server\\n\\t\\t\\t(such as us-east-2-www.example.com), not the name of the resource record sets\\n\\t\\t\\t(www.example.com).</p>\\n         <important>\\n            <p>In this configuration, if you create a health check for which the value of\\n\\t\\t\\t\\t\\t<code>FullyQualifiedDomainName</code> matches the name of the resource record\\n\\t\\t\\t\\tsets and you then associate the health check with those resource record sets, health\\n\\t\\t\\t\\tcheck results will be unpredictable.</p>\\n         </important>\\n         <p>In addition, if the value that you specify for <code>Type</code> is <code>HTTP</code>,\\n\\t\\t\\t\\t<code>HTTPS</code>, <code>HTTP_STR_MATCH</code>, or <code>HTTPS_STR_MATCH</code>,\\n\\t\\t\\tRoute 53 passes the value of <code>FullyQualifiedDomainName</code> in the\\n\\t\\t\\t\\t<code>Host</code> header, as it does when you specify a value for\\n\\t\\t\\t\\t<code>IPAddress</code>. If the value of <code>Type</code> is <code>TCP</code>, Route\\n\\t\\t\\t53 doesn't pass a <code>Host</code> header.</p>\"\n                    }\n                },\n                \"SearchString\": {\n                    \"target\": \"com.amazonaws.route53#SearchString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If the value of Type is <code>HTTP_STR_MATCH</code> or <code>HTTPS_STR_MATCH</code>,\\n\\t\\t\\tthe string that you want Amazon Route 53 to search for in the response body from the\\n\\t\\t\\tspecified resource. If the string appears in the response body, Route 53 considers the\\n\\t\\t\\tresource healthy.</p>\\n         <p>Route 53 considers case when searching for <code>SearchString</code> in the response\\n\\t\\t\\tbody. </p>\"\n                    }\n                },\n                \"RequestInterval\": {\n                    \"target\": \"com.amazonaws.route53#RequestInterval\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of seconds between the time that Amazon Route 53 gets a response from your\\n\\t\\t\\tendpoint and the time that it sends the next health check request. Each Route 53 health\\n\\t\\t\\tchecker makes requests at this interval.</p>\\n         <important>\\n            <p>You can't change the value of <code>RequestInterval</code> after you create a\\n\\t\\t\\t\\thealth check.</p>\\n         </important>\\n         <p>If you don't specify a value for <code>RequestInterval</code>, the default value is\\n\\t\\t\\t\\t<code>30</code> seconds.</p>\"\n                    }\n                },\n                \"FailureThreshold\": {\n                    \"target\": \"com.amazonaws.route53#FailureThreshold\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of consecutive health checks that an endpoint must pass or fail for Amazon\\n\\t\\t\\tRoute 53 to change the current status of the endpoint from unhealthy to healthy or vice\\n\\t\\t\\tversa. For more information, see <a href=\\\"https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/dns-failover-determining-health-of-endpoints.html\\\">How Amazon Route 53 Determines Whether an Endpoint Is Healthy</a> in the\\n\\t\\t\\t\\t<i>Amazon Route 53 Developer Guide</i>.</p>\\n         <p>If you don't specify a value for <code>FailureThreshold</code>, the default value is\\n\\t\\t\\tthree health checks.</p>\"\n                    }\n                },\n                \"MeasureLatency\": {\n                    \"target\": \"com.amazonaws.route53#MeasureLatency\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify whether you want Amazon Route 53 to measure the latency between health\\n\\t\\t\\tcheckers in multiple Amazon Web Services regions and your endpoint, and to display\\n\\t\\t\\tCloudWatch latency graphs on the <b>Health Checks</b> page in\\n\\t\\t\\tthe Route 53 console.</p>\\n         <important>\\n            <p>You can't change the value of <code>MeasureLatency</code> after you create a\\n\\t\\t\\t\\thealth check.</p>\\n         </important>\"\n                    }\n                },\n                \"Inverted\": {\n                    \"target\": \"com.amazonaws.route53#Inverted\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify whether you want Amazon Route 53 to invert the status of a health check, for\\n\\t\\t\\texample, to consider a health check unhealthy when it otherwise would be considered\\n\\t\\t\\thealthy.</p>\"\n                    }\n                },\n                \"Disabled\": {\n                    \"target\": \"com.amazonaws.route53#Disabled\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Stops Route 53 from performing health checks. When you disable a health check, here's\\n\\t\\t\\twhat happens:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <b>Health checks that check the health of\\n\\t\\t\\t\\t\\t\\tendpoints:</b> Route 53 stops submitting requests to your\\n\\t\\t\\t\\t\\tapplication, server, or other resource.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>Calculated health checks:</b> Route 53 stops\\n\\t\\t\\t\\t\\taggregating the status of the referenced health checks.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>Health checks that monitor CloudWatch alarms:</b>\\n\\t\\t\\t\\t\\tRoute 53 stops monitoring the corresponding CloudWatch metrics.</p>\\n            </li>\\n         </ul>\\n         <p>After you disable a health check, Route 53 considers the status of the health check to\\n\\t\\t\\talways be healthy. If you configured DNS failover, Route 53 continues to route traffic\\n\\t\\t\\tto the corresponding resources. If you want to stop routing traffic to a resource,\\n\\t\\t\\tchange the value of <a href=\\\"https://docs.aws.amazon.com/Route53/latest/APIReference/API_UpdateHealthCheck.html#Route53-UpdateHealthCheck-request-Inverted\\\">Inverted</a>. </p>\\n         <p>Charges for a health check still apply when the health check is disabled. For more\\n\\t\\t\\tinformation, see <a href=\\\"http://aws.amazon.com/route53/pricing/\\\">Amazon Route 53\\n\\t\\t\\t\\tPricing</a>.</p>\"\n                    }\n                },\n                \"HealthThreshold\": {\n                    \"target\": \"com.amazonaws.route53#HealthThreshold\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of child health checks that are associated with a <code>CALCULATED</code>\\n\\t\\t\\thealth check that Amazon Route 53 must consider healthy for the <code>CALCULATED</code>\\n\\t\\t\\thealth check to be considered healthy. To specify the child health checks that you want\\n\\t\\t\\tto associate with a <code>CALCULATED</code> health check, use the <a href=\\\"https://docs.aws.amazon.com/Route53/latest/APIReference/API_UpdateHealthCheck.html#Route53-UpdateHealthCheck-request-ChildHealthChecks\\\">ChildHealthChecks</a> element.</p>\\n         <p>Note the following:</p>\\n         <ul>\\n            <li>\\n               <p>If you specify a number greater than the number of child health checks, Route\\n\\t\\t\\t\\t\\t53 always considers this health check to be unhealthy.</p>\\n            </li>\\n            <li>\\n               <p>If you specify <code>0</code>, Route 53 always considers this health check to\\n\\t\\t\\t\\t\\tbe healthy.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"ChildHealthChecks\": {\n                    \"target\": \"com.amazonaws.route53#ChildHealthCheckList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>(CALCULATED Health Checks Only) A complex type that contains one\\n\\t\\t\\t\\t<code>ChildHealthCheck</code> element for each health check that you want to\\n\\t\\t\\tassociate with a <code>CALCULATED</code> health check.</p>\"\n                    }\n                },\n                \"EnableSNI\": {\n                    \"target\": \"com.amazonaws.route53#EnableSNI\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify whether you want Amazon Route 53 to send the value of\\n\\t\\t\\t\\t<code>FullyQualifiedDomainName</code> to the endpoint in the\\n\\t\\t\\t\\t<code>client_hello</code> message during TLS negotiation. This allows the endpoint\\n\\t\\t\\tto respond to <code>HTTPS</code> health check requests with the applicable SSL/TLS\\n\\t\\t\\tcertificate.</p>\\n         <p>Some endpoints require that <code>HTTPS</code> requests include the host name in the\\n\\t\\t\\t\\t<code>client_hello</code> message. If you don't enable SNI, the status of the health\\n\\t\\t\\tcheck will be <code>SSL alert handshake_failure</code>. A health check can also have\\n\\t\\t\\tthat status for other reasons. If SNI is enabled and you're still getting the error,\\n\\t\\t\\tcheck the SSL/TLS configuration on your endpoint and confirm that your certificate is\\n\\t\\t\\tvalid.</p>\\n         <p>The SSL/TLS certificate on your endpoint includes a domain name in the <code>Common\\n\\t\\t\\t\\tName</code> field and possibly several more in the <code>Subject Alternative\\n\\t\\t\\t\\tNames</code> field. One of the domain names in the certificate should match the\\n\\t\\t\\tvalue that you specify for <code>FullyQualifiedDomainName</code>. If the endpoint\\n\\t\\t\\tresponds to the <code>client_hello</code> message with a certificate that does not\\n\\t\\t\\tinclude the domain name that you specified in <code>FullyQualifiedDomainName</code>, a\\n\\t\\t\\thealth checker will retry the handshake. In the second attempt, the health checker will\\n\\t\\t\\tomit <code>FullyQualifiedDomainName</code> from the <code>client_hello</code>\\n\\t\\t\\tmessage.</p>\"\n                    }\n                },\n                \"Regions\": {\n                    \"target\": \"com.amazonaws.route53#HealthCheckRegionList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A complex type that contains one <code>Region</code> element for each region from\\n\\t\\t\\twhich you want Amazon Route 53 health checkers to check the specified endpoint.</p>\\n         <p>If you don't specify any regions, Route 53 health checkers automatically performs\\n\\t\\t\\tchecks from all of the regions that are listed under <b>Valid\\n\\t\\t\\t\\tValues</b>.</p>\\n         <p>If you update a health check to remove a region that has been performing health\\n\\t\\t\\tchecks, Route 53 will briefly continue to perform checks from that region to ensure that\\n\\t\\t\\tsome health checkers are always checking the endpoint (for example, if you replace three\\n\\t\\t\\tregions with four different regions). </p>\"\n                    }\n                },\n                \"AlarmIdentifier\": {\n                    \"target\": \"com.amazonaws.route53#AlarmIdentifier\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A complex type that identifies the CloudWatch alarm that you want Amazon Route 53\\n\\t\\t\\thealth checkers to use to determine whether the specified health check is\\n\\t\\t\\thealthy.</p>\"\n                    }\n                },\n                \"InsufficientDataHealthStatus\": {\n                    \"target\": \"com.amazonaws.route53#InsufficientDataHealthStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>When CloudWatch has insufficient data about the metric to determine the alarm state,\\n\\t\\t\\tthe status that you want Amazon Route 53 to assign to the health check:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>Healthy</code>: Route 53 considers the health check to be\\n\\t\\t\\t\\t\\thealthy.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>Unhealthy</code>: Route 53 considers the health check to be\\n\\t\\t\\t\\t\\tunhealthy.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>LastKnownStatus</code>: Route 53 uses the status of the health check\\n\\t\\t\\t\\t\\tfrom the last time that CloudWatch had sufficient data to determine the alarm\\n\\t\\t\\t\\t\\tstate. For new health checks that have no last known status, the default status\\n\\t\\t\\t\\t\\tfor the health check is healthy.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"RoutingControlArn\": {\n                    \"target\": \"com.amazonaws.route53#RoutingControlArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) for the Route 53 Application Recovery Controller\\n\\t\\t\\trouting control.</p>\\n         <p>For more information about Route 53 Application Recovery Controller, see <a href=\\\"https://docs.aws.amazon.com/r53recovery/latest/dg/what-is-route-53-recovery.html\\\">Route 53 Application Recovery Controller Developer Guide.</a>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that contains information about the health check.</p>\"\n            }\n        },\n        \"com.amazonaws.route53#HealthCheckCount\": {\n            \"type\": \"long\"\n        },\n        \"com.amazonaws.route53#HealthCheckId\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 64\n                }\n            }\n        },\n        \"com.amazonaws.route53#HealthCheckInUse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.route53#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#deprecated\": {},\n                \"smithy.api#documentation\": \"<p>This error code is not in use.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.route53#HealthCheckNonce\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 64\n                }\n            }\n        },\n        \"com.amazonaws.route53#HealthCheckObservation\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Region\": {\n                    \"target\": \"com.amazonaws.route53#HealthCheckRegion\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The region of the Amazon Route 53 health checker that provided the status in\\n\\t\\t\\t\\t<code>StatusReport</code>.</p>\"\n                    }\n                },\n                \"IPAddress\": {\n                    \"target\": \"com.amazonaws.route53#IPAddress\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IP address of the Amazon Route 53 health checker that provided the failure reason\\n\\t\\t\\tin <code>StatusReport</code>.</p>\"\n                    }\n                },\n                \"StatusReport\": {\n                    \"target\": \"com.amazonaws.route53#StatusReport\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A complex type that contains the last failure reason as reported by one Amazon Route\\n\\t\\t\\t53 health checker and the time of the failed health check.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that contains the last failure reason as reported by one Amazon Route\\n\\t\\t\\t53 health checker.</p>\"\n            }\n        },\n        \"com.amazonaws.route53#HealthCheckObservations\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.route53#HealthCheckObservation\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"HealthCheckObservation\"\n                }\n            }\n        },\n        \"com.amazonaws.route53#HealthCheckRegion\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"us_east_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"us-east-1\"\n                    }\n                },\n                \"us_west_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"us-west-1\"\n                    }\n                },\n                \"us_west_2\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"us-west-2\"\n                    }\n                },\n                \"eu_west_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"eu-west-1\"\n                    }\n                },\n                \"ap_southeast_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ap-southeast-1\"\n                    }\n                },\n                \"ap_southeast_2\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ap-southeast-2\"\n                    }\n                },\n                \"ap_northeast_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ap-northeast-1\"\n                    }\n                },\n                \"sa_east_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"sa-east-1\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 64\n                }\n            }\n        },\n        \"com.amazonaws.route53#HealthCheckRegionList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.route53#HealthCheckRegion\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"Region\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 3,\n                    \"max\": 64\n                }\n            }\n        },\n        \"com.amazonaws.route53#HealthCheckType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"HTTP\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"HTTP\"\n                    }\n                },\n                \"HTTPS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"HTTPS\"\n                    }\n                },\n                \"HTTP_STR_MATCH\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"HTTP_STR_MATCH\"\n                    }\n                },\n                \"HTTPS_STR_MATCH\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"HTTPS_STR_MATCH\"\n                    }\n                },\n                \"TCP\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"TCP\"\n                    }\n                },\n                \"CALCULATED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"CALCULATED\"\n                    }\n                },\n                \"CLOUDWATCH_METRIC\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"CLOUDWATCH_METRIC\"\n                    }\n                },\n                \"RECOVERY_CONTROL\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"RECOVERY_CONTROL\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.route53#HealthCheckVersion\": {\n            \"type\": \"long\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1\n                }\n            }\n        },\n        \"com.amazonaws.route53#HealthCheckVersionMismatch\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.route53#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The value of <code>HealthCheckVersion</code> in the request doesn't match the value of\\n\\t\\t\\t\\t<code>HealthCheckVersion</code> in the health check.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 409\n            }\n        },\n        \"com.amazonaws.route53#HealthChecks\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.route53#HealthCheck\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"HealthCheck\"\n                }\n            }\n        },\n        \"com.amazonaws.route53#HealthThreshold\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 0,\n                    \"max\": 256\n                }\n            }\n        },\n        \"com.amazonaws.route53#HostedZone\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Id\": {\n                    \"target\": \"com.amazonaws.route53#ResourceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID that Amazon Route 53 assigned to the hosted zone when you created it.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Name\": {\n                    \"target\": \"com.amazonaws.route53#DNSName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the domain. For public hosted zones, this is the name that you have\\n\\t\\t\\tregistered with your DNS registrar.</p>\\n         <p>For information about how to specify characters other than <code>a-z</code>,\\n\\t\\t\\t\\t<code>0-9</code>, and <code>-</code> (hyphen) and how to specify internationalized\\n\\t\\t\\tdomain names, see <a href=\\\"https://docs.aws.amazon.com/Route53/latest/APIReference/API_CreateHostedZone.html\\\">CreateHostedZone</a>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"CallerReference\": {\n                    \"target\": \"com.amazonaws.route53#Nonce\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The value that you specified for <code>CallerReference</code> when you created the\\n\\t\\t\\thosted zone.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Config\": {\n                    \"target\": \"com.amazonaws.route53#HostedZoneConfig\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A complex type that includes the <code>Comment</code> and <code>PrivateZone</code>\\n\\t\\t\\telements. If you omitted the <code>HostedZoneConfig</code> and <code>Comment</code>\\n\\t\\t\\telements from the request, the <code>Config</code> and <code>Comment</code> elements\\n\\t\\t\\tdon't appear in the response.</p>\"\n                    }\n                },\n                \"ResourceRecordSetCount\": {\n                    \"target\": \"com.amazonaws.route53#HostedZoneRRSetCount\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of resource record sets in the hosted zone.</p>\"\n                    }\n                },\n                \"LinkedService\": {\n                    \"target\": \"com.amazonaws.route53#LinkedService\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If the hosted zone was created by another service, the service that created the hosted\\n\\t\\t\\tzone. When a hosted zone is created by another service, you can't edit or delete it\\n\\t\\t\\tusing Route 53. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that contains general information about the hosted zone.</p>\"\n            }\n        },\n        \"com.amazonaws.route53#HostedZoneAlreadyExists\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.route53#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The hosted zone you're trying to create already exists. Amazon Route 53 returns this\\n\\t\\t\\terror when a hosted zone has already been created with the specified\\n\\t\\t\\t\\t<code>CallerReference</code>.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 409\n            }\n        },\n        \"com.amazonaws.route53#HostedZoneConfig\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Comment\": {\n                    \"target\": \"com.amazonaws.route53#ResourceDescription\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Any comments that you want to include about the hosted zone.</p>\"\n                    }\n                },\n                \"PrivateZone\": {\n                    \"target\": \"com.amazonaws.route53#IsPrivateZone\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>A value that indicates whether this is a private hosted zone.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that contains an optional comment about your hosted zone. If you don't\\n\\t\\t\\twant to specify a comment, omit both the <code>HostedZoneConfig</code> and\\n\\t\\t\\t\\t<code>Comment</code> elements.</p>\"\n            }\n        },\n        \"com.amazonaws.route53#HostedZoneCount\": {\n            \"type\": \"long\"\n        },\n        \"com.amazonaws.route53#HostedZoneLimit\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Type\": {\n                    \"target\": \"com.amazonaws.route53#HostedZoneLimitType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The limit that you requested. Valid values include the following:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <b>MAX_RRSETS_BY_ZONE</b>: The maximum number of\\n\\t\\t\\t\\t\\trecords that you can create in the specified hosted zone.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>MAX_VPCS_ASSOCIATED_BY_ZONE</b>: The maximum\\n\\t\\t\\t\\t\\tnumber of Amazon VPCs that you can associate with the specified private hosted\\n\\t\\t\\t\\t\\tzone.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Value\": {\n                    \"target\": \"com.amazonaws.route53#LimitValue\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The current value for the limit that is specified by <code>Type</code>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that contains the type of limit that you specified in the request and\\n\\t\\t\\tthe current value for that limit.</p>\"\n            }\n        },\n        \"com.amazonaws.route53#HostedZoneLimitType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"MAX_RRSETS_BY_ZONE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"MAX_RRSETS_BY_ZONE\"\n                    }\n                },\n                \"MAX_VPCS_ASSOCIATED_BY_ZONE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"MAX_VPCS_ASSOCIATED_BY_ZONE\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.route53#HostedZoneNotEmpty\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.route53#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The hosted zone contains resource records that are not SOA or NS records.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.route53#HostedZoneNotFound\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.route53#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The specified HostedZone can't be found.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.route53#HostedZoneNotPrivate\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.route53#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The specified hosted zone is a public hosted zone, not a private hosted zone.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.route53#HostedZoneOwner\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"OwningAccount\": {\n                    \"target\": \"com.amazonaws.route53#AWSAccountID\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If the hosted zone was created by an Amazon Web Services account, or was created by an\\n\\t\\t\\t\\tAmazon Web Services service that creates hosted zones using the current account,\\n\\t\\t\\t\\t<code>OwningAccount</code> contains the account ID of that account. For example,\\n\\t\\t\\twhen you use Cloud Map to create a hosted zone, Cloud Map creates the hosted\\n\\t\\t\\tzone using the current Amazon Web Services account. </p>\"\n                    }\n                },\n                \"OwningService\": {\n                    \"target\": \"com.amazonaws.route53#HostedZoneOwningService\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If an Amazon Web Services service uses its own account to create a hosted zone and\\n\\t\\t\\tassociate the specified VPC with that hosted zone, <code>OwningService</code> contains\\n\\t\\t\\tan abbreviation that identifies the service. For example, if Amazon Elastic File System\\n\\t\\t\\t(Amazon EFS) created a hosted zone and associated a VPC with the hosted zone, the value\\n\\t\\t\\tof <code>OwningService</code> is <code>efs.amazonaws.com</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that identifies a hosted zone that a specified Amazon VPC is associated\\n\\t\\t\\twith and the owner of the hosted zone. If there is a value for\\n\\t\\t\\t\\t<code>OwningAccount</code>, there is no value for <code>OwningService</code>, and\\n\\t\\t\\tvice versa. </p>\"\n            }\n        },\n        \"com.amazonaws.route53#HostedZoneOwningService\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 128\n                }\n            }\n        },\n        \"com.amazonaws.route53#HostedZonePartiallyDelegated\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.route53#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The hosted zone nameservers don't match the parent nameservers. The hosted zone and\\n\\t\\t\\tparent must have the same nameservers.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.route53#HostedZoneRRSetCount\": {\n            \"type\": \"long\"\n        },\n        \"com.amazonaws.route53#HostedZoneSummaries\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.route53#HostedZoneSummary\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"HostedZoneSummary\"\n                }\n            }\n        },\n        \"com.amazonaws.route53#HostedZoneSummary\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"HostedZoneId\": {\n                    \"target\": \"com.amazonaws.route53#ResourceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Route 53 hosted zone ID of a private hosted zone that the specified VPC is\\n\\t\\t\\tassociated with.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Name\": {\n                    \"target\": \"com.amazonaws.route53#DNSName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the private hosted zone, such as <code>example.com</code>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Owner\": {\n                    \"target\": \"com.amazonaws.route53#HostedZoneOwner\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The owner of a private hosted zone that the specified VPC is associated with. The\\n\\t\\t\\towner can be either an Amazon Web Services account or an Amazon Web Services\\n\\t\\t\\tservice.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>In the response to a <code>ListHostedZonesByVPC</code> request, the\\n\\t\\t\\t\\t<code>HostedZoneSummaries</code> element contains one <code>HostedZoneSummary</code>\\n\\t\\t\\telement for each hosted zone that the specified Amazon VPC is associated with. Each\\n\\t\\t\\t\\t<code>HostedZoneSummary</code> element contains the hosted zone name and ID, and\\n\\t\\t\\tinformation about who owns the hosted zone.</p>\"\n            }\n        },\n        \"com.amazonaws.route53#HostedZoneType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"PRIVATE_HOSTED_ZONE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"PrivateHostedZone\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.route53#HostedZones\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.route53#HostedZone\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"HostedZone\"\n                }\n            }\n        },\n        \"com.amazonaws.route53#IPAddress\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 45\n                },\n                \"smithy.api#pattern\": \"^(^((([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\\\\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))$|^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$)$\"\n            }\n        },\n        \"com.amazonaws.route53#IPAddressCidr\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.route53#IncompatibleVersion\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.route53#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The resource you're trying to access is unsupported on this Amazon Route 53\\n\\t\\t\\tendpoint.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.route53#InsufficientCloudWatchLogsResourcePolicy\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.route53#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Amazon Route 53 doesn't have the permissions required to create log streams and send\\n\\t\\t\\tquery logs to log streams. Possible causes include the following:</p>\\n         <ul>\\n            <li>\\n               <p>There is no resource policy that specifies the log group ARN in the value for\\n\\t\\t\\t\\t\\t\\t<code>Resource</code>.</p>\\n            </li>\\n            <li>\\n               <p>The resource policy that includes the log group ARN in the value for\\n\\t\\t\\t\\t\\t\\t<code>Resource</code> doesn't have the necessary permissions.</p>\\n            </li>\\n            <li>\\n               <p>The resource policy hasn't finished propagating yet.</p>\\n            </li>\\n            <li>\\n               <p>The Key management service (KMS) key you specified doesn’t exist or it can’t\\n\\t\\t\\t\\t\\tbe used with the log group associated with query log. Update or provide a\\n\\t\\t\\t\\t\\tresource policy to grant permissions for the KMS key.</p>\\n            </li>\\n            <li>\\n               <p>The Key management service (KMS) key you specified is marked as \\n\\t\\t\\t\\tdisabled for the log group associated with query log. Update or provide \\n\\t\\t\\t\\ta resource policy to grant permissions for the KMS key.</p>\\n            </li>\\n         </ul>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.route53#InsufficientDataHealthStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"Healthy\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Healthy\"\n                    }\n                },\n                \"Unhealthy\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Unhealthy\"\n                    }\n                },\n                \"LastKnownStatus\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"LastKnownStatus\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.route53#InvalidArgument\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.route53#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Parameter name is not valid.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.route53#InvalidChangeBatch\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"messages\": {\n                    \"target\": \"com.amazonaws.route53#ErrorMessages\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                },\n                \"message\": {\n                    \"target\": \"com.amazonaws.route53#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This exception contains a list of messages that might contain one or more error\\n\\t\\t\\tmessages. Each error message indicates one error in the change batch.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.route53#InvalidDomainName\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.route53#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The specified domain name is not valid.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.route53#InvalidInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.route53#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The input is not valid.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.route53#InvalidKMSArn\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.route53#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The KeyManagementServiceArn that you specified isn't valid to use with DNSSEC\\n\\t\\t\\tsigning.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.route53#InvalidKeySigningKeyName\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.route53#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The key-signing key (KSK) name that you specified isn't a valid name.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.route53#InvalidKeySigningKeyStatus\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.route53#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The key-signing key (KSK) status isn't valid or another KSK has the status\\n\\t\\t\\t\\t<code>INTERNAL_FAILURE</code>.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.route53#InvalidPaginationToken\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.route53#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The value that you specified to get the second or subsequent page of results is\\n\\t\\t\\tinvalid.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.route53#InvalidSigningStatus\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.route53#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Your hosted zone status isn't valid for this operation. In the hosted zone, change the\\n\\t\\t\\tstatus to enable <code>DNSSEC</code> or disable <code>DNSSEC</code>.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.route53#InvalidTrafficPolicyDocument\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.route53#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The format of the traffic policy document that you specified in the\\n\\t\\t\\t\\t<code>Document</code> element is not valid.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.route53#InvalidVPCId\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.route53#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The VPC ID that you specified either isn't a valid ID or the current account is not\\n\\t\\t\\tauthorized to access this VPC.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.route53#Inverted\": {\n            \"type\": \"boolean\"\n        },\n        \"com.amazonaws.route53#IsPrivateZone\": {\n            \"type\": \"boolean\",\n            \"traits\": {\n                \"smithy.api#default\": false\n            }\n        },\n        \"com.amazonaws.route53#KeySigningKey\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Name\": {\n                    \"target\": \"com.amazonaws.route53#SigningKeyName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A string used to identify a key-signing key (KSK). <code>Name</code> can include\\n\\t\\t\\tnumbers, letters, and underscores (_). <code>Name</code> must be unique for each\\n\\t\\t\\tkey-signing key in the same hosted zone.</p>\"\n                    }\n                },\n                \"KmsArn\": {\n                    \"target\": \"com.amazonaws.route53#SigningKeyString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon resource name (ARN) used to identify the customer managed key in Key Management Service (KMS). The <code>KmsArn</code> must be unique for each\\n\\t\\t\\tkey-signing key (KSK) in a single hosted zone.</p>\\n         <p>You must configure the customer managed key as follows:</p>\\n         <dl>\\n            <dt>Status</dt>\\n            <dd>\\n               <p>Enabled</p>\\n            </dd>\\n            <dt>Key spec</dt>\\n            <dd>\\n               <p>ECC_NIST_P256</p>\\n            </dd>\\n            <dt>Key usage</dt>\\n            <dd>\\n               <p>Sign and verify</p>\\n            </dd>\\n            <dt>Key policy</dt>\\n            <dd>\\n               <p>The key policy must give permission for the following actions:</p>\\n               <ul>\\n                  <li>\\n                     <p>DescribeKey</p>\\n                  </li>\\n                  <li>\\n                     <p>GetPublicKey</p>\\n                  </li>\\n                  <li>\\n                     <p>Sign</p>\\n                  </li>\\n               </ul>\\n               <p>The key policy must also include the Amazon Route 53 service in the\\n\\t\\t\\t\\t\\t\\tprincipal for your account. Specify the following:</p>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <code>\\\"Service\\\": \\\"dnssec-route53.amazonaws.com\\\"</code>\\n                     </p>\\n                  </li>\\n               </ul>\\n            </dd>\\n         </dl>\\n         <p>For more information about working with the customer managed key in KMS, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html\\\">Key Management Service\\n\\t\\t\\t\\tconcepts</a>.</p>\"\n                    }\n                },\n                \"Flag\": {\n                    \"target\": \"com.amazonaws.route53#SigningKeyInteger\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>An integer that specifies how the key is used. For key-signing key (KSK), this value\\n\\t\\t\\tis always 257.</p>\"\n                    }\n                },\n                \"SigningAlgorithmMnemonic\": {\n                    \"target\": \"com.amazonaws.route53#SigningKeyString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A string used to represent the signing algorithm. This value must follow the\\n\\t\\t\\tguidelines provided by <a href=\\\"https://tools.ietf.org/html/rfc8624#section-3.1\\\">RFC-8624 Section 3.1</a>. </p>\"\n                    }\n                },\n                \"SigningAlgorithmType\": {\n                    \"target\": \"com.amazonaws.route53#SigningKeyInteger\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>An integer used to represent the signing algorithm. This value must follow the\\n\\t\\t\\tguidelines provided by <a href=\\\"https://tools.ietf.org/html/rfc8624#section-3.1\\\">RFC-8624 Section 3.1</a>. </p>\"\n                    }\n                },\n                \"DigestAlgorithmMnemonic\": {\n                    \"target\": \"com.amazonaws.route53#SigningKeyString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A string used to represent the delegation signer digest algorithm. This value must\\n\\t\\t\\tfollow the guidelines provided by <a href=\\\"https://tools.ietf.org/html/rfc8624#section-3.3\\\">RFC-8624 Section 3.3</a>.\\n\\t\\t</p>\"\n                    }\n                },\n                \"DigestAlgorithmType\": {\n                    \"target\": \"com.amazonaws.route53#SigningKeyInteger\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>An integer used to represent the delegation signer digest algorithm. This value must\\n\\t\\t\\tfollow the guidelines provided by <a href=\\\"https://tools.ietf.org/html/rfc8624#section-3.3\\\">RFC-8624 Section\\n\\t\\t\\t3.3</a>.</p>\"\n                    }\n                },\n                \"KeyTag\": {\n                    \"target\": \"com.amazonaws.route53#SigningKeyTag\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>An integer used to identify the DNSSEC record for the domain name. The process used to\\n\\t\\t\\tcalculate the value is described in <a href=\\\"https://tools.ietf.org/rfc/rfc4034.txt\\\">RFC-4034 Appendix B</a>.</p>\"\n                    }\n                },\n                \"DigestValue\": {\n                    \"target\": \"com.amazonaws.route53#SigningKeyString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A cryptographic digest of a DNSKEY resource record (RR). DNSKEY records are used to\\n\\t\\t\\tpublish the public key that resolvers can use to verify DNSSEC signatures that are used\\n\\t\\t\\tto secure certain kinds of information provided by the DNS system.</p>\"\n                    }\n                },\n                \"PublicKey\": {\n                    \"target\": \"com.amazonaws.route53#SigningKeyString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The public key, represented as a Base64 encoding, as required by <a href=\\\"https://tools.ietf.org/rfc/rfc4034.txt\\\"> RFC-4034 Page 5</a>.</p>\"\n                    }\n                },\n                \"DSRecord\": {\n                    \"target\": \"com.amazonaws.route53#SigningKeyString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A string that represents a delegation signer (DS) record.</p>\"\n                    }\n                },\n                \"DNSKEYRecord\": {\n                    \"target\": \"com.amazonaws.route53#SigningKeyString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A string that represents a DNSKEY record.</p>\"\n                    }\n                },\n                \"Status\": {\n                    \"target\": \"com.amazonaws.route53#SigningKeyStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A string that represents the current key-signing key (KSK) status.</p>\\n         <p>Status can have one of the following values:</p>\\n         <dl>\\n            <dt>ACTIVE</dt>\\n            <dd>\\n               <p>The KSK is being used for signing.</p>\\n            </dd>\\n            <dt>INACTIVE</dt>\\n            <dd>\\n               <p>The KSK is not being used for signing.</p>\\n            </dd>\\n            <dt>DELETING</dt>\\n            <dd>\\n               <p>The KSK is in the process of being deleted.</p>\\n            </dd>\\n            <dt>ACTION_NEEDED</dt>\\n            <dd>\\n               <p>There is a problem with the KSK that requires you to take action to\\n\\t\\t\\t\\t\\t\\tresolve. For example, the customer managed key might have been deleted,\\n\\t\\t\\t\\t\\t\\tor the permissions for the customer managed key might have been\\n\\t\\t\\t\\t\\t\\tchanged.</p>\\n            </dd>\\n            <dt>INTERNAL_FAILURE</dt>\\n            <dd>\\n               <p>There was an error during a request. Before you can continue to work with\\n\\t\\t\\t\\t\\t\\tDNSSEC signing, including actions that involve this KSK, you must correct\\n\\t\\t\\t\\t\\t\\tthe problem. For example, you may need to activate or deactivate the\\n\\t\\t\\t\\t\\t\\tKSK.</p>\\n            </dd>\\n         </dl>\"\n                    }\n                },\n                \"StatusMessage\": {\n                    \"target\": \"com.amazonaws.route53#SigningKeyStatusMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The status message provided for the following key-signing key (KSK) statuses:\\n\\t\\t\\t\\t<code>ACTION_NEEDED</code> or <code>INTERNAL_FAILURE</code>. The status message\\n\\t\\t\\tincludes information about what the problem might be and steps that you can take to\\n\\t\\t\\tcorrect the issue.</p>\"\n                    }\n                },\n                \"CreatedDate\": {\n                    \"target\": \"com.amazonaws.route53#TimeStamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date when the key-signing key (KSK) was created.</p>\"\n                    }\n                },\n                \"LastModifiedDate\": {\n                    \"target\": \"com.amazonaws.route53#TimeStamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The last time that the key-signing key (KSK) was changed.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A key-signing key (KSK) is a complex type that represents a public/private key pair.\\n\\t\\t\\tThe private key is used to generate a digital signature for the zone signing key (ZSK).\\n\\t\\t\\tThe public key is stored in the DNS and is used to authenticate the ZSK. A KSK is always\\n\\t\\t\\tassociated with a hosted zone; it cannot exist by itself.</p>\"\n            }\n        },\n        \"com.amazonaws.route53#KeySigningKeyAlreadyExists\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.route53#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>You've already created a key-signing key (KSK) with this name or with the same customer managed key ARN.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 409\n            }\n        },\n        \"com.amazonaws.route53#KeySigningKeyInParentDSRecord\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.route53#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The key-signing key (KSK) is specified in a parent DS record.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.route53#KeySigningKeyInUse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.route53#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The key-signing key (KSK) that you specified can't be deactivated because it's the\\n\\t\\t\\tonly KSK for a currently-enabled DNSSEC. Disable DNSSEC signing, or add or enable\\n\\t\\t\\tanother KSK.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.route53#KeySigningKeyWithActiveStatusNotFound\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.route53#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A key-signing key (KSK) with <code>ACTIVE</code> status wasn't found.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.route53#KeySigningKeys\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.route53#KeySigningKey\"\n            }\n        },\n        \"com.amazonaws.route53#LastVPCAssociation\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.route53#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The VPC that you're trying to disassociate from the private hosted zone is the last\\n\\t\\t\\tVPC that is associated with the hosted zone. Amazon Route 53 doesn't support\\n\\t\\t\\tdisassociating the last VPC from a hosted zone.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.route53#Latitude\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 6\n                },\n                \"smithy.api#pattern\": \"^[-+]?[0-9]{1,2}(\\\\.[0-9]{0,2})?$\"\n            }\n        },\n        \"com.amazonaws.route53#LimitValue\": {\n            \"type\": \"long\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1\n                }\n            }\n        },\n        \"com.amazonaws.route53#LimitsExceeded\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.route53#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This operation can't be completed because the current account has reached the\\n\\t\\t\\tlimit on the resource you are trying to create. To request a higher limit, <a href=\\\"http://aws.amazon.com/route53-request\\\">create a case</a> with the Amazon Web Services Support\\n\\t\\t\\tCenter.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.route53#LinkedService\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ServicePrincipal\": {\n                    \"target\": \"com.amazonaws.route53#ServicePrincipal\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If the health check or hosted zone was created by another service, the service that\\n\\t\\t\\tcreated the resource. When a resource is created by another service, you can't edit or\\n\\t\\t\\tdelete it using Amazon Route 53. </p>\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.route53#ResourceDescription\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If the health check or hosted zone was created by another service, an optional\\n\\t\\t\\tdescription that can be provided by the other service. When a resource is created by\\n\\t\\t\\tanother service, you can't edit or delete it using Amazon Route 53. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>If a health check or hosted zone was created by another service,\\n\\t\\t\\t\\t<code>LinkedService</code> is a complex type that describes the service that created\\n\\t\\t\\tthe resource. When a resource is created by another service, you can't edit or delete it\\n\\t\\t\\tusing Amazon Route 53. </p>\"\n            }\n        },\n        \"com.amazonaws.route53#ListCidrBlocks\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.route53#ListCidrBlocksRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.route53#ListCidrBlocksResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidInput\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#NoSuchCidrCollectionException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#NoSuchCidrLocationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns a paginated list of location objects and their CIDR blocks.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/2013-04-01/cidrcollection/{CollectionId}/cidrblocks\",\n                    \"code\": 200\n                },\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"CidrBlocks\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.route53#ListCidrBlocksRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CollectionId\": {\n                    \"target\": \"com.amazonaws.route53#UUID\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The UUID of the CIDR collection.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"LocationName\": {\n                    \"target\": \"com.amazonaws.route53#CidrLocationNameDefaultNotAllowed\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the CIDR collection location.</p>\",\n                        \"smithy.api#httpQuery\": \"location\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.route53#PaginationToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An opaque pagination token to indicate where the service is to begin enumerating\\n\\t\\t\\tresults.</p>\",\n                        \"smithy.api#httpQuery\": \"nexttoken\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"smithy.api#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Maximum number of results you want returned.</p>\",\n                        \"smithy.api#httpQuery\": \"maxresults\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.route53#ListCidrBlocksResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.route53#PaginationToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An opaque pagination token to indicate where the service is to begin enumerating\\n\\t\\t\\tresults. </p>\\n         <p>If no value is provided, the listing of results starts from the beginning.</p>\"\n                    }\n                },\n                \"CidrBlocks\": {\n                    \"target\": \"com.amazonaws.route53#CidrBlockSummaries\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A complex type that contains information about the CIDR blocks.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.route53#ListCidrCollections\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.route53#ListCidrCollectionsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.route53#ListCidrCollectionsResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidInput\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns a paginated list of CIDR collections in the Amazon Web Services account\\n\\t\\t\\t(metadata only).</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/2013-04-01/cidrcollection\",\n                    \"code\": 200\n                },\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"CidrCollections\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.route53#ListCidrCollectionsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.route53#PaginationToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An opaque pagination token to indicate where the service is to begin enumerating\\n\\t\\t\\tresults.</p>\\n         <p>If no value is provided, the listing of results starts from the beginning.</p>\",\n                        \"smithy.api#httpQuery\": \"nexttoken\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"smithy.api#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of CIDR collections to return in the response.</p>\",\n                        \"smithy.api#httpQuery\": \"maxresults\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.route53#ListCidrCollectionsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.route53#PaginationToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An opaque pagination token to indicate where the service is to begin enumerating\\n\\t\\t\\tresults.</p>\\n         <p>If no value is provided, the listing of results starts from the beginning.</p>\"\n                    }\n                },\n                \"CidrCollections\": {\n                    \"target\": \"com.amazonaws.route53#CollectionSummaries\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A complex type with information about the CIDR collection.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.route53#ListCidrLocations\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.route53#ListCidrLocationsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.route53#ListCidrLocationsResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidInput\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#NoSuchCidrCollectionException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns a paginated list of CIDR locations for the given collection (metadata only,\\n\\t\\t\\tdoes not include CIDR blocks).</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/2013-04-01/cidrcollection/{CollectionId}\",\n                    \"code\": 200\n                },\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"CidrLocations\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.route53#ListCidrLocationsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CollectionId\": {\n                    \"target\": \"com.amazonaws.route53#UUID\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The CIDR collection ID.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.route53#PaginationToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An opaque pagination token to indicate where the service is to begin enumerating\\n\\t\\t\\tresults.</p>\\n         <p>If no value is provided, the listing of results starts from the beginning.</p>\",\n                        \"smithy.api#httpQuery\": \"nexttoken\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"smithy.api#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of CIDR collection locations to return in the response.</p>\",\n                        \"smithy.api#httpQuery\": \"maxresults\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.route53#ListCidrLocationsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.route53#PaginationToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An opaque pagination token to indicate where the service is to begin enumerating\\n\\t\\t\\tresults.</p>\\n         <p>If no value is provided, the listing of results starts from the beginning.</p>\"\n                    }\n                },\n                \"CidrLocations\": {\n                    \"target\": \"com.amazonaws.route53#LocationSummaries\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A complex type that contains information about the list of CIDR locations.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.route53#ListGeoLocations\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.route53#ListGeoLocationsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.route53#ListGeoLocationsResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidInput\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Retrieves a list of supported geographic locations.</p>\\n         <p>Countries are listed first, and continents are listed last. If Amazon Route 53\\n\\t\\t\\tsupports subdivisions for a country (for example, states or provinces), the subdivisions\\n\\t\\t\\tfor that country are listed in alphabetical order immediately after the corresponding\\n\\t\\t\\tcountry.</p>\\n         <p>Route 53 does not perform authorization for this API because it retrieves information\\n\\t\\t\\tthat is already available to the public.</p>\\n         <p>For a list of supported geolocation codes, see the <a href=\\\"https://docs.aws.amazon.com/Route53/latest/APIReference/API_GeoLocation.html\\\">GeoLocation</a> data\\n\\t\\t\\ttype.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/2013-04-01/geolocations\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.route53#ListGeoLocationsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"StartContinentCode\": {\n                    \"target\": \"com.amazonaws.route53#GeoLocationContinentCode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The code for the continent with which you want to start listing locations that Amazon\\n\\t\\t\\tRoute 53 supports for geolocation. If Route 53 has already returned a page or more of\\n\\t\\t\\tresults, if <code>IsTruncated</code> is true, and if <code>NextContinentCode</code> from\\n\\t\\t\\tthe previous response has a value, enter that value in <code>startcontinentcode</code>\\n\\t\\t\\tto return the next page of results.</p>\\n         <p>Include <code>startcontinentcode</code> only if you want to list continents. Don't\\n\\t\\t\\tinclude <code>startcontinentcode</code> when you're listing countries or countries with\\n\\t\\t\\ttheir subdivisions.</p>\",\n                        \"smithy.api#httpQuery\": \"startcontinentcode\"\n                    }\n                },\n                \"StartCountryCode\": {\n                    \"target\": \"com.amazonaws.route53#GeoLocationCountryCode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The code for the country with which you want to start listing locations that Amazon\\n\\t\\t\\tRoute 53 supports for geolocation. If Route 53 has already returned a page or more of\\n\\t\\t\\tresults, if <code>IsTruncated</code> is <code>true</code>, and if\\n\\t\\t\\t\\t<code>NextCountryCode</code> from the previous response has a value, enter that\\n\\t\\t\\tvalue in <code>startcountrycode</code> to return the next page of results.</p>\",\n                        \"smithy.api#httpQuery\": \"startcountrycode\"\n                    }\n                },\n                \"StartSubdivisionCode\": {\n                    \"target\": \"com.amazonaws.route53#GeoLocationSubdivisionCode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The code for the state of the United States with which you want to start listing\\n\\t\\t\\tlocations that Amazon Route 53 supports for geolocation. If Route 53 has already\\n\\t\\t\\treturned a page or more of results, if <code>IsTruncated</code> is <code>true</code>,\\n\\t\\t\\tand if <code>NextSubdivisionCode</code> from the previous response has a value, enter\\n\\t\\t\\tthat value in <code>startsubdivisioncode</code> to return the next page of\\n\\t\\t\\tresults.</p>\\n         <p>To list subdivisions (U.S. states), you must include both\\n\\t\\t\\t\\t<code>startcountrycode</code> and <code>startsubdivisioncode</code>.</p>\",\n                        \"smithy.api#httpQuery\": \"startsubdivisioncode\"\n                    }\n                },\n                \"MaxItems\": {\n                    \"target\": \"smithy.api#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>(Optional) The maximum number of geolocations to be included in the response body for this\\n\\t\\t\\trequest. If more than <code>maxitems</code> geolocations remain to be listed, then the\\n\\t\\t\\tvalue of the <code>IsTruncated</code> element in the response is\\n\\t\\t\\t<code>true</code>.</p>\",\n                        \"smithy.api#httpQuery\": \"maxitems\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A request to get a list of geographic locations that Amazon Route 53 supports for\\n\\t\\t\\tgeolocation resource record sets. </p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.route53#ListGeoLocationsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"GeoLocationDetailsList\": {\n                    \"target\": \"com.amazonaws.route53#GeoLocationDetailsList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A complex type that contains one <code>GeoLocationDetails</code> element for each\\n\\t\\t\\tlocation that Amazon Route 53 supports for geolocation.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"IsTruncated\": {\n                    \"target\": \"com.amazonaws.route53#PageTruncated\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>A value that indicates whether more locations remain to be listed after the last\\n\\t\\t\\tlocation in this response. If so, the value of <code>IsTruncated</code> is\\n\\t\\t\\t\\t<code>true</code>. To get more values, submit another request and include the values\\n\\t\\t\\tof <code>NextContinentCode</code>, <code>NextCountryCode</code>, and\\n\\t\\t\\t\\t<code>NextSubdivisionCode</code> in the <code>startcontinentcode</code>,\\n\\t\\t\\t\\t<code>startcountrycode</code>, and <code>startsubdivisioncode</code>, as\\n\\t\\t\\tapplicable.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"NextContinentCode\": {\n                    \"target\": \"com.amazonaws.route53#GeoLocationContinentCode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If <code>IsTruncated</code> is <code>true</code>, you can make a follow-up request to\\n\\t\\t\\tdisplay more locations. Enter the value of <code>NextContinentCode</code> in the\\n\\t\\t\\t\\t<code>startcontinentcode</code> parameter in another <code>ListGeoLocations</code>\\n\\t\\t\\trequest.</p>\"\n                    }\n                },\n                \"NextCountryCode\": {\n                    \"target\": \"com.amazonaws.route53#GeoLocationCountryCode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If <code>IsTruncated</code> is <code>true</code>, you can make a follow-up request to\\n\\t\\t\\tdisplay more locations. Enter the value of <code>NextCountryCode</code> in the\\n\\t\\t\\t\\t<code>startcountrycode</code> parameter in another <code>ListGeoLocations</code>\\n\\t\\t\\trequest.</p>\"\n                    }\n                },\n                \"NextSubdivisionCode\": {\n                    \"target\": \"com.amazonaws.route53#GeoLocationSubdivisionCode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If <code>IsTruncated</code> is <code>true</code>, you can make a follow-up request to\\n\\t\\t\\tdisplay more locations. Enter the value of <code>NextSubdivisionCode</code> in the\\n\\t\\t\\t\\t<code>startsubdivisioncode</code> parameter in another <code>ListGeoLocations</code>\\n\\t\\t\\trequest.</p>\"\n                    }\n                },\n                \"MaxItems\": {\n                    \"target\": \"smithy.api#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The value that you specified for <code>MaxItems</code> in the request.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type containing the response information for the request.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.route53#ListHealthChecks\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.route53#ListHealthChecksRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.route53#ListHealthChecksResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.route53#IncompatibleVersion\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidInput\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Retrieve a list of the health checks that are associated with the current Amazon Web Services account. </p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/2013-04-01/healthcheck\",\n                    \"code\": 200\n                },\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"Marker\",\n                    \"outputToken\": \"NextMarker\",\n                    \"items\": \"HealthChecks\",\n                    \"pageSize\": \"MaxItems\"\n                }\n            }\n        },\n        \"com.amazonaws.route53#ListHealthChecksRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.route53#PageMarker\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If the value of <code>IsTruncated</code> in the previous response was\\n\\t\\t\\t\\t<code>true</code>, you have more health checks. To get another group, submit another\\n\\t\\t\\t\\t<code>ListHealthChecks</code> request. </p>\\n         <p>For the value of <code>marker</code>, specify the value of <code>NextMarker</code>\\n\\t\\t\\tfrom the previous response, which is the ID of the first health check that Amazon Route\\n\\t\\t\\t53 will return if you submit another request.</p>\\n         <p>If the value of <code>IsTruncated</code> in the previous response was\\n\\t\\t\\t\\t<code>false</code>, there are no more health checks to get.</p>\",\n                        \"smithy.api#httpQuery\": \"marker\"\n                    }\n                },\n                \"MaxItems\": {\n                    \"target\": \"smithy.api#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of health checks that you want <code>ListHealthChecks</code> to\\n\\t\\t\\treturn in response to the current request. Amazon Route 53 returns a maximum of 1000\\n\\t\\t\\titems. If you set <code>MaxItems</code> to a value greater than 1000, Route 53 returns\\n\\t\\t\\tonly the first 1000 health checks. </p>\",\n                        \"smithy.api#httpQuery\": \"maxitems\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A request to retrieve a list of the health checks that are associated with the current\\n\\t\\t\\t\\tAmazon Web Services account.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.route53#ListHealthChecksResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"HealthChecks\": {\n                    \"target\": \"com.amazonaws.route53#HealthChecks\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A complex type that contains one <code>HealthCheck</code> element for each health\\n\\t\\t\\tcheck that is associated with the current Amazon Web Services account.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.route53#PageMarker\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>For the second and subsequent calls to <code>ListHealthChecks</code>,\\n\\t\\t\\t\\t<code>Marker</code> is the value that you specified for the <code>marker</code>\\n\\t\\t\\tparameter in the previous request.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"IsTruncated\": {\n                    \"target\": \"com.amazonaws.route53#PageTruncated\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>A flag that indicates whether there are more health checks to be listed. If the\\n\\t\\t\\tresponse was truncated, you can get the next group of health checks by submitting\\n\\t\\t\\tanother <code>ListHealthChecks</code> request and specifying the value of\\n\\t\\t\\t\\t<code>NextMarker</code> in the <code>marker</code> parameter.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"NextMarker\": {\n                    \"target\": \"com.amazonaws.route53#PageMarker\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If <code>IsTruncated</code> is <code>true</code>, the value of <code>NextMarker</code>\\n\\t\\t\\tidentifies the first health check that Amazon Route 53 returns if you submit another\\n\\t\\t\\t\\t<code>ListHealthChecks</code> request and specify the value of\\n\\t\\t\\t\\t<code>NextMarker</code> in the <code>marker</code> parameter.</p>\"\n                    }\n                },\n                \"MaxItems\": {\n                    \"target\": \"smithy.api#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The value that you specified for the <code>maxitems</code> parameter in the call to\\n\\t\\t\\t\\t<code>ListHealthChecks</code> that produced the current response.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that contains the response to a <code>ListHealthChecks</code>\\n\\t\\t\\trequest.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.route53#ListHostedZones\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.route53#ListHostedZonesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.route53#ListHostedZonesResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.route53#DelegationSetNotReusable\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidInput\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#NoSuchDelegationSet\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Retrieves a list of the public and private hosted zones that are associated with the\\n\\t\\t\\tcurrent Amazon Web Services account. The response includes a <code>HostedZones</code>\\n\\t\\t\\tchild element for each hosted zone.</p>\\n         <p>Amazon Route 53 returns a maximum of 100 items in each response. If you have a lot of\\n\\t\\t\\thosted zones, you can use the <code>maxitems</code> parameter to list them in groups of\\n\\t\\t\\tup to 100.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/2013-04-01/hostedzone\",\n                    \"code\": 200\n                },\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"Marker\",\n                    \"outputToken\": \"NextMarker\",\n                    \"items\": \"HostedZones\",\n                    \"pageSize\": \"MaxItems\"\n                },\n                \"smithy.test#smokeTests\": [\n                    {\n                        \"id\": \"ListHostedZonesSuccess\",\n                        \"params\": {},\n                        \"vendorParams\": {\n                            \"region\": \"us-east-1\"\n                        },\n                        \"vendorParamsShape\": \"aws.test#AwsVendorParams\",\n                        \"expect\": {\n                            \"success\": {}\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.route53#ListHostedZonesByName\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.route53#ListHostedZonesByNameRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.route53#ListHostedZonesByNameResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidDomainName\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidInput\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Retrieves a list of your hosted zones in lexicographic order. The response includes a\\n\\t\\t\\t\\t<code>HostedZones</code> child element for each hosted zone created by the current\\n\\t\\t\\t\\tAmazon Web Services account. </p>\\n         <p>\\n            <code>ListHostedZonesByName</code> sorts hosted zones by name with the labels\\n\\t\\t\\treversed. For example:</p>\\n         <p>\\n            <code>com.example.www.</code>\\n         </p>\\n         <p>Note the trailing dot, which can change the sort order in some circumstances.</p>\\n         <p>If the domain name includes escape characters or Punycode,\\n\\t\\t\\t\\t<code>ListHostedZonesByName</code> alphabetizes the domain name using the escaped or\\n\\t\\t\\tPunycoded value, which is the format that Amazon Route 53 saves in its database. For\\n\\t\\t\\texample, to create a hosted zone for exämple.com, you specify ex\\\\344mple.com for\\n\\t\\t\\tthe domain name. <code>ListHostedZonesByName</code> alphabetizes it as:</p>\\n         <p>\\n            <code>com.ex\\\\344mple.</code>\\n         </p>\\n         <p>The labels are reversed and alphabetized using the escaped value. For more information\\n\\t\\t\\tabout valid domain name formats, including internationalized domain names, see <a href=\\\"https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/DomainNameFormat.html\\\">DNS\\n\\t\\t\\t\\tDomain Name Format</a> in the <i>Amazon Route 53 Developer\\n\\t\\t\\t\\tGuide</i>.</p>\\n         <p>Route 53 returns up to 100 items in each response. If you have a lot of hosted zones,\\n\\t\\t\\tuse the <code>MaxItems</code> parameter to list them in groups of up to 100. The\\n\\t\\t\\tresponse includes values that help navigate from one group of <code>MaxItems</code>\\n\\t\\t\\thosted zones to the next:</p>\\n         <ul>\\n            <li>\\n               <p>The <code>DNSName</code> and <code>HostedZoneId</code> elements in the\\n\\t\\t\\t\\t\\tresponse contain the values, if any, specified for the <code>dnsname</code> and\\n\\t\\t\\t\\t\\t\\t<code>hostedzoneid</code> parameters in the request that produced the\\n\\t\\t\\t\\t\\tcurrent response.</p>\\n            </li>\\n            <li>\\n               <p>The <code>MaxItems</code> element in the response contains the value, if any,\\n\\t\\t\\t\\t\\tthat you specified for the <code>maxitems</code> parameter in the request that\\n\\t\\t\\t\\t\\tproduced the current response.</p>\\n            </li>\\n            <li>\\n               <p>If the value of <code>IsTruncated</code> in the response is true, there are\\n\\t\\t\\t\\t\\tmore hosted zones associated with the current Amazon Web Services account. </p>\\n               <p>If <code>IsTruncated</code> is false, this response includes the last hosted\\n\\t\\t\\t\\t\\tzone that is associated with the current account. The <code>NextDNSName</code>\\n\\t\\t\\t\\t\\telement and <code>NextHostedZoneId</code> elements are omitted from the\\n\\t\\t\\t\\t\\tresponse.</p>\\n            </li>\\n            <li>\\n               <p>The <code>NextDNSName</code> and <code>NextHostedZoneId</code> elements in the\\n\\t\\t\\t\\t\\tresponse contain the domain name and the hosted zone ID of the next hosted zone\\n\\t\\t\\t\\t\\tthat is associated with the current Amazon Web Services account. If you want to\\n\\t\\t\\t\\t\\tlist more hosted zones, make another call to <code>ListHostedZonesByName</code>,\\n\\t\\t\\t\\t\\tand specify the value of <code>NextDNSName</code> and\\n\\t\\t\\t\\t\\t\\t<code>NextHostedZoneId</code> in the <code>dnsname</code> and\\n\\t\\t\\t\\t\\t\\t<code>hostedzoneid</code> parameters, respectively.</p>\\n            </li>\\n         </ul>\",\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/2013-04-01/hostedzonesbyname\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.route53#ListHostedZonesByNameRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DNSName\": {\n                    \"target\": \"com.amazonaws.route53#DNSName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>(Optional) For your first request to <code>ListHostedZonesByName</code>, include the\\n\\t\\t\\t\\t<code>dnsname</code> parameter only if you want to specify the name of the first\\n\\t\\t\\thosted zone in the response. If you don't include the <code>dnsname</code> parameter,\\n\\t\\t\\tAmazon Route 53 returns all of the hosted zones that were created by the current Amazon Web Services account, in ASCII order. For subsequent requests, include both\\n\\t\\t\\t\\t<code>dnsname</code> and <code>hostedzoneid</code> parameters. For\\n\\t\\t\\t\\t<code>dnsname</code>, specify the value of <code>NextDNSName</code> from the\\n\\t\\t\\tprevious response.</p>\",\n                        \"smithy.api#httpQuery\": \"dnsname\"\n                    }\n                },\n                \"HostedZoneId\": {\n                    \"target\": \"com.amazonaws.route53#ResourceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>(Optional) For your first request to <code>ListHostedZonesByName</code>, do not\\n\\t\\t\\tinclude the <code>hostedzoneid</code> parameter.</p>\\n         <p>If you have more hosted zones than the value of <code>maxitems</code>,\\n\\t\\t\\t\\t<code>ListHostedZonesByName</code> returns only the first <code>maxitems</code>\\n\\t\\t\\thosted zones. To get the next group of <code>maxitems</code> hosted zones, submit\\n\\t\\t\\tanother request to <code>ListHostedZonesByName</code> and include both\\n\\t\\t\\t\\t<code>dnsname</code> and <code>hostedzoneid</code> parameters. For the value of\\n\\t\\t\\t\\t<code>hostedzoneid</code>, specify the value of the <code>NextHostedZoneId</code>\\n\\t\\t\\telement from the previous response.</p>\",\n                        \"smithy.api#httpQuery\": \"hostedzoneid\"\n                    }\n                },\n                \"MaxItems\": {\n                    \"target\": \"smithy.api#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of hosted zones to be included in the response body for this\\n\\t\\t\\trequest. If you have more than <code>maxitems</code> hosted zones, then the value of the\\n\\t\\t\\t\\t<code>IsTruncated</code> element in the response is true, and the values of\\n\\t\\t\\t\\t<code>NextDNSName</code> and <code>NextHostedZoneId</code> specify the first hosted\\n\\t\\t\\tzone in the next group of <code>maxitems</code> hosted zones. </p>\",\n                        \"smithy.api#httpQuery\": \"maxitems\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Retrieves a list of the public and private hosted zones that are associated with the\\n\\t\\t\\tcurrent Amazon Web Services account in ASCII order by domain name. </p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.route53#ListHostedZonesByNameResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"HostedZones\": {\n                    \"target\": \"com.amazonaws.route53#HostedZones\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A complex type that contains general information about the hosted zone.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DNSName\": {\n                    \"target\": \"com.amazonaws.route53#DNSName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>For the second and subsequent calls to <code>ListHostedZonesByName</code>,\\n\\t\\t\\t\\t<code>DNSName</code> is the value that you specified for the <code>dnsname</code>\\n\\t\\t\\tparameter in the request that produced the current response.</p>\"\n                    }\n                },\n                \"HostedZoneId\": {\n                    \"target\": \"com.amazonaws.route53#ResourceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID that Amazon Route 53 assigned to the hosted zone when you created it.</p>\"\n                    }\n                },\n                \"IsTruncated\": {\n                    \"target\": \"com.amazonaws.route53#PageTruncated\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>A flag that indicates whether there are more hosted zones to be listed. If the\\n\\t\\t\\tresponse was truncated, you can get the next group of <code>maxitems</code> hosted zones\\n\\t\\t\\tby calling <code>ListHostedZonesByName</code> again and specifying the values of\\n\\t\\t\\t\\t<code>NextDNSName</code> and <code>NextHostedZoneId</code> elements in the\\n\\t\\t\\t\\t<code>dnsname</code> and <code>hostedzoneid</code> parameters.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"NextDNSName\": {\n                    \"target\": \"com.amazonaws.route53#DNSName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If <code>IsTruncated</code> is true, the value of <code>NextDNSName</code> is the name\\n\\t\\t\\tof the first hosted zone in the next group of <code>maxitems</code> hosted zones. Call\\n\\t\\t\\t\\t<code>ListHostedZonesByName</code> again and specify the value of\\n\\t\\t\\t\\t<code>NextDNSName</code> and <code>NextHostedZoneId</code> in the\\n\\t\\t\\t\\t<code>dnsname</code> and <code>hostedzoneid</code> parameters, respectively.</p>\\n         <p>This element is present only if <code>IsTruncated</code> is <code>true</code>.</p>\"\n                    }\n                },\n                \"NextHostedZoneId\": {\n                    \"target\": \"com.amazonaws.route53#ResourceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If <code>IsTruncated</code> is <code>true</code>, the value of\\n\\t\\t\\t\\t<code>NextHostedZoneId</code> identifies the first hosted zone in the next group of\\n\\t\\t\\t\\t<code>maxitems</code> hosted zones. Call <code>ListHostedZonesByName</code> again\\n\\t\\t\\tand specify the value of <code>NextDNSName</code> and <code>NextHostedZoneId</code> in\\n\\t\\t\\tthe <code>dnsname</code> and <code>hostedzoneid</code> parameters, respectively.</p>\\n         <p>This element is present only if <code>IsTruncated</code> is <code>true</code>.</p>\"\n                    }\n                },\n                \"MaxItems\": {\n                    \"target\": \"smithy.api#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The value that you specified for the <code>maxitems</code> parameter in the call to\\n\\t\\t\\t\\t<code>ListHostedZonesByName</code> that produced the current response.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that contains the response information for the request.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.route53#ListHostedZonesByVPC\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.route53#ListHostedZonesByVPCRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.route53#ListHostedZonesByVPCResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidInput\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidPaginationToken\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Lists all the private hosted zones that a specified VPC is associated with, regardless\\n\\t\\t\\tof which Amazon Web Services account or Amazon Web Services service owns the hosted zones.\\n\\t\\t\\tThe <code>HostedZoneOwner</code> structure in the response contains one of the following\\n\\t\\t\\tvalues:</p>\\n         <ul>\\n            <li>\\n               <p>An <code>OwningAccount</code> element, which contains the account number of\\n\\t\\t\\t\\t\\teither the current Amazon Web Services account or another Amazon Web Services account. Some services, such as Cloud Map, create\\n\\t\\t\\t\\t\\thosted zones using the current account. </p>\\n            </li>\\n            <li>\\n               <p>An <code>OwningService</code> element, which identifies the Amazon Web Services\\n\\t\\t\\t\\t\\tservice that created and owns the hosted zone. For example, if a hosted zone was\\n\\t\\t\\t\\t\\tcreated by Amazon Elastic File System (Amazon EFS), the value of\\n\\t\\t\\t\\t\\t\\t<code>Owner</code> is <code>efs.amazonaws.com</code>. </p>\\n            </li>\\n         </ul>\\n         <p>\\n            <code>ListHostedZonesByVPC</code> returns the hosted zones associated with the specified VPC and does not reflect the hosted zone\\n\\t\\t\\tassociations to VPCs via Route 53 Profiles. To get the associations to a Profile, call the <a href=\\\"https://docs.aws.amazon.com/Route53/latest/APIReference/API_route53profiles_ListProfileResourceAssociations.html\\\">ListProfileResourceAssociations</a> API.</p>\\n         <note>\\n            <p>When listing private hosted zones, the hosted zone and the Amazon VPC must\\n\\t\\t\\t\\tbelong to the same partition where the hosted zones were created. A partition is a\\n\\t\\t\\t\\tgroup of Amazon Web Services Regions. Each Amazon Web Services account is scoped to\\n\\t\\t\\t\\tone partition.</p>\\n            <p>The following are the supported partitions:</p>\\n            <ul>\\n               <li>\\n                  <p>\\n                     <code>aws</code> - Amazon Web Services Regions</p>\\n               </li>\\n               <li>\\n                  <p>\\n                     <code>aws-cn</code> - China Regions</p>\\n               </li>\\n               <li>\\n                  <p>\\n                     <code>aws-us-gov</code> - Amazon Web Services GovCloud (US) Region</p>\\n               </li>\\n            </ul>\\n            <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html\\\">Access Management</a>\\n\\t\\t\\t\\tin the <i>Amazon Web Services General Reference</i>.</p>\\n         </note>\",\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/2013-04-01/hostedzonesbyvpc\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.route53#ListHostedZonesByVPCRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VPCId\": {\n                    \"target\": \"com.amazonaws.route53#VPCId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the Amazon VPC that you want to list hosted zones for.</p>\",\n                        \"smithy.api#httpQuery\": \"vpcid\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"VPCRegion\": {\n                    \"target\": \"com.amazonaws.route53#VPCRegion\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>For the Amazon VPC that you specified for <code>VPCId</code>, the Amazon Web Services\\n\\t\\t\\tRegion that you created the VPC in. </p>\",\n                        \"smithy.api#httpQuery\": \"vpcregion\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"MaxItems\": {\n                    \"target\": \"smithy.api#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>(Optional) The maximum number of hosted zones that you want Amazon Route 53 to return.\\n\\t\\t\\tIf the specified VPC is associated with more than <code>MaxItems</code> hosted zones,\\n\\t\\t\\tthe response includes a <code>NextToken</code> element. <code>NextToken</code> contains\\n\\t\\t\\tan encrypted token that identifies the first hosted zone that Route 53 will return if\\n\\t\\t\\tyou submit another request.</p>\",\n                        \"smithy.api#httpQuery\": \"maxitems\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.route53#PaginationToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If the previous response included a <code>NextToken</code> element, the specified VPC\\n\\t\\t\\tis associated with more hosted zones. To get more hosted zones, submit another\\n\\t\\t\\t\\t<code>ListHostedZonesByVPC</code> request. </p>\\n         <p>For the value of <code>NextToken</code>, specify the value of <code>NextToken</code>\\n\\t\\t\\tfrom the previous response.</p>\\n         <p>If the previous response didn't include a <code>NextToken</code> element, there are no\\n\\t\\t\\tmore hosted zones to get.</p>\",\n                        \"smithy.api#httpQuery\": \"nexttoken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Lists all the private hosted zones that a specified VPC is associated with, regardless\\n\\t\\t\\tof which Amazon Web Services account created the hosted zones.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.route53#ListHostedZonesByVPCResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"HostedZoneSummaries\": {\n                    \"target\": \"com.amazonaws.route53#HostedZoneSummaries\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list that contains one <code>HostedZoneSummary</code> element for each hosted zone\\n\\t\\t\\tthat the specified Amazon VPC is associated with. Each <code>HostedZoneSummary</code>\\n\\t\\t\\telement contains the hosted zone name and ID, and information about who owns the hosted\\n\\t\\t\\tzone.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"MaxItems\": {\n                    \"target\": \"smithy.api#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The value that you specified for <code>MaxItems</code> in the most recent\\n\\t\\t\\t\\t<code>ListHostedZonesByVPC</code> request.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.route53#PaginationToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The value that you will use for <code>NextToken</code> in the next\\n\\t\\t\\t\\t<code>ListHostedZonesByVPC</code> request.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.route53#ListHostedZonesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.route53#PageMarker\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If the value of <code>IsTruncated</code> in the previous response was\\n\\t\\t\\t\\t<code>true</code>, you have more hosted zones. To get more hosted zones, submit\\n\\t\\t\\tanother <code>ListHostedZones</code> request. </p>\\n         <p>For the value of <code>marker</code>, specify the value of <code>NextMarker</code>\\n\\t\\t\\tfrom the previous response, which is the ID of the first hosted zone that Amazon Route\\n\\t\\t\\t53 will return if you submit another request.</p>\\n         <p>If the value of <code>IsTruncated</code> in the previous response was\\n\\t\\t\\t\\t<code>false</code>, there are no more hosted zones to get.</p>\",\n                        \"smithy.api#httpQuery\": \"marker\"\n                    }\n                },\n                \"MaxItems\": {\n                    \"target\": \"smithy.api#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>(Optional) The maximum number of hosted zones that you want Amazon Route 53 to return.\\n\\t\\t\\tIf you have more than <code>maxitems</code> hosted zones, the value of\\n\\t\\t\\t\\t<code>IsTruncated</code> in the response is <code>true</code>, and the value of\\n\\t\\t\\t\\t<code>NextMarker</code> is the hosted zone ID of the first hosted zone that Route 53\\n\\t\\t\\twill return if you submit another request.</p>\",\n                        \"smithy.api#httpQuery\": \"maxitems\"\n                    }\n                },\n                \"DelegationSetId\": {\n                    \"target\": \"com.amazonaws.route53#ResourceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If you're using reusable delegation sets and you want to list all of the hosted zones\\n\\t\\t\\tthat are associated with a reusable delegation set, specify the ID of that reusable\\n\\t\\t\\tdelegation set. </p>\",\n                        \"smithy.api#httpQuery\": \"delegationsetid\"\n                    }\n                },\n                \"HostedZoneType\": {\n                    \"target\": \"com.amazonaws.route53#HostedZoneType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>\\n\\t\\t\\t(Optional) Specifies if the hosted zone is private.\\n\\t\\t</p>\",\n                        \"smithy.api#httpQuery\": \"hostedzonetype\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A request to retrieve a list of the public and private hosted zones that are\\n\\t\\t\\tassociated with the current Amazon Web Services account.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.route53#ListHostedZonesResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"HostedZones\": {\n                    \"target\": \"com.amazonaws.route53#HostedZones\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A complex type that contains general information about the hosted zone.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.route53#PageMarker\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>For the second and subsequent calls to <code>ListHostedZones</code>,\\n\\t\\t\\t\\t<code>Marker</code> is the value that you specified for the <code>marker</code>\\n\\t\\t\\tparameter in the request that produced the current response.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"IsTruncated\": {\n                    \"target\": \"com.amazonaws.route53#PageTruncated\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>A flag indicating whether there are more hosted zones to be listed. If the response\\n\\t\\t\\twas truncated, you can get more hosted zones by submitting another\\n\\t\\t\\t\\t<code>ListHostedZones</code> request and specifying the value of\\n\\t\\t\\t\\t<code>NextMarker</code> in the <code>marker</code> parameter.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"NextMarker\": {\n                    \"target\": \"com.amazonaws.route53#PageMarker\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If <code>IsTruncated</code> is <code>true</code>, the value of <code>NextMarker</code>\\n\\t\\t\\tidentifies the first hosted zone in the next group of hosted zones. Submit another\\n\\t\\t\\t\\t<code>ListHostedZones</code> request, and specify the value of\\n\\t\\t\\t\\t<code>NextMarker</code> from the response in the <code>marker</code>\\n\\t\\t\\tparameter.</p>\\n         <p>This element is present only if <code>IsTruncated</code> is <code>true</code>.</p>\"\n                    }\n                },\n                \"MaxItems\": {\n                    \"target\": \"smithy.api#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The value that you specified for the <code>maxitems</code> parameter in the call to\\n\\t\\t\\t\\t<code>ListHostedZones</code> that produced the current response.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.route53#ListQueryLoggingConfigs\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.route53#ListQueryLoggingConfigsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.route53#ListQueryLoggingConfigsResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidInput\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidPaginationToken\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#NoSuchHostedZone\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Lists the configurations for DNS query logging that are associated with the current\\n\\t\\t\\t\\tAmazon Web Services account or the configuration that is associated with a specified\\n\\t\\t\\thosted zone.</p>\\n         <p>For more information about DNS query logs, see <a href=\\\"https://docs.aws.amazon.com/Route53/latest/APIReference/API_CreateQueryLoggingConfig.html\\\">CreateQueryLoggingConfig</a>. Additional information, including the format of\\n\\t\\t\\tDNS query logs, appears in <a href=\\\"https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/query-logs.html\\\">Logging DNS Queries</a> in\\n\\t\\t\\tthe <i>Amazon Route 53 Developer Guide</i>.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/2013-04-01/queryloggingconfig\",\n                    \"code\": 200\n                },\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"QueryLoggingConfigs\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.route53#ListQueryLoggingConfigsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"HostedZoneId\": {\n                    \"target\": \"com.amazonaws.route53#ResourceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>(Optional) If you want to list the query logging configuration that is associated with\\n\\t\\t\\ta hosted zone, specify the ID in <code>HostedZoneId</code>. </p>\\n         <p>If you don't specify a hosted zone ID, <code>ListQueryLoggingConfigs</code> returns\\n\\t\\t\\tall of the configurations that are associated with the current Amazon Web Services account.</p>\",\n                        \"smithy.api#httpQuery\": \"hostedzoneid\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.route53#PaginationToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>(Optional) If the current Amazon Web Services account has more than\\n\\t\\t\\t\\t<code>MaxResults</code> query logging configurations, use <code>NextToken</code> to\\n\\t\\t\\tget the second and subsequent pages of results.</p>\\n         <p>For the first <code>ListQueryLoggingConfigs</code> request, omit this value.</p>\\n         <p>For the second and subsequent requests, get the value of <code>NextToken</code> from\\n\\t\\t\\tthe previous response and specify that value for <code>NextToken</code> in the\\n\\t\\t\\trequest.</p>\",\n                        \"smithy.api#httpQuery\": \"nexttoken\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"smithy.api#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>(Optional) The maximum number of query logging configurations that you want Amazon\\n\\t\\t\\tRoute 53 to return in response to the current request. If the current Amazon Web Services account has more than <code>MaxResults</code> configurations, use the\\n\\t\\t\\tvalue of <a href=\\\"https://docs.aws.amazon.com/Route53/latest/APIReference/API_ListQueryLoggingConfigs.html#API_ListQueryLoggingConfigs_RequestSyntax\\\">NextToken</a> in the response to get the next page of results.</p>\\n         <p>If you don't specify a value for <code>MaxResults</code>, Route 53 returns up to 100\\n\\t\\t\\tconfigurations.</p>\",\n                        \"smithy.api#httpQuery\": \"maxresults\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.route53#ListQueryLoggingConfigsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"QueryLoggingConfigs\": {\n                    \"target\": \"com.amazonaws.route53#QueryLoggingConfigs\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An array that contains one <a href=\\\"https://docs.aws.amazon.com/Route53/latest/APIReference/API_QueryLoggingConfig.html\\\">QueryLoggingConfig</a> element for each configuration for DNS query logging\\n\\t\\t\\tthat is associated with the current Amazon Web Services account.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.route53#PaginationToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If a response includes the last of the query logging configurations that are\\n\\t\\t\\tassociated with the current Amazon Web Services account, <code>NextToken</code> doesn't\\n\\t\\t\\tappear in the response.</p>\\n         <p>If a response doesn't include the last of the configurations, you can get more\\n\\t\\t\\tconfigurations by submitting another <a href=\\\"https://docs.aws.amazon.com/Route53/latest/APIReference/API_ListQueryLoggingConfigs.html\\\">ListQueryLoggingConfigs</a> request. Get the value of <code>NextToken</code>\\n\\t\\t\\tthat Amazon Route 53 returned in the previous response and include it in\\n\\t\\t\\t\\t<code>NextToken</code> in the next request.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.route53#ListResourceRecordSets\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.route53#ListResourceRecordSetsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.route53#ListResourceRecordSetsResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidInput\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#NoSuchHostedZone\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Lists the resource record sets in a specified hosted zone.</p>\\n         <p>\\n            <code>ListResourceRecordSets</code> returns up to 300 resource record sets at a time\\n\\t\\t\\tin ASCII order, beginning at a position specified by the <code>name</code> and\\n\\t\\t\\t\\t<code>type</code> elements.</p>\\n         <p>\\n            <b>Sort order</b>\\n         </p>\\n         <p>\\n            <code>ListResourceRecordSets</code> sorts results first by DNS name with the labels\\n\\t\\t\\treversed, for example:</p>\\n         <p>\\n            <code>com.example.www.</code>\\n         </p>\\n         <p>Note the trailing dot, which can change the sort order when the record name contains\\n\\t\\t\\tcharacters that appear before <code>.</code> (decimal 46) in the ASCII table. These\\n\\t\\t\\tcharacters include the following: <code>! \\\" # $ % & ' ( ) * + , -</code>\\n         </p>\\n         <p>When multiple records have the same DNS name, <code>ListResourceRecordSets</code>\\n\\t\\t\\tsorts results by the record type.</p>\\n         <p>\\n            <b>Specifying where to start listing records</b>\\n         </p>\\n         <p>You can use the name and type elements to specify the resource record set that the\\n\\t\\t\\tlist begins with:</p>\\n         <dl>\\n            <dt>If you do not specify Name or Type</dt>\\n            <dd>\\n               <p>The results begin with the first resource record set that the hosted zone\\n\\t\\t\\t\\t\\t\\tcontains.</p>\\n            </dd>\\n            <dt>If you specify Name but not Type</dt>\\n            <dd>\\n               <p>The results begin with the first resource record set in the list whose\\n\\t\\t\\t\\t\\t\\tname is greater than or equal to <code>Name</code>.</p>\\n            </dd>\\n            <dt>If you specify Type but not Name</dt>\\n            <dd>\\n               <p>Amazon Route 53 returns the <code>InvalidInput</code> error.</p>\\n            </dd>\\n            <dt>If you specify both Name and Type</dt>\\n            <dd>\\n               <p>The results begin with the first resource record set in the list whose\\n\\t\\t\\t\\t\\t\\tname is greater than or equal to <code>Name</code>, and whose type is\\n\\t\\t\\t\\t\\t\\tgreater than or equal to <code>Type</code>.</p>\\n               <note>\\n                  <p>Type is only used to sort between records with the same record Name.</p>\\n               </note>\\n            </dd>\\n         </dl>\\n         <p>\\n            <b>Resource record sets that are PENDING</b>\\n         </p>\\n         <p>This action returns the most current version of the records. This includes records\\n\\t\\t\\tthat are <code>PENDING</code>, and that are not yet available on all Route 53 DNS\\n\\t\\t\\tservers.</p>\\n         <p>\\n            <b>Changing resource record sets</b>\\n         </p>\\n         <p>To ensure that you get an accurate listing of the resource record sets for a hosted\\n\\t\\t\\tzone at a point in time, do not submit a <code>ChangeResourceRecordSets</code> request\\n\\t\\t\\twhile you're paging through the results of a <code>ListResourceRecordSets</code>\\n\\t\\t\\trequest. If you do, some pages may display results without the latest changes while\\n\\t\\t\\tother pages display results with the latest changes.</p>\\n         <p>\\n            <b>Displaying the next page of results</b>\\n         </p>\\n         <p>If a <code>ListResourceRecordSets</code> command returns more than one page of\\n\\t\\t\\tresults, the value of <code>IsTruncated</code> is <code>true</code>. To display the next\\n\\t\\t\\tpage of results, get the values of <code>NextRecordName</code>,\\n\\t\\t\\t\\t<code>NextRecordType</code>, and <code>NextRecordIdentifier</code> (if any) from the\\n\\t\\t\\tresponse. Then submit another <code>ListResourceRecordSets</code> request, and specify\\n\\t\\t\\tthose values for <code>StartRecordName</code>, <code>StartRecordType</code>, and\\n\\t\\t\\t\\t<code>StartRecordIdentifier</code>.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/2013-04-01/hostedzone/{HostedZoneId}/rrset\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.route53#ListResourceRecordSetsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"HostedZoneId\": {\n                    \"target\": \"com.amazonaws.route53#ResourceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the hosted zone that contains the resource record sets that you want to\\n\\t\\t\\tlist.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"StartRecordName\": {\n                    \"target\": \"com.amazonaws.route53#DNSName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The first name in the lexicographic ordering of resource record sets that you want to\\n\\t\\t\\tlist. If the specified record name doesn't exist, the results begin with the first\\n\\t\\t\\tresource record set that has a name greater than the value of <code>name</code>.</p>\",\n                        \"smithy.api#httpQuery\": \"name\"\n                    }\n                },\n                \"StartRecordType\": {\n                    \"target\": \"com.amazonaws.route53#RRType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of resource record set to begin the record listing from.</p>\\n         <p>Valid values for basic resource record sets: <code>A</code> | <code>AAAA</code> |\\n\\t\\t\\t\\t<code>CAA</code> | <code>CNAME</code> | <code>MX</code> | <code>NAPTR</code> |\\n\\t\\t\\t\\t<code>NS</code> | <code>PTR</code> | <code>SOA</code> | <code>SPF</code> |\\n\\t\\t\\t\\t<code>SRV</code> | <code>TXT</code>\\n         </p>\\n         <p>Values for weighted, latency, geolocation, and failover resource record sets:\\n\\t\\t\\t\\t<code>A</code> | <code>AAAA</code> | <code>CAA</code> | <code>CNAME</code> |\\n\\t\\t\\t\\t<code>MX</code> | <code>NAPTR</code> | <code>PTR</code> | <code>SPF</code> |\\n\\t\\t\\t\\t<code>SRV</code> | <code>TXT</code>\\n         </p>\\n         <p>Values for alias resource record sets: </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <b>API Gateway custom regional API or edge-optimized\\n\\t\\t\\t\\t\\t\\tAPI</b>: A</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>CloudFront distribution</b>: A or AAAA</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>Elastic Beanstalk environment that has a regionalized\\n\\t\\t\\t\\t\\t\\tsubdomain</b>: A</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>Elastic Load Balancing load balancer</b>: A |\\n\\t\\t\\t\\t\\tAAAA</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>S3 bucket</b>: A</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>VPC interface VPC endpoint</b>: A</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>Another resource record set in this hosted\\n\\t\\t\\t\\t\\t\\tzone:</b> The type of the resource record set that the alias\\n\\t\\t\\t\\t\\treferences.</p>\\n            </li>\\n         </ul>\\n         <p>Constraint: Specifying <code>type</code> without specifying <code>name</code> returns\\n\\t\\t\\tan <code>InvalidInput</code> error.</p>\",\n                        \"smithy.api#httpQuery\": \"type\"\n                    }\n                },\n                \"StartRecordIdentifier\": {\n                    \"target\": \"com.amazonaws.route53#ResourceRecordSetIdentifier\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>\\n            <i>Resource record sets that have a routing policy other than\\n\\t\\t\\t\\tsimple:</i> If results were truncated for a given DNS name and type, specify\\n\\t\\t\\tthe value of <code>NextRecordIdentifier</code> from the previous response to get the\\n\\t\\t\\tnext resource record set that has the current DNS name and type.</p>\",\n                        \"smithy.api#httpQuery\": \"identifier\"\n                    }\n                },\n                \"MaxItems\": {\n                    \"target\": \"smithy.api#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>(Optional) The maximum number of resource records sets to include in the response body\\n\\t\\t\\tfor this request. If the response includes more than <code>maxitems</code> resource\\n\\t\\t\\trecord sets, the value of the <code>IsTruncated</code> element in the response is\\n\\t\\t\\t\\t<code>true</code>, and the values of the <code>NextRecordName</code> and\\n\\t\\t\\t\\t<code>NextRecordType</code> elements in the response identify the first resource\\n\\t\\t\\trecord set in the next group of <code>maxitems</code> resource record sets.</p>\",\n                        \"smithy.api#httpQuery\": \"maxitems\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A request for the resource record sets that are associated with a specified hosted\\n\\t\\t\\tzone.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.route53#ListResourceRecordSetsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ResourceRecordSets\": {\n                    \"target\": \"com.amazonaws.route53#ResourceRecordSets\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Information about multiple resource record sets.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"IsTruncated\": {\n                    \"target\": \"com.amazonaws.route53#PageTruncated\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>A flag that indicates whether more resource record sets remain to be listed. If your\\n\\t\\t\\tresults were truncated, you can make a follow-up pagination request by using the\\n\\t\\t\\t\\t<code>NextRecordName</code> element.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"NextRecordName\": {\n                    \"target\": \"com.amazonaws.route53#DNSName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If the results were truncated, the name of the next record in the list.</p>\\n         <p>This element is present only if <code>IsTruncated</code> is true. </p>\"\n                    }\n                },\n                \"NextRecordType\": {\n                    \"target\": \"com.amazonaws.route53#RRType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If the results were truncated, the type of the next record in the list.</p>\\n         <p>This element is present only if <code>IsTruncated</code> is true. </p>\"\n                    }\n                },\n                \"NextRecordIdentifier\": {\n                    \"target\": \"com.amazonaws.route53#ResourceRecordSetIdentifier\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>\\n            <i>Resource record sets that have a routing policy other than\\n\\t\\t\\t\\tsimple:</i> If results were truncated for a given DNS name and type, the\\n\\t\\t\\tvalue of <code>SetIdentifier</code> for the next resource record set that has the\\n\\t\\t\\tcurrent DNS name and type.</p>\\n         <p>For information about routing policies, see <a href=\\\"https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/routing-policy.html\\\">Choosing a Routing\\n\\t\\t\\t\\tPolicy</a> in the <i>Amazon Route 53 Developer Guide</i>.</p>\"\n                    }\n                },\n                \"MaxItems\": {\n                    \"target\": \"smithy.api#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of records you requested.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that contains list information for the resource record set.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.route53#ListReusableDelegationSets\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.route53#ListReusableDelegationSetsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.route53#ListReusableDelegationSetsResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidInput\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Retrieves a list of the reusable delegation sets that are associated with the current\\n\\t\\t\\t\\tAmazon Web Services account.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/2013-04-01/delegationset\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.route53#ListReusableDelegationSetsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.route53#PageMarker\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If the value of <code>IsTruncated</code> in the previous response was\\n\\t\\t\\t\\t<code>true</code>, you have more reusable delegation sets. To get another group,\\n\\t\\t\\tsubmit another <code>ListReusableDelegationSets</code> request. </p>\\n         <p>For the value of <code>marker</code>, specify the value of <code>NextMarker</code>\\n\\t\\t\\tfrom the previous response, which is the ID of the first reusable delegation set that\\n\\t\\t\\tAmazon Route 53 will return if you submit another request.</p>\\n         <p>If the value of <code>IsTruncated</code> in the previous response was\\n\\t\\t\\t\\t<code>false</code>, there are no more reusable delegation sets to get.</p>\",\n                        \"smithy.api#httpQuery\": \"marker\"\n                    }\n                },\n                \"MaxItems\": {\n                    \"target\": \"smithy.api#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of reusable delegation sets that you want Amazon Route 53 to return in the\\n\\t\\t\\tresponse to this request. If you specify a value greater than 100, Route 53 returns only\\n\\t\\t\\tthe first 100 reusable delegation sets.</p>\",\n                        \"smithy.api#httpQuery\": \"maxitems\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A request to get a list of the reusable delegation sets that are associated with the\\n\\t\\t\\tcurrent Amazon Web Services account.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.route53#ListReusableDelegationSetsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DelegationSets\": {\n                    \"target\": \"com.amazonaws.route53#DelegationSets\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A complex type that contains one <code>DelegationSet</code> element for each reusable\\n\\t\\t\\tdelegation set that was created by the current Amazon Web Services account.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Marker\": {\n                    \"target\": \"com.amazonaws.route53#PageMarker\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>For the second and subsequent calls to <code>ListReusableDelegationSets</code>,\\n\\t\\t\\t\\t<code>Marker</code> is the value that you specified for the <code>marker</code>\\n\\t\\t\\tparameter in the request that produced the current response.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"IsTruncated\": {\n                    \"target\": \"com.amazonaws.route53#PageTruncated\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>A flag that indicates whether there are more reusable delegation sets to be\\n\\t\\t\\tlisted.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"NextMarker\": {\n                    \"target\": \"com.amazonaws.route53#PageMarker\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If <code>IsTruncated</code> is <code>true</code>, the value of <code>NextMarker</code>\\n\\t\\t\\tidentifies the next reusable delegation set that Amazon Route 53 will return if you\\n\\t\\t\\tsubmit another <code>ListReusableDelegationSets</code> request and specify the value of\\n\\t\\t\\t\\t<code>NextMarker</code> in the <code>marker</code> parameter.</p>\"\n                    }\n                },\n                \"MaxItems\": {\n                    \"target\": \"smithy.api#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The value that you specified for the <code>maxitems</code> parameter in the call to\\n\\t\\t\\t\\t<code>ListReusableDelegationSets</code> that produced the current response.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that contains information about the reusable delegation sets that are\\n\\t\\t\\tassociated with the current Amazon Web Services account.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.route53#ListTagsForResource\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.route53#ListTagsForResourceRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.route53#ListTagsForResourceResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidInput\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#NoSuchHealthCheck\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#NoSuchHostedZone\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#PriorRequestNotComplete\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#ThrottlingException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Lists tags for one health check or hosted zone. </p>\\n         <p>For information about using tags for cost allocation, see <a href=\\\"https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/cost-alloc-tags.html\\\">Using Cost Allocation\\n\\t\\t\\t\\tTags</a> in the <i>Billing and Cost Management User Guide</i>.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/2013-04-01/tags/{ResourceType}/{ResourceId}\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.route53#ListTagsForResourceRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ResourceType\": {\n                    \"target\": \"com.amazonaws.route53#TagResourceType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of the resource.</p>\\n         <ul>\\n            <li>\\n               <p>The resource type for health checks is <code>healthcheck</code>.</p>\\n            </li>\\n            <li>\\n               <p>The resource type for hosted zones is <code>hostedzone</code>.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ResourceId\": {\n                    \"target\": \"com.amazonaws.route53#TagResourceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the resource for which you want to retrieve tags.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type containing information about a request for a list of the tags that are\\n\\t\\t\\tassociated with an individual resource.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.route53#ListTagsForResourceResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ResourceTagSet\": {\n                    \"target\": \"com.amazonaws.route53#ResourceTagSet\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A <code>ResourceTagSet</code> containing tags associated with the specified\\n\\t\\t\\tresource.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that contains information about the health checks or hosted zones for\\n\\t\\t\\twhich you want to list tags.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.route53#ListTagsForResources\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.route53#ListTagsForResourcesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.route53#ListTagsForResourcesResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidInput\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#NoSuchHealthCheck\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#NoSuchHostedZone\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#PriorRequestNotComplete\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#ThrottlingException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Lists tags for up to 10 health checks or hosted zones.</p>\\n         <p>For information about using tags for cost allocation, see <a href=\\\"https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/cost-alloc-tags.html\\\">Using Cost Allocation\\n\\t\\t\\t\\tTags</a> in the <i>Billing and Cost Management User Guide</i>.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"POST\",\n                    \"uri\": \"/2013-04-01/tags/{ResourceType}\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.route53#ListTagsForResourcesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ResourceType\": {\n                    \"target\": \"com.amazonaws.route53#TagResourceType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of the resources.</p>\\n         <ul>\\n            <li>\\n               <p>The resource type for health checks is <code>healthcheck</code>.</p>\\n            </li>\\n            <li>\\n               <p>The resource type for hosted zones is <code>hostedzone</code>.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ResourceIds\": {\n                    \"target\": \"com.amazonaws.route53#TagResourceIdList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A complex type that contains the ResourceId element for each resource for which you\\n\\t\\t\\twant to get a list of tags.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that contains information about the health checks or hosted zones for\\n\\t\\t\\twhich you want to list tags.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.route53#ListTagsForResourcesResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ResourceTagSets\": {\n                    \"target\": \"com.amazonaws.route53#ResourceTagSetList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of <code>ResourceTagSet</code>s containing tags associated with the specified\\n\\t\\t\\tresources.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type containing tags for the specified resources.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.route53#ListTrafficPolicies\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.route53#ListTrafficPoliciesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.route53#ListTrafficPoliciesResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidInput\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Gets information about the latest version for every traffic policy that is associated\\n\\t\\t\\twith the current Amazon Web Services account. Policies are listed in the order that they\\n\\t\\t\\twere created in. </p>\\n         <p>For information about how of deleting a traffic policy affects the response from\\n\\t\\t\\t\\t<code>ListTrafficPolicies</code>, see <a href=\\\"https://docs.aws.amazon.com/Route53/latest/APIReference/API_DeleteTrafficPolicy.html\\\">DeleteTrafficPolicy</a>. </p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/2013-04-01/trafficpolicies\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.route53#ListTrafficPoliciesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TrafficPolicyIdMarker\": {\n                    \"target\": \"com.amazonaws.route53#TrafficPolicyId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>(Conditional) For your first request to <code>ListTrafficPolicies</code>, don't\\n\\t\\t\\tinclude the <code>TrafficPolicyIdMarker</code> parameter.</p>\\n         <p>If you have more traffic policies than the value of <code>MaxItems</code>,\\n\\t\\t\\t\\t<code>ListTrafficPolicies</code> returns only the first <code>MaxItems</code>\\n\\t\\t\\ttraffic policies. To get the next group of policies, submit another request to\\n\\t\\t\\t\\t<code>ListTrafficPolicies</code>. For the value of\\n\\t\\t\\t\\t<code>TrafficPolicyIdMarker</code>, specify the value of\\n\\t\\t\\t\\t<code>TrafficPolicyIdMarker</code> that was returned in the previous\\n\\t\\t\\tresponse.</p>\",\n                        \"smithy.api#httpQuery\": \"trafficpolicyid\"\n                    }\n                },\n                \"MaxItems\": {\n                    \"target\": \"smithy.api#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>(Optional) The maximum number of traffic policies that you want Amazon Route 53 to\\n\\t\\t\\treturn in response to this request. If you have more than <code>MaxItems</code> traffic\\n\\t\\t\\tpolicies, the value of <code>IsTruncated</code> in the response is <code>true</code>,\\n\\t\\t\\tand the value of <code>TrafficPolicyIdMarker</code> is the ID of the first traffic\\n\\t\\t\\tpolicy that Route 53 will return if you submit another request.</p>\",\n                        \"smithy.api#httpQuery\": \"maxitems\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that contains the information about the request to list the traffic\\n\\t\\t\\tpolicies that are associated with the current Amazon Web Services account.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.route53#ListTrafficPoliciesResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TrafficPolicySummaries\": {\n                    \"target\": \"com.amazonaws.route53#TrafficPolicySummaries\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list that contains one <code>TrafficPolicySummary</code> element for each traffic\\n\\t\\t\\tpolicy that was created by the current Amazon Web Services account.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"IsTruncated\": {\n                    \"target\": \"com.amazonaws.route53#PageTruncated\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>A flag that indicates whether there are more traffic policies to be listed. If the\\n\\t\\t\\tresponse was truncated, you can get the next group of traffic policies by submitting\\n\\t\\t\\tanother <code>ListTrafficPolicies</code> request and specifying the value of\\n\\t\\t\\t\\t<code>TrafficPolicyIdMarker</code> in the <code>TrafficPolicyIdMarker</code> request\\n\\t\\t\\tparameter.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TrafficPolicyIdMarker\": {\n                    \"target\": \"com.amazonaws.route53#TrafficPolicyId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If the value of <code>IsTruncated</code> is <code>true</code>,\\n\\t\\t\\t\\t<code>TrafficPolicyIdMarker</code> is the ID of the first traffic policy in the next\\n\\t\\t\\tgroup of <code>MaxItems</code> traffic policies.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"MaxItems\": {\n                    \"target\": \"smithy.api#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The value that you specified for the <code>MaxItems</code> parameter in the\\n\\t\\t\\t\\t<code>ListTrafficPolicies</code> request that produced the current response.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that contains the response information for the request.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.route53#ListTrafficPolicyInstances\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.route53#ListTrafficPolicyInstancesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.route53#ListTrafficPolicyInstancesResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidInput\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#NoSuchTrafficPolicyInstance\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Gets information about the traffic policy instances that you created by using the\\n\\t\\t\\tcurrent Amazon Web Services account.</p>\\n         <note>\\n            <p>After you submit an <code>UpdateTrafficPolicyInstance</code> request, there's a\\n\\t\\t\\t\\tbrief delay while Amazon Route 53 creates the resource record sets that are\\n\\t\\t\\t\\tspecified in the traffic policy definition. For more information, see the\\n\\t\\t\\t\\t\\t<code>State</code> response element.</p>\\n         </note>\\n         <p>Route 53 returns a maximum of 100 items in each response. If you have a lot of traffic\\n\\t\\t\\tpolicy instances, you can use the <code>MaxItems</code> parameter to list them in groups\\n\\t\\t\\tof up to 100.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/2013-04-01/trafficpolicyinstances\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.route53#ListTrafficPolicyInstancesByHostedZone\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.route53#ListTrafficPolicyInstancesByHostedZoneRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.route53#ListTrafficPolicyInstancesByHostedZoneResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidInput\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#NoSuchHostedZone\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#NoSuchTrafficPolicyInstance\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Gets information about the traffic policy instances that you created in a specified\\n\\t\\t\\thosted zone.</p>\\n         <note>\\n            <p>After you submit a <code>CreateTrafficPolicyInstance</code> or an\\n\\t\\t\\t\\t\\t<code>UpdateTrafficPolicyInstance</code> request, there's a brief delay while\\n\\t\\t\\t\\tAmazon Route 53 creates the resource record sets that are specified in the traffic\\n\\t\\t\\t\\tpolicy definition. For more information, see the <code>State</code> response\\n\\t\\t\\t\\telement.</p>\\n         </note>\\n         <p>Route 53 returns a maximum of 100 items in each response. If you have a lot of traffic\\n\\t\\t\\tpolicy instances, you can use the <code>MaxItems</code> parameter to list them in groups\\n\\t\\t\\tof up to 100.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/2013-04-01/trafficpolicyinstances/hostedzone\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.route53#ListTrafficPolicyInstancesByHostedZoneRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"HostedZoneId\": {\n                    \"target\": \"com.amazonaws.route53#ResourceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the hosted zone that you want to list traffic policy instances for.</p>\",\n                        \"smithy.api#httpQuery\": \"id\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TrafficPolicyInstanceNameMarker\": {\n                    \"target\": \"com.amazonaws.route53#DNSName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If the value of <code>IsTruncated</code> in the previous response is true, you have\\n\\t\\t\\tmore traffic policy instances. To get more traffic policy instances, submit another\\n\\t\\t\\t\\t<code>ListTrafficPolicyInstances</code> request. For the value of\\n\\t\\t\\t\\t<code>trafficpolicyinstancename</code>, specify the value of\\n\\t\\t\\t\\t<code>TrafficPolicyInstanceNameMarker</code> from the previous response, which is\\n\\t\\t\\tthe name of the first traffic policy instance in the next group of traffic policy\\n\\t\\t\\tinstances.</p>\\n         <p>If the value of <code>IsTruncated</code> in the previous response was\\n\\t\\t\\t\\t<code>false</code>, there are no more traffic policy instances to get.</p>\",\n                        \"smithy.api#httpQuery\": \"trafficpolicyinstancename\"\n                    }\n                },\n                \"TrafficPolicyInstanceTypeMarker\": {\n                    \"target\": \"com.amazonaws.route53#RRType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If the value of <code>IsTruncated</code> in the previous response is true, you have\\n\\t\\t\\tmore traffic policy instances. To get more traffic policy instances, submit another\\n\\t\\t\\t\\t<code>ListTrafficPolicyInstances</code> request. For the value of\\n\\t\\t\\t\\t<code>trafficpolicyinstancetype</code>, specify the value of\\n\\t\\t\\t\\t<code>TrafficPolicyInstanceTypeMarker</code> from the previous response, which is\\n\\t\\t\\tthe type of the first traffic policy instance in the next group of traffic policy\\n\\t\\t\\tinstances.</p>\\n         <p>If the value of <code>IsTruncated</code> in the previous response was\\n\\t\\t\\t\\t<code>false</code>, there are no more traffic policy instances to get.</p>\",\n                        \"smithy.api#httpQuery\": \"trafficpolicyinstancetype\"\n                    }\n                },\n                \"MaxItems\": {\n                    \"target\": \"smithy.api#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of traffic policy instances to be included in the response body for\\n\\t\\t\\tthis request. If you have more than <code>MaxItems</code> traffic policy instances, the\\n\\t\\t\\tvalue of the <code>IsTruncated</code> element in the response is <code>true</code>, and\\n\\t\\t\\tthe values of <code>HostedZoneIdMarker</code>,\\n\\t\\t\\t\\t<code>TrafficPolicyInstanceNameMarker</code>, and\\n\\t\\t\\t\\t<code>TrafficPolicyInstanceTypeMarker</code> represent the first traffic policy\\n\\t\\t\\tinstance that Amazon Route 53 will return if you submit another request.</p>\",\n                        \"smithy.api#httpQuery\": \"maxitems\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A request for the traffic policy instances that you created in a specified hosted\\n\\t\\t\\tzone.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.route53#ListTrafficPolicyInstancesByHostedZoneResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TrafficPolicyInstances\": {\n                    \"target\": \"com.amazonaws.route53#TrafficPolicyInstances\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list that contains one <code>TrafficPolicyInstance</code> element for each traffic\\n\\t\\t\\tpolicy instance that matches the elements in the request. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TrafficPolicyInstanceNameMarker\": {\n                    \"target\": \"com.amazonaws.route53#DNSName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If <code>IsTruncated</code> is <code>true</code>,\\n\\t\\t\\t\\t<code>TrafficPolicyInstanceNameMarker</code> is the name of the first traffic policy\\n\\t\\t\\tinstance in the next group of traffic policy instances.</p>\"\n                    }\n                },\n                \"TrafficPolicyInstanceTypeMarker\": {\n                    \"target\": \"com.amazonaws.route53#RRType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If <code>IsTruncated</code> is true, <code>TrafficPolicyInstanceTypeMarker</code> is\\n\\t\\t\\tthe DNS type of the resource record sets that are associated with the first traffic\\n\\t\\t\\tpolicy instance in the next group of traffic policy instances.</p>\"\n                    }\n                },\n                \"IsTruncated\": {\n                    \"target\": \"com.amazonaws.route53#PageTruncated\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>A flag that indicates whether there are more traffic policy instances to be listed. If\\n\\t\\t\\tthe response was truncated, you can get the next group of traffic policy instances by\\n\\t\\t\\tsubmitting another <code>ListTrafficPolicyInstancesByHostedZone</code> request and\\n\\t\\t\\tspecifying the values of <code>HostedZoneIdMarker</code>,\\n\\t\\t\\t\\t<code>TrafficPolicyInstanceNameMarker</code>, and\\n\\t\\t\\t\\t<code>TrafficPolicyInstanceTypeMarker</code> in the corresponding request\\n\\t\\t\\tparameters.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"MaxItems\": {\n                    \"target\": \"smithy.api#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The value that you specified for the <code>MaxItems</code> parameter in the\\n\\t\\t\\t\\t<code>ListTrafficPolicyInstancesByHostedZone</code> request that produced the\\n\\t\\t\\tcurrent response.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that contains the response information for the request.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.route53#ListTrafficPolicyInstancesByPolicy\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.route53#ListTrafficPolicyInstancesByPolicyRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.route53#ListTrafficPolicyInstancesByPolicyResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidInput\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#NoSuchTrafficPolicy\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#NoSuchTrafficPolicyInstance\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Gets information about the traffic policy instances that you created by using a\\n\\t\\t\\tspecify traffic policy version.</p>\\n         <note>\\n            <p>After you submit a <code>CreateTrafficPolicyInstance</code> or an\\n\\t\\t\\t\\t\\t<code>UpdateTrafficPolicyInstance</code> request, there's a brief delay while\\n\\t\\t\\t\\tAmazon Route 53 creates the resource record sets that are specified in the traffic\\n\\t\\t\\t\\tpolicy definition. For more information, see the <code>State</code> response\\n\\t\\t\\t\\telement.</p>\\n         </note>\\n         <p>Route 53 returns a maximum of 100 items in each response. If you have a lot of traffic\\n\\t\\t\\tpolicy instances, you can use the <code>MaxItems</code> parameter to list them in groups\\n\\t\\t\\tof up to 100.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/2013-04-01/trafficpolicyinstances/trafficpolicy\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.route53#ListTrafficPolicyInstancesByPolicyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TrafficPolicyId\": {\n                    \"target\": \"com.amazonaws.route53#TrafficPolicyId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the traffic policy for which you want to list traffic policy\\n\\t\\t\\tinstances.</p>\",\n                        \"smithy.api#httpQuery\": \"id\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TrafficPolicyVersion\": {\n                    \"target\": \"com.amazonaws.route53#TrafficPolicyVersion\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The version of the traffic policy for which you want to list traffic policy instances.\\n\\t\\t\\tThe version must be associated with the traffic policy that is specified by\\n\\t\\t\\t\\t<code>TrafficPolicyId</code>.</p>\",\n                        \"smithy.api#httpQuery\": \"version\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"HostedZoneIdMarker\": {\n                    \"target\": \"com.amazonaws.route53#ResourceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If the value of <code>IsTruncated</code> in the previous response was\\n\\t\\t\\t\\t<code>true</code>, you have more traffic policy instances. To get more traffic\\n\\t\\t\\tpolicy instances, submit another <code>ListTrafficPolicyInstancesByPolicy</code>\\n\\t\\t\\trequest. </p>\\n         <p>For the value of <code>hostedzoneid</code>, specify the value of\\n\\t\\t\\t\\t<code>HostedZoneIdMarker</code> from the previous response, which is the hosted zone\\n\\t\\t\\tID of the first traffic policy instance that Amazon Route 53 will return if you submit\\n\\t\\t\\tanother request.</p>\\n         <p>If the value of <code>IsTruncated</code> in the previous response was\\n\\t\\t\\t\\t<code>false</code>, there are no more traffic policy instances to get.</p>\",\n                        \"smithy.api#httpQuery\": \"hostedzoneid\"\n                    }\n                },\n                \"TrafficPolicyInstanceNameMarker\": {\n                    \"target\": \"com.amazonaws.route53#DNSName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If the value of <code>IsTruncated</code> in the previous response was\\n\\t\\t\\t\\t<code>true</code>, you have more traffic policy instances. To get more traffic\\n\\t\\t\\tpolicy instances, submit another <code>ListTrafficPolicyInstancesByPolicy</code>\\n\\t\\t\\trequest.</p>\\n         <p>For the value of <code>trafficpolicyinstancename</code>, specify the value of\\n\\t\\t\\t\\t<code>TrafficPolicyInstanceNameMarker</code> from the previous response, which is\\n\\t\\t\\tthe name of the first traffic policy instance that Amazon Route 53 will return if you\\n\\t\\t\\tsubmit another request.</p>\\n         <p>If the value of <code>IsTruncated</code> in the previous response was\\n\\t\\t\\t\\t<code>false</code>, there are no more traffic policy instances to get.</p>\",\n                        \"smithy.api#httpQuery\": \"trafficpolicyinstancename\"\n                    }\n                },\n                \"TrafficPolicyInstanceTypeMarker\": {\n                    \"target\": \"com.amazonaws.route53#RRType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If the value of <code>IsTruncated</code> in the previous response was\\n\\t\\t\\t\\t<code>true</code>, you have more traffic policy instances. To get more traffic\\n\\t\\t\\tpolicy instances, submit another <code>ListTrafficPolicyInstancesByPolicy</code>\\n\\t\\t\\trequest.</p>\\n         <p>For the value of <code>trafficpolicyinstancetype</code>, specify the value of\\n\\t\\t\\t\\t<code>TrafficPolicyInstanceTypeMarker</code> from the previous response, which is\\n\\t\\t\\tthe name of the first traffic policy instance that Amazon Route 53 will return if you\\n\\t\\t\\tsubmit another request.</p>\\n         <p>If the value of <code>IsTruncated</code> in the previous response was\\n\\t\\t\\t\\t<code>false</code>, there are no more traffic policy instances to get.</p>\",\n                        \"smithy.api#httpQuery\": \"trafficpolicyinstancetype\"\n                    }\n                },\n                \"MaxItems\": {\n                    \"target\": \"smithy.api#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of traffic policy instances to be included in the response body for\\n\\t\\t\\tthis request. If you have more than <code>MaxItems</code> traffic policy instances, the\\n\\t\\t\\tvalue of the <code>IsTruncated</code> element in the response is <code>true</code>, and\\n\\t\\t\\tthe values of <code>HostedZoneIdMarker</code>,\\n\\t\\t\\t\\t<code>TrafficPolicyInstanceNameMarker</code>, and\\n\\t\\t\\t\\t<code>TrafficPolicyInstanceTypeMarker</code> represent the first traffic policy\\n\\t\\t\\tinstance that Amazon Route 53 will return if you submit another request.</p>\",\n                        \"smithy.api#httpQuery\": \"maxitems\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that contains the information about the request to list your traffic\\n\\t\\t\\tpolicy instances.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.route53#ListTrafficPolicyInstancesByPolicyResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TrafficPolicyInstances\": {\n                    \"target\": \"com.amazonaws.route53#TrafficPolicyInstances\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list that contains one <code>TrafficPolicyInstance</code> element for each traffic\\n\\t\\t\\tpolicy instance that matches the elements in the request.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"HostedZoneIdMarker\": {\n                    \"target\": \"com.amazonaws.route53#ResourceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If <code>IsTruncated</code> is <code>true</code>, <code>HostedZoneIdMarker</code> is\\n\\t\\t\\tthe ID of the hosted zone of the first traffic policy instance in the next group of\\n\\t\\t\\ttraffic policy instances.</p>\"\n                    }\n                },\n                \"TrafficPolicyInstanceNameMarker\": {\n                    \"target\": \"com.amazonaws.route53#DNSName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If <code>IsTruncated</code> is <code>true</code>,\\n\\t\\t\\t\\t<code>TrafficPolicyInstanceNameMarker</code> is the name of the first traffic policy\\n\\t\\t\\tinstance in the next group of <code>MaxItems</code> traffic policy instances.</p>\"\n                    }\n                },\n                \"TrafficPolicyInstanceTypeMarker\": {\n                    \"target\": \"com.amazonaws.route53#RRType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If <code>IsTruncated</code> is <code>true</code>,\\n\\t\\t\\t\\t<code>TrafficPolicyInstanceTypeMarker</code> is the DNS type of the resource record\\n\\t\\t\\tsets that are associated with the first traffic policy instance in the next group of\\n\\t\\t\\t\\t<code>MaxItems</code> traffic policy instances.</p>\"\n                    }\n                },\n                \"IsTruncated\": {\n                    \"target\": \"com.amazonaws.route53#PageTruncated\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>A flag that indicates whether there are more traffic policy instances to be listed. If\\n\\t\\t\\tthe response was truncated, you can get the next group of traffic policy instances by\\n\\t\\t\\tcalling <code>ListTrafficPolicyInstancesByPolicy</code> again and specifying the values\\n\\t\\t\\tof the <code>HostedZoneIdMarker</code>, <code>TrafficPolicyInstanceNameMarker</code>,\\n\\t\\t\\tand <code>TrafficPolicyInstanceTypeMarker</code> elements in the corresponding request\\n\\t\\t\\tparameters.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"MaxItems\": {\n                    \"target\": \"smithy.api#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The value that you specified for the <code>MaxItems</code> parameter in the call to\\n\\t\\t\\t\\t<code>ListTrafficPolicyInstancesByPolicy</code> that produced the current\\n\\t\\t\\tresponse.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that contains the response information for the request.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.route53#ListTrafficPolicyInstancesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"HostedZoneIdMarker\": {\n                    \"target\": \"com.amazonaws.route53#ResourceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If the value of <code>IsTruncated</code> in the previous response was\\n\\t\\t\\t\\t<code>true</code>, you have more traffic policy instances. To get more traffic\\n\\t\\t\\tpolicy instances, submit another <code>ListTrafficPolicyInstances</code> request. For\\n\\t\\t\\tthe value of <code>HostedZoneId</code>, specify the value of\\n\\t\\t\\t\\t<code>HostedZoneIdMarker</code> from the previous response, which is the hosted zone\\n\\t\\t\\tID of the first traffic policy instance in the next group of traffic policy\\n\\t\\t\\tinstances.</p>\\n         <p>If the value of <code>IsTruncated</code> in the previous response was\\n\\t\\t\\t\\t<code>false</code>, there are no more traffic policy instances to get.</p>\",\n                        \"smithy.api#httpQuery\": \"hostedzoneid\"\n                    }\n                },\n                \"TrafficPolicyInstanceNameMarker\": {\n                    \"target\": \"com.amazonaws.route53#DNSName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If the value of <code>IsTruncated</code> in the previous response was\\n\\t\\t\\t\\t<code>true</code>, you have more traffic policy instances. To get more traffic\\n\\t\\t\\tpolicy instances, submit another <code>ListTrafficPolicyInstances</code> request. For\\n\\t\\t\\tthe value of <code>trafficpolicyinstancename</code>, specify the value of\\n\\t\\t\\t\\t<code>TrafficPolicyInstanceNameMarker</code> from the previous response, which is\\n\\t\\t\\tthe name of the first traffic policy instance in the next group of traffic policy\\n\\t\\t\\tinstances.</p>\\n         <p>If the value of <code>IsTruncated</code> in the previous response was\\n\\t\\t\\t\\t<code>false</code>, there are no more traffic policy instances to get.</p>\",\n                        \"smithy.api#httpQuery\": \"trafficpolicyinstancename\"\n                    }\n                },\n                \"TrafficPolicyInstanceTypeMarker\": {\n                    \"target\": \"com.amazonaws.route53#RRType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If the value of <code>IsTruncated</code> in the previous response was\\n\\t\\t\\t\\t<code>true</code>, you have more traffic policy instances. To get more traffic\\n\\t\\t\\tpolicy instances, submit another <code>ListTrafficPolicyInstances</code> request. For\\n\\t\\t\\tthe value of <code>trafficpolicyinstancetype</code>, specify the value of\\n\\t\\t\\t\\t<code>TrafficPolicyInstanceTypeMarker</code> from the previous response, which is\\n\\t\\t\\tthe type of the first traffic policy instance in the next group of traffic policy\\n\\t\\t\\tinstances.</p>\\n         <p>If the value of <code>IsTruncated</code> in the previous response was\\n\\t\\t\\t\\t<code>false</code>, there are no more traffic policy instances to get.</p>\",\n                        \"smithy.api#httpQuery\": \"trafficpolicyinstancetype\"\n                    }\n                },\n                \"MaxItems\": {\n                    \"target\": \"smithy.api#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of traffic policy instances that you want Amazon Route 53 to return\\n\\t\\t\\tin response to a <code>ListTrafficPolicyInstances</code> request. If you have more than\\n\\t\\t\\t\\t<code>MaxItems</code> traffic policy instances, the value of the\\n\\t\\t\\t\\t<code>IsTruncated</code> element in the response is <code>true</code>, and the\\n\\t\\t\\tvalues of <code>HostedZoneIdMarker</code>, <code>TrafficPolicyInstanceNameMarker</code>,\\n\\t\\t\\tand <code>TrafficPolicyInstanceTypeMarker</code> represent the first traffic policy\\n\\t\\t\\tinstance in the next group of <code>MaxItems</code> traffic policy instances.</p>\",\n                        \"smithy.api#httpQuery\": \"maxitems\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A request to get information about the traffic policy instances that you created by\\n\\t\\t\\tusing the current Amazon Web Services account.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.route53#ListTrafficPolicyInstancesResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TrafficPolicyInstances\": {\n                    \"target\": \"com.amazonaws.route53#TrafficPolicyInstances\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list that contains one <code>TrafficPolicyInstance</code> element for each traffic\\n\\t\\t\\tpolicy instance that matches the elements in the request.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"HostedZoneIdMarker\": {\n                    \"target\": \"com.amazonaws.route53#ResourceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If <code>IsTruncated</code> is <code>true</code>, <code>HostedZoneIdMarker</code> is\\n\\t\\t\\tthe ID of the hosted zone of the first traffic policy instance that Route 53 will return\\n\\t\\t\\tif you submit another <code>ListTrafficPolicyInstances</code> request. </p>\"\n                    }\n                },\n                \"TrafficPolicyInstanceNameMarker\": {\n                    \"target\": \"com.amazonaws.route53#DNSName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If <code>IsTruncated</code> is <code>true</code>,\\n\\t\\t\\t\\t<code>TrafficPolicyInstanceNameMarker</code> is the name of the first traffic policy\\n\\t\\t\\tinstance that Route 53 will return if you submit another\\n\\t\\t\\t\\t<code>ListTrafficPolicyInstances</code> request. </p>\"\n                    }\n                },\n                \"TrafficPolicyInstanceTypeMarker\": {\n                    \"target\": \"com.amazonaws.route53#RRType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If <code>IsTruncated</code> is <code>true</code>,\\n\\t\\t\\t\\t<code>TrafficPolicyInstanceTypeMarker</code> is the DNS type of the resource record\\n\\t\\t\\tsets that are associated with the first traffic policy instance that Amazon Route 53\\n\\t\\t\\twill return if you submit another <code>ListTrafficPolicyInstances</code> request.\\n\\t\\t</p>\"\n                    }\n                },\n                \"IsTruncated\": {\n                    \"target\": \"com.amazonaws.route53#PageTruncated\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>A flag that indicates whether there are more traffic policy instances to be listed. If\\n\\t\\t\\tthe response was truncated, you can get more traffic policy instances by calling\\n\\t\\t\\t\\t<code>ListTrafficPolicyInstances</code> again and specifying the values of the\\n\\t\\t\\t\\t<code>HostedZoneIdMarker</code>, <code>TrafficPolicyInstanceNameMarker</code>, and\\n\\t\\t\\t\\t<code>TrafficPolicyInstanceTypeMarker</code> in the corresponding request\\n\\t\\t\\tparameters.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"MaxItems\": {\n                    \"target\": \"smithy.api#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The value that you specified for the <code>MaxItems</code> parameter in the call to\\n\\t\\t\\t\\t<code>ListTrafficPolicyInstances</code> that produced the current response.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that contains the response information for the request.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.route53#ListTrafficPolicyVersions\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.route53#ListTrafficPolicyVersionsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.route53#ListTrafficPolicyVersionsResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidInput\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#NoSuchTrafficPolicy\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Gets information about all of the versions for a specified traffic policy.</p>\\n         <p>Traffic policy versions are listed in numerical order by\\n\\t\\t\\t<code>VersionNumber</code>.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/2013-04-01/trafficpolicies/{Id}/versions\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.route53#ListTrafficPolicyVersionsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Id\": {\n                    \"target\": \"com.amazonaws.route53#TrafficPolicyId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify the value of <code>Id</code> of the traffic policy for which you want to list\\n\\t\\t\\tall versions.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TrafficPolicyVersionMarker\": {\n                    \"target\": \"com.amazonaws.route53#TrafficPolicyVersionMarker\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>For your first request to <code>ListTrafficPolicyVersions</code>, don't include the\\n\\t\\t\\t\\t<code>TrafficPolicyVersionMarker</code> parameter.</p>\\n         <p>If you have more traffic policy versions than the value of <code>MaxItems</code>,\\n\\t\\t\\t\\t<code>ListTrafficPolicyVersions</code> returns only the first group of\\n\\t\\t\\t\\t<code>MaxItems</code> versions. To get more traffic policy versions, submit another\\n\\t\\t\\t\\t<code>ListTrafficPolicyVersions</code> request. For the value of\\n\\t\\t\\t\\t<code>TrafficPolicyVersionMarker</code>, specify the value of\\n\\t\\t\\t\\t<code>TrafficPolicyVersionMarker</code> in the previous response.</p>\",\n                        \"smithy.api#httpQuery\": \"trafficpolicyversion\"\n                    }\n                },\n                \"MaxItems\": {\n                    \"target\": \"smithy.api#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of traffic policy versions that you want Amazon Route 53 to include\\n\\t\\t\\tin the response body for this request. If the specified traffic policy has more than\\n\\t\\t\\t\\t<code>MaxItems</code> versions, the value of <code>IsTruncated</code> in the\\n\\t\\t\\tresponse is <code>true</code>, and the value of the\\n\\t\\t\\t\\t<code>TrafficPolicyVersionMarker</code> element is the ID of the first version that\\n\\t\\t\\tRoute 53 will return if you submit another request.</p>\",\n                        \"smithy.api#httpQuery\": \"maxitems\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that contains the information about the request to list your traffic\\n\\t\\t\\tpolicies.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.route53#ListTrafficPolicyVersionsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TrafficPolicies\": {\n                    \"target\": \"com.amazonaws.route53#TrafficPolicies\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list that contains one <code>TrafficPolicy</code> element for each traffic policy\\n\\t\\t\\tversion that is associated with the specified traffic policy.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"IsTruncated\": {\n                    \"target\": \"com.amazonaws.route53#PageTruncated\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>A flag that indicates whether there are more traffic policies to be listed. If the\\n\\t\\t\\tresponse was truncated, you can get the next group of traffic policies by submitting\\n\\t\\t\\tanother <code>ListTrafficPolicyVersions</code> request and specifying the value of\\n\\t\\t\\t\\t<code>NextMarker</code> in the <code>marker</code> parameter.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TrafficPolicyVersionMarker\": {\n                    \"target\": \"com.amazonaws.route53#TrafficPolicyVersionMarker\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If <code>IsTruncated</code> is <code>true</code>, the value of\\n\\t\\t\\t\\t<code>TrafficPolicyVersionMarker</code> identifies the first traffic policy that\\n\\t\\t\\tAmazon Route 53 will return if you submit another request. Call\\n\\t\\t\\t\\t<code>ListTrafficPolicyVersions</code> again and specify the value of\\n\\t\\t\\t\\t<code>TrafficPolicyVersionMarker</code> in the\\n\\t\\t\\t\\t<code>TrafficPolicyVersionMarker</code> request parameter.</p>\\n         <p>This element is present only if <code>IsTruncated</code> is <code>true</code>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"MaxItems\": {\n                    \"target\": \"smithy.api#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The value that you specified for the <code>maxitems</code> parameter in the\\n\\t\\t\\t\\t<code>ListTrafficPolicyVersions</code> request that produced the current\\n\\t\\t\\tresponse.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that contains the response information for the request.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.route53#ListVPCAssociationAuthorizations\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.route53#ListVPCAssociationAuthorizationsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.route53#ListVPCAssociationAuthorizationsResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidInput\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidPaginationToken\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#NoSuchHostedZone\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Gets a list of the VPCs that were created by other accounts and that can be associated\\n\\t\\t\\twith a specified hosted zone because you've submitted one or more\\n\\t\\t\\t\\t<code>CreateVPCAssociationAuthorization</code> requests. </p>\\n         <p>The response includes a <code>VPCs</code> element with a <code>VPC</code> child\\n\\t\\t\\telement for each VPC that can be associated with the hosted zone.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/2013-04-01/hostedzone/{HostedZoneId}/authorizevpcassociation\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.route53#ListVPCAssociationAuthorizationsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"HostedZoneId\": {\n                    \"target\": \"com.amazonaws.route53#ResourceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the hosted zone for which you want a list of VPCs that can be associated\\n\\t\\t\\twith the hosted zone.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.route53#PaginationToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>\\n            <i>Optional</i>: If a response includes a <code>NextToken</code>\\n\\t\\t\\telement, there are more VPCs that can be associated with the specified hosted zone. To\\n\\t\\t\\tget the next page of results, submit another request, and include the value of\\n\\t\\t\\t\\t<code>NextToken</code> from the response in the <code>nexttoken</code> parameter in\\n\\t\\t\\tanother <code>ListVPCAssociationAuthorizations</code> request.</p>\",\n                        \"smithy.api#httpQuery\": \"nexttoken\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"smithy.api#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>\\n            <i>Optional</i>: An integer that specifies the maximum number of VPCs\\n\\t\\t\\tthat you want Amazon Route 53 to return. If you don't specify a value for\\n\\t\\t\\t\\t<code>MaxResults</code>, Route 53 returns up to 50 VPCs per page.</p>\",\n                        \"smithy.api#httpQuery\": \"maxresults\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that contains information about that can be associated with your hosted\\n\\t\\t\\tzone.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.route53#ListVPCAssociationAuthorizationsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"HostedZoneId\": {\n                    \"target\": \"com.amazonaws.route53#ResourceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the hosted zone that you can associate the listed VPCs with.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.route53#PaginationToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>When the response includes a <code>NextToken</code> element, there are more VPCs that\\n\\t\\t\\tcan be associated with the specified hosted zone. To get the next page of VPCs, submit\\n\\t\\t\\tanother <code>ListVPCAssociationAuthorizations</code> request, and include the value of\\n\\t\\t\\tthe <code>NextToken</code> element from the response in the <code>nexttoken</code>\\n\\t\\t\\trequest parameter.</p>\"\n                    }\n                },\n                \"VPCs\": {\n                    \"target\": \"com.amazonaws.route53#VPCs\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The list of VPCs that are authorized to be associated with the specified hosted\\n\\t\\t\\tzone.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that contains the response information for the request.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.route53#LocalZoneGroup\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 64\n                }\n            }\n        },\n        \"com.amazonaws.route53#LocationSummaries\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.route53#LocationSummary\"\n            }\n        },\n        \"com.amazonaws.route53#LocationSummary\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LocationName\": {\n                    \"target\": \"com.amazonaws.route53#CidrLocationNameDefaultAllowed\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A string that specifies a location name.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that contains information about the CIDR location.</p>\"\n            }\n        },\n        \"com.amazonaws.route53#Longitude\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 7\n                },\n                \"smithy.api#pattern\": \"^[-+]?[0-9]{1,3}(\\\\.[0-9]{0,2})?$\"\n            }\n        },\n        \"com.amazonaws.route53#MeasureLatency\": {\n            \"type\": \"boolean\"\n        },\n        \"com.amazonaws.route53#Message\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 1024\n                }\n            }\n        },\n        \"com.amazonaws.route53#MetricName\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 255\n                }\n            }\n        },\n        \"com.amazonaws.route53#Nameserver\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 255\n                }\n            }\n        },\n        \"com.amazonaws.route53#Namespace\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 255\n                }\n            }\n        },\n        \"com.amazonaws.route53#NoSuchChange\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.route53#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A change with the specified change ID does not exist.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 404\n            }\n        },\n        \"com.amazonaws.route53#NoSuchCidrCollectionException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Message\": {\n                    \"target\": \"com.amazonaws.route53#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The CIDR collection you specified, doesn't exist.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 404\n            }\n        },\n        \"com.amazonaws.route53#NoSuchCidrLocationException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Message\": {\n                    \"target\": \"com.amazonaws.route53#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The CIDR collection location doesn't match any locations in your account.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 404\n            }\n        },\n        \"com.amazonaws.route53#NoSuchCloudWatchLogsLogGroup\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.route53#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>There is no CloudWatch Logs log group with the specified ARN.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 404\n            }\n        },\n        \"com.amazonaws.route53#NoSuchDelegationSet\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.route53#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A reusable delegation set with the specified ID does not exist.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.route53#NoSuchGeoLocation\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.route53#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Amazon Route 53 doesn't support the specified geographic location. For a list of\\n\\t\\t\\tsupported geolocation codes, see the <a href=\\\"https://docs.aws.amazon.com/Route53/latest/APIReference/API_GeoLocation.html\\\">GeoLocation</a> data\\n\\t\\t\\ttype.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 404\n            }\n        },\n        \"com.amazonaws.route53#NoSuchHealthCheck\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.route53#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>No health check exists with the specified ID.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 404\n            }\n        },\n        \"com.amazonaws.route53#NoSuchHostedZone\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.route53#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>No hosted zone exists with the ID that you specified.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 404\n            }\n        },\n        \"com.amazonaws.route53#NoSuchKeySigningKey\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.route53#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The specified key-signing key (KSK) doesn't exist.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 404\n            }\n        },\n        \"com.amazonaws.route53#NoSuchQueryLoggingConfig\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.route53#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>There is no DNS query logging configuration with the specified ID.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 404\n            }\n        },\n        \"com.amazonaws.route53#NoSuchTrafficPolicy\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.route53#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>No traffic policy exists with the specified ID.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 404\n            }\n        },\n        \"com.amazonaws.route53#NoSuchTrafficPolicyInstance\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.route53#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>No traffic policy instance exists with the specified ID.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 404\n            }\n        },\n        \"com.amazonaws.route53#Nonce\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 128\n                }\n            }\n        },\n        \"com.amazonaws.route53#NotAuthorizedException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.route53#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Associating the specified VPC with the specified hosted zone has not been\\n\\t\\t\\tauthorized.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 401\n            }\n        },\n        \"com.amazonaws.route53#PageMarker\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 64\n                }\n            }\n        },\n        \"com.amazonaws.route53#PageTruncated\": {\n            \"type\": \"boolean\",\n            \"traits\": {\n                \"smithy.api#default\": false\n            }\n        },\n        \"com.amazonaws.route53#PaginationToken\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 1024\n                }\n            }\n        },\n        \"com.amazonaws.route53#Period\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 60\n                }\n            }\n        },\n        \"com.amazonaws.route53#Port\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 65535\n                }\n            }\n        },\n        \"com.amazonaws.route53#PriorRequestNotComplete\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.route53#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>If Amazon Route 53 can't process a request before the next request arrives, it will\\n\\t\\t\\treject subsequent requests for the same hosted zone and return an <code>HTTP 400\\n\\t\\t\\t\\terror</code> (<code>Bad request</code>). If Route 53 returns this error repeatedly\\n\\t\\t\\tfor the same request, we recommend that you wait, in intervals of increasing duration,\\n\\t\\t\\tbefore you try the request again.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.route53#PublicZoneVPCAssociation\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.route53#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>You're trying to associate a VPC with a public hosted zone. Amazon Route 53 doesn't\\n\\t\\t\\tsupport associating a VPC with a public hosted zone.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.route53#QueryLoggingConfig\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Id\": {\n                    \"target\": \"com.amazonaws.route53#QueryLoggingConfigId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID for a configuration for DNS query logging.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"HostedZoneId\": {\n                    \"target\": \"com.amazonaws.route53#ResourceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the hosted zone that CloudWatch Logs is logging queries for. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"CloudWatchLogsLogGroupArn\": {\n                    \"target\": \"com.amazonaws.route53#CloudWatchLogsLogGroupArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the CloudWatch Logs log group that Amazon Route 53\\n\\t\\t\\tis publishing logs to.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that contains information about a configuration for DNS query\\n\\t\\t\\tlogging.</p>\"\n            }\n        },\n        \"com.amazonaws.route53#QueryLoggingConfigAlreadyExists\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.route53#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>You can create only one query logging configuration for a hosted zone, and a query\\n\\t\\t\\tlogging configuration already exists for this hosted zone.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 409\n            }\n        },\n        \"com.amazonaws.route53#QueryLoggingConfigId\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 36\n                }\n            }\n        },\n        \"com.amazonaws.route53#QueryLoggingConfigs\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.route53#QueryLoggingConfig\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"QueryLoggingConfig\"\n                }\n            }\n        },\n        \"com.amazonaws.route53#RData\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 4000\n                }\n            }\n        },\n        \"com.amazonaws.route53#RRType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"SOA\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"SOA\"\n                    }\n                },\n                \"A\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"A\"\n                    }\n                },\n                \"TXT\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"TXT\"\n                    }\n                },\n                \"NS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"NS\"\n                    }\n                },\n                \"CNAME\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"CNAME\"\n                    }\n                },\n                \"MX\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"MX\"\n                    }\n                },\n                \"NAPTR\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"NAPTR\"\n                    }\n                },\n                \"PTR\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"PTR\"\n                    }\n                },\n                \"SRV\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"SRV\"\n                    }\n                },\n                \"SPF\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"SPF\"\n                    }\n                },\n                \"AAAA\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AAAA\"\n                    }\n                },\n                \"CAA\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"CAA\"\n                    }\n                },\n                \"DS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DS\"\n                    }\n                },\n                \"TLSA\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"TLSA\"\n                    }\n                },\n                \"SSHFP\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"SSHFP\"\n                    }\n                },\n                \"SVCB\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"SVCB\"\n                    }\n                },\n                \"HTTPS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"HTTPS\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.route53#RecordData\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.route53#RecordDataEntry\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"RecordDataEntry\"\n                }\n            }\n        },\n        \"com.amazonaws.route53#RecordDataEntry\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A value that Amazon Route 53 returned for this resource record set. A\\n\\t\\t\\t\\t<code>RecordDataEntry</code> element is one of the following:</p>\\n         <ul>\\n            <li>\\n               <p>For non-alias resource record sets, a <code>RecordDataEntry</code> element\\n\\t\\t\\t\\t\\tcontains one value in the resource record set. If the resource record set\\n\\t\\t\\t\\t\\tcontains multiple values, the response includes one <code>RecordDataEntry</code>\\n\\t\\t\\t\\t\\telement for each value.</p>\\n            </li>\\n            <li>\\n               <p>For multiple resource record sets that have the same name and type, which\\n\\t\\t\\t\\t\\tincludes weighted, latency, geolocation, and failover, a\\n\\t\\t\\t\\t\\t\\t<code>RecordDataEntry</code> element contains the value from the appropriate\\n\\t\\t\\t\\t\\tresource record set based on the request.</p>\\n            </li>\\n            <li>\\n               <p>For alias resource record sets that refer to Amazon Web Services resources\\n\\t\\t\\t\\t\\tother than another resource record set, the <code>RecordDataEntry</code> element\\n\\t\\t\\t\\t\\tcontains an IP address or a domain name for the Amazon Web Services resource,\\n\\t\\t\\t\\t\\tdepending on the type of resource.</p>\\n            </li>\\n            <li>\\n               <p>For alias resource record sets that refer to other resource record sets, a\\n\\t\\t\\t\\t\\t\\t<code>RecordDataEntry</code> element contains one value from the referenced\\n\\t\\t\\t\\t\\tresource record set. If the referenced resource record set contains multiple\\n\\t\\t\\t\\t\\tvalues, the response includes one <code>RecordDataEntry</code> element for each\\n\\t\\t\\t\\t\\tvalue.</p>\\n            </li>\\n         </ul>\",\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 512\n                }\n            }\n        },\n        \"com.amazonaws.route53#RequestInterval\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 10,\n                    \"max\": 30\n                }\n            }\n        },\n        \"com.amazonaws.route53#ResettableElementName\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"FullyQualifiedDomainName\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"FullyQualifiedDomainName\"\n                    }\n                },\n                \"Regions\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Regions\"\n                    }\n                },\n                \"ResourcePath\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ResourcePath\"\n                    }\n                },\n                \"ChildHealthChecks\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ChildHealthChecks\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 64\n                }\n            }\n        },\n        \"com.amazonaws.route53#ResettableElementNameList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.route53#ResettableElementName\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"ResettableElementName\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 64\n                }\n            }\n        },\n        \"com.amazonaws.route53#ResourceDescription\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 256\n                }\n            }\n        },\n        \"com.amazonaws.route53#ResourceId\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 32\n                }\n            }\n        },\n        \"com.amazonaws.route53#ResourcePath\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 255\n                }\n            }\n        },\n        \"com.amazonaws.route53#ResourceRecord\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Value\": {\n                    \"target\": \"com.amazonaws.route53#RData\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The current or new DNS record value, not to exceed 4,000 characters. In the case of a\\n\\t\\t\\t\\t<code>DELETE</code> action, if the current value does not match the actual value, an\\n\\t\\t\\terror is returned. For descriptions about how to format <code>Value</code> for different\\n\\t\\t\\trecord types, see <a href=\\\"https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/ResourceRecordTypes.html\\\">Supported DNS Resource\\n\\t\\t\\t\\tRecord Types</a> in the <i>Amazon Route 53 Developer\\n\\t\\t\\tGuide</i>.</p>\\n         <p>You can specify more than one value for all record types except <code>CNAME</code> and\\n\\t\\t\\t\\t<code>SOA</code>. </p>\\n         <note>\\n            <p>If you're creating an alias resource record set, omit <code>Value</code>.</p>\\n         </note>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information specific to the resource record.</p>\\n         <note>\\n            <p>If you're creating an alias resource record set, omit\\n\\t\\t\\t\\t<code>ResourceRecord</code>.</p>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.route53#ResourceRecordSet\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Name\": {\n                    \"target\": \"com.amazonaws.route53#DNSName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>For <code>ChangeResourceRecordSets</code> requests, the name of the record that you\\n\\t\\t\\twant to create, update, or delete. For <code>ListResourceRecordSets</code> responses,\\n\\t\\t\\tthe name of a record in the specified hosted zone.</p>\\n         <p>\\n            <b>ChangeResourceRecordSets Only</b>\\n         </p>\\n         <p>Enter a fully qualified domain name, for example, <code>www.example.com</code>. You\\n\\t\\t\\tcan optionally include a trailing dot. If you omit the trailing dot, Amazon Route 53\\n\\t\\t\\tassumes that the domain name that you specify is fully qualified. This means that Route\\n\\t\\t\\t53 treats <code>www.example.com</code> (without a trailing dot) and\\n\\t\\t\\t\\t<code>www.example.com.</code> (with a trailing dot) as identical.</p>\\n         <p>For information about how to specify characters other than <code>a-z</code>,\\n\\t\\t\\t\\t<code>0-9</code>, and <code>-</code> (hyphen) and how to specify internationalized\\n\\t\\t\\tdomain names, see <a href=\\\"https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/DomainNameFormat.html\\\">DNS Domain Name\\n\\t\\t\\t\\tFormat</a> in the <i>Amazon Route 53 Developer Guide</i>.</p>\\n         <p>You can use the asterisk (*) wildcard to replace the leftmost label in a domain name,\\n\\t\\t\\tfor example, <code>*.example.com</code>. Note the following:</p>\\n         <ul>\\n            <li>\\n               <p>The * must replace the entire label. For example, you can't specify\\n\\t\\t\\t\\t\\t\\t<code>*prod.example.com</code> or <code>prod*.example.com</code>.</p>\\n            </li>\\n            <li>\\n               <p>The * can't replace any of the middle labels, for example,\\n\\t\\t\\t\\t\\tmarketing.*.example.com.</p>\\n            </li>\\n            <li>\\n               <p>If you include * in any position other than the leftmost label in a domain\\n\\t\\t\\t\\t\\tname, DNS treats it as an * character (ASCII 42), not as a wildcard.</p>\\n               <important>\\n                  <p>You can't use the * wildcard for resource records sets that have a type of\\n\\t\\t\\t\\t\\t\\tNS.</p>\\n               </important>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Type\": {\n                    \"target\": \"com.amazonaws.route53#RRType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The DNS record type. For information about different record types and how data is\\n\\t\\t\\tencoded for them, see <a href=\\\"https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/ResourceRecordTypes.html\\\">Supported DNS Resource\\n\\t\\t\\t\\tRecord Types</a> in the <i>Amazon Route 53 Developer\\n\\t\\t\\tGuide</i>.</p>\\n         <p>Valid values for basic resource record sets: <code>A</code> | <code>AAAA</code> |\\n\\t\\t\\t\\t<code>CAA</code> | <code>CNAME</code> | <code>DS</code> |<code>MX</code> |\\n\\t\\t\\t\\t<code>NAPTR</code> | <code>NS</code> | <code>PTR</code> | <code>SOA</code> |\\n\\t\\t\\t<code>SPF</code> | <code>SRV</code> | <code>TXT</code>| <code>TLSA</code>| <code>SSHFP</code>| <code>SVCB</code>| <code>HTTPS</code>\\n         </p>\\n         <p>Values for weighted, latency, geolocation, and failover resource record sets: <code>A</code>\\n\\t\\t\\t| <code>AAAA</code> | <code>CAA</code> | <code>CNAME</code> | <code>MX</code> |\\n\\t\\t\\t\\t<code>NAPTR</code> | <code>PTR</code> | <code>SPF</code> | <code>SRV</code> |\\n\\t\\t\\t\\t<code>TXT</code>| <code>TLSA</code>| <code>SSHFP</code>| <code>SVCB</code>|\\n\\t\\t\\t\\t<code>HTTPS</code>. When creating a group of weighted, latency, geolocation, or\\n\\t\\t\\tfailover resource record sets, specify the same value for all of the resource record\\n\\t\\t\\tsets in the group.</p>\\n         <p>Valid values for multivalue answer resource record sets: <code>A</code> |\\n\\t\\t\\t\\t<code>AAAA</code> | <code>MX</code> | <code>NAPTR</code> | <code>PTR</code> |\\n\\t\\t\\t<code>SPF</code> | <code>SRV</code> | <code>TXT</code>| <code>CAA</code>| <code>TLSA</code>| <code>SSHFP</code>| <code>SVCB</code>| <code>HTTPS</code>\\n         </p>\\n         <note>\\n            <p>SPF records were formerly used to verify the identity of the sender of email\\n\\t\\t\\t\\tmessages. However, we no longer recommend that you create resource record sets for\\n\\t\\t\\t\\twhich the value of <code>Type</code> is <code>SPF</code>. RFC 7208, <i>Sender\\n\\t\\t\\t\\t\\tPolicy Framework (SPF) for Authorizing Use of Domains in Email, Version\\n\\t\\t\\t\\t\\t1</i>, has been updated to say, \\\"...[I]ts existence and mechanism defined\\n\\t\\t\\t\\tin [RFC4408] have led to some interoperability issues. Accordingly, its use is no\\n\\t\\t\\t\\tlonger appropriate for SPF version 1; implementations are not to use it.\\\" In RFC\\n\\t\\t\\t\\t7208, see section 14.1, <a href=\\\"http://tools.ietf.org/html/rfc7208#section-14.1\\\">The SPF DNS Record Type</a>.</p>\\n         </note>\\n         <p>Values for alias resource record sets:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <b>Amazon API Gateway custom regional APIs and\\n\\t\\t\\t\\t\\t\\tedge-optimized APIs:</b>\\n                  <code>A</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>CloudFront distributions:</b>\\n                  <code>A</code>\\n               </p>\\n               <p>If IPv6 is enabled for the distribution, create two resource record sets to\\n\\t\\t\\t\\t\\troute traffic to your distribution, one with a value of <code>A</code> and one\\n\\t\\t\\t\\t\\twith a value of <code>AAAA</code>. </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>Amazon API Gateway environment that has a regionalized\\n\\t\\t\\t\\t\\t\\tsubdomain</b>: <code>A</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>ELB load balancers:</b>\\n                  <code>A</code> | <code>AAAA</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>Amazon S3 buckets:</b>\\n                  <code>A</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>Amazon Virtual Private Cloud interface VPC\\n\\t\\t\\t\\t\\t\\tendpoints</b>\\n                  <code>A</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>Another resource record set in this hosted\\n\\t\\t\\t\\t\\t\\tzone:</b> Specify the type of the resource record set that you're\\n\\t\\t\\t\\t\\tcreating the alias for. All values are supported except <code>NS</code> and\\n\\t\\t\\t\\t\\t\\t<code>SOA</code>.</p>\\n               <note>\\n                  <p>If you're creating an alias record that has the same name as the hosted\\n\\t\\t\\t\\t\\t\\tzone (known as the zone apex), you can't route traffic to a record for which\\n\\t\\t\\t\\t\\t\\tthe value of <code>Type</code> is <code>CNAME</code>. This is because the\\n\\t\\t\\t\\t\\t\\talias record must have the same type as the record you're routing traffic\\n\\t\\t\\t\\t\\t\\tto, and creating a CNAME record for the zone apex isn't supported even for\\n\\t\\t\\t\\t\\t\\tan alias record.</p>\\n               </note>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"SetIdentifier\": {\n                    \"target\": \"com.amazonaws.route53#ResourceRecordSetIdentifier\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>\\n            <i>Resource record sets that have a routing policy other than\\n\\t\\t\\t\\tsimple:</i> An identifier that differentiates among multiple resource record\\n\\t\\t\\tsets that have the same combination of name and type, such as multiple weighted resource\\n\\t\\t\\trecord sets named acme.example.com that have a type of A. In a group of resource record\\n\\t\\t\\tsets that have the same name and type, the value of <code>SetIdentifier</code> must be\\n\\t\\t\\tunique for each resource record set. </p>\\n         <p>For information about routing policies, see <a href=\\\"https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/routing-policy.html\\\">Choosing a Routing\\n\\t\\t\\t\\tPolicy</a> in the <i>Amazon Route 53 Developer Guide</i>.</p>\"\n                    }\n                },\n                \"Weight\": {\n                    \"target\": \"com.amazonaws.route53#ResourceRecordSetWeight\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>\\n            <i>Weighted resource record sets only:</i> Among resource record sets\\n\\t\\t\\tthat have the same combination of DNS name and type, a value that determines the\\n\\t\\t\\tproportion of DNS queries that Amazon Route 53 responds to using the current resource\\n\\t\\t\\trecord set. Route 53 calculates the sum of the weights for the resource record sets that\\n\\t\\t\\thave the same combination of DNS name and type. Route 53 then responds to queries based\\n\\t\\t\\ton the ratio of a resource's weight to the total. Note the following:</p>\\n         <ul>\\n            <li>\\n               <p>You must specify a value for the <code>Weight</code> element for every\\n\\t\\t\\t\\t\\tweighted resource record set.</p>\\n            </li>\\n            <li>\\n               <p>You can only specify one <code>ResourceRecord</code> per weighted resource\\n\\t\\t\\t\\t\\trecord set.</p>\\n            </li>\\n            <li>\\n               <p>You can't create latency, failover, or geolocation resource record sets that\\n\\t\\t\\t\\t\\thave the same values for the <code>Name</code> and <code>Type</code> elements as\\n\\t\\t\\t\\t\\tweighted resource record sets.</p>\\n            </li>\\n            <li>\\n               <p>You can create a maximum of 100 weighted resource record sets that have the\\n\\t\\t\\t\\t\\tsame values for the <code>Name</code> and <code>Type</code> elements.</p>\\n            </li>\\n            <li>\\n               <p>For weighted (but not weighted alias) resource record sets, if you set\\n\\t\\t\\t\\t\\t\\t<code>Weight</code> to <code>0</code> for a resource record set, Route 53\\n\\t\\t\\t\\t\\tnever responds to queries with the applicable value for that resource record\\n\\t\\t\\t\\t\\tset. However, if you set <code>Weight</code> to <code>0</code> for all resource\\n\\t\\t\\t\\t\\trecord sets that have the same combination of DNS name and type, traffic is\\n\\t\\t\\t\\t\\trouted to all resources with equal probability.</p>\\n               <p>The effect of setting <code>Weight</code> to <code>0</code> is different when\\n\\t\\t\\t\\t\\tyou associate health checks with weighted resource record sets. For more\\n\\t\\t\\t\\t\\tinformation, see <a href=\\\"https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/dns-failover-configuring-options.html\\\">Options for Configuring Route 53 Active-Active and Active-Passive\\n\\t\\t\\t\\t\\t\\tFailover</a> in the <i>Amazon Route 53 Developer\\n\\t\\t\\t\\t\\tGuide</i>.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"Region\": {\n                    \"target\": \"com.amazonaws.route53#ResourceRecordSetRegion\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>\\n            <i>Latency-based resource record sets only:</i> The Amazon EC2 Region\\n\\t\\t\\twhere you created the resource that this resource record set refers to. The resource\\n\\t\\t\\ttypically is an Amazon Web Services resource, such as an EC2 instance or an ELB load\\n\\t\\t\\tbalancer, and is referred to by an IP address or a DNS domain name, depending on the\\n\\t\\t\\trecord type.</p>\\n         <p>When Amazon Route 53 receives a DNS query for a domain name and type for which you\\n\\t\\t\\thave created latency resource record sets, Route 53 selects the latency resource record\\n\\t\\t\\tset that has the lowest latency between the end user and the associated Amazon EC2\\n\\t\\t\\tRegion. Route 53 then returns the value that is associated with the selected resource\\n\\t\\t\\trecord set.</p>\\n         <p>Note the following:</p>\\n         <ul>\\n            <li>\\n               <p>You can only specify one <code>ResourceRecord</code> per latency resource\\n\\t\\t\\t\\t\\trecord set.</p>\\n            </li>\\n            <li>\\n               <p>You can only create one latency resource record set for each Amazon EC2\\n\\t\\t\\t\\t\\tRegion.</p>\\n            </li>\\n            <li>\\n               <p>You aren't required to create latency resource record sets for all Amazon EC2\\n\\t\\t\\t\\t\\tRegions. Route 53 will choose the region with the best latency from among the\\n\\t\\t\\t\\t\\tregions that you create latency resource record sets for.</p>\\n            </li>\\n            <li>\\n               <p>You can't create non-latency resource record sets that have the same values\\n\\t\\t\\t\\t\\tfor the <code>Name</code> and <code>Type</code> elements as latency resource\\n\\t\\t\\t\\t\\trecord sets.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"GeoLocation\": {\n                    \"target\": \"com.amazonaws.route53#GeoLocation\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>\\n            <i>Geolocation resource record sets only:</i> A complex type that lets you\\n\\t\\t\\tcontrol how Amazon Route 53 responds to DNS queries based on the geographic origin of\\n\\t\\t\\tthe query. For example, if you want all queries from Africa to be routed to a web server\\n\\t\\t\\twith an IP address of <code>192.0.2.111</code>, create a resource record set with a\\n\\t\\t\\t\\t<code>Type</code> of <code>A</code> and a <code>ContinentCode</code> of\\n\\t\\t\\t\\t<code>AF</code>.</p>\\n         <p>If you create separate resource record sets for overlapping geographic regions (for\\n\\t\\t\\texample, one resource record set for a continent and one for a country on the same\\n\\t\\t\\tcontinent), priority goes to the smallest geographic region. This allows you to route\\n\\t\\t\\tmost queries for a continent to one resource and to route queries for a country on that\\n\\t\\t\\tcontinent to a different resource.</p>\\n         <p>You can't create two geolocation resource record sets that specify the same geographic\\n\\t\\t\\tlocation.</p>\\n         <p>The value <code>*</code> in the <code>CountryCode</code> element matches all\\n\\t\\t\\tgeographic locations that aren't specified in other geolocation resource record sets\\n\\t\\t\\tthat have the same values for the <code>Name</code> and <code>Type</code>\\n\\t\\t\\telements.</p>\\n         <important>\\n            <p>Geolocation works by mapping IP addresses to locations. However, some IP addresses\\n\\t\\t\\t\\taren't mapped to geographic locations, so even if you create geolocation resource\\n\\t\\t\\t\\trecord sets that cover all seven continents, Route 53 will receive some DNS queries\\n\\t\\t\\t\\tfrom locations that it can't identify. We recommend that you create a resource\\n\\t\\t\\t\\trecord set for which the value of <code>CountryCode</code> is <code>*</code>. Two\\n\\t\\t\\t\\tgroups of queries are routed to the resource that you specify in this record:\\n\\t\\t\\t\\tqueries that come from locations for which you haven't created geolocation resource\\n\\t\\t\\t\\trecord sets and queries from IP addresses that aren't mapped to a location. If you\\n\\t\\t\\t\\tdon't create a <code>*</code> resource record set, Route 53 returns a \\\"no answer\\\"\\n\\t\\t\\t\\tresponse for queries from those locations.</p>\\n         </important>\\n         <p>You can't create non-geolocation resource record sets that have the same values for\\n\\t\\t\\tthe <code>Name</code> and <code>Type</code> elements as geolocation resource record\\n\\t\\t\\tsets.</p>\"\n                    }\n                },\n                \"Failover\": {\n                    \"target\": \"com.amazonaws.route53#ResourceRecordSetFailover\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>\\n            <i>Failover resource record sets only:</i> To configure failover, you\\n\\t\\t\\tadd the <code>Failover</code> element to two resource record sets. For one resource\\n\\t\\t\\trecord set, you specify <code>PRIMARY</code> as the value for <code>Failover</code>; for\\n\\t\\t\\tthe other resource record set, you specify <code>SECONDARY</code>. In addition, you\\n\\t\\t\\tinclude the <code>HealthCheckId</code> element and specify the health check that you\\n\\t\\t\\twant Amazon Route 53 to perform for each resource record set.</p>\\n         <p>Except where noted, the following failover behaviors assume that you have included the\\n\\t\\t\\t\\t<code>HealthCheckId</code> element in both resource record sets:</p>\\n         <ul>\\n            <li>\\n               <p>When the primary resource record set is healthy, Route 53 responds to DNS\\n\\t\\t\\t\\t\\tqueries with the applicable value from the primary resource record set\\n\\t\\t\\t\\t\\tregardless of the health of the secondary resource record set.</p>\\n            </li>\\n            <li>\\n               <p>When the primary resource record set is unhealthy and the secondary resource\\n\\t\\t\\t\\t\\trecord set is healthy, Route 53 responds to DNS queries with the applicable\\n\\t\\t\\t\\t\\tvalue from the secondary resource record set.</p>\\n            </li>\\n            <li>\\n               <p>When the secondary resource record set is unhealthy, Route 53 responds to DNS\\n\\t\\t\\t\\t\\tqueries with the applicable value from the primary resource record set\\n\\t\\t\\t\\t\\tregardless of the health of the primary resource record set.</p>\\n            </li>\\n            <li>\\n               <p>If you omit the <code>HealthCheckId</code> element for the secondary resource\\n\\t\\t\\t\\t\\trecord set, and if the primary resource record set is unhealthy, Route 53 always\\n\\t\\t\\t\\t\\tresponds to DNS queries with the applicable value from the secondary resource\\n\\t\\t\\t\\t\\trecord set. This is true regardless of the health of the associated\\n\\t\\t\\t\\t\\tendpoint.</p>\\n            </li>\\n         </ul>\\n         <p>You can't create non-failover resource record sets that have the same values for the\\n\\t\\t\\t\\t<code>Name</code> and <code>Type</code> elements as failover resource record\\n\\t\\t\\tsets.</p>\\n         <p>For failover alias resource record sets, you must also include the\\n\\t\\t\\t\\t<code>EvaluateTargetHealth</code> element and set the value to true.</p>\\n         <p>For more information about configuring failover for Route 53, see the following topics\\n\\t\\t\\tin the <i>Amazon Route 53 Developer Guide</i>: </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/dns-failover.html\\\">Route 53 Health Checks\\n\\t\\t\\t\\t\\t\\tand DNS Failover</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/dns-failover-private-hosted-zones.html\\\">Configuring Failover in a Private Hosted Zone</a>\\n               </p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"MultiValueAnswer\": {\n                    \"target\": \"com.amazonaws.route53#ResourceRecordSetMultiValueAnswer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>\\n            <i>Multivalue answer resource record sets only</i>: To route traffic\\n\\t\\t\\tapproximately randomly to multiple resources, such as web servers, create one multivalue\\n\\t\\t\\tanswer record for each resource and specify <code>true</code> for\\n\\t\\t\\t\\t<code>MultiValueAnswer</code>. Note the following:</p>\\n         <ul>\\n            <li>\\n               <p>If you associate a health check with a multivalue answer resource record set,\\n\\t\\t\\t\\t\\tAmazon Route 53 responds to DNS queries with the corresponding IP address only\\n\\t\\t\\t\\t\\twhen the health check is healthy.</p>\\n            </li>\\n            <li>\\n               <p>If you don't associate a health check with a multivalue answer record, Route\\n\\t\\t\\t\\t\\t53 always considers the record to be healthy.</p>\\n            </li>\\n            <li>\\n               <p>Route 53 responds to DNS queries with up to eight healthy records; if you have\\n\\t\\t\\t\\t\\teight or fewer healthy records, Route 53 responds to all DNS queries with all\\n\\t\\t\\t\\t\\tthe healthy records.</p>\\n            </li>\\n            <li>\\n               <p>If you have more than eight healthy records, Route 53 responds to different\\n\\t\\t\\t\\t\\tDNS resolvers with different combinations of healthy records.</p>\\n            </li>\\n            <li>\\n               <p>When all records are unhealthy, Route 53 responds to DNS queries with up to\\n\\t\\t\\t\\t\\teight unhealthy records.</p>\\n            </li>\\n            <li>\\n               <p>If a resource becomes unavailable after a resolver caches a response, client\\n\\t\\t\\t\\t\\tsoftware typically tries another of the IP addresses in the response.</p>\\n            </li>\\n         </ul>\\n         <p>You can't create multivalue answer alias records.</p>\"\n                    }\n                },\n                \"TTL\": {\n                    \"target\": \"com.amazonaws.route53#TTL\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The resource record cache time to live (TTL), in seconds. Note the following:</p>\\n         <ul>\\n            <li>\\n               <p>If you're creating or updating an alias resource record set, omit\\n\\t\\t\\t\\t\\t\\t<code>TTL</code>. Amazon Route 53 uses the value of <code>TTL</code> for the\\n\\t\\t\\t\\t\\talias target. </p>\\n            </li>\\n            <li>\\n               <p>If you're associating this resource record set with a health check (if you're\\n\\t\\t\\t\\t\\tadding a <code>HealthCheckId</code> element), we recommend that you specify a\\n\\t\\t\\t\\t\\t\\t<code>TTL</code> of 60 seconds or less so clients respond quickly to changes\\n\\t\\t\\t\\t\\tin health status.</p>\\n            </li>\\n            <li>\\n               <p>All of the resource record sets in a group of weighted resource record sets\\n\\t\\t\\t\\t\\tmust have the same value for <code>TTL</code>.</p>\\n            </li>\\n            <li>\\n               <p>If a group of weighted resource record sets includes one or more weighted\\n\\t\\t\\t\\t\\talias resource record sets for which the alias target is an ELB load balancer,\\n\\t\\t\\t\\t\\twe recommend that you specify a <code>TTL</code> of 60 seconds for all of the\\n\\t\\t\\t\\t\\tnon-alias weighted resource record sets that have the same name and type. Values\\n\\t\\t\\t\\t\\tother than 60 seconds (the TTL for load balancers) will change the effect of the\\n\\t\\t\\t\\t\\tvalues that you specify for <code>Weight</code>.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"ResourceRecords\": {\n                    \"target\": \"com.amazonaws.route53#ResourceRecords\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Information about the resource records to act upon.</p>\\n         <note>\\n            <p>If you're creating an alias resource record set, omit\\n\\t\\t\\t\\t<code>ResourceRecords</code>.</p>\\n         </note>\"\n                    }\n                },\n                \"AliasTarget\": {\n                    \"target\": \"com.amazonaws.route53#AliasTarget\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>\\n            <i>Alias resource record sets only:</i> Information about the Amazon Web Services resource, such as a CloudFront distribution or an Amazon S3 bucket, that\\n\\t\\t\\tyou want to route traffic to. </p>\\n         <p>If you're creating resource records sets for a private hosted zone, note the\\n\\t\\t\\tfollowing:</p>\\n         <ul>\\n            <li>\\n               <p>You can't create an alias resource record set in a private hosted zone to\\n\\t\\t\\t\\t\\troute traffic to a CloudFront distribution.</p>\\n            </li>\\n            <li>\\n               <p>For information about creating failover resource record sets in a private\\n\\t\\t\\t\\t\\thosted zone, see <a href=\\\"https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/dns-failover-private-hosted-zones.html\\\">Configuring Failover in a Private Hosted Zone</a> in the\\n\\t\\t\\t\\t\\t\\t<i>Amazon Route 53 Developer Guide</i>.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"HealthCheckId\": {\n                    \"target\": \"com.amazonaws.route53#HealthCheckId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If you want Amazon Route 53 to return this resource record set in response to a DNS\\n\\t\\t\\tquery only when the status of a health check is healthy, include the\\n\\t\\t\\t\\t<code>HealthCheckId</code> element and specify the ID of the applicable health\\n\\t\\t\\tcheck.</p>\\n         <p>Route 53 determines whether a resource record set is healthy based on one of the\\n\\t\\t\\tfollowing:</p>\\n         <ul>\\n            <li>\\n               <p>By periodically sending a request to the endpoint that is specified in the\\n\\t\\t\\t\\t\\thealth check</p>\\n            </li>\\n            <li>\\n               <p>By aggregating the status of a specified group of health checks (calculated\\n\\t\\t\\t\\t\\thealth checks)</p>\\n            </li>\\n            <li>\\n               <p>By determining the current state of a CloudWatch alarm (CloudWatch metric\\n\\t\\t\\t\\t\\thealth checks)</p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>Route 53 doesn't check the health of the endpoint that is specified in the\\n\\t\\t\\t\\tresource record set, for example, the endpoint specified by the IP address in the\\n\\t\\t\\t\\t\\t<code>Value</code> element. When you add a <code>HealthCheckId</code> element to\\n\\t\\t\\t\\ta resource record set, Route 53 checks the health of the endpoint that you specified\\n\\t\\t\\t\\tin the health check. </p>\\n         </important>\\n         <p>For more information, see the following topics in the <i>Amazon Route 53\\n\\t\\t\\t\\tDeveloper Guide</i>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/dns-failover-determining-health-of-endpoints.html\\\">How Amazon Route 53 Determines Whether an Endpoint Is\\n\\t\\t\\t\\t\\tHealthy</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/dns-failover.html\\\">Route 53 Health Checks\\n\\t\\t\\t\\t\\t\\tand DNS Failover</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/dns-failover-private-hosted-zones.html\\\">Configuring Failover in a Private Hosted Zone</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>\\n            <b>When to Specify HealthCheckId</b>\\n         </p>\\n         <p>Specifying a value for <code>HealthCheckId</code> is useful only when Route 53 is\\n\\t\\t\\tchoosing between two or more resource record sets to respond to a DNS query, and you\\n\\t\\t\\twant Route 53 to base the choice in part on the status of a health check. Configuring\\n\\t\\t\\thealth checks makes sense only in the following configurations:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <b>Non-alias resource record sets</b>: You're\\n\\t\\t\\t\\t\\tchecking the health of a group of non-alias resource record sets that have the\\n\\t\\t\\t\\t\\tsame routing policy, name, and type (such as multiple weighted records named\\n\\t\\t\\t\\t\\twww.example.com with a type of A) and you specify health check IDs for all the\\n\\t\\t\\t\\t\\tresource record sets. </p>\\n               <p>If the health check status for a resource record set is healthy, Route 53\\n\\t\\t\\t\\t\\tincludes the record among the records that it responds to DNS queries\\n\\t\\t\\t\\t\\twith.</p>\\n               <p>If the health check status for a resource record set is unhealthy, Route 53\\n\\t\\t\\t\\t\\tstops responding to DNS queries using the value for that resource record\\n\\t\\t\\t\\t\\tset.</p>\\n               <p>If the health check status for all resource record sets in the group is\\n\\t\\t\\t\\t\\tunhealthy, Route 53 considers all resource record sets in the group healthy and\\n\\t\\t\\t\\t\\tresponds to DNS queries accordingly. </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>Alias resource record sets</b>: You specify the\\n\\t\\t\\t\\t\\tfollowing settings:</p>\\n               <ul>\\n                  <li>\\n                     <p>You set <code>EvaluateTargetHealth</code> to true for an alias\\n\\t\\t\\t\\t\\t\\t\\tresource record set in a group of resource record sets that have the\\n\\t\\t\\t\\t\\t\\t\\tsame routing policy, name, and type (such as multiple weighted records\\n\\t\\t\\t\\t\\t\\t\\tnamed www.example.com with a type of A). </p>\\n                  </li>\\n                  <li>\\n                     <p>You configure the alias resource record set to route traffic to a\\n\\t\\t\\t\\t\\t\\t\\tnon-alias resource record set in the same hosted zone.</p>\\n                  </li>\\n                  <li>\\n                     <p>You specify a health check ID for the non-alias resource record set.\\n\\t\\t\\t\\t\\t\\t</p>\\n                  </li>\\n               </ul>\\n               <p>If the health check status is healthy, Route 53 considers the alias resource\\n\\t\\t\\t\\t\\trecord set to be healthy and includes the alias record among the records that it\\n\\t\\t\\t\\t\\tresponds to DNS queries with.</p>\\n               <p>If the health check status is unhealthy, Route 53 stops responding to DNS\\n\\t\\t\\t\\t\\tqueries using the alias resource record set.</p>\\n               <note>\\n                  <p>The alias resource record set can also route traffic to a\\n\\t\\t\\t\\t\\t\\t\\t<i>group</i> of non-alias resource record sets that have\\n\\t\\t\\t\\t\\t\\tthe same routing policy, name, and type. In that configuration, associate\\n\\t\\t\\t\\t\\t\\thealth checks with all of the resource record sets in the group of non-alias\\n\\t\\t\\t\\t\\t\\tresource record sets.</p>\\n               </note>\\n            </li>\\n         </ul>\\n         <p>\\n            <b>Geolocation Routing</b>\\n         </p>\\n         <p>For geolocation resource record sets, if an endpoint is unhealthy, Route 53 looks for\\n\\t\\t\\ta resource record set for the larger, associated geographic region. For example, suppose\\n\\t\\t\\tyou have resource record sets for a state in the United States, for the entire United\\n\\t\\t\\tStates, for North America, and a resource record set that has <code>*</code> for\\n\\t\\t\\t\\t<code>CountryCode</code> is <code>*</code>, which applies to all locations. If the\\n\\t\\t\\tendpoint for the state resource record set is unhealthy, Route 53 checks for healthy\\n\\t\\t\\tresource record sets in the following order until it finds a resource record set for\\n\\t\\t\\twhich the endpoint is healthy:</p>\\n         <ul>\\n            <li>\\n               <p>The United States</p>\\n            </li>\\n            <li>\\n               <p>North America</p>\\n            </li>\\n            <li>\\n               <p>The default resource record set</p>\\n            </li>\\n         </ul>\\n         <p>\\n            <b>Specifying the Health Check Endpoint by Domain\\n\\t\\t\\tName</b>\\n         </p>\\n         <p>If your health checks specify the endpoint only by domain name, we recommend that you\\n\\t\\t\\tcreate a separate health check for each endpoint. For example, create a health check for\\n\\t\\t\\teach <code>HTTP</code> server that is serving content for <code>www.example.com</code>.\\n\\t\\t\\tFor the value of <code>FullyQualifiedDomainName</code>, specify the domain name of the\\n\\t\\t\\tserver (such as <code>us-east-2-www.example.com</code>), not the name of the resource\\n\\t\\t\\trecord sets (<code>www.example.com</code>).</p>\\n         <important>\\n            <p>Health check results will be unpredictable if you do the following:</p>\\n            <ul>\\n               <li>\\n                  <p>Create a health check that has the same value for\\n\\t\\t\\t\\t\\t\\t\\t<code>FullyQualifiedDomainName</code> as the name of a resource record\\n\\t\\t\\t\\t\\t\\tset.</p>\\n               </li>\\n               <li>\\n                  <p>Associate that health check with the resource record set.</p>\\n               </li>\\n            </ul>\\n         </important>\"\n                    }\n                },\n                \"TrafficPolicyInstanceId\": {\n                    \"target\": \"com.amazonaws.route53#TrafficPolicyInstanceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>When you create a traffic policy instance, Amazon Route 53 automatically creates a\\n\\t\\t\\tresource record set. <code>TrafficPolicyInstanceId</code> is the ID of the traffic\\n\\t\\t\\tpolicy instance that Route 53 created this resource record set for.</p>\\n         <important>\\n            <p>To delete the resource record set that is associated with a traffic policy\\n\\t\\t\\t\\tinstance, use <code>DeleteTrafficPolicyInstance</code>. Route 53 will delete the\\n\\t\\t\\t\\tresource record set automatically. If you delete the resource record set by using\\n\\t\\t\\t\\t\\t<code>ChangeResourceRecordSets</code>, Route 53 doesn't automatically delete the\\n\\t\\t\\t\\ttraffic policy instance, and you'll continue to be charged for it even though it's\\n\\t\\t\\t\\tno longer in use. </p>\\n         </important>\"\n                    }\n                },\n                \"CidrRoutingConfig\": {\n                    \"target\": \"com.amazonaws.route53#CidrRoutingConfig\"\n                },\n                \"GeoProximityLocation\": {\n                    \"target\": \"com.amazonaws.route53#GeoProximityLocation\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>\\n            <i> GeoproximityLocation resource record sets only:</i> A complex type that lets you control how\\n\\t\\t\\t\\tRoute 53 responds to DNS queries based on the geographic origin of the\\n\\t\\t\\tquery and your resources. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about the resource record set to create or delete.</p>\"\n            }\n        },\n        \"com.amazonaws.route53#ResourceRecordSetFailover\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"PRIMARY\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"PRIMARY\"\n                    }\n                },\n                \"SECONDARY\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"SECONDARY\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.route53#ResourceRecordSetIdentifier\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 128\n                }\n            }\n        },\n        \"com.amazonaws.route53#ResourceRecordSetMultiValueAnswer\": {\n            \"type\": \"boolean\"\n        },\n        \"com.amazonaws.route53#ResourceRecordSetRegion\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"us_east_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"us-east-1\"\n                    }\n                },\n                \"us_east_2\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"us-east-2\"\n                    }\n                },\n                \"us_west_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"us-west-1\"\n                    }\n                },\n                \"us_west_2\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"us-west-2\"\n                    }\n                },\n                \"ca_central_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ca-central-1\"\n                    }\n                },\n                \"eu_west_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"eu-west-1\"\n                    }\n                },\n                \"eu_west_2\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"eu-west-2\"\n                    }\n                },\n                \"eu_west_3\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"eu-west-3\"\n                    }\n                },\n                \"eu_central_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"eu-central-1\"\n                    }\n                },\n                \"eu_central_2\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"eu-central-2\"\n                    }\n                },\n                \"ap_southeast_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ap-southeast-1\"\n                    }\n                },\n                \"ap_southeast_2\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ap-southeast-2\"\n                    }\n                },\n                \"ap_southeast_3\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ap-southeast-3\"\n                    }\n                },\n                \"ap_northeast_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ap-northeast-1\"\n                    }\n                },\n                \"ap_northeast_2\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ap-northeast-2\"\n                    }\n                },\n                \"ap_northeast_3\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ap-northeast-3\"\n                    }\n                },\n                \"eu_north_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"eu-north-1\"\n                    }\n                },\n                \"sa_east_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"sa-east-1\"\n                    }\n                },\n                \"cn_north_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"cn-north-1\"\n                    }\n                },\n                \"cn_northwest_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"cn-northwest-1\"\n                    }\n                },\n                \"ap_east_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ap-east-1\"\n                    }\n                },\n                \"me_south_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"me-south-1\"\n                    }\n                },\n                \"me_central_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"me-central-1\"\n                    }\n                },\n                \"ap_south_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ap-south-1\"\n                    }\n                },\n                \"ap_south_2\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ap-south-2\"\n                    }\n                },\n                \"af_south_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"af-south-1\"\n                    }\n                },\n                \"eu_south_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"eu-south-1\"\n                    }\n                },\n                \"eu_south_2\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"eu-south-2\"\n                    }\n                },\n                \"ap_southeast_4\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ap-southeast-4\"\n                    }\n                },\n                \"il_central_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"il-central-1\"\n                    }\n                },\n                \"ca_west_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ca-west-1\"\n                    }\n                },\n                \"ap_southeast_5\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ap-southeast-5\"\n                    }\n                },\n                \"mx_central_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"mx-central-1\"\n                    }\n                },\n                \"ap_southeast_7\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ap-southeast-7\"\n                    }\n                },\n                \"us_gov_east_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"us-gov-east-1\"\n                    }\n                },\n                \"us_gov_west_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"us-gov-west-1\"\n                    }\n                },\n                \"ap_east_2\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ap-east-2\"\n                    }\n                },\n                \"ap_southeast_6\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ap-southeast-6\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 64\n                }\n            }\n        },\n        \"com.amazonaws.route53#ResourceRecordSetWeight\": {\n            \"type\": \"long\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 0,\n                    \"max\": 255\n                }\n            }\n        },\n        \"com.amazonaws.route53#ResourceRecordSets\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.route53#ResourceRecordSet\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"ResourceRecordSet\"\n                }\n            }\n        },\n        \"com.amazonaws.route53#ResourceRecords\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.route53#ResourceRecord\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"ResourceRecord\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1\n                }\n            }\n        },\n        \"com.amazonaws.route53#ResourceTagSet\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ResourceType\": {\n                    \"target\": \"com.amazonaws.route53#TagResourceType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of the resource.</p>\\n         <ul>\\n            <li>\\n               <p>The resource type for health checks is <code>healthcheck</code>.</p>\\n            </li>\\n            <li>\\n               <p>The resource type for hosted zones is <code>hostedzone</code>.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"ResourceId\": {\n                    \"target\": \"com.amazonaws.route53#TagResourceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID for the specified resource.</p>\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.route53#TagList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags associated with the specified resource.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type containing a resource and its associated tags.</p>\"\n            }\n        },\n        \"com.amazonaws.route53#ResourceTagSetList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.route53#ResourceTagSet\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"ResourceTagSet\"\n                }\n            }\n        },\n        \"com.amazonaws.route53#ResourceURI\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 1024\n                }\n            }\n        },\n        \"com.amazonaws.route53#ReusableDelegationSetLimit\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Type\": {\n                    \"target\": \"com.amazonaws.route53#ReusableDelegationSetLimitType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The limit that you requested: <code>MAX_ZONES_BY_REUSABLE_DELEGATION_SET</code>, the\\n\\t\\t\\tmaximum number of hosted zones that you can associate with the specified reusable\\n\\t\\t\\tdelegation set.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Value\": {\n                    \"target\": \"com.amazonaws.route53#LimitValue\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The current value for the <code>MAX_ZONES_BY_REUSABLE_DELEGATION_SET</code>\\n\\t\\t\\tlimit.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that contains the type of limit that you specified in the request and\\n\\t\\t\\tthe current value for that limit.</p>\"\n            }\n        },\n        \"com.amazonaws.route53#ReusableDelegationSetLimitType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"MAX_ZONES_BY_REUSABLE_DELEGATION_SET\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"MAX_ZONES_BY_REUSABLE_DELEGATION_SET\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.route53#RoutingControlArn\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 255\n                }\n            }\n        },\n        \"com.amazonaws.route53#SearchString\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 255\n                }\n            }\n        },\n        \"com.amazonaws.route53#ServeSignature\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 1024\n                }\n            }\n        },\n        \"com.amazonaws.route53#ServicePrincipal\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 128\n                }\n            }\n        },\n        \"com.amazonaws.route53#SigningKeyInteger\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#default\": 0\n            }\n        },\n        \"com.amazonaws.route53#SigningKeyName\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 3,\n                    \"max\": 128\n                }\n            }\n        },\n        \"com.amazonaws.route53#SigningKeyStatus\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 5,\n                    \"max\": 150\n                }\n            }\n        },\n        \"com.amazonaws.route53#SigningKeyStatusMessage\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 512\n                }\n            }\n        },\n        \"com.amazonaws.route53#SigningKeyString\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.route53#SigningKeyTag\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#default\": 0,\n                \"smithy.api#range\": {\n                    \"min\": 0,\n                    \"max\": 65536\n                }\n            }\n        },\n        \"com.amazonaws.route53#Statistic\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"Average\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Average\"\n                    }\n                },\n                \"Sum\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Sum\"\n                    }\n                },\n                \"SampleCount\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"SampleCount\"\n                    }\n                },\n                \"Maximum\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Maximum\"\n                    }\n                },\n                \"Minimum\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Minimum\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.route53#Status\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.route53#StatusReport\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Status\": {\n                    \"target\": \"com.amazonaws.route53#Status\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A description of the status of the health check endpoint as reported by one of the\\n\\t\\t\\tAmazon Route 53 health checkers.</p>\"\n                    }\n                },\n                \"CheckedTime\": {\n                    \"target\": \"com.amazonaws.route53#TimeStamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time that the health checker performed the health check in <a href=\\\"https://en.wikipedia.org/wiki/ISO_8601\\\">ISO 8601 format</a> and Coordinated\\n\\t\\t\\tUniversal Time (UTC). For example, the value <code>2017-03-27T17:48:16.751Z</code>\\n\\t\\t\\trepresents March 27, 2017 at 17:48:16.751 UTC.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that contains the status that one Amazon Route 53 health checker\\n\\t\\t\\treports and the time of the health check.</p>\"\n            }\n        },\n        \"com.amazonaws.route53#SubnetMask\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 3\n                }\n            }\n        },\n        \"com.amazonaws.route53#TTL\": {\n            \"type\": \"long\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 0,\n                    \"max\": 2147483647\n                }\n            }\n        },\n        \"com.amazonaws.route53#Tag\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Key\": {\n                    \"target\": \"com.amazonaws.route53#TagKey\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The value of <code>Key</code> depends on the operation that you want to\\n\\t\\t\\tperform:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <b>Add a tag to a health check or hosted zone</b>:\\n\\t\\t\\t\\t\\t\\t<code>Key</code> is the name that you want to give the new tag.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>Edit a tag</b>: <code>Key</code> is the name of\\n\\t\\t\\t\\t\\tthe tag that you want to change the <code>Value</code> for.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b> Delete a key</b>: <code>Key</code> is the name\\n\\t\\t\\t\\t\\tof the tag you want to remove.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>Give a name to a health check</b>: Edit the\\n\\t\\t\\t\\t\\tdefault <code>Name</code> tag. In the Amazon Route 53 console, the list of your\\n\\t\\t\\t\\t\\thealth checks includes a <b>Name</b> column that lets\\n\\t\\t\\t\\t\\tyou see the name that you've given to each health check.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"Value\": {\n                    \"target\": \"com.amazonaws.route53#TagValue\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The value of <code>Value</code> depends on the operation that you want to\\n\\t\\t\\tperform:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <b>Add a tag to a health check or hosted zone</b>:\\n\\t\\t\\t\\t\\t\\t<code>Value</code> is the value that you want to give the new tag.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>Edit a tag</b>: <code>Value</code> is the new\\n\\t\\t\\t\\t\\tvalue that you want to assign the tag.</p>\\n            </li>\\n         </ul>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that contains information about a tag that you want to add or edit for\\n\\t\\t\\tthe specified health check or hosted zone.</p>\"\n            }\n        },\n        \"com.amazonaws.route53#TagKey\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 128\n                }\n            }\n        },\n        \"com.amazonaws.route53#TagKeyList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.route53#TagKey\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"Key\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 10\n                }\n            }\n        },\n        \"com.amazonaws.route53#TagList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.route53#Tag\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"Tag\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 10\n                }\n            }\n        },\n        \"com.amazonaws.route53#TagResourceId\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 64\n                }\n            }\n        },\n        \"com.amazonaws.route53#TagResourceIdList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.route53#TagResourceId\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"ResourceId\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 10\n                }\n            }\n        },\n        \"com.amazonaws.route53#TagResourceType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"healthcheck\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"healthcheck\"\n                    }\n                },\n                \"hostedzone\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"hostedzone\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.route53#TagValue\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 256\n                }\n            }\n        },\n        \"com.amazonaws.route53#TestDNSAnswer\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.route53#TestDNSAnswerRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.route53#TestDNSAnswerResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidInput\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#NoSuchHostedZone\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Gets the value that Amazon Route 53 returns in response to a DNS request for a\\n\\t\\t\\tspecified record name and type. You can optionally specify the IP address of a DNS\\n\\t\\t\\tresolver, an EDNS0 client subnet IP address, and a subnet mask. </p>\\n         <p>This call only supports querying public hosted zones.</p>\\n         <note>\\n            <p>The <code>TestDnsAnswer </code> returns information similar to what you would expect from the answer\\n\\t\\t\\tsection of the <code>dig</code> command. Therefore, if you query for the name\\n\\t\\t\\tservers of a subdomain that point to the parent name servers, those will not be\\n\\t\\t\\treturned.</p>\\n         </note>\",\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/2013-04-01/testdnsanswer\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.route53#TestDNSAnswerRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"HostedZoneId\": {\n                    \"target\": \"com.amazonaws.route53#ResourceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the hosted zone that you want Amazon Route 53 to simulate a query\\n\\t\\t\\tfor.</p>\",\n                        \"smithy.api#httpQuery\": \"hostedzoneid\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"RecordName\": {\n                    \"target\": \"com.amazonaws.route53#DNSName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the resource record set that you want Amazon Route 53 to simulate a query\\n\\t\\t\\tfor.</p>\",\n                        \"smithy.api#httpQuery\": \"recordname\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"RecordType\": {\n                    \"target\": \"com.amazonaws.route53#RRType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of the resource record set.</p>\",\n                        \"smithy.api#httpQuery\": \"recordtype\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ResolverIP\": {\n                    \"target\": \"com.amazonaws.route53#IPAddress\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If you want to simulate a request from a specific DNS resolver, specify the IP address\\n\\t\\t\\tfor that resolver. If you omit this value, <code>TestDnsAnswer</code> uses the IP\\n\\t\\t\\taddress of a DNS resolver in the Amazon Web Services US East (N. Virginia) Region\\n\\t\\t\\t\\t(<code>us-east-1</code>).</p>\",\n                        \"smithy.api#httpQuery\": \"resolverip\"\n                    }\n                },\n                \"EDNS0ClientSubnetIP\": {\n                    \"target\": \"com.amazonaws.route53#IPAddress\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If the resolver that you specified for resolverip supports EDNS0, specify the IPv4 or\\n\\t\\t\\tIPv6 address of a client in the applicable location, for example,\\n\\t\\t\\t\\t<code>192.0.2.44</code> or <code>2001:db8:85a3::8a2e:370:7334</code>.</p>\",\n                        \"smithy.api#httpQuery\": \"edns0clientsubnetip\"\n                    }\n                },\n                \"EDNS0ClientSubnetMask\": {\n                    \"target\": \"com.amazonaws.route53#SubnetMask\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If you specify an IP address for <code>edns0clientsubnetip</code>, you can optionally\\n\\t\\t\\tspecify the number of bits of the IP address that you want the checking tool to include\\n\\t\\t\\tin the DNS query. For example, if you specify <code>192.0.2.44</code> for\\n\\t\\t\\t\\t<code>edns0clientsubnetip</code> and <code>24</code> for\\n\\t\\t\\t\\t<code>edns0clientsubnetmask</code>, the checking tool will simulate a request from\\n\\t\\t\\t192.0.2.0/24. The default value is 24 bits for IPv4 addresses and 64 bits for IPv6\\n\\t\\t\\taddresses.</p>\\n         <p>The range of valid values depends on whether <code>edns0clientsubnetip</code> is an\\n\\t\\t\\tIPv4 or an IPv6 address:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <b>IPv4</b>: Specify a value between 0 and 32</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>IPv6</b>: Specify a value between 0 and\\n\\t\\t\\t\\t\\t128</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#httpQuery\": \"edns0clientsubnetmask\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Gets the value that Amazon Route 53 returns in response to a DNS request for a\\n\\t\\t\\tspecified record name and type. You can optionally specify the IP address of a DNS\\n\\t\\t\\tresolver, an EDNS0 client subnet IP address, and a subnet mask. </p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.route53#TestDNSAnswerResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Nameserver\": {\n                    \"target\": \"com.amazonaws.route53#Nameserver\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Route 53 name server used to respond to the request.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"RecordName\": {\n                    \"target\": \"com.amazonaws.route53#DNSName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the resource record set that you submitted a request for.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"RecordType\": {\n                    \"target\": \"com.amazonaws.route53#RRType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of the resource record set that you submitted a request for.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"RecordData\": {\n                    \"target\": \"com.amazonaws.route53#RecordData\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list that contains values that Amazon Route 53 returned for this resource record\\n\\t\\t\\tset.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ResponseCode\": {\n                    \"target\": \"com.amazonaws.route53#DNSRCode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A code that indicates whether the request is valid or not. The most common response\\n\\t\\t\\tcode is <code>NOERROR</code>, meaning that the request is valid. If the response is not\\n\\t\\t\\tvalid, Amazon Route 53 returns a response code that describes the error. For a list of\\n\\t\\t\\tpossible response codes, see <a href=\\\"http://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml#dns-parameters-6\\\">DNS RCODES</a> on the IANA website. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Protocol\": {\n                    \"target\": \"com.amazonaws.route53#TransportProtocol\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The protocol that Amazon Route 53 used to respond to the request, either\\n\\t\\t\\t\\t<code>UDP</code> or <code>TCP</code>. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that contains the response to a <code>TestDNSAnswer</code> request.\\n\\t\\t</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.route53#Threshold\": {\n            \"type\": \"double\"\n        },\n        \"com.amazonaws.route53#ThrottlingException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.route53#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The limit on the number of requests per second was exceeded.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.route53#TimeStamp\": {\n            \"type\": \"timestamp\"\n        },\n        \"com.amazonaws.route53#TooManyHealthChecks\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.route53#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This health check can't be created because the current account has reached the limit\\n\\t\\t\\ton the number of active health checks.</p>\\n         <p>For information about default limits, see <a href=\\\"https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/DNSLimitations.html\\\">Limits</a> in the\\n\\t\\t\\t\\t<i>Amazon Route 53 Developer Guide</i>.</p>\\n         <p>For information about how to get the current limit for an account, see <a href=\\\"https://docs.aws.amazon.com/Route53/latest/APIReference/API_GetAccountLimit.html\\\">GetAccountLimit</a>. To request a higher limit, <a href=\\\"http://aws.amazon.com/route53-request\\\">create a case</a> with the Amazon Web Services Support\\n\\t\\t\\tCenter.</p>\\n         <p>You have reached the maximum number of active health checks for an Amazon Web Services account. To request a higher limit, <a href=\\\"http://aws.amazon.com/route53-request\\\">create a case</a> with the Amazon Web Services Support\\n\\t\\t\\tCenter.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.route53#TooManyHostedZones\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.route53#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This operation can't be completed either because the current account has reached the\\n\\t\\t\\tlimit on the number of hosted zones or because you've reached the limit on the number of\\n\\t\\t\\thosted zones that can be associated with a reusable delegation set.</p>\\n         <p>For information about default limits, see <a href=\\\"https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/DNSLimitations.html\\\">Limits</a> in the\\n\\t\\t\\t\\t<i>Amazon Route 53 Developer Guide</i>.</p>\\n         <p>To get the current limit on hosted zones that can be created by an account, see <a href=\\\"https://docs.aws.amazon.com/Route53/latest/APIReference/API_GetAccountLimit.html\\\">GetAccountLimit</a>.</p>\\n         <p>To get the current limit on hosted zones that can be associated with a reusable\\n\\t\\t\\tdelegation set, see <a href=\\\"https://docs.aws.amazon.com/Route53/latest/APIReference/API_GetReusableDelegationSetLimit.html\\\">GetReusableDelegationSetLimit</a>.</p>\\n         <p>To request a higher limit, <a href=\\\"http://aws.amazon.com/route53-request\\\">create a\\n\\t\\t\\t\\tcase</a> with the Amazon Web Services Support Center.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.route53#TooManyKeySigningKeys\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.route53#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>You've reached the limit for the number of key-signing keys (KSKs). Remove at least\\n\\t\\t\\tone KSK, and then try again.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.route53#TooManyTrafficPolicies\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.route53#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This traffic policy can't be created because the current account has reached the limit\\n\\t\\t\\ton the number of traffic policies.</p>\\n         <p>For information about default limits, see <a href=\\\"https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/DNSLimitations.html\\\">Limits</a> in the\\n\\t\\t\\t\\t<i>Amazon Route 53 Developer Guide</i>.</p>\\n         <p>To get the current limit for an account, see <a href=\\\"https://docs.aws.amazon.com/Route53/latest/APIReference/API_GetAccountLimit.html\\\">GetAccountLimit</a>. </p>\\n         <p>To request a higher limit, <a href=\\\"http://aws.amazon.com/route53-request\\\">create a\\n\\t\\t\\t\\tcase</a> with the Amazon Web Services Support Center.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.route53#TooManyTrafficPolicyInstances\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.route53#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This traffic policy instance can't be created because the current account has reached\\n\\t\\t\\tthe limit on the number of traffic policy instances.</p>\\n         <p>For information about default limits, see <a href=\\\"https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/DNSLimitations.html\\\">Limits</a> in the\\n\\t\\t\\t\\t<i>Amazon Route 53 Developer Guide</i>.</p>\\n         <p>For information about how to get the current limit for an account, see <a href=\\\"https://docs.aws.amazon.com/Route53/latest/APIReference/API_GetAccountLimit.html\\\">GetAccountLimit</a>.</p>\\n         <p>To request a higher limit, <a href=\\\"http://aws.amazon.com/route53-request\\\">create a\\n\\t\\t\\t\\tcase</a> with the Amazon Web Services Support Center.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.route53#TooManyTrafficPolicyVersionsForCurrentPolicy\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.route53#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This traffic policy version can't be created because you've reached the limit of 1000\\n\\t\\t\\ton the number of versions that you can create for the current traffic policy.</p>\\n         <p>To create more traffic policy versions, you can use <a href=\\\"https://docs.aws.amazon.com/Route53/latest/APIReference/API_GetTrafficPolicy.html\\\">GetTrafficPolicy</a>\\n\\t\\t\\tto get the traffic policy document for a specified traffic policy version, and then use\\n\\t\\t\\t\\t<a href=\\\"https://docs.aws.amazon.com/Route53/latest/APIReference/API_CreateTrafficPolicy.html\\\">CreateTrafficPolicy</a> to create a new traffic policy using the traffic policy\\n\\t\\t\\tdocument.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.route53#TooManyVPCAssociationAuthorizations\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.route53#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>You've created the maximum number of authorizations that can be created for the\\n\\t\\t\\tspecified hosted zone. To authorize another VPC to be associated with the hosted zone,\\n\\t\\t\\tsubmit a <code>DeleteVPCAssociationAuthorization</code> request to remove an existing\\n\\t\\t\\tauthorization. To get a list of existing authorizations, submit a\\n\\t\\t\\t\\t<code>ListVPCAssociationAuthorizations</code> request.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.route53#TrafficPolicies\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.route53#TrafficPolicy\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"TrafficPolicy\"\n                }\n            }\n        },\n        \"com.amazonaws.route53#TrafficPolicy\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Id\": {\n                    \"target\": \"com.amazonaws.route53#TrafficPolicyId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID that Amazon Route 53 assigned to a traffic policy when you created it.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Version\": {\n                    \"target\": \"com.amazonaws.route53#TrafficPolicyVersion\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The version number that Amazon Route 53 assigns to a traffic policy. For a new traffic\\n\\t\\t\\tpolicy, the value of <code>Version</code> is always 1.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Name\": {\n                    \"target\": \"com.amazonaws.route53#TrafficPolicyName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name that you specified when you created the traffic policy.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Type\": {\n                    \"target\": \"com.amazonaws.route53#RRType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The DNS type of the resource record sets that Amazon Route 53 creates when you use a\\n\\t\\t\\ttraffic policy to create a traffic policy instance.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Document\": {\n                    \"target\": \"com.amazonaws.route53#TrafficPolicyDocument\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The definition of a traffic policy in JSON format. You specify the JSON document to\\n\\t\\t\\tuse for a new traffic policy in the <code>CreateTrafficPolicy</code> request. For more\\n\\t\\t\\tinformation about the JSON format, see <a href=\\\"https://docs.aws.amazon.com/Route53/latest/APIReference/api-policies-traffic-policy-document-format.html\\\">Traffic Policy Document Format</a>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Comment\": {\n                    \"target\": \"com.amazonaws.route53#TrafficPolicyComment\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The comment that you specify in the <code>CreateTrafficPolicy</code> request, if\\n\\t\\t\\tany.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that contains settings for a traffic policy.</p>\"\n            }\n        },\n        \"com.amazonaws.route53#TrafficPolicyAlreadyExists\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.route53#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A traffic policy that has the same value for <code>Name</code> already exists.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 409\n            }\n        },\n        \"com.amazonaws.route53#TrafficPolicyComment\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 1024\n                }\n            }\n        },\n        \"com.amazonaws.route53#TrafficPolicyDocument\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 102400\n                }\n            }\n        },\n        \"com.amazonaws.route53#TrafficPolicyId\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 36\n                }\n            }\n        },\n        \"com.amazonaws.route53#TrafficPolicyInUse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.route53#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>One or more traffic policy instances were created by using the specified traffic\\n\\t\\t\\tpolicy.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.route53#TrafficPolicyInstance\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Id\": {\n                    \"target\": \"com.amazonaws.route53#TrafficPolicyInstanceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID that Amazon Route 53 assigned to the new traffic policy instance.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"HostedZoneId\": {\n                    \"target\": \"com.amazonaws.route53#ResourceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the hosted zone that Amazon Route 53 created resource record sets in.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Name\": {\n                    \"target\": \"com.amazonaws.route53#DNSName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The DNS name, such as www.example.com, for which Amazon Route 53 responds to queries\\n\\t\\t\\tby using the resource record sets that are associated with this traffic policy instance.\\n\\t\\t</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TTL\": {\n                    \"target\": \"com.amazonaws.route53#TTL\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The TTL that Amazon Route 53 assigned to all of the resource record sets that it\\n\\t\\t\\tcreated in the specified hosted zone.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.route53#TrafficPolicyInstanceState\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The value of <code>State</code> is one of the following values:</p>\\n         <dl>\\n            <dt>Applied</dt>\\n            <dd>\\n               <p>Amazon Route 53 has finished creating resource record sets, and changes\\n\\t\\t\\t\\t\\t\\thave propagated to all Route 53 edge locations.</p>\\n            </dd>\\n            <dt>Creating</dt>\\n            <dd>\\n               <p>Route 53 is creating the resource record sets. Use\\n\\t\\t\\t\\t\\t\\t\\t<code>GetTrafficPolicyInstance</code> to confirm that the\\n\\t\\t\\t\\t\\t\\t\\t<code>CreateTrafficPolicyInstance</code> request completed\\n\\t\\t\\t\\t\\t\\tsuccessfully.</p>\\n            </dd>\\n            <dt>Failed</dt>\\n            <dd>\\n               <p>Route 53 wasn't able to create or update the resource record sets. When\\n\\t\\t\\t\\t\\t\\tthe value of <code>State</code> is <code>Failed</code>, see\\n\\t\\t\\t\\t\\t\\t\\t<code>Message</code> for an explanation of what caused the request to\\n\\t\\t\\t\\t\\t\\tfail.</p>\\n            </dd>\\n         </dl>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Message\": {\n                    \"target\": \"com.amazonaws.route53#Message\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If <code>State</code> is <code>Failed</code>, an explanation of the reason for the\\n\\t\\t\\tfailure. If <code>State</code> is another value, <code>Message</code> is empty.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TrafficPolicyId\": {\n                    \"target\": \"com.amazonaws.route53#TrafficPolicyId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the traffic policy that Amazon Route 53 used to create resource record sets\\n\\t\\t\\tin the specified hosted zone.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TrafficPolicyVersion\": {\n                    \"target\": \"com.amazonaws.route53#TrafficPolicyVersion\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The version of the traffic policy that Amazon Route 53 used to create resource record\\n\\t\\t\\tsets in the specified hosted zone.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TrafficPolicyType\": {\n                    \"target\": \"com.amazonaws.route53#RRType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The DNS type that Amazon Route 53 assigned to all of the resource record sets that it\\n\\t\\t\\tcreated for this traffic policy instance. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that contains settings for the new traffic policy instance.</p>\"\n            }\n        },\n        \"com.amazonaws.route53#TrafficPolicyInstanceAlreadyExists\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.route53#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>There is already a traffic policy instance with the specified ID.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 409\n            }\n        },\n        \"com.amazonaws.route53#TrafficPolicyInstanceCount\": {\n            \"type\": \"integer\"\n        },\n        \"com.amazonaws.route53#TrafficPolicyInstanceId\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 36\n                }\n            }\n        },\n        \"com.amazonaws.route53#TrafficPolicyInstanceState\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.route53#TrafficPolicyInstances\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.route53#TrafficPolicyInstance\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"TrafficPolicyInstance\"\n                }\n            }\n        },\n        \"com.amazonaws.route53#TrafficPolicyName\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 512\n                }\n            }\n        },\n        \"com.amazonaws.route53#TrafficPolicySummaries\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.route53#TrafficPolicySummary\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"TrafficPolicySummary\"\n                }\n            }\n        },\n        \"com.amazonaws.route53#TrafficPolicySummary\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Id\": {\n                    \"target\": \"com.amazonaws.route53#TrafficPolicyId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID that Amazon Route 53 assigned to the traffic policy when you created it.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Name\": {\n                    \"target\": \"com.amazonaws.route53#TrafficPolicyName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name that you specified for the traffic policy when you created it.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Type\": {\n                    \"target\": \"com.amazonaws.route53#RRType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The DNS type of the resource record sets that Amazon Route 53 creates when you use a\\n\\t\\t\\ttraffic policy to create a traffic policy instance.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"LatestVersion\": {\n                    \"target\": \"com.amazonaws.route53#TrafficPolicyVersion\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The version number of the latest version of the traffic policy.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TrafficPolicyCount\": {\n                    \"target\": \"com.amazonaws.route53#TrafficPolicyVersion\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of traffic policies that are associated with the current Amazon Web Services account.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that contains information about the latest version of one traffic\\n\\t\\t\\tpolicy that is associated with the current Amazon Web Services account.</p>\"\n            }\n        },\n        \"com.amazonaws.route53#TrafficPolicyVersion\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.route53#TrafficPolicyVersionMarker\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 4\n                }\n            }\n        },\n        \"com.amazonaws.route53#TransportProtocol\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.route53#UUID\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#pattern\": \"^[0-9a-f]{8}-(?:[0-9a-f]{4}-){3}[0-9a-f]{12}$\"\n            }\n        },\n        \"com.amazonaws.route53#UpdateHealthCheck\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.route53#UpdateHealthCheckRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.route53#UpdateHealthCheckResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.route53#HealthCheckVersionMismatch\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidInput\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#NoSuchHealthCheck\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Updates an existing health check. Note that some values can't be updated. </p>\\n         <p>For more information about updating health checks, see <a href=\\\"https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/health-checks-creating-deleting.html\\\">Creating,\\n\\t\\t\\t\\tUpdating, and Deleting Health Checks</a> in the <i>Amazon Route 53\\n\\t\\t\\t\\tDeveloper Guide</i>.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"POST\",\n                    \"uri\": \"/2013-04-01/healthcheck/{HealthCheckId}\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.route53#UpdateHealthCheckRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"HealthCheckId\": {\n                    \"target\": \"com.amazonaws.route53#HealthCheckId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID for the health check for which you want detailed information. When you created\\n\\t\\t\\tthe health check, <code>CreateHealthCheck</code> returned the ID in the response, in the\\n\\t\\t\\t\\t<code>HealthCheckId</code> element.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"HealthCheckVersion\": {\n                    \"target\": \"com.amazonaws.route53#HealthCheckVersion\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A sequential counter that Amazon Route 53 sets to <code>1</code> when you create a\\n\\t\\t\\thealth check and increments by 1 each time you update settings for the health\\n\\t\\t\\tcheck.</p>\\n         <p>We recommend that you use <code>GetHealthCheck</code> or <code>ListHealthChecks</code>\\n\\t\\t\\tto get the current value of <code>HealthCheckVersion</code> for the health check that\\n\\t\\t\\tyou want to update, and that you include that value in your\\n\\t\\t\\t\\t<code>UpdateHealthCheck</code> request. This prevents Route 53 from overwriting an\\n\\t\\t\\tintervening update:</p>\\n         <ul>\\n            <li>\\n               <p>If the value in the <code>UpdateHealthCheck</code> request matches the value\\n\\t\\t\\t\\t\\tof <code>HealthCheckVersion</code> in the health check, Route 53 updates the\\n\\t\\t\\t\\t\\thealth check with the new settings.</p>\\n            </li>\\n            <li>\\n               <p>If the value of <code>HealthCheckVersion</code> in the health check is\\n\\t\\t\\t\\t\\tgreater, the health check was changed after you got the version number. Route 53\\n\\t\\t\\t\\t\\tdoes not update the health check, and it returns a\\n\\t\\t\\t\\t\\t\\t<code>HealthCheckVersionMismatch</code> error.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"IPAddress\": {\n                    \"target\": \"com.amazonaws.route53#IPAddress\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IPv4 or IPv6 IP address for the endpoint that you want Amazon Route 53 to perform\\n\\t\\t\\thealth checks on. If you don't specify a value for <code>IPAddress</code>, Route 53\\n\\t\\t\\tsends a DNS request to resolve the domain name that you specify in\\n\\t\\t\\t\\t<code>FullyQualifiedDomainName</code> at the interval that you specify in\\n\\t\\t\\t\\t<code>RequestInterval</code>. Using an IP address that is returned by DNS, Route 53\\n\\t\\t\\tthen checks the health of the endpoint.</p>\\n         <p>Use one of the following formats for the value of <code>IPAddress</code>: </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <b>IPv4 address</b>: four values between 0 and 255,\\n\\t\\t\\t\\t\\tseparated by periods (.), for example, <code>192.0.2.44</code>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>IPv6 address</b>: eight groups of four\\n\\t\\t\\t\\t\\thexadecimal values, separated by colons (:), for example,\\n\\t\\t\\t\\t\\t\\t<code>2001:0db8:85a3:0000:0000:abcd:0001:2345</code>. You can also shorten\\n\\t\\t\\t\\t\\tIPv6 addresses as described in RFC 5952, for example,\\n\\t\\t\\t\\t\\t\\t<code>2001:db8:85a3::abcd:1:2345</code>.</p>\\n            </li>\\n         </ul>\\n         <p>If the endpoint is an EC2 instance, we recommend that you create an Elastic IP\\n\\t\\t\\taddress, associate it with your EC2 instance, and specify the Elastic IP address for\\n\\t\\t\\t\\t<code>IPAddress</code>. This ensures that the IP address of your instance never\\n\\t\\t\\tchanges. For more information, see the applicable documentation:</p>\\n         <ul>\\n            <li>\\n               <p>Linux: <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/elastic-ip-addresses-eip.html\\\">Elastic IP\\n\\t\\t\\t\\t\\t\\tAddresses (EIP)</a> in the <i>Amazon EC2 User Guide for Linux\\n\\t\\t\\t\\t\\t\\tInstances</i>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Windows: <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/elastic-ip-addresses-eip.html\\\">Elastic IP\\n\\t\\t\\t\\t\\t\\tAddresses (EIP)</a> in the <i>Amazon EC2 User Guide for Windows\\n\\t\\t\\t\\t\\t\\tInstances</i>\\n               </p>\\n            </li>\\n         </ul>\\n         <note>\\n            <p>If a health check already has a value for <code>IPAddress</code>, you can change\\n\\t\\t\\t\\tthe value. However, you can't update an existing health check to add or remove the\\n\\t\\t\\t\\tvalue of <code>IPAddress</code>. </p>\\n         </note>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/Route53/latest/APIReference/API_UpdateHealthCheck.html#Route53-UpdateHealthCheck-request-FullyQualifiedDomainName\\\">FullyQualifiedDomainName</a>. </p>\\n         <p>Constraints: Route 53 can't check the health of endpoints for which the IP address is\\n\\t\\t\\tin local, private, non-routable, or multicast ranges. For more information about IP\\n\\t\\t\\taddresses for which you can't create health checks, see the following documents:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://tools.ietf.org/html/rfc5735\\\">RFC 5735, Special Use IPv4\\n\\t\\t\\t\\t\\t\\tAddresses</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://tools.ietf.org/html/rfc6598\\\">RFC 6598, IANA-Reserved IPv4\\n\\t\\t\\t\\t\\t\\tPrefix for Shared Address Space</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://tools.ietf.org/html/rfc5156\\\">RFC 5156, Special-Use IPv6\\n\\t\\t\\t\\t\\t\\tAddresses</a>\\n               </p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"Port\": {\n                    \"target\": \"com.amazonaws.route53#Port\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The port on the endpoint that you want Amazon Route 53 to perform health checks\\n\\t\\t\\ton.</p>\\n         <note>\\n            <p>Don't specify a value for <code>Port</code> when you specify a value for\\n\\t\\t\\t\\t\\t<code>Type</code> of <code>CLOUDWATCH_METRIC</code> or\\n\\t\\t\\t\\t<code>CALCULATED</code>.</p>\\n         </note>\"\n                    }\n                },\n                \"ResourcePath\": {\n                    \"target\": \"com.amazonaws.route53#ResourcePath\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The path that you want Amazon Route 53 to request when performing health checks. The\\n\\t\\t\\tpath can be any value for which your endpoint will return an HTTP status code of 2xx or\\n\\t\\t\\t3xx when the endpoint is healthy, for example the file /docs/route53-health-check.html.\\n\\t\\t\\tYou can also include query string parameters, for example,\\n\\t\\t\\t\\t<code>/welcome.html?language=jp&login=y</code>. </p>\\n         <p>Specify this value only if you want to change it.</p>\"\n                    }\n                },\n                \"FullyQualifiedDomainName\": {\n                    \"target\": \"com.amazonaws.route53#FullyQualifiedDomainName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Amazon Route 53 behavior depends on whether you specify a value for\\n\\t\\t\\t\\t<code>IPAddress</code>.</p>\\n         <note>\\n            <p>If a health check already has a value for <code>IPAddress</code>, you can change\\n\\t\\t\\t\\tthe value. However, you can't update an existing health check to add or remove the\\n\\t\\t\\t\\tvalue of <code>IPAddress</code>. </p>\\n         </note>\\n         <p>\\n            <b>If you specify a value for</b>\\n            <code>IPAddress</code>:</p>\\n         <p>Route 53 sends health check requests to the specified IPv4 or IPv6 address and passes\\n\\t\\t\\tthe value of <code>FullyQualifiedDomainName</code> in the <code>Host</code> header for\\n\\t\\t\\tall health checks except TCP health checks. This is typically the fully qualified DNS\\n\\t\\t\\tname of the endpoint on which you want Route 53 to perform health checks.</p>\\n         <p>When Route 53 checks the health of an endpoint, here is how it constructs the\\n\\t\\t\\t\\t<code>Host</code> header:</p>\\n         <ul>\\n            <li>\\n               <p>If you specify a value of <code>80</code> for <code>Port</code> and\\n\\t\\t\\t\\t\\t\\t<code>HTTP</code> or <code>HTTP_STR_MATCH</code> for <code>Type</code>,\\n\\t\\t\\t\\t\\tRoute 53 passes the value of <code>FullyQualifiedDomainName</code> to the\\n\\t\\t\\t\\t\\tendpoint in the <code>Host</code> header.</p>\\n            </li>\\n            <li>\\n               <p>If you specify a value of <code>443</code> for <code>Port</code> and\\n\\t\\t\\t\\t\\t\\t<code>HTTPS</code> or <code>HTTPS_STR_MATCH</code> for <code>Type</code>,\\n\\t\\t\\t\\t\\tRoute 53 passes the value of <code>FullyQualifiedDomainName</code> to the\\n\\t\\t\\t\\t\\tendpoint in the <code>Host</code> header.</p>\\n            </li>\\n            <li>\\n               <p>If you specify another value for <code>Port</code> and any value except\\n\\t\\t\\t\\t\\t\\t<code>TCP</code> for <code>Type</code>, Route 53 passes\\n\\t\\t\\t\\t\\t\\t\\t<i>\\n                     <code>FullyQualifiedDomainName</code>:<code>Port</code>\\n                  </i>\\n\\t\\t\\t\\t\\tto the endpoint in the <code>Host</code> header.</p>\\n            </li>\\n         </ul>\\n         <p>If you don't specify a value for <code>FullyQualifiedDomainName</code>, Route 53\\n\\t\\t\\tsubstitutes the value of <code>IPAddress</code> in the <code>Host</code> header in each\\n\\t\\t\\tof the above cases.</p>\\n         <p>\\n            <b>If you don't specify a value for</b>\\n            <code>IPAddress</code>:</p>\\n         <p>If you don't specify a value for <code>IPAddress</code>, Route 53 sends a DNS request\\n\\t\\t\\tto the domain that you specify in <code>FullyQualifiedDomainName</code> at the interval\\n\\t\\t\\tyou specify in <code>RequestInterval</code>. Using an IPv4 address that is returned by\\n\\t\\t\\tDNS, Route 53 then checks the health of the endpoint.</p>\\n         <p>If you don't specify a value for <code>IPAddress</code>, you can’t update the health check to remove the <code>FullyQualifiedDomainName</code>; if you don’t specify a value for <code>IPAddress</code> on creation, a \\n\\t\\t\\t<code>FullyQualifiedDomainName</code> is required.</p>\\n         <note>\\n            <p>If you don't specify a value for <code>IPAddress</code>, Route 53 uses only IPv4\\n\\t\\t\\t\\tto send health checks to the endpoint. If there's no resource record set with a type\\n\\t\\t\\t\\tof A for the name that you specify for <code>FullyQualifiedDomainName</code>, the\\n\\t\\t\\t\\thealth check fails with a \\\"DNS resolution failed\\\" error.</p>\\n         </note>\\n         <p>If you want to check the health of weighted, latency, or failover resource record sets\\n\\t\\t\\tand you choose to specify the endpoint only by <code>FullyQualifiedDomainName</code>, we\\n\\t\\t\\trecommend that you create a separate health check for each endpoint. For example, create\\n\\t\\t\\ta health check for each HTTP server that is serving content for www.example.com. For the\\n\\t\\t\\tvalue of <code>FullyQualifiedDomainName</code>, specify the domain name of the server\\n\\t\\t\\t(such as <code>us-east-2-www.example.com</code>), not the name of the resource record\\n\\t\\t\\tsets (www.example.com).</p>\\n         <important>\\n            <p>In this configuration, if the value of <code>FullyQualifiedDomainName</code>\\n\\t\\t\\t\\tmatches the name of the resource record sets and you then associate the health check\\n\\t\\t\\t\\twith those resource record sets, health check results will be unpredictable.</p>\\n         </important>\\n         <p>In addition, if the value of <code>Type</code> is <code>HTTP</code>,\\n\\t\\t\\t\\t<code>HTTPS</code>, <code>HTTP_STR_MATCH</code>, or <code>HTTPS_STR_MATCH</code>,\\n\\t\\t\\tRoute 53 passes the value of <code>FullyQualifiedDomainName</code> in the\\n\\t\\t\\t\\t<code>Host</code> header, as it does when you specify a value for\\n\\t\\t\\t\\t<code>IPAddress</code>. If the value of <code>Type</code> is <code>TCP</code>, Route\\n\\t\\t\\t53 doesn't pass a <code>Host</code> header.</p>\"\n                    }\n                },\n                \"SearchString\": {\n                    \"target\": \"com.amazonaws.route53#SearchString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If the value of <code>Type</code> is <code>HTTP_STR_MATCH</code> or\\n\\t\\t\\t\\t<code>HTTPS_STR_MATCH</code>, the string that you want Amazon Route 53 to search for\\n\\t\\t\\tin the response body from the specified resource. If the string appears in the response\\n\\t\\t\\tbody, Route 53 considers the resource healthy. (You can't change the value of\\n\\t\\t\\t\\t<code>Type</code> when you update a health check.)</p>\"\n                    }\n                },\n                \"FailureThreshold\": {\n                    \"target\": \"com.amazonaws.route53#FailureThreshold\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of consecutive health checks that an endpoint must pass or fail for Amazon\\n\\t\\t\\tRoute 53 to change the current status of the endpoint from unhealthy to healthy or vice\\n\\t\\t\\tversa. For more information, see <a href=\\\"https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/dns-failover-determining-health-of-endpoints.html\\\">How Amazon Route 53 Determines Whether an Endpoint Is Healthy</a> in the\\n\\t\\t\\t\\t<i>Amazon Route 53 Developer Guide</i>.</p>\\n         <p>If you don't specify a value for <code>FailureThreshold</code>, the default value is\\n\\t\\t\\tthree health checks.</p>\"\n                    }\n                },\n                \"Inverted\": {\n                    \"target\": \"com.amazonaws.route53#Inverted\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify whether you want Amazon Route 53 to invert the status of a health check, for\\n\\t\\t\\texample, to consider a health check unhealthy when it otherwise would be considered\\n\\t\\t\\thealthy.</p>\"\n                    }\n                },\n                \"Disabled\": {\n                    \"target\": \"com.amazonaws.route53#Disabled\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Stops Route 53 from performing health checks. When you disable a health check, here's\\n\\t\\t\\twhat happens:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <b>Health checks that check the health of\\n\\t\\t\\t\\t\\t\\tendpoints:</b> Route 53 stops submitting requests to your\\n\\t\\t\\t\\t\\tapplication, server, or other resource.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>Calculated health checks:</b> Route 53 stops\\n\\t\\t\\t\\t\\taggregating the status of the referenced health checks.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>Health checks that monitor CloudWatch alarms:</b>\\n\\t\\t\\t\\t\\tRoute 53 stops monitoring the corresponding CloudWatch metrics.</p>\\n            </li>\\n         </ul>\\n         <p>After you disable a health check, Route 53 considers the status of the health check to\\n\\t\\t\\talways be healthy. If you configured DNS failover, Route 53 continues to route traffic\\n\\t\\t\\tto the corresponding resources. Additionally, in disabled state, you can also invert the\\n\\t\\t\\tstatus of the health check to route traffic differently. For more information, see\\n\\t\\t\\t\\t<a href=\\\"https://docs.aws.amazon.com/Route53/latest/APIReference/API_UpdateHealthCheck.html#Route53-UpdateHealthCheck-request-Inverted\\\">Inverted</a>. </p>\\n         <p>Charges for a health check still apply when the health check is disabled. For more\\n\\t\\t\\tinformation, see <a href=\\\"http://aws.amazon.com/route53/pricing/\\\">Amazon Route 53\\n\\t\\t\\t\\tPricing</a>.</p>\"\n                    }\n                },\n                \"HealthThreshold\": {\n                    \"target\": \"com.amazonaws.route53#HealthThreshold\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of child health checks that are associated with a <code>CALCULATED</code>\\n\\t\\t\\thealth that Amazon Route 53 must consider healthy for the <code>CALCULATED</code> health\\n\\t\\t\\tcheck to be considered healthy. To specify the child health checks that you want to\\n\\t\\t\\tassociate with a <code>CALCULATED</code> health check, use the\\n\\t\\t\\t\\t<code>ChildHealthChecks</code> and <code>ChildHealthCheck</code> elements.</p>\\n         <p>Note the following:</p>\\n         <ul>\\n            <li>\\n               <p>If you specify a number greater than the number of child health checks, Route\\n\\t\\t\\t\\t\\t53 always considers this health check to be unhealthy.</p>\\n            </li>\\n            <li>\\n               <p>If you specify <code>0</code>, Route 53 always considers this health check to\\n\\t\\t\\t\\t\\tbe healthy.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"ChildHealthChecks\": {\n                    \"target\": \"com.amazonaws.route53#ChildHealthCheckList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A complex type that contains one <code>ChildHealthCheck</code> element for each health\\n\\t\\t\\tcheck that you want to associate with a <code>CALCULATED</code> health check.</p>\"\n                    }\n                },\n                \"EnableSNI\": {\n                    \"target\": \"com.amazonaws.route53#EnableSNI\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify whether you want Amazon Route 53 to send the value of\\n\\t\\t\\t\\t<code>FullyQualifiedDomainName</code> to the endpoint in the\\n\\t\\t\\t\\t<code>client_hello</code> message during <code>TLS</code> negotiation. This allows\\n\\t\\t\\tthe endpoint to respond to <code>HTTPS</code> health check requests with the applicable\\n\\t\\t\\tSSL/TLS certificate.</p>\\n         <p>Some endpoints require that HTTPS requests include the host name in the\\n\\t\\t\\t\\t<code>client_hello</code> message. If you don't enable SNI, the status of the health\\n\\t\\t\\tcheck will be SSL alert <code>handshake_failure</code>. A health check can also have\\n\\t\\t\\tthat status for other reasons. If SNI is enabled and you're still getting the error,\\n\\t\\t\\tcheck the SSL/TLS configuration on your endpoint and confirm that your certificate is\\n\\t\\t\\tvalid.</p>\\n         <p>The SSL/TLS certificate on your endpoint includes a domain name in the <code>Common\\n\\t\\t\\t\\tName</code> field and possibly several more in the <code>Subject Alternative\\n\\t\\t\\t\\tNames</code> field. One of the domain names in the certificate should match the\\n\\t\\t\\tvalue that you specify for <code>FullyQualifiedDomainName</code>. If the endpoint\\n\\t\\t\\tresponds to the <code>client_hello</code> message with a certificate that does not\\n\\t\\t\\tinclude the domain name that you specified in <code>FullyQualifiedDomainName</code>, a\\n\\t\\t\\thealth checker will retry the handshake. In the second attempt, the health checker will\\n\\t\\t\\tomit <code>FullyQualifiedDomainName</code> from the <code>client_hello</code>\\n\\t\\t\\tmessage.</p>\"\n                    }\n                },\n                \"Regions\": {\n                    \"target\": \"com.amazonaws.route53#HealthCheckRegionList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A complex type that contains one <code>Region</code> element for each region that you\\n\\t\\t\\twant Amazon Route 53 health checkers to check the specified endpoint from.</p>\"\n                    }\n                },\n                \"AlarmIdentifier\": {\n                    \"target\": \"com.amazonaws.route53#AlarmIdentifier\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A complex type that identifies the CloudWatch alarm that you want Amazon Route 53\\n\\t\\t\\thealth checkers to use to determine whether the specified health check is\\n\\t\\t\\thealthy.</p>\"\n                    }\n                },\n                \"InsufficientDataHealthStatus\": {\n                    \"target\": \"com.amazonaws.route53#InsufficientDataHealthStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>When CloudWatch has insufficient data about the metric to determine the alarm state,\\n\\t\\t\\tthe status that you want Amazon Route 53 to assign to the health check:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>Healthy</code>: Route 53 considers the health check to be\\n\\t\\t\\t\\t\\thealthy.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>Unhealthy</code>: Route 53 considers the health check to be\\n\\t\\t\\t\\t\\tunhealthy.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>LastKnownStatus</code>: By default, Route 53 uses the status of the\\n\\t\\t\\t\\t\\thealth check from the last time CloudWatch had sufficient data to determine the\\n\\t\\t\\t\\t\\talarm state. For new health checks that have no last known status, the status\\n\\t\\t\\t\\t\\tfor the health check is healthy.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"ResetElements\": {\n                    \"target\": \"com.amazonaws.route53#ResettableElementNameList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A complex type that contains one <code>ResettableElementName</code> element for each\\n\\t\\t\\telement that you want to reset to the default value. Valid values for\\n\\t\\t\\t\\t<code>ResettableElementName</code> include the following:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>ChildHealthChecks</code>: Amazon Route 53 resets <a href=\\\"https://docs.aws.amazon.com/Route53/latest/APIReference/API_HealthCheckConfig.html#Route53-Type-HealthCheckConfig-ChildHealthChecks\\\">ChildHealthChecks</a> to null.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>FullyQualifiedDomainName</code>: Route 53 resets <a href=\\\"https://docs.aws.amazon.com/Route53/latest/APIReference/API_UpdateHealthCheck.html#Route53-UpdateHealthCheck-request-FullyQualifiedDomainName\\\">FullyQualifiedDomainName</a>. to null.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>Regions</code>: Route 53 resets the <a href=\\\"https://docs.aws.amazon.com/Route53/latest/APIReference/API_HealthCheckConfig.html#Route53-Type-HealthCheckConfig-Regions\\\">Regions</a> list to the default set of regions. </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ResourcePath</code>: Route 53 resets <a href=\\\"https://docs.aws.amazon.com/Route53/latest/APIReference/API_HealthCheckConfig.html#Route53-Type-HealthCheckConfig-ResourcePath\\\">ResourcePath</a> to null.</p>\\n            </li>\\n         </ul>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that contains information about a request to update a health\\n\\t\\t\\tcheck.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.route53#UpdateHealthCheckResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"HealthCheck\": {\n                    \"target\": \"com.amazonaws.route53#HealthCheck\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A complex type that contains the response to an <code>UpdateHealthCheck</code>\\n\\t\\t\\trequest.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that contains the response to the <code>UpdateHealthCheck</code>\\n\\t\\t\\trequest.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.route53#UpdateHostedZoneComment\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.route53#UpdateHostedZoneCommentRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.route53#UpdateHostedZoneCommentResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidInput\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#NoSuchHostedZone\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#PriorRequestNotComplete\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Updates the comment for a specified hosted zone.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"POST\",\n                    \"uri\": \"/2013-04-01/hostedzone/{Id}\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.route53#UpdateHostedZoneCommentRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Id\": {\n                    \"target\": \"com.amazonaws.route53#ResourceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID for the hosted zone that you want to update the comment for.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Comment\": {\n                    \"target\": \"com.amazonaws.route53#ResourceDescription\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The new comment for the hosted zone. If you don't specify a value for\\n\\t\\t\\t\\t<code>Comment</code>, Amazon Route 53 deletes the existing value of the\\n\\t\\t\\t\\t<code>Comment</code> element, if any.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A request to update the comment for a hosted zone.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.route53#UpdateHostedZoneCommentResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"HostedZone\": {\n                    \"target\": \"com.amazonaws.route53#HostedZone\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A complex type that contains the response to the <code>UpdateHostedZoneComment</code>\\n\\t\\t\\trequest.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that contains the response to the <code>UpdateHostedZoneComment</code>\\n\\t\\t\\trequest.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.route53#UpdateTrafficPolicyComment\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.route53#UpdateTrafficPolicyCommentRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.route53#UpdateTrafficPolicyCommentResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.route53#ConcurrentModification\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidInput\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#NoSuchTrafficPolicy\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Updates the comment for a specified traffic policy version.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"POST\",\n                    \"uri\": \"/2013-04-01/trafficpolicy/{Id}/{Version}\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.route53#UpdateTrafficPolicyCommentRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Id\": {\n                    \"target\": \"com.amazonaws.route53#TrafficPolicyId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The value of <code>Id</code> for the traffic policy that you want to update the\\n\\t\\t\\tcomment for.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Version\": {\n                    \"target\": \"com.amazonaws.route53#TrafficPolicyVersion\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The value of <code>Version</code> for the traffic policy that you want to update the\\n\\t\\t\\tcomment for.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Comment\": {\n                    \"target\": \"com.amazonaws.route53#TrafficPolicyComment\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The new comment for the specified traffic policy and version.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that contains information about the traffic policy that you want to\\n\\t\\t\\tupdate the comment for.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.route53#UpdateTrafficPolicyCommentResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TrafficPolicy\": {\n                    \"target\": \"com.amazonaws.route53#TrafficPolicy\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A complex type that contains settings for the specified traffic policy.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that contains the response information for the traffic policy.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.route53#UpdateTrafficPolicyInstance\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.route53#UpdateTrafficPolicyInstanceRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.route53#UpdateTrafficPolicyInstanceResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.route53#ConflictingTypes\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#InvalidInput\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#NoSuchTrafficPolicy\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#NoSuchTrafficPolicyInstance\"\n                },\n                {\n                    \"target\": \"com.amazonaws.route53#PriorRequestNotComplete\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>After you submit a <code>UpdateTrafficPolicyInstance</code> request, there's a brief delay while Route 53 creates the resource record sets \\n\\t\\t\\tthat are specified in the traffic policy definition. Use <code>GetTrafficPolicyInstance</code> with the <code>id</code> of updated traffic policy instance confirm \\n\\t\\t\\tthat the \\n\\t\\t\\t<code>UpdateTrafficPolicyInstance</code> request completed successfully. For more information, see the <code>State</code> response element.</p>\\n         </note>\\n         <p>Updates the resource record sets in a specified hosted zone that were created based on\\n\\t\\t\\tthe settings in a specified traffic policy version.</p>\\n         <p>When you update a traffic policy instance, Amazon Route 53 continues to respond to DNS\\n\\t\\t\\tqueries for the root resource record set name (such as example.com) while it replaces\\n\\t\\t\\tone group of resource record sets with another. Route 53 performs the following\\n\\t\\t\\toperations:</p>\\n         <ol>\\n            <li>\\n               <p>Route 53 creates a new group of resource record sets based on the specified\\n\\t\\t\\t\\t\\ttraffic policy. This is true regardless of how significant the differences are\\n\\t\\t\\t\\t\\tbetween the existing resource record sets and the new resource record sets.\\n\\t\\t\\t\\t</p>\\n            </li>\\n            <li>\\n               <p>When all of the new resource record sets have been created, Route 53 starts to\\n\\t\\t\\t\\t\\trespond to DNS queries for the root resource record set name (such as\\n\\t\\t\\t\\t\\texample.com) by using the new resource record sets.</p>\\n            </li>\\n            <li>\\n               <p>Route 53 deletes the old group of resource record sets that are associated\\n\\t\\t\\t\\t\\twith the root resource record set name.</p>\\n            </li>\\n         </ol>\",\n                \"smithy.api#http\": {\n                    \"method\": \"POST\",\n                    \"uri\": \"/2013-04-01/trafficpolicyinstance/{Id}\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.route53#UpdateTrafficPolicyInstanceRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Id\": {\n                    \"target\": \"com.amazonaws.route53#TrafficPolicyInstanceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the traffic policy instance that you want to update.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TTL\": {\n                    \"target\": \"com.amazonaws.route53#TTL\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The TTL that you want Amazon Route 53 to assign to all of the updated resource record\\n\\t\\t\\tsets.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TrafficPolicyId\": {\n                    \"target\": \"com.amazonaws.route53#TrafficPolicyId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the traffic policy that you want Amazon Route 53 to use to update resource\\n\\t\\t\\trecord sets for the specified traffic policy instance.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TrafficPolicyVersion\": {\n                    \"target\": \"com.amazonaws.route53#TrafficPolicyVersion\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The version of the traffic policy that you want Amazon Route 53 to use to update\\n\\t\\t\\tresource record sets for the specified traffic policy instance.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that contains information about the resource record sets that you want\\n\\t\\t\\tto update based on a specified traffic policy instance.</p>\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.route53#UpdateTrafficPolicyInstanceResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TrafficPolicyInstance\": {\n                    \"target\": \"com.amazonaws.route53#TrafficPolicyInstance\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A complex type that contains settings for the updated traffic policy instance.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A complex type that contains information about the resource record sets that Amazon\\n\\t\\t\\tRoute 53 created based on a specified traffic policy.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.route53#UsageCount\": {\n            \"type\": \"long\",\n            \"traits\": {\n                \"smithy.api#default\": 0,\n                \"smithy.api#range\": {\n                    \"min\": 0\n                }\n            }\n        },\n        \"com.amazonaws.route53#VPC\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VPCRegion\": {\n                    \"target\": \"com.amazonaws.route53#VPCRegion\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>(Private hosted zones only) The region that an Amazon VPC was created\\n\\t\\t\\tin.</p>\"\n                    }\n                },\n                \"VPCId\": {\n                    \"target\": \"com.amazonaws.route53#VPCId\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>(Private hosted zones only) A complex type that contains information about an Amazon VPC.</p>\\n         <p>If you associate a private hosted zone with an Amazon VPC when you make a\\n\\t\\t\\t\\t<a href=\\\"https://docs.aws.amazon.com/Route53/latest/APIReference/API_CreateHostedZone.html\\\">CreateHostedZone</a>\\n\\t\\t\\trequest, the following parameters are also required.</p>\"\n            }\n        },\n        \"com.amazonaws.route53#VPCAssociationAuthorizationNotFound\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.route53#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The VPC that you specified is not authorized to be associated with the hosted\\n\\t\\t\\tzone.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 404\n            }\n        },\n        \"com.amazonaws.route53#VPCAssociationNotFound\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.route53#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The specified VPC or hosted zone weren't found.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The specified VPC and hosted zone are not currently associated.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 404\n            }\n        },\n        \"com.amazonaws.route53#VPCId\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>(Private hosted zones only) The ID of an Amazon VPC. </p>\",\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 1024\n                }\n            }\n        },\n        \"com.amazonaws.route53#VPCRegion\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"us_east_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"us-east-1\"\n                    }\n                },\n                \"us_east_2\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"us-east-2\"\n                    }\n                },\n                \"us_west_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"us-west-1\"\n                    }\n                },\n                \"us_west_2\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"us-west-2\"\n                    }\n                },\n                \"eu_west_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"eu-west-1\"\n                    }\n                },\n                \"eu_west_2\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"eu-west-2\"\n                    }\n                },\n                \"eu_west_3\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"eu-west-3\"\n                    }\n                },\n                \"eu_central_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"eu-central-1\"\n                    }\n                },\n                \"eu_central_2\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"eu-central-2\"\n                    }\n                },\n                \"ap_east_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ap-east-1\"\n                    }\n                },\n                \"me_south_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"me-south-1\"\n                    }\n                },\n                \"us_gov_west_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"us-gov-west-1\"\n                    }\n                },\n                \"us_gov_east_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"us-gov-east-1\"\n                    }\n                },\n                \"us_iso_east_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"us-iso-east-1\"\n                    }\n                },\n                \"us_iso_west_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"us-iso-west-1\"\n                    }\n                },\n                \"us_isob_east_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"us-isob-east-1\"\n                    }\n                },\n                \"me_central_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"me-central-1\"\n                    }\n                },\n                \"ap_southeast_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ap-southeast-1\"\n                    }\n                },\n                \"ap_southeast_2\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ap-southeast-2\"\n                    }\n                },\n                \"ap_southeast_3\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ap-southeast-3\"\n                    }\n                },\n                \"ap_south_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ap-south-1\"\n                    }\n                },\n                \"ap_south_2\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ap-south-2\"\n                    }\n                },\n                \"ap_northeast_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ap-northeast-1\"\n                    }\n                },\n                \"ap_northeast_2\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ap-northeast-2\"\n                    }\n                },\n                \"ap_northeast_3\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ap-northeast-3\"\n                    }\n                },\n                \"eu_north_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"eu-north-1\"\n                    }\n                },\n                \"sa_east_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"sa-east-1\"\n                    }\n                },\n                \"ca_central_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ca-central-1\"\n                    }\n                },\n                \"cn_north_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"cn-north-1\"\n                    }\n                },\n                \"cn_northwest_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"cn-northwest-1\"\n                    }\n                },\n                \"af_south_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"af-south-1\"\n                    }\n                },\n                \"eu_south_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"eu-south-1\"\n                    }\n                },\n                \"eu_south_2\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"eu-south-2\"\n                    }\n                },\n                \"ap_southeast_4\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ap-southeast-4\"\n                    }\n                },\n                \"il_central_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"il-central-1\"\n                    }\n                },\n                \"ca_west_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ca-west-1\"\n                    }\n                },\n                \"ap_southeast_5\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ap-southeast-5\"\n                    }\n                },\n                \"mx_central_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"mx-central-1\"\n                    }\n                },\n                \"us_isof_south_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"us-isof-south-1\"\n                    }\n                },\n                \"us_isof_east_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"us-isof-east-1\"\n                    }\n                },\n                \"ap_southeast_7\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ap-southeast-7\"\n                    }\n                },\n                \"ap_east_2\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ap-east-2\"\n                    }\n                },\n                \"eu_isoe_west_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"eu-isoe-west-1\"\n                    }\n                },\n                \"ap_southeast_6\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ap-southeast-6\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 64\n                }\n            }\n        },\n        \"com.amazonaws.route53#VPCs\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.route53#VPC\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"VPC\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>(Private hosted zones only) A list of <code>VPC</code> elements.</p>\",\n                \"smithy.api#length\": {\n                    \"min\": 1\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "aws/sdk/aws-models/s3-control.json",
    "content": "{\n    \"smithy\": \"2.0\",\n    \"metadata\": {\n        \"suppressions\": [\n            {\n                \"id\": \"HttpMethodSemantics\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"HttpResponseCodeSemantics\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"PaginatedTrait\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"HttpHeaderTrait\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"HttpUriConflict\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"Service\",\n                \"namespace\": \"*\"\n            }\n        ]\n    },\n    \"shapes\": {\n        \"com.amazonaws.s3control#AWSS3ControlServiceV20180820\": {\n            \"type\": \"service\",\n            \"version\": \"2018-08-20\",\n            \"operations\": [\n                {\n                    \"target\": \"com.amazonaws.s3control#AssociateAccessGrantsIdentityCenter\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#CreateAccessGrant\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#CreateAccessGrantsInstance\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#CreateAccessGrantsLocation\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#CreateAccessPoint\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#CreateAccessPointForObjectLambda\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#CreateBucket\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#CreateJob\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#CreateMultiRegionAccessPoint\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#CreateStorageLensGroup\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#DeleteAccessGrant\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#DeleteAccessGrantsInstance\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#DeleteAccessGrantsInstanceResourcePolicy\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#DeleteAccessGrantsLocation\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#DeleteAccessPoint\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#DeleteAccessPointForObjectLambda\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#DeleteAccessPointPolicy\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#DeleteAccessPointPolicyForObjectLambda\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#DeleteAccessPointScope\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#DeleteBucket\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#DeleteBucketLifecycleConfiguration\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#DeleteBucketPolicy\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#DeleteBucketReplication\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#DeleteBucketTagging\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#DeleteJobTagging\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#DeleteMultiRegionAccessPoint\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#DeletePublicAccessBlock\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#DeleteStorageLensConfiguration\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#DeleteStorageLensConfigurationTagging\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#DeleteStorageLensGroup\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#DescribeJob\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#DescribeMultiRegionAccessPointOperation\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#DissociateAccessGrantsIdentityCenter\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#GetAccessGrant\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#GetAccessGrantsInstance\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#GetAccessGrantsInstanceForPrefix\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#GetAccessGrantsInstanceResourcePolicy\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#GetAccessGrantsLocation\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#GetAccessPoint\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#GetAccessPointConfigurationForObjectLambda\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#GetAccessPointForObjectLambda\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#GetAccessPointPolicy\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#GetAccessPointPolicyForObjectLambda\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#GetAccessPointPolicyStatus\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#GetAccessPointPolicyStatusForObjectLambda\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#GetAccessPointScope\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#GetBucket\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#GetBucketLifecycleConfiguration\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#GetBucketPolicy\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#GetBucketReplication\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#GetBucketTagging\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#GetBucketVersioning\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#GetDataAccess\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#GetJobTagging\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#GetMultiRegionAccessPoint\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#GetMultiRegionAccessPointPolicy\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#GetMultiRegionAccessPointPolicyStatus\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#GetMultiRegionAccessPointRoutes\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#GetPublicAccessBlock\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#GetStorageLensConfiguration\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#GetStorageLensConfigurationTagging\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#GetStorageLensGroup\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#ListAccessGrants\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#ListAccessGrantsInstances\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#ListAccessGrantsLocations\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#ListAccessPoints\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#ListAccessPointsForDirectoryBuckets\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#ListAccessPointsForObjectLambda\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#ListCallerAccessGrants\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#ListJobs\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#ListMultiRegionAccessPoints\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#ListRegionalBuckets\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#ListStorageLensConfigurations\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#ListStorageLensGroups\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#ListTagsForResource\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#PutAccessGrantsInstanceResourcePolicy\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#PutAccessPointConfigurationForObjectLambda\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#PutAccessPointPolicy\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#PutAccessPointPolicyForObjectLambda\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#PutAccessPointScope\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#PutBucketLifecycleConfiguration\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#PutBucketPolicy\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#PutBucketReplication\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#PutBucketTagging\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#PutBucketVersioning\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#PutJobTagging\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#PutMultiRegionAccessPointPolicy\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#PutPublicAccessBlock\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#PutStorageLensConfiguration\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#PutStorageLensConfigurationTagging\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#SubmitMultiRegionAccessPointRoutes\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#TagResource\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#UntagResource\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#UpdateAccessGrantsLocation\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#UpdateJobPriority\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#UpdateJobStatus\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#UpdateStorageLensGroup\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#service\": {\n                    \"sdkId\": \"S3 Control\",\n                    \"arnNamespace\": \"s3\",\n                    \"cloudFormationName\": \"S3Control\",\n                    \"cloudTrailEventSource\": \"s3control.amazonaws.com\",\n                    \"docId\": \"s3control-2018-08-20\",\n                    \"endpointPrefix\": \"s3-control\"\n                },\n                \"aws.auth#sigv4\": {\n                    \"name\": \"s3\"\n                },\n                \"aws.protocols#restXml\": {},\n                \"smithy.api#documentation\": \"<p> Amazon Web Services S3 Control provides access to Amazon S3 control plane actions. </p>\",\n                \"smithy.api#title\": \"AWS S3 Control\",\n                \"smithy.api#xmlNamespace\": {\n                    \"uri\": \"http://awss3control.amazonaws.com/doc/2018-08-20/\"\n                },\n                \"smithy.rules#clientContextParams\": {\n                    \"UseArnRegion\": {\n                        \"documentation\": \"Enables this client to use an ARN's region when constructing an endpoint instead of the client's configured region.\",\n                        \"type\": \"boolean\"\n                    }\n                },\n                \"smithy.rules#endpointRuleSet\": {\n                    \"version\": \"1.0\",\n                    \"parameters\": {\n                        \"Region\": {\n                            \"builtIn\": \"AWS::Region\",\n                            \"required\": false,\n                            \"documentation\": \"The AWS region used to dispatch the request.\",\n                            \"type\": \"String\"\n                        },\n                        \"UseFIPS\": {\n                            \"builtIn\": \"AWS::UseFIPS\",\n                            \"required\": true,\n                            \"default\": false,\n                            \"documentation\": \"When true, send this request to the FIPS-compliant regional endpoint. If the configured endpoint does not have a FIPS compliant endpoint, dispatching the request will return an error.\",\n                            \"type\": \"Boolean\"\n                        },\n                        \"UseDualStack\": {\n                            \"builtIn\": \"AWS::UseDualStack\",\n                            \"required\": true,\n                            \"default\": false,\n                            \"documentation\": \"When true, use the dual-stack endpoint. If the configured endpoint does not support dual-stack, dispatching the request MAY return an error.\",\n                            \"type\": \"Boolean\"\n                        },\n                        \"Endpoint\": {\n                            \"builtIn\": \"SDK::Endpoint\",\n                            \"required\": false,\n                            \"documentation\": \"Override the endpoint used to send this request\",\n                            \"type\": \"String\"\n                        },\n                        \"AccountId\": {\n                            \"required\": false,\n                            \"documentation\": \"The Account ID used to send the request. This is an optional parameter that will be set automatically for operations that require it.\",\n                            \"type\": \"String\"\n                        },\n                        \"RequiresAccountId\": {\n                            \"required\": false,\n                            \"documentation\": \"Internal parameter for operations that require account id host prefix.\",\n                            \"type\": \"Boolean\"\n                        },\n                        \"OutpostId\": {\n                            \"required\": false,\n                            \"documentation\": \"The Outpost ID.  Some operations have an optional OutpostId which should be used in endpoint construction.\",\n                            \"type\": \"String\"\n                        },\n                        \"Bucket\": {\n                            \"required\": false,\n                            \"documentation\": \"The S3 bucket used to send the request. This is an optional parameter that will be set automatically for operations that are scoped to an S3 bucket.\",\n                            \"type\": \"String\"\n                        },\n                        \"AccessPointName\": {\n                            \"required\": false,\n                            \"documentation\": \"The S3 AccessPointName used to send the request. This is an optional parameter that will be set automatically for operations that are scoped to an S3 AccessPoint.\",\n                            \"type\": \"String\"\n                        },\n                        \"UseArnRegion\": {\n                            \"builtIn\": \"AWS::S3Control::UseArnRegion\",\n                            \"required\": false,\n                            \"documentation\": \"When an Access Point ARN is provided and this flag is enabled, the SDK MUST use the ARN's region when constructing the endpoint instead of the client's configured region.\",\n                            \"type\": \"Boolean\"\n                        },\n                        \"ResourceArn\": {\n                            \"required\": false,\n                            \"documentation\": \"The resource ARN included in the request.  Only set on TagResource, UntagResourceand ListTagsForResource\",\n                            \"type\": \"String\"\n                        },\n                        \"UseS3ExpressControlEndpoint\": {\n                            \"required\": false,\n                            \"documentation\": \"Internal parameter to indicate whether S3Express operation should use control plane, (ex. ListDirectoryAccessPoints)\",\n                            \"type\": \"Boolean\"\n                        }\n                    },\n                    \"rules\": [\n                        {\n                            \"conditions\": [\n                                {\n                                    \"fn\": \"isSet\",\n                                    \"argv\": [\n                                        {\n                                            \"ref\": \"Region\"\n                                        }\n                                    ]\n                                }\n                            ],\n                            \"rules\": [\n                                {\n                                    \"conditions\": [\n                                        {\n                                            \"fn\": \"booleanEquals\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"UseFIPS\"\n                                                },\n                                                true\n                                            ]\n                                        },\n                                        {\n                                            \"fn\": \"aws.partition\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"Region\"\n                                                }\n                                            ],\n                                            \"assign\": \"partitionResult\"\n                                        },\n                                        {\n                                            \"fn\": \"stringEquals\",\n                                            \"argv\": [\n                                                {\n                                                    \"fn\": \"getAttr\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"partitionResult\"\n                                                        },\n                                                        \"name\"\n                                                    ]\n                                                },\n                                                \"aws-cn\"\n                                            ]\n                                        }\n                                    ],\n                                    \"error\": \"Partition does not support FIPS\",\n                                    \"type\": \"error\"\n                                },\n                                {\n                                    \"conditions\": [\n                                        {\n                                            \"fn\": \"isSet\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"OutpostId\"\n                                                }\n                                            ]\n                                        }\n                                    ],\n                                    \"rules\": [\n                                        {\n                                            \"conditions\": [\n                                                {\n                                                    \"fn\": \"aws.partition\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"Region\"\n                                                        }\n                                                    ],\n                                                    \"assign\": \"partitionResult\"\n                                                }\n                                            ],\n                                            \"rules\": [\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"isSet\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"RequiresAccountId\"\n                                                                }\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"RequiresAccountId\"\n                                                                },\n                                                                true\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"not\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"fn\": \"isSet\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"AccountId\"\n                                                                        }\n                                                                    ]\n                                                                }\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"error\": \"AccountId is required but not set\",\n                                                    \"type\": \"error\"\n                                                },\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"isSet\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"AccountId\"\n                                                                }\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"not\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"fn\": \"isValidHostLabel\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"AccountId\"\n                                                                        },\n                                                                        false\n                                                                    ]\n                                                                }\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"error\": \"AccountId must only contain a-z, A-Z, 0-9 and `-`.\",\n                                                    \"type\": \"error\"\n                                                },\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"not\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"fn\": \"isValidHostLabel\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"OutpostId\"\n                                                                        },\n                                                                        false\n                                                                    ]\n                                                                }\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"error\": \"OutpostId must only contain a-z, A-Z, 0-9 and `-`.\",\n                                                    \"type\": \"error\"\n                                                },\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"isSet\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"Endpoint\"\n                                                                }\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"UseDualStack\"\n                                                                },\n                                                                true\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"error\": \"Invalid Configuration: DualStack and custom endpoint are not supported\",\n                                                    \"type\": \"error\"\n                                                },\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"isValidHostLabel\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"Region\"\n                                                                },\n                                                                true\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"rules\": [\n                                                        {\n                                                            \"conditions\": [\n                                                                {\n                                                                    \"fn\": \"isSet\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"Endpoint\"\n                                                                        }\n                                                                    ]\n                                                                },\n                                                                {\n                                                                    \"fn\": \"parseURL\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"Endpoint\"\n                                                                        }\n                                                                    ],\n                                                                    \"assign\": \"url\"\n                                                                }\n                                                            ],\n                                                            \"endpoint\": {\n                                                                \"url\": \"{url#scheme}://{url#authority}{url#path}\",\n                                                                \"properties\": {\n                                                                    \"authSchemes\": [\n                                                                        {\n                                                                            \"disableDoubleEncoding\": true,\n                                                                            \"name\": \"sigv4\",\n                                                                            \"signingName\": \"s3-outposts\",\n                                                                            \"signingRegion\": \"{Region}\"\n                                                                        }\n                                                                    ]\n                                                                },\n                                                                \"headers\": {}\n                                                            },\n                                                            \"type\": \"endpoint\"\n                                                        },\n                                                        {\n                                                            \"conditions\": [\n                                                                {\n                                                                    \"fn\": \"booleanEquals\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"UseFIPS\"\n                                                                        },\n                                                                        true\n                                                                    ]\n                                                                },\n                                                                {\n                                                                    \"fn\": \"booleanEquals\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"UseDualStack\"\n                                                                        },\n                                                                        true\n                                                                    ]\n                                                                }\n                                                            ],\n                                                            \"endpoint\": {\n                                                                \"url\": \"https://s3-outposts-fips.{Region}.{partitionResult#dualStackDnsSuffix}\",\n                                                                \"properties\": {\n                                                                    \"authSchemes\": [\n                                                                        {\n                                                                            \"disableDoubleEncoding\": true,\n                                                                            \"name\": \"sigv4\",\n                                                                            \"signingName\": \"s3-outposts\",\n                                                                            \"signingRegion\": \"{Region}\"\n                                                                        }\n                                                                    ]\n                                                                },\n                                                                \"headers\": {}\n                                                            },\n                                                            \"type\": \"endpoint\"\n                                                        },\n                                                        {\n                                                            \"conditions\": [\n                                                                {\n                                                                    \"fn\": \"booleanEquals\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"UseFIPS\"\n                                                                        },\n                                                                        true\n                                                                    ]\n                                                                }\n                                                            ],\n                                                            \"endpoint\": {\n                                                                \"url\": \"https://s3-outposts-fips.{Region}.{partitionResult#dnsSuffix}\",\n                                                                \"properties\": {\n                                                                    \"authSchemes\": [\n                                                                        {\n                                                                            \"disableDoubleEncoding\": true,\n                                                                            \"name\": \"sigv4\",\n                                                                            \"signingName\": \"s3-outposts\",\n                                                                            \"signingRegion\": \"{Region}\"\n                                                                        }\n                                                                    ]\n                                                                },\n                                                                \"headers\": {}\n                                                            },\n                                                            \"type\": \"endpoint\"\n                                                        },\n                                                        {\n                                                            \"conditions\": [\n                                                                {\n                                                                    \"fn\": \"booleanEquals\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"UseDualStack\"\n                                                                        },\n                                                                        true\n                                                                    ]\n                                                                }\n                                                            ],\n                                                            \"endpoint\": {\n                                                                \"url\": \"https://s3-outposts.{Region}.{partitionResult#dualStackDnsSuffix}\",\n                                                                \"properties\": {\n                                                                    \"authSchemes\": [\n                                                                        {\n                                                                            \"disableDoubleEncoding\": true,\n                                                                            \"name\": \"sigv4\",\n                                                                            \"signingName\": \"s3-outposts\",\n                                                                            \"signingRegion\": \"{Region}\"\n                                                                        }\n                                                                    ]\n                                                                },\n                                                                \"headers\": {}\n                                                            },\n                                                            \"type\": \"endpoint\"\n                                                        },\n                                                        {\n                                                            \"conditions\": [],\n                                                            \"endpoint\": {\n                                                                \"url\": \"https://s3-outposts.{Region}.{partitionResult#dnsSuffix}\",\n                                                                \"properties\": {\n                                                                    \"authSchemes\": [\n                                                                        {\n                                                                            \"disableDoubleEncoding\": true,\n                                                                            \"name\": \"sigv4\",\n                                                                            \"signingName\": \"s3-outposts\",\n                                                                            \"signingRegion\": \"{Region}\"\n                                                                        }\n                                                                    ]\n                                                                },\n                                                                \"headers\": {}\n                                                            },\n                                                            \"type\": \"endpoint\"\n                                                        }\n                                                    ],\n                                                    \"type\": \"tree\"\n                                                },\n                                                {\n                                                    \"conditions\": [],\n                                                    \"error\": \"Invalid region: region was not a valid DNS name.\",\n                                                    \"type\": \"error\"\n                                                }\n                                            ],\n                                            \"type\": \"tree\"\n                                        }\n                                    ],\n                                    \"type\": \"tree\"\n                                },\n                                {\n                                    \"conditions\": [\n                                        {\n                                            \"fn\": \"isSet\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"ResourceArn\"\n                                                }\n                                            ]\n                                        },\n                                        {\n                                            \"fn\": \"aws.parseArn\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"ResourceArn\"\n                                                }\n                                            ],\n                                            \"assign\": \"resourceArn\"\n                                        },\n                                        {\n                                            \"fn\": \"stringEquals\",\n                                            \"argv\": [\n                                                {\n                                                    \"fn\": \"getAttr\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"resourceArn\"\n                                                        },\n                                                        \"service\"\n                                                    ]\n                                                },\n                                                \"s3express\"\n                                            ]\n                                        }\n                                    ],\n                                    \"rules\": [\n                                        {\n                                            \"conditions\": [\n                                                {\n                                                    \"fn\": \"aws.partition\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"Region\"\n                                                        }\n                                                    ],\n                                                    \"assign\": \"partitionResult\"\n                                                }\n                                            ],\n                                            \"rules\": [\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"aws.partition\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"resourceArn\"\n                                                                        },\n                                                                        \"region\"\n                                                                    ]\n                                                                }\n                                                            ],\n                                                            \"assign\": \"arnPartition\"\n                                                        }\n                                                    ],\n                                                    \"rules\": [\n                                                        {\n                                                            \"conditions\": [\n                                                                {\n                                                                    \"fn\": \"stringEquals\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"fn\": \"getAttr\",\n                                                                            \"argv\": [\n                                                                                {\n                                                                                    \"ref\": \"arnPartition\"\n                                                                                },\n                                                                                \"name\"\n                                                                            ]\n                                                                        },\n                                                                        {\n                                                                            \"fn\": \"getAttr\",\n                                                                            \"argv\": [\n                                                                                {\n                                                                                    \"ref\": \"partitionResult\"\n                                                                                },\n                                                                                \"name\"\n                                                                            ]\n                                                                        }\n                                                                    ]\n                                                                }\n                                                            ],\n                                                            \"rules\": [\n                                                                {\n                                                                    \"conditions\": [\n                                                                        {\n                                                                            \"fn\": \"isSet\",\n                                                                            \"argv\": [\n                                                                                {\n                                                                                    \"ref\": \"UseArnRegion\"\n                                                                                }\n                                                                            ]\n                                                                        },\n                                                                        {\n                                                                            \"fn\": \"booleanEquals\",\n                                                                            \"argv\": [\n                                                                                {\n                                                                                    \"ref\": \"UseArnRegion\"\n                                                                                },\n                                                                                false\n                                                                            ]\n                                                                        },\n                                                                        {\n                                                                            \"fn\": \"not\",\n                                                                            \"argv\": [\n                                                                                {\n                                                                                    \"fn\": \"stringEquals\",\n                                                                                    \"argv\": [\n                                                                                        {\n                                                                                            \"fn\": \"getAttr\",\n                                                                                            \"argv\": [\n                                                                                                {\n                                                                                                    \"ref\": \"resourceArn\"\n                                                                                                },\n                                                                                                \"region\"\n                                                                                            ]\n                                                                                        },\n                                                                                        \"{Region}\"\n                                                                                    ]\n                                                                                }\n                                                                            ]\n                                                                        }\n                                                                    ],\n                                                                    \"error\": \"Invalid configuration: region from ARN `{resourceArn#region}` does not match client region `{Region}` and UseArnRegion is `false`\",\n                                                                    \"type\": \"error\"\n                                                                },\n                                                                {\n                                                                    \"conditions\": [\n                                                                        {\n                                                                            \"fn\": \"isSet\",\n                                                                            \"argv\": [\n                                                                                {\n                                                                                    \"ref\": \"Endpoint\"\n                                                                                }\n                                                                            ]\n                                                                        },\n                                                                        {\n                                                                            \"fn\": \"booleanEquals\",\n                                                                            \"argv\": [\n                                                                                {\n                                                                                    \"ref\": \"UseDualStack\"\n                                                                                },\n                                                                                true\n                                                                            ]\n                                                                        }\n                                                                    ],\n                                                                    \"error\": \"Invalid Configuration: DualStack and custom endpoint are not supported\",\n                                                                    \"type\": \"error\"\n                                                                },\n                                                                {\n                                                                    \"conditions\": [\n                                                                        {\n                                                                            \"fn\": \"booleanEquals\",\n                                                                            \"argv\": [\n                                                                                {\n                                                                                    \"ref\": \"UseDualStack\"\n                                                                                },\n                                                                                true\n                                                                            ]\n                                                                        }\n                                                                    ],\n                                                                    \"error\": \"S3Express does not support Dual-stack.\",\n                                                                    \"type\": \"error\"\n                                                                },\n                                                                {\n                                                                    \"conditions\": [\n                                                                        {\n                                                                            \"fn\": \"isSet\",\n                                                                            \"argv\": [\n                                                                                {\n                                                                                    \"ref\": \"Endpoint\"\n                                                                                }\n                                                                            ]\n                                                                        },\n                                                                        {\n                                                                            \"fn\": \"parseURL\",\n                                                                            \"argv\": [\n                                                                                {\n                                                                                    \"ref\": \"Endpoint\"\n                                                                                }\n                                                                            ],\n                                                                            \"assign\": \"url\"\n                                                                        }\n                                                                    ],\n                                                                    \"endpoint\": {\n                                                                        \"url\": \"{url#scheme}://{url#authority}\",\n                                                                        \"properties\": {\n                                                                            \"authSchemes\": [\n                                                                                {\n                                                                                    \"disableDoubleEncoding\": true,\n                                                                                    \"name\": \"sigv4\",\n                                                                                    \"signingName\": \"s3express\",\n                                                                                    \"signingRegion\": \"{Region}\"\n                                                                                }\n                                                                            ]\n                                                                        },\n                                                                        \"headers\": {}\n                                                                    },\n                                                                    \"type\": \"endpoint\"\n                                                                },\n                                                                {\n                                                                    \"conditions\": [\n                                                                        {\n                                                                            \"fn\": \"booleanEquals\",\n                                                                            \"argv\": [\n                                                                                {\n                                                                                    \"ref\": \"UseFIPS\"\n                                                                                },\n                                                                                true\n                                                                            ]\n                                                                        }\n                                                                    ],\n                                                                    \"endpoint\": {\n                                                                        \"url\": \"https://s3express-control-fips.{Region}.{partitionResult#dnsSuffix}\",\n                                                                        \"properties\": {\n                                                                            \"authSchemes\": [\n                                                                                {\n                                                                                    \"disableDoubleEncoding\": true,\n                                                                                    \"name\": \"sigv4\",\n                                                                                    \"signingName\": \"s3express\",\n                                                                                    \"signingRegion\": \"{Region}\"\n                                                                                }\n                                                                            ]\n                                                                        },\n                                                                        \"headers\": {}\n                                                                    },\n                                                                    \"type\": \"endpoint\"\n                                                                },\n                                                                {\n                                                                    \"conditions\": [],\n                                                                    \"endpoint\": {\n                                                                        \"url\": \"https://s3express-control.{Region}.{partitionResult#dnsSuffix}\",\n                                                                        \"properties\": {\n                                                                            \"authSchemes\": [\n                                                                                {\n                                                                                    \"disableDoubleEncoding\": true,\n                                                                                    \"name\": \"sigv4\",\n                                                                                    \"signingName\": \"s3express\",\n                                                                                    \"signingRegion\": \"{Region}\"\n                                                                                }\n                                                                            ]\n                                                                        },\n                                                                        \"headers\": {}\n                                                                    },\n                                                                    \"type\": \"endpoint\"\n                                                                }\n                                                            ],\n                                                            \"type\": \"tree\"\n                                                        },\n                                                        {\n                                                            \"conditions\": [],\n                                                            \"error\": \"Client was configured for partition `{partitionResult#name}` but ARN has `{arnPartition#name}`\",\n                                                            \"type\": \"error\"\n                                                        }\n                                                    ],\n                                                    \"type\": \"tree\"\n                                                }\n                                            ],\n                                            \"type\": \"tree\"\n                                        }\n                                    ],\n                                    \"type\": \"tree\"\n                                },\n                                {\n                                    \"conditions\": [\n                                        {\n                                            \"fn\": \"isSet\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"AccessPointName\"\n                                                }\n                                            ]\n                                        },\n                                        {\n                                            \"fn\": \"substring\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"AccessPointName\"\n                                                },\n                                                0,\n                                                7,\n                                                true\n                                            ],\n                                            \"assign\": \"accessPointSuffix\"\n                                        },\n                                        {\n                                            \"fn\": \"stringEquals\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"accessPointSuffix\"\n                                                },\n                                                \"--xa-s3\"\n                                            ]\n                                        }\n                                    ],\n                                    \"rules\": [\n                                        {\n                                            \"conditions\": [\n                                                {\n                                                    \"fn\": \"aws.partition\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"Region\"\n                                                        }\n                                                    ],\n                                                    \"assign\": \"partitionResult\"\n                                                }\n                                            ],\n                                            \"rules\": [\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"isSet\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"Endpoint\"\n                                                                }\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"UseDualStack\"\n                                                                },\n                                                                true\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"error\": \"Invalid Configuration: DualStack and custom endpoint are not supported\",\n                                                    \"type\": \"error\"\n                                                },\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"UseDualStack\"\n                                                                },\n                                                                true\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"error\": \"S3Express does not support Dual-stack.\",\n                                                    \"type\": \"error\"\n                                                },\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"isSet\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"Endpoint\"\n                                                                }\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"parseURL\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"Endpoint\"\n                                                                }\n                                                            ],\n                                                            \"assign\": \"url\"\n                                                        }\n                                                    ],\n                                                    \"endpoint\": {\n                                                        \"url\": \"{url#scheme}://{url#authority}\",\n                                                        \"properties\": {\n                                                            \"authSchemes\": [\n                                                                {\n                                                                    \"disableDoubleEncoding\": true,\n                                                                    \"name\": \"sigv4\",\n                                                                    \"signingName\": \"s3express\",\n                                                                    \"signingRegion\": \"{Region}\"\n                                                                }\n                                                            ]\n                                                        },\n                                                        \"headers\": {}\n                                                    },\n                                                    \"type\": \"endpoint\"\n                                                },\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"substring\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"AccessPointName\"\n                                                                },\n                                                                7,\n                                                                15,\n                                                                true\n                                                            ],\n                                                            \"assign\": \"s3expressAvailabilityZoneId\"\n                                                        },\n                                                        {\n                                                            \"fn\": \"substring\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"AccessPointName\"\n                                                                },\n                                                                15,\n                                                                17,\n                                                                true\n                                                            ],\n                                                            \"assign\": \"s3expressAvailabilityZoneDelim\"\n                                                        },\n                                                        {\n                                                            \"fn\": \"stringEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"s3expressAvailabilityZoneDelim\"\n                                                                },\n                                                                \"--\"\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"rules\": [\n                                                        {\n                                                            \"conditions\": [\n                                                                {\n                                                                    \"fn\": \"booleanEquals\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"UseFIPS\"\n                                                                        },\n                                                                        true\n                                                                    ]\n                                                                }\n                                                            ],\n                                                            \"endpoint\": {\n                                                                \"url\": \"https://s3express-control-fips.{Region}.{partitionResult#dnsSuffix}\",\n                                                                \"properties\": {\n                                                                    \"authSchemes\": [\n                                                                        {\n                                                                            \"disableDoubleEncoding\": true,\n                                                                            \"name\": \"sigv4\",\n                                                                            \"signingName\": \"s3express\",\n                                                                            \"signingRegion\": \"{Region}\"\n                                                                        }\n                                                                    ]\n                                                                },\n                                                                \"headers\": {}\n                                                            },\n                                                            \"type\": \"endpoint\"\n                                                        },\n                                                        {\n                                                            \"conditions\": [],\n                                                            \"endpoint\": {\n                                                                \"url\": \"https://s3express-control.{Region}.{partitionResult#dnsSuffix}\",\n                                                                \"properties\": {\n                                                                    \"authSchemes\": [\n                                                                        {\n                                                                            \"disableDoubleEncoding\": true,\n                                                                            \"name\": \"sigv4\",\n                                                                            \"signingName\": \"s3express\",\n                                                                            \"signingRegion\": \"{Region}\"\n                                                                        }\n                                                                    ]\n                                                                },\n                                                                \"headers\": {}\n                                                            },\n                                                            \"type\": \"endpoint\"\n                                                        }\n                                                    ],\n                                                    \"type\": \"tree\"\n                                                },\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"substring\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"AccessPointName\"\n                                                                },\n                                                                7,\n                                                                16,\n                                                                true\n                                                            ],\n                                                            \"assign\": \"s3expressAvailabilityZoneId\"\n                                                        },\n                                                        {\n                                                            \"fn\": \"substring\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"AccessPointName\"\n                                                                },\n                                                                16,\n                                                                18,\n                                                                true\n                                                            ],\n                                                            \"assign\": \"s3expressAvailabilityZoneDelim\"\n                                                        },\n                                                        {\n                                                            \"fn\": \"stringEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"s3expressAvailabilityZoneDelim\"\n                                                                },\n                                                                \"--\"\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"rules\": [\n                                                        {\n                                                            \"conditions\": [\n                                                                {\n                                                                    \"fn\": \"booleanEquals\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"UseFIPS\"\n                                                                        },\n                                                                        true\n                                                                    ]\n                                                                }\n                                                            ],\n                                                            \"endpoint\": {\n                                                                \"url\": \"https://s3express-control-fips.{Region}.{partitionResult#dnsSuffix}\",\n                                                                \"properties\": {\n                                                                    \"authSchemes\": [\n                                                                        {\n                                                                            \"disableDoubleEncoding\": true,\n                                                                            \"name\": \"sigv4\",\n                                                                            \"signingName\": \"s3express\",\n                                                                            \"signingRegion\": \"{Region}\"\n                                                                        }\n                                                                    ]\n                                                                },\n                                                                \"headers\": {}\n                                                            },\n                                                            \"type\": \"endpoint\"\n                                                        },\n                                                        {\n                                                            \"conditions\": [],\n                                                            \"endpoint\": {\n                                                                \"url\": \"https://s3express-control.{Region}.{partitionResult#dnsSuffix}\",\n                                                                \"properties\": {\n                                                                    \"authSchemes\": [\n                                                                        {\n                                                                            \"disableDoubleEncoding\": true,\n                                                                            \"name\": \"sigv4\",\n                                                                            \"signingName\": \"s3express\",\n                                                                            \"signingRegion\": \"{Region}\"\n                                                                        }\n                                                                    ]\n                                                                },\n                                                                \"headers\": {}\n                                                            },\n                                                            \"type\": \"endpoint\"\n                                                        }\n                                                    ],\n                                                    \"type\": \"tree\"\n                                                },\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"substring\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"AccessPointName\"\n                                                                },\n                                                                7,\n                                                                20,\n                                                                true\n                                                            ],\n                                                            \"assign\": \"s3expressAvailabilityZoneId\"\n                                                        },\n                                                        {\n                                                            \"fn\": \"substring\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"AccessPointName\"\n                                                                },\n                                                                20,\n                                                                22,\n                                                                true\n                                                            ],\n                                                            \"assign\": \"s3expressAvailabilityZoneDelim\"\n                                                        },\n                                                        {\n                                                            \"fn\": \"stringEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"s3expressAvailabilityZoneDelim\"\n                                                                },\n                                                                \"--\"\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"rules\": [\n                                                        {\n                                                            \"conditions\": [\n                                                                {\n                                                                    \"fn\": \"booleanEquals\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"UseFIPS\"\n                                                                        },\n                                                                        true\n                                                                    ]\n                                                                }\n                                                            ],\n                                                            \"endpoint\": {\n                                                                \"url\": \"https://s3express-control-fips.{Region}.{partitionResult#dnsSuffix}\",\n                                                                \"properties\": {\n                                                                    \"authSchemes\": [\n                                                                        {\n                                                                            \"disableDoubleEncoding\": true,\n                                                                            \"name\": \"sigv4\",\n                                                                            \"signingName\": \"s3express\",\n                                                                            \"signingRegion\": \"{Region}\"\n                                                                        }\n                                                                    ]\n                                                                },\n                                                                \"headers\": {}\n                                                            },\n                                                            \"type\": \"endpoint\"\n                                                        },\n                                                        {\n                                                            \"conditions\": [],\n                                                            \"endpoint\": {\n                                                                \"url\": \"https://s3express-control.{Region}.{partitionResult#dnsSuffix}\",\n                                                                \"properties\": {\n                                                                    \"authSchemes\": [\n                                                                        {\n                                                                            \"disableDoubleEncoding\": true,\n                                                                            \"name\": \"sigv4\",\n                                                                            \"signingName\": \"s3express\",\n                                                                            \"signingRegion\": \"{Region}\"\n                                                                        }\n                                                                    ]\n                                                                },\n                                                                \"headers\": {}\n                                                            },\n                                                            \"type\": \"endpoint\"\n                                                        }\n                                                    ],\n                                                    \"type\": \"tree\"\n                                                },\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"substring\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"AccessPointName\"\n                                                                },\n                                                                7,\n                                                                21,\n                                                                true\n                                                            ],\n                                                            \"assign\": \"s3expressAvailabilityZoneId\"\n                                                        },\n                                                        {\n                                                            \"fn\": \"substring\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"AccessPointName\"\n                                                                },\n                                                                21,\n                                                                23,\n                                                                true\n                                                            ],\n                                                            \"assign\": \"s3expressAvailabilityZoneDelim\"\n                                                        },\n                                                        {\n                                                            \"fn\": \"stringEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"s3expressAvailabilityZoneDelim\"\n                                                                },\n                                                                \"--\"\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"rules\": [\n                                                        {\n                                                            \"conditions\": [\n                                                                {\n                                                                    \"fn\": \"booleanEquals\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"UseFIPS\"\n                                                                        },\n                                                                        true\n                                                                    ]\n                                                                }\n                                                            ],\n                                                            \"endpoint\": {\n                                                                \"url\": \"https://s3express-control-fips.{Region}.{partitionResult#dnsSuffix}\",\n                                                                \"properties\": {\n                                                                    \"authSchemes\": [\n                                                                        {\n                                                                            \"disableDoubleEncoding\": true,\n                                                                            \"name\": \"sigv4\",\n                                                                            \"signingName\": \"s3express\",\n                                                                            \"signingRegion\": \"{Region}\"\n                                                                        }\n                                                                    ]\n                                                                },\n                                                                \"headers\": {}\n                                                            },\n                                                            \"type\": \"endpoint\"\n                                                        },\n                                                        {\n                                                            \"conditions\": [],\n                                                            \"endpoint\": {\n                                                                \"url\": \"https://s3express-control.{Region}.{partitionResult#dnsSuffix}\",\n                                                                \"properties\": {\n                                                                    \"authSchemes\": [\n                                                                        {\n                                                                            \"disableDoubleEncoding\": true,\n                                                                            \"name\": \"sigv4\",\n                                                                            \"signingName\": \"s3express\",\n                                                                            \"signingRegion\": \"{Region}\"\n                                                                        }\n                                                                    ]\n                                                                },\n                                                                \"headers\": {}\n                                                            },\n                                                            \"type\": \"endpoint\"\n                                                        }\n                                                    ],\n                                                    \"type\": \"tree\"\n                                                },\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"substring\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"AccessPointName\"\n                                                                },\n                                                                7,\n                                                                27,\n                                                                true\n                                                            ],\n                                                            \"assign\": \"s3expressAvailabilityZoneId\"\n                                                        },\n                                                        {\n                                                            \"fn\": \"substring\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"AccessPointName\"\n                                                                },\n                                                                27,\n                                                                29,\n                                                                true\n                                                            ],\n                                                            \"assign\": \"s3expressAvailabilityZoneDelim\"\n                                                        },\n                                                        {\n                                                            \"fn\": \"stringEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"s3expressAvailabilityZoneDelim\"\n                                                                },\n                                                                \"--\"\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"rules\": [\n                                                        {\n                                                            \"conditions\": [\n                                                                {\n                                                                    \"fn\": \"booleanEquals\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"UseFIPS\"\n                                                                        },\n                                                                        true\n                                                                    ]\n                                                                }\n                                                            ],\n                                                            \"endpoint\": {\n                                                                \"url\": \"https://s3express-control-fips.{Region}.{partitionResult#dnsSuffix}\",\n                                                                \"properties\": {\n                                                                    \"authSchemes\": [\n                                                                        {\n                                                                            \"disableDoubleEncoding\": true,\n                                                                            \"name\": \"sigv4\",\n                                                                            \"signingName\": \"s3express\",\n                                                                            \"signingRegion\": \"{Region}\"\n                                                                        }\n                                                                    ]\n                                                                },\n                                                                \"headers\": {}\n                                                            },\n                                                            \"type\": \"endpoint\"\n                                                        },\n                                                        {\n                                                            \"conditions\": [],\n                                                            \"endpoint\": {\n                                                                \"url\": \"https://s3express-control.{Region}.{partitionResult#dnsSuffix}\",\n                                                                \"properties\": {\n                                                                    \"authSchemes\": [\n                                                                        {\n                                                                            \"disableDoubleEncoding\": true,\n                                                                            \"name\": \"sigv4\",\n                                                                            \"signingName\": \"s3express\",\n                                                                            \"signingRegion\": \"{Region}\"\n                                                                        }\n                                                                    ]\n                                                                },\n                                                                \"headers\": {}\n                                                            },\n                                                            \"type\": \"endpoint\"\n                                                        }\n                                                    ],\n                                                    \"type\": \"tree\"\n                                                },\n                                                {\n                                                    \"conditions\": [],\n                                                    \"error\": \"Unrecognized S3Express Access Point name format.\",\n                                                    \"type\": \"error\"\n                                                }\n                                            ],\n                                            \"type\": \"tree\"\n                                        }\n                                    ],\n                                    \"type\": \"tree\"\n                                },\n                                {\n                                    \"conditions\": [\n                                        {\n                                            \"fn\": \"isSet\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"UseS3ExpressControlEndpoint\"\n                                                }\n                                            ]\n                                        },\n                                        {\n                                            \"fn\": \"booleanEquals\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"UseS3ExpressControlEndpoint\"\n                                                },\n                                                true\n                                            ]\n                                        }\n                                    ],\n                                    \"rules\": [\n                                        {\n                                            \"conditions\": [\n                                                {\n                                                    \"fn\": \"aws.partition\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"Region\"\n                                                        }\n                                                    ],\n                                                    \"assign\": \"partitionResult\"\n                                                }\n                                            ],\n                                            \"rules\": [\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"isSet\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"Endpoint\"\n                                                                }\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"UseDualStack\"\n                                                                },\n                                                                true\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"error\": \"Invalid Configuration: DualStack and custom endpoint are not supported\",\n                                                    \"type\": \"error\"\n                                                },\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"UseDualStack\"\n                                                                },\n                                                                true\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"error\": \"S3Express does not support Dual-stack.\",\n                                                    \"type\": \"error\"\n                                                },\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"isSet\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"Endpoint\"\n                                                                }\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"parseURL\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"Endpoint\"\n                                                                }\n                                                            ],\n                                                            \"assign\": \"url\"\n                                                        }\n                                                    ],\n                                                    \"endpoint\": {\n                                                        \"url\": \"{url#scheme}://{url#authority}\",\n                                                        \"properties\": {\n                                                            \"authSchemes\": [\n                                                                {\n                                                                    \"disableDoubleEncoding\": true,\n                                                                    \"name\": \"sigv4\",\n                                                                    \"signingName\": \"s3express\",\n                                                                    \"signingRegion\": \"{Region}\"\n                                                                }\n                                                            ]\n                                                        },\n                                                        \"headers\": {}\n                                                    },\n                                                    \"type\": \"endpoint\"\n                                                },\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"UseFIPS\"\n                                                                },\n                                                                true\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"endpoint\": {\n                                                        \"url\": \"https://s3express-control-fips.{Region}.{partitionResult#dnsSuffix}\",\n                                                        \"properties\": {\n                                                            \"authSchemes\": [\n                                                                {\n                                                                    \"disableDoubleEncoding\": true,\n                                                                    \"name\": \"sigv4\",\n                                                                    \"signingName\": \"s3express\",\n                                                                    \"signingRegion\": \"{Region}\"\n                                                                }\n                                                            ]\n                                                        },\n                                                        \"headers\": {}\n                                                    },\n                                                    \"type\": \"endpoint\"\n                                                },\n                                                {\n                                                    \"conditions\": [],\n                                                    \"endpoint\": {\n                                                        \"url\": \"https://s3express-control.{Region}.{partitionResult#dnsSuffix}\",\n                                                        \"properties\": {\n                                                            \"authSchemes\": [\n                                                                {\n                                                                    \"disableDoubleEncoding\": true,\n                                                                    \"name\": \"sigv4\",\n                                                                    \"signingName\": \"s3express\",\n                                                                    \"signingRegion\": \"{Region}\"\n                                                                }\n                                                            ]\n                                                        },\n                                                        \"headers\": {}\n                                                    },\n                                                    \"type\": \"endpoint\"\n                                                }\n                                            ],\n                                            \"type\": \"tree\"\n                                        }\n                                    ],\n                                    \"type\": \"tree\"\n                                },\n                                {\n                                    \"conditions\": [\n                                        {\n                                            \"fn\": \"stringEquals\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"Region\"\n                                                },\n                                                \"snow\"\n                                            ]\n                                        },\n                                        {\n                                            \"fn\": \"isSet\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"Endpoint\"\n                                                }\n                                            ]\n                                        },\n                                        {\n                                            \"fn\": \"parseURL\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"Endpoint\"\n                                                }\n                                            ],\n                                            \"assign\": \"url\"\n                                        }\n                                    ],\n                                    \"rules\": [\n                                        {\n                                            \"conditions\": [\n                                                {\n                                                    \"fn\": \"aws.partition\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"Region\"\n                                                        }\n                                                    ],\n                                                    \"assign\": \"partitionResult\"\n                                                }\n                                            ],\n                                            \"rules\": [\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"UseDualStack\"\n                                                                },\n                                                                true\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"error\": \"S3 Snow does not support DualStack\",\n                                                    \"type\": \"error\"\n                                                },\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"UseFIPS\"\n                                                                },\n                                                                true\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"error\": \"S3 Snow does not support FIPS\",\n                                                    \"type\": \"error\"\n                                                },\n                                                {\n                                                    \"conditions\": [],\n                                                    \"endpoint\": {\n                                                        \"url\": \"{url#scheme}://{url#authority}\",\n                                                        \"properties\": {\n                                                            \"authSchemes\": [\n                                                                {\n                                                                    \"disableDoubleEncoding\": true,\n                                                                    \"name\": \"sigv4\",\n                                                                    \"signingName\": \"s3\",\n                                                                    \"signingRegion\": \"{Region}\"\n                                                                }\n                                                            ]\n                                                        },\n                                                        \"headers\": {}\n                                                    },\n                                                    \"type\": \"endpoint\"\n                                                }\n                                            ],\n                                            \"type\": \"tree\"\n                                        }\n                                    ],\n                                    \"type\": \"tree\"\n                                },\n                                {\n                                    \"conditions\": [\n                                        {\n                                            \"fn\": \"isSet\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"AccessPointName\"\n                                                }\n                                            ]\n                                        },\n                                        {\n                                            \"fn\": \"aws.parseArn\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"AccessPointName\"\n                                                }\n                                            ],\n                                            \"assign\": \"accessPointArn\"\n                                        }\n                                    ],\n                                    \"rules\": [\n                                        {\n                                            \"conditions\": [\n                                                {\n                                                    \"fn\": \"getAttr\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"accessPointArn\"\n                                                        },\n                                                        \"resourceId[0]\"\n                                                    ],\n                                                    \"assign\": \"arnType\"\n                                                },\n                                                {\n                                                    \"fn\": \"not\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"fn\": \"stringEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"arnType\"\n                                                                },\n                                                                \"\"\n                                                            ]\n                                                        }\n                                                    ]\n                                                }\n                                            ],\n                                            \"rules\": [\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"stringEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"accessPointArn\"\n                                                                        },\n                                                                        \"service\"\n                                                                    ]\n                                                                },\n                                                                \"s3-outposts\"\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"rules\": [\n                                                        {\n                                                            \"conditions\": [\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"accessPointArn\"\n                                                                        },\n                                                                        \"resourceId[1]\"\n                                                                    ],\n                                                                    \"assign\": \"outpostId\"\n                                                                }\n                                                            ],\n                                                            \"rules\": [\n                                                                {\n                                                                    \"conditions\": [\n                                                                        {\n                                                                            \"fn\": \"isValidHostLabel\",\n                                                                            \"argv\": [\n                                                                                {\n                                                                                    \"ref\": \"outpostId\"\n                                                                                },\n                                                                                false\n                                                                            ]\n                                                                        }\n                                                                    ],\n                                                                    \"rules\": [\n                                                                        {\n                                                                            \"conditions\": [\n                                                                                {\n                                                                                    \"fn\": \"isSet\",\n                                                                                    \"argv\": [\n                                                                                        {\n                                                                                            \"ref\": \"Endpoint\"\n                                                                                        }\n                                                                                    ]\n                                                                                },\n                                                                                {\n                                                                                    \"fn\": \"booleanEquals\",\n                                                                                    \"argv\": [\n                                                                                        {\n                                                                                            \"ref\": \"UseDualStack\"\n                                                                                        },\n                                                                                        true\n                                                                                    ]\n                                                                                }\n                                                                            ],\n                                                                            \"error\": \"Invalid Configuration: DualStack and custom endpoint are not supported\",\n                                                                            \"type\": \"error\"\n                                                                        },\n                                                                        {\n                                                                            \"conditions\": [\n                                                                                {\n                                                                                    \"fn\": \"isSet\",\n                                                                                    \"argv\": [\n                                                                                        {\n                                                                                            \"ref\": \"UseArnRegion\"\n                                                                                        }\n                                                                                    ]\n                                                                                },\n                                                                                {\n                                                                                    \"fn\": \"booleanEquals\",\n                                                                                    \"argv\": [\n                                                                                        {\n                                                                                            \"ref\": \"UseArnRegion\"\n                                                                                        },\n                                                                                        false\n                                                                                    ]\n                                                                                },\n                                                                                {\n                                                                                    \"fn\": \"not\",\n                                                                                    \"argv\": [\n                                                                                        {\n                                                                                            \"fn\": \"stringEquals\",\n                                                                                            \"argv\": [\n                                                                                                {\n                                                                                                    \"fn\": \"getAttr\",\n                                                                                                    \"argv\": [\n                                                                                                        {\n                                                                                                            \"ref\": \"accessPointArn\"\n                                                                                                        },\n                                                                                                        \"region\"\n                                                                                                    ]\n                                                                                                },\n                                                                                                \"{Region}\"\n                                                                                            ]\n                                                                                        }\n                                                                                    ]\n                                                                                }\n                                                                            ],\n                                                                            \"error\": \"Invalid configuration: region from ARN `{accessPointArn#region}` does not match client region `{Region}` and UseArnRegion is `false`\",\n                                                                            \"type\": \"error\"\n                                                                        },\n                                                                        {\n                                                                            \"conditions\": [\n                                                                                {\n                                                                                    \"fn\": \"aws.partition\",\n                                                                                    \"argv\": [\n                                                                                        {\n                                                                                            \"ref\": \"Region\"\n                                                                                        }\n                                                                                    ],\n                                                                                    \"assign\": \"partitionResult\"\n                                                                                }\n                                                                            ],\n                                                                            \"rules\": [\n                                                                                {\n                                                                                    \"conditions\": [\n                                                                                        {\n                                                                                            \"fn\": \"aws.partition\",\n                                                                                            \"argv\": [\n                                                                                                {\n                                                                                                    \"fn\": \"getAttr\",\n                                                                                                    \"argv\": [\n                                                                                                        {\n                                                                                                            \"ref\": \"accessPointArn\"\n                                                                                                        },\n                                                                                                        \"region\"\n                                                                                                    ]\n                                                                                                }\n                                                                                            ],\n                                                                                            \"assign\": \"arnPartition\"\n                                                                                        }\n                                                                                    ],\n                                                                                    \"rules\": [\n                                                                                        {\n                                                                                            \"conditions\": [\n                                                                                                {\n                                                                                                    \"fn\": \"stringEquals\",\n                                                                                                    \"argv\": [\n                                                                                                        {\n                                                                                                            \"fn\": \"getAttr\",\n                                                                                                            \"argv\": [\n                                                                                                                {\n                                                                                                                    \"ref\": \"arnPartition\"\n                                                                                                                },\n                                                                                                                \"name\"\n                                                                                                            ]\n                                                                                                        },\n                                                                                                        {\n                                                                                                            \"fn\": \"getAttr\",\n                                                                                                            \"argv\": [\n                                                                                                                {\n                                                                                                                    \"ref\": \"partitionResult\"\n                                                                                                                },\n                                                                                                                \"name\"\n                                                                                                            ]\n                                                                                                        }\n                                                                                                    ]\n                                                                                                }\n                                                                                            ],\n                                                                                            \"rules\": [\n                                                                                                {\n                                                                                                    \"conditions\": [\n                                                                                                        {\n                                                                                                            \"fn\": \"isValidHostLabel\",\n                                                                                                            \"argv\": [\n                                                                                                                {\n                                                                                                                    \"fn\": \"getAttr\",\n                                                                                                                    \"argv\": [\n                                                                                                                        {\n                                                                                                                            \"ref\": \"accessPointArn\"\n                                                                                                                        },\n                                                                                                                        \"region\"\n                                                                                                                    ]\n                                                                                                                },\n                                                                                                                true\n                                                                                                            ]\n                                                                                                        }\n                                                                                                    ],\n                                                                                                    \"rules\": [\n                                                                                                        {\n                                                                                                            \"conditions\": [\n                                                                                                                {\n                                                                                                                    \"fn\": \"not\",\n                                                                                                                    \"argv\": [\n                                                                                                                        {\n                                                                                                                            \"fn\": \"stringEquals\",\n                                                                                                                            \"argv\": [\n                                                                                                                                {\n                                                                                                                                    \"fn\": \"getAttr\",\n                                                                                                                                    \"argv\": [\n                                                                                                                                        {\n                                                                                                                                            \"ref\": \"accessPointArn\"\n                                                                                                                                        },\n                                                                                                                                        \"accountId\"\n                                                                                                                                    ]\n                                                                                                                                },\n                                                                                                                                \"\"\n                                                                                                                            ]\n                                                                                                                        }\n                                                                                                                    ]\n                                                                                                                }\n                                                                                                            ],\n                                                                                                            \"rules\": [\n                                                                                                                {\n                                                                                                                    \"conditions\": [\n                                                                                                                        {\n                                                                                                                            \"fn\": \"isValidHostLabel\",\n                                                                                                                            \"argv\": [\n                                                                                                                                {\n                                                                                                                                    \"fn\": \"getAttr\",\n                                                                                                                                    \"argv\": [\n                                                                                                                                        {\n                                                                                                                                            \"ref\": \"accessPointArn\"\n                                                                                                                                        },\n                                                                                                                                        \"accountId\"\n                                                                                                                                    ]\n                                                                                                                                },\n                                                                                                                                false\n                                                                                                                            ]\n                                                                                                                        }\n                                                                                                                    ],\n                                                                                                                    \"rules\": [\n                                                                                                                        {\n                                                                                                                            \"conditions\": [\n                                                                                                                                {\n                                                                                                                                    \"fn\": \"isSet\",\n                                                                                                                                    \"argv\": [\n                                                                                                                                        {\n                                                                                                                                            \"ref\": \"AccountId\"\n                                                                                                                                        }\n                                                                                                                                    ]\n                                                                                                                                },\n                                                                                                                                {\n                                                                                                                                    \"fn\": \"not\",\n                                                                                                                                    \"argv\": [\n                                                                                                                                        {\n                                                                                                                                            \"fn\": \"stringEquals\",\n                                                                                                                                            \"argv\": [\n                                                                                                                                                {\n                                                                                                                                                    \"ref\": \"AccountId\"\n                                                                                                                                                },\n                                                                                                                                                \"{accessPointArn#accountId}\"\n                                                                                                                                            ]\n                                                                                                                                        }\n                                                                                                                                    ]\n                                                                                                                                }\n                                                                                                                            ],\n                                                                                                                            \"error\": \"Invalid ARN: the accountId specified in the ARN (`{accessPointArn#accountId}`) does not match the parameter (`{AccountId}`)\",\n                                                                                                                            \"type\": \"error\"\n                                                                                                                        },\n                                                                                                                        {\n                                                                                                                            \"conditions\": [\n                                                                                                                                {\n                                                                                                                                    \"fn\": \"getAttr\",\n                                                                                                                                    \"argv\": [\n                                                                                                                                        {\n                                                                                                                                            \"ref\": \"accessPointArn\"\n                                                                                                                                        },\n                                                                                                                                        \"resourceId[2]\"\n                                                                                                                                    ],\n                                                                                                                                    \"assign\": \"outpostType\"\n                                                                                                                                }\n                                                                                                                            ],\n                                                                                                                            \"rules\": [\n                                                                                                                                {\n                                                                                                                                    \"conditions\": [\n                                                                                                                                        {\n                                                                                                                                            \"fn\": \"getAttr\",\n                                                                                                                                            \"argv\": [\n                                                                                                                                                {\n                                                                                                                                                    \"ref\": \"accessPointArn\"\n                                                                                                                                                },\n                                                                                                                                                \"resourceId[3]\"\n                                                                                                                                            ],\n                                                                                                                                            \"assign\": \"accessPointName\"\n                                                                                                                                        }\n                                                                                                                                    ],\n                                                                                                                                    \"rules\": [\n                                                                                                                                        {\n                                                                                                                                            \"conditions\": [\n                                                                                                                                                {\n                                                                                                                                                    \"fn\": \"stringEquals\",\n                                                                                                                                                    \"argv\": [\n                                                                                                                                                        {\n                                                                                                                                                            \"ref\": \"outpostType\"\n                                                                                                                                                        },\n                                                                                                                                                        \"accesspoint\"\n                                                                                                                                                    ]\n                                                                                                                                                }\n                                                                                                                                            ],\n                                                                                                                                            \"rules\": [\n                                                                                                                                                {\n                                                                                                                                                    \"conditions\": [\n                                                                                                                                                        {\n                                                                                                                                                            \"fn\": \"booleanEquals\",\n                                                                                                                                                            \"argv\": [\n                                                                                                                                                                {\n                                                                                                                                                                    \"ref\": \"UseFIPS\"\n                                                                                                                                                                },\n                                                                                                                                                                true\n                                                                                                                                                            ]\n                                                                                                                                                        },\n                                                                                                                                                        {\n                                                                                                                                                            \"fn\": \"booleanEquals\",\n                                                                                                                                                            \"argv\": [\n                                                                                                                                                                {\n                                                                                                                                                                    \"ref\": \"UseDualStack\"\n                                                                                                                                                                },\n                                                                                                                                                                true\n                                                                                                                                                            ]\n                                                                                                                                                        }\n                                                                                                                                                    ],\n                                                                                                                                                    \"endpoint\": {\n                                                                                                                                                        \"url\": \"https://s3-outposts-fips.{accessPointArn#region}.{arnPartition#dualStackDnsSuffix}\",\n                                                                                                                                                        \"properties\": {\n                                                                                                                                                            \"authSchemes\": [\n                                                                                                                                                                {\n                                                                                                                                                                    \"disableDoubleEncoding\": true,\n                                                                                                                                                                    \"name\": \"sigv4\",\n                                                                                                                                                                    \"signingName\": \"s3-outposts\",\n                                                                                                                                                                    \"signingRegion\": \"{accessPointArn#region}\"\n                                                                                                                                                                }\n                                                                                                                                                            ]\n                                                                                                                                                        },\n                                                                                                                                                        \"headers\": {\n                                                                                                                                                            \"x-amz-account-id\": [\n                                                                                                                                                                \"{accessPointArn#accountId}\"\n                                                                                                                                                            ],\n                                                                                                                                                            \"x-amz-outpost-id\": [\n                                                                                                                                                                \"{outpostId}\"\n                                                                                                                                                            ]\n                                                                                                                                                        }\n                                                                                                                                                    },\n                                                                                                                                                    \"type\": \"endpoint\"\n                                                                                                                                                },\n                                                                                                                                                {\n                                                                                                                                                    \"conditions\": [\n                                                                                                                                                        {\n                                                                                                                                                            \"fn\": \"booleanEquals\",\n                                                                                                                                                            \"argv\": [\n                                                                                                                                                                {\n                                                                                                                                                                    \"ref\": \"UseFIPS\"\n                                                                                                                                                                },\n                                                                                                                                                                true\n                                                                                                                                                            ]\n                                                                                                                                                        }\n                                                                                                                                                    ],\n                                                                                                                                                    \"endpoint\": {\n                                                                                                                                                        \"url\": \"https://s3-outposts-fips.{accessPointArn#region}.{arnPartition#dnsSuffix}\",\n                                                                                                                                                        \"properties\": {\n                                                                                                                                                            \"authSchemes\": [\n                                                                                                                                                                {\n                                                                                                                                                                    \"disableDoubleEncoding\": true,\n                                                                                                                                                                    \"name\": \"sigv4\",\n                                                                                                                                                                    \"signingName\": \"s3-outposts\",\n                                                                                                                                                                    \"signingRegion\": \"{accessPointArn#region}\"\n                                                                                                                                                                }\n                                                                                                                                                            ]\n                                                                                                                                                        },\n                                                                                                                                                        \"headers\": {\n                                                                                                                                                            \"x-amz-account-id\": [\n                                                                                                                                                                \"{accessPointArn#accountId}\"\n                                                                                                                                                            ],\n                                                                                                                                                            \"x-amz-outpost-id\": [\n                                                                                                                                                                \"{outpostId}\"\n                                                                                                                                                            ]\n                                                                                                                                                        }\n                                                                                                                                                    },\n                                                                                                                                                    \"type\": \"endpoint\"\n                                                                                                                                                },\n                                                                                                                                                {\n                                                                                                                                                    \"conditions\": [\n                                                                                                                                                        {\n                                                                                                                                                            \"fn\": \"booleanEquals\",\n                                                                                                                                                            \"argv\": [\n                                                                                                                                                                {\n                                                                                                                                                                    \"ref\": \"UseDualStack\"\n                                                                                                                                                                },\n                                                                                                                                                                true\n                                                                                                                                                            ]\n                                                                                                                                                        }\n                                                                                                                                                    ],\n                                                                                                                                                    \"endpoint\": {\n                                                                                                                                                        \"url\": \"https://s3-outposts.{accessPointArn#region}.{arnPartition#dualStackDnsSuffix}\",\n                                                                                                                                                        \"properties\": {\n                                                                                                                                                            \"authSchemes\": [\n                                                                                                                                                                {\n                                                                                                                                                                    \"disableDoubleEncoding\": true,\n                                                                                                                                                                    \"name\": \"sigv4\",\n                                                                                                                                                                    \"signingName\": \"s3-outposts\",\n                                                                                                                                                                    \"signingRegion\": \"{accessPointArn#region}\"\n                                                                                                                                                                }\n                                                                                                                                                            ]\n                                                                                                                                                        },\n                                                                                                                                                        \"headers\": {\n                                                                                                                                                            \"x-amz-account-id\": [\n                                                                                                                                                                \"{accessPointArn#accountId}\"\n                                                                                                                                                            ],\n                                                                                                                                                            \"x-amz-outpost-id\": [\n                                                                                                                                                                \"{outpostId}\"\n                                                                                                                                                            ]\n                                                                                                                                                        }\n                                                                                                                                                    },\n                                                                                                                                                    \"type\": \"endpoint\"\n                                                                                                                                                },\n                                                                                                                                                {\n                                                                                                                                                    \"conditions\": [\n                                                                                                                                                        {\n                                                                                                                                                            \"fn\": \"isSet\",\n                                                                                                                                                            \"argv\": [\n                                                                                                                                                                {\n                                                                                                                                                                    \"ref\": \"Endpoint\"\n                                                                                                                                                                }\n                                                                                                                                                            ]\n                                                                                                                                                        },\n                                                                                                                                                        {\n                                                                                                                                                            \"fn\": \"parseURL\",\n                                                                                                                                                            \"argv\": [\n                                                                                                                                                                {\n                                                                                                                                                                    \"ref\": \"Endpoint\"\n                                                                                                                                                                }\n                                                                                                                                                            ],\n                                                                                                                                                            \"assign\": \"url\"\n                                                                                                                                                        }\n                                                                                                                                                    ],\n                                                                                                                                                    \"endpoint\": {\n                                                                                                                                                        \"url\": \"{url#scheme}://{url#authority}{url#path}\",\n                                                                                                                                                        \"properties\": {\n                                                                                                                                                            \"authSchemes\": [\n                                                                                                                                                                {\n                                                                                                                                                                    \"disableDoubleEncoding\": true,\n                                                                                                                                                                    \"name\": \"sigv4\",\n                                                                                                                                                                    \"signingName\": \"s3-outposts\",\n                                                                                                                                                                    \"signingRegion\": \"{accessPointArn#region}\"\n                                                                                                                                                                }\n                                                                                                                                                            ]\n                                                                                                                                                        },\n                                                                                                                                                        \"headers\": {\n                                                                                                                                                            \"x-amz-account-id\": [\n                                                                                                                                                                \"{accessPointArn#accountId}\"\n                                                                                                                                                            ],\n                                                                                                                                                            \"x-amz-outpost-id\": [\n                                                                                                                                                                \"{outpostId}\"\n                                                                                                                                                            ]\n                                                                                                                                                        }\n                                                                                                                                                    },\n                                                                                                                                                    \"type\": \"endpoint\"\n                                                                                                                                                },\n                                                                                                                                                {\n                                                                                                                                                    \"conditions\": [],\n                                                                                                                                                    \"endpoint\": {\n                                                                                                                                                        \"url\": \"https://s3-outposts.{accessPointArn#region}.{arnPartition#dnsSuffix}\",\n                                                                                                                                                        \"properties\": {\n                                                                                                                                                            \"authSchemes\": [\n                                                                                                                                                                {\n                                                                                                                                                                    \"disableDoubleEncoding\": true,\n                                                                                                                                                                    \"name\": \"sigv4\",\n                                                                                                                                                                    \"signingName\": \"s3-outposts\",\n                                                                                                                                                                    \"signingRegion\": \"{accessPointArn#region}\"\n                                                                                                                                                                }\n                                                                                                                                                            ]\n                                                                                                                                                        },\n                                                                                                                                                        \"headers\": {\n                                                                                                                                                            \"x-amz-account-id\": [\n                                                                                                                                                                \"{accessPointArn#accountId}\"\n                                                                                                                                                            ],\n                                                                                                                                                            \"x-amz-outpost-id\": [\n                                                                                                                                                                \"{outpostId}\"\n                                                                                                                                                            ]\n                                                                                                                                                        }\n                                                                                                                                                    },\n                                                                                                                                                    \"type\": \"endpoint\"\n                                                                                                                                                }\n                                                                                                                                            ],\n                                                                                                                                            \"type\": \"tree\"\n                                                                                                                                        },\n                                                                                                                                        {\n                                                                                                                                            \"conditions\": [],\n                                                                                                                                            \"error\": \"Expected an outpost type `accesspoint`, found `{outpostType}`\",\n                                                                                                                                            \"type\": \"error\"\n                                                                                                                                        }\n                                                                                                                                    ],\n                                                                                                                                    \"type\": \"tree\"\n                                                                                                                                },\n                                                                                                                                {\n                                                                                                                                    \"conditions\": [],\n                                                                                                                                    \"error\": \"Invalid ARN: expected an access point name\",\n                                                                                                                                    \"type\": \"error\"\n                                                                                                                                }\n                                                                                                                            ],\n                                                                                                                            \"type\": \"tree\"\n                                                                                                                        },\n                                                                                                                        {\n                                                                                                                            \"conditions\": [],\n                                                                                                                            \"error\": \"Invalid ARN: Expected a 4-component resource\",\n                                                                                                                            \"type\": \"error\"\n                                                                                                                        }\n                                                                                                                    ],\n                                                                                                                    \"type\": \"tree\"\n                                                                                                                },\n                                                                                                                {\n                                                                                                                    \"conditions\": [],\n                                                                                                                    \"error\": \"Invalid ARN: The account id may only contain a-z, A-Z, 0-9 and `-`. Found: `{accessPointArn#accountId}`\",\n                                                                                                                    \"type\": \"error\"\n                                                                                                                }\n                                                                                                            ],\n                                                                                                            \"type\": \"tree\"\n                                                                                                        },\n                                                                                                        {\n                                                                                                            \"conditions\": [],\n                                                                                                            \"error\": \"Invalid ARN: missing account ID\",\n                                                                                                            \"type\": \"error\"\n                                                                                                        }\n                                                                                                    ],\n                                                                                                    \"type\": \"tree\"\n                                                                                                },\n                                                                                                {\n                                                                                                    \"conditions\": [],\n                                                                                                    \"error\": \"Invalid region in ARN: `{accessPointArn#region}` (invalid DNS name)\",\n                                                                                                    \"type\": \"error\"\n                                                                                                }\n                                                                                            ],\n                                                                                            \"type\": \"tree\"\n                                                                                        },\n                                                                                        {\n                                                                                            \"conditions\": [],\n                                                                                            \"error\": \"Client was configured for partition `{partitionResult#name}` but ARN has `{arnPartition#name}`\",\n                                                                                            \"type\": \"error\"\n                                                                                        }\n                                                                                    ],\n                                                                                    \"type\": \"tree\"\n                                                                                }\n                                                                            ],\n                                                                            \"type\": \"tree\"\n                                                                        }\n                                                                    ],\n                                                                    \"type\": \"tree\"\n                                                                },\n                                                                {\n                                                                    \"conditions\": [],\n                                                                    \"error\": \"Invalid ARN: The outpost Id must only contain a-z, A-Z, 0-9 and `-`., found: `{outpostId}`\",\n                                                                    \"type\": \"error\"\n                                                                }\n                                                            ],\n                                                            \"type\": \"tree\"\n                                                        },\n                                                        {\n                                                            \"conditions\": [],\n                                                            \"error\": \"Invalid ARN: The Outpost Id was not set\",\n                                                            \"type\": \"error\"\n                                                        }\n                                                    ],\n                                                    \"type\": \"tree\"\n                                                }\n                                            ],\n                                            \"type\": \"tree\"\n                                        },\n                                        {\n                                            \"conditions\": [],\n                                            \"error\": \"Invalid ARN: No ARN type specified\",\n                                            \"type\": \"error\"\n                                        }\n                                    ],\n                                    \"type\": \"tree\"\n                                },\n                                {\n                                    \"conditions\": [\n                                        {\n                                            \"fn\": \"isSet\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"Bucket\"\n                                                }\n                                            ]\n                                        },\n                                        {\n                                            \"fn\": \"aws.parseArn\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"Bucket\"\n                                                }\n                                            ],\n                                            \"assign\": \"bucketArn\"\n                                        }\n                                    ],\n                                    \"rules\": [\n                                        {\n                                            \"conditions\": [\n                                                {\n                                                    \"fn\": \"getAttr\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"bucketArn\"\n                                                        },\n                                                        \"resourceId[0]\"\n                                                    ],\n                                                    \"assign\": \"arnType\"\n                                                },\n                                                {\n                                                    \"fn\": \"not\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"fn\": \"stringEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"arnType\"\n                                                                },\n                                                                \"\"\n                                                            ]\n                                                        }\n                                                    ]\n                                                }\n                                            ],\n                                            \"rules\": [\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"stringEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"bucketArn\"\n                                                                        },\n                                                                        \"service\"\n                                                                    ]\n                                                                },\n                                                                \"s3-outposts\"\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"rules\": [\n                                                        {\n                                                            \"conditions\": [\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"bucketArn\"\n                                                                        },\n                                                                        \"resourceId[1]\"\n                                                                    ],\n                                                                    \"assign\": \"outpostId\"\n                                                                }\n                                                            ],\n                                                            \"rules\": [\n                                                                {\n                                                                    \"conditions\": [\n                                                                        {\n                                                                            \"fn\": \"isValidHostLabel\",\n                                                                            \"argv\": [\n                                                                                {\n                                                                                    \"ref\": \"outpostId\"\n                                                                                },\n                                                                                false\n                                                                            ]\n                                                                        }\n                                                                    ],\n                                                                    \"rules\": [\n                                                                        {\n                                                                            \"conditions\": [\n                                                                                {\n                                                                                    \"fn\": \"isSet\",\n                                                                                    \"argv\": [\n                                                                                        {\n                                                                                            \"ref\": \"Endpoint\"\n                                                                                        }\n                                                                                    ]\n                                                                                },\n                                                                                {\n                                                                                    \"fn\": \"booleanEquals\",\n                                                                                    \"argv\": [\n                                                                                        {\n                                                                                            \"ref\": \"UseDualStack\"\n                                                                                        },\n                                                                                        true\n                                                                                    ]\n                                                                                }\n                                                                            ],\n                                                                            \"error\": \"Invalid Configuration: DualStack and custom endpoint are not supported\",\n                                                                            \"type\": \"error\"\n                                                                        },\n                                                                        {\n                                                                            \"conditions\": [\n                                                                                {\n                                                                                    \"fn\": \"isSet\",\n                                                                                    \"argv\": [\n                                                                                        {\n                                                                                            \"ref\": \"UseArnRegion\"\n                                                                                        }\n                                                                                    ]\n                                                                                },\n                                                                                {\n                                                                                    \"fn\": \"booleanEquals\",\n                                                                                    \"argv\": [\n                                                                                        {\n                                                                                            \"ref\": \"UseArnRegion\"\n                                                                                        },\n                                                                                        false\n                                                                                    ]\n                                                                                },\n                                                                                {\n                                                                                    \"fn\": \"not\",\n                                                                                    \"argv\": [\n                                                                                        {\n                                                                                            \"fn\": \"stringEquals\",\n                                                                                            \"argv\": [\n                                                                                                {\n                                                                                                    \"fn\": \"getAttr\",\n                                                                                                    \"argv\": [\n                                                                                                        {\n                                                                                                            \"ref\": \"bucketArn\"\n                                                                                                        },\n                                                                                                        \"region\"\n                                                                                                    ]\n                                                                                                },\n                                                                                                \"{Region}\"\n                                                                                            ]\n                                                                                        }\n                                                                                    ]\n                                                                                }\n                                                                            ],\n                                                                            \"error\": \"Invalid configuration: region from ARN `{bucketArn#region}` does not match client region `{Region}` and UseArnRegion is `false`\",\n                                                                            \"type\": \"error\"\n                                                                        },\n                                                                        {\n                                                                            \"conditions\": [\n                                                                                {\n                                                                                    \"fn\": \"aws.partition\",\n                                                                                    \"argv\": [\n                                                                                        {\n                                                                                            \"fn\": \"getAttr\",\n                                                                                            \"argv\": [\n                                                                                                {\n                                                                                                    \"ref\": \"bucketArn\"\n                                                                                                },\n                                                                                                \"region\"\n                                                                                            ]\n                                                                                        }\n                                                                                    ],\n                                                                                    \"assign\": \"arnPartition\"\n                                                                                }\n                                                                            ],\n                                                                            \"rules\": [\n                                                                                {\n                                                                                    \"conditions\": [\n                                                                                        {\n                                                                                            \"fn\": \"aws.partition\",\n                                                                                            \"argv\": [\n                                                                                                {\n                                                                                                    \"ref\": \"Region\"\n                                                                                                }\n                                                                                            ],\n                                                                                            \"assign\": \"partitionResult\"\n                                                                                        }\n                                                                                    ],\n                                                                                    \"rules\": [\n                                                                                        {\n                                                                                            \"conditions\": [\n                                                                                                {\n                                                                                                    \"fn\": \"stringEquals\",\n                                                                                                    \"argv\": [\n                                                                                                        {\n                                                                                                            \"fn\": \"getAttr\",\n                                                                                                            \"argv\": [\n                                                                                                                {\n                                                                                                                    \"ref\": \"arnPartition\"\n                                                                                                                },\n                                                                                                                \"name\"\n                                                                                                            ]\n                                                                                                        },\n                                                                                                        {\n                                                                                                            \"fn\": \"getAttr\",\n                                                                                                            \"argv\": [\n                                                                                                                {\n                                                                                                                    \"ref\": \"partitionResult\"\n                                                                                                                },\n                                                                                                                \"name\"\n                                                                                                            ]\n                                                                                                        }\n                                                                                                    ]\n                                                                                                }\n                                                                                            ],\n                                                                                            \"rules\": [\n                                                                                                {\n                                                                                                    \"conditions\": [\n                                                                                                        {\n                                                                                                            \"fn\": \"isValidHostLabel\",\n                                                                                                            \"argv\": [\n                                                                                                                {\n                                                                                                                    \"fn\": \"getAttr\",\n                                                                                                                    \"argv\": [\n                                                                                                                        {\n                                                                                                                            \"ref\": \"bucketArn\"\n                                                                                                                        },\n                                                                                                                        \"region\"\n                                                                                                                    ]\n                                                                                                                },\n                                                                                                                true\n                                                                                                            ]\n                                                                                                        }\n                                                                                                    ],\n                                                                                                    \"rules\": [\n                                                                                                        {\n                                                                                                            \"conditions\": [\n                                                                                                                {\n                                                                                                                    \"fn\": \"not\",\n                                                                                                                    \"argv\": [\n                                                                                                                        {\n                                                                                                                            \"fn\": \"stringEquals\",\n                                                                                                                            \"argv\": [\n                                                                                                                                {\n                                                                                                                                    \"fn\": \"getAttr\",\n                                                                                                                                    \"argv\": [\n                                                                                                                                        {\n                                                                                                                                            \"ref\": \"bucketArn\"\n                                                                                                                                        },\n                                                                                                                                        \"accountId\"\n                                                                                                                                    ]\n                                                                                                                                },\n                                                                                                                                \"\"\n                                                                                                                            ]\n                                                                                                                        }\n                                                                                                                    ]\n                                                                                                                }\n                                                                                                            ],\n                                                                                                            \"rules\": [\n                                                                                                                {\n                                                                                                                    \"conditions\": [\n                                                                                                                        {\n                                                                                                                            \"fn\": \"isValidHostLabel\",\n                                                                                                                            \"argv\": [\n                                                                                                                                {\n                                                                                                                                    \"fn\": \"getAttr\",\n                                                                                                                                    \"argv\": [\n                                                                                                                                        {\n                                                                                                                                            \"ref\": \"bucketArn\"\n                                                                                                                                        },\n                                                                                                                                        \"accountId\"\n                                                                                                                                    ]\n                                                                                                                                },\n                                                                                                                                false\n                                                                                                                            ]\n                                                                                                                        }\n                                                                                                                    ],\n                                                                                                                    \"rules\": [\n                                                                                                                        {\n                                                                                                                            \"conditions\": [\n                                                                                                                                {\n                                                                                                                                    \"fn\": \"isSet\",\n                                                                                                                                    \"argv\": [\n                                                                                                                                        {\n                                                                                                                                            \"ref\": \"AccountId\"\n                                                                                                                                        }\n                                                                                                                                    ]\n                                                                                                                                },\n                                                                                                                                {\n                                                                                                                                    \"fn\": \"not\",\n                                                                                                                                    \"argv\": [\n                                                                                                                                        {\n                                                                                                                                            \"fn\": \"stringEquals\",\n                                                                                                                                            \"argv\": [\n                                                                                                                                                {\n                                                                                                                                                    \"ref\": \"AccountId\"\n                                                                                                                                                },\n                                                                                                                                                \"{bucketArn#accountId}\"\n                                                                                                                                            ]\n                                                                                                                                        }\n                                                                                                                                    ]\n                                                                                                                                }\n                                                                                                                            ],\n                                                                                                                            \"error\": \"Invalid ARN: the accountId specified in the ARN (`{bucketArn#accountId}`) does not match the parameter (`{AccountId}`)\",\n                                                                                                                            \"type\": \"error\"\n                                                                                                                        },\n                                                                                                                        {\n                                                                                                                            \"conditions\": [\n                                                                                                                                {\n                                                                                                                                    \"fn\": \"getAttr\",\n                                                                                                                                    \"argv\": [\n                                                                                                                                        {\n                                                                                                                                            \"ref\": \"bucketArn\"\n                                                                                                                                        },\n                                                                                                                                        \"resourceId[2]\"\n                                                                                                                                    ],\n                                                                                                                                    \"assign\": \"outpostType\"\n                                                                                                                                }\n                                                                                                                            ],\n                                                                                                                            \"rules\": [\n                                                                                                                                {\n                                                                                                                                    \"conditions\": [\n                                                                                                                                        {\n                                                                                                                                            \"fn\": \"getAttr\",\n                                                                                                                                            \"argv\": [\n                                                                                                                                                {\n                                                                                                                                                    \"ref\": \"bucketArn\"\n                                                                                                                                                },\n                                                                                                                                                \"resourceId[3]\"\n                                                                                                                                            ],\n                                                                                                                                            \"assign\": \"bucketName\"\n                                                                                                                                        }\n                                                                                                                                    ],\n                                                                                                                                    \"rules\": [\n                                                                                                                                        {\n                                                                                                                                            \"conditions\": [\n                                                                                                                                                {\n                                                                                                                                                    \"fn\": \"stringEquals\",\n                                                                                                                                                    \"argv\": [\n                                                                                                                                                        {\n                                                                                                                                                            \"ref\": \"outpostType\"\n                                                                                                                                                        },\n                                                                                                                                                        \"bucket\"\n                                                                                                                                                    ]\n                                                                                                                                                }\n                                                                                                                                            ],\n                                                                                                                                            \"rules\": [\n                                                                                                                                                {\n                                                                                                                                                    \"conditions\": [\n                                                                                                                                                        {\n                                                                                                                                                            \"fn\": \"booleanEquals\",\n                                                                                                                                                            \"argv\": [\n                                                                                                                                                                {\n                                                                                                                                                                    \"ref\": \"UseFIPS\"\n                                                                                                                                                                },\n                                                                                                                                                                true\n                                                                                                                                                            ]\n                                                                                                                                                        },\n                                                                                                                                                        {\n                                                                                                                                                            \"fn\": \"booleanEquals\",\n                                                                                                                                                            \"argv\": [\n                                                                                                                                                                {\n                                                                                                                                                                    \"ref\": \"UseDualStack\"\n                                                                                                                                                                },\n                                                                                                                                                                true\n                                                                                                                                                            ]\n                                                                                                                                                        }\n                                                                                                                                                    ],\n                                                                                                                                                    \"endpoint\": {\n                                                                                                                                                        \"url\": \"https://s3-outposts-fips.{bucketArn#region}.{arnPartition#dualStackDnsSuffix}\",\n                                                                                                                                                        \"properties\": {\n                                                                                                                                                            \"authSchemes\": [\n                                                                                                                                                                {\n                                                                                                                                                                    \"disableDoubleEncoding\": true,\n                                                                                                                                                                    \"name\": \"sigv4\",\n                                                                                                                                                                    \"signingName\": \"s3-outposts\",\n                                                                                                                                                                    \"signingRegion\": \"{bucketArn#region}\"\n                                                                                                                                                                }\n                                                                                                                                                            ]\n                                                                                                                                                        },\n                                                                                                                                                        \"headers\": {\n                                                                                                                                                            \"x-amz-account-id\": [\n                                                                                                                                                                \"{bucketArn#accountId}\"\n                                                                                                                                                            ],\n                                                                                                                                                            \"x-amz-outpost-id\": [\n                                                                                                                                                                \"{outpostId}\"\n                                                                                                                                                            ]\n                                                                                                                                                        }\n                                                                                                                                                    },\n                                                                                                                                                    \"type\": \"endpoint\"\n                                                                                                                                                },\n                                                                                                                                                {\n                                                                                                                                                    \"conditions\": [\n                                                                                                                                                        {\n                                                                                                                                                            \"fn\": \"booleanEquals\",\n                                                                                                                                                            \"argv\": [\n                                                                                                                                                                {\n                                                                                                                                                                    \"ref\": \"UseFIPS\"\n                                                                                                                                                                },\n                                                                                                                                                                true\n                                                                                                                                                            ]\n                                                                                                                                                        }\n                                                                                                                                                    ],\n                                                                                                                                                    \"endpoint\": {\n                                                                                                                                                        \"url\": \"https://s3-outposts-fips.{bucketArn#region}.{arnPartition#dnsSuffix}\",\n                                                                                                                                                        \"properties\": {\n                                                                                                                                                            \"authSchemes\": [\n                                                                                                                                                                {\n                                                                                                                                                                    \"disableDoubleEncoding\": true,\n                                                                                                                                                                    \"name\": \"sigv4\",\n                                                                                                                                                                    \"signingName\": \"s3-outposts\",\n                                                                                                                                                                    \"signingRegion\": \"{bucketArn#region}\"\n                                                                                                                                                                }\n                                                                                                                                                            ]\n                                                                                                                                                        },\n                                                                                                                                                        \"headers\": {\n                                                                                                                                                            \"x-amz-account-id\": [\n                                                                                                                                                                \"{bucketArn#accountId}\"\n                                                                                                                                                            ],\n                                                                                                                                                            \"x-amz-outpost-id\": [\n                                                                                                                                                                \"{outpostId}\"\n                                                                                                                                                            ]\n                                                                                                                                                        }\n                                                                                                                                                    },\n                                                                                                                                                    \"type\": \"endpoint\"\n                                                                                                                                                },\n                                                                                                                                                {\n                                                                                                                                                    \"conditions\": [\n                                                                                                                                                        {\n                                                                                                                                                            \"fn\": \"booleanEquals\",\n                                                                                                                                                            \"argv\": [\n                                                                                                                                                                {\n                                                                                                                                                                    \"ref\": \"UseDualStack\"\n                                                                                                                                                                },\n                                                                                                                                                                true\n                                                                                                                                                            ]\n                                                                                                                                                        }\n                                                                                                                                                    ],\n                                                                                                                                                    \"endpoint\": {\n                                                                                                                                                        \"url\": \"https://s3-outposts.{bucketArn#region}.{arnPartition#dualStackDnsSuffix}\",\n                                                                                                                                                        \"properties\": {\n                                                                                                                                                            \"authSchemes\": [\n                                                                                                                                                                {\n                                                                                                                                                                    \"disableDoubleEncoding\": true,\n                                                                                                                                                                    \"name\": \"sigv4\",\n                                                                                                                                                                    \"signingName\": \"s3-outposts\",\n                                                                                                                                                                    \"signingRegion\": \"{bucketArn#region}\"\n                                                                                                                                                                }\n                                                                                                                                                            ]\n                                                                                                                                                        },\n                                                                                                                                                        \"headers\": {\n                                                                                                                                                            \"x-amz-account-id\": [\n                                                                                                                                                                \"{bucketArn#accountId}\"\n                                                                                                                                                            ],\n                                                                                                                                                            \"x-amz-outpost-id\": [\n                                                                                                                                                                \"{outpostId}\"\n                                                                                                                                                            ]\n                                                                                                                                                        }\n                                                                                                                                                    },\n                                                                                                                                                    \"type\": \"endpoint\"\n                                                                                                                                                },\n                                                                                                                                                {\n                                                                                                                                                    \"conditions\": [\n                                                                                                                                                        {\n                                                                                                                                                            \"fn\": \"isSet\",\n                                                                                                                                                            \"argv\": [\n                                                                                                                                                                {\n                                                                                                                                                                    \"ref\": \"Endpoint\"\n                                                                                                                                                                }\n                                                                                                                                                            ]\n                                                                                                                                                        },\n                                                                                                                                                        {\n                                                                                                                                                            \"fn\": \"parseURL\",\n                                                                                                                                                            \"argv\": [\n                                                                                                                                                                {\n                                                                                                                                                                    \"ref\": \"Endpoint\"\n                                                                                                                                                                }\n                                                                                                                                                            ],\n                                                                                                                                                            \"assign\": \"url\"\n                                                                                                                                                        }\n                                                                                                                                                    ],\n                                                                                                                                                    \"endpoint\": {\n                                                                                                                                                        \"url\": \"{url#scheme}://{url#authority}{url#path}\",\n                                                                                                                                                        \"properties\": {\n                                                                                                                                                            \"authSchemes\": [\n                                                                                                                                                                {\n                                                                                                                                                                    \"disableDoubleEncoding\": true,\n                                                                                                                                                                    \"name\": \"sigv4\",\n                                                                                                                                                                    \"signingName\": \"s3-outposts\",\n                                                                                                                                                                    \"signingRegion\": \"{bucketArn#region}\"\n                                                                                                                                                                }\n                                                                                                                                                            ]\n                                                                                                                                                        },\n                                                                                                                                                        \"headers\": {\n                                                                                                                                                            \"x-amz-account-id\": [\n                                                                                                                                                                \"{bucketArn#accountId}\"\n                                                                                                                                                            ],\n                                                                                                                                                            \"x-amz-outpost-id\": [\n                                                                                                                                                                \"{outpostId}\"\n                                                                                                                                                            ]\n                                                                                                                                                        }\n                                                                                                                                                    },\n                                                                                                                                                    \"type\": \"endpoint\"\n                                                                                                                                                },\n                                                                                                                                                {\n                                                                                                                                                    \"conditions\": [],\n                                                                                                                                                    \"endpoint\": {\n                                                                                                                                                        \"url\": \"https://s3-outposts.{bucketArn#region}.{arnPartition#dnsSuffix}\",\n                                                                                                                                                        \"properties\": {\n                                                                                                                                                            \"authSchemes\": [\n                                                                                                                                                                {\n                                                                                                                                                                    \"disableDoubleEncoding\": true,\n                                                                                                                                                                    \"name\": \"sigv4\",\n                                                                                                                                                                    \"signingName\": \"s3-outposts\",\n                                                                                                                                                                    \"signingRegion\": \"{bucketArn#region}\"\n                                                                                                                                                                }\n                                                                                                                                                            ]\n                                                                                                                                                        },\n                                                                                                                                                        \"headers\": {\n                                                                                                                                                            \"x-amz-account-id\": [\n                                                                                                                                                                \"{bucketArn#accountId}\"\n                                                                                                                                                            ],\n                                                                                                                                                            \"x-amz-outpost-id\": [\n                                                                                                                                                                \"{outpostId}\"\n                                                                                                                                                            ]\n                                                                                                                                                        }\n                                                                                                                                                    },\n                                                                                                                                                    \"type\": \"endpoint\"\n                                                                                                                                                }\n                                                                                                                                            ],\n                                                                                                                                            \"type\": \"tree\"\n                                                                                                                                        },\n                                                                                                                                        {\n                                                                                                                                            \"conditions\": [],\n                                                                                                                                            \"error\": \"Invalid ARN: Expected an outpost type `bucket`, found `{outpostType}`\",\n                                                                                                                                            \"type\": \"error\"\n                                                                                                                                        }\n                                                                                                                                    ],\n                                                                                                                                    \"type\": \"tree\"\n                                                                                                                                },\n                                                                                                                                {\n                                                                                                                                    \"conditions\": [],\n                                                                                                                                    \"error\": \"Invalid ARN: expected a bucket name\",\n                                                                                                                                    \"type\": \"error\"\n                                                                                                                                }\n                                                                                                                            ],\n                                                                                                                            \"type\": \"tree\"\n                                                                                                                        },\n                                                                                                                        {\n                                                                                                                            \"conditions\": [],\n                                                                                                                            \"error\": \"Invalid ARN: Expected a 4-component resource\",\n                                                                                                                            \"type\": \"error\"\n                                                                                                                        }\n                                                                                                                    ],\n                                                                                                                    \"type\": \"tree\"\n                                                                                                                },\n                                                                                                                {\n                                                                                                                    \"conditions\": [],\n                                                                                                                    \"error\": \"Invalid ARN: The account id may only contain a-z, A-Z, 0-9 and `-`. Found: `{bucketArn#accountId}`\",\n                                                                                                                    \"type\": \"error\"\n                                                                                                                }\n                                                                                                            ],\n                                                                                                            \"type\": \"tree\"\n                                                                                                        },\n                                                                                                        {\n                                                                                                            \"conditions\": [],\n                                                                                                            \"error\": \"Invalid ARN: missing account ID\",\n                                                                                                            \"type\": \"error\"\n                                                                                                        }\n                                                                                                    ],\n                                                                                                    \"type\": \"tree\"\n                                                                                                },\n                                                                                                {\n                                                                                                    \"conditions\": [],\n                                                                                                    \"error\": \"Invalid region in ARN: `{bucketArn#region}` (invalid DNS name)\",\n                                                                                                    \"type\": \"error\"\n                                                                                                }\n                                                                                            ],\n                                                                                            \"type\": \"tree\"\n                                                                                        },\n                                                                                        {\n                                                                                            \"conditions\": [],\n                                                                                            \"error\": \"Client was configured for partition `{partitionResult#name}` but ARN has `{arnPartition#name}`\",\n                                                                                            \"type\": \"error\"\n                                                                                        }\n                                                                                    ],\n                                                                                    \"type\": \"tree\"\n                                                                                }\n                                                                            ],\n                                                                            \"type\": \"tree\"\n                                                                        }\n                                                                    ],\n                                                                    \"type\": \"tree\"\n                                                                },\n                                                                {\n                                                                    \"conditions\": [],\n                                                                    \"error\": \"Invalid ARN: The outpost Id must only contain a-z, A-Z, 0-9 and `-`., found: `{outpostId}`\",\n                                                                    \"type\": \"error\"\n                                                                }\n                                                            ],\n                                                            \"type\": \"tree\"\n                                                        },\n                                                        {\n                                                            \"conditions\": [],\n                                                            \"error\": \"Invalid ARN: The Outpost Id was not set\",\n                                                            \"type\": \"error\"\n                                                        }\n                                                    ],\n                                                    \"type\": \"tree\"\n                                                }\n                                            ],\n                                            \"type\": \"tree\"\n                                        },\n                                        {\n                                            \"conditions\": [],\n                                            \"error\": \"Invalid ARN: No ARN type specified\",\n                                            \"type\": \"error\"\n                                        }\n                                    ],\n                                    \"type\": \"tree\"\n                                },\n                                {\n                                    \"conditions\": [\n                                        {\n                                            \"fn\": \"aws.partition\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"Region\"\n                                                }\n                                            ],\n                                            \"assign\": \"partitionResult\"\n                                        }\n                                    ],\n                                    \"rules\": [\n                                        {\n                                            \"conditions\": [\n                                                {\n                                                    \"fn\": \"isValidHostLabel\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"Region\"\n                                                        },\n                                                        true\n                                                    ]\n                                                }\n                                            ],\n                                            \"rules\": [\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"isSet\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"RequiresAccountId\"\n                                                                }\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"RequiresAccountId\"\n                                                                },\n                                                                true\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"not\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"fn\": \"isSet\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"AccountId\"\n                                                                        }\n                                                                    ]\n                                                                }\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"error\": \"AccountId is required but not set\",\n                                                    \"type\": \"error\"\n                                                },\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"isSet\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"AccountId\"\n                                                                }\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"not\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"fn\": \"isValidHostLabel\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"AccountId\"\n                                                                        },\n                                                                        false\n                                                                    ]\n                                                                }\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"error\": \"AccountId must only contain a-z, A-Z, 0-9 and `-`.\",\n                                                    \"type\": \"error\"\n                                                },\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"isSet\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"Endpoint\"\n                                                                }\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"parseURL\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"Endpoint\"\n                                                                }\n                                                            ],\n                                                            \"assign\": \"url\"\n                                                        }\n                                                    ],\n                                                    \"rules\": [\n                                                        {\n                                                            \"conditions\": [\n                                                                {\n                                                                    \"fn\": \"booleanEquals\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"UseDualStack\"\n                                                                        },\n                                                                        true\n                                                                    ]\n                                                                }\n                                                            ],\n                                                            \"error\": \"Invalid Configuration: DualStack and custom endpoint are not supported\",\n                                                            \"type\": \"error\"\n                                                        },\n                                                        {\n                                                            \"conditions\": [\n                                                                {\n                                                                    \"fn\": \"isSet\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"RequiresAccountId\"\n                                                                        }\n                                                                    ]\n                                                                },\n                                                                {\n                                                                    \"fn\": \"booleanEquals\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"RequiresAccountId\"\n                                                                        },\n                                                                        true\n                                                                    ]\n                                                                },\n                                                                {\n                                                                    \"fn\": \"isSet\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"AccountId\"\n                                                                        }\n                                                                    ]\n                                                                }\n                                                            ],\n                                                            \"endpoint\": {\n                                                                \"url\": \"{url#scheme}://{AccountId}.{url#authority}{url#path}\",\n                                                                \"properties\": {\n                                                                    \"authSchemes\": [\n                                                                        {\n                                                                            \"disableDoubleEncoding\": true,\n                                                                            \"name\": \"sigv4\",\n                                                                            \"signingName\": \"s3\",\n                                                                            \"signingRegion\": \"{Region}\"\n                                                                        }\n                                                                    ]\n                                                                },\n                                                                \"headers\": {}\n                                                            },\n                                                            \"type\": \"endpoint\"\n                                                        },\n                                                        {\n                                                            \"conditions\": [],\n                                                            \"endpoint\": {\n                                                                \"url\": \"{url#scheme}://{url#authority}{url#path}\",\n                                                                \"properties\": {\n                                                                    \"authSchemes\": [\n                                                                        {\n                                                                            \"disableDoubleEncoding\": true,\n                                                                            \"name\": \"sigv4\",\n                                                                            \"signingName\": \"s3\",\n                                                                            \"signingRegion\": \"{Region}\"\n                                                                        }\n                                                                    ]\n                                                                },\n                                                                \"headers\": {}\n                                                            },\n                                                            \"type\": \"endpoint\"\n                                                        }\n                                                    ],\n                                                    \"type\": \"tree\"\n                                                },\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"UseFIPS\"\n                                                                },\n                                                                true\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"UseDualStack\"\n                                                                },\n                                                                true\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"isSet\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"RequiresAccountId\"\n                                                                }\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"RequiresAccountId\"\n                                                                },\n                                                                true\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"isSet\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"AccountId\"\n                                                                }\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"endpoint\": {\n                                                        \"url\": \"https://{AccountId}.s3-control-fips.dualstack.{Region}.{partitionResult#dnsSuffix}\",\n                                                        \"properties\": {\n                                                            \"authSchemes\": [\n                                                                {\n                                                                    \"disableDoubleEncoding\": true,\n                                                                    \"name\": \"sigv4\",\n                                                                    \"signingName\": \"s3\",\n                                                                    \"signingRegion\": \"{Region}\"\n                                                                }\n                                                            ]\n                                                        },\n                                                        \"headers\": {}\n                                                    },\n                                                    \"type\": \"endpoint\"\n                                                },\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"UseFIPS\"\n                                                                },\n                                                                true\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"UseDualStack\"\n                                                                },\n                                                                true\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"endpoint\": {\n                                                        \"url\": \"https://s3-control-fips.dualstack.{Region}.{partitionResult#dnsSuffix}\",\n                                                        \"properties\": {\n                                                            \"authSchemes\": [\n                                                                {\n                                                                    \"disableDoubleEncoding\": true,\n                                                                    \"name\": \"sigv4\",\n                                                                    \"signingName\": \"s3\",\n                                                                    \"signingRegion\": \"{Region}\"\n                                                                }\n                                                            ]\n                                                        },\n                                                        \"headers\": {}\n                                                    },\n                                                    \"type\": \"endpoint\"\n                                                },\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"UseFIPS\"\n                                                                },\n                                                                true\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"UseDualStack\"\n                                                                },\n                                                                false\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"isSet\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"RequiresAccountId\"\n                                                                }\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"RequiresAccountId\"\n                                                                },\n                                                                true\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"isSet\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"AccountId\"\n                                                                }\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"endpoint\": {\n                                                        \"url\": \"https://{AccountId}.s3-control-fips.{Region}.{partitionResult#dnsSuffix}\",\n                                                        \"properties\": {\n                                                            \"authSchemes\": [\n                                                                {\n                                                                    \"disableDoubleEncoding\": true,\n                                                                    \"name\": \"sigv4\",\n                                                                    \"signingName\": \"s3\",\n                                                                    \"signingRegion\": \"{Region}\"\n                                                                }\n                                                            ]\n                                                        },\n                                                        \"headers\": {}\n                                                    },\n                                                    \"type\": \"endpoint\"\n                                                },\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"UseFIPS\"\n                                                                },\n                                                                true\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"UseDualStack\"\n                                                                },\n                                                                false\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"endpoint\": {\n                                                        \"url\": \"https://s3-control-fips.{Region}.{partitionResult#dnsSuffix}\",\n                                                        \"properties\": {\n                                                            \"authSchemes\": [\n                                                                {\n                                                                    \"disableDoubleEncoding\": true,\n                                                                    \"name\": \"sigv4\",\n                                                                    \"signingName\": \"s3\",\n                                                                    \"signingRegion\": \"{Region}\"\n                                                                }\n                                                            ]\n                                                        },\n                                                        \"headers\": {}\n                                                    },\n                                                    \"type\": \"endpoint\"\n                                                },\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"UseFIPS\"\n                                                                },\n                                                                false\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"UseDualStack\"\n                                                                },\n                                                                true\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"isSet\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"RequiresAccountId\"\n                                                                }\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"RequiresAccountId\"\n                                                                },\n                                                                true\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"isSet\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"AccountId\"\n                                                                }\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"endpoint\": {\n                                                        \"url\": \"https://{AccountId}.s3-control.dualstack.{Region}.{partitionResult#dnsSuffix}\",\n                                                        \"properties\": {\n                                                            \"authSchemes\": [\n                                                                {\n                                                                    \"disableDoubleEncoding\": true,\n                                                                    \"name\": \"sigv4\",\n                                                                    \"signingName\": \"s3\",\n                                                                    \"signingRegion\": \"{Region}\"\n                                                                }\n                                                            ]\n                                                        },\n                                                        \"headers\": {}\n                                                    },\n                                                    \"type\": \"endpoint\"\n                                                },\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"UseFIPS\"\n                                                                },\n                                                                false\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"UseDualStack\"\n                                                                },\n                                                                true\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"endpoint\": {\n                                                        \"url\": \"https://s3-control.dualstack.{Region}.{partitionResult#dnsSuffix}\",\n                                                        \"properties\": {\n                                                            \"authSchemes\": [\n                                                                {\n                                                                    \"disableDoubleEncoding\": true,\n                                                                    \"name\": \"sigv4\",\n                                                                    \"signingName\": \"s3\",\n                                                                    \"signingRegion\": \"{Region}\"\n                                                                }\n                                                            ]\n                                                        },\n                                                        \"headers\": {}\n                                                    },\n                                                    \"type\": \"endpoint\"\n                                                },\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"UseFIPS\"\n                                                                },\n                                                                false\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"UseDualStack\"\n                                                                },\n                                                                false\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"isSet\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"RequiresAccountId\"\n                                                                }\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"RequiresAccountId\"\n                                                                },\n                                                                true\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"isSet\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"AccountId\"\n                                                                }\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"endpoint\": {\n                                                        \"url\": \"https://{AccountId}.s3-control.{Region}.{partitionResult#dnsSuffix}\",\n                                                        \"properties\": {\n                                                            \"authSchemes\": [\n                                                                {\n                                                                    \"disableDoubleEncoding\": true,\n                                                                    \"name\": \"sigv4\",\n                                                                    \"signingName\": \"s3\",\n                                                                    \"signingRegion\": \"{Region}\"\n                                                                }\n                                                            ]\n                                                        },\n                                                        \"headers\": {}\n                                                    },\n                                                    \"type\": \"endpoint\"\n                                                },\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"UseFIPS\"\n                                                                },\n                                                                false\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"UseDualStack\"\n                                                                },\n                                                                false\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"endpoint\": {\n                                                        \"url\": \"https://s3-control.{Region}.{partitionResult#dnsSuffix}\",\n                                                        \"properties\": {\n                                                            \"authSchemes\": [\n                                                                {\n                                                                    \"disableDoubleEncoding\": true,\n                                                                    \"name\": \"sigv4\",\n                                                                    \"signingName\": \"s3\",\n                                                                    \"signingRegion\": \"{Region}\"\n                                                                }\n                                                            ]\n                                                        },\n                                                        \"headers\": {}\n                                                    },\n                                                    \"type\": \"endpoint\"\n                                                }\n                                            ],\n                                            \"type\": \"tree\"\n                                        },\n                                        {\n                                            \"conditions\": [],\n                                            \"error\": \"Invalid region: region was not a valid DNS name.\",\n                                            \"type\": \"error\"\n                                        }\n                                    ],\n                                    \"type\": \"tree\"\n                                }\n                            ],\n                            \"type\": \"tree\"\n                        },\n                        {\n                            \"conditions\": [],\n                            \"error\": \"Region must be set\",\n                            \"type\": \"error\"\n                        }\n                    ]\n                },\n                \"smithy.rules#endpointTests\": {\n                    \"testCases\": [\n                        {\n                            \"documentation\": \"Vanilla outposts without ARN region + access point ARN@us-west-2\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"headers\": {\n                                        \"x-amz-account-id\": [\n                                            \"123456789012\"\n                                        ],\n                                        \"x-amz-outpost-id\": [\n                                            \"op-01234567890123456\"\n                                        ]\n                                    },\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3-outposts\",\n                                                \"signingRegion\": \"us-west-2\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://s3-outposts.us-west-2.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-west-2\"\n                                    },\n                                    \"operationName\": \"GetAccessPoint\",\n                                    \"operationParams\": {\n                                        \"Name\": \"arn:aws:s3-outposts:us-west-2:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint\",\n                                        \"AccountId\": \"123456789012\"\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-west-2\"\n                                    },\n                                    \"operationName\": \"DeleteAccessPoint\",\n                                    \"operationParams\": {\n                                        \"Name\": \"arn:aws:s3-outposts:us-west-2:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint\",\n                                        \"AccountId\": \"123456789012\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"AccessPointName\": \"arn:aws:s3-outposts:us-west-2:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint\",\n                                \"AccountId\": \"123456789012\",\n                                \"Region\": \"us-west-2\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"Vanilla outposts with ARN region + access point ARN@us-west-2\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"headers\": {\n                                        \"x-amz-account-id\": [\n                                            \"123456789012\"\n                                        ],\n                                        \"x-amz-outpost-id\": [\n                                            \"op-01234567890123456\"\n                                        ]\n                                    },\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3-outposts\",\n                                                \"signingRegion\": \"us-east-1\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://s3-outposts.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-west-2\"\n                                    },\n                                    \"operationName\": \"GetAccessPoint\",\n                                    \"operationParams\": {\n                                        \"Name\": \"arn:aws:s3-outposts:us-east-1:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint\",\n                                        \"AccountId\": \"123456789012\"\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-west-2\"\n                                    },\n                                    \"operationName\": \"DeleteAccessPoint\",\n                                    \"operationParams\": {\n                                        \"Name\": \"arn:aws:s3-outposts:us-east-1:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint\",\n                                        \"AccountId\": \"123456789012\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"AccessPointName\": \"arn:aws:s3-outposts:us-east-1:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint\",\n                                \"AccountId\": \"123456789012\",\n                                \"Region\": \"us-west-2\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"accept an access point ARN@us-west-2\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"headers\": {\n                                        \"x-amz-account-id\": [\n                                            \"123456789012\"\n                                        ],\n                                        \"x-amz-outpost-id\": [\n                                            \"op-01234567890123456\"\n                                        ]\n                                    },\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3-outposts\",\n                                                \"signingRegion\": \"us-west-2\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://s3-outposts.us-west-2.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-west-2\"\n                                    },\n                                    \"operationName\": \"GetAccessPoint\",\n                                    \"operationParams\": {\n                                        \"Name\": \"arn:aws:s3-outposts:us-west-2:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint\",\n                                        \"AccountId\": \"123456789012\"\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-west-2\"\n                                    },\n                                    \"operationName\": \"DeleteAccessPoint\",\n                                    \"operationParams\": {\n                                        \"Name\": \"arn:aws:s3-outposts:us-west-2:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint\",\n                                        \"AccountId\": \"123456789012\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"AccessPointName\": \"arn:aws:s3-outposts:us-west-2:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint\",\n                                \"AccountId\": \"123456789012\",\n                                \"Region\": \"us-west-2\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"vanilla outposts china@cn-north-1\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"headers\": {\n                                        \"x-amz-account-id\": [\n                                            \"123456789012\"\n                                        ],\n                                        \"x-amz-outpost-id\": [\n                                            \"op-01234567890123456\"\n                                        ]\n                                    },\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3-outposts\",\n                                                \"signingRegion\": \"cn-north-1\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://s3-outposts.cn-north-1.amazonaws.com.cn\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"cn-north-1\"\n                                    },\n                                    \"operationName\": \"GetAccessPoint\",\n                                    \"operationParams\": {\n                                        \"Name\": \"arn:aws-cn:s3-outposts:cn-north-1:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint\",\n                                        \"AccountId\": \"123456789012\"\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"cn-north-1\"\n                                    },\n                                    \"operationName\": \"DeleteAccessPoint\",\n                                    \"operationParams\": {\n                                        \"Name\": \"arn:aws-cn:s3-outposts:cn-north-1:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint\",\n                                        \"AccountId\": \"123456789012\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"AccessPointName\": \"arn:aws-cn:s3-outposts:cn-north-1:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint\",\n                                \"AccountId\": \"123456789012\",\n                                \"Region\": \"cn-north-1\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"gov region@us-west-2\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"headers\": {\n                                        \"x-amz-account-id\": [\n                                            \"123456789012\"\n                                        ],\n                                        \"x-amz-outpost-id\": [\n                                            \"op-01234567890123456\"\n                                        ]\n                                    },\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3-outposts\",\n                                                \"signingRegion\": \"us-west-2\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://s3-outposts.us-west-2.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-west-2\"\n                                    },\n                                    \"operationName\": \"GetAccessPoint\",\n                                    \"operationParams\": {\n                                        \"Name\": \"arn:aws:s3-outposts:us-west-2:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint\",\n                                        \"AccountId\": \"123456789012\"\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-west-2\"\n                                    },\n                                    \"operationName\": \"DeleteAccessPoint\",\n                                    \"operationParams\": {\n                                        \"Name\": \"arn:aws:s3-outposts:us-west-2:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint\",\n                                        \"AccountId\": \"123456789012\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"AccessPointName\": \"arn:aws:s3-outposts:us-west-2:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint\",\n                                \"AccountId\": \"123456789012\",\n                                \"Region\": \"us-west-2\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"gov cloud with fips@us-west-2\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"headers\": {\n                                        \"x-amz-account-id\": [\n                                            \"123456789012\"\n                                        ],\n                                        \"x-amz-outpost-id\": [\n                                            \"op-01234567890123456\"\n                                        ]\n                                    },\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3-outposts\",\n                                                \"signingRegion\": \"us-west-2\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://s3-outposts-fips.us-west-2.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-west-2\",\n                                        \"AWS::UseFIPS\": true\n                                    },\n                                    \"operationName\": \"GetAccessPoint\",\n                                    \"operationParams\": {\n                                        \"Name\": \"arn:aws:s3-outposts:us-west-2:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint\",\n                                        \"AccountId\": \"123456789012\"\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-west-2\",\n                                        \"AWS::UseFIPS\": true\n                                    },\n                                    \"operationName\": \"DeleteAccessPoint\",\n                                    \"operationParams\": {\n                                        \"Name\": \"arn:aws:s3-outposts:us-west-2:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint\",\n                                        \"AccountId\": \"123456789012\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"AccessPointName\": \"arn:aws:s3-outposts:us-west-2:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint\",\n                                \"AccountId\": \"123456789012\",\n                                \"Region\": \"us-west-2\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"govcloud with fips + arn region@us-gov-west-1\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"headers\": {\n                                        \"x-amz-account-id\": [\n                                            \"123456789012\"\n                                        ],\n                                        \"x-amz-outpost-id\": [\n                                            \"op-01234567890123456\"\n                                        ]\n                                    },\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3-outposts\",\n                                                \"signingRegion\": \"us-gov-east-1\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://s3-outposts-fips.us-gov-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-gov-west-1\",\n                                        \"AWS::UseFIPS\": true\n                                    },\n                                    \"operationName\": \"GetAccessPoint\",\n                                    \"operationParams\": {\n                                        \"Name\": \"arn:aws-us-gov:s3-outposts:us-gov-east-1:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint\",\n                                        \"AccountId\": \"123456789012\"\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-gov-west-1\",\n                                        \"AWS::UseFIPS\": true\n                                    },\n                                    \"operationName\": \"DeleteAccessPoint\",\n                                    \"operationParams\": {\n                                        \"Name\": \"arn:aws-us-gov:s3-outposts:us-gov-east-1:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint\",\n                                        \"AccountId\": \"123456789012\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"AccessPointName\": \"arn:aws-us-gov:s3-outposts:us-gov-east-1:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint\",\n                                \"AccountId\": \"123456789012\",\n                                \"Region\": \"us-gov-west-1\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"gov region@cn-north-1\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"headers\": {\n                                        \"x-amz-account-id\": [\n                                            \"123456789012\"\n                                        ],\n                                        \"x-amz-outpost-id\": [\n                                            \"op-01234567890123456\"\n                                        ]\n                                    },\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3-outposts\",\n                                                \"signingRegion\": \"cn-north-1\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://s3-outposts.cn-north-1.amazonaws.com.cn\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"cn-north-1\"\n                                    },\n                                    \"operationName\": \"GetAccessPoint\",\n                                    \"operationParams\": {\n                                        \"Name\": \"arn:aws-cn:s3-outposts:cn-north-1:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint\",\n                                        \"AccountId\": \"123456789012\"\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"cn-north-1\"\n                                    },\n                                    \"operationName\": \"DeleteAccessPoint\",\n                                    \"operationParams\": {\n                                        \"Name\": \"arn:aws-cn:s3-outposts:cn-north-1:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint\",\n                                        \"AccountId\": \"123456789012\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"AccessPointName\": \"arn:aws-cn:s3-outposts:cn-north-1:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint\",\n                                \"AccountId\": \"123456789012\",\n                                \"Region\": \"cn-north-1\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"gov cloud with fips@cn-north-1\",\n                            \"expect\": {\n                                \"error\": \"Partition does not support FIPS\"\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"cn-north-1\",\n                                        \"AWS::UseFIPS\": true\n                                    },\n                                    \"operationName\": \"GetAccessPoint\",\n                                    \"operationParams\": {\n                                        \"Name\": \"arn:aws-cn:s3-outposts:cn-north-1:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint\",\n                                        \"AccountId\": \"123456789012\"\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"cn-north-1\",\n                                        \"AWS::UseFIPS\": true\n                                    },\n                                    \"operationName\": \"DeleteAccessPoint\",\n                                    \"operationParams\": {\n                                        \"Name\": \"arn:aws-cn:s3-outposts:cn-north-1:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint\",\n                                        \"AccountId\": \"123456789012\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"AccessPointName\": \"arn:aws-cn:s3-outposts:cn-north-1:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint\",\n                                \"AccountId\": \"123456789012\",\n                                \"Region\": \"cn-north-1\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"govcloud with fips + arn region@us-gov-west-1\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"headers\": {\n                                        \"x-amz-account-id\": [\n                                            \"123456789012\"\n                                        ],\n                                        \"x-amz-outpost-id\": [\n                                            \"op-01234567890123456\"\n                                        ]\n                                    },\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3-outposts\",\n                                                \"signingRegion\": \"us-gov-east-1\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://s3-outposts-fips.us-gov-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-gov-west-1\",\n                                        \"AWS::UseFIPS\": true\n                                    },\n                                    \"operationName\": \"GetAccessPoint\",\n                                    \"operationParams\": {\n                                        \"Name\": \"arn:aws-us-gov:s3-outposts:us-gov-east-1:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint\",\n                                        \"AccountId\": \"123456789012\"\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-gov-west-1\",\n                                        \"AWS::UseFIPS\": true\n                                    },\n                                    \"operationName\": \"DeleteAccessPoint\",\n                                    \"operationParams\": {\n                                        \"Name\": \"arn:aws-us-gov:s3-outposts:us-gov-east-1:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint\",\n                                        \"AccountId\": \"123456789012\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"AccessPointName\": \"arn:aws-us-gov:s3-outposts:us-gov-east-1:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint\",\n                                \"AccountId\": \"123456789012\",\n                                \"Region\": \"us-gov-west-1\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"gov region@af-south-1\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"headers\": {\n                                        \"x-amz-account-id\": [\n                                            \"123456789012\"\n                                        ],\n                                        \"x-amz-outpost-id\": [\n                                            \"op-01234567890123456\"\n                                        ]\n                                    },\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3-outposts\",\n                                                \"signingRegion\": \"af-south-1\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://s3-outposts.af-south-1.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"af-south-1\"\n                                    },\n                                    \"operationName\": \"GetAccessPoint\",\n                                    \"operationParams\": {\n                                        \"Name\": \"arn:aws:s3-outposts:af-south-1:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint\",\n                                        \"AccountId\": \"123456789012\"\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"af-south-1\"\n                                    },\n                                    \"operationName\": \"DeleteAccessPoint\",\n                                    \"operationParams\": {\n                                        \"Name\": \"arn:aws:s3-outposts:af-south-1:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint\",\n                                        \"AccountId\": \"123456789012\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"AccessPointName\": \"arn:aws:s3-outposts:af-south-1:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint\",\n                                \"AccountId\": \"123456789012\",\n                                \"Region\": \"af-south-1\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"gov cloud with fips@af-south-1\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"headers\": {\n                                        \"x-amz-account-id\": [\n                                            \"123456789012\"\n                                        ],\n                                        \"x-amz-outpost-id\": [\n                                            \"op-01234567890123456\"\n                                        ]\n                                    },\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3-outposts\",\n                                                \"signingRegion\": \"af-south-1\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://s3-outposts-fips.af-south-1.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"af-south-1\",\n                                        \"AWS::UseFIPS\": true\n                                    },\n                                    \"operationName\": \"GetAccessPoint\",\n                                    \"operationParams\": {\n                                        \"Name\": \"arn:aws:s3-outposts:af-south-1:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint\",\n                                        \"AccountId\": \"123456789012\"\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"af-south-1\",\n                                        \"AWS::UseFIPS\": true\n                                    },\n                                    \"operationName\": \"DeleteAccessPoint\",\n                                    \"operationParams\": {\n                                        \"Name\": \"arn:aws:s3-outposts:af-south-1:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint\",\n                                        \"AccountId\": \"123456789012\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"AccessPointName\": \"arn:aws:s3-outposts:af-south-1:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint\",\n                                \"AccountId\": \"123456789012\",\n                                \"Region\": \"af-south-1\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"govcloud with fips + arn region@us-gov-west-1\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"headers\": {\n                                        \"x-amz-account-id\": [\n                                            \"123456789012\"\n                                        ],\n                                        \"x-amz-outpost-id\": [\n                                            \"op-01234567890123456\"\n                                        ]\n                                    },\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3-outposts\",\n                                                \"signingRegion\": \"us-gov-east-1\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://s3-outposts-fips.us-gov-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-gov-west-1\",\n                                        \"AWS::UseFIPS\": true\n                                    },\n                                    \"operationName\": \"GetAccessPoint\",\n                                    \"operationParams\": {\n                                        \"Name\": \"arn:aws-us-gov:s3-outposts:us-gov-east-1:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint\",\n                                        \"AccountId\": \"123456789012\"\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-gov-west-1\",\n                                        \"AWS::UseFIPS\": true\n                                    },\n                                    \"operationName\": \"DeleteAccessPoint\",\n                                    \"operationParams\": {\n                                        \"Name\": \"arn:aws-us-gov:s3-outposts:us-gov-east-1:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint\",\n                                        \"AccountId\": \"123456789012\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"AccessPointName\": \"arn:aws-us-gov:s3-outposts:us-gov-east-1:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint\",\n                                \"AccountId\": \"123456789012\",\n                                \"Region\": \"us-gov-west-1\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"CreateBucket + OutpostId = outposts endpoint@us-east-2\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3-outposts\",\n                                                \"signingRegion\": \"us-east-2\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://s3-outposts.us-east-2.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-2\"\n                                    },\n                                    \"operationName\": \"CreateBucket\",\n                                    \"operationParams\": {\n                                        \"Bucket\": \"blah\",\n                                        \"OutpostId\": \"123\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"Bucket\": \"blah\",\n                                \"OutpostId\": \"123\",\n                                \"Region\": \"us-east-2\",\n                                \"RequiresAccountId\": false,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"CreateBucket + OutpostId with fips = outposts endpoint@us-east-2\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3-outposts\",\n                                                \"signingRegion\": \"us-east-2\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://s3-outposts-fips.us-east-2.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-2\",\n                                        \"AWS::UseFIPS\": true\n                                    },\n                                    \"operationName\": \"CreateBucket\",\n                                    \"operationParams\": {\n                                        \"Bucket\": \"blah\",\n                                        \"OutpostId\": \"123\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"Bucket\": \"blah\",\n                                \"OutpostId\": \"123\",\n                                \"Region\": \"us-east-2\",\n                                \"RequiresAccountId\": false,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"CreateBucket without OutpostId = regular endpoint@us-east-2\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3\",\n                                                \"signingRegion\": \"us-east-2\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://s3-control.us-east-2.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-2\"\n                                    },\n                                    \"operationName\": \"CreateBucket\",\n                                    \"operationParams\": {\n                                        \"Bucket\": \"blah\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"Bucket\": \"blah\",\n                                \"Region\": \"us-east-2\",\n                                \"RequiresAccountId\": false,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"ListRegionalBuckets + OutpostId = outposts endpoint@us-east-2\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3-outposts\",\n                                                \"signingRegion\": \"us-east-2\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://s3-outposts.us-east-2.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-2\"\n                                    },\n                                    \"operationName\": \"ListRegionalBuckets\",\n                                    \"operationParams\": {\n                                        \"AccountId\": \"123456789012\",\n                                        \"OutpostId\": \"op-123\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"AccountId\": \"123456789012\",\n                                \"OutpostId\": \"op-123\",\n                                \"Region\": \"us-east-2\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"ListRegionalBuckets without OutpostId = regular endpoint@us-east-2\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3\",\n                                                \"signingRegion\": \"us-east-2\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://123456789012.s3-control.us-east-2.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-2\"\n                                    },\n                                    \"operationName\": \"ListRegionalBuckets\",\n                                    \"operationParams\": {\n                                        \"AccountId\": \"123456789012\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"AccountId\": \"123456789012\",\n                                \"Region\": \"us-east-2\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"ListRegionalBucket + OutpostId with fips = outposts endpoint@us-east-2\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3-outposts\",\n                                                \"signingRegion\": \"us-east-2\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://s3-outposts-fips.us-east-2.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-2\",\n                                        \"AWS::UseFIPS\": true\n                                    },\n                                    \"operationName\": \"ListRegionalBuckets\",\n                                    \"operationParams\": {\n                                        \"AccountId\": \"123456789012\",\n                                        \"OutpostId\": \"op-123\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"AccountId\": \"123456789012\",\n                                \"OutpostId\": \"op-123\",\n                                \"Region\": \"us-east-2\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"outpost access points support dualstack@us-west-2\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"headers\": {\n                                        \"x-amz-account-id\": [\n                                            \"123456789012\"\n                                        ],\n                                        \"x-amz-outpost-id\": [\n                                            \"op-01234567890123456\"\n                                        ]\n                                    },\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3-outposts\",\n                                                \"signingRegion\": \"us-west-2\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://s3-outposts.us-west-2.api.aws\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-west-2\",\n                                        \"AWS::UseDualStack\": true\n                                    },\n                                    \"operationName\": \"GetAccessPoint\",\n                                    \"operationParams\": {\n                                        \"Name\": \"arn:aws:s3-outposts:us-west-2:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint\",\n                                        \"AccountId\": \"123456789012\"\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-west-2\",\n                                        \"AWS::UseDualStack\": true\n                                    },\n                                    \"operationName\": \"DeleteAccessPoint\",\n                                    \"operationParams\": {\n                                        \"Name\": \"arn:aws:s3-outposts:us-west-2:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint\",\n                                        \"AccountId\": \"123456789012\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"AccessPointName\": \"arn:aws:s3-outposts:us-west-2:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint\",\n                                \"AccountId\": \"123456789012\",\n                                \"Region\": \"us-west-2\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": true,\n                                \"UseFIPS\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"outpost access points support dualstack@af-south-1\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"headers\": {\n                                        \"x-amz-account-id\": [\n                                            \"123456789012\"\n                                        ],\n                                        \"x-amz-outpost-id\": [\n                                            \"op-01234567890123456\"\n                                        ]\n                                    },\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3-outposts\",\n                                                \"signingRegion\": \"af-south-1\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://s3-outposts.af-south-1.api.aws\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"af-south-1\",\n                                        \"AWS::UseDualStack\": true\n                                    },\n                                    \"operationName\": \"GetAccessPoint\",\n                                    \"operationParams\": {\n                                        \"Name\": \"arn:aws:s3-outposts:af-south-1:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint\",\n                                        \"AccountId\": \"123456789012\"\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"af-south-1\",\n                                        \"AWS::UseDualStack\": true\n                                    },\n                                    \"operationName\": \"DeleteAccessPoint\",\n                                    \"operationParams\": {\n                                        \"Name\": \"arn:aws:s3-outposts:af-south-1:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint\",\n                                        \"AccountId\": \"123456789012\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"AccessPointName\": \"arn:aws:s3-outposts:af-south-1:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint\",\n                                \"AccountId\": \"123456789012\",\n                                \"Region\": \"af-south-1\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": true,\n                                \"UseFIPS\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"outpost access points support fips + dualstack@af-south-1\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"headers\": {\n                                        \"x-amz-account-id\": [\n                                            \"123456789012\"\n                                        ],\n                                        \"x-amz-outpost-id\": [\n                                            \"op-01234567890123456\"\n                                        ]\n                                    },\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3-outposts\",\n                                                \"signingRegion\": \"af-south-1\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://s3-outposts-fips.af-south-1.api.aws\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"af-south-1\",\n                                        \"AWS::UseFIPS\": true,\n                                        \"AWS::UseDualStack\": true\n                                    },\n                                    \"operationName\": \"GetAccessPoint\",\n                                    \"operationParams\": {\n                                        \"Name\": \"arn:aws:s3-outposts:af-south-1:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint\",\n                                        \"AccountId\": \"123456789012\"\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"af-south-1\",\n                                        \"AWS::UseFIPS\": true,\n                                        \"AWS::UseDualStack\": true\n                                    },\n                                    \"operationName\": \"DeleteAccessPoint\",\n                                    \"operationParams\": {\n                                        \"Name\": \"arn:aws:s3-outposts:af-south-1:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint\",\n                                        \"AccountId\": \"123456789012\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"AccessPointName\": \"arn:aws:s3-outposts:af-south-1:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint\",\n                                \"AccountId\": \"123456789012\",\n                                \"Region\": \"af-south-1\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": true,\n                                \"UseFIPS\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"invalid ARN: must be include outpost ID@us-west-2\",\n                            \"expect\": {\n                                \"error\": \"Invalid ARN: The Outpost Id was not set\"\n                            },\n                            \"params\": {\n                                \"AccessPointName\": \"arn:aws:s3-outposts:us-west-2:123456789012:outpost\",\n                                \"AccountId\": \"123456789012\",\n                                \"Region\": \"us-west-2\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"invalid ARN: must specify access point@us-west-2\",\n                            \"expect\": {\n                                \"error\": \"Invalid ARN: Expected a 4-component resource\"\n                            },\n                            \"params\": {\n                                \"AccessPointName\": \"arn:aws:s3-outposts:us-west-2:123456789012:outpost:op-01234567890123456\",\n                                \"Region\": \"us-west-2\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"invalid ARN@us-west-2\",\n                            \"expect\": {\n                                \"error\": \"Invalid ARN: Expected a 4-component resource\"\n                            },\n                            \"params\": {\n                                \"AccessPointName\": \"arn:aws:s3-outposts:us-west-2:123456789012:outpost:myaccesspoint\",\n                                \"Region\": \"us-west-2\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"when set, AccountId drives AP construction@us-west-2\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3\",\n                                                \"signingRegion\": \"us-west-2\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://myid-1234.s3-control.us-west-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"AccessPointName\": \"myaccesspoint\",\n                                \"AccountId\": \"myid-1234\",\n                                \"Region\": \"us-west-2\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"Account ID set inline and in ARN but they both match@us-west-2\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"headers\": {\n                                        \"x-amz-account-id\": [\n                                            \"123456789012\"\n                                        ],\n                                        \"x-amz-outpost-id\": [\n                                            \"op-01234567890123456\"\n                                        ]\n                                    },\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3-outposts\",\n                                                \"signingRegion\": \"us-west-2\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://s3-outposts.us-west-2.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-west-2\",\n                                        \"AWS::S3Control::UseArnRegion\": false\n                                    },\n                                    \"operationName\": \"GetAccessPoint\",\n                                    \"operationParams\": {\n                                        \"AccountId\": \"123456789012\",\n                                        \"Name\": \"arn:aws:s3-outposts:us-west-2:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"AccessPointName\": \"arn:aws:s3-outposts:us-west-2:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint\",\n                                \"AccountId\": \"123456789012\",\n                                \"Region\": \"us-west-2\",\n                                \"RequiresAccountId\": true,\n                                \"UseArnRegion\": false,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"Account ID set inline and in ARN and they do not match@us-west-2\",\n                            \"expect\": {\n                                \"error\": \"Invalid ARN: the accountId specified in the ARN (`123456789012`) does not match the parameter (`999999999999`)\"\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-west-2\",\n                                        \"AWS::S3Control::UseArnRegion\": false\n                                    },\n                                    \"operationName\": \"GetAccessPoint\",\n                                    \"operationParams\": {\n                                        \"AccountId\": \"999999999999\",\n                                        \"Name\": \"arn:aws:s3-outposts:us-west-2:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"AccessPointName\": \"arn:aws:s3-outposts:us-west-2:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint\",\n                                \"AccountId\": \"999999999999\",\n                                \"Region\": \"us-west-2\",\n                                \"RequiresAccountId\": true,\n                                \"UseArnRegion\": false,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"get access point prefixed with account id using endpoint url@us-west-2\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3\",\n                                                \"signingRegion\": \"us-west-2\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://123456789012.control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-west-2\",\n                                        \"SDK::Endpoint\": \"https://control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com\"\n                                    },\n                                    \"operationName\": \"GetAccessPoint\",\n                                    \"operationParams\": {\n                                        \"AccountId\": \"123456789012\",\n                                        \"Name\": \"apname\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"AccessPointName\": \"apname\",\n                                \"AccountId\": \"123456789012\",\n                                \"Endpoint\": \"https://control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com\",\n                                \"Region\": \"us-west-2\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"endpoint url with s3-outposts@us-west-2\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"headers\": {\n                                        \"x-amz-account-id\": [\n                                            \"123456789012\"\n                                        ],\n                                        \"x-amz-outpost-id\": [\n                                            \"op-01234567890123456\"\n                                        ]\n                                    },\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3-outposts\",\n                                                \"signingRegion\": \"us-west-2\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://beta.example.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-west-2\",\n                                        \"SDK::Endpoint\": \"https://beta.example.com\"\n                                    },\n                                    \"operationName\": \"GetAccessPoint\",\n                                    \"operationParams\": {\n                                        \"Name\": \"arn:aws:s3-outposts:us-west-2:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint\",\n                                        \"AccountId\": \"123456789012\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"AccessPointName\": \"arn:aws:s3-outposts:us-west-2:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint\",\n                                \"AccountId\": \"123456789012\",\n                                \"Endpoint\": \"https://beta.example.com\",\n                                \"Region\": \"us-west-2\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"access point name with a bucket arn@us-west-2\",\n                            \"expect\": {\n                                \"error\": \"Expected an outpost type `accesspoint`, found `bucket`\"\n                            },\n                            \"params\": {\n                                \"AccessPointName\": \"arn:aws:s3-outposts:us-west-2:123456789012:outpost:op-01234567890123456:bucket:mybucket\",\n                                \"Endpoint\": \"beta.example.com\",\n                                \"Region\": \"us-west-2\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"bucket arn with access point name@us-west-2\",\n                            \"expect\": {\n                                \"error\": \"Invalid ARN: Expected an outpost type `bucket`, found `accesspoint`\"\n                            },\n                            \"params\": {\n                                \"Bucket\": \"arn:aws:s3-outposts:us-west-2:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint\",\n                                \"Endpoint\": \"beta.example.com\",\n                                \"Region\": \"us-west-2\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"create bucket with outposts@us-west-2\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3-outposts\",\n                                                \"signingRegion\": \"us-west-2\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://beta.example.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Bucket\": \"bucketname\",\n                                \"Endpoint\": \"https://beta.example.com\",\n                                \"OutpostId\": \"op-123\",\n                                \"Region\": \"us-west-2\",\n                                \"RequiresAccountId\": false,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"get bucket with endpoint_url@us-west-2\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"headers\": {\n                                        \"x-amz-account-id\": [\n                                            \"123456789012\"\n                                        ],\n                                        \"x-amz-outpost-id\": [\n                                            \"op-01234567890123456\"\n                                        ]\n                                    },\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3-outposts\",\n                                                \"signingRegion\": \"us-west-2\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://beta.example.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-west-2\",\n                                        \"SDK::Endpoint\": \"https://beta.example.com\"\n                                    },\n                                    \"operationName\": \"GetBucket\",\n                                    \"operationParams\": {\n                                        \"Bucket\": \"arn:aws:s3-outposts:us-west-2:123456789012:outpost:op-01234567890123456:bucket:mybucket\",\n                                        \"AccountId\": \"123456789012\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"Bucket\": \"arn:aws:s3-outposts:us-west-2:123456789012:outpost:op-01234567890123456:bucket:mybucket\",\n                                \"Endpoint\": \"https://beta.example.com\",\n                                \"Region\": \"us-west-2\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"ListRegionalBucket + OutpostId endpoint url@us-east-2\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3-outposts\",\n                                                \"signingRegion\": \"us-east-2\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://beta.example.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-2\",\n                                        \"SDK::Endpoint\": \"https://beta.example.com\"\n                                    },\n                                    \"operationName\": \"ListRegionalBuckets\",\n                                    \"operationParams\": {\n                                        \"AccountId\": \"123456789012\",\n                                        \"OutpostId\": \"op-123\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"AccountId\": \"123456789012\",\n                                \"Endpoint\": \"https://beta.example.com\",\n                                \"OutpostId\": \"op-123\",\n                                \"Region\": \"us-east-2\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"ListRegionalBucket + OutpostId + fips + endpoint url@us-east-2\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3-outposts\",\n                                                \"signingRegion\": \"us-east-2\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://beta.example.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-2\",\n                                        \"AWS::UseFIPS\": true,\n                                        \"SDK::Endpoint\": \"https://beta.example.com\"\n                                    },\n                                    \"operationName\": \"ListRegionalBuckets\",\n                                    \"operationParams\": {\n                                        \"AccountId\": \"123456789012\",\n                                        \"OutpostId\": \"op-123\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"AccountId\": \"123456789012\",\n                                \"Endpoint\": \"https://beta.example.com\",\n                                \"OutpostId\": \"op-123\",\n                                \"Region\": \"us-east-2\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"ListRegionalBucket + OutpostId + fips + dualstack@us-east-2\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3-outposts\",\n                                                \"signingRegion\": \"us-east-2\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://s3-outposts-fips.us-east-2.api.aws\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-2\",\n                                        \"AWS::UseFIPS\": true,\n                                        \"AWS::UseDualStack\": true\n                                    },\n                                    \"operationName\": \"ListRegionalBuckets\",\n                                    \"operationParams\": {\n                                        \"AccountId\": \"123456789012\",\n                                        \"OutpostId\": \"op-123\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"AccountId\": \"123456789012\",\n                                \"OutpostId\": \"op-123\",\n                                \"Region\": \"us-east-2\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": true,\n                                \"UseFIPS\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"CreateBucket + OutpostId endpoint url@us-east-2\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3-outposts\",\n                                                \"signingRegion\": \"us-east-2\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://beta.example.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-2\",\n                                        \"AWS::UseFIPS\": true,\n                                        \"SDK::Endpoint\": \"https://beta.example.com\"\n                                    },\n                                    \"operationName\": \"CreateBucket\",\n                                    \"operationParams\": {\n                                        \"Bucket\": \"blah\",\n                                        \"OutpostId\": \"123\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"Bucket\": \"blah\",\n                                \"Endpoint\": \"https://beta.example.com\",\n                                \"OutpostId\": \"123\",\n                                \"Region\": \"us-east-2\",\n                                \"RequiresAccountId\": false,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"dualstack cannot be used with outposts when an endpoint URL is set@us-west-2.\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: DualStack and custom endpoint are not supported\"\n                            },\n                            \"params\": {\n                                \"AccessPointName\": \"arn:aws:s3-outposts:us-west-2:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint\",\n                                \"Endpoint\": \"https://s3-outposts.us-west-2.api.aws\",\n                                \"Region\": \"us-west-2\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": true,\n                                \"UseFIPS\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"vanilla bucket arn requires account id@us-west-2\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"headers\": {\n                                        \"x-amz-account-id\": [\n                                            \"123456789012\"\n                                        ],\n                                        \"x-amz-outpost-id\": [\n                                            \"op-01234567890123456\"\n                                        ]\n                                    },\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3-outposts\",\n                                                \"signingRegion\": \"us-west-2\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://s3-outposts.us-west-2.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-west-2\"\n                                    },\n                                    \"operationName\": \"CreateAccessPoint\",\n                                    \"operationParams\": {\n                                        \"Bucket\": \"arn:aws:s3-outposts:us-west-2:123456789012:outpost:op-01234567890123456:bucket:mybucket\",\n                                        \"Name\": \"apname\",\n                                        \"AccountId\": \"123456789012\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"Bucket\": \"arn:aws:s3-outposts:us-west-2:123456789012:outpost:op-01234567890123456:bucket:mybucket\",\n                                \"Region\": \"us-west-2\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"bucket arn with UseArnRegion = true (arn region supercedes client configured region)@us-west-2\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"headers\": {\n                                        \"x-amz-account-id\": [\n                                            \"123456789012\"\n                                        ],\n                                        \"x-amz-outpost-id\": [\n                                            \"op-01234567890123456\"\n                                        ]\n                                    },\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3-outposts\",\n                                                \"signingRegion\": \"us-east-1\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://s3-outposts.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-west-2\"\n                                    },\n                                    \"operationName\": \"GetBucket\",\n                                    \"operationParams\": {\n                                        \"Bucket\": \"arn:aws:s3-outposts:us-east-1:123456789012:outpost:op-01234567890123456:bucket:mybucket\",\n                                        \"AccountId\": \"123456789012\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"Bucket\": \"arn:aws:s3-outposts:us-east-1:123456789012:outpost:op-01234567890123456:bucket:mybucket\",\n                                \"Region\": \"us-west-2\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"bucket ARN in gov partition (non-fips)@us-gov-east-1\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"headers\": {\n                                        \"x-amz-account-id\": [\n                                            \"123456789012\"\n                                        ],\n                                        \"x-amz-outpost-id\": [\n                                            \"op-01234567890123456\"\n                                        ]\n                                    },\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3-outposts\",\n                                                \"signingRegion\": \"us-gov-east-1\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://s3-outposts.us-gov-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-gov-east-1\"\n                                    },\n                                    \"operationName\": \"GetBucket\",\n                                    \"operationParams\": {\n                                        \"Bucket\": \"arn:aws-us-gov:s3-outposts:us-gov-east-1:123456789012:outpost:op-01234567890123456:bucket:mybucket\",\n                                        \"AccountId\": \"123456789012\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"Bucket\": \"arn:aws-us-gov:s3-outposts:us-gov-east-1:123456789012:outpost:op-01234567890123456:bucket:mybucket\",\n                                \"Region\": \"us-gov-east-1\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"bucket ARN in gov partition with FIPS@us-gov-west-1\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"headers\": {\n                                        \"x-amz-account-id\": [\n                                            \"123456789012\"\n                                        ],\n                                        \"x-amz-outpost-id\": [\n                                            \"op-01234567890123456\"\n                                        ]\n                                    },\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3-outposts\",\n                                                \"signingRegion\": \"us-gov-west-1\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://s3-outposts-fips.us-gov-west-1.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-gov-west-1\",\n                                        \"AWS::UseFIPS\": true\n                                    },\n                                    \"operationName\": \"GetBucket\",\n                                    \"operationParams\": {\n                                        \"Bucket\": \"arn:aws-us-gov:s3-outposts:us-gov-west-1:123456789012:outpost:op-01234567890123456:bucket:mybucket\",\n                                        \"AccountId\": \"123456789012\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"Bucket\": \"arn:aws-us-gov:s3-outposts:us-gov-west-1:123456789012:outpost:op-01234567890123456:bucket:mybucket\",\n                                \"Region\": \"us-gov-west-1\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"bucket ARN in aws partition with FIPS@us-east-2\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"headers\": {\n                                        \"x-amz-account-id\": [\n                                            \"123456789012\"\n                                        ],\n                                        \"x-amz-outpost-id\": [\n                                            \"op-01234567890123456\"\n                                        ]\n                                    },\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3-outposts\",\n                                                \"signingRegion\": \"us-east-2\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://s3-outposts-fips.us-east-2.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-2\",\n                                        \"AWS::UseFIPS\": true\n                                    },\n                                    \"operationName\": \"GetBucket\",\n                                    \"operationParams\": {\n                                        \"Bucket\": \"arn:aws:s3-outposts:us-east-2:123456789012:outpost:op-01234567890123456:bucket:mybucket\",\n                                        \"AccountId\": \"123456789012\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"Bucket\": \"arn:aws:s3-outposts:us-east-2:123456789012:outpost:op-01234567890123456:bucket:mybucket\",\n                                \"Region\": \"us-east-2\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"bucket ARN in aws partition with fips + dualstack@us-east-2\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"headers\": {\n                                        \"x-amz-account-id\": [\n                                            \"123456789012\"\n                                        ],\n                                        \"x-amz-outpost-id\": [\n                                            \"op-01234567890123456\"\n                                        ]\n                                    },\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3-outposts\",\n                                                \"signingRegion\": \"us-east-2\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://s3-outposts-fips.us-east-2.api.aws\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-2\",\n                                        \"AWS::UseFIPS\": true,\n                                        \"AWS::UseDualStack\": true\n                                    },\n                                    \"operationName\": \"GetBucket\",\n                                    \"operationParams\": {\n                                        \"Bucket\": \"arn:aws:s3-outposts:us-east-2:123456789012:outpost:op-01234567890123456:bucket:mybucket\",\n                                        \"AccountId\": \"123456789012\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"Bucket\": \"arn:aws:s3-outposts:us-east-2:123456789012:outpost:op-01234567890123456:bucket:mybucket\",\n                                \"Region\": \"us-east-2\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": true,\n                                \"UseFIPS\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"vanilla bucket arn requires account id@cn-north-1\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"headers\": {\n                                        \"x-amz-account-id\": [\n                                            \"123456789012\"\n                                        ],\n                                        \"x-amz-outpost-id\": [\n                                            \"op-01234567890123456\"\n                                        ]\n                                    },\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3-outposts\",\n                                                \"signingRegion\": \"cn-north-1\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://s3-outposts.cn-north-1.amazonaws.com.cn\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"cn-north-1\"\n                                    },\n                                    \"operationName\": \"CreateAccessPoint\",\n                                    \"operationParams\": {\n                                        \"Bucket\": \"arn:aws-cn:s3-outposts:cn-north-1:123456789012:outpost:op-01234567890123456:bucket:mybucket\",\n                                        \"Name\": \"apname\",\n                                        \"AccountId\": \"123456789012\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"Bucket\": \"arn:aws-cn:s3-outposts:cn-north-1:123456789012:outpost:op-01234567890123456:bucket:mybucket\",\n                                \"Region\": \"cn-north-1\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"bucket arn with UseArnRegion = true (arn region supercedes client configured region)@us-west-2\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"headers\": {\n                                        \"x-amz-account-id\": [\n                                            \"123456789012\"\n                                        ],\n                                        \"x-amz-outpost-id\": [\n                                            \"op-01234567890123456\"\n                                        ]\n                                    },\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3-outposts\",\n                                                \"signingRegion\": \"us-east-1\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://s3-outposts.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-west-2\"\n                                    },\n                                    \"operationName\": \"GetBucket\",\n                                    \"operationParams\": {\n                                        \"Bucket\": \"arn:aws:s3-outposts:us-east-1:123456789012:outpost:op-01234567890123456:bucket:mybucket\",\n                                        \"AccountId\": \"123456789012\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"Bucket\": \"arn:aws:s3-outposts:us-east-1:123456789012:outpost:op-01234567890123456:bucket:mybucket\",\n                                \"Region\": \"us-west-2\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"bucket ARN in gov partition (non-fips)@us-gov-east-1\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"headers\": {\n                                        \"x-amz-account-id\": [\n                                            \"123456789012\"\n                                        ],\n                                        \"x-amz-outpost-id\": [\n                                            \"op-01234567890123456\"\n                                        ]\n                                    },\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3-outposts\",\n                                                \"signingRegion\": \"us-gov-east-1\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://s3-outposts.us-gov-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-gov-east-1\"\n                                    },\n                                    \"operationName\": \"GetBucket\",\n                                    \"operationParams\": {\n                                        \"Bucket\": \"arn:aws-us-gov:s3-outposts:us-gov-east-1:123456789012:outpost:op-01234567890123456:bucket:mybucket\",\n                                        \"AccountId\": \"123456789012\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"Bucket\": \"arn:aws-us-gov:s3-outposts:us-gov-east-1:123456789012:outpost:op-01234567890123456:bucket:mybucket\",\n                                \"Region\": \"us-gov-east-1\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"bucket ARN in gov partition with FIPS@us-gov-west-1\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"headers\": {\n                                        \"x-amz-account-id\": [\n                                            \"123456789012\"\n                                        ],\n                                        \"x-amz-outpost-id\": [\n                                            \"op-01234567890123456\"\n                                        ]\n                                    },\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3-outposts\",\n                                                \"signingRegion\": \"us-gov-west-1\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://s3-outposts-fips.us-gov-west-1.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-gov-west-1\",\n                                        \"AWS::UseFIPS\": true\n                                    },\n                                    \"operationName\": \"GetBucket\",\n                                    \"operationParams\": {\n                                        \"Bucket\": \"arn:aws-us-gov:s3-outposts:us-gov-west-1:123456789012:outpost:op-01234567890123456:bucket:mybucket\",\n                                        \"AccountId\": \"123456789012\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"Bucket\": \"arn:aws-us-gov:s3-outposts:us-gov-west-1:123456789012:outpost:op-01234567890123456:bucket:mybucket\",\n                                \"Region\": \"us-gov-west-1\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"bucket ARN in aws partition with FIPS@us-east-2\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"headers\": {\n                                        \"x-amz-account-id\": [\n                                            \"123456789012\"\n                                        ],\n                                        \"x-amz-outpost-id\": [\n                                            \"op-01234567890123456\"\n                                        ]\n                                    },\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3-outposts\",\n                                                \"signingRegion\": \"us-east-2\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://s3-outposts-fips.us-east-2.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-2\",\n                                        \"AWS::UseFIPS\": true\n                                    },\n                                    \"operationName\": \"GetBucket\",\n                                    \"operationParams\": {\n                                        \"Bucket\": \"arn:aws:s3-outposts:us-east-2:123456789012:outpost:op-01234567890123456:bucket:mybucket\",\n                                        \"AccountId\": \"123456789012\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"Bucket\": \"arn:aws:s3-outposts:us-east-2:123456789012:outpost:op-01234567890123456:bucket:mybucket\",\n                                \"Region\": \"us-east-2\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"Outposts support dualstack @us-west-2\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"headers\": {\n                                        \"x-amz-account-id\": [\n                                            \"123456789012\"\n                                        ],\n                                        \"x-amz-outpost-id\": [\n                                            \"op-01234567890123456\"\n                                        ]\n                                    },\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3-outposts\",\n                                                \"signingRegion\": \"us-west-2\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://s3-outposts.us-west-2.api.aws\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-west-2\",\n                                        \"AWS::UseDualStack\": true\n                                    },\n                                    \"operationName\": \"GetBucket\",\n                                    \"operationParams\": {\n                                        \"Bucket\": \"arn:aws:s3-outposts:us-west-2:123456789012:outpost:op-01234567890123456:bucket:mybucket\",\n                                        \"AccountId\": \"123456789012\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"Bucket\": \"arn:aws:s3-outposts:us-west-2:123456789012:outpost:op-01234567890123456:bucket:mybucket\",\n                                \"Region\": \"us-west-2\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": true,\n                                \"UseFIPS\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"vanilla bucket arn requires account id@af-south-1\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"headers\": {\n                                        \"x-amz-account-id\": [\n                                            \"123456789012\"\n                                        ],\n                                        \"x-amz-outpost-id\": [\n                                            \"op-01234567890123456\"\n                                        ]\n                                    },\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3-outposts\",\n                                                \"signingRegion\": \"af-south-1\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://s3-outposts.af-south-1.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"af-south-1\"\n                                    },\n                                    \"operationName\": \"CreateAccessPoint\",\n                                    \"operationParams\": {\n                                        \"Bucket\": \"arn:aws:s3-outposts:af-south-1:123456789012:outpost:op-01234567890123456:bucket:mybucket\",\n                                        \"Name\": \"apname\",\n                                        \"AccountId\": \"123456789012\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"Bucket\": \"arn:aws:s3-outposts:af-south-1:123456789012:outpost:op-01234567890123456:bucket:mybucket\",\n                                \"Region\": \"af-south-1\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"bucket arn with UseArnRegion = true (arn region supercedes client configured region)@us-west-2\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"headers\": {\n                                        \"x-amz-account-id\": [\n                                            \"123456789012\"\n                                        ],\n                                        \"x-amz-outpost-id\": [\n                                            \"op-01234567890123456\"\n                                        ]\n                                    },\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3-outposts\",\n                                                \"signingRegion\": \"us-east-1\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://s3-outposts.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-west-2\"\n                                    },\n                                    \"operationName\": \"GetBucket\",\n                                    \"operationParams\": {\n                                        \"Bucket\": \"arn:aws:s3-outposts:us-east-1:123456789012:outpost:op-01234567890123456:bucket:mybucket\",\n                                        \"AccountId\": \"123456789012\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"Bucket\": \"arn:aws:s3-outposts:us-east-1:123456789012:outpost:op-01234567890123456:bucket:mybucket\",\n                                \"Region\": \"us-west-2\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"bucket ARN in gov partition (non-fips)@us-gov-east-1\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"headers\": {\n                                        \"x-amz-account-id\": [\n                                            \"123456789012\"\n                                        ],\n                                        \"x-amz-outpost-id\": [\n                                            \"op-01234567890123456\"\n                                        ]\n                                    },\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3-outposts\",\n                                                \"signingRegion\": \"us-gov-east-1\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://s3-outposts.us-gov-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-gov-east-1\"\n                                    },\n                                    \"operationName\": \"GetBucket\",\n                                    \"operationParams\": {\n                                        \"Bucket\": \"arn:aws-us-gov:s3-outposts:us-gov-east-1:123456789012:outpost:op-01234567890123456:bucket:mybucket\",\n                                        \"AccountId\": \"123456789012\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"Bucket\": \"arn:aws-us-gov:s3-outposts:us-gov-east-1:123456789012:outpost:op-01234567890123456:bucket:mybucket\",\n                                \"Region\": \"us-gov-east-1\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"bucket ARN in gov partition with FIPS@us-gov-west-1\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"headers\": {\n                                        \"x-amz-account-id\": [\n                                            \"123456789012\"\n                                        ],\n                                        \"x-amz-outpost-id\": [\n                                            \"op-01234567890123456\"\n                                        ]\n                                    },\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3-outposts\",\n                                                \"signingRegion\": \"us-gov-west-1\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://s3-outposts-fips.us-gov-west-1.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-gov-west-1\",\n                                        \"AWS::UseFIPS\": true\n                                    },\n                                    \"operationName\": \"GetBucket\",\n                                    \"operationParams\": {\n                                        \"Bucket\": \"arn:aws-us-gov:s3-outposts:us-gov-west-1:123456789012:outpost:op-01234567890123456:bucket:mybucket\",\n                                        \"AccountId\": \"123456789012\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"Bucket\": \"arn:aws-us-gov:s3-outposts:us-gov-west-1:123456789012:outpost:op-01234567890123456:bucket:mybucket\",\n                                \"Region\": \"us-gov-west-1\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"bucket ARN in aws partition with FIPS@us-east-2\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"headers\": {\n                                        \"x-amz-account-id\": [\n                                            \"123456789012\"\n                                        ],\n                                        \"x-amz-outpost-id\": [\n                                            \"op-01234567890123456\"\n                                        ]\n                                    },\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3-outposts\",\n                                                \"signingRegion\": \"us-east-2\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://s3-outposts-fips.us-east-2.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-2\",\n                                        \"AWS::UseFIPS\": true\n                                    },\n                                    \"operationName\": \"GetBucket\",\n                                    \"operationParams\": {\n                                        \"Bucket\": \"arn:aws:s3-outposts:us-east-2:123456789012:outpost:op-01234567890123456:bucket:mybucket\",\n                                        \"AccountId\": \"123456789012\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"Bucket\": \"arn:aws:s3-outposts:us-east-2:123456789012:outpost:op-01234567890123456:bucket:mybucket\",\n                                \"Region\": \"us-east-2\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"Invalid ARN: missing outpost id and bucket@us-west-2\",\n                            \"expect\": {\n                                \"error\": \"Invalid ARN: The Outpost Id was not set\"\n                            },\n                            \"params\": {\n                                \"Bucket\": \"arn:aws:s3-outposts:us-west-2:123456789012:outpost\",\n                                \"Region\": \"us-west-2\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"Invalid ARN: missing bucket@us-west-2\",\n                            \"expect\": {\n                                \"error\": \"Invalid ARN: Expected a 4-component resource\"\n                            },\n                            \"params\": {\n                                \"Bucket\": \"arn:aws:s3-outposts:us-west-2:123456789012:outpost:op-01234567890123456\",\n                                \"Region\": \"us-west-2\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"Invalid ARN: missing outpost and bucket ids@us-west-2\",\n                            \"expect\": {\n                                \"error\": \"Invalid ARN: Expected a 4-component resource\"\n                            },\n                            \"params\": {\n                                \"Bucket\": \"arn:aws:s3-outposts:us-west-2:123456789012:outpost:bucket\",\n                                \"Region\": \"us-west-2\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"Invalid ARN: missing bucket id@us-west-2\",\n                            \"expect\": {\n                                \"error\": \"Invalid ARN: expected a bucket name\"\n                            },\n                            \"params\": {\n                                \"Bucket\": \"arn:aws:s3-outposts:us-west-2:123456789012:outpost:op-01234567890123456:bucket\",\n                                \"Region\": \"us-west-2\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"account id inserted into hostname@us-west-2\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3\",\n                                                \"signingRegion\": \"us-west-2\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://1234567890.s3-control.us-west-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"AccountId\": \"1234567890\",\n                                \"Region\": \"us-west-2\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"account id prefix with dualstack@us-east-1\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3\",\n                                                \"signingRegion\": \"us-east-1\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://1234567890.s3-control.dualstack.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"AccountId\": \"1234567890\",\n                                \"Region\": \"us-east-1\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": true,\n                                \"UseFIPS\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"account id prefix with fips@us-east-1\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3\",\n                                                \"signingRegion\": \"us-east-1\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://1234567890.s3-control-fips.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"AccountId\": \"1234567890\",\n                                \"Region\": \"us-east-1\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"custom account id prefix with fips@us-east-1\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3\",\n                                                \"signingRegion\": \"us-east-1\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://123456789012.s3-control-fips.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"AccountId\": \"123456789012\",\n                                \"Region\": \"us-east-1\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"standard url @ us-east-1\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3\",\n                                                \"signingRegion\": \"us-east-1\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://s3-control.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"fips url @ us-east-1\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3\",\n                                                \"signingRegion\": \"us-east-1\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://s3-control-fips.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"dualstack url @ us-east-1\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3\",\n                                                \"signingRegion\": \"us-east-1\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://s3-control.dualstack.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"fips,dualstack url @ us-east-1\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3\",\n                                                \"signingRegion\": \"us-east-1\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://s3-control-fips.dualstack.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseDualStack\": true,\n                                \"UseFIPS\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"standard url @ cn-north-1\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3\",\n                                                \"signingRegion\": \"cn-north-1\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://s3-control.cn-north-1.amazonaws.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-north-1\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"fips @ cn-north-1\",\n                            \"expect\": {\n                                \"error\": \"Partition does not support FIPS\"\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-north-1\",\n                                \"UseDualStack\": true,\n                                \"UseFIPS\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"custom account id prefix @us-east-1\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3\",\n                                                \"signingRegion\": \"us-east-1\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://123456789012.s3-control.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\"\n                                    },\n                                    \"operationName\": \"ListRegionalBuckets\",\n                                    \"operationParams\": {\n                                        \"AccountId\": \"123456789012\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"AccountId\": \"123456789012\",\n                                \"Region\": \"us-east-1\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"invalid account id prefix @us-east-1\",\n                            \"expect\": {\n                                \"error\": \"AccountId must only contain a-z, A-Z, 0-9 and `-`.\"\n                            },\n                            \"params\": {\n                                \"AccountId\": \"/?invalid&not-host*label\",\n                                \"Region\": \"us-east-1\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"custom account id prefix with fips@us-east-1\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3\",\n                                                \"signingRegion\": \"us-east-1\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://123456789012.s3-control-fips.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": true\n                                    },\n                                    \"operationName\": \"ListRegionalBuckets\",\n                                    \"operationParams\": {\n                                        \"AccountId\": \"123456789012\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"AccountId\": \"123456789012\",\n                                \"Region\": \"us-east-1\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"custom account id prefix with dualstack,fips@us-east-1\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3\",\n                                                \"signingRegion\": \"us-east-1\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://123456789012.s3-control-fips.dualstack.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": true,\n                                        \"AWS::UseDualStack\": true\n                                    },\n                                    \"operationName\": \"ListRegionalBuckets\",\n                                    \"operationParams\": {\n                                        \"AccountId\": \"123456789012\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"AccountId\": \"123456789012\",\n                                \"Region\": \"us-east-1\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": true,\n                                \"UseFIPS\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"custom account id with custom endpoint\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3\",\n                                                \"signingRegion\": \"us-east-1\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://123456789012.example.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"SDK::Endpoint\": \"https://example.com\"\n                                    },\n                                    \"operationName\": \"ListRegionalBuckets\",\n                                    \"operationParams\": {\n                                        \"AccountId\": \"123456789012\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"AccountId\": \"123456789012\",\n                                \"Region\": \"us-east-1\",\n                                \"RequiresAccountId\": true,\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"RequiresAccountId with AccountId unset\",\n                            \"expect\": {\n                                \"error\": \"AccountId is required but not set\"\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"RequiresAccountId\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"RequiresAccountId with AccountId unset and custom endpoint\",\n                            \"expect\": {\n                                \"error\": \"AccountId is required but not set\"\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"Endpoint\": \"https://beta.example.com\",\n                                \"RequiresAccountId\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"RequiresAccountId with invalid AccountId and custom endpoint\",\n                            \"expect\": {\n                                \"error\": \"AccountId must only contain a-z, A-Z, 0-9 and `-`.\"\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"Endpoint\": \"https://beta.example.com\",\n                                \"AccountId\": \"/?invalid&not-host*label\",\n                                \"RequiresAccountId\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"account id with custom endpoint, fips\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3\",\n                                                \"signingRegion\": \"us-east-1\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://123456789012.example.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": true,\n                                        \"SDK::Endpoint\": \"https://example.com\"\n                                    },\n                                    \"operationName\": \"ListRegionalBuckets\",\n                                    \"operationParams\": {\n                                        \"AccountId\": \"123456789012\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"AccountId\": \"123456789012\",\n                                \"Region\": \"us-east-1\",\n                                \"RequiresAccountId\": true,\n                                \"Endpoint\": \"https://example.com\",\n                                \"UseFIPS\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"custom endpoint, fips\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3\",\n                                                \"signingRegion\": \"us-east-1\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://example.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"Endpoint\": \"https://example.com\",\n                                \"UseFIPS\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"custom endpoint, fips\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3\",\n                                                \"signingRegion\": \"us-east-1\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://example.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"Endpoint\": \"https://example.com\",\n                                \"UseFIPS\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"custom endpoint, DualStack\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: DualStack and custom endpoint are not supported\"\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"Endpoint\": \"https://example.com\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"region not set\",\n                            \"expect\": {\n                                \"error\": \"Region must be set\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"invalid partition\",\n                            \"expect\": {\n                                \"error\": \"Invalid region: region was not a valid DNS name.\"\n                            },\n                            \"params\": {\n                                \"Region\": \"invalid-region 42\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"ListRegionalBuckets + OutpostId without accountId set.\",\n                            \"expect\": {\n                                \"error\": \"AccountId is required but not set\"\n                            },\n                            \"params\": {\n                                \"OutpostId\": \"op-123\",\n                                \"Region\": \"us-east-2\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"ListRegionalBuckets + OutpostId with invalid accountId set.\",\n                            \"expect\": {\n                                \"error\": \"AccountId must only contain a-z, A-Z, 0-9 and `-`.\"\n                            },\n                            \"params\": {\n                                \"AccountId\": \"/?invalid&not-host*label\",\n                                \"OutpostId\": \"op-123\",\n                                \"Region\": \"us-east-2\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"accesspoint set but missing accountId\",\n                            \"expect\": {\n                                \"error\": \"AccountId is required but not set\"\n                            },\n                            \"params\": {\n                                \"AccessPointName\": \"myaccesspoint\",\n                                \"Region\": \"us-west-2\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"outpost accesspoint ARN with missing accountId\",\n                            \"expect\": {\n                                \"error\": \"Invalid ARN: missing account ID\"\n                            },\n                            \"params\": {\n                                \"AccessPointName\": \"arn:aws:s3-outposts:us-west-2::outpost:op-01234567890123456:outpost:op1\",\n                                \"Region\": \"us-west-2\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"bucket ARN with missing accountId\",\n                            \"expect\": {\n                                \"error\": \"Invalid ARN: missing account ID\"\n                            },\n                            \"params\": {\n                                \"AccessPointName\": \"arn:aws:s3-outposts:us-west-2::outpost:op-01234567890123456:bucket:mybucket\",\n                                \"Region\": \"us-west-2\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"endpoint url with accesspoint (non-arn)\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3\",\n                                                \"signingRegion\": \"us-west-2\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://123456789012.beta.example.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-west-2\",\n                                        \"SDK::Endpoint\": \"https://beta.example.com\"\n                                    },\n                                    \"operationName\": \"GetAccessPoint\",\n                                    \"operationParams\": {\n                                        \"Name\": \"apname\",\n                                        \"AccountId\": \"123456789012\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"AccessPointName\": \"apname\",\n                                \"Endpoint\": \"https://beta.example.com\",\n                                \"AccountId\": \"123456789012\",\n                                \"Region\": \"us-west-2\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"access point name with an accesspoint arn@us-west-2\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"headers\": {\n                                        \"x-amz-account-id\": [\n                                            \"123456789012\"\n                                        ],\n                                        \"x-amz-outpost-id\": [\n                                            \"op-01234567890123456\"\n                                        ]\n                                    },\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3-outposts\",\n                                                \"signingRegion\": \"us-west-2\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://beta.example.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"AccessPointName\": \"arn:aws:s3-outposts:us-west-2:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint\",\n                                \"Endpoint\": \"https://beta.example.com\",\n                                \"Region\": \"us-west-2\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"DualStack + Custom endpoint is not supported(non-arn)\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: DualStack and custom endpoint are not supported\"\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-west-2\",\n                                        \"AWS::UseDualStack\": true,\n                                        \"SDK::Endpoint\": \"https://beta.example.com\"\n                                    },\n                                    \"operationName\": \"GetAccessPoint\",\n                                    \"operationParams\": {\n                                        \"Name\": \"apname\",\n                                        \"AccountId\": \"123456789012\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"AccessPointName\": \"apname\",\n                                \"Endpoint\": \"https://beta.example.com\",\n                                \"AccountId\": \"123456789012\",\n                                \"Region\": \"us-west-2\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": true,\n                                \"UseFIPS\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"get bucket with custom endpoint and dualstack is not supported@us-west-2\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: DualStack and custom endpoint are not supported\"\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-west-2\",\n                                        \"AWS::UseDualStack\": true,\n                                        \"SDK::Endpoint\": \"https://s3-outposts.us-west-2.api.aws\"\n                                    },\n                                    \"operationName\": \"GetBucket\",\n                                    \"operationParams\": {\n                                        \"Bucket\": \"arn:aws:s3-outposts:us-west-2:123456789012:outpost:op-01234567890123456:bucket:mybucket\",\n                                        \"AccountId\": \"123456789012\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"Bucket\": \"arn:aws:s3-outposts:us-west-2:123456789012:outpost:op-01234567890123456:bucket:mybucket\",\n                                \"Endpoint\": \"https://s3-outposts.us-west-2.api.aws\",\n                                \"Region\": \"us-west-2\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": true,\n                                \"UseFIPS\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"ListRegionalBuckets + OutpostId with fips in CN.\",\n                            \"expect\": {\n                                \"error\": \"Partition does not support FIPS\"\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"cn-north-1\",\n                                        \"AWS::UseFIPS\": true\n                                    },\n                                    \"operationName\": \"ListRegionalBuckets\",\n                                    \"operationParams\": {\n                                        \"OutpostId\": \"op-123\",\n                                        \"AccountId\": \"012345678912\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"AccountId\": \"012345678912\",\n                                \"OutpostId\": \"op-123\",\n                                \"Region\": \"cn-north-1\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"ListRegionalBuckets + invalid OutpostId.\",\n                            \"expect\": {\n                                \"error\": \"OutpostId must only contain a-z, A-Z, 0-9 and `-`.\"\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-west-1\"\n                                    },\n                                    \"operationName\": \"ListRegionalBuckets\",\n                                    \"operationParams\": {\n                                        \"OutpostId\": \"?outpost/invalid+\",\n                                        \"AccountId\": \"012345678912\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"AccountId\": \"012345678912\",\n                                \"OutpostId\": \"?outpost/invalid+\",\n                                \"Region\": \"us-west-1\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"bucket ARN with mismatched accountId\",\n                            \"expect\": {\n                                \"error\": \"Invalid ARN: the accountId specified in the ARN (`999999`) does not match the parameter (`012345678912`)\"\n                            },\n                            \"params\": {\n                                \"Bucket\": \"arn:aws:s3-outposts:us-west-2:999999:outpost:op-01234567890123456:bucket:mybucket\",\n                                \"AccountId\": \"012345678912\",\n                                \"Region\": \"us-west-2\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"OutpostId with invalid region\",\n                            \"expect\": {\n                                \"error\": \"Invalid region: region was not a valid DNS name.\"\n                            },\n                            \"params\": {\n                                \"OutpostId\": \"op-123\",\n                                \"Region\": \"invalid-region 42\",\n                                \"AccountId\": \"0123456\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"OutpostId with RequireAccountId unset\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3-outposts\",\n                                                \"signingRegion\": \"us-west-2\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://s3-outposts.us-west-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"OutpostId\": \"op-123\",\n                                \"Region\": \"us-west-2\",\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"Outpost Accesspoint ARN with arn region and client region mismatch with UseArnRegion=false\",\n                            \"expect\": {\n                                \"error\": \"Invalid configuration: region from ARN `us-east-1` does not match client region `us-west-2` and UseArnRegion is `false`\"\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-west-2\",\n                                        \"AWS::S3Control::UseArnRegion\": false\n                                    },\n                                    \"operationName\": \"GetAccessPoint\",\n                                    \"operationParams\": {\n                                        \"Name\": \"arn:aws:s3-outposts:us-east-1:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint\",\n                                        \"AccountId\": \"123456789012\"\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-west-2\",\n                                        \"AWS::S3Control::UseArnRegion\": false\n                                    },\n                                    \"operationName\": \"DeleteAccessPoint\",\n                                    \"operationParams\": {\n                                        \"Name\": \"arn:aws:s3-outposts:us-east-1:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint\",\n                                        \"AccountId\": \"123456789012\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"AccessPointName\": \"arn:aws:s3-outposts:us-east-1:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint\",\n                                \"AccountId\": \"123456789012\",\n                                \"Region\": \"us-west-2\",\n                                \"RequiresAccountId\": true,\n                                \"UseArnRegion\": false,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"Outpost Bucket ARN with arn region and client region mismatch with UseArnRegion=false\",\n                            \"expect\": {\n                                \"error\": \"Invalid configuration: region from ARN `us-east-1` does not match client region `us-west-2` and UseArnRegion is `false`\"\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-west-2\",\n                                        \"SDK::Endpoint\": \"https://beta.example.com\",\n                                        \"AWS::S3Control::UseArnRegion\": false\n                                    },\n                                    \"operationName\": \"GetBucket\",\n                                    \"operationParams\": {\n                                        \"Bucket\": \"arn:aws:s3-outposts:us-east-1:123456789012:outpost:op-01234567890123456:bucket:mybucket\",\n                                        \"AccountId\": \"123456789012\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"Bucket\": \"arn:aws:s3-outposts:us-east-1:123456789012:outpost:op-01234567890123456:bucket:mybucket\",\n                                \"Endpoint\": \"https://beta.example.com\",\n                                \"Region\": \"us-west-2\",\n                                \"RequiresAccountId\": true,\n                                \"UseArnRegion\": false,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"Accesspoint ARN with region mismatch and UseArnRegion unset\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"headers\": {\n                                        \"x-amz-account-id\": [\n                                            \"123456789012\"\n                                        ],\n                                        \"x-amz-outpost-id\": [\n                                            \"op-01234567890123456\"\n                                        ]\n                                    },\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3-outposts\",\n                                                \"signingRegion\": \"us-east-1\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://s3-outposts.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-west-2\"\n                                    },\n                                    \"operationName\": \"GetAccessPoint\",\n                                    \"operationParams\": {\n                                        \"Name\": \"arn:aws:s3-outposts:us-east-1:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint\",\n                                        \"AccountId\": \"123456789012\"\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-west-2\"\n                                    },\n                                    \"operationName\": \"DeleteAccessPoint\",\n                                    \"operationParams\": {\n                                        \"Name\": \"arn:aws:s3-outposts:us-east-1:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint\",\n                                        \"AccountId\": \"123456789012\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"AccessPointName\": \"arn:aws:s3-outposts:us-east-1:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint\",\n                                \"AccountId\": \"123456789012\",\n                                \"Region\": \"us-west-2\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"Bucket ARN with region mismatch and UseArnRegion unset\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"headers\": {\n                                        \"x-amz-account-id\": [\n                                            \"123456789012\"\n                                        ],\n                                        \"x-amz-outpost-id\": [\n                                            \"op-01234567890123456\"\n                                        ]\n                                    },\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3-outposts\",\n                                                \"signingRegion\": \"us-east-1\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://s3-outposts.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-west-2\"\n                                    },\n                                    \"operationName\": \"GetBucket\",\n                                    \"operationParams\": {\n                                        \"Bucket\": \"arn:aws:s3-outposts:us-east-1:123456789012:outpost:op-01234567890123456:bucket:mybucket\",\n                                        \"AccountId\": \"123456789012\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"Bucket\": \"arn:aws:s3-outposts:us-east-1:123456789012:outpost:op-01234567890123456:bucket:mybucket\",\n                                \"Region\": \"us-west-2\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"Outpost Bucket ARN with partition mismatch with UseArnRegion=true\",\n                            \"expect\": {\n                                \"error\": \"Client was configured for partition `aws` but ARN has `aws-cn`\"\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-west-2\",\n                                        \"AWS::S3Control::UseArnRegion\": true\n                                    },\n                                    \"operationName\": \"GetBucket\",\n                                    \"operationParams\": {\n                                        \"Bucket\": \"arn:aws:s3-outposts:cn-north-1:123456789012:outpost:op-01234567890123456:bucket:mybucket\",\n                                        \"AccountId\": \"123456789012\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"Bucket\": \"arn:aws:s3-outposts:cn-north-1:123456789012:outpost:op-01234567890123456:bucket:mybucket\",\n                                \"Region\": \"us-west-2\",\n                                \"RequiresAccountId\": true,\n                                \"UseArnRegion\": true,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"Accesspoint ARN with partition mismatch and UseArnRegion=true\",\n                            \"expect\": {\n                                \"error\": \"Client was configured for partition `aws` but ARN has `aws-cn`\"\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-west-2\",\n                                        \"AWS::S3Control::UseArnRegion\": true\n                                    },\n                                    \"operationName\": \"GetAccessPoint\",\n                                    \"operationParams\": {\n                                        \"Name\": \"arn:aws:s3-outposts:cn-north-1:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint\",\n                                        \"AccountId\": \"123456789012\"\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-west-2\",\n                                        \"AWS::S3Control::UseArnRegion\": true\n                                    },\n                                    \"operationName\": \"DeleteAccessPoint\",\n                                    \"operationParams\": {\n                                        \"Name\": \"arn:aws:s3-outposts:cn-north-1:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint\",\n                                        \"AccountId\": \"123456789012\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"AccessPointName\": \"arn:aws:s3-outposts:cn-north-1:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint\",\n                                \"AccountId\": \"123456789012\",\n                                \"Region\": \"us-west-2\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": false,\n                                \"UseArnRegion\": true,\n                                \"UseFIPS\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"Accesspoint ARN with region mismatch, UseArnRegion=false and custom endpoint\",\n                            \"expect\": {\n                                \"error\": \"Invalid configuration: region from ARN `cn-north-1` does not match client region `us-west-2` and UseArnRegion is `false`\"\n                            },\n                            \"params\": {\n                                \"AccessPointName\": \"arn:aws:s3-outposts:cn-north-1:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint\",\n                                \"Region\": \"us-west-2\",\n                                \"Endpoint\": \"https://example.com\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": false,\n                                \"UseArnRegion\": false,\n                                \"UseFIPS\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"outpost bucket arn@us-west-2\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"headers\": {\n                                        \"x-amz-account-id\": [\n                                            \"123456789012\"\n                                        ],\n                                        \"x-amz-outpost-id\": [\n                                            \"op-01234567890123456\"\n                                        ]\n                                    },\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3-outposts\",\n                                                \"signingRegion\": \"us-west-2\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://s3-outposts.us-west-2.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-west-2\"\n                                    },\n                                    \"operationName\": \"GetBucketVersioning\",\n                                    \"operationParams\": {\n                                        \"Bucket\": \"arn:aws:s3-outposts:us-west-2:123456789012:outpost:op-01234567890123456:bucket:mybucket\",\n                                        \"AccountId\": \"123456789012\"\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-west-2\"\n                                    },\n                                    \"operationName\": \"PutBucketVersioning\",\n                                    \"operationParams\": {\n                                        \"Bucket\": \"arn:aws:s3-outposts:us-west-2:123456789012:outpost:op-01234567890123456:bucket:mybucket\",\n                                        \"AccountId\": \"123456789012\",\n                                        \"VersioningConfiguration\": {\n                                            \"Status\": \"Enabled\"\n                                        }\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"Bucket\": \"arn:aws:s3-outposts:us-west-2:123456789012:outpost:op-01234567890123456:bucket:mybucket\",\n                                \"Region\": \"us-west-2\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"S3 Snow Control with bucket\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3\",\n                                                \"signingRegion\": \"snow\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://10.0.1.12:433\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"snow\",\n                                \"Bucket\": \"bucketName\",\n                                \"Endpoint\": \"https://10.0.1.12:433\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"S3 Snow Control without bucket\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3\",\n                                                \"signingRegion\": \"snow\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://10.0.1.12:433\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"snow\",\n                                \"Endpoint\": \"https://10.0.1.12:433\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"S3 Snow Control with bucket and without port\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3\",\n                                                \"signingRegion\": \"snow\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://10.0.1.12\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"snow\",\n                                \"Bucket\": \"bucketName\",\n                                \"Endpoint\": \"https://10.0.1.12\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"S3 Snow Control with bucket and with DNS\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3\",\n                                                \"signingRegion\": \"snow\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"http://s3snow.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"snow\",\n                                \"Bucket\": \"bucketName\",\n                                \"Endpoint\": \"http://s3snow.com\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"S3 Snow Control with FIPS enabled\",\n                            \"expect\": {\n                                \"error\": \"S3 Snow does not support FIPS\"\n                            },\n                            \"params\": {\n                                \"Region\": \"snow\",\n                                \"Bucket\": \"bucketName\",\n                                \"Endpoint\": \"https://10.0.1.12:433\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"S3 Snow Control with Dualstack enabled\",\n                            \"expect\": {\n                                \"error\": \"S3 Snow does not support DualStack\"\n                            },\n                            \"params\": {\n                                \"Region\": \"snow\",\n                                \"Bucket\": \"bucketName\",\n                                \"Endpoint\": \"https://10.0.1.12:433\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"Tagging on express bucket routed to s3express-control\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3express\",\n                                                \"signingRegion\": \"us-east-1\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://s3express-control.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\"\n                                    },\n                                    \"operationName\": \"TagResource\",\n                                    \"operationParams\": {\n                                        \"ResourceArn\": \"arn:aws:s3express:us-east-1:871317572157:bucket/crachlintest--use1-az4--x-s3\",\n                                        \"AccountId\": \"871317572157\",\n                                        \"Tags\": []\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\"\n                                    },\n                                    \"operationName\": \"UntagResource\",\n                                    \"operationParams\": {\n                                        \"ResourceArn\": \"arn:aws:s3express:us-east-1:871317572157:bucket/crachlintest--use1-az4--x-s3\",\n                                        \"AccountId\": \"871317572157\",\n                                        \"TagKeys\": []\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\"\n                                    },\n                                    \"operationName\": \"ListTagsForResource\",\n                                    \"operationParams\": {\n                                        \"ResourceArn\": \"arn:aws:s3express:us-east-1:871317572157:bucket/crachlintest--use1-az4--x-s3\",\n                                        \"AccountId\": \"871317572157\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"ResourceArn\": \"arn:aws:s3express:us-east-1:871317572157:bucket/crachlintest--use1-az4--x-s3\",\n                                \"AccountId\": \"871317572157\",\n                                \"Region\": \"us-east-1\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"Tagging on express ap routed to s3express-control\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3express\",\n                                                \"signingRegion\": \"us-east-1\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://s3express-control.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\"\n                                    },\n                                    \"operationName\": \"TagResource\",\n                                    \"operationParams\": {\n                                        \"ResourceArn\": \"arn:aws:s3express:us-east-1:871317572157:accesspoint/crachlintest--use1-az4--xa-s3\",\n                                        \"AccountId\": \"871317572157\",\n                                        \"Tags\": []\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\"\n                                    },\n                                    \"operationName\": \"UntagResource\",\n                                    \"operationParams\": {\n                                        \"ResourceArn\": \"arn:aws:s3express:us-east-1:871317572157:accesspoint/crachlintest--use1-az4--xa-s3\",\n                                        \"AccountId\": \"871317572157\",\n                                        \"TagKeys\": []\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\"\n                                    },\n                                    \"operationName\": \"ListTagsForResource\",\n                                    \"operationParams\": {\n                                        \"ResourceArn\": \"arn:aws:s3express:us-east-1:871317572157:accesspoint/crachlintest--use1-az4--xa-s3\",\n                                        \"AccountId\": \"871317572157\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"ResourceArn\": \"arn:aws:s3express:us-east-1:871317572157:accesspoint/crachlintest--use1-az4--xa-s3\",\n                                \"AccountId\": \"871317572157\",\n                                \"Region\": \"us-east-1\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"Tagging on express bucket routed to s3express-control FIPS when FIPS enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3express\",\n                                                \"signingRegion\": \"us-east-1\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://s3express-control-fips.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": true\n                                    },\n                                    \"operationName\": \"TagResource\",\n                                    \"operationParams\": {\n                                        \"ResourceArn\": \"arn:aws:s3express:us-east-1:871317572157:bucket/crachlintest--use1-az4--x-s3\",\n                                        \"AccountId\": \"871317572157\",\n                                        \"Tags\": []\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": true\n                                    },\n                                    \"operationName\": \"UntagResource\",\n                                    \"operationParams\": {\n                                        \"ResourceArn\": \"arn:aws:s3express:us-east-1:871317572157:bucket/crachlintest--use1-az4--x-s3\",\n                                        \"AccountId\": \"871317572157\",\n                                        \"TagKeys\": []\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": true\n                                    },\n                                    \"operationName\": \"ListTagsForResource\",\n                                    \"operationParams\": {\n                                        \"ResourceArn\": \"arn:aws:s3express:us-east-1:871317572157:bucket/crachlintest--use1-az4--x-s3\",\n                                        \"AccountId\": \"871317572157\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"ResourceArn\": \"arn:aws:s3express:us-east-1:871317572157:bucket/crachlintest--use1-az4--x-s3\",\n                                \"AccountId\": \"871317572157\",\n                                \"Region\": \"us-east-1\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"Tagging on express bucket cn routed to s3express-control china endpoint\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3express\",\n                                                \"signingRegion\": \"cn-north-1\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://s3express-control.cn-north-1.amazonaws.com.cn\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"cn-north-1\"\n                                    },\n                                    \"operationName\": \"TagResource\",\n                                    \"operationParams\": {\n                                        \"ResourceArn\": \"arn:aws-cn:s3express:cn-north-1:871317572157:bucket/crachlintest--use1-az4--x-s3\",\n                                        \"AccountId\": \"871317572157\",\n                                        \"Tags\": []\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"cn-north-1\"\n                                    },\n                                    \"operationName\": \"UntagResource\",\n                                    \"operationParams\": {\n                                        \"ResourceArn\": \"arn:aws-cn:s3express:cn-north-1:871317572157:bucket/crachlintest--use1-az4--x-s3\",\n                                        \"AccountId\": \"871317572157\",\n                                        \"TagKeys\": []\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"cn-north-1\"\n                                    },\n                                    \"operationName\": \"ListTagsForResource\",\n                                    \"operationParams\": {\n                                        \"ResourceArn\": \"arn:aws-cn:s3express:cn-north-1:871317572157:bucket/crachlintest--use1-az4--x-s3\",\n                                        \"AccountId\": \"871317572157\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"ResourceArn\": \"arn:aws-cn:s3express:cn-north-1:871317572157:bucket/crachlintest--use1-az4--x-s3\",\n                                \"AccountId\": \"871317572157\",\n                                \"Region\": \"cn-north-1\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"Tagging on express bucket cn routed to s3express-control china endpoint with FIPS\",\n                            \"expect\": {\n                                \"error\": \"Partition does not support FIPS\"\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"cn-north-1\",\n                                        \"AWS::UseFIPS\": true\n                                    },\n                                    \"operationName\": \"TagResource\",\n                                    \"operationParams\": {\n                                        \"ResourceArn\": \"arn:aws-cn:s3express:cn-north-1:871317572157:bucket/crachlintest--use1-az4--x-s3\",\n                                        \"AccountId\": \"871317572157\",\n                                        \"Tags\": []\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"cn-north-1\",\n                                        \"AWS::UseFIPS\": true\n                                    },\n                                    \"operationName\": \"UntagResource\",\n                                    \"operationParams\": {\n                                        \"ResourceArn\": \"arn:aws-cn:s3express:cn-north-1:871317572157:bucket/crachlintest--use1-az4--x-s3\",\n                                        \"AccountId\": \"871317572157\",\n                                        \"TagKeys\": []\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"cn-north-1\",\n                                        \"AWS::UseFIPS\": true\n                                    },\n                                    \"operationName\": \"ListTagsForResource\",\n                                    \"operationParams\": {\n                                        \"ResourceArn\": \"arn:aws-cn:s3express:cn-north-1:871317572157:bucket/crachlintest--use1-az4--x-s3\",\n                                        \"AccountId\": \"871317572157\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"ResourceArn\": \"arn:aws-cn:s3express:cn-north-1:871317572157:bucket/crachlintest--use1-az4--x-s3\",\n                                \"AccountId\": \"871317572157\",\n                                \"Region\": \"cn-north-1\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"Tagging on express bucket with custom endpoint routed to custom endpoint\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3express\",\n                                                \"signingRegion\": \"us-east-1\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://my-endpoint.express-control.s3.aws.dev\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"SDK::Endpoint\": \"https://my-endpoint.express-control.s3.aws.dev\"\n                                    },\n                                    \"operationName\": \"TagResource\",\n                                    \"operationParams\": {\n                                        \"ResourceArn\": \"arn:aws:s3express:us-east-1:871317572157:bucket/crachlintest--use1-az4--x-s3\",\n                                        \"AccountId\": \"871317572157\",\n                                        \"Tags\": []\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"SDK::Endpoint\": \"https://my-endpoint.express-control.s3.aws.dev\"\n                                    },\n                                    \"operationName\": \"UntagResource\",\n                                    \"operationParams\": {\n                                        \"ResourceArn\": \"arn:aws:s3express:us-east-1:871317572157:bucket/crachlintest--use1-az4--x-s3\",\n                                        \"AccountId\": \"871317572157\",\n                                        \"TagKeys\": []\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"SDK::Endpoint\": \"https://my-endpoint.express-control.s3.aws.dev\"\n                                    },\n                                    \"operationName\": \"ListTagsForResource\",\n                                    \"operationParams\": {\n                                        \"ResourceArn\": \"arn:aws:s3express:us-east-1:871317572157:bucket/crachlintest--use1-az4--x-s3\",\n                                        \"AccountId\": \"871317572157\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"ResourceArn\": \"arn:aws:s3express:us-east-1:871317572157:bucket/crachlintest--use1-az4--x-s3\",\n                                \"Endpoint\": \"https://my-endpoint.express-control.s3.aws.dev\",\n                                \"AccountId\": \"871317572157\",\n                                \"Region\": \"us-east-1\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"Tagging on express access point with custom endpoint routed to custom endpoint\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3express\",\n                                                \"signingRegion\": \"us-east-1\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://my-endpoint.express-control.s3.aws.dev\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"SDK::Endpoint\": \"https://my-endpoint.express-control.s3.aws.dev\"\n                                    },\n                                    \"operationName\": \"TagResource\",\n                                    \"operationParams\": {\n                                        \"ResourceArn\": \"arn:aws:s3express:us-east-1:871317572157:accesspoint/crachlintest--use1-az4--xa-s3\",\n                                        \"AccountId\": \"871317572157\",\n                                        \"Tags\": []\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"SDK::Endpoint\": \"https://my-endpoint.express-control.s3.aws.dev\"\n                                    },\n                                    \"operationName\": \"UntagResource\",\n                                    \"operationParams\": {\n                                        \"ResourceArn\": \"arn:aws:s3express:us-east-1:871317572157:accesspoint/crachlintest--use1-az4--xa-s3\",\n                                        \"AccountId\": \"871317572157\",\n                                        \"TagKeys\": []\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"SDK::Endpoint\": \"https://my-endpoint.express-control.s3.aws.dev\"\n                                    },\n                                    \"operationName\": \"ListTagsForResource\",\n                                    \"operationParams\": {\n                                        \"ResourceArn\": \"arn:aws:s3express:us-east-1:871317572157:accesspoint/crachlintest--use1-az4--xa-s3\",\n                                        \"AccountId\": \"871317572157\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"ResourceArn\": \"arn:aws:s3express:us-east-1:871317572157:accesspoint/crachlintest--use1-az4--xa-s3\",\n                                \"Endpoint\": \"https://my-endpoint.express-control.s3.aws.dev\",\n                                \"AccountId\": \"871317572157\",\n                                \"Region\": \"us-east-1\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"Tagging on express bucket with dualstack and custom endpoint fails\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: DualStack and custom endpoint are not supported\"\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"SDK::Endpoint\": \"https://my-endpoint.express-control.s3.aws.dev\",\n                                        \"AWS::UseDualStack\": true\n                                    },\n                                    \"operationName\": \"TagResource\",\n                                    \"operationParams\": {\n                                        \"ResourceArn\": \"arn:aws:s3express:us-east-1:871317572157:bucket/crachlintest--use1-az4--x-s3\",\n                                        \"AccountId\": \"871317572157\",\n                                        \"Tags\": []\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"SDK::Endpoint\": \"https://my-endpoint.express-control.s3.aws.dev\",\n                                        \"AWS::UseDualStack\": true\n                                    },\n                                    \"operationName\": \"UntagResource\",\n                                    \"operationParams\": {\n                                        \"ResourceArn\": \"arn:aws:s3express:us-east-1:871317572157:bucket/crachlintest--use1-az4--x-s3\",\n                                        \"AccountId\": \"871317572157\",\n                                        \"TagKeys\": []\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"SDK::Endpoint\": \"https://my-endpoint.express-control.s3.aws.dev\",\n                                        \"AWS::UseDualStack\": true\n                                    },\n                                    \"operationName\": \"ListTagsForResource\",\n                                    \"operationParams\": {\n                                        \"ResourceArn\": \"arn:aws:s3express:us-east-1:871317572157:bucket/crachlintest--use1-az4--x-s3\",\n                                        \"AccountId\": \"871317572157\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"ResourceArn\": \"arn:aws:s3express:us-east-1:871317572157:bucket/crachlintest--use1-az4--x-s3\",\n                                \"Endpoint\": \"https://my-endpoint.express-control.s3.aws.dev\",\n                                \"AccountId\": \"871317572157\",\n                                \"Region\": \"us-east-1\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": true,\n                                \"UseFIPS\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"Access Point APIs on express bucket routed to s3express-control\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3express\",\n                                                \"signingRegion\": \"us-east-1\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://s3express-control.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\"\n                                    },\n                                    \"operationName\": \"CreateAccessPoint\",\n                                    \"operationParams\": {\n                                        \"Name\": \"myaccesspoint--abcd-ab1--xa-s3\",\n                                        \"Bucket\": \"mybucket--abcd-ab1--x-s3\",\n                                        \"AccountId\": \"871317572157\",\n                                        \"Scope\": {\n                                            \"Prefixes\": [],\n                                            \"Permissions\": []\n                                        }\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\"\n                                    },\n                                    \"operationName\": \"GetAccessPoint\",\n                                    \"operationParams\": {\n                                        \"Name\": \"myaccesspoint--abcd-ab1--xa-s3\",\n                                        \"AccountId\": \"871317572157\"\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\"\n                                    },\n                                    \"operationName\": \"DeleteAccessPoint\",\n                                    \"operationParams\": {\n                                        \"Name\": \"myaccesspoint--abcd-ab1--xa-s3\",\n                                        \"AccountId\": \"871317572157\"\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\"\n                                    },\n                                    \"operationName\": \"PutAccessPointScope\",\n                                    \"operationParams\": {\n                                        \"Name\": \"myaccesspoint--abcd-ab1--xa-s3\",\n                                        \"AccountId\": \"871317572157\",\n                                        \"Scope\": {\n                                            \"Prefixes\": [],\n                                            \"Permissions\": []\n                                        }\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\"\n                                    },\n                                    \"operationName\": \"GetAccessPointScope\",\n                                    \"operationParams\": {\n                                        \"Name\": \"myaccesspoint--abcd-ab1--xa-s3\",\n                                        \"AccountId\": \"871317572157\"\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\"\n                                    },\n                                    \"operationName\": \"DeleteAccessPointScope\",\n                                    \"operationParams\": {\n                                        \"Name\": \"myaccesspoint--abcd-ab1--xa-s3\",\n                                        \"AccountId\": \"871317572157\"\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\"\n                                    },\n                                    \"operationName\": \"PutAccessPointPolicy\",\n                                    \"operationParams\": {\n                                        \"Name\": \"myaccesspoint--abcd-ab1--xa-s3\",\n                                        \"AccountId\": \"871317572157\",\n                                        \"Policy\": \"my-policy\"\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\"\n                                    },\n                                    \"operationName\": \"GetAccessPointPolicy\",\n                                    \"operationParams\": {\n                                        \"Name\": \"myaccesspoint--abcd-ab1--xa-s3\",\n                                        \"AccountId\": \"871317572157\"\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\"\n                                    },\n                                    \"operationName\": \"DeleteAccessPointPolicy\",\n                                    \"operationParams\": {\n                                        \"Name\": \"myaccesspoint--abcd-ab1--xa-s3\",\n                                        \"AccountId\": \"871317572157\"\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\"\n                                    },\n                                    \"operationName\": \"GetAccessPointPolicyStatus\",\n                                    \"operationParams\": {\n                                        \"Name\": \"myaccesspoint--abcd-ab1--xa-s3\",\n                                        \"AccountId\": \"871317572157\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"AccountId\": \"871317572157\",\n                                \"AccessPointName\": \"myaccesspoint--abcd-ab1--xa-s3\",\n                                \"Region\": \"us-east-1\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"Access Point APIs on express bucket routed to s3express-control for List\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3express\",\n                                                \"signingRegion\": \"us-east-1\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://s3express-control.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\"\n                                    },\n                                    \"operationName\": \"ListAccessPointsForDirectoryBuckets\",\n                                    \"operationParams\": {\n                                        \"DirectoryBucket\": \"mybucket--abcd-ab1--x-s3\",\n                                        \"AccountId\": \"871317572157\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"AccountId\": \"871317572157\",\n                                \"Region\": \"us-east-1\",\n                                \"UseS3ExpressControlEndpoint\": true,\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"Access Point APIs on express bucket routed to s3express-control for FIPS\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3express\",\n                                                \"signingRegion\": \"us-east-1\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://s3express-control-fips.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": true\n                                    },\n                                    \"operationName\": \"CreateAccessPoint\",\n                                    \"operationParams\": {\n                                        \"Name\": \"myaccesspoint--abcd-ab1--xa-s3\",\n                                        \"Bucket\": \"mybucket--abcd-ab1--x-s3\",\n                                        \"AccountId\": \"871317572157\",\n                                        \"Scope\": {\n                                            \"Prefixes\": [],\n                                            \"Permissions\": []\n                                        }\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": true\n                                    },\n                                    \"operationName\": \"GetAccessPoint\",\n                                    \"operationParams\": {\n                                        \"Name\": \"myaccesspoint--abcd-ab1--xa-s3\",\n                                        \"AccountId\": \"871317572157\"\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": true\n                                    },\n                                    \"operationName\": \"DeleteAccessPoint\",\n                                    \"operationParams\": {\n                                        \"Name\": \"myaccesspoint--abcd-ab1--xa-s3\",\n                                        \"AccountId\": \"871317572157\"\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": true\n                                    },\n                                    \"operationName\": \"PutAccessPointScope\",\n                                    \"operationParams\": {\n                                        \"Name\": \"myaccesspoint--abcd-ab1--xa-s3\",\n                                        \"AccountId\": \"871317572157\",\n                                        \"Scope\": {\n                                            \"Prefixes\": [],\n                                            \"Permissions\": []\n                                        }\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": true\n                                    },\n                                    \"operationName\": \"GetAccessPointScope\",\n                                    \"operationParams\": {\n                                        \"Name\": \"myaccesspoint--abcd-ab1--xa-s3\",\n                                        \"AccountId\": \"871317572157\"\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": true\n                                    },\n                                    \"operationName\": \"DeleteAccessPointScope\",\n                                    \"operationParams\": {\n                                        \"Name\": \"myaccesspoint--abcd-ab1--xa-s3\",\n                                        \"AccountId\": \"871317572157\"\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": true\n                                    },\n                                    \"operationName\": \"PutAccessPointPolicy\",\n                                    \"operationParams\": {\n                                        \"Name\": \"myaccesspoint--abcd-ab1--xa-s3\",\n                                        \"AccountId\": \"871317572157\",\n                                        \"Policy\": \"my-policy\"\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": true\n                                    },\n                                    \"operationName\": \"GetAccessPointPolicy\",\n                                    \"operationParams\": {\n                                        \"Name\": \"myaccesspoint--abcd-ab1--xa-s3\",\n                                        \"AccountId\": \"871317572157\"\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": true\n                                    },\n                                    \"operationName\": \"DeleteAccessPointPolicy\",\n                                    \"operationParams\": {\n                                        \"Name\": \"myaccesspoint--abcd-ab1--xa-s3\",\n                                        \"AccountId\": \"871317572157\"\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": true\n                                    },\n                                    \"operationName\": \"GetAccessPointPolicyStatus\",\n                                    \"operationParams\": {\n                                        \"Name\": \"myaccesspoint--abcd-ab1--xa-s3\",\n                                        \"AccountId\": \"871317572157\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"AccountId\": \"871317572157\",\n                                \"AccessPointName\": \"myaccesspoint--abcd-ab1--xa-s3\",\n                                \"Region\": \"us-east-1\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"Access Point APIs on express bucket routed to s3express-control for FIPS for List\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3express\",\n                                                \"signingRegion\": \"us-east-1\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://s3express-control-fips.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseFIPS\": true\n                                    },\n                                    \"operationName\": \"ListAccessPointsForDirectoryBuckets\",\n                                    \"operationParams\": {\n                                        \"DirectoryBucket\": \"mybucket--abcd-ab1--x-s3\",\n                                        \"AccountId\": \"871317572157\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"AccountId\": \"871317572157\",\n                                \"Region\": \"us-east-1\",\n                                \"UseS3ExpressControlEndpoint\": true,\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"Access Point APIs on express bucket routed to s3express-control for china region\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3express\",\n                                                \"signingRegion\": \"cn-north-1\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://s3express-control.cn-north-1.amazonaws.com.cn\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"cn-north-1\"\n                                    },\n                                    \"operationName\": \"CreateAccessPoint\",\n                                    \"operationParams\": {\n                                        \"Name\": \"myaccesspoint--abcd-ab1--xa-s3\",\n                                        \"Bucket\": \"mybucket--abcd-ab1--x-s3\",\n                                        \"AccountId\": \"871317572157\",\n                                        \"Scope\": {\n                                            \"Prefixes\": [],\n                                            \"Permissions\": []\n                                        }\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"cn-north-1\"\n                                    },\n                                    \"operationName\": \"GetAccessPoint\",\n                                    \"operationParams\": {\n                                        \"Name\": \"myaccesspoint--abcd-ab1--xa-s3\",\n                                        \"AccountId\": \"871317572157\"\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"cn-north-1\"\n                                    },\n                                    \"operationName\": \"DeleteAccessPoint\",\n                                    \"operationParams\": {\n                                        \"Name\": \"myaccesspoint--abcd-ab1--xa-s3\",\n                                        \"AccountId\": \"871317572157\"\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"cn-north-1\"\n                                    },\n                                    \"operationName\": \"PutAccessPointScope\",\n                                    \"operationParams\": {\n                                        \"Name\": \"myaccesspoint--abcd-ab1--xa-s3\",\n                                        \"AccountId\": \"871317572157\",\n                                        \"Scope\": {\n                                            \"Prefixes\": [],\n                                            \"Permissions\": []\n                                        }\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"cn-north-1\"\n                                    },\n                                    \"operationName\": \"GetAccessPointScope\",\n                                    \"operationParams\": {\n                                        \"Name\": \"myaccesspoint--abcd-ab1--xa-s3\",\n                                        \"AccountId\": \"871317572157\"\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"cn-north-1\"\n                                    },\n                                    \"operationName\": \"DeleteAccessPointScope\",\n                                    \"operationParams\": {\n                                        \"Name\": \"myaccesspoint--abcd-ab1--xa-s3\",\n                                        \"AccountId\": \"871317572157\"\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"cn-north-1\"\n                                    },\n                                    \"operationName\": \"PutAccessPointPolicy\",\n                                    \"operationParams\": {\n                                        \"Name\": \"myaccesspoint--abcd-ab1--xa-s3\",\n                                        \"AccountId\": \"871317572157\",\n                                        \"Policy\": \"my-policy\"\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"cn-north-1\"\n                                    },\n                                    \"operationName\": \"GetAccessPointPolicy\",\n                                    \"operationParams\": {\n                                        \"Name\": \"myaccesspoint--abcd-ab1--xa-s3\",\n                                        \"AccountId\": \"871317572157\"\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"cn-north-1\"\n                                    },\n                                    \"operationName\": \"DeleteAccessPointPolicy\",\n                                    \"operationParams\": {\n                                        \"Name\": \"myaccesspoint--abcd-ab1--xa-s3\",\n                                        \"AccountId\": \"871317572157\"\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"cn-north-1\"\n                                    },\n                                    \"operationName\": \"GetAccessPointPolicyStatus\",\n                                    \"operationParams\": {\n                                        \"Name\": \"myaccesspoint--abcd-ab1--xa-s3\",\n                                        \"AccountId\": \"871317572157\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"AccessPointName\": \"myaccesspoint--abcd-ab1--xa-s3\",\n                                \"AccountId\": \"871317572157\",\n                                \"Region\": \"cn-north-1\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"Access Point APIs on express bucket routed to s3express-control for china region for List\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3express\",\n                                                \"signingRegion\": \"cn-north-1\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://s3express-control.cn-north-1.amazonaws.com.cn\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"cn-north-1\"\n                                    },\n                                    \"operationName\": \"ListAccessPointsForDirectoryBuckets\",\n                                    \"operationParams\": {\n                                        \"DirectoryBucket\": \"mybucket--abcd-ab1--x-s3\",\n                                        \"AccountId\": \"871317572157\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"AccountId\": \"871317572157\",\n                                \"Region\": \"cn-north-1\",\n                                \"UseS3ExpressControlEndpoint\": true,\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"Error when Access Point APIs on express bucket routed to s3express-control for china and FIPS\",\n                            \"expect\": {\n                                \"error\": \"Partition does not support FIPS\"\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"cn-north-1\",\n                                        \"AWS::UseFIPS\": true\n                                    },\n                                    \"operationName\": \"CreateAccessPoint\",\n                                    \"operationParams\": {\n                                        \"Name\": \"myaccesspoint--abcd-ab1--xa-s3\",\n                                        \"Bucket\": \"mybucket--abcd-ab1--x-s3\",\n                                        \"AccountId\": \"871317572157\",\n                                        \"Scope\": {\n                                            \"Prefixes\": [],\n                                            \"Permissions\": []\n                                        }\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"cn-north-1\",\n                                        \"AWS::UseFIPS\": true\n                                    },\n                                    \"operationName\": \"GetAccessPoint\",\n                                    \"operationParams\": {\n                                        \"Name\": \"myaccesspoint--abcd-ab1--xa-s3\",\n                                        \"AccountId\": \"871317572157\"\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"cn-north-1\",\n                                        \"AWS::UseFIPS\": true\n                                    },\n                                    \"operationName\": \"DeleteAccessPoint\",\n                                    \"operationParams\": {\n                                        \"Name\": \"myaccesspoint--abcd-ab1--xa-s3\",\n                                        \"AccountId\": \"871317572157\"\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"cn-north-1\",\n                                        \"AWS::UseFIPS\": true\n                                    },\n                                    \"operationName\": \"ListAccessPointsForDirectoryBuckets\",\n                                    \"operationParams\": {\n                                        \"DirectoryBucket\": \"mybucket--abcd-ab1--x-s3\",\n                                        \"AccountId\": \"871317572157\"\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"cn-north-1\",\n                                        \"AWS::UseFIPS\": true\n                                    },\n                                    \"operationName\": \"PutAccessPointScope\",\n                                    \"operationParams\": {\n                                        \"Name\": \"myaccesspoint--abcd-ab1--xa-s3\",\n                                        \"AccountId\": \"871317572157\",\n                                        \"Scope\": {\n                                            \"Prefixes\": [],\n                                            \"Permissions\": []\n                                        }\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"cn-north-1\",\n                                        \"AWS::UseFIPS\": true\n                                    },\n                                    \"operationName\": \"GetAccessPointScope\",\n                                    \"operationParams\": {\n                                        \"Name\": \"myaccesspoint--abcd-ab1--xa-s3\",\n                                        \"AccountId\": \"871317572157\"\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"cn-north-1\",\n                                        \"AWS::UseFIPS\": true\n                                    },\n                                    \"operationName\": \"DeleteAccessPointScope\",\n                                    \"operationParams\": {\n                                        \"Name\": \"myaccesspoint--abcd-ab1--xa-s3\",\n                                        \"AccountId\": \"871317572157\"\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"cn-north-1\",\n                                        \"AWS::UseFIPS\": true\n                                    },\n                                    \"operationName\": \"PutAccessPointPolicy\",\n                                    \"operationParams\": {\n                                        \"Name\": \"myaccesspoint--abcd-ab1--xa-s3\",\n                                        \"AccountId\": \"871317572157\",\n                                        \"Policy\": \"my-policy\"\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"cn-north-1\",\n                                        \"AWS::UseFIPS\": true\n                                    },\n                                    \"operationName\": \"GetAccessPointPolicy\",\n                                    \"operationParams\": {\n                                        \"Name\": \"myaccesspoint--abcd-ab1--xa-s3\",\n                                        \"AccountId\": \"871317572157\"\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"cn-north-1\",\n                                        \"AWS::UseFIPS\": true\n                                    },\n                                    \"operationName\": \"DeleteAccessPointPolicy\",\n                                    \"operationParams\": {\n                                        \"Name\": \"myaccesspoint--abcd-ab1--xa-s3\",\n                                        \"AccountId\": \"871317572157\"\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"cn-north-1\",\n                                        \"AWS::UseFIPS\": true\n                                    },\n                                    \"operationName\": \"GetAccessPointPolicyStatus\",\n                                    \"operationParams\": {\n                                        \"Name\": \"myaccesspoint--abcd-ab1--xa-s3\",\n                                        \"AccountId\": \"871317572157\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"AccountId\": \"871317572157\",\n                                \"Region\": \"cn-north-1\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"Error Access Point APIs on express bucket routed to s3express-control invalid zone\",\n                            \"expect\": {\n                                \"error\": \"Unrecognized S3Express Access Point name format.\"\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\"\n                                    },\n                                    \"operationName\": \"CreateAccessPoint\",\n                                    \"operationParams\": {\n                                        \"Name\": \"myaccesspoint-garbage-zone--xa-s3\",\n                                        \"Bucket\": \"mybucket-garbage-zone-garbage-zone\",\n                                        \"AccountId\": \"871317572157\",\n                                        \"Scope\": {\n                                            \"Prefixes\": [],\n                                            \"Permissions\": []\n                                        }\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\"\n                                    },\n                                    \"operationName\": \"GetAccessPoint\",\n                                    \"operationParams\": {\n                                        \"Name\": \"myaccesspoint-garbage-zone--xa-s3\",\n                                        \"AccountId\": \"871317572157\"\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\"\n                                    },\n                                    \"operationName\": \"DeleteAccessPoint\",\n                                    \"operationParams\": {\n                                        \"Name\": \"myaccesspoint-garbage-zone--xa-s3\",\n                                        \"AccountId\": \"871317572157\"\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\"\n                                    },\n                                    \"operationName\": \"PutAccessPointScope\",\n                                    \"operationParams\": {\n                                        \"Name\": \"myaccesspoint-garbage-zone--xa-s3\",\n                                        \"AccountId\": \"871317572157\",\n                                        \"Scope\": {\n                                            \"Prefixes\": [],\n                                            \"Permissions\": []\n                                        }\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\"\n                                    },\n                                    \"operationName\": \"GetAccessPointScope\",\n                                    \"operationParams\": {\n                                        \"Name\": \"myaccesspoint-garbage-zone--xa-s3\",\n                                        \"AccountId\": \"871317572157\"\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\"\n                                    },\n                                    \"operationName\": \"DeleteAccessPointScope\",\n                                    \"operationParams\": {\n                                        \"Name\": \"myaccesspoint-garbage-zone--xa-s3\",\n                                        \"AccountId\": \"871317572157\"\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\"\n                                    },\n                                    \"operationName\": \"PutAccessPointPolicy\",\n                                    \"operationParams\": {\n                                        \"Name\": \"myaccesspoint-garbage-zone--xa-s3\",\n                                        \"AccountId\": \"871317572157\",\n                                        \"Policy\": \"my-policy\"\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\"\n                                    },\n                                    \"operationName\": \"GetAccessPointPolicy\",\n                                    \"operationParams\": {\n                                        \"Name\": \"myaccesspoint-garbage-zone--xa-s3\",\n                                        \"AccountId\": \"871317572157\"\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\"\n                                    },\n                                    \"operationName\": \"DeleteAccessPointPolicy\",\n                                    \"operationParams\": {\n                                        \"Name\": \"myaccesspoint-garbage-zone--xa-s3\",\n                                        \"AccountId\": \"871317572157\"\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\"\n                                    },\n                                    \"operationName\": \"GetAccessPointPolicyStatus\",\n                                    \"operationParams\": {\n                                        \"Name\": \"myaccesspoint-garbage-zone--xa-s3\",\n                                        \"AccountId\": \"871317572157\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"AccessPointName\": \"myaccesspoint-garbage-zone--xa-s3\",\n                                \"AccountId\": \"871317572157\",\n                                \"Region\": \"us-east-1\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"Access Point APIs on express bucket routed to custom endpoint if provided\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3express\",\n                                                \"signingRegion\": \"us-east-1\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://my-endpoint.express-control.s3.aws.dev\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"SDK::Endpoint\": \"https://my-endpoint.express-control.s3.aws.dev\"\n                                    },\n                                    \"operationName\": \"CreateAccessPoint\",\n                                    \"operationParams\": {\n                                        \"Name\": \"myaccesspoint--abcd-ab1--xa-s3\",\n                                        \"Bucket\": \"mybucket--abcd-ab1--x-s3\",\n                                        \"AccountId\": \"871317572157\",\n                                        \"Scope\": {\n                                            \"Prefixes\": [],\n                                            \"Permissions\": []\n                                        }\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"SDK::Endpoint\": \"https://my-endpoint.express-control.s3.aws.dev\"\n                                    },\n                                    \"operationName\": \"GetAccessPoint\",\n                                    \"operationParams\": {\n                                        \"Name\": \"myaccesspoint--abcd-ab1--xa-s3\",\n                                        \"AccountId\": \"871317572157\"\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"SDK::Endpoint\": \"https://my-endpoint.express-control.s3.aws.dev\"\n                                    },\n                                    \"operationName\": \"DeleteAccessPoint\",\n                                    \"operationParams\": {\n                                        \"Name\": \"myaccesspoint--abcd-ab1--xa-s3\",\n                                        \"AccountId\": \"871317572157\"\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"SDK::Endpoint\": \"https://my-endpoint.express-control.s3.aws.dev\"\n                                    },\n                                    \"operationName\": \"PutAccessPointPolicy\",\n                                    \"operationParams\": {\n                                        \"Name\": \"myaccesspoint--abcd-ab1--xa-s3\",\n                                        \"AccountId\": \"871317572157\",\n                                        \"Policy\": \"my-policy\"\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"SDK::Endpoint\": \"https://my-endpoint.express-control.s3.aws.dev\"\n                                    },\n                                    \"operationName\": \"GetAccessPointPolicy\",\n                                    \"operationParams\": {\n                                        \"Name\": \"myaccesspoint--abcd-ab1--xa-s3\",\n                                        \"AccountId\": \"871317572157\"\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"SDK::Endpoint\": \"https://my-endpoint.express-control.s3.aws.dev\"\n                                    },\n                                    \"operationName\": \"DeleteAccessPointPolicy\",\n                                    \"operationParams\": {\n                                        \"Name\": \"myaccesspoint--abcd-ab1--xa-s3\",\n                                        \"AccountId\": \"871317572157\"\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"SDK::Endpoint\": \"https://my-endpoint.express-control.s3.aws.dev\"\n                                    },\n                                    \"operationName\": \"GetAccessPointPolicyStatus\",\n                                    \"operationParams\": {\n                                        \"Name\": \"myaccesspoint--abcd-ab1--xa-s3\",\n                                        \"AccountId\": \"871317572157\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"AccountId\": \"871317572157\",\n                                \"AccessPointName\": \"myaccesspoint--abcd-ab1--xa-s3\",\n                                \"Endpoint\": \"https://my-endpoint.express-control.s3.aws.dev\",\n                                \"Region\": \"us-east-1\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"Access Point APIs on express bucket routed to custom endpoint if provided for List\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"s3express\",\n                                                \"signingRegion\": \"us-east-1\",\n                                                \"disableDoubleEncoding\": true\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://my-endpoint.express-control.s3.aws.dev\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"SDK::Endpoint\": \"https://my-endpoint.express-control.s3.aws.dev\"\n                                    },\n                                    \"operationName\": \"ListAccessPointsForDirectoryBuckets\",\n                                    \"operationParams\": {\n                                        \"DirectoryBucket\": \"mybucket--abcd-ab1--x-s3\",\n                                        \"AccountId\": \"871317572157\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"AccountId\": \"871317572157\",\n                                \"Region\": \"us-east-1\",\n                                \"UseS3ExpressControlEndpoint\": true,\n                                \"Endpoint\": \"https://my-endpoint.express-control.s3.aws.dev\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": false,\n                                \"UseFIPS\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"Error on Access Point APIs on express bucket for dual stack\",\n                            \"expect\": {\n                                \"error\": \"S3Express does not support Dual-stack.\"\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseDualStack\": true\n                                    },\n                                    \"operationName\": \"CreateAccessPoint\",\n                                    \"operationParams\": {\n                                        \"Name\": \"myaccesspoint--abcd-ab1--xa-s3\",\n                                        \"Bucket\": \"mybucket--abcd-ab1--x-s3\",\n                                        \"AccountId\": \"871317572157\",\n                                        \"Scope\": {\n                                            \"Prefixes\": [],\n                                            \"Permissions\": []\n                                        }\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseDualStack\": true\n                                    },\n                                    \"operationName\": \"GetAccessPoint\",\n                                    \"operationParams\": {\n                                        \"Name\": \"myaccesspoint--abcd-ab1--xa-s3\",\n                                        \"AccountId\": \"871317572157\"\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseDualStack\": true\n                                    },\n                                    \"operationName\": \"DeleteAccessPoint\",\n                                    \"operationParams\": {\n                                        \"Name\": \"myaccesspoint--abcd-ab1--xa-s3\",\n                                        \"AccountId\": \"871317572157\"\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseDualStack\": true\n                                    },\n                                    \"operationName\": \"PutAccessPointPolicy\",\n                                    \"operationParams\": {\n                                        \"Name\": \"myaccesspoint--abcd-ab1--xa-s3\",\n                                        \"AccountId\": \"871317572157\",\n                                        \"Policy\": \"my-policy\"\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseDualStack\": true\n                                    },\n                                    \"operationName\": \"GetAccessPointPolicy\",\n                                    \"operationParams\": {\n                                        \"Name\": \"myaccesspoint--abcd-ab1--xa-s3\",\n                                        \"AccountId\": \"871317572157\"\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseDualStack\": true\n                                    },\n                                    \"operationName\": \"DeleteAccessPointPolicy\",\n                                    \"operationParams\": {\n                                        \"Name\": \"myaccesspoint--abcd-ab1--xa-s3\",\n                                        \"AccountId\": \"871317572157\"\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseDualStack\": true\n                                    },\n                                    \"operationName\": \"GetAccessPointPolicyStatus\",\n                                    \"operationParams\": {\n                                        \"Name\": \"myaccesspoint--abcd-ab1--xa-s3\",\n                                        \"AccountId\": \"871317572157\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"AccountId\": \"871317572157\",\n                                \"AccessPointName\": \"myaccesspoint--abcd-ab1--xa-s3\",\n                                \"Region\": \"us-east-1\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": true,\n                                \"UseFIPS\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"Error Access Point APIs on express bucket for dual stack for List\",\n                            \"expect\": {\n                                \"error\": \"S3Express does not support Dual-stack.\"\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::UseDualStack\": true\n                                    },\n                                    \"operationName\": \"ListAccessPointsForDirectoryBuckets\",\n                                    \"operationParams\": {\n                                        \"DirectoryBucket\": \"mybucket--abcd-ab1--x-s3\",\n                                        \"AccountId\": \"871317572157\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"AccountId\": \"871317572157\",\n                                \"Region\": \"us-east-1\",\n                                \"UseS3ExpressControlEndpoint\": true,\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": true,\n                                \"UseFIPS\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"Error on Access Point APIs on express bucket for custom endpoint and dual stack\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: DualStack and custom endpoint are not supported\"\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"SDK::Endpoint\": \"https://my-endpoint.express-control.s3.aws.dev\",\n                                        \"AWS::UseDualStack\": true\n                                    },\n                                    \"operationName\": \"CreateAccessPoint\",\n                                    \"operationParams\": {\n                                        \"Name\": \"myaccesspoint--abcd-ab1--xa-s3\",\n                                        \"Bucket\": \"mybucket--abcd-ab1--x-s3\",\n                                        \"AccountId\": \"871317572157\",\n                                        \"Scope\": {\n                                            \"Prefixes\": [],\n                                            \"Permissions\": []\n                                        }\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"SDK::Endpoint\": \"https://my-endpoint.express-control.s3.aws.dev\",\n                                        \"AWS::UseDualStack\": true\n                                    },\n                                    \"operationName\": \"GetAccessPoint\",\n                                    \"operationParams\": {\n                                        \"Name\": \"myaccesspoint--abcd-ab1--xa-s3\",\n                                        \"AccountId\": \"871317572157\"\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"SDK::Endpoint\": \"https://my-endpoint.express-control.s3.aws.dev\",\n                                        \"AWS::UseDualStack\": true\n                                    },\n                                    \"operationName\": \"DeleteAccessPoint\",\n                                    \"operationParams\": {\n                                        \"Name\": \"myaccesspoint--abcd-ab1--xa-s3\",\n                                        \"AccountId\": \"871317572157\"\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"SDK::Endpoint\": \"https://my-endpoint.express-control.s3.aws.dev\",\n                                        \"AWS::UseDualStack\": true\n                                    },\n                                    \"operationName\": \"PutAccessPointPolicy\",\n                                    \"operationParams\": {\n                                        \"Name\": \"myaccesspoint--abcd-ab1--xa-s3\",\n                                        \"AccountId\": \"871317572157\",\n                                        \"Policy\": \"my-policy\"\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"SDK::Endpoint\": \"https://my-endpoint.express-control.s3.aws.dev\",\n                                        \"AWS::UseDualStack\": true\n                                    },\n                                    \"operationName\": \"GetAccessPointPolicy\",\n                                    \"operationParams\": {\n                                        \"Name\": \"myaccesspoint--abcd-ab1--xa-s3\",\n                                        \"AccountId\": \"871317572157\"\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"SDK::Endpoint\": \"https://my-endpoint.express-control.s3.aws.dev\",\n                                        \"AWS::UseDualStack\": true\n                                    },\n                                    \"operationName\": \"DeleteAccessPointPolicy\",\n                                    \"operationParams\": {\n                                        \"Name\": \"myaccesspoint--abcd-ab1--xa-s3\",\n                                        \"AccountId\": \"871317572157\"\n                                    }\n                                },\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"SDK::Endpoint\": \"https://my-endpoint.express-control.s3.aws.dev\",\n                                        \"AWS::UseDualStack\": true\n                                    },\n                                    \"operationName\": \"GetAccessPointPolicyStatus\",\n                                    \"operationParams\": {\n                                        \"Name\": \"myaccesspoint--abcd-ab1--xa-s3\",\n                                        \"AccountId\": \"871317572157\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"AccountId\": \"871317572157\",\n                                \"AccessPointName\": \"myaccesspoint--abcd-ab1--xa-s3\",\n                                \"Endpoint\": \"https://my-endpoint.express-control.s3.aws.dev\",\n                                \"Region\": \"us-east-1\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": true,\n                                \"UseFIPS\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"Error Access Point APIs on express bucket for custom endpoint and dual stack for List\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: DualStack and custom endpoint are not supported\"\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"SDK::Endpoint\": \"https://my-endpoint.express-control.s3.aws.dev\",\n                                        \"AWS::UseDualStack\": true\n                                    },\n                                    \"operationName\": \"ListAccessPointsForDirectoryBuckets\",\n                                    \"operationParams\": {\n                                        \"DirectoryBucket\": \"mybucket--abcd-ab1--x-s3\",\n                                        \"AccountId\": \"871317572157\"\n                                    }\n                                }\n                            ],\n                            \"params\": {\n                                \"AccountId\": \"871317572157\",\n                                \"Region\": \"us-east-1\",\n                                \"UseS3ExpressControlEndpoint\": true,\n                                \"Endpoint\": \"https://my-endpoint.express-control.s3.aws.dev\",\n                                \"RequiresAccountId\": true,\n                                \"UseDualStack\": true,\n                                \"UseFIPS\": false\n                            }\n                        }\n                    ],\n                    \"version\": \"1.0\"\n                }\n            }\n        },\n        \"com.amazonaws.s3control#AbortIncompleteMultipartUpload\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DaysAfterInitiation\": {\n                    \"target\": \"com.amazonaws.s3control#DaysAfterInitiation\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>Specifies the number of days after which Amazon S3 aborts an incomplete multipart upload to\\n         the Outposts bucket.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The container for abort incomplete multipart upload</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#AccessControlTranslation\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Owner\": {\n                    \"target\": \"com.amazonaws.s3control#OwnerOverride\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the replica ownership.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A container for information about access control for replicas.</p>\\n         <note>\\n            <p>This is not supported by Amazon S3 on Outposts buckets.</p>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.s3control#AccessGrantArn\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 2048\n                },\n                \"smithy.api#pattern\": \"^arn:[a-z\\\\-]+:s3:[a-z0-9\\\\-]+:\\\\d{12}:access\\\\-grants\\\\/grant/[a-zA-Z0-9\\\\-]+$\"\n            }\n        },\n        \"com.amazonaws.s3control#AccessGrantId\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 64\n                },\n                \"smithy.api#pattern\": \"^[a-zA-Z0-9\\\\-]+$\"\n            }\n        },\n        \"com.amazonaws.s3control#AccessGrantsInstanceArn\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 2048\n                },\n                \"smithy.api#pattern\": \"^arn:[a-z\\\\-]+:s3:[a-z0-9\\\\-]+:\\\\d{12}:access\\\\-grants\\\\/[a-zA-Z0-9\\\\-]+$\"\n            }\n        },\n        \"com.amazonaws.s3control#AccessGrantsInstanceId\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 64\n                },\n                \"smithy.api#pattern\": \"^[a-zA-Z0-9\\\\-]+$\"\n            }\n        },\n        \"com.amazonaws.s3control#AccessGrantsInstancesList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.s3control#ListAccessGrantsInstanceEntry\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"AccessGrantsInstance\"\n                }\n            }\n        },\n        \"com.amazonaws.s3control#AccessGrantsList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.s3control#ListAccessGrantEntry\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"AccessGrant\"\n                }\n            }\n        },\n        \"com.amazonaws.s3control#AccessGrantsLocationArn\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 2048\n                },\n                \"smithy.api#pattern\": \"^arn:[a-z\\\\-]+:s3:[a-z0-9\\\\-]+:\\\\d{12}:access\\\\-grants\\\\/location/[a-zA-Z0-9\\\\-]+$\"\n            }\n        },\n        \"com.amazonaws.s3control#AccessGrantsLocationConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"S3SubPrefix\": {\n                    \"target\": \"com.amazonaws.s3control#S3Prefix\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>S3SubPrefix</code> is appended to the location scope creating the grant scope.\\n         Use this field to narrow the scope of the grant to a subset of the location scope. This\\n         field is required if the location scope is the default location <code>s3://</code> because\\n         you cannot create a grant for all of your S3 data in the Region and must narrow the scope.\\n         For example, if the location scope is the default location <code>s3://</code>, the\\n            <code>S3SubPrefx</code> can be a <bucket-name>/*, so the full grant scope path\\n         would be <code>s3://<bucket-name>/*</code>. Or the <code>S3SubPrefx</code> can be\\n            <code><bucket-name>/<prefix-name>*</code>, so the full grant scope path\\n         would be or <code>s3://<bucket-name>/<prefix-name>*</code>.</p>\\n         <p>If the <code>S3SubPrefix</code> includes a prefix, append the wildcard character\\n            <code>*</code> after the prefix to indicate that you want to include all object key\\n         names in the bucket that start with that prefix. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The configuration options of the S3 Access Grants location. It contains the\\n            <code>S3SubPrefix</code> field. The grant scope, the data to which you are granting\\n         access, is the result of appending the <code>Subprefix</code> field to the scope of the\\n         registered location.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#AccessGrantsLocationId\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 64\n                },\n                \"smithy.api#pattern\": \"^[a-zA-Z0-9\\\\-]+$\"\n            }\n        },\n        \"com.amazonaws.s3control#AccessGrantsLocationsList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.s3control#ListAccessGrantsLocationsEntry\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"AccessGrantsLocation\"\n                }\n            }\n        },\n        \"com.amazonaws.s3control#AccessKeyId\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#sensitive\": {}\n            }\n        },\n        \"com.amazonaws.s3control#AccessPoint\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Name\": {\n                    \"target\": \"com.amazonaws.s3control#AccessPointName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of this access point.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"NetworkOrigin\": {\n                    \"target\": \"com.amazonaws.s3control#NetworkOrigin\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether this access point allows access from the public internet. If\\n            <code>VpcConfiguration</code> is specified for this access point, then\\n            <code>NetworkOrigin</code> is <code>VPC</code>, and the access point doesn't allow access from\\n         the public internet. Otherwise, <code>NetworkOrigin</code> is <code>Internet</code>, and\\n         the access point allows access from the public internet, subject to the access point and bucket access\\n         policies.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"VpcConfiguration\": {\n                    \"target\": \"com.amazonaws.s3control#VpcConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The virtual private cloud (VPC) configuration for this access point, if one exists.</p>\\n         <note>\\n            <p>This element is empty if this access point is an Amazon S3 on Outposts access point that is used by other\\n               Amazon Web Services services.</p>\\n         </note>\"\n                    }\n                },\n                \"Bucket\": {\n                    \"target\": \"com.amazonaws.s3control#AccessPointBucketName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the bucket associated with this access point.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"AccessPointArn\": {\n                    \"target\": \"com.amazonaws.s3control#S3AccessPointArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN for the access point.</p>\"\n                    }\n                },\n                \"Alias\": {\n                    \"target\": \"com.amazonaws.s3control#Alias\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name or alias of the access point.</p>\"\n                    }\n                },\n                \"BucketAccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID associated with the S3 bucket associated with this access point.</p>\"\n                    }\n                },\n                \"DataSourceId\": {\n                    \"target\": \"com.amazonaws.s3control#DataSourceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A unique identifier for the data source of the access point.</p>\"\n                    }\n                },\n                \"DataSourceType\": {\n                    \"target\": \"com.amazonaws.s3control#DataSourceType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of the data source that the access point is attached to.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>An access point used to access a bucket.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#AccessPointBucketName\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 255\n                }\n            }\n        },\n        \"com.amazonaws.s3control#AccessPointList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.s3control#AccessPoint\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"AccessPoint\"\n                }\n            }\n        },\n        \"com.amazonaws.s3control#AccessPointName\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 3,\n                    \"max\": 255\n                }\n            }\n        },\n        \"com.amazonaws.s3control#AccountId\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 64\n                },\n                \"smithy.api#pattern\": \"^\\\\d{12}$\"\n            }\n        },\n        \"com.amazonaws.s3control#AccountLevel\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ActivityMetrics\": {\n                    \"target\": \"com.amazonaws.s3control#ActivityMetrics\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A container element for S3 Storage Lens activity metrics.</p>\"\n                    }\n                },\n                \"BucketLevel\": {\n                    \"target\": \"com.amazonaws.s3control#BucketLevel\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A container element for the S3 Storage Lens bucket-level configuration.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"AdvancedCostOptimizationMetrics\": {\n                    \"target\": \"com.amazonaws.s3control#AdvancedCostOptimizationMetrics\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A container element for S3 Storage Lens advanced cost-optimization metrics.</p>\"\n                    }\n                },\n                \"AdvancedDataProtectionMetrics\": {\n                    \"target\": \"com.amazonaws.s3control#AdvancedDataProtectionMetrics\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A container element for S3 Storage Lens advanced data-protection metrics.</p>\"\n                    }\n                },\n                \"DetailedStatusCodesMetrics\": {\n                    \"target\": \"com.amazonaws.s3control#DetailedStatusCodesMetrics\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A container element for detailed status code metrics. </p>\"\n                    }\n                },\n                \"StorageLensGroupLevel\": {\n                    \"target\": \"com.amazonaws.s3control#StorageLensGroupLevel\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>\\nA container element for S3 Storage Lens groups metrics.\\n</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A container element for the account-level Amazon S3 Storage Lens configuration.</p>\\n         <p>For more information about S3 Storage Lens, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage_lens.html\\\">Assessing your storage activity and usage with S3 Storage Lens</a> in the <i>Amazon S3 User Guide</i>. For a complete list of S3 Storage Lens metrics, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage_lens_metrics_glossary.html\\\">S3 Storage Lens metrics glossary</a> in the <i>Amazon S3 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#ActivityMetrics\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"IsEnabled\": {\n                    \"target\": \"com.amazonaws.s3control#IsEnabled\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>A container that indicates whether activity metrics are enabled.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The container element for Amazon S3 Storage Lens activity metrics. Activity metrics show details\\n         about how your storage is requested, such as requests (for example, All requests, Get\\n         requests, Put requests), bytes uploaded or downloaded, and errors.</p>\\n         <p>For more information about S3 Storage Lens, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage_lens.html\\\">Assessing your storage activity and usage with S3 Storage Lens</a> in the <i>Amazon S3 User Guide</i>. For a complete list of S3 Storage Lens metrics, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage_lens_metrics_glossary.html\\\">S3 Storage Lens metrics glossary</a> in the <i>Amazon S3 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#AdvancedCostOptimizationMetrics\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"IsEnabled\": {\n                    \"target\": \"com.amazonaws.s3control#IsEnabled\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>A container that indicates whether advanced cost-optimization metrics are\\n         enabled.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The container element for Amazon S3 Storage Lens advanced cost-optimization metrics. Advanced\\n         cost-optimization metrics provide insights that you can use to manage and optimize your\\n         storage costs, for example, lifecycle rule counts for transitions, expirations, and\\n         incomplete multipart uploads.</p>\\n         <p>For more information about S3 Storage Lens, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage_lens.html\\\">Assessing your storage activity and usage with S3 Storage Lens</a> in the <i>Amazon S3 User Guide</i>. For a complete list of S3 Storage Lens metrics, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage_lens_metrics_glossary.html\\\">S3 Storage Lens metrics glossary</a> in the <i>Amazon S3 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#AdvancedDataProtectionMetrics\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"IsEnabled\": {\n                    \"target\": \"com.amazonaws.s3control#IsEnabled\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>A container that indicates whether advanced data-protection metrics are enabled.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The container element for Amazon S3 Storage Lens advanced data-protection metrics. Advanced\\n         data-protection metrics provide insights that you can use to perform audits and protect\\n         your data, for example replication rule counts within and across Regions.</p>\\n         <p>For more information about S3 Storage Lens, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage_lens.html\\\">Assessing your storage activity and usage with S3 Storage Lens</a> in the <i>Amazon S3 User Guide</i>. For a complete list of S3 Storage Lens metrics, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage_lens_metrics_glossary.html\\\">S3 Storage Lens metrics glossary</a> in the <i>Amazon S3 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#Alias\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 63\n                },\n                \"smithy.api#pattern\": \"^[0-9a-z\\\\\\\\-]{63}$\"\n            }\n        },\n        \"com.amazonaws.s3control#AssociateAccessGrantsIdentityCenter\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#AssociateAccessGrantsIdentityCenterRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Associate your S3 Access Grants instance with an Amazon Web Services IAM Identity Center instance. Use this\\n         action if you want to create access grants for users or groups from your corporate identity\\n         directory. First, you must add your corporate identity directory to Amazon Web Services IAM Identity\\n         Center. Then, you can associate this IAM Identity Center instance with your S3 Access Grants\\n         instance.</p>\\n         <dl>\\n            <dt>Permissions</dt>\\n            <dd>\\n               <p>You must have the <code>s3:AssociateAccessGrantsIdentityCenter</code>\\n                  permission to use this operation. </p>\\n            </dd>\\n            <dt>Additional Permissions</dt>\\n            <dd>\\n               <p>You must also have the following permissions:\\n                     <code>sso:CreateApplication</code>, <code>sso:PutApplicationGrant</code>, and\\n                     <code>sso:PutApplicationAuthenticationMethod</code>. </p>\\n            </dd>\\n         </dl>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"POST\",\n                    \"uri\": \"/v20180820/accessgrantsinstance/identitycenter\",\n                    \"code\": 200\n                },\n                \"smithy.api#httpChecksumRequired\": {},\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#AssociateAccessGrantsIdentityCenterRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID of the S3 Access Grants instance.</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                },\n                \"IdentityCenterArn\": {\n                    \"target\": \"com.amazonaws.s3control#IdentityCenterArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the Amazon Web Services IAM Identity Center instance that you are\\n         associating with your S3 Access Grants instance. An IAM Identity Center instance is your corporate\\n         identity directory that you added to the IAM Identity Center. You can use the <a href=\\\"https://docs.aws.amazon.com/singlesignon/latest/APIReference/API_ListInstances.html\\\">ListInstances</a> API operation to retrieve a list of your Identity Center\\n         instances and their ARNs.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#AsyncCreationTimestamp\": {\n            \"type\": \"timestamp\"\n        },\n        \"com.amazonaws.s3control#AsyncErrorDetails\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Code\": {\n                    \"target\": \"com.amazonaws.s3control#MaxLength1024String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A string that uniquely identifies the error condition.</p>\"\n                    }\n                },\n                \"Message\": {\n                    \"target\": \"com.amazonaws.s3control#MaxLength1024String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A generic description of the error condition in English.</p>\"\n                    }\n                },\n                \"Resource\": {\n                    \"target\": \"com.amazonaws.s3control#MaxLength1024String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The identifier of the resource associated with the error.</p>\"\n                    }\n                },\n                \"RequestId\": {\n                    \"target\": \"com.amazonaws.s3control#MaxLength1024String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the request associated with the error.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Error details for the failed asynchronous operation.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#AsyncOperation\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CreationTime\": {\n                    \"target\": \"com.amazonaws.s3control#AsyncCreationTimestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time that the request was sent to the service.</p>\"\n                    }\n                },\n                \"Operation\": {\n                    \"target\": \"com.amazonaws.s3control#AsyncOperationName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The specific operation for the asynchronous request.</p>\"\n                    }\n                },\n                \"RequestTokenARN\": {\n                    \"target\": \"com.amazonaws.s3control#AsyncRequestTokenARN\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The request token associated with the request.</p>\"\n                    }\n                },\n                \"RequestParameters\": {\n                    \"target\": \"com.amazonaws.s3control#AsyncRequestParameters\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The parameters associated with the request.</p>\"\n                    }\n                },\n                \"RequestStatus\": {\n                    \"target\": \"com.amazonaws.s3control#AsyncRequestStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The current status of the request.</p>\"\n                    }\n                },\n                \"ResponseDetails\": {\n                    \"target\": \"com.amazonaws.s3control#AsyncResponseDetails\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The details of the response.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A container for the information about an asynchronous operation.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#AsyncOperationName\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"CreateMultiRegionAccessPoint\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"CreateMultiRegionAccessPoint\"\n                    }\n                },\n                \"DeleteMultiRegionAccessPoint\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DeleteMultiRegionAccessPoint\"\n                    }\n                },\n                \"PutMultiRegionAccessPointPolicy\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"PutMultiRegionAccessPointPolicy\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#AsyncRequestParameters\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CreateMultiRegionAccessPointRequest\": {\n                    \"target\": \"com.amazonaws.s3control#CreateMultiRegionAccessPointInput\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A container of the parameters for a <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_CreateMultiRegionAccessPoint.html\\\">CreateMultiRegionAccessPoint</a> request.</p>\"\n                    }\n                },\n                \"DeleteMultiRegionAccessPointRequest\": {\n                    \"target\": \"com.amazonaws.s3control#DeleteMultiRegionAccessPointInput\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A container of the parameters for a <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_DeleteMultiRegionAccessPoint.html\\\">DeleteMultiRegionAccessPoint</a> request.</p>\"\n                    }\n                },\n                \"PutMultiRegionAccessPointPolicyRequest\": {\n                    \"target\": \"com.amazonaws.s3control#PutMultiRegionAccessPointPolicyInput\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A container of the parameters for a <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_PutMultiRegionAccessPoint.html\\\">PutMultiRegionAccessPoint</a> request.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A container for the request parameters associated with an asynchronous request.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#AsyncRequestStatus\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.s3control#AsyncRequestTokenARN\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 1024\n                },\n                \"smithy.api#pattern\": \"^arn:.+$\"\n            }\n        },\n        \"com.amazonaws.s3control#AsyncResponseDetails\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"MultiRegionAccessPointDetails\": {\n                    \"target\": \"com.amazonaws.s3control#MultiRegionAccessPointsAsyncResponse\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The details for the Multi-Region Access Point.</p>\"\n                    }\n                },\n                \"ErrorDetails\": {\n                    \"target\": \"com.amazonaws.s3control#AsyncErrorDetails\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Error details for an asynchronous request.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A container for the response details that are returned when querying about an\\n         asynchronous request.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#AwsLambdaTransformation\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"FunctionArn\": {\n                    \"target\": \"com.amazonaws.s3control#FunctionArnString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the Lambda function.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"FunctionPayload\": {\n                    \"target\": \"com.amazonaws.s3control#AwsLambdaTransformationPayload\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Additional JSON that provides supplemental data to the Lambda function used to transform\\n         objects.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Lambda function used to transform objects through an Object Lambda Access Point.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#AwsLambdaTransformationPayload\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.s3control#AwsOrgArn\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 1024\n                },\n                \"smithy.api#pattern\": \"^arn:[a-z\\\\-]+:organizations::\\\\d{12}:organization\\\\/o-[a-z0-9]{10,32}$\"\n            }\n        },\n        \"com.amazonaws.s3control#BadRequestException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Message\": {\n                    \"target\": \"com.amazonaws.s3control#ExceptionMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p></p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.s3control#Boolean\": {\n            \"type\": \"boolean\",\n            \"traits\": {\n                \"smithy.api#default\": false\n            }\n        },\n        \"com.amazonaws.s3control#BucketAlreadyExists\": {\n            \"type\": \"structure\",\n            \"members\": {},\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The requested Outposts bucket name is not available. The bucket namespace is shared by\\n         all users of the Outposts in this Region. Select a different name and try\\n         again.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.s3control#BucketAlreadyOwnedByYou\": {\n            \"type\": \"structure\",\n            \"members\": {},\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The Outposts bucket you tried to create already exists, and you own it. </p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.s3control#BucketCannedACL\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"private\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"private\"\n                    }\n                },\n                \"public_read\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"public-read\"\n                    }\n                },\n                \"public_read_write\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"public-read-write\"\n                    }\n                },\n                \"authenticated_read\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"authenticated-read\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#BucketIdentifierString\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.s3control#BucketLevel\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ActivityMetrics\": {\n                    \"target\": \"com.amazonaws.s3control#ActivityMetrics\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A container for the bucket-level activity metrics for S3 Storage Lens.</p>\"\n                    }\n                },\n                \"PrefixLevel\": {\n                    \"target\": \"com.amazonaws.s3control#PrefixLevel\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A container for the prefix-level metrics for S3 Storage Lens. </p>\"\n                    }\n                },\n                \"AdvancedCostOptimizationMetrics\": {\n                    \"target\": \"com.amazonaws.s3control#AdvancedCostOptimizationMetrics\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A container for bucket-level advanced cost-optimization metrics for S3 Storage Lens.</p>\"\n                    }\n                },\n                \"AdvancedDataProtectionMetrics\": {\n                    \"target\": \"com.amazonaws.s3control#AdvancedDataProtectionMetrics\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A container for bucket-level advanced data-protection metrics for S3 Storage Lens.</p>\"\n                    }\n                },\n                \"DetailedStatusCodesMetrics\": {\n                    \"target\": \"com.amazonaws.s3control#DetailedStatusCodesMetrics\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A container for bucket-level detailed status code metrics for S3 Storage Lens.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A container for the bucket-level configuration for Amazon S3 Storage Lens.</p>\\n         <p>For more information about S3 Storage Lens, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage_lens.html\\\">Assessing your storage activity and usage with S3 Storage Lens</a> in the <i>Amazon S3 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#BucketLocationConstraint\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"EU\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"EU\"\n                    }\n                },\n                \"eu_west_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"eu-west-1\"\n                    }\n                },\n                \"us_west_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"us-west-1\"\n                    }\n                },\n                \"us_west_2\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"us-west-2\"\n                    }\n                },\n                \"ap_south_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ap-south-1\"\n                    }\n                },\n                \"ap_southeast_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ap-southeast-1\"\n                    }\n                },\n                \"ap_southeast_2\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ap-southeast-2\"\n                    }\n                },\n                \"ap_northeast_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ap-northeast-1\"\n                    }\n                },\n                \"sa_east_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"sa-east-1\"\n                    }\n                },\n                \"cn_north_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"cn-north-1\"\n                    }\n                },\n                \"eu_central_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"eu-central-1\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#BucketName\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 3,\n                    \"max\": 255\n                }\n            }\n        },\n        \"com.amazonaws.s3control#BucketVersioningStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"Enabled\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Enabled\"\n                    }\n                },\n                \"Suspended\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Suspended\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#Buckets\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.s3control#S3BucketArnString\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"Arn\"\n                }\n            }\n        },\n        \"com.amazonaws.s3control#CallerAccessGrantsList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.s3control#ListCallerAccessGrantsEntry\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"AccessGrant\"\n                }\n            }\n        },\n        \"com.amazonaws.s3control#CloudWatchMetrics\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"IsEnabled\": {\n                    \"target\": \"com.amazonaws.s3control#IsEnabled\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>A container that indicates whether CloudWatch publishing for S3 Storage Lens metrics is enabled. A\\n         value of <code>true</code> indicates that CloudWatch publishing for S3 Storage Lens metrics is\\n         enabled.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A container for enabling Amazon CloudWatch publishing for S3 Storage Lens metrics.</p>\\n         <p>For more information about publishing S3 Storage Lens metrics to CloudWatch, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage_lens_view_metrics_cloudwatch.html\\\">Monitor\\n            S3 Storage Lens metrics in CloudWatch</a> in the <i>Amazon S3 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#ComputeObjectChecksumAlgorithm\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"CRC32\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"CRC32\"\n                    }\n                },\n                \"CRC32C\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"CRC32C\"\n                    }\n                },\n                \"CRC64NVME\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"CRC64NVME\"\n                    }\n                },\n                \"MD5\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"MD5\"\n                    }\n                },\n                \"SHA1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"SHA1\"\n                    }\n                },\n                \"SHA256\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"SHA256\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#ComputeObjectChecksumType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"FULL_OBJECT\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"FULL_OBJECT\"\n                    }\n                },\n                \"COMPOSITE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"COMPOSITE\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#ConfigId\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 64\n                },\n                \"smithy.api#pattern\": \"^[a-zA-Z0-9\\\\-\\\\_\\\\.]+$\"\n            }\n        },\n        \"com.amazonaws.s3control#ConfirmRemoveSelfBucketAccess\": {\n            \"type\": \"boolean\",\n            \"traits\": {\n                \"smithy.api#default\": false\n            }\n        },\n        \"com.amazonaws.s3control#ConfirmationRequired\": {\n            \"type\": \"boolean\",\n            \"traits\": {\n                \"smithy.api#default\": false\n            }\n        },\n        \"com.amazonaws.s3control#ContinuationToken\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.s3control#CreateAccessGrant\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#CreateAccessGrantRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.s3control#CreateAccessGrantResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates an access grant that gives a grantee access to your S3 data. The grantee can be\\n         an IAM user or role or a directory user, or group. Before you can create a grant, you\\n         must have an S3 Access Grants instance in the same Region as the S3 data. You can create an S3 Access Grants\\n         instance using the <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_CreateAccessGrantsInstance.html\\\">CreateAccessGrantsInstance</a>. You must also have registered at least one S3 data\\n         location in your S3 Access Grants instance using <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_CreateAccessGrantsLocation.html\\\">CreateAccessGrantsLocation</a>. </p>\\n         <dl>\\n            <dt>Permissions</dt>\\n            <dd>\\n               <p>You must have the <code>s3:CreateAccessGrant</code> permission to use this\\n                  operation. </p>\\n            </dd>\\n            <dt>Additional Permissions</dt>\\n            <dd>\\n               <p>For any directory identity - <code>sso:DescribeInstance</code> and\\n                     <code>sso:DescribeApplication</code>\\n               </p>\\n               <p>For directory users - <code>identitystore:DescribeUser</code>\\n               </p>\\n               <p>For directory groups - <code>identitystore:DescribeGroup</code>\\n               </p>\\n            </dd>\\n         </dl>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"POST\",\n                    \"uri\": \"/v20180820/accessgrantsinstance/grant\",\n                    \"code\": 200\n                },\n                \"smithy.api#httpChecksumRequired\": {},\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#CreateAccessGrantRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID of the S3 Access Grants instance.</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                },\n                \"AccessGrantsLocationId\": {\n                    \"target\": \"com.amazonaws.s3control#AccessGrantsLocationId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the registered location to which you are granting access. S3 Access Grants assigns this\\n         ID when you register the location. S3 Access Grants assigns the ID <code>default</code> to the\\n         default location <code>s3://</code> and assigns an auto-generated ID to other locations\\n         that you register. </p>\\n         <p>If you are passing the <code>default</code> location, you cannot create an access grant\\n         for the entire default location. You must also specify a bucket or a bucket and prefix in\\n         the <code>Subprefix</code> field. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"AccessGrantsLocationConfiguration\": {\n                    \"target\": \"com.amazonaws.s3control#AccessGrantsLocationConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The configuration options of the grant location. The grant location is the S3 path to\\n         the data to which you are granting access. It contains the <code>S3SubPrefix</code> field.\\n         The grant scope is the result of appending the subprefix to the location scope of the\\n         registered location.</p>\"\n                    }\n                },\n                \"Grantee\": {\n                    \"target\": \"com.amazonaws.s3control#Grantee\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The user, group, or role to which you are granting access. You can grant access to an\\n         IAM user or role. If you have added your corporate directory to Amazon Web Services IAM Identity\\n         Center and associated your Identity Center instance with your S3 Access Grants instance, the grantee\\n         can also be a corporate directory user or group.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Permission\": {\n                    \"target\": \"com.amazonaws.s3control#Permission\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of access that you are granting to your S3 data, which can be set to one of the\\n         following values:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>READ</code> – Grant read-only access to the S3 data.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>WRITE</code> – Grant write-only access to the S3 data.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>READWRITE</code> – Grant both read and write access to the S3 data.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ApplicationArn\": {\n                    \"target\": \"com.amazonaws.s3control#IdentityCenterApplicationArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of an Amazon Web Services IAM Identity Center application associated\\n         with your Identity Center instance. If an application ARN is included in the request to\\n         create an access grant, the grantee can only access the S3 data through this application.\\n      </p>\"\n                    }\n                },\n                \"S3PrefixType\": {\n                    \"target\": \"com.amazonaws.s3control#S3PrefixType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of <code>S3SubPrefix</code>. The only possible value is <code>Object</code>.\\n         Pass this value if the access grant scope is an object. Do not pass this value if the\\n         access grant scope is a bucket or a bucket and a prefix. </p>\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.s3control#TagList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services resource tags that you are adding to the access grant. Each tag is a label\\n         consisting of a user-defined key and value. Tags can help you manage, identify, organize,\\n         search for, and filter resources. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#CreateAccessGrantResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CreatedAt\": {\n                    \"target\": \"com.amazonaws.s3control#CreationTimestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time when you created the access grant. </p>\"\n                    }\n                },\n                \"AccessGrantId\": {\n                    \"target\": \"com.amazonaws.s3control#AccessGrantId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the access grant. S3 Access Grants auto-generates this ID when you create the access\\n         grant.</p>\"\n                    }\n                },\n                \"AccessGrantArn\": {\n                    \"target\": \"com.amazonaws.s3control#AccessGrantArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the access grant. </p>\"\n                    }\n                },\n                \"Grantee\": {\n                    \"target\": \"com.amazonaws.s3control#Grantee\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The user, group, or role to which you are granting access. You can grant access to an\\n         IAM user or role. If you have added your corporate directory to Amazon Web Services IAM Identity\\n         Center and associated your Identity Center instance with your S3 Access Grants instance, the grantee\\n         can also be a corporate directory user or group.</p>\"\n                    }\n                },\n                \"AccessGrantsLocationId\": {\n                    \"target\": \"com.amazonaws.s3control#AccessGrantsLocationId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the registered location to which you are granting access. S3 Access Grants assigns this\\n         ID when you register the location. S3 Access Grants assigns the ID <code>default</code> to the\\n         default location <code>s3://</code> and assigns an auto-generated ID to other locations\\n         that you register. </p>\"\n                    }\n                },\n                \"AccessGrantsLocationConfiguration\": {\n                    \"target\": \"com.amazonaws.s3control#AccessGrantsLocationConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The configuration options of the grant location. The grant location is the S3 path to\\n         the data to which you are granting access. </p>\"\n                    }\n                },\n                \"Permission\": {\n                    \"target\": \"com.amazonaws.s3control#Permission\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of access that you are granting to your S3 data, which can be set to one of the\\n         following values:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>READ</code> – Grant read-only access to the S3 data.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>WRITE</code> – Grant write-only access to the S3 data.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>READWRITE</code> – Grant both read and write access to the S3 data.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"ApplicationArn\": {\n                    \"target\": \"com.amazonaws.s3control#IdentityCenterApplicationArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of an Amazon Web Services IAM Identity Center application associated\\n         with your Identity Center instance. If the grant includes an application ARN, the grantee\\n         can only access the S3 data through this application. </p>\"\n                    }\n                },\n                \"GrantScope\": {\n                    \"target\": \"com.amazonaws.s3control#S3Prefix\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The S3 path of the data to which you are granting access. It is the result of appending\\n         the <code>Subprefix</code> to the location scope. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.s3control#CreateAccessGrantsInstance\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#CreateAccessGrantsInstanceRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.s3control#CreateAccessGrantsInstanceResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates an S3 Access Grants instance, which serves as a logical grouping for access grants. You\\n         can create one S3 Access Grants instance per Region per account. </p>\\n         <dl>\\n            <dt>Permissions</dt>\\n            <dd>\\n               <p>You must have the <code>s3:CreateAccessGrantsInstance</code> permission to use\\n                  this operation. </p>\\n            </dd>\\n            <dt>Additional Permissions</dt>\\n            <dd>\\n               <p>To associate an IAM Identity Center instance with your S3 Access Grants instance, you\\n                  must also have the <code>sso:DescribeInstance</code>,\\n                     <code>sso:CreateApplication</code>, <code>sso:PutApplicationGrant</code>, and\\n                     <code>sso:PutApplicationAuthenticationMethod</code> permissions. </p>\\n            </dd>\\n         </dl>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"POST\",\n                    \"uri\": \"/v20180820/accessgrantsinstance\",\n                    \"code\": 200\n                },\n                \"smithy.api#httpChecksumRequired\": {},\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#CreateAccessGrantsInstanceRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID of the S3 Access Grants instance.</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                },\n                \"IdentityCenterArn\": {\n                    \"target\": \"com.amazonaws.s3control#IdentityCenterArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If you would like to associate your S3 Access Grants instance with an Amazon Web Services IAM Identity Center\\n         instance, use this field to pass the Amazon Resource Name (ARN) of the Amazon Web Services IAM Identity\\n         Center instance that you are associating with your S3 Access Grants instance. An IAM Identity\\n         Center instance is your corporate identity directory that you added to the IAM Identity\\n         Center. You can use the <a href=\\\"https://docs.aws.amazon.com/singlesignon/latest/APIReference/API_ListInstances.html\\\">ListInstances</a> API\\n         operation to retrieve a list of your Identity Center instances and their ARNs. </p>\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.s3control#TagList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services resource tags that you are adding to the S3 Access Grants instance. Each tag is a label\\n         consisting of a user-defined key and value. Tags can help you manage, identify, organize,\\n         search for, and filter resources. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#CreateAccessGrantsInstanceResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CreatedAt\": {\n                    \"target\": \"com.amazonaws.s3control#CreationTimestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time when you created the S3 Access Grants instance. </p>\"\n                    }\n                },\n                \"AccessGrantsInstanceId\": {\n                    \"target\": \"com.amazonaws.s3control#AccessGrantsInstanceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the S3 Access Grants instance. The ID is <code>default</code>. You can have one S3 Access Grants\\n         instance per Region per account. </p>\"\n                    }\n                },\n                \"AccessGrantsInstanceArn\": {\n                    \"target\": \"com.amazonaws.s3control#AccessGrantsInstanceArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the Amazon Web Services IAM Identity Center instance that you are\\n         associating with your S3 Access Grants instance. An IAM Identity Center instance is your corporate\\n         identity directory that you added to the IAM Identity Center. You can use the <a href=\\\"https://docs.aws.amazon.com/singlesignon/latest/APIReference/API_ListInstances.html\\\">ListInstances</a> API operation to retrieve a list of your Identity Center\\n         instances and their ARNs.</p>\"\n                    }\n                },\n                \"IdentityCenterArn\": {\n                    \"target\": \"com.amazonaws.s3control#IdentityCenterArn\",\n                    \"traits\": {\n                        \"smithy.api#deprecated\": {\n                            \"message\": \"IdentityCenterArn has been deprecated. Use IdentityCenterInstanceArn or IdentityCenterApplicationArn.\"\n                        },\n                        \"smithy.api#documentation\": \"<p>If you associated your S3 Access Grants instance with an Amazon Web Services IAM Identity Center instance,\\n         this field returns the Amazon Resource Name (ARN) of the IAM Identity Center instance\\n         application; a subresource of the original Identity Center instance. S3 Access Grants creates this\\n         Identity Center application for the specific S3 Access Grants instance. </p>\"\n                    }\n                },\n                \"IdentityCenterInstanceArn\": {\n                    \"target\": \"com.amazonaws.s3control#IdentityCenterArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the Amazon Web Services IAM Identity Center instance that you are\\n         associating with your S3 Access Grants instance. An IAM Identity Center instance is your corporate\\n         identity directory that you added to the IAM Identity Center. You can use the <a href=\\\"https://docs.aws.amazon.com/singlesignon/latest/APIReference/API_ListInstances.html\\\">ListInstances</a> API operation to retrieve a list of your Identity Center\\n         instances and their ARNs.</p>\"\n                    }\n                },\n                \"IdentityCenterApplicationArn\": {\n                    \"target\": \"com.amazonaws.s3control#IdentityCenterApplicationArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If you associated your S3 Access Grants instance with an Amazon Web Services IAM Identity Center instance,\\n         this field returns the Amazon Resource Name (ARN) of the IAM Identity Center instance\\n         application; a subresource of the original Identity Center instance. S3 Access Grants creates this\\n         Identity Center application for the specific S3 Access Grants instance. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.s3control#CreateAccessGrantsLocation\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#CreateAccessGrantsLocationRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.s3control#CreateAccessGrantsLocationResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The S3 data location that you would like to register in your S3 Access Grants instance. Your S3\\n         data must be in the same Region as your S3 Access Grants instance. The location can be one of the\\n         following: </p>\\n         <ul>\\n            <li>\\n               <p>The default S3 location <code>s3://</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>A bucket - <code>S3://<bucket-name></code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>A bucket and prefix - <code>S3://<bucket-name>/<prefix></code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>When you register a location, you must include the IAM role that has permission to\\n         manage the S3 location that you are registering. Give S3 Access Grants permission to assume this role\\n            <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-grants-location.html\\\">using a policy</a>. S3 Access Grants assumes this role to manage access to the location and\\n         to vend temporary credentials to grantees or client applications. </p>\\n         <dl>\\n            <dt>Permissions</dt>\\n            <dd>\\n               <p>You must have the <code>s3:CreateAccessGrantsLocation</code> permission to use\\n                  this operation. </p>\\n            </dd>\\n            <dt>Additional Permissions</dt>\\n            <dd>\\n               <p>You must also have the following permission for the specified IAM role:\\n                     <code>iam:PassRole</code>\\n               </p>\\n            </dd>\\n         </dl>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"POST\",\n                    \"uri\": \"/v20180820/accessgrantsinstance/location\",\n                    \"code\": 200\n                },\n                \"smithy.api#httpChecksumRequired\": {},\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#CreateAccessGrantsLocationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID of the S3 Access Grants instance.</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                },\n                \"LocationScope\": {\n                    \"target\": \"com.amazonaws.s3control#S3Prefix\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The S3 path to the location that you are registering. The location scope can be the\\n         default S3 location <code>s3://</code>, the S3 path to a bucket\\n            <code>s3://<bucket></code>, or the S3 path to a bucket and prefix\\n            <code>s3://<bucket>/<prefix></code>. A prefix in S3 is a string of\\n         characters at the beginning of an object key name used to organize the objects that you\\n         store in your S3 buckets. For example, object key names that start with the\\n            <code>engineering/</code> prefix or object key names that start with the\\n            <code>marketing/campaigns/</code> prefix.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"IAMRoleArn\": {\n                    \"target\": \"com.amazonaws.s3control#IAMRoleArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the IAM role for the registered location. S3 Access Grants\\n         assumes this role to manage access to the registered location. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.s3control#TagList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services resource tags that you are adding to the S3 Access Grants location. Each tag is a label\\n         consisting of a user-defined key and value. Tags can help you manage, identify, organize,\\n         search for, and filter resources.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#CreateAccessGrantsLocationResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CreatedAt\": {\n                    \"target\": \"com.amazonaws.s3control#CreationTimestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time when you registered the location. </p>\"\n                    }\n                },\n                \"AccessGrantsLocationId\": {\n                    \"target\": \"com.amazonaws.s3control#AccessGrantsLocationId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the registered location to which you are granting access. S3 Access Grants assigns this\\n         ID when you register the location. S3 Access Grants assigns the ID <code>default</code> to the\\n         default location <code>s3://</code> and assigns an auto-generated ID to other locations\\n         that you register. </p>\"\n                    }\n                },\n                \"AccessGrantsLocationArn\": {\n                    \"target\": \"com.amazonaws.s3control#AccessGrantsLocationArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the location you are registering.</p>\"\n                    }\n                },\n                \"LocationScope\": {\n                    \"target\": \"com.amazonaws.s3control#S3Prefix\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The S3 URI path to the location that you are registering. The location scope can be the\\n         default S3 location <code>s3://</code>, the S3 path to a bucket, or the S3 path to a bucket\\n         and prefix. A prefix in S3 is a string of characters at the beginning of an object key name\\n         used to organize the objects that you store in your S3 buckets. For example, object key\\n         names that start with the <code>engineering/</code> prefix or object key names that start\\n         with the <code>marketing/campaigns/</code> prefix.</p>\"\n                    }\n                },\n                \"IAMRoleArn\": {\n                    \"target\": \"com.amazonaws.s3control#IAMRoleArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the IAM role for the registered location. S3 Access Grants\\n         assumes this role to manage access to the registered location. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.s3control#CreateAccessPoint\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#CreateAccessPointRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.s3control#CreateAccessPointResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates an access point and associates it to a specified bucket. For more information, see\\n            <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-points.html\\\">Managing\\n            access to shared datasets with access points</a> or <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-points-directory-buckets.html\\\">Managing access to\\n            shared datasets in directory buckets with access points</a> in the\\n            <i>Amazon S3 User Guide</i>.</p>\\n         <p>To create an access point and attach it to a volume on an Amazon FSx file system, see <a href=\\\"https://docs.aws.amazon.com/fsx/latest/APIReference/API_CreateAndAttachS3AccessPoint.html\\\">CreateAndAttachS3AccessPoint</a> in the <i>Amazon FSx API\\n         Reference</i>.</p>\\n         <p></p>\\n         <note>\\n            <p>S3 on Outposts only supports VPC-style access points. </p>\\n            <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html\\\"> Accessing Amazon S3 on Outposts using\\n               virtual private cloud (VPC) only access points</a> in the\\n               <i>Amazon S3 User Guide</i>.</p>\\n         </note>\\n         <p>All Amazon S3 on Outposts REST API requests for this action require an additional parameter of <code>x-amz-outpost-id</code> to be passed with the request. In addition, you must use an S3 on Outposts endpoint hostname prefix instead of <code>s3-control</code>. For an example of the request syntax for Amazon S3 on Outposts that uses the S3 on Outposts endpoint hostname prefix and the <code>x-amz-outpost-id</code> derived by using the access point ARN, see the <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_CreateAccessPoint.html#API_control_CreateAccessPoint_Examples\\\">Examples</a> section.</p>\\n         <p></p>\\n         <p>The following actions are related to <code>CreateAccessPoint</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_GetAccessPoint.html\\\">GetAccessPoint</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_DeleteAccessPoint.html\\\">DeleteAccessPoint</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_ListAccessPoints.html\\\">ListAccessPoints</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_ListAccessPointsForDirectoryBuckets.html\\\">ListAccessPointsForDirectoryBuckets</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"PUT\",\n                    \"uri\": \"/v20180820/accesspoint/{Name}\",\n                    \"code\": 200\n                },\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#CreateAccessPointForObjectLambda\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#CreateAccessPointForObjectLambdaRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.s3control#CreateAccessPointForObjectLambdaResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported by directory buckets.</p>\\n         </note>\\n         <p>Creates an Object Lambda Access Point. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/transforming-objects.html\\\">Transforming objects with\\n            Object Lambda Access Points</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <p>The following actions are related to\\n         <code>CreateAccessPointForObjectLambda</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_DeleteAccessPointForObjectLambda.html\\\">DeleteAccessPointForObjectLambda</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_GetAccessPointForObjectLambda.html\\\">GetAccessPointForObjectLambda</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_ListAccessPointsForObjectLambda.html\\\">ListAccessPointsForObjectLambda</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"PUT\",\n                    \"uri\": \"/v20180820/accesspointforobjectlambda/{Name}\",\n                    \"code\": 200\n                },\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#CreateAccessPointForObjectLambdaRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID for owner of the specified Object Lambda Access Point.</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                },\n                \"Name\": {\n                    \"target\": \"com.amazonaws.s3control#ObjectLambdaAccessPointName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name you want to assign to this Object Lambda Access Point.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Configuration\": {\n                    \"target\": \"com.amazonaws.s3control#ObjectLambdaConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Object Lambda Access Point configuration as a JSON document.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#CreateAccessPointForObjectLambdaResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ObjectLambdaAccessPointArn\": {\n                    \"target\": \"com.amazonaws.s3control#ObjectLambdaAccessPointArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the ARN for the Object Lambda Access Point.</p>\"\n                    }\n                },\n                \"Alias\": {\n                    \"target\": \"com.amazonaws.s3control#ObjectLambdaAccessPointAlias\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The alias of the Object Lambda Access Point.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.s3control#CreateAccessPointRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID for the account that owns the specified access point.</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                },\n                \"Name\": {\n                    \"target\": \"com.amazonaws.s3control#AccessPointName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name you want to assign to this access point.</p>\\n         <p>For directory buckets, the access point name must consist of a base name that you provide and\\n         suffix that includes the <code>ZoneID</code> (Amazon Web Services Availability Zone or Local Zone) of your bucket location,\\n         followed by <code>--xa-s3</code>. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-points-directory-buckets.html\\\">Managing access to shared datasets in directory buckets with\\n            access points</a> in the <i>Amazon S3 User Guide</i>.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccessPointName\"\n                        }\n                    }\n                },\n                \"Bucket\": {\n                    \"target\": \"com.amazonaws.s3control#BucketName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the bucket that you want to associate this access point with.</p>\\n         <p>For using this parameter with Amazon S3 on Outposts with the REST API, you must specify the name and the x-amz-outpost-id as well.</p>\\n         <p>For using this parameter with S3 on Outposts with the Amazon Web Services SDK and CLI, you must  specify the ARN of the bucket accessed in the format <code>arn:aws:s3-outposts:<Region>:<account-id>:outpost/<outpost-id>/bucket/<my-bucket-name></code>. For example, to access the bucket <code>reports</code> through Outpost <code>my-outpost</code> owned by account <code>123456789012</code> in Region <code>us-west-2</code>, use the URL encoding of <code>arn:aws:s3-outposts:us-west-2:123456789012:outpost/my-outpost/bucket/reports</code>. The value must be URL encoded.  </p>\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"Bucket\"\n                        }\n                    }\n                },\n                \"VpcConfiguration\": {\n                    \"target\": \"com.amazonaws.s3control#VpcConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If you include this field, Amazon S3 restricts access to this access point to requests from the\\n         specified virtual private cloud (VPC).</p>\\n         <note>\\n            <p>This is required for creating an access point for Amazon S3 on Outposts buckets.</p>\\n         </note>\"\n                    }\n                },\n                \"PublicAccessBlockConfiguration\": {\n                    \"target\": \"com.amazonaws.s3control#PublicAccessBlockConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The <code>PublicAccessBlock</code> configuration that you want to apply to the access point.\\n      </p>\"\n                    }\n                },\n                \"BucketAccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID associated with the S3 bucket associated with this access point.</p>\\n         <p>For same account access point when your bucket and access point belong to the same account owner, the\\n            <code>BucketAccountId</code> is not required. For cross-account access point when your bucket\\n         and access point are not in the same account, the <code>BucketAccountId</code> is required. </p>\"\n                    }\n                },\n                \"Scope\": {\n                    \"target\": \"com.amazonaws.s3control#Scope\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>For directory buckets, you can filter access control to specific prefixes, API\\n         operations, or a combination of both. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-points-directory-buckets.html\\\">Managing access to shared datasets in directory buckets with\\n            access points</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <note>\\n            <p>Scope is only supported for access points attached to directory buckets.</p>\\n         </note>\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.s3control#TagList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An array of tags that you can apply to an access point. Tags are key-value pairs of metadata used to control access to your access points. For more information about tags, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/tagging.html\\\">Using tags with Amazon S3</a>. For information about tagging access points, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/tagging.html#using-tags-for-abac\\\">Using tags for attribute-based access control (ABAC)</a>.</p>\\n         <note>\\n            <ul>\\n               <li>\\n                  <p>You must have the <code>s3:TagResource</code> permission to create an access point with tags for a general purpose bucket. </p>\\n               </li>\\n               <li>\\n                  <p>You must have the <code>s3express:TagResource</code> permission to create an access point with tags for a directory bucket.</p>\\n               </li>\\n            </ul>\\n         </note>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#CreateAccessPointResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccessPointArn\": {\n                    \"target\": \"com.amazonaws.s3control#S3AccessPointArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the access point.</p>\\n         <note>\\n            <p>This is only supported by Amazon S3 on Outposts.</p>\\n         </note>\"\n                    }\n                },\n                \"Alias\": {\n                    \"target\": \"com.amazonaws.s3control#Alias\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name or alias of the access point.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.s3control#CreateBucket\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#CreateBucketRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.s3control#CreateBucketResult\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.s3control#BucketAlreadyExists\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#BucketAlreadyOwnedByYou\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>This action creates an Amazon S3 on Outposts bucket. To create an S3 bucket, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateBucket.html\\\">Create\\n               Bucket</a> in the <i>Amazon S3 API Reference</i>. </p>\\n         </note>\\n         <p>Creates a new Outposts bucket. By creating the bucket, you become the bucket owner. To\\n         create an Outposts bucket, you must have S3 on Outposts. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html\\\">Using\\n            Amazon S3 on Outposts</a> in <i>Amazon S3 User Guide</i>.</p>\\n         <p>Not every string is an acceptable bucket name. For information on bucket naming\\n         restrictions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/BucketRestrictions.html#bucketnamingrules\\\">Working with\\n            Amazon S3 Buckets</a>.</p>\\n         <p>S3 on Outposts buckets support:</p>\\n         <ul>\\n            <li>\\n               <p>Tags</p>\\n            </li>\\n            <li>\\n               <p>LifecycleConfigurations for deleting expired objects</p>\\n            </li>\\n         </ul>\\n         <p>For a complete list of restrictions and Amazon S3 feature limitations on S3 on Outposts, see\\n            <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3OnOutpostsRestrictionsLimitations.html\\\">\\n            Amazon S3 on Outposts Restrictions and Limitations</a>.</p>\\n         <p>For an example of the request syntax for Amazon S3 on Outposts that uses the S3 on Outposts\\n         endpoint hostname prefix and <code>x-amz-outpost-id</code> in your API request, see the\\n            <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_CreateBucket.html#API_control_CreateBucket_Examples\\\">Examples</a> section.</p>\\n         <p>The following actions are related to <code>CreateBucket</code> for\\n         Amazon S3 on Outposts:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html\\\">PutObject</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_GetBucket.html\\\">GetBucket</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_DeleteBucket.html\\\">DeleteBucket</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_CreateAccessPoint.html\\\">CreateAccessPoint</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_PutAccessPointPolicy.html\\\">PutAccessPointPolicy</a>\\n               </p>\\n            </li>\\n         </ul>\",\n                \"smithy.api#http\": {\n                    \"method\": \"PUT\",\n                    \"uri\": \"/v20180820/bucket/{Bucket}\",\n                    \"code\": 200\n                },\n                \"smithy.api#httpChecksumRequired\": {}\n            }\n        },\n        \"com.amazonaws.s3control#CreateBucketConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LocationConstraint\": {\n                    \"target\": \"com.amazonaws.s3control#BucketLocationConstraint\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the Region where the bucket will be created. If you are creating a bucket on\\n         the US East (N. Virginia) Region (us-east-1), you do not need to specify the location. </p>\\n         <note>\\n            <p>This is not supported by Amazon S3 on Outposts buckets.</p>\\n         </note>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The container for the bucket configuration.</p>\\n         <note>\\n            <p>This is not supported by Amazon S3 on Outposts buckets.</p>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.s3control#CreateBucketRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ACL\": {\n                    \"target\": \"com.amazonaws.s3control#BucketCannedACL\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The canned ACL to apply to the bucket.</p>\\n         <note>\\n            <p>This is not supported by Amazon S3 on Outposts buckets.</p>\\n         </note>\",\n                        \"smithy.api#httpHeader\": \"x-amz-acl\"\n                    }\n                },\n                \"Bucket\": {\n                    \"target\": \"com.amazonaws.s3control#BucketName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the bucket.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"Bucket\"\n                        }\n                    }\n                },\n                \"CreateBucketConfiguration\": {\n                    \"target\": \"com.amazonaws.s3control#CreateBucketConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The configuration information for the bucket.</p>\\n         <note>\\n            <p>This is not supported by Amazon S3 on Outposts buckets.</p>\\n         </note>\",\n                        \"smithy.api#httpPayload\": {},\n                        \"smithy.api#xmlName\": \"CreateBucketConfiguration\"\n                    }\n                },\n                \"GrantFullControl\": {\n                    \"target\": \"com.amazonaws.s3control#GrantFullControl\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Allows grantee the read, write, read ACP, and write ACP permissions on the\\n         bucket.</p>\\n         <note>\\n            <p>This is not supported by Amazon S3 on Outposts buckets.</p>\\n         </note>\",\n                        \"smithy.api#httpHeader\": \"x-amz-grant-full-control\"\n                    }\n                },\n                \"GrantRead\": {\n                    \"target\": \"com.amazonaws.s3control#GrantRead\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Allows grantee to list the objects in the bucket.</p>\\n         <note>\\n            <p>This is not supported by Amazon S3 on Outposts buckets.</p>\\n         </note>\",\n                        \"smithy.api#httpHeader\": \"x-amz-grant-read\"\n                    }\n                },\n                \"GrantReadACP\": {\n                    \"target\": \"com.amazonaws.s3control#GrantReadACP\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Allows grantee to read the bucket ACL.</p>\\n         <note>\\n            <p>This is not supported by Amazon S3 on Outposts buckets.</p>\\n         </note>\",\n                        \"smithy.api#httpHeader\": \"x-amz-grant-read-acp\"\n                    }\n                },\n                \"GrantWrite\": {\n                    \"target\": \"com.amazonaws.s3control#GrantWrite\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Allows grantee to create, overwrite, and delete any object in the bucket.</p>\\n         <note>\\n            <p>This is not supported by Amazon S3 on Outposts buckets.</p>\\n         </note>\",\n                        \"smithy.api#httpHeader\": \"x-amz-grant-write\"\n                    }\n                },\n                \"GrantWriteACP\": {\n                    \"target\": \"com.amazonaws.s3control#GrantWriteACP\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Allows grantee to write the ACL for the applicable bucket.</p>\\n         <note>\\n            <p>This is not supported by Amazon S3 on Outposts buckets.</p>\\n         </note>\",\n                        \"smithy.api#httpHeader\": \"x-amz-grant-write-acp\"\n                    }\n                },\n                \"ObjectLockEnabledForBucket\": {\n                    \"target\": \"com.amazonaws.s3control#ObjectLockEnabledForBucket\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Specifies whether you want S3 Object Lock to be enabled for the new bucket.</p>\\n         <note>\\n            <p>This is not supported by Amazon S3 on Outposts buckets.</p>\\n         </note>\",\n                        \"smithy.api#httpHeader\": \"x-amz-bucket-object-lock-enabled\"\n                    }\n                },\n                \"OutpostId\": {\n                    \"target\": \"com.amazonaws.s3control#NonEmptyMaxLength64String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the Outposts where the bucket is being created.</p>\\n         <note>\\n            <p>This ID is required by Amazon S3 on Outposts buckets.</p>\\n         </note>\",\n                        \"smithy.api#httpHeader\": \"x-amz-outpost-id\",\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"OutpostId\"\n                        }\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#CreateBucketResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Location\": {\n                    \"target\": \"com.amazonaws.s3control#Location\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The location of the bucket.</p>\",\n                        \"smithy.api#httpHeader\": \"Location\"\n                    }\n                },\n                \"BucketArn\": {\n                    \"target\": \"com.amazonaws.s3control#S3RegionalBucketArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the bucket.</p>\\n         <p>For using this parameter with Amazon S3 on Outposts with the REST API, you must specify the name and the x-amz-outpost-id as well.</p>\\n         <p>For using this parameter with S3 on Outposts with the Amazon Web Services SDK and CLI, you must  specify the ARN of the bucket accessed in the format <code>arn:aws:s3-outposts:<Region>:<account-id>:outpost/<outpost-id>/bucket/<my-bucket-name></code>. For example, to access the bucket <code>reports</code> through Outpost <code>my-outpost</code> owned by account <code>123456789012</code> in Region <code>us-west-2</code>, use the URL encoding of <code>arn:aws:s3-outposts:us-west-2:123456789012:outpost/my-outpost/bucket/reports</code>. The value must be URL encoded.  </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.s3control#CreateJob\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#CreateJobRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.s3control#CreateJobResult\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.s3control#BadRequestException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#IdempotencyException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#InternalServiceException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#TooManyRequestsException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This operation creates an S3 Batch Operations job.</p>\\n         <p>You can use S3 Batch Operations to perform large-scale batch actions on Amazon S3 objects.\\n         Batch Operations can run a single action on lists of Amazon S3 objects that you specify. For more\\n         information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/batch-ops.html\\\">S3 Batch Operations</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <dl>\\n            <dt>Permissions</dt>\\n            <dd>\\n               <p>For information about permissions required to use the Batch Operations, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/batch-ops-iam-role-policies.html\\\">Granting\\n                     permissions for S3 Batch Operations</a> in the <i>Amazon S3 User\\n                     Guide</i>.</p>\\n            </dd>\\n         </dl>\\n         <p></p>\\n         <p>Related actions include:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_DescribeJob.html\\\">DescribeJob</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_ListJobs.html\\\">ListJobs</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_UpdateJobPriority.html\\\">UpdateJobPriority</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_UpdateJobStatus.html\\\">UpdateJobStatus</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_JobOperation.html\\\">JobOperation</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"POST\",\n                    \"uri\": \"/v20180820/jobs\",\n                    \"code\": 200\n                },\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#CreateJobRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID that creates the job.</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                },\n                \"ConfirmationRequired\": {\n                    \"target\": \"com.amazonaws.s3control#ConfirmationRequired\",\n                    \"traits\": {\n                        \"smithy.api#default\": null,\n                        \"smithy.api#documentation\": \"<p>Indicates whether confirmation is required before Amazon S3 runs the job. Confirmation is\\n         only required for jobs created through the Amazon S3 console.</p>\"\n                    }\n                },\n                \"Operation\": {\n                    \"target\": \"com.amazonaws.s3control#JobOperation\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The action that you want this job to perform on every object listed in the manifest. For\\n         more information about the available actions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/batch-ops-operations.html\\\">Operations</a> in the\\n            <i>Amazon S3 User Guide</i>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Report\": {\n                    \"target\": \"com.amazonaws.s3control#JobReport\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Configuration parameters for the optional job-completion report.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ClientRequestToken\": {\n                    \"target\": \"com.amazonaws.s3control#NonEmptyMaxLength64String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An idempotency token to ensure that you don't accidentally submit the same request\\n         twice. You can use any string up to the maximum length.</p>\",\n                        \"smithy.api#idempotencyToken\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Manifest\": {\n                    \"target\": \"com.amazonaws.s3control#JobManifest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Configuration parameters for the manifest.</p>\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.s3control#NonEmptyMaxLength256String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A description for this job. You can use any string within the permitted length.\\n         Descriptions don't need to be unique and can be used for multiple jobs.</p>\"\n                    }\n                },\n                \"Priority\": {\n                    \"target\": \"com.amazonaws.s3control#JobPriority\",\n                    \"traits\": {\n                        \"smithy.api#default\": null,\n                        \"smithy.api#documentation\": \"<p>The numerical priority for this job. Higher numbers indicate higher priority.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"RoleArn\": {\n                    \"target\": \"com.amazonaws.s3control#IAMRoleArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) for the Identity and Access Management (IAM) role that Batch Operations will\\n         use to run this job's action on every object in the manifest.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.s3control#S3TagSet\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A set of tags to associate with the S3 Batch Operations job. This is an optional parameter.\\n      </p>\"\n                    }\n                },\n                \"ManifestGenerator\": {\n                    \"target\": \"com.amazonaws.s3control#JobManifestGenerator\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The attribute container for the ManifestGenerator details. Jobs must be created with\\n         either a manifest file or a ManifestGenerator, but not both.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#CreateJobResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"JobId\": {\n                    \"target\": \"com.amazonaws.s3control#JobId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID for this job. Amazon S3 generates this ID automatically and returns it after a\\n         successful <code>Create Job</code> request.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.s3control#CreateMultiRegionAccessPoint\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#CreateMultiRegionAccessPointRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.s3control#CreateMultiRegionAccessPointResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported by directory buckets.</p>\\n         </note>\\n         <p>Creates a Multi-Region Access Point and associates it with the specified buckets. For more information\\n         about creating Multi-Region Access Points, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/CreatingMultiRegionAccessPoints.html\\\">Creating\\n            Multi-Region Access Points</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <p>This action will always be routed to the US West (Oregon) Region. For more information\\n         about the restrictions around working with Multi-Region Access Points, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/MultiRegionAccessPointRestrictions.html\\\">Multi-Region Access Point\\n            restrictions and limitations</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <p>This request is asynchronous, meaning that you might receive a response before the\\n         command has completed. When this request provides a response, it provides a token that you\\n         can use to monitor the status of the request with\\n            <code>DescribeMultiRegionAccessPointOperation</code>.</p>\\n         <p>The following actions are related to <code>CreateMultiRegionAccessPoint</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_DeleteMultiRegionAccessPoint.html\\\">DeleteMultiRegionAccessPoint</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_DescribeMultiRegionAccessPointOperation.html\\\">DescribeMultiRegionAccessPointOperation</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_GetMultiRegionAccessPoint.html\\\">GetMultiRegionAccessPoint</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_ListMultiRegionAccessPoints.html\\\">ListMultiRegionAccessPoints</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"POST\",\n                    \"uri\": \"/v20180820/async-requests/mrap/create\",\n                    \"code\": 200\n                },\n                \"smithy.api#httpChecksumRequired\": {},\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#CreateMultiRegionAccessPointInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Name\": {\n                    \"target\": \"com.amazonaws.s3control#MultiRegionAccessPointName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the Multi-Region Access Point associated with this request.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"PublicAccessBlock\": {\n                    \"target\": \"com.amazonaws.s3control#PublicAccessBlockConfiguration\"\n                },\n                \"Regions\": {\n                    \"target\": \"com.amazonaws.s3control#RegionCreationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The buckets in different Regions that are associated with the Multi-Region Access Point.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A container for the information associated with a <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_CreateMultiRegionAccessPoint.html\\\">CreateMultiRegionAccessPoint</a> request. </p>\"\n            }\n        },\n        \"com.amazonaws.s3control#CreateMultiRegionAccessPointRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID for the owner of the Multi-Region Access Point. The owner of the Multi-Region Access Point also must own\\n         the underlying buckets.</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.s3control#MultiRegionAccessPointClientToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An idempotency token used to identify the request and guarantee that requests are\\n         unique.</p>\",\n                        \"smithy.api#idempotencyToken\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Details\": {\n                    \"target\": \"com.amazonaws.s3control#CreateMultiRegionAccessPointInput\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A container element containing details about the Multi-Region Access Point.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#CreateMultiRegionAccessPointResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RequestTokenARN\": {\n                    \"target\": \"com.amazonaws.s3control#AsyncRequestTokenARN\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The request token associated with the request. You can use this token with <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_DescribeMultiRegionAccessPointOperation.html\\\">DescribeMultiRegionAccessPointOperation</a> to determine the status of asynchronous\\n         requests.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.s3control#CreateStorageLensGroup\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#CreateStorageLensGroupRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p> Creates a new S3 Storage Lens group and associates it with the specified Amazon Web Services account ID. An\\n         S3 Storage Lens group is a custom grouping of objects based on prefix, suffix, object tags,\\n         object size, object age, or a combination of these filters. For each Storage Lens group\\n         that you’ve created, you can also optionally add Amazon Web Services resource tags. For more information\\n         about S3 Storage Lens groups, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage-lens-groups-overview.html\\\">Working with S3 Storage Lens\\n            groups</a>.</p>\\n         <p>To use this operation, you must have the permission to perform the\\n            <code>s3:CreateStorageLensGroup</code> action. If you’re trying to create a Storage Lens\\n         group with Amazon Web Services resource tags, you must also have permission to perform the\\n            <code>s3:TagResource</code> action. For more information about the required Storage Lens\\n         Groups permissions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage_lens_iam_permissions.html#storage_lens_groups_permissions\\\">Setting account permissions to use S3 Storage Lens groups</a>.</p>\\n         <p>For information about Storage Lens groups errors, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html#S3LensErrorCodeList\\\">List of Amazon S3 Storage\\n            Lens error codes</a>.</p>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"POST\",\n                    \"uri\": \"/v20180820/storagelensgroup\",\n                    \"code\": 204\n                },\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#CreateStorageLensGroupRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>\\nThe Amazon Web Services account ID that the Storage Lens group is created from and associated with.\\n</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                },\n                \"StorageLensGroup\": {\n                    \"target\": \"com.amazonaws.s3control#StorageLensGroup\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>\\nThe Storage Lens group configuration.\\n</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.s3control#TagList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>\\nThe Amazon Web Services resource tags that you're adding to your Storage Lens group. This parameter is optional.\\n</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#CreationDate\": {\n            \"type\": \"timestamp\"\n        },\n        \"com.amazonaws.s3control#CreationTimestamp\": {\n            \"type\": \"timestamp\"\n        },\n        \"com.amazonaws.s3control#Credentials\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccessKeyId\": {\n                    \"target\": \"com.amazonaws.s3control#AccessKeyId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The unique access key ID of the Amazon Web Services STS temporary credential that S3 Access Grants vends to grantees\\n         and client applications. </p>\"\n                    }\n                },\n                \"SecretAccessKey\": {\n                    \"target\": \"com.amazonaws.s3control#SecretAccessKey\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The secret access key of the Amazon Web Services STS temporary credential that S3 Access Grants vends to grantees\\n         and client applications. </p>\"\n                    }\n                },\n                \"SessionToken\": {\n                    \"target\": \"com.amazonaws.s3control#SessionToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services STS temporary credential that S3 Access Grants vends to grantees and client applications.\\n      </p>\"\n                    }\n                },\n                \"Expiration\": {\n                    \"target\": \"com.amazonaws.s3control#Expiration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The expiration date and time of the temporary credential that S3 Access Grants vends to grantees\\n         and client applications. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The Amazon Web Services Security Token Service temporary credential that S3 Access Grants vends to grantees and client\\n         applications. </p>\",\n                \"smithy.api#sensitive\": {}\n            }\n        },\n        \"com.amazonaws.s3control#DSSEKMSFilter\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"KmsKeyArn\": {\n                    \"target\": \"com.amazonaws.s3control#NonEmptyKmsKeyArnString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the customer managed KMS key to use for the filter \\n         to return objects that are encrypted by the specified key. For best performance, \\n         we recommend using the <code>KMSKeyArn</code> filter in conjunction with other object metadata filters, like <code>MatchAnyPrefix</code>, <code>CreatedAfter</code>, or \\n         <code>MatchAnyStorageClass</code>.</p>\\n         <note>\\n            <p>You must provide the full KMS Key ARN. You can't use an alias name or alias ARN. \\n         For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-id-key-ARN\\\"> \\n            KMS keys</a> in the <i>Amazon Web Services Key Management Service Developer Guide</i>.</p>\\n         </note>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A filter that returns objects that are encrypted by dual-layer server-side encryption with Amazon Web Services Key Management\\n         Service (KMS) keys (DSSE-KMS). You can further refine your filtering by optionally providing a KMS Key ARN \\n         to create an object list of DSSE-KMS objects with that specific KMS Key ARN.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#DataSourceId\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 191\n                }\n            }\n        },\n        \"com.amazonaws.s3control#DataSourceType\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.s3control#Date\": {\n            \"type\": \"timestamp\"\n        },\n        \"com.amazonaws.s3control#Days\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#default\": 0\n            }\n        },\n        \"com.amazonaws.s3control#DaysAfterInitiation\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#default\": 0\n            }\n        },\n        \"com.amazonaws.s3control#DeleteAccessGrant\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#DeleteAccessGrantRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the access grant from the S3 Access Grants instance. You cannot undo an access grant\\n         deletion and the grantee will no longer have access to the S3 data.</p>\\n         <dl>\\n            <dt>Permissions</dt>\\n            <dd>\\n               <p>You must have the <code>s3:DeleteAccessGrant</code> permission to use this\\n                  operation. </p>\\n            </dd>\\n         </dl>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"DELETE\",\n                    \"uri\": \"/v20180820/accessgrantsinstance/grant/{AccessGrantId}\",\n                    \"code\": 200\n                },\n                \"smithy.api#httpChecksumRequired\": {},\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#DeleteAccessGrantRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID of the S3 Access Grants instance.</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                },\n                \"AccessGrantId\": {\n                    \"target\": \"com.amazonaws.s3control#AccessGrantId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the access grant. S3 Access Grants auto-generates this ID when you create the access\\n         grant.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#DeleteAccessGrantsInstance\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#DeleteAccessGrantsInstanceRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes your S3 Access Grants instance. You must first delete the access grants and locations\\n         before S3 Access Grants can delete the instance. See <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_DeleteAccessGrant.html\\\">DeleteAccessGrant</a>\\n         and <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_DeleteAccessGrantsLocation.html\\\">DeleteAccessGrantsLocation</a>. If you have associated an IAM Identity Center\\n         instance with your S3 Access Grants instance, you must first dissassociate the Identity Center\\n         instance from the S3 Access Grants instance before you can delete the S3 Access Grants instance. See <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_AssociateAccessGrantsIdentityCenter.html\\\">AssociateAccessGrantsIdentityCenter</a> and <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_DissociateAccessGrantsIdentityCenter.html\\\">DissociateAccessGrantsIdentityCenter</a>.</p>\\n         <dl>\\n            <dt>Permissions</dt>\\n            <dd>\\n               <p>You must have the <code>s3:DeleteAccessGrantsInstance</code> permission to use\\n                  this operation. </p>\\n            </dd>\\n         </dl>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"DELETE\",\n                    \"uri\": \"/v20180820/accessgrantsinstance\",\n                    \"code\": 200\n                },\n                \"smithy.api#httpChecksumRequired\": {},\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#DeleteAccessGrantsInstanceRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID of the S3 Access Grants instance.</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#DeleteAccessGrantsInstanceResourcePolicy\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#DeleteAccessGrantsInstanceResourcePolicyRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the resource policy of the S3 Access Grants instance. The resource policy is used to\\n         manage cross-account access to your S3 Access Grants instance. By deleting the resource policy, you\\n         delete any cross-account permissions to your S3 Access Grants instance. </p>\\n         <dl>\\n            <dt>Permissions</dt>\\n            <dd>\\n               <p>You must have the <code>s3:DeleteAccessGrantsInstanceResourcePolicy</code>\\n                  permission to use this operation. </p>\\n            </dd>\\n         </dl>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"DELETE\",\n                    \"uri\": \"/v20180820/accessgrantsinstance/resourcepolicy\",\n                    \"code\": 200\n                },\n                \"smithy.api#httpChecksumRequired\": {},\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#DeleteAccessGrantsInstanceResourcePolicyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID of the S3 Access Grants instance.</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#DeleteAccessGrantsLocation\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#DeleteAccessGrantsLocationRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deregisters a location from your S3 Access Grants instance. You can only delete a location\\n         registration from an S3 Access Grants instance if there are no grants associated with this location.\\n         See <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_DeleteAccessGrant.html\\\">Delete a grant</a> for\\n         information on how to delete grants. You need to have at least one registered location in\\n         your S3 Access Grants instance in order to create access grants. </p>\\n         <dl>\\n            <dt>Permissions</dt>\\n            <dd>\\n               <p>You must have the <code>s3:DeleteAccessGrantsLocation</code> permission to use\\n                  this operation. </p>\\n            </dd>\\n         </dl>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"DELETE\",\n                    \"uri\": \"/v20180820/accessgrantsinstance/location/{AccessGrantsLocationId}\",\n                    \"code\": 200\n                },\n                \"smithy.api#httpChecksumRequired\": {},\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#DeleteAccessGrantsLocationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID of the S3 Access Grants instance.</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                },\n                \"AccessGrantsLocationId\": {\n                    \"target\": \"com.amazonaws.s3control#AccessGrantsLocationId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the registered location that you are deregistering from your S3 Access Grants instance.\\n         S3 Access Grants assigned this ID when you registered the location. S3 Access Grants assigns the ID\\n            <code>default</code> to the default location <code>s3://</code> and assigns an\\n         auto-generated ID to other locations that you register. </p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#DeleteAccessPoint\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#DeleteAccessPointRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the specified access point.</p>\\n         <p>All Amazon S3 on Outposts REST API requests for this action require an additional parameter of <code>x-amz-outpost-id</code> to be passed with the request. In addition, you must use an S3 on Outposts endpoint hostname prefix instead of <code>s3-control</code>. For an example of the request syntax for Amazon S3 on Outposts that uses the S3 on Outposts endpoint hostname prefix and the <code>x-amz-outpost-id</code> derived by using the access point ARN, see the <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_DeleteAccessPoint.html#API_control_DeleteAccessPoint_Examples\\\">Examples</a> section.</p>\\n         <p>The following actions are related to <code>DeleteAccessPoint</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_CreateAccessPoint.html\\\">CreateAccessPoint</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_GetAccessPoint.html\\\">GetAccessPoint</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_ListAccessPoints.html\\\">ListAccessPoints</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"DELETE\",\n                    \"uri\": \"/v20180820/accesspoint/{Name}\",\n                    \"code\": 200\n                },\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#DeleteAccessPointForObjectLambda\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#DeleteAccessPointForObjectLambdaRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported by directory buckets.</p>\\n         </note>\\n         <p>Deletes the specified Object Lambda Access Point.</p>\\n         <p>The following actions are related to\\n         <code>DeleteAccessPointForObjectLambda</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_CreateAccessPointForObjectLambda.html\\\">CreateAccessPointForObjectLambda</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_GetAccessPointForObjectLambda.html\\\">GetAccessPointForObjectLambda</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_ListAccessPointsForObjectLambda.html\\\">ListAccessPointsForObjectLambda</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"DELETE\",\n                    \"uri\": \"/v20180820/accesspointforobjectlambda/{Name}\",\n                    \"code\": 200\n                },\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#DeleteAccessPointForObjectLambdaRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The account ID for the account that owns the specified Object Lambda Access Point.</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                },\n                \"Name\": {\n                    \"target\": \"com.amazonaws.s3control#ObjectLambdaAccessPointName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the access point you want to delete.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#DeleteAccessPointPolicy\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#DeleteAccessPointPolicyRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Deletes the access point policy for the specified access point.</p>\\n         <p></p>\\n         <p>All Amazon S3 on Outposts REST API requests for this action require an additional parameter of <code>x-amz-outpost-id</code> to be passed with the request. In addition, you must use an S3 on Outposts endpoint hostname prefix instead of <code>s3-control</code>. For an example of the request syntax for Amazon S3 on Outposts that uses the S3 on Outposts endpoint hostname prefix and the <code>x-amz-outpost-id</code> derived by using the access point ARN, see the <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_DeleteAccessPointPolicy.html#API_control_DeleteAccessPointPolicy_Examples\\\">Examples</a> section.</p>\\n         <p>The following actions are related to <code>DeleteAccessPointPolicy</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_PutAccessPointPolicy.html\\\">PutAccessPointPolicy</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_GetAccessPointPolicy.html\\\">GetAccessPointPolicy</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"DELETE\",\n                    \"uri\": \"/v20180820/accesspoint/{Name}/policy\",\n                    \"code\": 200\n                },\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#DeleteAccessPointPolicyForObjectLambda\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#DeleteAccessPointPolicyForObjectLambdaRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported by directory buckets.</p>\\n         </note>\\n         <p>Removes the resource policy for an Object Lambda Access Point.</p>\\n         <p>The following actions are related to\\n         <code>DeleteAccessPointPolicyForObjectLambda</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_GetAccessPointPolicyForObjectLambda.html\\\">GetAccessPointPolicyForObjectLambda</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_PutAccessPointPolicyForObjectLambda.html\\\">PutAccessPointPolicyForObjectLambda</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"DELETE\",\n                    \"uri\": \"/v20180820/accesspointforobjectlambda/{Name}/policy\",\n                    \"code\": 200\n                },\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#DeleteAccessPointPolicyForObjectLambdaRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The account ID for the account that owns the specified Object Lambda Access Point.</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                },\n                \"Name\": {\n                    \"target\": \"com.amazonaws.s3control#ObjectLambdaAccessPointName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the Object Lambda Access Point you want to delete the policy for.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#DeleteAccessPointPolicyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The account ID for the account that owns the specified access point.</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                },\n                \"Name\": {\n                    \"target\": \"com.amazonaws.s3control#AccessPointName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the access point whose policy you want to delete.</p>\\n         <p>For using this parameter with Amazon S3 on Outposts with the REST API, you must specify the name and the x-amz-outpost-id as well.</p>\\n         <p>For using this parameter with S3 on Outposts with the Amazon Web Services SDK and CLI, you must  specify the ARN of the access point accessed in the format <code>arn:aws:s3-outposts:<Region>:<account-id>:outpost/<outpost-id>/accesspoint/<my-accesspoint-name></code>. For example, to access the access point <code>reports-ap</code> through Outpost <code>my-outpost</code> owned by account <code>123456789012</code> in Region <code>us-west-2</code>, use the URL encoding of <code>arn:aws:s3-outposts:us-west-2:123456789012:outpost/my-outpost/accesspoint/reports-ap</code>. The value must be URL encoded. </p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccessPointName\"\n                        }\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#DeleteAccessPointRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID for the account that owns the specified access point.</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                },\n                \"Name\": {\n                    \"target\": \"com.amazonaws.s3control#AccessPointName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the access point you want to delete.</p>\\n         <p>For using this parameter with Amazon S3 on Outposts with the REST API, you must specify the name and the x-amz-outpost-id as well.</p>\\n         <p>For using this parameter with S3 on Outposts with the Amazon Web Services SDK and CLI, you must  specify the ARN of the access point accessed in the format <code>arn:aws:s3-outposts:<Region>:<account-id>:outpost/<outpost-id>/accesspoint/<my-accesspoint-name></code>. For example, to access the access point <code>reports-ap</code> through Outpost <code>my-outpost</code> owned by account <code>123456789012</code> in Region <code>us-west-2</code>, use the URL encoding of <code>arn:aws:s3-outposts:us-west-2:123456789012:outpost/my-outpost/accesspoint/reports-ap</code>. The value must be URL encoded. </p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccessPointName\"\n                        }\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#DeleteAccessPointScope\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#DeleteAccessPointScopeRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p> Deletes an existing access point scope for a directory bucket.</p>\\n         <note>\\n            <p>When you delete the scope of an access point, all prefixes and permissions are\\n            deleted.</p>\\n         </note>\\n         <p>To use this operation, you must have the permission to perform the\\n            <code>s3express:DeleteAccessPointScope</code>\\n         action.</p>\\n         <p>For information about REST API errors, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html#RESTErrorResponses\\\">REST error responses</a>.</p>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#http\": {\n                    \"method\": \"DELETE\",\n                    \"uri\": \"/v20180820/accesspoint/{Name}/scope\",\n                    \"code\": 200\n                },\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    },\n                    \"UseS3ExpressControlEndpoint\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#DeleteAccessPointScopeRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The Amazon Web Services account ID that owns the access point with the scope that you want to delete. </p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                },\n                \"Name\": {\n                    \"target\": \"com.amazonaws.s3control#AccessPointName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The name of the access point with the scope that you want to delete. </p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccessPointName\"\n                        }\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#DeleteBucket\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#DeleteBucketRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>This action deletes an Amazon S3 on Outposts bucket. To delete an S3 bucket, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucket.html\\\">DeleteBucket</a> in the <i>Amazon S3 API Reference</i>. </p>\\n         </note>\\n         <p>Deletes the Amazon S3 on Outposts bucket. All objects (including all object versions and\\n         delete markers) in the bucket must be deleted before the bucket itself can be deleted. For\\n         more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html\\\">Using Amazon S3 on Outposts</a> in\\n            <i>Amazon S3 User Guide</i>.</p>\\n         <p>All Amazon S3 on Outposts REST API requests for this action require an additional parameter of <code>x-amz-outpost-id</code> to be passed with the request. In addition, you must use an S3 on Outposts endpoint hostname prefix instead of <code>s3-control</code>. For an example of the request syntax for Amazon S3 on Outposts that uses the S3 on Outposts endpoint hostname prefix and the <code>x-amz-outpost-id</code> derived by using the access point ARN, see the <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_DeleteBucket.html#API_control_DeleteBucket_Examples\\\">Examples</a> section.</p>\\n         <p class=\\\"title\\\">\\n            <b>Related Resources</b>\\n         </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_CreateBucket.html\\\">CreateBucket</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_GetBucket.html\\\">GetBucket</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObject.html\\\">DeleteObject</a>\\n               </p>\\n            </li>\\n         </ul>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"DELETE\",\n                    \"uri\": \"/v20180820/bucket/{Bucket}\",\n                    \"code\": 200\n                },\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#DeleteBucketLifecycleConfiguration\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#DeleteBucketLifecycleConfigurationRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>This action deletes an Amazon S3 on Outposts bucket's lifecycle configuration. To delete\\n            an S3 bucket's lifecycle configuration, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketLifecycle.html\\\">DeleteBucketLifecycle</a> in the <i>Amazon S3 API Reference</i>. </p>\\n         </note>\\n         <p>Deletes the lifecycle configuration from the specified Outposts bucket.\\n         Amazon S3 on Outposts removes all the lifecycle configuration rules in the lifecycle subresource\\n         associated with the bucket. Your objects never expire, and Amazon S3 on Outposts no longer\\n         automatically deletes any objects on the basis of rules contained in the deleted lifecycle\\n         configuration. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html\\\">Using Amazon S3 on Outposts</a> in\\n            <i>Amazon S3 User Guide</i>.</p>\\n         <p>To use this operation, you must have permission to perform the\\n            <code>s3-outposts:PutLifecycleConfiguration</code> action. By default, the bucket owner\\n         has this permission and the Outposts bucket owner can grant this permission to\\n         others.</p>\\n         <p>All Amazon S3 on Outposts REST API requests for this action require an additional parameter of <code>x-amz-outpost-id</code> to be passed with the request. In addition, you must use an S3 on Outposts endpoint hostname prefix instead of <code>s3-control</code>. For an example of the request syntax for Amazon S3 on Outposts that uses the S3 on Outposts endpoint hostname prefix and the <code>x-amz-outpost-id</code> derived by using the access point ARN, see the <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_DeleteBucketLifecycleConfiguration.html#API_control_DeleteBucketLifecycleConfiguration_Examples\\\">Examples</a> section.</p>\\n         <p>For more information about object expiration, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/intro-lifecycle-rules.html#intro-lifecycle-rules-actions\\\">Elements to Describe Lifecycle Actions</a>.</p>\\n         <p>Related actions include:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_PutBucketLifecycleConfiguration.html\\\">PutBucketLifecycleConfiguration</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_GetBucketLifecycleConfiguration.html\\\">GetBucketLifecycleConfiguration</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"DELETE\",\n                    \"uri\": \"/v20180820/bucket/{Bucket}/lifecycleconfiguration\",\n                    \"code\": 200\n                },\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#DeleteBucketLifecycleConfigurationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The account ID of the lifecycle configuration to delete.</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                },\n                \"Bucket\": {\n                    \"target\": \"com.amazonaws.s3control#BucketName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the bucket.</p>\\n         <p>For using this parameter with Amazon S3 on Outposts with the REST API, you must specify the name and the x-amz-outpost-id as well.</p>\\n         <p>For using this parameter with S3 on Outposts with the Amazon Web Services SDK and CLI, you must  specify the ARN of the bucket accessed in the format <code>arn:aws:s3-outposts:<Region>:<account-id>:outpost/<outpost-id>/bucket/<my-bucket-name></code>. For example, to access the bucket <code>reports</code> through Outpost <code>my-outpost</code> owned by account <code>123456789012</code> in Region <code>us-west-2</code>, use the URL encoding of <code>arn:aws:s3-outposts:us-west-2:123456789012:outpost/my-outpost/bucket/reports</code>. The value must be URL encoded.  </p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"Bucket\"\n                        }\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#DeleteBucketPolicy\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#DeleteBucketPolicyRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>This action deletes an Amazon S3 on Outposts bucket policy. To delete an S3 bucket policy,\\n            see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketPolicy.html\\\">DeleteBucketPolicy</a> in the <i>Amazon S3 API Reference</i>. </p>\\n         </note>\\n         <p>This implementation of the DELETE action uses the policy subresource to delete the\\n         policy of a specified Amazon S3 on Outposts bucket. If you are using an identity other than the\\n         root user of the Amazon Web Services account that owns the bucket, the calling identity must have the\\n            <code>s3-outposts:DeleteBucketPolicy</code> permissions on the specified Outposts bucket\\n         and belong to the bucket owner's account to use this action. For more information, see\\n            <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html\\\">Using\\n            Amazon S3 on Outposts</a> in <i>Amazon S3 User Guide</i>.</p>\\n         <p>If you don't have <code>DeleteBucketPolicy</code> permissions, Amazon S3 returns a <code>403\\n            Access Denied</code> error. If you have the correct permissions, but you're not using an\\n         identity that belongs to the bucket owner's account, Amazon S3 returns a <code>405 Method Not\\n            Allowed</code> error. </p>\\n         <important>\\n            <p>As a security precaution, the root user of the Amazon Web Services account that owns a bucket can\\n            always use this action, even if the policy explicitly denies the root user the ability\\n            to perform this action.</p>\\n         </important>\\n         <p>For more information about bucket policies, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/using-iam-policies.html\\\">Using Bucket Policies and User\\n            Policies</a>. </p>\\n         <p>All Amazon S3 on Outposts REST API requests for this action require an additional parameter of <code>x-amz-outpost-id</code> to be passed with the request. In addition, you must use an S3 on Outposts endpoint hostname prefix instead of <code>s3-control</code>. For an example of the request syntax for Amazon S3 on Outposts that uses the S3 on Outposts endpoint hostname prefix and the <code>x-amz-outpost-id</code> derived by using the access point ARN, see the <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_DeleteBucketPolicy.html#API_control_DeleteBucketPolicy_Examples\\\">Examples</a> section.</p>\\n         <p>The following actions are related to <code>DeleteBucketPolicy</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_GetBucketPolicy.html\\\">GetBucketPolicy</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_PutBucketPolicy.html\\\">PutBucketPolicy</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"DELETE\",\n                    \"uri\": \"/v20180820/bucket/{Bucket}/policy\",\n                    \"code\": 200\n                },\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#DeleteBucketPolicyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The account ID of the Outposts bucket.</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                },\n                \"Bucket\": {\n                    \"target\": \"com.amazonaws.s3control#BucketName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the bucket.</p>\\n         <p>For using this parameter with Amazon S3 on Outposts with the REST API, you must specify the name and the x-amz-outpost-id as well.</p>\\n         <p>For using this parameter with S3 on Outposts with the Amazon Web Services SDK and CLI, you must  specify the ARN of the bucket accessed in the format <code>arn:aws:s3-outposts:<Region>:<account-id>:outpost/<outpost-id>/bucket/<my-bucket-name></code>. For example, to access the bucket <code>reports</code> through Outpost <code>my-outpost</code> owned by account <code>123456789012</code> in Region <code>us-west-2</code>, use the URL encoding of <code>arn:aws:s3-outposts:us-west-2:123456789012:outpost/my-outpost/bucket/reports</code>. The value must be URL encoded.  </p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"Bucket\"\n                        }\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#DeleteBucketReplication\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#DeleteBucketReplicationRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>This operation deletes an Amazon S3 on Outposts bucket's replication configuration. To\\n            delete an S3 bucket's replication configuration, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketReplication.html\\\">DeleteBucketReplication</a> in the <i>Amazon S3 API Reference</i>. </p>\\n         </note>\\n         <p>Deletes the replication configuration from the specified S3 on Outposts bucket.</p>\\n         <p>To use this operation, you must have permissions to perform the\\n            <code>s3-outposts:PutReplicationConfiguration</code> action. The Outposts bucket owner\\n         has this permission by default and can grant it to others. For more information about\\n         permissions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3OutpostsIAM.html\\\">Setting up IAM with\\n            S3 on Outposts</a> and <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3OutpostsBucketPolicy.html\\\">Managing access to\\n            S3 on Outposts buckets</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <note>\\n            <p>It can take a while to propagate <code>PUT</code> or <code>DELETE</code> requests for\\n            a replication configuration to all S3 on Outposts systems. Therefore, the replication\\n            configuration that's returned by a <code>GET</code> request soon after a\\n               <code>PUT</code> or <code>DELETE</code> request might return a more recent result\\n            than what's on the Outpost. If an Outpost is offline, the delay in updating the\\n            replication configuration on that Outpost can be significant.</p>\\n         </note>\\n         <p>All Amazon S3 on Outposts REST API requests for this action require an additional parameter of <code>x-amz-outpost-id</code> to be passed with the request. In addition, you must use an S3 on Outposts endpoint hostname prefix instead of <code>s3-control</code>. For an example of the request syntax for Amazon S3 on Outposts that uses the S3 on Outposts endpoint hostname prefix and the <code>x-amz-outpost-id</code> derived by using the access point ARN, see the <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_DeleteBucketReplication.html#API_control_DeleteBucketReplication_Examples\\\">Examples</a> section.</p>\\n         <p>For information about S3 replication on Outposts configuration, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3OutpostsReplication.html\\\">Replicating objects for S3 on Outposts</a> in the\\n            <i>Amazon S3 User Guide</i>.</p>\\n         <p>The following operations are related to <code>DeleteBucketReplication</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_PutBucketReplication.html\\\">PutBucketReplication</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_GetBucketReplication.html\\\">GetBucketReplication</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"DELETE\",\n                    \"uri\": \"/v20180820/bucket/{Bucket}/replication\",\n                    \"code\": 200\n                },\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#DeleteBucketReplicationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID of the Outposts bucket to delete the replication configuration\\n         for.</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                },\n                \"Bucket\": {\n                    \"target\": \"com.amazonaws.s3control#BucketName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the S3 on Outposts bucket to delete the replication configuration for.</p>\\n         <p>For using this parameter with Amazon S3 on Outposts with the REST API, you must specify the name and the x-amz-outpost-id as well.</p>\\n         <p>For using this parameter with S3 on Outposts with the Amazon Web Services SDK and CLI, you must  specify the ARN of the bucket accessed in the format <code>arn:aws:s3-outposts:<Region>:<account-id>:outpost/<outpost-id>/bucket/<my-bucket-name></code>. For example, to access the bucket <code>reports</code> through Outpost <code>my-outpost</code> owned by account <code>123456789012</code> in Region <code>us-west-2</code>, use the URL encoding of <code>arn:aws:s3-outposts:us-west-2:123456789012:outpost/my-outpost/bucket/reports</code>. The value must be URL encoded.  </p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"Bucket\"\n                        }\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#DeleteBucketRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The account ID that owns the Outposts bucket.</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                },\n                \"Bucket\": {\n                    \"target\": \"com.amazonaws.s3control#BucketName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the bucket being deleted.</p>\\n         <p>For using this parameter with Amazon S3 on Outposts with the REST API, you must specify the name and the x-amz-outpost-id as well.</p>\\n         <p>For using this parameter with S3 on Outposts with the Amazon Web Services SDK and CLI, you must  specify the ARN of the bucket accessed in the format <code>arn:aws:s3-outposts:<Region>:<account-id>:outpost/<outpost-id>/bucket/<my-bucket-name></code>. For example, to access the bucket <code>reports</code> through Outpost <code>my-outpost</code> owned by account <code>123456789012</code> in Region <code>us-west-2</code>, use the URL encoding of <code>arn:aws:s3-outposts:us-west-2:123456789012:outpost/my-outpost/bucket/reports</code>. The value must be URL encoded.  </p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"Bucket\"\n                        }\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#DeleteBucketTagging\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#DeleteBucketTaggingRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>This action deletes an Amazon S3 on Outposts bucket's tags. To delete an S3 bucket tags,\\n            see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketTagging.html\\\">DeleteBucketTagging</a> in the <i>Amazon S3 API Reference</i>. </p>\\n         </note>\\n         <p>Deletes the tags from the Outposts bucket. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html\\\">Using\\n            Amazon S3 on Outposts</a> in <i>Amazon S3 User Guide</i>.</p>\\n         <p>To use this action, you must have permission to perform the\\n            <code>PutBucketTagging</code> action. By default, the bucket owner has this permission\\n         and can grant this permission to others. </p>\\n         <p>All Amazon S3 on Outposts REST API requests for this action require an additional parameter of <code>x-amz-outpost-id</code> to be passed with the request. In addition, you must use an S3 on Outposts endpoint hostname prefix instead of <code>s3-control</code>. For an example of the request syntax for Amazon S3 on Outposts that uses the S3 on Outposts endpoint hostname prefix and the <code>x-amz-outpost-id</code> derived by using the access point ARN, see the <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_DeleteBucketTagging.html#API_control_DeleteBucketTagging_Examples\\\">Examples</a> section.</p>\\n         <p>The following actions are related to <code>DeleteBucketTagging</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_GetBucketTagging.html\\\">GetBucketTagging</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_PutBucketTagging.html\\\">PutBucketTagging</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"DELETE\",\n                    \"uri\": \"/v20180820/bucket/{Bucket}/tagging\",\n                    \"code\": 204\n                },\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#DeleteBucketTaggingRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID of the Outposts bucket tag set to be removed.</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                },\n                \"Bucket\": {\n                    \"target\": \"com.amazonaws.s3control#BucketName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The bucket ARN that has the tag set to be removed.</p>\\n         <p>For using this parameter with Amazon S3 on Outposts with the REST API, you must specify the name and the x-amz-outpost-id as well.</p>\\n         <p>For using this parameter with S3 on Outposts with the Amazon Web Services SDK and CLI, you must  specify the ARN of the bucket accessed in the format <code>arn:aws:s3-outposts:<Region>:<account-id>:outpost/<outpost-id>/bucket/<my-bucket-name></code>. For example, to access the bucket <code>reports</code> through Outpost <code>my-outpost</code> owned by account <code>123456789012</code> in Region <code>us-west-2</code>, use the URL encoding of <code>arn:aws:s3-outposts:us-west-2:123456789012:outpost/my-outpost/bucket/reports</code>. The value must be URL encoded.  </p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"Bucket\"\n                        }\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#DeleteJobTagging\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#DeleteJobTaggingRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.s3control#DeleteJobTaggingResult\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.s3control#InternalServiceException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#NotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#TooManyRequestsException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Removes the entire tag set from the specified S3 Batch Operations job.</p>\\n         <dl>\\n            <dt>Permissions</dt>\\n            <dd>\\n               <p>To use the <code>DeleteJobTagging</code> operation, you must have permission to\\n                  perform the <code>s3:DeleteJobTagging</code> action. For more information, see\\n                     <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/batch-ops-managing-jobs.html#batch-ops-job-tags\\\">Controlling access and labeling jobs using tags</a> in the\\n                     <i>Amazon S3 User Guide</i>.</p>\\n            </dd>\\n         </dl>\\n         <p>Related actions include:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_CreateJob.html\\\">CreateJob</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_GetJobTagging.html\\\">GetJobTagging</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_PutJobTagging.html\\\">PutJobTagging</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"DELETE\",\n                    \"uri\": \"/v20180820/jobs/{JobId}/tagging\",\n                    \"code\": 200\n                },\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#DeleteJobTaggingRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID associated with the S3 Batch Operations job.</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                },\n                \"JobId\": {\n                    \"target\": \"com.amazonaws.s3control#JobId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID for the S3 Batch Operations job whose tags you want to delete.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#DeleteJobTaggingResult\": {\n            \"type\": \"structure\",\n            \"members\": {},\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.s3control#DeleteMarkerReplication\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Status\": {\n                    \"target\": \"com.amazonaws.s3control#DeleteMarkerReplicationStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether to replicate delete markers.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Specifies whether S3 on Outposts replicates delete markers. If you specify a\\n            <code>Filter</code> element in your replication configuration, you must also include a\\n            <code>DeleteMarkerReplication</code> element. If your <code>Filter</code> includes a\\n            <code>Tag</code> element, the <code>DeleteMarkerReplication</code> element's\\n            <code>Status</code> child element must be set to <code>Disabled</code>, because\\n         S3 on Outposts does not support replicating delete markers for tag-based rules.</p>\\n         <p>For more information about delete marker replication, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3OutpostsReplication.html#outposts-replication-what-is-replicated\\\">How delete operations affect replication</a> in the\\n            <i>Amazon S3 User Guide</i>. </p>\"\n            }\n        },\n        \"com.amazonaws.s3control#DeleteMarkerReplicationStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"Enabled\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Enabled\"\n                    }\n                },\n                \"Disabled\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Disabled\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#DeleteMultiRegionAccessPoint\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#DeleteMultiRegionAccessPointRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.s3control#DeleteMultiRegionAccessPointResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported by directory buckets.</p>\\n         </note>\\n         <p>Deletes a Multi-Region Access Point. This action does not delete the buckets associated with the Multi-Region Access Point,\\n         only the Multi-Region Access Point itself.</p>\\n         <p>This action will always be routed to the US West (Oregon) Region. For more information\\n         about the restrictions around working with Multi-Region Access Points, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/MultiRegionAccessPointRestrictions.html\\\">Multi-Region Access Point\\n            restrictions and limitations</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <p>This request is asynchronous, meaning that you might receive a response before the\\n         command has completed. When this request provides a response, it provides a token that you\\n         can use to monitor the status of the request with\\n            <code>DescribeMultiRegionAccessPointOperation</code>.</p>\\n         <p>The following actions are related to <code>DeleteMultiRegionAccessPoint</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_CreateMultiRegionAccessPoint.html\\\">CreateMultiRegionAccessPoint</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_DescribeMultiRegionAccessPointOperation.html\\\">DescribeMultiRegionAccessPointOperation</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_GetMultiRegionAccessPoint.html\\\">GetMultiRegionAccessPoint</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_ListMultiRegionAccessPoints.html\\\">ListMultiRegionAccessPoints</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"POST\",\n                    \"uri\": \"/v20180820/async-requests/mrap/delete\",\n                    \"code\": 200\n                },\n                \"smithy.api#httpChecksumRequired\": {},\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#DeleteMultiRegionAccessPointInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Name\": {\n                    \"target\": \"com.amazonaws.s3control#MultiRegionAccessPointName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the Multi-Region Access Point associated with this request.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A container for the information associated with a <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_DeleteMultiRegionAccessPoint.html\\\">DeleteMultiRegionAccessPoint</a> request.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#DeleteMultiRegionAccessPointRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID for the owner of the Multi-Region Access Point.</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.s3control#MultiRegionAccessPointClientToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An idempotency token used to identify the request and guarantee that requests are\\n         unique.</p>\",\n                        \"smithy.api#idempotencyToken\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Details\": {\n                    \"target\": \"com.amazonaws.s3control#DeleteMultiRegionAccessPointInput\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A container element containing details about the Multi-Region Access Point.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#DeleteMultiRegionAccessPointResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RequestTokenARN\": {\n                    \"target\": \"com.amazonaws.s3control#AsyncRequestTokenARN\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The request token associated with the request. You can use this token with <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_DescribeMultiRegionAccessPointOperation.html\\\">DescribeMultiRegionAccessPointOperation</a> to determine the status of asynchronous\\n         requests.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.s3control#DeletePublicAccessBlock\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#DeletePublicAccessBlockRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported by directory buckets.</p>\\n         </note>\\n         <p>Removes the <code>PublicAccessBlock</code> configuration for an Amazon Web Services account. For more\\n         information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/access-control-block-public-access.html\\\"> Using Amazon S3 block\\n            public access</a>.</p>\\n         <p>Related actions include:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_GetPublicAccessBlock.html\\\">GetPublicAccessBlock</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_PutPublicAccessBlock.html\\\">PutPublicAccessBlock</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"DELETE\",\n                    \"uri\": \"/v20180820/configuration/publicAccessBlock\",\n                    \"code\": 200\n                },\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#DeletePublicAccessBlockRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The account ID for the Amazon Web Services account whose <code>PublicAccessBlock</code> configuration\\n         you want to remove.</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#DeleteStorageLensConfiguration\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#DeleteStorageLensConfigurationRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported by directory buckets.</p>\\n         </note>\\n         <p>Deletes the Amazon S3 Storage Lens configuration. For more information about S3 Storage Lens, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/storage_lens.html\\\">Assessing your storage\\n            activity and usage with Amazon S3 Storage Lens </a> in the\\n            <i>Amazon S3 User Guide</i>.</p>\\n         <note>\\n            <p>To use this action, you must have permission to perform the\\n               <code>s3:DeleteStorageLensConfiguration</code> action. For more information, see\\n               <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/storage_lens_iam_permissions.html\\\">Setting permissions to\\n               use Amazon S3 Storage Lens</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         </note>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"DELETE\",\n                    \"uri\": \"/v20180820/storagelens/{ConfigId}\",\n                    \"code\": 200\n                },\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#DeleteStorageLensConfigurationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConfigId\": {\n                    \"target\": \"com.amazonaws.s3control#ConfigId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the S3 Storage Lens configuration.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The account ID of the requester.</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#DeleteStorageLensConfigurationTagging\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#DeleteStorageLensConfigurationTaggingRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.s3control#DeleteStorageLensConfigurationTaggingResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported by directory buckets.</p>\\n         </note>\\n         <p>Deletes the Amazon S3 Storage Lens configuration tags. For more information about S3 Storage Lens, see\\n            <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/storage_lens.html\\\">Assessing your\\n            storage activity and usage with Amazon S3 Storage Lens </a> in the\\n            <i>Amazon S3 User Guide</i>.</p>\\n         <note>\\n            <p>To use this action, you must have permission to perform the\\n               <code>s3:DeleteStorageLensConfigurationTagging</code> action. For more information,\\n            see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/storage_lens_iam_permissions.html\\\">Setting permissions to\\n               use Amazon S3 Storage Lens</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         </note>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"DELETE\",\n                    \"uri\": \"/v20180820/storagelens/{ConfigId}/tagging\",\n                    \"code\": 200\n                },\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#DeleteStorageLensConfigurationTaggingRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConfigId\": {\n                    \"target\": \"com.amazonaws.s3control#ConfigId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the S3 Storage Lens configuration.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The account ID of the requester.</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#DeleteStorageLensConfigurationTaggingResult\": {\n            \"type\": \"structure\",\n            \"members\": {},\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.s3control#DeleteStorageLensGroup\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#DeleteStorageLensGroupRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>\\nDeletes an existing S3 Storage Lens group.</p>\\n         <p>To use this operation, you must have the permission to perform the\\n      <code>s3:DeleteStorageLensGroup</code> action. For more information about the required Storage Lens\\n      Groups permissions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage_lens_iam_permissions.html#storage_lens_groups_permissions\\\">Setting account permissions to use S3 Storage Lens groups</a>.</p>\\n         <p>For information about Storage Lens groups errors, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html#S3LensErrorCodeList\\\">List of Amazon S3 Storage\\n      Lens error codes</a>.</p>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"DELETE\",\n                    \"uri\": \"/v20180820/storagelensgroup/{Name}\",\n                    \"code\": 204\n                },\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#DeleteStorageLensGroupRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Name\": {\n                    \"target\": \"com.amazonaws.s3control#StorageLensGroupName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>\\nThe name of the Storage Lens group that you're trying to delete.\\n</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>\\nThe Amazon Web Services account ID used to create the Storage Lens group that you're trying to delete.\\n</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#DescribeJob\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#DescribeJobRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.s3control#DescribeJobResult\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.s3control#BadRequestException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#InternalServiceException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#NotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#TooManyRequestsException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Retrieves the configuration parameters and status for a Batch Operations job. For more\\n         information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/batch-ops.html\\\">S3 Batch Operations</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <dl>\\n            <dt>Permissions</dt>\\n            <dd>\\n               <p>To use the <code>DescribeJob</code> operation, you must have permission to\\n                  perform the <code>s3:DescribeJob</code> action.</p>\\n            </dd>\\n         </dl>\\n         <p>Related actions include:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_CreateJob.html\\\">CreateJob</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_ListJobs.html\\\">ListJobs</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_UpdateJobPriority.html\\\">UpdateJobPriority</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_UpdateJobStatus.html\\\">UpdateJobStatus</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/v20180820/jobs/{JobId}\",\n                    \"code\": 200\n                },\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#DescribeJobRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID associated with the S3 Batch Operations job.</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                },\n                \"JobId\": {\n                    \"target\": \"com.amazonaws.s3control#JobId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID for the job whose information you want to retrieve.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#DescribeJobResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Job\": {\n                    \"target\": \"com.amazonaws.s3control#JobDescriptor\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Contains the configuration parameters and status for the job specified in the\\n            <code>Describe Job</code> request.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.s3control#DescribeMultiRegionAccessPointOperation\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#DescribeMultiRegionAccessPointOperationRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.s3control#DescribeMultiRegionAccessPointOperationResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported by directory buckets.</p>\\n         </note>\\n         <p>Retrieves the status of an asynchronous request to manage a Multi-Region Access Point. For more information\\n         about managing Multi-Region Access Points and how asynchronous requests work, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/MrapOperations.html\\\">Using Multi-Region Access Points</a> in the\\n            <i>Amazon S3 User Guide</i>.</p>\\n         <p>The following actions are related to <code>GetMultiRegionAccessPoint</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_CreateMultiRegionAccessPoint.html\\\">CreateMultiRegionAccessPoint</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_DeleteMultiRegionAccessPoint.html\\\">DeleteMultiRegionAccessPoint</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_GetMultiRegionAccessPoint.html\\\">GetMultiRegionAccessPoint</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_ListMultiRegionAccessPoints.html\\\">ListMultiRegionAccessPoints</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/v20180820/async-requests/mrap/{RequestTokenARN+}\",\n                    \"code\": 200\n                },\n                \"smithy.api#httpChecksumRequired\": {},\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#DescribeMultiRegionAccessPointOperationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID for the owner of the Multi-Region Access Point.</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                },\n                \"RequestTokenARN\": {\n                    \"target\": \"com.amazonaws.s3control#AsyncRequestTokenARN\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The request token associated with the request you want to know about. This request token\\n         is returned as part of the response when you make an asynchronous request. You provide this\\n         token to query about the status of the asynchronous action.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#DescribeMultiRegionAccessPointOperationResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AsyncOperation\": {\n                    \"target\": \"com.amazonaws.s3control#AsyncOperation\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A container element containing the details of the asynchronous operation.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.s3control#Destination\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Account\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The destination bucket owner's account ID. </p>\"\n                    }\n                },\n                \"Bucket\": {\n                    \"target\": \"com.amazonaws.s3control#BucketIdentifierString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the access point for the destination bucket where you want\\n         S3 on Outposts to store the replication results.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ReplicationTime\": {\n                    \"target\": \"com.amazonaws.s3control#ReplicationTime\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A container that specifies S3 Replication Time Control (S3 RTC) settings, including whether S3 RTC is enabled\\n         and the time when all objects and operations on objects must be replicated. Must be\\n         specified together with a <code>Metrics</code> block. </p>\\n         <note>\\n            <p>This is not supported by Amazon S3 on Outposts buckets.</p>\\n         </note>\"\n                    }\n                },\n                \"AccessControlTranslation\": {\n                    \"target\": \"com.amazonaws.s3control#AccessControlTranslation\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify this property only in a cross-account scenario (where the source and destination\\n         bucket owners are not the same), and you want to change replica ownership to the\\n         Amazon Web Services account that owns the destination bucket. If this property is not specified in the\\n         replication configuration, the replicas are owned by same Amazon Web Services account that owns the\\n         source object.</p>\\n         <note>\\n            <p>This is not supported by Amazon S3 on Outposts buckets.</p>\\n         </note>\"\n                    }\n                },\n                \"EncryptionConfiguration\": {\n                    \"target\": \"com.amazonaws.s3control#EncryptionConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A container that provides information about encryption. If\\n            <code>SourceSelectionCriteria</code> is specified, you must specify this element.</p>\\n         <note>\\n            <p>This is not supported by Amazon S3 on Outposts buckets.</p>\\n         </note>\"\n                    }\n                },\n                \"Metrics\": {\n                    \"target\": \"com.amazonaws.s3control#Metrics\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> A container that specifies replication metrics-related settings. </p>\"\n                    }\n                },\n                \"StorageClass\": {\n                    \"target\": \"com.amazonaws.s3control#ReplicationStorageClass\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The storage class to use when replicating objects. All objects stored on S3 on Outposts\\n         are stored in the <code>OUTPOSTS</code> storage class. S3 on Outposts uses the\\n            <code>OUTPOSTS</code> storage class to create the object replicas. </p>\\n         <note>\\n            <p>Values other than <code>OUTPOSTS</code> aren't supported by Amazon S3 on Outposts. </p>\\n         </note>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Specifies information about the replication destination bucket and its settings for an\\n         S3 on Outposts replication configuration.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#DetailedStatusCodesMetrics\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"IsEnabled\": {\n                    \"target\": \"com.amazonaws.s3control#IsEnabled\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>A container that indicates whether detailed status code metrics are enabled.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The container element for Amazon S3 Storage Lens detailed status code metrics. Detailed status\\n         code metrics generate metrics for HTTP status codes, such as <code>200 OK</code>, <code>403\\n            Forbidden</code>, <code>503 Service Unavailable</code> and others. </p>\\n         <p>For more information about S3 Storage Lens, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage_lens.html\\\">Assessing your storage activity and usage with S3 Storage Lens</a> in the <i>Amazon S3 User Guide</i>. For a complete list of S3 Storage Lens metrics, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage_lens_metrics_glossary.html\\\">S3 Storage Lens metrics glossary</a> in the <i>Amazon S3 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#DissociateAccessGrantsIdentityCenter\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#DissociateAccessGrantsIdentityCenterRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Dissociates the Amazon Web Services IAM Identity Center instance from the S3 Access Grants instance. </p>\\n         <dl>\\n            <dt>Permissions</dt>\\n            <dd>\\n               <p>You must have the <code>s3:DissociateAccessGrantsIdentityCenter</code>\\n                  permission to use this operation. </p>\\n            </dd>\\n            <dt>Additional Permissions</dt>\\n            <dd>\\n               <p>You must have the <code>sso:DeleteApplication</code> permission to use this\\n                  operation. </p>\\n            </dd>\\n         </dl>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"DELETE\",\n                    \"uri\": \"/v20180820/accessgrantsinstance/identitycenter\",\n                    \"code\": 200\n                },\n                \"smithy.api#httpChecksumRequired\": {},\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#DissociateAccessGrantsIdentityCenterRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID of the S3 Access Grants instance.</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#DurationSeconds\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 900,\n                    \"max\": 43200\n                }\n            }\n        },\n        \"com.amazonaws.s3control#EncryptionConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ReplicaKmsKeyID\": {\n                    \"target\": \"com.amazonaws.s3control#ReplicaKmsKeyID\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the ID of the customer managed KMS key that's stored in Key Management Service (KMS)\\n         for the destination bucket. This ID is either the Amazon Resource Name (ARN) for the\\n         KMS key or the alias ARN for the KMS key. Amazon S3 uses this KMS key to encrypt\\n         replica objects. Amazon S3 supports only symmetric encryption KMS keys. For more information,\\n         see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#symmetric-cmks\\\">Symmetric encryption\\n            KMS keys</a> in the <i>Amazon Web Services Key Management Service Developer\\n            Guide</i>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Specifies encryption-related information for an Amazon S3 bucket that is a destination for\\n         replicated objects. If you're specifying a customer managed KMS key, we recommend using a\\n         fully qualified KMS key ARN. If you use a KMS key alias instead, then KMS resolves\\n         the key within the requester’s account. This behavior can result in data that's encrypted\\n         with a KMS key that belongs to the requester, and not the bucket owner.</p>\\n         <note>\\n            <p>This is not supported by Amazon S3 on Outposts buckets.</p>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.s3control#Endpoints\": {\n            \"type\": \"map\",\n            \"key\": {\n                \"target\": \"com.amazonaws.s3control#NonEmptyMaxLength64String\"\n            },\n            \"value\": {\n                \"target\": \"com.amazonaws.s3control#NonEmptyMaxLength1024String\"\n            }\n        },\n        \"com.amazonaws.s3control#EstablishedMultiRegionAccessPointPolicy\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Policy\": {\n                    \"target\": \"com.amazonaws.s3control#Policy\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The details of the last established policy.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The last established access control policy for a Multi-Region Access Point.</p>\\n         <p>When you update the policy, the update is first listed as the proposed policy. After the\\n         update is finished and all Regions have been updated, the proposed policy is listed as the\\n         established policy. If both policies have the same version number, the proposed policy is\\n         the established policy.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#ExceptionMessage\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 1024\n                }\n            }\n        },\n        \"com.amazonaws.s3control#Exclude\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Buckets\": {\n                    \"target\": \"com.amazonaws.s3control#Buckets\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A container for the S3 Storage Lens bucket excludes.</p>\"\n                    }\n                },\n                \"Regions\": {\n                    \"target\": \"com.amazonaws.s3control#Regions\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A container for the S3 Storage Lens Region excludes.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A container for what Amazon S3 Storage Lens will exclude.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#ExistingObjectReplication\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Status\": {\n                    \"target\": \"com.amazonaws.s3control#ExistingObjectReplicationStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies whether Amazon S3 replicates existing source bucket objects. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>An optional configuration to replicate existing source bucket objects. </p>\\n         <note>\\n            <p>This is not supported by Amazon S3 on Outposts buckets.</p>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.s3control#ExistingObjectReplicationStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"Enabled\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Enabled\"\n                    }\n                },\n                \"Disabled\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Disabled\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#Expiration\": {\n            \"type\": \"timestamp\"\n        },\n        \"com.amazonaws.s3control#ExpirationStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"Enabled\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Enabled\"\n                    }\n                },\n                \"Disabled\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Disabled\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#ExpiredObjectDeleteMarker\": {\n            \"type\": \"boolean\",\n            \"traits\": {\n                \"smithy.api#default\": false\n            }\n        },\n        \"com.amazonaws.s3control#Format\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"CSV\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"CSV\"\n                    }\n                },\n                \"Parquet\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Parquet\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#FunctionArnString\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 1024\n                },\n                \"smithy.api#pattern\": \"^(arn:(aws[a-zA-Z-]*)?:lambda:)?([a-z]{2}((-gov)|(-iso([a-z]?)))?-[a-z]+-\\\\d{1}:)?(\\\\d{12}:)?(function:)?([a-zA-Z0-9-_]+)(:(\\\\$LATEST|[a-zA-Z0-9-_]+))?$\"\n            }\n        },\n        \"com.amazonaws.s3control#GeneratedManifestEncryption\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SSES3\": {\n                    \"target\": \"com.amazonaws.s3control#SSES3Encryption\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the use of SSE-S3 to encrypt generated manifest objects.</p>\",\n                        \"smithy.api#xmlName\": \"SSE-S3\"\n                    }\n                },\n                \"SSEKMS\": {\n                    \"target\": \"com.amazonaws.s3control#SSEKMSEncryption\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Configuration details on how SSE-KMS is used to encrypt generated manifest\\n         objects.</p>\",\n                        \"smithy.api#xmlName\": \"SSE-KMS\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The encryption configuration to use when storing the generated manifest.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#GeneratedManifestFormat\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"S3InventoryReport_CSV_20211130\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"S3InventoryReport_CSV_20211130\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#GetAccessGrant\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#GetAccessGrantRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.s3control#GetAccessGrantResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Get the details of an access grant from your S3 Access Grants instance.</p>\\n         <dl>\\n            <dt>Permissions</dt>\\n            <dd>\\n               <p>You must have the <code>s3:GetAccessGrant</code> permission to use this\\n                  operation. </p>\\n            </dd>\\n         </dl>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/v20180820/accessgrantsinstance/grant/{AccessGrantId}\",\n                    \"code\": 200\n                },\n                \"smithy.api#httpChecksumRequired\": {},\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#GetAccessGrantRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID of the S3 Access Grants instance.</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                },\n                \"AccessGrantId\": {\n                    \"target\": \"com.amazonaws.s3control#AccessGrantId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the access grant. S3 Access Grants auto-generates this ID when you create the access\\n         grant.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#GetAccessGrantResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CreatedAt\": {\n                    \"target\": \"com.amazonaws.s3control#CreationTimestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time when you created the access grant. </p>\"\n                    }\n                },\n                \"AccessGrantId\": {\n                    \"target\": \"com.amazonaws.s3control#AccessGrantId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the access grant. S3 Access Grants auto-generates this ID when you create the access\\n         grant.</p>\"\n                    }\n                },\n                \"AccessGrantArn\": {\n                    \"target\": \"com.amazonaws.s3control#AccessGrantArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the access grant. </p>\"\n                    }\n                },\n                \"Grantee\": {\n                    \"target\": \"com.amazonaws.s3control#Grantee\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The user, group, or role to which you are granting access. You can grant access to an\\n         IAM user or role. If you have added a corporate directory to Amazon Web Services IAM Identity Center\\n         and associated this Identity Center instance with the S3 Access Grants instance, the grantee can also\\n         be a corporate directory user or group.</p>\"\n                    }\n                },\n                \"Permission\": {\n                    \"target\": \"com.amazonaws.s3control#Permission\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of permission that was granted in the access grant. Can be one of the following\\n         values:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>READ</code> – Grant read-only access to the S3 data.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>WRITE</code> – Grant write-only access to the S3 data.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>READWRITE</code> – Grant both read and write access to the S3 data.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"AccessGrantsLocationId\": {\n                    \"target\": \"com.amazonaws.s3control#AccessGrantsLocationId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the registered location to which you are granting access. S3 Access Grants assigns this\\n         ID when you register the location. S3 Access Grants assigns the ID <code>default</code> to the\\n         default location <code>s3://</code> and assigns an auto-generated ID to other locations\\n         that you register. </p>\"\n                    }\n                },\n                \"AccessGrantsLocationConfiguration\": {\n                    \"target\": \"com.amazonaws.s3control#AccessGrantsLocationConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The configuration options of the grant location. The grant location is the S3 path to\\n         the data to which you are granting access. </p>\"\n                    }\n                },\n                \"GrantScope\": {\n                    \"target\": \"com.amazonaws.s3control#S3Prefix\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The S3 path of the data to which you are granting access. It is the result of appending\\n         the <code>Subprefix</code> to the location scope.</p>\"\n                    }\n                },\n                \"ApplicationArn\": {\n                    \"target\": \"com.amazonaws.s3control#IdentityCenterApplicationArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of an Amazon Web Services IAM Identity Center application associated\\n         with your Identity Center instance. If the grant includes an application ARN, the grantee\\n         can only access the S3 data through this application. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.s3control#GetAccessGrantsInstance\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#GetAccessGrantsInstanceRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.s3control#GetAccessGrantsInstanceResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Retrieves the S3 Access Grants instance for a Region in your account. </p>\\n         <dl>\\n            <dt>Permissions</dt>\\n            <dd>\\n               <p>You must have the <code>s3:GetAccessGrantsInstance</code> permission to use\\n                  this operation. </p>\\n            </dd>\\n         </dl>\\n         <note>\\n            <p>\\n               <code>GetAccessGrantsInstance</code> is not supported for cross-account access. You can only call the API from the account that owns the S3 Access Grants instance.</p>\\n         </note>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/v20180820/accessgrantsinstance\",\n                    \"code\": 200\n                },\n                \"smithy.api#httpChecksumRequired\": {},\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#GetAccessGrantsInstanceForPrefix\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#GetAccessGrantsInstanceForPrefixRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.s3control#GetAccessGrantsInstanceForPrefixResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Retrieve the S3 Access Grants instance that contains a particular prefix. </p>\\n         <dl>\\n            <dt>Permissions</dt>\\n            <dd>\\n               <p>You must have the <code>s3:GetAccessGrantsInstanceForPrefix</code> permission\\n                  for the caller account to use this operation. </p>\\n            </dd>\\n            <dt>Additional Permissions</dt>\\n            <dd>\\n               <p>The prefix owner account must grant you the following permissions to their\\n                  S3 Access Grants instance: <code>s3:GetAccessGrantsInstanceForPrefix</code>. </p>\\n            </dd>\\n         </dl>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/v20180820/accessgrantsinstance/prefix\",\n                    \"code\": 200\n                },\n                \"smithy.api#httpChecksumRequired\": {},\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#GetAccessGrantsInstanceForPrefixRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the Amazon Web Services account that is making this request.</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                },\n                \"S3Prefix\": {\n                    \"target\": \"com.amazonaws.s3control#S3Prefix\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The S3 prefix of the access grants that you would like to retrieve.</p>\",\n                        \"smithy.api#httpQuery\": \"s3prefix\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#GetAccessGrantsInstanceForPrefixResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccessGrantsInstanceArn\": {\n                    \"target\": \"com.amazonaws.s3control#AccessGrantsInstanceArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the S3 Access Grants instance. </p>\"\n                    }\n                },\n                \"AccessGrantsInstanceId\": {\n                    \"target\": \"com.amazonaws.s3control#AccessGrantsInstanceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the S3 Access Grants instance. The ID is <code>default</code>. You can have one S3 Access Grants\\n         instance per Region per account. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.s3control#GetAccessGrantsInstanceRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID of the S3 Access Grants instance.</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#GetAccessGrantsInstanceResourcePolicy\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#GetAccessGrantsInstanceResourcePolicyRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.s3control#GetAccessGrantsInstanceResourcePolicyResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns the resource policy of the S3 Access Grants instance. </p>\\n         <dl>\\n            <dt>Permissions</dt>\\n            <dd>\\n               <p>You must have the <code>s3:GetAccessGrantsInstanceResourcePolicy</code>\\n                  permission to use this operation. </p>\\n            </dd>\\n         </dl>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/v20180820/accessgrantsinstance/resourcepolicy\",\n                    \"code\": 200\n                },\n                \"smithy.api#httpChecksumRequired\": {},\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#GetAccessGrantsInstanceResourcePolicyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID of the S3 Access Grants instance.</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#GetAccessGrantsInstanceResourcePolicyResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Policy\": {\n                    \"target\": \"com.amazonaws.s3control#PolicyDocument\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The resource policy of the S3 Access Grants instance.</p>\"\n                    }\n                },\n                \"Organization\": {\n                    \"target\": \"com.amazonaws.s3control#Organization\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Organization of the resource policy of the S3 Access Grants instance.</p>\"\n                    }\n                },\n                \"CreatedAt\": {\n                    \"target\": \"com.amazonaws.s3control#CreationTimestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time when you created the S3 Access Grants instance resource policy. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.s3control#GetAccessGrantsInstanceResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccessGrantsInstanceArn\": {\n                    \"target\": \"com.amazonaws.s3control#AccessGrantsInstanceArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the S3 Access Grants instance. </p>\"\n                    }\n                },\n                \"AccessGrantsInstanceId\": {\n                    \"target\": \"com.amazonaws.s3control#AccessGrantsInstanceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the S3 Access Grants instance. The ID is <code>default</code>. You can have one S3 Access Grants\\n         instance per Region per account. </p>\"\n                    }\n                },\n                \"IdentityCenterArn\": {\n                    \"target\": \"com.amazonaws.s3control#IdentityCenterArn\",\n                    \"traits\": {\n                        \"smithy.api#deprecated\": {\n                            \"message\": \"IdentityCenterArn has been deprecated. Use IdentityCenterInstanceArn or IdentityCenterApplicationArn.\"\n                        },\n                        \"smithy.api#documentation\": \"<p>If you associated your S3 Access Grants instance with an Amazon Web Services IAM Identity Center instance,\\n         this field returns the Amazon Resource Name (ARN) of the IAM Identity Center instance\\n         application; a subresource of the original Identity Center instance. S3 Access Grants creates this\\n         Identity Center application for the specific S3 Access Grants instance. </p>\"\n                    }\n                },\n                \"IdentityCenterInstanceArn\": {\n                    \"target\": \"com.amazonaws.s3control#IdentityCenterArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the Amazon Web Services IAM Identity Center instance that you are\\n         associating with your S3 Access Grants instance. An IAM Identity Center instance is your corporate\\n         identity directory that you added to the IAM Identity Center. You can use the <a href=\\\"https://docs.aws.amazon.com/singlesignon/latest/APIReference/API_ListInstances.html\\\">ListInstances</a> API operation to retrieve a list of your Identity Center\\n         instances and their ARNs.</p>\"\n                    }\n                },\n                \"IdentityCenterApplicationArn\": {\n                    \"target\": \"com.amazonaws.s3control#IdentityCenterApplicationArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If you associated your S3 Access Grants instance with an Amazon Web Services IAM Identity Center instance,\\n         this field returns the Amazon Resource Name (ARN) of the IAM Identity Center instance\\n         application; a subresource of the original Identity Center instance. S3 Access Grants creates this\\n         Identity Center application for the specific S3 Access Grants instance. </p>\"\n                    }\n                },\n                \"CreatedAt\": {\n                    \"target\": \"com.amazonaws.s3control#CreationTimestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time when you created the S3 Access Grants instance. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.s3control#GetAccessGrantsLocation\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#GetAccessGrantsLocationRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.s3control#GetAccessGrantsLocationResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Retrieves the details of a particular location registered in your S3 Access Grants instance. </p>\\n         <dl>\\n            <dt>Permissions</dt>\\n            <dd>\\n               <p>You must have the <code>s3:GetAccessGrantsLocation</code> permission to use\\n                  this operation. </p>\\n            </dd>\\n         </dl>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/v20180820/accessgrantsinstance/location/{AccessGrantsLocationId}\",\n                    \"code\": 200\n                },\n                \"smithy.api#httpChecksumRequired\": {},\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#GetAccessGrantsLocationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID of the S3 Access Grants instance.</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                },\n                \"AccessGrantsLocationId\": {\n                    \"target\": \"com.amazonaws.s3control#AccessGrantsLocationId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the registered location that you are retrieving. S3 Access Grants assigns this ID when\\n         you register the location. S3 Access Grants assigns the ID <code>default</code> to the default\\n         location <code>s3://</code> and assigns an auto-generated ID to other locations that you\\n         register. </p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#GetAccessGrantsLocationResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CreatedAt\": {\n                    \"target\": \"com.amazonaws.s3control#CreationTimestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time when you registered the location. </p>\"\n                    }\n                },\n                \"AccessGrantsLocationId\": {\n                    \"target\": \"com.amazonaws.s3control#AccessGrantsLocationId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the registered location to which you are granting access. S3 Access Grants assigns this\\n         ID when you register the location. S3 Access Grants assigns the ID <code>default</code> to the\\n         default location <code>s3://</code> and assigns an auto-generated ID to other locations\\n         that you register. </p>\"\n                    }\n                },\n                \"AccessGrantsLocationArn\": {\n                    \"target\": \"com.amazonaws.s3control#AccessGrantsLocationArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the registered location. </p>\"\n                    }\n                },\n                \"LocationScope\": {\n                    \"target\": \"com.amazonaws.s3control#S3Prefix\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The S3 URI path to the registered location. The location scope can be the default S3\\n         location <code>s3://</code>, the S3 path to a bucket, or the S3 path to a bucket and\\n         prefix. A prefix in S3 is a string of characters at the beginning of an object key name\\n         used to organize the objects that you store in your S3 buckets. For example, object key\\n         names that start with the <code>engineering/</code> prefix or object key names that start\\n         with the <code>marketing/campaigns/</code> prefix.</p>\"\n                    }\n                },\n                \"IAMRoleArn\": {\n                    \"target\": \"com.amazonaws.s3control#IAMRoleArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the IAM role for the registered location. S3 Access Grants\\n         assumes this role to manage access to the registered location. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.s3control#GetAccessPoint\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#GetAccessPointRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.s3control#GetAccessPointResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns configuration information about the specified access point.</p>\\n         <p></p>\\n         <p>All Amazon S3 on Outposts REST API requests for this action require an additional parameter of <code>x-amz-outpost-id</code> to be passed with the request. In addition, you must use an S3 on Outposts endpoint hostname prefix instead of <code>s3-control</code>. For an example of the request syntax for Amazon S3 on Outposts that uses the S3 on Outposts endpoint hostname prefix and the <code>x-amz-outpost-id</code> derived by using the access point ARN, see the <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_GetAccessPoint.html#API_control_GetAccessPoint_Examples\\\">Examples</a> section.</p>\\n         <p>The following actions are related to <code>GetAccessPoint</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_CreateAccessPoint.html\\\">CreateAccessPoint</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_DeleteAccessPoint.html\\\">DeleteAccessPoint</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_ListAccessPoints.html\\\">ListAccessPoints</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/v20180820/accesspoint/{Name}\",\n                    \"code\": 200\n                },\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#GetAccessPointConfigurationForObjectLambda\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#GetAccessPointConfigurationForObjectLambdaRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.s3control#GetAccessPointConfigurationForObjectLambdaResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported by directory buckets.</p>\\n         </note>\\n         <p>Returns configuration for an Object Lambda Access Point.</p>\\n         <p>The following actions are related to\\n            <code>GetAccessPointConfigurationForObjectLambda</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_PutAccessPointConfigurationForObjectLambda.html\\\">PutAccessPointConfigurationForObjectLambda</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/v20180820/accesspointforobjectlambda/{Name}/configuration\",\n                    \"code\": 200\n                },\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#GetAccessPointConfigurationForObjectLambdaRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The account ID for the account that owns the specified Object Lambda Access Point.</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                },\n                \"Name\": {\n                    \"target\": \"com.amazonaws.s3control#ObjectLambdaAccessPointName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the Object Lambda Access Point you want to return the configuration for.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#GetAccessPointConfigurationForObjectLambdaResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Configuration\": {\n                    \"target\": \"com.amazonaws.s3control#ObjectLambdaConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Object Lambda Access Point configuration document.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.s3control#GetAccessPointForObjectLambda\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#GetAccessPointForObjectLambdaRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.s3control#GetAccessPointForObjectLambdaResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported by directory buckets.</p>\\n         </note>\\n         <p>Returns configuration information about the specified Object Lambda Access Point</p>\\n         <p>The following actions are related to <code>GetAccessPointForObjectLambda</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_CreateAccessPointForObjectLambda.html\\\">CreateAccessPointForObjectLambda</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_DeleteAccessPointForObjectLambda.html\\\">DeleteAccessPointForObjectLambda</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_ListAccessPointsForObjectLambda.html\\\">ListAccessPointsForObjectLambda</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/v20180820/accesspointforobjectlambda/{Name}\",\n                    \"code\": 200\n                },\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#GetAccessPointForObjectLambdaRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The account ID for the account that owns the specified Object Lambda Access Point.</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                },\n                \"Name\": {\n                    \"target\": \"com.amazonaws.s3control#ObjectLambdaAccessPointName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the Object Lambda Access Point.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#GetAccessPointForObjectLambdaResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Name\": {\n                    \"target\": \"com.amazonaws.s3control#ObjectLambdaAccessPointName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the Object Lambda Access Point.</p>\"\n                    }\n                },\n                \"PublicAccessBlockConfiguration\": {\n                    \"target\": \"com.amazonaws.s3control#PublicAccessBlockConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Configuration to block all public access. This setting is turned on and can not be\\n         edited. </p>\"\n                    }\n                },\n                \"CreationDate\": {\n                    \"target\": \"com.amazonaws.s3control#CreationDate\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time when the specified Object Lambda Access Point was created.</p>\"\n                    }\n                },\n                \"Alias\": {\n                    \"target\": \"com.amazonaws.s3control#ObjectLambdaAccessPointAlias\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The alias of the Object Lambda Access Point.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.s3control#GetAccessPointPolicy\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#GetAccessPointPolicyRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.s3control#GetAccessPointPolicyResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns the access point policy associated with the specified access point.</p>\\n         <p>The following actions are related to <code>GetAccessPointPolicy</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_PutAccessPointPolicy.html\\\">PutAccessPointPolicy</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_DeleteAccessPointPolicy.html\\\">DeleteAccessPointPolicy</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/v20180820/accesspoint/{Name}/policy\",\n                    \"code\": 200\n                },\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#GetAccessPointPolicyForObjectLambda\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#GetAccessPointPolicyForObjectLambdaRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.s3control#GetAccessPointPolicyForObjectLambdaResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported by directory buckets.</p>\\n         </note>\\n         <p>Returns the resource policy for an Object Lambda Access Point.</p>\\n         <p>The following actions are related to\\n         <code>GetAccessPointPolicyForObjectLambda</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_DeleteAccessPointPolicyForObjectLambda.html\\\">DeleteAccessPointPolicyForObjectLambda</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_PutAccessPointPolicyForObjectLambda.html\\\">PutAccessPointPolicyForObjectLambda</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/v20180820/accesspointforobjectlambda/{Name}/policy\",\n                    \"code\": 200\n                },\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#GetAccessPointPolicyForObjectLambdaRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The account ID for the account that owns the specified Object Lambda Access Point.</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                },\n                \"Name\": {\n                    \"target\": \"com.amazonaws.s3control#ObjectLambdaAccessPointName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the Object Lambda Access Point.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#GetAccessPointPolicyForObjectLambdaResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Policy\": {\n                    \"target\": \"com.amazonaws.s3control#ObjectLambdaPolicy\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Object Lambda Access Point resource policy document.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.s3control#GetAccessPointPolicyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The account ID for the account that owns the specified access point.</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                },\n                \"Name\": {\n                    \"target\": \"com.amazonaws.s3control#AccessPointName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the access point whose policy you want to retrieve.</p>\\n         <p>For using this parameter with Amazon S3 on Outposts with the REST API, you must specify the name and the x-amz-outpost-id as well.</p>\\n         <p>For using this parameter with S3 on Outposts with the Amazon Web Services SDK and CLI, you must  specify the ARN of the access point accessed in the format <code>arn:aws:s3-outposts:<Region>:<account-id>:outpost/<outpost-id>/accesspoint/<my-accesspoint-name></code>. For example, to access the access point <code>reports-ap</code> through Outpost <code>my-outpost</code> owned by account <code>123456789012</code> in Region <code>us-west-2</code>, use the URL encoding of <code>arn:aws:s3-outposts:us-west-2:123456789012:outpost/my-outpost/accesspoint/reports-ap</code>. The value must be URL encoded. </p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccessPointName\"\n                        }\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#GetAccessPointPolicyResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Policy\": {\n                    \"target\": \"com.amazonaws.s3control#Policy\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The access point policy associated with the specified access point.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.s3control#GetAccessPointPolicyStatus\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#GetAccessPointPolicyStatusRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.s3control#GetAccessPointPolicyStatusResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported by directory buckets.</p>\\n         </note>\\n         <p>Indicates whether the specified access point currently has a policy that allows public access.\\n         For more information about public access through access points, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-points.html\\\">Managing Data Access with Amazon S3\\n            access points</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/v20180820/accesspoint/{Name}/policyStatus\",\n                    \"code\": 200\n                },\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#GetAccessPointPolicyStatusForObjectLambda\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#GetAccessPointPolicyStatusForObjectLambdaRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.s3control#GetAccessPointPolicyStatusForObjectLambdaResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported by directory buckets.</p>\\n         </note>\\n         <p>Returns the status of the resource policy associated with an Object Lambda Access Point.</p>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/v20180820/accesspointforobjectlambda/{Name}/policyStatus\",\n                    \"code\": 200\n                },\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#GetAccessPointPolicyStatusForObjectLambdaRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The account ID for the account that owns the specified Object Lambda Access Point.</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                },\n                \"Name\": {\n                    \"target\": \"com.amazonaws.s3control#ObjectLambdaAccessPointName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the Object Lambda Access Point.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#GetAccessPointPolicyStatusForObjectLambdaResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PolicyStatus\": {\n                    \"target\": \"com.amazonaws.s3control#PolicyStatus\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.s3control#GetAccessPointPolicyStatusRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The account ID for the account that owns the specified access point.</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                },\n                \"Name\": {\n                    \"target\": \"com.amazonaws.s3control#AccessPointName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the access point whose policy status you want to retrieve.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccessPointName\"\n                        }\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#GetAccessPointPolicyStatusResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PolicyStatus\": {\n                    \"target\": \"com.amazonaws.s3control#PolicyStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates the current policy status of the specified access point.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.s3control#GetAccessPointRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID for the account that owns the specified access point.</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                },\n                \"Name\": {\n                    \"target\": \"com.amazonaws.s3control#AccessPointName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the access point whose configuration information you want to retrieve.</p>\\n         <p>For using this parameter with Amazon S3 on Outposts with the REST API, you must specify the name and the x-amz-outpost-id as well.</p>\\n         <p>For using this parameter with S3 on Outposts with the Amazon Web Services SDK and CLI, you must  specify the ARN of the access point accessed in the format <code>arn:aws:s3-outposts:<Region>:<account-id>:outpost/<outpost-id>/accesspoint/<my-accesspoint-name></code>. For example, to access the access point <code>reports-ap</code> through Outpost <code>my-outpost</code> owned by account <code>123456789012</code> in Region <code>us-west-2</code>, use the URL encoding of <code>arn:aws:s3-outposts:us-west-2:123456789012:outpost/my-outpost/accesspoint/reports-ap</code>. The value must be URL encoded. </p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccessPointName\"\n                        }\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#GetAccessPointResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Name\": {\n                    \"target\": \"com.amazonaws.s3control#AccessPointName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the specified access point.</p>\"\n                    }\n                },\n                \"Bucket\": {\n                    \"target\": \"com.amazonaws.s3control#AccessPointBucketName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the bucket associated with the specified access point.</p>\"\n                    }\n                },\n                \"NetworkOrigin\": {\n                    \"target\": \"com.amazonaws.s3control#NetworkOrigin\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether this access point allows access from the public internet. If\\n            <code>VpcConfiguration</code> is specified for this access point, then\\n            <code>NetworkOrigin</code> is <code>VPC</code>, and the access point doesn't allow access from\\n         the public internet. Otherwise, <code>NetworkOrigin</code> is <code>Internet</code>, and\\n         the access point allows access from the public internet, subject to the access point and bucket access\\n         policies.</p>\\n         <p>This will always be true for an Amazon S3 on Outposts access point</p>\"\n                    }\n                },\n                \"VpcConfiguration\": {\n                    \"target\": \"com.amazonaws.s3control#VpcConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Contains the virtual private cloud (VPC) configuration for the specified access point.</p>\\n         <note>\\n            <p>This element is empty if this access point is an Amazon S3 on Outposts access point that is used by other\\n               Amazon Web Services services.</p>\\n         </note>\"\n                    }\n                },\n                \"PublicAccessBlockConfiguration\": {\n                    \"target\": \"com.amazonaws.s3control#PublicAccessBlockConfiguration\"\n                },\n                \"CreationDate\": {\n                    \"target\": \"com.amazonaws.s3control#CreationDate\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time when the specified access point was created.</p>\"\n                    }\n                },\n                \"Alias\": {\n                    \"target\": \"com.amazonaws.s3control#Alias\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name or alias of the access point.</p>\"\n                    }\n                },\n                \"AccessPointArn\": {\n                    \"target\": \"com.amazonaws.s3control#S3AccessPointArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the access point.</p>\"\n                    }\n                },\n                \"Endpoints\": {\n                    \"target\": \"com.amazonaws.s3control#Endpoints\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The VPC endpoint for the access point.</p>\"\n                    }\n                },\n                \"BucketAccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID associated with the S3 bucket associated with this access point.</p>\"\n                    }\n                },\n                \"DataSourceId\": {\n                    \"target\": \"com.amazonaws.s3control#DataSourceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The unique identifier for the data source of the access point.</p>\"\n                    }\n                },\n                \"DataSourceType\": {\n                    \"target\": \"com.amazonaws.s3control#DataSourceType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of the data source that the access point is attached to.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.s3control#GetAccessPointScope\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#GetAccessPointScopeRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.s3control#GetAccessPointScopeResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p> Returns the access point scope for a directory bucket.</p>\\n         <p>To use this operation, you must have the permission to perform the\\n            <code>s3express:GetAccessPointScope</code>\\n         action.</p>\\n         <p>For information about REST API errors, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html#RESTErrorResponses\\\">REST error responses</a>.</p>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/v20180820/accesspoint/{Name}/scope\",\n                    \"code\": 200\n                },\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    },\n                    \"UseS3ExpressControlEndpoint\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#GetAccessPointScopeRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The Amazon Web Services account ID that owns the access point with the scope that you want to retrieve.\\n      </p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                },\n                \"Name\": {\n                    \"target\": \"com.amazonaws.s3control#AccessPointName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the access point with the scope you want to retrieve.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccessPointName\"\n                        }\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#GetAccessPointScopeResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Scope\": {\n                    \"target\": \"com.amazonaws.s3control#Scope\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The contents of the access point scope.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.s3control#GetBucket\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#GetBucketRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.s3control#GetBucketResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Gets an Amazon S3 on Outposts bucket. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html\\\"> Using Amazon S3 on Outposts</a> in the\\n            <i>Amazon S3 User Guide</i>.</p>\\n         <p>If you are using an identity other than the root user of the Amazon Web Services account that owns the\\n         Outposts bucket, the calling identity must have the <code>s3-outposts:GetBucket</code>\\n         permissions on the specified Outposts bucket and belong to the Outposts bucket owner's\\n         account in order to use this action. Only users from Outposts bucket owner account with\\n         the right permissions can perform actions on an Outposts bucket. </p>\\n         <p>If you don't have <code>s3-outposts:GetBucket</code> permissions or you're not using an\\n         identity that belongs to the bucket owner's account, Amazon S3 returns a <code>403 Access\\n            Denied</code> error.</p>\\n         <p>The following actions are related to <code>GetBucket</code> for Amazon S3 on Outposts:</p>\\n         <p>All Amazon S3 on Outposts REST API requests for this action require an additional parameter of <code>x-amz-outpost-id</code> to be passed with the request. In addition, you must use an S3 on Outposts endpoint hostname prefix instead of <code>s3-control</code>. For an example of the request syntax for Amazon S3 on Outposts that uses the S3 on Outposts endpoint hostname prefix and the <code>x-amz-outpost-id</code> derived by using the access point ARN, see the <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_GetBucket.html#API_control_GetBucket_Examples\\\">Examples</a> section.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html\\\">PutObject</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_CreateBucket.html\\\">CreateBucket</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_DeleteBucket.html\\\">DeleteBucket</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/v20180820/bucket/{Bucket}\",\n                    \"code\": 200\n                },\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#GetBucketLifecycleConfiguration\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#GetBucketLifecycleConfigurationRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.s3control#GetBucketLifecycleConfigurationResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>This action gets an Amazon S3 on Outposts bucket's lifecycle configuration. To get an S3\\n            bucket's lifecycle configuration, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketLifecycleConfiguration.html\\\">GetBucketLifecycleConfiguration</a> in the <i>Amazon S3 API Reference</i>.\\n         </p>\\n         </note>\\n         <p>Returns the lifecycle configuration information set on the Outposts bucket. For more\\n         information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html\\\">Using Amazon S3 on Outposts</a> and for\\n         information about lifecycle configuration, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/object-lifecycle-mgmt.html\\\"> Object Lifecycle\\n            Management</a> in <i>Amazon S3 User Guide</i>.</p>\\n         <p>To use this action, you must have permission to perform the\\n            <code>s3-outposts:GetLifecycleConfiguration</code> action. The Outposts bucket owner\\n         has this permission, by default. The bucket owner can grant this permission to others. For\\n         more information about permissions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-with-s3-actions.html#using-with-s3-actions-related-to-bucket-subresources\\\">Permissions Related to Bucket Subresource Operations</a> and <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html\\\">Managing\\n            Access Permissions to Your Amazon S3 Resources</a>.</p>\\n         <p>All Amazon S3 on Outposts REST API requests for this action require an additional parameter of <code>x-amz-outpost-id</code> to be passed with the request. In addition, you must use an S3 on Outposts endpoint hostname prefix instead of <code>s3-control</code>. For an example of the request syntax for Amazon S3 on Outposts that uses the S3 on Outposts endpoint hostname prefix and the <code>x-amz-outpost-id</code> derived by using the access point ARN, see the <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_GetBucketLifecycleConfiguration.html#API_control_GetBucketLifecycleConfiguration_Examples\\\">Examples</a> section.</p>\\n         <p>\\n            <code>GetBucketLifecycleConfiguration</code> has the following special error:</p>\\n         <ul>\\n            <li>\\n               <p>Error code: <code>NoSuchLifecycleConfiguration</code>\\n               </p>\\n               <ul>\\n                  <li>\\n                     <p>Description: The lifecycle configuration does not exist.</p>\\n                  </li>\\n                  <li>\\n                     <p>HTTP Status Code: 404 Not Found</p>\\n                  </li>\\n                  <li>\\n                     <p>SOAP Fault Code Prefix: Client</p>\\n                  </li>\\n               </ul>\\n            </li>\\n         </ul>\\n         <p>The following actions are related to\\n         <code>GetBucketLifecycleConfiguration</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_PutBucketLifecycleConfiguration.html\\\">PutBucketLifecycleConfiguration</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_DeleteBucketLifecycleConfiguration.html\\\">DeleteBucketLifecycleConfiguration</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/v20180820/bucket/{Bucket}/lifecycleconfiguration\",\n                    \"code\": 200\n                },\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#GetBucketLifecycleConfigurationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID of the Outposts bucket.</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                },\n                \"Bucket\": {\n                    \"target\": \"com.amazonaws.s3control#BucketName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the bucket.</p>\\n         <p>For using this parameter with Amazon S3 on Outposts with the REST API, you must specify the name and the x-amz-outpost-id as well.</p>\\n         <p>For using this parameter with S3 on Outposts with the Amazon Web Services SDK and CLI, you must  specify the ARN of the bucket accessed in the format <code>arn:aws:s3-outposts:<Region>:<account-id>:outpost/<outpost-id>/bucket/<my-bucket-name></code>. For example, to access the bucket <code>reports</code> through Outpost <code>my-outpost</code> owned by account <code>123456789012</code> in Region <code>us-west-2</code>, use the URL encoding of <code>arn:aws:s3-outposts:us-west-2:123456789012:outpost/my-outpost/bucket/reports</code>. The value must be URL encoded.  </p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"Bucket\"\n                        }\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#GetBucketLifecycleConfigurationResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Rules\": {\n                    \"target\": \"com.amazonaws.s3control#LifecycleRules\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Container for the lifecycle rule of the Outposts bucket.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.s3control#GetBucketPolicy\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#GetBucketPolicyRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.s3control#GetBucketPolicyResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>This action gets a bucket policy for an Amazon S3 on Outposts bucket. To get a policy for\\n            an S3 bucket, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketPolicy.html\\\">GetBucketPolicy</a> in the\\n               <i>Amazon S3 API Reference</i>. </p>\\n         </note>\\n         <p>Returns the policy of a specified Outposts bucket. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html\\\">Using\\n            Amazon S3 on Outposts</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <p>If you are using an identity other than the root user of the Amazon Web Services account that owns the\\n         bucket, the calling identity must have the <code>GetBucketPolicy</code> permissions on the\\n         specified bucket and belong to the bucket owner's account in order to use this\\n         action.</p>\\n         <p>Only users from Outposts bucket owner account with the right permissions can perform\\n         actions on an Outposts bucket. If you don't have <code>s3-outposts:GetBucketPolicy</code>\\n         permissions or you're not using an identity that belongs to the bucket owner's account,\\n         Amazon S3 returns a <code>403 Access Denied</code> error.</p>\\n         <important>\\n            <p>As a security precaution, the root user of the Amazon Web Services account that owns a bucket can\\n            always use this action, even if the policy explicitly denies the root user the ability\\n            to perform this action.</p>\\n         </important>\\n         <p>For more information about bucket policies, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/using-iam-policies.html\\\">Using Bucket Policies and User\\n            Policies</a>.</p>\\n         <p>All Amazon S3 on Outposts REST API requests for this action require an additional parameter of <code>x-amz-outpost-id</code> to be passed with the request. In addition, you must use an S3 on Outposts endpoint hostname prefix instead of <code>s3-control</code>. For an example of the request syntax for Amazon S3 on Outposts that uses the S3 on Outposts endpoint hostname prefix and the <code>x-amz-outpost-id</code> derived by using the access point ARN, see the <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_GetBucketPolicy.html#API_control_GetBucketPolicy_Examples\\\">Examples</a> section.</p>\\n         <p>The following actions are related to <code>GetBucketPolicy</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html\\\">GetObject</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_PutBucketPolicy.html\\\">PutBucketPolicy</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_DeleteBucketPolicy.html\\\">DeleteBucketPolicy</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/v20180820/bucket/{Bucket}/policy\",\n                    \"code\": 200\n                },\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#GetBucketPolicyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID of the Outposts bucket.</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                },\n                \"Bucket\": {\n                    \"target\": \"com.amazonaws.s3control#BucketName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the bucket.</p>\\n         <p>For using this parameter with Amazon S3 on Outposts with the REST API, you must specify the name and the x-amz-outpost-id as well.</p>\\n         <p>For using this parameter with S3 on Outposts with the Amazon Web Services SDK and CLI, you must  specify the ARN of the bucket accessed in the format <code>arn:aws:s3-outposts:<Region>:<account-id>:outpost/<outpost-id>/bucket/<my-bucket-name></code>. For example, to access the bucket <code>reports</code> through Outpost <code>my-outpost</code> owned by account <code>123456789012</code> in Region <code>us-west-2</code>, use the URL encoding of <code>arn:aws:s3-outposts:us-west-2:123456789012:outpost/my-outpost/bucket/reports</code>. The value must be URL encoded.  </p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"Bucket\"\n                        }\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#GetBucketPolicyResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Policy\": {\n                    \"target\": \"com.amazonaws.s3control#Policy\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The policy of the Outposts bucket.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.s3control#GetBucketReplication\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#GetBucketReplicationRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.s3control#GetBucketReplicationResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>This operation gets an Amazon S3 on Outposts bucket's replication configuration. To get an\\n            S3 bucket's replication configuration, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketReplication.html\\\">GetBucketReplication</a>\\n            in the <i>Amazon S3 API Reference</i>. </p>\\n         </note>\\n         <p>Returns the replication configuration of an S3 on Outposts bucket. For more information\\n         about S3 on Outposts, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html\\\">Using Amazon S3 on Outposts</a> in the\\n            <i>Amazon S3 User Guide</i>. For information about S3 replication on Outposts\\n         configuration, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3OutpostsReplication.html\\\">Replicating objects for\\n            S3 on Outposts</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <note>\\n            <p>It can take a while to propagate <code>PUT</code> or <code>DELETE</code> requests for\\n            a replication configuration to all S3 on Outposts systems. Therefore, the replication\\n            configuration that's returned by a <code>GET</code> request soon after a\\n               <code>PUT</code> or <code>DELETE</code> request might return a more recent result\\n            than what's on the Outpost. If an Outpost is offline, the delay in updating the\\n            replication configuration on that Outpost can be significant.</p>\\n         </note>\\n         <p>This action requires permissions for the\\n            <code>s3-outposts:GetReplicationConfiguration</code> action. The Outposts bucket owner\\n         has this permission by default and can grant it to others. For more information about\\n         permissions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3OutpostsIAM.html\\\">Setting up IAM with\\n            S3 on Outposts</a> and <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3OutpostsBucketPolicy.html\\\">Managing access to\\n            S3 on Outposts bucket</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <p>All Amazon S3 on Outposts REST API requests for this action require an additional parameter of <code>x-amz-outpost-id</code> to be passed with the request. In addition, you must use an S3 on Outposts endpoint hostname prefix instead of <code>s3-control</code>. For an example of the request syntax for Amazon S3 on Outposts that uses the S3 on Outposts endpoint hostname prefix and the <code>x-amz-outpost-id</code> derived by using the access point ARN, see the <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_GetBucketReplication.html#API_control_GetBucketReplication_Examples\\\">Examples</a> section.</p>\\n         <p>If you include the <code>Filter</code> element in a replication configuration, you must\\n         also include the <code>DeleteMarkerReplication</code>, <code>Status</code>, and\\n            <code>Priority</code> elements. The response also returns those elements.</p>\\n         <p>For information about S3 on Outposts replication failure reasons, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/outposts-replication-eventbridge.html#outposts-replication-failure-codes\\\">Replication failure reasons</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <p>The following operations are related to <code>GetBucketReplication</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_PutBucketReplication.html\\\">PutBucketReplication</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_DeleteBucketReplication.html\\\">DeleteBucketReplication</a>\\n               </p>\\n            </li>\\n         </ul>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/v20180820/bucket/{Bucket}/replication\",\n                    \"code\": 200\n                },\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#GetBucketReplicationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID of the Outposts bucket.</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                },\n                \"Bucket\": {\n                    \"target\": \"com.amazonaws.s3control#BucketName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the bucket to get the replication information for.</p>\\n         <p>For using this parameter with Amazon S3 on Outposts with the REST API, you must specify the name and the x-amz-outpost-id as well.</p>\\n         <p>For using this parameter with S3 on Outposts with the Amazon Web Services SDK and CLI, you must  specify the ARN of the bucket accessed in the format <code>arn:aws:s3-outposts:<Region>:<account-id>:outpost/<outpost-id>/bucket/<my-bucket-name></code>. For example, to access the bucket <code>reports</code> through Outpost <code>my-outpost</code> owned by account <code>123456789012</code> in Region <code>us-west-2</code>, use the URL encoding of <code>arn:aws:s3-outposts:us-west-2:123456789012:outpost/my-outpost/bucket/reports</code>. The value must be URL encoded.  </p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"Bucket\"\n                        }\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#GetBucketReplicationResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ReplicationConfiguration\": {\n                    \"target\": \"com.amazonaws.s3control#ReplicationConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A container for one or more replication rules. A replication configuration must have at\\n         least one rule and you can add up to 100 rules. The maximum size of a replication\\n         configuration is 128 KB.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.s3control#GetBucketRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID of the Outposts bucket.</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                },\n                \"Bucket\": {\n                    \"target\": \"com.amazonaws.s3control#BucketName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the bucket.</p>\\n         <p>For using this parameter with Amazon S3 on Outposts with the REST API, you must specify the name and the x-amz-outpost-id as well.</p>\\n         <p>For using this parameter with S3 on Outposts with the Amazon Web Services SDK and CLI, you must  specify the ARN of the bucket accessed in the format <code>arn:aws:s3-outposts:<Region>:<account-id>:outpost/<outpost-id>/bucket/<my-bucket-name></code>. For example, to access the bucket <code>reports</code> through Outpost <code>my-outpost</code> owned by account <code>123456789012</code> in Region <code>us-west-2</code>, use the URL encoding of <code>arn:aws:s3-outposts:us-west-2:123456789012:outpost/my-outpost/bucket/reports</code>. The value must be URL encoded.  </p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"Bucket\"\n                        }\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#GetBucketResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Bucket\": {\n                    \"target\": \"com.amazonaws.s3control#BucketName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Outposts bucket requested.</p>\"\n                    }\n                },\n                \"PublicAccessBlockEnabled\": {\n                    \"target\": \"com.amazonaws.s3control#PublicAccessBlockEnabled\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                },\n                \"CreationDate\": {\n                    \"target\": \"com.amazonaws.s3control#CreationDate\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The creation date of the Outposts bucket.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.s3control#GetBucketTagging\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#GetBucketTaggingRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.s3control#GetBucketTaggingResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>This action gets an Amazon S3 on Outposts bucket's tags. To get an S3 bucket tags, see\\n               <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketTagging.html\\\">GetBucketTagging</a> in the <i>Amazon S3 API Reference</i>. </p>\\n         </note>\\n         <p>Returns the tag set associated with the Outposts bucket. For more information, see\\n            <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html\\\">Using\\n            Amazon S3 on Outposts</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <p>To use this action, you must have permission to perform the\\n            <code>GetBucketTagging</code> action. By default, the bucket owner has this permission\\n         and can grant this permission to others.</p>\\n         <p>\\n            <code>GetBucketTagging</code> has the following special error:</p>\\n         <ul>\\n            <li>\\n               <p>Error code: <code>NoSuchTagSetError</code>\\n               </p>\\n               <ul>\\n                  <li>\\n                     <p>Description: There is no tag set associated with the bucket.</p>\\n                  </li>\\n               </ul>\\n            </li>\\n         </ul>\\n         <p>All Amazon S3 on Outposts REST API requests for this action require an additional parameter of <code>x-amz-outpost-id</code> to be passed with the request. In addition, you must use an S3 on Outposts endpoint hostname prefix instead of <code>s3-control</code>. For an example of the request syntax for Amazon S3 on Outposts that uses the S3 on Outposts endpoint hostname prefix and the <code>x-amz-outpost-id</code> derived by using the access point ARN, see the <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_GetBucketTagging.html#API_control_GetBucketTagging_Examples\\\">Examples</a> section.</p>\\n         <p>The following actions are related to <code>GetBucketTagging</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_PutBucketTagging.html\\\">PutBucketTagging</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_DeleteBucketTagging.html\\\">DeleteBucketTagging</a>\\n               </p>\\n            </li>\\n         </ul>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/v20180820/bucket/{Bucket}/tagging\",\n                    \"code\": 200\n                },\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#GetBucketTaggingRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID of the Outposts bucket.</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                },\n                \"Bucket\": {\n                    \"target\": \"com.amazonaws.s3control#BucketName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the bucket.</p>\\n         <p>For using this parameter with Amazon S3 on Outposts with the REST API, you must specify the name and the x-amz-outpost-id as well.</p>\\n         <p>For using this parameter with S3 on Outposts with the Amazon Web Services SDK and CLI, you must  specify the ARN of the bucket accessed in the format <code>arn:aws:s3-outposts:<Region>:<account-id>:outpost/<outpost-id>/bucket/<my-bucket-name></code>. For example, to access the bucket <code>reports</code> through Outpost <code>my-outpost</code> owned by account <code>123456789012</code> in Region <code>us-west-2</code>, use the URL encoding of <code>arn:aws:s3-outposts:us-west-2:123456789012:outpost/my-outpost/bucket/reports</code>. The value must be URL encoded.  </p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"Bucket\"\n                        }\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#GetBucketTaggingResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TagSet\": {\n                    \"target\": \"com.amazonaws.s3control#S3TagSet\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags set of the Outposts bucket.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.s3control#GetBucketVersioning\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#GetBucketVersioningRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.s3control#GetBucketVersioningResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>This operation returns the versioning state\\n            for\\n            S3 on Outposts\\n            buckets\\n            only. To return the versioning state for an S3 bucket, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketVersioning.html\\\">GetBucketVersioning</a> in the <i>Amazon S3 API Reference</i>. </p>\\n         </note>\\n         <p>Returns the versioning state for an S3 on Outposts bucket. With\\n         S3\\n         Versioning,\\n         you can save multiple distinct copies of your\\n         objects\\n         and recover from unintended user actions and application failures.</p>\\n         <p>If you've never set versioning on your bucket, it has no versioning state. In that case,\\n         the <code>GetBucketVersioning</code> request does not return a versioning state\\n         value.</p>\\n         <p>For more information about versioning, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/Versioning.html\\\">Versioning</a> in the <i>Amazon S3\\n            User Guide</i>.</p>\\n         <p>All Amazon S3 on Outposts REST API requests for this action require an additional parameter of <code>x-amz-outpost-id</code> to be passed with the request. In addition, you must use an S3 on Outposts endpoint hostname prefix instead of <code>s3-control</code>. For an example of the request syntax for Amazon S3 on Outposts that uses the S3 on Outposts endpoint hostname prefix and the <code>x-amz-outpost-id</code> derived by using the access point ARN, see the <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_GetBucketVersioning.html#API_control_GetBucketVersioning_Examples\\\">Examples</a> section.</p>\\n         <p>The following operations are related to <code>GetBucketVersioning</code> for\\n         S3 on Outposts.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_PutBucketVersioning.html\\\">PutBucketVersioning</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_PutBucketLifecycleConfiguration.html\\\">PutBucketLifecycleConfiguration</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_GetBucketLifecycleConfiguration.html\\\">GetBucketLifecycleConfiguration</a>\\n               </p>\\n            </li>\\n         </ul>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/v20180820/bucket/{Bucket}/versioning\",\n                    \"code\": 200\n                },\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#GetBucketVersioningRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID of the S3 on Outposts bucket.</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                },\n                \"Bucket\": {\n                    \"target\": \"com.amazonaws.s3control#BucketName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The S3 on Outposts bucket to return the versioning state for.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"Bucket\"\n                        }\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#GetBucketVersioningResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Status\": {\n                    \"target\": \"com.amazonaws.s3control#BucketVersioningStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The versioning state of the S3 on Outposts bucket.</p>\"\n                    }\n                },\n                \"MFADelete\": {\n                    \"target\": \"com.amazonaws.s3control#MFADeleteStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies whether MFA delete is enabled in the bucket versioning configuration. This\\n         element is returned only if the bucket has been configured with MFA delete. If MFA delete\\n         has never been configured for the bucket, this element is not returned.</p>\",\n                        \"smithy.api#xmlName\": \"MfaDelete\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.s3control#GetDataAccess\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#GetDataAccessRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.s3control#GetDataAccessResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns a temporary access credential from S3 Access Grants to the grantee or client application.\\n         The <a href=\\\"https://docs.aws.amazon.com/STS/latest/APIReference/API_Credentials.html\\\">temporary credential</a> is an Amazon Web Services STS token that grants them access to the S3 data. </p>\\n         <dl>\\n            <dt>Permissions</dt>\\n            <dd>\\n               <p>You must have the <code>s3:GetDataAccess</code> permission to use this\\n                  operation. </p>\\n            </dd>\\n            <dt>Additional Permissions</dt>\\n            <dd>\\n               <p>The IAM role that S3 Access Grants assumes must have the following permissions\\n                  specified in the trust policy when registering the location:\\n                     <code>sts:AssumeRole</code>, for directory users or groups\\n                     <code>sts:SetContext</code>, and for IAM users or roles\\n                     <code>sts:SetSourceIdentity</code>. </p>\\n            </dd>\\n         </dl>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/v20180820/accessgrantsinstance/dataaccess\",\n                    \"code\": 200\n                },\n                \"smithy.api#httpChecksumRequired\": {},\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#GetDataAccessRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID of the S3 Access Grants instance.</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                },\n                \"Target\": {\n                    \"target\": \"com.amazonaws.s3control#S3Prefix\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The S3 URI path of the data to which you are requesting temporary access credentials. If\\n         the requesting account has an access grant for this data, S3 Access Grants vends temporary access\\n         credentials in the response.</p>\",\n                        \"smithy.api#httpQuery\": \"target\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Permission\": {\n                    \"target\": \"com.amazonaws.s3control#Permission\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of permission granted to your S3 data, which can be set to one of the following\\n         values:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>READ</code> – Grant read-only access to the S3 data.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>WRITE</code> – Grant write-only access to the S3 data.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>READWRITE</code> – Grant both read and write access to the S3 data.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#httpQuery\": \"permission\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DurationSeconds\": {\n                    \"target\": \"com.amazonaws.s3control#DurationSeconds\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The session duration, in seconds, of the temporary access credential that S3 Access Grants vends\\n         to the grantee or client application. The default value is 1 hour, but the grantee can\\n         specify a range from 900 seconds (15 minutes) up to 43200 seconds (12 hours). If the\\n         grantee requests a value higher than this maximum, the operation fails. </p>\",\n                        \"smithy.api#httpQuery\": \"durationSeconds\"\n                    }\n                },\n                \"Privilege\": {\n                    \"target\": \"com.amazonaws.s3control#Privilege\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The scope of the temporary access credential that S3 Access Grants vends to the grantee or client\\n         application. </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>Default</code> – The scope of the returned temporary access token is the scope\\n               of the grant that is closest to the target scope.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>Minimal</code> – The scope of the returned temporary access token is the same\\n               as the requested target scope as long as the requested scope is the same as or a\\n               subset of the grant scope. </p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#httpQuery\": \"privilege\"\n                    }\n                },\n                \"TargetType\": {\n                    \"target\": \"com.amazonaws.s3control#S3PrefixType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of <code>Target</code>. The only possible value is <code>Object</code>. Pass\\n         this value if the target data that you would like to access is a path to an object. Do not\\n         pass this value if the target data is a bucket or a bucket and a prefix. </p>\",\n                        \"smithy.api#httpQuery\": \"targetType\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#GetDataAccessResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Credentials\": {\n                    \"target\": \"com.amazonaws.s3control#Credentials\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The temporary credential token that S3 Access Grants vends.</p>\"\n                    }\n                },\n                \"MatchedGrantTarget\": {\n                    \"target\": \"com.amazonaws.s3control#S3Prefix\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The S3 URI path of the data to which you are being granted temporary access credentials.\\n      </p>\"\n                    }\n                },\n                \"Grantee\": {\n                    \"target\": \"com.amazonaws.s3control#Grantee\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The user, group, or role that was granted access to the S3 location scope. For directory\\n         identities, this API also returns the grants of the IAM role used for the identity-aware\\n         request. For more information on identity-aware sessions, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_control-access_sts-setcontext.html\\\">Granting permissions to use identity-aware console sessions</a>. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.s3control#GetJobTagging\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#GetJobTaggingRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.s3control#GetJobTaggingResult\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.s3control#InternalServiceException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#NotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#TooManyRequestsException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns the tags on an S3 Batch Operations job. </p>\\n         <dl>\\n            <dt>Permissions</dt>\\n            <dd>\\n               <p>To use the <code>GetJobTagging</code> operation, you must have permission to\\n                  perform the <code>s3:GetJobTagging</code> action. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/batch-ops-managing-jobs.html#batch-ops-job-tags\\\">Controlling access and labeling jobs using tags</a> in the\\n                     <i>Amazon S3 User Guide</i>.</p>\\n            </dd>\\n         </dl>\\n         <p>Related actions include:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_CreateJob.html\\\">CreateJob</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_PutJobTagging.html\\\">PutJobTagging</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_DeleteJobTagging.html\\\">DeleteJobTagging</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/v20180820/jobs/{JobId}/tagging\",\n                    \"code\": 200\n                },\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#GetJobTaggingRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID associated with the S3 Batch Operations job.</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                },\n                \"JobId\": {\n                    \"target\": \"com.amazonaws.s3control#JobId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID for the S3 Batch Operations job whose tags you want to retrieve.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#GetJobTaggingResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.s3control#S3TagSet\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The set of tags associated with the S3 Batch Operations job.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.s3control#GetMultiRegionAccessPoint\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#GetMultiRegionAccessPointRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.s3control#GetMultiRegionAccessPointResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported by directory buckets.</p>\\n         </note>\\n         <p>Returns configuration information about the specified Multi-Region Access Point.</p>\\n         <p>This action will always be routed to the US West (Oregon) Region. For more information\\n         about the restrictions around working with Multi-Region Access Points, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/MultiRegionAccessPointRestrictions.html\\\">Multi-Region Access Point\\n            restrictions and limitations</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <p>The following actions are related to <code>GetMultiRegionAccessPoint</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_CreateMultiRegionAccessPoint.html\\\">CreateMultiRegionAccessPoint</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_DeleteMultiRegionAccessPoint.html\\\">DeleteMultiRegionAccessPoint</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_DescribeMultiRegionAccessPointOperation.html\\\">DescribeMultiRegionAccessPointOperation</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_ListMultiRegionAccessPoints.html\\\">ListMultiRegionAccessPoints</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/v20180820/mrap/instances/{Name+}\",\n                    \"code\": 200\n                },\n                \"smithy.api#httpChecksumRequired\": {},\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#GetMultiRegionAccessPointPolicy\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#GetMultiRegionAccessPointPolicyRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.s3control#GetMultiRegionAccessPointPolicyResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported by directory buckets.</p>\\n         </note>\\n         <p>Returns the access control policy of the specified Multi-Region Access Point.</p>\\n         <p>This action will always be routed to the US West (Oregon) Region. For more information\\n         about the restrictions around working with Multi-Region Access Points, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/MultiRegionAccessPointRestrictions.html\\\">Multi-Region Access Point\\n            restrictions and limitations</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <p>The following actions are related to\\n         <code>GetMultiRegionAccessPointPolicy</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_GetMultiRegionAccessPointPolicyStatus.html\\\">GetMultiRegionAccessPointPolicyStatus</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_PutMultiRegionAccessPointPolicy.html\\\">PutMultiRegionAccessPointPolicy</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/v20180820/mrap/instances/{Name+}/policy\",\n                    \"code\": 200\n                },\n                \"smithy.api#httpChecksumRequired\": {},\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#GetMultiRegionAccessPointPolicyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID for the owner of the Multi-Region Access Point.</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                },\n                \"Name\": {\n                    \"target\": \"com.amazonaws.s3control#MultiRegionAccessPointName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the Multi-Region Access Point. The name of the Multi-Region Access Point is different from the alias. For more\\n         information about the distinction between the name and the alias of an Multi-Region Access Point, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/CreatingMultiRegionAccessPoints.html#multi-region-access-point-naming\\\">Rules for naming Amazon S3 Multi-Region Access Points</a> in the\\n         <i>Amazon S3 User Guide</i>.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#GetMultiRegionAccessPointPolicyResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Policy\": {\n                    \"target\": \"com.amazonaws.s3control#MultiRegionAccessPointPolicyDocument\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The policy associated with the specified Multi-Region Access Point.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.s3control#GetMultiRegionAccessPointPolicyStatus\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#GetMultiRegionAccessPointPolicyStatusRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.s3control#GetMultiRegionAccessPointPolicyStatusResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported by directory buckets.</p>\\n         </note>\\n         <p>Indicates whether the specified Multi-Region Access Point has an access control policy that allows public\\n         access.</p>\\n         <p>This action will always be routed to the US West (Oregon) Region. For more information\\n         about the restrictions around working with Multi-Region Access Points, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/MultiRegionAccessPointRestrictions.html\\\">Multi-Region Access Point\\n            restrictions and limitations</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <p>The following actions are related to\\n         <code>GetMultiRegionAccessPointPolicyStatus</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_GetMultiRegionAccessPointPolicy.html\\\">GetMultiRegionAccessPointPolicy</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_PutMultiRegionAccessPointPolicy.html\\\">PutMultiRegionAccessPointPolicy</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/v20180820/mrap/instances/{Name+}/policystatus\",\n                    \"code\": 200\n                },\n                \"smithy.api#httpChecksumRequired\": {},\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#GetMultiRegionAccessPointPolicyStatusRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID for the owner of the Multi-Region Access Point.</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                },\n                \"Name\": {\n                    \"target\": \"com.amazonaws.s3control#MultiRegionAccessPointName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the Multi-Region Access Point. The name of the Multi-Region Access Point is different from the alias. For more\\n         information about the distinction between the name and the alias of an Multi-Region Access Point, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/CreatingMultiRegionAccessPoints.html#multi-region-access-point-naming\\\">Rules for naming Amazon S3 Multi-Region Access Points</a> in the\\n         <i>Amazon S3 User Guide</i>.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#GetMultiRegionAccessPointPolicyStatusResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Established\": {\n                    \"target\": \"com.amazonaws.s3control#PolicyStatus\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.s3control#GetMultiRegionAccessPointRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID for the owner of the Multi-Region Access Point.</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                },\n                \"Name\": {\n                    \"target\": \"com.amazonaws.s3control#MultiRegionAccessPointName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the Multi-Region Access Point whose configuration information you want to receive. The name of\\n         the Multi-Region Access Point is different from the alias. For more information about the distinction between\\n         the name and the alias of an Multi-Region Access Point, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/CreatingMultiRegionAccessPoints.html#multi-region-access-point-naming\\\">Rules for naming Amazon S3 Multi-Region Access Points</a> in the\\n         <i>Amazon S3 User Guide</i>.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#GetMultiRegionAccessPointResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccessPoint\": {\n                    \"target\": \"com.amazonaws.s3control#MultiRegionAccessPointReport\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A container element containing the details of the requested Multi-Region Access Point.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.s3control#GetMultiRegionAccessPointRoutes\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#GetMultiRegionAccessPointRoutesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.s3control#GetMultiRegionAccessPointRoutesResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported by directory buckets.</p>\\n         </note>\\n         <p>Returns the routing configuration for a Multi-Region Access Point, indicating which Regions are active or\\n         passive.</p>\\n         <p>To obtain routing control changes and failover requests, use the Amazon S3 failover control\\n         infrastructure endpoints in these five Amazon Web Services Regions:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>us-east-1</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>us-west-2</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ap-southeast-2</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ap-northeast-1</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>eu-west-1</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/v20180820/mrap/instances/{Mrap+}/routes\",\n                    \"code\": 200\n                },\n                \"smithy.api#httpChecksumRequired\": {},\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#GetMultiRegionAccessPointRoutesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID for the owner of the Multi-Region Access Point.</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                },\n                \"Mrap\": {\n                    \"target\": \"com.amazonaws.s3control#MultiRegionAccessPointId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Multi-Region Access Point ARN.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#GetMultiRegionAccessPointRoutesResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Mrap\": {\n                    \"target\": \"com.amazonaws.s3control#MultiRegionAccessPointId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Multi-Region Access Point ARN.</p>\"\n                    }\n                },\n                \"Routes\": {\n                    \"target\": \"com.amazonaws.s3control#RouteList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The different routes that make up the route configuration. Active routes return a value\\n         of <code>100</code>, and passive routes return a value of <code>0</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.s3control#GetPublicAccessBlock\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#GetPublicAccessBlockRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.s3control#GetPublicAccessBlockOutput\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.s3control#NoSuchPublicAccessBlockConfiguration\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported by directory buckets.</p>\\n         </note>\\n         <p>Retrieves the <code>PublicAccessBlock</code> configuration for an Amazon Web Services account. For\\n         more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/access-control-block-public-access.html\\\"> Using Amazon S3 block\\n            public access</a>.</p>\\n         <p>Related actions include:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_DeletePublicAccessBlock.html\\\">DeletePublicAccessBlock</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_PutPublicAccessBlock.html\\\">PutPublicAccessBlock</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/v20180820/configuration/publicAccessBlock\",\n                    \"code\": 200\n                },\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#GetPublicAccessBlockOutput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PublicAccessBlockConfiguration\": {\n                    \"target\": \"com.amazonaws.s3control#PublicAccessBlockConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>PublicAccessBlock</code> configuration currently in effect for this\\n         Amazon Web Services account.</p>\",\n                        \"smithy.api#httpPayload\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.s3control#GetPublicAccessBlockRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The account ID for the Amazon Web Services account whose <code>PublicAccessBlock</code> configuration\\n         you want to retrieve.</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#GetStorageLensConfiguration\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#GetStorageLensConfigurationRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.s3control#GetStorageLensConfigurationResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported by directory buckets.</p>\\n         </note>\\n         <p>Gets the Amazon S3 Storage Lens configuration. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/storage_lens.html\\\">Assessing your storage\\n            activity and usage with Amazon S3 Storage Lens </a> in the\\n            <i>Amazon S3 User Guide</i>. For a complete list of S3 Storage Lens metrics, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage_lens_metrics_glossary.html\\\">S3 Storage Lens metrics glossary</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <note>\\n            <p>To use this action, you must have permission to perform the\\n               <code>s3:GetStorageLensConfiguration</code> action. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/storage_lens_iam_permissions.html\\\">Setting permissions to use Amazon S3 Storage Lens</a> in the\\n               <i>Amazon S3 User Guide</i>.</p>\\n         </note>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/v20180820/storagelens/{ConfigId}\",\n                    \"code\": 200\n                },\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#GetStorageLensConfigurationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConfigId\": {\n                    \"target\": \"com.amazonaws.s3control#ConfigId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the Amazon S3 Storage Lens configuration.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The account ID of the requester.</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#GetStorageLensConfigurationResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"StorageLensConfiguration\": {\n                    \"target\": \"com.amazonaws.s3control#StorageLensConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The S3 Storage Lens configuration requested.</p>\",\n                        \"smithy.api#httpPayload\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.s3control#GetStorageLensConfigurationTagging\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#GetStorageLensConfigurationTaggingRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.s3control#GetStorageLensConfigurationTaggingResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported by directory buckets.</p>\\n         </note>\\n         <p>Gets the tags of Amazon S3 Storage Lens configuration. For more information about S3 Storage Lens, see\\n            <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/storage_lens.html\\\">Assessing your\\n            storage activity and usage with Amazon S3 Storage Lens </a> in the\\n            <i>Amazon S3 User Guide</i>.</p>\\n         <note>\\n            <p>To use this action, you must have permission to perform the\\n               <code>s3:GetStorageLensConfigurationTagging</code> action. For more information, see\\n               <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/storage_lens_iam_permissions.html\\\">Setting permissions to\\n               use Amazon S3 Storage Lens</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         </note>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/v20180820/storagelens/{ConfigId}/tagging\",\n                    \"code\": 200\n                },\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#GetStorageLensConfigurationTaggingRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConfigId\": {\n                    \"target\": \"com.amazonaws.s3control#ConfigId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the Amazon S3 Storage Lens configuration.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The account ID of the requester.</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#GetStorageLensConfigurationTaggingResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.s3control#StorageLensTags\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags of S3 Storage Lens configuration requested.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.s3control#GetStorageLensGroup\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#GetStorageLensGroupRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.s3control#GetStorageLensGroupResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>\\nRetrieves the Storage Lens group configuration details.</p>\\n         <p>To use this operation, you must have the permission to perform the\\n      <code>s3:GetStorageLensGroup</code> action. For more information about the required Storage Lens\\n      Groups permissions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage_lens_iam_permissions.html#storage_lens_groups_permissions\\\">Setting account permissions to use S3 Storage Lens groups</a>.</p>\\n         <p>For information about Storage Lens groups errors, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html#S3LensErrorCodeList\\\">List of Amazon S3 Storage\\n      Lens error codes</a>.</p>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/v20180820/storagelensgroup/{Name}\",\n                    \"code\": 200\n                },\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#GetStorageLensGroupRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Name\": {\n                    \"target\": \"com.amazonaws.s3control#StorageLensGroupName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>\\nThe name of the Storage Lens group that you're trying to retrieve the configuration details for.\\n</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>\\nThe Amazon Web Services account ID associated with the Storage Lens group that you're trying to retrieve the details for.\\n</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#GetStorageLensGroupResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"StorageLensGroup\": {\n                    \"target\": \"com.amazonaws.s3control#StorageLensGroup\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>\\nThe name of the Storage Lens group that you're trying to retrieve the configuration details for.\\n</p>\",\n                        \"smithy.api#httpPayload\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.s3control#GrantFullControl\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.s3control#GrantRead\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.s3control#GrantReadACP\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.s3control#GrantWrite\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.s3control#GrantWriteACP\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.s3control#Grantee\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"GranteeType\": {\n                    \"target\": \"com.amazonaws.s3control#GranteeType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of the grantee to which access has been granted. It can be one of the following\\n         values:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>IAM</code> - An IAM user or role.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>DIRECTORY_USER</code> - Your corporate directory user. You can use\\n               this option if you have added your corporate identity directory to IAM Identity\\n               Center and associated the IAM Identity Center instance with your S3 Access Grants\\n               instance.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>DIRECTORY_GROUP</code> - Your corporate directory group. You can use\\n               this option if you have added your corporate identity directory to IAM Identity\\n               Center and associated the IAM Identity Center instance with your S3 Access Grants\\n               instance.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"GranteeIdentifier\": {\n                    \"target\": \"com.amazonaws.s3control#GranteeIdentifier\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The unique identifier of the <code>Grantee</code>. If the grantee type is\\n            <code>IAM</code>, the identifier is the IAM Amazon Resource Name (ARN) of the user\\n         or role. If the grantee type is a directory user or group, the identifier is 128-bit\\n         universally unique identifier (UUID) in the format\\n            <code>a1b2c3d4-5678-90ab-cdef-EXAMPLE11111</code>. You can obtain this UUID from your\\n         Amazon Web Services IAM Identity Center instance.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The user, group, or role to which you are granting access. You can grant access to an\\n         IAM user or role. If you have added your corporate directory to Amazon Web Services IAM Identity\\n         Center and associated your Identity Center instance with your S3 Access Grants instance, the grantee\\n         can also be a corporate directory user or group.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#GranteeIdentifier\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.s3control#GranteeType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"DIRECTORY_USER\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DIRECTORY_USER\"\n                    }\n                },\n                \"DIRECTORY_GROUP\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DIRECTORY_GROUP\"\n                    }\n                },\n                \"IAM\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"IAM\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#IAMRoleArn\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 2048\n                },\n                \"smithy.api#pattern\": \"^arn:[^:]+:iam::\\\\d{12}:role/\"\n            }\n        },\n        \"com.amazonaws.s3control#ID\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.s3control#IdempotencyException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Message\": {\n                    \"target\": \"com.amazonaws.s3control#ExceptionMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p></p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.s3control#IdentityCenterApplicationArn\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 10,\n                    \"max\": 1224\n                },\n                \"smithy.api#pattern\": \"^arn:[^:]+:sso::\\\\d{12}:application/.*$\"\n            }\n        },\n        \"com.amazonaws.s3control#IdentityCenterArn\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 10,\n                    \"max\": 1224\n                },\n                \"smithy.api#pattern\": \"^arn:[^:]+:sso::(\\\\d{12}){0,1}:instance/.*$\"\n            }\n        },\n        \"com.amazonaws.s3control#Include\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Buckets\": {\n                    \"target\": \"com.amazonaws.s3control#Buckets\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A container for the S3 Storage Lens bucket includes.</p>\"\n                    }\n                },\n                \"Regions\": {\n                    \"target\": \"com.amazonaws.s3control#Regions\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A container for the S3 Storage Lens Region includes.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A container for what Amazon S3 Storage Lens configuration includes.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#InternalServiceException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Message\": {\n                    \"target\": \"com.amazonaws.s3control#ExceptionMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p></p>\",\n                \"smithy.api#error\": \"server\"\n            }\n        },\n        \"com.amazonaws.s3control#InvalidNextTokenException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Message\": {\n                    \"target\": \"com.amazonaws.s3control#ExceptionMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p></p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.s3control#InvalidRequestException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Message\": {\n                    \"target\": \"com.amazonaws.s3control#ExceptionMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p></p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.s3control#IsEnabled\": {\n            \"type\": \"boolean\",\n            \"traits\": {\n                \"smithy.api#default\": false\n            }\n        },\n        \"com.amazonaws.s3control#IsPublic\": {\n            \"type\": \"boolean\",\n            \"traits\": {\n                \"smithy.api#default\": false\n            }\n        },\n        \"com.amazonaws.s3control#JobArn\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 1024\n                },\n                \"smithy.api#pattern\": \"^arn:[^:]+:s3:[a-zA-Z0-9\\\\-]+:\\\\d{12}:job\\\\/\"\n            }\n        },\n        \"com.amazonaws.s3control#JobCreationTime\": {\n            \"type\": \"timestamp\"\n        },\n        \"com.amazonaws.s3control#JobDescriptor\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"JobId\": {\n                    \"target\": \"com.amazonaws.s3control#JobId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID for the specified job.</p>\"\n                    }\n                },\n                \"ConfirmationRequired\": {\n                    \"target\": \"com.amazonaws.s3control#ConfirmationRequired\",\n                    \"traits\": {\n                        \"smithy.api#default\": null,\n                        \"smithy.api#documentation\": \"<p>Indicates whether confirmation is required before Amazon S3 begins running the specified job.\\n         Confirmation is required only for jobs created through the Amazon S3 console.</p>\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.s3control#NonEmptyMaxLength256String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The description for this job, if one was provided in this job's <code>Create Job</code>\\n         request.</p>\"\n                    }\n                },\n                \"JobArn\": {\n                    \"target\": \"com.amazonaws.s3control#JobArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) for this job.</p>\"\n                    }\n                },\n                \"Status\": {\n                    \"target\": \"com.amazonaws.s3control#JobStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The current status of the specified job.</p>\"\n                    }\n                },\n                \"Manifest\": {\n                    \"target\": \"com.amazonaws.s3control#JobManifest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The configuration information for the specified job's manifest object.</p>\"\n                    }\n                },\n                \"Operation\": {\n                    \"target\": \"com.amazonaws.s3control#JobOperation\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The operation that the specified job is configured to run on the objects listed in the\\n         manifest.</p>\"\n                    }\n                },\n                \"Priority\": {\n                    \"target\": \"com.amazonaws.s3control#JobPriority\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The priority of the specified job.</p>\"\n                    }\n                },\n                \"ProgressSummary\": {\n                    \"target\": \"com.amazonaws.s3control#JobProgressSummary\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Describes the total number of tasks that the specified job has run, the number of tasks\\n         that succeeded, and the number of tasks that failed.</p>\"\n                    }\n                },\n                \"StatusUpdateReason\": {\n                    \"target\": \"com.amazonaws.s3control#JobStatusUpdateReason\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The reason for updating the job.</p>\"\n                    }\n                },\n                \"FailureReasons\": {\n                    \"target\": \"com.amazonaws.s3control#JobFailureList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If the specified job failed, this field contains information describing the\\n         failure.</p>\"\n                    }\n                },\n                \"Report\": {\n                    \"target\": \"com.amazonaws.s3control#JobReport\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Contains the configuration information for the job-completion report if you requested\\n         one in the <code>Create Job</code> request.</p>\"\n                    }\n                },\n                \"CreationTime\": {\n                    \"target\": \"com.amazonaws.s3control#JobCreationTime\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A timestamp indicating when this job was created.</p>\"\n                    }\n                },\n                \"TerminationDate\": {\n                    \"target\": \"com.amazonaws.s3control#JobTerminationDate\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A timestamp indicating when this job terminated. A job's termination date is the date\\n         and time when it succeeded, failed, or was canceled.</p>\"\n                    }\n                },\n                \"RoleArn\": {\n                    \"target\": \"com.amazonaws.s3control#IAMRoleArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) for the Identity and Access Management (IAM) role assigned to run the tasks\\n         for this job.</p>\"\n                    }\n                },\n                \"SuspendedDate\": {\n                    \"target\": \"com.amazonaws.s3control#SuspendedDate\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The timestamp when this job was suspended, if it has been suspended.</p>\"\n                    }\n                },\n                \"SuspendedCause\": {\n                    \"target\": \"com.amazonaws.s3control#SuspendedCause\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The reason why the specified job was suspended. A job is only suspended if you create it\\n         through the Amazon S3 console. When you create the job, it enters the <code>Suspended</code>\\n         state to await confirmation before running. After you confirm the job, it automatically\\n         exits the <code>Suspended</code> state.</p>\"\n                    }\n                },\n                \"ManifestGenerator\": {\n                    \"target\": \"com.amazonaws.s3control#JobManifestGenerator\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The manifest generator that was used to generate a job manifest for this job.</p>\"\n                    }\n                },\n                \"GeneratedManifestDescriptor\": {\n                    \"target\": \"com.amazonaws.s3control#S3GeneratedManifestDescriptor\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The attribute of the JobDescriptor containing details about the job's generated\\n         manifest.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A container element for the job configuration and status information returned by a\\n            <code>Describe Job</code> request.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#JobFailure\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"FailureCode\": {\n                    \"target\": \"com.amazonaws.s3control#JobFailureCode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The failure code, if any, for the specified job.</p>\"\n                    }\n                },\n                \"FailureReason\": {\n                    \"target\": \"com.amazonaws.s3control#JobFailureReason\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The failure reason, if any, for the specified job.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>If this job failed, this element indicates why the job failed.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#JobFailureCode\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 64\n                }\n            }\n        },\n        \"com.amazonaws.s3control#JobFailureList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.s3control#JobFailure\"\n            }\n        },\n        \"com.amazonaws.s3control#JobFailureReason\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 256\n                }\n            }\n        },\n        \"com.amazonaws.s3control#JobId\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 5,\n                    \"max\": 36\n                },\n                \"smithy.api#pattern\": \"^[a-zA-Z0-9\\\\-\\\\_]+$\"\n            }\n        },\n        \"com.amazonaws.s3control#JobListDescriptor\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"JobId\": {\n                    \"target\": \"com.amazonaws.s3control#JobId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID for the specified job.</p>\"\n                    }\n                },\n                \"Description\": {\n                    \"target\": \"com.amazonaws.s3control#NonEmptyMaxLength256String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The user-specified description that was included in the specified job's <code>Create\\n            Job</code> request.</p>\"\n                    }\n                },\n                \"Operation\": {\n                    \"target\": \"com.amazonaws.s3control#OperationName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The operation that the specified job is configured to run on every object listed in the\\n         manifest.</p>\"\n                    }\n                },\n                \"Priority\": {\n                    \"target\": \"com.amazonaws.s3control#JobPriority\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The current priority for the specified job.</p>\"\n                    }\n                },\n                \"Status\": {\n                    \"target\": \"com.amazonaws.s3control#JobStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The specified job's current status.</p>\"\n                    }\n                },\n                \"CreationTime\": {\n                    \"target\": \"com.amazonaws.s3control#JobCreationTime\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A timestamp indicating when the specified job was created.</p>\"\n                    }\n                },\n                \"TerminationDate\": {\n                    \"target\": \"com.amazonaws.s3control#JobTerminationDate\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A timestamp indicating when the specified job terminated. A job's termination date is\\n         the date and time when it succeeded, failed, or was canceled.</p>\"\n                    }\n                },\n                \"ProgressSummary\": {\n                    \"target\": \"com.amazonaws.s3control#JobProgressSummary\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Describes the total number of tasks that the specified job has run, the number of tasks\\n         that succeeded, and the number of tasks that failed.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the configuration and status information for a single job retrieved as part of\\n         a job list.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#JobListDescriptorList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.s3control#JobListDescriptor\"\n            }\n        },\n        \"com.amazonaws.s3control#JobManifest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Spec\": {\n                    \"target\": \"com.amazonaws.s3control#JobManifestSpec\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Describes the format of the specified job's manifest. If the manifest is in CSV format,\\n         also describes the columns contained within the manifest.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Location\": {\n                    \"target\": \"com.amazonaws.s3control#JobManifestLocation\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Contains the information required to locate the specified job's manifest. Manifests\\n         can't be imported from directory buckets. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-buckets-overview.html\\\">Directory buckets</a>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the configuration information for a job's manifest.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#JobManifestFieldList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.s3control#JobManifestFieldName\"\n            }\n        },\n        \"com.amazonaws.s3control#JobManifestFieldName\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"Ignore\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Ignore\"\n                    }\n                },\n                \"Bucket\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Bucket\"\n                    }\n                },\n                \"Key\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Key\"\n                    }\n                },\n                \"VersionId\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"VersionId\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#JobManifestFormat\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"S3BatchOperations_CSV_20180820\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"S3BatchOperations_CSV_20180820\"\n                    }\n                },\n                \"S3InventoryReport_CSV_20161130\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"S3InventoryReport_CSV_20161130\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#JobManifestGenerator\": {\n            \"type\": \"union\",\n            \"members\": {\n                \"S3JobManifestGenerator\": {\n                    \"target\": \"com.amazonaws.s3control#S3JobManifestGenerator\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The S3 job ManifestGenerator's configuration details.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Configures the type of the job's ManifestGenerator.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#JobManifestGeneratorFilter\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"EligibleForReplication\": {\n                    \"target\": \"com.amazonaws.s3control#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#default\": null,\n                        \"smithy.api#documentation\": \"<p>Include objects in the generated manifest only if they are eligible for replication\\n         according to the Replication configuration on the source bucket.</p>\"\n                    }\n                },\n                \"CreatedAfter\": {\n                    \"target\": \"com.amazonaws.s3control#ObjectCreationTime\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If provided, the generated manifest includes only source bucket objects that were\\n         created after this time.</p>\"\n                    }\n                },\n                \"CreatedBefore\": {\n                    \"target\": \"com.amazonaws.s3control#ObjectCreationTime\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If provided, the generated manifest includes only source bucket objects that were\\n         created before this time.</p>\"\n                    }\n                },\n                \"ObjectReplicationStatuses\": {\n                    \"target\": \"com.amazonaws.s3control#ReplicationStatusFilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If provided, the generated manifest includes only source bucket objects that have one of\\n         the specified Replication statuses.</p>\"\n                    }\n                },\n                \"KeyNameConstraint\": {\n                    \"target\": \"com.amazonaws.s3control#KeyNameConstraint\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If provided, the generated manifest includes only source bucket objects whose object\\n         keys match the string constraints specified for <code>MatchAnyPrefix</code>,\\n            <code>MatchAnySuffix</code>, and <code>MatchAnySubstring</code>.</p>\"\n                    }\n                },\n                \"ObjectSizeGreaterThanBytes\": {\n                    \"target\": \"com.amazonaws.s3control#ObjectSizeGreaterThanBytes\",\n                    \"traits\": {\n                        \"smithy.api#default\": null,\n                        \"smithy.api#documentation\": \"<p>If provided, the generated manifest includes only source bucket objects whose file size\\n         is greater than the specified number of bytes.</p>\"\n                    }\n                },\n                \"ObjectSizeLessThanBytes\": {\n                    \"target\": \"com.amazonaws.s3control#ObjectSizeLessThanBytes\",\n                    \"traits\": {\n                        \"smithy.api#default\": null,\n                        \"smithy.api#documentation\": \"<p>If provided, the generated manifest includes only source bucket objects whose file size\\n         is less than the specified number of bytes.</p>\"\n                    }\n                },\n                \"MatchAnyStorageClass\": {\n                    \"target\": \"com.amazonaws.s3control#StorageClassList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If provided, the generated manifest includes only source bucket objects that are stored\\n         with the specified storage class.</p>\"\n                    }\n                },\n                \"MatchAnyObjectEncryption\": {\n                    \"target\": \"com.amazonaws.s3control#ObjectEncryptionFilterList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If provided, the generated object list includes \\n         only source bucket objects with the indicated server-side encryption type (SSE-S3, SSE-KMS, DSSE-KMS, SSE-C, or NOT-SSE). \\n         If you select SSE-KMS or DSSE-KMS, you can optionally further filter your results by specifying a specific KMS Key ARN. \\n         If you select SSE-KMS, you can also optionally further filter your results by Bucket Key enabled status.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The filter used to describe a set of objects for the job's manifest.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#JobManifestLocation\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ObjectArn\": {\n                    \"target\": \"com.amazonaws.s3control#S3KeyArnString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) for a manifest object.</p>\\n         <important>\\n            <p>When you're using XML requests, you must \\nreplace special characters (such as carriage returns) in object keys with their equivalent XML entity codes. \\nFor more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-keys.html#object-key-xml-related-constraints\\\">\\n            XML-related object key constraints</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         </important>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ObjectVersionId\": {\n                    \"target\": \"com.amazonaws.s3control#S3ObjectVersionId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The optional version ID to identify a specific version of the manifest object.</p>\"\n                    }\n                },\n                \"ETag\": {\n                    \"target\": \"com.amazonaws.s3control#NonEmptyMaxLength1024String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ETag for the specified manifest object.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the information required to locate a manifest object. Manifests can't be\\n         imported from directory buckets. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-buckets-overview.html\\\">Directory\\n            buckets</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#JobManifestSpec\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Format\": {\n                    \"target\": \"com.amazonaws.s3control#JobManifestFormat\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates which of the available formats the specified manifest uses.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Fields\": {\n                    \"target\": \"com.amazonaws.s3control#JobManifestFieldList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If the specified manifest object is in the <code>S3BatchOperations_CSV_20180820</code>\\n         format, this element describes which columns contain the required data.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the format of a manifest. If the manifest is in CSV format, also describes the\\n         columns contained within the manifest.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#JobNumberOfTasksFailed\": {\n            \"type\": \"long\",\n            \"traits\": {\n                \"smithy.api#default\": 0,\n                \"smithy.api#range\": {\n                    \"min\": 0\n                }\n            }\n        },\n        \"com.amazonaws.s3control#JobNumberOfTasksSucceeded\": {\n            \"type\": \"long\",\n            \"traits\": {\n                \"smithy.api#default\": 0,\n                \"smithy.api#range\": {\n                    \"min\": 0\n                }\n            }\n        },\n        \"com.amazonaws.s3control#JobOperation\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LambdaInvoke\": {\n                    \"target\": \"com.amazonaws.s3control#LambdaInvokeOperation\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Directs the specified job to invoke an Lambda function on every object in the\\n         manifest.</p>\"\n                    }\n                },\n                \"S3PutObjectCopy\": {\n                    \"target\": \"com.amazonaws.s3control#S3CopyObjectOperation\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Directs the specified job to run a PUT Copy object call on every object in the\\n         manifest.</p>\"\n                    }\n                },\n                \"S3PutObjectAcl\": {\n                    \"target\": \"com.amazonaws.s3control#S3SetObjectAclOperation\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Directs the specified job to run a <code>PutObjectAcl</code> call on every object in the\\n         manifest.</p>\\n         <note>\\n            <p>This functionality is not supported by directory buckets.</p>\\n         </note>\"\n                    }\n                },\n                \"S3PutObjectTagging\": {\n                    \"target\": \"com.amazonaws.s3control#S3SetObjectTaggingOperation\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Directs the specified job to run a PUT Object tagging call on every object in the\\n         manifest.</p>\\n         <note>\\n            <p>This functionality is not supported by directory buckets.</p>\\n         </note>\"\n                    }\n                },\n                \"S3DeleteObjectTagging\": {\n                    \"target\": \"com.amazonaws.s3control#S3DeleteObjectTaggingOperation\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Directs the specified job to execute a DELETE Object tagging call on every object in the\\n         manifest.</p>\\n         <note>\\n            <p>This functionality is not supported by directory buckets.</p>\\n         </note>\"\n                    }\n                },\n                \"S3InitiateRestoreObject\": {\n                    \"target\": \"com.amazonaws.s3control#S3InitiateRestoreObjectOperation\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Directs the specified job to initiate restore requests for every archived object in the\\n         manifest.</p>\\n         <note>\\n            <p>This functionality is not supported by directory buckets.</p>\\n         </note>\"\n                    }\n                },\n                \"S3PutObjectLegalHold\": {\n                    \"target\": \"com.amazonaws.s3control#S3SetObjectLegalHoldOperation\"\n                },\n                \"S3PutObjectRetention\": {\n                    \"target\": \"com.amazonaws.s3control#S3SetObjectRetentionOperation\"\n                },\n                \"S3ReplicateObject\": {\n                    \"target\": \"com.amazonaws.s3control#S3ReplicateObjectOperation\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Directs the specified job to invoke <code>ReplicateObject</code> on every object in the\\n         job's manifest.</p>\\n         <note>\\n            <p>This functionality is not supported by directory buckets.</p>\\n         </note>\"\n                    }\n                },\n                \"S3ComputeObjectChecksum\": {\n                    \"target\": \"com.amazonaws.s3control#S3ComputeObjectChecksumOperation\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Directs the specified job to compute checksum values for every object in the\\n         manifest.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The operation that you want this job to perform on every object listed in the manifest.\\n         For more information about the available operations, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/batch-ops-operations.html\\\">Operations</a> in the\\n            <i>Amazon S3 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#JobPriority\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#default\": 0,\n                \"smithy.api#range\": {\n                    \"min\": 0,\n                    \"max\": 2147483647\n                }\n            }\n        },\n        \"com.amazonaws.s3control#JobProgressSummary\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TotalNumberOfTasks\": {\n                    \"target\": \"com.amazonaws.s3control#JobTotalNumberOfTasks\",\n                    \"traits\": {\n                        \"smithy.api#default\": null,\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                },\n                \"NumberOfTasksSucceeded\": {\n                    \"target\": \"com.amazonaws.s3control#JobNumberOfTasksSucceeded\",\n                    \"traits\": {\n                        \"smithy.api#default\": null,\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                },\n                \"NumberOfTasksFailed\": {\n                    \"target\": \"com.amazonaws.s3control#JobNumberOfTasksFailed\",\n                    \"traits\": {\n                        \"smithy.api#default\": null,\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                },\n                \"Timers\": {\n                    \"target\": \"com.amazonaws.s3control#JobTimers\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The JobTimers attribute of a job's progress summary.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the total number of tasks that the specified job has started, the number of\\n         tasks that succeeded, and the number of tasks that failed.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#JobReport\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Bucket\": {\n                    \"target\": \"com.amazonaws.s3control#S3BucketArnString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) for the bucket where specified job-completion report will\\n         be stored.</p>\\n         <note>\\n            <p>\\n               <b>Directory buckets</b> - Directory buckets\\n            aren't supported as a location for Batch Operations to store job completion reports.</p>\\n         </note>\"\n                    }\n                },\n                \"Format\": {\n                    \"target\": \"com.amazonaws.s3control#JobReportFormat\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The format of the specified job-completion report.</p>\"\n                    }\n                },\n                \"Enabled\": {\n                    \"target\": \"com.amazonaws.s3control#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Indicates whether the specified job will generate a job-completion report.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Prefix\": {\n                    \"target\": \"com.amazonaws.s3control#ReportPrefixString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An optional prefix to describe where in the specified bucket the job-completion report\\n         will be stored. Amazon S3 stores the job-completion report at\\n            <code><prefix>/job-<job-id>/report.json</code>.</p>\"\n                    }\n                },\n                \"ReportScope\": {\n                    \"target\": \"com.amazonaws.s3control#JobReportScope\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether the job-completion report will include details of all tasks or only\\n         failed tasks.</p>\"\n                    }\n                },\n                \"ExpectedBucketOwner\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Lists the Amazon Web Services account ID that owns the target bucket, where the completion report is received.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the configuration parameters for a job-completion report.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#JobReportFormat\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"Report_CSV_20180820\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Report_CSV_20180820\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#JobReportScope\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"AllTasks\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AllTasks\"\n                    }\n                },\n                \"FailedTasksOnly\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"FailedTasksOnly\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#JobStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"Active\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Active\"\n                    }\n                },\n                \"Cancelled\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Cancelled\"\n                    }\n                },\n                \"Cancelling\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Cancelling\"\n                    }\n                },\n                \"Complete\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Complete\"\n                    }\n                },\n                \"Completing\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Completing\"\n                    }\n                },\n                \"Failed\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Failed\"\n                    }\n                },\n                \"Failing\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Failing\"\n                    }\n                },\n                \"New\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"New\"\n                    }\n                },\n                \"Paused\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Paused\"\n                    }\n                },\n                \"Pausing\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Pausing\"\n                    }\n                },\n                \"Preparing\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Preparing\"\n                    }\n                },\n                \"Ready\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Ready\"\n                    }\n                },\n                \"Suspended\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Suspended\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#JobStatusException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Message\": {\n                    \"target\": \"com.amazonaws.s3control#ExceptionMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p></p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.s3control#JobStatusList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.s3control#JobStatus\"\n            }\n        },\n        \"com.amazonaws.s3control#JobStatusUpdateReason\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 256\n                }\n            }\n        },\n        \"com.amazonaws.s3control#JobTerminationDate\": {\n            \"type\": \"timestamp\"\n        },\n        \"com.amazonaws.s3control#JobTimeInStateSeconds\": {\n            \"type\": \"long\",\n            \"traits\": {\n                \"smithy.api#default\": 0,\n                \"smithy.api#range\": {\n                    \"min\": 0\n                }\n            }\n        },\n        \"com.amazonaws.s3control#JobTimers\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ElapsedTimeInActiveSeconds\": {\n                    \"target\": \"com.amazonaws.s3control#JobTimeInStateSeconds\",\n                    \"traits\": {\n                        \"smithy.api#default\": null,\n                        \"smithy.api#documentation\": \"<p>Indicates the elapsed time in seconds the job has been in the Active job state.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Provides timing details for the job.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#JobTotalNumberOfTasks\": {\n            \"type\": \"long\",\n            \"traits\": {\n                \"smithy.api#default\": 0,\n                \"smithy.api#range\": {\n                    \"min\": 0\n                }\n            }\n        },\n        \"com.amazonaws.s3control#KeyNameConstraint\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"MatchAnyPrefix\": {\n                    \"target\": \"com.amazonaws.s3control#NonEmptyMaxLength1024StringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If provided, the generated manifest includes objects where the specified string appears\\n         at the start of the object key string. Each KeyNameConstraint filter accepts an array of\\n         strings with a length of 1 string.</p>\"\n                    }\n                },\n                \"MatchAnySuffix\": {\n                    \"target\": \"com.amazonaws.s3control#NonEmptyMaxLength1024StringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If provided, the generated manifest includes objects where the specified string appears\\n         at the end of the object key string. Each KeyNameConstraint filter accepts an array of\\n         strings with a length of 1 string.</p>\"\n                    }\n                },\n                \"MatchAnySubstring\": {\n                    \"target\": \"com.amazonaws.s3control#NonEmptyMaxLength1024StringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If provided, the generated manifest includes objects where the specified string appears\\n         anywhere within the object key string. Each KeyNameConstraint filter accepts an array of\\n         strings with a length of 1 string.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>If provided, the generated manifest includes only source bucket objects whose object\\n         keys match the string constraints specified for <code>MatchAnyPrefix</code>,\\n            <code>MatchAnySuffix</code>, and <code>MatchAnySubstring</code>.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#KmsKeyArnString\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 2000\n                }\n            }\n        },\n        \"com.amazonaws.s3control#LambdaInvokeOperation\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"FunctionArn\": {\n                    \"target\": \"com.amazonaws.s3control#FunctionArnString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) for the Lambda function that the specified job will\\n         invoke on every object in the manifest.</p>\"\n                    }\n                },\n                \"InvocationSchemaVersion\": {\n                    \"target\": \"com.amazonaws.s3control#NonEmptyMaxLength64String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the schema version for the payload that Batch Operations sends when invoking\\n         an Lambda function. Version <code>1.0</code> is the default. Version\\n            <code>2.0</code> is required when you use Batch Operations to invoke Lambda functions that act on directory buckets, or if you need to specify\\n            <code>UserArguments</code>. For more information, see <a href=\\\"https://aws.amazon.com/blogs/storage/automate-object-processing-in-amazon-s3-directory-buckets-with-s3-batch-operations-and-aws-lambda/\\\">Automate object processing in Amazon S3 directory buckets with S3 Batch Operations and\\n            Lambda</a> in the <i>Amazon Web Services Storage Blog</i>.</p>\\n         <important>\\n            <p>Ensure that your Lambda function code expects\\n               <code>InvocationSchemaVersion</code>\\n               <b>2.0</b> and uses bucket name rather than bucket ARN. If the\\n               <code>InvocationSchemaVersion</code> does not match what your Lambda\\n            function expects, your function might not work as expected.</p>\\n         </important>\\n         <note>\\n            <p>\\n               <b>Directory buckets</b> - To initiate Amazon Web Services Lambda\\n            function to perform custom actions on objects in directory buckets, you must specify\\n               <code>2.0</code>.</p>\\n         </note>\"\n                    }\n                },\n                \"UserArguments\": {\n                    \"target\": \"com.amazonaws.s3control#UserArguments\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Key-value pairs that are passed in the payload that Batch Operations sends when invoking\\n         an Lambda function. You must specify <code>InvocationSchemaVersion</code>\\n            <b>2.0</b> for <code>LambdaInvoke</code> operations that include\\n            <code>UserArguments</code>. For more information, see <a href=\\\"https://aws.amazon.com/blogs/storage/automate-object-processing-in-amazon-s3-directory-buckets-with-s3-batch-operations-and-aws-lambda/\\\">Automate object processing in Amazon S3 directory buckets with S3 Batch Operations and\\n            Lambda</a> in the <i>Amazon Web Services Storage Blog</i>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the configuration parameters for a <code>Lambda Invoke</code> operation.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#LifecycleConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Rules\": {\n                    \"target\": \"com.amazonaws.s3control#LifecycleRules\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A lifecycle rule for individual objects in an Outposts bucket. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The container for the Outposts bucket lifecycle configuration.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#LifecycleExpiration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Date\": {\n                    \"target\": \"com.amazonaws.s3control#Date\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates at what date the object is to be deleted. Should be in GMT ISO 8601\\n         format.</p>\"\n                    }\n                },\n                \"Days\": {\n                    \"target\": \"com.amazonaws.s3control#Days\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>Indicates the lifetime, in days, of the objects that are subject to the rule. The value\\n         must be a non-zero positive integer.</p>\"\n                    }\n                },\n                \"ExpiredObjectDeleteMarker\": {\n                    \"target\": \"com.amazonaws.s3control#ExpiredObjectDeleteMarker\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Indicates whether Amazon S3 will remove a delete marker with no noncurrent versions. If set\\n         to true, the delete marker will be expired. If set to false, the policy takes no action.\\n         This cannot be specified with Days or Date in a Lifecycle Expiration Policy. To learn more\\n         about delete markers, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/DeleteMarker.html\\\">Working with delete\\n         markers</a>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The container of the Outposts bucket lifecycle expiration.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#LifecycleRule\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Expiration\": {\n                    \"target\": \"com.amazonaws.s3control#LifecycleExpiration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the expiration for the lifecycle of the object in the form of date, days and,\\n         whether the object has a delete marker.</p>\"\n                    }\n                },\n                \"ID\": {\n                    \"target\": \"com.amazonaws.s3control#ID\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Unique identifier for the rule. The value cannot be longer than 255 characters.</p>\"\n                    }\n                },\n                \"Filter\": {\n                    \"target\": \"com.amazonaws.s3control#LifecycleRuleFilter\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The container for the filter of lifecycle rule.</p>\"\n                    }\n                },\n                \"Status\": {\n                    \"target\": \"com.amazonaws.s3control#ExpirationStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If 'Enabled', the rule is currently being applied. If 'Disabled', the rule is not\\n         currently being applied.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Transitions\": {\n                    \"target\": \"com.amazonaws.s3control#TransitionList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies when an Amazon S3 object transitions to a specified storage class.</p>\\n         <note>\\n            <p>This is not supported by Amazon S3 on Outposts buckets.</p>\\n         </note>\"\n                    }\n                },\n                \"NoncurrentVersionTransitions\": {\n                    \"target\": \"com.amazonaws.s3control#NoncurrentVersionTransitionList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> Specifies the transition rule for the lifecycle rule that describes when non-current\\n         objects transition to a specific storage class. If your bucket is versioning-enabled (or\\n         versioning is suspended), you can set this action to request that Amazon S3 transition\\n         noncurrent object versions to a specific storage class at a set period in the object's\\n         lifetime. </p>\\n         <note>\\n            <p>This is not supported by Amazon S3 on Outposts buckets.</p>\\n         </note>\"\n                    }\n                },\n                \"NoncurrentVersionExpiration\": {\n                    \"target\": \"com.amazonaws.s3control#NoncurrentVersionExpiration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The noncurrent version expiration of the lifecycle rule.</p>\"\n                    }\n                },\n                \"AbortIncompleteMultipartUpload\": {\n                    \"target\": \"com.amazonaws.s3control#AbortIncompleteMultipartUpload\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the days since the initiation of an incomplete multipart upload that Amazon S3\\n         waits before permanently removing all parts of the upload. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/mpuoverview.html#mpu-abort-incomplete-mpu-lifecycle-config\\\">\\n            Aborting Incomplete Multipart Uploads Using a Bucket Lifecycle Configuration</a> in\\n         the <i>Amazon S3 User Guide</i>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The container for the Outposts bucket lifecycle rule.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#LifecycleRuleAndOperator\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Prefix\": {\n                    \"target\": \"com.amazonaws.s3control#Prefix\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Prefix identifying one or more objects to which the rule applies.</p>\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.s3control#S3TagSet\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>All of these tags must exist in the object's tag set in order for the rule to\\n         apply.</p>\"\n                    }\n                },\n                \"ObjectSizeGreaterThan\": {\n                    \"target\": \"com.amazonaws.s3control#ObjectSizeGreaterThanBytes\",\n                    \"traits\": {\n                        \"smithy.api#default\": null,\n                        \"smithy.api#documentation\": \"<p>The non-inclusive minimum object size for the lifecycle rule. Setting this property to 7\\n         means the rule applies to objects with a size that is greater than 7. </p>\"\n                    }\n                },\n                \"ObjectSizeLessThan\": {\n                    \"target\": \"com.amazonaws.s3control#ObjectSizeLessThanBytes\",\n                    \"traits\": {\n                        \"smithy.api#default\": null,\n                        \"smithy.api#documentation\": \"<p>The non-inclusive maximum object size for the lifecycle rule. Setting this property to\\n         77 means the rule applies to objects with a size that is less than 77. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The container for the Outposts bucket lifecycle rule and operator.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#LifecycleRuleFilter\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Prefix\": {\n                    \"target\": \"com.amazonaws.s3control#Prefix\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Prefix identifying one or more objects to which the rule applies.</p>\\n         <important>\\n            <p>When you're using XML requests, you must \\nreplace special characters (such as carriage returns) in object keys with their equivalent XML entity codes. \\nFor more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-keys.html#object-key-xml-related-constraints\\\">\\n            XML-related object key constraints</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         </important>\"\n                    }\n                },\n                \"Tag\": {\n                    \"target\": \"com.amazonaws.s3control#S3Tag\"\n                },\n                \"And\": {\n                    \"target\": \"com.amazonaws.s3control#LifecycleRuleAndOperator\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The container for the <code>AND</code> condition for the lifecycle rule.</p>\"\n                    }\n                },\n                \"ObjectSizeGreaterThan\": {\n                    \"target\": \"com.amazonaws.s3control#ObjectSizeGreaterThanBytes\",\n                    \"traits\": {\n                        \"smithy.api#default\": null,\n                        \"smithy.api#documentation\": \"<p>Minimum object size to which the rule applies.</p>\"\n                    }\n                },\n                \"ObjectSizeLessThan\": {\n                    \"target\": \"com.amazonaws.s3control#ObjectSizeLessThanBytes\",\n                    \"traits\": {\n                        \"smithy.api#default\": null,\n                        \"smithy.api#documentation\": \"<p>Maximum object size to which the rule applies.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The container for the filter of the lifecycle rule.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#LifecycleRules\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.s3control#LifecycleRule\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"Rule\"\n                }\n            }\n        },\n        \"com.amazonaws.s3control#ListAccessGrantEntry\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CreatedAt\": {\n                    \"target\": \"com.amazonaws.s3control#CreationTimestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time when you created the S3 Access Grants instance. </p>\"\n                    }\n                },\n                \"AccessGrantId\": {\n                    \"target\": \"com.amazonaws.s3control#AccessGrantId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the access grant. S3 Access Grants auto-generates this ID when you create the access\\n         grant.</p>\"\n                    }\n                },\n                \"AccessGrantArn\": {\n                    \"target\": \"com.amazonaws.s3control#AccessGrantArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the access grant. </p>\"\n                    }\n                },\n                \"Grantee\": {\n                    \"target\": \"com.amazonaws.s3control#Grantee\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The user, group, or role to which you are granting access. You can grant access to an\\n         IAM user or role. If you have added your corporate directory to Amazon Web Services IAM Identity\\n         Center and associated your Identity Center instance with your S3 Access Grants instance, the grantee\\n         can also be a corporate directory user or group.</p>\"\n                    }\n                },\n                \"Permission\": {\n                    \"target\": \"com.amazonaws.s3control#Permission\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of access granted to your S3 data, which can be set to one of the following\\n         values:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>READ</code> – Grant read-only access to the S3 data.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>WRITE</code> – Grant write-only access to the S3 data.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>READWRITE</code> – Grant both read and write access to the S3 data.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"AccessGrantsLocationId\": {\n                    \"target\": \"com.amazonaws.s3control#AccessGrantsLocationId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the registered location to which you are granting access. S3 Access Grants assigns this\\n         ID when you register the location. S3 Access Grants assigns the ID <code>default</code> to the\\n         default location <code>s3://</code> and assigns an auto-generated ID to other locations\\n         that you register. </p>\"\n                    }\n                },\n                \"AccessGrantsLocationConfiguration\": {\n                    \"target\": \"com.amazonaws.s3control#AccessGrantsLocationConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The configuration options of the grant location. The grant location is the S3 path to\\n         the data to which you are granting access. </p>\"\n                    }\n                },\n                \"GrantScope\": {\n                    \"target\": \"com.amazonaws.s3control#S3Prefix\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The S3 path of the data to which you are granting access. It is the result of appending\\n         the <code>Subprefix</code> to the location scope.</p>\"\n                    }\n                },\n                \"ApplicationArn\": {\n                    \"target\": \"com.amazonaws.s3control#IdentityCenterApplicationArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of an Amazon Web Services IAM Identity Center application associated\\n         with your Identity Center instance. If the grant includes an application ARN, the grantee\\n         can only access the S3 data through this application. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about the access grant.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#ListAccessGrants\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#ListAccessGrantsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.s3control#ListAccessGrantsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns the list of access grants in your S3 Access Grants instance.</p>\\n         <dl>\\n            <dt>Permissions</dt>\\n            <dd>\\n               <p>You must have the <code>s3:ListAccessGrants</code> permission to use this\\n                  operation. </p>\\n            </dd>\\n         </dl>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/v20180820/accessgrantsinstance/grants\",\n                    \"code\": 200\n                },\n                \"smithy.api#httpChecksumRequired\": {},\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"pageSize\": \"MaxResults\"\n                },\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#ListAccessGrantsInstanceEntry\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccessGrantsInstanceId\": {\n                    \"target\": \"com.amazonaws.s3control#AccessGrantsInstanceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the S3 Access Grants instance. The ID is <code>default</code>. You can have one S3 Access Grants\\n         instance per Region per account. </p>\"\n                    }\n                },\n                \"AccessGrantsInstanceArn\": {\n                    \"target\": \"com.amazonaws.s3control#AccessGrantsInstanceArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the S3 Access Grants instance. </p>\"\n                    }\n                },\n                \"CreatedAt\": {\n                    \"target\": \"com.amazonaws.s3control#CreationTimestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time when you created the S3 Access Grants instance. </p>\"\n                    }\n                },\n                \"IdentityCenterArn\": {\n                    \"target\": \"com.amazonaws.s3control#IdentityCenterArn\",\n                    \"traits\": {\n                        \"smithy.api#deprecated\": {\n                            \"message\": \"IdentityCenterArn has been deprecated. Use IdentityCenterInstanceArn or IdentityCenterApplicationArn.\"\n                        },\n                        \"smithy.api#documentation\": \"<p>If you associated your S3 Access Grants instance with an Amazon Web Services IAM Identity Center instance,\\n         this field returns the Amazon Resource Name (ARN) of the IAM Identity Center instance\\n         application; a subresource of the original Identity Center instance. S3 Access Grants creates this\\n         Identity Center application for the specific S3 Access Grants instance. </p>\"\n                    }\n                },\n                \"IdentityCenterInstanceArn\": {\n                    \"target\": \"com.amazonaws.s3control#IdentityCenterArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the Amazon Web Services IAM Identity Center instance that you are\\n         associating with your S3 Access Grants instance. An IAM Identity Center instance is your corporate\\n         identity directory that you added to the IAM Identity Center. You can use the <a href=\\\"https://docs.aws.amazon.com/singlesignon/latest/APIReference/API_ListInstances.html\\\">ListInstances</a> API operation to retrieve a list of your Identity Center\\n         instances and their ARNs.</p>\"\n                    }\n                },\n                \"IdentityCenterApplicationArn\": {\n                    \"target\": \"com.amazonaws.s3control#IdentityCenterApplicationArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If you associated your S3 Access Grants instance with an Amazon Web Services IAM Identity Center instance,\\n         this field returns the Amazon Resource Name (ARN) of the IAM Identity Center instance\\n         application; a subresource of the original Identity Center instance. S3 Access Grants creates this\\n         Identity Center application for the specific S3 Access Grants instance. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about the S3 Access Grants instance.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#ListAccessGrantsInstances\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#ListAccessGrantsInstancesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.s3control#ListAccessGrantsInstancesResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns a list of S3 Access Grants instances. An S3 Access Grants instance serves as a logical grouping for\\n         your individual access grants. You can only have one S3 Access Grants instance per Region per\\n         account.</p>\\n         <dl>\\n            <dt>Permissions</dt>\\n            <dd>\\n               <p>You must have the <code>s3:ListAccessGrantsInstances</code> permission to use\\n                  this operation. </p>\\n            </dd>\\n         </dl>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/v20180820/accessgrantsinstances\",\n                    \"code\": 200\n                },\n                \"smithy.api#httpChecksumRequired\": {},\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"pageSize\": \"MaxResults\"\n                },\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#ListAccessGrantsInstancesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID of the S3 Access Grants instance.</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.s3control#ContinuationToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A pagination token to request the next page of results. Pass this value into a\\n         subsequent <code>List Access Grants Instances</code> request in order to retrieve the next\\n         page of results.</p>\",\n                        \"smithy.api#httpQuery\": \"nextToken\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.s3control#MaxResults\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The maximum number of access grants that you would like returned in the <code>List\\n            Access Grants</code> response. If the results include the pagination token\\n            <code>NextToken</code>, make another call using the <code>NextToken</code> to determine\\n         if there are more results.</p>\",\n                        \"smithy.api#httpQuery\": \"maxResults\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#ListAccessGrantsInstancesResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.s3control#ContinuationToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A pagination token to request the next page of results. Pass this value into a\\n         subsequent <code>List Access Grants Instances</code> request in order to retrieve the next\\n         page of results.</p>\"\n                    }\n                },\n                \"AccessGrantsInstancesList\": {\n                    \"target\": \"com.amazonaws.s3control#AccessGrantsInstancesList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A container for a list of S3 Access Grants instances.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.s3control#ListAccessGrantsLocations\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#ListAccessGrantsLocationsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.s3control#ListAccessGrantsLocationsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns a list of the locations registered in your S3 Access Grants instance.</p>\\n         <dl>\\n            <dt>Permissions</dt>\\n            <dd>\\n               <p>You must have the <code>s3:ListAccessGrantsLocations</code> permission to use\\n                  this operation. </p>\\n            </dd>\\n         </dl>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/v20180820/accessgrantsinstance/locations\",\n                    \"code\": 200\n                },\n                \"smithy.api#httpChecksumRequired\": {},\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"pageSize\": \"MaxResults\"\n                },\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#ListAccessGrantsLocationsEntry\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CreatedAt\": {\n                    \"target\": \"com.amazonaws.s3control#CreationTimestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time when you registered the location. </p>\"\n                    }\n                },\n                \"AccessGrantsLocationId\": {\n                    \"target\": \"com.amazonaws.s3control#AccessGrantsLocationId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the registered location to which you are granting access. S3 Access Grants assigns this\\n         ID when you register the location. S3 Access Grants assigns the ID <code>default</code> to the\\n         default location <code>s3://</code> and assigns an auto-generated ID to other locations\\n         that you register. </p>\"\n                    }\n                },\n                \"AccessGrantsLocationArn\": {\n                    \"target\": \"com.amazonaws.s3control#AccessGrantsLocationArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the registered location. </p>\"\n                    }\n                },\n                \"LocationScope\": {\n                    \"target\": \"com.amazonaws.s3control#S3Prefix\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The S3 path to the location that you are registering. The location scope can be the\\n         default S3 location <code>s3://</code>, the S3 path to a bucket\\n            <code>s3://<bucket></code>, or the S3 path to a bucket and prefix\\n            <code>s3://<bucket>/<prefix></code>. A prefix in S3 is a string of\\n         characters at the beginning of an object key name used to organize the objects that you\\n         store in your S3 buckets. For example, object key names that start with the\\n            <code>engineering/</code> prefix or object key names that start with the\\n            <code>marketing/campaigns/</code> prefix.</p>\"\n                    }\n                },\n                \"IAMRoleArn\": {\n                    \"target\": \"com.amazonaws.s3control#IAMRoleArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the IAM role for the registered location. S3 Access Grants\\n         assumes this role to manage access to the registered location. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A container for information about the registered location.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#ListAccessGrantsLocationsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID of the S3 Access Grants instance.</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.s3control#ContinuationToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A pagination token to request the next page of results. Pass this value into a\\n         subsequent <code>List Access Grants Locations</code> request in order to retrieve the next\\n         page of results.</p>\",\n                        \"smithy.api#httpQuery\": \"nextToken\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.s3control#MaxResults\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The maximum number of access grants that you would like returned in the <code>List\\n            Access Grants</code> response. If the results include the pagination token\\n            <code>NextToken</code>, make another call using the <code>NextToken</code> to determine\\n         if there are more results.</p>\",\n                        \"smithy.api#httpQuery\": \"maxResults\"\n                    }\n                },\n                \"LocationScope\": {\n                    \"target\": \"com.amazonaws.s3control#S3Prefix\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The S3 path to the location that you are registering. The location scope can be the\\n         default S3 location <code>s3://</code>, the S3 path to a bucket\\n            <code>s3://<bucket></code>, or the S3 path to a bucket and prefix\\n            <code>s3://<bucket>/<prefix></code>. A prefix in S3 is a string of\\n         characters at the beginning of an object key name used to organize the objects that you\\n         store in your S3 buckets. For example, object key names that start with the\\n            <code>engineering/</code> prefix or object key names that start with the\\n            <code>marketing/campaigns/</code> prefix.</p>\",\n                        \"smithy.api#httpQuery\": \"locationscope\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#ListAccessGrantsLocationsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.s3control#ContinuationToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A pagination token to request the next page of results. Pass this value into a\\n         subsequent <code>List Access Grants Locations</code> request in order to retrieve the next\\n         page of results.</p>\"\n                    }\n                },\n                \"AccessGrantsLocationsList\": {\n                    \"target\": \"com.amazonaws.s3control#AccessGrantsLocationsList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A container for a list of registered locations in an S3 Access Grants instance.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.s3control#ListAccessGrantsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID of the S3 Access Grants instance.</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.s3control#ContinuationToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A pagination token to request the next page of results. Pass this value into a\\n         subsequent <code>List Access Grants</code> request in order to retrieve the next page of\\n         results.</p>\",\n                        \"smithy.api#httpQuery\": \"nextToken\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.s3control#MaxResults\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The maximum number of access grants that you would like returned in the <code>List\\n            Access Grants</code> response. If the results include the pagination token\\n            <code>NextToken</code>, make another call using the <code>NextToken</code> to determine\\n         if there are more results.</p>\",\n                        \"smithy.api#httpQuery\": \"maxResults\"\n                    }\n                },\n                \"GranteeType\": {\n                    \"target\": \"com.amazonaws.s3control#GranteeType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of the grantee to which access has been granted. It can be one of the following\\n         values:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>IAM</code> - An IAM user or role.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>DIRECTORY_USER</code> - Your corporate directory user. You can use\\n               this option if you have added your corporate identity directory to IAM Identity\\n               Center and associated the IAM Identity Center instance with your S3 Access Grants\\n               instance.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>DIRECTORY_GROUP</code> - Your corporate directory group. You can use\\n               this option if you have added your corporate identity directory to IAM Identity\\n               Center and associated the IAM Identity Center instance with your S3 Access Grants\\n               instance.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#httpQuery\": \"granteetype\"\n                    }\n                },\n                \"GranteeIdentifier\": {\n                    \"target\": \"com.amazonaws.s3control#GranteeIdentifier\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The unique identifer of the <code>Grantee</code>. If the grantee type is\\n            <code>IAM</code>, the identifier is the IAM Amazon Resource Name (ARN) of the user\\n         or role. If the grantee type is a directory user or group, the identifier is 128-bit\\n         universally unique identifier (UUID) in the format\\n            <code>a1b2c3d4-5678-90ab-cdef-EXAMPLE11111</code>. You can obtain this UUID from your\\n         Amazon Web Services IAM Identity Center instance.</p>\",\n                        \"smithy.api#httpQuery\": \"granteeidentifier\"\n                    }\n                },\n                \"Permission\": {\n                    \"target\": \"com.amazonaws.s3control#Permission\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of permission granted to your S3 data, which can be set to one of the following\\n         values:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>READ</code> – Grant read-only access to the S3 data.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>WRITE</code> – Grant write-only access to the S3 data.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>READWRITE</code> – Grant both read and write access to the S3 data.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#httpQuery\": \"permission\"\n                    }\n                },\n                \"GrantScope\": {\n                    \"target\": \"com.amazonaws.s3control#S3Prefix\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The S3 path of the data to which you are granting access. It is the result of appending\\n         the <code>Subprefix</code> to the location scope.</p>\",\n                        \"smithy.api#httpQuery\": \"grantscope\"\n                    }\n                },\n                \"ApplicationArn\": {\n                    \"target\": \"com.amazonaws.s3control#IdentityCenterApplicationArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of an Amazon Web Services IAM Identity Center application associated\\n         with your Identity Center instance. If the grant includes an application ARN, the grantee\\n         can only access the S3 data through this application. </p>\",\n                        \"smithy.api#httpQuery\": \"application_arn\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#ListAccessGrantsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.s3control#ContinuationToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A pagination token to request the next page of results. Pass this value into a\\n         subsequent <code>List Access Grants</code> request in order to retrieve the next page of\\n         results.</p>\"\n                    }\n                },\n                \"AccessGrantsList\": {\n                    \"target\": \"com.amazonaws.s3control#AccessGrantsList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A container for a list of grants in an S3 Access Grants instance.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.s3control#ListAccessPoints\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#ListAccessPointsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.s3control#ListAccessPointsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported by directory buckets.</p>\\n         </note>\\n         <p>Returns a list of the access points. You can retrieve up to 1,000 access points per call. If the call\\n         returns more than 1,000 access points (or the number specified in <code>maxResults</code>,\\n         whichever is less), the response will include a continuation token that you can use to list\\n         the additional access points.</p>\\n         <p>Returns only access points attached to S3 buckets by default. To return all access points specify\\n            <code>DataSourceType</code> as <code>ALL</code>.</p>\\n         <p></p>\\n         <p>All Amazon S3 on Outposts REST API requests for this action require an additional parameter of <code>x-amz-outpost-id</code> to be passed with the request. In addition, you must use an S3 on Outposts endpoint hostname prefix instead of <code>s3-control</code>. For an example of the request syntax for Amazon S3 on Outposts that uses the S3 on Outposts endpoint hostname prefix and the <code>x-amz-outpost-id</code> derived by using the access point ARN, see the <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_GetAccessPoint.html#API_control_GetAccessPoint_Examples\\\">Examples</a> section.</p>\\n         <p>The following actions are related to <code>ListAccessPoints</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_CreateAccessPoint.html\\\">CreateAccessPoint</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_DeleteAccessPoint.html\\\">DeleteAccessPoint</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_GetAccessPoint.html\\\">GetAccessPoint</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/v20180820/accesspoint\",\n                    \"code\": 200\n                },\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"pageSize\": \"MaxResults\"\n                },\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#ListAccessPointsForDirectoryBuckets\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#ListAccessPointsForDirectoryBucketsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.s3control#ListAccessPointsForDirectoryBucketsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns a list of the access points that are owned by the Amazon Web Services account and that are associated\\n         with the specified directory bucket.</p>\\n         <p>To list access points for general purpose buckets, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_ListAccessPoints.html\\\">ListAccesspoints</a>.</p>\\n         <p>To use this operation, you must have the permission to perform the\\n            <code>s3express:ListAccessPointsForDirectoryBuckets</code>\\n         action.</p>\\n         <p>For information about REST API errors, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html#RESTErrorResponses\\\">REST error responses</a>.</p>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/v20180820/accesspointfordirectory\",\n                    \"code\": 200\n                },\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"AccessPointList\",\n                    \"pageSize\": \"MaxResults\"\n                },\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    },\n                    \"UseS3ExpressControlEndpoint\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#ListAccessPointsForDirectoryBucketsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID that owns the access points.</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                },\n                \"DirectoryBucket\": {\n                    \"target\": \"com.amazonaws.s3control#BucketName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the directory bucket associated with the access points you want to list.</p>\",\n                        \"smithy.api#httpQuery\": \"directoryBucket\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.s3control#NonEmptyMaxLength1024String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> If <code>NextToken</code> is returned, there are more access points available than requested in\\n         the <code>maxResults</code> value. The value of <code>NextToken</code> is a unique\\n         pagination token for each page. Make the call again using the returned token to retrieve\\n         the next page. Keep all other arguments unchanged. Each pagination token expires after 24\\n         hours. </p>\",\n                        \"smithy.api#httpQuery\": \"nextToken\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.s3control#MaxResults\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The maximum number of access points that you would like returned in the\\n            <code>ListAccessPointsForDirectoryBuckets</code> response. If the directory bucket is\\n         associated with more than this number of access points, the results include the pagination token\\n            <code>NextToken</code>. Make another call using the <code>NextToken</code> to retrieve\\n         more results.</p>\",\n                        \"smithy.api#httpQuery\": \"maxResults\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#ListAccessPointsForDirectoryBucketsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccessPointList\": {\n                    \"target\": \"com.amazonaws.s3control#AccessPointList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Contains identification and configuration information for one or more access points associated\\n         with the directory bucket.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.s3control#NonEmptyMaxLength1024String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> If <code>NextToken</code> is returned, there are more access points available than requested in\\n         the <code>maxResults</code> value. The value of <code>NextToken</code> is a unique\\n         pagination token for each page. Make the call again using the returned token to retrieve\\n         the next page. Keep all other arguments unchanged. Each pagination token expires after 24\\n         hours. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.s3control#ListAccessPointsForObjectLambda\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#ListAccessPointsForObjectLambdaRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.s3control#ListAccessPointsForObjectLambdaResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported by directory buckets.</p>\\n         </note>\\n         <p>Returns some or all (up to 1,000) access points associated with the Object Lambda Access Point per call. If there\\n         are more access points than what can be returned in one call, the response will include a\\n         continuation token that you can use to list the additional access points.</p>\\n         <p>The following actions are related to\\n         <code>ListAccessPointsForObjectLambda</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_CreateAccessPointForObjectLambda.html\\\">CreateAccessPointForObjectLambda</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_DeleteAccessPointForObjectLambda.html\\\">DeleteAccessPointForObjectLambda</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_GetAccessPointForObjectLambda.html\\\">GetAccessPointForObjectLambda</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/v20180820/accesspointforobjectlambda\",\n                    \"code\": 200\n                },\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"ObjectLambdaAccessPointList\",\n                    \"pageSize\": \"MaxResults\"\n                },\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#ListAccessPointsForObjectLambdaRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The account ID for the account that owns the specified Object Lambda Access Point.</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.s3control#NonEmptyMaxLength1024String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If the list has more access points than can be returned in one call to this API, this field\\n         contains a continuation token that you can provide in subsequent calls to this API to\\n         retrieve additional access points.</p>\",\n                        \"smithy.api#httpQuery\": \"nextToken\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.s3control#MaxResults\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The maximum number of access points that you want to include in the list. The response may\\n         contain fewer access points but will never contain more. If there are more than this number of\\n         access points, then the response will include a continuation token in the <code>NextToken</code>\\n         field that you can use to retrieve the next page of access points.</p>\",\n                        \"smithy.api#httpQuery\": \"maxResults\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#ListAccessPointsForObjectLambdaResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ObjectLambdaAccessPointList\": {\n                    \"target\": \"com.amazonaws.s3control#ObjectLambdaAccessPointList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Returns list of Object Lambda Access Points.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.s3control#NonEmptyMaxLength1024String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If the list has more access points than can be returned in one call to this API, this field\\n         contains a continuation token that you can provide in subsequent calls to this API to\\n         retrieve additional access points.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.s3control#ListAccessPointsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID for the account that owns the specified access points.</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                },\n                \"Bucket\": {\n                    \"target\": \"com.amazonaws.s3control#BucketName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the bucket whose associated access points you want to list.</p>\\n         <p>For using this parameter with Amazon S3 on Outposts with the REST API, you must specify the name and the x-amz-outpost-id as well.</p>\\n         <p>For using this parameter with S3 on Outposts with the Amazon Web Services SDK and CLI, you must  specify the ARN of the bucket accessed in the format <code>arn:aws:s3-outposts:<Region>:<account-id>:outpost/<outpost-id>/bucket/<my-bucket-name></code>. For example, to access the bucket <code>reports</code> through Outpost <code>my-outpost</code> owned by account <code>123456789012</code> in Region <code>us-west-2</code>, use the URL encoding of <code>arn:aws:s3-outposts:us-west-2:123456789012:outpost/my-outpost/bucket/reports</code>. The value must be URL encoded.  </p>\",\n                        \"smithy.api#httpQuery\": \"bucket\",\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"Bucket\"\n                        }\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.s3control#NonEmptyMaxLength1024String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A continuation token. If a previous call to <code>ListAccessPoints</code> returned a\\n         continuation token in the <code>NextToken</code> field, then providing that value here\\n         causes Amazon S3 to retrieve the next page of results.</p>\",\n                        \"smithy.api#httpQuery\": \"nextToken\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.s3control#MaxResults\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The maximum number of access points that you want to include in the list. If the specified\\n         bucket has more than this number of access points, then the response will include a continuation\\n         token in the <code>NextToken</code> field that you can use to retrieve the next page of\\n         access points.</p>\",\n                        \"smithy.api#httpQuery\": \"maxResults\"\n                    }\n                },\n                \"DataSourceId\": {\n                    \"target\": \"com.amazonaws.s3control#DataSourceId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The unique identifier for the data source of the access point.</p>\",\n                        \"smithy.api#httpQuery\": \"dataSourceId\"\n                    }\n                },\n                \"DataSourceType\": {\n                    \"target\": \"com.amazonaws.s3control#DataSourceType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of the data source that the access point is attached to. Returns only access points attached to\\n         S3 buckets by default. To return all access points specify <code>DataSourceType</code> as\\n            <code>ALL</code>.</p>\",\n                        \"smithy.api#httpQuery\": \"dataSourceType\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#ListAccessPointsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccessPointList\": {\n                    \"target\": \"com.amazonaws.s3control#AccessPointList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Contains identification and configuration information for one or more access points associated\\n         with the specified bucket.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.s3control#NonEmptyMaxLength1024String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If the specified bucket has more access points than can be returned in one call to this API,\\n         this field contains a continuation token that you can provide in subsequent calls to this\\n         API to retrieve additional access points.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.s3control#ListCallerAccessGrants\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#ListCallerAccessGrantsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.s3control#ListCallerAccessGrantsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Use this API to list the access grants that grant the caller access to Amazon S3 data through\\n         S3 Access Grants. The caller (grantee) can be an Identity and Access Management (IAM) identity or Amazon Web Services Identity Center\\n         corporate directory identity. You must pass the Amazon Web Services account of the S3 data owner\\n         (grantor) in the request. You can, optionally, narrow the results by\\n            <code>GrantScope</code>, using a fragment of the data's S3 path, and S3 Access Grants will return\\n         only the grants with a path that contains the path fragment. You can also pass the\\n            <code>AllowedByApplication</code> filter in the request, which returns only the grants\\n         authorized for applications, whether the application is the caller's Identity Center\\n         application or any other application (<code>ALL</code>). For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-grants-list-grants.html\\\">List\\n            the caller's access grants</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <dl>\\n            <dt>Permissions</dt>\\n            <dd>\\n               <p>You must have the <code>s3:ListCallerAccessGrants</code> permission to use this\\n                  operation. </p>\\n            </dd>\\n         </dl>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/v20180820/accessgrantsinstance/caller/grants\",\n                    \"code\": 200\n                },\n                \"smithy.api#httpChecksumRequired\": {},\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"CallerAccessGrantsList\",\n                    \"pageSize\": \"MaxResults\"\n                },\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#ListCallerAccessGrantsEntry\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Permission\": {\n                    \"target\": \"com.amazonaws.s3control#Permission\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of permission granted, which can be one of the following values:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>READ</code> - Grants read-only access to the S3 data.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>WRITE</code> - Grants write-only access to the S3 data.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>READWRITE</code> - Grants both read and write access to the S3 data.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"GrantScope\": {\n                    \"target\": \"com.amazonaws.s3control#S3Prefix\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The S3 path of the data to which you have been granted access. </p>\"\n                    }\n                },\n                \"ApplicationArn\": {\n                    \"target\": \"com.amazonaws.s3control#IdentityCenterApplicationArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of an Amazon Web Services IAM Identity Center application associated\\n         with your Identity Center instance. If the grant includes an application ARN, the grantee\\n         can only access the S3 data through this application. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Part of <code>ListCallerAccessGrantsResult</code>. Each entry includes the permission\\n         level (READ, WRITE, or READWRITE) and the grant scope of the access grant. If the grant\\n         also includes an application ARN, the grantee can only access the S3 data through this\\n         application.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#ListCallerAccessGrantsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID of the S3 Access Grants instance.</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                },\n                \"GrantScope\": {\n                    \"target\": \"com.amazonaws.s3control#S3Prefix\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The S3 path of the data that you would like to access. Must start with\\n            <code>s3://</code>. You can optionally pass only the beginning characters of a path, and\\n         S3 Access Grants will search for all applicable grants for the path fragment. </p>\",\n                        \"smithy.api#httpQuery\": \"grantscope\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.s3control#ContinuationToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A pagination token to request the next page of results. Pass this value into a\\n         subsequent <code>List Caller Access Grants</code> request in order to retrieve the next\\n         page of results.</p>\",\n                        \"smithy.api#httpQuery\": \"nextToken\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.s3control#MaxResults\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The maximum number of access grants that you would like returned in the <code>List\\n            Caller Access Grants</code> response. If the results include the pagination token\\n            <code>NextToken</code>, make another call using the <code>NextToken</code> to determine\\n         if there are more results.</p>\",\n                        \"smithy.api#httpQuery\": \"maxResults\"\n                    }\n                },\n                \"AllowedByApplication\": {\n                    \"target\": \"com.amazonaws.s3control#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>If this optional parameter is passed in the request, a filter is applied to the results.\\n         The results will include only the access grants for the caller's Identity Center\\n         application or for any other applications (<code>ALL</code>).</p>\",\n                        \"smithy.api#httpQuery\": \"allowedByApplication\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#ListCallerAccessGrantsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.s3control#ContinuationToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A pagination token that you can use to request the next page of results. Pass this value\\n         into a subsequent <code>List Caller Access Grants</code> request in order to retrieve the\\n         next page of results.</p>\"\n                    }\n                },\n                \"CallerAccessGrantsList\": {\n                    \"target\": \"com.amazonaws.s3control#CallerAccessGrantsList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of the caller's access grants that were created using S3 Access Grants and that grant the\\n         caller access to the S3 data of the Amazon Web Services account ID that was specified in the request.\\n      </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.s3control#ListJobs\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#ListJobsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.s3control#ListJobsResult\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.s3control#InternalServiceException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#InvalidNextTokenException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#InvalidRequestException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Lists current S3 Batch Operations jobs as well as the jobs that have ended within the last 90\\n         days for the Amazon Web Services account making the request. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/batch-ops.html\\\">S3 Batch Operations</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <dl>\\n            <dt>Permissions</dt>\\n            <dd>\\n               <p>To use the <code>ListJobs</code> operation, you must have permission to perform\\n                  the <code>s3:ListJobs</code> action.</p>\\n            </dd>\\n         </dl>\\n         <p>Related actions include:</p>\\n         <p></p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_CreateJob.html\\\">CreateJob</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_DescribeJob.html\\\">DescribeJob</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_UpdateJobPriority.html\\\">UpdateJobPriority</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_UpdateJobStatus.html\\\">UpdateJobStatus</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/v20180820/jobs\",\n                    \"code\": 200\n                },\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"pageSize\": \"MaxResults\"\n                },\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#ListJobsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID associated with the S3 Batch Operations job.</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                },\n                \"JobStatuses\": {\n                    \"target\": \"com.amazonaws.s3control#JobStatusList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>List Jobs</code> request returns jobs that match the statuses listed in this\\n         element.</p>\",\n                        \"smithy.api#httpQuery\": \"jobStatuses\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.s3control#StringForNextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A pagination token to request the next page of results. Use the token that Amazon S3 returned\\n         in the <code>NextToken</code> element of the <code>ListJobsResult</code> from the previous\\n            <code>List Jobs</code> request.</p>\",\n                        \"smithy.api#httpQuery\": \"nextToken\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.s3control#MaxResults\",\n                    \"traits\": {\n                        \"smithy.api#default\": null,\n                        \"smithy.api#documentation\": \"<p>The maximum number of jobs that Amazon S3 will include in the <code>List Jobs</code>\\n         response. If there are more jobs than this number, the response will include a pagination\\n         token in the <code>NextToken</code> field to enable you to retrieve the next page of\\n         results.</p>\",\n                        \"smithy.api#httpQuery\": \"maxResults\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#ListJobsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.s3control#StringForNextToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If the <code>List Jobs</code> request produced more than the maximum number of results,\\n         you can pass this value into a subsequent <code>List Jobs</code> request in order to\\n         retrieve the next page of results.</p>\"\n                    }\n                },\n                \"Jobs\": {\n                    \"target\": \"com.amazonaws.s3control#JobListDescriptorList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The list of current jobs and jobs that have ended within the last 30 days.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.s3control#ListMultiRegionAccessPoints\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#ListMultiRegionAccessPointsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.s3control#ListMultiRegionAccessPointsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported by directory buckets.</p>\\n         </note>\\n         <p>Returns a list of the Multi-Region Access Points currently associated with the specified Amazon Web Services account.\\n         Each call can return up to 100 Multi-Region Access Points, the maximum number of Multi-Region Access Points that can be\\n         associated with a single account.</p>\\n         <p>This action will always be routed to the US West (Oregon) Region. For more information\\n         about the restrictions around working with Multi-Region Access Points, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/MultiRegionAccessPointRestrictions.html\\\">Multi-Region Access Point\\n            restrictions and limitations</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <p>The following actions are related to <code>ListMultiRegionAccessPoint</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_CreateMultiRegionAccessPoint.html\\\">CreateMultiRegionAccessPoint</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_DeleteMultiRegionAccessPoint.html\\\">DeleteMultiRegionAccessPoint</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_DescribeMultiRegionAccessPointOperation.html\\\">DescribeMultiRegionAccessPointOperation</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_GetMultiRegionAccessPoint.html\\\">GetMultiRegionAccessPoint</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/v20180820/mrap/instances\",\n                    \"code\": 200\n                },\n                \"smithy.api#httpChecksumRequired\": {},\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"pageSize\": \"MaxResults\"\n                },\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#ListMultiRegionAccessPointsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID for the owner of the Multi-Region Access Point.</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.s3control#NonEmptyMaxLength1024String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Not currently used. Do not use this parameter.</p>\",\n                        \"smithy.api#httpQuery\": \"nextToken\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.s3control#MaxResults\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>Not currently used. Do not use this parameter.</p>\",\n                        \"smithy.api#httpQuery\": \"maxResults\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#ListMultiRegionAccessPointsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccessPoints\": {\n                    \"target\": \"com.amazonaws.s3control#MultiRegionAccessPointReportList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The list of Multi-Region Access Points associated with the user.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.s3control#NonEmptyMaxLength1024String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If the specified bucket has more Multi-Region Access Points than can be returned in one call to this\\n         action, this field contains a continuation token. You can use this token tin subsequent\\n         calls to this action to retrieve additional Multi-Region Access Points.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.s3control#ListRegionalBuckets\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#ListRegionalBucketsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.s3control#ListRegionalBucketsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported by directory buckets.</p>\\n         </note>\\n         <p>Returns a list of all Outposts buckets in an Outpost that are owned by the authenticated\\n         sender of the request. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html\\\">Using Amazon S3 on Outposts</a> in the\\n            <i>Amazon S3 User Guide</i>.</p>\\n         <p>For an example of the request syntax for Amazon S3 on Outposts that uses the S3 on Outposts\\n         endpoint hostname prefix and <code>x-amz-outpost-id</code> in your request, see the <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_ListRegionalBuckets.html#API_control_ListRegionalBuckets_Examples\\\">Examples</a> section.</p>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/v20180820/bucket\",\n                    \"code\": 200\n                },\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"pageSize\": \"MaxResults\"\n                },\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#ListRegionalBucketsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID of the Outposts bucket.</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.s3control#NonEmptyMaxLength1024String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\",\n                        \"smithy.api#httpQuery\": \"nextToken\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.s3control#MaxResults\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p></p>\",\n                        \"smithy.api#httpQuery\": \"maxResults\"\n                    }\n                },\n                \"OutpostId\": {\n                    \"target\": \"com.amazonaws.s3control#NonEmptyMaxLength64String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the Outposts resource.</p>\\n         <note>\\n            <p>This ID is required by Amazon S3 on Outposts buckets.</p>\\n         </note>\",\n                        \"smithy.api#httpHeader\": \"x-amz-outpost-id\",\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"OutpostId\"\n                        }\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#ListRegionalBucketsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RegionalBucketList\": {\n                    \"target\": \"com.amazonaws.s3control#RegionalBucketList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.s3control#NonEmptyMaxLength1024String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>\\n            <code>NextToken</code> is sent when <code>isTruncated</code> is true, which means there\\n         are more buckets that can be listed. The next list requests to Amazon S3 can be continued with\\n         this <code>NextToken</code>. <code>NextToken</code> is obfuscated and is not a real\\n         key.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.s3control#ListStorageLensConfigurationEntry\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Id\": {\n                    \"target\": \"com.amazonaws.s3control#ConfigId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A container for the S3 Storage Lens configuration ID.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"StorageLensArn\": {\n                    \"target\": \"com.amazonaws.s3control#StorageLensArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the S3 Storage Lens configuration. This property is read-only.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"HomeRegion\": {\n                    \"target\": \"com.amazonaws.s3control#S3AWSRegion\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A container for the S3 Storage Lens home Region. Your metrics data is stored and retained in\\n         your designated S3 Storage Lens home Region.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"IsEnabled\": {\n                    \"target\": \"com.amazonaws.s3control#IsEnabled\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>A container for whether the S3 Storage Lens configuration is enabled. This property is\\n         required.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Part of <code>ListStorageLensConfigurationResult</code>. Each entry includes the\\n         description of the S3 Storage Lens configuration, its home Region, whether it is enabled, its\\n         Amazon Resource Name (ARN), and config ID.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#ListStorageLensConfigurations\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#ListStorageLensConfigurationsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.s3control#ListStorageLensConfigurationsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported by directory buckets.</p>\\n         </note>\\n         <p>Gets a list of Amazon S3 Storage Lens configurations. For more information about S3 Storage Lens, see\\n            <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/storage_lens.html\\\">Assessing your\\n            storage activity and usage with Amazon S3 Storage Lens </a> in the\\n            <i>Amazon S3 User Guide</i>.</p>\\n         <note>\\n            <p>To use this action, you must have permission to perform the\\n               <code>s3:ListStorageLensConfigurations</code> action. For more information, see\\n               <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/storage_lens_iam_permissions.html\\\">Setting permissions to\\n               use Amazon S3 Storage Lens</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         </note>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/v20180820/storagelens\",\n                    \"code\": 200\n                },\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\"\n                },\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#ListStorageLensConfigurationsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The account ID of the requester.</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.s3control#ContinuationToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A pagination token to request the next page of results.</p>\",\n                        \"smithy.api#httpQuery\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#ListStorageLensConfigurationsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.s3control#ContinuationToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If the request produced more than the maximum number of S3 Storage Lens configuration results,\\n         you can pass this value into a subsequent request to retrieve the next page of\\n         results.</p>\"\n                    }\n                },\n                \"StorageLensConfigurationList\": {\n                    \"target\": \"com.amazonaws.s3control#StorageLensConfigurationList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of S3 Storage Lens configurations.</p>\",\n                        \"smithy.api#xmlFlattened\": {},\n                        \"smithy.api#xmlName\": \"StorageLensConfiguration\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {},\n                \"smithy.api#xmlName\": \"ListStorageLensConfigurationResult\"\n            }\n        },\n        \"com.amazonaws.s3control#ListStorageLensGroupEntry\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Name\": {\n                    \"target\": \"com.amazonaws.s3control#StorageLensGroupName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>\\nContains the name of the Storage Lens group that exists in the specified home Region.\\n</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"StorageLensGroupArn\": {\n                    \"target\": \"com.amazonaws.s3control#StorageLensGroupArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>\\nContains the Amazon Resource Name (ARN) of the Storage Lens group. This property is read-only.\\n</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"HomeRegion\": {\n                    \"target\": \"com.amazonaws.s3control#S3AWSRegion\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>\\nContains the Amazon Web Services Region where the Storage Lens group was created.\\n</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>\\nEach entry contains a Storage Lens group that exists in the specified home Region.\\n</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#ListStorageLensGroups\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#ListStorageLensGroupsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.s3control#ListStorageLensGroupsResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>\\nLists all the Storage Lens groups in the specified home Region.\\n</p>\\n         <p>To use this operation, you must have the permission to perform the\\n      <code>s3:ListStorageLensGroups</code> action. For more information about the required Storage Lens\\n      Groups permissions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage_lens_iam_permissions.html#storage_lens_groups_permissions\\\">Setting account permissions to use S3 Storage Lens groups</a>.</p>\\n         <p>For information about Storage Lens groups errors, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html#S3LensErrorCodeList\\\">List of Amazon S3 Storage\\n      Lens error codes</a>.</p>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/v20180820/storagelensgroup\",\n                    \"code\": 200\n                },\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\"\n                },\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#ListStorageLensGroupsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>\\n   The Amazon Web Services account ID that owns the Storage Lens groups.\\n</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.s3control#ContinuationToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token for the next set of results, or <code>null</code> if there are no more results.\\n   </p>\",\n                        \"smithy.api#httpQuery\": \"nextToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#ListStorageLensGroupsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.s3control#ContinuationToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>\\n   If <code>NextToken</code> is returned, there are more Storage Lens groups results available. The value of <code>NextToken</code> is a\\n      unique pagination token for each page. Make the call again using the returned token to\\n      retrieve the next page. Keep all other arguments unchanged. Each pagination token expires\\n      after 24 hours.\\n</p>\"\n                    }\n                },\n                \"StorageLensGroupList\": {\n                    \"target\": \"com.amazonaws.s3control#StorageLensGroupList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>\\nThe list of Storage Lens groups that exist in the specified home Region.\\n</p>\",\n                        \"smithy.api#xmlFlattened\": {},\n                        \"smithy.api#xmlName\": \"StorageLensGroup\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.s3control#ListTagsForResource\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#ListTagsForResourceRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.s3control#ListTagsForResourceResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This operation allows you to list all of the tags for a specified resource. Each tag is\\n         a label consisting of a key and value. Tags can help you organize, track costs for, and\\n         control access to resources. </p>\\n         <note>\\n            <p>This operation is only supported for the following Amazon S3 resources:</p>\\n            <ul>\\n               <li>\\n                  <p>\\n                     <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-points-db-tagging.html\\\">Access Points for directory buckets</a>\\n                  </p>\\n               </li>\\n               <li>\\n                  <p>\\n                     <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-points-tagging.html\\\">Access Points for general purpose buckets</a>\\n                  </p>\\n               </li>\\n               <li>\\n                  <p>\\n                     <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-buckets-tagging.html\\\">Directory buckets</a>\\n                  </p>\\n               </li>\\n               <li>\\n                  <p>\\n                     <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage-lens-groups.html\\\">Storage Lens groups</a>\\n                  </p>\\n               </li>\\n               <li>\\n                  <p>\\n                     <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-grants-tagging.html\\\">S3 Access Grants instances, registered locations, and grants</a>.</p>\\n               </li>\\n            </ul>\\n         </note>\\n         <dl>\\n            <dt>Permissions</dt>\\n            <dd>\\n               <p>For Storage Lens groups and S3 Access Grants, you must have the\\n                     <code>s3:ListTagsForResource</code> permission to use this operation. </p>\\n               <p>For more information about the required Storage Lens Groups permissions, see\\n                     <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage_lens_iam_permissions.html#storage_lens_groups_permissions\\\">Setting account permissions to use S3 Storage Lens groups</a>.</p>\\n            </dd>\\n            <dt>Directory bucket permissions</dt>\\n            <dd>\\n               <p>For directory buckets and access points for directory buckets, you must have the <code>s3express:ListTagsForResource</code> permission to use this operation. For more information about directory buckets policies and permissions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-permissions.html\\\">Identity and Access Management (IAM) for S3 Express One Zone</a> in the <i>Amazon S3 User Guide</i>.</p>\\n            </dd>\\n            <dt>HTTP Host header syntax</dt>\\n            <dd>\\n               <p>\\n                  <b>Directory buckets </b> - The HTTP Host header syntax is <code>s3express-control.<i>region</i>.amazonaws.com</code>.</p>\\n            </dd>\\n         </dl>\\n         <p>For information about S3 Tagging errors, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html#S3TaggingErrorCodeList\\\">List of Amazon S3\\n            Tagging error codes</a>.</p>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/v20180820/tags/{ResourceArn+}\",\n                    \"code\": 200\n                },\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#ListTagsForResourceRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The Amazon Web Services account ID of the resource owner. </p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                },\n                \"ResourceArn\": {\n                    \"target\": \"com.amazonaws.s3control#S3ResourceArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The Amazon Resource Name (ARN) of the S3 resource that you want to list tags for. The\\n         tagged resource can be a directory bucket, S3 Storage Lens group or S3 Access Grants instance,\\n         registered location, or grant. </p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"ResourceArn\"\n                        }\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#ListTagsForResourceResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.s3control#TagList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The Amazon Web Services resource tags that are associated with the resource. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.s3control#Location\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.s3control#MFA\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.s3control#MFADelete\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"Enabled\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Enabled\"\n                    }\n                },\n                \"Disabled\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Disabled\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#MFADeleteStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"Enabled\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Enabled\"\n                    }\n                },\n                \"Disabled\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Disabled\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#ManifestPrefixString\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 512\n                }\n            }\n        },\n        \"com.amazonaws.s3control#MatchAnyPrefix\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.s3control#Prefix\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"Prefix\"\n                }\n            }\n        },\n        \"com.amazonaws.s3control#MatchAnySuffix\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.s3control#Suffix\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"Suffix\"\n                }\n            }\n        },\n        \"com.amazonaws.s3control#MatchAnyTag\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.s3control#S3Tag\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"Tag\"\n                }\n            }\n        },\n        \"com.amazonaws.s3control#MatchObjectAge\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DaysGreaterThan\": {\n                    \"target\": \"com.amazonaws.s3control#ObjectAgeValue\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>\\nSpecifies the maximum object age in days. Must be a positive whole number, greater than the minimum object age and less than or equal to 2,147,483,647. \\n</p>\"\n                    }\n                },\n                \"DaysLessThan\": {\n                    \"target\": \"com.amazonaws.s3control#ObjectAgeValue\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>\\nSpecifies the minimum object age in days. The value must be a positive whole number, greater than 0 and less than or equal to 2,147,483,647.\\n</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>\\n   A filter condition that specifies the object age range of included objects in days. Only integers are supported.\\n</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#MatchObjectSize\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"BytesGreaterThan\": {\n                    \"target\": \"com.amazonaws.s3control#ObjectSizeValue\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>\\nSpecifies the minimum object size in Bytes. The value must be a positive number, greater than 0 and less than 5 TB.\\n</p>\"\n                    }\n                },\n                \"BytesLessThan\": {\n                    \"target\": \"com.amazonaws.s3control#ObjectSizeValue\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>\\nSpecifies the maximum object size in Bytes. The value must be a positive number, greater than the minimum object size and less than 5 TB.\\n</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>\\nA filter condition that specifies the object size range of included objects in bytes. Only integers are supported.\\n</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#MaxLength1024String\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 1024\n                }\n            }\n        },\n        \"com.amazonaws.s3control#MaxResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#default\": 0,\n                \"smithy.api#range\": {\n                    \"min\": 0,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.s3control#Metrics\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Status\": {\n                    \"target\": \"com.amazonaws.s3control#MetricsStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies whether replication metrics are enabled. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"EventThreshold\": {\n                    \"target\": \"com.amazonaws.s3control#ReplicationTimeValue\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A container that specifies the time threshold for emitting the\\n            <code>s3:Replication:OperationMissedThreshold</code> event. </p>\\n         <note>\\n            <p>This is not supported by Amazon S3 on Outposts buckets.</p>\\n         </note>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A container that specifies replication metrics-related settings.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#MetricsStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"Enabled\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Enabled\"\n                    }\n                },\n                \"Disabled\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Disabled\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#MinStorageBytesPercentage\": {\n            \"type\": \"double\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 0.1,\n                    \"max\": 100\n                }\n            }\n        },\n        \"com.amazonaws.s3control#Minutes\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#default\": 0\n            }\n        },\n        \"com.amazonaws.s3control#MultiRegionAccessPointAlias\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 63\n                },\n                \"smithy.api#pattern\": \"^[a-z][a-z0-9]*[.]mrap$\"\n            }\n        },\n        \"com.amazonaws.s3control#MultiRegionAccessPointClientToken\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 64\n                },\n                \"smithy.api#pattern\": \"^\\\\S+$\"\n            }\n        },\n        \"com.amazonaws.s3control#MultiRegionAccessPointId\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 200\n                },\n                \"smithy.api#pattern\": \"^[a-zA-Z0-9\\\\:.-]{3,200}$\"\n            }\n        },\n        \"com.amazonaws.s3control#MultiRegionAccessPointName\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 50\n                },\n                \"smithy.api#pattern\": \"^[a-z0-9][-a-z0-9]{1,48}[a-z0-9]$\"\n            }\n        },\n        \"com.amazonaws.s3control#MultiRegionAccessPointPolicyDocument\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Established\": {\n                    \"target\": \"com.amazonaws.s3control#EstablishedMultiRegionAccessPointPolicy\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The last established policy for the Multi-Region Access Point.</p>\"\n                    }\n                },\n                \"Proposed\": {\n                    \"target\": \"com.amazonaws.s3control#ProposedMultiRegionAccessPointPolicy\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The proposed policy for the Multi-Region Access Point.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The Multi-Region Access Point access control policy.</p>\\n         <p>When you update the policy, the update is first listed as the proposed policy. After the\\n         update is finished and all Regions have been updated, the proposed policy is listed as the\\n         established policy. If both policies have the same version number, the proposed policy is\\n         the established policy.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#MultiRegionAccessPointRegionalResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Name\": {\n                    \"target\": \"com.amazonaws.s3control#RegionName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the Region in the Multi-Region Access Point.</p>\"\n                    }\n                },\n                \"RequestStatus\": {\n                    \"target\": \"com.amazonaws.s3control#AsyncRequestStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The current status of the Multi-Region Access Point in this Region.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Status information for a single Multi-Region Access Point Region.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#MultiRegionAccessPointRegionalResponseList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.s3control#MultiRegionAccessPointRegionalResponse\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"Region\"\n                }\n            }\n        },\n        \"com.amazonaws.s3control#MultiRegionAccessPointReport\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Name\": {\n                    \"target\": \"com.amazonaws.s3control#MultiRegionAccessPointName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the Multi-Region Access Point.</p>\"\n                    }\n                },\n                \"Alias\": {\n                    \"target\": \"com.amazonaws.s3control#MultiRegionAccessPointAlias\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The alias for the Multi-Region Access Point. For more information about the distinction between the name\\n         and the alias of an Multi-Region Access Point, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/CreatingMultiRegionAccessPoints.html#multi-region-access-point-naming\\\">Rules for naming Amazon S3 Multi-Region Access Points</a>.</p>\"\n                    }\n                },\n                \"CreatedAt\": {\n                    \"target\": \"com.amazonaws.s3control#CreationTimestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>When the Multi-Region Access Point create request was received.</p>\"\n                    }\n                },\n                \"PublicAccessBlock\": {\n                    \"target\": \"com.amazonaws.s3control#PublicAccessBlockConfiguration\"\n                },\n                \"Status\": {\n                    \"target\": \"com.amazonaws.s3control#MultiRegionAccessPointStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The current status of the Multi-Region Access Point.</p>\\n         <p>\\n            <code>CREATING</code> and <code>DELETING</code> are temporary states that exist while\\n         the request is propagating and being completed. If a Multi-Region Access Point has a status of\\n            <code>PARTIALLY_CREATED</code>, you can retry creation or send a request to delete the\\n         Multi-Region Access Point. If a Multi-Region Access Point has a status of <code>PARTIALLY_DELETED</code>, you can retry a delete\\n         request to finish the deletion of the Multi-Region Access Point.</p>\"\n                    }\n                },\n                \"Regions\": {\n                    \"target\": \"com.amazonaws.s3control#RegionReportList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A collection of the Regions and buckets associated with the Multi-Region Access Point.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A collection of statuses for a Multi-Region Access Point in the various Regions it supports.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#MultiRegionAccessPointReportList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.s3control#MultiRegionAccessPointReport\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"AccessPoint\"\n                }\n            }\n        },\n        \"com.amazonaws.s3control#MultiRegionAccessPointRoute\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Bucket\": {\n                    \"target\": \"com.amazonaws.s3control#BucketName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the Amazon S3 bucket for which you'll submit a routing configuration change.\\n         Either the <code>Bucket</code> or the <code>Region</code> value must be provided. If both\\n         are provided, the bucket must be in the specified Region.</p>\"\n                    }\n                },\n                \"Region\": {\n                    \"target\": \"com.amazonaws.s3control#RegionName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services Region to which you'll be submitting a routing configuration change. Either\\n         the <code>Bucket</code> or the <code>Region</code> value must be provided. If both are\\n         provided, the bucket must be in the specified Region.</p>\"\n                    }\n                },\n                \"TrafficDialPercentage\": {\n                    \"target\": \"com.amazonaws.s3control#TrafficDialPercentage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The traffic state for the specified bucket or Amazon Web Services Region. </p>\\n         <p>A value of <code>0</code> indicates a passive state, which means that no new traffic\\n         will be routed to the Region. </p>\\n         <p>A value of <code>100</code> indicates an active state, which means that traffic will be\\n         routed to the specified Region. </p>\\n         <p>When the routing configuration for a Region is changed from active to passive, any\\n         in-progress operations (uploads, copies, deletes, and so on) to the formerly active Region\\n         will continue to run to until a final success or failure status is reached.</p>\\n         <p>If all Regions in the routing configuration are designated as passive, you'll receive an\\n            <code>InvalidRequest</code> error.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A structure for a Multi-Region Access Point that indicates where Amazon S3 traffic can be routed. Routes can be\\n         either active or passive. Active routes can process Amazon S3 requests through the Multi-Region Access Point, but\\n         passive routes are not eligible to process Amazon S3 requests. </p>\\n         <p>Each route contains the Amazon S3 bucket name and the Amazon Web Services Region that the bucket is located\\n         in. The route also includes the <code>TrafficDialPercentage</code> value, which shows\\n         whether the bucket and Region are active (indicated by a value of <code>100</code>) or\\n         passive (indicated by a value of <code>0</code>).</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#MultiRegionAccessPointStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"READY\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"READY\"\n                    }\n                },\n                \"INCONSISTENT_ACROSS_REGIONS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"INCONSISTENT_ACROSS_REGIONS\"\n                    }\n                },\n                \"CREATING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"CREATING\"\n                    }\n                },\n                \"PARTIALLY_CREATED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"PARTIALLY_CREATED\"\n                    }\n                },\n                \"PARTIALLY_DELETED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"PARTIALLY_DELETED\"\n                    }\n                },\n                \"DELETING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DELETING\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#MultiRegionAccessPointsAsyncResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Regions\": {\n                    \"target\": \"com.amazonaws.s3control#MultiRegionAccessPointRegionalResponseList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A collection of status information for the different Regions that a Multi-Region Access Point\\n         supports.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The Multi-Region Access Point details that are returned when querying about an asynchronous request.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#NetworkOrigin\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"Internet\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Internet\"\n                    }\n                },\n                \"VPC\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"VPC\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#NoSuchPublicAccessBlockConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Message\": {\n                    \"target\": \"com.amazonaws.s3control#NoSuchPublicAccessBlockConfigurationMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Amazon S3 throws this exception if you make a <code>GetPublicAccessBlock</code> request\\n         against an account that doesn't have a <code>PublicAccessBlockConfiguration</code>\\n         set.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 404\n            }\n        },\n        \"com.amazonaws.s3control#NoSuchPublicAccessBlockConfigurationMessage\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.s3control#NonEmptyKmsKeyArnString\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 2000\n                },\n                \"smithy.api#pattern\": \"^arn:aws[a-zA-Z0-9-]*:kms:[a-z0-9-]+:[0-9]{12}:key/[a-zA-Z0-9-]+$\"\n            }\n        },\n        \"com.amazonaws.s3control#NonEmptyMaxLength1024String\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 1024\n                }\n            }\n        },\n        \"com.amazonaws.s3control#NonEmptyMaxLength1024StringList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.s3control#NonEmptyMaxLength1024String\"\n            }\n        },\n        \"com.amazonaws.s3control#NonEmptyMaxLength2048String\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 2048\n                }\n            }\n        },\n        \"com.amazonaws.s3control#NonEmptyMaxLength256String\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 256\n                }\n            }\n        },\n        \"com.amazonaws.s3control#NonEmptyMaxLength64String\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 64\n                }\n            }\n        },\n        \"com.amazonaws.s3control#NoncurrentVersionCount\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#default\": 0\n            }\n        },\n        \"com.amazonaws.s3control#NoncurrentVersionExpiration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NoncurrentDays\": {\n                    \"target\": \"com.amazonaws.s3control#Days\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>Specifies the number of days an object is noncurrent before Amazon S3 can perform the\\n         associated action. For information about the noncurrent days calculations, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/intro-lifecycle-rules.html#non-current-days-calculations\\\">How\\n            Amazon S3 Calculates When an Object Became Noncurrent</a> in the\\n            <i>Amazon S3 User Guide</i>.</p>\"\n                    }\n                },\n                \"NewerNoncurrentVersions\": {\n                    \"target\": \"com.amazonaws.s3control#NoncurrentVersionCount\",\n                    \"traits\": {\n                        \"smithy.api#default\": null,\n                        \"smithy.api#documentation\": \"<p>Specifies how many noncurrent versions S3 on Outposts will retain. If there are this many\\n         more recent noncurrent versions, S3 on Outposts will take the associated action. For more\\n         information about noncurrent versions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/intro-lifecycle-rules.html\\\">Lifecycle configuration\\n            elements</a> in the <i>Amazon S3 User Guide</i>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The container of the noncurrent version expiration.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#NoncurrentVersionTransition\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NoncurrentDays\": {\n                    \"target\": \"com.amazonaws.s3control#Days\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>Specifies the number of days an object is noncurrent before Amazon S3 can perform the\\n         associated action. For information about the noncurrent days calculations, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/intro-lifecycle-rules.html#non-current-days-calculations\\\"> How\\n            Amazon S3 Calculates How Long an Object Has Been Noncurrent</a> in the\\n            <i>Amazon S3 User Guide</i>.</p>\"\n                    }\n                },\n                \"StorageClass\": {\n                    \"target\": \"com.amazonaws.s3control#TransitionStorageClass\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The class of storage used to store the object.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The container for the noncurrent version transition.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#NoncurrentVersionTransitionList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.s3control#NoncurrentVersionTransition\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"NoncurrentVersionTransition\"\n                }\n            }\n        },\n        \"com.amazonaws.s3control#NotFoundException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Message\": {\n                    \"target\": \"com.amazonaws.s3control#ExceptionMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p></p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.s3control#NotSSEFilter\": {\n            \"type\": \"structure\",\n            \"members\": {},\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A filter that returns objects that aren't server-side encrypted.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#ObjectAgeValue\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#default\": 0\n            }\n        },\n        \"com.amazonaws.s3control#ObjectCreationTime\": {\n            \"type\": \"timestamp\"\n        },\n        \"com.amazonaws.s3control#ObjectEncryptionFilter\": {\n            \"type\": \"union\",\n            \"members\": {\n                \"SSES3\": {\n                    \"target\": \"com.amazonaws.s3control#SSES3Filter\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Filters for objects that are encrypted by server-side encryption with Amazon S3 managed keys (SSE-S3).</p>\",\n                        \"smithy.api#xmlName\": \"SSE-S3\"\n                    }\n                },\n                \"SSEKMS\": {\n                    \"target\": \"com.amazonaws.s3control#SSEKMSFilter\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Filters for objects that are encrypted by server-side encryption with Amazon Web Services Key Management Service (KMS) keys (SSE-KMS).</p>\",\n                        \"smithy.api#xmlName\": \"SSE-KMS\"\n                    }\n                },\n                \"DSSEKMS\": {\n                    \"target\": \"com.amazonaws.s3control#DSSEKMSFilter\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Filters for objects that are encrypted by dual-layer server-side encryption with Amazon Web Services Key Management\\n         Service (KMS) keys (DSSE-KMS).</p>\",\n                        \"smithy.api#xmlName\": \"DSSE-KMS\"\n                    }\n                },\n                \"SSEC\": {\n                    \"target\": \"com.amazonaws.s3control#SSECFilter\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Filters for objects that are encrypted by server-side encryption with customer-provided keys (SSE-C).</p>\",\n                        \"smithy.api#xmlName\": \"SSE-C\"\n                    }\n                },\n                \"NOTSSE\": {\n                    \"target\": \"com.amazonaws.s3control#NotSSEFilter\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Filters for objects that are not encrypted by server-side encryption. </p>\",\n                        \"smithy.api#xmlName\": \"NOT-SSE\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>An optional filter for the \\n         <code>S3JobManifestGenerator</code> that identifies the subset of objects by encryption type. \\n         This filter is used to create an object list for S3 Batch Operations jobs. If provided, this filter will generate an object list \\n         that only includes objects with the specified encryption type.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#ObjectEncryptionFilterList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.s3control#ObjectEncryptionFilter\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"ObjectEncryption\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 1\n                }\n            }\n        },\n        \"com.amazonaws.s3control#ObjectLambdaAccessPoint\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Name\": {\n                    \"target\": \"com.amazonaws.s3control#ObjectLambdaAccessPointName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the Object Lambda Access Point.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ObjectLambdaAccessPointArn\": {\n                    \"target\": \"com.amazonaws.s3control#ObjectLambdaAccessPointArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the ARN for the Object Lambda Access Point.</p>\"\n                    }\n                },\n                \"Alias\": {\n                    \"target\": \"com.amazonaws.s3control#ObjectLambdaAccessPointAlias\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The alias of the Object Lambda Access Point.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>An access point with an attached Lambda function used to access transformed data from an Amazon S3\\n         bucket.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#ObjectLambdaAccessPointAlias\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Value\": {\n                    \"target\": \"com.amazonaws.s3control#ObjectLambdaAccessPointAliasValue\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The alias value of the Object Lambda Access Point.</p>\"\n                    }\n                },\n                \"Status\": {\n                    \"target\": \"com.amazonaws.s3control#ObjectLambdaAccessPointAliasStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The status of the Object Lambda Access Point alias. If the status is <code>PROVISIONING</code>, the Object Lambda Access Point\\n         is provisioning the alias and the alias is not ready for use yet. If the status is\\n            <code>READY</code>, the Object Lambda Access Point alias is successfully provisioned and ready for\\n         use.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The alias of an Object Lambda Access Point. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/olap-use.html#ol-access-points-alias\\\">How to use a\\n            bucket-style alias for your S3 bucket Object Lambda Access Point</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#ObjectLambdaAccessPointAliasStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"PROVISIONING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"PROVISIONING\"\n                    }\n                },\n                \"READY\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"READY\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 2,\n                    \"max\": 16\n                }\n            }\n        },\n        \"com.amazonaws.s3control#ObjectLambdaAccessPointAliasValue\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 3,\n                    \"max\": 63\n                },\n                \"smithy.api#pattern\": \"^[0-9a-z\\\\\\\\-]{3,63}$\"\n            }\n        },\n        \"com.amazonaws.s3control#ObjectLambdaAccessPointArn\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 2048\n                },\n                \"smithy.api#pattern\": \"^arn:[^:]+:s3-object-lambda:[^:]*:\\\\d{12}:accesspoint/\"\n            }\n        },\n        \"com.amazonaws.s3control#ObjectLambdaAccessPointList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.s3control#ObjectLambdaAccessPoint\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"ObjectLambdaAccessPoint\"\n                }\n            }\n        },\n        \"com.amazonaws.s3control#ObjectLambdaAccessPointName\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 3,\n                    \"max\": 45\n                },\n                \"smithy.api#pattern\": \"^[a-z0-9]([a-z0-9\\\\-]*[a-z0-9])?$\"\n            }\n        },\n        \"com.amazonaws.s3control#ObjectLambdaAllowedFeature\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"GetObjectRange\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"GetObject-Range\"\n                    }\n                },\n                \"GetObjectPartNumber\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"GetObject-PartNumber\"\n                    }\n                },\n                \"HeadObjectRange\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"HeadObject-Range\"\n                    }\n                },\n                \"HeadObjectPartNumber\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"HeadObject-PartNumber\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#ObjectLambdaAllowedFeaturesList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.s3control#ObjectLambdaAllowedFeature\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"AllowedFeature\"\n                }\n            }\n        },\n        \"com.amazonaws.s3control#ObjectLambdaConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SupportingAccessPoint\": {\n                    \"target\": \"com.amazonaws.s3control#ObjectLambdaSupportingAccessPointArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Standard access point associated with the Object Lambda Access Point.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"CloudWatchMetricsEnabled\": {\n                    \"target\": \"com.amazonaws.s3control#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>A container for whether the CloudWatch metrics configuration is enabled.</p>\"\n                    }\n                },\n                \"AllowedFeatures\": {\n                    \"target\": \"com.amazonaws.s3control#ObjectLambdaAllowedFeaturesList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A container for allowed features. Valid inputs are <code>GetObject-Range</code>,\\n            <code>GetObject-PartNumber</code>, <code>HeadObject-Range</code>, and\\n            <code>HeadObject-PartNumber</code>.</p>\"\n                    }\n                },\n                \"TransformationConfigurations\": {\n                    \"target\": \"com.amazonaws.s3control#ObjectLambdaTransformationConfigurationsList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A container for transformation configurations for an Object Lambda Access Point.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A configuration used when creating an Object Lambda Access Point.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#ObjectLambdaContentTransformation\": {\n            \"type\": \"union\",\n            \"members\": {\n                \"AwsLambda\": {\n                    \"target\": \"com.amazonaws.s3control#AwsLambdaTransformation\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A container for an Lambda function.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A container for AwsLambdaTransformation.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#ObjectLambdaPolicy\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.s3control#ObjectLambdaSupportingAccessPointArn\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 2048\n                },\n                \"smithy.api#pattern\": \"^arn:[^:]+:s3:[^:]*:\\\\d{12}:accesspoint/\"\n            }\n        },\n        \"com.amazonaws.s3control#ObjectLambdaTransformationConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Actions\": {\n                    \"target\": \"com.amazonaws.s3control#ObjectLambdaTransformationConfigurationActionsList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A container for the action of an Object Lambda Access Point configuration. Valid inputs are\\n            <code>GetObject</code>, <code>ListObjects</code>, <code>HeadObject</code>, and\\n            <code>ListObjectsV2</code>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ContentTransformation\": {\n                    \"target\": \"com.amazonaws.s3control#ObjectLambdaContentTransformation\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A container for the content transformation of an Object Lambda Access Point configuration.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A configuration used when creating an Object Lambda Access Point transformation.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#ObjectLambdaTransformationConfigurationAction\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"GetObject\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"GetObject\"\n                    }\n                },\n                \"HeadObject\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"HeadObject\"\n                    }\n                },\n                \"ListObjects\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ListObjects\"\n                    }\n                },\n                \"ListObjectsV2\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ListObjectsV2\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#ObjectLambdaTransformationConfigurationActionsList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.s3control#ObjectLambdaTransformationConfigurationAction\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"Action\"\n                }\n            }\n        },\n        \"com.amazonaws.s3control#ObjectLambdaTransformationConfigurationsList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.s3control#ObjectLambdaTransformationConfiguration\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"TransformationConfiguration\"\n                }\n            }\n        },\n        \"com.amazonaws.s3control#ObjectLockEnabledForBucket\": {\n            \"type\": \"boolean\",\n            \"traits\": {\n                \"smithy.api#default\": false\n            }\n        },\n        \"com.amazonaws.s3control#ObjectSizeGreaterThanBytes\": {\n            \"type\": \"long\",\n            \"traits\": {\n                \"smithy.api#default\": 0\n            }\n        },\n        \"com.amazonaws.s3control#ObjectSizeLessThanBytes\": {\n            \"type\": \"long\",\n            \"traits\": {\n                \"smithy.api#default\": 0\n            }\n        },\n        \"com.amazonaws.s3control#ObjectSizeValue\": {\n            \"type\": \"long\",\n            \"traits\": {\n                \"smithy.api#default\": 0\n            }\n        },\n        \"com.amazonaws.s3control#OperationName\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"LambdaInvoke\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"LambdaInvoke\"\n                    }\n                },\n                \"S3PutObjectCopy\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"S3PutObjectCopy\"\n                    }\n                },\n                \"S3PutObjectAcl\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"S3PutObjectAcl\"\n                    }\n                },\n                \"S3PutObjectTagging\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"S3PutObjectTagging\"\n                    }\n                },\n                \"S3DeleteObjectTagging\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"S3DeleteObjectTagging\"\n                    }\n                },\n                \"S3InitiateRestoreObject\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"S3InitiateRestoreObject\"\n                    }\n                },\n                \"S3PutObjectLegalHold\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"S3PutObjectLegalHold\"\n                    }\n                },\n                \"S3PutObjectRetention\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"S3PutObjectRetention\"\n                    }\n                },\n                \"S3ReplicateObject\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"S3ReplicateObject\"\n                    }\n                },\n                \"S3ComputeObjectChecksum\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"S3ComputeObjectChecksum\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#Organization\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 12,\n                    \"max\": 34\n                },\n                \"smithy.api#pattern\": \"^o-[a-z0-9]{10,32}$\"\n            }\n        },\n        \"com.amazonaws.s3control#OutputSchemaVersion\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"V_1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"V_1\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#OwnerOverride\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"Destination\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Destination\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#Permission\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"READ\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"READ\"\n                    }\n                },\n                \"WRITE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"WRITE\"\n                    }\n                },\n                \"READWRITE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"READWRITE\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#Policy\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.s3control#PolicyDocument\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 350000\n                }\n            }\n        },\n        \"com.amazonaws.s3control#PolicyStatus\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"IsPublic\": {\n                    \"target\": \"com.amazonaws.s3control#IsPublic\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p></p>\",\n                        \"smithy.api#xmlName\": \"IsPublic\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Indicates whether this access point policy is public. For more information about how Amazon S3\\n         evaluates policies to determine whether they are public, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/access-control-block-public-access.html#access-control-block-public-access-policy-status\\\">The Meaning of \\\"Public\\\"</a> in the <i>Amazon S3 User Guide</i>. </p>\"\n            }\n        },\n        \"com.amazonaws.s3control#Prefix\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.s3control#PrefixLevel\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"StorageMetrics\": {\n                    \"target\": \"com.amazonaws.s3control#PrefixLevelStorageMetrics\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A container for the prefix-level storage metrics for S3 Storage Lens.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A container for the prefix-level configuration.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#PrefixLevelStorageMetrics\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"IsEnabled\": {\n                    \"target\": \"com.amazonaws.s3control#IsEnabled\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>A container for whether prefix-level storage metrics are enabled.</p>\"\n                    }\n                },\n                \"SelectionCriteria\": {\n                    \"target\": \"com.amazonaws.s3control#SelectionCriteria\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A container for the prefix-level storage metrics for S3 Storage Lens.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#PrefixesList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.s3control#Prefix\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"Prefix\"\n                }\n            }\n        },\n        \"com.amazonaws.s3control#Priority\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#default\": 0\n            }\n        },\n        \"com.amazonaws.s3control#Privilege\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"Minimal\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Minimal\"\n                    }\n                },\n                \"Default\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Default\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#ProposedMultiRegionAccessPointPolicy\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Policy\": {\n                    \"target\": \"com.amazonaws.s3control#Policy\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The details of the proposed policy.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The proposed access control policy for the Multi-Region Access Point.</p>\\n         <p>When you update the policy, the update is first listed as the proposed policy. After the\\n         update is finished and all Regions have been updated, the proposed policy is listed as the\\n         established policy. If both policies have the same version number, the proposed policy is\\n         the established policy.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#PublicAccessBlockConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"BlockPublicAcls\": {\n                    \"target\": \"com.amazonaws.s3control#Setting\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Specifies whether Amazon S3 should block public access control lists (ACLs) for buckets in\\n         this account. Setting this element to <code>TRUE</code> causes the following\\n         behavior:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>PutBucketAcl</code> and <code>PutObjectAcl</code> calls fail if the\\n               specified ACL is public.</p>\\n            </li>\\n            <li>\\n               <p>PUT Object calls fail if the request includes a public ACL.</p>\\n            </li>\\n            <li>\\n               <p>PUT Bucket calls fail if the request includes a public ACL.</p>\\n            </li>\\n         </ul>\\n         <p>Enabling this setting doesn't affect existing policies or ACLs.</p>\\n         <p>This property is not supported for Amazon S3 on Outposts.</p>\",\n                        \"smithy.api#xmlName\": \"BlockPublicAcls\"\n                    }\n                },\n                \"IgnorePublicAcls\": {\n                    \"target\": \"com.amazonaws.s3control#Setting\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Specifies whether Amazon S3 should ignore public ACLs for buckets in this account. Setting\\n         this element to <code>TRUE</code> causes Amazon S3 to ignore all public ACLs on buckets in this\\n         account and any objects that they contain. </p>\\n         <p>Enabling this setting doesn't affect the persistence of any existing ACLs and doesn't\\n         prevent new public ACLs from being set.</p>\\n         <p>This property is not supported for Amazon S3 on Outposts.</p>\",\n                        \"smithy.api#xmlName\": \"IgnorePublicAcls\"\n                    }\n                },\n                \"BlockPublicPolicy\": {\n                    \"target\": \"com.amazonaws.s3control#Setting\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Specifies whether Amazon S3 should block public bucket policies for buckets in this account.\\n         Setting this element to <code>TRUE</code> causes Amazon S3 to reject calls to PUT Bucket policy\\n         if the specified bucket policy allows public access. </p>\\n         <p>Enabling this setting doesn't affect existing bucket policies.</p>\\n         <p>This property is not supported for Amazon S3 on Outposts.</p>\",\n                        \"smithy.api#xmlName\": \"BlockPublicPolicy\"\n                    }\n                },\n                \"RestrictPublicBuckets\": {\n                    \"target\": \"com.amazonaws.s3control#Setting\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Specifies whether Amazon S3 should restrict public bucket policies for buckets in this\\n         account. Setting this element to <code>TRUE</code> restricts access to buckets with public\\n         policies to only Amazon Web Services service principals and authorized users within this\\n         account.</p>\\n         <p>Enabling this setting doesn't affect previously stored bucket policies, except that\\n         public and cross-account access within any public bucket policy, including non-public\\n         delegation to specific accounts, is blocked.</p>\\n         <p>This property is not supported for Amazon S3 on Outposts.</p>\",\n                        \"smithy.api#xmlName\": \"RestrictPublicBuckets\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The <code>PublicAccessBlock</code> configuration that you want to apply to this Amazon S3\\n         account. You can enable the configuration options in any combination. For more information\\n         about when Amazon S3 considers a bucket or object public, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/access-control-block-public-access.html#access-control-block-public-access-policy-status\\\">The Meaning of \\\"Public\\\"</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <p>This data type is not supported for Amazon S3 on Outposts.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#PublicAccessBlockEnabled\": {\n            \"type\": \"boolean\",\n            \"traits\": {\n                \"smithy.api#default\": false\n            }\n        },\n        \"com.amazonaws.s3control#PutAccessGrantsInstanceResourcePolicy\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#PutAccessGrantsInstanceResourcePolicyRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.s3control#PutAccessGrantsInstanceResourcePolicyResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Updates the resource policy of the S3 Access Grants instance. </p>\\n         <dl>\\n            <dt>Permissions</dt>\\n            <dd>\\n               <p>You must have the <code>s3:PutAccessGrantsInstanceResourcePolicy</code>\\n                  permission to use this operation. </p>\\n            </dd>\\n         </dl>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"PUT\",\n                    \"uri\": \"/v20180820/accessgrantsinstance/resourcepolicy\",\n                    \"code\": 200\n                },\n                \"smithy.api#httpChecksumRequired\": {},\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#PutAccessGrantsInstanceResourcePolicyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID of the S3 Access Grants instance.</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                },\n                \"Policy\": {\n                    \"target\": \"com.amazonaws.s3control#PolicyDocument\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The resource policy of the S3 Access Grants instance that you are updating.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Organization\": {\n                    \"target\": \"com.amazonaws.s3control#Organization\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Organization of the resource policy of the S3 Access Grants instance.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#PutAccessGrantsInstanceResourcePolicyResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Policy\": {\n                    \"target\": \"com.amazonaws.s3control#PolicyDocument\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The updated resource policy of the S3 Access Grants instance.</p>\"\n                    }\n                },\n                \"Organization\": {\n                    \"target\": \"com.amazonaws.s3control#Organization\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Organization of the resource policy of the S3 Access Grants instance.</p>\"\n                    }\n                },\n                \"CreatedAt\": {\n                    \"target\": \"com.amazonaws.s3control#CreationTimestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time when you created the S3 Access Grants instance resource policy. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.s3control#PutAccessPointConfigurationForObjectLambda\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#PutAccessPointConfigurationForObjectLambdaRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported by directory buckets.</p>\\n         </note>\\n         <p>Replaces configuration for an Object Lambda Access Point.</p>\\n         <p>The following actions are related to\\n            <code>PutAccessPointConfigurationForObjectLambda</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_GetAccessPointConfigurationForObjectLambda.html\\\">GetAccessPointConfigurationForObjectLambda</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"PUT\",\n                    \"uri\": \"/v20180820/accesspointforobjectlambda/{Name}/configuration\",\n                    \"code\": 200\n                },\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#PutAccessPointConfigurationForObjectLambdaRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The account ID for the account that owns the specified Object Lambda Access Point.</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                },\n                \"Name\": {\n                    \"target\": \"com.amazonaws.s3control#ObjectLambdaAccessPointName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the Object Lambda Access Point.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Configuration\": {\n                    \"target\": \"com.amazonaws.s3control#ObjectLambdaConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Object Lambda Access Point configuration document.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#PutAccessPointPolicy\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#PutAccessPointPolicyRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Associates an access policy with the specified access point. Each access point can have only one policy,\\n         so a request made to this API replaces any existing policy associated with the specified\\n         access point.</p>\\n         <p></p>\\n         <p>All Amazon S3 on Outposts REST API requests for this action require an additional parameter of <code>x-amz-outpost-id</code> to be passed with the request. In addition, you must use an S3 on Outposts endpoint hostname prefix instead of <code>s3-control</code>. For an example of the request syntax for Amazon S3 on Outposts that uses the S3 on Outposts endpoint hostname prefix and the <code>x-amz-outpost-id</code> derived by using the access point ARN, see the <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_PutAccessPointPolicy.html#API_control_PutAccessPointPolicy_Examples\\\">Examples</a> section.</p>\\n         <p>The following actions are related to <code>PutAccessPointPolicy</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_GetAccessPointPolicy.html\\\">GetAccessPointPolicy</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_DeleteAccessPointPolicy.html\\\">DeleteAccessPointPolicy</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"PUT\",\n                    \"uri\": \"/v20180820/accesspoint/{Name}/policy\",\n                    \"code\": 200\n                },\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#PutAccessPointPolicyForObjectLambda\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#PutAccessPointPolicyForObjectLambdaRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported by directory buckets.</p>\\n         </note>\\n         <p>Creates or replaces resource policy for an Object Lambda Access Point. For an example policy, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/olap-create.html#olap-create-cli\\\">Creating Object Lambda Access Points</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <p>The following actions are related to\\n         <code>PutAccessPointPolicyForObjectLambda</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_DeleteAccessPointPolicyForObjectLambda.html\\\">DeleteAccessPointPolicyForObjectLambda</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_GetAccessPointPolicyForObjectLambda.html\\\">GetAccessPointPolicyForObjectLambda</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"PUT\",\n                    \"uri\": \"/v20180820/accesspointforobjectlambda/{Name}/policy\",\n                    \"code\": 200\n                },\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#PutAccessPointPolicyForObjectLambdaRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The account ID for the account that owns the specified Object Lambda Access Point.</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                },\n                \"Name\": {\n                    \"target\": \"com.amazonaws.s3control#ObjectLambdaAccessPointName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the Object Lambda Access Point.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Policy\": {\n                    \"target\": \"com.amazonaws.s3control#ObjectLambdaPolicy\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Object Lambda Access Point resource policy document.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#PutAccessPointPolicyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID for owner of the bucket associated with the specified access point.</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                },\n                \"Name\": {\n                    \"target\": \"com.amazonaws.s3control#AccessPointName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the access point that you want to associate with the specified policy.</p>\\n         <p>For using this parameter with Amazon S3 on Outposts with the REST API, you must specify the name and the x-amz-outpost-id as well.</p>\\n         <p>For using this parameter with S3 on Outposts with the Amazon Web Services SDK and CLI, you must  specify the ARN of the access point accessed in the format <code>arn:aws:s3-outposts:<Region>:<account-id>:outpost/<outpost-id>/accesspoint/<my-accesspoint-name></code>. For example, to access the access point <code>reports-ap</code> through Outpost <code>my-outpost</code> owned by account <code>123456789012</code> in Region <code>us-west-2</code>, use the URL encoding of <code>arn:aws:s3-outposts:us-west-2:123456789012:outpost/my-outpost/accesspoint/reports-ap</code>. The value must be URL encoded. </p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccessPointName\"\n                        }\n                    }\n                },\n                \"Policy\": {\n                    \"target\": \"com.amazonaws.s3control#Policy\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The policy that you want to apply to the specified access point. For more information about access point\\n         policies, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-points.html\\\">Managing data access with Amazon S3\\n            access points</a> or <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-points-directory-buckets.html\\\">Managing access to\\n            shared datasets in directory buckets with access points</a> in the\\n            <i>Amazon S3 User Guide</i>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#PutAccessPointScope\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#PutAccessPointScopeRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates or replaces the access point scope for a directory bucket. You can use the access point\\n         scope to restrict access to specific prefixes, API operations, or a combination of\\n         both.</p>\\n         <note>\\n            <p>You can specify any amount of prefixes, but the total length of characters of all\\n            prefixes must be less than 256 bytes in size.</p>\\n         </note>\\n         <p>To use this operation, you must have the permission to perform the\\n            <code>s3express:PutAccessPointScope</code>\\n         action.</p>\\n         <p>For information about REST API errors, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html#RESTErrorResponses\\\">REST error responses</a>.</p>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#http\": {\n                    \"method\": \"PUT\",\n                    \"uri\": \"/v20180820/accesspoint/{Name}/scope\",\n                    \"code\": 200\n                },\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    },\n                    \"UseS3ExpressControlEndpoint\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#PutAccessPointScopeRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The Amazon Web Services account ID that owns the access point with scope that you want to create or replace.\\n      </p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                },\n                \"Name\": {\n                    \"target\": \"com.amazonaws.s3control#AccessPointName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the access point with the scope that you want to create or replace.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccessPointName\"\n                        }\n                    }\n                },\n                \"Scope\": {\n                    \"target\": \"com.amazonaws.s3control#Scope\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Object prefixes, API operations, or a combination of both.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#PutBucketLifecycleConfiguration\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#PutBucketLifecycleConfigurationRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>This action puts a lifecycle configuration to an Amazon S3 on Outposts bucket. To put a\\n            lifecycle configuration to an S3 bucket, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketLifecycleConfiguration.html\\\">PutBucketLifecycleConfiguration</a> in the <i>Amazon S3 API Reference</i>.\\n         </p>\\n         </note>\\n         <p>Creates a new lifecycle configuration for the S3 on Outposts bucket or replaces an\\n         existing lifecycle configuration. Outposts buckets only support lifecycle configurations\\n         that delete/expire objects after a certain period of time and abort incomplete multipart\\n         uploads.</p>\\n         <p></p>\\n         <p>All Amazon S3 on Outposts REST API requests for this action require an additional parameter of <code>x-amz-outpost-id</code> to be passed with the request. In addition, you must use an S3 on Outposts endpoint hostname prefix instead of <code>s3-control</code>. For an example of the request syntax for Amazon S3 on Outposts that uses the S3 on Outposts endpoint hostname prefix and the <code>x-amz-outpost-id</code> derived by using the access point ARN, see the <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_PutBucketLifecycleConfiguration.html#API_control_PutBucketLifecycleConfiguration_Examples\\\">Examples</a> section.</p>\\n         <p>The following actions are related to\\n         <code>PutBucketLifecycleConfiguration</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_GetBucketLifecycleConfiguration.html\\\">GetBucketLifecycleConfiguration</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_DeleteBucketLifecycleConfiguration.html\\\">DeleteBucketLifecycleConfiguration</a>\\n               </p>\\n            </li>\\n         </ul>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"PUT\",\n                    \"uri\": \"/v20180820/bucket/{Bucket}/lifecycleconfiguration\",\n                    \"code\": 200\n                },\n                \"smithy.api#httpChecksumRequired\": {},\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#PutBucketLifecycleConfigurationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID of the Outposts bucket.</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                },\n                \"Bucket\": {\n                    \"target\": \"com.amazonaws.s3control#BucketName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the bucket for which to set the configuration.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"Bucket\"\n                        }\n                    }\n                },\n                \"LifecycleConfiguration\": {\n                    \"target\": \"com.amazonaws.s3control#LifecycleConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Container for lifecycle rules. You can add as many as 1,000 rules.</p>\",\n                        \"smithy.api#httpPayload\": {},\n                        \"smithy.api#xmlName\": \"LifecycleConfiguration\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#PutBucketPolicy\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#PutBucketPolicyRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>This action puts a bucket policy to an Amazon S3 on Outposts bucket. To put a policy on an\\n            S3 bucket, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketPolicy.html\\\">PutBucketPolicy</a> in the\\n               <i>Amazon S3 API Reference</i>. </p>\\n         </note>\\n         <p>Applies an Amazon S3 bucket policy to an Outposts bucket. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html\\\">Using\\n            Amazon S3 on Outposts</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <p>If you are using an identity other than the root user of the Amazon Web Services account that owns the\\n         Outposts bucket, the calling identity must have the <code>PutBucketPolicy</code>\\n         permissions on the specified Outposts bucket and belong to the bucket owner's account in\\n         order to use this action.</p>\\n         <p>If you don't have <code>PutBucketPolicy</code> permissions, Amazon S3 returns a <code>403\\n            Access Denied</code> error. If you have the correct permissions, but you're not using an\\n         identity that belongs to the bucket owner's account, Amazon S3 returns a <code>405 Method Not\\n            Allowed</code> error.</p>\\n         <important>\\n            <p> As a security precaution, the root user of the Amazon Web Services account that owns a bucket can\\n            always use this action, even if the policy explicitly denies the root user the ability\\n            to perform this action. </p>\\n         </important>\\n         <p>For more information about bucket policies, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/using-iam-policies.html\\\">Using Bucket Policies and User\\n            Policies</a>.</p>\\n         <p>All Amazon S3 on Outposts REST API requests for this action require an additional parameter of <code>x-amz-outpost-id</code> to be passed with the request. In addition, you must use an S3 on Outposts endpoint hostname prefix instead of <code>s3-control</code>. For an example of the request syntax for Amazon S3 on Outposts that uses the S3 on Outposts endpoint hostname prefix and the <code>x-amz-outpost-id</code> derived by using the access point ARN, see the <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_PutBucketPolicy.html#API_control_PutBucketPolicy_Examples\\\">Examples</a> section.</p>\\n         <p>The following actions are related to <code>PutBucketPolicy</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_GetBucketPolicy.html\\\">GetBucketPolicy</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_DeleteBucketPolicy.html\\\">DeleteBucketPolicy</a>\\n               </p>\\n            </li>\\n         </ul>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"PUT\",\n                    \"uri\": \"/v20180820/bucket/{Bucket}/policy\",\n                    \"code\": 200\n                },\n                \"smithy.api#httpChecksumRequired\": {},\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#PutBucketPolicyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID of the Outposts bucket.</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                },\n                \"Bucket\": {\n                    \"target\": \"com.amazonaws.s3control#BucketName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the bucket.</p>\\n         <p>For using this parameter with Amazon S3 on Outposts with the REST API, you must specify the name and the x-amz-outpost-id as well.</p>\\n         <p>For using this parameter with S3 on Outposts with the Amazon Web Services SDK and CLI, you must  specify the ARN of the bucket accessed in the format <code>arn:aws:s3-outposts:<Region>:<account-id>:outpost/<outpost-id>/bucket/<my-bucket-name></code>. For example, to access the bucket <code>reports</code> through Outpost <code>my-outpost</code> owned by account <code>123456789012</code> in Region <code>us-west-2</code>, use the URL encoding of <code>arn:aws:s3-outposts:us-west-2:123456789012:outpost/my-outpost/bucket/reports</code>. The value must be URL encoded.  </p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"Bucket\"\n                        }\n                    }\n                },\n                \"ConfirmRemoveSelfBucketAccess\": {\n                    \"target\": \"com.amazonaws.s3control#ConfirmRemoveSelfBucketAccess\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Set this parameter to true to confirm that you want to remove your permissions to change\\n         this bucket policy in the future.</p>\\n         <note>\\n            <p>This is not supported by Amazon S3 on Outposts buckets.</p>\\n         </note>\",\n                        \"smithy.api#httpHeader\": \"x-amz-confirm-remove-self-bucket-access\"\n                    }\n                },\n                \"Policy\": {\n                    \"target\": \"com.amazonaws.s3control#Policy\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The bucket policy as a JSON document.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#PutBucketReplication\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#PutBucketReplicationRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>This action creates an Amazon S3 on Outposts bucket's replication configuration. To create\\n            an S3 bucket's replication configuration, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketReplication.html\\\">PutBucketReplication</a>\\n            in the <i>Amazon S3 API Reference</i>. </p>\\n         </note>\\n         <p>Creates a replication configuration or replaces an existing one. For information about\\n         S3 replication on Outposts configuration, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3OutpostsReplication.html\\\">Replicating objects for\\n            S3 on Outposts</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <note>\\n            <p>It can take a while to propagate <code>PUT</code> or <code>DELETE</code> requests for\\n            a replication configuration to all S3 on Outposts systems. Therefore, the replication\\n            configuration that's returned by a <code>GET</code> request soon after a\\n               <code>PUT</code> or <code>DELETE</code> request might return a more recent result\\n            than what's on the Outpost. If an Outpost is offline, the delay in updating the\\n            replication configuration on that Outpost can be significant.</p>\\n         </note>\\n         <p>Specify the replication configuration in the request body. In the replication\\n         configuration, you provide the following information:</p>\\n         <ul>\\n            <li>\\n               <p>The name of the destination bucket or buckets where you want S3 on Outposts to\\n               replicate objects</p>\\n            </li>\\n            <li>\\n               <p>The Identity and Access Management (IAM) role that S3 on Outposts can assume to replicate objects on\\n               your behalf</p>\\n            </li>\\n            <li>\\n               <p>Other relevant information, such as replication rules</p>\\n            </li>\\n         </ul>\\n         <p>A replication configuration must include at least one rule and can contain a maximum of\\n         100. Each rule identifies a subset of objects to replicate by filtering the objects in the\\n         source Outposts bucket. To choose additional subsets of objects to replicate, add a rule\\n         for each subset.</p>\\n         <p>To specify a subset of the objects in the source Outposts bucket to apply a replication\\n         rule to, add the <code>Filter</code> element as a child of the <code>Rule</code> element.\\n         You can filter objects based on an object key prefix, one or more object tags, or both.\\n         When you add the <code>Filter</code> element in the configuration, you must also add the\\n         following elements: <code>DeleteMarkerReplication</code>, <code>Status</code>, and\\n            <code>Priority</code>.</p>\\n         <p>Using <code>PutBucketReplication</code> on Outposts requires that both the source and\\n         destination buckets must have versioning enabled. For information about enabling versioning\\n         on a bucket, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3OutpostsManagingVersioning.html\\\">Managing S3 Versioning\\n            for your S3 on Outposts bucket</a>.</p>\\n         <p>For information about S3 on Outposts replication failure reasons, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/outposts-replication-eventbridge.html#outposts-replication-failure-codes\\\">Replication failure reasons</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <p>\\n            <b>Handling Replication of Encrypted Objects</b>\\n         </p>\\n         <p>Outposts buckets are encrypted at all times. All the objects in the source Outposts\\n         bucket are encrypted and can be replicated. Also, all the replicas in the destination\\n         Outposts bucket are encrypted with the same encryption key as the objects in the source\\n         Outposts bucket.</p>\\n         <p>\\n            <b>Permissions</b>\\n         </p>\\n         <p>To create a <code>PutBucketReplication</code> request, you must have\\n            <code>s3-outposts:PutReplicationConfiguration</code> permissions for the bucket. The\\n         Outposts bucket owner has this permission by default and can grant it to others. For more\\n         information about permissions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3OutpostsIAM.html\\\">Setting up IAM with\\n            S3 on Outposts</a> and <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3OutpostsBucketPolicy.html\\\">Managing access to\\n            S3 on Outposts buckets</a>. </p>\\n         <note>\\n            <p>To perform this operation, the user or role must also have the\\n               <code>iam:CreateRole</code> and <code>iam:PassRole</code> permissions. For more\\n            information, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_passrole.html\\\">Granting a user permissions to\\n               pass a role to an Amazon Web Services service</a>.</p>\\n         </note>\\n         <p>All Amazon S3 on Outposts REST API requests for this action require an additional parameter of <code>x-amz-outpost-id</code> to be passed with the request. In addition, you must use an S3 on Outposts endpoint hostname prefix instead of <code>s3-control</code>. For an example of the request syntax for Amazon S3 on Outposts that uses the S3 on Outposts endpoint hostname prefix and the <code>x-amz-outpost-id</code> derived by using the access point ARN, see the <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_PutBucketReplication.html#API_control_PutBucketReplication_Examples\\\">Examples</a> section.</p>\\n         <p>The following operations are related to <code>PutBucketReplication</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_GetBucketReplication.html\\\">GetBucketReplication</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_DeleteBucketReplication.html\\\">DeleteBucketReplication</a>\\n               </p>\\n            </li>\\n         </ul>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"PUT\",\n                    \"uri\": \"/v20180820/bucket/{Bucket}/replication\",\n                    \"code\": 200\n                },\n                \"smithy.api#httpChecksumRequired\": {},\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#PutBucketReplicationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID of the Outposts bucket.</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                },\n                \"Bucket\": {\n                    \"target\": \"com.amazonaws.s3control#BucketName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the S3 on Outposts bucket to set the configuration for.</p>\\n         <p>For using this parameter with Amazon S3 on Outposts with the REST API, you must specify the name and the x-amz-outpost-id as well.</p>\\n         <p>For using this parameter with S3 on Outposts with the Amazon Web Services SDK and CLI, you must  specify the ARN of the bucket accessed in the format <code>arn:aws:s3-outposts:<Region>:<account-id>:outpost/<outpost-id>/bucket/<my-bucket-name></code>. For example, to access the bucket <code>reports</code> through Outpost <code>my-outpost</code> owned by account <code>123456789012</code> in Region <code>us-west-2</code>, use the URL encoding of <code>arn:aws:s3-outposts:us-west-2:123456789012:outpost/my-outpost/bucket/reports</code>. The value must be URL encoded.  </p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"Bucket\"\n                        }\n                    }\n                },\n                \"ReplicationConfiguration\": {\n                    \"target\": \"com.amazonaws.s3control#ReplicationConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\",\n                        \"smithy.api#httpPayload\": {},\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"ReplicationConfiguration\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#PutBucketTagging\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#PutBucketTaggingRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>This action puts tags on an Amazon S3 on Outposts bucket. To put tags on an S3 bucket, see\\n               <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketTagging.html\\\">PutBucketTagging</a> in the <i>Amazon S3 API Reference</i>. </p>\\n         </note>\\n         <p>Sets the tags for an S3 on Outposts bucket. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html\\\">Using\\n            Amazon S3 on Outposts</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <p>Use tags to organize your Amazon Web Services bill to reflect your own cost structure. To do this,\\n         sign up to get your Amazon Web Services account bill with tag key values included. Then, to see the cost\\n         of combined resources, organize your billing information according to resources with the\\n         same tag key values. For example, you can tag several resources with a specific application\\n         name, and then organize your billing information to see the total cost of that application\\n         across several services. For more information, see <a href=\\\"https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/cost-alloc-tags.html\\\">Cost allocation and\\n            tagging</a>.</p>\\n         <note>\\n            <p>Within a bucket, if you add a tag that has the same key as an existing tag, the new\\n            value overwrites the old value. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/CostAllocTagging.html\\\"> Using cost allocation in Amazon S3\\n               bucket tags</a>.</p>\\n         </note>\\n         <p>To use this action, you must have permissions to perform the\\n            <code>s3-outposts:PutBucketTagging</code> action. The Outposts bucket owner has this\\n         permission by default and can grant this permission to others. For more information about\\n         permissions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-with-s3-actions.html#using-with-s3-actions-related-to-bucket-subresources\\\"> Permissions Related to Bucket Subresource Operations</a> and <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html\\\">Managing\\n            access permissions to your Amazon S3 resources</a>.</p>\\n         <p>\\n            <code>PutBucketTagging</code> has the following special errors:</p>\\n         <ul>\\n            <li>\\n               <p>Error code: <code>InvalidTagError</code>\\n               </p>\\n               <ul>\\n                  <li>\\n                     <p>Description: The tag provided was not a valid tag. This error can occur if\\n                     the tag did not pass input validation. For information about tag restrictions,\\n                     see <a href=\\\"https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/allocation-tag-restrictions.html\\\">\\n                        User-Defined Tag Restrictions</a> and <a href=\\\"https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/aws-tag-restrictions.html\\\">\\n                        Amazon Web Services-Generated Cost Allocation Tag Restrictions</a>.</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <p>Error code: <code>MalformedXMLError</code>\\n               </p>\\n               <ul>\\n                  <li>\\n                     <p>Description: The XML provided does not match the schema.</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <p>Error code: <code>OperationAbortedError </code>\\n               </p>\\n               <ul>\\n                  <li>\\n                     <p>Description: A conflicting conditional action is currently in progress\\n                     against this resource. Try again.</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <p>Error code: <code>InternalError</code>\\n               </p>\\n               <ul>\\n                  <li>\\n                     <p>Description: The service was unable to apply the provided tag to the\\n                     bucket.</p>\\n                  </li>\\n               </ul>\\n            </li>\\n         </ul>\\n         <p>All Amazon S3 on Outposts REST API requests for this action require an additional parameter of <code>x-amz-outpost-id</code> to be passed with the request. In addition, you must use an S3 on Outposts endpoint hostname prefix instead of <code>s3-control</code>. For an example of the request syntax for Amazon S3 on Outposts that uses the S3 on Outposts endpoint hostname prefix and the <code>x-amz-outpost-id</code> derived by using the access point ARN, see the <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_PutBucketTagging.html#API_control_PutBucketTagging_Examples\\\">Examples</a> section.</p>\\n         <p>The following actions are related to <code>PutBucketTagging</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_GetBucketTagging.html\\\">GetBucketTagging</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_DeleteBucketTagging.html\\\">DeleteBucketTagging</a>\\n               </p>\\n            </li>\\n         </ul>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"PUT\",\n                    \"uri\": \"/v20180820/bucket/{Bucket}/tagging\",\n                    \"code\": 200\n                },\n                \"smithy.api#httpChecksumRequired\": {},\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#PutBucketTaggingRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID of the Outposts bucket.</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                },\n                \"Bucket\": {\n                    \"target\": \"com.amazonaws.s3control#BucketName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the bucket.</p>\\n         <p>For using this parameter with Amazon S3 on Outposts with the REST API, you must specify the name and the x-amz-outpost-id as well.</p>\\n         <p>For using this parameter with S3 on Outposts with the Amazon Web Services SDK and CLI, you must  specify the ARN of the bucket accessed in the format <code>arn:aws:s3-outposts:<Region>:<account-id>:outpost/<outpost-id>/bucket/<my-bucket-name></code>. For example, to access the bucket <code>reports</code> through Outpost <code>my-outpost</code> owned by account <code>123456789012</code> in Region <code>us-west-2</code>, use the URL encoding of <code>arn:aws:s3-outposts:us-west-2:123456789012:outpost/my-outpost/bucket/reports</code>. The value must be URL encoded.  </p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"Bucket\"\n                        }\n                    }\n                },\n                \"Tagging\": {\n                    \"target\": \"com.amazonaws.s3control#Tagging\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\",\n                        \"smithy.api#httpPayload\": {},\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"Tagging\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#PutBucketVersioning\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#PutBucketVersioningRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>This operation sets the versioning state\\n            for\\n            S3 on Outposts\\n            buckets\\n            only. To set the versioning state for an S3 bucket, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketVersioning.html\\\">PutBucketVersioning</a> in the <i>Amazon S3 API Reference</i>. </p>\\n         </note>\\n         <p>Sets the versioning state for an S3 on Outposts bucket. With\\n         S3\\n         Versioning,\\n         you can save multiple distinct copies of your\\n         objects\\n         and recover from unintended user actions and application failures.</p>\\n         <p>You can set the versioning state to one of the following:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <b>Enabled</b> - Enables versioning for the objects in\\n               the bucket. All objects added to the bucket receive a unique version ID.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>Suspended</b> - Suspends versioning for the objects\\n               in the bucket. All objects added to the bucket receive the version ID\\n                  <code>null</code>.</p>\\n            </li>\\n         </ul>\\n         <p>If you've never set versioning on your bucket, it has no versioning state. In that case,\\n         a <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_GetBucketVersioning.html\\\">\\n            GetBucketVersioning</a> request does not return a versioning state value.</p>\\n         <p>When you enable S3 Versioning, for each object in your bucket, you have a current\\n         version and zero or more noncurrent versions. You can configure your bucket S3 Lifecycle\\n         rules to expire noncurrent versions after a specified time period. For more information,\\n         see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3OutpostsLifecycleManaging.html\\\"> Creating and managing\\n            a lifecycle configuration for your S3 on Outposts bucket</a> in the <i>Amazon S3\\n            User Guide</i>.</p>\\n         <p>If you have an object expiration lifecycle configuration in your non-versioned bucket\\n         and you want to maintain the same permanent delete behavior when you enable versioning, you\\n         must add a noncurrent expiration policy. The noncurrent expiration lifecycle configuration\\n         will manage the deletes of the noncurrent object versions in the version-enabled bucket.\\n         For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/Versioning.html\\\">Versioning</a> in the <i>Amazon S3\\n            User Guide</i>.</p>\\n         <p>All Amazon S3 on Outposts REST API requests for this action require an additional parameter of <code>x-amz-outpost-id</code> to be passed with the request. In addition, you must use an S3 on Outposts endpoint hostname prefix instead of <code>s3-control</code>. For an example of the request syntax for Amazon S3 on Outposts that uses the S3 on Outposts endpoint hostname prefix and the <code>x-amz-outpost-id</code> derived by using the access point ARN, see the <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_PutBucketVersioning.html#API_control_PutBucketVersioning_Examples\\\">Examples</a> section.</p>\\n         <p>The following operations are related to <code>PutBucketVersioning</code> for\\n         S3 on Outposts.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_GetBucketVersioning.html\\\">GetBucketVersioning</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_PutBucketLifecycleConfiguration.html\\\">PutBucketLifecycleConfiguration</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_GetBucketLifecycleConfiguration.html\\\">GetBucketLifecycleConfiguration</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"PUT\",\n                    \"uri\": \"/v20180820/bucket/{Bucket}/versioning\",\n                    \"code\": 200\n                },\n                \"smithy.api#httpChecksumRequired\": {},\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#PutBucketVersioningRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID of the S3 on Outposts bucket.</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                },\n                \"Bucket\": {\n                    \"target\": \"com.amazonaws.s3control#BucketName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The S3 on Outposts bucket to set the versioning state for.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"Bucket\"\n                        }\n                    }\n                },\n                \"MFA\": {\n                    \"target\": \"com.amazonaws.s3control#MFA\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The concatenation of the authentication device's serial number, a space, and the value\\n         that is displayed on your authentication device.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amz-mfa\"\n                    }\n                },\n                \"VersioningConfiguration\": {\n                    \"target\": \"com.amazonaws.s3control#VersioningConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The root-level tag for the <code>VersioningConfiguration</code> parameters.</p>\",\n                        \"smithy.api#httpPayload\": {},\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"VersioningConfiguration\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#PutJobTagging\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#PutJobTaggingRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.s3control#PutJobTaggingResult\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.s3control#InternalServiceException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#NotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#TooManyRequestsException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#TooManyTagsException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Sets the supplied tag-set on an S3 Batch Operations job.</p>\\n         <p>A tag is a key-value pair. You can associate S3 Batch Operations tags with any job by sending\\n         a PUT request against the tagging subresource that is associated with the job. To modify\\n         the existing tag set, you can either replace the existing tag set entirely, or make changes\\n         within the existing tag set by retrieving the existing tag set using <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_GetJobTagging.html\\\">GetJobTagging</a>, modify that tag set, and use this operation to replace the tag\\n         set with the one you modified. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/batch-ops-managing-jobs.html#batch-ops-job-tags\\\">Controlling\\n            access and labeling jobs using tags</a> in the <i>Amazon S3 User Guide</i>. </p>\\n         <note>\\n            <ul>\\n               <li>\\n                  <p>If you send this request with an empty tag set, Amazon S3 deletes the existing\\n                  tag set on the Batch Operations job. If you use this method, you are charged for a Tier\\n                  1 Request (PUT). For more information, see <a href=\\\"http://aws.amazon.com/s3/pricing/\\\">Amazon S3 pricing</a>.</p>\\n               </li>\\n               <li>\\n                  <p>For deleting existing tags for your Batch Operations job, a <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_DeleteJobTagging.html\\\">DeleteJobTagging</a> request is preferred because it achieves the same\\n                  result without incurring charges.</p>\\n               </li>\\n               <li>\\n                  <p>A few things to consider about using tags:</p>\\n                  <ul>\\n                     <li>\\n                        <p>Amazon S3 limits the maximum number of tags to 50 tags per job.</p>\\n                     </li>\\n                     <li>\\n                        <p>You can associate up to 50 tags with a job as long as they have unique\\n                        tag keys.</p>\\n                     </li>\\n                     <li>\\n                        <p>A tag key can be up to 128 Unicode characters in length, and tag values\\n                        can be up to 256 Unicode characters in length.</p>\\n                     </li>\\n                     <li>\\n                        <p>The key and values are case sensitive.</p>\\n                     </li>\\n                     <li>\\n                        <p>For tagging-related restrictions related to characters and encodings, see\\n                           <a href=\\\"https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/allocation-tag-restrictions.html\\\">User-Defined Tag Restrictions</a> in the <i>Billing and Cost Management User Guide</i>.</p>\\n                     </li>\\n                  </ul>\\n               </li>\\n            </ul>\\n         </note>\\n         <dl>\\n            <dt>Permissions</dt>\\n            <dd>\\n               <p>To use the <code>PutJobTagging</code> operation, you must have permission to\\n                  perform the <code>s3:PutJobTagging</code> action.</p>\\n            </dd>\\n         </dl>\\n         <p>Related actions include:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_CreateJob.html\\\">CreateJob</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_GetJobTagging.html\\\">GetJobTagging</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_DeleteJobTagging.html\\\">DeleteJobTagging</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"PUT\",\n                    \"uri\": \"/v20180820/jobs/{JobId}/tagging\",\n                    \"code\": 200\n                },\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#PutJobTaggingRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID associated with the S3 Batch Operations job.</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                },\n                \"JobId\": {\n                    \"target\": \"com.amazonaws.s3control#JobId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID for the S3 Batch Operations job whose tags you want to replace.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.s3control#S3TagSet\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The set of tags to associate with the S3 Batch Operations job.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#PutJobTaggingResult\": {\n            \"type\": \"structure\",\n            \"members\": {},\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.s3control#PutMultiRegionAccessPointPolicy\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#PutMultiRegionAccessPointPolicyRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.s3control#PutMultiRegionAccessPointPolicyResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported by directory buckets.</p>\\n         </note>\\n         <p>Associates an access control policy with the specified Multi-Region Access Point. Each Multi-Region Access Point can have only\\n         one policy, so a request made to this action replaces any existing policy that is\\n         associated with the specified Multi-Region Access Point.</p>\\n         <p>This action will always be routed to the US West (Oregon) Region. For more information\\n         about the restrictions around working with Multi-Region Access Points, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/MultiRegionAccessPointRestrictions.html\\\">Multi-Region Access Point\\n            restrictions and limitations</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <p>The following actions are related to\\n         <code>PutMultiRegionAccessPointPolicy</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_GetMultiRegionAccessPointPolicy.html\\\">GetMultiRegionAccessPointPolicy</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_GetMultiRegionAccessPointPolicyStatus.html\\\">GetMultiRegionAccessPointPolicyStatus</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"POST\",\n                    \"uri\": \"/v20180820/async-requests/mrap/put-policy\",\n                    \"code\": 200\n                },\n                \"smithy.api#httpChecksumRequired\": {},\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#PutMultiRegionAccessPointPolicyInput\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Name\": {\n                    \"target\": \"com.amazonaws.s3control#MultiRegionAccessPointName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the Multi-Region Access Point associated with the request.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Policy\": {\n                    \"target\": \"com.amazonaws.s3control#Policy\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The policy details for the <code>PutMultiRegionAccessPoint</code> request.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A container for the information associated with a <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_PutMultiRegionAccessPoint.html\\\">PutMultiRegionAccessPoint</a> request.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#PutMultiRegionAccessPointPolicyRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID for the owner of the Multi-Region Access Point.</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.s3control#MultiRegionAccessPointClientToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An idempotency token used to identify the request and guarantee that requests are\\n         unique.</p>\",\n                        \"smithy.api#idempotencyToken\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Details\": {\n                    \"target\": \"com.amazonaws.s3control#PutMultiRegionAccessPointPolicyInput\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A container element containing the details of the policy for the Multi-Region Access Point.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#PutMultiRegionAccessPointPolicyResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RequestTokenARN\": {\n                    \"target\": \"com.amazonaws.s3control#AsyncRequestTokenARN\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The request token associated with the request. You can use this token with <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_DescribeMultiRegionAccessPointOperation.html\\\">DescribeMultiRegionAccessPointOperation</a> to determine the status of asynchronous\\n         requests.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.s3control#PutPublicAccessBlock\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#PutPublicAccessBlockRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported by directory buckets.</p>\\n         </note>\\n         <p>Creates or modifies the <code>PublicAccessBlock</code> configuration for an\\n         Amazon Web Services account. For this operation, users must have the\\n            <code>s3:PutAccountPublicAccessBlock</code> permission. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/access-control-block-public-access.html\\\">\\n            Using Amazon S3 block public access</a>.</p>\\n         <p>Related actions include:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_GetPublicAccessBlock.html\\\">GetPublicAccessBlock</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_DeletePublicAccessBlock.html\\\">DeletePublicAccessBlock</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"PUT\",\n                    \"uri\": \"/v20180820/configuration/publicAccessBlock\",\n                    \"code\": 200\n                },\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#PutPublicAccessBlockRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PublicAccessBlockConfiguration\": {\n                    \"target\": \"com.amazonaws.s3control#PublicAccessBlockConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>PublicAccessBlock</code> configuration that you want to apply to the specified\\n         Amazon Web Services account.</p>\",\n                        \"smithy.api#httpPayload\": {},\n                        \"smithy.api#required\": {},\n                        \"smithy.api#xmlName\": \"PublicAccessBlockConfiguration\"\n                    }\n                },\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The account ID for the Amazon Web Services account whose <code>PublicAccessBlock</code> configuration\\n         you want to set.</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#PutStorageLensConfiguration\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#PutStorageLensConfigurationRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported by directory buckets.</p>\\n         </note>\\n         <p>Puts an Amazon S3 Storage Lens configuration. For more information about S3 Storage Lens, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/storage_lens.html\\\">Working with\\n            Amazon S3 Storage Lens</a> in the <i>Amazon S3 User Guide</i>. For a complete list of S3 Storage Lens metrics, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage_lens_metrics_glossary.html\\\">S3 Storage Lens metrics glossary</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <note>\\n            <p>To use this action, you must have permission to perform the\\n               <code>s3:PutStorageLensConfiguration</code> action. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/storage_lens_iam_permissions.html\\\">Setting permissions to use Amazon S3 Storage Lens</a> in the\\n               <i>Amazon S3 User Guide</i>.</p>\\n         </note>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"PUT\",\n                    \"uri\": \"/v20180820/storagelens/{ConfigId}\",\n                    \"code\": 200\n                },\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#PutStorageLensConfigurationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConfigId\": {\n                    \"target\": \"com.amazonaws.s3control#ConfigId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the S3 Storage Lens configuration.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The account ID of the requester.</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                },\n                \"StorageLensConfiguration\": {\n                    \"target\": \"com.amazonaws.s3control#StorageLensConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The S3 Storage Lens configuration.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.s3control#StorageLensTags\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tag set of the S3 Storage Lens configuration.</p>\\n         <note>\\n            <p>You can set up to a maximum of 50 tags.</p>\\n         </note>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#PutStorageLensConfigurationTagging\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#PutStorageLensConfigurationTaggingRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.s3control#PutStorageLensConfigurationTaggingResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported by directory buckets.</p>\\n         </note>\\n         <p>Put or replace tags on an existing Amazon S3 Storage Lens configuration. For more information\\n         about S3 Storage Lens, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/storage_lens.html\\\">Assessing your storage activity and usage with Amazon S3 Storage Lens </a> in the\\n            <i>Amazon S3 User Guide</i>.</p>\\n         <note>\\n            <p>To use this action, you must have permission to perform the\\n               <code>s3:PutStorageLensConfigurationTagging</code> action. For more information, see\\n               <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/storage_lens_iam_permissions.html\\\">Setting permissions to\\n               use Amazon S3 Storage Lens</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         </note>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"PUT\",\n                    \"uri\": \"/v20180820/storagelens/{ConfigId}/tagging\",\n                    \"code\": 200\n                },\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#PutStorageLensConfigurationTaggingRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ConfigId\": {\n                    \"target\": \"com.amazonaws.s3control#ConfigId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the S3 Storage Lens configuration.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The account ID of the requester.</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.s3control#StorageLensTags\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tag set of the S3 Storage Lens configuration.</p>\\n         <note>\\n            <p>You can set up to a maximum of 50 tags.</p>\\n         </note>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#PutStorageLensConfigurationTaggingResult\": {\n            \"type\": \"structure\",\n            \"members\": {},\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.s3control#Region\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Bucket\": {\n                    \"target\": \"com.amazonaws.s3control#BucketName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the associated bucket for the Region.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"BucketAccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID that owns the Amazon S3 bucket that's associated with this\\n         Multi-Region Access Point.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A Region that supports a Multi-Region Access Point as well as the associated bucket for the Region.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#RegionCreationList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.s3control#Region\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"Region\"\n                }\n            }\n        },\n        \"com.amazonaws.s3control#RegionName\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 64\n                }\n            }\n        },\n        \"com.amazonaws.s3control#RegionReport\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Bucket\": {\n                    \"target\": \"com.amazonaws.s3control#BucketName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the bucket.</p>\"\n                    }\n                },\n                \"Region\": {\n                    \"target\": \"com.amazonaws.s3control#RegionName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the Region.</p>\"\n                    }\n                },\n                \"BucketAccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID that owns the Amazon S3 bucket that's associated with this\\n         Multi-Region Access Point.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A combination of a bucket and Region that's part of a Multi-Region Access Point.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#RegionReportList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.s3control#RegionReport\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"Region\"\n                }\n            }\n        },\n        \"com.amazonaws.s3control#RegionalBucket\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Bucket\": {\n                    \"target\": \"com.amazonaws.s3control#BucketName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"BucketArn\": {\n                    \"target\": \"com.amazonaws.s3control#S3RegionalBucketArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) for the regional bucket.</p>\"\n                    }\n                },\n                \"PublicAccessBlockEnabled\": {\n                    \"target\": \"com.amazonaws.s3control#PublicAccessBlockEnabled\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p></p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"CreationDate\": {\n                    \"target\": \"com.amazonaws.s3control#CreationDate\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The creation date of the regional bucket</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"OutpostId\": {\n                    \"target\": \"com.amazonaws.s3control#NonEmptyMaxLength64String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Outposts ID of the regional bucket.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The container for the regional bucket.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#RegionalBucketList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.s3control#RegionalBucket\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"RegionalBucket\"\n                }\n            }\n        },\n        \"com.amazonaws.s3control#Regions\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.s3control#S3AWSRegion\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"Region\"\n                }\n            }\n        },\n        \"com.amazonaws.s3control#ReplicaKmsKeyID\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.s3control#ReplicaModifications\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Status\": {\n                    \"target\": \"com.amazonaws.s3control#ReplicaModificationsStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies whether S3 on Outposts replicates modifications to object metadata on\\n         replicas.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A filter that you can use to specify whether replica modification sync is enabled.\\n         S3 on Outposts replica modification sync can help you keep object metadata synchronized\\n         between replicas and source objects. By default, S3 on Outposts replicates metadata from the\\n         source objects to the replicas only. When replica modification sync is enabled,\\n         S3 on Outposts replicates metadata changes made to the replica copies back to the source\\n         object, making the replication bidirectional.</p>\\n         <p>To replicate object metadata modifications on replicas, you can specify this element and\\n         set the <code>Status</code> of this element to <code>Enabled</code>.</p>\\n         <note>\\n            <p>You must enable replica modification sync on the source and destination buckets to\\n            replicate replica metadata changes between the source and the replicas.</p>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.s3control#ReplicaModificationsStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"Enabled\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Enabled\"\n                    }\n                },\n                \"Disabled\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Disabled\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#ReplicationConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Role\": {\n                    \"target\": \"com.amazonaws.s3control#Role\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the Identity and Access Management (IAM) role that S3 on Outposts assumes\\n         when replicating objects. For information about S3 replication on Outposts configuration,\\n         see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/outposts-replication-how-setup.html\\\">Setting up\\n            replication</a> in the <i>Amazon S3 User Guide</i>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Rules\": {\n                    \"target\": \"com.amazonaws.s3control#ReplicationRules\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A container for one or more replication rules. A replication configuration must have at\\n         least one rule and can contain an array of 100 rules at the most. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A container for one or more replication rules. A replication configuration must have at\\n         least one rule and you can add up to 100 rules. The maximum size of a replication\\n         configuration is 128 KB.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#ReplicationRule\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ID\": {\n                    \"target\": \"com.amazonaws.s3control#ID\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A unique identifier for the rule. The maximum value is 255 characters.</p>\"\n                    }\n                },\n                \"Priority\": {\n                    \"target\": \"com.amazonaws.s3control#Priority\",\n                    \"traits\": {\n                        \"smithy.api#default\": null,\n                        \"smithy.api#documentation\": \"<p>The priority indicates which rule has precedence whenever two or more replication rules\\n         conflict. S3 on Outposts attempts to replicate objects according to all replication rules.\\n         However, if there are two or more rules with the same destination Outposts bucket, then\\n         objects will be replicated according to the rule with the highest priority. The higher the\\n         number, the higher the priority. </p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/replication-between-outposts.html\\\">Creating replication\\n            rules on Outposts</a> in the <i>Amazon S3 User Guide</i>.</p>\"\n                    }\n                },\n                \"Prefix\": {\n                    \"target\": \"com.amazonaws.s3control#Prefix\",\n                    \"traits\": {\n                        \"smithy.api#deprecated\": {\n                            \"message\": \"Prefix has been deprecated\"\n                        },\n                        \"smithy.api#documentation\": \"<p>An object key name prefix that identifies the object or objects to which the rule\\n         applies. The maximum prefix length is 1,024 characters. To include all objects in an\\n         Outposts bucket, specify an empty string.</p>\\n         <important>\\n            <p>When you're using XML requests, you must \\nreplace special characters (such as carriage returns) in object keys with their equivalent XML entity codes. \\nFor more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-keys.html#object-key-xml-related-constraints\\\">\\n            XML-related object key constraints</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         </important>\"\n                    }\n                },\n                \"Filter\": {\n                    \"target\": \"com.amazonaws.s3control#ReplicationRuleFilter\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A filter that identifies the subset of objects to which the replication rule applies. A\\n            <code>Filter</code> element must specify exactly one <code>Prefix</code>,\\n            <code>Tag</code>, or <code>And</code> child element.</p>\"\n                    }\n                },\n                \"Status\": {\n                    \"target\": \"com.amazonaws.s3control#ReplicationRuleStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies whether the rule is enabled.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"SourceSelectionCriteria\": {\n                    \"target\": \"com.amazonaws.s3control#SourceSelectionCriteria\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A container that describes additional filters for identifying the source Outposts\\n         objects that you want to replicate. You can choose to enable or disable the replication of\\n         these objects.</p>\"\n                    }\n                },\n                \"ExistingObjectReplication\": {\n                    \"target\": \"com.amazonaws.s3control#ExistingObjectReplication\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An optional configuration to replicate existing source bucket objects. </p>\\n         <note>\\n            <p>This is not supported by Amazon S3 on Outposts buckets.</p>\\n         </note>\"\n                    }\n                },\n                \"Destination\": {\n                    \"target\": \"com.amazonaws.s3control#Destination\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A container for information about the replication destination and its\\n         configurations.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DeleteMarkerReplication\": {\n                    \"target\": \"com.amazonaws.s3control#DeleteMarkerReplication\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies whether S3 on Outposts replicates delete markers. If you specify a\\n            <code>Filter</code> element in your replication configuration, you must also include a\\n            <code>DeleteMarkerReplication</code> element. If your <code>Filter</code> includes a\\n            <code>Tag</code> element, the <code>DeleteMarkerReplication</code> element's\\n            <code>Status</code> child element must be set to <code>Disabled</code>, because\\n         S3 on Outposts doesn't support replicating delete markers for tag-based rules.</p>\\n         <p>For more information about delete marker replication, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3OutpostsReplication.html#outposts-replication-what-is-replicated\\\">How delete operations affect replication</a> in the\\n            <i>Amazon S3 User Guide</i>. </p>\"\n                    }\n                },\n                \"Bucket\": {\n                    \"target\": \"com.amazonaws.s3control#BucketIdentifierString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the access point for the source Outposts bucket that you want\\n         S3 on Outposts to replicate the objects from.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Specifies which S3 on Outposts objects to replicate and where to store the\\n         replicas.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#ReplicationRuleAndOperator\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Prefix\": {\n                    \"target\": \"com.amazonaws.s3control#Prefix\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An object key name prefix that identifies the subset of objects that the rule applies\\n         to.</p>\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.s3control#S3TagSet\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An array of tags that contain key and value pairs.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A container for specifying rule filters. The filters determine the subset of objects to\\n         which the rule applies. This element is required only if you specify more than one filter. </p>\\n         <p>For example:</p>\\n         <ul>\\n            <li>\\n               <p>If you specify both a <code>Prefix</code> and a <code>Tag</code> filter, wrap\\n               these filters in an <code>And</code> element. </p>\\n            </li>\\n            <li>\\n               <p>If you specify a filter based on multiple tags, wrap the <code>Tag</code> elements\\n               in an <code>And</code> element.</p>\\n            </li>\\n         </ul>\"\n            }\n        },\n        \"com.amazonaws.s3control#ReplicationRuleFilter\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Prefix\": {\n                    \"target\": \"com.amazonaws.s3control#Prefix\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An object key name prefix that identifies the subset of objects that the rule applies\\n         to.</p>\\n         <important>\\n            <p>When you're using XML requests, you must \\nreplace special characters (such as carriage returns) in object keys with their equivalent XML entity codes. \\nFor more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-keys.html#object-key-xml-related-constraints\\\">\\n            XML-related object key constraints</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         </important>\"\n                    }\n                },\n                \"Tag\": {\n                    \"target\": \"com.amazonaws.s3control#S3Tag\"\n                },\n                \"And\": {\n                    \"target\": \"com.amazonaws.s3control#ReplicationRuleAndOperator\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A container for specifying rule filters. The filters determine the subset of objects\\n         that the rule applies to. This element is required only if you specify more than one\\n         filter. For example: </p>\\n         <ul>\\n            <li>\\n               <p>If you specify both a <code>Prefix</code> and a <code>Tag</code> filter, wrap\\n               these filters in an <code>And</code> element.</p>\\n            </li>\\n            <li>\\n               <p>If you specify a filter based on multiple tags, wrap the <code>Tag</code> elements\\n               in an <code>And</code> element.</p>\\n            </li>\\n         </ul>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A filter that identifies the subset of objects to which the replication rule applies. A\\n            <code>Filter</code> element must specify exactly one <code>Prefix</code>,\\n            <code>Tag</code>, or <code>And</code> child element.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#ReplicationRuleStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"Enabled\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Enabled\"\n                    }\n                },\n                \"Disabled\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Disabled\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#ReplicationRules\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.s3control#ReplicationRule\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"Rule\"\n                }\n            }\n        },\n        \"com.amazonaws.s3control#ReplicationStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"COMPLETED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"COMPLETED\"\n                    }\n                },\n                \"FAILED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"FAILED\"\n                    }\n                },\n                \"REPLICA\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"REPLICA\"\n                    }\n                },\n                \"NONE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"NONE\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#ReplicationStatusFilterList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.s3control#ReplicationStatus\"\n            }\n        },\n        \"com.amazonaws.s3control#ReplicationStorageClass\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"STANDARD\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"STANDARD\"\n                    }\n                },\n                \"REDUCED_REDUNDANCY\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"REDUCED_REDUNDANCY\"\n                    }\n                },\n                \"STANDARD_IA\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"STANDARD_IA\"\n                    }\n                },\n                \"ONEZONE_IA\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ONEZONE_IA\"\n                    }\n                },\n                \"INTELLIGENT_TIERING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"INTELLIGENT_TIERING\"\n                    }\n                },\n                \"GLACIER\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"GLACIER\"\n                    }\n                },\n                \"DEEP_ARCHIVE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DEEP_ARCHIVE\"\n                    }\n                },\n                \"OUTPOSTS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"OUTPOSTS\"\n                    }\n                },\n                \"GLACIER_IR\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"GLACIER_IR\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#ReplicationTime\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Status\": {\n                    \"target\": \"com.amazonaws.s3control#ReplicationTimeStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies whether S3 Replication Time Control (S3 RTC) is enabled. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Time\": {\n                    \"target\": \"com.amazonaws.s3control#ReplicationTimeValue\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A container that specifies the time by which replication should be complete for all\\n         objects and operations on objects. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A container that specifies S3 Replication Time Control (S3 RTC) related information, including whether S3 RTC\\n         is enabled and the time when all objects and operations on objects must be\\n         replicated.</p>\\n         <note>\\n            <p>This is not supported by Amazon S3 on Outposts buckets.</p>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.s3control#ReplicationTimeStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"Enabled\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Enabled\"\n                    }\n                },\n                \"Disabled\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Disabled\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#ReplicationTimeValue\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Minutes\": {\n                    \"target\": \"com.amazonaws.s3control#Minutes\",\n                    \"traits\": {\n                        \"smithy.api#default\": null,\n                        \"smithy.api#documentation\": \"<p>Contains an integer that specifies the time period in minutes. </p>\\n         <p>Valid value: 15</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A container that specifies the time value for S3 Replication Time Control (S3 RTC). This value is also used for\\n         the replication metrics <code>EventThreshold</code> element. </p>\\n         <note>\\n            <p>This is not supported by Amazon S3 on Outposts buckets.</p>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.s3control#ReportPrefixString\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 512\n                }\n            }\n        },\n        \"com.amazonaws.s3control#RequestedJobStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"Cancelled\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Cancelled\"\n                    }\n                },\n                \"Ready\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Ready\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#Role\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.s3control#RouteList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.s3control#MultiRegionAccessPointRoute\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"Route\"\n                }\n            }\n        },\n        \"com.amazonaws.s3control#S3AWSRegion\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 5,\n                    \"max\": 30\n                },\n                \"smithy.api#pattern\": \"^[a-z0-9\\\\-]+$\"\n            }\n        },\n        \"com.amazonaws.s3control#S3AccessControlList\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Owner\": {\n                    \"target\": \"com.amazonaws.s3control#S3ObjectOwner\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Grants\": {\n                    \"target\": \"com.amazonaws.s3control#S3GrantList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p></p>\"\n            }\n        },\n        \"com.amazonaws.s3control#S3AccessControlPolicy\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccessControlList\": {\n                    \"target\": \"com.amazonaws.s3control#S3AccessControlList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                },\n                \"CannedAccessControlList\": {\n                    \"target\": \"com.amazonaws.s3control#S3CannedAccessControlList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p></p>\"\n            }\n        },\n        \"com.amazonaws.s3control#S3AccessPointArn\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 4,\n                    \"max\": 128\n                }\n            }\n        },\n        \"com.amazonaws.s3control#S3BucketArnString\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 128\n                },\n                \"smithy.api#pattern\": \"^arn:[^:]+:s3:\"\n            }\n        },\n        \"com.amazonaws.s3control#S3BucketDestination\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Format\": {\n                    \"target\": \"com.amazonaws.s3control#Format\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"OutputSchemaVersion\": {\n                    \"target\": \"com.amazonaws.s3control#OutputSchemaVersion\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The schema version of the export file.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The account ID of the owner of the S3 Storage Lens metrics export bucket.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Arn\": {\n                    \"target\": \"com.amazonaws.s3control#S3BucketArnString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the bucket. This property is read-only and follows the\\n         following format: <code>\\n               arn:aws:s3:<i>us-east-1</i>:<i>example-account-id</i>:bucket/<i>your-destination-bucket-name</i>\\n            </code>\\n         </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Prefix\": {\n                    \"target\": \"com.amazonaws.s3control#Prefix\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The prefix of the destination bucket where the metrics export will be delivered.</p>\"\n                    }\n                },\n                \"Encryption\": {\n                    \"target\": \"com.amazonaws.s3control#StorageLensDataExportEncryption\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The container for the type encryption of the metrics exports in this bucket.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A container for the bucket where the Amazon S3 Storage Lens metrics export files are\\n         located.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#S3CannedAccessControlList\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"PRIVATE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"private\"\n                    }\n                },\n                \"PUBLIC_READ\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"public-read\"\n                    }\n                },\n                \"PUBLIC_READ_WRITE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"public-read-write\"\n                    }\n                },\n                \"AWS_EXEC_READ\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"aws-exec-read\"\n                    }\n                },\n                \"AUTHENTICATED_READ\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"authenticated-read\"\n                    }\n                },\n                \"BUCKET_OWNER_READ\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"bucket-owner-read\"\n                    }\n                },\n                \"BUCKET_OWNER_FULL_CONTROL\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"bucket-owner-full-control\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#S3ChecksumAlgorithm\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"CRC32\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"CRC32\"\n                    }\n                },\n                \"CRC32C\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"CRC32C\"\n                    }\n                },\n                \"SHA1\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"SHA1\"\n                    }\n                },\n                \"SHA256\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"SHA256\"\n                    }\n                },\n                \"CRC64NVME\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"CRC64NVME\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#S3ComputeObjectChecksumOperation\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ChecksumAlgorithm\": {\n                    \"target\": \"com.amazonaws.s3control#ComputeObjectChecksumAlgorithm\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates the algorithm that you want Amazon S3 to use to create the checksum. For more\\n         information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking object\\n            integrity</a> in the <i>Amazon S3 User Guide</i>.</p>\"\n                    }\n                },\n                \"ChecksumType\": {\n                    \"target\": \"com.amazonaws.s3control#ComputeObjectChecksumType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates the checksum type that you want Amazon S3 to use to calculate the object’s checksum\\n         value. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking object\\n            integrity</a> in the <i>Amazon S3 User Guide</i>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Directs the specified job to invoke the <code>ComputeObjectChecksum</code> operation on every object listed in the job's manifest.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#S3ContentLength\": {\n            \"type\": \"long\",\n            \"traits\": {\n                \"smithy.api#default\": 0,\n                \"smithy.api#range\": {\n                    \"min\": 0\n                }\n            }\n        },\n        \"com.amazonaws.s3control#S3CopyObjectOperation\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TargetResource\": {\n                    \"target\": \"com.amazonaws.s3control#S3RegionalOrS3ExpressBucketArnString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the destination bucket\\n         Amazon Resource Name\\n         (ARN)\\n         for the batch copy operation.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <b>General purpose buckets</b> - For example, to copy\\n               objects to a general purpose bucket named <code>destinationBucket</code>, set the\\n                  <code>TargetResource</code> property to\\n                  <code>arn:aws:s3:::destinationBucket</code>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>Directory buckets</b> - For example, to copy\\n               objects to a directory bucket named <code>destinationBucket</code> in the Availability Zone\\n               identified by the AZ ID <code>usw2-az1</code>, set the <code>TargetResource</code>\\n               property to\\n                     <code>arn:aws:s3express:<i>region</i>:<i>account_id</i>:/bucket/<i>destination_bucket_base_name</i>--<i>usw2-az1</i>--x-s3</code>.\\n               A directory bucket as a destination bucket can be in Availability Zone or Local Zone. </p>\\n               <note>\\n                  <p>Copying objects across different Amazon Web Services Regions isn't supported when the source\\n                  or destination bucket is in Amazon Web Services Local Zones. The source and destination buckets must\\n                  have the same parent Amazon Web Services Region. Otherwise, you get an HTTP <code>400 Bad\\n                     Request</code> error with the error code <code>InvalidRequest</code>.</p>\\n               </note>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"CannedAccessControlList\": {\n                    \"target\": \"com.amazonaws.s3control#S3CannedAccessControlList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\\n         <note>\\n            <p>This functionality is not supported by directory buckets.</p>\\n         </note>\"\n                    }\n                },\n                \"AccessControlGrants\": {\n                    \"target\": \"com.amazonaws.s3control#S3GrantList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\\n         <note>\\n            <p>This functionality is not supported by directory buckets.</p>\\n         </note>\"\n                    }\n                },\n                \"MetadataDirective\": {\n                    \"target\": \"com.amazonaws.s3control#S3MetadataDirective\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                },\n                \"ModifiedSinceConstraint\": {\n                    \"target\": \"com.amazonaws.s3control#TimeStamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                },\n                \"NewObjectMetadata\": {\n                    \"target\": \"com.amazonaws.s3control#S3ObjectMetadata\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If you don't provide this parameter, Amazon S3 copies all the metadata from the original\\n         objects. If you specify an empty set, the new objects will have no tags. Otherwise, Amazon S3\\n         assigns the supplied tags to the new objects.</p>\"\n                    }\n                },\n                \"NewObjectTagging\": {\n                    \"target\": \"com.amazonaws.s3control#S3TagSet\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies a list of tags to add to the destination objects after they are copied. If\\n            <code>NewObjectTagging</code> is not specified, the tags of the source objects are\\n         copied to destination objects by default.</p>\\n         <note>\\n            <p>\\n               <b>Directory buckets</b> - Tags aren't supported by\\n            directory buckets. If your source objects have tags and your destination bucket is a\\n            directory bucket, specify an empty tag set in the <code>NewObjectTagging</code> field\\n            to prevent copying the source object tags to the directory bucket.</p>\\n         </note>\"\n                    }\n                },\n                \"RedirectLocation\": {\n                    \"target\": \"com.amazonaws.s3control#NonEmptyMaxLength2048String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If the destination bucket is configured as a website, specifies an optional metadata\\n         property for website redirects, <code>x-amz-website-redirect-location</code>. Allows\\n         webpage redirects if the object copy is accessed through a website endpoint.</p>\\n         <note>\\n            <p>This functionality is not supported by directory buckets.</p>\\n         </note>\"\n                    }\n                },\n                \"RequesterPays\": {\n                    \"target\": \"com.amazonaws.s3control#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p></p>\\n         <note>\\n            <p>This functionality is not supported by directory buckets.</p>\\n         </note>\"\n                    }\n                },\n                \"StorageClass\": {\n                    \"target\": \"com.amazonaws.s3control#S3StorageClass\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify the storage class for the destination objects in a <code>Copy</code>\\n         operation.</p>\\n         <note>\\n            <p>\\n               <b>Directory buckets </b> -\\n            This functionality is not supported by directory buckets. </p>\\n         </note>\"\n                    }\n                },\n                \"UnModifiedSinceConstraint\": {\n                    \"target\": \"com.amazonaws.s3control#TimeStamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                },\n                \"SSEAwsKmsKeyId\": {\n                    \"target\": \"com.amazonaws.s3control#KmsKeyArnString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the KMS key ID (Key ID, Key ARN, or Key Alias) to use for object encryption. If the KMS key doesn't exist in the same\\n         account that's issuing the command, you must use the full Key ARN not the Key ID.</p>\\n         <note>\\n            <p>\\n               <b>Directory buckets</b> - If you specify <code>SSEAlgorithm</code> with <code>KMS</code>, you must specify the <code>\\n         SSEAwsKmsKeyId</code> parameter with the ID (Key ID or Key ARN) of the KMS \\n         symmetric encryption customer managed key to use. Otherwise, you get an HTTP <code>400 Bad Request</code> error. The key alias format of the KMS key isn't supported. To encrypt new object copies in a directory bucket with SSE-KMS, you must specify SSE-KMS as the directory bucket's default encryption configuration with a KMS key (specifically, a <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk\\\">customer managed key</a>). \\n                        The <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk\\\">Amazon Web Services managed key</a> (<code>aws/s3</code>) isn't supported. Your SSE-KMS configuration can only support 1 <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk\\\">customer managed key</a> per directory bucket for the lifetime of the bucket. \\nAfter you specify a customer managed key for SSE-KMS as the bucket default encryption, you can't override the customer managed key for the bucket's SSE-KMS configuration. \\nThen, when you specify server-side encryption settings for new object copies with SSE-KMS, you must make sure the encryption key is the same customer managed key that you specified for the directory bucket's default encryption configuration.                   \\n </p>\\n         </note>\"\n                    }\n                },\n                \"TargetKeyPrefix\": {\n                    \"target\": \"com.amazonaws.s3control#NonEmptyMaxLength1024String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the folder prefix\\n         that\\n         you\\n         want\\n         the objects to be\\n         copied\\n         into. For example, to copy objects into a folder named\\n            <code>Folder1</code> in the destination bucket, set the\\n            <code>TargetKeyPrefix</code>\\n         property\\n         to <code>Folder1</code>.</p>\"\n                    }\n                },\n                \"ObjectLockLegalHoldStatus\": {\n                    \"target\": \"com.amazonaws.s3control#S3ObjectLockLegalHoldStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The legal hold status to be applied to all objects in the Batch Operations job.</p>\\n         <note>\\n            <p>This functionality is not supported by directory buckets.</p>\\n         </note>\"\n                    }\n                },\n                \"ObjectLockMode\": {\n                    \"target\": \"com.amazonaws.s3control#S3ObjectLockMode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The retention mode to be applied to all objects in the Batch Operations job.</p>\\n         <note>\\n            <p>This functionality is not supported by directory buckets.</p>\\n         </note>\"\n                    }\n                },\n                \"ObjectLockRetainUntilDate\": {\n                    \"target\": \"com.amazonaws.s3control#TimeStamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date when the applied object retention configuration expires on all objects in the\\n         Batch Operations job.</p>\\n         <note>\\n            <p>This functionality is not supported by directory buckets.</p>\\n         </note>\"\n                    }\n                },\n                \"BucketKeyEnabled\": {\n                    \"target\": \"com.amazonaws.s3control#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Specifies whether Amazon S3 should use an S3 Bucket Key for object encryption with\\n         server-side encryption using Amazon Web Services KMS (SSE-KMS). Setting this header to <code>true</code>\\n         causes Amazon S3 to use an S3 Bucket Key for object encryption with SSE-KMS.</p>\\n         <p>Specifying this header with an <i>Copy</i> action doesn’t affect\\n            <i>bucket-level</i> settings for S3 Bucket Key.</p>\\n         <note>\\n            <p>\\n               <b>Directory buckets</b> - S3 Bucket Keys aren't supported, when you copy SSE-KMS encrypted objects from general purpose buckets  \\nto directory buckets, from directory buckets to general purpose buckets, or between directory buckets, through <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-buckets-objects-Batch-Ops\\\">the Copy operation in Batch Operations</a>. In this case, Amazon S3 makes a call to KMS every time a copy request is made for a KMS-encrypted object.</p>\\n         </note>\"\n                    }\n                },\n                \"ChecksumAlgorithm\": {\n                    \"target\": \"com.amazonaws.s3control#S3ChecksumAlgorithm\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates the algorithm\\n         that\\n         you want Amazon S3 to use to create the checksum. For more\\n         information,\\n         see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\"> Checking object\\n            integrity</a> in the <i>Amazon S3 User Guide</i>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains\\n         the configuration parameters for a PUT Copy object operation. S3 Batch Operations passes every\\n         object to the underlying\\n            <code>CopyObject</code>\\n         API\\n         operation. For more information about the parameters for this operation,\\n         see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectCOPY.html\\\">CopyObject</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#S3DeleteObjectTaggingOperation\": {\n            \"type\": \"structure\",\n            \"members\": {},\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains no configuration parameters because the DELETE Object tagging\\n            (<code>DeleteObjectTagging</code>)\\n         API\\n         operation\\n         accepts\\n         only\\n         the bucket name and key name as parameters, which are defined in the\\n         job's manifest.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#S3ExpirationInDays\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#default\": 0,\n                \"smithy.api#range\": {\n                    \"min\": 0\n                }\n            }\n        },\n        \"com.amazonaws.s3control#S3GeneratedManifestDescriptor\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Format\": {\n                    \"target\": \"com.amazonaws.s3control#GeneratedManifestFormat\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The format of the generated manifest.</p>\"\n                    }\n                },\n                \"Location\": {\n                    \"target\": \"com.amazonaws.s3control#JobManifestLocation\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the specified job's generated manifest. Batch Operations jobs created with a\\n         ManifestGenerator populate details of this descriptor after execution of the\\n         ManifestGenerator.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#S3GlacierJobTier\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"BULK\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"BULK\"\n                    }\n                },\n                \"STANDARD\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"STANDARD\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#S3Grant\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Grantee\": {\n                    \"target\": \"com.amazonaws.s3control#S3Grantee\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                },\n                \"Permission\": {\n                    \"target\": \"com.amazonaws.s3control#S3Permission\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p></p>\"\n            }\n        },\n        \"com.amazonaws.s3control#S3GrantList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.s3control#S3Grant\"\n            }\n        },\n        \"com.amazonaws.s3control#S3Grantee\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TypeIdentifier\": {\n                    \"target\": \"com.amazonaws.s3control#S3GranteeTypeIdentifier\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                },\n                \"Identifier\": {\n                    \"target\": \"com.amazonaws.s3control#NonEmptyMaxLength1024String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                },\n                \"DisplayName\": {\n                    \"target\": \"com.amazonaws.s3control#NonEmptyMaxLength1024String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p></p>\"\n            }\n        },\n        \"com.amazonaws.s3control#S3GranteeTypeIdentifier\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"CANONICAL\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"id\"\n                    }\n                },\n                \"EMAIL_ADDRESS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"emailAddress\"\n                    }\n                },\n                \"GROUP\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"uri\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#S3InitiateRestoreObjectOperation\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ExpirationInDays\": {\n                    \"target\": \"com.amazonaws.s3control#S3ExpirationInDays\",\n                    \"traits\": {\n                        \"smithy.api#default\": null,\n                        \"smithy.api#documentation\": \"<p>This argument specifies how long the S3 Glacier or S3 Glacier Deep Archive object remains\\n         available in Amazon S3. S3 Initiate Restore Object jobs that target S3 Glacier and S3 Glacier Deep Archive\\n         objects require <code>ExpirationInDays</code> set to 1 or greater.</p>\\n         <p>Conversely, do <i>not</i> set <code>ExpirationInDays</code> when creating\\n         S3 Initiate Restore Object jobs that target S3 Intelligent-Tiering Archive Access and\\n         Deep Archive Access tier objects. Objects in S3 Intelligent-Tiering archive access tiers are\\n         not subject to restore expiry, so specifying <code>ExpirationInDays</code> results in\\n         restore request failure.</p>\\n         <p>S3 Batch Operations jobs can operate either on S3 Glacier and S3 Glacier Deep Archive storage class\\n         objects or on S3 Intelligent-Tiering Archive Access and Deep Archive Access storage tier\\n         objects, but not both types in the same job. If you need to restore objects of both types\\n         you <i>must</i> create separate Batch Operations jobs. </p>\"\n                    }\n                },\n                \"GlacierJobTier\": {\n                    \"target\": \"com.amazonaws.s3control#S3GlacierJobTier\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>S3 Batch Operations supports <code>STANDARD</code> and <code>BULK</code> retrieval tiers, but\\n         not the <code>EXPEDITED</code> retrieval tier.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the configuration parameters for\\n         a\\n         POST Object restore job. S3 Batch Operations passes every object to the\\n         underlying\\n            <code>RestoreObject</code>\\n         API\\n         operation. For more information about the parameters for this operation,\\n         see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPOSTrestore.html#RESTObjectPOSTrestore-restore-request\\\">RestoreObject</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#S3JobManifestGenerator\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ExpectedBucketOwner\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID that owns the bucket the generated manifest is written to. If\\n         provided the generated manifest bucket's owner Amazon Web Services account ID must match this value, else\\n         the job fails.</p>\"\n                    }\n                },\n                \"SourceBucket\": {\n                    \"target\": \"com.amazonaws.s3control#S3BucketArnString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the source bucket used by the ManifestGenerator.</p>\\n         <note>\\n            <p>\\n               <b>Directory buckets</b> - Directory buckets\\n            aren't supported as the source buckets used by <code>S3JobManifestGenerator</code> to\\n            generate the job manifest.</p>\\n         </note>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ManifestOutputLocation\": {\n                    \"target\": \"com.amazonaws.s3control#S3ManifestOutputLocation\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the location the generated manifest will be written to. Manifests can't be\\n         written to directory buckets. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-buckets-overview.html\\\">Directory\\n            buckets</a>.</p>\"\n                    }\n                },\n                \"Filter\": {\n                    \"target\": \"com.amazonaws.s3control#JobManifestGeneratorFilter\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies rules the S3JobManifestGenerator should use to decide whether an object in the\\n         source bucket should or should not be included in the generated job manifest.</p>\"\n                    }\n                },\n                \"EnableManifestOutput\": {\n                    \"target\": \"com.amazonaws.s3control#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Determines whether or not to write the job's generated manifest to a bucket.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The container for the service that will create the S3 manifest.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#S3KeyArnString\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 2000\n                },\n                \"smithy.api#pattern\": \"^arn:[^:]+:s3:\"\n            }\n        },\n        \"com.amazonaws.s3control#S3ManifestOutputLocation\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ExpectedManifestBucketOwner\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Account ID that owns the bucket the generated manifest is written to.</p>\"\n                    }\n                },\n                \"Bucket\": {\n                    \"target\": \"com.amazonaws.s3control#S3BucketArnString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The bucket ARN the generated manifest should be written to.</p>\\n         <note>\\n            <p>\\n               <b>Directory buckets</b> - Directory buckets\\n            aren't supported as the buckets to store the generated manifest.</p>\\n         </note>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ManifestPrefix\": {\n                    \"target\": \"com.amazonaws.s3control#ManifestPrefixString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Prefix identifying one or more objects to which the manifest applies.</p>\"\n                    }\n                },\n                \"ManifestEncryption\": {\n                    \"target\": \"com.amazonaws.s3control#GeneratedManifestEncryption\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies what encryption should be used when the generated manifest objects are\\n         written.</p>\"\n                    }\n                },\n                \"ManifestFormat\": {\n                    \"target\": \"com.amazonaws.s3control#GeneratedManifestFormat\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The format of the generated manifest.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Location details for where the generated manifest should be written.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#S3MetadataDirective\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"COPY\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"COPY\"\n                    }\n                },\n                \"REPLACE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"REPLACE\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#S3ObjectLockLegalHold\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Status\": {\n                    \"target\": \"com.amazonaws.s3control#S3ObjectLockLegalHoldStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Object Lock legal hold status to be applied to all objects in the Batch Operations\\n         job.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Whether S3 Object Lock legal hold will be applied to objects in an S3 Batch Operations\\n         job.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#S3ObjectLockLegalHoldStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"OFF\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"OFF\"\n                    }\n                },\n                \"ON\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ON\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#S3ObjectLockMode\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"COMPLIANCE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"COMPLIANCE\"\n                    }\n                },\n                \"GOVERNANCE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"GOVERNANCE\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#S3ObjectLockRetentionMode\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"COMPLIANCE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"COMPLIANCE\"\n                    }\n                },\n                \"GOVERNANCE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"GOVERNANCE\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#S3ObjectMetadata\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CacheControl\": {\n                    \"target\": \"com.amazonaws.s3control#NonEmptyMaxLength1024String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                },\n                \"ContentDisposition\": {\n                    \"target\": \"com.amazonaws.s3control#NonEmptyMaxLength1024String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                },\n                \"ContentEncoding\": {\n                    \"target\": \"com.amazonaws.s3control#NonEmptyMaxLength1024String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                },\n                \"ContentLanguage\": {\n                    \"target\": \"com.amazonaws.s3control#NonEmptyMaxLength1024String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                },\n                \"UserMetadata\": {\n                    \"target\": \"com.amazonaws.s3control#S3UserMetadata\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                },\n                \"ContentLength\": {\n                    \"target\": \"com.amazonaws.s3control#S3ContentLength\",\n                    \"traits\": {\n                        \"smithy.api#default\": null,\n                        \"smithy.api#documentation\": \"<p>\\n            <i>This member has been deprecated.</i>\\n         </p>\\n         <p></p>\"\n                    }\n                },\n                \"ContentMD5\": {\n                    \"target\": \"com.amazonaws.s3control#NonEmptyMaxLength1024String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>\\n            <i>This member has been deprecated.</i>\\n         </p>\\n         <p></p>\"\n                    }\n                },\n                \"ContentType\": {\n                    \"target\": \"com.amazonaws.s3control#NonEmptyMaxLength1024String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                },\n                \"HttpExpiresDate\": {\n                    \"target\": \"com.amazonaws.s3control#TimeStamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                },\n                \"RequesterCharged\": {\n                    \"target\": \"com.amazonaws.s3control#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>\\n            <i>This member has been deprecated.</i>\\n         </p>\\n         <p></p>\"\n                    }\n                },\n                \"SSEAlgorithm\": {\n                    \"target\": \"com.amazonaws.s3control#S3SSEAlgorithm\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The server-side encryption algorithm used when storing objects in Amazon S3.</p>\\n         <p>\\n            <b>Directory buckets </b> -\\n         For directory buckets, there are only two supported options for server-side encryption: server-side encryption with Amazon S3 managed keys (SSE-S3) (<code>AES256</code>) and server-side encryption with KMS keys (SSE-KMS) (<code>KMS</code>). For more\\n         information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-serv-side-encryption.html\\\">Protecting data with server-side encryption</a> in the <i>Amazon S3 User Guide</i>.\\n         For <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-buckets-objects-Batch-Ops\\\">the Copy operation in Batch Operations</a>, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_S3CopyObjectOperation.html\\\">S3CopyObjectOperation</a>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p></p>\"\n            }\n        },\n        \"com.amazonaws.s3control#S3ObjectOwner\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ID\": {\n                    \"target\": \"com.amazonaws.s3control#NonEmptyMaxLength1024String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                },\n                \"DisplayName\": {\n                    \"target\": \"com.amazonaws.s3control#NonEmptyMaxLength1024String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p></p>\"\n            }\n        },\n        \"com.amazonaws.s3control#S3ObjectVersionId\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 2000\n                }\n            }\n        },\n        \"com.amazonaws.s3control#S3Permission\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"FULL_CONTROL\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"FULL_CONTROL\"\n                    }\n                },\n                \"READ\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"READ\"\n                    }\n                },\n                \"WRITE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"WRITE\"\n                    }\n                },\n                \"READ_ACP\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"READ_ACP\"\n                    }\n                },\n                \"WRITE_ACP\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"WRITE_ACP\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#S3Prefix\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 2000\n                },\n                \"smithy.api#pattern\": \"^.+$\"\n            }\n        },\n        \"com.amazonaws.s3control#S3PrefixType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"Object\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Object\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#S3RegionalBucketArn\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 4,\n                    \"max\": 128\n                }\n            }\n        },\n        \"com.amazonaws.s3control#S3RegionalOrS3ExpressBucketArnString\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 128\n                },\n                \"smithy.api#pattern\": \"^arn:[^:]+:(s3|s3express):\"\n            }\n        },\n        \"com.amazonaws.s3control#S3ReplicateObjectOperation\": {\n            \"type\": \"structure\",\n            \"members\": {},\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Directs the specified job to invoke <code>ReplicateObject</code> on every object in the\\n         job's manifest.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#S3ResourceArn\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 1011\n                },\n                \"smithy.api#pattern\": \"^arn:[^:]+:s3(express)?:[^:]\"\n            }\n        },\n        \"com.amazonaws.s3control#S3Retention\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RetainUntilDate\": {\n                    \"target\": \"com.amazonaws.s3control#TimeStamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date when the applied Object Lock retention will expire on all objects set by the\\n         Batch Operations job.</p>\"\n                    }\n                },\n                \"Mode\": {\n                    \"target\": \"com.amazonaws.s3control#S3ObjectLockRetentionMode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Object Lock retention mode to be applied to all objects in the Batch Operations\\n         job.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the S3 Object Lock retention mode to be applied to all objects in the\\n         S3 Batch Operations job. If you don't provide <code>Mode</code> and <code>RetainUntilDate</code>\\n         data types in your operation, you will remove the retention from your objects. For more\\n         information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/batch-ops-retention-date.html\\\">Using S3 Object Lock retention\\n            with S3 Batch Operations</a> in the <i>Amazon S3 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#S3SSEAlgorithm\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"AES256\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AES256\"\n                    }\n                },\n                \"KMS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"KMS\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#S3SetObjectAclOperation\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccessControlPolicy\": {\n                    \"target\": \"com.amazonaws.s3control#S3AccessControlPolicy\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the configuration parameters for a\\n         PUT\\n         Object ACL operation. S3 Batch Operations passes every object to the underlying\\n            <code>PutObjectAcl</code>\\n         API\\n         operation. For more information about the parameters for this operation,\\n         see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPUTacl.html\\\">PutObjectAcl</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#S3SetObjectLegalHoldOperation\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LegalHold\": {\n                    \"target\": \"com.amazonaws.s3control#S3ObjectLockLegalHold\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Contains the Object Lock legal hold status to be applied to all objects in the\\n         Batch Operations job.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the configuration for an S3 Object Lock legal hold operation that an\\n         S3 Batch Operations job passes\\n         to\\n         every object to the underlying\\n            <code>PutObjectLegalHold</code>\\n         API\\n         operation. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/batch-ops-legal-hold.html\\\">Using S3 Object Lock legal hold\\n            with S3 Batch Operations</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <note>\\n            <p>This functionality is not supported by directory buckets.</p>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.s3control#S3SetObjectRetentionOperation\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"BypassGovernanceRetention\": {\n                    \"target\": \"com.amazonaws.s3control#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#default\": null,\n                        \"smithy.api#documentation\": \"<p>Indicates if the action should be applied to objects in the Batch Operations job even if they\\n         have Object Lock <code> GOVERNANCE</code> type in place.</p>\"\n                    }\n                },\n                \"Retention\": {\n                    \"target\": \"com.amazonaws.s3control#S3Retention\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Contains the Object Lock retention mode to be applied to all objects in the Batch Operations\\n         job. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/batch-ops-retention-date.html\\\">Using S3 Object Lock retention\\n            with S3 Batch Operations</a> in the <i>Amazon S3 User Guide</i>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the configuration parameters for the Object Lock retention action for an\\n         S3 Batch Operations job. Batch Operations passes every object to the underlying\\n            <code>PutObjectRetention</code>\\n         API\\n         operation. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/batch-ops-retention-date.html\\\">Using S3 Object Lock retention\\n            with S3 Batch Operations</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <note>\\n            <p>This functionality is not supported by directory buckets.</p>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.s3control#S3SetObjectTaggingOperation\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TagSet\": {\n                    \"target\": \"com.amazonaws.s3control#S3TagSet\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the configuration parameters for a\\n         PUT\\n         Object Tagging operation. S3 Batch Operations passes every object to the underlying\\n            <code>PutObjectTagging</code>\\n         API\\n         operation. For more information about the parameters for this operation,\\n         see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectPUTtagging.html\\\">PutObjectTagging</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#S3StorageClass\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"STANDARD\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"STANDARD\"\n                    }\n                },\n                \"STANDARD_IA\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"STANDARD_IA\"\n                    }\n                },\n                \"ONEZONE_IA\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ONEZONE_IA\"\n                    }\n                },\n                \"GLACIER\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"GLACIER\"\n                    }\n                },\n                \"INTELLIGENT_TIERING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"INTELLIGENT_TIERING\"\n                    }\n                },\n                \"DEEP_ARCHIVE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DEEP_ARCHIVE\"\n                    }\n                },\n                \"GLACIER_IR\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"GLACIER_IR\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#S3Tag\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Key\": {\n                    \"target\": \"com.amazonaws.s3control#TagKeyString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Key of the tag</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Value\": {\n                    \"target\": \"com.amazonaws.s3control#TagValueString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Value of the tag</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A container for a key-value name pair.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#S3TagSet\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.s3control#S3Tag\"\n            }\n        },\n        \"com.amazonaws.s3control#S3UserMetadata\": {\n            \"type\": \"map\",\n            \"key\": {\n                \"target\": \"com.amazonaws.s3control#NonEmptyMaxLength1024String\"\n            },\n            \"value\": {\n                \"target\": \"com.amazonaws.s3control#MaxLength1024String\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 8192\n                }\n            }\n        },\n        \"com.amazonaws.s3control#SSECFilter\": {\n            \"type\": \"structure\",\n            \"members\": {},\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A filter that returns objects that are encrypted by server-side encryption with customer-provided keys (SSE-C).</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#SSEKMS\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"KeyId\": {\n                    \"target\": \"com.amazonaws.s3control#SSEKMSKeyId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A container for the ARN of the SSE-KMS encryption. This property is read-only and\\n         follows the following format: <code>\\n               arn:aws:kms:<i>us-east-1</i>:<i>example-account-id</i>:key/<i>example-9a73-4afc-8d29-8f5900cef44e</i>\\n            </code>\\n         </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p></p>\",\n                \"smithy.api#xmlName\": \"SSE-KMS\"\n            }\n        },\n        \"com.amazonaws.s3control#SSEKMSEncryption\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"KeyId\": {\n                    \"target\": \"com.amazonaws.s3control#KmsKeyArnString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies the ID of the Amazon Web Services Key Management Service (Amazon Web Services KMS) symmetric encryption\\n         customer managed key to use for encrypting generated manifest objects.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Configuration for the use of SSE-KMS to encrypt generated manifest objects.</p>\",\n                \"smithy.api#xmlName\": \"SSE-KMS\"\n            }\n        },\n        \"com.amazonaws.s3control#SSEKMSFilter\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"KmsKeyArn\": {\n                    \"target\": \"com.amazonaws.s3control#NonEmptyKmsKeyArnString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the customer managed KMS key to use for the filter \\n         to return objects that are encrypted by the specified key. For best performance, \\n         we recommend using the <code>KMSKeyArn</code> filter in conjunction with other object metadata filters, like <code>MatchAnyPrefix</code>, <code>CreatedAfter</code>, or \\n         <code>MatchAnyStorageClass</code>.</p>\\n         <note>\\n            <p>You must provide the full KMS Key ARN. You can't use an alias name or alias ARN. \\n         For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#key-id-key-ARN\\\"> \\n            KMS keys</a> in the <i>Amazon Web Services Key Management Service Developer Guide</i>.</p>\\n         </note>\"\n                    }\n                },\n                \"BucketKeyEnabled\": {\n                    \"target\": \"com.amazonaws.s3control#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#default\": null,\n                        \"smithy.api#documentation\": \"<p>Specifies whether Amazon S3 should use an S3 Bucket Key for object encryption with server-side encryption \\n            using Amazon Web Services Key Management Service (Amazon Web Services KMS) keys (SSE-KMS). If specified, will filter SSE-KMS encrypted objects by S3 Bucket Key status. \\n            For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucket-key.html\\\">Reducing the cost of SSE-KMS with Amazon S3 Bucket Keys</a>\\n            in the <i>Amazon S3 User Guide</i>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A filter that returns objects that are encrypted by server-side encryption with Amazon Web Services KMS (SSE-KMS).</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#SSEKMSKeyId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.s3control#SSES3\": {\n            \"type\": \"structure\",\n            \"members\": {},\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p></p>\",\n                \"smithy.api#xmlName\": \"SSE-S3\"\n            }\n        },\n        \"com.amazonaws.s3control#SSES3Encryption\": {\n            \"type\": \"structure\",\n            \"members\": {},\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Configuration for the use of SSE-S3 to encrypt generated manifest objects.</p>\",\n                \"smithy.api#xmlName\": \"SSE-S3\"\n            }\n        },\n        \"com.amazonaws.s3control#SSES3Filter\": {\n            \"type\": \"structure\",\n            \"members\": {},\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A filter that returns objects that are encrypted by server-side encryption with Amazon S3 managed keys (SSE-S3).</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#Scope\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Prefixes\": {\n                    \"target\": \"com.amazonaws.s3control#PrefixesList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>You can specify any amount of prefixes, but the total length of characters of all\\n         prefixes must be less than 256 bytes in size.</p>\",\n                        \"smithy.api#xmlName\": \"Prefixes\"\n                    }\n                },\n                \"Permissions\": {\n                    \"target\": \"com.amazonaws.s3control#ScopePermissionList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>You can include one or more API operations as permissions.</p>\",\n                        \"smithy.api#xmlName\": \"Permissions\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>You can use the access point scope to restrict access to specific prefixes, API operations, or a\\n         combination of both.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-points-directory-buckets-manage-scope.html\\\">Manage\\n            the scope of your access points for directory buckets</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#ScopePermission\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"GetObject\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"GetObject\"\n                    }\n                },\n                \"GetObjectAttributes\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"GetObjectAttributes\"\n                    }\n                },\n                \"ListMultipartUploadParts\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ListMultipartUploadParts\"\n                    }\n                },\n                \"ListBucket\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ListBucket\"\n                    }\n                },\n                \"ListBucketMultipartUploads\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ListBucketMultipartUploads\"\n                    }\n                },\n                \"PutObject\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"PutObject\"\n                    }\n                },\n                \"DeleteObject\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DeleteObject\"\n                    }\n                },\n                \"AbortMultipartUpload\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AbortMultipartUpload\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#ScopePermissionList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.s3control#ScopePermission\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"Permission\"\n                }\n            }\n        },\n        \"com.amazonaws.s3control#SecretAccessKey\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#sensitive\": {}\n            }\n        },\n        \"com.amazonaws.s3control#SelectionCriteria\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Delimiter\": {\n                    \"target\": \"com.amazonaws.s3control#StorageLensPrefixLevelDelimiter\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A container for the delimiter of the selection criteria being used.</p>\"\n                    }\n                },\n                \"MaxDepth\": {\n                    \"target\": \"com.amazonaws.s3control#StorageLensPrefixLevelMaxDepth\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The max depth of the selection criteria</p>\"\n                    }\n                },\n                \"MinStorageBytesPercentage\": {\n                    \"target\": \"com.amazonaws.s3control#MinStorageBytesPercentage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The minimum number of storage bytes percentage whose metrics will be selected.</p>\\n         <note>\\n            <p>You must choose a value greater than or equal to <code>1.0</code>.</p>\\n         </note>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p></p>\"\n            }\n        },\n        \"com.amazonaws.s3control#SessionToken\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#sensitive\": {}\n            }\n        },\n        \"com.amazonaws.s3control#Setting\": {\n            \"type\": \"boolean\",\n            \"traits\": {\n                \"smithy.api#default\": false\n            }\n        },\n        \"com.amazonaws.s3control#SourceSelectionCriteria\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SseKmsEncryptedObjects\": {\n                    \"target\": \"com.amazonaws.s3control#SseKmsEncryptedObjects\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A filter that you can use to select Amazon S3 objects that are encrypted with server-side\\n         encryption by using Key Management Service (KMS) keys. If you include\\n            <code>SourceSelectionCriteria</code> in the replication configuration, this element is\\n         required. </p>\\n         <note>\\n            <p>This is not supported by Amazon S3 on Outposts buckets.</p>\\n         </note>\"\n                    }\n                },\n                \"ReplicaModifications\": {\n                    \"target\": \"com.amazonaws.s3control#ReplicaModifications\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A filter that you can use to specify whether replica modification sync is enabled.\\n         S3 on Outposts replica modification sync can help you keep object metadata synchronized\\n         between replicas and source objects. By default, S3 on Outposts replicates metadata from the\\n         source objects to the replicas only. When replica modification sync is enabled,\\n         S3 on Outposts replicates metadata changes made to the replica copies back to the source\\n         object, making the replication bidirectional.</p>\\n         <p>To replicate object metadata modifications on replicas, you can specify this element and\\n         set the <code>Status</code> of this element to <code>Enabled</code>.</p>\\n         <note>\\n            <p>You must enable replica modification sync on the source and destination buckets to\\n            replicate replica metadata changes between the source and the replicas.</p>\\n         </note>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A container that describes additional filters for identifying the source objects that\\n         you want to replicate. You can choose to enable or disable the replication of these\\n         objects.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#SseKmsEncryptedObjects\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Status\": {\n                    \"target\": \"com.amazonaws.s3control#SseKmsEncryptedObjectsStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies whether Amazon S3 replicates objects that are created with server-side encryption\\n         by using an KMS key stored in Key Management Service.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A container for filter information that you can use to select S3 objects that are\\n         encrypted with Key Management Service (KMS).</p>\\n         <note>\\n            <p>This is not supported by Amazon S3 on Outposts buckets.</p>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.s3control#SseKmsEncryptedObjectsStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"Enabled\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Enabled\"\n                    }\n                },\n                \"Disabled\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"Disabled\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#StorageClassList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.s3control#S3StorageClass\"\n            }\n        },\n        \"com.amazonaws.s3control#StorageLensArn\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 1024\n                },\n                \"smithy.api#pattern\": \"^arn:[a-z\\\\-]+:s3:[a-z0-9\\\\-]+:\\\\d{12}:storage\\\\-lens\\\\/\"\n            }\n        },\n        \"com.amazonaws.s3control#StorageLensAwsOrg\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Arn\": {\n                    \"target\": \"com.amazonaws.s3control#AwsOrgArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A container for the Amazon Resource Name (ARN) of the Amazon Web Services organization. This property\\n         is read-only and follows the following format: <code>\\n               arn:aws:organizations:<i>us-east-1</i>:<i>example-account-id</i>:organization/<i>o-ex2l495dck</i>\\n            </code>\\n         </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The Amazon Web Services organization for your S3 Storage Lens.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#StorageLensConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Id\": {\n                    \"target\": \"com.amazonaws.s3control#ConfigId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A container for the Amazon S3 Storage Lens configuration ID.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"AccountLevel\": {\n                    \"target\": \"com.amazonaws.s3control#AccountLevel\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A container for all the account-level configurations of your S3 Storage Lens\\n         configuration.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Include\": {\n                    \"target\": \"com.amazonaws.s3control#Include\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A container for what is included in this configuration. This container can only be valid\\n         if there is no <code>Exclude</code> container submitted, and it's not empty. </p>\"\n                    }\n                },\n                \"Exclude\": {\n                    \"target\": \"com.amazonaws.s3control#Exclude\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A container for what is excluded in this configuration. This container can only be valid\\n         if there is no <code>Include</code> container submitted, and it's not empty. </p>\"\n                    }\n                },\n                \"DataExport\": {\n                    \"target\": \"com.amazonaws.s3control#StorageLensDataExport\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A container to specify the properties of your S3 Storage Lens metrics export including, the\\n         destination, schema and format.</p>\"\n                    }\n                },\n                \"IsEnabled\": {\n                    \"target\": \"com.amazonaws.s3control#IsEnabled\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>A container for whether the S3 Storage Lens configuration is enabled.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"AwsOrg\": {\n                    \"target\": \"com.amazonaws.s3control#StorageLensAwsOrg\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A container for the Amazon Web Services organization for this S3 Storage Lens configuration.</p>\"\n                    }\n                },\n                \"StorageLensArn\": {\n                    \"target\": \"com.amazonaws.s3control#StorageLensArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the S3 Storage Lens configuration. This property is read-only\\n         and follows the following format: <code>\\n               arn:aws:s3:<i>us-east-1</i>:<i>example-account-id</i>:storage-lens/<i>your-dashboard-name</i>\\n            </code>\\n         </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A container for the Amazon S3 Storage Lens configuration.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#StorageLensConfigurationList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.s3control#ListStorageLensConfigurationEntry\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"StorageLensConfiguration\"\n                }\n            }\n        },\n        \"com.amazonaws.s3control#StorageLensDataExport\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"S3BucketDestination\": {\n                    \"target\": \"com.amazonaws.s3control#S3BucketDestination\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A container for the bucket where the S3 Storage Lens metrics export will be located.</p>\\n         <note>\\n            <p>This bucket must be located in the same Region as the storage lens configuration.\\n         </p>\\n         </note>\"\n                    }\n                },\n                \"CloudWatchMetrics\": {\n                    \"target\": \"com.amazonaws.s3control#CloudWatchMetrics\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A container for enabling Amazon CloudWatch publishing for S3 Storage Lens metrics.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A container to specify the properties of your S3 Storage Lens metrics export, including the\\n         destination, schema, and format.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#StorageLensDataExportEncryption\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SSES3\": {\n                    \"target\": \"com.amazonaws.s3control#SSES3\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\",\n                        \"smithy.api#xmlName\": \"SSE-S3\"\n                    }\n                },\n                \"SSEKMS\": {\n                    \"target\": \"com.amazonaws.s3control#SSEKMS\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\",\n                        \"smithy.api#xmlName\": \"SSE-KMS\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A container for the encryption of the S3 Storage Lens metrics exports.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#StorageLensGroup\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Name\": {\n                    \"target\": \"com.amazonaws.s3control#StorageLensGroupName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> Contains the name of the Storage Lens group. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Filter\": {\n                    \"target\": \"com.amazonaws.s3control#StorageLensGroupFilter\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Sets the criteria for the Storage Lens group data that is displayed. For multiple filter\\n         conditions, the <code>AND</code> or <code>OR</code> logical operator is used.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"StorageLensGroupArn\": {\n                    \"target\": \"com.amazonaws.s3control#StorageLensGroupArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> Contains the Amazon Resource Name (ARN) of the Storage Lens group. This property is\\n         read-only. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A custom grouping of objects that include filters for prefixes, suffixes, object tags,\\n         object size, or object age. You can create an S3 Storage Lens group that includes a single\\n         filter or multiple filter conditions. To specify multiple filter conditions, you use\\n            <code>AND</code> or <code>OR</code> logical operators. </p>\"\n            }\n        },\n        \"com.amazonaws.s3control#StorageLensGroupAndOperator\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"MatchAnyPrefix\": {\n                    \"target\": \"com.amazonaws.s3control#MatchAnyPrefix\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> Contains a list of prefixes. At least one prefix must be specified. Up to 10 prefixes\\n         are allowed. </p>\"\n                    }\n                },\n                \"MatchAnySuffix\": {\n                    \"target\": \"com.amazonaws.s3control#MatchAnySuffix\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> Contains a list of suffixes. At least one suffix must be specified. Up to 10 suffixes\\n         are allowed. </p>\"\n                    }\n                },\n                \"MatchAnyTag\": {\n                    \"target\": \"com.amazonaws.s3control#MatchAnyTag\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> Contains the list of object tags. At least one object tag must be specified. Up to 10\\n         object tags are allowed. </p>\"\n                    }\n                },\n                \"MatchObjectAge\": {\n                    \"target\": \"com.amazonaws.s3control#MatchObjectAge\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> Contains <code>DaysGreaterThan</code> and <code>DaysLessThan</code> to define the\\n         object age range (minimum and maximum number of days). </p>\"\n                    }\n                },\n                \"MatchObjectSize\": {\n                    \"target\": \"com.amazonaws.s3control#MatchObjectSize\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> Contains <code>BytesGreaterThan</code> and <code>BytesLessThan</code> to define the\\n         object size range (minimum and maximum number of Bytes). </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p> A logical operator that allows multiple filter conditions to be joined for more complex\\n         comparisons of Storage Lens group data. </p>\"\n            }\n        },\n        \"com.amazonaws.s3control#StorageLensGroupArn\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 4,\n                    \"max\": 1024\n                },\n                \"smithy.api#pattern\": \"^arn:[a-z\\\\-]+:s3:[a-z0-9\\\\-]+:\\\\d{12}:storage\\\\-lens\\\\-group\\\\/\"\n            }\n        },\n        \"com.amazonaws.s3control#StorageLensGroupFilter\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"MatchAnyPrefix\": {\n                    \"target\": \"com.amazonaws.s3control#MatchAnyPrefix\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> Contains a list of prefixes. At least one prefix must be specified. Up to 10 prefixes\\n         are allowed. </p>\"\n                    }\n                },\n                \"MatchAnySuffix\": {\n                    \"target\": \"com.amazonaws.s3control#MatchAnySuffix\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> Contains a list of suffixes. At least one suffix must be specified. Up to 10 suffixes\\n         are allowed. </p>\"\n                    }\n                },\n                \"MatchAnyTag\": {\n                    \"target\": \"com.amazonaws.s3control#MatchAnyTag\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> Contains the list of S3 object tags. At least one object tag must be specified. Up to\\n         10 object tags are allowed. </p>\"\n                    }\n                },\n                \"MatchObjectAge\": {\n                    \"target\": \"com.amazonaws.s3control#MatchObjectAge\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> Contains <code>DaysGreaterThan</code> and <code>DaysLessThan</code> to define the\\n         object age range (minimum and maximum number of days). </p>\"\n                    }\n                },\n                \"MatchObjectSize\": {\n                    \"target\": \"com.amazonaws.s3control#MatchObjectSize\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> Contains <code>BytesGreaterThan</code> and <code>BytesLessThan</code> to define the\\n         object size range (minimum and maximum number of Bytes). </p>\"\n                    }\n                },\n                \"And\": {\n                    \"target\": \"com.amazonaws.s3control#StorageLensGroupAndOperator\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A logical operator that allows multiple filter conditions to be joined for more complex\\n         comparisons of Storage Lens group data. Objects must match all of the listed filter\\n         conditions that are joined by the <code>And</code> logical operator. Only one of each\\n         filter condition is allowed.</p>\"\n                    }\n                },\n                \"Or\": {\n                    \"target\": \"com.amazonaws.s3control#StorageLensGroupOrOperator\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A single logical operator that allows multiple filter conditions to be joined. Objects\\n         can match any of the listed filter conditions, which are joined by the <code>Or</code>\\n         logical operator. Only one of each filter condition is allowed. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The filter element sets the criteria for the Storage Lens group data that is displayed.\\n         For multiple filter conditions, the <code>AND</code> or <code>OR</code> logical operator is\\n         used.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#StorageLensGroupLevel\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SelectionCriteria\": {\n                    \"target\": \"com.amazonaws.s3control#StorageLensGroupLevelSelectionCriteria\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> Indicates which Storage Lens group ARNs to include or exclude in the Storage Lens group\\n         aggregation. If this value is left null, then all Storage Lens groups are selected. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p> Specifies the Storage Lens groups to include in the Storage Lens group aggregation.\\n      </p>\"\n            }\n        },\n        \"com.amazonaws.s3control#StorageLensGroupLevelExclude\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.s3control#StorageLensGroupArn\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"Arn\"\n                }\n            }\n        },\n        \"com.amazonaws.s3control#StorageLensGroupLevelInclude\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.s3control#StorageLensGroupArn\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"Arn\"\n                }\n            }\n        },\n        \"com.amazonaws.s3control#StorageLensGroupLevelSelectionCriteria\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Include\": {\n                    \"target\": \"com.amazonaws.s3control#StorageLensGroupLevelInclude\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> Indicates which Storage Lens group ARNs to include in the Storage Lens group\\n         aggregation. </p>\"\n                    }\n                },\n                \"Exclude\": {\n                    \"target\": \"com.amazonaws.s3control#StorageLensGroupLevelExclude\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> Indicates which Storage Lens group ARNs to exclude from the Storage Lens group\\n         aggregation. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p> Indicates which Storage Lens group ARNs to include or exclude in the Storage Lens group\\n         aggregation. You can only attach Storage Lens groups to your Storage Lens dashboard if\\n         they're included in your Storage Lens group aggregation. If this value is left null, then\\n         all Storage Lens groups are selected. </p>\"\n            }\n        },\n        \"com.amazonaws.s3control#StorageLensGroupList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.s3control#ListStorageLensGroupEntry\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"StorageLensGroup\"\n                }\n            }\n        },\n        \"com.amazonaws.s3control#StorageLensGroupName\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 64\n                },\n                \"smithy.api#pattern\": \"^[a-zA-Z0-9\\\\-\\\\_]+$\"\n            }\n        },\n        \"com.amazonaws.s3control#StorageLensGroupOrOperator\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"MatchAnyPrefix\": {\n                    \"target\": \"com.amazonaws.s3control#MatchAnyPrefix\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> Filters objects that match any of the specified prefixes. </p>\"\n                    }\n                },\n                \"MatchAnySuffix\": {\n                    \"target\": \"com.amazonaws.s3control#MatchAnySuffix\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> Filters objects that match any of the specified suffixes. </p>\"\n                    }\n                },\n                \"MatchAnyTag\": {\n                    \"target\": \"com.amazonaws.s3control#MatchAnyTag\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> Filters objects that match any of the specified S3 object tags. </p>\"\n                    }\n                },\n                \"MatchObjectAge\": {\n                    \"target\": \"com.amazonaws.s3control#MatchObjectAge\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> Filters objects that match the specified object age range. </p>\"\n                    }\n                },\n                \"MatchObjectSize\": {\n                    \"target\": \"com.amazonaws.s3control#MatchObjectSize\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> Filters objects that match the specified object size range. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A container element for specifying <code>Or</code> rule conditions. The rule conditions\\n         determine the subset of objects to which the <code>Or</code> rule applies. Objects can\\n         match any of the listed filter conditions, which are joined by the <code>Or</code> logical\\n         operator. Only one of each filter condition is allowed.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#StorageLensPrefixLevelDelimiter\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 1\n                }\n            }\n        },\n        \"com.amazonaws.s3control#StorageLensPrefixLevelMaxDepth\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 10\n                }\n            }\n        },\n        \"com.amazonaws.s3control#StorageLensTag\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Key\": {\n                    \"target\": \"com.amazonaws.s3control#TagKeyString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Value\": {\n                    \"target\": \"com.amazonaws.s3control#TagValueString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p></p>\"\n            }\n        },\n        \"com.amazonaws.s3control#StorageLensTags\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.s3control#StorageLensTag\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"Tag\"\n                }\n            }\n        },\n        \"com.amazonaws.s3control#StringForNextToken\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 1024\n                },\n                \"smithy.api#pattern\": \"^[A-Za-z0-9\\\\+\\\\:\\\\/\\\\=\\\\?\\\\#-_]+$\"\n            }\n        },\n        \"com.amazonaws.s3control#SubmitMultiRegionAccessPointRoutes\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#SubmitMultiRegionAccessPointRoutesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.s3control#SubmitMultiRegionAccessPointRoutesResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported by directory buckets.</p>\\n         </note>\\n         <p>Submits an updated route configuration for a Multi-Region Access Point. This API operation updates the\\n         routing status for the specified Regions from active to passive, or from passive to active.\\n         A value of <code>0</code> indicates a passive status, which means that traffic won't be\\n         routed to the specified Region. A value of <code>100</code> indicates an active status,\\n         which means that traffic will be routed to the specified Region. At least one Region must\\n         be active at all times.</p>\\n         <p>When the routing configuration is changed, any in-progress operations (uploads, copies,\\n         deletes, and so on) to formerly active Regions will continue to run to their final\\n         completion state (success or failure). The routing configurations of any Regions that\\n         aren’t specified remain unchanged.</p>\\n         <note>\\n            <p>Updated routing configurations might not be immediately applied. It can take up to 2\\n            minutes for your changes to take effect.</p>\\n         </note>\\n         <p>To submit routing control changes and failover requests, use the Amazon S3 failover control\\n         infrastructure endpoints in these five Amazon Web Services Regions:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>us-east-1</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>us-west-2</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ap-southeast-2</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ap-northeast-1</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>eu-west-1</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"PATCH\",\n                    \"uri\": \"/v20180820/mrap/instances/{Mrap+}/routes\",\n                    \"code\": 200\n                },\n                \"smithy.api#httpChecksumRequired\": {},\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#SubmitMultiRegionAccessPointRoutesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID for the owner of the Multi-Region Access Point.</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                },\n                \"Mrap\": {\n                    \"target\": \"com.amazonaws.s3control#MultiRegionAccessPointId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Multi-Region Access Point ARN.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"RouteUpdates\": {\n                    \"target\": \"com.amazonaws.s3control#RouteList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The different routes that make up the new route configuration. Active routes return a\\n         value of <code>100</code>, and passive routes return a value of <code>0</code>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#SubmitMultiRegionAccessPointRoutesResult\": {\n            \"type\": \"structure\",\n            \"members\": {},\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.s3control#Suffix\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.s3control#SuspendedCause\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 1024\n                }\n            }\n        },\n        \"com.amazonaws.s3control#SuspendedDate\": {\n            \"type\": \"timestamp\"\n        },\n        \"com.amazonaws.s3control#Tag\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Key\": {\n                    \"target\": \"com.amazonaws.s3control#TagKeyString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The key of the key-value pair of a tag added to your Amazon Web Services resource. A tag key can be up\\n         to 128 Unicode characters in length and is case-sensitive. System created tags that begin\\n         with <code>aws:</code> aren’t supported. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Value\": {\n                    \"target\": \"com.amazonaws.s3control#TagValueString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The value of the key-value pair of a tag added to your Amazon Web Services resource. A tag value can\\n         be up to 256 Unicode characters in length and is case-sensitive. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p> A key-value pair that you use to label your resources. You can add tags to new\\n         resources when you create them, or you can add tags to existing resources. Tags can help\\n         you organize, track costs for, and control access to resources. </p>\"\n            }\n        },\n        \"com.amazonaws.s3control#TagKeyList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.s3control#TagKeyString\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 50\n                }\n            }\n        },\n        \"com.amazonaws.s3control#TagKeyString\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 128\n                },\n                \"smithy.api#pattern\": \"^([\\\\p{L}\\\\p{Z}\\\\p{N}_.:/=+\\\\-@]*)$\"\n            }\n        },\n        \"com.amazonaws.s3control#TagList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.s3control#Tag\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"Tag\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 50\n                }\n            }\n        },\n        \"com.amazonaws.s3control#TagResource\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#TagResourceRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.s3control#TagResourceResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p> Creates a new user-defined tag or updates an existing tag. Each tag is a label consisting of a key and value that is applied to your resource. Tags can help you organize, track costs for, and control access to your resources. You can add up to 50 Amazon Web Services resource tags for each S3 resource. </p>\\n         <note>\\n            <p>This operation is only supported for the following Amazon S3 resource:</p>\\n            <ul>\\n               <li>\\n                  <p>\\n                     <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-points-db-tagging.html\\\">Access Points for directory buckets</a>\\n                  </p>\\n               </li>\\n               <li>\\n                  <p>\\n                     <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-points-tagging.html\\\">Access Points for general purpose buckets</a>\\n                  </p>\\n               </li>\\n               <li>\\n                  <p>\\n                     <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-buckets-tagging.html\\\">Directory buckets</a>\\n                  </p>\\n               </li>\\n               <li>\\n                  <p>\\n                     <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage-lens-groups.html\\\">S3 Storage Lens groups</a>\\n                  </p>\\n               </li>\\n               <li>\\n                  <p>\\n                     <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-grants-tagging.html\\\">S3 Access Grants instances, registered locations, or grants</a>.</p>\\n               </li>\\n            </ul>\\n         </note>\\n         <note>\\n            <p>This operation is only supported for the following Amazon S3 resource:</p>\\n            <ul>\\n               <li>\\n                  <p>\\n                     <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-buckets-tagging.html\\\">Directory\\n                     buckets</a>\\n                  </p>\\n               </li>\\n               <li>\\n                  <p>\\n                     <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage-lens-groups.html\\\">S3 Storage Lens\\n                     groups</a>\\n                  </p>\\n               </li>\\n               <li>\\n                  <p>\\n                     <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-grants-tagging.html\\\">S3 Access Grants instances,\\n                     registered locations, or grants</a>.</p>\\n               </li>\\n            </ul>\\n         </note>\\n         <dl>\\n            <dt>Permissions</dt>\\n            <dd>\\n               <p>For Storage Lens groups and S3 Access Grants, you must have the\\n                     <code>s3:TagResource</code> permission to use this operation. </p>\\n               <p>For more information about the required Storage Lens Groups permissions, see\\n                     <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage_lens_iam_permissions.html#storage_lens_groups_permissions\\\">Setting account permissions to use S3 Storage Lens groups</a>.</p>\\n            </dd>\\n            <dt>Directory bucket permissions</dt>\\n            <dd>\\n               <p>For directory buckets and access points for directory buckets, you must have the <code>s3express:TagResource</code> permission to use this operation. For more information about directory buckets policies and permissions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-permissions.html\\\">Identity and Access Management (IAM) for S3 Express One Zone</a> in the <i>Amazon S3 User Guide</i>.</p>\\n            </dd>\\n            <dt>HTTP Host header syntax</dt>\\n            <dd>\\n               <p>\\n                  <b>Directory buckets </b> - The HTTP Host header syntax is <code>s3express-control.<i>region</i>.amazonaws.com</code>.</p>\\n            </dd>\\n         </dl>\\n         <p>For information about S3 Tagging errors, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html#S3TaggingErrorCodeList\\\">List of Amazon S3 Tagging error codes</a>.</p>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"POST\",\n                    \"uri\": \"/v20180820/tags/{ResourceArn+}\",\n                    \"code\": 204\n                },\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#TagResourceRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>\\nThe Amazon Web Services account ID that created the S3 resource that you're trying to add tags to or the requester's account ID. \\n</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                },\n                \"ResourceArn\": {\n                    \"target\": \"com.amazonaws.s3control#S3ResourceArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the S3 resource that you're applying tags to. The\\n         tagged resource can be a directory bucket, S3 Storage Lens group or S3 Access Grants instance,\\n         registered location, or grant.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"ResourceArn\"\n                        }\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.s3control#TagList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The Amazon Web Services resource tags that you want to add to the specified S3 resource. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#TagResourceResult\": {\n            \"type\": \"structure\",\n            \"members\": {},\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.s3control#TagValueString\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 256\n                },\n                \"smithy.api#pattern\": \"^([\\\\p{L}\\\\p{Z}\\\\p{N}_.:/=+\\\\-@]*)$\"\n            }\n        },\n        \"com.amazonaws.s3control#Tagging\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TagSet\": {\n                    \"target\": \"com.amazonaws.s3control#S3TagSet\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A collection for a set of tags.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p></p>\"\n            }\n        },\n        \"com.amazonaws.s3control#TimeStamp\": {\n            \"type\": \"timestamp\"\n        },\n        \"com.amazonaws.s3control#TooManyRequestsException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Message\": {\n                    \"target\": \"com.amazonaws.s3control#ExceptionMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p></p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.s3control#TooManyTagsException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Message\": {\n                    \"target\": \"com.amazonaws.s3control#ExceptionMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Amazon S3 throws this exception if you have too many tags in your tag set.</p>\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.s3control#TrafficDialPercentage\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 0,\n                    \"max\": 100\n                }\n            }\n        },\n        \"com.amazonaws.s3control#Transition\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Date\": {\n                    \"target\": \"com.amazonaws.s3control#Date\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates when objects are transitioned to the specified storage class. The date value\\n         must be in ISO 8601 format. The time is always midnight UTC.</p>\"\n                    }\n                },\n                \"Days\": {\n                    \"target\": \"com.amazonaws.s3control#Days\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>Indicates the number of days after creation when objects are transitioned to the\\n         specified storage class. The value must be a positive integer.</p>\"\n                    }\n                },\n                \"StorageClass\": {\n                    \"target\": \"com.amazonaws.s3control#TransitionStorageClass\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The storage class to which you want the object to transition.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Specifies when an object transitions to a specified storage class. For more information\\n         about Amazon S3 Lifecycle configuration rules, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/lifecycle-transition-general-considerations.html\\\">\\n            Transitioning objects using Amazon S3 Lifecycle</a> in the\\n            <i>Amazon S3 User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#TransitionList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.s3control#Transition\",\n                \"traits\": {\n                    \"smithy.api#xmlName\": \"Transition\"\n                }\n            }\n        },\n        \"com.amazonaws.s3control#TransitionStorageClass\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"GLACIER\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"GLACIER\"\n                    }\n                },\n                \"STANDARD_IA\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"STANDARD_IA\"\n                    }\n                },\n                \"ONEZONE_IA\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ONEZONE_IA\"\n                    }\n                },\n                \"INTELLIGENT_TIERING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"INTELLIGENT_TIERING\"\n                    }\n                },\n                \"DEEP_ARCHIVE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DEEP_ARCHIVE\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#UntagResource\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#UntagResourceRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.s3control#UntagResourceResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This operation removes the specified user-defined tags from an S3 resource. You can pass\\n         one or more tag keys. </p>\\n         <note>\\n            <p>This operation is only supported for the following Amazon S3 resources:</p>\\n            <ul>\\n               <li>\\n                  <p>\\n                     <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-points-db-tagging.html\\\">Access Points for directory buckets</a>\\n                  </p>\\n               </li>\\n               <li>\\n                  <p>\\n                     <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-points-tagging.html\\\">Access Points for general purpose buckets</a>\\n                  </p>\\n               </li>\\n               <li>\\n                  <p>\\n                     <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-buckets-tagging.html\\\">Directory buckets</a>\\n                  </p>\\n               </li>\\n               <li>\\n                  <p>\\n                     <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage-lens-groups.html\\\">Storage Lens groups</a>\\n                  </p>\\n               </li>\\n               <li>\\n                  <p>\\n                     <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-grants-tagging.html\\\">S3 Access Grants instances, registered locations, and grants</a>.</p>\\n               </li>\\n            </ul>\\n         </note>\\n         <dl>\\n            <dt>Permissions</dt>\\n            <dd>\\n               <p>For Storage Lens groups and S3 Access Grants, you must have the\\n                     <code>s3:UntagResource</code> permission to use this operation. </p>\\n               <p>For more information about the required Storage Lens Groups permissions, see\\n                     <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage_lens_iam_permissions.html#storage_lens_groups_permissions\\\">Setting account permissions to use S3 Storage Lens groups</a>.</p>\\n            </dd>\\n            <dt>Directory bucket permissions</dt>\\n            <dd>\\n               <p>For directory buckets and access points for directory buckets, you must have\\n                  the <code>s3express:UntagResource</code> permission to use this operation.\\n                  For more information about directory buckets policies and permissions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-permissions.html\\\">Identity and Access Management (IAM) for S3 Express One Zone</a> in the <i>Amazon S3 User Guide</i>.</p>\\n            </dd>\\n            <dt>HTTP Host header syntax</dt>\\n            <dd>\\n               <p>\\n                  <b>Directory buckets </b> - The HTTP Host header syntax is <code>s3express-control.<i>region</i>.amazonaws.com</code>.</p>\\n            </dd>\\n         </dl>\\n         <p>For information about S3 Tagging errors, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html#S3TaggingErrorCodeList\\\">List of Amazon S3\\n            Tagging error codes</a>.</p>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"DELETE\",\n                    \"uri\": \"/v20180820/tags/{ResourceArn+}\",\n                    \"code\": 204\n                },\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#UntagResourceRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The Amazon Web Services account ID that owns the resource that you're trying to remove the tags from.\\n      </p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                },\n                \"ResourceArn\": {\n                    \"target\": \"com.amazonaws.s3control#S3ResourceArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the S3 resource that you're removing tags from. The\\n         tagged resource can be a directory bucket, S3 Storage Lens group or S3 Access Grants instance,\\n         registered location, or grant.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"ResourceArn\"\n                        }\n                    }\n                },\n                \"TagKeys\": {\n                    \"target\": \"com.amazonaws.s3control#TagKeyList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The array of tag key-value pairs that you're trying to remove from of the S3 resource.\\n      </p>\",\n                        \"smithy.api#httpQuery\": \"tagKeys\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#UntagResourceResult\": {\n            \"type\": \"structure\",\n            \"members\": {},\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.s3control#UpdateAccessGrantsLocation\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#UpdateAccessGrantsLocationRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.s3control#UpdateAccessGrantsLocationResult\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Updates the IAM role of a registered location in your S3 Access Grants instance.</p>\\n         <dl>\\n            <dt>Permissions</dt>\\n            <dd>\\n               <p>You must have the <code>s3:UpdateAccessGrantsLocation</code> permission to use\\n                  this operation. </p>\\n            </dd>\\n            <dt>Additional Permissions</dt>\\n            <dd>\\n               <p>You must also have the following permission: <code>iam:PassRole</code>\\n               </p>\\n            </dd>\\n         </dl>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"PUT\",\n                    \"uri\": \"/v20180820/accessgrantsinstance/location/{AccessGrantsLocationId}\",\n                    \"code\": 200\n                },\n                \"smithy.api#httpChecksumRequired\": {},\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#UpdateAccessGrantsLocationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID of the S3 Access Grants instance.</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                },\n                \"AccessGrantsLocationId\": {\n                    \"target\": \"com.amazonaws.s3control#AccessGrantsLocationId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the registered location that you are updating. S3 Access Grants assigns this ID when you\\n         register the location. S3 Access Grants assigns the ID <code>default</code> to the default location\\n            <code>s3://</code> and assigns an auto-generated ID to other locations that you\\n         register. </p>\\n         <p>The ID of the registered location to which you are granting access. S3 Access Grants assigned this\\n         ID when you registered the location. S3 Access Grants assigns the ID <code>default</code> to the\\n         default location <code>s3://</code> and assigns an auto-generated ID to other locations\\n         that you register. </p>\\n         <p>If you are passing the <code>default</code> location, you cannot create an access grant\\n         for the entire default location. You must also specify a bucket or a bucket and prefix in\\n         the <code>Subprefix</code> field. </p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"IAMRoleArn\": {\n                    \"target\": \"com.amazonaws.s3control#IAMRoleArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the IAM role for the registered location. S3 Access Grants\\n         assumes this role to manage access to the registered location. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#UpdateAccessGrantsLocationResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CreatedAt\": {\n                    \"target\": \"com.amazonaws.s3control#CreationTimestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time when you registered the location. </p>\"\n                    }\n                },\n                \"AccessGrantsLocationId\": {\n                    \"target\": \"com.amazonaws.s3control#AccessGrantsLocationId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the registered location to which you are granting access. S3 Access Grants assigned this\\n         ID when you registered the location. S3 Access Grants assigns the ID <code>default</code> to the\\n         default location <code>s3://</code> and assigns an auto-generated ID to other locations\\n         that you register. </p>\"\n                    }\n                },\n                \"AccessGrantsLocationArn\": {\n                    \"target\": \"com.amazonaws.s3control#AccessGrantsLocationArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the registered location that you are updating. </p>\"\n                    }\n                },\n                \"LocationScope\": {\n                    \"target\": \"com.amazonaws.s3control#S3Prefix\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The S3 URI path of the location that you are updating. You cannot update the scope of\\n         the registered location. The location scope can be the default S3 location\\n            <code>s3://</code>, the S3 path to a bucket <code>s3://<bucket></code>, or the S3\\n         path to a bucket and prefix <code>s3://<bucket>/<prefix></code>. </p>\"\n                    }\n                },\n                \"IAMRoleArn\": {\n                    \"target\": \"com.amazonaws.s3control#IAMRoleArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the IAM role of the registered location. S3 Access Grants\\n         assumes this role to manage access to the registered location. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.s3control#UpdateJobPriority\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#UpdateJobPriorityRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.s3control#UpdateJobPriorityResult\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.s3control#BadRequestException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#InternalServiceException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#NotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#TooManyRequestsException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Updates an existing S3 Batch Operations job's priority. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/batch-ops.html\\\">S3 Batch Operations</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <dl>\\n            <dt>Permissions</dt>\\n            <dd>\\n               <p>To use the <code>UpdateJobPriority</code> operation, you must have permission\\n                  to perform the <code>s3:UpdateJobPriority</code> action.</p>\\n            </dd>\\n         </dl>\\n         <p>Related actions include:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_CreateJob.html\\\">CreateJob</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_ListJobs.html\\\">ListJobs</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_DescribeJob.html\\\">DescribeJob</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_UpdateJobStatus.html\\\">UpdateJobStatus</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"POST\",\n                    \"uri\": \"/v20180820/jobs/{JobId}/priority\",\n                    \"code\": 200\n                },\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#UpdateJobPriorityRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID associated with the S3 Batch Operations job.</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                },\n                \"JobId\": {\n                    \"target\": \"com.amazonaws.s3control#JobId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID for the job whose priority you want to update.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Priority\": {\n                    \"target\": \"com.amazonaws.s3control#JobPriority\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The priority you want to assign to this job.</p>\",\n                        \"smithy.api#httpQuery\": \"priority\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#UpdateJobPriorityResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"JobId\": {\n                    \"target\": \"com.amazonaws.s3control#JobId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID for the job whose priority Amazon S3 updated.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Priority\": {\n                    \"target\": \"com.amazonaws.s3control#JobPriority\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The new priority assigned to the specified job.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.s3control#UpdateJobStatus\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#UpdateJobStatusRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.s3control#UpdateJobStatusResult\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.s3control#BadRequestException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#InternalServiceException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#JobStatusException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#NotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.s3control#TooManyRequestsException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Updates the status for the specified job. Use this operation to confirm that you want to\\n         run a job or to cancel an existing job. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/batch-ops.html\\\">S3 Batch Operations</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <dl>\\n            <dt>Permissions</dt>\\n            <dd>\\n               <p>To use the <code>UpdateJobStatus</code> operation, you must have permission to\\n                  perform the <code>s3:UpdateJobStatus</code> action.</p>\\n            </dd>\\n         </dl>\\n         <p>Related actions include:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_CreateJob.html\\\">CreateJob</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_ListJobs.html\\\">ListJobs</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_DescribeJob.html\\\">DescribeJob</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_UpdateJobStatus.html\\\">UpdateJobStatus</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"POST\",\n                    \"uri\": \"/v20180820/jobs/{JobId}/status\",\n                    \"code\": 200\n                },\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#UpdateJobStatusRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID associated with the S3 Batch Operations job.</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                },\n                \"JobId\": {\n                    \"target\": \"com.amazonaws.s3control#JobId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the job whose status you want to update.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"RequestedJobStatus\": {\n                    \"target\": \"com.amazonaws.s3control#RequestedJobStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The status that you want to move the specified job to.</p>\",\n                        \"smithy.api#httpQuery\": \"requestedJobStatus\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"StatusUpdateReason\": {\n                    \"target\": \"com.amazonaws.s3control#JobStatusUpdateReason\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A description of the reason why you want to change the specified job's status. This\\n         field can be any string up to the maximum length.</p>\",\n                        \"smithy.api#httpQuery\": \"statusUpdateReason\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#UpdateJobStatusResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"JobId\": {\n                    \"target\": \"com.amazonaws.s3control#JobId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID for the job whose status was updated.</p>\"\n                    }\n                },\n                \"Status\": {\n                    \"target\": \"com.amazonaws.s3control#JobStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The current status for the specified job.</p>\"\n                    }\n                },\n                \"StatusUpdateReason\": {\n                    \"target\": \"com.amazonaws.s3control#JobStatusUpdateReason\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The reason that the specified job's status was updated.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.s3control#UpdateStorageLensGroup\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.s3control#UpdateStorageLensGroupRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>\\nUpdates the existing Storage Lens group.</p>\\n         <p>To use this operation, you must have the permission to perform the\\n      <code>s3:UpdateStorageLensGroup</code> action. For more information about the required Storage Lens\\n      Groups permissions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage_lens_iam_permissions.html#storage_lens_groups_permissions\\\">Setting account permissions to use S3 Storage Lens groups</a>.</p>\\n         <p>For information about Storage Lens groups errors, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html#S3LensErrorCodeList\\\">List of Amazon S3 Storage\\n      Lens error codes</a>.</p>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n                \"smithy.api#endpoint\": {\n                    \"hostPrefix\": \"{AccountId}.\"\n                },\n                \"smithy.api#http\": {\n                    \"method\": \"PUT\",\n                    \"uri\": \"/v20180820/storagelensgroup/{Name}\",\n                    \"code\": 204\n                },\n                \"smithy.rules#staticContextParams\": {\n                    \"RequiresAccountId\": {\n                        \"value\": true\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.s3control#UpdateStorageLensGroupRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Name\": {\n                    \"target\": \"com.amazonaws.s3control#StorageLensGroupName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>\\nThe name of the Storage Lens group that you want to update.\\n</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"AccountId\": {\n                    \"target\": \"com.amazonaws.s3control#AccountId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>\\nThe Amazon Web Services account ID of the Storage Lens group owner.\\n</p>\",\n                        \"smithy.api#hostLabel\": {},\n                        \"smithy.api#httpHeader\": \"x-amz-account-id\",\n                        \"smithy.api#required\": {},\n                        \"smithy.rules#contextParam\": {\n                            \"name\": \"AccountId\"\n                        }\n                    }\n                },\n                \"StorageLensGroup\": {\n                    \"target\": \"com.amazonaws.s3control#StorageLensGroup\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>\\nThe JSON file that contains the Storage Lens group configuration.\\n</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.s3control#UserArguments\": {\n            \"type\": \"map\",\n            \"key\": {\n                \"target\": \"com.amazonaws.s3control#NonEmptyMaxLength64String\"\n            },\n            \"value\": {\n                \"target\": \"com.amazonaws.s3control#MaxLength1024String\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 10\n                }\n            }\n        },\n        \"com.amazonaws.s3control#VersioningConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"MFADelete\": {\n                    \"target\": \"com.amazonaws.s3control#MFADelete\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies whether MFA delete is enabled or disabled in the bucket versioning\\n         configuration for the S3 on Outposts bucket.</p>\",\n                        \"smithy.api#xmlName\": \"MfaDelete\"\n                    }\n                },\n                \"Status\": {\n                    \"target\": \"com.amazonaws.s3control#BucketVersioningStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Sets the versioning state of the S3 on Outposts bucket.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Describes the versioning state of an Amazon S3 on Outposts bucket. For more information, see\\n            <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_PutBucketVersioning.html\\\">PutBucketVersioning</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#VpcConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VpcId\": {\n                    \"target\": \"com.amazonaws.s3control#VpcId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If this field is specified, this access point will only allow connections from the specified VPC\\n         ID.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The virtual private cloud (VPC) configuration for an access point.</p>\"\n            }\n        },\n        \"com.amazonaws.s3control#VpcId\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 1024\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "aws/sdk/aws-models/s3.json",
    "content": "{\n  \"smithy\": \"2.0\",\n  \"metadata\": {\n    \"suppressions\": [\n      {\n        \"id\": \"HttpMethodSemantics\",\n        \"namespace\": \"*\"\n      },\n      {\n        \"id\": \"HttpResponseCodeSemantics\",\n        \"namespace\": \"*\"\n      },\n      {\n        \"id\": \"PaginatedTrait\",\n        \"namespace\": \"*\"\n      },\n      {\n        \"id\": \"HttpHeaderTrait\",\n        \"namespace\": \"*\"\n      },\n      {\n        \"id\": \"HttpUriConflict\",\n        \"namespace\": \"*\"\n      },\n      {\n        \"id\": \"Service\",\n        \"namespace\": \"*\"\n      }\n    ]\n  },\n  \"shapes\": {\n    \"aws.api#ArnNamespace\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#documentation\": \"A string representing a service's ARN namespace.\",\n        \"smithy.api#pattern\": \"^[a-z0-9.\\\\-]{1,63}$\",\n        \"smithy.api#private\": {}\n      }\n    },\n    \"aws.api#CloudFormationName\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#documentation\": \"A string representing a CloudFormation service name.\",\n        \"smithy.api#pattern\": \"^[A-Z][A-Za-z0-9]+$\",\n        \"smithy.api#private\": {}\n      }\n    },\n    \"aws.api#CloudWatchMetricNamespace\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#length\": {\n          \"min\": 1,\n          \"max\": 255\n        },\n        \"smithy.api#pattern\": \"^[^:].*$\",\n        \"smithy.api#private\": {}\n      }\n    },\n    \"aws.api#ResourceDelimiter\": {\n      \"type\": \"enum\",\n      \"members\": {\n        \"FORWARD_SLASH\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"The `/` character.\",\n            \"smithy.api#enumValue\": \"/\"\n          }\n        },\n        \"COLON\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"The `:` character.\",\n            \"smithy.api#enumValue\": \":\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"The possible delimiters for an ARN resource segment.\",\n        \"smithy.api#private\": {}\n      }\n    },\n    \"aws.api#TagOperationReference\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#documentation\": \"Points to an operation designated for a tagging APi\",\n        \"smithy.api#idRef\": {\n          \"failWhenMissing\": true,\n          \"selector\": \"resource > operation\"\n        }\n      }\n    },\n    \"aws.api#TaggableApiConfig\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"tagApi\": {\n          \"target\": \"aws.api#TagOperationReference\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"The `tagApi` property is a string value that references a non-instance\\nor create operation that creates or updates tags on the resource.\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"untagApi\": {\n          \"target\": \"aws.api#TagOperationReference\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"The `untagApi` property is a string value that references a non-instance\\noperation that removes tags on the resource.\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"listTagsApi\": {\n          \"target\": \"aws.api#TagOperationReference\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"The `listTagsApi` property is a string value that references a non-\\ninstance operation which gets the current tags on the resource.\",\n            \"smithy.api#required\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"Structure representing the configuration of resource specific tagging APIs\"\n      }\n    },\n    \"aws.api#arn\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"template\": {\n          \"target\": \"smithy.api#String\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"Defines the ARN template. The provided string contains URI-template\\nstyle label placeholders that contain the name of one of the identifiers\\ndefined in the `identifiers` property of the resource. These labels can\\nbe substituted at runtime with the actual identifiers of the resource.\\nEvery identifier name of the resource MUST have corresponding label of\\nthe same name. Note that percent-encoding **is not** performed on these\\nplaceholder values; they are to be replaced literally. For relative ARN\\ntemplates that have not set `absolute` to `true`, the template string\\ncontains only the resource part of the ARN (for example,\\n`foo/{MyResourceId}`). Relative ARNs MUST NOT start with \\\"/\\\".\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"absolute\": {\n          \"target\": \"smithy.api#Boolean\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"Set to true to indicate that the ARN template contains a fully-formed\\nARN that does not need to be merged with the service. This type of ARN\\nMUST be used when the identifier of a resource is an ARN or is based on\\nthe ARN identifier of a parent resource.\"\n          }\n        },\n        \"noRegion\": {\n          \"target\": \"smithy.api#Boolean\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"Set to true to specify that the ARN does not contain a region. If not\\nset, or if set to false, the resolved ARN will contain a placeholder\\nfor the region. This can only be set to true if `absolute` is not set\\nor is false.\"\n          }\n        },\n        \"noAccount\": {\n          \"target\": \"smithy.api#Boolean\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"Set to true to specify that the ARN does not contain an account ID. If\\nnot set, or if set to false, the resolved ARN will contain a placeholder\\nfor the customer account ID. This can only be set to true if absolute\\nis not set or is false.\"\n          }\n        },\n        \"resourceDelimiter\": {\n          \"target\": \"aws.api#ResourceDelimiter\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"Defines which character is used to delimit sections of the resource\\nsegment of an ARN. This can only be set if absolute is set to true.\"\n          }\n        },\n        \"reusable\": {\n          \"target\": \"smithy.api#Boolean\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"Set to true to indicate that an ARN may be reused for different\\ninstances of a resource.\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"Specifies an ARN template for the resource.\",\n        \"smithy.api#externalDocumentation\": {\n          \"Reference\": \"https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html\"\n        },\n        \"smithy.api#trait\": {\n          \"selector\": \"resource\"\n        }\n      }\n    },\n    \"aws.api#arnReference\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"type\": {\n          \"target\": \"smithy.api#String\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"The AWS CloudFormation resource type contained in the ARN.\"\n          }\n        },\n        \"resource\": {\n          \"target\": \"smithy.api#String\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"An absolute shape ID that references the Smithy resource type contained\\nin the ARN (e.g., `com.foo#SomeResource`). The targeted resource is not\\nrequired to be found in the model, allowing for external shapes to be\\nreferenced without needing to take on an additional dependency. If the\\nshape is found in the model, it MUST target a resource shape, and the\\nresource MUST be found within the closure of the referenced service\\nshape.\"\n          }\n        },\n        \"service\": {\n          \"target\": \"smithy.api#String\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"The Smithy service absolute shape ID that is referenced by the ARN. The\\ntargeted service is not required to be found in the model, allowing for\\nexternal shapes to be referenced without needing to take on an\\nadditional dependency.\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"Marks a string as containing an ARN.\",\n        \"smithy.api#trait\": {\n          \"selector\": \"string\"\n        }\n      }\n    },\n    \"aws.api#clientDiscoveredEndpoint\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"required\": {\n          \"target\": \"smithy.api#Boolean\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"This field denotes whether or not this operation requires the use of a\\nspecific endpoint. If this field is false, the standard regional\\nendpoint for a service can handle this request. The client will start\\nsending requests to the standard regional endpoint while working to\\ndiscover a more specific endpoint.\",\n            \"smithy.api#required\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"Indicates that the target operation should use the client's endpoint\\ndiscovery logic.\",\n        \"smithy.api#trait\": {\n          \"selector\": \"operation\"\n        }\n      }\n    },\n    \"aws.api#clientEndpointDiscovery\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"operation\": {\n          \"target\": \"smithy.api#String\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"Indicates the operation that clients should use to discover endpoints\\nfor the service.\",\n            \"smithy.api#idRef\": {\n              \"failWhenMissing\": true,\n              \"selector\": \"operation\"\n            },\n            \"smithy.api#required\": {}\n          }\n        },\n        \"error\": {\n          \"target\": \"smithy.api#String\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"Indicates the error that tells clients that the endpoint they are using\\nis no longer valid. This error MUST be bound to any operation bound to\\nthe service which is marked with the aws.api#clientDiscoveredEndpoint\\ntrait.\",\n            \"smithy.api#idRef\": {\n              \"failWhenMissing\": true,\n              \"selector\": \"structure[trait|error]\"\n            },\n            \"smithy.api#recommended\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"Configures endpoint discovery for the service.\",\n        \"smithy.api#trait\": {\n          \"selector\": \"service\"\n        }\n      }\n    },\n    \"aws.api#clientEndpointDiscoveryId\": {\n      \"type\": \"structure\",\n      \"members\": {},\n      \"traits\": {\n        \"smithy.api#documentation\": \"Indicates members of the operation input which should be use to discover\\nendpoints.\",\n        \"smithy.api#trait\": {\n          \"selector\": \"operation[trait|aws.api#clientDiscoveredEndpoint] -[input]->\\nstructure > :test(member[trait|required] > string)\"\n        }\n      }\n    },\n    \"aws.api#controlPlane\": {\n      \"type\": \"structure\",\n      \"members\": {},\n      \"traits\": {\n        \"smithy.api#documentation\": \"Defines a service, resource, or operation as operating on the control plane.\",\n        \"smithy.api#trait\": {\n          \"selector\": \":test(service, resource, operation)\",\n          \"conflicts\": [\"aws.api#dataPlane\"]\n        }\n      }\n    },\n    \"aws.api#data\": {\n      \"type\": \"enum\",\n      \"members\": {\n        \"CUSTOMER_CONTENT\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"Customer content means any software (including machine images), data,\\ntext, audio, video or images that customers or any customer end user\\ntransfers to AWS for processing, storage or hosting by AWS services in\\nconnection with the customer’s accounts and any computational results\\nthat customers or any customer end user derive from the foregoing\\nthrough their use of AWS services.\",\n            \"smithy.api#enumValue\": \"content\"\n          }\n        },\n        \"CUSTOMER_ACCOUNT_INFORMATION\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"Account information means information about customers that customers\\nprovide to AWS in connection with the creation or administration of\\ncustomers’ accounts.\",\n            \"smithy.api#enumValue\": \"account\"\n          }\n        },\n        \"SERVICE_ATTRIBUTES\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"Service Attributes means service usage data related to a customer’s\\naccount, such as resource identifiers, metadata tags, security and\\naccess roles, rules, usage policies, permissions, usage statistics,\\nlogging data, and analytics.\",\n            \"smithy.api#enumValue\": \"usage\"\n          }\n        },\n        \"TAG_DATA\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"Designates metadata tags applied to AWS resources.\",\n            \"smithy.api#enumValue\": \"tagging\"\n          }\n        },\n        \"PERMISSIONS_DATA\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"Designates security and access roles, rules, usage policies, and\\npermissions.\",\n            \"smithy.api#enumValue\": \"permissions\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"Designates the target as containing data of a known classification level.\",\n        \"smithy.api#trait\": {\n          \"selector\": \":test(simpleType, list, structure, union, member)\"\n        }\n      }\n    },\n    \"aws.api#dataPlane\": {\n      \"type\": \"structure\",\n      \"members\": {},\n      \"traits\": {\n        \"smithy.api#documentation\": \"Defines a service, resource, or operation as operating on the data plane.\",\n        \"smithy.api#trait\": {\n          \"selector\": \":test(service, resource, operation)\",\n          \"conflicts\": [\"aws.api#controlPlane\"]\n        }\n      }\n    },\n    \"aws.api#service\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"sdkId\": {\n          \"target\": \"smithy.api#String\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"The `sdkId` property is a required string value that specifies the AWS\\nSDK service ID (e.g., \\\"API Gateway\\\"). This value is used for generating\\nclient names in SDKs and for linking between services.\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"arnNamespace\": {\n          \"target\": \"aws.api#ArnNamespace\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"The `arnNamespace` property is a string value that defines the ARN service\\nnamespace of the service (e.g., \\\"apigateway\\\"). This value is used in\\nARNs assigned to resources in the service. If not set, this value\\ndefaults to the lowercase name of the service shape.\"\n          }\n        },\n        \"cloudFormationName\": {\n          \"target\": \"aws.api#CloudFormationName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"The `cloudFormationName` property is a string value that specifies the\\nAWS CloudFormation service name (e.g., `ApiGateway`). When not set,\\nthis value defaults to the name of the service shape. This value is\\npart of the CloudFormation resource type name that is automatically\\nassigned to resources in the service (e.g., `AWS::<NAME>::resourceName`).\"\n          }\n        },\n        \"cloudTrailEventSource\": {\n          \"target\": \"smithy.api#String\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"The `cloudTrailEventSource` property is a string value that defines the\\nAWS customer-facing eventSource property contained in CloudTrail event\\nrecords emitted by the service. If not specified, this value defaults\\nto the `arnNamespace` plus `.amazonaws.com`.\"\n          }\n        },\n        \"docId\": {\n          \"target\": \"smithy.api#String\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"The `docId` property is a string value that defines the identifier\\nused to implemention linking between service and SDK documentation for\\nAWS services. If not specified, this value defaults to the `sdkId` in\\nlower case plus the service `version` property, separated by dashes.\"\n          }\n        },\n        \"endpointPrefix\": {\n          \"target\": \"smithy.api#String\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"The `endpointPrefix` property is a string value that identifies which\\nendpoint in a given region should be used to connect to the service.\\nFor example, most services in the AWS standard partition have endpoints\\nwhich follow the format: `{endpointPrefix}.{region}.amazonaws.com`. A\\nservice with the endpoint prefix example in the region us-west-2 might\\nhave the endpoint example.us-west-2.amazonaws.com.\\n\\nThis value is not unique across services and is subject to change.\\nTherefore, it MUST NOT be used for client naming or for any other\\npurpose that requires a static, unique identifier. sdkId should be used\\nfor those purposes. Additionally, this value can be used to attempt to\\nresolve endpoints.\"\n          }\n        },\n        \"cloudWatchNamespace\": {\n          \"target\": \"aws.api#CloudWatchMetricNamespace\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"The `cloudWatchNamespace` property is a string value that defines the\\nAWS customer-facing namespace of most metrics emitted by the service.\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"An AWS service is defined using the `aws.api#service` trait. This trait\\nprovides information about the service like the name used to generate AWS\\nSDK client classes and the namespace used in ARNs.\",\n        \"smithy.api#trait\": {\n          \"selector\": \"service\"\n        }\n      }\n    },\n    \"aws.api#tagEnabled\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"disableDefaultOperations\": {\n          \"target\": \"smithy.api#Boolean\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"The `disableDefaultOperations` property is a boolean value that specifies\\nif the service does not have the standard tag operations supporting all\\nresources on the service. Default value is `false`\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"Annotates a service as having tagging on 1 or more resources and associated\\nAPIs to perform CRUD operations on those tags\",\n        \"smithy.api#trait\": {\n          \"selector\": \"service\"\n        },\n        \"smithy.api#unstable\": {}\n      }\n    },\n    \"aws.api#taggable\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"property\": {\n          \"target\": \"smithy.api#String\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"The `property` property is a string value that identifies which\\nresource property represents tags for the resource.\"\n          }\n        },\n        \"apiConfig\": {\n          \"target\": \"aws.api#TaggableApiConfig\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"Specifies configuration for resource specific tagging APIs if the\\nresource has them.\"\n          }\n        },\n        \"disableSystemTags\": {\n          \"target\": \"smithy.api#Boolean\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"Flag indicating if the resource is not able to carry AWS system level.\\nUsed by service principals. Default value is `false`\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"Indicates a resource supports CRUD operations for tags. Either through\\nresource lifecycle or instance operations or tagging operations on the\\nservice.\",\n        \"smithy.api#trait\": {\n          \"selector\": \"resource\"\n        },\n        \"smithy.api#unstable\": {}\n      }\n    },\n    \"aws.auth#StringList\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"smithy.api#String\"\n      },\n      \"traits\": {\n        \"smithy.api#private\": {}\n      }\n    },\n    \"aws.auth#cognitoUserPools\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"providerArns\": {\n          \"target\": \"aws.auth#StringList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"A list of the Amazon Cognito user pool ARNs. Each element is of this\\nformat: `arn:aws:cognito-idp:{region}:{account_id}:userpool/{user_pool_id}`.\",\n            \"smithy.api#required\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#authDefinition\": {},\n        \"smithy.api#documentation\": \"Configures an Amazon Cognito User Pools auth scheme.\",\n        \"smithy.api#internal\": {},\n        \"smithy.api#tags\": [\"internal\"],\n        \"smithy.api#trait\": {\n          \"selector\": \"service\"\n        }\n      }\n    },\n    \"aws.auth#sigv4\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"name\": {\n          \"target\": \"smithy.api#String\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"The signature version 4 service signing name to use in the credential\\nscope when signing requests. This value SHOULD match the `arnNamespace`\\nproperty of the `aws.api#service` trait if present and the `name`\\nproperty of the `aws.api#sigv4a` trait if present.\",\n            \"smithy.api#externalDocumentation\": {\n              \"Reference\": \"https://docs.aws.amazon.com/general/latest/gr/sigv4-create-string-to-sign.html\"\n            },\n            \"smithy.api#length\": {\n              \"min\": 1\n            },\n            \"smithy.api#required\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#authDefinition\": {\n          \"traits\": [\"aws.auth#unsignedPayload\"]\n        },\n        \"smithy.api#documentation\": \"[Signature Version 4](https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html)\\nis the process to add authentication information to AWS requests sent by HTTP. For\\nsecurity, most requests to AWS must be signed with an access key, which consists\\nof an access key ID and secret access key. These two keys are commonly referred to\\nas your security credentials.\",\n        \"smithy.api#externalDocumentation\": {\n          \"Reference\": \"https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html\"\n        },\n        \"smithy.api#trait\": {\n          \"selector\": \"service\",\n          \"breakingChanges\": [\n            {\n              \"change\": \"remove\",\n              \"message\": \"Removing the existing authentication scheme is not backward compatible and can break existing clients' authentication.\"\n            }\n          ]\n        }\n      }\n    },\n    \"aws.auth#sigv4a\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"name\": {\n          \"target\": \"smithy.api#String\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"The signature version 4a service signing name to use in the credential\\nscope when signing requests. This value SHOULD match the `arnNamespace`\\nproperty of the `aws.api#service` trait if present and the `name`\\nproperty of the `aws.api#sigv4` trait.\",\n            \"smithy.api#externalDocumentation\": {\n              \"Reference\": \"https://docs.aws.amazon.com/general/latest/gr/sigv4-create-string-to-sign.html\"\n            },\n            \"smithy.api#length\": {\n              \"min\": 1\n            },\n            \"smithy.api#required\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#authDefinition\": {\n          \"traits\": [\"aws.auth#unsignedPayload\"]\n        },\n        \"smithy.api#documentation\": \"Signature Version 4 Asymmetric (SigV4A), an extension of Signature Version 4 (SigV4), is the\\nprocess to add authentication information to AWS requests sent by HTTP. SigV4A is nearly\\nidentical to SigV4, but also uses public-private keys and asymmetric cryptographic signatures\\nfor every request. Most notably, SigV4A supports signatures for multi-region API requests.\",\n        \"smithy.api#externalDocumentation\": {\n          \"Reference\": \"https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html\",\n          \"Examples\": \"https://github.com/aws-samples/sigv4a-signing-examples\"\n        },\n        \"smithy.api#trait\": {\n          \"selector\": \"service[trait|aws.auth#sigv4]\",\n          \"breakingChanges\": [\n            {\n              \"change\": \"remove\",\n              \"message\": \"Removing the existing authentication scheme is not backward compatible and can break existing clients' authentication.\"\n            }\n          ]\n        }\n      }\n    },\n    \"aws.auth#unsignedPayload\": {\n      \"type\": \"structure\",\n      \"members\": {},\n      \"traits\": {\n        \"smithy.api#documentation\": \"Indicates that the request payload of a signed request is not to be used\\nas part of the signature.\",\n        \"smithy.api#trait\": {\n          \"selector\": \"operation\"\n        }\n      }\n    },\n    \"aws.cloudformation#StructureIdList\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"smithy.api#String\",\n        \"traits\": {\n          \"smithy.api#idRef\": {\n            \"failWhenMissing\": true,\n            \"selector\": \"structure\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#private\": {}\n      }\n    },\n    \"aws.cloudformation#cfnAdditionalIdentifier\": {\n      \"type\": \"structure\",\n      \"members\": {},\n      \"traits\": {\n        \"smithy.api#documentation\": \"Indicates that the CloudFormation property generated from this member is an\\nadditional identifier for the resource.\",\n        \"smithy.api#trait\": {\n          \"selector\": \"structure > :test(member > string)\",\n          \"conflicts\": [\"aws.cloudformation#cfnExcludeProperty\"],\n          \"breakingChanges\": [\n            {\n              \"change\": \"remove\"\n            }\n          ]\n        },\n        \"smithy.api#unstable\": {}\n      }\n    },\n    \"aws.cloudformation#cfnDefaultValue\": {\n      \"type\": \"structure\",\n      \"members\": {},\n      \"traits\": {\n        \"smithy.api#documentation\": \"Indicates that a structure member has a default value\\nfor the property of the CloudFormation resource.\",\n        \"smithy.api#trait\": {\n          \"selector\": \"resource > operation -[input, output]-> structure > member\",\n          \"conflicts\": [\"aws.cloudformation#cfnExcludeProperty\"]\n        },\n        \"smithy.api#unstable\": {}\n      }\n    },\n    \"aws.cloudformation#cfnExcludeProperty\": {\n      \"type\": \"structure\",\n      \"members\": {},\n      \"traits\": {\n        \"smithy.api#documentation\": \"Indicates that a structure member should not be included in generated\\nCloudFormation resource definitions.\",\n        \"smithy.api#trait\": {\n          \"selector\": \"structure > member\",\n          \"conflicts\": [\n            \"aws.cloudformation#cfnAdditionalIdentifier\",\n            \"aws.cloudformation#cfnMutability\",\n            \"aws.cloudformation#cfnDefaultValue\"\n          ],\n          \"breakingChanges\": [\n            {\n              \"change\": \"add\"\n            }\n          ]\n        },\n        \"smithy.api#unstable\": {}\n      }\n    },\n    \"aws.cloudformation#cfnMutability\": {\n      \"type\": \"enum\",\n      \"members\": {\n        \"FULL\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"Indicates that the CloudFormation property generated from this\\nmember does not have any mutability restrictions, meaning that it\\ncan be specified by the user and returned in a `read` or `list`\\nrequest.\",\n            \"smithy.api#enumValue\": \"full\"\n          }\n        },\n        \"CREATE_AND_READ\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"Indicates that the CloudFormation property generated from this\\nmember can be specified only during resource creation and can be\\nreturned in a `read` or `list` request.\",\n            \"smithy.api#enumValue\": \"create-and-read\"\n          }\n        },\n        \"CREATE\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"Indicates that the CloudFormation property generated from this\\nmember can be specified only during resource creation and cannot\\nbe returned in a `read` or `list` request. MUST NOT be set if the\\nmember is also marked with the `@additionalIdentifier` trait.\",\n            \"smithy.api#enumValue\": \"create\"\n          }\n        },\n        \"READ\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"Indicates that the CloudFormation property generated from this\\nmember can be returned by a `read` or `list` request, but\\ncannot be set by the user.\",\n            \"smithy.api#enumValue\": \"read\"\n          }\n        },\n        \"WRITE\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"Indicates that the CloudFormation property generated from this\\nmember can be specified by the user, but cannot be returned by a\\n`read` or `list` request. MUST NOT be set if the member is also\\nmarked with the `@additionalIdentifier` trait.\",\n            \"smithy.api#enumValue\": \"write\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"Indicates an explicit CloudFormation mutability of the structure member\\nwhen part of a CloudFormation resource.\",\n        \"smithy.api#trait\": {\n          \"selector\": \"structure > member\",\n          \"conflicts\": [\"aws.cloudformation#cfnExcludeProperty\"]\n        },\n        \"smithy.api#unstable\": {}\n      }\n    },\n    \"aws.cloudformation#cfnName\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#documentation\": \"The cloudFormationName trait allows a CloudFormation resource property name\\nto differ from a structure member name used in the model.\",\n        \"smithy.api#trait\": {\n          \"selector\": \"structure > member\",\n          \"breakingChanges\": [\n            {\n              \"change\": \"any\"\n            }\n          ]\n        },\n        \"smithy.api#unstable\": {}\n      }\n    },\n    \"aws.cloudformation#cfnResource\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"name\": {\n          \"target\": \"smithy.api#String\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"Provides a custom CloudFormation resource name.\"\n          }\n        },\n        \"additionalSchemas\": {\n          \"target\": \"aws.cloudformation#StructureIdList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"A list of additional shape IDs of structures that will have their\\nproperties added to the CloudFormation resource.\"\n          }\n        },\n        \"primaryIdentifier\": {\n          \"target\": \"smithy.api#String\",\n          \"traits\": {\n            \"smithy.api#deprecated\": {\n              \"message\": \"Prefer the resource's identifiers when generating resource schemas.\"\n            },\n            \"smithy.api#documentation\": \"An alternative resource property to use as the primary identifier\\nfor the CloudFormation resource. The value MUST be the name of a\\nproperty on the resource shape that targets a string shape.\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"Indicates that a Smithy resource is a CloudFormation resource.\",\n        \"smithy.api#trait\": {\n          \"selector\": \"resource\",\n          \"breakingChanges\": [\n            {\n              \"change\": \"presence\"\n            }\n          ]\n        },\n        \"smithy.api#unstable\": {}\n      }\n    },\n    \"aws.customizations#s3UnwrappedXmlOutput\": {\n      \"type\": \"structure\",\n      \"members\": {},\n      \"traits\": {\n        \"smithy.api#documentation\": \"Indicates the response body from S3 is not wrapped in the\\naws-restxml-protocol operation-level XML node. Intended to only be used by\\nAWS S3.\",\n        \"smithy.api#trait\": {\n          \"selector\": \"operation\"\n        }\n      }\n    },\n    \"aws.endpoints#PartitionEndpointPattern\": {\n      \"type\": \"enum\",\n      \"members\": {\n        \"SERVICE_DNSSUFFIX\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#deprecated\": {\n              \"since\": \"2025-04-01\",\n              \"message\": \"Not recommended to use. Use AWS_RECOMMENDED instead\"\n            },\n            \"smithy.api#enumValue\": \"service_dnsSuffix\"\n          }\n        },\n        \"SERVICE_REGION_DNSSUFFIX\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#deprecated\": {\n              \"since\": \"2025-04-01\",\n              \"message\": \"Not recommended to use. Use AWS_RECOMMENDED instead\"\n            },\n            \"smithy.api#enumValue\": \"service_region_dnsSuffix\"\n          }\n        },\n        \"AWS_RECOMMENDED\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"aws_recommended\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#private\": {}\n      }\n    },\n    \"aws.endpoints#PartitionEndpointSpecialCase\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"endpoint\": {\n          \"target\": \"smithy.api#String\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"The special-cased endpoint pattern.\"\n          }\n        },\n        \"region\": {\n          \"target\": \"smithy.api#String\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"The region to override the defaultGlobalRegion used in this partition.\"\n          }\n        },\n        \"dualStack\": {\n          \"target\": \"smithy.api#Boolean\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"When true, the special case will apply to dualstack endpoint variants.\"\n          }\n        },\n        \"fips\": {\n          \"target\": \"smithy.api#Boolean\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"When true, the special case will apply to fips endpoint variants.\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"Defines the endpoint pattern to apply for a partitional endpoint.\",\n        \"smithy.api#private\": {}\n      }\n    },\n    \"aws.endpoints#PartitionEndpointSpecialCaseList\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"aws.endpoints#PartitionEndpointSpecialCase\"\n      },\n      \"traits\": {\n        \"smithy.api#private\": {}\n      }\n    },\n    \"aws.endpoints#PartitionEndpointSpecialCaseMap\": {\n      \"type\": \"map\",\n      \"key\": {\n        \"target\": \"smithy.api#String\"\n      },\n      \"value\": {\n        \"target\": \"aws.endpoints#PartitionEndpointSpecialCaseList\"\n      },\n      \"traits\": {\n        \"smithy.api#private\": {}\n      }\n    },\n    \"aws.endpoints#PartitionSpecialCase\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"endpoint\": {\n          \"target\": \"smithy.api#String\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"The special-cased endpoint pattern.\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"dualStack\": {\n          \"target\": \"smithy.api#Boolean\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"When true, the special case will apply to dualstack endpoint variants.\"\n          }\n        },\n        \"fips\": {\n          \"target\": \"smithy.api#Boolean\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"When true, the special case will apply to fips endpoint variants.\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"Defines the endpoint pattern to apply for all regional endpoints in the given partition.\",\n        \"smithy.api#private\": {}\n      }\n    },\n    \"aws.endpoints#PartitionSpecialCaseList\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"aws.endpoints#PartitionSpecialCase\"\n      },\n      \"traits\": {\n        \"smithy.api#private\": {}\n      }\n    },\n    \"aws.endpoints#PartitionSpecialCaseMap\": {\n      \"type\": \"map\",\n      \"key\": {\n        \"target\": \"smithy.api#String\"\n      },\n      \"value\": {\n        \"target\": \"aws.endpoints#PartitionSpecialCaseList\"\n      },\n      \"traits\": {\n        \"smithy.api#private\": {}\n      }\n    },\n    \"aws.endpoints#RegionSpecialCase\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"endpoint\": {\n          \"target\": \"smithy.api#String\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"The special-cased endpoint pattern.\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"dualStack\": {\n          \"target\": \"smithy.api#Boolean\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"When true, the special case will apply to dualstack endpoint variants.\"\n          }\n        },\n        \"fips\": {\n          \"target\": \"smithy.api#Boolean\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"When true, the special case will apply to fips endpoint variants.\"\n          }\n        },\n        \"signingRegion\": {\n          \"target\": \"smithy.api#String\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"Overrides the signingRegion used for this region.\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"Defines the endpoint pattern to apply for a region.\",\n        \"smithy.api#private\": {}\n      }\n    },\n    \"aws.endpoints#RegionSpecialCaseList\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"aws.endpoints#RegionSpecialCase\"\n      },\n      \"traits\": {\n        \"smithy.api#private\": {}\n      }\n    },\n    \"aws.endpoints#RegionSpecialCaseMap\": {\n      \"type\": \"map\",\n      \"key\": {\n        \"target\": \"smithy.api#String\"\n      },\n      \"value\": {\n        \"target\": \"aws.endpoints#RegionSpecialCaseList\"\n      },\n      \"traits\": {\n        \"smithy.api#private\": {}\n      }\n    },\n    \"aws.endpoints#dualStackOnlyEndpoints\": {\n      \"type\": \"structure\",\n      \"members\": {},\n      \"traits\": {\n        \"aws.endpoints#endpointsModifier\": {},\n        \"smithy.api#documentation\": \"Marks that a services has only dualStack endpoints.\",\n        \"smithy.api#trait\": {\n          \"selector\": \"service\",\n          \"breakingChanges\": [\n            {\n              \"change\": \"any\"\n            }\n          ]\n        }\n      }\n    },\n    \"aws.endpoints#endpointsModifier\": {\n      \"type\": \"structure\",\n      \"members\": {},\n      \"traits\": {\n        \"smithy.api#documentation\": \"Marks a trait as an endpoints modifier defining trait.\\n\\nThe targeted trait must only be applied to service shapes,\\nmust be a structure, and must have the `trait` trait.\",\n        \"smithy.api#trait\": {\n          \"selector\": \"structure[trait|trait]\",\n          \"breakingChanges\": [\n            {\n              \"change\": \"presence\"\n            }\n          ]\n        }\n      }\n    },\n    \"aws.endpoints#rulesBasedEndpoints\": {\n      \"type\": \"structure\",\n      \"members\": {},\n      \"traits\": {\n        \"aws.endpoints#endpointsModifier\": {},\n        \"smithy.api#documentation\": \"Marks that a services has hand written endpoint rules.\",\n        \"smithy.api#trait\": {\n          \"selector\": \"service\",\n          \"breakingChanges\": [\n            {\n              \"change\": \"any\"\n            }\n          ]\n        },\n        \"smithy.api#unstable\": {}\n      }\n    },\n    \"aws.endpoints#standardPartitionalEndpoints\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"endpointPatternType\": {\n          \"target\": \"aws.endpoints#PartitionEndpointPattern\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"The pattern type to use for the partition endpoint.\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"partitionEndpointSpecialCases\": {\n          \"target\": \"aws.endpoints#PartitionEndpointSpecialCaseMap\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"A map of partition to a list of partition endpoint special cases -\\npartitions that do not follow the services standard patterns or are\\nlocated in a region other than the partition's defaultGlobalRegion.\"\n          }\n        }\n      },\n      \"traits\": {\n        \"aws.endpoints#endpointsModifier\": {},\n        \"smithy.api#documentation\": \"Marks that a services is non-regionalized and has\\na single endpoint in each partition.\",\n        \"smithy.api#trait\": {\n          \"selector\": \"service\",\n          \"conflicts\": [\"aws.endpoints#standardRegionalEndpoints\"],\n          \"breakingChanges\": [\n            {\n              \"change\": \"any\"\n            }\n          ]\n        }\n      }\n    },\n    \"aws.endpoints#standardRegionalEndpoints\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"partitionSpecialCases\": {\n          \"target\": \"aws.endpoints#PartitionSpecialCaseMap\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"A map of partition to partition special cases -\\nendpoints for a partition that do not follow the standard patterns.\"\n          }\n        },\n        \"regionSpecialCases\": {\n          \"target\": \"aws.endpoints#RegionSpecialCaseMap\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"A map of region to regional special cases -\\nendpoints for a region that do not follow the standard patterns.\"\n          }\n        }\n      },\n      \"traits\": {\n        \"aws.endpoints#endpointsModifier\": {},\n        \"smithy.api#documentation\": \"Marks that a services endpoints should be resolved using\\nstandard regional endpoint patterns.\",\n        \"smithy.api#trait\": {\n          \"selector\": \"service\",\n          \"conflicts\": [\"aws.endpoints#standardPartitionalEndpoints\"],\n          \"breakingChanges\": [\n            {\n              \"change\": \"remove\"\n            }\n          ]\n        }\n      }\n    },\n    \"aws.iam#ActionResource\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"conditionKeys\": {\n          \"target\": \"aws.iam#ConditionKeysList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"The condition keys used for authorizing against this resource.\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"Contains information about a resource an IAM action can be authorized against.\",\n        \"smithy.api#private\": {}\n      }\n    },\n    \"aws.iam#ActionResourceMap\": {\n      \"type\": \"map\",\n      \"key\": {\n        \"target\": \"aws.iam#ResourceName\"\n      },\n      \"value\": {\n        \"target\": \"aws.iam#ActionResource\"\n      },\n      \"traits\": {\n        \"smithy.api#private\": {}\n      }\n    },\n    \"aws.iam#ActionResources\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"required\": {\n          \"target\": \"aws.iam#ActionResourceMap\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"Resources that will always be authorized against for functionality of the IAM action.\"\n          }\n        },\n        \"optional\": {\n          \"target\": \"aws.iam#ActionResourceMap\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"Resources that will be authorized against based on optional behavior of the IAM action.\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"A container for information on the resources that an IAM action may be authorized against.\",\n        \"smithy.api#private\": {}\n      }\n    },\n    \"aws.iam#ConditionKeyDefinition\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"type\": {\n          \"target\": \"aws.iam#ConditionKeyType\",\n          \"traits\": {\n            \"smithy.api#required\": {}\n          }\n        },\n        \"documentation\": {\n          \"target\": \"smithy.api#String\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"Defines documentation about the condition key.\"\n          }\n        },\n        \"externalDocumentation\": {\n          \"target\": \"smithy.api#String\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"A valid URL that defines more information about the condition key.\"\n          }\n        },\n        \"relativeDocumentation\": {\n          \"target\": \"smithy.api#String\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"A relative URL path that defines more information about the condition key\\nwithin a set of IAM-related documentation.\"\n          }\n        },\n        \"required\": {\n          \"target\": \"smithy.api#Boolean\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"Whether a service resolved condition key is required.\\nRequest resolved condition keys MUST use the @required trait.\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"A defined condition key to appear within a service in addition to inferred and global condition keys.\",\n        \"smithy.api#private\": {}\n      }\n    },\n    \"aws.iam#ConditionKeyName\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#pattern\": \"^(([A-Za-z0-9][A-Za-z0-9-\\\\.]{0,62}:)?[^:\\\\s]+)$\",\n        \"smithy.api#private\": {}\n      }\n    },\n    \"aws.iam#ConditionKeyType\": {\n      \"type\": \"enum\",\n      \"members\": {\n        \"ARN\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"A String type that contains an Amazon Resource Name (ARN).\",\n            \"smithy.api#enumValue\": \"ARN\"\n          }\n        },\n        \"ARRAY_OF_ARN\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"An unordered list of ARN types.\",\n            \"smithy.api#enumValue\": \"ArrayOfARN\"\n          }\n        },\n        \"BINARY\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"A String type that contains base-64 encoded binary data.\",\n            \"smithy.api#enumValue\": \"Binary\"\n          }\n        },\n        \"ARRAY_OF_BINARY\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"An unordered list of Binary types.\",\n            \"smithy.api#enumValue\": \"ArrayOfBinary\"\n          }\n        },\n        \"STRING\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"A general string type.\",\n            \"smithy.api#enumValue\": \"String\"\n          }\n        },\n        \"ARRAY_OF_STRING\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"An unordered list of String types.\",\n            \"smithy.api#enumValue\": \"ArrayOfString\"\n          }\n        },\n        \"NUMERIC\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"A general type for integers and floats.\",\n            \"smithy.api#enumValue\": \"Numeric\"\n          }\n        },\n        \"ARRAY_OF_NUMERIC\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"An unordered list of Numeric types.\",\n            \"smithy.api#enumValue\": \"ArrayOfNumeric\"\n          }\n        },\n        \"DATE\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"A String type that conforms to the datetime profile of ISO 8601.\",\n            \"smithy.api#enumValue\": \"Date\"\n          }\n        },\n        \"ARRAY_OF_DATE\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"An unordered list of Date types.\",\n            \"smithy.api#enumValue\": \"ArrayOfDate\"\n          }\n        },\n        \"BOOL\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"A general boolean type.\",\n            \"smithy.api#enumValue\": \"Bool\"\n          }\n        },\n        \"ARRAY_OF_BOOL\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"An unordered list of Bool types.\",\n            \"smithy.api#enumValue\": \"ArrayOfBool\"\n          }\n        },\n        \"IP_ADDRESS\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"A String type that conforms to RFC 4632.\",\n            \"smithy.api#enumValue\": \"IPAddress\"\n          }\n        },\n        \"ARRAY_OF_IP_ADDRESS\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"An unordered list of IPAddress types.\",\n            \"smithy.api#enumValue\": \"ArrayOfIPAddress\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"The IAM policy type of the value that will supplied for this context key\",\n        \"smithy.api#private\": {}\n      }\n    },\n    \"aws.iam#ConditionKeysList\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"smithy.api#String\"\n      },\n      \"traits\": {\n        \"smithy.api#private\": {},\n        \"smithy.api#uniqueItems\": {}\n      }\n    },\n    \"aws.iam#IamIdentifier\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#pattern\": \"^([A-Za-z0-9][A-Za-z0-9-\\\\.]{0,62}:[^:]+)$\",\n        \"smithy.api#private\": {}\n      }\n    },\n    \"aws.iam#PrincipalType\": {\n      \"type\": \"enum\",\n      \"members\": {\n        \"ROOT\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"An AWS account.\",\n            \"smithy.api#enumValue\": \"Root\"\n          }\n        },\n        \"IAM_USER\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"An AWS IAM user.\",\n            \"smithy.api#enumValue\": \"IAMUser\"\n          }\n        },\n        \"IAM_ROLE\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"An AWS IAM role.\",\n            \"smithy.api#enumValue\": \"IAMRole\"\n          }\n        },\n        \"FEDERATED_USER\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"A federated user session.\",\n            \"smithy.api#enumValue\": \"FederatedUser\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"An IAM policy principal type.\",\n        \"smithy.api#private\": {}\n      }\n    },\n    \"aws.iam#RequiredActionsList\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"aws.iam#IamIdentifier\"\n      },\n      \"traits\": {\n        \"smithy.api#private\": {},\n        \"smithy.api#uniqueItems\": {}\n      }\n    },\n    \"aws.iam#ResourceName\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#private\": {}\n      }\n    },\n    \"aws.iam#ResourceNameList\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"aws.iam#ResourceName\"\n      },\n      \"traits\": {\n        \"smithy.api#private\": {},\n        \"smithy.api#uniqueItems\": {}\n      }\n    },\n    \"aws.iam#actionName\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#deprecated\": {\n          \"since\": \"2023-11-10\",\n          \"message\": \"Use the `name` member of the `aws.iam#iamAction` trait instead.\"\n        },\n        \"smithy.api#documentation\": \"Provides a custom IAM action name. By default, the action name is the same as the operation name.\",\n        \"smithy.api#trait\": {\n          \"selector\": \"operation\"\n        }\n      }\n    },\n    \"aws.iam#actionPermissionDescription\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#deprecated\": {\n          \"since\": \"2023-11-10\",\n          \"message\": \"Use the `documentation` member of the `aws.iam#iamAction` trait instead.\"\n        },\n        \"smithy.api#documentation\": \"A brief description of what granting the user permission to invoke an operation would entail.\\nThis description should begin with something similar to 'Enables the user to...' or 'Grants permission to...'\",\n        \"smithy.api#trait\": {\n          \"selector\": \"operation\"\n        }\n      }\n    },\n    \"aws.iam#conditionKeyValue\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#documentation\": \"Uses the associated member’s value as this condition key’s value.\\nNeeded when the member name doesn't match the condition key name.\",\n        \"smithy.api#pattern\": \"^(([A-Za-z0-9][A-Za-z0-9-\\\\.]{0,62}:)?[^:\\\\s]+)$\",\n        \"smithy.api#trait\": {\n          \"selector\": \"member\"\n        }\n      }\n    },\n    \"aws.iam#conditionKeys\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"aws.iam#ConditionKeyName\"\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"Applies condition keys by name to a resource or operation.\",\n        \"smithy.api#trait\": {\n          \"selector\": \":test(resource, operation)\"\n        }\n      }\n    },\n    \"aws.iam#defineConditionKeys\": {\n      \"type\": \"map\",\n      \"key\": {\n        \"target\": \"aws.iam#ConditionKeyName\"\n      },\n      \"value\": {\n        \"target\": \"aws.iam#ConditionKeyDefinition\"\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"Defines the set of condition keys that appear within a service in addition to\\ninferred and global condition keys.\",\n        \"smithy.api#trait\": {\n          \"selector\": \"service\"\n        }\n      }\n    },\n    \"aws.iam#disableConditionKeyInference\": {\n      \"type\": \"structure\",\n      \"members\": {},\n      \"traits\": {\n        \"smithy.api#documentation\": \"Disables the automatic inference of condition keys of service's resources or a specific resource.\",\n        \"smithy.api#trait\": {\n          \"selector\": \":test(service, resource)\"\n        }\n      }\n    },\n    \"aws.iam#iamAction\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"name\": {\n          \"target\": \"smithy.api#String\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"The name of the action in AWS IAM.\"\n          }\n        },\n        \"documentation\": {\n          \"target\": \"smithy.api#String\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"A brief description of what granting the user permission to invoke an operation would entail.\\nThis description should begin with something similar to 'Enables the user to...' or 'Grants permission to...'\"\n          }\n        },\n        \"relativeDocumentation\": {\n          \"target\": \"smithy.api#String\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"A relative URL path that defines more information about the action within a set of IAM-related documentation.\"\n          }\n        },\n        \"requiredActions\": {\n          \"target\": \"aws.iam#RequiredActionsList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"Other actions that the invoker must be authorized to perform when executing the targeted operation.\"\n          }\n        },\n        \"resources\": {\n          \"target\": \"aws.iam#ActionResources\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"The resources an IAM action can be authorized against.\"\n          }\n        },\n        \"createsResources\": {\n          \"target\": \"aws.iam#ResourceNameList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"The resources that performing this IAM action will create.\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"Indicates properties of a Smithy operation as an IAM action.\",\n        \"smithy.api#trait\": {\n          \"selector\": \"operation\"\n        }\n      }\n    },\n    \"aws.iam#iamResource\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"name\": {\n          \"target\": \"smithy.api#String\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"The name of the resource in AWS IAM.\"\n          }\n        },\n        \"relativeDocumentation\": {\n          \"target\": \"smithy.api#String\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"A relative URL path that defines more information about the resource\\nwithin a set of IAM-related documentation.\"\n          }\n        },\n        \"disableConditionKeyInheritance\": {\n          \"target\": \"smithy.api#Boolean\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"When set to `true`, decouples this IAM resource's condition keys from\\nthose of its parent resource(s).\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"Indicates properties of a Smithy resource in AWS IAM.\",\n        \"smithy.api#trait\": {\n          \"selector\": \"resource\"\n        }\n      }\n    },\n    \"aws.iam#requiredActions\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"aws.iam#IamIdentifier\"\n      },\n      \"traits\": {\n        \"smithy.api#deprecated\": {\n          \"since\": \"2023-11-10\",\n          \"message\": \"Use the `requiredActions` member of the `aws.iam#iamAction` trait instead.\"\n        },\n        \"smithy.api#documentation\": \"Other actions that the invoker must be authorized to perform when executing the targeted operation.\",\n        \"smithy.api#trait\": {\n          \"selector\": \"operation\"\n        }\n      }\n    },\n    \"aws.iam#serviceResolvedConditionKeys\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"aws.iam#ConditionKeyName\"\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"Specifies the list of IAM condition keys which must be resolved by the service,\\nas opposed to being pulled from the request.\",\n        \"smithy.api#trait\": {\n          \"selector\": \"service\"\n        }\n      }\n    },\n    \"aws.iam#supportedPrincipalTypes\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"aws.iam#PrincipalType\"\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"The principal types that can use the service or operation.\",\n        \"smithy.api#trait\": {\n          \"selector\": \":test(service, operation)\"\n        }\n      }\n    },\n    \"aws.protocols#ChecksumAlgorithm\": {\n      \"type\": \"enum\",\n      \"members\": {\n        \"CRC32\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"CRC32\",\n            \"smithy.api#enumValue\": \"CRC32\"\n          }\n        },\n        \"CRC32C\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"CRC32C\",\n            \"smithy.api#enumValue\": \"CRC32C\"\n          }\n        },\n        \"CRC64NVME\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"CRC64NVME\",\n            \"smithy.api#enumValue\": \"CRC64NVME\"\n          }\n        },\n        \"MD5\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"MD5\",\n            \"smithy.api#enumValue\": \"MD5\"\n          }\n        },\n        \"SHA1\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"SHA1\",\n            \"smithy.api#enumValue\": \"SHA1\"\n          }\n        },\n        \"SHA256\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"SHA256\",\n            \"smithy.api#enumValue\": \"SHA256\"\n          }\n        },\n        \"SHA512\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"SHA512\",\n            \"smithy.api#enumValue\": \"SHA512\"\n          }\n        },\n        \"XXHASH64\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"XXHASH64\",\n            \"smithy.api#enumValue\": \"XXHASH64\"\n          }\n        },\n        \"XXHASH3\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"XXHASH3\",\n            \"smithy.api#enumValue\": \"XXHASH3\"\n          }\n        },\n        \"XXHASH128\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"XXHASH128\",\n            \"smithy.api#enumValue\": \"XXHASH128\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#private\": {}\n      }\n    },\n    \"aws.protocols#ChecksumAlgorithmSet\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"aws.protocols#ChecksumAlgorithm\"\n      },\n      \"traits\": {\n        \"smithy.api#length\": {\n          \"min\": 1\n        },\n        \"smithy.api#private\": {},\n        \"smithy.api#uniqueItems\": {}\n      }\n    },\n    \"aws.protocols#HttpConfiguration\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"http\": {\n          \"target\": \"aws.protocols#StringList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"The priority ordered list of supported HTTP protocol versions.\"\n          }\n        },\n        \"eventStreamHttp\": {\n          \"target\": \"aws.protocols#StringList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"The priority ordered list of supported HTTP protocol versions that\\nare required when using event streams with the service. If not set,\\nthis value defaults to the value of the `http` member. Any entry in\\n`eventStreamHttp` MUST also appear in `http`.\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"Contains HTTP protocol configuration for HTTP-based protocols.\",\n        \"smithy.api#mixin\": {\n          \"localTraits\": [\"smithy.api#private\"]\n        },\n        \"smithy.api#private\": {}\n      }\n    },\n    \"aws.protocols#StringList\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"smithy.api#String\"\n      },\n      \"traits\": {\n        \"smithy.api#private\": {}\n      }\n    },\n    \"aws.protocols#awsJson1_0\": {\n      \"type\": \"structure\",\n      \"mixins\": [\n        {\n          \"target\": \"aws.protocols#HttpConfiguration\"\n        }\n      ],\n      \"members\": {},\n      \"traits\": {\n        \"smithy.api#documentation\": \"An RPC-based protocol that sends JSON payloads. This protocol does not use\\nHTTP binding traits.\",\n        \"smithy.api#protocolDefinition\": {\n          \"traits\": [\n            \"smithy.api#timestampFormat\",\n            \"smithy.api#cors\",\n            \"smithy.api#endpoint\",\n            \"smithy.api#hostLabel\"\n          ]\n        },\n        \"smithy.api#trait\": {\n          \"selector\": \"service\"\n        }\n      }\n    },\n    \"aws.protocols#awsJson1_1\": {\n      \"type\": \"structure\",\n      \"mixins\": [\n        {\n          \"target\": \"aws.protocols#HttpConfiguration\"\n        }\n      ],\n      \"members\": {},\n      \"traits\": {\n        \"smithy.api#documentation\": \"An RPC-based protocol that sends JSON payloads. This protocol does not use\\nHTTP binding traits.\",\n        \"smithy.api#protocolDefinition\": {\n          \"traits\": [\n            \"smithy.api#timestampFormat\",\n            \"smithy.api#cors\",\n            \"smithy.api#endpoint\",\n            \"smithy.api#hostLabel\"\n          ]\n        },\n        \"smithy.api#trait\": {\n          \"selector\": \"service\"\n        }\n      }\n    },\n    \"aws.protocols#awsQuery\": {\n      \"type\": \"structure\",\n      \"members\": {},\n      \"traits\": {\n        \"smithy.api#deprecated\": {},\n        \"smithy.api#documentation\": \"An RPC-based protocol that sends 'POST' requests in the body as\\n`x-www-form-urlencoded` strings and responses in XML documents. This\\nprotocol does not use HTTP binding traits.\",\n        \"smithy.api#protocolDefinition\": {\n          \"traits\": [\n            \"smithy.api#timestampFormat\",\n            \"smithy.api#cors\",\n            \"smithy.api#endpoint\",\n            \"smithy.api#hostLabel\",\n            \"aws.protocols#awsQueryError\",\n            \"smithy.api#xmlAttribute\",\n            \"smithy.api#xmlFlattened\",\n            \"smithy.api#xmlName\",\n            \"smithy.api#xmlNamespace\"\n          ]\n        },\n        \"smithy.api#trait\": {\n          \"selector\": \"service [trait|xmlNamespace]\"\n        },\n        \"smithy.api#traitValidators\": {\n          \"UnsupportedProtocolDocument\": {\n            \"selector\": \"~> member :test(> document)\",\n            \"message\": \"Document types are not supported with awsQuery\"\n          }\n        }\n      }\n    },\n    \"aws.protocols#awsQueryCompatible\": {\n      \"type\": \"structure\",\n      \"members\": {},\n      \"traits\": {\n        \"smithy.api#documentation\": \"Enable backward compatibility when migrating from awsQuery to the awsJson\\nprotocol or Smithy RPC v2 CBOR.\",\n        \"smithy.api#trait\": {\n          \"selector\": \"service :test([trait|aws.protocols#awsJson1_0], [trait|smithy.protocols#rpcv2Cbor])\"\n        }\n      }\n    },\n    \"aws.protocols#awsQueryError\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"code\": {\n          \"target\": \"smithy.api#String\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"The value used to distinguish this error shape during serialization.\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"httpResponseCode\": {\n          \"target\": \"smithy.api#Integer\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"The HTTP response code used on a response containing this error shape.\",\n            \"smithy.api#required\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"Provides the value in the 'Code' distinguishing field and HTTP response\\ncode for an operation error.\",\n        \"smithy.api#trait\": {\n          \"selector\": \"structure [trait|error]\",\n          \"breakingChanges\": [\n            {\n              \"change\": \"any\"\n            }\n          ]\n        }\n      }\n    },\n    \"aws.protocols#ec2Query\": {\n      \"type\": \"structure\",\n      \"members\": {},\n      \"traits\": {\n        \"smithy.api#deprecated\": {},\n        \"smithy.api#documentation\": \"An RPC-based protocol that sends 'POST' requests in the body as Amazon EC2\\nformatted `x-www-form-urlencoded` strings and responses in XML documents.\\nThis protocol does not use HTTP binding traits.\",\n        \"smithy.api#protocolDefinition\": {\n          \"traits\": [\n            \"smithy.api#timestampFormat\",\n            \"smithy.api#cors\",\n            \"smithy.api#endpoint\",\n            \"smithy.api#hostLabel\",\n            \"aws.protocols#ec2QueryName\",\n            \"smithy.api#xmlAttribute\",\n            \"smithy.api#xmlFlattened\",\n            \"smithy.api#xmlName\",\n            \"smithy.api#xmlNamespace\"\n          ]\n        },\n        \"smithy.api#trait\": {\n          \"selector\": \"service [trait|xmlNamespace]\"\n        },\n        \"smithy.api#traitValidators\": {\n          \"UnsupportedProtocolDocument\": {\n            \"selector\": \"~> member :test(> document)\",\n            \"message\": \"Document types are not supported with ec2Query\"\n          }\n        }\n      }\n    },\n    \"aws.protocols#ec2QueryName\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#documentation\": \"Indicates the serialized name of a structure member when that structure is\\nserialized for the input of an EC2 operation.\",\n        \"smithy.api#pattern\": \"^[a-zA-Z_][a-zA-Z_0-9-]*$\",\n        \"smithy.api#trait\": {\n          \"selector\": \"structure > member\"\n        }\n      }\n    },\n    \"aws.protocols#httpChecksum\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"requestAlgorithmMember\": {\n          \"target\": \"smithy.api#String\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"Defines a top-level operation input member that is used to configure\\nrequest checksum behavior.\"\n          }\n        },\n        \"requestChecksumRequired\": {\n          \"target\": \"smithy.api#Boolean\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"Indicates an operation requires a checksum in its HTTP request.\"\n          }\n        },\n        \"requestValidationModeMember\": {\n          \"target\": \"smithy.api#String\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"Defines a top-level operation input member used to opt-in to response\\nchecksum validation.\"\n          }\n        },\n        \"responseAlgorithms\": {\n          \"target\": \"aws.protocols#ChecksumAlgorithmSet\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"Defines the checksum algorithms clients should look for when performing\\nHTTP response checksum validation.\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"Indicates that an operation supports checksum validation.\",\n        \"smithy.api#trait\": {\n          \"selector\": \"operation\",\n          \"breakingChanges\": [\n            {\n              \"change\": \"remove\",\n              \"severity\": \"DANGER\",\n              \"message\": \"Removing the trait removes the ability for clients to do request or response checksums. The service MUST continue to support old clients by supporting the `httpChecksum` trait.\"\n            },\n            {\n              \"change\": \"remove\",\n              \"path\": \"/requestAlgorithmMember\",\n              \"severity\": \"DANGER\",\n              \"message\": \"`requestAlgorithmMember` was removed, so newly generated clients will no longer be able to pick the request checksum algorithms The service MUST continue to support old clients by supporting `requestAlgorithmMember`.\"\n            },\n            {\n              \"change\": \"remove\",\n              \"path\": \"/requestValidationModeMember\",\n              \"severity\": \"DANGER\",\n              \"message\": \"`requestValidationModeMember` was removed, so newly generated clients will no longer validate response checksums. The service MUST continue to support old clients by supporting `requestValidationModeMember`.\"\n            },\n            {\n              \"change\": \"remove\",\n              \"path\": \"/responseAlgorithms/member\",\n              \"severity\": \"DANGER\",\n              \"message\": \"Members of `responseAlgorithms` were removed, so newly generated clients will no longer validate response checksums for the removed algorithms. The service MUST continue to support old clients by supporting removed compression algorithms.\"\n            }\n          ]\n        },\n        \"smithy.api#unstable\": {}\n      }\n    },\n    \"aws.protocols#restJson1\": {\n      \"type\": \"structure\",\n      \"mixins\": [\n        {\n          \"target\": \"aws.protocols#HttpConfiguration\"\n        }\n      ],\n      \"members\": {},\n      \"traits\": {\n        \"smithy.api#documentation\": \"A RESTful protocol that sends JSON in structured payloads.\",\n        \"smithy.api#protocolDefinition\": {\n          \"traits\": [\n            \"smithy.api#timestampFormat\",\n            \"smithy.api#cors\",\n            \"smithy.api#endpoint\",\n            \"smithy.api#hostLabel\",\n            \"smithy.api#http\",\n            \"smithy.api#httpError\",\n            \"smithy.api#httpHeader\",\n            \"smithy.api#httpLabel\",\n            \"smithy.api#httpPayload\",\n            \"smithy.api#httpPrefixHeaders\",\n            \"smithy.api#httpQuery\",\n            \"smithy.api#httpQueryParams\",\n            \"smithy.api#httpResponseCode\",\n            \"aws.protocols#httpChecksum\",\n            \"smithy.api#httpChecksumRequired\",\n            \"smithy.api#jsonName\"\n          ]\n        },\n        \"smithy.api#trait\": {\n          \"selector\": \"service\"\n        }\n      }\n    },\n    \"aws.protocols#restXml\": {\n      \"type\": \"structure\",\n      \"mixins\": [\n        {\n          \"target\": \"aws.protocols#HttpConfiguration\"\n        }\n      ],\n      \"members\": {\n        \"noErrorWrapping\": {\n          \"target\": \"smithy.api#Boolean\",\n          \"traits\": {\n            \"smithy.api#deprecated\": {},\n            \"smithy.api#documentation\": \"Disables the serialization wrapping of error properties in an 'Error'\\nXML element.\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#deprecated\": {},\n        \"smithy.api#documentation\": \"A RESTful protocol that sends XML in structured payloads.\",\n        \"smithy.api#protocolDefinition\": {\n          \"traits\": [\n            \"smithy.api#timestampFormat\",\n            \"smithy.api#cors\",\n            \"smithy.api#endpoint\",\n            \"smithy.api#hostLabel\",\n            \"smithy.api#http\",\n            \"smithy.api#httpError\",\n            \"smithy.api#httpHeader\",\n            \"smithy.api#httpLabel\",\n            \"smithy.api#httpPayload\",\n            \"smithy.api#httpPrefixHeaders\",\n            \"smithy.api#httpQuery\",\n            \"smithy.api#httpQueryParams\",\n            \"smithy.api#httpResponseCode\",\n            \"aws.protocols#httpChecksum\",\n            \"smithy.api#httpChecksumRequired\",\n            \"smithy.api#xmlAttribute\",\n            \"smithy.api#xmlFlattened\",\n            \"smithy.api#xmlName\",\n            \"smithy.api#xmlNamespace\"\n          ]\n        },\n        \"smithy.api#trait\": {\n          \"selector\": \"service\"\n        },\n        \"smithy.api#traitValidators\": {\n          \"UnsupportedProtocolDocument\": {\n            \"selector\": \"~> member :test(> document)\",\n            \"message\": \"Document types are not supported with restXml\"\n          }\n        }\n      }\n    },\n    \"aws.test#AwsVendorParams\": {\n      \"type\": \"structure\",\n      \"mixins\": [\n        {\n          \"target\": \"aws.test#BaseAwsVendorParams\"\n        }\n      ],\n      \"members\": {},\n      \"traits\": {\n        \"smithy.api#documentation\": \"Concrete vendor params to apply to AWS services by default.\",\n        \"smithy.api#suppress\": [\"UnreferencedShape\"]\n      }\n    },\n    \"aws.test#BaseAwsVendorParams\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"region\": {\n          \"target\": \"smithy.api#String\",\n          \"traits\": {\n            \"smithy.api#default\": \"us-west-2\",\n            \"smithy.api#documentation\": \"The AWS region to sign the request for and to resolve the default\\nendpoint with.\"\n          }\n        },\n        \"sigv4aRegionSet\": {\n          \"target\": \"aws.test#NonEmptyStringList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"The set of regions to sign a sigv4a request with.\"\n          }\n        },\n        \"uri\": {\n          \"target\": \"smithy.api#String\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"A static endpoint to send the request to.\"\n          }\n        },\n        \"useFips\": {\n          \"target\": \"smithy.api#Boolean\",\n          \"traits\": {\n            \"smithy.api#default\": false,\n            \"smithy.api#documentation\": \"Whether to resolve a FIPS compliant endpoint or not.\"\n          }\n        },\n        \"useDualstack\": {\n          \"target\": \"smithy.api#Boolean\",\n          \"traits\": {\n            \"smithy.api#default\": false,\n            \"smithy.api#documentation\": \"Whether to resolve a dualstack endpoint or not.\"\n          }\n        },\n        \"useAccountIdRouting\": {\n          \"target\": \"smithy.api#Boolean\",\n          \"traits\": {\n            \"smithy.api#default\": true,\n            \"smithy.api#documentation\": \"Whether to use account ID based routing where applicable.\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"Base vendor params for all aws services.\",\n        \"smithy.api#mixin\": {},\n        \"smithy.api#suppress\": [\"UnreferencedShape\"]\n      }\n    },\n    \"aws.test#NonEmptyStringList\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"smithy.api#String\"\n      },\n      \"traits\": {\n        \"smithy.api#length\": {\n          \"min\": 1\n        },\n        \"smithy.api#private\": {},\n        \"smithy.api#suppress\": [\"UnreferencedShape\"]\n      }\n    },\n    \"aws.test#S3VendorParams\": {\n      \"type\": \"structure\",\n      \"mixins\": [\n        {\n          \"target\": \"aws.test#BaseAwsVendorParams\"\n        }\n      ],\n      \"members\": {\n        \"useAccelerate\": {\n          \"target\": \"smithy.api#Boolean\",\n          \"traits\": {\n            \"smithy.api#default\": false,\n            \"smithy.api#documentation\": \"Whether to resolve an accelerate endpoint or not.\"\n          }\n        },\n        \"useGlobalEndpoint\": {\n          \"target\": \"smithy.api#Boolean\",\n          \"traits\": {\n            \"smithy.api#default\": false,\n            \"smithy.api#documentation\": \"Whether to use the global endpoint for us-east-1.\"\n          }\n        },\n        \"forcePathStyle\": {\n          \"target\": \"smithy.api#Boolean\",\n          \"traits\": {\n            \"smithy.api#default\": false,\n            \"smithy.api#documentation\": \"Whether to force path-style addressing.\"\n          }\n        },\n        \"useArnRegion\": {\n          \"target\": \"smithy.api#Boolean\",\n          \"traits\": {\n            \"smithy.api#default\": true,\n            \"smithy.api#documentation\": \"Whether to use the region in the bucket arn to override the set\\nregion.\"\n          }\n        },\n        \"useMultiRegionAccessPoints\": {\n          \"target\": \"smithy.api#Boolean\",\n          \"traits\": {\n            \"smithy.api#default\": true,\n            \"smithy.api#documentation\": \"Whether to use S3's multi-region access points.\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"Vendor params for S3.\",\n        \"smithy.api#suppress\": [\"UnreferencedShape\"]\n      }\n    },\n    \"com.amazonaws.s3#AbacStatus\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Status\": {\n          \"target\": \"com.amazonaws.s3#BucketAbacStatus\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The ABAC status of the general purpose bucket. </p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>The ABAC status of the general purpose bucket. When ABAC is enabled for the general purpose bucket, you can use tags to manage access to the general purpose buckets as well as for cost tracking purposes. When ABAC is disabled for the general purpose buckets, you can only use tags for cost tracking purposes. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/buckets-tagging.html\\\">Using tags with S3 general purpose buckets</a>. </p>\"\n      }\n    },\n    \"com.amazonaws.s3#AbortDate\": {\n      \"type\": \"timestamp\"\n    },\n    \"com.amazonaws.s3#AbortIncompleteMultipartUpload\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"DaysAfterInitiation\": {\n          \"target\": \"com.amazonaws.s3#DaysAfterInitiation\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the number of days after which Amazon S3 aborts an incomplete multipart upload.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Specifies the days since the initiation of an incomplete multipart upload that Amazon S3 will wait before\\n      permanently removing all parts of the upload. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/mpuoverview.html#mpu-abort-incomplete-mpu-lifecycle-config\\\"> Aborting\\n        Incomplete Multipart Uploads Using a Bucket Lifecycle Configuration</a> in the\\n        <i>Amazon S3 User Guide</i>.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#AbortMultipartUpload\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#AbortMultipartUploadRequest\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.s3#AbortMultipartUploadOutput\"\n      },\n      \"errors\": [\n        {\n          \"target\": \"com.amazonaws.s3#NoSuchUpload\"\n        }\n      ],\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>This operation aborts a multipart upload. After a multipart upload is aborted, no additional parts\\n      can be uploaded using that upload ID. The storage consumed by any previously uploaded parts will be\\n      freed. However, if any part uploads are currently in progress, those part uploads might or might not\\n      succeed. As a result, it might be necessary to abort a given multipart upload multiple times in order to\\n      completely free all storage consumed by all parts. </p>\\n         <p>To verify that all parts have been removed and prevent getting charged for the part storage, you\\n      should call the <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListParts.html\\\">ListParts</a> API operation and ensure that the parts list is empty.</p>\\n         <note>\\n            <ul>\\n               <li>\\n                  <p>\\n                     <b>Directory buckets</b> - If multipart uploads in a\\n            directory bucket are in progress, you can't delete the bucket until all the in-progress multipart\\n            uploads are aborted or completed. To delete these in-progress multipart uploads, use the\\n              <code>ListMultipartUploads</code> operation to list the in-progress multipart uploads in the\\n            bucket and use the <code>AbortMultipartUpload</code> operation to abort all the in-progress\\n            multipart uploads. </p>\\n               </li>\\n               <li>\\n                  <p>\\n                     <b>Directory buckets</b> - For directory buckets, you must make requests for this API operation to the Zonal endpoint. These endpoints support virtual-hosted-style requests in the format <code>https://<i>amzn-s3-demo-bucket</i>.s3express-<i>zone-id</i>.<i>region-code</i>.amazonaws.com/<i>key-name</i>\\n                     </code>. Path-style requests are not supported. For more information about endpoints in Availability Zones, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/endpoint-directory-buckets-AZ.html\\\">Regional and Zonal endpoints for directory buckets in Availability Zones</a> in the\\n    <i>Amazon S3 User Guide</i>. For more information about endpoints in Local Zones, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-lzs-for-directory-buckets.html\\\">Concepts for directory buckets in Local Zones</a> in the\\n    <i>Amazon S3 User Guide</i>.</p>\\n               </li>\\n            </ul>\\n         </note>\\n         <dl>\\n            <dt>Permissions</dt>\\n            <dd>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <b>General purpose bucket permissions</b> - For information\\n                about permissions required to use the multipart upload, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/mpuAndPermissions.html\\\">Multipart Upload and Permissions</a> in\\n                the <i>Amazon S3 User Guide</i>.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <b>Directory bucket permissions</b> - To grant access to this API operation on a directory bucket, we recommend that you use the <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateSession.html\\\">\\n                           <code>CreateSession</code>\\n                        </a> API operation for session-based authorization. Specifically, you grant the <code>s3express:CreateSession</code> permission to the directory bucket in a bucket policy or an IAM identity-based policy. Then, you make the <code>CreateSession</code> API call on the bucket to obtain a session token. With the session token in your request header, you can make API requests to this operation. After the session token expires, you make another <code>CreateSession</code> API call to generate a new session token for use. \\nAmazon Web Services CLI or SDKs create session and refresh the session token automatically to avoid service interruptions when a session expires. For more information about authorization, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateSession.html\\\">\\n                           <code>CreateSession</code>\\n                        </a>.</p>\\n                  </li>\\n               </ul>\\n            </dd>\\n            <dt>HTTP Host header syntax</dt>\\n            <dd>\\n               <p>\\n                  <b>Directory buckets </b> - The HTTP Host header syntax is <code>\\n                     <i>Bucket-name</i>.s3express-<i>zone-id</i>.<i>region-code</i>.amazonaws.com</code>.</p>\\n            </dd>\\n         </dl>\\n         <p>The following operations are related to <code>AbortMultipartUpload</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateMultipartUpload.html\\\">CreateMultipartUpload</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPart.html\\\">UploadPart</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html\\\">CompleteMultipartUpload</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListParts.html\\\">ListParts</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListMultipartUploads.html\\\">ListMultipartUploads</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#examples\": [\n          {\n            \"title\": \"To abort a multipart upload\",\n            \"documentation\": \"The following example aborts a multipart upload.\",\n            \"input\": {\n              \"Bucket\": \"examplebucket\",\n              \"Key\": \"bigobject\",\n              \"UploadId\": \"xadcOB_7YPBOJuoFiQ9cz4P3Pe6FIZwO4f7wN93uHsNBEw97pl5eNwzExg0LAT2dUN91cOmrEQHDsP3WA60CEg--\"\n            },\n            \"output\": {}\n          }\n        ],\n        \"smithy.api#http\": {\n          \"method\": \"DELETE\",\n          \"uri\": \"/{Bucket}/{Key+}?x-id=AbortMultipartUpload\",\n          \"code\": 204\n        }\n      }\n    },\n    \"com.amazonaws.s3#AbortMultipartUploadOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"RequestCharged\": {\n          \"target\": \"com.amazonaws.s3#RequestCharged\",\n          \"traits\": {\n            \"smithy.api#httpHeader\": \"x-amz-request-charged\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#output\": {}\n      }\n    },\n    \"com.amazonaws.s3#AbortMultipartUploadRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The bucket name to which the upload was taking place. </p>\\n         <p>\\n            <b>Directory buckets</b> - When you use this operation with a directory bucket, you must use virtual-hosted-style requests in the format <code>\\n               <i>Bucket-name</i>.s3express-<i>zone-id</i>.<i>region-code</i>.amazonaws.com</code>. Path-style requests are not supported.  Directory bucket names must be unique in the chosen Zone (Availability Zone or Local Zone). Bucket names must follow the format <code>\\n               <i>bucket-base-name</i>--<i>zone-id</i>--x-s3</code> (for example, <code>\\n               <i>amzn-s3-demo-bucket</i>--<i>usw2-az1</i>--x-s3</code>). For information about bucket naming\\n         restrictions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-bucket-naming-rules.html\\\">Directory bucket naming\\n            rules</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <p>\\n            <b>Access points</b> - When you use this action with an access point for general purpose buckets, you must provide the alias of the access point in place of the bucket name or specify the access point ARN. When you use this action with an access point for directory buckets, you must provide the access point name in place of the bucket name. When using the access point ARN, you must direct requests to the access point hostname. The access point hostname takes the form <i>AccessPointName</i>-<i>AccountId</i>.s3-accesspoint.<i>Region</i>.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html\\\">Using access points</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <note>\\n            <p>Object Lambda access points are not supported by directory buckets.</p>\\n         </note>\\n         <p>\\n            <b>S3 on Outposts</b> - When you use this action with S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the \\n                     form <code>\\n               <i>AccessPointName</i>-<i>AccountId</i>.<i>outpostID</i>.s3-outposts.<i>Region</i>.amazonaws.com</code>. When you use this action with S3 on Outposts, the destination bucket must be the Outposts access point ARN or the access point alias. For more information about S3 on Outposts, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html\\\">What is S3 on Outposts?</a> in the <i>Amazon S3 User Guide</i>.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"Key\": {\n          \"target\": \"com.amazonaws.s3#ObjectKey\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Key of the object for which the multipart upload was initiated.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Key\"\n            }\n          }\n        },\n        \"UploadId\": {\n          \"target\": \"com.amazonaws.s3#MultipartUploadId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Upload ID that identifies the multipart upload.</p>\",\n            \"smithy.api#httpQuery\": \"uploadId\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"RequestPayer\": {\n          \"target\": \"com.amazonaws.s3#RequestPayer\",\n          \"traits\": {\n            \"smithy.api#httpHeader\": \"x-amz-request-payer\"\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        },\n        \"IfMatchInitiatedTime\": {\n          \"target\": \"com.amazonaws.s3#IfMatchInitiatedTime\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>If present, this header aborts an in progress multipart upload only if it was initiated on the\\n      provided timestamp. If the initiated timestamp of the multipart upload does not match the provided\\n      value, the operation returns a <code>412 Precondition Failed</code> error. If the initiated timestamp\\n      matches or if the multipart upload doesn’t exist, the operation returns a <code>204 Success (No\\n        Content)</code> response. </p>\\n         <note>\\n            <p>This functionality is only supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-if-match-initiated-time\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#AbortRuleId\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#AccelerateConfiguration\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Status\": {\n          \"target\": \"com.amazonaws.s3#BucketAccelerateStatus\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the transfer acceleration status of the bucket.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Configures the transfer acceleration state for an Amazon S3 bucket. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/transfer-acceleration.html\\\">Amazon S3 Transfer\\n        Acceleration</a> in the <i>Amazon S3 User Guide</i>.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#AcceptRanges\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#AccessControlPolicy\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Grants\": {\n          \"target\": \"com.amazonaws.s3#Grants\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A list of grants.</p>\",\n            \"smithy.api#xmlName\": \"AccessControlList\"\n          }\n        },\n        \"Owner\": {\n          \"target\": \"com.amazonaws.s3#Owner\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Container for the bucket owner's display name and ID.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Contains the elements that set the ACL permissions for an object per grantee.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#AccessControlTranslation\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Owner\": {\n          \"target\": \"com.amazonaws.s3#OwnerOverride\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the replica ownership. For default and valid values, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketPUTreplication.html\\\">PUT bucket replication</a> in the\\n        <i>Amazon S3 API Reference</i>.</p>\",\n            \"smithy.api#required\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>A container for information about access control for replicas.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#AccessKeyIdValue\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#AccessPointAlias\": {\n      \"type\": \"boolean\"\n    },\n    \"com.amazonaws.s3#AccessPointArn\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#AccountId\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#AllowQuotedRecordDelimiter\": {\n      \"type\": \"boolean\"\n    },\n    \"com.amazonaws.s3#AllowedHeader\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#AllowedHeaders\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.s3#AllowedHeader\"\n      }\n    },\n    \"com.amazonaws.s3#AllowedMethod\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#AllowedMethods\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.s3#AllowedMethod\"\n      }\n    },\n    \"com.amazonaws.s3#AllowedOrigin\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#AllowedOrigins\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.s3#AllowedOrigin\"\n      }\n    },\n    \"com.amazonaws.s3#AmazonS3\": {\n      \"type\": \"service\",\n      \"version\": \"2006-03-01\",\n      \"operations\": [\n        {\n          \"target\": \"com.amazonaws.s3#AbortMultipartUpload\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#CompleteMultipartUpload\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#CopyObject\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#CreateBucket\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#CreateBucketMetadataConfiguration\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#CreateBucketMetadataTableConfiguration\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#CreateMultipartUpload\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#CreateSession\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#DeleteBucket\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#DeleteBucketAnalyticsConfiguration\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#DeleteBucketCors\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#DeleteBucketEncryption\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#DeleteBucketIntelligentTieringConfiguration\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#DeleteBucketInventoryConfiguration\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#DeleteBucketLifecycle\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#DeleteBucketMetadataConfiguration\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#DeleteBucketMetadataTableConfiguration\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#DeleteBucketMetricsConfiguration\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#DeleteBucketOwnershipControls\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#DeleteBucketPolicy\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#DeleteBucketReplication\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#DeleteBucketTagging\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#DeleteBucketWebsite\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#DeleteObject\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#DeleteObjects\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#DeleteObjectTagging\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#DeletePublicAccessBlock\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#GetBucketAbac\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#GetBucketAccelerateConfiguration\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#GetBucketAcl\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#GetBucketAnalyticsConfiguration\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#GetBucketCors\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#GetBucketEncryption\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#GetBucketIntelligentTieringConfiguration\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#GetBucketInventoryConfiguration\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#GetBucketLifecycleConfiguration\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#GetBucketLocation\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#GetBucketLogging\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#GetBucketMetadataConfiguration\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#GetBucketMetadataTableConfiguration\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#GetBucketMetricsConfiguration\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#GetBucketNotificationConfiguration\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#GetBucketOwnershipControls\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#GetBucketPolicy\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#GetBucketPolicyStatus\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#GetBucketReplication\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#GetBucketRequestPayment\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#GetBucketTagging\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#GetBucketVersioning\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#GetBucketWebsite\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#GetObject\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#GetObjectAcl\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#GetObjectAttributes\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#GetObjectLegalHold\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#GetObjectLockConfiguration\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#GetObjectRetention\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#GetObjectTagging\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#GetObjectTorrent\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#GetPublicAccessBlock\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#HeadBucket\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#HeadObject\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#ListBucketAnalyticsConfigurations\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#ListBucketIntelligentTieringConfigurations\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#ListBucketInventoryConfigurations\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#ListBucketMetricsConfigurations\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#ListBuckets\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#ListDirectoryBuckets\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#ListMultipartUploads\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#ListObjects\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#ListObjectsV2\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#ListObjectVersions\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#ListParts\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#PutBucketAbac\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#PutBucketAccelerateConfiguration\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#PutBucketAcl\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#PutBucketAnalyticsConfiguration\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#PutBucketCors\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#PutBucketEncryption\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#PutBucketIntelligentTieringConfiguration\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#PutBucketInventoryConfiguration\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#PutBucketLifecycleConfiguration\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#PutBucketLogging\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#PutBucketMetricsConfiguration\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#PutBucketNotificationConfiguration\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#PutBucketOwnershipControls\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#PutBucketPolicy\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#PutBucketReplication\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#PutBucketRequestPayment\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#PutBucketTagging\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#PutBucketVersioning\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#PutBucketWebsite\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#PutObject\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#PutObjectAcl\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#PutObjectLegalHold\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#PutObjectLockConfiguration\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#PutObjectRetention\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#PutObjectTagging\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#PutPublicAccessBlock\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#RenameObject\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#RestoreObject\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#SelectObjectContent\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#UpdateBucketMetadataInventoryTableConfiguration\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#UpdateBucketMetadataJournalTableConfiguration\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#UploadPart\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#UploadPartCopy\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#WriteGetObjectResponse\"\n        }\n      ],\n      \"traits\": {\n        \"aws.api#service\": {\n          \"sdkId\": \"S3\",\n          \"arnNamespace\": \"s3\",\n          \"cloudFormationName\": \"S3\",\n          \"cloudTrailEventSource\": \"s3.amazonaws.com\",\n          \"endpointPrefix\": \"s3\"\n        },\n        \"aws.auth#sigv4\": {\n          \"name\": \"s3\"\n        },\n        \"aws.protocols#restXml\": {\n          \"noErrorWrapping\": true\n        },\n        \"smithy.api#documentation\": \"<p></p>\",\n        \"smithy.api#suppress\": [\"RuleSetAuthSchemes\"],\n        \"smithy.api#title\": \"Amazon Simple Storage Service\",\n        \"smithy.api#xmlNamespace\": {\n          \"uri\": \"http://s3.amazonaws.com/doc/2006-03-01/\"\n        },\n        \"smithy.rules#clientContextParams\": {\n          \"ForcePathStyle\": {\n            \"documentation\": \"Forces this client to use path-style addressing for buckets.\",\n            \"type\": \"boolean\"\n          },\n          \"UseArnRegion\": {\n            \"documentation\": \"Enables this client to use an ARN's region when constructing an endpoint instead of the client's configured region.\",\n            \"type\": \"boolean\"\n          },\n          \"DisableMultiRegionAccessPoints\": {\n            \"documentation\": \"Disables this client's usage of Multi-Region Access Points.\",\n            \"type\": \"boolean\"\n          },\n          \"Accelerate\": {\n            \"documentation\": \"Enables this client to use S3 Transfer Acceleration endpoints.\",\n            \"type\": \"boolean\"\n          },\n          \"DisableS3ExpressSessionAuth\": {\n            \"documentation\": \"Disables this client's usage of Session Auth for S3Express       buckets and reverts to using conventional SigV4 for those.\",\n            \"type\": \"boolean\"\n          }\n        },\n        \"smithy.rules#endpointBdd\": {\n          \"version\": \"1.1\",\n          \"parameters\": {\n            \"Bucket\": {\n              \"required\": false,\n              \"documentation\": \"The S3 bucket used to send the request. This is an optional parameter that will be set automatically for operations that are scoped to an S3 bucket.\",\n              \"type\": \"string\"\n            },\n            \"Region\": {\n              \"builtIn\": \"AWS::Region\",\n              \"required\": false,\n              \"documentation\": \"The AWS region used to dispatch the request.\",\n              \"type\": \"string\"\n            },\n            \"UseFIPS\": {\n              \"builtIn\": \"AWS::UseFIPS\",\n              \"required\": true,\n              \"default\": false,\n              \"documentation\": \"When true, send this request to the FIPS-compliant regional endpoint. If the configured endpoint does not have a FIPS compliant endpoint, dispatching the request will return an error.\",\n              \"type\": \"boolean\"\n            },\n            \"UseDualStack\": {\n              \"builtIn\": \"AWS::UseDualStack\",\n              \"required\": true,\n              \"default\": false,\n              \"documentation\": \"When true, use the dual-stack endpoint. If the configured endpoint does not support dual-stack, dispatching the request MAY return an error.\",\n              \"type\": \"boolean\"\n            },\n            \"Endpoint\": {\n              \"builtIn\": \"SDK::Endpoint\",\n              \"required\": false,\n              \"documentation\": \"Override the endpoint used to send this request\",\n              \"type\": \"string\"\n            },\n            \"ForcePathStyle\": {\n              \"builtIn\": \"AWS::S3::ForcePathStyle\",\n              \"required\": true,\n              \"default\": false,\n              \"documentation\": \"When true, force a path-style endpoint to be used where the bucket name is part of the path.\",\n              \"type\": \"boolean\"\n            },\n            \"Accelerate\": {\n              \"builtIn\": \"AWS::S3::Accelerate\",\n              \"required\": true,\n              \"default\": false,\n              \"documentation\": \"When true, use S3 Accelerate. NOTE: Not all regions support S3 accelerate.\",\n              \"type\": \"boolean\"\n            },\n            \"UseGlobalEndpoint\": {\n              \"builtIn\": \"AWS::S3::UseGlobalEndpoint\",\n              \"required\": true,\n              \"default\": false,\n              \"documentation\": \"Whether the global endpoint should be used, rather then the regional endpoint for us-east-1.\",\n              \"type\": \"boolean\"\n            },\n            \"UseObjectLambdaEndpoint\": {\n              \"required\": false,\n              \"documentation\": \"Internal parameter to use object lambda endpoint for an operation (eg: WriteGetObjectResponse)\",\n              \"type\": \"boolean\"\n            },\n            \"Key\": {\n              \"required\": false,\n              \"documentation\": \"The S3 Key used to send the request. This is an optional parameter that will be set automatically for operations that are scoped to an S3 Key.\",\n              \"type\": \"string\"\n            },\n            \"Prefix\": {\n              \"required\": false,\n              \"documentation\": \"The S3 Prefix used to send the request. This is an optional parameter that will be set automatically for operations that are scoped to an S3 Prefix.\",\n              \"type\": \"string\"\n            },\n            \"CopySource\": {\n              \"required\": false,\n              \"documentation\": \"The Copy Source used for Copy Object request. This is an optional parameter that will be set automatically for operations that are scoped to Copy Source.\",\n              \"type\": \"string\"\n            },\n            \"DisableAccessPoints\": {\n              \"required\": false,\n              \"documentation\": \"Internal parameter to disable Access Point Buckets\",\n              \"type\": \"boolean\"\n            },\n            \"DisableMultiRegionAccessPoints\": {\n              \"builtIn\": \"AWS::S3::DisableMultiRegionAccessPoints\",\n              \"required\": true,\n              \"default\": false,\n              \"documentation\": \"Whether multi-region access points (MRAP) should be disabled.\",\n              \"type\": \"boolean\"\n            },\n            \"UseArnRegion\": {\n              \"builtIn\": \"AWS::S3::UseArnRegion\",\n              \"required\": false,\n              \"documentation\": \"When an Access Point ARN is provided and this flag is enabled, the SDK MUST use the ARN's region when constructing the endpoint instead of the client's configured region.\",\n              \"type\": \"boolean\"\n            },\n            \"UseS3ExpressControlEndpoint\": {\n              \"required\": false,\n              \"documentation\": \"Internal parameter to indicate whether S3Express operation should use control plane, (ex. CreateBucket)\",\n              \"type\": \"boolean\"\n            },\n            \"DisableS3ExpressSessionAuth\": {\n              \"required\": false,\n              \"documentation\": \"Parameter to indicate whether S3Express session auth should be disabled\",\n              \"type\": \"boolean\"\n            }\n          },\n          \"conditions\": [\n            {\n              \"fn\": \"isSet\",\n              \"argv\": [\n                {\n                  \"ref\": \"Region\"\n                }\n              ]\n            },\n            {\n              \"fn\": \"ite\",\n              \"argv\": [\n                {\n                  \"fn\": \"stringEquals\",\n                  \"argv\": [\n                    {\n                      \"ref\": \"Region\"\n                    },\n                    \"aws-global\"\n                  ]\n                },\n                \"us-east-1\",\n                {\n                  \"ref\": \"Region\"\n                }\n              ],\n              \"assign\": \"_effective_std_region\"\n            },\n            {\n              \"fn\": \"booleanEquals\",\n              \"argv\": [\n                {\n                  \"ref\": \"Accelerate\"\n                },\n                true\n              ]\n            },\n            {\n              \"fn\": \"booleanEquals\",\n              \"argv\": [\n                {\n                  \"ref\": \"UseFIPS\"\n                },\n                true\n              ]\n            },\n            {\n              \"fn\": \"isSet\",\n              \"argv\": [\n                {\n                  \"ref\": \"Endpoint\"\n                }\n              ]\n            },\n            {\n              \"fn\": \"booleanEquals\",\n              \"argv\": [\n                {\n                  \"ref\": \"UseDualStack\"\n                },\n                true\n              ]\n            },\n            {\n              \"fn\": \"isSet\",\n              \"argv\": [\n                {\n                  \"ref\": \"Bucket\"\n                }\n              ]\n            },\n            {\n              \"fn\": \"stringEquals\",\n              \"argv\": [\n                {\n                  \"fn\": \"coalesce\",\n                  \"argv\": [\n                    {\n                      \"fn\": \"substring\",\n                      \"argv\": [\n                        {\n                          \"ref\": \"Bucket\"\n                        },\n                        0,\n                        6,\n                        true\n                      ]\n                    },\n                    \"\"\n                  ]\n                },\n                \"--x-s3\"\n              ]\n            },\n            {\n              \"fn\": \"stringEquals\",\n              \"argv\": [\n                {\n                  \"fn\": \"coalesce\",\n                  \"argv\": [\n                    {\n                      \"fn\": \"substring\",\n                      \"argv\": [\n                        {\n                          \"ref\": \"Bucket\"\n                        },\n                        0,\n                        7,\n                        true\n                      ]\n                    },\n                    \"\"\n                  ]\n                },\n                \"--xa-s3\"\n              ]\n            },\n            {\n              \"fn\": \"aws.partition\",\n              \"argv\": [\n                {\n                  \"ref\": \"Region\"\n                }\n              ],\n              \"assign\": \"partitionResult\"\n            },\n            {\n              \"fn\": \"parseURL\",\n              \"argv\": [\n                {\n                  \"ref\": \"Endpoint\"\n                }\n              ],\n              \"assign\": \"url\"\n            },\n            {\n              \"fn\": \"substring\",\n              \"argv\": [\n                {\n                  \"ref\": \"Bucket\"\n                },\n                0,\n                7,\n                true\n              ],\n              \"assign\": \"accessPointSuffix\"\n            },\n            {\n              \"fn\": \"stringEquals\",\n              \"argv\": [\n                {\n                  \"ref\": \"accessPointSuffix\"\n                },\n                \"--op-s3\"\n              ]\n            },\n            {\n              \"fn\": \"substring\",\n              \"argv\": [\n                {\n                  \"ref\": \"Bucket\"\n                },\n                8,\n                12,\n                true\n              ],\n              \"assign\": \"regionPrefix\"\n            },\n            {\n              \"fn\": \"substring\",\n              \"argv\": [\n                {\n                  \"ref\": \"Bucket\"\n                },\n                49,\n                50,\n                true\n              ],\n              \"assign\": \"hardwareType\"\n            },\n            {\n              \"fn\": \"substring\",\n              \"argv\": [\n                {\n                  \"ref\": \"Bucket\"\n                },\n                32,\n                49,\n                true\n              ],\n              \"assign\": \"outpostId_ssa_2\"\n            },\n            {\n              \"fn\": \"stringEquals\",\n              \"argv\": [\n                {\n                  \"fn\": \"getAttr\",\n                  \"argv\": [\n                    {\n                      \"ref\": \"partitionResult\"\n                    },\n                    \"name\"\n                  ]\n                },\n                \"aws-cn\"\n              ]\n            },\n            {\n              \"fn\": \"ite\",\n              \"argv\": [\n                {\n                  \"ref\": \"UseDualStack\"\n                },\n                \".dualstack\",\n                \"\"\n              ],\n              \"assign\": \"_s3e_ds\"\n            },\n            {\n              \"fn\": \"ite\",\n              \"argv\": [\n                {\n                  \"ref\": \"UseFIPS\"\n                },\n                \"-fips\",\n                \"\"\n              ],\n              \"assign\": \"_s3e_fips\"\n            },\n            {\n              \"fn\": \"booleanEquals\",\n              \"argv\": [\n                {\n                  \"ref\": \"ForcePathStyle\"\n                },\n                true\n              ]\n            },\n            {\n              \"fn\": \"ite\",\n              \"argv\": [\n                {\n                  \"fn\": \"coalesce\",\n                  \"argv\": [\n                    {\n                      \"ref\": \"DisableS3ExpressSessionAuth\"\n                    },\n                    false\n                  ]\n                },\n                \"sigv4\",\n                \"sigv4-s3express\"\n              ],\n              \"assign\": \"_s3e_auth\"\n            },\n            {\n              \"fn\": \"aws.isVirtualHostableS3Bucket\",\n              \"argv\": [\n                {\n                  \"ref\": \"Bucket\"\n                },\n                false\n              ]\n            },\n            {\n              \"fn\": \"getAttr\",\n              \"argv\": [\n                {\n                  \"fn\": \"split\",\n                  \"argv\": [\n                    {\n                      \"ref\": \"Bucket\"\n                    },\n                    \"--\",\n                    0\n                  ]\n                },\n                \"[1]\"\n              ],\n              \"assign\": \"s3expressAvailabilityZoneId\"\n            },\n            {\n              \"fn\": \"isValidHostLabel\",\n              \"argv\": [\n                {\n                  \"ref\": \"outpostId_ssa_2\"\n                },\n                false\n              ]\n            },\n            {\n              \"fn\": \"booleanEquals\",\n              \"argv\": [\n                {\n                  \"fn\": \"coalesce\",\n                  \"argv\": [\n                    {\n                      \"ref\": \"UseS3ExpressControlEndpoint\"\n                    },\n                    false\n                  ]\n                },\n                true\n              ]\n            },\n            {\n              \"fn\": \"stringEquals\",\n              \"argv\": [\n                {\n                  \"ref\": \"regionPrefix\"\n                },\n                \"beta\"\n              ]\n            },\n            {\n              \"fn\": \"aws.isVirtualHostableS3Bucket\",\n              \"argv\": [\n                {\n                  \"ref\": \"Bucket\"\n                },\n                true\n              ]\n            },\n            {\n              \"fn\": \"stringEquals\",\n              \"argv\": [\n                {\n                  \"fn\": \"coalesce\",\n                  \"argv\": [\n                    {\n                      \"fn\": \"substring\",\n                      \"argv\": [\n                        {\n                          \"ref\": \"Bucket\"\n                        },\n                        16,\n                        18,\n                        true\n                      ]\n                    },\n                    \"\"\n                  ]\n                },\n                \"--\"\n              ]\n            },\n            {\n              \"fn\": \"stringEquals\",\n              \"argv\": [\n                {\n                  \"fn\": \"coalesce\",\n                  \"argv\": [\n                    {\n                      \"fn\": \"substring\",\n                      \"argv\": [\n                        {\n                          \"ref\": \"Bucket\"\n                        },\n                        21,\n                        23,\n                        true\n                      ]\n                    },\n                    \"\"\n                  ]\n                },\n                \"--\"\n              ]\n            },\n            {\n              \"fn\": \"stringEquals\",\n              \"argv\": [\n                {\n                  \"fn\": \"getAttr\",\n                  \"argv\": [\n                    {\n                      \"ref\": \"url\"\n                    },\n                    \"scheme\"\n                  ]\n                },\n                \"http\"\n              ]\n            },\n            {\n              \"fn\": \"isValidHostLabel\",\n              \"argv\": [\n                {\n                  \"ref\": \"Region\"\n                },\n                false\n              ]\n            },\n            {\n              \"fn\": \"aws.parseArn\",\n              \"argv\": [\n                {\n                  \"ref\": \"Bucket\"\n                }\n              ],\n              \"assign\": \"bucketArn\"\n            },\n            {\n              \"fn\": \"stringEquals\",\n              \"argv\": [\n                {\n                  \"fn\": \"coalesce\",\n                  \"argv\": [\n                    {\n                      \"fn\": \"substring\",\n                      \"argv\": [\n                        {\n                          \"ref\": \"Bucket\"\n                        },\n                        27,\n                        29,\n                        true\n                      ]\n                    },\n                    \"\"\n                  ]\n                },\n                \"--\"\n              ]\n            },\n            {\n              \"fn\": \"ite\",\n              \"argv\": [\n                {\n                  \"fn\": \"coalesce\",\n                  \"argv\": [\n                    {\n                      \"ref\": \"UseArnRegion\"\n                    },\n                    true\n                  ]\n                },\n                {\n                  \"fn\": \"getAttr\",\n                  \"argv\": [\n                    {\n                      \"ref\": \"bucketArn\"\n                    },\n                    \"region\"\n                  ]\n                },\n                {\n                  \"ref\": \"Region\"\n                }\n              ],\n              \"assign\": \"_effective_arn_region\"\n            },\n            {\n              \"fn\": \"booleanEquals\",\n              \"argv\": [\n                {\n                  \"fn\": \"getAttr\",\n                  \"argv\": [\n                    {\n                      \"ref\": \"url\"\n                    },\n                    \"isIp\"\n                  ]\n                },\n                true\n              ]\n            },\n            {\n              \"fn\": \"stringEquals\",\n              \"argv\": [\n                {\n                  \"fn\": \"coalesce\",\n                  \"argv\": [\n                    {\n                      \"fn\": \"substring\",\n                      \"argv\": [\n                        {\n                          \"ref\": \"Bucket\"\n                        },\n                        0,\n                        4,\n                        false\n                      ]\n                    },\n                    \"\"\n                  ]\n                },\n                \"arn:\"\n              ]\n            },\n            {\n              \"fn\": \"uriEncode\",\n              \"argv\": [\n                {\n                  \"ref\": \"Bucket\"\n                }\n              ],\n              \"assign\": \"uri_encoded_bucket\"\n            },\n            {\n              \"fn\": \"booleanEquals\",\n              \"argv\": [\n                {\n                  \"fn\": \"coalesce\",\n                  \"argv\": [\n                    {\n                      \"ref\": \"UseObjectLambdaEndpoint\"\n                    },\n                    false\n                  ]\n                },\n                true\n              ]\n            },\n            {\n              \"fn\": \"getAttr\",\n              \"argv\": [\n                {\n                  \"ref\": \"bucketArn\"\n                },\n                \"resourceId[0]\"\n              ],\n              \"assign\": \"arnType\"\n            },\n            {\n              \"fn\": \"stringEquals\",\n              \"argv\": [\n                {\n                  \"ref\": \"arnType\"\n                },\n                \"\"\n              ]\n            },\n            {\n              \"fn\": \"stringEquals\",\n              \"argv\": [\n                {\n                  \"ref\": \"arnType\"\n                },\n                \"accesspoint\"\n              ]\n            },\n            {\n              \"fn\": \"getAttr\",\n              \"argv\": [\n                {\n                  \"ref\": \"bucketArn\"\n                },\n                \"resourceId[1]\"\n              ],\n              \"assign\": \"accessPointName_ssa_1\"\n            },\n            {\n              \"fn\": \"stringEquals\",\n              \"argv\": [\n                {\n                  \"ref\": \"accessPointName_ssa_1\"\n                },\n                \"\"\n              ]\n            },\n            {\n              \"fn\": \"stringEquals\",\n              \"argv\": [\n                {\n                  \"fn\": \"getAttr\",\n                  \"argv\": [\n                    {\n                      \"ref\": \"bucketArn\"\n                    },\n                    \"service\"\n                  ]\n                },\n                \"s3-object-lambda\"\n              ]\n            },\n            {\n              \"fn\": \"isValidHostLabel\",\n              \"argv\": [\n                {\n                  \"ref\": \"Region\"\n                },\n                true\n              ]\n            },\n            {\n              \"fn\": \"stringEquals\",\n              \"argv\": [\n                {\n                  \"fn\": \"getAttr\",\n                  \"argv\": [\n                    {\n                      \"ref\": \"bucketArn\"\n                    },\n                    \"region\"\n                  ]\n                },\n                \"\"\n              ]\n            },\n            {\n              \"fn\": \"stringEquals\",\n              \"argv\": [\n                {\n                  \"ref\": \"hardwareType\"\n                },\n                \"e\"\n              ]\n            },\n            {\n              \"fn\": \"stringEquals\",\n              \"argv\": [\n                {\n                  \"fn\": \"coalesce\",\n                  \"argv\": [\n                    {\n                      \"fn\": \"substring\",\n                      \"argv\": [\n                        {\n                          \"ref\": \"Bucket\"\n                        },\n                        26,\n                        28,\n                        true\n                      ]\n                    },\n                    \"\"\n                  ]\n                },\n                \"--\"\n              ]\n            },\n            {\n              \"fn\": \"stringEquals\",\n              \"argv\": [\n                {\n                  \"fn\": \"coalesce\",\n                  \"argv\": [\n                    {\n                      \"fn\": \"substring\",\n                      \"argv\": [\n                        {\n                          \"ref\": \"Bucket\"\n                        },\n                        19,\n                        21,\n                        true\n                      ]\n                    },\n                    \"\"\n                  ]\n                },\n                \"--\"\n              ]\n            },\n            {\n              \"fn\": \"stringEquals\",\n              \"argv\": [\n                {\n                  \"fn\": \"coalesce\",\n                  \"argv\": [\n                    {\n                      \"fn\": \"substring\",\n                      \"argv\": [\n                        {\n                          \"ref\": \"Bucket\"\n                        },\n                        14,\n                        16,\n                        true\n                      ]\n                    },\n                    \"\"\n                  ]\n                },\n                \"--\"\n              ]\n            },\n            {\n              \"fn\": \"stringEquals\",\n              \"argv\": [\n                {\n                  \"fn\": \"coalesce\",\n                  \"argv\": [\n                    {\n                      \"fn\": \"substring\",\n                      \"argv\": [\n                        {\n                          \"ref\": \"Bucket\"\n                        },\n                        20,\n                        22,\n                        true\n                      ]\n                    },\n                    \"\"\n                  ]\n                },\n                \"--\"\n              ]\n            },\n            {\n              \"fn\": \"stringEquals\",\n              \"argv\": [\n                {\n                  \"fn\": \"coalesce\",\n                  \"argv\": [\n                    {\n                      \"fn\": \"substring\",\n                      \"argv\": [\n                        {\n                          \"ref\": \"Bucket\"\n                        },\n                        15,\n                        17,\n                        true\n                      ]\n                    },\n                    \"\"\n                  ]\n                },\n                \"--\"\n              ]\n            },\n            {\n              \"fn\": \"stringEquals\",\n              \"argv\": [\n                {\n                  \"fn\": \"getAttr\",\n                  \"argv\": [\n                    {\n                      \"ref\": \"bucketArn\"\n                    },\n                    \"service\"\n                  ]\n                },\n                \"s3-outposts\"\n              ]\n            },\n            {\n              \"fn\": \"booleanEquals\",\n              \"argv\": [\n                {\n                  \"fn\": \"coalesce\",\n                  \"argv\": [\n                    {\n                      \"ref\": \"DisableAccessPoints\"\n                    },\n                    false\n                  ]\n                },\n                true\n              ]\n            },\n            {\n              \"fn\": \"aws.partition\",\n              \"argv\": [\n                {\n                  \"ref\": \"_effective_arn_region\"\n                }\n              ],\n              \"assign\": \"bucketPartition\"\n            },\n            {\n              \"fn\": \"stringEquals\",\n              \"argv\": [\n                {\n                  \"ref\": \"hardwareType\"\n                },\n                \"o\"\n              ]\n            },\n            {\n              \"fn\": \"getAttr\",\n              \"argv\": [\n                {\n                  \"ref\": \"bucketArn\"\n                },\n                \"resourceId[4]\"\n              ]\n            },\n            {\n              \"fn\": \"getAttr\",\n              \"argv\": [\n                {\n                  \"ref\": \"bucketArn\"\n                },\n                \"resourceId[1]\"\n              ],\n              \"assign\": \"outpostId_ssa_1\"\n            },\n            {\n              \"fn\": \"booleanEquals\",\n              \"argv\": [\n                {\n                  \"fn\": \"coalesce\",\n                  \"argv\": [\n                    {\n                      \"ref\": \"UseArnRegion\"\n                    },\n                    true\n                  ]\n                },\n                true\n              ]\n            },\n            {\n              \"fn\": \"stringEquals\",\n              \"argv\": [\n                {\n                  \"ref\": \"_effective_arn_region\"\n                },\n                {\n                  \"fn\": \"getAttr\",\n                  \"argv\": [\n                    {\n                      \"ref\": \"bucketArn\"\n                    },\n                    \"region\"\n                  ]\n                }\n              ]\n            },\n            {\n              \"fn\": \"stringEquals\",\n              \"argv\": [\n                {\n                  \"ref\": \"Region\"\n                },\n                \"aws-global\"\n              ]\n            },\n            {\n              \"fn\": \"booleanEquals\",\n              \"argv\": [\n                {\n                  \"ref\": \"UseGlobalEndpoint\"\n                },\n                true\n              ]\n            },\n            {\n              \"fn\": \"booleanEquals\",\n              \"argv\": [\n                {\n                  \"ref\": \"DisableMultiRegionAccessPoints\"\n                },\n                true\n              ]\n            },\n            {\n              \"fn\": \"stringEquals\",\n              \"argv\": [\n                {\n                  \"ref\": \"Region\"\n                },\n                \"us-east-1\"\n              ]\n            },\n            {\n              \"fn\": \"isValidHostLabel\",\n              \"argv\": [\n                {\n                  \"ref\": \"outpostId_ssa_1\"\n                },\n                false\n              ]\n            },\n            {\n              \"fn\": \"getAttr\",\n              \"argv\": [\n                {\n                  \"ref\": \"bucketArn\"\n                },\n                \"resourceId[2]\"\n              ],\n              \"assign\": \"outpostType\"\n            },\n            {\n              \"fn\": \"stringEquals\",\n              \"argv\": [\n                {\n                  \"fn\": \"getAttr\",\n                  \"argv\": [\n                    {\n                      \"ref\": \"bucketPartition\"\n                    },\n                    \"name\"\n                  ]\n                },\n                {\n                  \"fn\": \"getAttr\",\n                  \"argv\": [\n                    {\n                      \"ref\": \"partitionResult\"\n                    },\n                    \"name\"\n                  ]\n                }\n              ]\n            },\n            {\n              \"fn\": \"isValidHostLabel\",\n              \"argv\": [\n                {\n                  \"ref\": \"_effective_arn_region\"\n                },\n                true\n              ]\n            },\n            {\n              \"fn\": \"stringEquals\",\n              \"argv\": [\n                {\n                  \"fn\": \"getAttr\",\n                  \"argv\": [\n                    {\n                      \"ref\": \"bucketArn\"\n                    },\n                    \"service\"\n                  ]\n                },\n                \"s3\"\n              ]\n            },\n            {\n              \"fn\": \"stringEquals\",\n              \"argv\": [\n                {\n                  \"fn\": \"getAttr\",\n                  \"argv\": [\n                    {\n                      \"ref\": \"bucketArn\"\n                    },\n                    \"accountId\"\n                  ]\n                },\n                \"\"\n              ]\n            },\n            {\n              \"fn\": \"isValidHostLabel\",\n              \"argv\": [\n                {\n                  \"fn\": \"getAttr\",\n                  \"argv\": [\n                    {\n                      \"ref\": \"bucketArn\"\n                    },\n                    \"accountId\"\n                  ]\n                },\n                false\n              ]\n            },\n            {\n              \"fn\": \"isValidHostLabel\",\n              \"argv\": [\n                {\n                  \"ref\": \"accessPointName_ssa_1\"\n                },\n                false\n              ]\n            },\n            {\n              \"fn\": \"getAttr\",\n              \"argv\": [\n                {\n                  \"ref\": \"bucketArn\"\n                },\n                \"resourceId[3]\"\n              ],\n              \"assign\": \"accessPointName_ssa_2\"\n            },\n            {\n              \"fn\": \"isValidHostLabel\",\n              \"argv\": [\n                {\n                  \"ref\": \"accessPointName_ssa_1\"\n                },\n                true\n              ]\n            },\n            {\n              \"fn\": \"stringEquals\",\n              \"argv\": [\n                {\n                  \"fn\": \"getAttr\",\n                  \"argv\": [\n                    {\n                      \"ref\": \"bucketArn\"\n                    },\n                    \"partition\"\n                  ]\n                },\n                {\n                  \"fn\": \"getAttr\",\n                  \"argv\": [\n                    {\n                      \"ref\": \"partitionResult\"\n                    },\n                    \"name\"\n                  ]\n                }\n              ]\n            },\n            {\n              \"fn\": \"stringEquals\",\n              \"argv\": [\n                {\n                  \"ref\": \"outpostType\"\n                },\n                \"accesspoint\"\n              ]\n            }\n          ],\n          \"results\": [\n            {\n              \"conditions\": [],\n              \"error\": \"Accelerate cannot be used with FIPS\",\n              \"type\": \"error\"\n            },\n            {\n              \"conditions\": [],\n              \"error\": \"Cannot set dual-stack in combination with a custom endpoint.\",\n              \"type\": \"error\"\n            },\n            {\n              \"conditions\": [],\n              \"error\": \"A custom endpoint cannot be combined with FIPS\",\n              \"type\": \"error\"\n            },\n            {\n              \"conditions\": [],\n              \"error\": \"A custom endpoint cannot be combined with S3 Accelerate\",\n              \"type\": \"error\"\n            },\n            {\n              \"conditions\": [],\n              \"error\": \"Partition does not support FIPS\",\n              \"type\": \"error\"\n            },\n            {\n              \"conditions\": [],\n              \"error\": \"S3Express does not support S3 Accelerate.\",\n              \"type\": \"error\"\n            },\n            {\n              \"conditions\": [],\n              \"endpoint\": {\n                \"url\": \"{url#scheme}://{url#authority}/{uri_encoded_bucket}{url#path}\",\n                \"properties\": {\n                  \"backend\": \"S3Express\",\n                  \"authSchemes\": [\n                    {\n                      \"disableDoubleEncoding\": true,\n                      \"name\": \"{_s3e_auth}\",\n                      \"signingName\": \"s3express\",\n                      \"signingRegion\": \"{_effective_std_region}\"\n                    }\n                  ]\n                },\n                \"headers\": {}\n              },\n              \"type\": \"endpoint\"\n            },\n            {\n              \"conditions\": [],\n              \"endpoint\": {\n                \"url\": \"{url#scheme}://{Bucket}.{url#authority}{url#path}\",\n                \"properties\": {\n                  \"backend\": \"S3Express\",\n                  \"authSchemes\": [\n                    {\n                      \"disableDoubleEncoding\": true,\n                      \"name\": \"{_s3e_auth}\",\n                      \"signingName\": \"s3express\",\n                      \"signingRegion\": \"{_effective_std_region}\"\n                    }\n                  ]\n                },\n                \"headers\": {}\n              },\n              \"type\": \"endpoint\"\n            },\n            {\n              \"conditions\": [],\n              \"error\": \"S3Express bucket name is not a valid virtual hostable name.\",\n              \"type\": \"error\"\n            },\n            {\n              \"conditions\": [],\n              \"endpoint\": {\n                \"url\": \"https://s3express-control{_s3e_fips}{_s3e_ds}.{_effective_std_region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}\",\n                \"properties\": {\n                  \"backend\": \"S3Express\",\n                  \"authSchemes\": [\n                    {\n                      \"disableDoubleEncoding\": true,\n                      \"name\": \"sigv4\",\n                      \"signingName\": \"s3express\",\n                      \"signingRegion\": \"{_effective_std_region}\"\n                    }\n                  ]\n                },\n                \"headers\": {}\n              },\n              \"type\": \"endpoint\"\n            },\n            {\n              \"conditions\": [],\n              \"endpoint\": {\n                \"url\": \"https://{Bucket}.s3express{_s3e_fips}-{s3expressAvailabilityZoneId}{_s3e_ds}.{_effective_std_region}.{partitionResult#dnsSuffix}\",\n                \"properties\": {\n                  \"backend\": \"S3Express\",\n                  \"authSchemes\": [\n                    {\n                      \"disableDoubleEncoding\": true,\n                      \"name\": \"{_s3e_auth}\",\n                      \"signingName\": \"s3express\",\n                      \"signingRegion\": \"{_effective_std_region}\"\n                    }\n                  ]\n                },\n                \"headers\": {}\n              },\n              \"type\": \"endpoint\"\n            },\n            {\n              \"conditions\": [],\n              \"error\": \"Unrecognized S3Express bucket name format.\",\n              \"type\": \"error\"\n            },\n            {\n              \"conditions\": [],\n              \"endpoint\": {\n                \"url\": \"{url#scheme}://{url#authority}{url#path}\",\n                \"properties\": {\n                  \"backend\": \"S3Express\",\n                  \"authSchemes\": [\n                    {\n                      \"disableDoubleEncoding\": true,\n                      \"name\": \"{_s3e_auth}\",\n                      \"signingName\": \"s3express\",\n                      \"signingRegion\": \"{_effective_std_region}\"\n                    }\n                  ]\n                },\n                \"headers\": {}\n              },\n              \"type\": \"endpoint\"\n            },\n            {\n              \"conditions\": [],\n              \"endpoint\": {\n                \"url\": \"https://s3express-control{_s3e_fips}{_s3e_ds}.{_effective_std_region}.{partitionResult#dnsSuffix}\",\n                \"properties\": {\n                  \"backend\": \"S3Express\",\n                  \"authSchemes\": [\n                    {\n                      \"disableDoubleEncoding\": true,\n                      \"name\": \"sigv4\",\n                      \"signingName\": \"s3express\",\n                      \"signingRegion\": \"{_effective_std_region}\"\n                    }\n                  ]\n                },\n                \"headers\": {}\n              },\n              \"type\": \"endpoint\"\n            },\n            {\n              \"conditions\": [],\n              \"error\": \"Expected a endpoint to be specified but no endpoint was found\",\n              \"type\": \"error\"\n            },\n            {\n              \"conditions\": [],\n              \"endpoint\": {\n                \"url\": \"https://{Bucket}.ec2.{url#authority}\",\n                \"properties\": {\n                  \"authSchemes\": [\n                    {\n                      \"disableDoubleEncoding\": true,\n                      \"name\": \"sigv4a\",\n                      \"signingName\": \"s3-outposts\",\n                      \"signingRegionSet\": [\"*\"]\n                    },\n                    {\n                      \"disableDoubleEncoding\": true,\n                      \"name\": \"sigv4\",\n                      \"signingName\": \"s3-outposts\",\n                      \"signingRegion\": \"{_effective_std_region}\"\n                    }\n                  ]\n                },\n                \"headers\": {}\n              },\n              \"type\": \"endpoint\"\n            },\n            {\n              \"conditions\": [],\n              \"endpoint\": {\n                \"url\": \"https://{Bucket}.ec2.s3-outposts.{_effective_std_region}.{partitionResult#dnsSuffix}\",\n                \"properties\": {\n                  \"authSchemes\": [\n                    {\n                      \"disableDoubleEncoding\": true,\n                      \"name\": \"sigv4a\",\n                      \"signingName\": \"s3-outposts\",\n                      \"signingRegionSet\": [\"*\"]\n                    },\n                    {\n                      \"disableDoubleEncoding\": true,\n                      \"name\": \"sigv4\",\n                      \"signingName\": \"s3-outposts\",\n                      \"signingRegion\": \"{_effective_std_region}\"\n                    }\n                  ]\n                },\n                \"headers\": {}\n              },\n              \"type\": \"endpoint\"\n            },\n            {\n              \"conditions\": [],\n              \"endpoint\": {\n                \"url\": \"https://{Bucket}.op-{outpostId_ssa_2}.{url#authority}\",\n                \"properties\": {\n                  \"authSchemes\": [\n                    {\n                      \"disableDoubleEncoding\": true,\n                      \"name\": \"sigv4a\",\n                      \"signingName\": \"s3-outposts\",\n                      \"signingRegionSet\": [\"*\"]\n                    },\n                    {\n                      \"disableDoubleEncoding\": true,\n                      \"name\": \"sigv4\",\n                      \"signingName\": \"s3-outposts\",\n                      \"signingRegion\": \"{_effective_std_region}\"\n                    }\n                  ]\n                },\n                \"headers\": {}\n              },\n              \"type\": \"endpoint\"\n            },\n            {\n              \"conditions\": [],\n              \"endpoint\": {\n                \"url\": \"https://{Bucket}.op-{outpostId_ssa_2}.s3-outposts.{_effective_std_region}.{partitionResult#dnsSuffix}\",\n                \"properties\": {\n                  \"authSchemes\": [\n                    {\n                      \"disableDoubleEncoding\": true,\n                      \"name\": \"sigv4a\",\n                      \"signingName\": \"s3-outposts\",\n                      \"signingRegionSet\": [\"*\"]\n                    },\n                    {\n                      \"disableDoubleEncoding\": true,\n                      \"name\": \"sigv4\",\n                      \"signingName\": \"s3-outposts\",\n                      \"signingRegion\": \"{_effective_std_region}\"\n                    }\n                  ]\n                },\n                \"headers\": {}\n              },\n              \"type\": \"endpoint\"\n            },\n            {\n              \"conditions\": [],\n              \"error\": \"Unrecognized hardware type: \\\"Expected hardware type o or e but got {hardwareType}\\\"\",\n              \"type\": \"error\"\n            },\n            {\n              \"conditions\": [],\n              \"error\": \"Invalid ARN: The outpost Id must only contain a-z, A-Z, 0-9 and `-`.\",\n              \"type\": \"error\"\n            },\n            {\n              \"conditions\": [],\n              \"error\": \"Custom endpoint `{Endpoint}` was not a valid URI\",\n              \"type\": \"error\"\n            },\n            {\n              \"conditions\": [],\n              \"error\": \"S3 Accelerate cannot be used in this region\",\n              \"type\": \"error\"\n            },\n            {\n              \"conditions\": [],\n              \"endpoint\": {\n                \"url\": \"https://{Bucket}.s3-fips.dualstack.{_effective_std_region}.{partitionResult#dnsSuffix}\",\n                \"properties\": {\n                  \"authSchemes\": [\n                    {\n                      \"disableDoubleEncoding\": true,\n                      \"name\": \"sigv4\",\n                      \"signingName\": \"s3\",\n                      \"signingRegion\": \"{_effective_std_region}\"\n                    }\n                  ]\n                },\n                \"headers\": {}\n              },\n              \"type\": \"endpoint\"\n            },\n            {\n              \"conditions\": [],\n              \"endpoint\": {\n                \"url\": \"https://{Bucket}.s3-fips.{_effective_std_region}.{partitionResult#dnsSuffix}\",\n                \"properties\": {\n                  \"authSchemes\": [\n                    {\n                      \"disableDoubleEncoding\": true,\n                      \"name\": \"sigv4\",\n                      \"signingName\": \"s3\",\n                      \"signingRegion\": \"{_effective_std_region}\"\n                    }\n                  ]\n                },\n                \"headers\": {}\n              },\n              \"type\": \"endpoint\"\n            },\n            {\n              \"conditions\": [],\n              \"endpoint\": {\n                \"url\": \"https://{Bucket}.s3-accelerate.dualstack.{_effective_std_region}.{partitionResult#dnsSuffix}\",\n                \"properties\": {\n                  \"authSchemes\": [\n                    {\n                      \"disableDoubleEncoding\": true,\n                      \"name\": \"sigv4\",\n                      \"signingName\": \"s3\",\n                      \"signingRegion\": \"{_effective_std_region}\"\n                    }\n                  ]\n                },\n                \"headers\": {}\n              },\n              \"type\": \"endpoint\"\n            },\n            {\n              \"conditions\": [],\n              \"endpoint\": {\n                \"url\": \"https://{Bucket}.s3-accelerate.dualstack.{partitionResult#dnsSuffix}\",\n                \"properties\": {\n                  \"authSchemes\": [\n                    {\n                      \"disableDoubleEncoding\": true,\n                      \"name\": \"sigv4\",\n                      \"signingName\": \"s3\",\n                      \"signingRegion\": \"{_effective_std_region}\"\n                    }\n                  ]\n                },\n                \"headers\": {}\n              },\n              \"type\": \"endpoint\"\n            },\n            {\n              \"conditions\": [],\n              \"endpoint\": {\n                \"url\": \"https://{Bucket}.s3.dualstack.{_effective_std_region}.{partitionResult#dnsSuffix}\",\n                \"properties\": {\n                  \"authSchemes\": [\n                    {\n                      \"disableDoubleEncoding\": true,\n                      \"name\": \"sigv4\",\n                      \"signingName\": \"s3\",\n                      \"signingRegion\": \"{_effective_std_region}\"\n                    }\n                  ]\n                },\n                \"headers\": {}\n              },\n              \"type\": \"endpoint\"\n            },\n            {\n              \"conditions\": [],\n              \"endpoint\": {\n                \"url\": \"{url#scheme}://{url#authority}{url#normalizedPath}{Bucket}\",\n                \"properties\": {\n                  \"authSchemes\": [\n                    {\n                      \"disableDoubleEncoding\": true,\n                      \"name\": \"sigv4\",\n                      \"signingName\": \"s3\",\n                      \"signingRegion\": \"{_effective_std_region}\"\n                    }\n                  ]\n                },\n                \"headers\": {}\n              },\n              \"type\": \"endpoint\"\n            },\n            {\n              \"conditions\": [],\n              \"endpoint\": {\n                \"url\": \"{url#scheme}://{Bucket}.{url#authority}{url#path}\",\n                \"properties\": {\n                  \"authSchemes\": [\n                    {\n                      \"disableDoubleEncoding\": true,\n                      \"name\": \"sigv4\",\n                      \"signingName\": \"s3\",\n                      \"signingRegion\": \"{_effective_std_region}\"\n                    }\n                  ]\n                },\n                \"headers\": {}\n              },\n              \"type\": \"endpoint\"\n            },\n            {\n              \"conditions\": [],\n              \"endpoint\": {\n                \"url\": \"https://{Bucket}.s3-accelerate.{partitionResult#dnsSuffix}\",\n                \"properties\": {\n                  \"authSchemes\": [\n                    {\n                      \"disableDoubleEncoding\": true,\n                      \"name\": \"sigv4\",\n                      \"signingName\": \"s3\",\n                      \"signingRegion\": \"{_effective_std_region}\"\n                    }\n                  ]\n                },\n                \"headers\": {}\n              },\n              \"type\": \"endpoint\"\n            },\n            {\n              \"conditions\": [],\n              \"endpoint\": {\n                \"url\": \"https://{Bucket}.s3.{partitionResult#dnsSuffix}\",\n                \"properties\": {\n                  \"authSchemes\": [\n                    {\n                      \"disableDoubleEncoding\": true,\n                      \"name\": \"sigv4\",\n                      \"signingName\": \"s3\",\n                      \"signingRegion\": \"{_effective_std_region}\"\n                    }\n                  ]\n                },\n                \"headers\": {}\n              },\n              \"type\": \"endpoint\"\n            },\n            {\n              \"conditions\": [],\n              \"endpoint\": {\n                \"url\": \"https://{Bucket}.s3.{_effective_std_region}.{partitionResult#dnsSuffix}\",\n                \"properties\": {\n                  \"authSchemes\": [\n                    {\n                      \"disableDoubleEncoding\": true,\n                      \"name\": \"sigv4\",\n                      \"signingName\": \"s3\",\n                      \"signingRegion\": \"{_effective_std_region}\"\n                    }\n                  ]\n                },\n                \"headers\": {}\n              },\n              \"type\": \"endpoint\"\n            },\n            {\n              \"conditions\": [],\n              \"error\": \"Invalid region: region was not a valid DNS name.\",\n              \"type\": \"error\"\n            },\n            {\n              \"conditions\": [],\n              \"error\": \"S3 Object Lambda does not support Dual-stack\",\n              \"type\": \"error\"\n            },\n            {\n              \"conditions\": [],\n              \"error\": \"S3 Object Lambda does not support S3 Accelerate\",\n              \"type\": \"error\"\n            },\n            {\n              \"conditions\": [],\n              \"error\": \"Access points are not supported for this operation\",\n              \"type\": \"error\"\n            },\n            {\n              \"conditions\": [],\n              \"error\": \"Invalid configuration: region from ARN `{bucketArn#region}` does not match client region `{Region}` and UseArnRegion is `false`\",\n              \"type\": \"error\"\n            },\n            {\n              \"conditions\": [],\n              \"error\": \"Invalid ARN: Missing account id\",\n              \"type\": \"error\"\n            },\n            {\n              \"conditions\": [],\n              \"endpoint\": {\n                \"url\": \"{url#scheme}://{accessPointName_ssa_1}-{bucketArn#accountId}.{url#authority}{url#path}\",\n                \"properties\": {\n                  \"authSchemes\": [\n                    {\n                      \"disableDoubleEncoding\": true,\n                      \"name\": \"sigv4\",\n                      \"signingName\": \"s3-object-lambda\",\n                      \"signingRegion\": \"{_effective_arn_region}\"\n                    }\n                  ]\n                },\n                \"headers\": {}\n              },\n              \"type\": \"endpoint\"\n            },\n            {\n              \"conditions\": [],\n              \"endpoint\": {\n                \"url\": \"https://{accessPointName_ssa_1}-{bucketArn#accountId}.s3-object-lambda-fips.{_effective_arn_region}.{bucketPartition#dnsSuffix}\",\n                \"properties\": {\n                  \"authSchemes\": [\n                    {\n                      \"disableDoubleEncoding\": true,\n                      \"name\": \"sigv4\",\n                      \"signingName\": \"s3-object-lambda\",\n                      \"signingRegion\": \"{_effective_arn_region}\"\n                    }\n                  ]\n                },\n                \"headers\": {}\n              },\n              \"type\": \"endpoint\"\n            },\n            {\n              \"conditions\": [],\n              \"endpoint\": {\n                \"url\": \"https://{accessPointName_ssa_1}-{bucketArn#accountId}.s3-object-lambda.{_effective_arn_region}.{bucketPartition#dnsSuffix}\",\n                \"properties\": {\n                  \"authSchemes\": [\n                    {\n                      \"disableDoubleEncoding\": true,\n                      \"name\": \"sigv4\",\n                      \"signingName\": \"s3-object-lambda\",\n                      \"signingRegion\": \"{_effective_arn_region}\"\n                    }\n                  ]\n                },\n                \"headers\": {}\n              },\n              \"type\": \"endpoint\"\n            },\n            {\n              \"conditions\": [],\n              \"error\": \"Invalid ARN: The access point name may only contain a-z, A-Z, 0-9 and `-`. Found: `{accessPointName_ssa_1}`\",\n              \"type\": \"error\"\n            },\n            {\n              \"conditions\": [],\n              \"error\": \"Invalid ARN: The account id may only contain a-z, A-Z, 0-9 and `-`. Found: `{bucketArn#accountId}`\",\n              \"type\": \"error\"\n            },\n            {\n              \"conditions\": [],\n              \"error\": \"Invalid region in ARN: `{bucketArn#region}` (invalid DNS name)\",\n              \"type\": \"error\"\n            },\n            {\n              \"conditions\": [],\n              \"error\": \"Client was configured for partition `{partitionResult#name}` but ARN (`{Bucket}`) has `{bucketPartition#name}`\",\n              \"type\": \"error\"\n            },\n            {\n              \"conditions\": [],\n              \"error\": \"Invalid ARN: The ARN may only contain a single resource component after `accesspoint`.\",\n              \"type\": \"error\"\n            },\n            {\n              \"conditions\": [],\n              \"error\": \"Invalid ARN: bucket ARN is missing a region\",\n              \"type\": \"error\"\n            },\n            {\n              \"conditions\": [],\n              \"error\": \"Invalid ARN: Expected a resource of the format `accesspoint:<accesspoint name>` but no name was provided\",\n              \"type\": \"error\"\n            },\n            {\n              \"conditions\": [],\n              \"error\": \"Invalid ARN: Object Lambda ARNs only support `accesspoint` arn types, but found: `{arnType}`\",\n              \"type\": \"error\"\n            },\n            {\n              \"conditions\": [],\n              \"error\": \"Access Points do not support S3 Accelerate\",\n              \"type\": \"error\"\n            },\n            {\n              \"conditions\": [],\n              \"endpoint\": {\n                \"url\": \"https://{accessPointName_ssa_1}-{bucketArn#accountId}.s3-accesspoint-fips.dualstack.{_effective_arn_region}.{bucketPartition#dnsSuffix}\",\n                \"properties\": {\n                  \"authSchemes\": [\n                    {\n                      \"disableDoubleEncoding\": true,\n                      \"name\": \"sigv4\",\n                      \"signingName\": \"s3\",\n                      \"signingRegion\": \"{_effective_arn_region}\"\n                    }\n                  ]\n                },\n                \"headers\": {}\n              },\n              \"type\": \"endpoint\"\n            },\n            {\n              \"conditions\": [],\n              \"endpoint\": {\n                \"url\": \"https://{accessPointName_ssa_1}-{bucketArn#accountId}.s3-accesspoint-fips.{_effective_arn_region}.{bucketPartition#dnsSuffix}\",\n                \"properties\": {\n                  \"authSchemes\": [\n                    {\n                      \"disableDoubleEncoding\": true,\n                      \"name\": \"sigv4\",\n                      \"signingName\": \"s3\",\n                      \"signingRegion\": \"{_effective_arn_region}\"\n                    }\n                  ]\n                },\n                \"headers\": {}\n              },\n              \"type\": \"endpoint\"\n            },\n            {\n              \"conditions\": [],\n              \"endpoint\": {\n                \"url\": \"https://{accessPointName_ssa_1}-{bucketArn#accountId}.s3-accesspoint.dualstack.{_effective_arn_region}.{bucketPartition#dnsSuffix}\",\n                \"properties\": {\n                  \"authSchemes\": [\n                    {\n                      \"disableDoubleEncoding\": true,\n                      \"name\": \"sigv4\",\n                      \"signingName\": \"s3\",\n                      \"signingRegion\": \"{_effective_arn_region}\"\n                    }\n                  ]\n                },\n                \"headers\": {}\n              },\n              \"type\": \"endpoint\"\n            },\n            {\n              \"conditions\": [],\n              \"endpoint\": {\n                \"url\": \"{url#scheme}://{accessPointName_ssa_1}-{bucketArn#accountId}.{url#authority}{url#path}\",\n                \"properties\": {\n                  \"authSchemes\": [\n                    {\n                      \"disableDoubleEncoding\": true,\n                      \"name\": \"sigv4\",\n                      \"signingName\": \"s3\",\n                      \"signingRegion\": \"{_effective_arn_region}\"\n                    }\n                  ]\n                },\n                \"headers\": {}\n              },\n              \"type\": \"endpoint\"\n            },\n            {\n              \"conditions\": [],\n              \"endpoint\": {\n                \"url\": \"https://{accessPointName_ssa_1}-{bucketArn#accountId}.s3-accesspoint.{_effective_arn_region}.{bucketPartition#dnsSuffix}\",\n                \"properties\": {\n                  \"authSchemes\": [\n                    {\n                      \"disableDoubleEncoding\": true,\n                      \"name\": \"sigv4\",\n                      \"signingName\": \"s3\",\n                      \"signingRegion\": \"{_effective_arn_region}\"\n                    }\n                  ]\n                },\n                \"headers\": {}\n              },\n              \"type\": \"endpoint\"\n            },\n            {\n              \"conditions\": [],\n              \"error\": \"Invalid ARN: The ARN was not for the S3 service, found: {bucketArn#service}\",\n              \"type\": \"error\"\n            },\n            {\n              \"conditions\": [],\n              \"error\": \"S3 MRAP does not support dual-stack\",\n              \"type\": \"error\"\n            },\n            {\n              \"conditions\": [],\n              \"error\": \"S3 MRAP does not support FIPS\",\n              \"type\": \"error\"\n            },\n            {\n              \"conditions\": [],\n              \"error\": \"S3 MRAP does not support S3 Accelerate\",\n              \"type\": \"error\"\n            },\n            {\n              \"conditions\": [],\n              \"error\": \"Invalid configuration: Multi-Region Access Point ARNs are disabled.\",\n              \"type\": \"error\"\n            },\n            {\n              \"conditions\": [],\n              \"endpoint\": {\n                \"url\": \"https://{accessPointName_ssa_1}.accesspoint.s3-global.{partitionResult#dnsSuffix}\",\n                \"properties\": {\n                  \"authSchemes\": [\n                    {\n                      \"disableDoubleEncoding\": true,\n                      \"name\": \"sigv4a\",\n                      \"signingName\": \"s3\",\n                      \"signingRegionSet\": [\"*\"]\n                    }\n                  ]\n                },\n                \"headers\": {}\n              },\n              \"type\": \"endpoint\"\n            },\n            {\n              \"conditions\": [],\n              \"error\": \"Client was configured for partition `{partitionResult#name}` but bucket referred to partition `{bucketArn#partition}`\",\n              \"type\": \"error\"\n            },\n            {\n              \"conditions\": [],\n              \"error\": \"Invalid Access Point Name\",\n              \"type\": \"error\"\n            },\n            {\n              \"conditions\": [],\n              \"error\": \"S3 Outposts does not support Dual-stack\",\n              \"type\": \"error\"\n            },\n            {\n              \"conditions\": [],\n              \"error\": \"S3 Outposts does not support FIPS\",\n              \"type\": \"error\"\n            },\n            {\n              \"conditions\": [],\n              \"error\": \"S3 Outposts does not support S3 Accelerate\",\n              \"type\": \"error\"\n            },\n            {\n              \"conditions\": [],\n              \"error\": \"Invalid Arn: Outpost Access Point ARN contains sub resources\",\n              \"type\": \"error\"\n            },\n            {\n              \"conditions\": [],\n              \"endpoint\": {\n                \"url\": \"https://{accessPointName_ssa_2}-{bucketArn#accountId}.{outpostId_ssa_1}.{url#authority}\",\n                \"properties\": {\n                  \"authSchemes\": [\n                    {\n                      \"disableDoubleEncoding\": true,\n                      \"name\": \"sigv4a\",\n                      \"signingName\": \"s3-outposts\",\n                      \"signingRegionSet\": [\"*\"]\n                    },\n                    {\n                      \"disableDoubleEncoding\": true,\n                      \"name\": \"sigv4\",\n                      \"signingName\": \"s3-outposts\",\n                      \"signingRegion\": \"{_effective_arn_region}\"\n                    }\n                  ]\n                },\n                \"headers\": {}\n              },\n              \"type\": \"endpoint\"\n            },\n            {\n              \"conditions\": [],\n              \"endpoint\": {\n                \"url\": \"https://{accessPointName_ssa_2}-{bucketArn#accountId}.{outpostId_ssa_1}.s3-outposts.{_effective_arn_region}.{bucketPartition#dnsSuffix}\",\n                \"properties\": {\n                  \"authSchemes\": [\n                    {\n                      \"disableDoubleEncoding\": true,\n                      \"name\": \"sigv4a\",\n                      \"signingName\": \"s3-outposts\",\n                      \"signingRegionSet\": [\"*\"]\n                    },\n                    {\n                      \"disableDoubleEncoding\": true,\n                      \"name\": \"sigv4\",\n                      \"signingName\": \"s3-outposts\",\n                      \"signingRegion\": \"{_effective_arn_region}\"\n                    }\n                  ]\n                },\n                \"headers\": {}\n              },\n              \"type\": \"endpoint\"\n            },\n            {\n              \"conditions\": [],\n              \"error\": \"Expected an outpost type `accesspoint`, found {outpostType}\",\n              \"type\": \"error\"\n            },\n            {\n              \"conditions\": [],\n              \"error\": \"Invalid ARN: expected an access point name\",\n              \"type\": \"error\"\n            },\n            {\n              \"conditions\": [],\n              \"error\": \"Invalid ARN: Expected a 4-component resource\",\n              \"type\": \"error\"\n            },\n            {\n              \"conditions\": [],\n              \"error\": \"Invalid ARN: The outpost Id may only contain a-z, A-Z, 0-9 and `-`. Found: `{outpostId_ssa_1}`\",\n              \"type\": \"error\"\n            },\n            {\n              \"conditions\": [],\n              \"error\": \"Invalid ARN: The Outpost Id was not set\",\n              \"type\": \"error\"\n            },\n            {\n              \"conditions\": [],\n              \"error\": \"Invalid ARN: Unrecognized format: {Bucket} (type: {arnType})\",\n              \"type\": \"error\"\n            },\n            {\n              \"conditions\": [],\n              \"error\": \"Invalid ARN: No ARN type specified\",\n              \"type\": \"error\"\n            },\n            {\n              \"conditions\": [],\n              \"error\": \"Invalid ARN: `{Bucket}` was not a valid ARN\",\n              \"type\": \"error\"\n            },\n            {\n              \"conditions\": [],\n              \"error\": \"Path-style addressing cannot be used with ARN buckets\",\n              \"type\": \"error\"\n            },\n            {\n              \"conditions\": [],\n              \"endpoint\": {\n                \"url\": \"https://s3-fips.dualstack.{_effective_std_region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}\",\n                \"properties\": {\n                  \"authSchemes\": [\n                    {\n                      \"disableDoubleEncoding\": true,\n                      \"name\": \"sigv4\",\n                      \"signingName\": \"s3\",\n                      \"signingRegion\": \"{_effective_std_region}\"\n                    }\n                  ]\n                },\n                \"headers\": {}\n              },\n              \"type\": \"endpoint\"\n            },\n            {\n              \"conditions\": [],\n              \"endpoint\": {\n                \"url\": \"https://s3-fips.{_effective_std_region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}\",\n                \"properties\": {\n                  \"authSchemes\": [\n                    {\n                      \"disableDoubleEncoding\": true,\n                      \"name\": \"sigv4\",\n                      \"signingName\": \"s3\",\n                      \"signingRegion\": \"{_effective_std_region}\"\n                    }\n                  ]\n                },\n                \"headers\": {}\n              },\n              \"type\": \"endpoint\"\n            },\n            {\n              \"conditions\": [],\n              \"endpoint\": {\n                \"url\": \"https://s3.dualstack.{_effective_std_region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}\",\n                \"properties\": {\n                  \"authSchemes\": [\n                    {\n                      \"disableDoubleEncoding\": true,\n                      \"name\": \"sigv4\",\n                      \"signingName\": \"s3\",\n                      \"signingRegion\": \"{_effective_std_region}\"\n                    }\n                  ]\n                },\n                \"headers\": {}\n              },\n              \"type\": \"endpoint\"\n            },\n            {\n              \"conditions\": [],\n              \"endpoint\": {\n                \"url\": \"{url#scheme}://{url#authority}{url#normalizedPath}{uri_encoded_bucket}\",\n                \"properties\": {\n                  \"authSchemes\": [\n                    {\n                      \"disableDoubleEncoding\": true,\n                      \"name\": \"sigv4\",\n                      \"signingName\": \"s3\",\n                      \"signingRegion\": \"{_effective_std_region}\"\n                    }\n                  ]\n                },\n                \"headers\": {}\n              },\n              \"type\": \"endpoint\"\n            },\n            {\n              \"conditions\": [],\n              \"endpoint\": {\n                \"url\": \"https://s3.{partitionResult#dnsSuffix}/{uri_encoded_bucket}\",\n                \"properties\": {\n                  \"authSchemes\": [\n                    {\n                      \"disableDoubleEncoding\": true,\n                      \"name\": \"sigv4\",\n                      \"signingName\": \"s3\",\n                      \"signingRegion\": \"{_effective_std_region}\"\n                    }\n                  ]\n                },\n                \"headers\": {}\n              },\n              \"type\": \"endpoint\"\n            },\n            {\n              \"conditions\": [],\n              \"endpoint\": {\n                \"url\": \"https://s3.{_effective_std_region}.{partitionResult#dnsSuffix}/{uri_encoded_bucket}\",\n                \"properties\": {\n                  \"authSchemes\": [\n                    {\n                      \"disableDoubleEncoding\": true,\n                      \"name\": \"sigv4\",\n                      \"signingName\": \"s3\",\n                      \"signingRegion\": \"{_effective_std_region}\"\n                    }\n                  ]\n                },\n                \"headers\": {}\n              },\n              \"type\": \"endpoint\"\n            },\n            {\n              \"conditions\": [],\n              \"error\": \"Path-style addressing cannot be used with S3 Accelerate\",\n              \"type\": \"error\"\n            },\n            {\n              \"conditions\": [],\n              \"endpoint\": {\n                \"url\": \"{url#scheme}://{url#authority}{url#path}\",\n                \"properties\": {\n                  \"authSchemes\": [\n                    {\n                      \"disableDoubleEncoding\": true,\n                      \"name\": \"sigv4\",\n                      \"signingName\": \"s3-object-lambda\",\n                      \"signingRegion\": \"{_effective_std_region}\"\n                    }\n                  ]\n                },\n                \"headers\": {}\n              },\n              \"type\": \"endpoint\"\n            },\n            {\n              \"conditions\": [],\n              \"endpoint\": {\n                \"url\": \"https://s3-object-lambda-fips.{_effective_std_region}.{partitionResult#dnsSuffix}\",\n                \"properties\": {\n                  \"authSchemes\": [\n                    {\n                      \"disableDoubleEncoding\": true,\n                      \"name\": \"sigv4\",\n                      \"signingName\": \"s3-object-lambda\",\n                      \"signingRegion\": \"{_effective_std_region}\"\n                    }\n                  ]\n                },\n                \"headers\": {}\n              },\n              \"type\": \"endpoint\"\n            },\n            {\n              \"conditions\": [],\n              \"endpoint\": {\n                \"url\": \"https://s3-object-lambda.{_effective_std_region}.{partitionResult#dnsSuffix}\",\n                \"properties\": {\n                  \"authSchemes\": [\n                    {\n                      \"disableDoubleEncoding\": true,\n                      \"name\": \"sigv4\",\n                      \"signingName\": \"s3-object-lambda\",\n                      \"signingRegion\": \"{_effective_std_region}\"\n                    }\n                  ]\n                },\n                \"headers\": {}\n              },\n              \"type\": \"endpoint\"\n            },\n            {\n              \"conditions\": [],\n              \"endpoint\": {\n                \"url\": \"https://s3-fips.dualstack.{_effective_std_region}.{partitionResult#dnsSuffix}\",\n                \"properties\": {\n                  \"authSchemes\": [\n                    {\n                      \"disableDoubleEncoding\": true,\n                      \"name\": \"sigv4\",\n                      \"signingName\": \"s3\",\n                      \"signingRegion\": \"{_effective_std_region}\"\n                    }\n                  ]\n                },\n                \"headers\": {}\n              },\n              \"type\": \"endpoint\"\n            },\n            {\n              \"conditions\": [],\n              \"endpoint\": {\n                \"url\": \"https://s3-fips.{_effective_std_region}.{partitionResult#dnsSuffix}\",\n                \"properties\": {\n                  \"authSchemes\": [\n                    {\n                      \"disableDoubleEncoding\": true,\n                      \"name\": \"sigv4\",\n                      \"signingName\": \"s3\",\n                      \"signingRegion\": \"{_effective_std_region}\"\n                    }\n                  ]\n                },\n                \"headers\": {}\n              },\n              \"type\": \"endpoint\"\n            },\n            {\n              \"conditions\": [],\n              \"endpoint\": {\n                \"url\": \"https://s3.dualstack.{_effective_std_region}.{partitionResult#dnsSuffix}\",\n                \"properties\": {\n                  \"authSchemes\": [\n                    {\n                      \"disableDoubleEncoding\": true,\n                      \"name\": \"sigv4\",\n                      \"signingName\": \"s3\",\n                      \"signingRegion\": \"{_effective_std_region}\"\n                    }\n                  ]\n                },\n                \"headers\": {}\n              },\n              \"type\": \"endpoint\"\n            },\n            {\n              \"conditions\": [],\n              \"endpoint\": {\n                \"url\": \"{url#scheme}://{url#authority}{url#path}\",\n                \"properties\": {\n                  \"authSchemes\": [\n                    {\n                      \"disableDoubleEncoding\": true,\n                      \"name\": \"sigv4\",\n                      \"signingName\": \"s3\",\n                      \"signingRegion\": \"{_effective_std_region}\"\n                    }\n                  ]\n                },\n                \"headers\": {}\n              },\n              \"type\": \"endpoint\"\n            },\n            {\n              \"conditions\": [],\n              \"endpoint\": {\n                \"url\": \"https://s3.{partitionResult#dnsSuffix}\",\n                \"properties\": {\n                  \"authSchemes\": [\n                    {\n                      \"disableDoubleEncoding\": true,\n                      \"name\": \"sigv4\",\n                      \"signingName\": \"s3\",\n                      \"signingRegion\": \"{_effective_std_region}\"\n                    }\n                  ]\n                },\n                \"headers\": {}\n              },\n              \"type\": \"endpoint\"\n            },\n            {\n              \"conditions\": [],\n              \"endpoint\": {\n                \"url\": \"https://s3.{_effective_std_region}.{partitionResult#dnsSuffix}\",\n                \"properties\": {\n                  \"authSchemes\": [\n                    {\n                      \"disableDoubleEncoding\": true,\n                      \"name\": \"sigv4\",\n                      \"signingName\": \"s3\",\n                      \"signingRegion\": \"{_effective_std_region}\"\n                    }\n                  ]\n                },\n                \"headers\": {}\n              },\n              \"type\": \"endpoint\"\n            },\n            {\n              \"conditions\": [],\n              \"error\": \"A region must be set when sending requests to S3.\",\n              \"type\": \"error\"\n            }\n          ],\n          \"root\": 521,\n          \"nodeCount\": 521,\n          \"nodes\": \"/////wAAAAH/////AAAABQX14QIF9eEEAAAANwX14Q8F9eEUAAAALgX14Q8AAAADAAAANwX14RMF9eEUAAAALgX14REAAAAFAAAAGQAAAAQAAAAGAAAAFwAAAAcF9eEVAAAALAX14SMF9eEiAAAAJQAAAAkF9eFgAAAAJAX14VYAAAAKAAAAIwX14U4AAAALAAAAHwX14U8AAAAMAAAAHgX14RcF9eEiAAAASQX14ToF9eFAAAAARwX14TMF9eErAAAARgAAABAF9eEsAAAARAAAABEF9eE5AAAAQwAAABIF9eEtAAAAQgAAABMF9eEuAAAAQQX14S8AAAAUAAAAQQX14S8F9eEmAAAAOwAAABUAAAAWAAAAOgAAABUAAAAXAAAAOwX14S8AAAAWAAAAOgX14S8AAAAZAAAANgAAABgAAAAaAAAANQX14SUAAAAbAAAALQAAAA8AAAAcAAAAKwX14SMAAAAdAAAAKgX14TEAAAAeAAAAKQAAAB8F9eExAAAANAX14UEF9eFMAAAAKwX14TIAAAAhAAAAKAAAACAAAAAiAAAAJwX14U0AAAAjAAAAJgAAACQF9eFNAAAAIQAAACUAAAALAAAAHwAAACYAAAAMAAAAFQAAAA4AAAAnAAAAEwAAAA0AAAAoAAAAPAX14RoF9eEbAAAAHgAAACoF9eEiAAAAFQAAACsAAAAnAAAAEwAAAA0AAAAsAAAAEAAAACkAAAAtAAAADwAAAAgAAAAuAAAADgAAAC8AAAAuAAAADQAAADAAAAAuAAAADAAAADEAAAAuAAAACwAAADIAAAAuAAAAIwX14U4F9eFgAAAAHwX14U8AAAA0AAAANQX14SUAAAAaAAAALQAAAA8AAAA2AAAAKwX14SMAAAA3AAAAKgX14TEAAAA4AAAAKQAAADkF9eExAAAAKAAAADoAAAAiAAAAJwX14U0AAAA7AAAAJgAAADwF9eFNAAAAIQAAAD0F9eFgAAAAHwAAAD4AAAA0AAAAEwAAADUAAAA/AAAACQAAADMAAABAAAAACAX14QYAAABBAAAABwX14QYAAABCAAAALAX14VwF9eEiAAAAJQAAAAkAAABEAAAAGAX14Q4AAABFAAAAFAAAAEYAAABFAAAAEgAAAEcAAABFAAAAEQAAAEgAAABFAAAACQAAAEkF9eFgAAAABgAAAEMAAABKAAAALAX14SQF9eEiAAAAJQAAAEwF9eFgAAAAJAX14VYAAABNAAAAIwX14U4AAABOAAAAHwX14U8AAABPAAAASQX14TwF9eFAAAAALQAAAFEAAAAcAAAAKwX14SQAAABSAAAAKgX14TEAAABTAAAAKQAAAFQF9eExAAAANAX14UMF9eFMAAAAKwX14TIAAABWAAAAKAAAAFUAAABXAAAAJwX14U0AAABYAAAAJgAAAFkF9eFNAAAAIQAAAFoAAABOAAAAHwAAAFsAAABPAAAAFQAAAA4AAABcAAAAEwAAAFAAAABdAAAAHgX14R8F9eEiAAAAFQAAAF8AAABcAAAAEwAAAFAAAABgAAAAEAAAAF4AAABhAAAADwAAAAgAAABiAAAADgAAAGMAAABiAAAADQAAAGQAAABiAAAADAAAAGUAAABiAAAACwAAAGYAAABiAAAALQAAAFEAAAA2AAAAKwX14SQAAABoAAAAKgX14TEAAABpAAAAKQAAAGoF9eExAAAAKAAAAGsAAABXAAAAJwX14U0AAABsAAAAJgAAAG0F9eFNAAAAIQAAAG4F9eFgAAAAHwAAAG8AAAA0AAAAEwAAADUAAABwAAAACQAAAGcAAABxAAAACAX14QYAAAByAAAABwX14QYAAABzAAAAPwX14V4F9eFfAAAAPQAAAHUF9eFfAAAAPAX14V4AAAB2AAAALAAAAHcF9eEiAAAAJQAAAEwAAAB4AAAAGAX14Q4AAAB5AAAAFAAAAHoAAAB5AAAAEgAAAHsAAAB5AAAAEQAAAHwAAAB5AAAACQAAAH0F9eFgAAAABgAAAHQAAAB+AAAABQAAAEsAAAB/AAAABAAAAAIAAACAAAAAAwX14QEAAACBAAAABQX14QIF9eEDAAAAMwX14QsF9eEMAAAAMgX14QsAAACEAAAAMQX14QsAAACFAAAAMAX14QsAAACGAAAALwX14QsAAACHAAAAJAX14QoAAACIAAAAGAAAAIkAAACIAAAAJAX14QoF9eEMAAAAGAAAAIsF9eEMAAAAFgAAAIoAAACMAAAAJAX14QoF9eEJAAAAGAAAAI4F9eEJAAAAFQAAAI0AAACPAAAAFQX14QwF9eEJAAAAFAAAAJAAAACRAAAAEgAAAJIAAACRAAAAEQAAAJMAAACRAAAAEAX14QUAAACUAAAACQAAAJUF9eEJAAAAIAX14QsAAACFAAAAHAX14QsAAACXAAAAGwX14QsAAACYAAAAFgAAAJkF9eEMAAAAFQAAAJoF9eEJAAAAFAAAAJsAAACRAAAAEgAAAJwAAACRAAAAEQAAAJ0AAACRAAAAEAX14QUAAACeAAAACQAAAJ8F9eEJAAAAEAX14QUAAAAIAAAAJAX14VAAAAAKAAAAIwX14U4AAACiAAAAHwX14U8AAACjAAAAHgX14RgF9eEiAAAARwX14TQF9eErAAAARgAAAKYF9eEsAAAARAAAAKcF9eE5AAAAQwAAAKgF9eEtAAAAQgAAAKkF9eEuAAAAQQX14S8AAACqAAAAOwAAAKsAAAAWAAAAOgAAAKsAAACsAAAANgAAAK0AAAAaAAAANQX14SUAAACuAAAALQAAAA8AAACvAAAAKwX14SMAAACwAAAAKgX14TEAAACxAAAAKQAAALIF9eExAAAAKAAAALMAAAAiAAAAJwX14U0AAAC0AAAAJgAAALUF9eFNAAAAIQAAALYAAACiAAAAHwAAALcAAACjAAAAFQAAAKUAAAC4AAAAEwAAAKQAAAC5AAAAEAX14QUAAAC6AAAADwAAAKEAAAC7AAAADgAAALwAAAC7AAAADQAAAL0AAAC7AAAADAAAAL4AAAC7AAAACwAAAL8AAAC7AAAACQAAAMAAAABAAAAACAAAAKAAAADBAAAABwAAAJYAAADCAAAALAX14VoF9eEiAAAAJQAAAAkAAADEAAAAGAX14Q4AAADFAAAAFAAAAMYAAADFAAAAEgAAAMcAAADFAAAAEQAAAMgAAADFAAAAEAX14QUAAADJAAAACQAAAMoF9eFgAAAABgAAAMMAAADLAAAALAX14VgF9eEiAAAAJQAAAM0F9eFgAAAAJAX14VEAAADOAAAAIwX14U4AAADPAAAAHwX14U8AAADQAAAAHgX14RkF9eEiAAAARwX14SkF9eErAAAARgAAANMF9eEsAAAARQX14ScAAADUAAAAQwAAANUF9eEtAAAAQgAAANYF9eEuAAAAQQX14S8AAADXAAAAOwAAANgAAAAWAAAAOgAAANgAAADZAAAANgAAANoAAAAaAAAANQX14SUAAADbAAAALQX14TAAAADcAAAASQX14TsF9eFAAAAARwX14TUF9eErAAAARgAAAN8F9eEsAAAARAAAAOAF9eE5AAAAQwAAAOEF9eEtAAAAQgAAAOIF9eEuAAAAQQX14S8AAADjAAAAOwAAAOQAAAAWAAAAOgAAAOQAAADlAAAANgAAAOYAAAAaAAAANQX14SUAAADnAAAALQAAAN4AAADoAAAAKwAAAN0AAADpAAAAKgX14TEAAADqAAAAKQAAAOsF9eExAAAANAX14UIF9eFMAAAAKwX14TIAAADtAAAAKAAAAOwAAADuAAAAJwX14U0AAADvAAAAJgAAAPAF9eFNAAAAIQAAAPEAAADPAAAAHwAAAPIAAADQAAAAFQAAANIAAADzAAAAEwAAANEAAAD0AAAAEAX14QUAAAD1AAAADwAAAKEAAAD2AAAADgAAAPcAAAD2AAAADQAAAPgAAAD2AAAADAAAAPkAAAD2AAAACwAAAPoAAAD2AAAALQX14TAAAAA2AAAALQAAAN4AAAA2AAAAKwAAAPwAAAD9AAAAKgX14TEAAAD+AAAAKQAAAP8F9eExAAAAKAAAAQAAAADuAAAAJwX14U0AAAEBAAAAJgAAAQIF9eFNAAAAIQAAAQMF9eFgAAAAHwAAAQQAAAA0AAAAEwAAADUAAAEFAAAACQAAAPsAAAEGAAAACAAAAKAAAAEHAAAABwAAAJYAAAEIAAAALAX14VsF9eEiAAAAJQAAAM0AAAEKAAAAGAX14Q4AAAELAAAAFAAAAQwAAAELAAAAEgAAAQ0AAAELAAAAEQAAAQ4AAAELAAAAEAX14QUAAAEPAAAACQAAARAF9eFgAAAABgAAAQkAAAERAAAABQAAAMwAAAESAAAABAAAAIMAAAETAAAAJAX14QcF9eEIAAAAIgAAARUF9eEIAAAAJAX14QcF9eEJAAAAIgAAARcF9eEJAAAAFQAAARYAAAEYAAAAFAAAARkF9eEJAAAAFgAAAIgF9eEMAAAAFQAAARsF9eEJAAAAFAAAARwAAACRAAAAEgAAAR0AAACRAAAAEQAAAR4AAACRAAAACgAAARoAAAEfAAAACgAAARoF9eEJAAAACQAAASAAAAEhAAAACgAAARoAAACeAAAACQAAASMAAAEhAAAANwX14RIF9eEUAAAALgX14RAAAAElAAAAGQAAASYAAAAGAAAAFwAAAScF9eEVAAAALAX14VcF9eEiAAAAJQAAASkF9eFgAAAAJAX14VMAAAEqAAAAIwX14U4AAAErAAAAHwX14U8AAAEsAAAAIgX14R0F9eEeAAAAHgAAAS4F9eEiAAAAHgX14R4F9eEiAAAARwX14SgF9eErAAAARgAAATEF9eEsAAAARQX14ScAAAEyAAAAQwAAATMF9eEtAAAAQgAAATQF9eEuAAAAQQX14S8AAAE1AAAAOwAAATYAAAAWAAAAOgAAATYAAAE3AAAANgAAATgAAAAaAAAANQX14SUAAAE5AAAALQX14TAAAAE6AAAASQX14T0F9eFAAAAASgX14T4F9eE/AAAASQAAAT0F9eFAAAAAPgAAATwAAAE+AAAARwX14TcF9eErAAAARgAAAUAF9eEsAAAARAAAAUEF9eE5AAAAQwAAAUIF9eEtAAAAQgAAAUMF9eEuAAAAQQX14S8AAAFEAAAAOwAAAUUAAAAWAAAAOgAAAUUAAAFGAAAANgAAAUcAAAAaAAAANQX14SUAAAFIAAAALQAAAT8AAAFJAAAAKwAAATsAAAFKAAAAKgX14TEAAAFLAAAAKQAAAUwF9eExAAAASwX14UUF9eFHAAAASAAAAU4F9eFIAAAARgAAAU8F9eEsAAAAQwAAAVAF9eEtAAAAQgAAAVEF9eEuAAAARgX14UkF9eEsAAAAQwAAAVMF9eEtAAAAQgAAAVQF9eEuAAAAQQAAAVIAAAFVAAAAQAAAAVYF9eFKAAAAQAX14SYF9eFKAAAAOwAAAVcAAAFYAAAAOgAAAVcAAAFZAAAAOQAAAVoF9eFLAAAAOAX14UQAAAFbAAAAOwX14UoAAAFYAAAAOgX14UoAAAFdAAAAOQAAAV4F9eFLAAAAOAX14UQAAAFfAAAANgAAAVwAAAFgAAAANAAAAWEF9eFMAAAAKwX14TIAAAFiAAAAKAAAAU0AAAFjAAAAJwX14U0AAAFkAAAAJgAAAWUF9eFNAAAAIQAAAWYAAAErAAAAHwAAAWcAAAEsAAAAHQAAATAAAAFoAAAAGgAAAWkAAAFoAAAAFQAAAS8AAAFqAAAAEwAAAS0AAAFrAAAADwAAASgAAAFsAAAADgAAAW0AAAFsAAAADQAAAW4AAAFsAAAADAAAAW8AAAFsAAAACwAAAXAAAAFsAAAAFwAAAAYF9eEVAAAADwAAAXIF9eEWAAAADgAAAXMF9eEWAAAADQAAAXQF9eEWAAAADAAAAXUF9eEWAAAACwAAAXYF9eEWAAAACgAAAXEAAAF3AAAAPgAAATwF9eFAAAAALQAAAXkAAAA2AAAAKwAAAPwAAAF6AAAAKgX14TEAAAF7AAAAKQAAAXwF9eExAAAANAAAAWAF9eFMAAAAKwX14TIAAAF+AAAAKAAAAX0AAAF/AAAAJwX14U0AAAGAAAAAJgAAAYEF9eFNAAAAIQAAAYIF9eFgAAAAHwAAAYMAAAA0AAAAEwAAADUAAAGEAAAACgAAAYUF9eEWAAAACQAAAXgAAAGGAAAACAAAASQAAAGHAAAABwAAASIAAAGIAAAALAX14V0F9eEiAAAAJQAAASkAAAGKAAAAGAX14Q0AAAGLAAAAFAAAAYwAAAGLAAAALAX14VkF9eEiAAAAJQAAAY4F9eEiAAAAGAX14Q4AAAGPAAAAFAAAAZAAAAGPAAAAEgAAAZEAAAGPAAAAEQAAAZIAAAGPAAAACgAAAY0AAAGTAAAACQAAAZQF9eFgAAAABgAAAYkAAAGVAAAABQX14QIAAAGWAAAACQAAAJQF9eEJAAAACQAAAJ4F9eEJAAAAJAX14VIAAAAKAAAAIwX14U4AAAGaAAAAHwX14U8AAAGbAAAAHgX14RwF9eEiAAAARwX14TYF9eErAAAARgAAAZ4F9eEsAAAARAAAAZ8F9eE5AAAAQwAAAaAF9eEtAAAAQgAAAaEF9eEuAAAAQQX14S8AAAGiAAAAOwAAAaMAAAAWAAAAOgAAAaMAAAGkAAAANgAAAaUAAAAaAAAANQX14SUAAAGmAAAALQAAAA8AAAGnAAAAKwX14SMAAAGoAAAAKgX14TEAAAGpAAAAKQAAAaoF9eExAAAAKAAAAasAAAAiAAAAJwX14U0AAAGsAAAAJgAAAa0F9eFNAAAAIQAAAa4AAAGaAAAAHwAAAa8AAAGbAAAAFQAAAZ0AAAGwAAAAEwAAAZwAAAGxAAAADwAAAAgAAAGyAAAADgAAAbMAAAGyAAAADQAAAbQAAAGyAAAADAAAAbUAAAGyAAAACwAAAbYAAAGyAAAACQAAAbcAAABAAAAACAAAAZkAAAG4AAAABwAAAZgAAAG5AAAABgAAAboAAABKAAAAPwX14VQF9eFVAAAAPQAAAbwF9eFVAAAAPAX14VQAAAG9AAAAJQAAAY4F9eFgAAAAJAAAAb4AAAG/AAAAIwX14U4AAAHAAAAAHwX14U8AAAHBAAAAPwX14SAF9eEhAAAAPQAAAcMF9eEhAAAAPAX14SAAAAHEAAAAHgAAAcUF9eEiAAAARwX14SoF9eErAAAARgAAAccF9eEsAAAARQX14ScAAAHIAAAAQwAAAckF9eEtAAAAQgAAAcoF9eEuAAAAQQX14S8AAAHLAAAAOwAAAcwAAAAWAAAAOgAAAcwAAAHNAAAANgAAAc4AAAAaAAAANQX14SUAAAHPAAAALQX14TAAAAHQAAAARwX14TgF9eErAAAARgAAAdIF9eEsAAAARAAAAdMF9eE5AAAAQwAAAdQF9eEtAAAAQgAAAdUF9eEuAAAAQQX14S8AAAHWAAAAOwAAAdcAAAAWAAAAOgAAAdcAAAHYAAAANgAAAdkAAAAaAAAANQX14SUAAAHaAAAALQAAAT8AAAHbAAAAKwAAAdEAAAHcAAAAKgX14TEAAAHdAAAAKQAAAd4F9eExAAAASwX14UYF9eFHAAAASAAAAeAF9eFIAAAARgAAAeEF9eEsAAAAQwAAAeIF9eEtAAAAQgAAAeMF9eEuAAAAQQAAAeQAAAFVAAAAQAAAAeUF9eFKAAAAOwAAAeYAAAFYAAAAOgAAAeYAAAHnAAAAOQAAAegF9eFLAAAAOAX14UQAAAHpAAAANgAAAeoAAAFgAAAANAAAAesF9eFMAAAAKwX14TIAAAHsAAAAKAAAAd8AAAHtAAAAJwX14U0AAAHuAAAAJgAAAe8F9eFNAAAAIQAAAfAAAAHAAAAAHwAAAfEAAAHBAAAAFQAAAcYAAAHyAAAAEwAAAcIAAAHzAAAADwAAAAgAAAH0AAAADgAAAfUAAAH0AAAADQAAAfYAAAH0AAAADAAAAfcAAAH0AAAACwAAAfgAAAH0AAAACQAAAfkAAAGFAAAACAAAAZkAAAH6AAAABwAAAZgAAAH7AAAAJQAAAY4AAAB4AAAAGAX14Q4AAAH9AAAAFAAAAf4AAAH9AAAAEgAAAf8AAAH9AAAAEQAAAgAAAAH9AAAACQAAAgEF9eFgAAAABgAAAfwAAAICAAAABQAAAbsAAAIDAAAABAAAAZcAAAIEAAAAAwAAARQAAAIFAAAAAgAAAIIAAAIGAAAAAQAAAgcF9eFgAAAAAAAAAggF9eFg\"\n        },\n        \"smithy.rules#endpointTests\": {\n          \"testCases\": [\n            {\n              \"documentation\": \"region is not a valid DNS-suffix\",\n              \"expect\": {\n                \"error\": \"Invalid region: region was not a valid DNS name.\"\n              },\n              \"params\": {\n                \"Region\": \"a b\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false\n              }\n            },\n            {\n              \"documentation\": \"Invalid access point ARN: Not S3\",\n              \"expect\": {\n                \"error\": \"Invalid ARN: The ARN was not for the S3 service, found: not-s3\"\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-east-1\"\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"arn:aws:not-s3:us-west-2:123456789012:accesspoint:myendpoint\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"us-east-1\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"Bucket\": \"arn:aws:not-s3:us-west-2:123456789012:accesspoint:myendpoint\"\n              }\n            },\n            {\n              \"documentation\": \"Invalid access point ARN: invalid resource\",\n              \"expect\": {\n                \"error\": \"Invalid ARN: The ARN may only contain a single resource component after `accesspoint`.\"\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-east-1\"\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"arn:aws:s3:us-west-2:123456789012:accesspoint:myendpoint:more-data\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"us-east-1\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"Bucket\": \"arn:aws:s3:us-west-2:123456789012:accesspoint:myendpoint:more-data\"\n              }\n            },\n            {\n              \"documentation\": \"Invalid access point ARN: invalid no ap name\",\n              \"expect\": {\n                \"error\": \"Invalid ARN: Expected a resource of the format `accesspoint:<accesspoint name>` but no name was provided\"\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-east-1\"\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"arn:aws:s3:us-west-2:123456789012:accesspoint:\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"us-east-1\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"Bucket\": \"arn:aws:s3:us-west-2:123456789012:accesspoint:\"\n              }\n            },\n            {\n              \"documentation\": \"Invalid access point ARN: AccountId is invalid\",\n              \"expect\": {\n                \"error\": \"Invalid ARN: The account id may only contain a-z, A-Z, 0-9 and `-`. Found: `123456_789012`\"\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-east-1\"\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"arn:aws:s3:us-west-2:123456_789012:accesspoint:apname\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"us-east-1\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"Bucket\": \"arn:aws:s3:us-west-2:123456_789012:accesspoint:apname\"\n              }\n            },\n            {\n              \"documentation\": \"Invalid access point ARN: access point name is invalid\",\n              \"expect\": {\n                \"error\": \"Invalid ARN: The access point name may only contain a-z, A-Z, 0-9 and `-`. Found: `ap_name`\"\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-east-1\"\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"arn:aws:s3:us-west-2:123456789012:accesspoint:ap_name\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"us-east-1\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"Bucket\": \"arn:aws:s3:us-west-2:123456789012:accesspoint:ap_name\"\n              }\n            },\n            {\n              \"documentation\": \"Access points (disable access points explicitly false)\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://myendpoint-123456789012.s3-accesspoint.us-west-2.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-east-1\"\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"arn:aws:s3:us-west-2:123456789012:accesspoint:myendpoint\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"us-east-1\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"DisableAccessPoints\": false,\n                \"Bucket\": \"arn:aws:s3:us-west-2:123456789012:accesspoint:myendpoint\"\n              }\n            },\n            {\n              \"documentation\": \"Access points: partition does not support FIPS\",\n              \"expect\": {\n                \"error\": \"Partition does not support FIPS\"\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"cn-north-1\",\n                    \"AWS::UseFIPS\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"arn:aws:s3:cn-north-1:123456789012:accesspoint:myendpoint\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"cn-north-1\",\n                \"UseFIPS\": true,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"Bucket\": \"arn:aws:s3:cn-north-1:123456789012:accesspoint:myendpoint\"\n              }\n            },\n            {\n              \"documentation\": \"Bucket region is invalid\",\n              \"expect\": {\n                \"error\": \"Invalid region in ARN: `us-west -2` (invalid DNS name)\"\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-east-1\"\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"arn:aws:s3:us-west -2:123456789012:accesspoint:myendpoint\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"us-east-1\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"DisableAccessPoints\": false,\n                \"Bucket\": \"arn:aws:s3:us-west -2:123456789012:accesspoint:myendpoint\"\n              }\n            },\n            {\n              \"documentation\": \"Access points when Access points explicitly disabled (used for CreateBucket)\",\n              \"expect\": {\n                \"error\": \"Access points are not supported for this operation\"\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-east-1\"\n                  },\n                  \"operationName\": \"CreateBucket\",\n                  \"operationParams\": {\n                    \"Bucket\": \"arn:aws:s3:us-west-2:123456789012:accesspoint:myendpoint\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"us-east-1\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"DisableAccessPoints\": true,\n                \"Bucket\": \"arn:aws:s3:us-west-2:123456789012:accesspoint:myendpoint\"\n              }\n            },\n            {\n              \"documentation\": \"missing arn type\",\n              \"expect\": {\n                \"error\": \"Invalid ARN: `arn:aws:s3:us-west-2:123456789012:` was not a valid ARN\"\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-east-1\"\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"arn:aws:s3:us-west-2:123456789012:\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"us-east-1\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"DisableAccessPoints\": true,\n                \"Bucket\": \"arn:aws:s3:us-west-2:123456789012:\"\n              }\n            },\n            {\n              \"documentation\": \"SDK::Host + access point + Dualstack is an error\",\n              \"expect\": {\n                \"error\": \"Cannot set dual-stack in combination with a custom endpoint.\"\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"cn-north-1\",\n                    \"AWS::UseDualStack\": true,\n                    \"SDK::Endpoint\": \"https://beta.example.com\"\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"arn:aws-cn:s3:cn-north-1:123456789012:accesspoint:myendpoint\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Accelerate\": false,\n                \"Bucket\": \"arn:aws-cn:s3:cn-north-1:123456789012:accesspoint:myendpoint\",\n                \"ForcePathStyle\": false,\n                \"Endpoint\": \"https://beta.example.com\",\n                \"Region\": \"cn-north-1\",\n                \"UseDualStack\": true,\n                \"UseFIPS\": false\n              }\n            },\n            {\n              \"documentation\": \"Access point ARN with FIPS & Dualstack\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://myendpoint-123456789012.s3-accesspoint-fips.dualstack.us-west-2.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-east-1\",\n                    \"AWS::UseFIPS\": true,\n                    \"AWS::UseDualStack\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"arn:aws:s3:us-west-2:123456789012:accesspoint:myendpoint\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"us-east-1\",\n                \"UseFIPS\": true,\n                \"UseDualStack\": true,\n                \"Accelerate\": false,\n                \"DisableAccessPoints\": false,\n                \"Bucket\": \"arn:aws:s3:us-west-2:123456789012:accesspoint:myendpoint\"\n              }\n            },\n            {\n              \"documentation\": \"Access point ARN with Dualstack\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://myendpoint-123456789012.s3-accesspoint.dualstack.us-west-2.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-east-1\",\n                    \"AWS::UseDualStack\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"arn:aws:s3:us-west-2:123456789012:accesspoint:myendpoint\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"us-east-1\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": true,\n                \"Accelerate\": false,\n                \"DisableAccessPoints\": false,\n                \"Bucket\": \"arn:aws:s3:us-west-2:123456789012:accesspoint:myendpoint\"\n              }\n            },\n            {\n              \"documentation\": \"vanilla MRAP\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4a\",\n                        \"signingRegionSet\": [\"*\"],\n                        \"signingName\": \"s3\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://mfzwi23gnjvgw.mrap.accesspoint.s3-global.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-east-1\"\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"arn:aws:s3::123456789012:accesspoint:mfzwi23gnjvgw.mrap\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Bucket\": \"arn:aws:s3::123456789012:accesspoint:mfzwi23gnjvgw.mrap\",\n                \"Region\": \"us-east-1\",\n                \"DisableMultiRegionAccessPoints\": false,\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false\n              }\n            },\n            {\n              \"documentation\": \"MRAP does not support FIPS\",\n              \"expect\": {\n                \"error\": \"S3 MRAP does not support FIPS\"\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-east-1\",\n                    \"AWS::UseFIPS\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"arn:aws:s3::123456789012:accesspoint:mfzwi23gnjvgw.mrap\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Bucket\": \"arn:aws:s3::123456789012:accesspoint:mfzwi23gnjvgw.mrap\",\n                \"Region\": \"us-east-1\",\n                \"DisableMultiRegionAccessPoints\": false,\n                \"UseFIPS\": true,\n                \"UseDualStack\": false,\n                \"Accelerate\": false\n              }\n            },\n            {\n              \"documentation\": \"MRAP does not support DualStack\",\n              \"expect\": {\n                \"error\": \"S3 MRAP does not support dual-stack\"\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-east-1\",\n                    \"AWS::UseDualStack\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"arn:aws:s3::123456789012:accesspoint:mfzwi23gnjvgw.mrap\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Bucket\": \"arn:aws:s3::123456789012:accesspoint:mfzwi23gnjvgw.mrap\",\n                \"Region\": \"us-east-1\",\n                \"DisableMultiRegionAccessPoints\": false,\n                \"UseFIPS\": false,\n                \"UseDualStack\": true,\n                \"Accelerate\": false\n              }\n            },\n            {\n              \"documentation\": \"MRAP does not support S3 Accelerate\",\n              \"expect\": {\n                \"error\": \"S3 MRAP does not support S3 Accelerate\"\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-east-1\",\n                    \"AWS::S3::Accelerate\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"arn:aws:s3::123456789012:accesspoint:mfzwi23gnjvgw.mrap\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Bucket\": \"arn:aws:s3::123456789012:accesspoint:mfzwi23gnjvgw.mrap\",\n                \"Region\": \"us-east-1\",\n                \"DisableMultiRegionAccessPoints\": false,\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": true\n              }\n            },\n            {\n              \"documentation\": \"MRAP explicitly disabled\",\n              \"expect\": {\n                \"error\": \"Invalid configuration: Multi-Region Access Point ARNs are disabled.\"\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-east-1\",\n                    \"AWS::S3::DisableMultiRegionAccessPoints\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"arn:aws:s3::123456789012:accesspoint:mfzwi23gnjvgw.mrap\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Bucket\": \"arn:aws:s3::123456789012:accesspoint:mfzwi23gnjvgw.mrap\",\n                \"Region\": \"us-east-1\",\n                \"DisableMultiRegionAccessPoints\": true,\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false\n              }\n            },\n            {\n              \"documentation\": \"Dual-stack endpoint with path-style forced\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://s3.dualstack.us-west-2.amazonaws.com/bucketname\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-west-2\",\n                    \"AWS::UseDualStack\": true,\n                    \"AWS::S3::ForcePathStyle\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"bucketname\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Bucket\": \"bucketname\",\n                \"Region\": \"us-west-2\",\n                \"ForcePathStyle\": true,\n                \"UseFIPS\": false,\n                \"Accelerate\": false,\n                \"UseDualStack\": true\n              }\n            },\n            {\n              \"documentation\": \"Dual-stack endpoint + SDK::Host is error\",\n              \"expect\": {\n                \"error\": \"Cannot set dual-stack in combination with a custom endpoint.\"\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-west-2\",\n                    \"AWS::UseDualStack\": true,\n                    \"SDK::Endpoint\": \"https://abc.com\",\n                    \"AWS::S3::ForcePathStyle\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"bucketname\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Bucket\": \"bucketname\",\n                \"Region\": \"us-west-2\",\n                \"ForcePathStyle\": true,\n                \"UseFIPS\": false,\n                \"Accelerate\": false,\n                \"UseDualStack\": true,\n                \"Endpoint\": \"https://abc.com\"\n              }\n            },\n            {\n              \"documentation\": \"path style + ARN bucket\",\n              \"expect\": {\n                \"error\": \"Path-style addressing cannot be used with ARN buckets\"\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-west-2\",\n                    \"AWS::S3::ForcePathStyle\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"arn:aws:s3::123456789012:accesspoint:mfzwi23gnjvgw.mrap\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Accelerate\": false,\n                \"Bucket\": \"arn:aws:s3::123456789012:accesspoint:mfzwi23gnjvgw.mrap\",\n                \"ForcePathStyle\": true,\n                \"Region\": \"us-west-2\",\n                \"UseDualStack\": false,\n                \"UseFIPS\": false\n              }\n            },\n            {\n              \"documentation\": \"implicit path style bucket + dualstack\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://s3.dualstack.us-west-2.amazonaws.com/99_ab\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-west-2\",\n                    \"AWS::UseDualStack\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"99_ab\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Accelerate\": false,\n                \"Bucket\": \"99_ab\",\n                \"Region\": \"us-west-2\",\n                \"UseDualStack\": true,\n                \"UseFIPS\": false\n              }\n            },\n            {\n              \"documentation\": \"implicit path style bucket + dualstack\",\n              \"expect\": {\n                \"error\": \"Cannot set dual-stack in combination with a custom endpoint.\"\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-west-2\",\n                    \"AWS::UseDualStack\": true,\n                    \"SDK::Endpoint\": \"http://abc.com\"\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"99_ab\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Accelerate\": false,\n                \"Bucket\": \"99_ab\",\n                \"Region\": \"us-west-2\",\n                \"UseDualStack\": true,\n                \"UseFIPS\": false,\n                \"Endpoint\": \"http://abc.com\"\n              }\n            },\n            {\n              \"documentation\": \"don't allow URL injections in the bucket\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://s3.us-west-2.amazonaws.com/example.com%23\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-west-2\"\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"example.com#\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Bucket\": \"example.com#\",\n                \"Region\": \"us-west-2\",\n                \"UseDualStack\": false,\n                \"UseFIPS\": false,\n                \"Accelerate\": false\n              }\n            },\n            {\n              \"documentation\": \"URI encode bucket names in the path\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://s3.us-west-2.amazonaws.com/bucket%20name\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-west-2\"\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"bucket name\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Bucket\": \"bucket name\",\n                \"Region\": \"us-west-2\",\n                \"UseDualStack\": false,\n                \"UseFIPS\": false,\n                \"Accelerate\": false\n              }\n            },\n            {\n              \"documentation\": \"scheme is respected\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"af-south-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"http://control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com/99_ab\"\n                }\n              },\n              \"params\": {\n                \"Accelerate\": false,\n                \"Bucket\": \"99_ab\",\n                \"Endpoint\": \"http://control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com\",\n                \"Region\": \"af-south-1\",\n                \"UseDualStack\": false,\n                \"UseFIPS\": false\n              }\n            },\n            {\n              \"documentation\": \"scheme is respected (virtual addressing)\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"af-south-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"http://bucketname.control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com/foo\"\n                }\n              },\n              \"params\": {\n                \"Accelerate\": false,\n                \"Bucket\": \"bucketname\",\n                \"Endpoint\": \"http://control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com/foo\",\n                \"Region\": \"af-south-1\",\n                \"UseDualStack\": false,\n                \"UseFIPS\": false\n              }\n            },\n            {\n              \"documentation\": \"path style + implicit private link\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"af-south-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com/99_ab\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"af-south-1\",\n                    \"SDK::Endpoint\": \"https://control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com\"\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"99_ab\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Accelerate\": false,\n                \"Bucket\": \"99_ab\",\n                \"Endpoint\": \"https://control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com\",\n                \"Region\": \"af-south-1\",\n                \"UseDualStack\": false,\n                \"UseFIPS\": false\n              }\n            },\n            {\n              \"documentation\": \"invalid Endpoint override\",\n              \"expect\": {\n                \"error\": \"Custom endpoint `abcde://nota#url` was not a valid URI\"\n              },\n              \"params\": {\n                \"Accelerate\": false,\n                \"Bucket\": \"bucketname\",\n                \"Endpoint\": \"abcde://nota#url\",\n                \"Region\": \"af-south-1\",\n                \"UseDualStack\": false,\n                \"UseFIPS\": false\n              }\n            },\n            {\n              \"documentation\": \"using an IPv4 address forces path style\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"af-south-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://123.123.0.1/bucketname\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"af-south-1\",\n                    \"SDK::Endpoint\": \"https://123.123.0.1\"\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"bucketname\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Accelerate\": false,\n                \"Bucket\": \"bucketname\",\n                \"Endpoint\": \"https://123.123.0.1\",\n                \"Region\": \"af-south-1\",\n                \"UseDualStack\": false,\n                \"UseFIPS\": false\n              }\n            },\n            {\n              \"documentation\": \"vanilla access point arn with region mismatch and UseArnRegion=false\",\n              \"expect\": {\n                \"error\": \"Invalid configuration: region from ARN `us-east-1` does not match client region `us-west-2` and UseArnRegion is `false`\"\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-west-2\",\n                    \"AWS::S3::UseArnRegion\": false\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"arn:aws:s3:us-east-1:123456789012:accesspoint:myendpoint\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Accelerate\": false,\n                \"Bucket\": \"arn:aws:s3:us-east-1:123456789012:accesspoint:myendpoint\",\n                \"ForcePathStyle\": false,\n                \"UseArnRegion\": false,\n                \"Region\": \"us-west-2\",\n                \"UseDualStack\": false,\n                \"UseFIPS\": false\n              }\n            },\n            {\n              \"documentation\": \"vanilla access point arn with region mismatch and UseArnRegion unset\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://myendpoint-123456789012.s3-accesspoint.us-west-2.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-east-1\"\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"arn:aws:s3:us-west-2:123456789012:accesspoint:myendpoint\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Accelerate\": false,\n                \"Bucket\": \"arn:aws:s3:us-west-2:123456789012:accesspoint:myendpoint\",\n                \"ForcePathStyle\": false,\n                \"Region\": \"us-east-1\",\n                \"UseDualStack\": false,\n                \"UseFIPS\": false\n              }\n            },\n            {\n              \"documentation\": \"vanilla access point arn with region mismatch and UseArnRegion=true\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://myendpoint-123456789012.s3-accesspoint.us-west-2.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-east-1\",\n                    \"AWS::S3::UseArnRegion\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"arn:aws:s3:us-west-2:123456789012:accesspoint:myendpoint\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Accelerate\": false,\n                \"Bucket\": \"arn:aws:s3:us-west-2:123456789012:accesspoint:myendpoint\",\n                \"ForcePathStyle\": false,\n                \"UseArnRegion\": true,\n                \"Region\": \"us-east-1\",\n                \"UseDualStack\": false,\n                \"UseFIPS\": false\n              }\n            },\n            {\n              \"documentation\": \"subdomains are not allowed in virtual buckets\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"disableDoubleEncoding\": true,\n                        \"signingRegion\": \"us-east-1\"\n                      }\n                    ]\n                  },\n                  \"url\": \"https://s3.us-east-1.amazonaws.com/bucket.name\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-east-1\"\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"bucket.name\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Bucket\": \"bucket.name\",\n                \"Region\": \"us-east-1\"\n              }\n            },\n            {\n              \"documentation\": \"bucket names with 3 characters are allowed in virtual buckets\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"disableDoubleEncoding\": true,\n                        \"signingRegion\": \"us-east-1\"\n                      }\n                    ]\n                  },\n                  \"url\": \"https://aaa.s3.us-east-1.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-east-1\"\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"aaa\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Bucket\": \"aaa\",\n                \"Region\": \"us-east-1\"\n              }\n            },\n            {\n              \"documentation\": \"bucket names with fewer than 3 characters are not allowed in virtual host\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"disableDoubleEncoding\": true,\n                        \"signingRegion\": \"us-east-1\"\n                      }\n                    ]\n                  },\n                  \"url\": \"https://s3.us-east-1.amazonaws.com/aa\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-east-1\"\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"aa\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Bucket\": \"aa\",\n                \"Region\": \"us-east-1\"\n              }\n            },\n            {\n              \"documentation\": \"bucket names with uppercase characters are not allowed in virtual host\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"disableDoubleEncoding\": true,\n                        \"signingRegion\": \"us-east-1\"\n                      }\n                    ]\n                  },\n                  \"url\": \"https://s3.us-east-1.amazonaws.com/BucketName\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-east-1\"\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"BucketName\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Bucket\": \"BucketName\",\n                \"Region\": \"us-east-1\"\n              }\n            },\n            {\n              \"documentation\": \"subdomains are allowed in virtual buckets on http endpoints\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"disableDoubleEncoding\": true,\n                        \"signingRegion\": \"us-east-1\"\n                      }\n                    ]\n                  },\n                  \"url\": \"http://bucket.name.example.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-east-1\",\n                    \"SDK::Endpoint\": \"http://example.com\"\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"bucket.name\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Bucket\": \"bucket.name\",\n                \"Region\": \"us-east-1\",\n                \"Endpoint\": \"http://example.com\"\n              }\n            },\n            {\n              \"documentation\": \"no region set\",\n              \"expect\": {\n                \"error\": \"A region must be set when sending requests to S3.\"\n              },\n              \"params\": {\n                \"Bucket\": \"bucket-name\"\n              }\n            },\n            {\n              \"documentation\": \"UseGlobalEndpoints=true, region=us-east-1 uses the global endpoint\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"us-east-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://s3.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-east-1\",\n                    \"AWS::S3::UseGlobalEndpoint\": true\n                  },\n                  \"operationName\": \"ListBuckets\"\n                }\n              ],\n              \"params\": {\n                \"Region\": \"us-east-1\",\n                \"UseGlobalEndpoint\": true,\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false\n              }\n            },\n            {\n              \"documentation\": \"UseGlobalEndpoints=true, region=us-west-2 uses the regional endpoint\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://s3.us-west-2.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-west-2\",\n                    \"AWS::S3::UseGlobalEndpoint\": true\n                  },\n                  \"operationName\": \"ListBuckets\"\n                }\n              ],\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"UseGlobalEndpoint\": true,\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false\n              }\n            },\n            {\n              \"documentation\": \"UseGlobalEndpoints=true, region=cn-north-1 uses the regional endpoint\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"cn-north-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://s3.cn-north-1.amazonaws.com.cn\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"cn-north-1\",\n                    \"AWS::S3::UseGlobalEndpoint\": true\n                  },\n                  \"operationName\": \"ListBuckets\"\n                }\n              ],\n              \"params\": {\n                \"Region\": \"cn-north-1\",\n                \"UseGlobalEndpoint\": true,\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false\n              }\n            },\n            {\n              \"documentation\": \"UseGlobalEndpoints=true, region=us-east-1, fips=true uses the regional endpoint with fips\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"us-east-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://s3-fips.us-east-1.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-east-1\",\n                    \"AWS::UseFIPS\": true,\n                    \"AWS::S3::UseGlobalEndpoint\": true\n                  },\n                  \"operationName\": \"ListBuckets\"\n                }\n              ],\n              \"params\": {\n                \"Region\": \"us-east-1\",\n                \"UseGlobalEndpoint\": true,\n                \"UseFIPS\": true,\n                \"UseDualStack\": false,\n                \"Accelerate\": false\n              }\n            },\n            {\n              \"documentation\": \"UseGlobalEndpoints=true, region=us-east-1, dualstack=true uses the regional endpoint with dualstack\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"us-east-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://s3.dualstack.us-east-1.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-east-1\",\n                    \"AWS::UseDualStack\": true,\n                    \"AWS::S3::UseGlobalEndpoint\": true\n                  },\n                  \"operationName\": \"ListBuckets\"\n                }\n              ],\n              \"params\": {\n                \"Region\": \"us-east-1\",\n                \"UseGlobalEndpoint\": true,\n                \"UseFIPS\": false,\n                \"UseDualStack\": true,\n                \"Accelerate\": false\n              }\n            },\n            {\n              \"documentation\": \"UseGlobalEndpoints=true, region=us-east-1, dualstack and fips uses the regional endpoint with fips/dualstack\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"us-east-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://s3-fips.dualstack.us-east-1.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-east-1\",\n                    \"AWS::UseFIPS\": true,\n                    \"AWS::UseDualStack\": true,\n                    \"AWS::S3::UseGlobalEndpoint\": true\n                  },\n                  \"operationName\": \"ListBuckets\"\n                }\n              ],\n              \"params\": {\n                \"Region\": \"us-east-1\",\n                \"UseGlobalEndpoint\": true,\n                \"UseFIPS\": true,\n                \"UseDualStack\": true,\n                \"Accelerate\": false\n              }\n            },\n            {\n              \"documentation\": \"UseGlobalEndpoints=true, region=us-east-1 with custom endpoint, uses custom\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"us-east-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://example.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-east-1\",\n                    \"SDK::Endpoint\": \"https://example.com\",\n                    \"AWS::S3::UseGlobalEndpoint\": true\n                  },\n                  \"operationName\": \"ListBuckets\"\n                }\n              ],\n              \"params\": {\n                \"Region\": \"us-east-1\",\n                \"Endpoint\": \"https://example.com\",\n                \"UseGlobalEndpoint\": true,\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false\n              }\n            },\n            {\n              \"documentation\": \"UseGlobalEndpoints=true, region=us-west-2 with custom endpoint, uses custom\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://example.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-west-2\",\n                    \"SDK::Endpoint\": \"https://example.com\",\n                    \"AWS::S3::UseGlobalEndpoint\": true\n                  },\n                  \"operationName\": \"ListBuckets\"\n                }\n              ],\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Endpoint\": \"https://example.com\",\n                \"UseGlobalEndpoint\": true,\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false\n              }\n            },\n            {\n              \"documentation\": \"UseGlobalEndpoints=true, region=us-east-1 with accelerate on non bucket case uses the global endpoint and ignores accelerate\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"us-east-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://s3.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-east-1\",\n                    \"AWS::S3::Accelerate\": true,\n                    \"AWS::S3::UseGlobalEndpoint\": true\n                  },\n                  \"operationName\": \"ListBuckets\"\n                }\n              ],\n              \"params\": {\n                \"Region\": \"us-east-1\",\n                \"UseGlobalEndpoint\": true,\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": true\n              }\n            },\n            {\n              \"documentation\": \"aws-global region uses the global endpoint\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"us-east-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://s3.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"aws-global\"\n                  },\n                  \"operationName\": \"ListBuckets\"\n                }\n              ],\n              \"params\": {\n                \"Region\": \"aws-global\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false\n              }\n            },\n            {\n              \"documentation\": \"aws-global region with fips uses the regional endpoint\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"us-east-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://s3-fips.us-east-1.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"aws-global\",\n                    \"AWS::UseFIPS\": true\n                  },\n                  \"operationName\": \"ListBuckets\"\n                }\n              ],\n              \"params\": {\n                \"Region\": \"aws-global\",\n                \"UseFIPS\": true,\n                \"UseDualStack\": false,\n                \"Accelerate\": false\n              }\n            },\n            {\n              \"documentation\": \"aws-global region with dualstack uses the regional endpoint\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"us-east-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://s3.dualstack.us-east-1.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"aws-global\",\n                    \"AWS::UseDualStack\": true\n                  },\n                  \"operationName\": \"ListBuckets\"\n                }\n              ],\n              \"params\": {\n                \"Region\": \"aws-global\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": true,\n                \"Accelerate\": false\n              }\n            },\n            {\n              \"documentation\": \"aws-global region with fips and dualstack uses the regional endpoint\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"us-east-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://s3-fips.dualstack.us-east-1.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"aws-global\",\n                    \"AWS::UseFIPS\": true,\n                    \"AWS::UseDualStack\": true\n                  },\n                  \"operationName\": \"ListBuckets\"\n                }\n              ],\n              \"params\": {\n                \"Region\": \"aws-global\",\n                \"UseFIPS\": true,\n                \"UseDualStack\": true,\n                \"Accelerate\": false\n              }\n            },\n            {\n              \"documentation\": \"aws-global region with accelerate on non-bucket case, uses global endpoint and ignores accelerate\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"us-east-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://s3.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"aws-global\",\n                    \"AWS::S3::Accelerate\": true\n                  },\n                  \"operationName\": \"ListBuckets\"\n                }\n              ],\n              \"params\": {\n                \"Region\": \"aws-global\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": true\n              }\n            },\n            {\n              \"documentation\": \"aws-global region with custom endpoint, uses custom\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"us-east-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://example.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"aws-global\",\n                    \"SDK::Endpoint\": \"https://example.com\"\n                  },\n                  \"operationName\": \"ListBuckets\"\n                }\n              ],\n              \"params\": {\n                \"Region\": \"aws-global\",\n                \"Endpoint\": \"https://example.com\",\n                \"UseGlobalEndpoint\": false,\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false\n              }\n            },\n            {\n              \"documentation\": \"virtual addressing, aws-global region uses the global endpoint\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"us-east-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://bucket-name.s3.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"aws-global\"\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"bucket-name\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"aws-global\",\n                \"Bucket\": \"bucket-name\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false\n              }\n            },\n            {\n              \"documentation\": \"virtual addressing, aws-global region with Prefix, and Key uses the global endpoint. Prefix and Key parameters should not be used in endpoint evaluation.\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"us-east-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://bucket-name.s3.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"aws-global\"\n                  },\n                  \"operationName\": \"ListObjects\",\n                  \"operationParams\": {\n                    \"Bucket\": \"bucket-name\",\n                    \"Prefix\": \"prefix\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"aws-global\",\n                \"Bucket\": \"bucket-name\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"Prefix\": \"prefix\",\n                \"Key\": \"key\"\n              }\n            },\n            {\n              \"documentation\": \"virtual addressing, aws-global region with Copy Source, and Key uses the global endpoint. Copy Source and Key parameters should not be used in endpoint evaluation.\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"us-east-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://bucket-name.s3.amazonaws.com\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"aws-global\",\n                \"Bucket\": \"bucket-name\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"CopySource\": \"/copy/source\",\n                \"Key\": \"key\"\n              }\n            },\n            {\n              \"documentation\": \"virtual addressing, aws-global region with fips uses the regional fips endpoint\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"us-east-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://bucket-name.s3-fips.us-east-1.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"aws-global\",\n                    \"AWS::UseFIPS\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"bucket-name\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"aws-global\",\n                \"Bucket\": \"bucket-name\",\n                \"UseFIPS\": true,\n                \"UseDualStack\": false,\n                \"Accelerate\": false\n              }\n            },\n            {\n              \"documentation\": \"virtual addressing, aws-global region with dualstack uses the regional dualstack endpoint\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"us-east-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://bucket-name.s3.dualstack.us-east-1.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"aws-global\",\n                    \"AWS::UseDualStack\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"bucket-name\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"aws-global\",\n                \"Bucket\": \"bucket-name\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": true,\n                \"Accelerate\": false\n              }\n            },\n            {\n              \"documentation\": \"virtual addressing, aws-global region with fips/dualstack uses the regional fips/dualstack endpoint\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"us-east-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://bucket-name.s3-fips.dualstack.us-east-1.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"aws-global\",\n                    \"AWS::UseFIPS\": true,\n                    \"AWS::UseDualStack\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"bucket-name\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"aws-global\",\n                \"Bucket\": \"bucket-name\",\n                \"UseFIPS\": true,\n                \"UseDualStack\": true,\n                \"Accelerate\": false\n              }\n            },\n            {\n              \"documentation\": \"virtual addressing, aws-global region with accelerate uses the global accelerate endpoint\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"us-east-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://bucket-name.s3-accelerate.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"aws-global\",\n                    \"AWS::S3::Accelerate\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"bucket-name\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"aws-global\",\n                \"Bucket\": \"bucket-name\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": true\n              }\n            },\n            {\n              \"documentation\": \"virtual addressing, aws-global region with custom endpoint\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"us-east-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://bucket-name.example.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"aws-global\",\n                    \"SDK::Endpoint\": \"https://example.com\"\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"bucket-name\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"aws-global\",\n                \"Endpoint\": \"https://example.com\",\n                \"Bucket\": \"bucket-name\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false\n              }\n            },\n            {\n              \"documentation\": \"virtual addressing, UseGlobalEndpoint and us-east-1 region uses the global endpoint\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"us-east-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://bucket-name.s3.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-east-1\",\n                    \"AWS::S3::UseGlobalEndpoint\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"bucket-name\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"us-east-1\",\n                \"UseGlobalEndpoint\": true,\n                \"Bucket\": \"bucket-name\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false\n              }\n            },\n            {\n              \"documentation\": \"virtual addressing, UseGlobalEndpoint and us-west-2 region uses the regional endpoint\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://bucket-name.s3.us-west-2.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-west-2\",\n                    \"AWS::S3::UseGlobalEndpoint\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"bucket-name\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"UseGlobalEndpoint\": true,\n                \"Bucket\": \"bucket-name\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false\n              }\n            },\n            {\n              \"documentation\": \"virtual addressing, UseGlobalEndpoint and us-east-1 region and fips uses the regional fips endpoint\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"us-east-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://bucket-name.s3-fips.us-east-1.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-east-1\",\n                    \"AWS::UseFIPS\": true,\n                    \"AWS::S3::UseGlobalEndpoint\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"bucket-name\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"us-east-1\",\n                \"UseGlobalEndpoint\": true,\n                \"Bucket\": \"bucket-name\",\n                \"UseFIPS\": true,\n                \"UseDualStack\": false,\n                \"Accelerate\": false\n              }\n            },\n            {\n              \"documentation\": \"virtual addressing, UseGlobalEndpoint and us-east-1 region and dualstack uses the regional dualstack endpoint\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"us-east-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://bucket-name.s3.dualstack.us-east-1.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-east-1\",\n                    \"AWS::UseDualStack\": true,\n                    \"AWS::S3::UseGlobalEndpoint\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"bucket-name\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"us-east-1\",\n                \"UseGlobalEndpoint\": true,\n                \"Bucket\": \"bucket-name\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": true,\n                \"Accelerate\": false\n              }\n            },\n            {\n              \"documentation\": \"virtual addressing, UseGlobalEndpoint and us-east-1 region and accelerate uses the global accelerate endpoint\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"us-east-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://bucket-name.s3-accelerate.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-east-1\",\n                    \"AWS::S3::Accelerate\": true,\n                    \"AWS::S3::UseGlobalEndpoint\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"bucket-name\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"us-east-1\",\n                \"UseGlobalEndpoint\": true,\n                \"Bucket\": \"bucket-name\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": true\n              }\n            },\n            {\n              \"documentation\": \"virtual addressing, UseGlobalEndpoint and us-east-1 region with custom endpoint\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"us-east-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://bucket-name.example.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-east-1\",\n                    \"SDK::Endpoint\": \"https://example.com\",\n                    \"AWS::S3::UseGlobalEndpoint\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"bucket-name\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"us-east-1\",\n                \"Endpoint\": \"https://example.com\",\n                \"UseGlobalEndpoint\": true,\n                \"Bucket\": \"bucket-name\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false\n              }\n            },\n            {\n              \"documentation\": \"ForcePathStyle, aws-global region uses the global endpoint\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"us-east-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://s3.amazonaws.com/bucket-name\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"aws-global\",\n                    \"AWS::S3::ForcePathStyle\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"bucket-name\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"aws-global\",\n                \"Bucket\": \"bucket-name\",\n                \"ForcePathStyle\": true,\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false\n              }\n            },\n            {\n              \"documentation\": \"ForcePathStyle, aws-global region with fips is invalid\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"us-east-1\",\n                        \"disableDoubleEncoding\": true,\n                        \"name\": \"sigv4\"\n                      }\n                    ]\n                  },\n                  \"url\": \"https://s3-fips.us-east-1.amazonaws.com/bucket-name\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"aws-global\",\n                \"Bucket\": \"bucket-name\",\n                \"ForcePathStyle\": true,\n                \"UseFIPS\": true,\n                \"UseDualStack\": false,\n                \"Accelerate\": false\n              }\n            },\n            {\n              \"documentation\": \"ForcePathStyle, aws-global region with dualstack uses regional dualstack endpoint\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"us-east-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://s3.dualstack.us-east-1.amazonaws.com/bucket-name\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"aws-global\",\n                    \"AWS::UseDualStack\": true,\n                    \"AWS::S3::ForcePathStyle\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"bucket-name\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"aws-global\",\n                \"Bucket\": \"bucket-name\",\n                \"ForcePathStyle\": true,\n                \"UseFIPS\": false,\n                \"UseDualStack\": true,\n                \"Accelerate\": false\n              }\n            },\n            {\n              \"documentation\": \"ForcePathStyle, aws-global region custom endpoint uses the custom endpoint\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"us-east-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://example.com/bucket-name\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"aws-global\",\n                    \"SDK::Endpoint\": \"https://example.com\",\n                    \"AWS::S3::ForcePathStyle\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"bucket-name\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"aws-global\",\n                \"Endpoint\": \"https://example.com\",\n                \"Bucket\": \"bucket-name\",\n                \"ForcePathStyle\": true,\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false\n              }\n            },\n            {\n              \"documentation\": \"ForcePathStyle, UseGlobalEndpoint us-east-1 region uses the global endpoint\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"us-east-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://s3.amazonaws.com/bucket-name\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-east-1\",\n                    \"AWS::S3::ForcePathStyle\": true,\n                    \"AWS::S3::UseGlobalEndpoint\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"bucket-name\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"us-east-1\",\n                \"Bucket\": \"bucket-name\",\n                \"UseGlobalEndpoint\": true,\n                \"ForcePathStyle\": true,\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false\n              }\n            },\n            {\n              \"documentation\": \"ForcePathStyle, UseGlobalEndpoint us-west-2 region uses the regional endpoint\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://s3.us-west-2.amazonaws.com/bucket-name\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-west-2\",\n                    \"AWS::S3::ForcePathStyle\": true,\n                    \"AWS::S3::UseGlobalEndpoint\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"bucket-name\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"bucket-name\",\n                \"UseGlobalEndpoint\": true,\n                \"ForcePathStyle\": true,\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false\n              }\n            },\n            {\n              \"documentation\": \"ForcePathStyle, UseGlobalEndpoint us-east-1 region, dualstack uses the regional dualstack endpoint\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"us-east-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://s3.dualstack.us-east-1.amazonaws.com/bucket-name\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-east-1\",\n                    \"AWS::UseDualStack\": true,\n                    \"AWS::S3::ForcePathStyle\": true,\n                    \"AWS::S3::UseGlobalEndpoint\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"bucket-name\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"us-east-1\",\n                \"Bucket\": \"bucket-name\",\n                \"UseGlobalEndpoint\": true,\n                \"ForcePathStyle\": true,\n                \"UseFIPS\": false,\n                \"UseDualStack\": true,\n                \"Accelerate\": false\n              }\n            },\n            {\n              \"documentation\": \"ForcePathStyle, UseGlobalEndpoint us-east-1 region custom endpoint uses the custom endpoint\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"us-east-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://example.com/bucket-name\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-east-1\",\n                    \"SDK::Endpoint\": \"https://example.com\",\n                    \"AWS::S3::ForcePathStyle\": true,\n                    \"AWS::S3::UseGlobalEndpoint\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"bucket-name\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"us-east-1\",\n                \"Bucket\": \"bucket-name\",\n                \"Endpoint\": \"https://example.com\",\n                \"UseGlobalEndpoint\": true,\n                \"ForcePathStyle\": true,\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false\n              }\n            },\n            {\n              \"documentation\": \"ARN with aws-global region and  UseArnRegion uses the regional endpoint\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4a\",\n                        \"signingName\": \"s3-outposts\",\n                        \"signingRegionSet\": [\"*\"],\n                        \"disableDoubleEncoding\": true\n                      },\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3-outposts\",\n                        \"signingRegion\": \"us-east-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://reports-123456789012.op-01234567890123456.s3-outposts.us-east-1.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"aws-global\",\n                    \"AWS::S3::UseArnRegion\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"arn:aws:s3-outposts:us-east-1:123456789012:outpost/op-01234567890123456/accesspoint/reports\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"aws-global\",\n                \"UseArnRegion\": true,\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"Bucket\": \"arn:aws:s3-outposts:us-east-1:123456789012:outpost/op-01234567890123456/accesspoint/reports\"\n              }\n            },\n            {\n              \"documentation\": \"cross partition MRAP ARN is an error\",\n              \"expect\": {\n                \"error\": \"Client was configured for partition `aws` but bucket referred to partition `aws-cn`\"\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-west-1\"\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"arn:aws-cn:s3::123456789012:accesspoint:mfzwi23gnjvgw.mrap\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Bucket\": \"arn:aws-cn:s3::123456789012:accesspoint:mfzwi23gnjvgw.mrap\",\n                \"Region\": \"us-west-1\"\n              }\n            },\n            {\n              \"documentation\": \"Endpoint override, accesspoint with HTTP, port\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"http://myendpoint-123456789012.beta.example.com:1234\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-west-2\",\n                    \"SDK::Endpoint\": \"http://beta.example.com:1234\"\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"arn:aws:s3:us-west-2:123456789012:accesspoint:myendpoint\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Endpoint\": \"http://beta.example.com:1234\",\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"arn:aws:s3:us-west-2:123456789012:accesspoint:myendpoint\"\n              }\n            },\n            {\n              \"documentation\": \"Endpoint override, accesspoint with http, path, query, and port\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"http://myendpoint-123456789012.beta.example.com:1234/path\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"arn:aws:s3:us-west-2:123456789012:accesspoint:myendpoint\",\n                \"Endpoint\": \"http://beta.example.com:1234/path\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false\n              }\n            },\n            {\n              \"documentation\": \"non-bucket endpoint override with FIPS = error\",\n              \"expect\": {\n                \"error\": \"A custom endpoint cannot be combined with FIPS\"\n              },\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Endpoint\": \"http://beta.example.com:1234/path\",\n                \"UseFIPS\": true,\n                \"UseDualStack\": false\n              }\n            },\n            {\n              \"documentation\": \"FIPS + dualstack + custom endpoint\",\n              \"expect\": {\n                \"error\": \"Cannot set dual-stack in combination with a custom endpoint.\"\n              },\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Endpoint\": \"http://beta.example.com:1234/path\",\n                \"UseFIPS\": true,\n                \"UseDualStack\": true\n              }\n            },\n            {\n              \"documentation\": \"dualstack + custom endpoint\",\n              \"expect\": {\n                \"error\": \"Cannot set dual-stack in combination with a custom endpoint.\"\n              },\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Endpoint\": \"http://beta.example.com:1234/path\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": true\n              }\n            },\n            {\n              \"documentation\": \"custom endpoint without FIPS/dualstack\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"http://beta.example.com:1234/path\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Endpoint\": \"http://beta.example.com:1234/path\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false\n              }\n            },\n            {\n              \"documentation\": \"s3 object lambda with access points disabled\",\n              \"expect\": {\n                \"error\": \"Access points are not supported for this operation\"\n              },\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"arn:aws:s3-object-lambda:us-west-2:123456789012:accesspoint:myendpoint\",\n                \"DisableAccessPoints\": true\n              }\n            },\n            {\n              \"documentation\": \"non bucket + FIPS\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://s3-fips.us-west-2.amazonaws.com\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"UseFIPS\": true,\n                \"UseDualStack\": false\n              }\n            },\n            {\n              \"documentation\": \"standard non bucket endpoint\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://s3.us-west-2.amazonaws.com\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false\n              }\n            },\n            {\n              \"documentation\": \"non bucket endpoint with FIPS + Dualstack\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://s3-fips.dualstack.us-west-2.amazonaws.com\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"UseFIPS\": true,\n                \"UseDualStack\": true\n              }\n            },\n            {\n              \"documentation\": \"non bucket endpoint with dualstack\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://s3.dualstack.us-west-2.amazonaws.com\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": true\n              }\n            },\n            {\n              \"documentation\": \"use global endpoint + IP address endpoint override\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"disableDoubleEncoding\": true,\n                        \"signingRegion\": \"us-east-1\"\n                      }\n                    ]\n                  },\n                  \"url\": \"http://127.0.0.1/bucket\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-east-1\",\n                \"Bucket\": \"bucket\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Endpoint\": \"http://127.0.0.1\",\n                \"UseGlobalEndpoint\": true\n              }\n            },\n            {\n              \"documentation\": \"non-dns endpoint + global endpoint\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"disableDoubleEncoding\": true,\n                        \"signingRegion\": \"us-east-1\"\n                      }\n                    ]\n                  },\n                  \"url\": \"https://s3.amazonaws.com/bucket%21\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-east-1\",\n                \"Bucket\": \"bucket!\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"UseGlobalEndpoint\": true\n              }\n            },\n            {\n              \"documentation\": \"endpoint override + use global endpoint\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"disableDoubleEncoding\": true,\n                        \"signingRegion\": \"us-east-1\"\n                      }\n                    ]\n                  },\n                  \"url\": \"http://foo.com/bucket%21\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-east-1\",\n                \"Bucket\": \"bucket!\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"UseGlobalEndpoint\": true,\n                \"Endpoint\": \"http://foo.com\"\n              }\n            },\n            {\n              \"documentation\": \"FIPS + dualstack + non-bucket endpoint\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"disableDoubleEncoding\": true,\n                        \"signingRegion\": \"us-east-1\"\n                      }\n                    ]\n                  },\n                  \"url\": \"https://s3-fips.dualstack.us-east-1.amazonaws.com/bucket%21\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-east-1\",\n                \"Bucket\": \"bucket!\",\n                \"UseFIPS\": true,\n                \"UseDualStack\": true\n              }\n            },\n            {\n              \"documentation\": \"FIPS + dualstack + non-DNS endpoint\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"disableDoubleEncoding\": true,\n                        \"signingRegion\": \"us-east-1\"\n                      }\n                    ]\n                  },\n                  \"url\": \"https://s3-fips.dualstack.us-east-1.amazonaws.com/bucket%21\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-east-1\",\n                \"Bucket\": \"bucket!\",\n                \"ForcePathStyle\": true,\n                \"UseFIPS\": true,\n                \"UseDualStack\": true\n              }\n            },\n            {\n              \"documentation\": \"endpoint override + FIPS + dualstack (BUG)\",\n              \"expect\": {\n                \"error\": \"A custom endpoint cannot be combined with FIPS\"\n              },\n              \"params\": {\n                \"Region\": \"us-east-1\",\n                \"Bucket\": \"bucket!\",\n                \"ForcePathStyle\": true,\n                \"UseFIPS\": true,\n                \"UseDualStack\": false,\n                \"Endpoint\": \"http://foo.com\"\n              }\n            },\n            {\n              \"documentation\": \"endpoint override + non-dns bucket + FIPS (BUG)\",\n              \"expect\": {\n                \"error\": \"A custom endpoint cannot be combined with FIPS\"\n              },\n              \"params\": {\n                \"Region\": \"us-east-1\",\n                \"Bucket\": \"bucket!\",\n                \"UseFIPS\": true,\n                \"UseDualStack\": false,\n                \"Endpoint\": \"http://foo.com\"\n              }\n            },\n            {\n              \"documentation\": \"FIPS + bucket endpoint + force path style\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"disableDoubleEncoding\": true,\n                        \"signingRegion\": \"us-east-1\"\n                      }\n                    ]\n                  },\n                  \"url\": \"https://s3-fips.us-east-1.amazonaws.com/bucket%21\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-east-1\",\n                \"Bucket\": \"bucket!\",\n                \"ForcePathStyle\": true,\n                \"UseFIPS\": true,\n                \"UseDualStack\": false,\n                \"UseGlobalEndpoint\": true\n              }\n            },\n            {\n              \"documentation\": \"bucket + FIPS + force path style\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"disableDoubleEncoding\": true,\n                        \"signingRegion\": \"us-east-1\"\n                      }\n                    ]\n                  },\n                  \"url\": \"https://s3-fips.dualstack.us-east-1.amazonaws.com/bucket\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-east-1\",\n                \"Bucket\": \"bucket\",\n                \"ForcePathStyle\": true,\n                \"UseFIPS\": true,\n                \"UseDualStack\": true,\n                \"UseGlobalEndpoint\": true\n              }\n            },\n            {\n              \"documentation\": \"FIPS + dualstack + use global endpoint\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"disableDoubleEncoding\": true,\n                        \"signingRegion\": \"us-east-1\"\n                      }\n                    ]\n                  },\n                  \"url\": \"https://bucket.s3-fips.dualstack.us-east-1.amazonaws.com\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-east-1\",\n                \"Bucket\": \"bucket\",\n                \"UseFIPS\": true,\n                \"UseDualStack\": true,\n                \"UseGlobalEndpoint\": true\n              }\n            },\n            {\n              \"documentation\": \"URI encoded bucket + use global endpoint\",\n              \"expect\": {\n                \"error\": \"A custom endpoint cannot be combined with FIPS\"\n              },\n              \"params\": {\n                \"Region\": \"us-east-1\",\n                \"Bucket\": \"bucket!\",\n                \"UseFIPS\": true,\n                \"UseDualStack\": false,\n                \"UseGlobalEndpoint\": true,\n                \"Endpoint\": \"https://foo.com\"\n              }\n            },\n            {\n              \"documentation\": \"FIPS + path based endpoint\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"disableDoubleEncoding\": true,\n                        \"signingRegion\": \"us-east-1\"\n                      }\n                    ]\n                  },\n                  \"url\": \"https://s3-fips.us-east-1.amazonaws.com/bucket%21\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-east-1\",\n                \"Bucket\": \"bucket!\",\n                \"UseFIPS\": true,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"UseGlobalEndpoint\": true\n              }\n            },\n            {\n              \"documentation\": \"accelerate + dualstack + global endpoint\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"disableDoubleEncoding\": true,\n                        \"signingRegion\": \"us-east-1\"\n                      }\n                    ]\n                  },\n                  \"url\": \"https://bucket.s3-accelerate.dualstack.amazonaws.com\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-east-1\",\n                \"Bucket\": \"bucket\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": true,\n                \"Accelerate\": true,\n                \"UseGlobalEndpoint\": true\n              }\n            },\n            {\n              \"documentation\": \"dualstack + global endpoint + non URI safe bucket\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"disableDoubleEncoding\": true,\n                        \"signingRegion\": \"us-east-1\"\n                      }\n                    ]\n                  },\n                  \"url\": \"https://s3.dualstack.us-east-1.amazonaws.com/bucket%21\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-east-1\",\n                \"Bucket\": \"bucket!\",\n                \"Accelerate\": false,\n                \"UseDualStack\": true,\n                \"UseFIPS\": false,\n                \"UseGlobalEndpoint\": true\n              }\n            },\n            {\n              \"documentation\": \"FIPS + uri encoded bucket\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"disableDoubleEncoding\": true,\n                        \"signingRegion\": \"us-east-1\"\n                      }\n                    ]\n                  },\n                  \"url\": \"https://s3-fips.us-east-1.amazonaws.com/bucket%21\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-east-1\",\n                \"Bucket\": \"bucket!\",\n                \"ForcePathStyle\": true,\n                \"Accelerate\": false,\n                \"UseDualStack\": false,\n                \"UseFIPS\": true,\n                \"UseGlobalEndpoint\": true\n              }\n            },\n            {\n              \"documentation\": \"endpoint override + non-uri safe endpoint + force path style\",\n              \"expect\": {\n                \"error\": \"A custom endpoint cannot be combined with FIPS\"\n              },\n              \"params\": {\n                \"Region\": \"us-east-1\",\n                \"Bucket\": \"bucket!\",\n                \"ForcePathStyle\": true,\n                \"Accelerate\": false,\n                \"UseDualStack\": false,\n                \"UseFIPS\": true,\n                \"Endpoint\": \"http://foo.com\",\n                \"UseGlobalEndpoint\": true\n              }\n            },\n            {\n              \"documentation\": \"FIPS + Dualstack + global endpoint + non-dns bucket\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"disableDoubleEncoding\": true,\n                        \"signingRegion\": \"us-east-1\"\n                      }\n                    ]\n                  },\n                  \"url\": \"https://s3-fips.dualstack.us-east-1.amazonaws.com/bucket%21\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-east-1\",\n                \"Bucket\": \"bucket!\",\n                \"Accelerate\": false,\n                \"UseDualStack\": true,\n                \"UseFIPS\": true,\n                \"UseGlobalEndpoint\": true\n              }\n            },\n            {\n              \"documentation\": \"endpoint override + FIPS + dualstack\",\n              \"expect\": {\n                \"error\": \"Cannot set dual-stack in combination with a custom endpoint.\"\n              },\n              \"params\": {\n                \"Region\": \"us-east-1\",\n                \"UseDualStack\": true,\n                \"UseFIPS\": true,\n                \"UseGlobalEndpoint\": true,\n                \"Endpoint\": \"http://foo.com\"\n              }\n            },\n            {\n              \"documentation\": \"non-bucket endpoint override + dualstack + global endpoint\",\n              \"expect\": {\n                \"error\": \"Cannot set dual-stack in combination with a custom endpoint.\"\n              },\n              \"params\": {\n                \"Region\": \"us-east-1\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": true,\n                \"UseGlobalEndpoint\": true,\n                \"Endpoint\": \"http://foo.com\"\n              }\n            },\n            {\n              \"documentation\": \"Endpoint override + UseGlobalEndpoint + us-east-1\",\n              \"expect\": {\n                \"error\": \"A custom endpoint cannot be combined with FIPS\"\n              },\n              \"params\": {\n                \"Region\": \"us-east-1\",\n                \"UseFIPS\": true,\n                \"UseDualStack\": false,\n                \"UseGlobalEndpoint\": true,\n                \"Endpoint\": \"http://foo.com\"\n              }\n            },\n            {\n              \"documentation\": \"non-FIPS partition with FIPS set + custom endpoint\",\n              \"expect\": {\n                \"error\": \"Partition does not support FIPS\"\n              },\n              \"params\": {\n                \"Region\": \"cn-north-1\",\n                \"UseFIPS\": true,\n                \"UseDualStack\": false,\n                \"UseGlobalEndpoint\": true\n              }\n            },\n            {\n              \"documentation\": \"aws-global signs as us-east-1\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"signingRegion\": \"us-east-1\",\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://s3-fips.dualstack.us-east-1.amazonaws.com/bucket%21\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"aws-global\",\n                \"Bucket\": \"bucket!\",\n                \"UseFIPS\": true,\n                \"Accelerate\": false,\n                \"UseDualStack\": true\n              }\n            },\n            {\n              \"documentation\": \"aws-global signs as us-east-1\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"signingRegion\": \"us-east-1\",\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://bucket.foo.com\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"aws-global\",\n                \"Bucket\": \"bucket\",\n                \"UseDualStack\": false,\n                \"UseFIPS\": false,\n                \"Accelerate\": false,\n                \"Endpoint\": \"https://foo.com\"\n              }\n            },\n            {\n              \"documentation\": \"aws-global + dualstack + path-only bucket\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"signingRegion\": \"us-east-1\",\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://s3.dualstack.us-east-1.amazonaws.com/bucket%21\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"aws-global\",\n                \"Bucket\": \"bucket!\",\n                \"UseDualStack\": true,\n                \"UseFIPS\": false,\n                \"Accelerate\": false\n              }\n            },\n            {\n              \"documentation\": \"aws-global + path-only bucket\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"signingRegion\": \"us-east-1\",\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://s3.amazonaws.com/bucket%21\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"aws-global\",\n                \"Bucket\": \"bucket!\"\n              }\n            },\n            {\n              \"documentation\": \"aws-global + fips + custom endpoint\",\n              \"expect\": {\n                \"error\": \"A custom endpoint cannot be combined with FIPS\"\n              },\n              \"params\": {\n                \"Region\": \"aws-global\",\n                \"Bucket\": \"bucket!\",\n                \"UseDualStack\": false,\n                \"UseFIPS\": true,\n                \"Accelerate\": false,\n                \"Endpoint\": \"http://foo.com\"\n              }\n            },\n            {\n              \"documentation\": \"aws-global, endpoint override & path only-bucket\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"signingRegion\": \"us-east-1\",\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"http://foo.com/bucket%21\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"aws-global\",\n                \"Bucket\": \"bucket!\",\n                \"UseDualStack\": false,\n                \"UseFIPS\": false,\n                \"Accelerate\": false,\n                \"Endpoint\": \"http://foo.com\"\n              }\n            },\n            {\n              \"documentation\": \"aws-global + dualstack + custom endpoint\",\n              \"expect\": {\n                \"error\": \"Cannot set dual-stack in combination with a custom endpoint.\"\n              },\n              \"params\": {\n                \"Region\": \"aws-global\",\n                \"UseDualStack\": true,\n                \"UseFIPS\": false,\n                \"Accelerate\": false,\n                \"Endpoint\": \"http://foo.com\"\n              }\n            },\n            {\n              \"documentation\": \"accelerate, dualstack + aws-global\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"signingRegion\": \"us-east-1\",\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://bucket.s3-accelerate.dualstack.us-east-1.amazonaws.com\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"aws-global\",\n                \"Bucket\": \"bucket\",\n                \"UseDualStack\": true,\n                \"UseFIPS\": false,\n                \"Accelerate\": true\n              }\n            },\n            {\n              \"documentation\": \"FIPS + aws-global + path only bucket. This is not supported by S3 but we allow garbage in garbage out\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"signingRegion\": \"us-east-1\",\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://s3-fips.dualstack.us-east-1.amazonaws.com/bucket%21\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"aws-global\",\n                \"Bucket\": \"bucket!\",\n                \"ForcePathStyle\": true,\n                \"UseDualStack\": true,\n                \"UseFIPS\": true,\n                \"Accelerate\": false\n              }\n            },\n            {\n              \"documentation\": \"aws-global + FIPS + endpoint override.\",\n              \"expect\": {\n                \"error\": \"A custom endpoint cannot be combined with FIPS\"\n              },\n              \"params\": {\n                \"Region\": \"aws-global\",\n                \"UseFIPS\": true,\n                \"Endpoint\": \"http://foo.com\"\n              }\n            },\n            {\n              \"documentation\": \"force path style, FIPS, aws-global & endpoint override\",\n              \"expect\": {\n                \"error\": \"A custom endpoint cannot be combined with FIPS\"\n              },\n              \"params\": {\n                \"Region\": \"aws-global\",\n                \"Bucket\": \"bucket!\",\n                \"ForcePathStyle\": true,\n                \"UseFIPS\": true,\n                \"Endpoint\": \"http://foo.com\"\n              }\n            },\n            {\n              \"documentation\": \"ip address causes path style to be forced\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"signingRegion\": \"us-east-1\",\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"http://192.168.1.1/bucket\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"aws-global\",\n                \"Bucket\": \"bucket\",\n                \"Endpoint\": \"http://192.168.1.1\"\n              }\n            },\n            {\n              \"documentation\": \"endpoint override with aws-global region\",\n              \"expect\": {\n                \"error\": \"Cannot set dual-stack in combination with a custom endpoint.\"\n              },\n              \"params\": {\n                \"Region\": \"aws-global\",\n                \"UseFIPS\": true,\n                \"UseDualStack\": true,\n                \"Endpoint\": \"http://foo.com\"\n              }\n            },\n            {\n              \"documentation\": \"FIPS + path-only (TODO: consider making this an error)\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"signingRegion\": \"us-east-1\",\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://s3-fips.us-east-1.amazonaws.com/bucket%21\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"aws-global\",\n                \"Bucket\": \"bucket!\",\n                \"UseFIPS\": true\n              }\n            },\n            {\n              \"documentation\": \"empty arn type\",\n              \"expect\": {\n                \"error\": \"Invalid ARN: No ARN type specified\"\n              },\n              \"params\": {\n                \"Region\": \"us-east-2\",\n                \"Bucket\": \"arn:aws:not-s3:us-west-2:123456789012::myendpoint\"\n              }\n            },\n            {\n              \"documentation\": \"path style can't be used with accelerate\",\n              \"expect\": {\n                \"error\": \"Path-style addressing cannot be used with S3 Accelerate\"\n              },\n              \"params\": {\n                \"Region\": \"us-east-2\",\n                \"Bucket\": \"bucket!\",\n                \"Accelerate\": true\n              }\n            },\n            {\n              \"documentation\": \"invalid region\",\n              \"expect\": {\n                \"error\": \"Invalid region: region was not a valid DNS name.\"\n              },\n              \"params\": {\n                \"Region\": \"us-east-2!\",\n                \"Bucket\": \"bucket.subdomain\",\n                \"Endpoint\": \"http://foo.com\"\n              }\n            },\n            {\n              \"documentation\": \"invalid region\",\n              \"expect\": {\n                \"error\": \"Invalid region: region was not a valid DNS name.\"\n              },\n              \"params\": {\n                \"Region\": \"us-east-2!\",\n                \"Bucket\": \"bucket\",\n                \"Endpoint\": \"http://foo.com\"\n              }\n            },\n            {\n              \"documentation\": \"empty arn type\",\n              \"expect\": {\n                \"error\": \"Invalid Access Point Name\"\n              },\n              \"params\": {\n                \"Region\": \"us-east-2\",\n                \"Bucket\": \"arn:aws:s3::123456789012:accesspoint:my_endpoint\"\n              }\n            },\n            {\n              \"documentation\": \"empty arn type\",\n              \"expect\": {\n                \"error\": \"Client was configured for partition `aws` but ARN (`arn:aws:s3:cn-north-1:123456789012:accesspoint:my-endpoint`) has `aws-cn`\"\n              },\n              \"params\": {\n                \"Region\": \"us-east-2\",\n                \"Bucket\": \"arn:aws:s3:cn-north-1:123456789012:accesspoint:my-endpoint\",\n                \"UseArnRegion\": true\n              }\n            },\n            {\n              \"documentation\": \"invalid arn region\",\n              \"expect\": {\n                \"error\": \"Invalid region in ARN: `us-east_2` (invalid DNS name)\"\n              },\n              \"params\": {\n                \"Region\": \"us-east-2\",\n                \"Bucket\": \"arn:aws:s3-object-lambda:us-east_2:123456789012:accesspoint:my-endpoint\",\n                \"UseArnRegion\": true\n              }\n            },\n            {\n              \"documentation\": \"invalid ARN outpost\",\n              \"expect\": {\n                \"error\": \"Invalid ARN: The outpost Id may only contain a-z, A-Z, 0-9 and `-`. Found: `op_01234567890123456`\"\n              },\n              \"params\": {\n                \"Region\": \"us-east-2\",\n                \"Bucket\": \"arn:aws:s3-outposts:us-east-1:123456789012:outpost/op_01234567890123456/accesspoint/reports\",\n                \"UseArnRegion\": true\n              }\n            },\n            {\n              \"documentation\": \"invalid ARN\",\n              \"expect\": {\n                \"error\": \"Invalid ARN: expected an access point name\"\n              },\n              \"params\": {\n                \"Region\": \"us-east-2\",\n                \"Bucket\": \"arn:aws:s3-outposts:us-east-1:123456789012:outpost/op-01234567890123456/reports\"\n              }\n            },\n            {\n              \"documentation\": \"invalid ARN\",\n              \"expect\": {\n                \"error\": \"Invalid ARN: Expected a 4-component resource\"\n              },\n              \"params\": {\n                \"Region\": \"us-east-2\",\n                \"Bucket\": \"arn:aws:s3-outposts:us-east-1:123456789012:outpost/op-01234567890123456\"\n              }\n            },\n            {\n              \"documentation\": \"invalid outpost type\",\n              \"expect\": {\n                \"error\": \"Expected an outpost type `accesspoint`, found not-accesspoint\"\n              },\n              \"params\": {\n                \"Region\": \"us-east-2\",\n                \"Bucket\": \"arn:aws:s3-outposts:us-east-1:123456789012:outpost/op-01234567890123456/not-accesspoint/reports\"\n              }\n            },\n            {\n              \"documentation\": \"invalid outpost type\",\n              \"expect\": {\n                \"error\": \"Invalid region in ARN: `us-east_1` (invalid DNS name)\"\n              },\n              \"params\": {\n                \"Region\": \"us-east-2\",\n                \"Bucket\": \"arn:aws:s3-outposts:us-east_1:123456789012:outpost/op-01234567890123456/not-accesspoint/reports\"\n              }\n            },\n            {\n              \"documentation\": \"invalid outpost type\",\n              \"expect\": {\n                \"error\": \"Invalid ARN: The account id may only contain a-z, A-Z, 0-9 and `-`. Found: `12345_789012`\"\n              },\n              \"params\": {\n                \"Region\": \"us-east-2\",\n                \"Bucket\": \"arn:aws:s3-outposts:us-east-1:12345_789012:outpost/op-01234567890123456/not-accesspoint/reports\"\n              }\n            },\n            {\n              \"documentation\": \"invalid outpost type\",\n              \"expect\": {\n                \"error\": \"Invalid ARN: The Outpost Id was not set\"\n              },\n              \"params\": {\n                \"Region\": \"us-east-2\",\n                \"Bucket\": \"arn:aws:s3-outposts:us-east-1:12345789012:outpost\"\n              }\n            },\n            {\n              \"documentation\": \"use global endpoint virtual addressing\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"signingRegion\": \"us-east-2\",\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"http://bucket.example.com\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-east-2\",\n                \"Bucket\": \"bucket\",\n                \"Endpoint\": \"http://example.com\",\n                \"UseGlobalEndpoint\": true\n              }\n            },\n            {\n              \"documentation\": \"global endpoint + ip address\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"signingRegion\": \"us-east-2\",\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"http://192.168.0.1/bucket\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-east-2\",\n                \"Bucket\": \"bucket\",\n                \"Endpoint\": \"http://192.168.0.1\",\n                \"UseGlobalEndpoint\": true\n              }\n            },\n            {\n              \"documentation\": \"invalid outpost type\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"signingRegion\": \"us-east-2\",\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://s3.us-east-2.amazonaws.com/bucket%21\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-east-2\",\n                \"Bucket\": \"bucket!\",\n                \"UseGlobalEndpoint\": true\n              }\n            },\n            {\n              \"documentation\": \"invalid outpost type\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"signingRegion\": \"us-east-2\",\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://bucket.s3-accelerate.amazonaws.com\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-east-2\",\n                \"Bucket\": \"bucket\",\n                \"Accelerate\": true,\n                \"UseGlobalEndpoint\": true\n              }\n            },\n            {\n              \"documentation\": \"use global endpoint + custom endpoint\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"signingRegion\": \"us-east-2\",\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"http://foo.com/bucket%21\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-east-2\",\n                \"Bucket\": \"bucket!\",\n                \"UseGlobalEndpoint\": true,\n                \"Endpoint\": \"http://foo.com\"\n              }\n            },\n            {\n              \"documentation\": \"use global endpoint, not us-east-1, force path style\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"signingRegion\": \"us-east-2\",\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"http://foo.com/bucket%21\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-east-2\",\n                \"Bucket\": \"bucket!\",\n                \"UseGlobalEndpoint\": true,\n                \"ForcePathStyle\": true,\n                \"Endpoint\": \"http://foo.com\"\n              }\n            },\n            {\n              \"documentation\": \"vanilla virtual addressing@us-west-2\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://bucket-name.s3.us-west-2.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-west-2\"\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"bucket-name\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Accelerate\": false,\n                \"Bucket\": \"bucket-name\",\n                \"ForcePathStyle\": false,\n                \"Region\": \"us-west-2\",\n                \"UseDualStack\": false,\n                \"UseFIPS\": false\n              }\n            },\n            {\n              \"documentation\": \"virtual addressing + dualstack@us-west-2\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://bucket-name.s3.dualstack.us-west-2.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-west-2\",\n                    \"AWS::UseDualStack\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"bucket-name\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Accelerate\": false,\n                \"Bucket\": \"bucket-name\",\n                \"ForcePathStyle\": false,\n                \"Region\": \"us-west-2\",\n                \"UseDualStack\": true,\n                \"UseFIPS\": false\n              }\n            },\n            {\n              \"documentation\": \"accelerate + dualstack@us-west-2\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://bucket-name.s3-accelerate.dualstack.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-west-2\",\n                    \"AWS::UseDualStack\": true,\n                    \"AWS::S3::Accelerate\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"bucket-name\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Accelerate\": true,\n                \"Bucket\": \"bucket-name\",\n                \"ForcePathStyle\": false,\n                \"Region\": \"us-west-2\",\n                \"UseDualStack\": true,\n                \"UseFIPS\": false\n              }\n            },\n            {\n              \"documentation\": \"accelerate (dualstack=false)@us-west-2\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://bucket-name.s3-accelerate.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-west-2\",\n                    \"AWS::S3::Accelerate\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"bucket-name\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Accelerate\": true,\n                \"Bucket\": \"bucket-name\",\n                \"ForcePathStyle\": false,\n                \"Region\": \"us-west-2\",\n                \"UseDualStack\": false,\n                \"UseFIPS\": false\n              }\n            },\n            {\n              \"documentation\": \"virtual addressing + fips@us-west-2\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://bucket-name.s3-fips.us-west-2.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-west-2\",\n                    \"AWS::UseFIPS\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"bucket-name\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Accelerate\": false,\n                \"Bucket\": \"bucket-name\",\n                \"ForcePathStyle\": false,\n                \"Region\": \"us-west-2\",\n                \"UseDualStack\": false,\n                \"UseFIPS\": true\n              }\n            },\n            {\n              \"documentation\": \"virtual addressing + dualstack + fips@us-west-2\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://bucket-name.s3-fips.dualstack.us-west-2.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-west-2\",\n                    \"AWS::UseFIPS\": true,\n                    \"AWS::UseDualStack\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"bucket-name\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Accelerate\": false,\n                \"Bucket\": \"bucket-name\",\n                \"ForcePathStyle\": false,\n                \"Region\": \"us-west-2\",\n                \"UseDualStack\": true,\n                \"UseFIPS\": true\n              }\n            },\n            {\n              \"documentation\": \"accelerate + fips = error@us-west-2\",\n              \"expect\": {\n                \"error\": \"Accelerate cannot be used with FIPS\"\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-west-2\",\n                    \"AWS::UseFIPS\": true,\n                    \"AWS::S3::Accelerate\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"bucket-name\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Accelerate\": true,\n                \"Bucket\": \"bucket-name\",\n                \"ForcePathStyle\": false,\n                \"Region\": \"us-west-2\",\n                \"UseDualStack\": false,\n                \"UseFIPS\": true\n              }\n            },\n            {\n              \"documentation\": \"vanilla virtual addressing@cn-north-1\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"cn-north-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://bucket-name.s3.cn-north-1.amazonaws.com.cn\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"cn-north-1\"\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"bucket-name\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Accelerate\": false,\n                \"Bucket\": \"bucket-name\",\n                \"ForcePathStyle\": false,\n                \"Region\": \"cn-north-1\",\n                \"UseDualStack\": false,\n                \"UseFIPS\": false\n              }\n            },\n            {\n              \"documentation\": \"virtual addressing + dualstack@cn-north-1\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"cn-north-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://bucket-name.s3.dualstack.cn-north-1.amazonaws.com.cn\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"cn-north-1\",\n                    \"AWS::UseDualStack\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"bucket-name\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Accelerate\": false,\n                \"Bucket\": \"bucket-name\",\n                \"ForcePathStyle\": false,\n                \"Region\": \"cn-north-1\",\n                \"UseDualStack\": true,\n                \"UseFIPS\": false\n              }\n            },\n            {\n              \"documentation\": \"accelerate (dualstack=false)@cn-north-1\",\n              \"expect\": {\n                \"error\": \"S3 Accelerate cannot be used in this region\"\n              },\n              \"params\": {\n                \"Accelerate\": true,\n                \"Bucket\": \"bucket-name\",\n                \"ForcePathStyle\": false,\n                \"Region\": \"cn-north-1\",\n                \"UseDualStack\": false,\n                \"UseFIPS\": false\n              }\n            },\n            {\n              \"documentation\": \"virtual addressing + fips@cn-north-1\",\n              \"expect\": {\n                \"error\": \"Partition does not support FIPS\"\n              },\n              \"params\": {\n                \"Accelerate\": false,\n                \"Bucket\": \"bucket-name\",\n                \"ForcePathStyle\": false,\n                \"Region\": \"cn-north-1\",\n                \"UseDualStack\": false,\n                \"UseFIPS\": true\n              }\n            },\n            {\n              \"documentation\": \"vanilla virtual addressing@af-south-1\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"af-south-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://bucket-name.s3.af-south-1.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"af-south-1\"\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"bucket-name\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Accelerate\": false,\n                \"Bucket\": \"bucket-name\",\n                \"ForcePathStyle\": false,\n                \"Region\": \"af-south-1\",\n                \"UseDualStack\": false,\n                \"UseFIPS\": false\n              }\n            },\n            {\n              \"documentation\": \"virtual addressing + dualstack@af-south-1\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"af-south-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://bucket-name.s3.dualstack.af-south-1.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"af-south-1\",\n                    \"AWS::UseDualStack\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"bucket-name\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Accelerate\": false,\n                \"Bucket\": \"bucket-name\",\n                \"ForcePathStyle\": false,\n                \"Region\": \"af-south-1\",\n                \"UseDualStack\": true,\n                \"UseFIPS\": false\n              }\n            },\n            {\n              \"documentation\": \"accelerate + dualstack@af-south-1\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"af-south-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://bucket-name.s3-accelerate.dualstack.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"af-south-1\",\n                    \"AWS::UseDualStack\": true,\n                    \"AWS::S3::Accelerate\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"bucket-name\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Accelerate\": true,\n                \"Bucket\": \"bucket-name\",\n                \"ForcePathStyle\": false,\n                \"Region\": \"af-south-1\",\n                \"UseDualStack\": true,\n                \"UseFIPS\": false\n              }\n            },\n            {\n              \"documentation\": \"accelerate (dualstack=false)@af-south-1\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"af-south-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://bucket-name.s3-accelerate.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"af-south-1\",\n                    \"AWS::S3::Accelerate\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"bucket-name\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Accelerate\": true,\n                \"Bucket\": \"bucket-name\",\n                \"ForcePathStyle\": false,\n                \"Region\": \"af-south-1\",\n                \"UseDualStack\": false,\n                \"UseFIPS\": false\n              }\n            },\n            {\n              \"documentation\": \"virtual addressing + fips@af-south-1\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"af-south-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://bucket-name.s3-fips.af-south-1.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"af-south-1\",\n                    \"AWS::UseFIPS\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"bucket-name\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Accelerate\": false,\n                \"Bucket\": \"bucket-name\",\n                \"ForcePathStyle\": false,\n                \"Region\": \"af-south-1\",\n                \"UseDualStack\": false,\n                \"UseFIPS\": true\n              }\n            },\n            {\n              \"documentation\": \"virtual addressing + dualstack + fips@af-south-1\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"af-south-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://bucket-name.s3-fips.dualstack.af-south-1.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"af-south-1\",\n                    \"AWS::UseFIPS\": true,\n                    \"AWS::UseDualStack\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"bucket-name\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Accelerate\": false,\n                \"Bucket\": \"bucket-name\",\n                \"ForcePathStyle\": false,\n                \"Region\": \"af-south-1\",\n                \"UseDualStack\": true,\n                \"UseFIPS\": true\n              }\n            },\n            {\n              \"documentation\": \"accelerate + fips = error@af-south-1\",\n              \"expect\": {\n                \"error\": \"Accelerate cannot be used with FIPS\"\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"af-south-1\",\n                    \"AWS::UseFIPS\": true,\n                    \"AWS::S3::Accelerate\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"bucket-name\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Accelerate\": true,\n                \"Bucket\": \"bucket-name\",\n                \"ForcePathStyle\": false,\n                \"Region\": \"af-south-1\",\n                \"UseDualStack\": false,\n                \"UseFIPS\": true\n              }\n            },\n            {\n              \"documentation\": \"vanilla path style@us-west-2\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://s3.us-west-2.amazonaws.com/bucket-name\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-west-2\",\n                    \"AWS::S3::ForcePathStyle\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"bucket-name\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Accelerate\": false,\n                \"Bucket\": \"bucket-name\",\n                \"ForcePathStyle\": true,\n                \"Region\": \"us-west-2\",\n                \"UseDualStack\": false,\n                \"UseFIPS\": false\n              }\n            },\n            {\n              \"documentation\": \"fips@us-gov-west-2, bucket is not S3-dns-compatible (subdomains)\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"us-gov-west-1\",\n                        \"disableDoubleEncoding\": true,\n                        \"name\": \"sigv4\"\n                      }\n                    ]\n                  },\n                  \"url\": \"https://s3-fips.us-gov-west-1.amazonaws.com/bucket.with.dots\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-gov-west-1\",\n                    \"AWS::UseFIPS\": true,\n                    \"AWS::S3::ForcePathStyle\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"bucket.with.dots\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Accelerate\": false,\n                \"Bucket\": \"bucket.with.dots\",\n                \"Region\": \"us-gov-west-1\",\n                \"UseDualStack\": false,\n                \"UseFIPS\": true\n              }\n            },\n            {\n              \"documentation\": \"path style + accelerate = error@us-west-2\",\n              \"expect\": {\n                \"error\": \"Path-style addressing cannot be used with S3 Accelerate\"\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-west-2\",\n                    \"AWS::S3::ForcePathStyle\": true,\n                    \"AWS::S3::Accelerate\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"bucket-name\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Accelerate\": true,\n                \"Bucket\": \"bucket-name\",\n                \"ForcePathStyle\": true,\n                \"Region\": \"us-west-2\",\n                \"UseDualStack\": false,\n                \"UseFIPS\": false\n              }\n            },\n            {\n              \"documentation\": \"path style + dualstack@us-west-2\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://s3.dualstack.us-west-2.amazonaws.com/bucket-name\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-west-2\",\n                    \"AWS::UseDualStack\": true,\n                    \"AWS::S3::ForcePathStyle\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"bucket-name\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Accelerate\": false,\n                \"Bucket\": \"bucket-name\",\n                \"ForcePathStyle\": true,\n                \"Region\": \"us-west-2\",\n                \"UseDualStack\": true,\n                \"UseFIPS\": false\n              }\n            },\n            {\n              \"documentation\": \"path style + arn is error@us-west-2\",\n              \"expect\": {\n                \"error\": \"Path-style addressing cannot be used with ARN buckets\"\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-west-2\",\n                    \"AWS::S3::ForcePathStyle\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"arn:PARTITION:s3-outposts:REGION:123456789012:outpost:op-01234567890123456:bucket:mybucket\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Accelerate\": false,\n                \"Bucket\": \"arn:PARTITION:s3-outposts:REGION:123456789012:outpost:op-01234567890123456:bucket:mybucket\",\n                \"ForcePathStyle\": true,\n                \"Region\": \"us-west-2\",\n                \"UseDualStack\": false,\n                \"UseFIPS\": false\n              }\n            },\n            {\n              \"documentation\": \"path style + invalid DNS name@us-west-2\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://s3.us-west-2.amazonaws.com/99a_b\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-west-2\",\n                    \"AWS::S3::ForcePathStyle\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"99a_b\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Accelerate\": false,\n                \"Bucket\": \"99a_b\",\n                \"ForcePathStyle\": true,\n                \"Region\": \"us-west-2\",\n                \"UseDualStack\": false,\n                \"UseFIPS\": false\n              }\n            },\n            {\n              \"documentation\": \"no path style + invalid DNS name@us-west-2\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://s3.us-west-2.amazonaws.com/99a_b\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-west-2\"\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"99a_b\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Accelerate\": false,\n                \"Bucket\": \"99a_b\",\n                \"Region\": \"us-west-2\",\n                \"UseDualStack\": false,\n                \"UseFIPS\": false\n              }\n            },\n            {\n              \"documentation\": \"vanilla path style@cn-north-1\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"cn-north-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://s3.cn-north-1.amazonaws.com.cn/bucket-name\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"cn-north-1\",\n                    \"AWS::S3::ForcePathStyle\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"bucket-name\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Accelerate\": false,\n                \"Bucket\": \"bucket-name\",\n                \"ForcePathStyle\": true,\n                \"Region\": \"cn-north-1\",\n                \"UseDualStack\": false,\n                \"UseFIPS\": false\n              }\n            },\n            {\n              \"documentation\": \"path style + fips@cn-north-1\",\n              \"expect\": {\n                \"error\": \"Partition does not support FIPS\"\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"cn-north-1\",\n                    \"AWS::UseFIPS\": true,\n                    \"AWS::S3::ForcePathStyle\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"bucket-name\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Accelerate\": false,\n                \"Bucket\": \"bucket-name\",\n                \"ForcePathStyle\": true,\n                \"Region\": \"cn-north-1\",\n                \"UseDualStack\": false,\n                \"UseFIPS\": true\n              }\n            },\n            {\n              \"documentation\": \"path style + accelerate = error@cn-north-1\",\n              \"expect\": {\n                \"error\": \"Path-style addressing cannot be used with S3 Accelerate\"\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"cn-north-1\",\n                    \"AWS::S3::ForcePathStyle\": true,\n                    \"AWS::S3::Accelerate\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"bucket-name\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Accelerate\": true,\n                \"Bucket\": \"bucket-name\",\n                \"ForcePathStyle\": true,\n                \"Region\": \"cn-north-1\",\n                \"UseDualStack\": false,\n                \"UseFIPS\": false\n              }\n            },\n            {\n              \"documentation\": \"path style + dualstack@cn-north-1\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"cn-north-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://s3.dualstack.cn-north-1.amazonaws.com.cn/bucket-name\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"cn-north-1\",\n                    \"AWS::UseDualStack\": true,\n                    \"AWS::S3::ForcePathStyle\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"bucket-name\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Accelerate\": false,\n                \"Bucket\": \"bucket-name\",\n                \"ForcePathStyle\": true,\n                \"Region\": \"cn-north-1\",\n                \"UseDualStack\": true,\n                \"UseFIPS\": false\n              }\n            },\n            {\n              \"documentation\": \"path style + arn is error@cn-north-1\",\n              \"expect\": {\n                \"error\": \"Path-style addressing cannot be used with ARN buckets\"\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"cn-north-1\",\n                    \"AWS::S3::ForcePathStyle\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"arn:PARTITION:s3-outposts:REGION:123456789012:outpost:op-01234567890123456:bucket:mybucket\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Accelerate\": false,\n                \"Bucket\": \"arn:PARTITION:s3-outposts:REGION:123456789012:outpost:op-01234567890123456:bucket:mybucket\",\n                \"ForcePathStyle\": true,\n                \"Region\": \"cn-north-1\",\n                \"UseDualStack\": false,\n                \"UseFIPS\": false\n              }\n            },\n            {\n              \"documentation\": \"path style + invalid DNS name@cn-north-1\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"cn-north-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://s3.cn-north-1.amazonaws.com.cn/99a_b\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"cn-north-1\",\n                    \"AWS::S3::ForcePathStyle\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"99a_b\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Accelerate\": false,\n                \"Bucket\": \"99a_b\",\n                \"ForcePathStyle\": true,\n                \"Region\": \"cn-north-1\",\n                \"UseDualStack\": false,\n                \"UseFIPS\": false\n              }\n            },\n            {\n              \"documentation\": \"no path style + invalid DNS name@cn-north-1\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"cn-north-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://s3.cn-north-1.amazonaws.com.cn/99a_b\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"cn-north-1\"\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"99a_b\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Accelerate\": false,\n                \"Bucket\": \"99a_b\",\n                \"Region\": \"cn-north-1\",\n                \"UseDualStack\": false,\n                \"UseFIPS\": false\n              }\n            },\n            {\n              \"documentation\": \"vanilla path style@af-south-1\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"af-south-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://s3.af-south-1.amazonaws.com/bucket-name\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"af-south-1\",\n                    \"AWS::S3::ForcePathStyle\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"bucket-name\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Accelerate\": false,\n                \"Bucket\": \"bucket-name\",\n                \"ForcePathStyle\": true,\n                \"Region\": \"af-south-1\",\n                \"UseDualStack\": false,\n                \"UseFIPS\": false\n              }\n            },\n            {\n              \"documentation\": \"path style + fips@af-south-1\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"af-south-1\",\n                        \"disableDoubleEncoding\": true,\n                        \"name\": \"sigv4\"\n                      }\n                    ]\n                  },\n                  \"url\": \"https://s3-fips.af-south-1.amazonaws.com/bucket-name\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"af-south-1\",\n                    \"AWS::UseFIPS\": true,\n                    \"AWS::S3::ForcePathStyle\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"bucket-name\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Accelerate\": false,\n                \"Bucket\": \"bucket-name\",\n                \"ForcePathStyle\": true,\n                \"Region\": \"af-south-1\",\n                \"UseDualStack\": false,\n                \"UseFIPS\": true\n              }\n            },\n            {\n              \"documentation\": \"path style + accelerate = error@af-south-1\",\n              \"expect\": {\n                \"error\": \"Path-style addressing cannot be used with S3 Accelerate\"\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"af-south-1\",\n                    \"AWS::S3::ForcePathStyle\": true,\n                    \"AWS::S3::Accelerate\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"bucket-name\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Accelerate\": true,\n                \"Bucket\": \"bucket-name\",\n                \"ForcePathStyle\": true,\n                \"Region\": \"af-south-1\",\n                \"UseDualStack\": false,\n                \"UseFIPS\": false\n              }\n            },\n            {\n              \"documentation\": \"path style + dualstack@af-south-1\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"af-south-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://s3.dualstack.af-south-1.amazonaws.com/bucket-name\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"af-south-1\",\n                    \"AWS::UseDualStack\": true,\n                    \"AWS::S3::ForcePathStyle\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"bucket-name\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Accelerate\": false,\n                \"Bucket\": \"bucket-name\",\n                \"ForcePathStyle\": true,\n                \"Region\": \"af-south-1\",\n                \"UseDualStack\": true,\n                \"UseFIPS\": false\n              }\n            },\n            {\n              \"documentation\": \"path style + arn is error@af-south-1\",\n              \"expect\": {\n                \"error\": \"Path-style addressing cannot be used with ARN buckets\"\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"af-south-1\",\n                    \"AWS::S3::ForcePathStyle\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"arn:PARTITION:s3-outposts:REGION:123456789012:outpost:op-01234567890123456:bucket:mybucket\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Accelerate\": false,\n                \"Bucket\": \"arn:PARTITION:s3-outposts:REGION:123456789012:outpost:op-01234567890123456:bucket:mybucket\",\n                \"ForcePathStyle\": true,\n                \"Region\": \"af-south-1\",\n                \"UseDualStack\": false,\n                \"UseFIPS\": false\n              }\n            },\n            {\n              \"documentation\": \"path style + invalid DNS name@af-south-1\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"af-south-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://s3.af-south-1.amazonaws.com/99a_b\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"af-south-1\",\n                    \"AWS::S3::ForcePathStyle\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"99a_b\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Accelerate\": false,\n                \"Bucket\": \"99a_b\",\n                \"ForcePathStyle\": true,\n                \"Region\": \"af-south-1\",\n                \"UseDualStack\": false,\n                \"UseFIPS\": false\n              }\n            },\n            {\n              \"documentation\": \"no path style + invalid DNS name@af-south-1\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"af-south-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://s3.af-south-1.amazonaws.com/99a_b\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"af-south-1\"\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"99a_b\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Accelerate\": false,\n                \"Bucket\": \"99a_b\",\n                \"Region\": \"af-south-1\",\n                \"UseDualStack\": false,\n                \"UseFIPS\": false\n              }\n            },\n            {\n              \"documentation\": \"virtual addressing + private link@us-west-2\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"http://bucket-name.control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-west-2\",\n                    \"SDK::Endpoint\": \"http://control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com\"\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"bucket-name\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Accelerate\": false,\n                \"Bucket\": \"bucket-name\",\n                \"ForcePathStyle\": false,\n                \"Endpoint\": \"http://control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com\",\n                \"Region\": \"us-west-2\",\n                \"UseDualStack\": false,\n                \"UseFIPS\": false\n              }\n            },\n            {\n              \"documentation\": \"path style + private link@us-west-2\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com/bucket-name\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-west-2\",\n                    \"SDK::Endpoint\": \"https://control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com\",\n                    \"AWS::S3::ForcePathStyle\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"bucket-name\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Accelerate\": false,\n                \"Bucket\": \"bucket-name\",\n                \"ForcePathStyle\": true,\n                \"Endpoint\": \"https://control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com\",\n                \"Region\": \"us-west-2\",\n                \"UseDualStack\": false,\n                \"UseFIPS\": false\n              }\n            },\n            {\n              \"documentation\": \"SDK::Host + FIPS@us-west-2\",\n              \"expect\": {\n                \"error\": \"A custom endpoint cannot be combined with FIPS\"\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-west-2\",\n                    \"AWS::UseFIPS\": true,\n                    \"SDK::Endpoint\": \"https://control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com\"\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"bucket-name\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Accelerate\": false,\n                \"Bucket\": \"bucket-name\",\n                \"ForcePathStyle\": false,\n                \"Endpoint\": \"https://control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com\",\n                \"Region\": \"us-west-2\",\n                \"UseDualStack\": false,\n                \"UseFIPS\": true\n              }\n            },\n            {\n              \"documentation\": \"SDK::Host + DualStack@us-west-2\",\n              \"expect\": {\n                \"error\": \"Cannot set dual-stack in combination with a custom endpoint.\"\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-west-2\",\n                    \"AWS::UseDualStack\": true,\n                    \"SDK::Endpoint\": \"https://control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com\"\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"bucket-name\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Accelerate\": false,\n                \"Bucket\": \"bucket-name\",\n                \"ForcePathStyle\": false,\n                \"Endpoint\": \"https://control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com\",\n                \"Region\": \"us-west-2\",\n                \"UseDualStack\": true,\n                \"UseFIPS\": false\n              }\n            },\n            {\n              \"documentation\": \"SDK::HOST + accelerate@us-west-2\",\n              \"expect\": {\n                \"error\": \"A custom endpoint cannot be combined with S3 Accelerate\"\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-west-2\",\n                    \"SDK::Endpoint\": \"http://control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com\",\n                    \"AWS::S3::Accelerate\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"bucket-name\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Accelerate\": true,\n                \"Bucket\": \"bucket-name\",\n                \"ForcePathStyle\": false,\n                \"Endpoint\": \"http://control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com\",\n                \"Region\": \"us-west-2\",\n                \"UseDualStack\": false,\n                \"UseFIPS\": false\n              }\n            },\n            {\n              \"documentation\": \"SDK::Host + access point ARN@us-west-2\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://myendpoint-123456789012.beta.example.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-west-2\",\n                    \"SDK::Endpoint\": \"https://beta.example.com\"\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"arn:aws:s3:us-west-2:123456789012:accesspoint:myendpoint\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Accelerate\": false,\n                \"Bucket\": \"arn:aws:s3:us-west-2:123456789012:accesspoint:myendpoint\",\n                \"ForcePathStyle\": false,\n                \"Endpoint\": \"https://beta.example.com\",\n                \"Region\": \"us-west-2\",\n                \"UseDualStack\": false,\n                \"UseFIPS\": false\n              }\n            },\n            {\n              \"documentation\": \"virtual addressing + private link@cn-north-1\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"cn-north-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://bucket-name.control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"cn-north-1\",\n                    \"SDK::Endpoint\": \"https://control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com\"\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"bucket-name\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Accelerate\": false,\n                \"Bucket\": \"bucket-name\",\n                \"ForcePathStyle\": false,\n                \"Endpoint\": \"https://control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com\",\n                \"Region\": \"cn-north-1\",\n                \"UseDualStack\": false,\n                \"UseFIPS\": false\n              }\n            },\n            {\n              \"documentation\": \"path style + private link@cn-north-1\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"cn-north-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com/bucket-name\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"cn-north-1\",\n                    \"SDK::Endpoint\": \"https://control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com\",\n                    \"AWS::S3::ForcePathStyle\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"bucket-name\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Accelerate\": false,\n                \"Bucket\": \"bucket-name\",\n                \"ForcePathStyle\": true,\n                \"Endpoint\": \"https://control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com\",\n                \"Region\": \"cn-north-1\",\n                \"UseDualStack\": false,\n                \"UseFIPS\": false\n              }\n            },\n            {\n              \"documentation\": \"FIPS@cn-north-1\",\n              \"expect\": {\n                \"error\": \"Partition does not support FIPS\"\n              },\n              \"params\": {\n                \"Accelerate\": false,\n                \"Bucket\": \"bucket-name\",\n                \"ForcePathStyle\": false,\n                \"Region\": \"cn-north-1\",\n                \"UseDualStack\": false,\n                \"UseFIPS\": true\n              }\n            },\n            {\n              \"documentation\": \"SDK::Host + DualStack@cn-north-1\",\n              \"expect\": {\n                \"error\": \"Cannot set dual-stack in combination with a custom endpoint.\"\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"cn-north-1\",\n                    \"AWS::UseDualStack\": true,\n                    \"SDK::Endpoint\": \"https://control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com\"\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"bucket-name\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Accelerate\": false,\n                \"Bucket\": \"bucket-name\",\n                \"ForcePathStyle\": false,\n                \"Endpoint\": \"https://control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com\",\n                \"Region\": \"cn-north-1\",\n                \"UseDualStack\": true,\n                \"UseFIPS\": false\n              }\n            },\n            {\n              \"documentation\": \"SDK::HOST + accelerate@cn-north-1\",\n              \"expect\": {\n                \"error\": \"A custom endpoint cannot be combined with S3 Accelerate\"\n              },\n              \"params\": {\n                \"Accelerate\": true,\n                \"Bucket\": \"bucket-name\",\n                \"ForcePathStyle\": false,\n                \"Endpoint\": \"https://control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com\",\n                \"Region\": \"cn-north-1\",\n                \"UseDualStack\": false,\n                \"UseFIPS\": false\n              }\n            },\n            {\n              \"documentation\": \"SDK::Host + access point ARN@cn-north-1\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"cn-north-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://myendpoint-123456789012.beta.example.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"cn-north-1\",\n                    \"SDK::Endpoint\": \"https://beta.example.com\"\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"arn:aws-cn:s3:cn-north-1:123456789012:accesspoint:myendpoint\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Accelerate\": false,\n                \"Bucket\": \"arn:aws-cn:s3:cn-north-1:123456789012:accesspoint:myendpoint\",\n                \"ForcePathStyle\": false,\n                \"Endpoint\": \"https://beta.example.com\",\n                \"Region\": \"cn-north-1\",\n                \"UseDualStack\": false,\n                \"UseFIPS\": false\n              }\n            },\n            {\n              \"documentation\": \"virtual addressing + private link@af-south-1\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"af-south-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://bucket-name.control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"af-south-1\",\n                    \"SDK::Endpoint\": \"https://control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com\"\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"bucket-name\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Accelerate\": false,\n                \"Bucket\": \"bucket-name\",\n                \"ForcePathStyle\": false,\n                \"Endpoint\": \"https://control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com\",\n                \"Region\": \"af-south-1\",\n                \"UseDualStack\": false,\n                \"UseFIPS\": false\n              }\n            },\n            {\n              \"documentation\": \"path style + private link@af-south-1\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"af-south-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com/bucket-name\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"af-south-1\",\n                    \"SDK::Endpoint\": \"https://control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com\",\n                    \"AWS::S3::ForcePathStyle\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"bucket-name\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Accelerate\": false,\n                \"Bucket\": \"bucket-name\",\n                \"ForcePathStyle\": true,\n                \"Endpoint\": \"https://control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com\",\n                \"Region\": \"af-south-1\",\n                \"UseDualStack\": false,\n                \"UseFIPS\": false\n              }\n            },\n            {\n              \"documentation\": \"SDK::Host + FIPS@af-south-1\",\n              \"expect\": {\n                \"error\": \"A custom endpoint cannot be combined with FIPS\"\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"af-south-1\",\n                    \"AWS::UseFIPS\": true,\n                    \"SDK::Endpoint\": \"https://control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com\"\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"bucket-name\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Accelerate\": false,\n                \"Bucket\": \"bucket-name\",\n                \"ForcePathStyle\": false,\n                \"Endpoint\": \"https://control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com\",\n                \"Region\": \"af-south-1\",\n                \"UseDualStack\": false,\n                \"UseFIPS\": true\n              }\n            },\n            {\n              \"documentation\": \"SDK::Host + DualStack@af-south-1\",\n              \"expect\": {\n                \"error\": \"Cannot set dual-stack in combination with a custom endpoint.\"\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"af-south-1\",\n                    \"AWS::UseDualStack\": true,\n                    \"SDK::Endpoint\": \"https://control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com\"\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"bucket-name\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Accelerate\": false,\n                \"Bucket\": \"bucket-name\",\n                \"ForcePathStyle\": false,\n                \"Endpoint\": \"https://control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com\",\n                \"Region\": \"af-south-1\",\n                \"UseDualStack\": true,\n                \"UseFIPS\": false\n              }\n            },\n            {\n              \"documentation\": \"SDK::HOST + accelerate@af-south-1\",\n              \"expect\": {\n                \"error\": \"A custom endpoint cannot be combined with S3 Accelerate\"\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"af-south-1\",\n                    \"SDK::Endpoint\": \"https://control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com\",\n                    \"AWS::S3::Accelerate\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"bucket-name\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Accelerate\": true,\n                \"Bucket\": \"bucket-name\",\n                \"ForcePathStyle\": false,\n                \"Endpoint\": \"https://control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com\",\n                \"Region\": \"af-south-1\",\n                \"UseDualStack\": false,\n                \"UseFIPS\": false\n              }\n            },\n            {\n              \"documentation\": \"SDK::Host + access point ARN@af-south-1\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"af-south-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://myendpoint-123456789012.beta.example.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"af-south-1\",\n                    \"SDK::Endpoint\": \"https://beta.example.com\"\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"arn:aws:s3:af-south-1:123456789012:accesspoint:myendpoint\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Accelerate\": false,\n                \"Bucket\": \"arn:aws:s3:af-south-1:123456789012:accesspoint:myendpoint\",\n                \"ForcePathStyle\": false,\n                \"Endpoint\": \"https://beta.example.com\",\n                \"Region\": \"af-south-1\",\n                \"UseDualStack\": false,\n                \"UseFIPS\": false\n              }\n            },\n            {\n              \"documentation\": \"vanilla access point arn@us-west-2\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://myendpoint-123456789012.s3-accesspoint.us-west-2.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-west-2\"\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"arn:aws:s3:us-west-2:123456789012:accesspoint:myendpoint\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Accelerate\": false,\n                \"Bucket\": \"arn:aws:s3:us-west-2:123456789012:accesspoint:myendpoint\",\n                \"ForcePathStyle\": false,\n                \"Region\": \"us-west-2\",\n                \"UseDualStack\": false,\n                \"UseFIPS\": false\n              }\n            },\n            {\n              \"documentation\": \"access point arn + FIPS@us-west-2\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://myendpoint-123456789012.s3-accesspoint-fips.us-west-2.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-west-2\",\n                    \"AWS::UseFIPS\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"arn:aws:s3:us-west-2:123456789012:accesspoint:myendpoint\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Accelerate\": false,\n                \"Bucket\": \"arn:aws:s3:us-west-2:123456789012:accesspoint:myendpoint\",\n                \"ForcePathStyle\": false,\n                \"Region\": \"us-west-2\",\n                \"UseDualStack\": false,\n                \"UseFIPS\": true\n              }\n            },\n            {\n              \"documentation\": \"access point arn + accelerate = error@us-west-2\",\n              \"expect\": {\n                \"error\": \"Access Points do not support S3 Accelerate\"\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-west-2\",\n                    \"AWS::S3::Accelerate\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"arn:aws:s3:us-west-2:123456789012:accesspoint:myendpoint\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Accelerate\": true,\n                \"Bucket\": \"arn:aws:s3:us-west-2:123456789012:accesspoint:myendpoint\",\n                \"ForcePathStyle\": false,\n                \"Region\": \"us-west-2\",\n                \"UseDualStack\": false,\n                \"UseFIPS\": false\n              }\n            },\n            {\n              \"documentation\": \"access point arn + FIPS + DualStack@us-west-2\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://myendpoint-123456789012.s3-accesspoint-fips.dualstack.us-west-2.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-west-2\",\n                    \"AWS::UseFIPS\": true,\n                    \"AWS::UseDualStack\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"arn:aws:s3:us-west-2:123456789012:accesspoint:myendpoint\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Accelerate\": false,\n                \"Bucket\": \"arn:aws:s3:us-west-2:123456789012:accesspoint:myendpoint\",\n                \"ForcePathStyle\": false,\n                \"Region\": \"us-west-2\",\n                \"UseDualStack\": true,\n                \"UseFIPS\": true\n              }\n            },\n            {\n              \"documentation\": \"vanilla access point arn@cn-north-1\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"cn-north-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://myendpoint-123456789012.s3-accesspoint.cn-north-1.amazonaws.com.cn\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"cn-north-1\"\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"arn:aws-cn:s3:cn-north-1:123456789012:accesspoint:myendpoint\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Accelerate\": false,\n                \"Bucket\": \"arn:aws-cn:s3:cn-north-1:123456789012:accesspoint:myendpoint\",\n                \"ForcePathStyle\": false,\n                \"Region\": \"cn-north-1\",\n                \"UseDualStack\": false,\n                \"UseFIPS\": false\n              }\n            },\n            {\n              \"documentation\": \"access point arn + FIPS@cn-north-1\",\n              \"expect\": {\n                \"error\": \"Partition does not support FIPS\"\n              },\n              \"params\": {\n                \"Accelerate\": false,\n                \"Bucket\": \"arn:aws-cn:s3:cn-north-1:123456789012:accesspoint:myendpoint\",\n                \"ForcePathStyle\": false,\n                \"Region\": \"cn-north-1\",\n                \"UseDualStack\": false,\n                \"UseFIPS\": true\n              }\n            },\n            {\n              \"documentation\": \"access point arn + accelerate = error@cn-north-1\",\n              \"expect\": {\n                \"error\": \"Access Points do not support S3 Accelerate\"\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"cn-north-1\",\n                    \"AWS::S3::Accelerate\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"arn:aws-cn:s3:cn-north-1:123456789012:accesspoint:myendpoint\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Accelerate\": true,\n                \"Bucket\": \"arn:aws-cn:s3:cn-north-1:123456789012:accesspoint:myendpoint\",\n                \"ForcePathStyle\": false,\n                \"Region\": \"cn-north-1\",\n                \"UseDualStack\": false,\n                \"UseFIPS\": false\n              }\n            },\n            {\n              \"documentation\": \"access point arn + FIPS + DualStack@cn-north-1\",\n              \"expect\": {\n                \"error\": \"Partition does not support FIPS\"\n              },\n              \"params\": {\n                \"Accelerate\": false,\n                \"Bucket\": \"arn:aws-cn:s3:cn-north-1:123456789012:accesspoint:myendpoint\",\n                \"ForcePathStyle\": false,\n                \"Region\": \"cn-north-1\",\n                \"UseDualStack\": true,\n                \"UseFIPS\": true\n              }\n            },\n            {\n              \"documentation\": \"vanilla access point arn@af-south-1\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"af-south-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://myendpoint-123456789012.s3-accesspoint.af-south-1.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"af-south-1\"\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"arn:aws:s3:af-south-1:123456789012:accesspoint:myendpoint\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Accelerate\": false,\n                \"Bucket\": \"arn:aws:s3:af-south-1:123456789012:accesspoint:myendpoint\",\n                \"ForcePathStyle\": false,\n                \"Region\": \"af-south-1\",\n                \"UseDualStack\": false,\n                \"UseFIPS\": false\n              }\n            },\n            {\n              \"documentation\": \"access point arn + FIPS@af-south-1\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"af-south-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://myendpoint-123456789012.s3-accesspoint-fips.af-south-1.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"af-south-1\",\n                    \"AWS::UseFIPS\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"arn:aws:s3:af-south-1:123456789012:accesspoint:myendpoint\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Accelerate\": false,\n                \"Bucket\": \"arn:aws:s3:af-south-1:123456789012:accesspoint:myendpoint\",\n                \"ForcePathStyle\": false,\n                \"Region\": \"af-south-1\",\n                \"UseDualStack\": false,\n                \"UseFIPS\": true\n              }\n            },\n            {\n              \"documentation\": \"access point arn + accelerate = error@af-south-1\",\n              \"expect\": {\n                \"error\": \"Access Points do not support S3 Accelerate\"\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"af-south-1\",\n                    \"AWS::S3::Accelerate\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"arn:aws:s3:af-south-1:123456789012:accesspoint:myendpoint\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Accelerate\": true,\n                \"Bucket\": \"arn:aws:s3:af-south-1:123456789012:accesspoint:myendpoint\",\n                \"ForcePathStyle\": false,\n                \"Region\": \"af-south-1\",\n                \"UseDualStack\": false,\n                \"UseFIPS\": false\n              }\n            },\n            {\n              \"documentation\": \"access point arn + FIPS + DualStack@af-south-1\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"af-south-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://myendpoint-123456789012.s3-accesspoint-fips.dualstack.af-south-1.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"af-south-1\",\n                    \"AWS::UseFIPS\": true,\n                    \"AWS::UseDualStack\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"arn:aws:s3:af-south-1:123456789012:accesspoint:myendpoint\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Accelerate\": false,\n                \"Bucket\": \"arn:aws:s3:af-south-1:123456789012:accesspoint:myendpoint\",\n                \"ForcePathStyle\": false,\n                \"Region\": \"af-south-1\",\n                \"UseDualStack\": true,\n                \"UseFIPS\": true\n              }\n            },\n            {\n              \"documentation\": \"S3 outposts vanilla test\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4a\",\n                        \"signingName\": \"s3-outposts\",\n                        \"signingRegionSet\": [\"*\"],\n                        \"disableDoubleEncoding\": true\n                      },\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3-outposts\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://reports-123456789012.op-01234567890123456.s3-outposts.us-west-2.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-west-2\"\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"arn:aws:s3-outposts:us-west-2:123456789012:outpost/op-01234567890123456/accesspoint/reports\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"Bucket\": \"arn:aws:s3-outposts:us-west-2:123456789012:outpost/op-01234567890123456/accesspoint/reports\"\n              }\n            },\n            {\n              \"documentation\": \"S3 outposts custom endpoint\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4a\",\n                        \"signingName\": \"s3-outposts\",\n                        \"signingRegionSet\": [\"*\"],\n                        \"disableDoubleEncoding\": true\n                      },\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3-outposts\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://reports-123456789012.op-01234567890123456.example.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-west-2\",\n                    \"SDK::Endpoint\": \"https://example.amazonaws.com\"\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"arn:aws:s3-outposts:us-west-2:123456789012:outpost/op-01234567890123456/accesspoint/reports\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"Bucket\": \"arn:aws:s3-outposts:us-west-2:123456789012:outpost/op-01234567890123456/accesspoint/reports\",\n                \"Endpoint\": \"https://example.amazonaws.com\"\n              }\n            },\n            {\n              \"documentation\": \"outposts arn with region mismatch and UseArnRegion=false\",\n              \"expect\": {\n                \"error\": \"Invalid configuration: region from ARN `us-east-1` does not match client region `us-west-2` and UseArnRegion is `false`\"\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-west-2\",\n                    \"AWS::S3::UseArnRegion\": false\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"arn:aws:s3-outposts:us-east-1:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Accelerate\": false,\n                \"Bucket\": \"arn:aws:s3-outposts:us-east-1:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint\",\n                \"ForcePathStyle\": false,\n                \"UseArnRegion\": false,\n                \"Region\": \"us-west-2\",\n                \"UseDualStack\": false,\n                \"UseFIPS\": false\n              }\n            },\n            {\n              \"documentation\": \"outposts arn with region mismatch, custom region and UseArnRegion=false\",\n              \"expect\": {\n                \"error\": \"Invalid configuration: region from ARN `us-east-1` does not match client region `us-west-2` and UseArnRegion is `false`\"\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-west-2\",\n                    \"SDK::Endpoint\": \"https://example.com\",\n                    \"AWS::S3::UseArnRegion\": false\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"arn:aws:s3-outposts:us-east-1:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Accelerate\": false,\n                \"Bucket\": \"arn:aws:s3-outposts:us-east-1:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint\",\n                \"Endpoint\": \"https://example.com\",\n                \"ForcePathStyle\": false,\n                \"UseArnRegion\": false,\n                \"Region\": \"us-west-2\",\n                \"UseDualStack\": false,\n                \"UseFIPS\": false\n              }\n            },\n            {\n              \"documentation\": \"outposts arn with region mismatch and UseArnRegion=true\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4a\",\n                        \"signingName\": \"s3-outposts\",\n                        \"signingRegionSet\": [\"*\"],\n                        \"disableDoubleEncoding\": true\n                      },\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3-outposts\",\n                        \"signingRegion\": \"us-east-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://myaccesspoint-123456789012.op-01234567890123456.s3-outposts.us-east-1.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-west-2\",\n                    \"AWS::S3::UseArnRegion\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"arn:aws:s3-outposts:us-east-1:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Accelerate\": false,\n                \"Bucket\": \"arn:aws:s3-outposts:us-east-1:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint\",\n                \"ForcePathStyle\": false,\n                \"UseArnRegion\": true,\n                \"Region\": \"us-west-2\",\n                \"UseDualStack\": false,\n                \"UseFIPS\": false\n              }\n            },\n            {\n              \"documentation\": \"outposts arn with region mismatch and UseArnRegion unset\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4a\",\n                        \"signingName\": \"s3-outposts\",\n                        \"signingRegionSet\": [\"*\"],\n                        \"disableDoubleEncoding\": true\n                      },\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3-outposts\",\n                        \"signingRegion\": \"us-east-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://myaccesspoint-123456789012.op-01234567890123456.s3-outposts.us-east-1.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-west-2\"\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"arn:aws:s3-outposts:us-east-1:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Accelerate\": false,\n                \"Bucket\": \"arn:aws:s3-outposts:us-east-1:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint\",\n                \"ForcePathStyle\": false,\n                \"Region\": \"us-west-2\",\n                \"UseDualStack\": false,\n                \"UseFIPS\": false\n              }\n            },\n            {\n              \"documentation\": \"outposts arn with partition mismatch and UseArnRegion=true\",\n              \"expect\": {\n                \"error\": \"Client was configured for partition `aws` but ARN (`arn:aws:s3-outposts:cn-north-1:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint`) has `aws-cn`\"\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-west-2\",\n                    \"AWS::S3::UseArnRegion\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"arn:aws:s3-outposts:cn-north-1:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Accelerate\": false,\n                \"Bucket\": \"arn:aws:s3-outposts:cn-north-1:123456789012:outpost:op-01234567890123456:accesspoint:myaccesspoint\",\n                \"ForcePathStyle\": false,\n                \"UseArnRegion\": true,\n                \"Region\": \"us-west-2\",\n                \"UseDualStack\": false,\n                \"UseFIPS\": false\n              }\n            },\n            {\n              \"documentation\": \"ARN with UseGlobalEndpoint and use-east-1 region uses the regional endpoint\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4a\",\n                        \"signingName\": \"s3-outposts\",\n                        \"signingRegionSet\": [\"*\"],\n                        \"disableDoubleEncoding\": true\n                      },\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3-outposts\",\n                        \"signingRegion\": \"us-east-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://reports-123456789012.op-01234567890123456.s3-outposts.us-east-1.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-east-1\",\n                    \"AWS::S3::UseGlobalEndpoint\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"arn:aws:s3-outposts:us-east-1:123456789012:outpost/op-01234567890123456/accesspoint/reports\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"us-east-1\",\n                \"UseGlobalEndpoint\": true,\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"Bucket\": \"arn:aws:s3-outposts:us-east-1:123456789012:outpost/op-01234567890123456/accesspoint/reports\"\n              }\n            },\n            {\n              \"documentation\": \"S3 outposts does not support dualstack\",\n              \"expect\": {\n                \"error\": \"S3 Outposts does not support Dual-stack\"\n              },\n              \"params\": {\n                \"Region\": \"us-east-1\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": true,\n                \"Accelerate\": false,\n                \"Bucket\": \"arn:aws:s3-outposts:us-west-2:123456789012:outpost/op-01234567890123456/accesspoint/reports\"\n              }\n            },\n            {\n              \"documentation\": \"S3 outposts does not support fips\",\n              \"expect\": {\n                \"error\": \"S3 Outposts does not support FIPS\"\n              },\n              \"params\": {\n                \"Region\": \"us-east-1\",\n                \"UseFIPS\": true,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"Bucket\": \"arn:aws:s3-outposts:us-west-2:123456789012:outpost/op-01234567890123456/accesspoint/reports\"\n              }\n            },\n            {\n              \"documentation\": \"S3 outposts does not support accelerate\",\n              \"expect\": {\n                \"error\": \"S3 Outposts does not support S3 Accelerate\"\n              },\n              \"params\": {\n                \"Region\": \"us-east-1\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": true,\n                \"Bucket\": \"arn:aws:s3-outposts:us-west-2:123456789012:outpost/op-01234567890123456/accesspoint/reports\"\n              }\n            },\n            {\n              \"documentation\": \"validates against subresource\",\n              \"expect\": {\n                \"error\": \"Invalid Arn: Outpost Access Point ARN contains sub resources\"\n              },\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"Bucket\": \"arn:aws:s3-outposts:us-west-2:123456789012:outpost:op-01234567890123456:accesspoint:mybucket:object:foo\"\n              }\n            },\n            {\n              \"documentation\": \"object lambda @us-east-1\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3-object-lambda\",\n                        \"signingRegion\": \"us-east-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://mybanner-123456789012.s3-object-lambda.us-east-1.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-east-1\",\n                    \"AWS::S3::UseArnRegion\": false\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"arn:aws:s3-object-lambda:us-east-1:123456789012:accesspoint/mybanner\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"us-east-1\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"UseArnRegion\": false,\n                \"Bucket\": \"arn:aws:s3-object-lambda:us-east-1:123456789012:accesspoint/mybanner\"\n              }\n            },\n            {\n              \"documentation\": \"object lambda @us-west-2\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3-object-lambda\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://mybanner-123456789012.s3-object-lambda.us-west-2.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-west-2\",\n                    \"AWS::S3::UseArnRegion\": false\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"arn:aws:s3-object-lambda:us-west-2:123456789012:accesspoint/mybanner\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"UseArnRegion\": false,\n                \"Bucket\": \"arn:aws:s3-object-lambda:us-west-2:123456789012:accesspoint/mybanner\"\n              }\n            },\n            {\n              \"documentation\": \"object lambda, colon resource deliminator @us-west-2\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3-object-lambda\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://mybanner-123456789012.s3-object-lambda.us-west-2.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-west-2\",\n                    \"AWS::S3::UseArnRegion\": false\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"arn:aws:s3-object-lambda:us-west-2:123456789012:accesspoint:mybanner\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"UseArnRegion\": false,\n                \"Bucket\": \"arn:aws:s3-object-lambda:us-west-2:123456789012:accesspoint:mybanner\"\n              }\n            },\n            {\n              \"documentation\": \"object lambda @us-east-1, client region us-west-2, useArnRegion=true\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3-object-lambda\",\n                        \"signingRegion\": \"us-east-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://mybanner-123456789012.s3-object-lambda.us-east-1.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-west-2\",\n                    \"AWS::S3::UseArnRegion\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"arn:aws:s3-object-lambda:us-east-1:123456789012:accesspoint/mybanner\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"UseArnRegion\": true,\n                \"Bucket\": \"arn:aws:s3-object-lambda:us-east-1:123456789012:accesspoint/mybanner\"\n              }\n            },\n            {\n              \"documentation\": \"object lambda @us-east-1, client region s3-external-1, useArnRegion=true\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3-object-lambda\",\n                        \"signingRegion\": \"us-east-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://mybanner-123456789012.s3-object-lambda.us-east-1.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"s3-external-1\",\n                    \"AWS::S3::UseArnRegion\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"arn:aws:s3-object-lambda:us-east-1:123456789012:accesspoint/mybanner\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"s3-external-1\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"UseArnRegion\": true,\n                \"Bucket\": \"arn:aws:s3-object-lambda:us-east-1:123456789012:accesspoint/mybanner\"\n              }\n            },\n            {\n              \"documentation\": \"object lambda @us-east-1, client region s3-external-1, useArnRegion=false\",\n              \"expect\": {\n                \"error\": \"Invalid configuration: region from ARN `us-east-1` does not match client region `s3-external-1` and UseArnRegion is `false`\"\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"s3-external-1\",\n                    \"AWS::S3::UseArnRegion\": false\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"arn:aws:s3-object-lambda:us-east-1:123456789012:accesspoint/mybanner\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"s3-external-1\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"UseArnRegion\": false,\n                \"Bucket\": \"arn:aws:s3-object-lambda:us-east-1:123456789012:accesspoint/mybanner\"\n              }\n            },\n            {\n              \"documentation\": \"object lambda @us-east-1, client region aws-global, useArnRegion=true\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3-object-lambda\",\n                        \"signingRegion\": \"us-east-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://mybanner-123456789012.s3-object-lambda.us-east-1.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"aws-global\",\n                    \"AWS::S3::UseArnRegion\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"arn:aws:s3-object-lambda:us-east-1:123456789012:accesspoint/mybanner\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"aws-global\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"UseArnRegion\": true,\n                \"Bucket\": \"arn:aws:s3-object-lambda:us-east-1:123456789012:accesspoint/mybanner\"\n              }\n            },\n            {\n              \"documentation\": \"object lambda @us-east-1, client region aws-global, useArnRegion=false\",\n              \"expect\": {\n                \"error\": \"Invalid configuration: region from ARN `us-east-1` does not match client region `aws-global` and UseArnRegion is `false`\"\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"aws-global\",\n                    \"AWS::S3::UseArnRegion\": false\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"arn:aws:s3-object-lambda:us-east-1:123456789012:accesspoint/mybanner\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"aws-global\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"UseArnRegion\": false,\n                \"Bucket\": \"arn:aws:s3-object-lambda:us-east-1:123456789012:accesspoint/mybanner\"\n              }\n            },\n            {\n              \"documentation\": \"object lambda @cn-north-1, client region us-west-2 (cross partition), useArnRegion=true\",\n              \"expect\": {\n                \"error\": \"Client was configured for partition `aws` but ARN (`arn:aws-cn:s3-object-lambda:cn-north-1:123456789012:accesspoint/mybanner`) has `aws-cn`\"\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"aws-global\",\n                    \"AWS::S3::UseArnRegion\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"arn:aws-cn:s3-object-lambda:cn-north-1:123456789012:accesspoint/mybanner\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"aws-global\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"UseArnRegion\": true,\n                \"Bucket\": \"arn:aws-cn:s3-object-lambda:cn-north-1:123456789012:accesspoint/mybanner\"\n              }\n            },\n            {\n              \"documentation\": \"object lambda with dualstack\",\n              \"expect\": {\n                \"error\": \"S3 Object Lambda does not support Dual-stack\"\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-west-2\",\n                    \"AWS::UseDualStack\": true,\n                    \"AWS::S3::UseArnRegion\": false\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"arn:aws:s3-object-lambda:us-west-2:123456789012:accesspoint/mybanner\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": true,\n                \"Accelerate\": false,\n                \"UseArnRegion\": false,\n                \"Bucket\": \"arn:aws:s3-object-lambda:us-west-2:123456789012:accesspoint/mybanner\"\n              }\n            },\n            {\n              \"documentation\": \"object lambda @us-gov-east-1\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3-object-lambda\",\n                        \"signingRegion\": \"us-gov-east-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://mybanner-123456789012.s3-object-lambda.us-gov-east-1.amazonaws.com\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-gov-east-1\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"UseArnRegion\": false,\n                \"Bucket\": \"arn:aws-us-gov:s3-object-lambda:us-gov-east-1:123456789012:accesspoint/mybanner\"\n              }\n            },\n            {\n              \"documentation\": \"object lambda @us-gov-east-1, with fips\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3-object-lambda\",\n                        \"signingRegion\": \"us-gov-east-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://mybanner-123456789012.s3-object-lambda-fips.us-gov-east-1.amazonaws.com\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-gov-east-1\",\n                \"UseFIPS\": true,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"UseArnRegion\": false,\n                \"Bucket\": \"arn:aws-us-gov:s3-object-lambda:us-gov-east-1:123456789012:accesspoint/mybanner\"\n              }\n            },\n            {\n              \"documentation\": \"object lambda @cn-north-1, with fips\",\n              \"expect\": {\n                \"error\": \"Partition does not support FIPS\"\n              },\n              \"params\": {\n                \"Region\": \"cn-north-1\",\n                \"UseFIPS\": true,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"UseArnRegion\": false,\n                \"Bucket\": \"arn:aws-cn:s3-object-lambda:cn-north-1:123456789012:accesspoint/mybanner\"\n              }\n            },\n            {\n              \"documentation\": \"object lambda with accelerate\",\n              \"expect\": {\n                \"error\": \"S3 Object Lambda does not support S3 Accelerate\"\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-west-2\",\n                    \"AWS::S3::Accelerate\": true,\n                    \"AWS::S3::UseArnRegion\": false\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"arn:aws:s3-object-lambda:us-west-2:123456789012:accesspoint/mybanner\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": true,\n                \"UseArnRegion\": false,\n                \"Bucket\": \"arn:aws:s3-object-lambda:us-west-2:123456789012:accesspoint/mybanner\"\n              }\n            },\n            {\n              \"documentation\": \"object lambda with invalid arn - bad service and someresource\",\n              \"expect\": {\n                \"error\": \"Invalid ARN: Unrecognized format: arn:aws:sqs:us-west-2:123456789012:someresource (type: someresource)\"\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-west-2\",\n                    \"AWS::S3::UseArnRegion\": false\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"arn:aws:sqs:us-west-2:123456789012:someresource\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"UseArnRegion\": false,\n                \"Bucket\": \"arn:aws:sqs:us-west-2:123456789012:someresource\"\n              }\n            },\n            {\n              \"documentation\": \"object lambda with invalid arn - invalid resource\",\n              \"expect\": {\n                \"error\": \"Invalid ARN: Object Lambda ARNs only support `accesspoint` arn types, but found: `bucket_name`\"\n              },\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"UseArnRegion\": false,\n                \"Bucket\": \"arn:aws:s3-object-lambda:us-west-2:123456789012:bucket_name:mybucket\"\n              }\n            },\n            {\n              \"documentation\": \"object lambda with invalid arn - missing region\",\n              \"expect\": {\n                \"error\": \"Invalid ARN: bucket ARN is missing a region\"\n              },\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"UseArnRegion\": false,\n                \"Bucket\": \"arn:aws:s3-object-lambda::123456789012:accesspoint/mybanner\"\n              }\n            },\n            {\n              \"documentation\": \"object lambda with invalid arn - missing account-id\",\n              \"expect\": {\n                \"error\": \"Invalid ARN: Missing account id\"\n              },\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"UseArnRegion\": true,\n                \"Bucket\": \"arn:aws:s3-object-lambda:us-west-2::accesspoint/mybanner\"\n              }\n            },\n            {\n              \"documentation\": \"object lambda with invalid arn - account id contains invalid characters\",\n              \"expect\": {\n                \"error\": \"Invalid ARN: The account id may only contain a-z, A-Z, 0-9 and `-`. Found: `123.45678.9012`\"\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-west-2\",\n                    \"AWS::S3::UseArnRegion\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"arn:aws:s3-object-lambda:us-west-2:123.45678.9012:accesspoint:mybucket\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"UseArnRegion\": true,\n                \"Bucket\": \"arn:aws:s3-object-lambda:us-west-2:123.45678.9012:accesspoint:mybucket\"\n              }\n            },\n            {\n              \"documentation\": \"object lambda with invalid arn - missing access point name\",\n              \"expect\": {\n                \"error\": \"Invalid ARN: Expected a resource of the format `accesspoint:<accesspoint name>` but no name was provided\"\n              },\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"UseArnRegion\": true,\n                \"Bucket\": \"arn:aws:s3-object-lambda:us-west-2:123456789012:accesspoint\"\n              }\n            },\n            {\n              \"documentation\": \"object lambda with invalid arn - access point name contains invalid character: *\",\n              \"expect\": {\n                \"error\": \"Invalid ARN: The access point name may only contain a-z, A-Z, 0-9 and `-`. Found: `*`\"\n              },\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"UseArnRegion\": true,\n                \"Bucket\": \"arn:aws:s3-object-lambda:us-west-2:123456789012:accesspoint:*\"\n              }\n            },\n            {\n              \"documentation\": \"object lambda with invalid arn - access point name contains invalid character: .\",\n              \"expect\": {\n                \"error\": \"Invalid ARN: The access point name may only contain a-z, A-Z, 0-9 and `-`. Found: `my.bucket`\"\n              },\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"UseArnRegion\": true,\n                \"Bucket\": \"arn:aws:s3-object-lambda:us-west-2:123456789012:accesspoint:my.bucket\"\n              }\n            },\n            {\n              \"documentation\": \"object lambda with invalid arn - access point name contains sub resources\",\n              \"expect\": {\n                \"error\": \"Invalid ARN: The ARN may only contain a single resource component after `accesspoint`.\"\n              },\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"UseArnRegion\": true,\n                \"Bucket\": \"arn:aws:s3-object-lambda:us-west-2:123456789012:accesspoint:mybucket:object:foo\"\n              }\n            },\n            {\n              \"documentation\": \"object lambda with custom endpoint\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3-object-lambda\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://mybanner-123456789012.my-endpoint.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-west-2\",\n                    \"SDK::Endpoint\": \"https://my-endpoint.com\",\n                    \"AWS::S3::UseArnRegion\": false\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"arn:aws:s3-object-lambda:us-west-2:123456789012:accesspoint/mybanner\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"UseArnRegion\": false,\n                \"Bucket\": \"arn:aws:s3-object-lambda:us-west-2:123456789012:accesspoint/mybanner\",\n                \"Endpoint\": \"https://my-endpoint.com\"\n              }\n            },\n            {\n              \"documentation\": \"object lambda arn with region mismatch and UseArnRegion=false\",\n              \"expect\": {\n                \"error\": \"Invalid configuration: region from ARN `us-east-1` does not match client region `us-west-2` and UseArnRegion is `false`\"\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-west-2\",\n                    \"AWS::S3::UseArnRegion\": false\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"arn:aws:s3-object-lambda:us-east-1:123456789012:accesspoint/mybanner\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Accelerate\": false,\n                \"Bucket\": \"arn:aws:s3-object-lambda:us-east-1:123456789012:accesspoint/mybanner\",\n                \"ForcePathStyle\": false,\n                \"UseArnRegion\": false,\n                \"Region\": \"us-west-2\",\n                \"UseDualStack\": false,\n                \"UseFIPS\": false\n              }\n            },\n            {\n              \"documentation\": \"WriteGetObjectResponse @ us-west-2\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3-object-lambda\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://s3-object-lambda.us-west-2.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-west-2\"\n                  },\n                  \"operationName\": \"WriteGetObjectResponse\",\n                  \"operationParams\": {\n                    \"RequestRoute\": \"RequestRoute\",\n                    \"RequestToken\": \"RequestToken\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Accelerate\": false,\n                \"UseObjectLambdaEndpoint\": true,\n                \"Region\": \"us-west-2\",\n                \"UseDualStack\": false,\n                \"UseFIPS\": false\n              }\n            },\n            {\n              \"documentation\": \"WriteGetObjectResponse with custom endpoint\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3-object-lambda\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://my-endpoint.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-west-2\",\n                    \"SDK::Endpoint\": \"https://my-endpoint.com\"\n                  },\n                  \"operationName\": \"WriteGetObjectResponse\",\n                  \"operationParams\": {\n                    \"RequestRoute\": \"RequestRoute\",\n                    \"RequestToken\": \"RequestToken\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Accelerate\": false,\n                \"UseObjectLambdaEndpoint\": true,\n                \"Endpoint\": \"https://my-endpoint.com\",\n                \"Region\": \"us-west-2\",\n                \"UseDualStack\": false,\n                \"UseFIPS\": false\n              }\n            },\n            {\n              \"documentation\": \"WriteGetObjectResponse @ us-east-1\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3-object-lambda\",\n                        \"signingRegion\": \"us-east-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://s3-object-lambda.us-east-1.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-east-1\"\n                  },\n                  \"operationName\": \"WriteGetObjectResponse\",\n                  \"operationParams\": {\n                    \"RequestRoute\": \"RequestRoute\",\n                    \"RequestToken\": \"RequestToken\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Accelerate\": false,\n                \"UseObjectLambdaEndpoint\": true,\n                \"Region\": \"us-east-1\",\n                \"UseDualStack\": false,\n                \"UseFIPS\": false\n              }\n            },\n            {\n              \"documentation\": \"WriteGetObjectResponse with fips\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3-object-lambda\",\n                        \"signingRegion\": \"us-east-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://s3-object-lambda-fips.us-east-1.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-east-1\",\n                    \"AWS::UseFIPS\": true\n                  },\n                  \"operationName\": \"WriteGetObjectResponse\",\n                  \"operationParams\": {\n                    \"RequestRoute\": \"RequestRoute\",\n                    \"RequestToken\": \"RequestToken\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Accelerate\": false,\n                \"UseObjectLambdaEndpoint\": true,\n                \"Region\": \"us-east-1\",\n                \"UseDualStack\": false,\n                \"UseFIPS\": true\n              }\n            },\n            {\n              \"documentation\": \"WriteGetObjectResponse with dualstack\",\n              \"expect\": {\n                \"error\": \"S3 Object Lambda does not support Dual-stack\"\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-east-1\",\n                    \"AWS::UseDualStack\": true\n                  },\n                  \"operationName\": \"WriteGetObjectResponse\",\n                  \"operationParams\": {\n                    \"RequestRoute\": \"RequestRoute\",\n                    \"RequestToken\": \"RequestToken\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Accelerate\": false,\n                \"UseObjectLambdaEndpoint\": true,\n                \"Region\": \"us-east-1\",\n                \"UseDualStack\": true,\n                \"UseFIPS\": false\n              }\n            },\n            {\n              \"documentation\": \"WriteGetObjectResponse with accelerate\",\n              \"expect\": {\n                \"error\": \"S3 Object Lambda does not support S3 Accelerate\"\n              },\n              \"params\": {\n                \"Accelerate\": true,\n                \"UseObjectLambdaEndpoint\": true,\n                \"Region\": \"us-east-1\",\n                \"UseDualStack\": false,\n                \"UseFIPS\": false\n              }\n            },\n            {\n              \"documentation\": \"WriteGetObjectResponse with fips in CN\",\n              \"expect\": {\n                \"error\": \"Partition does not support FIPS\"\n              },\n              \"params\": {\n                \"Accelerate\": false,\n                \"Region\": \"cn-north-1\",\n                \"UseObjectLambdaEndpoint\": true,\n                \"UseDualStack\": false,\n                \"UseFIPS\": true\n              }\n            },\n            {\n              \"documentation\": \"WriteGetObjectResponse with invalid partition\",\n              \"expect\": {\n                \"error\": \"Invalid region: region was not a valid DNS name.\"\n              },\n              \"params\": {\n                \"Accelerate\": false,\n                \"UseObjectLambdaEndpoint\": true,\n                \"Region\": \"not a valid DNS name\",\n                \"UseDualStack\": false,\n                \"UseFIPS\": false\n              }\n            },\n            {\n              \"documentation\": \"WriteGetObjectResponse with an unknown partition\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3-object-lambda\",\n                        \"disableDoubleEncoding\": true,\n                        \"signingRegion\": \"us-east.special\"\n                      }\n                    ]\n                  },\n                  \"url\": \"https://s3-object-lambda.us-east.special.amazonaws.com\"\n                }\n              },\n              \"params\": {\n                \"Accelerate\": false,\n                \"UseObjectLambdaEndpoint\": true,\n                \"Region\": \"us-east.special\",\n                \"UseDualStack\": false,\n                \"UseFIPS\": false\n              }\n            },\n            {\n              \"documentation\": \"S3 Outposts bucketAlias Real Outpost Prod us-west-1\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4a\",\n                        \"signingName\": \"s3-outposts\",\n                        \"signingRegionSet\": [\"*\"],\n                        \"disableDoubleEncoding\": true\n                      },\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3-outposts\",\n                        \"signingRegion\": \"us-west-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://test-accessp-o0b1d075431d83bebde8xz5w8ijx1qzlbp3i3kuse10--op-s3.op-0b1d075431d83bebd.s3-outposts.us-west-1.amazonaws.com\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-west-1\",\n                \"Bucket\": \"test-accessp-o0b1d075431d83bebde8xz5w8ijx1qzlbp3i3kuse10--op-s3\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false\n              }\n            },\n            {\n              \"documentation\": \"S3 Outposts bucketAlias Real Outpost Prod ap-east-1\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4a\",\n                        \"signingName\": \"s3-outposts\",\n                        \"signingRegionSet\": [\"*\"],\n                        \"disableDoubleEncoding\": true\n                      },\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3-outposts\",\n                        \"signingRegion\": \"ap-east-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://test-accessp-o0b1d075431d83bebde8xz5w8ijx1qzlbp3i3kuse10--op-s3.op-0b1d075431d83bebd.s3-outposts.ap-east-1.amazonaws.com\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"ap-east-1\",\n                \"Bucket\": \"test-accessp-o0b1d075431d83bebde8xz5w8ijx1qzlbp3i3kuse10--op-s3\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false\n              }\n            },\n            {\n              \"documentation\": \"S3 Outposts bucketAlias Ec2 Outpost Prod us-east-1\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4a\",\n                        \"signingName\": \"s3-outposts\",\n                        \"signingRegionSet\": [\"*\"],\n                        \"disableDoubleEncoding\": true\n                      },\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3-outposts\",\n                        \"signingRegion\": \"us-east-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://test-accessp-e0000075431d83bebde8xz5w8ijx1qzlbp3i3kuse10--op-s3.ec2.s3-outposts.us-east-1.amazonaws.com\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-east-1\",\n                \"Bucket\": \"test-accessp-e0000075431d83bebde8xz5w8ijx1qzlbp3i3kuse10--op-s3\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false\n              }\n            },\n            {\n              \"documentation\": \"S3 Outposts bucketAlias Ec2 Outpost Prod me-south-1\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4a\",\n                        \"signingName\": \"s3-outposts\",\n                        \"signingRegionSet\": [\"*\"],\n                        \"disableDoubleEncoding\": true\n                      },\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3-outposts\",\n                        \"signingRegion\": \"me-south-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://test-accessp-e0000075431d83bebde8xz5w8ijx1qzlbp3i3kuse10--op-s3.ec2.s3-outposts.me-south-1.amazonaws.com\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"me-south-1\",\n                \"Bucket\": \"test-accessp-e0000075431d83bebde8xz5w8ijx1qzlbp3i3kuse10--op-s3\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false\n              }\n            },\n            {\n              \"documentation\": \"S3 Outposts bucketAlias Real Outpost Beta\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4a\",\n                        \"signingName\": \"s3-outposts\",\n                        \"signingRegionSet\": [\"*\"],\n                        \"disableDoubleEncoding\": true\n                      },\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3-outposts\",\n                        \"signingRegion\": \"us-east-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://test-accessp-o0b1d075431d83bebde8xz5w8ijx1qzlbp3i3kbeta0--op-s3.op-0b1d075431d83bebd.example.amazonaws.com\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-east-1\",\n                \"Bucket\": \"test-accessp-o0b1d075431d83bebde8xz5w8ijx1qzlbp3i3kbeta0--op-s3\",\n                \"Endpoint\": \"https://example.amazonaws.com\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false\n              }\n            },\n            {\n              \"documentation\": \"S3 Outposts bucketAlias Ec2 Outpost Beta\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4a\",\n                        \"signingName\": \"s3-outposts\",\n                        \"signingRegionSet\": [\"*\"],\n                        \"disableDoubleEncoding\": true\n                      },\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3-outposts\",\n                        \"signingRegion\": \"us-east-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://161743052723-e00000136899934034jeahy1t8gpzpbwjj8kb7beta0--op-s3.ec2.example.amazonaws.com\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-east-1\",\n                \"Bucket\": \"161743052723-e00000136899934034jeahy1t8gpzpbwjj8kb7beta0--op-s3\",\n                \"Endpoint\": \"https://example.amazonaws.com\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false\n              }\n            },\n            {\n              \"documentation\": \"S3 Outposts bucketAlias - No endpoint set for beta\",\n              \"expect\": {\n                \"error\": \"Expected a endpoint to be specified but no endpoint was found\"\n              },\n              \"params\": {\n                \"Region\": \"us-east-1\",\n                \"Bucket\": \"test-accessp-o0b1d075431d83bebde8xz5w8ijx1qzlbp3i3kbeta0--op-s3\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false\n              }\n            },\n            {\n              \"documentation\": \"S3 Outposts bucketAlias Invalid hardware type\",\n              \"expect\": {\n                \"error\": \"Unrecognized hardware type: \\\"Expected hardware type o or e but got h\\\"\"\n              },\n              \"params\": {\n                \"Region\": \"us-east-1\",\n                \"Bucket\": \"test-accessp-h0000075431d83bebde8xz5w8ijx1qzlbp3i3kuse10--op-s3\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false\n              }\n            },\n            {\n              \"documentation\": \"S3 Outposts bucketAlias Special character in Outpost Arn\",\n              \"expect\": {\n                \"error\": \"Invalid ARN: The outpost Id must only contain a-z, A-Z, 0-9 and `-`.\"\n              },\n              \"params\": {\n                \"Region\": \"us-east-1\",\n                \"Bucket\": \"test-accessp-o00000754%1d83bebde8xz5w8ijx1qzlbp3i3kuse10--op-s3\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false\n              }\n            },\n            {\n              \"documentation\": \"S3 Outposts bucketAlias - No endpoint set for beta\",\n              \"expect\": {\n                \"error\": \"Expected a endpoint to be specified but no endpoint was found\"\n              },\n              \"params\": {\n                \"Region\": \"us-east-1\",\n                \"Bucket\": \"test-accessp-e0b1d075431d83bebde8xz5w8ijx1qzlbp3i3ebeta0--op-s3\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false\n              }\n            },\n            {\n              \"documentation\": \"S3 Snow with bucket\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"snow\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"http://10.0.1.12:433/bucketName\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"snow\",\n                \"Bucket\": \"bucketName\",\n                \"Endpoint\": \"http://10.0.1.12:433\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false\n              }\n            },\n            {\n              \"documentation\": \"S3 Snow without bucket\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"snow\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://10.0.1.12:433\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"snow\",\n                \"Endpoint\": \"https://10.0.1.12:433\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false\n              }\n            },\n            {\n              \"documentation\": \"S3 Snow no port\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"snow\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"http://10.0.1.12/bucketName\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"snow\",\n                \"Bucket\": \"bucketName\",\n                \"Endpoint\": \"http://10.0.1.12\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false\n              }\n            },\n            {\n              \"documentation\": \"S3 Snow dns endpoint\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3\",\n                        \"signingRegion\": \"snow\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ]\n                  },\n                  \"url\": \"https://amazonaws.com/bucketName\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"snow\",\n                \"Bucket\": \"bucketName\",\n                \"Endpoint\": \"https://amazonaws.com\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false\n              }\n            },\n            {\n              \"documentation\": \"Data Plane with short zone name\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4-s3express\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-east-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://mybucket--abcd-ab1--x-s3.s3express-abcd-ab1.us-east-1.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-east-1\"\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"mybucket--abcd-ab1--x-s3\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"us-east-1\",\n                \"Bucket\": \"mybucket--abcd-ab1--x-s3\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"UseS3ExpressControlEndpoint\": false\n              }\n            },\n            {\n              \"documentation\": \"Data Plane with short zone name china region\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4-s3express\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"cn-north-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://mybucket--abcd-ab1--x-s3.s3express-abcd-ab1.cn-north-1.amazonaws.com.cn\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"cn-north-1\"\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"mybucket--abcd-ab1--x-s3\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"cn-north-1\",\n                \"Bucket\": \"mybucket--abcd-ab1--x-s3\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"UseS3ExpressControlEndpoint\": false\n              }\n            },\n            {\n              \"documentation\": \"Data Plane with short zone name with AP\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4-s3express\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-east-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://myaccesspoint--abcd-ab1--xa-s3.s3express-abcd-ab1.us-east-1.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-east-1\"\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"myaccesspoint--abcd-ab1--xa-s3\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"us-east-1\",\n                \"Bucket\": \"myaccesspoint--abcd-ab1--xa-s3\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"UseS3ExpressControlEndpoint\": false\n              }\n            },\n            {\n              \"documentation\": \"Data Plane with short zone name with AP china region\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4-s3express\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"cn-north-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://myaccesspoint--abcd-ab1--xa-s3.s3express-abcd-ab1.cn-north-1.amazonaws.com.cn\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"cn-north-1\"\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"myaccesspoint--abcd-ab1--xa-s3\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"cn-north-1\",\n                \"Bucket\": \"myaccesspoint--abcd-ab1--xa-s3\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"UseS3ExpressControlEndpoint\": false\n              }\n            },\n            {\n              \"documentation\": \"Data Plane with short zone names (13 chars)\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4-s3express\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://mybucket--test-zone-ab1--x-s3.s3express-test-zone-ab1.us-west-2.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-west-2\"\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"mybucket--test-zone-ab1--x-s3\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"mybucket--test-zone-ab1--x-s3\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"UseS3ExpressControlEndpoint\": false\n              }\n            },\n            {\n              \"documentation\": \"Data Plane with short zone names (13 chars) with AP\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4-s3express\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://myaccesspoint--test-zone-ab1--xa-s3.s3express-test-zone-ab1.us-west-2.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-west-2\"\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"myaccesspoint--test-zone-ab1--xa-s3\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"myaccesspoint--test-zone-ab1--xa-s3\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"UseS3ExpressControlEndpoint\": false\n              }\n            },\n            {\n              \"documentation\": \"Data Plane with medium zone names (14 chars)\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4-s3express\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://mybucket--test1-zone-ab1--x-s3.s3express-test1-zone-ab1.us-west-2.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-west-2\"\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"mybucket--test1-zone-ab1--x-s3\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"mybucket--test1-zone-ab1--x-s3\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"UseS3ExpressControlEndpoint\": false\n              }\n            },\n            {\n              \"documentation\": \"Data Plane with medium zone names (14 chars) with AP\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4-s3express\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://myaccesspoint--test1-zone-ab1--xa-s3.s3express-test1-zone-ab1.us-west-2.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-west-2\"\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"myaccesspoint--test1-zone-ab1--xa-s3\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"myaccesspoint--test1-zone-ab1--xa-s3\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"UseS3ExpressControlEndpoint\": false\n              }\n            },\n            {\n              \"documentation\": \"Data Plane with long zone names (20 chars)\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4-s3express\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://mybucket--test1-long1-zone-ab1--x-s3.s3express-test1-long1-zone-ab1.us-west-2.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-west-2\"\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"mybucket--test1-long1-zone-ab1--x-s3\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"mybucket--test1-long1-zone-ab1--x-s3\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"UseS3ExpressControlEndpoint\": false\n              }\n            },\n            {\n              \"documentation\": \"Data Plane with long zone names (20 chars)\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4-s3express\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://myaccesspoint--test1-long1-zone-ab1--xa-s3.s3express-test1-long1-zone-ab1.us-west-2.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-west-2\"\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"myaccesspoint--test1-long1-zone-ab1--xa-s3\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"myaccesspoint--test1-long1-zone-ab1--xa-s3\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"UseS3ExpressControlEndpoint\": false\n              }\n            },\n            {\n              \"documentation\": \"Data Plane with short zone fips\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4-s3express\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-east-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://mybucket--test-ab1--x-s3.s3express-fips-test-ab1.us-east-1.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-east-1\",\n                    \"AWS::UseFIPS\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"mybucket--test-ab1--x-s3\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"us-east-1\",\n                \"Bucket\": \"mybucket--test-ab1--x-s3\",\n                \"UseFIPS\": true,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"UseS3ExpressControlEndpoint\": false\n              }\n            },\n            {\n              \"documentation\": \"Data Plane with short zone fips china region\",\n              \"expect\": {\n                \"error\": \"Partition does not support FIPS\"\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"cn-north-1\",\n                    \"AWS::UseFIPS\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"mybucket--test-ab1--x-s3\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"cn-north-1\",\n                \"Bucket\": \"mybucket--test-ab1--x-s3\",\n                \"UseFIPS\": true,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"UseS3ExpressControlEndpoint\": false\n              }\n            },\n            {\n              \"documentation\": \"Data Plane with short zone fips with AP\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4-s3express\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-east-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://myaccesspoint--test-ab1--xa-s3.s3express-fips-test-ab1.us-east-1.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-east-1\",\n                    \"AWS::UseFIPS\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"myaccesspoint--test-ab1--xa-s3\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"us-east-1\",\n                \"Bucket\": \"myaccesspoint--test-ab1--xa-s3\",\n                \"UseFIPS\": true,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"UseS3ExpressControlEndpoint\": false\n              }\n            },\n            {\n              \"documentation\": \"Data Plane with short zone fips with AP china region\",\n              \"expect\": {\n                \"error\": \"Partition does not support FIPS\"\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"cn-north-1\",\n                    \"AWS::UseFIPS\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"myaccesspoint--test-ab1--xa-s3\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"cn-north-1\",\n                \"Bucket\": \"myaccesspoint--test-ab1--xa-s3\",\n                \"UseFIPS\": true,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"UseS3ExpressControlEndpoint\": false\n              }\n            },\n            {\n              \"documentation\": \"Data Plane with short zone (13 chars) fips\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4-s3express\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://mybucket--test-zone-ab1--x-s3.s3express-fips-test-zone-ab1.us-west-2.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-west-2\",\n                    \"AWS::UseFIPS\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"mybucket--test-zone-ab1--x-s3\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"mybucket--test-zone-ab1--x-s3\",\n                \"UseFIPS\": true,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"UseS3ExpressControlEndpoint\": false\n              }\n            },\n            {\n              \"documentation\": \"Data Plane with short zone (13 chars) fips with AP\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4-s3express\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://myaccesspoint--test-zone-ab1--xa-s3.s3express-fips-test-zone-ab1.us-west-2.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-west-2\",\n                    \"AWS::UseFIPS\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"myaccesspoint--test-zone-ab1--xa-s3\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"myaccesspoint--test-zone-ab1--xa-s3\",\n                \"UseFIPS\": true,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"UseS3ExpressControlEndpoint\": false\n              }\n            },\n            {\n              \"documentation\": \"Data Plane with medium zone (14 chars) fips\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4-s3express\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://mybucket--test1-zone-ab1--x-s3.s3express-fips-test1-zone-ab1.us-west-2.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-west-2\",\n                    \"AWS::UseFIPS\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"mybucket--test1-zone-ab1--x-s3\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"mybucket--test1-zone-ab1--x-s3\",\n                \"UseFIPS\": true,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"UseS3ExpressControlEndpoint\": false\n              }\n            },\n            {\n              \"documentation\": \"Data Plane with medium zone (14 chars) fips with AP\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4-s3express\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://myaccesspoint--test1-zone-ab1--xa-s3.s3express-fips-test1-zone-ab1.us-west-2.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-west-2\",\n                    \"AWS::UseFIPS\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"myaccesspoint--test1-zone-ab1--xa-s3\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"myaccesspoint--test1-zone-ab1--xa-s3\",\n                \"UseFIPS\": true,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"UseS3ExpressControlEndpoint\": false\n              }\n            },\n            {\n              \"documentation\": \"Data Plane with long zone (20 chars) fips\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4-s3express\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://mybucket--test1-long1-zone-ab1--x-s3.s3express-fips-test1-long1-zone-ab1.us-west-2.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-west-2\",\n                    \"AWS::UseFIPS\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"mybucket--test1-long1-zone-ab1--x-s3\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"mybucket--test1-long1-zone-ab1--x-s3\",\n                \"UseFIPS\": true,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"UseS3ExpressControlEndpoint\": false\n              }\n            },\n            {\n              \"documentation\": \"Data Plane with long zone (20 chars) fips with AP\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4-s3express\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://myaccesspoint--test1-long1-zone-ab1--xa-s3.s3express-fips-test1-long1-zone-ab1.us-west-2.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-west-2\",\n                    \"AWS::UseFIPS\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"myaccesspoint--test1-long1-zone-ab1--xa-s3\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"myaccesspoint--test1-long1-zone-ab1--xa-s3\",\n                \"UseFIPS\": true,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"UseS3ExpressControlEndpoint\": false\n              }\n            },\n            {\n              \"documentation\": \"Data Plane with long AZ\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4-s3express\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://mybucket--test1-az1--x-s3.s3express-test1-az1.us-west-2.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-west-2\"\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"mybucket--test1-az1--x-s3\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"mybucket--test1-az1--x-s3\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"UseS3ExpressControlEndpoint\": false\n              }\n            },\n            {\n              \"documentation\": \"Data Plane with long AZ with AP\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4-s3express\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://myaccesspoint--test1-az1--xa-s3.s3express-test1-az1.us-west-2.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-west-2\"\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"myaccesspoint--test1-az1--xa-s3\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"myaccesspoint--test1-az1--xa-s3\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"UseS3ExpressControlEndpoint\": false\n              }\n            },\n            {\n              \"documentation\": \"Data Plane with long AZ fips\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4-s3express\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://mybucket--test1-az1--x-s3.s3express-fips-test1-az1.us-west-2.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-west-2\",\n                    \"AWS::UseFIPS\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"mybucket--test1-az1--x-s3\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"mybucket--test1-az1--x-s3\",\n                \"UseFIPS\": true,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"UseS3ExpressControlEndpoint\": false\n              }\n            },\n            {\n              \"documentation\": \"Data Plane with long AZ fips with AP\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4-s3express\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://myaccesspoint--test1-az1--xa-s3.s3express-fips-test1-az1.us-west-2.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-west-2\",\n                    \"AWS::UseFIPS\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"myaccesspoint--test1-az1--xa-s3\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"myaccesspoint--test1-az1--xa-s3\",\n                \"UseFIPS\": true,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"UseS3ExpressControlEndpoint\": false\n              }\n            },\n            {\n              \"documentation\": \"Control plane with short AZ bucket\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-east-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://s3express-control.us-east-1.amazonaws.com/mybucket--test-ab1--x-s3\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-east-1\"\n                  },\n                  \"operationName\": \"CreateBucket\",\n                  \"operationParams\": {\n                    \"Bucket\": \"mybucket--test-ab1--x-s3\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"us-east-1\",\n                \"Bucket\": \"mybucket--test-ab1--x-s3\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"UseS3ExpressControlEndpoint\": true,\n                \"DisableS3ExpressSessionAuth\": false\n              }\n            },\n            {\n              \"documentation\": \"Control plane with short AZ bucket china region\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"cn-north-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://s3express-control.cn-north-1.amazonaws.com.cn/mybucket--test-ab1--x-s3\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"cn-north-1\"\n                  },\n                  \"operationName\": \"CreateBucket\",\n                  \"operationParams\": {\n                    \"Bucket\": \"mybucket--test-ab1--x-s3\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"cn-north-1\",\n                \"Bucket\": \"mybucket--test-ab1--x-s3\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"UseS3ExpressControlEndpoint\": true,\n                \"DisableS3ExpressSessionAuth\": false\n              }\n            },\n            {\n              \"documentation\": \"Control plane with short AZ bucket and fips\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-east-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://s3express-control-fips.us-east-1.amazonaws.com/mybucket--test-ab1--x-s3\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-east-1\",\n                    \"AWS::UseFIPS\": true\n                  },\n                  \"operationName\": \"CreateBucket\",\n                  \"operationParams\": {\n                    \"Bucket\": \"mybucket--test-ab1--x-s3\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"us-east-1\",\n                \"Bucket\": \"mybucket--test-ab1--x-s3\",\n                \"UseFIPS\": true,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"UseS3ExpressControlEndpoint\": true,\n                \"DisableS3ExpressSessionAuth\": false\n              }\n            },\n            {\n              \"documentation\": \"Control plane with short AZ bucket and fips china region\",\n              \"expect\": {\n                \"error\": \"Partition does not support FIPS\"\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"cn-north-1\",\n                    \"AWS::UseFIPS\": true\n                  },\n                  \"operationName\": \"CreateBucket\",\n                  \"operationParams\": {\n                    \"Bucket\": \"mybucket--test-ab1--x-s3\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"cn-north-1\",\n                \"Bucket\": \"mybucket--test-ab1--x-s3\",\n                \"UseFIPS\": true,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"UseS3ExpressControlEndpoint\": true,\n                \"DisableS3ExpressSessionAuth\": false\n              }\n            },\n            {\n              \"documentation\": \"Control plane without bucket\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-east-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://s3express-control.us-east-1.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-east-1\"\n                  },\n                  \"operationName\": \"ListDirectoryBuckets\"\n                }\n              ],\n              \"params\": {\n                \"Region\": \"us-east-1\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"UseS3ExpressControlEndpoint\": true,\n                \"DisableS3ExpressSessionAuth\": false\n              }\n            },\n            {\n              \"documentation\": \"Control plane without bucket and fips\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-east-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://s3express-control-fips.us-east-1.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-east-1\",\n                    \"AWS::UseFIPS\": true\n                  },\n                  \"operationName\": \"ListDirectoryBuckets\"\n                }\n              ],\n              \"params\": {\n                \"Region\": \"us-east-1\",\n                \"UseFIPS\": true,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"UseS3ExpressControlEndpoint\": true,\n                \"DisableS3ExpressSessionAuth\": false\n              }\n            },\n            {\n              \"documentation\": \"Data Plane sigv4 auth with short AZ\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://mybucket--usw2-az1--x-s3.s3express-usw2-az1.us-west-2.amazonaws.com\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"mybucket--usw2-az1--x-s3\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"DisableS3ExpressSessionAuth\": true\n              }\n            },\n            {\n              \"documentation\": \"Data Plane sigv4 auth with short AZ with AP\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://myaccesspoint--usw2-az1--xa-s3.s3express-usw2-az1.us-west-2.amazonaws.com\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"myaccesspoint--usw2-az1--xa-s3\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"DisableS3ExpressSessionAuth\": true\n              }\n            },\n            {\n              \"documentation\": \"Data Plane sigv4 auth with short zone (13 chars)\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://mybucket--test-zone-ab1--x-s3.s3express-test-zone-ab1.us-west-2.amazonaws.com\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"mybucket--test-zone-ab1--x-s3\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"DisableS3ExpressSessionAuth\": true\n              }\n            },\n            {\n              \"documentation\": \"Data Plane sigv4 auth with short zone (13 chars) with AP\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://myaccesspoint--test-zone-ab1--xa-s3.s3express-test-zone-ab1.us-west-2.amazonaws.com\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"myaccesspoint--test-zone-ab1--xa-s3\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"DisableS3ExpressSessionAuth\": true\n              }\n            },\n            {\n              \"documentation\": \"Data Plane sigv4 auth with short AZ fips\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://mybucket--usw2-az1--x-s3.s3express-fips-usw2-az1.us-west-2.amazonaws.com\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"mybucket--usw2-az1--x-s3\",\n                \"UseFIPS\": true,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"DisableS3ExpressSessionAuth\": true\n              }\n            },\n            {\n              \"documentation\": \"Data Plane sigv4 auth with short AZ fips with AP\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://myaccesspoint--usw2-az1--xa-s3.s3express-fips-usw2-az1.us-west-2.amazonaws.com\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"myaccesspoint--usw2-az1--xa-s3\",\n                \"UseFIPS\": true,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"DisableS3ExpressSessionAuth\": true\n              }\n            },\n            {\n              \"documentation\": \"Data Plane sigv4 auth with short zone (13 chars) fips\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://mybucket--test-zone-ab1--x-s3.s3express-fips-test-zone-ab1.us-west-2.amazonaws.com\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"mybucket--test-zone-ab1--x-s3\",\n                \"UseFIPS\": true,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"DisableS3ExpressSessionAuth\": true\n              }\n            },\n            {\n              \"documentation\": \"Data Plane sigv4 auth with short zone (13 chars) fips with AP\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://myaccesspoint--test-zone-ab1--xa-s3.s3express-fips-test-zone-ab1.us-west-2.amazonaws.com\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"myaccesspoint--test-zone-ab1--xa-s3\",\n                \"UseFIPS\": true,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"DisableS3ExpressSessionAuth\": true\n              }\n            },\n            {\n              \"documentation\": \"Data Plane sigv4 auth with long AZ\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://mybucket--test1-az1--x-s3.s3express-test1-az1.us-west-2.amazonaws.com\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"mybucket--test1-az1--x-s3\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"UseS3ExpressControlEndpoint\": false,\n                \"DisableS3ExpressSessionAuth\": true\n              }\n            },\n            {\n              \"documentation\": \"Data Plane sigv4 auth with long AZ with AP\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://myaccesspoint--test1-az1--xa-s3.s3express-test1-az1.us-west-2.amazonaws.com\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"myaccesspoint--test1-az1--xa-s3\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"UseS3ExpressControlEndpoint\": false,\n                \"DisableS3ExpressSessionAuth\": true\n              }\n            },\n            {\n              \"documentation\": \"Data Plane sigv4 auth with medium zone(14 chars)\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://mybucket--test1-zone-ab1--x-s3.s3express-test1-zone-ab1.us-west-2.amazonaws.com\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"mybucket--test1-zone-ab1--x-s3\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"UseS3ExpressControlEndpoint\": false,\n                \"DisableS3ExpressSessionAuth\": true\n              }\n            },\n            {\n              \"documentation\": \"Data Plane sigv4 auth with medium zone(14 chars) with AP\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://myaccesspoint--test1-zone-ab1--xa-s3.s3express-test1-zone-ab1.us-west-2.amazonaws.com\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"myaccesspoint--test1-zone-ab1--xa-s3\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"UseS3ExpressControlEndpoint\": false,\n                \"DisableS3ExpressSessionAuth\": true\n              }\n            },\n            {\n              \"documentation\": \"Data Plane sigv4 auth with long zone(20 chars)\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://mybucket--test1-long1-zone-ab1--x-s3.s3express-test1-long1-zone-ab1.us-west-2.amazonaws.com\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"mybucket--test1-long1-zone-ab1--x-s3\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"UseS3ExpressControlEndpoint\": false,\n                \"DisableS3ExpressSessionAuth\": true\n              }\n            },\n            {\n              \"documentation\": \"Data Plane sigv4 auth with long zone(20 chars) with AP\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://myaccesspoint--test1-long1-zone-ab1--xa-s3.s3express-test1-long1-zone-ab1.us-west-2.amazonaws.com\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"myaccesspoint--test1-long1-zone-ab1--xa-s3\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"UseS3ExpressControlEndpoint\": false,\n                \"DisableS3ExpressSessionAuth\": true\n              }\n            },\n            {\n              \"documentation\": \"Data Plane sigv4 auth with long AZ fips\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://mybucket--test1-az1--x-s3.s3express-fips-test1-az1.us-west-2.amazonaws.com\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"mybucket--test1-az1--x-s3\",\n                \"UseFIPS\": true,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"UseS3ExpressControlEndpoint\": false,\n                \"DisableS3ExpressSessionAuth\": true\n              }\n            },\n            {\n              \"documentation\": \"Data Plane sigv4 auth with long AZ fips with AP\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://myaccesspoint--test1-az1--xa-s3.s3express-fips-test1-az1.us-west-2.amazonaws.com\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"myaccesspoint--test1-az1--xa-s3\",\n                \"UseFIPS\": true,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"UseS3ExpressControlEndpoint\": false,\n                \"DisableS3ExpressSessionAuth\": true\n              }\n            },\n            {\n              \"documentation\": \"Data Plane sigv4 auth with medium zone (14 chars) fips\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://mybucket--test1-zone-ab1--x-s3.s3express-fips-test1-zone-ab1.us-west-2.amazonaws.com\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"mybucket--test1-zone-ab1--x-s3\",\n                \"UseFIPS\": true,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"UseS3ExpressControlEndpoint\": false,\n                \"DisableS3ExpressSessionAuth\": true\n              }\n            },\n            {\n              \"documentation\": \"Data Plane sigv4 auth with medium zone (14 chars) fips with AP\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://myaccesspoint--test1-zone-ab1--xa-s3.s3express-fips-test1-zone-ab1.us-west-2.amazonaws.com\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"myaccesspoint--test1-zone-ab1--xa-s3\",\n                \"UseFIPS\": true,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"UseS3ExpressControlEndpoint\": false,\n                \"DisableS3ExpressSessionAuth\": true\n              }\n            },\n            {\n              \"documentation\": \"Data Plane sigv4 auth with long zone (20 chars) fips\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://mybucket--test1-long1-zone-ab1--x-s3.s3express-fips-test1-long1-zone-ab1.us-west-2.amazonaws.com\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"mybucket--test1-long1-zone-ab1--x-s3\",\n                \"UseFIPS\": true,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"UseS3ExpressControlEndpoint\": false,\n                \"DisableS3ExpressSessionAuth\": true\n              }\n            },\n            {\n              \"documentation\": \"Data Plane sigv4 auth with long zone (20 chars) fips with AP\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://myaccesspoint--test1-long1-zone-ab1--xa-s3.s3express-fips-test1-long1-zone-ab1.us-west-2.amazonaws.com\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"myaccesspoint--test1-long1-zone-ab1--xa-s3\",\n                \"UseFIPS\": true,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"UseS3ExpressControlEndpoint\": false,\n                \"DisableS3ExpressSessionAuth\": true\n              }\n            },\n            {\n              \"documentation\": \"Control Plane host override\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://mybucket--usw2-az1--x-s3.custom.com\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"mybucket--usw2-az1--x-s3\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"UseS3ExpressControlEndpoint\": true,\n                \"DisableS3ExpressSessionAuth\": true,\n                \"Endpoint\": \"https://custom.com\"\n              }\n            },\n            {\n              \"documentation\": \"Control Plane host override with AP\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://myaccesspoint--usw2-az1--xa-s3.custom.com\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"myaccesspoint--usw2-az1--xa-s3\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"UseS3ExpressControlEndpoint\": true,\n                \"DisableS3ExpressSessionAuth\": true,\n                \"Endpoint\": \"https://custom.com\"\n              }\n            },\n            {\n              \"documentation\": \"Control Plane host override no bucket\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://custom.com\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"UseS3ExpressControlEndpoint\": true,\n                \"DisableS3ExpressSessionAuth\": true,\n                \"Endpoint\": \"https://custom.com\"\n              }\n            },\n            {\n              \"documentation\": \"Data plane host override non virtual session auth\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4-s3express\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://10.0.0.1/mybucket--usw2-az1--x-s3\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-west-2\",\n                    \"SDK::Endpoint\": \"https://10.0.0.1\"\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"mybucket--usw2-az1--x-s3\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"mybucket--usw2-az1--x-s3\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"Endpoint\": \"https://10.0.0.1\"\n              }\n            },\n            {\n              \"documentation\": \"Data plane host override non virtual session auth with AP\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4-s3express\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://10.0.0.1/myaccesspoint--usw2-az1--xa-s3\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-west-2\",\n                    \"SDK::Endpoint\": \"https://10.0.0.1\"\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"myaccesspoint--usw2-az1--xa-s3\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"myaccesspoint--usw2-az1--xa-s3\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"Endpoint\": \"https://10.0.0.1\"\n              }\n            },\n            {\n              \"documentation\": \"Control Plane host override ip\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://10.0.0.1/mybucket--usw2-az1--x-s3\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"mybucket--usw2-az1--x-s3\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"UseS3ExpressControlEndpoint\": true,\n                \"DisableS3ExpressSessionAuth\": true,\n                \"Endpoint\": \"https://10.0.0.1\"\n              }\n            },\n            {\n              \"documentation\": \"Control Plane host override ip with AP\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://10.0.0.1/myaccesspoint--usw2-az1--xa-s3\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"myaccesspoint--usw2-az1--xa-s3\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"UseS3ExpressControlEndpoint\": true,\n                \"DisableS3ExpressSessionAuth\": true,\n                \"Endpoint\": \"https://10.0.0.1\"\n              }\n            },\n            {\n              \"documentation\": \"Data plane host override\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4-s3express\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://mybucket--usw2-az1--x-s3.custom.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-west-2\",\n                    \"SDK::Endpoint\": \"https://custom.com\"\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"mybucket--usw2-az1--x-s3\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"mybucket--usw2-az1--x-s3\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"Endpoint\": \"https://custom.com\"\n              }\n            },\n            {\n              \"documentation\": \"Data plane host override with AP\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4-s3express\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://myaccesspoint--usw2-az1--xa-s3.custom.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-west-2\",\n                    \"SDK::Endpoint\": \"https://custom.com\"\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"myaccesspoint--usw2-az1--xa-s3\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"myaccesspoint--usw2-az1--xa-s3\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"Endpoint\": \"https://custom.com\"\n              }\n            },\n            {\n              \"documentation\": \"bad format error\",\n              \"expect\": {\n                \"error\": \"Unrecognized S3Express bucket name format.\"\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-east-1\"\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"mybucket--usaz1--x-s3\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"us-east-1\",\n                \"Bucket\": \"mybucket--usaz1--x-s3\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"UseS3ExpressControlEndpoint\": false\n              }\n            },\n            {\n              \"documentation\": \"bad AP format error\",\n              \"expect\": {\n                \"error\": \"Unrecognized S3Express bucket name format.\"\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-east-1\"\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"myaccesspoint--usaz1--xa-s3\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"us-east-1\",\n                \"Bucket\": \"myaccesspoint--usaz1--xa-s3\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"UseS3ExpressControlEndpoint\": false\n              }\n            },\n            {\n              \"documentation\": \"bad format error no session auth\",\n              \"expect\": {\n                \"error\": \"Unrecognized S3Express bucket name format.\"\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-east-1\"\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"mybucket--usaz1--x-s3\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"us-east-1\",\n                \"Bucket\": \"mybucket--usaz1--x-s3\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"UseS3ExpressControlEndpoint\": false,\n                \"DisableS3ExpressSessionAuth\": true\n              }\n            },\n            {\n              \"documentation\": \"bad AP format error no session auth\",\n              \"expect\": {\n                \"error\": \"Unrecognized S3Express bucket name format.\"\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-east-1\"\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"myaccesspoint--usaz1--xa-s3\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"us-east-1\",\n                \"Bucket\": \"myaccesspoint--usaz1--xa-s3\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"UseS3ExpressControlEndpoint\": false,\n                \"DisableS3ExpressSessionAuth\": true\n              }\n            },\n            {\n              \"documentation\": \"accelerate error\",\n              \"expect\": {\n                \"error\": \"S3Express does not support S3 Accelerate.\"\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-east-1\",\n                    \"AWS::S3::Accelerate\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"mybucket--test-ab1--x-s3\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"us-east-1\",\n                \"Bucket\": \"mybucket--test-ab1--x-s3\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": true,\n                \"UseS3ExpressControlEndpoint\": false\n              }\n            },\n            {\n              \"documentation\": \"accelerate error with AP\",\n              \"expect\": {\n                \"error\": \"S3Express does not support S3 Accelerate.\"\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-east-1\",\n                    \"AWS::S3::Accelerate\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"myaccesspoint--test-ab1--xa-s3\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"us-east-1\",\n                \"Bucket\": \"myaccesspoint--test-ab1--xa-s3\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": true,\n                \"UseS3ExpressControlEndpoint\": false\n              }\n            },\n            {\n              \"documentation\": \"Data plane bucket format error\",\n              \"expect\": {\n                \"error\": \"S3Express bucket name is not a valid virtual hostable name.\"\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-east-1\"\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"my.bucket--test-ab1--x-s3\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"us-east-1\",\n                \"Bucket\": \"my.bucket--test-ab1--x-s3\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"UseS3ExpressControlEndpoint\": false\n              }\n            },\n            {\n              \"documentation\": \"Data plane AP format error\",\n              \"expect\": {\n                \"error\": \"S3Express bucket name is not a valid virtual hostable name.\"\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-east-1\"\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"my.myaccesspoint--test-ab1--xa-s3\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"us-east-1\",\n                \"Bucket\": \"my.myaccesspoint--test-ab1--xa-s3\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"UseS3ExpressControlEndpoint\": false\n              }\n            },\n            {\n              \"documentation\": \"host override data plane bucket error session auth\",\n              \"expect\": {\n                \"error\": \"S3Express bucket name is not a valid virtual hostable name.\"\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-west-2\",\n                    \"SDK::Endpoint\": \"https://custom.com\"\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"my.bucket--usw2-az1--x-s3\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"my.bucket--usw2-az1--x-s3\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"Endpoint\": \"https://custom.com\"\n              }\n            },\n            {\n              \"documentation\": \"host override data plane AP error session auth\",\n              \"expect\": {\n                \"error\": \"S3Express bucket name is not a valid virtual hostable name.\"\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-west-2\",\n                    \"SDK::Endpoint\": \"https://custom.com\"\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"my.myaccesspoint--usw2-az1--xa-s3\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"my.myaccesspoint--usw2-az1--xa-s3\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"Endpoint\": \"https://custom.com\"\n              }\n            },\n            {\n              \"documentation\": \"host override data plane bucket error\",\n              \"expect\": {\n                \"error\": \"S3Express bucket name is not a valid virtual hostable name.\"\n              },\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"my.bucket--usw2-az1--x-s3\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"Endpoint\": \"https://custom.com\",\n                \"DisableS3ExpressSessionAuth\": true\n              }\n            },\n            {\n              \"documentation\": \"host override data plane AP error\",\n              \"expect\": {\n                \"error\": \"S3Express bucket name is not a valid virtual hostable name.\"\n              },\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"my.myaccesspoint--usw2-az1--xa-s3\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": false,\n                \"Accelerate\": false,\n                \"Endpoint\": \"https://custom.com\",\n                \"DisableS3ExpressSessionAuth\": true\n              }\n            },\n            {\n              \"documentation\": \"Control plane without bucket and dualstack\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-east-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://s3express-control.dualstack.us-east-1.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-east-1\",\n                    \"AWS::UseDualStack\": true\n                  },\n                  \"operationName\": \"ListDirectoryBuckets\"\n                }\n              ],\n              \"params\": {\n                \"Region\": \"us-east-1\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": true,\n                \"Accelerate\": false,\n                \"UseS3ExpressControlEndpoint\": true,\n                \"DisableS3ExpressSessionAuth\": false\n              }\n            },\n            {\n              \"documentation\": \"Control plane without bucket, fips and dualstack\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-east-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://s3express-control-fips.dualstack.us-east-1.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-east-1\",\n                    \"AWS::UseFIPS\": true,\n                    \"AWS::UseDualStack\": true\n                  },\n                  \"operationName\": \"ListDirectoryBuckets\"\n                }\n              ],\n              \"params\": {\n                \"Region\": \"us-east-1\",\n                \"UseFIPS\": true,\n                \"UseDualStack\": true,\n                \"Accelerate\": false,\n                \"UseS3ExpressControlEndpoint\": true,\n                \"DisableS3ExpressSessionAuth\": false\n              }\n            },\n            {\n              \"documentation\": \"Data Plane with short AZ and dualstack\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4-s3express\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://mybucket--usw2-az1--x-s3.s3express-usw2-az1.dualstack.us-west-2.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-west-2\",\n                    \"AWS::UseDualStack\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"mybucket--usw2-az1--x-s3\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"mybucket--usw2-az1--x-s3\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": true,\n                \"Accelerate\": false,\n                \"UseS3ExpressControlEndpoint\": false\n              }\n            },\n            {\n              \"documentation\": \"Data Plane with short AZ and FIPS with dualstack\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4-s3express\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://mybucket--usw2-az1--x-s3.s3express-fips-usw2-az1.dualstack.us-west-2.amazonaws.com\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-west-2\",\n                    \"AWS::UseFIPS\": true,\n                    \"AWS::UseDualStack\": true\n                  },\n                  \"operationName\": \"GetObject\",\n                  \"operationParams\": {\n                    \"Bucket\": \"mybucket--usw2-az1--x-s3\",\n                    \"Key\": \"key\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"mybucket--usw2-az1--x-s3\",\n                \"UseFIPS\": true,\n                \"UseDualStack\": true,\n                \"Accelerate\": false,\n                \"UseS3ExpressControlEndpoint\": false\n              }\n            },\n            {\n              \"documentation\": \"Data Plane sigv4 auth with short AZ and dualstack\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://mybucket--usw2-az1--x-s3.s3express-usw2-az1.dualstack.us-west-2.amazonaws.com\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"mybucket--usw2-az1--x-s3\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": true,\n                \"Accelerate\": false,\n                \"DisableS3ExpressSessionAuth\": true\n              }\n            },\n            {\n              \"documentation\": \"Data Plane sigv4 auth with short AZ and FIPS with dualstack\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://mybucket--usw2-az1--x-s3.s3express-fips-usw2-az1.dualstack.us-west-2.amazonaws.com\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"mybucket--usw2-az1--x-s3\",\n                \"UseFIPS\": true,\n                \"UseDualStack\": true,\n                \"Accelerate\": false,\n                \"DisableS3ExpressSessionAuth\": true\n              }\n            },\n            {\n              \"documentation\": \"Data Plane with zone and dualstack\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4-s3express\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://mybucket--usw2-az12--x-s3.s3express-usw2-az12.dualstack.us-west-2.amazonaws.com\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"mybucket--usw2-az12--x-s3\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": true,\n                \"Accelerate\": false,\n                \"UseS3ExpressControlEndpoint\": false\n              }\n            },\n            {\n              \"documentation\": \"Data Plane with zone and FIPS with dualstack\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4-s3express\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://mybucket--usw2-az12--x-s3.s3express-fips-usw2-az12.dualstack.us-west-2.amazonaws.com\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"mybucket--usw2-az12--x-s3\",\n                \"UseFIPS\": true,\n                \"UseDualStack\": true,\n                \"Accelerate\": false,\n                \"UseS3ExpressControlEndpoint\": false\n              }\n            },\n            {\n              \"documentation\": \"Data Plane sigv4 auth with zone and dualstack\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://mybucket--usw2-az12--x-s3.s3express-usw2-az12.dualstack.us-west-2.amazonaws.com\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"mybucket--usw2-az12--x-s3\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": true,\n                \"Accelerate\": false,\n                \"DisableS3ExpressSessionAuth\": true\n              }\n            },\n            {\n              \"documentation\": \"Data Plane sigv4 auth with 9-char zone and FIPS with dualstack\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://mybucket--usw2-az12--x-s3.s3express-fips-usw2-az12.dualstack.us-west-2.amazonaws.com\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"mybucket--usw2-az12--x-s3\",\n                \"UseFIPS\": true,\n                \"UseDualStack\": true,\n                \"Accelerate\": false,\n                \"DisableS3ExpressSessionAuth\": true\n              }\n            },\n            {\n              \"documentation\": \"Data Plane with 13-char zone and dualstack\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4-s3express\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://mybucket--test-zone-ab1--x-s3.s3express-test-zone-ab1.dualstack.us-west-2.amazonaws.com\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"mybucket--test-zone-ab1--x-s3\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": true,\n                \"Accelerate\": false,\n                \"UseS3ExpressControlEndpoint\": false\n              }\n            },\n            {\n              \"documentation\": \"Data Plane with 13-char zone and FIPS with dualstack\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4-s3express\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://mybucket--test-zone-ab1--x-s3.s3express-fips-test-zone-ab1.dualstack.us-west-2.amazonaws.com\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"mybucket--test-zone-ab1--x-s3\",\n                \"UseFIPS\": true,\n                \"UseDualStack\": true,\n                \"Accelerate\": false,\n                \"UseS3ExpressControlEndpoint\": false\n              }\n            },\n            {\n              \"documentation\": \"Data Plane sigv4 auth with 13-char zone and dualstack\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://mybucket--test-zone-ab1--x-s3.s3express-test-zone-ab1.dualstack.us-west-2.amazonaws.com\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"mybucket--test-zone-ab1--x-s3\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": true,\n                \"Accelerate\": false,\n                \"DisableS3ExpressSessionAuth\": true\n              }\n            },\n            {\n              \"documentation\": \"Data Plane sigv4 auth with 13-char zone and FIPS with dualstack\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://mybucket--test-zone-ab1--x-s3.s3express-fips-test-zone-ab1.dualstack.us-west-2.amazonaws.com\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"mybucket--test-zone-ab1--x-s3\",\n                \"UseFIPS\": true,\n                \"UseDualStack\": true,\n                \"Accelerate\": false,\n                \"DisableS3ExpressSessionAuth\": true\n              }\n            },\n            {\n              \"documentation\": \"Data Plane with 14-char zone and dualstack\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4-s3express\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://mybucket--test1-zone-ab1--x-s3.s3express-test1-zone-ab1.dualstack.us-west-2.amazonaws.com\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"mybucket--test1-zone-ab1--x-s3\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": true,\n                \"Accelerate\": false,\n                \"UseS3ExpressControlEndpoint\": false\n              }\n            },\n            {\n              \"documentation\": \"Data Plane with 14-char zone and FIPS with dualstack\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4-s3express\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://mybucket--test1-zone-ab1--x-s3.s3express-fips-test1-zone-ab1.dualstack.us-west-2.amazonaws.com\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"mybucket--test1-zone-ab1--x-s3\",\n                \"UseFIPS\": true,\n                \"UseDualStack\": true,\n                \"Accelerate\": false,\n                \"UseS3ExpressControlEndpoint\": false\n              }\n            },\n            {\n              \"documentation\": \"Data Plane sigv4 auth with 14-char zone and dualstack\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://mybucket--test1-zone-ab1--x-s3.s3express-test1-zone-ab1.dualstack.us-west-2.amazonaws.com\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"mybucket--test1-zone-ab1--x-s3\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": true,\n                \"Accelerate\": false,\n                \"DisableS3ExpressSessionAuth\": true\n              }\n            },\n            {\n              \"documentation\": \"Data Plane sigv4 auth with 14-char zone and FIPS with dualstack\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://mybucket--test1-zone-ab1--x-s3.s3express-fips-test1-zone-ab1.dualstack.us-west-2.amazonaws.com\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"mybucket--test1-zone-ab1--x-s3\",\n                \"UseFIPS\": true,\n                \"UseDualStack\": true,\n                \"Accelerate\": false,\n                \"DisableS3ExpressSessionAuth\": true\n              }\n            },\n            {\n              \"documentation\": \"Data Plane with long zone (20 cha) and dualstack\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4-s3express\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://mybucket--test1-long1-zone-ab1--x-s3.s3express-test1-long1-zone-ab1.dualstack.us-west-2.amazonaws.com\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"mybucket--test1-long1-zone-ab1--x-s3\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": true,\n                \"Accelerate\": false,\n                \"UseS3ExpressControlEndpoint\": false\n              }\n            },\n            {\n              \"documentation\": \"Data Plane with long zone (20 char) and FIPS with dualstack\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4-s3express\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://mybucket--test1-long1-zone-ab1--x-s3.s3express-fips-test1-long1-zone-ab1.dualstack.us-west-2.amazonaws.com\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"mybucket--test1-long1-zone-ab1--x-s3\",\n                \"UseFIPS\": true,\n                \"UseDualStack\": true,\n                \"Accelerate\": false,\n                \"UseS3ExpressControlEndpoint\": false\n              }\n            },\n            {\n              \"documentation\": \"Data Plane sigv4 auth with long zone (20 char) and dualstack\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://mybucket--test1-long1-zone-ab1--x-s3.s3express-test1-long1-zone-ab1.dualstack.us-west-2.amazonaws.com\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"mybucket--test1-long1-zone-ab1--x-s3\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": true,\n                \"Accelerate\": false,\n                \"DisableS3ExpressSessionAuth\": true\n              }\n            },\n            {\n              \"documentation\": \"Data Plane sigv4 auth with long zone (20 char) and FIPS with dualstack\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://mybucket--test1-long1-zone-ab1--x-s3.s3express-fips-test1-long1-zone-ab1.dualstack.us-west-2.amazonaws.com\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"mybucket--test1-long1-zone-ab1--x-s3\",\n                \"UseFIPS\": true,\n                \"UseDualStack\": true,\n                \"Accelerate\": false,\n                \"DisableS3ExpressSessionAuth\": true\n              }\n            },\n            {\n              \"documentation\": \"Control plane and FIPS with dualstack\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-east-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://s3express-control-fips.dualstack.us-east-1.amazonaws.com/mybucket--test-ab1--x-s3\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-east-1\",\n                    \"AWS::UseFIPS\": true,\n                    \"AWS::UseDualStack\": true\n                  },\n                  \"operationName\": \"CreateBucket\",\n                  \"operationParams\": {\n                    \"Bucket\": \"mybucket--test-ab1--x-s3\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"us-east-1\",\n                \"Bucket\": \"mybucket--test-ab1--x-s3\",\n                \"UseFIPS\": true,\n                \"UseDualStack\": true,\n                \"Accelerate\": false,\n                \"UseS3ExpressControlEndpoint\": true\n              }\n            },\n            {\n              \"documentation\": \"Data plane with zone and dualstack and AP\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4-s3express\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://myaccesspoint--usw2-az1--xa-s3.s3express-usw2-az1.dualstack.us-west-2.amazonaws.com\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"myaccesspoint--usw2-az1--xa-s3\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": true,\n                \"Accelerate\": false,\n                \"UseS3ExpressControlEndpoint\": false\n              }\n            },\n            {\n              \"documentation\": \"Data plane with zone and FIPS with dualstack and AP\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4-s3express\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://myaccesspoint--usw2-az1--xa-s3.s3express-fips-usw2-az1.dualstack.us-west-2.amazonaws.com\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"myaccesspoint--usw2-az1--xa-s3\",\n                \"UseFIPS\": true,\n                \"UseDualStack\": true,\n                \"Accelerate\": false,\n                \"UseS3ExpressControlEndpoint\": false\n              }\n            },\n            {\n              \"documentation\": \"Data Plane sigv4 auth with zone and dualstack and AP\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://myaccesspoint--usw2-az1--xa-s3.s3express-usw2-az1.dualstack.us-west-2.amazonaws.com\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"myaccesspoint--usw2-az1--xa-s3\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": true,\n                \"Accelerate\": false,\n                \"DisableS3ExpressSessionAuth\": true\n              }\n            },\n            {\n              \"documentation\": \"Data Plane AP sigv4 auth with zone and FIPS with dualstack\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://myaccesspoint--usw2-az1--xa-s3.s3express-fips-usw2-az1.dualstack.us-west-2.amazonaws.com\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"myaccesspoint--usw2-az1--xa-s3\",\n                \"UseFIPS\": true,\n                \"UseDualStack\": true,\n                \"Accelerate\": false,\n                \"DisableS3ExpressSessionAuth\": true\n              }\n            },\n            {\n              \"documentation\": \"Data Plane with zone (9 char) and AP with dualstack\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4-s3express\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://myaccesspoint--usw2-az12--xa-s3.s3express-usw2-az12.dualstack.us-west-2.amazonaws.com\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"myaccesspoint--usw2-az12--xa-s3\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": true,\n                \"Accelerate\": false,\n                \"UseS3ExpressControlEndpoint\": false\n              }\n            },\n            {\n              \"documentation\": \"Data Plane with zone (9 char) and FIPS with AP and dualstack\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4-s3express\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://myaccesspoint--usw2-az12--xa-s3.s3express-fips-usw2-az12.dualstack.us-west-2.amazonaws.com\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"myaccesspoint--usw2-az12--xa-s3\",\n                \"UseFIPS\": true,\n                \"UseDualStack\": true,\n                \"Accelerate\": false,\n                \"UseS3ExpressControlEndpoint\": false\n              }\n            },\n            {\n              \"documentation\": \"Data Plane sigv4 auth with (9 char) zone and dualstack with AP\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://myaccesspoint--usw2-az12--xa-s3.s3express-usw2-az12.dualstack.us-west-2.amazonaws.com\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"myaccesspoint--usw2-az12--xa-s3\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": true,\n                \"Accelerate\": false,\n                \"DisableS3ExpressSessionAuth\": true\n              }\n            },\n            {\n              \"documentation\": \"Access Point sigv4 auth with (9 char) zone and FIPS with dualstack\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://myaccesspoint--usw2-az12--xa-s3.s3express-fips-usw2-az12.dualstack.us-west-2.amazonaws.com\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"myaccesspoint--usw2-az12--xa-s3\",\n                \"UseFIPS\": true,\n                \"UseDualStack\": true,\n                \"Accelerate\": false,\n                \"DisableS3ExpressSessionAuth\": true\n              }\n            },\n            {\n              \"documentation\": \"Data Plane with zone (13 char) and AP with dualstack\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4-s3express\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://myaccesspoint--test-zone-ab1--xa-s3.s3express-test-zone-ab1.dualstack.us-west-2.amazonaws.com\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"myaccesspoint--test-zone-ab1--xa-s3\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": true,\n                \"Accelerate\": false,\n                \"UseS3ExpressControlEndpoint\": false\n              }\n            },\n            {\n              \"documentation\": \"Data Plane with zone (13 char) and AP with FIPS and dualstack\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4-s3express\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://myaccesspoint--test-zone-ab1--xa-s3.s3express-fips-test-zone-ab1.dualstack.us-west-2.amazonaws.com\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"myaccesspoint--test-zone-ab1--xa-s3\",\n                \"UseFIPS\": true,\n                \"UseDualStack\": true,\n                \"Accelerate\": false,\n                \"UseS3ExpressControlEndpoint\": false\n              }\n            },\n            {\n              \"documentation\": \"Data Plane sigv4 auth with (13 char) zone with AP and dualstack\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://myaccesspoint--test-zone-ab1--xa-s3.s3express-test-zone-ab1.dualstack.us-west-2.amazonaws.com\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"myaccesspoint--test-zone-ab1--xa-s3\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": true,\n                \"Accelerate\": false,\n                \"DisableS3ExpressSessionAuth\": true\n              }\n            },\n            {\n              \"documentation\": \"Data Plane sigv4 auth with (13 char) zone with AP and FIPS and dualstack\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://myaccesspoint--test-zone-ab1--xa-s3.s3express-fips-test-zone-ab1.dualstack.us-west-2.amazonaws.com\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"myaccesspoint--test-zone-ab1--xa-s3\",\n                \"UseFIPS\": true,\n                \"UseDualStack\": true,\n                \"Accelerate\": false,\n                \"DisableS3ExpressSessionAuth\": true\n              }\n            },\n            {\n              \"documentation\": \"Data Plane with (14 char) zone and AP with dualstack\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4-s3express\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://myaccesspoint--test1-zone-ab1--xa-s3.s3express-test1-zone-ab1.dualstack.us-west-2.amazonaws.com\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"myaccesspoint--test1-zone-ab1--xa-s3\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": true,\n                \"Accelerate\": false,\n                \"UseS3ExpressControlEndpoint\": false\n              }\n            },\n            {\n              \"documentation\": \"Data Plane with (14 char) zone and AP with FIPS and dualstack\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4-s3express\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://myaccesspoint--test1-zone-ab1--xa-s3.s3express-fips-test1-zone-ab1.dualstack.us-west-2.amazonaws.com\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"myaccesspoint--test1-zone-ab1--xa-s3\",\n                \"UseFIPS\": true,\n                \"UseDualStack\": true,\n                \"Accelerate\": false,\n                \"UseS3ExpressControlEndpoint\": false\n              }\n            },\n            {\n              \"documentation\": \"Data Plane sigv4 auth with (14 char) zone and AP with dualstack\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://myaccesspoint--test1-zone-ab1--xa-s3.s3express-test1-zone-ab1.dualstack.us-west-2.amazonaws.com\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"myaccesspoint--test1-zone-ab1--xa-s3\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": true,\n                \"Accelerate\": false,\n                \"DisableS3ExpressSessionAuth\": true\n              }\n            },\n            {\n              \"documentation\": \"Data Plane with (14 char) zone and AP with FIPS and dualstack\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://myaccesspoint--test1-zone-ab1--xa-s3.s3express-fips-test1-zone-ab1.dualstack.us-west-2.amazonaws.com\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"myaccesspoint--test1-zone-ab1--xa-s3\",\n                \"UseFIPS\": true,\n                \"UseDualStack\": true,\n                \"Accelerate\": false,\n                \"DisableS3ExpressSessionAuth\": true\n              }\n            },\n            {\n              \"documentation\": \"Data Plane with (20 char) zone and AP with dualstack\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4-s3express\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://myaccesspoint--test1-long1-zone-ab1--xa-s3.s3express-test1-long1-zone-ab1.dualstack.us-west-2.amazonaws.com\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"myaccesspoint--test1-long1-zone-ab1--xa-s3\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": true,\n                \"Accelerate\": false,\n                \"UseS3ExpressControlEndpoint\": false\n              }\n            },\n            {\n              \"documentation\": \"Data Plane with (20 char) zone and AP with FIPS and dualstack\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4-s3express\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://myaccesspoint--test1-long1-zone-ab1--xa-s3.s3express-fips-test1-long1-zone-ab1.dualstack.us-west-2.amazonaws.com\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"myaccesspoint--test1-long1-zone-ab1--xa-s3\",\n                \"UseFIPS\": true,\n                \"UseDualStack\": true,\n                \"Accelerate\": false,\n                \"UseS3ExpressControlEndpoint\": false\n              }\n            },\n            {\n              \"documentation\": \"Data plane AP with sigv4 and dualstack\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://myaccesspoint--test1-long1-zone-ab1--xa-s3.s3express-test1-long1-zone-ab1.dualstack.us-west-2.amazonaws.com\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"myaccesspoint--test1-long1-zone-ab1--xa-s3\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": true,\n                \"Accelerate\": false,\n                \"DisableS3ExpressSessionAuth\": true\n              }\n            },\n            {\n              \"documentation\": \"Data plane AP sigv4 with fips and dualstack\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-west-2\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://myaccesspoint--test1-long1-zone-ab1--xa-s3.s3express-fips-test1-long1-zone-ab1.dualstack.us-west-2.amazonaws.com\"\n                }\n              },\n              \"params\": {\n                \"Region\": \"us-west-2\",\n                \"Bucket\": \"myaccesspoint--test1-long1-zone-ab1--xa-s3\",\n                \"UseFIPS\": true,\n                \"UseDualStack\": true,\n                \"Accelerate\": false,\n                \"DisableS3ExpressSessionAuth\": true\n              }\n            },\n            {\n              \"documentation\": \"Control plane with dualstack and bucket\",\n              \"expect\": {\n                \"endpoint\": {\n                  \"properties\": {\n                    \"authSchemes\": [\n                      {\n                        \"name\": \"sigv4\",\n                        \"signingName\": \"s3express\",\n                        \"signingRegion\": \"us-east-1\",\n                        \"disableDoubleEncoding\": true\n                      }\n                    ],\n                    \"backend\": \"S3Express\"\n                  },\n                  \"url\": \"https://s3express-control.dualstack.us-east-1.amazonaws.com/mybucket--test-ab1--x-s3\"\n                }\n              },\n              \"operationInputs\": [\n                {\n                  \"builtInParams\": {\n                    \"AWS::Region\": \"us-east-1\",\n                    \"AWS::UseDualStack\": true\n                  },\n                  \"operationName\": \"CreateBucket\",\n                  \"operationParams\": {\n                    \"Bucket\": \"mybucket--test-ab1--x-s3\"\n                  }\n                }\n              ],\n              \"params\": {\n                \"Region\": \"us-east-1\",\n                \"Bucket\": \"mybucket--test-ab1--x-s3\",\n                \"UseFIPS\": false,\n                \"UseDualStack\": true,\n                \"Accelerate\": false,\n                \"UseS3ExpressControlEndpoint\": true\n              }\n            }\n          ],\n          \"version\": \"1.0\"\n        }\n      }\n    },\n    \"com.amazonaws.s3#AnalyticsAndOperator\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Prefix\": {\n          \"target\": \"com.amazonaws.s3#Prefix\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The prefix to use when evaluating an AND predicate: The prefix that an object must have to be\\n      included in the metrics results.</p>\"\n          }\n        },\n        \"Tags\": {\n          \"target\": \"com.amazonaws.s3#TagSet\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The list of tags to use when evaluating an AND predicate.</p>\",\n            \"smithy.api#xmlFlattened\": {},\n            \"smithy.api#xmlName\": \"Tag\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>A conjunction (logical AND) of predicates, which is used in evaluating a metrics filter. The\\n      operator must have at least two predicates in any combination, and an object must match all of the\\n      predicates for the filter to apply.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#AnalyticsConfiguration\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Id\": {\n          \"target\": \"com.amazonaws.s3#AnalyticsId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The ID that identifies the analytics configuration.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"Filter\": {\n          \"target\": \"com.amazonaws.s3#AnalyticsFilter\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The filter used to describe a set of objects for analyses. A filter must have exactly one prefix,\\n      one tag, or one conjunction (AnalyticsAndOperator). If no filter is provided, all objects will be\\n      considered in any analysis.</p>\"\n          }\n        },\n        \"StorageClassAnalysis\": {\n          \"target\": \"com.amazonaws.s3#StorageClassAnalysis\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p> Contains data related to access patterns to be collected and made available to analyze the\\n      tradeoffs between different storage classes. </p>\",\n            \"smithy.api#required\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Specifies the configuration and any analyses for the analytics filter of an Amazon S3 bucket.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#AnalyticsConfigurationList\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.s3#AnalyticsConfiguration\"\n      }\n    },\n    \"com.amazonaws.s3#AnalyticsExportDestination\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"S3BucketDestination\": {\n          \"target\": \"com.amazonaws.s3#AnalyticsS3BucketDestination\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A destination signifying output to an S3 bucket.</p>\",\n            \"smithy.api#required\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Where to publish the analytics results.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#AnalyticsFilter\": {\n      \"type\": \"union\",\n      \"members\": {\n        \"Prefix\": {\n          \"target\": \"com.amazonaws.s3#Prefix\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The prefix to use when evaluating an analytics filter.</p>\"\n          }\n        },\n        \"Tag\": {\n          \"target\": \"com.amazonaws.s3#Tag\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The tag to use when evaluating an analytics filter.</p>\"\n          }\n        },\n        \"And\": {\n          \"target\": \"com.amazonaws.s3#AnalyticsAndOperator\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A conjunction (logical AND) of predicates, which is used in evaluating an analytics filter. The\\n      operator must have at least two predicates.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>The filter used to describe a set of objects for analyses. A filter must have exactly one prefix,\\n      one tag, or one conjunction (AnalyticsAndOperator). If no filter is provided, all objects will be\\n      considered in any analysis.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#AnalyticsId\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#AnalyticsS3BucketDestination\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Format\": {\n          \"target\": \"com.amazonaws.s3#AnalyticsS3ExportFileFormat\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the file format used when exporting data to Amazon S3.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"BucketAccountId\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID that owns the destination S3 bucket. If no account ID is provided, the owner is not\\n      validated before exporting data.</p>\\n         <note>\\n            <p> Although this value is optional, we strongly recommend that you set it to help prevent problems\\n        if the destination bucket ownership changes. </p>\\n         </note>\"\n          }\n        },\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the bucket to which data is exported.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"Prefix\": {\n          \"target\": \"com.amazonaws.s3#Prefix\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The prefix to use when exporting data. The prefix is prepended to all results.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Contains information about where to publish the analytics results.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#AnalyticsS3ExportFileFormat\": {\n      \"type\": \"enum\",\n      \"members\": {\n        \"CSV\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"CSV\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#ArchiveStatus\": {\n      \"type\": \"enum\",\n      \"members\": {\n        \"ARCHIVE_ACCESS\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"ARCHIVE_ACCESS\"\n          }\n        },\n        \"DEEP_ARCHIVE_ACCESS\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"DEEP_ARCHIVE_ACCESS\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#BlockedEncryptionTypes\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"EncryptionType\": {\n          \"target\": \"com.amazonaws.s3#EncryptionTypeList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The object encryption type that you want to block or unblock for an Amazon S3 general purpose bucket.</p>\\n         <note>\\n            <p>Currently, this parameter only supports blocking or unblocking server side encryption with customer-provided keys (SSE-C). For more information about SSE-C, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/ServerSideEncryptionCustomerKeys.html\\\">Using server-side encryption with customer-provided keys (SSE-C)</a>.</p>\\n         </note>\",\n            \"smithy.api#xmlFlattened\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>A bucket-level setting for Amazon S3 general purpose buckets used to prevent the upload of new objects encrypted with the specified server-side encryption type. For example, blocking an encryption type will block <code>PutObject</code>, <code>CopyObject</code>, <code>PostObject</code>, multipart upload, and replication requests to the bucket for objects with the specified encryption type. However, you can continue to read and list any pre-existing objects already encrypted with the specified encryption type. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/blocking-unblocking-s3-c-encryption-gpb.html\\\">Blocking or unblocking SSE-C for a general purpose bucket</a>.</p>\\n         <p>This data type is used with the following actions:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketEncryption.html\\\">PutBucketEncryption</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketEncryption.html\\\">GetBucketEncryption</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketEncryption.html\\\">DeleteBucketEncryption</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <dl>\\n            <dt>Permissions</dt>\\n            <dd>\\n               <p>You must have the <code>s3:PutEncryptionConfiguration</code> permission to block or unblock an encryption type for a bucket. </p>\\n               <p>You must have the <code>s3:GetEncryptionConfiguration</code> permission to view a bucket's encryption type. </p>\\n            </dd>\\n         </dl>\"\n      }\n    },\n    \"com.amazonaws.s3#Body\": {\n      \"type\": \"blob\"\n    },\n    \"com.amazonaws.s3#Bucket\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Name\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the bucket.</p>\"\n          }\n        },\n        \"CreationDate\": {\n          \"target\": \"com.amazonaws.s3#CreationDate\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Date the bucket was created. This date can change when making changes to your bucket, such as\\n      editing its bucket policy.</p>\"\n          }\n        },\n        \"BucketRegion\": {\n          \"target\": \"com.amazonaws.s3#BucketRegion\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>\\n            <code>BucketRegion</code> indicates the Amazon Web Services region where the bucket is located. If the request\\n      contains at least one valid parameter, it is included in the response.</p>\"\n          }\n        },\n        \"BucketArn\": {\n          \"target\": \"com.amazonaws.s3#S3RegionalOrS3ExpressBucketArnString\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the S3 bucket. ARNs uniquely identify Amazon Web Services resources across all\\n      of Amazon Web Services.</p>\\n         <note>\\n            <p>This parameter is only supported for S3 directory buckets. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-buckets-tagging.html\\\">Using tags with\\n          directory buckets</a>.</p>\\n         </note>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p> In terms of implementation, a Bucket is a resource. </p>\"\n      }\n    },\n    \"com.amazonaws.s3#BucketAbacStatus\": {\n      \"type\": \"enum\",\n      \"members\": {\n        \"Enabled\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"Enabled\"\n          }\n        },\n        \"Disabled\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"Disabled\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#BucketAccelerateStatus\": {\n      \"type\": \"enum\",\n      \"members\": {\n        \"Enabled\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"Enabled\"\n          }\n        },\n        \"Suspended\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"Suspended\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#BucketAlreadyExists\": {\n      \"type\": \"structure\",\n      \"members\": {},\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>The requested bucket name is not available. The bucket namespace is shared by all users of the\\n      system. Select a different name and try again.</p>\",\n        \"smithy.api#error\": \"client\",\n        \"smithy.api#httpError\": 409\n      }\n    },\n    \"com.amazonaws.s3#BucketAlreadyOwnedByYou\": {\n      \"type\": \"structure\",\n      \"members\": {},\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>The bucket you tried to create already exists, and you own it. Amazon S3 returns this error in all Amazon Web Services\\n      Regions except in the North Virginia Region. For legacy compatibility, if you re-create an existing\\n      bucket that you already own in the North Virginia Region, Amazon S3 returns 200 OK and resets the bucket\\n      access control lists (ACLs).</p>\",\n        \"smithy.api#error\": \"client\",\n        \"smithy.api#httpError\": 409\n      }\n    },\n    \"com.amazonaws.s3#BucketCannedACL\": {\n      \"type\": \"enum\",\n      \"members\": {\n        \"private\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"private\"\n          }\n        },\n        \"public_read\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"public-read\"\n          }\n        },\n        \"public_read_write\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"public-read-write\"\n          }\n        },\n        \"authenticated_read\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"authenticated-read\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#BucketInfo\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"DataRedundancy\": {\n          \"target\": \"com.amazonaws.s3#DataRedundancy\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The number of Zone (Availability Zone or Local Zone) that's used for redundancy for the bucket.</p>\"\n          }\n        },\n        \"Type\": {\n          \"target\": \"com.amazonaws.s3#BucketType\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The type of bucket.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Specifies the information about the bucket that will be created. For more information about\\n      directory buckets, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-buckets-overview.html\\\">Directory buckets</a> in the\\n        <i>Amazon S3 User Guide</i>.</p>\\n         <note>\\n            <p>This functionality is only supported by directory buckets.</p>\\n         </note>\"\n      }\n    },\n    \"com.amazonaws.s3#BucketKeyEnabled\": {\n      \"type\": \"boolean\"\n    },\n    \"com.amazonaws.s3#BucketLifecycleConfiguration\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Rules\": {\n          \"target\": \"com.amazonaws.s3#LifecycleRules\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A lifecycle rule for individual objects in an Amazon S3 bucket.</p>\",\n            \"smithy.api#required\": {},\n            \"smithy.api#xmlFlattened\": {},\n            \"smithy.api#xmlName\": \"Rule\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Specifies the lifecycle configuration for objects in an Amazon S3 bucket. For more information, see\\n        <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/object-lifecycle-mgmt.html\\\">Object Lifecycle\\n        Management</a> in the <i>Amazon S3 User Guide</i>.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#BucketLocationConstraint\": {\n      \"type\": \"enum\",\n      \"members\": {\n        \"af_south_1\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"af-south-1\"\n          }\n        },\n        \"ap_east_1\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"ap-east-1\"\n          }\n        },\n        \"ap_northeast_1\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"ap-northeast-1\"\n          }\n        },\n        \"ap_northeast_2\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"ap-northeast-2\"\n          }\n        },\n        \"ap_northeast_3\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"ap-northeast-3\"\n          }\n        },\n        \"ap_south_1\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"ap-south-1\"\n          }\n        },\n        \"ap_south_2\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"ap-south-2\"\n          }\n        },\n        \"ap_southeast_1\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"ap-southeast-1\"\n          }\n        },\n        \"ap_southeast_2\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"ap-southeast-2\"\n          }\n        },\n        \"ap_southeast_3\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"ap-southeast-3\"\n          }\n        },\n        \"ap_southeast_4\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"ap-southeast-4\"\n          }\n        },\n        \"ap_southeast_5\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"ap-southeast-5\"\n          }\n        },\n        \"ca_central_1\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"ca-central-1\"\n          }\n        },\n        \"cn_north_1\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"cn-north-1\"\n          }\n        },\n        \"cn_northwest_1\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"cn-northwest-1\"\n          }\n        },\n        \"EU\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"EU\"\n          }\n        },\n        \"eu_central_1\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"eu-central-1\"\n          }\n        },\n        \"eu_central_2\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"eu-central-2\"\n          }\n        },\n        \"eu_north_1\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"eu-north-1\"\n          }\n        },\n        \"eu_south_1\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"eu-south-1\"\n          }\n        },\n        \"eu_south_2\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"eu-south-2\"\n          }\n        },\n        \"eu_west_1\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"eu-west-1\"\n          }\n        },\n        \"eu_west_2\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"eu-west-2\"\n          }\n        },\n        \"eu_west_3\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"eu-west-3\"\n          }\n        },\n        \"il_central_1\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"il-central-1\"\n          }\n        },\n        \"me_central_1\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"me-central-1\"\n          }\n        },\n        \"me_south_1\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"me-south-1\"\n          }\n        },\n        \"sa_east_1\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"sa-east-1\"\n          }\n        },\n        \"us_east_2\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"us-east-2\"\n          }\n        },\n        \"us_gov_east_1\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"us-gov-east-1\"\n          }\n        },\n        \"us_gov_west_1\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"us-gov-west-1\"\n          }\n        },\n        \"us_west_1\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"us-west-1\"\n          }\n        },\n        \"us_west_2\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"us-west-2\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#BucketLocationName\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#BucketLoggingStatus\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"LoggingEnabled\": {\n          \"target\": \"com.amazonaws.s3#LoggingEnabled\"\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Container for logging status information.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#BucketLogsPermission\": {\n      \"type\": \"enum\",\n      \"members\": {\n        \"FULL_CONTROL\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"FULL_CONTROL\"\n          }\n        },\n        \"READ\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"READ\"\n          }\n        },\n        \"WRITE\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"WRITE\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#BucketName\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#BucketRegion\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#BucketType\": {\n      \"type\": \"enum\",\n      \"members\": {\n        \"Directory\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"Directory\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#BucketVersioningStatus\": {\n      \"type\": \"enum\",\n      \"members\": {\n        \"Enabled\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"Enabled\"\n          }\n        },\n        \"Suspended\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"Suspended\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#Buckets\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.s3#Bucket\",\n        \"traits\": {\n          \"smithy.api#xmlName\": \"Bucket\"\n        }\n      }\n    },\n    \"com.amazonaws.s3#BypassGovernanceRetention\": {\n      \"type\": \"boolean\"\n    },\n    \"com.amazonaws.s3#BytesProcessed\": {\n      \"type\": \"long\"\n    },\n    \"com.amazonaws.s3#BytesReturned\": {\n      \"type\": \"long\"\n    },\n    \"com.amazonaws.s3#BytesScanned\": {\n      \"type\": \"long\"\n    },\n    \"com.amazonaws.s3#CORSConfiguration\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"CORSRules\": {\n          \"target\": \"com.amazonaws.s3#CORSRules\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A set of origins and methods (cross-origin access that you want to allow). You can add up to 100\\n      rules to the configuration.</p>\",\n            \"smithy.api#required\": {},\n            \"smithy.api#xmlFlattened\": {},\n            \"smithy.api#xmlName\": \"CORSRule\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Describes the cross-origin access configuration for objects in an Amazon S3 bucket. For more information,\\n      see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/cors.html\\\">Enabling Cross-Origin Resource\\n        Sharing</a> in the <i>Amazon S3 User Guide</i>.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#CORSRule\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"ID\": {\n          \"target\": \"com.amazonaws.s3#ID\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Unique identifier for the rule. The value cannot be longer than 255 characters.</p>\"\n          }\n        },\n        \"AllowedHeaders\": {\n          \"target\": \"com.amazonaws.s3#AllowedHeaders\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Headers that are specified in the <code>Access-Control-Request-Headers</code> header. These headers\\n      are allowed in a preflight OPTIONS request. In response to any preflight OPTIONS request, Amazon S3 returns\\n      any requested headers that are allowed.</p>\",\n            \"smithy.api#xmlFlattened\": {},\n            \"smithy.api#xmlName\": \"AllowedHeader\"\n          }\n        },\n        \"AllowedMethods\": {\n          \"target\": \"com.amazonaws.s3#AllowedMethods\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>An HTTP method that you allow the origin to execute. Valid values are <code>GET</code>,\\n        <code>PUT</code>, <code>HEAD</code>, <code>POST</code>, and <code>DELETE</code>.</p>\",\n            \"smithy.api#required\": {},\n            \"smithy.api#xmlFlattened\": {},\n            \"smithy.api#xmlName\": \"AllowedMethod\"\n          }\n        },\n        \"AllowedOrigins\": {\n          \"target\": \"com.amazonaws.s3#AllowedOrigins\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>One or more origins you want customers to be able to access the bucket from.</p>\",\n            \"smithy.api#required\": {},\n            \"smithy.api#xmlFlattened\": {},\n            \"smithy.api#xmlName\": \"AllowedOrigin\"\n          }\n        },\n        \"ExposeHeaders\": {\n          \"target\": \"com.amazonaws.s3#ExposeHeaders\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>One or more headers in the response that you want customers to be able to access from their\\n      applications (for example, from a JavaScript <code>XMLHttpRequest</code> object).</p>\",\n            \"smithy.api#xmlFlattened\": {},\n            \"smithy.api#xmlName\": \"ExposeHeader\"\n          }\n        },\n        \"MaxAgeSeconds\": {\n          \"target\": \"com.amazonaws.s3#MaxAgeSeconds\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The time in seconds that your browser is to cache the preflight response for the specified\\n      resource.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Specifies a cross-origin access rule for an Amazon S3 bucket.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#CORSRules\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.s3#CORSRule\"\n      }\n    },\n    \"com.amazonaws.s3#CSVInput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"FileHeaderInfo\": {\n          \"target\": \"com.amazonaws.s3#FileHeaderInfo\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Describes the first line of input. Valid values are:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>NONE</code>: First line is not a header.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>IGNORE</code>: First line is a header, but you can't use the header values to indicate the\\n          column in an expression. You can use column position (such as _1, _2, …) to indicate the column\\n            (<code>SELECT s._1 FROM OBJECT s</code>).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>Use</code>: First line is a header, and you can use the header value to identify a column\\n          in an expression (<code>SELECT \\\"name\\\" FROM OBJECT</code>). </p>\\n            </li>\\n         </ul>\"\n          }\n        },\n        \"Comments\": {\n          \"target\": \"com.amazonaws.s3#Comments\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A single character used to indicate that a row should be ignored when the character is present at\\n      the start of that row. You can specify any character to indicate a comment line. The default character\\n      is <code>#</code>.</p>\\n         <p>Default: <code>#</code>\\n         </p>\"\n          }\n        },\n        \"QuoteEscapeCharacter\": {\n          \"target\": \"com.amazonaws.s3#QuoteEscapeCharacter\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A single character used for escaping the quotation mark character inside an already escaped value.\\n      For example, the value <code>\\\"\\\"\\\" a , b \\\"\\\"\\\"</code> is parsed as <code>\\\" a , b \\\"</code>.</p>\"\n          }\n        },\n        \"RecordDelimiter\": {\n          \"target\": \"com.amazonaws.s3#RecordDelimiter\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A single character used to separate individual records in the input. Instead of the default value,\\n      you can specify an arbitrary delimiter.</p>\"\n          }\n        },\n        \"FieldDelimiter\": {\n          \"target\": \"com.amazonaws.s3#FieldDelimiter\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A single character used to separate individual fields in a record. You can specify an arbitrary\\n      delimiter.</p>\"\n          }\n        },\n        \"QuoteCharacter\": {\n          \"target\": \"com.amazonaws.s3#QuoteCharacter\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A single character used for escaping when the field delimiter is part of the value. For example, if\\n      the value is <code>a, b</code>, Amazon S3 wraps this field value in quotation marks, as follows: <code>\\\" a ,\\n        b \\\"</code>.</p>\\n         <p>Type: String</p>\\n         <p>Default: <code>\\\"</code>\\n         </p>\\n         <p>Ancestors: <code>CSV</code>\\n         </p>\"\n          }\n        },\n        \"AllowQuotedRecordDelimiter\": {\n          \"target\": \"com.amazonaws.s3#AllowQuotedRecordDelimiter\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies that CSV field values may contain quoted record delimiters and such records should be\\n      allowed. Default value is FALSE. Setting this value to TRUE may lower performance.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Describes how an uncompressed comma-separated values (CSV)-formatted input object is\\n      formatted.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#CSVOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"QuoteFields\": {\n          \"target\": \"com.amazonaws.s3#QuoteFields\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Indicates whether to use quotation marks around output fields. </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>ALWAYS</code>: Always use quotation marks for output fields.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ASNEEDED</code>: Use quotation marks for output fields when needed.</p>\\n            </li>\\n         </ul>\"\n          }\n        },\n        \"QuoteEscapeCharacter\": {\n          \"target\": \"com.amazonaws.s3#QuoteEscapeCharacter\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The single character used for escaping the quote character inside an already escaped value.</p>\"\n          }\n        },\n        \"RecordDelimiter\": {\n          \"target\": \"com.amazonaws.s3#RecordDelimiter\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A single character used to separate individual records in the output. Instead of the default value,\\n      you can specify an arbitrary delimiter.</p>\"\n          }\n        },\n        \"FieldDelimiter\": {\n          \"target\": \"com.amazonaws.s3#FieldDelimiter\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The value used to separate individual fields in a record. You can specify an arbitrary\\n      delimiter.</p>\"\n          }\n        },\n        \"QuoteCharacter\": {\n          \"target\": \"com.amazonaws.s3#QuoteCharacter\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A single character used for escaping when the field delimiter is part of the value. For example, if\\n      the value is <code>a, b</code>, Amazon S3 wraps this field value in quotation marks, as follows: <code>\\\" a ,\\n        b \\\"</code>.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Describes how uncompressed comma-separated values (CSV)-formatted results are formatted.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#CacheControl\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#Checksum\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"ChecksumCRC32\": {\n          \"target\": \"com.amazonaws.s3#ChecksumCRC32\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Base64 encoded, 32-bit <code>CRC32 checksum</code> of the object. This checksum is only present if the checksum was uploaded\\n    with the object. When you use an API operation on an object that was uploaded using multipart uploads, this value may not be a direct checksum value of the full object. Instead, it's a calculation based on the checksum values of each individual part. For more information about how checksums are calculated\\n    with multipart uploads, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html#large-object-checksums\\\">\\n    Checking object integrity</a> in the <i>Amazon S3 User Guide</i>.</p>\"\n          }\n        },\n        \"ChecksumCRC32C\": {\n          \"target\": \"com.amazonaws.s3#ChecksumCRC32C\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Base64 encoded, 32-bit <code>CRC32C</code> checksum of the object. This checksum is only present if the checksum was uploaded\\n    with the object. When you use an API operation on an object that was uploaded using multipart uploads, this value may not be a direct checksum value of the full object. Instead, it's a calculation based on the checksum values of each individual part. For more information about how checksums are calculated\\n    with multipart uploads, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html#large-object-checksums\\\">\\n    Checking object integrity</a> in the <i>Amazon S3 User Guide</i>.</p>\"\n          }\n        },\n        \"ChecksumCRC64NVME\": {\n          \"target\": \"com.amazonaws.s3#ChecksumCRC64NVME\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Base64 encoded, 64-bit <code>CRC64NVME</code> checksum of the object. This checksum is present\\n      if the object was uploaded with the <code>CRC64NVME</code> checksum algorithm, or if the object was\\n      uploaded without a checksum (and Amazon S3 added the default checksum, <code>CRC64NVME</code>, to the\\n      uploaded object). For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking object integrity</a> in\\n      the <i>Amazon S3 User Guide</i>.</p>\"\n          }\n        },\n        \"ChecksumSHA1\": {\n          \"target\": \"com.amazonaws.s3#ChecksumSHA1\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Base64 encoded, 160-bit <code>SHA1</code> digest of the object. This checksum is only present if the checksum was uploaded\\n    with the object. When you use the API operation on an object that was uploaded using multipart uploads, this value may not be a direct checksum value of the full object. Instead, it's a calculation based on the checksum values of each individual part. For more information about how checksums are calculated\\n    with multipart uploads, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html#large-object-checksums\\\">\\n    Checking object integrity</a> in the <i>Amazon S3 User Guide</i>.</p>\"\n          }\n        },\n        \"ChecksumSHA256\": {\n          \"target\": \"com.amazonaws.s3#ChecksumSHA256\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Base64 encoded, 256-bit <code>SHA256</code> digest of the object. This checksum is only present if the checksum was uploaded\\n    with the object. When you use an API operation on an object that was uploaded using multipart uploads, this value may not be a direct checksum value of the full object. Instead, it's a calculation based on the checksum values of each individual part. For more information about how checksums are calculated\\n    with multipart uploads, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html#large-object-checksums\\\">\\n    Checking object integrity</a> in the <i>Amazon S3 User Guide</i>.</p>\"\n          }\n        },\n        \"ChecksumType\": {\n          \"target\": \"com.amazonaws.s3#ChecksumType\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The checksum type that is used to calculate the object’s checksum value. For more information, see\\n        <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking\\n        object integrity</a> in the <i>Amazon S3 User Guide</i>.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Contains all the possible checksum or digest values for an object.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#ChecksumAlgorithm\": {\n      \"type\": \"enum\",\n      \"members\": {\n        \"CRC32\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"CRC32\"\n          }\n        },\n        \"CRC32C\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"CRC32C\"\n          }\n        },\n        \"SHA1\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"SHA1\"\n          }\n        },\n        \"SHA256\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"SHA256\"\n          }\n        },\n        \"CRC64NVME\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"CRC64NVME\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#ChecksumAlgorithmList\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.s3#ChecksumAlgorithm\"\n      }\n    },\n    \"com.amazonaws.s3#ChecksumCRC32\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#ChecksumCRC32C\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#ChecksumCRC64NVME\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#ChecksumMode\": {\n      \"type\": \"enum\",\n      \"members\": {\n        \"ENABLED\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"ENABLED\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#ChecksumSHA1\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#ChecksumSHA256\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#ChecksumType\": {\n      \"type\": \"enum\",\n      \"members\": {\n        \"COMPOSITE\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"COMPOSITE\"\n          }\n        },\n        \"FULL_OBJECT\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"FULL_OBJECT\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#ClientToken\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#Code\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#Comments\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#CommonPrefix\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Prefix\": {\n          \"target\": \"com.amazonaws.s3#Prefix\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Container for the specified common prefix.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Container for all (if there are any) keys between Prefix and the next occurrence of the string\\n      specified by a delimiter. CommonPrefixes lists keys that act like subdirectories in the directory\\n      specified by Prefix. For example, if the prefix is notes/ and the delimiter is a slash (/) as in\\n      notes/summer/july, the common prefix is notes/summer/. </p>\"\n      }\n    },\n    \"com.amazonaws.s3#CommonPrefixList\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.s3#CommonPrefix\"\n      }\n    },\n    \"com.amazonaws.s3#CompleteMultipartUpload\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#CompleteMultipartUploadRequest\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.s3#CompleteMultipartUploadOutput\"\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Completes a multipart upload by assembling previously uploaded parts.</p>\\n         <p>You first initiate the multipart upload and then upload all parts using the <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPart.html\\\">UploadPart</a> operation or the\\n        <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html\\\">UploadPartCopy</a>\\n      operation. After successfully uploading all relevant parts of an upload, you call this\\n        <code>CompleteMultipartUpload</code> operation to complete the upload. Upon receiving this request,\\n      Amazon S3 concatenates all the parts in ascending order by part number to create a new object. In the\\n      CompleteMultipartUpload request, you must provide the parts list and ensure that the parts list is\\n      complete. The CompleteMultipartUpload API operation concatenates the parts that you provide in the list.\\n      For each part in the list, you must provide the <code>PartNumber</code> value and the <code>ETag</code>\\n      value that are returned after that part was uploaded.</p>\\n         <p>The processing of a CompleteMultipartUpload request could take several minutes to finalize. After\\n      Amazon S3 begins processing the request, it sends an HTTP response header that specifies a <code>200\\n        OK</code> response. While processing is in progress, Amazon S3 periodically sends white space characters to\\n      keep the connection from timing out. A request could fail after the initial <code>200 OK</code> response\\n      has been sent. This means that a <code>200 OK</code> response can contain either a success or an error.\\n      The error response might be embedded in the <code>200 OK</code> response. If you call this API operation\\n      directly, make sure to design your application to parse the contents of the response and handle it\\n      appropriately. If you use Amazon Web Services SDKs, SDKs handle this condition. The SDKs detect the embedded error and\\n      apply error handling per your configuration settings (including automatically retrying the request as\\n      appropriate). If the condition persists, the SDKs throw an exception (or, for the SDKs that don't use\\n      exceptions, they return an error). </p>\\n         <p>Note that if <code>CompleteMultipartUpload</code> fails, applications should be prepared to retry\\n      any failed requests (including 500 error responses). For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/ErrorBestPractices.html\\\">Amazon S3 Error Best\\n        Practices</a>.</p>\\n         <important>\\n            <p>You can't use <code>Content-Type: application/x-www-form-urlencoded</code> for the\\n        CompleteMultipartUpload requests. Also, if you don't provide a <code>Content-Type</code> header,\\n          <code>CompleteMultipartUpload</code> can still return a <code>200 OK</code> response.</p>\\n         </important>\\n         <p>For more information about multipart uploads, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/uploadobjusingmpu.html\\\">Uploading Objects Using Multipart Upload</a> in\\n      the <i>Amazon S3 User Guide</i>.</p>\\n         <note>\\n            <p>\\n               <b>Directory buckets</b> - For directory buckets, you must make requests for this API operation to the Zonal endpoint. These endpoints support virtual-hosted-style requests in the format <code>https://<i>amzn-s3-demo-bucket</i>.s3express-<i>zone-id</i>.<i>region-code</i>.amazonaws.com/<i>key-name</i>\\n               </code>. Path-style requests are not supported. For more information about endpoints in Availability Zones, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/endpoint-directory-buckets-AZ.html\\\">Regional and Zonal endpoints for directory buckets in Availability Zones</a> in the\\n    <i>Amazon S3 User Guide</i>. For more information about endpoints in Local Zones, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-lzs-for-directory-buckets.html\\\">Concepts for directory buckets in Local Zones</a> in the\\n    <i>Amazon S3 User Guide</i>.</p>\\n         </note>\\n         <dl>\\n            <dt>Permissions</dt>\\n            <dd>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <b>General purpose bucket permissions</b> - For information\\n                about permissions required to use the multipart upload API, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/mpuAndPermissions.html\\\">Multipart Upload and Permissions</a> in\\n                the <i>Amazon S3 User Guide</i>.</p>\\n                     <p>If you provide an <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_Checksum.html\\\">additional checksum value</a> in your <code>MultipartUpload</code> requests and the\\n                object is encrypted with Key Management Service, you must have permission to use the\\n                  <code>kms:Decrypt</code> action for the <code>CompleteMultipartUpload</code> request to\\n                succeed.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <b>Directory bucket permissions</b> - To grant access to this API operation on a directory bucket, we recommend that you use the <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateSession.html\\\">\\n                           <code>CreateSession</code>\\n                        </a> API operation for session-based authorization. Specifically, you grant the <code>s3express:CreateSession</code> permission to the directory bucket in a bucket policy or an IAM identity-based policy. Then, you make the <code>CreateSession</code> API call on the bucket to obtain a session token. With the session token in your request header, you can make API requests to this operation. After the session token expires, you make another <code>CreateSession</code> API call to generate a new session token for use. \\nAmazon Web Services CLI or SDKs create session and refresh the session token automatically to avoid service interruptions when a session expires. For more information about authorization, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateSession.html\\\">\\n                           <code>CreateSession</code>\\n                        </a>.</p>\\n                     <p>If the object is encrypted with SSE-KMS, you must also have the\\n                  <code>kms:GenerateDataKey</code> and <code>kms:Decrypt</code> permissions in IAM\\n                identity-based policies and KMS key policies for the KMS key.</p>\\n                  </li>\\n               </ul>\\n            </dd>\\n            <dt>Special errors</dt>\\n            <dd>\\n               <ul>\\n                  <li>\\n                     <p>Error Code: <code>EntityTooSmall</code>\\n                     </p>\\n                     <ul>\\n                        <li>\\n                           <p>Description: Your proposed upload is smaller than the minimum allowed object size.\\n                    Each part must be at least 5 MB in size, except the last part.</p>\\n                        </li>\\n                        <li>\\n                           <p>HTTP Status Code: 400 Bad Request</p>\\n                        </li>\\n                     </ul>\\n                  </li>\\n                  <li>\\n                     <p>Error Code: <code>InvalidPart</code>\\n                     </p>\\n                     <ul>\\n                        <li>\\n                           <p>Description: One or more of the specified parts could not be found. The part might not\\n                    have been uploaded, or the specified ETag might not have matched the uploaded part's\\n                    ETag.</p>\\n                        </li>\\n                        <li>\\n                           <p>HTTP Status Code: 400 Bad Request</p>\\n                        </li>\\n                     </ul>\\n                  </li>\\n                  <li>\\n                     <p>Error Code: <code>InvalidPartOrder</code>\\n                     </p>\\n                     <ul>\\n                        <li>\\n                           <p>Description: The list of parts was not in ascending order. The parts list must be\\n                    specified in order by part number.</p>\\n                        </li>\\n                        <li>\\n                           <p>HTTP Status Code: 400 Bad Request</p>\\n                        </li>\\n                     </ul>\\n                  </li>\\n                  <li>\\n                     <p>Error Code: <code>NoSuchUpload</code>\\n                     </p>\\n                     <ul>\\n                        <li>\\n                           <p>Description: The specified multipart upload does not exist. The upload ID might be\\n                    invalid, or the multipart upload might have been aborted or completed.</p>\\n                        </li>\\n                        <li>\\n                           <p>HTTP Status Code: 404 Not Found</p>\\n                        </li>\\n                     </ul>\\n                  </li>\\n               </ul>\\n            </dd>\\n            <dt>HTTP Host header syntax</dt>\\n            <dd>\\n               <p>\\n                  <b>Directory buckets </b> - The HTTP Host header syntax is <code>\\n                     <i>Bucket-name</i>.s3express-<i>zone-id</i>.<i>region-code</i>.amazonaws.com</code>.</p>\\n            </dd>\\n         </dl>\\n         <p>The following operations are related to <code>CompleteMultipartUpload</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateMultipartUpload.html\\\">CreateMultipartUpload</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPart.html\\\">UploadPart</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_AbortMultipartUpload.html\\\">AbortMultipartUpload</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListParts.html\\\">ListParts</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListMultipartUploads.html\\\">ListMultipartUploads</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#examples\": [\n          {\n            \"title\": \"To complete multipart upload\",\n            \"documentation\": \"The following example completes a multipart upload.\",\n            \"input\": {\n              \"Bucket\": \"examplebucket\",\n              \"Key\": \"bigobject\",\n              \"MultipartUpload\": {\n                \"Parts\": [\n                  {\n                    \"PartNumber\": 1,\n                    \"ETag\": \"\\\"d8c2eafd90c266e19ab9dcacc479f8af\\\"\"\n                  },\n                  {\n                    \"PartNumber\": 2,\n                    \"ETag\": \"\\\"d8c2eafd90c266e19ab9dcacc479f8af\\\"\"\n                  }\n                ]\n              },\n              \"UploadId\": \"7YPBOJuoFiQ9cz4P3Pe6FIZwO4f7wN93uHsNBEw97pl5eNwzExg0LAT2dUN91cOmrEQHDsP3WA60CEg--\"\n            },\n            \"output\": {\n              \"ETag\": \"\\\"4d9031c7644d8081c2829f4ea23c55f7-2\\\"\",\n              \"Bucket\": \"acexamplebucket\",\n              \"Location\": \"https://examplebucket.s3.<Region>.amazonaws.com/bigobject\",\n              \"Key\": \"bigobject\"\n            }\n          }\n        ],\n        \"smithy.api#http\": {\n          \"method\": \"POST\",\n          \"uri\": \"/{Bucket}/{Key+}\",\n          \"code\": 200\n        }\n      }\n    },\n    \"com.amazonaws.s3#CompleteMultipartUploadOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Location\": {\n          \"target\": \"com.amazonaws.s3#Location\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The URI that identifies the newly created object.</p>\"\n          }\n        },\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the bucket that contains the newly created object. Does not return the access point ARN or access point\\n      alias if used.</p>\\n         <note>\\n            <p>Access points are not supported by directory buckets.</p>\\n         </note>\"\n          }\n        },\n        \"Key\": {\n          \"target\": \"com.amazonaws.s3#ObjectKey\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The object key of the newly created object.</p>\"\n          }\n        },\n        \"Expiration\": {\n          \"target\": \"com.amazonaws.s3#Expiration\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>If the object expiration is configured, this will contain the expiration date\\n        (<code>expiry-date</code>) and rule ID (<code>rule-id</code>). The value of <code>rule-id</code> is\\n      URL-encoded.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-expiration\"\n          }\n        },\n        \"ETag\": {\n          \"target\": \"com.amazonaws.s3#ETag\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Entity tag that identifies the newly created object's data. Objects with different object data will\\n      have different entity tags. The entity tag is an opaque string. The entity tag may or may not be an MD5\\n      digest of the object data. If the entity tag is not an MD5 digest of the object data, it will contain\\n      one or more nonhexadecimal characters and/or will consist of less than 32 or more than 32 hexadecimal\\n      digits. For more information about how the entity tag is calculated, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking object integrity</a> in\\n      the <i>Amazon S3 User Guide</i>.</p>\"\n          }\n        },\n        \"ChecksumCRC32\": {\n          \"target\": \"com.amazonaws.s3#ChecksumCRC32\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Base64 encoded, 32-bit <code>CRC32 checksum</code> of the object. This checksum is only present if the checksum was uploaded\\n    with the object. When you use an API operation on an object that was uploaded using multipart uploads, this value may not be a direct checksum value of the full object. Instead, it's a calculation based on the checksum values of each individual part. For more information about how checksums are calculated\\n    with multipart uploads, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html#large-object-checksums\\\">\\n    Checking object integrity</a> in the <i>Amazon S3 User Guide</i>.</p>\"\n          }\n        },\n        \"ChecksumCRC32C\": {\n          \"target\": \"com.amazonaws.s3#ChecksumCRC32C\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Base64 encoded, 32-bit <code>CRC32C</code> checksum of the object. This checksum is only present if the checksum was uploaded\\n    with the object. When you use an API operation on an object that was uploaded using multipart uploads, this value may not be a direct checksum value of the full object. Instead, it's a calculation based on the checksum values of each individual part. For more information about how checksums are calculated\\n    with multipart uploads, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html#large-object-checksums\\\">\\n    Checking object integrity</a> in the <i>Amazon S3 User Guide</i>.</p>\"\n          }\n        },\n        \"ChecksumCRC64NVME\": {\n          \"target\": \"com.amazonaws.s3#ChecksumCRC64NVME\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>This header can be used as a data integrity check to verify that the data received is the same data\\n      that was originally sent. This header specifies the Base64 encoded, 64-bit <code>CRC64NVME</code>\\n      checksum of the object. The <code>CRC64NVME</code> checksum is always a full object checksum. For more\\n      information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking object integrity in the Amazon S3\\n        User Guide</a>. </p>\"\n          }\n        },\n        \"ChecksumSHA1\": {\n          \"target\": \"com.amazonaws.s3#ChecksumSHA1\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Base64 encoded, 160-bit <code>SHA1</code> digest of the object. This checksum is only present if the checksum was uploaded\\n    with the object. When you use the API operation on an object that was uploaded using multipart uploads, this value may not be a direct checksum value of the full object. Instead, it's a calculation based on the checksum values of each individual part. For more information about how checksums are calculated\\n    with multipart uploads, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html#large-object-checksums\\\">\\n    Checking object integrity</a> in the <i>Amazon S3 User Guide</i>.</p>\"\n          }\n        },\n        \"ChecksumSHA256\": {\n          \"target\": \"com.amazonaws.s3#ChecksumSHA256\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Base64 encoded, 256-bit <code>SHA256</code> digest of the object. This checksum is only present if the checksum was uploaded\\n    with the object. When you use an API operation on an object that was uploaded using multipart uploads, this value may not be a direct checksum value of the full object. Instead, it's a calculation based on the checksum values of each individual part. For more information about how checksums are calculated\\n    with multipart uploads, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html#large-object-checksums\\\">\\n    Checking object integrity</a> in the <i>Amazon S3 User Guide</i>.</p>\"\n          }\n        },\n        \"ChecksumType\": {\n          \"target\": \"com.amazonaws.s3#ChecksumType\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The checksum type, which determines how part-level checksums are combined to create an object-level\\n      checksum for multipart objects. You can use this header as a data integrity check to verify that the\\n      checksum type that is received is the same checksum type that was specified during the\\n        <code>CreateMultipartUpload</code> request. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking object integrity in the Amazon S3\\n        User Guide</a>.</p>\"\n          }\n        },\n        \"ServerSideEncryption\": {\n          \"target\": \"com.amazonaws.s3#ServerSideEncryption\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The server-side encryption algorithm used when storing this object in Amazon S3.</p>\\n         <note>\\n            <p>When accessing data stored in Amazon FSx file systems using S3 access points, the only valid server side\\n        encryption option is <code>aws:fsx</code>.</p>\\n         </note>\\n         <p></p>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption\"\n          }\n        },\n        \"VersionId\": {\n          \"target\": \"com.amazonaws.s3#ObjectVersionId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Version ID of the newly created object, in case the bucket has versioning turned on.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-version-id\"\n          }\n        },\n        \"SSEKMSKeyId\": {\n          \"target\": \"com.amazonaws.s3#SSEKMSKeyId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>If present, indicates the ID of the KMS key that was used for object encryption.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption-aws-kms-key-id\"\n          }\n        },\n        \"BucketKeyEnabled\": {\n          \"target\": \"com.amazonaws.s3#BucketKeyEnabled\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Indicates whether the multipart upload uses an S3 Bucket Key for server-side encryption with\\n      Key Management Service (KMS) keys (SSE-KMS).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption-bucket-key-enabled\"\n          }\n        },\n        \"RequestCharged\": {\n          \"target\": \"com.amazonaws.s3#RequestCharged\",\n          \"traits\": {\n            \"smithy.api#httpHeader\": \"x-amz-request-charged\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#output\": {},\n        \"smithy.api#xmlName\": \"CompleteMultipartUploadResult\"\n      }\n    },\n    \"com.amazonaws.s3#CompleteMultipartUploadRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Name of the bucket to which the multipart upload was initiated.</p>\\n         <p>\\n            <b>Directory buckets</b> - When you use this operation with a directory bucket, you must use virtual-hosted-style requests in the format <code>\\n               <i>Bucket-name</i>.s3express-<i>zone-id</i>.<i>region-code</i>.amazonaws.com</code>. Path-style requests are not supported.  Directory bucket names must be unique in the chosen Zone (Availability Zone or Local Zone). Bucket names must follow the format <code>\\n               <i>bucket-base-name</i>--<i>zone-id</i>--x-s3</code> (for example, <code>\\n               <i>amzn-s3-demo-bucket</i>--<i>usw2-az1</i>--x-s3</code>). For information about bucket naming\\n         restrictions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-bucket-naming-rules.html\\\">Directory bucket naming\\n            rules</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <p>\\n            <b>Access points</b> - When you use this action with an access point for general purpose buckets, you must provide the alias of the access point in place of the bucket name or specify the access point ARN. When you use this action with an access point for directory buckets, you must provide the access point name in place of the bucket name. When using the access point ARN, you must direct requests to the access point hostname. The access point hostname takes the form <i>AccessPointName</i>-<i>AccountId</i>.s3-accesspoint.<i>Region</i>.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html\\\">Using access points</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <note>\\n            <p>Object Lambda access points are not supported by directory buckets.</p>\\n         </note>\\n         <p>\\n            <b>S3 on Outposts</b> - When you use this action with S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the \\n                     form <code>\\n               <i>AccessPointName</i>-<i>AccountId</i>.<i>outpostID</i>.s3-outposts.<i>Region</i>.amazonaws.com</code>. When you use this action with S3 on Outposts, the destination bucket must be the Outposts access point ARN or the access point alias. For more information about S3 on Outposts, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html\\\">What is S3 on Outposts?</a> in the <i>Amazon S3 User Guide</i>.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"Key\": {\n          \"target\": \"com.amazonaws.s3#ObjectKey\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Object key for which the multipart upload was initiated.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Key\"\n            }\n          }\n        },\n        \"MultipartUpload\": {\n          \"target\": \"com.amazonaws.s3#CompletedMultipartUpload\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The container for the multipart upload request information.</p>\",\n            \"smithy.api#httpPayload\": {},\n            \"smithy.api#xmlName\": \"CompleteMultipartUpload\"\n          }\n        },\n        \"UploadId\": {\n          \"target\": \"com.amazonaws.s3#MultipartUploadId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>ID for the initiated multipart upload.</p>\",\n            \"smithy.api#httpQuery\": \"uploadId\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"ChecksumCRC32\": {\n          \"target\": \"com.amazonaws.s3#ChecksumCRC32\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>This header can be used as a data integrity check to verify that the data received is the same data that was originally sent.\\n    This header specifies the Base64 encoded, 32-bit <code>CRC32</code> checksum of the object. For more information, see\\n    <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking object integrity</a> in the\\n    <i>Amazon S3 User Guide</i>.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-checksum-crc32\"\n          }\n        },\n        \"ChecksumCRC32C\": {\n          \"target\": \"com.amazonaws.s3#ChecksumCRC32C\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>This header can be used as a data integrity check to verify that the data received is the same data that was originally sent.\\n    This header specifies the Base64 encoded, 32-bit <code>CRC32C</code> checksum of the object. For more information, see\\n    <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking object integrity</a> in the\\n    <i>Amazon S3 User Guide</i>.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-checksum-crc32c\"\n          }\n        },\n        \"ChecksumCRC64NVME\": {\n          \"target\": \"com.amazonaws.s3#ChecksumCRC64NVME\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>This header can be used as a data integrity check to verify that the data received is the same data\\n      that was originally sent. This header specifies the Base64 encoded, 64-bit <code>CRC64NVME</code>\\n      checksum of the object. The <code>CRC64NVME</code> checksum is always a full object checksum. For more\\n      information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking object integrity in the Amazon S3\\n        User Guide</a>.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-checksum-crc64nvme\"\n          }\n        },\n        \"ChecksumSHA1\": {\n          \"target\": \"com.amazonaws.s3#ChecksumSHA1\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>This header can be used as a data integrity check to verify that the data received is the same data that was originally sent.\\n    This header specifies the Base64 encoded, 160-bit <code>SHA1</code> digest of the object. For more information, see\\n    <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking object integrity</a> in the\\n    <i>Amazon S3 User Guide</i>.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-checksum-sha1\"\n          }\n        },\n        \"ChecksumSHA256\": {\n          \"target\": \"com.amazonaws.s3#ChecksumSHA256\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>This header can be used as a data integrity check to verify that the data received is the same data that was originally sent.\\n    This header specifies the Base64 encoded, 256-bit <code>SHA256</code> digest of the object. For more information, see\\n    <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking object integrity</a> in the\\n    <i>Amazon S3 User Guide</i>.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-checksum-sha256\"\n          }\n        },\n        \"ChecksumType\": {\n          \"target\": \"com.amazonaws.s3#ChecksumType\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>This header specifies the checksum type of the object, which determines how part-level checksums are\\n      combined to create an object-level checksum for multipart objects. You can use this header as a data\\n      integrity check to verify that the checksum type that is received is the same checksum that was\\n      specified. If the checksum type doesn’t match the checksum type that was specified for the object during\\n      the <code>CreateMultipartUpload</code> request, it’ll result in a <code>BadDigest</code> error. For more\\n      information, see Checking object integrity in the Amazon S3 User Guide. </p>\",\n            \"smithy.api#httpHeader\": \"x-amz-checksum-type\"\n          }\n        },\n        \"MpuObjectSize\": {\n          \"target\": \"com.amazonaws.s3#MpuObjectSize\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p> The expected total object size of the multipart upload request. If there’s a mismatch between the\\n      specified object size value and the actual object size value, it results in an <code>HTTP 400\\n        InvalidRequest</code> error. </p>\",\n            \"smithy.api#httpHeader\": \"x-amz-mp-object-size\"\n          }\n        },\n        \"RequestPayer\": {\n          \"target\": \"com.amazonaws.s3#RequestPayer\",\n          \"traits\": {\n            \"smithy.api#httpHeader\": \"x-amz-request-payer\"\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        },\n        \"IfMatch\": {\n          \"target\": \"com.amazonaws.s3#IfMatch\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Uploads the object only if the ETag (entity tag) value provided during the WRITE operation matches\\n      the ETag of the object in S3. If the ETag values do not match, the operation returns a <code>412\\n        Precondition Failed</code> error.</p>\\n         <p>If a conflicting operation occurs during the upload S3 returns a <code>409\\n        ConditionalRequestConflict</code> response. On a 409 failure you should fetch the object's ETag,\\n      re-initiate the multipart upload with <code>CreateMultipartUpload</code>, and re-upload each\\n      part.</p>\\n         <p>Expects the ETag value as a string.</p>\\n         <p>For more information about conditional requests, see <a href=\\\"https://tools.ietf.org/html/rfc7232\\\">RFC 7232</a>, or <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/conditional-requests.html\\\">Conditional requests</a> in the\\n        <i>Amazon S3 User Guide</i>.</p>\",\n            \"smithy.api#httpHeader\": \"If-Match\"\n          }\n        },\n        \"IfNoneMatch\": {\n          \"target\": \"com.amazonaws.s3#IfNoneMatch\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Uploads the object only if the object key name does not already exist in the bucket specified.\\n      Otherwise, Amazon S3 returns a <code>412 Precondition Failed</code> error.</p>\\n         <p>If a conflicting operation occurs during the upload S3 returns a <code>409\\n        ConditionalRequestConflict</code> response. On a 409 failure you should re-initiate the multipart\\n      upload with <code>CreateMultipartUpload</code> and re-upload each part.</p>\\n         <p>Expects the '*' (asterisk) character.</p>\\n         <p>For more information about conditional requests, see <a href=\\\"https://tools.ietf.org/html/rfc7232\\\">RFC 7232</a>, or <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/conditional-requests.html\\\">Conditional requests</a> in the\\n        <i>Amazon S3 User Guide</i>.</p>\",\n            \"smithy.api#httpHeader\": \"If-None-Match\"\n          }\n        },\n        \"SSECustomerAlgorithm\": {\n          \"target\": \"com.amazonaws.s3#SSECustomerAlgorithm\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The server-side encryption (SSE) algorithm used to encrypt the object. This parameter is required\\n      only when the object was created using a checksum algorithm or if your bucket policy requires the use of\\n      SSE-C. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/ServerSideEncryptionCustomerKeys.html#ssec-require-condition-key\\\">Protecting data using SSE-C keys</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption-customer-algorithm\"\n          }\n        },\n        \"SSECustomerKey\": {\n          \"target\": \"com.amazonaws.s3#SSECustomerKey\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The server-side encryption (SSE) customer managed key. This parameter is needed only when the object was created using a checksum algorithm. \\n    For more information, see\\n    <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/ServerSideEncryptionCustomerKeys.html\\\">Protecting data using SSE-C keys</a> in the\\n    <i>Amazon S3 User Guide</i>.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption-customer-key\"\n          }\n        },\n        \"SSECustomerKeyMD5\": {\n          \"target\": \"com.amazonaws.s3#SSECustomerKeyMD5\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The MD5 server-side encryption (SSE) customer managed key. This parameter is needed only when the object was created using a checksum \\n    algorithm. For more information,\\n    see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/ServerSideEncryptionCustomerKeys.html\\\">Protecting data using SSE-C keys</a> in the\\n    <i>Amazon S3 User Guide</i>.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption-customer-key-MD5\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#CompletedMultipartUpload\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Parts\": {\n          \"target\": \"com.amazonaws.s3#CompletedPartList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Array of CompletedPart data types.</p>\\n         <p>If you do not supply a valid <code>Part</code> with your request, the service sends back an HTTP 400\\n      response.</p>\",\n            \"smithy.api#xmlFlattened\": {},\n            \"smithy.api#xmlName\": \"Part\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>The container for the completed multipart upload details.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#CompletedPart\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"ETag\": {\n          \"target\": \"com.amazonaws.s3#ETag\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Entity tag returned when the part was uploaded.</p>\"\n          }\n        },\n        \"ChecksumCRC32\": {\n          \"target\": \"com.amazonaws.s3#ChecksumCRC32\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Base64 encoded, 32-bit <code>CRC32</code> checksum of the part. This checksum is present if the\\n      multipart upload request was created with the <code>CRC32</code> checksum algorithm. For more\\n      information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking object integrity</a> in\\n      the <i>Amazon S3 User Guide</i>.</p>\"\n          }\n        },\n        \"ChecksumCRC32C\": {\n          \"target\": \"com.amazonaws.s3#ChecksumCRC32C\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Base64 encoded, 32-bit <code>CRC32C</code> checksum of the part. This checksum is present if the\\n      multipart upload request was created with the <code>CRC32C</code> checksum algorithm. For more\\n      information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking object integrity</a> in\\n      the <i>Amazon S3 User Guide</i>.</p>\"\n          }\n        },\n        \"ChecksumCRC64NVME\": {\n          \"target\": \"com.amazonaws.s3#ChecksumCRC64NVME\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Base64 encoded, 64-bit <code>CRC64NVME</code> checksum of the part. This checksum is present if\\n      the multipart upload request was created with the <code>CRC64NVME</code> checksum algorithm to the\\n      uploaded object). For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking object integrity</a> in\\n      the <i>Amazon S3 User Guide</i>.</p>\"\n          }\n        },\n        \"ChecksumSHA1\": {\n          \"target\": \"com.amazonaws.s3#ChecksumSHA1\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Base64 encoded, 160-bit <code>SHA1</code> checksum of the part. This checksum is present if the\\n      multipart upload request was created with the <code>SHA1</code> checksum algorithm. For more\\n      information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking object integrity</a> in\\n      the <i>Amazon S3 User Guide</i>.</p>\"\n          }\n        },\n        \"ChecksumSHA256\": {\n          \"target\": \"com.amazonaws.s3#ChecksumSHA256\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Base64 encoded, 256-bit <code>SHA256</code> checksum of the part. This checksum is present if\\n      the multipart upload request was created with the <code>SHA256</code> checksum algorithm. For more\\n      information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking object integrity</a> in\\n      the <i>Amazon S3 User Guide</i>.</p>\"\n          }\n        },\n        \"PartNumber\": {\n          \"target\": \"com.amazonaws.s3#PartNumber\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Part number that identifies the part. This is a positive integer between 1 and 10,000.</p>\\n         <note>\\n            <ul>\\n               <li>\\n                  <p>\\n                     <b>General purpose buckets</b> - In\\n              <code>CompleteMultipartUpload</code>, when a additional checksum (including\\n              <code>x-amz-checksum-crc32</code>, <code>x-amz-checksum-crc32c</code>,\\n              <code>x-amz-checksum-sha1</code>, or <code>x-amz-checksum-sha256</code>) is applied to each\\n            part, the <code>PartNumber</code> must start at 1 and the part numbers must be consecutive.\\n            Otherwise, Amazon S3 generates an HTTP <code>400 Bad Request</code> status code and an\\n              <code>InvalidPartOrder</code> error code.</p>\\n               </li>\\n               <li>\\n                  <p>\\n                     <b>Directory buckets</b> - In\\n              <code>CompleteMultipartUpload</code>, the <code>PartNumber</code> must start at 1 and the part\\n            numbers must be consecutive.</p>\\n               </li>\\n            </ul>\\n         </note>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Details of the parts that were uploaded.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#CompletedPartList\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.s3#CompletedPart\"\n      }\n    },\n    \"com.amazonaws.s3#CompressionType\": {\n      \"type\": \"enum\",\n      \"members\": {\n        \"NONE\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"NONE\"\n          }\n        },\n        \"GZIP\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"GZIP\"\n          }\n        },\n        \"BZIP2\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"BZIP2\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#Condition\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"HttpErrorCodeReturnedEquals\": {\n          \"target\": \"com.amazonaws.s3#HttpErrorCodeReturnedEquals\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The HTTP error code when the redirect is applied. In the event of an error, if the error code equals\\n      this value, then the specified redirect is applied. Required when parent element <code>Condition</code>\\n      is specified and sibling <code>KeyPrefixEquals</code> is not specified. If both are specified, then both\\n      must be true for the redirect to be applied.</p>\"\n          }\n        },\n        \"KeyPrefixEquals\": {\n          \"target\": \"com.amazonaws.s3#KeyPrefixEquals\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The object key name prefix when the redirect is applied. For example, to redirect requests for\\n        <code>ExamplePage.html</code>, the key prefix will be <code>ExamplePage.html</code>. To redirect\\n      request for all pages with the prefix <code>docs/</code>, the key prefix will be <code>/docs</code>,\\n      which identifies all objects in the <code>docs/</code> folder. Required when the parent element\\n        <code>Condition</code> is specified and sibling <code>HttpErrorCodeReturnedEquals</code> is not\\n      specified. If both conditions are specified, both must be true for the redirect to be applied.</p>\\n         <important>\\n            <p>Replacement must be made for object keys containing special characters (such as carriage returns) when using \\n         XML requests. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-keys.html#object-key-xml-related-constraints\\\">\\n            XML related object key constraints</a>.</p>\\n         </important>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>A container for describing a condition that must be met for the specified redirect to apply. For\\n      example, 1. If request is for pages in the <code>/docs</code> folder, redirect to the\\n        <code>/documents</code> folder. 2. If request results in HTTP error 4xx, redirect request to another\\n      host where you might process the error.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#ConfirmRemoveSelfBucketAccess\": {\n      \"type\": \"boolean\"\n    },\n    \"com.amazonaws.s3#ContentDisposition\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#ContentEncoding\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#ContentLanguage\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#ContentLength\": {\n      \"type\": \"long\"\n    },\n    \"com.amazonaws.s3#ContentMD5\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#ContentRange\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#ContentType\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#ContinuationEvent\": {\n      \"type\": \"structure\",\n      \"members\": {},\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p></p>\"\n      }\n    },\n    \"com.amazonaws.s3#CopyObject\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#CopyObjectRequest\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.s3#CopyObjectOutput\"\n      },\n      \"errors\": [\n        {\n          \"target\": \"com.amazonaws.s3#ObjectNotInActiveTierError\"\n        }\n      ],\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Creates a copy of an object that is already stored in Amazon S3.</p>\\n         <important>\\n            <p>End of support notice: As of October 1, 2025, Amazon S3 has discontinued support for Email Grantee Access Control Lists (ACLs). If you attempt to use an Email Grantee ACL in a request after October 1, 2025, \\n the request will receive an <code>HTTP 405</code> (Method Not Allowed) error.</p>\\n            <p>This change affects the following Amazon Web Services Regions: US East (N. Virginia), US West (N. California), US West (Oregon), Asia Pacific (Singapore), Asia Pacific (Sydney), Asia Pacific (Tokyo), Europe (Ireland), and South America (São Paulo).</p>\\n         </important>\\n         <note>\\n            <p>You can store individual objects of up to 50 TB in Amazon S3. You create a copy of your\\n        object up to 5 GB in size in a single atomic action using this API. However, to copy an\\n        object greater than 5 GB, you must use the multipart upload Upload Part - Copy\\n        (UploadPartCopy) API. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/CopyingObjctsUsingRESTMPUapi.html\\\">Copy Object Using the REST\\n          Multipart Upload API</a>.</p>\\n         </note>\\n         <p>You can copy individual objects between general purpose buckets, between directory buckets, and between\\n      general purpose buckets and directory buckets.</p>\\n         <note>\\n            <ul>\\n               <li>\\n                  <p>Amazon S3 supports copy operations using Multi-Region Access Points only as a destination when\\n            using the Multi-Region Access Point ARN. </p>\\n               </li>\\n               <li>\\n                  <p>\\n                     <b>Directory buckets </b> - For directory buckets, you must make requests for this API operation to the Zonal endpoint. These endpoints support virtual-hosted-style requests in the format <code>https://<i>amzn-s3-demo-bucket</i>.s3express-<i>zone-id</i>.<i>region-code</i>.amazonaws.com/<i>key-name</i>\\n                     </code>. Path-style requests are not supported. For more information about endpoints in Availability Zones, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/endpoint-directory-buckets-AZ.html\\\">Regional and Zonal endpoints for directory buckets in Availability Zones</a> in the\\n    <i>Amazon S3 User Guide</i>. For more information about endpoints in Local Zones, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-lzs-for-directory-buckets.html\\\">Concepts for directory buckets in Local Zones</a> in the\\n    <i>Amazon S3 User Guide</i>.</p>\\n               </li>\\n               <li>\\n                  <p>VPC endpoints don't support cross-Region requests (including copies). If you're using VPC\\n            endpoints, your source and destination buckets should be in the same Amazon Web Services Region as your VPC\\n            endpoint.</p>\\n               </li>\\n            </ul>\\n         </note>\\n         <p>Both the Region that you want to copy the object from and the Region that you want to copy the\\n      object to must be enabled for your account. For more information about how to enable a Region for your\\n      account, see <a href=\\\"https://docs.aws.amazon.com/accounts/latest/reference/manage-acct-regions.html#manage-acct-regions-enable-standalone\\\">Enable\\n        or disable a Region for standalone accounts</a> in the <i>Amazon Web Services Account Management\\n        Guide</i>.</p>\\n         <important>\\n            <p>Amazon S3 transfer acceleration does not support cross-Region copies. If you request a cross-Region\\n        copy using a transfer acceleration endpoint, you get a <code>400 Bad Request</code> error. For more\\n        information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/transfer-acceleration.html\\\">Transfer Acceleration</a>.</p>\\n         </important>\\n         <dl>\\n            <dt>Authentication and authorization</dt>\\n            <dd>\\n               <p>All <code>CopyObject</code> requests must be authenticated and signed by using IAM\\n            credentials (access key ID and secret access key for the IAM identities). All headers with the\\n              <code>x-amz-</code> prefix, including <code>x-amz-copy-source</code>, must be signed. For more\\n            information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html\\\">REST Authentication</a>.</p>\\n               <p>\\n                  <b>Directory buckets</b> - You must use the IAM\\n            credentials to authenticate and authorize your access to the <code>CopyObject</code> API\\n            operation, instead of using the temporary security credentials through the\\n              <code>CreateSession</code> API operation.</p>\\n               <p>Amazon Web Services CLI or SDKs handles authentication and authorization on your behalf.</p>\\n            </dd>\\n            <dt>Permissions</dt>\\n            <dd>\\n               <p>You must have <i>read</i> access to the source object and\\n              <i>write</i> access to the destination bucket.</p>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <b>General purpose bucket permissions</b> - You must have\\n                permissions in an IAM policy based on the source and destination bucket types in a\\n                  <code>CopyObject</code> operation.</p>\\n                     <ul>\\n                        <li>\\n                           <p>If the source object is in a general purpose bucket, you must have <b>\\n                                 <code>s3:GetObject</code>\\n                              </b> permission to read the source object that is\\n                    being copied. </p>\\n                        </li>\\n                        <li>\\n                           <p>If the destination bucket is a general purpose bucket, you must have <b>\\n                                 <code>s3:PutObject</code>\\n                              </b> permission to write the object copy to the\\n                    destination bucket. </p>\\n                        </li>\\n                     </ul>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <b>Directory bucket permissions</b> - You must have\\n                permissions in a bucket policy or an IAM identity-based policy based on the source and destination bucket types\\n                in a <code>CopyObject</code> operation.</p>\\n                     <ul>\\n                        <li>\\n                           <p>If the source object that you want to copy is in a directory bucket, you must have\\n                    the <b>\\n                                 <code>s3express:CreateSession</code>\\n                              </b> permission in\\n                    the <code>Action</code> element of a policy to read the object. By default, the session is\\n                    in the <code>ReadWrite</code> mode. If you want to restrict the access, you can explicitly\\n                    set the <code>s3express:SessionMode</code> condition key to <code>ReadOnly</code> on the\\n                    copy source bucket.</p>\\n                        </li>\\n                        <li>\\n                           <p>If the copy destination is a directory bucket, you must have the <b>\\n                                 <code>s3express:CreateSession</code>\\n                              </b> permission in the\\n                      <code>Action</code> element of a policy to write the object to the destination. The\\n                      <code>s3express:SessionMode</code> condition key can't be set to <code>ReadOnly</code>\\n                    on the copy destination bucket. </p>\\n                        </li>\\n                     </ul>\\n                     <p>If the object is encrypted with SSE-KMS, you must also have the\\n                  <code>kms:GenerateDataKey</code> and <code>kms:Decrypt</code> permissions in IAM\\n                identity-based policies and KMS key policies for the KMS key.</p>\\n                     <p>For example policies, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-security-iam-example-bucket-policies.html\\\">Example\\n                  bucket policies for S3 Express One Zone</a> and <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-security-iam-identity-policies.html\\\">Amazon Web Services\\n                  Identity and Access Management (IAM) identity-based policies for S3 Express One Zone</a> in the\\n                  <i>Amazon S3 User Guide</i>.</p>\\n                  </li>\\n               </ul>\\n            </dd>\\n            <dt>Response and special errors</dt>\\n            <dd>\\n               <p>When the request is an HTTP 1.1 request, the response is chunk encoded. When the request is\\n            not an HTTP 1.1 request, the response would not contain the <code>Content-Length</code>. You\\n            always need to read the entire response body to check if the copy succeeds. </p>\\n               <ul>\\n                  <li>\\n                     <p>If the copy is successful, you receive a response with information about the copied\\n                object.</p>\\n                  </li>\\n                  <li>\\n                     <p>A copy request might return an error when Amazon S3 receives the copy request or while Amazon S3 is\\n                copying the files. A <code>200 OK</code> response can contain either a success or an\\n                error.</p>\\n                     <ul>\\n                        <li>\\n                           <p>If the error occurs before the copy action starts, you receive a standard Amazon S3\\n                    error.</p>\\n                        </li>\\n                        <li>\\n                           <p>If the error occurs during the copy operation, the error response is embedded in the\\n                      <code>200 OK</code> response. For example, in a cross-region copy, you may encounter\\n                    throttling and receive a <code>200 OK</code> response. For more information, see <a href=\\\"https://repost.aws/knowledge-center/s3-resolve-200-internalerror\\\">Resolve the Error\\n                      200 response when copying objects to Amazon S3</a>. The <code>200 OK</code> status code\\n                    means the copy was accepted, but it doesn't mean the copy is complete. Another example is\\n                    when you disconnect from Amazon S3 before the copy is complete, Amazon S3 might cancel the copy and\\n                    you may receive a <code>200 OK</code> response. You must stay connected to Amazon S3 until the\\n                    entire response is successfully received and processed.</p>\\n                           <p>If you call this API operation directly, make sure to design your application to parse\\n                    the content of the response and handle it appropriately. If you use Amazon Web Services SDKs, SDKs\\n                    handle this condition. The SDKs detect the embedded error and apply error handling per\\n                    your configuration settings (including automatically retrying the request as appropriate).\\n                    If the condition persists, the SDKs throw an exception (or, for the SDKs that don't use\\n                    exceptions, they return an error).</p>\\n                        </li>\\n                     </ul>\\n                  </li>\\n               </ul>\\n            </dd>\\n            <dt>Charge</dt>\\n            <dd>\\n               <p>The copy request charge is based on the storage class and Region that you specify for the\\n            destination object. The request can also result in a data retrieval charge for the source if the\\n            source storage class bills for data retrieval. If the copy source is in a different region, the\\n            data transfer is billed to the copy source account. For pricing information, see <a href=\\\"http://aws.amazon.com/s3/pricing/\\\">Amazon S3 pricing</a>.</p>\\n            </dd>\\n            <dt>HTTP Host header syntax</dt>\\n            <dd>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <b>Directory buckets </b> - The HTTP Host header syntax is <code>\\n                           <i>Bucket-name</i>.s3express-<i>zone-id</i>.<i>region-code</i>.amazonaws.com</code>.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <b>Amazon S3 on Outposts</b> - When you use this action with\\n                S3 on Outposts through the REST API, you must direct requests to the S3 on Outposts hostname. The\\n                S3 on Outposts hostname takes the form\\n                    <code>\\n                           <i>AccessPointName</i>-<i>AccountId</i>.<i>outpostID</i>.s3-outposts.<i>Region</i>.amazonaws.com</code>.\\n                The hostname isn't required when you use the Amazon Web Services CLI or SDKs.</p>\\n                  </li>\\n               </ul>\\n            </dd>\\n         </dl>\\n         <p>The following operations are related to <code>CopyObject</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html\\\">PutObject</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html\\\">GetObject</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#examples\": [\n          {\n            \"title\": \"To copy an object\",\n            \"documentation\": \"The following example copies an object from one bucket to another.\",\n            \"input\": {\n              \"Bucket\": \"destinationbucket\",\n              \"CopySource\": \"/sourcebucket/HappyFacejpg\",\n              \"Key\": \"HappyFaceCopyjpg\"\n            },\n            \"output\": {\n              \"CopyObjectResult\": {\n                \"LastModified\": \"2016-12-15T17:38:53.000Z\",\n                \"ETag\": \"\\\"6805f2cfc46c0f04559748bb039d69ae\\\"\"\n              }\n            }\n          }\n        ],\n        \"smithy.api#http\": {\n          \"method\": \"PUT\",\n          \"uri\": \"/{Bucket}/{Key+}?x-id=CopyObject\",\n          \"code\": 200\n        },\n        \"smithy.rules#staticContextParams\": {\n          \"DisableS3ExpressSessionAuth\": {\n            \"value\": true\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#CopyObjectOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"CopyObjectResult\": {\n          \"target\": \"com.amazonaws.s3#CopyObjectResult\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Container for all response elements.</p>\",\n            \"smithy.api#httpPayload\": {}\n          }\n        },\n        \"Expiration\": {\n          \"target\": \"com.amazonaws.s3#Expiration\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>If the object expiration is configured, the response includes this header.</p>\\n         <note>\\n            <p>Object expiration information is not returned in directory buckets and this header returns the\\n        value \\\"<code>NotImplemented</code>\\\" in all responses for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-expiration\"\n          }\n        },\n        \"CopySourceVersionId\": {\n          \"target\": \"com.amazonaws.s3#CopySourceVersionId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Version ID of the source object that was copied.</p>\\n         <note>\\n            <p>This functionality is not supported when the source object is in a directory bucket.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-copy-source-version-id\"\n          }\n        },\n        \"VersionId\": {\n          \"target\": \"com.amazonaws.s3#ObjectVersionId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Version ID of the newly created copy.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-version-id\"\n          }\n        },\n        \"ServerSideEncryption\": {\n          \"target\": \"com.amazonaws.s3#ServerSideEncryption\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The server-side encryption algorithm used when you store this object in Amazon S3 or Amazon FSx.</p>\\n         <note>\\n            <p>When accessing data stored in Amazon FSx file systems using S3 access points, the only valid server side\\n        encryption option is <code>aws:fsx</code>.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption\"\n          }\n        },\n        \"SSECustomerAlgorithm\": {\n          \"target\": \"com.amazonaws.s3#SSECustomerAlgorithm\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>If server-side encryption with a customer-provided encryption key was requested, the response will\\n      include this header to confirm the encryption algorithm that's used.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption-customer-algorithm\"\n          }\n        },\n        \"SSECustomerKeyMD5\": {\n          \"target\": \"com.amazonaws.s3#SSECustomerKeyMD5\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>If server-side encryption with a customer-provided encryption key was requested, the response will\\n      include this header to provide the round-trip message integrity verification of the customer-provided\\n      encryption key.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption-customer-key-MD5\"\n          }\n        },\n        \"SSEKMSKeyId\": {\n          \"target\": \"com.amazonaws.s3#SSEKMSKeyId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>If present, indicates the ID of the KMS key that was used for object encryption.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption-aws-kms-key-id\"\n          }\n        },\n        \"SSEKMSEncryptionContext\": {\n          \"target\": \"com.amazonaws.s3#SSEKMSEncryptionContext\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>If present, indicates the Amazon Web Services KMS Encryption Context to use for object encryption. The value of\\n      this header is a Base64 encoded UTF-8 string holding JSON with the encryption context key-value\\n      pairs.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption-context\"\n          }\n        },\n        \"BucketKeyEnabled\": {\n          \"target\": \"com.amazonaws.s3#BucketKeyEnabled\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Indicates whether the copied object uses an S3 Bucket Key for server-side encryption with Key Management Service\\n      (KMS) keys (SSE-KMS).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption-bucket-key-enabled\"\n          }\n        },\n        \"RequestCharged\": {\n          \"target\": \"com.amazonaws.s3#RequestCharged\",\n          \"traits\": {\n            \"smithy.api#httpHeader\": \"x-amz-request-charged\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#output\": {}\n      }\n    },\n    \"com.amazonaws.s3#CopyObjectRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"ACL\": {\n          \"target\": \"com.amazonaws.s3#ObjectCannedACL\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The canned access control list (ACL) to apply to the object.</p>\\n         <p>When you copy an object, the ACL metadata is not preserved and is set to <code>private</code> by\\n      default. Only the owner has full access control. To override the default ACL setting, specify a new ACL\\n      when you generate a copy request. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/S3_ACLs_UsingACLs.html\\\">Using ACLs</a>. </p>\\n         <p>If the destination bucket that you're copying objects to uses the bucket owner enforced setting for\\n      S3 Object Ownership, ACLs are disabled and no longer affect permissions. Buckets that use this setting\\n      only accept <code>PUT</code> requests that don't specify an ACL or <code>PUT</code> requests that\\n      specify bucket owner full control ACLs, such as the <code>bucket-owner-full-control</code> canned ACL or\\n      an equivalent form of this ACL expressed in the XML format. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/about-object-ownership.html\\\">Controlling ownership\\n        of objects and disabling ACLs</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <note>\\n            <ul>\\n               <li>\\n                  <p>If your destination bucket uses the bucket owner enforced setting for Object Ownership, all\\n            objects written to the bucket by any account will be owned by the bucket owner.</p>\\n               </li>\\n               <li>\\n                  <p>This functionality is not supported for directory buckets.</p>\\n               </li>\\n               <li>\\n                  <p>This functionality is not supported for Amazon S3 on Outposts.</p>\\n               </li>\\n            </ul>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-acl\"\n          }\n        },\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the destination bucket.</p>\\n         <p>\\n            <b>Directory buckets</b> - When you use this operation with a directory bucket, you must use virtual-hosted-style requests in the format <code>\\n               <i>Bucket-name</i>.s3express-<i>zone-id</i>.<i>region-code</i>.amazonaws.com</code>. Path-style requests are not supported.  Directory bucket names must be unique in the chosen Zone (Availability Zone or Local Zone). Bucket names must follow the format <code>\\n               <i>bucket-base-name</i>--<i>zone-id</i>--x-s3</code> (for example, <code>\\n               <i>amzn-s3-demo-bucket</i>--<i>usw2-az1</i>--x-s3</code>). For information about bucket naming\\n         restrictions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-bucket-naming-rules.html\\\">Directory bucket naming\\n            rules</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <note>\\n            <p>Copying objects across different Amazon Web Services Regions isn't supported when the source or destination\\n        bucket is in Amazon Web Services Local Zones. The source and destination buckets must have the same parent Amazon Web Services Region.\\n        Otherwise, you get an HTTP <code>400 Bad Request</code> error with the error code\\n          <code>InvalidRequest</code>.</p>\\n         </note>\\n         <p>\\n            <b>Access points</b> - When you use this action with an access point for general purpose buckets, you must provide the alias of the access point in place of the bucket name or specify the access point ARN. When you use this action with an access point for directory buckets, you must provide the access point name in place of the bucket name. When using the access point ARN, you must direct requests to the access point hostname. The access point hostname takes the form <i>AccessPointName</i>-<i>AccountId</i>.s3-accesspoint.<i>Region</i>.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html\\\">Using access points</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <note>\\n            <p>Object Lambda access points are not supported by directory buckets.</p>\\n         </note>\\n         <p>\\n            <b>S3 on Outposts</b> - When you use this action with S3 on Outposts,\\n      you must use the Outpost bucket access point ARN or the access point alias for the destination bucket.\\n      You can only copy objects within the same Outpost bucket. It's not supported to copy objects across\\n      different Amazon Web Services Outposts, between buckets on the same Outposts, or between Outposts buckets and any\\n      other bucket types. For more information about S3 on Outposts, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html\\\">What is S3 on Outposts?</a> in the\\n        <i>S3 on Outposts guide</i>. When you use this action with S3 on Outposts through the REST\\n      API, you must direct requests to the S3 on Outposts hostname, in the format\\n          <code>\\n               <i>AccessPointName</i>-<i>AccountId</i>.<i>outpostID</i>.s3-outposts.<i>Region</i>.amazonaws.com</code>.\\n      The hostname isn't required when you use the Amazon Web Services CLI or SDKs. </p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"CacheControl\": {\n          \"target\": \"com.amazonaws.s3#CacheControl\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the caching behavior along the request/reply chain.</p>\",\n            \"smithy.api#httpHeader\": \"Cache-Control\"\n          }\n        },\n        \"ChecksumAlgorithm\": {\n          \"target\": \"com.amazonaws.s3#ChecksumAlgorithm\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Indicates the algorithm that you want Amazon S3 to use to create the checksum for the object. For more information, see\\n    <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking object integrity</a> in\\n    the <i>Amazon S3 User Guide</i>.</p>\\n         <p>When you copy an object, if the source object has a checksum, that checksum value will be copied to\\n      the new object by default. If the <code>CopyObject</code> request does not include this\\n        <code>x-amz-checksum-algorithm</code> header, the checksum algorithm will be copied from the source\\n      object to the destination object (if it's present on the source object). You can optionally specify a\\n      different checksum algorithm to use with the <code>x-amz-checksum-algorithm</code> header. Unrecognized\\n      or unsupported values will respond with the HTTP status code <code>400 Bad Request</code>.</p>\\n         <note>\\n            <p>For directory buckets, when you use Amazon Web Services SDKs, <code>CRC32</code> is the default checksum algorithm that's used for performance.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-checksum-algorithm\"\n          }\n        },\n        \"ContentDisposition\": {\n          \"target\": \"com.amazonaws.s3#ContentDisposition\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies presentational information for the object. Indicates whether an object should be displayed\\n      in a web browser or downloaded as a file. It allows specifying the desired filename for the downloaded\\n      file.</p>\",\n            \"smithy.api#httpHeader\": \"Content-Disposition\"\n          }\n        },\n        \"ContentEncoding\": {\n          \"target\": \"com.amazonaws.s3#ContentEncoding\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies what content encodings have been applied to the object and thus what decoding mechanisms\\n      must be applied to obtain the media-type referenced by the Content-Type header field.</p>\\n         <note>\\n            <p>For directory buckets, only the <code>aws-chunked</code> value is supported in this header field.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"Content-Encoding\"\n          }\n        },\n        \"ContentLanguage\": {\n          \"target\": \"com.amazonaws.s3#ContentLanguage\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The language the content is in.</p>\",\n            \"smithy.api#httpHeader\": \"Content-Language\"\n          }\n        },\n        \"ContentType\": {\n          \"target\": \"com.amazonaws.s3#ContentType\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A standard MIME type that describes the format of the object data.</p>\",\n            \"smithy.api#httpHeader\": \"Content-Type\"\n          }\n        },\n        \"CopySource\": {\n          \"target\": \"com.amazonaws.s3#CopySource\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the source object for the copy operation. The source object can be up to 5 GB. If the\\n      source object is an object that was uploaded by using a multipart upload, the object copy will be a\\n      single part object after the source object is copied to the destination bucket.</p>\\n         <p>You specify the value of the copy source in one of two formats, depending on whether you want to\\n      access the source object through an <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-points.html\\\">access point</a>:</p>\\n         <ul>\\n            <li>\\n               <p>For objects not accessed through an access point, specify the name of the source bucket and the key of\\n          the source object, separated by a slash (/). For example, to copy the object\\n            <code>reports/january.pdf</code> from the general purpose bucket <code>awsexamplebucket</code>, use\\n            <code>awsexamplebucket/reports/january.pdf</code>. The value must be URL-encoded. To copy the\\n          object <code>reports/january.pdf</code> from the directory bucket\\n            <code>awsexamplebucket--use1-az5--x-s3</code>, use\\n            <code>awsexamplebucket--use1-az5--x-s3/reports/january.pdf</code>. The value must be\\n          URL-encoded.</p>\\n            </li>\\n            <li>\\n               <p>For objects accessed through access points, specify the Amazon Resource Name (ARN) of the object as accessed through the access point, in the format <code>arn:aws:s3:<Region>:<account-id>:accesspoint/<access-point-name>/object/<key></code>. For example, to copy the object <code>reports/january.pdf</code> through access point <code>my-access-point</code> owned by account <code>123456789012</code> in Region <code>us-west-2</code>, use the URL encoding of <code>arn:aws:s3:us-west-2:123456789012:accesspoint/my-access-point/object/reports/january.pdf</code>. The value must be URL encoded.</p>\\n               <note>\\n                  <ul>\\n                     <li>\\n                        <p>Amazon S3 supports copy operations using Access points only when the source and destination buckets are in the same Amazon Web Services Region.</p>\\n                     </li>\\n                     <li>\\n                        <p>Access points are not supported by directory buckets.</p>\\n                     </li>\\n                  </ul>\\n               </note>\\n               <p>Alternatively, for objects accessed through Amazon S3 on Outposts, specify the ARN of the object as accessed in the format <code>arn:aws:s3-outposts:<Region>:<account-id>:outpost/<outpost-id>/object/<key></code>. For example, to copy the object <code>reports/january.pdf</code> through outpost <code>my-outpost</code> owned by account <code>123456789012</code> in Region <code>us-west-2</code>, use the URL encoding of <code>arn:aws:s3-outposts:us-west-2:123456789012:outpost/my-outpost/object/reports/january.pdf</code>. The value must be URL-encoded.  </p>\\n            </li>\\n         </ul>\\n         <p>If your source bucket versioning is enabled, the <code>x-amz-copy-source</code> header by default\\n      identifies the current version of an object to copy. If the current version is a delete marker, Amazon S3\\n      behaves as if the object was deleted. To copy a different version, use the <code>versionId</code> query\\n      parameter. Specifically, append <code>?versionId=<version-id></code> to the value (for example,\\n        <code>awsexamplebucket/reports/january.pdf?versionId=QUpfdndhfd8438MNFDN93jdnJFkdmqnh893</code>). If\\n      you don't specify a version ID, Amazon S3 copies the latest version of the source object.</p>\\n         <p>If you enable versioning on the destination bucket, Amazon S3 generates a unique version ID for the\\n      copied object. This version ID is different from the version ID of the source object. Amazon S3 returns the\\n      version ID of the copied object in the <code>x-amz-version-id</code> response header in the\\n      response.</p>\\n         <p>If you do not enable versioning or suspend it on the destination bucket, the version ID that Amazon S3\\n      generates in the <code>x-amz-version-id</code> response header is always null.</p>\\n         <note>\\n            <p>\\n               <b>Directory buckets</b> - S3 Versioning isn't enabled and supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-copy-source\",\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"CopySource\"\n            }\n          }\n        },\n        \"CopySourceIfMatch\": {\n          \"target\": \"com.amazonaws.s3#CopySourceIfMatch\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Copies the object if its entity tag (ETag) matches the specified tag.</p>\\n         <p> If both the <code>x-amz-copy-source-if-match</code> and\\n        <code>x-amz-copy-source-if-unmodified-since</code> headers are present in the request and evaluate as\\n      follows, Amazon S3 returns <code>200 OK</code> and copies the data:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>x-amz-copy-source-if-match</code> condition evaluates to true</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>x-amz-copy-source-if-unmodified-since</code> condition evaluates to false</p>\\n            </li>\\n         </ul>\",\n            \"smithy.api#httpHeader\": \"x-amz-copy-source-if-match\"\n          }\n        },\n        \"CopySourceIfModifiedSince\": {\n          \"target\": \"com.amazonaws.s3#CopySourceIfModifiedSince\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Copies the object if it has been modified since the specified time.</p>\\n         <p>If both the <code>x-amz-copy-source-if-none-match</code> and\\n        <code>x-amz-copy-source-if-modified-since</code> headers are present in the request and evaluate as\\n      follows, Amazon S3 returns the <code>412 Precondition Failed</code> response code:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>x-amz-copy-source-if-none-match</code> condition evaluates to false</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>x-amz-copy-source-if-modified-since</code> condition evaluates to true</p>\\n            </li>\\n         </ul>\",\n            \"smithy.api#httpHeader\": \"x-amz-copy-source-if-modified-since\"\n          }\n        },\n        \"CopySourceIfNoneMatch\": {\n          \"target\": \"com.amazonaws.s3#CopySourceIfNoneMatch\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Copies the object if its entity tag (ETag) is different than the specified ETag.</p>\\n         <p>If both the <code>x-amz-copy-source-if-none-match</code> and\\n        <code>x-amz-copy-source-if-modified-since</code> headers are present in the request and evaluate as\\n      follows, Amazon S3 returns the <code>412 Precondition Failed</code> response code:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>x-amz-copy-source-if-none-match</code> condition evaluates to false</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>x-amz-copy-source-if-modified-since</code> condition evaluates to true</p>\\n            </li>\\n         </ul>\",\n            \"smithy.api#httpHeader\": \"x-amz-copy-source-if-none-match\"\n          }\n        },\n        \"CopySourceIfUnmodifiedSince\": {\n          \"target\": \"com.amazonaws.s3#CopySourceIfUnmodifiedSince\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Copies the object if it hasn't been modified since the specified time.</p>\\n         <p> If both the <code>x-amz-copy-source-if-match</code> and\\n        <code>x-amz-copy-source-if-unmodified-since</code> headers are present in the request and evaluate as\\n      follows, Amazon S3 returns <code>200 OK</code> and copies the data:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>x-amz-copy-source-if-match</code> condition evaluates to true</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>x-amz-copy-source-if-unmodified-since</code> condition evaluates to false</p>\\n            </li>\\n         </ul>\",\n            \"smithy.api#httpHeader\": \"x-amz-copy-source-if-unmodified-since\"\n          }\n        },\n        \"Expires\": {\n          \"target\": \"com.amazonaws.s3#Expires\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The date and time at which the object is no longer cacheable.</p>\",\n            \"smithy.api#httpHeader\": \"Expires\"\n          }\n        },\n        \"GrantFullControl\": {\n          \"target\": \"com.amazonaws.s3#GrantFullControl\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Gives the grantee READ, READ_ACP, and WRITE_ACP permissions on the object.</p>\\n         <note>\\n            <ul>\\n               <li>\\n                  <p>This functionality is not supported for directory buckets.</p>\\n               </li>\\n               <li>\\n                  <p>This functionality is not supported for Amazon S3 on Outposts.</p>\\n               </li>\\n            </ul>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-grant-full-control\"\n          }\n        },\n        \"GrantRead\": {\n          \"target\": \"com.amazonaws.s3#GrantRead\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Allows grantee to read the object data and its metadata.</p>\\n         <note>\\n            <ul>\\n               <li>\\n                  <p>This functionality is not supported for directory buckets.</p>\\n               </li>\\n               <li>\\n                  <p>This functionality is not supported for Amazon S3 on Outposts.</p>\\n               </li>\\n            </ul>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-grant-read\"\n          }\n        },\n        \"GrantReadACP\": {\n          \"target\": \"com.amazonaws.s3#GrantReadACP\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Allows grantee to read the object ACL.</p>\\n         <note>\\n            <ul>\\n               <li>\\n                  <p>This functionality is not supported for directory buckets.</p>\\n               </li>\\n               <li>\\n                  <p>This functionality is not supported for Amazon S3 on Outposts.</p>\\n               </li>\\n            </ul>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-grant-read-acp\"\n          }\n        },\n        \"GrantWriteACP\": {\n          \"target\": \"com.amazonaws.s3#GrantWriteACP\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Allows grantee to write the ACL for the applicable object.</p>\\n         <note>\\n            <ul>\\n               <li>\\n                  <p>This functionality is not supported for directory buckets.</p>\\n               </li>\\n               <li>\\n                  <p>This functionality is not supported for Amazon S3 on Outposts.</p>\\n               </li>\\n            </ul>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-grant-write-acp\"\n          }\n        },\n        \"IfMatch\": {\n          \"target\": \"com.amazonaws.s3#IfMatch\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Copies the object if the entity tag (ETag) of the destination object matches the specified\\n      tag. If the ETag values do not match, the operation returns a <code>412 Precondition\\n        Failed</code> error. If a concurrent operation occurs during the upload S3 returns a\\n        <code>409 ConditionalRequestConflict</code> response. On a 409 failure you should fetch the\\n      object's ETag and retry the upload.</p>\\n         <p>Expects the ETag value as a string.</p>\\n         <p>For more information about conditional requests, see <a href=\\\"https://tools.ietf.org/html/rfc7232\\\">RFC 7232</a>.</p>\",\n            \"smithy.api#httpHeader\": \"If-Match\"\n          }\n        },\n        \"IfNoneMatch\": {\n          \"target\": \"com.amazonaws.s3#IfNoneMatch\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Copies the object only if the object key name at the destination does not already exist in\\n      the bucket specified. Otherwise, Amazon S3 returns a <code>412 Precondition Failed</code> error. If a\\n      concurrent operation occurs during the upload S3 returns a <code>409 ConditionalRequestConflict</code>\\n      response. On a 409 failure you should retry the upload.</p>\\n         <p>Expects the '*' (asterisk) character.</p>\\n         <p>For more information about conditional requests, see <a href=\\\"https://tools.ietf.org/html/rfc7232\\\">RFC 7232</a>.</p>\",\n            \"smithy.api#httpHeader\": \"If-None-Match\"\n          }\n        },\n        \"Key\": {\n          \"target\": \"com.amazonaws.s3#ObjectKey\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The key of the destination object.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Key\"\n            }\n          }\n        },\n        \"Metadata\": {\n          \"target\": \"com.amazonaws.s3#Metadata\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A map of metadata to store with the object in S3.</p>\",\n            \"smithy.api#httpPrefixHeaders\": \"x-amz-meta-\"\n          }\n        },\n        \"MetadataDirective\": {\n          \"target\": \"com.amazonaws.s3#MetadataDirective\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies whether the metadata is copied from the source object or replaced with metadata that's\\n      provided in the request. When copying an object, you can preserve all metadata (the default) or specify\\n      new metadata. If this header isn’t specified, <code>COPY</code> is the default behavior. </p>\\n         <p>\\n            <b>General purpose bucket</b> - For general purpose buckets, when you grant\\n      permissions, you can use the <code>s3:x-amz-metadata-directive</code> condition key to enforce certain\\n      metadata behavior when objects are uploaded. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/amazon-s3-policy-keys.html\\\">Amazon S3 condition key examples</a> in the\\n        <i>Amazon S3 User Guide</i>.</p>\\n         <note>\\n            <p>\\n               <code>x-amz-website-redirect-location</code> is unique to each object and is not copied when using\\n        the <code>x-amz-metadata-directive</code> header. To copy the value, you must specify\\n          <code>x-amz-website-redirect-location</code> in the request header.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-metadata-directive\"\n          }\n        },\n        \"TaggingDirective\": {\n          \"target\": \"com.amazonaws.s3#TaggingDirective\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies whether the object tag-set is copied from the source object or replaced with the tag-set\\n      that's provided in the request.</p>\\n         <p>The default value is <code>COPY</code>.</p>\\n         <note>\\n            <p>\\n               <b>Directory buckets</b> - For directory buckets in a <code>CopyObject</code> operation, only the empty tag-set is supported. Any requests that attempt to write non-empty tags into directory buckets will receive a <code>501 Not Implemented</code> status code. \\nWhen the destination bucket is a directory bucket, you will receive a <code>501 Not Implemented</code> response in any of the following situations:</p>\\n            <ul>\\n               <li>\\n                  <p>When you attempt to <code>COPY</code> the tag-set from an S3 source object that has non-empty tags.</p>\\n               </li>\\n               <li>\\n                  <p>When you attempt to <code>REPLACE</code> the tag-set of a source object and set a non-empty value to <code>x-amz-tagging</code>.</p>\\n               </li>\\n               <li>\\n                  <p>When you don't set the <code>x-amz-tagging-directive</code> header and the source object has non-empty tags. This is because the default value of <code>x-amz-tagging-directive</code> is <code>COPY</code>.</p>\\n               </li>\\n            </ul>\\n            <p>Because only the empty tag-set is supported for directory buckets in a <code>CopyObject</code> operation, the following situations are allowed:</p>\\n            <ul>\\n               <li>\\n                  <p>When you attempt to <code>COPY</code> the tag-set from a directory bucket source object that has no tags to a general purpose bucket. It copies an empty tag-set to the destination object.</p>\\n               </li>\\n               <li>\\n                  <p>When you attempt to <code>REPLACE</code> the tag-set of a directory bucket source object and set the <code>x-amz-tagging</code> value of the directory bucket destination object to empty.</p>\\n               </li>\\n               <li>\\n                  <p>When you attempt to <code>REPLACE</code> the tag-set of a general purpose bucket source object that has non-empty tags and set the <code>x-amz-tagging</code> value of the directory bucket destination object to empty.</p>\\n               </li>\\n               <li>\\n                  <p>When you attempt to <code>REPLACE</code> the tag-set of a directory bucket source object and don't set the <code>x-amz-tagging</code> value of the directory bucket destination object. This is because the default value of <code>x-amz-tagging</code> is the empty value.</p>\\n               </li>\\n            </ul>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-tagging-directive\"\n          }\n        },\n        \"ServerSideEncryption\": {\n          \"target\": \"com.amazonaws.s3#ServerSideEncryption\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The server-side encryption algorithm used when storing this object in Amazon S3. Unrecognized or\\n      unsupported values won’t write a destination object and will receive a <code>400 Bad Request</code>\\n      response. </p>\\n         <p>Amazon S3 automatically encrypts all new objects that are copied to an S3 bucket. When copying an object,\\n      if you don't specify encryption information in your copy request, the encryption setting of the target\\n      object is set to the default encryption configuration of the destination bucket. By default, all buckets\\n      have a base level of encryption configuration that uses server-side encryption with Amazon S3 managed keys\\n      (SSE-S3). If the destination bucket has a different default encryption configuration, Amazon S3 uses the\\n      corresponding encryption key to encrypt the target object copy.</p>\\n         <p>With server-side encryption, Amazon S3 encrypts your data as it writes your data to disks in its data\\n      centers and decrypts the data when you access it. For more information about server-side encryption, see\\n        <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/serv-side-encryption.html\\\">Using Server-Side\\n        Encryption</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <p>\\n            <b>General purpose buckets </b>\\n         </p>\\n         <ul>\\n            <li>\\n               <p>For general purpose buckets, there are the following supported options for server-side encryption:\\n          server-side encryption with Key Management Service (KMS) keys (SSE-KMS), dual-layer server-side encryption with\\n          Amazon Web Services KMS keys (DSSE-KMS), and server-side encryption with customer-provided encryption keys\\n          (SSE-C). Amazon S3 uses the corresponding KMS key, or a customer-provided key to encrypt the target\\n          object copy.</p>\\n            </li>\\n            <li>\\n               <p>When you perform a <code>CopyObject</code> operation, if you want to use a different type of\\n          encryption setting for the target object, you can specify appropriate encryption-related headers to\\n          encrypt the target object with an Amazon S3 managed key, a KMS key, or a customer-provided key. If the\\n          encryption setting in your request is different from the default encryption configuration of the\\n          destination bucket, the encryption setting in your request takes precedence. </p>\\n            </li>\\n         </ul>\\n         <p>\\n            <b>Directory buckets </b>\\n         </p>\\n         <ul>\\n            <li>\\n               <p>For directory buckets, there are only two supported options for server-side encryption: server-side encryption with Amazon S3 managed keys (SSE-S3) (<code>AES256</code>) and server-side encryption with KMS keys (SSE-KMS) (<code>aws:kms</code>). We recommend that the bucket's default encryption uses the desired encryption configuration and you don't override the bucket default encryption in your \\n            <code>CreateSession</code> requests or <code>PUT</code> object requests. Then, new objects \\n are automatically encrypted with the desired encryption settings. For more\\n         information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-serv-side-encryption.html\\\">Protecting data with server-side encryption</a> in the <i>Amazon S3 User Guide</i>. For more information about the encryption overriding behaviors in directory buckets, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-specifying-kms-encryption.html\\\">Specifying server-side encryption with KMS for new object uploads</a>.</p>\\n            </li>\\n            <li>\\n               <p>To encrypt new object copies to a directory bucket with SSE-KMS, we recommend you specify\\n          SSE-KMS as the directory bucket's default encryption configuration with a KMS key\\n          (specifically, a <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk\\\">customer managed key</a>). The <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk\\\">Amazon Web Services managed key</a> (<code>aws/s3</code>) isn't supported. Your SSE-KMS configuration can\\n          only support 1 <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk\\\">customer managed key</a> per\\n          directory bucket for the lifetime of the bucket. After you specify a customer managed key for SSE-KMS, you\\n          can't override the customer managed key for the bucket's SSE-KMS configuration. Then, when you\\n          perform a <code>CopyObject</code> operation and want to specify server-side encryption settings for\\n          new object copies with SSE-KMS in the encryption-related request headers, you must ensure the\\n          encryption key is the same customer managed key that you specified for the directory bucket's default\\n          encryption configuration.\\n          </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>S3 access points for Amazon FSx </b> - When accessing data stored in\\n          Amazon FSx file systems using S3 access points, the only valid server side encryption option is\\n            <code>aws:fsx</code>. All Amazon FSx file systems have encryption configured by default and are\\n          encrypted at rest. Data is automatically encrypted before being written to the file system, and\\n          automatically decrypted as it is read. These processes are handled transparently by Amazon FSx.</p>\\n            </li>\\n         </ul>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption\"\n          }\n        },\n        \"StorageClass\": {\n          \"target\": \"com.amazonaws.s3#StorageClass\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>If the <code>x-amz-storage-class</code> header is not used, the copied object will be stored in the\\n        <code>STANDARD</code> Storage Class by default. The <code>STANDARD</code> storage class provides high\\n      durability and high availability. Depending on performance needs, you can specify a different Storage\\n      Class. </p>\\n         <note>\\n            <ul>\\n               <li>\\n                  <p>\\n                     <b>Directory buckets </b> -\\n            Directory buckets only support <code>EXPRESS_ONEZONE</code> (the S3 Express One Zone storage class) in Availability Zones and <code>ONEZONE_IA</code> (the S3 One Zone-Infrequent Access storage class) in Dedicated Local Zones.  \\nUnsupported storage class values won't write a destination object and will respond with the HTTP status code <code>400 Bad Request</code>.</p>\\n               </li>\\n               <li>\\n                  <p>\\n                     <b>Amazon S3 on Outposts </b> - S3 on Outposts only uses the\\n              <code>OUTPOSTS</code> Storage Class.</p>\\n               </li>\\n            </ul>\\n         </note>\\n         <p>You can use the <code>CopyObject</code> action to change the storage class of an object that is\\n      already stored in Amazon S3 by using the <code>x-amz-storage-class</code> header. For more information, see\\n        <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/storage-class-intro.html\\\">Storage Classes</a>\\n      in the <i>Amazon S3 User Guide</i>.</p>\\n         <p>Before using an object as a source object for the copy operation, you must restore a copy of it if\\n      it meets any of the following conditions:</p>\\n         <ul>\\n            <li>\\n               <p>The storage class of the source object is <code>GLACIER</code> or\\n          <code>DEEP_ARCHIVE</code>.</p>\\n            </li>\\n            <li>\\n               <p>The storage class of the source object is <code>INTELLIGENT_TIERING</code> and it's <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/intelligent-tiering-overview.html#intel-tiering-tier-definition\\\">S3\\n            Intelligent-Tiering access tier</a> is <code>Archive Access</code> or <code>Deep Archive\\n            Access</code>.</p>\\n            </li>\\n         </ul>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_RestoreObject.html\\\">RestoreObject</a> and <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/CopyingObjectsExamples.html\\\">Copying Objects</a> in the\\n        <i>Amazon S3 User Guide</i>.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-storage-class\"\n          }\n        },\n        \"WebsiteRedirectLocation\": {\n          \"target\": \"com.amazonaws.s3#WebsiteRedirectLocation\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>If the destination bucket is configured as a website, redirects requests for this object copy to\\n      another object in the same bucket or to an external URL. Amazon S3 stores the value of this header in the\\n      object metadata. This value is unique to each object and is not copied when using the\\n        <code>x-amz-metadata-directive</code> header. Instead, you may opt to provide this header in\\n      combination with the <code>x-amz-metadata-directive</code> header.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-website-redirect-location\"\n          }\n        },\n        \"SSECustomerAlgorithm\": {\n          \"target\": \"com.amazonaws.s3#SSECustomerAlgorithm\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the algorithm to use when encrypting the object (for example, <code>AES256</code>).</p>\\n         <p>When you perform a <code>CopyObject</code> operation, if you want to use a different type of\\n      encryption setting for the target object, you can specify appropriate encryption-related headers to\\n      encrypt the target object with an Amazon S3 managed key, a KMS key, or a customer-provided key. If the\\n      encryption setting in your request is different from the default encryption configuration of the\\n      destination bucket, the encryption setting in your request takes precedence. </p>\\n         <note>\\n            <p>This functionality is not supported when the destination bucket is a directory bucket.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption-customer-algorithm\"\n          }\n        },\n        \"SSECustomerKey\": {\n          \"target\": \"com.amazonaws.s3#SSECustomerKey\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the customer-provided encryption key for Amazon S3 to use in encrypting data. This value is\\n      used to store the object and then it is discarded. Amazon S3 does not store the encryption key. The key must\\n      be appropriate for use with the algorithm specified in the\\n        <code>x-amz-server-side-encryption-customer-algorithm</code> header.</p>\\n         <note>\\n            <p>This functionality is not supported when the destination bucket is a directory bucket.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption-customer-key\"\n          }\n        },\n        \"SSECustomerKeyMD5\": {\n          \"target\": \"com.amazonaws.s3#SSECustomerKeyMD5\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the 128-bit MD5 digest of the encryption key according to RFC 1321. Amazon S3 uses this header\\n      for a message integrity check to ensure that the encryption key was transmitted without error.</p>\\n         <note>\\n            <p>This functionality is not supported when the destination bucket is a directory bucket.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption-customer-key-MD5\"\n          }\n        },\n        \"SSEKMSKeyId\": {\n          \"target\": \"com.amazonaws.s3#SSEKMSKeyId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the KMS key ID (Key ID, Key ARN, or Key Alias) to use for object encryption. All GET and\\n      PUT requests for an object protected by KMS will fail if they're not made via SSL or using SigV4. For\\n      information about configuring any of the officially supported Amazon Web Services SDKs and Amazon Web Services CLI, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingAWSSDK.html#specify-signature-version\\\">Specifying\\n        the Signature Version in Request Authentication</a> in the\\n      <i>Amazon S3 User Guide</i>.</p>\\n         <p>\\n            <b>Directory buckets</b> -\\n      To encrypt data using SSE-KMS, it's recommended to specify the \\n<code>x-amz-server-side-encryption</code> header to <code>aws:kms</code>. Then, the <code>x-amz-server-side-encryption-aws-kms-key-id</code> header implicitly uses \\nthe bucket's default KMS customer managed key ID. If you want to explicitly set the <code>\\n         x-amz-server-side-encryption-aws-kms-key-id</code> header, it must match the bucket's default customer managed key (using key ID or ARN, not alias). Your SSE-KMS configuration can only support 1 <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk\\\">customer managed key</a> per directory bucket's lifetime. \\nThe <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk\\\">Amazon Web Services managed key</a> (<code>aws/s3</code>) isn't supported. \\n                            \\n Incorrect key specification results in an HTTP <code>400 Bad Request</code> error. </p>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption-aws-kms-key-id\"\n          }\n        },\n        \"SSEKMSEncryptionContext\": {\n          \"target\": \"com.amazonaws.s3#SSEKMSEncryptionContext\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the Amazon Web Services KMS Encryption Context as an additional encryption context to use for the\\n      destination object encryption. The value of this header is a base64-encoded UTF-8 string holding JSON\\n      with the encryption context key-value pairs.</p>\\n         <p>\\n            <b>General purpose buckets</b> - This value must be explicitly added to\\n      specify encryption context for <code>CopyObject</code> requests if you want an additional encryption\\n      context for your destination object. The additional encryption context of the source object won't be\\n      copied to the destination object. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingKMSEncryption.html#encryption-context\\\">Encryption context</a>\\n      in the <i>Amazon S3 User Guide</i>.</p>\\n         <p>\\n            <b>Directory buckets</b> - You can optionally provide an explicit encryption context value. The value must match the default encryption context - the bucket Amazon Resource Name (ARN). An additional encryption context value is not supported. </p>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption-context\"\n          }\n        },\n        \"BucketKeyEnabled\": {\n          \"target\": \"com.amazonaws.s3#BucketKeyEnabled\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies whether Amazon S3 should use an S3 Bucket Key for object encryption with server-side encryption\\n      using Key Management Service (KMS) keys (SSE-KMS). If a target object uses SSE-KMS, you can enable an S3 Bucket Key\\n      for the object.</p>\\n         <p>Setting this header to <code>true</code> causes Amazon S3 to use an S3 Bucket Key for object encryption\\n      with SSE-KMS. Specifying this header with a COPY action doesn’t affect bucket-level settings for S3\\n      Bucket Key.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/bucket-key.html\\\">Amazon S3\\n        Bucket Keys</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <note>\\n            <p>\\n               <b>Directory buckets</b> -\\n        S3 Bucket Keys aren't supported, when you copy SSE-KMS encrypted objects from general purpose buckets  \\nto directory buckets, from directory buckets to general purpose buckets, or between directory buckets, through <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html\\\">CopyObject</a>. In this case, Amazon S3 makes a call to KMS every time a copy request is made for a KMS-encrypted object.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption-bucket-key-enabled\"\n          }\n        },\n        \"CopySourceSSECustomerAlgorithm\": {\n          \"target\": \"com.amazonaws.s3#CopySourceSSECustomerAlgorithm\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the algorithm to use when decrypting the source object (for example,\\n      <code>AES256</code>).</p>\\n         <p>If the source object for the copy is stored in Amazon S3 using SSE-C, you must provide the necessary\\n      encryption information in your request so that Amazon S3 can decrypt the object for copying.</p>\\n         <note>\\n            <p>This functionality is not supported when the source object is in a directory bucket.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-copy-source-server-side-encryption-customer-algorithm\"\n          }\n        },\n        \"CopySourceSSECustomerKey\": {\n          \"target\": \"com.amazonaws.s3#CopySourceSSECustomerKey\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the customer-provided encryption key for Amazon S3 to use to decrypt the source object. The\\n      encryption key provided in this header must be the same one that was used when the source object was\\n      created.</p>\\n         <p>If the source object for the copy is stored in Amazon S3 using SSE-C, you must provide the necessary\\n      encryption information in your request so that Amazon S3 can decrypt the object for copying.</p>\\n         <note>\\n            <p>This functionality is not supported when the source object is in a directory bucket.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-copy-source-server-side-encryption-customer-key\"\n          }\n        },\n        \"CopySourceSSECustomerKeyMD5\": {\n          \"target\": \"com.amazonaws.s3#CopySourceSSECustomerKeyMD5\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the 128-bit MD5 digest of the encryption key according to RFC 1321. Amazon S3 uses this header\\n      for a message integrity check to ensure that the encryption key was transmitted without error.</p>\\n         <p>If the source object for the copy is stored in Amazon S3 using SSE-C, you must provide the necessary\\n      encryption information in your request so that Amazon S3 can decrypt the object for copying.</p>\\n         <note>\\n            <p>This functionality is not supported when the source object is in a directory bucket.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-copy-source-server-side-encryption-customer-key-MD5\"\n          }\n        },\n        \"RequestPayer\": {\n          \"target\": \"com.amazonaws.s3#RequestPayer\",\n          \"traits\": {\n            \"smithy.api#httpHeader\": \"x-amz-request-payer\"\n          }\n        },\n        \"Tagging\": {\n          \"target\": \"com.amazonaws.s3#TaggingHeader\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The tag-set for the object copy in the destination bucket. This value must be used in conjunction\\n      with the <code>x-amz-tagging-directive</code> if you choose <code>REPLACE</code> for the\\n        <code>x-amz-tagging-directive</code>. If you choose <code>COPY</code> for the\\n        <code>x-amz-tagging-directive</code>, you don't need to set the <code>x-amz-tagging</code> header,\\n      because the tag-set will be copied from the source object directly. The tag-set must be encoded as URL\\n      Query parameters.</p>\\n         <p>The default value is the empty value.</p>\\n         <note>\\n            <p>\\n               <b>Directory buckets</b> - For directory buckets in a <code>CopyObject</code> operation, only the empty tag-set is supported. Any requests that attempt to write non-empty tags into directory buckets will receive a <code>501 Not Implemented</code> status code. \\nWhen the destination bucket is a directory bucket, you will receive a <code>501 Not Implemented</code> response in any of the following situations:</p>\\n            <ul>\\n               <li>\\n                  <p>When you attempt to <code>COPY</code> the tag-set from an S3 source object that has non-empty tags.</p>\\n               </li>\\n               <li>\\n                  <p>When you attempt to <code>REPLACE</code> the tag-set of a source object and set a non-empty value to <code>x-amz-tagging</code>.</p>\\n               </li>\\n               <li>\\n                  <p>When you don't set the <code>x-amz-tagging-directive</code> header and the source object has non-empty tags. This is because the default value of <code>x-amz-tagging-directive</code> is <code>COPY</code>.</p>\\n               </li>\\n            </ul>\\n            <p>Because only the empty tag-set is supported for directory buckets in a <code>CopyObject</code> operation, the following situations are allowed:</p>\\n            <ul>\\n               <li>\\n                  <p>When you attempt to <code>COPY</code> the tag-set from a directory bucket source object that has no tags to a general purpose bucket. It copies an empty tag-set to the destination object.</p>\\n               </li>\\n               <li>\\n                  <p>When you attempt to <code>REPLACE</code> the tag-set of a directory bucket source object and set the <code>x-amz-tagging</code> value of the directory bucket destination object to empty.</p>\\n               </li>\\n               <li>\\n                  <p>When you attempt to <code>REPLACE</code> the tag-set of a general purpose bucket source object that has non-empty tags and set the <code>x-amz-tagging</code> value of the directory bucket destination object to empty.</p>\\n               </li>\\n               <li>\\n                  <p>When you attempt to <code>REPLACE</code> the tag-set of a directory bucket source object and don't set the <code>x-amz-tagging</code> value of the directory bucket destination object. This is because the default value of <code>x-amz-tagging</code> is the empty value.</p>\\n               </li>\\n            </ul>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-tagging\"\n          }\n        },\n        \"ObjectLockMode\": {\n          \"target\": \"com.amazonaws.s3#ObjectLockMode\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Object Lock mode that you want to apply to the object copy.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-object-lock-mode\"\n          }\n        },\n        \"ObjectLockRetainUntilDate\": {\n          \"target\": \"com.amazonaws.s3#ObjectLockRetainUntilDate\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The date and time when you want the Object Lock of the object copy to expire.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-object-lock-retain-until-date\"\n          }\n        },\n        \"ObjectLockLegalHoldStatus\": {\n          \"target\": \"com.amazonaws.s3#ObjectLockLegalHoldStatus\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies whether you want to apply a legal hold to the object copy.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-object-lock-legal-hold\"\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected destination bucket owner. If the account ID that you provide does not match the actual owner of the destination bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        },\n        \"ExpectedSourceBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected source bucket owner. If the account ID that you provide does not match the actual owner of the source bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-source-expected-bucket-owner\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#CopyObjectResult\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"ETag\": {\n          \"target\": \"com.amazonaws.s3#ETag\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Returns the ETag of the new object. The ETag reflects only changes to the contents of an object, not\\n      its metadata.</p>\"\n          }\n        },\n        \"LastModified\": {\n          \"target\": \"com.amazonaws.s3#LastModified\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Creation date of the object.</p>\"\n          }\n        },\n        \"ChecksumType\": {\n          \"target\": \"com.amazonaws.s3#ChecksumType\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The checksum type that is used to calculate the object’s checksum value. For more information, see\\n        <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking\\n        object integrity</a> in the <i>Amazon S3 User Guide</i>.</p>\"\n          }\n        },\n        \"ChecksumCRC32\": {\n          \"target\": \"com.amazonaws.s3#ChecksumCRC32\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Base64 encoded, 32-bit <code>CRC32</code> checksum of the object. This checksum is only present if the object was uploaded\\n    with the object. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">\\n    Checking object integrity</a> in the <i>Amazon S3 User Guide</i>.</p>\"\n          }\n        },\n        \"ChecksumCRC32C\": {\n          \"target\": \"com.amazonaws.s3#ChecksumCRC32C\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Base64 encoded, 32-bit <code>CRC32C</code> checksum of the object. This checksum is only present if the checksum was uploaded\\n    with the object. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">\\n    Checking object integrity</a> in the <i>Amazon S3 User Guide</i>.</p>\"\n          }\n        },\n        \"ChecksumCRC64NVME\": {\n          \"target\": \"com.amazonaws.s3#ChecksumCRC64NVME\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Base64 encoded, 64-bit <code>CRC64NVME</code> checksum of the object. This checksum is present\\n      if the object being copied was uploaded with the <code>CRC64NVME</code> checksum algorithm, or if the\\n      object was uploaded without a checksum (and Amazon S3 added the default checksum, <code>CRC64NVME</code>, to\\n      the uploaded object). For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking object integrity</a> in\\n      the <i>Amazon S3 User Guide</i>.</p>\"\n          }\n        },\n        \"ChecksumSHA1\": {\n          \"target\": \"com.amazonaws.s3#ChecksumSHA1\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Base64 encoded, 160-bit <code>SHA1</code> digest of the object. This checksum is only present if the checksum was uploaded\\n    with the object. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">\\n    Checking object integrity</a> in the <i>Amazon S3 User Guide</i>.</p>\"\n          }\n        },\n        \"ChecksumSHA256\": {\n          \"target\": \"com.amazonaws.s3#ChecksumSHA256\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Base64 encoded, 256-bit <code>SHA256</code> digest of the object. This checksum is only present if the checksum was uploaded\\n    with the object. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">\\n    Checking object integrity</a> in the <i>Amazon S3 User Guide</i>.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Container for all response elements.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#CopyPartResult\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"ETag\": {\n          \"target\": \"com.amazonaws.s3#ETag\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Entity tag of the object.</p>\"\n          }\n        },\n        \"LastModified\": {\n          \"target\": \"com.amazonaws.s3#LastModified\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Date and time at which the object was uploaded.</p>\"\n          }\n        },\n        \"ChecksumCRC32\": {\n          \"target\": \"com.amazonaws.s3#ChecksumCRC32\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>This header can be used as a data integrity check to verify that the data received is the same data\\n      that was originally sent. This header specifies the Base64 encoded, 32-bit <code>CRC32</code> checksum\\n      of the part. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking object integrity</a> in\\n      the <i>Amazon S3 User Guide</i>.</p>\"\n          }\n        },\n        \"ChecksumCRC32C\": {\n          \"target\": \"com.amazonaws.s3#ChecksumCRC32C\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>This header can be used as a data integrity check to verify that the data received is the same data\\n      that was originally sent. This header specifies the Base64 encoded, 32-bit <code>CRC32C</code> checksum\\n      of the part. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking object integrity</a> in\\n      the <i>Amazon S3 User Guide</i>.</p>\"\n          }\n        },\n        \"ChecksumCRC64NVME\": {\n          \"target\": \"com.amazonaws.s3#ChecksumCRC64NVME\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Base64 encoded, 64-bit <code>CRC64NVME</code> checksum of the part. This checksum is present if\\n      the multipart upload request was created with the <code>CRC64NVME</code> checksum algorithm to the\\n      uploaded object). For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking object integrity</a> in\\n      the <i>Amazon S3 User Guide</i>.</p>\"\n          }\n        },\n        \"ChecksumSHA1\": {\n          \"target\": \"com.amazonaws.s3#ChecksumSHA1\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>This header can be used as a data integrity check to verify that the data received is the same data\\n      that was originally sent. This header specifies the Base64 encoded, 160-bit <code>SHA1</code> checksum\\n      of the part. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking object integrity</a> in\\n      the <i>Amazon S3 User Guide</i>.</p>\"\n          }\n        },\n        \"ChecksumSHA256\": {\n          \"target\": \"com.amazonaws.s3#ChecksumSHA256\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>This header can be used as a data integrity check to verify that the data received is the same data\\n      that was originally sent. This header specifies the Base64 encoded, 256-bit <code>SHA256</code> checksum\\n      of the part. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking object integrity</a> in\\n      the <i>Amazon S3 User Guide</i>.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Container for all response elements.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#CopySource\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#pattern\": \"^\\\\/?.+\\\\/.+$\"\n      }\n    },\n    \"com.amazonaws.s3#CopySourceIfMatch\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#CopySourceIfModifiedSince\": {\n      \"type\": \"timestamp\"\n    },\n    \"com.amazonaws.s3#CopySourceIfNoneMatch\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#CopySourceIfUnmodifiedSince\": {\n      \"type\": \"timestamp\"\n    },\n    \"com.amazonaws.s3#CopySourceRange\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#CopySourceSSECustomerAlgorithm\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#CopySourceSSECustomerKey\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#sensitive\": {}\n      }\n    },\n    \"com.amazonaws.s3#CopySourceSSECustomerKeyMD5\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#CopySourceVersionId\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#CreateBucket\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#CreateBucketRequest\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.s3#CreateBucketOutput\"\n      },\n      \"errors\": [\n        {\n          \"target\": \"com.amazonaws.s3#BucketAlreadyExists\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#BucketAlreadyOwnedByYou\"\n        }\n      ],\n      \"traits\": {\n        \"smithy.api#documentation\": \"<note>\\n            <p>This action creates an Amazon S3 bucket. To create an Amazon S3 on Outposts bucket, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_CreateBucket.html\\\">\\n                  <code>CreateBucket</code>\\n               </a>.</p>\\n         </note>\\n         <p>Creates a new S3 bucket. To create a bucket, you must set up Amazon S3 and have a valid Amazon Web Services Access Key\\n      ID to authenticate requests. Anonymous requests are never allowed to create buckets. By creating the\\n      bucket, you become the bucket owner.</p>\\n         <p>There are two types of buckets: general purpose buckets and directory buckets. For more information about\\n      these bucket types, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/creating-buckets-s3.html\\\">Creating, configuring, and working with Amazon S3\\n        buckets</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <note>\\n            <ul>\\n               <li>\\n                  <p>\\n                     <b>General purpose buckets</b> - If you send your\\n              <code>CreateBucket</code> request to the <code>s3.amazonaws.com</code> global endpoint, the\\n            request goes to the <code>us-east-1</code> Region. So the signature calculations in Signature\\n            Version 4 must use <code>us-east-1</code> as the Region, even if the location constraint in the\\n            request specifies another Region where the bucket is to be created. If you create a bucket in a\\n            Region other than US East (N. Virginia), your application must be able to handle 307 redirect. For\\n            more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/VirtualHosting.html\\\">Virtual hosting of buckets</a> in the <i>Amazon S3 User Guide</i>.</p>\\n               </li>\\n               <li>\\n                  <p>\\n                     <b>Directory buckets </b> - For directory buckets, you must make requests for this API operation to the Regional endpoint. These endpoints support path-style requests in the format <code>https://s3express-control.<i>region-code</i>.amazonaws.com/<i>bucket-name</i>\\n                     </code>. Virtual-hosted-style requests aren't supported. \\nFor more information about endpoints in Availability Zones, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/endpoint-directory-buckets-AZ.html\\\">Regional and Zonal endpoints for directory buckets in Availability Zones</a> in the\\n    <i>Amazon S3 User Guide</i>. For more information about endpoints in Local Zones, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-lzs-for-directory-buckets.html\\\">Concepts for directory buckets in Local Zones</a> in the\\n    <i>Amazon S3 User Guide</i>.</p>\\n               </li>\\n            </ul>\\n         </note>\\n         <dl>\\n            <dt>Permissions</dt>\\n            <dd>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <b>General purpose bucket permissions</b> - In addition to the\\n                  <code>s3:CreateBucket</code> permission, the following permissions are required in a policy\\n                when your <code>CreateBucket</code> request includes specific headers: </p>\\n                     <ul>\\n                        <li>\\n                           <p>\\n                              <b>Access control lists (ACLs)</b> - In your\\n                      <code>CreateBucket</code> request, if you specify an access control list (ACL) and set\\n                    it to <code>public-read</code>, <code>public-read-write</code>,\\n                      <code>authenticated-read</code>, or if you explicitly specify any other custom ACLs,\\n                    both <code>s3:CreateBucket</code> and <code>s3:PutBucketAcl</code> permissions are\\n                    required. In your <code>CreateBucket</code> request, if you set the ACL to\\n                      <code>private</code>, or if you don't specify any ACLs, only the\\n                      <code>s3:CreateBucket</code> permission is required. </p>\\n                        </li>\\n                        <li>\\n                           <p>\\n                              <b>Object Lock</b> - In your\\n                      <code>CreateBucket</code> request, if you set\\n                      <code>x-amz-bucket-object-lock-enabled</code> to true, the\\n                      <code>s3:PutBucketObjectLockConfiguration</code> and <code>s3:PutBucketVersioning</code>\\n                    permissions are required.</p>\\n                        </li>\\n                        <li>\\n                           <p>\\n                              <b>S3 Object Ownership</b> - If your\\n                      <code>CreateBucket</code> request includes the <code>x-amz-object-ownership</code>\\n                    header, then the <code>s3:PutBucketOwnershipControls</code> permission is required.</p>\\n                           <important>\\n                              <p> To set an ACL on a bucket as part of a <code>CreateBucket</code> request, you must\\n                      explicitly set S3 Object Ownership for the bucket to a different value than the default,\\n                        <code>BucketOwnerEnforced</code>. Additionally, if your desired bucket ACL grants\\n                      public access, you must first create the bucket (without the bucket ACL) and then\\n                      explicitly disable Block Public Access on the bucket before using\\n                        <code>PutBucketAcl</code> to set the ACL. If you try to create a bucket with a public\\n                      ACL, the request will fail. </p>\\n                              <p> For the majority of modern use cases in S3, we recommend that you keep all Block\\n                      Public Access settings enabled and keep ACLs disabled. If you would like to share data\\n                      with users outside of your account, you can use bucket policies as needed. For more\\n                      information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/about-object-ownership.html\\\">Controlling ownership of\\n                        objects and disabling ACLs for your bucket </a> and <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-control-block-public-access.html\\\">Blocking\\n                        public access to your Amazon S3 storage </a> in the\\n                        <i>Amazon S3 User Guide</i>. </p>\\n                           </important>\\n                        </li>\\n                        <li>\\n                           <p>\\n                              <b>S3 Block Public Access</b> - If your specific use\\n                    case requires granting public access to your S3 resources, you can disable Block Public\\n                    Access. Specifically, you can create a new bucket with Block Public Access enabled, then\\n                    separately call the <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeletePublicAccessBlock.html\\\">\\n                                 <code>DeletePublicAccessBlock</code>\\n                              </a> API. To use this operation, you must have the\\n                      <code>s3:PutBucketPublicAccessBlock</code> permission. For more information about S3\\n                    Block Public Access, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-control-block-public-access.html\\\">Blocking public\\n                      access to your Amazon S3 storage </a> in the <i>Amazon S3 User Guide</i>.\\n                  </p>\\n                        </li>\\n                     </ul>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <b>Directory bucket permissions</b> - You must have the\\n                  <code>s3express:CreateBucket</code> permission in an IAM identity-based policy instead of a bucket policy.\\n                Cross-account access to this API operation isn't supported. This operation can only be performed by the Amazon Web Services account that owns the resource. For more information about directory bucket policies and permissions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-security-iam.html\\\">Amazon Web Services Identity and Access Management (IAM) for S3 Express One Zone</a> in the <i>Amazon S3 User Guide</i>.</p>\\n                     <important>\\n                        <p>The permissions for ACLs, Object Lock, S3 Object Ownership, and S3 Block Public Access\\n                  are not supported for directory buckets. For directory buckets, all Block Public Access\\n                  settings are enabled at the bucket level and S3 Object Ownership is set to Bucket owner\\n                  enforced (ACLs disabled). These settings can't be modified. </p>\\n                        <p>For more information about permissions for creating and working with directory buckets,\\n                  see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-buckets-overview.html\\\">Directory buckets</a>\\n                  in the <i>Amazon S3 User Guide</i>. For more information about supported S3\\n                  features for directory buckets, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-one-zone.html#s3-express-features\\\">Features of\\n                    S3 Express One Zone</a> in the <i>Amazon S3 User Guide</i>.</p>\\n                     </important>\\n                  </li>\\n               </ul>\\n            </dd>\\n            <dt>HTTP Host header syntax</dt>\\n            <dd>\\n               <p>\\n                  <b>Directory buckets </b> - The HTTP Host header syntax is <code>s3express-control.<i>region-code</i>.amazonaws.com</code>.</p>\\n            </dd>\\n         </dl>\\n         <p>The following operations are related to <code>CreateBucket</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html\\\">PutObject</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucket.html\\\">DeleteBucket</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#examples\": [\n          {\n            \"title\": \"To create a bucket in a specific region\",\n            \"documentation\": \"The following example creates a bucket. The request specifies an AWS region where to create the bucket.\",\n            \"input\": {\n              \"Bucket\": \"examplebucket\",\n              \"CreateBucketConfiguration\": {\n                \"LocationConstraint\": \"eu-west-1\"\n              }\n            },\n            \"output\": {\n              \"Location\": \"http://examplebucket.<Region>.s3.amazonaws.com/\"\n            }\n          },\n          {\n            \"title\": \"To create a bucket \",\n            \"documentation\": \"The following example creates a bucket.\",\n            \"input\": {\n              \"Bucket\": \"examplebucket\"\n            },\n            \"output\": {\n              \"Location\": \"/examplebucket\"\n            }\n          }\n        ],\n        \"smithy.api#http\": {\n          \"method\": \"PUT\",\n          \"uri\": \"/{Bucket}\",\n          \"code\": 200\n        },\n        \"smithy.rules#staticContextParams\": {\n          \"UseS3ExpressControlEndpoint\": {\n            \"value\": true\n          },\n          \"DisableAccessPoints\": {\n            \"value\": true\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#CreateBucketConfiguration\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"LocationConstraint\": {\n          \"target\": \"com.amazonaws.s3#BucketLocationConstraint\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the Region where the bucket will be created. You might choose a Region to optimize\\n      latency, minimize costs, or address regulatory requirements. For example, if you reside in Europe, you\\n      will probably find it advantageous to create buckets in the Europe (Ireland) Region.</p>\\n         <p>If you don't specify a Region, the bucket is created in the US East (N. Virginia) Region (us-east-1)\\n      by default. Configurations using the value <code>EU</code> will create a bucket in\\n        <code>eu-west-1</code>.</p>\\n         <p>For a list of the valid values for all of the Amazon Web Services Regions, see <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region\\\">Regions and Endpoints</a>.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\"\n          }\n        },\n        \"Location\": {\n          \"target\": \"com.amazonaws.s3#LocationInfo\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the location where the bucket will be created.</p>\\n         <p>\\n            <b>Directory buckets </b> - The location type is Availability Zone or Local Zone. To\\n      use the Local Zone location type, your account must be  enabled\\n      for Local Zones. Otherwise, you get an HTTP <code>403 Forbidden</code> error with the error code\\n        <code>AccessDenied</code>. To learn more,\\n      see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/opt-in-directory-bucket-lz.html\\\">Enable\\n        accounts for Local Zones</a> in the <i>Amazon S3 User Guide</i>. </p>\\n         <note>\\n            <p>This functionality is only supported by directory buckets.</p>\\n         </note>\"\n          }\n        },\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketInfo\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the information about the bucket that will be created.</p>\\n         <note>\\n            <p>This functionality is only supported by directory buckets.</p>\\n         </note>\"\n          }\n        },\n        \"Tags\": {\n          \"target\": \"com.amazonaws.s3#TagSet\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>An array of tags that you can apply to the bucket that you're creating. Tags are key-value pairs of metadata used to categorize and organize your buckets, track costs, and control access. </p>\\n         <p>You must have the <code>s3:TagResource</code> permission to create a general\\n      purpose bucket with tags or the <code>s3express:TagResource</code> permission to create a directory bucket with tags.</p>\\n         <p>When creating buckets with tags, note that tag-based conditions using <code>aws:ResourceTag</code> and <code>s3:BucketTag</code> condition keys are applicable only after ABAC is enabled on the bucket. To learn more, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/buckets-tagging-enable-abac.html\\\">Enabling ABAC in general purpose buckets</a>.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>The configuration information for the bucket.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#CreateBucketMetadataConfiguration\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#CreateBucketMetadataConfigurationRequest\"\n      },\n      \"output\": {\n        \"target\": \"smithy.api#Unit\"\n      },\n      \"traits\": {\n        \"aws.protocols#httpChecksum\": {\n          \"requestAlgorithmMember\": \"ChecksumAlgorithm\",\n          \"requestChecksumRequired\": true\n        },\n        \"smithy.api#documentation\": \"<p>Creates an S3 Metadata V2 metadata configuration for a general purpose bucket. For more information, see\\n      <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/metadata-tables-overview.html\\\">Accelerating\\n        data discovery with S3 Metadata</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <dl>\\n            <dt>Permissions</dt>\\n            <dd>\\n               <p>To use this operation, you must have the following permissions. For more information, see\\n            <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/metadata-tables-permissions.html\\\">Setting up permissions for configuring metadata tables</a> in the\\n            <i>Amazon S3 User Guide</i>.</p>\\n               <p>If you want to encrypt your metadata tables with server-side encryption with Key Management Service\\n            (KMS) keys (SSE-KMS), you need additional permissions in your KMS key policy. For more\\n            information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/metadata-tables-permissions.html\\\">\\n              Setting up permissions for configuring metadata tables</a> in the\\n            <i>Amazon S3 User Guide</i>.</p>\\n               <p>If you also want to integrate your table bucket with Amazon Web Services analytics services so that you can\\n            query your metadata table, you need additional permissions. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-integrating-aws.html\\\"> Integrating\\n              Amazon S3 Tables with Amazon Web Services analytics services</a> in the\\n            <i>Amazon S3 User Guide</i>.</p>\\n               <p>To query your metadata tables, you need additional permissions. For more information, see \\n            <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/metadata-tables-bucket-query-permissions.html\\\">\\n              Permissions for querying metadata tables</a> in the <i>Amazon S3 User Guide</i>.</p>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <code>s3:CreateBucketMetadataTableConfiguration</code>\\n                     </p>\\n                     <note>\\n                        <p>The IAM policy action name is the same for the V1 and V2 API operations.</p>\\n                     </note>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <code>s3tables:CreateTableBucket</code>\\n                     </p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <code>s3tables:CreateNamespace</code>\\n                     </p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <code>s3tables:GetTable</code>\\n                     </p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <code>s3tables:CreateTable</code>\\n                     </p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <code>s3tables:PutTablePolicy</code>\\n                     </p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <code>s3tables:PutTableEncryption</code>\\n                     </p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <code>kms:DescribeKey</code>\\n                     </p>\\n                  </li>\\n               </ul>\\n            </dd>\\n         </dl>\\n         <p>The following operations are related to <code>CreateBucketMetadataConfiguration</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketMetadataConfiguration.html\\\">DeleteBucketMetadataConfiguration</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketMetadataConfiguration.html\\\">GetBucketMetadataConfiguration</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_UpdateBucketMetadataInventoryTableConfiguration.html\\\">UpdateBucketMetadataInventoryTableConfiguration</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_UpdateBucketMetadataJournalTableConfiguration.html\\\">UpdateBucketMetadataJournalTableConfiguration</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#http\": {\n          \"method\": \"POST\",\n          \"uri\": \"/{Bucket}?metadataConfiguration\",\n          \"code\": 200\n        },\n        \"smithy.rules#staticContextParams\": {\n          \"UseS3ExpressControlEndpoint\": {\n            \"value\": true\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#CreateBucketMetadataConfigurationRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>\\n      The general purpose bucket that you want to create the metadata configuration for.\\n    </p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"ContentMD5\": {\n          \"target\": \"com.amazonaws.s3#ContentMD5\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>\\n      The <code>Content-MD5</code> header for the metadata configuration.\\n    </p>\",\n            \"smithy.api#httpHeader\": \"Content-MD5\"\n          }\n        },\n        \"ChecksumAlgorithm\": {\n          \"target\": \"com.amazonaws.s3#ChecksumAlgorithm\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>\\n      The checksum algorithm to use with your metadata configuration.\\n    </p>\",\n            \"smithy.api#httpHeader\": \"x-amz-sdk-checksum-algorithm\"\n          }\n        },\n        \"MetadataConfiguration\": {\n          \"target\": \"com.amazonaws.s3#MetadataConfiguration\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>\\n      The contents of your metadata configuration.\\n    </p>\",\n            \"smithy.api#httpPayload\": {},\n            \"smithy.api#required\": {},\n            \"smithy.api#xmlName\": \"MetadataConfiguration\"\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>\\n      The expected owner of the general purpose bucket that corresponds to your metadata configuration.\\n    </p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#CreateBucketMetadataTableConfiguration\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#CreateBucketMetadataTableConfigurationRequest\"\n      },\n      \"output\": {\n        \"target\": \"smithy.api#Unit\"\n      },\n      \"traits\": {\n        \"aws.protocols#httpChecksum\": {\n          \"requestAlgorithmMember\": \"ChecksumAlgorithm\",\n          \"requestChecksumRequired\": true\n        },\n        \"smithy.api#documentation\": \"<important>\\n            <p>\\n        We recommend that you create your S3 Metadata configurations by using the V2 \\n        <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateBucketMetadataConfiguration.html\\\">CreateBucketMetadataConfiguration</a> API operation. We no longer recommend using the V1 \\n        <code>CreateBucketMetadataTableConfiguration</code> API operation.\\n      </p>\\n            <p>If you created your S3 Metadata configuration before July 15, 2025, we recommend that you delete \\n        and re-create your configuration by using <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateBucketMetadataConfiguration.html\\\">CreateBucketMetadataConfiguration</a> so that you can expire journal table records and create \\n        a live inventory table.</p>\\n         </important>\\n         <p>Creates a V1 S3 Metadata configuration for a general purpose bucket. For more information, see\\n        <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/metadata-tables-overview.html\\\">Accelerating\\n        data discovery with S3 Metadata</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <dl>\\n            <dt>Permissions</dt>\\n            <dd>\\n               <p>To use this operation, you must have the following permissions. For more information, see\\n              <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/metadata-tables-permissions.html\\\">Setting up permissions for configuring metadata tables</a> in the\\n              <i>Amazon S3 User Guide</i>.</p>\\n               <p>If you want to encrypt your metadata tables with server-side encryption with Key Management Service\\n            (KMS) keys (SSE-KMS), you need additional permissions. For more\\n            information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/metadata-tables-permissions.html\\\">\\n              Setting up permissions for configuring metadata tables</a> in the\\n            <i>Amazon S3 User Guide</i>.</p>\\n               <p>If you also want to integrate your table bucket with Amazon Web Services analytics services so that you can\\n            query your metadata table, you need additional permissions. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-tables-integrating-aws.html\\\"> Integrating\\n              Amazon S3 Tables with Amazon Web Services analytics services</a> in the\\n            <i>Amazon S3 User Guide</i>.</p>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <code>s3:CreateBucketMetadataTableConfiguration</code>\\n                     </p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <code>s3tables:CreateNamespace</code>\\n                     </p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <code>s3tables:GetTable</code>\\n                     </p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <code>s3tables:CreateTable</code>\\n                     </p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <code>s3tables:PutTablePolicy</code>\\n                     </p>\\n                  </li>\\n               </ul>\\n            </dd>\\n         </dl>\\n         <p>The following operations are related to <code>CreateBucketMetadataTableConfiguration</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketMetadataTableConfiguration.html\\\">DeleteBucketMetadataTableConfiguration</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketMetadataTableConfiguration.html\\\">GetBucketMetadataTableConfiguration</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#http\": {\n          \"method\": \"POST\",\n          \"uri\": \"/{Bucket}?metadataTable\",\n          \"code\": 200\n        },\n        \"smithy.rules#staticContextParams\": {\n          \"UseS3ExpressControlEndpoint\": {\n            \"value\": true\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#CreateBucketMetadataTableConfigurationRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p> The general purpose bucket that you want to create the metadata table configuration for. </p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"ContentMD5\": {\n          \"target\": \"com.amazonaws.s3#ContentMD5\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p> The <code>Content-MD5</code> header for the metadata table configuration. </p>\",\n            \"smithy.api#httpHeader\": \"Content-MD5\"\n          }\n        },\n        \"ChecksumAlgorithm\": {\n          \"target\": \"com.amazonaws.s3#ChecksumAlgorithm\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p> The checksum algorithm to use with your metadata table configuration. </p>\",\n            \"smithy.api#httpHeader\": \"x-amz-sdk-checksum-algorithm\"\n          }\n        },\n        \"MetadataTableConfiguration\": {\n          \"target\": \"com.amazonaws.s3#MetadataTableConfiguration\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p> The contents of your metadata table configuration. </p>\",\n            \"smithy.api#httpPayload\": {},\n            \"smithy.api#required\": {},\n            \"smithy.api#xmlName\": \"MetadataTableConfiguration\"\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p> The expected owner of the general purpose bucket that corresponds to your metadata table configuration.\\n    </p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#CreateBucketOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Location\": {\n          \"target\": \"com.amazonaws.s3#Location\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A forward slash followed by the name of the bucket.</p>\",\n            \"smithy.api#httpHeader\": \"Location\"\n          }\n        },\n        \"BucketArn\": {\n          \"target\": \"com.amazonaws.s3#S3RegionalOrS3ExpressBucketArnString\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the S3 bucket. ARNs uniquely identify Amazon Web Services resources across all\\n      of Amazon Web Services.</p>\\n         <note>\\n            <p>This parameter is only supported for S3 directory buckets. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-buckets-tagging.html\\\">Using tags with\\n          directory buckets</a>.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-bucket-arn\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#output\": {}\n      }\n    },\n    \"com.amazonaws.s3#CreateBucketRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"ACL\": {\n          \"target\": \"com.amazonaws.s3#BucketCannedACL\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The canned ACL to apply to the bucket.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-acl\"\n          }\n        },\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the bucket to create.</p>\\n         <p>\\n            <b>General purpose buckets</b> - For information about bucket naming\\n         restrictions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucketnamingrules.html\\\">Bucket naming\\n            rules</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <p>\\n            <b>Directory buckets </b> - When you use this operation with a directory bucket, you must use path-style requests in the format <code>https://s3express-control.<i>region-code</i>.amazonaws.com/<i>bucket-name</i>\\n            </code>. Virtual-hosted-style requests aren't supported. Directory bucket names must be unique in the chosen Zone (Availability Zone or Local Zone). Bucket names must also follow the format <code>\\n               <i>bucket-base-name</i>--<i>zone-id</i>--x-s3</code> (for example, <code>\\n               <i>DOC-EXAMPLE-BUCKET</i>--<i>usw2-az1</i>--x-s3</code>). For information about bucket naming restrictions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-bucket-naming-rules.html\\\">Directory bucket naming rules</a> in the <i>Amazon S3 User Guide</i>\\n         </p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"CreateBucketConfiguration\": {\n          \"target\": \"com.amazonaws.s3#CreateBucketConfiguration\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The configuration information for the bucket.</p>\",\n            \"smithy.api#httpPayload\": {},\n            \"smithy.api#xmlName\": \"CreateBucketConfiguration\"\n          }\n        },\n        \"GrantFullControl\": {\n          \"target\": \"com.amazonaws.s3#GrantFullControl\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Allows grantee the read, write, read ACP, and write ACP permissions on the bucket.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-grant-full-control\"\n          }\n        },\n        \"GrantRead\": {\n          \"target\": \"com.amazonaws.s3#GrantRead\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Allows grantee to list the objects in the bucket.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-grant-read\"\n          }\n        },\n        \"GrantReadACP\": {\n          \"target\": \"com.amazonaws.s3#GrantReadACP\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Allows grantee to read the bucket ACL.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-grant-read-acp\"\n          }\n        },\n        \"GrantWrite\": {\n          \"target\": \"com.amazonaws.s3#GrantWrite\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Allows grantee to create new objects in the bucket.</p>\\n         <p>For the bucket and object owners of existing objects, also allows deletions and overwrites of those\\n      objects.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-grant-write\"\n          }\n        },\n        \"GrantWriteACP\": {\n          \"target\": \"com.amazonaws.s3#GrantWriteACP\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Allows grantee to write the ACL for the applicable bucket.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-grant-write-acp\"\n          }\n        },\n        \"ObjectLockEnabledForBucket\": {\n          \"target\": \"com.amazonaws.s3#ObjectLockEnabledForBucket\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies whether you want S3 Object Lock to be enabled for the new bucket.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-bucket-object-lock-enabled\"\n          }\n        },\n        \"ObjectOwnership\": {\n          \"target\": \"com.amazonaws.s3#ObjectOwnership\",\n          \"traits\": {\n            \"smithy.api#httpHeader\": \"x-amz-object-ownership\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#CreateMultipartUpload\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#CreateMultipartUploadRequest\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.s3#CreateMultipartUploadOutput\"\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<important>\\n            <p>End of support notice: As of October 1, 2025, Amazon S3 has discontinued support for Email Grantee Access Control Lists (ACLs). If you attempt to use an Email Grantee ACL in a request after October 1, 2025, \\n the request will receive an <code>HTTP 405</code> (Method Not Allowed) error.</p>\\n            <p>This change affects the following Amazon Web Services Regions: US East (N. Virginia), US West (N. California), US West (Oregon), Asia Pacific (Singapore), Asia Pacific (Sydney), Asia Pacific (Tokyo), Europe (Ireland), and South America (São Paulo).</p>\\n         </important>\\n         <p>This action initiates a multipart upload and returns an upload ID. This upload ID is used to\\n      associate all of the parts in the specific multipart upload. You specify this upload ID in each of your\\n      subsequent upload part requests (see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPart.html\\\">UploadPart</a>). You also include this upload ID in\\n      the final request to either complete or abort the multipart upload request. For more information about\\n      multipart uploads, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/mpuoverview.html\\\">Multipart\\n        Upload Overview</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <note>\\n            <p>After you initiate a multipart upload and upload one or more parts, to stop being charged for\\n        storing the uploaded parts, you must either complete or abort the multipart upload. Amazon S3 frees up the\\n        space used to store the parts and stops charging you for storing them only after you either complete\\n        or abort a multipart upload. </p>\\n         </note>\\n         <p>If you have configured a lifecycle rule to abort incomplete multipart uploads, the created multipart\\n      upload must be completed within the number of days specified in the bucket lifecycle configuration.\\n      Otherwise, the incomplete multipart upload becomes eligible for an abort action and Amazon S3 aborts the\\n      multipart upload. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/mpuoverview.html#mpu-abort-incomplete-mpu-lifecycle-config\\\">Aborting\\n        Incomplete Multipart Uploads Using a Bucket Lifecycle Configuration</a>.</p>\\n         <note>\\n            <ul>\\n               <li>\\n                  <p>\\n                     <b>Directory buckets </b> -\\n            S3 Lifecycle is not supported by directory buckets.</p>\\n               </li>\\n               <li>\\n                  <p>\\n                     <b>Directory buckets </b> - For directory buckets, you must make requests for this API operation to the Zonal endpoint. These endpoints support virtual-hosted-style requests in the format <code>https://<i>amzn-s3-demo-bucket</i>.s3express-<i>zone-id</i>.<i>region-code</i>.amazonaws.com/<i>key-name</i>\\n                     </code>. Path-style requests are not supported. For more information about endpoints in Availability Zones, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/endpoint-directory-buckets-AZ.html\\\">Regional and Zonal endpoints for directory buckets in Availability Zones</a> in the\\n    <i>Amazon S3 User Guide</i>. For more information about endpoints in Local Zones, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-lzs-for-directory-buckets.html\\\">Concepts for directory buckets in Local Zones</a> in the\\n    <i>Amazon S3 User Guide</i>.</p>\\n               </li>\\n            </ul>\\n         </note>\\n         <dl>\\n            <dt>Request signing</dt>\\n            <dd>\\n               <p>For request signing, multipart upload is just a series of regular requests. You initiate a\\n            multipart upload, send one or more requests to upload parts, and then complete the multipart\\n            upload process. You sign each request individually. There is nothing special about signing\\n            multipart upload requests. For more information about signing, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html\\\">Authenticating Requests (Amazon Web Services\\n              Signature Version 4)</a> in the <i>Amazon S3 User Guide</i>.</p>\\n            </dd>\\n            <dt>Permissions</dt>\\n            <dd>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <b>General purpose bucket permissions</b> - To perform a\\n                multipart upload with encryption using an Key Management Service (KMS) KMS key, the requester must have\\n                permission to the <code>kms:Decrypt</code> and <code>kms:GenerateDataKey</code> actions on the\\n                key. The requester must also have permissions for the <code>kms:GenerateDataKey</code> action\\n                for the <code>CreateMultipartUpload</code> API. Then, the requester needs permissions for the\\n                  <code>kms:Decrypt</code> action on the <code>UploadPart</code> and\\n                  <code>UploadPartCopy</code> APIs. These permissions are required because Amazon S3 must decrypt\\n                and read data from the encrypted file parts before it completes the multipart upload. For more\\n                information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/mpuoverview.html#mpuAndPermissions\\\">Multipart upload API and\\n                  permissions</a> and <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingKMSEncryption.html\\\">Protecting data using server-side\\n                  encryption with Amazon Web Services KMS</a> in the <i>Amazon S3 User Guide</i>.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <b>Directory bucket permissions</b> - To grant access to this API operation on a directory bucket, we recommend that you use the <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateSession.html\\\">\\n                           <code>CreateSession</code>\\n                        </a> API operation for session-based authorization. Specifically, you grant the <code>s3express:CreateSession</code> permission to the directory bucket in a bucket policy or an IAM identity-based policy. Then, you make the <code>CreateSession</code> API call on the bucket to obtain a session token. With the session token in your request header, you can make API requests to this operation. After the session token expires, you make another <code>CreateSession</code> API call to generate a new session token for use. \\nAmazon Web Services CLI or SDKs create session and refresh the session token automatically to avoid service interruptions when a session expires. For more information about authorization, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateSession.html\\\">\\n                           <code>CreateSession</code>\\n                        </a>.</p>\\n                  </li>\\n               </ul>\\n            </dd>\\n            <dt>Encryption</dt>\\n            <dd>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <b>General purpose buckets</b> - Server-side encryption is for\\n                data encryption at rest. Amazon S3 encrypts your data as it writes it to disks in its data centers\\n                and decrypts it when you access it. Amazon S3 automatically encrypts all new objects that are\\n                uploaded to an S3 bucket. When doing a multipart upload, if you don't specify encryption\\n                information in your request, the encryption setting of the uploaded parts is set to the\\n                default encryption configuration of the destination bucket. By default, all buckets have a\\n                base level of encryption configuration that uses server-side encryption with Amazon S3 managed keys\\n                (SSE-S3). If the destination bucket has a default encryption configuration that uses\\n                server-side encryption with an Key Management Service (KMS) key (SSE-KMS), or a customer-provided\\n                encryption key (SSE-C), Amazon S3 uses the corresponding KMS key, or a customer-provided key to\\n                encrypt the uploaded parts. When you perform a CreateMultipartUpload operation, if you want to\\n                use a different type of encryption setting for the uploaded parts, you can request that Amazon S3\\n                encrypts the object with a different encryption key (such as an Amazon S3 managed key, a KMS key,\\n                or a customer-provided key). When the encryption setting in your request is different from the\\n                default encryption configuration of the destination bucket, the encryption setting in your\\n                request takes precedence. If you choose to provide your own encryption key, the request\\n                headers you provide in <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPart.html\\\">UploadPart</a> and <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html\\\">UploadPartCopy</a> requests must match the headers you used in the\\n                  <code>CreateMultipartUpload</code> request.</p>\\n                     <ul>\\n                        <li>\\n                           <p>Use KMS keys (SSE-KMS) that include the Amazon Web Services managed key (<code>aws/s3</code>) and\\n                    KMS customer managed keys stored in Key Management Service (KMS) – If you want Amazon Web Services to manage the keys used\\n                    to encrypt data, specify the following headers in the request.</p>\\n                           <ul>\\n                              <li>\\n                                 <p>\\n                                    <code>x-amz-server-side-encryption</code>\\n                                 </p>\\n                              </li>\\n                              <li>\\n                                 <p>\\n                                    <code>x-amz-server-side-encryption-aws-kms-key-id</code>\\n                                 </p>\\n                              </li>\\n                              <li>\\n                                 <p>\\n                                    <code>x-amz-server-side-encryption-context</code>\\n                                 </p>\\n                              </li>\\n                           </ul>\\n                           <note>\\n                              <ul>\\n                                 <li>\\n                                    <p>If you specify <code>x-amz-server-side-encryption:aws:kms</code>, but don't\\n                          provide <code>x-amz-server-side-encryption-aws-kms-key-id</code>, Amazon S3 uses the\\n                          Amazon Web Services managed key (<code>aws/s3</code> key) in KMS to protect the data.</p>\\n                                 </li>\\n                                 <li>\\n                                    <p>To perform a multipart upload with encryption by using an Amazon Web Services KMS key, the\\n                          requester must have permission to the <code>kms:Decrypt</code> and\\n                            <code>kms:GenerateDataKey*</code> actions on the key. These permissions are\\n                          required because Amazon S3 must decrypt and read data from the encrypted file parts\\n                          before it completes the multipart upload. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/mpuoverview.html#mpuAndPermissions\\\">Multipart\\n                            upload API and permissions</a> and <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingKMSEncryption.html\\\">Protecting data using\\n                            server-side encryption with Amazon Web Services KMS</a> in the\\n                            <i>Amazon S3 User Guide</i>.</p>\\n                                 </li>\\n                                 <li>\\n                                    <p>If your Identity and Access Management (IAM) user or role is in the same Amazon Web Services account as the\\n                          KMS key, then you must have these permissions on the key policy. If your IAM\\n                          user or role is in a different account from the key, then you must have the\\n                          permissions on both the key policy and your IAM user or role.</p>\\n                                 </li>\\n                                 <li>\\n                                    <p>All <code>GET</code> and <code>PUT</code> requests for an object protected by\\n                          KMS fail if you don't make them by using Secure Sockets Layer (SSL), Transport\\n                          Layer Security (TLS), or Signature Version 4. For information about configuring any\\n                          of the officially supported Amazon Web Services SDKs and Amazon Web Services CLI, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingAWSSDK.html#specify-signature-version\\\">Specifying the Signature Version in Request\\n                            Authentication</a> in the <i>Amazon S3 User Guide</i>.</p>\\n                                 </li>\\n                              </ul>\\n                           </note>\\n                           <p>For more information about server-side encryption with KMS keys (SSE-KMS), see\\n                      <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingKMSEncryption.html\\\">Protecting Data Using Server-Side Encryption with KMS keys</a> in the\\n                      <i>Amazon S3 User Guide</i>.</p>\\n                        </li>\\n                        <li>\\n                           <p>Use customer-provided encryption keys (SSE-C) – If you want to manage your own\\n                    encryption keys, provide all the following headers in the request.</p>\\n                           <ul>\\n                              <li>\\n                                 <p>\\n                                    <code>x-amz-server-side-encryption-customer-algorithm</code>\\n                                 </p>\\n                              </li>\\n                              <li>\\n                                 <p>\\n                                    <code>x-amz-server-side-encryption-customer-key</code>\\n                                 </p>\\n                              </li>\\n                              <li>\\n                                 <p>\\n                                    <code>x-amz-server-side-encryption-customer-key-MD5</code>\\n                                 </p>\\n                              </li>\\n                           </ul>\\n                           <p>For more information about server-side encryption with customer-provided encryption\\n                    keys (SSE-C), see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/ServerSideEncryptionCustomerKeys.html\\\"> Protecting data\\n                      using server-side encryption with customer-provided encryption keys (SSE-C)</a> in\\n                    the <i>Amazon S3 User Guide</i>.</p>\\n                        </li>\\n                     </ul>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <b>Directory buckets</b> -\\n                For directory buckets, there are only two supported options for server-side encryption: server-side encryption with Amazon S3 managed keys (SSE-S3) (<code>AES256</code>) and server-side encryption with KMS keys (SSE-KMS) (<code>aws:kms</code>). We recommend that the bucket's default encryption uses the desired encryption configuration and you don't override the bucket default encryption in your \\n            <code>CreateSession</code> requests or <code>PUT</code> object requests. Then, new objects \\n are automatically encrypted with the desired encryption settings. For more\\n         information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-serv-side-encryption.html\\\">Protecting data with server-side encryption</a> in the <i>Amazon S3 User Guide</i>. For more information about the encryption overriding behaviors in directory buckets, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-specifying-kms-encryption.html\\\">Specifying server-side encryption with KMS for new object uploads</a>.</p>\\n                     <p>In the Zonal endpoint API calls (except <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html\\\">CopyObject</a> and <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html\\\">UploadPartCopy</a>) using the REST API, the encryption request headers must match the encryption settings that are specified in the <code>CreateSession</code> request. \\n                            You can't override the values of the encryption settings (<code>x-amz-server-side-encryption</code>, <code>x-amz-server-side-encryption-aws-kms-key-id</code>, <code>x-amz-server-side-encryption-context</code>, and <code>x-amz-server-side-encryption-bucket-key-enabled</code>) that are specified in the <code>CreateSession</code> request. \\n                            You don't need to explicitly specify these encryption settings values in Zonal endpoint API calls, and   \\n                            Amazon S3 will use the encryption settings values from the <code>CreateSession</code> request to protect new objects in the directory bucket. \\n                           </p>\\n                     <note>\\n                        <p>When you use the CLI or the Amazon Web Services SDKs, for <code>CreateSession</code>, the session token refreshes automatically to avoid service interruptions when a session expires. The CLI or the Amazon Web Services SDKs use the bucket's default encryption configuration for the \\n                            <code>CreateSession</code> request. It's not supported to override the encryption settings values in the <code>CreateSession</code> request. \\n                            So in the Zonal endpoint API calls (except <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html\\\">CopyObject</a> and <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html\\\">UploadPartCopy</a>), \\n          the encryption request headers must match the default encryption configuration of the directory bucket.\\n\\n</p>\\n                     </note>\\n                     <note>\\n                        <p>For directory buckets, when you perform a <code>CreateMultipartUpload</code> operation\\n                  and an <code>UploadPartCopy</code> operation, the request headers you provide in the\\n                    <code>CreateMultipartUpload</code> request must match the default encryption configuration\\n                  of the destination bucket. </p>\\n                     </note>\\n                  </li>\\n               </ul>\\n            </dd>\\n            <dt>HTTP Host header syntax</dt>\\n            <dd>\\n               <p>\\n                  <b>Directory buckets </b> - The HTTP Host header syntax is <code>\\n                     <i>Bucket-name</i>.s3express-<i>zone-id</i>.<i>region-code</i>.amazonaws.com</code>.</p>\\n            </dd>\\n         </dl>\\n         <p>The following operations are related to <code>CreateMultipartUpload</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPart.html\\\">UploadPart</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html\\\">CompleteMultipartUpload</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_AbortMultipartUpload.html\\\">AbortMultipartUpload</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListParts.html\\\">ListParts</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListMultipartUploads.html\\\">ListMultipartUploads</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#examples\": [\n          {\n            \"title\": \"To initiate a multipart upload\",\n            \"documentation\": \"The following example initiates a multipart upload.\",\n            \"input\": {\n              \"Bucket\": \"examplebucket\",\n              \"Key\": \"largeobject\"\n            },\n            \"output\": {\n              \"Bucket\": \"examplebucket\",\n              \"UploadId\": \"ibZBv_75gd9r8lH_gqXatLdxMVpAlj6ZQjEs.OwyF3953YdwbcQnMA2BLGn8Lx12fQNICtMw5KyteFeHw.Sjng--\",\n              \"Key\": \"largeobject\"\n            }\n          }\n        ],\n        \"smithy.api#http\": {\n          \"method\": \"POST\",\n          \"uri\": \"/{Bucket}/{Key+}?uploads\",\n          \"code\": 200\n        }\n      }\n    },\n    \"com.amazonaws.s3#CreateMultipartUploadOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"AbortDate\": {\n          \"target\": \"com.amazonaws.s3#AbortDate\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>If the bucket has a lifecycle rule configured with an action to abort incomplete multipart uploads\\n      and the prefix in the lifecycle rule matches the object name in the request, the response includes this\\n      header. The header indicates when the initiated multipart upload becomes eligible for an abort\\n      operation. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/mpuoverview.html#mpu-abort-incomplete-mpu-lifecycle-config\\\"> Aborting\\n        Incomplete Multipart Uploads Using a Bucket Lifecycle Configuration</a> in the\\n        <i>Amazon S3 User Guide</i>.</p>\\n         <p>The response also includes the <code>x-amz-abort-rule-id</code> header that provides the ID of the\\n      lifecycle configuration rule that defines the abort action.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-abort-date\"\n          }\n        },\n        \"AbortRuleId\": {\n          \"target\": \"com.amazonaws.s3#AbortRuleId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>This header is returned along with the <code>x-amz-abort-date</code> header. It identifies the\\n      applicable lifecycle configuration rule that defines the action to abort incomplete multipart\\n      uploads.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-abort-rule-id\"\n          }\n        },\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the bucket to which the multipart upload was initiated. Does not return the access point ARN or\\n      access point alias if used.</p>\\n         <note>\\n            <p>Access points are not supported by directory buckets.</p>\\n         </note>\",\n            \"smithy.api#xmlName\": \"Bucket\"\n          }\n        },\n        \"Key\": {\n          \"target\": \"com.amazonaws.s3#ObjectKey\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Object key for which the multipart upload was initiated.</p>\"\n          }\n        },\n        \"UploadId\": {\n          \"target\": \"com.amazonaws.s3#MultipartUploadId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>ID for the initiated multipart upload.</p>\"\n          }\n        },\n        \"ServerSideEncryption\": {\n          \"target\": \"com.amazonaws.s3#ServerSideEncryption\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The server-side encryption algorithm used when you store this object in Amazon S3 or Amazon FSx.</p>\\n         <note>\\n            <p>When accessing data stored in Amazon FSx file systems using S3 access points, the only valid server side\\n        encryption option is <code>aws:fsx</code>.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption\"\n          }\n        },\n        \"SSECustomerAlgorithm\": {\n          \"target\": \"com.amazonaws.s3#SSECustomerAlgorithm\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>If server-side encryption with a customer-provided encryption key was requested, the response will\\n      include this header to confirm the encryption algorithm that's used.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption-customer-algorithm\"\n          }\n        },\n        \"SSECustomerKeyMD5\": {\n          \"target\": \"com.amazonaws.s3#SSECustomerKeyMD5\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>If server-side encryption with a customer-provided encryption key was requested, the response will\\n      include this header to provide the round-trip message integrity verification of the customer-provided\\n      encryption key.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption-customer-key-MD5\"\n          }\n        },\n        \"SSEKMSKeyId\": {\n          \"target\": \"com.amazonaws.s3#SSEKMSKeyId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>If present, indicates the ID of the KMS key that was used for object encryption.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption-aws-kms-key-id\"\n          }\n        },\n        \"SSEKMSEncryptionContext\": {\n          \"target\": \"com.amazonaws.s3#SSEKMSEncryptionContext\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>If present, indicates the Amazon Web Services KMS Encryption Context to use for object encryption. The value of\\n         this header is a Base64 encoded string of a UTF-8 encoded JSON, which contains the encryption context as key-value pairs.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption-context\"\n          }\n        },\n        \"BucketKeyEnabled\": {\n          \"target\": \"com.amazonaws.s3#BucketKeyEnabled\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Indicates whether the multipart upload uses an S3 Bucket Key for server-side encryption with\\n      Key Management Service (KMS) keys (SSE-KMS).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption-bucket-key-enabled\"\n          }\n        },\n        \"RequestCharged\": {\n          \"target\": \"com.amazonaws.s3#RequestCharged\",\n          \"traits\": {\n            \"smithy.api#httpHeader\": \"x-amz-request-charged\"\n          }\n        },\n        \"ChecksumAlgorithm\": {\n          \"target\": \"com.amazonaws.s3#ChecksumAlgorithm\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The algorithm that was used to create a checksum of the object.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-checksum-algorithm\"\n          }\n        },\n        \"ChecksumType\": {\n          \"target\": \"com.amazonaws.s3#ChecksumType\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p> Indicates the checksum type that you want Amazon S3 to use to calculate the object’s checksum\\n      value. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking object integrity in the Amazon S3\\n        User Guide</a>.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-checksum-type\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#output\": {},\n        \"smithy.api#xmlName\": \"InitiateMultipartUploadResult\"\n      }\n    },\n    \"com.amazonaws.s3#CreateMultipartUploadRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"ACL\": {\n          \"target\": \"com.amazonaws.s3#ObjectCannedACL\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The canned ACL to apply to the object. Amazon S3 supports a set of predefined ACLs, known as\\n        <i>canned ACLs</i>. Each canned ACL has a predefined set of grantees and permissions.\\n      For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html#CannedACL\\\">Canned ACL</a> in the\\n        <i>Amazon S3 User Guide</i>.</p>\\n         <p>By default, all objects are private. Only the owner has full access control. When uploading an\\n      object, you can grant access permissions to individual Amazon Web Services accounts or to predefined groups defined by\\n      Amazon S3. These permissions are then added to the access control list (ACL) on the new object. For more\\n      information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/S3_ACLs_UsingACLs.html\\\">Using\\n        ACLs</a>. One way to grant the permissions using the request headers is to specify a canned ACL\\n      with the <code>x-amz-acl</code> request header.</p>\\n         <note>\\n            <ul>\\n               <li>\\n                  <p>This functionality is not supported for directory buckets.</p>\\n               </li>\\n               <li>\\n                  <p>This functionality is not supported for Amazon S3 on Outposts.</p>\\n               </li>\\n            </ul>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-acl\"\n          }\n        },\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the bucket where the multipart upload is initiated and where the object is\\n      uploaded.</p>\\n         <p>\\n            <b>Directory buckets</b> - When you use this operation with a directory bucket, you must use virtual-hosted-style requests in the format <code>\\n               <i>Bucket-name</i>.s3express-<i>zone-id</i>.<i>region-code</i>.amazonaws.com</code>. Path-style requests are not supported.  Directory bucket names must be unique in the chosen Zone (Availability Zone or Local Zone). Bucket names must follow the format <code>\\n               <i>bucket-base-name</i>--<i>zone-id</i>--x-s3</code> (for example, <code>\\n               <i>amzn-s3-demo-bucket</i>--<i>usw2-az1</i>--x-s3</code>). For information about bucket naming\\n         restrictions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-bucket-naming-rules.html\\\">Directory bucket naming\\n            rules</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <p>\\n            <b>Access points</b> - When you use this action with an access point for general purpose buckets, you must provide the alias of the access point in place of the bucket name or specify the access point ARN. When you use this action with an access point for directory buckets, you must provide the access point name in place of the bucket name. When using the access point ARN, you must direct requests to the access point hostname. The access point hostname takes the form <i>AccessPointName</i>-<i>AccountId</i>.s3-accesspoint.<i>Region</i>.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html\\\">Using access points</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <note>\\n            <p>Object Lambda access points are not supported by directory buckets.</p>\\n         </note>\\n         <p>\\n            <b>S3 on Outposts</b> - When you use this action with S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the \\n                     form <code>\\n               <i>AccessPointName</i>-<i>AccountId</i>.<i>outpostID</i>.s3-outposts.<i>Region</i>.amazonaws.com</code>. When you use this action with S3 on Outposts, the destination bucket must be the Outposts access point ARN or the access point alias. For more information about S3 on Outposts, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html\\\">What is S3 on Outposts?</a> in the <i>Amazon S3 User Guide</i>.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"CacheControl\": {\n          \"target\": \"com.amazonaws.s3#CacheControl\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies caching behavior along the request/reply chain.</p>\",\n            \"smithy.api#httpHeader\": \"Cache-Control\"\n          }\n        },\n        \"ContentDisposition\": {\n          \"target\": \"com.amazonaws.s3#ContentDisposition\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies presentational information for the object.</p>\",\n            \"smithy.api#httpHeader\": \"Content-Disposition\"\n          }\n        },\n        \"ContentEncoding\": {\n          \"target\": \"com.amazonaws.s3#ContentEncoding\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies what content encodings have been applied to the object and thus what decoding mechanisms\\n      must be applied to obtain the media-type referenced by the Content-Type header field.</p>\\n         <note>\\n            <p>For directory buckets, only the <code>aws-chunked</code> value is supported in this header field.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"Content-Encoding\"\n          }\n        },\n        \"ContentLanguage\": {\n          \"target\": \"com.amazonaws.s3#ContentLanguage\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The language that the content is in.</p>\",\n            \"smithy.api#httpHeader\": \"Content-Language\"\n          }\n        },\n        \"ContentType\": {\n          \"target\": \"com.amazonaws.s3#ContentType\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A standard MIME type describing the format of the object data.</p>\",\n            \"smithy.api#httpHeader\": \"Content-Type\"\n          }\n        },\n        \"Expires\": {\n          \"target\": \"com.amazonaws.s3#Expires\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The date and time at which the object is no longer cacheable.</p>\",\n            \"smithy.api#httpHeader\": \"Expires\"\n          }\n        },\n        \"GrantFullControl\": {\n          \"target\": \"com.amazonaws.s3#GrantFullControl\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specify access permissions explicitly to give the grantee READ, READ_ACP, and WRITE_ACP permissions\\n      on the object.</p>\\n         <p>By default, all objects are private. Only the owner has full access control. When uploading an\\n      object, you can use this header to explicitly grant access permissions to specific Amazon Web Services accounts or\\n      groups. This header maps to specific permissions that Amazon S3 supports in an ACL. For more information, see\\n        <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html\\\">Access Control List (ACL)\\n        Overview</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <p>You specify each grantee as a type=value pair, where the type is one of the following:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>id</code> – if the value specified is the canonical user ID of an Amazon Web Services account</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>uri</code> – if you are granting permissions to a predefined group</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>emailAddress</code> – if the value specified is the email address of an\\n          Amazon Web Services account</p>\\n               <note>\\n                  <p>Using email addresses to specify a grantee is only supported in the following Amazon Web Services Regions: </p>\\n                  <ul>\\n                     <li>\\n                        <p>US East (N. Virginia)</p>\\n                     </li>\\n                     <li>\\n                        <p>US West (N. California)</p>\\n                     </li>\\n                     <li>\\n                        <p> US West (Oregon)</p>\\n                     </li>\\n                     <li>\\n                        <p> Asia Pacific (Singapore)</p>\\n                     </li>\\n                     <li>\\n                        <p>Asia Pacific (Sydney)</p>\\n                     </li>\\n                     <li>\\n                        <p>Asia Pacific (Tokyo)</p>\\n                     </li>\\n                     <li>\\n                        <p>Europe (Ireland)</p>\\n                     </li>\\n                     <li>\\n                        <p>South America (São Paulo)</p>\\n                     </li>\\n                  </ul>\\n                  <p>For a list of all the Amazon S3 supported Regions and endpoints, see <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region\\\">Regions and Endpoints</a> in the Amazon Web Services General Reference.</p>\\n               </note>\\n            </li>\\n         </ul>\\n         <p>For example, the following <code>x-amz-grant-read</code> header grants the Amazon Web Services accounts identified by account IDs permissions to read object data and its metadata:</p>\\n         <p>\\n            <code>x-amz-grant-read: id=\\\"11112222333\\\", id=\\\"444455556666\\\" </code>\\n         </p>\\n         <note>\\n            <ul>\\n               <li>\\n                  <p>This functionality is not supported for directory buckets.</p>\\n               </li>\\n               <li>\\n                  <p>This functionality is not supported for Amazon S3 on Outposts.</p>\\n               </li>\\n            </ul>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-grant-full-control\"\n          }\n        },\n        \"GrantRead\": {\n          \"target\": \"com.amazonaws.s3#GrantRead\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specify access permissions explicitly to allow grantee to read the object data and its\\n      metadata.</p>\\n         <p>By default, all objects are private. Only the owner has full access control. When uploading an\\n      object, you can use this header to explicitly grant access permissions to specific Amazon Web Services accounts or\\n      groups. This header maps to specific permissions that Amazon S3 supports in an ACL. For more information, see\\n        <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html\\\">Access Control List (ACL)\\n        Overview</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <p>You specify each grantee as a type=value pair, where the type is one of the following:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>id</code> – if the value specified is the canonical user ID of an Amazon Web Services account</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>uri</code> – if you are granting permissions to a predefined group</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>emailAddress</code> – if the value specified is the email address of an\\n          Amazon Web Services account</p>\\n               <note>\\n                  <p>Using email addresses to specify a grantee is only supported in the following Amazon Web Services Regions: </p>\\n                  <ul>\\n                     <li>\\n                        <p>US East (N. Virginia)</p>\\n                     </li>\\n                     <li>\\n                        <p>US West (N. California)</p>\\n                     </li>\\n                     <li>\\n                        <p> US West (Oregon)</p>\\n                     </li>\\n                     <li>\\n                        <p> Asia Pacific (Singapore)</p>\\n                     </li>\\n                     <li>\\n                        <p>Asia Pacific (Sydney)</p>\\n                     </li>\\n                     <li>\\n                        <p>Asia Pacific (Tokyo)</p>\\n                     </li>\\n                     <li>\\n                        <p>Europe (Ireland)</p>\\n                     </li>\\n                     <li>\\n                        <p>South America (São Paulo)</p>\\n                     </li>\\n                  </ul>\\n                  <p>For a list of all the Amazon S3 supported Regions and endpoints, see <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region\\\">Regions and Endpoints</a> in the Amazon Web Services General Reference.</p>\\n               </note>\\n            </li>\\n         </ul>\\n         <p>For example, the following <code>x-amz-grant-read</code> header grants the Amazon Web Services accounts identified by account IDs permissions to read object data and its metadata:</p>\\n         <p>\\n            <code>x-amz-grant-read: id=\\\"11112222333\\\", id=\\\"444455556666\\\" </code>\\n         </p>\\n         <note>\\n            <ul>\\n               <li>\\n                  <p>This functionality is not supported for directory buckets.</p>\\n               </li>\\n               <li>\\n                  <p>This functionality is not supported for Amazon S3 on Outposts.</p>\\n               </li>\\n            </ul>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-grant-read\"\n          }\n        },\n        \"GrantReadACP\": {\n          \"target\": \"com.amazonaws.s3#GrantReadACP\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specify access permissions explicitly to allows grantee to read the object ACL.</p>\\n         <p>By default, all objects are private. Only the owner has full access control. When uploading an\\n      object, you can use this header to explicitly grant access permissions to specific Amazon Web Services accounts or\\n      groups. This header maps to specific permissions that Amazon S3 supports in an ACL. For more information, see\\n        <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html\\\">Access Control List (ACL)\\n        Overview</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <p>You specify each grantee as a type=value pair, where the type is one of the following:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>id</code> – if the value specified is the canonical user ID of an Amazon Web Services account</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>uri</code> – if you are granting permissions to a predefined group</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>emailAddress</code> – if the value specified is the email address of an\\n          Amazon Web Services account</p>\\n               <note>\\n                  <p>Using email addresses to specify a grantee is only supported in the following Amazon Web Services Regions: </p>\\n                  <ul>\\n                     <li>\\n                        <p>US East (N. Virginia)</p>\\n                     </li>\\n                     <li>\\n                        <p>US West (N. California)</p>\\n                     </li>\\n                     <li>\\n                        <p> US West (Oregon)</p>\\n                     </li>\\n                     <li>\\n                        <p> Asia Pacific (Singapore)</p>\\n                     </li>\\n                     <li>\\n                        <p>Asia Pacific (Sydney)</p>\\n                     </li>\\n                     <li>\\n                        <p>Asia Pacific (Tokyo)</p>\\n                     </li>\\n                     <li>\\n                        <p>Europe (Ireland)</p>\\n                     </li>\\n                     <li>\\n                        <p>South America (São Paulo)</p>\\n                     </li>\\n                  </ul>\\n                  <p>For a list of all the Amazon S3 supported Regions and endpoints, see <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region\\\">Regions and Endpoints</a> in the Amazon Web Services General Reference.</p>\\n               </note>\\n            </li>\\n         </ul>\\n         <p>For example, the following <code>x-amz-grant-read</code> header grants the Amazon Web Services accounts identified by account IDs permissions to read object data and its metadata:</p>\\n         <p>\\n            <code>x-amz-grant-read: id=\\\"11112222333\\\", id=\\\"444455556666\\\" </code>\\n         </p>\\n         <note>\\n            <ul>\\n               <li>\\n                  <p>This functionality is not supported for directory buckets.</p>\\n               </li>\\n               <li>\\n                  <p>This functionality is not supported for Amazon S3 on Outposts.</p>\\n               </li>\\n            </ul>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-grant-read-acp\"\n          }\n        },\n        \"GrantWriteACP\": {\n          \"target\": \"com.amazonaws.s3#GrantWriteACP\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specify access permissions explicitly to allows grantee to allow grantee to write the ACL for the\\n      applicable object.</p>\\n         <p>By default, all objects are private. Only the owner has full access control. When uploading an\\n      object, you can use this header to explicitly grant access permissions to specific Amazon Web Services accounts or\\n      groups. This header maps to specific permissions that Amazon S3 supports in an ACL. For more information, see\\n        <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html\\\">Access Control List (ACL)\\n        Overview</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <p>You specify each grantee as a type=value pair, where the type is one of the following:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>id</code> – if the value specified is the canonical user ID of an Amazon Web Services account</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>uri</code> – if you are granting permissions to a predefined group</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>emailAddress</code> – if the value specified is the email address of an\\n          Amazon Web Services account</p>\\n               <note>\\n                  <p>Using email addresses to specify a grantee is only supported in the following Amazon Web Services Regions: </p>\\n                  <ul>\\n                     <li>\\n                        <p>US East (N. Virginia)</p>\\n                     </li>\\n                     <li>\\n                        <p>US West (N. California)</p>\\n                     </li>\\n                     <li>\\n                        <p> US West (Oregon)</p>\\n                     </li>\\n                     <li>\\n                        <p> Asia Pacific (Singapore)</p>\\n                     </li>\\n                     <li>\\n                        <p>Asia Pacific (Sydney)</p>\\n                     </li>\\n                     <li>\\n                        <p>Asia Pacific (Tokyo)</p>\\n                     </li>\\n                     <li>\\n                        <p>Europe (Ireland)</p>\\n                     </li>\\n                     <li>\\n                        <p>South America (São Paulo)</p>\\n                     </li>\\n                  </ul>\\n                  <p>For a list of all the Amazon S3 supported Regions and endpoints, see <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region\\\">Regions and Endpoints</a> in the Amazon Web Services General Reference.</p>\\n               </note>\\n            </li>\\n         </ul>\\n         <p>For example, the following <code>x-amz-grant-read</code> header grants the Amazon Web Services accounts identified by account IDs permissions to read object data and its metadata:</p>\\n         <p>\\n            <code>x-amz-grant-read: id=\\\"11112222333\\\", id=\\\"444455556666\\\" </code>\\n         </p>\\n         <note>\\n            <ul>\\n               <li>\\n                  <p>This functionality is not supported for directory buckets.</p>\\n               </li>\\n               <li>\\n                  <p>This functionality is not supported for Amazon S3 on Outposts.</p>\\n               </li>\\n            </ul>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-grant-write-acp\"\n          }\n        },\n        \"Key\": {\n          \"target\": \"com.amazonaws.s3#ObjectKey\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Object key for which the multipart upload is to be initiated.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Key\"\n            }\n          }\n        },\n        \"Metadata\": {\n          \"target\": \"com.amazonaws.s3#Metadata\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A map of metadata to store with the object in S3.</p>\",\n            \"smithy.api#httpPrefixHeaders\": \"x-amz-meta-\"\n          }\n        },\n        \"ServerSideEncryption\": {\n          \"target\": \"com.amazonaws.s3#ServerSideEncryption\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The server-side encryption algorithm used when you store this object in Amazon S3 or Amazon FSx.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <b>Directory buckets </b> -\\n          For directory buckets, there are only two supported options for server-side encryption: server-side encryption with Amazon S3 managed keys (SSE-S3) (<code>AES256</code>) and server-side encryption with KMS keys (SSE-KMS) (<code>aws:kms</code>). We recommend that the bucket's default encryption uses the desired encryption configuration and you don't override the bucket default encryption in your \\n            <code>CreateSession</code> requests or <code>PUT</code> object requests. Then, new objects \\n are automatically encrypted with the desired encryption settings. For more\\n         information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-serv-side-encryption.html\\\">Protecting data with server-side encryption</a> in the <i>Amazon S3 User Guide</i>. For more information about the encryption overriding behaviors in directory buckets, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-specifying-kms-encryption.html\\\">Specifying server-side encryption with KMS for new object uploads</a>. </p>\\n               <p>In the Zonal endpoint API calls (except <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html\\\">CopyObject</a> and <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html\\\">UploadPartCopy</a>) using the REST API, the encryption request headers must match the encryption settings that are specified in the <code>CreateSession</code> request. \\n                            You can't override the values of the encryption settings (<code>x-amz-server-side-encryption</code>, <code>x-amz-server-side-encryption-aws-kms-key-id</code>, <code>x-amz-server-side-encryption-context</code>, and <code>x-amz-server-side-encryption-bucket-key-enabled</code>) that are specified in the <code>CreateSession</code> request. \\n                            You don't need to explicitly specify these encryption settings values in Zonal endpoint API calls, and   \\n                            Amazon S3 will use the encryption settings values from the <code>CreateSession</code> request to protect new objects in the directory bucket. \\n                           </p>\\n               <note>\\n                  <p>When you use the CLI or the Amazon Web Services SDKs, for <code>CreateSession</code>, the session token refreshes automatically to avoid service interruptions when a session expires. The CLI or the Amazon Web Services SDKs use the bucket's default encryption configuration for the \\n                            <code>CreateSession</code> request. It's not supported to override the encryption settings values in the <code>CreateSession</code> request. \\n                            So in the Zonal endpoint API calls (except <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html\\\">CopyObject</a> and <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html\\\">UploadPartCopy</a>), \\n          the encryption request headers must match the default encryption configuration of the directory bucket.\\n\\n</p>\\n               </note>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>S3 access points for Amazon FSx </b> - When accessing data stored in\\n          Amazon FSx file systems using S3 access points, the only valid server side encryption option is\\n            <code>aws:fsx</code>. All Amazon FSx file systems have encryption configured by default and are\\n          encrypted at rest. Data is automatically encrypted before being written to the file system, and\\n          automatically decrypted as it is read. These processes are handled transparently by Amazon FSx.</p>\\n            </li>\\n         </ul>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption\"\n          }\n        },\n        \"StorageClass\": {\n          \"target\": \"com.amazonaws.s3#StorageClass\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>By default, Amazon S3 uses the STANDARD Storage Class to store newly created objects. The STANDARD\\n      storage class provides high durability and high availability. Depending on performance needs, you can\\n      specify a different Storage Class. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/storage-class-intro.html\\\">Storage Classes</a> in the\\n        <i>Amazon S3 User Guide</i>.</p>\\n         <note>\\n            <ul>\\n               <li>\\n                  <p>Directory buckets only support <code>EXPRESS_ONEZONE</code> (the S3 Express One Zone storage class) in\\n            Availability Zones and <code>ONEZONE_IA</code> (the S3 One Zone-Infrequent Access storage class) in\\n            Dedicated Local Zones.</p>\\n               </li>\\n               <li>\\n                  <p>Amazon S3 on Outposts only uses the OUTPOSTS Storage Class.</p>\\n               </li>\\n            </ul>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-storage-class\"\n          }\n        },\n        \"WebsiteRedirectLocation\": {\n          \"target\": \"com.amazonaws.s3#WebsiteRedirectLocation\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>If the bucket is configured as a website, redirects requests for this object to another object in\\n      the same bucket or to an external URL. Amazon S3 stores the value of this header in the object\\n      metadata.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-website-redirect-location\"\n          }\n        },\n        \"SSECustomerAlgorithm\": {\n          \"target\": \"com.amazonaws.s3#SSECustomerAlgorithm\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the algorithm to use when encrypting the object (for example, AES256).</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption-customer-algorithm\"\n          }\n        },\n        \"SSECustomerKey\": {\n          \"target\": \"com.amazonaws.s3#SSECustomerKey\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the customer-provided encryption key for Amazon S3 to use in encrypting data. This value is\\n      used to store the object and then it is discarded; Amazon S3 does not store the encryption key. The key must\\n      be appropriate for use with the algorithm specified in the\\n        <code>x-amz-server-side-encryption-customer-algorithm</code> header.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption-customer-key\"\n          }\n        },\n        \"SSECustomerKeyMD5\": {\n          \"target\": \"com.amazonaws.s3#SSECustomerKeyMD5\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the 128-bit MD5 digest of the customer-provided encryption key according to RFC 1321. Amazon S3\\n      uses this header for a message integrity check to ensure that the encryption key was transmitted without\\n      error.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption-customer-key-MD5\"\n          }\n        },\n        \"SSEKMSKeyId\": {\n          \"target\": \"com.amazonaws.s3#SSEKMSKeyId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the KMS key ID (Key ID, Key ARN, or Key Alias) to use for object encryption. If the KMS key doesn't exist in the same\\n         account that's issuing the command, you must use the full Key ARN not the Key ID.</p>\\n         <p>\\n            <b>General purpose buckets</b> - If you specify <code>x-amz-server-side-encryption</code> with <code>aws:kms</code> or <code>aws:kms:dsse</code>, this header specifies the ID (Key ID, Key ARN, or Key Alias) of the KMS \\n         key to use. If you specify\\n         <code>x-amz-server-side-encryption:aws:kms</code> or\\n         <code>x-amz-server-side-encryption:aws:kms:dsse</code>, but do not provide <code>x-amz-server-side-encryption-aws-kms-key-id</code>, Amazon S3 uses the Amazon Web Services managed key\\n         (<code>aws/s3</code>) to protect the data.</p>\\n         <p>\\n            <b>Directory buckets</b> - To encrypt data using SSE-KMS, it's recommended to specify the \\n<code>x-amz-server-side-encryption</code> header to <code>aws:kms</code>. Then, the <code>x-amz-server-side-encryption-aws-kms-key-id</code> header implicitly uses \\nthe bucket's default KMS customer managed key ID. If you want to explicitly set the <code>\\n         x-amz-server-side-encryption-aws-kms-key-id</code> header, it must match the bucket's default customer managed key (using key ID or ARN, not alias). Your SSE-KMS configuration can only support 1 <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk\\\">customer managed key</a> per directory bucket's lifetime. \\nThe <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk\\\">Amazon Web Services managed key</a> (<code>aws/s3</code>) isn't supported. \\n                            \\n Incorrect key specification results in an HTTP <code>400 Bad Request</code> error. </p>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption-aws-kms-key-id\"\n          }\n        },\n        \"SSEKMSEncryptionContext\": {\n          \"target\": \"com.amazonaws.s3#SSEKMSEncryptionContext\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the Amazon Web Services KMS Encryption Context to use for object encryption. The value of\\n         this header is a Base64 encoded string of a UTF-8 encoded JSON, which contains the encryption context as key-value pairs.</p>\\n         <p>\\n            <b>Directory buckets</b> - You can optionally provide an explicit encryption context value. The value must match the default encryption context - the bucket Amazon Resource Name (ARN). An additional encryption context value is not supported. </p>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption-context\"\n          }\n        },\n        \"BucketKeyEnabled\": {\n          \"target\": \"com.amazonaws.s3#BucketKeyEnabled\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies whether Amazon S3 should use an S3 Bucket Key for object encryption with\\n         server-side encryption using Key Management Service (KMS) keys (SSE-KMS).</p>\\n         <p>\\n            <b>General purpose buckets</b> - Setting this header to\\n            <code>true</code> causes Amazon S3 to use an S3 Bucket Key for object encryption with\\n         SSE-KMS. Also, specifying this header with a PUT action doesn't affect bucket-level settings for S3\\n         Bucket Key.</p>\\n         <p>\\n            <b>Directory buckets</b> - S3 Bucket Keys are always enabled for <code>GET</code> and <code>PUT</code> operations in a directory bucket and can’t be disabled. S3 Bucket Keys aren't supported, when you copy SSE-KMS encrypted objects from general purpose buckets  \\nto directory buckets, from directory buckets to general purpose buckets, or between directory buckets, through <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html\\\">CopyObject</a>, <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html\\\">UploadPartCopy</a>, <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-buckets-objects-Batch-Ops\\\">the Copy operation in Batch Operations</a>, or \\n                            <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/create-import-job\\\">the import jobs</a>. In this case, Amazon S3 makes a call to KMS every time a copy request is made for a KMS-encrypted object.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption-bucket-key-enabled\"\n          }\n        },\n        \"RequestPayer\": {\n          \"target\": \"com.amazonaws.s3#RequestPayer\",\n          \"traits\": {\n            \"smithy.api#httpHeader\": \"x-amz-request-payer\"\n          }\n        },\n        \"Tagging\": {\n          \"target\": \"com.amazonaws.s3#TaggingHeader\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The tag-set for the object. The tag-set must be encoded as URL Query parameters.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-tagging\"\n          }\n        },\n        \"ObjectLockMode\": {\n          \"target\": \"com.amazonaws.s3#ObjectLockMode\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the Object Lock mode that you want to apply to the uploaded object.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-object-lock-mode\"\n          }\n        },\n        \"ObjectLockRetainUntilDate\": {\n          \"target\": \"com.amazonaws.s3#ObjectLockRetainUntilDate\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the date and time when you want the Object Lock to expire.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-object-lock-retain-until-date\"\n          }\n        },\n        \"ObjectLockLegalHoldStatus\": {\n          \"target\": \"com.amazonaws.s3#ObjectLockLegalHoldStatus\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies whether you want to apply a legal hold to the uploaded object.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-object-lock-legal-hold\"\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        },\n        \"ChecksumAlgorithm\": {\n          \"target\": \"com.amazonaws.s3#ChecksumAlgorithm\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Indicates the algorithm that you want Amazon S3 to use to create the checksum for the object. For more information, see\\n    <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking object integrity</a> in\\n    the <i>Amazon S3 User Guide</i>.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-checksum-algorithm\"\n          }\n        },\n        \"ChecksumType\": {\n          \"target\": \"com.amazonaws.s3#ChecksumType\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Indicates the checksum type that you want Amazon S3 to use to calculate the object’s checksum value. For\\n      more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking object integrity in the Amazon S3\\n        User Guide</a>.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-checksum-type\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#CreateSession\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#CreateSessionRequest\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.s3#CreateSessionOutput\"\n      },\n      \"errors\": [\n        {\n          \"target\": \"com.amazonaws.s3#NoSuchBucket\"\n        }\n      ],\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Creates a session that establishes temporary security credentials to support fast authentication and\\n      authorization for the Zonal endpoint API operations on directory buckets. For more information about Zonal endpoint API operations that\\n      include the Availability Zone in the request endpoint, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-APIs.html\\\">S3 Express One Zone APIs</a> in the\\n        <i>Amazon S3 User Guide</i>. </p>\\n         <p>To make Zonal endpoint API requests on a directory bucket, use the <code>CreateSession</code> API\\n      operation. Specifically, you grant <code>s3express:CreateSession</code> permission to a bucket in\\n      a bucket policy or an IAM identity-based policy. Then, you use IAM credentials to make the <code>CreateSession</code>\\n      API request on the bucket, which returns temporary security credentials that include the access key ID,\\n      secret access key, session token, and expiration. These credentials have associated permissions to\\n      access the Zonal endpoint API operations. After the session is created, you don’t need to use other policies to grant\\n      permissions to each Zonal endpoint API individually. Instead, in your Zonal endpoint API requests, you sign your\\n      requests by applying the temporary security credentials of the session to the request headers and\\n      following the SigV4 protocol for authentication. You also apply the session token to the\\n        <code>x-amz-s3session-token</code> request header for authorization. Temporary security credentials\\n      are scoped to the bucket and expire after 5 minutes. After the expiration time, any calls that you make\\n      with those credentials will fail. You must use IAM credentials again to make a\\n        <code>CreateSession</code> API request that generates a new set of temporary credentials for use.\\n      Temporary credentials cannot be extended or refreshed beyond the original specified interval.</p>\\n         <p>If you use Amazon Web Services SDKs, SDKs handle the session token refreshes automatically to avoid service\\n      interruptions when a session expires. We recommend that you use the Amazon Web Services SDKs to initiate and manage\\n      requests to the CreateSession API. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-optimizing-performance-guidelines-design-patterns.html#s3-express-optimizing-performance-session-authentication\\\">Performance guidelines and design patterns</a> in the\\n      <i>Amazon S3 User Guide</i>.</p>\\n         <note>\\n            <ul>\\n               <li>\\n                  <p>You must make requests for this API operation to the Zonal endpoint. These endpoints support virtual-hosted-style requests in the format <code>https://<i>bucket-name</i>.s3express-<i>zone-id</i>.<i>region-code</i>.amazonaws.com</code>. Path-style requests are not supported. For more information about endpoints in Availability Zones, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/endpoint-directory-buckets-AZ.html\\\">Regional and Zonal endpoints for directory buckets in Availability Zones</a> in the\\n    <i>Amazon S3 User Guide</i>. For more information about endpoints in Local Zones, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-lzs-for-directory-buckets.html\\\">Concepts for directory buckets in Local Zones</a> in the\\n    <i>Amazon S3 User Guide</i>.</p>\\n               </li>\\n               <li>\\n                  <p>\\n                     <b>\\n                        <code>CopyObject</code> API operation</b> - Unlike other\\n            Zonal endpoint API operations, the <code>CopyObject</code> API operation doesn't use the temporary security\\n            credentials returned from the <code>CreateSession</code> API operation for authentication and\\n            authorization. For information about authentication and authorization of the\\n              <code>CopyObject</code> API operation on directory buckets, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html\\\">CopyObject</a>.</p>\\n               </li>\\n               <li>\\n                  <p>\\n                     <b>\\n                        <code>HeadBucket</code> API operation</b> - Unlike other\\n            Zonal endpoint API operations, the <code>HeadBucket</code> API operation doesn't use the temporary security\\n            credentials returned from the <code>CreateSession</code> API operation for authentication and\\n            authorization. For information about authentication and authorization of the\\n              <code>HeadBucket</code> API operation on directory buckets, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_HeadBucket.html\\\">HeadBucket</a>.</p>\\n               </li>\\n            </ul>\\n         </note>\\n         <dl>\\n            <dt>Permissions</dt>\\n            <dd>\\n               <p>To obtain temporary security credentials, you must create a bucket policy or an IAM identity-based policy that\\n            grants <code>s3express:CreateSession</code> permission to the bucket. In a policy, you can have\\n            the <code>s3express:SessionMode</code> condition key to control who can create a\\n              <code>ReadWrite</code> or <code>ReadOnly</code> session. For more information about\\n              <code>ReadWrite</code> or <code>ReadOnly</code> sessions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateSession.html#API_CreateSession_RequestParameters\\\">\\n                     <code>x-amz-create-session-mode</code>\\n                  </a>. For example policies, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-security-iam-example-bucket-policies.html\\\">Example\\n              bucket policies for S3 Express One Zone</a> and <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-security-iam-identity-policies.html\\\">Amazon Web Services Identity\\n              and Access Management (IAM) identity-based policies for S3 Express One Zone</a> in the\\n              <i>Amazon S3 User Guide</i>. </p>\\n               <p>To grant cross-account access to Zonal endpoint API operations, the bucket policy should also grant both\\n            accounts the <code>s3express:CreateSession</code> permission.</p>\\n               <p>If you want to encrypt objects with SSE-KMS, you must also have the\\n              <code>kms:GenerateDataKey</code> and the <code>kms:Decrypt</code> permissions in IAM\\n            identity-based policies and KMS key policies for the target KMS key.</p>\\n            </dd>\\n            <dt>Encryption</dt>\\n            <dd>\\n               <p>For directory buckets, there are only two supported options for server-side encryption: server-side encryption with Amazon S3 managed keys (SSE-S3) (<code>AES256</code>) and server-side encryption with KMS keys (SSE-KMS) (<code>aws:kms</code>). We recommend that the bucket's default encryption uses the desired encryption configuration and you don't override the bucket default encryption in your \\n            <code>CreateSession</code> requests or <code>PUT</code> object requests. Then, new objects \\n are automatically encrypted with the desired encryption settings. For more\\n         information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-serv-side-encryption.html\\\">Protecting data with server-side encryption</a> in the <i>Amazon S3 User Guide</i>. For more information about the encryption overriding behaviors in directory buckets, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-specifying-kms-encryption.html\\\">Specifying server-side encryption with KMS for new object uploads</a>.</p>\\n               <p>For <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-differences.html#s3-express-differences-api-operations\\\">Zonal endpoint (object-level) API operations</a> except <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html\\\">CopyObject</a> and <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html\\\">UploadPartCopy</a>,  \\nyou authenticate and authorize requests through <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateSession.html\\\">CreateSession</a> for low latency. \\n                            To encrypt new objects in a directory bucket with SSE-KMS, you must specify SSE-KMS as the directory bucket's default encryption configuration with a KMS key (specifically, a <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk\\\">customer managed key</a>). Then, when a session is created for Zonal endpoint API operations, new objects are automatically encrypted and decrypted with SSE-KMS and S3 Bucket Keys during the session.</p>\\n               <note>\\n                  <p>\\n                            Only 1 <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk\\\">customer managed key</a> is supported per directory bucket for the lifetime of the bucket. The <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk\\\">Amazon Web Services managed key</a> (<code>aws/s3</code>) isn't supported. \\n                            After you specify SSE-KMS as your bucket's default encryption configuration with a customer managed key, you can't change the customer managed key for the bucket's SSE-KMS configuration.\\n                            </p>\\n               </note>\\n               <p>In the Zonal endpoint API calls (except <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html\\\">CopyObject</a> and <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html\\\">UploadPartCopy</a>) using the REST API, \\n                            you can't override the values of the encryption settings (<code>x-amz-server-side-encryption</code>, <code>x-amz-server-side-encryption-aws-kms-key-id</code>, <code>x-amz-server-side-encryption-context</code>, and <code>x-amz-server-side-encryption-bucket-key-enabled</code>) from the <code>CreateSession</code> request. \\n                            You don't need to explicitly specify these encryption settings values in Zonal endpoint API calls, and   \\n                            Amazon S3 will use the encryption settings values from the <code>CreateSession</code> request to protect new objects in the directory bucket. \\n                           </p>\\n               <note>\\n                  <p>When you use the CLI or the Amazon Web Services SDKs, for <code>CreateSession</code>, the session token refreshes automatically to avoid service interruptions when a session expires. The CLI or the Amazon Web Services SDKs use the bucket's default encryption configuration for the \\n                            <code>CreateSession</code> request. It's not supported to override the encryption settings values in the <code>CreateSession</code> request. \\n                            Also, in the Zonal endpoint API calls (except <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html\\\">CopyObject</a> and <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html\\\">UploadPartCopy</a>), \\n          it's not supported to override the values of the encryption settings from the <code>CreateSession</code> request. \\n\\n</p>\\n               </note>\\n            </dd>\\n            <dt>HTTP Host header syntax</dt>\\n            <dd>\\n               <p>\\n                  <b>Directory buckets </b> - The HTTP Host header syntax is <code>\\n                     <i>Bucket-name</i>.s3express-<i>zone-id</i>.<i>region-code</i>.amazonaws.com</code>.</p>\\n            </dd>\\n         </dl>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#http\": {\n          \"method\": \"GET\",\n          \"uri\": \"/{Bucket}?session\",\n          \"code\": 200\n        },\n        \"smithy.rules#staticContextParams\": {\n          \"DisableS3ExpressSessionAuth\": {\n            \"value\": true\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#CreateSessionOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"ServerSideEncryption\": {\n          \"target\": \"com.amazonaws.s3#ServerSideEncryption\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The server-side encryption algorithm used when you store objects in the directory bucket.</p>\\n         <note>\\n            <p>When accessing data stored in Amazon FSx file systems using S3 access points, the only valid server side\\n        encryption option is <code>aws:fsx</code>.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption\"\n          }\n        },\n        \"SSEKMSKeyId\": {\n          \"target\": \"com.amazonaws.s3#SSEKMSKeyId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>If you specify <code>x-amz-server-side-encryption</code> with <code>aws:kms</code>, this header indicates the ID of the KMS \\n         symmetric encryption customer managed key that was used for object encryption.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption-aws-kms-key-id\"\n          }\n        },\n        \"SSEKMSEncryptionContext\": {\n          \"target\": \"com.amazonaws.s3#SSEKMSEncryptionContext\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>If present, indicates the Amazon Web Services KMS Encryption Context to use for object encryption. The value of\\n         this header is a Base64 encoded string of a UTF-8 encoded JSON, which contains the encryption context as key-value pairs. \\n         This value is stored as object metadata and automatically gets\\n         passed on to Amazon Web Services KMS for future <code>GetObject</code> \\n         operations on this object.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption-context\"\n          }\n        },\n        \"BucketKeyEnabled\": {\n          \"target\": \"com.amazonaws.s3#BucketKeyEnabled\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Indicates whether to use an S3 Bucket Key for server-side encryption\\n         with KMS keys (SSE-KMS).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption-bucket-key-enabled\"\n          }\n        },\n        \"Credentials\": {\n          \"target\": \"com.amazonaws.s3#SessionCredentials\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The established temporary security credentials for the created session.</p>\",\n            \"smithy.api#required\": {},\n            \"smithy.api#xmlName\": \"Credentials\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#output\": {},\n        \"smithy.api#xmlName\": \"CreateSessionResult\"\n      }\n    },\n    \"com.amazonaws.s3#CreateSessionRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"SessionMode\": {\n          \"target\": \"com.amazonaws.s3#SessionMode\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the mode of the session that will be created, either <code>ReadWrite</code> or\\n        <code>ReadOnly</code>. By default, a <code>ReadWrite</code> session is created. A\\n        <code>ReadWrite</code> session is capable of executing all the Zonal endpoint API operations on a directory bucket. A\\n        <code>ReadOnly</code> session is constrained to execute the following Zonal endpoint API operations:\\n        <code>GetObject</code>, <code>HeadObject</code>, <code>ListObjectsV2</code>,\\n        <code>GetObjectAttributes</code>, <code>ListParts</code>, and\\n      <code>ListMultipartUploads</code>.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-create-session-mode\"\n          }\n        },\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the bucket that you create a session for.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"ServerSideEncryption\": {\n          \"target\": \"com.amazonaws.s3#ServerSideEncryption\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The server-side encryption algorithm to use when you store objects in the directory bucket.</p>\\n         <p>For directory buckets, there are only two supported options for server-side encryption: server-side encryption with Amazon S3 managed keys (SSE-S3) (<code>AES256</code>) and server-side encryption with KMS keys (SSE-KMS) (<code>aws:kms</code>). By default, Amazon S3 encrypts data with SSE-S3. \\n         For more\\n         information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/serv-side-encryption.html\\\">Protecting data with server-side encryption</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <p>\\n            <b>S3 access points for Amazon FSx </b> - When accessing data stored in Amazon FSx\\n      file systems using S3 access points, the only valid server side encryption option is <code>aws:fsx</code>. All\\n      Amazon FSx file systems have encryption configured by default and are encrypted at rest. Data is\\n      automatically encrypted before being written to the file system, and automatically decrypted as it is\\n      read. These processes are handled transparently by Amazon FSx.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption\"\n          }\n        },\n        \"SSEKMSKeyId\": {\n          \"target\": \"com.amazonaws.s3#SSEKMSKeyId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>If you specify <code>x-amz-server-side-encryption</code> with <code>aws:kms</code>, you must specify the <code>\\n         x-amz-server-side-encryption-aws-kms-key-id</code> header with the ID (Key ID or Key ARN) of the KMS \\n         symmetric encryption customer managed key to use. Otherwise, you get an HTTP <code>400 Bad Request</code> error. Only use the key ID or key ARN. The key alias format of the KMS key isn't supported. Also, if the KMS key doesn't exist in the same\\n         account that't issuing the command, you must use the full Key ARN not the Key ID. </p>\\n         <p>Your SSE-KMS configuration can only support 1 <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk\\\">customer managed key</a> per directory bucket's lifetime. \\nThe <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk\\\">Amazon Web Services managed key</a> (<code>aws/s3</code>) isn't supported. \\n</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption-aws-kms-key-id\"\n          }\n        },\n        \"SSEKMSEncryptionContext\": {\n          \"target\": \"com.amazonaws.s3#SSEKMSEncryptionContext\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the Amazon Web Services KMS Encryption Context as an additional encryption context to use for object encryption. The value of\\n         this header is a Base64 encoded string of a UTF-8 encoded JSON, which contains the encryption context as key-value pairs. \\n         This value is stored as object metadata and automatically gets passed on\\n         to Amazon Web Services KMS for future <code>GetObject</code> operations on\\n         this object.</p>\\n         <p>\\n            <b>General purpose buckets</b> - This value must be explicitly added during <code>CopyObject</code> operations if you want an additional encryption context for your object. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingKMSEncryption.html#encryption-context\\\">Encryption context</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <p>\\n            <b>Directory buckets</b> - You can optionally provide an explicit encryption context value. The value must match the default encryption context - the bucket Amazon Resource Name (ARN). An additional encryption context value is not supported. </p>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption-context\"\n          }\n        },\n        \"BucketKeyEnabled\": {\n          \"target\": \"com.amazonaws.s3#BucketKeyEnabled\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies whether Amazon S3 should use an S3 Bucket Key for object encryption with\\n         server-side encryption using KMS keys (SSE-KMS).</p>\\n         <p>S3 Bucket Keys are always enabled for <code>GET</code> and <code>PUT</code> operations in a directory bucket and can’t be disabled. S3 Bucket Keys aren't supported, when you copy SSE-KMS encrypted objects from general purpose buckets  \\nto directory buckets, from directory buckets to general purpose buckets, or between directory buckets, through <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html\\\">CopyObject</a>, <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html\\\">UploadPartCopy</a>, <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-buckets-objects-Batch-Ops\\\">the Copy operation in Batch Operations</a>, or \\n                            <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/create-import-job\\\">the import jobs</a>. In this case, Amazon S3 makes a call to KMS every time a copy request is made for a KMS-encrypted object.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption-bucket-key-enabled\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#CreationDate\": {\n      \"type\": \"timestamp\"\n    },\n    \"com.amazonaws.s3#DataRedundancy\": {\n      \"type\": \"enum\",\n      \"members\": {\n        \"SingleAvailabilityZone\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"SingleAvailabilityZone\"\n          }\n        },\n        \"SingleLocalZone\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"SingleLocalZone\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#Date\": {\n      \"type\": \"timestamp\",\n      \"traits\": {\n        \"smithy.api#timestampFormat\": \"date-time\"\n      }\n    },\n    \"com.amazonaws.s3#Days\": {\n      \"type\": \"integer\"\n    },\n    \"com.amazonaws.s3#DaysAfterInitiation\": {\n      \"type\": \"integer\"\n    },\n    \"com.amazonaws.s3#DefaultRetention\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Mode\": {\n          \"target\": \"com.amazonaws.s3#ObjectLockRetentionMode\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The default Object Lock retention mode you want to apply to new objects placed in the specified\\n      bucket. Must be used with either <code>Days</code> or <code>Years</code>.</p>\"\n          }\n        },\n        \"Days\": {\n          \"target\": \"com.amazonaws.s3#Days\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The number of days that you want to specify for the default retention period. Must be used with\\n        <code>Mode</code>.</p>\"\n          }\n        },\n        \"Years\": {\n          \"target\": \"com.amazonaws.s3#Years\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The number of years that you want to specify for the default retention period. Must be used with\\n        <code>Mode</code>.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>The container element for optionally specifying the default Object Lock retention settings for new\\n      objects placed in the specified bucket.</p>\\n         <note>\\n            <ul>\\n               <li>\\n                  <p>The <code>DefaultRetention</code> settings require both a mode and a period.</p>\\n               </li>\\n               <li>\\n                  <p>The <code>DefaultRetention</code> period can be either <code>Days</code> or <code>Years</code>\\n            but you must select one. You cannot specify <code>Days</code> and <code>Years</code> at the same\\n            time.</p>\\n               </li>\\n            </ul>\\n         </note>\"\n      }\n    },\n    \"com.amazonaws.s3#Delete\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Objects\": {\n          \"target\": \"com.amazonaws.s3#ObjectIdentifierList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The object to delete.</p>\\n         <note>\\n            <p>\\n               <b>Directory buckets</b> - For directory buckets, an object\\n        that's composed entirely of whitespace characters is not supported by the <code>DeleteObjects</code>\\n        API operation. The request will receive a <code>400 Bad Request</code> error and none of the objects\\n        in the request will be deleted.</p>\\n         </note>\",\n            \"smithy.api#required\": {},\n            \"smithy.api#xmlFlattened\": {},\n            \"smithy.api#xmlName\": \"Object\"\n          }\n        },\n        \"Quiet\": {\n          \"target\": \"com.amazonaws.s3#Quiet\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Element to enable quiet mode for the request. When you add this element, you must set its value to\\n        <code>true</code>.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Container for the objects to delete.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#DeleteBucket\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#DeleteBucketRequest\"\n      },\n      \"output\": {\n        \"target\": \"smithy.api#Unit\"\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Deletes the S3 bucket. All objects (including all object versions and delete markers) in the bucket\\n      must be deleted before the bucket itself can be deleted.</p>\\n         <note>\\n            <ul>\\n               <li>\\n                  <p>\\n                     <b>Directory buckets</b> - If multipart uploads in a\\n            directory bucket are in progress, you can't delete the bucket until all the in-progress multipart\\n            uploads are aborted or completed.</p>\\n               </li>\\n               <li>\\n                  <p>\\n                     <b>Directory buckets </b> - For directory buckets, you must make requests for this API operation to the Regional endpoint. These endpoints support path-style requests in the format <code>https://s3express-control.<i>region-code</i>.amazonaws.com/<i>bucket-name</i>\\n                     </code>. Virtual-hosted-style requests aren't supported. \\nFor more information about endpoints in Availability Zones, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/endpoint-directory-buckets-AZ.html\\\">Regional and Zonal endpoints for directory buckets in Availability Zones</a> in the\\n    <i>Amazon S3 User Guide</i>. For more information about endpoints in Local Zones, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-lzs-for-directory-buckets.html\\\">Concepts for directory buckets in Local Zones</a> in the\\n    <i>Amazon S3 User Guide</i>.</p>\\n               </li>\\n            </ul>\\n         </note>\\n         <dl>\\n            <dt>Permissions</dt>\\n            <dd>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <b>General purpose bucket permissions</b> - You must have the\\n                  <code>s3:DeleteBucket</code> permission on the specified bucket in a policy.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <b>Directory bucket permissions</b> - You must have the\\n                  <code>s3express:DeleteBucket</code> permission in an IAM identity-based policy instead of a bucket policy.\\n                Cross-account access to this API operation isn't supported. This operation can only be performed by the Amazon Web Services account that owns the resource. For more information about directory bucket policies and permissions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-security-iam.html\\\">Amazon Web Services Identity and Access Management (IAM) for S3 Express One Zone</a> in the <i>Amazon S3 User Guide</i>.</p>\\n                  </li>\\n               </ul>\\n            </dd>\\n            <dt>HTTP Host header syntax</dt>\\n            <dd>\\n               <p>\\n                  <b>Directory buckets </b> - The HTTP Host header syntax is <code>s3express-control.<i>region-code</i>.amazonaws.com</code>.</p>\\n            </dd>\\n         </dl>\\n         <p>The following operations are related to <code>DeleteBucket</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateBucket.html\\\">CreateBucket</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObject.html\\\">DeleteObject</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#examples\": [\n          {\n            \"title\": \"To delete a bucket\",\n            \"documentation\": \"The following example deletes the specified bucket.\",\n            \"input\": {\n              \"Bucket\": \"forrandall2\"\n            }\n          }\n        ],\n        \"smithy.api#http\": {\n          \"method\": \"DELETE\",\n          \"uri\": \"/{Bucket}\",\n          \"code\": 204\n        },\n        \"smithy.rules#staticContextParams\": {\n          \"UseS3ExpressControlEndpoint\": {\n            \"value\": true\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#DeleteBucketAnalyticsConfiguration\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#DeleteBucketAnalyticsConfigurationRequest\"\n      },\n      \"output\": {\n        \"target\": \"smithy.api#Unit\"\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported for directory buckets.</p>\\n         </note>\\n         <p>Deletes an analytics configuration for the bucket (specified by the analytics configuration\\n      ID).</p>\\n         <p>To use this operation, you must have permissions to perform the\\n        <code>s3:PutAnalyticsConfiguration</code> action. The bucket owner has this permission by default. The\\n      bucket owner can grant this permission to others. For more information about permissions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-with-s3-actions.html#using-with-s3-actions-related-to-bucket-subresources\\\">Permissions Related to Bucket Subresource Operations</a> and <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html\\\">Managing Access Permissions to Your Amazon S3\\n        Resources</a>.</p>\\n         <p>For information about the Amazon S3 analytics feature, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/analytics-storage-class.html\\\">Amazon S3 Analytics – Storage Class\\n      Analysis</a>. </p>\\n         <p>The following operations are related to <code>DeleteBucketAnalyticsConfiguration</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketAnalyticsConfiguration.html\\\">GetBucketAnalyticsConfiguration</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListBucketAnalyticsConfigurations.html\\\">ListBucketAnalyticsConfigurations</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketAnalyticsConfiguration.html\\\">PutBucketAnalyticsConfiguration</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#http\": {\n          \"method\": \"DELETE\",\n          \"uri\": \"/{Bucket}?analytics\",\n          \"code\": 204\n        },\n        \"smithy.rules#staticContextParams\": {\n          \"UseS3ExpressControlEndpoint\": {\n            \"value\": true\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#DeleteBucketAnalyticsConfigurationRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the bucket from which an analytics configuration is deleted.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"Id\": {\n          \"target\": \"com.amazonaws.s3#AnalyticsId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The ID that identifies the analytics configuration.</p>\",\n            \"smithy.api#httpQuery\": \"id\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#DeleteBucketCors\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#DeleteBucketCorsRequest\"\n      },\n      \"output\": {\n        \"target\": \"smithy.api#Unit\"\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported for directory buckets.</p>\\n         </note>\\n         <p>Deletes the <code>cors</code> configuration information set for the bucket.</p>\\n         <p>To use this operation, you must have permission to perform the <code>s3:PutBucketCORS</code> action.\\n      The bucket owner has this permission by default and can grant this permission to others. </p>\\n         <p>For information about <code>cors</code>, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/cors.html\\\">Enabling Cross-Origin Resource Sharing</a> in the\\n        <i>Amazon S3 User Guide</i>.</p>\\n         <p class=\\\"title\\\">\\n            <b>Related Resources</b>\\n         </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketCors.html\\\">PutBucketCors</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/RESTOPTIONSobject.html\\\">RESTOPTIONSobject</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#examples\": [\n          {\n            \"title\": \"To delete cors configuration on a bucket.\",\n            \"documentation\": \"The following example deletes CORS configuration on a bucket.\",\n            \"input\": {\n              \"Bucket\": \"examplebucket\"\n            }\n          }\n        ],\n        \"smithy.api#http\": {\n          \"method\": \"DELETE\",\n          \"uri\": \"/{Bucket}?cors\",\n          \"code\": 204\n        },\n        \"smithy.rules#staticContextParams\": {\n          \"UseS3ExpressControlEndpoint\": {\n            \"value\": true\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#DeleteBucketCorsRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the bucket whose <code>cors</code> configuration is being deleted.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#DeleteBucketEncryption\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#DeleteBucketEncryptionRequest\"\n      },\n      \"output\": {\n        \"target\": \"smithy.api#Unit\"\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>This implementation of the DELETE action resets the default encryption for the bucket as server-side\\n      encryption with Amazon S3 managed keys (SSE-S3).</p>\\n         <note>\\n            <ul>\\n               <li>\\n                  <p>\\n                     <b>General purpose buckets</b> - For information about the bucket\\n            default encryption feature, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/bucket-encryption.html\\\">Amazon S3 Bucket Default Encryption</a> in the\\n              <i>Amazon S3 User Guide</i>.</p>\\n               </li>\\n               <li>\\n                  <p>\\n                     <b>Directory buckets</b> -\\n            For directory buckets, there are only two supported options for server-side encryption: SSE-S3 and SSE-KMS. For information about the default encryption configuration in\\n            directory buckets, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-bucket-encryption.html\\\">Setting default server-side\\n              encryption behavior for directory buckets</a>.</p>\\n               </li>\\n            </ul>\\n         </note>\\n         <dl>\\n            <dt>Permissions</dt>\\n            <dd>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <b>General purpose bucket permissions</b> - The\\n                  <code>s3:PutEncryptionConfiguration</code> permission is required in a policy. The bucket\\n                owner has this permission by default. The bucket owner can grant this permission to others.\\n                For more information about permissions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-with-s3-actions.html#using-with-s3-actions-related-to-bucket-subresources\\\">Permissions Related to Bucket Operations</a> and <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html\\\">Managing Access Permissions to Your\\n                  Amazon S3 Resources</a>.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <b>Directory bucket permissions</b> - To grant access to\\n                this API operation, you must have the <code>s3express:PutEncryptionConfiguration</code>\\n                permission in an IAM identity-based policy instead of a bucket policy. Cross-account access to this API operation isn't supported. This operation can only be performed by the Amazon Web Services account that owns the resource.\\n                For more information about directory bucket policies and permissions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-security-iam.html\\\">Amazon Web Services Identity and Access Management (IAM) for S3 Express One Zone</a> in the <i>Amazon S3 User Guide</i>.</p>\\n                  </li>\\n               </ul>\\n            </dd>\\n            <dt>HTTP Host header syntax</dt>\\n            <dd>\\n               <p>\\n                  <b>Directory buckets </b> - The HTTP Host header syntax is <code>s3express-control.<i>region-code</i>.amazonaws.com</code>.</p>\\n            </dd>\\n         </dl>\\n         <p>The following operations are related to <code>DeleteBucketEncryption</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketEncryption.html\\\">PutBucketEncryption</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketEncryption.html\\\">GetBucketEncryption</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#http\": {\n          \"method\": \"DELETE\",\n          \"uri\": \"/{Bucket}?encryption\",\n          \"code\": 204\n        },\n        \"smithy.rules#staticContextParams\": {\n          \"UseS3ExpressControlEndpoint\": {\n            \"value\": true\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#DeleteBucketEncryptionRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the bucket containing the server-side encryption configuration to delete.</p>\\n         <p>\\n            <b>Directory buckets </b> - When you use this operation with a directory bucket, you must use path-style requests in the format <code>https://s3express-control.<i>region-code</i>.amazonaws.com/<i>bucket-name</i>\\n            </code>. Virtual-hosted-style requests aren't supported. Directory bucket names must be unique in the chosen Zone (Availability Zone or Local Zone). Bucket names must also follow the format <code>\\n               <i>bucket-base-name</i>--<i>zone-id</i>--x-s3</code> (for example, <code>\\n               <i>DOC-EXAMPLE-BUCKET</i>--<i>usw2-az1</i>--x-s3</code>). For information about bucket naming restrictions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-bucket-naming-rules.html\\\">Directory bucket naming rules</a> in the <i>Amazon S3 User Guide</i>\\n         </p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\\n         <note>\\n            <p>For directory buckets, this header is not supported in this API operation. If you specify this header, the request fails with the HTTP status code \\n<code>501 Not Implemented</code>.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#DeleteBucketIntelligentTieringConfiguration\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#DeleteBucketIntelligentTieringConfigurationRequest\"\n      },\n      \"output\": {\n        \"target\": \"smithy.api#Unit\"\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported for directory buckets.</p>\\n         </note>\\n         <p>Deletes the S3 Intelligent-Tiering configuration from the specified bucket.</p>\\n         <p>The S3 Intelligent-Tiering storage class is designed to optimize storage costs by automatically moving data to the most cost-effective storage access tier, without performance impact or operational overhead. S3 Intelligent-Tiering delivers automatic cost savings in three low latency and high throughput access tiers. To get the lowest storage cost on data that can be accessed in minutes to hours, you can choose to activate additional archiving capabilities.</p>\\n         <p>The S3 Intelligent-Tiering storage class is  the ideal storage class for data with unknown, changing, or unpredictable access patterns, independent of object size or retention period. If the size of an object is less than 128 KB, it is not monitored and not eligible for auto-tiering. Smaller objects can be stored, but they are always charged at the Frequent Access tier rates in the S3 Intelligent-Tiering storage class.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/storage-class-intro.html#sc-dynamic-data-access\\\">Storage class for automatically optimizing frequently and infrequently accessed objects</a>.</p>\\n         <p>Operations related to <code>DeleteBucketIntelligentTieringConfiguration</code> include: </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketIntelligentTieringConfiguration.html\\\">GetBucketIntelligentTieringConfiguration</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketIntelligentTieringConfiguration.html\\\">PutBucketIntelligentTieringConfiguration</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListBucketIntelligentTieringConfigurations.html\\\">ListBucketIntelligentTieringConfigurations</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#http\": {\n          \"method\": \"DELETE\",\n          \"uri\": \"/{Bucket}?intelligent-tiering\",\n          \"code\": 204\n        },\n        \"smithy.rules#staticContextParams\": {\n          \"UseS3ExpressControlEndpoint\": {\n            \"value\": true\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#DeleteBucketIntelligentTieringConfigurationRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the Amazon S3 bucket whose configuration you want to modify or retrieve.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"Id\": {\n          \"target\": \"com.amazonaws.s3#IntelligentTieringId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The ID used to identify the S3 Intelligent-Tiering configuration.</p>\",\n            \"smithy.api#httpQuery\": \"id\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#DeleteBucketInventoryConfiguration\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#DeleteBucketInventoryConfigurationRequest\"\n      },\n      \"output\": {\n        \"target\": \"smithy.api#Unit\"\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported for directory buckets.</p>\\n         </note>\\n         <p>Deletes an S3 Inventory configuration (identified by the inventory ID) from the bucket.</p>\\n         <p>To use this operation, you must have permissions to perform the\\n        <code>s3:PutInventoryConfiguration</code> action. The bucket owner has this permission by default. The\\n      bucket owner can grant this permission to others. For more information about permissions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-with-s3-actions.html#using-with-s3-actions-related-to-bucket-subresources\\\">Permissions Related to Bucket Subresource Operations</a> and <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html\\\">Managing Access Permissions to Your Amazon S3\\n        Resources</a>.</p>\\n         <p>For information about the Amazon S3 inventory feature, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/storage-inventory.html\\\">Amazon S3 Inventory</a>.</p>\\n         <p>Operations related to <code>DeleteBucketInventoryConfiguration</code> include: </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketInventoryConfiguration.html\\\">GetBucketInventoryConfiguration</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketInventoryConfiguration.html\\\">PutBucketInventoryConfiguration</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListBucketInventoryConfigurations.html\\\">ListBucketInventoryConfigurations</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#http\": {\n          \"method\": \"DELETE\",\n          \"uri\": \"/{Bucket}?inventory\",\n          \"code\": 204\n        },\n        \"smithy.rules#staticContextParams\": {\n          \"UseS3ExpressControlEndpoint\": {\n            \"value\": true\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#DeleteBucketInventoryConfigurationRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the bucket containing the inventory configuration to delete.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"Id\": {\n          \"target\": \"com.amazonaws.s3#InventoryId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The ID used to identify the inventory configuration.</p>\",\n            \"smithy.api#httpQuery\": \"id\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#DeleteBucketLifecycle\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#DeleteBucketLifecycleRequest\"\n      },\n      \"output\": {\n        \"target\": \"smithy.api#Unit\"\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Deletes the lifecycle configuration from the specified bucket. Amazon S3 removes all the lifecycle\\n      configuration rules in the lifecycle subresource associated with the bucket. Your objects never expire,\\n      and Amazon S3 no longer automatically deletes any objects on the basis of rules contained in the deleted\\n      lifecycle configuration.</p>\\n         <dl>\\n            <dt>Permissions</dt>\\n            <dd>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <b>General purpose bucket permissions</b> - By default, all Amazon S3\\n                resources are private, including buckets, objects, and related subresources (for example,\\n                lifecycle configuration and website configuration). Only the resource owner (that is, the\\n                Amazon Web Services account that created it) can access the resource. The resource owner can optionally\\n                grant access permissions to others by writing an access policy. For this operation, a user\\n                must have the <code>s3:PutLifecycleConfiguration</code> permission.</p>\\n                     <p>For more information about permissions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html\\\">Managing Access Permissions to Your\\n                  Amazon S3 Resources</a>.</p>\\n                  </li>\\n               </ul>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <b>Directory bucket permissions</b> - You must have the\\n                  <code>s3express:PutLifecycleConfiguration</code> permission in an IAM identity-based policy\\n                to use this operation. Cross-account access to this API operation isn't supported. The\\n                resource owner can optionally grant access permissions to others by creating a role or user\\n                for them as long as they are within the same account as the owner and resource.</p>\\n                     <p>For more information about directory bucket policies and permissions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-security-iam.html\\\">Authorizing Regional endpoint APIs with IAM</a> in the <i>Amazon S3 User\\n                  Guide</i>.</p>\\n                     <note>\\n                        <p>\\n                           <b>Directory buckets </b> - For directory buckets, you must make requests for this API operation to the Regional endpoint. These endpoints support path-style requests in the format <code>https://s3express-control.<i>region-code</i>.amazonaws.com/<i>bucket-name</i>\\n                           </code>. Virtual-hosted-style requests aren't supported. \\nFor more information about endpoints in Availability Zones, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/endpoint-directory-buckets-AZ.html\\\">Regional and Zonal endpoints for directory buckets in Availability Zones</a> in the\\n    <i>Amazon S3 User Guide</i>. For more information about endpoints in Local Zones, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-lzs-for-directory-buckets.html\\\">Concepts for directory buckets in Local Zones</a> in the\\n    <i>Amazon S3 User Guide</i>.</p>\\n                     </note>\\n                  </li>\\n               </ul>\\n            </dd>\\n         </dl>\\n         <dl>\\n            <dt>HTTP Host header syntax</dt>\\n            <dd>\\n               <p>\\n                  <b>Directory buckets </b> - The HTTP Host header syntax is\\n                <code>s3express-control.<i>region</i>.amazonaws.com</code>.</p>\\n            </dd>\\n         </dl>\\n         <p>For more information about the object expiration, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/intro-lifecycle-rules.html#intro-lifecycle-rules-actions\\\">Elements to\\n        Describe Lifecycle Actions</a>.</p>\\n         <p>Related actions include:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketLifecycleConfiguration.html\\\">PutBucketLifecycleConfiguration</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketLifecycleConfiguration.html\\\">GetBucketLifecycleConfiguration</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#examples\": [\n          {\n            \"title\": \"To delete lifecycle configuration on a bucket.\",\n            \"documentation\": \"The following example deletes lifecycle configuration on a bucket.\",\n            \"input\": {\n              \"Bucket\": \"examplebucket\"\n            }\n          }\n        ],\n        \"smithy.api#http\": {\n          \"method\": \"DELETE\",\n          \"uri\": \"/{Bucket}?lifecycle\",\n          \"code\": 204\n        },\n        \"smithy.rules#staticContextParams\": {\n          \"UseS3ExpressControlEndpoint\": {\n            \"value\": true\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#DeleteBucketLifecycleRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The bucket name of the lifecycle to delete.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\\n         <note>\\n            <p>This parameter applies to general purpose buckets only. It is not supported for directory bucket\\n        lifecycle configurations.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#DeleteBucketMetadataConfiguration\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#DeleteBucketMetadataConfigurationRequest\"\n      },\n      \"output\": {\n        \"target\": \"smithy.api#Unit\"\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p> Deletes an S3 Metadata configuration from a general purpose bucket. For more information, see\\n      <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/metadata-tables-overview.html\\\">Accelerating\\n        data discovery with S3 Metadata</a> in the <i>Amazon S3 User Guide</i>. </p>\\n         <note>\\n            <p>You can use the V2 <code>DeleteBucketMetadataConfiguration</code> API operation with V1 or V2 \\n            metadata configurations. However, if you try to use the V1 \\n            <code>DeleteBucketMetadataTableConfiguration</code> API operation with V2 configurations, you\\n            will receive an HTTP <code>405 Method Not Allowed</code> error.</p>\\n         </note>\\n         <dl>\\n            <dt>Permissions</dt>\\n            <dd>\\n               <p>To use this operation, you must have the\\n            <code>s3:DeleteBucketMetadataTableConfiguration</code> permission. For more information, see\\n            <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/metadata-tables-permissions.html\\\">Setting up permissions for configuring metadata tables</a> in the\\n            <i>Amazon S3 User Guide</i>. </p>\\n               <note>\\n                  <p>The IAM policy action name is the same for the V1 and V2 API operations.</p>\\n               </note>\\n            </dd>\\n         </dl>\\n         <p>The following operations are related to <code>DeleteBucketMetadataConfiguration</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateBucketMetadataConfiguration.html\\\">CreateBucketMetadataConfiguration</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketMetadataConfiguration.html\\\">GetBucketMetadataConfiguration</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_UpdateBucketMetadataInventoryTableConfiguration.html\\\">UpdateBucketMetadataInventoryTableConfiguration</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_UpdateBucketMetadataJournalTableConfiguration.html\\\">UpdateBucketMetadataJournalTableConfiguration</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#http\": {\n          \"method\": \"DELETE\",\n          \"uri\": \"/{Bucket}?metadataConfiguration\",\n          \"code\": 204\n        },\n        \"smithy.rules#staticContextParams\": {\n          \"UseS3ExpressControlEndpoint\": {\n            \"value\": true\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#DeleteBucketMetadataConfigurationRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>\\n      The general purpose bucket that you want to remove the metadata configuration from.\\n    </p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>\\n      The expected bucket owner of the general purpose bucket that you want to remove the metadata table\\n      configuration from.\\n    </p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#DeleteBucketMetadataTableConfiguration\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#DeleteBucketMetadataTableConfigurationRequest\"\n      },\n      \"output\": {\n        \"target\": \"smithy.api#Unit\"\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<important>\\n            <p>\\n        We recommend that you delete your S3 Metadata configurations by using the V2 \\n        <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketMetadataTableConfiguration.html\\\">DeleteBucketMetadataTableConfiguration</a> API operation. We no longer recommend using \\n        the V1 <code>DeleteBucketMetadataTableConfiguration</code> API operation.\\n      </p>\\n            <p>If you created your S3 Metadata configuration before July 15, 2025, we recommend that you delete \\n        and re-create your configuration by using <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateBucketMetadataConfiguration.html\\\">CreateBucketMetadataConfiguration</a> so that you can expire journal table records and create \\n        a live inventory table.</p>\\n         </important>\\n         <p> Deletes a V1 S3 Metadata configuration from a general purpose bucket. For more information, see\\n        <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/metadata-tables-overview.html\\\">Accelerating\\n        data discovery with S3 Metadata</a> in the <i>Amazon S3 User Guide</i>. </p>\\n         <note>\\n            <p>You can use the V2 <code>DeleteBucketMetadataConfiguration</code> API operation with V1 or V2 \\n            metadata table configurations. However, if you try to use the V1 \\n            <code>DeleteBucketMetadataTableConfiguration</code> API operation with V2 configurations, you\\n            will receive an HTTP <code>405 Method Not Allowed</code> error.</p>\\n            <p>Make sure that you update your processes to use the new V2 API operations\\n            (<code>CreateBucketMetadataConfiguration</code>, <code>GetBucketMetadataConfiguration</code>, and\\n            <code>DeleteBucketMetadataConfiguration</code>) instead of the V1 API operations. </p>\\n         </note>\\n         <dl>\\n            <dt>Permissions</dt>\\n            <dd>\\n               <p>To use this operation, you must have the\\n              <code>s3:DeleteBucketMetadataTableConfiguration</code> permission. For more information, see\\n              <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/metadata-tables-permissions.html\\\">Setting up permissions for configuring metadata tables</a> in the\\n              <i>Amazon S3 User Guide</i>. </p>\\n            </dd>\\n         </dl>\\n         <p>The following operations are related to <code>DeleteBucketMetadataTableConfiguration</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateBucketMetadataTableConfiguration.html\\\">CreateBucketMetadataTableConfiguration</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketMetadataTableConfiguration.html\\\">GetBucketMetadataTableConfiguration</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#http\": {\n          \"method\": \"DELETE\",\n          \"uri\": \"/{Bucket}?metadataTable\",\n          \"code\": 204\n        },\n        \"smithy.rules#staticContextParams\": {\n          \"UseS3ExpressControlEndpoint\": {\n            \"value\": true\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#DeleteBucketMetadataTableConfigurationRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p> The general purpose bucket that you want to remove the metadata table configuration from. </p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p> The expected bucket owner of the general purpose bucket that you want to remove the metadata table\\n      configuration from. </p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#DeleteBucketMetricsConfiguration\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#DeleteBucketMetricsConfigurationRequest\"\n      },\n      \"output\": {\n        \"target\": \"smithy.api#Unit\"\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported for directory buckets.</p>\\n         </note>\\n         <p>Deletes a metrics configuration for the Amazon CloudWatch request metrics (specified by the metrics\\n      configuration ID) from the bucket. Note that this doesn't include the daily storage metrics.</p>\\n         <p> To use this operation, you must have permissions to perform the\\n        <code>s3:PutMetricsConfiguration</code> action. The bucket owner has this permission by default. The\\n      bucket owner can grant this permission to others. For more information about permissions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-with-s3-actions.html#using-with-s3-actions-related-to-bucket-subresources\\\">Permissions Related to Bucket Subresource Operations</a> and <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html\\\">Managing Access Permissions to Your Amazon S3\\n        Resources</a>.</p>\\n         <p>For information about CloudWatch request metrics for Amazon S3, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/cloudwatch-monitoring.html\\\">Monitoring Metrics with Amazon CloudWatch</a>. </p>\\n         <p>The following operations are related to <code>DeleteBucketMetricsConfiguration</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketMetricsConfiguration.html\\\">GetBucketMetricsConfiguration</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketMetricsConfiguration.html\\\">PutBucketMetricsConfiguration</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListBucketMetricsConfigurations.html\\\">ListBucketMetricsConfigurations</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/cloudwatch-monitoring.html\\\">Monitoring\\n            Metrics with Amazon CloudWatch</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#http\": {\n          \"method\": \"DELETE\",\n          \"uri\": \"/{Bucket}?metrics\",\n          \"code\": 204\n        },\n        \"smithy.rules#staticContextParams\": {\n          \"UseS3ExpressControlEndpoint\": {\n            \"value\": true\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#DeleteBucketMetricsConfigurationRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the bucket containing the metrics configuration to delete.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"Id\": {\n          \"target\": \"com.amazonaws.s3#MetricsId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The ID used to identify the metrics configuration. The ID has a 64 character limit and can only\\n      contain letters, numbers, periods, dashes, and underscores.</p>\",\n            \"smithy.api#httpQuery\": \"id\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#DeleteBucketOwnershipControls\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#DeleteBucketOwnershipControlsRequest\"\n      },\n      \"output\": {\n        \"target\": \"smithy.api#Unit\"\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported for directory buckets.</p>\\n         </note>\\n         <p>Removes <code>OwnershipControls</code> for an Amazon S3 bucket. To use this operation, you must have the\\n        <code>s3:PutBucketOwnershipControls</code> permission. For more information about Amazon S3 permissions,\\n      see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/using-with-s3-actions.html\\\">Specifying\\n        Permissions in a Policy</a>.</p>\\n         <p>For information about Amazon S3 Object Ownership, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/about-object-ownership.html\\\">Using Object Ownership</a>. </p>\\n         <p>The following operations are related to <code>DeleteBucketOwnershipControls</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a>GetBucketOwnershipControls</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>PutBucketOwnershipControls</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#http\": {\n          \"method\": \"DELETE\",\n          \"uri\": \"/{Bucket}?ownershipControls\",\n          \"code\": 204\n        },\n        \"smithy.rules#staticContextParams\": {\n          \"UseS3ExpressControlEndpoint\": {\n            \"value\": true\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#DeleteBucketOwnershipControlsRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Amazon S3 bucket whose <code>OwnershipControls</code> you want to delete. </p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#DeleteBucketPolicy\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#DeleteBucketPolicyRequest\"\n      },\n      \"output\": {\n        \"target\": \"smithy.api#Unit\"\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Deletes the policy of a specified bucket.</p>\\n         <note>\\n            <p>\\n               <b>Directory buckets </b> - For directory buckets, you must make requests for this API operation to the Regional endpoint. These endpoints support path-style requests in the format <code>https://s3express-control.<i>region-code</i>.amazonaws.com/<i>bucket-name</i>\\n               </code>. Virtual-hosted-style requests aren't supported. \\nFor more information about endpoints in Availability Zones, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/endpoint-directory-buckets-AZ.html\\\">Regional and Zonal endpoints for directory buckets in Availability Zones</a> in the\\n    <i>Amazon S3 User Guide</i>. For more information about endpoints in Local Zones, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-lzs-for-directory-buckets.html\\\">Concepts for directory buckets in Local Zones</a> in the\\n    <i>Amazon S3 User Guide</i>.</p>\\n         </note>\\n         <dl>\\n            <dt>Permissions</dt>\\n            <dd>\\n               <p>If you are using an identity other than the root user of the Amazon Web Services account that owns the\\n            bucket, the calling identity must both have the <code>DeleteBucketPolicy</code> permissions on the\\n            specified bucket and belong to the bucket owner's account in order to use this operation.</p>\\n               <p>If you don't have <code>DeleteBucketPolicy</code> permissions, Amazon S3 returns a <code>403 Access\\n              Denied</code> error. If you have the correct permissions, but you're not using an identity that\\n            belongs to the bucket owner's account, Amazon S3 returns a <code>405 Method Not Allowed</code>\\n            error.</p>\\n               <important>\\n                  <p>To ensure that bucket owners don't inadvertently lock themselves out of their own buckets,\\n              the root principal in a bucket owner's Amazon Web Services account can perform the\\n                <code>GetBucketPolicy</code>, <code>PutBucketPolicy</code>, and\\n                <code>DeleteBucketPolicy</code> API actions, even if their bucket policy explicitly denies the\\n              root principal's access. Bucket owner root principals can only be blocked from performing these\\n              API actions by VPC endpoint policies and Amazon Web Services Organizations policies.</p>\\n               </important>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <b>General purpose bucket permissions</b> - The\\n                  <code>s3:DeleteBucketPolicy</code> permission is required in a policy. For more information\\n                about general purpose buckets bucket policies, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/using-iam-policies.html\\\">Using Bucket Policies and User\\n                  Policies</a> in the <i>Amazon S3 User Guide</i>.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <b>Directory bucket permissions</b> - To grant access to\\n                this API operation, you must have the <code>s3express:DeleteBucketPolicy</code> permission in\\n                an IAM identity-based policy instead of a bucket policy. Cross-account access to this API operation isn't supported. This operation can only be performed by the Amazon Web Services account that owns the resource.\\n                For more information about directory bucket policies and permissions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-security-iam.html\\\">Amazon Web Services Identity and Access Management (IAM) for S3 Express One Zone</a> in the <i>Amazon S3 User Guide</i>.</p>\\n                  </li>\\n               </ul>\\n            </dd>\\n            <dt>HTTP Host header syntax</dt>\\n            <dd>\\n               <p>\\n                  <b>Directory buckets </b> - The HTTP Host header syntax is <code>s3express-control.<i>region-code</i>.amazonaws.com</code>.</p>\\n            </dd>\\n         </dl>\\n         <p>The following operations are related to <code>DeleteBucketPolicy</code>\\n         </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateBucket.html\\\">CreateBucket</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObject.html\\\">DeleteObject</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#examples\": [\n          {\n            \"title\": \"To delete bucket policy\",\n            \"documentation\": \"The following example deletes bucket policy on the specified bucket.\",\n            \"input\": {\n              \"Bucket\": \"examplebucket\"\n            }\n          }\n        ],\n        \"smithy.api#http\": {\n          \"method\": \"DELETE\",\n          \"uri\": \"/{Bucket}?policy\",\n          \"code\": 204\n        },\n        \"smithy.rules#staticContextParams\": {\n          \"UseS3ExpressControlEndpoint\": {\n            \"value\": true\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#DeleteBucketPolicyRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The bucket name.</p>\\n         <p>\\n            <b>Directory buckets </b> - When you use this operation with a directory bucket, you must use path-style requests in the format <code>https://s3express-control.<i>region-code</i>.amazonaws.com/<i>bucket-name</i>\\n            </code>. Virtual-hosted-style requests aren't supported. Directory bucket names must be unique in the chosen Zone (Availability Zone or Local Zone). Bucket names must also follow the format <code>\\n               <i>bucket-base-name</i>--<i>zone-id</i>--x-s3</code> (for example, <code>\\n               <i>DOC-EXAMPLE-BUCKET</i>--<i>usw2-az1</i>--x-s3</code>). For information about bucket naming restrictions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-bucket-naming-rules.html\\\">Directory bucket naming rules</a> in the <i>Amazon S3 User Guide</i>\\n         </p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\\n         <note>\\n            <p>For directory buckets, this header is not supported in this API operation. If you specify this header, the request fails with the HTTP status code \\n<code>501 Not Implemented</code>.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#DeleteBucketReplication\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#DeleteBucketReplicationRequest\"\n      },\n      \"output\": {\n        \"target\": \"smithy.api#Unit\"\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported for directory buckets.</p>\\n         </note>\\n         <p> Deletes the replication configuration from the bucket.</p>\\n         <p>To use this operation, you must have permissions to perform the\\n        <code>s3:PutReplicationConfiguration</code> action. The bucket owner has these permissions by default\\n      and can grant it to others. For more information about permissions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-with-s3-actions.html#using-with-s3-actions-related-to-bucket-subresources\\\">Permissions Related to Bucket Subresource Operations</a> and <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html\\\">Managing Access Permissions to Your Amazon S3\\n        Resources</a>. </p>\\n         <note>\\n            <p>It can take a while for the deletion of a replication configuration to fully propagate.</p>\\n         </note>\\n         <p> For information about replication configuration, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/replication.html\\\">Replication</a> in the\\n        <i>Amazon S3 User Guide</i>.</p>\\n         <p>The following operations are related to <code>DeleteBucketReplication</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketReplication.html\\\">PutBucketReplication</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketReplication.html\\\">GetBucketReplication</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#examples\": [\n          {\n            \"title\": \"To delete bucket replication configuration\",\n            \"documentation\": \"The following example deletes replication configuration set on bucket.\",\n            \"input\": {\n              \"Bucket\": \"example\"\n            }\n          }\n        ],\n        \"smithy.api#http\": {\n          \"method\": \"DELETE\",\n          \"uri\": \"/{Bucket}?replication\",\n          \"code\": 204\n        },\n        \"smithy.rules#staticContextParams\": {\n          \"UseS3ExpressControlEndpoint\": {\n            \"value\": true\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#DeleteBucketReplicationRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p> The bucket name. </p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#DeleteBucketRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the bucket being deleted.</p>\\n         <p>\\n            <b>Directory buckets </b> - When you use this operation with a directory bucket, you must use path-style requests in the format <code>https://s3express-control.<i>region-code</i>.amazonaws.com/<i>bucket-name</i>\\n            </code>. Virtual-hosted-style requests aren't supported. Directory bucket names must be unique in the chosen Zone (Availability Zone or Local Zone). Bucket names must also follow the format <code>\\n               <i>bucket-base-name</i>--<i>zone-id</i>--x-s3</code> (for example, <code>\\n               <i>DOC-EXAMPLE-BUCKET</i>--<i>usw2-az1</i>--x-s3</code>). For information about bucket naming restrictions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-bucket-naming-rules.html\\\">Directory bucket naming rules</a> in the <i>Amazon S3 User Guide</i>\\n         </p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\\n         <note>\\n            <p>For directory buckets, this header is not supported in this API operation. If you specify this header, the request fails with the HTTP status code \\n<code>501 Not Implemented</code>.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#DeleteBucketTagging\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#DeleteBucketTaggingRequest\"\n      },\n      \"output\": {\n        \"target\": \"smithy.api#Unit\"\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported for directory buckets.</p>\\n         </note>\\n         <p>Deletes tags from the general purpose bucket if attribute based access control (ABAC) is not enabled for the bucket. When you <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/buckets-tagging-enable-abac.html\\\">enable ABAC for a general purpose bucket</a>, you can no longer use this operation for that bucket and must use <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_UntagResource.html\\\">UntagResource</a> instead.</p>\\n         <p>if ABAC is not enabled for the bucket. When you <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/buckets-tagging-enable-abac.html\\\">enable ABAC for a general purpose bucket</a>, you can no longer use this operation for that bucket and must use <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_UntagResource.html\\\">UntagResource</a> instead.</p>\\n         <p>To use this operation, you must have permission to perform the <code>s3:PutBucketTagging</code>\\n      action. By default, the bucket owner has this permission and can grant this permission to others. </p>\\n         <p>The following operations are related to <code>DeleteBucketTagging</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketTagging.html\\\">GetBucketTagging</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketTagging.html\\\">PutBucketTagging</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#examples\": [\n          {\n            \"title\": \"To delete bucket tags\",\n            \"documentation\": \"The following example deletes bucket tags.\",\n            \"input\": {\n              \"Bucket\": \"examplebucket\"\n            }\n          }\n        ],\n        \"smithy.api#http\": {\n          \"method\": \"DELETE\",\n          \"uri\": \"/{Bucket}?tagging\",\n          \"code\": 204\n        },\n        \"smithy.rules#staticContextParams\": {\n          \"UseS3ExpressControlEndpoint\": {\n            \"value\": true\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#DeleteBucketTaggingRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The bucket that has the tag set to be removed.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#DeleteBucketWebsite\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#DeleteBucketWebsiteRequest\"\n      },\n      \"output\": {\n        \"target\": \"smithy.api#Unit\"\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported for directory buckets.</p>\\n         </note>\\n         <p>This action removes the website configuration for a bucket. Amazon S3 returns a <code>200 OK</code>\\n      response upon successfully deleting a website configuration on the specified bucket. You will get a\\n        <code>200 OK</code> response if the website configuration you are trying to delete does not exist on\\n      the bucket. Amazon S3 returns a <code>404</code> response if the bucket specified in the request does not\\n      exist.</p>\\n         <p>This DELETE action requires the <code>S3:DeleteBucketWebsite</code> permission. By default, only the\\n      bucket owner can delete the website configuration attached to a bucket. However, bucket owners can grant\\n      other users permission to delete the website configuration by writing a bucket policy granting them the\\n        <code>S3:DeleteBucketWebsite</code> permission. </p>\\n         <p>For more information about hosting websites, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/WebsiteHosting.html\\\">Hosting Websites on Amazon S3</a>. </p>\\n         <p>The following operations are related to <code>DeleteBucketWebsite</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketWebsite.html\\\">GetBucketWebsite</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketWebsite.html\\\">PutBucketWebsite</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#examples\": [\n          {\n            \"title\": \"To delete bucket website configuration\",\n            \"documentation\": \"The following example deletes bucket website configuration.\",\n            \"input\": {\n              \"Bucket\": \"examplebucket\"\n            }\n          }\n        ],\n        \"smithy.api#http\": {\n          \"method\": \"DELETE\",\n          \"uri\": \"/{Bucket}?website\",\n          \"code\": 204\n        },\n        \"smithy.rules#staticContextParams\": {\n          \"UseS3ExpressControlEndpoint\": {\n            \"value\": true\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#DeleteBucketWebsiteRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The bucket name for which you want to remove the website configuration. </p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#DeleteMarker\": {\n      \"type\": \"boolean\"\n    },\n    \"com.amazonaws.s3#DeleteMarkerEntry\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Owner\": {\n          \"target\": \"com.amazonaws.s3#Owner\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account that created the delete marker. </p>\"\n          }\n        },\n        \"Key\": {\n          \"target\": \"com.amazonaws.s3#ObjectKey\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The object key.</p>\"\n          }\n        },\n        \"VersionId\": {\n          \"target\": \"com.amazonaws.s3#ObjectVersionId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Version ID of an object.</p>\"\n          }\n        },\n        \"IsLatest\": {\n          \"target\": \"com.amazonaws.s3#IsLatest\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies whether the object is (true) or is not (false) the latest version of an object. </p>\"\n          }\n        },\n        \"LastModified\": {\n          \"target\": \"com.amazonaws.s3#LastModified\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Date and time when the object was last modified.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Information about the delete marker.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#DeleteMarkerReplication\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Status\": {\n          \"target\": \"com.amazonaws.s3#DeleteMarkerReplicationStatus\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Indicates whether to replicate delete markers.</p>\\n         <note>\\n            <p>Indicates whether to replicate delete markers.</p>\\n         </note>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Specifies whether Amazon S3 replicates delete markers. If you specify a <code>Filter</code> in your\\n      replication configuration, you must also include a <code>DeleteMarkerReplication</code> element. If your\\n        <code>Filter</code> includes a <code>Tag</code> element, the <code>DeleteMarkerReplication</code>\\n            <code>Status</code> must be set to Disabled, because Amazon S3 does not support replicating delete markers\\n      for tag-based rules. For an example configuration, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/replication-add-config.html#replication-config-min-rule-config\\\">Basic Rule\\n        Configuration</a>. </p>\\n         <p>For more information about delete marker replication, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/delete-marker-replication.html\\\">Basic Rule Configuration</a>. </p>\\n         <note>\\n            <p>If you are using an earlier version of the replication configuration, Amazon S3 handles replication of\\n        delete markers differently. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/replication-add-config.html#replication-backward-compat-considerations\\\">Backward Compatibility</a>.</p>\\n         </note>\"\n      }\n    },\n    \"com.amazonaws.s3#DeleteMarkerReplicationStatus\": {\n      \"type\": \"enum\",\n      \"members\": {\n        \"Enabled\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"Enabled\"\n          }\n        },\n        \"Disabled\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"Disabled\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#DeleteMarkerVersionId\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#DeleteMarkers\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.s3#DeleteMarkerEntry\"\n      }\n    },\n    \"com.amazonaws.s3#DeleteObject\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#DeleteObjectRequest\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.s3#DeleteObjectOutput\"\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Removes an object from a bucket. The behavior depends on the bucket's versioning state: </p>\\n         <ul>\\n            <li>\\n               <p>If bucket versioning is not enabled, the operation permanently deletes the object.</p>\\n            </li>\\n            <li>\\n               <p>If bucket versioning is enabled, the operation inserts a delete marker, which becomes the\\n          current version of the object. To permanently delete an object in a versioned bucket, you must\\n          include the object’s <code>versionId</code> in the request. For more information about\\n          versioning-enabled buckets, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/DeletingObjectVersions.html\\\">Deleting object versions from a\\n            versioning-enabled bucket</a>.</p>\\n            </li>\\n            <li>\\n               <p>If bucket versioning is suspended, the operation removes the object that has a null\\n            <code>versionId</code>, if there is one, and inserts a delete marker that becomes the current\\n          version of the object. If there isn't an object with a null <code>versionId</code>, and all versions\\n          of the object have a <code>versionId</code>, Amazon S3 does not remove the object and only inserts a\\n          delete marker. To permanently delete an object that has a <code>versionId</code>, you must include\\n          the object’s <code>versionId</code> in the request. For more information about versioning-suspended\\n          buckets, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/DeletingObjectsfromVersioningSuspendedBuckets.html\\\">Deleting\\n            objects from versioning-suspended buckets</a>.</p>\\n            </li>\\n         </ul>\\n         <note>\\n            <ul>\\n               <li>\\n                  <p>\\n                     <b>Directory buckets</b> - S3 Versioning isn't enabled and supported for directory buckets. For this API operation, only the <code>null</code> value of the version ID is supported by directory buckets.\\n            You can only specify <code>null</code> to the <code>versionId</code> query parameter in the\\n            request.</p>\\n               </li>\\n               <li>\\n                  <p>\\n                     <b>Directory buckets</b> - For directory buckets, you must make requests for this API operation to the Zonal endpoint. These endpoints support virtual-hosted-style requests in the format <code>https://<i>amzn-s3-demo-bucket</i>.s3express-<i>zone-id</i>.<i>region-code</i>.amazonaws.com/<i>key-name</i>\\n                     </code>. Path-style requests are not supported. For more information about endpoints in Availability Zones, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/endpoint-directory-buckets-AZ.html\\\">Regional and Zonal endpoints for directory buckets in Availability Zones</a> in the\\n    <i>Amazon S3 User Guide</i>. For more information about endpoints in Local Zones, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-lzs-for-directory-buckets.html\\\">Concepts for directory buckets in Local Zones</a> in the\\n    <i>Amazon S3 User Guide</i>.</p>\\n               </li>\\n            </ul>\\n         </note>\\n         <p>To remove a specific version, you must use the <code>versionId</code> query parameter. Using this\\n      query parameter permanently deletes the version. If the object deleted is a delete marker, Amazon S3 sets the\\n      response header <code>x-amz-delete-marker</code> to true. </p>\\n         <p>If the object you want to delete is in a bucket where the bucket versioning configuration is MFA\\n      Delete enabled, you must include the <code>x-amz-mfa</code> request header in the DELETE\\n        <code>versionId</code> request. Requests that include <code>x-amz-mfa</code> must use HTTPS. For more\\n      information about MFA Delete, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingMFADelete.html\\\">Using MFA Delete</a> in the <i>Amazon S3 User\\n        Guide</i>. To see sample requests that use versioning, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectDELETE.html#ExampleVersionObjectDelete\\\">Sample Request</a>. </p>\\n         <note>\\n            <p>\\n               <b>Directory buckets</b> - MFA delete is not supported by directory buckets.</p>\\n         </note>\\n         <p>You can delete objects by explicitly calling DELETE Object or calling (<a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketLifecycle.html\\\">PutBucketLifecycle</a>) to enable Amazon S3 to\\n      remove them for you. If you want to block users or accounts from removing or deleting objects from your\\n      bucket, you must deny them the <code>s3:DeleteObject</code>, <code>s3:DeleteObjectVersion</code>, and\\n        <code>s3:PutLifeCycleConfiguration</code> actions. </p>\\n         <note>\\n            <p>\\n               <b>Directory buckets</b> -\\n        S3 Lifecycle is not supported by directory buckets.</p>\\n         </note>\\n         <dl>\\n            <dt>Permissions</dt>\\n            <dd>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <b>General purpose bucket permissions</b> - The following\\n                permissions are required in your policies when your <code>DeleteObjects</code> request\\n                includes specific headers.</p>\\n                     <ul>\\n                        <li>\\n                           <p>\\n                              <b>\\n                                 <code>s3:DeleteObject</code>\\n                              </b> - To\\n                    delete an object from a bucket, you must always have the\\n                      <code>s3:DeleteObject</code> permission.</p>\\n                        </li>\\n                        <li>\\n                           <p>\\n                              <b>\\n                                 <code>s3:DeleteObjectVersion</code>\\n                              </b> - To delete a specific version of an object from a versioning-enabled\\n                    bucket, you must have the <code>s3:DeleteObjectVersion</code> permission.</p>\\n                           <note>\\n                              <p>If the <code>s3:DeleteObject</code> or <code>s3:DeleteObjectVersion</code> permissions are explicitly\\n                      denied in your bucket policy, attempts to delete any unversioned objects\\n                      result in a <code>403 Access Denied</code> error.</p>\\n                           </note>\\n                        </li>\\n                     </ul>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <b>Directory bucket permissions</b> - To grant access to this API operation on a directory bucket, we recommend that you use the <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateSession.html\\\">\\n                           <code>CreateSession</code>\\n                        </a> API operation for session-based authorization. Specifically, you grant the <code>s3express:CreateSession</code> permission to the directory bucket in a bucket policy or an IAM identity-based policy. Then, you make the <code>CreateSession</code> API call on the bucket to obtain a session token. With the session token in your request header, you can make API requests to this operation. After the session token expires, you make another <code>CreateSession</code> API call to generate a new session token for use. \\nAmazon Web Services CLI or SDKs create session and refresh the session token automatically to avoid service interruptions when a session expires. For more information about authorization, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateSession.html\\\">\\n                           <code>CreateSession</code>\\n                        </a>.</p>\\n                  </li>\\n               </ul>\\n            </dd>\\n            <dt>HTTP Host header syntax</dt>\\n            <dd>\\n               <p>\\n                  <b>Directory buckets </b> - The HTTP Host header syntax is <code>\\n                     <i>Bucket-name</i>.s3express-<i>zone-id</i>.<i>region-code</i>.amazonaws.com</code>.</p>\\n            </dd>\\n         </dl>\\n         <p>The following action is related to <code>DeleteObject</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html\\\">PutObject</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\\n         <note>\\n            <p>The <code>If-Match</code> header is supported for both general purpose and directory buckets. <code>IfMatchLastModifiedTime</code> and <code>IfMatchSize</code> is only supported for directory buckets. </p>\\n         </note>\",\n        \"smithy.api#examples\": [\n          {\n            \"title\": \"To delete an object (from a non-versioned bucket)\",\n            \"documentation\": \"The following example deletes an object from a non-versioned bucket.\",\n            \"input\": {\n              \"Bucket\": \"ExampleBucket\",\n              \"Key\": \"HappyFace.jpg\"\n            }\n          },\n          {\n            \"title\": \"To delete an object\",\n            \"documentation\": \"The following example deletes an object from an S3 bucket.\",\n            \"input\": {\n              \"Bucket\": \"examplebucket\",\n              \"Key\": \"objectkey.jpg\"\n            },\n            \"output\": {}\n          }\n        ],\n        \"smithy.api#http\": {\n          \"method\": \"DELETE\",\n          \"uri\": \"/{Bucket}/{Key+}?x-id=DeleteObject\",\n          \"code\": 204\n        }\n      }\n    },\n    \"com.amazonaws.s3#DeleteObjectOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"DeleteMarker\": {\n          \"target\": \"com.amazonaws.s3#DeleteMarker\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Indicates whether the specified object version that was permanently deleted was (true) or was not\\n      (false) a delete marker before deletion. In a simple DELETE, this header indicates whether (true) or not\\n      (false) the current version of the object is a delete marker. To learn more about delete markers, see\\n        <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/DeleteMarker.html\\\">Working with delete\\n        markers</a>.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-delete-marker\"\n          }\n        },\n        \"VersionId\": {\n          \"target\": \"com.amazonaws.s3#ObjectVersionId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Returns the version ID of the delete marker created as a result of the DELETE operation.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-version-id\"\n          }\n        },\n        \"RequestCharged\": {\n          \"target\": \"com.amazonaws.s3#RequestCharged\",\n          \"traits\": {\n            \"smithy.api#httpHeader\": \"x-amz-request-charged\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#output\": {}\n      }\n    },\n    \"com.amazonaws.s3#DeleteObjectRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The bucket name of the bucket containing the object. </p>\\n         <p>\\n            <b>Directory buckets</b> - When you use this operation with a directory bucket, you must use virtual-hosted-style requests in the format <code>\\n               <i>Bucket-name</i>.s3express-<i>zone-id</i>.<i>region-code</i>.amazonaws.com</code>. Path-style requests are not supported.  Directory bucket names must be unique in the chosen Zone (Availability Zone or Local Zone). Bucket names must follow the format <code>\\n               <i>bucket-base-name</i>--<i>zone-id</i>--x-s3</code> (for example, <code>\\n               <i>amzn-s3-demo-bucket</i>--<i>usw2-az1</i>--x-s3</code>). For information about bucket naming\\n         restrictions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-bucket-naming-rules.html\\\">Directory bucket naming\\n            rules</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <p>\\n            <b>Access points</b> - When you use this action with an access point for general purpose buckets, you must provide the alias of the access point in place of the bucket name or specify the access point ARN. When you use this action with an access point for directory buckets, you must provide the access point name in place of the bucket name. When using the access point ARN, you must direct requests to the access point hostname. The access point hostname takes the form <i>AccessPointName</i>-<i>AccountId</i>.s3-accesspoint.<i>Region</i>.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html\\\">Using access points</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <note>\\n            <p>Object Lambda access points are not supported by directory buckets.</p>\\n         </note>\\n         <p>\\n            <b>S3 on Outposts</b> - When you use this action with S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the \\n                     form <code>\\n               <i>AccessPointName</i>-<i>AccountId</i>.<i>outpostID</i>.s3-outposts.<i>Region</i>.amazonaws.com</code>. When you use this action with S3 on Outposts, the destination bucket must be the Outposts access point ARN or the access point alias. For more information about S3 on Outposts, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html\\\">What is S3 on Outposts?</a> in the <i>Amazon S3 User Guide</i>.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"Key\": {\n          \"target\": \"com.amazonaws.s3#ObjectKey\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Key name of the object to delete.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Key\"\n            }\n          }\n        },\n        \"MFA\": {\n          \"target\": \"com.amazonaws.s3#MFA\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The concatenation of the authentication device's serial number, a space, and the value that is\\n      displayed on your authentication device. Required to permanently delete a versioned object if versioning\\n      is configured with MFA delete enabled.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-mfa\"\n          }\n        },\n        \"VersionId\": {\n          \"target\": \"com.amazonaws.s3#ObjectVersionId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Version ID used to reference a specific version of the object.</p>\\n         <note>\\n            <p>For directory buckets in this API operation, only the <code>null</code> value of the version ID is supported.</p>\\n         </note>\",\n            \"smithy.api#httpQuery\": \"versionId\"\n          }\n        },\n        \"RequestPayer\": {\n          \"target\": \"com.amazonaws.s3#RequestPayer\",\n          \"traits\": {\n            \"smithy.api#httpHeader\": \"x-amz-request-payer\"\n          }\n        },\n        \"BypassGovernanceRetention\": {\n          \"target\": \"com.amazonaws.s3#BypassGovernanceRetention\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Indicates whether S3 Object Lock should bypass Governance-mode restrictions to process this\\n      operation. To use this header, you must have the <code>s3:BypassGovernanceRetention</code>\\n      permission.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-bypass-governance-retention\"\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        },\n        \"IfMatch\": {\n          \"target\": \"com.amazonaws.s3#IfMatch\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Deletes the object if the ETag (entity tag) value provided during the delete operation matches the ETag of the object in S3. \\n      If the ETag values do not match, the operation returns a <code>412 Precondition Failed</code> error.</p>\\n         <p>Expects the ETag value as a string. <code>If-Match</code> does accept a string value of an '*' (asterisk) character to denote a match of any ETag.</p>\\n         <p>For more information about conditional requests, see <a href=\\\"https://tools.ietf.org/html/rfc7232\\\">RFC 7232</a>.</p>\",\n            \"smithy.api#httpHeader\": \"If-Match\"\n          }\n        },\n        \"IfMatchLastModifiedTime\": {\n          \"target\": \"com.amazonaws.s3#IfMatchLastModifiedTime\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>If present, the object is deleted only if its modification times matches the provided\\n        <code>Timestamp</code>. If the <code>Timestamp</code> values do not match, the operation returns a\\n        <code>412 Precondition Failed</code> error. If the <code>Timestamp</code> matches or if the object\\n      doesn’t exist, the operation returns a <code>204 Success (No Content)</code> response.</p>\\n         <note>\\n            <p>This functionality is only supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-if-match-last-modified-time\"\n          }\n        },\n        \"IfMatchSize\": {\n          \"target\": \"com.amazonaws.s3#IfMatchSize\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>If present, the object is deleted only if its size matches the provided size in bytes. If the\\n        <code>Size</code> value does not match, the operation returns a <code>412 Precondition Failed</code>\\n      error. If the <code>Size</code> matches or if the object doesn’t exist, the operation returns a\\n        <code>204 Success (No Content)</code> response.</p>\\n         <note>\\n            <p>This functionality is only supported for directory buckets.</p>\\n         </note>\\n         <important>\\n            <p>You can use the <code>If-Match</code>, <code>x-amz-if-match-last-modified-time</code> and\\n          <code>x-amz-if-match-size</code> conditional headers in conjunction with each-other or\\n        individually.</p>\\n         </important>\",\n            \"smithy.api#httpHeader\": \"x-amz-if-match-size\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#DeleteObjectTagging\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#DeleteObjectTaggingRequest\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.s3#DeleteObjectTaggingOutput\"\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported for directory buckets.</p>\\n         </note>\\n         <p>Removes the entire tag set from the specified object. For more information about managing object\\n      tags, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/object-tagging.html\\\"> Object\\n        Tagging</a>.</p>\\n         <p>To use this operation, you must have permission to perform the <code>s3:DeleteObjectTagging</code>\\n      action.</p>\\n         <p>To delete tags of a specific object version, add the <code>versionId</code> query parameter in the\\n      request. You will need permission for the <code>s3:DeleteObjectVersionTagging</code> action.</p>\\n         <p>The following operations are related to <code>DeleteObjectTagging</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObjectTagging.html\\\">PutObjectTagging</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObjectTagging.html\\\">GetObjectTagging</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#examples\": [\n          {\n            \"title\": \"To remove tag set from an object\",\n            \"documentation\": \"The following example removes tag set associated with the specified object. If the bucket is versioning enabled, the operation removes tag set from the latest object version.\",\n            \"input\": {\n              \"Bucket\": \"examplebucket\",\n              \"Key\": \"HappyFace.jpg\"\n            },\n            \"output\": {\n              \"VersionId\": \"null\"\n            }\n          },\n          {\n            \"title\": \"To remove tag set from an object version\",\n            \"documentation\": \"The following example removes tag set associated with the specified object version. The request specifies both the object key and object version.\",\n            \"input\": {\n              \"Bucket\": \"examplebucket\",\n              \"Key\": \"HappyFace.jpg\",\n              \"VersionId\": \"ydlaNkwWm0SfKJR.T1b1fIdPRbldTYRI\"\n            },\n            \"output\": {\n              \"VersionId\": \"ydlaNkwWm0SfKJR.T1b1fIdPRbldTYRI\"\n            }\n          }\n        ],\n        \"smithy.api#http\": {\n          \"method\": \"DELETE\",\n          \"uri\": \"/{Bucket}/{Key+}?tagging\",\n          \"code\": 204\n        }\n      }\n    },\n    \"com.amazonaws.s3#DeleteObjectTaggingOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"VersionId\": {\n          \"target\": \"com.amazonaws.s3#ObjectVersionId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The versionId of the object the tag-set was removed from.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-version-id\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#output\": {}\n      }\n    },\n    \"com.amazonaws.s3#DeleteObjectTaggingRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The bucket name containing the objects from which to remove the tags. </p>\\n         <p>\\n            <b>Access points</b> - When you use this action with an access point for general purpose buckets, you must provide the alias of the access point in place of the bucket name or specify the access point ARN. When you use this action with an access point for directory buckets, you must provide the access point name in place of the bucket name. When using the access point ARN, you must direct requests to the access point hostname. The access point hostname takes the form <i>AccessPointName</i>-<i>AccountId</i>.s3-accesspoint.<i>Region</i>.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html\\\">Using access points</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <p>\\n            <b>S3 on Outposts</b> - When you use this action with S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the \\n                     form <code>\\n               <i>AccessPointName</i>-<i>AccountId</i>.<i>outpostID</i>.s3-outposts.<i>Region</i>.amazonaws.com</code>. When you use this action with S3 on Outposts, the destination bucket must be the Outposts access point ARN or the access point alias. For more information about S3 on Outposts, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html\\\">What is S3 on Outposts?</a> in the <i>Amazon S3 User Guide</i>.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"Key\": {\n          \"target\": \"com.amazonaws.s3#ObjectKey\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The key that identifies the object in the bucket from which to remove all tags.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {}\n          }\n        },\n        \"VersionId\": {\n          \"target\": \"com.amazonaws.s3#ObjectVersionId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The versionId of the object that the tag-set will be removed from.</p>\",\n            \"smithy.api#httpQuery\": \"versionId\"\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#DeleteObjects\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#DeleteObjectsRequest\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.s3#DeleteObjectsOutput\"\n      },\n      \"traits\": {\n        \"aws.protocols#httpChecksum\": {\n          \"requestAlgorithmMember\": \"ChecksumAlgorithm\",\n          \"requestChecksumRequired\": true\n        },\n        \"smithy.api#documentation\": \"<p>This operation enables you to delete multiple objects from a bucket using a single HTTP request. If\\n      you know the object keys that you want to delete, then this operation provides a suitable alternative to\\n      sending individual delete requests, reducing per-request overhead.</p>\\n         <p>The request can contain a list of up to 1,000 keys that you want to delete. In the XML, you provide\\n      the object key names, and optionally, version IDs if you want to delete a specific version of the object\\n      from a versioning-enabled bucket. For each key, Amazon S3 performs a delete operation and returns the result\\n      of that delete, success or failure, in the response. If the object specified in the request isn't found,\\n      Amazon S3 confirms the deletion by returning the result as deleted.</p>\\n         <note>\\n            <ul>\\n               <li>\\n                  <p>\\n                     <b>Directory buckets</b> -\\n            S3 Versioning isn't enabled and supported for directory buckets.</p>\\n               </li>\\n               <li>\\n                  <p>\\n                     <b>Directory buckets</b> - For directory buckets, you must make requests for this API operation to the Zonal endpoint. These endpoints support virtual-hosted-style requests in the format <code>https://<i>amzn-s3-demo-bucket</i>.s3express-<i>zone-id</i>.<i>region-code</i>.amazonaws.com/<i>key-name</i>\\n                     </code>. Path-style requests are not supported. For more information about endpoints in Availability Zones, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/endpoint-directory-buckets-AZ.html\\\">Regional and Zonal endpoints for directory buckets in Availability Zones</a> in the\\n    <i>Amazon S3 User Guide</i>. For more information about endpoints in Local Zones, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-lzs-for-directory-buckets.html\\\">Concepts for directory buckets in Local Zones</a> in the\\n    <i>Amazon S3 User Guide</i>.</p>\\n               </li>\\n            </ul>\\n         </note>\\n         <p>The operation supports two modes for the response: verbose and quiet. By default, the operation uses\\n      verbose mode in which the response includes the result of deletion of each key in your request. In quiet\\n      mode the response includes only keys where the delete operation encountered an error. For a successful\\n      deletion in a quiet mode, the operation does not return any information about the delete in the response\\n      body.</p>\\n         <p>When performing this action on an MFA Delete enabled bucket, that attempts to delete any versioned\\n      objects, you must include an MFA token. If you do not provide one, the entire request will fail, even if\\n      there are non-versioned objects you are trying to delete. If you provide an invalid token, whether there\\n      are versioned keys in the request or not, the entire Multi-Object Delete request will fail. For\\n      information about MFA Delete, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/Versioning.html#MultiFactorAuthenticationDelete\\\">MFA Delete</a> in the\\n        <i>Amazon S3 User Guide</i>.</p>\\n         <note>\\n            <p>\\n               <b>Directory buckets</b> - MFA delete is not supported by directory buckets.</p>\\n         </note>\\n         <dl>\\n            <dt>Permissions</dt>\\n            <dd>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <b>General purpose bucket permissions</b> - The following\\n                permissions are required in your policies when your <code>DeleteObjects</code> request\\n                includes specific headers.</p>\\n                     <ul>\\n                        <li>\\n                           <p>\\n                              <b>\\n                                 <code>s3:DeleteObject</code>\\n                              </b> - To delete an\\n                    object from a bucket, you must always specify the <code>s3:DeleteObject</code>\\n                    permission.</p>\\n                        </li>\\n                        <li>\\n                           <p>\\n                              <b>\\n                                 <code>s3:DeleteObjectVersion</code>\\n                              </b> - To delete a specific version of an object from a versioning-enabled\\n                    bucket, you must specify the <code>s3:DeleteObjectVersion</code> permission.</p>\\n                           <note>\\n                              <p>If the <code>s3:DeleteObject</code> or <code>s3:DeleteObjectVersion</code> permissions are explicitly\\n                      denied in your bucket policy, attempts to delete any unversioned objects\\n                      result in a <code>403 Access Denied</code> error.</p>\\n                           </note>\\n                        </li>\\n                     </ul>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <b>Directory bucket permissions</b> - To grant access to this API operation on a directory bucket, we recommend that you use the <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateSession.html\\\">\\n                           <code>CreateSession</code>\\n                        </a> API operation for session-based authorization. Specifically, you grant the <code>s3express:CreateSession</code> permission to the directory bucket in a bucket policy or an IAM identity-based policy. Then, you make the <code>CreateSession</code> API call on the bucket to obtain a session token. With the session token in your request header, you can make API requests to this operation. After the session token expires, you make another <code>CreateSession</code> API call to generate a new session token for use. \\nAmazon Web Services CLI or SDKs create session and refresh the session token automatically to avoid service interruptions when a session expires. For more information about authorization, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateSession.html\\\">\\n                           <code>CreateSession</code>\\n                        </a>.</p>\\n                  </li>\\n               </ul>\\n            </dd>\\n            <dt>Content-MD5 request header</dt>\\n            <dd>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <b>General purpose bucket</b> - The Content-MD5 request header\\n                is required for all Multi-Object Delete requests. Amazon S3 uses the header value to ensure that\\n                your request body has not been altered in transit.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <b>Directory bucket</b> - The Content-MD5 request header\\n                or a additional checksum request header (including <code>x-amz-checksum-crc32</code>,\\n                  <code>x-amz-checksum-crc32c</code>, <code>x-amz-checksum-sha1</code>, or\\n                  <code>x-amz-checksum-sha256</code>) is required for all Multi-Object Delete requests.</p>\\n                  </li>\\n               </ul>\\n            </dd>\\n            <dt>HTTP Host header syntax</dt>\\n            <dd>\\n               <p>\\n                  <b>Directory buckets </b> - The HTTP Host header syntax is <code>\\n                     <i>Bucket-name</i>.s3express-<i>zone-id</i>.<i>region-code</i>.amazonaws.com</code>.</p>\\n            </dd>\\n         </dl>\\n         <p>The following operations are related to <code>DeleteObjects</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateMultipartUpload.html\\\">CreateMultipartUpload</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPart.html\\\">UploadPart</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html\\\">CompleteMultipartUpload</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListParts.html\\\">ListParts</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_AbortMultipartUpload.html\\\">AbortMultipartUpload</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#examples\": [\n          {\n            \"title\": \"To delete multiple object versions from a versioned bucket\",\n            \"documentation\": \"The following example deletes objects from a bucket. The request specifies object versions. S3 deletes specific object versions and returns the key and versions of deleted objects in the response.\",\n            \"input\": {\n              \"Bucket\": \"examplebucket\",\n              \"Delete\": {\n                \"Objects\": [\n                  {\n                    \"Key\": \"HappyFace.jpg\",\n                    \"VersionId\": \"2LWg7lQLnY41.maGB5Z6SWW.dcq0vx7b\"\n                  },\n                  {\n                    \"Key\": \"HappyFace.jpg\",\n                    \"VersionId\": \"yoz3HB.ZhCS_tKVEmIOr7qYyyAaZSKVd\"\n                  }\n                ],\n                \"Quiet\": false\n              }\n            },\n            \"output\": {\n              \"Deleted\": [\n                {\n                  \"VersionId\": \"yoz3HB.ZhCS_tKVEmIOr7qYyyAaZSKVd\",\n                  \"Key\": \"HappyFace.jpg\"\n                },\n                {\n                  \"VersionId\": \"2LWg7lQLnY41.maGB5Z6SWW.dcq0vx7b\",\n                  \"Key\": \"HappyFace.jpg\"\n                }\n              ]\n            }\n          },\n          {\n            \"title\": \"To delete multiple objects from a versioned bucket\",\n            \"documentation\": \"The following example deletes objects from a bucket. The bucket is versioned, and the request does not specify the object version to delete. In this case, all versions remain in the bucket and S3 adds a delete marker.\",\n            \"input\": {\n              \"Bucket\": \"examplebucket\",\n              \"Delete\": {\n                \"Objects\": [\n                  {\n                    \"Key\": \"objectkey1\"\n                  },\n                  {\n                    \"Key\": \"objectkey2\"\n                  }\n                ],\n                \"Quiet\": false\n              }\n            },\n            \"output\": {\n              \"Deleted\": [\n                {\n                  \"DeleteMarkerVersionId\": \"A._w1z6EFiCF5uhtQMDal9JDkID9tQ7F\",\n                  \"Key\": \"objectkey1\",\n                  \"DeleteMarker\": true\n                },\n                {\n                  \"DeleteMarkerVersionId\": \"iOd_ORxhkKe_e8G8_oSGxt2PjsCZKlkt\",\n                  \"Key\": \"objectkey2\",\n                  \"DeleteMarker\": true\n                }\n              ]\n            }\n          }\n        ],\n        \"smithy.api#http\": {\n          \"method\": \"POST\",\n          \"uri\": \"/{Bucket}?delete\",\n          \"code\": 200\n        }\n      }\n    },\n    \"com.amazonaws.s3#DeleteObjectsOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Deleted\": {\n          \"target\": \"com.amazonaws.s3#DeletedObjects\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Container element for a successful delete. It identifies the object that was successfully\\n      deleted.</p>\",\n            \"smithy.api#xmlFlattened\": {}\n          }\n        },\n        \"RequestCharged\": {\n          \"target\": \"com.amazonaws.s3#RequestCharged\",\n          \"traits\": {\n            \"smithy.api#httpHeader\": \"x-amz-request-charged\"\n          }\n        },\n        \"Errors\": {\n          \"target\": \"com.amazonaws.s3#Errors\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Container for a failed delete action that describes the object that Amazon S3 attempted to delete and the\\n      error it encountered.</p>\",\n            \"smithy.api#xmlFlattened\": {},\n            \"smithy.api#xmlName\": \"Error\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#output\": {},\n        \"smithy.api#xmlName\": \"DeleteResult\"\n      }\n    },\n    \"com.amazonaws.s3#DeleteObjectsRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The bucket name containing the objects to delete. </p>\\n         <p>\\n            <b>Directory buckets</b> - When you use this operation with a directory bucket, you must use virtual-hosted-style requests in the format <code>\\n               <i>Bucket-name</i>.s3express-<i>zone-id</i>.<i>region-code</i>.amazonaws.com</code>. Path-style requests are not supported.  Directory bucket names must be unique in the chosen Zone (Availability Zone or Local Zone). Bucket names must follow the format <code>\\n               <i>bucket-base-name</i>--<i>zone-id</i>--x-s3</code> (for example, <code>\\n               <i>amzn-s3-demo-bucket</i>--<i>usw2-az1</i>--x-s3</code>). For information about bucket naming\\n         restrictions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-bucket-naming-rules.html\\\">Directory bucket naming\\n            rules</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <p>\\n            <b>Access points</b> - When you use this action with an access point for general purpose buckets, you must provide the alias of the access point in place of the bucket name or specify the access point ARN. When you use this action with an access point for directory buckets, you must provide the access point name in place of the bucket name. When using the access point ARN, you must direct requests to the access point hostname. The access point hostname takes the form <i>AccessPointName</i>-<i>AccountId</i>.s3-accesspoint.<i>Region</i>.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html\\\">Using access points</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <note>\\n            <p>Object Lambda access points are not supported by directory buckets.</p>\\n         </note>\\n         <p>\\n            <b>S3 on Outposts</b> - When you use this action with S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the \\n                     form <code>\\n               <i>AccessPointName</i>-<i>AccountId</i>.<i>outpostID</i>.s3-outposts.<i>Region</i>.amazonaws.com</code>. When you use this action with S3 on Outposts, the destination bucket must be the Outposts access point ARN or the access point alias. For more information about S3 on Outposts, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html\\\">What is S3 on Outposts?</a> in the <i>Amazon S3 User Guide</i>.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"Delete\": {\n          \"target\": \"com.amazonaws.s3#Delete\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Container for the request.</p>\",\n            \"smithy.api#httpPayload\": {},\n            \"smithy.api#required\": {},\n            \"smithy.api#xmlName\": \"Delete\"\n          }\n        },\n        \"MFA\": {\n          \"target\": \"com.amazonaws.s3#MFA\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The concatenation of the authentication device's serial number, a space, and the value that is\\n      displayed on your authentication device. Required to permanently delete a versioned object if versioning\\n      is configured with MFA delete enabled.</p>\\n         <p>When performing the <code>DeleteObjects</code> operation on an MFA delete enabled bucket, which\\n      attempts to delete the specified versioned objects, you must include an MFA token. If you don't provide\\n      an MFA token, the entire request will fail, even if there are non-versioned objects that you are trying\\n      to delete. If you provide an invalid token, whether there are versioned object keys in the request or\\n      not, the entire Multi-Object Delete request will fail. For information about MFA Delete, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/Versioning.html#MultiFactorAuthenticationDelete\\\"> MFA\\n        Delete</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-mfa\"\n          }\n        },\n        \"RequestPayer\": {\n          \"target\": \"com.amazonaws.s3#RequestPayer\",\n          \"traits\": {\n            \"smithy.api#httpHeader\": \"x-amz-request-payer\"\n          }\n        },\n        \"BypassGovernanceRetention\": {\n          \"target\": \"com.amazonaws.s3#BypassGovernanceRetention\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies whether you want to delete this object even if it has a Governance-type Object Lock in\\n      place. To use this header, you must have the <code>s3:BypassGovernanceRetention</code>\\n      permission.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-bypass-governance-retention\"\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        },\n        \"ChecksumAlgorithm\": {\n          \"target\": \"com.amazonaws.s3#ChecksumAlgorithm\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Indicates the algorithm used to create the checksum for the object when you use the SDK. This header will not provide any\\n    additional functionality if you don't use the SDK. When you send this header, there must be a corresponding <code>x-amz-checksum-<i>algorithm</i>\\n            </code> or\\n    <code>x-amz-trailer</code> header sent. Otherwise, Amazon S3 fails the request with the HTTP status code <code>400 Bad Request</code>.</p>\\n         <p>For the <code>x-amz-checksum-<i>algorithm</i>\\n            </code> header, replace <code>\\n               <i>algorithm</i>\\n            </code> with the supported algorithm from the following list: </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>CRC32</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>CRC32C</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>CRC64NVME</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>SHA1</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>SHA256</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>For more\\n    information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking object integrity</a> in\\n    the <i>Amazon S3 User Guide</i>.</p>\\n         <p>If the individual checksum value you provide through <code>x-amz-checksum-<i>algorithm</i>\\n            </code> doesn't match the checksum algorithm you set through <code>x-amz-sdk-checksum-algorithm</code>, Amazon S3 fails the request with a <code>BadDigest</code> error.</p>\\n         <p>If you provide an individual checksum, Amazon S3 ignores any provided <code>ChecksumAlgorithm</code>\\n      parameter.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-sdk-checksum-algorithm\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#DeletePublicAccessBlock\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#DeletePublicAccessBlockRequest\"\n      },\n      \"output\": {\n        \"target\": \"smithy.api#Unit\"\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported for directory buckets.</p>\\n         </note>\\n         <p>Removes the <code>PublicAccessBlock</code> configuration for an Amazon S3 bucket. This\\n      operation removes the bucket-level configuration only. The effective public access behavior\\n      will still be governed by account-level settings (which may inherit from organization-level\\n      policies). To use this operation, you must have the <code>s3:PutBucketPublicAccessBlock</code>\\n      permission. For more information about permissions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-with-s3-actions.html#using-with-s3-actions-related-to-bucket-subresources\\\">Permissions Related to Bucket Subresource Operations</a> and <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html\\\">Managing Access\\n        Permissions to Your Amazon S3 Resources</a>.</p>\\n         <p>The following operations are related to <code>DeletePublicAccessBlock</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/access-control-block-public-access.html\\\">Using\\n            Amazon S3 Block Public Access</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetPublicAccessBlock.html\\\">GetPublicAccessBlock</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutPublicAccessBlock.html\\\">PutPublicAccessBlock</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketPolicyStatus.html\\\">GetBucketPolicyStatus</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#http\": {\n          \"method\": \"DELETE\",\n          \"uri\": \"/{Bucket}?publicAccessBlock\",\n          \"code\": 204\n        },\n        \"smithy.rules#staticContextParams\": {\n          \"UseS3ExpressControlEndpoint\": {\n            \"value\": true\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#DeletePublicAccessBlockRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Amazon S3 bucket whose <code>PublicAccessBlock</code> configuration you want to delete. </p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#DeletedObject\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Key\": {\n          \"target\": \"com.amazonaws.s3#ObjectKey\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the deleted object.</p>\"\n          }\n        },\n        \"VersionId\": {\n          \"target\": \"com.amazonaws.s3#ObjectVersionId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The version ID of the deleted object.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\"\n          }\n        },\n        \"DeleteMarker\": {\n          \"target\": \"com.amazonaws.s3#DeleteMarker\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Indicates whether the specified object version that was permanently deleted was (true) or was not\\n      (false) a delete marker before deletion. In a simple DELETE, this header indicates whether (true) or not\\n      (false) the current version of the object is a delete marker. To learn more about delete markers, see\\n        <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/DeleteMarker.html\\\">Working with delete\\n        markers</a>.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\"\n          }\n        },\n        \"DeleteMarkerVersionId\": {\n          \"target\": \"com.amazonaws.s3#DeleteMarkerVersionId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The version ID of the delete marker created as a result of the DELETE operation. If you delete a\\n      specific object version, the value returned by this header is the version ID of the object version\\n      deleted.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Information about the deleted object.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#DeletedObjects\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.s3#DeletedObject\"\n      }\n    },\n    \"com.amazonaws.s3#Delimiter\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#Description\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#Destination\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p> The Amazon Resource Name (ARN) of the bucket where you want Amazon S3 to store the results.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"Account\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Destination bucket owner account ID. In a cross-account scenario, if you direct Amazon S3 to change\\n      replica ownership to the Amazon Web Services account that owns the destination bucket by specifying the\\n        <code>AccessControlTranslation</code> property, this is the account ID of the destination bucket\\n      owner. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/replication-change-owner.html\\\">Replication Additional Configuration: Changing\\n        the Replica Owner</a> in the <i>Amazon S3 User Guide</i>.</p>\"\n          }\n        },\n        \"StorageClass\": {\n          \"target\": \"com.amazonaws.s3#StorageClass\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p> The storage class to use when replicating objects, such as S3 Standard or reduced redundancy. By\\n      default, Amazon S3 uses the storage class of the source object to create the object replica. </p>\\n         <p>For valid values, see the <code>StorageClass</code> element of the <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketPUTreplication.html\\\">PUT Bucket replication</a> action in the\\n        <i>Amazon S3 API Reference</i>.</p>\\n         <p>\\n            <code>FSX_OPENZFS</code> is not an accepted value when replicating objects.</p>\"\n          }\n        },\n        \"AccessControlTranslation\": {\n          \"target\": \"com.amazonaws.s3#AccessControlTranslation\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specify this only in a cross-account scenario (where source and destination bucket owners are not\\n      the same), and you want to change replica ownership to the Amazon Web Services account that owns the destination\\n      bucket. If this is not specified in the replication configuration, the replicas are owned by same\\n      Amazon Web Services account that owns the source object.</p>\"\n          }\n        },\n        \"EncryptionConfiguration\": {\n          \"target\": \"com.amazonaws.s3#EncryptionConfiguration\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A container that provides information about encryption. If <code>SourceSelectionCriteria</code> is\\n      specified, you must specify this element.</p>\"\n          }\n        },\n        \"ReplicationTime\": {\n          \"target\": \"com.amazonaws.s3#ReplicationTime\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p> A container specifying S3 Replication Time Control (S3 RTC), including whether S3 RTC is enabled and the time when all\\n      objects and operations on objects must be replicated. Must be specified together with a\\n        <code>Metrics</code> block. </p>\"\n          }\n        },\n        \"Metrics\": {\n          \"target\": \"com.amazonaws.s3#Metrics\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p> A container specifying replication metrics-related settings enabling replication metrics and\\n      events. </p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Specifies information about where to publish analysis or configuration results for an Amazon S3 bucket\\n      and S3 Replication Time Control (S3 RTC).</p>\"\n      }\n    },\n    \"com.amazonaws.s3#DestinationResult\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"TableBucketType\": {\n          \"target\": \"com.amazonaws.s3#S3TablesBucketType\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>\\n      The type of the table bucket where the metadata configuration is stored. The <code>aws</code> \\n      value indicates an Amazon Web Services managed table bucket, and the <code>customer</code> value indicates a \\n      customer-managed table bucket. V2 metadata configurations are stored in Amazon Web Services managed table \\n      buckets, and V1 metadata configurations are stored in customer-managed table buckets. \\n    </p>\"\n          }\n        },\n        \"TableBucketArn\": {\n          \"target\": \"com.amazonaws.s3#S3TablesBucketArn\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>\\n      The Amazon Resource Name (ARN) of the table bucket where the metadata configuration is stored.\\n    </p>\"\n          }\n        },\n        \"TableNamespace\": {\n          \"target\": \"com.amazonaws.s3#S3TablesNamespace\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>\\n      The namespace in the table bucket where the metadata tables for a metadata configuration are \\n      stored.\\n    </p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>\\n      The destination information for the S3 Metadata configuration.\\n    </p>\"\n      }\n    },\n    \"com.amazonaws.s3#DirectoryBucketToken\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#length\": {\n          \"min\": 0,\n          \"max\": 1024\n        }\n      }\n    },\n    \"com.amazonaws.s3#DisplayName\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#ETag\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#EmailAddress\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#EnableRequestProgress\": {\n      \"type\": \"boolean\"\n    },\n    \"com.amazonaws.s3#EncodingType\": {\n      \"type\": \"enum\",\n      \"members\": {\n        \"url\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"url\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Encoding type used by Amazon S3 to encode the <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-keys.html\\\">object keys</a> in the response. Responses are\\n      encoded only in UTF-8. An object key can contain any Unicode character. However, the XML 1.0 parser\\n      can't parse certain characters, such as characters with an ASCII value from 0 to 10. For characters that\\n      aren't supported in XML 1.0, you can add this parameter to request that Amazon S3 encode the keys in the\\n      response. For more information about characters to avoid in object key names, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-keys.html#object-key-guidelines\\\">Object key\\n        naming guidelines</a>.</p>\\n         <note>\\n            <p>When using the URL encoding type, non-ASCII characters that are used in an object's key name will\\n        be percent-encoded according to UTF-8 code values. For example, the object\\n          <code>test_file(3).png</code> will appear as <code>test_file%283%29.png</code>.</p>\\n         </note>\"\n      }\n    },\n    \"com.amazonaws.s3#Encryption\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"EncryptionType\": {\n          \"target\": \"com.amazonaws.s3#ServerSideEncryption\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The server-side encryption algorithm used when storing job results in Amazon S3 (for example, AES256,\\n        <code>aws:kms</code>).</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"KMSKeyId\": {\n          \"target\": \"com.amazonaws.s3#SSEKMSKeyId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>If the encryption type is <code>aws:kms</code>, this optional value specifies the ID of the\\n      symmetric encryption customer managed key to use for encryption of job results. Amazon S3 only supports symmetric\\n      encryption KMS keys. For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/symmetric-asymmetric.html\\\">Asymmetric keys in KMS</a> in the\\n        <i>Amazon Web Services Key Management Service Developer Guide</i>.</p>\"\n          }\n        },\n        \"KMSContext\": {\n          \"target\": \"com.amazonaws.s3#KMSContext\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>If the encryption type is <code>aws:kms</code>, this optional value can be used to specify the\\n      encryption context for the restore results.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Contains the type of server-side encryption used.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#EncryptionConfiguration\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"ReplicaKmsKeyID\": {\n          \"target\": \"com.amazonaws.s3#ReplicaKmsKeyID\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the ID (Key ARN or Alias ARN) of the customer managed Amazon Web Services KMS key stored in Amazon Web Services Key\\n      Management Service (KMS) for the destination bucket. Amazon S3 uses this key to encrypt replica objects. Amazon S3\\n      only supports symmetric encryption KMS keys. For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/symmetric-asymmetric.html\\\">Asymmetric keys in Amazon Web Services KMS</a> in the\\n        <i>Amazon Web Services Key Management Service Developer Guide</i>.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Specifies encryption-related information for an Amazon S3 bucket that is a destination for replicated\\n      objects.</p>\\n         <note>\\n            <p>If you're specifying a customer managed KMS key, we recommend using a fully qualified KMS key\\n        ARN. If you use a KMS key alias instead, then KMS resolves the key within the requester’s account.\\n        This behavior can result in data that's encrypted with a KMS key that belongs to the requester, and\\n        not the bucket owner.</p>\\n         </note>\"\n      }\n    },\n    \"com.amazonaws.s3#EncryptionType\": {\n      \"type\": \"enum\",\n      \"members\": {\n        \"NONE\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"NONE\"\n          }\n        },\n        \"SSE_C\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"SSE-C\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#EncryptionTypeList\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.s3#EncryptionType\",\n        \"traits\": {\n          \"smithy.api#xmlName\": \"EncryptionType\"\n        }\n      }\n    },\n    \"com.amazonaws.s3#EncryptionTypeMismatch\": {\n      \"type\": \"structure\",\n      \"members\": {},\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p> The existing object was created with a different encryption type. Subsequent write requests must\\n      include the appropriate encryption parameters in the request or while creating the session. </p>\",\n        \"smithy.api#error\": \"client\",\n        \"smithy.api#httpError\": 400\n      }\n    },\n    \"com.amazonaws.s3#End\": {\n      \"type\": \"long\"\n    },\n    \"com.amazonaws.s3#EndEvent\": {\n      \"type\": \"structure\",\n      \"members\": {},\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>A message that indicates the request is complete and no more messages will be sent. You should not\\n      assume that the request is complete until the client receives an <code>EndEvent</code>.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#Error\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Key\": {\n          \"target\": \"com.amazonaws.s3#ObjectKey\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The error key.</p>\"\n          }\n        },\n        \"VersionId\": {\n          \"target\": \"com.amazonaws.s3#ObjectVersionId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The version ID of the error.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\"\n          }\n        },\n        \"Code\": {\n          \"target\": \"com.amazonaws.s3#Code\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The error code is a string that uniquely identifies an error condition. It is meant to be read and\\n      understood by programs that detect and handle errors by type. The following is a list of Amazon S3 error\\n      codes. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html\\\">Error responses</a>.</p>\\n         <ul>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> AccessDenied </p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> Access Denied</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> 403 Forbidden</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>SOAP Fault Code Prefix:</i> Client</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> AccountProblem</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> There is a problem with your Amazon Web Services account that prevents\\n              the action from completing successfully. Contact Amazon Web Services Support for further assistance.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> 403 Forbidden</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>SOAP Fault Code Prefix:</i> Client</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> AllAccessDisabled</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> All access to this Amazon S3 resource has been disabled.\\n              Contact Amazon Web Services Support for further assistance.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> 403 Forbidden</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>SOAP Fault Code Prefix:</i> Client</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> AmbiguousGrantByEmailAddress</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> The email address you provided is associated with more\\n              than one account.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> 400 Bad Request</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>SOAP Fault Code Prefix:</i> Client</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> AuthorizationHeaderMalformed</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> The authorization header you provided is invalid.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> 400 Bad Request</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> N/A</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> BadDigest</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> The Content-MD5 you specified did not match what we\\n              received.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> 400 Bad Request</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>SOAP Fault Code Prefix:</i> Client</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> BucketAlreadyExists</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> The requested bucket name is not available. The bucket\\n              namespace is shared by all users of the system. Please select a different name and try\\n              again.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> 409 Conflict</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>SOAP Fault Code Prefix:</i> Client</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> BucketAlreadyOwnedByYou</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> The bucket you tried to create already exists, and you own\\n              it. Amazon S3 returns this error in all Amazon Web Services Regions except in the North Virginia Region. For legacy\\n              compatibility, if you re-create an existing bucket that you already own in the North Virginia\\n              Region, Amazon S3 returns 200 OK and resets the bucket access control lists (ACLs).</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> 409 Conflict (in all Regions except the North Virginia Region)\\n            </p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>SOAP Fault Code Prefix:</i> Client</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> BucketNotEmpty</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> The bucket you tried to delete is not empty.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> 409 Conflict</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>SOAP Fault Code Prefix:</i> Client</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> CredentialsNotSupported</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> This request does not support credentials.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> 400 Bad Request</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>SOAP Fault Code Prefix:</i> Client</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> CrossLocationLoggingProhibited</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> Cross-location logging not allowed. Buckets in one\\n              geographic location cannot log information to a bucket in another location.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> 403 Forbidden</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>SOAP Fault Code Prefix:</i> Client</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> EntityTooSmall</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> Your proposed upload is smaller than the minimum allowed\\n              object size.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> 400 Bad Request</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>SOAP Fault Code Prefix:</i> Client</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> EntityTooLarge</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> Your proposed upload exceeds the maximum allowed object\\n              size.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> 400 Bad Request</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>SOAP Fault Code Prefix:</i> Client</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> ExpiredToken</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> The provided token has expired.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> 400 Bad Request</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>SOAP Fault Code Prefix:</i> Client</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> IllegalVersioningConfigurationException </p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> Indicates that the versioning configuration specified in\\n              the request is invalid.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> 400 Bad Request</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>SOAP Fault Code Prefix:</i> Client</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> IncompleteBody</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> You did not provide the number of bytes specified by the\\n              Content-Length HTTP header</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> 400 Bad Request</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>SOAP Fault Code Prefix:</i> Client</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> IncorrectNumberOfFilesInPostRequest</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> POST requires exactly one file upload per request.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> 400 Bad Request</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>SOAP Fault Code Prefix:</i> Client</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> InlineDataTooLarge</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> Inline data exceeds the maximum allowed size.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> 400 Bad Request</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>SOAP Fault Code Prefix:</i> Client</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> InternalError</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> We encountered an internal error. Please try again.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> 500 Internal Server Error</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>SOAP Fault Code Prefix:</i> Server</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> InvalidAccessKeyId</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> The Amazon Web Services access key ID you provided does not exist in our\\n              records.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> 403 Forbidden</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>SOAP Fault Code Prefix:</i> Client</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> InvalidAddressingHeader</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> You must specify the Anonymous role.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> N/A</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>SOAP Fault Code Prefix:</i> Client</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> InvalidArgument</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> Invalid Argument</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> 400 Bad Request</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>SOAP Fault Code Prefix:</i> Client</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> InvalidBucketName</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> The specified bucket is not valid.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> 400 Bad Request</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>SOAP Fault Code Prefix:</i> Client</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> InvalidBucketState</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> The request is not valid with the current state of the\\n              bucket.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> 409 Conflict</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>SOAP Fault Code Prefix:</i> Client</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> InvalidDigest</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> The Content-MD5 you specified is not valid.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> 400 Bad Request</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>SOAP Fault Code Prefix:</i> Client</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> InvalidEncryptionAlgorithmError</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> The encryption request you specified is not valid. The\\n              valid value is AES256.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> 400 Bad Request</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>SOAP Fault Code Prefix:</i> Client</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> InvalidLocationConstraint</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> The specified location constraint is not valid. For more\\n              information about Regions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingBucket.html#access-bucket-intro\\\">How to Select a Region for Your\\n                Buckets</a>. </p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> 400 Bad Request</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>SOAP Fault Code Prefix:</i> Client</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> InvalidObjectState</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> The action is not valid for the current state of the\\n              object.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> 403 Forbidden</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>SOAP Fault Code Prefix:</i> Client</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> InvalidPart</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> One or more of the specified parts could not be found. The\\n              part might not have been uploaded, or the specified entity tag might not have matched the part's\\n              entity tag.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> 400 Bad Request</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>SOAP Fault Code Prefix:</i> Client</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> InvalidPartOrder</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> The list of parts was not in ascending order. Parts list\\n              must be specified in order by part number.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> 400 Bad Request</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>SOAP Fault Code Prefix:</i> Client</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> InvalidPayer</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> All access to this object has been disabled. Please\\n              contact Amazon Web Services Support for further assistance.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> 403 Forbidden</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>SOAP Fault Code Prefix:</i> Client</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> InvalidPolicyDocument</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> The content of the form does not meet the conditions\\n              specified in the policy document.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> 400 Bad Request</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>SOAP Fault Code Prefix:</i> Client</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> InvalidRange</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> The requested range cannot be satisfied.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> 416 Requested Range Not Satisfiable</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>SOAP Fault Code Prefix:</i> Client</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> InvalidRequest</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> Please use <code>AWS4-HMAC-SHA256</code>.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> 400 Bad Request</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> N/A</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> InvalidRequest</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> SOAP requests must be made over an HTTPS\\n              connection.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> 400 Bad Request</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>SOAP Fault Code Prefix:</i> Client</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> InvalidRequest</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> Amazon S3 Transfer Acceleration is not supported for buckets\\n              with non-DNS compliant names.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> 400 Bad Request</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> N/A</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> InvalidRequest</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> Amazon S3 Transfer Acceleration is not supported for buckets\\n              with periods (.) in their names.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> 400 Bad Request</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> N/A</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> InvalidRequest</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> Amazon S3 Transfer Accelerate endpoint only supports virtual\\n              style requests.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> 400 Bad Request</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> N/A</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> InvalidRequest</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> Amazon S3 Transfer Accelerate is not configured on this\\n              bucket.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> 400 Bad Request</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> N/A</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> InvalidRequest</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> Amazon S3 Transfer Accelerate is disabled on this\\n              bucket.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> 400 Bad Request</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> N/A</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> InvalidRequest</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> Amazon S3 Transfer Acceleration is not supported on this\\n              bucket. Contact Amazon Web Services Support for more information.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> 400 Bad Request</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> N/A</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> InvalidRequest</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> Amazon S3 Transfer Acceleration cannot be enabled on this\\n              bucket. Contact Amazon Web Services Support for more information.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> 400 Bad Request</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> N/A</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> InvalidSecurity</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> The provided security credentials are not valid.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> 403 Forbidden</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>SOAP Fault Code Prefix:</i> Client</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> InvalidSOAPRequest</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> The SOAP request body is invalid.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> 400 Bad Request</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>SOAP Fault Code Prefix:</i> Client</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> InvalidStorageClass</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> The storage class you specified is not valid.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> 400 Bad Request</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>SOAP Fault Code Prefix:</i> Client</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> InvalidTargetBucketForLogging</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> The target bucket for logging does not exist, is not owned\\n              by you, or does not have the appropriate grants for the log-delivery group. </p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> 400 Bad Request</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>SOAP Fault Code Prefix:</i> Client</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> InvalidToken</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> The provided token is malformed or otherwise\\n              invalid.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> 400 Bad Request</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>SOAP Fault Code Prefix:</i> Client</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> InvalidURI</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> Couldn't parse the specified URI.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> 400 Bad Request</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>SOAP Fault Code Prefix:</i> Client</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> KeyTooLongError</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> Your key is too long.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> 400 Bad Request</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>SOAP Fault Code Prefix:</i> Client</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> MalformedACLError</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> The XML you provided was not well-formed or did not\\n              validate against our published schema.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> 400 Bad Request</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>SOAP Fault Code Prefix:</i> Client</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> MalformedPOSTRequest </p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> The body of your POST request is not well-formed\\n              multipart/form-data.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> 400 Bad Request</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>SOAP Fault Code Prefix:</i> Client</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> MalformedXML</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> This happens when the user sends malformed XML (XML that\\n              doesn't conform to the published XSD) for the configuration. The error message is, \\\"The XML you\\n              provided was not well-formed or did not validate against our published schema.\\\" </p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> 400 Bad Request</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>SOAP Fault Code Prefix:</i> Client</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> MaxMessageLengthExceeded</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> Your request was too big.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> 400 Bad Request</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>SOAP Fault Code Prefix:</i> Client</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> MaxPostPreDataLengthExceededError</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> Your POST request fields preceding the upload file were\\n              too large.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> 400 Bad Request</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>SOAP Fault Code Prefix:</i> Client</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> MetadataTooLarge</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> Your metadata headers exceed the maximum allowed metadata\\n              size.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> 400 Bad Request</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>SOAP Fault Code Prefix:</i> Client</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> MethodNotAllowed</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> The specified method is not allowed against this\\n              resource.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> 405 Method Not Allowed</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>SOAP Fault Code Prefix:</i> Client</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> MissingAttachment</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> A SOAP attachment was expected, but none were\\n              found.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> N/A</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>SOAP Fault Code Prefix:</i> Client</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> MissingContentLength</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> You must provide the Content-Length HTTP header.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> 411 Length Required</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>SOAP Fault Code Prefix:</i> Client</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> MissingRequestBodyError</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> This happens when the user sends an empty XML document as\\n              a request. The error message is, \\\"Request body is empty.\\\" </p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> 400 Bad Request</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>SOAP Fault Code Prefix:</i> Client</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> MissingSecurityElement</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> The SOAP 1.1 request is missing a security element.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> 400 Bad Request</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>SOAP Fault Code Prefix:</i> Client</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> MissingSecurityHeader</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> Your request is missing a required header.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> 400 Bad Request</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>SOAP Fault Code Prefix:</i> Client</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> NoLoggingStatusForKey</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> There is no such thing as a logging status subresource for\\n              a key.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> 400 Bad Request</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>SOAP Fault Code Prefix:</i> Client</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> NoSuchBucket</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> The specified bucket does not exist.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> 404 Not Found</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>SOAP Fault Code Prefix:</i> Client</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> NoSuchBucketPolicy</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> The specified bucket does not have a bucket policy.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> 404 Not Found</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>SOAP Fault Code Prefix:</i> Client</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> NoSuchKey</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> The specified key does not exist.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> 404 Not Found</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>SOAP Fault Code Prefix:</i> Client</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> NoSuchLifecycleConfiguration</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> The lifecycle configuration does not exist. </p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> 404 Not Found</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>SOAP Fault Code Prefix:</i> Client</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> NoSuchUpload</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> The specified multipart upload does not exist. The upload\\n              ID might be invalid, or the multipart upload might have been aborted or completed.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> 404 Not Found</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>SOAP Fault Code Prefix:</i> Client</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> NoSuchVersion </p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> Indicates that the version ID specified in the request\\n              does not match an existing version.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> 404 Not Found</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>SOAP Fault Code Prefix:</i> Client</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> NotImplemented</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> A header you provided implies functionality that is not\\n              implemented.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> 501 Not Implemented</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>SOAP Fault Code Prefix:</i> Server</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> NotSignedUp</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> Your account is not signed up for the Amazon S3 service. You\\n              must sign up before you can use Amazon S3. You can sign up at the following URL: <a href=\\\"http://aws.amazon.com/s3\\\">Amazon S3</a>\\n                     </p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> 403 Forbidden</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>SOAP Fault Code Prefix:</i> Client</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> OperationAborted</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> A conflicting conditional action is currently in progress\\n              against this resource. Try again.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> 409 Conflict</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>SOAP Fault Code Prefix:</i> Client</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> PermanentRedirect</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> The bucket you are attempting to access must be addressed\\n              using the specified endpoint. Send all future requests to this endpoint.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> 301 Moved Permanently</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>SOAP Fault Code Prefix:</i> Client</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> PreconditionFailed</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> At least one of the preconditions you specified did not\\n              hold.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> 412 Precondition Failed</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>SOAP Fault Code Prefix:</i> Client</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> Redirect</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> Temporary redirect.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> 307 Moved Temporarily</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>SOAP Fault Code Prefix:</i> Client</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> RestoreAlreadyInProgress</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> Object restore is already in progress.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> 409 Conflict</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>SOAP Fault Code Prefix:</i> Client</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> RequestIsNotMultiPartContent</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> Bucket POST must be of the enclosure-type\\n              multipart/form-data.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> 400 Bad Request</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>SOAP Fault Code Prefix:</i> Client</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> RequestTimeout</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> Your socket connection to the server was not read from or\\n              written to within the timeout period.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> 400 Bad Request</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>SOAP Fault Code Prefix:</i> Client</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> RequestTimeTooSkewed</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> The difference between the request time and the server's\\n              time is too large.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> 403 Forbidden</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>SOAP Fault Code Prefix:</i> Client</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> RequestTorrentOfBucketError</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> Requesting the torrent file of a bucket is not\\n              permitted.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> 400 Bad Request</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>SOAP Fault Code Prefix:</i> Client</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> SignatureDoesNotMatch</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> The request signature we calculated does not match the\\n              signature you provided. Check your Amazon Web Services secret access key and signing method. For more\\n              information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html\\\">REST Authentication</a> and <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/SOAPAuthentication.html\\\">SOAP Authentication</a> for\\n              details.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> 403 Forbidden</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>SOAP Fault Code Prefix:</i> Client</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> ServiceUnavailable</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> Service is unable to handle request.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> 503 Service Unavailable</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>SOAP Fault Code Prefix:</i> Server</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> SlowDown</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> Reduce your request rate.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> 503 Slow Down</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>SOAP Fault Code Prefix:</i> Server</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> TemporaryRedirect</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> You are being redirected to the bucket while DNS\\n              updates.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> 307 Moved Temporarily</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>SOAP Fault Code Prefix:</i> Client</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> TokenRefreshRequired</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> The provided token must be refreshed.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> 400 Bad Request</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>SOAP Fault Code Prefix:</i> Client</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> TooManyBuckets</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> You have attempted to create more buckets than\\n              allowed.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> 400 Bad Request</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>SOAP Fault Code Prefix:</i> Client</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> UnexpectedContent</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> This request does not support content.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> 400 Bad Request</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>SOAP Fault Code Prefix:</i> Client</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> UnresolvableGrantByEmailAddress</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> The email address you provided does not match any account\\n              on record.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> 400 Bad Request</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>SOAP Fault Code Prefix:</i> Client</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>Code:</i> UserKeyMustBeSpecified</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Description:</i> The bucket POST must contain the specified field name. If\\n              it is specified, check the order of the fields.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Status Code:</i> 400 Bad Request</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>SOAP Fault Code Prefix:</i> Client</p>\\n                  </li>\\n               </ul>\\n            </li>\\n         </ul>\\n         <p></p>\"\n          }\n        },\n        \"Message\": {\n          \"target\": \"com.amazonaws.s3#Message\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The error message contains a generic description of the error condition in English. It is intended\\n      for a human audience. Simple programs display the message directly to the end user if they encounter an\\n      error condition they don't know how or don't care to handle. Sophisticated programs with more exhaustive\\n      error handling and proper internationalization are more likely to ignore the error message.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Container for all error elements.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#ErrorCode\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#ErrorDetails\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"ErrorCode\": {\n          \"target\": \"com.amazonaws.s3#ErrorCode\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p> If the V1 <code>CreateBucketMetadataTableConfiguration</code> request succeeds, but S3 Metadata was\\n      unable to create the table, this structure contains the error code. The possible error codes and error\\n      messages are as follows: </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>AccessDeniedCreatingResources</code> - You don't have sufficient permissions to create the\\n          required resources. Make sure that you have <code>s3tables:CreateNamespace</code>,\\n            <code>s3tables:CreateTable</code>, <code>s3tables:GetTable</code> and\\n            <code>s3tables:PutTablePolicy</code> permissions, and then try again. To create a new metadata\\n          table, you must delete the metadata configuration for this bucket, and then create a new metadata\\n          configuration. </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>AccessDeniedWritingToTable</code> - Unable to write to the metadata table because of\\n          missing resource permissions. To fix the resource policy, Amazon S3 needs to create a new metadata\\n          table. To create a new metadata table, you must delete the metadata configuration for this bucket,\\n          and then create a new metadata configuration.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>DestinationTableNotFound</code> - The destination table doesn't exist. To create a new\\n          metadata table, you must delete the metadata configuration for this bucket, and then create a new\\n          metadata configuration.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ServerInternalError</code> - An internal error has occurred. To create a new metadata\\n          table, you must delete the metadata configuration for this bucket, and then create a new metadata\\n          configuration.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>TableAlreadyExists</code> - The table that you specified already exists in the table\\n          bucket's namespace. Specify a different table name. To create a new metadata table, you must delete\\n          the metadata configuration for this bucket, and then create a new metadata configuration.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>TableBucketNotFound</code> - The table bucket that you specified doesn't exist in this\\n          Amazon Web Services Region and account. Create or choose a different table bucket. To create a new metadata table,\\n          you must delete the metadata configuration for this bucket, and then create a new metadata\\n          configuration.</p>\\n            </li>\\n         </ul>\\n         <p> If the V2 <code>CreateBucketMetadataConfiguration</code> request succeeds, but S3 Metadata was\\n      unable to create the table, this structure contains the error code. The possible error codes and error\\n      messages are as follows: </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>AccessDeniedCreatingResources</code> - You don't have sufficient permissions to create \\n          the required resources. Make sure that you have <code>s3tables:CreateTableBucket</code>, \\n          <code>s3tables:CreateNamespace</code>, <code>s3tables:CreateTable</code>, \\n          <code>s3tables:GetTable</code>, <code>s3tables:PutTablePolicy</code>, \\n          <code>kms:DescribeKey</code>, and <code>s3tables:PutTableEncryption</code> permissions. \\n          Additionally, ensure that the KMS key used to encrypt the table still exists, is active and \\n          has a resource policy granting access to the S3 service principals \\n          '<code>maintenance.s3tables.amazonaws.com</code>' and '<code>metadata.s3.amazonaws.com</code>'. \\n          To create a new metadata table, you must delete the metadata configuration for this bucket, and \\n          then create a new metadata configuration. </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>AccessDeniedWritingToTable</code> - Unable to write to the metadata table because of\\n          missing resource permissions. To fix the resource policy, Amazon S3 needs to create a new metadata\\n          table. To create a new metadata table, you must delete the metadata configuration for this bucket,\\n          and then create a new metadata configuration.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>DestinationTableNotFound</code> - The destination table doesn't exist. To create a new\\n          metadata table, you must delete the metadata configuration for this bucket, and then create a new\\n          metadata configuration.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ServerInternalError</code> - An internal error has occurred. To create a new metadata\\n          table, you must delete the metadata configuration for this bucket, and then create a new metadata\\n          configuration.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>JournalTableAlreadyExists</code> - A journal table already exists in the Amazon Web Services managed table bucket's \\n          namespace. Delete the journal table, and then try again. To create a new metadata table, you must delete\\n          the metadata configuration for this bucket, and then create a new metadata configuration.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>InventoryTableAlreadyExists</code> - An inventory table already exists in the Amazon Web Services managed table \\n          bucket's namespace. Delete the inventory table, and then try again. To create a new metadata table, you must delete\\n          the metadata configuration for this bucket, and then create a new metadata configuration.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>JournalTableNotAvailable</code> - The journal table that the inventory table relies on \\n          has a <code>FAILED</code> status. An inventory table requires a journal table with an \\n          <code>ACTIVE</code> status. To create a new journal or inventory table, you must delete the metadata \\n          configuration for this bucket, along with any journal or inventory tables, and then create a new \\n          metadata configuration.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>NoSuchBucket</code> - The specified general purpose bucket does not exist.</p>\\n            </li>\\n         </ul>\"\n          }\n        },\n        \"ErrorMessage\": {\n          \"target\": \"com.amazonaws.s3#ErrorMessage\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p> If the V1 <code>CreateBucketMetadataTableConfiguration</code> request succeeds, but S3 Metadata was\\n      unable to create the table, this structure contains the error message. The possible error codes and\\n      error messages are as follows: </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>AccessDeniedCreatingResources</code> - You don't have sufficient permissions to create the\\n          required resources. Make sure that you have <code>s3tables:CreateNamespace</code>,\\n            <code>s3tables:CreateTable</code>, <code>s3tables:GetTable</code> and\\n            <code>s3tables:PutTablePolicy</code> permissions, and then try again. To create a new metadata\\n          table, you must delete the metadata configuration for this bucket, and then create a new metadata\\n          configuration. </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>AccessDeniedWritingToTable</code> - Unable to write to the metadata table because of\\n          missing resource permissions. To fix the resource policy, Amazon S3 needs to create a new metadata\\n          table. To create a new metadata table, you must delete the metadata configuration for this bucket,\\n          and then create a new metadata configuration.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>DestinationTableNotFound</code> - The destination table doesn't exist. To create a new\\n          metadata table, you must delete the metadata configuration for this bucket, and then create a new\\n          metadata configuration.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ServerInternalError</code> - An internal error has occurred. To create a new metadata\\n          table, you must delete the metadata configuration for this bucket, and then create a new metadata\\n          configuration.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>TableAlreadyExists</code> - The table that you specified already exists in the table\\n          bucket's namespace. Specify a different table name. To create a new metadata table, you must delete\\n          the metadata configuration for this bucket, and then create a new metadata configuration.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>TableBucketNotFound</code> - The table bucket that you specified doesn't exist in this\\n          Amazon Web Services Region and account. Create or choose a different table bucket. To create a new metadata table,\\n          you must delete the metadata configuration for this bucket, and then create a new metadata\\n          configuration.</p>\\n            </li>\\n         </ul>\\n         <p> If the V2 <code>CreateBucketMetadataConfiguration</code> request succeeds, but S3 Metadata was\\n      unable to create the table, this structure contains the error code. The possible error codes and error\\n      messages are as follows: </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>AccessDeniedCreatingResources</code> - You don't have sufficient permissions to create \\n          the required resources. Make sure that you have <code>s3tables:CreateTableBucket</code>, \\n          <code>s3tables:CreateNamespace</code>, <code>s3tables:CreateTable</code>, \\n          <code>s3tables:GetTable</code>, <code>s3tables:PutTablePolicy</code>, \\n          <code>kms:DescribeKey</code>, and <code>s3tables:PutTableEncryption</code> permissions. \\n          Additionally, ensure that the KMS key used to encrypt the table still exists, is active and \\n          has a resource policy granting access to the S3 service principals \\n          '<code>maintenance.s3tables.amazonaws.com</code>' and '<code>metadata.s3.amazonaws.com</code>'. \\n          To create a new metadata table, you must delete the metadata configuration for this bucket, and \\n          then create a new metadata configuration. </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>AccessDeniedWritingToTable</code> - Unable to write to the metadata table because of\\n          missing resource permissions. To fix the resource policy, Amazon S3 needs to create a new metadata\\n          table. To create a new metadata table, you must delete the metadata configuration for this bucket,\\n          and then create a new metadata configuration.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>DestinationTableNotFound</code> - The destination table doesn't exist. To create a new\\n          metadata table, you must delete the metadata configuration for this bucket, and then create a new\\n          metadata configuration.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ServerInternalError</code> - An internal error has occurred. To create a new metadata\\n          table, you must delete the metadata configuration for this bucket, and then create a new metadata\\n          configuration.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>JournalTableAlreadyExists</code> - A journal table already exists in the Amazon Web Services managed table bucket's \\n          namespace. Delete the journal table, and then try again. To create a new metadata table, you must delete\\n          the metadata configuration for this bucket, and then create a new metadata configuration.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>InventoryTableAlreadyExists</code> - An inventory table already exists in the Amazon Web Services managed table \\n          bucket's namespace. Delete the inventory table, and then try again. To create a new metadata table, you must delete\\n          the metadata configuration for this bucket, and then create a new metadata configuration.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>JournalTableNotAvailable</code> - The journal table that the inventory table relies on \\n          has a <code>FAILED</code> status. An inventory table requires a journal table with an \\n          <code>ACTIVE</code> status. To create a new journal or inventory table, you must delete the metadata \\n          configuration for this bucket, along with any journal or inventory tables, and then create a new \\n          metadata configuration.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>NoSuchBucket</code> - The specified general purpose bucket does not exist.</p>\\n            </li>\\n         </ul>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p> If an S3 Metadata V1 <code>CreateBucketMetadataTableConfiguration</code> or V2 \\n      <code>CreateBucketMetadataConfiguration</code> request succeeds, but S3 Metadata was\\n      unable to create the table, this structure contains the error code and error message. </p>\\n         <note>\\n            <p>If you created your S3 Metadata configuration before July 15, 2025, we recommend that you delete \\n        and re-create your configuration by using <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateBucketMetadataConfiguration.html\\\">CreateBucketMetadataConfiguration</a> so that you can expire journal table records and create \\n        a live inventory table.</p>\\n         </note>\"\n      }\n    },\n    \"com.amazonaws.s3#ErrorDocument\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Key\": {\n          \"target\": \"com.amazonaws.s3#ObjectKey\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The object key name to use when a 4XX class error occurs.</p>\\n         <important>\\n            <p>Replacement must be made for object keys containing special characters (such as carriage returns) when using \\n         XML requests. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-keys.html#object-key-xml-related-constraints\\\">\\n            XML related object key constraints</a>.</p>\\n         </important>\",\n            \"smithy.api#required\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>The error information.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#ErrorMessage\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#Errors\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.s3#Error\"\n      }\n    },\n    \"com.amazonaws.s3#Event\": {\n      \"type\": \"enum\",\n      \"members\": {\n        \"s3_ReducedRedundancyLostObject\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"s3:ReducedRedundancyLostObject\"\n          }\n        },\n        \"s3_ObjectCreated_\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"s3:ObjectCreated:*\"\n          }\n        },\n        \"s3_ObjectCreated_Put\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"s3:ObjectCreated:Put\"\n          }\n        },\n        \"s3_ObjectCreated_Post\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"s3:ObjectCreated:Post\"\n          }\n        },\n        \"s3_ObjectCreated_Copy\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"s3:ObjectCreated:Copy\"\n          }\n        },\n        \"s3_ObjectCreated_CompleteMultipartUpload\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"s3:ObjectCreated:CompleteMultipartUpload\"\n          }\n        },\n        \"s3_ObjectRemoved_\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"s3:ObjectRemoved:*\"\n          }\n        },\n        \"s3_ObjectRemoved_Delete\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"s3:ObjectRemoved:Delete\"\n          }\n        },\n        \"s3_ObjectRemoved_DeleteMarkerCreated\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"s3:ObjectRemoved:DeleteMarkerCreated\"\n          }\n        },\n        \"s3_ObjectRestore_\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"s3:ObjectRestore:*\"\n          }\n        },\n        \"s3_ObjectRestore_Post\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"s3:ObjectRestore:Post\"\n          }\n        },\n        \"s3_ObjectRestore_Completed\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"s3:ObjectRestore:Completed\"\n          }\n        },\n        \"s3_Replication_\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"s3:Replication:*\"\n          }\n        },\n        \"s3_Replication_OperationFailedReplication\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"s3:Replication:OperationFailedReplication\"\n          }\n        },\n        \"s3_Replication_OperationNotTracked\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"s3:Replication:OperationNotTracked\"\n          }\n        },\n        \"s3_Replication_OperationMissedThreshold\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"s3:Replication:OperationMissedThreshold\"\n          }\n        },\n        \"s3_Replication_OperationReplicatedAfterThreshold\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"s3:Replication:OperationReplicatedAfterThreshold\"\n          }\n        },\n        \"s3_ObjectRestore_Delete\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"s3:ObjectRestore:Delete\"\n          }\n        },\n        \"s3_LifecycleTransition\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"s3:LifecycleTransition\"\n          }\n        },\n        \"s3_IntelligentTiering\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"s3:IntelligentTiering\"\n          }\n        },\n        \"s3_ObjectAcl_Put\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"s3:ObjectAcl:Put\"\n          }\n        },\n        \"s3_LifecycleExpiration_\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"s3:LifecycleExpiration:*\"\n          }\n        },\n        \"s3_LifecycleExpiration_Delete\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"s3:LifecycleExpiration:Delete\"\n          }\n        },\n        \"s3_LifecycleExpiration_DeleteMarkerCreated\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"s3:LifecycleExpiration:DeleteMarkerCreated\"\n          }\n        },\n        \"s3_ObjectTagging_\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"s3:ObjectTagging:*\"\n          }\n        },\n        \"s3_ObjectTagging_Put\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"s3:ObjectTagging:Put\"\n          }\n        },\n        \"s3_ObjectTagging_Delete\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"s3:ObjectTagging:Delete\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>The bucket event for which to send notifications.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#EventBridgeConfiguration\": {\n      \"type\": \"structure\",\n      \"members\": {},\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>A container for specifying the configuration for Amazon EventBridge.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#EventList\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.s3#Event\"\n      }\n    },\n    \"com.amazonaws.s3#ExistingObjectReplication\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Status\": {\n          \"target\": \"com.amazonaws.s3#ExistingObjectReplicationStatus\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies whether Amazon S3 replicates existing source bucket objects. </p>\",\n            \"smithy.api#required\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Optional configuration to replicate existing source bucket objects. </p>\\n         <note>\\n            <p>This parameter is no longer supported. To replicate existing objects, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-batch-replication-batch.html\\\">Replicating\\n          existing objects with S3 Batch Replication</a> in the\\n        <i>Amazon S3 User Guide</i>.</p>\\n         </note>\"\n      }\n    },\n    \"com.amazonaws.s3#ExistingObjectReplicationStatus\": {\n      \"type\": \"enum\",\n      \"members\": {\n        \"Enabled\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"Enabled\"\n          }\n        },\n        \"Disabled\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"Disabled\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#Expiration\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#ExpirationState\": {\n      \"type\": \"enum\",\n      \"members\": {\n        \"ENABLED\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"ENABLED\"\n          }\n        },\n        \"DISABLED\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"DISABLED\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#ExpirationStatus\": {\n      \"type\": \"enum\",\n      \"members\": {\n        \"Enabled\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"Enabled\"\n          }\n        },\n        \"Disabled\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"Disabled\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#ExpiredObjectDeleteMarker\": {\n      \"type\": \"boolean\"\n    },\n    \"com.amazonaws.s3#Expires\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#ExposeHeader\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#ExposeHeaders\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.s3#ExposeHeader\"\n      }\n    },\n    \"com.amazonaws.s3#Expression\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#ExpressionType\": {\n      \"type\": \"enum\",\n      \"members\": {\n        \"SQL\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"SQL\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#FetchOwner\": {\n      \"type\": \"boolean\"\n    },\n    \"com.amazonaws.s3#FieldDelimiter\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#FileHeaderInfo\": {\n      \"type\": \"enum\",\n      \"members\": {\n        \"USE\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"USE\"\n          }\n        },\n        \"IGNORE\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"IGNORE\"\n          }\n        },\n        \"NONE\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"NONE\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#FilterRule\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Name\": {\n          \"target\": \"com.amazonaws.s3#FilterRuleName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The object key name prefix or suffix identifying one or more objects to which the filtering rule\\n      applies. The maximum length is 1,024 characters. Overlapping prefixes and suffixes are not supported.\\n      For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/NotificationHowTo.html\\\">Configuring Event Notifications</a> in the <i>Amazon S3 User Guide</i>.</p>\"\n          }\n        },\n        \"Value\": {\n          \"target\": \"com.amazonaws.s3#FilterRuleValue\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The value that the filter searches for in object key names.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Specifies the Amazon S3 object key name to filter on. An object key name is the name assigned to an\\n      object in your Amazon S3 bucket. You specify whether to filter on the suffix or prefix of the object key\\n      name. A prefix is a specific string of characters at the beginning of an object key name, which you can\\n      use to organize objects. For example, you can start the key names of related objects with a prefix, such\\n      as <code>2023-</code> or <code>engineering/</code>. Then, you can use <code>FilterRule</code> to find\\n      objects in a bucket with key names that have the same prefix. A suffix is similar to a prefix, but it is\\n      at the end of the object key name instead of at the beginning.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#FilterRuleList\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.s3#FilterRule\"\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>A list of containers for the key-value pair that defines the criteria for the filter rule.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#FilterRuleName\": {\n      \"type\": \"enum\",\n      \"members\": {\n        \"prefix\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"prefix\"\n          }\n        },\n        \"suffix\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"suffix\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#FilterRuleValue\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#GetBucketAbac\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#GetBucketAbacRequest\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.s3#GetBucketAbacOutput\"\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Returns the attribute-based access control (ABAC) property of the general purpose bucket. If ABAC is enabled on your bucket, you can use tags on the bucket for access control. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/buckets-tagging-enable-abac.html\\\">Enabling ABAC in general purpose buckets</a>.</p>\",\n        \"smithy.api#http\": {\n          \"method\": \"GET\",\n          \"uri\": \"/{Bucket}?abac\",\n          \"code\": 200\n        }\n      }\n    },\n    \"com.amazonaws.s3#GetBucketAbacOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"AbacStatus\": {\n          \"target\": \"com.amazonaws.s3#AbacStatus\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The ABAC status of the general purpose bucket. </p>\",\n            \"smithy.api#httpPayload\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#output\": {}\n      }\n    },\n    \"com.amazonaws.s3#GetBucketAbacRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the general purpose bucket.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID of the general purpose bucket's owner. </p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#GetBucketAccelerateConfiguration\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#GetBucketAccelerateConfigurationRequest\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.s3#GetBucketAccelerateConfigurationOutput\"\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported for directory buckets.</p>\\n         </note>\\n         <p>This implementation of the GET action uses the <code>accelerate</code> subresource to return the\\n      Transfer Acceleration state of a bucket, which is either <code>Enabled</code> or <code>Suspended</code>.\\n      Amazon S3 Transfer Acceleration is a bucket-level feature that enables you to perform faster data transfers\\n      to and from Amazon S3.</p>\\n         <p>To use this operation, you must have permission to perform the\\n        <code>s3:GetAccelerateConfiguration</code> action. The bucket owner has this permission by default.\\n      The bucket owner can grant this permission to others. For more information about permissions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-with-s3-actions.html#using-with-s3-actions-related-to-bucket-subresources\\\">Permissions Related to Bucket Subresource Operations</a> and <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html\\\">Managing Access Permissions to your Amazon S3\\n        Resources</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <p>You set the Transfer Acceleration state of an existing bucket to <code>Enabled</code> or\\n        <code>Suspended</code> by using the <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketAccelerateConfiguration.html\\\">PutBucketAccelerateConfiguration</a> operation. </p>\\n         <p>A GET <code>accelerate</code> request does not return a state value for a bucket that has no\\n      transfer acceleration state. A bucket has no Transfer Acceleration state if a state has never been set\\n      on the bucket. </p>\\n         <p>For more information about transfer acceleration, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/transfer-acceleration.html\\\">Transfer Acceleration</a> in the\\n      Amazon S3 User Guide.</p>\\n         <p>The following operations are related to <code>GetBucketAccelerateConfiguration</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketAccelerateConfiguration.html\\\">PutBucketAccelerateConfiguration</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#http\": {\n          \"method\": \"GET\",\n          \"uri\": \"/{Bucket}?accelerate\",\n          \"code\": 200\n        },\n        \"smithy.rules#staticContextParams\": {\n          \"UseS3ExpressControlEndpoint\": {\n            \"value\": true\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#GetBucketAccelerateConfigurationOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Status\": {\n          \"target\": \"com.amazonaws.s3#BucketAccelerateStatus\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The accelerate configuration of the bucket.</p>\"\n          }\n        },\n        \"RequestCharged\": {\n          \"target\": \"com.amazonaws.s3#RequestCharged\",\n          \"traits\": {\n            \"smithy.api#httpHeader\": \"x-amz-request-charged\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#output\": {},\n        \"smithy.api#xmlName\": \"AccelerateConfiguration\"\n      }\n    },\n    \"com.amazonaws.s3#GetBucketAccelerateConfigurationRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the bucket for which the accelerate configuration is retrieved.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        },\n        \"RequestPayer\": {\n          \"target\": \"com.amazonaws.s3#RequestPayer\",\n          \"traits\": {\n            \"smithy.api#httpHeader\": \"x-amz-request-payer\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#GetBucketAcl\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#GetBucketAclRequest\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.s3#GetBucketAclOutput\"\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported for directory buckets.</p>\\n         </note>\\n         <p>This implementation of the <code>GET</code> action uses the <code>acl</code> subresource to return\\n      the access control list (ACL) of a bucket. To use <code>GET</code> to return the ACL of the bucket, you\\n      must have the <code>READ_ACP</code> access to the bucket. If <code>READ_ACP</code> permission is granted\\n      to the anonymous user, you can return the ACL of the bucket without using an authorization\\n      header.</p>\\n         <p>When you use this API operation with an access point, provide the alias of the access point in place of the bucket name.</p>\\n         <p>When you use this API operation with an Object Lambda access point, provide the alias of the Object Lambda access point in place of the bucket name. \\nIf the Object Lambda access point alias in a request is not valid, the error code <code>InvalidAccessPointAliasError</code> is returned. \\nFor more information about <code>InvalidAccessPointAliasError</code>, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html#ErrorCodeList\\\">List of\\n            Error Codes</a>.</p>\\n         <note>\\n            <p>If your bucket uses the bucket owner enforced setting for S3 Object Ownership, requests to read\\n        ACLs are still supported and return the <code>bucket-owner-full-control</code> ACL with the owner\\n        being the account that created the bucket. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/about-object-ownership.html\\\"> Controlling object ownership and\\n          disabling ACLs</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         </note>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\\n         <p>The following operations are related to <code>GetBucketAcl</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjects.html\\\">ListObjects</a>\\n               </p>\\n            </li>\\n         </ul>\",\n        \"smithy.api#http\": {\n          \"method\": \"GET\",\n          \"uri\": \"/{Bucket}?acl\",\n          \"code\": 200\n        },\n        \"smithy.rules#staticContextParams\": {\n          \"UseS3ExpressControlEndpoint\": {\n            \"value\": true\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#GetBucketAclOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Owner\": {\n          \"target\": \"com.amazonaws.s3#Owner\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Container for the bucket owner's ID.</p>\"\n          }\n        },\n        \"Grants\": {\n          \"target\": \"com.amazonaws.s3#Grants\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A list of grants.</p>\",\n            \"smithy.api#xmlName\": \"AccessControlList\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#output\": {},\n        \"smithy.api#xmlName\": \"AccessControlPolicy\"\n      }\n    },\n    \"com.amazonaws.s3#GetBucketAclRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the S3 bucket whose ACL is being requested.</p>\\n         <p>When you use this API operation with an access point, provide the alias of the access point in place of the bucket name.</p>\\n         <p>When you use this API operation with an Object Lambda access point, provide the alias of the Object Lambda access point in place of the bucket name. \\nIf the Object Lambda access point alias in a request is not valid, the error code <code>InvalidAccessPointAliasError</code> is returned. \\nFor more information about <code>InvalidAccessPointAliasError</code>, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html#ErrorCodeList\\\">List of\\n            Error Codes</a>.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#GetBucketAnalyticsConfiguration\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#GetBucketAnalyticsConfigurationRequest\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.s3#GetBucketAnalyticsConfigurationOutput\"\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported for directory buckets.</p>\\n         </note>\\n         <p>This implementation of the GET action returns an analytics configuration (identified by the\\n      analytics configuration ID) from the bucket.</p>\\n         <p>To use this operation, you must have permissions to perform the\\n        <code>s3:GetAnalyticsConfiguration</code> action. The bucket owner has this permission by default. The\\n      bucket owner can grant this permission to others. For more information about permissions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-with-s3-actions.html#using-with-s3-actions-related-to-bucket-subresources\\\"> Permissions Related to Bucket Subresource Operations</a> and <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html\\\">Managing Access Permissions to Your Amazon S3\\n        Resources</a> in the <i>Amazon S3 User Guide</i>. </p>\\n         <p>For information about Amazon S3 analytics feature, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/analytics-storage-class.html\\\">Amazon S3 Analytics – Storage Class Analysis</a>\\n      in the <i>Amazon S3 User Guide</i>.</p>\\n         <p>The following operations are related to <code>GetBucketAnalyticsConfiguration</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketAnalyticsConfiguration.html\\\">DeleteBucketAnalyticsConfiguration</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListBucketAnalyticsConfigurations.html\\\">ListBucketAnalyticsConfigurations</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketAnalyticsConfiguration.html\\\">PutBucketAnalyticsConfiguration</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#http\": {\n          \"method\": \"GET\",\n          \"uri\": \"/{Bucket}?analytics&x-id=GetBucketAnalyticsConfiguration\",\n          \"code\": 200\n        },\n        \"smithy.rules#staticContextParams\": {\n          \"UseS3ExpressControlEndpoint\": {\n            \"value\": true\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#GetBucketAnalyticsConfigurationOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"AnalyticsConfiguration\": {\n          \"target\": \"com.amazonaws.s3#AnalyticsConfiguration\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The configuration and any analyses for the analytics filter.</p>\",\n            \"smithy.api#httpPayload\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#output\": {}\n      }\n    },\n    \"com.amazonaws.s3#GetBucketAnalyticsConfigurationRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the bucket from which an analytics configuration is retrieved.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"Id\": {\n          \"target\": \"com.amazonaws.s3#AnalyticsId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The ID that identifies the analytics configuration.</p>\",\n            \"smithy.api#httpQuery\": \"id\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#GetBucketCors\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#GetBucketCorsRequest\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.s3#GetBucketCorsOutput\"\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported for directory buckets.</p>\\n         </note>\\n         <p>Returns the Cross-Origin Resource Sharing (CORS) configuration information set for the\\n      bucket.</p>\\n         <p> To use this operation, you must have permission to perform the <code>s3:GetBucketCORS</code>\\n      action. By default, the bucket owner has this permission and can grant it to others.</p>\\n         <p>When you use this API operation with an access point, provide the alias of the access point in place of the bucket name.</p>\\n         <p>When you use this API operation with an Object Lambda access point, provide the alias of the Object Lambda access point in place of the bucket name. \\nIf the Object Lambda access point alias in a request is not valid, the error code <code>InvalidAccessPointAliasError</code> is returned. \\nFor more information about <code>InvalidAccessPointAliasError</code>, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html#ErrorCodeList\\\">List of\\n            Error Codes</a>.</p>\\n         <p> For more information about CORS, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/cors.html\\\"> Enabling Cross-Origin Resource Sharing</a>.</p>\\n         <p>The following operations are related to <code>GetBucketCors</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketCors.html\\\">PutBucketCors</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketCors.html\\\">DeleteBucketCors</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#examples\": [\n          {\n            \"title\": \"To get cors configuration set on a bucket\",\n            \"documentation\": \"The following example returns cross-origin resource sharing (CORS) configuration set on a bucket.\",\n            \"input\": {\n              \"Bucket\": \"examplebucket\"\n            },\n            \"output\": {\n              \"CORSRules\": [\n                {\n                  \"AllowedHeaders\": [\"Authorization\"],\n                  \"MaxAgeSeconds\": 3000,\n                  \"AllowedMethods\": [\"GET\"],\n                  \"AllowedOrigins\": [\"*\"]\n                }\n              ]\n            }\n          }\n        ],\n        \"smithy.api#http\": {\n          \"method\": \"GET\",\n          \"uri\": \"/{Bucket}?cors\",\n          \"code\": 200\n        },\n        \"smithy.rules#staticContextParams\": {\n          \"UseS3ExpressControlEndpoint\": {\n            \"value\": true\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#GetBucketCorsOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"CORSRules\": {\n          \"target\": \"com.amazonaws.s3#CORSRules\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A set of origins and methods (cross-origin access that you want to allow). You can add up to 100\\n      rules to the configuration.</p>\",\n            \"smithy.api#xmlFlattened\": {},\n            \"smithy.api#xmlName\": \"CORSRule\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#output\": {},\n        \"smithy.api#xmlName\": \"CORSConfiguration\"\n      }\n    },\n    \"com.amazonaws.s3#GetBucketCorsRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The bucket name for which to get the cors configuration.</p>\\n         <p>When you use this API operation with an access point, provide the alias of the access point in place of the bucket name.</p>\\n         <p>When you use this API operation with an Object Lambda access point, provide the alias of the Object Lambda access point in place of the bucket name. \\nIf the Object Lambda access point alias in a request is not valid, the error code <code>InvalidAccessPointAliasError</code> is returned. \\nFor more information about <code>InvalidAccessPointAliasError</code>, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html#ErrorCodeList\\\">List of\\n            Error Codes</a>.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#GetBucketEncryption\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#GetBucketEncryptionRequest\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.s3#GetBucketEncryptionOutput\"\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Returns the default encryption configuration for an Amazon S3 bucket. By default, all buckets have a\\n      default encryption configuration that uses server-side encryption with Amazon S3 managed keys (SSE-S3). This operation also returns the <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_ServerSideEncryptionRule.html#AmazonS3-Type-ServerSideEncryptionRule-BucketKeyEnabled\\\">BucketKeyEnabled</a> and <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_ServerSideEncryptionRule.html#AmazonS3-Type-ServerSideEncryptionRule-BlockedEncryptionTypes\\\">BlockedEncryptionTypes</a> statuses. </p>\\n         <note>\\n            <ul>\\n               <li>\\n                  <p>\\n                     <b>General purpose buckets</b> - For information about the bucket\\n            default encryption feature, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucket-encryption.html\\\">Amazon S3 Bucket Default Encryption</a> in the\\n              <i>Amazon S3 User Guide</i>.</p>\\n               </li>\\n               <li>\\n                  <p>\\n                     <b>Directory buckets</b> -\\n            For directory buckets, there are only two supported options for server-side encryption: SSE-S3 and SSE-KMS. For information about the default encryption configuration in\\n            directory buckets, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-bucket-encryption.html\\\">Setting default server-side\\n              encryption behavior for directory buckets</a>.</p>\\n               </li>\\n            </ul>\\n         </note>\\n         <dl>\\n            <dt>Permissions</dt>\\n            <dd>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <b>General purpose bucket permissions</b> - The\\n                  <code>s3:GetEncryptionConfiguration</code> permission is required in a policy. The bucket\\n                owner has this permission by default. The bucket owner can grant this permission to others.\\n                For more information about permissions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-with-s3-actions.html#using-with-s3-actions-related-to-bucket-subresources\\\">Permissions Related to Bucket Operations</a> and <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html\\\">Managing Access Permissions to Your\\n                  Amazon S3 Resources</a>.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <b>Directory bucket permissions</b> - To grant access to\\n                this API operation, you must have the <code>s3express:GetEncryptionConfiguration</code>\\n                permission in an IAM identity-based policy instead of a bucket policy. Cross-account access to this API operation isn't supported. This operation can only be performed by the Amazon Web Services account that owns the resource.\\n                For more information about directory bucket policies and permissions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-security-iam.html\\\">Amazon Web Services Identity and Access Management (IAM) for S3 Express One Zone</a> in the <i>Amazon S3 User Guide</i>.</p>\\n                  </li>\\n               </ul>\\n            </dd>\\n            <dt>HTTP Host header syntax</dt>\\n            <dd>\\n               <p>\\n                  <b>Directory buckets </b> - The HTTP Host header syntax is <code>s3express-control.<i>region-code</i>.amazonaws.com</code>.</p>\\n            </dd>\\n         </dl>\\n         <p>The following operations are related to <code>GetBucketEncryption</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketEncryption.html\\\">PutBucketEncryption</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketEncryption.html\\\">DeleteBucketEncryption</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#http\": {\n          \"method\": \"GET\",\n          \"uri\": \"/{Bucket}?encryption\",\n          \"code\": 200\n        },\n        \"smithy.rules#staticContextParams\": {\n          \"UseS3ExpressControlEndpoint\": {\n            \"value\": true\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#GetBucketEncryptionOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"ServerSideEncryptionConfiguration\": {\n          \"target\": \"com.amazonaws.s3#ServerSideEncryptionConfiguration\",\n          \"traits\": {\n            \"smithy.api#httpPayload\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#output\": {}\n      }\n    },\n    \"com.amazonaws.s3#GetBucketEncryptionRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the bucket from which the server-side encryption configuration is retrieved.</p>\\n         <p>\\n            <b>Directory buckets </b> - When you use this operation with a directory bucket, you must use path-style requests in the format <code>https://s3express-control.<i>region-code</i>.amazonaws.com/<i>bucket-name</i>\\n            </code>. Virtual-hosted-style requests aren't supported. Directory bucket names must be unique in the chosen Zone (Availability Zone or Local Zone). Bucket names must also follow the format <code>\\n               <i>bucket-base-name</i>--<i>zone-id</i>--x-s3</code> (for example, <code>\\n               <i>DOC-EXAMPLE-BUCKET</i>--<i>usw2-az1</i>--x-s3</code>). For information about bucket naming restrictions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-bucket-naming-rules.html\\\">Directory bucket naming rules</a> in the <i>Amazon S3 User Guide</i>\\n         </p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\\n         <note>\\n            <p>For directory buckets, this header is not supported in this API operation. If you specify this header, the request fails with the HTTP status code \\n<code>501 Not Implemented</code>.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#GetBucketIntelligentTieringConfiguration\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#GetBucketIntelligentTieringConfigurationRequest\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.s3#GetBucketIntelligentTieringConfigurationOutput\"\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported for directory buckets.</p>\\n         </note>\\n         <p>Gets the S3 Intelligent-Tiering configuration from the specified bucket.</p>\\n         <p>The S3 Intelligent-Tiering storage class is designed to optimize storage costs by automatically moving data to the most cost-effective storage access tier, without performance impact or operational overhead. S3 Intelligent-Tiering delivers automatic cost savings in three low latency and high throughput access tiers. To get the lowest storage cost on data that can be accessed in minutes to hours, you can choose to activate additional archiving capabilities.</p>\\n         <p>The S3 Intelligent-Tiering storage class is  the ideal storage class for data with unknown, changing, or unpredictable access patterns, independent of object size or retention period. If the size of an object is less than 128 KB, it is not monitored and not eligible for auto-tiering. Smaller objects can be stored, but they are always charged at the Frequent Access tier rates in the S3 Intelligent-Tiering storage class.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/storage-class-intro.html#sc-dynamic-data-access\\\">Storage class for automatically optimizing frequently and infrequently accessed objects</a>.</p>\\n         <p>Operations related to <code>GetBucketIntelligentTieringConfiguration</code> include: </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketIntelligentTieringConfiguration.html\\\">DeleteBucketIntelligentTieringConfiguration</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketIntelligentTieringConfiguration.html\\\">PutBucketIntelligentTieringConfiguration</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListBucketIntelligentTieringConfigurations.html\\\">ListBucketIntelligentTieringConfigurations</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#http\": {\n          \"method\": \"GET\",\n          \"uri\": \"/{Bucket}?intelligent-tiering&x-id=GetBucketIntelligentTieringConfiguration\",\n          \"code\": 200\n        },\n        \"smithy.rules#staticContextParams\": {\n          \"UseS3ExpressControlEndpoint\": {\n            \"value\": true\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#GetBucketIntelligentTieringConfigurationOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"IntelligentTieringConfiguration\": {\n          \"target\": \"com.amazonaws.s3#IntelligentTieringConfiguration\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Container for S3 Intelligent-Tiering configuration.</p>\",\n            \"smithy.api#httpPayload\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#output\": {}\n      }\n    },\n    \"com.amazonaws.s3#GetBucketIntelligentTieringConfigurationRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the Amazon S3 bucket whose configuration you want to modify or retrieve.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"Id\": {\n          \"target\": \"com.amazonaws.s3#IntelligentTieringId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The ID used to identify the S3 Intelligent-Tiering configuration.</p>\",\n            \"smithy.api#httpQuery\": \"id\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#GetBucketInventoryConfiguration\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#GetBucketInventoryConfigurationRequest\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.s3#GetBucketInventoryConfigurationOutput\"\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported for directory buckets.</p>\\n         </note>\\n         <p>Returns an S3 Inventory configuration (identified by the inventory configuration ID) from the\\n      bucket.</p>\\n         <p>To use this operation, you must have permissions to perform the\\n        <code>s3:GetInventoryConfiguration</code> action. The bucket owner has this permission by default and\\n      can grant this permission to others. For more information about permissions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-with-s3-actions.html#using-with-s3-actions-related-to-bucket-subresources\\\">Permissions Related to Bucket Subresource Operations</a> and <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html\\\">Managing Access Permissions to Your Amazon S3\\n        Resources</a>.</p>\\n         <p>For information about the Amazon S3 inventory feature, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/storage-inventory.html\\\">Amazon S3 Inventory</a>.</p>\\n         <p>The following operations are related to <code>GetBucketInventoryConfiguration</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketInventoryConfiguration.html\\\">DeleteBucketInventoryConfiguration</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListBucketInventoryConfigurations.html\\\">ListBucketInventoryConfigurations</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketInventoryConfiguration.html\\\">PutBucketInventoryConfiguration</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#http\": {\n          \"method\": \"GET\",\n          \"uri\": \"/{Bucket}?inventory&x-id=GetBucketInventoryConfiguration\",\n          \"code\": 200\n        },\n        \"smithy.rules#staticContextParams\": {\n          \"UseS3ExpressControlEndpoint\": {\n            \"value\": true\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#GetBucketInventoryConfigurationOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"InventoryConfiguration\": {\n          \"target\": \"com.amazonaws.s3#InventoryConfiguration\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the inventory configuration.</p>\",\n            \"smithy.api#httpPayload\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#output\": {}\n      }\n    },\n    \"com.amazonaws.s3#GetBucketInventoryConfigurationRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the bucket containing the inventory configuration to retrieve.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"Id\": {\n          \"target\": \"com.amazonaws.s3#InventoryId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The ID used to identify the inventory configuration.</p>\",\n            \"smithy.api#httpQuery\": \"id\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#GetBucketLifecycleConfiguration\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#GetBucketLifecycleConfigurationRequest\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.s3#GetBucketLifecycleConfigurationOutput\"\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Returns the lifecycle configuration information set on the bucket. For information about lifecycle\\n      configuration, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/object-lifecycle-mgmt.html\\\">Object Lifecycle Management</a>.</p>\\n         <p>Bucket lifecycle configuration now supports specifying a lifecycle rule using an object key name\\n      prefix, one or more object tags, object size, or any combination of these. Accordingly, this section\\n      describes the latest API, which is compatible with the new functionality. The previous version of the\\n      API supported filtering based only on an object key name prefix, which is supported for general purpose\\n      buckets for backward compatibility. For the related API description, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketLifecycle.html\\\">GetBucketLifecycle</a>.</p>\\n         <note>\\n            <p>Lifecyle configurations for directory buckets only support expiring objects and cancelling\\n        multipart uploads. Expiring of versioned objects, transitions and tag filters are not\\n        supported.</p>\\n         </note>\\n         <dl>\\n            <dt>Permissions</dt>\\n            <dd>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <b>General purpose bucket permissions</b> - By default, all Amazon S3\\n                resources are private, including buckets, objects, and related subresources (for example,\\n                lifecycle configuration and website configuration). Only the resource owner (that is, the\\n                Amazon Web Services account that created it) can access the resource. The resource owner can optionally\\n                grant access permissions to others by writing an access policy. For this operation, a user\\n                must have the <code>s3:GetLifecycleConfiguration</code> permission.</p>\\n                     <p>For more information about permissions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html\\\">Managing Access Permissions to Your\\n                  Amazon S3 Resources</a>.</p>\\n                  </li>\\n               </ul>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <b>Directory bucket permissions</b> - You must have the\\n                  <code>s3express:GetLifecycleConfiguration</code> permission in an IAM identity-based policy\\n                to use this operation. Cross-account access to this API operation isn't supported. The\\n                resource owner can optionally grant access permissions to others by creating a role or user\\n                for them as long as they are within the same account as the owner and resource.</p>\\n                     <p>For more information about directory bucket policies and permissions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-security-iam.html\\\">Authorizing Regional endpoint APIs with IAM</a> in the <i>Amazon S3 User\\n                  Guide</i>.</p>\\n                     <note>\\n                        <p>\\n                           <b>Directory buckets </b> - For directory buckets, you must make requests for this API operation to the Regional endpoint. These endpoints support path-style requests in the format <code>https://s3express-control.<i>region-code</i>.amazonaws.com/<i>bucket-name</i>\\n                           </code>. Virtual-hosted-style requests aren't supported. \\nFor more information about endpoints in Availability Zones, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/endpoint-directory-buckets-AZ.html\\\">Regional and Zonal endpoints for directory buckets in Availability Zones</a> in the\\n    <i>Amazon S3 User Guide</i>. For more information about endpoints in Local Zones, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-lzs-for-directory-buckets.html\\\">Concepts for directory buckets in Local Zones</a> in the\\n    <i>Amazon S3 User Guide</i>.</p>\\n                     </note>\\n                  </li>\\n               </ul>\\n            </dd>\\n            <dt>HTTP Host header syntax</dt>\\n            <dd>\\n               <p>\\n                  <b>Directory buckets </b> - The HTTP Host header syntax is\\n                <code>s3express-control.<i>region</i>.amazonaws.com</code>.</p>\\n            </dd>\\n         </dl>\\n         <p>\\n            <code>GetBucketLifecycleConfiguration</code> has the following special error:</p>\\n         <ul>\\n            <li>\\n               <p>Error code: <code>NoSuchLifecycleConfiguration</code>\\n               </p>\\n               <ul>\\n                  <li>\\n                     <p>Description: The lifecycle configuration does not exist.</p>\\n                  </li>\\n                  <li>\\n                     <p>HTTP Status Code: 404 Not Found</p>\\n                  </li>\\n                  <li>\\n                     <p>SOAP Fault Code Prefix: Client</p>\\n                  </li>\\n               </ul>\\n            </li>\\n         </ul>\\n         <p>The following operations are related to <code>GetBucketLifecycleConfiguration</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketLifecycle.html\\\">GetBucketLifecycle</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketLifecycle.html\\\">PutBucketLifecycle</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketLifecycle.html\\\">DeleteBucketLifecycle</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#examples\": [\n          {\n            \"title\": \"To get lifecycle configuration on a bucket\",\n            \"documentation\": \"The following example retrieves lifecycle configuration on set on a bucket. \",\n            \"input\": {\n              \"Bucket\": \"examplebucket\"\n            },\n            \"output\": {\n              \"Rules\": [\n                {\n                  \"Prefix\": \"TaxDocs\",\n                  \"Status\": \"Enabled\",\n                  \"Transitions\": [\n                    {\n                      \"Days\": 365,\n                      \"StorageClass\": \"STANDARD_IA\"\n                    }\n                  ],\n                  \"ID\": \"Rule for TaxDocs/\"\n                }\n              ]\n            }\n          }\n        ],\n        \"smithy.api#http\": {\n          \"method\": \"GET\",\n          \"uri\": \"/{Bucket}?lifecycle\",\n          \"code\": 200\n        },\n        \"smithy.rules#staticContextParams\": {\n          \"UseS3ExpressControlEndpoint\": {\n            \"value\": true\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#GetBucketLifecycleConfigurationOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Rules\": {\n          \"target\": \"com.amazonaws.s3#LifecycleRules\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Container for a lifecycle rule.</p>\",\n            \"smithy.api#xmlFlattened\": {},\n            \"smithy.api#xmlName\": \"Rule\"\n          }\n        },\n        \"TransitionDefaultMinimumObjectSize\": {\n          \"target\": \"com.amazonaws.s3#TransitionDefaultMinimumObjectSize\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Indicates which default minimum object size behavior is applied to the lifecycle\\n      configuration.</p>\\n         <note>\\n            <p>This parameter applies to general purpose buckets only. It isn't supported for directory bucket\\n        lifecycle configurations.</p>\\n         </note>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>all_storage_classes_128K</code> - Objects smaller than 128 KB will not transition to\\n          any storage class by default.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>varies_by_storage_class</code> - Objects smaller than 128 KB will transition to Glacier\\n          Flexible Retrieval or Glacier Deep Archive storage classes. By default, all other storage classes\\n          will prevent transitions smaller than 128 KB. </p>\\n            </li>\\n         </ul>\\n         <p>To customize the minimum object size for any transition you can add a filter that specifies a custom\\n        <code>ObjectSizeGreaterThan</code> or <code>ObjectSizeLessThan</code> in the body of your transition\\n      rule. Custom filters always take precedence over the default transition behavior.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-transition-default-minimum-object-size\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#output\": {},\n        \"smithy.api#xmlName\": \"LifecycleConfiguration\"\n      }\n    },\n    \"com.amazonaws.s3#GetBucketLifecycleConfigurationRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the bucket for which to get the lifecycle information.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\\n         <note>\\n            <p>This parameter applies to general purpose buckets only. It is not supported for directory bucket\\n        lifecycle configurations.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#GetBucketLocation\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#GetBucketLocationRequest\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.s3#GetBucketLocationOutput\"\n      },\n      \"traits\": {\n        \"aws.customizations#s3UnwrappedXmlOutput\": {},\n        \"smithy.api#documentation\": \"<important>\\n            <p>Using the <code>GetBucketLocation</code> operation is no longer a best practice. To return the \\n        Region that a bucket resides in, we recommend that you use the \\n        <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_HeadBucket.html\\\">HeadBucket</a> \\n        operation instead. For backward compatibility, Amazon S3 continues to support the \\n        <code>GetBucketLocation</code> operation.</p>\\n         </important>\\n         <p>Returns the Region the bucket resides in. You set the bucket's Region using the\\n        <code>LocationConstraint</code> request parameter in a <code>CreateBucket</code> request. For more\\n      information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateBucket.html\\\">CreateBucket</a>.</p>\\n         <note>\\n            <p>In a bucket's home Region, calls to the <code>GetBucketLocation</code> operation are governed \\n        by the bucket's policy. In other Regions, the bucket policy doesn't apply, which means that \\n        cross-account access won't be authorized. However, calls to the <code>HeadBucket</code> operation \\n        always return the bucket’s location through an HTTP response header, whether access to the bucket \\n        is authorized or not. Therefore, we recommend using the <code>HeadBucket</code> operation for \\n        bucket Region discovery and to avoid using the <code>GetBucketLocation</code> operation.</p>\\n         </note>\\n         <p>When you use this API operation with an access point, provide the alias of the access point in place of the bucket name.</p>\\n         <p>When you use this API operation with an Object Lambda access point, provide the alias of the Object Lambda access point in place of the bucket name. \\nIf the Object Lambda access point alias in a request is not valid, the error code <code>InvalidAccessPointAliasError</code> is returned. \\nFor more information about <code>InvalidAccessPointAliasError</code>, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html#ErrorCodeList\\\">List of\\n            Error Codes</a>.</p>\\n         <note>\\n            <p>This operation is not supported for directory buckets.</p>\\n         </note>\\n         <p>The following operations are related to <code>GetBucketLocation</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html\\\">GetObject</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateBucket.html\\\">CreateBucket</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#examples\": [\n          {\n            \"title\": \"To get bucket location\",\n            \"documentation\": \"The following example returns bucket location.\",\n            \"input\": {\n              \"Bucket\": \"examplebucket\"\n            },\n            \"output\": {\n              \"LocationConstraint\": \"us-west-2\"\n            }\n          }\n        ],\n        \"smithy.api#http\": {\n          \"method\": \"GET\",\n          \"uri\": \"/{Bucket}?location\",\n          \"code\": 200\n        },\n        \"smithy.rules#staticContextParams\": {\n          \"UseS3ExpressControlEndpoint\": {\n            \"value\": true\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#GetBucketLocationOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"LocationConstraint\": {\n          \"target\": \"com.amazonaws.s3#BucketLocationConstraint\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the Region where the bucket resides. For a list of all the Amazon S3 supported location\\n      constraints by Region, see <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region\\\">Regions and Endpoints</a>.</p>\\n         <p>Buckets in Region <code>us-east-1</code> have a LocationConstraint of <code>null</code>. Buckets\\n      with a LocationConstraint of <code>EU</code> reside in <code>eu-west-1</code>.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#output\": {},\n        \"smithy.api#xmlName\": \"LocationConstraint\"\n      }\n    },\n    \"com.amazonaws.s3#GetBucketLocationRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the bucket for which to get the location.</p>\\n         <p>When you use this API operation with an access point, provide the alias of the access point in place of the bucket name.</p>\\n         <p>When you use this API operation with an Object Lambda access point, provide the alias of the Object Lambda access point in place of the bucket name. \\nIf the Object Lambda access point alias in a request is not valid, the error code <code>InvalidAccessPointAliasError</code> is returned. \\nFor more information about <code>InvalidAccessPointAliasError</code>, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html#ErrorCodeList\\\">List of\\n            Error Codes</a>.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#GetBucketLogging\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#GetBucketLoggingRequest\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.s3#GetBucketLoggingOutput\"\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported for directory buckets.</p>\\n         </note>\\n         <p>Returns the logging status of a bucket and the permissions users have to view and modify that\\n      status.</p>\\n         <p>The following operations are related to <code>GetBucketLogging</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateBucket.html\\\">CreateBucket</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketLogging.html\\\">PutBucketLogging</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#http\": {\n          \"method\": \"GET\",\n          \"uri\": \"/{Bucket}?logging\",\n          \"code\": 200\n        },\n        \"smithy.rules#staticContextParams\": {\n          \"UseS3ExpressControlEndpoint\": {\n            \"value\": true\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#GetBucketLoggingOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"LoggingEnabled\": {\n          \"target\": \"com.amazonaws.s3#LoggingEnabled\"\n        }\n      },\n      \"traits\": {\n        \"smithy.api#output\": {},\n        \"smithy.api#xmlName\": \"BucketLoggingStatus\"\n      }\n    },\n    \"com.amazonaws.s3#GetBucketLoggingRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The bucket name for which to get the logging information.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#GetBucketMetadataConfiguration\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#GetBucketMetadataConfigurationRequest\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.s3#GetBucketMetadataConfigurationOutput\"\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Retrieves the S3 Metadata configuration for a general purpose bucket. For more information, see\\n      <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/metadata-tables-overview.html\\\">Accelerating\\n        data discovery with S3 Metadata</a> in the <i>Amazon S3 User Guide</i>. </p>\\n         <note>\\n            <p>You can use the V2 <code>GetBucketMetadataConfiguration</code> API operation with V1 or V2 \\n            metadata configurations. However, if you try to use the V1 \\n            <code>GetBucketMetadataTableConfiguration</code> API operation with V2 configurations, you\\n            will receive an HTTP <code>405 Method Not Allowed</code> error.</p>\\n         </note>\\n         <dl>\\n            <dt>Permissions</dt>\\n            <dd>\\n               <p>To use this operation, you must have the <code>s3:GetBucketMetadataTableConfiguration</code>\\n            permission. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/metadata-tables-permissions.html\\\">Setting up permissions for\\n              configuring metadata tables</a> in the <i>Amazon S3 User Guide</i>. </p>\\n               <note>\\n                  <p>The IAM policy action name is the same for the V1 and V2 API operations.</p>\\n               </note>\\n            </dd>\\n         </dl>\\n         <p>The following operations are related to <code>GetBucketMetadataConfiguration</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateBucketMetadataConfiguration.html\\\">CreateBucketMetadataConfiguration</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketMetadataConfiguration.html\\\">DeleteBucketMetadataConfiguration</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_UpdateBucketMetadataInventoryTableConfiguration.html\\\">UpdateBucketMetadataInventoryTableConfiguration</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_UpdateBucketMetadataJournalTableConfiguration.html\\\">UpdateBucketMetadataJournalTableConfiguration</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#http\": {\n          \"method\": \"GET\",\n          \"uri\": \"/{Bucket}?metadataConfiguration\",\n          \"code\": 200\n        },\n        \"smithy.rules#staticContextParams\": {\n          \"UseS3ExpressControlEndpoint\": {\n            \"value\": true\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#GetBucketMetadataConfigurationOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"GetBucketMetadataConfigurationResult\": {\n          \"target\": \"com.amazonaws.s3#GetBucketMetadataConfigurationResult\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>\\n      The metadata configuration for the general purpose bucket.\\n    </p>\",\n            \"smithy.api#httpPayload\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#output\": {}\n      }\n    },\n    \"com.amazonaws.s3#GetBucketMetadataConfigurationRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>\\n      The general purpose bucket that corresponds to the metadata configuration that you want to\\n      retrieve.\\n    </p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>\\n      The expected owner of the general purpose bucket that you want to retrieve the metadata table\\n      configuration for.\\n    </p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#GetBucketMetadataConfigurationResult\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"MetadataConfigurationResult\": {\n          \"target\": \"com.amazonaws.s3#MetadataConfigurationResult\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>\\n      The metadata configuration for a general purpose bucket.\\n    </p>\",\n            \"smithy.api#required\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>\\n      The S3 Metadata configuration for a general purpose bucket.\\n    </p>\"\n      }\n    },\n    \"com.amazonaws.s3#GetBucketMetadataTableConfiguration\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#GetBucketMetadataTableConfigurationRequest\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.s3#GetBucketMetadataTableConfigurationOutput\"\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<important>\\n            <p>\\n        We recommend that you retrieve your S3 Metadata configurations by using the V2 \\n        <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketMetadataTableConfiguration.html\\\">GetBucketMetadataTableConfiguration</a> API operation. We no longer recommend using the V1 \\n        <code>GetBucketMetadataTableConfiguration</code> API operation.\\n      </p>\\n            <p>If you created your S3 Metadata configuration before July 15, 2025, we recommend that you delete \\n        and re-create your configuration by using <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateBucketMetadataConfiguration.html\\\">CreateBucketMetadataConfiguration</a> so that you can expire journal table records and create \\n        a live inventory table.</p>\\n         </important>\\n         <p> Retrieves the V1 S3 Metadata configuration for a general purpose bucket. For more information, see\\n        <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/metadata-tables-overview.html\\\">Accelerating\\n        data discovery with S3 Metadata</a> in the <i>Amazon S3 User Guide</i>. </p>\\n         <note>\\n            <p>You can use the V2 <code>GetBucketMetadataConfiguration</code> API operation with V1 or V2 \\n            metadata table configurations. However, if you try to use the V1 \\n            <code>GetBucketMetadataTableConfiguration</code> API operation with V2 configurations, you\\n            will receive an HTTP <code>405 Method Not Allowed</code> error.</p>\\n            <p>Make sure that you update your processes to use the new V2 API operations\\n            (<code>CreateBucketMetadataConfiguration</code>, <code>GetBucketMetadataConfiguration</code>, and\\n            <code>DeleteBucketMetadataConfiguration</code>) instead of the V1 API operations. </p>\\n         </note>\\n         <dl>\\n            <dt>Permissions</dt>\\n            <dd>\\n               <p>To use this operation, you must have the <code>s3:GetBucketMetadataTableConfiguration</code>\\n            permission. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/metadata-tables-permissions.html\\\">Setting up permissions for\\n              configuring metadata tables</a> in the <i>Amazon S3 User Guide</i>. </p>\\n            </dd>\\n         </dl>\\n         <p>The following operations are related to <code>GetBucketMetadataTableConfiguration</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateBucketMetadataTableConfiguration.html\\\">CreateBucketMetadataTableConfiguration</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketMetadataTableConfiguration.html\\\">DeleteBucketMetadataTableConfiguration</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#http\": {\n          \"method\": \"GET\",\n          \"uri\": \"/{Bucket}?metadataTable\",\n          \"code\": 200\n        },\n        \"smithy.rules#staticContextParams\": {\n          \"UseS3ExpressControlEndpoint\": {\n            \"value\": true\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#GetBucketMetadataTableConfigurationOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"GetBucketMetadataTableConfigurationResult\": {\n          \"target\": \"com.amazonaws.s3#GetBucketMetadataTableConfigurationResult\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p> The metadata table configuration for the general purpose bucket. </p>\",\n            \"smithy.api#httpPayload\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#output\": {}\n      }\n    },\n    \"com.amazonaws.s3#GetBucketMetadataTableConfigurationRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p> The general purpose bucket that corresponds to the metadata table configuration that you want to\\n      retrieve. </p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p> The expected owner of the general purpose bucket that you want to retrieve the metadata table\\n      configuration for. </p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#GetBucketMetadataTableConfigurationResult\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"MetadataTableConfigurationResult\": {\n          \"target\": \"com.amazonaws.s3#MetadataTableConfigurationResult\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p> The V1 S3 Metadata configuration for a general purpose bucket. </p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"Status\": {\n          \"target\": \"com.amazonaws.s3#MetadataTableStatus\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p> The status of the metadata table. The status values are: </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>CREATING</code> - The metadata table is in the process of being created in the specified\\n          table bucket.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ACTIVE</code> - The metadata table has been created successfully, and records are being\\n          delivered to the table. </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>FAILED</code> - Amazon S3 is unable to create the metadata table, or Amazon S3 is unable to deliver\\n          records. See <code>ErrorDetails</code> for details.</p>\\n            </li>\\n         </ul>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"Error\": {\n          \"target\": \"com.amazonaws.s3#ErrorDetails\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p> If the <code>CreateBucketMetadataTableConfiguration</code> request succeeds, but S3 Metadata was\\n      unable to create the table, this structure contains the error code and error message. </p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p> The V1 S3 Metadata configuration for a general purpose bucket. </p>\\n         <note>\\n            <p>If you created your S3 Metadata configuration before July 15, 2025, we recommend that you delete \\n        and re-create your configuration by using <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateBucketMetadataConfiguration.html\\\">CreateBucketMetadataConfiguration</a> so that you can expire journal table records and create \\n        a live inventory table.</p>\\n         </note>\"\n      }\n    },\n    \"com.amazonaws.s3#GetBucketMetricsConfiguration\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#GetBucketMetricsConfigurationRequest\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.s3#GetBucketMetricsConfigurationOutput\"\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported for directory buckets.</p>\\n         </note>\\n         <p>Gets a metrics configuration (specified by the metrics configuration ID) from the bucket. Note that\\n      this doesn't include the daily storage metrics.</p>\\n         <p> To use this operation, you must have permissions to perform the\\n        <code>s3:GetMetricsConfiguration</code> action. The bucket owner has this permission by default. The\\n      bucket owner can grant this permission to others. For more information about permissions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-with-s3-actions.html#using-with-s3-actions-related-to-bucket-subresources\\\">Permissions Related to Bucket Subresource Operations</a> and <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html\\\">Managing Access Permissions to Your Amazon S3\\n        Resources</a>.</p>\\n         <p> For information about CloudWatch request metrics for Amazon S3, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/cloudwatch-monitoring.html\\\">Monitoring Metrics with Amazon\\n      CloudWatch</a>.</p>\\n         <p>The following operations are related to <code>GetBucketMetricsConfiguration</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketMetricsConfiguration.html\\\">PutBucketMetricsConfiguration</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketMetricsConfiguration.html\\\">DeleteBucketMetricsConfiguration</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListBucketMetricsConfigurations.html\\\">ListBucketMetricsConfigurations</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/cloudwatch-monitoring.html\\\">Monitoring\\n            Metrics with Amazon CloudWatch</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#http\": {\n          \"method\": \"GET\",\n          \"uri\": \"/{Bucket}?metrics&x-id=GetBucketMetricsConfiguration\",\n          \"code\": 200\n        },\n        \"smithy.rules#staticContextParams\": {\n          \"UseS3ExpressControlEndpoint\": {\n            \"value\": true\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#GetBucketMetricsConfigurationOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"MetricsConfiguration\": {\n          \"target\": \"com.amazonaws.s3#MetricsConfiguration\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the metrics configuration.</p>\",\n            \"smithy.api#httpPayload\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#output\": {}\n      }\n    },\n    \"com.amazonaws.s3#GetBucketMetricsConfigurationRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the bucket containing the metrics configuration to retrieve.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"Id\": {\n          \"target\": \"com.amazonaws.s3#MetricsId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The ID used to identify the metrics configuration. The ID has a 64 character limit and can only\\n      contain letters, numbers, periods, dashes, and underscores.</p>\",\n            \"smithy.api#httpQuery\": \"id\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#GetBucketNotificationConfiguration\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#GetBucketNotificationConfigurationRequest\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.s3#NotificationConfiguration\"\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported for directory buckets.</p>\\n         </note>\\n         <p>Returns the notification configuration of a bucket.</p>\\n         <p>If notifications are not enabled on the bucket, the action returns an empty\\n        <code>NotificationConfiguration</code> element.</p>\\n         <p>By default, you must be the bucket owner to read the notification configuration of a bucket.\\n      However, the bucket owner can use a bucket policy to grant permission to other users to read this\\n      configuration with the <code>s3:GetBucketNotification</code> permission.</p>\\n         <p>When you use this API operation with an access point, provide the alias of the access point in place of the bucket name.</p>\\n         <p>When you use this API operation with an Object Lambda access point, provide the alias of the Object Lambda access point in place of the bucket name. \\nIf the Object Lambda access point alias in a request is not valid, the error code <code>InvalidAccessPointAliasError</code> is returned. \\nFor more information about <code>InvalidAccessPointAliasError</code>, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html#ErrorCodeList\\\">List of\\n            Error Codes</a>.</p>\\n         <p>For more information about setting and reading the notification configuration on a bucket, see\\n        <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/NotificationHowTo.html\\\">Setting Up Notification\\n        of Bucket Events</a>. For more information about bucket policies, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/using-iam-policies.html\\\">Using Bucket Policies</a>.</p>\\n         <p>The following action is related to <code>GetBucketNotification</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketNotification.html\\\">PutBucketNotification</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#http\": {\n          \"method\": \"GET\",\n          \"uri\": \"/{Bucket}?notification\",\n          \"code\": 200\n        },\n        \"smithy.rules#staticContextParams\": {\n          \"UseS3ExpressControlEndpoint\": {\n            \"value\": true\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#GetBucketNotificationConfigurationRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the bucket for which to get the notification configuration.</p>\\n         <p>When you use this API operation with an access point, provide the alias of the access point in place of the bucket name.</p>\\n         <p>When you use this API operation with an Object Lambda access point, provide the alias of the Object Lambda access point in place of the bucket name. \\nIf the Object Lambda access point alias in a request is not valid, the error code <code>InvalidAccessPointAliasError</code> is returned. \\nFor more information about <code>InvalidAccessPointAliasError</code>, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html#ErrorCodeList\\\">List of\\n            Error Codes</a>.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#GetBucketOwnershipControls\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#GetBucketOwnershipControlsRequest\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.s3#GetBucketOwnershipControlsOutput\"\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported for directory buckets.</p>\\n         </note>\\n         <p>Retrieves <code>OwnershipControls</code> for an Amazon S3 bucket. To use this operation, you must have\\n      the <code>s3:GetBucketOwnershipControls</code> permission. For more information about Amazon S3 permissions,\\n      see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-with-s3-actions.html\\\">Specifying\\n        permissions in a policy</a>. </p>\\n         <note>\\n            <p>A bucket doesn't have <code>OwnershipControls</code> settings in the following cases:</p>\\n            <ul>\\n               <li>\\n                  <p>The bucket was created before the <code>BucketOwnerEnforced</code> ownership setting was\\n            introduced and you've never explicitly applied this value</p>\\n               </li>\\n               <li>\\n                  <p>You've manually deleted the bucket ownership control value using the\\n              <code>DeleteBucketOwnershipControls</code> API operation.</p>\\n               </li>\\n            </ul>\\n            <p>By default, Amazon S3 sets <code>OwnershipControls</code> for all newly created buckets.</p>\\n         </note>\\n         <p>For information about Amazon S3 Object Ownership, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/about-object-ownership.html\\\">Using Object Ownership</a>. </p>\\n         <p>The following operations are related to <code>GetBucketOwnershipControls</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a>PutBucketOwnershipControls</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>DeleteBucketOwnershipControls</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#http\": {\n          \"method\": \"GET\",\n          \"uri\": \"/{Bucket}?ownershipControls\",\n          \"code\": 200\n        },\n        \"smithy.rules#staticContextParams\": {\n          \"UseS3ExpressControlEndpoint\": {\n            \"value\": true\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#GetBucketOwnershipControlsOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"OwnershipControls\": {\n          \"target\": \"com.amazonaws.s3#OwnershipControls\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The <code>OwnershipControls</code> (BucketOwnerEnforced, BucketOwnerPreferred, or ObjectWriter)\\n      currently in effect for this Amazon S3 bucket.</p>\",\n            \"smithy.api#httpPayload\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#output\": {}\n      }\n    },\n    \"com.amazonaws.s3#GetBucketOwnershipControlsRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the Amazon S3 bucket whose <code>OwnershipControls</code> you want to retrieve. </p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#GetBucketPolicy\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#GetBucketPolicyRequest\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.s3#GetBucketPolicyOutput\"\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Returns the policy of a specified bucket.</p>\\n         <note>\\n            <p>\\n               <b>Directory buckets </b> - For directory buckets, you must make requests for this API operation to the Regional endpoint. These endpoints support path-style requests in the format <code>https://s3express-control.<i>region-code</i>.amazonaws.com/<i>bucket-name</i>\\n               </code>. Virtual-hosted-style requests aren't supported. \\nFor more information about endpoints in Availability Zones, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/endpoint-directory-buckets-AZ.html\\\">Regional and Zonal endpoints for directory buckets in Availability Zones</a> in the\\n    <i>Amazon S3 User Guide</i>. For more information about endpoints in Local Zones, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-lzs-for-directory-buckets.html\\\">Concepts for directory buckets in Local Zones</a> in the\\n    <i>Amazon S3 User Guide</i>.</p>\\n         </note>\\n         <dl>\\n            <dt>Permissions</dt>\\n            <dd>\\n               <p>If you are using an identity other than the root user of the Amazon Web Services account that owns the\\n            bucket, the calling identity must both have the <code>GetBucketPolicy</code> permissions on the\\n            specified bucket and belong to the bucket owner's account in order to use this operation.</p>\\n               <p>If you don't have <code>GetBucketPolicy</code> permissions, Amazon S3 returns a <code>403 Access\\n              Denied</code> error. If you have the correct permissions, but you're not using an identity that\\n            belongs to the bucket owner's account, Amazon S3 returns a <code>405 Method Not Allowed</code>\\n            error.</p>\\n               <important>\\n                  <p>To ensure that bucket owners don't inadvertently lock themselves out of their own buckets,\\n              the root principal in a bucket owner's Amazon Web Services account can perform the\\n                <code>GetBucketPolicy</code>, <code>PutBucketPolicy</code>, and\\n                <code>DeleteBucketPolicy</code> API actions, even if their bucket policy explicitly denies the\\n              root principal's access. Bucket owner root principals can only be blocked from performing these\\n              API actions by VPC endpoint policies and Amazon Web Services Organizations policies.</p>\\n               </important>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <b>General purpose bucket permissions</b> - The\\n                  <code>s3:GetBucketPolicy</code> permission is required in a policy. For more information\\n                about general purpose buckets bucket policies, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/using-iam-policies.html\\\">Using Bucket Policies and User\\n                  Policies</a> in the <i>Amazon S3 User Guide</i>.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <b>Directory bucket permissions</b> - To grant access to\\n                this API operation, you must have the <code>s3express:GetBucketPolicy</code> permission in\\n                an IAM identity-based policy instead of a bucket policy. Cross-account access to this API operation isn't supported. This operation can only be performed by the Amazon Web Services account that owns the resource.\\n                For more information about directory bucket policies and permissions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-security-iam.html\\\">Amazon Web Services Identity and Access Management (IAM) for S3 Express One Zone</a> in the <i>Amazon S3 User Guide</i>.</p>\\n                  </li>\\n               </ul>\\n            </dd>\\n            <dt>Example bucket policies</dt>\\n            <dd>\\n               <p>\\n                  <b>General purpose buckets example bucket policies</b> - See <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-bucket-policies.html\\\">Bucket policy\\n              examples</a> in the <i>Amazon S3 User Guide</i>.</p>\\n               <p>\\n                  <b>Directory bucket example bucket policies</b> - See <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-security-iam-example-bucket-policies.html\\\">Example\\n              bucket policies for S3 Express One Zone</a> in the <i>Amazon S3 User Guide</i>.</p>\\n            </dd>\\n            <dt>HTTP Host header syntax</dt>\\n            <dd>\\n               <p>\\n                  <b>Directory buckets </b> - The HTTP Host header syntax is <code>s3express-control.<i>region-code</i>.amazonaws.com</code>.</p>\\n            </dd>\\n         </dl>\\n         <p>The following action is related to <code>GetBucketPolicy</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html\\\">GetObject</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#examples\": [\n          {\n            \"title\": \"To get bucket policy\",\n            \"documentation\": \"The following example returns bucket policy associated with a bucket.\",\n            \"input\": {\n              \"Bucket\": \"examplebucket\"\n            },\n            \"output\": {\n              \"Policy\": \"{\\\"Version\\\":\\\"2008-10-17\\\",&TCX5-2025-waiver;\\\"Id\\\":\\\"LogPolicy\\\",\\\"Statement\\\":[{\\\"Sid\\\":\\\"Enables the log delivery group to publish logs to your bucket \\\",\\\"Effect\\\":\\\"Allow\\\",\\\"Principal\\\":{\\\"AWS\\\":\\\"111122223333\\\"},\\\"Action\\\":[\\\"s3:GetBucketAcl\\\",\\\"s3:GetObjectAcl\\\",\\\"s3:PutObject\\\"],\\\"Resource\\\":[\\\"arn:aws:s3:::policytest1/*\\\",\\\"arn:aws:s3:::policytest1\\\"]}]}\"\n            }\n          }\n        ],\n        \"smithy.api#http\": {\n          \"method\": \"GET\",\n          \"uri\": \"/{Bucket}?policy\",\n          \"code\": 200\n        },\n        \"smithy.rules#staticContextParams\": {\n          \"UseS3ExpressControlEndpoint\": {\n            \"value\": true\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#GetBucketPolicyOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Policy\": {\n          \"target\": \"com.amazonaws.s3#Policy\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The bucket policy as a JSON document.</p>\",\n            \"smithy.api#httpPayload\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#output\": {}\n      }\n    },\n    \"com.amazonaws.s3#GetBucketPolicyRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The bucket name to get the bucket policy for.</p>\\n         <p>\\n            <b>Directory buckets </b> - When you use this operation with a directory bucket, you must use path-style requests in the format <code>https://s3express-control.<i>region-code</i>.amazonaws.com/<i>bucket-name</i>\\n            </code>. Virtual-hosted-style requests aren't supported. Directory bucket names must be unique in the chosen Zone (Availability Zone or Local Zone). Bucket names must also follow the format <code>\\n               <i>bucket-base-name</i>--<i>zone-id</i>--x-s3</code> (for example, <code>\\n               <i>DOC-EXAMPLE-BUCKET</i>--<i>usw2-az1</i>--x-s3</code>). For information about bucket naming restrictions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-bucket-naming-rules.html\\\">Directory bucket naming rules</a> in the <i>Amazon S3 User Guide</i>\\n         </p>\\n         <p>\\n            <b>Access points</b> - When you use this API operation with an access point, provide the alias of the access point in place of the bucket name.</p>\\n         <p>\\n            <b>Object Lambda access points</b> - When you use this API operation with an Object Lambda access point, provide the alias of the Object Lambda access point in place of the bucket name. \\nIf the Object Lambda access point alias in a request is not valid, the error code <code>InvalidAccessPointAliasError</code> is returned. \\nFor more information about <code>InvalidAccessPointAliasError</code>, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html#ErrorCodeList\\\">List of\\n            Error Codes</a>.</p>\\n         <note>\\n            <p>Object Lambda access points are not supported by directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\\n         <note>\\n            <p>For directory buckets, this header is not supported in this API operation. If you specify this header, the request fails with the HTTP status code \\n<code>501 Not Implemented</code>.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#GetBucketPolicyStatus\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#GetBucketPolicyStatusRequest\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.s3#GetBucketPolicyStatusOutput\"\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported for directory buckets.</p>\\n         </note>\\n         <p>Retrieves the policy status for an Amazon S3 bucket, indicating whether the bucket is public. In order to\\n      use this operation, you must have the <code>s3:GetBucketPolicyStatus</code> permission. For more\\n      information about Amazon S3 permissions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/using-with-s3-actions.html\\\">Specifying Permissions in a\\n      Policy</a>.</p>\\n         <p> For more information about when Amazon S3 considers a bucket public, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/access-control-block-public-access.html#access-control-block-public-access-policy-status\\\">The Meaning of \\\"Public\\\"</a>. </p>\\n         <p>The following operations are related to <code>GetBucketPolicyStatus</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/access-control-block-public-access.html\\\">Using Amazon S3 Block Public Access</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetPublicAccessBlock.html\\\">GetPublicAccessBlock</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutPublicAccessBlock.html\\\">PutPublicAccessBlock</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeletePublicAccessBlock.html\\\">DeletePublicAccessBlock</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#http\": {\n          \"method\": \"GET\",\n          \"uri\": \"/{Bucket}?policyStatus\",\n          \"code\": 200\n        },\n        \"smithy.rules#staticContextParams\": {\n          \"UseS3ExpressControlEndpoint\": {\n            \"value\": true\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#GetBucketPolicyStatusOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"PolicyStatus\": {\n          \"target\": \"com.amazonaws.s3#PolicyStatus\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The policy status for the specified bucket.</p>\",\n            \"smithy.api#httpPayload\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#output\": {}\n      }\n    },\n    \"com.amazonaws.s3#GetBucketPolicyStatusRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the Amazon S3 bucket whose policy status you want to retrieve.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#GetBucketReplication\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#GetBucketReplicationRequest\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.s3#GetBucketReplicationOutput\"\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported for directory buckets.</p>\\n         </note>\\n         <p>Returns the replication configuration of a bucket.</p>\\n         <note>\\n            <p> It can take a while to propagate the put or delete a replication configuration to all Amazon S3\\n        systems. Therefore, a get request soon after put or delete can return a wrong result. </p>\\n         </note>\\n         <p> For information about replication configuration, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/replication.html\\\">Replication</a> in the\\n        <i>Amazon S3 User Guide</i>.</p>\\n         <p>This action requires permissions for the <code>s3:GetReplicationConfiguration</code> action. For\\n      more information about permissions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/using-iam-policies.html\\\">Using Bucket Policies and User\\n      Policies</a>.</p>\\n         <p>If you include the <code>Filter</code> element in a replication configuration, you must also include\\n      the <code>DeleteMarkerReplication</code> and <code>Priority</code> elements. The response also returns\\n      those elements.</p>\\n         <p>For information about <code>GetBucketReplication</code> errors, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html#ReplicationErrorCodeList\\\">List of replication-related\\n        error codes</a>\\n         </p>\\n         <p>The following operations are related to <code>GetBucketReplication</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketReplication.html\\\">PutBucketReplication</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketReplication.html\\\">DeleteBucketReplication</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#examples\": [\n          {\n            \"title\": \"To get replication configuration set on a bucket\",\n            \"documentation\": \"The following example returns replication configuration set on a bucket.\",\n            \"input\": {\n              \"Bucket\": \"examplebucket\"\n            },\n            \"output\": {\n              \"ReplicationConfiguration\": {\n                \"Rules\": [\n                  {\n                    \"Status\": \"Enabled\",\n                    \"Prefix\": \"Tax\",\n                    \"Destination\": {\n                      \"Bucket\": \"arn:aws:s3:::destination-bucket\"\n                    },\n                    \"ID\": \"MWIwNTkwZmItMTE3MS00ZTc3LWJkZDEtNzRmODQwYzc1OTQy\"\n                  }\n                ],\n                \"Role\": \"arn:aws:iam::acct-id:role/example-role\"\n              }\n            }\n          }\n        ],\n        \"smithy.api#http\": {\n          \"method\": \"GET\",\n          \"uri\": \"/{Bucket}?replication\",\n          \"code\": 200\n        },\n        \"smithy.rules#staticContextParams\": {\n          \"UseS3ExpressControlEndpoint\": {\n            \"value\": true\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#GetBucketReplicationOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"ReplicationConfiguration\": {\n          \"target\": \"com.amazonaws.s3#ReplicationConfiguration\",\n          \"traits\": {\n            \"smithy.api#httpPayload\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#output\": {}\n      }\n    },\n    \"com.amazonaws.s3#GetBucketReplicationRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The bucket name for which to get the replication information.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#GetBucketRequestPayment\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#GetBucketRequestPaymentRequest\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.s3#GetBucketRequestPaymentOutput\"\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported for directory buckets.</p>\\n         </note>\\n         <p>Returns the request payment configuration of a bucket. To use this version of the operation, you\\n      must be the bucket owner. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/RequesterPaysBuckets.html\\\">Requester Pays Buckets</a>.</p>\\n         <p>The following operations are related to <code>GetBucketRequestPayment</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjects.html\\\">ListObjects</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#examples\": [\n          {\n            \"title\": \"To get bucket versioning configuration\",\n            \"documentation\": \"The following example retrieves bucket versioning configuration.\",\n            \"input\": {\n              \"Bucket\": \"examplebucket\"\n            },\n            \"output\": {\n              \"Payer\": \"BucketOwner\"\n            }\n          }\n        ],\n        \"smithy.api#http\": {\n          \"method\": \"GET\",\n          \"uri\": \"/{Bucket}?requestPayment\",\n          \"code\": 200\n        },\n        \"smithy.rules#staticContextParams\": {\n          \"UseS3ExpressControlEndpoint\": {\n            \"value\": true\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#GetBucketRequestPaymentOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Payer\": {\n          \"target\": \"com.amazonaws.s3#Payer\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies who pays for the download and request fees.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#output\": {},\n        \"smithy.api#xmlName\": \"RequestPaymentConfiguration\"\n      }\n    },\n    \"com.amazonaws.s3#GetBucketRequestPaymentRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the bucket for which to get the payment request configuration</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#GetBucketTagging\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#GetBucketTaggingRequest\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.s3#GetBucketTaggingOutput\"\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported for directory buckets.</p>\\n         </note>\\n         <p>Returns the tag set associated with the general purpose bucket.</p>\\n         <p>if ABAC is not enabled for the bucket. When you <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/buckets-tagging-enable-abac.html\\\">enable ABAC for a general purpose bucket</a>, you can no longer use this operation for that bucket and must use <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_ListTagsForResource.html\\\">ListTagsForResource</a> instead.</p>\\n         <p>To use this operation, you must have permission to perform the <code>s3:GetBucketTagging</code>\\n      action. By default, the bucket owner has this permission and can grant this permission to others.</p>\\n         <p>\\n            <code>GetBucketTagging</code> has the following special error:</p>\\n         <ul>\\n            <li>\\n               <p>Error code: <code>NoSuchTagSet</code>\\n               </p>\\n               <ul>\\n                  <li>\\n                     <p>Description: There is no tag set associated with the bucket.</p>\\n                  </li>\\n               </ul>\\n            </li>\\n         </ul>\\n         <p>The following operations are related to <code>GetBucketTagging</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketTagging.html\\\">PutBucketTagging</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketTagging.html\\\">DeleteBucketTagging</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#examples\": [\n          {\n            \"title\": \"To get tag set associated with a bucket\",\n            \"documentation\": \"The following example returns tag set associated with a bucket\",\n            \"input\": {\n              \"Bucket\": \"examplebucket\"\n            },\n            \"output\": {\n              \"TagSet\": [\n                {\n                  \"Value\": \"value1\",\n                  \"Key\": \"key1\"\n                },\n                {\n                  \"Value\": \"value2\",\n                  \"Key\": \"key2\"\n                }\n              ]\n            }\n          }\n        ],\n        \"smithy.api#http\": {\n          \"method\": \"GET\",\n          \"uri\": \"/{Bucket}?tagging\",\n          \"code\": 200\n        },\n        \"smithy.rules#staticContextParams\": {\n          \"UseS3ExpressControlEndpoint\": {\n            \"value\": true\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#GetBucketTaggingOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"TagSet\": {\n          \"target\": \"com.amazonaws.s3#TagSet\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Contains the tag set.</p>\",\n            \"smithy.api#required\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#output\": {},\n        \"smithy.api#xmlName\": \"Tagging\"\n      }\n    },\n    \"com.amazonaws.s3#GetBucketTaggingRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the bucket for which to get the tagging information.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#GetBucketVersioning\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#GetBucketVersioningRequest\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.s3#GetBucketVersioningOutput\"\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported for directory buckets.</p>\\n         </note>\\n         <p>Returns the versioning state of a bucket.</p>\\n         <p>To retrieve the versioning state of a bucket, you must be the bucket owner.</p>\\n         <p>This implementation also returns the MFA Delete status of the versioning state. If the MFA Delete\\n      status is <code>enabled</code>, the bucket owner must use an authentication device to change the\\n      versioning state of the bucket.</p>\\n         <p>The following operations are related to <code>GetBucketVersioning</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html\\\">GetObject</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html\\\">PutObject</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObject.html\\\">DeleteObject</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#examples\": [\n          {\n            \"title\": \"To get bucket versioning configuration\",\n            \"documentation\": \"The following example retrieves bucket versioning configuration.\",\n            \"input\": {\n              \"Bucket\": \"examplebucket\"\n            },\n            \"output\": {\n              \"Status\": \"Enabled\",\n              \"MFADelete\": \"Disabled\"\n            }\n          }\n        ],\n        \"smithy.api#http\": {\n          \"method\": \"GET\",\n          \"uri\": \"/{Bucket}?versioning\",\n          \"code\": 200\n        },\n        \"smithy.rules#staticContextParams\": {\n          \"UseS3ExpressControlEndpoint\": {\n            \"value\": true\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#GetBucketVersioningOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Status\": {\n          \"target\": \"com.amazonaws.s3#BucketVersioningStatus\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The versioning state of the bucket.</p>\"\n          }\n        },\n        \"MFADelete\": {\n          \"target\": \"com.amazonaws.s3#MFADeleteStatus\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies whether MFA delete is enabled in the bucket versioning configuration. This element is only\\n      returned if the bucket has been configured with MFA delete. If the bucket has never been so configured,\\n      this element is not returned.</p>\",\n            \"smithy.api#xmlName\": \"MfaDelete\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#output\": {},\n        \"smithy.api#xmlName\": \"VersioningConfiguration\"\n      }\n    },\n    \"com.amazonaws.s3#GetBucketVersioningRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the bucket for which to get the versioning information.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#GetBucketWebsite\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#GetBucketWebsiteRequest\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.s3#GetBucketWebsiteOutput\"\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported for directory buckets.</p>\\n         </note>\\n         <p>Returns the website configuration for a bucket. To host website on Amazon S3, you can configure a bucket\\n      as website by adding a website configuration. For more information about hosting websites, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/WebsiteHosting.html\\\">Hosting Websites on Amazon S3</a>. </p>\\n         <p>This GET action requires the <code>S3:GetBucketWebsite</code> permission. By default, only the\\n      bucket owner can read the bucket website configuration. However, bucket owners can allow other users to\\n      read the website configuration by writing a bucket policy granting them the\\n        <code>S3:GetBucketWebsite</code> permission.</p>\\n         <p>The following operations are related to <code>GetBucketWebsite</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketWebsite.html\\\">DeleteBucketWebsite</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketWebsite.html\\\">PutBucketWebsite</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#examples\": [\n          {\n            \"title\": \"To get bucket website configuration\",\n            \"documentation\": \"The following example retrieves website configuration of a bucket.\",\n            \"input\": {\n              \"Bucket\": \"examplebucket\"\n            },\n            \"output\": {\n              \"IndexDocument\": {\n                \"Suffix\": \"index.html\"\n              },\n              \"ErrorDocument\": {\n                \"Key\": \"error.html\"\n              }\n            }\n          }\n        ],\n        \"smithy.api#http\": {\n          \"method\": \"GET\",\n          \"uri\": \"/{Bucket}?website\",\n          \"code\": 200\n        },\n        \"smithy.rules#staticContextParams\": {\n          \"UseS3ExpressControlEndpoint\": {\n            \"value\": true\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#GetBucketWebsiteOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"RedirectAllRequestsTo\": {\n          \"target\": \"com.amazonaws.s3#RedirectAllRequestsTo\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the redirect behavior of all requests to a website endpoint of an Amazon S3 bucket.</p>\"\n          }\n        },\n        \"IndexDocument\": {\n          \"target\": \"com.amazonaws.s3#IndexDocument\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the index document for the website (for example <code>index.html</code>).</p>\"\n          }\n        },\n        \"ErrorDocument\": {\n          \"target\": \"com.amazonaws.s3#ErrorDocument\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The object key name of the website error document to use for 4XX class errors.</p>\"\n          }\n        },\n        \"RoutingRules\": {\n          \"target\": \"com.amazonaws.s3#RoutingRules\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Rules that define when a redirect is applied and the redirect behavior.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#output\": {},\n        \"smithy.api#xmlName\": \"WebsiteConfiguration\"\n      }\n    },\n    \"com.amazonaws.s3#GetBucketWebsiteRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The bucket name for which to get the website configuration.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#GetObject\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#GetObjectRequest\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.s3#GetObjectOutput\"\n      },\n      \"errors\": [\n        {\n          \"target\": \"com.amazonaws.s3#InvalidObjectState\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#NoSuchKey\"\n        }\n      ],\n      \"traits\": {\n        \"aws.protocols#httpChecksum\": {\n          \"requestValidationModeMember\": \"ChecksumMode\",\n          \"responseAlgorithms\": [\n            \"CRC64NVME\",\n            \"CRC32\",\n            \"CRC32C\",\n            \"SHA256\",\n            \"SHA1\"\n          ]\n        },\n        \"smithy.api#documentation\": \"<p>Retrieves an object from Amazon S3.</p>\\n         <p>In the <code>GetObject</code> request, specify the full key name for the object.</p>\\n         <p>\\n            <b>General purpose buckets</b> - Both the virtual-hosted-style requests\\n      and the path-style requests are supported. For a virtual hosted-style request example, if you have the\\n      object <code>photos/2006/February/sample.jpg</code>, specify the object key name as\\n        <code>/photos/2006/February/sample.jpg</code>. For a path-style request example, if you have the\\n      object <code>photos/2006/February/sample.jpg</code> in the bucket named <code>examplebucket</code>,\\n      specify the object key name as <code>/examplebucket/photos/2006/February/sample.jpg</code>. For more\\n      information about request types, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/VirtualHosting.html#VirtualHostingSpecifyBucket\\\">HTTP Host Header Bucket\\n        Specification</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <p>\\n            <b>Directory buckets</b> -\\n      Only virtual-hosted-style requests are supported. For a virtual hosted-style request example, if you have the object <code>photos/2006/February/sample.jpg</code> in the bucket named <code>amzn-s3-demo-bucket--usw2-az1--x-s3</code>, specify the object key name as <code>/photos/2006/February/sample.jpg</code>. Also, when you make requests to this API operation, your requests are sent to the Zonal endpoint. These endpoints support virtual-hosted-style requests in the format <code>https://<i>bucket-name</i>.s3express-<i>zone-id</i>.<i>region-code</i>.amazonaws.com/<i>key-name</i>\\n            </code>. Path-style requests are not supported. For more information about endpoints in Availability Zones, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/endpoint-directory-buckets-AZ.html\\\">Regional and Zonal endpoints for directory buckets in Availability Zones</a> in the\\n    <i>Amazon S3 User Guide</i>. For more information about endpoints in Local Zones, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-lzs-for-directory-buckets.html\\\">Concepts for directory buckets in Local Zones</a> in the\\n    <i>Amazon S3 User Guide</i>.</p>\\n         <dl>\\n            <dt>Permissions</dt>\\n            <dd>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <b>General purpose bucket permissions</b> - You must have the\\n                required permissions in a policy. To use <code>GetObject</code>, you must have the\\n                  <code>READ</code> access to the object (or version). If you grant <code>READ</code> access\\n                to the anonymous user, the <code>GetObject</code> operation returns the object without using\\n                an authorization header. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/using-with-s3-actions.html\\\">Specifying permissions in a\\n                  policy</a> in the <i>Amazon S3 User Guide</i>.</p>\\n                     <p>If you include a <code>versionId</code> in your request header, you must have the\\n                  <code>s3:GetObjectVersion</code> permission to access a specific version of an object. The\\n                  <code>s3:GetObject</code> permission is not required in this scenario.</p>\\n                     <p>If you request the current version of an object without a specific <code>versionId</code>\\n                in the request header, only the <code>s3:GetObject</code> permission is required. The\\n                  <code>s3:GetObjectVersion</code> permission is not required in this scenario. </p>\\n                     <p>If the object that you request doesn’t exist, the error that Amazon S3 returns depends on\\n                whether you also have the <code>s3:ListBucket</code> permission.</p>\\n                     <ul>\\n                        <li>\\n                           <p>If you have the <code>s3:ListBucket</code> permission on the bucket, Amazon S3 returns an\\n                    HTTP status code <code>404 Not Found</code> error.</p>\\n                        </li>\\n                        <li>\\n                           <p>If you don’t have the <code>s3:ListBucket</code> permission, Amazon S3 returns an HTTP\\n                    status code <code>403 Access Denied</code> error.</p>\\n                        </li>\\n                     </ul>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <b>Directory bucket permissions</b> - To grant access to this API operation on a directory bucket, we recommend that you use the <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateSession.html\\\">\\n                           <code>CreateSession</code>\\n                        </a> API operation for session-based authorization. Specifically, you grant the <code>s3express:CreateSession</code> permission to the directory bucket in a bucket policy or an IAM identity-based policy. Then, you make the <code>CreateSession</code> API call on the bucket to obtain a session token. With the session token in your request header, you can make API requests to this operation. After the session token expires, you make another <code>CreateSession</code> API call to generate a new session token for use. \\nAmazon Web Services CLI or SDKs create session and refresh the session token automatically to avoid service interruptions when a session expires. For more information about authorization, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateSession.html\\\">\\n                           <code>CreateSession</code>\\n                        </a>.</p>\\n                     <p>If the object is\\n                encrypted using SSE-KMS, you must also have the <code>kms:GenerateDataKey</code> and\\n                  <code>kms:Decrypt</code> permissions in IAM identity-based policies and KMS key policies\\n                for the KMS key.</p>\\n                  </li>\\n               </ul>\\n            </dd>\\n            <dt>Storage classes</dt>\\n            <dd>\\n               <p>If the object you are retrieving is stored in the S3 Glacier Flexible Retrieval storage class,\\n            the S3 Glacier Deep Archive storage class, the S3 Intelligent-Tiering Archive Access tier, or the\\n            S3 Intelligent-Tiering Deep Archive Access tier, before you can retrieve the object you must first restore a\\n            copy using <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_RestoreObject.html\\\">RestoreObject</a>. Otherwise, this operation returns an <code>InvalidObjectState</code>\\n            error. For information about restoring archived objects, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/restoring-objects.html\\\">Restoring Archived Objects</a> in the\\n              <i>Amazon S3 User Guide</i>.</p>\\n               <p>\\n                  <b>Directory buckets </b> -\\n            Directory buckets only support <code>EXPRESS_ONEZONE</code> (the S3 Express One Zone storage class) in Availability Zones and <code>ONEZONE_IA</code> (the S3 One Zone-Infrequent Access storage class) in Dedicated Local Zones.  \\nUnsupported storage class values won't write a destination object and will respond with the HTTP status code <code>400 Bad Request</code>.</p>\\n            </dd>\\n            <dt>Encryption</dt>\\n            <dd>\\n               <p>Encryption request headers, like <code>x-amz-server-side-encryption</code>, should not be sent\\n            for the <code>GetObject</code> requests, if your object uses server-side encryption with Amazon S3\\n            managed encryption keys (SSE-S3), server-side encryption with Key Management Service (KMS) keys (SSE-KMS), or\\n            dual-layer server-side encryption with Amazon Web Services KMS keys (DSSE-KMS). If you include the header in\\n            your <code>GetObject</code> requests for the object that uses these types of keys, you’ll get an\\n            HTTP <code>400 Bad Request</code> error.</p>\\n               <p>\\n                  <b>Directory buckets</b> -\\n            For directory buckets, there are only two supported options for server-side encryption: SSE-S3 and SSE-KMS. SSE-C isn't supported. For more\\n         information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-serv-side-encryption.html\\\">Protecting data with server-side encryption</a> in the <i>Amazon S3 User Guide</i>.</p>\\n            </dd>\\n            <dt>Overriding response header values through the request</dt>\\n            <dd>\\n               <p>There are times when you want to override certain response header values of a\\n              <code>GetObject</code> response. For example, you might override the\\n              <code>Content-Disposition</code> response header value through your <code>GetObject</code>\\n            request.</p>\\n               <p>You can override values for a set of response headers. These modified response header values\\n            are included only in a successful response, that is, when the HTTP status code <code>200 OK</code>\\n            is returned. The headers you can override using the following query parameters in the request are\\n            a subset of the headers that Amazon S3 accepts when you create an object. </p>\\n               <p>The response headers that you can override for the <code>GetObject</code> response are\\n              <code>Cache-Control</code>, <code>Content-Disposition</code>, <code>Content-Encoding</code>,\\n              <code>Content-Language</code>, <code>Content-Type</code>, and <code>Expires</code>.</p>\\n               <p>To override values for a set of response headers in the <code>GetObject</code> response, you\\n            can use the following query parameters in the request.</p>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <code>response-cache-control</code>\\n                     </p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <code>response-content-disposition</code>\\n                     </p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <code>response-content-encoding</code>\\n                     </p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <code>response-content-language</code>\\n                     </p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <code>response-content-type</code>\\n                     </p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <code>response-expires</code>\\n                     </p>\\n                  </li>\\n               </ul>\\n               <note>\\n                  <p>When you use these parameters, you must sign the request by using either an Authorization\\n              header or a presigned URL. These parameters cannot be used with an unsigned (anonymous)\\n              request.</p>\\n               </note>\\n            </dd>\\n            <dt>HTTP Host header syntax</dt>\\n            <dd>\\n               <p>\\n                  <b>Directory buckets </b> - The HTTP Host header syntax is <code>\\n                     <i>Bucket-name</i>.s3express-<i>zone-id</i>.<i>region-code</i>.amazonaws.com</code>.</p>\\n            </dd>\\n         </dl>\\n         <p>The following operations are related to <code>GetObject</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListBuckets.html\\\">ListBuckets</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObjectAcl.html\\\">GetObjectAcl</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#examples\": [\n          {\n            \"title\": \"To retrieve a byte range of an object \",\n            \"documentation\": \"The following example retrieves an object for an S3 bucket. The request specifies the range header to retrieve a specific byte range.\",\n            \"input\": {\n              \"Bucket\": \"examplebucket\",\n              \"Key\": \"SampleFile.txt\",\n              \"Range\": \"bytes=0-9\"\n            },\n            \"output\": {\n              \"AcceptRanges\": \"bytes\",\n              \"ContentType\": \"text/plain\",\n              \"LastModified\": \"2014-10-09T22:57:28.000Z\",\n              \"ContentLength\": 10,\n              \"VersionId\": \"null\",\n              \"ETag\": \"\\\"0d94420ffd0bc68cd3d152506b97a9cc\\\"\",\n              \"ContentRange\": \"bytes 0-9/43\",\n              \"Metadata\": {}\n            }\n          },\n          {\n            \"title\": \"To retrieve an object\",\n            \"documentation\": \"The following example retrieves an object for an S3 bucket.\",\n            \"input\": {\n              \"Bucket\": \"examplebucket\",\n              \"Key\": \"HappyFace.jpg\"\n            },\n            \"output\": {\n              \"AcceptRanges\": \"bytes\",\n              \"ContentType\": \"image/jpeg\",\n              \"LastModified\": \"2016-12-15T01:19:41.000Z\",\n              \"ContentLength\": 3191,\n              \"VersionId\": \"null\",\n              \"ETag\": \"\\\"6805f2cfc46c0f04559748bb039d69ae\\\"\",\n              \"TagCount\": 2,\n              \"Metadata\": {}\n            }\n          }\n        ],\n        \"smithy.api#http\": {\n          \"method\": \"GET\",\n          \"uri\": \"/{Bucket}/{Key+}?x-id=GetObject\",\n          \"code\": 200\n        }\n      }\n    },\n    \"com.amazonaws.s3#GetObjectAcl\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#GetObjectAclRequest\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.s3#GetObjectAclOutput\"\n      },\n      \"errors\": [\n        {\n          \"target\": \"com.amazonaws.s3#NoSuchKey\"\n        }\n      ],\n      \"traits\": {\n        \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported for directory buckets.</p>\\n         </note>\\n         <p>Returns the access control list (ACL) of an object. To use this operation, you must have\\n        <code>s3:GetObjectAcl</code> permissions or <code>READ_ACP</code> access to the object. For more\\n      information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/acl-overview.html#acl-access-policy-permission-mapping\\\">Mapping of ACL\\n        permissions and access policy permissions</a> in the <i>Amazon S3 User Guide</i>\\n         </p>\\n         <p>This functionality is not supported for Amazon S3 on Outposts.</p>\\n         <p>By default, GET returns ACL information about the current version of an object. To return ACL\\n      information about a different version, use the versionId subresource.</p>\\n         <note>\\n            <p>If your bucket uses the bucket owner enforced setting for S3 Object Ownership, requests to read\\n        ACLs are still supported and return the <code>bucket-owner-full-control</code> ACL with the owner\\n        being the account that created the bucket. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/about-object-ownership.html\\\"> Controlling object ownership and\\n          disabling ACLs</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         </note>\\n         <p>The following operations are related to <code>GetObjectAcl</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html\\\">GetObject</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObjectAttributes.html\\\">GetObjectAttributes</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObject.html\\\">DeleteObject</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html\\\">PutObject</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#examples\": [\n          {\n            \"title\": \"To retrieve object ACL\",\n            \"documentation\": \"The following example retrieves access control list (ACL) of an object.\",\n            \"input\": {\n              \"Bucket\": \"examplebucket\",\n              \"Key\": \"HappyFace.jpg\"\n            },\n            \"output\": {\n              \"Owner\": {\n                \"DisplayName\": \"owner-display-name\",\n                \"ID\": \"examplee7a2f25102679df27bb0ae12b3f85be6f290b936c4393484be31bebcc\"\n              },\n              \"Grants\": [\n                {\n                  \"Grantee\": {\n                    \"Type\": \"CanonicalUser\",\n                    \"DisplayName\": \"owner-display-name\",\n                    \"ID\": \"examplee7a2f25102679df27bb0ae12b3f85be6f290b936c4393484be31bebcc\"\n                  },\n                  \"Permission\": \"WRITE\"\n                },\n                {\n                  \"Grantee\": {\n                    \"Type\": \"CanonicalUser\",\n                    \"DisplayName\": \"owner-display-name\",\n                    \"ID\": \"examplee7a2f25102679df27bb0ae12b3f85be6f290b936c4393484be31bebcc\"\n                  },\n                  \"Permission\": \"WRITE_ACP\"\n                },\n                {\n                  \"Grantee\": {\n                    \"Type\": \"CanonicalUser\",\n                    \"DisplayName\": \"owner-display-name\",\n                    \"ID\": \"examplee7a2f25102679df27bb0ae12b3f85be6f290b936c4393484be31bebcc\"\n                  },\n                  \"Permission\": \"READ\"\n                },\n                {\n                  \"Grantee\": {\n                    \"Type\": \"CanonicalUser\",\n                    \"DisplayName\": \"owner-display-name\",\n                    \"ID\": \"852b113eexamplee7a2f25102679df27bb0ae12b3f85be6f290b936c4393484be31bebcc7a2f25102679df27bb0ae12b3f85be6f290b936c4393484be31bebcc\"\n                  },\n                  \"Permission\": \"READ_ACP\"\n                }\n              ]\n            }\n          }\n        ],\n        \"smithy.api#http\": {\n          \"method\": \"GET\",\n          \"uri\": \"/{Bucket}/{Key+}?acl\",\n          \"code\": 200\n        }\n      }\n    },\n    \"com.amazonaws.s3#GetObjectAclOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Owner\": {\n          \"target\": \"com.amazonaws.s3#Owner\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p> Container for the bucket owner's ID.</p>\"\n          }\n        },\n        \"Grants\": {\n          \"target\": \"com.amazonaws.s3#Grants\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A list of grants.</p>\",\n            \"smithy.api#xmlName\": \"AccessControlList\"\n          }\n        },\n        \"RequestCharged\": {\n          \"target\": \"com.amazonaws.s3#RequestCharged\",\n          \"traits\": {\n            \"smithy.api#httpHeader\": \"x-amz-request-charged\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#output\": {},\n        \"smithy.api#xmlName\": \"AccessControlPolicy\"\n      }\n    },\n    \"com.amazonaws.s3#GetObjectAclRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The bucket name that contains the object for which to get the ACL information. </p>\\n         <p>\\n            <b>Access points</b> - When you use this action with an access point for general purpose buckets, you must provide the alias of the access point in place of the bucket name or specify the access point ARN. When you use this action with an access point for directory buckets, you must provide the access point name in place of the bucket name. When using the access point ARN, you must direct requests to the access point hostname. The access point hostname takes the form <i>AccessPointName</i>-<i>AccountId</i>.s3-accesspoint.<i>Region</i>.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html\\\">Using access points</a> in the <i>Amazon S3 User Guide</i>.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"Key\": {\n          \"target\": \"com.amazonaws.s3#ObjectKey\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The key of the object for which to get the ACL information.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Key\"\n            }\n          }\n        },\n        \"VersionId\": {\n          \"target\": \"com.amazonaws.s3#ObjectVersionId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Version ID used to reference a specific version of the object.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpQuery\": \"versionId\"\n          }\n        },\n        \"RequestPayer\": {\n          \"target\": \"com.amazonaws.s3#RequestPayer\",\n          \"traits\": {\n            \"smithy.api#httpHeader\": \"x-amz-request-payer\"\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#GetObjectAttributes\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#GetObjectAttributesRequest\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.s3#GetObjectAttributesOutput\"\n      },\n      \"errors\": [\n        {\n          \"target\": \"com.amazonaws.s3#NoSuchKey\"\n        }\n      ],\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Retrieves all of the metadata from an object without returning the object itself. This operation is\\n      useful if you're interested only in an object's metadata. </p>\\n         <p>\\n            <code>GetObjectAttributes</code> combines the functionality of <code>HeadObject</code> and\\n        <code>ListParts</code>. All of the data returned with both of those individual calls can be returned\\n      with a single call to <code>GetObjectAttributes</code>.</p>\\n         <note>\\n            <p>\\n               <b>Directory buckets</b> - For directory buckets, you must make requests for this API operation to the Zonal endpoint. These endpoints support virtual-hosted-style requests in the format <code>https://<i>amzn-s3-demo-bucket</i>.s3express-<i>zone-id</i>.<i>region-code</i>.amazonaws.com/<i>key-name</i>\\n               </code>. Path-style requests are not supported. For more information about endpoints in Availability Zones, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/endpoint-directory-buckets-AZ.html\\\">Regional and Zonal endpoints for directory buckets in Availability Zones</a> in the\\n    <i>Amazon S3 User Guide</i>. For more information about endpoints in Local Zones, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-lzs-for-directory-buckets.html\\\">Concepts for directory buckets in Local Zones</a> in the\\n    <i>Amazon S3 User Guide</i>.</p>\\n         </note>\\n         <dl>\\n            <dt>Permissions</dt>\\n            <dd>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <b>General purpose bucket permissions</b> - To use\\n                  <code>GetObjectAttributes</code>, you must have READ access to the object.</p>\\n                     <p>The other permissions that you need to use this operation depend on whether the bucket is\\n                versioned and if a version ID is passed in the <code>GetObjectAttributes</code> request. </p>\\n                     <ul>\\n                        <li>\\n                           <p>If you pass a version ID in your request, you need both the\\n                      <code>s3:GetObjectVersion</code> and <code>s3:GetObjectVersionAttributes</code>\\n                    permissions.</p>\\n                        </li>\\n                        <li>\\n                           <p>If you do not pass a version ID in your request, you need the\\n                      <code>s3:GetObject</code> and <code>s3:GetObjectAttributes</code> permissions. </p>\\n                        </li>\\n                     </ul>\\n                     <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/using-with-s3-actions.html\\\">Specifying Permissions in a\\n                  Policy</a> in the <i>Amazon S3 User Guide</i>.</p>\\n                     <p>If the object that you request does not exist, the error Amazon S3 returns depends on whether\\n                you also have the <code>s3:ListBucket</code> permission.</p>\\n                     <ul>\\n                        <li>\\n                           <p>If you have the <code>s3:ListBucket</code> permission on the bucket, Amazon S3 returns an\\n                    HTTP status code <code>404 Not Found</code> (\\\"no such key\\\") error.</p>\\n                        </li>\\n                        <li>\\n                           <p>If you don't have the <code>s3:ListBucket</code> permission, Amazon S3 returns an HTTP\\n                    status code <code>403 Forbidden</code> (\\\"access denied\\\") error.</p>\\n                        </li>\\n                     </ul>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <b>Directory bucket permissions</b> - To grant access to this API operation on a directory bucket, we recommend that you use the <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateSession.html\\\">\\n                           <code>CreateSession</code>\\n                        </a> API operation for session-based authorization. Specifically, you grant the <code>s3express:CreateSession</code> permission to the directory bucket in a bucket policy or an IAM identity-based policy. Then, you make the <code>CreateSession</code> API call on the bucket to obtain a session token. With the session token in your request header, you can make API requests to this operation. After the session token expires, you make another <code>CreateSession</code> API call to generate a new session token for use. \\nAmazon Web Services CLI or SDKs create session and refresh the session token automatically to avoid service interruptions when a session expires. For more information about authorization, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateSession.html\\\">\\n                           <code>CreateSession</code>\\n                        </a>.</p>\\n                     <p>If\\n                the\\n                object is encrypted with SSE-KMS, you must also have the <code>kms:GenerateDataKey</code> and\\n                  <code>kms:Decrypt</code> permissions in IAM identity-based policies and KMS key policies\\n                for the KMS key.</p>\\n                  </li>\\n               </ul>\\n            </dd>\\n            <dt>Encryption</dt>\\n            <dd>\\n               <note>\\n                  <p>Encryption request headers, like <code>x-amz-server-side-encryption</code>, should not be\\n              sent for <code>HEAD</code> requests if your object uses server-side encryption with Key Management Service\\n              (KMS) keys (SSE-KMS), dual-layer server-side encryption with Amazon Web Services KMS keys (DSSE-KMS), or\\n              server-side encryption with Amazon S3 managed encryption keys (SSE-S3). The\\n                <code>x-amz-server-side-encryption</code> header is used when you <code>PUT</code> an object\\n              to S3 and want to specify the encryption method. If you include this header in a\\n                <code>GET</code> request for an object that uses these types of keys, you’ll get an HTTP\\n                <code>400 Bad Request</code> error. It's because the encryption method can't be changed when\\n              you retrieve the object.</p>\\n               </note>\\n               <p>If you encrypted an object when you stored the object in Amazon S3 by using server-side encryption\\n            with customer-provided encryption keys (SSE-C), then when you retrieve the metadata from the\\n            object, you must use the following headers. These headers provide the server with the encryption\\n            key required to retrieve the object's metadata. The headers are: </p>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <code>x-amz-server-side-encryption-customer-algorithm</code>\\n                     </p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <code>x-amz-server-side-encryption-customer-key</code>\\n                     </p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <code>x-amz-server-side-encryption-customer-key-MD5</code>\\n                     </p>\\n                  </li>\\n               </ul>\\n               <p>For more information about SSE-C, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/ServerSideEncryptionCustomerKeys.html\\\">Server-Side Encryption (Using\\n              Customer-Provided Encryption Keys)</a> in the <i>Amazon S3 User Guide</i>.</p>\\n               <note>\\n                  <p>\\n                     <b>Directory bucket permissions</b> -\\n              For directory buckets, there are only two supported options for server-side encryption: server-side encryption with Amazon S3 managed keys (SSE-S3) (<code>AES256</code>) and server-side encryption with KMS keys (SSE-KMS) (<code>aws:kms</code>). We recommend that the bucket's default encryption uses the desired encryption configuration and you don't override the bucket default encryption in your \\n            <code>CreateSession</code> requests or <code>PUT</code> object requests. Then, new objects \\n are automatically encrypted with the desired encryption settings. For more\\n         information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-serv-side-encryption.html\\\">Protecting data with server-side encryption</a> in the <i>Amazon S3 User Guide</i>. For more information about the encryption overriding behaviors in directory buckets, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-specifying-kms-encryption.html\\\">Specifying server-side encryption with KMS for new object uploads</a>.</p>\\n               </note>\\n            </dd>\\n            <dt>Versioning</dt>\\n            <dd>\\n               <p>\\n                  <b>Directory buckets</b> - S3 Versioning isn't enabled and supported for directory buckets. For this API operation, only the <code>null</code> value of the version ID is supported by directory buckets.\\n            You can only specify <code>null</code> to the <code>versionId</code> query parameter in the\\n            request.</p>\\n            </dd>\\n            <dt>Conditional request headers</dt>\\n            <dd>\\n               <p>Consider the following when using request headers:</p>\\n               <ul>\\n                  <li>\\n                     <p>If both of the <code>If-Match</code> and <code>If-Unmodified-Since</code> headers are\\n                present in the request as follows, then Amazon S3 returns the HTTP status code <code>200 OK</code>\\n                and the data requested:</p>\\n                     <ul>\\n                        <li>\\n                           <p>\\n                              <code>If-Match</code> condition evaluates to <code>true</code>.</p>\\n                        </li>\\n                        <li>\\n                           <p>\\n                              <code>If-Unmodified-Since</code> condition evaluates to <code>false</code>.</p>\\n                        </li>\\n                     </ul>\\n                     <p>For more information about conditional requests, see <a href=\\\"https://tools.ietf.org/html/rfc7232\\\">RFC 7232</a>.</p>\\n                  </li>\\n                  <li>\\n                     <p>If both of the <code>If-None-Match</code> and <code>If-Modified-Since</code> headers are\\n                present in the request as follows, then Amazon S3 returns the HTTP status code <code>304 Not\\n                  Modified</code>:</p>\\n                     <ul>\\n                        <li>\\n                           <p>\\n                              <code>If-None-Match</code> condition evaluates to <code>false</code>.</p>\\n                        </li>\\n                        <li>\\n                           <p>\\n                              <code>If-Modified-Since</code> condition evaluates to <code>true</code>.</p>\\n                        </li>\\n                     </ul>\\n                     <p>For more information about conditional requests, see <a href=\\\"https://tools.ietf.org/html/rfc7232\\\">RFC 7232</a>.</p>\\n                  </li>\\n               </ul>\\n            </dd>\\n            <dt>HTTP Host header syntax</dt>\\n            <dd>\\n               <p>\\n                  <b>Directory buckets </b> - The HTTP Host header syntax is <code>\\n                     <i>Bucket-name</i>.s3express-<i>zone-id</i>.<i>region-code</i>.amazonaws.com</code>.</p>\\n            </dd>\\n         </dl>\\n         <p>The following actions are related to <code>GetObjectAttributes</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html\\\">GetObject</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObjectAcl.html\\\">GetObjectAcl</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObjectLegalHold.html\\\">GetObjectLegalHold</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObjectLockConfiguration.html\\\">GetObjectLockConfiguration</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObjectRetention.html\\\">GetObjectRetention</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObjectTagging.html\\\">GetObjectTagging</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_HeadObject.html\\\">HeadObject</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListParts.html\\\">ListParts</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#http\": {\n          \"method\": \"GET\",\n          \"uri\": \"/{Bucket}/{Key+}?attributes\",\n          \"code\": 200\n        }\n      }\n    },\n    \"com.amazonaws.s3#GetObjectAttributesOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"DeleteMarker\": {\n          \"target\": \"com.amazonaws.s3#DeleteMarker\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies whether the object retrieved was (<code>true</code>) or was not (<code>false</code>) a\\n      delete marker. If <code>false</code>, this response header does not appear in the response. To learn\\n      more about delete markers, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/DeleteMarker.html\\\">Working with delete markers</a>.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-delete-marker\"\n          }\n        },\n        \"LastModified\": {\n          \"target\": \"com.amazonaws.s3#LastModified\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Date and time when the object was last modified.</p>\",\n            \"smithy.api#httpHeader\": \"Last-Modified\"\n          }\n        },\n        \"VersionId\": {\n          \"target\": \"com.amazonaws.s3#ObjectVersionId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The version ID of the object.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-version-id\"\n          }\n        },\n        \"RequestCharged\": {\n          \"target\": \"com.amazonaws.s3#RequestCharged\",\n          \"traits\": {\n            \"smithy.api#httpHeader\": \"x-amz-request-charged\"\n          }\n        },\n        \"ETag\": {\n          \"target\": \"com.amazonaws.s3#ETag\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>An ETag is an opaque identifier assigned by a web server to a specific version of a resource found\\n      at a URL.</p>\"\n          }\n        },\n        \"Checksum\": {\n          \"target\": \"com.amazonaws.s3#Checksum\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The checksum or digest of the object.</p>\"\n          }\n        },\n        \"ObjectParts\": {\n          \"target\": \"com.amazonaws.s3#GetObjectAttributesParts\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A collection of parts associated with a multipart upload.</p>\"\n          }\n        },\n        \"StorageClass\": {\n          \"target\": \"com.amazonaws.s3#StorageClass\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Provides the storage class information of the object. Amazon S3 returns this header for all objects\\n      except for S3 Standard storage class objects.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/storage-class-intro.html\\\">Storage Classes</a>.</p>\\n         <note>\\n            <p>\\n               <b>Directory buckets</b> -\\n        Directory buckets only support <code>EXPRESS_ONEZONE</code> (the S3 Express One Zone storage class) in Availability Zones and <code>ONEZONE_IA</code> (the S3 One Zone-Infrequent Access storage class) in Dedicated Local Zones.</p>\\n         </note>\"\n          }\n        },\n        \"ObjectSize\": {\n          \"target\": \"com.amazonaws.s3#ObjectSize\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The size of the object in bytes.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#output\": {},\n        \"smithy.api#xmlName\": \"GetObjectAttributesResponse\"\n      }\n    },\n    \"com.amazonaws.s3#GetObjectAttributesParts\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"TotalPartsCount\": {\n          \"target\": \"com.amazonaws.s3#PartsCount\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The total number of parts.</p>\",\n            \"smithy.api#xmlName\": \"PartsCount\"\n          }\n        },\n        \"PartNumberMarker\": {\n          \"target\": \"com.amazonaws.s3#PartNumberMarker\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The marker for the current part.</p>\"\n          }\n        },\n        \"NextPartNumberMarker\": {\n          \"target\": \"com.amazonaws.s3#NextPartNumberMarker\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>When a list is truncated, this element specifies the last part in the list, as well as the value to\\n      use for the <code>PartNumberMarker</code> request parameter in a subsequent request.</p>\"\n          }\n        },\n        \"MaxParts\": {\n          \"target\": \"com.amazonaws.s3#MaxParts\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The maximum number of parts allowed in the response.</p>\"\n          }\n        },\n        \"IsTruncated\": {\n          \"target\": \"com.amazonaws.s3#IsTruncated\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Indicates whether the returned list of parts is truncated. A value of <code>true</code> indicates\\n      that the list was truncated. A list can be truncated if the number of parts exceeds the limit returned\\n      in the <code>MaxParts</code> element.</p>\"\n          }\n        },\n        \"Parts\": {\n          \"target\": \"com.amazonaws.s3#PartsList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A container for elements related to a particular part. A response can contain zero or more\\n        <code>Parts</code> elements.</p>\\n         <note>\\n            <ul>\\n               <li>\\n                  <p>\\n                     <b>General purpose buckets</b> - For\\n              <code>GetObjectAttributes</code>, if an additional checksum (including\\n              <code>x-amz-checksum-crc32</code>, <code>x-amz-checksum-crc32c</code>,\\n              <code>x-amz-checksum-sha1</code>, or <code>x-amz-checksum-sha256</code>) isn't applied to the\\n            object specified in the request, the response doesn't return the <code>Part</code> element.</p>\\n               </li>\\n               <li>\\n                  <p>\\n                     <b>Directory buckets</b> - For\\n              <code>GetObjectAttributes</code>, regardless of whether an additional checksum is applied to the\\n            object specified in the request, the response returns the <code>Part</code> element.</p>\\n               </li>\\n            </ul>\\n         </note>\",\n            \"smithy.api#xmlFlattened\": {},\n            \"smithy.api#xmlName\": \"Part\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>A collection of parts associated with a multipart upload.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#GetObjectAttributesRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the bucket that contains the object.</p>\\n         <p>\\n            <b>Directory buckets</b> - When you use this operation with a directory bucket, you must use virtual-hosted-style requests in the format <code>\\n               <i>Bucket-name</i>.s3express-<i>zone-id</i>.<i>region-code</i>.amazonaws.com</code>. Path-style requests are not supported.  Directory bucket names must be unique in the chosen Zone (Availability Zone or Local Zone). Bucket names must follow the format <code>\\n               <i>bucket-base-name</i>--<i>zone-id</i>--x-s3</code> (for example, <code>\\n               <i>amzn-s3-demo-bucket</i>--<i>usw2-az1</i>--x-s3</code>). For information about bucket naming\\n         restrictions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-bucket-naming-rules.html\\\">Directory bucket naming\\n            rules</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <p>\\n            <b>Access points</b> - When you use this action with an access point for general purpose buckets, you must provide the alias of the access point in place of the bucket name or specify the access point ARN. When you use this action with an access point for directory buckets, you must provide the access point name in place of the bucket name. When using the access point ARN, you must direct requests to the access point hostname. The access point hostname takes the form <i>AccessPointName</i>-<i>AccountId</i>.s3-accesspoint.<i>Region</i>.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html\\\">Using access points</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <note>\\n            <p>Object Lambda access points are not supported by directory buckets.</p>\\n         </note>\\n         <p>\\n            <b>S3 on Outposts</b> - When you use this action with S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the \\n                     form <code>\\n               <i>AccessPointName</i>-<i>AccountId</i>.<i>outpostID</i>.s3-outposts.<i>Region</i>.amazonaws.com</code>. When you use this action with S3 on Outposts, the destination bucket must be the Outposts access point ARN or the access point alias. For more information about S3 on Outposts, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html\\\">What is S3 on Outposts?</a> in the <i>Amazon S3 User Guide</i>.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"Key\": {\n          \"target\": \"com.amazonaws.s3#ObjectKey\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The object key.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {}\n          }\n        },\n        \"VersionId\": {\n          \"target\": \"com.amazonaws.s3#ObjectVersionId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The version ID used to reference a specific version of the object.</p>\\n         <note>\\n            <p>S3 Versioning isn't enabled and supported for directory buckets. For this API operation, only the <code>null</code> value of the version ID is supported by directory buckets. You can only specify <code>null</code> to the\\n          <code>versionId</code> query parameter in the request.</p>\\n         </note>\",\n            \"smithy.api#httpQuery\": \"versionId\"\n          }\n        },\n        \"MaxParts\": {\n          \"target\": \"com.amazonaws.s3#MaxParts\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Sets the maximum number of parts to return. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/mpuoverview.html\\\">Uploading and copying objects using multipart upload\\n        in Amazon S3 </a> in the <i>Amazon Simple Storage Service user guide</i>.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-max-parts\"\n          }\n        },\n        \"PartNumberMarker\": {\n          \"target\": \"com.amazonaws.s3#PartNumberMarker\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the part after which listing should begin. Only parts with higher part numbers will be\\n      listed. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/mpuoverview.html\\\">Uploading and copying objects using multipart upload\\n        in Amazon S3 </a> in the <i>Amazon Simple Storage Service user guide</i>.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-part-number-marker\"\n          }\n        },\n        \"SSECustomerAlgorithm\": {\n          \"target\": \"com.amazonaws.s3#SSECustomerAlgorithm\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the algorithm to use when encrypting the object (for example, AES256).</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption-customer-algorithm\"\n          }\n        },\n        \"SSECustomerKey\": {\n          \"target\": \"com.amazonaws.s3#SSECustomerKey\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the customer-provided encryption key for Amazon S3 to use in encrypting data. This value is\\n      used to store the object and then it is discarded; Amazon S3 does not store the encryption key. The key must\\n      be appropriate for use with the algorithm specified in the\\n        <code>x-amz-server-side-encryption-customer-algorithm</code> header.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption-customer-key\"\n          }\n        },\n        \"SSECustomerKeyMD5\": {\n          \"target\": \"com.amazonaws.s3#SSECustomerKeyMD5\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the 128-bit MD5 digest of the encryption key according to RFC 1321. Amazon S3 uses this header\\n      for a message integrity check to ensure that the encryption key was transmitted without error.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption-customer-key-MD5\"\n          }\n        },\n        \"RequestPayer\": {\n          \"target\": \"com.amazonaws.s3#RequestPayer\",\n          \"traits\": {\n            \"smithy.api#httpHeader\": \"x-amz-request-payer\"\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        },\n        \"ObjectAttributes\": {\n          \"target\": \"com.amazonaws.s3#ObjectAttributesList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the fields at the root level that you want returned in the response. Fields that you do\\n      not specify are not returned.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-object-attributes\",\n            \"smithy.api#required\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#GetObjectLegalHold\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#GetObjectLegalHoldRequest\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.s3#GetObjectLegalHoldOutput\"\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported for directory buckets.</p>\\n         </note>\\n         <p>Gets an object's current legal hold status. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/object-lock.html\\\">Locking Objects</a>.</p>\\n         <p>This functionality is not supported for Amazon S3 on Outposts.</p>\\n         <p>The following action is related to <code>GetObjectLegalHold</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObjectAttributes.html\\\">GetObjectAttributes</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#http\": {\n          \"method\": \"GET\",\n          \"uri\": \"/{Bucket}/{Key+}?legal-hold\",\n          \"code\": 200\n        }\n      }\n    },\n    \"com.amazonaws.s3#GetObjectLegalHoldOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"LegalHold\": {\n          \"target\": \"com.amazonaws.s3#ObjectLockLegalHold\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The current legal hold status for the specified object.</p>\",\n            \"smithy.api#httpPayload\": {},\n            \"smithy.api#xmlName\": \"LegalHold\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#output\": {}\n      }\n    },\n    \"com.amazonaws.s3#GetObjectLegalHoldRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The bucket name containing the object whose legal hold status you want to retrieve. </p>\\n         <p>\\n            <b>Access points</b> - When you use this action with an access point for general purpose buckets, you must provide the alias of the access point in place of the bucket name or specify the access point ARN. When you use this action with an access point for directory buckets, you must provide the access point name in place of the bucket name. When using the access point ARN, you must direct requests to the access point hostname. The access point hostname takes the form <i>AccessPointName</i>-<i>AccountId</i>.s3-accesspoint.<i>Region</i>.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html\\\">Using access points</a> in the <i>Amazon S3 User Guide</i>.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"Key\": {\n          \"target\": \"com.amazonaws.s3#ObjectKey\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The key name for the object whose legal hold status you want to retrieve.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {}\n          }\n        },\n        \"VersionId\": {\n          \"target\": \"com.amazonaws.s3#ObjectVersionId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The version ID of the object whose legal hold status you want to retrieve.</p>\",\n            \"smithy.api#httpQuery\": \"versionId\"\n          }\n        },\n        \"RequestPayer\": {\n          \"target\": \"com.amazonaws.s3#RequestPayer\",\n          \"traits\": {\n            \"smithy.api#httpHeader\": \"x-amz-request-payer\"\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#GetObjectLockConfiguration\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#GetObjectLockConfigurationRequest\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.s3#GetObjectLockConfigurationOutput\"\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported for directory buckets.</p>\\n         </note>\\n         <p>Gets the Object Lock configuration for a bucket. The rule specified in the Object Lock configuration\\n      will be applied by default to every new object placed in the specified bucket. For more information, see\\n        <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/object-lock.html\\\">Locking Objects</a>.</p>\\n         <p>The following action is related to <code>GetObjectLockConfiguration</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObjectAttributes.html\\\">GetObjectAttributes</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#http\": {\n          \"method\": \"GET\",\n          \"uri\": \"/{Bucket}?object-lock\",\n          \"code\": 200\n        }\n      }\n    },\n    \"com.amazonaws.s3#GetObjectLockConfigurationOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"ObjectLockConfiguration\": {\n          \"target\": \"com.amazonaws.s3#ObjectLockConfiguration\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The specified bucket's Object Lock configuration.</p>\",\n            \"smithy.api#httpPayload\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#output\": {}\n      }\n    },\n    \"com.amazonaws.s3#GetObjectLockConfigurationRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The bucket whose Object Lock configuration you want to retrieve.</p>\\n         <p>\\n            <b>Access points</b> - When you use this action with an access point for general purpose buckets, you must provide the alias of the access point in place of the bucket name or specify the access point ARN. When you use this action with an access point for directory buckets, you must provide the access point name in place of the bucket name. When using the access point ARN, you must direct requests to the access point hostname. The access point hostname takes the form <i>AccessPointName</i>-<i>AccountId</i>.s3-accesspoint.<i>Region</i>.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html\\\">Using access points</a> in the <i>Amazon S3 User Guide</i>.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#GetObjectOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Body\": {\n          \"target\": \"com.amazonaws.s3#StreamingBlob\",\n          \"traits\": {\n            \"smithy.api#default\": \"\",\n            \"smithy.api#documentation\": \"<p>Object data.</p>\",\n            \"smithy.api#httpPayload\": {}\n          }\n        },\n        \"DeleteMarker\": {\n          \"target\": \"com.amazonaws.s3#DeleteMarker\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Indicates whether the object retrieved was (true) or was not (false) a Delete Marker. If false, this\\n      response header does not appear in the response.</p>\\n         <note>\\n            <ul>\\n               <li>\\n                  <p>If the current version of the object is a delete marker, Amazon S3 behaves as if the object was\\n            deleted and includes <code>x-amz-delete-marker: true</code> in the response.</p>\\n               </li>\\n               <li>\\n                  <p>If the specified version in the request is a delete marker, the response returns a <code>405\\n              Method Not Allowed</code> error and the <code>Last-Modified: timestamp</code> response\\n            header.</p>\\n               </li>\\n            </ul>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-delete-marker\"\n          }\n        },\n        \"AcceptRanges\": {\n          \"target\": \"com.amazonaws.s3#AcceptRanges\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Indicates that a range of bytes was specified in the request.</p>\",\n            \"smithy.api#httpHeader\": \"accept-ranges\"\n          }\n        },\n        \"Expiration\": {\n          \"target\": \"com.amazonaws.s3#Expiration\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>If the object expiration is configured (see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketLifecycleConfiguration.html\\\">\\n               <code>PutBucketLifecycleConfiguration</code>\\n            </a>), the response includes this header. It\\n      includes the <code>expiry-date</code> and <code>rule-id</code> key-value pairs providing object\\n      expiration information. The value of the <code>rule-id</code> is URL-encoded.</p>\\n         <note>\\n            <p>Object expiration information is not returned in directory buckets and this header returns the\\n        value \\\"<code>NotImplemented</code>\\\" in all responses for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-expiration\"\n          }\n        },\n        \"Restore\": {\n          \"target\": \"com.amazonaws.s3#Restore\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Provides information about object restoration action and expiration time of the restored object\\n      copy.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets. Directory buckets only support <code>EXPRESS_ONEZONE</code> (the S3 Express One Zone storage class) in Availability Zones and <code>ONEZONE_IA</code> (the S3 One Zone-Infrequent Access storage class) in Dedicated Local Zones.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-restore\"\n          }\n        },\n        \"LastModified\": {\n          \"target\": \"com.amazonaws.s3#LastModified\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Date and time when the object was last modified.</p>\\n         <p>\\n            <b>General purpose buckets </b> - When you specify a\\n        <code>versionId</code> of the object in your request, if the specified version in the request is a\\n      delete marker, the response returns a <code>405 Method Not Allowed</code> error and the\\n        <code>Last-Modified: timestamp</code> response header.</p>\",\n            \"smithy.api#httpHeader\": \"Last-Modified\"\n          }\n        },\n        \"ContentLength\": {\n          \"target\": \"com.amazonaws.s3#ContentLength\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Size of the body in bytes.</p>\",\n            \"smithy.api#httpHeader\": \"Content-Length\"\n          }\n        },\n        \"ETag\": {\n          \"target\": \"com.amazonaws.s3#ETag\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>An entity tag (ETag) is an opaque identifier assigned by a web server to a specific version of a\\n      resource found at a URL.</p>\",\n            \"smithy.api#httpHeader\": \"ETag\"\n          }\n        },\n        \"ChecksumCRC32\": {\n          \"target\": \"com.amazonaws.s3#ChecksumCRC32\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Base64 encoded, 32-bit <code>CRC32</code> checksum of the object. This checksum is only present if the object was uploaded\\n    with the object. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">\\n    Checking object integrity</a> in the <i>Amazon S3 User Guide</i>.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-checksum-crc32\"\n          }\n        },\n        \"ChecksumCRC32C\": {\n          \"target\": \"com.amazonaws.s3#ChecksumCRC32C\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Base64 encoded, 32-bit <code>CRC32C</code> checksum of the object. This checksum is only present if the checksum was uploaded\\n    with the object. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">\\n    Checking object integrity</a> in the <i>Amazon S3 User Guide</i>.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-checksum-crc32c\"\n          }\n        },\n        \"ChecksumCRC64NVME\": {\n          \"target\": \"com.amazonaws.s3#ChecksumCRC64NVME\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Base64 encoded, 64-bit <code>CRC64NVME</code> checksum of the object. For more information, see\\n        <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking\\n        object integrity in the Amazon S3 User Guide</a>.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-checksum-crc64nvme\"\n          }\n        },\n        \"ChecksumSHA1\": {\n          \"target\": \"com.amazonaws.s3#ChecksumSHA1\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Base64 encoded, 160-bit <code>SHA1</code> digest of the object. This checksum is only present if the checksum was uploaded\\n    with the object. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">\\n    Checking object integrity</a> in the <i>Amazon S3 User Guide</i>.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-checksum-sha1\"\n          }\n        },\n        \"ChecksumSHA256\": {\n          \"target\": \"com.amazonaws.s3#ChecksumSHA256\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Base64 encoded, 256-bit <code>SHA256</code> digest of the object. This checksum is only present if the checksum was uploaded\\n    with the object. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">\\n    Checking object integrity</a> in the <i>Amazon S3 User Guide</i>.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-checksum-sha256\"\n          }\n        },\n        \"ChecksumType\": {\n          \"target\": \"com.amazonaws.s3#ChecksumType\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The checksum type, which determines how part-level checksums are combined to create an object-level\\n      checksum for multipart objects. You can use this header response to verify that the checksum type that\\n      is received is the same checksum type that was specified in the <code>CreateMultipartUpload</code>\\n      request. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking object integrity</a> in\\n      the <i>Amazon S3 User Guide</i>.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-checksum-type\"\n          }\n        },\n        \"MissingMeta\": {\n          \"target\": \"com.amazonaws.s3#MissingMeta\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>This is set to the number of metadata entries not returned in the headers that are prefixed with\\n        <code>x-amz-meta-</code>. This can happen if you create metadata using an API like SOAP that supports\\n      more flexible metadata than the REST API. For example, using SOAP, you can create metadata whose values\\n      are not legal HTTP headers.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-missing-meta\"\n          }\n        },\n        \"VersionId\": {\n          \"target\": \"com.amazonaws.s3#ObjectVersionId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Version ID of the object.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-version-id\"\n          }\n        },\n        \"CacheControl\": {\n          \"target\": \"com.amazonaws.s3#CacheControl\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies caching behavior along the request/reply chain.</p>\",\n            \"smithy.api#httpHeader\": \"Cache-Control\"\n          }\n        },\n        \"ContentDisposition\": {\n          \"target\": \"com.amazonaws.s3#ContentDisposition\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies presentational information for the object.</p>\",\n            \"smithy.api#httpHeader\": \"Content-Disposition\"\n          }\n        },\n        \"ContentEncoding\": {\n          \"target\": \"com.amazonaws.s3#ContentEncoding\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Indicates what content encodings have been applied to the object and thus what decoding mechanisms\\n      must be applied to obtain the media-type referenced by the Content-Type header field.</p>\",\n            \"smithy.api#httpHeader\": \"Content-Encoding\"\n          }\n        },\n        \"ContentLanguage\": {\n          \"target\": \"com.amazonaws.s3#ContentLanguage\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The language the content is in.</p>\",\n            \"smithy.api#httpHeader\": \"Content-Language\"\n          }\n        },\n        \"ContentRange\": {\n          \"target\": \"com.amazonaws.s3#ContentRange\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The portion of the object returned in the response.</p>\",\n            \"smithy.api#httpHeader\": \"Content-Range\"\n          }\n        },\n        \"ContentType\": {\n          \"target\": \"com.amazonaws.s3#ContentType\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A standard MIME type describing the format of the object data.</p>\",\n            \"smithy.api#httpHeader\": \"Content-Type\"\n          }\n        },\n        \"Expires\": {\n          \"target\": \"com.amazonaws.s3#Expires\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The date and time at which the object is no longer cacheable.</p>\",\n            \"smithy.api#httpHeader\": \"Expires\"\n          }\n        },\n        \"WebsiteRedirectLocation\": {\n          \"target\": \"com.amazonaws.s3#WebsiteRedirectLocation\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>If the bucket is configured as a website, redirects requests for this object to another object in\\n      the same bucket or to an external URL. Amazon S3 stores the value of this header in the object\\n      metadata.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-website-redirect-location\"\n          }\n        },\n        \"ServerSideEncryption\": {\n          \"target\": \"com.amazonaws.s3#ServerSideEncryption\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The server-side encryption algorithm used when you store this object in Amazon S3 or Amazon FSx.</p>\\n         <note>\\n            <p>When accessing data stored in Amazon FSx file systems using S3 access points, the only valid server side\\n        encryption option is <code>aws:fsx</code>.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption\"\n          }\n        },\n        \"Metadata\": {\n          \"target\": \"com.amazonaws.s3#Metadata\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A map of metadata to store with the object in S3.</p>\",\n            \"smithy.api#httpPrefixHeaders\": \"x-amz-meta-\"\n          }\n        },\n        \"SSECustomerAlgorithm\": {\n          \"target\": \"com.amazonaws.s3#SSECustomerAlgorithm\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>If server-side encryption with a customer-provided encryption key was requested, the response will\\n      include this header to confirm the encryption algorithm that's used.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption-customer-algorithm\"\n          }\n        },\n        \"SSECustomerKeyMD5\": {\n          \"target\": \"com.amazonaws.s3#SSECustomerKeyMD5\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>If server-side encryption with a customer-provided encryption key was requested, the response will\\n      include this header to provide the round-trip message integrity verification of the customer-provided\\n      encryption key.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption-customer-key-MD5\"\n          }\n        },\n        \"SSEKMSKeyId\": {\n          \"target\": \"com.amazonaws.s3#SSEKMSKeyId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>If present, indicates the ID of the KMS key that was used for object encryption.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption-aws-kms-key-id\"\n          }\n        },\n        \"BucketKeyEnabled\": {\n          \"target\": \"com.amazonaws.s3#BucketKeyEnabled\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Indicates whether the object uses an S3 Bucket Key for server-side encryption with Key Management Service (KMS)\\n      keys (SSE-KMS).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption-bucket-key-enabled\"\n          }\n        },\n        \"StorageClass\": {\n          \"target\": \"com.amazonaws.s3#StorageClass\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Provides storage class information of the object. Amazon S3 returns this header for all objects except\\n      for S3 Standard storage class objects.</p>\\n         <note>\\n            <p>\\n               <b>Directory buckets </b> -\\n        Directory buckets only support <code>EXPRESS_ONEZONE</code> (the S3 Express One Zone storage class) in Availability Zones and <code>ONEZONE_IA</code> (the S3 One Zone-Infrequent Access storage class) in Dedicated Local Zones.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-storage-class\"\n          }\n        },\n        \"RequestCharged\": {\n          \"target\": \"com.amazonaws.s3#RequestCharged\",\n          \"traits\": {\n            \"smithy.api#httpHeader\": \"x-amz-request-charged\"\n          }\n        },\n        \"ReplicationStatus\": {\n          \"target\": \"com.amazonaws.s3#ReplicationStatus\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Amazon S3 can return this if your request involves a bucket that is either a source or destination in a\\n      replication rule.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-replication-status\"\n          }\n        },\n        \"PartsCount\": {\n          \"target\": \"com.amazonaws.s3#PartsCount\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The count of parts this object has. This value is only returned if you specify\\n        <code>partNumber</code> in your request and the object was uploaded as a multipart upload.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-mp-parts-count\"\n          }\n        },\n        \"TagCount\": {\n          \"target\": \"com.amazonaws.s3#TagCount\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The number of tags, if any, on the object, when you have the relevant permission to read object\\n      tags.</p>\\n         <p>You can use <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObjectTagging.html\\\">GetObjectTagging</a> to retrieve the tag set associated with an object.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-tagging-count\"\n          }\n        },\n        \"ObjectLockMode\": {\n          \"target\": \"com.amazonaws.s3#ObjectLockMode\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Object Lock mode that's currently in place for this object.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-object-lock-mode\"\n          }\n        },\n        \"ObjectLockRetainUntilDate\": {\n          \"target\": \"com.amazonaws.s3#ObjectLockRetainUntilDate\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The date and time when this object's Object Lock will expire.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-object-lock-retain-until-date\"\n          }\n        },\n        \"ObjectLockLegalHoldStatus\": {\n          \"target\": \"com.amazonaws.s3#ObjectLockLegalHoldStatus\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Indicates whether this object has an active legal hold. This field is only returned if you have\\n      permission to view an object's legal hold status. </p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-object-lock-legal-hold\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#output\": {}\n      }\n    },\n    \"com.amazonaws.s3#GetObjectRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The bucket name containing the object. </p>\\n         <p>\\n            <b>Directory buckets</b> - When you use this operation with a directory bucket, you must use virtual-hosted-style requests in the format <code>\\n               <i>Bucket-name</i>.s3express-<i>zone-id</i>.<i>region-code</i>.amazonaws.com</code>. Path-style requests are not supported.  Directory bucket names must be unique in the chosen Zone (Availability Zone or Local Zone). Bucket names must follow the format <code>\\n               <i>bucket-base-name</i>--<i>zone-id</i>--x-s3</code> (for example, <code>\\n               <i>amzn-s3-demo-bucket</i>--<i>usw2-az1</i>--x-s3</code>). For information about bucket naming\\n         restrictions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-bucket-naming-rules.html\\\">Directory bucket naming\\n            rules</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <p>\\n            <b>Access points</b> - When you use this action with an access point for general purpose buckets, you must provide the alias of the access point in place of the bucket name or specify the access point ARN. When you use this action with an access point for directory buckets, you must provide the access point name in place of the bucket name. When using the access point ARN, you must direct requests to the access point hostname. The access point hostname takes the form <i>AccessPointName</i>-<i>AccountId</i>.s3-accesspoint.<i>Region</i>.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html\\\">Using access points</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <p>\\n            <b>Object Lambda access points</b> - When you use this action with an Object Lambda access point, you must direct requests to the Object Lambda access point hostname. The Object Lambda access point hostname takes the form <i>AccessPointName</i>-<i>AccountId</i>.s3-object-lambda.<i>Region</i>.amazonaws.com.</p>\\n         <note>\\n            <p>Object Lambda access points are not supported by directory buckets.</p>\\n         </note>\\n         <p>\\n            <b>S3 on Outposts</b> - When you use this action with S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the \\n                     form <code>\\n               <i>AccessPointName</i>-<i>AccountId</i>.<i>outpostID</i>.s3-outposts.<i>Region</i>.amazonaws.com</code>. When you use this action with S3 on Outposts, the destination bucket must be the Outposts access point ARN or the access point alias. For more information about S3 on Outposts, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html\\\">What is S3 on Outposts?</a> in the <i>Amazon S3 User Guide</i>.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"IfMatch\": {\n          \"target\": \"com.amazonaws.s3#IfMatch\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Return the object only if its entity tag (ETag) is the same as the one specified in this header;\\n      otherwise, return a <code>412 Precondition Failed</code> error.</p>\\n         <p>If both of the <code>If-Match</code> and <code>If-Unmodified-Since</code> headers are present in the\\n      request as follows: <code>If-Match</code> condition evaluates to <code>true</code>, and;\\n        <code>If-Unmodified-Since</code> condition evaluates to <code>false</code>; then, S3 returns <code>200\\n        OK</code> and the data requested. </p>\\n         <p>For more information about conditional requests, see <a href=\\\"https://tools.ietf.org/html/rfc7232\\\">RFC 7232</a>.</p>\",\n            \"smithy.api#httpHeader\": \"If-Match\"\n          }\n        },\n        \"IfModifiedSince\": {\n          \"target\": \"com.amazonaws.s3#IfModifiedSince\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Return the object only if it has been modified since the specified time; otherwise, return a\\n        <code>304 Not Modified</code> error.</p>\\n         <p>If both of the <code>If-None-Match</code> and <code>If-Modified-Since</code> headers are present in\\n      the request as follows:<code> If-None-Match</code> condition evaluates to <code>false</code>, and;\\n        <code>If-Modified-Since</code> condition evaluates to <code>true</code>; then, S3 returns <code>304\\n        Not Modified</code> status code.</p>\\n         <p>For more information about conditional requests, see <a href=\\\"https://tools.ietf.org/html/rfc7232\\\">RFC 7232</a>.</p>\",\n            \"smithy.api#httpHeader\": \"If-Modified-Since\"\n          }\n        },\n        \"IfNoneMatch\": {\n          \"target\": \"com.amazonaws.s3#IfNoneMatch\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Return the object only if its entity tag (ETag) is different from the one specified in this header;\\n      otherwise, return a <code>304 Not Modified</code> error.</p>\\n         <p>If both of the <code>If-None-Match</code> and <code>If-Modified-Since</code> headers are present in\\n      the request as follows:<code> If-None-Match</code> condition evaluates to <code>false</code>, and;\\n        <code>If-Modified-Since</code> condition evaluates to <code>true</code>; then, S3 returns <code>304\\n        Not Modified</code> HTTP status code.</p>\\n         <p>For more information about conditional requests, see <a href=\\\"https://tools.ietf.org/html/rfc7232\\\">RFC 7232</a>.</p>\",\n            \"smithy.api#httpHeader\": \"If-None-Match\"\n          }\n        },\n        \"IfUnmodifiedSince\": {\n          \"target\": \"com.amazonaws.s3#IfUnmodifiedSince\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Return the object only if it has not been modified since the specified time; otherwise, return a\\n        <code>412 Precondition Failed</code> error.</p>\\n         <p>If both of the <code>If-Match</code> and <code>If-Unmodified-Since</code> headers are present in the\\n      request as follows: <code>If-Match</code> condition evaluates to <code>true</code>, and;\\n        <code>If-Unmodified-Since</code> condition evaluates to <code>false</code>; then, S3 returns <code>200\\n        OK</code> and the data requested. </p>\\n         <p>For more information about conditional requests, see <a href=\\\"https://tools.ietf.org/html/rfc7232\\\">RFC 7232</a>.</p>\",\n            \"smithy.api#httpHeader\": \"If-Unmodified-Since\"\n          }\n        },\n        \"Key\": {\n          \"target\": \"com.amazonaws.s3#ObjectKey\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Key of the object to get.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Key\"\n            }\n          }\n        },\n        \"Range\": {\n          \"target\": \"com.amazonaws.s3#Range\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Downloads the specified byte range of an object. For more information about the HTTP Range header,\\n      see <a href=\\\"https://www.rfc-editor.org/rfc/rfc9110.html#name-range\\\">https://www.rfc-editor.org/rfc/rfc9110.html#name-range</a>.</p>\\n         <note>\\n            <p>Amazon S3 doesn't support retrieving multiple ranges of data per <code>GET</code> request.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"Range\"\n          }\n        },\n        \"ResponseCacheControl\": {\n          \"target\": \"com.amazonaws.s3#ResponseCacheControl\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Sets the <code>Cache-Control</code> header of the response.</p>\",\n            \"smithy.api#httpQuery\": \"response-cache-control\"\n          }\n        },\n        \"ResponseContentDisposition\": {\n          \"target\": \"com.amazonaws.s3#ResponseContentDisposition\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Sets the <code>Content-Disposition</code> header of the response.</p>\",\n            \"smithy.api#httpQuery\": \"response-content-disposition\"\n          }\n        },\n        \"ResponseContentEncoding\": {\n          \"target\": \"com.amazonaws.s3#ResponseContentEncoding\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Sets the <code>Content-Encoding</code> header of the response.</p>\",\n            \"smithy.api#httpQuery\": \"response-content-encoding\"\n          }\n        },\n        \"ResponseContentLanguage\": {\n          \"target\": \"com.amazonaws.s3#ResponseContentLanguage\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Sets the <code>Content-Language</code> header of the response.</p>\",\n            \"smithy.api#httpQuery\": \"response-content-language\"\n          }\n        },\n        \"ResponseContentType\": {\n          \"target\": \"com.amazonaws.s3#ResponseContentType\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Sets the <code>Content-Type</code> header of the response.</p>\",\n            \"smithy.api#httpQuery\": \"response-content-type\"\n          }\n        },\n        \"ResponseExpires\": {\n          \"target\": \"com.amazonaws.s3#ResponseExpires\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Sets the <code>Expires</code> header of the response.</p>\",\n            \"smithy.api#httpQuery\": \"response-expires\"\n          }\n        },\n        \"VersionId\": {\n          \"target\": \"com.amazonaws.s3#ObjectVersionId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Version ID used to reference a specific version of the object.</p>\\n         <p>By default, the <code>GetObject</code> operation returns the current version of an object. To return\\n      a different version, use the <code>versionId</code> subresource.</p>\\n         <note>\\n            <ul>\\n               <li>\\n                  <p>If you include a <code>versionId</code> in your request header, you must have the\\n              <code>s3:GetObjectVersion</code> permission to access a specific version of an object. The\\n              <code>s3:GetObject</code> permission is not required in this scenario.</p>\\n               </li>\\n               <li>\\n                  <p>If you request the current version of an object without a specific <code>versionId</code> in\\n            the request header, only the <code>s3:GetObject</code> permission is required. The\\n              <code>s3:GetObjectVersion</code> permission is not required in this scenario.</p>\\n               </li>\\n               <li>\\n                  <p>\\n                     <b>Directory buckets</b> - S3 Versioning isn't enabled and supported for directory buckets. For this API operation, only the <code>null</code> value of the version ID is supported by directory buckets.\\n            You can only specify <code>null</code> to the <code>versionId</code> query parameter in the\\n            request.</p>\\n               </li>\\n            </ul>\\n         </note>\\n         <p>For more information about versioning, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketVersioning.html\\\">PutBucketVersioning</a>.</p>\",\n            \"smithy.api#httpQuery\": \"versionId\"\n          }\n        },\n        \"SSECustomerAlgorithm\": {\n          \"target\": \"com.amazonaws.s3#SSECustomerAlgorithm\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the algorithm to use when decrypting the object (for example, <code>AES256</code>).</p>\\n         <p>If you encrypt an object by using server-side encryption with customer-provided encryption keys\\n      (SSE-C) when you store the object in Amazon S3, then when you GET the object, you must use the following\\n      headers:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>x-amz-server-side-encryption-customer-algorithm</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>x-amz-server-side-encryption-customer-key</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>x-amz-server-side-encryption-customer-key-MD5</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>For more information about SSE-C, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/ServerSideEncryptionCustomerKeys.html\\\">Server-Side Encryption (Using\\n        Customer-Provided Encryption Keys)</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption-customer-algorithm\"\n          }\n        },\n        \"SSECustomerKey\": {\n          \"target\": \"com.amazonaws.s3#SSECustomerKey\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the customer-provided encryption key that you originally provided for Amazon S3 to encrypt the\\n      data before storing it. This value is used to decrypt the object when recovering it and must match the\\n      one used when storing the data. The key must be appropriate for use with the algorithm specified in the\\n        <code>x-amz-server-side-encryption-customer-algorithm</code> header.</p>\\n         <p>If you encrypt an object by using server-side encryption with customer-provided encryption keys\\n      (SSE-C) when you store the object in Amazon S3, then when you GET the object, you must use the following\\n      headers:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>x-amz-server-side-encryption-customer-algorithm</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>x-amz-server-side-encryption-customer-key</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>x-amz-server-side-encryption-customer-key-MD5</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>For more information about SSE-C, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/ServerSideEncryptionCustomerKeys.html\\\">Server-Side Encryption (Using\\n        Customer-Provided Encryption Keys)</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption-customer-key\"\n          }\n        },\n        \"SSECustomerKeyMD5\": {\n          \"target\": \"com.amazonaws.s3#SSECustomerKeyMD5\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the 128-bit MD5 digest of the customer-provided encryption key according to RFC 1321. Amazon S3\\n      uses this header for a message integrity check to ensure that the encryption key was transmitted without\\n      error.</p>\\n         <p>If you encrypt an object by using server-side encryption with customer-provided encryption keys\\n      (SSE-C) when you store the object in Amazon S3, then when you GET the object, you must use the following\\n      headers:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>x-amz-server-side-encryption-customer-algorithm</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>x-amz-server-side-encryption-customer-key</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>x-amz-server-side-encryption-customer-key-MD5</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>For more information about SSE-C, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/ServerSideEncryptionCustomerKeys.html\\\">Server-Side Encryption (Using\\n        Customer-Provided Encryption Keys)</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption-customer-key-MD5\"\n          }\n        },\n        \"RequestPayer\": {\n          \"target\": \"com.amazonaws.s3#RequestPayer\",\n          \"traits\": {\n            \"smithy.api#httpHeader\": \"x-amz-request-payer\"\n          }\n        },\n        \"PartNumber\": {\n          \"target\": \"com.amazonaws.s3#PartNumber\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Part number of the object being read. This is a positive integer between 1 and 10,000. Effectively\\n      performs a 'ranged' GET request for the part specified. Useful for downloading just a part of an\\n      object.</p>\",\n            \"smithy.api#httpQuery\": \"partNumber\"\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        },\n        \"ChecksumMode\": {\n          \"target\": \"com.amazonaws.s3#ChecksumMode\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>To retrieve the checksum, this mode must be enabled.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-checksum-mode\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#GetObjectResponseStatusCode\": {\n      \"type\": \"integer\"\n    },\n    \"com.amazonaws.s3#GetObjectRetention\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#GetObjectRetentionRequest\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.s3#GetObjectRetentionOutput\"\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported for directory buckets.</p>\\n         </note>\\n         <p>Retrieves an object's retention settings. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/object-lock.html\\\">Locking Objects</a>.</p>\\n         <p>This functionality is not supported for Amazon S3 on Outposts.</p>\\n         <p>The following action is related to <code>GetObjectRetention</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObjectAttributes.html\\\">GetObjectAttributes</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#http\": {\n          \"method\": \"GET\",\n          \"uri\": \"/{Bucket}/{Key+}?retention\",\n          \"code\": 200\n        }\n      }\n    },\n    \"com.amazonaws.s3#GetObjectRetentionOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Retention\": {\n          \"target\": \"com.amazonaws.s3#ObjectLockRetention\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The container element for an object's retention settings.</p>\",\n            \"smithy.api#httpPayload\": {},\n            \"smithy.api#xmlName\": \"Retention\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#output\": {}\n      }\n    },\n    \"com.amazonaws.s3#GetObjectRetentionRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The bucket name containing the object whose retention settings you want to retrieve. </p>\\n         <p>\\n            <b>Access points</b> - When you use this action with an access point for general purpose buckets, you must provide the alias of the access point in place of the bucket name or specify the access point ARN. When you use this action with an access point for directory buckets, you must provide the access point name in place of the bucket name. When using the access point ARN, you must direct requests to the access point hostname. The access point hostname takes the form <i>AccessPointName</i>-<i>AccountId</i>.s3-accesspoint.<i>Region</i>.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html\\\">Using access points</a> in the <i>Amazon S3 User Guide</i>.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"Key\": {\n          \"target\": \"com.amazonaws.s3#ObjectKey\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The key name for the object whose retention settings you want to retrieve.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {}\n          }\n        },\n        \"VersionId\": {\n          \"target\": \"com.amazonaws.s3#ObjectVersionId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The version ID for the object whose retention settings you want to retrieve.</p>\",\n            \"smithy.api#httpQuery\": \"versionId\"\n          }\n        },\n        \"RequestPayer\": {\n          \"target\": \"com.amazonaws.s3#RequestPayer\",\n          \"traits\": {\n            \"smithy.api#httpHeader\": \"x-amz-request-payer\"\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#GetObjectTagging\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#GetObjectTaggingRequest\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.s3#GetObjectTaggingOutput\"\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported for directory buckets.</p>\\n         </note>\\n         <p>Returns the tag-set of an object. You send the GET request against the tagging subresource\\n      associated with the object.</p>\\n         <p>To use this operation, you must have permission to perform the <code>s3:GetObjectTagging</code>\\n      action. By default, the GET action returns information about current version of an object. For a\\n      versioned bucket, you can have multiple versions of an object in your bucket. To retrieve tags of any\\n      other version, use the versionId query parameter. You also need permission for the\\n        <code>s3:GetObjectVersionTagging</code> action.</p>\\n         <p> By default, the bucket owner has this permission and can grant this permission to others.</p>\\n         <p> For information about the Amazon S3 object tagging feature, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/object-tagging.html\\\">Object Tagging</a>.</p>\\n         <p>The following actions are related to <code>GetObjectTagging</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObjectTagging.html\\\">DeleteObjectTagging</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObjectAttributes.html\\\">GetObjectAttributes</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObjectTagging.html\\\">PutObjectTagging</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#examples\": [\n          {\n            \"title\": \"To retrieve tag set of a specific object version\",\n            \"documentation\": \"The following example retrieves tag set of an object. The request specifies object version.\",\n            \"input\": {\n              \"Bucket\": \"examplebucket\",\n              \"Key\": \"exampleobject\",\n              \"VersionId\": \"ydlaNkwWm0SfKJR.T1b1fIdPRbldTYRI\"\n            },\n            \"output\": {\n              \"VersionId\": \"ydlaNkwWm0SfKJR.T1b1fIdPRbldTYRI\",\n              \"TagSet\": [\n                {\n                  \"Value\": \"Value1\",\n                  \"Key\": \"Key1\"\n                }\n              ]\n            }\n          },\n          {\n            \"title\": \"To retrieve tag set of an object\",\n            \"documentation\": \"The following example retrieves tag set of an object.\",\n            \"input\": {\n              \"Bucket\": \"examplebucket\",\n              \"Key\": \"HappyFace.jpg\"\n            },\n            \"output\": {\n              \"VersionId\": \"null\",\n              \"TagSet\": [\n                {\n                  \"Value\": \"Value4\",\n                  \"Key\": \"Key4\"\n                },\n                {\n                  \"Value\": \"Value3\",\n                  \"Key\": \"Key3\"\n                }\n              ]\n            }\n          }\n        ],\n        \"smithy.api#http\": {\n          \"method\": \"GET\",\n          \"uri\": \"/{Bucket}/{Key+}?tagging\",\n          \"code\": 200\n        }\n      }\n    },\n    \"com.amazonaws.s3#GetObjectTaggingOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"VersionId\": {\n          \"target\": \"com.amazonaws.s3#ObjectVersionId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The versionId of the object for which you got the tagging information.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-version-id\"\n          }\n        },\n        \"TagSet\": {\n          \"target\": \"com.amazonaws.s3#TagSet\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Contains the tag set.</p>\",\n            \"smithy.api#required\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#output\": {},\n        \"smithy.api#xmlName\": \"Tagging\"\n      }\n    },\n    \"com.amazonaws.s3#GetObjectTaggingRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The bucket name containing the object for which to get the tagging information. </p>\\n         <p>\\n            <b>Access points</b> - When you use this action with an access point for general purpose buckets, you must provide the alias of the access point in place of the bucket name or specify the access point ARN. When you use this action with an access point for directory buckets, you must provide the access point name in place of the bucket name. When using the access point ARN, you must direct requests to the access point hostname. The access point hostname takes the form <i>AccessPointName</i>-<i>AccountId</i>.s3-accesspoint.<i>Region</i>.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html\\\">Using access points</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <p>\\n            <b>S3 on Outposts</b> - When you use this action with S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the \\n                     form <code>\\n               <i>AccessPointName</i>-<i>AccountId</i>.<i>outpostID</i>.s3-outposts.<i>Region</i>.amazonaws.com</code>. When you use this action with S3 on Outposts, the destination bucket must be the Outposts access point ARN or the access point alias. For more information about S3 on Outposts, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html\\\">What is S3 on Outposts?</a> in the <i>Amazon S3 User Guide</i>.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"Key\": {\n          \"target\": \"com.amazonaws.s3#ObjectKey\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Object key for which to get the tagging information.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {}\n          }\n        },\n        \"VersionId\": {\n          \"target\": \"com.amazonaws.s3#ObjectVersionId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The versionId of the object for which to get the tagging information.</p>\",\n            \"smithy.api#httpQuery\": \"versionId\"\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        },\n        \"RequestPayer\": {\n          \"target\": \"com.amazonaws.s3#RequestPayer\",\n          \"traits\": {\n            \"smithy.api#httpHeader\": \"x-amz-request-payer\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#GetObjectTorrent\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#GetObjectTorrentRequest\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.s3#GetObjectTorrentOutput\"\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported for directory buckets.</p>\\n         </note>\\n         <p>Returns torrent files from a bucket. BitTorrent can save you bandwidth when you're distributing\\n      large files.</p>\\n         <note>\\n            <p>You can get torrent only for objects that are less than 5 GB in size, and that are not encrypted\\n        using server-side encryption with a customer-provided encryption key.</p>\\n         </note>\\n         <p>To use GET, you must have READ access to the object.</p>\\n         <p>This functionality is not supported for Amazon S3 on Outposts.</p>\\n         <p>The following action is related to <code>GetObjectTorrent</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html\\\">GetObject</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#examples\": [\n          {\n            \"title\": \"To retrieve torrent files for an object\",\n            \"documentation\": \"The following example retrieves torrent files of an object.\",\n            \"input\": {\n              \"Bucket\": \"examplebucket\",\n              \"Key\": \"HappyFace.jpg\"\n            },\n            \"output\": {}\n          }\n        ],\n        \"smithy.api#http\": {\n          \"method\": \"GET\",\n          \"uri\": \"/{Bucket}/{Key+}?torrent\",\n          \"code\": 200\n        }\n      }\n    },\n    \"com.amazonaws.s3#GetObjectTorrentOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Body\": {\n          \"target\": \"com.amazonaws.s3#StreamingBlob\",\n          \"traits\": {\n            \"smithy.api#default\": \"\",\n            \"smithy.api#documentation\": \"<p>A Bencoded dictionary as defined by the BitTorrent specification</p>\",\n            \"smithy.api#httpPayload\": {}\n          }\n        },\n        \"RequestCharged\": {\n          \"target\": \"com.amazonaws.s3#RequestCharged\",\n          \"traits\": {\n            \"smithy.api#httpHeader\": \"x-amz-request-charged\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#output\": {}\n      }\n    },\n    \"com.amazonaws.s3#GetObjectTorrentRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the bucket containing the object for which to get the torrent files.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"Key\": {\n          \"target\": \"com.amazonaws.s3#ObjectKey\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The object key for which to get the information.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {}\n          }\n        },\n        \"RequestPayer\": {\n          \"target\": \"com.amazonaws.s3#RequestPayer\",\n          \"traits\": {\n            \"smithy.api#httpHeader\": \"x-amz-request-payer\"\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#GetPublicAccessBlock\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#GetPublicAccessBlockRequest\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.s3#GetPublicAccessBlockOutput\"\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported for directory buckets.</p>\\n         </note>\\n         <p>Retrieves the <code>PublicAccessBlock</code> configuration for an Amazon S3 bucket. This\\n      operation returns the bucket-level configuration only. To understand the effective public\\n      access behavior, you must also consider account-level settings (which may inherit from\\n      organization-level policies). To use this operation, you must have the\\n        <code>s3:GetBucketPublicAccessBlock</code> permission. For more information about Amazon S3\\n      permissions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/using-with-s3-actions.html\\\">Specifying Permissions in a\\n        Policy</a>.</p>\\n         <important>\\n            <p>When Amazon S3 evaluates the <code>PublicAccessBlock</code> configuration for a bucket or an\\n        object, it checks the <code>PublicAccessBlock</code> configuration for both the bucket (or\\n        the bucket that contains the object) and the bucket owner's account. Account-level settings\\n        automatically inherit from organization-level policies when present. If the\\n          <code>PublicAccessBlock</code> settings are different between the bucket and the account,\\n        Amazon S3 uses the most restrictive combination of the bucket-level and account-level\\n        settings.</p>\\n         </important>\\n         <p>For more information about when Amazon S3 considers a bucket or an object public, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/access-control-block-public-access.html#access-control-block-public-access-policy-status\\\">The Meaning of \\\"Public\\\"</a>.</p>\\n         <p>The following operations are related to <code>GetPublicAccessBlock</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/access-control-block-public-access.html\\\">Using Amazon S3 Block Public Access</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutPublicAccessBlock.html\\\">PutPublicAccessBlock</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetPublicAccessBlock.html\\\">GetPublicAccessBlock</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeletePublicAccessBlock.html\\\">DeletePublicAccessBlock</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#http\": {\n          \"method\": \"GET\",\n          \"uri\": \"/{Bucket}?publicAccessBlock\",\n          \"code\": 200\n        },\n        \"smithy.rules#staticContextParams\": {\n          \"UseS3ExpressControlEndpoint\": {\n            \"value\": true\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#GetPublicAccessBlockOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"PublicAccessBlockConfiguration\": {\n          \"target\": \"com.amazonaws.s3#PublicAccessBlockConfiguration\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The <code>PublicAccessBlock</code> configuration currently in effect for this Amazon S3 bucket.</p>\",\n            \"smithy.api#httpPayload\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#output\": {}\n      }\n    },\n    \"com.amazonaws.s3#GetPublicAccessBlockRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the Amazon S3 bucket whose <code>PublicAccessBlock</code> configuration you want to retrieve.\\n    </p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#GlacierJobParameters\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Tier\": {\n          \"target\": \"com.amazonaws.s3#Tier\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Retrieval tier at which the restore will be processed.</p>\",\n            \"smithy.api#required\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Container for S3 Glacier job parameters.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#Grant\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Grantee\": {\n          \"target\": \"com.amazonaws.s3#Grantee\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The person being granted permissions.</p>\",\n            \"smithy.api#xmlNamespace\": {\n              \"uri\": \"http://www.w3.org/2001/XMLSchema-instance\",\n              \"prefix\": \"xsi\"\n            }\n          }\n        },\n        \"Permission\": {\n          \"target\": \"com.amazonaws.s3#Permission\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the permission given to the grantee.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Container for grant information.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#GrantFullControl\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#GrantRead\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#GrantReadACP\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#GrantWrite\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#GrantWriteACP\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#Grantee\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"DisplayName\": {\n          \"target\": \"com.amazonaws.s3#DisplayName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p></p>\"\n          }\n        },\n        \"EmailAddress\": {\n          \"target\": \"com.amazonaws.s3#EmailAddress\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p></p>\"\n          }\n        },\n        \"ID\": {\n          \"target\": \"com.amazonaws.s3#ID\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The canonical user ID of the grantee.</p>\"\n          }\n        },\n        \"URI\": {\n          \"target\": \"com.amazonaws.s3#URI\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>URI of the grantee group.</p>\"\n          }\n        },\n        \"Type\": {\n          \"target\": \"com.amazonaws.s3#Type\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Type of grantee</p>\",\n            \"smithy.api#required\": {},\n            \"smithy.api#xmlAttribute\": {},\n            \"smithy.api#xmlName\": \"xsi:type\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Container for the person being granted permissions.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#Grants\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.s3#Grant\",\n        \"traits\": {\n          \"smithy.api#xmlName\": \"Grant\"\n        }\n      }\n    },\n    \"com.amazonaws.s3#HeadBucket\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#HeadBucketRequest\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.s3#HeadBucketOutput\"\n      },\n      \"errors\": [\n        {\n          \"target\": \"com.amazonaws.s3#NotFound\"\n        }\n      ],\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>You can use this operation to determine if a bucket exists and if you have permission to access it.\\n      The action returns a <code>200 OK</code> HTTP status code if the bucket exists and you have \\n      permission to access it. You can make a <code>HeadBucket</code> call on any bucket name to any \\n      Region in the partition, and regardless of the permissions on the bucket, you will receive a \\n      response header with the correct bucket location so that you can then make a proper, signed request \\n      to the appropriate Regional endpoint.</p>\\n         <note>\\n            <p>If the bucket doesn't exist or you don't have permission to access it, the <code>HEAD</code> \\n        request returns a generic <code>400 Bad Request</code>, <code>403 Forbidden</code>, or \\n        <code>404 Not Found</code> HTTP status code. A message body isn't included, so you can't determine \\n        the exception beyond these HTTP response codes.</p>\\n         </note>\\n         <dl>\\n            <dt>Authentication and authorization</dt>\\n            <dd>\\n               <p>\\n                  <b>General purpose buckets</b> - Request to public buckets that\\n            grant the s3:ListBucket permission publicly do not need to be signed. All other\\n              <code>HeadBucket</code> requests must be authenticated and signed by using IAM credentials\\n            (access key ID and secret access key for the IAM identities). All headers with the\\n              <code>x-amz-</code> prefix, including <code>x-amz-copy-source</code>, must be signed. For more\\n            information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html\\\">REST Authentication</a>.</p>\\n               <p>\\n                  <b>Directory buckets</b> - You must use IAM credentials to\\n            authenticate and authorize your access to the <code>HeadBucket</code> API operation, instead of\\n            using the temporary security credentials through the <code>CreateSession</code> API\\n            operation.</p>\\n               <p>Amazon Web Services CLI or SDKs handles authentication and authorization on your behalf.</p>\\n            </dd>\\n            <dt>Permissions</dt>\\n            <dd>\\n               <p></p>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <b>General purpose bucket permissions</b> - To use this\\n                operation, you must have permissions to perform the <code>s3:ListBucket</code> action. The\\n                bucket owner has this permission by default and can grant this permission to others. For more\\n                information about permissions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html\\\">Managing access permissions to your\\n                  Amazon S3 resources</a> in the <i>Amazon S3 User Guide</i>.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <b>Directory bucket permissions</b> - You must have the\\n                  <b>\\n                           <code>s3express:CreateSession</code>\\n                        </b> permission in the\\n                  <code>Action</code> element of a policy. By default, the session is in the\\n                  <code>ReadWrite</code> mode. If you want to restrict the access, you can explicitly set the\\n                  <code>s3express:SessionMode</code> condition key to <code>ReadOnly</code> on the\\n                bucket.</p>\\n                     <p>For more information about example bucket policies, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-security-iam-example-bucket-policies.html\\\">Example\\n                  bucket policies for S3 Express One Zone</a> and <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-security-iam-identity-policies.html\\\">Amazon Web Services\\n                  Identity and Access Management (IAM) identity-based policies for S3 Express One Zone</a> in the\\n                  <i>Amazon S3 User Guide</i>.</p>\\n                  </li>\\n               </ul>\\n            </dd>\\n            <dt>HTTP Host header syntax</dt>\\n            <dd>\\n               <p>\\n                  <b>Directory buckets </b> - The HTTP Host header syntax is <code>\\n                     <i>Bucket-name</i>.s3express-<i>zone-id</i>.<i>region-code</i>.amazonaws.com</code>.</p>\\n               <note>\\n                  <p>You must make requests for this API operation to the Zonal endpoint. These endpoints support virtual-hosted-style requests in the format <code>https://<i>bucket-name</i>.s3express-<i>zone-id</i>.<i>region-code</i>.amazonaws.com</code>. Path-style requests are not supported. For more information about endpoints in Availability Zones, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/endpoint-directory-buckets-AZ.html\\\">Regional and Zonal endpoints for directory buckets in Availability Zones</a> in the\\n    <i>Amazon S3 User Guide</i>. For more information about endpoints in Local Zones, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-lzs-for-directory-buckets.html\\\">Concepts for directory buckets in Local Zones</a> in the\\n    <i>Amazon S3 User Guide</i>.</p>\\n               </note>\\n            </dd>\\n         </dl>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#examples\": [\n          {\n            \"title\": \"To determine if bucket exists\",\n            \"documentation\": \"This operation checks to see if a bucket exists.\",\n            \"input\": {\n              \"Bucket\": \"acl1\"\n            }\n          }\n        ],\n        \"smithy.api#http\": {\n          \"method\": \"HEAD\",\n          \"uri\": \"/{Bucket}\",\n          \"code\": 200\n        },\n        \"smithy.waiters#waitable\": {\n          \"BucketExists\": {\n            \"acceptors\": [\n              {\n                \"state\": \"success\",\n                \"matcher\": {\n                  \"success\": true\n                }\n              },\n              {\n                \"state\": \"retry\",\n                \"matcher\": {\n                  \"errorType\": \"NotFound\"\n                }\n              }\n            ],\n            \"minDelay\": 5\n          },\n          \"BucketNotExists\": {\n            \"acceptors\": [\n              {\n                \"state\": \"success\",\n                \"matcher\": {\n                  \"errorType\": \"NotFound\"\n                }\n              }\n            ],\n            \"minDelay\": 5\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#HeadBucketOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"BucketArn\": {\n          \"target\": \"com.amazonaws.s3#S3RegionalOrS3ExpressBucketArnString\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the S3 bucket. ARNs uniquely identify Amazon Web Services resources across all\\n      of Amazon Web Services.</p>\\n         <note>\\n            <p>This parameter is only supported for S3 directory buckets. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-buckets-tagging.html\\\">Using tags with\\n          directory buckets</a>.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-bucket-arn\"\n          }\n        },\n        \"BucketLocationType\": {\n          \"target\": \"com.amazonaws.s3#LocationType\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The type of location where the bucket is created.</p>\\n         <note>\\n            <p>This functionality is only supported by directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-bucket-location-type\"\n          }\n        },\n        \"BucketLocationName\": {\n          \"target\": \"com.amazonaws.s3#BucketLocationName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the location where the bucket will be created.</p>\\n         <p>For directory buckets, the Zone ID of the Availability Zone or the Local Zone where the bucket is created. An example\\n      Zone ID value for an Availability Zone is <code>usw2-az1</code>.</p>\\n         <note>\\n            <p>This functionality is only supported by directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-bucket-location-name\"\n          }\n        },\n        \"BucketRegion\": {\n          \"target\": \"com.amazonaws.s3#Region\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Region that the bucket is located.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-bucket-region\"\n          }\n        },\n        \"AccessPointAlias\": {\n          \"target\": \"com.amazonaws.s3#AccessPointAlias\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Indicates whether the bucket name used in the request is an access point alias.</p>\\n         <note>\\n            <p>For directory buckets, the value of this field is <code>false</code>.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-access-point-alias\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#output\": {}\n      }\n    },\n    \"com.amazonaws.s3#HeadBucketRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The bucket name.</p>\\n         <p>\\n            <b>Directory buckets</b> - When you use this operation with a directory bucket, you must use virtual-hosted-style requests in the format <code>\\n               <i>Bucket-name</i>.s3express-<i>zone-id</i>.<i>region-code</i>.amazonaws.com</code>. Path-style requests are not supported.  Directory bucket names must be unique in the chosen Zone (Availability Zone or Local Zone). Bucket names must follow the format <code>\\n               <i>bucket-base-name</i>--<i>zone-id</i>--x-s3</code> (for example, <code>\\n               <i>amzn-s3-demo-bucket</i>--<i>usw2-az1</i>--x-s3</code>). For information about bucket naming\\n         restrictions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-bucket-naming-rules.html\\\">Directory bucket naming\\n            rules</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <p>\\n            <b>Access points</b> - When you use this action with an access point for general purpose buckets, you must provide the alias of the access point in place of the bucket name or specify the access point ARN. When you use this action with an access point for directory buckets, you must provide the access point name in place of the bucket name. When using the access point ARN, you must direct requests to the access point hostname. The access point hostname takes the form <i>AccessPointName</i>-<i>AccountId</i>.s3-accesspoint.<i>Region</i>.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html\\\">Using access points</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <p>\\n            <b>Object Lambda access points</b> - When you use this API operation with an Object Lambda access point, provide the alias of the Object Lambda access point in place of the bucket name. \\nIf the Object Lambda access point alias in a request is not valid, the error code <code>InvalidAccessPointAliasError</code> is returned. \\nFor more information about <code>InvalidAccessPointAliasError</code>, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html#ErrorCodeList\\\">List of\\n            Error Codes</a>.</p>\\n         <note>\\n            <p>Object Lambda access points are not supported by directory buckets.</p>\\n         </note>\\n         <p>\\n            <b>S3 on Outposts</b> - When you use this action with S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the \\n                     form <code>\\n               <i>AccessPointName</i>-<i>AccountId</i>.<i>outpostID</i>.s3-outposts.<i>Region</i>.amazonaws.com</code>. When you use this action with S3 on Outposts, the destination bucket must be the Outposts access point ARN or the access point alias. For more information about S3 on Outposts, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html\\\">What is S3 on Outposts?</a> in the <i>Amazon S3 User Guide</i>.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#HeadObject\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#HeadObjectRequest\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.s3#HeadObjectOutput\"\n      },\n      \"errors\": [\n        {\n          \"target\": \"com.amazonaws.s3#NotFound\"\n        }\n      ],\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>The <code>HEAD</code> operation retrieves metadata from an object without returning the object\\n      itself. This operation is useful if you're interested only in an object's metadata.</p>\\n         <note>\\n            <p>A <code>HEAD</code> request has the same options as a <code>GET</code> operation on an object. The\\n        response is identical to the <code>GET</code> response except that there is no response body. Because\\n        of this, if the <code>HEAD</code> request generates an error, it returns a generic code, such as\\n          <code>400 Bad Request</code>, <code>403 Forbidden</code>, <code>404 Not Found</code>, <code>405\\n          Method Not Allowed</code>, <code>412 Precondition Failed</code>, or <code>304 Not Modified</code>.\\n        It's not possible to retrieve the exact exception of these error codes.</p>\\n         </note>\\n         <p>Request headers are limited to 8 KB in size. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/RESTCommonRequestHeaders.html\\\">Common Request Headers</a>.</p>\\n         <dl>\\n            <dt>Permissions</dt>\\n            <dd>\\n               <p></p>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <b>General purpose bucket permissions</b> - To use\\n                  <code>HEAD</code>, you must have the <code>s3:GetObject</code> permission. You need the\\n                relevant read object (or version) permission for this operation. For more information, see\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/list_amazons3.html\\\">Actions, resources,\\n                  and condition keys for Amazon S3</a> in the <i>Amazon S3 User Guide</i>. For more\\n                information about the permissions to S3 API operations by S3 resource types, see <a href=\\\"/AmazonS3/latest/userguide/using-with-s3-policy-actions.html\\\">Required permissions for\\n                  Amazon S3 API operations</a> in the <i>Amazon S3 User Guide</i>.</p>\\n                     <p>If the object you request doesn't exist, the error that Amazon S3 returns depends on whether\\n                you also have the <code>s3:ListBucket</code> permission.</p>\\n                     <ul>\\n                        <li>\\n                           <p>If you have the <code>s3:ListBucket</code> permission on the bucket, Amazon S3 returns an\\n                    HTTP status code <code>404 Not Found</code> error.</p>\\n                        </li>\\n                        <li>\\n                           <p>If you don’t have the <code>s3:ListBucket</code> permission, Amazon S3 returns an HTTP\\n                    status code <code>403 Forbidden</code> error.</p>\\n                        </li>\\n                     </ul>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <b>Directory bucket permissions</b> - To grant access to this API operation on a directory bucket, we recommend that you use the <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateSession.html\\\">\\n                           <code>CreateSession</code>\\n                        </a> API operation for session-based authorization. Specifically, you grant the <code>s3express:CreateSession</code> permission to the directory bucket in a bucket policy or an IAM identity-based policy. Then, you make the <code>CreateSession</code> API call on the bucket to obtain a session token. With the session token in your request header, you can make API requests to this operation. After the session token expires, you make another <code>CreateSession</code> API call to generate a new session token for use. \\nAmazon Web Services CLI or SDKs create session and refresh the session token automatically to avoid service interruptions when a session expires. For more information about authorization, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateSession.html\\\">\\n                           <code>CreateSession</code>\\n                        </a>.</p>\\n                     <p>If you enable <code>x-amz-checksum-mode</code> in the request and the object is encrypted\\n                with Amazon Web Services Key Management Service (Amazon Web Services KMS), you must also have the\\n                  <code>kms:GenerateDataKey</code> and <code>kms:Decrypt</code> permissions in IAM\\n                identity-based policies and KMS key policies for the KMS key to retrieve the checksum of\\n                the object.</p>\\n                  </li>\\n               </ul>\\n            </dd>\\n            <dt>Encryption</dt>\\n            <dd>\\n               <note>\\n                  <p>Encryption request headers, like <code>x-amz-server-side-encryption</code>, should not be\\n              sent for <code>HEAD</code> requests if your object uses server-side encryption with Key Management Service\\n              (KMS) keys (SSE-KMS), dual-layer server-side encryption with Amazon Web Services KMS keys (DSSE-KMS), or\\n              server-side encryption with Amazon S3 managed encryption keys (SSE-S3). The\\n                <code>x-amz-server-side-encryption</code> header is used when you <code>PUT</code> an object\\n              to S3 and want to specify the encryption method. If you include this header in a\\n                <code>HEAD</code> request for an object that uses these types of keys, you’ll get an HTTP\\n                <code>400 Bad Request</code> error. It's because the encryption method can't be changed when\\n              you retrieve the object.</p>\\n               </note>\\n               <p>If you encrypt an object by using server-side encryption with customer-provided encryption\\n            keys (SSE-C) when you store the object in Amazon S3, then when you retrieve the metadata from the\\n            object, you must use the following headers to provide the encryption key for the server to be able\\n            to retrieve the object's metadata. The headers are: </p>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <code>x-amz-server-side-encryption-customer-algorithm</code>\\n                     </p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <code>x-amz-server-side-encryption-customer-key</code>\\n                     </p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <code>x-amz-server-side-encryption-customer-key-MD5</code>\\n                     </p>\\n                  </li>\\n               </ul>\\n               <p>For more information about SSE-C, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/ServerSideEncryptionCustomerKeys.html\\\">Server-Side Encryption (Using\\n              Customer-Provided Encryption Keys)</a> in the <i>Amazon S3 User Guide</i>.</p>\\n               <note>\\n                  <p>\\n                     <b>Directory bucket </b> -\\n              For directory buckets, there are only two supported options for server-side encryption: SSE-S3 and SSE-KMS. SSE-C isn't supported. For more\\n         information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-serv-side-encryption.html\\\">Protecting data with server-side encryption</a> in the <i>Amazon S3 User Guide</i>. </p>\\n               </note>\\n            </dd>\\n            <dt>Versioning</dt>\\n            <dd>\\n               <ul>\\n                  <li>\\n                     <p>If the current version of the object is a delete marker, Amazon S3 behaves as if the object was\\n                deleted and includes <code>x-amz-delete-marker: true</code> in the response.</p>\\n                  </li>\\n                  <li>\\n                     <p>If the specified version is a delete marker, the response returns a <code>405 Method Not\\n                  Allowed</code> error and the <code>Last-Modified: timestamp</code> response header.</p>\\n                  </li>\\n               </ul>\\n               <note>\\n                  <ul>\\n                     <li>\\n                        <p>\\n                           <b>Directory buckets</b> -\\n                  Delete marker is not supported for directory buckets.</p>\\n                     </li>\\n                     <li>\\n                        <p>\\n                           <b>Directory buckets</b> -\\n                  S3 Versioning isn't enabled and supported for directory buckets. For this API operation, only the <code>null</code> value of the version ID is supported by directory buckets. You can only specify <code>null</code> to the\\n                    <code>versionId</code> query parameter in the request.</p>\\n                     </li>\\n                  </ul>\\n               </note>\\n            </dd>\\n            <dt>HTTP Host header syntax</dt>\\n            <dd>\\n               <p>\\n                  <b>Directory buckets </b> - The HTTP Host header syntax is <code>\\n                     <i>Bucket-name</i>.s3express-<i>zone-id</i>.<i>region-code</i>.amazonaws.com</code>.</p>\\n               <note>\\n                  <p>For directory buckets, you must make requests for this API operation to the Zonal endpoint. These endpoints support virtual-hosted-style requests in the format <code>https://<i>amzn-s3-demo-bucket</i>.s3express-<i>zone-id</i>.<i>region-code</i>.amazonaws.com/<i>key-name</i>\\n                     </code>. Path-style requests are not supported. For more information about endpoints in Availability Zones, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/endpoint-directory-buckets-AZ.html\\\">Regional and Zonal endpoints for directory buckets in Availability Zones</a> in the\\n    <i>Amazon S3 User Guide</i>. For more information about endpoints in Local Zones, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-lzs-for-directory-buckets.html\\\">Concepts for directory buckets in Local Zones</a> in the\\n    <i>Amazon S3 User Guide</i>.</p>\\n               </note>\\n            </dd>\\n         </dl>\\n         <p>The following actions are related to <code>HeadObject</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html\\\">GetObject</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObjectAttributes.html\\\">GetObjectAttributes</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#examples\": [\n          {\n            \"title\": \"To retrieve metadata of an object without returning the object itself\",\n            \"documentation\": \"The following example retrieves an object metadata.\",\n            \"input\": {\n              \"Bucket\": \"examplebucket\",\n              \"Key\": \"HappyFace.jpg\"\n            },\n            \"output\": {\n              \"AcceptRanges\": \"bytes\",\n              \"ContentType\": \"image/jpeg\",\n              \"LastModified\": \"2016-12-15T01:19:41.000Z\",\n              \"ContentLength\": 3191,\n              \"VersionId\": \"null\",\n              \"ETag\": \"\\\"6805f2cfc46c0f04559748bb039d69ae\\\"\",\n              \"Metadata\": {}\n            }\n          }\n        ],\n        \"smithy.api#http\": {\n          \"method\": \"HEAD\",\n          \"uri\": \"/{Bucket}/{Key+}\",\n          \"code\": 200\n        },\n        \"smithy.waiters#waitable\": {\n          \"ObjectExists\": {\n            \"acceptors\": [\n              {\n                \"state\": \"success\",\n                \"matcher\": {\n                  \"success\": true\n                }\n              },\n              {\n                \"state\": \"retry\",\n                \"matcher\": {\n                  \"errorType\": \"NotFound\"\n                }\n              }\n            ],\n            \"minDelay\": 5\n          },\n          \"ObjectNotExists\": {\n            \"acceptors\": [\n              {\n                \"state\": \"success\",\n                \"matcher\": {\n                  \"errorType\": \"NotFound\"\n                }\n              }\n            ],\n            \"minDelay\": 5\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#HeadObjectOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"DeleteMarker\": {\n          \"target\": \"com.amazonaws.s3#DeleteMarker\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies whether the object retrieved was (true) or was not (false) a Delete Marker. If false, this\\n      response header does not appear in the response.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-delete-marker\"\n          }\n        },\n        \"AcceptRanges\": {\n          \"target\": \"com.amazonaws.s3#AcceptRanges\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Indicates that a range of bytes was specified.</p>\",\n            \"smithy.api#httpHeader\": \"accept-ranges\"\n          }\n        },\n        \"Expiration\": {\n          \"target\": \"com.amazonaws.s3#Expiration\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>If the object expiration is configured (see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketLifecycleConfiguration.html\\\">\\n               <code>PutBucketLifecycleConfiguration</code>\\n            </a>), the response includes this header. It\\n      includes the <code>expiry-date</code> and <code>rule-id</code> key-value pairs providing object\\n      expiration information. The value of the <code>rule-id</code> is URL-encoded.</p>\\n         <note>\\n            <p>Object expiration information is not returned in directory buckets and this header returns the\\n        value \\\"<code>NotImplemented</code>\\\" in all responses for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-expiration\"\n          }\n        },\n        \"Restore\": {\n          \"target\": \"com.amazonaws.s3#Restore\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>If the object is an archived object (an object whose storage class is GLACIER), the response\\n      includes this header if either the archive restoration is in progress (see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_RestoreObject.html\\\">RestoreObject</a> or an archive copy is already\\n      restored.</p>\\n         <p> If an archive copy is already restored, the header value indicates when Amazon S3 is scheduled to delete\\n      the object copy. For example:</p>\\n         <p>\\n            <code>x-amz-restore: ongoing-request=\\\"false\\\", expiry-date=\\\"Fri, 21 Dec 2012 00:00:00\\n      GMT\\\"</code>\\n         </p>\\n         <p>If the object restoration is in progress, the header returns the value\\n        <code>ongoing-request=\\\"true\\\"</code>.</p>\\n         <p>For more information about archiving objects, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/object-lifecycle-mgmt.html#lifecycle-transition-general-considerations\\\">Transitioning Objects: General Considerations</a>.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets. Directory buckets only support <code>EXPRESS_ONEZONE</code> (the S3 Express One Zone storage class) in Availability Zones and <code>ONEZONE_IA</code> (the S3 One Zone-Infrequent Access storage class) in Dedicated Local Zones.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-restore\"\n          }\n        },\n        \"ArchiveStatus\": {\n          \"target\": \"com.amazonaws.s3#ArchiveStatus\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The archive state of the head object.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-archive-status\"\n          }\n        },\n        \"LastModified\": {\n          \"target\": \"com.amazonaws.s3#LastModified\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Date and time when the object was last modified.</p>\",\n            \"smithy.api#httpHeader\": \"Last-Modified\"\n          }\n        },\n        \"ContentLength\": {\n          \"target\": \"com.amazonaws.s3#ContentLength\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Size of the body in bytes.</p>\",\n            \"smithy.api#httpHeader\": \"Content-Length\"\n          }\n        },\n        \"ChecksumCRC32\": {\n          \"target\": \"com.amazonaws.s3#ChecksumCRC32\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Base64 encoded, 32-bit <code>CRC32 checksum</code> of the object. This checksum is only present if the checksum was uploaded\\n    with the object. When you use an API operation on an object that was uploaded using multipart uploads, this value may not be a direct checksum value of the full object. Instead, it's a calculation based on the checksum values of each individual part. For more information about how checksums are calculated\\n    with multipart uploads, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html#large-object-checksums\\\">\\n    Checking object integrity</a> in the <i>Amazon S3 User Guide</i>.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-checksum-crc32\"\n          }\n        },\n        \"ChecksumCRC32C\": {\n          \"target\": \"com.amazonaws.s3#ChecksumCRC32C\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Base64 encoded, 32-bit <code>CRC32C</code> checksum of the object. This checksum is only present if the checksum was uploaded\\n    with the object. When you use an API operation on an object that was uploaded using multipart uploads, this value may not be a direct checksum value of the full object. Instead, it's a calculation based on the checksum values of each individual part. For more information about how checksums are calculated\\n    with multipart uploads, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html#large-object-checksums\\\">\\n    Checking object integrity</a> in the <i>Amazon S3 User Guide</i>.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-checksum-crc32c\"\n          }\n        },\n        \"ChecksumCRC64NVME\": {\n          \"target\": \"com.amazonaws.s3#ChecksumCRC64NVME\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Base64 encoded, 64-bit <code>CRC64NVME</code> checksum of the object. For more information, see\\n        <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking\\n        object integrity in the Amazon S3 User Guide</a>.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-checksum-crc64nvme\"\n          }\n        },\n        \"ChecksumSHA1\": {\n          \"target\": \"com.amazonaws.s3#ChecksumSHA1\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Base64 encoded, 160-bit <code>SHA1</code> digest of the object. This checksum is only present if the checksum was uploaded\\n    with the object. When you use the API operation on an object that was uploaded using multipart uploads, this value may not be a direct checksum value of the full object. Instead, it's a calculation based on the checksum values of each individual part. For more information about how checksums are calculated\\n    with multipart uploads, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html#large-object-checksums\\\">\\n    Checking object integrity</a> in the <i>Amazon S3 User Guide</i>.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-checksum-sha1\"\n          }\n        },\n        \"ChecksumSHA256\": {\n          \"target\": \"com.amazonaws.s3#ChecksumSHA256\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Base64 encoded, 256-bit <code>SHA256</code> digest of the object. This checksum is only present if the checksum was uploaded\\n    with the object. When you use an API operation on an object that was uploaded using multipart uploads, this value may not be a direct checksum value of the full object. Instead, it's a calculation based on the checksum values of each individual part. For more information about how checksums are calculated\\n    with multipart uploads, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html#large-object-checksums\\\">\\n    Checking object integrity</a> in the <i>Amazon S3 User Guide</i>.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-checksum-sha256\"\n          }\n        },\n        \"ChecksumType\": {\n          \"target\": \"com.amazonaws.s3#ChecksumType\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The checksum type, which determines how part-level checksums are combined to create an object-level\\n      checksum for multipart objects. You can use this header response to verify that the checksum type that\\n      is received is the same checksum type that was specified in <code>CreateMultipartUpload</code> request.\\n      For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking object integrity in the Amazon S3\\n        User Guide</a>.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-checksum-type\"\n          }\n        },\n        \"ETag\": {\n          \"target\": \"com.amazonaws.s3#ETag\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>An entity tag (ETag) is an opaque identifier assigned by a web server to a specific version of a\\n      resource found at a URL.</p>\",\n            \"smithy.api#httpHeader\": \"ETag\"\n          }\n        },\n        \"MissingMeta\": {\n          \"target\": \"com.amazonaws.s3#MissingMeta\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>This is set to the number of metadata entries not returned in <code>x-amz-meta</code> headers. This\\n      can happen if you create metadata using an API like SOAP that supports more flexible metadata than the\\n      REST API. For example, using SOAP, you can create metadata whose values are not legal HTTP\\n      headers.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-missing-meta\"\n          }\n        },\n        \"VersionId\": {\n          \"target\": \"com.amazonaws.s3#ObjectVersionId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Version ID of the object.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-version-id\"\n          }\n        },\n        \"CacheControl\": {\n          \"target\": \"com.amazonaws.s3#CacheControl\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies caching behavior along the request/reply chain.</p>\",\n            \"smithy.api#httpHeader\": \"Cache-Control\"\n          }\n        },\n        \"ContentDisposition\": {\n          \"target\": \"com.amazonaws.s3#ContentDisposition\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies presentational information for the object.</p>\",\n            \"smithy.api#httpHeader\": \"Content-Disposition\"\n          }\n        },\n        \"ContentEncoding\": {\n          \"target\": \"com.amazonaws.s3#ContentEncoding\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Indicates what content encodings have been applied to the object and thus what decoding mechanisms\\n      must be applied to obtain the media-type referenced by the Content-Type header field.</p>\",\n            \"smithy.api#httpHeader\": \"Content-Encoding\"\n          }\n        },\n        \"ContentLanguage\": {\n          \"target\": \"com.amazonaws.s3#ContentLanguage\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The language the content is in.</p>\",\n            \"smithy.api#httpHeader\": \"Content-Language\"\n          }\n        },\n        \"ContentType\": {\n          \"target\": \"com.amazonaws.s3#ContentType\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A standard MIME type describing the format of the object data.</p>\",\n            \"smithy.api#httpHeader\": \"Content-Type\"\n          }\n        },\n        \"ContentRange\": {\n          \"target\": \"com.amazonaws.s3#ContentRange\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The portion of the object returned in the response for a <code>GET</code> request.</p>\",\n            \"smithy.api#httpHeader\": \"Content-Range\"\n          }\n        },\n        \"Expires\": {\n          \"target\": \"com.amazonaws.s3#Expires\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The date and time at which the object is no longer cacheable.</p>\",\n            \"smithy.api#httpHeader\": \"Expires\"\n          }\n        },\n        \"WebsiteRedirectLocation\": {\n          \"target\": \"com.amazonaws.s3#WebsiteRedirectLocation\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>If the bucket is configured as a website, redirects requests for this object to another object in\\n      the same bucket or to an external URL. Amazon S3 stores the value of this header in the object\\n      metadata.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-website-redirect-location\"\n          }\n        },\n        \"ServerSideEncryption\": {\n          \"target\": \"com.amazonaws.s3#ServerSideEncryption\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The server-side encryption algorithm used when you store this object in Amazon S3 or Amazon FSx.</p>\\n         <note>\\n            <p>When accessing data stored in Amazon FSx file systems using S3 access points, the only valid server side\\n        encryption option is <code>aws:fsx</code>.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption\"\n          }\n        },\n        \"Metadata\": {\n          \"target\": \"com.amazonaws.s3#Metadata\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A map of metadata to store with the object in S3.</p>\",\n            \"smithy.api#httpPrefixHeaders\": \"x-amz-meta-\"\n          }\n        },\n        \"SSECustomerAlgorithm\": {\n          \"target\": \"com.amazonaws.s3#SSECustomerAlgorithm\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>If server-side encryption with a customer-provided encryption key was requested, the response will\\n      include this header to confirm the encryption algorithm that's used.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption-customer-algorithm\"\n          }\n        },\n        \"SSECustomerKeyMD5\": {\n          \"target\": \"com.amazonaws.s3#SSECustomerKeyMD5\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>If server-side encryption with a customer-provided encryption key was requested, the response will\\n      include this header to provide the round-trip message integrity verification of the customer-provided\\n      encryption key.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption-customer-key-MD5\"\n          }\n        },\n        \"SSEKMSKeyId\": {\n          \"target\": \"com.amazonaws.s3#SSEKMSKeyId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>If present, indicates the ID of the KMS key that was used for object encryption.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption-aws-kms-key-id\"\n          }\n        },\n        \"BucketKeyEnabled\": {\n          \"target\": \"com.amazonaws.s3#BucketKeyEnabled\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Indicates whether the object uses an S3 Bucket Key for server-side encryption with Key Management Service (KMS)\\n      keys (SSE-KMS).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption-bucket-key-enabled\"\n          }\n        },\n        \"StorageClass\": {\n          \"target\": \"com.amazonaws.s3#StorageClass\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Provides storage class information of the object. Amazon S3 returns this header for all objects except\\n      for S3 Standard storage class objects.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/storage-class-intro.html\\\">Storage Classes</a>.</p>\\n         <note>\\n            <p>\\n               <b>Directory buckets </b> -\\n        Directory buckets only support <code>EXPRESS_ONEZONE</code> (the S3 Express One Zone storage class) in Availability Zones and <code>ONEZONE_IA</code> (the S3 One Zone-Infrequent Access storage class) in Dedicated Local Zones.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-storage-class\"\n          }\n        },\n        \"RequestCharged\": {\n          \"target\": \"com.amazonaws.s3#RequestCharged\",\n          \"traits\": {\n            \"smithy.api#httpHeader\": \"x-amz-request-charged\"\n          }\n        },\n        \"ReplicationStatus\": {\n          \"target\": \"com.amazonaws.s3#ReplicationStatus\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Amazon S3 can return this header if your request involves a bucket that is either a source or a\\n      destination in a replication rule.</p>\\n         <p>In replication, you have a source bucket on which you configure replication and destination bucket\\n      or buckets where Amazon S3 stores object replicas. When you request an object (<code>GetObject</code>) or\\n      object metadata (<code>HeadObject</code>) from these buckets, Amazon S3 will return the\\n        <code>x-amz-replication-status</code> header in the response as follows:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <b>If requesting an object from the source bucket</b>, Amazon S3 will\\n          return the <code>x-amz-replication-status</code> header if the object in your request is eligible\\n          for replication.</p>\\n               <p> For example, suppose that in your replication configuration, you specify object prefix\\n            <code>TaxDocs</code> requesting Amazon S3 to replicate objects with key prefix <code>TaxDocs</code>.\\n          Any objects you upload with this key name prefix, for example <code>TaxDocs/document1.pdf</code>,\\n          are eligible for replication. For any object request with this key name prefix, Amazon S3 will return the\\n            <code>x-amz-replication-status</code> header with value PENDING, COMPLETED or FAILED indicating\\n          object replication status.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>If requesting an object from a destination bucket</b>, Amazon S3 will\\n          return the <code>x-amz-replication-status</code> header with value REPLICA if the object in your\\n          request is a replica that Amazon S3 created and there is no replica modification replication in\\n          progress.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>When replicating objects to multiple destination buckets</b>, the\\n            <code>x-amz-replication-status</code> header acts differently. The header of the source object\\n          will only return a value of COMPLETED when replication is successful to all destinations. The header\\n          will remain at value PENDING until replication has completed for all destinations. If one or more\\n          destinations fails replication the header will return FAILED. </p>\\n            </li>\\n         </ul>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/NotificationHowTo.html\\\">Replication</a>.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-replication-status\"\n          }\n        },\n        \"PartsCount\": {\n          \"target\": \"com.amazonaws.s3#PartsCount\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The count of parts this object has. This value is only returned if you specify\\n        <code>partNumber</code> in your request and the object was uploaded as a multipart upload.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-mp-parts-count\"\n          }\n        },\n        \"TagCount\": {\n          \"target\": \"com.amazonaws.s3#TagCount\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The number of tags, if any, on the object, when you have the relevant permission to read object\\n      tags.</p>\\n         <p>You can use <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObjectTagging.html\\\">GetObjectTagging</a> to retrieve the tag set associated with an object.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-tagging-count\"\n          }\n        },\n        \"ObjectLockMode\": {\n          \"target\": \"com.amazonaws.s3#ObjectLockMode\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Object Lock mode, if any, that's in effect for this object. This header is only returned if the\\n      requester has the <code>s3:GetObjectRetention</code> permission. For more information about S3 Object\\n      Lock, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/object-lock.html\\\">Object Lock</a>. </p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-object-lock-mode\"\n          }\n        },\n        \"ObjectLockRetainUntilDate\": {\n          \"target\": \"com.amazonaws.s3#ObjectLockRetainUntilDate\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The date and time when the Object Lock retention period expires. This header is only returned if the\\n      requester has the <code>s3:GetObjectRetention</code> permission.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-object-lock-retain-until-date\"\n          }\n        },\n        \"ObjectLockLegalHoldStatus\": {\n          \"target\": \"com.amazonaws.s3#ObjectLockLegalHoldStatus\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies whether a legal hold is in effect for this object. This header is only returned if the\\n      requester has the <code>s3:GetObjectLegalHold</code> permission. This header is not returned if the\\n      specified version of this object has never had a legal hold applied. For more information about S3\\n      Object Lock, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/object-lock.html\\\">Object\\n        Lock</a>.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-object-lock-legal-hold\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#output\": {}\n      }\n    },\n    \"com.amazonaws.s3#HeadObjectRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the bucket that contains the object.</p>\\n         <p>\\n            <b>Directory buckets</b> - When you use this operation with a directory bucket, you must use virtual-hosted-style requests in the format <code>\\n               <i>Bucket-name</i>.s3express-<i>zone-id</i>.<i>region-code</i>.amazonaws.com</code>. Path-style requests are not supported.  Directory bucket names must be unique in the chosen Zone (Availability Zone or Local Zone). Bucket names must follow the format <code>\\n               <i>bucket-base-name</i>--<i>zone-id</i>--x-s3</code> (for example, <code>\\n               <i>amzn-s3-demo-bucket</i>--<i>usw2-az1</i>--x-s3</code>). For information about bucket naming\\n         restrictions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-bucket-naming-rules.html\\\">Directory bucket naming\\n            rules</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <p>\\n            <b>Access points</b> - When you use this action with an access point for general purpose buckets, you must provide the alias of the access point in place of the bucket name or specify the access point ARN. When you use this action with an access point for directory buckets, you must provide the access point name in place of the bucket name. When using the access point ARN, you must direct requests to the access point hostname. The access point hostname takes the form <i>AccessPointName</i>-<i>AccountId</i>.s3-accesspoint.<i>Region</i>.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html\\\">Using access points</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <note>\\n            <p>Object Lambda access points are not supported by directory buckets.</p>\\n         </note>\\n         <p>\\n            <b>S3 on Outposts</b> - When you use this action with S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the \\n                     form <code>\\n               <i>AccessPointName</i>-<i>AccountId</i>.<i>outpostID</i>.s3-outposts.<i>Region</i>.amazonaws.com</code>. When you use this action with S3 on Outposts, the destination bucket must be the Outposts access point ARN or the access point alias. For more information about S3 on Outposts, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html\\\">What is S3 on Outposts?</a> in the <i>Amazon S3 User Guide</i>.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"IfMatch\": {\n          \"target\": \"com.amazonaws.s3#IfMatch\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Return the object only if its entity tag (ETag) is the same as the one specified; otherwise, return\\n      a 412 (precondition failed) error.</p>\\n         <p>If both of the <code>If-Match</code> and <code>If-Unmodified-Since</code> headers are present in the\\n      request as follows:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>If-Match</code> condition evaluates to <code>true</code>, and;</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>If-Unmodified-Since</code> condition evaluates to <code>false</code>;</p>\\n            </li>\\n         </ul>\\n         <p>Then Amazon S3 returns <code>200 OK</code> and the data requested.</p>\\n         <p>For more information about conditional requests, see <a href=\\\"https://tools.ietf.org/html/rfc7232\\\">RFC 7232</a>.</p>\",\n            \"smithy.api#httpHeader\": \"If-Match\"\n          }\n        },\n        \"IfModifiedSince\": {\n          \"target\": \"com.amazonaws.s3#IfModifiedSince\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Return the object only if it has been modified since the specified time; otherwise, return a 304\\n      (not modified) error.</p>\\n         <p>If both of the <code>If-None-Match</code> and <code>If-Modified-Since</code> headers are present in\\n      the request as follows:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>If-None-Match</code> condition evaluates to <code>false</code>, and;</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>If-Modified-Since</code> condition evaluates to <code>true</code>;</p>\\n            </li>\\n         </ul>\\n         <p>Then Amazon S3 returns the <code>304 Not Modified</code> response code.</p>\\n         <p>For more information about conditional requests, see <a href=\\\"https://tools.ietf.org/html/rfc7232\\\">RFC 7232</a>.</p>\",\n            \"smithy.api#httpHeader\": \"If-Modified-Since\"\n          }\n        },\n        \"IfNoneMatch\": {\n          \"target\": \"com.amazonaws.s3#IfNoneMatch\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Return the object only if its entity tag (ETag) is different from the one specified; otherwise,\\n      return a 304 (not modified) error.</p>\\n         <p>If both of the <code>If-None-Match</code> and <code>If-Modified-Since</code> headers are present in\\n      the request as follows:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>If-None-Match</code> condition evaluates to <code>false</code>, and;</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>If-Modified-Since</code> condition evaluates to <code>true</code>;</p>\\n            </li>\\n         </ul>\\n         <p>Then Amazon S3 returns the <code>304 Not Modified</code> response code.</p>\\n         <p>For more information about conditional requests, see <a href=\\\"https://tools.ietf.org/html/rfc7232\\\">RFC 7232</a>.</p>\",\n            \"smithy.api#httpHeader\": \"If-None-Match\"\n          }\n        },\n        \"IfUnmodifiedSince\": {\n          \"target\": \"com.amazonaws.s3#IfUnmodifiedSince\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Return the object only if it has not been modified since the specified time; otherwise, return a 412\\n      (precondition failed) error.</p>\\n         <p>If both of the <code>If-Match</code> and <code>If-Unmodified-Since</code> headers are present in the\\n      request as follows:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>If-Match</code> condition evaluates to <code>true</code>, and;</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>If-Unmodified-Since</code> condition evaluates to <code>false</code>;</p>\\n            </li>\\n         </ul>\\n         <p>Then Amazon S3 returns <code>200 OK</code> and the data requested.</p>\\n         <p>For more information about conditional requests, see <a href=\\\"https://tools.ietf.org/html/rfc7232\\\">RFC 7232</a>.</p>\",\n            \"smithy.api#httpHeader\": \"If-Unmodified-Since\"\n          }\n        },\n        \"Key\": {\n          \"target\": \"com.amazonaws.s3#ObjectKey\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The object key.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Key\"\n            }\n          }\n        },\n        \"Range\": {\n          \"target\": \"com.amazonaws.s3#Range\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>HeadObject returns only the metadata for an object. If the Range is satisfiable, only the\\n        <code>ContentLength</code> is affected in the response. If the Range is not satisfiable, S3 returns a\\n        <code>416 - Requested Range Not Satisfiable</code> error.</p>\",\n            \"smithy.api#httpHeader\": \"Range\"\n          }\n        },\n        \"ResponseCacheControl\": {\n          \"target\": \"com.amazonaws.s3#ResponseCacheControl\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Sets the <code>Cache-Control</code> header of the response.</p>\",\n            \"smithy.api#httpQuery\": \"response-cache-control\"\n          }\n        },\n        \"ResponseContentDisposition\": {\n          \"target\": \"com.amazonaws.s3#ResponseContentDisposition\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Sets the <code>Content-Disposition</code> header of the response.</p>\",\n            \"smithy.api#httpQuery\": \"response-content-disposition\"\n          }\n        },\n        \"ResponseContentEncoding\": {\n          \"target\": \"com.amazonaws.s3#ResponseContentEncoding\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Sets the <code>Content-Encoding</code> header of the response.</p>\",\n            \"smithy.api#httpQuery\": \"response-content-encoding\"\n          }\n        },\n        \"ResponseContentLanguage\": {\n          \"target\": \"com.amazonaws.s3#ResponseContentLanguage\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Sets the <code>Content-Language</code> header of the response.</p>\",\n            \"smithy.api#httpQuery\": \"response-content-language\"\n          }\n        },\n        \"ResponseContentType\": {\n          \"target\": \"com.amazonaws.s3#ResponseContentType\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Sets the <code>Content-Type</code> header of the response.</p>\",\n            \"smithy.api#httpQuery\": \"response-content-type\"\n          }\n        },\n        \"ResponseExpires\": {\n          \"target\": \"com.amazonaws.s3#ResponseExpires\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Sets the <code>Expires</code> header of the response.</p>\",\n            \"smithy.api#httpQuery\": \"response-expires\"\n          }\n        },\n        \"VersionId\": {\n          \"target\": \"com.amazonaws.s3#ObjectVersionId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Version ID used to reference a specific version of the object.</p>\\n         <note>\\n            <p>For directory buckets in this API operation, only the <code>null</code> value of the version ID is supported.</p>\\n         </note>\",\n            \"smithy.api#httpQuery\": \"versionId\"\n          }\n        },\n        \"SSECustomerAlgorithm\": {\n          \"target\": \"com.amazonaws.s3#SSECustomerAlgorithm\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the algorithm to use when encrypting the object (for example, AES256).</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption-customer-algorithm\"\n          }\n        },\n        \"SSECustomerKey\": {\n          \"target\": \"com.amazonaws.s3#SSECustomerKey\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the customer-provided encryption key for Amazon S3 to use in encrypting data. This value is\\n      used to store the object and then it is discarded; Amazon S3 does not store the encryption key. The key must\\n      be appropriate for use with the algorithm specified in the\\n        <code>x-amz-server-side-encryption-customer-algorithm</code> header.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption-customer-key\"\n          }\n        },\n        \"SSECustomerKeyMD5\": {\n          \"target\": \"com.amazonaws.s3#SSECustomerKeyMD5\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the 128-bit MD5 digest of the encryption key according to RFC 1321. Amazon S3 uses this header\\n      for a message integrity check to ensure that the encryption key was transmitted without error.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption-customer-key-MD5\"\n          }\n        },\n        \"RequestPayer\": {\n          \"target\": \"com.amazonaws.s3#RequestPayer\",\n          \"traits\": {\n            \"smithy.api#httpHeader\": \"x-amz-request-payer\"\n          }\n        },\n        \"PartNumber\": {\n          \"target\": \"com.amazonaws.s3#PartNumber\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Part number of the object being read. This is a positive integer between 1 and 10,000. Effectively\\n      performs a 'ranged' HEAD request for the part specified. Useful querying about the size of the part and\\n      the number of parts in this object.</p>\",\n            \"smithy.api#httpQuery\": \"partNumber\"\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        },\n        \"ChecksumMode\": {\n          \"target\": \"com.amazonaws.s3#ChecksumMode\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>To retrieve the checksum, this parameter must be enabled.</p>\\n         <p>\\n            <b>General purpose buckets</b> -\\n      If you enable checksum mode and the object is uploaded with a <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_Checksum.html\\\">checksum</a> and encrypted with\\n      an Key Management Service (KMS) key, you must have permission to use the <code>kms:Decrypt</code> action to\\n      retrieve the checksum.</p>\\n         <p>\\n            <b>Directory buckets</b> - If you enable <code>ChecksumMode</code>\\n      and the object is encrypted with Amazon Web Services Key Management Service (Amazon Web Services KMS), you must also have the\\n        <code>kms:GenerateDataKey</code> and <code>kms:Decrypt</code> permissions in IAM identity-based\\n      policies and KMS key policies for the KMS key to retrieve the checksum of the object.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-checksum-mode\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#HostName\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#HttpErrorCodeReturnedEquals\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#HttpRedirectCode\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#ID\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#IdempotencyParameterMismatch\": {\n      \"type\": \"structure\",\n      \"members\": {},\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Parameters on this idempotent request are inconsistent with parameters used in previous request(s). </p>\\n         <p>For a list of error codes and more information on Amazon S3 errors, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html#ErrorCodeList\\\">Error codes</a>.</p>\\n         <note>\\n            <p>Idempotency ensures that an API request completes no more than one time. With an idempotent\\n        request, if the original request completes successfully, any subsequent retries complete successfully\\n        without performing any further actions.</p>\\n         </note>\",\n        \"smithy.api#error\": \"client\",\n        \"smithy.api#httpError\": 400\n      }\n    },\n    \"com.amazonaws.s3#IfMatch\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#IfMatchInitiatedTime\": {\n      \"type\": \"timestamp\",\n      \"traits\": {\n        \"smithy.api#timestampFormat\": \"http-date\"\n      }\n    },\n    \"com.amazonaws.s3#IfMatchLastModifiedTime\": {\n      \"type\": \"timestamp\",\n      \"traits\": {\n        \"smithy.api#timestampFormat\": \"http-date\"\n      }\n    },\n    \"com.amazonaws.s3#IfMatchSize\": {\n      \"type\": \"long\"\n    },\n    \"com.amazonaws.s3#IfModifiedSince\": {\n      \"type\": \"timestamp\"\n    },\n    \"com.amazonaws.s3#IfNoneMatch\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#IfUnmodifiedSince\": {\n      \"type\": \"timestamp\"\n    },\n    \"com.amazonaws.s3#IndexDocument\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Suffix\": {\n          \"target\": \"com.amazonaws.s3#Suffix\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A suffix that is appended to a request that is for a directory on the website endpoint. (For\\n      example, if the suffix is <code>index.html</code> and you make a request to\\n        <code>samplebucket/images/</code>, the data that is returned will be for the object with the key name\\n        <code>images/index.html</code>.) The suffix must not be empty and must not include a slash\\n      character.</p>\\n         <important>\\n            <p>Replacement must be made for object keys containing special characters (such as carriage returns) when using \\n         XML requests. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-keys.html#object-key-xml-related-constraints\\\">\\n            XML related object key constraints</a>.</p>\\n         </important>\",\n            \"smithy.api#required\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Container for the <code>Suffix</code> element.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#Initiated\": {\n      \"type\": \"timestamp\"\n    },\n    \"com.amazonaws.s3#Initiator\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"ID\": {\n          \"target\": \"com.amazonaws.s3#ID\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>If the principal is an Amazon Web Services account, it provides the Canonical User ID. If the principal is an\\n      IAM User, it provides a user ARN value.</p>\\n         <note>\\n            <p>\\n               <b>Directory buckets</b> - If the principal is an Amazon Web Services account,\\n        it provides the Amazon Web Services account ID. If the principal is an IAM User, it provides a user ARN\\n        value.</p>\\n         </note>\"\n          }\n        },\n        \"DisplayName\": {\n          \"target\": \"com.amazonaws.s3#DisplayName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p></p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Container element that identifies who initiated the multipart upload. </p>\"\n      }\n    },\n    \"com.amazonaws.s3#InputSerialization\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"CSV\": {\n          \"target\": \"com.amazonaws.s3#CSVInput\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Describes the serialization of a CSV-encoded object.</p>\"\n          }\n        },\n        \"CompressionType\": {\n          \"target\": \"com.amazonaws.s3#CompressionType\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies object's compression format. Valid values: NONE, GZIP, BZIP2. Default Value: NONE.</p>\"\n          }\n        },\n        \"JSON\": {\n          \"target\": \"com.amazonaws.s3#JSONInput\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies JSON as object's input serialization format.</p>\"\n          }\n        },\n        \"Parquet\": {\n          \"target\": \"com.amazonaws.s3#ParquetInput\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies Parquet as object's input serialization format.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Describes the serialization format of the object.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#IntelligentTieringAccessTier\": {\n      \"type\": \"enum\",\n      \"members\": {\n        \"ARCHIVE_ACCESS\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"ARCHIVE_ACCESS\"\n          }\n        },\n        \"DEEP_ARCHIVE_ACCESS\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"DEEP_ARCHIVE_ACCESS\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#IntelligentTieringAndOperator\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Prefix\": {\n          \"target\": \"com.amazonaws.s3#Prefix\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>An object key name prefix that identifies the subset of objects to which the configuration\\n      applies.</p>\"\n          }\n        },\n        \"Tags\": {\n          \"target\": \"com.amazonaws.s3#TagSet\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>All of these tags must exist in the object's tag set in order for the configuration to apply.</p>\",\n            \"smithy.api#xmlFlattened\": {},\n            \"smithy.api#xmlName\": \"Tag\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>A container for specifying S3 Intelligent-Tiering filters. The filters determine the subset of\\n      objects to which the rule applies.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#IntelligentTieringConfiguration\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Id\": {\n          \"target\": \"com.amazonaws.s3#IntelligentTieringId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The ID used to identify the S3 Intelligent-Tiering configuration.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"Filter\": {\n          \"target\": \"com.amazonaws.s3#IntelligentTieringFilter\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies a bucket filter. The configuration only includes objects that meet the filter's\\n      criteria.</p>\"\n          }\n        },\n        \"Status\": {\n          \"target\": \"com.amazonaws.s3#IntelligentTieringStatus\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the status of the configuration.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"Tierings\": {\n          \"target\": \"com.amazonaws.s3#TieringList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the S3 Intelligent-Tiering storage class tier of the configuration.</p>\",\n            \"smithy.api#required\": {},\n            \"smithy.api#xmlFlattened\": {},\n            \"smithy.api#xmlName\": \"Tiering\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Specifies the S3 Intelligent-Tiering configuration for an Amazon S3 bucket.</p>\\n         <p>For information about the S3 Intelligent-Tiering storage class, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/storage-class-intro.html#sc-dynamic-data-access\\\">Storage class for\\n        automatically optimizing frequently and infrequently accessed objects</a>.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#IntelligentTieringConfigurationList\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.s3#IntelligentTieringConfiguration\"\n      }\n    },\n    \"com.amazonaws.s3#IntelligentTieringDays\": {\n      \"type\": \"integer\"\n    },\n    \"com.amazonaws.s3#IntelligentTieringFilter\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Prefix\": {\n          \"target\": \"com.amazonaws.s3#Prefix\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>An object key name prefix that identifies the subset of objects to which the rule applies.</p>\\n         <important>\\n            <p>Replacement must be made for object keys containing special characters (such as carriage returns) when using \\n         XML requests. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-keys.html#object-key-xml-related-constraints\\\">\\n            XML related object key constraints</a>.</p>\\n         </important>\"\n          }\n        },\n        \"Tag\": {\n          \"target\": \"com.amazonaws.s3#Tag\"\n        },\n        \"And\": {\n          \"target\": \"com.amazonaws.s3#IntelligentTieringAndOperator\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A conjunction (logical AND) of predicates, which is used in evaluating a metrics filter. The\\n      operator must have at least two predicates, and an object must match all of the predicates in order for\\n      the filter to apply.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>The <code>Filter</code> is used to identify objects that the S3 Intelligent-Tiering configuration\\n      applies to.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#IntelligentTieringId\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#IntelligentTieringStatus\": {\n      \"type\": \"enum\",\n      \"members\": {\n        \"Enabled\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"Enabled\"\n          }\n        },\n        \"Disabled\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"Disabled\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#InvalidObjectState\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"StorageClass\": {\n          \"target\": \"com.amazonaws.s3#StorageClass\"\n        },\n        \"AccessTier\": {\n          \"target\": \"com.amazonaws.s3#IntelligentTieringAccessTier\"\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Object is archived and inaccessible until restored.</p>\\n         <p>If the object you are retrieving is stored in the S3 Glacier Flexible Retrieval storage class, the\\n      S3 Glacier Deep Archive storage class, the S3 Intelligent-Tiering Archive Access tier, or the\\n      S3 Intelligent-Tiering Deep Archive Access tier, before you can retrieve the object you must first restore a copy\\n      using <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_RestoreObject.html\\\">RestoreObject</a>. Otherwise, this operation returns an <code>InvalidObjectState</code> error. For\\n      information about restoring archived objects, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/restoring-objects.html\\\">Restoring Archived Objects</a> in the\\n        <i>Amazon S3 User Guide</i>.</p>\",\n        \"smithy.api#error\": \"client\",\n        \"smithy.api#httpError\": 403\n      }\n    },\n    \"com.amazonaws.s3#InvalidRequest\": {\n      \"type\": \"structure\",\n      \"members\": {},\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>You may receive this error in multiple cases. Depending on the reason for the error, you may receive\\n      one of the messages below:</p>\\n         <ul>\\n            <li>\\n               <p>Cannot specify both a write offset value and user-defined object metadata for existing\\n          objects.</p>\\n            </li>\\n            <li>\\n               <p>Checksum Type mismatch occurred, expected checksum Type: sha1, actual checksum Type:\\n          crc32c.</p>\\n            </li>\\n            <li>\\n               <p>Request body cannot be empty when 'write offset' is specified.</p>\\n            </li>\\n         </ul>\",\n        \"smithy.api#error\": \"client\",\n        \"smithy.api#httpError\": 400\n      }\n    },\n    \"com.amazonaws.s3#InvalidWriteOffset\": {\n      \"type\": \"structure\",\n      \"members\": {},\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p> The write offset value that you specified does not match the current object size. </p>\",\n        \"smithy.api#error\": \"client\",\n        \"smithy.api#httpError\": 400\n      }\n    },\n    \"com.amazonaws.s3#InventoryConfiguration\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Destination\": {\n          \"target\": \"com.amazonaws.s3#InventoryDestination\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Contains information about where to publish the inventory results.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"IsEnabled\": {\n          \"target\": \"com.amazonaws.s3#IsEnabled\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies whether the inventory is enabled or disabled. If set to <code>True</code>, an inventory\\n      list is generated. If set to <code>False</code>, no inventory list is generated.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"Filter\": {\n          \"target\": \"com.amazonaws.s3#InventoryFilter\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies an inventory filter. The inventory only includes objects that meet the filter's\\n      criteria.</p>\"\n          }\n        },\n        \"Id\": {\n          \"target\": \"com.amazonaws.s3#InventoryId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The ID used to identify the inventory configuration.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"IncludedObjectVersions\": {\n          \"target\": \"com.amazonaws.s3#InventoryIncludedObjectVersions\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Object versions to include in the inventory list. If set to <code>All</code>, the list includes all\\n      the object versions, which adds the version-related fields <code>VersionId</code>,\\n      <code>IsLatest</code>, and <code>DeleteMarker</code> to the list. If set to <code>Current</code>, the\\n      list does not contain these version-related fields.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"OptionalFields\": {\n          \"target\": \"com.amazonaws.s3#InventoryOptionalFields\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Contains the optional fields that are included in the inventory results.</p>\"\n          }\n        },\n        \"Schedule\": {\n          \"target\": \"com.amazonaws.s3#InventorySchedule\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the schedule for generating inventory results.</p>\",\n            \"smithy.api#required\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Specifies the S3 Inventory configuration for an Amazon S3 bucket. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketGETInventoryConfig.html\\\">GET Bucket\\n        inventory</a> in the <i>Amazon S3 API Reference</i>. </p>\"\n      }\n    },\n    \"com.amazonaws.s3#InventoryConfigurationList\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.s3#InventoryConfiguration\"\n      }\n    },\n    \"com.amazonaws.s3#InventoryConfigurationState\": {\n      \"type\": \"enum\",\n      \"members\": {\n        \"ENABLED\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"ENABLED\"\n          }\n        },\n        \"DISABLED\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"DISABLED\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#InventoryDestination\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"S3BucketDestination\": {\n          \"target\": \"com.amazonaws.s3#InventoryS3BucketDestination\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Contains the bucket name, file format, bucket owner (optional), and prefix (optional) where\\n      inventory results are published.</p>\",\n            \"smithy.api#required\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Specifies the S3 Inventory configuration for an Amazon S3 bucket.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#InventoryEncryption\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"SSES3\": {\n          \"target\": \"com.amazonaws.s3#SSES3\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the use of SSE-S3 to encrypt delivered inventory reports.</p>\",\n            \"smithy.api#xmlName\": \"SSE-S3\"\n          }\n        },\n        \"SSEKMS\": {\n          \"target\": \"com.amazonaws.s3#SSEKMS\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the use of SSE-KMS to encrypt delivered inventory reports.</p>\",\n            \"smithy.api#xmlName\": \"SSE-KMS\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Contains the type of server-side encryption used to encrypt the S3 Inventory results.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#InventoryFilter\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Prefix\": {\n          \"target\": \"com.amazonaws.s3#Prefix\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The prefix that an object must have to be included in the inventory results.</p>\",\n            \"smithy.api#required\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Specifies an S3 Inventory filter. The inventory only includes objects that meet the filter's\\n      criteria.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#InventoryFormat\": {\n      \"type\": \"enum\",\n      \"members\": {\n        \"CSV\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"CSV\"\n          }\n        },\n        \"ORC\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"ORC\"\n          }\n        },\n        \"Parquet\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"Parquet\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#InventoryFrequency\": {\n      \"type\": \"enum\",\n      \"members\": {\n        \"Daily\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"Daily\"\n          }\n        },\n        \"Weekly\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"Weekly\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#InventoryId\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#InventoryIncludedObjectVersions\": {\n      \"type\": \"enum\",\n      \"members\": {\n        \"All\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"All\"\n          }\n        },\n        \"Current\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"Current\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#InventoryOptionalField\": {\n      \"type\": \"enum\",\n      \"members\": {\n        \"Size\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"Size\"\n          }\n        },\n        \"LastModifiedDate\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"LastModifiedDate\"\n          }\n        },\n        \"StorageClass\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"StorageClass\"\n          }\n        },\n        \"ETag\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"ETag\"\n          }\n        },\n        \"IsMultipartUploaded\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"IsMultipartUploaded\"\n          }\n        },\n        \"ReplicationStatus\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"ReplicationStatus\"\n          }\n        },\n        \"EncryptionStatus\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"EncryptionStatus\"\n          }\n        },\n        \"ObjectLockRetainUntilDate\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"ObjectLockRetainUntilDate\"\n          }\n        },\n        \"ObjectLockMode\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"ObjectLockMode\"\n          }\n        },\n        \"ObjectLockLegalHoldStatus\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"ObjectLockLegalHoldStatus\"\n          }\n        },\n        \"IntelligentTieringAccessTier\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"IntelligentTieringAccessTier\"\n          }\n        },\n        \"BucketKeyStatus\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"BucketKeyStatus\"\n          }\n        },\n        \"ChecksumAlgorithm\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"ChecksumAlgorithm\"\n          }\n        },\n        \"ObjectAccessControlList\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"ObjectAccessControlList\"\n          }\n        },\n        \"ObjectOwner\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"ObjectOwner\"\n          }\n        },\n        \"LifecycleExpirationDate\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"LifecycleExpirationDate\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#InventoryOptionalFields\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.s3#InventoryOptionalField\",\n        \"traits\": {\n          \"smithy.api#xmlName\": \"Field\"\n        }\n      }\n    },\n    \"com.amazonaws.s3#InventoryS3BucketDestination\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"AccountId\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID that owns the destination S3 bucket. If no account ID is provided, the owner is not\\n      validated before exporting data. </p>\\n         <note>\\n            <p> Although this value is optional, we strongly recommend that you set it to help prevent problems\\n        if the destination bucket ownership changes. </p>\\n         </note>\"\n          }\n        },\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the bucket where inventory results will be published.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"Format\": {\n          \"target\": \"com.amazonaws.s3#InventoryFormat\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the output format of the inventory results.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"Prefix\": {\n          \"target\": \"com.amazonaws.s3#Prefix\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The prefix that is prepended to all inventory results.</p>\"\n          }\n        },\n        \"Encryption\": {\n          \"target\": \"com.amazonaws.s3#InventoryEncryption\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Contains the type of server-side encryption used to encrypt the inventory results.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Contains the bucket name, file format, bucket owner (optional), and prefix (optional) where\\n      S3 Inventory results are published.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#InventorySchedule\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Frequency\": {\n          \"target\": \"com.amazonaws.s3#InventoryFrequency\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies how frequently inventory results are produced.</p>\",\n            \"smithy.api#required\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Specifies the schedule for generating S3 Inventory results.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#InventoryTableConfiguration\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"ConfigurationState\": {\n          \"target\": \"com.amazonaws.s3#InventoryConfigurationState\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>\\n      The configuration state of the inventory table, indicating whether the inventory table is enabled \\n      or disabled.\\n    </p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"EncryptionConfiguration\": {\n          \"target\": \"com.amazonaws.s3#MetadataTableEncryptionConfiguration\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>\\n      The encryption configuration for the inventory table.\\n    </p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>\\n      The inventory table configuration for an S3 Metadata configuration.\\n    </p>\"\n      }\n    },\n    \"com.amazonaws.s3#InventoryTableConfigurationResult\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"ConfigurationState\": {\n          \"target\": \"com.amazonaws.s3#InventoryConfigurationState\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>\\n      The configuration state of the inventory table, indicating whether the inventory table is enabled \\n      or disabled.\\n    </p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"TableStatus\": {\n          \"target\": \"com.amazonaws.s3#MetadataTableStatus\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p> The status of the inventory table. The status values are: </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>CREATING</code> - The inventory table is in the process of being created in the specified\\n          Amazon Web Services managed table bucket.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>BACKFILLING</code> - The inventory table is in the process of being backfilled. When \\n          you enable the inventory table for your metadata configuration, the table goes through a \\n          process known as backfilling, during which Amazon S3 scans your general purpose bucket to retrieve \\n          the initial metadata for all objects in the bucket. Depending on the number of objects in your \\n          bucket, this process can take several hours. When the backfilling process is finished, the \\n          status of your inventory table changes from <code>BACKFILLING</code> to <code>ACTIVE</code>. \\n          After backfilling is completed, updates to your objects are reflected in the inventory table \\n          within one hour.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ACTIVE</code> - The inventory table has been created successfully, and records are being\\n          delivered to the table. </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>FAILED</code> - Amazon S3 is unable to create the inventory table, or Amazon S3 is unable to deliver\\n          records.</p>\\n            </li>\\n         </ul>\"\n          }\n        },\n        \"Error\": {\n          \"target\": \"com.amazonaws.s3#ErrorDetails\"\n        },\n        \"TableName\": {\n          \"target\": \"com.amazonaws.s3#S3TablesName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>\\n      The name of the inventory table.\\n    </p>\"\n          }\n        },\n        \"TableArn\": {\n          \"target\": \"com.amazonaws.s3#S3TablesArn\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>\\n      The Amazon Resource Name (ARN) for the inventory table.\\n    </p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>\\n      The inventory table configuration for an S3 Metadata configuration.\\n    </p>\"\n      }\n    },\n    \"com.amazonaws.s3#InventoryTableConfigurationUpdates\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"ConfigurationState\": {\n          \"target\": \"com.amazonaws.s3#InventoryConfigurationState\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>\\n      The configuration state of the inventory table, indicating whether the inventory table is enabled \\n      or disabled.\\n    </p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"EncryptionConfiguration\": {\n          \"target\": \"com.amazonaws.s3#MetadataTableEncryptionConfiguration\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>\\n      The encryption configuration for the inventory table.\\n    </p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>\\n      The specified updates to the S3 Metadata inventory table configuration.\\n    </p>\"\n      }\n    },\n    \"com.amazonaws.s3#IsEnabled\": {\n      \"type\": \"boolean\"\n    },\n    \"com.amazonaws.s3#IsLatest\": {\n      \"type\": \"boolean\"\n    },\n    \"com.amazonaws.s3#IsPublic\": {\n      \"type\": \"boolean\"\n    },\n    \"com.amazonaws.s3#IsRestoreInProgress\": {\n      \"type\": \"boolean\"\n    },\n    \"com.amazonaws.s3#IsTruncated\": {\n      \"type\": \"boolean\"\n    },\n    \"com.amazonaws.s3#JSONInput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Type\": {\n          \"target\": \"com.amazonaws.s3#JSONType\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The type of JSON. Valid values: Document, Lines.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Specifies JSON as object's input serialization format.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#JSONOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"RecordDelimiter\": {\n          \"target\": \"com.amazonaws.s3#RecordDelimiter\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The value used to separate individual records in the output. If no value is specified, Amazon S3 uses a\\n      newline character ('\\\\n').</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Specifies JSON as request's output serialization format.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#JSONType\": {\n      \"type\": \"enum\",\n      \"members\": {\n        \"DOCUMENT\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"DOCUMENT\"\n          }\n        },\n        \"LINES\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"LINES\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#JournalTableConfiguration\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"RecordExpiration\": {\n          \"target\": \"com.amazonaws.s3#RecordExpiration\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>\\n      The journal table record expiration settings for the journal table.\\n    </p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"EncryptionConfiguration\": {\n          \"target\": \"com.amazonaws.s3#MetadataTableEncryptionConfiguration\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>\\n      The encryption configuration for the journal table.\\n    </p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>\\n      The journal table configuration for an S3 Metadata configuration.\\n    </p>\"\n      }\n    },\n    \"com.amazonaws.s3#JournalTableConfigurationResult\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"TableStatus\": {\n          \"target\": \"com.amazonaws.s3#MetadataTableStatus\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p> The status of the journal table. The status values are: </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>CREATING</code> - The journal table is in the process of being created in the specified\\n          table bucket.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ACTIVE</code> - The journal table has been created successfully, and records are being\\n          delivered to the table. </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>FAILED</code> - Amazon S3 is unable to create the journal table, or Amazon S3 is unable to deliver\\n          records.</p>\\n            </li>\\n         </ul>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"Error\": {\n          \"target\": \"com.amazonaws.s3#ErrorDetails\"\n        },\n        \"TableName\": {\n          \"target\": \"com.amazonaws.s3#S3TablesName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>\\n      The name of the journal table.\\n    </p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"TableArn\": {\n          \"target\": \"com.amazonaws.s3#S3TablesArn\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>\\n      The Amazon Resource Name (ARN) for the journal table.\\n    </p>\"\n          }\n        },\n        \"RecordExpiration\": {\n          \"target\": \"com.amazonaws.s3#RecordExpiration\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>\\n      The journal table record expiration settings for the journal table.\\n    </p>\",\n            \"smithy.api#required\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>\\n      The journal table configuration for the S3 Metadata configuration.\\n    </p>\"\n      }\n    },\n    \"com.amazonaws.s3#JournalTableConfigurationUpdates\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"RecordExpiration\": {\n          \"target\": \"com.amazonaws.s3#RecordExpiration\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>\\n      The journal table record expiration settings for the journal table.\\n    </p>\",\n            \"smithy.api#required\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>\\n      The specified updates to the S3 Metadata journal table configuration.\\n    </p>\"\n      }\n    },\n    \"com.amazonaws.s3#KMSContext\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#KeyCount\": {\n      \"type\": \"integer\"\n    },\n    \"com.amazonaws.s3#KeyMarker\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#KeyPrefixEquals\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#KmsKeyArn\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#LambdaFunctionArn\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#LambdaFunctionConfiguration\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Id\": {\n          \"target\": \"com.amazonaws.s3#NotificationId\"\n        },\n        \"LambdaFunctionArn\": {\n          \"target\": \"com.amazonaws.s3#LambdaFunctionArn\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the Lambda function that Amazon S3 invokes when the specified event\\n      type occurs.</p>\",\n            \"smithy.api#required\": {},\n            \"smithy.api#xmlName\": \"CloudFunction\"\n          }\n        },\n        \"Events\": {\n          \"target\": \"com.amazonaws.s3#EventList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Amazon S3 bucket event for which to invoke the Lambda function. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/NotificationHowTo.html\\\">Supported Event Types</a> in\\n      the <i>Amazon S3 User Guide</i>.</p>\",\n            \"smithy.api#required\": {},\n            \"smithy.api#xmlFlattened\": {},\n            \"smithy.api#xmlName\": \"Event\"\n          }\n        },\n        \"Filter\": {\n          \"target\": \"com.amazonaws.s3#NotificationConfigurationFilter\"\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>A container for specifying the configuration for Lambda notifications.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#LambdaFunctionConfigurationList\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.s3#LambdaFunctionConfiguration\"\n      }\n    },\n    \"com.amazonaws.s3#LastModified\": {\n      \"type\": \"timestamp\"\n    },\n    \"com.amazonaws.s3#LastModifiedTime\": {\n      \"type\": \"timestamp\",\n      \"traits\": {\n        \"smithy.api#timestampFormat\": \"http-date\"\n      }\n    },\n    \"com.amazonaws.s3#LifecycleExpiration\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Date\": {\n          \"target\": \"com.amazonaws.s3#Date\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Indicates at what date the object is to be moved or deleted. The date value must conform to the ISO\\n      8601 format. The time is always midnight UTC.</p>\\n         <note>\\n            <p>This parameter applies to general purpose buckets only. It is not supported for directory bucket\\n        lifecycle configurations.</p>\\n         </note>\"\n          }\n        },\n        \"Days\": {\n          \"target\": \"com.amazonaws.s3#Days\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Indicates the lifetime, in days, of the objects that are subject to the rule. The value must be a\\n      non-zero positive integer.</p>\"\n          }\n        },\n        \"ExpiredObjectDeleteMarker\": {\n          \"target\": \"com.amazonaws.s3#ExpiredObjectDeleteMarker\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Indicates whether Amazon S3 will remove a delete marker with no noncurrent versions. If set to true, the\\n      delete marker will be expired; if set to false the policy takes no action. This cannot be specified with\\n      Days or Date in a Lifecycle Expiration Policy.</p>\\n         <note>\\n            <p>This parameter applies to general purpose buckets only. It is not supported for directory bucket\\n        lifecycle configurations.</p>\\n         </note>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Container for the expiration for the lifecycle of the object.</p>\\n         <p>For more information see, <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lifecycle-mgmt.html\\\">Managing your storage lifecycle</a> in\\n      the <i>Amazon S3 User Guide</i>.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#LifecycleRule\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Expiration\": {\n          \"target\": \"com.amazonaws.s3#LifecycleExpiration\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the expiration for the lifecycle of the object in the form of date, days and, whether the\\n      object has a delete marker.</p>\"\n          }\n        },\n        \"ID\": {\n          \"target\": \"com.amazonaws.s3#ID\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Unique identifier for the rule. The value cannot be longer than 255 characters.</p>\"\n          }\n        },\n        \"Prefix\": {\n          \"target\": \"com.amazonaws.s3#Prefix\",\n          \"traits\": {\n            \"smithy.api#deprecated\": {},\n            \"smithy.api#documentation\": \"<p> The general purpose bucket prefix that identifies one or more objects to which the rule applies. We recommend using <code>Filter</code> instead of <code>Prefix</code> for new PUTs. Previous configurations where a prefix is defined will continue to operate as before.</p>\\n         <important>\\n            <p>Replacement must be made for object keys containing special characters (such as carriage returns) when using \\n         XML requests. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-keys.html#object-key-xml-related-constraints\\\">\\n            XML related object key constraints</a>.</p>\\n         </important>\"\n          }\n        },\n        \"Filter\": {\n          \"target\": \"com.amazonaws.s3#LifecycleRuleFilter\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The <code>Filter</code> is used to identify objects that a Lifecycle Rule applies to. A\\n        <code>Filter</code> must have exactly one of <code>Prefix</code>, <code>Tag</code>,\\n        <code>ObjectSizeGreaterThan</code>, <code>ObjectSizeLessThan</code>, or <code>And</code> specified.\\n        <code>Filter</code> is required if the <code>LifecycleRule</code> does not contain a\\n        <code>Prefix</code> element.</p>\\n         <p>For more information about <code>Tag</code> filters, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/intro-lifecycle-filters.html\\\">Adding filters to Lifecycle rules</a>\\n      in the <i>Amazon S3 User Guide</i>.</p>\\n         <note>\\n            <p>\\n               <code>Tag</code> filters are not supported for directory buckets.</p>\\n         </note>\"\n          }\n        },\n        \"Status\": {\n          \"target\": \"com.amazonaws.s3#ExpirationStatus\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>If 'Enabled', the rule is currently being applied. If 'Disabled', the rule is not currently being\\n      applied.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"Transitions\": {\n          \"target\": \"com.amazonaws.s3#TransitionList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies when an Amazon S3 object transitions to a specified storage class.</p>\\n         <note>\\n            <p>This parameter applies to general purpose buckets only. It is not supported for directory bucket\\n        lifecycle configurations.</p>\\n         </note>\",\n            \"smithy.api#xmlFlattened\": {},\n            \"smithy.api#xmlName\": \"Transition\"\n          }\n        },\n        \"NoncurrentVersionTransitions\": {\n          \"target\": \"com.amazonaws.s3#NoncurrentVersionTransitionList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the transition rule for the lifecycle rule that describes when noncurrent objects\\n      transition to a specific storage class. If your bucket is versioning-enabled (or versioning is\\n      suspended), you can set this action to request that Amazon S3 transition noncurrent object versions to a\\n      specific storage class at a set period in the object's lifetime.</p>\\n         <note>\\n            <p>This parameter applies to general purpose buckets only. It is not supported for directory bucket\\n        lifecycle configurations.</p>\\n         </note>\",\n            \"smithy.api#xmlFlattened\": {},\n            \"smithy.api#xmlName\": \"NoncurrentVersionTransition\"\n          }\n        },\n        \"NoncurrentVersionExpiration\": {\n          \"target\": \"com.amazonaws.s3#NoncurrentVersionExpiration\"\n        },\n        \"AbortIncompleteMultipartUpload\": {\n          \"target\": \"com.amazonaws.s3#AbortIncompleteMultipartUpload\"\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>A lifecycle rule for individual objects in an Amazon S3 bucket.</p>\\n         <p>For more information see, <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lifecycle-mgmt.html\\\">Managing your storage lifecycle</a> in\\n      the <i>Amazon S3 User Guide</i>.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#LifecycleRuleAndOperator\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Prefix\": {\n          \"target\": \"com.amazonaws.s3#Prefix\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Prefix identifying one or more objects to which the rule applies.</p>\"\n          }\n        },\n        \"Tags\": {\n          \"target\": \"com.amazonaws.s3#TagSet\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>All of these tags must exist in the object's tag set in order for the rule to apply.</p>\",\n            \"smithy.api#xmlFlattened\": {},\n            \"smithy.api#xmlName\": \"Tag\"\n          }\n        },\n        \"ObjectSizeGreaterThan\": {\n          \"target\": \"com.amazonaws.s3#ObjectSizeGreaterThanBytes\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Minimum object size to which the rule applies.</p>\"\n          }\n        },\n        \"ObjectSizeLessThan\": {\n          \"target\": \"com.amazonaws.s3#ObjectSizeLessThanBytes\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Maximum object size to which the rule applies.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>This is used in a Lifecycle Rule Filter to apply a logical AND to two or more predicates. The\\n      Lifecycle Rule will apply to any object matching all of the predicates configured inside the And\\n      operator.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#LifecycleRuleFilter\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Prefix\": {\n          \"target\": \"com.amazonaws.s3#Prefix\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Prefix identifying one or more objects to which the rule applies.</p>\\n         <important>\\n            <p>Replacement must be made for object keys containing special characters (such as carriage returns) when using \\n         XML requests. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-keys.html#object-key-xml-related-constraints\\\">\\n            XML related object key constraints</a>.</p>\\n         </important>\"\n          }\n        },\n        \"Tag\": {\n          \"target\": \"com.amazonaws.s3#Tag\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>This tag must exist in the object's tag set in order for the rule to apply.</p>\\n         <note>\\n            <p>This parameter applies to general purpose buckets only. It is not supported for directory bucket\\n        lifecycle configurations.</p>\\n         </note>\"\n          }\n        },\n        \"ObjectSizeGreaterThan\": {\n          \"target\": \"com.amazonaws.s3#ObjectSizeGreaterThanBytes\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Minimum object size to which the rule applies.</p>\"\n          }\n        },\n        \"ObjectSizeLessThan\": {\n          \"target\": \"com.amazonaws.s3#ObjectSizeLessThanBytes\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Maximum object size to which the rule applies.</p>\"\n          }\n        },\n        \"And\": {\n          \"target\": \"com.amazonaws.s3#LifecycleRuleAndOperator\"\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>The <code>Filter</code> is used to identify objects that a Lifecycle Rule applies to. A\\n        <code>Filter</code> can have exactly one of <code>Prefix</code>, <code>Tag</code>,\\n        <code>ObjectSizeGreaterThan</code>, <code>ObjectSizeLessThan</code>, or <code>And</code> specified. If\\n      the <code>Filter</code> element is left empty, the Lifecycle Rule applies to all objects in the\\n      bucket.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#LifecycleRules\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.s3#LifecycleRule\"\n      }\n    },\n    \"com.amazonaws.s3#ListBucketAnalyticsConfigurations\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#ListBucketAnalyticsConfigurationsRequest\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.s3#ListBucketAnalyticsConfigurationsOutput\"\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported for directory buckets.</p>\\n         </note>\\n         <p>Lists the analytics configurations for the bucket. You can have up to 1,000 analytics configurations\\n      per bucket.</p>\\n         <p>This action supports list pagination and does not return more than 100 configurations at a time. You\\n      should always check the <code>IsTruncated</code> element in the response. If there are no more\\n      configurations to list, <code>IsTruncated</code> is set to false. If there are more configurations to\\n      list, <code>IsTruncated</code> is set to true, and there will be a value in\\n        <code>NextContinuationToken</code>. You use the <code>NextContinuationToken</code> value to continue\\n      the pagination of the list by passing the value in continuation-token in the request to <code>GET</code>\\n      the next page.</p>\\n         <p>To use this operation, you must have permissions to perform the\\n        <code>s3:GetAnalyticsConfiguration</code> action. The bucket owner has this permission by default. The\\n      bucket owner can grant this permission to others. For more information about permissions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-with-s3-actions.html#using-with-s3-actions-related-to-bucket-subresources\\\">Permissions Related to Bucket Subresource Operations</a> and <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html\\\">Managing Access Permissions to Your Amazon S3\\n        Resources</a>.</p>\\n         <p>For information about Amazon S3 analytics feature, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/analytics-storage-class.html\\\">Amazon S3 Analytics – Storage Class\\n      Analysis</a>. </p>\\n         <p>The following operations are related to <code>ListBucketAnalyticsConfigurations</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketAnalyticsConfiguration.html\\\">GetBucketAnalyticsConfiguration</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketAnalyticsConfiguration.html\\\">DeleteBucketAnalyticsConfiguration</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketAnalyticsConfiguration.html\\\">PutBucketAnalyticsConfiguration</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#http\": {\n          \"method\": \"GET\",\n          \"uri\": \"/{Bucket}?analytics&x-id=ListBucketAnalyticsConfigurations\",\n          \"code\": 200\n        },\n        \"smithy.rules#staticContextParams\": {\n          \"UseS3ExpressControlEndpoint\": {\n            \"value\": true\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#ListBucketAnalyticsConfigurationsOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"IsTruncated\": {\n          \"target\": \"com.amazonaws.s3#IsTruncated\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Indicates whether the returned list of analytics configurations is complete. A value of true\\n      indicates that the list is not complete and the NextContinuationToken will be provided for a subsequent\\n      request.</p>\"\n          }\n        },\n        \"ContinuationToken\": {\n          \"target\": \"com.amazonaws.s3#Token\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The marker that is used as a starting point for this analytics configuration list response. This\\n      value is present if it was sent in the request.</p>\"\n          }\n        },\n        \"NextContinuationToken\": {\n          \"target\": \"com.amazonaws.s3#NextToken\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>\\n            <code>NextContinuationToken</code> is sent when <code>isTruncated</code> is true, which indicates\\n      that there are more analytics configurations to list. The next request must include this\\n        <code>NextContinuationToken</code>. The token is obfuscated and is not a usable value.</p>\"\n          }\n        },\n        \"AnalyticsConfigurationList\": {\n          \"target\": \"com.amazonaws.s3#AnalyticsConfigurationList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The list of analytics configurations for a bucket.</p>\",\n            \"smithy.api#xmlFlattened\": {},\n            \"smithy.api#xmlName\": \"AnalyticsConfiguration\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#output\": {},\n        \"smithy.api#xmlName\": \"ListBucketAnalyticsConfigurationResult\"\n      }\n    },\n    \"com.amazonaws.s3#ListBucketAnalyticsConfigurationsRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the bucket from which analytics configurations are retrieved.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"ContinuationToken\": {\n          \"target\": \"com.amazonaws.s3#Token\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The <code>ContinuationToken</code> that represents a placeholder from where this request should\\n      begin.</p>\",\n            \"smithy.api#httpQuery\": \"continuation-token\"\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#ListBucketIntelligentTieringConfigurations\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#ListBucketIntelligentTieringConfigurationsRequest\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.s3#ListBucketIntelligentTieringConfigurationsOutput\"\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported for directory buckets.</p>\\n         </note>\\n         <p>Lists the S3 Intelligent-Tiering configuration from the specified bucket.</p>\\n         <p>The S3 Intelligent-Tiering storage class is designed to optimize storage costs by automatically moving data to the most cost-effective storage access tier, without performance impact or operational overhead. S3 Intelligent-Tiering delivers automatic cost savings in three low latency and high throughput access tiers. To get the lowest storage cost on data that can be accessed in minutes to hours, you can choose to activate additional archiving capabilities.</p>\\n         <p>The S3 Intelligent-Tiering storage class is  the ideal storage class for data with unknown, changing, or unpredictable access patterns, independent of object size or retention period. If the size of an object is less than 128 KB, it is not monitored and not eligible for auto-tiering. Smaller objects can be stored, but they are always charged at the Frequent Access tier rates in the S3 Intelligent-Tiering storage class.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/storage-class-intro.html#sc-dynamic-data-access\\\">Storage class for automatically optimizing frequently and infrequently accessed objects</a>.</p>\\n         <p>Operations related to <code>ListBucketIntelligentTieringConfigurations</code> include: </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketIntelligentTieringConfiguration.html\\\">DeleteBucketIntelligentTieringConfiguration</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketIntelligentTieringConfiguration.html\\\">PutBucketIntelligentTieringConfiguration</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketIntelligentTieringConfiguration.html\\\">GetBucketIntelligentTieringConfiguration</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#http\": {\n          \"method\": \"GET\",\n          \"uri\": \"/{Bucket}?intelligent-tiering&x-id=ListBucketIntelligentTieringConfigurations\",\n          \"code\": 200\n        },\n        \"smithy.rules#staticContextParams\": {\n          \"UseS3ExpressControlEndpoint\": {\n            \"value\": true\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#ListBucketIntelligentTieringConfigurationsOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"IsTruncated\": {\n          \"target\": \"com.amazonaws.s3#IsTruncated\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Indicates whether the returned list of analytics configurations is complete. A value of\\n        <code>true</code> indicates that the list is not complete and the <code>NextContinuationToken</code>\\n      will be provided for a subsequent request.</p>\"\n          }\n        },\n        \"ContinuationToken\": {\n          \"target\": \"com.amazonaws.s3#Token\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The <code>ContinuationToken</code> that represents a placeholder from where this request should\\n      begin.</p>\"\n          }\n        },\n        \"NextContinuationToken\": {\n          \"target\": \"com.amazonaws.s3#NextToken\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The marker used to continue this inventory configuration listing. Use the\\n        <code>NextContinuationToken</code> from this response to continue the listing in a subsequent request.\\n      The continuation token is an opaque value that Amazon S3 understands.</p>\"\n          }\n        },\n        \"IntelligentTieringConfigurationList\": {\n          \"target\": \"com.amazonaws.s3#IntelligentTieringConfigurationList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The list of S3 Intelligent-Tiering configurations for a bucket.</p>\",\n            \"smithy.api#xmlFlattened\": {},\n            \"smithy.api#xmlName\": \"IntelligentTieringConfiguration\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#output\": {}\n      }\n    },\n    \"com.amazonaws.s3#ListBucketIntelligentTieringConfigurationsRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the Amazon S3 bucket whose configuration you want to modify or retrieve.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"ContinuationToken\": {\n          \"target\": \"com.amazonaws.s3#Token\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The <code>ContinuationToken</code> that represents a placeholder from where this request should\\n      begin.</p>\",\n            \"smithy.api#httpQuery\": \"continuation-token\"\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#ListBucketInventoryConfigurations\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#ListBucketInventoryConfigurationsRequest\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.s3#ListBucketInventoryConfigurationsOutput\"\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported for directory buckets.</p>\\n         </note>\\n         <p>Returns a list of S3 Inventory configurations for the bucket. You can have up to 1,000 inventory\\n      configurations per bucket.</p>\\n         <p>This action supports list pagination and does not return more than 100 configurations at a time.\\n      Always check the <code>IsTruncated</code> element in the response. If there are no more configurations\\n      to list, <code>IsTruncated</code> is set to false. If there are more configurations to list,\\n        <code>IsTruncated</code> is set to true, and there is a value in <code>NextContinuationToken</code>.\\n      You use the <code>NextContinuationToken</code> value to continue the pagination of the list by passing\\n      the value in continuation-token in the request to <code>GET</code> the next page.</p>\\n         <p> To use this operation, you must have permissions to perform the\\n        <code>s3:GetInventoryConfiguration</code> action. The bucket owner has this permission by default. The\\n      bucket owner can grant this permission to others. For more information about permissions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-with-s3-actions.html#using-with-s3-actions-related-to-bucket-subresources\\\">Permissions Related to Bucket Subresource Operations</a> and <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html\\\">Managing Access Permissions to Your Amazon S3\\n        Resources</a>.</p>\\n         <p>For information about the Amazon S3 inventory feature, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/storage-inventory.html\\\">Amazon S3 Inventory</a>\\n         </p>\\n         <p>The following operations are related to <code>ListBucketInventoryConfigurations</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketInventoryConfiguration.html\\\">GetBucketInventoryConfiguration</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketInventoryConfiguration.html\\\">DeleteBucketInventoryConfiguration</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketInventoryConfiguration.html\\\">PutBucketInventoryConfiguration</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#http\": {\n          \"method\": \"GET\",\n          \"uri\": \"/{Bucket}?inventory&x-id=ListBucketInventoryConfigurations\",\n          \"code\": 200\n        },\n        \"smithy.rules#staticContextParams\": {\n          \"UseS3ExpressControlEndpoint\": {\n            \"value\": true\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#ListBucketInventoryConfigurationsOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"ContinuationToken\": {\n          \"target\": \"com.amazonaws.s3#Token\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>If sent in the request, the marker that is used as a starting point for this inventory configuration\\n      list response.</p>\"\n          }\n        },\n        \"InventoryConfigurationList\": {\n          \"target\": \"com.amazonaws.s3#InventoryConfigurationList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The list of inventory configurations for a bucket.</p>\",\n            \"smithy.api#xmlFlattened\": {},\n            \"smithy.api#xmlName\": \"InventoryConfiguration\"\n          }\n        },\n        \"IsTruncated\": {\n          \"target\": \"com.amazonaws.s3#IsTruncated\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Tells whether the returned list of inventory configurations is complete. A value of true indicates\\n      that the list is not complete and the NextContinuationToken is provided for a subsequent request.</p>\"\n          }\n        },\n        \"NextContinuationToken\": {\n          \"target\": \"com.amazonaws.s3#NextToken\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The marker used to continue this inventory configuration listing. Use the\\n        <code>NextContinuationToken</code> from this response to continue the listing in a subsequent request.\\n      The continuation token is an opaque value that Amazon S3 understands.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#output\": {},\n        \"smithy.api#xmlName\": \"ListInventoryConfigurationsResult\"\n      }\n    },\n    \"com.amazonaws.s3#ListBucketInventoryConfigurationsRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the bucket containing the inventory configurations to retrieve.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"ContinuationToken\": {\n          \"target\": \"com.amazonaws.s3#Token\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The marker used to continue an inventory configuration listing that has been truncated. Use the\\n        <code>NextContinuationToken</code> from a previously truncated list response to continue the listing.\\n      The continuation token is an opaque value that Amazon S3 understands.</p>\",\n            \"smithy.api#httpQuery\": \"continuation-token\"\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#ListBucketMetricsConfigurations\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#ListBucketMetricsConfigurationsRequest\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.s3#ListBucketMetricsConfigurationsOutput\"\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported for directory buckets.</p>\\n         </note>\\n         <p>Lists the metrics configurations for the bucket. The metrics configurations are only for the request\\n      metrics of the bucket and do not provide information on daily storage metrics. You can have up to 1,000\\n      configurations per bucket.</p>\\n         <p>This action supports list pagination and does not return more than 100 configurations at a time.\\n      Always check the <code>IsTruncated</code> element in the response. If there are no more configurations\\n      to list, <code>IsTruncated</code> is set to false. If there are more configurations to list,\\n        <code>IsTruncated</code> is set to true, and there is a value in <code>NextContinuationToken</code>.\\n      You use the <code>NextContinuationToken</code> value to continue the pagination of the list by passing\\n      the value in <code>continuation-token</code> in the request to <code>GET</code> the next page.</p>\\n         <p>To use this operation, you must have permissions to perform the\\n        <code>s3:GetMetricsConfiguration</code> action. The bucket owner has this permission by default. The\\n      bucket owner can grant this permission to others. For more information about permissions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-with-s3-actions.html#using-with-s3-actions-related-to-bucket-subresources\\\">Permissions Related to Bucket Subresource Operations</a> and <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html\\\">Managing Access Permissions to Your Amazon S3\\n        Resources</a>.</p>\\n         <p>For more information about metrics configurations and CloudWatch request metrics, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/cloudwatch-monitoring.html\\\">Monitoring Metrics with\\n        Amazon CloudWatch</a>.</p>\\n         <p>The following operations are related to <code>ListBucketMetricsConfigurations</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketMetricsConfiguration.html\\\">PutBucketMetricsConfiguration</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketMetricsConfiguration.html\\\">GetBucketMetricsConfiguration</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketMetricsConfiguration.html\\\">DeleteBucketMetricsConfiguration</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#http\": {\n          \"method\": \"GET\",\n          \"uri\": \"/{Bucket}?metrics&x-id=ListBucketMetricsConfigurations\",\n          \"code\": 200\n        }\n      }\n    },\n    \"com.amazonaws.s3#ListBucketMetricsConfigurationsOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"IsTruncated\": {\n          \"target\": \"com.amazonaws.s3#IsTruncated\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Indicates whether the returned list of metrics configurations is complete. A value of true indicates\\n      that the list is not complete and the NextContinuationToken will be provided for a subsequent\\n      request.</p>\"\n          }\n        },\n        \"ContinuationToken\": {\n          \"target\": \"com.amazonaws.s3#Token\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The marker that is used as a starting point for this metrics configuration list response. This value\\n      is present if it was sent in the request.</p>\"\n          }\n        },\n        \"NextContinuationToken\": {\n          \"target\": \"com.amazonaws.s3#NextToken\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The marker used to continue a metrics configuration listing that has been truncated. Use the\\n        <code>NextContinuationToken</code> from a previously truncated list response to continue the listing.\\n      The continuation token is an opaque value that Amazon S3 understands.</p>\"\n          }\n        },\n        \"MetricsConfigurationList\": {\n          \"target\": \"com.amazonaws.s3#MetricsConfigurationList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The list of metrics configurations for a bucket.</p>\",\n            \"smithy.api#xmlFlattened\": {},\n            \"smithy.api#xmlName\": \"MetricsConfiguration\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#output\": {},\n        \"smithy.api#xmlName\": \"ListMetricsConfigurationsResult\"\n      }\n    },\n    \"com.amazonaws.s3#ListBucketMetricsConfigurationsRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the bucket containing the metrics configurations to retrieve.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"ContinuationToken\": {\n          \"target\": \"com.amazonaws.s3#Token\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The marker that is used to continue a metrics configuration listing that has been truncated. Use the\\n        <code>NextContinuationToken</code> from a previously truncated list response to continue the listing.\\n      The continuation token is an opaque value that Amazon S3 understands.</p>\",\n            \"smithy.api#httpQuery\": \"continuation-token\"\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#ListBuckets\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#ListBucketsRequest\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.s3#ListBucketsOutput\"\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported for directory buckets.</p>\\n         </note>\\n         <p>Returns a list of all buckets owned by the authenticated sender of the request. To grant IAM\\n      permission to use this operation, you must add the <code>s3:ListAllMyBuckets</code> policy action. </p>\\n         <p>For information about Amazon S3 buckets, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/creating-buckets-s3.html\\\">Creating, configuring, and working with Amazon S3\\n        buckets</a>.</p>\\n         <important>\\n            <p>We strongly recommend using only paginated <code>ListBuckets</code> requests. Unpaginated\\n          <code>ListBuckets</code> requests are only supported for Amazon Web Services accounts set to the default general\\n        purpose bucket quota of 10,000. If you have an approved general purpose bucket quota above 10,000, you\\n        must send paginated <code>ListBuckets</code> requests to list your account’s buckets. All unpaginated\\n          <code>ListBuckets</code> requests will be rejected for Amazon Web Services accounts with a general purpose bucket\\n        quota greater than 10,000. </p>\\n         </important>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#examples\": [\n          {\n            \"title\": \"To list all buckets\",\n            \"documentation\": \"The following example returns all the buckets owned by the sender of this request.\",\n            \"output\": {\n              \"Owner\": {\n                \"DisplayName\": \"own-display-name\",\n                \"ID\": \"examplee7a2f25102679df27bb0ae12b3f85be6f290b936c4393484be31\"\n              },\n              \"Buckets\": [\n                {\n                  \"CreationDate\": \"2012-02-15T21:03:02.000Z\",\n                  \"Name\": \"examplebucket\"\n                },\n                {\n                  \"CreationDate\": \"2011-07-24T19:33:50.000Z\",\n                  \"Name\": \"examplebucket2\"\n                },\n                {\n                  \"CreationDate\": \"2010-12-17T00:56:49.000Z\",\n                  \"Name\": \"examplebucket3\"\n                }\n              ]\n            }\n          }\n        ],\n        \"smithy.api#http\": {\n          \"method\": \"GET\",\n          \"uri\": \"/?x-id=ListBuckets\",\n          \"code\": 200\n        },\n        \"smithy.api#paginated\": {\n          \"inputToken\": \"ContinuationToken\",\n          \"outputToken\": \"ContinuationToken\",\n          \"items\": \"Buckets\",\n          \"pageSize\": \"MaxBuckets\"\n        }\n      }\n    },\n    \"com.amazonaws.s3#ListBucketsOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Buckets\": {\n          \"target\": \"com.amazonaws.s3#Buckets\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The list of buckets owned by the requester.</p>\"\n          }\n        },\n        \"Owner\": {\n          \"target\": \"com.amazonaws.s3#Owner\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The owner of the buckets listed.</p>\"\n          }\n        },\n        \"ContinuationToken\": {\n          \"target\": \"com.amazonaws.s3#NextToken\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>\\n            <code>ContinuationToken</code> is included in the response when there are more buckets that can be\\n      listed with pagination. The next <code>ListBuckets</code> request to Amazon S3 can be continued with this\\n        <code>ContinuationToken</code>. <code>ContinuationToken</code> is obfuscated and is not a real\\n      bucket.</p>\"\n          }\n        },\n        \"Prefix\": {\n          \"target\": \"com.amazonaws.s3#Prefix\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>If <code>Prefix</code> was sent with the request, it is included in the response.</p>\\n         <p>All bucket names in the response begin with the specified bucket name prefix.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#output\": {},\n        \"smithy.api#xmlName\": \"ListAllMyBucketsResult\"\n      }\n    },\n    \"com.amazonaws.s3#ListBucketsRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"MaxBuckets\": {\n          \"target\": \"com.amazonaws.s3#MaxBuckets\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Maximum number of buckets to be returned in response. When the number is more than the count of\\n      buckets that are owned by an Amazon Web Services account, return all the buckets in response.</p>\",\n            \"smithy.api#httpQuery\": \"max-buckets\"\n          }\n        },\n        \"ContinuationToken\": {\n          \"target\": \"com.amazonaws.s3#Token\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>\\n            <code>ContinuationToken</code> indicates to Amazon S3 that the list is being continued on this bucket\\n      with a token. <code>ContinuationToken</code> is obfuscated and is not a real key. You can use this\\n        <code>ContinuationToken</code> for pagination of the list results. </p>\\n         <p>Length Constraints: Minimum length of 0. Maximum length of 1024.</p>\\n         <p>Required: No.</p>\\n         <note>\\n            <p>If you specify the <code>bucket-region</code>, <code>prefix</code>, or\\n          <code>continuation-token</code> query parameters without using <code>max-buckets</code> to set the\\n        maximum number of buckets returned in the response, Amazon S3 applies a default page size of 10,000 and\\n        provides a continuation token if there are more buckets.</p>\\n         </note>\",\n            \"smithy.api#httpQuery\": \"continuation-token\"\n          }\n        },\n        \"Prefix\": {\n          \"target\": \"com.amazonaws.s3#Prefix\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Limits the response to bucket names that begin with the specified bucket name prefix.</p>\",\n            \"smithy.api#httpQuery\": \"prefix\"\n          }\n        },\n        \"BucketRegion\": {\n          \"target\": \"com.amazonaws.s3#BucketRegion\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Limits the response to buckets that are located in the specified Amazon Web Services Region. The Amazon Web Services Region must\\n      be expressed according to the Amazon Web Services Region code, such as <code>us-west-2</code> for the US West (Oregon)\\n      Region. For a list of the valid values for all of the Amazon Web Services Regions, see <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region\\\">Regions and Endpoints</a>.</p>\\n         <note>\\n            <p>Requests made to a Regional endpoint that is different from the <code>bucket-region</code>\\n        parameter are not supported. For example, if you want to limit the response to your buckets in Region\\n          <code>us-west-2</code>, the request must be made to an endpoint in Region\\n        <code>us-west-2</code>.</p>\\n         </note>\",\n            \"smithy.api#httpQuery\": \"bucket-region\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#ListDirectoryBuckets\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#ListDirectoryBucketsRequest\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.s3#ListDirectoryBucketsOutput\"\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Returns a list of all Amazon S3 directory buckets owned by the authenticated sender of the request. For\\n      more information about directory buckets, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-buckets-overview.html\\\">Directory buckets</a> in the\\n        <i>Amazon S3 User Guide</i>.</p>\\n         <note>\\n            <p>\\n               <b>Directory buckets </b> - For directory buckets, you must make requests for this API operation to the Regional endpoint. These endpoints support path-style requests in the format <code>https://s3express-control.<i>region-code</i>.amazonaws.com/<i>bucket-name</i>\\n               </code>. Virtual-hosted-style requests aren't supported. \\nFor more information about endpoints in Availability Zones, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/endpoint-directory-buckets-AZ.html\\\">Regional and Zonal endpoints for directory buckets in Availability Zones</a> in the\\n    <i>Amazon S3 User Guide</i>. For more information about endpoints in Local Zones, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-lzs-for-directory-buckets.html\\\">Concepts for directory buckets in Local Zones</a> in the\\n    <i>Amazon S3 User Guide</i>.</p>\\n         </note>\\n         <dl>\\n            <dt>Permissions</dt>\\n            <dd>\\n               <p>You must have the <code>s3express:ListAllMyDirectoryBuckets</code> permission in\\n            an IAM identity-based policy instead of a bucket policy. Cross-account access to this API operation isn't supported. This operation can only be performed by the Amazon Web Services account that owns the resource.\\n            For more information about directory bucket policies and permissions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-security-iam.html\\\">Amazon Web Services Identity and Access Management (IAM) for S3 Express One Zone</a> in the <i>Amazon S3 User Guide</i>.</p>\\n            </dd>\\n            <dt>HTTP Host header syntax</dt>\\n            <dd>\\n               <p>\\n                  <b>Directory buckets </b> - The HTTP Host header syntax is\\n                <code>s3express-control.<i>region</i>.amazonaws.com</code>.</p>\\n            </dd>\\n         </dl>\\n         <note>\\n            <p> The <code>BucketRegion</code> response element is not part of the\\n          <code>ListDirectoryBuckets</code> Response Syntax.</p>\\n         </note>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#http\": {\n          \"method\": \"GET\",\n          \"uri\": \"/?x-id=ListDirectoryBuckets\",\n          \"code\": 200\n        },\n        \"smithy.api#paginated\": {\n          \"inputToken\": \"ContinuationToken\",\n          \"outputToken\": \"ContinuationToken\",\n          \"items\": \"Buckets\",\n          \"pageSize\": \"MaxDirectoryBuckets\"\n        },\n        \"smithy.rules#staticContextParams\": {\n          \"UseS3ExpressControlEndpoint\": {\n            \"value\": true\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#ListDirectoryBucketsOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Buckets\": {\n          \"target\": \"com.amazonaws.s3#Buckets\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The list of buckets owned by the requester. </p>\"\n          }\n        },\n        \"ContinuationToken\": {\n          \"target\": \"com.amazonaws.s3#DirectoryBucketToken\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>If <code>ContinuationToken</code> was sent with the request, it is included in the response. You can\\n      use the returned <code>ContinuationToken</code> for pagination of the list response.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#output\": {},\n        \"smithy.api#xmlName\": \"ListAllMyDirectoryBucketsResult\"\n      }\n    },\n    \"com.amazonaws.s3#ListDirectoryBucketsRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"ContinuationToken\": {\n          \"target\": \"com.amazonaws.s3#DirectoryBucketToken\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>\\n            <code>ContinuationToken</code> indicates to Amazon S3 that the list is being continued on buckets in this\\n      account with a token. <code>ContinuationToken</code> is obfuscated and is not a real bucket name. You\\n      can use this <code>ContinuationToken</code> for the pagination of the list results. </p>\",\n            \"smithy.api#httpQuery\": \"continuation-token\"\n          }\n        },\n        \"MaxDirectoryBuckets\": {\n          \"target\": \"com.amazonaws.s3#MaxDirectoryBuckets\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Maximum number of buckets to be returned in response. When the number is more than the count of\\n      buckets that are owned by an Amazon Web Services account, return all the buckets in response.</p>\",\n            \"smithy.api#httpQuery\": \"max-directory-buckets\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#ListMultipartUploads\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#ListMultipartUploadsRequest\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.s3#ListMultipartUploadsOutput\"\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>This operation lists in-progress multipart uploads in a bucket. An in-progress multipart upload is a\\n      multipart upload that has been initiated by the <code>CreateMultipartUpload</code> request, but has not\\n      yet been completed or aborted.</p>\\n         <note>\\n            <p>\\n               <b>Directory buckets</b> - If multipart uploads in a\\n        directory bucket are in progress, you can't delete the bucket until all the in-progress multipart\\n        uploads are aborted or completed. To delete these in-progress multipart uploads, use the\\n          <code>ListMultipartUploads</code> operation to list the in-progress multipart uploads in the bucket\\n        and use the <code>AbortMultipartUpload</code> operation to abort all the in-progress multipart\\n        uploads. </p>\\n         </note>\\n         <p>The <code>ListMultipartUploads</code> operation returns a maximum of 1,000 multipart uploads in the\\n      response. The limit of 1,000 multipart uploads is also the default value. You can further limit the\\n      number of uploads in a response by specifying the <code>max-uploads</code> request parameter. If there\\n      are more than 1,000 multipart uploads that satisfy your <code>ListMultipartUploads</code> request, the\\n      response returns an <code>IsTruncated</code> element with the value of <code>true</code>, a\\n        <code>NextKeyMarker</code> element, and a <code>NextUploadIdMarker</code> element. To list the\\n      remaining multipart uploads, you need to make subsequent <code>ListMultipartUploads</code> requests. In\\n      these requests, include two query parameters: <code>key-marker</code> and <code>upload-id-marker</code>.\\n      Set the value of <code>key-marker</code> to the <code>NextKeyMarker</code> value from the previous\\n      response. Similarly, set the value of <code>upload-id-marker</code> to the\\n        <code>NextUploadIdMarker</code> value from the previous response.</p>\\n         <note>\\n            <p>\\n               <b>Directory buckets</b> - The <code>upload-id-marker</code>\\n        element and the <code>NextUploadIdMarker</code> element aren't supported by directory buckets. To\\n        list the additional multipart uploads, you only need to set the value of <code>key-marker</code> to\\n        the <code>NextKeyMarker</code> value from the previous response. </p>\\n         </note>\\n         <p>For more information about multipart uploads, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/uploadobjusingmpu.html\\\">Uploading Objects Using Multipart Upload</a> in\\n      the <i>Amazon S3 User Guide</i>.</p>\\n         <note>\\n            <p>\\n               <b>Directory buckets</b> - For directory buckets, you must make requests for this API operation to the Zonal endpoint. These endpoints support virtual-hosted-style requests in the format <code>https://<i>amzn-s3-demo-bucket</i>.s3express-<i>zone-id</i>.<i>region-code</i>.amazonaws.com/<i>key-name</i>\\n               </code>. Path-style requests are not supported. For more information about endpoints in Availability Zones, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/endpoint-directory-buckets-AZ.html\\\">Regional and Zonal endpoints for directory buckets in Availability Zones</a> in the\\n    <i>Amazon S3 User Guide</i>. For more information about endpoints in Local Zones, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-lzs-for-directory-buckets.html\\\">Concepts for directory buckets in Local Zones</a> in the\\n    <i>Amazon S3 User Guide</i>.</p>\\n         </note>\\n         <dl>\\n            <dt>Permissions</dt>\\n            <dd>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <b>General purpose bucket permissions</b> - For information\\n                about permissions required to use the multipart upload API, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/mpuAndPermissions.html\\\">Multipart Upload and Permissions</a> in\\n                the <i>Amazon S3 User Guide</i>.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <b>Directory bucket permissions</b> - To grant access to this API operation on a directory bucket, we recommend that you use the <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateSession.html\\\">\\n                           <code>CreateSession</code>\\n                        </a> API operation for session-based authorization. Specifically, you grant the <code>s3express:CreateSession</code> permission to the directory bucket in a bucket policy or an IAM identity-based policy. Then, you make the <code>CreateSession</code> API call on the bucket to obtain a session token. With the session token in your request header, you can make API requests to this operation. After the session token expires, you make another <code>CreateSession</code> API call to generate a new session token for use. \\nAmazon Web Services CLI or SDKs create session and refresh the session token automatically to avoid service interruptions when a session expires. For more information about authorization, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateSession.html\\\">\\n                           <code>CreateSession</code>\\n                        </a>.</p>\\n                  </li>\\n               </ul>\\n            </dd>\\n            <dt>Sorting of multipart uploads in response</dt>\\n            <dd>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <b>General purpose bucket</b> - In the\\n                  <code>ListMultipartUploads</code> response, the multipart uploads are sorted based on two\\n                criteria:</p>\\n                     <ul>\\n                        <li>\\n                           <p>Key-based sorting - Multipart uploads are initially sorted in ascending order\\n                    based on their object keys.</p>\\n                        </li>\\n                        <li>\\n                           <p>Time-based sorting - For uploads that share the same object key, they are\\n                    further sorted in ascending order based on the upload initiation time. Among uploads with\\n                    the same key, the one that was initiated first will appear before the ones that were\\n                    initiated later.</p>\\n                        </li>\\n                     </ul>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <b>Directory bucket</b> - In the\\n                  <code>ListMultipartUploads</code> response, the multipart uploads aren't sorted\\n                lexicographically based on the object keys.\\n                \\n              </p>\\n                  </li>\\n               </ul>\\n            </dd>\\n            <dt>HTTP Host header syntax</dt>\\n            <dd>\\n               <p>\\n                  <b>Directory buckets </b> - The HTTP Host header syntax is <code>\\n                     <i>Bucket-name</i>.s3express-<i>zone-id</i>.<i>region-code</i>.amazonaws.com</code>.</p>\\n            </dd>\\n         </dl>\\n         <p>The following operations are related to <code>ListMultipartUploads</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateMultipartUpload.html\\\">CreateMultipartUpload</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPart.html\\\">UploadPart</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html\\\">CompleteMultipartUpload</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListParts.html\\\">ListParts</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_AbortMultipartUpload.html\\\">AbortMultipartUpload</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#examples\": [\n          {\n            \"title\": \"List next set of multipart uploads when previous result is truncated\",\n            \"documentation\": \"The following example specifies the upload-id-marker and key-marker from previous truncated response to retrieve next setup of multipart uploads.\",\n            \"input\": {\n              \"Bucket\": \"examplebucket\",\n              \"KeyMarker\": \"nextkeyfrompreviousresponse\",\n              \"MaxUploads\": 2,\n              \"UploadIdMarker\": \"valuefrompreviousresponse\"\n            },\n            \"output\": {\n              \"UploadIdMarker\": \"\",\n              \"NextKeyMarker\": \"someobjectkey\",\n              \"Bucket\": \"acl1\",\n              \"NextUploadIdMarker\": \"examplelo91lv1iwvWpvCiJWugw2xXLPAD7Z8cJyX9.WiIRgNrdG6Ldsn.9FtS63TCl1Uf5faTB.1U5Ckcbmdw--\",\n              \"Uploads\": [\n                {\n                  \"Initiator\": {\n                    \"DisplayName\": \"ownder-display-name\",\n                    \"ID\": \"examplee7a2f25102679df27bb0ae12b3f85be6f290b936c4393484be31bebcc\"\n                  },\n                  \"Initiated\": \"2014-05-01T05:40:58.000Z\",\n                  \"UploadId\": \"gZ30jIqlUa.CInXklLQtSMJITdUnoZ1Y5GACB5UckOtspm5zbDMCkPF_qkfZzMiFZ6dksmcnqxJyIBvQMG9X9Q--\",\n                  \"StorageClass\": \"STANDARD\",\n                  \"Key\": \"JavaFile\",\n                  \"Owner\": {\n                    \"DisplayName\": \"mohanataws\",\n                    \"ID\": \"852b113e7a2f25102679df27bb0ae12b3f85be6f290b936c4393484be31bebcc\"\n                  }\n                },\n                {\n                  \"Initiator\": {\n                    \"DisplayName\": \"ownder-display-name\",\n                    \"ID\": \"examplee7a2f25102679df27bb0ae12b3f85be6f290b936c4393484be31bebcc\"\n                  },\n                  \"Initiated\": \"2014-05-01T05:41:27.000Z\",\n                  \"UploadId\": \"b7tZSqIlo91lv1iwvWpvCiJWugw2xXLPAD7Z8cJyX9.WiIRgNrdG6Ldsn.9FtS63TCl1Uf5faTB.1U5Ckcbmdw--\",\n                  \"StorageClass\": \"STANDARD\",\n                  \"Key\": \"JavaFile\",\n                  \"Owner\": {\n                    \"DisplayName\": \"ownder-display-name\",\n                    \"ID\": \"examplee7a2f25102679df27bb0ae12b3f85be6f290b936c4393484be31bebcc\"\n                  }\n                }\n              ],\n              \"KeyMarker\": \"\",\n              \"MaxUploads\": 2,\n              \"IsTruncated\": true\n            }\n          },\n          {\n            \"title\": \"To list in-progress multipart uploads on a bucket\",\n            \"documentation\": \"The following example lists in-progress multipart uploads on a specific bucket.\",\n            \"input\": {\n              \"Bucket\": \"examplebucket\"\n            },\n            \"output\": {\n              \"Uploads\": [\n                {\n                  \"Initiator\": {\n                    \"DisplayName\": \"display-name\",\n                    \"ID\": \"examplee7a2f25102679df27bb0ae12b3f85be6f290b936c4393484be31bebcc\"\n                  },\n                  \"Initiated\": \"2014-05-01T05:40:58.000Z\",\n                  \"UploadId\": \"examplelUa.CInXklLQtSMJITdUnoZ1Y5GACB5UckOtspm5zbDMCkPF_qkfZzMiFZ6dksmcnqxJyIBvQMG9X9Q--\",\n                  \"StorageClass\": \"STANDARD\",\n                  \"Key\": \"JavaFile\",\n                  \"Owner\": {\n                    \"DisplayName\": \"display-name\",\n                    \"ID\": \"examplee7a2f25102679df27bb0ae12b3f85be6f290b936c4393484be31bebcc\"\n                  }\n                },\n                {\n                  \"Initiator\": {\n                    \"DisplayName\": \"display-name\",\n                    \"ID\": \"examplee7a2f25102679df27bb0ae12b3f85be6f290b936c4393484be31bebcc\"\n                  },\n                  \"Initiated\": \"2014-05-01T05:41:27.000Z\",\n                  \"UploadId\": \"examplelo91lv1iwvWpvCiJWugw2xXLPAD7Z8cJyX9.WiIRgNrdG6Ldsn.9FtS63TCl1Uf5faTB.1U5Ckcbmdw--\",\n                  \"StorageClass\": \"STANDARD\",\n                  \"Key\": \"JavaFile\",\n                  \"Owner\": {\n                    \"DisplayName\": \"display-name\",\n                    \"ID\": \"examplee7a2f25102679df27bb0ae12b3f85be6f290b936c4393484be31bebcc\"\n                  }\n                }\n              ]\n            }\n          }\n        ],\n        \"smithy.api#http\": {\n          \"method\": \"GET\",\n          \"uri\": \"/{Bucket}?uploads\",\n          \"code\": 200\n        }\n      }\n    },\n    \"com.amazonaws.s3#ListMultipartUploadsOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the bucket to which the multipart upload was initiated. Does not return the access point ARN or\\n      access point alias if used.</p>\"\n          }\n        },\n        \"KeyMarker\": {\n          \"target\": \"com.amazonaws.s3#KeyMarker\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The key at or after which the listing began.</p>\"\n          }\n        },\n        \"UploadIdMarker\": {\n          \"target\": \"com.amazonaws.s3#UploadIdMarker\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Together with key-marker, specifies the multipart upload after which listing should begin. If\\n      key-marker is not specified, the upload-id-marker parameter is ignored. Otherwise, any multipart uploads\\n      for a key equal to the key-marker might be included in the list only if they have an upload ID\\n      lexicographically greater than the specified <code>upload-id-marker</code>.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\"\n          }\n        },\n        \"NextKeyMarker\": {\n          \"target\": \"com.amazonaws.s3#NextKeyMarker\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>When a list is truncated, this element specifies the value that should be used for the key-marker\\n      request parameter in a subsequent request.</p>\"\n          }\n        },\n        \"Prefix\": {\n          \"target\": \"com.amazonaws.s3#Prefix\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>When a prefix is provided in the request, this field contains the specified prefix. The result\\n      contains only keys starting with the specified prefix.</p>\\n         <note>\\n            <p>\\n               <b>Directory buckets</b> - For directory buckets, only prefixes that end in a delimiter (<code>/</code>) are supported.</p>\\n         </note>\"\n          }\n        },\n        \"Delimiter\": {\n          \"target\": \"com.amazonaws.s3#Delimiter\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Contains the delimiter you specified in the request. If you don't specify a delimiter in your\\n      request, this element is absent from the response.</p>\\n         <note>\\n            <p>\\n               <b>Directory buckets</b> - For directory buckets, <code>/</code> is the only supported delimiter.</p>\\n         </note>\"\n          }\n        },\n        \"NextUploadIdMarker\": {\n          \"target\": \"com.amazonaws.s3#NextUploadIdMarker\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>When a list is truncated, this element specifies the value that should be used for the\\n        <code>upload-id-marker</code> request parameter in a subsequent request.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\"\n          }\n        },\n        \"MaxUploads\": {\n          \"target\": \"com.amazonaws.s3#MaxUploads\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Maximum number of multipart uploads that could have been included in the response.</p>\"\n          }\n        },\n        \"IsTruncated\": {\n          \"target\": \"com.amazonaws.s3#IsTruncated\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Indicates whether the returned list of multipart uploads is truncated. A value of true indicates\\n      that the list was truncated. The list can be truncated if the number of multipart uploads exceeds the\\n      limit allowed or specified by max uploads.</p>\"\n          }\n        },\n        \"Uploads\": {\n          \"target\": \"com.amazonaws.s3#MultipartUploadList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Container for elements related to a particular multipart upload. A response can contain zero or more\\n        <code>Upload</code> elements.</p>\",\n            \"smithy.api#xmlFlattened\": {},\n            \"smithy.api#xmlName\": \"Upload\"\n          }\n        },\n        \"CommonPrefixes\": {\n          \"target\": \"com.amazonaws.s3#CommonPrefixList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>If you specify a delimiter in the request, then the result returns each distinct key prefix\\n      containing the delimiter in a <code>CommonPrefixes</code> element. The distinct key prefixes are\\n      returned in the <code>Prefix</code> child element.</p>\\n         <note>\\n            <p>\\n               <b>Directory buckets</b> - For directory buckets, only prefixes that end in a delimiter (<code>/</code>) are supported.</p>\\n         </note>\",\n            \"smithy.api#xmlFlattened\": {}\n          }\n        },\n        \"EncodingType\": {\n          \"target\": \"com.amazonaws.s3#EncodingType\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Encoding type used by Amazon S3 to encode object keys in the response.</p>\\n         <p>If you specify the <code>encoding-type</code> request parameter, Amazon S3 includes this element in the\\n      response, and returns encoded key name values in the following response elements:</p>\\n         <p>\\n            <code>Delimiter</code>, <code>KeyMarker</code>, <code>Prefix</code>, <code>NextKeyMarker</code>,\\n        <code>Key</code>.</p>\"\n          }\n        },\n        \"RequestCharged\": {\n          \"target\": \"com.amazonaws.s3#RequestCharged\",\n          \"traits\": {\n            \"smithy.api#httpHeader\": \"x-amz-request-charged\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#output\": {},\n        \"smithy.api#xmlName\": \"ListMultipartUploadsResult\"\n      }\n    },\n    \"com.amazonaws.s3#ListMultipartUploadsRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the bucket to which the multipart upload was initiated. </p>\\n         <p>\\n            <b>Directory buckets</b> - When you use this operation with a directory bucket, you must use virtual-hosted-style requests in the format <code>\\n               <i>Bucket-name</i>.s3express-<i>zone-id</i>.<i>region-code</i>.amazonaws.com</code>. Path-style requests are not supported.  Directory bucket names must be unique in the chosen Zone (Availability Zone or Local Zone). Bucket names must follow the format <code>\\n               <i>bucket-base-name</i>--<i>zone-id</i>--x-s3</code> (for example, <code>\\n               <i>amzn-s3-demo-bucket</i>--<i>usw2-az1</i>--x-s3</code>). For information about bucket naming\\n         restrictions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-bucket-naming-rules.html\\\">Directory bucket naming\\n            rules</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <p>\\n            <b>Access points</b> - When you use this action with an access point for general purpose buckets, you must provide the alias of the access point in place of the bucket name or specify the access point ARN. When you use this action with an access point for directory buckets, you must provide the access point name in place of the bucket name. When using the access point ARN, you must direct requests to the access point hostname. The access point hostname takes the form <i>AccessPointName</i>-<i>AccountId</i>.s3-accesspoint.<i>Region</i>.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html\\\">Using access points</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <note>\\n            <p>Object Lambda access points are not supported by directory buckets.</p>\\n         </note>\\n         <p>\\n            <b>S3 on Outposts</b> - When you use this action with S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the \\n                     form <code>\\n               <i>AccessPointName</i>-<i>AccountId</i>.<i>outpostID</i>.s3-outposts.<i>Region</i>.amazonaws.com</code>. When you use this action with S3 on Outposts, the destination bucket must be the Outposts access point ARN or the access point alias. For more information about S3 on Outposts, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html\\\">What is S3 on Outposts?</a> in the <i>Amazon S3 User Guide</i>.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"Delimiter\": {\n          \"target\": \"com.amazonaws.s3#Delimiter\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Character you use to group keys.</p>\\n         <p>All keys that contain the same string between the prefix, if specified, and the first occurrence of\\n      the delimiter after the prefix are grouped under a single result element, <code>CommonPrefixes</code>.\\n      If you don't specify the prefix parameter, then the substring starts at the beginning of the key. The\\n      keys that are grouped under <code>CommonPrefixes</code> result element are not returned elsewhere in the\\n      response.</p>\\n         <p>\\n            <code>CommonPrefixes</code> is filtered out from results if it is not lexicographically greater than\\n      the key-marker.</p>\\n         <note>\\n            <p>\\n               <b>Directory buckets</b> - For directory buckets, <code>/</code> is the only supported delimiter.</p>\\n         </note>\",\n            \"smithy.api#httpQuery\": \"delimiter\"\n          }\n        },\n        \"EncodingType\": {\n          \"target\": \"com.amazonaws.s3#EncodingType\",\n          \"traits\": {\n            \"smithy.api#httpQuery\": \"encoding-type\"\n          }\n        },\n        \"KeyMarker\": {\n          \"target\": \"com.amazonaws.s3#KeyMarker\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the multipart upload after which listing should begin.</p>\\n         <note>\\n            <ul>\\n               <li>\\n                  <p>\\n                     <b>General purpose buckets</b> - For general purpose buckets,\\n              <code>key-marker</code> is an object key. Together with <code>upload-id-marker</code>, this\\n            parameter specifies the multipart upload after which listing should begin.</p>\\n                  <p>If <code>upload-id-marker</code> is not specified, only the keys lexicographically greater\\n            than the specified <code>key-marker</code> will be included in the list.</p>\\n                  <p>If <code>upload-id-marker</code> is specified, any multipart uploads for a key equal to the\\n              <code>key-marker</code> might also be included, provided those multipart uploads have upload IDs\\n            lexicographically greater than the specified <code>upload-id-marker</code>.</p>\\n               </li>\\n               <li>\\n                  <p>\\n                     <b>Directory buckets</b> - For directory buckets,\\n              <code>key-marker</code> is obfuscated and isn't a real object key. The\\n              <code>upload-id-marker</code> parameter isn't supported by directory buckets. To list the\\n            additional multipart uploads, you only need to set the value of <code>key-marker</code> to the\\n              <code>NextKeyMarker</code> value from the previous response. </p>\\n                  <p>In the <code>ListMultipartUploads</code> response, the multipart uploads aren't sorted\\n            lexicographically based on the object keys.\\n            \\n          </p>\\n               </li>\\n            </ul>\\n         </note>\",\n            \"smithy.api#httpQuery\": \"key-marker\"\n          }\n        },\n        \"MaxUploads\": {\n          \"target\": \"com.amazonaws.s3#MaxUploads\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Sets the maximum number of multipart uploads, from 1 to 1,000, to return in the response body. 1,000\\n      is the maximum number of uploads that can be returned in a response.</p>\",\n            \"smithy.api#httpQuery\": \"max-uploads\"\n          }\n        },\n        \"Prefix\": {\n          \"target\": \"com.amazonaws.s3#Prefix\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Lists in-progress uploads only for those keys that begin with the specified prefix. You can use\\n      prefixes to separate a bucket into different grouping of keys. (You can think of using\\n        <code>prefix</code> to make groups in the same way that you'd use a folder in a file system.)</p>\\n         <note>\\n            <p>\\n               <b>Directory buckets</b> - For directory buckets, only prefixes that end in a delimiter (<code>/</code>) are supported.</p>\\n         </note>\",\n            \"smithy.api#httpQuery\": \"prefix\",\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Prefix\"\n            }\n          }\n        },\n        \"UploadIdMarker\": {\n          \"target\": \"com.amazonaws.s3#UploadIdMarker\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Together with key-marker, specifies the multipart upload after which listing should begin. If\\n      key-marker is not specified, the upload-id-marker parameter is ignored. Otherwise, any multipart uploads\\n      for a key equal to the key-marker might be included in the list only if they have an upload ID\\n      lexicographically greater than the specified <code>upload-id-marker</code>.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpQuery\": \"upload-id-marker\"\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        },\n        \"RequestPayer\": {\n          \"target\": \"com.amazonaws.s3#RequestPayer\",\n          \"traits\": {\n            \"smithy.api#httpHeader\": \"x-amz-request-payer\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#ListObjectVersions\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#ListObjectVersionsRequest\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.s3#ListObjectVersionsOutput\"\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported for directory buckets.</p>\\n         </note>\\n         <p>Returns metadata about all versions of the objects in a bucket. You can also use request parameters\\n      as selection criteria to return metadata about a subset of all the object versions.</p>\\n         <important>\\n            <p> To use this operation, you must have permission to perform the <code>s3:ListBucketVersions</code>\\n        action. Be aware of the name difference. </p>\\n         </important>\\n         <note>\\n            <p> A <code>200 OK</code> response can contain valid or invalid XML. Make sure to design your\\n        application to parse the contents of the response and handle it appropriately.</p>\\n         </note>\\n         <p>To use this operation, you must have READ access to the bucket.</p>\\n         <p>The following operations are related to <code>ListObjectVersions</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectsV2.html\\\">ListObjectsV2</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html\\\">GetObject</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html\\\">PutObject</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObject.html\\\">DeleteObject</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#examples\": [\n          {\n            \"title\": \"To list object versions\",\n            \"documentation\": \"The following example returns versions of an object with specific key name prefix.\",\n            \"input\": {\n              \"Bucket\": \"examplebucket\",\n              \"Prefix\": \"HappyFace.jpg\"\n            },\n            \"output\": {\n              \"Versions\": [\n                {\n                  \"LastModified\": \"2016-12-15T01:19:41.000Z\",\n                  \"VersionId\": \"null\",\n                  \"ETag\": \"\\\"6805f2cfc46c0f04559748bb039d69ae\\\"\",\n                  \"StorageClass\": \"STANDARD\",\n                  \"Key\": \"HappyFace.jpg\",\n                  \"Owner\": {\n                    \"DisplayName\": \"owner-display-name\",\n                    \"ID\": \"examplee7a2f25102679df27bb0ae12b3f85be6f290b936c4393484be31bebcc\"\n                  },\n                  \"IsLatest\": true,\n                  \"Size\": 3191\n                },\n                {\n                  \"LastModified\": \"2016-12-13T00:58:26.000Z\",\n                  \"VersionId\": \"PHtexPGjH2y.zBgT8LmB7wwLI2mpbz.k\",\n                  \"ETag\": \"\\\"6805f2cfc46c0f04559748bb039d69ae\\\"\",\n                  \"StorageClass\": \"STANDARD\",\n                  \"Key\": \"HappyFace.jpg\",\n                  \"Owner\": {\n                    \"DisplayName\": \"owner-display-name\",\n                    \"ID\": \"examplee7a2f25102679df27bb0ae12b3f85be6f290b936c4393484be31bebcc\"\n                  },\n                  \"IsLatest\": false,\n                  \"Size\": 3191\n                }\n              ]\n            }\n          }\n        ],\n        \"smithy.api#http\": {\n          \"method\": \"GET\",\n          \"uri\": \"/{Bucket}?versions\",\n          \"code\": 200\n        }\n      }\n    },\n    \"com.amazonaws.s3#ListObjectVersionsOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"IsTruncated\": {\n          \"target\": \"com.amazonaws.s3#IsTruncated\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A flag that indicates whether Amazon S3 returned all of the results that satisfied the search criteria.\\n      If your results were truncated, you can make a follow-up paginated request by using the\\n        <code>NextKeyMarker</code> and <code>NextVersionIdMarker</code> response parameters as a starting\\n      place in another request to return the rest of the results.</p>\"\n          }\n        },\n        \"KeyMarker\": {\n          \"target\": \"com.amazonaws.s3#KeyMarker\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Marks the last key returned in a truncated response.</p>\"\n          }\n        },\n        \"VersionIdMarker\": {\n          \"target\": \"com.amazonaws.s3#VersionIdMarker\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Marks the last version of the key returned in a truncated response.</p>\"\n          }\n        },\n        \"NextKeyMarker\": {\n          \"target\": \"com.amazonaws.s3#NextKeyMarker\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>When the number of responses exceeds the value of <code>MaxKeys</code>, <code>NextKeyMarker</code>\\n      specifies the first key not returned that satisfies the search criteria. Use this value for the\\n      key-marker request parameter in a subsequent request.</p>\"\n          }\n        },\n        \"NextVersionIdMarker\": {\n          \"target\": \"com.amazonaws.s3#NextVersionIdMarker\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>When the number of responses exceeds the value of <code>MaxKeys</code>,\\n        <code>NextVersionIdMarker</code> specifies the first object version not returned that satisfies the\\n      search criteria. Use this value for the <code>version-id-marker</code> request parameter in a subsequent\\n      request.</p>\"\n          }\n        },\n        \"Versions\": {\n          \"target\": \"com.amazonaws.s3#ObjectVersionList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Container for version information.</p>\",\n            \"smithy.api#xmlFlattened\": {},\n            \"smithy.api#xmlName\": \"Version\"\n          }\n        },\n        \"DeleteMarkers\": {\n          \"target\": \"com.amazonaws.s3#DeleteMarkers\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Container for an object that is a delete marker. To learn more about delete markers, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/DeleteMarker.html\\\">Working with delete\\n        markers</a>.</p>\",\n            \"smithy.api#xmlFlattened\": {},\n            \"smithy.api#xmlName\": \"DeleteMarker\"\n          }\n        },\n        \"Name\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The bucket name.</p>\"\n          }\n        },\n        \"Prefix\": {\n          \"target\": \"com.amazonaws.s3#Prefix\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Selects objects that start with the value supplied by this parameter.</p>\"\n          }\n        },\n        \"Delimiter\": {\n          \"target\": \"com.amazonaws.s3#Delimiter\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The delimiter grouping the included keys. A delimiter is a character that you specify to group keys.\\n      All keys that contain the same string between the prefix and the first occurrence of the delimiter are\\n      grouped under a single result element in <code>CommonPrefixes</code>. These groups are counted as one\\n      result against the <code>max-keys</code> limitation. These keys are not returned elsewhere in the\\n      response.</p>\"\n          }\n        },\n        \"MaxKeys\": {\n          \"target\": \"com.amazonaws.s3#MaxKeys\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the maximum number of objects to return.</p>\"\n          }\n        },\n        \"CommonPrefixes\": {\n          \"target\": \"com.amazonaws.s3#CommonPrefixList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>All of the keys rolled up into a common prefix count as a single return when calculating the number\\n      of returns.</p>\",\n            \"smithy.api#xmlFlattened\": {}\n          }\n        },\n        \"EncodingType\": {\n          \"target\": \"com.amazonaws.s3#EncodingType\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p> Encoding type used by Amazon S3 to encode object key names in the XML response.</p>\\n         <p>If you specify the <code>encoding-type</code> request parameter, Amazon S3 includes this element in the\\n      response, and returns encoded key name values in the following response elements:</p>\\n         <p>\\n            <code>KeyMarker, NextKeyMarker, Prefix, Key</code>, and <code>Delimiter</code>.</p>\"\n          }\n        },\n        \"RequestCharged\": {\n          \"target\": \"com.amazonaws.s3#RequestCharged\",\n          \"traits\": {\n            \"smithy.api#httpHeader\": \"x-amz-request-charged\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#output\": {},\n        \"smithy.api#xmlName\": \"ListVersionsResult\"\n      }\n    },\n    \"com.amazonaws.s3#ListObjectVersionsRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The bucket name that contains the objects. </p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"Delimiter\": {\n          \"target\": \"com.amazonaws.s3#Delimiter\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A delimiter is a character that you specify to group keys. All keys that contain the same string\\n      between the <code>prefix</code> and the first occurrence of the delimiter are grouped under a single\\n      result element in <code>CommonPrefixes</code>. These groups are counted as one result against the\\n        <code>max-keys</code> limitation. These keys are not returned elsewhere in the response.</p>\\n         <p>\\n            <code>CommonPrefixes</code> is filtered out from results if it is not lexicographically greater than\\n      the key-marker.</p>\",\n            \"smithy.api#httpQuery\": \"delimiter\"\n          }\n        },\n        \"EncodingType\": {\n          \"target\": \"com.amazonaws.s3#EncodingType\",\n          \"traits\": {\n            \"smithy.api#httpQuery\": \"encoding-type\"\n          }\n        },\n        \"KeyMarker\": {\n          \"target\": \"com.amazonaws.s3#KeyMarker\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the key to start with when listing objects in a bucket.</p>\",\n            \"smithy.api#httpQuery\": \"key-marker\"\n          }\n        },\n        \"MaxKeys\": {\n          \"target\": \"com.amazonaws.s3#MaxKeys\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Sets the maximum number of keys returned in the response. By default, the action returns up to 1,000\\n      key names. The response might contain fewer keys but will never contain more. If additional keys satisfy\\n      the search criteria, but were not returned because <code>max-keys</code> was exceeded, the response\\n      contains <code><isTruncated>true</isTruncated></code>. To return the additional keys, see\\n        <code>key-marker</code> and <code>version-id-marker</code>.</p>\",\n            \"smithy.api#httpQuery\": \"max-keys\"\n          }\n        },\n        \"Prefix\": {\n          \"target\": \"com.amazonaws.s3#Prefix\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Use this parameter to select only those keys that begin with the specified prefix. You can use\\n      prefixes to separate a bucket into different groupings of keys. (You can think of using\\n        <code>prefix</code> to make groups in the same way that you'd use a folder in a file system.) You can\\n      use <code>prefix</code> with <code>delimiter</code> to roll up numerous objects into a single result\\n      under <code>CommonPrefixes</code>. </p>\",\n            \"smithy.api#httpQuery\": \"prefix\",\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Prefix\"\n            }\n          }\n        },\n        \"VersionIdMarker\": {\n          \"target\": \"com.amazonaws.s3#VersionIdMarker\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the object version you want to start listing from.</p>\",\n            \"smithy.api#httpQuery\": \"version-id-marker\"\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        },\n        \"RequestPayer\": {\n          \"target\": \"com.amazonaws.s3#RequestPayer\",\n          \"traits\": {\n            \"smithy.api#httpHeader\": \"x-amz-request-payer\"\n          }\n        },\n        \"OptionalObjectAttributes\": {\n          \"target\": \"com.amazonaws.s3#OptionalObjectAttributesList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the optional fields that you want returned in the response. Fields that you do not specify\\n      are not returned.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-optional-object-attributes\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#ListObjects\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#ListObjectsRequest\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.s3#ListObjectsOutput\"\n      },\n      \"errors\": [\n        {\n          \"target\": \"com.amazonaws.s3#NoSuchBucket\"\n        }\n      ],\n      \"traits\": {\n        \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported for directory buckets.</p>\\n         </note>\\n         <p>Returns some or all (up to 1,000) of the objects in a bucket. You can use the request parameters as\\n      selection criteria to return a subset of the objects in a bucket. A 200 OK response can contain valid or\\n      invalid XML. Be sure to design your application to parse the contents of the response and handle it\\n      appropriately.</p>\\n         <important>\\n            <p>This action has been revised. We recommend that you use the newer version, <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectsV2.html\\\">ListObjectsV2</a>, when\\n        developing applications. For backward compatibility, Amazon S3 continues to support\\n          <code>ListObjects</code>.</p>\\n         </important>\\n         <p>The following operations are related to <code>ListObjects</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectsV2.html\\\">ListObjectsV2</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html\\\">GetObject</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html\\\">PutObject</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateBucket.html\\\">CreateBucket</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListBuckets.html\\\">ListBuckets</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#examples\": [\n          {\n            \"title\": \"To list objects in a bucket\",\n            \"documentation\": \"The following example list two objects in a bucket.\",\n            \"input\": {\n              \"Bucket\": \"examplebucket\",\n              \"MaxKeys\": 2\n            },\n            \"output\": {\n              \"NextMarker\": \"eyJNYXJrZXIiOiBudWxsLCAiYm90b190cnVuY2F0ZV9hbW91bnQiOiAyfQ==\",\n              \"Contents\": [\n                {\n                  \"LastModified\": \"2014-11-21T19:40:05.000Z\",\n                  \"ETag\": \"\\\"70ee1738b6b21e2c8a43f3a5ab0eee71\\\"\",\n                  \"StorageClass\": \"STANDARD\",\n                  \"Key\": \"example1.jpg\",\n                  \"Owner\": {\n                    \"DisplayName\": \"myname\",\n                    \"ID\": \"12345example25102679df27bb0ae12b3f85be6f290b936c4393484be31bebcc\"\n                  },\n                  \"Size\": 11\n                },\n                {\n                  \"LastModified\": \"2013-11-15T01:10:49.000Z\",\n                  \"ETag\": \"\\\"9c8af9a76df052144598c115ef33e511\\\"\",\n                  \"StorageClass\": \"STANDARD\",\n                  \"Key\": \"example2.jpg\",\n                  \"Owner\": {\n                    \"DisplayName\": \"myname\",\n                    \"ID\": \"12345example25102679df27bb0ae12b3f85be6f290b936c4393484be31bebcc\"\n                  },\n                  \"Size\": 713193\n                }\n              ]\n            }\n          }\n        ],\n        \"smithy.api#http\": {\n          \"method\": \"GET\",\n          \"uri\": \"/{Bucket}\",\n          \"code\": 200\n        }\n      }\n    },\n    \"com.amazonaws.s3#ListObjectsOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"IsTruncated\": {\n          \"target\": \"com.amazonaws.s3#IsTruncated\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A flag that indicates whether Amazon S3 returned all of the results that satisfied the search\\n      criteria.</p>\"\n          }\n        },\n        \"Marker\": {\n          \"target\": \"com.amazonaws.s3#Marker\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Indicates where in the bucket listing begins. Marker is included in the response if it was sent with\\n      the request.</p>\"\n          }\n        },\n        \"NextMarker\": {\n          \"target\": \"com.amazonaws.s3#NextMarker\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>When the response is truncated (the <code>IsTruncated</code> element value in the response is\\n        <code>true</code>), you can use the key name in this field as the <code>marker</code> parameter in the\\n      subsequent request to get the next set of objects. Amazon S3 lists objects in alphabetical order. </p>\\n         <note>\\n            <p>This element is returned only if you have the <code>delimiter</code> request parameter specified.\\n        If the response does not include the <code>NextMarker</code> element and it is truncated, you can use\\n        the value of the last <code>Key</code> element in the response as the <code>marker</code> parameter in\\n        the subsequent request to get the next set of object keys.</p>\\n         </note>\"\n          }\n        },\n        \"Contents\": {\n          \"target\": \"com.amazonaws.s3#ObjectList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Metadata about each object returned.</p>\",\n            \"smithy.api#xmlFlattened\": {}\n          }\n        },\n        \"Name\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The bucket name.</p>\"\n          }\n        },\n        \"Prefix\": {\n          \"target\": \"com.amazonaws.s3#Prefix\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Keys that begin with the indicated prefix.</p>\"\n          }\n        },\n        \"Delimiter\": {\n          \"target\": \"com.amazonaws.s3#Delimiter\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Causes keys that contain the same string between the prefix and the first occurrence of the\\n      delimiter to be rolled up into a single result element in the <code>CommonPrefixes</code> collection.\\n      These rolled-up keys are not returned elsewhere in the response. Each rolled-up result counts as only\\n      one return against the <code>MaxKeys</code> value.</p>\"\n          }\n        },\n        \"MaxKeys\": {\n          \"target\": \"com.amazonaws.s3#MaxKeys\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The maximum number of keys returned in the response body.</p>\"\n          }\n        },\n        \"CommonPrefixes\": {\n          \"target\": \"com.amazonaws.s3#CommonPrefixList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>All of the keys (up to 1,000) rolled up in a common prefix count as a single return when calculating\\n      the number of returns. </p>\\n         <p>A response can contain <code>CommonPrefixes</code> only if you specify a delimiter.</p>\\n         <p>\\n            <code>CommonPrefixes</code> contains all (if there are any) keys between <code>Prefix</code> and the\\n      next occurrence of the string specified by the delimiter.</p>\\n         <p>\\n            <code>CommonPrefixes</code> lists keys that act like subdirectories in the directory specified by\\n        <code>Prefix</code>.</p>\\n         <p>For example, if the prefix is <code>notes/</code> and the delimiter is a slash (<code>/</code>), as\\n      in <code>notes/summer/july</code>, the common prefix is <code>notes/summer/</code>. All of the keys that\\n      roll up into a common prefix count as a single return when calculating the number of returns.</p>\",\n            \"smithy.api#xmlFlattened\": {}\n          }\n        },\n        \"EncodingType\": {\n          \"target\": \"com.amazonaws.s3#EncodingType\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Encoding type used by Amazon S3 to encode the <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-keys.html\\\">object keys</a> in the response. Responses are\\n      encoded only in UTF-8. An object key can contain any Unicode character. However, the XML 1.0 parser\\n      can't parse certain characters, such as characters with an ASCII value from 0 to 10. For characters that\\n      aren't supported in XML 1.0, you can add this parameter to request that Amazon S3 encode the keys in the\\n      response. For more information about characters to avoid in object key names, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-keys.html#object-key-guidelines\\\">Object key\\n        naming guidelines</a>.</p>\\n         <note>\\n            <p>When using the URL encoding type, non-ASCII characters that are used in an object's key name will\\n        be percent-encoded according to UTF-8 code values. For example, the object\\n          <code>test_file(3).png</code> will appear as <code>test_file%283%29.png</code>.</p>\\n         </note>\"\n          }\n        },\n        \"RequestCharged\": {\n          \"target\": \"com.amazonaws.s3#RequestCharged\",\n          \"traits\": {\n            \"smithy.api#httpHeader\": \"x-amz-request-charged\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#output\": {},\n        \"smithy.api#xmlName\": \"ListBucketResult\"\n      }\n    },\n    \"com.amazonaws.s3#ListObjectsRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the bucket containing the objects.</p>\\n         <p>\\n            <b>Directory buckets</b> - When you use this operation with a directory bucket, you must use virtual-hosted-style requests in the format <code>\\n               <i>Bucket-name</i>.s3express-<i>zone-id</i>.<i>region-code</i>.amazonaws.com</code>. Path-style requests are not supported.  Directory bucket names must be unique in the chosen Zone (Availability Zone or Local Zone). Bucket names must follow the format <code>\\n               <i>bucket-base-name</i>--<i>zone-id</i>--x-s3</code> (for example, <code>\\n               <i>amzn-s3-demo-bucket</i>--<i>usw2-az1</i>--x-s3</code>). For information about bucket naming\\n         restrictions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-bucket-naming-rules.html\\\">Directory bucket naming\\n            rules</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <p>\\n            <b>Access points</b> - When you use this action with an access point for general purpose buckets, you must provide the alias of the access point in place of the bucket name or specify the access point ARN. When you use this action with an access point for directory buckets, you must provide the access point name in place of the bucket name. When using the access point ARN, you must direct requests to the access point hostname. The access point hostname takes the form <i>AccessPointName</i>-<i>AccountId</i>.s3-accesspoint.<i>Region</i>.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html\\\">Using access points</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <note>\\n            <p>Object Lambda access points are not supported by directory buckets.</p>\\n         </note>\\n         <p>\\n            <b>S3 on Outposts</b> - When you use this action with S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the \\n                     form <code>\\n               <i>AccessPointName</i>-<i>AccountId</i>.<i>outpostID</i>.s3-outposts.<i>Region</i>.amazonaws.com</code>. When you use this action with S3 on Outposts, the destination bucket must be the Outposts access point ARN or the access point alias. For more information about S3 on Outposts, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html\\\">What is S3 on Outposts?</a> in the <i>Amazon S3 User Guide</i>.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"Delimiter\": {\n          \"target\": \"com.amazonaws.s3#Delimiter\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A delimiter is a character that you use to group keys.</p>\\n         <p>\\n            <code>CommonPrefixes</code> is filtered out from results if it is not lexicographically greater than\\n      the key-marker.</p>\",\n            \"smithy.api#httpQuery\": \"delimiter\"\n          }\n        },\n        \"EncodingType\": {\n          \"target\": \"com.amazonaws.s3#EncodingType\",\n          \"traits\": {\n            \"smithy.api#httpQuery\": \"encoding-type\"\n          }\n        },\n        \"Marker\": {\n          \"target\": \"com.amazonaws.s3#Marker\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Marker is where you want Amazon S3 to start listing from. Amazon S3 starts listing after this specified\\n      key. Marker can be any key in the bucket.</p>\",\n            \"smithy.api#httpQuery\": \"marker\"\n          }\n        },\n        \"MaxKeys\": {\n          \"target\": \"com.amazonaws.s3#MaxKeys\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Sets the maximum number of keys returned in the response. By default, the action returns up to 1,000\\n      key names. The response might contain fewer keys but will never contain more. </p>\",\n            \"smithy.api#httpQuery\": \"max-keys\"\n          }\n        },\n        \"Prefix\": {\n          \"target\": \"com.amazonaws.s3#Prefix\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Limits the response to keys that begin with the specified prefix.</p>\",\n            \"smithy.api#httpQuery\": \"prefix\",\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Prefix\"\n            }\n          }\n        },\n        \"RequestPayer\": {\n          \"target\": \"com.amazonaws.s3#RequestPayer\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Confirms that the requester knows that she or he will be charged for the list objects request.\\n      Bucket owners need not specify this parameter in their requests.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-request-payer\"\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        },\n        \"OptionalObjectAttributes\": {\n          \"target\": \"com.amazonaws.s3#OptionalObjectAttributesList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the optional fields that you want returned in the response. Fields that you do not specify\\n      are not returned.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-optional-object-attributes\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#ListObjectsV2\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#ListObjectsV2Request\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.s3#ListObjectsV2Output\"\n      },\n      \"errors\": [\n        {\n          \"target\": \"com.amazonaws.s3#NoSuchBucket\"\n        }\n      ],\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Returns some or all (up to 1,000) of the objects in a bucket with each request. You can use the\\n      request parameters as selection criteria to return a subset of the objects in a bucket. A <code>200\\n        OK</code> response can contain valid or invalid XML. Make sure to design your application to parse the\\n      contents of the response and handle it appropriately. For more information about listing objects, see\\n        <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/ListingKeysUsingAPIs.html\\\">Listing object\\n        keys programmatically</a> in the <i>Amazon S3 User Guide</i>. To get a list of your\\n      buckets, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListBuckets.html\\\">ListBuckets</a>.</p>\\n         <note>\\n            <ul>\\n               <li>\\n                  <p>\\n                     <b>General purpose bucket</b> - For general purpose buckets,\\n              <code>ListObjectsV2</code> doesn't return prefixes that are related only to in-progress\\n            multipart uploads.</p>\\n               </li>\\n               <li>\\n                  <p>\\n                     <b>Directory buckets</b> - For directory buckets,\\n              <code>ListObjectsV2</code> response includes the prefixes that are related only to in-progress\\n            multipart uploads. </p>\\n               </li>\\n               <li>\\n                  <p>\\n                     <b>Directory buckets</b> - For directory buckets, you must make requests for this API operation to the Zonal endpoint. These endpoints support virtual-hosted-style requests in the format <code>https://<i>amzn-s3-demo-bucket</i>.s3express-<i>zone-id</i>.<i>region-code</i>.amazonaws.com/<i>key-name</i>\\n                     </code>. Path-style requests are not supported. For more information about endpoints in Availability Zones, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/endpoint-directory-buckets-AZ.html\\\">Regional and Zonal endpoints for directory buckets in Availability Zones</a> in the\\n    <i>Amazon S3 User Guide</i>. For more information about endpoints in Local Zones, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-lzs-for-directory-buckets.html\\\">Concepts for directory buckets in Local Zones</a> in the\\n    <i>Amazon S3 User Guide</i>.</p>\\n               </li>\\n            </ul>\\n         </note>\\n         <dl>\\n            <dt>Permissions</dt>\\n            <dd>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <b>General purpose bucket permissions</b> - To use this\\n                operation, you must have READ access to the bucket. You must have permission to perform the\\n                  <code>s3:ListBucket</code> action. The bucket owner has this permission by default and can\\n                grant this permission to others. For more information about permissions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-with-s3-actions.html#using-with-s3-actions-related-to-bucket-subresources\\\">Permissions Related to Bucket Subresource Operations</a> and <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html\\\">Managing Access\\n                  Permissions to Your Amazon S3 Resources</a> in the\\n                <i>Amazon S3 User Guide</i>.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <b>Directory bucket permissions</b> - To grant access to this API operation on a directory bucket, we recommend that you use the <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateSession.html\\\">\\n                           <code>CreateSession</code>\\n                        </a> API operation for session-based authorization. Specifically, you grant the <code>s3express:CreateSession</code> permission to the directory bucket in a bucket policy or an IAM identity-based policy. Then, you make the <code>CreateSession</code> API call on the bucket to obtain a session token. With the session token in your request header, you can make API requests to this operation. After the session token expires, you make another <code>CreateSession</code> API call to generate a new session token for use. \\nAmazon Web Services CLI or SDKs create session and refresh the session token automatically to avoid service interruptions when a session expires. For more information about authorization, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateSession.html\\\">\\n                           <code>CreateSession</code>\\n                        </a>.</p>\\n                  </li>\\n               </ul>\\n            </dd>\\n            <dt>Sorting order of returned objects</dt>\\n            <dd>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <b>General purpose bucket</b> - For general purpose buckets,\\n                  <code>ListObjectsV2</code> returns objects in lexicographical order based on their key\\n                names.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <b>Directory bucket</b> - For directory buckets,\\n                  <code>ListObjectsV2</code> does not return objects in lexicographical order.</p>\\n                  </li>\\n               </ul>\\n            </dd>\\n            <dt>HTTP Host header syntax</dt>\\n            <dd>\\n               <p>\\n                  <b>Directory buckets </b> - The HTTP Host header syntax is <code>\\n                     <i>Bucket-name</i>.s3express-<i>zone-id</i>.<i>region-code</i>.amazonaws.com</code>.</p>\\n            </dd>\\n         </dl>\\n         <important>\\n            <p>This section describes the latest revision of this action. We recommend that you use this revised\\n        API operation for application development. For backward compatibility, Amazon S3 continues to support the\\n        prior version of this API operation, <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjects.html\\\">ListObjects</a>.</p>\\n         </important>\\n         <p>The following operations are related to <code>ListObjectsV2</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html\\\">GetObject</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html\\\">PutObject</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateBucket.html\\\">CreateBucket</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#examples\": [\n          {\n            \"title\": \"To get object list\",\n            \"documentation\": \"The following example retrieves object list. The request specifies max keys to limit response to include only 2 object keys. \",\n            \"input\": {\n              \"Bucket\": \"DOC-EXAMPLE-BUCKET\",\n              \"MaxKeys\": 2\n            },\n            \"output\": {\n              \"Name\": \"DOC-EXAMPLE-BUCKET\",\n              \"MaxKeys\": 2,\n              \"Prefix\": \"\",\n              \"KeyCount\": 2,\n              \"NextContinuationToken\": \"1w41l63U0xa8q7smH50vCxyTQqdxo69O3EmK28Bi5PcROI4wI/EyIJg==\",\n              \"IsTruncated\": true,\n              \"Contents\": [\n                {\n                  \"LastModified\": \"2014-11-21T19:40:05.000Z\",\n                  \"ETag\": \"\\\"70ee1738b6b21e2c8a43f3a5ab0eee71\\\"\",\n                  \"StorageClass\": \"STANDARD\",\n                  \"Key\": \"happyface.jpg\",\n                  \"Size\": 11\n                },\n                {\n                  \"LastModified\": \"2014-05-02T04:51:50.000Z\",\n                  \"ETag\": \"\\\"becf17f89c30367a9a44495d62ed521a-1\\\"\",\n                  \"StorageClass\": \"STANDARD\",\n                  \"Key\": \"test.jpg\",\n                  \"Size\": 4192256\n                }\n              ]\n            }\n          }\n        ],\n        \"smithy.api#http\": {\n          \"method\": \"GET\",\n          \"uri\": \"/{Bucket}?list-type=2\",\n          \"code\": 200\n        },\n        \"smithy.api#paginated\": {\n          \"inputToken\": \"ContinuationToken\",\n          \"outputToken\": \"NextContinuationToken\",\n          \"pageSize\": \"MaxKeys\"\n        }\n      }\n    },\n    \"com.amazonaws.s3#ListObjectsV2Output\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"IsTruncated\": {\n          \"target\": \"com.amazonaws.s3#IsTruncated\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Set to <code>false</code> if all of the results were returned. Set to <code>true</code> if more keys\\n      are available to return. If the number of results exceeds that specified by <code>MaxKeys</code>, all of\\n      the results might not be returned.</p>\"\n          }\n        },\n        \"Contents\": {\n          \"target\": \"com.amazonaws.s3#ObjectList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Metadata about each object returned.</p>\",\n            \"smithy.api#xmlFlattened\": {}\n          }\n        },\n        \"Name\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The bucket name.</p>\"\n          }\n        },\n        \"Prefix\": {\n          \"target\": \"com.amazonaws.s3#Prefix\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Keys that begin with the indicated prefix.</p>\\n         <note>\\n            <p>\\n               <b>Directory buckets</b> - For directory buckets, only prefixes that end in a delimiter (<code>/</code>) are supported.</p>\\n         </note>\"\n          }\n        },\n        \"Delimiter\": {\n          \"target\": \"com.amazonaws.s3#Delimiter\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Causes keys that contain the same string between the <code>prefix</code> and the first occurrence of\\n      the delimiter to be rolled up into a single result element in the <code>CommonPrefixes</code>\\n      collection. These rolled-up keys are not returned elsewhere in the response. Each rolled-up result\\n      counts as only one return against the <code>MaxKeys</code> value.</p>\\n         <note>\\n            <p>\\n               <b>Directory buckets</b> - For directory buckets, <code>/</code> is the only supported delimiter.</p>\\n         </note>\"\n          }\n        },\n        \"MaxKeys\": {\n          \"target\": \"com.amazonaws.s3#MaxKeys\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Sets the maximum number of keys returned in the response. By default, the action returns up to 1,000\\n      key names. The response might contain fewer keys but will never contain more.</p>\"\n          }\n        },\n        \"CommonPrefixes\": {\n          \"target\": \"com.amazonaws.s3#CommonPrefixList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>All of the keys (up to 1,000) that share the same prefix are grouped together. When counting the\\n      total numbers of returns by this API operation, this group of keys is considered as one item.</p>\\n         <p>A response can contain <code>CommonPrefixes</code> only if you specify a delimiter.</p>\\n         <p>\\n            <code>CommonPrefixes</code> contains all (if there are any) keys between <code>Prefix</code> and the\\n      next occurrence of the string specified by a delimiter.</p>\\n         <p>\\n            <code>CommonPrefixes</code> lists keys that act like subdirectories in the directory specified by\\n        <code>Prefix</code>.</p>\\n         <p>For example, if the prefix is <code>notes/</code> and the delimiter is a slash (<code>/</code>) as\\n      in <code>notes/summer/july</code>, the common prefix is <code>notes/summer/</code>. All of the keys that\\n      roll up into a common prefix count as a single return when calculating the number of returns. </p>\\n         <note>\\n            <ul>\\n               <li>\\n                  <p>\\n                     <b>Directory buckets</b> - For directory buckets, only prefixes that end in a delimiter (<code>/</code>) are supported.</p>\\n               </li>\\n               <li>\\n                  <p>\\n                     <b>Directory buckets </b> - When you query\\n              <code>ListObjectsV2</code> with a delimiter during in-progress multipart uploads, the\\n              <code>CommonPrefixes</code> response parameter contains the prefixes that are associated with\\n            the in-progress multipart uploads. For more information about multipart uploads, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/mpuoverview.html\\\">Multipart Upload\\n              Overview</a> in the <i>Amazon S3 User Guide</i>.</p>\\n               </li>\\n            </ul>\\n         </note>\",\n            \"smithy.api#xmlFlattened\": {}\n          }\n        },\n        \"EncodingType\": {\n          \"target\": \"com.amazonaws.s3#EncodingType\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Encoding type used by Amazon S3 to encode object key names in the XML response.</p>\\n         <p>If you specify the <code>encoding-type</code> request parameter, Amazon S3 includes this element in the\\n      response, and returns encoded key name values in the following response elements:</p>\\n         <p>\\n            <code>Delimiter, Prefix, Key,</code> and <code>StartAfter</code>.</p>\"\n          }\n        },\n        \"KeyCount\": {\n          \"target\": \"com.amazonaws.s3#KeyCount\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>\\n            <code>KeyCount</code> is the number of keys returned with this request. <code>KeyCount</code> will\\n      always be less than or equal to the <code>MaxKeys</code> field. For example, if you ask for 50 keys,\\n      your result will include 50 keys or fewer.</p>\"\n          }\n        },\n        \"ContinuationToken\": {\n          \"target\": \"com.amazonaws.s3#Token\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p> If <code>ContinuationToken</code> was sent with the request, it is included in the response. You\\n      can use the returned <code>ContinuationToken</code> for pagination of the list response.</p>\"\n          }\n        },\n        \"NextContinuationToken\": {\n          \"target\": \"com.amazonaws.s3#NextToken\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>\\n            <code>NextContinuationToken</code> is sent when <code>isTruncated</code> is true, which means there\\n      are more keys in the bucket that can be listed. The next list requests to Amazon S3 can be continued with\\n      this <code>NextContinuationToken</code>. <code>NextContinuationToken</code> is obfuscated and is not a\\n      real key</p>\"\n          }\n        },\n        \"StartAfter\": {\n          \"target\": \"com.amazonaws.s3#StartAfter\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>If StartAfter was sent with the request, it is included in the response.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\"\n          }\n        },\n        \"RequestCharged\": {\n          \"target\": \"com.amazonaws.s3#RequestCharged\",\n          \"traits\": {\n            \"smithy.api#httpHeader\": \"x-amz-request-charged\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#output\": {},\n        \"smithy.api#xmlName\": \"ListBucketResult\"\n      }\n    },\n    \"com.amazonaws.s3#ListObjectsV2Request\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>\\n            <b>Directory buckets</b> - When you use this operation with a directory bucket, you must use virtual-hosted-style requests in the format <code>\\n               <i>Bucket-name</i>.s3express-<i>zone-id</i>.<i>region-code</i>.amazonaws.com</code>. Path-style requests are not supported.  Directory bucket names must be unique in the chosen Zone (Availability Zone or Local Zone). Bucket names must follow the format <code>\\n               <i>bucket-base-name</i>--<i>zone-id</i>--x-s3</code> (for example, <code>\\n               <i>amzn-s3-demo-bucket</i>--<i>usw2-az1</i>--x-s3</code>). For information about bucket naming\\n         restrictions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-bucket-naming-rules.html\\\">Directory bucket naming\\n            rules</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <p>\\n            <b>Access points</b> - When you use this action with an access point for general purpose buckets, you must provide the alias of the access point in place of the bucket name or specify the access point ARN. When you use this action with an access point for directory buckets, you must provide the access point name in place of the bucket name. When using the access point ARN, you must direct requests to the access point hostname. The access point hostname takes the form <i>AccessPointName</i>-<i>AccountId</i>.s3-accesspoint.<i>Region</i>.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html\\\">Using access points</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <note>\\n            <p>Object Lambda access points are not supported by directory buckets.</p>\\n         </note>\\n         <p>\\n            <b>S3 on Outposts</b> - When you use this action with S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the \\n                     form <code>\\n               <i>AccessPointName</i>-<i>AccountId</i>.<i>outpostID</i>.s3-outposts.<i>Region</i>.amazonaws.com</code>. When you use this action with S3 on Outposts, the destination bucket must be the Outposts access point ARN or the access point alias. For more information about S3 on Outposts, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html\\\">What is S3 on Outposts?</a> in the <i>Amazon S3 User Guide</i>.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"Delimiter\": {\n          \"target\": \"com.amazonaws.s3#Delimiter\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A delimiter is a character that you use to group keys.</p>\\n         <p>\\n            <code>CommonPrefixes</code> is filtered out from results if it is not lexicographically greater than\\n      the <code>StartAfter</code> value.</p>\\n         <note>\\n            <ul>\\n               <li>\\n                  <p>\\n                     <b>Directory buckets</b> - For directory buckets, <code>/</code> is the only supported delimiter.</p>\\n               </li>\\n               <li>\\n                  <p>\\n                     <b>Directory buckets </b> - When you query\\n              <code>ListObjectsV2</code> with a delimiter during in-progress multipart uploads, the\\n              <code>CommonPrefixes</code> response parameter contains the prefixes that are associated with\\n            the in-progress multipart uploads. For more information about multipart uploads, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/mpuoverview.html\\\">Multipart Upload\\n              Overview</a> in the <i>Amazon S3 User Guide</i>.</p>\\n               </li>\\n            </ul>\\n         </note>\",\n            \"smithy.api#httpQuery\": \"delimiter\"\n          }\n        },\n        \"EncodingType\": {\n          \"target\": \"com.amazonaws.s3#EncodingType\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Encoding type used by Amazon S3 to encode the <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-keys.html\\\">object keys</a> in the response. Responses are\\n      encoded only in UTF-8. An object key can contain any Unicode character. However, the XML 1.0 parser\\n      can't parse certain characters, such as characters with an ASCII value from 0 to 10. For characters that\\n      aren't supported in XML 1.0, you can add this parameter to request that Amazon S3 encode the keys in the\\n      response. For more information about characters to avoid in object key names, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-keys.html#object-key-guidelines\\\">Object key\\n        naming guidelines</a>.</p>\\n         <note>\\n            <p>When using the URL encoding type, non-ASCII characters that are used in an object's key name will\\n        be percent-encoded according to UTF-8 code values. For example, the object\\n          <code>test_file(3).png</code> will appear as <code>test_file%283%29.png</code>.</p>\\n         </note>\",\n            \"smithy.api#httpQuery\": \"encoding-type\"\n          }\n        },\n        \"MaxKeys\": {\n          \"target\": \"com.amazonaws.s3#MaxKeys\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Sets the maximum number of keys returned in the response. By default, the action returns up to 1,000\\n      key names. The response might contain fewer keys but will never contain more.</p>\",\n            \"smithy.api#httpQuery\": \"max-keys\"\n          }\n        },\n        \"Prefix\": {\n          \"target\": \"com.amazonaws.s3#Prefix\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Limits the response to keys that begin with the specified prefix.</p>\\n         <note>\\n            <p>\\n               <b>Directory buckets</b> - For directory buckets, only prefixes that end in a delimiter (<code>/</code>) are supported.</p>\\n         </note>\",\n            \"smithy.api#httpQuery\": \"prefix\",\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Prefix\"\n            }\n          }\n        },\n        \"ContinuationToken\": {\n          \"target\": \"com.amazonaws.s3#Token\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>\\n            <code>ContinuationToken</code> indicates to Amazon S3 that the list is being continued on this bucket\\n      with a token. <code>ContinuationToken</code> is obfuscated and is not a real key. You can use this\\n        <code>ContinuationToken</code> for pagination of the list results. </p>\",\n            \"smithy.api#httpQuery\": \"continuation-token\"\n          }\n        },\n        \"FetchOwner\": {\n          \"target\": \"com.amazonaws.s3#FetchOwner\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The owner field is not present in <code>ListObjectsV2</code> by default. If you want to return the\\n      owner field with each key in the result, then set the <code>FetchOwner</code> field to\\n      <code>true</code>.</p>\\n         <note>\\n            <p>\\n               <b>Directory buckets</b> - For directory buckets, the bucket\\n        owner is returned as the object owner for all objects.</p>\\n         </note>\",\n            \"smithy.api#httpQuery\": \"fetch-owner\"\n          }\n        },\n        \"StartAfter\": {\n          \"target\": \"com.amazonaws.s3#StartAfter\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>StartAfter is where you want Amazon S3 to start listing from. Amazon S3 starts listing after this specified\\n      key. StartAfter can be any key in the bucket.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpQuery\": \"start-after\"\n          }\n        },\n        \"RequestPayer\": {\n          \"target\": \"com.amazonaws.s3#RequestPayer\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Confirms that the requester knows that she or he will be charged for the list objects request in V2\\n      style. Bucket owners need not specify this parameter in their requests.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-request-payer\"\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        },\n        \"OptionalObjectAttributes\": {\n          \"target\": \"com.amazonaws.s3#OptionalObjectAttributesList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the optional fields that you want returned in the response. Fields that you do not specify\\n      are not returned.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-optional-object-attributes\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#ListParts\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#ListPartsRequest\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.s3#ListPartsOutput\"\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Lists the parts that have been uploaded for a specific multipart upload.</p>\\n         <p>To use this operation, you must provide the <code>upload ID</code> in the request. You obtain this\\n      uploadID by sending the initiate multipart upload request through <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateMultipartUpload.html\\\">CreateMultipartUpload</a>.</p>\\n         <p>The <code>ListParts</code> request returns a maximum of 1,000 uploaded parts. The limit of 1,000\\n      parts is also the default value. You can restrict the number of parts in a response by specifying the\\n        <code>max-parts</code> request parameter. If your multipart upload consists of more than 1,000 parts,\\n      the response returns an <code>IsTruncated</code> field with the value of <code>true</code>, and a\\n        <code>NextPartNumberMarker</code> element. To list remaining uploaded parts, in subsequent\\n        <code>ListParts</code> requests, include the <code>part-number-marker</code> query string parameter\\n      and set its value to the <code>NextPartNumberMarker</code> field value from the previous\\n      response.</p>\\n         <p>For more information on multipart uploads, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/uploadobjusingmpu.html\\\">Uploading Objects Using Multipart Upload</a> in\\n      the <i>Amazon S3 User Guide</i>.</p>\\n         <note>\\n            <p>\\n               <b>Directory buckets</b> - For directory buckets, you must make requests for this API operation to the Zonal endpoint. These endpoints support virtual-hosted-style requests in the format <code>https://<i>amzn-s3-demo-bucket</i>.s3express-<i>zone-id</i>.<i>region-code</i>.amazonaws.com/<i>key-name</i>\\n               </code>. Path-style requests are not supported. For more information about endpoints in Availability Zones, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/endpoint-directory-buckets-AZ.html\\\">Regional and Zonal endpoints for directory buckets in Availability Zones</a> in the\\n    <i>Amazon S3 User Guide</i>. For more information about endpoints in Local Zones, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-lzs-for-directory-buckets.html\\\">Concepts for directory buckets in Local Zones</a> in the\\n    <i>Amazon S3 User Guide</i>.</p>\\n         </note>\\n         <dl>\\n            <dt>Permissions</dt>\\n            <dd>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <b>General purpose bucket permissions</b> - For information\\n                about permissions required to use the multipart upload API, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/mpuAndPermissions.html\\\">Multipart Upload and Permissions</a> in\\n                the <i>Amazon S3 User Guide</i>.</p>\\n                     <p>If the upload was created using server-side encryption with Key Management Service (KMS) keys\\n                (SSE-KMS) or dual-layer server-side encryption with Amazon Web Services KMS keys (DSSE-KMS), you must have\\n                permission to the <code>kms:Decrypt</code> action for the <code>ListParts</code> request to\\n                succeed.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <b>Directory bucket permissions</b> - To grant access to this API operation on a directory bucket, we recommend that you use the <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateSession.html\\\">\\n                           <code>CreateSession</code>\\n                        </a> API operation for session-based authorization. Specifically, you grant the <code>s3express:CreateSession</code> permission to the directory bucket in a bucket policy or an IAM identity-based policy. Then, you make the <code>CreateSession</code> API call on the bucket to obtain a session token. With the session token in your request header, you can make API requests to this operation. After the session token expires, you make another <code>CreateSession</code> API call to generate a new session token for use. \\nAmazon Web Services CLI or SDKs create session and refresh the session token automatically to avoid service interruptions when a session expires. For more information about authorization, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateSession.html\\\">\\n                           <code>CreateSession</code>\\n                        </a>.</p>\\n                  </li>\\n               </ul>\\n            </dd>\\n            <dt>HTTP Host header syntax</dt>\\n            <dd>\\n               <p>\\n                  <b>Directory buckets </b> - The HTTP Host header syntax is <code>\\n                     <i>Bucket-name</i>.s3express-<i>zone-id</i>.<i>region-code</i>.amazonaws.com</code>.</p>\\n            </dd>\\n         </dl>\\n         <p>The following operations are related to <code>ListParts</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateMultipartUpload.html\\\">CreateMultipartUpload</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPart.html\\\">UploadPart</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html\\\">CompleteMultipartUpload</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_AbortMultipartUpload.html\\\">AbortMultipartUpload</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObjectAttributes.html\\\">GetObjectAttributes</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListMultipartUploads.html\\\">ListMultipartUploads</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#examples\": [\n          {\n            \"title\": \"To list parts of a multipart upload.\",\n            \"documentation\": \"The following example lists parts uploaded for a specific multipart upload.\",\n            \"input\": {\n              \"Bucket\": \"examplebucket\",\n              \"Key\": \"bigobject\",\n              \"UploadId\": \"example7YPBOJuoFiQ9cz4P3Pe6FIZwO4f7wN93uHsNBEw97pl5eNwzExg0LAT2dUN91cOmrEQHDsP3WA60CEg--\"\n            },\n            \"output\": {\n              \"Owner\": {\n                \"DisplayName\": \"owner-display-name\",\n                \"ID\": \"examplee7a2f25102679df27bb0ae12b3f85be6f290b936c4393484be31bebcc\"\n              },\n              \"Initiator\": {\n                \"DisplayName\": \"owner-display-name\",\n                \"ID\": \"examplee7a2f25102679df27bb0ae12b3f85be6f290b936c4393484be31bebcc\"\n              },\n              \"Parts\": [\n                {\n                  \"LastModified\": \"2016-12-16T00:11:42.000Z\",\n                  \"PartNumber\": 1,\n                  \"ETag\": \"\\\"d8c2eafd90c266e19ab9dcacc479f8af\\\"\",\n                  \"Size\": 26246026\n                },\n                {\n                  \"LastModified\": \"2016-12-16T00:15:01.000Z\",\n                  \"PartNumber\": 2,\n                  \"ETag\": \"\\\"d8c2eafd90c266e19ab9dcacc479f8af\\\"\",\n                  \"Size\": 26246026\n                }\n              ],\n              \"StorageClass\": \"STANDARD\"\n            }\n          }\n        ],\n        \"smithy.api#http\": {\n          \"method\": \"GET\",\n          \"uri\": \"/{Bucket}/{Key+}?x-id=ListParts\",\n          \"code\": 200\n        },\n        \"smithy.api#paginated\": {\n          \"inputToken\": \"PartNumberMarker\",\n          \"outputToken\": \"NextPartNumberMarker\",\n          \"items\": \"Parts\",\n          \"pageSize\": \"MaxParts\"\n        }\n      }\n    },\n    \"com.amazonaws.s3#ListPartsOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"AbortDate\": {\n          \"target\": \"com.amazonaws.s3#AbortDate\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>If the bucket has a lifecycle rule configured with an action to abort incomplete multipart uploads\\n      and the prefix in the lifecycle rule matches the object name in the request, then the response includes\\n      this header indicating when the initiated multipart upload will become eligible for abort operation. For\\n      more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/mpuoverview.html#mpu-abort-incomplete-mpu-lifecycle-config\\\">Aborting\\n        Incomplete Multipart Uploads Using a Bucket Lifecycle Configuration</a>.</p>\\n         <p>The response will also include the <code>x-amz-abort-rule-id</code> header that will provide the ID\\n      of the lifecycle configuration rule that defines this action.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-abort-date\"\n          }\n        },\n        \"AbortRuleId\": {\n          \"target\": \"com.amazonaws.s3#AbortRuleId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>This header is returned along with the <code>x-amz-abort-date</code> header. It identifies\\n      applicable lifecycle configuration rule that defines the action to abort incomplete multipart\\n      uploads.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-abort-rule-id\"\n          }\n        },\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the bucket to which the multipart upload was initiated. Does not return the access point ARN or\\n      access point alias if used.</p>\"\n          }\n        },\n        \"Key\": {\n          \"target\": \"com.amazonaws.s3#ObjectKey\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Object key for which the multipart upload was initiated.</p>\"\n          }\n        },\n        \"UploadId\": {\n          \"target\": \"com.amazonaws.s3#MultipartUploadId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Upload ID identifying the multipart upload whose parts are being listed.</p>\"\n          }\n        },\n        \"PartNumberMarker\": {\n          \"target\": \"com.amazonaws.s3#PartNumberMarker\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the part after which listing should begin. Only parts with higher part numbers will be\\n      listed.</p>\"\n          }\n        },\n        \"NextPartNumberMarker\": {\n          \"target\": \"com.amazonaws.s3#NextPartNumberMarker\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>When a list is truncated, this element specifies the last part in the list, as well as the value to\\n      use for the <code>part-number-marker</code> request parameter in a subsequent request.</p>\"\n          }\n        },\n        \"MaxParts\": {\n          \"target\": \"com.amazonaws.s3#MaxParts\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Maximum number of parts that were allowed in the response.</p>\"\n          }\n        },\n        \"IsTruncated\": {\n          \"target\": \"com.amazonaws.s3#IsTruncated\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p> Indicates whether the returned list of parts is truncated. A true value indicates that the list was\\n      truncated. A list can be truncated if the number of parts exceeds the limit returned in the MaxParts\\n      element.</p>\"\n          }\n        },\n        \"Parts\": {\n          \"target\": \"com.amazonaws.s3#Parts\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Container for elements related to a particular part. A response can contain zero or more\\n        <code>Part</code> elements.</p>\",\n            \"smithy.api#xmlFlattened\": {},\n            \"smithy.api#xmlName\": \"Part\"\n          }\n        },\n        \"Initiator\": {\n          \"target\": \"com.amazonaws.s3#Initiator\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Container element that identifies who initiated the multipart upload. If the initiator is an\\n      Amazon Web Services account, this element provides the same information as the <code>Owner</code> element. If the\\n      initiator is an IAM User, this element provides the user ARN.</p>\"\n          }\n        },\n        \"Owner\": {\n          \"target\": \"com.amazonaws.s3#Owner\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Container element that identifies the object owner, after the object is created. If multipart upload\\n      is initiated by an IAM user, this element provides the parent account ID.</p>\\n         <note>\\n            <p>\\n               <b>Directory buckets</b> - The bucket owner is returned as the\\n        object owner for all the parts.</p>\\n         </note>\"\n          }\n        },\n        \"StorageClass\": {\n          \"target\": \"com.amazonaws.s3#StorageClass\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The class of storage used to store the uploaded object.</p>\\n         <note>\\n            <p>\\n               <b>Directory buckets</b> -\\n        Directory buckets only support <code>EXPRESS_ONEZONE</code> (the S3 Express One Zone storage class) in Availability Zones and <code>ONEZONE_IA</code> (the S3 One Zone-Infrequent Access storage class) in Dedicated Local Zones.</p>\\n         </note>\"\n          }\n        },\n        \"RequestCharged\": {\n          \"target\": \"com.amazonaws.s3#RequestCharged\",\n          \"traits\": {\n            \"smithy.api#httpHeader\": \"x-amz-request-charged\"\n          }\n        },\n        \"ChecksumAlgorithm\": {\n          \"target\": \"com.amazonaws.s3#ChecksumAlgorithm\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The algorithm that was used to create a checksum of the object.</p>\"\n          }\n        },\n        \"ChecksumType\": {\n          \"target\": \"com.amazonaws.s3#ChecksumType\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The checksum type, which determines how part-level checksums are combined to create an object-level\\n      checksum for multipart objects. You can use this header response to verify that the checksum type that\\n      is received is the same checksum type that was specified in <code>CreateMultipartUpload</code> request.\\n      For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking object integrity in the Amazon S3\\n        User Guide</a>.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#output\": {},\n        \"smithy.api#xmlName\": \"ListPartsResult\"\n      }\n    },\n    \"com.amazonaws.s3#ListPartsRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the bucket to which the parts are being uploaded. </p>\\n         <p>\\n            <b>Directory buckets</b> - When you use this operation with a directory bucket, you must use virtual-hosted-style requests in the format <code>\\n               <i>Bucket-name</i>.s3express-<i>zone-id</i>.<i>region-code</i>.amazonaws.com</code>. Path-style requests are not supported.  Directory bucket names must be unique in the chosen Zone (Availability Zone or Local Zone). Bucket names must follow the format <code>\\n               <i>bucket-base-name</i>--<i>zone-id</i>--x-s3</code> (for example, <code>\\n               <i>amzn-s3-demo-bucket</i>--<i>usw2-az1</i>--x-s3</code>). For information about bucket naming\\n         restrictions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-bucket-naming-rules.html\\\">Directory bucket naming\\n            rules</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <p>\\n            <b>Access points</b> - When you use this action with an access point for general purpose buckets, you must provide the alias of the access point in place of the bucket name or specify the access point ARN. When you use this action with an access point for directory buckets, you must provide the access point name in place of the bucket name. When using the access point ARN, you must direct requests to the access point hostname. The access point hostname takes the form <i>AccessPointName</i>-<i>AccountId</i>.s3-accesspoint.<i>Region</i>.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html\\\">Using access points</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <note>\\n            <p>Object Lambda access points are not supported by directory buckets.</p>\\n         </note>\\n         <p>\\n            <b>S3 on Outposts</b> - When you use this action with S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the \\n                     form <code>\\n               <i>AccessPointName</i>-<i>AccountId</i>.<i>outpostID</i>.s3-outposts.<i>Region</i>.amazonaws.com</code>. When you use this action with S3 on Outposts, the destination bucket must be the Outposts access point ARN or the access point alias. For more information about S3 on Outposts, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html\\\">What is S3 on Outposts?</a> in the <i>Amazon S3 User Guide</i>.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"Key\": {\n          \"target\": \"com.amazonaws.s3#ObjectKey\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Object key for which the multipart upload was initiated.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Key\"\n            }\n          }\n        },\n        \"MaxParts\": {\n          \"target\": \"com.amazonaws.s3#MaxParts\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Sets the maximum number of parts to return.</p>\",\n            \"smithy.api#httpQuery\": \"max-parts\"\n          }\n        },\n        \"PartNumberMarker\": {\n          \"target\": \"com.amazonaws.s3#PartNumberMarker\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the part after which listing should begin. Only parts with higher part numbers will be\\n      listed.</p>\",\n            \"smithy.api#httpQuery\": \"part-number-marker\"\n          }\n        },\n        \"UploadId\": {\n          \"target\": \"com.amazonaws.s3#MultipartUploadId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Upload ID identifying the multipart upload whose parts are being listed.</p>\",\n            \"smithy.api#httpQuery\": \"uploadId\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"RequestPayer\": {\n          \"target\": \"com.amazonaws.s3#RequestPayer\",\n          \"traits\": {\n            \"smithy.api#httpHeader\": \"x-amz-request-payer\"\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        },\n        \"SSECustomerAlgorithm\": {\n          \"target\": \"com.amazonaws.s3#SSECustomerAlgorithm\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The server-side encryption (SSE) algorithm used to encrypt the object. This parameter is needed only when the object was created \\n    using a checksum algorithm. For more information,\\n    see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/ServerSideEncryptionCustomerKeys.html\\\">Protecting data using SSE-C keys</a> in the\\n    <i>Amazon S3 User Guide</i>.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption-customer-algorithm\"\n          }\n        },\n        \"SSECustomerKey\": {\n          \"target\": \"com.amazonaws.s3#SSECustomerKey\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The server-side encryption (SSE) customer managed key. This parameter is needed only when the object was created using a checksum algorithm. \\n    For more information, see\\n    <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/ServerSideEncryptionCustomerKeys.html\\\">Protecting data using SSE-C keys</a> in the\\n    <i>Amazon S3 User Guide</i>.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption-customer-key\"\n          }\n        },\n        \"SSECustomerKeyMD5\": {\n          \"target\": \"com.amazonaws.s3#SSECustomerKeyMD5\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The MD5 server-side encryption (SSE) customer managed key. This parameter is needed only when the object was created using a checksum \\n    algorithm. For more information,\\n    see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/ServerSideEncryptionCustomerKeys.html\\\">Protecting data using SSE-C keys</a> in the\\n    <i>Amazon S3 User Guide</i>.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption-customer-key-MD5\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#Location\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#LocationInfo\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Type\": {\n          \"target\": \"com.amazonaws.s3#LocationType\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The type of location where the bucket will be created.</p>\"\n          }\n        },\n        \"Name\": {\n          \"target\": \"com.amazonaws.s3#LocationNameAsString\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the location where the bucket will be created.</p>\\n         <p>For directory buckets, the name of the location is the Zone ID of the Availability Zone (AZ) or Local Zone (LZ) where\\n      the bucket will be created. An example AZ ID value is <code>usw2-az1</code>.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Specifies the location where the bucket will be created.</p>\\n         <p>For directory buckets, the location type is Availability Zone or Local Zone. For more information about\\n      directory buckets, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-buckets-overview.html\\\">Working with\\n        directory buckets</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <note>\\n            <p>This functionality is only supported by directory buckets.</p>\\n         </note>\"\n      }\n    },\n    \"com.amazonaws.s3#LocationNameAsString\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#LocationPrefix\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#LocationType\": {\n      \"type\": \"enum\",\n      \"members\": {\n        \"AvailabilityZone\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"AvailabilityZone\"\n          }\n        },\n        \"LocalZone\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"LocalZone\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#LoggingEnabled\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"TargetBucket\": {\n          \"target\": \"com.amazonaws.s3#TargetBucket\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the bucket where you want Amazon S3 to store server access logs. You can have your logs\\n      delivered to any bucket that you own, including the same bucket that is being logged. You can also\\n      configure multiple buckets to deliver their logs to the same target bucket. In this case, you should\\n      choose a different <code>TargetPrefix</code> for each source bucket so that the delivered log files can\\n      be distinguished by key.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"TargetGrants\": {\n          \"target\": \"com.amazonaws.s3#TargetGrants\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Container for granting information.</p>\\n         <p>Buckets that use the bucket owner enforced setting for Object Ownership don't support target grants.\\n      For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/enable-server-access-logging.html#grant-log-delivery-permissions-general\\\">Permissions for server access log delivery</a> in the\\n      <i>Amazon S3 User Guide</i>.</p>\"\n          }\n        },\n        \"TargetPrefix\": {\n          \"target\": \"com.amazonaws.s3#TargetPrefix\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A prefix for all log object keys. If you store log files from multiple Amazon S3 buckets in a single\\n      bucket, you can use a prefix to distinguish which log files came from which bucket.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"TargetObjectKeyFormat\": {\n          \"target\": \"com.amazonaws.s3#TargetObjectKeyFormat\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Amazon S3 key format for log objects.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Describes where logs are stored and the prefix that Amazon S3 assigns to all log object keys for a\\n      bucket. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketPUTlogging.html\\\">PUT Bucket logging</a> in the\\n        <i>Amazon S3 API Reference</i>.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#MFA\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#MFADelete\": {\n      \"type\": \"enum\",\n      \"members\": {\n        \"Enabled\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"Enabled\"\n          }\n        },\n        \"Disabled\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"Disabled\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#MFADeleteStatus\": {\n      \"type\": \"enum\",\n      \"members\": {\n        \"Enabled\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"Enabled\"\n          }\n        },\n        \"Disabled\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"Disabled\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#Marker\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#MaxAgeSeconds\": {\n      \"type\": \"integer\"\n    },\n    \"com.amazonaws.s3#MaxBuckets\": {\n      \"type\": \"integer\",\n      \"traits\": {\n        \"smithy.api#range\": {\n          \"min\": 1,\n          \"max\": 10000\n        }\n      }\n    },\n    \"com.amazonaws.s3#MaxDirectoryBuckets\": {\n      \"type\": \"integer\",\n      \"traits\": {\n        \"smithy.api#range\": {\n          \"min\": 0,\n          \"max\": 1000\n        }\n      }\n    },\n    \"com.amazonaws.s3#MaxKeys\": {\n      \"type\": \"integer\"\n    },\n    \"com.amazonaws.s3#MaxParts\": {\n      \"type\": \"integer\"\n    },\n    \"com.amazonaws.s3#MaxUploads\": {\n      \"type\": \"integer\"\n    },\n    \"com.amazonaws.s3#Message\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#Metadata\": {\n      \"type\": \"map\",\n      \"key\": {\n        \"target\": \"com.amazonaws.s3#MetadataKey\"\n      },\n      \"value\": {\n        \"target\": \"com.amazonaws.s3#MetadataValue\"\n      }\n    },\n    \"com.amazonaws.s3#MetadataConfiguration\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"JournalTableConfiguration\": {\n          \"target\": \"com.amazonaws.s3#JournalTableConfiguration\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>\\n      The journal table configuration for a metadata configuration.\\n    </p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"InventoryTableConfiguration\": {\n          \"target\": \"com.amazonaws.s3#InventoryTableConfiguration\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>\\n      The inventory table configuration for a metadata configuration.\\n    </p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>\\n      The S3 Metadata configuration for a general purpose bucket.\\n    </p>\"\n      }\n    },\n    \"com.amazonaws.s3#MetadataConfigurationResult\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"DestinationResult\": {\n          \"target\": \"com.amazonaws.s3#DestinationResult\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>\\n      The destination settings for a metadata configuration.\\n    </p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"JournalTableConfigurationResult\": {\n          \"target\": \"com.amazonaws.s3#JournalTableConfigurationResult\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>\\n      The journal table configuration for a metadata configuration.\\n    </p>\"\n          }\n        },\n        \"InventoryTableConfigurationResult\": {\n          \"target\": \"com.amazonaws.s3#InventoryTableConfigurationResult\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>\\n      The inventory table configuration for a metadata configuration.\\n    </p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>\\n      The S3 Metadata configuration for a general purpose bucket.\\n    </p>\"\n      }\n    },\n    \"com.amazonaws.s3#MetadataDirective\": {\n      \"type\": \"enum\",\n      \"members\": {\n        \"COPY\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"COPY\"\n          }\n        },\n        \"REPLACE\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"REPLACE\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#MetadataEntry\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Name\": {\n          \"target\": \"com.amazonaws.s3#MetadataKey\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Name of the object.</p>\"\n          }\n        },\n        \"Value\": {\n          \"target\": \"com.amazonaws.s3#MetadataValue\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Value of the object.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>A metadata key-value pair to store with an object.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#MetadataKey\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#MetadataTableConfiguration\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"S3TablesDestination\": {\n          \"target\": \"com.amazonaws.s3#S3TablesDestination\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p> The destination information for the metadata table configuration. The destination table bucket must\\n      be in the same Region and Amazon Web Services account as the general purpose bucket. The specified metadata table name\\n      must be unique within the <code>aws_s3_metadata</code> namespace in the destination table bucket.\\n    </p>\",\n            \"smithy.api#required\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p> The V1 S3 Metadata configuration for a general purpose bucket. </p>\\n         <note>\\n            <p>If you created your S3 Metadata configuration before July 15, 2025, we recommend that you delete \\n        and re-create your configuration by using <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateBucketMetadataConfiguration.html\\\">CreateBucketMetadataConfiguration</a> so that you can expire journal table records and create \\n        a live inventory table.</p>\\n         </note>\"\n      }\n    },\n    \"com.amazonaws.s3#MetadataTableConfigurationResult\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"S3TablesDestinationResult\": {\n          \"target\": \"com.amazonaws.s3#S3TablesDestinationResult\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p> The destination information for the metadata table configuration. The destination table bucket must\\n      be in the same Region and Amazon Web Services account as the general purpose bucket. The specified metadata table name\\n      must be unique within the <code>aws_s3_metadata</code> namespace in the destination table bucket.\\n    </p>\",\n            \"smithy.api#required\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p> The V1 S3 Metadata configuration for a general purpose bucket. The destination table bucket must be\\n      in the same Region and Amazon Web Services account as the general purpose bucket. The specified metadata table name\\n      must be unique within the <code>aws_s3_metadata</code> namespace in the destination table bucket.\\n    </p>\\n         <note>\\n            <p>If you created your S3 Metadata configuration before July 15, 2025, we recommend that you delete \\n        and re-create your configuration by using <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateBucketMetadataConfiguration.html\\\">CreateBucketMetadataConfiguration</a> so that you can expire journal table records and create \\n        a live inventory table.</p>\\n         </note>\"\n      }\n    },\n    \"com.amazonaws.s3#MetadataTableEncryptionConfiguration\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"SseAlgorithm\": {\n          \"target\": \"com.amazonaws.s3#TableSseAlgorithm\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>\\n      The encryption type specified for a metadata table. To specify server-side encryption with \\n      Key Management Service (KMS) keys (SSE-KMS), use the <code>aws:kms</code> value. To specify server-side \\n      encryption with Amazon S3 managed keys (SSE-S3), use the <code>AES256</code> value. \\n    </p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"KmsKeyArn\": {\n          \"target\": \"com.amazonaws.s3#KmsKeyArn\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>\\n      If server-side encryption with Key Management Service (KMS) keys (SSE-KMS) is specified, you must also\\n      specify the KMS key Amazon Resource Name (ARN). You must specify a customer-managed KMS key \\n      that's located in the same Region as the general purpose bucket that corresponds to the metadata \\n      table configuration.\\n    </p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>\\n      The encryption settings for an S3 Metadata journal table or inventory table configuration.\\n    </p>\"\n      }\n    },\n    \"com.amazonaws.s3#MetadataTableStatus\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#MetadataValue\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#Metrics\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Status\": {\n          \"target\": \"com.amazonaws.s3#MetricsStatus\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p> Specifies whether the replication metrics are enabled. </p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"EventThreshold\": {\n          \"target\": \"com.amazonaws.s3#ReplicationTimeValue\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p> A container specifying the time threshold for emitting the\\n        <code>s3:Replication:OperationMissedThreshold</code> event. </p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p> A container specifying replication metrics-related settings enabling replication metrics and\\n      events.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#MetricsAndOperator\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Prefix\": {\n          \"target\": \"com.amazonaws.s3#Prefix\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The prefix used when evaluating an AND predicate.</p>\"\n          }\n        },\n        \"Tags\": {\n          \"target\": \"com.amazonaws.s3#TagSet\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The list of tags used when evaluating an AND predicate.</p>\",\n            \"smithy.api#xmlFlattened\": {},\n            \"smithy.api#xmlName\": \"Tag\"\n          }\n        },\n        \"AccessPointArn\": {\n          \"target\": \"com.amazonaws.s3#AccessPointArn\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The access point ARN used when evaluating an <code>AND</code> predicate.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>A conjunction (logical AND) of predicates, which is used in evaluating a metrics filter. The\\n      operator must have at least two predicates, and an object must match all of the predicates in order for\\n      the filter to apply.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#MetricsConfiguration\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Id\": {\n          \"target\": \"com.amazonaws.s3#MetricsId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The ID used to identify the metrics configuration. The ID has a 64 character limit and can only\\n      contain letters, numbers, periods, dashes, and underscores.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"Filter\": {\n          \"target\": \"com.amazonaws.s3#MetricsFilter\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies a metrics configuration filter. The metrics configuration will only include objects that\\n      meet the filter's criteria. A filter must be a prefix, an object tag, an access point ARN, or a\\n      conjunction (MetricsAndOperator).</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Specifies a metrics configuration for the CloudWatch request metrics (specified by the metrics\\n      configuration ID) from an Amazon S3 bucket. If you're updating an existing metrics configuration, note that\\n      this is a full replacement of the existing metrics configuration. If you don't include the elements you\\n      want to keep, they are erased. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketPUTMetricConfiguration.html\\\">PutBucketMetricsConfiguration</a>.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#MetricsConfigurationList\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.s3#MetricsConfiguration\"\n      }\n    },\n    \"com.amazonaws.s3#MetricsFilter\": {\n      \"type\": \"union\",\n      \"members\": {\n        \"Prefix\": {\n          \"target\": \"com.amazonaws.s3#Prefix\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The prefix used when evaluating a metrics filter.</p>\"\n          }\n        },\n        \"Tag\": {\n          \"target\": \"com.amazonaws.s3#Tag\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The tag used when evaluating a metrics filter.</p>\"\n          }\n        },\n        \"AccessPointArn\": {\n          \"target\": \"com.amazonaws.s3#AccessPointArn\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The access point ARN used when evaluating a metrics filter.</p>\"\n          }\n        },\n        \"And\": {\n          \"target\": \"com.amazonaws.s3#MetricsAndOperator\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A conjunction (logical AND) of predicates, which is used in evaluating a metrics filter. The\\n      operator must have at least two predicates, and an object must match all of the predicates in order for\\n      the filter to apply.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Specifies a metrics configuration filter. The metrics configuration only includes objects that meet\\n      the filter's criteria. A filter must be a prefix, an object tag, an access point ARN, or a conjunction\\n      (MetricsAndOperator). For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketMetricsConfiguration.html\\\">PutBucketMetricsConfiguration</a>.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#MetricsId\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#MetricsStatus\": {\n      \"type\": \"enum\",\n      \"members\": {\n        \"Enabled\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"Enabled\"\n          }\n        },\n        \"Disabled\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"Disabled\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#Minutes\": {\n      \"type\": \"integer\"\n    },\n    \"com.amazonaws.s3#MissingMeta\": {\n      \"type\": \"integer\"\n    },\n    \"com.amazonaws.s3#MpuObjectSize\": {\n      \"type\": \"long\"\n    },\n    \"com.amazonaws.s3#MultipartUpload\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"UploadId\": {\n          \"target\": \"com.amazonaws.s3#MultipartUploadId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Upload ID that identifies the multipart upload.</p>\"\n          }\n        },\n        \"Key\": {\n          \"target\": \"com.amazonaws.s3#ObjectKey\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Key of the object for which the multipart upload was initiated.</p>\"\n          }\n        },\n        \"Initiated\": {\n          \"target\": \"com.amazonaws.s3#Initiated\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Date and time at which the multipart upload was initiated.</p>\"\n          }\n        },\n        \"StorageClass\": {\n          \"target\": \"com.amazonaws.s3#StorageClass\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The class of storage used to store the object.</p>\\n         <note>\\n            <p>\\n               <b>Directory buckets</b> -\\n        Directory buckets only support <code>EXPRESS_ONEZONE</code> (the S3 Express One Zone storage class) in Availability Zones and <code>ONEZONE_IA</code> (the S3 One Zone-Infrequent Access storage class) in Dedicated Local Zones.</p>\\n         </note>\"\n          }\n        },\n        \"Owner\": {\n          \"target\": \"com.amazonaws.s3#Owner\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the owner of the object that is part of the multipart upload. </p>\\n         <note>\\n            <p>\\n               <b>Directory buckets</b> - The bucket owner is returned as the\\n        object owner for all the objects.</p>\\n         </note>\"\n          }\n        },\n        \"Initiator\": {\n          \"target\": \"com.amazonaws.s3#Initiator\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Identifies who initiated the multipart upload.</p>\"\n          }\n        },\n        \"ChecksumAlgorithm\": {\n          \"target\": \"com.amazonaws.s3#ChecksumAlgorithm\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The algorithm that was used to create a checksum of the object.</p>\"\n          }\n        },\n        \"ChecksumType\": {\n          \"target\": \"com.amazonaws.s3#ChecksumType\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The checksum type that is used to calculate the object’s checksum value. For more information, see\\n        <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking\\n        object integrity</a> in the <i>Amazon S3 User Guide</i>.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Container for the <code>MultipartUpload</code> for the Amazon S3 object.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#MultipartUploadId\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#MultipartUploadList\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.s3#MultipartUpload\"\n      }\n    },\n    \"com.amazonaws.s3#NextKeyMarker\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#NextMarker\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#NextPartNumberMarker\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#NextToken\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#NextUploadIdMarker\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#NextVersionIdMarker\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#NoSuchBucket\": {\n      \"type\": \"structure\",\n      \"members\": {},\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>The specified bucket does not exist.</p>\",\n        \"smithy.api#error\": \"client\",\n        \"smithy.api#httpError\": 404\n      }\n    },\n    \"com.amazonaws.s3#NoSuchKey\": {\n      \"type\": \"structure\",\n      \"members\": {},\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>The specified key does not exist.</p>\",\n        \"smithy.api#error\": \"client\",\n        \"smithy.api#httpError\": 404\n      }\n    },\n    \"com.amazonaws.s3#NoSuchUpload\": {\n      \"type\": \"structure\",\n      \"members\": {},\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>The specified multipart upload does not exist.</p>\",\n        \"smithy.api#error\": \"client\",\n        \"smithy.api#httpError\": 404\n      }\n    },\n    \"com.amazonaws.s3#NoncurrentVersionExpiration\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"NoncurrentDays\": {\n          \"target\": \"com.amazonaws.s3#Days\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the number of days an object is noncurrent before Amazon S3 can perform the associated action.\\n      The value must be a non-zero positive integer. For information about the noncurrent days calculations,\\n      see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/intro-lifecycle-rules.html#non-current-days-calculations\\\">How Amazon S3 Calculates\\n        When an Object Became Noncurrent</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <note>\\n            <p>This parameter applies to general purpose buckets only. It is not supported for directory bucket\\n        lifecycle configurations.</p>\\n         </note>\"\n          }\n        },\n        \"NewerNoncurrentVersions\": {\n          \"target\": \"com.amazonaws.s3#VersionCount\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies how many noncurrent versions Amazon S3 will retain. You can specify up to 100 noncurrent\\n      versions to retain. Amazon S3 will permanently delete any additional noncurrent versions beyond the specified\\n      number to retain. For more information about noncurrent versions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/intro-lifecycle-rules.html\\\">Lifecycle configuration elements</a> in\\n      the <i>Amazon S3 User Guide</i>.</p>\\n         <note>\\n            <p>This parameter applies to general purpose buckets only. It is not supported for directory bucket\\n        lifecycle configurations.</p>\\n         </note>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Specifies when noncurrent object versions expire. Upon expiration, Amazon S3 permanently deletes the\\n      noncurrent object versions. You set this lifecycle configuration action on a bucket that has versioning\\n      enabled (or suspended) to request that Amazon S3 delete noncurrent object versions at a specific period in\\n      the object's lifetime.</p>\\n         <note>\\n            <p>This parameter applies to general purpose buckets only. It is not supported for directory bucket\\n        lifecycle configurations.</p>\\n         </note>\"\n      }\n    },\n    \"com.amazonaws.s3#NoncurrentVersionTransition\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"NoncurrentDays\": {\n          \"target\": \"com.amazonaws.s3#Days\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the number of days an object is noncurrent before Amazon S3 can perform the associated action.\\n      For information about the noncurrent days calculations, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/intro-lifecycle-rules.html#non-current-days-calculations\\\">How Amazon S3 Calculates\\n        How Long an Object Has Been Noncurrent</a> in the <i>Amazon S3 User Guide</i>.</p>\"\n          }\n        },\n        \"StorageClass\": {\n          \"target\": \"com.amazonaws.s3#TransitionStorageClass\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The class of storage used to store the object.</p>\"\n          }\n        },\n        \"NewerNoncurrentVersions\": {\n          \"target\": \"com.amazonaws.s3#VersionCount\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies how many noncurrent versions Amazon S3 will retain in the same storage class before\\n      transitioning objects. You can specify up to 100 noncurrent versions to retain. Amazon S3 will transition any\\n      additional noncurrent versions beyond the specified number to retain. For more information about\\n      noncurrent versions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/intro-lifecycle-rules.html\\\">Lifecycle configuration elements</a> in\\n      the <i>Amazon S3 User Guide</i>.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Container for the transition rule that describes when noncurrent objects transition to the\\n        <code>STANDARD_IA</code>, <code>ONEZONE_IA</code>, <code>INTELLIGENT_TIERING</code>,\\n        <code>GLACIER_IR</code>, <code>GLACIER</code>, or <code>DEEP_ARCHIVE</code> storage class. If your\\n      bucket is versioning-enabled (or versioning is suspended), you can set this action to request that Amazon S3\\n      transition noncurrent object versions to the <code>STANDARD_IA</code>, <code>ONEZONE_IA</code>,\\n        <code>INTELLIGENT_TIERING</code>, <code>GLACIER_IR</code>, <code>GLACIER</code>, or\\n        <code>DEEP_ARCHIVE</code> storage class at a specific period in the object's lifetime.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#NoncurrentVersionTransitionList\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.s3#NoncurrentVersionTransition\"\n      }\n    },\n    \"com.amazonaws.s3#NotFound\": {\n      \"type\": \"structure\",\n      \"members\": {},\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>The specified content does not exist.</p>\",\n        \"smithy.api#error\": \"client\"\n      }\n    },\n    \"com.amazonaws.s3#NotificationConfiguration\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"TopicConfigurations\": {\n          \"target\": \"com.amazonaws.s3#TopicConfigurationList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The topic to which notifications are sent and the events for which notifications are\\n      generated.</p>\",\n            \"smithy.api#xmlFlattened\": {},\n            \"smithy.api#xmlName\": \"TopicConfiguration\"\n          }\n        },\n        \"QueueConfigurations\": {\n          \"target\": \"com.amazonaws.s3#QueueConfigurationList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Amazon Simple Queue Service queues to publish messages to and the events for which to publish\\n      messages.</p>\",\n            \"smithy.api#xmlFlattened\": {},\n            \"smithy.api#xmlName\": \"QueueConfiguration\"\n          }\n        },\n        \"LambdaFunctionConfigurations\": {\n          \"target\": \"com.amazonaws.s3#LambdaFunctionConfigurationList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Describes the Lambda functions to invoke and the events for which to invoke them.</p>\",\n            \"smithy.api#xmlFlattened\": {},\n            \"smithy.api#xmlName\": \"CloudFunctionConfiguration\"\n          }\n        },\n        \"EventBridgeConfiguration\": {\n          \"target\": \"com.amazonaws.s3#EventBridgeConfiguration\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Enables delivery of events to Amazon EventBridge.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>A container for specifying the notification configuration of the bucket. If this element is empty,\\n      notifications are turned off for the bucket.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#NotificationConfigurationFilter\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Key\": {\n          \"target\": \"com.amazonaws.s3#S3KeyFilter\",\n          \"traits\": {\n            \"smithy.api#xmlName\": \"S3Key\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Specifies object key name filtering rules. For information about key name filtering, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/notification-how-to-filtering.html\\\">Configuring\\n        event notifications using object key name filtering</a> in the\\n        <i>Amazon S3 User Guide</i>.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#NotificationId\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>An optional unique identifier for configurations in a notification configuration. If you don't\\n      provide one, Amazon S3 will assign an ID.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#Object\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Key\": {\n          \"target\": \"com.amazonaws.s3#ObjectKey\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name that you assign to an object. You use the object key to retrieve the object.</p>\"\n          }\n        },\n        \"LastModified\": {\n          \"target\": \"com.amazonaws.s3#LastModified\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Creation date of the object.</p>\"\n          }\n        },\n        \"ETag\": {\n          \"target\": \"com.amazonaws.s3#ETag\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The entity tag is a hash of the object. The ETag reflects changes only to the contents of an object,\\n      not its metadata. The ETag may or may not be an MD5 digest of the object data. Whether or not it is\\n      depends on how the object was created and how it is encrypted as described below:</p>\\n         <ul>\\n            <li>\\n               <p>Objects created by the PUT Object, POST Object, or Copy operation, or through the Amazon Web Services\\n          Management Console, and are encrypted by SSE-S3 or plaintext, have ETags that are an MD5 digest of\\n          their object data.</p>\\n            </li>\\n            <li>\\n               <p>Objects created by the PUT Object, POST Object, or Copy operation, or through the Amazon Web Services\\n          Management Console, and are encrypted by SSE-C or SSE-KMS, have ETags that are not an MD5 digest of\\n          their object data.</p>\\n            </li>\\n            <li>\\n               <p>If an object is created by either the Multipart Upload or Part Copy operation, the ETag is not\\n          an MD5 digest, regardless of the method of encryption. If an object is larger than 16 MB, the Amazon Web Services\\n          Management Console will upload or copy that object as a Multipart Upload, and therefore the ETag\\n          will not be an MD5 digest.</p>\\n            </li>\\n         </ul>\\n         <note>\\n            <p>\\n               <b>Directory buckets</b> - MD5 is not supported by directory buckets.</p>\\n         </note>\"\n          }\n        },\n        \"ChecksumAlgorithm\": {\n          \"target\": \"com.amazonaws.s3#ChecksumAlgorithmList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The algorithm that was used to create a checksum of the object.</p>\",\n            \"smithy.api#xmlFlattened\": {}\n          }\n        },\n        \"ChecksumType\": {\n          \"target\": \"com.amazonaws.s3#ChecksumType\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The checksum type that is used to calculate the object’s checksum value. For more information, see\\n        <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking\\n        object integrity</a> in the <i>Amazon S3 User Guide</i>.</p>\"\n          }\n        },\n        \"Size\": {\n          \"target\": \"com.amazonaws.s3#Size\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Size in bytes of the object</p>\"\n          }\n        },\n        \"StorageClass\": {\n          \"target\": \"com.amazonaws.s3#ObjectStorageClass\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The class of storage used to store the object.</p>\\n         <note>\\n            <p>\\n               <b>Directory buckets</b> -\\n        Directory buckets only support <code>EXPRESS_ONEZONE</code> (the S3 Express One Zone storage class) in Availability Zones and <code>ONEZONE_IA</code> (the S3 One Zone-Infrequent Access storage class) in Dedicated Local Zones.</p>\\n         </note>\"\n          }\n        },\n        \"Owner\": {\n          \"target\": \"com.amazonaws.s3#Owner\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The owner of the object</p>\\n         <note>\\n            <p>\\n               <b>Directory buckets</b> - The bucket owner is returned as the\\n        object owner.</p>\\n         </note>\"\n          }\n        },\n        \"RestoreStatus\": {\n          \"target\": \"com.amazonaws.s3#RestoreStatus\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the restoration status of an object. Objects in certain storage classes must be restored\\n      before they can be retrieved. For more information about these storage classes and how to work with\\n      archived objects, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/archived-objects.html\\\">\\n        Working with archived objects</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets. Directory buckets only support <code>EXPRESS_ONEZONE</code> (the S3 Express One Zone storage class) in Availability Zones and <code>ONEZONE_IA</code> (the S3 One Zone-Infrequent Access storage class) in Dedicated Local Zones.</p>\\n         </note>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>An object consists of data and its descriptive metadata.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#ObjectAlreadyInActiveTierError\": {\n      \"type\": \"structure\",\n      \"members\": {},\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>This action is not allowed against this storage tier.</p>\",\n        \"smithy.api#error\": \"client\",\n        \"smithy.api#httpError\": 403\n      }\n    },\n    \"com.amazonaws.s3#ObjectAttributes\": {\n      \"type\": \"enum\",\n      \"members\": {\n        \"ETAG\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"ETag\"\n          }\n        },\n        \"CHECKSUM\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"Checksum\"\n          }\n        },\n        \"OBJECT_PARTS\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"ObjectParts\"\n          }\n        },\n        \"STORAGE_CLASS\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"StorageClass\"\n          }\n        },\n        \"OBJECT_SIZE\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"ObjectSize\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#ObjectAttributesList\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.s3#ObjectAttributes\"\n      }\n    },\n    \"com.amazonaws.s3#ObjectCannedACL\": {\n      \"type\": \"enum\",\n      \"members\": {\n        \"private\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"private\"\n          }\n        },\n        \"public_read\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"public-read\"\n          }\n        },\n        \"public_read_write\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"public-read-write\"\n          }\n        },\n        \"authenticated_read\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"authenticated-read\"\n          }\n        },\n        \"aws_exec_read\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"aws-exec-read\"\n          }\n        },\n        \"bucket_owner_read\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"bucket-owner-read\"\n          }\n        },\n        \"bucket_owner_full_control\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"bucket-owner-full-control\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#ObjectIdentifier\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Key\": {\n          \"target\": \"com.amazonaws.s3#ObjectKey\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Key name of the object.</p>\\n         <important>\\n            <p>Replacement must be made for object keys containing special characters (such as carriage returns) when using \\n         XML requests. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-keys.html#object-key-xml-related-constraints\\\">\\n            XML related object key constraints</a>.</p>\\n         </important>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"VersionId\": {\n          \"target\": \"com.amazonaws.s3#ObjectVersionId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Version ID for the specific version of the object to delete.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\"\n          }\n        },\n        \"ETag\": {\n          \"target\": \"com.amazonaws.s3#ETag\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>An entity tag (ETag) is an identifier assigned by a web server to a specific version of a resource\\n      found at a URL. This header field makes the request method conditional on <code>ETags</code>. </p>\\n         <note>\\n            <p>Entity tags (ETags) for S3 Express One Zone are random alphanumeric strings unique to the object.\\n      </p>\\n         </note>\"\n          }\n        },\n        \"LastModifiedTime\": {\n          \"target\": \"com.amazonaws.s3#LastModifiedTime\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>If present, the objects are deleted only if its modification times matches the provided\\n        <code>Timestamp</code>. </p>\\n         <note>\\n            <p>This functionality is only supported for directory buckets.</p>\\n         </note>\"\n          }\n        },\n        \"Size\": {\n          \"target\": \"com.amazonaws.s3#Size\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>If present, the objects are deleted only if its size matches the provided size in bytes. </p>\\n         <note>\\n            <p>This functionality is only supported for directory buckets.</p>\\n         </note>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Object Identifier is unique value to identify objects.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#ObjectIdentifierList\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.s3#ObjectIdentifier\"\n      }\n    },\n    \"com.amazonaws.s3#ObjectKey\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#length\": {\n          \"min\": 1\n        }\n      }\n    },\n    \"com.amazonaws.s3#ObjectList\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.s3#Object\"\n      }\n    },\n    \"com.amazonaws.s3#ObjectLockConfiguration\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"ObjectLockEnabled\": {\n          \"target\": \"com.amazonaws.s3#ObjectLockEnabled\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Indicates whether this bucket has an Object Lock configuration enabled. Enable\\n        <code>ObjectLockEnabled</code> when you apply <code>ObjectLockConfiguration</code> to a bucket.\\n    </p>\"\n          }\n        },\n        \"Rule\": {\n          \"target\": \"com.amazonaws.s3#ObjectLockRule\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the Object Lock rule for the specified object. Enable the this rule when you apply\\n        <code>ObjectLockConfiguration</code> to a bucket. Bucket settings require both a mode and a period.\\n      The period can be either <code>Days</code> or <code>Years</code> but you must select one. You cannot\\n      specify <code>Days</code> and <code>Years</code> at the same time.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>The container element for Object Lock configuration parameters.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#ObjectLockEnabled\": {\n      \"type\": \"enum\",\n      \"members\": {\n        \"Enabled\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"Enabled\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#ObjectLockEnabledForBucket\": {\n      \"type\": \"boolean\"\n    },\n    \"com.amazonaws.s3#ObjectLockLegalHold\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Status\": {\n          \"target\": \"com.amazonaws.s3#ObjectLockLegalHoldStatus\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Indicates whether the specified object has a legal hold in place.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>A legal hold configuration for an object.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#ObjectLockLegalHoldStatus\": {\n      \"type\": \"enum\",\n      \"members\": {\n        \"ON\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"ON\"\n          }\n        },\n        \"OFF\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"OFF\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#ObjectLockMode\": {\n      \"type\": \"enum\",\n      \"members\": {\n        \"GOVERNANCE\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"GOVERNANCE\"\n          }\n        },\n        \"COMPLIANCE\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"COMPLIANCE\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#ObjectLockRetainUntilDate\": {\n      \"type\": \"timestamp\",\n      \"traits\": {\n        \"smithy.api#timestampFormat\": \"date-time\"\n      }\n    },\n    \"com.amazonaws.s3#ObjectLockRetention\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Mode\": {\n          \"target\": \"com.amazonaws.s3#ObjectLockRetentionMode\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Indicates the Retention mode for the specified object.</p>\"\n          }\n        },\n        \"RetainUntilDate\": {\n          \"target\": \"com.amazonaws.s3#Date\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The date on which this Object Lock Retention will expire.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>A Retention configuration for an object.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#ObjectLockRetentionMode\": {\n      \"type\": \"enum\",\n      \"members\": {\n        \"GOVERNANCE\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"GOVERNANCE\"\n          }\n        },\n        \"COMPLIANCE\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"COMPLIANCE\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#ObjectLockRule\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"DefaultRetention\": {\n          \"target\": \"com.amazonaws.s3#DefaultRetention\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The default Object Lock retention mode and period that you want to apply to new objects placed in\\n      the specified bucket. Bucket settings require both a mode and a period. The period can be either\\n        <code>Days</code> or <code>Years</code> but you must select one. You cannot specify <code>Days</code>\\n      and <code>Years</code> at the same time.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>The container element for an Object Lock rule.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#ObjectLockToken\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#ObjectNotInActiveTierError\": {\n      \"type\": \"structure\",\n      \"members\": {},\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>The source object of the COPY action is not in the active tier and is only stored in Amazon S3\\n      Glacier.</p>\",\n        \"smithy.api#error\": \"client\",\n        \"smithy.api#httpError\": 403\n      }\n    },\n    \"com.amazonaws.s3#ObjectOwnership\": {\n      \"type\": \"enum\",\n      \"members\": {\n        \"BucketOwnerPreferred\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"BucketOwnerPreferred\"\n          }\n        },\n        \"ObjectWriter\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"ObjectWriter\"\n          }\n        },\n        \"BucketOwnerEnforced\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"BucketOwnerEnforced\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>The container element for object ownership for a bucket's ownership controls.</p>\\n         <p>\\n            <code>BucketOwnerPreferred</code> - Objects uploaded to the bucket change ownership to the bucket\\n      owner if the objects are uploaded with the <code>bucket-owner-full-control</code> canned ACL.</p>\\n         <p>\\n            <code>ObjectWriter</code> - The uploading account will own the object if the object is uploaded with\\n      the <code>bucket-owner-full-control</code> canned ACL.</p>\\n         <p>\\n            <code>BucketOwnerEnforced</code> - Access control lists (ACLs) are disabled and no longer affect\\n      permissions. The bucket owner automatically owns and has full control over every object in the bucket.\\n      The bucket only accepts PUT requests that don't specify an ACL or specify bucket owner full control ACLs\\n      (such as the predefined <code>bucket-owner-full-control</code> canned ACL or a custom ACL in XML format\\n      that grants the same permissions).</p>\\n         <p>By default, <code>ObjectOwnership</code> is set to <code>BucketOwnerEnforced</code> and ACLs are\\n      disabled. We recommend keeping ACLs disabled, except in uncommon use cases where you must control access\\n      for each object individually. For more information about S3 Object Ownership, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/about-object-ownership.html\\\">Controlling\\n        ownership of objects and disabling ACLs for your bucket</a> in the\\n        <i>Amazon S3 User Guide</i>. </p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets. Directory buckets use the bucket owner enforced setting for S3 Object Ownership.</p>\\n         </note>\"\n      }\n    },\n    \"com.amazonaws.s3#ObjectPart\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"PartNumber\": {\n          \"target\": \"com.amazonaws.s3#PartNumber\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The part number identifying the part. This value is a positive integer between 1 and 10,000.</p>\"\n          }\n        },\n        \"Size\": {\n          \"target\": \"com.amazonaws.s3#Size\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The size of the uploaded part in bytes.</p>\"\n          }\n        },\n        \"ChecksumCRC32\": {\n          \"target\": \"com.amazonaws.s3#ChecksumCRC32\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Base64 encoded, 32-bit <code>CRC32</code> checksum of the part. This checksum is present if the\\n      multipart upload request was created with the <code>CRC32</code> checksum algorithm. For more\\n      information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking object integrity</a> in\\n      the <i>Amazon S3 User Guide</i>.</p>\"\n          }\n        },\n        \"ChecksumCRC32C\": {\n          \"target\": \"com.amazonaws.s3#ChecksumCRC32C\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Base64 encoded, 32-bit <code>CRC32C</code> checksum of the part. This checksum is present if the\\n      multipart upload request was created with the <code>CRC32C</code> checksum algorithm. For more\\n      information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking object integrity</a> in\\n      the <i>Amazon S3 User Guide</i>.</p>\"\n          }\n        },\n        \"ChecksumCRC64NVME\": {\n          \"target\": \"com.amazonaws.s3#ChecksumCRC64NVME\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Base64 encoded, 64-bit <code>CRC64NVME</code> checksum of the part. This checksum is present if\\n      the multipart upload request was created with the <code>CRC64NVME</code> checksum algorithm, or if the\\n      object was uploaded without a checksum (and Amazon S3 added the default checksum, <code>CRC64NVME</code>, to\\n      the uploaded object). For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking object integrity</a> in\\n      the <i>Amazon S3 User Guide</i>.</p>\"\n          }\n        },\n        \"ChecksumSHA1\": {\n          \"target\": \"com.amazonaws.s3#ChecksumSHA1\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Base64 encoded, 160-bit <code>SHA1</code> checksum of the part. This checksum is present if the\\n      multipart upload request was created with the <code>SHA1</code> checksum algorithm. For more\\n      information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking object integrity</a> in\\n      the <i>Amazon S3 User Guide</i>.</p>\"\n          }\n        },\n        \"ChecksumSHA256\": {\n          \"target\": \"com.amazonaws.s3#ChecksumSHA256\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Base64 encoded, 256-bit <code>SHA256</code> checksum of the part. This checksum is present if\\n      the multipart upload request was created with the <code>SHA256</code> checksum algorithm. For more\\n      information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking object integrity</a> in\\n      the <i>Amazon S3 User Guide</i>.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>A container for elements related to an individual part.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#ObjectSize\": {\n      \"type\": \"long\"\n    },\n    \"com.amazonaws.s3#ObjectSizeGreaterThanBytes\": {\n      \"type\": \"long\"\n    },\n    \"com.amazonaws.s3#ObjectSizeLessThanBytes\": {\n      \"type\": \"long\"\n    },\n    \"com.amazonaws.s3#ObjectStorageClass\": {\n      \"type\": \"enum\",\n      \"members\": {\n        \"STANDARD\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"STANDARD\"\n          }\n        },\n        \"REDUCED_REDUNDANCY\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"REDUCED_REDUNDANCY\"\n          }\n        },\n        \"GLACIER\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"GLACIER\"\n          }\n        },\n        \"STANDARD_IA\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"STANDARD_IA\"\n          }\n        },\n        \"ONEZONE_IA\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"ONEZONE_IA\"\n          }\n        },\n        \"INTELLIGENT_TIERING\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"INTELLIGENT_TIERING\"\n          }\n        },\n        \"DEEP_ARCHIVE\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"DEEP_ARCHIVE\"\n          }\n        },\n        \"OUTPOSTS\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"OUTPOSTS\"\n          }\n        },\n        \"GLACIER_IR\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"GLACIER_IR\"\n          }\n        },\n        \"SNOW\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"SNOW\"\n          }\n        },\n        \"EXPRESS_ONEZONE\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"EXPRESS_ONEZONE\"\n          }\n        },\n        \"FSX_OPENZFS\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"FSX_OPENZFS\"\n          }\n        },\n        \"FSX_ONTAP\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"FSX_ONTAP\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#ObjectVersion\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"ETag\": {\n          \"target\": \"com.amazonaws.s3#ETag\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The entity tag is an MD5 hash of that version of the object.</p>\"\n          }\n        },\n        \"ChecksumAlgorithm\": {\n          \"target\": \"com.amazonaws.s3#ChecksumAlgorithmList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The algorithm that was used to create a checksum of the object.</p>\",\n            \"smithy.api#xmlFlattened\": {}\n          }\n        },\n        \"ChecksumType\": {\n          \"target\": \"com.amazonaws.s3#ChecksumType\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The checksum type that is used to calculate the object’s checksum value. For more information, see\\n        <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking\\n        object integrity</a> in the <i>Amazon S3 User Guide</i>.</p>\"\n          }\n        },\n        \"Size\": {\n          \"target\": \"com.amazonaws.s3#Size\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Size in bytes of the object.</p>\"\n          }\n        },\n        \"StorageClass\": {\n          \"target\": \"com.amazonaws.s3#ObjectVersionStorageClass\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The class of storage used to store the object.</p>\"\n          }\n        },\n        \"Key\": {\n          \"target\": \"com.amazonaws.s3#ObjectKey\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The object key.</p>\"\n          }\n        },\n        \"VersionId\": {\n          \"target\": \"com.amazonaws.s3#ObjectVersionId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Version ID of an object.</p>\"\n          }\n        },\n        \"IsLatest\": {\n          \"target\": \"com.amazonaws.s3#IsLatest\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies whether the object is (true) or is not (false) the latest version of an object.</p>\"\n          }\n        },\n        \"LastModified\": {\n          \"target\": \"com.amazonaws.s3#LastModified\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Date and time when the object was last modified.</p>\"\n          }\n        },\n        \"Owner\": {\n          \"target\": \"com.amazonaws.s3#Owner\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the owner of the object.</p>\"\n          }\n        },\n        \"RestoreStatus\": {\n          \"target\": \"com.amazonaws.s3#RestoreStatus\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the restoration status of an object. Objects in certain storage classes must be restored\\n      before they can be retrieved. For more information about these storage classes and how to work with\\n      archived objects, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/archived-objects.html\\\">\\n        Working with archived objects</a> in the <i>Amazon S3 User Guide</i>.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>The version of an object.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#ObjectVersionId\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#ObjectVersionList\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.s3#ObjectVersion\"\n      }\n    },\n    \"com.amazonaws.s3#ObjectVersionStorageClass\": {\n      \"type\": \"enum\",\n      \"members\": {\n        \"STANDARD\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"STANDARD\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#OptionalObjectAttributes\": {\n      \"type\": \"enum\",\n      \"members\": {\n        \"RESTORE_STATUS\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"RestoreStatus\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#OptionalObjectAttributesList\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.s3#OptionalObjectAttributes\"\n      }\n    },\n    \"com.amazonaws.s3#OutputLocation\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"S3\": {\n          \"target\": \"com.amazonaws.s3#S3Location\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Describes an S3 location that will receive the results of the restore request.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Describes the location where the restore job's output is stored.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#OutputSerialization\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"CSV\": {\n          \"target\": \"com.amazonaws.s3#CSVOutput\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Describes the serialization of CSV-encoded Select results.</p>\"\n          }\n        },\n        \"JSON\": {\n          \"target\": \"com.amazonaws.s3#JSONOutput\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies JSON as request's output serialization format.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Describes how results of the Select job are serialized.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#Owner\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"DisplayName\": {\n          \"target\": \"com.amazonaws.s3#DisplayName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p></p>\"\n          }\n        },\n        \"ID\": {\n          \"target\": \"com.amazonaws.s3#ID\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Container for the ID of the owner.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Container for the owner's display name and ID.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#OwnerOverride\": {\n      \"type\": \"enum\",\n      \"members\": {\n        \"Destination\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"Destination\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#OwnershipControls\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Rules\": {\n          \"target\": \"com.amazonaws.s3#OwnershipControlsRules\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The container element for an ownership control rule.</p>\",\n            \"smithy.api#required\": {},\n            \"smithy.api#xmlFlattened\": {},\n            \"smithy.api#xmlName\": \"Rule\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>The container element for a bucket's ownership controls.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#OwnershipControlsRule\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"ObjectOwnership\": {\n          \"target\": \"com.amazonaws.s3#ObjectOwnership\",\n          \"traits\": {\n            \"smithy.api#required\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>The container element for an ownership control rule.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#OwnershipControlsRules\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.s3#OwnershipControlsRule\"\n      }\n    },\n    \"com.amazonaws.s3#ParquetInput\": {\n      \"type\": \"structure\",\n      \"members\": {},\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Container for Parquet.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#Part\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"PartNumber\": {\n          \"target\": \"com.amazonaws.s3#PartNumber\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Part number identifying the part. This is a positive integer between 1 and 10,000.</p>\"\n          }\n        },\n        \"LastModified\": {\n          \"target\": \"com.amazonaws.s3#LastModified\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Date and time at which the part was uploaded.</p>\"\n          }\n        },\n        \"ETag\": {\n          \"target\": \"com.amazonaws.s3#ETag\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Entity tag returned when the part was uploaded.</p>\"\n          }\n        },\n        \"Size\": {\n          \"target\": \"com.amazonaws.s3#Size\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Size in bytes of the uploaded part data.</p>\"\n          }\n        },\n        \"ChecksumCRC32\": {\n          \"target\": \"com.amazonaws.s3#ChecksumCRC32\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Base64 encoded, 32-bit <code>CRC32</code> checksum of the part. This checksum is present if the\\n      object was uploaded with the <code>CRC32</code> checksum algorithm. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking object\\n        integrity</a> in the <i>Amazon S3 User Guide</i>.</p>\"\n          }\n        },\n        \"ChecksumCRC32C\": {\n          \"target\": \"com.amazonaws.s3#ChecksumCRC32C\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Base64 encoded, 32-bit <code>CRC32C</code> checksum of the part. This checksum is present if the\\n      object was uploaded with the <code>CRC32C</code> checksum algorithm. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking object\\n        integrity</a> in the <i>Amazon S3 User Guide</i>.</p>\"\n          }\n        },\n        \"ChecksumCRC64NVME\": {\n          \"target\": \"com.amazonaws.s3#ChecksumCRC64NVME\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Base64 encoded, 64-bit <code>CRC64NVME</code> checksum of the part. This checksum is present if\\n      the multipart upload request was created with the <code>CRC64NVME</code> checksum algorithm, or if the\\n      object was uploaded without a checksum (and Amazon S3 added the default checksum, <code>CRC64NVME</code>, to\\n      the uploaded object). For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking object integrity</a> in\\n      the <i>Amazon S3 User Guide</i>.</p>\"\n          }\n        },\n        \"ChecksumSHA1\": {\n          \"target\": \"com.amazonaws.s3#ChecksumSHA1\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Base64 encoded, 160-bit <code>SHA1</code> checksum of the part. This checksum is present if the\\n      object was uploaded with the <code>SHA1</code> checksum algorithm. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking object\\n        integrity</a> in the <i>Amazon S3 User Guide</i>.</p>\"\n          }\n        },\n        \"ChecksumSHA256\": {\n          \"target\": \"com.amazonaws.s3#ChecksumSHA256\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Base64 encoded, 256-bit <code>SHA256</code> checksum of the part. This checksum is present if\\n      the object was uploaded with the <code>SHA256</code> checksum algorithm. For more information, see\\n        <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking\\n        object integrity</a> in the <i>Amazon S3 User Guide</i>.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Container for elements related to a part.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#PartNumber\": {\n      \"type\": \"integer\"\n    },\n    \"com.amazonaws.s3#PartNumberMarker\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#PartitionDateSource\": {\n      \"type\": \"enum\",\n      \"members\": {\n        \"EventTime\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"EventTime\"\n          }\n        },\n        \"DeliveryTime\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"DeliveryTime\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#PartitionedPrefix\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"PartitionDateSource\": {\n          \"target\": \"com.amazonaws.s3#PartitionDateSource\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the partition date source for the partitioned prefix. <code>PartitionDateSource</code> can\\n      be <code>EventTime</code> or <code>DeliveryTime</code>.</p>\\n         <p>For <code>DeliveryTime</code>, the time in the log file names corresponds to the delivery time for\\n      the log files. </p>\\n         <p> For <code>EventTime</code>, The logs delivered are for a specific day only. The year, month, and\\n      day correspond to the day on which the event occurred, and the hour, minutes and seconds are set to 00\\n      in the key.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Amazon S3 keys for log objects are partitioned in the following format:</p>\\n         <p>\\n            <code>[DestinationPrefix][SourceAccountId]/[SourceRegion]/[SourceBucket]/[YYYY]/[MM]/[DD]/[YYYY]-[MM]-[DD]-[hh]-[mm]-[ss]-[UniqueString]</code>\\n         </p>\\n         <p>PartitionedPrefix defaults to EventTime delivery when server access logs are delivered.</p>\",\n        \"smithy.api#xmlName\": \"PartitionedPrefix\"\n      }\n    },\n    \"com.amazonaws.s3#Parts\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.s3#Part\"\n      }\n    },\n    \"com.amazonaws.s3#PartsCount\": {\n      \"type\": \"integer\"\n    },\n    \"com.amazonaws.s3#PartsList\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.s3#ObjectPart\"\n      }\n    },\n    \"com.amazonaws.s3#Payer\": {\n      \"type\": \"enum\",\n      \"members\": {\n        \"Requester\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"Requester\"\n          }\n        },\n        \"BucketOwner\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"BucketOwner\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#Permission\": {\n      \"type\": \"enum\",\n      \"members\": {\n        \"FULL_CONTROL\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"FULL_CONTROL\"\n          }\n        },\n        \"WRITE\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"WRITE\"\n          }\n        },\n        \"WRITE_ACP\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"WRITE_ACP\"\n          }\n        },\n        \"READ\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"READ\"\n          }\n        },\n        \"READ_ACP\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"READ_ACP\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#Policy\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#PolicyStatus\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"IsPublic\": {\n          \"target\": \"com.amazonaws.s3#IsPublic\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The policy status for this bucket. <code>TRUE</code> indicates that this bucket is public.\\n        <code>FALSE</code> indicates that the bucket is not public.</p>\",\n            \"smithy.api#xmlName\": \"IsPublic\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>The container element for a bucket's policy status.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#Prefix\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#Priority\": {\n      \"type\": \"integer\"\n    },\n    \"com.amazonaws.s3#Progress\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"BytesScanned\": {\n          \"target\": \"com.amazonaws.s3#BytesScanned\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The current number of object bytes scanned.</p>\"\n          }\n        },\n        \"BytesProcessed\": {\n          \"target\": \"com.amazonaws.s3#BytesProcessed\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The current number of uncompressed object bytes processed.</p>\"\n          }\n        },\n        \"BytesReturned\": {\n          \"target\": \"com.amazonaws.s3#BytesReturned\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The current number of bytes of records payload data returned.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>This data type contains information about progress of an operation.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#ProgressEvent\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Details\": {\n          \"target\": \"com.amazonaws.s3#Progress\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Progress event details.</p>\",\n            \"smithy.api#eventPayload\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>This data type contains information about the progress event of an operation.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#Protocol\": {\n      \"type\": \"enum\",\n      \"members\": {\n        \"http\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"http\"\n          }\n        },\n        \"https\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"https\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#PublicAccessBlockConfiguration\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"BlockPublicAcls\": {\n          \"target\": \"com.amazonaws.s3#Setting\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies whether Amazon S3 should block public access control lists (ACLs) for this bucket and objects\\n      in this bucket. Setting this element to <code>TRUE</code> causes the following behavior:</p>\\n         <ul>\\n            <li>\\n               <p>PUT Bucket ACL and PUT Object ACL calls fail if the specified ACL is public.</p>\\n            </li>\\n            <li>\\n               <p>PUT Object calls fail if the request includes a public ACL.</p>\\n            </li>\\n            <li>\\n               <p>PUT Bucket calls fail if the request includes a public ACL.</p>\\n            </li>\\n         </ul>\\n         <p>Enabling this setting doesn't affect existing policies or ACLs.</p>\",\n            \"smithy.api#xmlName\": \"BlockPublicAcls\"\n          }\n        },\n        \"IgnorePublicAcls\": {\n          \"target\": \"com.amazonaws.s3#Setting\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies whether Amazon S3 should ignore public ACLs for this bucket and objects in this bucket. Setting\\n      this element to <code>TRUE</code> causes Amazon S3 to ignore all public ACLs on this bucket and objects in\\n      this bucket.</p>\\n         <p>Enabling this setting doesn't affect the persistence of any existing ACLs and doesn't prevent new\\n      public ACLs from being set.</p>\",\n            \"smithy.api#xmlName\": \"IgnorePublicAcls\"\n          }\n        },\n        \"BlockPublicPolicy\": {\n          \"target\": \"com.amazonaws.s3#Setting\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies whether Amazon S3 should block public bucket policies for this bucket. Setting this element to\\n        <code>TRUE</code> causes Amazon S3 to reject calls to PUT Bucket policy if the specified bucket policy\\n      allows public access. </p>\\n         <p>Enabling this setting doesn't affect existing bucket policies.</p>\",\n            \"smithy.api#xmlName\": \"BlockPublicPolicy\"\n          }\n        },\n        \"RestrictPublicBuckets\": {\n          \"target\": \"com.amazonaws.s3#Setting\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies whether Amazon S3 should restrict public bucket policies for this bucket. Setting this element\\n      to <code>TRUE</code> restricts access to this bucket to only Amazon Web Services service principals and\\n      authorized users within this account if the bucket has a public policy.</p>\\n         <p>Enabling this setting doesn't affect previously stored bucket policies, except that public and\\n      cross-account access within any public bucket policy, including non-public delegation to specific\\n      accounts, is blocked.</p>\",\n            \"smithy.api#xmlName\": \"RestrictPublicBuckets\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>The PublicAccessBlock configuration that you want to apply to this Amazon S3 bucket. You can\\n      enable the configuration options in any combination. Bucket-level settings work alongside\\n      account-level settings (which may inherit from organization-level policies). For more\\n      information about when Amazon S3 considers a bucket or object public, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/access-control-block-public-access.html#access-control-block-public-access-policy-status\\\">The Meaning of \\\"Public\\\"</a> in the <i>Amazon S3 User Guide</i>. </p>\"\n      }\n    },\n    \"com.amazonaws.s3#PutBucketAbac\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#PutBucketAbacRequest\"\n      },\n      \"output\": {\n        \"target\": \"smithy.api#Unit\"\n      },\n      \"traits\": {\n        \"aws.protocols#httpChecksum\": {\n          \"requestAlgorithmMember\": \"ChecksumAlgorithm\"\n        },\n        \"smithy.api#documentation\": \"<p>Sets the attribute-based access control (ABAC) property of the general purpose bucket. You must have <code>s3:PutBucketABAC</code> permission to perform this action. When you enable ABAC, you can use tags for access control on your buckets. Additionally, when ABAC is enabled, you must use the <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_TagResource.html\\\">TagResource</a> and <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_UntagResource.html\\\">UntagResource</a> actions to manage tags on your buckets. You can nolonger use the <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketTagging.html\\\">PutBucketTagging</a> and <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketTagging.html\\\">DeleteBucketTagging</a> actions to tag your bucket. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/buckets-tagging-enable-abac.html\\\">Enabling ABAC in general purpose buckets</a>. </p>\",\n        \"smithy.api#http\": {\n          \"method\": \"PUT\",\n          \"uri\": \"/{Bucket}?abac\",\n          \"code\": 200\n        }\n      }\n    },\n    \"com.amazonaws.s3#PutBucketAbacRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the general purpose bucket.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"ContentMD5\": {\n          \"target\": \"com.amazonaws.s3#ContentMD5\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The MD5 hash of the <code>PutBucketAbac</code> request body. </p>\\n         <p>For requests made using the Amazon Web Services Command Line Interface (CLI) or Amazon Web Services SDKs, this field is calculated automatically.</p>\",\n            \"smithy.api#httpHeader\": \"Content-MD5\"\n          }\n        },\n        \"ChecksumAlgorithm\": {\n          \"target\": \"com.amazonaws.s3#ChecksumAlgorithm\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Indicates the algorithm that you want Amazon S3 to use to create the checksum. For more\\n         information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\"> Checking object integrity</a> in the <i>Amazon S3 User Guide</i>.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-sdk-checksum-algorithm\"\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID of the general purpose bucket's owner. </p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        },\n        \"AbacStatus\": {\n          \"target\": \"com.amazonaws.s3#AbacStatus\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The ABAC status of the general purpose bucket. When ABAC is enabled for the general purpose bucket, you can use tags to manage access to the general purpose buckets as well as for cost tracking purposes. When ABAC is disabled for the general purpose buckets, you can only use tags for cost tracking purposes. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/buckets-tagging.html\\\">Using tags with S3 general purpose buckets</a>. </p>\",\n            \"smithy.api#httpPayload\": {},\n            \"smithy.api#required\": {},\n            \"smithy.api#xmlName\": \"AbacStatus\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#PutBucketAccelerateConfiguration\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#PutBucketAccelerateConfigurationRequest\"\n      },\n      \"output\": {\n        \"target\": \"smithy.api#Unit\"\n      },\n      \"traits\": {\n        \"aws.protocols#httpChecksum\": {\n          \"requestAlgorithmMember\": \"ChecksumAlgorithm\"\n        },\n        \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported for directory buckets.</p>\\n         </note>\\n         <p>Sets the accelerate configuration of an existing bucket. Amazon S3 Transfer Acceleration is a\\n      bucket-level feature that enables you to perform faster data transfers to Amazon S3.</p>\\n         <p> To use this operation, you must have permission to perform the\\n        <code>s3:PutAccelerateConfiguration</code> action. The bucket owner has this permission by default.\\n      The bucket owner can grant this permission to others. For more information about permissions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-with-s3-actions.html#using-with-s3-actions-related-to-bucket-subresources\\\">Permissions Related to Bucket Subresource Operations</a> and <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html\\\">Managing Access Permissions to Your Amazon S3\\n        Resources</a>.</p>\\n         <p> The Transfer Acceleration state of a bucket can be set to one of the following two values:</p>\\n         <ul>\\n            <li>\\n               <p> Enabled – Enables accelerated data transfers to the bucket.</p>\\n            </li>\\n            <li>\\n               <p> Suspended – Disables accelerated data transfers to the bucket.</p>\\n            </li>\\n         </ul>\\n         <p>The <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketAccelerateConfiguration.html\\\">GetBucketAccelerateConfiguration</a> action returns the transfer acceleration state of a\\n      bucket.</p>\\n         <p>After setting the Transfer Acceleration state of a bucket to Enabled, it might take up to thirty\\n      minutes before the data transfer rates to the bucket increase.</p>\\n         <p> The name of the bucket used for Transfer Acceleration must be DNS-compliant and must not contain\\n      periods (\\\".\\\").</p>\\n         <p> For more information about transfer acceleration, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/transfer-acceleration.html\\\">Transfer Acceleration</a>.</p>\\n         <p>The following operations are related to <code>PutBucketAccelerateConfiguration</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketAccelerateConfiguration.html\\\">GetBucketAccelerateConfiguration</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateBucket.html\\\">CreateBucket</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#http\": {\n          \"method\": \"PUT\",\n          \"uri\": \"/{Bucket}?accelerate\",\n          \"code\": 200\n        },\n        \"smithy.rules#staticContextParams\": {\n          \"UseS3ExpressControlEndpoint\": {\n            \"value\": true\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#PutBucketAccelerateConfigurationRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the bucket for which the accelerate configuration is set.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"AccelerateConfiguration\": {\n          \"target\": \"com.amazonaws.s3#AccelerateConfiguration\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Container for setting the transfer acceleration state.</p>\",\n            \"smithy.api#httpPayload\": {},\n            \"smithy.api#required\": {},\n            \"smithy.api#xmlName\": \"AccelerateConfiguration\"\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        },\n        \"ChecksumAlgorithm\": {\n          \"target\": \"com.amazonaws.s3#ChecksumAlgorithm\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Indicates the algorithm used to create the checksum for the request when you use the SDK. This header will not provide any\\n    additional functionality if you don't use the SDK. When you send this header, there must be a corresponding <code>x-amz-checksum</code> or\\n    <code>x-amz-trailer</code> header sent. Otherwise, Amazon S3 fails the request with the HTTP status code <code>400 Bad Request</code>. For more\\n    information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking object integrity</a> in\\n    the <i>Amazon S3 User Guide</i>.</p>\\n         <p>If you provide an individual checksum, Amazon S3 ignores any provided <code>ChecksumAlgorithm</code>\\n      parameter.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-sdk-checksum-algorithm\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#PutBucketAcl\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#PutBucketAclRequest\"\n      },\n      \"output\": {\n        \"target\": \"smithy.api#Unit\"\n      },\n      \"traits\": {\n        \"aws.protocols#httpChecksum\": {\n          \"requestAlgorithmMember\": \"ChecksumAlgorithm\",\n          \"requestChecksumRequired\": true\n        },\n        \"smithy.api#documentation\": \"<important>\\n            <p>End of support notice: As of October 1, 2025, Amazon S3 has discontinued support for Email Grantee Access Control Lists (ACLs). If you attempt to use an Email Grantee ACL in a request after October 1, 2025, \\n the request will receive an <code>HTTP 405</code> (Method Not Allowed) error.</p>\\n            <p>This change affects the following Amazon Web Services Regions: US East (N. Virginia), US West (N. California), US West (Oregon), Asia Pacific (Singapore), Asia Pacific (Sydney), Asia Pacific (Tokyo), Europe (Ireland), and South America (São Paulo).</p>\\n         </important>\\n         <note>\\n            <p>This operation is not supported for directory buckets.</p>\\n         </note>\\n         <p>Sets the permissions on an existing bucket using access control lists (ACL). For more information,\\n      see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/S3_ACLs_UsingACLs.html\\\">Using ACLs</a>. To\\n      set the ACL of a bucket, you must have the <code>WRITE_ACP</code> permission.</p>\\n         <p>You can use one of the following two ways to set a bucket's permissions:</p>\\n         <ul>\\n            <li>\\n               <p>Specify the ACL in the request body</p>\\n            </li>\\n            <li>\\n               <p>Specify permissions using request headers</p>\\n            </li>\\n         </ul>\\n         <note>\\n            <p>You cannot specify access permission using both the body and the request headers.</p>\\n         </note>\\n         <p>Depending on your application needs, you may choose to set the ACL on a bucket using either the\\n      request body or the headers. For example, if you have an existing application that updates a bucket ACL\\n      using the request body, then you can continue to use that approach.</p>\\n         <important>\\n            <p>If your bucket uses the bucket owner enforced setting for S3 Object Ownership, ACLs are disabled\\n        and no longer affect permissions. You must use policies to grant access to your bucket and the objects\\n        in it. Requests to set ACLs or update ACLs fail and return the\\n          <code>AccessControlListNotSupported</code> error code. Requests to read ACLs are still supported.\\n        For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/about-object-ownership.html\\\">Controlling object ownership</a> in\\n        the <i>Amazon S3 User Guide</i>.</p>\\n         </important>\\n         <dl>\\n            <dt>Permissions</dt>\\n            <dd>\\n               <p>You can set access permissions by using one of the following methods:</p>\\n               <ul>\\n                  <li>\\n                     <p>Specify a canned ACL with the <code>x-amz-acl</code> request header. Amazon S3 supports a set\\n                of predefined ACLs, known as <i>canned ACLs</i>. Each canned ACL has a\\n                predefined set of grantees and permissions. Specify the canned ACL name as the value of\\n                  <code>x-amz-acl</code>. If you use this header, you cannot use other access control-specific\\n                headers in your request. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html#CannedACL\\\">Canned ACL</a>.</p>\\n                  </li>\\n                  <li>\\n                     <p>Specify access permissions explicitly with the <code>x-amz-grant-read</code>,\\n                  <code>x-amz-grant-read-acp</code>, <code>x-amz-grant-write-acp</code>, and\\n                  <code>x-amz-grant-full-control</code> headers. When using these headers, you specify\\n                explicit access permissions and grantees (Amazon Web Services accounts or Amazon S3 groups) who will receive the\\n                permission. If you use these ACL-specific headers, you cannot use the <code>x-amz-acl</code>\\n                header to set a canned ACL. These parameters map to the set of permissions that Amazon S3 supports\\n                in an ACL. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html\\\">Access Control List (ACL)\\n                Overview</a>.</p>\\n                     <p>You specify each grantee as a type=value pair, where the type is one of the\\n                following:</p>\\n                     <ul>\\n                        <li>\\n                           <p>\\n                              <code>id</code> – if the value specified is the canonical user ID of an\\n                    Amazon Web Services account</p>\\n                        </li>\\n                        <li>\\n                           <p>\\n                              <code>uri</code> – if you are granting permissions to a predefined group</p>\\n                        </li>\\n                        <li>\\n                           <p>\\n                              <code>emailAddress</code> – if the value specified is the email address of an\\n                    Amazon Web Services account</p>\\n                           <note>\\n                              <p>Using email addresses to specify a grantee is only supported in the following Amazon Web Services Regions: </p>\\n                              <ul>\\n                                 <li>\\n                                    <p>US East (N. Virginia)</p>\\n                                 </li>\\n                                 <li>\\n                                    <p>US West (N. California)</p>\\n                                 </li>\\n                                 <li>\\n                                    <p> US West (Oregon)</p>\\n                                 </li>\\n                                 <li>\\n                                    <p> Asia Pacific (Singapore)</p>\\n                                 </li>\\n                                 <li>\\n                                    <p>Asia Pacific (Sydney)</p>\\n                                 </li>\\n                                 <li>\\n                                    <p>Asia Pacific (Tokyo)</p>\\n                                 </li>\\n                                 <li>\\n                                    <p>Europe (Ireland)</p>\\n                                 </li>\\n                                 <li>\\n                                    <p>South America (São Paulo)</p>\\n                                 </li>\\n                              </ul>\\n                              <p>For a list of all the Amazon S3 supported Regions and endpoints, see <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region\\\">Regions and Endpoints</a> in the Amazon Web Services General Reference.</p>\\n                           </note>\\n                        </li>\\n                     </ul>\\n                     <p>For example, the following <code>x-amz-grant-write</code> header grants create, overwrite,\\n                and delete objects permission to LogDelivery group predefined by Amazon S3 and two Amazon Web Services accounts\\n                identified by their email addresses.</p>\\n                     <p>\\n                        <code>x-amz-grant-write: uri=\\\"http://acs.amazonaws.com/groups/s3/LogDelivery\\\",\\n                  id=\\\"111122223333\\\", id=\\\"555566667777\\\" </code>\\n                     </p>\\n                  </li>\\n               </ul>\\n               <p>You can use either a canned ACL or specify access permissions explicitly. You cannot do\\n            both.</p>\\n            </dd>\\n            <dt>Grantee Values</dt>\\n            <dd>\\n               <p>You can specify the person (grantee) to whom you're assigning access rights (using request\\n            elements) in the following ways. For examples of how to specify these grantee values in JSON\\n            format, see the Amazon Web Services CLI example in <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/enable-server-access-logging.html\\\"> Enabling Amazon S3 server\\n              access logging</a> in the <i>Amazon S3 User Guide</i>.</p>\\n               <ul>\\n                  <li>\\n                     <p>By the person's ID:</p>\\n                     <p>\\n                        <code><Grantee xmlns:xsi=\\\"http://www.w3.org/2001/XMLSchema-instance\\\"\\n                  xsi:type=\\\"CanonicalUser\\\"><ID><>ID<></ID><DisplayName><>GranteesEmail<></DisplayName>\\n                  </Grantee></code>\\n                     </p>\\n                     <p>DisplayName is optional and ignored in the request</p>\\n                  </li>\\n                  <li>\\n                     <p>By URI:</p>\\n                     <p>\\n                        <code><Grantee xmlns:xsi=\\\"http://www.w3.org/2001/XMLSchema-instance\\\"\\n                  xsi:type=\\\"Group\\\"><URI><>http://acs.amazonaws.com/groups/global/AuthenticatedUsers<></URI></Grantee></code>\\n                     </p>\\n                  </li>\\n                  <li>\\n                     <p>By Email address:</p>\\n                     <p>\\n                        <code><Grantee xmlns:xsi=\\\"http://www.w3.org/2001/XMLSchema-instance\\\"\\n                  xsi:type=\\\"AmazonCustomerByEmail\\\"><EmailAddress><>Grantees@email.com<></EmailAddress>&</Grantee></code>\\n                     </p>\\n                     <p>The grantee is resolved to the CanonicalUser and, in a response to a GET Object acl\\n                request, appears as the CanonicalUser. </p>\\n                     <note>\\n                        <p>Using email addresses to specify a grantee is only supported in the following Amazon Web Services Regions: </p>\\n                        <ul>\\n                           <li>\\n                              <p>US East (N. Virginia)</p>\\n                           </li>\\n                           <li>\\n                              <p>US West (N. California)</p>\\n                           </li>\\n                           <li>\\n                              <p> US West (Oregon)</p>\\n                           </li>\\n                           <li>\\n                              <p> Asia Pacific (Singapore)</p>\\n                           </li>\\n                           <li>\\n                              <p>Asia Pacific (Sydney)</p>\\n                           </li>\\n                           <li>\\n                              <p>Asia Pacific (Tokyo)</p>\\n                           </li>\\n                           <li>\\n                              <p>Europe (Ireland)</p>\\n                           </li>\\n                           <li>\\n                              <p>South America (São Paulo)</p>\\n                           </li>\\n                        </ul>\\n                        <p>For a list of all the Amazon S3 supported Regions and endpoints, see <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region\\\">Regions and Endpoints</a> in the Amazon Web Services General Reference.</p>\\n                     </note>\\n                  </li>\\n               </ul>\\n            </dd>\\n         </dl>\\n         <p>The following operations are related to <code>PutBucketAcl</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateBucket.html\\\">CreateBucket</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucket.html\\\">DeleteBucket</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObjectAcl.html\\\">GetObjectAcl</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#examples\": [\n          {\n            \"title\": \"Put bucket acl\",\n            \"documentation\": \"The following example replaces existing ACL on a bucket. The ACL grants the bucket owner (specified using the owner ID) and write permission to the LogDelivery group. Because this is a replace operation, you must specify all the grants in your request. To incrementally add or remove ACL grants, you might use the console.\",\n            \"input\": {\n              \"Bucket\": \"examplebucket\",\n              \"GrantFullControl\": \"id=examplee7a2f25102679df27bb0ae12b3f85be6f290b936c4393484\",\n              \"GrantWrite\": \"uri=http://acs.amazonaws.com/groups/s3/LogDelivery\"\n            }\n          }\n        ],\n        \"smithy.api#http\": {\n          \"method\": \"PUT\",\n          \"uri\": \"/{Bucket}?acl\",\n          \"code\": 200\n        },\n        \"smithy.rules#staticContextParams\": {\n          \"UseS3ExpressControlEndpoint\": {\n            \"value\": true\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#PutBucketAclRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"ACL\": {\n          \"target\": \"com.amazonaws.s3#BucketCannedACL\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The canned ACL to apply to the bucket.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-acl\"\n          }\n        },\n        \"AccessControlPolicy\": {\n          \"target\": \"com.amazonaws.s3#AccessControlPolicy\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Contains the elements that set the ACL permissions for an object per grantee.</p>\",\n            \"smithy.api#httpPayload\": {},\n            \"smithy.api#xmlName\": \"AccessControlPolicy\"\n          }\n        },\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The bucket to which to apply the ACL.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"ContentMD5\": {\n          \"target\": \"com.amazonaws.s3#ContentMD5\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Base64 encoded 128-bit <code>MD5</code> digest of the data. This header must be used as a\\n      message integrity check to verify that the request body was not corrupted in transit. For more\\n      information, go to <a href=\\\"http://www.ietf.org/rfc/rfc1864.txt\\\">RFC 1864.</a>\\n         </p>\\n         <p>For requests made using the Amazon Web Services Command Line Interface (CLI) or Amazon Web Services SDKs, this field is calculated automatically.</p>\",\n            \"smithy.api#httpHeader\": \"Content-MD5\"\n          }\n        },\n        \"ChecksumAlgorithm\": {\n          \"target\": \"com.amazonaws.s3#ChecksumAlgorithm\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Indicates the algorithm used to create the checksum for the request when you use the SDK. This header will not provide any\\n    additional functionality if you don't use the SDK. When you send this header, there must be a corresponding <code>x-amz-checksum</code> or\\n    <code>x-amz-trailer</code> header sent. Otherwise, Amazon S3 fails the request with the HTTP status code <code>400 Bad Request</code>. For more\\n    information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking object integrity</a> in\\n    the <i>Amazon S3 User Guide</i>.</p>\\n         <p>If you provide an individual checksum, Amazon S3 ignores any provided <code>ChecksumAlgorithm</code>\\n      parameter.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-sdk-checksum-algorithm\"\n          }\n        },\n        \"GrantFullControl\": {\n          \"target\": \"com.amazonaws.s3#GrantFullControl\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Allows grantee the read, write, read ACP, and write ACP permissions on the bucket.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-grant-full-control\"\n          }\n        },\n        \"GrantRead\": {\n          \"target\": \"com.amazonaws.s3#GrantRead\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Allows grantee to list the objects in the bucket.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-grant-read\"\n          }\n        },\n        \"GrantReadACP\": {\n          \"target\": \"com.amazonaws.s3#GrantReadACP\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Allows grantee to read the bucket ACL.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-grant-read-acp\"\n          }\n        },\n        \"GrantWrite\": {\n          \"target\": \"com.amazonaws.s3#GrantWrite\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Allows grantee to create new objects in the bucket.</p>\\n         <p>For the bucket and object owners of existing objects, also allows deletions and overwrites of those\\n      objects.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-grant-write\"\n          }\n        },\n        \"GrantWriteACP\": {\n          \"target\": \"com.amazonaws.s3#GrantWriteACP\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Allows grantee to write the ACL for the applicable bucket.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-grant-write-acp\"\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#PutBucketAnalyticsConfiguration\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#PutBucketAnalyticsConfigurationRequest\"\n      },\n      \"output\": {\n        \"target\": \"smithy.api#Unit\"\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported for directory buckets.</p>\\n         </note>\\n         <p>Sets an analytics configuration for the bucket (specified by the analytics configuration ID). You\\n      can have up to 1,000 analytics configurations per bucket.</p>\\n         <p>You can choose to have storage class analysis export analysis reports sent to a comma-separated\\n      values (CSV) flat file. See the <code>DataExport</code> request element. Reports are updated daily and\\n      are based on the object filters that you configure. When selecting data export, you specify a\\n      destination bucket and an optional destination prefix where the file is written. You can export the data\\n      to a destination bucket in a different account. However, the destination bucket must be in the same\\n      Region as the bucket that you are making the PUT analytics configuration to. For more information, see\\n        <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/analytics-storage-class.html\\\">Amazon S3 Analytics –\\n        Storage Class Analysis</a>. </p>\\n         <important>\\n            <p>You must create a bucket policy on the destination bucket where the exported file is written to\\n        grant permissions to Amazon S3 to write objects to the bucket. For an example policy, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/example-bucket-policies.html#example-bucket-policies-use-case-9\\\">Granting\\n          Permissions for Amazon S3 Inventory and Storage Class Analysis</a>.</p>\\n         </important>\\n         <p>To use this operation, you must have permissions to perform the\\n        <code>s3:PutAnalyticsConfiguration</code> action. The bucket owner has this permission by default. The\\n      bucket owner can grant this permission to others. For more information about permissions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-with-s3-actions.html#using-with-s3-actions-related-to-bucket-subresources\\\">Permissions Related to Bucket Subresource Operations</a> and <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html\\\">Managing Access Permissions to Your Amazon S3\\n        Resources</a>.</p>\\n         <p>\\n            <code>PutBucketAnalyticsConfiguration</code> has the following special errors:</p>\\n         <ul>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Error: HTTP 400 Bad Request</i>\\n                     </p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Code: InvalidArgument</i>\\n                     </p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Cause: Invalid argument.</i>\\n                     </p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Error: HTTP 400 Bad Request</i>\\n                     </p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Code: TooManyConfigurations</i>\\n                     </p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Cause: You are attempting to create a new configuration but have already reached\\n                the 1,000-configuration limit.</i>\\n                     </p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>HTTP Error: HTTP 403 Forbidden</i>\\n                     </p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Code: AccessDenied</i>\\n                     </p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Cause: You are not the owner of the specified bucket, or you do not have the\\n                s3:PutAnalyticsConfiguration bucket permission to set the configuration on the\\n                bucket.</i>\\n                     </p>\\n                  </li>\\n               </ul>\\n            </li>\\n         </ul>\\n         <p>The following operations are related to <code>PutBucketAnalyticsConfiguration</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketAnalyticsConfiguration.html\\\">GetBucketAnalyticsConfiguration</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketAnalyticsConfiguration.html\\\">DeleteBucketAnalyticsConfiguration</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListBucketAnalyticsConfigurations.html\\\">ListBucketAnalyticsConfigurations</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#http\": {\n          \"method\": \"PUT\",\n          \"uri\": \"/{Bucket}?analytics\",\n          \"code\": 200\n        },\n        \"smithy.rules#staticContextParams\": {\n          \"UseS3ExpressControlEndpoint\": {\n            \"value\": true\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#PutBucketAnalyticsConfigurationRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the bucket to which an analytics configuration is stored.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"Id\": {\n          \"target\": \"com.amazonaws.s3#AnalyticsId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The ID that identifies the analytics configuration.</p>\",\n            \"smithy.api#httpQuery\": \"id\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"AnalyticsConfiguration\": {\n          \"target\": \"com.amazonaws.s3#AnalyticsConfiguration\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The configuration and any analyses for the analytics filter.</p>\",\n            \"smithy.api#httpPayload\": {},\n            \"smithy.api#required\": {},\n            \"smithy.api#xmlName\": \"AnalyticsConfiguration\"\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#PutBucketCors\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#PutBucketCorsRequest\"\n      },\n      \"output\": {\n        \"target\": \"smithy.api#Unit\"\n      },\n      \"traits\": {\n        \"aws.protocols#httpChecksum\": {\n          \"requestAlgorithmMember\": \"ChecksumAlgorithm\",\n          \"requestChecksumRequired\": true\n        },\n        \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported for directory buckets.</p>\\n         </note>\\n         <p>Sets the <code>cors</code> configuration for your bucket. If the configuration exists, Amazon S3 replaces\\n      it.</p>\\n         <p>To use this operation, you must be allowed to perform the <code>s3:PutBucketCORS</code> action. By\\n      default, the bucket owner has this permission and can grant it to others.</p>\\n         <p>You set this configuration on a bucket so that the bucket can service cross-origin requests. For\\n      example, you might want to enable a request whose origin is <code>http://www.example.com</code> to\\n      access your Amazon S3 bucket at <code>my.example.bucket.com</code> by using the browser's\\n        <code>XMLHttpRequest</code> capability.</p>\\n         <p>To enable cross-origin resource sharing (CORS) on a bucket, you add the <code>cors</code>\\n      subresource to the bucket. The <code>cors</code> subresource is an XML document in which you configure\\n      rules that identify origins and the HTTP methods that can be executed on your bucket. The document is\\n      limited to 64 KB in size. </p>\\n         <p>When Amazon S3 receives a cross-origin request (or a pre-flight OPTIONS request) against a bucket, it\\n      evaluates the <code>cors</code> configuration on the bucket and uses the first <code>CORSRule</code>\\n      rule that matches the incoming browser request to enable a cross-origin request. For a rule to match,\\n      the following conditions must be met:</p>\\n         <ul>\\n            <li>\\n               <p>The request's <code>Origin</code> header must match <code>AllowedOrigin</code> elements.</p>\\n            </li>\\n            <li>\\n               <p>The request method (for example, GET, PUT, HEAD, and so on) or the\\n            <code>Access-Control-Request-Method</code> header in case of a pre-flight <code>OPTIONS</code>\\n          request must be one of the <code>AllowedMethod</code> elements. </p>\\n            </li>\\n            <li>\\n               <p>Every header specified in the <code>Access-Control-Request-Headers</code> request header of a\\n          pre-flight request must match an <code>AllowedHeader</code> element. </p>\\n            </li>\\n         </ul>\\n         <p> For more information about CORS, go to <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/cors.html\\\">Enabling Cross-Origin Resource Sharing</a> in the\\n        <i>Amazon S3 User Guide</i>.</p>\\n         <p>The following operations are related to <code>PutBucketCors</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketCors.html\\\">GetBucketCors</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketCors.html\\\">DeleteBucketCors</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/RESTOPTIONSobject.html\\\">RESTOPTIONSobject</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#examples\": [\n          {\n            \"title\": \"To set cors configuration on a bucket.\",\n            \"documentation\": \"The following example enables PUT, POST, and DELETE requests from www.example.com, and enables GET requests from any domain.\",\n            \"input\": {\n              \"Bucket\": \"\",\n              \"CORSConfiguration\": {\n                \"CORSRules\": [\n                  {\n                    \"AllowedOrigins\": [\"http://www.example.com\"],\n                    \"AllowedHeaders\": [\"*\"],\n                    \"AllowedMethods\": [\"PUT\", \"POST\", \"DELETE\"],\n                    \"MaxAgeSeconds\": 3000,\n                    \"ExposeHeaders\": [\"x-amz-server-side-encryption\"]\n                  },\n                  {\n                    \"AllowedOrigins\": [\"*\"],\n                    \"AllowedHeaders\": [\"Authorization\"],\n                    \"AllowedMethods\": [\"GET\"],\n                    \"MaxAgeSeconds\": 3000\n                  }\n                ]\n              },\n              \"ContentMD5\": \"\"\n            }\n          }\n        ],\n        \"smithy.api#http\": {\n          \"method\": \"PUT\",\n          \"uri\": \"/{Bucket}?cors\",\n          \"code\": 200\n        },\n        \"smithy.rules#staticContextParams\": {\n          \"UseS3ExpressControlEndpoint\": {\n            \"value\": true\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#PutBucketCorsRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the bucket impacted by the <code>cors</code>configuration.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"CORSConfiguration\": {\n          \"target\": \"com.amazonaws.s3#CORSConfiguration\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Describes the cross-origin access configuration for objects in an Amazon S3 bucket. For more information,\\n      see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/cors.html\\\">Enabling Cross-Origin Resource\\n        Sharing</a> in the <i>Amazon S3 User Guide</i>.</p>\",\n            \"smithy.api#httpPayload\": {},\n            \"smithy.api#required\": {},\n            \"smithy.api#xmlName\": \"CORSConfiguration\"\n          }\n        },\n        \"ContentMD5\": {\n          \"target\": \"com.amazonaws.s3#ContentMD5\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Base64 encoded 128-bit <code>MD5</code> digest of the data. This header must be used as a\\n      message integrity check to verify that the request body was not corrupted in transit. For more\\n      information, go to <a href=\\\"http://www.ietf.org/rfc/rfc1864.txt\\\">RFC 1864.</a>\\n         </p>\\n         <p>For requests made using the Amazon Web Services Command Line Interface (CLI) or Amazon Web Services SDKs, this field is calculated automatically.</p>\",\n            \"smithy.api#httpHeader\": \"Content-MD5\"\n          }\n        },\n        \"ChecksumAlgorithm\": {\n          \"target\": \"com.amazonaws.s3#ChecksumAlgorithm\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Indicates the algorithm used to create the checksum for the request when you use the SDK. This header will not provide any\\n    additional functionality if you don't use the SDK. When you send this header, there must be a corresponding <code>x-amz-checksum</code> or\\n    <code>x-amz-trailer</code> header sent. Otherwise, Amazon S3 fails the request with the HTTP status code <code>400 Bad Request</code>. For more\\n    information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking object integrity</a> in\\n    the <i>Amazon S3 User Guide</i>.</p>\\n         <p>If you provide an individual checksum, Amazon S3 ignores any provided <code>ChecksumAlgorithm</code>\\n      parameter.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-sdk-checksum-algorithm\"\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#PutBucketEncryption\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#PutBucketEncryptionRequest\"\n      },\n      \"output\": {\n        \"target\": \"smithy.api#Unit\"\n      },\n      \"traits\": {\n        \"aws.protocols#httpChecksum\": {\n          \"requestAlgorithmMember\": \"ChecksumAlgorithm\",\n          \"requestChecksumRequired\": true\n        },\n        \"smithy.api#documentation\": \"<p>This operation configures default encryption and Amazon S3 Bucket Keys for an existing bucket. You can also <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_BlockedEncryptionTypes.html\\\">block encryption types</a> using this operation.</p>\\n         <note>\\n            <p>\\n               <b>Directory buckets </b> - For directory buckets, you must make requests for this API operation to the Regional endpoint. These endpoints support path-style requests in the format <code>https://s3express-control.<i>region-code</i>.amazonaws.com/<i>bucket-name</i>\\n               </code>. Virtual-hosted-style requests aren't supported. \\nFor more information about endpoints in Availability Zones, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/endpoint-directory-buckets-AZ.html\\\">Regional and Zonal endpoints for directory buckets in Availability Zones</a> in the\\n    <i>Amazon S3 User Guide</i>. For more information about endpoints in Local Zones, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-lzs-for-directory-buckets.html\\\">Concepts for directory buckets in Local Zones</a> in the\\n    <i>Amazon S3 User Guide</i>.</p>\\n         </note>\\n         <p>By default, all buckets have a default encryption configuration that uses server-side encryption\\n      with Amazon S3 managed keys (SSE-S3).</p>\\n         <note>\\n            <ul>\\n               <li>\\n                  <p>\\n                     <b>General purpose buckets</b>\\n                  </p>\\n                  <ul>\\n                     <li>\\n                        <p>You can optionally configure default encryption for a bucket by using server-side\\n                encryption with Key Management Service (KMS) keys (SSE-KMS) or dual-layer server-side encryption with\\n                Amazon Web Services KMS keys (DSSE-KMS). If you specify default encryption by using SSE-KMS, you can also\\n                configure <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/bucket-key.html\\\">Amazon S3 Bucket\\n                  Keys</a>. For information about the bucket default encryption feature, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/bucket-encryption.html\\\">Amazon S3 Bucket Default\\n                  Encryption</a> in the <i>Amazon S3 User Guide</i>. </p>\\n                     </li>\\n                     <li>\\n                        <p>If you use PutBucketEncryption to set your <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/bucket-encryption.html\\\">default bucket encryption</a> to\\n                SSE-KMS, you should verify that your KMS key ID is correct. Amazon S3 doesn't validate the\\n                KMS key ID provided in PutBucketEncryption requests.</p>\\n                     </li>\\n                  </ul>\\n               </li>\\n               <li>\\n                  <p>\\n                     <b>Directory buckets </b> - You can optionally configure\\n            default encryption for a bucket by using server-side encryption with Key Management Service (KMS) keys\\n            (SSE-KMS).</p>\\n                  <ul>\\n                     <li>\\n                        <p>We recommend that the bucket's default encryption uses the desired encryption\\n                configuration and you don't override the bucket default encryption in your\\n                  <code>CreateSession</code> requests or <code>PUT</code> object requests. Then, new objects\\n                are automatically encrypted with the desired encryption settings.\\n                For more information about the encryption overriding behaviors in directory buckets, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-specifying-kms-encryption.html\\\">Specifying server-side encryption with KMS for new object uploads</a>.</p>\\n                     </li>\\n                     <li>\\n                        <p>Your SSE-KMS configuration can only support 1 <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk\\\">customer managed key</a> per directory bucket's lifetime. \\nThe <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk\\\">Amazon Web Services managed key</a> (<code>aws/s3</code>) isn't supported. \\n</p>\\n                     </li>\\n                     <li>\\n                        <p>S3 Bucket Keys are always enabled for <code>GET</code> and <code>PUT</code> operations in a directory bucket and can’t be disabled. S3 Bucket Keys aren't supported, when you copy SSE-KMS encrypted objects from general purpose buckets  \\nto directory buckets, from directory buckets to general purpose buckets, or between directory buckets, through <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html\\\">CopyObject</a>, <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html\\\">UploadPartCopy</a>, <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-buckets-objects-Batch-Ops\\\">the Copy operation in Batch Operations</a>, or \\n                            <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/create-import-job\\\">the import jobs</a>. In this case, Amazon S3 makes a call to KMS every time a copy request is made for a KMS-encrypted object.</p>\\n                     </li>\\n                     <li>\\n                        <p>When you specify an <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk\\\">KMS customer managed key</a> for encryption in your directory bucket, only use the key ID or key ARN. The key alias format of the KMS key isn't supported.</p>\\n                     </li>\\n                     <li>\\n                        <p>For directory buckets, if you use PutBucketEncryption to set your <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/bucket-encryption.html\\\">default bucket\\n                  encryption</a> to SSE-KMS, Amazon S3 validates the KMS key ID provided in\\n                PutBucketEncryption requests.</p>\\n                     </li>\\n                  </ul>\\n               </li>\\n            </ul>\\n         </note>\\n         <important>\\n            <p>If you're specifying a customer managed KMS key, we recommend using a fully qualified KMS key\\n        ARN. If you use a KMS key alias instead, then KMS resolves the key within the requester’s account.\\n        This behavior can result in data that's encrypted with a KMS key that belongs to the requester, and\\n        not the bucket owner.</p>\\n            <p>Also, this action requires Amazon Web Services Signature Version 4. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html\\\"> Authenticating\\n          Requests (Amazon Web Services Signature Version 4)</a>. </p>\\n         </important>\\n         <dl>\\n            <dt>Permissions</dt>\\n            <dd>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <b>General purpose bucket permissions</b> - The\\n                  <code>s3:PutEncryptionConfiguration</code> permission is required in a policy. The bucket\\n                owner has this permission by default. The bucket owner can grant this permission to others.\\n                For more information about permissions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-with-s3-actions.html#using-with-s3-actions-related-to-bucket-subresources\\\">Permissions Related to Bucket Operations</a> and <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html\\\">Managing Access Permissions to Your\\n                  Amazon S3 Resources</a> in the <i>Amazon S3 User Guide</i>.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <b>Directory bucket permissions</b> - To grant access to\\n                this API operation, you must have the <code>s3express:PutEncryptionConfiguration</code>\\n                permission in an IAM identity-based policy instead of a bucket policy. Cross-account access to this API operation isn't supported. This operation can only be performed by the Amazon Web Services account that owns the resource.\\n                For more information about directory bucket policies and permissions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-security-iam.html\\\">Amazon Web Services Identity and Access Management (IAM) for S3 Express One Zone</a> in the <i>Amazon S3 User Guide</i>.</p>\\n                     <p>To set a directory bucket default encryption with SSE-KMS, you must also have the\\n                  <code>kms:GenerateDataKey</code> and the <code>kms:Decrypt</code> permissions in IAM\\n                identity-based policies and KMS key policies for the target KMS key.</p>\\n                  </li>\\n               </ul>\\n            </dd>\\n            <dt>HTTP Host header syntax</dt>\\n            <dd>\\n               <p>\\n                  <b>Directory buckets </b> - The HTTP Host header syntax is <code>s3express-control.<i>region-code</i>.amazonaws.com</code>.</p>\\n            </dd>\\n         </dl>\\n         <p>The following operations are related to <code>PutBucketEncryption</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketEncryption.html\\\">GetBucketEncryption</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketEncryption.html\\\">DeleteBucketEncryption</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#http\": {\n          \"method\": \"PUT\",\n          \"uri\": \"/{Bucket}?encryption\",\n          \"code\": 200\n        },\n        \"smithy.rules#staticContextParams\": {\n          \"UseS3ExpressControlEndpoint\": {\n            \"value\": true\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#PutBucketEncryptionRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies default encryption for a bucket using server-side encryption with different key\\n      options.</p>\\n         <p>\\n            <b>Directory buckets </b> - When you use this operation with a directory bucket, you must use path-style requests in the format <code>https://s3express-control.<i>region-code</i>.amazonaws.com/<i>bucket-name</i>\\n            </code>. Virtual-hosted-style requests aren't supported. Directory bucket names must be unique in the chosen Zone (Availability Zone or Local Zone). Bucket names must also follow the format <code>\\n               <i>bucket-base-name</i>--<i>zone-id</i>--x-s3</code> (for example, <code>\\n               <i>DOC-EXAMPLE-BUCKET</i>--<i>usw2-az1</i>--x-s3</code>). For information about bucket naming restrictions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-bucket-naming-rules.html\\\">Directory bucket naming rules</a> in the <i>Amazon S3 User Guide</i>\\n         </p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"ContentMD5\": {\n          \"target\": \"com.amazonaws.s3#ContentMD5\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Base64 encoded 128-bit <code>MD5</code> digest of the server-side encryption\\n      configuration.</p>\\n         <p>For requests made using the Amazon Web Services Command Line Interface (CLI) or Amazon Web Services SDKs, this field is calculated automatically.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"Content-MD5\"\n          }\n        },\n        \"ChecksumAlgorithm\": {\n          \"target\": \"com.amazonaws.s3#ChecksumAlgorithm\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Indicates the algorithm used to create the checksum for the request when you use the SDK. This header will not provide any\\n    additional functionality if you don't use the SDK. When you send this header, there must be a corresponding <code>x-amz-checksum</code> or\\n    <code>x-amz-trailer</code> header sent. Otherwise, Amazon S3 fails the request with the HTTP status code <code>400 Bad Request</code>. For more\\n    information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking object integrity</a> in\\n    the <i>Amazon S3 User Guide</i>.</p>\\n         <p>If you provide an individual checksum, Amazon S3 ignores any provided <code>ChecksumAlgorithm</code>\\n      parameter.</p>\\n         <note>\\n            <p>For directory buckets, when you use Amazon Web Services SDKs, <code>CRC32</code> is the default checksum algorithm that's used for performance.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-sdk-checksum-algorithm\"\n          }\n        },\n        \"ServerSideEncryptionConfiguration\": {\n          \"target\": \"com.amazonaws.s3#ServerSideEncryptionConfiguration\",\n          \"traits\": {\n            \"smithy.api#httpPayload\": {},\n            \"smithy.api#required\": {},\n            \"smithy.api#xmlName\": \"ServerSideEncryptionConfiguration\"\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\\n         <note>\\n            <p>For directory buckets, this header is not supported in this API operation. If you specify this header, the request fails with the HTTP status code \\n<code>501 Not Implemented</code>.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#PutBucketIntelligentTieringConfiguration\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#PutBucketIntelligentTieringConfigurationRequest\"\n      },\n      \"output\": {\n        \"target\": \"smithy.api#Unit\"\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported for directory buckets.</p>\\n         </note>\\n         <p>Puts a S3 Intelligent-Tiering configuration to the specified bucket. You can have up to 1,000\\n      S3 Intelligent-Tiering configurations per bucket.</p>\\n         <p>The S3 Intelligent-Tiering storage class is designed to optimize storage costs by automatically moving data to the most cost-effective storage access tier, without performance impact or operational overhead. S3 Intelligent-Tiering delivers automatic cost savings in three low latency and high throughput access tiers. To get the lowest storage cost on data that can be accessed in minutes to hours, you can choose to activate additional archiving capabilities.</p>\\n         <p>The S3 Intelligent-Tiering storage class is  the ideal storage class for data with unknown, changing, or unpredictable access patterns, independent of object size or retention period. If the size of an object is less than 128 KB, it is not monitored and not eligible for auto-tiering. Smaller objects can be stored, but they are always charged at the Frequent Access tier rates in the S3 Intelligent-Tiering storage class.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/storage-class-intro.html#sc-dynamic-data-access\\\">Storage class for automatically optimizing frequently and infrequently accessed objects</a>.</p>\\n         <p>Operations related to <code>PutBucketIntelligentTieringConfiguration</code> include: </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketIntelligentTieringConfiguration.html\\\">DeleteBucketIntelligentTieringConfiguration</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketIntelligentTieringConfiguration.html\\\">GetBucketIntelligentTieringConfiguration</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListBucketIntelligentTieringConfigurations.html\\\">ListBucketIntelligentTieringConfigurations</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <note>\\n            <p>You only need S3 Intelligent-Tiering enabled on a bucket if you want to automatically move objects\\n        stored in the S3 Intelligent-Tiering storage class to the Archive Access or Deep Archive Access\\n        tier.</p>\\n         </note>\\n         <p>\\n            <code>PutBucketIntelligentTieringConfiguration</code> has the following special errors:</p>\\n         <dl>\\n            <dt>HTTP 400 Bad Request Error</dt>\\n            <dd>\\n               <p>\\n                  <i>Code:</i> InvalidArgument</p>\\n               <p>\\n                  <i>Cause:</i> Invalid Argument</p>\\n            </dd>\\n            <dt>HTTP 400 Bad Request Error</dt>\\n            <dd>\\n               <p>\\n                  <i>Code:</i> TooManyConfigurations</p>\\n               <p>\\n                  <i>Cause:</i> You are attempting to create a new configuration but have already\\n            reached the 1,000-configuration limit. </p>\\n            </dd>\\n            <dt>HTTP 403 Forbidden Error</dt>\\n            <dd>\\n               <p>\\n                  <i>Cause:</i> You are not the owner of the specified bucket, or you do not have\\n            the <code>s3:PutIntelligentTieringConfiguration</code> bucket permission to set the configuration\\n            on the bucket. </p>\\n            </dd>\\n         </dl>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#http\": {\n          \"method\": \"PUT\",\n          \"uri\": \"/{Bucket}?intelligent-tiering\",\n          \"code\": 200\n        },\n        \"smithy.rules#staticContextParams\": {\n          \"UseS3ExpressControlEndpoint\": {\n            \"value\": true\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#PutBucketIntelligentTieringConfigurationRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the Amazon S3 bucket whose configuration you want to modify or retrieve.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"Id\": {\n          \"target\": \"com.amazonaws.s3#IntelligentTieringId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The ID used to identify the S3 Intelligent-Tiering configuration.</p>\",\n            \"smithy.api#httpQuery\": \"id\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        },\n        \"IntelligentTieringConfiguration\": {\n          \"target\": \"com.amazonaws.s3#IntelligentTieringConfiguration\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Container for S3 Intelligent-Tiering configuration.</p>\",\n            \"smithy.api#httpPayload\": {},\n            \"smithy.api#required\": {},\n            \"smithy.api#xmlName\": \"IntelligentTieringConfiguration\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#PutBucketInventoryConfiguration\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#PutBucketInventoryConfigurationRequest\"\n      },\n      \"output\": {\n        \"target\": \"smithy.api#Unit\"\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported for directory buckets.</p>\\n         </note>\\n         <p>This implementation of the <code>PUT</code> action adds an S3 Inventory configuration (identified by\\n      the inventory ID) to the bucket. You can have up to 1,000 inventory configurations per bucket. </p>\\n         <p>Amazon S3 inventory generates inventories of the objects in the bucket on a daily or weekly basis, and\\n      the results are published to a flat file. The bucket that is inventoried is called the\\n        <i>source</i> bucket, and the bucket where the inventory flat file is stored is called\\n      the <i>destination</i> bucket. The <i>destination</i> bucket must be in the\\n      same Amazon Web Services Region as the <i>source</i> bucket. </p>\\n         <p>When you configure an inventory for a <i>source</i> bucket, you specify the\\n        <i>destination</i> bucket where you want the inventory to be stored, and whether to\\n      generate the inventory daily or weekly. You can also configure what object metadata to include and\\n      whether to inventory all object versions or only current versions. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/storage-inventory.html\\\">Amazon S3 Inventory</a> in the\\n      Amazon S3 User Guide.</p>\\n         <important>\\n            <p>You must create a bucket policy on the <i>destination</i> bucket to grant\\n        permissions to Amazon S3 to write objects to the bucket in the defined location. For an example policy, see\\n          <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/example-bucket-policies.html#example-bucket-policies-use-case-9\\\"> Granting\\n          Permissions for Amazon S3 Inventory and Storage Class Analysis</a>.</p>\\n         </important>\\n         <dl>\\n            <dt>Permissions</dt>\\n            <dd>\\n               <p>To use this operation, you must have permission to perform the\\n              <code>s3:PutInventoryConfiguration</code> action. The bucket owner has this permission by\\n            default and can grant this permission to others. </p>\\n               <p>The <code>s3:PutInventoryConfiguration</code> permission allows a user to create an <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage-inventory.html\\\">S3 Inventory</a>\\n            report that includes all object metadata fields available and to specify the destination bucket to\\n            store the inventory. A user with read access to objects in the destination bucket can also access\\n            all object metadata fields that are available in the inventory report. </p>\\n               <p>To restrict access to an inventory report, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-bucket-policies.html#example-bucket-policies-use-case-10\\\">Restricting access to an Amazon S3 Inventory report</a> in the\\n              <i>Amazon S3 User Guide</i>. For more information about the metadata fields available\\n            in S3 Inventory, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage-inventory.html#storage-inventory-contents\\\">Amazon S3 Inventory\\n              lists</a> in the <i>Amazon S3 User Guide</i>. For more information about\\n            permissions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-with-s3-actions.html#using-with-s3-actions-related-to-bucket-subresources\\\">Permissions related to bucket subresource operations</a> and <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html\\\">Identity and access management in\\n              Amazon S3</a> in the <i>Amazon S3 User Guide</i>.</p>\\n            </dd>\\n         </dl>\\n         <p>\\n            <code>PutBucketInventoryConfiguration</code> has the following special errors:</p>\\n         <dl>\\n            <dt>HTTP 400 Bad Request Error</dt>\\n            <dd>\\n               <p>\\n                  <i>Code:</i> InvalidArgument</p>\\n               <p>\\n                  <i>Cause:</i> Invalid Argument</p>\\n            </dd>\\n            <dt>HTTP 400 Bad Request Error</dt>\\n            <dd>\\n               <p>\\n                  <i>Code:</i> TooManyConfigurations</p>\\n               <p>\\n                  <i>Cause:</i> You are attempting to create a new configuration but have already\\n            reached the 1,000-configuration limit. </p>\\n            </dd>\\n            <dt>HTTP 403 Forbidden Error</dt>\\n            <dd>\\n               <p>\\n                  <i>Cause:</i> You are not the owner of the specified bucket, or you do not have\\n            the <code>s3:PutInventoryConfiguration</code> bucket permission to set the configuration on the\\n            bucket. </p>\\n            </dd>\\n         </dl>\\n         <p>The following operations are related to <code>PutBucketInventoryConfiguration</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketInventoryConfiguration.html\\\">GetBucketInventoryConfiguration</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketInventoryConfiguration.html\\\">DeleteBucketInventoryConfiguration</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListBucketInventoryConfigurations.html\\\">ListBucketInventoryConfigurations</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#http\": {\n          \"method\": \"PUT\",\n          \"uri\": \"/{Bucket}?inventory\",\n          \"code\": 200\n        },\n        \"smithy.rules#staticContextParams\": {\n          \"UseS3ExpressControlEndpoint\": {\n            \"value\": true\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#PutBucketInventoryConfigurationRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the bucket where the inventory configuration will be stored.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"Id\": {\n          \"target\": \"com.amazonaws.s3#InventoryId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The ID used to identify the inventory configuration.</p>\",\n            \"smithy.api#httpQuery\": \"id\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"InventoryConfiguration\": {\n          \"target\": \"com.amazonaws.s3#InventoryConfiguration\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the inventory configuration.</p>\",\n            \"smithy.api#httpPayload\": {},\n            \"smithy.api#required\": {},\n            \"smithy.api#xmlName\": \"InventoryConfiguration\"\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#PutBucketLifecycleConfiguration\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#PutBucketLifecycleConfigurationRequest\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.s3#PutBucketLifecycleConfigurationOutput\"\n      },\n      \"traits\": {\n        \"aws.protocols#httpChecksum\": {\n          \"requestAlgorithmMember\": \"ChecksumAlgorithm\",\n          \"requestChecksumRequired\": true\n        },\n        \"smithy.api#documentation\": \"<p>Creates a new lifecycle configuration for the bucket or replaces an existing lifecycle\\n      configuration. Keep in mind that this will overwrite an existing lifecycle configuration, so if you want\\n      to retain any configuration details, they must be included in the new lifecycle configuration. For\\n      information about lifecycle configuration, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lifecycle-mgmt.html\\\">Managing your storage\\n      lifecycle</a>.</p>\\n         <note>\\n            <p>Bucket lifecycle configuration now supports specifying a lifecycle rule using an object key name\\n        prefix, one or more object tags, object size, or any combination of these. Accordingly, this section\\n        describes the latest API. The previous version of the API supported filtering based only on an object\\n        key name prefix, which is supported for backward compatibility. For the related API description, see\\n          <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketLifecycle.html\\\">PutBucketLifecycle</a>.</p>\\n         </note>\\n         <dl>\\n            <dt>Rules</dt>\\n            <dt>Permissions</dt>\\n            <dt>HTTP Host header syntax</dt>\\n            <dd>\\n               <p>You specify the lifecycle configuration in your request body. The lifecycle configuration is\\n            specified as XML consisting of one or more rules. An Amazon S3 Lifecycle configuration can have up to\\n            1,000 rules. This limit is not adjustable.</p>\\n               <p>Bucket lifecycle configuration supports specifying a lifecycle rule using an object key name\\n            prefix, one or more object tags, object size, or any combination of these. Accordingly, this\\n            section describes the latest API. The previous version of the API supported filtering based only\\n            on an object key name prefix, which is supported for backward compatibility for general purpose\\n            buckets. For the related API description, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketLifecycle.html\\\">PutBucketLifecycle</a>. </p>\\n               <note>\\n                  <p>Lifecyle configurations for directory buckets only support expiring objects and cancelling\\n              multipart uploads. Expiring of versioned objects,transitions and tag filters are not\\n              supported.</p>\\n               </note>\\n               <p>A lifecycle rule consists of the following:</p>\\n               <ul>\\n                  <li>\\n                     <p>A filter identifying a subset of objects to which the rule applies. The filter can be\\n                based on a key name prefix, object tags, object size, or any combination of these.</p>\\n                  </li>\\n                  <li>\\n                     <p>A status indicating whether the rule is in effect.</p>\\n                  </li>\\n                  <li>\\n                     <p>One or more lifecycle transition and expiration actions that you want Amazon S3 to perform on\\n                the objects identified by the filter. If the state of your bucket is versioning-enabled or\\n                versioning-suspended, you can have many versions of the same object (one current version and\\n                zero or more noncurrent versions). Amazon S3 provides predefined actions that you can specify for\\n                current and noncurrent object versions.</p>\\n                  </li>\\n               </ul>\\n               <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/object-lifecycle-mgmt.html\\\">Object Lifecycle Management</a> and\\n              <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/intro-lifecycle-rules.html\\\">Lifecycle\\n              Configuration Elements</a>.</p>\\n            </dd>\\n            <dd>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <b>General purpose bucket permissions</b> - By default, all Amazon S3\\n                resources are private, including buckets, objects, and related subresources (for example,\\n                lifecycle configuration and website configuration). Only the resource owner (that is, the\\n                Amazon Web Services account that created it) can access the resource. The resource owner can optionally\\n                grant access permissions to others by writing an access policy. For this operation, a user\\n                must have the <code>s3:PutLifecycleConfiguration</code> permission.</p>\\n                     <p>You can also explicitly deny permissions. An explicit deny also supersedes any other\\n                permissions. If you want to block users or accounts from removing or deleting objects from\\n                your bucket, you must deny them permissions for the following actions:</p>\\n                     <ul>\\n                        <li>\\n                           <p>\\n                              <code>s3:DeleteObject</code>\\n                           </p>\\n                        </li>\\n                        <li>\\n                           <p>\\n                              <code>s3:DeleteObjectVersion</code>\\n                           </p>\\n                        </li>\\n                        <li>\\n                           <p>\\n                              <code>s3:PutLifecycleConfiguration</code>\\n                           </p>\\n                           <p>For more information about permissions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html\\\">Managing Access Permissions to\\n                      Your Amazon S3 Resources</a>.</p>\\n                        </li>\\n                     </ul>\\n                  </li>\\n               </ul>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <b>Directory bucket permissions</b> - You must have the\\n                  <code>s3express:PutLifecycleConfiguration</code> permission in an IAM identity-based policy\\n                to use this operation. Cross-account access to this API operation isn't supported. The\\n                resource owner can optionally grant access permissions to others by creating a role or user\\n                for them as long as they are within the same account as the owner and resource.</p>\\n                     <p>For more information about directory bucket policies and permissions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-security-iam.html\\\">Authorizing Regional endpoint APIs with IAM</a> in the <i>Amazon S3 User\\n                  Guide</i>.</p>\\n                     <note>\\n                        <p>\\n                           <b>Directory buckets </b> - For directory buckets, you must make requests for this API operation to the Regional endpoint. These endpoints support path-style requests in the format <code>https://s3express-control.<i>region-code</i>.amazonaws.com/<i>bucket-name</i>\\n                           </code>. Virtual-hosted-style requests aren't supported. \\nFor more information about endpoints in Availability Zones, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/endpoint-directory-buckets-AZ.html\\\">Regional and Zonal endpoints for directory buckets in Availability Zones</a> in the\\n    <i>Amazon S3 User Guide</i>. For more information about endpoints in Local Zones, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-lzs-for-directory-buckets.html\\\">Concepts for directory buckets in Local Zones</a> in the\\n    <i>Amazon S3 User Guide</i>.</p>\\n                     </note>\\n                  </li>\\n               </ul>\\n            </dd>\\n            <dd>\\n               <p>\\n                  <b>Directory buckets </b> - The HTTP Host header syntax is\\n                <code>s3express-control.<i>region</i>.amazonaws.com</code>.</p>\\n               <p>The following operations are related to <code>PutBucketLifecycleConfiguration</code>:</p>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketLifecycleConfiguration.html\\\">GetBucketLifecycleConfiguration</a>\\n                     </p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketLifecycle.html\\\">DeleteBucketLifecycle</a>\\n                     </p>\\n                  </li>\\n               </ul>\\n            </dd>\\n         </dl>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#examples\": [\n          {\n            \"title\": \"Put bucket lifecycle\",\n            \"documentation\": \"The following example replaces existing lifecycle configuration, if any, on the specified bucket. \",\n            \"input\": {\n              \"Bucket\": \"examplebucket\",\n              \"LifecycleConfiguration\": {\n                \"Rules\": [\n                  {\n                    \"Filter\": {\n                      \"Prefix\": \"documents/\"\n                    },\n                    \"Status\": \"Enabled\",\n                    \"Transitions\": [\n                      {\n                        \"Days\": 365,\n                        \"StorageClass\": \"GLACIER\"\n                      }\n                    ],\n                    \"Expiration\": {\n                      \"Days\": 3650\n                    },\n                    \"ID\": \"TestOnly\"\n                  }\n                ]\n              }\n            }\n          }\n        ],\n        \"smithy.api#http\": {\n          \"method\": \"PUT\",\n          \"uri\": \"/{Bucket}?lifecycle\",\n          \"code\": 200\n        },\n        \"smithy.rules#staticContextParams\": {\n          \"UseS3ExpressControlEndpoint\": {\n            \"value\": true\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#PutBucketLifecycleConfigurationOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"TransitionDefaultMinimumObjectSize\": {\n          \"target\": \"com.amazonaws.s3#TransitionDefaultMinimumObjectSize\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Indicates which default minimum object size behavior is applied to the lifecycle\\n      configuration.</p>\\n         <note>\\n            <p>This parameter applies to general purpose buckets only. It is not supported for directory bucket\\n        lifecycle configurations.</p>\\n         </note>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>all_storage_classes_128K</code> - Objects smaller than 128 KB will not transition to\\n          any storage class by default. </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>varies_by_storage_class</code> - Objects smaller than 128 KB will transition to Glacier\\n          Flexible Retrieval or Glacier Deep Archive storage classes. By default, all other storage classes\\n          will prevent transitions smaller than 128 KB. </p>\\n            </li>\\n         </ul>\\n         <p>To customize the minimum object size for any transition you can add a filter that specifies a custom\\n        <code>ObjectSizeGreaterThan</code> or <code>ObjectSizeLessThan</code> in the body of your transition\\n      rule. Custom filters always take precedence over the default transition behavior.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-transition-default-minimum-object-size\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#output\": {}\n      }\n    },\n    \"com.amazonaws.s3#PutBucketLifecycleConfigurationRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the bucket for which to set the configuration.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"ChecksumAlgorithm\": {\n          \"target\": \"com.amazonaws.s3#ChecksumAlgorithm\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Indicates the algorithm used to create the checksum for the request when you use the SDK. This header will not provide any\\n    additional functionality if you don't use the SDK. When you send this header, there must be a corresponding <code>x-amz-checksum</code> or\\n    <code>x-amz-trailer</code> header sent. Otherwise, Amazon S3 fails the request with the HTTP status code <code>400 Bad Request</code>. For more\\n    information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking object integrity</a> in\\n    the <i>Amazon S3 User Guide</i>.</p>\\n         <p>If you provide an individual checksum, Amazon S3 ignores any provided <code>ChecksumAlgorithm</code>\\n      parameter.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-sdk-checksum-algorithm\"\n          }\n        },\n        \"LifecycleConfiguration\": {\n          \"target\": \"com.amazonaws.s3#BucketLifecycleConfiguration\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Container for lifecycle rules. You can add as many as 1,000 rules.</p>\",\n            \"smithy.api#httpPayload\": {},\n            \"smithy.api#xmlName\": \"LifecycleConfiguration\"\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\\n         <note>\\n            <p>This parameter applies to general purpose buckets only. It is not supported for directory bucket\\n        lifecycle configurations.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        },\n        \"TransitionDefaultMinimumObjectSize\": {\n          \"target\": \"com.amazonaws.s3#TransitionDefaultMinimumObjectSize\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Indicates which default minimum object size behavior is applied to the lifecycle\\n      configuration.</p>\\n         <note>\\n            <p>This parameter applies to general purpose buckets only. It is not supported for directory bucket\\n        lifecycle configurations.</p>\\n         </note>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>all_storage_classes_128K</code> - Objects smaller than 128 KB will not transition to\\n          any storage class by default. </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>varies_by_storage_class</code> - Objects smaller than 128 KB will transition to Glacier\\n          Flexible Retrieval or Glacier Deep Archive storage classes. By default, all other storage classes\\n          will prevent transitions smaller than 128 KB. </p>\\n            </li>\\n         </ul>\\n         <p>To customize the minimum object size for any transition you can add a filter that specifies a custom\\n        <code>ObjectSizeGreaterThan</code> or <code>ObjectSizeLessThan</code> in the body of your transition\\n      rule. Custom filters always take precedence over the default transition behavior.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-transition-default-minimum-object-size\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#PutBucketLogging\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#PutBucketLoggingRequest\"\n      },\n      \"output\": {\n        \"target\": \"smithy.api#Unit\"\n      },\n      \"traits\": {\n        \"aws.protocols#httpChecksum\": {\n          \"requestAlgorithmMember\": \"ChecksumAlgorithm\",\n          \"requestChecksumRequired\": true\n        },\n        \"smithy.api#documentation\": \"<important>\\n            <p>End of support notice: As of October 1, 2025, Amazon S3 has discontinued support for Email Grantee Access Control Lists (ACLs). If you attempt to use an Email Grantee ACL in a request after October 1, 2025, \\n the request will receive an <code>HTTP 405</code> (Method Not Allowed) error.</p>\\n            <p>This change affects the following Amazon Web Services Regions: US East (N. Virginia), US West (N. California), US West (Oregon), Asia Pacific (Singapore), Asia Pacific (Sydney), Asia Pacific (Tokyo), Europe (Ireland), and South America (São Paulo).</p>\\n         </important>\\n         <note>\\n            <p>This operation is not supported for directory buckets.</p>\\n         </note>\\n         <p>Set the logging parameters for a bucket and to specify permissions for who can view and modify the\\n      logging parameters. All logs are saved to buckets in the same Amazon Web Services Region as the source bucket. To set\\n      the logging status of a bucket, you must be the bucket owner.</p>\\n         <p>The bucket owner is automatically granted FULL_CONTROL to all logs. You use the <code>Grantee</code>\\n      request element to grant access to other people. The <code>Permissions</code> request element specifies\\n      the kind of access the grantee has to the logs.</p>\\n         <important>\\n            <p>If the target bucket for log delivery uses the bucket owner enforced setting for S3 Object\\n        Ownership, you can't use the <code>Grantee</code> request element to grant access to others.\\n        Permissions can only be granted using policies. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/enable-server-access-logging.html#grant-log-delivery-permissions-general\\\">Permissions for server access log delivery</a> in the\\n        <i>Amazon S3 User Guide</i>.</p>\\n         </important>\\n         <dl>\\n            <dt>Grantee Values</dt>\\n            <dd>\\n               <p>You can specify the person (grantee) to whom you're assigning access rights (by using request\\n            elements) in the following ways. For examples of how to specify these grantee values in JSON\\n            format, see the Amazon Web Services CLI example in <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/enable-server-access-logging.html\\\"> Enabling Amazon S3 server\\n              access logging</a> in the <i>Amazon S3 User Guide</i>.</p>\\n               <ul>\\n                  <li>\\n                     <p>By the person's ID:</p>\\n                     <p>\\n                        <code><Grantee xmlns:xsi=\\\"http://www.w3.org/2001/XMLSchema-instance\\\"\\n                  xsi:type=\\\"CanonicalUser\\\"><ID><>ID<></ID><DisplayName><>GranteesEmail<></DisplayName>\\n                  </Grantee></code>\\n                     </p>\\n                     <p>\\n                        <code>DisplayName</code> is optional and ignored in the request.</p>\\n                  </li>\\n                  <li>\\n                     <p>By Email address:</p>\\n                     <p>\\n                        <code> <Grantee xmlns:xsi=\\\"http://www.w3.org/2001/XMLSchema-instance\\\"\\n                  xsi:type=\\\"AmazonCustomerByEmail\\\"><EmailAddress><>Grantees@email.com<></EmailAddress></Grantee></code>\\n                     </p>\\n                     <p>The grantee is resolved to the <code>CanonicalUser</code> and, in a response to a\\n                  <code>GETObjectAcl</code> request, appears as the CanonicalUser.</p>\\n                  </li>\\n                  <li>\\n                     <p>By URI:</p>\\n                     <p>\\n                        <code><Grantee xmlns:xsi=\\\"http://www.w3.org/2001/XMLSchema-instance\\\"\\n                  xsi:type=\\\"Group\\\"><URI><>http://acs.amazonaws.com/groups/global/AuthenticatedUsers<></URI></Grantee></code>\\n                     </p>\\n                  </li>\\n               </ul>\\n            </dd>\\n         </dl>\\n         <p>To enable logging, you use <code>LoggingEnabled</code> and its children request elements. To disable\\n      logging, you use an empty <code>BucketLoggingStatus</code> request element:</p>\\n         <p>\\n            <code><BucketLoggingStatus xmlns=\\\"http://doc.s3.amazonaws.com/2006-03-01\\\" /></code>\\n         </p>\\n         <p>For more information about server access logging, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/ServerLogs.html\\\">Server Access Logging</a> in the\\n        <i>Amazon S3 User Guide</i>. </p>\\n         <p>For more information about creating a bucket, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateBucket.html\\\">CreateBucket</a>. For more information about\\n      returning the logging status of a bucket, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketLogging.html\\\">GetBucketLogging</a>.</p>\\n         <p>The following operations are related to <code>PutBucketLogging</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html\\\">PutObject</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucket.html\\\">DeleteBucket</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateBucket.html\\\">CreateBucket</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketLogging.html\\\">GetBucketLogging</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#examples\": [\n          {\n            \"title\": \"Set logging configuration for a bucket\",\n            \"documentation\": \"The following example sets logging policy on a bucket. For the Log Delivery group to deliver logs to the destination bucket, it needs permission for the READ_ACP action which the policy grants.\",\n            \"input\": {\n              \"Bucket\": \"sourcebucket\",\n              \"BucketLoggingStatus\": {\n                \"LoggingEnabled\": {\n                  \"TargetBucket\": \"targetbucket\",\n                  \"TargetPrefix\": \"MyBucketLogs/\",\n                  \"TargetGrants\": [\n                    {\n                      \"Grantee\": {\n                        \"Type\": \"Group\",\n                        \"URI\": \"http://acs.amazonaws.com/groups/global/AllUsers\"\n                      },\n                      \"Permission\": \"READ\"\n                    }\n                  ]\n                }\n              }\n            }\n          }\n        ],\n        \"smithy.api#http\": {\n          \"method\": \"PUT\",\n          \"uri\": \"/{Bucket}?logging\",\n          \"code\": 200\n        },\n        \"smithy.rules#staticContextParams\": {\n          \"UseS3ExpressControlEndpoint\": {\n            \"value\": true\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#PutBucketLoggingRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the bucket for which to set the logging parameters.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"BucketLoggingStatus\": {\n          \"target\": \"com.amazonaws.s3#BucketLoggingStatus\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Container for logging status information.</p>\",\n            \"smithy.api#httpPayload\": {},\n            \"smithy.api#required\": {},\n            \"smithy.api#xmlName\": \"BucketLoggingStatus\"\n          }\n        },\n        \"ContentMD5\": {\n          \"target\": \"com.amazonaws.s3#ContentMD5\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The MD5 hash of the <code>PutBucketLogging</code> request body.</p>\\n         <p>For requests made using the Amazon Web Services Command Line Interface (CLI) or Amazon Web Services SDKs, this field is calculated automatically.</p>\",\n            \"smithy.api#httpHeader\": \"Content-MD5\"\n          }\n        },\n        \"ChecksumAlgorithm\": {\n          \"target\": \"com.amazonaws.s3#ChecksumAlgorithm\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Indicates the algorithm used to create the checksum for the request when you use the SDK. This header will not provide any\\n    additional functionality if you don't use the SDK. When you send this header, there must be a corresponding <code>x-amz-checksum</code> or\\n    <code>x-amz-trailer</code> header sent. Otherwise, Amazon S3 fails the request with the HTTP status code <code>400 Bad Request</code>. For more\\n    information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking object integrity</a> in\\n    the <i>Amazon S3 User Guide</i>.</p>\\n         <p>If you provide an individual checksum, Amazon S3 ignores any provided <code>ChecksumAlgorithm</code>\\n      parameter.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-sdk-checksum-algorithm\"\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#PutBucketMetricsConfiguration\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#PutBucketMetricsConfigurationRequest\"\n      },\n      \"output\": {\n        \"target\": \"smithy.api#Unit\"\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported for directory buckets.</p>\\n         </note>\\n         <p>Sets a metrics configuration (specified by the metrics configuration ID) for the bucket. You can\\n      have up to 1,000 metrics configurations per bucket. If you're updating an existing metrics\\n      configuration, note that this is a full replacement of the existing metrics configuration. If you don't\\n      include the elements you want to keep, they are erased.</p>\\n         <p>To use this operation, you must have permissions to perform the\\n        <code>s3:PutMetricsConfiguration</code> action. The bucket owner has this permission by default. The\\n      bucket owner can grant this permission to others. For more information about permissions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-with-s3-actions.html#using-with-s3-actions-related-to-bucket-subresources\\\">Permissions Related to Bucket Subresource Operations</a> and <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html\\\">Managing Access Permissions to Your Amazon S3\\n        Resources</a>.</p>\\n         <p>For information about CloudWatch request metrics for Amazon S3, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/cloudwatch-monitoring.html\\\">Monitoring Metrics with Amazon\\n      CloudWatch</a>.</p>\\n         <p>The following operations are related to <code>PutBucketMetricsConfiguration</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketMetricsConfiguration.html\\\">DeleteBucketMetricsConfiguration</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketMetricsConfiguration.html\\\">GetBucketMetricsConfiguration</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListBucketMetricsConfigurations.html\\\">ListBucketMetricsConfigurations</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>\\n            <code>PutBucketMetricsConfiguration</code> has the following special error:</p>\\n         <ul>\\n            <li>\\n               <p>Error code: <code>TooManyConfigurations</code>\\n               </p>\\n               <ul>\\n                  <li>\\n                     <p>Description: You are attempting to create a new configuration but have already reached the\\n              1,000-configuration limit.</p>\\n                  </li>\\n                  <li>\\n                     <p>HTTP Status Code: HTTP 400 Bad Request</p>\\n                  </li>\\n               </ul>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#http\": {\n          \"method\": \"PUT\",\n          \"uri\": \"/{Bucket}?metrics\",\n          \"code\": 200\n        },\n        \"smithy.rules#staticContextParams\": {\n          \"UseS3ExpressControlEndpoint\": {\n            \"value\": true\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#PutBucketMetricsConfigurationRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the bucket for which the metrics configuration is set.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"Id\": {\n          \"target\": \"com.amazonaws.s3#MetricsId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The ID used to identify the metrics configuration. The ID has a 64 character limit and can only\\n      contain letters, numbers, periods, dashes, and underscores.</p>\",\n            \"smithy.api#httpQuery\": \"id\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"MetricsConfiguration\": {\n          \"target\": \"com.amazonaws.s3#MetricsConfiguration\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the metrics configuration.</p>\",\n            \"smithy.api#httpPayload\": {},\n            \"smithy.api#required\": {},\n            \"smithy.api#xmlName\": \"MetricsConfiguration\"\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#PutBucketNotificationConfiguration\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#PutBucketNotificationConfigurationRequest\"\n      },\n      \"output\": {\n        \"target\": \"smithy.api#Unit\"\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported for directory buckets.</p>\\n         </note>\\n         <p>Enables notifications of specified events for a bucket. For more information about event\\n      notifications, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/NotificationHowTo.html\\\">Configuring Event Notifications</a>.</p>\\n         <p>Using this API, you can replace an existing notification configuration. The configuration is an XML\\n      file that defines the event types that you want Amazon S3 to publish and the destination where you want Amazon S3\\n      to publish an event notification when it detects an event of the specified type.</p>\\n         <p>By default, your bucket has no event notifications configured. That is, the notification\\n      configuration will be an empty <code>NotificationConfiguration</code>.</p>\\n         <p>\\n            <code><NotificationConfiguration></code>\\n         </p>\\n         <p>\\n            <code></NotificationConfiguration></code>\\n         </p>\\n         <p>This action replaces the existing notification configuration with the configuration you include in\\n      the request body.</p>\\n         <p>After Amazon S3 receives this request, it first verifies that any Amazon Simple Notification Service\\n      (Amazon SNS) or Amazon Simple Queue Service (Amazon SQS) destination exists, and that the bucket owner\\n      has permission to publish to it by sending a test notification. In the case of Lambda destinations,\\n      Amazon S3 verifies that the Lambda function permissions grant Amazon S3 permission to invoke the function from the\\n      Amazon S3 bucket. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/NotificationHowTo.html\\\">Configuring Notifications for Amazon S3\\n      Events</a>.</p>\\n         <p>You can disable notifications by adding the empty NotificationConfiguration element.</p>\\n         <p>For more information about the number of event notification configurations that you can create per\\n      bucket, see <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/s3.html#limits_s3\\\">Amazon S3 service\\n        quotas</a> in <i>Amazon Web Services General Reference</i>.</p>\\n         <p>By default, only the bucket owner can configure notifications on a bucket. However, bucket owners\\n      can use a bucket policy to grant permission to other users to set this configuration with the required\\n        <code>s3:PutBucketNotification</code> permission.</p>\\n         <note>\\n            <p>The PUT notification is an atomic operation. For example, suppose your notification configuration\\n        includes SNS topic, SQS queue, and Lambda function configurations. When you send a PUT request with\\n        this configuration, Amazon S3 sends test messages to your SNS topic. If the message fails, the entire PUT\\n        action will fail, and Amazon S3 will not add the configuration to your bucket.</p>\\n         </note>\\n         <p>If the configuration in the request body includes only one <code>TopicConfiguration</code>\\n      specifying only the <code>s3:ReducedRedundancyLostObject</code> event type, the response will also\\n      include the <code>x-amz-sns-test-message-id</code> header containing the message ID of the test\\n      notification sent to the topic.</p>\\n         <p>The following action is related to <code>PutBucketNotificationConfiguration</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketNotificationConfiguration.html\\\">GetBucketNotificationConfiguration</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#examples\": [\n          {\n            \"title\": \"Set notification configuration for a bucket\",\n            \"documentation\": \"The following example sets notification configuration on a bucket to publish the object created events to an SNS topic.\",\n            \"input\": {\n              \"Bucket\": \"examplebucket\",\n              \"NotificationConfiguration\": {\n                \"TopicConfigurations\": [\n                  {\n                    \"TopicArn\": \"arn:aws:sns:us-west-2:123456789012:s3-notification-topic\",\n                    \"Events\": [\"s3:ObjectCreated:*\"]\n                  }\n                ]\n              }\n            }\n          }\n        ],\n        \"smithy.api#http\": {\n          \"method\": \"PUT\",\n          \"uri\": \"/{Bucket}?notification\",\n          \"code\": 200\n        },\n        \"smithy.rules#staticContextParams\": {\n          \"UseS3ExpressControlEndpoint\": {\n            \"value\": true\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#PutBucketNotificationConfigurationRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the bucket.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"NotificationConfiguration\": {\n          \"target\": \"com.amazonaws.s3#NotificationConfiguration\",\n          \"traits\": {\n            \"smithy.api#httpPayload\": {},\n            \"smithy.api#required\": {},\n            \"smithy.api#xmlName\": \"NotificationConfiguration\"\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        },\n        \"SkipDestinationValidation\": {\n          \"target\": \"com.amazonaws.s3#SkipValidation\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Skips validation of Amazon SQS, Amazon SNS, and Lambda destinations.\\n      True or false value.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-skip-destination-validation\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#PutBucketOwnershipControls\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#PutBucketOwnershipControlsRequest\"\n      },\n      \"output\": {\n        \"target\": \"smithy.api#Unit\"\n      },\n      \"traits\": {\n        \"aws.protocols#httpChecksum\": {\n          \"requestAlgorithmMember\": \"ChecksumAlgorithm\",\n          \"requestChecksumRequired\": true\n        },\n        \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported for directory buckets.</p>\\n         </note>\\n         <p>Creates or modifies <code>OwnershipControls</code> for an Amazon S3 bucket. To use this operation, you\\n      must have the <code>s3:PutBucketOwnershipControls</code> permission. For more information about Amazon S3\\n      permissions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/user-guide/using-with-s3-actions.html\\\">Specifying permissions in a policy</a>. </p>\\n         <p>For information about Amazon S3 Object Ownership, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/user-guide/about-object-ownership.html\\\">Using object ownership</a>. </p>\\n         <p>The following operations are related to <code>PutBucketOwnershipControls</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a>GetBucketOwnershipControls</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a>DeleteBucketOwnershipControls</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#http\": {\n          \"method\": \"PUT\",\n          \"uri\": \"/{Bucket}?ownershipControls\",\n          \"code\": 200\n        },\n        \"smithy.rules#staticContextParams\": {\n          \"UseS3ExpressControlEndpoint\": {\n            \"value\": true\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#PutBucketOwnershipControlsRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the Amazon S3 bucket whose <code>OwnershipControls</code> you want to set.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"ContentMD5\": {\n          \"target\": \"com.amazonaws.s3#ContentMD5\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The MD5 hash of the <code>OwnershipControls</code> request body. </p>\\n         <p>For requests made using the Amazon Web Services Command Line Interface (CLI) or Amazon Web Services SDKs, this field is calculated automatically.</p>\",\n            \"smithy.api#httpHeader\": \"Content-MD5\"\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        },\n        \"OwnershipControls\": {\n          \"target\": \"com.amazonaws.s3#OwnershipControls\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The <code>OwnershipControls</code> (BucketOwnerEnforced, BucketOwnerPreferred, or ObjectWriter) that\\n      you want to apply to this Amazon S3 bucket.</p>\",\n            \"smithy.api#httpPayload\": {},\n            \"smithy.api#required\": {},\n            \"smithy.api#xmlName\": \"OwnershipControls\"\n          }\n        },\n        \"ChecksumAlgorithm\": {\n          \"target\": \"com.amazonaws.s3#ChecksumAlgorithm\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p> Indicates the algorithm used to create the checksum for the object when you use the SDK. This\\n      header will not provide any additional functionality if you don't use the SDK. When you send this\\n      header, there must be a corresponding <code>x-amz-checksum-<i>algorithm</i>\\n            </code> header\\n      sent. Otherwise, Amazon S3 fails the request with the HTTP status code <code>400 Bad Request</code>. For more\\n      information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking object integrity</a> in\\n      the <i>Amazon S3 User Guide</i>.</p>\\n         <p>If you provide an individual checksum, Amazon S3 ignores any provided <code>ChecksumAlgorithm</code>\\n      parameter. </p>\",\n            \"smithy.api#httpHeader\": \"x-amz-sdk-checksum-algorithm\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#PutBucketPolicy\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#PutBucketPolicyRequest\"\n      },\n      \"output\": {\n        \"target\": \"smithy.api#Unit\"\n      },\n      \"traits\": {\n        \"aws.protocols#httpChecksum\": {\n          \"requestAlgorithmMember\": \"ChecksumAlgorithm\",\n          \"requestChecksumRequired\": true\n        },\n        \"smithy.api#documentation\": \"<p>Applies an Amazon S3 bucket policy to an Amazon S3 bucket.</p>\\n         <note>\\n            <p>\\n               <b>Directory buckets </b> - For directory buckets, you must make requests for this API operation to the Regional endpoint. These endpoints support path-style requests in the format <code>https://s3express-control.<i>region-code</i>.amazonaws.com/<i>bucket-name</i>\\n               </code>. Virtual-hosted-style requests aren't supported. \\nFor more information about endpoints in Availability Zones, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/endpoint-directory-buckets-AZ.html\\\">Regional and Zonal endpoints for directory buckets in Availability Zones</a> in the\\n    <i>Amazon S3 User Guide</i>. For more information about endpoints in Local Zones, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-lzs-for-directory-buckets.html\\\">Concepts for directory buckets in Local Zones</a> in the\\n    <i>Amazon S3 User Guide</i>.</p>\\n         </note>\\n         <dl>\\n            <dt>Permissions</dt>\\n            <dd>\\n               <p>If you are using an identity other than the root user of the Amazon Web Services account that owns the\\n            bucket, the calling identity must both have the <code>PutBucketPolicy</code> permissions on the\\n            specified bucket and belong to the bucket owner's account in order to use this operation.</p>\\n               <p>If you don't have <code>PutBucketPolicy</code> permissions, Amazon S3 returns a <code>403 Access\\n              Denied</code> error. If you have the correct permissions, but you're not using an identity that\\n            belongs to the bucket owner's account, Amazon S3 returns a <code>405 Method Not Allowed</code>\\n            error.</p>\\n               <important>\\n                  <p>To ensure that bucket owners don't inadvertently lock themselves out of their own buckets,\\n              the root principal in a bucket owner's Amazon Web Services account can perform the\\n                <code>GetBucketPolicy</code>, <code>PutBucketPolicy</code>, and\\n                <code>DeleteBucketPolicy</code> API actions, even if their bucket policy explicitly denies the\\n              root principal's access. Bucket owner root principals can only be blocked from performing these\\n              API actions by VPC endpoint policies and Amazon Web Services Organizations policies.</p>\\n               </important>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <b>General purpose bucket permissions</b> - The\\n                  <code>s3:PutBucketPolicy</code> permission is required in a policy. For more information\\n                about general purpose buckets bucket policies, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/using-iam-policies.html\\\">Using Bucket Policies and User\\n                  Policies</a> in the <i>Amazon S3 User Guide</i>.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <b>Directory bucket permissions</b> - To grant access to\\n                this API operation, you must have the <code>s3express:PutBucketPolicy</code> permission in\\n                an IAM identity-based policy instead of a bucket policy. Cross-account access to this API operation isn't supported. This operation can only be performed by the Amazon Web Services account that owns the resource.\\n                For more information about directory bucket policies and permissions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-security-iam.html\\\">Amazon Web Services Identity and Access Management (IAM) for S3 Express One Zone</a> in the <i>Amazon S3 User Guide</i>.</p>\\n                  </li>\\n               </ul>\\n            </dd>\\n            <dt>Example bucket policies</dt>\\n            <dd>\\n               <p>\\n                  <b>General purpose buckets example bucket policies</b> - See <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-bucket-policies.html\\\">Bucket policy\\n              examples</a> in the <i>Amazon S3 User Guide</i>.</p>\\n               <p>\\n                  <b>Directory bucket example bucket policies</b> - See <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-security-iam-example-bucket-policies.html\\\">Example\\n              bucket policies for S3 Express One Zone</a> in the <i>Amazon S3 User Guide</i>.</p>\\n            </dd>\\n            <dt>HTTP Host header syntax</dt>\\n            <dd>\\n               <p>\\n                  <b>Directory buckets </b> - The HTTP Host header syntax is <code>s3express-control.<i>region-code</i>.amazonaws.com</code>.</p>\\n            </dd>\\n         </dl>\\n         <p>The following operations are related to <code>PutBucketPolicy</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateBucket.html\\\">CreateBucket</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucket.html\\\">DeleteBucket</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#examples\": [\n          {\n            \"title\": \"Set bucket policy\",\n            \"documentation\": \"The following example sets a permission policy on a bucket.\",\n            \"input\": {\n              \"Bucket\": \"examplebucket\",\n              \"Policy\": \"{\\\"Version\\\": \\\"2012-10-17\\\", \\\"Statement\\\": [{ \\\"Sid\\\": \\\"id-1\\\",\\\"Effect\\\": \\\"Allow\\\",\\\"Principal\\\": {\\\"AWS\\\": \\\"arn:aws:iam::123456789012:root\\\"}, \\\"Action\\\": [ \\\"s3:PutObject\\\",\\\"s3:PutObjectAcl\\\"], \\\"Resource\\\": [\\\"arn:aws:s3:::acl3/*\\\" ] } ]}\"\n            }\n          }\n        ],\n        \"smithy.api#http\": {\n          \"method\": \"PUT\",\n          \"uri\": \"/{Bucket}?policy\",\n          \"code\": 200\n        },\n        \"smithy.rules#staticContextParams\": {\n          \"UseS3ExpressControlEndpoint\": {\n            \"value\": true\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#PutBucketPolicyRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the bucket.</p>\\n         <p>\\n            <b>Directory buckets </b> - When you use this operation with a directory bucket, you must use path-style requests in the format <code>https://s3express-control.<i>region-code</i>.amazonaws.com/<i>bucket-name</i>\\n            </code>. Virtual-hosted-style requests aren't supported. Directory bucket names must be unique in the chosen Zone (Availability Zone or Local Zone). Bucket names must also follow the format <code>\\n               <i>bucket-base-name</i>--<i>zone-id</i>--x-s3</code> (for example, <code>\\n               <i>DOC-EXAMPLE-BUCKET</i>--<i>usw2-az1</i>--x-s3</code>). For information about bucket naming restrictions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-bucket-naming-rules.html\\\">Directory bucket naming rules</a> in the <i>Amazon S3 User Guide</i>\\n         </p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"ContentMD5\": {\n          \"target\": \"com.amazonaws.s3#ContentMD5\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The MD5 hash of the request body.</p>\\n         <p>For requests made using the Amazon Web Services Command Line Interface (CLI) or Amazon Web Services SDKs, this field is calculated automatically.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"Content-MD5\"\n          }\n        },\n        \"ChecksumAlgorithm\": {\n          \"target\": \"com.amazonaws.s3#ChecksumAlgorithm\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Indicates the algorithm used to create the checksum for the request when you use the SDK. This header will not provide any\\n    additional functionality if you don't use the SDK. When you send this header, there must be a corresponding <code>x-amz-checksum-<i>algorithm</i>\\n            </code> or\\n    <code>x-amz-trailer</code> header sent. Otherwise, Amazon S3 fails the request with the HTTP status code <code>400 Bad Request</code>.</p>\\n         <p>For the <code>x-amz-checksum-<i>algorithm</i>\\n            </code> header, replace <code>\\n               <i>algorithm</i>\\n            </code> with the supported algorithm from the following list: </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>CRC32</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>CRC32C</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>CRC64NVME</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>SHA1</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>SHA256</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>For more\\n    information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking object integrity</a> in\\n    the <i>Amazon S3 User Guide</i>.</p>\\n         <p>If the individual checksum value you provide through <code>x-amz-checksum-<i>algorithm</i>\\n            </code> doesn't match the checksum algorithm you set through <code>x-amz-sdk-checksum-algorithm</code>, Amazon S3 fails the request with a <code>BadDigest</code> error.</p>\\n         <note>\\n            <p>For directory buckets, when you use Amazon Web Services SDKs, <code>CRC32</code> is the default checksum algorithm that's used for performance.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-sdk-checksum-algorithm\"\n          }\n        },\n        \"ConfirmRemoveSelfBucketAccess\": {\n          \"target\": \"com.amazonaws.s3#ConfirmRemoveSelfBucketAccess\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Set this parameter to true to confirm that you want to remove your permissions to change this bucket\\n      policy in the future.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-confirm-remove-self-bucket-access\"\n          }\n        },\n        \"Policy\": {\n          \"target\": \"com.amazonaws.s3#Policy\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The bucket policy as a JSON document.</p>\\n         <p>For directory buckets, the only IAM action supported in the bucket policy is\\n        <code>s3express:CreateSession</code>.</p>\",\n            \"smithy.api#httpPayload\": {},\n            \"smithy.api#required\": {}\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\\n         <note>\\n            <p>For directory buckets, this header is not supported in this API operation. If you specify this header, the request fails with the HTTP status code \\n<code>501 Not Implemented</code>.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#PutBucketReplication\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#PutBucketReplicationRequest\"\n      },\n      \"output\": {\n        \"target\": \"smithy.api#Unit\"\n      },\n      \"traits\": {\n        \"aws.protocols#httpChecksum\": {\n          \"requestAlgorithmMember\": \"ChecksumAlgorithm\",\n          \"requestChecksumRequired\": true\n        },\n        \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported for directory buckets.</p>\\n         </note>\\n         <p> Creates a replication configuration or replaces an existing one. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/replication.html\\\">Replication</a> in the\\n        <i>Amazon S3 User Guide</i>. </p>\\n         <p>Specify the replication configuration in the request body. In the replication configuration, you\\n      provide the name of the destination bucket or buckets where you want Amazon S3 to replicate objects, the\\n      IAM role that Amazon S3 can assume to replicate objects on your behalf, and other relevant information. You\\n      can invoke this request for a specific Amazon Web Services Region by using the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-requestedregion\\\">\\n               <code>aws:RequestedRegion</code>\\n            </a> condition key.</p>\\n         <p>A replication configuration must include at least one rule, and can contain a maximum of 1,000. Each\\n      rule identifies a subset of objects to replicate by filtering the objects in the source bucket. To\\n      choose additional subsets of objects to replicate, add a rule for each subset.</p>\\n         <p>To specify a subset of the objects in the source bucket to apply a replication rule to, add the\\n      Filter element as a child of the Rule element. You can filter objects based on an object key prefix, one\\n      or more object tags, or both. When you add the Filter element in the configuration, you must also add\\n      the following elements: <code>DeleteMarkerReplication</code>, <code>Status</code>, and\\n        <code>Priority</code>.</p>\\n         <note>\\n            <p>If you are using an earlier version of the replication configuration, Amazon S3 handles replication of\\n        delete markers differently. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/replication-add-config.html#replication-backward-compat-considerations\\\">Backward Compatibility</a>.</p>\\n         </note>\\n         <p>For information about enabling versioning on a bucket, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/Versioning.html\\\">Using Versioning</a>.</p>\\n         <dl>\\n            <dt>Handling Replication of Encrypted Objects</dt>\\n            <dd>\\n               <p>By default, Amazon S3 doesn't replicate objects that are stored at rest using server-side\\n            encryption with KMS keys. To replicate Amazon Web Services KMS-encrypted objects, add the following:\\n              <code>SourceSelectionCriteria</code>, <code>SseKmsEncryptedObjects</code>, <code>Status</code>,\\n              <code>EncryptionConfiguration</code>, and <code>ReplicaKmsKeyID</code>. For information about\\n            replication configuration, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/replication-config-for-kms-objects.html\\\">Replicating Objects Created\\n              with SSE Using KMS keys</a>.</p>\\n               <p>For information on <code>PutBucketReplication</code> errors, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html#ReplicationErrorCodeList\\\">List of\\n              replication-related error codes</a>\\n               </p>\\n            </dd>\\n            <dt>Permissions</dt>\\n            <dd>\\n               <p>To create a <code>PutBucketReplication</code> request, you must have\\n              <code>s3:PutReplicationConfiguration</code> permissions for the bucket.\\n            \\n          </p>\\n               <p>By default, a resource owner, in this case the Amazon Web Services account that created the bucket, can\\n            perform this operation. The resource owner can also grant others permissions to perform the\\n            operation. For more information about permissions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/using-with-s3-actions.html\\\">Specifying Permissions in a Policy</a>\\n            and <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html\\\">Managing\\n              Access Permissions to Your Amazon S3 Resources</a>.</p>\\n               <note>\\n                  <p>To perform this operation, the user or role performing the action must have the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_passrole.html\\\">iam:PassRole</a> permission.</p>\\n               </note>\\n            </dd>\\n         </dl>\\n         <p>The following operations are related to <code>PutBucketReplication</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketReplication.html\\\">GetBucketReplication</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketReplication.html\\\">DeleteBucketReplication</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#examples\": [\n          {\n            \"title\": \"Set replication configuration on a bucket\",\n            \"documentation\": \"The following example sets replication configuration on a bucket.\",\n            \"input\": {\n              \"Bucket\": \"examplebucket\",\n              \"ReplicationConfiguration\": {\n                \"Role\": \"arn:aws:iam::123456789012:role/examplerole\",\n                \"Rules\": [\n                  {\n                    \"Prefix\": \"\",\n                    \"Status\": \"Enabled\",\n                    \"Destination\": {\n                      \"Bucket\": \"arn:aws:s3:::destinationbucket\",\n                      \"StorageClass\": \"STANDARD\"\n                    }\n                  }\n                ]\n              }\n            }\n          }\n        ],\n        \"smithy.api#http\": {\n          \"method\": \"PUT\",\n          \"uri\": \"/{Bucket}?replication\",\n          \"code\": 200\n        },\n        \"smithy.rules#staticContextParams\": {\n          \"UseS3ExpressControlEndpoint\": {\n            \"value\": true\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#PutBucketReplicationRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the bucket</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"ContentMD5\": {\n          \"target\": \"com.amazonaws.s3#ContentMD5\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Base64 encoded 128-bit <code>MD5</code> digest of the data. You must use this header as a\\n      message integrity check to verify that the request body was not corrupted in transit. For more\\n      information, see <a href=\\\"http://www.ietf.org/rfc/rfc1864.txt\\\">RFC 1864</a>.</p>\\n         <p>For requests made using the Amazon Web Services Command Line Interface (CLI) or Amazon Web Services SDKs, this field is calculated automatically.</p>\",\n            \"smithy.api#httpHeader\": \"Content-MD5\"\n          }\n        },\n        \"ChecksumAlgorithm\": {\n          \"target\": \"com.amazonaws.s3#ChecksumAlgorithm\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Indicates the algorithm used to create the checksum for the request when you use the SDK. This header will not provide any\\n    additional functionality if you don't use the SDK. When you send this header, there must be a corresponding <code>x-amz-checksum</code> or\\n    <code>x-amz-trailer</code> header sent. Otherwise, Amazon S3 fails the request with the HTTP status code <code>400 Bad Request</code>. For more\\n    information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking object integrity</a> in\\n    the <i>Amazon S3 User Guide</i>.</p>\\n         <p>If you provide an individual checksum, Amazon S3 ignores any provided <code>ChecksumAlgorithm</code>\\n      parameter.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-sdk-checksum-algorithm\"\n          }\n        },\n        \"ReplicationConfiguration\": {\n          \"target\": \"com.amazonaws.s3#ReplicationConfiguration\",\n          \"traits\": {\n            \"smithy.api#httpPayload\": {},\n            \"smithy.api#required\": {},\n            \"smithy.api#xmlName\": \"ReplicationConfiguration\"\n          }\n        },\n        \"Token\": {\n          \"target\": \"com.amazonaws.s3#ObjectLockToken\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A token to allow Object Lock to be enabled for an existing bucket.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-bucket-object-lock-token\"\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#PutBucketRequestPayment\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#PutBucketRequestPaymentRequest\"\n      },\n      \"output\": {\n        \"target\": \"smithy.api#Unit\"\n      },\n      \"traits\": {\n        \"aws.protocols#httpChecksum\": {\n          \"requestAlgorithmMember\": \"ChecksumAlgorithm\",\n          \"requestChecksumRequired\": true\n        },\n        \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported for directory buckets.</p>\\n         </note>\\n         <p>Sets the request payment configuration for a bucket. By default, the bucket owner pays for downloads\\n      from the bucket. This configuration parameter enables the bucket owner (only) to specify that the person\\n      requesting the download will be charged for the download. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/RequesterPaysBuckets.html\\\">Requester Pays\\n        Buckets</a>.</p>\\n         <p>The following operations are related to <code>PutBucketRequestPayment</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateBucket.html\\\">CreateBucket</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketRequestPayment.html\\\">GetBucketRequestPayment</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#examples\": [\n          {\n            \"title\": \"Set request payment configuration on a bucket.\",\n            \"documentation\": \"The following example sets request payment configuration on a bucket so that person requesting the download is charged.\",\n            \"input\": {\n              \"Bucket\": \"examplebucket\",\n              \"RequestPaymentConfiguration\": {\n                \"Payer\": \"Requester\"\n              }\n            }\n          }\n        ],\n        \"smithy.api#http\": {\n          \"method\": \"PUT\",\n          \"uri\": \"/{Bucket}?requestPayment\",\n          \"code\": 200\n        },\n        \"smithy.rules#staticContextParams\": {\n          \"UseS3ExpressControlEndpoint\": {\n            \"value\": true\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#PutBucketRequestPaymentRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The bucket name.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"ContentMD5\": {\n          \"target\": \"com.amazonaws.s3#ContentMD5\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Base64 encoded 128-bit <code>MD5</code> digest of the data. You must use this header as a\\n      message integrity check to verify that the request body was not corrupted in transit. For more\\n      information, see <a href=\\\"http://www.ietf.org/rfc/rfc1864.txt\\\">RFC 1864</a>.</p>\\n         <p>For requests made using the Amazon Web Services Command Line Interface (CLI) or Amazon Web Services SDKs, this field is calculated automatically.</p>\",\n            \"smithy.api#httpHeader\": \"Content-MD5\"\n          }\n        },\n        \"ChecksumAlgorithm\": {\n          \"target\": \"com.amazonaws.s3#ChecksumAlgorithm\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Indicates the algorithm used to create the checksum for the request when you use the SDK. This header will not provide any\\n    additional functionality if you don't use the SDK. When you send this header, there must be a corresponding <code>x-amz-checksum</code> or\\n    <code>x-amz-trailer</code> header sent. Otherwise, Amazon S3 fails the request with the HTTP status code <code>400 Bad Request</code>. For more\\n    information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking object integrity</a> in\\n    the <i>Amazon S3 User Guide</i>.</p>\\n         <p>If you provide an individual checksum, Amazon S3 ignores any provided <code>ChecksumAlgorithm</code>\\n      parameter.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-sdk-checksum-algorithm\"\n          }\n        },\n        \"RequestPaymentConfiguration\": {\n          \"target\": \"com.amazonaws.s3#RequestPaymentConfiguration\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Container for Payer.</p>\",\n            \"smithy.api#httpPayload\": {},\n            \"smithy.api#required\": {},\n            \"smithy.api#xmlName\": \"RequestPaymentConfiguration\"\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#PutBucketTagging\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#PutBucketTaggingRequest\"\n      },\n      \"output\": {\n        \"target\": \"smithy.api#Unit\"\n      },\n      \"traits\": {\n        \"aws.protocols#httpChecksum\": {\n          \"requestAlgorithmMember\": \"ChecksumAlgorithm\",\n          \"requestChecksumRequired\": true\n        },\n        \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported for directory buckets.</p>\\n         </note>\\n         <p>Sets the tags for a general purpose bucket if attribute based access control (ABAC) is not enabled for the bucket. When you <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/buckets-tagging-enable-abac.html\\\">enable ABAC for a general purpose bucket</a>, you can no longer use this operation for that bucket and must use the <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_TagResource.html\\\">TagResource</a> or <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_UntagResource.html\\\">UntagResource</a> operations instead.</p>\\n         <p>Use tags to organize your Amazon Web Services bill to reflect your own cost structure. To do this, sign up to get\\n      your Amazon Web Services account bill with tag key values included. Then, to see the cost of combined resources,\\n      organize your billing information according to resources with the same tag key values. For example, you\\n      can tag several resources with a specific application name, and then organize your billing information\\n      to see the total cost of that application across several services. For more information, see <a href=\\\"https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/cost-alloc-tags.html\\\">Cost Allocation and\\n        Tagging</a> and <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/CostAllocTagging.html\\\">Using Cost Allocation in Amazon S3 Bucket Tags</a>.</p>\\n         <note>\\n            <p> When this operation sets the tags for a bucket, it will overwrite any current tags the bucket\\n        already has. You cannot use this operation to add tags to an existing list of tags.</p>\\n         </note>\\n         <p>To use this operation, you must have permissions to perform the <code>s3:PutBucketTagging</code>\\n      action. The bucket owner has this permission by default and can grant this permission to others. For\\n      more information about permissions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-with-s3-actions.html#using-with-s3-actions-related-to-bucket-subresources\\\">Permissions Related to Bucket Subresource Operations</a> and <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html\\\">Managing Access Permissions to Your Amazon S3\\n        Resources</a>.</p>\\n         <p>\\n            <code>PutBucketTagging</code> has the following special errors. For more Amazon S3 errors see, <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html\\\">Error Responses</a>.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>InvalidTag</code> - The tag provided was not a valid tag. This error can occur if\\n          the tag did not pass input validation. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/CostAllocTagging.html\\\">Using Cost Allocation in Amazon S3 Bucket\\n            Tags</a>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>MalformedXML</code> - The XML provided does not match the schema.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>OperationAborted</code> - A conflicting conditional action is currently in progress\\n          against this resource. Please try again.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>InternalError</code> - The service was unable to apply the provided tag to the\\n          bucket.</p>\\n            </li>\\n         </ul>\\n         <p>The following operations are related to <code>PutBucketTagging</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketTagging.html\\\">GetBucketTagging</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketTagging.html\\\">DeleteBucketTagging</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#examples\": [\n          {\n            \"title\": \"Set tags on a bucket\",\n            \"documentation\": \"The following example sets tags on a bucket. Any existing tags are replaced.\",\n            \"input\": {\n              \"Bucket\": \"examplebucket\",\n              \"Tagging\": {\n                \"TagSet\": [\n                  {\n                    \"Key\": \"Key1\",\n                    \"Value\": \"Value1\"\n                  },\n                  {\n                    \"Key\": \"Key2\",\n                    \"Value\": \"Value2\"\n                  }\n                ]\n              }\n            }\n          }\n        ],\n        \"smithy.api#http\": {\n          \"method\": \"PUT\",\n          \"uri\": \"/{Bucket}?tagging\",\n          \"code\": 200\n        },\n        \"smithy.rules#staticContextParams\": {\n          \"UseS3ExpressControlEndpoint\": {\n            \"value\": true\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#PutBucketTaggingRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The bucket name.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"ContentMD5\": {\n          \"target\": \"com.amazonaws.s3#ContentMD5\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Base64 encoded 128-bit <code>MD5</code> digest of the data. You must use this header as a\\n      message integrity check to verify that the request body was not corrupted in transit. For more\\n      information, see <a href=\\\"http://www.ietf.org/rfc/rfc1864.txt\\\">RFC 1864</a>.</p>\\n         <p>For requests made using the Amazon Web Services Command Line Interface (CLI) or Amazon Web Services SDKs, this field is calculated automatically.</p>\",\n            \"smithy.api#httpHeader\": \"Content-MD5\"\n          }\n        },\n        \"ChecksumAlgorithm\": {\n          \"target\": \"com.amazonaws.s3#ChecksumAlgorithm\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Indicates the algorithm used to create the checksum for the request when you use the SDK. This header will not provide any\\n    additional functionality if you don't use the SDK. When you send this header, there must be a corresponding <code>x-amz-checksum</code> or\\n    <code>x-amz-trailer</code> header sent. Otherwise, Amazon S3 fails the request with the HTTP status code <code>400 Bad Request</code>. For more\\n    information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking object integrity</a> in\\n    the <i>Amazon S3 User Guide</i>.</p>\\n         <p>If you provide an individual checksum, Amazon S3 ignores any provided <code>ChecksumAlgorithm</code>\\n      parameter.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-sdk-checksum-algorithm\"\n          }\n        },\n        \"Tagging\": {\n          \"target\": \"com.amazonaws.s3#Tagging\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Container for the <code>TagSet</code> and <code>Tag</code> elements.</p>\",\n            \"smithy.api#httpPayload\": {},\n            \"smithy.api#required\": {},\n            \"smithy.api#xmlName\": \"Tagging\"\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#PutBucketVersioning\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#PutBucketVersioningRequest\"\n      },\n      \"output\": {\n        \"target\": \"smithy.api#Unit\"\n      },\n      \"traits\": {\n        \"aws.protocols#httpChecksum\": {\n          \"requestAlgorithmMember\": \"ChecksumAlgorithm\",\n          \"requestChecksumRequired\": true\n        },\n        \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported for directory buckets.</p>\\n         </note>\\n         <note>\\n            <p>When you enable versioning on a bucket for the first time, it might take a short amount of time\\n        for the change to be fully propagated. While this change is propagating, you might encounter\\n        intermittent <code>HTTP 404 NoSuchKey</code> errors for requests to objects created or updated after\\n        enabling versioning. We recommend that you wait for 15 minutes after enabling versioning before\\n        issuing write operations (<code>PUT</code> or <code>DELETE</code>) on objects in the bucket. </p>\\n         </note>\\n         <p>Sets the versioning state of an existing bucket.</p>\\n         <p>You can set the versioning state with one of the following values:</p>\\n         <p>\\n            <b>Enabled</b>—Enables versioning for the objects in the bucket. All\\n      objects added to the bucket receive a unique version ID.</p>\\n         <p>\\n            <b>Suspended</b>—Disables versioning for the objects in the bucket. All\\n      objects added to the bucket receive the version ID null.</p>\\n         <p>If the versioning state has never been set on a bucket, it has no versioning state; a <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketVersioning.html\\\">GetBucketVersioning</a> request does not return a versioning state value.</p>\\n         <p>In order to enable MFA Delete, you must be the bucket owner. If you are the bucket owner and want to\\n      enable MFA Delete in the bucket versioning configuration, you must include the <code>x-amz-mfa\\n        request</code> header and the <code>Status</code> and the <code>MfaDelete</code> request elements in a\\n      request to set the versioning state of the bucket.</p>\\n         <important>\\n            <p>If you have an object expiration lifecycle configuration in your non-versioned bucket and you want\\n        to maintain the same permanent delete behavior when you enable versioning, you must add a noncurrent\\n        expiration policy. The noncurrent expiration lifecycle configuration will manage the deletes of the\\n        noncurrent object versions in the version-enabled bucket. (A version-enabled bucket maintains one\\n        current and zero or more noncurrent object versions.) For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/object-lifecycle-mgmt.html#lifecycle-and-other-bucket-config\\\">Lifecycle and\\n          Versioning</a>.</p>\\n         </important>\\n         <p>The following operations are related to <code>PutBucketVersioning</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateBucket.html\\\">CreateBucket</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucket.html\\\">DeleteBucket</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketVersioning.html\\\">GetBucketVersioning</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#examples\": [\n          {\n            \"title\": \"Set versioning configuration on a bucket\",\n            \"documentation\": \"The following example sets versioning configuration on bucket. The configuration enables versioning on the bucket.\",\n            \"input\": {\n              \"Bucket\": \"examplebucket\",\n              \"VersioningConfiguration\": {\n                \"MFADelete\": \"Disabled\",\n                \"Status\": \"Enabled\"\n              }\n            }\n          }\n        ],\n        \"smithy.api#http\": {\n          \"method\": \"PUT\",\n          \"uri\": \"/{Bucket}?versioning\",\n          \"code\": 200\n        },\n        \"smithy.rules#staticContextParams\": {\n          \"UseS3ExpressControlEndpoint\": {\n            \"value\": true\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#PutBucketVersioningRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The bucket name.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"ContentMD5\": {\n          \"target\": \"com.amazonaws.s3#ContentMD5\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>>The Base64 encoded 128-bit <code>MD5</code> digest of the data. You must use this header as a\\n      message integrity check to verify that the request body was not corrupted in transit. For more\\n      information, see <a href=\\\"http://www.ietf.org/rfc/rfc1864.txt\\\">RFC 1864</a>.</p>\\n         <p>For requests made using the Amazon Web Services Command Line Interface (CLI) or Amazon Web Services SDKs, this field is calculated automatically.</p>\",\n            \"smithy.api#httpHeader\": \"Content-MD5\"\n          }\n        },\n        \"ChecksumAlgorithm\": {\n          \"target\": \"com.amazonaws.s3#ChecksumAlgorithm\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Indicates the algorithm used to create the checksum for the request when you use the SDK. This header will not provide any\\n    additional functionality if you don't use the SDK. When you send this header, there must be a corresponding <code>x-amz-checksum</code> or\\n    <code>x-amz-trailer</code> header sent. Otherwise, Amazon S3 fails the request with the HTTP status code <code>400 Bad Request</code>. For more\\n    information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking object integrity</a> in\\n    the <i>Amazon S3 User Guide</i>.</p>\\n         <p>If you provide an individual checksum, Amazon S3 ignores any provided <code>ChecksumAlgorithm</code>\\n      parameter.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-sdk-checksum-algorithm\"\n          }\n        },\n        \"MFA\": {\n          \"target\": \"com.amazonaws.s3#MFA\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The concatenation of the authentication device's serial number, a space, and the value that is displayed on your authentication device. The serial number is the number that uniquely identifies the MFA device. For physical MFA devices, this is the unique serial number that's provided with the device. For virtual MFA devices, the serial number is the device ARN. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/manage-versioning-examples.html\\\">Enabling versioning on buckets</a> and <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/MultiFactorAuthenticationDelete.html\\\">Configuring MFA delete</a> in the <i>Amazon Simple Storage Service User Guide</i>.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-mfa\"\n          }\n        },\n        \"VersioningConfiguration\": {\n          \"target\": \"com.amazonaws.s3#VersioningConfiguration\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Container for setting the versioning state.</p>\",\n            \"smithy.api#httpPayload\": {},\n            \"smithy.api#required\": {},\n            \"smithy.api#xmlName\": \"VersioningConfiguration\"\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#PutBucketWebsite\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#PutBucketWebsiteRequest\"\n      },\n      \"output\": {\n        \"target\": \"smithy.api#Unit\"\n      },\n      \"traits\": {\n        \"aws.protocols#httpChecksum\": {\n          \"requestAlgorithmMember\": \"ChecksumAlgorithm\",\n          \"requestChecksumRequired\": true\n        },\n        \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported for directory buckets.</p>\\n         </note>\\n         <p>Sets the configuration of the website that is specified in the <code>website</code> subresource. To\\n      configure a bucket as a website, you can add this subresource on the bucket with website configuration\\n      information such as the file name of the index document and any redirect rules. For more information,\\n      see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/WebsiteHosting.html\\\">Hosting Websites on\\n        Amazon S3</a>.</p>\\n         <p>This PUT action requires the <code>S3:PutBucketWebsite</code> permission. By default, only the\\n      bucket owner can configure the website attached to a bucket; however, bucket owners can allow other\\n      users to set the website configuration by writing a bucket policy that grants them the\\n        <code>S3:PutBucketWebsite</code> permission.</p>\\n         <p>To redirect all website requests sent to the bucket's website endpoint, you add a website\\n      configuration with the following elements. Because all requests are sent to another website, you don't\\n      need to provide index document name for the bucket.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>WebsiteConfiguration</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>RedirectAllRequestsTo</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>HostName</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>Protocol</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>If you want granular control over redirects, you can use the following elements to add routing rules\\n      that describe conditions for redirecting requests and information about the redirect destination. In\\n      this case, the website configuration must provide an index document for the bucket, because some\\n      requests might not be redirected. </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>WebsiteConfiguration</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>IndexDocument</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>Suffix</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ErrorDocument</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>Key</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>RoutingRules</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>RoutingRule</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>Condition</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>HttpErrorCodeReturnedEquals</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>KeyPrefixEquals</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>Redirect</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>Protocol</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>HostName</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ReplaceKeyPrefixWith</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ReplaceKeyWith</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>HttpRedirectCode</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>Amazon S3 has a limitation of 50 routing rules per website configuration. If you require more than 50\\n      routing rules, you can use object redirect. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/how-to-page-redirect.html\\\">Configuring an Object Redirect</a> in the\\n        <i>Amazon S3 User Guide</i>.</p>\\n         <p>The maximum request length is limited to 128 KB.</p>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#examples\": [\n          {\n            \"title\": \"Set website configuration on a bucket\",\n            \"documentation\": \"The following example adds website configuration to a bucket.\",\n            \"input\": {\n              \"Bucket\": \"examplebucket\",\n              \"ContentMD5\": \"\",\n              \"WebsiteConfiguration\": {\n                \"IndexDocument\": {\n                  \"Suffix\": \"index.html\"\n                },\n                \"ErrorDocument\": {\n                  \"Key\": \"error.html\"\n                }\n              }\n            }\n          }\n        ],\n        \"smithy.api#http\": {\n          \"method\": \"PUT\",\n          \"uri\": \"/{Bucket}?website\",\n          \"code\": 200\n        },\n        \"smithy.rules#staticContextParams\": {\n          \"UseS3ExpressControlEndpoint\": {\n            \"value\": true\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#PutBucketWebsiteRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The bucket name.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"ContentMD5\": {\n          \"target\": \"com.amazonaws.s3#ContentMD5\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Base64 encoded 128-bit <code>MD5</code> digest of the data. You must use this header as a\\n      message integrity check to verify that the request body was not corrupted in transit. For more\\n      information, see <a href=\\\"http://www.ietf.org/rfc/rfc1864.txt\\\">RFC 1864</a>.</p>\\n         <p>For requests made using the Amazon Web Services Command Line Interface (CLI) or Amazon Web Services SDKs, this field is calculated automatically.</p>\",\n            \"smithy.api#httpHeader\": \"Content-MD5\"\n          }\n        },\n        \"ChecksumAlgorithm\": {\n          \"target\": \"com.amazonaws.s3#ChecksumAlgorithm\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Indicates the algorithm used to create the checksum for the request when you use the SDK. This header will not provide any\\n    additional functionality if you don't use the SDK. When you send this header, there must be a corresponding <code>x-amz-checksum</code> or\\n    <code>x-amz-trailer</code> header sent. Otherwise, Amazon S3 fails the request with the HTTP status code <code>400 Bad Request</code>. For more\\n    information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking object integrity</a> in\\n    the <i>Amazon S3 User Guide</i>.</p>\\n         <p>If you provide an individual checksum, Amazon S3 ignores any provided <code>ChecksumAlgorithm</code>\\n      parameter.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-sdk-checksum-algorithm\"\n          }\n        },\n        \"WebsiteConfiguration\": {\n          \"target\": \"com.amazonaws.s3#WebsiteConfiguration\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Container for the request.</p>\",\n            \"smithy.api#httpPayload\": {},\n            \"smithy.api#required\": {},\n            \"smithy.api#xmlName\": \"WebsiteConfiguration\"\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#PutObject\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#PutObjectRequest\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.s3#PutObjectOutput\"\n      },\n      \"errors\": [\n        {\n          \"target\": \"com.amazonaws.s3#EncryptionTypeMismatch\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#InvalidRequest\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#InvalidWriteOffset\"\n        },\n        {\n          \"target\": \"com.amazonaws.s3#TooManyParts\"\n        }\n      ],\n      \"traits\": {\n        \"aws.protocols#httpChecksum\": {\n          \"requestAlgorithmMember\": \"ChecksumAlgorithm\"\n        },\n        \"smithy.api#documentation\": \"<important>\\n            <p>End of support notice: As of October 1, 2025, Amazon S3 has discontinued support for Email Grantee Access Control Lists (ACLs). If you attempt to use an Email Grantee ACL in a request after October 1, 2025, \\n the request will receive an <code>HTTP 405</code> (Method Not Allowed) error.</p>\\n            <p>This change affects the following Amazon Web Services Regions: US East (N. Virginia), US West (N. California), US West (Oregon), Asia Pacific (Singapore), Asia Pacific (Sydney), Asia Pacific (Tokyo), Europe (Ireland), and South America (São Paulo).</p>\\n         </important>\\n         <p>Adds an object to a bucket.</p>\\n         <note>\\n            <ul>\\n               <li>\\n                  <p>Amazon S3 never adds partial objects; if you receive a success response, Amazon S3 added the entire\\n            object to the bucket. You cannot use <code>PutObject</code> to only update a single piece of\\n            metadata for an existing object. You must put the entire object with updated metadata if you want\\n            to update some values.</p>\\n               </li>\\n               <li>\\n                  <p>If your bucket uses the bucket owner enforced setting for Object Ownership, ACLs are disabled\\n            and no longer affect permissions. All objects written to the bucket by any account will be owned\\n            by the bucket owner.</p>\\n               </li>\\n               <li>\\n                  <p>\\n                     <b>Directory buckets</b> - For directory buckets, you must make requests for this API operation to the Zonal endpoint. These endpoints support virtual-hosted-style requests in the format <code>https://<i>amzn-s3-demo-bucket</i>.s3express-<i>zone-id</i>.<i>region-code</i>.amazonaws.com/<i>key-name</i>\\n                     </code>. Path-style requests are not supported. For more information about endpoints in Availability Zones, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/endpoint-directory-buckets-AZ.html\\\">Regional and Zonal endpoints for directory buckets in Availability Zones</a> in the\\n    <i>Amazon S3 User Guide</i>. For more information about endpoints in Local Zones, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-lzs-for-directory-buckets.html\\\">Concepts for directory buckets in Local Zones</a> in the\\n    <i>Amazon S3 User Guide</i>.</p>\\n               </li>\\n            </ul>\\n         </note>\\n         <p>Amazon S3 is a distributed system. If it receives multiple write requests for the same object\\n      simultaneously, it overwrites all but the last object written. However, Amazon S3 provides features that can\\n      modify this behavior:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <b>S3 Object Lock</b> - To prevent objects from being deleted\\n          or overwritten, you can use <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lock.html\\\">Amazon S3 Object Lock</a> in the <i>Amazon S3 User Guide</i>.</p>\\n               <note>\\n                  <p>This functionality is not supported for directory buckets.</p>\\n               </note>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>If-None-Match</b> - Uploads the object only if the object\\n          key name does not already exist in the specified bucket. Otherwise, Amazon S3 returns a <code>412\\n            Precondition Failed</code> error. If a conflicting operation occurs during the upload, S3 returns\\n          a <code>409 ConditionalRequestConflict</code> response. On a 409 failure, retry the upload.</p>\\n               <p>Expects the * character (asterisk).</p>\\n               <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/conditional-requests.html\\\">Add preconditions to S3 operations with\\n            conditional requests</a> in the <i>Amazon S3 User Guide</i> or <a href=\\\"https://datatracker.ietf.org/doc/rfc7232/\\\">RFC 7232</a>. </p>\\n               <note>\\n                  <p>This functionality is not supported for S3 on Outposts.</p>\\n               </note>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>S3 Versioning</b> - When you enable versioning for a bucket,\\n          if Amazon S3 receives multiple write requests for the same object simultaneously, it stores all versions\\n          of the objects. For each write request that is made to the same object, Amazon S3 automatically generates\\n          a unique version ID of that object being stored in Amazon S3. You can retrieve, replace, or delete any\\n          version of the object. For more information about versioning, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/AddingObjectstoVersioningEnabledBuckets.html\\\">Adding Objects to\\n            Versioning-Enabled Buckets</a> in the <i>Amazon S3 User Guide</i>. For information\\n          about returning the versioning state of a bucket, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketVersioning.html\\\">GetBucketVersioning</a>. </p>\\n               <note>\\n                  <p>This functionality is not supported for directory buckets.</p>\\n               </note>\\n            </li>\\n         </ul>\\n         <dl>\\n            <dt>Permissions</dt>\\n            <dd>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <b>General purpose bucket permissions</b> - The following\\n                permissions are required in your policies when your <code>PutObject</code> request includes\\n                specific headers.</p>\\n                     <ul>\\n                        <li>\\n                           <p>\\n                              <b>\\n                                 <code>s3:PutObject</code>\\n                              </b> - To successfully\\n                    complete the <code>PutObject</code> request, you must always have the\\n                      <code>s3:PutObject</code> permission on a bucket to add an object to it.</p>\\n                        </li>\\n                        <li>\\n                           <p>\\n                              <b>\\n                                 <code>s3:PutObjectAcl</code>\\n                              </b> - To successfully change the objects ACL of your <code>PutObject</code>\\n                    request, you must have the <code>s3:PutObjectAcl</code>.</p>\\n                        </li>\\n                        <li>\\n                           <p>\\n                              <b>\\n                                 <code>s3:PutObjectTagging</code>\\n                              </b> - To successfully set the tag-set with your <code>PutObject</code>\\n                    request, you must have the <code>s3:PutObjectTagging</code>.</p>\\n                        </li>\\n                     </ul>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <b>Directory bucket permissions</b> - To grant access to this API operation on a directory bucket, we recommend that you use the <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateSession.html\\\">\\n                           <code>CreateSession</code>\\n                        </a> API operation for session-based authorization. Specifically, you grant the <code>s3express:CreateSession</code> permission to the directory bucket in a bucket policy or an IAM identity-based policy. Then, you make the <code>CreateSession</code> API call on the bucket to obtain a session token. With the session token in your request header, you can make API requests to this operation. After the session token expires, you make another <code>CreateSession</code> API call to generate a new session token for use. \\nAmazon Web Services CLI or SDKs create session and refresh the session token automatically to avoid service interruptions when a session expires. For more information about authorization, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateSession.html\\\">\\n                           <code>CreateSession</code>\\n                        </a>.</p>\\n                     <p>If the object is encrypted with SSE-KMS, you must also have the\\n                  <code>kms:GenerateDataKey</code> and <code>kms:Decrypt</code> permissions in IAM\\n                identity-based policies and KMS key policies for the KMS key.</p>\\n                  </li>\\n               </ul>\\n            </dd>\\n            <dt>Data integrity with Content-MD5</dt>\\n            <dd>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <b>General purpose bucket</b> - To ensure that data is not\\n                corrupted traversing the network, use the <code>Content-MD5</code> header. When you use this\\n                header, Amazon S3 checks the object against the provided MD5 value and, if they do not match, Amazon S3\\n                returns an error. Alternatively, when the object's ETag is its MD5 digest, you can calculate\\n                the MD5 while putting the object to Amazon S3 and compare the returned ETag to the calculated MD5\\n                value.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <b>Directory bucket</b> -\\n                This functionality is not supported for directory buckets.</p>\\n                  </li>\\n               </ul>\\n            </dd>\\n            <dt>HTTP Host header syntax</dt>\\n            <dd>\\n               <p>\\n                  <b>Directory buckets </b> - The HTTP Host header syntax is <code>\\n                     <i>Bucket-name</i>.s3express-<i>zone-id</i>.<i>region-code</i>.amazonaws.com</code>.</p>\\n            </dd>\\n         </dl>\\n         <p>For more information about related Amazon S3 APIs, see the following:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html\\\">CopyObject</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObject.html\\\">DeleteObject</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#examples\": [\n          {\n            \"title\": \"To create an object.\",\n            \"documentation\": \"The following example creates an object. If the bucket is versioning enabled, S3 returns version ID in response.\",\n            \"input\": {\n              \"Body\": \"filetoupload\",\n              \"Bucket\": \"examplebucket\",\n              \"Key\": \"objectkey\"\n            },\n            \"output\": {\n              \"VersionId\": \"Bvq0EDKxOcXLJXNo_Lkz37eM3R4pfzyQ\",\n              \"ETag\": \"\\\"6805f2cfc46c0f04559748bb039d69ae\\\"\"\n            }\n          },\n          {\n            \"title\": \"To upload an object (specify optional headers)\",\n            \"documentation\": \"The following example uploads an object. The request specifies optional request headers to directs S3 to use specific storage class and use server-side encryption.\",\n            \"input\": {\n              \"Body\": \"HappyFace.jpg\",\n              \"Bucket\": \"examplebucket\",\n              \"Key\": \"HappyFace.jpg\",\n              \"ServerSideEncryption\": \"AES256\",\n              \"StorageClass\": \"STANDARD_IA\"\n            },\n            \"output\": {\n              \"VersionId\": \"CG612hodqujkf8FaaNfp8U..FIhLROcp\",\n              \"ETag\": \"\\\"6805f2cfc46c0f04559748bb039d69ae\\\"\",\n              \"ServerSideEncryption\": \"AES256\"\n            }\n          },\n          {\n            \"title\": \"To upload an object\",\n            \"documentation\": \"The following example uploads an object to a versioning-enabled bucket. The source file is specified using Windows file syntax. S3 returns VersionId of the newly created object.\",\n            \"input\": {\n              \"Body\": \"HappyFace.jpg\",\n              \"Bucket\": \"examplebucket\",\n              \"Key\": \"HappyFace.jpg\"\n            },\n            \"output\": {\n              \"VersionId\": \"tpf3zF08nBplQK1XLOefGskR7mGDwcDk\",\n              \"ETag\": \"\\\"6805f2cfc46c0f04559748bb039d69ae\\\"\"\n            }\n          },\n          {\n            \"title\": \"To upload an object and specify canned ACL.\",\n            \"documentation\": \"The following example uploads and object. The request specifies optional canned ACL (access control list) to all READ access to authenticated users. If the bucket is versioning enabled, S3 returns version ID in response.\",\n            \"input\": {\n              \"ACL\": \"authenticated-read\",\n              \"Body\": \"filetoupload\",\n              \"Bucket\": \"examplebucket\",\n              \"Key\": \"exampleobject\"\n            },\n            \"output\": {\n              \"VersionId\": \"Kirh.unyZwjQ69YxcQLA8z4F5j3kJJKr\",\n              \"ETag\": \"\\\"6805f2cfc46c0f04559748bb039d69ae\\\"\"\n            }\n          },\n          {\n            \"title\": \"To upload an object and specify optional tags\",\n            \"documentation\": \"The following example uploads an object. The request specifies optional object tags. The bucket is versioned, therefore S3 returns version ID of the newly created object.\",\n            \"input\": {\n              \"Body\": \"c:\\\\HappyFace.jpg\",\n              \"Bucket\": \"examplebucket\",\n              \"Key\": \"HappyFace.jpg\",\n              \"Tagging\": \"key1=value1&key2=value2\"\n            },\n            \"output\": {\n              \"VersionId\": \"psM2sYY4.o1501dSx8wMvnkOzSBB.V4a\",\n              \"ETag\": \"\\\"6805f2cfc46c0f04559748bb039d69ae\\\"\"\n            }\n          },\n          {\n            \"title\": \"To upload an object and specify server-side encryption and object tags\",\n            \"documentation\": \"The following example uploads an object. The request specifies the optional server-side encryption option. The request also specifies optional object tags. If the bucket is versioning enabled, S3 returns version ID in response.\",\n            \"input\": {\n              \"Body\": \"filetoupload\",\n              \"Bucket\": \"examplebucket\",\n              \"Key\": \"exampleobject\",\n              \"ServerSideEncryption\": \"AES256\",\n              \"Tagging\": \"key1=value1&key2=value2\"\n            },\n            \"output\": {\n              \"VersionId\": \"Ri.vC6qVlA4dEnjgRV4ZHsHoFIjqEMNt\",\n              \"ETag\": \"\\\"6805f2cfc46c0f04559748bb039d69ae\\\"\",\n              \"ServerSideEncryption\": \"AES256\"\n            }\n          },\n          {\n            \"title\": \"To upload object and specify user-defined metadata\",\n            \"documentation\": \"The following example creates an object. The request also specifies optional metadata. If the bucket is versioning enabled, S3 returns version ID in response.\",\n            \"input\": {\n              \"Body\": \"filetoupload\",\n              \"Bucket\": \"examplebucket\",\n              \"Key\": \"exampleobject\",\n              \"Metadata\": {\n                \"metadata1\": \"value1\",\n                \"metadata2\": \"value2\"\n              }\n            },\n            \"output\": {\n              \"VersionId\": \"pSKidl4pHBiNwukdbcPXAIs.sshFFOc0\",\n              \"ETag\": \"\\\"6805f2cfc46c0f04559748bb039d69ae\\\"\"\n            }\n          }\n        ],\n        \"smithy.api#http\": {\n          \"method\": \"PUT\",\n          \"uri\": \"/{Bucket}/{Key+}?x-id=PutObject\",\n          \"code\": 200\n        }\n      }\n    },\n    \"com.amazonaws.s3#PutObjectAcl\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#PutObjectAclRequest\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.s3#PutObjectAclOutput\"\n      },\n      \"errors\": [\n        {\n          \"target\": \"com.amazonaws.s3#NoSuchKey\"\n        }\n      ],\n      \"traits\": {\n        \"aws.protocols#httpChecksum\": {\n          \"requestAlgorithmMember\": \"ChecksumAlgorithm\",\n          \"requestChecksumRequired\": true\n        },\n        \"smithy.api#documentation\": \"<important>\\n            <p>End of support notice: As of October 1, 2025, Amazon S3 has discontinued support for Email Grantee Access Control Lists (ACLs). If you attempt to use an Email Grantee ACL in a request after October 1, 2025, \\n the request will receive an <code>HTTP 405</code> (Method Not Allowed) error.</p>\\n            <p>This change affects the following Amazon Web Services Regions: US East (N. Virginia), US West (N. California), US West (Oregon), Asia Pacific (Singapore), Asia Pacific (Sydney), Asia Pacific (Tokyo), Europe (Ireland), and South America (São Paulo).</p>\\n         </important>\\n         <note>\\n            <p>This operation is not supported for directory buckets.</p>\\n         </note>\\n         <p>Uses the <code>acl</code> subresource to set the access control list (ACL) permissions for a new or\\n      existing object in an S3 bucket. You must have the <code>WRITE_ACP</code> permission to set the ACL of\\n      an object. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html#permissions\\\">What permissions can I grant?</a> in the\\n        <i>Amazon S3 User Guide</i>.</p>\\n         <p>This functionality is not supported for Amazon S3 on Outposts.</p>\\n         <p>Depending on your application needs, you can choose to set the ACL on an object using either the\\n      request body or the headers. For example, if you have an existing application that updates a bucket ACL\\n      using the request body, you can continue to use that approach. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html\\\">Access Control List (ACL)\\n        Overview</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <important>\\n            <p>If your bucket uses the bucket owner enforced setting for S3 Object Ownership, ACLs are disabled\\n        and no longer affect permissions. You must use policies to grant access to your bucket and the objects\\n        in it. Requests to set ACLs or update ACLs fail and return the\\n          <code>AccessControlListNotSupported</code> error code. Requests to read ACLs are still supported.\\n        For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/about-object-ownership.html\\\">Controlling object ownership</a> in\\n        the <i>Amazon S3 User Guide</i>.</p>\\n         </important>\\n         <dl>\\n            <dt>Permissions</dt>\\n            <dd>\\n               <p>You can set access permissions using one of the following methods:</p>\\n               <ul>\\n                  <li>\\n                     <p>Specify a canned ACL with the <code>x-amz-acl</code> request header. Amazon S3 supports a set\\n                of predefined ACLs, known as canned ACLs. Each canned ACL has a predefined set of grantees and\\n                permissions. Specify the canned ACL name as the value of <code>x-amz-ac</code>l. If you use\\n                this header, you cannot use other access control-specific headers in your request. For more\\n                information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html#CannedACL\\\">Canned ACL</a>.</p>\\n                  </li>\\n                  <li>\\n                     <p>Specify access permissions explicitly with the <code>x-amz-grant-read</code>,\\n                  <code>x-amz-grant-read-acp</code>, <code>x-amz-grant-write-acp</code>, and\\n                  <code>x-amz-grant-full-control</code> headers. When using these headers, you specify\\n                explicit access permissions and grantees (Amazon Web Services accounts or Amazon S3 groups) who will receive the\\n                permission. If you use these ACL-specific headers, you cannot use <code>x-amz-acl</code>\\n                header to set a canned ACL. These parameters map to the set of permissions that Amazon S3 supports\\n                in an ACL. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html\\\">Access Control List (ACL)\\n                Overview</a>.</p>\\n                     <p>You specify each grantee as a type=value pair, where the type is one of the\\n                following:</p>\\n                     <ul>\\n                        <li>\\n                           <p>\\n                              <code>id</code> – if the value specified is the canonical user ID of an\\n                    Amazon Web Services account</p>\\n                        </li>\\n                        <li>\\n                           <p>\\n                              <code>uri</code> – if you are granting permissions to a predefined group</p>\\n                        </li>\\n                        <li>\\n                           <p>\\n                              <code>emailAddress</code> – if the value specified is the email address of an\\n                    Amazon Web Services account</p>\\n                           <note>\\n                              <p>Using email addresses to specify a grantee is only supported in the following Amazon Web Services Regions: </p>\\n                              <ul>\\n                                 <li>\\n                                    <p>US East (N. Virginia)</p>\\n                                 </li>\\n                                 <li>\\n                                    <p>US West (N. California)</p>\\n                                 </li>\\n                                 <li>\\n                                    <p> US West (Oregon)</p>\\n                                 </li>\\n                                 <li>\\n                                    <p> Asia Pacific (Singapore)</p>\\n                                 </li>\\n                                 <li>\\n                                    <p>Asia Pacific (Sydney)</p>\\n                                 </li>\\n                                 <li>\\n                                    <p>Asia Pacific (Tokyo)</p>\\n                                 </li>\\n                                 <li>\\n                                    <p>Europe (Ireland)</p>\\n                                 </li>\\n                                 <li>\\n                                    <p>South America (São Paulo)</p>\\n                                 </li>\\n                              </ul>\\n                              <p>For a list of all the Amazon S3 supported Regions and endpoints, see <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region\\\">Regions and Endpoints</a> in the Amazon Web Services General Reference.</p>\\n                           </note>\\n                        </li>\\n                     </ul>\\n                     <p>For example, the following <code>x-amz-grant-read</code> header grants list objects\\n                permission to the two Amazon Web Services accounts identified by their email addresses.</p>\\n                     <p>\\n                        <code>x-amz-grant-read: emailAddress=\\\"xyz@amazon.com\\\", emailAddress=\\\"abc@amazon.com\\\"\\n                </code>\\n                     </p>\\n                  </li>\\n               </ul>\\n               <p>You can use either a canned ACL or specify access permissions explicitly. You cannot do\\n            both.</p>\\n            </dd>\\n            <dt>Grantee Values</dt>\\n            <dd>\\n               <p>You can specify the person (grantee) to whom you're assigning access rights (using request\\n            elements) in the following ways. For examples of how to specify these grantee values in JSON\\n            format, see the Amazon Web Services CLI example in <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/enable-server-access-logging.html\\\"> Enabling Amazon S3 server\\n              access logging</a> in the <i>Amazon S3 User Guide</i>.</p>\\n               <ul>\\n                  <li>\\n                     <p>By the person's ID:</p>\\n                     <p>\\n                        <code><Grantee xmlns:xsi=\\\"http://www.w3.org/2001/XMLSchema-instance\\\"\\n                  xsi:type=\\\"CanonicalUser\\\"><ID><>ID<></ID><DisplayName><>GranteesEmail<></DisplayName>\\n                  </Grantee></code>\\n                     </p>\\n                     <p>DisplayName is optional and ignored in the request.</p>\\n                  </li>\\n                  <li>\\n                     <p>By URI:</p>\\n                     <p>\\n                        <code><Grantee xmlns:xsi=\\\"http://www.w3.org/2001/XMLSchema-instance\\\"\\n                  xsi:type=\\\"Group\\\"><URI><>http://acs.amazonaws.com/groups/global/AuthenticatedUsers<></URI></Grantee></code>\\n                     </p>\\n                  </li>\\n                  <li>\\n                     <p>By Email address:</p>\\n                     <p>\\n                        <code><Grantee xmlns:xsi=\\\"http://www.w3.org/2001/XMLSchema-instance\\\"\\n                  xsi:type=\\\"AmazonCustomerByEmail\\\"><EmailAddress><>Grantees@email.com<></EmailAddress>lt;/Grantee></code>\\n                     </p>\\n                     <p>The grantee is resolved to the CanonicalUser and, in a response to a GET Object acl\\n                request, appears as the CanonicalUser.</p>\\n                     <note>\\n                        <p>Using email addresses to specify a grantee is only supported in the following Amazon Web Services Regions: </p>\\n                        <ul>\\n                           <li>\\n                              <p>US East (N. Virginia)</p>\\n                           </li>\\n                           <li>\\n                              <p>US West (N. California)</p>\\n                           </li>\\n                           <li>\\n                              <p> US West (Oregon)</p>\\n                           </li>\\n                           <li>\\n                              <p> Asia Pacific (Singapore)</p>\\n                           </li>\\n                           <li>\\n                              <p>Asia Pacific (Sydney)</p>\\n                           </li>\\n                           <li>\\n                              <p>Asia Pacific (Tokyo)</p>\\n                           </li>\\n                           <li>\\n                              <p>Europe (Ireland)</p>\\n                           </li>\\n                           <li>\\n                              <p>South America (São Paulo)</p>\\n                           </li>\\n                        </ul>\\n                        <p>For a list of all the Amazon S3 supported Regions and endpoints, see <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/rande.html#s3_region\\\">Regions and Endpoints</a> in the Amazon Web Services General Reference.</p>\\n                     </note>\\n                  </li>\\n               </ul>\\n            </dd>\\n            <dt>Versioning</dt>\\n            <dd>\\n               <p>The ACL of an object is set at the object version level. By default, PUT sets the ACL of the\\n            current version of an object. To set the ACL of a different version, use the\\n              <code>versionId</code> subresource.</p>\\n            </dd>\\n         </dl>\\n         <p>The following operations are related to <code>PutObjectAcl</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html\\\">CopyObject</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html\\\">GetObject</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#examples\": [\n          {\n            \"title\": \"To grant permissions using object ACL\",\n            \"documentation\": \"The following example adds grants to an object ACL. The first permission grants user1 and user2 FULL_CONTROL and the AllUsers group READ permission.\",\n            \"input\": {\n              \"AccessControlPolicy\": {},\n              \"Bucket\": \"examplebucket\",\n              \"GrantFullControl\": \"emailaddress=user1@example.com,emailaddress=user2@example.com\",\n              \"GrantRead\": \"uri=http://acs.amazonaws.com/groups/global/AllUsers\",\n              \"Key\": \"HappyFace.jpg\"\n            },\n            \"output\": {}\n          }\n        ],\n        \"smithy.api#http\": {\n          \"method\": \"PUT\",\n          \"uri\": \"/{Bucket}/{Key+}?acl\",\n          \"code\": 200\n        }\n      }\n    },\n    \"com.amazonaws.s3#PutObjectAclOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"RequestCharged\": {\n          \"target\": \"com.amazonaws.s3#RequestCharged\",\n          \"traits\": {\n            \"smithy.api#httpHeader\": \"x-amz-request-charged\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#output\": {}\n      }\n    },\n    \"com.amazonaws.s3#PutObjectAclRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"ACL\": {\n          \"target\": \"com.amazonaws.s3#ObjectCannedACL\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The canned ACL to apply to the object. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html#CannedACL\\\">Canned ACL</a>.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-acl\"\n          }\n        },\n        \"AccessControlPolicy\": {\n          \"target\": \"com.amazonaws.s3#AccessControlPolicy\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Contains the elements that set the ACL permissions for an object per grantee.</p>\",\n            \"smithy.api#httpPayload\": {},\n            \"smithy.api#xmlName\": \"AccessControlPolicy\"\n          }\n        },\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The bucket name that contains the object to which you want to attach the ACL. </p>\\n         <p>\\n            <b>Access points</b> - When you use this action with an access point for general purpose buckets, you must provide the alias of the access point in place of the bucket name or specify the access point ARN. When you use this action with an access point for directory buckets, you must provide the access point name in place of the bucket name. When using the access point ARN, you must direct requests to the access point hostname. The access point hostname takes the form <i>AccessPointName</i>-<i>AccountId</i>.s3-accesspoint.<i>Region</i>.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html\\\">Using access points</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <p>\\n            <b>S3 on Outposts</b> - When you use this action with S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the \\n                     form <code>\\n               <i>AccessPointName</i>-<i>AccountId</i>.<i>outpostID</i>.s3-outposts.<i>Region</i>.amazonaws.com</code>. When you use this action with S3 on Outposts, the destination bucket must be the Outposts access point ARN or the access point alias. For more information about S3 on Outposts, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html\\\">What is S3 on Outposts?</a> in the <i>Amazon S3 User Guide</i>.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"ContentMD5\": {\n          \"target\": \"com.amazonaws.s3#ContentMD5\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Base64 encoded 128-bit <code>MD5</code> digest of the data. This header must be used as a\\n      message integrity check to verify that the request body was not corrupted in transit. For more\\n      information, go to <a href=\\\"http://www.ietf.org/rfc/rfc1864.txt\\\">RFC 1864.></a>\\n         </p>\\n         <p>For requests made using the Amazon Web Services Command Line Interface (CLI) or Amazon Web Services SDKs, this field is calculated automatically.</p>\",\n            \"smithy.api#httpHeader\": \"Content-MD5\"\n          }\n        },\n        \"ChecksumAlgorithm\": {\n          \"target\": \"com.amazonaws.s3#ChecksumAlgorithm\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Indicates the algorithm used to create the checksum for the object when you use the SDK. This header will not provide any\\n    additional functionality if you don't use the SDK. When you send this header, there must be a corresponding <code>x-amz-checksum</code> or\\n    <code>x-amz-trailer</code> header sent. Otherwise, Amazon S3 fails the request with the HTTP status code <code>400 Bad Request</code>. For more\\n    information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking object integrity</a> in\\n    the <i>Amazon S3 User Guide</i>.</p>\\n         <p>If you provide an individual checksum, Amazon S3 ignores any provided <code>ChecksumAlgorithm</code>\\n      parameter.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-sdk-checksum-algorithm\"\n          }\n        },\n        \"GrantFullControl\": {\n          \"target\": \"com.amazonaws.s3#GrantFullControl\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Allows grantee the read, write, read ACP, and write ACP permissions on the bucket.</p>\\n         <p>This functionality is not supported for Amazon S3 on Outposts.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-grant-full-control\"\n          }\n        },\n        \"GrantRead\": {\n          \"target\": \"com.amazonaws.s3#GrantRead\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Allows grantee to list the objects in the bucket.</p>\\n         <p>This functionality is not supported for Amazon S3 on Outposts.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-grant-read\"\n          }\n        },\n        \"GrantReadACP\": {\n          \"target\": \"com.amazonaws.s3#GrantReadACP\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Allows grantee to read the bucket ACL.</p>\\n         <p>This functionality is not supported for Amazon S3 on Outposts.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-grant-read-acp\"\n          }\n        },\n        \"GrantWrite\": {\n          \"target\": \"com.amazonaws.s3#GrantWrite\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Allows grantee to create new objects in the bucket.</p>\\n         <p>For the bucket and object owners of existing objects, also allows deletions and overwrites of those\\n      objects.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-grant-write\"\n          }\n        },\n        \"GrantWriteACP\": {\n          \"target\": \"com.amazonaws.s3#GrantWriteACP\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Allows grantee to write the ACL for the applicable bucket.</p>\\n         <p>This functionality is not supported for Amazon S3 on Outposts.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-grant-write-acp\"\n          }\n        },\n        \"Key\": {\n          \"target\": \"com.amazonaws.s3#ObjectKey\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Key for which the PUT action was initiated.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Key\"\n            }\n          }\n        },\n        \"RequestPayer\": {\n          \"target\": \"com.amazonaws.s3#RequestPayer\",\n          \"traits\": {\n            \"smithy.api#httpHeader\": \"x-amz-request-payer\"\n          }\n        },\n        \"VersionId\": {\n          \"target\": \"com.amazonaws.s3#ObjectVersionId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Version ID used to reference a specific version of the object.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpQuery\": \"versionId\"\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#PutObjectLegalHold\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#PutObjectLegalHoldRequest\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.s3#PutObjectLegalHoldOutput\"\n      },\n      \"traits\": {\n        \"aws.protocols#httpChecksum\": {\n          \"requestAlgorithmMember\": \"ChecksumAlgorithm\",\n          \"requestChecksumRequired\": true\n        },\n        \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported for directory buckets.</p>\\n         </note>\\n         <p>Applies a legal hold configuration to the specified object. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/object-lock.html\\\">Locking Objects</a>.</p>\\n         <p>This functionality is not supported for Amazon S3 on Outposts.</p>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#http\": {\n          \"method\": \"PUT\",\n          \"uri\": \"/{Bucket}/{Key+}?legal-hold\",\n          \"code\": 200\n        }\n      }\n    },\n    \"com.amazonaws.s3#PutObjectLegalHoldOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"RequestCharged\": {\n          \"target\": \"com.amazonaws.s3#RequestCharged\",\n          \"traits\": {\n            \"smithy.api#httpHeader\": \"x-amz-request-charged\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#output\": {}\n      }\n    },\n    \"com.amazonaws.s3#PutObjectLegalHoldRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The bucket name containing the object that you want to place a legal hold on. </p>\\n         <p>\\n            <b>Access points</b> - When you use this action with an access point for general purpose buckets, you must provide the alias of the access point in place of the bucket name or specify the access point ARN. When you use this action with an access point for directory buckets, you must provide the access point name in place of the bucket name. When using the access point ARN, you must direct requests to the access point hostname. The access point hostname takes the form <i>AccessPointName</i>-<i>AccountId</i>.s3-accesspoint.<i>Region</i>.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html\\\">Using access points</a> in the <i>Amazon S3 User Guide</i>.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"Key\": {\n          \"target\": \"com.amazonaws.s3#ObjectKey\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The key name for the object that you want to place a legal hold on.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {}\n          }\n        },\n        \"LegalHold\": {\n          \"target\": \"com.amazonaws.s3#ObjectLockLegalHold\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Container element for the legal hold configuration you want to apply to the specified object.</p>\",\n            \"smithy.api#httpPayload\": {},\n            \"smithy.api#xmlName\": \"LegalHold\"\n          }\n        },\n        \"RequestPayer\": {\n          \"target\": \"com.amazonaws.s3#RequestPayer\",\n          \"traits\": {\n            \"smithy.api#httpHeader\": \"x-amz-request-payer\"\n          }\n        },\n        \"VersionId\": {\n          \"target\": \"com.amazonaws.s3#ObjectVersionId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The version ID of the object that you want to place a legal hold on.</p>\",\n            \"smithy.api#httpQuery\": \"versionId\"\n          }\n        },\n        \"ContentMD5\": {\n          \"target\": \"com.amazonaws.s3#ContentMD5\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The MD5 hash for the request body.</p>\\n         <p>For requests made using the Amazon Web Services Command Line Interface (CLI) or Amazon Web Services SDKs, this field is calculated automatically.</p>\",\n            \"smithy.api#httpHeader\": \"Content-MD5\"\n          }\n        },\n        \"ChecksumAlgorithm\": {\n          \"target\": \"com.amazonaws.s3#ChecksumAlgorithm\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Indicates the algorithm used to create the checksum for the object when you use the SDK. This header will not provide any\\n    additional functionality if you don't use the SDK. When you send this header, there must be a corresponding <code>x-amz-checksum</code> or\\n    <code>x-amz-trailer</code> header sent. Otherwise, Amazon S3 fails the request with the HTTP status code <code>400 Bad Request</code>. For more\\n    information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking object integrity</a> in\\n    the <i>Amazon S3 User Guide</i>.</p>\\n         <p>If you provide an individual checksum, Amazon S3 ignores any provided <code>ChecksumAlgorithm</code>\\n      parameter.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-sdk-checksum-algorithm\"\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#PutObjectLockConfiguration\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#PutObjectLockConfigurationRequest\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.s3#PutObjectLockConfigurationOutput\"\n      },\n      \"traits\": {\n        \"aws.protocols#httpChecksum\": {\n          \"requestAlgorithmMember\": \"ChecksumAlgorithm\",\n          \"requestChecksumRequired\": true\n        },\n        \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported for directory buckets.</p>\\n         </note>\\n         <p>Places an Object Lock configuration on the specified bucket. The rule specified in the Object Lock\\n      configuration will be applied by default to every new object placed in the specified bucket. For more\\n      information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/object-lock.html\\\">Locking\\n        Objects</a>. </p>\\n         <note>\\n            <ul>\\n               <li>\\n                  <p>The <code>DefaultRetention</code> settings require both a mode and a period.</p>\\n               </li>\\n               <li>\\n                  <p>The <code>DefaultRetention</code> period can be either <code>Days</code> or <code>Years</code>\\n            but you must select one. You cannot specify <code>Days</code> and <code>Years</code> at the same\\n            time.</p>\\n               </li>\\n               <li>\\n                  <p>You can enable Object Lock for new or existing buckets. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lock-configure.html\\\">Configuring\\n              Object Lock</a>.</p>\\n               </li>\\n            </ul>\\n         </note>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#http\": {\n          \"method\": \"PUT\",\n          \"uri\": \"/{Bucket}?object-lock\",\n          \"code\": 200\n        }\n      }\n    },\n    \"com.amazonaws.s3#PutObjectLockConfigurationOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"RequestCharged\": {\n          \"target\": \"com.amazonaws.s3#RequestCharged\",\n          \"traits\": {\n            \"smithy.api#httpHeader\": \"x-amz-request-charged\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#output\": {}\n      }\n    },\n    \"com.amazonaws.s3#PutObjectLockConfigurationRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The bucket whose Object Lock configuration you want to create or replace.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"ObjectLockConfiguration\": {\n          \"target\": \"com.amazonaws.s3#ObjectLockConfiguration\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Object Lock configuration that you want to apply to the specified bucket.</p>\",\n            \"smithy.api#httpPayload\": {},\n            \"smithy.api#xmlName\": \"ObjectLockConfiguration\"\n          }\n        },\n        \"RequestPayer\": {\n          \"target\": \"com.amazonaws.s3#RequestPayer\",\n          \"traits\": {\n            \"smithy.api#httpHeader\": \"x-amz-request-payer\"\n          }\n        },\n        \"Token\": {\n          \"target\": \"com.amazonaws.s3#ObjectLockToken\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A token to allow Object Lock to be enabled for an existing bucket.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-bucket-object-lock-token\"\n          }\n        },\n        \"ContentMD5\": {\n          \"target\": \"com.amazonaws.s3#ContentMD5\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The MD5 hash for the request body.</p>\\n         <p>For requests made using the Amazon Web Services Command Line Interface (CLI) or Amazon Web Services SDKs, this field is calculated automatically.</p>\",\n            \"smithy.api#httpHeader\": \"Content-MD5\"\n          }\n        },\n        \"ChecksumAlgorithm\": {\n          \"target\": \"com.amazonaws.s3#ChecksumAlgorithm\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Indicates the algorithm used to create the checksum for the object when you use the SDK. This header will not provide any\\n    additional functionality if you don't use the SDK. When you send this header, there must be a corresponding <code>x-amz-checksum</code> or\\n    <code>x-amz-trailer</code> header sent. Otherwise, Amazon S3 fails the request with the HTTP status code <code>400 Bad Request</code>. For more\\n    information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking object integrity</a> in\\n    the <i>Amazon S3 User Guide</i>.</p>\\n         <p>If you provide an individual checksum, Amazon S3 ignores any provided <code>ChecksumAlgorithm</code>\\n      parameter.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-sdk-checksum-algorithm\"\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#PutObjectOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Expiration\": {\n          \"target\": \"com.amazonaws.s3#Expiration\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>If the expiration is configured for the object (see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketLifecycleConfiguration.html\\\">PutBucketLifecycleConfiguration</a>) in the <i>Amazon S3 User Guide</i>, the response\\n      includes this header. It includes the <code>expiry-date</code> and <code>rule-id</code> key-value pairs\\n      that provide information about object expiration. The value of the <code>rule-id</code> is\\n      URL-encoded.</p>\\n         <note>\\n            <p>Object expiration information is not returned in directory buckets and this header returns the\\n        value \\\"<code>NotImplemented</code>\\\" in all responses for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-expiration\"\n          }\n        },\n        \"ETag\": {\n          \"target\": \"com.amazonaws.s3#ETag\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Entity tag for the uploaded object.</p>\\n         <p>\\n            <b>General purpose buckets </b> - To ensure that data is not corrupted\\n      traversing the network, for objects where the ETag is the MD5 digest of the object, you can calculate\\n      the MD5 while putting an object to Amazon S3 and compare the returned ETag to the calculated MD5\\n      value.</p>\\n         <p>\\n            <b>Directory buckets </b> - The ETag for the object in a\\n      directory bucket isn't the MD5 digest of the object.</p>\",\n            \"smithy.api#httpHeader\": \"ETag\"\n          }\n        },\n        \"ChecksumCRC32\": {\n          \"target\": \"com.amazonaws.s3#ChecksumCRC32\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Base64 encoded, 32-bit <code>CRC32 checksum</code> of the object. This checksum is only present if the checksum was uploaded\\n    with the object. When you use an API operation on an object that was uploaded using multipart uploads, this value may not be a direct checksum value of the full object. Instead, it's a calculation based on the checksum values of each individual part. For more information about how checksums are calculated\\n    with multipart uploads, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html#large-object-checksums\\\">\\n    Checking object integrity</a> in the <i>Amazon S3 User Guide</i>.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-checksum-crc32\"\n          }\n        },\n        \"ChecksumCRC32C\": {\n          \"target\": \"com.amazonaws.s3#ChecksumCRC32C\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Base64 encoded, 32-bit <code>CRC32C</code> checksum of the object. This checksum is only present if the checksum was uploaded\\n    with the object. When you use an API operation on an object that was uploaded using multipart uploads, this value may not be a direct checksum value of the full object. Instead, it's a calculation based on the checksum values of each individual part. For more information about how checksums are calculated\\n    with multipart uploads, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html#large-object-checksums\\\">\\n    Checking object integrity</a> in the <i>Amazon S3 User Guide</i>.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-checksum-crc32c\"\n          }\n        },\n        \"ChecksumCRC64NVME\": {\n          \"target\": \"com.amazonaws.s3#ChecksumCRC64NVME\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Base64 encoded, 64-bit <code>CRC64NVME</code> checksum of the object. This header is present if\\n      the object was uploaded with the <code>CRC64NVME</code> checksum algorithm, or if it was uploaded\\n      without a checksum (and Amazon S3 added the default checksum, <code>CRC64NVME</code>, to the uploaded\\n      object). For more information about how checksums are calculated with multipart uploads, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking object\\n        integrity in the Amazon S3 User Guide</a>.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-checksum-crc64nvme\"\n          }\n        },\n        \"ChecksumSHA1\": {\n          \"target\": \"com.amazonaws.s3#ChecksumSHA1\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Base64 encoded, 160-bit <code>SHA1</code> digest of the object. This checksum is only present if the checksum was uploaded\\n    with the object. When you use the API operation on an object that was uploaded using multipart uploads, this value may not be a direct checksum value of the full object. Instead, it's a calculation based on the checksum values of each individual part. For more information about how checksums are calculated\\n    with multipart uploads, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html#large-object-checksums\\\">\\n    Checking object integrity</a> in the <i>Amazon S3 User Guide</i>.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-checksum-sha1\"\n          }\n        },\n        \"ChecksumSHA256\": {\n          \"target\": \"com.amazonaws.s3#ChecksumSHA256\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Base64 encoded, 256-bit <code>SHA256</code> digest of the object. This checksum is only present if the checksum was uploaded\\n    with the object. When you use an API operation on an object that was uploaded using multipart uploads, this value may not be a direct checksum value of the full object. Instead, it's a calculation based on the checksum values of each individual part. For more information about how checksums are calculated\\n    with multipart uploads, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html#large-object-checksums\\\">\\n    Checking object integrity</a> in the <i>Amazon S3 User Guide</i>.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-checksum-sha256\"\n          }\n        },\n        \"ChecksumType\": {\n          \"target\": \"com.amazonaws.s3#ChecksumType\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>This header specifies the checksum type of the object, which determines how part-level checksums are\\n      combined to create an object-level checksum for multipart objects. For <code>PutObject</code> uploads,\\n      the checksum type is always <code>FULL_OBJECT</code>. You can use this header as a data integrity check\\n      to verify that the checksum type that is received is the same checksum that was specified. For more\\n      information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking object integrity</a> in\\n      the <i>Amazon S3 User Guide</i>.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-checksum-type\"\n          }\n        },\n        \"ServerSideEncryption\": {\n          \"target\": \"com.amazonaws.s3#ServerSideEncryption\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The server-side encryption algorithm used when you store this object in Amazon S3 or Amazon FSx.</p>\\n         <note>\\n            <p>When accessing data stored in Amazon FSx file systems using S3 access points, the only valid server side\\n        encryption option is <code>aws:fsx</code>.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption\"\n          }\n        },\n        \"VersionId\": {\n          \"target\": \"com.amazonaws.s3#ObjectVersionId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Version ID of the object.</p>\\n         <p>If you enable versioning for a bucket, Amazon S3 automatically generates a unique version ID for the\\n      object being stored. Amazon S3 returns this ID in the response. When you enable versioning for a bucket, if\\n      Amazon S3 receives multiple write requests for the same object simultaneously, it stores all of the objects.\\n      For more information about versioning, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/AddingObjectstoVersioningEnabledBuckets.html\\\">Adding Objects to\\n        Versioning-Enabled Buckets</a> in the <i>Amazon S3 User Guide</i>. For information about\\n      returning the versioning state of a bucket, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketVersioning.html\\\">GetBucketVersioning</a>. </p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-version-id\"\n          }\n        },\n        \"SSECustomerAlgorithm\": {\n          \"target\": \"com.amazonaws.s3#SSECustomerAlgorithm\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>If server-side encryption with a customer-provided encryption key was requested, the response will\\n      include this header to confirm the encryption algorithm that's used.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption-customer-algorithm\"\n          }\n        },\n        \"SSECustomerKeyMD5\": {\n          \"target\": \"com.amazonaws.s3#SSECustomerKeyMD5\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>If server-side encryption with a customer-provided encryption key was requested, the response will\\n      include this header to provide the round-trip message integrity verification of the customer-provided\\n      encryption key.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption-customer-key-MD5\"\n          }\n        },\n        \"SSEKMSKeyId\": {\n          \"target\": \"com.amazonaws.s3#SSEKMSKeyId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>If present, indicates the ID of the KMS key that was used for object encryption.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption-aws-kms-key-id\"\n          }\n        },\n        \"SSEKMSEncryptionContext\": {\n          \"target\": \"com.amazonaws.s3#SSEKMSEncryptionContext\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>If present, indicates the Amazon Web Services KMS Encryption Context to use for object encryption. The value of\\n         this header is a Base64 encoded string of a UTF-8 encoded JSON, which contains the encryption context as key-value pairs. \\n         This value is stored as object metadata and automatically gets\\n         passed on to Amazon Web Services KMS for future <code>GetObject</code> \\n         operations on this object.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption-context\"\n          }\n        },\n        \"BucketKeyEnabled\": {\n          \"target\": \"com.amazonaws.s3#BucketKeyEnabled\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Indicates whether the uploaded object uses an S3 Bucket Key for server-side encryption with\\n      Key Management Service (KMS) keys (SSE-KMS).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption-bucket-key-enabled\"\n          }\n        },\n        \"Size\": {\n          \"target\": \"com.amazonaws.s3#Size\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p> The size of the object in bytes. This value is only be present if you append to an object. </p>\\n         <note>\\n            <p>This functionality is only supported for objects in the Amazon S3 Express One Zone storage class in\\n        directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-object-size\"\n          }\n        },\n        \"RequestCharged\": {\n          \"target\": \"com.amazonaws.s3#RequestCharged\",\n          \"traits\": {\n            \"smithy.api#httpHeader\": \"x-amz-request-charged\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#output\": {}\n      }\n    },\n    \"com.amazonaws.s3#PutObjectRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"ACL\": {\n          \"target\": \"com.amazonaws.s3#ObjectCannedACL\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The canned ACL to apply to the object. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html#CannedACL\\\">Canned ACL</a> in the\\n        <i>Amazon S3 User Guide</i>.</p>\\n         <p>When adding a new object, you can use headers to grant ACL-based permissions to individual\\n      Amazon Web Services accounts or to predefined groups defined by Amazon S3. These permissions are then added to the ACL on\\n      the object. By default, all objects are private. Only the owner has full access control. For more\\n      information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html\\\">Access Control\\n        List (ACL) Overview</a> and <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-using-rest-api.html\\\">Managing ACLs Using the REST API</a> in the\\n        <i>Amazon S3 User Guide</i>.</p>\\n         <p>If the bucket that you're uploading objects to uses the bucket owner enforced setting for S3 Object\\n      Ownership, ACLs are disabled and no longer affect permissions. Buckets that use this setting only accept\\n      PUT requests that don't specify an ACL or PUT requests that specify bucket owner full control ACLs, such\\n      as the <code>bucket-owner-full-control</code> canned ACL or an equivalent form of this ACL expressed in\\n      the XML format. PUT requests that contain other ACLs (for example, custom grants to certain\\n      Amazon Web Services accounts) fail and return a <code>400</code> error with the error code\\n        <code>AccessControlListNotSupported</code>. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/about-object-ownership.html\\\"> Controlling ownership of objects and\\n        disabling ACLs</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <note>\\n            <ul>\\n               <li>\\n                  <p>This functionality is not supported for directory buckets.</p>\\n               </li>\\n               <li>\\n                  <p>This functionality is not supported for Amazon S3 on Outposts.</p>\\n               </li>\\n            </ul>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-acl\"\n          }\n        },\n        \"Body\": {\n          \"target\": \"com.amazonaws.s3#StreamingBlob\",\n          \"traits\": {\n            \"smithy.api#default\": \"\",\n            \"smithy.api#documentation\": \"<p>Object data.</p>\",\n            \"smithy.api#httpPayload\": {}\n          }\n        },\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The bucket name to which the PUT action was initiated. </p>\\n         <p>\\n            <b>Directory buckets</b> - When you use this operation with a directory bucket, you must use virtual-hosted-style requests in the format <code>\\n               <i>Bucket-name</i>.s3express-<i>zone-id</i>.<i>region-code</i>.amazonaws.com</code>. Path-style requests are not supported.  Directory bucket names must be unique in the chosen Zone (Availability Zone or Local Zone). Bucket names must follow the format <code>\\n               <i>bucket-base-name</i>--<i>zone-id</i>--x-s3</code> (for example, <code>\\n               <i>amzn-s3-demo-bucket</i>--<i>usw2-az1</i>--x-s3</code>). For information about bucket naming\\n         restrictions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-bucket-naming-rules.html\\\">Directory bucket naming\\n            rules</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <p>\\n            <b>Access points</b> - When you use this action with an access point for general purpose buckets, you must provide the alias of the access point in place of the bucket name or specify the access point ARN. When you use this action with an access point for directory buckets, you must provide the access point name in place of the bucket name. When using the access point ARN, you must direct requests to the access point hostname. The access point hostname takes the form <i>AccessPointName</i>-<i>AccountId</i>.s3-accesspoint.<i>Region</i>.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html\\\">Using access points</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <note>\\n            <p>Object Lambda access points are not supported by directory buckets.</p>\\n         </note>\\n         <p>\\n            <b>S3 on Outposts</b> - When you use this action with S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the \\n                     form <code>\\n               <i>AccessPointName</i>-<i>AccountId</i>.<i>outpostID</i>.s3-outposts.<i>Region</i>.amazonaws.com</code>. When you use this action with S3 on Outposts, the destination bucket must be the Outposts access point ARN or the access point alias. For more information about S3 on Outposts, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html\\\">What is S3 on Outposts?</a> in the <i>Amazon S3 User Guide</i>.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"CacheControl\": {\n          \"target\": \"com.amazonaws.s3#CacheControl\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Can be used to specify caching behavior along the request/reply chain. For more information, see\\n        <a href=\\\"http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9\\\">http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9</a>.</p>\",\n            \"smithy.api#httpHeader\": \"Cache-Control\"\n          }\n        },\n        \"ContentDisposition\": {\n          \"target\": \"com.amazonaws.s3#ContentDisposition\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies presentational information for the object. For more information, see <a href=\\\"https://www.rfc-editor.org/rfc/rfc6266#section-4\\\">https://www.rfc-editor.org/rfc/rfc6266#section-4</a>.</p>\",\n            \"smithy.api#httpHeader\": \"Content-Disposition\"\n          }\n        },\n        \"ContentEncoding\": {\n          \"target\": \"com.amazonaws.s3#ContentEncoding\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies what content encodings have been applied to the object and thus what decoding mechanisms\\n      must be applied to obtain the media-type referenced by the Content-Type header field. For more\\n      information, see <a href=\\\"https://www.rfc-editor.org/rfc/rfc9110.html#field.content-encoding\\\">https://www.rfc-editor.org/rfc/rfc9110.html#field.content-encoding</a>.</p>\",\n            \"smithy.api#httpHeader\": \"Content-Encoding\"\n          }\n        },\n        \"ContentLanguage\": {\n          \"target\": \"com.amazonaws.s3#ContentLanguage\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The language the content is in.</p>\",\n            \"smithy.api#httpHeader\": \"Content-Language\"\n          }\n        },\n        \"ContentLength\": {\n          \"target\": \"com.amazonaws.s3#ContentLength\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Size of the body in bytes. This parameter is useful when the size of the body cannot be determined\\n      automatically. For more information, see <a href=\\\"https://www.rfc-editor.org/rfc/rfc9110.html#name-content-length\\\">https://www.rfc-editor.org/rfc/rfc9110.html#name-content-length</a>.</p>\",\n            \"smithy.api#httpHeader\": \"Content-Length\"\n          }\n        },\n        \"ContentMD5\": {\n          \"target\": \"com.amazonaws.s3#ContentMD5\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Base64 encoded 128-bit <code>MD5</code> digest of the message (without the headers) according to\\n      RFC 1864. This header can be used as a message integrity check to verify that the data is the same data\\n      that was originally sent. Although it is optional, we recommend using the Content-MD5 mechanism as an\\n      end-to-end integrity check. For more information about REST request authentication, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html\\\">REST\\n      Authentication</a>.</p>\\n         <note>\\n            <p>The <code>Content-MD5</code> or <code>x-amz-sdk-checksum-algorithm</code> header is required for\\n        any request to upload an object with a retention period configured using Amazon S3 Object Lock. For more\\n        information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lock-managing.html#object-lock-put-object\\\">Uploading objects\\n          to an Object Lock enabled bucket </a> in the <i>Amazon S3 User Guide</i>.</p>\\n         </note>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"Content-MD5\"\n          }\n        },\n        \"ContentType\": {\n          \"target\": \"com.amazonaws.s3#ContentType\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A standard MIME type describing the format of the contents. For more information, see <a href=\\\"https://www.rfc-editor.org/rfc/rfc9110.html#name-content-type\\\">https://www.rfc-editor.org/rfc/rfc9110.html#name-content-type</a>.</p>\",\n            \"smithy.api#httpHeader\": \"Content-Type\"\n          }\n        },\n        \"ChecksumAlgorithm\": {\n          \"target\": \"com.amazonaws.s3#ChecksumAlgorithm\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Indicates the algorithm used to create the checksum for the object when you use the SDK. This header will not provide any\\n    additional functionality if you don't use the SDK. When you send this header, there must be a corresponding <code>x-amz-checksum-<i>algorithm</i>\\n            </code> or\\n    <code>x-amz-trailer</code> header sent. Otherwise, Amazon S3 fails the request with the HTTP status code <code>400 Bad Request</code>.</p>\\n         <p>For the <code>x-amz-checksum-<i>algorithm</i>\\n            </code> header, replace <code>\\n               <i>algorithm</i>\\n            </code> with the supported algorithm from the following list: </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>CRC32</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>CRC32C</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>CRC64NVME</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>SHA1</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>SHA256</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>For more\\n    information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking object integrity</a> in\\n    the <i>Amazon S3 User Guide</i>.</p>\\n         <p>If the individual checksum value you provide through <code>x-amz-checksum-<i>algorithm</i>\\n            </code> doesn't match the checksum algorithm you set through <code>x-amz-sdk-checksum-algorithm</code>, Amazon S3 fails the request with a <code>BadDigest</code> error.</p>\\n         <note>\\n            <p>The <code>Content-MD5</code> or <code>x-amz-sdk-checksum-algorithm</code> header is required for\\n        any request to upload an object with a retention period configured using Amazon S3 Object Lock. For more\\n        information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lock-managing.html#object-lock-put-object\\\">Uploading objects\\n          to an Object Lock enabled bucket </a> in the <i>Amazon S3 User Guide</i>.</p>\\n         </note>\\n         <p>For directory buckets, when you use Amazon Web Services SDKs, <code>CRC32</code> is the default checksum algorithm that's used for performance.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-sdk-checksum-algorithm\"\n          }\n        },\n        \"ChecksumCRC32\": {\n          \"target\": \"com.amazonaws.s3#ChecksumCRC32\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>This header can be used as a data integrity check to verify that the data received is the same data that was originally sent.\\n    This header specifies the Base64 encoded, 32-bit <code>CRC32</code> checksum of the object. For more information, see\\n    <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking object integrity</a> in the\\n    <i>Amazon S3 User Guide</i>.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-checksum-crc32\"\n          }\n        },\n        \"ChecksumCRC32C\": {\n          \"target\": \"com.amazonaws.s3#ChecksumCRC32C\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>This header can be used as a data integrity check to verify that the data received is the same data that was originally sent.\\n    This header specifies the Base64 encoded, 32-bit <code>CRC32C</code> checksum of the object. For more information, see\\n    <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking object integrity</a> in the\\n    <i>Amazon S3 User Guide</i>.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-checksum-crc32c\"\n          }\n        },\n        \"ChecksumCRC64NVME\": {\n          \"target\": \"com.amazonaws.s3#ChecksumCRC64NVME\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>This header can be used as a data integrity check to verify that the data received is the same data\\n      that was originally sent. This header specifies the Base64 encoded, 64-bit <code>CRC64NVME</code>\\n      checksum of the object. The <code>CRC64NVME</code> checksum is always a full object checksum. For more\\n      information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking object integrity in the Amazon S3\\n        User Guide</a>.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-checksum-crc64nvme\"\n          }\n        },\n        \"ChecksumSHA1\": {\n          \"target\": \"com.amazonaws.s3#ChecksumSHA1\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>This header can be used as a data integrity check to verify that the data received is the same data that was originally sent.\\n    This header specifies the Base64 encoded, 160-bit <code>SHA1</code> digest of the object. For more information, see\\n    <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking object integrity</a> in the\\n    <i>Amazon S3 User Guide</i>.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-checksum-sha1\"\n          }\n        },\n        \"ChecksumSHA256\": {\n          \"target\": \"com.amazonaws.s3#ChecksumSHA256\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>This header can be used as a data integrity check to verify that the data received is the same data that was originally sent.\\n    This header specifies the Base64 encoded, 256-bit <code>SHA256</code> digest of the object. For more information, see\\n    <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking object integrity</a> in the\\n    <i>Amazon S3 User Guide</i>.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-checksum-sha256\"\n          }\n        },\n        \"Expires\": {\n          \"target\": \"com.amazonaws.s3#Expires\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The date and time at which the object is no longer cacheable. For more information, see <a href=\\\"https://www.rfc-editor.org/rfc/rfc7234#section-5.3\\\">https://www.rfc-editor.org/rfc/rfc7234#section-5.3</a>.</p>\",\n            \"smithy.api#httpHeader\": \"Expires\"\n          }\n        },\n        \"IfMatch\": {\n          \"target\": \"com.amazonaws.s3#IfMatch\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Uploads the object only if the ETag (entity tag) value provided during the WRITE operation matches\\n      the ETag of the object in S3. If the ETag values do not match, the operation returns a <code>412\\n        Precondition Failed</code> error.</p>\\n         <p>If a conflicting operation occurs during the upload S3 returns a <code>409\\n        ConditionalRequestConflict</code> response. On a 409 failure you should fetch the object's ETag and\\n      retry the upload.</p>\\n         <p>Expects the ETag value as a string.</p>\\n         <p>For more information about conditional requests, see <a href=\\\"https://tools.ietf.org/html/rfc7232\\\">RFC 7232</a>, or <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/conditional-requests.html\\\">Conditional requests</a> in the\\n        <i>Amazon S3 User Guide</i>.</p>\",\n            \"smithy.api#httpHeader\": \"If-Match\"\n          }\n        },\n        \"IfNoneMatch\": {\n          \"target\": \"com.amazonaws.s3#IfNoneMatch\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Uploads the object only if the object key name does not already exist in the bucket specified.\\n      Otherwise, Amazon S3 returns a <code>412 Precondition Failed</code> error.</p>\\n         <p>If a conflicting operation occurs during the upload S3 returns a <code>409\\n        ConditionalRequestConflict</code> response. On a 409 failure you should retry the upload.</p>\\n         <p>Expects the '*' (asterisk) character.</p>\\n         <p>For more information about conditional requests, see <a href=\\\"https://tools.ietf.org/html/rfc7232\\\">RFC 7232</a>, or <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/conditional-requests.html\\\">Conditional requests</a> in the\\n        <i>Amazon S3 User Guide</i>.</p>\",\n            \"smithy.api#httpHeader\": \"If-None-Match\"\n          }\n        },\n        \"GrantFullControl\": {\n          \"target\": \"com.amazonaws.s3#GrantFullControl\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Gives the grantee READ, READ_ACP, and WRITE_ACP permissions on the object.</p>\\n         <note>\\n            <ul>\\n               <li>\\n                  <p>This functionality is not supported for directory buckets.</p>\\n               </li>\\n               <li>\\n                  <p>This functionality is not supported for Amazon S3 on Outposts.</p>\\n               </li>\\n            </ul>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-grant-full-control\"\n          }\n        },\n        \"GrantRead\": {\n          \"target\": \"com.amazonaws.s3#GrantRead\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Allows grantee to read the object data and its metadata.</p>\\n         <note>\\n            <ul>\\n               <li>\\n                  <p>This functionality is not supported for directory buckets.</p>\\n               </li>\\n               <li>\\n                  <p>This functionality is not supported for Amazon S3 on Outposts.</p>\\n               </li>\\n            </ul>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-grant-read\"\n          }\n        },\n        \"GrantReadACP\": {\n          \"target\": \"com.amazonaws.s3#GrantReadACP\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Allows grantee to read the object ACL.</p>\\n         <note>\\n            <ul>\\n               <li>\\n                  <p>This functionality is not supported for directory buckets.</p>\\n               </li>\\n               <li>\\n                  <p>This functionality is not supported for Amazon S3 on Outposts.</p>\\n               </li>\\n            </ul>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-grant-read-acp\"\n          }\n        },\n        \"GrantWriteACP\": {\n          \"target\": \"com.amazonaws.s3#GrantWriteACP\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Allows grantee to write the ACL for the applicable object.</p>\\n         <note>\\n            <ul>\\n               <li>\\n                  <p>This functionality is not supported for directory buckets.</p>\\n               </li>\\n               <li>\\n                  <p>This functionality is not supported for Amazon S3 on Outposts.</p>\\n               </li>\\n            </ul>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-grant-write-acp\"\n          }\n        },\n        \"Key\": {\n          \"target\": \"com.amazonaws.s3#ObjectKey\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Object key for which the PUT action was initiated.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Key\"\n            }\n          }\n        },\n        \"WriteOffsetBytes\": {\n          \"target\": \"com.amazonaws.s3#WriteOffsetBytes\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p> Specifies the offset for appending data to existing objects in bytes. The offset must be equal to\\n      the size of the existing object being appended to. If no object exists, setting this header to 0 will\\n      create a new object. </p>\\n         <note>\\n            <p>This functionality is only supported for objects in the Amazon S3 Express One Zone storage class in\\n        directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-write-offset-bytes\"\n          }\n        },\n        \"Metadata\": {\n          \"target\": \"com.amazonaws.s3#Metadata\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A map of metadata to store with the object in S3.</p>\",\n            \"smithy.api#httpPrefixHeaders\": \"x-amz-meta-\"\n          }\n        },\n        \"ServerSideEncryption\": {\n          \"target\": \"com.amazonaws.s3#ServerSideEncryption\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The server-side encryption algorithm that was used when you store this object in Amazon S3 or\\n      Amazon FSx.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <b>General purpose buckets </b> - You have four mutually exclusive\\n          options to protect data using server-side encryption in Amazon S3, depending on how you choose to manage\\n          the encryption keys. Specifically, the encryption key options are Amazon S3 managed keys (SSE-S3),\\n          Amazon Web Services KMS keys (SSE-KMS or DSSE-KMS), and customer-provided keys (SSE-C). Amazon S3 encrypts data with\\n          server-side encryption by using Amazon S3 managed keys (SSE-S3) by default. You can optionally tell Amazon S3\\n          to encrypt data at rest by using server-side encryption with other key options. For more\\n          information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingServerSideEncryption.html\\\">Using Server-Side Encryption</a> in\\n          the <i>Amazon S3 User Guide</i>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>Directory buckets </b> -\\n          For directory buckets, there are only two supported options for server-side encryption: server-side encryption with Amazon S3 managed keys (SSE-S3) (<code>AES256</code>) and server-side encryption with KMS keys (SSE-KMS) (<code>aws:kms</code>). We recommend that the bucket's default encryption uses the desired encryption configuration and you don't override the bucket default encryption in your \\n            <code>CreateSession</code> requests or <code>PUT</code> object requests. Then, new objects \\n are automatically encrypted with the desired encryption settings. For more\\n         information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-serv-side-encryption.html\\\">Protecting data with server-side encryption</a> in the <i>Amazon S3 User Guide</i>. For more information about the encryption overriding behaviors in directory buckets, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-specifying-kms-encryption.html\\\">Specifying server-side encryption with KMS for new object uploads</a>. </p>\\n               <p>In the Zonal endpoint API calls (except <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html\\\">CopyObject</a> and <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html\\\">UploadPartCopy</a>) using the REST API, the encryption request headers must match the encryption settings that are specified in the <code>CreateSession</code> request. \\n                            You can't override the values of the encryption settings (<code>x-amz-server-side-encryption</code>, <code>x-amz-server-side-encryption-aws-kms-key-id</code>, <code>x-amz-server-side-encryption-context</code>, and <code>x-amz-server-side-encryption-bucket-key-enabled</code>) that are specified in the <code>CreateSession</code> request. \\n                            You don't need to explicitly specify these encryption settings values in Zonal endpoint API calls, and   \\n                            Amazon S3 will use the encryption settings values from the <code>CreateSession</code> request to protect new objects in the directory bucket. \\n                           </p>\\n               <note>\\n                  <p>When you use the CLI or the Amazon Web Services SDKs, for <code>CreateSession</code>, the session token refreshes automatically to avoid service interruptions when a session expires. The CLI or the Amazon Web Services SDKs use the bucket's default encryption configuration for the \\n                            <code>CreateSession</code> request. It's not supported to override the encryption settings values in the <code>CreateSession</code> request. \\n                            So in the Zonal endpoint API calls (except <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html\\\">CopyObject</a> and <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html\\\">UploadPartCopy</a>), \\n          the encryption request headers must match the default encryption configuration of the directory bucket.\\n\\n</p>\\n               </note>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>S3 access points for Amazon FSx </b> - When accessing data stored in\\n          Amazon FSx file systems using S3 access points, the only valid server side encryption option is\\n            <code>aws:fsx</code>. All Amazon FSx file systems have encryption configured by default and are\\n          encrypted at rest. Data is automatically encrypted before being written to the file system, and\\n          automatically decrypted as it is read. These processes are handled transparently by Amazon FSx.</p>\\n            </li>\\n         </ul>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption\"\n          }\n        },\n        \"StorageClass\": {\n          \"target\": \"com.amazonaws.s3#StorageClass\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>By default, Amazon S3 uses the STANDARD Storage Class to store newly created objects. The STANDARD\\n      storage class provides high durability and high availability. Depending on performance needs, you can\\n      specify a different Storage Class. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/storage-class-intro.html\\\">Storage Classes</a> in the\\n        <i>Amazon S3 User Guide</i>.</p>\\n         <note>\\n            <ul>\\n               <li>\\n                  <p>Directory buckets only support <code>EXPRESS_ONEZONE</code> (the S3 Express One Zone storage class) in\\n            Availability Zones and <code>ONEZONE_IA</code> (the S3 One Zone-Infrequent Access storage class) in\\n            Dedicated Local Zones.</p>\\n               </li>\\n               <li>\\n                  <p>Amazon S3 on Outposts only uses the OUTPOSTS Storage Class.</p>\\n               </li>\\n            </ul>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-storage-class\"\n          }\n        },\n        \"WebsiteRedirectLocation\": {\n          \"target\": \"com.amazonaws.s3#WebsiteRedirectLocation\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>If the bucket is configured as a website, redirects requests for this object to another object in\\n      the same bucket or to an external URL. Amazon S3 stores the value of this header in the object metadata. For\\n      information about object metadata, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingMetadata.html\\\">Object Key and Metadata</a> in the <i>Amazon S3\\n        User Guide</i>.</p>\\n         <p>In the following example, the request header sets the redirect to an object (anotherPage.html) in\\n      the same bucket:</p>\\n         <p>\\n            <code>x-amz-website-redirect-location: /anotherPage.html</code>\\n         </p>\\n         <p>In the following example, the request header sets the object redirect to another website:</p>\\n         <p>\\n            <code>x-amz-website-redirect-location: http://www.example.com/</code>\\n         </p>\\n         <p>For more information about website hosting in Amazon S3, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/WebsiteHosting.html\\\">Hosting Websites on Amazon S3</a> and <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/how-to-page-redirect.html\\\">How to Configure Website Page\\n        Redirects</a> in the <i>Amazon S3 User Guide</i>. </p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-website-redirect-location\"\n          }\n        },\n        \"SSECustomerAlgorithm\": {\n          \"target\": \"com.amazonaws.s3#SSECustomerAlgorithm\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the algorithm to use when encrypting the object (for example, <code>AES256</code>).</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption-customer-algorithm\"\n          }\n        },\n        \"SSECustomerKey\": {\n          \"target\": \"com.amazonaws.s3#SSECustomerKey\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the customer-provided encryption key for Amazon S3 to use in encrypting data. This value is\\n      used to store the object and then it is discarded; Amazon S3 does not store the encryption key. The key must\\n      be appropriate for use with the algorithm specified in the\\n        <code>x-amz-server-side-encryption-customer-algorithm</code> header.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption-customer-key\"\n          }\n        },\n        \"SSECustomerKeyMD5\": {\n          \"target\": \"com.amazonaws.s3#SSECustomerKeyMD5\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the 128-bit MD5 digest of the encryption key according to RFC 1321. Amazon S3 uses this header\\n      for a message integrity check to ensure that the encryption key was transmitted without error.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption-customer-key-MD5\"\n          }\n        },\n        \"SSEKMSKeyId\": {\n          \"target\": \"com.amazonaws.s3#SSEKMSKeyId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the KMS key ID (Key ID, Key ARN, or Key Alias) to use for object encryption. If the KMS key doesn't exist in the same\\n         account that's issuing the command, you must use the full Key ARN not the Key ID.</p>\\n         <p>\\n            <b>General purpose buckets</b> - If you specify <code>x-amz-server-side-encryption</code> with <code>aws:kms</code> or <code>aws:kms:dsse</code>, this header specifies the ID (Key ID, Key ARN, or Key Alias) of the KMS \\n         key to use. If you specify\\n         <code>x-amz-server-side-encryption:aws:kms</code> or\\n         <code>x-amz-server-side-encryption:aws:kms:dsse</code>, but do not provide <code>x-amz-server-side-encryption-aws-kms-key-id</code>, Amazon S3 uses the Amazon Web Services managed key\\n         (<code>aws/s3</code>) to protect the data.</p>\\n         <p>\\n            <b>Directory buckets</b> - To encrypt data using SSE-KMS, it's recommended to specify the \\n<code>x-amz-server-side-encryption</code> header to <code>aws:kms</code>. Then, the <code>x-amz-server-side-encryption-aws-kms-key-id</code> header implicitly uses \\nthe bucket's default KMS customer managed key ID. If you want to explicitly set the <code>\\n         x-amz-server-side-encryption-aws-kms-key-id</code> header, it must match the bucket's default customer managed key (using key ID or ARN, not alias). Your SSE-KMS configuration can only support 1 <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk\\\">customer managed key</a> per directory bucket's lifetime. \\nThe <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk\\\">Amazon Web Services managed key</a> (<code>aws/s3</code>) isn't supported. \\n                            \\n Incorrect key specification results in an HTTP <code>400 Bad Request</code> error. </p>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption-aws-kms-key-id\"\n          }\n        },\n        \"SSEKMSEncryptionContext\": {\n          \"target\": \"com.amazonaws.s3#SSEKMSEncryptionContext\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the Amazon Web Services KMS Encryption Context as an additional encryption context to use for object encryption. The value of\\n         this header is a Base64 encoded string of a UTF-8 encoded JSON, which contains the encryption context as key-value pairs. \\n         This value is stored as object metadata and automatically gets passed on\\n         to Amazon Web Services KMS for future <code>GetObject</code> operations on\\n         this object.</p>\\n         <p>\\n            <b>General purpose buckets</b> - This value must be explicitly added during <code>CopyObject</code> operations if you want an additional encryption context for your object. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingKMSEncryption.html#encryption-context\\\">Encryption context</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <p>\\n            <b>Directory buckets</b> - You can optionally provide an explicit encryption context value. The value must match the default encryption context - the bucket Amazon Resource Name (ARN). An additional encryption context value is not supported. </p>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption-context\"\n          }\n        },\n        \"BucketKeyEnabled\": {\n          \"target\": \"com.amazonaws.s3#BucketKeyEnabled\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies whether Amazon S3 should use an S3 Bucket Key for object encryption with\\n         server-side encryption using Key Management Service (KMS) keys (SSE-KMS).</p>\\n         <p>\\n            <b>General purpose buckets</b> - Setting this header to\\n            <code>true</code> causes Amazon S3 to use an S3 Bucket Key for object encryption with\\n         SSE-KMS. Also, specifying this header with a PUT action doesn't affect bucket-level settings for S3\\n         Bucket Key.</p>\\n         <p>\\n            <b>Directory buckets</b> - S3 Bucket Keys are always enabled for <code>GET</code> and <code>PUT</code> operations in a directory bucket and can’t be disabled. S3 Bucket Keys aren't supported, when you copy SSE-KMS encrypted objects from general purpose buckets  \\nto directory buckets, from directory buckets to general purpose buckets, or between directory buckets, through <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html\\\">CopyObject</a>, <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html\\\">UploadPartCopy</a>, <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-buckets-objects-Batch-Ops\\\">the Copy operation in Batch Operations</a>, or \\n                            <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/create-import-job\\\">the import jobs</a>. In this case, Amazon S3 makes a call to KMS every time a copy request is made for a KMS-encrypted object.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption-bucket-key-enabled\"\n          }\n        },\n        \"RequestPayer\": {\n          \"target\": \"com.amazonaws.s3#RequestPayer\",\n          \"traits\": {\n            \"smithy.api#httpHeader\": \"x-amz-request-payer\"\n          }\n        },\n        \"Tagging\": {\n          \"target\": \"com.amazonaws.s3#TaggingHeader\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The tag-set for the object. The tag-set must be encoded as URL Query parameters. (For example,\\n      \\\"Key1=Value1\\\")</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-tagging\"\n          }\n        },\n        \"ObjectLockMode\": {\n          \"target\": \"com.amazonaws.s3#ObjectLockMode\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Object Lock mode that you want to apply to this object.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-object-lock-mode\"\n          }\n        },\n        \"ObjectLockRetainUntilDate\": {\n          \"target\": \"com.amazonaws.s3#ObjectLockRetainUntilDate\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The date and time when you want this object's Object Lock to expire. Must be formatted as a\\n      timestamp parameter.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-object-lock-retain-until-date\"\n          }\n        },\n        \"ObjectLockLegalHoldStatus\": {\n          \"target\": \"com.amazonaws.s3#ObjectLockLegalHoldStatus\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies whether a legal hold will be applied to this object. For more information about S3 Object\\n      Lock, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/object-lock.html\\\">Object Lock</a> in\\n      the <i>Amazon S3 User Guide</i>.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-object-lock-legal-hold\"\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#PutObjectRetention\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#PutObjectRetentionRequest\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.s3#PutObjectRetentionOutput\"\n      },\n      \"traits\": {\n        \"aws.protocols#httpChecksum\": {\n          \"requestAlgorithmMember\": \"ChecksumAlgorithm\",\n          \"requestChecksumRequired\": true\n        },\n        \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported for directory buckets.</p>\\n         </note>\\n         <p>Places an Object Retention configuration on an object. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/object-lock.html\\\">Locking Objects</a>. Users or\\n      accounts require the <code>s3:PutObjectRetention</code> permission in order to place an Object Retention\\n      configuration on objects. Bypassing a Governance Retention configuration requires the\\n        <code>s3:BypassGovernanceRetention</code> permission. </p>\\n         <p>This functionality is not supported for Amazon S3 on Outposts.</p>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#http\": {\n          \"method\": \"PUT\",\n          \"uri\": \"/{Bucket}/{Key+}?retention\",\n          \"code\": 200\n        }\n      }\n    },\n    \"com.amazonaws.s3#PutObjectRetentionOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"RequestCharged\": {\n          \"target\": \"com.amazonaws.s3#RequestCharged\",\n          \"traits\": {\n            \"smithy.api#httpHeader\": \"x-amz-request-charged\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#output\": {}\n      }\n    },\n    \"com.amazonaws.s3#PutObjectRetentionRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The bucket name that contains the object you want to apply this Object Retention configuration to. </p>\\n         <p>\\n            <b>Access points</b> - When you use this action with an access point for general purpose buckets, you must provide the alias of the access point in place of the bucket name or specify the access point ARN. When you use this action with an access point for directory buckets, you must provide the access point name in place of the bucket name. When using the access point ARN, you must direct requests to the access point hostname. The access point hostname takes the form <i>AccessPointName</i>-<i>AccountId</i>.s3-accesspoint.<i>Region</i>.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html\\\">Using access points</a> in the <i>Amazon S3 User Guide</i>.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"Key\": {\n          \"target\": \"com.amazonaws.s3#ObjectKey\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The key name for the object that you want to apply this Object Retention configuration to.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {}\n          }\n        },\n        \"Retention\": {\n          \"target\": \"com.amazonaws.s3#ObjectLockRetention\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The container element for the Object Retention configuration.</p>\",\n            \"smithy.api#httpPayload\": {},\n            \"smithy.api#xmlName\": \"Retention\"\n          }\n        },\n        \"RequestPayer\": {\n          \"target\": \"com.amazonaws.s3#RequestPayer\",\n          \"traits\": {\n            \"smithy.api#httpHeader\": \"x-amz-request-payer\"\n          }\n        },\n        \"VersionId\": {\n          \"target\": \"com.amazonaws.s3#ObjectVersionId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The version ID for the object that you want to apply this Object Retention configuration to.</p>\",\n            \"smithy.api#httpQuery\": \"versionId\"\n          }\n        },\n        \"BypassGovernanceRetention\": {\n          \"target\": \"com.amazonaws.s3#BypassGovernanceRetention\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Indicates whether this action should bypass Governance-mode restrictions.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-bypass-governance-retention\"\n          }\n        },\n        \"ContentMD5\": {\n          \"target\": \"com.amazonaws.s3#ContentMD5\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The MD5 hash for the request body.</p>\\n         <p>For requests made using the Amazon Web Services Command Line Interface (CLI) or Amazon Web Services SDKs, this field is calculated automatically.</p>\",\n            \"smithy.api#httpHeader\": \"Content-MD5\"\n          }\n        },\n        \"ChecksumAlgorithm\": {\n          \"target\": \"com.amazonaws.s3#ChecksumAlgorithm\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Indicates the algorithm used to create the checksum for the object when you use the SDK. This header will not provide any\\n    additional functionality if you don't use the SDK. When you send this header, there must be a corresponding <code>x-amz-checksum</code> or\\n    <code>x-amz-trailer</code> header sent. Otherwise, Amazon S3 fails the request with the HTTP status code <code>400 Bad Request</code>. For more\\n    information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking object integrity</a> in\\n    the <i>Amazon S3 User Guide</i>.</p>\\n         <p>If you provide an individual checksum, Amazon S3 ignores any provided <code>ChecksumAlgorithm</code>\\n      parameter.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-sdk-checksum-algorithm\"\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#PutObjectTagging\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#PutObjectTaggingRequest\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.s3#PutObjectTaggingOutput\"\n      },\n      \"traits\": {\n        \"aws.protocols#httpChecksum\": {\n          \"requestAlgorithmMember\": \"ChecksumAlgorithm\",\n          \"requestChecksumRequired\": true\n        },\n        \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported for directory buckets.</p>\\n         </note>\\n         <p>Sets the supplied tag-set to an object that already exists in a bucket. A tag is a key-value pair.\\n      For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-tagging.html\\\">Object Tagging</a>.</p>\\n         <p>You can associate tags with an object by sending a PUT request against the tagging subresource that\\n      is associated with the object. You can retrieve tags by sending a GET request. For more information, see\\n        <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObjectTagging.html\\\">GetObjectTagging</a>.</p>\\n         <p>For tagging-related restrictions related to characters and encodings, see <a href=\\\"https://docs.aws.amazon.com/awsaccountbilling/latest/aboutv2/allocation-tag-restrictions.html\\\">Tag\\n        Restrictions</a>. Note that Amazon S3 limits the maximum number of tags to 10 tags per object.</p>\\n         <p>To use this operation, you must have permission to perform the <code>s3:PutObjectTagging</code>\\n      action. By default, the bucket owner has this permission and can grant this permission to others.</p>\\n         <p>To put tags of any other version, use the <code>versionId</code> query parameter. You also need\\n      permission for the <code>s3:PutObjectVersionTagging</code> action.</p>\\n         <p>\\n            <code>PutObjectTagging</code> has the following special errors. For more Amazon S3 errors see, <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html\\\">Error Responses</a>.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>InvalidTag</code> - The tag provided was not a valid tag. This error can occur if\\n          the tag did not pass input validation. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-tagging.html\\\">Object Tagging</a>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>MalformedXML</code> - The XML provided does not match the schema.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>OperationAborted</code> - A conflicting conditional action is currently in progress\\n          against this resource. Please try again.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>InternalError</code> - The service was unable to apply the provided tag to the\\n          object.</p>\\n            </li>\\n         </ul>\\n         <p>The following operations are related to <code>PutObjectTagging</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObjectTagging.html\\\">GetObjectTagging</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteObjectTagging.html\\\">DeleteObjectTagging</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#examples\": [\n          {\n            \"title\": \"To add tags to an existing object\",\n            \"documentation\": \"The following example adds tags to an existing object.\",\n            \"input\": {\n              \"Bucket\": \"examplebucket\",\n              \"Key\": \"HappyFace.jpg\",\n              \"Tagging\": {\n                \"TagSet\": [\n                  {\n                    \"Key\": \"Key3\",\n                    \"Value\": \"Value3\"\n                  },\n                  {\n                    \"Key\": \"Key4\",\n                    \"Value\": \"Value4\"\n                  }\n                ]\n              }\n            },\n            \"output\": {\n              \"VersionId\": \"null\"\n            }\n          }\n        ],\n        \"smithy.api#http\": {\n          \"method\": \"PUT\",\n          \"uri\": \"/{Bucket}/{Key+}?tagging\",\n          \"code\": 200\n        }\n      }\n    },\n    \"com.amazonaws.s3#PutObjectTaggingOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"VersionId\": {\n          \"target\": \"com.amazonaws.s3#ObjectVersionId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The versionId of the object the tag-set was added to.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-version-id\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#output\": {}\n      }\n    },\n    \"com.amazonaws.s3#PutObjectTaggingRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The bucket name containing the object. </p>\\n         <p>\\n            <b>Access points</b> - When you use this action with an access point for general purpose buckets, you must provide the alias of the access point in place of the bucket name or specify the access point ARN. When you use this action with an access point for directory buckets, you must provide the access point name in place of the bucket name. When using the access point ARN, you must direct requests to the access point hostname. The access point hostname takes the form <i>AccessPointName</i>-<i>AccountId</i>.s3-accesspoint.<i>Region</i>.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html\\\">Using access points</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <p>\\n            <b>S3 on Outposts</b> - When you use this action with S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the \\n                     form <code>\\n               <i>AccessPointName</i>-<i>AccountId</i>.<i>outpostID</i>.s3-outposts.<i>Region</i>.amazonaws.com</code>. When you use this action with S3 on Outposts, the destination bucket must be the Outposts access point ARN or the access point alias. For more information about S3 on Outposts, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html\\\">What is S3 on Outposts?</a> in the <i>Amazon S3 User Guide</i>.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"Key\": {\n          \"target\": \"com.amazonaws.s3#ObjectKey\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Name of the object key.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {}\n          }\n        },\n        \"VersionId\": {\n          \"target\": \"com.amazonaws.s3#ObjectVersionId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The versionId of the object that the tag-set will be added to.</p>\",\n            \"smithy.api#httpQuery\": \"versionId\"\n          }\n        },\n        \"ContentMD5\": {\n          \"target\": \"com.amazonaws.s3#ContentMD5\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The MD5 hash for the request body.</p>\\n         <p>For requests made using the Amazon Web Services Command Line Interface (CLI) or Amazon Web Services SDKs, this field is calculated automatically.</p>\",\n            \"smithy.api#httpHeader\": \"Content-MD5\"\n          }\n        },\n        \"ChecksumAlgorithm\": {\n          \"target\": \"com.amazonaws.s3#ChecksumAlgorithm\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Indicates the algorithm used to create the checksum for the object when you use the SDK. This header will not provide any\\n    additional functionality if you don't use the SDK. When you send this header, there must be a corresponding <code>x-amz-checksum</code> or\\n    <code>x-amz-trailer</code> header sent. Otherwise, Amazon S3 fails the request with the HTTP status code <code>400 Bad Request</code>. For more\\n    information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking object integrity</a> in\\n    the <i>Amazon S3 User Guide</i>.</p>\\n         <p>If you provide an individual checksum, Amazon S3 ignores any provided <code>ChecksumAlgorithm</code>\\n      parameter.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-sdk-checksum-algorithm\"\n          }\n        },\n        \"Tagging\": {\n          \"target\": \"com.amazonaws.s3#Tagging\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Container for the <code>TagSet</code> and <code>Tag</code> elements</p>\",\n            \"smithy.api#httpPayload\": {},\n            \"smithy.api#required\": {},\n            \"smithy.api#xmlName\": \"Tagging\"\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        },\n        \"RequestPayer\": {\n          \"target\": \"com.amazonaws.s3#RequestPayer\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Confirms that the requester knows that she or he will be charged for the tagging object\\n      request. Bucket owners need not specify this parameter in their requests.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-request-payer\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#PutPublicAccessBlock\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#PutPublicAccessBlockRequest\"\n      },\n      \"output\": {\n        \"target\": \"smithy.api#Unit\"\n      },\n      \"traits\": {\n        \"aws.protocols#httpChecksum\": {\n          \"requestAlgorithmMember\": \"ChecksumAlgorithm\",\n          \"requestChecksumRequired\": true\n        },\n        \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported for directory buckets.</p>\\n         </note>\\n         <p>Creates or modifies the <code>PublicAccessBlock</code> configuration for an Amazon S3 bucket. To use this\\n      operation, you must have the <code>s3:PutBucketPublicAccessBlock</code> permission. For more information\\n      about Amazon S3 permissions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/using-with-s3-actions.html\\\">Specifying Permissions in a\\n      Policy</a>.</p>\\n         <important>\\n            <p>When Amazon S3 evaluates the <code>PublicAccessBlock</code> configuration for a bucket or an\\n        object, it checks the <code>PublicAccessBlock</code> configuration for both the bucket (or\\n        the bucket that contains the object) and the bucket owner's account. Account-level settings\\n        automatically inherit from organization-level policies when present. If the\\n          <code>PublicAccessBlock</code> configurations are different between the bucket and the\\n        account, Amazon S3 uses the most restrictive combination of the bucket-level and account-level\\n        settings.</p>\\n         </important>\\n         <p>For more information about when Amazon S3 considers a bucket or an object public, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/access-control-block-public-access.html#access-control-block-public-access-policy-status\\\">The Meaning of \\\"Public\\\"</a>.</p>\\n         <p>The following operations are related to <code>PutPublicAccessBlock</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetPublicAccessBlock.html\\\">GetPublicAccessBlock</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeletePublicAccessBlock.html\\\">DeletePublicAccessBlock</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketPolicyStatus.html\\\">GetBucketPolicyStatus</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/access-control-block-public-access.html\\\">Using Amazon S3 Block Public Access</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#http\": {\n          \"method\": \"PUT\",\n          \"uri\": \"/{Bucket}?publicAccessBlock\",\n          \"code\": 200\n        },\n        \"smithy.rules#staticContextParams\": {\n          \"UseS3ExpressControlEndpoint\": {\n            \"value\": true\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#PutPublicAccessBlockRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the Amazon S3 bucket whose <code>PublicAccessBlock</code> configuration you want to\\n      set.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"ContentMD5\": {\n          \"target\": \"com.amazonaws.s3#ContentMD5\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The MD5 hash of the <code>PutPublicAccessBlock</code> request body. </p>\\n         <p>For requests made using the Amazon Web Services Command Line Interface (CLI) or Amazon Web Services SDKs, this field is calculated automatically.</p>\",\n            \"smithy.api#httpHeader\": \"Content-MD5\"\n          }\n        },\n        \"ChecksumAlgorithm\": {\n          \"target\": \"com.amazonaws.s3#ChecksumAlgorithm\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Indicates the algorithm used to create the checksum for the object when you use the SDK. This header will not provide any\\n    additional functionality if you don't use the SDK. When you send this header, there must be a corresponding <code>x-amz-checksum</code> or\\n    <code>x-amz-trailer</code> header sent. Otherwise, Amazon S3 fails the request with the HTTP status code <code>400 Bad Request</code>. For more\\n    information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking object integrity</a> in\\n    the <i>Amazon S3 User Guide</i>.</p>\\n         <p>If you provide an individual checksum, Amazon S3 ignores any provided <code>ChecksumAlgorithm</code>\\n      parameter.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-sdk-checksum-algorithm\"\n          }\n        },\n        \"PublicAccessBlockConfiguration\": {\n          \"target\": \"com.amazonaws.s3#PublicAccessBlockConfiguration\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The <code>PublicAccessBlock</code> configuration that you want to apply to this Amazon S3\\n      bucket. You can enable the configuration options in any combination. For more information\\n      about when Amazon S3 considers a bucket or object public, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/access-control-block-public-access.html#access-control-block-public-access-policy-status\\\">The Meaning of \\\"Public\\\"</a> in the <i>Amazon S3 User Guide</i>.</p>\",\n            \"smithy.api#httpPayload\": {},\n            \"smithy.api#required\": {},\n            \"smithy.api#xmlName\": \"PublicAccessBlockConfiguration\"\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#QueueArn\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#QueueConfiguration\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Id\": {\n          \"target\": \"com.amazonaws.s3#NotificationId\"\n        },\n        \"QueueArn\": {\n          \"target\": \"com.amazonaws.s3#QueueArn\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the Amazon SQS queue to which Amazon S3 publishes a message when it\\n      detects events of the specified type.</p>\",\n            \"smithy.api#required\": {},\n            \"smithy.api#xmlName\": \"Queue\"\n          }\n        },\n        \"Events\": {\n          \"target\": \"com.amazonaws.s3#EventList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A collection of bucket events for which to send notifications</p>\",\n            \"smithy.api#required\": {},\n            \"smithy.api#xmlFlattened\": {},\n            \"smithy.api#xmlName\": \"Event\"\n          }\n        },\n        \"Filter\": {\n          \"target\": \"com.amazonaws.s3#NotificationConfigurationFilter\"\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Specifies the configuration for publishing messages to an Amazon Simple Queue Service (Amazon SQS)\\n      queue when Amazon S3 detects specified events.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#QueueConfigurationList\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.s3#QueueConfiguration\"\n      }\n    },\n    \"com.amazonaws.s3#Quiet\": {\n      \"type\": \"boolean\"\n    },\n    \"com.amazonaws.s3#QuoteCharacter\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#QuoteEscapeCharacter\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#QuoteFields\": {\n      \"type\": \"enum\",\n      \"members\": {\n        \"ALWAYS\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"ALWAYS\"\n          }\n        },\n        \"ASNEEDED\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"ASNEEDED\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#Range\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#RecordDelimiter\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#RecordExpiration\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Expiration\": {\n          \"target\": \"com.amazonaws.s3#ExpirationState\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>\\n      Specifies whether journal table record expiration is enabled or disabled.\\n    </p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"Days\": {\n          \"target\": \"com.amazonaws.s3#RecordExpirationDays\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>\\n      If you enable journal table record expiration, you can set the number of days to retain your \\n      journal table records. Journal table records must be retained for a minimum of 7 days. To set \\n      this value, specify any whole number from <code>7</code> to <code>2147483647</code>. For example, \\n      to retain your journal table records for one year, set this value to <code>365</code>.\\n    </p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>\\n      The journal table record expiration settings for a journal table in an S3 Metadata configuration.\\n    </p>\"\n      }\n    },\n    \"com.amazonaws.s3#RecordExpirationDays\": {\n      \"type\": \"integer\"\n    },\n    \"com.amazonaws.s3#RecordsEvent\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Payload\": {\n          \"target\": \"com.amazonaws.s3#Body\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The byte array of partial, one or more result records. S3 Select doesn't guarantee that a record\\n      will be self-contained in one record frame. To ensure continuous streaming of data, S3 Select might\\n      split the same record across multiple record frames instead of aggregating the results in memory. Some\\n      S3 clients (for example, the SDK for Java) handle this behavior by creating a\\n        <code>ByteStream</code> out of the response by default. Other clients might not handle this behavior\\n      by default. In those cases, you must aggregate the results on the client side and parse the\\n      response.</p>\",\n            \"smithy.api#eventPayload\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>The container for the records event.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#Redirect\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"HostName\": {\n          \"target\": \"com.amazonaws.s3#HostName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The host name to use in the redirect request.</p>\"\n          }\n        },\n        \"HttpRedirectCode\": {\n          \"target\": \"com.amazonaws.s3#HttpRedirectCode\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The HTTP redirect code to use on the response. Not required if one of the siblings is\\n      present.</p>\"\n          }\n        },\n        \"Protocol\": {\n          \"target\": \"com.amazonaws.s3#Protocol\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Protocol to use when redirecting requests. The default is the protocol that is used in the original\\n      request.</p>\"\n          }\n        },\n        \"ReplaceKeyPrefixWith\": {\n          \"target\": \"com.amazonaws.s3#ReplaceKeyPrefixWith\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The object key prefix to use in the redirect request. For example, to redirect requests for all\\n      pages with prefix <code>docs/</code> (objects in the <code>docs/</code> folder) to\\n        <code>documents/</code>, you can set a condition block with <code>KeyPrefixEquals</code> set to\\n        <code>docs/</code> and in the Redirect set <code>ReplaceKeyPrefixWith</code> to\\n        <code>/documents</code>. Not required if one of the siblings is present. Can be present only if\\n        <code>ReplaceKeyWith</code> is not provided.</p>\\n         <important>\\n            <p>Replacement must be made for object keys containing special characters (such as carriage returns) when using \\n         XML requests. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-keys.html#object-key-xml-related-constraints\\\">\\n            XML related object key constraints</a>.</p>\\n         </important>\"\n          }\n        },\n        \"ReplaceKeyWith\": {\n          \"target\": \"com.amazonaws.s3#ReplaceKeyWith\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The specific object key to use in the redirect request. For example, redirect request to\\n        <code>error.html</code>. Not required if one of the siblings is present. Can be present only if\\n        <code>ReplaceKeyPrefixWith</code> is not provided.</p>\\n         <important>\\n            <p>Replacement must be made for object keys containing special characters (such as carriage returns) when using \\n         XML requests. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-keys.html#object-key-xml-related-constraints\\\">\\n            XML related object key constraints</a>.</p>\\n         </important>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Specifies how requests are redirected. In the event of an error, you can specify a different error\\n      code to return.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#RedirectAllRequestsTo\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"HostName\": {\n          \"target\": \"com.amazonaws.s3#HostName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Name of the host where requests are redirected.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"Protocol\": {\n          \"target\": \"com.amazonaws.s3#Protocol\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Protocol to use when redirecting requests. The default is the protocol that is used in the original\\n      request.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Specifies the redirect behavior of all requests to a website endpoint of an Amazon S3 bucket.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#Region\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#length\": {\n          \"min\": 0,\n          \"max\": 20\n        }\n      }\n    },\n    \"com.amazonaws.s3#RenameObject\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#RenameObjectRequest\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.s3#RenameObjectOutput\"\n      },\n      \"errors\": [\n        {\n          \"target\": \"com.amazonaws.s3#IdempotencyParameterMismatch\"\n        }\n      ],\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Renames an existing object in a directory bucket that uses the S3 Express One Zone storage class.\\n      You can use <code>RenameObject</code> by specifying an existing object’s name as the source and the new\\n      name of the object as the destination within the same directory bucket.</p>\\n         <note>\\n            <p>\\n               <code>RenameObject</code> is only supported for objects stored in the S3 Express One Zone storage\\n        class.</p>\\n         </note>\\n         <p> To prevent overwriting an object, you can use the <code>If-None-Match</code> conditional\\n      header.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <b>If-None-Match</b> - Renames the object only if an object\\n          with the specified name does not already exist in the directory bucket. If you don't want to\\n          overwrite an existing object, you can add the <code>If-None-Match</code> conditional header with the\\n          value <code>‘*’</code> in the <code>RenameObject</code> request. Amazon S3 then returns a <code>412\\n            Precondition Failed</code> error if the object with the specified name already exists. For more\\n          information, see <a href=\\\"https://datatracker.ietf.org/doc/rfc7232/\\\">RFC 7232</a>.</p>\\n            </li>\\n         </ul>\\n         <dl>\\n            <dt>Permissions</dt>\\n            <dd>\\n               <p> To grant access to the <code>RenameObject</code> operation on a directory bucket, we\\n            recommend that you use the <code>CreateSession</code> operation for session-based authorization.\\n            Specifically, you grant the <code>s3express:CreateSession</code> permission to the directory\\n            bucket in a bucket policy or an IAM identity-based policy. Then, you make the\\n              <code>CreateSession</code> API call on the directory bucket to obtain a session token. With the\\n            session token in your request header, you can make API requests to this operation. After the\\n            session token expires, you make another <code>CreateSession</code> API call to generate a new\\n            session token for use. The Amazon Web Services CLI and SDKs will create and manage your session including\\n            refreshing the session token automatically to avoid service interruptions when a session expires.\\n            In your bucket policy, you can specify the <code>s3express:SessionMode</code> condition key to\\n            control who can create a <code>ReadWrite</code> or <code>ReadOnly</code> session. A\\n              <code>ReadWrite</code> session is required for executing all the Zonal endpoint API operations,\\n            including <code>RenameObject</code>. For more information about authorization, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateSession.html\\\">\\n                     <code>CreateSession</code>\\n                  </a>. To learn more about Zonal endpoint API operations, see\\n              <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-create-session.html\\\">Authorizing Zonal endpoint API operations with CreateSession</a> in the <i>Amazon S3 User\\n              Guide</i>. </p>\\n            </dd>\\n            <dt>HTTP Host header syntax</dt>\\n            <dd>\\n               <p>\\n                  <b>Directory buckets </b> - The HTTP Host header syntax is <code>\\n                     <i>Bucket-name</i>.s3express-<i>zone-id</i>.<i>region-code</i>.amazonaws.com</code>.</p>\\n            </dd>\\n         </dl>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#http\": {\n          \"method\": \"PUT\",\n          \"uri\": \"/{Bucket}/{Key+}?renameObject\",\n          \"code\": 200\n        }\n      }\n    },\n    \"com.amazonaws.s3#RenameObjectOutput\": {\n      \"type\": \"structure\",\n      \"members\": {},\n      \"traits\": {\n        \"smithy.api#output\": {}\n      }\n    },\n    \"com.amazonaws.s3#RenameObjectRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The bucket name of the directory bucket containing the object.</p>\\n         <p> You must use virtual-hosted-style requests in the format\\n        <code>Bucket-name.s3express-zone-id.region-code.amazonaws.com</code>. Path-style requests are not\\n      supported. Directory bucket names must be unique in the chosen Availability Zone. Bucket names must\\n      follow the format <code>bucket-base-name--zone-id--x-s3 </code> (for example,\\n        <code>amzn-s3-demo-bucket--usw2-az1--x-s3</code>). For information about bucket naming restrictions, see\\n        <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-bucket-naming-rules.html\\\">Directory bucket naming rules</a> in the <i>Amazon S3 User Guide</i>.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"Key\": {\n          \"target\": \"com.amazonaws.s3#ObjectKey\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Key name of the object to rename.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Key\"\n            }\n          }\n        },\n        \"RenameSource\": {\n          \"target\": \"com.amazonaws.s3#RenameSource\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the source for the rename operation. The value must be URL encoded.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-rename-source\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"DestinationIfMatch\": {\n          \"target\": \"com.amazonaws.s3#IfMatch\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Renames the object only if the ETag (entity tag) value provided during the operation matches the\\n      ETag of the object in S3. The <code>If-Match</code> header field makes the request method conditional on\\n      ETags. If the ETag values do not match, the operation returns a <code>412 Precondition Failed</code>\\n      error.</p>\\n         <p>Expects the ETag value as a string.</p>\",\n            \"smithy.api#httpHeader\": \"If-Match\"\n          }\n        },\n        \"DestinationIfNoneMatch\": {\n          \"target\": \"com.amazonaws.s3#IfNoneMatch\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p> Renames the object only if the destination does not already exist in the specified directory\\n      bucket. If the object does exist when you send a request with <code>If-None-Match:*</code>, the S3 API\\n      will return a <code>412 Precondition Failed</code> error, preventing an overwrite. The\\n        <code>If-None-Match</code> header prevents overwrites of existing data by validating that there's not\\n      an object with the same key name already in your directory bucket.</p>\\n         <p> Expects the <code>*</code> character (asterisk).</p>\",\n            \"smithy.api#httpHeader\": \"If-None-Match\"\n          }\n        },\n        \"DestinationIfModifiedSince\": {\n          \"target\": \"com.amazonaws.s3#IfModifiedSince\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Renames the object if the destination exists and if it has been modified since the specified\\n      time.</p>\",\n            \"smithy.api#httpHeader\": \"If-Modified-Since\"\n          }\n        },\n        \"DestinationIfUnmodifiedSince\": {\n          \"target\": \"com.amazonaws.s3#IfUnmodifiedSince\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Renames the object if it hasn't been modified since the specified time.</p>\",\n            \"smithy.api#httpHeader\": \"If-Unmodified-Since\"\n          }\n        },\n        \"SourceIfMatch\": {\n          \"target\": \"com.amazonaws.s3#RenameSourceIfMatch\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Renames the object if the source exists and if its entity tag (ETag) matches the specified ETag.\\n    </p>\",\n            \"smithy.api#httpHeader\": \"x-amz-rename-source-if-match\"\n          }\n        },\n        \"SourceIfNoneMatch\": {\n          \"target\": \"com.amazonaws.s3#RenameSourceIfNoneMatch\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Renames the object if the source exists and if its entity tag (ETag) is different than the specified\\n      ETag. If an asterisk (<code>*</code>) character is provided, the operation will fail and return a\\n        <code>412 Precondition Failed</code> error. </p>\",\n            \"smithy.api#httpHeader\": \"x-amz-rename-source-if-none-match\"\n          }\n        },\n        \"SourceIfModifiedSince\": {\n          \"target\": \"com.amazonaws.s3#RenameSourceIfModifiedSince\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Renames the object if the source exists and if it has been modified since the specified time.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-rename-source-if-modified-since\"\n          }\n        },\n        \"SourceIfUnmodifiedSince\": {\n          \"target\": \"com.amazonaws.s3#RenameSourceIfUnmodifiedSince\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Renames the object if the source exists and hasn't been modified since the specified time.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-rename-source-if-unmodified-since\"\n          }\n        },\n        \"ClientToken\": {\n          \"target\": \"com.amazonaws.s3#ClientToken\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p> A unique string with a max of 64 ASCII characters in the ASCII range of 33 - 126.</p>\\n         <note>\\n            <p>\\n               <code>RenameObject</code> supports idempotency using a client token. To make an idempotent API request\\n        using <code>RenameObject</code>, specify a client token in the request. You should not reuse the same\\n        client token for other API requests. If you retry a request that completed successfully using the same\\n        client token and the same parameters, the retry succeeds without performing any further actions. If\\n        you retry a successful request using the same client token, but one or more of the parameters are\\n        different, the retry fails and an <code>IdempotentParameterMismatch</code> error is returned. </p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-client-token\",\n            \"smithy.api#idempotencyToken\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#RenameSource\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#pattern\": \"^\\\\/?.+\\\\/.+$\"\n      }\n    },\n    \"com.amazonaws.s3#RenameSourceIfMatch\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#RenameSourceIfModifiedSince\": {\n      \"type\": \"timestamp\",\n      \"traits\": {\n        \"smithy.api#timestampFormat\": \"http-date\"\n      }\n    },\n    \"com.amazonaws.s3#RenameSourceIfNoneMatch\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#RenameSourceIfUnmodifiedSince\": {\n      \"type\": \"timestamp\",\n      \"traits\": {\n        \"smithy.api#timestampFormat\": \"http-date\"\n      }\n    },\n    \"com.amazonaws.s3#ReplaceKeyPrefixWith\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#ReplaceKeyWith\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#ReplicaKmsKeyID\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#ReplicaModifications\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Status\": {\n          \"target\": \"com.amazonaws.s3#ReplicaModificationsStatus\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies whether Amazon S3 replicates modifications on replicas.</p>\",\n            \"smithy.api#required\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>A filter that you can specify for selection for modifications on replicas. Amazon S3 doesn't replicate\\n      replica modifications by default. In the latest version of replication configuration (when\\n        <code>Filter</code> is specified), you can specify this element and set the status to\\n        <code>Enabled</code> to replicate modifications on replicas. </p>\\n         <note>\\n            <p> If you don't specify the <code>Filter</code> element, Amazon S3 assumes that the replication\\n        configuration is the earlier version, V1. In the earlier version, this element is not allowed.</p>\\n         </note>\"\n      }\n    },\n    \"com.amazonaws.s3#ReplicaModificationsStatus\": {\n      \"type\": \"enum\",\n      \"members\": {\n        \"Enabled\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"Enabled\"\n          }\n        },\n        \"Disabled\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"Disabled\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#ReplicationConfiguration\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Role\": {\n          \"target\": \"com.amazonaws.s3#Role\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the Identity and Access Management (IAM) role that Amazon S3 assumes when replicating\\n      objects. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/replication-how-setup.html\\\">How to Set Up Replication</a> in the\\n        <i>Amazon S3 User Guide</i>.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"Rules\": {\n          \"target\": \"com.amazonaws.s3#ReplicationRules\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A container for one or more replication rules. A replication configuration must have at least one\\n      rule and can contain a maximum of 1,000 rules. </p>\",\n            \"smithy.api#required\": {},\n            \"smithy.api#xmlFlattened\": {},\n            \"smithy.api#xmlName\": \"Rule\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>A container for replication rules. You can add up to 1,000 rules. The maximum size of a replication\\n      configuration is 2 MB.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#ReplicationRule\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"ID\": {\n          \"target\": \"com.amazonaws.s3#ID\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A unique identifier for the rule. The maximum value is 255 characters.</p>\"\n          }\n        },\n        \"Priority\": {\n          \"target\": \"com.amazonaws.s3#Priority\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The priority indicates which rule has precedence whenever two or more replication rules conflict.\\n      Amazon S3 will attempt to replicate objects according to all replication rules. However, if there are two or\\n      more rules with the same destination bucket, then objects will be replicated according to the rule with\\n      the highest priority. The higher the number, the higher the priority. </p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/replication.html\\\">Replication</a> in the <i>Amazon S3 User Guide</i>.</p>\"\n          }\n        },\n        \"Prefix\": {\n          \"target\": \"com.amazonaws.s3#Prefix\",\n          \"traits\": {\n            \"smithy.api#deprecated\": {},\n            \"smithy.api#documentation\": \"<p>An object key name prefix that identifies the object or objects to which the rule applies. The\\n      maximum prefix length is 1,024 characters. To include all objects in a bucket, specify an empty string.\\n      </p>\\n         <important>\\n            <p>Replacement must be made for object keys containing special characters (such as carriage returns) when using \\n         XML requests. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-keys.html#object-key-xml-related-constraints\\\">\\n            XML related object key constraints</a>.</p>\\n         </important>\"\n          }\n        },\n        \"Filter\": {\n          \"target\": \"com.amazonaws.s3#ReplicationRuleFilter\"\n        },\n        \"Status\": {\n          \"target\": \"com.amazonaws.s3#ReplicationRuleStatus\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies whether the rule is enabled.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"SourceSelectionCriteria\": {\n          \"target\": \"com.amazonaws.s3#SourceSelectionCriteria\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A container that describes additional filters for identifying the source objects that you want to\\n      replicate. You can choose to enable or disable the replication of these objects. Currently, Amazon S3\\n      supports only the filter that you can specify for objects created with server-side encryption using a\\n      customer managed key stored in Amazon Web Services Key Management Service (SSE-KMS).</p>\"\n          }\n        },\n        \"ExistingObjectReplication\": {\n          \"target\": \"com.amazonaws.s3#ExistingObjectReplication\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Optional configuration to replicate existing source bucket objects. </p>\\n         <note>\\n            <p>This parameter is no longer supported. To replicate existing objects, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-batch-replication-batch.html\\\">Replicating\\n          existing objects with S3 Batch Replication</a> in the\\n        <i>Amazon S3 User Guide</i>.</p>\\n         </note>\"\n          }\n        },\n        \"Destination\": {\n          \"target\": \"com.amazonaws.s3#Destination\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A container for information about the replication destination and its configurations including\\n      enabling the S3 Replication Time Control (S3 RTC).</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"DeleteMarkerReplication\": {\n          \"target\": \"com.amazonaws.s3#DeleteMarkerReplication\"\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Specifies which Amazon S3 objects to replicate and where to store the replicas.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#ReplicationRuleAndOperator\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Prefix\": {\n          \"target\": \"com.amazonaws.s3#Prefix\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>An object key name prefix that identifies the subset of objects to which the rule applies.</p>\"\n          }\n        },\n        \"Tags\": {\n          \"target\": \"com.amazonaws.s3#TagSet\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>An array of tags containing key and value pairs.</p>\",\n            \"smithy.api#xmlFlattened\": {},\n            \"smithy.api#xmlName\": \"Tag\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>A container for specifying rule filters. The filters determine the subset of objects to which the\\n      rule applies. This element is required only if you specify more than one filter. </p>\\n         <p>For example:</p>\\n         <ul>\\n            <li>\\n               <p>If you specify both a <code>Prefix</code> and a <code>Tag</code> filter, wrap these filters in\\n          an <code>And</code> tag. </p>\\n            </li>\\n            <li>\\n               <p>If you specify a filter based on multiple tags, wrap the <code>Tag</code> elements in an\\n            <code>And</code> tag.</p>\\n            </li>\\n         </ul>\"\n      }\n    },\n    \"com.amazonaws.s3#ReplicationRuleFilter\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Prefix\": {\n          \"target\": \"com.amazonaws.s3#Prefix\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>An object key name prefix that identifies the subset of objects to which the rule applies.</p>\\n         <important>\\n            <p>Replacement must be made for object keys containing special characters (such as carriage returns) when using \\n         XML requests. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-keys.html#object-key-xml-related-constraints\\\">\\n            XML related object key constraints</a>.</p>\\n         </important>\"\n          }\n        },\n        \"Tag\": {\n          \"target\": \"com.amazonaws.s3#Tag\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A container for specifying a tag key and value. </p>\\n         <p>The rule applies only to objects that have the tag in their tag set.</p>\"\n          }\n        },\n        \"And\": {\n          \"target\": \"com.amazonaws.s3#ReplicationRuleAndOperator\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A container for specifying rule filters. The filters determine the subset of objects to which the\\n      rule applies. This element is required only if you specify more than one filter. For example: </p>\\n         <ul>\\n            <li>\\n               <p>If you specify both a <code>Prefix</code> and a <code>Tag</code> filter, wrap these filters in\\n          an <code>And</code> tag.</p>\\n            </li>\\n            <li>\\n               <p>If you specify a filter based on multiple tags, wrap the <code>Tag</code> elements in an\\n            <code>And</code> tag.</p>\\n            </li>\\n         </ul>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>A filter that identifies the subset of objects to which the replication rule applies. A\\n        <code>Filter</code> must specify exactly one <code>Prefix</code>, <code>Tag</code>, or an\\n        <code>And</code> child element.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#ReplicationRuleStatus\": {\n      \"type\": \"enum\",\n      \"members\": {\n        \"Enabled\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"Enabled\"\n          }\n        },\n        \"Disabled\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"Disabled\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#ReplicationRules\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.s3#ReplicationRule\"\n      }\n    },\n    \"com.amazonaws.s3#ReplicationStatus\": {\n      \"type\": \"enum\",\n      \"members\": {\n        \"COMPLETE\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"COMPLETE\"\n          }\n        },\n        \"PENDING\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"PENDING\"\n          }\n        },\n        \"FAILED\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"FAILED\"\n          }\n        },\n        \"REPLICA\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"REPLICA\"\n          }\n        },\n        \"COMPLETED\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"COMPLETED\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#ReplicationTime\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Status\": {\n          \"target\": \"com.amazonaws.s3#ReplicationTimeStatus\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p> Specifies whether the replication time is enabled. </p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"Time\": {\n          \"target\": \"com.amazonaws.s3#ReplicationTimeValue\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p> A container specifying the time by which replication should be complete for all objects and\\n      operations on objects. </p>\",\n            \"smithy.api#required\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p> A container specifying S3 Replication Time Control (S3 RTC) related information, including whether S3 RTC is enabled and\\n      the time when all objects and operations on objects must be replicated. Must be specified together with\\n      a <code>Metrics</code> block. </p>\"\n      }\n    },\n    \"com.amazonaws.s3#ReplicationTimeStatus\": {\n      \"type\": \"enum\",\n      \"members\": {\n        \"Enabled\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"Enabled\"\n          }\n        },\n        \"Disabled\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"Disabled\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#ReplicationTimeValue\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Minutes\": {\n          \"target\": \"com.amazonaws.s3#Minutes\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p> Contains an integer specifying time in minutes. </p>\\n         <p> Valid value: 15</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p> A container specifying the time value for S3 Replication Time Control (S3 RTC) and replication metrics\\n        <code>EventThreshold</code>. </p>\"\n      }\n    },\n    \"com.amazonaws.s3#RequestCharged\": {\n      \"type\": \"enum\",\n      \"members\": {\n        \"requester\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"requester\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>If present, indicates that the requester was successfully charged for the request. For more\\n      information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/RequesterPaysBuckets.html\\\">Using Requester Pays buckets for storage transfers and usage</a> in the <i>Amazon Simple\\n        Storage Service user guide</i>.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\"\n      }\n    },\n    \"com.amazonaws.s3#RequestPayer\": {\n      \"type\": \"enum\",\n      \"members\": {\n        \"requester\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"requester\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Confirms that the requester knows that they will be charged for the request. Bucket owners need not\\n      specify this parameter in their requests. If either the source or destination S3 bucket has Requester\\n      Pays enabled, the requester will pay for corresponding charges to copy the object. For information about\\n      downloading objects from Requester Pays buckets, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/ObjectsinRequesterPaysBuckets.html\\\">Downloading Objects in Requester Pays\\n        Buckets</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\"\n      }\n    },\n    \"com.amazonaws.s3#RequestPaymentConfiguration\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Payer\": {\n          \"target\": \"com.amazonaws.s3#Payer\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies who pays for the download and request fees.</p>\",\n            \"smithy.api#required\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Container for Payer.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#RequestProgress\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Enabled\": {\n          \"target\": \"com.amazonaws.s3#EnableRequestProgress\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies whether periodic QueryProgress frames should be sent. Valid values: TRUE, FALSE. Default\\n      value: FALSE.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Container for specifying if periodic <code>QueryProgress</code> messages should be sent.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#RequestRoute\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#RequestToken\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#ResponseCacheControl\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#ResponseContentDisposition\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#ResponseContentEncoding\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#ResponseContentLanguage\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#ResponseContentType\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#ResponseExpires\": {\n      \"type\": \"timestamp\",\n      \"traits\": {\n        \"smithy.api#timestampFormat\": \"http-date\"\n      }\n    },\n    \"com.amazonaws.s3#Restore\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#RestoreExpiryDate\": {\n      \"type\": \"timestamp\"\n    },\n    \"com.amazonaws.s3#RestoreObject\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#RestoreObjectRequest\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.s3#RestoreObjectOutput\"\n      },\n      \"errors\": [\n        {\n          \"target\": \"com.amazonaws.s3#ObjectAlreadyInActiveTierError\"\n        }\n      ],\n      \"traits\": {\n        \"aws.protocols#httpChecksum\": {\n          \"requestAlgorithmMember\": \"ChecksumAlgorithm\"\n        },\n        \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported for directory buckets.</p>\\n         </note>\\n         <p>Restores an archived copy of an object back into Amazon S3</p>\\n         <p>This functionality is not supported for Amazon S3 on Outposts.</p>\\n         <p>This action performs the following types of requests: </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>restore an archive</code> - Restore an archived object</p>\\n            </li>\\n         </ul>\\n         <p>For more information about the <code>S3</code> structure in the request body, see the\\n      following:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html\\\">PutObject</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/S3_ACLs_UsingACLs.html\\\">Managing Access\\n            with ACLs</a> in the <i>Amazon S3 User Guide</i>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/serv-side-encryption.html\\\">Protecting Data\\n            Using Server-Side Encryption</a> in the <i>Amazon S3 User Guide</i>\\n               </p>\\n            </li>\\n         </ul>\\n         <dl>\\n            <dt>Permissions</dt>\\n            <dd>\\n               <p>To use this operation, you must have permissions to perform the <code>s3:RestoreObject</code>\\n            action. The bucket owner has this permission by default and can grant this permission to others.\\n            For more information about permissions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-with-s3-actions.html#using-with-s3-actions-related-to-bucket-subresources\\\">Permissions Related to Bucket Subresource Operations</a> and <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-access-control.html\\\">Managing Access Permissions to Your Amazon S3\\n              Resources</a> in the <i>Amazon S3 User Guide</i>.</p>\\n            </dd>\\n            <dt>Restoring objects</dt>\\n            <dd>\\n               <p>Objects that you archive to the S3 Glacier Flexible Retrieval or S3 Glacier Deep Archive\\n            storage class, and S3 Intelligent-Tiering Archive or S3 Intelligent-Tiering Deep Archive tiers, are not accessible in\\n            real time. For objects in the S3 Glacier Flexible Retrieval or S3 Glacier Deep Archive\\n            storage classes, you must first initiate a restore request, and then wait until a temporary copy\\n            of the object is available. If you want a permanent copy of the object, create a copy of it in the\\n            Amazon S3 Standard storage class in your S3 bucket. To access an archived object, you must restore the\\n            object for the duration (number of days) that you specify. For objects in the Archive Access or\\n            Deep Archive Access tiers of S3 Intelligent-Tiering, you must first initiate a restore request, and\\n            then wait until the object is moved into the Frequent Access tier.</p>\\n               <p>To restore a specific object version, you can provide a version ID. If you don't provide a\\n            version ID, Amazon S3 restores the current version.</p>\\n               <p>When restoring an archived object, you can specify one of the following data access tier\\n            options in the <code>Tier</code> element of the request body: </p>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <code>Expedited</code> - Expedited retrievals allow you to quickly access your data stored\\n                in the S3 Glacier Flexible Retrieval storage class or S3 Intelligent-Tiering Archive tier when occasional\\n                urgent requests for restoring archives are required. For all but the largest archived objects\\n                (250 MB+), data accessed using Expedited retrievals is typically made available within 1–5\\n                minutes. Provisioned capacity ensures that retrieval capacity for Expedited retrievals is\\n                available when you need it. Expedited retrievals and provisioned capacity are not available\\n                for objects stored in the S3 Glacier Deep Archive storage class or\\n                S3 Intelligent-Tiering Deep Archive tier.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <code>Standard</code> - Standard retrievals allow you to access any of your archived\\n                objects within several hours. This is the default option for retrieval requests that do not\\n                specify the retrieval option. Standard retrievals typically finish within 3–5 hours for\\n                objects stored in the S3 Glacier Flexible Retrieval storage class or S3 Intelligent-Tiering Archive tier.\\n                They typically finish within 12 hours for objects stored in the\\n                S3 Glacier Deep Archive storage class or S3 Intelligent-Tiering Deep Archive tier. Standard\\n                retrievals are free for objects stored in S3 Intelligent-Tiering.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <code>Bulk</code> - Bulk retrievals free for objects stored in the S3 Glacier Flexible\\n                Retrieval and S3 Intelligent-Tiering storage classes, enabling you to retrieve large amounts,\\n                even petabytes, of data at no cost. Bulk retrievals typically finish within 5–12 hours for\\n                objects stored in the S3 Glacier Flexible Retrieval storage class or S3 Intelligent-Tiering Archive tier.\\n                Bulk retrievals are also the lowest-cost retrieval option when restoring objects from\\n                S3 Glacier Deep Archive. They typically finish within 48 hours for objects stored in\\n                the S3 Glacier Deep Archive storage class or S3 Intelligent-Tiering Deep Archive tier. </p>\\n                  </li>\\n               </ul>\\n               <p>For more information about archive retrieval options and provisioned capacity for\\n              <code>Expedited</code> data access, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/restoring-objects.html\\\">Restoring Archived Objects</a> in the\\n              <i>Amazon S3 User Guide</i>. </p>\\n               <p>You can use Amazon S3 restore speed upgrade to change the restore speed to a faster speed while it\\n            is in progress. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/restoring-objects.html#restoring-objects-upgrade-tier.title.html\\\">\\n              Upgrading the speed of an in-progress restore</a> in the\\n              <i>Amazon S3 User Guide</i>. </p>\\n               <p>To get the status of object restoration, you can send a <code>HEAD</code> request. Operations\\n            return the <code>x-amz-restore</code> header, which provides information about the restoration\\n            status, in the response. You can use Amazon S3 event notifications to notify you when a restore is\\n            initiated or completed. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/NotificationHowTo.html\\\">Configuring Amazon S3 Event Notifications</a> in\\n            the <i>Amazon S3 User Guide</i>.</p>\\n               <p>After restoring an archived object, you can update the restoration period by reissuing the\\n            request with a new period. Amazon S3 updates the restoration period relative to the current time and\\n            charges only for the request-there are no data transfer charges. You cannot update the\\n            restoration period when Amazon S3 is actively processing your current restore request for the\\n            object.</p>\\n               <p>If your bucket has a lifecycle configuration with a rule that includes an expiration action,\\n            the object expiration overrides the life span that you specify in a restore request. For example,\\n            if you restore an object copy for 10 days, but the object is scheduled to expire in 3 days, Amazon S3\\n            deletes the object in 3 days. For more information about lifecycle configuration, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketLifecycleConfiguration.html\\\">PutBucketLifecycleConfiguration</a> and <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/object-lifecycle-mgmt.html\\\">Object Lifecycle Management</a> in\\n              <i>Amazon S3 User Guide</i>.</p>\\n            </dd>\\n            <dt>Responses</dt>\\n            <dd>\\n               <p>A successful action returns either the <code>200 OK</code> or <code>202 Accepted</code> status\\n            code. </p>\\n               <ul>\\n                  <li>\\n                     <p>If the object is not previously restored, then Amazon S3 returns <code>202 Accepted</code> in\\n                the response. </p>\\n                  </li>\\n                  <li>\\n                     <p>If the object is previously restored, Amazon S3 returns <code>200 OK</code> in the response.\\n              </p>\\n                  </li>\\n               </ul>\\n               <ul>\\n                  <li>\\n                     <p>Special errors:</p>\\n                     <ul>\\n                        <li>\\n                           <p>\\n                              <i>Code: RestoreAlreadyInProgress</i>\\n                           </p>\\n                        </li>\\n                        <li>\\n                           <p>\\n                              <i>Cause: Object restore is already in progress.</i>\\n                           </p>\\n                        </li>\\n                        <li>\\n                           <p>\\n                              <i>HTTP Status Code: 409 Conflict</i>\\n                           </p>\\n                        </li>\\n                        <li>\\n                           <p>\\n                              <i>SOAP Fault Code Prefix: Client</i>\\n                           </p>\\n                        </li>\\n                     </ul>\\n                  </li>\\n                  <li>\\n                     <ul>\\n                        <li>\\n                           <p>\\n                              <i>Code: GlacierExpeditedRetrievalNotAvailable</i>\\n                           </p>\\n                        </li>\\n                        <li>\\n                           <p>\\n                              <i>Cause: expedited retrievals are currently not available. Try again later.\\n                      (Returned if there is insufficient capacity to process the Expedited request. This error\\n                      applies only to Expedited retrievals and not to S3 Standard or Bulk\\n                      retrievals.)</i>\\n                           </p>\\n                        </li>\\n                        <li>\\n                           <p>\\n                              <i>HTTP Status Code: 503</i>\\n                           </p>\\n                        </li>\\n                        <li>\\n                           <p>\\n                              <i>SOAP Fault Code Prefix: N/A</i>\\n                           </p>\\n                        </li>\\n                     </ul>\\n                  </li>\\n               </ul>\\n            </dd>\\n         </dl>\\n         <p>The following operations are related to <code>RestoreObject</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketLifecycleConfiguration.html\\\">PutBucketLifecycleConfiguration</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketNotificationConfiguration.html\\\">GetBucketNotificationConfiguration</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#examples\": [\n          {\n            \"title\": \"To restore an archived object\",\n            \"documentation\": \"The following example restores for one day an archived copy of an object back into Amazon S3 bucket.\",\n            \"input\": {\n              \"Bucket\": \"examplebucket\",\n              \"Key\": \"archivedobjectkey\",\n              \"RestoreRequest\": {\n                \"Days\": 1,\n                \"GlacierJobParameters\": {\n                  \"Tier\": \"Expedited\"\n                }\n              }\n            },\n            \"output\": {}\n          }\n        ],\n        \"smithy.api#http\": {\n          \"method\": \"POST\",\n          \"uri\": \"/{Bucket}/{Key+}?restore\",\n          \"code\": 200\n        }\n      }\n    },\n    \"com.amazonaws.s3#RestoreObjectOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"RequestCharged\": {\n          \"target\": \"com.amazonaws.s3#RequestCharged\",\n          \"traits\": {\n            \"smithy.api#httpHeader\": \"x-amz-request-charged\"\n          }\n        },\n        \"RestoreOutputPath\": {\n          \"target\": \"com.amazonaws.s3#RestoreOutputPath\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Indicates the path in the provided S3 output location where Select results will be restored\\n      to.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-restore-output-path\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#output\": {}\n      }\n    },\n    \"com.amazonaws.s3#RestoreObjectRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The bucket name containing the object to restore. </p>\\n         <p>\\n            <b>Access points</b> - When you use this action with an access point for general purpose buckets, you must provide the alias of the access point in place of the bucket name or specify the access point ARN. When you use this action with an access point for directory buckets, you must provide the access point name in place of the bucket name. When using the access point ARN, you must direct requests to the access point hostname. The access point hostname takes the form <i>AccessPointName</i>-<i>AccountId</i>.s3-accesspoint.<i>Region</i>.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html\\\">Using access points</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <p>\\n            <b>S3 on Outposts</b> - When you use this action with S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the \\n                     form <code>\\n               <i>AccessPointName</i>-<i>AccountId</i>.<i>outpostID</i>.s3-outposts.<i>Region</i>.amazonaws.com</code>. When you use this action with S3 on Outposts, the destination bucket must be the Outposts access point ARN or the access point alias. For more information about S3 on Outposts, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html\\\">What is S3 on Outposts?</a> in the <i>Amazon S3 User Guide</i>.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"Key\": {\n          \"target\": \"com.amazonaws.s3#ObjectKey\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Object key for which the action was initiated.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {}\n          }\n        },\n        \"VersionId\": {\n          \"target\": \"com.amazonaws.s3#ObjectVersionId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>VersionId used to reference a specific version of the object.</p>\",\n            \"smithy.api#httpQuery\": \"versionId\"\n          }\n        },\n        \"RestoreRequest\": {\n          \"target\": \"com.amazonaws.s3#RestoreRequest\",\n          \"traits\": {\n            \"smithy.api#httpPayload\": {},\n            \"smithy.api#xmlName\": \"RestoreRequest\"\n          }\n        },\n        \"RequestPayer\": {\n          \"target\": \"com.amazonaws.s3#RequestPayer\",\n          \"traits\": {\n            \"smithy.api#httpHeader\": \"x-amz-request-payer\"\n          }\n        },\n        \"ChecksumAlgorithm\": {\n          \"target\": \"com.amazonaws.s3#ChecksumAlgorithm\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Indicates the algorithm used to create the checksum for the object when you use the SDK. This header will not provide any\\n    additional functionality if you don't use the SDK. When you send this header, there must be a corresponding <code>x-amz-checksum</code> or\\n    <code>x-amz-trailer</code> header sent. Otherwise, Amazon S3 fails the request with the HTTP status code <code>400 Bad Request</code>. For more\\n    information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking object integrity</a> in\\n    the <i>Amazon S3 User Guide</i>.</p>\\n         <p>If you provide an individual checksum, Amazon S3 ignores any provided <code>ChecksumAlgorithm</code>\\n      parameter.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-sdk-checksum-algorithm\"\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#RestoreOutputPath\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#RestoreRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Days\": {\n          \"target\": \"com.amazonaws.s3#Days\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Lifetime of the active copy in days. Do not use with restores that specify\\n        <code>OutputLocation</code>.</p>\\n         <p>The Days element is required for regular restores, and must not be provided for select\\n      requests.</p>\"\n          }\n        },\n        \"GlacierJobParameters\": {\n          \"target\": \"com.amazonaws.s3#GlacierJobParameters\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>S3 Glacier related parameters pertaining to this job. Do not use with restores that specify\\n        <code>OutputLocation</code>.</p>\"\n          }\n        },\n        \"Type\": {\n          \"target\": \"com.amazonaws.s3#RestoreRequestType\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<important>\\n            <p>Amazon S3 Select is no longer available to new customers. Existing customers of Amazon S3 Select can\\n        continue to use the feature as usual. <a href=\\\"http://aws.amazon.com/blogs/storage/how-to-optimize-querying-your-data-in-amazon-s3/\\\">Learn more</a>\\n            </p>\\n         </important>\\n         <p>Type of restore request.</p>\"\n          }\n        },\n        \"Tier\": {\n          \"target\": \"com.amazonaws.s3#Tier\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Retrieval tier at which the restore will be processed.</p>\"\n          }\n        },\n        \"Description\": {\n          \"target\": \"com.amazonaws.s3#Description\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The optional description for the job.</p>\"\n          }\n        },\n        \"SelectParameters\": {\n          \"target\": \"com.amazonaws.s3#SelectParameters\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<important>\\n            <p>Amazon S3 Select is no longer available to new customers. Existing customers of Amazon S3 Select can\\n        continue to use the feature as usual. <a href=\\\"http://aws.amazon.com/blogs/storage/how-to-optimize-querying-your-data-in-amazon-s3/\\\">Learn more</a>\\n            </p>\\n         </important>\\n         <p>Describes the parameters for Select job types.</p>\"\n          }\n        },\n        \"OutputLocation\": {\n          \"target\": \"com.amazonaws.s3#OutputLocation\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Describes the location where the restore job's output is stored.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Container for restore job parameters.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#RestoreRequestType\": {\n      \"type\": \"enum\",\n      \"members\": {\n        \"SELECT\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"SELECT\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#RestoreStatus\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"IsRestoreInProgress\": {\n          \"target\": \"com.amazonaws.s3#IsRestoreInProgress\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies whether the object is currently being restored. If the object restoration is in progress,\\n      the header returns the value <code>TRUE</code>. For example:</p>\\n         <p>\\n            <code>x-amz-optional-object-attributes: IsRestoreInProgress=\\\"true\\\"</code>\\n         </p>\\n         <p>If the object restoration has completed, the header returns the value <code>FALSE</code>. For\\n      example:</p>\\n         <p>\\n            <code>x-amz-optional-object-attributes: IsRestoreInProgress=\\\"false\\\",\\n        RestoreExpiryDate=\\\"2012-12-21T00:00:00.000Z\\\"</code>\\n         </p>\\n         <p>If the object hasn't been restored, there is no header response.</p>\"\n          }\n        },\n        \"RestoreExpiryDate\": {\n          \"target\": \"com.amazonaws.s3#RestoreExpiryDate\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Indicates when the restored copy will expire. This value is populated only if the object has already\\n      been restored. For example:</p>\\n         <p>\\n            <code>x-amz-optional-object-attributes: IsRestoreInProgress=\\\"false\\\",\\n        RestoreExpiryDate=\\\"2012-12-21T00:00:00.000Z\\\"</code>\\n         </p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Specifies the restoration status of an object. Objects in certain storage classes must be restored\\n      before they can be retrieved. For more information about these storage classes and how to work with\\n      archived objects, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/archived-objects.html\\\">\\n        Working with archived objects</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets. Directory buckets only support <code>EXPRESS_ONEZONE</code> (the S3 Express One Zone storage class) in Availability Zones and <code>ONEZONE_IA</code> (the S3 One Zone-Infrequent Access storage class) in Dedicated Local Zones.</p>\\n         </note>\"\n      }\n    },\n    \"com.amazonaws.s3#Role\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#RoutingRule\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Condition\": {\n          \"target\": \"com.amazonaws.s3#Condition\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A container for describing a condition that must be met for the specified redirect to apply. For\\n      example, 1. If request is for pages in the <code>/docs</code> folder, redirect to the\\n        <code>/documents</code> folder. 2. If request results in HTTP error 4xx, redirect request to another\\n      host where you might process the error.</p>\"\n          }\n        },\n        \"Redirect\": {\n          \"target\": \"com.amazonaws.s3#Redirect\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Container for redirect information. You can redirect requests to another host, to another page, or\\n      with another protocol. In the event of an error, you can specify a different error code to\\n      return.</p>\",\n            \"smithy.api#required\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Specifies the redirect behavior and when a redirect is applied. For more information about routing\\n      rules, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/how-to-page-redirect.html#advanced-conditional-redirects\\\">Configuring\\n        advanced conditional redirects</a> in the <i>Amazon S3 User Guide</i>.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#RoutingRules\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.s3#RoutingRule\",\n        \"traits\": {\n          \"smithy.api#xmlName\": \"RoutingRule\"\n        }\n      }\n    },\n    \"com.amazonaws.s3#S3KeyFilter\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"FilterRules\": {\n          \"target\": \"com.amazonaws.s3#FilterRuleList\",\n          \"traits\": {\n            \"smithy.api#xmlFlattened\": {},\n            \"smithy.api#xmlName\": \"FilterRule\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>A container for object key name prefix and suffix filtering rules.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#S3Location\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"BucketName\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the bucket where the restore results will be placed.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"Prefix\": {\n          \"target\": \"com.amazonaws.s3#LocationPrefix\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The prefix that is prepended to the restore results for this request.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"Encryption\": {\n          \"target\": \"com.amazonaws.s3#Encryption\"\n        },\n        \"CannedACL\": {\n          \"target\": \"com.amazonaws.s3#ObjectCannedACL\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The canned ACL to apply to the restore results.</p>\"\n          }\n        },\n        \"AccessControlList\": {\n          \"target\": \"com.amazonaws.s3#Grants\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A list of grants that control access to the staged results.</p>\"\n          }\n        },\n        \"Tagging\": {\n          \"target\": \"com.amazonaws.s3#Tagging\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The tag-set that is applied to the restore results.</p>\"\n          }\n        },\n        \"UserMetadata\": {\n          \"target\": \"com.amazonaws.s3#UserMetadata\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A list of metadata to store with the restore results in S3.</p>\"\n          }\n        },\n        \"StorageClass\": {\n          \"target\": \"com.amazonaws.s3#StorageClass\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The class of storage used to store the restore results.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Describes an Amazon S3 location that will receive the results of the restore request.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#S3RegionalOrS3ExpressBucketArnString\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#length\": {\n          \"min\": 1,\n          \"max\": 128\n        },\n        \"smithy.api#pattern\": \"^arn:[^:]+:(s3|s3express):\"\n      }\n    },\n    \"com.amazonaws.s3#S3TablesArn\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#S3TablesBucketArn\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#S3TablesBucketType\": {\n      \"type\": \"enum\",\n      \"members\": {\n        \"aws\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"aws\"\n          }\n        },\n        \"customer\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"customer\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#S3TablesDestination\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"TableBucketArn\": {\n          \"target\": \"com.amazonaws.s3#S3TablesBucketArn\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p> The Amazon Resource Name (ARN) for the table bucket that's specified as the destination in the\\n      metadata table configuration. The destination table bucket must be in the same Region and Amazon Web Services account\\n      as the general purpose bucket. </p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"TableName\": {\n          \"target\": \"com.amazonaws.s3#S3TablesName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p> The name for the metadata table in your metadata table configuration. The specified metadata table\\n      name must be unique within the <code>aws_s3_metadata</code> namespace in the destination table bucket.\\n    </p>\",\n            \"smithy.api#required\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p> The destination information for a V1 S3 Metadata configuration. The destination table bucket must\\n      be in the same Region and Amazon Web Services account as the general purpose bucket. The specified metadata table name\\n      must be unique within the <code>aws_s3_metadata</code> namespace in the destination table bucket.\\n    </p>\\n         <note>\\n            <p>If you created your S3 Metadata configuration before July 15, 2025, we recommend that you delete \\n        and re-create your configuration by using <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateBucketMetadataConfiguration.html\\\">CreateBucketMetadataConfiguration</a> so that you can expire journal table records and create \\n        a live inventory table.</p>\\n         </note>\"\n      }\n    },\n    \"com.amazonaws.s3#S3TablesDestinationResult\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"TableBucketArn\": {\n          \"target\": \"com.amazonaws.s3#S3TablesBucketArn\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p> The Amazon Resource Name (ARN) for the table bucket that's specified as the destination in the\\n      metadata table configuration. The destination table bucket must be in the same Region and Amazon Web Services account\\n      as the general purpose bucket. </p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"TableName\": {\n          \"target\": \"com.amazonaws.s3#S3TablesName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p> The name for the metadata table in your metadata table configuration. The specified metadata table\\n      name must be unique within the <code>aws_s3_metadata</code> namespace in the destination table bucket.\\n    </p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"TableArn\": {\n          \"target\": \"com.amazonaws.s3#S3TablesArn\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p> The Amazon Resource Name (ARN) for the metadata table in the metadata table configuration. The\\n      specified metadata table name must be unique within the <code>aws_s3_metadata</code> namespace in the\\n      destination table bucket. </p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"TableNamespace\": {\n          \"target\": \"com.amazonaws.s3#S3TablesNamespace\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p> The table bucket namespace for the metadata table in your metadata table configuration. This value\\n      is always <code>aws_s3_metadata</code>. </p>\",\n            \"smithy.api#required\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p> The destination information for a V1 S3 Metadata configuration. The destination table bucket must\\n      be in the same Region and Amazon Web Services account as the general purpose bucket. The specified metadata table name\\n      must be unique within the <code>aws_s3_metadata</code> namespace in the destination table bucket.\\n    </p>\\n         <note>\\n            <p>If you created your S3 Metadata configuration before July 15, 2025, we recommend that you delete \\n        and re-create your configuration by using <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateBucketMetadataConfiguration.html\\\">CreateBucketMetadataConfiguration</a> so that you can expire journal table records and create \\n        a live inventory table.</p>\\n         </note>\"\n      }\n    },\n    \"com.amazonaws.s3#S3TablesName\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#S3TablesNamespace\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#SSECustomerAlgorithm\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#SSECustomerKey\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#sensitive\": {}\n      }\n    },\n    \"com.amazonaws.s3#SSECustomerKeyMD5\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#SSEKMS\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"KeyId\": {\n          \"target\": \"com.amazonaws.s3#SSEKMSKeyId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the ID of the Key Management Service (KMS) symmetric encryption customer managed key to use for encrypting\\n      inventory reports.</p>\",\n            \"smithy.api#required\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Specifies the use of SSE-KMS to encrypt delivered inventory reports.</p>\",\n        \"smithy.api#xmlName\": \"SSE-KMS\"\n      }\n    },\n    \"com.amazonaws.s3#SSEKMSEncryptionContext\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#sensitive\": {}\n      }\n    },\n    \"com.amazonaws.s3#SSEKMSKeyId\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#sensitive\": {}\n      }\n    },\n    \"com.amazonaws.s3#SSES3\": {\n      \"type\": \"structure\",\n      \"members\": {},\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Specifies the use of SSE-S3 to encrypt delivered inventory reports.</p>\",\n        \"smithy.api#xmlName\": \"SSE-S3\"\n      }\n    },\n    \"com.amazonaws.s3#ScanRange\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Start\": {\n          \"target\": \"com.amazonaws.s3#Start\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the start of the byte range. This parameter is optional. Valid values: non-negative\\n      integers. The default value is 0. If only <code>start</code> is supplied, it means scan from that point\\n      to the end of the file. For example,\\n        <code><scanrange><start>50</start></scanrange></code> means scan from byte 50\\n      until the end of the file.</p>\"\n          }\n        },\n        \"End\": {\n          \"target\": \"com.amazonaws.s3#End\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the end of the byte range. This parameter is optional. Valid values: non-negative\\n      integers. The default value is one less than the size of the object being queried. If only the End\\n      parameter is supplied, it is interpreted to mean scan the last N bytes of the file. For example,\\n        <code><scanrange><end>50</end></scanrange></code> means scan the last 50\\n      bytes.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Specifies the byte range of the object to get the records from. A record is processed when its first\\n      byte is contained by the range. This parameter is optional, but when specified, it must not be empty.\\n      See RFC 2616, Section 14.35.1 about how to specify the start and end of the range.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#SelectObjectContent\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#SelectObjectContentRequest\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.s3#SelectObjectContentOutput\"\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported for directory buckets.</p>\\n         </note>\\n         <p>This action filters the contents of an Amazon S3 object based on a simple structured query language (SQL)\\n      statement. In the request, along with the SQL expression, you must also specify a data serialization\\n      format (JSON, CSV, or Apache Parquet) of the object. Amazon S3 uses this format to parse object data into\\n      records, and returns only records that match the specified SQL expression. You must also specify the\\n      data serialization format for the response.</p>\\n         <p>This functionality is not supported for Amazon S3 on Outposts.</p>\\n         <p>For more information about Amazon S3 Select, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/selecting-content-from-objects.html\\\">Selecting Content from Objects</a>\\n      and <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-glacier-select-sql-reference-select.html\\\">SELECT Command</a> in\\n      the <i>Amazon S3 User Guide</i>.</p>\\n         <p></p>\\n         <dl>\\n            <dt>Permissions</dt>\\n            <dd>\\n               <p>You must have the <code>s3:GetObject</code> permission for this operation. Amazon S3 Select does\\n            not support anonymous access. For more information about permissions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/using-with-s3-actions.html\\\">Specifying Permissions\\n              in a Policy</a> in the <i>Amazon S3 User Guide</i>.</p>\\n            </dd>\\n            <dt>Object Data Formats</dt>\\n            <dd>\\n               <p>You can use Amazon S3 Select to query objects that have the following format properties:</p>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <i>CSV, JSON, and Parquet</i> - Objects must be in CSV, JSON, or Parquet\\n                format.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>UTF-8</i> - UTF-8 is the only encoding type Amazon S3 Select supports.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>GZIP or BZIP2</i> - CSV and JSON files can be compressed using GZIP or\\n                BZIP2. GZIP and BZIP2 are the only compression formats that Amazon S3 Select supports for CSV and\\n                JSON files. Amazon S3 Select supports columnar compression for Parquet using GZIP or Snappy. Amazon S3\\n                Select does not support whole-object compression for Parquet objects.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <i>Server-side encryption</i> - Amazon S3 Select supports querying objects that\\n                are protected with server-side encryption.</p>\\n                     <p>For objects that are encrypted with customer-provided encryption keys (SSE-C), you must\\n                use HTTPS, and you must use the headers that are documented in the <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html\\\">GetObject</a>. For more information about\\n                SSE-C, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/ServerSideEncryptionCustomerKeys.html\\\">Server-Side Encryption\\n                  (Using Customer-Provided Encryption Keys)</a> in the\\n                  <i>Amazon S3 User Guide</i>.</p>\\n                     <p>For objects that are encrypted with Amazon S3 managed keys (SSE-S3) and Amazon Web Services KMS keys\\n                (SSE-KMS), server-side encryption is handled transparently, so you don't need to specify\\n                anything. For more information about server-side encryption, including SSE-S3 and SSE-KMS, see\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/serv-side-encryption.html\\\">Protecting\\n                  Data Using Server-Side Encryption</a> in the\\n                <i>Amazon S3 User Guide</i>.</p>\\n                  </li>\\n               </ul>\\n            </dd>\\n            <dt>Working with the Response Body</dt>\\n            <dd>\\n               <p>Given the response size is unknown, Amazon S3 Select streams the response as a series of messages\\n            and includes a <code>Transfer-Encoding</code> header with <code>chunked</code> as its value in the\\n            response. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/RESTSelectObjectAppendix.html\\\">Appendix: SelectObjectContent\\n              Response</a>.</p>\\n            </dd>\\n            <dt>GetObject Support</dt>\\n            <dd>\\n               <p>The <code>SelectObjectContent</code> action does not support the following\\n              <code>GetObject</code> functionality. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html\\\">GetObject</a>.</p>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <code>Range</code>: Although you can specify a scan range for an Amazon S3 Select request (see\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_SelectObjectContent.html#AmazonS3-SelectObjectContent-request-ScanRange\\\">SelectObjectContentRequest - ScanRange</a> in the request parameters), you\\n                cannot specify the range of bytes of an object to return. </p>\\n                  </li>\\n                  <li>\\n                     <p>The <code>GLACIER</code>, <code>DEEP_ARCHIVE</code>, and <code>REDUCED_REDUNDANCY</code>\\n                storage classes, or the <code>ARCHIVE_ACCESS</code> and <code>DEEP_ARCHIVE_ACCESS</code>\\n                access tiers of the <code>INTELLIGENT_TIERING</code> storage class: You cannot query objects\\n                in the <code>GLACIER</code>, <code>DEEP_ARCHIVE</code>, or <code>REDUCED_REDUNDANCY</code>\\n                storage classes, nor objects in the <code>ARCHIVE_ACCESS</code> or\\n                  <code>DEEP_ARCHIVE_ACCESS</code> access tiers of the <code>INTELLIGENT_TIERING</code>\\n                storage class. For more information about storage classes, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/storage-class-intro.html\\\">Using Amazon S3 storage classes</a>\\n                in the <i>Amazon S3 User Guide</i>.</p>\\n                  </li>\\n               </ul>\\n            </dd>\\n            <dt>Special Errors</dt>\\n            <dd>\\n               <p>For a list of special errors for this operation, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/ErrorResponses.html#SelectObjectContentErrorCodeList\\\">List of SELECT\\n              Object Content Error Codes</a>\\n               </p>\\n            </dd>\\n         </dl>\\n         <p>The following operations are related to <code>SelectObjectContent</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html\\\">GetObject</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketLifecycleConfiguration.html\\\">GetBucketLifecycleConfiguration</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketLifecycleConfiguration.html\\\">PutBucketLifecycleConfiguration</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#http\": {\n          \"method\": \"POST\",\n          \"uri\": \"/{Bucket}/{Key+}?select&select-type=2\",\n          \"code\": 200\n        }\n      }\n    },\n    \"com.amazonaws.s3#SelectObjectContentEventStream\": {\n      \"type\": \"union\",\n      \"members\": {\n        \"Records\": {\n          \"target\": \"com.amazonaws.s3#RecordsEvent\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Records Event.</p>\"\n          }\n        },\n        \"Stats\": {\n          \"target\": \"com.amazonaws.s3#StatsEvent\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Stats Event.</p>\"\n          }\n        },\n        \"Progress\": {\n          \"target\": \"com.amazonaws.s3#ProgressEvent\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Progress Event.</p>\"\n          }\n        },\n        \"Cont\": {\n          \"target\": \"com.amazonaws.s3#ContinuationEvent\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Continuation Event.</p>\"\n          }\n        },\n        \"End\": {\n          \"target\": \"com.amazonaws.s3#EndEvent\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The End Event.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>The container for selecting objects from a content event stream.</p>\",\n        \"smithy.api#streaming\": {}\n      }\n    },\n    \"com.amazonaws.s3#SelectObjectContentOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Payload\": {\n          \"target\": \"com.amazonaws.s3#SelectObjectContentEventStream\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The array of results.</p>\",\n            \"smithy.api#httpPayload\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#output\": {}\n      }\n    },\n    \"com.amazonaws.s3#SelectObjectContentRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The S3 bucket.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"Key\": {\n          \"target\": \"com.amazonaws.s3#ObjectKey\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The object key.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {}\n          }\n        },\n        \"SSECustomerAlgorithm\": {\n          \"target\": \"com.amazonaws.s3#SSECustomerAlgorithm\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The server-side encryption (SSE) algorithm used to encrypt the object. This parameter is needed only when the object was created \\n    using a checksum algorithm. For more information,\\n    see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/ServerSideEncryptionCustomerKeys.html\\\">Protecting data using SSE-C keys</a> in the\\n    <i>Amazon S3 User Guide</i>.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption-customer-algorithm\"\n          }\n        },\n        \"SSECustomerKey\": {\n          \"target\": \"com.amazonaws.s3#SSECustomerKey\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The server-side encryption (SSE) customer managed key. This parameter is needed only when the object was created using a checksum algorithm. \\n    For more information, see\\n    <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/ServerSideEncryptionCustomerKeys.html\\\">Protecting data using SSE-C keys</a> in the\\n    <i>Amazon S3 User Guide</i>.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption-customer-key\"\n          }\n        },\n        \"SSECustomerKeyMD5\": {\n          \"target\": \"com.amazonaws.s3#SSECustomerKeyMD5\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The MD5 server-side encryption (SSE) customer managed key. This parameter is needed only when the object was created using a checksum \\n    algorithm. For more information,\\n    see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/ServerSideEncryptionCustomerKeys.html\\\">Protecting data using SSE-C keys</a> in the\\n    <i>Amazon S3 User Guide</i>.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption-customer-key-MD5\"\n          }\n        },\n        \"Expression\": {\n          \"target\": \"com.amazonaws.s3#Expression\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The expression that is used to query the object.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"ExpressionType\": {\n          \"target\": \"com.amazonaws.s3#ExpressionType\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The type of the provided expression (for example, SQL).</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"RequestProgress\": {\n          \"target\": \"com.amazonaws.s3#RequestProgress\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies if periodic request progress information should be enabled.</p>\"\n          }\n        },\n        \"InputSerialization\": {\n          \"target\": \"com.amazonaws.s3#InputSerialization\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Describes the format of the data in the object that is being queried.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"OutputSerialization\": {\n          \"target\": \"com.amazonaws.s3#OutputSerialization\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Describes the format of the data that you want Amazon S3 to return in response.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"ScanRange\": {\n          \"target\": \"com.amazonaws.s3#ScanRange\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the byte range of the object to get the records from. A record is processed when its first\\n      byte is contained by the range. This parameter is optional, but when specified, it must not be empty.\\n      See RFC 2616, Section 14.35.1 about how to specify the start and end of the range.</p>\\n         <p>\\n            <code>ScanRange</code>may be used in the following ways:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code><scanrange><start>50</start><end>100</end></scanrange></code>\\n          - process only the records starting between the bytes 50 and 100 (inclusive, counting from\\n          zero)</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code><scanrange><start>50</start></scanrange></code> - process only the\\n          records starting after the byte 50</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code><scanrange><end>50</end></scanrange></code> - process only the\\n          records within the last 50 bytes of the file.</p>\\n            </li>\\n         </ul>\"\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<note>\\n            <p>Learn Amazon S3 Select is no longer available to new customers. Existing customers of Amazon S3\\n        Select can continue to use the feature as usual. <a href=\\\"http://aws.amazon.com/blogs/storage/how-to-optimize-querying-your-data-in-amazon-s3/\\\">Learn more</a>\\n            </p>\\n         </note>\\n         <p>Request to filter the contents of an Amazon S3 object based on a simple Structured Query Language (SQL)\\n      statement. In the request, along with the SQL expression, you must specify a data serialization format\\n      (JSON or CSV) of the object. Amazon S3 uses this to parse object data into records. It returns only records\\n      that match the specified SQL expression. You must also specify the data serialization format for the\\n      response. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectSELECTContent.html\\\">S3Select API Documentation</a>.</p>\",\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#SelectParameters\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"InputSerialization\": {\n          \"target\": \"com.amazonaws.s3#InputSerialization\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Describes the serialization format of the object.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"ExpressionType\": {\n          \"target\": \"com.amazonaws.s3#ExpressionType\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The type of the provided expression (for example, SQL).</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"Expression\": {\n          \"target\": \"com.amazonaws.s3#Expression\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<important>\\n            <p>Amazon S3 Select is no longer available to new customers. Existing customers of Amazon S3 Select can\\n        continue to use the feature as usual. <a href=\\\"http://aws.amazon.com/blogs/storage/how-to-optimize-querying-your-data-in-amazon-s3/\\\">Learn more</a>\\n            </p>\\n         </important>\\n         <p>The expression that is used to query the object.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"OutputSerialization\": {\n          \"target\": \"com.amazonaws.s3#OutputSerialization\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Describes how the results of the Select job are serialized.</p>\",\n            \"smithy.api#required\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<important>\\n            <p>Amazon S3 Select is no longer available to new customers. Existing customers of Amazon S3 Select can\\n        continue to use the feature as usual. <a href=\\\"http://aws.amazon.com/blogs/storage/how-to-optimize-querying-your-data-in-amazon-s3/\\\">Learn more</a>\\n            </p>\\n         </important>\\n         <p>Describes the parameters for Select job types.</p>\\n         <p>Learn <a href=\\\"http://aws.amazon.com/blogs/storage/how-to-optimize-querying-your-data-in-amazon-s3/\\\">How to\\n        optimize querying your data in Amazon S3</a> using <a href=\\\"https://docs.aws.amazon.com/athena/latest/ug/what-is.html\\\">Amazon Athena</a>, <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/transforming-objects.html\\\">S3 Object Lambda</a>, or client-side\\n      filtering.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#ServerSideEncryption\": {\n      \"type\": \"enum\",\n      \"members\": {\n        \"AES256\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"AES256\"\n          }\n        },\n        \"aws_fsx\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"aws:fsx\"\n          }\n        },\n        \"aws_kms\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"aws:kms\"\n          }\n        },\n        \"aws_kms_dsse\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"aws:kms:dsse\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#ServerSideEncryptionByDefault\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"SSEAlgorithm\": {\n          \"target\": \"com.amazonaws.s3#ServerSideEncryption\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Server-side encryption algorithm to use for the default encryption.</p>\\n         <note>\\n            <p>For directory buckets, there are only two supported values for server-side encryption: <code>AES256</code> and <code>aws:kms</code>.</p>\\n         </note>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"KMSMasterKeyID\": {\n          \"target\": \"com.amazonaws.s3#SSEKMSKeyId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Amazon Web Services Key Management Service (KMS) customer managed key ID to use for the default encryption. </p>\\n         <note>\\n            <ul>\\n               <li>\\n                  <p>\\n                     <b>General purpose buckets</b> - This parameter is allowed if and\\n            only if <code>SSEAlgorithm</code> is set to <code>aws:kms</code> or\\n            <code>aws:kms:dsse</code>.</p>\\n               </li>\\n               <li>\\n                  <p>\\n                     <b>Directory buckets</b> - This parameter is allowed if and\\n            only if <code>SSEAlgorithm</code> is set to <code>aws:kms</code>.</p>\\n               </li>\\n            </ul>\\n         </note>\\n         <p>You can specify the key ID, key alias, or the Amazon Resource Name (ARN) of the KMS key.</p>\\n         <ul>\\n            <li>\\n               <p>Key ID: <code>1234abcd-12ab-34cd-56ef-1234567890ab</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Key ARN:\\n            <code>arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Key Alias: <code>alias/alias-name</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>If you are using encryption with cross-account or Amazon Web Services service operations, you must use a fully\\n      qualified KMS key ARN. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/bucket-encryption.html#bucket-encryption-update-bucket-policy\\\">Using\\n        encryption for cross-account operations</a>.</p>\\n         <note>\\n            <ul>\\n               <li>\\n                  <p>\\n                     <b>General purpose buckets</b> - If you're specifying a customer\\n            managed KMS key, we recommend using a fully qualified KMS key ARN. If you use a KMS key\\n            alias instead, then KMS resolves the key within the requester’s account. This behavior can\\n            result in data that's encrypted with a KMS key that belongs to the requester, and not the bucket\\n            owner. Also, if you use a key ID, you can run into a LogDestination undeliverable error when\\n            creating a VPC flow log. </p>\\n               </li>\\n               <li>\\n                  <p>\\n                     <b>Directory buckets</b> -\\n            When you specify an <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk\\\">KMS customer managed key</a> for encryption in your directory bucket, only use the key ID or key ARN. The key alias format of the KMS key isn't supported.</p>\\n               </li>\\n            </ul>\\n         </note>\\n         <important>\\n            <p>Amazon S3 only supports symmetric encryption KMS keys. For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/symmetric-asymmetric.html\\\">Asymmetric keys in\\n          Amazon Web Services KMS</a> in the <i>Amazon Web Services Key Management Service Developer Guide</i>.</p>\\n         </important>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Describes the default server-side encryption to apply to new objects in the bucket. If a PUT Object\\n      request doesn't specify any server-side encryption, this default encryption will be applied. For more\\n      information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketPUTencryption.html\\\">PutBucketEncryption</a>.</p>\\n         <note>\\n            <ul>\\n               <li>\\n                  <p>\\n                     <b>General purpose buckets</b> - If you don't specify a customer managed key\\n            at configuration, Amazon S3 automatically creates an Amazon Web Services KMS key (<code>aws/s3</code>) in your Amazon Web Services\\n            account the first time that you add an object encrypted with SSE-KMS to a bucket. By default, Amazon S3\\n            uses this KMS key for SSE-KMS. </p>\\n               </li>\\n               <li>\\n                  <p>\\n                     <b>Directory buckets</b> -\\n            Your SSE-KMS configuration can only support 1 <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk\\\">customer managed key</a> per directory bucket's lifetime. \\nThe <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk\\\">Amazon Web Services managed key</a> (<code>aws/s3</code>) isn't supported. \\n</p>\\n               </li>\\n               <li>\\n                  <p>\\n                     <b>Directory buckets</b> -\\n            For directory buckets, there are only two supported options for server-side encryption: SSE-S3 and SSE-KMS.</p>\\n               </li>\\n            </ul>\\n         </note>\"\n      }\n    },\n    \"com.amazonaws.s3#ServerSideEncryptionConfiguration\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Rules\": {\n          \"target\": \"com.amazonaws.s3#ServerSideEncryptionRules\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Container for information about a particular server-side encryption configuration rule.</p>\",\n            \"smithy.api#required\": {},\n            \"smithy.api#xmlFlattened\": {},\n            \"smithy.api#xmlName\": \"Rule\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Specifies the default server-side-encryption configuration.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#ServerSideEncryptionRule\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"ApplyServerSideEncryptionByDefault\": {\n          \"target\": \"com.amazonaws.s3#ServerSideEncryptionByDefault\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the default server-side encryption to apply to new objects in the bucket. If a PUT Object\\n      request doesn't specify any server-side encryption, this default encryption will be applied.</p>\"\n          }\n        },\n        \"BucketKeyEnabled\": {\n          \"target\": \"com.amazonaws.s3#BucketKeyEnabled\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies whether Amazon S3 should use an S3 Bucket Key with server-side encryption using KMS (SSE-KMS)\\n      for new objects in the bucket. Existing objects are not affected. Setting the\\n        <code>BucketKeyEnabled</code> element to <code>true</code> causes Amazon S3 to use an S3 Bucket Key. </p>\\n         <note>\\n            <ul>\\n               <li>\\n                  <p>\\n                     <b>General purpose buckets</b> - By default, S3 Bucket Key is not\\n            enabled. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/bucket-key.html\\\">Amazon S3 Bucket Keys</a> in the\\n              <i>Amazon S3 User Guide</i>.</p>\\n               </li>\\n               <li>\\n                  <p>\\n                     <b>Directory buckets</b> -\\n            S3 Bucket Keys are always enabled for <code>GET</code> and <code>PUT</code> operations in a directory bucket and can’t be disabled. S3 Bucket Keys aren't supported, when you copy SSE-KMS encrypted objects from general purpose buckets  \\nto directory buckets, from directory buckets to general purpose buckets, or between directory buckets, through <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html\\\">CopyObject</a>, <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html\\\">UploadPartCopy</a>, <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-buckets-objects-Batch-Ops\\\">the Copy operation in Batch Operations</a>, or \\n                            <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/create-import-job\\\">the import jobs</a>. In this case, Amazon S3 makes a call to KMS every time a copy request is made for a KMS-encrypted object.</p>\\n               </li>\\n            </ul>\\n         </note>\"\n          }\n        },\n        \"BlockedEncryptionTypes\": {\n          \"target\": \"com.amazonaws.s3#BlockedEncryptionTypes\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A bucket-level setting for Amazon S3 general purpose buckets used to prevent the upload of new objects encrypted with the specified server-side encryption type. For example, blocking an encryption type will block <code>PutObject</code>, <code>CopyObject</code>, <code>PostObject</code>, multipart upload, and replication requests to the bucket for objects with the specified encryption type. However, you can continue to read and list any pre-existing objects already encrypted with the specified encryption type. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/blocking-unblocking-s3-c-encryption-gpb.html\\\">Blocking or unblocking SSE-C for a general purpose bucket</a>.</p>\\n         <note>\\n            <p>Currently, this parameter only supports blocking or unblocking server-side encryption with customer-provided keys (SSE-C). For more information about SSE-C, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/ServerSideEncryptionCustomerKeys.html\\\">Using server-side encryption with customer-provided keys (SSE-C)</a>.</p>\\n         </note>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Specifies the default server-side encryption configuration.</p>\\n         <note>\\n            <ul>\\n               <li>\\n                  <p>\\n                     <b>General purpose buckets</b> - If you're specifying a customer\\n            managed KMS key, we recommend using a fully qualified KMS key ARN. If you use a KMS key\\n            alias instead, then KMS resolves the key within the requester’s account. This behavior can\\n            result in data that's encrypted with a KMS key that belongs to the requester, and not the bucket\\n            owner.</p>\\n               </li>\\n               <li>\\n                  <p>\\n                     <b>Directory buckets</b> -\\n            When you specify an <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk\\\">KMS customer managed key</a> for encryption in your directory bucket, only use the key ID or key ARN. The key alias format of the KMS key isn't supported.</p>\\n               </li>\\n            </ul>\\n         </note>\"\n      }\n    },\n    \"com.amazonaws.s3#ServerSideEncryptionRules\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.s3#ServerSideEncryptionRule\"\n      }\n    },\n    \"com.amazonaws.s3#SessionCredentialValue\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#sensitive\": {}\n      }\n    },\n    \"com.amazonaws.s3#SessionCredentials\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"AccessKeyId\": {\n          \"target\": \"com.amazonaws.s3#AccessKeyIdValue\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A unique identifier that's associated with a secret access key. The access key ID and the secret\\n      access key are used together to sign programmatic Amazon Web Services requests cryptographically. </p>\",\n            \"smithy.api#required\": {},\n            \"smithy.api#xmlName\": \"AccessKeyId\"\n          }\n        },\n        \"SecretAccessKey\": {\n          \"target\": \"com.amazonaws.s3#SessionCredentialValue\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A key that's used with the access key ID to cryptographically sign programmatic Amazon Web Services requests.\\n      Signing a request identifies the sender and prevents the request from being altered. </p>\",\n            \"smithy.api#required\": {},\n            \"smithy.api#xmlName\": \"SecretAccessKey\"\n          }\n        },\n        \"SessionToken\": {\n          \"target\": \"com.amazonaws.s3#SessionCredentialValue\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A part of the temporary security credentials. The session token is used to validate the temporary\\n      security credentials.\\n      \\n    </p>\",\n            \"smithy.api#required\": {},\n            \"smithy.api#xmlName\": \"SessionToken\"\n          }\n        },\n        \"Expiration\": {\n          \"target\": \"com.amazonaws.s3#SessionExpiration\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Temporary security credentials expire after a specified interval. After temporary credentials\\n      expire, any calls that you make with those credentials will fail. So you must generate a new set of\\n      temporary credentials. Temporary credentials cannot be extended or refreshed beyond the original\\n      specified interval.</p>\",\n            \"smithy.api#required\": {},\n            \"smithy.api#xmlName\": \"Expiration\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>The established temporary security credentials of the session.</p>\\n         <note>\\n            <p>\\n               <b>Directory buckets</b> - These session credentials are only\\n        supported for the authentication and authorization of Zonal endpoint API operations on directory buckets.</p>\\n         </note>\"\n      }\n    },\n    \"com.amazonaws.s3#SessionExpiration\": {\n      \"type\": \"timestamp\"\n    },\n    \"com.amazonaws.s3#SessionMode\": {\n      \"type\": \"enum\",\n      \"members\": {\n        \"ReadOnly\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"ReadOnly\"\n          }\n        },\n        \"ReadWrite\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"ReadWrite\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#Setting\": {\n      \"type\": \"boolean\"\n    },\n    \"com.amazonaws.s3#SimplePrefix\": {\n      \"type\": \"structure\",\n      \"members\": {},\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>To use simple format for S3 keys for log objects, set SimplePrefix to an empty object.</p>\\n         <p>\\n            <code>[DestinationPrefix][YYYY]-[MM]-[DD]-[hh]-[mm]-[ss]-[UniqueString]</code>\\n         </p>\",\n        \"smithy.api#xmlName\": \"SimplePrefix\"\n      }\n    },\n    \"com.amazonaws.s3#Size\": {\n      \"type\": \"long\"\n    },\n    \"com.amazonaws.s3#SkipValidation\": {\n      \"type\": \"boolean\"\n    },\n    \"com.amazonaws.s3#SourceSelectionCriteria\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"SseKmsEncryptedObjects\": {\n          \"target\": \"com.amazonaws.s3#SseKmsEncryptedObjects\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p> A container for filter information for the selection of Amazon S3 objects encrypted with Amazon Web Services KMS. If\\n      you include <code>SourceSelectionCriteria</code> in the replication configuration, this element is\\n      required. </p>\"\n          }\n        },\n        \"ReplicaModifications\": {\n          \"target\": \"com.amazonaws.s3#ReplicaModifications\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A filter that you can specify for selections for modifications on replicas. Amazon S3 doesn't replicate\\n      replica modifications by default. In the latest version of replication configuration (when\\n        <code>Filter</code> is specified), you can specify this element and set the status to\\n        <code>Enabled</code> to replicate modifications on replicas. </p>\\n         <note>\\n            <p> If you don't specify the <code>Filter</code> element, Amazon S3 assumes that the replication\\n        configuration is the earlier version, V1. In the earlier version, this element is not allowed</p>\\n         </note>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>A container that describes additional filters for identifying the source objects that you want to\\n      replicate. You can choose to enable or disable the replication of these objects. Currently, Amazon S3\\n      supports only the filter that you can specify for objects created with server-side encryption using a\\n      customer managed key stored in Amazon Web Services Key Management Service (SSE-KMS).</p>\"\n      }\n    },\n    \"com.amazonaws.s3#SseKmsEncryptedObjects\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Status\": {\n          \"target\": \"com.amazonaws.s3#SseKmsEncryptedObjectsStatus\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies whether Amazon S3 replicates objects created with server-side encryption using an Amazon Web Services KMS key\\n      stored in Amazon Web Services Key Management Service.</p>\",\n            \"smithy.api#required\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>A container for filter information for the selection of S3 objects encrypted with Amazon Web Services KMS.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#SseKmsEncryptedObjectsStatus\": {\n      \"type\": \"enum\",\n      \"members\": {\n        \"Enabled\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"Enabled\"\n          }\n        },\n        \"Disabled\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"Disabled\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#Start\": {\n      \"type\": \"long\"\n    },\n    \"com.amazonaws.s3#StartAfter\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#Stats\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"BytesScanned\": {\n          \"target\": \"com.amazonaws.s3#BytesScanned\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The total number of object bytes scanned.</p>\"\n          }\n        },\n        \"BytesProcessed\": {\n          \"target\": \"com.amazonaws.s3#BytesProcessed\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The total number of uncompressed object bytes processed.</p>\"\n          }\n        },\n        \"BytesReturned\": {\n          \"target\": \"com.amazonaws.s3#BytesReturned\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The total number of bytes of records payload data returned.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Container for the stats details.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#StatsEvent\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Details\": {\n          \"target\": \"com.amazonaws.s3#Stats\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Stats event details.</p>\",\n            \"smithy.api#eventPayload\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Container for the Stats Event.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#StorageClass\": {\n      \"type\": \"enum\",\n      \"members\": {\n        \"STANDARD\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"STANDARD\"\n          }\n        },\n        \"REDUCED_REDUNDANCY\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"REDUCED_REDUNDANCY\"\n          }\n        },\n        \"STANDARD_IA\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"STANDARD_IA\"\n          }\n        },\n        \"ONEZONE_IA\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"ONEZONE_IA\"\n          }\n        },\n        \"INTELLIGENT_TIERING\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"INTELLIGENT_TIERING\"\n          }\n        },\n        \"GLACIER\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"GLACIER\"\n          }\n        },\n        \"DEEP_ARCHIVE\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"DEEP_ARCHIVE\"\n          }\n        },\n        \"OUTPOSTS\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"OUTPOSTS\"\n          }\n        },\n        \"GLACIER_IR\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"GLACIER_IR\"\n          }\n        },\n        \"SNOW\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"SNOW\"\n          }\n        },\n        \"EXPRESS_ONEZONE\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"EXPRESS_ONEZONE\"\n          }\n        },\n        \"FSX_OPENZFS\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"FSX_OPENZFS\"\n          }\n        },\n        \"FSX_ONTAP\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"FSX_ONTAP\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#StorageClassAnalysis\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"DataExport\": {\n          \"target\": \"com.amazonaws.s3#StorageClassAnalysisDataExport\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies how data related to the storage class analysis for an Amazon S3 bucket should be\\n      exported.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Specifies data related to access patterns to be collected and made available to analyze the\\n      tradeoffs between different storage classes for an Amazon S3 bucket.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#StorageClassAnalysisDataExport\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"OutputSchemaVersion\": {\n          \"target\": \"com.amazonaws.s3#StorageClassAnalysisSchemaVersion\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The version of the output schema to use when exporting data. Must be <code>V_1</code>.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"Destination\": {\n          \"target\": \"com.amazonaws.s3#AnalyticsExportDestination\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The place to store the data for an analysis.</p>\",\n            \"smithy.api#required\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Container for data related to the storage class analysis for an Amazon S3 bucket for export.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#StorageClassAnalysisSchemaVersion\": {\n      \"type\": \"enum\",\n      \"members\": {\n        \"V_1\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"V_1\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#StreamingBlob\": {\n      \"type\": \"blob\",\n      \"traits\": {\n        \"smithy.api#streaming\": {}\n      }\n    },\n    \"com.amazonaws.s3#Suffix\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#TableSseAlgorithm\": {\n      \"type\": \"enum\",\n      \"members\": {\n        \"aws_kms\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"aws:kms\"\n          }\n        },\n        \"AES256\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"AES256\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#Tag\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Key\": {\n          \"target\": \"com.amazonaws.s3#ObjectKey\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Name of the object key.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"Value\": {\n          \"target\": \"com.amazonaws.s3#Value\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Value of the tag.</p>\",\n            \"smithy.api#required\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>A container of a key value name pair.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#TagCount\": {\n      \"type\": \"integer\"\n    },\n    \"com.amazonaws.s3#TagSet\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.s3#Tag\",\n        \"traits\": {\n          \"smithy.api#xmlName\": \"Tag\"\n        }\n      }\n    },\n    \"com.amazonaws.s3#Tagging\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"TagSet\": {\n          \"target\": \"com.amazonaws.s3#TagSet\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A collection for a set of tags</p>\",\n            \"smithy.api#required\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Container for <code>TagSet</code> elements.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#TaggingDirective\": {\n      \"type\": \"enum\",\n      \"members\": {\n        \"COPY\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"COPY\"\n          }\n        },\n        \"REPLACE\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"REPLACE\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#TaggingHeader\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#TargetBucket\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#TargetGrant\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Grantee\": {\n          \"target\": \"com.amazonaws.s3#Grantee\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Container for the person being granted permissions.</p>\",\n            \"smithy.api#xmlNamespace\": {\n              \"uri\": \"http://www.w3.org/2001/XMLSchema-instance\",\n              \"prefix\": \"xsi\"\n            }\n          }\n        },\n        \"Permission\": {\n          \"target\": \"com.amazonaws.s3#BucketLogsPermission\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Logging permissions assigned to the grantee for the bucket.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Container for granting information.</p>\\n         <p>Buckets that use the bucket owner enforced setting for Object Ownership don't support target grants.\\n      For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/enable-server-access-logging.html#grant-log-delivery-permissions-general\\\">Permissions server access log delivery</a> in the <i>Amazon S3 User Guide</i>.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#TargetGrants\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.s3#TargetGrant\",\n        \"traits\": {\n          \"smithy.api#xmlName\": \"Grant\"\n        }\n      }\n    },\n    \"com.amazonaws.s3#TargetObjectKeyFormat\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"SimplePrefix\": {\n          \"target\": \"com.amazonaws.s3#SimplePrefix\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>To use the simple format for S3 keys for log objects. To specify SimplePrefix format, set\\n      SimplePrefix to {}.</p>\",\n            \"smithy.api#xmlName\": \"SimplePrefix\"\n          }\n        },\n        \"PartitionedPrefix\": {\n          \"target\": \"com.amazonaws.s3#PartitionedPrefix\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Partitioned S3 key for log objects.</p>\",\n            \"smithy.api#xmlName\": \"PartitionedPrefix\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Amazon S3 key format for log objects. Only one format, PartitionedPrefix or SimplePrefix, is\\n      allowed.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#TargetPrefix\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#Tier\": {\n      \"type\": \"enum\",\n      \"members\": {\n        \"Standard\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"Standard\"\n          }\n        },\n        \"Bulk\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"Bulk\"\n          }\n        },\n        \"Expedited\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"Expedited\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#Tiering\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Days\": {\n          \"target\": \"com.amazonaws.s3#IntelligentTieringDays\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The number of consecutive days of no access after which an object will be eligible to be\\n      transitioned to the corresponding tier. The minimum number of days specified for Archive Access tier\\n      must be at least 90 days and Deep Archive Access tier must be at least 180 days. The maximum can be up to\\n      2 years (730 days).</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"AccessTier\": {\n          \"target\": \"com.amazonaws.s3#IntelligentTieringAccessTier\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>S3 Intelligent-Tiering access tier. See <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/storage-class-intro.html#sc-dynamic-data-access\\\">Storage class for\\n        automatically optimizing frequently and infrequently accessed objects</a> for a list of access\\n      tiers in the S3 Intelligent-Tiering storage class.</p>\",\n            \"smithy.api#required\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>The S3 Intelligent-Tiering storage class is designed to optimize storage costs by automatically\\n      moving data to the most cost-effective storage access tier, without additional operational\\n      overhead.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#TieringList\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.s3#Tiering\"\n      }\n    },\n    \"com.amazonaws.s3#Token\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#TooManyParts\": {\n      \"type\": \"structure\",\n      \"members\": {},\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p> You have attempted to add more parts than the maximum of 10000 that are allowed for this object.\\n      You can use the CopyObject operation to copy this object to another and then add more data to the newly\\n      copied object. </p>\",\n        \"smithy.api#error\": \"client\",\n        \"smithy.api#httpError\": 400\n      }\n    },\n    \"com.amazonaws.s3#TopicArn\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#TopicConfiguration\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Id\": {\n          \"target\": \"com.amazonaws.s3#NotificationId\"\n        },\n        \"TopicArn\": {\n          \"target\": \"com.amazonaws.s3#TopicArn\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the Amazon SNS topic to which Amazon S3 publishes a message when it\\n      detects events of the specified type.</p>\",\n            \"smithy.api#required\": {},\n            \"smithy.api#xmlName\": \"Topic\"\n          }\n        },\n        \"Events\": {\n          \"target\": \"com.amazonaws.s3#EventList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Amazon S3 bucket event about which to send notifications. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/NotificationHowTo.html\\\">Supported Event Types</a> in\\n      the <i>Amazon S3 User Guide</i>.</p>\",\n            \"smithy.api#required\": {},\n            \"smithy.api#xmlFlattened\": {},\n            \"smithy.api#xmlName\": \"Event\"\n          }\n        },\n        \"Filter\": {\n          \"target\": \"com.amazonaws.s3#NotificationConfigurationFilter\"\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>A container for specifying the configuration for publication of messages to an Amazon Simple\\n      Notification Service (Amazon SNS) topic when Amazon S3 detects specified events.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#TopicConfigurationList\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.s3#TopicConfiguration\"\n      }\n    },\n    \"com.amazonaws.s3#Transition\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Date\": {\n          \"target\": \"com.amazonaws.s3#Date\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Indicates when objects are transitioned to the specified storage class. The date value must be in\\n      ISO 8601 format. The time is always midnight UTC.</p>\"\n          }\n        },\n        \"Days\": {\n          \"target\": \"com.amazonaws.s3#Days\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Indicates the number of days after creation when objects are transitioned to the specified storage\\n      class. If the specified storage class is <code>INTELLIGENT_TIERING</code>, <code>GLACIER_IR</code>,\\n        <code>GLACIER</code>, or <code>DEEP_ARCHIVE</code>, valid values are <code>0</code> or positive\\n      integers. If the specified storage class is <code>STANDARD_IA</code> or <code>ONEZONE_IA</code>, valid\\n      values are positive integers greater than <code>30</code>. Be aware that some storage classes have a\\n      minimum storage duration and that you're charged for transitioning objects before their minimum storage\\n      duration. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/lifecycle-transition-general-considerations.html#lifecycle-configuration-constraints\\\"> Constraints and considerations for transitions</a> in the <i>Amazon S3 User\\n        Guide</i>.</p>\"\n          }\n        },\n        \"StorageClass\": {\n          \"target\": \"com.amazonaws.s3#TransitionStorageClass\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The storage class to which you want the object to transition.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Specifies when an object transitions to a specified storage class. For more information about Amazon S3\\n      lifecycle configuration rules, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/lifecycle-transition-general-considerations.html\\\">Transitioning Objects Using\\n        Amazon S3 Lifecycle</a> in the <i>Amazon S3 User Guide</i>.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#TransitionDefaultMinimumObjectSize\": {\n      \"type\": \"enum\",\n      \"members\": {\n        \"varies_by_storage_class\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"varies_by_storage_class\"\n          }\n        },\n        \"all_storage_classes_128K\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"all_storage_classes_128K\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#TransitionList\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.s3#Transition\"\n      }\n    },\n    \"com.amazonaws.s3#TransitionStorageClass\": {\n      \"type\": \"enum\",\n      \"members\": {\n        \"GLACIER\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"GLACIER\"\n          }\n        },\n        \"STANDARD_IA\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"STANDARD_IA\"\n          }\n        },\n        \"ONEZONE_IA\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"ONEZONE_IA\"\n          }\n        },\n        \"INTELLIGENT_TIERING\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"INTELLIGENT_TIERING\"\n          }\n        },\n        \"DEEP_ARCHIVE\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"DEEP_ARCHIVE\"\n          }\n        },\n        \"GLACIER_IR\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"GLACIER_IR\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#Type\": {\n      \"type\": \"enum\",\n      \"members\": {\n        \"CanonicalUser\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"CanonicalUser\"\n          }\n        },\n        \"AmazonCustomerByEmail\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"AmazonCustomerByEmail\"\n          }\n        },\n        \"Group\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"Group\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#URI\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#UpdateBucketMetadataInventoryTableConfiguration\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#UpdateBucketMetadataInventoryTableConfigurationRequest\"\n      },\n      \"output\": {\n        \"target\": \"smithy.api#Unit\"\n      },\n      \"traits\": {\n        \"aws.protocols#httpChecksum\": {\n          \"requestAlgorithmMember\": \"ChecksumAlgorithm\",\n          \"requestChecksumRequired\": true\n        },\n        \"smithy.api#documentation\": \"<p>Enables or disables a live inventory table for an S3 Metadata configuration on a general \\n      purpose bucket. For more information, see\\n      <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/metadata-tables-overview.html\\\">Accelerating\\n        data discovery with S3 Metadata</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <dl>\\n            <dt>Permissions</dt>\\n            <dd>\\n               <p>To use this operation, you must have the following permissions. For more information, see\\n            <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/metadata-tables-permissions.html\\\">Setting up permissions for configuring metadata tables</a> in the\\n            <i>Amazon S3 User Guide</i>.</p>\\n               <p>If you want to encrypt your inventory table with server-side encryption with Key Management Service\\n            (KMS) keys (SSE-KMS), you need additional permissions in your KMS key policy. For more\\n            information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/metadata-tables-permissions.html\\\">\\n              Setting up permissions for configuring metadata tables</a> in the\\n            <i>Amazon S3 User Guide</i>.</p>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <code>s3:UpdateBucketMetadataInventoryTableConfiguration</code>\\n                     </p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <code>s3tables:CreateTableBucket</code>\\n                     </p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <code>s3tables:CreateNamespace</code>\\n                     </p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <code>s3tables:GetTable</code>\\n                     </p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <code>s3tables:CreateTable</code>\\n                     </p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <code>s3tables:PutTablePolicy</code>\\n                     </p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <code>s3tables:PutTableEncryption</code>\\n                     </p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <code>kms:DescribeKey</code>\\n                     </p>\\n                  </li>\\n               </ul>\\n            </dd>\\n         </dl>\\n         <p>The following operations are related to <code>UpdateBucketMetadataInventoryTableConfiguration</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateBucketMetadataConfiguration.html\\\">CreateBucketMetadataConfiguration</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketMetadataConfiguration.html\\\">DeleteBucketMetadataConfiguration</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketMetadataConfiguration.html\\\">GetBucketMetadataConfiguration</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_UpdateBucketMetadataJournalTableConfiguration.html\\\">UpdateBucketMetadataJournalTableConfiguration</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#http\": {\n          \"method\": \"PUT\",\n          \"uri\": \"/{Bucket}?metadataInventoryTable\",\n          \"code\": 200\n        },\n        \"smithy.rules#staticContextParams\": {\n          \"UseS3ExpressControlEndpoint\": {\n            \"value\": true\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#UpdateBucketMetadataInventoryTableConfigurationRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>\\n      The general purpose bucket that corresponds to the metadata configuration that you want to \\n      enable or disable an inventory table for.\\n    </p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"ContentMD5\": {\n          \"target\": \"com.amazonaws.s3#ContentMD5\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>\\n      The <code>Content-MD5</code> header for the inventory table configuration.\\n    </p>\",\n            \"smithy.api#httpHeader\": \"Content-MD5\"\n          }\n        },\n        \"ChecksumAlgorithm\": {\n          \"target\": \"com.amazonaws.s3#ChecksumAlgorithm\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>\\n      The checksum algorithm to use with your inventory table configuration.\\n    </p>\",\n            \"smithy.api#httpHeader\": \"x-amz-sdk-checksum-algorithm\"\n          }\n        },\n        \"InventoryTableConfiguration\": {\n          \"target\": \"com.amazonaws.s3#InventoryTableConfigurationUpdates\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>\\n      The contents of your inventory table configuration.      \\n    </p>\",\n            \"smithy.api#httpPayload\": {},\n            \"smithy.api#required\": {},\n            \"smithy.api#xmlName\": \"InventoryTableConfiguration\"\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>\\n      The expected owner of the general purpose bucket that corresponds to the metadata table \\n      configuration that you want to enable or disable an inventory table for.\\n    </p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#UpdateBucketMetadataJournalTableConfiguration\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#UpdateBucketMetadataJournalTableConfigurationRequest\"\n      },\n      \"output\": {\n        \"target\": \"smithy.api#Unit\"\n      },\n      \"traits\": {\n        \"aws.protocols#httpChecksum\": {\n          \"requestAlgorithmMember\": \"ChecksumAlgorithm\",\n          \"requestChecksumRequired\": true\n        },\n        \"smithy.api#documentation\": \"<p>Enables or disables journal table record expiration for an S3 Metadata configuration on a general \\n      purpose bucket. For more information, see\\n      <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/metadata-tables-overview.html\\\">Accelerating\\n        data discovery with S3 Metadata</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <dl>\\n            <dt>Permissions</dt>\\n            <dd>\\n               <p>To use this operation, you must have the <code>s3:UpdateBucketMetadataJournalTableConfiguration</code>\\n            permission. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/metadata-tables-permissions.html\\\">Setting up permissions for\\n              configuring metadata tables</a> in the <i>Amazon S3 User Guide</i>. </p>\\n            </dd>\\n         </dl>\\n         <p>The following operations are related to <code>UpdateBucketMetadataJournalTableConfiguration</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateBucketMetadataConfiguration.html\\\">CreateBucketMetadataConfiguration</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_DeleteBucketMetadataConfiguration.html\\\">DeleteBucketMetadataConfiguration</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetBucketMetadataConfiguration.html\\\">GetBucketMetadataConfiguration</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_UpdateBucketMetadataInventoryTableConfiguration.html\\\">UpdateBucketMetadataInventoryTableConfiguration</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#http\": {\n          \"method\": \"PUT\",\n          \"uri\": \"/{Bucket}?metadataJournalTable\",\n          \"code\": 200\n        },\n        \"smithy.rules#staticContextParams\": {\n          \"UseS3ExpressControlEndpoint\": {\n            \"value\": true\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#UpdateBucketMetadataJournalTableConfigurationRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>\\n      The general purpose bucket that corresponds to the metadata configuration that you want to \\n      enable or disable journal table record expiration for.\\n    </p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"ContentMD5\": {\n          \"target\": \"com.amazonaws.s3#ContentMD5\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>\\n      The <code>Content-MD5</code> header for the journal table configuration.\\n    </p>\",\n            \"smithy.api#httpHeader\": \"Content-MD5\"\n          }\n        },\n        \"ChecksumAlgorithm\": {\n          \"target\": \"com.amazonaws.s3#ChecksumAlgorithm\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>\\n      The checksum algorithm to use with your journal table configuration.\\n    </p>\",\n            \"smithy.api#httpHeader\": \"x-amz-sdk-checksum-algorithm\"\n          }\n        },\n        \"JournalTableConfiguration\": {\n          \"target\": \"com.amazonaws.s3#JournalTableConfigurationUpdates\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>\\n      The contents of your journal table configuration.\\n    </p>\",\n            \"smithy.api#httpPayload\": {},\n            \"smithy.api#required\": {},\n            \"smithy.api#xmlName\": \"JournalTableConfiguration\"\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>\\n      The expected owner of the general purpose bucket that corresponds to the metadata table \\n      configuration that you want to enable or disable journal table record expiration for.      \\n    </p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#UploadIdMarker\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#UploadPart\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#UploadPartRequest\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.s3#UploadPartOutput\"\n      },\n      \"traits\": {\n        \"aws.protocols#httpChecksum\": {\n          \"requestAlgorithmMember\": \"ChecksumAlgorithm\"\n        },\n        \"smithy.api#documentation\": \"<p>Uploads a part in a multipart upload.</p>\\n         <note>\\n            <p>In this operation, you provide new data as a part of an object in your request. However, you have\\n        an option to specify your existing Amazon S3 object as a data source for the part you are uploading. To\\n        upload a part from an existing object, you use the <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html\\\">UploadPartCopy</a> operation. </p>\\n         </note>\\n         <p>You must initiate a multipart upload (see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateMultipartUpload.html\\\">CreateMultipartUpload</a>) before you can\\n      upload any part. In response to your initiate request, Amazon S3 returns an upload ID, a unique identifier\\n      that you must include in your upload part request.</p>\\n         <p>Part numbers can be any number from 1 to 10,000, inclusive. A part number uniquely identifies a part\\n      and also defines its position within the object being created. If you upload a new part using the same\\n      part number that was used with a previous part, the previously uploaded part is overwritten.</p>\\n         <p>For information about maximum and minimum part sizes and other multipart upload specifications, see\\n        <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/qfacts.html\\\">Multipart upload\\n        limits</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <note>\\n            <p>After you initiate multipart upload and upload one or more parts, you must either complete or\\n        abort multipart upload in order to stop getting charged for storage of the uploaded parts. Only after\\n        you either complete or abort multipart upload, Amazon S3 frees up the parts storage and stops charging you\\n        for the parts storage.</p>\\n         </note>\\n         <p>For more information on multipart uploads, go to <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/mpuoverview.html\\\">Multipart Upload Overview</a> in the\\n        <i>Amazon S3 User Guide </i>.</p>\\n         <note>\\n            <p>\\n               <b>Directory buckets</b> - For directory buckets, you must make requests for this API operation to the Zonal endpoint. These endpoints support virtual-hosted-style requests in the format <code>https://<i>amzn-s3-demo-bucket</i>.s3express-<i>zone-id</i>.<i>region-code</i>.amazonaws.com/<i>key-name</i>\\n               </code>. Path-style requests are not supported. For more information about endpoints in Availability Zones, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/endpoint-directory-buckets-AZ.html\\\">Regional and Zonal endpoints for directory buckets in Availability Zones</a> in the\\n    <i>Amazon S3 User Guide</i>. For more information about endpoints in Local Zones, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-lzs-for-directory-buckets.html\\\">Concepts for directory buckets in Local Zones</a> in the\\n    <i>Amazon S3 User Guide</i>.</p>\\n         </note>\\n         <dl>\\n            <dt>Permissions</dt>\\n            <dd>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <b>General purpose bucket permissions</b> - To perform a\\n                multipart upload with encryption using an Key Management Service key, the requester must have permission to\\n                the <code>kms:Decrypt</code> and <code>kms:GenerateDataKey</code> actions on the key. The\\n                requester must also have permissions for the <code>kms:GenerateDataKey</code> action for the\\n                  <code>CreateMultipartUpload</code> API. Then, the requester needs permissions for the\\n                  <code>kms:Decrypt</code> action on the <code>UploadPart</code> and\\n                  <code>UploadPartCopy</code> APIs.</p>\\n                     <p>These permissions are required because Amazon S3 must decrypt and read data from the encrypted\\n                file parts before it completes the multipart upload. For more information about KMS\\n                permissions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingKMSEncryption.html\\\">Protecting data using server-side\\n                  encryption with KMS</a> in the <i>Amazon S3 User Guide</i>. For information\\n                about the permissions required to use the multipart upload API, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/mpuAndPermissions.html\\\">Multipart upload and\\n                  permissions</a> and <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/mpuoverview.html#mpuAndPermissions\\\">Multipart upload API and\\n                  permissions</a> in the <i>Amazon S3 User Guide</i>.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <b>Directory bucket permissions</b> - To grant access to this API operation on a directory bucket, we recommend that you use the <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateSession.html\\\">\\n                           <code>CreateSession</code>\\n                        </a> API operation for session-based authorization. Specifically, you grant the <code>s3express:CreateSession</code> permission to the directory bucket in a bucket policy or an IAM identity-based policy. Then, you make the <code>CreateSession</code> API call on the bucket to obtain a session token. With the session token in your request header, you can make API requests to this operation. After the session token expires, you make another <code>CreateSession</code> API call to generate a new session token for use. \\nAmazon Web Services CLI or SDKs create session and refresh the session token automatically to avoid service interruptions when a session expires. For more information about authorization, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateSession.html\\\">\\n                           <code>CreateSession</code>\\n                        </a>.</p>\\n                     <p>If the object is encrypted with SSE-KMS, you must also have the\\n                  <code>kms:GenerateDataKey</code> and <code>kms:Decrypt</code> permissions in IAM\\n                identity-based policies and KMS key policies for the KMS key.</p>\\n                  </li>\\n               </ul>\\n            </dd>\\n            <dt>Data integrity</dt>\\n            <dd>\\n               <p>\\n                  <b>General purpose bucket</b> - To ensure that data is not corrupted\\n            traversing the network, specify the <code>Content-MD5</code> header in the upload part request.\\n            Amazon S3 checks the part data against the provided MD5 value. If they do not match, Amazon S3 returns an\\n            error. If the upload request is signed with Signature Version 4, then Amazon Web Services S3 uses the\\n              <code>x-amz-content-sha256</code> header as a checksum instead of <code>Content-MD5</code>. For\\n            more information see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-auth-using-authorization-header.html\\\">Authenticating Requests:\\n              Using the Authorization Header (Amazon Web Services Signature Version 4)</a>. </p>\\n               <note>\\n                  <p>\\n                     <b>Directory buckets</b> - MD5 is not supported by directory buckets. You can use checksum algorithms to check object integrity.</p>\\n               </note>\\n            </dd>\\n            <dt>Encryption</dt>\\n            <dd>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <b>General purpose bucket</b> - Server-side encryption is for\\n                data encryption at rest. Amazon S3 encrypts your data as it writes it to disks in its data centers\\n                and decrypts it when you access it. You have mutually exclusive options to protect data using\\n                server-side encryption in Amazon S3, depending on how you choose to manage the encryption keys.\\n                Specifically, the encryption key options are Amazon S3 managed keys (SSE-S3), Amazon Web Services KMS keys\\n                (SSE-KMS), and Customer-Provided Keys (SSE-C). Amazon S3 encrypts data with server-side encryption\\n                using Amazon S3 managed keys (SSE-S3) by default. You can optionally tell Amazon S3 to encrypt data at\\n                rest using server-side encryption with other key options. The option you use depends on\\n                whether you want to use KMS keys (SSE-KMS) or provide your own encryption key\\n                (SSE-C).</p>\\n                     <p>Server-side encryption is supported by the S3 Multipart Upload operations. Unless you are\\n                using a customer-provided encryption key (SSE-C), you don't need to specify the encryption\\n                parameters in each UploadPart request. Instead, you only need to specify the server-side\\n                encryption parameters in the initial Initiate Multipart request. For more information, see\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateMultipartUpload.html\\\">CreateMultipartUpload</a>.</p>\\n                     <note>\\n                        <p>If you have server-side encryption with customer-provided keys (SSE-C) blocked for your general purpose bucket, you will get an HTTP 403 Access Denied error when you specify the SSE-C request headers while writing new data to your bucket. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/blocking-unblocking-s3-c-encryption-gpb.html\\\">Blocking or unblocking SSE-C for a general purpose bucket</a>.</p>\\n                     </note>\\n                     <p>If you request server-side encryption using a customer-provided encryption key (SSE-C) in\\n                your initiate multipart upload request, you must provide identical encryption information in\\n                each part upload using the following request headers.</p>\\n                     <ul>\\n                        <li>\\n                           <p>x-amz-server-side-encryption-customer-algorithm</p>\\n                        </li>\\n                        <li>\\n                           <p>x-amz-server-side-encryption-customer-key</p>\\n                        </li>\\n                        <li>\\n                           <p>x-amz-server-side-encryption-customer-key-MD5</p>\\n                        </li>\\n                     </ul>\\n                     <p> For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/UsingServerSideEncryption.html\\\">Using Server-Side\\n                  Encryption</a> in the <i>Amazon S3 User Guide</i>.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <b>Directory buckets </b> -\\n                For directory buckets, there are only two supported options for server-side encryption: server-side encryption with Amazon S3 managed keys (SSE-S3) (<code>AES256</code>) and server-side encryption with KMS keys (SSE-KMS) (<code>aws:kms</code>).</p>\\n                  </li>\\n               </ul>\\n            </dd>\\n            <dt>Special errors</dt>\\n            <dd>\\n               <ul>\\n                  <li>\\n                     <p>Error Code: <code>NoSuchUpload</code>\\n                     </p>\\n                     <ul>\\n                        <li>\\n                           <p>Description: The specified multipart upload does not exist. The upload ID might be\\n                    invalid, or the multipart upload might have been aborted or completed.</p>\\n                        </li>\\n                        <li>\\n                           <p>HTTP Status Code: 404 Not Found </p>\\n                        </li>\\n                        <li>\\n                           <p>SOAP Fault Code Prefix: Client</p>\\n                        </li>\\n                     </ul>\\n                  </li>\\n               </ul>\\n            </dd>\\n            <dt>HTTP Host header syntax</dt>\\n            <dd>\\n               <p>\\n                  <b>Directory buckets </b> - The HTTP Host header syntax is <code>\\n                     <i>Bucket-name</i>.s3express-<i>zone-id</i>.<i>region-code</i>.amazonaws.com</code>.</p>\\n            </dd>\\n         </dl>\\n         <p>The following operations are related to <code>UploadPart</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateMultipartUpload.html\\\">CreateMultipartUpload</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html\\\">CompleteMultipartUpload</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_AbortMultipartUpload.html\\\">AbortMultipartUpload</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListParts.html\\\">ListParts</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListMultipartUploads.html\\\">ListMultipartUploads</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#examples\": [\n          {\n            \"title\": \"To upload a part\",\n            \"documentation\": \"The following example uploads part 1 of a multipart upload. The example specifies a file name for the part data. The Upload ID is same that is returned by the initiate multipart upload.\",\n            \"input\": {\n              \"Body\": \"fileToUpload\",\n              \"Bucket\": \"examplebucket\",\n              \"Key\": \"examplelargeobject\",\n              \"PartNumber\": 1,\n              \"UploadId\": \"xadcOB_7YPBOJuoFiQ9cz4P3Pe6FIZwO4f7wN93uHsNBEw97pl5eNwzExg0LAT2dUN91cOmrEQHDsP3WA60CEg--\"\n            },\n            \"output\": {\n              \"ETag\": \"\\\"d8c2eafd90c266e19ab9dcacc479f8af\\\"\"\n            }\n          }\n        ],\n        \"smithy.api#http\": {\n          \"method\": \"PUT\",\n          \"uri\": \"/{Bucket}/{Key+}?x-id=UploadPart\",\n          \"code\": 200\n        }\n      }\n    },\n    \"com.amazonaws.s3#UploadPartCopy\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#UploadPartCopyRequest\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.s3#UploadPartCopyOutput\"\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Uploads a part by copying data from an existing object as data source. To specify the data source,\\n      you add the request header <code>x-amz-copy-source</code> in your request. To specify a byte range, you\\n      add the request header <code>x-amz-copy-source-range</code> in your request. </p>\\n         <p>For information about maximum and minimum part sizes and other multipart upload specifications, see\\n        <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/qfacts.html\\\">Multipart upload\\n        limits</a> in the <i>Amazon S3 User Guide</i>. </p>\\n         <note>\\n            <p>Instead of copying data from an existing object as part data, you might use the <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPart.html\\\">UploadPart</a> action to\\n        upload new data as a part of an object in your request.</p>\\n         </note>\\n         <p>You must initiate a multipart upload before you can upload any part. In response to your initiate\\n      request, Amazon S3 returns the upload ID, a unique identifier that you must include in your upload part\\n      request.</p>\\n         <p>For conceptual information about multipart uploads, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/uploadobjusingmpu.html\\\">Uploading Objects Using Multipart Upload</a> in\\n      the <i>Amazon S3 User Guide</i>. For information about copying objects using a single atomic\\n      action vs. a multipart upload, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/ObjectOperations.html\\\">Operations on Objects</a> in the\\n        <i>Amazon S3 User Guide</i>.</p>\\n         <note>\\n            <p>\\n               <b>Directory buckets</b> - For directory buckets, you must make requests for this API operation to the Zonal endpoint. These endpoints support virtual-hosted-style requests in the format <code>https://<i>amzn-s3-demo-bucket</i>.s3express-<i>zone-id</i>.<i>region-code</i>.amazonaws.com/<i>key-name</i>\\n               </code>. Path-style requests are not supported. For more information about endpoints in Availability Zones, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/endpoint-directory-buckets-AZ.html\\\">Regional and Zonal endpoints for directory buckets in Availability Zones</a> in the\\n    <i>Amazon S3 User Guide</i>. For more information about endpoints in Local Zones, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-lzs-for-directory-buckets.html\\\">Concepts for directory buckets in Local Zones</a> in the\\n    <i>Amazon S3 User Guide</i>.</p>\\n         </note>\\n         <dl>\\n            <dt>Authentication and authorization</dt>\\n            <dd>\\n               <p>All <code>UploadPartCopy</code> requests must be authenticated and signed by using IAM\\n            credentials (access key ID and secret access key for the IAM identities). All headers with the\\n              <code>x-amz-</code> prefix, including <code>x-amz-copy-source</code>, must be signed. For more\\n            information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html\\\">REST Authentication</a>.</p>\\n               <p>\\n                  <b>Directory buckets</b> - You must use IAM credentials to\\n            authenticate and authorize your access to the <code>UploadPartCopy</code> API operation, instead\\n            of using the temporary security credentials through the <code>CreateSession</code> API\\n            operation.</p>\\n               <p>Amazon Web Services CLI or SDKs handles authentication and authorization on your behalf.</p>\\n            </dd>\\n            <dt>Permissions</dt>\\n            <dd>\\n               <p>You must have <code>READ</code> access to the source object and <code>WRITE</code> access to\\n            the destination bucket.</p>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <b>General purpose bucket permissions</b> - You must have the\\n                permissions in a policy based on the bucket types of your source bucket and destination bucket\\n                in an <code>UploadPartCopy</code> operation.</p>\\n                     <ul>\\n                        <li>\\n                           <p>If the source object is in a general purpose bucket, you must have the <b>\\n                                 <code>s3:GetObject</code>\\n                              </b> permission to read the source object that is\\n                    being copied. </p>\\n                        </li>\\n                        <li>\\n                           <p>If the destination bucket is a general purpose bucket, you must have the <b>\\n                                 <code>s3:PutObject</code>\\n                              </b> permission to write the object copy to\\n                    the destination bucket. </p>\\n                        </li>\\n                        <li>\\n                           <p>To perform a multipart upload with encryption using an Key Management Service key, the requester\\n                    must have permission to the <code>kms:Decrypt</code> and <code>kms:GenerateDataKey</code>\\n                    actions on the key. The requester must also have permissions for the\\n                      <code>kms:GenerateDataKey</code> action for the <code>CreateMultipartUpload</code> API.\\n                    Then, the requester needs permissions for the <code>kms:Decrypt</code> action on the\\n                      <code>UploadPart</code> and <code>UploadPartCopy</code> APIs. These permissions are\\n                    required because Amazon S3 must decrypt and read data from the encrypted file parts before it\\n                    completes the multipart upload. For more information about KMS permissions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/UsingKMSEncryption.html\\\">Protecting\\n                      data using server-side encryption with KMS</a> in the\\n                      <i>Amazon S3 User Guide</i>. For information about the permissions required to\\n                    use the multipart upload API, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/mpuAndPermissions.html\\\">Multipart upload and\\n                      permissions</a> and <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/mpuoverview.html#mpuAndPermissions\\\">Multipart upload API\\n                      and permissions</a> in the <i>Amazon S3 User Guide</i>.</p>\\n                        </li>\\n                     </ul>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <b>Directory bucket permissions</b> - You must have\\n                permissions in a bucket policy or an IAM identity-based policy based on the source and destination bucket types\\n                in an <code>UploadPartCopy</code> operation.</p>\\n                     <ul>\\n                        <li>\\n                           <p>If the source object that you want to copy is in a directory bucket, you must have\\n                    the <b>\\n                                 <code>s3express:CreateSession</code>\\n                              </b> permission in\\n                    the <code>Action</code> element of a policy to read the object. By default, the session is\\n                    in the <code>ReadWrite</code> mode. If you want to restrict the access, you can explicitly\\n                    set the <code>s3express:SessionMode</code> condition key to <code>ReadOnly</code> on the\\n                    copy source bucket.</p>\\n                        </li>\\n                        <li>\\n                           <p>If the copy destination is a directory bucket, you must have the <b>\\n                                 <code>s3express:CreateSession</code>\\n                              </b> permission in the\\n                      <code>Action</code> element of a policy to write the object to the destination. The\\n                      <code>s3express:SessionMode</code> condition key cannot be set to <code>ReadOnly</code>\\n                    on the copy destination. </p>\\n                        </li>\\n                     </ul>\\n                     <p>If the object is encrypted with SSE-KMS, you must also have the\\n                  <code>kms:GenerateDataKey</code> and <code>kms:Decrypt</code> permissions in IAM\\n                identity-based policies and KMS key policies for the KMS key.</p>\\n                     <p>For example policies, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-security-iam-example-bucket-policies.html\\\">Example\\n                  bucket policies for S3 Express One Zone</a> and <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-security-iam-identity-policies.html\\\">Amazon Web Services\\n                  Identity and Access Management (IAM) identity-based policies for S3 Express One Zone</a> in the\\n                  <i>Amazon S3 User Guide</i>.</p>\\n                  </li>\\n               </ul>\\n            </dd>\\n            <dt>Encryption</dt>\\n            <dd>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <b>General purpose buckets </b> -\\n                 For information about using server-side encryption with\\n                customer-provided encryption keys with the <code>UploadPartCopy</code> operation, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CopyObject.html\\\">CopyObject</a> and\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPart.html\\\">UploadPart</a>. </p>\\n                     <note>\\n                        <p>If you have server-side encryption with customer-provided keys (SSE-C) blocked for your general purpose bucket, you will get an HTTP 403 Access Denied error when you specify the SSE-C request headers while writing new data to your bucket. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/blocking-unblocking-s3-c-encryption-gpb.html\\\">Blocking or unblocking SSE-C for a general purpose bucket</a>.</p>\\n                     </note>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <b>Directory buckets </b> -\\n                For directory buckets, there are only two supported options for server-side encryption: server-side encryption with Amazon S3 managed keys (SSE-S3) (<code>AES256</code>) and server-side encryption with KMS keys (SSE-KMS) (<code>aws:kms</code>). For more\\n         information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-serv-side-encryption.html\\\">Protecting data with server-side encryption</a> in the <i>Amazon S3 User Guide</i>.</p>\\n                     <note>\\n                        <p>For directory buckets, when you perform a <code>CreateMultipartUpload</code> operation\\n                  and an <code>UploadPartCopy</code> operation, the request headers you provide in the\\n                    <code>CreateMultipartUpload</code> request must match the default encryption configuration\\n                  of the destination bucket. </p>\\n                     </note>\\n                     <p>S3 Bucket Keys aren't supported, when you copy SSE-KMS encrypted objects from general purpose buckets  \\nto directory buckets, from directory buckets to general purpose buckets, or between directory buckets, through <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPartCopy.html\\\">UploadPartCopy</a>. In this case, Amazon S3 makes a call to KMS every time a copy request is made for a KMS-encrypted object.</p>\\n                  </li>\\n               </ul>\\n            </dd>\\n            <dt>Special errors</dt>\\n            <dd>\\n               <ul>\\n                  <li>\\n                     <p>Error Code: <code>NoSuchUpload</code>\\n                     </p>\\n                     <ul>\\n                        <li>\\n                           <p>Description: The specified multipart upload does not exist. The upload ID might be\\n                    invalid, or the multipart upload might have been aborted or completed.</p>\\n                        </li>\\n                        <li>\\n                           <p>HTTP Status Code: 404 Not Found</p>\\n                        </li>\\n                     </ul>\\n                  </li>\\n                  <li>\\n                     <p>Error Code: <code>InvalidRequest</code>\\n                     </p>\\n                     <ul>\\n                        <li>\\n                           <p>Description: The specified copy source is not supported as a byte-range copy\\n                    source.</p>\\n                        </li>\\n                        <li>\\n                           <p>HTTP Status Code: 400 Bad Request</p>\\n                        </li>\\n                     </ul>\\n                  </li>\\n               </ul>\\n            </dd>\\n            <dt>HTTP Host header syntax</dt>\\n            <dd>\\n               <p>\\n                  <b>Directory buckets </b> - The HTTP Host header syntax is <code>\\n                     <i>Bucket-name</i>.s3express-<i>zone-id</i>.<i>region-code</i>.amazonaws.com</code>.</p>\\n            </dd>\\n         </dl>\\n         <p>The following operations are related to <code>UploadPartCopy</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateMultipartUpload.html\\\">CreateMultipartUpload</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_UploadPart.html\\\">UploadPart</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_CompleteMultipartUpload.html\\\">CompleteMultipartUpload</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_AbortMultipartUpload.html\\\">AbortMultipartUpload</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListParts.html\\\">ListParts</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListMultipartUploads.html\\\">ListMultipartUploads</a>\\n               </p>\\n            </li>\\n         </ul>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#examples\": [\n          {\n            \"title\": \"To upload a part by copying byte range from an existing object as data source\",\n            \"documentation\": \"The following example uploads a part of a multipart upload by copying a specified byte range from an existing object as data source.\",\n            \"input\": {\n              \"Bucket\": \"examplebucket\",\n              \"CopySource\": \"/bucketname/sourceobjectkey\",\n              \"CopySourceRange\": \"bytes=1-100000\",\n              \"Key\": \"examplelargeobject\",\n              \"PartNumber\": 2,\n              \"UploadId\": \"exampleuoh_10OhKhT7YukE9bjzTPRiuaCotmZM_pFngJFir9OZNrSr5cWa3cq3LZSUsfjI4FI7PkP91We7Nrw--\"\n            },\n            \"output\": {\n              \"CopyPartResult\": {\n                \"LastModified\": \"2016-12-29T21:44:28.000Z\",\n                \"ETag\": \"\\\"65d16d19e65a7508a51f043180edcc36\\\"\"\n              }\n            }\n          },\n          {\n            \"title\": \"To upload a part by copying data from an existing object as data source\",\n            \"documentation\": \"The following example uploads a part of a multipart upload by copying data from an existing object as data source.\",\n            \"input\": {\n              \"Bucket\": \"examplebucket\",\n              \"CopySource\": \"/bucketname/sourceobjectkey\",\n              \"Key\": \"examplelargeobject\",\n              \"PartNumber\": 1,\n              \"UploadId\": \"exampleuoh_10OhKhT7YukE9bjzTPRiuaCotmZM_pFngJFir9OZNrSr5cWa3cq3LZSUsfjI4FI7PkP91We7Nrw--\"\n            },\n            \"output\": {\n              \"CopyPartResult\": {\n                \"LastModified\": \"2016-12-29T21:24:43.000Z\",\n                \"ETag\": \"\\\"b0c6f0e7e054ab8fa2536a2677f8734d\\\"\"\n              }\n            }\n          }\n        ],\n        \"smithy.api#http\": {\n          \"method\": \"PUT\",\n          \"uri\": \"/{Bucket}/{Key+}?x-id=UploadPartCopy\",\n          \"code\": 200\n        },\n        \"smithy.rules#staticContextParams\": {\n          \"DisableS3ExpressSessionAuth\": {\n            \"value\": true\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#UploadPartCopyOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"CopySourceVersionId\": {\n          \"target\": \"com.amazonaws.s3#CopySourceVersionId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The version of the source object that was copied, if you have enabled versioning on the source\\n      bucket.</p>\\n         <note>\\n            <p>This functionality is not supported when the source object is in a directory bucket.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-copy-source-version-id\"\n          }\n        },\n        \"CopyPartResult\": {\n          \"target\": \"com.amazonaws.s3#CopyPartResult\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Container for all response elements.</p>\",\n            \"smithy.api#httpPayload\": {}\n          }\n        },\n        \"ServerSideEncryption\": {\n          \"target\": \"com.amazonaws.s3#ServerSideEncryption\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The server-side encryption algorithm used when you store this object in Amazon S3 or Amazon FSx.</p>\\n         <note>\\n            <p>When accessing data stored in Amazon FSx file systems using S3 access points, the only valid server side\\n        encryption option is <code>aws:fsx</code>.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption\"\n          }\n        },\n        \"SSECustomerAlgorithm\": {\n          \"target\": \"com.amazonaws.s3#SSECustomerAlgorithm\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>If server-side encryption with a customer-provided encryption key was requested, the response will\\n      include this header to confirm the encryption algorithm that's used.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption-customer-algorithm\"\n          }\n        },\n        \"SSECustomerKeyMD5\": {\n          \"target\": \"com.amazonaws.s3#SSECustomerKeyMD5\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>If server-side encryption with a customer-provided encryption key was requested, the response will\\n      include this header to provide the round-trip message integrity verification of the customer-provided\\n      encryption key.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption-customer-key-MD5\"\n          }\n        },\n        \"SSEKMSKeyId\": {\n          \"target\": \"com.amazonaws.s3#SSEKMSKeyId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>If present, indicates the ID of the KMS key that was used for object encryption.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption-aws-kms-key-id\"\n          }\n        },\n        \"BucketKeyEnabled\": {\n          \"target\": \"com.amazonaws.s3#BucketKeyEnabled\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Indicates whether the multipart upload uses an S3 Bucket Key for server-side encryption with\\n      Key Management Service (KMS) keys (SSE-KMS).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption-bucket-key-enabled\"\n          }\n        },\n        \"RequestCharged\": {\n          \"target\": \"com.amazonaws.s3#RequestCharged\",\n          \"traits\": {\n            \"smithy.api#httpHeader\": \"x-amz-request-charged\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#output\": {}\n      }\n    },\n    \"com.amazonaws.s3#UploadPartCopyRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The bucket name.</p>\\n         <p>\\n            <b>Directory buckets</b> - When you use this operation with a directory bucket, you must use virtual-hosted-style requests in the format <code>\\n               <i>Bucket-name</i>.s3express-<i>zone-id</i>.<i>region-code</i>.amazonaws.com</code>. Path-style requests are not supported.  Directory bucket names must be unique in the chosen Zone (Availability Zone or Local Zone). Bucket names must follow the format <code>\\n               <i>bucket-base-name</i>--<i>zone-id</i>--x-s3</code> (for example, <code>\\n               <i>amzn-s3-demo-bucket</i>--<i>usw2-az1</i>--x-s3</code>). For information about bucket naming\\n         restrictions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-bucket-naming-rules.html\\\">Directory bucket naming\\n            rules</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <note>\\n            <p>Copying objects across different Amazon Web Services Regions isn't supported when the source or destination\\n        bucket is in Amazon Web Services Local Zones. The source and destination buckets must have the same parent Amazon Web Services Region.\\n        Otherwise, you get an HTTP <code>400 Bad Request</code> error with the error code\\n          <code>InvalidRequest</code>.</p>\\n         </note>\\n         <p>\\n            <b>Access points</b> - When you use this action with an access point for general purpose buckets, you must provide the alias of the access point in place of the bucket name or specify the access point ARN. When you use this action with an access point for directory buckets, you must provide the access point name in place of the bucket name. When using the access point ARN, you must direct requests to the access point hostname. The access point hostname takes the form <i>AccessPointName</i>-<i>AccountId</i>.s3-accesspoint.<i>Region</i>.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html\\\">Using access points</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <note>\\n            <p>Object Lambda access points are not supported by directory buckets.</p>\\n         </note>\\n         <p>\\n            <b>S3 on Outposts</b> - When you use this action with S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the \\n                     form <code>\\n               <i>AccessPointName</i>-<i>AccountId</i>.<i>outpostID</i>.s3-outposts.<i>Region</i>.amazonaws.com</code>. When you use this action with S3 on Outposts, the destination bucket must be the Outposts access point ARN or the access point alias. For more information about S3 on Outposts, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html\\\">What is S3 on Outposts?</a> in the <i>Amazon S3 User Guide</i>.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"CopySource\": {\n          \"target\": \"com.amazonaws.s3#CopySource\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the source object for the copy operation. You specify the value in one of two formats,\\n      depending on whether you want to access the source object through an <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-points.html\\\">access point</a>:</p>\\n         <ul>\\n            <li>\\n               <p>For objects not accessed through an access point, specify the name of the source bucket and key of the\\n          source object, separated by a slash (/). For example, to copy the object\\n            <code>reports/january.pdf</code> from the bucket <code>awsexamplebucket</code>, use\\n            <code>awsexamplebucket/reports/january.pdf</code>. The value must be URL-encoded.</p>\\n            </li>\\n            <li>\\n               <p>For objects accessed through access points, specify the Amazon Resource Name (ARN) of the object as accessed through the access point, in the format <code>arn:aws:s3:<Region>:<account-id>:accesspoint/<access-point-name>/object/<key></code>. For example, to copy the object <code>reports/january.pdf</code> through access point <code>my-access-point</code> owned by account <code>123456789012</code> in Region <code>us-west-2</code>, use the URL encoding of <code>arn:aws:s3:us-west-2:123456789012:accesspoint/my-access-point/object/reports/january.pdf</code>. The value must be URL encoded.</p>\\n               <note>\\n                  <ul>\\n                     <li>\\n                        <p>Amazon S3 supports copy operations using Access points only when the source and destination buckets are in the same Amazon Web Services Region.</p>\\n                     </li>\\n                     <li>\\n                        <p>Access points are not supported by directory buckets.</p>\\n                     </li>\\n                  </ul>\\n               </note>\\n               <p>Alternatively, for objects accessed through Amazon S3 on Outposts, specify the ARN of the object as accessed in the format <code>arn:aws:s3-outposts:<Region>:<account-id>:outpost/<outpost-id>/object/<key></code>. For example, to copy the object <code>reports/january.pdf</code> through outpost <code>my-outpost</code> owned by account <code>123456789012</code> in Region <code>us-west-2</code>, use the URL encoding of <code>arn:aws:s3-outposts:us-west-2:123456789012:outpost/my-outpost/object/reports/january.pdf</code>. The value must be URL-encoded.  </p>\\n            </li>\\n         </ul>\\n         <p>If your bucket has versioning enabled, you could have multiple versions of the same object. By\\n      default, <code>x-amz-copy-source</code> identifies the current version of the source object to copy. To\\n      copy a specific version of the source object to copy, append <code>?versionId=<version-id></code> to\\n      the <code>x-amz-copy-source</code> request header (for example, <code>x-amz-copy-source:\\n        /awsexamplebucket/reports/january.pdf?versionId=QUpfdndhfd8438MNFDN93jdnJFkdmqnh893</code>). </p>\\n         <p>If the current version is a delete marker and you don't specify a versionId in the\\n        <code>x-amz-copy-source</code> request header, Amazon S3 returns a <code>404 Not Found</code> error,\\n      because the object does not exist. If you specify versionId in the <code>x-amz-copy-source</code> and\\n      the versionId is a delete marker, Amazon S3 returns an HTTP <code>400 Bad Request</code> error, because you\\n      are not allowed to specify a delete marker as a version for the <code>x-amz-copy-source</code>. </p>\\n         <note>\\n            <p>\\n               <b>Directory buckets</b> - S3 Versioning isn't enabled and supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-copy-source\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"CopySourceIfMatch\": {\n          \"target\": \"com.amazonaws.s3#CopySourceIfMatch\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Copies the object if its entity tag (ETag) matches the specified tag.</p>\\n         <p>If both of the <code>x-amz-copy-source-if-match</code> and\\n        <code>x-amz-copy-source-if-unmodified-since</code> headers are present in the request as\\n      follows:</p>\\n         <p>\\n            <code>x-amz-copy-source-if-match</code> condition evaluates to <code>true</code>, and;</p>\\n         <p>\\n            <code>x-amz-copy-source-if-unmodified-since</code> condition evaluates to <code>false</code>;</p>\\n         <p>Amazon S3 returns <code>200 OK</code> and copies the data.\\n      </p>\",\n            \"smithy.api#httpHeader\": \"x-amz-copy-source-if-match\"\n          }\n        },\n        \"CopySourceIfModifiedSince\": {\n          \"target\": \"com.amazonaws.s3#CopySourceIfModifiedSince\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Copies the object if it has been modified since the specified time.</p>\\n         <p>If both of the <code>x-amz-copy-source-if-none-match</code> and\\n        <code>x-amz-copy-source-if-modified-since</code> headers are present in the request as follows:</p>\\n         <p>\\n            <code>x-amz-copy-source-if-none-match</code> condition evaluates to <code>false</code>, and;</p>\\n         <p>\\n            <code>x-amz-copy-source-if-modified-since</code> condition evaluates to <code>true</code>;</p>\\n         <p>Amazon S3 returns <code>412 Precondition Failed</code> response code.\\n      </p>\",\n            \"smithy.api#httpHeader\": \"x-amz-copy-source-if-modified-since\"\n          }\n        },\n        \"CopySourceIfNoneMatch\": {\n          \"target\": \"com.amazonaws.s3#CopySourceIfNoneMatch\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Copies the object if its entity tag (ETag) is different than the specified ETag.</p>\\n         <p>If both of the <code>x-amz-copy-source-if-none-match</code> and\\n        <code>x-amz-copy-source-if-modified-since</code> headers are present in the request as follows:</p>\\n         <p>\\n            <code>x-amz-copy-source-if-none-match</code> condition evaluates to <code>false</code>, and;</p>\\n         <p>\\n            <code>x-amz-copy-source-if-modified-since</code> condition evaluates to <code>true</code>;</p>\\n         <p>Amazon S3 returns <code>412 Precondition Failed</code> response code.\\n      </p>\",\n            \"smithy.api#httpHeader\": \"x-amz-copy-source-if-none-match\"\n          }\n        },\n        \"CopySourceIfUnmodifiedSince\": {\n          \"target\": \"com.amazonaws.s3#CopySourceIfUnmodifiedSince\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Copies the object if it hasn't been modified since the specified time.</p>\\n         <p>If both of the <code>x-amz-copy-source-if-match</code> and\\n        <code>x-amz-copy-source-if-unmodified-since</code> headers are present in the request as\\n      follows:</p>\\n         <p>\\n            <code>x-amz-copy-source-if-match</code> condition evaluates to <code>true</code>, and;</p>\\n         <p>\\n            <code>x-amz-copy-source-if-unmodified-since</code> condition evaluates to <code>false</code>;</p>\\n         <p>Amazon S3 returns <code>200 OK</code> and copies the data.\\n      </p>\",\n            \"smithy.api#httpHeader\": \"x-amz-copy-source-if-unmodified-since\"\n          }\n        },\n        \"CopySourceRange\": {\n          \"target\": \"com.amazonaws.s3#CopySourceRange\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The range of bytes to copy from the source object. The range value must use the form\\n      bytes=first-last, where the first and last are the zero-based byte offsets to copy. For example,\\n      bytes=0-9 indicates that you want to copy the first 10 bytes of the source. You can copy a range only if\\n      the source object is greater than 5 MB.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-copy-source-range\"\n          }\n        },\n        \"Key\": {\n          \"target\": \"com.amazonaws.s3#ObjectKey\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Object key for which the multipart upload was initiated.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {}\n          }\n        },\n        \"PartNumber\": {\n          \"target\": \"com.amazonaws.s3#PartNumber\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Part number of part being copied. This is a positive integer between 1 and 10,000.</p>\",\n            \"smithy.api#httpQuery\": \"partNumber\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"UploadId\": {\n          \"target\": \"com.amazonaws.s3#MultipartUploadId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Upload ID identifying the multipart upload whose part is being copied.</p>\",\n            \"smithy.api#httpQuery\": \"uploadId\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"SSECustomerAlgorithm\": {\n          \"target\": \"com.amazonaws.s3#SSECustomerAlgorithm\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the algorithm to use when encrypting the object (for example, AES256).</p>\\n         <note>\\n            <p>This functionality is not supported when the destination bucket is a directory bucket.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption-customer-algorithm\"\n          }\n        },\n        \"SSECustomerKey\": {\n          \"target\": \"com.amazonaws.s3#SSECustomerKey\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the customer-provided encryption key for Amazon S3 to use in encrypting data. This value is\\n      used to store the object and then it is discarded; Amazon S3 does not store the encryption key. The key must\\n      be appropriate for use with the algorithm specified in the\\n        <code>x-amz-server-side-encryption-customer-algorithm</code> header. This must be the same encryption\\n      key specified in the initiate multipart upload request.</p>\\n         <note>\\n            <p>This functionality is not supported when the destination bucket is a directory bucket.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption-customer-key\"\n          }\n        },\n        \"SSECustomerKeyMD5\": {\n          \"target\": \"com.amazonaws.s3#SSECustomerKeyMD5\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the 128-bit MD5 digest of the encryption key according to RFC 1321. Amazon S3 uses this header\\n      for a message integrity check to ensure that the encryption key was transmitted without error.</p>\\n         <note>\\n            <p>This functionality is not supported when the destination bucket is a directory bucket.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption-customer-key-MD5\"\n          }\n        },\n        \"CopySourceSSECustomerAlgorithm\": {\n          \"target\": \"com.amazonaws.s3#CopySourceSSECustomerAlgorithm\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the algorithm to use when decrypting the source object (for example,\\n      <code>AES256</code>).</p>\\n         <note>\\n            <p>This functionality is not supported when the source object is in a directory bucket.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-copy-source-server-side-encryption-customer-algorithm\"\n          }\n        },\n        \"CopySourceSSECustomerKey\": {\n          \"target\": \"com.amazonaws.s3#CopySourceSSECustomerKey\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the customer-provided encryption key for Amazon S3 to use to decrypt the source object. The\\n      encryption key provided in this header must be one that was used when the source object was\\n      created.</p>\\n         <note>\\n            <p>This functionality is not supported when the source object is in a directory bucket.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-copy-source-server-side-encryption-customer-key\"\n          }\n        },\n        \"CopySourceSSECustomerKeyMD5\": {\n          \"target\": \"com.amazonaws.s3#CopySourceSSECustomerKeyMD5\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the 128-bit MD5 digest of the encryption key according to RFC 1321. Amazon S3 uses this header\\n      for a message integrity check to ensure that the encryption key was transmitted without error.</p>\\n         <note>\\n            <p>This functionality is not supported when the source object is in a directory bucket.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-copy-source-server-side-encryption-customer-key-MD5\"\n          }\n        },\n        \"RequestPayer\": {\n          \"target\": \"com.amazonaws.s3#RequestPayer\",\n          \"traits\": {\n            \"smithy.api#httpHeader\": \"x-amz-request-payer\"\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected destination bucket owner. If the account ID that you provide does not match the actual owner of the destination bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        },\n        \"ExpectedSourceBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected source bucket owner. If the account ID that you provide does not match the actual owner of the source bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-source-expected-bucket-owner\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#UploadPartOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"ServerSideEncryption\": {\n          \"target\": \"com.amazonaws.s3#ServerSideEncryption\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The server-side encryption algorithm used when you store this object in Amazon S3 or Amazon FSx.</p>\\n         <note>\\n            <p>When accessing data stored in Amazon FSx file systems using S3 access points, the only valid server side\\n        encryption option is <code>aws:fsx</code>.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption\"\n          }\n        },\n        \"ETag\": {\n          \"target\": \"com.amazonaws.s3#ETag\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Entity tag for the uploaded object.</p>\",\n            \"smithy.api#httpHeader\": \"ETag\"\n          }\n        },\n        \"ChecksumCRC32\": {\n          \"target\": \"com.amazonaws.s3#ChecksumCRC32\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Base64 encoded, 32-bit <code>CRC32 checksum</code> of the object. This checksum is only present if the checksum was uploaded\\n    with the object. When you use an API operation on an object that was uploaded using multipart uploads, this value may not be a direct checksum value of the full object. Instead, it's a calculation based on the checksum values of each individual part. For more information about how checksums are calculated\\n    with multipart uploads, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html#large-object-checksums\\\">\\n    Checking object integrity</a> in the <i>Amazon S3 User Guide</i>.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-checksum-crc32\"\n          }\n        },\n        \"ChecksumCRC32C\": {\n          \"target\": \"com.amazonaws.s3#ChecksumCRC32C\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Base64 encoded, 32-bit <code>CRC32C</code> checksum of the object. This checksum is only present if the checksum was uploaded\\n    with the object. When you use an API operation on an object that was uploaded using multipart uploads, this value may not be a direct checksum value of the full object. Instead, it's a calculation based on the checksum values of each individual part. For more information about how checksums are calculated\\n    with multipart uploads, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html#large-object-checksums\\\">\\n    Checking object integrity</a> in the <i>Amazon S3 User Guide</i>.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-checksum-crc32c\"\n          }\n        },\n        \"ChecksumCRC64NVME\": {\n          \"target\": \"com.amazonaws.s3#ChecksumCRC64NVME\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>This header can be used as a data integrity check to verify that the data received is the same data\\n      that was originally sent. This header specifies the Base64 encoded, 64-bit <code>CRC64NVME</code>\\n      checksum of the part. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking object integrity</a> in\\n      the <i>Amazon S3 User Guide</i>.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-checksum-crc64nvme\"\n          }\n        },\n        \"ChecksumSHA1\": {\n          \"target\": \"com.amazonaws.s3#ChecksumSHA1\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Base64 encoded, 160-bit <code>SHA1</code> digest of the object. This checksum is only present if the checksum was uploaded\\n    with the object. When you use the API operation on an object that was uploaded using multipart uploads, this value may not be a direct checksum value of the full object. Instead, it's a calculation based on the checksum values of each individual part. For more information about how checksums are calculated\\n    with multipart uploads, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html#large-object-checksums\\\">\\n    Checking object integrity</a> in the <i>Amazon S3 User Guide</i>.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-checksum-sha1\"\n          }\n        },\n        \"ChecksumSHA256\": {\n          \"target\": \"com.amazonaws.s3#ChecksumSHA256\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Base64 encoded, 256-bit <code>SHA256</code> digest of the object. This checksum is only present if the checksum was uploaded\\n    with the object. When you use an API operation on an object that was uploaded using multipart uploads, this value may not be a direct checksum value of the full object. Instead, it's a calculation based on the checksum values of each individual part. For more information about how checksums are calculated\\n    with multipart uploads, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html#large-object-checksums\\\">\\n    Checking object integrity</a> in the <i>Amazon S3 User Guide</i>.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-checksum-sha256\"\n          }\n        },\n        \"SSECustomerAlgorithm\": {\n          \"target\": \"com.amazonaws.s3#SSECustomerAlgorithm\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>If server-side encryption with a customer-provided encryption key was requested, the response will\\n      include this header to confirm the encryption algorithm that's used.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption-customer-algorithm\"\n          }\n        },\n        \"SSECustomerKeyMD5\": {\n          \"target\": \"com.amazonaws.s3#SSECustomerKeyMD5\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>If server-side encryption with a customer-provided encryption key was requested, the response will\\n      include this header to provide the round-trip message integrity verification of the customer-provided\\n      encryption key.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption-customer-key-MD5\"\n          }\n        },\n        \"SSEKMSKeyId\": {\n          \"target\": \"com.amazonaws.s3#SSEKMSKeyId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>If present, indicates the ID of the KMS key that was used for object encryption.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption-aws-kms-key-id\"\n          }\n        },\n        \"BucketKeyEnabled\": {\n          \"target\": \"com.amazonaws.s3#BucketKeyEnabled\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Indicates whether the multipart upload uses an S3 Bucket Key for server-side encryption with\\n      Key Management Service (KMS) keys (SSE-KMS).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption-bucket-key-enabled\"\n          }\n        },\n        \"RequestCharged\": {\n          \"target\": \"com.amazonaws.s3#RequestCharged\",\n          \"traits\": {\n            \"smithy.api#httpHeader\": \"x-amz-request-charged\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#output\": {}\n      }\n    },\n    \"com.amazonaws.s3#UploadPartRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Body\": {\n          \"target\": \"com.amazonaws.s3#StreamingBlob\",\n          \"traits\": {\n            \"smithy.api#default\": \"\",\n            \"smithy.api#documentation\": \"<p>Object data.</p>\",\n            \"smithy.api#httpPayload\": {}\n          }\n        },\n        \"Bucket\": {\n          \"target\": \"com.amazonaws.s3#BucketName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the bucket to which the multipart upload was initiated.</p>\\n         <p>\\n            <b>Directory buckets</b> - When you use this operation with a directory bucket, you must use virtual-hosted-style requests in the format <code>\\n               <i>Bucket-name</i>.s3express-<i>zone-id</i>.<i>region-code</i>.amazonaws.com</code>. Path-style requests are not supported.  Directory bucket names must be unique in the chosen Zone (Availability Zone or Local Zone). Bucket names must follow the format <code>\\n               <i>bucket-base-name</i>--<i>zone-id</i>--x-s3</code> (for example, <code>\\n               <i>amzn-s3-demo-bucket</i>--<i>usw2-az1</i>--x-s3</code>). For information about bucket naming\\n         restrictions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/directory-bucket-naming-rules.html\\\">Directory bucket naming\\n            rules</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <p>\\n            <b>Access points</b> - When you use this action with an access point for general purpose buckets, you must provide the alias of the access point in place of the bucket name or specify the access point ARN. When you use this action with an access point for directory buckets, you must provide the access point name in place of the bucket name. When using the access point ARN, you must direct requests to the access point hostname. The access point hostname takes the form <i>AccessPointName</i>-<i>AccountId</i>.s3-accesspoint.<i>Region</i>.amazonaws.com. When using this action with an access point through the Amazon Web Services SDKs, you provide the access point ARN in place of the bucket name. For more information about access point ARNs, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-access-points.html\\\">Using access points</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <note>\\n            <p>Object Lambda access points are not supported by directory buckets.</p>\\n         </note>\\n         <p>\\n            <b>S3 on Outposts</b> - When you use this action with S3 on Outposts, you must direct requests to the S3 on Outposts hostname. The S3 on Outposts hostname takes the \\n                     form <code>\\n               <i>AccessPointName</i>-<i>AccountId</i>.<i>outpostID</i>.s3-outposts.<i>Region</i>.amazonaws.com</code>. When you use this action with S3 on Outposts, the destination bucket must be the Outposts access point ARN or the access point alias. For more information about S3 on Outposts, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/S3onOutposts.html\\\">What is S3 on Outposts?</a> in the <i>Amazon S3 User Guide</i>.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Bucket\"\n            }\n          }\n        },\n        \"ContentLength\": {\n          \"target\": \"com.amazonaws.s3#ContentLength\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Size of the body in bytes. This parameter is useful when the size of the body cannot be determined\\n      automatically.</p>\",\n            \"smithy.api#httpHeader\": \"Content-Length\"\n          }\n        },\n        \"ContentMD5\": {\n          \"target\": \"com.amazonaws.s3#ContentMD5\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Base64 encoded 128-bit MD5 digest of the part data. This parameter is auto-populated when using\\n      the command from the CLI. This parameter is required if object lock parameters are specified.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"Content-MD5\"\n          }\n        },\n        \"ChecksumAlgorithm\": {\n          \"target\": \"com.amazonaws.s3#ChecksumAlgorithm\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Indicates the algorithm used to create the checksum for the object when you use the SDK. This header will not provide any\\n    additional functionality if you don't use the SDK. When you send this header, there must be a corresponding <code>x-amz-checksum</code> or\\n    <code>x-amz-trailer</code> header sent. Otherwise, Amazon S3 fails the request with the HTTP status code <code>400 Bad Request</code>. For more\\n    information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking object integrity</a> in\\n    the <i>Amazon S3 User Guide</i>.</p>\\n         <p>If you provide an individual checksum, Amazon S3 ignores any provided <code>ChecksumAlgorithm</code>\\n      parameter.</p>\\n         <p>This checksum algorithm must be the same for all parts and it match the checksum value supplied in\\n      the <code>CreateMultipartUpload</code> request.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-sdk-checksum-algorithm\"\n          }\n        },\n        \"ChecksumCRC32\": {\n          \"target\": \"com.amazonaws.s3#ChecksumCRC32\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>This header can be used as a data integrity check to verify that the data received is the same data that was originally sent.\\n    This header specifies the Base64 encoded, 32-bit <code>CRC32</code> checksum of the object. For more information, see\\n    <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking object integrity</a> in the\\n    <i>Amazon S3 User Guide</i>.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-checksum-crc32\"\n          }\n        },\n        \"ChecksumCRC32C\": {\n          \"target\": \"com.amazonaws.s3#ChecksumCRC32C\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>This header can be used as a data integrity check to verify that the data received is the same data that was originally sent.\\n    This header specifies the Base64 encoded, 32-bit <code>CRC32C</code> checksum of the object. For more information, see\\n    <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking object integrity</a> in the\\n    <i>Amazon S3 User Guide</i>.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-checksum-crc32c\"\n          }\n        },\n        \"ChecksumCRC64NVME\": {\n          \"target\": \"com.amazonaws.s3#ChecksumCRC64NVME\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>This header can be used as a data integrity check to verify that the data received is the same data\\n      that was originally sent. This header specifies the Base64 encoded, 64-bit <code>CRC64NVME</code>\\n      checksum of the part. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking object integrity</a> in\\n      the <i>Amazon S3 User Guide</i>.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-checksum-crc64nvme\"\n          }\n        },\n        \"ChecksumSHA1\": {\n          \"target\": \"com.amazonaws.s3#ChecksumSHA1\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>This header can be used as a data integrity check to verify that the data received is the same data that was originally sent.\\n    This header specifies the Base64 encoded, 160-bit <code>SHA1</code> digest of the object. For more information, see\\n    <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking object integrity</a> in the\\n    <i>Amazon S3 User Guide</i>.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-checksum-sha1\"\n          }\n        },\n        \"ChecksumSHA256\": {\n          \"target\": \"com.amazonaws.s3#ChecksumSHA256\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>This header can be used as a data integrity check to verify that the data received is the same data that was originally sent.\\n    This header specifies the Base64 encoded, 256-bit <code>SHA256</code> digest of the object. For more information, see\\n    <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking object integrity</a> in the\\n    <i>Amazon S3 User Guide</i>.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-checksum-sha256\"\n          }\n        },\n        \"Key\": {\n          \"target\": \"com.amazonaws.s3#ObjectKey\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Object key for which the multipart upload was initiated.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {},\n            \"smithy.rules#contextParam\": {\n              \"name\": \"Key\"\n            }\n          }\n        },\n        \"PartNumber\": {\n          \"target\": \"com.amazonaws.s3#PartNumber\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Part number of part being uploaded. This is a positive integer between 1 and 10,000.</p>\",\n            \"smithy.api#httpQuery\": \"partNumber\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"UploadId\": {\n          \"target\": \"com.amazonaws.s3#MultipartUploadId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Upload ID identifying the multipart upload whose part is being uploaded.</p>\",\n            \"smithy.api#httpQuery\": \"uploadId\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"SSECustomerAlgorithm\": {\n          \"target\": \"com.amazonaws.s3#SSECustomerAlgorithm\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the algorithm to use when encrypting the object (for example, AES256).</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption-customer-algorithm\"\n          }\n        },\n        \"SSECustomerKey\": {\n          \"target\": \"com.amazonaws.s3#SSECustomerKey\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the customer-provided encryption key for Amazon S3 to use in encrypting data. This value is\\n      used to store the object and then it is discarded; Amazon S3 does not store the encryption key. The key must\\n      be appropriate for use with the algorithm specified in the\\n        <code>x-amz-server-side-encryption-customer-algorithm header</code>. This must be the same encryption\\n      key specified in the initiate multipart upload request.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption-customer-key\"\n          }\n        },\n        \"SSECustomerKeyMD5\": {\n          \"target\": \"com.amazonaws.s3#SSECustomerKeyMD5\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the 128-bit MD5 digest of the encryption key according to RFC 1321. Amazon S3 uses this header\\n      for a message integrity check to ensure that the encryption key was transmitted without error.</p>\\n         <note>\\n            <p>This functionality is not supported for directory buckets.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-server-side-encryption-customer-key-MD5\"\n          }\n        },\n        \"RequestPayer\": {\n          \"target\": \"com.amazonaws.s3#RequestPayer\",\n          \"traits\": {\n            \"smithy.api#httpHeader\": \"x-amz-request-payer\"\n          }\n        },\n        \"ExpectedBucketOwner\": {\n          \"target\": \"com.amazonaws.s3#AccountId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The account ID of the expected bucket owner. If the account ID that you provide does not match the actual owner of the bucket, the request fails with the HTTP status code <code>403 Forbidden</code> (access denied).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-expected-bucket-owner\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#UserMetadata\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.s3#MetadataEntry\",\n        \"traits\": {\n          \"smithy.api#xmlName\": \"MetadataEntry\"\n        }\n      }\n    },\n    \"com.amazonaws.s3#Value\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#VersionCount\": {\n      \"type\": \"integer\"\n    },\n    \"com.amazonaws.s3#VersionIdMarker\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#VersioningConfiguration\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"MFADelete\": {\n          \"target\": \"com.amazonaws.s3#MFADelete\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies whether MFA delete is enabled in the bucket versioning configuration. This element is only\\n      returned if the bucket has been configured with MFA delete. If the bucket has never been so configured,\\n      this element is not returned.</p>\",\n            \"smithy.api#xmlName\": \"MfaDelete\"\n          }\n        },\n        \"Status\": {\n          \"target\": \"com.amazonaws.s3#BucketVersioningStatus\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The versioning state of the bucket.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Describes the versioning state of an Amazon S3 bucket. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/RESTBucketPUTVersioningStatus.html\\\">PUT Bucket\\n        versioning</a> in the <i>Amazon S3 API Reference</i>.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#WebsiteConfiguration\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"ErrorDocument\": {\n          \"target\": \"com.amazonaws.s3#ErrorDocument\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the error document for the website.</p>\"\n          }\n        },\n        \"IndexDocument\": {\n          \"target\": \"com.amazonaws.s3#IndexDocument\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the index document for the website.</p>\"\n          }\n        },\n        \"RedirectAllRequestsTo\": {\n          \"target\": \"com.amazonaws.s3#RedirectAllRequestsTo\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The redirect behavior for every request to this bucket's website endpoint.</p>\\n         <important>\\n            <p>If you specify this property, you can't specify any other property.</p>\\n         </important>\"\n          }\n        },\n        \"RoutingRules\": {\n          \"target\": \"com.amazonaws.s3#RoutingRules\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Rules that define when a redirect is applied and the redirect behavior.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Specifies website configuration parameters for an Amazon S3 bucket.</p>\"\n      }\n    },\n    \"com.amazonaws.s3#WebsiteRedirectLocation\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.s3#WriteGetObjectResponse\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.s3#WriteGetObjectResponseRequest\"\n      },\n      \"output\": {\n        \"target\": \"smithy.api#Unit\"\n      },\n      \"traits\": {\n        \"aws.auth#unsignedPayload\": {},\n        \"smithy.api#auth\": [\"aws.auth#sigv4\"],\n        \"smithy.api#documentation\": \"<note>\\n            <p>This operation is not supported for directory buckets.</p>\\n         </note>\\n         <p>Passes transformed objects to a <code>GetObject</code> operation when using Object Lambda access points. For information\\n      about Object Lambda access points, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/transforming-objects.html\\\">Transforming objects with Object Lambda access points</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <p>This operation supports metadata that can be returned by <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html\\\">GetObject</a>, in addition to\\n        <code>RequestRoute</code>, <code>RequestToken</code>, <code>StatusCode</code>, <code>ErrorCode</code>,\\n      and <code>ErrorMessage</code>. The <code>GetObject</code> response metadata is supported so that the\\n        <code>WriteGetObjectResponse</code> caller, typically an Lambda function, can provide the same\\n      metadata when it internally invokes <code>GetObject</code>. When <code>WriteGetObjectResponse</code> is\\n      called by a customer-owned Lambda function, the metadata returned to the end user <code>GetObject</code>\\n      call might differ from what Amazon S3 would normally return.</p>\\n         <p>You can include any number of metadata headers. When including a metadata header, it should be\\n      prefaced with <code>x-amz-meta</code>. For example, <code>x-amz-meta-my-custom-header:\\n        MyCustomValue</code>. The primary use case for this is to forward <code>GetObject</code>\\n      metadata.</p>\\n         <p>Amazon Web Services provides some prebuilt Lambda functions that you can use with S3 Object Lambda to detect and\\n      redact personally identifiable information (PII) and decompress S3 objects. These Lambda functions are\\n      available in the Amazon Web Services Serverless Application Repository, and can be selected through the Amazon Web Services\\n      Management Console when you create your Object Lambda access point.</p>\\n         <p>Example 1: PII Access Control - This Lambda function uses Amazon Comprehend, a natural\\n      language processing (NLP) service using machine learning to find insights and relationships in text. It\\n      automatically detects personally identifiable information (PII) such as names, addresses, dates, credit\\n      card numbers, and social security numbers from documents in your Amazon S3 bucket. </p>\\n         <p>Example 2: PII Redaction - This Lambda function uses Amazon Comprehend, a natural language\\n      processing (NLP) service using machine learning to find insights and relationships in text. It\\n      automatically redacts personally identifiable information (PII) such as names, addresses, dates, credit\\n      card numbers, and social security numbers from documents in your Amazon S3 bucket. </p>\\n         <p>Example 3: Decompression - The Lambda function S3ObjectLambdaDecompression, is equipped to\\n      decompress objects stored in S3 in one of six compressed file formats including bzip2, gzip, snappy,\\n      zlib, zstandard and ZIP. </p>\\n         <p>For information on how to view and use these functions, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/olap-examples.html\\\">Using Amazon Web Services built Lambda functions</a> in the\\n        <i>Amazon S3 User Guide</i>.</p>\\n         <important>\\n            <p>You must URL encode any signed header values that contain spaces. For example, if your header value is <code>my  file.txt</code>, containing two spaces after <code>my</code>, you must URL encode this value to <code>my%20%20file.txt</code>.</p>\\n         </important>\",\n        \"smithy.api#endpoint\": {\n          \"hostPrefix\": \"{RequestRoute}.\"\n        },\n        \"smithy.api#http\": {\n          \"method\": \"POST\",\n          \"uri\": \"/WriteGetObjectResponse\",\n          \"code\": 200\n        },\n        \"smithy.rules#staticContextParams\": {\n          \"UseObjectLambdaEndpoint\": {\n            \"value\": true\n          }\n        }\n      }\n    },\n    \"com.amazonaws.s3#WriteGetObjectResponseRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"RequestRoute\": {\n          \"target\": \"com.amazonaws.s3#RequestRoute\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Route prefix to the HTTP URL generated.</p>\",\n            \"smithy.api#hostLabel\": {},\n            \"smithy.api#httpHeader\": \"x-amz-request-route\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"RequestToken\": {\n          \"target\": \"com.amazonaws.s3#RequestToken\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A single use encrypted token that maps <code>WriteGetObjectResponse</code> to the end user\\n        <code>GetObject</code> request.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-request-token\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"Body\": {\n          \"target\": \"com.amazonaws.s3#StreamingBlob\",\n          \"traits\": {\n            \"smithy.api#default\": \"\",\n            \"smithy.api#documentation\": \"<p>The object data.</p>\",\n            \"smithy.api#httpPayload\": {}\n          }\n        },\n        \"StatusCode\": {\n          \"target\": \"com.amazonaws.s3#GetObjectResponseStatusCode\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The integer status code for an HTTP response of a corresponding <code>GetObject</code> request. The\\n      following is a list of status codes.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>200 - OK</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>206 - Partial Content</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>304 - Not Modified</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>400 - Bad Request</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>401 - Unauthorized</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>403 - Forbidden</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>404 - Not Found</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>405 - Method Not Allowed</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>409 - Conflict</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>411 - Length Required</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>412 - Precondition Failed</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>416 - Range Not Satisfiable</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>500 - Internal Server Error</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>503 - Service Unavailable</code>\\n               </p>\\n            </li>\\n         </ul>\",\n            \"smithy.api#httpHeader\": \"x-amz-fwd-status\"\n          }\n        },\n        \"ErrorCode\": {\n          \"target\": \"com.amazonaws.s3#ErrorCode\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A string that uniquely identifies an error condition. Returned in the <Code> tag of the error\\n      XML response for a corresponding <code>GetObject</code> call. Cannot be used with a successful\\n        <code>StatusCode</code> header or when the transformed object is provided in the body. All error codes\\n      from S3 are sentence-cased. The regular expression (regex) value is\\n      <code>\\\"^[A-Z][a-zA-Z]+$\\\"</code>.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-fwd-error-code\"\n          }\n        },\n        \"ErrorMessage\": {\n          \"target\": \"com.amazonaws.s3#ErrorMessage\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Contains a generic description of the error condition. Returned in the <Message> tag of the\\n      error XML response for a corresponding <code>GetObject</code> call. Cannot be used with a successful\\n        <code>StatusCode</code> header or when the transformed object is provided in body.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-fwd-error-message\"\n          }\n        },\n        \"AcceptRanges\": {\n          \"target\": \"com.amazonaws.s3#AcceptRanges\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Indicates that a range of bytes was specified.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-fwd-header-accept-ranges\"\n          }\n        },\n        \"CacheControl\": {\n          \"target\": \"com.amazonaws.s3#CacheControl\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies caching behavior along the request/reply chain.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-fwd-header-Cache-Control\"\n          }\n        },\n        \"ContentDisposition\": {\n          \"target\": \"com.amazonaws.s3#ContentDisposition\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies presentational information for the object.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-fwd-header-Content-Disposition\"\n          }\n        },\n        \"ContentEncoding\": {\n          \"target\": \"com.amazonaws.s3#ContentEncoding\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies what content encodings have been applied to the object and thus what decoding mechanisms\\n      must be applied to obtain the media-type referenced by the Content-Type header field.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-fwd-header-Content-Encoding\"\n          }\n        },\n        \"ContentLanguage\": {\n          \"target\": \"com.amazonaws.s3#ContentLanguage\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The language the content is in.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-fwd-header-Content-Language\"\n          }\n        },\n        \"ContentLength\": {\n          \"target\": \"com.amazonaws.s3#ContentLength\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The size of the content body in bytes.</p>\",\n            \"smithy.api#httpHeader\": \"Content-Length\"\n          }\n        },\n        \"ContentRange\": {\n          \"target\": \"com.amazonaws.s3#ContentRange\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The portion of the object returned in the response.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-fwd-header-Content-Range\"\n          }\n        },\n        \"ContentType\": {\n          \"target\": \"com.amazonaws.s3#ContentType\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A standard MIME type describing the format of the object data.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-fwd-header-Content-Type\"\n          }\n        },\n        \"ChecksumCRC32\": {\n          \"target\": \"com.amazonaws.s3#ChecksumCRC32\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>This header can be used as a data integrity check to verify that the data received is the same data\\n      that was originally sent. This specifies the Base64 encoded, 32-bit <code>CRC32</code> checksum of the\\n      object returned by the Object Lambda function. This may not match the checksum for the object stored in\\n      Amazon S3. Amazon S3 will perform validation of the checksum values only when the original <code>GetObject</code>\\n      request required checksum validation. For more information about checksums, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking object\\n        integrity</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <p>Only one checksum header can be specified at a time. If you supply multiple checksum headers, this\\n      request will fail.</p>\\n         <p></p>\",\n            \"smithy.api#httpHeader\": \"x-amz-fwd-header-x-amz-checksum-crc32\"\n          }\n        },\n        \"ChecksumCRC32C\": {\n          \"target\": \"com.amazonaws.s3#ChecksumCRC32C\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>This header can be used as a data integrity check to verify that the data received is the same data\\n      that was originally sent. This specifies the Base64 encoded, 32-bit <code>CRC32C</code> checksum of the\\n      object returned by the Object Lambda function. This may not match the checksum for the object stored in\\n      Amazon S3. Amazon S3 will perform validation of the checksum values only when the original <code>GetObject</code>\\n      request required checksum validation. For more information about checksums, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking object\\n        integrity</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <p>Only one checksum header can be specified at a time. If you supply multiple checksum headers, this\\n      request will fail.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-fwd-header-x-amz-checksum-crc32c\"\n          }\n        },\n        \"ChecksumCRC64NVME\": {\n          \"target\": \"com.amazonaws.s3#ChecksumCRC64NVME\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>This header can be used as a data integrity check to verify that the data received is the same data\\n      that was originally sent. This header specifies the Base64 encoded, 64-bit <code>CRC64NVME</code>\\n      checksum of the part. For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking object integrity</a> in\\n      the <i>Amazon S3 User Guide</i>.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-fwd-header-x-amz-checksum-crc64nvme\"\n          }\n        },\n        \"ChecksumSHA1\": {\n          \"target\": \"com.amazonaws.s3#ChecksumSHA1\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>This header can be used as a data integrity check to verify that the data received is the same data\\n      that was originally sent. This specifies the Base64 encoded, 160-bit <code>SHA1</code> digest of the\\n      object returned by the Object Lambda function. This may not match the checksum for the object stored in\\n      Amazon S3. Amazon S3 will perform validation of the checksum values only when the original <code>GetObject</code>\\n      request required checksum validation. For more information about checksums, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking object\\n        integrity</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <p>Only one checksum header can be specified at a time. If you supply multiple checksum headers, this\\n      request will fail.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-fwd-header-x-amz-checksum-sha1\"\n          }\n        },\n        \"ChecksumSHA256\": {\n          \"target\": \"com.amazonaws.s3#ChecksumSHA256\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>This header can be used as a data integrity check to verify that the data received is the same data\\n      that was originally sent. This specifies the Base64 encoded, 256-bit <code>SHA256</code> digest of the\\n      object returned by the Object Lambda function. This may not match the checksum for the object stored in\\n      Amazon S3. Amazon S3 will perform validation of the checksum values only when the original <code>GetObject</code>\\n      request required checksum validation. For more information about checksums, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/checking-object-integrity.html\\\">Checking object\\n        integrity</a> in the <i>Amazon S3 User Guide</i>.</p>\\n         <p>Only one checksum header can be specified at a time. If you supply multiple checksum headers, this\\n      request will fail.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-fwd-header-x-amz-checksum-sha256\"\n          }\n        },\n        \"DeleteMarker\": {\n          \"target\": \"com.amazonaws.s3#DeleteMarker\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies whether an object stored in Amazon S3 is (<code>true</code>) or is not (<code>false</code>) a\\n      delete marker. To learn more about delete markers, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/DeleteMarker.html\\\">Working with delete markers</a>.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-fwd-header-x-amz-delete-marker\"\n          }\n        },\n        \"ETag\": {\n          \"target\": \"com.amazonaws.s3#ETag\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>An opaque identifier assigned by a web server to a specific version of a resource found at a URL.\\n    </p>\",\n            \"smithy.api#httpHeader\": \"x-amz-fwd-header-ETag\"\n          }\n        },\n        \"Expires\": {\n          \"target\": \"com.amazonaws.s3#Expires\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The date and time at which the object is no longer cacheable.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-fwd-header-Expires\"\n          }\n        },\n        \"Expiration\": {\n          \"target\": \"com.amazonaws.s3#Expiration\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>If the object expiration is configured (see PUT Bucket lifecycle), the response includes this\\n      header. It includes the <code>expiry-date</code> and <code>rule-id</code> key-value pairs that provide\\n      the object expiration information. The value of the <code>rule-id</code> is URL-encoded. </p>\",\n            \"smithy.api#httpHeader\": \"x-amz-fwd-header-x-amz-expiration\"\n          }\n        },\n        \"LastModified\": {\n          \"target\": \"com.amazonaws.s3#LastModified\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The date and time that the object was last modified.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-fwd-header-Last-Modified\"\n          }\n        },\n        \"MissingMeta\": {\n          \"target\": \"com.amazonaws.s3#MissingMeta\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Set to the number of metadata entries not returned in <code>x-amz-meta</code> headers. This can\\n      happen if you create metadata using an API like SOAP that supports more flexible metadata than the REST\\n      API. For example, using SOAP, you can create metadata whose values are not legal HTTP headers.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-fwd-header-x-amz-missing-meta\"\n          }\n        },\n        \"Metadata\": {\n          \"target\": \"com.amazonaws.s3#Metadata\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A map of metadata to store with the object in S3.</p>\",\n            \"smithy.api#httpPrefixHeaders\": \"x-amz-meta-\"\n          }\n        },\n        \"ObjectLockMode\": {\n          \"target\": \"com.amazonaws.s3#ObjectLockMode\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Indicates whether an object stored in Amazon S3 has Object Lock enabled. For more information about S3\\n      Object Lock, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lock.html\\\">Object\\n        Lock</a>.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-fwd-header-x-amz-object-lock-mode\"\n          }\n        },\n        \"ObjectLockLegalHoldStatus\": {\n          \"target\": \"com.amazonaws.s3#ObjectLockLegalHoldStatus\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Indicates whether an object stored in Amazon S3 has an active legal hold.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-fwd-header-x-amz-object-lock-legal-hold\"\n          }\n        },\n        \"ObjectLockRetainUntilDate\": {\n          \"target\": \"com.amazonaws.s3#ObjectLockRetainUntilDate\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The date and time when Object Lock is configured to expire.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-fwd-header-x-amz-object-lock-retain-until-date\"\n          }\n        },\n        \"PartsCount\": {\n          \"target\": \"com.amazonaws.s3#PartsCount\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The count of parts this object has.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-fwd-header-x-amz-mp-parts-count\"\n          }\n        },\n        \"ReplicationStatus\": {\n          \"target\": \"com.amazonaws.s3#ReplicationStatus\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Indicates if request involves bucket that is either a source or destination in a Replication rule.\\n      For more information about S3 Replication, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/replication.html\\\">Replication</a>.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-fwd-header-x-amz-replication-status\"\n          }\n        },\n        \"RequestCharged\": {\n          \"target\": \"com.amazonaws.s3#RequestCharged\",\n          \"traits\": {\n            \"smithy.api#httpHeader\": \"x-amz-fwd-header-x-amz-request-charged\"\n          }\n        },\n        \"Restore\": {\n          \"target\": \"com.amazonaws.s3#Restore\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Provides information about object restoration operation and expiration time of the restored object\\n      copy.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-fwd-header-x-amz-restore\"\n          }\n        },\n        \"ServerSideEncryption\": {\n          \"target\": \"com.amazonaws.s3#ServerSideEncryption\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p> The server-side encryption algorithm used when storing requested object in Amazon S3 or Amazon FSx.</p>\\n         <note>\\n            <p>When accessing data stored in Amazon FSx file systems using S3 access points, the only valid server side\\n        encryption option is <code>aws:fsx</code>.</p>\\n         </note>\",\n            \"smithy.api#httpHeader\": \"x-amz-fwd-header-x-amz-server-side-encryption\"\n          }\n        },\n        \"SSECustomerAlgorithm\": {\n          \"target\": \"com.amazonaws.s3#SSECustomerAlgorithm\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Encryption algorithm used if server-side encryption with a customer-provided encryption key was\\n      specified for object stored in Amazon S3.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-fwd-header-x-amz-server-side-encryption-customer-algorithm\"\n          }\n        },\n        \"SSEKMSKeyId\": {\n          \"target\": \"com.amazonaws.s3#SSEKMSKeyId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p> If present, specifies the ID (Key ID, Key ARN, or Key Alias) of the Amazon Web Services Key Management Service\\n      (Amazon Web Services KMS) symmetric encryption customer managed key that was used for stored in Amazon S3 object. </p>\",\n            \"smithy.api#httpHeader\": \"x-amz-fwd-header-x-amz-server-side-encryption-aws-kms-key-id\"\n          }\n        },\n        \"SSECustomerKeyMD5\": {\n          \"target\": \"com.amazonaws.s3#SSECustomerKeyMD5\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p> 128-bit MD5 digest of customer-provided encryption key used in Amazon S3 to encrypt data stored in S3.\\n      For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/userguide/ServerSideEncryptionCustomerKeys.html\\\">Protecting data using\\n        server-side encryption with customer-provided encryption keys (SSE-C)</a>.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-fwd-header-x-amz-server-side-encryption-customer-key-MD5\"\n          }\n        },\n        \"StorageClass\": {\n          \"target\": \"com.amazonaws.s3#StorageClass\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Provides storage class information of the object. Amazon S3 returns this header for all objects except\\n      for S3 Standard storage class objects.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AmazonS3/latest/dev/storage-class-intro.html\\\">Storage Classes</a>.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-fwd-header-x-amz-storage-class\"\n          }\n        },\n        \"TagCount\": {\n          \"target\": \"com.amazonaws.s3#TagCount\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The number of tags, if any, on the object.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-fwd-header-x-amz-tagging-count\"\n          }\n        },\n        \"VersionId\": {\n          \"target\": \"com.amazonaws.s3#ObjectVersionId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>An ID used to reference a specific version of the object.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-fwd-header-x-amz-version-id\"\n          }\n        },\n        \"BucketKeyEnabled\": {\n          \"target\": \"com.amazonaws.s3#BucketKeyEnabled\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p> Indicates whether the object stored in Amazon S3 uses an S3 bucket key for server-side encryption with\\n      Amazon Web Services KMS (SSE-KMS).</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-fwd-header-x-amz-server-side-encryption-bucket-key-enabled\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#input\": {}\n      }\n    },\n    \"com.amazonaws.s3#WriteOffsetBytes\": {\n      \"type\": \"long\"\n    },\n    \"com.amazonaws.s3#Years\": {\n      \"type\": \"integer\"\n    },\n    \"smithy.protocols#StringList\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"smithy.api#String\"\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"A list of String shapes.\",\n        \"smithy.api#private\": {}\n      }\n    },\n    \"smithy.protocols#rpcv2Cbor\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"http\": {\n          \"target\": \"smithy.protocols#StringList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"Priority ordered list of supported HTTP protocol versions.\"\n          }\n        },\n        \"eventStreamHttp\": {\n          \"target\": \"smithy.protocols#StringList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"Priority ordered list of supported HTTP protocol versions\\nthat are required when using event streams.\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"An RPC-based protocol that serializes CBOR payloads.\",\n        \"smithy.api#protocolDefinition\": {\n          \"traits\": [\n            \"smithy.api#cors\",\n            \"smithy.api#endpoint\",\n            \"smithy.api#hostLabel\",\n            \"smithy.api#httpError\"\n          ]\n        },\n        \"smithy.api#trait\": {\n          \"selector\": \"service\"\n        },\n        \"smithy.api#traitValidators\": {\n          \"rpcv2Cbor.NoDocuments\": {\n            \"selector\": \"service ~> member :test(> document)\",\n            \"message\": \"This protocol does not support document types in most possible scenarios.\",\n            \"severity\": \"DANGER\"\n          }\n        }\n      }\n    },\n    \"smithy.rules#ClientContextParamDefinition\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"type\": {\n          \"target\": \"smithy.rules#ShapeType\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"The Smithy shape type that should be used to generate a client configurable for the rule-set parameter.\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"documentation\": {\n          \"target\": \"smithy.api#String\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"Documentation string to be generated with the client parameter.\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"A client context parameter definition.\",\n        \"smithy.api#private\": {},\n        \"smithy.api#unstable\": {}\n      }\n    },\n    \"smithy.rules#Condition\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"fn\": {\n          \"target\": \"smithy.api#String\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"The name of the function to be executed.\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"argv\": {\n          \"target\": \"smithy.rules#DocumentList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"The arguments for the function.\\nAn array of one or more of the following types: string, bool, array, Reference object, or Function object\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"assign\": {\n          \"target\": \"smithy.api#String\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"The optional destination variable to assign the functions result to.\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#private\": {}\n      }\n    },\n    \"smithy.rules#Conditions\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"smithy.rules#Condition\"\n      },\n      \"traits\": {\n        \"smithy.api#private\": {}\n      }\n    },\n    \"smithy.rules#DocumentList\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"smithy.api#Document\"\n      },\n      \"traits\": {\n        \"smithy.api#private\": {}\n      }\n    },\n    \"smithy.rules#EndpointExpectation\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"url\": {\n          \"target\": \"smithy.api#String\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"The expected endpoint URL to be resolved for this test case.\"\n          }\n        },\n        \"headers\": {\n          \"target\": \"smithy.rules#EndpointHeaders\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"The transport headers to be set for this test case.\"\n          }\n        },\n        \"properties\": {\n          \"target\": \"smithy.rules#Properties\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"The properties for the endpoint for this test case.\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"A description of an expected endpoint to be resolved for an endpoint rule-set test case.\",\n        \"smithy.api#private\": {},\n        \"smithy.api#unstable\": {}\n      }\n    },\n    \"smithy.rules#EndpointHeaderValue\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"smithy.api#String\",\n        \"traits\": {\n          \"smithy.api#documentation\": \"A transport header value.\"\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"A list of transport header values.\",\n        \"smithy.api#private\": {},\n        \"smithy.api#unstable\": {}\n      }\n    },\n    \"smithy.rules#EndpointHeaders\": {\n      \"type\": \"map\",\n      \"key\": {\n        \"target\": \"smithy.api#String\",\n        \"traits\": {\n          \"smithy.api#documentation\": \"The transport header name.\"\n        }\n      },\n      \"value\": {\n        \"target\": \"smithy.rules#EndpointHeaderValue\",\n        \"traits\": {\n          \"smithy.api#documentation\": \"The transport header values.\"\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"A map of header names to list of values.\",\n        \"smithy.api#private\": {},\n        \"smithy.api#unstable\": {}\n      }\n    },\n    \"smithy.rules#EndpointObject\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"url\": {\n          \"target\": \"smithy.api#Document\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"The endpoint url. This MUST specify a scheme and hostname and MAY contain port and base path components.\\nA string value MAY be a Template string. Any value for this property MUST resolve to a string.\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"properties\": {\n          \"target\": \"smithy.rules#EndpointProperties\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"A map containing zero or more key value property pairs. Endpoint properties MAY be arbitrarily deep and\\ncontain other maps and arrays.\"\n          }\n        },\n        \"headers\": {\n          \"target\": \"smithy.rules#EndpointObjectHeaders\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"A map of transport header names to their respective values. A string value in an array MAY be a\\ntemplate string.\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#private\": {}\n      }\n    },\n    \"smithy.rules#EndpointObjectHeaders\": {\n      \"type\": \"map\",\n      \"key\": {\n        \"target\": \"smithy.api#String\"\n      },\n      \"value\": {\n        \"target\": \"smithy.rules#DocumentList\"\n      },\n      \"traits\": {\n        \"smithy.api#private\": {}\n      }\n    },\n    \"smithy.rules#EndpointProperties\": {\n      \"type\": \"map\",\n      \"key\": {\n        \"target\": \"smithy.api#String\"\n      },\n      \"value\": {\n        \"target\": \"smithy.api#Document\"\n      },\n      \"traits\": {\n        \"smithy.api#private\": {}\n      }\n    },\n    \"smithy.rules#EndpointTest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"documentation\": {\n          \"target\": \"smithy.api#String\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"Documentation describing the test case.\"\n          }\n        },\n        \"params\": {\n          \"target\": \"smithy.api#Document\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"Defines rule-set parameters and values to use for testing rules-engine.\"\n          }\n        },\n        \"operationInputs\": {\n          \"target\": \"smithy.rules#OperationInputs\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"Defines a set of service operation configurations used for testing the rules-engine.\"\n          }\n        },\n        \"expect\": {\n          \"target\": \"smithy.rules#EndpointTestExpectation\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"The expected outcome of the test case.\",\n            \"smithy.api#required\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"Describes an endpoint test case for validation of an endpoint rule-set.\",\n        \"smithy.api#private\": {},\n        \"smithy.api#unstable\": {}\n      }\n    },\n    \"smithy.rules#EndpointTestExpectation\": {\n      \"type\": \"union\",\n      \"members\": {\n        \"error\": {\n          \"target\": \"smithy.api#String\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"A test case expectation resulting in an error.\"\n          }\n        },\n        \"endpoint\": {\n          \"target\": \"smithy.rules#EndpointExpectation\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"A test case expectation resulting in an endpoint.\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"An endpoint rule-set test expectation describing an expected endpoint or error.\",\n        \"smithy.api#private\": {},\n        \"smithy.api#unstable\": {}\n      }\n    },\n    \"smithy.rules#EndpointTestList\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"smithy.rules#EndpointTest\"\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"A list of endpoint rule-set tests.\",\n        \"smithy.api#private\": {},\n        \"smithy.api#unstable\": {}\n      }\n    },\n    \"smithy.rules#OperationContextParamDefinition\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"path\": {\n          \"target\": \"smithy.api#String\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"a JMESPath expression to select element(s) from the operation input to bind to.\",\n            \"smithy.api#required\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"An operation context parameter definition.\",\n        \"smithy.api#private\": {},\n        \"smithy.api#unstable\": {}\n      }\n    },\n    \"smithy.rules#OperationInput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"operationName\": {\n          \"target\": \"smithy.api#String\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"The name of the service operation targeted by the test.\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"operationParams\": {\n          \"target\": \"smithy.api#Document\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"Defines the input parameters used to generate the operation request.\\nThese parameters MUST be compatible with the input of the operation.\"\n          }\n        },\n        \"builtInParams\": {\n          \"target\": \"smithy.api#Document\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"Defines the set of rule-set built-ins and their corresponding values to be set.\"\n          }\n        },\n        \"clientParams\": {\n          \"target\": \"smithy.api#Document\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"Defines the set of client configuration parameters to be set.\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"A description of a service operation and input used to verify an endpoint rule-set test case.\",\n        \"smithy.api#private\": {},\n        \"smithy.api#unstable\": {}\n      }\n    },\n    \"smithy.rules#OperationInputs\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"smithy.rules#OperationInput\",\n        \"traits\": {\n          \"smithy.api#documentation\": \"The service operation configuration to be used for testing the rules-engine.\"\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"A list of operation input descriptions for an endpoint rule-set test case.\",\n        \"smithy.api#private\": {},\n        \"smithy.api#unstable\": {}\n      }\n    },\n    \"smithy.rules#Parameter\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"type\": {\n          \"target\": \"smithy.rules#ParameterType\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"The parameter type.\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"deprecated\": {\n          \"target\": \"smithy.api#Boolean\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"True if the parameter is deprecated.\"\n          }\n        },\n        \"documentation\": {\n          \"target\": \"smithy.api#String\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"Documentation about the parameter.\"\n          }\n        },\n        \"default\": {\n          \"target\": \"smithy.api#Document\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"Specifies the default value for the parameter if not set.\\nParameters with defaults MUST also be marked as required. The type of the provided default MUST match type.\"\n          }\n        },\n        \"builtIn\": {\n          \"target\": \"smithy.api#String\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"Specifies a named built-in value that is sourced and provided to the endpoint provider by a caller.\"\n          }\n        },\n        \"required\": {\n          \"target\": \"smithy.api#Boolean\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"Specifies that the parameter is required to be provided to the endpoint provider.\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"A rules input parameter.\",\n        \"smithy.api#private\": {}\n      }\n    },\n    \"smithy.rules#ParameterType\": {\n      \"type\": \"enum\",\n      \"members\": {\n        \"STRING\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"string\"\n          }\n        },\n        \"BOOLEAN\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"boolean\"\n          }\n        },\n        \"STRING_ARRAY\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"stringArray\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"The kind of parameter.\"\n      }\n    },\n    \"smithy.rules#Parameters\": {\n      \"type\": \"map\",\n      \"key\": {\n        \"target\": \"smithy.api#String\"\n      },\n      \"value\": {\n        \"target\": \"smithy.rules#Parameter\"\n      },\n      \"traits\": {\n        \"smithy.api#private\": {}\n      }\n    },\n    \"smithy.rules#Properties\": {\n      \"type\": \"map\",\n      \"key\": {\n        \"target\": \"smithy.api#String\",\n        \"traits\": {\n          \"smithy.api#documentation\": \"The property name.\"\n        }\n      },\n      \"value\": {\n        \"target\": \"smithy.api#Document\",\n        \"traits\": {\n          \"smithy.api#documentation\": \"The property value.\"\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"A map of strings to document values.\",\n        \"smithy.api#private\": {},\n        \"smithy.api#unstable\": {}\n      }\n    },\n    \"smithy.rules#Result\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"type\": {\n          \"target\": \"smithy.rules#ResultType\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"Result type.\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"documentation\": {\n          \"target\": \"smithy.api#String\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"An optional description of the result.\"\n          }\n        },\n        \"error\": {\n          \"target\": \"smithy.api#Document\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"Provided if type is \\\"error\\\".\"\n          }\n        },\n        \"endpoint\": {\n          \"target\": \"smithy.rules#EndpointObject\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"Provided if type is \\\"endpoint\\\".\"\n          }\n        },\n        \"conditions\": {\n          \"target\": \"smithy.rules#Conditions\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"Conditions for the result (only used with decision tree rules).\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#private\": {}\n      }\n    },\n    \"smithy.rules#ResultType\": {\n      \"type\": \"enum\",\n      \"members\": {\n        \"ENDPOINT\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"endpoint\"\n          }\n        },\n        \"ERROR\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#enumValue\": \"error\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#private\": {}\n      }\n    },\n    \"smithy.rules#Results\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"smithy.rules#Result\"\n      },\n      \"traits\": {\n        \"smithy.api#private\": {}\n      }\n    },\n    \"smithy.rules#ShapeType\": {\n      \"type\": \"enum\",\n      \"members\": {\n        \"STRING\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"Indicates a Smithy string shape type.\",\n            \"smithy.api#enumValue\": \"string\"\n          }\n        },\n        \"BOOLEAN\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"Indicates a Smithy boolean shape type.\",\n            \"smithy.api#enumValue\": \"boolean\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"An enum representing supported Smithy shape types.\",\n        \"smithy.api#private\": {},\n        \"smithy.api#unstable\": {}\n      }\n    },\n    \"smithy.rules#StaticContextParamDefinition\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"value\": {\n          \"target\": \"smithy.api#Document\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"The value to set the associated rule-set parameter to.\",\n            \"smithy.api#required\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"A static context parameter definition.\",\n        \"smithy.api#private\": {},\n        \"smithy.api#unstable\": {}\n      }\n    },\n    \"smithy.rules#clientContextParams\": {\n      \"type\": \"map\",\n      \"key\": {\n        \"target\": \"smithy.api#String\",\n        \"traits\": {\n          \"smithy.api#documentation\": \"The rule-set parameter name.\"\n        }\n      },\n      \"value\": {\n        \"target\": \"smithy.rules#ClientContextParamDefinition\",\n        \"traits\": {\n          \"smithy.api#documentation\": \"The client parameter definition.\"\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"Defines one or more named rule-set parameters to be generated as configurable client parameters.\\nThe type specified for the client parameter MUST match the parameter type defined in the rule-set.\",\n        \"smithy.api#trait\": {\n          \"selector\": \"service\"\n        },\n        \"smithy.api#unstable\": {}\n      }\n    },\n    \"smithy.rules#contextParam\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"name\": {\n          \"target\": \"smithy.api#String\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"The rule-set parameter name.\",\n            \"smithy.api#required\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"Binds the targeted member of an operation's input structure to the named rule-set parameter.\\nThe type of the shape targeted by the trait MUST match the parameter type defined in the rule-set.\",\n        \"smithy.api#trait\": {\n          \"selector\": \"operation -[input]-> structure > member\"\n        },\n        \"smithy.api#unstable\": {}\n      }\n    },\n    \"smithy.rules#endpointBdd\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"version\": {\n          \"target\": \"smithy.api#String\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"The rules engine version. Must be set to 1.1 or higher.\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"parameters\": {\n          \"target\": \"smithy.rules#Parameters\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"A map of zero or more endpoint parameter names to their parameter configuration.\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"conditions\": {\n          \"target\": \"smithy.rules#Conditions\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"An ordered list of unique conditions used throughout the BDD.\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"results\": {\n          \"target\": \"smithy.rules#Results\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"An ordered list of results referenced by BDD nodes. The first result is always the terminal node.\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"root\": {\n          \"target\": \"smithy.api#Integer\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"The root node of where to start evaluating the BDD.\",\n            \"smithy.api#range\": {\n              \"min\": -1\n            },\n            \"smithy.api#required\": {}\n          }\n        },\n        \"nodeCount\": {\n          \"target\": \"smithy.api#Integer\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"The number of nodes contained in the BDD.\",\n            \"smithy.api#range\": {\n              \"min\": 0\n            },\n            \"smithy.api#required\": {}\n          }\n        },\n        \"nodes\": {\n          \"target\": \"smithy.api#String\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"Base64-encoded array of BDD nodes representing the decision graph structure.\\n\\nAll integers are encoded in big-endian.\\n\\nThe first node (index 0) is always the terminal node `[-1, 1, -1]` and is included in the nodeCount.\\nUser-defined nodes start at index 1.\\n\\nEach node is written one after the other and consists of three integers written sequentially:\\n1. variable index\\n2. high reference (when condition is true)\\n3. low reference (when condition is false)\\n\\nNode Structure [variable, high, low]:\\n- variable: The index of the condition being tested (0 to conditionCount-1)\\n- high: Reference to follow when the condition evaluates to true\\n- low: Reference to follow when the condition evaluates to false\\n\\nReference Encoding:\\n- 0: Invalid/unused reference (never appears in valid BDDs)\\n- 1: TRUE terminal (treated as \\\"no match\\\" in endpoint resolution)\\n- -1: FALSE terminal (treated as \\\"no match\\\" in endpoint resolution)\\n- 2, 3, 4, ...: Node references pointing to nodes[ref-1]\\n- -2, -3, -4, ...: Complement node references (logical NOT of nodes[abs(ref)-1])\\n- 100000000+: Result terminals (100000000 + resultIndex)\\n\\nComplement edges:\\nA negative reference represents the logical NOT of the referenced node's entire subgraph. So `-5` means the\\ncomplement of node 5 (located in the array at index 4, since `index = |ref| - 1`). In this case, evaluate the\\ncondition referenced by node 4, and if it is TRUE, use the low reference, and if it's FALSE, use the high\\nreference. This optimization significantly reduces BDD size by allowing a single subgraph to represent both a\\nboolean function and its complement; instead of creating separate nodes for `condition AND other` and\\n`NOT(condition AND other)`, we can reuse the same nodes with complement edges. Complement edges cannot be\\nused on result terminals.\",\n            \"smithy.api#required\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"Defines an endpoint rule-set using a binary decision diagram (BDD).\",\n        \"smithy.api#trait\": {\n          \"selector\": \"service\"\n        },\n        \"smithy.api#unstable\": {}\n      }\n    },\n    \"smithy.rules#endpointRuleSet\": {\n      \"type\": \"document\",\n      \"traits\": {\n        \"smithy.api#documentation\": \"Defines an endpoint rule-set used to resolve the client's transport endpoint.\",\n        \"smithy.api#trait\": {\n          \"selector\": \"service\"\n        },\n        \"smithy.api#unstable\": {}\n      }\n    },\n    \"smithy.rules#endpointTests\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"version\": {\n          \"target\": \"smithy.api#String\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"The endpoint tests schema version.\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"testCases\": {\n          \"target\": \"smithy.rules#EndpointTestList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"List of endpoint test cases.\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"Defines endpoint test-cases for validating a client's endpoint rule-set.\",\n        \"smithy.api#trait\": {\n          \"selector\": \"service :is([trait|smithy.rules#endpointRuleSet], [trait|smithy.rules#endpointBdd])\"\n        },\n        \"smithy.api#unstable\": {}\n      }\n    },\n    \"smithy.rules#operationContextParams\": {\n      \"type\": \"map\",\n      \"key\": {\n        \"target\": \"smithy.api#String\",\n        \"traits\": {\n          \"smithy.api#documentation\": \"The rule-set parameter name.\"\n        }\n      },\n      \"value\": {\n        \"target\": \"smithy.rules#OperationContextParamDefinition\",\n        \"traits\": {\n          \"smithy.api#documentation\": \"The static parameter definition.\"\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"Binds one or more named rule-set parameters to elements contained in the operation's input structure.\\nThe type of the shapes targeted by the trait MUST match the parameter types defined in the rule-set.\",\n        \"smithy.api#trait\": {\n          \"selector\": \"operation\"\n        },\n        \"smithy.api#unstable\": {}\n      }\n    },\n    \"smithy.rules#staticContextParams\": {\n      \"type\": \"map\",\n      \"key\": {\n        \"target\": \"smithy.api#String\",\n        \"traits\": {\n          \"smithy.api#documentation\": \"The rule-set parameter name.\"\n        }\n      },\n      \"value\": {\n        \"target\": \"smithy.rules#StaticContextParamDefinition\",\n        \"traits\": {\n          \"smithy.api#documentation\": \"The static parameter definition.\"\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"Binds one or more named rule-set parameters to the defined static value for the targeted operation.\\nThe type of the targeted shape targeted by the trait MUST match the parameter type defined in the rule-set.\",\n        \"smithy.api#trait\": {\n          \"selector\": \"operation\"\n        },\n        \"smithy.api#unstable\": {}\n      }\n    },\n    \"smithy.test#Expectation\": {\n      \"type\": \"union\",\n      \"members\": {\n        \"success\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"Indicates that the call is expected to not throw an error. No other\\nassertions are made about the response.\"\n          }\n        },\n        \"failure\": {\n          \"target\": \"smithy.test#FailureExpectation\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"Indicates that the call is expected to throw an error.\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"The different kinds of expectations that can be made for a test case.\",\n        \"smithy.api#private\": {}\n      }\n    },\n    \"smithy.test#FailureExpectation\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"errorId\": {\n          \"target\": \"smithy.api#String\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"Indicates that the call is expected to throw a specific type of error\\nmatching the targeted shape. If not specified, the error can be of\\nany type.\",\n            \"smithy.api#idRef\": {\n              \"failWhenMissing\": true,\n              \"selector\": \"[trait|error]\"\n            }\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#private\": {}\n      }\n    },\n    \"smithy.test#SmokeTestCase\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"id\": {\n          \"target\": \"smithy.api#String\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"The identifier of the test case. This identifier may be used by\\nsmoke test implementations to generate test case names. The provided\\n`id` MUST match Smithy's `IDENTIFIER` ABNF. No two test cases can\\nshare the same ID, including test cases defined for other operations\\nbound to the same service.\",\n            \"smithy.api#pattern\": \"^[A-Za-z_][A-Za-z0-9_]+$\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"params\": {\n          \"target\": \"smithy.api#Document\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"Defines the input parameters used to generate the request. These\\nparameters MUST be compatible with the input of the operation.\\n\\nParameter values that contain binary data MUST be defined using values\\nthat can be represented in plain text as the plain text representation\\n(for example, use `\\\"foo\\\"` and not `\\\"Zm9vCg==\\\"`).\"\n          }\n        },\n        \"vendorParams\": {\n          \"target\": \"smithy.api#Document\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"Defines vendor-specific parameters that are used to influence the\\nrequest. For example, some vendors might utilize environment variables,\\nconfiguration files on disk, or other means to influence the\\nserialization formats used by clients or servers.\\n\\nIf a `vendorParamsShape` is set, these parameters MUST be compatible with\\nthat shape's definition.\"\n          }\n        },\n        \"vendorParamsShape\": {\n          \"target\": \"smithy.api#String\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"The ID of the shape that should be used to validate the `vendorParams`\\nmember contents.\\n\\nIf set, the parameters in `vendorParams` MUST be compatible with this\\nshape's definition.\",\n            \"smithy.api#idRef\": {\n              \"failWhenMissing\": true\n            }\n          }\n        },\n        \"expect\": {\n          \"target\": \"smithy.test#Expectation\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"Defines the kind of response that is expected from the service call.\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"tags\": {\n          \"target\": \"smithy.test#TagList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"Attaches a list of tags that can be used to categorize and group\\ntest cases. If a test case uses a feature that requires special\\nconfiguration, it should be tagged.\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"A single smoke test case definition.\",\n        \"smithy.api#private\": {}\n      }\n    },\n    \"smithy.test#Tag\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#pattern\": \"^[A-Za-z][A-Za-z0-9_\\\\-]+$\",\n        \"smithy.api#private\": {}\n      }\n    },\n    \"smithy.test#TagList\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"smithy.test#Tag\"\n      },\n      \"traits\": {\n        \"smithy.api#private\": {}\n      }\n    },\n    \"smithy.test#smokeTests\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"smithy.test#SmokeTestCase\",\n        \"traits\": {\n          \"smithy.api#documentation\": \"A list of smoke tests to perform on the operation\"\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"Defines a set of test cases to send to a live service to ensure that a\\nclient can successfully connect to a service and get the right kind of\\nresponse.\",\n        \"smithy.api#trait\": {\n          \"selector\": \"operation\"\n        }\n      }\n    },\n    \"smithy.waiters#Acceptor\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"state\": {\n          \"target\": \"smithy.waiters#AcceptorState\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"The state the acceptor transitions to when matched.\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"matcher\": {\n          \"target\": \"smithy.waiters#Matcher\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"The matcher used to test if the resource is in a given state.\",\n            \"smithy.api#required\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"Represents an acceptor in a waiter's state machine.\",\n        \"smithy.api#private\": {}\n      }\n    },\n    \"smithy.waiters#AcceptorState\": {\n      \"type\": \"enum\",\n      \"members\": {\n        \"SUCCESS\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"The waiter successfully finished waiting. This is a terminal\\nstate that causes the waiter to stop.\",\n            \"smithy.api#enumValue\": \"success\"\n          }\n        },\n        \"FAILURE\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"The waiter failed to enter into the desired state. This is a\\nterminal state that causes the waiter to stop.\",\n            \"smithy.api#enumValue\": \"failure\"\n          }\n        },\n        \"RETRY\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"The waiter will retry the operation. This state transition is\\nimplicit if no accepter causes a state transition.\",\n            \"smithy.api#enumValue\": \"retry\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"The transition state of a waiter.\",\n        \"smithy.api#private\": {}\n      }\n    },\n    \"smithy.waiters#Acceptors\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"smithy.waiters#Acceptor\"\n      },\n      \"traits\": {\n        \"smithy.api#length\": {\n          \"min\": 1\n        },\n        \"smithy.api#private\": {}\n      }\n    },\n    \"smithy.waiters#Matcher\": {\n      \"type\": \"union\",\n      \"members\": {\n        \"output\": {\n          \"target\": \"smithy.waiters#PathMatcher\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"Matches on the successful output of an operation using a\\nJMESPath expression.\"\n          }\n        },\n        \"inputOutput\": {\n          \"target\": \"smithy.waiters#PathMatcher\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"Matches on both the input and output of an operation using a JMESPath\\nexpression. Input parameters are available through the top-level\\n`input` field, and output data is available through the top-level\\n`output` field. This matcher can only be used on operations that\\ndefine both input and output. This matcher is checked only if an\\noperation completes successfully.\"\n          }\n        },\n        \"errorType\": {\n          \"target\": \"smithy.api#String\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"Matches if an operation returns an error and the error matches\\nthe expected error type. If an absolute shape ID is provided, the\\nerror is matched exactly on the shape ID. A shape name can be\\nprovided to match an error in any namespace with the given name.\"\n          }\n        },\n        \"success\": {\n          \"target\": \"smithy.api#Boolean\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"When set to `true`, matches when an operation returns a successful\\nresponse. When set to `false`, matches when an operation fails with\\nany error.\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"Defines how an acceptor determines if it matches the current state of\\na resource.\",\n        \"smithy.api#private\": {}\n      }\n    },\n    \"smithy.waiters#NonEmptyString\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#length\": {\n          \"min\": 1\n        },\n        \"smithy.api#private\": {}\n      }\n    },\n    \"smithy.waiters#NonEmptyStringList\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"smithy.waiters#NonEmptyString\"\n      },\n      \"traits\": {\n        \"smithy.api#private\": {}\n      }\n    },\n    \"smithy.waiters#PathComparator\": {\n      \"type\": \"enum\",\n      \"members\": {\n        \"STRING_EQUALS\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"Matches if the return value is a string that is equal to the expected string.\",\n            \"smithy.api#enumValue\": \"stringEquals\"\n          }\n        },\n        \"BOOLEAN_EQUALS\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"Matches if the return value is a boolean that is equal to the string literal 'true' or 'false'.\",\n            \"smithy.api#enumValue\": \"booleanEquals\"\n          }\n        },\n        \"ALL_STRING_EQUALS\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"Matches if all values in the list matches the expected string.\",\n            \"smithy.api#enumValue\": \"allStringEquals\"\n          }\n        },\n        \"ANY_STRING_EQUALS\": {\n          \"target\": \"smithy.api#Unit\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"Matches if any value in the list matches the expected string.\",\n            \"smithy.api#enumValue\": \"anyStringEquals\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"Defines a comparison to perform in a PathMatcher.\",\n        \"smithy.api#private\": {}\n      }\n    },\n    \"smithy.waiters#PathMatcher\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"path\": {\n          \"target\": \"smithy.api#String\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"A JMESPath expression applied to the input or output of an operation.\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"expected\": {\n          \"target\": \"smithy.api#String\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"The expected return value of the expression.\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"comparator\": {\n          \"target\": \"smithy.waiters#PathComparator\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"The comparator used to compare the result of the expression with the\\nexpected value.\",\n            \"smithy.api#required\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"Defines how to test the result of a JMESPath expression against\\nan expected value.\",\n        \"smithy.api#private\": {}\n      }\n    },\n    \"smithy.waiters#Waiter\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"documentation\": {\n          \"target\": \"smithy.api#String\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"Documentation about the waiter. Can use CommonMark.\"\n          }\n        },\n        \"acceptors\": {\n          \"target\": \"smithy.waiters#Acceptors\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"An ordered array of acceptors to check after executing an operation.\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"minDelay\": {\n          \"target\": \"smithy.waiters#WaiterDelay\",\n          \"traits\": {\n            \"smithy.api#default\": 2,\n            \"smithy.api#documentation\": \"The minimum amount of time in seconds to delay between each retry.\\nThis value defaults to 2 if not specified. If specified, this value\\nMUST be greater than or equal to 1 and less than or equal to\\n`maxDelay`.\"\n          }\n        },\n        \"maxDelay\": {\n          \"target\": \"smithy.waiters#WaiterDelay\",\n          \"traits\": {\n            \"smithy.api#default\": 120,\n            \"smithy.api#documentation\": \"The maximum amount of time in seconds to delay between each retry.\\nThis value defaults to 120 if not specified (or, 2 minutes). If\\nspecified, this value MUST be greater than or equal to 1.\"\n          }\n        },\n        \"deprecated\": {\n          \"target\": \"smithy.api#Boolean\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"Indicates if the waiter is considered deprecated. A waiter SHOULD\\nbe marked as deprecated if it has been replaced by another waiter or\\nif it is no longer needed (for example, if a resource changes from\\neventually consistent to strongly consistent).\"\n          }\n        },\n        \"tags\": {\n          \"target\": \"smithy.waiters#NonEmptyStringList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"A list of tags associated with the waiter that allow waiters to be\\ncategorized and grouped.\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"Defines an individual operation waiter.\",\n        \"smithy.api#private\": {}\n      }\n    },\n    \"smithy.waiters#WaiterDelay\": {\n      \"type\": \"integer\",\n      \"traits\": {\n        \"smithy.api#range\": {\n          \"min\": 1\n        }\n      }\n    },\n    \"smithy.waiters#WaiterName\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#pattern\": \"^[A-Z]+[A-Za-z0-9]*$\"\n      }\n    },\n    \"smithy.waiters#waitable\": {\n      \"type\": \"map\",\n      \"key\": {\n        \"target\": \"smithy.waiters#WaiterName\"\n      },\n      \"value\": {\n        \"target\": \"smithy.waiters#Waiter\"\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"Indicates that an operation has various named \\\"waiters\\\" that can be used\\nto poll a resource until it enters a desired state.\",\n        \"smithy.api#length\": {\n          \"min\": 1\n        },\n        \"smithy.api#trait\": {\n          \"selector\": \"operation :not(-[input, output]-> structure > member > union[trait|streaming])\"\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "aws/sdk/aws-models/sdk-default-configuration.json",
    "content": "{\n  \"version\": 1,\n  \"base\": {\n    \"retryMode\": \"standard\",\n    \"stsRegionalEndpoints\": \"regional\",\n    \"s3UsEast1RegionalEndpoints\": \"regional\",\n    \"connectTimeoutInMillis\": 1100,\n    \"tlsNegotiationTimeoutInMillis\": 1100\n  },\n  \"modes\": {\n    \"standard\": {\n      \"connectTimeoutInMillis\": {\n        \"override\": 3100\n      },\n      \"tlsNegotiationTimeoutInMillis\": {\n        \"override\": 3100\n      }\n    },\n    \"in-region\": {\n    },\n    \"cross-region\": {\n      \"connectTimeoutInMillis\": {\n        \"override\": 3100\n      },\n      \"tlsNegotiationTimeoutInMillis\": {\n        \"override\": 3100\n      }\n    },\n    \"mobile\": {\n      \"connectTimeoutInMillis\": {\n        \"override\": 30000\n      },\n      \"tlsNegotiationTimeoutInMillis\": {\n        \"override\": 30000\n      }\n    }\n  },\n  \"documentation\": {\n    \"modes\": {\n      \"standard\": \"<p>The STANDARD mode provides the latest recommended default values that should be safe to run in most scenarios</p><p>Note that the default values vended from this mode might change as best practices may evolve. As a result, it is encouraged to perform tests when upgrading the SDK</p>\",\n      \"in-region\": \"<p>The IN_REGION mode builds on the standard mode and includes optimization tailored for applications which call AWS services from within the same AWS region</p><p>Note that the default values vended from this mode might change as best practices may evolve. As a result, it is encouraged to perform tests when upgrading the SDK</p>\",\n      \"cross-region\": \"<p>The CROSS_REGION mode builds on the standard mode and includes optimization tailored for applications which call AWS services in a different region</p><p>Note that the default values vended from this mode might change as best practices may evolve. As a result, it is encouraged to perform tests when upgrading the SDK</p>\",\n      \"mobile\": \"<p>The MOBILE mode builds on the standard mode and includes optimization tailored for mobile applications</p><p>Note that the default values vended from this mode might change as best practices may evolve. As a result, it is encouraged to perform tests when upgrading the SDK</p>\",\n      \"auto\": \"<p>The AUTO mode is an experimental mode that builds on the standard mode. The SDK will attempt to discover the execution environment to determine the appropriate settings automatically.</p><p>Note that the auto detection is heuristics-based and does not guarantee 100% accuracy. STANDARD mode will be used if the execution environment cannot be determined. The auto detection might query <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-metadata.html\\\">EC2 Instance Metadata service</a>, which might introduce latency. Therefore we recommend choosing an explicit defaults_mode instead if startup latency is critical to your application</p>\",\n      \"legacy\": \"<p>The LEGACY mode provides default settings that vary per SDK and were used prior to establishment of defaults_mode</p>\"\n    },\n    \"configuration\": {\n      \"retryMode\": \"<p>A retry mode specifies how the SDK attempts retries. See <a href=\\\"https://docs.aws.amazon.com/sdkref/latest/guide/setting-global-retry_mode.html\\\">Retry Mode</a></p>\",\n      \"stsRegionalEndpoints\": \"<p>Specifies how the SDK determines the AWS service endpoint that it uses to talk to the AWS Security Token Service (AWS STS). See <a href=\\\"https://docs.aws.amazon.com/sdkref/latest/guide/setting-global-sts_regional_endpoints.html\\\">Setting STS Regional endpoints</a></p>\",\n      \"s3UsEast1RegionalEndpoints\": \"<p>Specifies how the SDK determines the AWS service endpoint that it uses to talk to the Amazon S3 for the us-east-1 region</p>\",\n      \"connectTimeoutInMillis\": \"<p>The amount of time after making an initial connection attempt on a socket, where if the client does not receive a completion of the connect handshake, the client gives up and fails the operation</p>\",\n      \"tlsNegotiationTimeoutInMillis\": \"<p>The maximum amount of time that a TLS handshake is allowed to take from the time the CLIENT HELLO message is sent to ethe time the client and server have fully negotiated ciphers and exchanged keys</p>\"\n    }\n  }\n}\n"
  },
  {
    "path": "aws/sdk/aws-models/sdk-endpoints.json",
    "content": "{\n  \"partitions\" : [ {\n    \"defaults\" : {\n      \"hostname\" : \"{service}.{region}.{dnsSuffix}\",\n      \"protocols\" : [ \"https\" ],\n      \"signatureVersions\" : [ \"v4\" ],\n      \"variants\" : [ {\n        \"dnsSuffix\" : \"amazonaws.com\",\n        \"hostname\" : \"{service}-fips.{region}.{dnsSuffix}\",\n        \"tags\" : [ \"fips\" ]\n      }, {\n        \"dnsSuffix\" : \"api.aws\",\n        \"hostname\" : \"{service}-fips.{region}.{dnsSuffix}\",\n        \"tags\" : [ \"dualstack\", \"fips\" ]\n      }, {\n        \"dnsSuffix\" : \"api.aws\",\n        \"hostname\" : \"{service}.{region}.{dnsSuffix}\",\n        \"tags\" : [ \"dualstack\" ]\n      } ]\n    },\n    \"dnsSuffix\" : \"amazonaws.com\",\n    \"partition\" : \"aws\",\n    \"partitionName\" : \"AWS Standard\",\n    \"regionRegex\" : \"^(us|eu|ap|sa|ca|me|af|il|mx)\\\\-\\\\w+\\\\-\\\\d+$\",\n    \"regions\" : {\n      \"af-south-1\" : {\n        \"description\" : \"Africa (Cape Town)\"\n      },\n      \"ap-east-1\" : {\n        \"description\" : \"Asia Pacific (Hong Kong)\"\n      },\n      \"ap-east-2\" : {\n        \"description\" : \"Asia Pacific (Taipei)\"\n      },\n      \"ap-northeast-1\" : {\n        \"description\" : \"Asia Pacific (Tokyo)\"\n      },\n      \"ap-northeast-2\" : {\n        \"description\" : \"Asia Pacific (Seoul)\"\n      },\n      \"ap-northeast-3\" : {\n        \"description\" : \"Asia Pacific (Osaka)\"\n      },\n      \"ap-south-1\" : {\n        \"description\" : \"Asia Pacific (Mumbai)\"\n      },\n      \"ap-south-2\" : {\n        \"description\" : \"Asia Pacific (Hyderabad)\"\n      },\n      \"ap-southeast-1\" : {\n        \"description\" : \"Asia Pacific (Singapore)\"\n      },\n      \"ap-southeast-2\" : {\n        \"description\" : \"Asia Pacific (Sydney)\"\n      },\n      \"ap-southeast-3\" : {\n        \"description\" : \"Asia Pacific (Jakarta)\"\n      },\n      \"ap-southeast-4\" : {\n        \"description\" : \"Asia Pacific (Melbourne)\"\n      },\n      \"ap-southeast-5\" : {\n        \"description\" : \"Asia Pacific (Malaysia)\"\n      },\n      \"ap-southeast-6\" : {\n        \"description\" : \"Asia Pacific (New Zealand)\"\n      },\n      \"ap-southeast-7\" : {\n        \"description\" : \"Asia Pacific (Thailand)\"\n      },\n      \"ca-central-1\" : {\n        \"description\" : \"Canada (Central)\"\n      },\n      \"ca-west-1\" : {\n        \"description\" : \"Canada West (Calgary)\"\n      },\n      \"eu-central-1\" : {\n        \"description\" : \"Europe (Frankfurt)\"\n      },\n      \"eu-central-2\" : {\n        \"description\" : \"Europe (Zurich)\"\n      },\n      \"eu-north-1\" : {\n        \"description\" : \"Europe (Stockholm)\"\n      },\n      \"eu-south-1\" : {\n        \"description\" : \"Europe (Milan)\"\n      },\n      \"eu-south-2\" : {\n        \"description\" : \"Europe (Spain)\"\n      },\n      \"eu-west-1\" : {\n        \"description\" : \"Europe (Ireland)\"\n      },\n      \"eu-west-2\" : {\n        \"description\" : \"Europe (London)\"\n      },\n      \"eu-west-3\" : {\n        \"description\" : \"Europe (Paris)\"\n      },\n      \"il-central-1\" : {\n        \"description\" : \"Israel (Tel Aviv)\"\n      },\n      \"me-central-1\" : {\n        \"description\" : \"Middle East (UAE)\"\n      },\n      \"me-south-1\" : {\n        \"description\" : \"Middle East (Bahrain)\"\n      },\n      \"mx-central-1\" : {\n        \"description\" : \"Mexico (Central)\"\n      },\n      \"sa-east-1\" : {\n        \"description\" : \"South America (Sao Paulo)\"\n      },\n      \"us-east-1\" : {\n        \"description\" : \"US East (N. Virginia)\"\n      },\n      \"us-east-2\" : {\n        \"description\" : \"US East (Ohio)\"\n      },\n      \"us-west-1\" : {\n        \"description\" : \"US West (N. California)\"\n      },\n      \"us-west-2\" : {\n        \"description\" : \"US West (Oregon)\"\n      }\n    },\n    \"services\" : {\n      \"access-analyzer\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"access-analyzer.af-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"access-analyzer.ap-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"access-analyzer.ap-northeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"access-analyzer.ap-northeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"access-analyzer.ap-northeast-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"access-analyzer.ap-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"access-analyzer.ap-south-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"access-analyzer.ap-southeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"access-analyzer.ap-southeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"access-analyzer.ap-southeast-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-4\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"access-analyzer.ap-southeast-4.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-5\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"access-analyzer.ap-southeast-5.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-6\" : { },\n          \"ap-southeast-7\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"access-analyzer.ap-southeast-7.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"access-analyzer-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"access-analyzer-fips.ca-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"access-analyzer.ca-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ca-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"access-analyzer-fips.ca-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"access-analyzer-fips.ca-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"access-analyzer.ca-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"access-analyzer.eu-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-central-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"access-analyzer.eu-central-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-north-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"access-analyzer.eu-north-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"access-analyzer.eu-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"access-analyzer.eu-south-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"access-analyzer.eu-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"access-analyzer.eu-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"access-analyzer.eu-west-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"fips-ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"access-analyzer-fips.ca-central-1.amazonaws.com\"\n          },\n          \"fips-ca-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"access-analyzer-fips.ca-west-1.amazonaws.com\"\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"access-analyzer-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"access-analyzer-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"access-analyzer-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"access-analyzer-fips.us-west-2.amazonaws.com\"\n          },\n          \"il-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"access-analyzer.il-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"me-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"access-analyzer.me-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"me-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"access-analyzer.me-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"mx-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"access-analyzer.mx-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"sa-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"access-analyzer.sa-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"access-analyzer-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"access-analyzer-fips.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"access-analyzer.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"access-analyzer-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"access-analyzer-fips.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"access-analyzer.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"access-analyzer-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"access-analyzer-fips.us-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"access-analyzer.us-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"access-analyzer-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"access-analyzer-fips.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"access-analyzer.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"account\" : {\n        \"endpoints\" : {\n          \"aws-global\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"hostname\" : \"account.us-east-1.amazonaws.com\"\n          }\n        },\n        \"isRegionalized\" : false,\n        \"partitionEndpoint\" : \"aws-global\"\n      },\n      \"acm\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-south-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-3\" : { },\n          \"ap-southeast-4\" : { },\n          \"ap-southeast-5\" : { },\n          \"ap-southeast-6\" : { },\n          \"ap-southeast-7\" : { },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"acm-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ca-central-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"acm-fips.ca-central-1.amazonaws.com\"\n          },\n          \"ca-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"acm-fips.ca-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ca-west-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"acm-fips.ca-west-1.amazonaws.com\"\n          },\n          \"eu-central-1\" : { },\n          \"eu-central-2\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"il-central-1\" : { },\n          \"me-central-1\" : { },\n          \"me-south-1\" : { },\n          \"mx-central-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"acm-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"acm-fips.us-east-1.amazonaws.com\"\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"acm-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"acm-fips.us-east-2.amazonaws.com\"\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"acm-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"acm-fips.us-west-1.amazonaws.com\"\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"acm-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"acm-fips.us-west-2.amazonaws.com\"\n          }\n        }\n      },\n      \"acm-pca\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"https\" ]\n        },\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-south-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-3\" : { },\n          \"ap-southeast-4\" : { },\n          \"ap-southeast-5\" : { },\n          \"ap-southeast-6\" : { },\n          \"ap-southeast-7\" : { },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"acm-pca-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ca-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"acm-pca-fips.ca-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-central-1\" : { },\n          \"eu-central-2\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"fips-ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"acm-pca-fips.ca-central-1.amazonaws.com\"\n          },\n          \"fips-ca-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"acm-pca-fips.ca-west-1.amazonaws.com\"\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"acm-pca-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"acm-pca-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"acm-pca-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"acm-pca-fips.us-west-2.amazonaws.com\"\n          },\n          \"il-central-1\" : { },\n          \"me-central-1\" : { },\n          \"me-south-1\" : { },\n          \"mx-central-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"acm-pca-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"acm-pca-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"acm-pca-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"acm-pca-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"agreement-marketplace\" : {\n        \"endpoints\" : {\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"agreement-marketplace.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"airflow\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-south-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-3\" : { },\n          \"ap-southeast-4\" : { },\n          \"ap-southeast-5\" : { },\n          \"ca-central-1\" : { },\n          \"ca-west-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-central-2\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"il-central-1\" : { },\n          \"me-central-1\" : { },\n          \"me-south-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : { },\n          \"us-east-2\" : { },\n          \"us-west-1\" : { },\n          \"us-west-2\" : { }\n        }\n      },\n      \"amplify\" : {\n        \"endpoints\" : {\n          \"ap-east-1\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ca-central-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"me-south-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : { },\n          \"us-east-2\" : { },\n          \"us-west-1\" : { },\n          \"us-west-2\" : { }\n        }\n      },\n      \"amplifybackend\" : {\n        \"endpoints\" : {\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ca-central-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"me-south-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : { },\n          \"us-east-2\" : { },\n          \"us-west-1\" : { },\n          \"us-west-2\" : { }\n        }\n      },\n      \"amplifyuibuilder\" : {\n        \"endpoints\" : {\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ca-central-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"me-south-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : { },\n          \"us-east-2\" : { },\n          \"us-west-1\" : { },\n          \"us-west-2\" : { }\n        }\n      },\n      \"aoss\" : {\n        \"endpoints\" : {\n          \"ap-east-1\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-south-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ca-central-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-central-2\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : { },\n          \"us-east-2\" : { },\n          \"us-west-1\" : { },\n          \"us-west-2\" : { }\n        }\n      },\n      \"api.detective\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"https\" ]\n        },\n        \"endpoints\" : {\n          \"af-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"detective.af-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"detective.ap-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"detective.ap-northeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"detective.ap-northeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"detective.ap-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"detective.ap-southeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"detective.ap-southeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"api.detective-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"detective-fips.ca-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"detective.ca-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ca-central-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"api.detective-fips.ca-central-1.amazonaws.com\"\n          },\n          \"eu-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"detective.eu-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-north-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"detective.eu-north-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"detective.eu-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"detective.eu-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"detective.eu-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"detective.eu-west-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"il-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"detective.il-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"me-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"detective.me-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"sa-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"detective.sa-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"api.detective-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"detective-fips.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"detective.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"api.detective-fips.us-east-1.amazonaws.com\"\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"api.detective-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"detective-fips.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"detective.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-2-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"api.detective-fips.us-east-2.amazonaws.com\"\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"api.detective-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"detective-fips.us-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"detective.us-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"api.detective-fips.us-west-1.amazonaws.com\"\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"api.detective-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"detective-fips.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"detective.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-2-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"api.detective-fips.us-west-2.amazonaws.com\"\n          }\n        }\n      },\n      \"api.ecr\" : {\n        \"defaults\" : {\n          \"variants\" : [ {\n            \"hostname\" : \"ecr-fips.{region}.{dnsSuffix}\",\n            \"tags\" : [ \"fips\" ]\n          } ]\n        },\n        \"endpoints\" : {\n          \"af-south-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"af-south-1\"\n            },\n            \"hostname\" : \"api.ecr.af-south-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"ecr.af-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-east-1\"\n            },\n            \"hostname\" : \"api.ecr.ap-east-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"ecr.ap-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-northeast-1\"\n            },\n            \"hostname\" : \"api.ecr.ap-northeast-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"ecr.ap-northeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-northeast-2\"\n            },\n            \"hostname\" : \"api.ecr.ap-northeast-2.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"ecr.ap-northeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-3\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-northeast-3\"\n            },\n            \"hostname\" : \"api.ecr.ap-northeast-3.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"ecr.ap-northeast-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-south-1\"\n            },\n            \"hostname\" : \"api.ecr.ap-south-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"ecr.ap-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-south-2\"\n            },\n            \"hostname\" : \"api.ecr.ap-south-2.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"ecr.ap-south-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-southeast-1\"\n            },\n            \"hostname\" : \"api.ecr.ap-southeast-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"ecr.ap-southeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-southeast-2\"\n            },\n            \"hostname\" : \"api.ecr.ap-southeast-2.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"ecr.ap-southeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-3\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-southeast-3\"\n            },\n            \"hostname\" : \"api.ecr.ap-southeast-3.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"ecr.ap-southeast-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-4\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-southeast-4\"\n            },\n            \"hostname\" : \"api.ecr.ap-southeast-4.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"ecr.ap-southeast-4.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-5\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-southeast-5\"\n            },\n            \"hostname\" : \"api.ecr.ap-southeast-5.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"ecr.ap-southeast-5.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-6\" : { },\n          \"ap-southeast-7\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-southeast-7\"\n            },\n            \"hostname\" : \"api.ecr.ap-southeast-7.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"ecr.ap-southeast-7.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"hostname\" : \"api.ecr.ca-central-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"ecr.ca-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ca-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-west-1\"\n            },\n            \"hostname\" : \"api.ecr.ca-west-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"ecr.ca-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"dkr-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"variants\" : [ {\n              \"hostname\" : \"ecr-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"dkr-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"variants\" : [ {\n              \"hostname\" : \"ecr-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"dkr-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"variants\" : [ {\n              \"hostname\" : \"ecr-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"dkr-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"variants\" : [ {\n              \"hostname\" : \"ecr-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-central-1\"\n            },\n            \"hostname\" : \"api.ecr.eu-central-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"ecr.eu-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-central-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-central-2\"\n            },\n            \"hostname\" : \"api.ecr.eu-central-2.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"ecr.eu-central-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-north-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-north-1\"\n            },\n            \"hostname\" : \"api.ecr.eu-north-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"ecr.eu-north-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-south-1\"\n            },\n            \"hostname\" : \"api.ecr.eu-south-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"ecr.eu-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-south-2\"\n            },\n            \"hostname\" : \"api.ecr.eu-south-2.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"ecr.eu-south-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-west-1\"\n            },\n            \"hostname\" : \"api.ecr.eu-west-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"ecr.eu-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-west-2\"\n            },\n            \"hostname\" : \"api.ecr.eu-west-2.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"ecr.eu-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-3\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-west-3\"\n            },\n            \"hostname\" : \"api.ecr.eu-west-3.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"ecr.eu-west-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"fips-dkr-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"ecr-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-dkr-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"ecr-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-dkr-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"ecr-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-dkr-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"ecr-fips.us-west-2.amazonaws.com\"\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"ecr-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"ecr-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"ecr-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"ecr-fips.us-west-2.amazonaws.com\"\n          },\n          \"il-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"il-central-1\"\n            },\n            \"hostname\" : \"api.ecr.il-central-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"ecr.il-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"me-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"me-central-1\"\n            },\n            \"hostname\" : \"api.ecr.me-central-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"ecr.me-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"me-south-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"me-south-1\"\n            },\n            \"hostname\" : \"api.ecr.me-south-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"ecr.me-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"mx-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"mx-central-1\"\n            },\n            \"hostname\" : \"api.ecr.mx-central-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"ecr.mx-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"sa-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"sa-east-1\"\n            },\n            \"hostname\" : \"api.ecr.sa-east-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"ecr.sa-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"hostname\" : \"api.ecr.us-east-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"ecr-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"ecr-fips.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"ecr.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"hostname\" : \"api.ecr.us-east-2.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"ecr-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"ecr-fips.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"ecr.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"hostname\" : \"api.ecr.us-west-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"ecr-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"ecr-fips.us-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"ecr.us-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"hostname\" : \"api.ecr.us-west-2.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"ecr-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"ecr-fips.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"ecr.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"api.ecr-public\" : {\n        \"endpoints\" : {\n          \"us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"hostname\" : \"api.ecr-public.us-east-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"ecr-public.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"hostname\" : \"api.ecr-public.us-west-2.amazonaws.com\"\n          }\n        }\n      },\n      \"api.fleethub.iot\" : {\n        \"endpoints\" : {\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-south-1\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"api.fleethub.iot-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-central-1\" : { },\n          \"eu-north-1\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"fips-ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"api.fleethub.iot-fips.ca-central-1.amazonaws.com\"\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"api.fleethub.iot-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"api.fleethub.iot-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"api.fleethub.iot-fips.us-west-2.amazonaws.com\"\n          },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"api.fleethub.iot-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"api.fleethub.iot-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"api.fleethub.iot-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"api.iotdeviceadvisor\" : {\n        \"endpoints\" : {\n          \"ap-northeast-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-northeast-1\"\n            },\n            \"hostname\" : \"api.iotdeviceadvisor.ap-northeast-1.amazonaws.com\"\n          },\n          \"eu-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-west-1\"\n            },\n            \"hostname\" : \"api.iotdeviceadvisor.eu-west-1.amazonaws.com\"\n          },\n          \"us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"hostname\" : \"api.iotdeviceadvisor.us-east-1.amazonaws.com\"\n          },\n          \"us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"hostname\" : \"api.iotdeviceadvisor.us-west-2.amazonaws.com\"\n          }\n        }\n      },\n      \"api.iotwireless\" : {\n        \"endpoints\" : {\n          \"ap-northeast-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-northeast-1\"\n            },\n            \"hostname\" : \"api.iotwireless.ap-northeast-1.amazonaws.com\"\n          },\n          \"ap-southeast-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-southeast-2\"\n            },\n            \"hostname\" : \"api.iotwireless.ap-southeast-2.amazonaws.com\"\n          },\n          \"eu-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-central-1\"\n            },\n            \"hostname\" : \"api.iotwireless.eu-central-1.amazonaws.com\"\n          },\n          \"eu-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-west-1\"\n            },\n            \"hostname\" : \"api.iotwireless.eu-west-1.amazonaws.com\"\n          },\n          \"sa-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"sa-east-1\"\n            },\n            \"hostname\" : \"api.iotwireless.sa-east-1.amazonaws.com\"\n          },\n          \"us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"hostname\" : \"api.iotwireless.us-east-1.amazonaws.com\"\n          },\n          \"us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"hostname\" : \"api.iotwireless.us-west-2.amazonaws.com\"\n          }\n        }\n      },\n      \"api.mediatailor\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-south-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-4\" : { },\n          \"ca-central-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-north-1\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-3\" : { },\n          \"me-central-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : { },\n          \"us-east-2\" : { },\n          \"us-west-2\" : { }\n        }\n      },\n      \"api.pricing\" : {\n        \"defaults\" : {\n          \"credentialScope\" : {\n            \"service\" : \"pricing\"\n          }\n        },\n        \"endpoints\" : {\n          \"ap-south-1\" : { },\n          \"eu-central-1\" : { },\n          \"us-east-1\" : { }\n        }\n      },\n      \"api.sagemaker\" : {\n        \"defaults\" : {\n          \"variants\" : [ {\n            \"hostname\" : \"api-fips.sagemaker.{region}.{dnsSuffix}\",\n            \"tags\" : [ \"fips\" ]\n          } ]\n        },\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-south-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-3\" : { },\n          \"ap-southeast-4\" : { },\n          \"ap-southeast-5\" : { },\n          \"ap-southeast-7\" : { },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"api-fips.sagemaker.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ca-central-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"api-fips.sagemaker.ca-central-1.amazonaws.com\"\n          },\n          \"ca-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"api-fips.sagemaker.ca-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ca-west-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"api-fips.sagemaker.ca-west-1.amazonaws.com\"\n          },\n          \"eu-central-1\" : { },\n          \"eu-central-2\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"il-central-1\" : { },\n          \"me-central-1\" : { },\n          \"me-south-1\" : { },\n          \"mx-central-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"api-fips.sagemaker.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"api-fips.sagemaker.us-east-1.amazonaws.com\"\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"api-fips.sagemaker.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"api-fips.sagemaker.us-east-2.amazonaws.com\"\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"api-fips.sagemaker.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"api-fips.sagemaker.us-west-1.amazonaws.com\"\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"api-fips.sagemaker.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"api-fips.sagemaker.us-west-2.amazonaws.com\"\n          }\n        }\n      },\n      \"api.tunneling.iot\" : {\n        \"defaults\" : {\n          \"variants\" : [ {\n            \"dnsSuffix\" : \"amazonaws.com\",\n            \"hostname\" : \"api.tunneling.iot-fips.{region}.{dnsSuffix}\",\n            \"tags\" : [ \"fips\" ]\n          }, {\n            \"dnsSuffix\" : \"api.aws\",\n            \"hostname\" : \"api.iot-tunneling-fips.{region}.{dnsSuffix}\",\n            \"tags\" : [ \"dualstack\", \"fips\" ]\n          }, {\n            \"dnsSuffix\" : \"api.aws\",\n            \"hostname\" : \"api.iot-tunneling.{region}.{dnsSuffix}\",\n            \"tags\" : [ \"dualstack\" ]\n          } ]\n        },\n        \"endpoints\" : {\n          \"ap-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"api.iot-tunneling.ap-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"api.iot-tunneling.ap-northeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"api.iot-tunneling.ap-northeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"api.iot-tunneling.ap-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"api.iot-tunneling.ap-southeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"api.iot-tunneling.ap-southeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-5\" : { },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"api.iot-tunneling-fips.ca-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"api.iot-tunneling.ca-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            }, {\n              \"hostname\" : \"api.tunneling.iot-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"api.iot-tunneling.eu-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-north-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"api.iot-tunneling.eu-north-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"api.iot-tunneling.eu-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"api.iot-tunneling.eu-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"api.iot-tunneling.eu-west-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"fips-ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"api.tunneling.iot-fips.ca-central-1.amazonaws.com\"\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"api.tunneling.iot-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"api.tunneling.iot-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"api.tunneling.iot-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"api.tunneling.iot-fips.us-west-2.amazonaws.com\"\n          },\n          \"me-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"api.iot-tunneling.me-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"me-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"api.iot-tunneling.me-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"sa-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"api.iot-tunneling.sa-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"api.iot-tunneling-fips.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"api.iot-tunneling.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            }, {\n              \"hostname\" : \"api.tunneling.iot-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"api.iot-tunneling-fips.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"api.iot-tunneling.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            }, {\n              \"hostname\" : \"api.tunneling.iot-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"api.iot-tunneling-fips.us-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"api.iot-tunneling.us-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            }, {\n              \"hostname\" : \"api.tunneling.iot-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"api.iot-tunneling-fips.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"api.iot-tunneling.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            }, {\n              \"hostname\" : \"api.tunneling.iot-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"apigateway\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-south-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-3\" : { },\n          \"ap-southeast-4\" : { },\n          \"ap-southeast-5\" : { },\n          \"ap-southeast-6\" : { },\n          \"ap-southeast-7\" : { },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"apigateway-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ca-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"apigateway-fips.ca-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-central-1\" : { },\n          \"eu-central-2\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"fips-ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"apigateway-fips.ca-central-1.amazonaws.com\"\n          },\n          \"fips-ca-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"apigateway-fips.ca-west-1.amazonaws.com\"\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"apigateway-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"apigateway-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"apigateway-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"apigateway-fips.us-west-2.amazonaws.com\"\n          },\n          \"il-central-1\" : { },\n          \"me-central-1\" : { },\n          \"me-south-1\" : { },\n          \"mx-central-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"apigateway-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"apigateway-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"apigateway-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"apigateway-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"app-integrations\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ca-central-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-west-2\" : { },\n          \"us-east-1\" : { },\n          \"us-west-2\" : { }\n        }\n      },\n      \"appconfig\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-south-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-3\" : { },\n          \"ap-southeast-4\" : { },\n          \"ap-southeast-5\" : { },\n          \"ap-southeast-6\" : { },\n          \"ap-southeast-7\" : { },\n          \"ca-central-1\" : { },\n          \"ca-west-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-central-2\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"il-central-1\" : { },\n          \"me-central-1\" : { },\n          \"me-south-1\" : { },\n          \"mx-central-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : { },\n          \"us-east-2\" : { },\n          \"us-west-1\" : { },\n          \"us-west-2\" : { }\n        }\n      },\n      \"appconfigdata\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-south-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-3\" : { },\n          \"ap-southeast-4\" : { },\n          \"ap-southeast-5\" : { },\n          \"ap-southeast-6\" : { },\n          \"ap-southeast-7\" : { },\n          \"ca-central-1\" : { },\n          \"ca-west-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-central-2\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"il-central-1\" : { },\n          \"me-central-1\" : { },\n          \"me-south-1\" : { },\n          \"mx-central-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : { },\n          \"us-east-2\" : { },\n          \"us-west-1\" : { },\n          \"us-west-2\" : { }\n        }\n      },\n      \"appflow\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-south-1\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ca-central-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"appflow-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"appflow-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"appflow-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"appflow-fips.us-west-2.amazonaws.com\"\n          },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"appflow-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"appflow-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"appflow-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"appflow-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"application-autoscaling\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"http\", \"https\" ]\n        },\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-south-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-3\" : { },\n          \"ap-southeast-4\" : { },\n          \"ap-southeast-5\" : { },\n          \"ap-southeast-6\" : { },\n          \"ap-southeast-7\" : { },\n          \"ca-central-1\" : { },\n          \"ca-west-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-central-2\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"il-central-1\" : { },\n          \"me-central-1\" : { },\n          \"me-south-1\" : { },\n          \"mx-central-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : { },\n          \"us-east-2\" : { },\n          \"us-west-1\" : { },\n          \"us-west-2\" : { }\n        }\n      },\n      \"applicationinsights\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"applicationinsights.af-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"applicationinsights.ap-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"applicationinsights.ap-northeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"applicationinsights.ap-northeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"applicationinsights.ap-northeast-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"applicationinsights.ap-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"applicationinsights.ap-south-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"applicationinsights.ap-southeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"applicationinsights.ap-southeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"applicationinsights.ap-southeast-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-4\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"applicationinsights.ap-southeast-4.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"applicationinsights-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"applicationinsights-fips.ca-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"applicationinsights.ca-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ca-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"applicationinsights-fips.ca-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"applicationinsights-fips.ca-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"applicationinsights.ca-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"applicationinsights.eu-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-central-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"applicationinsights.eu-central-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-north-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"applicationinsights.eu-north-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"applicationinsights.eu-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"applicationinsights.eu-south-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"applicationinsights.eu-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"applicationinsights.eu-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"applicationinsights.eu-west-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"fips-ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"applicationinsights-fips.ca-central-1.amazonaws.com\"\n          },\n          \"fips-ca-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"applicationinsights-fips.ca-west-1.amazonaws.com\"\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"applicationinsights-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"applicationinsights-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"applicationinsights-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"applicationinsights-fips.us-west-2.amazonaws.com\"\n          },\n          \"il-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"applicationinsights.il-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"me-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"applicationinsights.me-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"me-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"applicationinsights.me-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"sa-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"applicationinsights.sa-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"applicationinsights-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"applicationinsights-fips.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"applicationinsights.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"applicationinsights-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"applicationinsights-fips.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"applicationinsights.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"applicationinsights-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"applicationinsights-fips.us-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"applicationinsights.us-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"applicationinsights-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"applicationinsights-fips.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"applicationinsights.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"appmesh\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"appmesh.af-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"appmesh.ap-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"appmesh.ap-northeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"appmesh.ap-northeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"appmesh.ap-northeast-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"appmesh.ap-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"appmesh.ap-southeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"appmesh.ap-southeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"appmesh.ap-southeast-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"appmesh-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"appmesh-fips.ca-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"appmesh.ca-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ca-central-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"appmesh-fips.ca-central-1.amazonaws.com\"\n          },\n          \"eu-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"appmesh.eu-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-central-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"appmesh.eu-central-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-north-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"appmesh.eu-north-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"appmesh.eu-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"appmesh.eu-south-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"appmesh.eu-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"appmesh.eu-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"appmesh.eu-west-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"il-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"appmesh.il-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"me-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"appmesh.me-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"sa-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"appmesh.sa-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"appmesh-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"appmesh-fips.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"appmesh.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"appmesh-fips.us-east-1.amazonaws.com\"\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"appmesh-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"appmesh-fips.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"appmesh.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-2-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"appmesh-fips.us-east-2.amazonaws.com\"\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"appmesh-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"appmesh-fips.us-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"appmesh.us-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"appmesh-fips.us-west-1.amazonaws.com\"\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"appmesh-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"appmesh-fips.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"appmesh.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-2-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"appmesh-fips.us-west-2.amazonaws.com\"\n          }\n        }\n      },\n      \"apprunner\" : {\n        \"endpoints\" : {\n          \"ap-northeast-1\" : { },\n          \"ap-south-1\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"eu-central-1\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"apprunner-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"apprunner-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"apprunner-fips.us-west-2.amazonaws.com\"\n          },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"apprunner-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"apprunner-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"apprunner-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"appstream2\" : {\n        \"defaults\" : {\n          \"credentialScope\" : {\n            \"service\" : \"appstream\"\n          },\n          \"protocols\" : [ \"https\" ]\n        },\n        \"endpoints\" : {\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-south-1\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ca-central-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"appstream2-fips.us-west-2.amazonaws.com\"\n          },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"appstream2-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"appstream2-fips.us-east-1.amazonaws.com\"\n          },\n          \"us-east-2\" : { },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"appstream2-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"appstream2-fips.us-west-2.amazonaws.com\"\n          }\n        }\n      },\n      \"appsync\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"appsync.af-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"appsync.ap-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"appsync.ap-northeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"appsync.ap-northeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"appsync.ap-northeast-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"appsync.ap-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"appsync.ap-south-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"appsync.ap-southeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"appsync.ap-southeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"appsync.ap-southeast-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-4\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"appsync.ap-southeast-4.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-5\" : { },\n          \"ap-southeast-7\" : { },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"appsync.ca-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ca-west-1\" : { },\n          \"eu-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"appsync.eu-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-central-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"appsync.eu-central-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-north-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"appsync.eu-north-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"appsync.eu-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"appsync.eu-south-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"appsync.eu-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"appsync.eu-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"appsync.eu-west-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"il-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"appsync.il-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"me-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"appsync.me-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"me-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"appsync.me-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"sa-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"appsync.sa-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"appsync.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"appsync.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"appsync.us-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"appsync.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"apptest\" : {\n        \"endpoints\" : {\n          \"ap-southeast-2\" : { },\n          \"eu-central-1\" : { },\n          \"fips-us-east-1\" : {\n            \"deprecated\" : true\n          },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"aps\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"https\" ]\n        },\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-2\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-2\" : { },\n          \"ap-southeast-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-2\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-3\" : { },\n          \"ap-southeast-4\" : { },\n          \"ap-southeast-5\" : { },\n          \"ap-southeast-7\" : { },\n          \"ca-central-1\" : { },\n          \"ca-west-1\" : { },\n          \"eu-central-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-central-2\" : { },\n          \"eu-north-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-2\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-3\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"il-central-1\" : { },\n          \"me-central-1\" : { },\n          \"me-south-1\" : { },\n          \"mx-central-1\" : { },\n          \"sa-east-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            }, {\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-1-fips\" : {\n            \"deprecated\" : true\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            }, {\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2-fips\" : {\n            \"deprecated\" : true\n          },\n          \"us-west-1\" : { },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            }, {\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2-fips\" : {\n            \"deprecated\" : true\n          }\n        }\n      },\n      \"arc-zonal-shift\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-south-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-3\" : { },\n          \"ap-southeast-4\" : { },\n          \"ap-southeast-5\" : { },\n          \"ap-southeast-6\" : { },\n          \"ap-southeast-7\" : { },\n          \"ca-central-1\" : { },\n          \"ca-west-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-central-2\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"il-central-1\" : { },\n          \"me-central-1\" : { },\n          \"me-south-1\" : { },\n          \"mx-central-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : { },\n          \"us-east-2\" : { },\n          \"us-west-1\" : { },\n          \"us-west-2\" : { }\n        }\n      },\n      \"athena\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"athena.af-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"athena.ap-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"athena.ap-northeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"athena.ap-northeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"athena.ap-northeast-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"athena.ap-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"athena.ap-south-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"athena.ap-southeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"athena.ap-southeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"athena.ap-southeast-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-4\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"athena.ap-southeast-4.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-5\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"athena.ap-southeast-5.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-7\" : { },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"athena-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"athena-fips.ca-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"athena.ca-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ca-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"athena-fips.ca-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"athena-fips.ca-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"athena.ca-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"athena.eu-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-central-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"athena.eu-central-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-north-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"athena.eu-north-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"athena.eu-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"athena.eu-south-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"athena.eu-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"athena.eu-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"athena.eu-west-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"fips-ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"athena-fips.ca-central-1.amazonaws.com\"\n          },\n          \"fips-ca-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"athena-fips.ca-west-1.amazonaws.com\"\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"athena-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"athena-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"athena-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"athena-fips.us-west-2.amazonaws.com\"\n          },\n          \"il-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"athena.il-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"me-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"athena.me-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"me-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"athena.me-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"mx-central-1\" : { },\n          \"sa-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"athena.sa-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"athena-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"athena-fips.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"athena.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"athena-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"athena-fips.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"athena.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"athena-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"athena-fips.us-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"athena.us-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"athena-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"athena-fips.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"athena.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"auditmanager\" : {\n        \"endpoints\" : {\n          \"ap-northeast-1\" : { },\n          \"ap-south-1\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ca-central-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"auditmanager-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"auditmanager-fips.us-east-1.amazonaws.com\"\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"auditmanager-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"auditmanager-fips.us-east-2.amazonaws.com\"\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"auditmanager-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"auditmanager-fips.us-west-1.amazonaws.com\"\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"auditmanager-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"auditmanager-fips.us-west-2.amazonaws.com\"\n          }\n        }\n      },\n      \"autoscaling\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"http\", \"https\" ]\n        },\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-south-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-3\" : { },\n          \"ap-southeast-4\" : { },\n          \"ap-southeast-5\" : { },\n          \"ap-southeast-6\" : { },\n          \"ap-southeast-7\" : { },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"autoscaling-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ca-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"autoscaling-fips.ca-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-central-1\" : { },\n          \"eu-central-2\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"fips-ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"autoscaling-fips.ca-central-1.amazonaws.com\"\n          },\n          \"fips-ca-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"autoscaling-fips.ca-west-1.amazonaws.com\"\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"autoscaling-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"autoscaling-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"autoscaling-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"autoscaling-fips.us-west-2.amazonaws.com\"\n          },\n          \"il-central-1\" : { },\n          \"me-central-1\" : { },\n          \"me-south-1\" : { },\n          \"mx-central-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"autoscaling-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"autoscaling-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"autoscaling-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"autoscaling-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"autoscaling-plans\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"http\", \"https\" ]\n        },\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-3\" : { },\n          \"ca-central-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"me-south-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : { },\n          \"us-east-2\" : { },\n          \"us-west-1\" : { },\n          \"us-west-2\" : { }\n        }\n      },\n      \"backup\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-south-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-3\" : { },\n          \"ap-southeast-4\" : { },\n          \"ap-southeast-5\" : { },\n          \"ap-southeast-6\" : { },\n          \"ap-southeast-7\" : { },\n          \"ca-central-1\" : { },\n          \"ca-west-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-central-2\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"il-central-1\" : { },\n          \"me-central-1\" : { },\n          \"me-south-1\" : { },\n          \"mx-central-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : { },\n          \"us-east-2\" : { },\n          \"us-west-1\" : { },\n          \"us-west-2\" : { }\n        }\n      },\n      \"backup-gateway\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ca-central-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"me-south-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : { },\n          \"us-east-2\" : { },\n          \"us-west-1\" : { },\n          \"us-west-2\" : { }\n        }\n      },\n      \"batch\" : {\n        \"defaults\" : {\n          \"variants\" : [ {\n            \"hostname\" : \"fips.batch.{region}.{dnsSuffix}\",\n            \"tags\" : [ \"fips\" ]\n          } ]\n        },\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-south-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-3\" : { },\n          \"ap-southeast-4\" : { },\n          \"ap-southeast-5\" : { },\n          \"ap-southeast-6\" : { },\n          \"ap-southeast-7\" : { },\n          \"ca-central-1\" : { },\n          \"ca-west-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-central-2\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"fips.batch.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"fips.batch.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"fips.batch.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"fips.batch.us-west-2.amazonaws.com\"\n          },\n          \"il-central-1\" : { },\n          \"me-central-1\" : { },\n          \"me-south-1\" : { },\n          \"mx-central-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"fips.batch.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"fips.batch.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"fips.batch.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"fips.batch.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"bedrock\" : {\n        \"endpoints\" : {\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-south-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-3\" : { },\n          \"ap-southeast-4\" : { },\n          \"ap-southeast-5\" : { },\n          \"ap-southeast-7\" : { },\n          \"bedrock-ap-northeast-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-northeast-1\"\n            },\n            \"hostname\" : \"bedrock.ap-northeast-1.amazonaws.com\"\n          },\n          \"bedrock-ap-northeast-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-northeast-2\"\n            },\n            \"hostname\" : \"bedrock.ap-northeast-2.amazonaws.com\"\n          },\n          \"bedrock-ap-northeast-3\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-northeast-3\"\n            },\n            \"hostname\" : \"bedrock.ap-northeast-3.amazonaws.com\"\n          },\n          \"bedrock-ap-south-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-south-1\"\n            },\n            \"hostname\" : \"bedrock.ap-south-1.amazonaws.com\"\n          },\n          \"bedrock-ap-south-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-south-2\"\n            },\n            \"hostname\" : \"bedrock.ap-south-2.amazonaws.com\"\n          },\n          \"bedrock-ap-southeast-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-southeast-1\"\n            },\n            \"hostname\" : \"bedrock.ap-southeast-1.amazonaws.com\"\n          },\n          \"bedrock-ap-southeast-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-southeast-2\"\n            },\n            \"hostname\" : \"bedrock.ap-southeast-2.amazonaws.com\"\n          },\n          \"bedrock-ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"hostname\" : \"bedrock.ca-central-1.amazonaws.com\"\n          },\n          \"bedrock-eu-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-central-1\"\n            },\n            \"hostname\" : \"bedrock.eu-central-1.amazonaws.com\"\n          },\n          \"bedrock-eu-central-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-central-2\"\n            },\n            \"hostname\" : \"bedrock.eu-central-2.amazonaws.com\"\n          },\n          \"bedrock-eu-north-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-north-1\"\n            },\n            \"hostname\" : \"bedrock.eu-north-1.amazonaws.com\"\n          },\n          \"bedrock-eu-south-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-south-1\"\n            },\n            \"hostname\" : \"bedrock.eu-south-1.amazonaws.com\"\n          },\n          \"bedrock-eu-south-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-south-2\"\n            },\n            \"hostname\" : \"bedrock.eu-south-2.amazonaws.com\"\n          },\n          \"bedrock-eu-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-west-1\"\n            },\n            \"hostname\" : \"bedrock.eu-west-1.amazonaws.com\"\n          },\n          \"bedrock-eu-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-west-2\"\n            },\n            \"hostname\" : \"bedrock.eu-west-2.amazonaws.com\"\n          },\n          \"bedrock-eu-west-3\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-west-3\"\n            },\n            \"hostname\" : \"bedrock.eu-west-3.amazonaws.com\"\n          },\n          \"bedrock-fips-ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"hostname\" : \"bedrock-fips.ca-central-1.amazonaws.com\"\n          },\n          \"bedrock-fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"hostname\" : \"bedrock-fips.us-east-1.amazonaws.com\"\n          },\n          \"bedrock-fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"hostname\" : \"bedrock-fips.us-east-2.amazonaws.com\"\n          },\n          \"bedrock-fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"hostname\" : \"bedrock-fips.us-west-2.amazonaws.com\"\n          },\n          \"bedrock-runtime-ap-northeast-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-northeast-1\"\n            },\n            \"hostname\" : \"bedrock-runtime.ap-northeast-1.amazonaws.com\"\n          },\n          \"bedrock-runtime-ap-northeast-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-northeast-2\"\n            },\n            \"hostname\" : \"bedrock-runtime.ap-northeast-2.amazonaws.com\"\n          },\n          \"bedrock-runtime-ap-northeast-3\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-northeast-3\"\n            },\n            \"hostname\" : \"bedrock-runtime.ap-northeast-3.amazonaws.com\"\n          },\n          \"bedrock-runtime-ap-south-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-south-1\"\n            },\n            \"hostname\" : \"bedrock-runtime.ap-south-1.amazonaws.com\"\n          },\n          \"bedrock-runtime-ap-south-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-south-2\"\n            },\n            \"hostname\" : \"bedrock-runtime.ap-south-2.amazonaws.com\"\n          },\n          \"bedrock-runtime-ap-southeast-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-southeast-1\"\n            },\n            \"hostname\" : \"bedrock-runtime.ap-southeast-1.amazonaws.com\"\n          },\n          \"bedrock-runtime-ap-southeast-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-southeast-2\"\n            },\n            \"hostname\" : \"bedrock-runtime.ap-southeast-2.amazonaws.com\"\n          },\n          \"bedrock-runtime-ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"hostname\" : \"bedrock-runtime.ca-central-1.amazonaws.com\"\n          },\n          \"bedrock-runtime-eu-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-central-1\"\n            },\n            \"hostname\" : \"bedrock-runtime.eu-central-1.amazonaws.com\"\n          },\n          \"bedrock-runtime-eu-central-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-central-2\"\n            },\n            \"hostname\" : \"bedrock-runtime.eu-central-2.amazonaws.com\"\n          },\n          \"bedrock-runtime-eu-north-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-north-1\"\n            },\n            \"hostname\" : \"bedrock-runtime.eu-north-1.amazonaws.com\"\n          },\n          \"bedrock-runtime-eu-south-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-south-1\"\n            },\n            \"hostname\" : \"bedrock-runtime.eu-south-1.amazonaws.com\"\n          },\n          \"bedrock-runtime-eu-south-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-south-2\"\n            },\n            \"hostname\" : \"bedrock-runtime.eu-south-2.amazonaws.com\"\n          },\n          \"bedrock-runtime-eu-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-west-1\"\n            },\n            \"hostname\" : \"bedrock-runtime.eu-west-1.amazonaws.com\"\n          },\n          \"bedrock-runtime-eu-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-west-2\"\n            },\n            \"hostname\" : \"bedrock-runtime.eu-west-2.amazonaws.com\"\n          },\n          \"bedrock-runtime-eu-west-3\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-west-3\"\n            },\n            \"hostname\" : \"bedrock-runtime.eu-west-3.amazonaws.com\"\n          },\n          \"bedrock-runtime-fips-ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"hostname\" : \"bedrock-runtime-fips.ca-central-1.amazonaws.com\"\n          },\n          \"bedrock-runtime-fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"hostname\" : \"bedrock-runtime-fips.us-east-1.amazonaws.com\"\n          },\n          \"bedrock-runtime-fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"hostname\" : \"bedrock-runtime-fips.us-east-2.amazonaws.com\"\n          },\n          \"bedrock-runtime-fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"hostname\" : \"bedrock-runtime-fips.us-west-2.amazonaws.com\"\n          },\n          \"bedrock-runtime-sa-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"sa-east-1\"\n            },\n            \"hostname\" : \"bedrock-runtime.sa-east-1.amazonaws.com\"\n          },\n          \"bedrock-runtime-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"hostname\" : \"bedrock-runtime.us-east-1.amazonaws.com\"\n          },\n          \"bedrock-runtime-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"hostname\" : \"bedrock-runtime.us-east-2.amazonaws.com\"\n          },\n          \"bedrock-runtime-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"hostname\" : \"bedrock-runtime.us-west-2.amazonaws.com\"\n          },\n          \"bedrock-sa-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"sa-east-1\"\n            },\n            \"hostname\" : \"bedrock.sa-east-1.amazonaws.com\"\n          },\n          \"bedrock-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"hostname\" : \"bedrock.us-east-1.amazonaws.com\"\n          },\n          \"bedrock-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"hostname\" : \"bedrock.us-east-2.amazonaws.com\"\n          },\n          \"bedrock-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"hostname\" : \"bedrock.us-west-2.amazonaws.com\"\n          },\n          \"ca-central-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-central-2\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"il-central-1\" : { },\n          \"me-central-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : { },\n          \"us-east-2\" : { },\n          \"us-west-1\" : { },\n          \"us-west-2\" : { }\n        }\n      },\n      \"billingconductor\" : {\n        \"endpoints\" : {\n          \"aws-global\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"hostname\" : \"billingconductor.us-east-1.amazonaws.com\"\n          }\n        },\n        \"isRegionalized\" : false,\n        \"partitionEndpoint\" : \"aws-global\"\n      },\n      \"braket\" : {\n        \"endpoints\" : {\n          \"eu-north-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"braket.eu-north-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"braket.eu-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"braket.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"braket.us-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"braket.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"budgets\" : {\n        \"endpoints\" : {\n          \"aws-global\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"hostname\" : \"budgets.amazonaws.com\"\n          }\n        },\n        \"isRegionalized\" : false,\n        \"partitionEndpoint\" : \"aws-global\"\n      },\n      \"cases\" : {\n        \"endpoints\" : {\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ca-central-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-west-2\" : { },\n          \"fips-us-east-1\" : {\n            \"deprecated\" : true\n          },\n          \"fips-us-west-2\" : {\n            \"deprecated\" : true\n          },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"cassandra\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-south-1\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ca-central-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-north-1\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"cassandra-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"cassandra-fips.us-west-2.amazonaws.com\"\n          },\n          \"me-south-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cassandra-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : { },\n          \"us-west-1\" : { },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cassandra-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"catalog.marketplace\" : {\n        \"endpoints\" : {\n          \"us-east-1\" : { }\n        }\n      },\n      \"ce\" : {\n        \"endpoints\" : {\n          \"aws-global\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"hostname\" : \"ce.us-east-1.amazonaws.com\"\n          }\n        },\n        \"isRegionalized\" : false,\n        \"partitionEndpoint\" : \"aws-global\"\n      },\n      \"chime\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"https\" ]\n        },\n        \"endpoints\" : {\n          \"aws-global\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"hostname\" : \"chime.us-east-1.amazonaws.com\",\n            \"protocols\" : [ \"https\" ]\n          }\n        },\n        \"isRegionalized\" : false,\n        \"partitionEndpoint\" : \"aws-global\"\n      },\n      \"cleanrooms\" : {\n        \"endpoints\" : {\n          \"ap-northeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cleanrooms.ap-northeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cleanrooms.ap-northeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cleanrooms.ap-southeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cleanrooms.ap-southeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cleanrooms.eu-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-north-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cleanrooms.eu-north-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cleanrooms.eu-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cleanrooms.eu-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"cleanrooms-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"cleanrooms-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"cleanrooms-fips.us-west-2.amazonaws.com\"\n          },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cleanrooms-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"cleanrooms-fips.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"cleanrooms.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cleanrooms-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"cleanrooms-fips.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"cleanrooms.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cleanrooms-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"cleanrooms-fips.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"cleanrooms.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"cloud9\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-east-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-2\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-3\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-2\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            }, {\n              \"hostname\" : \"cloud9-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"cloud9-fips.ca-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            } ]\n          },\n          \"eu-central-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-north-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-2\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-3\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"fips-ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"cloud9-fips.ca-central-1.amazonaws.com\"\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"cloud9-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"cloud9-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"cloud9-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"cloud9-fips.us-west-2.amazonaws.com\"\n          },\n          \"il-central-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"me-south-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"sa-east-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            }, {\n              \"hostname\" : \"cloud9-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"cloud9-fips.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            }, {\n              \"hostname\" : \"cloud9-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"cloud9-fips.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            }, {\n              \"hostname\" : \"cloud9-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"cloud9-fips.us-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            }, {\n              \"hostname\" : \"cloud9-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"cloud9-fips.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"cloudcontrolapi\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cloudcontrolapi.af-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cloudcontrolapi.ap-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cloudcontrolapi.ap-northeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cloudcontrolapi.ap-northeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cloudcontrolapi.ap-northeast-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cloudcontrolapi.ap-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cloudcontrolapi.ap-south-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cloudcontrolapi.ap-southeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cloudcontrolapi.ap-southeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cloudcontrolapi.ap-southeast-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-4\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cloudcontrolapi.ap-southeast-4.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-5\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cloudcontrolapi.ap-southeast-5.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-6\" : { },\n          \"ap-southeast-7\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cloudcontrolapi.ap-southeast-7.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cloudcontrolapi-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"cloudcontrolapi-fips.ca-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"cloudcontrolapi.ca-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ca-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cloudcontrolapi-fips.ca-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"cloudcontrolapi-fips.ca-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"cloudcontrolapi.ca-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cloudcontrolapi.eu-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-central-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cloudcontrolapi.eu-central-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-north-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cloudcontrolapi.eu-north-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cloudcontrolapi.eu-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cloudcontrolapi.eu-south-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cloudcontrolapi.eu-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cloudcontrolapi.eu-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cloudcontrolapi.eu-west-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"fips-ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"cloudcontrolapi-fips.ca-central-1.amazonaws.com\"\n          },\n          \"fips-ca-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"cloudcontrolapi-fips.ca-west-1.amazonaws.com\"\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"cloudcontrolapi-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"cloudcontrolapi-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"cloudcontrolapi-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"cloudcontrolapi-fips.us-west-2.amazonaws.com\"\n          },\n          \"il-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cloudcontrolapi.il-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"me-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cloudcontrolapi.me-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"me-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cloudcontrolapi.me-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"mx-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cloudcontrolapi.mx-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"sa-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cloudcontrolapi.sa-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cloudcontrolapi-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"cloudcontrolapi-fips.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"cloudcontrolapi.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cloudcontrolapi-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"cloudcontrolapi-fips.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"cloudcontrolapi.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cloudcontrolapi-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"cloudcontrolapi-fips.us-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"cloudcontrolapi.us-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cloudcontrolapi-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"cloudcontrolapi-fips.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"cloudcontrolapi.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"clouddirectory\" : {\n        \"endpoints\" : {\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ca-central-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"us-east-1\" : { },\n          \"us-east-2\" : { },\n          \"us-west-2\" : { }\n        }\n      },\n      \"cloudformation\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-south-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-3\" : { },\n          \"ap-southeast-4\" : { },\n          \"ap-southeast-5\" : { },\n          \"ap-southeast-6\" : { },\n          \"ap-southeast-7\" : { },\n          \"ca-central-1\" : { },\n          \"ca-west-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-central-2\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"il-central-1\" : { },\n          \"me-central-1\" : { },\n          \"me-south-1\" : { },\n          \"mx-central-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cloudformation-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"cloudformation-fips.us-east-1.amazonaws.com\"\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cloudformation-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"cloudformation-fips.us-east-2.amazonaws.com\"\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cloudformation-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"cloudformation-fips.us-west-1.amazonaws.com\"\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cloudformation-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"cloudformation-fips.us-west-2.amazonaws.com\"\n          }\n        }\n      },\n      \"cloudfront\" : {\n        \"endpoints\" : {\n          \"aws-global\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"hostname\" : \"cloudfront.amazonaws.com\",\n            \"protocols\" : [ \"http\", \"https\" ]\n          }\n        },\n        \"isRegionalized\" : false,\n        \"partitionEndpoint\" : \"aws-global\"\n      },\n      \"cloudhsm\" : {\n        \"endpoints\" : {\n          \"us-east-1\" : { }\n        }\n      },\n      \"cloudhsmv2\" : {\n        \"defaults\" : {\n          \"credentialScope\" : {\n            \"service\" : \"cloudhsm\"\n          }\n        },\n        \"endpoints\" : {\n          \"af-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cloudhsmv2.af-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cloudhsmv2.ap-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cloudhsmv2.ap-northeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cloudhsmv2.ap-northeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cloudhsmv2.ap-northeast-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cloudhsmv2.ap-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cloudhsmv2.ap-south-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cloudhsmv2.ap-southeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cloudhsmv2.ap-southeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cloudhsmv2.ap-southeast-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cloudhsmv2.ca-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cloudhsmv2.eu-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-central-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cloudhsmv2.eu-central-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-north-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cloudhsmv2.eu-north-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cloudhsmv2.eu-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cloudhsmv2.eu-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cloudhsmv2.eu-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cloudhsmv2.eu-west-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"il-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cloudhsmv2.il-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"me-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cloudhsmv2.me-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"me-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cloudhsmv2.me-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"sa-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cloudhsmv2.sa-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cloudhsmv2.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cloudhsmv2.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cloudhsmv2.us-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cloudhsmv2.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"cloudsearch\" : {\n        \"endpoints\" : {\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"eu-central-1\" : { },\n          \"eu-west-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : { },\n          \"us-west-1\" : { },\n          \"us-west-2\" : { }\n        }\n      },\n      \"cloudtrail\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-south-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-3\" : { },\n          \"ap-southeast-4\" : { },\n          \"ap-southeast-5\" : { },\n          \"ap-southeast-6\" : { },\n          \"ap-southeast-7\" : { },\n          \"ca-central-1\" : { },\n          \"ca-west-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-central-2\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"cloudtrail-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"cloudtrail-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"cloudtrail-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"cloudtrail-fips.us-west-2.amazonaws.com\"\n          },\n          \"il-central-1\" : { },\n          \"me-central-1\" : { },\n          \"me-south-1\" : { },\n          \"mx-central-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cloudtrail-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cloudtrail-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cloudtrail-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cloudtrail-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"cloudtrail-data\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-3\" : { },\n          \"ca-central-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"me-central-1\" : { },\n          \"me-south-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : { },\n          \"us-east-2\" : { },\n          \"us-west-1\" : { },\n          \"us-west-2\" : { }\n        }\n      },\n      \"codeartifact\" : {\n        \"endpoints\" : {\n          \"ap-northeast-1\" : { },\n          \"ap-south-1\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"eu-central-1\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"us-east-1\" : { },\n          \"us-east-2\" : { },\n          \"us-west-2\" : { }\n        }\n      },\n      \"codebuild\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-south-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-3\" : { },\n          \"ap-southeast-4\" : { },\n          \"ca-central-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-central-2\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"il-central-1\" : { },\n          \"me-central-1\" : { },\n          \"me-south-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"codebuild-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"codebuild-fips.us-east-1.amazonaws.com\"\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"codebuild-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"codebuild-fips.us-east-2.amazonaws.com\"\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"codebuild-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"codebuild-fips.us-west-1.amazonaws.com\"\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"codebuild-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"codebuild-fips.us-west-2.amazonaws.com\"\n          }\n        }\n      },\n      \"codecatalyst\" : {\n        \"endpoints\" : {\n          \"aws-global\" : {\n            \"hostname\" : \"codecatalyst.global.api.aws\"\n          }\n        },\n        \"isRegionalized\" : false,\n        \"partitionEndpoint\" : \"aws-global\"\n      },\n      \"codecommit\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-south-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-3\" : { },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"codecommit-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ca-central-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"codecommit-fips.ca-central-1.amazonaws.com\"\n          },\n          \"eu-central-1\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"codecommit-fips.ca-central-1.amazonaws.com\"\n          },\n          \"il-central-1\" : { },\n          \"me-central-1\" : { },\n          \"me-south-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"codecommit-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"codecommit-fips.us-east-1.amazonaws.com\"\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"codecommit-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"codecommit-fips.us-east-2.amazonaws.com\"\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"codecommit-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"codecommit-fips.us-west-1.amazonaws.com\"\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"codecommit-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"codecommit-fips.us-west-2.amazonaws.com\"\n          }\n        }\n      },\n      \"codedeploy\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-south-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-3\" : { },\n          \"ap-southeast-4\" : { },\n          \"ap-southeast-5\" : { },\n          \"ap-southeast-7\" : { },\n          \"ca-central-1\" : { },\n          \"ca-west-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-central-2\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"il-central-1\" : { },\n          \"me-central-1\" : { },\n          \"me-south-1\" : { },\n          \"mx-central-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"codedeploy-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"codedeploy-fips.us-east-1.amazonaws.com\"\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"codedeploy-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"codedeploy-fips.us-east-2.amazonaws.com\"\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"codedeploy-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"codedeploy-fips.us-west-1.amazonaws.com\"\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"codedeploy-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"codedeploy-fips.us-west-2.amazonaws.com\"\n          }\n        }\n      },\n      \"codeguru-profiler\" : {\n        \"endpoints\" : {\n          \"ap-northeast-1\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"eu-central-1\" : { },\n          \"eu-north-1\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"us-east-1\" : { },\n          \"us-east-2\" : { },\n          \"us-west-2\" : { }\n        }\n      },\n      \"codeguru-reviewer\" : {\n        \"endpoints\" : {\n          \"ap-northeast-1\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"eu-central-1\" : { },\n          \"eu-north-1\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"us-east-1\" : { },\n          \"us-east-2\" : { },\n          \"us-west-2\" : { }\n        }\n      },\n      \"codepipeline\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-south-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-3\" : { },\n          \"ap-southeast-4\" : { },\n          \"ap-southeast-5\" : { },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"codepipeline-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-central-1\" : { },\n          \"eu-central-2\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"fips-ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"codepipeline-fips.ca-central-1.amazonaws.com\"\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"codepipeline-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"codepipeline-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"codepipeline-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"codepipeline-fips.us-west-2.amazonaws.com\"\n          },\n          \"il-central-1\" : { },\n          \"me-central-1\" : { },\n          \"me-south-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"codepipeline-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"codepipeline-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"codepipeline-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"codepipeline-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"codestar-connections\" : {\n        \"endpoints\" : {\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-south-1\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ca-central-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : { },\n          \"us-east-2\" : { },\n          \"us-west-1\" : { },\n          \"us-west-2\" : { }\n        }\n      },\n      \"codestar-notifications\" : {\n        \"endpoints\" : {\n          \"ap-east-1\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-south-1\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ca-central-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-north-1\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"me-south-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : { },\n          \"us-east-2\" : { },\n          \"us-west-1\" : { },\n          \"us-west-2\" : { }\n        }\n      },\n      \"cognito-identity\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cognito-identity.af-south-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cognito-identity.ap-east-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cognito-identity.ap-northeast-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cognito-identity.ap-northeast-2.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cognito-identity.ap-northeast-3.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cognito-identity.ap-south-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cognito-identity.ap-south-2.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cognito-identity.ap-southeast-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cognito-identity.ap-southeast-2.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cognito-identity.ap-southeast-3.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-4\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cognito-identity.ap-southeast-4.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-5\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cognito-identity.ap-southeast-5.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-7\" : { },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cognito-identity.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ca-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cognito-identity.ca-west-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cognito-identity.eu-central-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-central-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cognito-identity.eu-central-2.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-north-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cognito-identity.eu-north-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cognito-identity.eu-south-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cognito-identity.eu-south-2.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cognito-identity.eu-west-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cognito-identity.eu-west-2.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cognito-identity.eu-west-3.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"cognito-identity-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"cognito-identity-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"cognito-identity-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"cognito-identity-fips.us-west-2.amazonaws.com\"\n          },\n          \"il-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cognito-identity.il-central-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"me-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cognito-identity.me-central-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"me-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cognito-identity.me-south-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"mx-central-1\" : { },\n          \"sa-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cognito-identity.sa-east-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cognito-identity-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"cognito-identity-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"cognito-identity.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cognito-identity-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"cognito-identity-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"cognito-identity.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cognito-identity-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"cognito-identity-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"cognito-identity.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cognito-identity-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"cognito-identity-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"cognito-identity.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"cognito-idp\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cognito-idp.af-south-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cognito-idp.ap-east-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cognito-idp.ap-northeast-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cognito-idp.ap-northeast-2.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cognito-idp.ap-northeast-3.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cognito-idp.ap-south-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cognito-idp.ap-south-2.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cognito-idp.ap-southeast-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cognito-idp.ap-southeast-2.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cognito-idp.ap-southeast-3.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-4\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cognito-idp.ap-southeast-4.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-5\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cognito-idp.ap-southeast-5.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-7\" : { },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cognito-idp.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ca-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cognito-idp.ca-west-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cognito-idp.eu-central-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-central-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cognito-idp.eu-central-2.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-north-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cognito-idp.eu-north-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cognito-idp.eu-south-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cognito-idp.eu-south-2.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cognito-idp.eu-west-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cognito-idp.eu-west-2.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cognito-idp.eu-west-3.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"cognito-idp-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"cognito-idp-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"cognito-idp-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"cognito-idp-fips.us-west-2.amazonaws.com\"\n          },\n          \"il-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cognito-idp.il-central-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"me-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cognito-idp.me-central-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"me-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cognito-idp.me-south-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"mx-central-1\" : { },\n          \"sa-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cognito-idp.sa-east-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cognito-idp-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"cognito-idp-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"cognito-idp.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cognito-idp-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"cognito-idp-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"cognito-idp.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cognito-idp-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"cognito-idp-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"cognito-idp.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cognito-idp-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"cognito-idp-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"cognito-idp.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"cognito-sync\" : {\n        \"endpoints\" : {\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-south-1\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"eu-central-1\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"us-east-1\" : { },\n          \"us-east-2\" : { },\n          \"us-west-2\" : { }\n        }\n      },\n      \"comprehend\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"https\" ]\n        },\n        \"endpoints\" : {\n          \"ap-northeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"comprehend.ap-northeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"comprehend.ap-northeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"comprehend.ap-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"comprehend.ap-southeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"comprehend.ap-southeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"comprehend-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"comprehend-fips.ca-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"comprehend.ca-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"comprehend.eu-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"comprehend.eu-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"comprehend.eu-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"fips-ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"comprehend-fips.ca-central-1.amazonaws.com\"\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"comprehend-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"comprehend-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"comprehend-fips.us-west-2.amazonaws.com\"\n          },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"comprehend-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"comprehend-fips.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"comprehend.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"comprehend-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"comprehend-fips.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"comprehend.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"comprehend-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"comprehend-fips.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"comprehend.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"comprehendmedical\" : {\n        \"endpoints\" : {\n          \"ap-southeast-2\" : { },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"comprehendmedical-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"fips-ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"comprehendmedical-fips.ca-central-1.amazonaws.com\"\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"comprehendmedical-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"comprehendmedical-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"comprehendmedical-fips.us-west-2.amazonaws.com\"\n          },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"comprehendmedical-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"comprehendmedical-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"comprehendmedical-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"compute-optimizer\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"af-south-1\"\n            },\n            \"hostname\" : \"compute-optimizer.af-south-1.amazonaws.com\"\n          },\n          \"ap-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-east-1\"\n            },\n            \"hostname\" : \"compute-optimizer.ap-east-1.amazonaws.com\"\n          },\n          \"ap-northeast-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-northeast-1\"\n            },\n            \"hostname\" : \"compute-optimizer.ap-northeast-1.amazonaws.com\"\n          },\n          \"ap-northeast-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-northeast-2\"\n            },\n            \"hostname\" : \"compute-optimizer.ap-northeast-2.amazonaws.com\"\n          },\n          \"ap-northeast-3\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-northeast-3\"\n            },\n            \"hostname\" : \"compute-optimizer.ap-northeast-3.amazonaws.com\"\n          },\n          \"ap-south-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-south-1\"\n            },\n            \"hostname\" : \"compute-optimizer.ap-south-1.amazonaws.com\"\n          },\n          \"ap-south-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-south-2\"\n            },\n            \"hostname\" : \"compute-optimizer.ap-south-2.amazonaws.com\"\n          },\n          \"ap-southeast-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-southeast-1\"\n            },\n            \"hostname\" : \"compute-optimizer.ap-southeast-1.amazonaws.com\"\n          },\n          \"ap-southeast-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-southeast-2\"\n            },\n            \"hostname\" : \"compute-optimizer.ap-southeast-2.amazonaws.com\"\n          },\n          \"ap-southeast-3\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-southeast-3\"\n            },\n            \"hostname\" : \"compute-optimizer.ap-southeast-3.amazonaws.com\"\n          },\n          \"ap-southeast-4\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-southeast-4\"\n            },\n            \"hostname\" : \"compute-optimizer.ap-southeast-4.amazonaws.com\"\n          },\n          \"ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"hostname\" : \"compute-optimizer.ca-central-1.amazonaws.com\"\n          },\n          \"eu-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-central-1\"\n            },\n            \"hostname\" : \"compute-optimizer.eu-central-1.amazonaws.com\"\n          },\n          \"eu-central-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-central-2\"\n            },\n            \"hostname\" : \"compute-optimizer.eu-central-2.amazonaws.com\"\n          },\n          \"eu-north-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-north-1\"\n            },\n            \"hostname\" : \"compute-optimizer.eu-north-1.amazonaws.com\"\n          },\n          \"eu-south-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-south-1\"\n            },\n            \"hostname\" : \"compute-optimizer.eu-south-1.amazonaws.com\"\n          },\n          \"eu-south-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-south-2\"\n            },\n            \"hostname\" : \"compute-optimizer.eu-south-2.amazonaws.com\"\n          },\n          \"eu-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-west-1\"\n            },\n            \"hostname\" : \"compute-optimizer.eu-west-1.amazonaws.com\"\n          },\n          \"eu-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-west-2\"\n            },\n            \"hostname\" : \"compute-optimizer.eu-west-2.amazonaws.com\"\n          },\n          \"eu-west-3\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-west-3\"\n            },\n            \"hostname\" : \"compute-optimizer.eu-west-3.amazonaws.com\"\n          },\n          \"il-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"il-central-1\"\n            },\n            \"hostname\" : \"compute-optimizer.il-central-1.amazonaws.com\"\n          },\n          \"me-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"me-central-1\"\n            },\n            \"hostname\" : \"compute-optimizer.me-central-1.amazonaws.com\"\n          },\n          \"me-south-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"me-south-1\"\n            },\n            \"hostname\" : \"compute-optimizer.me-south-1.amazonaws.com\"\n          },\n          \"sa-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"sa-east-1\"\n            },\n            \"hostname\" : \"compute-optimizer.sa-east-1.amazonaws.com\"\n          },\n          \"us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"hostname\" : \"compute-optimizer.us-east-1.amazonaws.com\"\n          },\n          \"us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"hostname\" : \"compute-optimizer.us-east-2.amazonaws.com\"\n          },\n          \"us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"hostname\" : \"compute-optimizer.us-west-1.amazonaws.com\"\n          },\n          \"us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"hostname\" : \"compute-optimizer.us-west-2.amazonaws.com\"\n          }\n        }\n      },\n      \"config\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-south-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-3\" : { },\n          \"ap-southeast-4\" : { },\n          \"ap-southeast-5\" : { },\n          \"ap-southeast-6\" : { },\n          \"ap-southeast-7\" : { },\n          \"ca-central-1\" : { },\n          \"ca-west-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-central-2\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"config-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"config-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"config-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"config-fips.us-west-2.amazonaws.com\"\n          },\n          \"il-central-1\" : { },\n          \"me-central-1\" : { },\n          \"me-south-1\" : { },\n          \"mx-central-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"config-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"config-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"config-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"config-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"connect\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"connect-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-central-1\" : { },\n          \"eu-west-2\" : { },\n          \"fips-ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"connect-fips.ca-central-1.amazonaws.com\"\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"connect-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"connect-fips.us-west-2.amazonaws.com\"\n          },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"connect-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"connect-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"connect-campaigns\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ca-central-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-west-2\" : { },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"connect-campaigns-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"connect-campaigns-fips.us-west-2.amazonaws.com\"\n          },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"connect-campaigns-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"connect-campaigns-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"contact-lens\" : {\n        \"endpoints\" : {\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-south-1\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ca-central-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-west-2\" : { },\n          \"us-east-1\" : { },\n          \"us-west-2\" : { }\n        }\n      },\n      \"controltower\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-south-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-3\" : { },\n          \"ap-southeast-4\" : { },\n          \"ap-southeast-5\" : { },\n          \"ap-southeast-7\" : { },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"controltower-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ca-central-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"controltower-fips.ca-central-1.amazonaws.com\"\n          },\n          \"ca-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"controltower-fips.ca-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ca-west-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"controltower-fips.ca-west-1.amazonaws.com\"\n          },\n          \"eu-central-1\" : { },\n          \"eu-central-2\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"il-central-1\" : { },\n          \"me-central-1\" : { },\n          \"me-south-1\" : { },\n          \"mx-central-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"controltower-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"controltower-fips.us-east-1.amazonaws.com\"\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"controltower-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"controltower-fips.us-east-2.amazonaws.com\"\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"controltower-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"controltower-fips.us-west-1.amazonaws.com\"\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"controltower-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"controltower-fips.us-west-2.amazonaws.com\"\n          }\n        }\n      },\n      \"cost-optimization-hub\" : {\n        \"endpoints\" : {\n          \"us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"hostname\" : \"cost-optimization-hub.us-east-1.amazonaws.com\"\n          }\n        }\n      },\n      \"cur\" : {\n        \"endpoints\" : {\n          \"us-east-1\" : { }\n        }\n      },\n      \"data-ats.iot\" : {\n        \"defaults\" : {\n          \"credentialScope\" : {\n            \"service\" : \"iotdata\"\n          },\n          \"protocols\" : [ \"https\" ]\n        },\n        \"endpoints\" : {\n          \"ap-east-1\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-south-1\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-5\" : { },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"data.iot-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-central-1\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"fips-ca-central-1\" : {\n            \"credentialScope\" : {\n              \"service\" : \"iotdata\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"data.iot-fips.ca-central-1.amazonaws.com\"\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"service\" : \"iotdata\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"data.iot-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"service\" : \"iotdata\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"data.iot-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"service\" : \"iotdata\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"data.iot-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"service\" : \"iotdata\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"data.iot-fips.us-west-2.amazonaws.com\"\n          },\n          \"me-central-1\" : { },\n          \"me-south-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"data.iot-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"data.iot-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"data.iot-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"data.iot-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"data.iot\" : {\n        \"defaults\" : {\n          \"credentialScope\" : {\n            \"service\" : \"iotdata\"\n          },\n          \"protocols\" : [ \"https\" ]\n        },\n        \"endpoints\" : {\n          \"ap-east-1\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-south-1\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"data.iot-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-central-1\" : { },\n          \"eu-north-1\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"fips-ca-central-1\" : {\n            \"credentialScope\" : {\n              \"service\" : \"iotdata\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"data.iot-fips.ca-central-1.amazonaws.com\"\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"service\" : \"iotdata\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"data.iot-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"service\" : \"iotdata\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"data.iot-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"service\" : \"iotdata\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"data.iot-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"service\" : \"iotdata\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"data.iot-fips.us-west-2.amazonaws.com\"\n          },\n          \"me-south-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"data.iot-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"data.iot-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"data.iot-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"data.iot-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"data.jobs.iot\" : {\n        \"endpoints\" : {\n          \"ap-east-1\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-south-1\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-5\" : { },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"data.jobs.iot-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-central-1\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"fips-ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"data.jobs.iot-fips.ca-central-1.amazonaws.com\"\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"data.jobs.iot-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"data.jobs.iot-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"data.jobs.iot-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"data.jobs.iot-fips.us-west-2.amazonaws.com\"\n          },\n          \"me-central-1\" : { },\n          \"me-south-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"data.jobs.iot-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"data.jobs.iot-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"data.jobs.iot-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"data.jobs.iot-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"data.mediastore\" : {\n        \"endpoints\" : {\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-southeast-2\" : { },\n          \"eu-central-1\" : { },\n          \"eu-north-1\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"us-east-1\" : { },\n          \"us-west-2\" : { }\n        }\n      },\n      \"databrew\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-south-1\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ca-central-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"databrew-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"databrew-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"databrew-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"databrew-fips.us-west-2.amazonaws.com\"\n          },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"databrew-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"databrew-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"databrew-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"databrew-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"dataexchange\" : {\n        \"endpoints\" : {\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"eu-central-1\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"us-east-1\" : { },\n          \"us-east-2\" : { },\n          \"us-west-1\" : { },\n          \"us-west-2\" : { }\n        }\n      },\n      \"datapipeline\" : {\n        \"endpoints\" : {\n          \"ap-northeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"eu-west-1\" : { },\n          \"us-east-1\" : { },\n          \"us-west-2\" : { }\n        }\n      },\n      \"datasync\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"datasync.af-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"datasync.ap-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"datasync.ap-northeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"datasync.ap-northeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"datasync.ap-northeast-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"datasync.ap-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"datasync.ap-south-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"datasync.ap-southeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"datasync.ap-southeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"datasync.ap-southeast-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-4\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"datasync.ap-southeast-4.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-5\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"datasync.ap-southeast-5.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-6\" : { },\n          \"ap-southeast-7\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"datasync.ap-southeast-7.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"datasync-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"datasync-fips.ca-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"datasync.ca-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ca-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"datasync-fips.ca-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"datasync-fips.ca-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"datasync.ca-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"datasync.eu-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-central-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"datasync.eu-central-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-north-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"datasync.eu-north-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"datasync.eu-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"datasync.eu-south-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"datasync.eu-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"datasync.eu-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"datasync.eu-west-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"fips-ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"datasync-fips.ca-central-1.amazonaws.com\"\n          },\n          \"fips-ca-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"datasync-fips.ca-west-1.amazonaws.com\"\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"datasync-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"datasync-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"datasync-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"datasync-fips.us-west-2.amazonaws.com\"\n          },\n          \"il-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"datasync.il-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"me-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"datasync.me-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"me-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"datasync.me-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"mx-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"datasync.mx-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"sa-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"datasync.sa-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"datasync-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"datasync-fips.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"datasync.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"datasync-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"datasync-fips.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"datasync.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"datasync-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"datasync-fips.us-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"datasync.us-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"datasync-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"datasync-fips.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"datasync.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"datazone\" : {\n        \"defaults\" : {\n          \"dnsSuffix\" : \"api.aws\",\n          \"variants\" : [ {\n            \"dnsSuffix\" : \"api.aws\",\n            \"hostname\" : \"{service}-fips.{region}.{dnsSuffix}\",\n            \"tags\" : [ \"fips\" ]\n          } ]\n        },\n        \"endpoints\" : {\n          \"ap-east-1\" : { },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : {\n            \"hostname\" : \"datazone.ap-northeast-1.api.aws\"\n          },\n          \"ap-northeast-2\" : {\n            \"hostname\" : \"datazone.ap-northeast-2.api.aws\"\n          },\n          \"ap-northeast-3\" : {\n            \"hostname\" : \"datazone.ap-northeast-3.api.aws\"\n          },\n          \"ap-south-1\" : {\n            \"hostname\" : \"datazone.ap-south-1.api.aws\"\n          },\n          \"ap-south-2\" : {\n            \"hostname\" : \"datazone.ap-south-2.api.aws\"\n          },\n          \"ap-southeast-1\" : {\n            \"hostname\" : \"datazone.ap-southeast-1.api.aws\"\n          },\n          \"ap-southeast-2\" : {\n            \"hostname\" : \"datazone.ap-southeast-2.api.aws\"\n          },\n          \"ap-southeast-3\" : {\n            \"hostname\" : \"datazone.ap-southeast-3.api.aws\"\n          },\n          \"ap-southeast-4\" : {\n            \"hostname\" : \"datazone.ap-southeast-4.api.aws\"\n          },\n          \"ap-southeast-5\" : {\n            \"hostname\" : \"datazone.ap-southeast-5.api.aws\"\n          },\n          \"ap-southeast-6\" : { },\n          \"ap-southeast-7\" : {\n            \"hostname\" : \"datazone.ap-southeast-7.api.aws\"\n          },\n          \"ca-central-1\" : {\n            \"hostname\" : \"datazone.ca-central-1.api.aws\",\n            \"variants\" : [ {\n              \"hostname\" : \"datazone-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ca-west-1\" : {\n            \"hostname\" : \"datazone.ca-west-1.api.aws\"\n          },\n          \"eu-central-1\" : {\n            \"hostname\" : \"datazone.eu-central-1.api.aws\"\n          },\n          \"eu-central-2\" : { },\n          \"eu-north-1\" : {\n            \"hostname\" : \"datazone.eu-north-1.api.aws\"\n          },\n          \"eu-south-1\" : {\n            \"hostname\" : \"datazone.eu-south-1.api.aws\"\n          },\n          \"eu-west-1\" : {\n            \"hostname\" : \"datazone.eu-west-1.api.aws\"\n          },\n          \"eu-west-2\" : {\n            \"hostname\" : \"datazone.eu-west-2.api.aws\"\n          },\n          \"eu-west-3\" : {\n            \"hostname\" : \"datazone.eu-west-3.api.aws\"\n          },\n          \"il-central-1\" : {\n            \"hostname\" : \"datazone.il-central-1.api.aws\"\n          },\n          \"me-central-1\" : {\n            \"hostname\" : \"datazone.me-central-1.api.aws\"\n          },\n          \"me-south-1\" : {\n            \"hostname\" : \"datazone.me-south-1.api.aws\"\n          },\n          \"mx-central-1\" : {\n            \"hostname\" : \"datazone.mx-central-1.api.aws\"\n          },\n          \"sa-east-1\" : {\n            \"hostname\" : \"datazone.sa-east-1.api.aws\"\n          },\n          \"us-east-1\" : {\n            \"hostname\" : \"datazone.us-east-1.api.aws\",\n            \"variants\" : [ {\n              \"hostname\" : \"datazone-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"hostname\" : \"datazone.us-east-2.api.aws\",\n            \"variants\" : [ {\n              \"hostname\" : \"datazone-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"hostname\" : \"datazone.us-west-1.api.aws\"\n          },\n          \"us-west-2\" : {\n            \"hostname\" : \"datazone.us-west-2.api.aws\",\n            \"variants\" : [ {\n              \"hostname\" : \"datazone-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"dax\" : {\n        \"endpoints\" : {\n          \"ap-northeast-1\" : { },\n          \"ap-south-1\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"eu-central-1\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : { },\n          \"us-east-2\" : { },\n          \"us-west-1\" : { },\n          \"us-west-2\" : { }\n        }\n      },\n      \"devicefarm\" : {\n        \"endpoints\" : {\n          \"us-west-2\" : { }\n        }\n      },\n      \"devops-guru\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"https\" ]\n        },\n        \"endpoints\" : {\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-south-1\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"devops-guru-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-central-1\" : { },\n          \"eu-north-1\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"fips-ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"devops-guru-fips.ca-central-1.amazonaws.com\"\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"devops-guru-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"devops-guru-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"devops-guru-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"devops-guru-fips.us-west-2.amazonaws.com\"\n          },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"devops-guru-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"devops-guru-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"devops-guru-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"devops-guru-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"directconnect\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-south-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-3\" : { },\n          \"ap-southeast-4\" : { },\n          \"ap-southeast-5\" : { },\n          \"ap-southeast-6\" : { },\n          \"ap-southeast-7\" : { },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"directconnect-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ca-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"directconnect-fips.ca-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-central-1\" : { },\n          \"eu-central-2\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"fips-ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"directconnect-fips.ca-central-1.amazonaws.com\"\n          },\n          \"fips-ca-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"directconnect-fips.ca-west-1.amazonaws.com\"\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"directconnect-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"directconnect-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"directconnect-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"directconnect-fips.us-west-2.amazonaws.com\"\n          },\n          \"il-central-1\" : { },\n          \"me-central-1\" : { },\n          \"me-south-1\" : { },\n          \"mx-central-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"directconnect-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"directconnect-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"directconnect-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"directconnect-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"discovery\" : {\n        \"endpoints\" : {\n          \"ap-northeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"eu-central-1\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"us-east-1\" : { },\n          \"us-west-2\" : { }\n        }\n      },\n      \"dlm\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"dlm.af-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"dlm.ap-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"dlm.ap-northeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"dlm.ap-northeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"dlm.ap-northeast-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"dlm.ap-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"dlm.ap-south-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"dlm.ap-southeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"dlm.ap-southeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"dlm.ap-southeast-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-4\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"dlm.ap-southeast-4.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-5\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"dlm.ap-southeast-5.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-6\" : { },\n          \"ap-southeast-7\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"dlm.ap-southeast-7.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"dlm-fips.ca-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"dlm.ca-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ca-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"dlm-fips.ca-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"dlm.ca-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"dlm.eu-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-central-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"dlm.eu-central-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-north-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"dlm.eu-north-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"dlm.eu-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"dlm.eu-south-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"dlm.eu-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"dlm.eu-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"dlm.eu-west-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"il-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"dlm.il-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"me-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"dlm.me-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"me-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"dlm.me-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"mx-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"dlm.mx-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"sa-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"dlm.sa-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"dlm-fips.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"dlm.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"dlm-fips.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"dlm.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"dlm-fips.us-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"dlm.us-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"dlm-fips.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"dlm.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"dms\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-south-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-3\" : { },\n          \"ap-southeast-4\" : { },\n          \"ap-southeast-5\" : { },\n          \"ap-southeast-6\" : { },\n          \"ap-southeast-7\" : { },\n          \"ca-central-1\" : { },\n          \"ca-west-1\" : { },\n          \"dms\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"variants\" : [ {\n              \"hostname\" : \"dms-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"dms-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"dms-fips.us-west-1.amazonaws.com\"\n          },\n          \"eu-central-1\" : { },\n          \"eu-central-2\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"il-central-1\" : { },\n          \"me-central-1\" : { },\n          \"me-south-1\" : { },\n          \"mx-central-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"dms-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"dms-fips.us-east-1.amazonaws.com\"\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"dms-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"dms-fips.us-east-2.amazonaws.com\"\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"dms-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"dms-fips.us-west-1.amazonaws.com\"\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"dms-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"dms-fips.us-west-2.amazonaws.com\"\n          }\n        }\n      },\n      \"docdb\" : {\n        \"endpoints\" : {\n          \"ap-northeast-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-northeast-1\"\n            },\n            \"hostname\" : \"rds.ap-northeast-1.amazonaws.com\"\n          },\n          \"ap-northeast-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-northeast-2\"\n            },\n            \"hostname\" : \"rds.ap-northeast-2.amazonaws.com\"\n          },\n          \"ap-south-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-south-1\"\n            },\n            \"hostname\" : \"rds.ap-south-1.amazonaws.com\"\n          },\n          \"ap-southeast-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-southeast-1\"\n            },\n            \"hostname\" : \"rds.ap-southeast-1.amazonaws.com\"\n          },\n          \"ap-southeast-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-southeast-2\"\n            },\n            \"hostname\" : \"rds.ap-southeast-2.amazonaws.com\"\n          },\n          \"ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"hostname\" : \"rds.ca-central-1.amazonaws.com\"\n          },\n          \"eu-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-central-1\"\n            },\n            \"hostname\" : \"rds.eu-central-1.amazonaws.com\"\n          },\n          \"eu-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-west-1\"\n            },\n            \"hostname\" : \"rds.eu-west-1.amazonaws.com\"\n          },\n          \"eu-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-west-2\"\n            },\n            \"hostname\" : \"rds.eu-west-2.amazonaws.com\"\n          },\n          \"eu-west-3\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-west-3\"\n            },\n            \"hostname\" : \"rds.eu-west-3.amazonaws.com\"\n          },\n          \"sa-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"sa-east-1\"\n            },\n            \"hostname\" : \"rds.sa-east-1.amazonaws.com\"\n          },\n          \"us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"hostname\" : \"rds.us-east-1.amazonaws.com\"\n          },\n          \"us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"hostname\" : \"rds.us-east-2.amazonaws.com\"\n          },\n          \"us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"hostname\" : \"rds.us-west-2.amazonaws.com\"\n          }\n        }\n      },\n      \"drs\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-south-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-3\" : { },\n          \"ap-southeast-4\" : { },\n          \"ca-central-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-central-2\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"drs-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"drs-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"drs-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"drs-fips.us-west-2.amazonaws.com\"\n          },\n          \"il-central-1\" : { },\n          \"me-central-1\" : { },\n          \"me-south-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"drs-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"drs-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"drs-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"drs-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"ds\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-south-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-3\" : { },\n          \"ap-southeast-4\" : { },\n          \"ap-southeast-5\" : { },\n          \"ap-southeast-7\" : { },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ds-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ca-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ds-fips.ca-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-central-1\" : { },\n          \"eu-central-2\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"fips-ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"ds-fips.ca-central-1.amazonaws.com\"\n          },\n          \"fips-ca-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"ds-fips.ca-west-1.amazonaws.com\"\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"ds-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"ds-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"ds-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"ds-fips.us-west-2.amazonaws.com\"\n          },\n          \"il-central-1\" : { },\n          \"me-central-1\" : { },\n          \"me-south-1\" : { },\n          \"mx-central-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ds-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ds-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ds-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ds-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"dynamodb\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"http\", \"https\" ]\n        },\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-south-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-3\" : { },\n          \"ap-southeast-4\" : { },\n          \"ap-southeast-5\" : { },\n          \"ap-southeast-6\" : { },\n          \"ap-southeast-7\" : { },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"dynamodb-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ca-central-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"dynamodb-fips.ca-central-1.amazonaws.com\"\n          },\n          \"ca-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"dynamodb-fips.ca-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ca-west-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"dynamodb-fips.ca-west-1.amazonaws.com\"\n          },\n          \"eu-central-1\" : { },\n          \"eu-central-2\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"il-central-1\" : { },\n          \"local\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"hostname\" : \"localhost:8000\",\n            \"protocols\" : [ \"http\" ]\n          },\n          \"me-central-1\" : { },\n          \"me-south-1\" : { },\n          \"mx-central-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"dynamodb-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"dynamodb-fips.us-east-1.amazonaws.com\"\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"dynamodb-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"dynamodb-fips.us-east-2.amazonaws.com\"\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"dynamodb-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"dynamodb-fips.us-west-1.amazonaws.com\"\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"dynamodb-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"dynamodb-fips.us-west-2.amazonaws.com\"\n          }\n        }\n      },\n      \"ebs\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-south-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-3\" : { },\n          \"ap-southeast-4\" : { },\n          \"ap-southeast-5\" : { },\n          \"ap-southeast-6\" : { },\n          \"ap-southeast-7\" : { },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ebs-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ca-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ebs-fips.ca-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-central-1\" : { },\n          \"eu-central-2\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"fips-ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"ebs-fips.ca-central-1.amazonaws.com\"\n          },\n          \"fips-ca-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"ebs-fips.ca-west-1.amazonaws.com\"\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"ebs-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"ebs-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"ebs-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"ebs-fips.us-west-2.amazonaws.com\"\n          },\n          \"il-central-1\" : { },\n          \"me-central-1\" : { },\n          \"me-south-1\" : { },\n          \"mx-central-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ebs-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ebs-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ebs-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ebs-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"ec2\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"http\", \"https\" ]\n        },\n        \"endpoints\" : {\n          \"af-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ec2.af-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ec2.ap-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ec2.ap-northeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ec2.ap-northeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ec2.ap-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-2\" : { },\n          \"ap-southeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ec2.ap-southeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ec2.ap-southeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-3\" : { },\n          \"ap-southeast-4\" : { },\n          \"ap-southeast-5\" : { },\n          \"ap-southeast-6\" : { },\n          \"ap-southeast-7\" : { },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ec2-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"ec2.ca-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ca-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ec2-fips.ca-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ec2.eu-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-central-2\" : { },\n          \"eu-north-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ec2.eu-north-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ec2.eu-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ec2.eu-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ec2.eu-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ec2.eu-west-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"fips-ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"ec2-fips.ca-central-1.amazonaws.com\"\n          },\n          \"fips-ca-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"ec2-fips.ca-west-1.amazonaws.com\"\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"ec2-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"ec2-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"ec2-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"ec2-fips.us-west-2.amazonaws.com\"\n          },\n          \"il-central-1\" : { },\n          \"me-central-1\" : { },\n          \"me-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ec2.me-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"mx-central-1\" : { },\n          \"sa-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ec2.sa-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ec2-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"ec2.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ec2-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"ec2.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ec2-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"ec2.us-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ec2-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"ec2.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"ecs\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-south-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-3\" : { },\n          \"ap-southeast-4\" : { },\n          \"ap-southeast-5\" : { },\n          \"ap-southeast-6\" : { },\n          \"ap-southeast-7\" : { },\n          \"ca-central-1\" : { },\n          \"ca-west-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-central-2\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"ecs-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"ecs-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"ecs-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"ecs-fips.us-west-2.amazonaws.com\"\n          },\n          \"il-central-1\" : { },\n          \"me-central-1\" : { },\n          \"me-south-1\" : { },\n          \"mx-central-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ecs-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ecs-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ecs-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ecs-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"edge.sagemaker\" : {\n        \"endpoints\" : {\n          \"ap-northeast-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-west-1\" : { },\n          \"us-east-1\" : { },\n          \"us-east-2\" : { },\n          \"us-west-2\" : { }\n        }\n      },\n      \"eks\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"http\", \"https\" ],\n          \"variants\" : [ {\n            \"hostname\" : \"fips.eks.{region}.{dnsSuffix}\",\n            \"tags\" : [ \"fips\" ]\n          } ]\n        },\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-south-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-3\" : { },\n          \"ap-southeast-4\" : { },\n          \"ap-southeast-5\" : { },\n          \"ap-southeast-6\" : { },\n          \"ap-southeast-7\" : { },\n          \"ca-central-1\" : { },\n          \"ca-west-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-central-2\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"fips.eks.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"fips.eks.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"fips.eks.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"fips.eks.us-west-2.amazonaws.com\"\n          },\n          \"il-central-1\" : { },\n          \"me-central-1\" : { },\n          \"me-south-1\" : { },\n          \"mx-central-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"fips.eks.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"fips.eks.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"fips.eks.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"fips.eks.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"eks-auth\" : {\n        \"defaults\" : {\n          \"dnsSuffix\" : \"api.aws\",\n          \"variants\" : [ {\n            \"dnsSuffix\" : \"api.aws\",\n            \"hostname\" : \"{service}-fips.{region}.{dnsSuffix}\",\n            \"tags\" : [ \"fips\" ]\n          } ]\n        },\n        \"endpoints\" : {\n          \"af-south-1\" : {\n            \"hostname\" : \"eks-auth.af-south-1.api.aws\"\n          },\n          \"ap-east-1\" : {\n            \"hostname\" : \"eks-auth.ap-east-1.api.aws\"\n          },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : {\n            \"hostname\" : \"eks-auth.ap-northeast-1.api.aws\"\n          },\n          \"ap-northeast-2\" : {\n            \"hostname\" : \"eks-auth.ap-northeast-2.api.aws\"\n          },\n          \"ap-northeast-3\" : {\n            \"hostname\" : \"eks-auth.ap-northeast-3.api.aws\"\n          },\n          \"ap-south-1\" : {\n            \"hostname\" : \"eks-auth.ap-south-1.api.aws\"\n          },\n          \"ap-south-2\" : {\n            \"hostname\" : \"eks-auth.ap-south-2.api.aws\"\n          },\n          \"ap-southeast-1\" : {\n            \"hostname\" : \"eks-auth.ap-southeast-1.api.aws\"\n          },\n          \"ap-southeast-2\" : {\n            \"hostname\" : \"eks-auth.ap-southeast-2.api.aws\"\n          },\n          \"ap-southeast-3\" : {\n            \"hostname\" : \"eks-auth.ap-southeast-3.api.aws\"\n          },\n          \"ap-southeast-4\" : {\n            \"hostname\" : \"eks-auth.ap-southeast-4.api.aws\"\n          },\n          \"ap-southeast-5\" : {\n            \"hostname\" : \"eks-auth.ap-southeast-5.api.aws\"\n          },\n          \"ap-southeast-6\" : { },\n          \"ap-southeast-7\" : {\n            \"hostname\" : \"eks-auth.ap-southeast-7.api.aws\"\n          },\n          \"ca-central-1\" : {\n            \"hostname\" : \"eks-auth.ca-central-1.api.aws\"\n          },\n          \"ca-west-1\" : {\n            \"hostname\" : \"eks-auth.ca-west-1.api.aws\"\n          },\n          \"eu-central-1\" : {\n            \"hostname\" : \"eks-auth.eu-central-1.api.aws\"\n          },\n          \"eu-central-2\" : {\n            \"hostname\" : \"eks-auth.eu-central-2.api.aws\"\n          },\n          \"eu-north-1\" : {\n            \"hostname\" : \"eks-auth.eu-north-1.api.aws\"\n          },\n          \"eu-south-1\" : {\n            \"hostname\" : \"eks-auth.eu-south-1.api.aws\"\n          },\n          \"eu-south-2\" : {\n            \"hostname\" : \"eks-auth.eu-south-2.api.aws\"\n          },\n          \"eu-west-1\" : {\n            \"hostname\" : \"eks-auth.eu-west-1.api.aws\"\n          },\n          \"eu-west-2\" : {\n            \"hostname\" : \"eks-auth.eu-west-2.api.aws\"\n          },\n          \"eu-west-3\" : {\n            \"hostname\" : \"eks-auth.eu-west-3.api.aws\"\n          },\n          \"il-central-1\" : {\n            \"hostname\" : \"eks-auth.il-central-1.api.aws\"\n          },\n          \"me-central-1\" : {\n            \"hostname\" : \"eks-auth.me-central-1.api.aws\"\n          },\n          \"me-south-1\" : {\n            \"hostname\" : \"eks-auth.me-south-1.api.aws\"\n          },\n          \"mx-central-1\" : {\n            \"hostname\" : \"eks-auth.mx-central-1.api.aws\"\n          },\n          \"sa-east-1\" : {\n            \"hostname\" : \"eks-auth.sa-east-1.api.aws\"\n          },\n          \"us-east-1\" : {\n            \"hostname\" : \"eks-auth.us-east-1.api.aws\"\n          },\n          \"us-east-2\" : {\n            \"hostname\" : \"eks-auth.us-east-2.api.aws\"\n          },\n          \"us-west-1\" : {\n            \"hostname\" : \"eks-auth.us-west-1.api.aws\"\n          },\n          \"us-west-2\" : {\n            \"hostname\" : \"eks-auth.us-west-2.api.aws\"\n          }\n        }\n      },\n      \"elasticache\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-south-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-3\" : { },\n          \"ap-southeast-4\" : { },\n          \"ap-southeast-5\" : { },\n          \"ap-southeast-6\" : { },\n          \"ap-southeast-7\" : { },\n          \"ca-central-1\" : { },\n          \"ca-west-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-central-2\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"elasticache-fips.us-west-1.amazonaws.com\"\n          },\n          \"il-central-1\" : { },\n          \"me-central-1\" : { },\n          \"me-south-1\" : { },\n          \"mx-central-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticache-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"elasticache-fips.us-east-1.amazonaws.com\"\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticache-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"elasticache-fips.us-east-2.amazonaws.com\"\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticache-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"elasticache-fips.us-west-1.amazonaws.com\"\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticache-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"elasticache-fips.us-west-2.amazonaws.com\"\n          }\n        }\n      },\n      \"elasticbeanstalk\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticbeanstalk.af-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticbeanstalk.ap-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticbeanstalk.ap-northeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticbeanstalk.ap-northeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticbeanstalk.ap-northeast-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticbeanstalk.ap-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticbeanstalk.ap-southeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticbeanstalk.ap-southeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticbeanstalk.ap-southeast-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-5\" : { },\n          \"ap-southeast-7\" : { },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticbeanstalk.ca-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticbeanstalk.eu-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-north-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticbeanstalk.eu-north-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticbeanstalk.eu-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticbeanstalk.eu-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticbeanstalk.eu-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticbeanstalk.eu-west-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"elasticbeanstalk-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"elasticbeanstalk-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"elasticbeanstalk-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"elasticbeanstalk-fips.us-west-2.amazonaws.com\"\n          },\n          \"il-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticbeanstalk.il-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"me-central-1\" : { },\n          \"me-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticbeanstalk.me-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"sa-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticbeanstalk.sa-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticbeanstalk-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"elasticbeanstalk-fips.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"elasticbeanstalk.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticbeanstalk-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"elasticbeanstalk-fips.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"elasticbeanstalk.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticbeanstalk-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"elasticbeanstalk-fips.us-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"elasticbeanstalk.us-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticbeanstalk-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"elasticbeanstalk-fips.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"elasticbeanstalk.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"elasticfilesystem\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticfilesystem-fips.af-south-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ap-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticfilesystem-fips.ap-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticfilesystem-fips.ap-northeast-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ap-northeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticfilesystem-fips.ap-northeast-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ap-northeast-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticfilesystem-fips.ap-northeast-3.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ap-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticfilesystem-fips.ap-south-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ap-south-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticfilesystem-fips.ap-south-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ap-southeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticfilesystem-fips.ap-southeast-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ap-southeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticfilesystem-fips.ap-southeast-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ap-southeast-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticfilesystem-fips.ap-southeast-3.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ap-southeast-4\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticfilesystem-fips.ap-southeast-4.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ap-southeast-5\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticfilesystem-fips.ap-southeast-5.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ap-southeast-6\" : { },\n          \"ap-southeast-7\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticfilesystem-fips.ap-southeast-7.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticfilesystem-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ca-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticfilesystem-fips.ca-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticfilesystem-fips.eu-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-central-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticfilesystem-fips.eu-central-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-north-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticfilesystem-fips.eu-north-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticfilesystem-fips.eu-south-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-south-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticfilesystem-fips.eu-south-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticfilesystem-fips.eu-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticfilesystem-fips.eu-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-west-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticfilesystem-fips.eu-west-3.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"fips-af-south-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"af-south-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"elasticfilesystem-fips.af-south-1.amazonaws.com\"\n          },\n          \"fips-ap-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"elasticfilesystem-fips.ap-east-1.amazonaws.com\"\n          },\n          \"fips-ap-northeast-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-northeast-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"elasticfilesystem-fips.ap-northeast-1.amazonaws.com\"\n          },\n          \"fips-ap-northeast-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-northeast-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"elasticfilesystem-fips.ap-northeast-2.amazonaws.com\"\n          },\n          \"fips-ap-northeast-3\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-northeast-3\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"elasticfilesystem-fips.ap-northeast-3.amazonaws.com\"\n          },\n          \"fips-ap-south-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-south-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"elasticfilesystem-fips.ap-south-1.amazonaws.com\"\n          },\n          \"fips-ap-south-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-south-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"elasticfilesystem-fips.ap-south-2.amazonaws.com\"\n          },\n          \"fips-ap-southeast-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-southeast-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"elasticfilesystem-fips.ap-southeast-1.amazonaws.com\"\n          },\n          \"fips-ap-southeast-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-southeast-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"elasticfilesystem-fips.ap-southeast-2.amazonaws.com\"\n          },\n          \"fips-ap-southeast-3\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-southeast-3\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"elasticfilesystem-fips.ap-southeast-3.amazonaws.com\"\n          },\n          \"fips-ap-southeast-4\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-southeast-4\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"elasticfilesystem-fips.ap-southeast-4.amazonaws.com\"\n          },\n          \"fips-ap-southeast-5\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-southeast-5\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"elasticfilesystem-fips.ap-southeast-5.amazonaws.com\"\n          },\n          \"fips-ap-southeast-7\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-southeast-7\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"elasticfilesystem-fips.ap-southeast-7.amazonaws.com\"\n          },\n          \"fips-ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"elasticfilesystem-fips.ca-central-1.amazonaws.com\"\n          },\n          \"fips-ca-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"elasticfilesystem-fips.ca-west-1.amazonaws.com\"\n          },\n          \"fips-eu-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"elasticfilesystem-fips.eu-central-1.amazonaws.com\"\n          },\n          \"fips-eu-central-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-central-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"elasticfilesystem-fips.eu-central-2.amazonaws.com\"\n          },\n          \"fips-eu-north-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-north-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"elasticfilesystem-fips.eu-north-1.amazonaws.com\"\n          },\n          \"fips-eu-south-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-south-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"elasticfilesystem-fips.eu-south-1.amazonaws.com\"\n          },\n          \"fips-eu-south-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-south-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"elasticfilesystem-fips.eu-south-2.amazonaws.com\"\n          },\n          \"fips-eu-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"elasticfilesystem-fips.eu-west-1.amazonaws.com\"\n          },\n          \"fips-eu-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"elasticfilesystem-fips.eu-west-2.amazonaws.com\"\n          },\n          \"fips-eu-west-3\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-west-3\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"elasticfilesystem-fips.eu-west-3.amazonaws.com\"\n          },\n          \"fips-il-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"il-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"elasticfilesystem-fips.il-central-1.amazonaws.com\"\n          },\n          \"fips-me-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"me-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"elasticfilesystem-fips.me-central-1.amazonaws.com\"\n          },\n          \"fips-me-south-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"me-south-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"elasticfilesystem-fips.me-south-1.amazonaws.com\"\n          },\n          \"fips-mx-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"mx-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"elasticfilesystem-fips.mx-central-1.amazonaws.com\"\n          },\n          \"fips-sa-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"sa-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"elasticfilesystem-fips.sa-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"elasticfilesystem-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"elasticfilesystem-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"elasticfilesystem-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"elasticfilesystem-fips.us-west-2.amazonaws.com\"\n          },\n          \"il-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticfilesystem-fips.il-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"me-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticfilesystem-fips.me-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"me-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticfilesystem-fips.me-south-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"mx-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticfilesystem-fips.mx-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"sa-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticfilesystem-fips.sa-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticfilesystem-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticfilesystem-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticfilesystem-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticfilesystem-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"elasticloadbalancing\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"https\" ]\n        },\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-south-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-3\" : { },\n          \"ap-southeast-4\" : { },\n          \"ap-southeast-5\" : { },\n          \"ap-southeast-6\" : { },\n          \"ap-southeast-7\" : { },\n          \"ca-central-1\" : { },\n          \"ca-west-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-central-2\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"elasticloadbalancing-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"elasticloadbalancing-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"elasticloadbalancing-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"elasticloadbalancing-fips.us-west-2.amazonaws.com\"\n          },\n          \"il-central-1\" : { },\n          \"me-central-1\" : { },\n          \"me-south-1\" : { },\n          \"mx-central-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticloadbalancing-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticloadbalancing-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticloadbalancing-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticloadbalancing-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"elasticmapreduce\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"https\" ],\n          \"sslCommonName\" : \"{region}.{service}.{dnsSuffix}\"\n        },\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-south-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-3\" : { },\n          \"ap-southeast-4\" : { },\n          \"ap-southeast-5\" : { },\n          \"ap-southeast-6\" : { },\n          \"ap-southeast-7\" : { },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticmapreduce-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ca-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticmapreduce-fips.ca-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-central-1\" : {\n            \"sslCommonName\" : \"{service}.{region}.{dnsSuffix}\"\n          },\n          \"eu-central-2\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"fips-ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"elasticmapreduce-fips.ca-central-1.amazonaws.com\"\n          },\n          \"fips-ca-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"elasticmapreduce-fips.ca-west-1.amazonaws.com\"\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"elasticmapreduce-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"elasticmapreduce-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"elasticmapreduce-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"elasticmapreduce-fips.us-west-2.amazonaws.com\"\n          },\n          \"il-central-1\" : { },\n          \"me-central-1\" : { },\n          \"me-south-1\" : { },\n          \"mx-central-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : {\n            \"sslCommonName\" : \"{service}.{region}.{dnsSuffix}\",\n            \"variants\" : [ {\n              \"hostname\" : \"elasticmapreduce-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticmapreduce-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"elasticmapreduce.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticmapreduce-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticmapreduce-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"elastictranscoder\" : {\n        \"endpoints\" : {\n          \"ap-northeast-1\" : { },\n          \"ap-south-1\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"eu-west-1\" : { },\n          \"us-east-1\" : { },\n          \"us-west-1\" : { },\n          \"us-west-2\" : { }\n        }\n      },\n      \"email\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-south-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-3\" : { },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"email-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-central-1\" : { },\n          \"eu-central-2\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"fips-ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"email-fips.ca-central-1.amazonaws.com\"\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"email-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"email-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"email-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"email-fips.us-west-2.amazonaws.com\"\n          },\n          \"il-central-1\" : { },\n          \"me-central-1\" : { },\n          \"me-south-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"email-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"email-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"email-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"email-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"emr-containers\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-south-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-3\" : { },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"emr-containers-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-central-1\" : { },\n          \"eu-central-2\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"fips-ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"emr-containers-fips.ca-central-1.amazonaws.com\"\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"emr-containers-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"emr-containers-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"emr-containers-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"emr-containers-fips.us-west-2.amazonaws.com\"\n          },\n          \"il-central-1\" : { },\n          \"me-central-1\" : { },\n          \"me-south-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"emr-containers-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"emr-containers-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"emr-containers-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"emr-containers-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"emr-serverless\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-3\" : { },\n          \"ap-southeast-4\" : { },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"emr-serverless-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ca-west-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-central-2\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"fips-ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"emr-serverless-fips.ca-central-1.amazonaws.com\"\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"emr-serverless-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"emr-serverless-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"emr-serverless-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"emr-serverless-fips.us-west-2.amazonaws.com\"\n          },\n          \"il-central-1\" : { },\n          \"me-central-1\" : { },\n          \"me-south-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"emr-serverless-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"emr-serverless-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"emr-serverless-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"emr-serverless-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"entitlement.marketplace\" : {\n        \"defaults\" : {\n          \"credentialScope\" : {\n            \"service\" : \"aws-marketplace\"\n          }\n        },\n        \"endpoints\" : {\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"entitlement-marketplace.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"es\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"aos.af-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"aos.ap-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"aos.ap-northeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"aos.ap-northeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"aos.ap-northeast-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"aos.ap-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"aos.ap-south-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"aos.ap-southeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"aos.ap-southeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"aos.ap-southeast-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-4\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"aos.ap-southeast-4.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-5\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"aos.ap-southeast-5.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-6\" : { },\n          \"ap-southeast-7\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"aos.ap-southeast-7.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"aos.ca-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ca-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"aos.ca-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"aos.eu-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-central-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"aos.eu-central-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-north-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"aos.eu-north-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"aos.eu-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"aos.eu-south-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"aos.eu-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"aos.eu-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"aos.eu-west-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"es-fips.us-west-1.amazonaws.com\"\n          },\n          \"il-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"aos.il-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"me-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"aos.me-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"me-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"aos.me-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"mx-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"aos.mx-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"sa-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"aos.sa-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"aos.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            }, {\n              \"hostname\" : \"es-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"es-fips.us-east-1.amazonaws.com\"\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"aos.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            }, {\n              \"hostname\" : \"es-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"es-fips.us-east-2.amazonaws.com\"\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"aos.us-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            }, {\n              \"hostname\" : \"es-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"es-fips.us-west-1.amazonaws.com\"\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"aos.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            }, {\n              \"hostname\" : \"es-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"es-fips.us-west-2.amazonaws.com\"\n          }\n        }\n      },\n      \"events\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"events.af-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"events.ap-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"events.ap-northeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"events.ap-northeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"events.ap-northeast-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"events.ap-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"events.ap-south-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"events.ap-southeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"events.ap-southeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"events.ap-southeast-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-4\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"events.ap-southeast-4.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-5\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"events.ap-southeast-5.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-6\" : { },\n          \"ap-southeast-7\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"events.ap-southeast-7.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"events.ca-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ca-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"events.ca-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"events.eu-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-central-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"events.eu-central-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-north-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"events.eu-north-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"events.eu-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"events.eu-south-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"events.eu-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"events.eu-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"events.eu-west-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"events-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"events-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"events-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"events-fips.us-west-2.amazonaws.com\"\n          },\n          \"il-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"events.il-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"me-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"events.me-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"me-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"events.me-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"mx-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"events.mx-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"sa-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"events.sa-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"events-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"events-fips.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"events.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"events-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"events-fips.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"events.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"events-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"events-fips.us-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"events.us-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"events-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"events-fips.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"events.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"evidently\" : {\n        \"endpoints\" : {\n          \"ap-northeast-1\" : {\n            \"hostname\" : \"evidently.ap-northeast-1.amazonaws.com\"\n          },\n          \"ap-southeast-1\" : {\n            \"hostname\" : \"evidently.ap-southeast-1.amazonaws.com\"\n          },\n          \"ap-southeast-2\" : {\n            \"hostname\" : \"evidently.ap-southeast-2.amazonaws.com\"\n          },\n          \"eu-central-1\" : {\n            \"hostname\" : \"evidently.eu-central-1.amazonaws.com\"\n          },\n          \"eu-north-1\" : {\n            \"hostname\" : \"evidently.eu-north-1.amazonaws.com\"\n          },\n          \"eu-west-1\" : {\n            \"hostname\" : \"evidently.eu-west-1.amazonaws.com\"\n          },\n          \"us-east-1\" : {\n            \"hostname\" : \"evidently.us-east-1.amazonaws.com\"\n          },\n          \"us-east-2\" : {\n            \"hostname\" : \"evidently.us-east-2.amazonaws.com\"\n          },\n          \"us-west-2\" : {\n            \"hostname\" : \"evidently.us-west-2.amazonaws.com\"\n          }\n        }\n      },\n      \"finspace\" : {\n        \"endpoints\" : {\n          \"ap-northeast-1\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ca-central-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"us-east-1\" : { },\n          \"us-east-2\" : { },\n          \"us-west-2\" : { }\n        }\n      },\n      \"finspace-api\" : {\n        \"endpoints\" : {\n          \"ca-central-1\" : { },\n          \"eu-west-1\" : { },\n          \"us-east-1\" : { },\n          \"us-east-2\" : { },\n          \"us-west-2\" : { }\n        }\n      },\n      \"firehose\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"firehose.af-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"firehose.ap-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"firehose.ap-northeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"firehose.ap-northeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"firehose.ap-northeast-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"firehose.ap-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"firehose.ap-south-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"firehose.ap-southeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"firehose.ap-southeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"firehose.ap-southeast-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-4\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"firehose.ap-southeast-4.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-5\" : { },\n          \"ap-southeast-6\" : { },\n          \"ap-southeast-7\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"firehose.ap-southeast-7.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"firehose.ca-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ca-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"firehose.ca-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"firehose.eu-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-central-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"firehose.eu-central-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-north-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"firehose.eu-north-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"firehose.eu-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"firehose.eu-south-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"firehose.eu-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"firehose.eu-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"firehose.eu-west-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"firehose-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"firehose-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"firehose-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"firehose-fips.us-west-2.amazonaws.com\"\n          },\n          \"il-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"firehose.il-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"me-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"firehose.me-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"me-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"firehose.me-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"mx-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"firehose.mx-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"sa-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"firehose.sa-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"firehose-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"firehose-fips.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"firehose.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"firehose-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"firehose-fips.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"firehose.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"firehose-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"firehose-fips.us-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"firehose.us-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"firehose-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"firehose-fips.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"firehose.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"fms\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"https\" ]\n        },\n        \"endpoints\" : {\n          \"af-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"fms-fips.af-south-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ap-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"fms-fips.ap-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"fms-fips.ap-northeast-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ap-northeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"fms-fips.ap-northeast-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"fms-fips.ap-south-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ap-south-2\" : { },\n          \"ap-southeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"fms-fips.ap-southeast-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ap-southeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"fms-fips.ap-southeast-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ap-southeast-3\" : { },\n          \"ap-southeast-4\" : { },\n          \"ap-southeast-5\" : { },\n          \"ap-southeast-7\" : { },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"fms-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ca-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"fms-fips.ca-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"fms-fips.eu-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-central-2\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"fms-fips.eu-south-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"fms-fips.eu-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"fms-fips.eu-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-west-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"fms-fips.eu-west-3.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"fips-af-south-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"af-south-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"fms-fips.af-south-1.amazonaws.com\"\n          },\n          \"fips-ap-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"fms-fips.ap-east-1.amazonaws.com\"\n          },\n          \"fips-ap-northeast-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-northeast-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"fms-fips.ap-northeast-1.amazonaws.com\"\n          },\n          \"fips-ap-northeast-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-northeast-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"fms-fips.ap-northeast-2.amazonaws.com\"\n          },\n          \"fips-ap-south-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-south-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"fms-fips.ap-south-1.amazonaws.com\"\n          },\n          \"fips-ap-southeast-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-southeast-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"fms-fips.ap-southeast-1.amazonaws.com\"\n          },\n          \"fips-ap-southeast-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-southeast-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"fms-fips.ap-southeast-2.amazonaws.com\"\n          },\n          \"fips-ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"fms-fips.ca-central-1.amazonaws.com\"\n          },\n          \"fips-ca-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"fms-fips.ca-west-1.amazonaws.com\"\n          },\n          \"fips-eu-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"fms-fips.eu-central-1.amazonaws.com\"\n          },\n          \"fips-eu-south-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-south-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"fms-fips.eu-south-1.amazonaws.com\"\n          },\n          \"fips-eu-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"fms-fips.eu-west-1.amazonaws.com\"\n          },\n          \"fips-eu-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"fms-fips.eu-west-2.amazonaws.com\"\n          },\n          \"fips-eu-west-3\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-west-3\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"fms-fips.eu-west-3.amazonaws.com\"\n          },\n          \"fips-me-south-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"me-south-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"fms-fips.me-south-1.amazonaws.com\"\n          },\n          \"fips-sa-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"sa-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"fms-fips.sa-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"fms-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"fms-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"fms-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"fms-fips.us-west-2.amazonaws.com\"\n          },\n          \"il-central-1\" : { },\n          \"me-central-1\" : { },\n          \"me-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"fms-fips.me-south-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"mx-central-1\" : { },\n          \"sa-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"fms-fips.sa-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"fms-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"fms-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"fms-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"fms-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"forecast\" : {\n        \"endpoints\" : {\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-south-1\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"eu-central-1\" : { },\n          \"eu-west-1\" : { },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"forecast-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"forecast-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"forecast-fips.us-west-2.amazonaws.com\"\n          },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"forecast-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"forecast-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"forecast-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"forecastquery\" : {\n        \"endpoints\" : {\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-south-1\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"eu-central-1\" : { },\n          \"eu-west-1\" : { },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"forecastquery-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"forecastquery-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"forecastquery-fips.us-west-2.amazonaws.com\"\n          },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"forecastquery-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"forecastquery-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"forecastquery-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"frauddetector\" : {\n        \"endpoints\" : {\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"eu-west-1\" : { },\n          \"us-east-1\" : { },\n          \"us-east-2\" : { },\n          \"us-west-2\" : { }\n        }\n      },\n      \"fsx\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-south-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-3\" : { },\n          \"ap-southeast-4\" : { },\n          \"ap-southeast-5\" : { },\n          \"ap-southeast-7\" : { },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"fsx-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ca-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"fsx-fips.ca-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-central-1\" : { },\n          \"eu-central-2\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"fips-ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"fsx-fips.ca-central-1.amazonaws.com\"\n          },\n          \"fips-ca-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"fsx-fips.ca-west-1.amazonaws.com\"\n          },\n          \"fips-prod-ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"fsx-fips.ca-central-1.amazonaws.com\"\n          },\n          \"fips-prod-ca-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"fsx-fips.ca-west-1.amazonaws.com\"\n          },\n          \"fips-prod-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"fsx-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-prod-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"fsx-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-prod-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"fsx-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-prod-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"fsx-fips.us-west-2.amazonaws.com\"\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"fsx-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"fsx-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"fsx-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"fsx-fips.us-west-2.amazonaws.com\"\n          },\n          \"il-central-1\" : { },\n          \"me-central-1\" : { },\n          \"me-south-1\" : { },\n          \"mx-central-1\" : { },\n          \"prod-ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"variants\" : [ {\n              \"hostname\" : \"fsx-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"prod-ca-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-west-1\"\n            },\n            \"deprecated\" : true,\n            \"variants\" : [ {\n              \"hostname\" : \"fsx-fips.ca-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"prod-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"variants\" : [ {\n              \"hostname\" : \"fsx-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"prod-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"variants\" : [ {\n              \"hostname\" : \"fsx-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"prod-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"variants\" : [ {\n              \"hostname\" : \"fsx-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"prod-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"variants\" : [ {\n              \"hostname\" : \"fsx-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"fsx-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"fsx-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"fsx-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"fsx-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"gamelift\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-5\" : { },\n          \"ap-southeast-7\" : { },\n          \"ca-central-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"me-south-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : { },\n          \"us-east-2\" : { },\n          \"us-west-1\" : { },\n          \"us-west-2\" : { }\n        }\n      },\n      \"gameliftstreams\" : {\n        \"defaults\" : {\n          \"dnsSuffix\" : \"api.aws\",\n          \"variants\" : [ {\n            \"dnsSuffix\" : \"api.aws\",\n            \"hostname\" : \"{service}-fips.{region}.{dnsSuffix}\",\n            \"tags\" : [ \"fips\" ]\n          } ]\n        },\n        \"endpoints\" : {\n          \"af-south-1\" : {\n            \"hostname\" : \"gameliftstreams.af-south-1.api.aws\"\n          },\n          \"ap-east-1\" : {\n            \"hostname\" : \"gameliftstreams.ap-east-1.api.aws\"\n          },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : {\n            \"hostname\" : \"gameliftstreams.ap-northeast-1.api.aws\"\n          },\n          \"ap-northeast-2\" : {\n            \"hostname\" : \"gameliftstreams.ap-northeast-2.api.aws\"\n          },\n          \"ap-northeast-3\" : {\n            \"hostname\" : \"gameliftstreams.ap-northeast-3.api.aws\"\n          },\n          \"ap-south-1\" : {\n            \"hostname\" : \"gameliftstreams.ap-south-1.api.aws\"\n          },\n          \"ap-south-2\" : {\n            \"hostname\" : \"gameliftstreams.ap-south-2.api.aws\"\n          },\n          \"ap-southeast-1\" : {\n            \"hostname\" : \"gameliftstreams.ap-southeast-1.api.aws\"\n          },\n          \"ap-southeast-2\" : {\n            \"hostname\" : \"gameliftstreams.ap-southeast-2.api.aws\"\n          },\n          \"ap-southeast-3\" : {\n            \"hostname\" : \"gameliftstreams.ap-southeast-3.api.aws\"\n          },\n          \"ap-southeast-4\" : {\n            \"hostname\" : \"gameliftstreams.ap-southeast-4.api.aws\"\n          },\n          \"ap-southeast-5\" : {\n            \"hostname\" : \"gameliftstreams.ap-southeast-5.api.aws\"\n          },\n          \"ap-southeast-6\" : { },\n          \"ap-southeast-7\" : {\n            \"hostname\" : \"gameliftstreams.ap-southeast-7.api.aws\"\n          },\n          \"ca-central-1\" : {\n            \"hostname\" : \"gameliftstreams.ca-central-1.api.aws\"\n          },\n          \"ca-west-1\" : {\n            \"hostname\" : \"gameliftstreams.ca-west-1.api.aws\"\n          },\n          \"eu-central-1\" : {\n            \"hostname\" : \"gameliftstreams.eu-central-1.api.aws\"\n          },\n          \"eu-central-2\" : {\n            \"hostname\" : \"gameliftstreams.eu-central-2.api.aws\"\n          },\n          \"eu-north-1\" : {\n            \"hostname\" : \"gameliftstreams.eu-north-1.api.aws\"\n          },\n          \"eu-south-1\" : {\n            \"hostname\" : \"gameliftstreams.eu-south-1.api.aws\"\n          },\n          \"eu-south-2\" : {\n            \"hostname\" : \"gameliftstreams.eu-south-2.api.aws\"\n          },\n          \"eu-west-1\" : {\n            \"hostname\" : \"gameliftstreams.eu-west-1.api.aws\"\n          },\n          \"eu-west-2\" : {\n            \"hostname\" : \"gameliftstreams.eu-west-2.api.aws\"\n          },\n          \"eu-west-3\" : {\n            \"hostname\" : \"gameliftstreams.eu-west-3.api.aws\"\n          },\n          \"il-central-1\" : {\n            \"hostname\" : \"gameliftstreams.il-central-1.api.aws\"\n          },\n          \"me-central-1\" : {\n            \"hostname\" : \"gameliftstreams.me-central-1.api.aws\"\n          },\n          \"me-south-1\" : {\n            \"hostname\" : \"gameliftstreams.me-south-1.api.aws\"\n          },\n          \"mx-central-1\" : {\n            \"hostname\" : \"gameliftstreams.mx-central-1.api.aws\"\n          },\n          \"sa-east-1\" : {\n            \"hostname\" : \"gameliftstreams.sa-east-1.api.aws\"\n          },\n          \"us-east-1\" : {\n            \"hostname\" : \"gameliftstreams.us-east-1.api.aws\"\n          },\n          \"us-east-2\" : {\n            \"hostname\" : \"gameliftstreams.us-east-2.api.aws\"\n          },\n          \"us-west-1\" : {\n            \"hostname\" : \"gameliftstreams.us-west-1.api.aws\"\n          },\n          \"us-west-2\" : {\n            \"hostname\" : \"gameliftstreams.us-west-2.api.aws\"\n          }\n        }\n      },\n      \"geo\" : {\n        \"endpoints\" : {\n          \"ap-northeast-1\" : { },\n          \"ap-south-1\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-5\" : { },\n          \"ca-central-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : { },\n          \"us-east-2\" : { },\n          \"us-west-2\" : { }\n        }\n      },\n      \"glacier\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"http\", \"https\" ]\n        },\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-3\" : { },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"glacier-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-central-1\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"fips-ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"glacier-fips.ca-central-1.amazonaws.com\"\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"glacier-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"glacier-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"glacier-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"glacier-fips.us-west-2.amazonaws.com\"\n          },\n          \"me-south-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"glacier-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"glacier-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"glacier-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"glacier-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"globalaccelerator\" : {\n        \"endpoints\" : {\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"hostname\" : \"globalaccelerator-fips.us-west-2.amazonaws.com\"\n          }\n        }\n      },\n      \"glue\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"glue.af-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"glue.ap-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"glue.ap-northeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"glue.ap-northeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"glue.ap-northeast-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"glue.ap-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"glue.ap-south-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"glue.ap-southeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"glue.ap-southeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"glue.ap-southeast-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-4\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"glue.ap-southeast-4.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-5\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"glue.ap-southeast-5.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-7\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"glue.ap-southeast-7.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"glue.ca-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ca-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"glue.ca-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"glue.eu-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-central-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"glue.eu-central-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-north-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"glue.eu-north-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"glue.eu-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"glue.eu-south-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"glue.eu-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"glue.eu-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"glue.eu-west-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"glue-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"glue-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"glue-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"glue-fips.us-west-2.amazonaws.com\"\n          },\n          \"il-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"glue.il-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"me-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"glue.me-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"me-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"glue.me-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"mx-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"glue.mx-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"sa-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"glue.sa-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"glue-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"glue-fips.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"glue.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"glue-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"glue-fips.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"glue.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"glue-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"glue-fips.us-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"glue.us-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"glue-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"glue-fips.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"glue.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"grafana\" : {\n        \"endpoints\" : {\n          \"ap-northeast-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-northeast-1\"\n            },\n            \"hostname\" : \"grafana.ap-northeast-1.amazonaws.com\"\n          },\n          \"ap-northeast-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-northeast-2\"\n            },\n            \"hostname\" : \"grafana.ap-northeast-2.amazonaws.com\"\n          },\n          \"ap-southeast-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-southeast-1\"\n            },\n            \"hostname\" : \"grafana.ap-southeast-1.amazonaws.com\"\n          },\n          \"ap-southeast-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-southeast-2\"\n            },\n            \"hostname\" : \"grafana.ap-southeast-2.amazonaws.com\"\n          },\n          \"eu-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-central-1\"\n            },\n            \"hostname\" : \"grafana.eu-central-1.amazonaws.com\"\n          },\n          \"eu-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-west-1\"\n            },\n            \"hostname\" : \"grafana.eu-west-1.amazonaws.com\"\n          },\n          \"eu-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-west-2\"\n            },\n            \"hostname\" : \"grafana.eu-west-2.amazonaws.com\"\n          },\n          \"us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"hostname\" : \"grafana.us-east-1.amazonaws.com\"\n          },\n          \"us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"hostname\" : \"grafana.us-east-2.amazonaws.com\"\n          },\n          \"us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"hostname\" : \"grafana.us-west-2.amazonaws.com\"\n          }\n        }\n      },\n      \"greengrass\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"https\" ]\n        },\n        \"endpoints\" : {\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-south-1\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-5\" : { },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"greengrass-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-central-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"fips-ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"greengrass-fips.ca-central-1.amazonaws.com\"\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"greengrass-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"greengrass-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"greengrass-fips.us-west-2.amazonaws.com\"\n          },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"greengrass-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"greengrass-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"greengrass-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        },\n        \"isRegionalized\" : true\n      },\n      \"groundstation\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-2\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-2\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-central-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-north-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"groundstation-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"groundstation-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"groundstation-fips.us-west-2.amazonaws.com\"\n          },\n          \"me-south-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"sa-east-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            }, {\n              \"hostname\" : \"groundstation-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"groundstation-fips.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            }, {\n              \"hostname\" : \"groundstation-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"groundstation-fips.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            }, {\n              \"hostname\" : \"groundstation-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"groundstation-fips.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"guardduty\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"https\" ]\n        },\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-south-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-3\" : { },\n          \"ap-southeast-4\" : { },\n          \"ap-southeast-5\" : { },\n          \"ap-southeast-7\" : { },\n          \"ca-central-1\" : { },\n          \"ca-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"guardduty-fips.ca-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ca-west-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"guardduty-fips.ca-west-1.amazonaws.com\"\n          },\n          \"eu-central-1\" : { },\n          \"eu-central-2\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"il-central-1\" : { },\n          \"me-central-1\" : { },\n          \"me-south-1\" : { },\n          \"mx-central-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"guardduty-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"guardduty-fips.us-east-1.amazonaws.com\"\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"guardduty-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"guardduty-fips.us-east-2.amazonaws.com\"\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"guardduty-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"guardduty-fips.us-west-1.amazonaws.com\"\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"guardduty-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"guardduty-fips.us-west-2.amazonaws.com\"\n          }\n        },\n        \"isRegionalized\" : true\n      },\n      \"health\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"https\" ],\n          \"sslCommonName\" : \"health.us-east-1.amazonaws.com\"\n        },\n        \"endpoints\" : {\n          \"aws-global\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"hostname\" : \"global.health.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"health-fips.us-east-2.amazonaws.com\"\n          },\n          \"us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"variants\" : [ {\n              \"hostname\" : \"health-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        },\n        \"isRegionalized\" : false,\n        \"partitionEndpoint\" : \"aws-global\"\n      },\n      \"healthlake\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"https\" ]\n        },\n        \"endpoints\" : {\n          \"ap-south-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"us-east-1\" : { },\n          \"us-east-2\" : { },\n          \"us-west-2\" : { }\n        }\n      },\n      \"iam\" : {\n        \"endpoints\" : {\n          \"aws-global\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"hostname\" : \"iam.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"iam-fips.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"iam.global.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"aws-global-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"iam-fips.amazonaws.com\"\n          },\n          \"iam\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"variants\" : [ {\n              \"hostname\" : \"iam-fips.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"iam-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"iam-fips.amazonaws.com\"\n          }\n        },\n        \"isRegionalized\" : false,\n        \"partitionEndpoint\" : \"aws-global\"\n      },\n      \"identity-chime\" : {\n        \"endpoints\" : {\n          \"eu-central-1\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"identity-chime-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"identity-chime-fips.us-east-1.amazonaws.com\"\n          }\n        }\n      },\n      \"identitystore\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-south-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-3\" : { },\n          \"ap-southeast-4\" : { },\n          \"ap-southeast-5\" : { },\n          \"ap-southeast-7\" : { },\n          \"ca-central-1\" : { },\n          \"ca-west-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-central-2\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"il-central-1\" : { },\n          \"me-central-1\" : { },\n          \"me-south-1\" : { },\n          \"mx-central-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : { },\n          \"us-east-2\" : { },\n          \"us-west-1\" : { },\n          \"us-west-2\" : { }\n        }\n      },\n      \"importexport\" : {\n        \"endpoints\" : {\n          \"aws-global\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\",\n              \"service\" : \"IngestionService\"\n            },\n            \"hostname\" : \"importexport.amazonaws.com\",\n            \"signatureVersions\" : [ \"v2\", \"v4\" ]\n          }\n        },\n        \"isRegionalized\" : false,\n        \"partitionEndpoint\" : \"aws-global\"\n      },\n      \"ingest.timestream\" : {\n        \"endpoints\" : {\n          \"ap-northeast-1\" : { },\n          \"ap-south-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"eu-central-1\" : { },\n          \"eu-west-1\" : { },\n          \"ingest-fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"ingest.timestream-fips.us-east-1.amazonaws.com\"\n          },\n          \"ingest-fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"ingest.timestream-fips.us-east-2.amazonaws.com\"\n          },\n          \"ingest-fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"ingest.timestream-fips.us-west-2.amazonaws.com\"\n          },\n          \"ingest-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"variants\" : [ {\n              \"hostname\" : \"ingest.timestream-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ingest-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"variants\" : [ {\n              \"hostname\" : \"ingest.timestream-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ingest-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"variants\" : [ {\n              \"hostname\" : \"ingest.timestream-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-1\" : { },\n          \"us-east-2\" : { },\n          \"us-west-2\" : { }\n        }\n      },\n      \"inspector\" : {\n        \"endpoints\" : {\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-south-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"eu-central-1\" : { },\n          \"eu-north-1\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"inspector-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"inspector-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"inspector-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"inspector-fips.us-west-2.amazonaws.com\"\n          },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"inspector-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"inspector-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"inspector-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"inspector-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"inspector2\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-south-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-3\" : { },\n          \"ap-southeast-4\" : { },\n          \"ap-southeast-5\" : { },\n          \"ap-southeast-7\" : { },\n          \"ca-central-1\" : { },\n          \"ca-west-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-central-2\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"inspector2-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"inspector2-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"inspector2-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"inspector2-fips.us-west-2.amazonaws.com\"\n          },\n          \"il-central-1\" : { },\n          \"me-central-1\" : { },\n          \"me-south-1\" : { },\n          \"mx-central-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"inspector2-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"inspector2-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"inspector2-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"inspector2-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"internetmonitor\" : {\n        \"defaults\" : {\n          \"dnsSuffix\" : \"api.aws\",\n          \"variants\" : [ {\n            \"dnsSuffix\" : \"api.aws\",\n            \"hostname\" : \"{service}-fips.{region}.{dnsSuffix}\",\n            \"tags\" : [ \"fips\" ]\n          } ]\n        },\n        \"endpoints\" : {\n          \"af-south-1\" : {\n            \"hostname\" : \"internetmonitor.af-south-1.api.aws\",\n            \"variants\" : [ {\n              \"hostname\" : \"internetmonitor.af-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-east-1\" : {\n            \"hostname\" : \"internetmonitor.ap-east-1.api.aws\",\n            \"variants\" : [ {\n              \"hostname\" : \"internetmonitor.ap-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : {\n            \"hostname\" : \"internetmonitor.ap-northeast-1.api.aws\",\n            \"variants\" : [ {\n              \"hostname\" : \"internetmonitor.ap-northeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-2\" : {\n            \"hostname\" : \"internetmonitor.ap-northeast-2.api.aws\",\n            \"variants\" : [ {\n              \"hostname\" : \"internetmonitor.ap-northeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-3\" : {\n            \"hostname\" : \"internetmonitor.ap-northeast-3.api.aws\",\n            \"variants\" : [ {\n              \"hostname\" : \"internetmonitor.ap-northeast-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-1\" : {\n            \"hostname\" : \"internetmonitor.ap-south-1.api.aws\",\n            \"variants\" : [ {\n              \"hostname\" : \"internetmonitor.ap-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-2\" : {\n            \"hostname\" : \"internetmonitor.ap-south-2.api.aws\",\n            \"variants\" : [ {\n              \"hostname\" : \"internetmonitor.ap-south-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-1\" : {\n            \"hostname\" : \"internetmonitor.ap-southeast-1.api.aws\",\n            \"variants\" : [ {\n              \"hostname\" : \"internetmonitor.ap-southeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-2\" : {\n            \"hostname\" : \"internetmonitor.ap-southeast-2.api.aws\",\n            \"variants\" : [ {\n              \"hostname\" : \"internetmonitor.ap-southeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-3\" : {\n            \"hostname\" : \"internetmonitor.ap-southeast-3.api.aws\",\n            \"variants\" : [ {\n              \"hostname\" : \"internetmonitor.ap-southeast-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-4\" : {\n            \"hostname\" : \"internetmonitor.ap-southeast-4.api.aws\",\n            \"variants\" : [ {\n              \"hostname\" : \"internetmonitor.ap-southeast-4.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-5\" : {\n            \"hostname\" : \"internetmonitor.ap-southeast-5.api.aws\"\n          },\n          \"ap-southeast-6\" : { },\n          \"ap-southeast-7\" : {\n            \"hostname\" : \"internetmonitor.ap-southeast-7.api.aws\"\n          },\n          \"ca-central-1\" : {\n            \"hostname\" : \"internetmonitor.ca-central-1.api.aws\",\n            \"variants\" : [ {\n              \"hostname\" : \"internetmonitor-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"internetmonitor-fips.ca-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"internetmonitor.ca-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ca-west-1\" : {\n            \"hostname\" : \"internetmonitor.ca-west-1.api.aws\"\n          },\n          \"eu-central-1\" : {\n            \"hostname\" : \"internetmonitor.eu-central-1.api.aws\",\n            \"variants\" : [ {\n              \"hostname\" : \"internetmonitor.eu-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-central-2\" : {\n            \"hostname\" : \"internetmonitor.eu-central-2.api.aws\",\n            \"variants\" : [ {\n              \"hostname\" : \"internetmonitor.eu-central-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-north-1\" : {\n            \"hostname\" : \"internetmonitor.eu-north-1.api.aws\",\n            \"variants\" : [ {\n              \"hostname\" : \"internetmonitor.eu-north-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-1\" : {\n            \"hostname\" : \"internetmonitor.eu-south-1.api.aws\",\n            \"variants\" : [ {\n              \"hostname\" : \"internetmonitor.eu-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-2\" : {\n            \"hostname\" : \"internetmonitor.eu-south-2.api.aws\",\n            \"variants\" : [ {\n              \"hostname\" : \"internetmonitor.eu-south-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-1\" : {\n            \"hostname\" : \"internetmonitor.eu-west-1.api.aws\",\n            \"variants\" : [ {\n              \"hostname\" : \"internetmonitor.eu-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-2\" : {\n            \"hostname\" : \"internetmonitor.eu-west-2.api.aws\",\n            \"variants\" : [ {\n              \"hostname\" : \"internetmonitor.eu-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-3\" : {\n            \"hostname\" : \"internetmonitor.eu-west-3.api.aws\",\n            \"variants\" : [ {\n              \"hostname\" : \"internetmonitor.eu-west-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"il-central-1\" : {\n            \"hostname\" : \"internetmonitor.il-central-1.api.aws\"\n          },\n          \"me-central-1\" : {\n            \"hostname\" : \"internetmonitor.me-central-1.api.aws\",\n            \"variants\" : [ {\n              \"hostname\" : \"internetmonitor.me-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"me-south-1\" : {\n            \"hostname\" : \"internetmonitor.me-south-1.api.aws\",\n            \"variants\" : [ {\n              \"hostname\" : \"internetmonitor.me-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"mx-central-1\" : {\n            \"hostname\" : \"internetmonitor.mx-central-1.api.aws\"\n          },\n          \"sa-east-1\" : {\n            \"hostname\" : \"internetmonitor.sa-east-1.api.aws\",\n            \"variants\" : [ {\n              \"hostname\" : \"internetmonitor.sa-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-1\" : {\n            \"hostname\" : \"internetmonitor.us-east-1.api.aws\",\n            \"variants\" : [ {\n              \"hostname\" : \"internetmonitor-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"internetmonitor-fips.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"internetmonitor.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"hostname\" : \"internetmonitor.us-east-2.api.aws\",\n            \"variants\" : [ {\n              \"hostname\" : \"internetmonitor-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"internetmonitor-fips.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"internetmonitor.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"hostname\" : \"internetmonitor.us-west-1.api.aws\",\n            \"variants\" : [ {\n              \"hostname\" : \"internetmonitor-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"internetmonitor-fips.us-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"internetmonitor.us-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"hostname\" : \"internetmonitor.us-west-2.api.aws\",\n            \"variants\" : [ {\n              \"hostname\" : \"internetmonitor-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"internetmonitor-fips.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"internetmonitor.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"iot\" : {\n        \"endpoints\" : {\n          \"ap-east-1\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-south-1\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-5\" : { },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"iot-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-central-1\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"fips-ca-central-1\" : {\n            \"deprecated\" : true,\n            \"hostname\" : \"iot-fips.ca-central-1.amazonaws.com\"\n          },\n          \"fips-us-east-1\" : {\n            \"deprecated\" : true,\n            \"hostname\" : \"iot-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"deprecated\" : true,\n            \"hostname\" : \"iot-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"deprecated\" : true,\n            \"hostname\" : \"iot-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"deprecated\" : true,\n            \"hostname\" : \"iot-fips.us-west-2.amazonaws.com\"\n          },\n          \"me-central-1\" : { },\n          \"me-south-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"iot-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"iot-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"iot-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"iot-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"iotanalytics\" : {\n        \"endpoints\" : {\n          \"ap-northeast-1\" : { },\n          \"ap-south-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"eu-central-1\" : { },\n          \"eu-west-1\" : { },\n          \"us-east-1\" : { },\n          \"us-east-2\" : { },\n          \"us-west-2\" : { }\n        }\n      },\n      \"iotevents\" : {\n        \"endpoints\" : {\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-south-1\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"iotevents-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-central-1\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"fips-ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"iotevents-fips.ca-central-1.amazonaws.com\"\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"iotevents-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"iotevents-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"iotevents-fips.us-west-2.amazonaws.com\"\n          },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"iotevents-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"iotevents-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"iotevents-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"ioteventsdata\" : {\n        \"endpoints\" : {\n          \"ap-northeast-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-northeast-1\"\n            },\n            \"hostname\" : \"data.iotevents.ap-northeast-1.amazonaws.com\"\n          },\n          \"ap-northeast-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-northeast-2\"\n            },\n            \"hostname\" : \"data.iotevents.ap-northeast-2.amazonaws.com\"\n          },\n          \"ap-south-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-south-1\"\n            },\n            \"hostname\" : \"data.iotevents.ap-south-1.amazonaws.com\"\n          },\n          \"ap-southeast-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-southeast-1\"\n            },\n            \"hostname\" : \"data.iotevents.ap-southeast-1.amazonaws.com\"\n          },\n          \"ap-southeast-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-southeast-2\"\n            },\n            \"hostname\" : \"data.iotevents.ap-southeast-2.amazonaws.com\"\n          },\n          \"ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"hostname\" : \"data.iotevents.ca-central-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"data.iotevents-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-central-1\"\n            },\n            \"hostname\" : \"data.iotevents.eu-central-1.amazonaws.com\"\n          },\n          \"eu-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-west-1\"\n            },\n            \"hostname\" : \"data.iotevents.eu-west-1.amazonaws.com\"\n          },\n          \"eu-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-west-2\"\n            },\n            \"hostname\" : \"data.iotevents.eu-west-2.amazonaws.com\"\n          },\n          \"fips-ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"data.iotevents-fips.ca-central-1.amazonaws.com\"\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"data.iotevents-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"data.iotevents-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"data.iotevents-fips.us-west-2.amazonaws.com\"\n          },\n          \"us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"hostname\" : \"data.iotevents.us-east-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"data.iotevents-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"hostname\" : \"data.iotevents.us-east-2.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"data.iotevents-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"hostname\" : \"data.iotevents.us-west-2.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"data.iotevents-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"iotfleetwise\" : {\n        \"endpoints\" : {\n          \"ap-south-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-central-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"iotsecuredtunneling\" : {\n        \"defaults\" : {\n          \"variants\" : [ {\n            \"hostname\" : \"api.tunneling.iot-fips.{region}.{dnsSuffix}\",\n            \"tags\" : [ \"fips\" ]\n          } ]\n        },\n        \"endpoints\" : {\n          \"ap-east-1\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-south-1\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"api.tunneling.iot-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-central-1\" : { },\n          \"eu-north-1\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"fips-ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"api.tunneling.iot-fips.ca-central-1.amazonaws.com\"\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"api.tunneling.iot-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"api.tunneling.iot-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"api.tunneling.iot-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"api.tunneling.iot-fips.us-west-2.amazonaws.com\"\n          },\n          \"me-south-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"api.tunneling.iot-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"api.tunneling.iot-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"api.tunneling.iot-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"api.tunneling.iot-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"iotsitewise\" : {\n        \"endpoints\" : {\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-south-1\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"iotsitewise-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-central-1\" : { },\n          \"eu-west-1\" : { },\n          \"fips-ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"iotsitewise-fips.ca-central-1.amazonaws.com\"\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"iotsitewise-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"iotsitewise-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"iotsitewise-fips.us-west-2.amazonaws.com\"\n          },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"iotsitewise-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"iotsitewise-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"iotsitewise-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"iotthingsgraph\" : {\n        \"defaults\" : {\n          \"credentialScope\" : {\n            \"service\" : \"iotthingsgraph\"\n          }\n        },\n        \"endpoints\" : {\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-southeast-2\" : { },\n          \"eu-west-1\" : { },\n          \"us-east-1\" : { },\n          \"us-west-2\" : { }\n        }\n      },\n      \"iottwinmaker\" : {\n        \"endpoints\" : {\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-south-1\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"api-ap-northeast-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-northeast-1\"\n            },\n            \"hostname\" : \"api.iottwinmaker.ap-northeast-1.amazonaws.com\"\n          },\n          \"api-ap-northeast-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-northeast-2\"\n            },\n            \"hostname\" : \"api.iottwinmaker.ap-northeast-2.amazonaws.com\"\n          },\n          \"api-ap-south-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-south-1\"\n            },\n            \"hostname\" : \"api.iottwinmaker.ap-south-1.amazonaws.com\"\n          },\n          \"api-ap-southeast-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-southeast-1\"\n            },\n            \"hostname\" : \"api.iottwinmaker.ap-southeast-1.amazonaws.com\"\n          },\n          \"api-ap-southeast-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-southeast-2\"\n            },\n            \"hostname\" : \"api.iottwinmaker.ap-southeast-2.amazonaws.com\"\n          },\n          \"api-eu-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-central-1\"\n            },\n            \"hostname\" : \"api.iottwinmaker.eu-central-1.amazonaws.com\"\n          },\n          \"api-eu-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-west-1\"\n            },\n            \"hostname\" : \"api.iottwinmaker.eu-west-1.amazonaws.com\"\n          },\n          \"api-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"hostname\" : \"api.iottwinmaker.us-east-1.amazonaws.com\"\n          },\n          \"api-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"hostname\" : \"api.iottwinmaker.us-west-2.amazonaws.com\"\n          },\n          \"data-ap-northeast-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-northeast-1\"\n            },\n            \"hostname\" : \"data.iottwinmaker.ap-northeast-1.amazonaws.com\"\n          },\n          \"data-ap-northeast-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-northeast-2\"\n            },\n            \"hostname\" : \"data.iottwinmaker.ap-northeast-2.amazonaws.com\"\n          },\n          \"data-ap-south-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-south-1\"\n            },\n            \"hostname\" : \"data.iottwinmaker.ap-south-1.amazonaws.com\"\n          },\n          \"data-ap-southeast-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-southeast-1\"\n            },\n            \"hostname\" : \"data.iottwinmaker.ap-southeast-1.amazonaws.com\"\n          },\n          \"data-ap-southeast-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-southeast-2\"\n            },\n            \"hostname\" : \"data.iottwinmaker.ap-southeast-2.amazonaws.com\"\n          },\n          \"data-eu-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-central-1\"\n            },\n            \"hostname\" : \"data.iottwinmaker.eu-central-1.amazonaws.com\"\n          },\n          \"data-eu-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-west-1\"\n            },\n            \"hostname\" : \"data.iottwinmaker.eu-west-1.amazonaws.com\"\n          },\n          \"data-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"hostname\" : \"data.iottwinmaker.us-east-1.amazonaws.com\"\n          },\n          \"data-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"hostname\" : \"data.iottwinmaker.us-west-2.amazonaws.com\"\n          },\n          \"eu-central-1\" : { },\n          \"eu-west-1\" : { },\n          \"fips-api-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"hostname\" : \"api.iottwinmaker-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-api-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"hostname\" : \"api.iottwinmaker-fips.us-west-2.amazonaws.com\"\n          },\n          \"fips-data-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"hostname\" : \"data.iottwinmaker-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-data-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"hostname\" : \"data.iottwinmaker-fips.us-west-2.amazonaws.com\"\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"iottwinmaker-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"iottwinmaker-fips.us-west-2.amazonaws.com\"\n          },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"iottwinmaker-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"iottwinmaker-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"iotwireless\" : {\n        \"endpoints\" : {\n          \"ap-northeast-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-northeast-1\"\n            },\n            \"hostname\" : \"api.iotwireless.ap-northeast-1.amazonaws.com\"\n          },\n          \"ap-southeast-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-southeast-2\"\n            },\n            \"hostname\" : \"api.iotwireless.ap-southeast-2.amazonaws.com\"\n          },\n          \"eu-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-west-1\"\n            },\n            \"hostname\" : \"api.iotwireless.eu-west-1.amazonaws.com\"\n          },\n          \"us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"hostname\" : \"api.iotwireless.us-east-1.amazonaws.com\"\n          },\n          \"us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"hostname\" : \"api.iotwireless.us-west-2.amazonaws.com\"\n          }\n        }\n      },\n      \"ivs\" : {\n        \"endpoints\" : {\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-south-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-west-1\" : { },\n          \"us-east-1\" : { },\n          \"us-west-2\" : { }\n        }\n      },\n      \"ivschat\" : {\n        \"endpoints\" : {\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-south-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-west-1\" : { },\n          \"us-east-1\" : { },\n          \"us-west-2\" : { }\n        }\n      },\n      \"ivsrealtime\" : {\n        \"endpoints\" : {\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-south-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-west-1\" : { },\n          \"us-east-1\" : { },\n          \"us-west-2\" : { }\n        }\n      },\n      \"kafka\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-south-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-3\" : { },\n          \"ap-southeast-4\" : { },\n          \"ap-southeast-5\" : { },\n          \"ap-southeast-7\" : { },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"kafka-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ca-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"kafka-fips.ca-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-central-1\" : { },\n          \"eu-central-2\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"fips-ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"kafka-fips.ca-central-1.amazonaws.com\"\n          },\n          \"fips-ca-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"kafka-fips.ca-west-1.amazonaws.com\"\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"kafka-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"kafka-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"kafka-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"kafka-fips.us-west-2.amazonaws.com\"\n          },\n          \"il-central-1\" : { },\n          \"me-central-1\" : { },\n          \"me-south-1\" : { },\n          \"mx-central-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"kafka-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"kafka-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"kafka-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"kafka-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"kafkaconnect\" : {\n        \"endpoints\" : {\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-south-1\" : { },\n          \"ap-south-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-5\" : { },\n          \"ap-southeast-7\" : { },\n          \"ca-central-1\" : { },\n          \"ca-west-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"mx-central-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : { },\n          \"us-east-2\" : { },\n          \"us-west-1\" : { },\n          \"us-west-2\" : { }\n        }\n      },\n      \"kendra\" : {\n        \"endpoints\" : {\n          \"ap-northeast-1\" : { },\n          \"ap-south-1\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"kendra-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"fips-ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"kendra-fips.ca-central-1.amazonaws.com\"\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"kendra-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"kendra-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"kendra-fips.us-west-2.amazonaws.com\"\n          },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"kendra-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"kendra-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"kendra-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"kendra-ranking\" : {\n        \"defaults\" : {\n          \"dnsSuffix\" : \"api.aws\",\n          \"variants\" : [ {\n            \"dnsSuffix\" : \"api.aws\",\n            \"hostname\" : \"{service}-fips.{region}.{dnsSuffix}\",\n            \"tags\" : [ \"fips\" ]\n          } ]\n        },\n        \"endpoints\" : {\n          \"af-south-1\" : {\n            \"hostname\" : \"kendra-ranking.af-south-1.api.aws\"\n          },\n          \"ap-east-1\" : {\n            \"hostname\" : \"kendra-ranking.ap-east-1.api.aws\"\n          },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : {\n            \"hostname\" : \"kendra-ranking.ap-northeast-1.api.aws\"\n          },\n          \"ap-northeast-2\" : {\n            \"hostname\" : \"kendra-ranking.ap-northeast-2.api.aws\"\n          },\n          \"ap-northeast-3\" : {\n            \"hostname\" : \"kendra-ranking.ap-northeast-3.api.aws\"\n          },\n          \"ap-south-1\" : {\n            \"hostname\" : \"kendra-ranking.ap-south-1.api.aws\"\n          },\n          \"ap-south-2\" : {\n            \"hostname\" : \"kendra-ranking.ap-south-2.api.aws\"\n          },\n          \"ap-southeast-1\" : {\n            \"hostname\" : \"kendra-ranking.ap-southeast-1.api.aws\"\n          },\n          \"ap-southeast-2\" : {\n            \"hostname\" : \"kendra-ranking.ap-southeast-2.api.aws\"\n          },\n          \"ap-southeast-3\" : {\n            \"hostname\" : \"kendra-ranking.ap-southeast-3.api.aws\"\n          },\n          \"ap-southeast-4\" : {\n            \"hostname\" : \"kendra-ranking.ap-southeast-4.api.aws\"\n          },\n          \"ap-southeast-5\" : {\n            \"hostname\" : \"kendra-ranking.ap-southeast-5.api.aws\"\n          },\n          \"ap-southeast-6\" : { },\n          \"ap-southeast-7\" : {\n            \"hostname\" : \"kendra-ranking.ap-southeast-7.api.aws\"\n          },\n          \"ca-central-1\" : {\n            \"hostname\" : \"kendra-ranking.ca-central-1.api.aws\",\n            \"variants\" : [ {\n              \"hostname\" : \"kendra-ranking-fips.ca-central-1.api.aws\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ca-west-1\" : {\n            \"hostname\" : \"kendra-ranking.ca-west-1.api.aws\"\n          },\n          \"eu-central-2\" : {\n            \"hostname\" : \"kendra-ranking.eu-central-2.api.aws\"\n          },\n          \"eu-north-1\" : {\n            \"hostname\" : \"kendra-ranking.eu-north-1.api.aws\"\n          },\n          \"eu-south-1\" : {\n            \"hostname\" : \"kendra-ranking.eu-south-1.api.aws\"\n          },\n          \"eu-south-2\" : {\n            \"hostname\" : \"kendra-ranking.eu-south-2.api.aws\"\n          },\n          \"eu-west-1\" : {\n            \"hostname\" : \"kendra-ranking.eu-west-1.api.aws\"\n          },\n          \"eu-west-3\" : {\n            \"hostname\" : \"kendra-ranking.eu-west-3.api.aws\"\n          },\n          \"il-central-1\" : {\n            \"hostname\" : \"kendra-ranking.il-central-1.api.aws\"\n          },\n          \"me-central-1\" : {\n            \"hostname\" : \"kendra-ranking.me-central-1.api.aws\"\n          },\n          \"me-south-1\" : {\n            \"hostname\" : \"kendra-ranking.me-south-1.api.aws\"\n          },\n          \"mx-central-1\" : {\n            \"hostname\" : \"kendra-ranking.mx-central-1.api.aws\"\n          },\n          \"sa-east-1\" : {\n            \"hostname\" : \"kendra-ranking.sa-east-1.api.aws\"\n          },\n          \"us-east-1\" : {\n            \"hostname\" : \"kendra-ranking.us-east-1.api.aws\",\n            \"variants\" : [ {\n              \"hostname\" : \"kendra-ranking-fips.us-east-1.api.aws\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"hostname\" : \"kendra-ranking.us-east-2.api.aws\",\n            \"variants\" : [ {\n              \"hostname\" : \"kendra-ranking-fips.us-east-2.api.aws\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"hostname\" : \"kendra-ranking.us-west-1.api.aws\"\n          },\n          \"us-west-2\" : {\n            \"hostname\" : \"kendra-ranking.us-west-2.api.aws\",\n            \"variants\" : [ {\n              \"hostname\" : \"kendra-ranking-fips.us-west-2.api.aws\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"kinesis\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-south-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-3\" : { },\n          \"ap-southeast-4\" : { },\n          \"ap-southeast-5\" : { },\n          \"ap-southeast-6\" : { },\n          \"ap-southeast-7\" : { },\n          \"ca-central-1\" : { },\n          \"ca-west-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-central-2\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"kinesis-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"kinesis-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"kinesis-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"kinesis-fips.us-west-2.amazonaws.com\"\n          },\n          \"il-central-1\" : { },\n          \"me-central-1\" : { },\n          \"me-south-1\" : { },\n          \"mx-central-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"kinesis-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"kinesis-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"kinesis-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"kinesis-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"kinesisanalytics\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-south-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-3\" : { },\n          \"ap-southeast-4\" : { },\n          \"ap-southeast-5\" : { },\n          \"ap-southeast-7\" : { },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"kinesisanalytics-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ca-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"kinesisanalytics-fips.ca-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-central-1\" : { },\n          \"eu-central-2\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"fips-ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"kinesisanalytics-fips.ca-central-1.amazonaws.com\"\n          },\n          \"fips-ca-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"kinesisanalytics-fips.ca-west-1.amazonaws.com\"\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"kinesisanalytics-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"kinesisanalytics-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"kinesisanalytics-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"kinesisanalytics-fips.us-west-2.amazonaws.com\"\n          },\n          \"il-central-1\" : { },\n          \"me-central-1\" : { },\n          \"me-south-1\" : { },\n          \"mx-central-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"kinesisanalytics-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"kinesisanalytics-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"kinesisanalytics-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"kinesisanalytics-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"kinesisvideo\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-south-1\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-5\" : { },\n          \"ca-central-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"me-south-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : { },\n          \"us-east-2\" : { },\n          \"us-west-2\" : { }\n        }\n      },\n      \"kms\" : {\n        \"endpoints\" : {\n          \"ProdFips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-central-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"kms-fips.eu-central-2.amazonaws.com\"\n          },\n          \"af-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"kms-fips.af-south-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"af-south-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"af-south-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"kms-fips.af-south-1.amazonaws.com\"\n          },\n          \"ap-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"kms-fips.ap-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ap-east-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"kms-fips.ap-east-1.amazonaws.com\"\n          },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"kms-fips.ap-northeast-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ap-northeast-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-northeast-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"kms-fips.ap-northeast-1.amazonaws.com\"\n          },\n          \"ap-northeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"kms-fips.ap-northeast-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ap-northeast-2-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-northeast-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"kms-fips.ap-northeast-2.amazonaws.com\"\n          },\n          \"ap-northeast-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"kms-fips.ap-northeast-3.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ap-northeast-3-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-northeast-3\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"kms-fips.ap-northeast-3.amazonaws.com\"\n          },\n          \"ap-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"kms-fips.ap-south-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ap-south-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-south-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"kms-fips.ap-south-1.amazonaws.com\"\n          },\n          \"ap-south-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"kms-fips.ap-south-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ap-south-2-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-south-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"kms-fips.ap-south-2.amazonaws.com\"\n          },\n          \"ap-southeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"kms-fips.ap-southeast-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ap-southeast-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-southeast-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"kms-fips.ap-southeast-1.amazonaws.com\"\n          },\n          \"ap-southeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"kms-fips.ap-southeast-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ap-southeast-2-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-southeast-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"kms-fips.ap-southeast-2.amazonaws.com\"\n          },\n          \"ap-southeast-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"kms-fips.ap-southeast-3.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ap-southeast-3-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-southeast-3\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"kms-fips.ap-southeast-3.amazonaws.com\"\n          },\n          \"ap-southeast-4\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"kms-fips.ap-southeast-4.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ap-southeast-4-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-southeast-4\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"kms-fips.ap-southeast-4.amazonaws.com\"\n          },\n          \"ap-southeast-5\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"kms-fips.ap-southeast-5.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ap-southeast-5-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-southeast-5\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"kms-fips.ap-southeast-5.amazonaws.com\"\n          },\n          \"ap-southeast-6\" : { },\n          \"ap-southeast-7\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"kms-fips.ap-southeast-7.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ap-southeast-7-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-southeast-7\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"kms-fips.ap-southeast-7.amazonaws.com\"\n          },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"kms-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ca-central-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"kms-fips.ca-central-1.amazonaws.com\"\n          },\n          \"ca-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"kms-fips.ca-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ca-west-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"kms-fips.ca-west-1.amazonaws.com\"\n          },\n          \"eu-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"kms-fips.eu-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-central-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"kms-fips.eu-central-1.amazonaws.com\"\n          },\n          \"eu-central-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"kms-fips.eu-central-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-central-2-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-central-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"kms-fips.eu-central-2.amazonaws.com\"\n          },\n          \"eu-north-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"kms-fips.eu-north-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-north-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-north-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"kms-fips.eu-north-1.amazonaws.com\"\n          },\n          \"eu-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"kms-fips.eu-south-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-south-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-south-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"kms-fips.eu-south-1.amazonaws.com\"\n          },\n          \"eu-south-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"kms-fips.eu-south-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-south-2-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-south-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"kms-fips.eu-south-2.amazonaws.com\"\n          },\n          \"eu-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"kms-fips.eu-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-west-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"kms-fips.eu-west-1.amazonaws.com\"\n          },\n          \"eu-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"kms-fips.eu-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-west-2-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"kms-fips.eu-west-2.amazonaws.com\"\n          },\n          \"eu-west-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"kms-fips.eu-west-3.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-west-3-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-west-3\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"kms-fips.eu-west-3.amazonaws.com\"\n          },\n          \"il-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"kms-fips.il-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"il-central-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"il-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"kms-fips.il-central-1.amazonaws.com\"\n          },\n          \"me-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"kms-fips.me-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"me-central-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"me-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"kms-fips.me-central-1.amazonaws.com\"\n          },\n          \"me-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"kms-fips.me-south-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"me-south-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"me-south-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"kms-fips.me-south-1.amazonaws.com\"\n          },\n          \"mx-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"kms-fips.mx-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"mx-central-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"mx-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"kms-fips.mx-central-1.amazonaws.com\"\n          },\n          \"sa-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"kms-fips.sa-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"sa-east-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"sa-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"kms-fips.sa-east-1.amazonaws.com\"\n          },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"kms-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"kms-fips.us-east-1.amazonaws.com\"\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"kms-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"kms-fips.us-east-2.amazonaws.com\"\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"kms-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"kms-fips.us-west-1.amazonaws.com\"\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"kms-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"kms-fips.us-west-2.amazonaws.com\"\n          }\n        }\n      },\n      \"lakeformation\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"lakeformation.af-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"lakeformation.ap-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"lakeformation.ap-northeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"lakeformation.ap-northeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"lakeformation.ap-northeast-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"lakeformation.ap-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"lakeformation.ap-south-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"lakeformation.ap-southeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"lakeformation.ap-southeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"lakeformation.ap-southeast-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-4\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"lakeformation.ap-southeast-4.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-5\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"lakeformation.ap-southeast-5.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-7\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"lakeformation.ap-southeast-7.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"lakeformation.ca-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ca-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"lakeformation.ca-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"lakeformation.eu-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-central-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"lakeformation.eu-central-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-north-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"lakeformation.eu-north-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"lakeformation.eu-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"lakeformation.eu-south-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"lakeformation.eu-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"lakeformation.eu-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"lakeformation.eu-west-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"lakeformation-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"lakeformation-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"lakeformation-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"lakeformation-fips.us-west-2.amazonaws.com\"\n          },\n          \"il-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"lakeformation.il-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"me-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"lakeformation.me-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"me-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"lakeformation.me-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"mx-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"lakeformation.mx-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"sa-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"lakeformation.sa-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"lakeformation-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"lakeformation-fips.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"lakeformation.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"lakeformation-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"lakeformation-fips.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"lakeformation.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"lakeformation-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"lakeformation-fips.us-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"lakeformation.us-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"lakeformation-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"lakeformation-fips.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"lakeformation.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"lambda\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"lambda.af-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"lambda.ap-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"lambda.ap-northeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"lambda.ap-northeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"lambda.ap-northeast-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"lambda.ap-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"lambda.ap-south-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"lambda.ap-southeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"lambda.ap-southeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"lambda.ap-southeast-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-4\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"lambda.ap-southeast-4.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-5\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"lambda.ap-southeast-5.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-6\" : { },\n          \"ap-southeast-7\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"lambda.ap-southeast-7.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"lambda.ca-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ca-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"lambda.ca-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"lambda.eu-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-central-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"lambda.eu-central-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-north-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"lambda.eu-north-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"lambda.eu-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"lambda.eu-south-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"lambda.eu-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"lambda.eu-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"lambda.eu-west-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"lambda-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"lambda-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"lambda-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"lambda-fips.us-west-2.amazonaws.com\"\n          },\n          \"il-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"lambda.il-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"me-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"lambda.me-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"me-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"lambda.me-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"mx-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"lambda.mx-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"sa-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"lambda.sa-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"lambda-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"lambda.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"lambda-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"lambda.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"lambda-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"lambda.us-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"lambda-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"lambda.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"license-manager\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-south-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-3\" : { },\n          \"ap-southeast-4\" : { },\n          \"ap-southeast-5\" : { },\n          \"ap-southeast-7\" : { },\n          \"ca-central-1\" : { },\n          \"ca-west-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-central-2\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"license-manager-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"license-manager-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"license-manager-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"license-manager-fips.us-west-2.amazonaws.com\"\n          },\n          \"il-central-1\" : { },\n          \"me-central-1\" : { },\n          \"me-south-1\" : { },\n          \"mx-central-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"license-manager-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"license-manager-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"license-manager-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"license-manager-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"license-manager-linux-subscriptions\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-south-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-3\" : { },\n          \"ap-southeast-4\" : { },\n          \"ap-southeast-5\" : { },\n          \"ap-southeast-7\" : { },\n          \"ca-central-1\" : { },\n          \"ca-west-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-central-2\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"license-manager-linux-subscriptions-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"license-manager-linux-subscriptions-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"license-manager-linux-subscriptions-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"license-manager-linux-subscriptions-fips.us-west-2.amazonaws.com\"\n          },\n          \"il-central-1\" : { },\n          \"me-central-1\" : { },\n          \"me-south-1\" : { },\n          \"mx-central-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"license-manager-linux-subscriptions-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"license-manager-linux-subscriptions-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"license-manager-linux-subscriptions-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"license-manager-linux-subscriptions-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"license-manager-user-subscriptions\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-south-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-3\" : { },\n          \"ap-southeast-4\" : { },\n          \"ap-southeast-5\" : { },\n          \"ap-southeast-7\" : { },\n          \"ca-central-1\" : { },\n          \"ca-west-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-central-2\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"license-manager-user-subscriptions-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"license-manager-user-subscriptions-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"license-manager-user-subscriptions-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"license-manager-user-subscriptions-fips.us-west-2.amazonaws.com\"\n          },\n          \"il-central-1\" : { },\n          \"me-central-1\" : { },\n          \"me-south-1\" : { },\n          \"mx-central-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"license-manager-user-subscriptions-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"license-manager-user-subscriptions-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"license-manager-user-subscriptions-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"license-manager-user-subscriptions-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"lightsail\" : {\n        \"endpoints\" : {\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-south-1\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-3\" : { },\n          \"ca-central-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-north-1\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"us-east-1\" : { },\n          \"us-east-2\" : { },\n          \"us-west-2\" : { }\n        }\n      },\n      \"logs\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"logs.af-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"logs.ap-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"logs.ap-northeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"logs.ap-northeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"logs.ap-northeast-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"logs.ap-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"logs.ap-south-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"logs.ap-southeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"logs.ap-southeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"logs.ap-southeast-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-4\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"logs.ap-southeast-4.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-5\" : { },\n          \"ap-southeast-6\" : { },\n          \"ap-southeast-7\" : { },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"logs-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"logs.ca-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ca-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"logs-fips.ca-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"logs.ca-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"logs.eu-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-central-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"logs.eu-central-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-north-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"logs.eu-north-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"logs.eu-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"logs.eu-south-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"logs.eu-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"logs.eu-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"logs.eu-west-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"fips-ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"logs-fips.ca-central-1.amazonaws.com\"\n          },\n          \"fips-ca-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"logs-fips.ca-west-1.amazonaws.com\"\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"logs-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"logs-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"logs-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"logs-fips.us-west-2.amazonaws.com\"\n          },\n          \"il-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"logs.il-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"me-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"logs.me-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"me-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"logs.me-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"mx-central-1\" : { },\n          \"sa-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"logs.sa-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"logs-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"logs.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"logs-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"logs.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"logs-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"logs.us-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"logs-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"logs.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"lookoutequipment\" : {\n        \"endpoints\" : {\n          \"ap-northeast-2\" : { },\n          \"eu-west-1\" : { },\n          \"us-east-1\" : { }\n        }\n      },\n      \"lookoutmetrics\" : {\n        \"endpoints\" : {\n          \"ap-northeast-1\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"eu-central-1\" : { },\n          \"eu-north-1\" : { },\n          \"eu-west-1\" : { },\n          \"us-east-1\" : { },\n          \"us-east-2\" : { },\n          \"us-west-2\" : { }\n        }\n      },\n      \"lookoutvision\" : {\n        \"endpoints\" : {\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"eu-central-1\" : { },\n          \"eu-west-1\" : { },\n          \"us-east-1\" : { },\n          \"us-east-2\" : { },\n          \"us-west-2\" : { }\n        }\n      },\n      \"m2\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-central-1\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"fips-ca-central-1\" : {\n            \"deprecated\" : true\n          },\n          \"fips-us-east-1\" : {\n            \"deprecated\" : true\n          },\n          \"fips-us-east-2\" : {\n            \"deprecated\" : true\n          },\n          \"fips-us-west-1\" : {\n            \"deprecated\" : true\n          },\n          \"fips-us-west-2\" : {\n            \"deprecated\" : true\n          },\n          \"il-central-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"machinelearning\" : {\n        \"endpoints\" : {\n          \"eu-west-1\" : { },\n          \"us-east-1\" : { }\n        }\n      },\n      \"macie2\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"macie2.af-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"macie2.ap-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"macie2.ap-northeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"macie2.ap-northeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"macie2.ap-northeast-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"macie2.ap-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"macie2.ap-southeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"macie2.ap-southeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"macie2.ca-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"macie2.eu-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-north-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"macie2.eu-north-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"macie2.eu-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"macie2.eu-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"macie2.eu-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"macie2.eu-west-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"macie2-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"macie2-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"macie2-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"macie2-fips.us-west-2.amazonaws.com\"\n          },\n          \"il-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"macie2.il-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"me-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"macie2.me-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"sa-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"macie2.sa-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"macie2-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"macie2-fips.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"macie2.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"macie2-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"macie2-fips.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"macie2.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"macie2-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"macie2-fips.us-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"macie2.us-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"macie2-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"macie2-fips.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"macie2.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"managedblockchain\" : {\n        \"endpoints\" : {\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"us-east-1\" : { }\n        }\n      },\n      \"managedblockchain-query\" : {\n        \"endpoints\" : {\n          \"us-east-1\" : { }\n        }\n      },\n      \"marketplacecommerceanalytics\" : {\n        \"endpoints\" : {\n          \"us-east-1\" : { }\n        }\n      },\n      \"media-pipelines-chime\" : {\n        \"endpoints\" : {\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-south-1\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ca-central-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-west-2\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"media-pipelines-chime-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"media-pipelines-chime-fips.us-east-1.amazonaws.com\"\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"media-pipelines-chime-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"media-pipelines-chime-fips.us-west-2.amazonaws.com\"\n          }\n        }\n      },\n      \"mediaconnect\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-south-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-4\" : { },\n          \"ca-central-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-north-1\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"me-central-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : { },\n          \"us-east-2\" : { },\n          \"us-west-1\" : { },\n          \"us-west-2\" : { }\n        }\n      },\n      \"mediaconvert\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"mediaconvert.af-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"mediaconvert.ap-northeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"mediaconvert.ap-northeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"mediaconvert.ap-northeast-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"mediaconvert.ap-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"mediaconvert.ap-southeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"mediaconvert.ap-southeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-4\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"mediaconvert.ap-southeast-4.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"mediaconvert-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"mediaconvert-fips.ca-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"mediaconvert.ca-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"mediaconvert.eu-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-north-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"mediaconvert.eu-north-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"mediaconvert.eu-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"mediaconvert.eu-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"mediaconvert.eu-west-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"fips-ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"mediaconvert-fips.ca-central-1.amazonaws.com\"\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"mediaconvert-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"mediaconvert-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"mediaconvert-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"mediaconvert-fips.us-west-2.amazonaws.com\"\n          },\n          \"me-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"mediaconvert.me-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"sa-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"mediaconvert.sa-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"mediaconvert-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"mediaconvert-fips.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"mediaconvert.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"mediaconvert-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"mediaconvert-fips.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"mediaconvert.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"mediaconvert-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"mediaconvert-fips.us-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"mediaconvert.us-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"mediaconvert-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"mediaconvert-fips.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"mediaconvert.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"medialive\" : {\n        \"endpoints\" : {\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-south-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-4\" : { },\n          \"ca-central-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-north-1\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"medialive-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"medialive-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"medialive-fips.us-west-2.amazonaws.com\"\n          },\n          \"me-central-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"medialive-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"medialive-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"medialive-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"mediapackage\" : {\n        \"endpoints\" : {\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-4\" : { },\n          \"ca-central-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-north-1\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : { },\n          \"us-east-2\" : { },\n          \"us-west-1\" : { },\n          \"us-west-2\" : { }\n        }\n      },\n      \"mediapackage-vod\" : {\n        \"endpoints\" : {\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-south-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-4\" : { },\n          \"ca-central-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-north-1\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"me-central-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : { },\n          \"us-east-2\" : { },\n          \"us-west-1\" : { },\n          \"us-west-2\" : { }\n        }\n      },\n      \"mediapackagev2\" : {\n        \"endpoints\" : {\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-south-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-4\" : { },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"mediapackagev2-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-central-1\" : { },\n          \"eu-north-1\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"fips-ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"mediapackagev2-fips.ca-central-1.amazonaws.com\"\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"mediapackagev2-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"mediapackagev2-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"mediapackagev2-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"mediapackagev2-fips.us-west-2.amazonaws.com\"\n          },\n          \"me-central-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"mediapackagev2-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"mediapackagev2-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"mediapackagev2-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"mediapackagev2-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"mediastore\" : {\n        \"endpoints\" : {\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-southeast-2\" : { },\n          \"eu-central-1\" : { },\n          \"eu-north-1\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"us-east-1\" : { },\n          \"us-west-2\" : { }\n        }\n      },\n      \"meetings-chime\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-south-1\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"meetings-chime-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ca-central-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"meetings-chime-fips.ca-central-1.amazonaws.com\"\n          },\n          \"eu-central-1\" : { },\n          \"eu-west-2\" : { },\n          \"il-central-1\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"meetings-chime-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"meetings-chime-fips.us-east-1.amazonaws.com\"\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"meetings-chime-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"meetings-chime-fips.us-west-2.amazonaws.com\"\n          }\n        }\n      },\n      \"memory-db\" : {\n        \"endpoints\" : {\n          \"ap-east-1\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-south-1\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ca-central-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"hostname\" : \"memory-db-fips.us-west-1.amazonaws.com\"\n          },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : { },\n          \"us-east-2\" : { },\n          \"us-west-1\" : { },\n          \"us-west-2\" : { }\n        }\n      },\n      \"messaging-chime\" : {\n        \"endpoints\" : {\n          \"eu-central-1\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"messaging-chime-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"messaging-chime-fips.us-east-1.amazonaws.com\"\n          }\n        }\n      },\n      \"metering.marketplace\" : {\n        \"defaults\" : {\n          \"credentialScope\" : {\n            \"service\" : \"aws-marketplace\"\n          }\n        },\n        \"endpoints\" : {\n          \"af-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"metering-marketplace.af-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"metering-marketplace.ap-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"metering-marketplace.ap-northeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"metering-marketplace.ap-northeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"metering-marketplace.ap-northeast-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"metering-marketplace.ap-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"metering-marketplace.ap-south-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"metering-marketplace.ap-southeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"metering-marketplace.ap-southeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"metering-marketplace.ap-southeast-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-4\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"metering-marketplace.ap-southeast-4.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"metering-marketplace.ca-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"metering-marketplace.eu-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-central-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"metering-marketplace.eu-central-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-north-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"metering-marketplace.eu-north-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"metering-marketplace.eu-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"metering-marketplace.eu-south-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"metering-marketplace.eu-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"metering-marketplace.eu-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"metering-marketplace.eu-west-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"il-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"metering-marketplace.il-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"me-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"metering-marketplace.me-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"me-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"metering-marketplace.me-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"sa-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"metering-marketplace.sa-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"metering-marketplace.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"metering-marketplace.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"metering-marketplace.us-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"metering-marketplace.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"metrics.sagemaker\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-south-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-3\" : { },\n          \"ap-southeast-4\" : { },\n          \"ap-southeast-5\" : { },\n          \"ap-southeast-7\" : { },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"metrics-fips.sagemaker.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ca-central-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"metrics-fips.sagemaker.ca-central-1.amazonaws.com\"\n          },\n          \"ca-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"metrics-fips.sagemaker.ca-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ca-west-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"metrics-fips.sagemaker.ca-west-1.amazonaws.com\"\n          },\n          \"eu-central-1\" : { },\n          \"eu-central-2\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"il-central-1\" : { },\n          \"me-central-1\" : { },\n          \"me-south-1\" : { },\n          \"mx-central-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"metrics-fips.sagemaker.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"metrics-fips.sagemaker.us-east-1.amazonaws.com\"\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"metrics-fips.sagemaker.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"metrics-fips.sagemaker.us-east-2.amazonaws.com\"\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"metrics-fips.sagemaker.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"metrics-fips.sagemaker.us-west-1.amazonaws.com\"\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"metrics-fips.sagemaker.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"metrics-fips.sagemaker.us-west-2.amazonaws.com\"\n          }\n        }\n      },\n      \"mgh\" : {\n        \"endpoints\" : {\n          \"ap-northeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"eu-central-1\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"us-east-1\" : { },\n          \"us-west-2\" : { }\n        }\n      },\n      \"mgn\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-south-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-3\" : { },\n          \"ap-southeast-4\" : { },\n          \"ap-southeast-5\" : { },\n          \"ap-southeast-7\" : { },\n          \"ca-central-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-central-2\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"mgn-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"mgn-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"mgn-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"mgn-fips.us-west-2.amazonaws.com\"\n          },\n          \"il-central-1\" : { },\n          \"me-central-1\" : { },\n          \"me-south-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"mgn-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"mgn-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"mgn-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"mgn-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"migrationhub-orchestrator\" : {\n        \"endpoints\" : {\n          \"ap-northeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"eu-central-1\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"us-east-1\" : { },\n          \"us-west-2\" : { }\n        }\n      },\n      \"migrationhub-strategy\" : {\n        \"endpoints\" : {\n          \"ap-northeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"eu-central-1\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"us-east-1\" : { },\n          \"us-west-2\" : { }\n        }\n      },\n      \"mobileanalytics\" : {\n        \"endpoints\" : {\n          \"us-east-1\" : { }\n        }\n      },\n      \"models-v2-lex\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ca-central-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"us-east-1\" : { },\n          \"us-west-2\" : { }\n        }\n      },\n      \"models.lex\" : {\n        \"defaults\" : {\n          \"credentialScope\" : {\n            \"service\" : \"lex\"\n          },\n          \"variants\" : [ {\n            \"hostname\" : \"models-fips.lex.{region}.{dnsSuffix}\",\n            \"tags\" : [ \"fips\" ]\n          } ]\n        },\n        \"endpoints\" : {\n          \"ap-northeast-1\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"eu-central-1\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"models-fips.lex.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"models-fips.lex.us-east-1.amazonaws.com\"\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"models-fips.lex.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"models-fips.lex.us-west-2.amazonaws.com\"\n          }\n        }\n      },\n      \"monitoring\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"http\", \"https\" ]\n        },\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-south-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-3\" : { },\n          \"ap-southeast-4\" : { },\n          \"ap-southeast-5\" : { },\n          \"ap-southeast-6\" : { },\n          \"ap-southeast-7\" : { },\n          \"ca-central-1\" : { },\n          \"ca-west-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-central-2\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"monitoring-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"monitoring-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"monitoring-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"monitoring-fips.us-west-2.amazonaws.com\"\n          },\n          \"il-central-1\" : { },\n          \"me-central-1\" : { },\n          \"me-south-1\" : { },\n          \"mx-central-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"monitoring-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"monitoring-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"monitoring-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"monitoring-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"mq\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-south-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-3\" : { },\n          \"ap-southeast-4\" : { },\n          \"ap-southeast-5\" : { },\n          \"ap-southeast-7\" : { },\n          \"ca-central-1\" : { },\n          \"ca-west-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-central-2\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"mq-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"mq-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"mq-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"mq-fips.us-west-2.amazonaws.com\"\n          },\n          \"il-central-1\" : { },\n          \"me-central-1\" : { },\n          \"me-south-1\" : { },\n          \"mx-central-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"mq-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"mq-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"mq-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"mq-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"mturk-requester\" : {\n        \"endpoints\" : {\n          \"sandbox\" : {\n            \"hostname\" : \"mturk-requester-sandbox.us-east-1.amazonaws.com\"\n          },\n          \"us-east-1\" : { }\n        },\n        \"isRegionalized\" : false\n      },\n      \"neptune\" : {\n        \"endpoints\" : {\n          \"ap-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-east-1\"\n            },\n            \"hostname\" : \"rds.ap-east-1.amazonaws.com\"\n          },\n          \"ap-northeast-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-northeast-1\"\n            },\n            \"hostname\" : \"rds.ap-northeast-1.amazonaws.com\"\n          },\n          \"ap-northeast-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-northeast-2\"\n            },\n            \"hostname\" : \"rds.ap-northeast-2.amazonaws.com\"\n          },\n          \"ap-south-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-south-1\"\n            },\n            \"hostname\" : \"rds.ap-south-1.amazonaws.com\"\n          },\n          \"ap-southeast-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-southeast-1\"\n            },\n            \"hostname\" : \"rds.ap-southeast-1.amazonaws.com\"\n          },\n          \"ap-southeast-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-southeast-2\"\n            },\n            \"hostname\" : \"rds.ap-southeast-2.amazonaws.com\"\n          },\n          \"ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"hostname\" : \"rds.ca-central-1.amazonaws.com\"\n          },\n          \"eu-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-central-1\"\n            },\n            \"hostname\" : \"rds.eu-central-1.amazonaws.com\"\n          },\n          \"eu-north-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-north-1\"\n            },\n            \"hostname\" : \"rds.eu-north-1.amazonaws.com\"\n          },\n          \"eu-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-west-1\"\n            },\n            \"hostname\" : \"rds.eu-west-1.amazonaws.com\"\n          },\n          \"eu-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-west-2\"\n            },\n            \"hostname\" : \"rds.eu-west-2.amazonaws.com\"\n          },\n          \"eu-west-3\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-west-3\"\n            },\n            \"hostname\" : \"rds.eu-west-3.amazonaws.com\"\n          },\n          \"me-south-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"me-south-1\"\n            },\n            \"hostname\" : \"rds.me-south-1.amazonaws.com\"\n          },\n          \"sa-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"sa-east-1\"\n            },\n            \"hostname\" : \"rds.sa-east-1.amazonaws.com\"\n          },\n          \"us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"hostname\" : \"rds.us-east-1.amazonaws.com\"\n          },\n          \"us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"hostname\" : \"rds.us-east-2.amazonaws.com\"\n          },\n          \"us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"hostname\" : \"rds.us-west-1.amazonaws.com\"\n          },\n          \"us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"hostname\" : \"rds.us-west-2.amazonaws.com\"\n          }\n        }\n      },\n      \"network-firewall\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-south-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-3\" : { },\n          \"ap-southeast-4\" : { },\n          \"ap-southeast-5\" : { },\n          \"ap-southeast-7\" : { },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"network-firewall-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ca-west-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-central-2\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"fips-ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"network-firewall-fips.ca-central-1.amazonaws.com\"\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"network-firewall-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"network-firewall-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"network-firewall-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"network-firewall-fips.us-west-2.amazonaws.com\"\n          },\n          \"il-central-1\" : { },\n          \"me-central-1\" : { },\n          \"me-south-1\" : { },\n          \"mx-central-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"network-firewall-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"network-firewall-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"network-firewall-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"network-firewall-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"networkmanager\" : {\n        \"endpoints\" : {\n          \"aws-global\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"hostname\" : \"networkmanager.us-west-2.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"networkmanager-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"networkmanager-fips.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"networkmanager.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"fips-aws-global\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"networkmanager-fips.us-west-2.amazonaws.com\"\n          }\n        },\n        \"isRegionalized\" : false,\n        \"partitionEndpoint\" : \"aws-global\"\n      },\n      \"notifications\" : {\n        \"defaults\" : {\n          \"dnsSuffix\" : \"api.aws\",\n          \"variants\" : [ {\n            \"dnsSuffix\" : \"api.aws\",\n            \"hostname\" : \"{service}-fips.{region}.{dnsSuffix}\",\n            \"tags\" : [ \"fips\" ]\n          } ]\n        },\n        \"endpoints\" : {\n          \"af-south-1\" : {\n            \"hostname\" : \"notifications.af-south-1.api.aws\"\n          },\n          \"ap-east-1\" : {\n            \"hostname\" : \"notifications.ap-east-1.api.aws\"\n          },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : {\n            \"hostname\" : \"notifications.ap-northeast-1.api.aws\"\n          },\n          \"ap-northeast-2\" : {\n            \"hostname\" : \"notifications.ap-northeast-2.api.aws\"\n          },\n          \"ap-northeast-3\" : {\n            \"hostname\" : \"notifications.ap-northeast-3.api.aws\"\n          },\n          \"ap-south-1\" : {\n            \"hostname\" : \"notifications.ap-south-1.api.aws\"\n          },\n          \"ap-south-2\" : {\n            \"hostname\" : \"notifications.ap-south-2.api.aws\"\n          },\n          \"ap-southeast-1\" : {\n            \"hostname\" : \"notifications.ap-southeast-1.api.aws\"\n          },\n          \"ap-southeast-2\" : {\n            \"hostname\" : \"notifications.ap-southeast-2.api.aws\"\n          },\n          \"ap-southeast-3\" : {\n            \"hostname\" : \"notifications.ap-southeast-3.api.aws\"\n          },\n          \"ap-southeast-4\" : {\n            \"hostname\" : \"notifications.ap-southeast-4.api.aws\"\n          },\n          \"ap-southeast-5\" : {\n            \"hostname\" : \"notifications.ap-southeast-5.api.aws\"\n          },\n          \"ap-southeast-6\" : { },\n          \"ap-southeast-7\" : {\n            \"hostname\" : \"notifications.ap-southeast-7.api.aws\"\n          },\n          \"ca-central-1\" : {\n            \"hostname\" : \"notifications.ca-central-1.api.aws\"\n          },\n          \"ca-west-1\" : {\n            \"hostname\" : \"notifications.ca-west-1.api.aws\"\n          },\n          \"eu-central-1\" : {\n            \"hostname\" : \"notifications.eu-central-1.api.aws\"\n          },\n          \"eu-central-2\" : {\n            \"hostname\" : \"notifications.eu-central-2.api.aws\"\n          },\n          \"eu-north-1\" : {\n            \"hostname\" : \"notifications.eu-north-1.api.aws\"\n          },\n          \"eu-south-1\" : {\n            \"hostname\" : \"notifications.eu-south-1.api.aws\"\n          },\n          \"eu-south-2\" : {\n            \"hostname\" : \"notifications.eu-south-2.api.aws\"\n          },\n          \"eu-west-1\" : {\n            \"hostname\" : \"notifications.eu-west-1.api.aws\"\n          },\n          \"eu-west-2\" : {\n            \"hostname\" : \"notifications.eu-west-2.api.aws\"\n          },\n          \"eu-west-3\" : {\n            \"hostname\" : \"notifications.eu-west-3.api.aws\"\n          },\n          \"il-central-1\" : {\n            \"hostname\" : \"notifications.il-central-1.api.aws\"\n          },\n          \"me-central-1\" : {\n            \"hostname\" : \"notifications.me-central-1.api.aws\"\n          },\n          \"me-south-1\" : {\n            \"hostname\" : \"notifications.me-south-1.api.aws\"\n          },\n          \"mx-central-1\" : {\n            \"hostname\" : \"notifications.mx-central-1.api.aws\"\n          },\n          \"sa-east-1\" : {\n            \"hostname\" : \"notifications.sa-east-1.api.aws\"\n          },\n          \"us-east-1\" : {\n            \"hostname\" : \"notifications.us-east-1.api.aws\"\n          },\n          \"us-east-2\" : {\n            \"hostname\" : \"notifications.us-east-2.api.aws\"\n          },\n          \"us-west-1\" : {\n            \"hostname\" : \"notifications.us-west-1.api.aws\"\n          },\n          \"us-west-2\" : {\n            \"hostname\" : \"notifications.us-west-2.api.aws\"\n          }\n        }\n      },\n      \"notifications-contacts\" : {\n        \"endpoints\" : {\n          \"aws-global\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"hostname\" : \"notifications-contacts.us-east-1.api.aws\"\n          }\n        },\n        \"isRegionalized\" : false,\n        \"partitionEndpoint\" : \"aws-global\"\n      },\n      \"oam\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-south-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-3\" : { },\n          \"ap-southeast-4\" : { },\n          \"ap-southeast-5\" : { },\n          \"ap-southeast-6\" : { },\n          \"ap-southeast-7\" : { },\n          \"ca-central-1\" : { },\n          \"ca-west-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-central-2\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"il-central-1\" : { },\n          \"me-central-1\" : { },\n          \"me-south-1\" : { },\n          \"mx-central-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : { },\n          \"us-east-2\" : { },\n          \"us-west-1\" : { },\n          \"us-west-2\" : { }\n        }\n      },\n      \"oidc\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"af-south-1\"\n            },\n            \"hostname\" : \"oidc.af-south-1.amazonaws.com\"\n          },\n          \"ap-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-east-1\"\n            },\n            \"hostname\" : \"oidc.ap-east-1.amazonaws.com\"\n          },\n          \"ap-northeast-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-northeast-1\"\n            },\n            \"hostname\" : \"oidc.ap-northeast-1.amazonaws.com\"\n          },\n          \"ap-northeast-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-northeast-2\"\n            },\n            \"hostname\" : \"oidc.ap-northeast-2.amazonaws.com\"\n          },\n          \"ap-northeast-3\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-northeast-3\"\n            },\n            \"hostname\" : \"oidc.ap-northeast-3.amazonaws.com\"\n          },\n          \"ap-south-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-south-1\"\n            },\n            \"hostname\" : \"oidc.ap-south-1.amazonaws.com\"\n          },\n          \"ap-south-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-south-2\"\n            },\n            \"hostname\" : \"oidc.ap-south-2.amazonaws.com\"\n          },\n          \"ap-southeast-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-southeast-1\"\n            },\n            \"hostname\" : \"oidc.ap-southeast-1.amazonaws.com\"\n          },\n          \"ap-southeast-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-southeast-2\"\n            },\n            \"hostname\" : \"oidc.ap-southeast-2.amazonaws.com\"\n          },\n          \"ap-southeast-3\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-southeast-3\"\n            },\n            \"hostname\" : \"oidc.ap-southeast-3.amazonaws.com\"\n          },\n          \"ap-southeast-4\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-southeast-4\"\n            },\n            \"hostname\" : \"oidc.ap-southeast-4.amazonaws.com\"\n          },\n          \"ap-southeast-5\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-southeast-5\"\n            },\n            \"hostname\" : \"oidc.ap-southeast-5.amazonaws.com\"\n          },\n          \"ap-southeast-7\" : { },\n          \"ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"hostname\" : \"oidc.ca-central-1.amazonaws.com\"\n          },\n          \"ca-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-west-1\"\n            },\n            \"hostname\" : \"oidc.ca-west-1.amazonaws.com\"\n          },\n          \"eu-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-central-1\"\n            },\n            \"hostname\" : \"oidc.eu-central-1.amazonaws.com\"\n          },\n          \"eu-central-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-central-2\"\n            },\n            \"hostname\" : \"oidc.eu-central-2.amazonaws.com\"\n          },\n          \"eu-north-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-north-1\"\n            },\n            \"hostname\" : \"oidc.eu-north-1.amazonaws.com\"\n          },\n          \"eu-south-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-south-1\"\n            },\n            \"hostname\" : \"oidc.eu-south-1.amazonaws.com\"\n          },\n          \"eu-south-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-south-2\"\n            },\n            \"hostname\" : \"oidc.eu-south-2.amazonaws.com\"\n          },\n          \"eu-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-west-1\"\n            },\n            \"hostname\" : \"oidc.eu-west-1.amazonaws.com\"\n          },\n          \"eu-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-west-2\"\n            },\n            \"hostname\" : \"oidc.eu-west-2.amazonaws.com\"\n          },\n          \"eu-west-3\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-west-3\"\n            },\n            \"hostname\" : \"oidc.eu-west-3.amazonaws.com\"\n          },\n          \"il-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"il-central-1\"\n            },\n            \"hostname\" : \"oidc.il-central-1.amazonaws.com\"\n          },\n          \"me-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"me-central-1\"\n            },\n            \"hostname\" : \"oidc.me-central-1.amazonaws.com\"\n          },\n          \"me-south-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"me-south-1\"\n            },\n            \"hostname\" : \"oidc.me-south-1.amazonaws.com\"\n          },\n          \"mx-central-1\" : { },\n          \"sa-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"sa-east-1\"\n            },\n            \"hostname\" : \"oidc.sa-east-1.amazonaws.com\"\n          },\n          \"us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"hostname\" : \"oidc.us-east-1.amazonaws.com\"\n          },\n          \"us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"hostname\" : \"oidc.us-east-2.amazonaws.com\"\n          },\n          \"us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"hostname\" : \"oidc.us-west-1.amazonaws.com\"\n          },\n          \"us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"hostname\" : \"oidc.us-west-2.amazonaws.com\"\n          }\n        }\n      },\n      \"omics\" : {\n        \"endpoints\" : {\n          \"ap-northeast-2\" : { },\n          \"ap-southeast-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-southeast-1\"\n            },\n            \"hostname\" : \"omics.ap-southeast-1.amazonaws.com\"\n          },\n          \"eu-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-central-1\"\n            },\n            \"hostname\" : \"omics.eu-central-1.amazonaws.com\"\n          },\n          \"eu-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-west-1\"\n            },\n            \"hostname\" : \"omics.eu-west-1.amazonaws.com\"\n          },\n          \"eu-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-west-2\"\n            },\n            \"hostname\" : \"omics.eu-west-2.amazonaws.com\"\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"omics-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"omics-fips.us-west-2.amazonaws.com\"\n          },\n          \"il-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"il-central-1\"\n            },\n            \"hostname\" : \"omics.il-central-1.amazonaws.com\"\n          },\n          \"us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"hostname\" : \"omics.us-east-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"omics-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"hostname\" : \"omics.us-west-2.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"omics-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"organizations\" : {\n        \"endpoints\" : {\n          \"aws-global\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"hostname\" : \"organizations.us-east-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"organizations-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"fips-aws-global\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"organizations-fips.us-east-1.amazonaws.com\"\n          }\n        },\n        \"isRegionalized\" : false,\n        \"partitionEndpoint\" : \"aws-global\"\n      },\n      \"osis\" : {\n        \"endpoints\" : {\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-south-1\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ca-central-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : { },\n          \"us-east-2\" : { },\n          \"us-west-1\" : { },\n          \"us-west-2\" : { }\n        }\n      },\n      \"outposts\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-3\" : { },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"outposts-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-central-1\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"fips-ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"outposts-fips.ca-central-1.amazonaws.com\"\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"outposts-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"outposts-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"outposts-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"outposts-fips.us-west-2.amazonaws.com\"\n          },\n          \"il-central-1\" : { },\n          \"me-central-1\" : { },\n          \"me-south-1\" : { },\n          \"mx-central-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"outposts-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"outposts-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"outposts-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"outposts-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"participant.connect\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ca-central-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-west-2\" : { },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"participant.connect-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"participant.connect-fips.us-west-2.amazonaws.com\"\n          },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"participant.connect-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"participant.connect-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"personalize\" : {\n        \"endpoints\" : {\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-south-1\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ca-central-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-west-1\" : { },\n          \"us-east-1\" : { },\n          \"us-east-2\" : { },\n          \"us-west-2\" : { }\n        }\n      },\n      \"pi\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : {\n            \"protocols\" : [ \"https\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"pi.af-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-east-1\" : {\n            \"protocols\" : [ \"https\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"pi.ap-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : {\n            \"protocols\" : [ \"https\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"pi.ap-northeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-2\" : {\n            \"protocols\" : [ \"https\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"pi.ap-northeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-3\" : {\n            \"protocols\" : [ \"https\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"pi.ap-northeast-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-1\" : {\n            \"protocols\" : [ \"https\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"pi.ap-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-2\" : {\n            \"protocols\" : [ \"https\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"pi.ap-south-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-1\" : {\n            \"protocols\" : [ \"https\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"pi.ap-southeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-2\" : {\n            \"protocols\" : [ \"https\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"pi.ap-southeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-3\" : {\n            \"protocols\" : [ \"https\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"pi.ap-southeast-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-4\" : {\n            \"protocols\" : [ \"https\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"pi.ap-southeast-4.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-5\" : {\n            \"protocols\" : [ \"https\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"pi.ap-southeast-5.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-6\" : { },\n          \"ap-southeast-7\" : {\n            \"protocols\" : [ \"https\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"pi.ap-southeast-7.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ca-central-1\" : {\n            \"protocols\" : [ \"https\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"pi-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"pi-fips.ca-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"pi.ca-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ca-west-1\" : {\n            \"protocols\" : [ \"https\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"pi-fips.ca-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"pi-fips.ca-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"pi.ca-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-central-1\" : {\n            \"protocols\" : [ \"https\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"pi.eu-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-central-2\" : {\n            \"protocols\" : [ \"https\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"pi.eu-central-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-north-1\" : {\n            \"protocols\" : [ \"https\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"pi.eu-north-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-1\" : {\n            \"protocols\" : [ \"https\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"pi.eu-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-2\" : {\n            \"protocols\" : [ \"https\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"pi.eu-south-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-1\" : {\n            \"protocols\" : [ \"https\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"pi.eu-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-2\" : {\n            \"protocols\" : [ \"https\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"pi.eu-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-3\" : {\n            \"protocols\" : [ \"https\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"pi.eu-west-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"fips-ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"pi-fips.ca-central-1.amazonaws.com\"\n          },\n          \"fips-ca-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"pi-fips.ca-west-1.amazonaws.com\"\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"pi-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"pi-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"pi-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"pi-fips.us-west-2.amazonaws.com\"\n          },\n          \"il-central-1\" : {\n            \"protocols\" : [ \"https\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"pi.il-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"me-central-1\" : {\n            \"protocols\" : [ \"https\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"pi.me-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"me-south-1\" : {\n            \"protocols\" : [ \"https\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"pi.me-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"mx-central-1\" : {\n            \"protocols\" : [ \"https\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"pi.mx-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"sa-east-1\" : {\n            \"protocols\" : [ \"https\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"pi.sa-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-1\" : {\n            \"protocols\" : [ \"https\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"pi-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"pi-fips.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"pi.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"protocols\" : [ \"https\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"pi-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"pi-fips.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"pi.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"protocols\" : [ \"https\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"pi-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"pi-fips.us-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"pi.us-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"protocols\" : [ \"https\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"pi-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"pi-fips.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"pi.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"pinpoint\" : {\n        \"defaults\" : {\n          \"credentialScope\" : {\n            \"service\" : \"mobiletargeting\"\n          }\n        },\n        \"endpoints\" : {\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-south-1\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"hostname\" : \"pinpoint.ca-central-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"pinpoint-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-central-1\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"fips-ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"pinpoint-fips.ca-central-1.amazonaws.com\"\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"pinpoint-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"pinpoint-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"pinpoint-fips.us-west-2.amazonaws.com\"\n          },\n          \"us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"hostname\" : \"pinpoint.us-east-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"pinpoint-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"hostname\" : \"pinpoint.us-east-2.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"pinpoint-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"hostname\" : \"pinpoint.us-west-2.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"pinpoint-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"pipes\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-south-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-3\" : { },\n          \"ca-central-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-central-2\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"me-central-1\" : { },\n          \"me-south-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : { },\n          \"us-east-2\" : { },\n          \"us-west-1\" : { },\n          \"us-west-2\" : { }\n        }\n      },\n      \"polly\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"polly.af-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"polly.ap-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"polly.ap-northeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"polly.ap-northeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"polly.ap-northeast-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"polly.ap-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"polly.ap-southeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"polly.ap-southeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-5\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"polly.ap-southeast-5.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"polly-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"polly-fips.ca-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"polly.ca-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"polly.eu-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-north-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"polly.eu-north-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"polly.eu-south-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"polly.eu-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"polly.eu-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"polly.eu-west-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"fips-ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"polly-fips.ca-central-1.amazonaws.com\"\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"polly-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"polly-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"polly-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"polly-fips.us-west-2.amazonaws.com\"\n          },\n          \"me-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"polly.me-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"sa-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"polly.sa-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"polly-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"polly-fips.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"polly.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"polly-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"polly-fips.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"polly.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"polly-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"polly-fips.us-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"polly.us-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"polly-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"polly-fips.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"polly.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"portal.sso\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"af-south-1\"\n            },\n            \"hostname\" : \"portal.sso.af-south-1.amazonaws.com\"\n          },\n          \"ap-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-east-1\"\n            },\n            \"hostname\" : \"portal.sso.ap-east-1.amazonaws.com\"\n          },\n          \"ap-northeast-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-northeast-1\"\n            },\n            \"hostname\" : \"portal.sso.ap-northeast-1.amazonaws.com\"\n          },\n          \"ap-northeast-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-northeast-2\"\n            },\n            \"hostname\" : \"portal.sso.ap-northeast-2.amazonaws.com\"\n          },\n          \"ap-northeast-3\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-northeast-3\"\n            },\n            \"hostname\" : \"portal.sso.ap-northeast-3.amazonaws.com\"\n          },\n          \"ap-south-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-south-1\"\n            },\n            \"hostname\" : \"portal.sso.ap-south-1.amazonaws.com\"\n          },\n          \"ap-south-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-south-2\"\n            },\n            \"hostname\" : \"portal.sso.ap-south-2.amazonaws.com\"\n          },\n          \"ap-southeast-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-southeast-1\"\n            },\n            \"hostname\" : \"portal.sso.ap-southeast-1.amazonaws.com\"\n          },\n          \"ap-southeast-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-southeast-2\"\n            },\n            \"hostname\" : \"portal.sso.ap-southeast-2.amazonaws.com\"\n          },\n          \"ap-southeast-3\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-southeast-3\"\n            },\n            \"hostname\" : \"portal.sso.ap-southeast-3.amazonaws.com\"\n          },\n          \"ap-southeast-4\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-southeast-4\"\n            },\n            \"hostname\" : \"portal.sso.ap-southeast-4.amazonaws.com\"\n          },\n          \"ap-southeast-5\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-southeast-5\"\n            },\n            \"hostname\" : \"portal.sso.ap-southeast-5.amazonaws.com\"\n          },\n          \"ap-southeast-7\" : { },\n          \"ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"hostname\" : \"portal.sso.ca-central-1.amazonaws.com\"\n          },\n          \"ca-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-west-1\"\n            },\n            \"hostname\" : \"portal.sso.ca-west-1.amazonaws.com\"\n          },\n          \"eu-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-central-1\"\n            },\n            \"hostname\" : \"portal.sso.eu-central-1.amazonaws.com\"\n          },\n          \"eu-central-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-central-2\"\n            },\n            \"hostname\" : \"portal.sso.eu-central-2.amazonaws.com\"\n          },\n          \"eu-north-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-north-1\"\n            },\n            \"hostname\" : \"portal.sso.eu-north-1.amazonaws.com\"\n          },\n          \"eu-south-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-south-1\"\n            },\n            \"hostname\" : \"portal.sso.eu-south-1.amazonaws.com\"\n          },\n          \"eu-south-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-south-2\"\n            },\n            \"hostname\" : \"portal.sso.eu-south-2.amazonaws.com\"\n          },\n          \"eu-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-west-1\"\n            },\n            \"hostname\" : \"portal.sso.eu-west-1.amazonaws.com\"\n          },\n          \"eu-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-west-2\"\n            },\n            \"hostname\" : \"portal.sso.eu-west-2.amazonaws.com\"\n          },\n          \"eu-west-3\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-west-3\"\n            },\n            \"hostname\" : \"portal.sso.eu-west-3.amazonaws.com\"\n          },\n          \"il-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"il-central-1\"\n            },\n            \"hostname\" : \"portal.sso.il-central-1.amazonaws.com\"\n          },\n          \"me-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"me-central-1\"\n            },\n            \"hostname\" : \"portal.sso.me-central-1.amazonaws.com\"\n          },\n          \"me-south-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"me-south-1\"\n            },\n            \"hostname\" : \"portal.sso.me-south-1.amazonaws.com\"\n          },\n          \"mx-central-1\" : { },\n          \"sa-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"sa-east-1\"\n            },\n            \"hostname\" : \"portal.sso.sa-east-1.amazonaws.com\"\n          },\n          \"us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"hostname\" : \"portal.sso.us-east-1.amazonaws.com\"\n          },\n          \"us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"hostname\" : \"portal.sso.us-east-2.amazonaws.com\"\n          },\n          \"us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"hostname\" : \"portal.sso.us-west-1.amazonaws.com\"\n          },\n          \"us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"hostname\" : \"portal.sso.us-west-2.amazonaws.com\"\n          }\n        }\n      },\n      \"profile\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"profile-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-central-1\" : { },\n          \"eu-west-2\" : { },\n          \"fips-ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"profile-fips.ca-central-1.amazonaws.com\"\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"profile-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"profile-fips.us-west-2.amazonaws.com\"\n          },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"profile-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"profile-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"proton\" : {\n        \"endpoints\" : {\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ca-central-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"us-east-1\" : { },\n          \"us-east-2\" : { },\n          \"us-west-2\" : { }\n        }\n      },\n      \"qbusiness\" : {\n        \"defaults\" : {\n          \"dnsSuffix\" : \"api.aws\",\n          \"variants\" : [ {\n            \"dnsSuffix\" : \"api.aws\",\n            \"hostname\" : \"{service}-fips.{region}.{dnsSuffix}\",\n            \"tags\" : [ \"fips\" ]\n          } ]\n        },\n        \"endpoints\" : {\n          \"af-south-1\" : {\n            \"hostname\" : \"qbusiness.af-south-1.api.aws\"\n          },\n          \"ap-east-1\" : {\n            \"hostname\" : \"qbusiness.ap-east-1.api.aws\"\n          },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : {\n            \"hostname\" : \"qbusiness.ap-northeast-1.api.aws\"\n          },\n          \"ap-northeast-2\" : {\n            \"hostname\" : \"qbusiness.ap-northeast-2.api.aws\"\n          },\n          \"ap-northeast-3\" : {\n            \"hostname\" : \"qbusiness.ap-northeast-3.api.aws\"\n          },\n          \"ap-south-1\" : {\n            \"hostname\" : \"qbusiness.ap-south-1.api.aws\"\n          },\n          \"ap-south-2\" : {\n            \"hostname\" : \"qbusiness.ap-south-2.api.aws\"\n          },\n          \"ap-southeast-1\" : {\n            \"hostname\" : \"qbusiness.ap-southeast-1.api.aws\"\n          },\n          \"ap-southeast-2\" : {\n            \"hostname\" : \"qbusiness.ap-southeast-2.api.aws\"\n          },\n          \"ap-southeast-3\" : {\n            \"hostname\" : \"qbusiness.ap-southeast-3.api.aws\"\n          },\n          \"ap-southeast-4\" : {\n            \"hostname\" : \"qbusiness.ap-southeast-4.api.aws\"\n          },\n          \"ap-southeast-5\" : {\n            \"hostname\" : \"qbusiness.ap-southeast-5.api.aws\"\n          },\n          \"ap-southeast-6\" : { },\n          \"ap-southeast-7\" : {\n            \"hostname\" : \"qbusiness.ap-southeast-7.api.aws\"\n          },\n          \"ca-central-1\" : {\n            \"hostname\" : \"qbusiness.ca-central-1.api.aws\"\n          },\n          \"ca-west-1\" : {\n            \"hostname\" : \"qbusiness.ca-west-1.api.aws\"\n          },\n          \"eu-central-1\" : {\n            \"hostname\" : \"qbusiness.eu-central-1.api.aws\"\n          },\n          \"eu-central-2\" : {\n            \"hostname\" : \"qbusiness.eu-central-2.api.aws\"\n          },\n          \"eu-north-1\" : {\n            \"hostname\" : \"qbusiness.eu-north-1.api.aws\"\n          },\n          \"eu-south-1\" : {\n            \"hostname\" : \"qbusiness.eu-south-1.api.aws\"\n          },\n          \"eu-south-2\" : {\n            \"hostname\" : \"qbusiness.eu-south-2.api.aws\"\n          },\n          \"eu-west-1\" : {\n            \"hostname\" : \"qbusiness.eu-west-1.api.aws\"\n          },\n          \"eu-west-2\" : {\n            \"hostname\" : \"qbusiness.eu-west-2.api.aws\"\n          },\n          \"eu-west-3\" : {\n            \"hostname\" : \"qbusiness.eu-west-3.api.aws\"\n          },\n          \"il-central-1\" : {\n            \"hostname\" : \"qbusiness.il-central-1.api.aws\"\n          },\n          \"me-central-1\" : {\n            \"hostname\" : \"qbusiness.me-central-1.api.aws\"\n          },\n          \"me-south-1\" : {\n            \"hostname\" : \"qbusiness.me-south-1.api.aws\"\n          },\n          \"mx-central-1\" : {\n            \"hostname\" : \"qbusiness.mx-central-1.api.aws\"\n          },\n          \"sa-east-1\" : {\n            \"hostname\" : \"qbusiness.sa-east-1.api.aws\"\n          },\n          \"us-east-1\" : {\n            \"hostname\" : \"qbusiness.us-east-1.api.aws\"\n          },\n          \"us-east-2\" : {\n            \"hostname\" : \"qbusiness.us-east-2.api.aws\"\n          },\n          \"us-west-1\" : {\n            \"hostname\" : \"qbusiness.us-west-1.api.aws\"\n          },\n          \"us-west-2\" : {\n            \"hostname\" : \"qbusiness.us-west-2.api.aws\"\n          }\n        }\n      },\n      \"qldb\" : {\n        \"endpoints\" : {\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"qldb-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-central-1\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"fips-ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"qldb-fips.ca-central-1.amazonaws.com\"\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"qldb-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"qldb-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"qldb-fips.us-west-2.amazonaws.com\"\n          },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"qldb-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"qldb-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"qldb-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"query.timestream\" : {\n        \"endpoints\" : {\n          \"ap-northeast-1\" : { },\n          \"ap-south-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"eu-central-1\" : { },\n          \"eu-west-1\" : { },\n          \"us-east-1\" : { },\n          \"us-east-2\" : { },\n          \"us-west-2\" : { }\n        }\n      },\n      \"quicksight\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-south-1\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-3\" : { },\n          \"ca-central-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-central-2\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"il-central-1\" : { },\n          \"me-central-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : { },\n          \"us-east-2\" : { },\n          \"us-west-2\" : { }\n        }\n      },\n      \"ram\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-east-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-2\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-3\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-2\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-2\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-3\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-4\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-5\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-6\" : { },\n          \"ap-southeast-7\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            }, {\n              \"hostname\" : \"ram-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"ram-fips.ca-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            } ]\n          },\n          \"ca-west-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            }, {\n              \"hostname\" : \"ram-fips.ca-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"ram-fips.ca-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            } ]\n          },\n          \"eu-central-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-central-2\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-north-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-2\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-2\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-3\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"fips-ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"ram-fips.ca-central-1.amazonaws.com\"\n          },\n          \"fips-ca-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"ram-fips.ca-west-1.amazonaws.com\"\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"ram-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"ram-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"ram-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"ram-fips.us-west-2.amazonaws.com\"\n          },\n          \"il-central-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"me-central-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"me-south-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"mx-central-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"sa-east-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            }, {\n              \"hostname\" : \"ram-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"ram-fips.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            }, {\n              \"hostname\" : \"ram-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"ram-fips.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            }, {\n              \"hostname\" : \"ram-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"ram-fips.us-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            }, {\n              \"hostname\" : \"ram-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"ram-fips.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"rbin\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"rbin.af-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"rbin.ap-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"rbin.ap-northeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"rbin.ap-northeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"rbin.ap-northeast-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"rbin.ap-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"rbin.ap-south-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"rbin.ap-southeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"rbin.ap-southeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"rbin.ap-southeast-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-4\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"rbin.ap-southeast-4.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-5\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"rbin.ap-southeast-5.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-6\" : { },\n          \"ap-southeast-7\" : { },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"rbin-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"rbin-fips.ca-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"rbin.ca-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ca-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"rbin-fips.ca-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"rbin-fips.ca-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"rbin.ca-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"rbin.eu-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-central-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"rbin.eu-central-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-north-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"rbin.eu-north-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"rbin.eu-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"rbin.eu-south-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"rbin.eu-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"rbin.eu-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"rbin.eu-west-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"fips-ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"rbin-fips.ca-central-1.amazonaws.com\"\n          },\n          \"fips-ca-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"rbin-fips.ca-west-1.amazonaws.com\"\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"rbin-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"rbin-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"rbin-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"rbin-fips.us-west-2.amazonaws.com\"\n          },\n          \"il-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"rbin.il-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"me-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"rbin.me-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"me-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"rbin.me-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"mx-central-1\" : { },\n          \"sa-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"rbin.sa-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"rbin-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"rbin-fips.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"rbin.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"rbin-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"rbin-fips.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"rbin.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"rbin-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"rbin-fips.us-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"rbin.us-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"rbin-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"rbin-fips.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"rbin.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"rds\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-south-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-3\" : { },\n          \"ap-southeast-4\" : { },\n          \"ap-southeast-5\" : { },\n          \"ap-southeast-6\" : { },\n          \"ap-southeast-7\" : { },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"rds-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ca-central-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"rds-fips.ca-central-1.amazonaws.com\"\n          },\n          \"ca-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"rds-fips.ca-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ca-west-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"rds-fips.ca-west-1.amazonaws.com\"\n          },\n          \"eu-central-1\" : { },\n          \"eu-central-2\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"il-central-1\" : { },\n          \"me-central-1\" : { },\n          \"me-south-1\" : { },\n          \"mx-central-1\" : { },\n          \"rds-fips.ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"rds-fips.ca-central-1.amazonaws.com\"\n          },\n          \"rds-fips.ca-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"rds-fips.ca-west-1.amazonaws.com\"\n          },\n          \"rds-fips.us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"rds-fips.us-east-1.amazonaws.com\"\n          },\n          \"rds-fips.us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"rds-fips.us-east-2.amazonaws.com\"\n          },\n          \"rds-fips.us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"rds-fips.us-west-1.amazonaws.com\"\n          },\n          \"rds-fips.us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"rds-fips.us-west-2.amazonaws.com\"\n          },\n          \"rds.ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"variants\" : [ {\n              \"hostname\" : \"rds-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"rds.ca-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-west-1\"\n            },\n            \"deprecated\" : true,\n            \"variants\" : [ {\n              \"hostname\" : \"rds-fips.ca-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"rds.us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"variants\" : [ {\n              \"hostname\" : \"rds-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"rds.us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"variants\" : [ {\n              \"hostname\" : \"rds-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"rds.us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"variants\" : [ {\n              \"hostname\" : \"rds-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"rds.us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"variants\" : [ {\n              \"hostname\" : \"rds-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : {\n            \"sslCommonName\" : \"{service}.{dnsSuffix}\",\n            \"variants\" : [ {\n              \"hostname\" : \"rds-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"rds-fips.us-east-1.amazonaws.com\"\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"rds-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"rds-fips.us-east-2.amazonaws.com\"\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"rds-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"rds-fips.us-west-1.amazonaws.com\"\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"rds-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"rds-fips.us-west-2.amazonaws.com\"\n          }\n        }\n      },\n      \"rds-data\" : {\n        \"endpoints\" : {\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-south-1\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ca-central-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"rds-data-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"rds-data-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"rds-data-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"rds-data-fips.us-west-2.amazonaws.com\"\n          },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"rds-data-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"rds-data-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"rds-data-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"rds-data-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"redshift\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-south-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-3\" : { },\n          \"ap-southeast-4\" : { },\n          \"ap-southeast-5\" : { },\n          \"ap-southeast-6\" : { },\n          \"ap-southeast-7\" : { },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"redshift-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ca-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"redshift-fips.ca-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-central-1\" : { },\n          \"eu-central-2\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"fips-ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"redshift-fips.ca-central-1.amazonaws.com\"\n          },\n          \"fips-ca-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"redshift-fips.ca-west-1.amazonaws.com\"\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"redshift-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"redshift-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"redshift-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"redshift-fips.us-west-2.amazonaws.com\"\n          },\n          \"il-central-1\" : { },\n          \"me-central-1\" : { },\n          \"me-south-1\" : { },\n          \"mx-central-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"redshift-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"redshift-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"redshift-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"redshift-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"redshift-serverless\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-south-1\" : { },\n          \"ap-south-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-3\" : { },\n          \"ap-southeast-7\" : { },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"redshift-serverless-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-central-1\" : { },\n          \"eu-central-2\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"fips-ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"redshift-serverless-fips.ca-central-1.amazonaws.com\"\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"redshift-serverless-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"redshift-serverless-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"redshift-serverless-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"redshift-serverless-fips.us-west-2.amazonaws.com\"\n          },\n          \"il-central-1\" : { },\n          \"me-central-1\" : { },\n          \"mx-central-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"redshift-serverless-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"redshift-serverless-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"redshift-serverless-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"redshift-serverless-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"rekognition\" : {\n        \"endpoints\" : {\n          \"ap-northeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"rekognition.ap-northeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"rekognition.ap-northeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"rekognition.ap-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"rekognition.ap-southeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"rekognition.ap-southeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"rekognition-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"rekognition-fips.ca-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"rekognition.ca-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ca-central-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"rekognition-fips.ca-central-1.amazonaws.com\"\n          },\n          \"eu-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"rekognition.eu-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"rekognition.eu-south-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"rekognition.eu-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"rekognition.eu-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"il-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"rekognition.il-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"rekognition-fips.ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"rekognition-fips.ca-central-1.amazonaws.com\"\n          },\n          \"rekognition-fips.us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"rekognition-fips.us-east-1.amazonaws.com\"\n          },\n          \"rekognition-fips.us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"rekognition-fips.us-east-2.amazonaws.com\"\n          },\n          \"rekognition-fips.us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"rekognition-fips.us-west-1.amazonaws.com\"\n          },\n          \"rekognition-fips.us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"rekognition-fips.us-west-2.amazonaws.com\"\n          },\n          \"rekognition.ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"variants\" : [ {\n              \"hostname\" : \"rekognition-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"rekognition.us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"variants\" : [ {\n              \"hostname\" : \"rekognition-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"rekognition.us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"variants\" : [ {\n              \"hostname\" : \"rekognition-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"rekognition.us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"variants\" : [ {\n              \"hostname\" : \"rekognition-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"rekognition.us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"variants\" : [ {\n              \"hostname\" : \"rekognition-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"rekognition-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"rekognition-fips.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"rekognition.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"rekognition-fips.us-east-1.amazonaws.com\"\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"rekognition-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"rekognition-fips.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"rekognition.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-2-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"rekognition-fips.us-east-2.amazonaws.com\"\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"rekognition-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"rekognition-fips.us-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"rekognition.us-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"rekognition-fips.us-west-1.amazonaws.com\"\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"rekognition-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"rekognition-fips.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"rekognition.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-2-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"rekognition-fips.us-west-2.amazonaws.com\"\n          }\n        }\n      },\n      \"resiliencehub\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"resiliencehub.af-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"resiliencehub.ap-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"resiliencehub.ap-northeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"resiliencehub.ap-northeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"resiliencehub.ap-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"resiliencehub.ap-southeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"resiliencehub.ap-southeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"resiliencehub.ca-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"resiliencehub.eu-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-north-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"resiliencehub.eu-north-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"resiliencehub.eu-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"resiliencehub.eu-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"resiliencehub.eu-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"resiliencehub.eu-west-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"me-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"resiliencehub.me-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"sa-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"resiliencehub.sa-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"resiliencehub.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"resiliencehub.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"resiliencehub.us-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"resiliencehub.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"resource-explorer-2\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-south-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-3\" : { },\n          \"ap-southeast-4\" : { },\n          \"ap-southeast-5\" : { },\n          \"ap-southeast-7\" : { },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"resource-explorer-2-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"resource-explorer-2-fips.ca-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            } ]\n          },\n          \"ca-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"resource-explorer-2-fips.ca-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"resource-explorer-2-fips.ca-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            } ]\n          },\n          \"eu-central-1\" : { },\n          \"eu-central-2\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"fips-ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"resource-explorer-2-fips.ca-central-1.amazonaws.com\"\n          },\n          \"fips-ca-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"resource-explorer-2-fips.ca-west-1.amazonaws.com\"\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"resource-explorer-2-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"resource-explorer-2-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"resource-explorer-2-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"resource-explorer-2-fips.us-west-2.amazonaws.com\"\n          },\n          \"il-central-1\" : { },\n          \"me-central-1\" : { },\n          \"me-south-1\" : { },\n          \"mx-central-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"resource-explorer-2-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"resource-explorer-2-fips.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"resource-explorer-2-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"resource-explorer-2-fips.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"resource-explorer-2-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"resource-explorer-2-fips.us-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"resource-explorer-2-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"resource-explorer-2-fips.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"resource-groups\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-south-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-3\" : { },\n          \"ap-southeast-4\" : { },\n          \"ap-southeast-5\" : { },\n          \"ap-southeast-6\" : { },\n          \"ap-southeast-7\" : { },\n          \"ca-central-1\" : { },\n          \"ca-west-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-central-2\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"resource-groups-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"resource-groups-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"resource-groups-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"resource-groups-fips.us-west-2.amazonaws.com\"\n          },\n          \"il-central-1\" : { },\n          \"me-central-1\" : { },\n          \"me-south-1\" : { },\n          \"mx-central-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"resource-groups-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"resource-groups-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"resource-groups-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"resource-groups-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"robomaker\" : {\n        \"endpoints\" : {\n          \"ap-northeast-1\" : { },\n          \"ap-southeast-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-west-1\" : { },\n          \"us-east-1\" : { },\n          \"us-east-2\" : { },\n          \"us-west-2\" : { }\n        }\n      },\n      \"rolesanywhere\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-south-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-3\" : { },\n          \"ap-southeast-4\" : { },\n          \"ap-southeast-5\" : { },\n          \"ap-southeast-6\" : { },\n          \"ap-southeast-7\" : { },\n          \"ca-central-1\" : { },\n          \"ca-west-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-central-2\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"rolesanywhere-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"rolesanywhere-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"rolesanywhere-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"rolesanywhere-fips.us-west-2.amazonaws.com\"\n          },\n          \"il-central-1\" : { },\n          \"me-central-1\" : { },\n          \"me-south-1\" : { },\n          \"mx-central-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"rolesanywhere-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"rolesanywhere-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"rolesanywhere-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"rolesanywhere-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"route53\" : {\n        \"endpoints\" : {\n          \"aws-global\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"hostname\" : \"route53.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"route53-fips.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"fips-aws-global\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"route53-fips.amazonaws.com\"\n          }\n        },\n        \"isRegionalized\" : false,\n        \"partitionEndpoint\" : \"aws-global\"\n      },\n      \"route53-recovery-control-config\" : {\n        \"endpoints\" : {\n          \"aws-global\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"hostname\" : \"route53-recovery-control-config.us-west-2.amazonaws.com\"\n          }\n        }\n      },\n      \"route53domains\" : {\n        \"endpoints\" : {\n          \"us-east-1\" : { }\n        }\n      },\n      \"route53profiles\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"route53profiles.af-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"route53profiles.ap-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"route53profiles.ap-northeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"route53profiles.ap-northeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"route53profiles.ap-northeast-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"route53profiles.ap-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"route53profiles.ap-south-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"route53profiles.ap-southeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"route53profiles.ap-southeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"route53profiles.ap-southeast-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-4\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"route53profiles.ap-southeast-4.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-5\" : { },\n          \"ap-southeast-7\" : { },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"route53profiles-fips.ca-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"route53profiles.ca-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ca-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"route53profiles-fips.ca-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"route53profiles.ca-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"route53profiles.eu-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-central-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"route53profiles.eu-central-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-north-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"route53profiles.eu-north-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"route53profiles.eu-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"route53profiles.eu-south-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"route53profiles.eu-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"route53profiles.eu-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"route53profiles.eu-west-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"il-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"route53profiles.il-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"me-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"route53profiles.me-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"me-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"route53profiles.me-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"mx-central-1\" : { },\n          \"sa-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"route53profiles.sa-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"route53profiles-fips.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"route53profiles.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"route53profiles-fips.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"route53profiles.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"route53profiles-fips.us-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"route53profiles.us-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"route53profiles-fips.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"route53profiles.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"route53resolver\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"https\" ]\n        },\n        \"endpoints\" : {\n          \"af-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"route53resolver.af-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"route53resolver.ap-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"route53resolver.ap-northeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"route53resolver.ap-northeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"route53resolver.ap-northeast-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"route53resolver.ap-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"route53resolver.ap-south-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"route53resolver.ap-southeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"route53resolver.ap-southeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"route53resolver.ap-southeast-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-4\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"route53resolver.ap-southeast-4.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-5\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"route53resolver.ap-southeast-5.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-6\" : { },\n          \"ap-southeast-7\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"route53resolver.ap-southeast-7.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"route53resolver-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"route53resolver-fips.ca-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"route53resolver.ca-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ca-central-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"route53resolver-fips.ca-central-1.amazonaws.com\"\n          },\n          \"ca-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"route53resolver-fips.ca-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"route53resolver-fips.ca-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"route53resolver.ca-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ca-west-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"route53resolver-fips.ca-west-1.amazonaws.com\"\n          },\n          \"eu-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"route53resolver.eu-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-central-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"route53resolver.eu-central-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-north-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"route53resolver.eu-north-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"route53resolver.eu-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"route53resolver.eu-south-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"route53resolver.eu-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"route53resolver.eu-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"route53resolver.eu-west-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"il-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"route53resolver.il-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"me-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"route53resolver.me-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"me-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"route53resolver.me-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"mx-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"route53resolver.mx-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"sa-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"route53resolver.sa-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"route53resolver-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"route53resolver-fips.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"route53resolver.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"route53resolver-fips.us-east-1.amazonaws.com\"\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"route53resolver-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"route53resolver-fips.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"route53resolver.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-2-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"route53resolver-fips.us-east-2.amazonaws.com\"\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"route53resolver-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"route53resolver-fips.us-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"route53resolver.us-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"route53resolver-fips.us-west-1.amazonaws.com\"\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"route53resolver-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"route53resolver-fips.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"route53resolver.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-2-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"route53resolver-fips.us-west-2.amazonaws.com\"\n          }\n        }\n      },\n      \"rum\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-south-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-3\" : { },\n          \"ap-southeast-4\" : { },\n          \"ap-southeast-5\" : { },\n          \"ap-southeast-7\" : { },\n          \"ca-central-1\" : { },\n          \"ca-west-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-central-2\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"il-central-1\" : { },\n          \"me-central-1\" : { },\n          \"me-south-1\" : { },\n          \"mx-central-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : { },\n          \"us-east-2\" : { },\n          \"us-west-1\" : { },\n          \"us-west-2\" : { }\n        }\n      },\n      \"runtime-v2-lex\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ca-central-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"us-east-1\" : { },\n          \"us-west-2\" : { }\n        }\n      },\n      \"runtime.lex\" : {\n        \"defaults\" : {\n          \"credentialScope\" : {\n            \"service\" : \"lex\"\n          },\n          \"variants\" : [ {\n            \"hostname\" : \"runtime-fips.lex.{region}.{dnsSuffix}\",\n            \"tags\" : [ \"fips\" ]\n          } ]\n        },\n        \"endpoints\" : {\n          \"ap-northeast-1\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"eu-central-1\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"runtime-fips.lex.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"runtime-fips.lex.us-east-1.amazonaws.com\"\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"runtime-fips.lex.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"runtime-fips.lex.us-west-2.amazonaws.com\"\n          }\n        }\n      },\n      \"runtime.sagemaker\" : {\n        \"defaults\" : {\n          \"variants\" : [ {\n            \"hostname\" : \"runtime-fips.sagemaker.{region}.{dnsSuffix}\",\n            \"tags\" : [ \"fips\" ]\n          } ]\n        },\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-south-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-3\" : { },\n          \"ap-southeast-4\" : { },\n          \"ap-southeast-5\" : { },\n          \"ap-southeast-7\" : { },\n          \"ca-central-1\" : { },\n          \"ca-west-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-central-2\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"il-central-1\" : { },\n          \"me-central-1\" : { },\n          \"me-south-1\" : { },\n          \"mx-central-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"runtime-fips.sagemaker.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"runtime-fips.sagemaker.us-east-1.amazonaws.com\"\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"runtime-fips.sagemaker.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"runtime-fips.sagemaker.us-east-2.amazonaws.com\"\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"runtime-fips.sagemaker.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"runtime-fips.sagemaker.us-west-1.amazonaws.com\"\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"runtime-fips.sagemaker.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"runtime-fips.sagemaker.us-west-2.amazonaws.com\"\n          }\n        }\n      },\n      \"s3\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"http\", \"https\" ],\n          \"signatureVersions\" : [ \"s3v4\" ],\n          \"variants\" : [ {\n            \"dnsSuffix\" : \"amazonaws.com\",\n            \"hostname\" : \"{service}-fips.dualstack.{region}.{dnsSuffix}\",\n            \"tags\" : [ \"dualstack\", \"fips\" ]\n          }, {\n            \"dnsSuffix\" : \"amazonaws.com\",\n            \"hostname\" : \"{service}.dualstack.{region}.{dnsSuffix}\",\n            \"tags\" : [ \"dualstack\" ]\n          } ]\n        },\n        \"endpoints\" : {\n          \"af-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"s3.dualstack.af-south-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"s3.dualstack.ap-east-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : {\n            \"hostname\" : \"s3.ap-northeast-1.amazonaws.com\",\n            \"signatureVersions\" : [ \"s3\", \"s3v4\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"s3.dualstack.ap-northeast-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"s3.dualstack.ap-northeast-2.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"s3.dualstack.ap-northeast-3.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"s3.dualstack.ap-south-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"s3.dualstack.ap-south-2.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-1\" : {\n            \"hostname\" : \"s3.ap-southeast-1.amazonaws.com\",\n            \"signatureVersions\" : [ \"s3\", \"s3v4\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"s3.dualstack.ap-southeast-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-2\" : {\n            \"hostname\" : \"s3.ap-southeast-2.amazonaws.com\",\n            \"signatureVersions\" : [ \"s3\", \"s3v4\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"s3.dualstack.ap-southeast-2.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"s3.dualstack.ap-southeast-3.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-4\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"s3.dualstack.ap-southeast-4.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-5\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"s3.dualstack.ap-southeast-5.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-6\" : { },\n          \"ap-southeast-7\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"s3.dualstack.ap-southeast-7.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"aws-global\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"hostname\" : \"s3.amazonaws.com\",\n            \"signatureVersions\" : [ \"s3\", \"s3v4\" ]\n          },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"s3-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"s3-fips.dualstack.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"s3.dualstack.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ca-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"s3-fips.ca-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"s3-fips.dualstack.ca-west-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"s3.dualstack.ca-west-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"s3.dualstack.eu-central-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-central-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"s3.dualstack.eu-central-2.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-north-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"s3.dualstack.eu-north-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"s3.dualstack.eu-south-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"s3.dualstack.eu-south-2.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-1\" : {\n            \"hostname\" : \"s3.eu-west-1.amazonaws.com\",\n            \"signatureVersions\" : [ \"s3\", \"s3v4\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"s3.dualstack.eu-west-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"s3.dualstack.eu-west-2.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"s3.dualstack.eu-west-3.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"fips-ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"s3-fips.ca-central-1.amazonaws.com\"\n          },\n          \"fips-ca-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"s3-fips.ca-west-1.amazonaws.com\"\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"s3-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"s3-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"s3-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"s3-fips.us-west-2.amazonaws.com\"\n          },\n          \"il-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"s3.dualstack.il-central-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"me-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"s3.dualstack.me-central-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"me-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"s3.dualstack.me-south-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"mx-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"s3.dualstack.mx-central-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"s3-external-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"hostname\" : \"s3-external-1.amazonaws.com\",\n            \"signatureVersions\" : [ \"s3\", \"s3v4\" ]\n          },\n          \"sa-east-1\" : {\n            \"hostname\" : \"s3.sa-east-1.amazonaws.com\",\n            \"signatureVersions\" : [ \"s3\", \"s3v4\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"s3.dualstack.sa-east-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-1\" : {\n            \"hostname\" : \"s3.us-east-1.amazonaws.com\",\n            \"signatureVersions\" : [ \"s3\", \"s3v4\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"s3-fips.dualstack.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"s3-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"s3.dualstack.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"s3-fips.dualstack.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"s3-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"s3.dualstack.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"hostname\" : \"s3.us-west-1.amazonaws.com\",\n            \"signatureVersions\" : [ \"s3\", \"s3v4\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"s3-fips.dualstack.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"s3-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"s3.dualstack.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"hostname\" : \"s3.us-west-2.amazonaws.com\",\n            \"signatureVersions\" : [ \"s3\", \"s3v4\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"s3-fips.dualstack.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"s3-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"s3.dualstack.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        },\n        \"isRegionalized\" : true,\n        \"partitionEndpoint\" : \"aws-global\"\n      },\n      \"s3-control\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"https\" ],\n          \"signatureVersions\" : [ \"s3v4\" ],\n          \"variants\" : [ {\n            \"dnsSuffix\" : \"amazonaws.com\",\n            \"hostname\" : \"{service}-fips.dualstack.{region}.{dnsSuffix}\",\n            \"tags\" : [ \"dualstack\", \"fips\" ]\n          }, {\n            \"dnsSuffix\" : \"amazonaws.com\",\n            \"hostname\" : \"{service}.dualstack.{region}.{dnsSuffix}\",\n            \"tags\" : [ \"dualstack\" ]\n          } ]\n        },\n        \"endpoints\" : {\n          \"af-south-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"af-south-1\"\n            },\n            \"hostname\" : \"s3-control.af-south-1.amazonaws.com\",\n            \"signatureVersions\" : [ \"s3v4\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"s3-control.dualstack.af-south-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-east-1\"\n            },\n            \"hostname\" : \"s3-control.ap-east-1.amazonaws.com\",\n            \"signatureVersions\" : [ \"s3v4\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"s3-control.dualstack.ap-east-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-northeast-1\"\n            },\n            \"hostname\" : \"s3-control.ap-northeast-1.amazonaws.com\",\n            \"signatureVersions\" : [ \"s3v4\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"s3-control.dualstack.ap-northeast-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-northeast-2\"\n            },\n            \"hostname\" : \"s3-control.ap-northeast-2.amazonaws.com\",\n            \"signatureVersions\" : [ \"s3v4\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"s3-control.dualstack.ap-northeast-2.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-3\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-northeast-3\"\n            },\n            \"hostname\" : \"s3-control.ap-northeast-3.amazonaws.com\",\n            \"signatureVersions\" : [ \"s3v4\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"s3-control.dualstack.ap-northeast-3.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-south-1\"\n            },\n            \"hostname\" : \"s3-control.ap-south-1.amazonaws.com\",\n            \"signatureVersions\" : [ \"s3v4\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"s3-control.dualstack.ap-south-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-south-2\"\n            },\n            \"hostname\" : \"s3-control.ap-south-2.amazonaws.com\",\n            \"signatureVersions\" : [ \"s3v4\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"s3-control.dualstack.ap-south-2.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-southeast-1\"\n            },\n            \"hostname\" : \"s3-control.ap-southeast-1.amazonaws.com\",\n            \"signatureVersions\" : [ \"s3v4\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"s3-control.dualstack.ap-southeast-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-southeast-2\"\n            },\n            \"hostname\" : \"s3-control.ap-southeast-2.amazonaws.com\",\n            \"signatureVersions\" : [ \"s3v4\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"s3-control.dualstack.ap-southeast-2.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-3\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-southeast-3\"\n            },\n            \"hostname\" : \"s3-control.ap-southeast-3.amazonaws.com\",\n            \"signatureVersions\" : [ \"s3v4\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"s3-control.dualstack.ap-southeast-3.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-4\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-southeast-4\"\n            },\n            \"hostname\" : \"s3-control.ap-southeast-4.amazonaws.com\",\n            \"signatureVersions\" : [ \"s3v4\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"s3-control.dualstack.ap-southeast-4.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"hostname\" : \"s3-control.ca-central-1.amazonaws.com\",\n            \"signatureVersions\" : [ \"s3v4\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"s3-control-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"s3-control-fips.dualstack.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"s3-control.dualstack.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ca-central-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"s3-control-fips.ca-central-1.amazonaws.com\",\n            \"signatureVersions\" : [ \"s3v4\" ]\n          },\n          \"ca-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-west-1\"\n            },\n            \"hostname\" : \"s3-control.ca-west-1.amazonaws.com\",\n            \"signatureVersions\" : [ \"s3v4\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"s3-control-fips.ca-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"s3-control-fips.dualstack.ca-west-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"s3-control.dualstack.ca-west-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ca-west-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"s3-control-fips.ca-west-1.amazonaws.com\",\n            \"signatureVersions\" : [ \"s3v4\" ]\n          },\n          \"eu-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-central-1\"\n            },\n            \"hostname\" : \"s3-control.eu-central-1.amazonaws.com\",\n            \"signatureVersions\" : [ \"s3v4\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"s3-control.dualstack.eu-central-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-central-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-central-2\"\n            },\n            \"hostname\" : \"s3-control.eu-central-2.amazonaws.com\",\n            \"signatureVersions\" : [ \"s3v4\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"s3-control.dualstack.eu-central-2.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-north-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-north-1\"\n            },\n            \"hostname\" : \"s3-control.eu-north-1.amazonaws.com\",\n            \"signatureVersions\" : [ \"s3v4\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"s3-control.dualstack.eu-north-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-south-1\"\n            },\n            \"hostname\" : \"s3-control.eu-south-1.amazonaws.com\",\n            \"signatureVersions\" : [ \"s3v4\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"s3-control.dualstack.eu-south-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-south-2\"\n            },\n            \"hostname\" : \"s3-control.eu-south-2.amazonaws.com\",\n            \"signatureVersions\" : [ \"s3v4\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"s3-control.dualstack.eu-south-2.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-west-1\"\n            },\n            \"hostname\" : \"s3-control.eu-west-1.amazonaws.com\",\n            \"signatureVersions\" : [ \"s3v4\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"s3-control.dualstack.eu-west-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-west-2\"\n            },\n            \"hostname\" : \"s3-control.eu-west-2.amazonaws.com\",\n            \"signatureVersions\" : [ \"s3v4\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"s3-control.dualstack.eu-west-2.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-3\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-west-3\"\n            },\n            \"hostname\" : \"s3-control.eu-west-3.amazonaws.com\",\n            \"signatureVersions\" : [ \"s3v4\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"s3-control.dualstack.eu-west-3.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"il-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"il-central-1\"\n            },\n            \"hostname\" : \"s3-control.il-central-1.amazonaws.com\",\n            \"signatureVersions\" : [ \"s3v4\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"s3-control.dualstack.il-central-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"me-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"me-central-1\"\n            },\n            \"hostname\" : \"s3-control.me-central-1.amazonaws.com\",\n            \"signatureVersions\" : [ \"s3v4\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"s3-control.dualstack.me-central-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"me-south-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"me-south-1\"\n            },\n            \"hostname\" : \"s3-control.me-south-1.amazonaws.com\",\n            \"signatureVersions\" : [ \"s3v4\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"s3-control.dualstack.me-south-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"sa-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"sa-east-1\"\n            },\n            \"hostname\" : \"s3-control.sa-east-1.amazonaws.com\",\n            \"signatureVersions\" : [ \"s3v4\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"s3-control.dualstack.sa-east-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"hostname\" : \"s3-control.us-east-1.amazonaws.com\",\n            \"signatureVersions\" : [ \"s3v4\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"s3-control-fips.dualstack.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"s3-control-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"s3-control.dualstack.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"s3-control-fips.us-east-1.amazonaws.com\",\n            \"signatureVersions\" : [ \"s3v4\" ]\n          },\n          \"us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"hostname\" : \"s3-control.us-east-2.amazonaws.com\",\n            \"signatureVersions\" : [ \"s3v4\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"s3-control-fips.dualstack.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"s3-control-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"s3-control.dualstack.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-2-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"s3-control-fips.us-east-2.amazonaws.com\",\n            \"signatureVersions\" : [ \"s3v4\" ]\n          },\n          \"us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"hostname\" : \"s3-control.us-west-1.amazonaws.com\",\n            \"signatureVersions\" : [ \"s3v4\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"s3-control-fips.dualstack.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"s3-control-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"s3-control.dualstack.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"s3-control-fips.us-west-1.amazonaws.com\",\n            \"signatureVersions\" : [ \"s3v4\" ]\n          },\n          \"us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"hostname\" : \"s3-control.us-west-2.amazonaws.com\",\n            \"signatureVersions\" : [ \"s3v4\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"s3-control-fips.dualstack.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"s3-control-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"s3-control.dualstack.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-2-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"s3-control-fips.us-west-2.amazonaws.com\",\n            \"signatureVersions\" : [ \"s3v4\" ]\n          }\n        }\n      },\n      \"s3-outposts\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-east-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-2\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-3\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-2\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-3\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            }, {\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-central-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-north-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-2\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-3\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"fips-ca-central-1\" : {\n            \"deprecated\" : true\n          },\n          \"fips-us-east-1\" : {\n            \"deprecated\" : true\n          },\n          \"fips-us-east-2\" : {\n            \"deprecated\" : true\n          },\n          \"fips-us-west-1\" : {\n            \"deprecated\" : true\n          },\n          \"fips-us-west-2\" : {\n            \"deprecated\" : true\n          },\n          \"il-central-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"me-south-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"sa-east-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            }, {\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            }, {\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            }, {\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            }, {\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"sagemaker-geospatial\" : {\n        \"endpoints\" : {\n          \"us-west-2\" : { }\n        }\n      },\n      \"savingsplans\" : {\n        \"endpoints\" : {\n          \"aws-global\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"hostname\" : \"savingsplans.amazonaws.com\"\n          }\n        },\n        \"isRegionalized\" : false,\n        \"partitionEndpoint\" : \"aws-global\"\n      },\n      \"scheduler\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-south-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-3\" : { },\n          \"ap-southeast-4\" : { },\n          \"ap-southeast-5\" : { },\n          \"ap-southeast-6\" : { },\n          \"ap-southeast-7\" : { },\n          \"ca-central-1\" : { },\n          \"ca-west-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-central-2\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"il-central-1\" : { },\n          \"me-central-1\" : { },\n          \"me-south-1\" : { },\n          \"mx-central-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : { },\n          \"us-east-2\" : { },\n          \"us-west-1\" : { },\n          \"us-west-2\" : { }\n        }\n      },\n      \"schemas\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-3\" : { },\n          \"ca-central-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-central-2\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"me-central-1\" : { },\n          \"me-south-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : { },\n          \"us-east-2\" : { },\n          \"us-west-1\" : { },\n          \"us-west-2\" : { }\n        }\n      },\n      \"sdb\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"http\", \"https\" ],\n          \"signatureVersions\" : [ \"v2\" ]\n        },\n        \"endpoints\" : {\n          \"ap-northeast-1\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"eu-west-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : {\n            \"hostname\" : \"sdb.amazonaws.com\"\n          },\n          \"us-west-1\" : { },\n          \"us-west-2\" : { }\n        }\n      },\n      \"secretsmanager\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-east-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-2\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-3\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-2\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-2\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-3\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-4\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-5\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-6\" : { },\n          \"ap-southeast-7\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            }, {\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ca-central-1-fips\" : {\n            \"deprecated\" : true\n          },\n          \"ca-west-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            }, {\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ca-west-1-fips\" : {\n            \"deprecated\" : true\n          },\n          \"eu-central-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-central-2\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-north-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-2\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-2\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-3\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"il-central-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"me-central-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"me-south-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"mx-central-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"sa-east-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            }, {\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-1-fips\" : {\n            \"deprecated\" : true\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            }, {\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2-fips\" : {\n            \"deprecated\" : true\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            }, {\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1-fips\" : {\n            \"deprecated\" : true\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            }, {\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2-fips\" : {\n            \"deprecated\" : true\n          }\n        }\n      },\n      \"securityhub\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"securityhub.af-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"securityhub.ap-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"securityhub.ap-northeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"securityhub.ap-northeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"securityhub.ap-northeast-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"securityhub.ap-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"securityhub.ap-south-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"securityhub.ap-southeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"securityhub.ap-southeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"securityhub.ap-southeast-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-4\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"securityhub.ap-southeast-4.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-5\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"securityhub.ap-southeast-5.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-6\" : { },\n          \"ap-southeast-7\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"securityhub.ap-southeast-7.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"securityhub.ca-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ca-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"securityhub.ca-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"securityhub.eu-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-central-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"securityhub.eu-central-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-north-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"securityhub.eu-north-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"securityhub.eu-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"securityhub.eu-south-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"securityhub.eu-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"securityhub.eu-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"securityhub.eu-west-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"securityhub-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"securityhub-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"securityhub-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"securityhub-fips.us-west-2.amazonaws.com\"\n          },\n          \"il-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"securityhub.il-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"me-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"securityhub.me-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"me-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"securityhub.me-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"mx-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"securityhub.mx-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"sa-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"securityhub.sa-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"securityhub-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"securityhub.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"securityhub-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"securityhub.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"securityhub-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"securityhub.us-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"securityhub-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"securityhub.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"securitylake\" : {\n        \"endpoints\" : {\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ca-central-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-north-1\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"securitylake-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"securitylake-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"securitylake-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"securitylake-fips.us-west-2.amazonaws.com\"\n          },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"securitylake-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"securitylake-fips.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"securitylake-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"securitylake-fips.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"securitylake-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"securitylake-fips.us-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"securitylake-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"securitylake-fips.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"serverlessrepo\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"https\" ]\n        },\n        \"endpoints\" : {\n          \"ap-east-1\" : {\n            \"protocols\" : [ \"https\" ]\n          },\n          \"ap-northeast-1\" : {\n            \"protocols\" : [ \"https\" ]\n          },\n          \"ap-northeast-2\" : {\n            \"protocols\" : [ \"https\" ]\n          },\n          \"ap-south-1\" : {\n            \"protocols\" : [ \"https\" ]\n          },\n          \"ap-southeast-1\" : {\n            \"protocols\" : [ \"https\" ]\n          },\n          \"ap-southeast-2\" : {\n            \"protocols\" : [ \"https\" ]\n          },\n          \"ca-central-1\" : {\n            \"protocols\" : [ \"https\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"serverlessrepo-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ca-central-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"serverlessrepo-fips.ca-central-1.amazonaws.com\"\n          },\n          \"eu-central-1\" : {\n            \"protocols\" : [ \"https\" ]\n          },\n          \"eu-north-1\" : {\n            \"protocols\" : [ \"https\" ]\n          },\n          \"eu-west-1\" : {\n            \"protocols\" : [ \"https\" ]\n          },\n          \"eu-west-2\" : {\n            \"protocols\" : [ \"https\" ]\n          },\n          \"eu-west-3\" : {\n            \"protocols\" : [ \"https\" ]\n          },\n          \"me-south-1\" : {\n            \"protocols\" : [ \"https\" ]\n          },\n          \"sa-east-1\" : {\n            \"protocols\" : [ \"https\" ]\n          },\n          \"us-east-1\" : {\n            \"protocols\" : [ \"https\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"serverlessrepo-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"serverlessrepo-fips.us-east-1.amazonaws.com\"\n          },\n          \"us-east-2\" : {\n            \"protocols\" : [ \"https\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"serverlessrepo-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"serverlessrepo-fips.us-east-2.amazonaws.com\"\n          },\n          \"us-west-1\" : {\n            \"protocols\" : [ \"https\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"serverlessrepo-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"serverlessrepo-fips.us-west-1.amazonaws.com\"\n          },\n          \"us-west-2\" : {\n            \"protocols\" : [ \"https\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"serverlessrepo-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"serverlessrepo-fips.us-west-2.amazonaws.com\"\n          }\n        }\n      },\n      \"servicecatalog\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-south-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-3\" : { },\n          \"ap-southeast-4\" : { },\n          \"ca-central-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-central-2\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"il-central-1\" : { },\n          \"me-central-1\" : { },\n          \"me-south-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"servicecatalog-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"servicecatalog-fips.us-east-1.amazonaws.com\"\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"servicecatalog-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"servicecatalog-fips.us-east-2.amazonaws.com\"\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"servicecatalog-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"servicecatalog-fips.us-west-1.amazonaws.com\"\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"servicecatalog-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"servicecatalog-fips.us-west-2.amazonaws.com\"\n          }\n        }\n      },\n      \"servicecatalog-appregistry\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-south-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-3\" : { },\n          \"ap-southeast-4\" : { },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"servicecatalog-appregistry-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ca-west-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-central-2\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"fips-ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"servicecatalog-appregistry-fips.ca-central-1.amazonaws.com\"\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"servicecatalog-appregistry-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"servicecatalog-appregistry-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"servicecatalog-appregistry-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"servicecatalog-appregistry-fips.us-west-2.amazonaws.com\"\n          },\n          \"il-central-1\" : { },\n          \"me-central-1\" : { },\n          \"me-south-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"servicecatalog-appregistry-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"servicecatalog-appregistry-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"servicecatalog-appregistry-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"servicecatalog-appregistry-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"servicediscovery\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"servicediscovery.af-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"servicediscovery.ap-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"servicediscovery.ap-northeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"servicediscovery.ap-northeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"servicediscovery.ap-northeast-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"servicediscovery.ap-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"servicediscovery.ap-south-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"servicediscovery.ap-southeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"servicediscovery.ap-southeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"servicediscovery.ap-southeast-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-4\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"servicediscovery.ap-southeast-4.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-5\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"servicediscovery.ap-southeast-5.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-6\" : { },\n          \"ap-southeast-7\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"servicediscovery.ap-southeast-7.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"servicediscovery-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"servicediscovery-fips.ca-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"servicediscovery.ca-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ca-central-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"servicediscovery-fips.ca-central-1.amazonaws.com\"\n          },\n          \"ca-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"servicediscovery-fips.ca-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"servicediscovery-fips.ca-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"servicediscovery.ca-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ca-west-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"servicediscovery-fips.ca-west-1.amazonaws.com\"\n          },\n          \"eu-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"servicediscovery.eu-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-central-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"servicediscovery.eu-central-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-north-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"servicediscovery.eu-north-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"servicediscovery.eu-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"servicediscovery.eu-south-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"servicediscovery.eu-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"servicediscovery.eu-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"servicediscovery.eu-west-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"il-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"servicediscovery.il-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"me-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"servicediscovery.me-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"me-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"servicediscovery.me-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"mx-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"servicediscovery.mx-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"sa-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"servicediscovery.sa-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"servicediscovery-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"servicediscovery-fips.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"servicediscovery.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"servicediscovery-fips.us-east-1.amazonaws.com\"\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"servicediscovery-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"servicediscovery-fips.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"servicediscovery.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-2-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"servicediscovery-fips.us-east-2.amazonaws.com\"\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"servicediscovery-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"servicediscovery-fips.us-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"servicediscovery.us-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"servicediscovery-fips.us-west-1.amazonaws.com\"\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"servicediscovery-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"servicediscovery-fips.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"servicediscovery.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-2-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"servicediscovery-fips.us-west-2.amazonaws.com\"\n          }\n        }\n      },\n      \"servicequotas\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"https\" ]\n        },\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-south-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-3\" : { },\n          \"ap-southeast-4\" : { },\n          \"ap-southeast-5\" : { },\n          \"ap-southeast-6\" : { },\n          \"ap-southeast-7\" : { },\n          \"ca-central-1\" : { },\n          \"ca-west-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-central-2\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"il-central-1\" : { },\n          \"me-central-1\" : { },\n          \"me-south-1\" : { },\n          \"mx-central-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : { },\n          \"us-east-2\" : { },\n          \"us-west-1\" : { },\n          \"us-west-2\" : { }\n        }\n      },\n      \"session.qldb\" : {\n        \"endpoints\" : {\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ca-central-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"session.qldb-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"session.qldb-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"session.qldb-fips.us-west-2.amazonaws.com\"\n          },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"session.qldb-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"session.qldb-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"session.qldb-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"shield\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"https\" ],\n          \"sslCommonName\" : \"shield.us-east-1.amazonaws.com\"\n        },\n        \"endpoints\" : {\n          \"aws-global\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"hostname\" : \"shield.us-east-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"shield-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"fips-aws-global\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"shield-fips.us-east-1.amazonaws.com\"\n          }\n        },\n        \"isRegionalized\" : false,\n        \"partitionEndpoint\" : \"aws-global\"\n      },\n      \"signer\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-south-1\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ca-central-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"signer-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"signer-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"signer-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"signer-fips.us-west-2.amazonaws.com\"\n          },\n          \"fips-verification-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"hostname\" : \"verification.signer-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-verification-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"hostname\" : \"verification.signer-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-verification-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"hostname\" : \"verification.signer-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-verification-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"hostname\" : \"verification.signer-fips.us-west-2.amazonaws.com\"\n          },\n          \"me-south-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"signer-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"signer-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"signer-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"signer-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"verification-af-south-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"af-south-1\"\n            },\n            \"hostname\" : \"verification.signer.af-south-1.amazonaws.com\"\n          },\n          \"verification-ap-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-east-1\"\n            },\n            \"hostname\" : \"verification.signer.ap-east-1.amazonaws.com\"\n          },\n          \"verification-ap-northeast-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-northeast-1\"\n            },\n            \"hostname\" : \"verification.signer.ap-northeast-1.amazonaws.com\"\n          },\n          \"verification-ap-northeast-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-northeast-2\"\n            },\n            \"hostname\" : \"verification.signer.ap-northeast-2.amazonaws.com\"\n          },\n          \"verification-ap-south-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-south-1\"\n            },\n            \"hostname\" : \"verification.signer.ap-south-1.amazonaws.com\"\n          },\n          \"verification-ap-southeast-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-southeast-1\"\n            },\n            \"hostname\" : \"verification.signer.ap-southeast-1.amazonaws.com\"\n          },\n          \"verification-ap-southeast-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-southeast-2\"\n            },\n            \"hostname\" : \"verification.signer.ap-southeast-2.amazonaws.com\"\n          },\n          \"verification-ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"hostname\" : \"verification.signer.ca-central-1.amazonaws.com\"\n          },\n          \"verification-eu-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-central-1\"\n            },\n            \"hostname\" : \"verification.signer.eu-central-1.amazonaws.com\"\n          },\n          \"verification-eu-north-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-north-1\"\n            },\n            \"hostname\" : \"verification.signer.eu-north-1.amazonaws.com\"\n          },\n          \"verification-eu-south-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-south-1\"\n            },\n            \"hostname\" : \"verification.signer.eu-south-1.amazonaws.com\"\n          },\n          \"verification-eu-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-west-1\"\n            },\n            \"hostname\" : \"verification.signer.eu-west-1.amazonaws.com\"\n          },\n          \"verification-eu-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-west-2\"\n            },\n            \"hostname\" : \"verification.signer.eu-west-2.amazonaws.com\"\n          },\n          \"verification-eu-west-3\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-west-3\"\n            },\n            \"hostname\" : \"verification.signer.eu-west-3.amazonaws.com\"\n          },\n          \"verification-me-south-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"me-south-1\"\n            },\n            \"hostname\" : \"verification.signer.me-south-1.amazonaws.com\"\n          },\n          \"verification-sa-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"sa-east-1\"\n            },\n            \"hostname\" : \"verification.signer.sa-east-1.amazonaws.com\"\n          },\n          \"verification-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"hostname\" : \"verification.signer.us-east-1.amazonaws.com\"\n          },\n          \"verification-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"hostname\" : \"verification.signer.us-east-2.amazonaws.com\"\n          },\n          \"verification-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"hostname\" : \"verification.signer.us-west-1.amazonaws.com\"\n          },\n          \"verification-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"hostname\" : \"verification.signer.us-west-2.amazonaws.com\"\n          }\n        }\n      },\n      \"simspaceweaver\" : {\n        \"endpoints\" : {\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"eu-central-1\" : { },\n          \"eu-north-1\" : { },\n          \"eu-west-1\" : { },\n          \"us-east-1\" : { },\n          \"us-east-2\" : { },\n          \"us-west-2\" : { }\n        }\n      },\n      \"sms-voice\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sms-voice.af-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sms-voice.ap-northeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sms-voice.ap-northeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sms-voice.ap-northeast-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sms-voice.ap-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sms-voice.ap-south-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sms-voice.ap-southeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sms-voice.ap-southeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sms-voice.ap-southeast-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-4\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sms-voice.ap-southeast-4.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sms-voice-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"sms-voice-fips.ca-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"sms-voice.ca-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ca-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sms-voice-fips.ca-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"sms-voice-fips.ca-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"sms-voice.ca-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sms-voice.eu-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-central-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sms-voice.eu-central-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-north-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sms-voice.eu-north-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sms-voice.eu-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sms-voice.eu-south-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sms-voice.eu-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sms-voice.eu-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sms-voice.eu-west-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"fips-ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"sms-voice-fips.ca-central-1.amazonaws.com\"\n          },\n          \"fips-ca-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"sms-voice-fips.ca-west-1.amazonaws.com\"\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"sms-voice-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"sms-voice-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"sms-voice-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"sms-voice-fips.us-west-2.amazonaws.com\"\n          },\n          \"il-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sms-voice.il-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"me-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sms-voice.me-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"me-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sms-voice.me-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"mx-central-1\" : { },\n          \"sa-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sms-voice.sa-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sms-voice-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"sms-voice-fips.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"sms-voice.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sms-voice-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"sms-voice-fips.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"sms-voice.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sms-voice-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"sms-voice-fips.us-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"sms-voice.us-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sms-voice-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"sms-voice-fips.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"sms-voice.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"snowball\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"snowball-fips.af-south-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"snowball-fips.af-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"snowball.af-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"snowball-fips.ap-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"snowball-fips.ap-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"snowball.ap-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"snowball-fips.ap-northeast-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"snowball-fips.ap-northeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"snowball.ap-northeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"snowball-fips.ap-northeast-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"snowball-fips.ap-northeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"snowball.ap-northeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"snowball-fips.ap-northeast-3.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"snowball-fips.ap-northeast-3.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"snowball.ap-northeast-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"snowball-fips.ap-south-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"snowball-fips.ap-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"snowball.ap-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"snowball-fips.ap-southeast-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"snowball-fips.ap-southeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"snowball.ap-southeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"snowball-fips.ap-southeast-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"snowball-fips.ap-southeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"snowball.ap-southeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"snowball-fips.ap-southeast-3.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"snowball-fips.ap-southeast-3.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"snowball.ap-southeast-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"snowball-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"snowball-fips.ca-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"snowball.ca-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"snowball-fips.eu-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"snowball-fips.eu-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"snowball.eu-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-north-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"snowball-fips.eu-north-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"snowball-fips.eu-north-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"snowball.eu-north-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"snowball-fips.eu-south-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"snowball-fips.eu-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"snowball.eu-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"snowball-fips.eu-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"snowball-fips.eu-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"snowball.eu-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"snowball-fips.eu-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"snowball-fips.eu-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"snowball.eu-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"snowball-fips.eu-west-3.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"snowball-fips.eu-west-3.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"snowball.eu-west-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"fips-af-south-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"af-south-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"snowball-fips.af-south-1.amazonaws.com\"\n          },\n          \"fips-ap-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"snowball-fips.ap-east-1.amazonaws.com\"\n          },\n          \"fips-ap-northeast-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-northeast-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"snowball-fips.ap-northeast-1.amazonaws.com\"\n          },\n          \"fips-ap-northeast-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-northeast-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"snowball-fips.ap-northeast-2.amazonaws.com\"\n          },\n          \"fips-ap-northeast-3\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-northeast-3\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"snowball-fips.ap-northeast-3.amazonaws.com\"\n          },\n          \"fips-ap-south-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-south-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"snowball-fips.ap-south-1.amazonaws.com\"\n          },\n          \"fips-ap-southeast-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-southeast-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"snowball-fips.ap-southeast-1.amazonaws.com\"\n          },\n          \"fips-ap-southeast-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-southeast-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"snowball-fips.ap-southeast-2.amazonaws.com\"\n          },\n          \"fips-ap-southeast-3\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-southeast-3\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"snowball-fips.ap-southeast-3.amazonaws.com\"\n          },\n          \"fips-ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"snowball-fips.ca-central-1.amazonaws.com\"\n          },\n          \"fips-eu-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"snowball-fips.eu-central-1.amazonaws.com\"\n          },\n          \"fips-eu-north-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-north-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"snowball-fips.eu-north-1.amazonaws.com\"\n          },\n          \"fips-eu-south-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-south-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"snowball-fips.eu-south-1.amazonaws.com\"\n          },\n          \"fips-eu-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"snowball-fips.eu-west-1.amazonaws.com\"\n          },\n          \"fips-eu-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"snowball-fips.eu-west-2.amazonaws.com\"\n          },\n          \"fips-eu-west-3\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-west-3\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"snowball-fips.eu-west-3.amazonaws.com\"\n          },\n          \"fips-il-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"il-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"snowball-fips.il-central-1.amazonaws.com\"\n          },\n          \"fips-me-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"me-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"snowball-fips.me-central-1.amazonaws.com\"\n          },\n          \"fips-sa-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"sa-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"snowball-fips.sa-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"snowball-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"snowball-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"snowball-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"snowball-fips.us-west-2.amazonaws.com\"\n          },\n          \"il-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"snowball-fips.il-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"snowball-fips.il-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"snowball.il-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"me-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"snowball-fips.me-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"snowball-fips.me-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"snowball.me-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"sa-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"snowball-fips.sa-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"snowball-fips.sa-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"snowball.sa-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"snowball-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"snowball-fips.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"snowball.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"snowball-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"snowball-fips.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"snowball.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"snowball-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"snowball-fips.us-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"snowball.us-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"snowball-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"snowball-fips.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"snowball.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"sns\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"http\", \"https\" ]\n        },\n        \"endpoints\" : {\n          \"af-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sns.af-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sns.ap-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sns.ap-northeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sns.ap-northeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sns.ap-northeast-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sns.ap-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sns.ap-south-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sns.ap-southeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sns.ap-southeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sns.ap-southeast-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-4\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sns.ap-southeast-4.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-5\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sns.ap-southeast-5.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-6\" : { },\n          \"ap-southeast-7\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sns.ap-southeast-7.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sns.ca-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ca-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sns-fips.ca-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"sns.ca-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sns.eu-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-central-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sns.eu-central-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-north-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sns.eu-north-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sns.eu-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sns.eu-south-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sns.eu-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sns.eu-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sns.eu-west-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"fips-ca-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"sns-fips.ca-west-1.amazonaws.com\"\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"sns-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"sns-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"sns-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"sns-fips.us-west-2.amazonaws.com\"\n          },\n          \"il-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sns.il-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"me-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sns.me-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"me-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sns.me-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"mx-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sns.mx-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"sa-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sns.sa-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sns-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"sns.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sns-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"sns.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sns-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"sns.us-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sns-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"sns.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"sqs\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"http\", \"https\" ],\n          \"sslCommonName\" : \"{region}.queue.{dnsSuffix}\"\n        },\n        \"endpoints\" : {\n          \"af-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sqs.af-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sqs.ap-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sqs.ap-northeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sqs.ap-northeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sqs.ap-northeast-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sqs.ap-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sqs.ap-south-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sqs.ap-southeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sqs.ap-southeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sqs.ap-southeast-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-4\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sqs.ap-southeast-4.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-5\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sqs.ap-southeast-5.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-6\" : { },\n          \"ap-southeast-7\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sqs.ap-southeast-7.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sqs-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"sqs.ca-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ca-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sqs-fips.ca-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"sqs.ca-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sqs.eu-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-central-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sqs.eu-central-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-north-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sqs.eu-north-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sqs.eu-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sqs.eu-south-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sqs.eu-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sqs.eu-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sqs.eu-west-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"fips-ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"sqs-fips.ca-central-1.amazonaws.com\"\n          },\n          \"fips-ca-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"sqs-fips.ca-west-1.amazonaws.com\"\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"sqs-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"sqs-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"sqs-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"sqs-fips.us-west-2.amazonaws.com\"\n          },\n          \"il-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sqs.il-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"me-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sqs.me-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"me-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sqs.me-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"mx-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sqs.mx-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"sa-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sqs.sa-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-1\" : {\n            \"sslCommonName\" : \"queue.{dnsSuffix}\",\n            \"variants\" : [ {\n              \"hostname\" : \"sqs-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"sqs.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sqs-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"sqs.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sqs-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"sqs.us-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sqs-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"sqs.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"ssm\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-south-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-3\" : { },\n          \"ap-southeast-4\" : { },\n          \"ap-southeast-5\" : { },\n          \"ap-southeast-6\" : { },\n          \"ap-southeast-7\" : { },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ssm-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ca-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ssm-fips.ca-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-central-1\" : { },\n          \"eu-central-2\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"fips-ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"ssm-fips.ca-central-1.amazonaws.com\"\n          },\n          \"fips-ca-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"ssm-fips.ca-west-1.amazonaws.com\"\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"ssm-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"ssm-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"ssm-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"ssm-fips.us-west-2.amazonaws.com\"\n          },\n          \"il-central-1\" : { },\n          \"me-central-1\" : { },\n          \"me-south-1\" : { },\n          \"mx-central-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ssm-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ssm-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ssm-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ssm-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"ssm-contacts\" : {\n        \"endpoints\" : {\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-south-1\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ca-central-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-north-1\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"ssm-contacts-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"ssm-contacts-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"ssm-contacts-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"ssm-contacts-fips.us-west-2.amazonaws.com\"\n          },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ssm-contacts-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ssm-contacts-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ssm-contacts-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ssm-contacts-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"ssm-incidents\" : {\n        \"endpoints\" : {\n          \"ap-northeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ssm-incidents.ap-northeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ssm-incidents.ap-northeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ssm-incidents.ap-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ssm-incidents.ap-southeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ssm-incidents.ap-southeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ssm-incidents-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"ssm-incidents-fips.ca-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"ssm-incidents.ca-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ssm-incidents.eu-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-north-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ssm-incidents.eu-north-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ssm-incidents.eu-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ssm-incidents.eu-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ssm-incidents.eu-west-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"fips-ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"ssm-incidents-fips.ca-central-1.amazonaws.com\"\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"ssm-incidents-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"ssm-incidents-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"ssm-incidents-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"ssm-incidents-fips.us-west-2.amazonaws.com\"\n          },\n          \"sa-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ssm-incidents.sa-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ssm-incidents-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"ssm-incidents-fips.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"ssm-incidents.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ssm-incidents-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"ssm-incidents-fips.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"ssm-incidents.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ssm-incidents-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"ssm-incidents-fips.us-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"ssm-incidents.us-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ssm-incidents-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"ssm-incidents-fips.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"ssm-incidents.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"ssm-quicksetup\" : {\n        \"endpoints\" : {\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-south-1\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ssm-quicksetup-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-central-1\" : { },\n          \"eu-north-1\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"fips-ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"ssm-quicksetup-fips.ca-central-1.amazonaws.com\"\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"ssm-quicksetup-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"ssm-quicksetup-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"ssm-quicksetup-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"ssm-quicksetup-fips.us-west-2.amazonaws.com\"\n          },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ssm-quicksetup-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ssm-quicksetup-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ssm-quicksetup-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ssm-quicksetup-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"ssm-sap\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ssm-sap.af-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ssm-sap.ap-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ssm-sap.ap-northeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ssm-sap.ap-northeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ssm-sap.ap-northeast-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ssm-sap.ap-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ssm-sap.ap-south-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ssm-sap.ap-southeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ssm-sap.ap-southeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ssm-sap.ap-southeast-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-4\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ssm-sap.ap-southeast-4.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ssm-sap-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"ssm-sap-fips.ca-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"ssm-sap.ca-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ssm-sap.eu-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-central-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ssm-sap.eu-central-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-north-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ssm-sap.eu-north-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ssm-sap.eu-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ssm-sap.eu-south-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ssm-sap.eu-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ssm-sap.eu-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ssm-sap.eu-west-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"fips-ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"ssm-sap-fips.ca-central-1.amazonaws.com\"\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"ssm-sap-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"ssm-sap-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"ssm-sap-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"ssm-sap-fips.us-west-2.amazonaws.com\"\n          },\n          \"il-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ssm-sap.il-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"me-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ssm-sap.me-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"me-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ssm-sap.me-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"sa-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ssm-sap.sa-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ssm-sap-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"ssm-sap-fips.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"ssm-sap.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ssm-sap-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"ssm-sap-fips.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"ssm-sap.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ssm-sap-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"ssm-sap-fips.us-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"ssm-sap.us-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ssm-sap-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"ssm-sap-fips.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"ssm-sap.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"sso\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-south-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-3\" : { },\n          \"ap-southeast-4\" : { },\n          \"ap-southeast-5\" : { },\n          \"ap-southeast-7\" : { },\n          \"ca-central-1\" : { },\n          \"ca-west-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-central-2\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"il-central-1\" : { },\n          \"me-central-1\" : { },\n          \"me-south-1\" : { },\n          \"mx-central-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : { },\n          \"us-east-2\" : { },\n          \"us-west-1\" : { },\n          \"us-west-2\" : { }\n        }\n      },\n      \"states\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-south-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-3\" : { },\n          \"ap-southeast-4\" : { },\n          \"ap-southeast-5\" : { },\n          \"ap-southeast-6\" : { },\n          \"ap-southeast-7\" : { },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"states-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ca-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"states-fips.ca-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-central-1\" : { },\n          \"eu-central-2\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"fips-ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"states-fips.ca-central-1.amazonaws.com\"\n          },\n          \"fips-ca-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"states-fips.ca-west-1.amazonaws.com\"\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"states-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"states-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"states-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"states-fips.us-west-2.amazonaws.com\"\n          },\n          \"il-central-1\" : { },\n          \"me-central-1\" : { },\n          \"me-south-1\" : { },\n          \"mx-central-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"states-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"states-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"states-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"states-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"storagegateway\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-south-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-3\" : { },\n          \"ap-southeast-4\" : { },\n          \"ap-southeast-5\" : { },\n          \"ap-southeast-7\" : { },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"storagegateway-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ca-central-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"storagegateway-fips.ca-central-1.amazonaws.com\"\n          },\n          \"ca-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"storagegateway-fips.ca-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ca-west-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"storagegateway-fips.ca-west-1.amazonaws.com\"\n          },\n          \"eu-central-1\" : { },\n          \"eu-central-2\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"il-central-1\" : { },\n          \"me-central-1\" : { },\n          \"me-south-1\" : { },\n          \"mx-central-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"storagegateway-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"storagegateway-fips.us-east-1.amazonaws.com\"\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"storagegateway-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"storagegateway-fips.us-east-2.amazonaws.com\"\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"storagegateway-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"storagegateway-fips.us-west-1.amazonaws.com\"\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"storagegateway-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"storagegateway-fips.us-west-2.amazonaws.com\"\n          }\n        }\n      },\n      \"streams.dynamodb\" : {\n        \"defaults\" : {\n          \"credentialScope\" : {\n            \"service\" : \"dynamodb\"\n          },\n          \"protocols\" : [ \"http\", \"https\" ]\n        },\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-south-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-3\" : { },\n          \"ap-southeast-4\" : { },\n          \"ap-southeast-5\" : { },\n          \"ap-southeast-6\" : { },\n          \"ap-southeast-7\" : { },\n          \"ca-central-1\" : { },\n          \"ca-west-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-central-2\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"il-central-1\" : { },\n          \"local\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"hostname\" : \"localhost:8000\",\n            \"protocols\" : [ \"http\" ]\n          },\n          \"me-central-1\" : { },\n          \"me-south-1\" : { },\n          \"mx-central-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : { },\n          \"us-east-2\" : { },\n          \"us-west-1\" : { },\n          \"us-west-2\" : { }\n        }\n      },\n      \"sts\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-south-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-3\" : { },\n          \"ap-southeast-4\" : { },\n          \"ap-southeast-5\" : { },\n          \"ap-southeast-6\" : { },\n          \"ap-southeast-7\" : { },\n          \"aws-global\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"hostname\" : \"sts.amazonaws.com\"\n          },\n          \"ca-central-1\" : { },\n          \"ca-west-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-central-2\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"il-central-1\" : { },\n          \"me-central-1\" : { },\n          \"me-south-1\" : { },\n          \"mx-central-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sts-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"sts-fips.us-east-1.amazonaws.com\"\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sts-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"sts-fips.us-east-2.amazonaws.com\"\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sts-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"sts-fips.us-west-1.amazonaws.com\"\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sts-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"sts-fips.us-west-2.amazonaws.com\"\n          }\n        },\n        \"partitionEndpoint\" : \"aws-global\"\n      },\n      \"support\" : {\n        \"endpoints\" : {\n          \"aws-global\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"hostname\" : \"support.us-east-1.amazonaws.com\"\n          }\n        },\n        \"partitionEndpoint\" : \"aws-global\"\n      },\n      \"supportapp\" : {\n        \"endpoints\" : {\n          \"eu-west-1\" : { },\n          \"us-east-1\" : { },\n          \"us-west-2\" : { }\n        }\n      },\n      \"swf\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-south-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-3\" : { },\n          \"ap-southeast-4\" : { },\n          \"ap-southeast-5\" : { },\n          \"ap-southeast-6\" : { },\n          \"ap-southeast-7\" : { },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"swf-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ca-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"swf-fips.ca-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-central-1\" : { },\n          \"eu-central-2\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"fips-ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"swf-fips.ca-central-1.amazonaws.com\"\n          },\n          \"fips-ca-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"swf-fips.ca-west-1.amazonaws.com\"\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"swf-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"swf-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"swf-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"swf-fips.us-west-2.amazonaws.com\"\n          },\n          \"il-central-1\" : { },\n          \"me-central-1\" : { },\n          \"me-south-1\" : { },\n          \"mx-central-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"swf-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"swf-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"swf-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"swf-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"synthetics\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"synthetics.af-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"synthetics.ap-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"synthetics.ap-northeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"synthetics.ap-northeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"synthetics.ap-northeast-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"synthetics.ap-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"synthetics.ap-south-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"synthetics.ap-southeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"synthetics.ap-southeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"synthetics.ap-southeast-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-4\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"synthetics.ap-southeast-4.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-5\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"synthetics.ap-southeast-5.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-6\" : { },\n          \"ap-southeast-7\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"synthetics.ap-southeast-7.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"synthetics-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"synthetics-fips.ca-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"synthetics.ca-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ca-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"synthetics-fips.ca-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"synthetics-fips.ca-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"synthetics.ca-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"synthetics.eu-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-central-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"synthetics.eu-central-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-north-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"synthetics.eu-north-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"synthetics.eu-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"synthetics.eu-south-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"synthetics.eu-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"synthetics.eu-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"synthetics.eu-west-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"fips-ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"synthetics-fips.ca-central-1.amazonaws.com\"\n          },\n          \"fips-ca-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"synthetics-fips.ca-west-1.amazonaws.com\"\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"synthetics-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"synthetics-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"synthetics-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"synthetics-fips.us-west-2.amazonaws.com\"\n          },\n          \"il-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"synthetics.il-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"me-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"synthetics.me-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"me-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"synthetics.me-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"mx-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"synthetics.mx-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"sa-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"synthetics.sa-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"synthetics-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"synthetics-fips.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"synthetics.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"synthetics-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"synthetics-fips.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"synthetics.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"synthetics-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"synthetics-fips.us-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"synthetics.us-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"synthetics-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"synthetics-fips.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"synthetics.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"tagging\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-south-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-3\" : { },\n          \"ap-southeast-4\" : { },\n          \"ap-southeast-5\" : { },\n          \"ap-southeast-6\" : { },\n          \"ap-southeast-7\" : { },\n          \"ca-central-1\" : { },\n          \"ca-west-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-central-2\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"il-central-1\" : { },\n          \"me-central-1\" : { },\n          \"me-south-1\" : { },\n          \"mx-central-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : { },\n          \"us-east-2\" : { },\n          \"us-west-1\" : { },\n          \"us-west-2\" : { }\n        }\n      },\n      \"tax\" : {\n        \"endpoints\" : {\n          \"aws-global\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"hostname\" : \"tax.us-east-1.amazonaws.com\"\n          }\n        },\n        \"isRegionalized\" : false,\n        \"partitionEndpoint\" : \"aws-global\"\n      },\n      \"textract\" : {\n        \"endpoints\" : {\n          \"ap-northeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"textract.ap-northeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"textract.ap-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"textract.ap-southeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"textract.ap-southeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"textract-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"textract-fips.ca-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"textract.ca-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"textract.eu-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-south-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"textract.eu-south-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"textract.eu-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"textract.eu-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"textract.eu-west-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"fips-ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"textract-fips.ca-central-1.amazonaws.com\"\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"textract-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"textract-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"textract-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"textract-fips.us-west-2.amazonaws.com\"\n          },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"textract-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"textract-fips.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"textract.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"textract-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"textract-fips.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"textract.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"textract-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"textract-fips.us-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"textract.us-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"textract-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"textract-fips.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"textract.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"thinclient\" : {\n        \"endpoints\" : {\n          \"ap-south-1\" : { },\n          \"ca-central-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"us-east-1\" : { },\n          \"us-west-2\" : { }\n        }\n      },\n      \"tnb\" : {\n        \"endpoints\" : {\n          \"ap-northeast-2\" : { },\n          \"ap-southeast-2\" : { },\n          \"ca-central-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-3\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : { },\n          \"us-west-2\" : { }\n        }\n      },\n      \"transcribe\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"https\" ],\n          \"variants\" : [ {\n            \"hostname\" : \"fips.transcribe.{region}.{dnsSuffix}\",\n            \"tags\" : [ \"fips\" ]\n          } ]\n        },\n        \"endpoints\" : {\n          \"af-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"transcribe.af-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"transcribe.ap-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"transcribe.ap-northeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"transcribe.ap-northeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"transcribe.ap-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"transcribe.ap-southeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"transcribe.ap-southeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"fips.transcribe.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"transcribe-fips.ca-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"transcribe.ca-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"transcribe.eu-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-north-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"transcribe.eu-north-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"transcribe.eu-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"transcribe.eu-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"transcribe.eu-west-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"fips-ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"fips.transcribe.ca-central-1.amazonaws.com\"\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"fips.transcribe.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"fips.transcribe.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"fips.transcribe.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"fips.transcribe.us-west-2.amazonaws.com\"\n          },\n          \"me-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"transcribe.me-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"sa-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"transcribe.sa-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"fips.transcribe.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"transcribe-fips.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"transcribe.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"fips.transcribe.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"transcribe-fips.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"transcribe.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"fips.transcribe.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"transcribe-fips.us-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"transcribe.us-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"fips.transcribe.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"transcribe-fips.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"transcribe.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"transcribestreaming\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"transcribestreaming.af-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"transcribestreaming.ap-northeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"transcribestreaming.ap-northeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"transcribestreaming.ap-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"transcribestreaming.ap-southeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"transcribestreaming.ap-southeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"transcribestreaming-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"transcribestreaming-fips.ca-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"transcribestreaming.ca-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"transcribestreaming.eu-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"transcribestreaming.eu-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"transcribestreaming.eu-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"fips-ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"transcribestreaming-fips.ca-central-1.amazonaws.com\"\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"transcribestreaming-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"transcribestreaming-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"transcribestreaming-fips.us-west-2.amazonaws.com\"\n          },\n          \"sa-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"transcribestreaming.sa-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"transcribestreaming-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"transcribestreaming-fips.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"transcribestreaming.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"transcribestreaming-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"transcribestreaming-fips.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"transcribestreaming.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"transcribestreaming-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"transcribestreaming-fips.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"transcribestreaming.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"transfer\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-south-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-3\" : { },\n          \"ap-southeast-4\" : { },\n          \"ap-southeast-5\" : { },\n          \"ap-southeast-7\" : { },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"transfer-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ca-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"transfer-fips.ca-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-central-1\" : { },\n          \"eu-central-2\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"fips-ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"transfer-fips.ca-central-1.amazonaws.com\"\n          },\n          \"fips-ca-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"transfer-fips.ca-west-1.amazonaws.com\"\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"transfer-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"transfer-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"transfer-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"transfer-fips.us-west-2.amazonaws.com\"\n          },\n          \"il-central-1\" : { },\n          \"me-central-1\" : { },\n          \"me-south-1\" : { },\n          \"mx-central-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"transfer-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"transfer-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"transfer-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"transfer-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"translate\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"https\" ]\n        },\n        \"endpoints\" : {\n          \"ap-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"translate.ap-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"translate.ap-northeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-northeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"translate.ap-northeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"translate.ap-south-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"translate.ap-southeast-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ap-southeast-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"translate.ap-southeast-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"translate.ca-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"translate.eu-central-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-north-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"translate.eu-north-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"translate.eu-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"translate.eu-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"eu-west-3\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"translate.eu-west-3.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"translate-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"translate-fips.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"translate.us-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"translate-fips.us-east-1.amazonaws.com\"\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"translate-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"translate-fips.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"translate.us-east-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-east-2-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"translate-fips.us-east-2.amazonaws.com\"\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"translate-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"translate-fips.us-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"translate.us-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"translate-fips.us-west-1.amazonaws.com\"\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"translate-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"translate-fips.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"translate.us-west-2.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-west-2-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"translate-fips.us-west-2.amazonaws.com\"\n          }\n        }\n      },\n      \"trustedadvisor\" : {\n        \"endpoints\" : {\n          \"ap-northeast-2\" : { },\n          \"ap-southeast-2\" : { },\n          \"eu-west-1\" : { },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"hostname\" : \"trustedadvisor-fips.us-east-1.api.aws\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"hostname\" : \"trustedadvisor-fips.us-east-2.api.aws\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"hostname\" : \"trustedadvisor-fips.us-west-2.api.aws\"\n          },\n          \"us-east-1\" : { },\n          \"us-east-2\" : { },\n          \"us-west-2\" : { }\n        }\n      },\n      \"verifiedpermissions\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-south-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-3\" : { },\n          \"ap-southeast-4\" : { },\n          \"ap-southeast-5\" : { },\n          \"ap-southeast-6\" : { },\n          \"ap-southeast-7\" : { },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"verifiedpermissions-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ca-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"verifiedpermissions-fips.ca-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-central-1\" : { },\n          \"eu-central-2\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"fips-ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"verifiedpermissions-fips.ca-central-1.amazonaws.com\"\n          },\n          \"fips-ca-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"verifiedpermissions-fips.ca-west-1.amazonaws.com\"\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"verifiedpermissions-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"verifiedpermissions-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"verifiedpermissions-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"verifiedpermissions-fips.us-west-2.amazonaws.com\"\n          },\n          \"il-central-1\" : { },\n          \"me-central-1\" : { },\n          \"me-south-1\" : { },\n          \"mx-central-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"verifiedpermissions-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"verifiedpermissions-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"verifiedpermissions-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"verifiedpermissions-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"voice-chime\" : {\n        \"endpoints\" : {\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"voice-chime-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ca-central-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"voice-chime-fips.ca-central-1.amazonaws.com\"\n          },\n          \"eu-central-1\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"voice-chime-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"voice-chime-fips.us-east-1.amazonaws.com\"\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"voice-chime-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"voice-chime-fips.us-west-2.amazonaws.com\"\n          }\n        }\n      },\n      \"voiceid\" : {\n        \"endpoints\" : {\n          \"ap-northeast-1\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"voiceid-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-central-1\" : { },\n          \"eu-west-2\" : { },\n          \"fips-ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"voiceid-fips.ca-central-1.amazonaws.com\"\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"voiceid-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"voiceid-fips.us-west-2.amazonaws.com\"\n          },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"voiceid-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"voiceid-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"vpc-lattice\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-south-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-3\" : { },\n          \"ap-southeast-4\" : { },\n          \"ca-central-1\" : { },\n          \"ca-west-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-central-2\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"me-central-1\" : { },\n          \"me-south-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : { },\n          \"us-east-2\" : { },\n          \"us-west-1\" : { },\n          \"us-west-2\" : { }\n        }\n      },\n      \"waf\" : {\n        \"endpoints\" : {\n          \"aws\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"variants\" : [ {\n              \"hostname\" : \"waf-fips.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"aws-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"waf-fips.amazonaws.com\"\n          },\n          \"aws-global\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"hostname\" : \"waf.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"waf-fips.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"aws-global-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"waf-fips.amazonaws.com\"\n          }\n        },\n        \"isRegionalized\" : false,\n        \"partitionEndpoint\" : \"aws-global\"\n      },\n      \"waf-regional\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"af-south-1\"\n            },\n            \"hostname\" : \"waf-regional.af-south-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"waf-regional-fips.af-south-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ap-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-east-1\"\n            },\n            \"hostname\" : \"waf-regional.ap-east-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"waf-regional-fips.ap-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ap-northeast-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-northeast-1\"\n            },\n            \"hostname\" : \"waf-regional.ap-northeast-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"waf-regional-fips.ap-northeast-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ap-northeast-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-northeast-2\"\n            },\n            \"hostname\" : \"waf-regional.ap-northeast-2.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"waf-regional-fips.ap-northeast-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ap-northeast-3\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-northeast-3\"\n            },\n            \"hostname\" : \"waf-regional.ap-northeast-3.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"waf-regional-fips.ap-northeast-3.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ap-south-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-south-1\"\n            },\n            \"hostname\" : \"waf-regional.ap-south-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"waf-regional-fips.ap-south-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ap-south-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-south-2\"\n            },\n            \"hostname\" : \"waf-regional.ap-south-2.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"waf-regional-fips.ap-south-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ap-southeast-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-southeast-1\"\n            },\n            \"hostname\" : \"waf-regional.ap-southeast-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"waf-regional-fips.ap-southeast-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ap-southeast-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-southeast-2\"\n            },\n            \"hostname\" : \"waf-regional.ap-southeast-2.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"waf-regional-fips.ap-southeast-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ap-southeast-3\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-southeast-3\"\n            },\n            \"hostname\" : \"waf-regional.ap-southeast-3.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"waf-regional-fips.ap-southeast-3.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ap-southeast-4\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-southeast-4\"\n            },\n            \"hostname\" : \"waf-regional.ap-southeast-4.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"waf-regional-fips.ap-southeast-4.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"hostname\" : \"waf-regional.ca-central-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"waf-regional-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-central-1\"\n            },\n            \"hostname\" : \"waf-regional.eu-central-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"waf-regional-fips.eu-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-central-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-central-2\"\n            },\n            \"hostname\" : \"waf-regional.eu-central-2.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"waf-regional-fips.eu-central-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-north-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-north-1\"\n            },\n            \"hostname\" : \"waf-regional.eu-north-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"waf-regional-fips.eu-north-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-south-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-south-1\"\n            },\n            \"hostname\" : \"waf-regional.eu-south-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"waf-regional-fips.eu-south-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-south-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-south-2\"\n            },\n            \"hostname\" : \"waf-regional.eu-south-2.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"waf-regional-fips.eu-south-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-west-1\"\n            },\n            \"hostname\" : \"waf-regional.eu-west-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"waf-regional-fips.eu-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-west-2\"\n            },\n            \"hostname\" : \"waf-regional.eu-west-2.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"waf-regional-fips.eu-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-west-3\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-west-3\"\n            },\n            \"hostname\" : \"waf-regional.eu-west-3.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"waf-regional-fips.eu-west-3.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"fips-af-south-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"af-south-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"waf-regional-fips.af-south-1.amazonaws.com\"\n          },\n          \"fips-ap-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"waf-regional-fips.ap-east-1.amazonaws.com\"\n          },\n          \"fips-ap-northeast-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-northeast-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"waf-regional-fips.ap-northeast-1.amazonaws.com\"\n          },\n          \"fips-ap-northeast-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-northeast-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"waf-regional-fips.ap-northeast-2.amazonaws.com\"\n          },\n          \"fips-ap-northeast-3\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-northeast-3\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"waf-regional-fips.ap-northeast-3.amazonaws.com\"\n          },\n          \"fips-ap-south-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-south-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"waf-regional-fips.ap-south-1.amazonaws.com\"\n          },\n          \"fips-ap-south-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-south-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"waf-regional-fips.ap-south-2.amazonaws.com\"\n          },\n          \"fips-ap-southeast-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-southeast-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"waf-regional-fips.ap-southeast-1.amazonaws.com\"\n          },\n          \"fips-ap-southeast-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-southeast-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"waf-regional-fips.ap-southeast-2.amazonaws.com\"\n          },\n          \"fips-ap-southeast-3\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-southeast-3\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"waf-regional-fips.ap-southeast-3.amazonaws.com\"\n          },\n          \"fips-ap-southeast-4\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-southeast-4\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"waf-regional-fips.ap-southeast-4.amazonaws.com\"\n          },\n          \"fips-ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"waf-regional-fips.ca-central-1.amazonaws.com\"\n          },\n          \"fips-eu-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"waf-regional-fips.eu-central-1.amazonaws.com\"\n          },\n          \"fips-eu-central-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-central-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"waf-regional-fips.eu-central-2.amazonaws.com\"\n          },\n          \"fips-eu-north-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-north-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"waf-regional-fips.eu-north-1.amazonaws.com\"\n          },\n          \"fips-eu-south-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-south-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"waf-regional-fips.eu-south-1.amazonaws.com\"\n          },\n          \"fips-eu-south-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-south-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"waf-regional-fips.eu-south-2.amazonaws.com\"\n          },\n          \"fips-eu-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"waf-regional-fips.eu-west-1.amazonaws.com\"\n          },\n          \"fips-eu-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"waf-regional-fips.eu-west-2.amazonaws.com\"\n          },\n          \"fips-eu-west-3\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-west-3\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"waf-regional-fips.eu-west-3.amazonaws.com\"\n          },\n          \"fips-il-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"il-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"waf-regional-fips.il-central-1.amazonaws.com\"\n          },\n          \"fips-me-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"me-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"waf-regional-fips.me-central-1.amazonaws.com\"\n          },\n          \"fips-me-south-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"me-south-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"waf-regional-fips.me-south-1.amazonaws.com\"\n          },\n          \"fips-sa-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"sa-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"waf-regional-fips.sa-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"waf-regional-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"waf-regional-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"waf-regional-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"waf-regional-fips.us-west-2.amazonaws.com\"\n          },\n          \"il-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"il-central-1\"\n            },\n            \"hostname\" : \"waf-regional.il-central-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"waf-regional-fips.il-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"me-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"me-central-1\"\n            },\n            \"hostname\" : \"waf-regional.me-central-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"waf-regional-fips.me-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"me-south-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"me-south-1\"\n            },\n            \"hostname\" : \"waf-regional.me-south-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"waf-regional-fips.me-south-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"sa-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"sa-east-1\"\n            },\n            \"hostname\" : \"waf-regional.sa-east-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"waf-regional-fips.sa-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"hostname\" : \"waf-regional.us-east-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"waf-regional-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"hostname\" : \"waf-regional.us-east-2.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"waf-regional-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"hostname\" : \"waf-regional.us-west-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"waf-regional-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"hostname\" : \"waf-regional.us-west-2.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"waf-regional-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"wafv2\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"af-south-1\"\n            },\n            \"hostname\" : \"wafv2.af-south-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"wafv2-fips.af-south-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ap-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-east-1\"\n            },\n            \"hostname\" : \"wafv2.ap-east-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"wafv2-fips.ap-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-northeast-1\"\n            },\n            \"hostname\" : \"wafv2.ap-northeast-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"wafv2-fips.ap-northeast-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ap-northeast-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-northeast-2\"\n            },\n            \"hostname\" : \"wafv2.ap-northeast-2.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"wafv2-fips.ap-northeast-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ap-northeast-3\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-northeast-3\"\n            },\n            \"hostname\" : \"wafv2.ap-northeast-3.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"wafv2-fips.ap-northeast-3.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ap-south-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-south-1\"\n            },\n            \"hostname\" : \"wafv2.ap-south-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"wafv2-fips.ap-south-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ap-south-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-south-2\"\n            },\n            \"hostname\" : \"wafv2.ap-south-2.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"wafv2-fips.ap-south-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ap-southeast-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-southeast-1\"\n            },\n            \"hostname\" : \"wafv2.ap-southeast-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"wafv2-fips.ap-southeast-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ap-southeast-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-southeast-2\"\n            },\n            \"hostname\" : \"wafv2.ap-southeast-2.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"wafv2-fips.ap-southeast-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ap-southeast-3\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-southeast-3\"\n            },\n            \"hostname\" : \"wafv2.ap-southeast-3.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"wafv2-fips.ap-southeast-3.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ap-southeast-4\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-southeast-4\"\n            },\n            \"hostname\" : \"wafv2.ap-southeast-4.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"wafv2-fips.ap-southeast-4.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ap-southeast-5\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-southeast-5\"\n            },\n            \"hostname\" : \"wafv2.ap-southeast-5.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"wafv2-fips.ap-southeast-5.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ap-southeast-7\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-southeast-7\"\n            },\n            \"hostname\" : \"wafv2.ap-southeast-7.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"wafv2-fips.ap-southeast-7.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"hostname\" : \"wafv2.ca-central-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"wafv2-fips.ca-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"ca-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-west-1\"\n            },\n            \"hostname\" : \"wafv2.ca-west-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"wafv2-fips.ca-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-central-1\"\n            },\n            \"hostname\" : \"wafv2.eu-central-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"wafv2-fips.eu-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-central-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-central-2\"\n            },\n            \"hostname\" : \"wafv2.eu-central-2.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"wafv2-fips.eu-central-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-north-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-north-1\"\n            },\n            \"hostname\" : \"wafv2.eu-north-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"wafv2-fips.eu-north-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-south-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-south-1\"\n            },\n            \"hostname\" : \"wafv2.eu-south-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"wafv2-fips.eu-south-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-south-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-south-2\"\n            },\n            \"hostname\" : \"wafv2.eu-south-2.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"wafv2-fips.eu-south-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-west-1\"\n            },\n            \"hostname\" : \"wafv2.eu-west-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"wafv2-fips.eu-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-west-2\"\n            },\n            \"hostname\" : \"wafv2.eu-west-2.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"wafv2-fips.eu-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-west-3\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-west-3\"\n            },\n            \"hostname\" : \"wafv2.eu-west-3.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"wafv2-fips.eu-west-3.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"fips-af-south-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"af-south-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"wafv2-fips.af-south-1.amazonaws.com\"\n          },\n          \"fips-ap-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"wafv2-fips.ap-east-1.amazonaws.com\"\n          },\n          \"fips-ap-northeast-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-northeast-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"wafv2-fips.ap-northeast-1.amazonaws.com\"\n          },\n          \"fips-ap-northeast-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-northeast-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"wafv2-fips.ap-northeast-2.amazonaws.com\"\n          },\n          \"fips-ap-northeast-3\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-northeast-3\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"wafv2-fips.ap-northeast-3.amazonaws.com\"\n          },\n          \"fips-ap-south-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-south-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"wafv2-fips.ap-south-1.amazonaws.com\"\n          },\n          \"fips-ap-south-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-south-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"wafv2-fips.ap-south-2.amazonaws.com\"\n          },\n          \"fips-ap-southeast-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-southeast-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"wafv2-fips.ap-southeast-1.amazonaws.com\"\n          },\n          \"fips-ap-southeast-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-southeast-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"wafv2-fips.ap-southeast-2.amazonaws.com\"\n          },\n          \"fips-ap-southeast-3\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-southeast-3\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"wafv2-fips.ap-southeast-3.amazonaws.com\"\n          },\n          \"fips-ap-southeast-4\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-southeast-4\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"wafv2-fips.ap-southeast-4.amazonaws.com\"\n          },\n          \"fips-ap-southeast-5\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-southeast-5\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"wafv2-fips.ap-southeast-5.amazonaws.com\"\n          },\n          \"fips-ap-southeast-7\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ap-southeast-7\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"wafv2-fips.ap-southeast-7.amazonaws.com\"\n          },\n          \"fips-ca-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"wafv2-fips.ca-central-1.amazonaws.com\"\n          },\n          \"fips-ca-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"ca-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"wafv2-fips.ca-west-1.amazonaws.com\"\n          },\n          \"fips-eu-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"wafv2-fips.eu-central-1.amazonaws.com\"\n          },\n          \"fips-eu-central-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-central-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"wafv2-fips.eu-central-2.amazonaws.com\"\n          },\n          \"fips-eu-north-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-north-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"wafv2-fips.eu-north-1.amazonaws.com\"\n          },\n          \"fips-eu-south-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-south-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"wafv2-fips.eu-south-1.amazonaws.com\"\n          },\n          \"fips-eu-south-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-south-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"wafv2-fips.eu-south-2.amazonaws.com\"\n          },\n          \"fips-eu-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"wafv2-fips.eu-west-1.amazonaws.com\"\n          },\n          \"fips-eu-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"wafv2-fips.eu-west-2.amazonaws.com\"\n          },\n          \"fips-eu-west-3\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-west-3\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"wafv2-fips.eu-west-3.amazonaws.com\"\n          },\n          \"fips-il-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"il-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"wafv2-fips.il-central-1.amazonaws.com\"\n          },\n          \"fips-me-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"me-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"wafv2-fips.me-central-1.amazonaws.com\"\n          },\n          \"fips-me-south-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"me-south-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"wafv2-fips.me-south-1.amazonaws.com\"\n          },\n          \"fips-mx-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"mx-central-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"wafv2-fips.mx-central-1.amazonaws.com\"\n          },\n          \"fips-sa-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"sa-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"wafv2-fips.sa-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"wafv2-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"wafv2-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"wafv2-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"wafv2-fips.us-west-2.amazonaws.com\"\n          },\n          \"il-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"il-central-1\"\n            },\n            \"hostname\" : \"wafv2.il-central-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"wafv2-fips.il-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"me-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"me-central-1\"\n            },\n            \"hostname\" : \"wafv2.me-central-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"wafv2-fips.me-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"me-south-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"me-south-1\"\n            },\n            \"hostname\" : \"wafv2.me-south-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"wafv2-fips.me-south-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"mx-central-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"mx-central-1\"\n            },\n            \"hostname\" : \"wafv2.mx-central-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"wafv2-fips.mx-central-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"sa-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"sa-east-1\"\n            },\n            \"hostname\" : \"wafv2.sa-east-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"wafv2-fips.sa-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"hostname\" : \"wafv2.us-east-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"wafv2-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"hostname\" : \"wafv2.us-east-2.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"wafv2-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"hostname\" : \"wafv2.us-west-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"wafv2-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"hostname\" : \"wafv2.us-west-2.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"wafv2-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"wellarchitected\" : {\n        \"endpoints\" : {\n          \"ap-east-1\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-south-1\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ca-central-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-north-1\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"me-south-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : { },\n          \"us-east-2\" : { },\n          \"us-west-1\" : { },\n          \"us-west-2\" : { }\n        }\n      },\n      \"wisdom\" : {\n        \"endpoints\" : {\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ca-central-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-central-1\" : { },\n          \"eu-west-2\" : { },\n          \"fips-ca-central-1\" : {\n            \"deprecated\" : true\n          },\n          \"fips-us-east-1\" : {\n            \"deprecated\" : true\n          },\n          \"fips-us-west-2\" : {\n            \"deprecated\" : true\n          },\n          \"ui-ap-northeast-1\" : { },\n          \"ui-ap-northeast-2\" : { },\n          \"ui-ap-southeast-1\" : { },\n          \"ui-ap-southeast-2\" : { },\n          \"ui-ca-central-1\" : { },\n          \"ui-eu-central-1\" : { },\n          \"ui-eu-west-2\" : { },\n          \"ui-us-east-1\" : { },\n          \"ui-us-west-2\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"workdocs\" : {\n        \"endpoints\" : {\n          \"ap-northeast-1\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"eu-west-1\" : { },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"workdocs-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"workdocs-fips.us-west-2.amazonaws.com\"\n          },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"workdocs-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"workdocs-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"workmail\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"https\" ]\n        },\n        \"endpoints\" : {\n          \"eu-west-1\" : { },\n          \"us-east-1\" : { },\n          \"us-west-2\" : { }\n        }\n      },\n      \"workspaces\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-south-1\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ca-central-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"workspaces-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"workspaces-fips.us-west-2.amazonaws.com\"\n          },\n          \"il-central-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"workspaces-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"workspaces-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"workspaces-web\" : {\n        \"endpoints\" : {\n          \"ap-northeast-1\" : { },\n          \"ap-south-1\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ca-central-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"workspaces-web-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"workspaces-web-fips.us-west-2.amazonaws.com\"\n          },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"workspaces-web-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"workspaces-web-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"xray\" : {\n        \"endpoints\" : {\n          \"af-south-1\" : { },\n          \"ap-east-1\" : { },\n          \"ap-east-2\" : { },\n          \"ap-northeast-1\" : { },\n          \"ap-northeast-2\" : { },\n          \"ap-northeast-3\" : { },\n          \"ap-south-1\" : { },\n          \"ap-south-2\" : { },\n          \"ap-southeast-1\" : { },\n          \"ap-southeast-2\" : { },\n          \"ap-southeast-3\" : { },\n          \"ap-southeast-4\" : { },\n          \"ap-southeast-5\" : { },\n          \"ap-southeast-6\" : { },\n          \"ap-southeast-7\" : { },\n          \"ca-central-1\" : { },\n          \"ca-west-1\" : { },\n          \"eu-central-1\" : { },\n          \"eu-central-2\" : { },\n          \"eu-north-1\" : { },\n          \"eu-south-1\" : { },\n          \"eu-south-2\" : { },\n          \"eu-west-1\" : { },\n          \"eu-west-2\" : { },\n          \"eu-west-3\" : { },\n          \"fips-us-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"xray-fips.us-east-1.amazonaws.com\"\n          },\n          \"fips-us-east-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-east-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"xray-fips.us-east-2.amazonaws.com\"\n          },\n          \"fips-us-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"xray-fips.us-west-1.amazonaws.com\"\n          },\n          \"fips-us-west-2\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-west-2\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"xray-fips.us-west-2.amazonaws.com\"\n          },\n          \"il-central-1\" : { },\n          \"me-central-1\" : { },\n          \"me-south-1\" : { },\n          \"mx-central-1\" : { },\n          \"sa-east-1\" : { },\n          \"us-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"xray-fips.us-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-east-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"xray-fips.us-east-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"xray-fips.us-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-west-2\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"xray-fips.us-west-2.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      }\n    }\n  }, {\n    \"defaults\" : {\n      \"hostname\" : \"{service}.{region}.{dnsSuffix}\",\n      \"protocols\" : [ \"https\" ],\n      \"signatureVersions\" : [ \"v4\" ],\n      \"variants\" : [ {\n        \"dnsSuffix\" : \"amazonaws.com.cn\",\n        \"hostname\" : \"{service}-fips.{region}.{dnsSuffix}\",\n        \"tags\" : [ \"fips\" ]\n      }, {\n        \"dnsSuffix\" : \"api.amazonwebservices.com.cn\",\n        \"hostname\" : \"{service}-fips.{region}.{dnsSuffix}\",\n        \"tags\" : [ \"dualstack\", \"fips\" ]\n      }, {\n        \"dnsSuffix\" : \"api.amazonwebservices.com.cn\",\n        \"hostname\" : \"{service}.{region}.{dnsSuffix}\",\n        \"tags\" : [ \"dualstack\" ]\n      } ]\n    },\n    \"dnsSuffix\" : \"amazonaws.com.cn\",\n    \"partition\" : \"aws-cn\",\n    \"partitionName\" : \"AWS China\",\n    \"regionRegex\" : \"^cn\\\\-\\\\w+\\\\-\\\\d+$\",\n    \"regions\" : {\n      \"cn-north-1\" : {\n        \"description\" : \"China (Beijing)\"\n      },\n      \"cn-northwest-1\" : {\n        \"description\" : \"China (Ningxia)\"\n      }\n    },\n    \"services\" : {\n      \"access-analyzer\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"access-analyzer.cn-north-1.api.amazonwebservices.com.cn\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"cn-northwest-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"access-analyzer.cn-northwest-1.api.amazonwebservices.com.cn\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"account\" : {\n        \"endpoints\" : {\n          \"aws-cn-global\" : {\n            \"credentialScope\" : {\n              \"region\" : \"cn-northwest-1\"\n            },\n            \"hostname\" : \"account.cn-northwest-1.amazonaws.com.cn\"\n          }\n        },\n        \"isRegionalized\" : false,\n        \"partitionEndpoint\" : \"aws-cn-global\"\n      },\n      \"acm\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : { },\n          \"cn-northwest-1\" : { }\n        }\n      },\n      \"acm-pca\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"https\" ]\n        },\n        \"endpoints\" : {\n          \"cn-north-1\" : { },\n          \"cn-northwest-1\" : { }\n        }\n      },\n      \"airflow\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : { },\n          \"cn-northwest-1\" : { }\n        }\n      },\n      \"api.ecr\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"cn-north-1\"\n            },\n            \"hostname\" : \"api.ecr.cn-north-1.amazonaws.com.cn\",\n            \"variants\" : [ {\n              \"hostname\" : \"ecr.cn-north-1.api.amazonwebservices.com.cn\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"cn-northwest-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"cn-northwest-1\"\n            },\n            \"hostname\" : \"api.ecr.cn-northwest-1.amazonaws.com.cn\",\n            \"variants\" : [ {\n              \"hostname\" : \"ecr.cn-northwest-1.api.amazonwebservices.com.cn\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"api.pricing\" : {\n        \"defaults\" : {\n          \"credentialScope\" : {\n            \"service\" : \"pricing\"\n          }\n        },\n        \"endpoints\" : {\n          \"cn-northwest-1\" : { }\n        }\n      },\n      \"api.sagemaker\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : { },\n          \"cn-northwest-1\" : { }\n        }\n      },\n      \"api.tunneling.iot\" : {\n        \"defaults\" : {\n          \"variants\" : [ {\n            \"dnsSuffix\" : \"amazonaws.com.cn\",\n            \"hostname\" : \"api.tunneling.iot-fips.{region}.{dnsSuffix}\",\n            \"tags\" : [ \"fips\" ]\n          }, {\n            \"dnsSuffix\" : \"api.amazonwebservices.com.cn\",\n            \"hostname\" : \"api.iot-tunneling-fips.{region}.{dnsSuffix}\",\n            \"tags\" : [ \"dualstack\", \"fips\" ]\n          }, {\n            \"dnsSuffix\" : \"api.amazonwebservices.com.cn\",\n            \"hostname\" : \"api.iot-tunneling.{region}.{dnsSuffix}\",\n            \"tags\" : [ \"dualstack\" ]\n          } ]\n        },\n        \"endpoints\" : {\n          \"cn-north-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"api.iot-tunneling.cn-north-1.api.amazonwebservices.com.cn\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"cn-northwest-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"api.iot-tunneling.cn-northwest-1.api.amazonwebservices.com.cn\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"apigateway\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : { },\n          \"cn-northwest-1\" : { }\n        }\n      },\n      \"appconfig\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : { },\n          \"cn-northwest-1\" : { }\n        }\n      },\n      \"appconfigdata\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : { },\n          \"cn-northwest-1\" : { }\n        }\n      },\n      \"application-autoscaling\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"http\", \"https\" ]\n        },\n        \"endpoints\" : {\n          \"cn-north-1\" : { },\n          \"cn-northwest-1\" : { }\n        }\n      },\n      \"applicationinsights\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"applicationinsights.cn-north-1.api.amazonwebservices.com.cn\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"cn-northwest-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"applicationinsights.cn-northwest-1.api.amazonwebservices.com.cn\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"appmesh\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"appmesh.cn-north-1.api.amazonwebservices.com.cn\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"cn-northwest-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"appmesh.cn-northwest-1.api.amazonwebservices.com.cn\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"appsync\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"appsync.cn-north-1.api.amazonwebservices.com.cn\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"cn-northwest-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"appsync.cn-northwest-1.api.amazonwebservices.com.cn\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"arc-zonal-shift\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : { },\n          \"cn-northwest-1\" : { }\n        }\n      },\n      \"athena\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"athena.cn-north-1.api.amazonwebservices.com.cn\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"cn-northwest-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"athena.cn-northwest-1.api.amazonwebservices.com.cn\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"autoscaling\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"http\", \"https\" ]\n        },\n        \"endpoints\" : {\n          \"cn-north-1\" : { },\n          \"cn-northwest-1\" : { }\n        }\n      },\n      \"autoscaling-plans\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"http\", \"https\" ]\n        },\n        \"endpoints\" : {\n          \"cn-north-1\" : { },\n          \"cn-northwest-1\" : { }\n        }\n      },\n      \"backup\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : { },\n          \"cn-northwest-1\" : { }\n        }\n      },\n      \"batch\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : { },\n          \"cn-northwest-1\" : { }\n        }\n      },\n      \"budgets\" : {\n        \"endpoints\" : {\n          \"aws-cn-global\" : {\n            \"credentialScope\" : {\n              \"region\" : \"cn-northwest-1\"\n            },\n            \"hostname\" : \"budgets.amazonaws.com.cn\"\n          }\n        },\n        \"isRegionalized\" : false,\n        \"partitionEndpoint\" : \"aws-cn-global\"\n      },\n      \"cassandra\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : { },\n          \"cn-northwest-1\" : { }\n        }\n      },\n      \"ce\" : {\n        \"endpoints\" : {\n          \"aws-cn-global\" : {\n            \"credentialScope\" : {\n              \"region\" : \"cn-northwest-1\"\n            },\n            \"hostname\" : \"ce.cn-northwest-1.amazonaws.com.cn\"\n          }\n        },\n        \"isRegionalized\" : false,\n        \"partitionEndpoint\" : \"aws-cn-global\"\n      },\n      \"cloudcontrolapi\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cloudcontrolapi.cn-north-1.api.amazonwebservices.com.cn\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"cn-northwest-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cloudcontrolapi.cn-northwest-1.api.amazonwebservices.com.cn\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"cloudformation\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : { },\n          \"cn-northwest-1\" : { }\n        }\n      },\n      \"cloudfront\" : {\n        \"endpoints\" : {\n          \"aws-cn-global\" : {\n            \"credentialScope\" : {\n              \"region\" : \"cn-northwest-1\"\n            },\n            \"hostname\" : \"cloudfront.cn-northwest-1.amazonaws.com.cn\",\n            \"protocols\" : [ \"http\", \"https\" ]\n          }\n        },\n        \"isRegionalized\" : false,\n        \"partitionEndpoint\" : \"aws-cn-global\"\n      },\n      \"cloudtrail\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : { },\n          \"cn-northwest-1\" : { }\n        }\n      },\n      \"codebuild\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : { },\n          \"cn-northwest-1\" : { }\n        }\n      },\n      \"codecommit\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : { },\n          \"cn-northwest-1\" : { }\n        }\n      },\n      \"codedeploy\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : { },\n          \"cn-northwest-1\" : { }\n        }\n      },\n      \"codepipeline\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : { },\n          \"cn-northwest-1\" : { }\n        }\n      },\n      \"cognito-identity\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cognito-identity.cn-north-1.amazonaws.com.cn\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"compute-optimizer\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"cn-north-1\"\n            },\n            \"hostname\" : \"compute-optimizer.cn-north-1.amazonaws.com.cn\"\n          },\n          \"cn-northwest-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"cn-northwest-1\"\n            },\n            \"hostname\" : \"compute-optimizer.cn-northwest-1.amazonaws.com.cn\"\n          }\n        }\n      },\n      \"config\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : { },\n          \"cn-northwest-1\" : { }\n        }\n      },\n      \"cur\" : {\n        \"endpoints\" : {\n          \"cn-northwest-1\" : { }\n        }\n      },\n      \"data-ats.iot\" : {\n        \"defaults\" : {\n          \"credentialScope\" : {\n            \"service\" : \"iotdata\"\n          },\n          \"protocols\" : [ \"https\" ]\n        },\n        \"endpoints\" : {\n          \"cn-north-1\" : {\n            \"hostname\" : \"data.ats.iot.cn-north-1.amazonaws.com.cn\",\n            \"protocols\" : [ \"https\" ]\n          },\n          \"cn-northwest-1\" : { }\n        }\n      },\n      \"data.iot\" : {\n        \"defaults\" : {\n          \"credentialScope\" : {\n            \"service\" : \"iotdata\"\n          },\n          \"protocols\" : [ \"https\" ]\n        },\n        \"endpoints\" : {\n          \"cn-north-1\" : { },\n          \"cn-northwest-1\" : { }\n        }\n      },\n      \"data.jobs.iot\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : { },\n          \"cn-northwest-1\" : { }\n        }\n      },\n      \"databrew\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : { },\n          \"cn-northwest-1\" : { }\n        }\n      },\n      \"datasync\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"datasync.cn-north-1.api.amazonwebservices.com.cn\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"cn-northwest-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"datasync.cn-northwest-1.api.amazonwebservices.com.cn\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"datazone\" : {\n        \"defaults\" : {\n          \"dnsSuffix\" : \"api.amazonwebservices.com.cn\",\n          \"variants\" : [ {\n            \"dnsSuffix\" : \"api.amazonwebservices.com.cn\",\n            \"hostname\" : \"{service}-fips.{region}.{dnsSuffix}\",\n            \"tags\" : [ \"fips\" ]\n          } ]\n        },\n        \"endpoints\" : {\n          \"cn-north-1\" : {\n            \"hostname\" : \"datazone.cn-north-1.api.amazonwebservices.com.cn\"\n          },\n          \"cn-northwest-1\" : {\n            \"hostname\" : \"datazone.cn-northwest-1.api.amazonwebservices.com.cn\"\n          }\n        }\n      },\n      \"dax\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : { },\n          \"cn-northwest-1\" : { }\n        }\n      },\n      \"directconnect\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : { },\n          \"cn-northwest-1\" : { }\n        }\n      },\n      \"dlm\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"dlm.cn-north-1.api.amazonwebservices.com.cn\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"cn-northwest-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"dlm.cn-northwest-1.api.amazonwebservices.com.cn\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"dms\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : { },\n          \"cn-northwest-1\" : { }\n        }\n      },\n      \"docdb\" : {\n        \"endpoints\" : {\n          \"cn-northwest-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"cn-northwest-1\"\n            },\n            \"hostname\" : \"rds.cn-northwest-1.amazonaws.com.cn\"\n          }\n        }\n      },\n      \"ds\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : { },\n          \"cn-northwest-1\" : { }\n        }\n      },\n      \"dynamodb\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"http\", \"https\" ]\n        },\n        \"endpoints\" : {\n          \"cn-north-1\" : { },\n          \"cn-northwest-1\" : { }\n        }\n      },\n      \"ebs\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : { },\n          \"cn-northwest-1\" : { }\n        }\n      },\n      \"ec2\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"http\", \"https\" ]\n        },\n        \"endpoints\" : {\n          \"cn-north-1\" : { },\n          \"cn-northwest-1\" : { }\n        }\n      },\n      \"ecs\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : { },\n          \"cn-northwest-1\" : { }\n        }\n      },\n      \"eks\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"http\", \"https\" ]\n        },\n        \"endpoints\" : {\n          \"cn-north-1\" : { },\n          \"cn-northwest-1\" : { }\n        }\n      },\n      \"eks-auth\" : {\n        \"defaults\" : {\n          \"dnsSuffix\" : \"api.amazonwebservices.com.cn\",\n          \"variants\" : [ {\n            \"dnsSuffix\" : \"api.amazonwebservices.com.cn\",\n            \"hostname\" : \"{service}-fips.{region}.{dnsSuffix}\",\n            \"tags\" : [ \"fips\" ]\n          } ]\n        },\n        \"endpoints\" : {\n          \"cn-north-1\" : {\n            \"hostname\" : \"eks-auth.cn-north-1.api.amazonwebservices.com.cn\"\n          },\n          \"cn-northwest-1\" : {\n            \"hostname\" : \"eks-auth.cn-northwest-1.api.amazonwebservices.com.cn\"\n          }\n        }\n      },\n      \"elasticache\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : { },\n          \"cn-northwest-1\" : { }\n        }\n      },\n      \"elasticbeanstalk\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticbeanstalk.cn-north-1.api.amazonwebservices.com.cn\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"cn-northwest-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticbeanstalk.cn-northwest-1.api.amazonwebservices.com.cn\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"elasticfilesystem\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticfilesystem-fips.cn-north-1.amazonaws.com.cn\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"cn-northwest-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticfilesystem-fips.cn-northwest-1.amazonaws.com.cn\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"fips-cn-north-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"cn-north-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"elasticfilesystem-fips.cn-north-1.amazonaws.com.cn\"\n          },\n          \"fips-cn-northwest-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"cn-northwest-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"elasticfilesystem-fips.cn-northwest-1.amazonaws.com.cn\"\n          }\n        }\n      },\n      \"elasticloadbalancing\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"https\" ]\n        },\n        \"endpoints\" : {\n          \"cn-north-1\" : { },\n          \"cn-northwest-1\" : { }\n        }\n      },\n      \"elasticmapreduce\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"https\" ]\n        },\n        \"endpoints\" : {\n          \"cn-north-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticmapreduce.cn-north-1.api.amazonwebservices.com.cn\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"cn-northwest-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticmapreduce.cn-northwest-1.api.amazonwebservices.com.cn\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"emr-containers\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : { },\n          \"cn-northwest-1\" : { }\n        }\n      },\n      \"emr-serverless\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : { },\n          \"cn-northwest-1\" : { }\n        }\n      },\n      \"entitlement.marketplace\" : {\n        \"endpoints\" : {\n          \"cn-northwest-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"cn-northwest-1\"\n            },\n            \"hostname\" : \"entitlement-marketplace.cn-northwest-1.amazonaws.com.cn\",\n            \"protocols\" : [ \"https\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"entitlement-marketplace.cn-northwest-1.api.amazonwebservices.com.cn\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"es\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"aos.cn-north-1.api.amazonwebservices.com.cn\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"cn-northwest-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"aos.cn-northwest-1.api.amazonwebservices.com.cn\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"events\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"events.cn-north-1.api.amazonwebservices.com.cn\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"cn-northwest-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"events.cn-northwest-1.api.amazonwebservices.com.cn\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"firehose\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"firehose.cn-north-1.api.amazonwebservices.com.cn\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"cn-northwest-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"firehose.cn-northwest-1.api.amazonwebservices.com.cn\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"fms\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"https\" ]\n        },\n        \"endpoints\" : {\n          \"cn-north-1\" : { },\n          \"cn-northwest-1\" : { }\n        }\n      },\n      \"fsx\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : { },\n          \"cn-northwest-1\" : { }\n        }\n      },\n      \"gamelift\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : { },\n          \"cn-northwest-1\" : { }\n        }\n      },\n      \"gameliftstreams\" : {\n        \"defaults\" : {\n          \"dnsSuffix\" : \"api.amazonwebservices.com.cn\",\n          \"variants\" : [ {\n            \"dnsSuffix\" : \"api.amazonwebservices.com.cn\",\n            \"hostname\" : \"{service}-fips.{region}.{dnsSuffix}\",\n            \"tags\" : [ \"fips\" ]\n          } ]\n        },\n        \"endpoints\" : {\n          \"cn-north-1\" : {\n            \"hostname\" : \"gameliftstreams.cn-north-1.api.amazonwebservices.com.cn\"\n          },\n          \"cn-northwest-1\" : {\n            \"hostname\" : \"gameliftstreams.cn-northwest-1.api.amazonwebservices.com.cn\"\n          }\n        }\n      },\n      \"glacier\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"http\", \"https\" ]\n        },\n        \"endpoints\" : {\n          \"cn-north-1\" : { },\n          \"cn-northwest-1\" : { }\n        }\n      },\n      \"glue\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"glue.cn-north-1.api.amazonwebservices.com.cn\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"cn-northwest-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"glue.cn-northwest-1.api.amazonwebservices.com.cn\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"greengrass\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"https\" ]\n        },\n        \"endpoints\" : {\n          \"cn-north-1\" : { }\n        },\n        \"isRegionalized\" : true\n      },\n      \"guardduty\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"https\" ]\n        },\n        \"endpoints\" : {\n          \"cn-north-1\" : { },\n          \"cn-northwest-1\" : { }\n        },\n        \"isRegionalized\" : true\n      },\n      \"health\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"https\" ],\n          \"sslCommonName\" : \"health.cn-northwest-1.amazonaws.com.cn\"\n        },\n        \"endpoints\" : {\n          \"aws-cn-global\" : {\n            \"credentialScope\" : {\n              \"region\" : \"cn-northwest-1\"\n            },\n            \"hostname\" : \"global.health.amazonaws.com.cn\"\n          }\n        },\n        \"isRegionalized\" : false,\n        \"partitionEndpoint\" : \"aws-cn-global\"\n      },\n      \"iam\" : {\n        \"endpoints\" : {\n          \"aws-cn-global\" : {\n            \"credentialScope\" : {\n              \"region\" : \"cn-north-1\"\n            },\n            \"hostname\" : \"iam.cn-north-1.amazonaws.com.cn\"\n          }\n        },\n        \"isRegionalized\" : false,\n        \"partitionEndpoint\" : \"aws-cn-global\"\n      },\n      \"identitystore\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : { },\n          \"cn-northwest-1\" : { }\n        }\n      },\n      \"inspector2\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : { },\n          \"cn-northwest-1\" : { }\n        }\n      },\n      \"internetmonitor\" : {\n        \"defaults\" : {\n          \"dnsSuffix\" : \"api.amazonwebservices.com.cn\",\n          \"variants\" : [ {\n            \"dnsSuffix\" : \"api.amazonwebservices.com.cn\",\n            \"hostname\" : \"{service}-fips.{region}.{dnsSuffix}\",\n            \"tags\" : [ \"fips\" ]\n          } ]\n        },\n        \"endpoints\" : {\n          \"cn-north-1\" : {\n            \"hostname\" : \"internetmonitor.cn-north-1.api.amazonwebservices.com.cn\"\n          },\n          \"cn-northwest-1\" : {\n            \"hostname\" : \"internetmonitor.cn-northwest-1.api.amazonwebservices.com.cn\"\n          }\n        }\n      },\n      \"iot\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : { },\n          \"cn-northwest-1\" : { }\n        }\n      },\n      \"iotanalytics\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : { }\n        }\n      },\n      \"iotevents\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : { }\n        }\n      },\n      \"ioteventsdata\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"cn-north-1\"\n            },\n            \"hostname\" : \"data.iotevents.cn-north-1.amazonaws.com.cn\"\n          }\n        }\n      },\n      \"iotsecuredtunneling\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : { },\n          \"cn-northwest-1\" : { }\n        }\n      },\n      \"iotsitewise\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : { }\n        }\n      },\n      \"iottwinmaker\" : {\n        \"endpoints\" : {\n          \"api-cn-north-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"cn-north-1\"\n            },\n            \"hostname\" : \"api.iottwinmaker.cn-north-1.amazonaws.com.cn\"\n          },\n          \"cn-north-1\" : { },\n          \"data-cn-north-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"cn-north-1\"\n            },\n            \"hostname\" : \"data.iottwinmaker.cn-north-1.amazonaws.com.cn\"\n          }\n        }\n      },\n      \"kafka\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : { },\n          \"cn-northwest-1\" : { }\n        }\n      },\n      \"kafkaconnect\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : { },\n          \"cn-northwest-1\" : { }\n        }\n      },\n      \"kendra-ranking\" : {\n        \"defaults\" : {\n          \"dnsSuffix\" : \"api.amazonwebservices.com.cn\",\n          \"variants\" : [ {\n            \"dnsSuffix\" : \"api.amazonwebservices.com.cn\",\n            \"hostname\" : \"{service}-fips.{region}.{dnsSuffix}\",\n            \"tags\" : [ \"fips\" ]\n          } ]\n        },\n        \"endpoints\" : {\n          \"cn-north-1\" : {\n            \"hostname\" : \"kendra-ranking.cn-north-1.api.amazonwebservices.com.cn\"\n          },\n          \"cn-northwest-1\" : {\n            \"hostname\" : \"kendra-ranking.cn-northwest-1.api.amazonwebservices.com.cn\"\n          }\n        }\n      },\n      \"kinesis\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : { },\n          \"cn-northwest-1\" : { }\n        }\n      },\n      \"kinesisanalytics\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : { },\n          \"cn-northwest-1\" : { }\n        }\n      },\n      \"kinesisvideo\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : { }\n        }\n      },\n      \"kms\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : { },\n          \"cn-northwest-1\" : { }\n        }\n      },\n      \"lakeformation\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"lakeformation.cn-north-1.api.amazonwebservices.com.cn\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"cn-northwest-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"lakeformation.cn-northwest-1.api.amazonwebservices.com.cn\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"lambda\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"lambda.cn-north-1.api.amazonwebservices.com.cn\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"cn-northwest-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"lambda.cn-northwest-1.api.amazonwebservices.com.cn\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"license-manager\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : { },\n          \"cn-northwest-1\" : { }\n        }\n      },\n      \"license-manager-linux-subscriptions\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : { },\n          \"cn-northwest-1\" : { }\n        }\n      },\n      \"logs\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"logs.cn-north-1.api.amazonwebservices.com.cn\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"cn-northwest-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"logs.cn-northwest-1.api.amazonwebservices.com.cn\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"mediaconvert\" : {\n        \"endpoints\" : {\n          \"cn-northwest-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"mediaconvert.cn-northwest-1.api.amazonwebservices.com.cn\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"memory-db\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : { },\n          \"cn-northwest-1\" : { }\n        }\n      },\n      \"metering.marketplace\" : {\n        \"defaults\" : {\n          \"credentialScope\" : {\n            \"service\" : \"aws-marketplace\"\n          }\n        },\n        \"endpoints\" : {\n          \"cn-northwest-1\" : { }\n        }\n      },\n      \"metrics.sagemaker\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : { },\n          \"cn-northwest-1\" : { }\n        }\n      },\n      \"monitoring\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"http\", \"https\" ]\n        },\n        \"endpoints\" : {\n          \"cn-north-1\" : { },\n          \"cn-northwest-1\" : { }\n        }\n      },\n      \"mq\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : { },\n          \"cn-northwest-1\" : { }\n        }\n      },\n      \"neptune\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"cn-north-1\"\n            },\n            \"hostname\" : \"rds.cn-north-1.amazonaws.com.cn\"\n          },\n          \"cn-northwest-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"cn-northwest-1\"\n            },\n            \"hostname\" : \"rds.cn-northwest-1.amazonaws.com.cn\"\n          }\n        }\n      },\n      \"network-firewall\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : { },\n          \"cn-northwest-1\" : { }\n        }\n      },\n      \"notifications\" : {\n        \"defaults\" : {\n          \"dnsSuffix\" : \"api.amazonwebservices.com.cn\",\n          \"variants\" : [ {\n            \"dnsSuffix\" : \"api.amazonwebservices.com.cn\",\n            \"hostname\" : \"{service}-fips.{region}.{dnsSuffix}\",\n            \"tags\" : [ \"fips\" ]\n          } ]\n        },\n        \"endpoints\" : {\n          \"cn-north-1\" : {\n            \"hostname\" : \"notifications.cn-north-1.api.amazonwebservices.com.cn\"\n          },\n          \"cn-northwest-1\" : {\n            \"hostname\" : \"notifications.cn-northwest-1.api.amazonwebservices.com.cn\"\n          }\n        }\n      },\n      \"oam\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : { },\n          \"cn-northwest-1\" : { }\n        }\n      },\n      \"oidc\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"cn-north-1\"\n            },\n            \"hostname\" : \"oidc.cn-north-1.amazonaws.com.cn\"\n          },\n          \"cn-northwest-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"cn-northwest-1\"\n            },\n            \"hostname\" : \"oidc.cn-northwest-1.amazonaws.com.cn\"\n          }\n        }\n      },\n      \"organizations\" : {\n        \"endpoints\" : {\n          \"aws-cn-global\" : {\n            \"credentialScope\" : {\n              \"region\" : \"cn-northwest-1\"\n            },\n            \"hostname\" : \"organizations.cn-northwest-1.amazonaws.com.cn\"\n          }\n        },\n        \"isRegionalized\" : false,\n        \"partitionEndpoint\" : \"aws-cn-global\"\n      },\n      \"personalize\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : { }\n        }\n      },\n      \"pi\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : {\n            \"protocols\" : [ \"https\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"pi.cn-north-1.api.amazonwebservices.com.cn\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"cn-northwest-1\" : {\n            \"protocols\" : [ \"https\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"pi.cn-northwest-1.api.amazonwebservices.com.cn\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"pipes\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : { },\n          \"cn-northwest-1\" : { }\n        }\n      },\n      \"polly\" : {\n        \"endpoints\" : {\n          \"cn-northwest-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"polly.cn-northwest-1.api.amazonwebservices.com.cn\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"portal.sso\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"cn-north-1\"\n            },\n            \"hostname\" : \"portal.sso.cn-north-1.amazonaws.com.cn\"\n          },\n          \"cn-northwest-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"cn-northwest-1\"\n            },\n            \"hostname\" : \"portal.sso.cn-northwest-1.amazonaws.com.cn\"\n          }\n        }\n      },\n      \"qbusiness\" : {\n        \"defaults\" : {\n          \"dnsSuffix\" : \"api.amazonwebservices.com.cn\",\n          \"variants\" : [ {\n            \"dnsSuffix\" : \"api.amazonwebservices.com.cn\",\n            \"hostname\" : \"{service}-fips.{region}.{dnsSuffix}\",\n            \"tags\" : [ \"fips\" ]\n          } ]\n        },\n        \"endpoints\" : {\n          \"cn-north-1\" : {\n            \"hostname\" : \"qbusiness.cn-north-1.api.amazonwebservices.com.cn\"\n          },\n          \"cn-northwest-1\" : {\n            \"hostname\" : \"qbusiness.cn-northwest-1.api.amazonwebservices.com.cn\"\n          }\n        }\n      },\n      \"quicksight\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : { }\n        }\n      },\n      \"ram\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"cn-northwest-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"rbin\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"rbin.cn-north-1.api.amazonwebservices.com.cn\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"cn-northwest-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"rbin.cn-northwest-1.api.amazonwebservices.com.cn\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"rds\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : { },\n          \"cn-northwest-1\" : { }\n        }\n      },\n      \"redshift\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : { },\n          \"cn-northwest-1\" : { }\n        }\n      },\n      \"redshift-serverless\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : { },\n          \"cn-northwest-1\" : { }\n        }\n      },\n      \"resource-groups\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : { },\n          \"cn-northwest-1\" : { }\n        }\n      },\n      \"rolesanywhere\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : { },\n          \"cn-northwest-1\" : { }\n        }\n      },\n      \"route53\" : {\n        \"endpoints\" : {\n          \"aws-cn-global\" : {\n            \"credentialScope\" : {\n              \"region\" : \"cn-northwest-1\"\n            },\n            \"hostname\" : \"route53.amazonaws.com.cn\"\n          }\n        },\n        \"isRegionalized\" : false,\n        \"partitionEndpoint\" : \"aws-cn-global\"\n      },\n      \"route53profiles\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : { },\n          \"cn-northwest-1\" : { }\n        }\n      },\n      \"route53resolver\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"https\" ]\n        },\n        \"endpoints\" : {\n          \"cn-north-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"route53resolver.cn-north-1.api.amazonwebservices.com.cn\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"cn-northwest-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"route53resolver.cn-northwest-1.api.amazonwebservices.com.cn\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"runtime.sagemaker\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : { },\n          \"cn-northwest-1\" : { }\n        }\n      },\n      \"s3\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"http\", \"https\" ],\n          \"signatureVersions\" : [ \"s3v4\" ],\n          \"variants\" : [ {\n            \"dnsSuffix\" : \"amazonaws.com.cn\",\n            \"hostname\" : \"{service}.dualstack.{region}.{dnsSuffix}\",\n            \"tags\" : [ \"dualstack\" ]\n          } ]\n        },\n        \"endpoints\" : {\n          \"cn-north-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"s3.dualstack.cn-north-1.amazonaws.com.cn\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"cn-northwest-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"s3.dualstack.cn-northwest-1.amazonaws.com.cn\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"s3-control\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"https\" ],\n          \"signatureVersions\" : [ \"s3v4\" ],\n          \"variants\" : [ {\n            \"dnsSuffix\" : \"amazonaws.com.cn\",\n            \"hostname\" : \"{service}.dualstack.{region}.{dnsSuffix}\",\n            \"tags\" : [ \"dualstack\" ]\n          } ]\n        },\n        \"endpoints\" : {\n          \"cn-north-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"cn-north-1\"\n            },\n            \"hostname\" : \"s3-control.cn-north-1.amazonaws.com.cn\",\n            \"signatureVersions\" : [ \"s3v4\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"s3-control.dualstack.cn-north-1.amazonaws.com.cn\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"cn-northwest-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"cn-northwest-1\"\n            },\n            \"hostname\" : \"s3-control.cn-northwest-1.amazonaws.com.cn\",\n            \"signatureVersions\" : [ \"s3v4\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"s3-control.dualstack.cn-northwest-1.amazonaws.com.cn\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"savingsplans\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"cn-north-1\"\n            },\n            \"hostname\" : \"savingsplans.cn-north-1.amazonaws.com.cn\"\n          },\n          \"cn-northwest-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"cn-northwest-1\"\n            },\n            \"hostname\" : \"savingsplans.cn-northwest-1.amazonaws.com.cn\"\n          }\n        },\n        \"isRegionalized\" : true\n      },\n      \"scheduler\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : { },\n          \"cn-northwest-1\" : { }\n        }\n      },\n      \"schemas\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : { },\n          \"cn-northwest-1\" : { }\n        }\n      },\n      \"secretsmanager\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"cn-northwest-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"securityhub\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : { },\n          \"cn-northwest-1\" : { }\n        }\n      },\n      \"serverlessrepo\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"https\" ]\n        },\n        \"endpoints\" : {\n          \"cn-north-1\" : {\n            \"protocols\" : [ \"https\" ]\n          },\n          \"cn-northwest-1\" : {\n            \"protocols\" : [ \"https\" ]\n          }\n        }\n      },\n      \"servicecatalog\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : { },\n          \"cn-northwest-1\" : { }\n        }\n      },\n      \"servicediscovery\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"servicediscovery.cn-north-1.api.amazonwebservices.com.cn\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"cn-northwest-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"servicediscovery.cn-northwest-1.api.amazonwebservices.com.cn\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"servicequotas\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"https\" ]\n        },\n        \"endpoints\" : {\n          \"cn-north-1\" : { },\n          \"cn-northwest-1\" : { }\n        }\n      },\n      \"signer\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : { },\n          \"cn-northwest-1\" : { },\n          \"verification-cn-north-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"cn-north-1\"\n            },\n            \"hostname\" : \"verification.signer.cn-north-1.amazonaws.com.cn\"\n          },\n          \"verification-cn-northwest-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"cn-northwest-1\"\n            },\n            \"hostname\" : \"verification.signer.cn-northwest-1.amazonaws.com.cn\"\n          }\n        }\n      },\n      \"snowball\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"snowball-fips.cn-north-1.amazonaws.com.cn\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"cn-northwest-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"snowball-fips.cn-northwest-1.amazonaws.com.cn\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"fips-cn-north-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"cn-north-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"snowball-fips.cn-north-1.amazonaws.com.cn\"\n          },\n          \"fips-cn-northwest-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"cn-northwest-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"snowball-fips.cn-northwest-1.amazonaws.com.cn\"\n          }\n        }\n      },\n      \"sns\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"http\", \"https\" ]\n        },\n        \"endpoints\" : {\n          \"cn-north-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sns.cn-north-1.api.amazonwebservices.com.cn\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"cn-northwest-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sns.cn-northwest-1.api.amazonwebservices.com.cn\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"sqs\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"http\", \"https\" ],\n          \"sslCommonName\" : \"{region}.queue.{dnsSuffix}\"\n        },\n        \"endpoints\" : {\n          \"cn-north-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sqs.cn-north-1.api.amazonwebservices.com.cn\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"cn-northwest-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sqs.cn-northwest-1.api.amazonwebservices.com.cn\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"ssm\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : { },\n          \"cn-northwest-1\" : { }\n        }\n      },\n      \"sso\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : { },\n          \"cn-northwest-1\" : { }\n        }\n      },\n      \"states\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"states.cn-north-1.api.amazonwebservices.com.cn\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"cn-northwest-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"states.cn-northwest-1.api.amazonwebservices.com.cn\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"storagegateway\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : { },\n          \"cn-northwest-1\" : { }\n        }\n      },\n      \"streams.dynamodb\" : {\n        \"defaults\" : {\n          \"credentialScope\" : {\n            \"service\" : \"dynamodb\"\n          },\n          \"protocols\" : [ \"http\", \"https\" ]\n        },\n        \"endpoints\" : {\n          \"cn-north-1\" : { },\n          \"cn-northwest-1\" : { }\n        }\n      },\n      \"sts\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : { },\n          \"cn-northwest-1\" : { }\n        }\n      },\n      \"support\" : {\n        \"endpoints\" : {\n          \"aws-cn-global\" : {\n            \"credentialScope\" : {\n              \"region\" : \"cn-north-1\"\n            },\n            \"hostname\" : \"support.cn-north-1.amazonaws.com.cn\"\n          }\n        },\n        \"partitionEndpoint\" : \"aws-cn-global\"\n      },\n      \"swf\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : { },\n          \"cn-northwest-1\" : { }\n        }\n      },\n      \"synthetics\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"synthetics.cn-north-1.api.amazonwebservices.com.cn\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"cn-northwest-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"synthetics.cn-northwest-1.api.amazonwebservices.com.cn\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"tagging\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : { },\n          \"cn-northwest-1\" : { }\n        }\n      },\n      \"transcribe\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"https\" ]\n        },\n        \"endpoints\" : {\n          \"cn-north-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"cn-north-1\"\n            },\n            \"hostname\" : \"cn.transcribe.cn-north-1.amazonaws.com.cn\",\n            \"variants\" : [ {\n              \"hostname\" : \"transcribe.cn-north-1.api.amazonwebservices.com.cn\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"cn-northwest-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"cn-northwest-1\"\n            },\n            \"hostname\" : \"cn.transcribe.cn-northwest-1.amazonaws.com.cn\",\n            \"variants\" : [ {\n              \"hostname\" : \"transcribe.cn-northwest-1.api.amazonwebservices.com.cn\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"transcribestreaming\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"transcribestreaming.cn-north-1.api.amazonwebservices.com.cn\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"cn-northwest-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"transcribestreaming.cn-northwest-1.api.amazonwebservices.com.cn\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"transfer\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : { },\n          \"cn-northwest-1\" : { }\n        }\n      },\n      \"verifiedpermissions\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : { },\n          \"cn-northwest-1\" : { }\n        }\n      },\n      \"waf-regional\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"cn-north-1\"\n            },\n            \"hostname\" : \"waf-regional.cn-north-1.amazonaws.com.cn\",\n            \"variants\" : [ {\n              \"hostname\" : \"waf-regional-fips.cn-north-1.amazonaws.com.cn\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"cn-northwest-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"cn-northwest-1\"\n            },\n            \"hostname\" : \"waf-regional.cn-northwest-1.amazonaws.com.cn\",\n            \"variants\" : [ {\n              \"hostname\" : \"waf-regional-fips.cn-northwest-1.amazonaws.com.cn\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"fips-cn-north-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"cn-north-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"waf-regional-fips.cn-north-1.amazonaws.com.cn\"\n          },\n          \"fips-cn-northwest-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"cn-northwest-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"waf-regional-fips.cn-northwest-1.amazonaws.com.cn\"\n          }\n        }\n      },\n      \"wafv2\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"cn-north-1\"\n            },\n            \"hostname\" : \"wafv2.cn-north-1.amazonaws.com.cn\",\n            \"variants\" : [ {\n              \"hostname\" : \"wafv2-fips.cn-north-1.amazonaws.com.cn\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"cn-northwest-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"cn-northwest-1\"\n            },\n            \"hostname\" : \"wafv2.cn-northwest-1.amazonaws.com.cn\",\n            \"variants\" : [ {\n              \"hostname\" : \"wafv2-fips.cn-northwest-1.amazonaws.com.cn\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"fips-cn-north-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"cn-north-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"wafv2-fips.cn-north-1.amazonaws.com.cn\"\n          },\n          \"fips-cn-northwest-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"cn-northwest-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"wafv2-fips.cn-northwest-1.amazonaws.com.cn\"\n          }\n        }\n      },\n      \"workspaces\" : {\n        \"endpoints\" : {\n          \"cn-northwest-1\" : { }\n        }\n      },\n      \"xray\" : {\n        \"endpoints\" : {\n          \"cn-north-1\" : { },\n          \"cn-northwest-1\" : { }\n        }\n      }\n    }\n  }, {\n    \"defaults\" : {\n      \"hostname\" : \"{service}.{region}.{dnsSuffix}\",\n      \"protocols\" : [ \"https\" ],\n      \"signatureVersions\" : [ \"v4\" ],\n      \"variants\" : [ {\n        \"dnsSuffix\" : \"amazonaws.com\",\n        \"hostname\" : \"{service}-fips.{region}.{dnsSuffix}\",\n        \"tags\" : [ \"fips\" ]\n      }, {\n        \"dnsSuffix\" : \"api.aws\",\n        \"hostname\" : \"{service}-fips.{region}.{dnsSuffix}\",\n        \"tags\" : [ \"dualstack\", \"fips\" ]\n      }, {\n        \"dnsSuffix\" : \"api.aws\",\n        \"hostname\" : \"{service}.{region}.{dnsSuffix}\",\n        \"tags\" : [ \"dualstack\" ]\n      } ]\n    },\n    \"dnsSuffix\" : \"amazonaws.com\",\n    \"partition\" : \"aws-us-gov\",\n    \"partitionName\" : \"AWS GovCloud (US)\",\n    \"regionRegex\" : \"^us\\\\-gov\\\\-\\\\w+\\\\-\\\\d+$\",\n    \"regions\" : {\n      \"us-gov-east-1\" : {\n        \"description\" : \"AWS GovCloud (US-East)\"\n      },\n      \"us-gov-west-1\" : {\n        \"description\" : \"AWS GovCloud (US-West)\"\n      }\n    },\n    \"services\" : {\n      \"access-analyzer\" : {\n        \"endpoints\" : {\n          \"us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"hostname\" : \"access-analyzer.us-gov-east-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"access-analyzer.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"access-analyzer.us-gov-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            }, {\n              \"hostname\" : \"access-analyzer.us-gov-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            } ]\n          },\n          \"us-gov-east-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"access-analyzer.us-gov-east-1.amazonaws.com\"\n          },\n          \"us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"hostname\" : \"access-analyzer.us-gov-west-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"access-analyzer.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"access-analyzer.us-gov-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            }, {\n              \"hostname\" : \"access-analyzer.us-gov-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"access-analyzer.us-gov-west-1.amazonaws.com\"\n          }\n        }\n      },\n      \"acm\" : {\n        \"defaults\" : {\n          \"variants\" : [ {\n            \"hostname\" : \"acm.{region}.{dnsSuffix}\",\n            \"tags\" : [ \"fips\" ]\n          } ]\n        },\n        \"endpoints\" : {\n          \"us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"hostname\" : \"acm.us-gov-east-1.amazonaws.com\"\n          },\n          \"us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"hostname\" : \"acm.us-gov-west-1.amazonaws.com\"\n          }\n        }\n      },\n      \"acm-pca\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"https\" ],\n          \"variants\" : [ {\n            \"hostname\" : \"acm-pca.{region}.{dnsSuffix}\",\n            \"tags\" : [ \"fips\" ]\n          } ]\n        },\n        \"endpoints\" : {\n          \"fips-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"acm-pca.us-gov-east-1.amazonaws.com\"\n          },\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"acm-pca.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"acm-pca.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"acm-pca.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"aoss\" : {\n        \"endpoints\" : {\n          \"us-gov-east-1\" : { },\n          \"us-gov-west-1\" : { }\n        }\n      },\n      \"api.detective\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"https\" ]\n        },\n        \"endpoints\" : {\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"api.detective-fips.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"detective-fips.us-gov-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"detective.us-gov-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-gov-east-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"api.detective-fips.us-gov-east-1.amazonaws.com\"\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"api.detective-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"detective-fips.us-gov-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"detective.us-gov-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-gov-west-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"api.detective-fips.us-gov-west-1.amazonaws.com\"\n          }\n        }\n      },\n      \"api.ecr\" : {\n        \"defaults\" : {\n          \"variants\" : [ {\n            \"hostname\" : \"ecr-fips.{region}.{dnsSuffix}\",\n            \"tags\" : [ \"fips\" ]\n          } ]\n        },\n        \"endpoints\" : {\n          \"dkr-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"variants\" : [ {\n              \"hostname\" : \"ecr-fips.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"dkr-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"variants\" : [ {\n              \"hostname\" : \"ecr-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"fips-dkr-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"ecr-fips.us-gov-east-1.amazonaws.com\"\n          },\n          \"fips-dkr-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"ecr-fips.us-gov-west-1.amazonaws.com\"\n          },\n          \"fips-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"ecr-fips.us-gov-east-1.amazonaws.com\"\n          },\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"ecr-fips.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"hostname\" : \"api.ecr.us-gov-east-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"ecr-fips.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"ecr-fips.us-gov-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"ecr.us-gov-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"hostname\" : \"api.ecr.us-gov-west-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"ecr-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"ecr-fips.us-gov-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"ecr.us-gov-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"api.sagemaker\" : {\n        \"defaults\" : {\n          \"variants\" : [ {\n            \"hostname\" : \"api-fips.sagemaker.{region}.{dnsSuffix}\",\n            \"tags\" : [ \"fips\" ]\n          } ]\n        },\n        \"endpoints\" : {\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"api-fips.sagemaker.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-east-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"api-fips.sagemaker.us-gov-east-1.amazonaws.com\"\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"api-fips.sagemaker.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"api-fips.sagemaker.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-west-1-fips-secondary\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"api.sagemaker.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-west-1-secondary\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"variants\" : [ {\n              \"hostname\" : \"api.sagemaker.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"api.tunneling.iot\" : {\n        \"defaults\" : {\n          \"variants\" : [ {\n            \"dnsSuffix\" : \"amazonaws.com\",\n            \"hostname\" : \"api.tunneling.iot-fips.{region}.{dnsSuffix}\",\n            \"tags\" : [ \"fips\" ]\n          }, {\n            \"dnsSuffix\" : \"api.aws\",\n            \"hostname\" : \"api.iot-tunneling-fips.{region}.{dnsSuffix}\",\n            \"tags\" : [ \"dualstack\", \"fips\" ]\n          }, {\n            \"dnsSuffix\" : \"api.aws\",\n            \"hostname\" : \"api.iot-tunneling.{region}.{dnsSuffix}\",\n            \"tags\" : [ \"dualstack\" ]\n          } ]\n        },\n        \"endpoints\" : {\n          \"fips-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"api.tunneling.iot-fips.us-gov-east-1.amazonaws.com\"\n          },\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"api.tunneling.iot-fips.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"api.iot-tunneling-fips.us-gov-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"api.iot-tunneling.us-gov-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            }, {\n              \"hostname\" : \"api.tunneling.iot-fips.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"api.iot-tunneling-fips.us-gov-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"api.iot-tunneling.us-gov-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            }, {\n              \"hostname\" : \"api.tunneling.iot-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"apigateway\" : {\n        \"endpoints\" : {\n          \"us-gov-east-1\" : { },\n          \"us-gov-west-1\" : { }\n        }\n      },\n      \"appconfig\" : {\n        \"endpoints\" : {\n          \"fips-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"appconfig.us-gov-east-1.amazonaws.com\"\n          },\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"appconfig.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"appconfig.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"appconfig.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"appconfigdata\" : {\n        \"endpoints\" : {\n          \"fips-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"appconfigdata.us-gov-east-1.amazonaws.com\"\n          },\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"appconfigdata.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"appconfigdata.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"appconfigdata.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"application-autoscaling\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"http\", \"https\" ]\n        },\n        \"endpoints\" : {\n          \"us-gov-east-1\" : {\n            \"hostname\" : \"application-autoscaling.us-gov-east-1.amazonaws.com\",\n            \"protocols\" : [ \"http\", \"https\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"application-autoscaling.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-east-1-fips\" : {\n            \"deprecated\" : true,\n            \"hostname\" : \"application-autoscaling.us-gov-east-1.amazonaws.com\",\n            \"protocols\" : [ \"http\", \"https\" ]\n          },\n          \"us-gov-west-1\" : {\n            \"hostname\" : \"application-autoscaling.us-gov-west-1.amazonaws.com\",\n            \"protocols\" : [ \"http\", \"https\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"application-autoscaling.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1-fips\" : {\n            \"deprecated\" : true,\n            \"hostname\" : \"application-autoscaling.us-gov-west-1.amazonaws.com\",\n            \"protocols\" : [ \"http\", \"https\" ]\n          }\n        }\n      },\n      \"applicationinsights\" : {\n        \"endpoints\" : {\n          \"fips-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"applicationinsights-fips.us-gov-east-1.amazonaws.com\"\n          },\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"applicationinsights-fips.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"applicationinsights-fips.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"applicationinsights-fips.us-gov-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"applicationinsights.us-gov-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"applicationinsights-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"applicationinsights-fips.us-gov-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"applicationinsights.us-gov-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"appstream2\" : {\n        \"defaults\" : {\n          \"credentialScope\" : {\n            \"service\" : \"appstream\"\n          },\n          \"protocols\" : [ \"https\" ]\n        },\n        \"endpoints\" : {\n          \"fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"appstream2-fips.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"appstream2-fips.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-east-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"appstream2-fips.us-gov-east-1.amazonaws.com\"\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"appstream2-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"appstream2-fips.us-gov-west-1.amazonaws.com\"\n          }\n        }\n      },\n      \"aps\" : {\n        \"endpoints\" : {\n          \"us-gov-east-1\" : { },\n          \"us-gov-west-1\" : { }\n        }\n      },\n      \"arc-zonal-shift\" : {\n        \"endpoints\" : {\n          \"us-gov-east-1\" : { },\n          \"us-gov-west-1\" : { }\n        }\n      },\n      \"athena\" : {\n        \"endpoints\" : {\n          \"fips-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"athena-fips.us-gov-east-1.amazonaws.com\"\n          },\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"athena-fips.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"athena-fips.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"athena-fips.us-gov-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"athena.us-gov-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"athena-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"athena-fips.us-gov-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"athena.us-gov-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"autoscaling\" : {\n        \"defaults\" : {\n          \"variants\" : [ {\n            \"hostname\" : \"autoscaling.{region}.{dnsSuffix}\",\n            \"tags\" : [ \"fips\" ]\n          } ]\n        },\n        \"endpoints\" : {\n          \"us-gov-east-1\" : {\n            \"protocols\" : [ \"http\", \"https\" ]\n          },\n          \"us-gov-west-1\" : {\n            \"protocols\" : [ \"http\", \"https\" ]\n          }\n        }\n      },\n      \"autoscaling-plans\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"http\", \"https\" ]\n        },\n        \"endpoints\" : {\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"autoscaling-plans.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-east-1-fips\" : {\n            \"deprecated\" : true,\n            \"hostname\" : \"autoscaling-plans.us-gov-east-1.amazonaws.com\",\n            \"protocols\" : [ \"http\", \"https\" ]\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"autoscaling-plans.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1-fips\" : {\n            \"deprecated\" : true,\n            \"hostname\" : \"autoscaling-plans.us-gov-west-1.amazonaws.com\",\n            \"protocols\" : [ \"http\", \"https\" ]\n          }\n        }\n      },\n      \"backup\" : {\n        \"endpoints\" : {\n          \"us-gov-east-1\" : { },\n          \"us-gov-west-1\" : { }\n        }\n      },\n      \"backup-gateway\" : {\n        \"endpoints\" : {\n          \"us-gov-east-1\" : { },\n          \"us-gov-west-1\" : { }\n        }\n      },\n      \"batch\" : {\n        \"defaults\" : {\n          \"variants\" : [ {\n            \"hostname\" : \"batch.{region}.{dnsSuffix}\",\n            \"tags\" : [ \"fips\" ]\n          } ]\n        },\n        \"endpoints\" : {\n          \"fips-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"batch.us-gov-east-1.amazonaws.com\"\n          },\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"batch.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"batch.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"batch.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"bedrock\" : {\n        \"endpoints\" : {\n          \"bedrock-fips-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"hostname\" : \"bedrock-fips.us-gov-east-1.amazonaws.com\"\n          },\n          \"bedrock-fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"hostname\" : \"bedrock-fips.us-gov-west-1.amazonaws.com\"\n          },\n          \"bedrock-runtime-fips-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"hostname\" : \"bedrock-runtime-fips.us-gov-east-1.amazonaws.com\"\n          },\n          \"bedrock-runtime-fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"hostname\" : \"bedrock-runtime-fips.us-gov-west-1.amazonaws.com\"\n          },\n          \"bedrock-runtime-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"hostname\" : \"bedrock-runtime.us-gov-east-1.amazonaws.com\"\n          },\n          \"bedrock-runtime-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"hostname\" : \"bedrock-runtime.us-gov-west-1.amazonaws.com\"\n          },\n          \"bedrock-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"hostname\" : \"bedrock.us-gov-east-1.amazonaws.com\"\n          },\n          \"bedrock-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"hostname\" : \"bedrock.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : { },\n          \"us-gov-west-1\" : { }\n        }\n      },\n      \"cassandra\" : {\n        \"endpoints\" : {\n          \"us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"hostname\" : \"cassandra.us-gov-east-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"cassandra.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-east-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"cassandra.us-gov-east-1.amazonaws.com\"\n          },\n          \"us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"hostname\" : \"cassandra.us-gov-west-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"cassandra.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"cassandra.us-gov-west-1.amazonaws.com\"\n          }\n        }\n      },\n      \"cloudcontrolapi\" : {\n        \"endpoints\" : {\n          \"fips-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"cloudcontrolapi-fips.us-gov-east-1.amazonaws.com\"\n          },\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"cloudcontrolapi-fips.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cloudcontrolapi-fips.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"cloudcontrolapi-fips.us-gov-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"cloudcontrolapi.us-gov-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cloudcontrolapi-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"cloudcontrolapi-fips.us-gov-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"cloudcontrolapi.us-gov-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"clouddirectory\" : {\n        \"endpoints\" : {\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"clouddirectory.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"clouddirectory.us-gov-west-1.amazonaws.com\"\n          }\n        }\n      },\n      \"cloudformation\" : {\n        \"endpoints\" : {\n          \"us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"hostname\" : \"cloudformation.us-gov-east-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"cloudformation.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-east-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"cloudformation.us-gov-east-1.amazonaws.com\"\n          },\n          \"us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"hostname\" : \"cloudformation.us-gov-west-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"cloudformation.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"cloudformation.us-gov-west-1.amazonaws.com\"\n          }\n        }\n      },\n      \"cloudhsm\" : {\n        \"endpoints\" : {\n          \"us-gov-west-1\" : { }\n        }\n      },\n      \"cloudhsmv2\" : {\n        \"defaults\" : {\n          \"credentialScope\" : {\n            \"service\" : \"cloudhsm\"\n          }\n        },\n        \"endpoints\" : {\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cloudhsmv2.us-gov-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cloudhsmv2.us-gov-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"cloudtrail\" : {\n        \"defaults\" : {\n          \"variants\" : [ {\n            \"hostname\" : \"cloudtrail.us-gov-west-1.amazonaws.com\",\n            \"tags\" : [ \"fips\" ]\n          } ]\n        },\n        \"endpoints\" : {\n          \"fips-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"cloudtrail.us-gov-east-1.amazonaws.com\"\n          },\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"cloudtrail.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cloudtrail.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cloudtrail.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"codebuild\" : {\n        \"endpoints\" : {\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"codebuild-fips.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-east-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"codebuild-fips.us-gov-east-1.amazonaws.com\"\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"codebuild-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"codebuild-fips.us-gov-west-1.amazonaws.com\"\n          }\n        }\n      },\n      \"codecommit\" : {\n        \"endpoints\" : {\n          \"fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"codecommit-fips.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"codecommit-fips.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-east-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"codecommit-fips.us-gov-east-1.amazonaws.com\"\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"codecommit-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"codecommit-fips.us-gov-west-1.amazonaws.com\"\n          }\n        }\n      },\n      \"codedeploy\" : {\n        \"endpoints\" : {\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"codedeploy-fips.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-east-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"codedeploy-fips.us-gov-east-1.amazonaws.com\"\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"codedeploy-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"codedeploy-fips.us-gov-west-1.amazonaws.com\"\n          }\n        }\n      },\n      \"codepipeline\" : {\n        \"endpoints\" : {\n          \"fips-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"codepipeline-fips.us-gov-east-1.amazonaws.com\"\n          },\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"codepipeline-fips.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"codepipeline-fips.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"codepipeline-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"codestar-connections\" : {\n        \"endpoints\" : {\n          \"us-gov-east-1\" : { }\n        }\n      },\n      \"cognito-identity\" : {\n        \"endpoints\" : {\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"cognito-identity-fips.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cognito-identity.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cognito-identity-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"cognito-identity-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"cognito-identity.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"cognito-idp\" : {\n        \"endpoints\" : {\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"cognito-idp-fips.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cognito-idp.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cognito-idp-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"cognito-idp-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"cognito-idp.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"comprehend\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"https\" ]\n        },\n        \"endpoints\" : {\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"comprehend-fips.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"comprehend-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"comprehend-fips.us-gov-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"comprehend.us-gov-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"comprehendmedical\" : {\n        \"endpoints\" : {\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"comprehendmedical-fips.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"comprehendmedical-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"compute-optimizer\" : {\n        \"endpoints\" : {\n          \"us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"hostname\" : \"compute-optimizer-fips.us-gov-east-1.amazonaws.com\"\n          },\n          \"us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"hostname\" : \"compute-optimizer-fips.us-gov-west-1.amazonaws.com\"\n          }\n        }\n      },\n      \"config\" : {\n        \"defaults\" : {\n          \"variants\" : [ {\n            \"hostname\" : \"config.{region}.{dnsSuffix}\",\n            \"tags\" : [ \"fips\" ]\n          } ]\n        },\n        \"endpoints\" : {\n          \"fips-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"config.us-gov-east-1.amazonaws.com\"\n          },\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"config.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"config.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"config.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"connect\" : {\n        \"endpoints\" : {\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"connect.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"connect.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"controltower\" : {\n        \"endpoints\" : {\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"controltower-fips.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-east-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"controltower-fips.us-gov-east-1.amazonaws.com\"\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"controltower-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"controltower-fips.us-gov-west-1.amazonaws.com\"\n          }\n        }\n      },\n      \"data-ats.iot\" : {\n        \"defaults\" : {\n          \"credentialScope\" : {\n            \"service\" : \"iotdata\"\n          },\n          \"protocols\" : [ \"https\" ]\n        },\n        \"endpoints\" : {\n          \"fips-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"service\" : \"iotdata\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"data.iot-fips.us-gov-east-1.amazonaws.com\"\n          },\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"service\" : \"iotdata\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"data.iot-fips.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"data.iot-fips.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"data.iot-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"data.iot\" : {\n        \"defaults\" : {\n          \"credentialScope\" : {\n            \"service\" : \"iotdata\"\n          },\n          \"protocols\" : [ \"https\" ]\n        },\n        \"endpoints\" : {\n          \"fips-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"service\" : \"iotdata\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"data.iot-fips.us-gov-east-1.amazonaws.com\"\n          },\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"service\" : \"iotdata\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"data.iot-fips.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"data.iot-fips.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"data.iot-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"data.jobs.iot\" : {\n        \"endpoints\" : {\n          \"fips-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"data.jobs.iot-fips.us-gov-east-1.amazonaws.com\"\n          },\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"data.jobs.iot-fips.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"data.jobs.iot-fips.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"data.jobs.iot-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"databrew\" : {\n        \"endpoints\" : {\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"databrew.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"databrew.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"datasync\" : {\n        \"endpoints\" : {\n          \"fips-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"datasync-fips.us-gov-east-1.amazonaws.com\"\n          },\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"datasync-fips.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"datasync-fips.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"datasync-fips.us-gov-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"datasync.us-gov-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"datasync-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"datasync-fips.us-gov-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"datasync.us-gov-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"datazone\" : {\n        \"defaults\" : {\n          \"dnsSuffix\" : \"api.aws\",\n          \"variants\" : [ {\n            \"dnsSuffix\" : \"api.aws\",\n            \"hostname\" : \"{service}-fips.{region}.{dnsSuffix}\",\n            \"tags\" : [ \"fips\" ]\n          } ]\n        },\n        \"endpoints\" : {\n          \"us-gov-east-1\" : {\n            \"hostname\" : \"datazone.us-gov-east-1.api.aws\"\n          },\n          \"us-gov-west-1\" : {\n            \"hostname\" : \"datazone.us-gov-west-1.api.aws\"\n          }\n        }\n      },\n      \"directconnect\" : {\n        \"endpoints\" : {\n          \"fips-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"directconnect-fips.us-gov-east-1.amazonaws.com\"\n          },\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"directconnect-fips.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"directconnect-fips.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"directconnect-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"dlm\" : {\n        \"endpoints\" : {\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"dlm-fips.us-gov-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"dlm.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"dlm.us-gov-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-gov-east-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"dlm.us-gov-east-1.amazonaws.com\"\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"dlm-fips.us-gov-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"dlm.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"dlm.us-gov-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-gov-west-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"dlm.us-gov-west-1.amazonaws.com\"\n          }\n        }\n      },\n      \"dms\" : {\n        \"defaults\" : {\n          \"variants\" : [ {\n            \"hostname\" : \"dms.{region}.{dnsSuffix}\",\n            \"tags\" : [ \"fips\" ]\n          } ]\n        },\n        \"endpoints\" : {\n          \"dms\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"variants\" : [ {\n              \"hostname\" : \"dms.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"dms-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"dms.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"dms.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-east-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"dms.us-gov-east-1.amazonaws.com\"\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"dms.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"dms.us-gov-west-1.amazonaws.com\"\n          }\n        }\n      },\n      \"docdb\" : {\n        \"endpoints\" : {\n          \"us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"hostname\" : \"rds.us-gov-west-1.amazonaws.com\"\n          }\n        }\n      },\n      \"drs\" : {\n        \"endpoints\" : {\n          \"fips-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"drs-fips.us-gov-east-1.amazonaws.com\"\n          },\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"drs-fips.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"drs-fips.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"drs-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"ds\" : {\n        \"endpoints\" : {\n          \"fips-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"ds-fips.us-gov-east-1.amazonaws.com\"\n          },\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"ds-fips.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ds-fips.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ds-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"dynamodb\" : {\n        \"defaults\" : {\n          \"variants\" : [ {\n            \"hostname\" : \"dynamodb.{region}.{dnsSuffix}\",\n            \"tags\" : [ \"fips\" ]\n          } ]\n        },\n        \"endpoints\" : {\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"dynamodb-fips.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-east-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"dynamodb-fips.us-gov-east-1.amazonaws.com\"\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"dynamodb-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"dynamodb-fips.us-gov-west-1.amazonaws.com\"\n          }\n        }\n      },\n      \"ebs\" : {\n        \"endpoints\" : {\n          \"us-gov-east-1\" : { },\n          \"us-gov-west-1\" : { }\n        }\n      },\n      \"ec2\" : {\n        \"defaults\" : {\n          \"variants\" : [ {\n            \"hostname\" : \"ec2.{region}.{dnsSuffix}\",\n            \"tags\" : [ \"fips\" ]\n          } ]\n        },\n        \"endpoints\" : {\n          \"us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"hostname\" : \"ec2.us-gov-east-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"ec2.us-gov-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"hostname\" : \"ec2.us-gov-west-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"ec2.us-gov-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"ecs\" : {\n        \"endpoints\" : {\n          \"fips-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"ecs-fips.us-gov-east-1.amazonaws.com\"\n          },\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"ecs-fips.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ecs-fips.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ecs-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"eks\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"http\", \"https\" ],\n          \"variants\" : [ {\n            \"hostname\" : \"eks.{region}.{dnsSuffix}\",\n            \"tags\" : [ \"fips\" ]\n          } ]\n        },\n        \"endpoints\" : {\n          \"fips-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"eks.us-gov-east-1.amazonaws.com\"\n          },\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"eks.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"eks.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"eks.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"eks-auth\" : {\n        \"defaults\" : {\n          \"dnsSuffix\" : \"api.aws\",\n          \"variants\" : [ {\n            \"dnsSuffix\" : \"api.aws\",\n            \"hostname\" : \"{service}-fips.{region}.{dnsSuffix}\",\n            \"tags\" : [ \"fips\" ]\n          } ]\n        },\n        \"endpoints\" : {\n          \"us-gov-east-1\" : {\n            \"hostname\" : \"eks-auth.us-gov-east-1.api.aws\"\n          },\n          \"us-gov-west-1\" : {\n            \"hostname\" : \"eks-auth.us-gov-west-1.api.aws\"\n          }\n        }\n      },\n      \"elasticache\" : {\n        \"defaults\" : {\n          \"variants\" : [ {\n            \"hostname\" : \"elasticache.{region}.{dnsSuffix}\",\n            \"tags\" : [ \"fips\" ]\n          } ]\n        },\n        \"endpoints\" : {\n          \"fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"elasticache.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : { },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticache.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"elasticache.us-gov-west-1.amazonaws.com\"\n          }\n        }\n      },\n      \"elasticbeanstalk\" : {\n        \"endpoints\" : {\n          \"us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"hostname\" : \"elasticbeanstalk.us-gov-east-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"elasticbeanstalk.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"elasticbeanstalk.us-gov-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-gov-east-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"elasticbeanstalk.us-gov-east-1.amazonaws.com\"\n          },\n          \"us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"hostname\" : \"elasticbeanstalk.us-gov-west-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"elasticbeanstalk.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"elasticbeanstalk.us-gov-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-gov-west-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"elasticbeanstalk.us-gov-west-1.amazonaws.com\"\n          }\n        }\n      },\n      \"elasticfilesystem\" : {\n        \"endpoints\" : {\n          \"fips-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"elasticfilesystem-fips.us-gov-east-1.amazonaws.com\"\n          },\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"elasticfilesystem-fips.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticfilesystem-fips.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticfilesystem-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"elasticloadbalancing\" : {\n        \"defaults\" : {\n          \"variants\" : [ {\n            \"hostname\" : \"elasticloadbalancing.{region}.{dnsSuffix}\",\n            \"tags\" : [ \"fips\" ]\n          } ]\n        },\n        \"endpoints\" : {\n          \"fips-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"elasticloadbalancing.us-gov-east-1.amazonaws.com\"\n          },\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"elasticloadbalancing.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticloadbalancing.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"protocols\" : [ \"http\", \"https\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"elasticloadbalancing.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"elasticmapreduce\" : {\n        \"defaults\" : {\n          \"variants\" : [ {\n            \"hostname\" : \"elasticmapreduce.{region}.{dnsSuffix}\",\n            \"tags\" : [ \"fips\" ]\n          } ]\n        },\n        \"endpoints\" : {\n          \"fips-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"elasticmapreduce.us-gov-east-1.amazonaws.com\"\n          },\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"elasticmapreduce.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticmapreduce.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"elasticmapreduce.us-gov-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"protocols\" : [ \"https\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"elasticmapreduce.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"elasticmapreduce.us-gov-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"email\" : {\n        \"endpoints\" : {\n          \"fips-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"email-fips.us-gov-east-1.amazonaws.com\"\n          },\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"email-fips.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"email-fips.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"email-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"emr-containers\" : {\n        \"endpoints\" : {\n          \"fips-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"emr-containers.us-gov-east-1.amazonaws.com\"\n          },\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"emr-containers.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"emr-containers.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"emr-containers.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"emr-serverless\" : {\n        \"endpoints\" : {\n          \"fips-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"emr-serverless.us-gov-east-1.amazonaws.com\"\n          },\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"emr-serverless.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"emr-serverless.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"emr-serverless.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"es\" : {\n        \"endpoints\" : {\n          \"fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"es-fips.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"aos.us-gov-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            }, {\n              \"hostname\" : \"es-fips.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-east-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"es-fips.us-gov-east-1.amazonaws.com\"\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"aos.us-gov-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            }, {\n              \"hostname\" : \"es-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"es-fips.us-gov-west-1.amazonaws.com\"\n          }\n        }\n      },\n      \"events\" : {\n        \"endpoints\" : {\n          \"fips-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"events.us-gov-east-1.amazonaws.com\"\n          },\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"events.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"events.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"events.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"firehose\" : {\n        \"endpoints\" : {\n          \"fips-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"firehose-fips.us-gov-east-1.amazonaws.com\"\n          },\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"firehose-fips.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"firehose-fips.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"firehose-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"fms\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"https\" ]\n        },\n        \"endpoints\" : {\n          \"fips-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"fms-fips.us-gov-east-1.amazonaws.com\"\n          },\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"fms-fips.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"fms-fips.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"fms-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"fsx\" : {\n        \"endpoints\" : {\n          \"fips-prod-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"fsx-fips.us-gov-east-1.amazonaws.com\"\n          },\n          \"fips-prod-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"fsx-fips.us-gov-west-1.amazonaws.com\"\n          },\n          \"fips-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"fsx-fips.us-gov-east-1.amazonaws.com\"\n          },\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"fsx-fips.us-gov-west-1.amazonaws.com\"\n          },\n          \"prod-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"variants\" : [ {\n              \"hostname\" : \"fsx-fips.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"prod-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"variants\" : [ {\n              \"hostname\" : \"fsx-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"fsx-fips.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"fsx-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"gameliftstreams\" : {\n        \"defaults\" : {\n          \"dnsSuffix\" : \"api.aws\",\n          \"variants\" : [ {\n            \"dnsSuffix\" : \"api.aws\",\n            \"hostname\" : \"{service}-fips.{region}.{dnsSuffix}\",\n            \"tags\" : [ \"fips\" ]\n          } ]\n        },\n        \"endpoints\" : {\n          \"us-gov-east-1\" : {\n            \"hostname\" : \"gameliftstreams.us-gov-east-1.api.aws\"\n          },\n          \"us-gov-west-1\" : {\n            \"hostname\" : \"gameliftstreams.us-gov-west-1.api.aws\"\n          }\n        }\n      },\n      \"geo\" : {\n        \"endpoints\" : {\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"geo-fips.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"geo-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"glacier\" : {\n        \"endpoints\" : {\n          \"fips-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"glacier.us-gov-east-1.amazonaws.com\"\n          },\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"glacier.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"glacier.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"protocols\" : [ \"http\", \"https\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"glacier.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"glue\" : {\n        \"endpoints\" : {\n          \"fips-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"glue-fips.us-gov-east-1.amazonaws.com\"\n          },\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"glue-fips.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"glue-fips.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"glue-fips.us-gov-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"glue.us-gov-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"glue-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"glue-fips.us-gov-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"glue.us-gov-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"greengrass\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"https\" ]\n        },\n        \"endpoints\" : {\n          \"dataplane-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"hostname\" : \"greengrass-ats.iot.us-gov-east-1.amazonaws.com\"\n          },\n          \"dataplane-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"hostname\" : \"greengrass-ats.iot.us-gov-west-1.amazonaws.com\"\n          },\n          \"fips-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"greengrass.us-gov-east-1.amazonaws.com\"\n          },\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"greengrass.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"greengrass.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"greengrass.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        },\n        \"isRegionalized\" : true\n      },\n      \"guardduty\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"https\" ],\n          \"variants\" : [ {\n            \"hostname\" : \"guardduty.{region}.{dnsSuffix}\",\n            \"tags\" : [ \"fips\" ]\n          } ]\n        },\n        \"endpoints\" : {\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"guardduty.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-east-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"guardduty.us-gov-east-1.amazonaws.com\"\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"guardduty.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"guardduty.us-gov-west-1.amazonaws.com\"\n          }\n        },\n        \"isRegionalized\" : true\n      },\n      \"health\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"https\" ],\n          \"sslCommonName\" : \"health.us-gov-west-1.amazonaws.com\"\n        },\n        \"endpoints\" : {\n          \"aws-us-gov-global\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"hostname\" : \"global.health.us-gov.amazonaws.com\"\n          },\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"health-fips.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"variants\" : [ {\n              \"hostname\" : \"health-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"iam\" : {\n        \"endpoints\" : {\n          \"aws-us-gov-global\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"hostname\" : \"iam.us-gov.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"iam.us-gov.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"aws-us-gov-global-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"iam.us-gov.amazonaws.com\"\n          },\n          \"iam-govcloud\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"variants\" : [ {\n              \"hostname\" : \"iam.us-gov.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"iam-govcloud-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"iam.us-gov.amazonaws.com\"\n          }\n        },\n        \"isRegionalized\" : false,\n        \"partitionEndpoint\" : \"aws-us-gov-global\"\n      },\n      \"identitystore\" : {\n        \"defaults\" : {\n          \"variants\" : [ {\n            \"hostname\" : \"identitystore.{region}.{dnsSuffix}\",\n            \"tags\" : [ \"fips\" ]\n          } ]\n        },\n        \"endpoints\" : {\n          \"fips-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"identitystore.us-gov-east-1.amazonaws.com\"\n          },\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"identitystore.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"identitystore.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"identitystore.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"ingest.timestream\" : {\n        \"endpoints\" : {\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ingest.timestream.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"ingest.timestream.us-gov-west-1.amazonaws.com\"\n          }\n        }\n      },\n      \"inspector\" : {\n        \"endpoints\" : {\n          \"fips-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"inspector-fips.us-gov-east-1.amazonaws.com\"\n          },\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"inspector-fips.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"inspector-fips.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"inspector-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"inspector2\" : {\n        \"endpoints\" : {\n          \"fips-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"inspector2-fips.us-gov-east-1.amazonaws.com\"\n          },\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"inspector2-fips.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"inspector2-fips.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"inspector2-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"internetmonitor\" : {\n        \"defaults\" : {\n          \"dnsSuffix\" : \"api.aws\",\n          \"variants\" : [ {\n            \"dnsSuffix\" : \"api.aws\",\n            \"hostname\" : \"{service}-fips.{region}.{dnsSuffix}\",\n            \"tags\" : [ \"fips\" ]\n          } ]\n        },\n        \"endpoints\" : {\n          \"us-gov-east-1\" : {\n            \"hostname\" : \"internetmonitor.us-gov-east-1.api.aws\"\n          },\n          \"us-gov-west-1\" : {\n            \"hostname\" : \"internetmonitor.us-gov-west-1.api.aws\"\n          }\n        }\n      },\n      \"iot\" : {\n        \"endpoints\" : {\n          \"fips-us-gov-east-1\" : {\n            \"deprecated\" : true,\n            \"hostname\" : \"iot-fips.us-gov-east-1.amazonaws.com\"\n          },\n          \"fips-us-gov-west-1\" : {\n            \"deprecated\" : true,\n            \"hostname\" : \"iot-fips.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"iot-fips.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"iot-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"iotevents\" : {\n        \"endpoints\" : {\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"iotevents-fips.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"iotevents-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"ioteventsdata\" : {\n        \"endpoints\" : {\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"data.iotevents-fips.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"hostname\" : \"data.iotevents.us-gov-west-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"data.iotevents-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"iotsecuredtunneling\" : {\n        \"defaults\" : {\n          \"variants\" : [ {\n            \"hostname\" : \"api.tunneling.iot-fips.{region}.{dnsSuffix}\",\n            \"tags\" : [ \"fips\" ]\n          } ]\n        },\n        \"endpoints\" : {\n          \"fips-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"api.tunneling.iot-fips.us-gov-east-1.amazonaws.com\"\n          },\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"api.tunneling.iot-fips.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"api.tunneling.iot-fips.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"api.tunneling.iot-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"iotsitewise\" : {\n        \"endpoints\" : {\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"iotsitewise-fips.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"iotsitewise-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"iottwinmaker\" : {\n        \"endpoints\" : {\n          \"api-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"hostname\" : \"api.iottwinmaker.us-gov-west-1.amazonaws.com\"\n          },\n          \"data-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"hostname\" : \"data.iottwinmaker.us-gov-west-1.amazonaws.com\"\n          },\n          \"fips-api-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"hostname\" : \"api.iottwinmaker-fips.us-gov-west-1.amazonaws.com\"\n          },\n          \"fips-data-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"hostname\" : \"data.iottwinmaker-fips.us-gov-west-1.amazonaws.com\"\n          },\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"iottwinmaker-fips.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"iottwinmaker-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"kafka\" : {\n        \"endpoints\" : {\n          \"us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"hostname\" : \"kafka.us-gov-east-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"kafka.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-east-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"kafka.us-gov-east-1.amazonaws.com\"\n          },\n          \"us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"hostname\" : \"kafka.us-gov-west-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"kafka.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"kafka.us-gov-west-1.amazonaws.com\"\n          }\n        }\n      },\n      \"kendra\" : {\n        \"endpoints\" : {\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"kendra-fips.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"kendra-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"kendra-ranking\" : {\n        \"defaults\" : {\n          \"dnsSuffix\" : \"api.aws\",\n          \"variants\" : [ {\n            \"dnsSuffix\" : \"api.aws\",\n            \"hostname\" : \"{service}-fips.{region}.{dnsSuffix}\",\n            \"tags\" : [ \"fips\" ]\n          } ]\n        },\n        \"endpoints\" : {\n          \"us-gov-east-1\" : {\n            \"hostname\" : \"kendra-ranking.us-gov-east-1.api.aws\"\n          },\n          \"us-gov-west-1\" : {\n            \"hostname\" : \"kendra-ranking.us-gov-west-1.api.aws\"\n          }\n        }\n      },\n      \"kinesis\" : {\n        \"endpoints\" : {\n          \"fips-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"kinesis.us-gov-east-1.amazonaws.com\"\n          },\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"kinesis.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"hostname\" : \"kinesis.us-gov-east-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"kinesis.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"hostname\" : \"kinesis.us-gov-west-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"kinesis.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"kinesisanalytics\" : {\n        \"endpoints\" : {\n          \"fips-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"kinesisanalytics-fips.us-gov-east-1.amazonaws.com\"\n          },\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"kinesisanalytics-fips.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"kinesisanalytics-fips.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"kinesisanalytics-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"kinesisvideo\" : {\n        \"endpoints\" : {\n          \"fips-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"kinesisvideo-fips.us-gov-east-1.amazonaws.com\"\n          },\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"kinesisvideo-fips.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"hostname\" : \"kinesisvideo-fips.us-gov-east-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"kinesisvideo-fips.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"hostname\" : \"kinesisvideo-fips.us-gov-west-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"kinesisvideo-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"kms\" : {\n        \"endpoints\" : {\n          \"ProdFips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"kms-fips.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"kms-fips.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-east-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"kms-fips.us-gov-east-1.amazonaws.com\"\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"kms-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"kms-fips.us-gov-west-1.amazonaws.com\"\n          }\n        }\n      },\n      \"lakeformation\" : {\n        \"endpoints\" : {\n          \"fips-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"lakeformation-fips.us-gov-east-1.amazonaws.com\"\n          },\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"lakeformation-fips.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"lakeformation-fips.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"lakeformation-fips.us-gov-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"lakeformation.us-gov-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"lakeformation-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"lakeformation-fips.us-gov-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"lakeformation.us-gov-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"lambda\" : {\n        \"endpoints\" : {\n          \"fips-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"lambda-fips.us-gov-east-1.amazonaws.com\"\n          },\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"lambda-fips.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"lambda-fips.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"lambda.us-gov-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"lambda-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"lambda.us-gov-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"license-manager\" : {\n        \"endpoints\" : {\n          \"fips-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"license-manager-fips.us-gov-east-1.amazonaws.com\"\n          },\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"license-manager-fips.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"license-manager-fips.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"license-manager-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"license-manager-linux-subscriptions\" : {\n        \"endpoints\" : {\n          \"us-gov-east-1\" : { },\n          \"us-gov-west-1\" : { }\n        }\n      },\n      \"license-manager-user-subscriptions\" : {\n        \"endpoints\" : {\n          \"us-gov-east-1\" : { },\n          \"us-gov-west-1\" : { }\n        }\n      },\n      \"logs\" : {\n        \"endpoints\" : {\n          \"fips-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"logs.us-gov-east-1.amazonaws.com\"\n          },\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"logs.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"logs.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"logs.us-gov-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"logs.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"logs.us-gov-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"m2\" : {\n        \"endpoints\" : {\n          \"fips-us-gov-east-1\" : {\n            \"deprecated\" : true\n          },\n          \"fips-us-gov-west-1\" : {\n            \"deprecated\" : true\n          },\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"managedblockchain\" : {\n        \"endpoints\" : {\n          \"us-gov-west-1\" : { }\n        }\n      },\n      \"mediaconvert\" : {\n        \"endpoints\" : {\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"mediaconvert.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"mediaconvert.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"mediaconvert.us-gov-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            }, {\n              \"hostname\" : \"mediaconvert.us-gov-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"meetings-chime\" : {\n        \"endpoints\" : {\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"meetings-chime-fips.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-east-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"meetings-chime-fips.us-gov-east-1.amazonaws.com\"\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"meetings-chime-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"meetings-chime-fips.us-gov-west-1.amazonaws.com\"\n          }\n        }\n      },\n      \"memory-db\" : {\n        \"endpoints\" : {\n          \"us-gov-east-1\" : { },\n          \"us-gov-west-1\" : { }\n        }\n      },\n      \"metering.marketplace\" : {\n        \"defaults\" : {\n          \"credentialScope\" : {\n            \"service\" : \"aws-marketplace\"\n          }\n        },\n        \"endpoints\" : {\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"metering-marketplace.us-gov-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"metering-marketplace.us-gov-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"metrics.sagemaker\" : {\n        \"endpoints\" : {\n          \"us-gov-east-1\" : { },\n          \"us-gov-west-1\" : { }\n        }\n      },\n      \"mgn\" : {\n        \"endpoints\" : {\n          \"fips-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"mgn-fips.us-gov-east-1.amazonaws.com\"\n          },\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"mgn-fips.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"mgn-fips.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"mgn-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"models-v2-lex\" : {\n        \"endpoints\" : {\n          \"us-gov-west-1\" : { }\n        }\n      },\n      \"models.lex\" : {\n        \"defaults\" : {\n          \"credentialScope\" : {\n            \"service\" : \"lex\"\n          },\n          \"variants\" : [ {\n            \"hostname\" : \"models-fips.lex.{region}.{dnsSuffix}\",\n            \"tags\" : [ \"fips\" ]\n          } ]\n        },\n        \"endpoints\" : {\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"models-fips.lex.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"models-fips.lex.us-gov-west-1.amazonaws.com\"\n          }\n        }\n      },\n      \"monitoring\" : {\n        \"defaults\" : {\n          \"variants\" : [ {\n            \"hostname\" : \"monitoring.{region}.{dnsSuffix}\",\n            \"tags\" : [ \"fips\" ]\n          } ]\n        },\n        \"endpoints\" : {\n          \"fips-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"monitoring.us-gov-east-1.amazonaws.com\"\n          },\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"monitoring.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"monitoring.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"monitoring.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"mq\" : {\n        \"endpoints\" : {\n          \"fips-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"mq-fips.us-gov-east-1.amazonaws.com\"\n          },\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"mq-fips.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"mq-fips.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"mq-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"neptune\" : {\n        \"endpoints\" : {\n          \"us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"hostname\" : \"rds.us-gov-east-1.amazonaws.com\"\n          },\n          \"us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"hostname\" : \"rds.us-gov-west-1.amazonaws.com\"\n          }\n        }\n      },\n      \"network-firewall\" : {\n        \"endpoints\" : {\n          \"fips-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"network-firewall-fips.us-gov-east-1.amazonaws.com\"\n          },\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"network-firewall-fips.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"network-firewall-fips.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"network-firewall-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"networkmanager\" : {\n        \"endpoints\" : {\n          \"aws-us-gov-global\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"hostname\" : \"networkmanager.us-gov-west-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"networkmanager.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"networkmanager.us-gov-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            }, {\n              \"hostname\" : \"networkmanager.us-gov-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            } ]\n          },\n          \"fips-aws-us-gov-global\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"networkmanager.us-gov-west-1.amazonaws.com\"\n          }\n        },\n        \"isRegionalized\" : false,\n        \"partitionEndpoint\" : \"aws-us-gov-global\"\n      },\n      \"notifications\" : {\n        \"defaults\" : {\n          \"dnsSuffix\" : \"api.aws\",\n          \"variants\" : [ {\n            \"dnsSuffix\" : \"api.aws\",\n            \"hostname\" : \"{service}-fips.{region}.{dnsSuffix}\",\n            \"tags\" : [ \"fips\" ]\n          } ]\n        },\n        \"endpoints\" : {\n          \"us-gov-east-1\" : {\n            \"hostname\" : \"notifications.us-gov-east-1.api.aws\"\n          },\n          \"us-gov-west-1\" : {\n            \"hostname\" : \"notifications.us-gov-west-1.api.aws\"\n          }\n        }\n      },\n      \"oam\" : {\n        \"endpoints\" : {\n          \"us-gov-east-1\" : { },\n          \"us-gov-west-1\" : { }\n        }\n      },\n      \"oidc\" : {\n        \"endpoints\" : {\n          \"us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"hostname\" : \"oidc.us-gov-east-1.amazonaws.com\"\n          },\n          \"us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"hostname\" : \"oidc.us-gov-west-1.amazonaws.com\"\n          }\n        }\n      },\n      \"organizations\" : {\n        \"endpoints\" : {\n          \"aws-us-gov-global\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"hostname\" : \"organizations.us-gov-west-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"organizations.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"fips-aws-us-gov-global\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"organizations.us-gov-west-1.amazonaws.com\"\n          }\n        },\n        \"isRegionalized\" : false,\n        \"partitionEndpoint\" : \"aws-us-gov-global\"\n      },\n      \"outposts\" : {\n        \"endpoints\" : {\n          \"fips-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"outposts.us-gov-east-1.amazonaws.com\"\n          },\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"outposts.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"outposts.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"outposts.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"participant.connect\" : {\n        \"endpoints\" : {\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"participant.connect.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"participant.connect.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"pi\" : {\n        \"endpoints\" : {\n          \"fips-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"pi-fips.us-gov-east-1.amazonaws.com\"\n          },\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"pi-fips.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"protocols\" : [ \"https\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"pi-fips.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"pi-fips.us-gov-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"pi.us-gov-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"protocols\" : [ \"https\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"pi-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"pi-fips.us-gov-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"pi.us-gov-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"pinpoint\" : {\n        \"defaults\" : {\n          \"credentialScope\" : {\n            \"service\" : \"mobiletargeting\"\n          }\n        },\n        \"endpoints\" : {\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"pinpoint-fips.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"hostname\" : \"pinpoint.us-gov-west-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"pinpoint-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"polly\" : {\n        \"endpoints\" : {\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"polly-fips.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"polly-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"polly-fips.us-gov-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"polly.us-gov-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"portal.sso\" : {\n        \"endpoints\" : {\n          \"us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"hostname\" : \"portal.sso.us-gov-east-1.amazonaws.com\"\n          },\n          \"us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"hostname\" : \"portal.sso.us-gov-west-1.amazonaws.com\"\n          }\n        }\n      },\n      \"qbusiness\" : {\n        \"defaults\" : {\n          \"dnsSuffix\" : \"api.aws\",\n          \"variants\" : [ {\n            \"dnsSuffix\" : \"api.aws\",\n            \"hostname\" : \"{service}-fips.{region}.{dnsSuffix}\",\n            \"tags\" : [ \"fips\" ]\n          } ]\n        },\n        \"endpoints\" : {\n          \"us-gov-east-1\" : {\n            \"hostname\" : \"qbusiness.us-gov-east-1.api.aws\"\n          },\n          \"us-gov-west-1\" : {\n            \"hostname\" : \"qbusiness.us-gov-west-1.api.aws\"\n          }\n        }\n      },\n      \"query.timestream\" : {\n        \"endpoints\" : {\n          \"us-gov-west-1\" : { }\n        }\n      },\n      \"quicksight\" : {\n        \"endpoints\" : {\n          \"us-gov-east-1\" : { },\n          \"us-gov-west-1\" : { }\n        }\n      },\n      \"ram\" : {\n        \"endpoints\" : {\n          \"us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"hostname\" : \"ram.us-gov-east-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            }, {\n              \"hostname\" : \"ram.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"ramus-gov-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            } ]\n          },\n          \"us-gov-east-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"ram.us-gov-east-1.amazonaws.com\"\n          },\n          \"us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"hostname\" : \"ram.us-gov-west-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            }, {\n              \"hostname\" : \"ram.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"ramus-gov-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"ram.us-gov-west-1.amazonaws.com\"\n          }\n        }\n      },\n      \"rbin\" : {\n        \"endpoints\" : {\n          \"fips-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"rbin-fips.us-gov-east-1.amazonaws.com\"\n          },\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"rbin-fips.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"rbin-fips.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"rbin-fips.us-gov-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"rbin.us-gov-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"rbin-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"rbin-fips.us-gov-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"rbin.us-gov-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"rds\" : {\n        \"defaults\" : {\n          \"variants\" : [ {\n            \"hostname\" : \"rds.{region}.{dnsSuffix}\",\n            \"tags\" : [ \"fips\" ]\n          } ]\n        },\n        \"endpoints\" : {\n          \"rds.us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"rds.us-gov-east-1.amazonaws.com\"\n          },\n          \"rds.us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"rds.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"rds.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-east-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"rds.us-gov-east-1.amazonaws.com\"\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"rds.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"rds.us-gov-west-1.amazonaws.com\"\n          }\n        }\n      },\n      \"redshift\" : {\n        \"endpoints\" : {\n          \"us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"hostname\" : \"redshift.us-gov-east-1.amazonaws.com\"\n          },\n          \"us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"hostname\" : \"redshift.us-gov-west-1.amazonaws.com\"\n          }\n        }\n      },\n      \"redshift-serverless\" : {\n        \"endpoints\" : {\n          \"fips-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"redshift-serverless-fips.us-gov-east-1.amazonaws.com\"\n          },\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"redshift-serverless-fips.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"redshift-serverless-fips.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"redshift-serverless-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"rekognition\" : {\n        \"endpoints\" : {\n          \"rekognition-fips.us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"rekognition-fips.us-gov-west-1.amazonaws.com\"\n          },\n          \"rekognition.us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"variants\" : [ {\n              \"hostname\" : \"rekognition-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"rekognition-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"rekognition-fips.us-gov-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"rekognition.us-gov-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-gov-west-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"rekognition-fips.us-gov-west-1.amazonaws.com\"\n          }\n        }\n      },\n      \"resiliencehub\" : {\n        \"endpoints\" : {\n          \"fips-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"resiliencehub-fips.us-gov-east-1.amazonaws.com\"\n          },\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"resiliencehub-fips.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"resiliencehub-fips.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"resiliencehub-fips.us-gov-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"resiliencehub.us-gov-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"resiliencehub-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"resiliencehub-fips.us-gov-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"resiliencehub.us-gov-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"resource-groups\" : {\n        \"defaults\" : {\n          \"variants\" : [ {\n            \"hostname\" : \"resource-groups.{region}.{dnsSuffix}\",\n            \"tags\" : [ \"fips\" ]\n          } ]\n        },\n        \"endpoints\" : {\n          \"fips-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"resource-groups.us-gov-east-1.amazonaws.com\"\n          },\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"resource-groups.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"resource-groups.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"resource-groups.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"robomaker\" : {\n        \"endpoints\" : {\n          \"us-gov-west-1\" : { }\n        }\n      },\n      \"rolesanywhere\" : {\n        \"endpoints\" : {\n          \"fips-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"rolesanywhere-fips.us-gov-east-1.amazonaws.com\"\n          },\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"rolesanywhere-fips.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"rolesanywhere-fips.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"rolesanywhere-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"route53\" : {\n        \"endpoints\" : {\n          \"aws-us-gov-global\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"hostname\" : \"route53.us-gov.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"route53.us-gov.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"fips-aws-us-gov-global\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"route53.us-gov.amazonaws.com\"\n          }\n        },\n        \"isRegionalized\" : false,\n        \"partitionEndpoint\" : \"aws-us-gov-global\"\n      },\n      \"route53profiles\" : {\n        \"endpoints\" : {\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"route53profiles-fips.us-gov-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"route53profiles.us-gov-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"route53profiles-fips.us-gov-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"route53profiles.us-gov-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"route53resolver\" : {\n        \"endpoints\" : {\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"route53resolver.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"route53resolver.us-gov-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            }, {\n              \"hostname\" : \"route53resolver.us-gov-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            } ]\n          },\n          \"us-gov-east-1-fips\" : {\n            \"deprecated\" : true,\n            \"hostname\" : \"route53resolver.us-gov-east-1.amazonaws.com\"\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"route53resolver.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"route53resolver.us-gov-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            }, {\n              \"hostname\" : \"route53resolver.us-gov-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1-fips\" : {\n            \"deprecated\" : true,\n            \"hostname\" : \"route53resolver.us-gov-west-1.amazonaws.com\"\n          }\n        }\n      },\n      \"rum\" : {\n        \"endpoints\" : {\n          \"us-gov-east-1\" : { },\n          \"us-gov-west-1\" : { }\n        }\n      },\n      \"runtime-v2-lex\" : {\n        \"endpoints\" : {\n          \"us-gov-west-1\" : { }\n        }\n      },\n      \"runtime.lex\" : {\n        \"defaults\" : {\n          \"credentialScope\" : {\n            \"service\" : \"lex\"\n          },\n          \"variants\" : [ {\n            \"hostname\" : \"runtime-fips.lex.{region}.{dnsSuffix}\",\n            \"tags\" : [ \"fips\" ]\n          } ]\n        },\n        \"endpoints\" : {\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"runtime-fips.lex.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"runtime-fips.lex.us-gov-west-1.amazonaws.com\"\n          }\n        }\n      },\n      \"runtime.sagemaker\" : {\n        \"defaults\" : {\n          \"variants\" : [ {\n            \"hostname\" : \"runtime.sagemaker.{region}.{dnsSuffix}\",\n            \"tags\" : [ \"fips\" ]\n          } ]\n        },\n        \"endpoints\" : {\n          \"us-gov-east-1\" : { },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"runtime.sagemaker.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"runtime.sagemaker.us-gov-west-1.amazonaws.com\"\n          }\n        }\n      },\n      \"s3\" : {\n        \"defaults\" : {\n          \"signatureVersions\" : [ \"s3\", \"s3v4\" ],\n          \"variants\" : [ {\n            \"dnsSuffix\" : \"amazonaws.com\",\n            \"hostname\" : \"{service}-fips.dualstack.{region}.{dnsSuffix}\",\n            \"tags\" : [ \"dualstack\", \"fips\" ]\n          }, {\n            \"dnsSuffix\" : \"amazonaws.com\",\n            \"hostname\" : \"{service}.dualstack.{region}.{dnsSuffix}\",\n            \"tags\" : [ \"dualstack\" ]\n          } ]\n        },\n        \"endpoints\" : {\n          \"fips-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"s3-fips.us-gov-east-1.amazonaws.com\"\n          },\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"s3-fips.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"hostname\" : \"s3.us-gov-east-1.amazonaws.com\",\n            \"protocols\" : [ \"http\", \"https\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"s3-fips.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"s3.dualstack.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"hostname\" : \"s3.us-gov-west-1.amazonaws.com\",\n            \"protocols\" : [ \"http\", \"https\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"s3-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"s3.dualstack.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"s3-control\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"https\" ],\n          \"signatureVersions\" : [ \"s3v4\" ],\n          \"variants\" : [ {\n            \"dnsSuffix\" : \"amazonaws.com\",\n            \"hostname\" : \"{service}-fips.dualstack.{region}.{dnsSuffix}\",\n            \"tags\" : [ \"dualstack\", \"fips\" ]\n          }, {\n            \"dnsSuffix\" : \"amazonaws.com\",\n            \"hostname\" : \"{service}.dualstack.{region}.{dnsSuffix}\",\n            \"tags\" : [ \"dualstack\" ]\n          } ]\n        },\n        \"endpoints\" : {\n          \"us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"hostname\" : \"s3-control.us-gov-east-1.amazonaws.com\",\n            \"signatureVersions\" : [ \"s3v4\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"s3-control-fips.dualstack.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"s3-control-fips.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"s3-control.dualstack.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-gov-east-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"s3-control-fips.us-gov-east-1.amazonaws.com\",\n            \"signatureVersions\" : [ \"s3v4\" ]\n          },\n          \"us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"hostname\" : \"s3-control.us-gov-west-1.amazonaws.com\",\n            \"signatureVersions\" : [ \"s3v4\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"s3-control-fips.dualstack.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"s3-control-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"s3-control.dualstack.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-gov-west-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"s3-control-fips.us-gov-west-1.amazonaws.com\",\n            \"signatureVersions\" : [ \"s3v4\" ]\n          }\n        }\n      },\n      \"s3-outposts\" : {\n        \"endpoints\" : {\n          \"fips-us-gov-east-1\" : {\n            \"deprecated\" : true\n          },\n          \"fips-us-gov-west-1\" : {\n            \"deprecated\" : true\n          },\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            }, {\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            }, {\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"scheduler\" : {\n        \"endpoints\" : {\n          \"us-gov-east-1\" : { },\n          \"us-gov-west-1\" : { }\n        }\n      },\n      \"schemas\" : {\n        \"endpoints\" : {\n          \"us-gov-east-1\" : { },\n          \"us-gov-west-1\" : { }\n        }\n      },\n      \"secretsmanager\" : {\n        \"endpoints\" : {\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            }, {\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-east-1-fips\" : {\n            \"deprecated\" : true\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"dualstack\" ]\n            }, {\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1-fips\" : {\n            \"deprecated\" : true\n          }\n        }\n      },\n      \"securityhub\" : {\n        \"endpoints\" : {\n          \"fips-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"securityhub-fips.us-gov-east-1.amazonaws.com\"\n          },\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"securityhub-fips.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"securityhub-fips.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"securityhub.us-gov-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"securityhub-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"securityhub.us-gov-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"securitylake\" : {\n        \"endpoints\" : {\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"securitylake.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"securitylake.us-gov-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            } ]\n          },\n          \"us-gov-east-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"securitylake.us-gov-east-1.amazonaws.com\"\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"securitylake.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"securitylake.us-gov-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"securitylake.us-gov-west-1.amazonaws.com\"\n          }\n        }\n      },\n      \"serverlessrepo\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"https\" ]\n        },\n        \"endpoints\" : {\n          \"us-gov-east-1\" : {\n            \"protocols\" : [ \"https\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"serverlessrepo.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-east-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"serverlessrepo.us-gov-east-1.amazonaws.com\"\n          },\n          \"us-gov-west-1\" : {\n            \"protocols\" : [ \"https\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"serverlessrepo.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"serverlessrepo.us-gov-west-1.amazonaws.com\"\n          }\n        }\n      },\n      \"servicecatalog\" : {\n        \"endpoints\" : {\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"servicecatalog-fips.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-east-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"servicecatalog-fips.us-gov-east-1.amazonaws.com\"\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"servicecatalog-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"servicecatalog-fips.us-gov-west-1.amazonaws.com\"\n          }\n        }\n      },\n      \"servicecatalog-appregistry\" : {\n        \"defaults\" : {\n          \"variants\" : [ {\n            \"hostname\" : \"servicecatalog-appregistry.{region}.{dnsSuffix}\",\n            \"tags\" : [ \"fips\" ]\n          } ]\n        },\n        \"endpoints\" : {\n          \"us-gov-east-1\" : { },\n          \"us-gov-west-1\" : { }\n        }\n      },\n      \"servicediscovery\" : {\n        \"endpoints\" : {\n          \"servicediscovery\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"variants\" : [ {\n              \"hostname\" : \"servicediscovery-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"servicediscovery-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"servicediscovery-fips.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"servicediscovery-fips.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"servicediscovery-fips.us-gov-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"servicediscovery.us-gov-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-gov-east-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"servicediscovery-fips.us-gov-east-1.amazonaws.com\"\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"servicediscovery-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"servicediscovery-fips.us-gov-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"servicediscovery.us-gov-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-gov-west-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"servicediscovery-fips.us-gov-west-1.amazonaws.com\"\n          }\n        }\n      },\n      \"servicequotas\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"https\" ],\n          \"variants\" : [ {\n            \"hostname\" : \"servicequotas.{region}.{dnsSuffix}\",\n            \"tags\" : [ \"fips\" ]\n          } ]\n        },\n        \"endpoints\" : {\n          \"fips-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"servicequotas.us-gov-east-1.amazonaws.com\"\n          },\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"servicequotas.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"servicequotas.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"servicequotas.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"signer\" : {\n        \"endpoints\" : {\n          \"fips-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"signer-fips.us-gov-east-1.amazonaws.com\"\n          },\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"signer-fips.us-gov-west-1.amazonaws.com\"\n          },\n          \"fips-verification-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"hostname\" : \"verification.signer-fips.us-gov-east-1.amazonaws.com\"\n          },\n          \"fips-verification-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"hostname\" : \"verification.signer-fips.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"signer-fips.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"signer-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"verification-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"hostname\" : \"verification.signer.us-gov-east-1.amazonaws.com\"\n          },\n          \"verification-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"hostname\" : \"verification.signer.us-gov-west-1.amazonaws.com\"\n          }\n        }\n      },\n      \"simspaceweaver\" : {\n        \"endpoints\" : {\n          \"fips-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"simspaceweaver.us-gov-east-1.amazonaws.com\"\n          },\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"simspaceweaver.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"simspaceweaver.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"simspaceweaver.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"sms-voice\" : {\n        \"endpoints\" : {\n          \"fips-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"sms-voice-fips.us-gov-east-1.amazonaws.com\"\n          },\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"sms-voice-fips.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sms-voice-fips.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"sms-voice-fips.us-gov-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"sms-voice.us-gov-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sms-voice-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"sms-voice-fips.us-gov-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"sms-voice.us-gov-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"snowball\" : {\n        \"endpoints\" : {\n          \"fips-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"snowball-fips.us-gov-east-1.amazonaws.com\"\n          },\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"snowball-fips.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"snowball-fips.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"snowball-fips.us-gov-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"snowball.us-gov-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"snowball-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"snowball-fips.us-gov-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"snowball.us-gov-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"sns\" : {\n        \"endpoints\" : {\n          \"fips-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"sns.us-gov-east-1.amazonaws.com\"\n          },\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"sns.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sns.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"protocols\" : [ \"https\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"sns.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"sqs\" : {\n        \"defaults\" : {\n          \"variants\" : [ {\n            \"hostname\" : \"sqs.{region}.{dnsSuffix}\",\n            \"tags\" : [ \"fips\" ]\n          } ]\n        },\n        \"endpoints\" : {\n          \"fips-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"sqs.us-gov-east-1.amazonaws.com\"\n          },\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"sqs.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sqs.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"protocols\" : [ \"http\", \"https\" ],\n            \"sslCommonName\" : \"{region}.queue.{dnsSuffix}\",\n            \"variants\" : [ {\n              \"hostname\" : \"sqs.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"ssm\" : {\n        \"defaults\" : {\n          \"variants\" : [ {\n            \"hostname\" : \"ssm.{region}.{dnsSuffix}\",\n            \"tags\" : [ \"fips\" ]\n          } ]\n        },\n        \"endpoints\" : {\n          \"fips-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"ssm.us-gov-east-1.amazonaws.com\"\n          },\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"ssm.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ssm.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ssm.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"sso\" : {\n        \"endpoints\" : {\n          \"us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"hostname\" : \"sso.us-gov-east-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"sso.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-east-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"sso.us-gov-east-1.amazonaws.com\"\n          },\n          \"us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"hostname\" : \"sso.us-gov-west-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"sso.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"sso.us-gov-west-1.amazonaws.com\"\n          }\n        }\n      },\n      \"states\" : {\n        \"endpoints\" : {\n          \"fips-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"states-fips.us-gov-east-1.amazonaws.com\"\n          },\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"states.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"states-fips.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"states.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"storagegateway\" : {\n        \"endpoints\" : {\n          \"fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"storagegateway-fips.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"storagegateway-fips.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-east-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"storagegateway-fips.us-gov-east-1.amazonaws.com\"\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"storagegateway-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"storagegateway-fips.us-gov-west-1.amazonaws.com\"\n          }\n        }\n      },\n      \"streams.dynamodb\" : {\n        \"defaults\" : {\n          \"credentialScope\" : {\n            \"service\" : \"dynamodb\"\n          },\n          \"variants\" : [ {\n            \"hostname\" : \"streams.dynamodb.{region}.{dnsSuffix}\",\n            \"tags\" : [ \"fips\" ]\n          } ]\n        },\n        \"endpoints\" : {\n          \"us-gov-east-1\" : { },\n          \"us-gov-west-1\" : { }\n        }\n      },\n      \"sts\" : {\n        \"defaults\" : {\n          \"variants\" : [ {\n            \"hostname\" : \"sts.{region}.{dnsSuffix}\",\n            \"tags\" : [ \"fips\" ]\n          } ]\n        },\n        \"endpoints\" : {\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sts.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-east-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"sts.us-gov-east-1.amazonaws.com\"\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sts.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"sts.us-gov-west-1.amazonaws.com\"\n          }\n        }\n      },\n      \"support\" : {\n        \"endpoints\" : {\n          \"aws-us-gov-global\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"hostname\" : \"support.us-gov-west-1.amazonaws.com\"\n          },\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"support.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"variants\" : [ {\n              \"hostname\" : \"support.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        },\n        \"partitionEndpoint\" : \"aws-us-gov-global\"\n      },\n      \"swf\" : {\n        \"endpoints\" : {\n          \"us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"hostname\" : \"swf.us-gov-east-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"swf.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-east-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"swf.us-gov-east-1.amazonaws.com\"\n          },\n          \"us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"hostname\" : \"swf.us-gov-west-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"swf.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"swf.us-gov-west-1.amazonaws.com\"\n          }\n        }\n      },\n      \"synthetics\" : {\n        \"endpoints\" : {\n          \"fips-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"synthetics-fips.us-gov-east-1.amazonaws.com\"\n          },\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"synthetics-fips.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"synthetics-fips.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"synthetics-fips.us-gov-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"synthetics.us-gov-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"synthetics-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"synthetics-fips.us-gov-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"synthetics.us-gov-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"tagging\" : {\n        \"endpoints\" : {\n          \"us-gov-east-1\" : { },\n          \"us-gov-west-1\" : { }\n        }\n      },\n      \"textract\" : {\n        \"endpoints\" : {\n          \"fips-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"textract-fips.us-gov-east-1.amazonaws.com\"\n          },\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"textract-fips.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"textract-fips.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"textract-fips.us-gov-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"textract.us-gov-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"textract-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"textract-fips.us-gov-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"textract.us-gov-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"transcribe\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"https\" ],\n          \"variants\" : [ {\n            \"hostname\" : \"fips.transcribe.{region}.{dnsSuffix}\",\n            \"tags\" : [ \"fips\" ]\n          } ]\n        },\n        \"endpoints\" : {\n          \"fips-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"fips.transcribe.us-gov-east-1.amazonaws.com\"\n          },\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"fips.transcribe.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"fips.transcribe.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"transcribe-fips.us-gov-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"transcribe.us-gov-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"fips.transcribe.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"transcribe-fips.us-gov-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"transcribe.us-gov-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"transcribestreaming\" : {\n        \"endpoints\" : {\n          \"fips-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"transcribestreaming-fips.us-gov-east-1.amazonaws.com\"\n          },\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"transcribestreaming-fips.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"transcribestreaming-fips.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"transcribestreaming-fips.us-gov-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"transcribestreaming.us-gov-east-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"transcribestreaming-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"transcribestreaming-fips.us-gov-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"transcribestreaming.us-gov-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"transfer\" : {\n        \"endpoints\" : {\n          \"fips-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"transfer-fips.us-gov-east-1.amazonaws.com\"\n          },\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"transfer-fips.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"transfer-fips.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"transfer-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"translate\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"https\" ]\n        },\n        \"endpoints\" : {\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"translate-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"translate-fips.us-gov-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"translate.us-gov-west-1.api.aws\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-gov-west-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"translate-fips.us-gov-west-1.amazonaws.com\"\n          }\n        }\n      },\n      \"verifiedpermissions\" : {\n        \"endpoints\" : {\n          \"fips-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"verifiedpermissions-fips.us-gov-east-1.amazonaws.com\"\n          },\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"verifiedpermissions-fips.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"verifiedpermissions-fips.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"verifiedpermissions-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"waf-regional\" : {\n        \"endpoints\" : {\n          \"fips-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"waf-regional-fips.us-gov-east-1.amazonaws.com\"\n          },\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"waf-regional-fips.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"hostname\" : \"waf-regional.us-gov-east-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"waf-regional-fips.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"hostname\" : \"waf-regional.us-gov-west-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"waf-regional-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"wafv2\" : {\n        \"endpoints\" : {\n          \"fips-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"wafv2-fips.us-gov-east-1.amazonaws.com\"\n          },\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"wafv2-fips.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"hostname\" : \"wafv2.us-gov-east-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"wafv2-fips.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"hostname\" : \"wafv2.us-gov-west-1.amazonaws.com\",\n            \"variants\" : [ {\n              \"hostname\" : \"wafv2-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"wellarchitected\" : {\n        \"endpoints\" : {\n          \"us-gov-east-1\" : { },\n          \"us-gov-west-1\" : { }\n        }\n      },\n      \"workspaces\" : {\n        \"endpoints\" : {\n          \"fips-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"workspaces-fips.us-gov-east-1.amazonaws.com\"\n          },\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"workspaces-fips.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"workspaces-fips.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"workspaces-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"xray\" : {\n        \"endpoints\" : {\n          \"fips-us-gov-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"xray-fips.us-gov-east-1.amazonaws.com\"\n          },\n          \"fips-us-gov-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-gov-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"xray-fips.us-gov-west-1.amazonaws.com\"\n          },\n          \"us-gov-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"xray-fips.us-gov-east-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-gov-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"xray-fips.us-gov-west-1.amazonaws.com\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      }\n    }\n  }, {\n    \"defaults\" : {\n      \"hostname\" : \"{service}.{region}.{dnsSuffix}\",\n      \"protocols\" : [ \"https\" ],\n      \"signatureVersions\" : [ \"v4\" ],\n      \"variants\" : [ {\n        \"dnsSuffix\" : \"c2s.ic.gov\",\n        \"hostname\" : \"{service}-fips.{region}.{dnsSuffix}\",\n        \"tags\" : [ \"fips\" ]\n      } ]\n    },\n    \"dnsSuffix\" : \"c2s.ic.gov\",\n    \"partition\" : \"aws-iso\",\n    \"partitionName\" : \"AWS ISO (US)\",\n    \"regionRegex\" : \"^us\\\\-iso\\\\-\\\\w+\\\\-\\\\d+$\",\n    \"regions\" : {\n      \"us-iso-east-1\" : {\n        \"description\" : \"US ISO East\"\n      },\n      \"us-iso-west-1\" : {\n        \"description\" : \"US ISO WEST\"\n      }\n    },\n    \"services\" : {\n      \"agreement-marketplace\" : {\n        \"endpoints\" : {\n          \"fips-us-iso-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-iso-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"agreement-marketplace-fips.us-iso-east-1.c2s.ic.gov\"\n          },\n          \"us-iso-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"agreement-marketplace-fips.us-iso-east-1.c2s.ic.gov\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"api.ecr\" : {\n        \"endpoints\" : {\n          \"us-iso-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-iso-east-1\"\n            },\n            \"hostname\" : \"api.ecr.us-iso-east-1.c2s.ic.gov\"\n          },\n          \"us-iso-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-iso-west-1\"\n            },\n            \"hostname\" : \"api.ecr.us-iso-west-1.c2s.ic.gov\"\n          }\n        }\n      },\n      \"api.pricing\" : {\n        \"defaults\" : {\n          \"credentialScope\" : {\n            \"service\" : \"pricing\"\n          }\n        },\n        \"endpoints\" : {\n          \"us-iso-east-1\" : { }\n        }\n      },\n      \"api.sagemaker\" : {\n        \"endpoints\" : {\n          \"us-iso-east-1\" : { }\n        }\n      },\n      \"apigateway\" : {\n        \"endpoints\" : {\n          \"us-iso-east-1\" : { },\n          \"us-iso-west-1\" : { }\n        }\n      },\n      \"appconfig\" : {\n        \"endpoints\" : {\n          \"us-iso-east-1\" : { },\n          \"us-iso-west-1\" : { }\n        }\n      },\n      \"appconfigdata\" : {\n        \"endpoints\" : {\n          \"us-iso-east-1\" : { },\n          \"us-iso-west-1\" : { }\n        }\n      },\n      \"application-autoscaling\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"http\", \"https\" ]\n        },\n        \"endpoints\" : {\n          \"us-iso-east-1\" : { },\n          \"us-iso-west-1\" : { }\n        }\n      },\n      \"arc-zonal-shift\" : {\n        \"endpoints\" : {\n          \"us-iso-east-1\" : { },\n          \"us-iso-west-1\" : { }\n        }\n      },\n      \"athena\" : {\n        \"endpoints\" : {\n          \"us-iso-east-1\" : { }\n        }\n      },\n      \"autoscaling\" : {\n        \"endpoints\" : {\n          \"us-iso-east-1\" : {\n            \"protocols\" : [ \"http\", \"https\" ]\n          },\n          \"us-iso-west-1\" : { }\n        }\n      },\n      \"backup\" : {\n        \"endpoints\" : {\n          \"us-iso-east-1\" : { },\n          \"us-iso-west-1\" : { }\n        }\n      },\n      \"batch\" : {\n        \"endpoints\" : {\n          \"us-iso-east-1\" : { },\n          \"us-iso-west-1\" : { }\n        }\n      },\n      \"bedrock\" : {\n        \"endpoints\" : {\n          \"bedrock-runtime-us-iso-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-iso-east-1\"\n            },\n            \"hostname\" : \"bedrock-runtime.us-iso-east-1.c2s.ic.gov\"\n          },\n          \"bedrock-us-iso-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-iso-east-1\"\n            },\n            \"hostname\" : \"bedrock.us-iso-east-1.c2s.ic.gov\"\n          },\n          \"us-iso-east-1\" : { }\n        }\n      },\n      \"budgets\" : {\n        \"endpoints\" : {\n          \"aws-iso-global\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-iso-east-1\"\n            },\n            \"hostname\" : \"budgets.c2s.ic.gov\"\n          },\n          \"us-iso-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-iso-east-1\"\n            },\n            \"hostname\" : \"budgets.c2s.ic.gov\"\n          }\n        },\n        \"isRegionalized\" : false,\n        \"partitionEndpoint\" : \"aws-iso-global\"\n      },\n      \"ce\" : {\n        \"endpoints\" : {\n          \"aws-iso-global\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-iso-east-1\"\n            },\n            \"hostname\" : \"ce.us-iso-east-1.c2s.ic.gov\"\n          }\n        },\n        \"isRegionalized\" : false,\n        \"partitionEndpoint\" : \"aws-iso-global\"\n      },\n      \"cloudcontrolapi\" : {\n        \"endpoints\" : {\n          \"us-iso-east-1\" : { },\n          \"us-iso-west-1\" : { }\n        }\n      },\n      \"cloudformation\" : {\n        \"endpoints\" : {\n          \"us-iso-east-1\" : { },\n          \"us-iso-west-1\" : { }\n        }\n      },\n      \"cloudtrail\" : {\n        \"endpoints\" : {\n          \"fips-us-iso-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-iso-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"cloudtrail-fips.us-iso-east-1.c2s.ic.gov\"\n          },\n          \"fips-us-iso-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-iso-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"cloudtrail-fips.us-iso-west-1.c2s.ic.gov\"\n          },\n          \"us-iso-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cloudtrail-fips.us-iso-east-1.c2s.ic.gov\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-iso-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cloudtrail-fips.us-iso-west-1.c2s.ic.gov\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"codebuild\" : {\n        \"endpoints\" : {\n          \"us-iso-east-1\" : { },\n          \"us-iso-west-1\" : { }\n        }\n      },\n      \"codedeploy\" : {\n        \"endpoints\" : {\n          \"us-iso-east-1\" : { },\n          \"us-iso-west-1\" : { }\n        }\n      },\n      \"comprehend\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"https\" ]\n        },\n        \"endpoints\" : {\n          \"fips-us-iso-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-iso-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"comprehend-fips.us-iso-east-1.c2s.ic.gov\"\n          },\n          \"us-iso-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"comprehend-fips.us-iso-east-1.c2s.ic.gov\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"config\" : {\n        \"endpoints\" : {\n          \"fips-us-iso-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-iso-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"config-fips.us-iso-east-1.c2s.ic.gov\"\n          },\n          \"fips-us-iso-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-iso-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"config-fips.us-iso-west-1.c2s.ic.gov\"\n          },\n          \"us-iso-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"config-fips.us-iso-east-1.c2s.ic.gov\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-iso-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"config-fips.us-iso-west-1.c2s.ic.gov\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"datapipeline\" : {\n        \"endpoints\" : {\n          \"us-iso-east-1\" : { }\n        }\n      },\n      \"datasync\" : {\n        \"endpoints\" : {\n          \"fips-us-iso-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-iso-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"datasync-fips.us-iso-east-1.c2s.ic.gov\"\n          },\n          \"fips-us-iso-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-iso-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"datasync-fips.us-iso-west-1.c2s.ic.gov\"\n          },\n          \"us-iso-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"datasync-fips.us-iso-east-1.c2s.ic.gov\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-iso-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"datasync-fips.us-iso-west-1.c2s.ic.gov\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"directconnect\" : {\n        \"endpoints\" : {\n          \"us-iso-east-1\" : { },\n          \"us-iso-west-1\" : { }\n        }\n      },\n      \"dlm\" : {\n        \"endpoints\" : {\n          \"us-iso-east-1\" : { },\n          \"us-iso-west-1\" : { }\n        }\n      },\n      \"dms\" : {\n        \"defaults\" : {\n          \"variants\" : [ {\n            \"hostname\" : \"dms.{region}.{dnsSuffix}\",\n            \"tags\" : [ \"fips\" ]\n          } ]\n        },\n        \"endpoints\" : {\n          \"dms\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-iso-east-1\"\n            },\n            \"deprecated\" : true,\n            \"variants\" : [ {\n              \"hostname\" : \"dms.us-iso-east-1.c2s.ic.gov\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"dms-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-iso-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"dms.us-iso-east-1.c2s.ic.gov\"\n          },\n          \"us-iso-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"dms.us-iso-east-1.c2s.ic.gov\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-iso-east-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-iso-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"dms.us-iso-east-1.c2s.ic.gov\"\n          },\n          \"us-iso-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"dms.us-iso-west-1.c2s.ic.gov\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-iso-west-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-iso-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"dms.us-iso-west-1.c2s.ic.gov\"\n          }\n        }\n      },\n      \"ds\" : {\n        \"endpoints\" : {\n          \"fips-us-iso-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-iso-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"ds-fips.us-iso-east-1.c2s.ic.gov\"\n          },\n          \"fips-us-iso-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-iso-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"ds-fips.us-iso-west-1.c2s.ic.gov\"\n          },\n          \"us-iso-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ds-fips.us-iso-east-1.c2s.ic.gov\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-iso-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ds-fips.us-iso-west-1.c2s.ic.gov\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"dynamodb\" : {\n        \"endpoints\" : {\n          \"us-iso-east-1\" : {\n            \"protocols\" : [ \"http\", \"https\" ]\n          },\n          \"us-iso-west-1\" : { }\n        }\n      },\n      \"ebs\" : {\n        \"endpoints\" : {\n          \"us-iso-east-1\" : { },\n          \"us-iso-west-1\" : { }\n        }\n      },\n      \"ec2\" : {\n        \"endpoints\" : {\n          \"us-iso-east-1\" : { },\n          \"us-iso-west-1\" : { }\n        }\n      },\n      \"ecs\" : {\n        \"endpoints\" : {\n          \"us-iso-east-1\" : { },\n          \"us-iso-west-1\" : { }\n        }\n      },\n      \"eks\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"http\", \"https\" ]\n        },\n        \"endpoints\" : {\n          \"us-iso-east-1\" : { },\n          \"us-iso-west-1\" : { }\n        }\n      },\n      \"elasticache\" : {\n        \"endpoints\" : {\n          \"us-iso-east-1\" : { },\n          \"us-iso-west-1\" : { }\n        }\n      },\n      \"elasticfilesystem\" : {\n        \"endpoints\" : {\n          \"fips-us-iso-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-iso-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"elasticfilesystem-fips.us-iso-east-1.c2s.ic.gov\"\n          },\n          \"fips-us-iso-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-iso-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"elasticfilesystem-fips.us-iso-west-1.c2s.ic.gov\"\n          },\n          \"us-iso-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticfilesystem-fips.us-iso-east-1.c2s.ic.gov\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-iso-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticfilesystem-fips.us-iso-west-1.c2s.ic.gov\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"elasticloadbalancing\" : {\n        \"endpoints\" : {\n          \"us-iso-east-1\" : {\n            \"protocols\" : [ \"http\", \"https\" ]\n          },\n          \"us-iso-west-1\" : { }\n        }\n      },\n      \"elasticmapreduce\" : {\n        \"endpoints\" : {\n          \"fips-us-iso-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-iso-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"elasticmapreduce.us-iso-east-1.c2s.ic.gov\"\n          },\n          \"fips-us-iso-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-iso-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"elasticmapreduce.us-iso-west-1.c2s.ic.gov\"\n          },\n          \"us-iso-east-1\" : {\n            \"protocols\" : [ \"https\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"elasticmapreduce.us-iso-east-1.c2s.ic.gov\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-iso-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticmapreduce.us-iso-west-1.c2s.ic.gov\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"es\" : {\n        \"endpoints\" : {\n          \"us-iso-east-1\" : { },\n          \"us-iso-west-1\" : { }\n        }\n      },\n      \"events\" : {\n        \"endpoints\" : {\n          \"us-iso-east-1\" : { },\n          \"us-iso-west-1\" : { }\n        }\n      },\n      \"firehose\" : {\n        \"endpoints\" : {\n          \"us-iso-east-1\" : { },\n          \"us-iso-west-1\" : { }\n        }\n      },\n      \"fsx\" : {\n        \"endpoints\" : {\n          \"fips-prod-us-iso-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-iso-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"fsx-fips.us-iso-east-1.c2s.ic.gov\"\n          },\n          \"fips-us-iso-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-iso-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"fsx-fips.us-iso-east-1.c2s.ic.gov\"\n          },\n          \"prod-us-iso-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-iso-east-1\"\n            },\n            \"deprecated\" : true,\n            \"variants\" : [ {\n              \"hostname\" : \"fsx-fips.us-iso-east-1.c2s.ic.gov\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-iso-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"fsx-fips.us-iso-east-1.c2s.ic.gov\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-iso-west-1\" : { }\n        }\n      },\n      \"glacier\" : {\n        \"endpoints\" : {\n          \"fips-us-iso-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-iso-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"glacier-fips.us-iso-east-1.c2s.ic.gov\"\n          },\n          \"fips-us-iso-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-iso-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"glacier-fips.us-iso-west-1.c2s.ic.gov\"\n          },\n          \"us-iso-east-1\" : {\n            \"protocols\" : [ \"http\", \"https\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"glacier-fips.us-iso-east-1.c2s.ic.gov\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-iso-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"glacier-fips.us-iso-west-1.c2s.ic.gov\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"glue\" : {\n        \"endpoints\" : {\n          \"us-iso-east-1\" : { }\n        }\n      },\n      \"guardduty\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"https\" ]\n        },\n        \"endpoints\" : {\n          \"us-iso-east-1\" : { }\n        },\n        \"isRegionalized\" : true\n      },\n      \"health\" : {\n        \"endpoints\" : {\n          \"us-iso-east-1\" : { }\n        }\n      },\n      \"iam\" : {\n        \"endpoints\" : {\n          \"aws-iso-global\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-iso-east-1\"\n            },\n            \"hostname\" : \"iam.us-iso-east-1.c2s.ic.gov\"\n          }\n        },\n        \"isRegionalized\" : false,\n        \"partitionEndpoint\" : \"aws-iso-global\"\n      },\n      \"kinesis\" : {\n        \"endpoints\" : {\n          \"us-iso-east-1\" : { },\n          \"us-iso-west-1\" : { }\n        }\n      },\n      \"kinesisanalytics\" : {\n        \"endpoints\" : {\n          \"us-iso-east-1\" : { }\n        }\n      },\n      \"kinesisvideo\" : {\n        \"endpoints\" : {\n          \"us-iso-east-1\" : { }\n        }\n      },\n      \"kms\" : {\n        \"endpoints\" : {\n          \"ProdFips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-iso-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"kms-fips.us-iso-east-1.c2s.ic.gov\"\n          },\n          \"us-iso-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"kms-fips.us-iso-east-1.c2s.ic.gov\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-iso-east-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-iso-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"kms-fips.us-iso-east-1.c2s.ic.gov\"\n          },\n          \"us-iso-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"kms-fips.us-iso-west-1.c2s.ic.gov\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-iso-west-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-iso-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"kms-fips.us-iso-west-1.c2s.ic.gov\"\n          }\n        }\n      },\n      \"lakeformation\" : {\n        \"endpoints\" : {\n          \"us-iso-east-1\" : { }\n        }\n      },\n      \"lambda\" : {\n        \"endpoints\" : {\n          \"us-iso-east-1\" : { },\n          \"us-iso-west-1\" : { }\n        }\n      },\n      \"license-manager\" : {\n        \"endpoints\" : {\n          \"us-iso-east-1\" : { },\n          \"us-iso-west-1\" : { }\n        }\n      },\n      \"logs\" : {\n        \"endpoints\" : {\n          \"us-iso-east-1\" : { },\n          \"us-iso-west-1\" : { }\n        }\n      },\n      \"medialive\" : {\n        \"endpoints\" : {\n          \"fips-us-iso-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-iso-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"medialive-fips.us-iso-east-1.c2s.ic.gov\"\n          },\n          \"us-iso-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"medialive-fips.us-iso-east-1.c2s.ic.gov\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"mediapackage\" : {\n        \"endpoints\" : {\n          \"us-iso-east-1\" : { }\n        }\n      },\n      \"metrics.sagemaker\" : {\n        \"endpoints\" : {\n          \"us-iso-east-1\" : { }\n        }\n      },\n      \"monitoring\" : {\n        \"endpoints\" : {\n          \"us-iso-east-1\" : { },\n          \"us-iso-west-1\" : { }\n        }\n      },\n      \"network-firewall\" : {\n        \"endpoints\" : {\n          \"us-iso-east-1\" : { }\n        }\n      },\n      \"oam\" : {\n        \"endpoints\" : {\n          \"us-iso-east-1\" : { },\n          \"us-iso-west-1\" : { }\n        }\n      },\n      \"organizations\" : {\n        \"endpoints\" : {\n          \"aws-iso-global\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-iso-east-1\"\n            },\n            \"hostname\" : \"organizations.us-iso-east-1.c2s.ic.gov\"\n          }\n        },\n        \"isRegionalized\" : false,\n        \"partitionEndpoint\" : \"aws-iso-global\"\n      },\n      \"outposts\" : {\n        \"endpoints\" : {\n          \"us-iso-east-1\" : { }\n        }\n      },\n      \"pi\" : {\n        \"endpoints\" : {\n          \"us-iso-east-1\" : {\n            \"protocols\" : [ \"https\" ]\n          },\n          \"us-iso-west-1\" : {\n            \"protocols\" : [ \"https\" ]\n          }\n        }\n      },\n      \"ram\" : {\n        \"endpoints\" : {\n          \"us-iso-east-1\" : { },\n          \"us-iso-west-1\" : { }\n        }\n      },\n      \"rbin\" : {\n        \"endpoints\" : {\n          \"fips-us-iso-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-iso-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"rbin-fips.us-iso-east-1.c2s.ic.gov\"\n          },\n          \"fips-us-iso-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-iso-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"rbin-fips.us-iso-west-1.c2s.ic.gov\"\n          },\n          \"us-iso-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"rbin-fips.us-iso-east-1.c2s.ic.gov\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-iso-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"rbin-fips.us-iso-west-1.c2s.ic.gov\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"rds\" : {\n        \"endpoints\" : {\n          \"rds.us-iso-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-iso-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"rds.us-iso-east-1.c2s.ic.gov\"\n          },\n          \"rds.us-iso-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-iso-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"rds.us-iso-west-1.c2s.ic.gov\"\n          },\n          \"us-iso-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"rds.us-iso-east-1.c2s.ic.gov\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-iso-east-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-iso-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"rds.us-iso-east-1.c2s.ic.gov\"\n          },\n          \"us-iso-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"rds.us-iso-west-1.c2s.ic.gov\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-iso-west-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-iso-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"rds.us-iso-west-1.c2s.ic.gov\"\n          }\n        }\n      },\n      \"redshift\" : {\n        \"endpoints\" : {\n          \"us-iso-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-iso-east-1\"\n            },\n            \"hostname\" : \"redshift.us-iso-east-1.c2s.ic.gov\"\n          },\n          \"us-iso-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-iso-west-1\"\n            },\n            \"hostname\" : \"redshift.us-iso-west-1.c2s.ic.gov\"\n          }\n        }\n      },\n      \"resource-groups\" : {\n        \"endpoints\" : {\n          \"us-iso-east-1\" : { },\n          \"us-iso-west-1\" : { }\n        }\n      },\n      \"route53\" : {\n        \"endpoints\" : {\n          \"aws-iso-global\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-iso-east-1\"\n            },\n            \"hostname\" : \"route53.c2s.ic.gov\"\n          }\n        },\n        \"isRegionalized\" : false,\n        \"partitionEndpoint\" : \"aws-iso-global\"\n      },\n      \"route53resolver\" : {\n        \"endpoints\" : {\n          \"us-iso-east-1\" : { },\n          \"us-iso-west-1\" : { }\n        }\n      },\n      \"runtime.sagemaker\" : {\n        \"endpoints\" : {\n          \"us-iso-east-1\" : { }\n        }\n      },\n      \"s3\" : {\n        \"defaults\" : {\n          \"signatureVersions\" : [ \"s3v4\" ]\n        },\n        \"endpoints\" : {\n          \"fips-us-iso-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-iso-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"s3-fips.us-iso-east-1.c2s.ic.gov\"\n          },\n          \"fips-us-iso-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-iso-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"s3-fips.us-iso-west-1.c2s.ic.gov\"\n          },\n          \"us-iso-east-1\" : {\n            \"protocols\" : [ \"http\", \"https\" ],\n            \"signatureVersions\" : [ \"s3v4\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"s3-fips.dualstack.us-iso-east-1.c2s.ic.gov\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"s3-fips.us-iso-east-1.c2s.ic.gov\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-iso-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"s3-fips.dualstack.us-iso-west-1.c2s.ic.gov\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"s3-fips.us-iso-west-1.c2s.ic.gov\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"s3-control\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"https\" ],\n          \"signatureVersions\" : [ \"s3v4\" ]\n        },\n        \"endpoints\" : {\n          \"us-iso-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-iso-east-1\"\n            },\n            \"hostname\" : \"s3-control.us-iso-east-1.c2s.ic.gov\",\n            \"signatureVersions\" : [ \"s3v4\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"s3-control-fips.dualstack.us-iso-east-1.c2s.ic.gov\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"s3-control-fips.us-iso-east-1.c2s.ic.gov\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"s3-control.dualstack.us-iso-east-1.c2s.ic.gov\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-iso-east-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-iso-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"s3-control-fips.us-iso-east-1.c2s.ic.gov\",\n            \"signatureVersions\" : [ \"s3v4\" ]\n          },\n          \"us-iso-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-iso-west-1\"\n            },\n            \"hostname\" : \"s3-control.us-iso-west-1.c2s.ic.gov\",\n            \"signatureVersions\" : [ \"s3v4\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"s3-control-fips.dualstack.us-iso-west-1.c2s.ic.gov\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"s3-control-fips.us-iso-west-1.c2s.ic.gov\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"s3-control.dualstack.us-iso-west-1.c2s.ic.gov\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-iso-west-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-iso-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"s3-control-fips.us-iso-west-1.c2s.ic.gov\",\n            \"signatureVersions\" : [ \"s3v4\" ]\n          }\n        }\n      },\n      \"s3-outposts\" : {\n        \"endpoints\" : {\n          \"fips-us-iso-east-1\" : {\n            \"deprecated\" : true\n          },\n          \"us-iso-east-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"scheduler\" : {\n        \"endpoints\" : {\n          \"us-iso-east-1\" : { },\n          \"us-iso-west-1\" : { }\n        }\n      },\n      \"secretsmanager\" : {\n        \"endpoints\" : {\n          \"us-iso-east-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-iso-east-1-fips\" : {\n            \"deprecated\" : true\n          },\n          \"us-iso-west-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-iso-west-1-fips\" : {\n            \"deprecated\" : true\n          }\n        }\n      },\n      \"securityhub\" : {\n        \"endpoints\" : {\n          \"us-iso-east-1\" : { },\n          \"us-iso-west-1\" : { }\n        }\n      },\n      \"servicediscovery\" : {\n        \"endpoints\" : {\n          \"us-iso-east-1\" : { },\n          \"us-iso-west-1\" : { }\n        }\n      },\n      \"servicequotas\" : {\n        \"endpoints\" : {\n          \"us-iso-east-1\" : { },\n          \"us-iso-west-1\" : { }\n        }\n      },\n      \"snowball\" : {\n        \"endpoints\" : {\n          \"us-iso-east-1\" : { },\n          \"us-iso-west-1\" : { }\n        }\n      },\n      \"sns\" : {\n        \"endpoints\" : {\n          \"us-iso-east-1\" : {\n            \"protocols\" : [ \"http\", \"https\" ]\n          },\n          \"us-iso-west-1\" : { }\n        }\n      },\n      \"sqs\" : {\n        \"endpoints\" : {\n          \"fips-us-iso-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-iso-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"sqs.us-iso-east-1.c2s.ic.gov\"\n          },\n          \"fips-us-iso-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-iso-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"sqs.us-iso-west-1.c2s.ic.gov\"\n          },\n          \"us-iso-east-1\" : {\n            \"protocols\" : [ \"http\", \"https\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"sqs.us-iso-east-1.c2s.ic.gov\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-iso-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sqs.us-iso-west-1.c2s.ic.gov\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"ssm\" : {\n        \"endpoints\" : {\n          \"us-iso-east-1\" : { },\n          \"us-iso-west-1\" : { }\n        }\n      },\n      \"states\" : {\n        \"endpoints\" : {\n          \"fips-us-iso-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-iso-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"states-fips.us-iso-east-1.c2s.ic.gov\"\n          },\n          \"fips-us-iso-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-iso-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"states-fips.us-iso-west-1.c2s.ic.gov\"\n          },\n          \"us-iso-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"states-fips.us-iso-east-1.c2s.ic.gov\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-iso-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"states-fips.us-iso-west-1.c2s.ic.gov\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"storagegateway\" : {\n        \"endpoints\" : {\n          \"us-iso-east-1\" : { },\n          \"us-iso-west-1\" : { }\n        }\n      },\n      \"streams.dynamodb\" : {\n        \"defaults\" : {\n          \"credentialScope\" : {\n            \"service\" : \"dynamodb\"\n          }\n        },\n        \"endpoints\" : {\n          \"us-iso-east-1\" : { },\n          \"us-iso-west-1\" : { }\n        }\n      },\n      \"sts\" : {\n        \"endpoints\" : {\n          \"us-iso-east-1\" : { },\n          \"us-iso-west-1\" : { }\n        }\n      },\n      \"support\" : {\n        \"endpoints\" : {\n          \"aws-iso-global\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-iso-east-1\"\n            },\n            \"hostname\" : \"support.us-iso-east-1.c2s.ic.gov\"\n          }\n        },\n        \"partitionEndpoint\" : \"aws-iso-global\"\n      },\n      \"swf\" : {\n        \"endpoints\" : {\n          \"fips-us-iso-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-iso-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"swf-fips.us-iso-east-1.c2s.ic.gov\"\n          },\n          \"fips-us-iso-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-iso-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"swf-fips.us-iso-west-1.c2s.ic.gov\"\n          },\n          \"us-iso-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"swf-fips.us-iso-east-1.c2s.ic.gov\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-iso-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"swf-fips.us-iso-west-1.c2s.ic.gov\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"synthetics\" : {\n        \"endpoints\" : {\n          \"us-iso-east-1\" : { },\n          \"us-iso-west-1\" : { }\n        }\n      },\n      \"tagging\" : {\n        \"endpoints\" : {\n          \"us-iso-east-1\" : { },\n          \"us-iso-west-1\" : { }\n        }\n      },\n      \"textract\" : {\n        \"endpoints\" : {\n          \"us-iso-east-1\" : { }\n        }\n      },\n      \"transcribe\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"https\" ]\n        },\n        \"endpoints\" : {\n          \"fips-us-iso-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-iso-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"fips.transcribe.us-iso-east-1.c2s.ic.gov\"\n          },\n          \"us-iso-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"fips.transcribe.us-iso-east-1.c2s.ic.gov\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"transcribestreaming\" : {\n        \"endpoints\" : {\n          \"us-iso-east-1\" : { }\n        }\n      },\n      \"translate\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"https\" ]\n        },\n        \"endpoints\" : {\n          \"us-iso-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"translate-fips.us-iso-east-1.c2s.ic.gov\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-iso-east-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-iso-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"translate-fips.us-iso-east-1.c2s.ic.gov\"\n          }\n        }\n      },\n      \"wafv2\" : {\n        \"endpoints\" : {\n          \"us-iso-east-1\" : { }\n        }\n      },\n      \"workspaces\" : {\n        \"endpoints\" : {\n          \"fips-us-iso-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-iso-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"workspaces-fips.us-iso-east-1.c2s.ic.gov\"\n          },\n          \"fips-us-iso-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-iso-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"workspaces-fips.us-iso-west-1.c2s.ic.gov\"\n          },\n          \"us-iso-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"workspaces-fips.us-iso-east-1.c2s.ic.gov\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-iso-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"workspaces-fips.us-iso-west-1.c2s.ic.gov\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"xray\" : {\n        \"endpoints\" : {\n          \"us-iso-east-1\" : { },\n          \"us-iso-west-1\" : { }\n        }\n      }\n    }\n  }, {\n    \"defaults\" : {\n      \"hostname\" : \"{service}.{region}.{dnsSuffix}\",\n      \"protocols\" : [ \"https\" ],\n      \"signatureVersions\" : [ \"v4\" ],\n      \"variants\" : [ {\n        \"dnsSuffix\" : \"sc2s.sgov.gov\",\n        \"hostname\" : \"{service}-fips.{region}.{dnsSuffix}\",\n        \"tags\" : [ \"fips\" ]\n      } ]\n    },\n    \"dnsSuffix\" : \"sc2s.sgov.gov\",\n    \"partition\" : \"aws-iso-b\",\n    \"partitionName\" : \"AWS ISOB (US)\",\n    \"regionRegex\" : \"^us\\\\-isob\\\\-\\\\w+\\\\-\\\\d+$\",\n    \"regions\" : {\n      \"us-isob-east-1\" : {\n        \"description\" : \"US ISOB East (Ohio)\"\n      }\n    },\n    \"services\" : {\n      \"api.ecr\" : {\n        \"endpoints\" : {\n          \"us-isob-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-isob-east-1\"\n            },\n            \"hostname\" : \"api.ecr.us-isob-east-1.sc2s.sgov.gov\"\n          }\n        }\n      },\n      \"api.pricing\" : {\n        \"defaults\" : {\n          \"credentialScope\" : {\n            \"service\" : \"pricing\"\n          }\n        },\n        \"endpoints\" : {\n          \"us-isob-east-1\" : { }\n        }\n      },\n      \"api.sagemaker\" : {\n        \"endpoints\" : {\n          \"us-isob-east-1\" : { }\n        }\n      },\n      \"apigateway\" : {\n        \"endpoints\" : {\n          \"us-isob-east-1\" : { }\n        }\n      },\n      \"appconfig\" : {\n        \"endpoints\" : {\n          \"us-isob-east-1\" : { }\n        }\n      },\n      \"appconfigdata\" : {\n        \"endpoints\" : {\n          \"us-isob-east-1\" : { }\n        }\n      },\n      \"application-autoscaling\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"http\", \"https\" ]\n        },\n        \"endpoints\" : {\n          \"us-isob-east-1\" : { }\n        }\n      },\n      \"arc-zonal-shift\" : {\n        \"endpoints\" : {\n          \"us-isob-east-1\" : { }\n        }\n      },\n      \"athena\" : {\n        \"endpoints\" : {\n          \"us-isob-east-1\" : { }\n        }\n      },\n      \"autoscaling\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"http\", \"https\" ]\n        },\n        \"endpoints\" : {\n          \"us-isob-east-1\" : { }\n        }\n      },\n      \"backup\" : {\n        \"endpoints\" : {\n          \"us-isob-east-1\" : { }\n        }\n      },\n      \"batch\" : {\n        \"endpoints\" : {\n          \"us-isob-east-1\" : { }\n        }\n      },\n      \"budgets\" : {\n        \"endpoints\" : {\n          \"aws-iso-b-global\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-isob-east-1\"\n            },\n            \"hostname\" : \"budgets.global.sc2s.sgov.gov\"\n          },\n          \"us-isob-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-isob-east-1\"\n            },\n            \"hostname\" : \"budgets.global.sc2s.sgov.gov\"\n          }\n        },\n        \"isRegionalized\" : false,\n        \"partitionEndpoint\" : \"aws-iso-b-global\"\n      },\n      \"ce\" : {\n        \"endpoints\" : {\n          \"aws-iso-b-global\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-isob-east-1\"\n            },\n            \"hostname\" : \"ce.us-isob-east-1.sc2s.sgov.gov\"\n          }\n        },\n        \"isRegionalized\" : false,\n        \"partitionEndpoint\" : \"aws-iso-b-global\"\n      },\n      \"cloudcontrolapi\" : {\n        \"endpoints\" : {\n          \"us-isob-east-1\" : { }\n        }\n      },\n      \"cloudformation\" : {\n        \"endpoints\" : {\n          \"us-isob-east-1\" : { }\n        }\n      },\n      \"cloudtrail\" : {\n        \"endpoints\" : {\n          \"fips-us-isob-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-isob-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"cloudtrail-fips.us-isob-east-1.sc2s.sgov.gov\"\n          },\n          \"us-isob-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"cloudtrail-fips.us-isob-east-1.sc2s.sgov.gov\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"codebuild\" : {\n        \"endpoints\" : {\n          \"us-isob-east-1\" : { }\n        }\n      },\n      \"codedeploy\" : {\n        \"endpoints\" : {\n          \"us-isob-east-1\" : { }\n        }\n      },\n      \"config\" : {\n        \"endpoints\" : {\n          \"fips-us-isob-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-isob-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"config-fips.us-isob-east-1.sc2s.sgov.gov\"\n          },\n          \"us-isob-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"config-fips.us-isob-east-1.sc2s.sgov.gov\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"datasync\" : {\n        \"endpoints\" : {\n          \"us-isob-east-1\" : { }\n        }\n      },\n      \"directconnect\" : {\n        \"endpoints\" : {\n          \"us-isob-east-1\" : { }\n        }\n      },\n      \"dlm\" : {\n        \"endpoints\" : {\n          \"us-isob-east-1\" : { }\n        }\n      },\n      \"dms\" : {\n        \"defaults\" : {\n          \"variants\" : [ {\n            \"hostname\" : \"dms.{region}.{dnsSuffix}\",\n            \"tags\" : [ \"fips\" ]\n          } ]\n        },\n        \"endpoints\" : {\n          \"dms\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-isob-east-1\"\n            },\n            \"deprecated\" : true,\n            \"variants\" : [ {\n              \"hostname\" : \"dms.us-isob-east-1.sc2s.sgov.gov\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"dms-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-isob-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"dms.us-isob-east-1.sc2s.sgov.gov\"\n          },\n          \"us-isob-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"dms.us-isob-east-1.sc2s.sgov.gov\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-isob-east-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-isob-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"dms.us-isob-east-1.sc2s.sgov.gov\"\n          }\n        }\n      },\n      \"ds\" : {\n        \"endpoints\" : {\n          \"fips-us-isob-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-isob-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"ds-fips.us-isob-east-1.sc2s.sgov.gov\"\n          },\n          \"us-isob-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"ds-fips.us-isob-east-1.sc2s.sgov.gov\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"dynamodb\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"http\", \"https\" ]\n        },\n        \"endpoints\" : {\n          \"us-isob-east-1\" : { }\n        }\n      },\n      \"ebs\" : {\n        \"endpoints\" : {\n          \"us-isob-east-1\" : { }\n        }\n      },\n      \"ec2\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"http\", \"https\" ]\n        },\n        \"endpoints\" : {\n          \"us-isob-east-1\" : { }\n        }\n      },\n      \"ecs\" : {\n        \"endpoints\" : {\n          \"us-isob-east-1\" : { }\n        }\n      },\n      \"eks\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"http\", \"https\" ]\n        },\n        \"endpoints\" : {\n          \"us-isob-east-1\" : { }\n        }\n      },\n      \"elasticache\" : {\n        \"endpoints\" : {\n          \"us-isob-east-1\" : { }\n        }\n      },\n      \"elasticfilesystem\" : {\n        \"endpoints\" : {\n          \"fips-us-isob-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-isob-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"elasticfilesystem-fips.us-isob-east-1.sc2s.sgov.gov\"\n          },\n          \"us-isob-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticfilesystem-fips.us-isob-east-1.sc2s.sgov.gov\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"elasticloadbalancing\" : {\n        \"endpoints\" : {\n          \"us-isob-east-1\" : {\n            \"protocols\" : [ \"https\" ]\n          }\n        }\n      },\n      \"elasticmapreduce\" : {\n        \"endpoints\" : {\n          \"fips-us-isob-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-isob-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"elasticmapreduce.us-isob-east-1.sc2s.sgov.gov\"\n          },\n          \"us-isob-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticmapreduce.us-isob-east-1.sc2s.sgov.gov\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"es\" : {\n        \"endpoints\" : {\n          \"us-isob-east-1\" : { }\n        }\n      },\n      \"events\" : {\n        \"endpoints\" : {\n          \"us-isob-east-1\" : { }\n        }\n      },\n      \"firehose\" : {\n        \"endpoints\" : {\n          \"us-isob-east-1\" : { }\n        }\n      },\n      \"fsx\" : {\n        \"endpoints\" : {\n          \"us-isob-east-1\" : { }\n        }\n      },\n      \"glacier\" : {\n        \"endpoints\" : {\n          \"fips-us-isob-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-isob-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"glacier-fips.us-isob-east-1.sc2s.sgov.gov\"\n          },\n          \"us-isob-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"glacier-fips.us-isob-east-1.sc2s.sgov.gov\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"glue\" : {\n        \"endpoints\" : {\n          \"us-isob-east-1\" : { }\n        }\n      },\n      \"guardduty\" : {\n        \"endpoints\" : {\n          \"us-isob-east-1\" : { }\n        }\n      },\n      \"health\" : {\n        \"endpoints\" : {\n          \"us-isob-east-1\" : { }\n        }\n      },\n      \"iam\" : {\n        \"endpoints\" : {\n          \"aws-iso-b-global\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-isob-east-1\"\n            },\n            \"hostname\" : \"iam.us-isob-east-1.sc2s.sgov.gov\"\n          }\n        },\n        \"isRegionalized\" : false,\n        \"partitionEndpoint\" : \"aws-iso-b-global\"\n      },\n      \"kinesis\" : {\n        \"endpoints\" : {\n          \"us-isob-east-1\" : { }\n        }\n      },\n      \"kinesisanalytics\" : {\n        \"endpoints\" : {\n          \"us-isob-east-1\" : { }\n        }\n      },\n      \"kms\" : {\n        \"endpoints\" : {\n          \"ProdFips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-isob-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"kms-fips.us-isob-east-1.sc2s.sgov.gov\"\n          },\n          \"us-isob-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"kms-fips.us-isob-east-1.sc2s.sgov.gov\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-isob-east-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-isob-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"kms-fips.us-isob-east-1.sc2s.sgov.gov\"\n          }\n        }\n      },\n      \"lakeformation\" : {\n        \"endpoints\" : {\n          \"us-isob-east-1\" : { }\n        }\n      },\n      \"lambda\" : {\n        \"endpoints\" : {\n          \"us-isob-east-1\" : { }\n        }\n      },\n      \"license-manager\" : {\n        \"endpoints\" : {\n          \"us-isob-east-1\" : { }\n        }\n      },\n      \"logs\" : {\n        \"endpoints\" : {\n          \"us-isob-east-1\" : { }\n        }\n      },\n      \"medialive\" : {\n        \"endpoints\" : {\n          \"fips-us-isob-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-isob-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"medialive-fips.us-isob-east-1.sc2s.sgov.gov\"\n          },\n          \"us-isob-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"medialive-fips.us-isob-east-1.sc2s.sgov.gov\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"mediapackage\" : {\n        \"endpoints\" : {\n          \"us-isob-east-1\" : { }\n        }\n      },\n      \"metering.marketplace\" : {\n        \"defaults\" : {\n          \"credentialScope\" : {\n            \"service\" : \"aws-marketplace\"\n          }\n        },\n        \"endpoints\" : {\n          \"us-isob-east-1\" : { }\n        }\n      },\n      \"metrics.sagemaker\" : {\n        \"endpoints\" : {\n          \"us-isob-east-1\" : { }\n        }\n      },\n      \"monitoring\" : {\n        \"endpoints\" : {\n          \"us-isob-east-1\" : { }\n        }\n      },\n      \"network-firewall\" : {\n        \"endpoints\" : {\n          \"us-isob-east-1\" : { }\n        }\n      },\n      \"oam\" : {\n        \"endpoints\" : {\n          \"us-isob-east-1\" : { }\n        }\n      },\n      \"organizations\" : {\n        \"endpoints\" : {\n          \"aws-iso-b-global\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-isob-east-1\"\n            },\n            \"hostname\" : \"organizations.us-isob-east-1.sc2s.sgov.gov\"\n          }\n        },\n        \"isRegionalized\" : false,\n        \"partitionEndpoint\" : \"aws-iso-b-global\"\n      },\n      \"outposts\" : {\n        \"endpoints\" : {\n          \"us-isob-east-1\" : { }\n        }\n      },\n      \"pi\" : {\n        \"endpoints\" : {\n          \"us-isob-east-1\" : { }\n        }\n      },\n      \"ram\" : {\n        \"endpoints\" : {\n          \"us-isob-east-1\" : { }\n        }\n      },\n      \"rbin\" : {\n        \"endpoints\" : {\n          \"fips-us-isob-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-isob-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"rbin-fips.us-isob-east-1.sc2s.sgov.gov\"\n          },\n          \"us-isob-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"rbin-fips.us-isob-east-1.sc2s.sgov.gov\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"rds\" : {\n        \"endpoints\" : {\n          \"rds.us-isob-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-isob-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"rds.us-isob-east-1.sc2s.sgov.gov\"\n          },\n          \"us-isob-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"rds.us-isob-east-1.sc2s.sgov.gov\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-isob-east-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-isob-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"rds.us-isob-east-1.sc2s.sgov.gov\"\n          }\n        }\n      },\n      \"redshift\" : {\n        \"endpoints\" : {\n          \"us-isob-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-isob-east-1\"\n            },\n            \"hostname\" : \"redshift.us-isob-east-1.sc2s.sgov.gov\"\n          }\n        }\n      },\n      \"resource-groups\" : {\n        \"endpoints\" : {\n          \"us-isob-east-1\" : { }\n        }\n      },\n      \"route53\" : {\n        \"endpoints\" : {\n          \"aws-iso-b-global\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-isob-east-1\"\n            },\n            \"hostname\" : \"route53.sc2s.sgov.gov\"\n          }\n        },\n        \"isRegionalized\" : false,\n        \"partitionEndpoint\" : \"aws-iso-b-global\"\n      },\n      \"route53resolver\" : {\n        \"endpoints\" : {\n          \"us-isob-east-1\" : { }\n        }\n      },\n      \"runtime.sagemaker\" : {\n        \"endpoints\" : {\n          \"us-isob-east-1\" : { }\n        }\n      },\n      \"s3\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"http\", \"https\" ],\n          \"signatureVersions\" : [ \"s3v4\" ]\n        },\n        \"endpoints\" : {\n          \"fips-us-isob-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-isob-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"s3-fips.us-isob-east-1.sc2s.sgov.gov\"\n          },\n          \"us-isob-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"s3-fips.dualstack.us-isob-east-1.sc2s.sgov.gov\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"s3-fips.us-isob-east-1.sc2s.sgov.gov\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"s3-control\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"https\" ],\n          \"signatureVersions\" : [ \"s3v4\" ]\n        },\n        \"endpoints\" : {\n          \"us-isob-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-isob-east-1\"\n            },\n            \"hostname\" : \"s3-control.us-isob-east-1.sc2s.sgov.gov\",\n            \"signatureVersions\" : [ \"s3v4\" ],\n            \"variants\" : [ {\n              \"hostname\" : \"s3-control-fips.dualstack.us-isob-east-1.sc2s.sgov.gov\",\n              \"tags\" : [ \"dualstack\", \"fips\" ]\n            }, {\n              \"hostname\" : \"s3-control-fips.us-isob-east-1.sc2s.sgov.gov\",\n              \"tags\" : [ \"fips\" ]\n            }, {\n              \"hostname\" : \"s3-control.dualstack.us-isob-east-1.sc2s.sgov.gov\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-isob-east-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-isob-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"s3-control-fips.us-isob-east-1.sc2s.sgov.gov\",\n            \"signatureVersions\" : [ \"s3v4\" ]\n          }\n        }\n      },\n      \"s3-outposts\" : {\n        \"endpoints\" : {\n          \"fips-us-isob-east-1\" : {\n            \"deprecated\" : true\n          },\n          \"us-isob-east-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"scheduler\" : {\n        \"endpoints\" : {\n          \"us-isob-east-1\" : { }\n        }\n      },\n      \"secretsmanager\" : {\n        \"endpoints\" : {\n          \"us-isob-east-1\" : {\n            \"variants\" : [ {\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-isob-east-1-fips\" : {\n            \"deprecated\" : true\n          }\n        }\n      },\n      \"securityhub\" : {\n        \"endpoints\" : {\n          \"us-isob-east-1\" : { }\n        }\n      },\n      \"servicediscovery\" : {\n        \"endpoints\" : {\n          \"us-isob-east-1\" : { }\n        }\n      },\n      \"servicequotas\" : {\n        \"endpoints\" : {\n          \"us-isob-east-1\" : { }\n        }\n      },\n      \"snowball\" : {\n        \"endpoints\" : {\n          \"us-isob-east-1\" : { }\n        }\n      },\n      \"sns\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"http\", \"https\" ]\n        },\n        \"endpoints\" : {\n          \"us-isob-east-1\" : { }\n        }\n      },\n      \"sqs\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"http\", \"https\" ],\n          \"sslCommonName\" : \"{region}.queue.{dnsSuffix}\"\n        },\n        \"endpoints\" : {\n          \"fips-us-isob-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-isob-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"sqs.us-isob-east-1.sc2s.sgov.gov\"\n          },\n          \"us-isob-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sqs.us-isob-east-1.sc2s.sgov.gov\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"ssm\" : {\n        \"endpoints\" : {\n          \"us-isob-east-1\" : { }\n        }\n      },\n      \"states\" : {\n        \"endpoints\" : {\n          \"fips-us-isob-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-isob-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"states-fips.us-isob-east-1.sc2s.sgov.gov\"\n          },\n          \"us-isob-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"states-fips.us-isob-east-1.sc2s.sgov.gov\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"storagegateway\" : {\n        \"endpoints\" : {\n          \"fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-isob-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"storagegateway-fips.us-isob-east-1.sc2s.sgov.gov\"\n          },\n          \"us-isob-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"storagegateway-fips.us-isob-east-1.sc2s.sgov.gov\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-isob-east-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-isob-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"storagegateway-fips.us-isob-east-1.sc2s.sgov.gov\"\n          }\n        }\n      },\n      \"streams.dynamodb\" : {\n        \"defaults\" : {\n          \"credentialScope\" : {\n            \"service\" : \"dynamodb\"\n          },\n          \"protocols\" : [ \"http\", \"https\" ]\n        },\n        \"endpoints\" : {\n          \"us-isob-east-1\" : { }\n        }\n      },\n      \"sts\" : {\n        \"endpoints\" : {\n          \"us-isob-east-1\" : { }\n        }\n      },\n      \"support\" : {\n        \"endpoints\" : {\n          \"aws-iso-b-global\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-isob-east-1\"\n            },\n            \"hostname\" : \"support.us-isob-east-1.sc2s.sgov.gov\"\n          }\n        },\n        \"partitionEndpoint\" : \"aws-iso-b-global\"\n      },\n      \"swf\" : {\n        \"endpoints\" : {\n          \"fips-us-isob-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-isob-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"swf-fips.us-isob-east-1.sc2s.sgov.gov\"\n          },\n          \"us-isob-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"swf-fips.us-isob-east-1.sc2s.sgov.gov\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"synthetics\" : {\n        \"endpoints\" : {\n          \"us-isob-east-1\" : { }\n        }\n      },\n      \"tagging\" : {\n        \"endpoints\" : {\n          \"us-isob-east-1\" : { }\n        }\n      },\n      \"wafv2\" : {\n        \"endpoints\" : {\n          \"us-isob-east-1\" : { }\n        }\n      },\n      \"workspaces\" : {\n        \"endpoints\" : {\n          \"fips-us-isob-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-isob-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"workspaces-fips.us-isob-east-1.sc2s.sgov.gov\"\n          },\n          \"us-isob-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"workspaces-fips.us-isob-east-1.sc2s.sgov.gov\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"xray\" : {\n        \"endpoints\" : {\n          \"us-isob-east-1\" : { }\n        }\n      }\n    }\n  }, {\n    \"defaults\" : {\n      \"hostname\" : \"{service}.{region}.{dnsSuffix}\",\n      \"protocols\" : [ \"https\" ],\n      \"signatureVersions\" : [ \"v4\" ],\n      \"variants\" : [ {\n        \"dnsSuffix\" : \"cloud.adc-e.uk\",\n        \"hostname\" : \"{service}-fips.{region}.{dnsSuffix}\",\n        \"tags\" : [ \"fips\" ]\n      } ]\n    },\n    \"dnsSuffix\" : \"cloud.adc-e.uk\",\n    \"partition\" : \"aws-iso-e\",\n    \"partitionName\" : \"AWS ISOE (Europe)\",\n    \"regionRegex\" : \"^eu\\\\-isoe\\\\-\\\\w+\\\\-\\\\d+$\",\n    \"regions\" : {\n      \"eu-isoe-west-1\" : {\n        \"description\" : \"EU ISOE West\"\n      }\n    },\n    \"services\" : {\n      \"access-analyzer\" : {\n        \"endpoints\" : {\n          \"eu-isoe-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"access-analyzer.eu-isoe-west-1.api.cloud-aws.adc-e.uk\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"acm\" : {\n        \"endpoints\" : {\n          \"eu-isoe-west-1\" : { }\n        }\n      },\n      \"acm-pca\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"https\" ]\n        },\n        \"endpoints\" : {\n          \"eu-isoe-west-1\" : { }\n        }\n      },\n      \"api.ecr\" : {\n        \"endpoints\" : {\n          \"eu-isoe-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-isoe-west-1\"\n            },\n            \"hostname\" : \"api.ecr.eu-isoe-west-1.cloud.adc-e.uk\"\n          }\n        }\n      },\n      \"api.pricing\" : {\n        \"defaults\" : {\n          \"credentialScope\" : {\n            \"service\" : \"pricing\"\n          }\n        },\n        \"endpoints\" : {\n          \"eu-isoe-west-1\" : { }\n        }\n      },\n      \"appconfig\" : {\n        \"endpoints\" : {\n          \"eu-isoe-west-1\" : { }\n        }\n      },\n      \"appconfigdata\" : {\n        \"endpoints\" : {\n          \"eu-isoe-west-1\" : { }\n        }\n      },\n      \"application-autoscaling\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"http\", \"https\" ]\n        },\n        \"endpoints\" : {\n          \"eu-isoe-west-1\" : { }\n        }\n      },\n      \"arc-zonal-shift\" : {\n        \"endpoints\" : {\n          \"eu-isoe-west-1\" : { }\n        }\n      },\n      \"athena\" : {\n        \"endpoints\" : {\n          \"eu-isoe-west-1\" : { }\n        }\n      },\n      \"autoscaling\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"http\", \"https\" ]\n        },\n        \"endpoints\" : {\n          \"eu-isoe-west-1\" : { }\n        }\n      },\n      \"batch\" : {\n        \"endpoints\" : {\n          \"eu-isoe-west-1\" : { }\n        }\n      },\n      \"budgets\" : {\n        \"endpoints\" : {\n          \"aws-iso-e-global\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-isoe-west-1\"\n            },\n            \"hostname\" : \"budgets.global.cloud.adc-e.uk\"\n          },\n          \"eu-isoe-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-isoe-west-1\"\n            },\n            \"hostname\" : \"budgets.global.cloud.adc-e.uk\"\n          }\n        },\n        \"isRegionalized\" : false,\n        \"partitionEndpoint\" : \"aws-iso-e-global\"\n      },\n      \"cloudcontrolapi\" : {\n        \"endpoints\" : {\n          \"eu-isoe-west-1\" : { }\n        }\n      },\n      \"cloudformation\" : {\n        \"endpoints\" : {\n          \"eu-isoe-west-1\" : { }\n        }\n      },\n      \"cloudtrail\" : {\n        \"endpoints\" : {\n          \"eu-isoe-west-1\" : { }\n        }\n      },\n      \"cloudtrail-data\" : {\n        \"endpoints\" : {\n          \"eu-isoe-west-1\" : { }\n        }\n      },\n      \"codedeploy\" : {\n        \"endpoints\" : {\n          \"eu-isoe-west-1\" : { }\n        }\n      },\n      \"compute-optimizer\" : {\n        \"endpoints\" : {\n          \"eu-isoe-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-isoe-west-1\"\n            },\n            \"hostname\" : \"compute-optimizer.eu-isoe-west-1.cloud.adc-e.uk\"\n          }\n        }\n      },\n      \"config\" : {\n        \"endpoints\" : {\n          \"eu-isoe-west-1\" : { }\n        }\n      },\n      \"cost-optimization-hub\" : {\n        \"endpoints\" : {\n          \"eu-isoe-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-isoe-west-1\"\n            },\n            \"hostname\" : \"cost-optimization-hub.eu-isoe-west-1.cloud.adc-e.uk\"\n          }\n        }\n      },\n      \"directconnect\" : {\n        \"endpoints\" : {\n          \"eu-isoe-west-1\" : { }\n        }\n      },\n      \"dlm\" : {\n        \"endpoints\" : {\n          \"eu-isoe-west-1\" : { }\n        }\n      },\n      \"dms\" : {\n        \"endpoints\" : {\n          \"eu-isoe-west-1\" : { }\n        }\n      },\n      \"ds\" : {\n        \"endpoints\" : {\n          \"eu-isoe-west-1\" : { }\n        }\n      },\n      \"dynamodb\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"http\", \"https\" ]\n        },\n        \"endpoints\" : {\n          \"eu-isoe-west-1\" : { }\n        }\n      },\n      \"ebs\" : {\n        \"endpoints\" : {\n          \"eu-isoe-west-1\" : { }\n        }\n      },\n      \"ec2\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"https\" ]\n        },\n        \"endpoints\" : {\n          \"eu-isoe-west-1\" : { }\n        }\n      },\n      \"ecs\" : {\n        \"endpoints\" : {\n          \"eu-isoe-west-1\" : { }\n        }\n      },\n      \"eks\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"http\", \"https\" ]\n        },\n        \"endpoints\" : {\n          \"eu-isoe-west-1\" : { }\n        }\n      },\n      \"elasticache\" : {\n        \"endpoints\" : {\n          \"eu-isoe-west-1\" : { }\n        }\n      },\n      \"elasticfilesystem\" : {\n        \"endpoints\" : {\n          \"eu-isoe-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticfilesystem-fips.eu-isoe-west-1.cloud.adc-e.uk\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"fips-eu-isoe-west-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-isoe-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"elasticfilesystem-fips.eu-isoe-west-1.cloud.adc-e.uk\"\n          }\n        }\n      },\n      \"elasticloadbalancing\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"https\" ]\n        },\n        \"endpoints\" : {\n          \"eu-isoe-west-1\" : { }\n        }\n      },\n      \"elasticmapreduce\" : {\n        \"endpoints\" : {\n          \"eu-isoe-west-1\" : { }\n        }\n      },\n      \"emr-serverless\" : {\n        \"endpoints\" : {\n          \"eu-isoe-west-1\" : { }\n        }\n      },\n      \"es\" : {\n        \"endpoints\" : {\n          \"eu-isoe-west-1\" : { }\n        }\n      },\n      \"events\" : {\n        \"endpoints\" : {\n          \"eu-isoe-west-1\" : { }\n        }\n      },\n      \"firehose\" : {\n        \"endpoints\" : {\n          \"eu-isoe-west-1\" : { }\n        }\n      },\n      \"glue\" : {\n        \"endpoints\" : {\n          \"eu-isoe-west-1\" : { }\n        }\n      },\n      \"kinesis\" : {\n        \"endpoints\" : {\n          \"eu-isoe-west-1\" : { }\n        }\n      },\n      \"kms\" : {\n        \"endpoints\" : {\n          \"ProdFips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-isoe-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"kms-fips.eu-isoe-west-1.cloud.adc-e.uk\"\n          },\n          \"eu-isoe-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"kms-fips.eu-isoe-west-1.cloud.adc-e.uk\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"eu-isoe-west-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-isoe-west-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"kms-fips.eu-isoe-west-1.cloud.adc-e.uk\"\n          }\n        }\n      },\n      \"lakeformation\" : {\n        \"endpoints\" : {\n          \"eu-isoe-west-1\" : { }\n        }\n      },\n      \"lambda\" : {\n        \"endpoints\" : {\n          \"eu-isoe-west-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"lambda.eu-isoe-west-1.api.cloud-aws.adc-e.uk\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"license-manager\" : {\n        \"endpoints\" : {\n          \"eu-isoe-west-1\" : { }\n        }\n      },\n      \"logs\" : {\n        \"endpoints\" : {\n          \"eu-isoe-west-1\" : { }\n        }\n      },\n      \"monitoring\" : {\n        \"endpoints\" : {\n          \"eu-isoe-west-1\" : { }\n        }\n      },\n      \"oam\" : {\n        \"endpoints\" : {\n          \"eu-isoe-west-1\" : { }\n        }\n      },\n      \"organizations\" : {\n        \"endpoints\" : {\n          \"aws-iso-e-global\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-isoe-west-1\"\n            },\n            \"hostname\" : \"organizations.eu-isoe-west-1.cloud.adc-e.uk\"\n          }\n        },\n        \"isRegionalized\" : false,\n        \"partitionEndpoint\" : \"aws-iso-e-global\"\n      },\n      \"pi\" : {\n        \"endpoints\" : {\n          \"eu-isoe-west-1\" : {\n            \"protocols\" : [ \"https\" ]\n          }\n        }\n      },\n      \"pipes\" : {\n        \"endpoints\" : {\n          \"eu-isoe-west-1\" : { }\n        }\n      },\n      \"ram\" : {\n        \"endpoints\" : {\n          \"eu-isoe-west-1\" : { }\n        }\n      },\n      \"rbin\" : {\n        \"endpoints\" : {\n          \"eu-isoe-west-1\" : { }\n        }\n      },\n      \"rds\" : {\n        \"endpoints\" : {\n          \"eu-isoe-west-1\" : { }\n        }\n      },\n      \"redshift\" : {\n        \"endpoints\" : {\n          \"eu-isoe-west-1\" : { }\n        }\n      },\n      \"redshift-serverless\" : {\n        \"endpoints\" : {\n          \"eu-isoe-west-1\" : { }\n        }\n      },\n      \"resource-groups\" : {\n        \"endpoints\" : {\n          \"eu-isoe-west-1\" : { }\n        }\n      },\n      \"route53\" : {\n        \"endpoints\" : {\n          \"aws-iso-e-global\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-isoe-west-1\"\n            },\n            \"hostname\" : \"route53.cloud.adc-e.uk\"\n          }\n        },\n        \"isRegionalized\" : false,\n        \"partitionEndpoint\" : \"aws-iso-e-global\"\n      },\n      \"route53profiles\" : {\n        \"endpoints\" : {\n          \"eu-isoe-west-1\" : { }\n        }\n      },\n      \"route53resolver\" : {\n        \"endpoints\" : {\n          \"eu-isoe-west-1\" : { }\n        }\n      },\n      \"s3\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"http\", \"https\" ],\n          \"signatureVersions\" : [ \"s3v4\" ]\n        },\n        \"endpoints\" : {\n          \"eu-isoe-west-1\" : { }\n        }\n      },\n      \"savingsplans\" : {\n        \"endpoints\" : {\n          \"aws-iso-e-global\" : {\n            \"credentialScope\" : {\n              \"region\" : \"eu-isoe-west-1\"\n            },\n            \"hostname\" : \"savingsplans.cloud.adc-e.uk\"\n          }\n        },\n        \"isRegionalized\" : false,\n        \"partitionEndpoint\" : \"aws-iso-e-global\"\n      },\n      \"scheduler\" : {\n        \"endpoints\" : {\n          \"eu-isoe-west-1\" : { }\n        }\n      },\n      \"schemas\" : {\n        \"endpoints\" : {\n          \"eu-isoe-west-1\" : { }\n        }\n      },\n      \"secretsmanager\" : {\n        \"endpoints\" : {\n          \"eu-isoe-west-1\" : { }\n        }\n      },\n      \"servicecatalog\" : {\n        \"endpoints\" : {\n          \"eu-isoe-west-1\" : { }\n        }\n      },\n      \"servicediscovery\" : {\n        \"endpoints\" : {\n          \"eu-isoe-west-1\" : { }\n        }\n      },\n      \"servicequotas\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"https\" ]\n        },\n        \"endpoints\" : {\n          \"eu-isoe-west-1\" : { }\n        }\n      },\n      \"sns\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"http\", \"https\" ]\n        },\n        \"endpoints\" : {\n          \"eu-isoe-west-1\" : { }\n        }\n      },\n      \"sqs\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"http\", \"https\" ],\n          \"sslCommonName\" : \"{region}.queue.{dnsSuffix}\"\n        },\n        \"endpoints\" : {\n          \"eu-isoe-west-1\" : { }\n        }\n      },\n      \"ssm\" : {\n        \"endpoints\" : {\n          \"eu-isoe-west-1\" : { }\n        }\n      },\n      \"states\" : {\n        \"endpoints\" : {\n          \"eu-isoe-west-1\" : { }\n        }\n      },\n      \"streams.dynamodb\" : {\n        \"defaults\" : {\n          \"credentialScope\" : {\n            \"service\" : \"dynamodb\"\n          },\n          \"protocols\" : [ \"http\", \"https\" ]\n        },\n        \"endpoints\" : {\n          \"eu-isoe-west-1\" : { }\n        }\n      },\n      \"sts\" : {\n        \"endpoints\" : {\n          \"eu-isoe-west-1\" : { }\n        }\n      },\n      \"swf\" : {\n        \"endpoints\" : {\n          \"eu-isoe-west-1\" : { }\n        }\n      },\n      \"synthetics\" : {\n        \"endpoints\" : {\n          \"eu-isoe-west-1\" : { }\n        }\n      },\n      \"tagging\" : {\n        \"endpoints\" : {\n          \"eu-isoe-west-1\" : { }\n        }\n      },\n      \"trustedadvisor\" : {\n        \"endpoints\" : {\n          \"eu-isoe-west-1\" : { }\n        }\n      },\n      \"xray\" : {\n        \"endpoints\" : {\n          \"eu-isoe-west-1\" : { }\n        }\n      }\n    }\n  }, {\n    \"defaults\" : {\n      \"hostname\" : \"{service}.{region}.{dnsSuffix}\",\n      \"protocols\" : [ \"https\" ],\n      \"signatureVersions\" : [ \"v4\" ],\n      \"variants\" : [ {\n        \"dnsSuffix\" : \"csp.hci.ic.gov\",\n        \"hostname\" : \"{service}-fips.{region}.{dnsSuffix}\",\n        \"tags\" : [ \"fips\" ]\n      } ]\n    },\n    \"dnsSuffix\" : \"csp.hci.ic.gov\",\n    \"partition\" : \"aws-iso-f\",\n    \"partitionName\" : \"AWS ISOF\",\n    \"regionRegex\" : \"^us\\\\-isof\\\\-\\\\w+\\\\-\\\\d+$\",\n    \"regions\" : {\n      \"us-isof-east-1\" : {\n        \"description\" : \"US ISOF EAST\"\n      },\n      \"us-isof-south-1\" : {\n        \"description\" : \"US ISOF SOUTH\"\n      }\n    },\n    \"services\" : {\n      \"access-analyzer\" : {\n        \"endpoints\" : {\n          \"us-isof-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"access-analyzer.us-isof-east-1.api.aws.hci.ic.gov\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-isof-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"access-analyzer.us-isof-south-1.api.aws.hci.ic.gov\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"acm\" : {\n        \"endpoints\" : {\n          \"us-isof-east-1\" : { },\n          \"us-isof-south-1\" : { }\n        }\n      },\n      \"acm-pca\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"https\" ]\n        },\n        \"endpoints\" : {\n          \"us-isof-east-1\" : { },\n          \"us-isof-south-1\" : { }\n        }\n      },\n      \"api.ecr\" : {\n        \"endpoints\" : {\n          \"us-isof-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-isof-east-1\"\n            },\n            \"hostname\" : \"api.ecr.us-isof-east-1.csp.hci.ic.gov\"\n          },\n          \"us-isof-south-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-isof-south-1\"\n            },\n            \"hostname\" : \"api.ecr.us-isof-south-1.csp.hci.ic.gov\"\n          }\n        }\n      },\n      \"api.pricing\" : {\n        \"defaults\" : {\n          \"credentialScope\" : {\n            \"service\" : \"pricing\"\n          }\n        },\n        \"endpoints\" : {\n          \"us-isof-south-1\" : { }\n        }\n      },\n      \"api.sagemaker\" : {\n        \"endpoints\" : {\n          \"us-isof-east-1\" : { },\n          \"us-isof-south-1\" : { }\n        }\n      },\n      \"appconfig\" : {\n        \"endpoints\" : {\n          \"us-isof-east-1\" : { },\n          \"us-isof-south-1\" : { }\n        }\n      },\n      \"appconfigdata\" : {\n        \"endpoints\" : {\n          \"us-isof-east-1\" : { },\n          \"us-isof-south-1\" : { }\n        }\n      },\n      \"application-autoscaling\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"http\", \"https\" ]\n        },\n        \"endpoints\" : {\n          \"us-isof-east-1\" : { },\n          \"us-isof-south-1\" : { }\n        }\n      },\n      \"arc-zonal-shift\" : {\n        \"endpoints\" : {\n          \"us-isof-east-1\" : { },\n          \"us-isof-south-1\" : { }\n        }\n      },\n      \"athena\" : {\n        \"endpoints\" : {\n          \"us-isof-east-1\" : { },\n          \"us-isof-south-1\" : { }\n        }\n      },\n      \"autoscaling\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"http\", \"https\" ]\n        },\n        \"endpoints\" : {\n          \"us-isof-east-1\" : { },\n          \"us-isof-south-1\" : { }\n        }\n      },\n      \"backup\" : {\n        \"endpoints\" : {\n          \"us-isof-east-1\" : { },\n          \"us-isof-south-1\" : { }\n        }\n      },\n      \"batch\" : {\n        \"endpoints\" : {\n          \"us-isof-east-1\" : { },\n          \"us-isof-south-1\" : { }\n        }\n      },\n      \"budgets\" : {\n        \"endpoints\" : {\n          \"aws-iso-f-global\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-isof-south-1\"\n            },\n            \"hostname\" : \"budgets.global.csp.hci.ic.gov\"\n          },\n          \"us-isof-south-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-isof-south-1\"\n            },\n            \"hostname\" : \"budgets.global.csp.hci.ic.gov\"\n          }\n        },\n        \"isRegionalized\" : false,\n        \"partitionEndpoint\" : \"aws-iso-f-global\"\n      },\n      \"ce\" : {\n        \"endpoints\" : {\n          \"aws-iso-f-global\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-isof-south-1\"\n            },\n            \"hostname\" : \"ce.us-isof-south-1.csp.hci.ic.gov\"\n          }\n        },\n        \"isRegionalized\" : false,\n        \"partitionEndpoint\" : \"aws-iso-f-global\"\n      },\n      \"cloudcontrolapi\" : {\n        \"endpoints\" : {\n          \"us-isof-east-1\" : { },\n          \"us-isof-south-1\" : { }\n        }\n      },\n      \"cloudformation\" : {\n        \"endpoints\" : {\n          \"us-isof-east-1\" : { },\n          \"us-isof-south-1\" : { }\n        }\n      },\n      \"cloudtrail\" : {\n        \"endpoints\" : {\n          \"us-isof-east-1\" : { },\n          \"us-isof-south-1\" : { }\n        }\n      },\n      \"cloudtrail-data\" : {\n        \"endpoints\" : {\n          \"us-isof-east-1\" : { },\n          \"us-isof-south-1\" : { }\n        }\n      },\n      \"codebuild\" : {\n        \"endpoints\" : {\n          \"us-isof-east-1\" : { },\n          \"us-isof-south-1\" : { }\n        }\n      },\n      \"codedeploy\" : {\n        \"endpoints\" : {\n          \"us-isof-east-1\" : { },\n          \"us-isof-south-1\" : { }\n        }\n      },\n      \"codepipeline\" : {\n        \"endpoints\" : {\n          \"us-isof-east-1\" : { },\n          \"us-isof-south-1\" : { }\n        }\n      },\n      \"comprehend\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"https\" ]\n        },\n        \"endpoints\" : {\n          \"us-isof-east-1\" : { },\n          \"us-isof-south-1\" : { }\n        }\n      },\n      \"compute-optimizer\" : {\n        \"endpoints\" : {\n          \"us-isof-east-1\" : { },\n          \"us-isof-south-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-isof-south-1\"\n            },\n            \"hostname\" : \"compute-optimizer.us-isof-south-1.csp.hci.ic.gov\"\n          }\n        }\n      },\n      \"config\" : {\n        \"endpoints\" : {\n          \"us-isof-east-1\" : { },\n          \"us-isof-south-1\" : { }\n        }\n      },\n      \"cost-optimization-hub\" : {\n        \"endpoints\" : {\n          \"us-isof-south-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-isof-south-1\"\n            },\n            \"hostname\" : \"cost-optimization-hub.us-isof-south-1.csp.hci.ic.gov\"\n          }\n        }\n      },\n      \"directconnect\" : {\n        \"endpoints\" : {\n          \"us-isof-east-1\" : { },\n          \"us-isof-south-1\" : { }\n        }\n      },\n      \"dlm\" : {\n        \"endpoints\" : {\n          \"us-isof-east-1\" : { },\n          \"us-isof-south-1\" : { }\n        }\n      },\n      \"dms\" : {\n        \"endpoints\" : {\n          \"dms\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-isof-east-1\"\n            },\n            \"deprecated\" : true,\n            \"variants\" : [ {\n              \"hostname\" : \"dms.us-isof-east-1.csp.hci.ic.gov\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"dms-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-isof-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"dms.us-isof-east-1.csp.hci.ic.gov\"\n          },\n          \"us-isof-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"dms.us-isof-east-1.csp.hci.ic.gov\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-isof-east-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-isof-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"dms.us-isof-east-1.csp.hci.ic.gov\"\n          },\n          \"us-isof-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"dms.us-isof-south-1.csp.hci.ic.gov\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-isof-south-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-isof-south-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"dms.us-isof-south-1.csp.hci.ic.gov\"\n          }\n        }\n      },\n      \"ds\" : {\n        \"endpoints\" : {\n          \"us-isof-east-1\" : { },\n          \"us-isof-south-1\" : { }\n        }\n      },\n      \"dynamodb\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"http\", \"https\" ]\n        },\n        \"endpoints\" : {\n          \"us-isof-east-1\" : { },\n          \"us-isof-south-1\" : { }\n        }\n      },\n      \"ebs\" : {\n        \"endpoints\" : {\n          \"us-isof-east-1\" : { },\n          \"us-isof-south-1\" : { }\n        }\n      },\n      \"ec2\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"https\" ]\n        },\n        \"endpoints\" : {\n          \"us-isof-east-1\" : { },\n          \"us-isof-south-1\" : { }\n        }\n      },\n      \"ecs\" : {\n        \"endpoints\" : {\n          \"us-isof-east-1\" : { },\n          \"us-isof-south-1\" : { }\n        }\n      },\n      \"eks\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"http\", \"https\" ]\n        },\n        \"endpoints\" : {\n          \"us-isof-east-1\" : { },\n          \"us-isof-south-1\" : { }\n        }\n      },\n      \"elasticache\" : {\n        \"endpoints\" : {\n          \"us-isof-east-1\" : { },\n          \"us-isof-south-1\" : { }\n        }\n      },\n      \"elasticfilesystem\" : {\n        \"endpoints\" : {\n          \"fips-us-isof-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-isof-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"elasticfilesystem-fips.us-isof-east-1.csp.hci.ic.gov\"\n          },\n          \"fips-us-isof-south-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-isof-south-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"elasticfilesystem-fips.us-isof-south-1.csp.hci.ic.gov\"\n          },\n          \"us-isof-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticfilesystem-fips.us-isof-east-1.csp.hci.ic.gov\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-isof-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"elasticfilesystem-fips.us-isof-south-1.csp.hci.ic.gov\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"elasticloadbalancing\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"https\" ]\n        },\n        \"endpoints\" : {\n          \"us-isof-east-1\" : { },\n          \"us-isof-south-1\" : { }\n        }\n      },\n      \"elasticmapreduce\" : {\n        \"endpoints\" : {\n          \"us-isof-east-1\" : { },\n          \"us-isof-south-1\" : { }\n        }\n      },\n      \"es\" : {\n        \"endpoints\" : {\n          \"us-isof-east-1\" : { },\n          \"us-isof-south-1\" : { }\n        }\n      },\n      \"events\" : {\n        \"endpoints\" : {\n          \"us-isof-east-1\" : { },\n          \"us-isof-south-1\" : { }\n        }\n      },\n      \"firehose\" : {\n        \"endpoints\" : {\n          \"us-isof-east-1\" : { },\n          \"us-isof-south-1\" : { }\n        }\n      },\n      \"fsx\" : {\n        \"endpoints\" : {\n          \"us-isof-east-1\" : { },\n          \"us-isof-south-1\" : { }\n        }\n      },\n      \"glue\" : {\n        \"endpoints\" : {\n          \"us-isof-east-1\" : { },\n          \"us-isof-south-1\" : { }\n        }\n      },\n      \"guardduty\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"https\" ]\n        },\n        \"endpoints\" : {\n          \"us-isof-east-1\" : { },\n          \"us-isof-south-1\" : { }\n        },\n        \"isRegionalized\" : true\n      },\n      \"iam\" : {\n        \"endpoints\" : {\n          \"aws-iso-f-global\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-isof-south-1\"\n            },\n            \"hostname\" : \"iam.us-isof-south-1.csp.hci.ic.gov\"\n          }\n        },\n        \"isRegionalized\" : false,\n        \"partitionEndpoint\" : \"aws-iso-f-global\"\n      },\n      \"kinesis\" : {\n        \"endpoints\" : {\n          \"us-isof-east-1\" : { },\n          \"us-isof-south-1\" : { }\n        }\n      },\n      \"kms\" : {\n        \"endpoints\" : {\n          \"ProdFips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-isof-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"kms-fips.us-isof-east-1.csp.hci.ic.gov\"\n          },\n          \"us-isof-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"kms-fips.us-isof-east-1.csp.hci.ic.gov\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-isof-east-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-isof-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"kms-fips.us-isof-east-1.csp.hci.ic.gov\"\n          },\n          \"us-isof-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"kms-fips.us-isof-south-1.csp.hci.ic.gov\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-isof-south-1-fips\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-isof-south-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"kms-fips.us-isof-south-1.csp.hci.ic.gov\"\n          }\n        }\n      },\n      \"lakeformation\" : {\n        \"endpoints\" : {\n          \"us-isof-east-1\" : { },\n          \"us-isof-south-1\" : { }\n        }\n      },\n      \"lambda\" : {\n        \"endpoints\" : {\n          \"us-isof-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"lambda.us-isof-east-1.api.aws.hci.ic.gov\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          },\n          \"us-isof-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"lambda.us-isof-south-1.api.aws.hci.ic.gov\",\n              \"tags\" : [ \"dualstack\" ]\n            } ]\n          }\n        }\n      },\n      \"license-manager\" : {\n        \"endpoints\" : {\n          \"us-isof-east-1\" : { },\n          \"us-isof-south-1\" : { }\n        }\n      },\n      \"logs\" : {\n        \"endpoints\" : {\n          \"us-isof-east-1\" : { },\n          \"us-isof-south-1\" : { }\n        }\n      },\n      \"metrics.sagemaker\" : {\n        \"endpoints\" : {\n          \"us-isof-east-1\" : { },\n          \"us-isof-south-1\" : { }\n        }\n      },\n      \"monitoring\" : {\n        \"endpoints\" : {\n          \"us-isof-east-1\" : { },\n          \"us-isof-south-1\" : { }\n        }\n      },\n      \"oam\" : {\n        \"endpoints\" : {\n          \"us-isof-east-1\" : { },\n          \"us-isof-south-1\" : { }\n        }\n      },\n      \"organizations\" : {\n        \"endpoints\" : {\n          \"aws-iso-f-global\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-isof-south-1\"\n            },\n            \"hostname\" : \"organizations.us-isof-south-1.csp.hci.ic.gov\"\n          }\n        },\n        \"isRegionalized\" : false,\n        \"partitionEndpoint\" : \"aws-iso-f-global\"\n      },\n      \"pi\" : {\n        \"endpoints\" : {\n          \"us-isof-east-1\" : {\n            \"protocols\" : [ \"https\" ]\n          },\n          \"us-isof-south-1\" : {\n            \"protocols\" : [ \"https\" ]\n          }\n        }\n      },\n      \"pipes\" : {\n        \"endpoints\" : {\n          \"us-isof-east-1\" : { },\n          \"us-isof-south-1\" : { }\n        }\n      },\n      \"quicksight\" : {\n        \"endpoints\" : {\n          \"us-isof-east-1\" : { },\n          \"us-isof-south-1\" : { }\n        }\n      },\n      \"ram\" : {\n        \"endpoints\" : {\n          \"us-isof-east-1\" : { },\n          \"us-isof-south-1\" : { }\n        }\n      },\n      \"rbin\" : {\n        \"endpoints\" : {\n          \"us-isof-east-1\" : { },\n          \"us-isof-south-1\" : { }\n        }\n      },\n      \"rds\" : {\n        \"endpoints\" : {\n          \"us-isof-east-1\" : { },\n          \"us-isof-south-1\" : { }\n        }\n      },\n      \"redshift\" : {\n        \"endpoints\" : {\n          \"us-isof-east-1\" : { },\n          \"us-isof-south-1\" : { }\n        }\n      },\n      \"redshift-serverless\" : {\n        \"endpoints\" : {\n          \"us-isof-east-1\" : { },\n          \"us-isof-south-1\" : { }\n        }\n      },\n      \"rekognition\" : {\n        \"endpoints\" : {\n          \"us-isof-east-1\" : { },\n          \"us-isof-south-1\" : { }\n        }\n      },\n      \"resource-groups\" : {\n        \"endpoints\" : {\n          \"us-isof-east-1\" : { },\n          \"us-isof-south-1\" : { }\n        }\n      },\n      \"route53\" : {\n        \"endpoints\" : {\n          \"aws-iso-f-global\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-isof-south-1\"\n            },\n            \"hostname\" : \"route53.csp.hci.ic.gov\"\n          }\n        },\n        \"isRegionalized\" : false,\n        \"partitionEndpoint\" : \"aws-iso-f-global\"\n      },\n      \"route53profiles\" : {\n        \"endpoints\" : {\n          \"us-isof-east-1\" : { },\n          \"us-isof-south-1\" : { }\n        }\n      },\n      \"route53resolver\" : {\n        \"endpoints\" : {\n          \"us-isof-east-1\" : { },\n          \"us-isof-south-1\" : { }\n        }\n      },\n      \"runtime.sagemaker\" : {\n        \"endpoints\" : {\n          \"us-isof-east-1\" : { },\n          \"us-isof-south-1\" : { }\n        }\n      },\n      \"s3\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"http\", \"https\" ],\n          \"signatureVersions\" : [ \"s3v4\" ]\n        },\n        \"endpoints\" : {\n          \"us-isof-east-1\" : { },\n          \"us-isof-south-1\" : { }\n        }\n      },\n      \"savingsplans\" : {\n        \"endpoints\" : {\n          \"aws-iso-f-global\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-isof-south-1\"\n            },\n            \"hostname\" : \"savingsplans.csp.hci.ic.gov\"\n          }\n        },\n        \"isRegionalized\" : false,\n        \"partitionEndpoint\" : \"aws-iso-f-global\"\n      },\n      \"scheduler\" : {\n        \"endpoints\" : {\n          \"us-isof-east-1\" : { },\n          \"us-isof-south-1\" : { }\n        }\n      },\n      \"schemas\" : {\n        \"endpoints\" : {\n          \"us-isof-east-1\" : { },\n          \"us-isof-south-1\" : { }\n        }\n      },\n      \"secretsmanager\" : {\n        \"endpoints\" : {\n          \"us-isof-east-1\" : { },\n          \"us-isof-south-1\" : { }\n        }\n      },\n      \"servicediscovery\" : {\n        \"endpoints\" : {\n          \"us-isof-east-1\" : { },\n          \"us-isof-south-1\" : { }\n        }\n      },\n      \"servicequotas\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"https\" ]\n        },\n        \"endpoints\" : {\n          \"us-isof-east-1\" : { },\n          \"us-isof-south-1\" : { }\n        }\n      },\n      \"sns\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"http\", \"https\" ]\n        },\n        \"endpoints\" : {\n          \"us-isof-east-1\" : { },\n          \"us-isof-south-1\" : { }\n        }\n      },\n      \"sqs\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"http\", \"https\" ],\n          \"sslCommonName\" : \"{region}.queue.{dnsSuffix}\"\n        },\n        \"endpoints\" : {\n          \"fips-us-isof-east-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-isof-east-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"sqs.us-isof-east-1.csp.hci.ic.gov\"\n          },\n          \"fips-us-isof-south-1\" : {\n            \"credentialScope\" : {\n              \"region\" : \"us-isof-south-1\"\n            },\n            \"deprecated\" : true,\n            \"hostname\" : \"sqs.us-isof-south-1.csp.hci.ic.gov\"\n          },\n          \"us-isof-east-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sqs.us-isof-east-1.csp.hci.ic.gov\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          },\n          \"us-isof-south-1\" : {\n            \"variants\" : [ {\n              \"hostname\" : \"sqs.us-isof-south-1.csp.hci.ic.gov\",\n              \"tags\" : [ \"fips\" ]\n            } ]\n          }\n        }\n      },\n      \"ssm\" : {\n        \"endpoints\" : {\n          \"us-isof-east-1\" : { },\n          \"us-isof-south-1\" : { }\n        }\n      },\n      \"states\" : {\n        \"endpoints\" : {\n          \"us-isof-east-1\" : { },\n          \"us-isof-south-1\" : { }\n        }\n      },\n      \"streams.dynamodb\" : {\n        \"defaults\" : {\n          \"credentialScope\" : {\n            \"service\" : \"dynamodb\"\n          },\n          \"protocols\" : [ \"http\", \"https\" ]\n        },\n        \"endpoints\" : {\n          \"us-isof-east-1\" : { },\n          \"us-isof-south-1\" : { }\n        }\n      },\n      \"sts\" : {\n        \"endpoints\" : {\n          \"us-isof-east-1\" : { },\n          \"us-isof-south-1\" : { }\n        }\n      },\n      \"swf\" : {\n        \"endpoints\" : {\n          \"us-isof-east-1\" : { },\n          \"us-isof-south-1\" : { }\n        }\n      },\n      \"synthetics\" : {\n        \"endpoints\" : {\n          \"us-isof-east-1\" : { },\n          \"us-isof-south-1\" : { }\n        }\n      },\n      \"tagging\" : {\n        \"endpoints\" : {\n          \"us-isof-east-1\" : { },\n          \"us-isof-south-1\" : { }\n        }\n      },\n      \"textract\" : {\n        \"endpoints\" : {\n          \"us-isof-east-1\" : { },\n          \"us-isof-south-1\" : { }\n        }\n      },\n      \"transcribe\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"https\" ]\n        },\n        \"endpoints\" : {\n          \"us-isof-east-1\" : { },\n          \"us-isof-south-1\" : { }\n        }\n      },\n      \"transcribestreaming\" : {\n        \"endpoints\" : {\n          \"us-isof-east-1\" : { },\n          \"us-isof-south-1\" : { }\n        }\n      },\n      \"translate\" : {\n        \"defaults\" : {\n          \"protocols\" : [ \"https\" ]\n        },\n        \"endpoints\" : {\n          \"us-isof-east-1\" : { },\n          \"us-isof-south-1\" : { }\n        }\n      },\n      \"trustedadvisor\" : {\n        \"endpoints\" : {\n          \"us-isof-south-1\" : { }\n        }\n      },\n      \"xray\" : {\n        \"endpoints\" : {\n          \"us-isof-east-1\" : { },\n          \"us-isof-south-1\" : { }\n        }\n      }\n    }\n  }, {\n    \"defaults\" : {\n      \"hostname\" : \"{service}.{region}.{dnsSuffix}\",\n      \"protocols\" : [ \"https\" ],\n      \"signatureVersions\" : [ \"v4\" ],\n      \"variants\" : [ {\n        \"dnsSuffix\" : \"amazonaws.eu\",\n        \"hostname\" : \"{service}-fips.{region}.{dnsSuffix}\",\n        \"tags\" : [ \"fips\" ]\n      } ]\n    },\n    \"dnsSuffix\" : \"amazonaws.eu\",\n    \"partition\" : \"aws-eusc\",\n    \"partitionName\" : \"AWS EUSC\",\n    \"regionRegex\" : \"^eusc\\\\-(de)\\\\-\\\\w+\\\\-\\\\d+$\",\n    \"regions\" : {\n      \"eusc-de-east-1\" : {\n        \"description\" : \"EU (Germany)\"\n      }\n    },\n    \"services\" : { }\n  } ],\n  \"version\" : 3\n}\n"
  },
  {
    "path": "aws/sdk/aws-models/sdk-partitions.json",
    "content": "{\n  \"partitions\" : [ {\n    \"id\" : \"aws\",\n    \"outputs\" : {\n      \"dnsSuffix\" : \"amazonaws.com\",\n      \"dualStackDnsSuffix\" : \"api.aws\",\n      \"implicitGlobalRegion\" : \"us-east-1\",\n      \"name\" : \"aws\",\n      \"supportsDualStack\" : true,\n      \"supportsFIPS\" : true\n    },\n    \"regionRegex\" : \"^(us|eu|ap|sa|ca|me|af|il|mx)\\\\-\\\\w+\\\\-\\\\d+$\",\n    \"regions\" : {\n      \"af-south-1\" : {\n        \"description\" : \"Africa (Cape Town)\"\n      },\n      \"ap-east-1\" : {\n        \"description\" : \"Asia Pacific (Hong Kong)\"\n      },\n      \"ap-east-2\" : {\n        \"description\" : \"Asia Pacific (Taipei)\"\n      },\n      \"ap-northeast-1\" : {\n        \"description\" : \"Asia Pacific (Tokyo)\"\n      },\n      \"ap-northeast-2\" : {\n        \"description\" : \"Asia Pacific (Seoul)\"\n      },\n      \"ap-northeast-3\" : {\n        \"description\" : \"Asia Pacific (Osaka)\"\n      },\n      \"ap-south-1\" : {\n        \"description\" : \"Asia Pacific (Mumbai)\"\n      },\n      \"ap-south-2\" : {\n        \"description\" : \"Asia Pacific (Hyderabad)\"\n      },\n      \"ap-southeast-1\" : {\n        \"description\" : \"Asia Pacific (Singapore)\"\n      },\n      \"ap-southeast-2\" : {\n        \"description\" : \"Asia Pacific (Sydney)\"\n      },\n      \"ap-southeast-3\" : {\n        \"description\" : \"Asia Pacific (Jakarta)\"\n      },\n      \"ap-southeast-4\" : {\n        \"description\" : \"Asia Pacific (Melbourne)\"\n      },\n      \"ap-southeast-5\" : {\n        \"description\" : \"Asia Pacific (Malaysia)\"\n      },\n      \"ap-southeast-6\" : {\n        \"description\" : \"Asia Pacific (New Zealand)\"\n      },\n      \"ap-southeast-7\" : {\n        \"description\" : \"Asia Pacific (Thailand)\"\n      },\n      \"aws-global\" : {\n        \"description\" : \"aws global region\"\n      },\n      \"ca-central-1\" : {\n        \"description\" : \"Canada (Central)\"\n      },\n      \"ca-west-1\" : {\n        \"description\" : \"Canada West (Calgary)\"\n      },\n      \"eu-central-1\" : {\n        \"description\" : \"Europe (Frankfurt)\"\n      },\n      \"eu-central-2\" : {\n        \"description\" : \"Europe (Zurich)\"\n      },\n      \"eu-north-1\" : {\n        \"description\" : \"Europe (Stockholm)\"\n      },\n      \"eu-south-1\" : {\n        \"description\" : \"Europe (Milan)\"\n      },\n      \"eu-south-2\" : {\n        \"description\" : \"Europe (Spain)\"\n      },\n      \"eu-west-1\" : {\n        \"description\" : \"Europe (Ireland)\"\n      },\n      \"eu-west-2\" : {\n        \"description\" : \"Europe (London)\"\n      },\n      \"eu-west-3\" : {\n        \"description\" : \"Europe (Paris)\"\n      },\n      \"il-central-1\" : {\n        \"description\" : \"Israel (Tel Aviv)\"\n      },\n      \"me-central-1\" : {\n        \"description\" : \"Middle East (UAE)\"\n      },\n      \"me-south-1\" : {\n        \"description\" : \"Middle East (Bahrain)\"\n      },\n      \"mx-central-1\" : {\n        \"description\" : \"Mexico (Central)\"\n      },\n      \"sa-east-1\" : {\n        \"description\" : \"South America (Sao Paulo)\"\n      },\n      \"us-east-1\" : {\n        \"description\" : \"US East (N. Virginia)\"\n      },\n      \"us-east-2\" : {\n        \"description\" : \"US East (Ohio)\"\n      },\n      \"us-west-1\" : {\n        \"description\" : \"US West (N. California)\"\n      },\n      \"us-west-2\" : {\n        \"description\" : \"US West (Oregon)\"\n      }\n    }\n  }, {\n    \"id\" : \"aws-cn\",\n    \"outputs\" : {\n      \"dnsSuffix\" : \"amazonaws.com.cn\",\n      \"dualStackDnsSuffix\" : \"api.amazonwebservices.com.cn\",\n      \"implicitGlobalRegion\" : \"cn-northwest-1\",\n      \"name\" : \"aws-cn\",\n      \"supportsDualStack\" : true,\n      \"supportsFIPS\" : true\n    },\n    \"regionRegex\" : \"^cn\\\\-\\\\w+\\\\-\\\\d+$\",\n    \"regions\" : {\n      \"aws-cn-global\" : {\n        \"description\" : \"aws-cn global region\"\n      },\n      \"cn-north-1\" : {\n        \"description\" : \"China (Beijing)\"\n      },\n      \"cn-northwest-1\" : {\n        \"description\" : \"China (Ningxia)\"\n      }\n    }\n  }, {\n    \"id\" : \"aws-eusc\",\n    \"outputs\" : {\n      \"dnsSuffix\" : \"amazonaws.eu\",\n      \"dualStackDnsSuffix\" : \"api.amazonwebservices.eu\",\n      \"implicitGlobalRegion\" : \"eusc-de-east-1\",\n      \"name\" : \"aws-eusc\",\n      \"supportsDualStack\" : true,\n      \"supportsFIPS\" : true\n    },\n    \"regionRegex\" : \"^eusc\\\\-(de)\\\\-\\\\w+\\\\-\\\\d+$\",\n    \"regions\" : {\n      \"eusc-de-east-1\" : {\n        \"description\" : \"EU (Germany)\"\n      }\n    }\n  }, {\n    \"id\" : \"aws-iso\",\n    \"outputs\" : {\n      \"dnsSuffix\" : \"c2s.ic.gov\",\n      \"dualStackDnsSuffix\" : \"api.aws.ic.gov\",\n      \"implicitGlobalRegion\" : \"us-iso-east-1\",\n      \"name\" : \"aws-iso\",\n      \"supportsDualStack\" : true,\n      \"supportsFIPS\" : true\n    },\n    \"regionRegex\" : \"^us\\\\-iso\\\\-\\\\w+\\\\-\\\\d+$\",\n    \"regions\" : {\n      \"aws-iso-global\" : {\n        \"description\" : \"aws-iso global region\"\n      },\n      \"us-iso-east-1\" : {\n        \"description\" : \"US ISO East\"\n      },\n      \"us-iso-west-1\" : {\n        \"description\" : \"US ISO WEST\"\n      }\n    }\n  }, {\n    \"id\" : \"aws-iso-b\",\n    \"outputs\" : {\n      \"dnsSuffix\" : \"sc2s.sgov.gov\",\n      \"dualStackDnsSuffix\" : \"api.aws.scloud\",\n      \"implicitGlobalRegion\" : \"us-isob-east-1\",\n      \"name\" : \"aws-iso-b\",\n      \"supportsDualStack\" : true,\n      \"supportsFIPS\" : true\n    },\n    \"regionRegex\" : \"^us\\\\-isob\\\\-\\\\w+\\\\-\\\\d+$\",\n    \"regions\" : {\n      \"aws-iso-b-global\" : {\n        \"description\" : \"aws-iso-b global region\"\n      },\n      \"us-isob-east-1\" : {\n        \"description\" : \"US ISOB East (Ohio)\"\n      }\n    }\n  }, {\n    \"id\" : \"aws-iso-e\",\n    \"outputs\" : {\n      \"dnsSuffix\" : \"cloud.adc-e.uk\",\n      \"dualStackDnsSuffix\" : \"api.cloud-aws.adc-e.uk\",\n      \"implicitGlobalRegion\" : \"eu-isoe-west-1\",\n      \"name\" : \"aws-iso-e\",\n      \"supportsDualStack\" : true,\n      \"supportsFIPS\" : true\n    },\n    \"regionRegex\" : \"^eu\\\\-isoe\\\\-\\\\w+\\\\-\\\\d+$\",\n    \"regions\" : {\n      \"aws-iso-e-global\" : {\n        \"description\" : \"aws-iso-e global region\"\n      },\n      \"eu-isoe-west-1\" : {\n        \"description\" : \"EU ISOE West\"\n      }\n    }\n  }, {\n    \"id\" : \"aws-iso-f\",\n    \"outputs\" : {\n      \"dnsSuffix\" : \"csp.hci.ic.gov\",\n      \"dualStackDnsSuffix\" : \"api.aws.hci.ic.gov\",\n      \"implicitGlobalRegion\" : \"us-isof-south-1\",\n      \"name\" : \"aws-iso-f\",\n      \"supportsDualStack\" : true,\n      \"supportsFIPS\" : true\n    },\n    \"regionRegex\" : \"^us\\\\-isof\\\\-\\\\w+\\\\-\\\\d+$\",\n    \"regions\" : {\n      \"aws-iso-f-global\" : {\n        \"description\" : \"aws-iso-f global region\"\n      },\n      \"us-isof-east-1\" : {\n        \"description\" : \"US ISOF EAST\"\n      },\n      \"us-isof-south-1\" : {\n        \"description\" : \"US ISOF SOUTH\"\n      }\n    }\n  }, {\n    \"id\" : \"aws-us-gov\",\n    \"outputs\" : {\n      \"dnsSuffix\" : \"amazonaws.com\",\n      \"dualStackDnsSuffix\" : \"api.aws\",\n      \"implicitGlobalRegion\" : \"us-gov-west-1\",\n      \"name\" : \"aws-us-gov\",\n      \"supportsDualStack\" : true,\n      \"supportsFIPS\" : true\n    },\n    \"regionRegex\" : \"^us\\\\-gov\\\\-\\\\w+\\\\-\\\\d+$\",\n    \"regions\" : {\n      \"aws-us-gov-global\" : {\n        \"description\" : \"aws-us-gov global region\"\n      },\n      \"us-gov-east-1\" : {\n        \"description\" : \"AWS GovCloud (US-East)\"\n      },\n      \"us-gov-west-1\" : {\n        \"description\" : \"AWS GovCloud (US-West)\"\n      }\n    }\n  } ],\n  \"version\" : \"1.1\"\n}\n"
  },
  {
    "path": "aws/sdk/aws-models/signin.json",
    "content": "{\n    \"smithy\": \"2.0\",\n    \"shapes\": {\n        \"com.amazonaws.signin#AccessDeniedException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"error\": {\n                    \"target\": \"com.amazonaws.signin#OAuth2ErrorCode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"OAuth 2.0 error code indicating the specific type of access denial\\nCan be TOKEN_EXPIRED, AUTHCODE_EXPIRED, USER_CREDENTIALS_CHANGED, or INSUFFICIENT_PERMISSIONS\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"message\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"Detailed message explaining the access denial\\nProvides specific information about why access was denied\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"Error thrown for access denied scenarios with flexible HTTP status mapping\\n\\nRuntime HTTP Status Code Mapping:\\n- HTTP 401 (Unauthorized): TOKEN_EXPIRED, AUTHCODE_EXPIRED\\n- HTTP 403 (Forbidden): USER_CREDENTIALS_CHANGED, INSUFFICIENT_PERMISSIONS\\n\\nThe specific HTTP status code is determined at runtime based on the error enum value.\\nConsumers should use the error field to determine the specific access denial reason.\",\n                \"smithy.api#error\": \"client\"\n            }\n        },\n        \"com.amazonaws.signin#AccessToken\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"accessKeyId\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"AWS access key ID for temporary credentials\",\n                        \"smithy.api#jsonName\": \"accessKeyId\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"secretAccessKey\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"AWS secret access key for temporary credentials\",\n                        \"smithy.api#jsonName\": \"secretAccessKey\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"sessionToken\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"AWS session token for temporary credentials\",\n                        \"smithy.api#jsonName\": \"sessionToken\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"AWS credentials structure containing temporary access credentials\\n\\nThe scoped-down, 15 minute duration AWS credentials.\\nScoping down will be based on CLI policy (CLI team needs to create it).\\nSimilar to cloud shell implementation.\",\n                \"smithy.api#sensitive\": {}\n            }\n        },\n        \"com.amazonaws.signin#AuthorizationCode\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#documentation\": \"Authorization code received from AWS Sign-In /v1/authorize endpoint\\n\\nThe authorization code received from AWS Sign-In from /v1/authorize.\\nUsed in auth code redemption flow only.\",\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 512\n                }\n            }\n        },\n        \"com.amazonaws.signin#ClientId\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#documentation\": \"Client identifier pattern for AWS Sign-In devtools clients\\n\\nThe ARN used by client as part of Sign-In onboarding. Expected values:\\n- arn:aws:signin:::devtools/cross-device (for cross-device devtools login)\\n- arn:aws:signin:::devtools/same-device (for same-device devtools login)\\n\\nThis will be finalized after consulting with UX as this is visible to end customer.\",\n                \"smithy.api#pattern\": \"^arn:aws:signin:::devtools/(cross-device|same-device)$\"\n            }\n        },\n        \"com.amazonaws.signin#CodeVerifier\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#documentation\": \"PKCE code verifier for OAuth 2.0 security\\n\\nPKCE code verifier to prove possession of the original code challenge.\\nUsed to prevent authorization code interception attacks in public clients.\\nMust be 43-128 characters using unreserved characters [A-Z] / [a-z] / [0-9] / \\\"-\\\" / \\\".\\\" / \\\"_\\\" / \\\"~\\\"\",\n                \"smithy.api#length\": {\n                    \"min\": 43,\n                    \"max\": 128\n                },\n                \"smithy.api#pattern\": \"^[A-Za-z0-9\\\\-._~]+$\"\n            }\n        },\n        \"com.amazonaws.signin#CreateOAuth2Token\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.signin#CreateOAuth2TokenRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.signin#CreateOAuth2TokenResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.signin#AccessDeniedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.signin#InternalServerException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.signin#TooManyRequestsError\"\n                },\n                {\n                    \"target\": \"com.amazonaws.signin#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#auth\": [],\n                \"smithy.api#documentation\": \"CreateOAuth2Token API\\n\\nPath: /v1/token\\nRequest Method: POST\\nContent-Type: application/json or application/x-www-form-urlencoded\\n\\nThis API implements OAuth 2.0 flows for AWS Sign-In CLI clients, supporting both:\\n1. Authorization code redemption (grant_type=authorization_code) - NOT idempotent\\n2. Token refresh (grant_type=refresh_token) - Idempotent within token validity window\\n\\nThe operation behavior is determined by the grant_type parameter in the request body:\\n\\n**Authorization Code Flow (NOT Idempotent):**\\n- JSON or form-encoded body with client_id, grant_type=authorization_code, code, redirect_uri, code_verifier\\n- Returns access_token, token_type, expires_in, refresh_token, and id_token\\n- Each authorization code can only be used ONCE for security (prevents replay attacks)\\n\\n**Token Refresh Flow (Idempotent):**\\n- JSON or form-encoded body with client_id, grant_type=refresh_token, refresh_token\\n- Returns access_token, token_type, expires_in, and refresh_token (no id_token)\\n- Multiple calls with same refresh_token return consistent results within validity window\\n\\nAuthentication and authorization:\\n- Confidential clients: sigv4 signing required with signin:ExchangeToken permissions\\n- CLI clients (public): authn/authz skipped based on client_id & grant_type\\n\\nNote: This operation cannot be marked as @idempotent because it handles both idempotent\\n(token refresh) and non-idempotent (auth code redemption) flows in a single endpoint.\",\n                \"smithy.api#http\": {\n                    \"method\": \"POST\",\n                    \"uri\": \"/v1/token\"\n                },\n                \"smithy.test#smokeTests\": [\n                    {\n                        \"id\": \"TokenOperationSmokeTest\",\n                        \"params\": {\n                            \"tokenInput\": {\n                                \"clientId\": \"arn:aws:signin:::devtools/same-device\",\n                                \"grantType\": \"authorization_code\",\n                                \"code\": \"test-code\",\n                                \"redirectUri\": \"https://example.com\",\n                                \"codeVerifier\": \"test-code-verifier-1234567890abcdefghijklmnop\"\n                            }\n                        },\n                        \"vendorParamsShape\": \"aws.test#AwsVendorParams\",\n                        \"vendorParams\": {},\n                        \"expect\": {\n                            \"failure\": {}\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.signin#CreateOAuth2TokenRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"tokenInput\": {\n                    \"target\": \"com.amazonaws.signin#CreateOAuth2TokenRequestBody\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"Flattened token operation inputs\\nThe specific operation is determined by grant_type in the request body\",\n                        \"smithy.api#httpPayload\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"Input structure for CreateOAuth2Token operation\\n\\nContains flattened token operation inputs for both authorization code and refresh token flows.\\nThe operation type is determined by the grant_type parameter in the request body.\",\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.signin#CreateOAuth2TokenRequestBody\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"clientId\": {\n                    \"target\": \"com.amazonaws.signin#ClientId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"The client identifier (ARN) used during Sign-In onboarding\\nRequired for both authorization code and refresh token flows\",\n                        \"smithy.api#jsonName\": \"clientId\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"grantType\": {\n                    \"target\": \"com.amazonaws.signin#GrantType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"OAuth 2.0 grant type - determines which flow is used\\nMust be \\\"authorization_code\\\" or \\\"refresh_token\\\"\",\n                        \"smithy.api#jsonName\": \"grantType\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"code\": {\n                    \"target\": \"com.amazonaws.signin#AuthorizationCode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"The authorization code received from /v1/authorize\\nRequired only when grant_type=authorization_code\"\n                    }\n                },\n                \"redirectUri\": {\n                    \"target\": \"com.amazonaws.signin#RedirectUri\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"The redirect URI that must match the original authorization request\\nRequired only when grant_type=authorization_code\",\n                        \"smithy.api#jsonName\": \"redirectUri\"\n                    }\n                },\n                \"codeVerifier\": {\n                    \"target\": \"com.amazonaws.signin#CodeVerifier\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"PKCE code verifier to prove possession of the original code challenge\\nRequired only when grant_type=authorization_code\",\n                        \"smithy.api#jsonName\": \"codeVerifier\"\n                    }\n                },\n                \"refreshToken\": {\n                    \"target\": \"com.amazonaws.signin#RefreshToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"The refresh token returned from auth_code redemption\\nRequired only when grant_type=refresh_token\",\n                        \"smithy.api#jsonName\": \"refreshToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"Request body payload for CreateOAuth2Token operation\\n\\nThe operation type is determined by the grant_type parameter:\\n- grant_type=authorization_code: Requires code, redirect_uri, code_verifier\\n- grant_type=refresh_token: Requires refresh_token\"\n            }\n        },\n        \"com.amazonaws.signin#CreateOAuth2TokenResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"tokenOutput\": {\n                    \"target\": \"com.amazonaws.signin#CreateOAuth2TokenResponseBody\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"Flattened token operation outputs\\nThe specific response fields depend on the grant_type used in the request\",\n                        \"smithy.api#httpPayload\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"Output structure for CreateOAuth2Token operation\\n\\nContains flattened token operation outputs for both authorization code and refresh token flows.\\nThe response content depends on the grant_type from the original request.\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.signin#CreateOAuth2TokenResponseBody\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"accessToken\": {\n                    \"target\": \"com.amazonaws.signin#AccessToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"Scoped-down AWS credentials (15 minute duration)\\nPresent for both authorization code redemption and token refresh\",\n                        \"smithy.api#jsonName\": \"accessToken\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"tokenType\": {\n                    \"target\": \"com.amazonaws.signin#TokenType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"Token type indicating this is AWS SigV4 credentials\\nValue is \\\"aws_sigv4\\\" for both flows\",\n                        \"smithy.api#jsonName\": \"tokenType\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"expiresIn\": {\n                    \"target\": \"com.amazonaws.signin#ExpiresIn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"Time to expiry in seconds (maximum 900)\\nPresent for both authorization code redemption and token refresh\",\n                        \"smithy.api#jsonName\": \"expiresIn\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"refreshToken\": {\n                    \"target\": \"com.amazonaws.signin#RefreshToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"Encrypted refresh token with cnf.jkt (SHA-256 thumbprint of presented jwk)\\nAlways present in responses (required for both flows)\",\n                        \"smithy.api#jsonName\": \"refreshToken\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"idToken\": {\n                    \"target\": \"com.amazonaws.signin#IdToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"ID token containing user identity information\\nPresent only in authorization code redemption response (grant_type=authorization_code)\\nNot included in token refresh responses\",\n                        \"smithy.api#jsonName\": \"idToken\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"Response body payload for CreateOAuth2Token operation\\n\\nThe response content depends on the grant_type from the request:\\n- grant_type=authorization_code: Returns all fields including refresh_token and id_token\\n- grant_type=refresh_token: Returns access_token, token_type, expires_in, refresh_token (no id_token)\"\n            }\n        },\n        \"com.amazonaws.signin#ExpiresIn\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#documentation\": \"Time to expiry in seconds\\n\\nThe time to expiry in seconds, for these purposes will be at most 900 (15 minutes).\",\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 900\n                }\n            }\n        },\n        \"com.amazonaws.signin#GrantType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#documentation\": \"OAuth 2.0 grant type parameter\\n\\nFor auth code redemption: Must be \\\"authorization_code\\\"\\nFor token refresh: Must be \\\"refresh_token\\\"\\n\\nBased on client_id & grant_type, authn/authz is skipped for CLI endpoints.\",\n                \"smithy.api#pattern\": \"^(authorization_code|refresh_token)$\"\n            }\n        },\n        \"com.amazonaws.signin#IdToken\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#documentation\": \"ID token containing user identity information\\n\\nEncoded JWT token containing user identity claims and authentication context.\\nReturned only in authorization code redemption responses (grant_type=authorization_code).\\nContains user identity information such as ARN and other identity claims.\",\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 4096\n                }\n            }\n        },\n        \"com.amazonaws.signin#InternalServerException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"error\": {\n                    \"target\": \"com.amazonaws.signin#OAuth2ErrorCode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"OAuth 2.0 error code indicating server error\\nWill be SERVER_ERROR for internal server errors\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"message\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"Detailed message explaining the server error\\nMay include error details for debugging purposes\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"Error thrown when an internal server error occurs\\n\\nHTTP Status Code: 500 Internal Server Error\\n\\nUsed for unexpected server-side errors that prevent request processing.\",\n                \"smithy.api#error\": \"server\",\n                \"smithy.api#httpError\": 500\n            }\n        },\n        \"com.amazonaws.signin#OAuth2ErrorCode\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"TOKEN_EXPIRED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"Token has expired and needs to be refreshed\",\n                        \"smithy.api#enumValue\": \"TOKEN_EXPIRED\"\n                    }\n                },\n                \"USER_CREDENTIALS_CHANGED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"User credentials have been changed\",\n                        \"smithy.api#enumValue\": \"USER_CREDENTIALS_CHANGED\"\n                    }\n                },\n                \"INSUFFICIENT_PERMISSIONS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"Insufficient permissions to perform this operation\",\n                        \"smithy.api#enumValue\": \"INSUFFICIENT_PERMISSIONS\"\n                    }\n                },\n                \"AUTHCODE_EXPIRED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"Authorization code has expired\",\n                        \"smithy.api#enumValue\": \"AUTHCODE_EXPIRED\"\n                    }\n                },\n                \"SERVER_ERROR\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"Internal server error occurred\",\n                        \"smithy.api#enumValue\": \"server_error\"\n                    }\n                },\n                \"INVALID_REQUEST\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"The request is missing a required parameter, includes an invalid parameter value, or is otherwise malformed\",\n                        \"smithy.api#enumValue\": \"INVALID_REQUEST\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"OAuth 2.0 error codes returned by the server\\n\\nStandard OAuth 2.0 error codes used in error responses to indicate\\nthe specific type of error that occurred during token operations.\"\n            }\n        },\n        \"com.amazonaws.signin#RedirectUri\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#documentation\": \"Redirect URI for OAuth 2.0 flow validation\\n\\nThe same redirect URI used in the authorization request. This must match exactly\\nwhat was sent in the original authorization request for security validation.\",\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 2048\n                }\n            }\n        },\n        \"com.amazonaws.signin#RefreshToken\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#documentation\": \"Encrypted refresh token with cnf.jkt\\n\\nThis is the encrypted refresh token returned from auth code redemption.\\nThe token content includes cnf.jkt (SHA-256 thumbprint of the presented jwk).\\nUsed in subsequent token refresh requests.\",\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 2048\n                },\n                \"smithy.api#sensitive\": {}\n            }\n        },\n        \"com.amazonaws.signin#Signin\": {\n            \"type\": \"service\",\n            \"version\": \"2023-01-01\",\n            \"operations\": [\n                {\n                    \"target\": \"com.amazonaws.signin#CreateOAuth2Token\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#service\": {\n                    \"sdkId\": \"Signin\",\n                    \"arnNamespace\": \"signin\",\n                    \"endpointPrefix\": \"signin\"\n                },\n                \"aws.auth#sigv4\": {\n                    \"name\": \"signin\"\n                },\n                \"aws.endpoints#standardRegionalEndpoints\": {\n                    \"partitionSpecialCases\": {\n                        \"aws\": [\n                            {\n                                \"endpoint\": \"https://{region}.signin.aws.amazon.com\"\n                            }\n                        ],\n                        \"aws-cn\": [\n                            {\n                                \"endpoint\": \"https://{region}.signin.amazonaws.cn\"\n                            }\n                        ],\n                        \"aws-us-gov\": [\n                            {\n                                \"endpoint\": \"https://{region}.signin.amazonaws-us-gov.com\"\n                            }\n                        ]\n                    }\n                },\n                \"aws.protocols#restJson1\": {},\n                \"smithy.api#auth\": [\n                    \"aws.auth#sigv4\"\n                ],\n                \"smithy.api#documentation\": \"AWS Sign-In manages authentication for AWS services. This service provides\\nsecure authentication flows for accessing AWS resources from the console and developer tools.\",\n                \"smithy.api#title\": \"AWS Sign-In Service\",\n                \"smithy.rules#endpointRuleSet\": {\n                    \"version\": \"1.0\",\n                    \"parameters\": {\n                        \"UseDualStack\": {\n                            \"builtIn\": \"AWS::UseDualStack\",\n                            \"required\": true,\n                            \"default\": false,\n                            \"documentation\": \"When true, use the dual-stack endpoint. If the configured endpoint does not support dual-stack, dispatching the request MAY return an error.\",\n                            \"type\": \"boolean\"\n                        },\n                        \"UseFIPS\": {\n                            \"builtIn\": \"AWS::UseFIPS\",\n                            \"required\": true,\n                            \"default\": false,\n                            \"documentation\": \"When true, send this request to the FIPS-compliant regional endpoint. If the configured endpoint does not have a FIPS compliant endpoint, dispatching the request will return an error.\",\n                            \"type\": \"boolean\"\n                        },\n                        \"Endpoint\": {\n                            \"builtIn\": \"SDK::Endpoint\",\n                            \"required\": false,\n                            \"documentation\": \"Override the endpoint used to send this request\",\n                            \"type\": \"string\"\n                        },\n                        \"Region\": {\n                            \"builtIn\": \"AWS::Region\",\n                            \"required\": false,\n                            \"documentation\": \"The AWS region used to dispatch the request.\",\n                            \"type\": \"string\"\n                        }\n                    },\n                    \"rules\": [\n                        {\n                            \"conditions\": [\n                                {\n                                    \"fn\": \"isSet\",\n                                    \"argv\": [\n                                        {\n                                            \"ref\": \"Endpoint\"\n                                        }\n                                    ]\n                                }\n                            ],\n                            \"rules\": [\n                                {\n                                    \"conditions\": [\n                                        {\n                                            \"fn\": \"booleanEquals\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"UseFIPS\"\n                                                },\n                                                true\n                                            ]\n                                        }\n                                    ],\n                                    \"error\": \"Invalid Configuration: FIPS and custom endpoint are not supported\",\n                                    \"type\": \"error\"\n                                },\n                                {\n                                    \"conditions\": [],\n                                    \"rules\": [\n                                        {\n                                            \"conditions\": [\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseDualStack\"\n                                                        },\n                                                        true\n                                                    ]\n                                                }\n                                            ],\n                                            \"error\": \"Invalid Configuration: Dualstack and custom endpoint are not supported\",\n                                            \"type\": \"error\"\n                                        },\n                                        {\n                                            \"conditions\": [],\n                                            \"endpoint\": {\n                                                \"url\": {\n                                                    \"ref\": \"Endpoint\"\n                                                },\n                                                \"properties\": {},\n                                                \"headers\": {}\n                                            },\n                                            \"type\": \"endpoint\"\n                                        }\n                                    ],\n                                    \"type\": \"tree\"\n                                }\n                            ],\n                            \"type\": \"tree\"\n                        },\n                        {\n                            \"conditions\": [],\n                            \"rules\": [\n                                {\n                                    \"conditions\": [\n                                        {\n                                            \"fn\": \"isSet\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"Region\"\n                                                }\n                                            ]\n                                        }\n                                    ],\n                                    \"rules\": [\n                                        {\n                                            \"conditions\": [\n                                                {\n                                                    \"fn\": \"aws.partition\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"Region\"\n                                                        }\n                                                    ],\n                                                    \"assign\": \"PartitionResult\"\n                                                }\n                                            ],\n                                            \"rules\": [\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"stringEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"PartitionResult\"\n                                                                        },\n                                                                        \"name\"\n                                                                    ]\n                                                                },\n                                                                \"aws\"\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"UseFIPS\"\n                                                                },\n                                                                false\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"UseDualStack\"\n                                                                },\n                                                                false\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"endpoint\": {\n                                                        \"url\": \"https://{Region}.signin.aws.amazon.com\",\n                                                        \"properties\": {},\n                                                        \"headers\": {}\n                                                    },\n                                                    \"type\": \"endpoint\"\n                                                },\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"stringEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"PartitionResult\"\n                                                                        },\n                                                                        \"name\"\n                                                                    ]\n                                                                },\n                                                                \"aws-cn\"\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"UseFIPS\"\n                                                                },\n                                                                false\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"UseDualStack\"\n                                                                },\n                                                                false\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"endpoint\": {\n                                                        \"url\": \"https://{Region}.signin.amazonaws.cn\",\n                                                        \"properties\": {},\n                                                        \"headers\": {}\n                                                    },\n                                                    \"type\": \"endpoint\"\n                                                },\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"stringEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"PartitionResult\"\n                                                                        },\n                                                                        \"name\"\n                                                                    ]\n                                                                },\n                                                                \"aws-us-gov\"\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"UseFIPS\"\n                                                                },\n                                                                false\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"UseDualStack\"\n                                                                },\n                                                                false\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"endpoint\": {\n                                                        \"url\": \"https://{Region}.signin.amazonaws-us-gov.com\",\n                                                        \"properties\": {},\n                                                        \"headers\": {}\n                                                    },\n                                                    \"type\": \"endpoint\"\n                                                },\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"UseFIPS\"\n                                                                },\n                                                                true\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"UseDualStack\"\n                                                                },\n                                                                true\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"rules\": [\n                                                        {\n                                                            \"conditions\": [\n                                                                {\n                                                                    \"fn\": \"booleanEquals\",\n                                                                    \"argv\": [\n                                                                        true,\n                                                                        {\n                                                                            \"fn\": \"getAttr\",\n                                                                            \"argv\": [\n                                                                                {\n                                                                                    \"ref\": \"PartitionResult\"\n                                                                                },\n                                                                                \"supportsFIPS\"\n                                                                            ]\n                                                                        }\n                                                                    ]\n                                                                },\n                                                                {\n                                                                    \"fn\": \"booleanEquals\",\n                                                                    \"argv\": [\n                                                                        true,\n                                                                        {\n                                                                            \"fn\": \"getAttr\",\n                                                                            \"argv\": [\n                                                                                {\n                                                                                    \"ref\": \"PartitionResult\"\n                                                                                },\n                                                                                \"supportsDualStack\"\n                                                                            ]\n                                                                        }\n                                                                    ]\n                                                                }\n                                                            ],\n                                                            \"rules\": [\n                                                                {\n                                                                    \"conditions\": [],\n                                                                    \"endpoint\": {\n                                                                        \"url\": \"https://signin-fips.{Region}.{PartitionResult#dualStackDnsSuffix}\",\n                                                                        \"properties\": {},\n                                                                        \"headers\": {}\n                                                                    },\n                                                                    \"type\": \"endpoint\"\n                                                                }\n                                                            ],\n                                                            \"type\": \"tree\"\n                                                        },\n                                                        {\n                                                            \"conditions\": [],\n                                                            \"error\": \"FIPS and DualStack are enabled, but this partition does not support one or both\",\n                                                            \"type\": \"error\"\n                                                        }\n                                                    ],\n                                                    \"type\": \"tree\"\n                                                },\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"UseFIPS\"\n                                                                },\n                                                                true\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"UseDualStack\"\n                                                                },\n                                                                false\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"rules\": [\n                                                        {\n                                                            \"conditions\": [\n                                                                {\n                                                                    \"fn\": \"booleanEquals\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"fn\": \"getAttr\",\n                                                                            \"argv\": [\n                                                                                {\n                                                                                    \"ref\": \"PartitionResult\"\n                                                                                },\n                                                                                \"supportsFIPS\"\n                                                                            ]\n                                                                        },\n                                                                        true\n                                                                    ]\n                                                                }\n                                                            ],\n                                                            \"rules\": [\n                                                                {\n                                                                    \"conditions\": [],\n                                                                    \"endpoint\": {\n                                                                        \"url\": \"https://signin-fips.{Region}.{PartitionResult#dnsSuffix}\",\n                                                                        \"properties\": {},\n                                                                        \"headers\": {}\n                                                                    },\n                                                                    \"type\": \"endpoint\"\n                                                                }\n                                                            ],\n                                                            \"type\": \"tree\"\n                                                        },\n                                                        {\n                                                            \"conditions\": [],\n                                                            \"error\": \"FIPS is enabled but this partition does not support FIPS\",\n                                                            \"type\": \"error\"\n                                                        }\n                                                    ],\n                                                    \"type\": \"tree\"\n                                                },\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"UseFIPS\"\n                                                                },\n                                                                false\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"ref\": \"UseDualStack\"\n                                                                },\n                                                                true\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"rules\": [\n                                                        {\n                                                            \"conditions\": [\n                                                                {\n                                                                    \"fn\": \"booleanEquals\",\n                                                                    \"argv\": [\n                                                                        true,\n                                                                        {\n                                                                            \"fn\": \"getAttr\",\n                                                                            \"argv\": [\n                                                                                {\n                                                                                    \"ref\": \"PartitionResult\"\n                                                                                },\n                                                                                \"supportsDualStack\"\n                                                                            ]\n                                                                        }\n                                                                    ]\n                                                                }\n                                                            ],\n                                                            \"rules\": [\n                                                                {\n                                                                    \"conditions\": [],\n                                                                    \"endpoint\": {\n                                                                        \"url\": \"https://signin.{Region}.{PartitionResult#dualStackDnsSuffix}\",\n                                                                        \"properties\": {},\n                                                                        \"headers\": {}\n                                                                    },\n                                                                    \"type\": \"endpoint\"\n                                                                }\n                                                            ],\n                                                            \"type\": \"tree\"\n                                                        },\n                                                        {\n                                                            \"conditions\": [],\n                                                            \"error\": \"DualStack is enabled but this partition does not support DualStack\",\n                                                            \"type\": \"error\"\n                                                        }\n                                                    ],\n                                                    \"type\": \"tree\"\n                                                },\n                                                {\n                                                    \"conditions\": [],\n                                                    \"endpoint\": {\n                                                        \"url\": \"https://signin.{Region}.{PartitionResult#dnsSuffix}\",\n                                                        \"properties\": {},\n                                                        \"headers\": {}\n                                                    },\n                                                    \"type\": \"endpoint\"\n                                                }\n                                            ],\n                                            \"type\": \"tree\"\n                                        }\n                                    ],\n                                    \"type\": \"tree\"\n                                },\n                                {\n                                    \"conditions\": [],\n                                    \"error\": \"Invalid Configuration: Missing Region\",\n                                    \"type\": \"error\"\n                                }\n                            ],\n                            \"type\": \"tree\"\n                        }\n                    ]\n                },\n                \"smithy.rules#endpointTests\": {\n                    \"testCases\": [\n                        {\n                            \"documentation\": \"For custom endpoint with region not set and fips disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://example.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Endpoint\": \"https://example.com\",\n                                \"UseFIPS\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For custom endpoint with fips enabled\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: FIPS and custom endpoint are not supported\"\n                            },\n                            \"params\": {\n                                \"Endpoint\": \"https://example.com\",\n                                \"UseFIPS\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For custom endpoint with fips disabled and dualstack enabled\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: Dualstack and custom endpoint are not supported\"\n                            },\n                            \"params\": {\n                                \"Endpoint\": \"https://example.com\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-1 with FIPS enabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://signin-fips.us-east-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://signin-fips.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-1 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://signin.us-east-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://us-east-1.signin.aws.amazon.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-northwest-1 with FIPS enabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://signin-fips.cn-northwest-1.api.amazonwebservices.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-northwest-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-northwest-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://signin-fips.cn-northwest-1.amazonaws.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-northwest-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-northwest-1 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://signin.cn-northwest-1.api.amazonwebservices.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-northwest-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-northwest-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://cn-northwest-1.signin.amazonaws.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-northwest-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eusc-de-east-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://signin-fips.eusc-de-east-1.amazonaws.eu\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eusc-de-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eusc-de-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://signin.eusc-de-east-1.amazonaws.eu\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eusc-de-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-iso-east-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://signin-fips.us-iso-east-1.c2s.ic.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-iso-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-iso-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://signin.us-iso-east-1.c2s.ic.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-iso-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-isob-east-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://signin-fips.us-isob-east-1.sc2s.sgov.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-isob-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-isob-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://signin.us-isob-east-1.sc2s.sgov.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-isob-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-isoe-west-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://signin-fips.eu-isoe-west-1.cloud.adc-e.uk\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-isoe-west-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-isoe-west-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://signin.eu-isoe-west-1.cloud.adc-e.uk\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-isoe-west-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-isof-south-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://signin-fips.us-isof-south-1.csp.hci.ic.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-isof-south-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-isof-south-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://signin.us-isof-south-1.csp.hci.ic.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-isof-south-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-west-1 with FIPS enabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://signin-fips.us-gov-west-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-west-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-west-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://signin-fips.us-gov-west-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-west-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-west-1 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://signin.us-gov-west-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-west-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-west-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://us-gov-west-1.signin.amazonaws-us-gov.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-west-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"Missing region\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: Missing Region\"\n                            }\n                        }\n                    ],\n                    \"version\": \"1.0\"\n                }\n            }\n        },\n        \"com.amazonaws.signin#TokenType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#documentation\": \"Token type parameter indicating credential usage\\n\\nA parameter which indicates to the client how the token must be used.\\nValue is \\\"aws_sigv4\\\" (instead of typical \\\"Bearer\\\" for other OAuth systems)\\nto indicate that the client must de-serialize the token and use it to generate a signature.\",\n                \"smithy.api#pattern\": \"^aws_sigv4$\"\n            }\n        },\n        \"com.amazonaws.signin#TooManyRequestsError\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"error\": {\n                    \"target\": \"com.amazonaws.signin#OAuth2ErrorCode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"OAuth 2.0 error code indicating the specific type of error\\nWill be INVALID_REQUEST for rate limiting scenarios\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"message\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"Detailed message about the rate limiting\\nMay include retry-after information or rate limit details\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"Error thrown when rate limit is exceeded\\n\\nHTTP Status Code: 429 Too Many Requests\\n\\nPossible OAuth2ErrorCode values:\\n- INVALID_REQUEST: Rate limiting, too many requests, abuse prevention\\n\\nPossible causes:\\n- Too many token requests from the same client\\n- Rate limiting based on client_id or IP address\\n- Abuse prevention mechanisms triggered\\n- Service protection against excessive token generation\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 429\n            }\n        },\n        \"com.amazonaws.signin#ValidationException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"error\": {\n                    \"target\": \"com.amazonaws.signin#OAuth2ErrorCode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"OAuth 2.0 error code indicating validation failure\\nWill be INVALID_REQUEST for validation errors\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"message\": {\n                    \"target\": \"smithy.api#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"Detailed message explaining the validation failure\\nProvides specific information about which validation failed\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"Error thrown when request validation fails\\n\\nHTTP Status Code: 400 Bad Request\\n\\nUsed for request validation errors such as malformed parameters,\\nmissing required fields, or invalid parameter values.\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        }\n    }\n}"
  },
  {
    "path": "aws/sdk/aws-models/sso-oidc.json",
    "content": "{\n    \"smithy\": \"2.0\",\n    \"metadata\": {\n        \"suppressions\": [\n            {\n                \"id\": \"HttpMethodSemantics\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"HttpResponseCodeSemantics\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"PaginatedTrait\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"HttpHeaderTrait\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"HttpUriConflict\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"Service\",\n                \"namespace\": \"*\"\n            }\n        ]\n    },\n    \"shapes\": {\n        \"com.amazonaws.ssooidc#AWSSSOOIDCService\": {\n            \"type\": \"service\",\n            \"version\": \"2019-06-10\",\n            \"operations\": [\n                {\n                    \"target\": \"com.amazonaws.ssooidc#CreateToken\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ssooidc#CreateTokenWithIAM\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ssooidc#RegisterClient\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ssooidc#StartDeviceAuthorization\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#service\": {\n                    \"sdkId\": \"SSO OIDC\",\n                    \"arnNamespace\": \"sso-oauth\",\n                    \"cloudFormationName\": \"SSOOIDC\",\n                    \"cloudTrailEventSource\": \"ssooidc.amazonaws.com\",\n                    \"endpointPrefix\": \"oidc\"\n                },\n                \"aws.auth#sigv4\": {\n                    \"name\": \"sso-oauth\"\n                },\n                \"aws.protocols#restJson1\": {},\n                \"smithy.api#documentation\": \"<p>IAM Identity Center OpenID Connect (OIDC) is a web service that enables a client (such as CLI or a\\n      native application) to register with IAM Identity Center. The service also enables the client to fetch the\\n      user’s access token upon successful authentication and authorization with IAM Identity Center.</p>\\n         <p>\\n            <b>API namespaces</b>\\n         </p>\\n         <p>IAM Identity Center uses the <code>sso</code> and <code>identitystore</code> API namespaces. IAM Identity Center\\n      OpenID Connect uses the <code>sso-oauth</code> namespace.</p>\\n         <p>\\n            <b>Considerations for using this guide</b>\\n         </p>\\n         <p>Before you begin using this guide, we recommend that you first review the following\\n      important information about how the IAM Identity Center OIDC service works.</p>\\n         <ul>\\n            <li>\\n               <p>The IAM Identity Center OIDC service currently implements only the portions of the OAuth 2.0 Device\\n          Authorization Grant standard (<a href=\\\"https://tools.ietf.org/html/rfc8628\\\">https://tools.ietf.org/html/rfc8628</a>) that are necessary to enable single\\n          sign-on authentication with the CLI. </p>\\n            </li>\\n            <li>\\n               <p>With older versions of the CLI, the service only emits OIDC access tokens, so to\\n          obtain a new token, users must explicitly re-authenticate. To access the OIDC flow that\\n          supports token refresh and doesn’t require re-authentication, update to the latest CLI\\n          version (1.27.10 for CLI V1 and 2.9.0 for CLI V2) with support for OIDC token refresh\\n          and configurable IAM Identity Center session durations. For more information, see <a href=\\\"https://docs.aws.amazon.com/singlesignon/latest/userguide/configure-user-session.html\\\">Configure Amazon Web Services access portal session duration </a>. </p>\\n            </li>\\n            <li>\\n               <p>The access tokens provided by this service grant access to all Amazon Web Services account\\n          entitlements assigned to an IAM Identity Center user, not just a particular application.</p>\\n            </li>\\n            <li>\\n               <p>The documentation in this guide does not describe the mechanism to convert the access\\n          token into Amazon Web Services Auth (“sigv4”) credentials for use with IAM-protected Amazon Web Services service\\n          endpoints. For more information, see <a href=\\\"https://docs.aws.amazon.com/singlesignon/latest/PortalAPIReference/API_GetRoleCredentials.html\\\">GetRoleCredentials</a> in the <i>IAM Identity Center Portal API Reference\\n          Guide</i>.</p>\\n            </li>\\n         </ul>\\n         <p>For general information about IAM Identity Center, see <a href=\\\"https://docs.aws.amazon.com/singlesignon/latest/userguide/what-is.html\\\">What is\\n        IAM Identity Center?</a> in the <i>IAM Identity Center User Guide</i>.</p>\",\n                \"smithy.api#title\": \"AWS SSO OIDC\",\n                \"smithy.rules#endpointRuleSet\": {\n                    \"version\": \"1.0\",\n                    \"parameters\": {\n                        \"Region\": {\n                            \"builtIn\": \"AWS::Region\",\n                            \"required\": false,\n                            \"documentation\": \"The AWS region used to dispatch the request.\",\n                            \"type\": \"String\"\n                        },\n                        \"UseDualStack\": {\n                            \"builtIn\": \"AWS::UseDualStack\",\n                            \"required\": true,\n                            \"default\": false,\n                            \"documentation\": \"When true, use the dual-stack endpoint. If the configured endpoint does not support dual-stack, dispatching the request MAY return an error.\",\n                            \"type\": \"Boolean\"\n                        },\n                        \"UseFIPS\": {\n                            \"builtIn\": \"AWS::UseFIPS\",\n                            \"required\": true,\n                            \"default\": false,\n                            \"documentation\": \"When true, send this request to the FIPS-compliant regional endpoint. If the configured endpoint does not have a FIPS compliant endpoint, dispatching the request will return an error.\",\n                            \"type\": \"Boolean\"\n                        },\n                        \"Endpoint\": {\n                            \"builtIn\": \"SDK::Endpoint\",\n                            \"required\": false,\n                            \"documentation\": \"Override the endpoint used to send this request\",\n                            \"type\": \"String\"\n                        }\n                    },\n                    \"rules\": [\n                        {\n                            \"conditions\": [\n                                {\n                                    \"fn\": \"isSet\",\n                                    \"argv\": [\n                                        {\n                                            \"ref\": \"Endpoint\"\n                                        }\n                                    ]\n                                }\n                            ],\n                            \"rules\": [\n                                {\n                                    \"conditions\": [\n                                        {\n                                            \"fn\": \"booleanEquals\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"UseFIPS\"\n                                                },\n                                                true\n                                            ]\n                                        }\n                                    ],\n                                    \"error\": \"Invalid Configuration: FIPS and custom endpoint are not supported\",\n                                    \"type\": \"error\"\n                                },\n                                {\n                                    \"conditions\": [\n                                        {\n                                            \"fn\": \"booleanEquals\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"UseDualStack\"\n                                                },\n                                                true\n                                            ]\n                                        }\n                                    ],\n                                    \"error\": \"Invalid Configuration: Dualstack and custom endpoint are not supported\",\n                                    \"type\": \"error\"\n                                },\n                                {\n                                    \"conditions\": [],\n                                    \"endpoint\": {\n                                        \"url\": {\n                                            \"ref\": \"Endpoint\"\n                                        },\n                                        \"properties\": {},\n                                        \"headers\": {}\n                                    },\n                                    \"type\": \"endpoint\"\n                                }\n                            ],\n                            \"type\": \"tree\"\n                        },\n                        {\n                            \"conditions\": [\n                                {\n                                    \"fn\": \"isSet\",\n                                    \"argv\": [\n                                        {\n                                            \"ref\": \"Region\"\n                                        }\n                                    ]\n                                }\n                            ],\n                            \"rules\": [\n                                {\n                                    \"conditions\": [\n                                        {\n                                            \"fn\": \"aws.partition\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"Region\"\n                                                }\n                                            ],\n                                            \"assign\": \"PartitionResult\"\n                                        }\n                                    ],\n                                    \"rules\": [\n                                        {\n                                            \"conditions\": [\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseFIPS\"\n                                                        },\n                                                        true\n                                                    ]\n                                                },\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseDualStack\"\n                                                        },\n                                                        true\n                                                    ]\n                                                }\n                                            ],\n                                            \"rules\": [\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                true,\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"PartitionResult\"\n                                                                        },\n                                                                        \"supportsFIPS\"\n                                                                    ]\n                                                                }\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                true,\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"PartitionResult\"\n                                                                        },\n                                                                        \"supportsDualStack\"\n                                                                    ]\n                                                                }\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"rules\": [\n                                                        {\n                                                            \"conditions\": [],\n                                                            \"endpoint\": {\n                                                                \"url\": \"https://oidc-fips.{Region}.{PartitionResult#dualStackDnsSuffix}\",\n                                                                \"properties\": {},\n                                                                \"headers\": {}\n                                                            },\n                                                            \"type\": \"endpoint\"\n                                                        }\n                                                    ],\n                                                    \"type\": \"tree\"\n                                                },\n                                                {\n                                                    \"conditions\": [],\n                                                    \"error\": \"FIPS and DualStack are enabled, but this partition does not support one or both\",\n                                                    \"type\": \"error\"\n                                                }\n                                            ],\n                                            \"type\": \"tree\"\n                                        },\n                                        {\n                                            \"conditions\": [\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseFIPS\"\n                                                        },\n                                                        true\n                                                    ]\n                                                }\n                                            ],\n                                            \"rules\": [\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"PartitionResult\"\n                                                                        },\n                                                                        \"supportsFIPS\"\n                                                                    ]\n                                                                },\n                                                                true\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"rules\": [\n                                                        {\n                                                            \"conditions\": [\n                                                                {\n                                                                    \"fn\": \"stringEquals\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"fn\": \"getAttr\",\n                                                                            \"argv\": [\n                                                                                {\n                                                                                    \"ref\": \"PartitionResult\"\n                                                                                },\n                                                                                \"name\"\n                                                                            ]\n                                                                        },\n                                                                        \"aws-us-gov\"\n                                                                    ]\n                                                                }\n                                                            ],\n                                                            \"endpoint\": {\n                                                                \"url\": \"https://oidc.{Region}.amazonaws.com\",\n                                                                \"properties\": {},\n                                                                \"headers\": {}\n                                                            },\n                                                            \"type\": \"endpoint\"\n                                                        },\n                                                        {\n                                                            \"conditions\": [],\n                                                            \"endpoint\": {\n                                                                \"url\": \"https://oidc-fips.{Region}.{PartitionResult#dnsSuffix}\",\n                                                                \"properties\": {},\n                                                                \"headers\": {}\n                                                            },\n                                                            \"type\": \"endpoint\"\n                                                        }\n                                                    ],\n                                                    \"type\": \"tree\"\n                                                },\n                                                {\n                                                    \"conditions\": [],\n                                                    \"error\": \"FIPS is enabled but this partition does not support FIPS\",\n                                                    \"type\": \"error\"\n                                                }\n                                            ],\n                                            \"type\": \"tree\"\n                                        },\n                                        {\n                                            \"conditions\": [\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseDualStack\"\n                                                        },\n                                                        true\n                                                    ]\n                                                }\n                                            ],\n                                            \"rules\": [\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                true,\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"PartitionResult\"\n                                                                        },\n                                                                        \"supportsDualStack\"\n                                                                    ]\n                                                                }\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"rules\": [\n                                                        {\n                                                            \"conditions\": [],\n                                                            \"endpoint\": {\n                                                                \"url\": \"https://oidc.{Region}.{PartitionResult#dualStackDnsSuffix}\",\n                                                                \"properties\": {},\n                                                                \"headers\": {}\n                                                            },\n                                                            \"type\": \"endpoint\"\n                                                        }\n                                                    ],\n                                                    \"type\": \"tree\"\n                                                },\n                                                {\n                                                    \"conditions\": [],\n                                                    \"error\": \"DualStack is enabled but this partition does not support DualStack\",\n                                                    \"type\": \"error\"\n                                                }\n                                            ],\n                                            \"type\": \"tree\"\n                                        },\n                                        {\n                                            \"conditions\": [],\n                                            \"endpoint\": {\n                                                \"url\": \"https://oidc.{Region}.{PartitionResult#dnsSuffix}\",\n                                                \"properties\": {},\n                                                \"headers\": {}\n                                            },\n                                            \"type\": \"endpoint\"\n                                        }\n                                    ],\n                                    \"type\": \"tree\"\n                                }\n                            ],\n                            \"type\": \"tree\"\n                        },\n                        {\n                            \"conditions\": [],\n                            \"error\": \"Invalid Configuration: Missing Region\",\n                            \"type\": \"error\"\n                        }\n                    ]\n                },\n                \"smithy.rules#endpointTests\": {\n                    \"testCases\": [\n                        {\n                            \"documentation\": \"For region ap-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://oidc.ap-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-northeast-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://oidc.ap-northeast-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-northeast-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-northeast-2 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://oidc.ap-northeast-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-northeast-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-northeast-3 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://oidc.ap-northeast-3.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-northeast-3\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-south-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://oidc.ap-south-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-south-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-southeast-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://oidc.ap-southeast-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-southeast-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-southeast-2 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://oidc.ap-southeast-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-southeast-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ca-central-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://oidc.ca-central-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ca-central-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-central-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://oidc.eu-central-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-central-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-north-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://oidc.eu-north-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-north-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-south-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://oidc.eu-south-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-south-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-west-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://oidc.eu-west-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-west-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-west-2 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://oidc.eu-west-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-west-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-west-3 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://oidc.eu-west-3.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-west-3\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region me-south-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://oidc.me-south-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"me-south-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region sa-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://oidc.sa-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"sa-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://oidc.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-2 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://oidc.us-east-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-west-2 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://oidc.us-west-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-west-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-1 with FIPS enabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://oidc-fips.us-east-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://oidc-fips.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-1 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://oidc.us-east-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-north-1 with FIPS enabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://oidc-fips.cn-north-1.api.amazonwebservices.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-north-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-north-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://oidc-fips.cn-north-1.amazonaws.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-north-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-north-1 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://oidc.cn-north-1.api.amazonwebservices.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-north-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-north-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://oidc.cn-north-1.amazonaws.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-north-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://oidc.us-gov-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-west-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://oidc.us-gov-west-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-west-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-east-1 with FIPS enabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://oidc-fips.us-gov-east-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-east-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://oidc.us-gov-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-east-1 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://oidc.us-gov-east-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-iso-east-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://oidc-fips.us-iso-east-1.c2s.ic.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-iso-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-iso-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://oidc.us-iso-east-1.c2s.ic.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-iso-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-isob-east-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://oidc-fips.us-isob-east-1.sc2s.sgov.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-isob-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-isob-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://oidc.us-isob-east-1.sc2s.sgov.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-isob-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For custom endpoint with region set and fips disabled and dualstack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://example.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"For custom endpoint with region not set and fips disabled and dualstack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://example.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"For custom endpoint with fips enabled and dualstack disabled\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: FIPS and custom endpoint are not supported\"\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false,\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"For custom endpoint with fips disabled and dualstack enabled\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: Dualstack and custom endpoint are not supported\"\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true,\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"Missing region\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: Missing Region\"\n                            }\n                        }\n                    ],\n                    \"version\": \"1.0\"\n                }\n            }\n        },\n        \"com.amazonaws.ssooidc#AccessDeniedException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"error\": {\n                    \"target\": \"com.amazonaws.ssooidc#Error\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Single error code. For this exception the value will be <code>access_denied</code>.</p>\"\n                    }\n                },\n                \"reason\": {\n                    \"target\": \"com.amazonaws.ssooidc#AccessDeniedExceptionReason\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A string that uniquely identifies a reason for the error.</p>\"\n                    }\n                },\n                \"error_description\": {\n                    \"target\": \"com.amazonaws.ssooidc#ErrorDescription\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Human-readable text providing additional information, used to assist the client developer\\n      in understanding the error that occurred.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>You do not have sufficient access to perform this action.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.ssooidc#AccessDeniedExceptionReason\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"KMS_ACCESS_DENIED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"KMS_AccessDeniedException\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ssooidc#AccessToken\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#sensitive\": {}\n            }\n        },\n        \"com.amazonaws.ssooidc#ArnType\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ssooidc#Assertion\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#sensitive\": {}\n            }\n        },\n        \"com.amazonaws.ssooidc#AuthCode\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ssooidc#AuthorizationPendingException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"error\": {\n                    \"target\": \"com.amazonaws.ssooidc#Error\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Single error code. For this exception the value will be\\n      <code>authorization_pending</code>.</p>\"\n                    }\n                },\n                \"error_description\": {\n                    \"target\": \"com.amazonaws.ssooidc#ErrorDescription\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Human-readable text providing additional information, used to assist the client developer\\n      in understanding the error that occurred.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Indicates that a request to authorize a client with an access user session token is\\n      pending.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.ssooidc#AwsAdditionalDetails\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"identityContext\": {\n                    \"target\": \"com.amazonaws.ssooidc#IdentityContext\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The trusted context assertion is signed and encrypted by STS. It provides access to\\n        <code>sts:identity_context</code> claim in the <code>idToken</code> without JWT\\n      parsing</p>\\n         <p>Identity context comprises information that Amazon Web Services services use to make authorization\\n      decisions when they receive requests.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This structure contains Amazon Web Services-specific parameter extensions and the <a href=\\\"https://docs.aws.amazon.com/singlesignon/latest/userguide/trustedidentitypropagation-overview.html\\\">identity context</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.ssooidc#ClientId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ssooidc#ClientName\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ssooidc#ClientSecret\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#sensitive\": {}\n            }\n        },\n        \"com.amazonaws.ssooidc#ClientType\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ssooidc#CodeVerifier\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#sensitive\": {}\n            }\n        },\n        \"com.amazonaws.ssooidc#CreateToken\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ssooidc#CreateTokenRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ssooidc#CreateTokenResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.ssooidc#AccessDeniedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ssooidc#AuthorizationPendingException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ssooidc#ExpiredTokenException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ssooidc#InternalServerException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ssooidc#InvalidClientException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ssooidc#InvalidGrantException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ssooidc#InvalidRequestException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ssooidc#InvalidScopeException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ssooidc#SlowDownException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ssooidc#UnauthorizedClientException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ssooidc#UnsupportedGrantTypeException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#auth\": [],\n                \"smithy.api#documentation\": \"<p>Creates and returns access and refresh tokens for clients that are authenticated using\\n      client secrets. The access token can be used to fetch short-lived credentials for the assigned\\n      AWS accounts or to access application APIs using <code>bearer</code> authentication.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"Call OAuth/OIDC /token endpoint for Device Code grant with Secret authentication\",\n                        \"documentation\": \"\",\n                        \"input\": {\n                            \"clientId\": \"_yzkThXVzLWVhc3QtMQEXAMPLECLIENTID\",\n                            \"clientSecret\": \"VERYLONGSECRETeyJraWQiOiJrZXktMTU2NDAyODA5OSIsImFsZyI6IkhTMzg0In0\",\n                            \"grantType\": \"urn:ietf:params:oauth:grant-type:device-code\",\n                            \"deviceCode\": \"yJraWQiOiJrZXktMTU2Njk2ODA4OCIsImFsZyI6IkhTMzIn0EXAMPLEDEVICECODE\"\n                        },\n                        \"output\": {\n                            \"accessToken\": \"aoal-YigITUDiNX1xZwOMXM5MxOWDL0E0jg9P6_C_jKQPxS_SKCP6f0kh1Up4g7TtvQqkMnD-GJiU_S1gvug6SrggAkc0:MGYCMQD3IatVjV7jAJU91kK3PkS/SfA2wtgWzOgZWDOR7sDGN9t0phCZz5It/aes/3C1Zj0CMQCKWOgRaiz6AIhza3DSXQNMLjRKXC8F8ceCsHlgYLMZ7hZidEXAMPLEACCESSTOKEN\",\n                            \"tokenType\": \"Bearer\",\n                            \"expiresIn\": 1579729529,\n                            \"refreshToken\": \"aorvJYubGpU6i91YnH7Mfo-AT2fIVa1zCfA_Rvq9yjVKIP3onFmmykuQ7E93y2I-9Nyj-A_sVvMufaLNL0bqnDRtgAkc0:MGUCMFrRsktMRVlWaOR70XGMFGLL0SlcCw4DiYveIiOVx1uK9BbD0gvAddsW3UTLozXKMgIxAJ3qxUvjpnlLIOaaKOoa/FuNgqJVvr9GMwDtnAtlh9iZzAkEXAMPLEREFRESHTOKEN\"\n                        }\n                    },\n                    {\n                        \"title\": \"Call OAuth/OIDC /token endpoint for Refresh Token grant with Secret authentication\",\n                        \"documentation\": \"\",\n                        \"input\": {\n                            \"clientId\": \"_yzkThXVzLWVhc3QtMQEXAMPLECLIENTID\",\n                            \"clientSecret\": \"VERYLONGSECRETeyJraWQiOiJrZXktMTU2NDAyODA5OSIsImFsZyI6IkhTMzg0In0\",\n                            \"grantType\": \"refresh_token\",\n                            \"refreshToken\": \"aorvJYubGpU6i91YnH7Mfo-AT2fIVa1zCfA_Rvq9yjVKIP3onFmmykuQ7E93y2I-9Nyj-A_sVvMufaLNL0bqnDRtgAkc0:MGUCMFrRsktMRVlWaOR70XGMFGLL0SlcCw4DiYveIiOVx1uK9BbD0gvAddsW3UTLozXKMgIxAJ3qxUvjpnlLIOaaKOoa/FuNgqJVvr9GMwDtnAtlh9iZzAkEXAMPLEREFRESHTOKEN\",\n                            \"scope\": [\n                                \"codewhisperer:completions\"\n                            ]\n                        },\n                        \"output\": {\n                            \"accessToken\": \"aoal-YigITUDiNX1xZwOMXM5MxOWDL0E0jg9P6_C_jKQPxS_SKCP6f0kh1Up4g7TtvQqkMnD-GJiU_S1gvug6SrggAkc0:MGYCMQD3IatVjV7jAJU91kK3PkS/SfA2wtgWzOgZWDOR7sDGN9t0phCZz5It/aes/3C1Zj0CMQCKWOgRaiz6AIhza3DSXQNMLjRKXC8F8ceCsHlgYLMZ7hZidEXAMPLEACCESSTOKEN\",\n                            \"tokenType\": \"Bearer\",\n                            \"expiresIn\": 1579729529,\n                            \"refreshToken\": \"aorvJYubGpU6i91YnH7Mfo-AT2fIVa1zCfA_Rvq9yjVKIP3onFmmykuQ7E93y2I-9Nyj-A_sVvMufaLNL0bqnDRtgAkc0:MGUCMFrRsktMRVlWaOR70XGMFGLL0SlcCw4DiYveIiOVx1uK9BbD0gvAddsW3UTLozXKMgIxAJ3qxUvjpnlLIOaaKOoa/FuNgqJVvr9GMwDtnAtlh9iZzAkEXAMPLEREFRESHTOKEN\"\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"POST\",\n                    \"uri\": \"/token\",\n                    \"code\": 200\n                },\n                \"smithy.api#optionalAuth\": {}\n            }\n        },\n        \"com.amazonaws.ssooidc#CreateTokenRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"clientId\": {\n                    \"target\": \"com.amazonaws.ssooidc#ClientId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The unique identifier string for the client or application. This value comes from the\\n      result of the <a>RegisterClient</a> API.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"clientSecret\": {\n                    \"target\": \"com.amazonaws.ssooidc#ClientSecret\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A secret string generated for the client. This value should come from the persisted result\\n      of the <a>RegisterClient</a> API.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"grantType\": {\n                    \"target\": \"com.amazonaws.ssooidc#GrantType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Supports the following OAuth grant types: Authorization Code, Device Code, and Refresh\\n      Token. Specify one of the following values, depending on the grant type that you want:</p>\\n         <p>* Authorization Code - <code>authorization_code</code>\\n         </p>\\n         <p>* Device Code - <code>urn:ietf:params:oauth:grant-type:device_code</code>\\n         </p>\\n         <p>* Refresh Token - <code>refresh_token</code>\\n         </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"deviceCode\": {\n                    \"target\": \"com.amazonaws.ssooidc#DeviceCode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Used only when calling this API for the Device Code grant type. This short-lived code is\\n      used to identify this authorization request. This comes from the result of the <a>StartDeviceAuthorization</a> API.</p>\"\n                    }\n                },\n                \"code\": {\n                    \"target\": \"com.amazonaws.ssooidc#AuthCode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Used only when calling this API for the Authorization Code grant type. The short-lived\\n      code is used to identify this authorization request.</p>\"\n                    }\n                },\n                \"refreshToken\": {\n                    \"target\": \"com.amazonaws.ssooidc#RefreshToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Used only when calling this API for the Refresh Token grant type. This token is used to\\n      refresh short-lived tokens, such as the access token, that might expire.</p>\\n         <p>For more information about the features and limitations of the current IAM Identity Center OIDC\\n      implementation, see <i>Considerations for Using this Guide</i> in the <a href=\\\"https://docs.aws.amazon.com/singlesignon/latest/OIDCAPIReference/Welcome.html\\\">IAM Identity Center\\n        OIDC API Reference</a>.</p>\"\n                    }\n                },\n                \"scope\": {\n                    \"target\": \"com.amazonaws.ssooidc#Scopes\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The list of scopes for which authorization is requested. This parameter has no effect; the access token will always include all scopes configured during client registration.</p>\"\n                    }\n                },\n                \"redirectUri\": {\n                    \"target\": \"com.amazonaws.ssooidc#URI\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Used only when calling this API for the Authorization Code grant type. This value\\n      specifies the location of the client or application that has registered to receive the\\n      authorization code.</p>\"\n                    }\n                },\n                \"codeVerifier\": {\n                    \"target\": \"com.amazonaws.ssooidc#CodeVerifier\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Used only when calling this API for the Authorization Code grant type. This value is\\n      generated by the client and presented to validate the original code challenge value the client\\n      passed at authorization time.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ssooidc#CreateTokenResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"accessToken\": {\n                    \"target\": \"com.amazonaws.ssooidc#AccessToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A bearer token to access Amazon Web Services accounts and applications assigned to a user.</p>\"\n                    }\n                },\n                \"tokenType\": {\n                    \"target\": \"com.amazonaws.ssooidc#TokenType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Used to notify the client that the returned token is an access token. The supported token\\n      type is <code>Bearer</code>.</p>\"\n                    }\n                },\n                \"expiresIn\": {\n                    \"target\": \"com.amazonaws.ssooidc#ExpirationInSeconds\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>Indicates the time in seconds when an access token will expire.</p>\"\n                    }\n                },\n                \"refreshToken\": {\n                    \"target\": \"com.amazonaws.ssooidc#RefreshToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A token that, if present, can be used to refresh a previously issued access token that\\n      might have expired.</p>\\n         <p>For more information about the features and limitations of the current IAM Identity Center OIDC\\n      implementation, see <i>Considerations for Using this Guide</i> in the <a href=\\\"https://docs.aws.amazon.com/singlesignon/latest/OIDCAPIReference/Welcome.html\\\">IAM Identity Center\\n        OIDC API Reference</a>.</p>\"\n                    }\n                },\n                \"idToken\": {\n                    \"target\": \"com.amazonaws.ssooidc#IdToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>idToken</code> is not implemented or supported. For more information about the\\n      features and limitations of the current IAM Identity Center OIDC implementation, see\\n        <i>Considerations for Using this Guide</i> in the <a href=\\\"https://docs.aws.amazon.com/singlesignon/latest/OIDCAPIReference/Welcome.html\\\">IAM Identity Center\\n        OIDC API Reference</a>.</p>\\n         <p>A JSON Web Token (JWT) that identifies who is associated with the issued access token.\\n    </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ssooidc#CreateTokenWithIAM\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ssooidc#CreateTokenWithIAMRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ssooidc#CreateTokenWithIAMResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.ssooidc#AccessDeniedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ssooidc#AuthorizationPendingException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ssooidc#ExpiredTokenException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ssooidc#InternalServerException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ssooidc#InvalidClientException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ssooidc#InvalidGrantException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ssooidc#InvalidRequestException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ssooidc#InvalidRequestRegionException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ssooidc#InvalidScopeException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ssooidc#SlowDownException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ssooidc#UnauthorizedClientException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ssooidc#UnsupportedGrantTypeException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Creates and returns access and refresh tokens for authorized client applications that are\\n      authenticated using any IAM entity, such as a service\\n      role or user. These tokens might contain defined scopes that specify permissions such as <code>read:profile</code> or <code>write:data</code>. Through downscoping, you can use the scopes parameter to request tokens with reduced permissions compared to the original client application's permissions or, if applicable, the refresh token's scopes. The access token can be used to fetch short-lived credentials for the assigned\\n      Amazon Web Services accounts or to access application APIs using <code>bearer</code> authentication.</p>\\n         <note>\\n            <p>This API is used with Signature Version 4. For more information, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_sigv.html\\\">Amazon Web Services Signature\\n          Version 4 for API Requests</a>.</p>\\n         </note>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"Call OAuth/OIDC /token endpoint for Authorization Code grant with IAM authentication\",\n                        \"documentation\": \"\",\n                        \"input\": {\n                            \"clientId\": \"arn:aws:sso::123456789012:application/ssoins-111111111111/apl-222222222222\",\n                            \"grantType\": \"authorization_code\",\n                            \"code\": \"yJraWQiOiJrZXktMTU2Njk2ODA4OCIsImFsZyI6IkhTMzg0In0EXAMPLEAUTHCODE\",\n                            \"redirectUri\": \"https://mywebapp.example/redirect\",\n                            \"scope\": [\n                                \"openid\",\n                                \"aws\",\n                                \"sts:identity_context\"\n                            ]\n                        },\n                        \"output\": {\n                            \"accessToken\": \"aoal-YigITUDiNX1xZwOMXM5MxOWDL0E0jg9P6_C_jKQPxS_SKCP6f0kh1Up4g7TtvQqkMnD-GJiU_S1gvug6SrggAkc0:MGYCMQD3IatVjV7jAJU91kK3PkS/SfA2wtgWzOgZWDOR7sDGN9t0phCZz5It/aes/3C1Zj0CMQCKWOgRaiz6AIhza3DSXQNMLjRKXC8F8ceCsHlgYLMZ7hZidEXAMPLEACCESSTOKEN\",\n                            \"tokenType\": \"Bearer\",\n                            \"expiresIn\": 1579729529,\n                            \"refreshToken\": \"aorvJYubGpU6i91YnH7Mfo-AT2fIVa1zCfA_Rvq9yjVKIP3onFmmykuQ7E93y2I-9Nyj-A_sVvMufaLNL0bqnDRtgAkc0:MGUCMFrRsktMRVlWaOR70XGMFGLL0SlcCw4DiYveIiOVx1uK9BbD0gvAddsW3UTLozXKMgIxAJ3qxUvjpnlLIOaaKOoa/FuNgqJVvr9GMwDtnAtlh9iZzAkEXAMPLEREFRESHTOKEN\",\n                            \"idToken\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhd3M6aWRlbnRpdHlfc3RvcmVfaWQiOiJkLTMzMzMzMzMzMzMiLCJzdWIiOiI3MzA0NDhmMi1lMGExLTcwYTctYzk1NC0wMDAwMDAwMDAwMDAiLCJhd3M6aW5zdGFuY2VfYWNjb3VudCI6IjExMTExMTExMTExMSIsInN0czppZGVudGl0eV9jb250ZXh0IjoiRVhBTVBMRUlERU5USVRZQ09OVEVYVCIsInN0czphdWRpdF9jb250ZXh0IjoiRVhBTVBMRUFVRElUQ09OVEVYVCIsImlzcyI6Imh0dHBzOi8vaWRlbnRpdHljZW50ZXIuYW1hem9uYXdzLmNvbS9zc29pbnMtMTExMTExMTExMTExIiwiYXdzOmlkZW50aXR5X3N0b3JlX2FybiI6ImFybjphd3M6aWRlbnRpdHlzdG9yZTo6MTExMTExMTExMTExOmlkZW50aXR5c3RvcmUvZC0zMzMzMzMzMzMzIiwiYXVkIjoiYXJuOmF3czpzc286OjEyMzQ1Njc4OTAxMjphcHBsaWNhdGlvbi9zc29pbnMtMTExMTExMTExMTExL2FwbC0yMjIyMjIyMjIyMjIiLCJhd3M6aW5zdGFuY2VfYXJuIjoiYXJuOmF3czpzc286OjppbnN0YW5jZS9zc29pbnMtMTExMTExMTExMTExIiwiYXdzOmNyZWRlbnRpYWxfaWQiOiJfWlIyTjZhVkJqMjdGUEtheWpfcEtwVjc3QVBERl80MXB4ZXRfWWpJdUpONlVJR2RBdkpFWEFNUExFQ1JFRElEIiwiYXV0aF90aW1lIjoiMjAyMC0wMS0yMlQxMjo0NToyOVoiLCJleHAiOjE1Nzk3Mjk1MjksImlhdCI6MTU3OTcyNTkyOX0.Xyah6qbk78qThzJ41iFU2yfGuRqqtKXHrJYwQ8L9Ip0\",\n                            \"issuedTokenType\": \"urn:ietf:params:oauth:token-type:refresh_token\",\n                            \"scope\": [\n                                \"openid\",\n                                \"aws\",\n                                \"sts:identity_context\"\n                            ],\n                            \"awsAdditionalDetails\": {\n                                \"identityContext\": \"EXAMPLEIDENTITYCONTEXT\"\n                            }\n                        }\n                    },\n                    {\n                        \"title\": \"Call OAuth/OIDC /token endpoint for JWT Bearer grant with IAM authentication\",\n                        \"documentation\": \"\",\n                        \"input\": {\n                            \"clientId\": \"arn:aws:sso::123456789012:application/ssoins-111111111111/apl-222222222222\",\n                            \"grantType\": \"urn:ietf:params:oauth:grant-type:jwt-bearer\",\n                            \"assertion\": \"eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImtpZCI6IjFMVE16YWtpaGlSbGFfOHoyQkVKVlhlV01xbyJ9.eyJ2ZXIiOiIyLjAiLCJpc3MiOiJodHRwczovL2xvZ2luLm1pY3Jvc29mdG9ubGluZS5jb20vOTEyMjA0MGQtNmM2Ny00YzViLWIxMTItMzZhMzA0YjY2ZGFkL3YyLjAiLCJzdWIiOiJBQUFBQUFBQUFBQUFBQUFBQUFBQUFJa3pxRlZyU2FTYUZIeTc4MmJidGFRIiwiYXVkIjoiNmNiMDQwMTgtYTNmNS00NmE3LWI5OTUtOTQwYzc4ZjVhZWYzIiwiZXhwIjoxNTM2MzYxNDExLCJpYXQiOjE1MzYyNzQ3MTEsIm5iZiI6MTUzNjI3NDcxMSwibmFtZSI6IkFiZSBMaW5jb2xuIiwicHJlZmVycmVkX3VzZXJuYW1lIjoiQWJlTGlAbWljcm9zb2Z0LmNvbSIsIm9pZCI6IjAwMDAwMDAwLTAwMDAtMDAwMC02NmYzLTMzMzJlY2E3ZWE4MSIsInRpZCI6IjkxMjIwNDBkLTZjNjctNGM1Yi1iMTEyLTM2YTMwNGI2NmRhZCIsIm5vbmNlIjoiMTIzNTIzIiwiYWlvIjoiRGYyVVZYTDFpeCFsTUNXTVNPSkJjRmF0emNHZnZGR2hqS3Y4cTVnMHg3MzJkUjVNQjVCaXN2R1FPN1lXQnlqZDhpUURMcSFlR2JJRGFreXA1bW5PcmNkcUhlWVNubHRlcFFtUnA2QUlaOGpZIn0.1AFWW-Ck5nROwSlltm7GzZvDwUkqvhSQpm55TQsmVo9Y59cLhRXpvB8n-55HCr9Z6G_31_UbeUkoz612I2j_Sm9FFShSDDjoaLQr54CreGIJvjtmS3EkK9a7SJBbcpL1MpUtlfygow39tFjY7EVNW9plWUvRrTgVk7lYLprvfzw-CIqw3gHC-T7IK_m_xkr08INERBtaecwhTeN4chPC4W3jdmw_lIxzC48YoQ0dB1L9-ImX98Egypfrlbm0IBL5spFzL6JDZIRRJOu8vecJvj1mq-IUhGt0MacxX8jdxYLP-KUu2d9MbNKpCKJuZ7p8gwTL5B7NlUdh_dmSviPWrw\"\n                        },\n                        \"output\": {\n                            \"accessToken\": \"aoal-YigITUDiNX1xZwOMXM5MxOWDL0E0jg9P6_C_jKQPxS_SKCP6f0kh1Up4g7TtvQqkMnD-GJiU_S1gvug6SrggAkc0:MGYCMQD3IatVjV7jAJU91kK3PkS/SfA2wtgWzOgZWDOR7sDGN9t0phCZz5It/aes/3C1Zj0CMQCKWOgRaiz6AIhza3DSXQNMLjRKXC8F8ceCsHlgYLMZ7hZidEXAMPLEACCESSTOKEN\",\n                            \"tokenType\": \"Bearer\",\n                            \"expiresIn\": 1579729529,\n                            \"refreshToken\": \"aorvJYubGpU6i91YnH7Mfo-AT2fIVa1zCfA_Rvq9yjVKIP3onFmmykuQ7E93y2I-9Nyj-A_sVvMufaLNL0bqnDRtgAkc0:MGUCMFrRsktMRVlWaOR70XGMFGLL0SlcCw4DiYveIiOVx1uK9BbD0gvAddsW3UTLozXKMgIxAJ3qxUvjpnlLIOaaKOoa/FuNgqJVvr9GMwDtnAtlh9iZzAkEXAMPLEREFRESHTOKEN\",\n                            \"idToken\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhd3M6aWRlbnRpdHlfc3RvcmVfaWQiOiJkLTMzMzMzMzMzMzMiLCJzdWIiOiI3MzA0NDhmMi1lMGExLTcwYTctYzk1NC0wMDAwMDAwMDAwMDAiLCJhd3M6aW5zdGFuY2VfYWNjb3VudCI6IjExMTExMTExMTExMSIsInN0czppZGVudGl0eV9jb250ZXh0IjoiRVhBTVBMRUlERU5USVRZQ09OVEVYVCIsInN0czphdWRpdF9jb250ZXh0IjoiRVhBTVBMRUFVRElUQ09OVEVYVCIsImlzcyI6Imh0dHBzOi8vaWRlbnRpdHljZW50ZXIuYW1hem9uYXdzLmNvbS9zc29pbnMtMTExMTExMTExMTExIiwiYXdzOmlkZW50aXR5X3N0b3JlX2FybiI6ImFybjphd3M6aWRlbnRpdHlzdG9yZTo6MTExMTExMTExMTExOmlkZW50aXR5c3RvcmUvZC0zMzMzMzMzMzMzIiwiYXVkIjoiYXJuOmF3czpzc286OjEyMzQ1Njc4OTAxMjphcHBsaWNhdGlvbi9zc29pbnMtMTExMTExMTExMTExL2FwbC0yMjIyMjIyMjIyMjIiLCJhd3M6aW5zdGFuY2VfYXJuIjoiYXJuOmF3czpzc286OjppbnN0YW5jZS9zc29pbnMtMTExMTExMTExMTExIiwiYXdzOmNyZWRlbnRpYWxfaWQiOiJfWlIyTjZhVkJqMjdGUEtheWpfcEtwVjc3QVBERl80MXB4ZXRfWWpJdUpONlVJR2RBdkpFWEFNUExFQ1JFRElEIiwiYXV0aF90aW1lIjoiMjAyMC0wMS0yMlQxMjo0NToyOVoiLCJleHAiOjE1Nzk3Mjk1MjksImlhdCI6MTU3OTcyNTkyOX0.Xyah6qbk78qThzJ41iFU2yfGuRqqtKXHrJYwQ8L9Ip0\",\n                            \"issuedTokenType\": \"urn:ietf:params:oauth:token-type:refresh_token\",\n                            \"scope\": [\n                                \"openid\",\n                                \"aws\",\n                                \"sts:identity_context\"\n                            ],\n                            \"awsAdditionalDetails\": {\n                                \"identityContext\": \"EXAMPLEIDENTITYCONTEXT\"\n                            }\n                        }\n                    },\n                    {\n                        \"title\": \"Call OAuth/OIDC /token endpoint for Refresh Token grant with IAM authentication\",\n                        \"documentation\": \"\",\n                        \"input\": {\n                            \"clientId\": \"arn:aws:sso::123456789012:application/ssoins-111111111111/apl-222222222222\",\n                            \"grantType\": \"refresh_token\",\n                            \"refreshToken\": \"aorvJYubGpU6i91YnH7Mfo-AT2fIVa1zCfA_Rvq9yjVKIP3onFmmykuQ7E93y2I-9Nyj-A_sVvMufaLNL0bqnDRtgAkc0:MGUCMFrRsktMRVlWaOR70XGMFGLL0SlcCw4DiYveIiOVx1uK9BbD0gvAddsW3UTLozXKMgIxAJ3qxUvjpnlLIOaaKOoa/FuNgqJVvr9GMwDtnAtlh9iZzAkEXAMPLEREFRESHTOKEN\"\n                        },\n                        \"output\": {\n                            \"accessToken\": \"aoal-YigITUDiNX1xZwOMXM5MxOWDL0E0jg9P6_C_jKQPxS_SKCP6f0kh1Up4g7TtvQqkMnD-GJiU_S1gvug6SrggAkc0:MGYCMQD3IatVjV7jAJU91kK3PkS/SfA2wtgWzOgZWDOR7sDGN9t0phCZz5It/aes/3C1Zj0CMQCKWOgRaiz6AIhza3DSXQNMLjRKXC8F8ceCsHlgYLMZ7hZidEXAMPLEACCESSTOKEN\",\n                            \"tokenType\": \"Bearer\",\n                            \"expiresIn\": 1579729529,\n                            \"refreshToken\": \"aorvJYubGpU6i91YnH7Mfo-AT2fIVa1zCfA_Rvq9yjVKIP3onFmmykuQ7E93y2I-9Nyj-A_sVvMufaLNL0bqnDRtgAkc0:MGUCMFrRsktMRVlWaOR70XGMFGLL0SlcCw4DiYveIiOVx1uK9BbD0gvAddsW3UTLozXKMgIxAJ3qxUvjpnlLIOaaKOoa/FuNgqJVvr9GMwDtnAtlh9iZzAkEXAMPLEREFRESHTOKEN\",\n                            \"issuedTokenType\": \"urn:ietf:params:oauth:token-type:refresh_token\",\n                            \"scope\": [\n                                \"openid\",\n                                \"aws\",\n                                \"sts:identity_context\"\n                            ]\n                        }\n                    },\n                    {\n                        \"title\": \"Call OAuth/OIDC /token endpoint for Token Exchange grant with IAM authentication\",\n                        \"documentation\": \"\",\n                        \"input\": {\n                            \"clientId\": \"arn:aws:sso::123456789012:application/ssoins-111111111111/apl-222222222222\",\n                            \"grantType\": \"urn:ietf:params:oauth:grant-type:token-exchange\",\n                            \"subjectToken\": \"aoak-Hig8TUDPNX1xZwOMXM5MxOWDL0E0jg9P6_C_jKQPxS_SKCP6f0kh1Up4g7TtvQqkMnD-GJiU_S1gvug6SrggAkc0:MGYCMQD3IatVjV7jAJU91kK3PkS/SfA2wtgWzOgZWDOR7sDGN9t0phCZz5It/aes/3C1Zj0CMQCKWOgRaiz6AIhza3DSXQNMLjRKXC8F8ceCsHlgYLMZ7hZDIFFERENTACCESSTOKEN\",\n                            \"subjectTokenType\": \"urn:ietf:params:oauth:token-type:access_token\",\n                            \"requestedTokenType\": \"urn:ietf:params:oauth:token-type:access_token\"\n                        },\n                        \"output\": {\n                            \"accessToken\": \"aoal-YigITUDiNX1xZwOMXM5MxOWDL0E0jg9P6_C_jKQPxS_SKCP6f0kh1Up4g7TtvQqkMnD-GJiU_S1gvug6SrggAkc0:MGYCMQD3IatVjV7jAJU91kK3PkS/SfA2wtgWzOgZWDOR7sDGN9t0phCZz5It/aes/3C1Zj0CMQCKWOgRaiz6AIhza3DSXQNMLjRKXC8F8ceCsHlgYLMZ7hZidEXAMPLEACCESSTOKEN\",\n                            \"tokenType\": \"Bearer\",\n                            \"expiresIn\": 1579729529,\n                            \"idToken\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhd3M6aWRlbnRpdHlfc3RvcmVfaWQiOiJkLTMzMzMzMzMzMzMiLCJzdWIiOiI3MzA0NDhmMi1lMGExLTcwYTctYzk1NC0wMDAwMDAwMDAwMDAiLCJhd3M6aW5zdGFuY2VfYWNjb3VudCI6IjExMTExMTExMTExMSIsInN0czppZGVudGl0eV9jb250ZXh0IjoiRVhBTVBMRUlERU5USVRZQ09OVEVYVCIsImlzcyI6Imh0dHBzOi8vaWRlbnRpdHljZW50ZXIuYW1hem9uYXdzLmNvbS9zc29pbnMtMTExMTExMTExMTExIiwiYXdzOmlkZW50aXR5X3N0b3JlX2FybiI6ImFybjphd3M6aWRlbnRpdHlzdG9yZTo6MTExMTExMTExMTExOmlkZW50aXR5c3RvcmUvZC0zMzMzMzMzMzMzIiwiYXVkIjoiYXJuOmF3czpzc286OjEyMzQ1Njc4OTAxMjphcHBsaWNhdGlvbi9zc29pbnMtMTExMTExMTExMTExL2FwbC0yMjIyMjIyMjIyMjIiLCJhd3M6aW5zdGFuY2VfYXJuIjoiYXJuOmF3czpzc286OjppbnN0YW5jZS9zc29pbnMtMTExMTExMTExMTExIiwiYXdzOmNyZWRlbnRpYWxfaWQiOiJfWlIyTjZhVkJqMjdGUEtheWpfcEtwVjc3QVBERl80MXB4ZXRfWWpJdUpONlVJR2RBdkpFWEFNUExFQ1JFRElEIiwiYXV0aF90aW1lIjoiMjAyMC0wMS0yMlQxMjo0NToyOVoiLCJleHAiOjE1Nzk3Mjk1MjksImlhdCI6MTU3OTcyNTkyOX0.5SYiW1kMsuUr7nna-l5tlakM0GNbMHvIM2_n0QD23jM\",\n                            \"issuedTokenType\": \"urn:ietf:params:oauth:token-type:access_token\",\n                            \"scope\": [\n                                \"openid\",\n                                \"aws\",\n                                \"sts:identity_context\"\n                            ],\n                            \"awsAdditionalDetails\": {\n                                \"identityContext\": \"EXAMPLEIDENTITYCONTEXT\"\n                            }\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"POST\",\n                    \"uri\": \"/token?aws_iam=t\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.ssooidc#CreateTokenWithIAMRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"clientId\": {\n                    \"target\": \"com.amazonaws.ssooidc#ClientId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The unique identifier string for the client or application. This value is an application\\n      ARN that has OAuth grants configured.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"grantType\": {\n                    \"target\": \"com.amazonaws.ssooidc#GrantType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Supports the following OAuth grant types: Authorization Code, Refresh Token, JWT Bearer,\\n      and Token Exchange. Specify one of the following values, depending on the grant type that you\\n      want:</p>\\n         <p>* Authorization Code - <code>authorization_code</code>\\n         </p>\\n         <p>* Refresh Token - <code>refresh_token</code>\\n         </p>\\n         <p>* JWT Bearer - <code>urn:ietf:params:oauth:grant-type:jwt-bearer</code>\\n         </p>\\n         <p>* Token Exchange - <code>urn:ietf:params:oauth:grant-type:token-exchange</code>\\n         </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"code\": {\n                    \"target\": \"com.amazonaws.ssooidc#AuthCode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Used only when calling this API for the Authorization Code grant type. This short-lived\\n      code is used to identify this authorization request. The code is obtained through a redirect\\n      from IAM Identity Center to a redirect URI persisted in the Authorization Code GrantOptions for the\\n      application.</p>\"\n                    }\n                },\n                \"refreshToken\": {\n                    \"target\": \"com.amazonaws.ssooidc#RefreshToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Used only when calling this API for the Refresh Token grant type. This token is used to\\n      refresh short-lived tokens, such as the access token, that might expire.</p>\\n         <p>For more information about the features and limitations of the current IAM Identity Center OIDC\\n      implementation, see <i>Considerations for Using this Guide</i> in the <a href=\\\"https://docs.aws.amazon.com/singlesignon/latest/OIDCAPIReference/Welcome.html\\\">IAM Identity Center\\n        OIDC API Reference</a>.</p>\"\n                    }\n                },\n                \"assertion\": {\n                    \"target\": \"com.amazonaws.ssooidc#Assertion\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Used only when calling this API for the JWT Bearer grant type. This value specifies the\\n      JSON Web Token (JWT) issued by a trusted token issuer. To authorize a trusted token issuer,\\n      configure the JWT Bearer GrantOptions for the application.</p>\"\n                    }\n                },\n                \"scope\": {\n                    \"target\": \"com.amazonaws.ssooidc#Scopes\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The list of scopes for which authorization is requested. The access token that is issued\\n      is limited to the scopes that are granted. If the value is not specified, IAM Identity Center authorizes all\\n      scopes configured for the application, including the following default scopes:\\n        <code>openid</code>, <code>aws</code>, <code>sts:identity_context</code>.</p>\"\n                    }\n                },\n                \"redirectUri\": {\n                    \"target\": \"com.amazonaws.ssooidc#URI\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Used only when calling this API for the Authorization Code grant type. This value\\n      specifies the location of the client or application that has registered to receive the\\n      authorization code. </p>\"\n                    }\n                },\n                \"subjectToken\": {\n                    \"target\": \"com.amazonaws.ssooidc#SubjectToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Used only when calling this API for the Token Exchange grant type. This value specifies\\n      the subject of the exchange. The value of the subject token must be an access token issued by\\n      IAM Identity Center to a different client or application. The access token must have authorized scopes that\\n      indicate the requested application as a target audience.</p>\"\n                    }\n                },\n                \"subjectTokenType\": {\n                    \"target\": \"com.amazonaws.ssooidc#TokenTypeURI\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Used only when calling this API for the Token Exchange grant type. This value specifies\\n      the type of token that is passed as the subject of the exchange. The following value is\\n      supported:</p>\\n         <p>* Access Token - <code>urn:ietf:params:oauth:token-type:access_token</code>\\n         </p>\"\n                    }\n                },\n                \"requestedTokenType\": {\n                    \"target\": \"com.amazonaws.ssooidc#TokenTypeURI\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Used only when calling this API for the Token Exchange grant type. This value specifies\\n      the type of token that the requester can receive. The following values are supported:</p>\\n         <p>* Access Token - <code>urn:ietf:params:oauth:token-type:access_token</code>\\n         </p>\\n         <p>* Refresh Token - <code>urn:ietf:params:oauth:token-type:refresh_token</code>\\n         </p>\"\n                    }\n                },\n                \"codeVerifier\": {\n                    \"target\": \"com.amazonaws.ssooidc#CodeVerifier\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Used only when calling this API for the Authorization Code grant type. This value is\\n      generated by the client and presented to validate the original code challenge value the client\\n      passed at authorization time.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ssooidc#CreateTokenWithIAMResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"accessToken\": {\n                    \"target\": \"com.amazonaws.ssooidc#AccessToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A bearer token to access Amazon Web Services accounts and applications assigned to a user.</p>\"\n                    }\n                },\n                \"tokenType\": {\n                    \"target\": \"com.amazonaws.ssooidc#TokenType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Used to notify the requester that the returned token is an access token. The supported\\n      token type is <code>Bearer</code>.</p>\"\n                    }\n                },\n                \"expiresIn\": {\n                    \"target\": \"com.amazonaws.ssooidc#ExpirationInSeconds\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>Indicates the time in seconds when an access token will expire.</p>\"\n                    }\n                },\n                \"refreshToken\": {\n                    \"target\": \"com.amazonaws.ssooidc#RefreshToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A token that, if present, can be used to refresh a previously issued access token that\\n      might have expired.</p>\\n         <p>For more information about the features and limitations of the current IAM Identity Center OIDC\\n      implementation, see <i>Considerations for Using this Guide</i> in the <a href=\\\"https://docs.aws.amazon.com/singlesignon/latest/OIDCAPIReference/Welcome.html\\\">IAM Identity Center\\n        OIDC API Reference</a>.</p>\"\n                    }\n                },\n                \"idToken\": {\n                    \"target\": \"com.amazonaws.ssooidc#IdToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A JSON Web Token (JWT) that identifies the user associated with the issued access token.\\n    </p>\"\n                    }\n                },\n                \"issuedTokenType\": {\n                    \"target\": \"com.amazonaws.ssooidc#TokenTypeURI\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates the type of tokens that are issued by IAM Identity Center. The following values are supported: </p>\\n         <p>* Access Token - <code>urn:ietf:params:oauth:token-type:access_token</code>\\n         </p>\\n         <p>* Refresh Token - <code>urn:ietf:params:oauth:token-type:refresh_token</code>\\n         </p>\"\n                    }\n                },\n                \"scope\": {\n                    \"target\": \"com.amazonaws.ssooidc#Scopes\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The list of scopes for which authorization is granted. The access token that is issued is\\n      limited to the scopes that are granted.</p>\"\n                    }\n                },\n                \"awsAdditionalDetails\": {\n                    \"target\": \"com.amazonaws.ssooidc#AwsAdditionalDetails\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A structure containing information from IAM Identity Center managed user and group\\n      information.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ssooidc#DeviceCode\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ssooidc#Error\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ssooidc#ErrorDescription\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ssooidc#ExpirationInSeconds\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#default\": 0\n            }\n        },\n        \"com.amazonaws.ssooidc#ExpiredTokenException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"error\": {\n                    \"target\": \"com.amazonaws.ssooidc#Error\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Single error code. For this exception the value will be <code>expired_token</code>.</p>\"\n                    }\n                },\n                \"error_description\": {\n                    \"target\": \"com.amazonaws.ssooidc#ErrorDescription\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Human-readable text providing additional information, used to assist the client developer\\n      in understanding the error that occurred.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Indicates that the token issued by the service is expired and is no longer valid.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.ssooidc#GrantType\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ssooidc#GrantTypes\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ssooidc#GrantType\"\n            }\n        },\n        \"com.amazonaws.ssooidc#IdToken\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#sensitive\": {}\n            }\n        },\n        \"com.amazonaws.ssooidc#IdentityContext\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ssooidc#InternalServerException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"error\": {\n                    \"target\": \"com.amazonaws.ssooidc#Error\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Single error code. For this exception the value will be <code>server_error</code>.</p>\"\n                    }\n                },\n                \"error_description\": {\n                    \"target\": \"com.amazonaws.ssooidc#ErrorDescription\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Human-readable text providing additional information, used to assist the client developer\\n      in understanding the error that occurred.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Indicates that an error from the service occurred while trying to process a\\n      request.</p>\",\n                \"smithy.api#error\": \"server\",\n                \"smithy.api#httpError\": 500\n            }\n        },\n        \"com.amazonaws.ssooidc#IntervalInSeconds\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#default\": 0\n            }\n        },\n        \"com.amazonaws.ssooidc#InvalidClientException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"error\": {\n                    \"target\": \"com.amazonaws.ssooidc#Error\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Single error code. For this exception the value will be\\n      <code>invalid_client</code>.</p>\"\n                    }\n                },\n                \"error_description\": {\n                    \"target\": \"com.amazonaws.ssooidc#ErrorDescription\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Human-readable text providing additional information, used to assist the client developer\\n      in understanding the error that occurred.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Indicates that the <code>clientId</code> or <code>clientSecret</code> in the request is\\n      invalid. For example, this can occur when a client sends an incorrect <code>clientId</code> or\\n      an expired <code>clientSecret</code>.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 401\n            }\n        },\n        \"com.amazonaws.ssooidc#InvalidClientMetadataException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"error\": {\n                    \"target\": \"com.amazonaws.ssooidc#Error\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Single error code. For this exception the value will be\\n        <code>invalid_client_metadata</code>.</p>\"\n                    }\n                },\n                \"error_description\": {\n                    \"target\": \"com.amazonaws.ssooidc#ErrorDescription\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Human-readable text providing additional information, used to assist the client developer\\n      in understanding the error that occurred.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Indicates that the client information sent in the request during registration is\\n      invalid.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.ssooidc#InvalidGrantException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"error\": {\n                    \"target\": \"com.amazonaws.ssooidc#Error\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Single error code. For this exception the value will be <code>invalid_grant</code>.</p>\"\n                    }\n                },\n                \"error_description\": {\n                    \"target\": \"com.amazonaws.ssooidc#ErrorDescription\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Human-readable text providing additional information, used to assist the client developer\\n      in understanding the error that occurred.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Indicates that a request contains an invalid grant. This can occur if a client makes a\\n        <a>CreateToken</a> request with an invalid grant type.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.ssooidc#InvalidRedirectUriException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"error\": {\n                    \"target\": \"com.amazonaws.ssooidc#Error\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Single error code. For this exception the value will be\\n      <code>invalid_redirect_uri</code>.</p>\"\n                    }\n                },\n                \"error_description\": {\n                    \"target\": \"com.amazonaws.ssooidc#ErrorDescription\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Human-readable text providing additional information, used to assist the client developer\\n      in understanding the error that occurred.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Indicates that one or more redirect URI in the request is not supported for this\\n      operation.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.ssooidc#InvalidRequestException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"error\": {\n                    \"target\": \"com.amazonaws.ssooidc#Error\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Single error code. For this exception the value will be\\n      <code>invalid_request</code>.</p>\"\n                    }\n                },\n                \"reason\": {\n                    \"target\": \"com.amazonaws.ssooidc#InvalidRequestExceptionReason\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A string that uniquely identifies a reason for the error.</p>\"\n                    }\n                },\n                \"error_description\": {\n                    \"target\": \"com.amazonaws.ssooidc#ErrorDescription\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Human-readable text providing additional information, used to assist the client developer\\n      in understanding the error that occurred.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Indicates that something is wrong with the input to the request. For example, a required\\n      parameter might be missing or out of range.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.ssooidc#InvalidRequestExceptionReason\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"KMS_KEY_NOT_FOUND\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"KMS_NotFoundException\"\n                    }\n                },\n                \"KMS_INVALID_KEY_USAGE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"KMS_InvalidKeyUsageException\"\n                    }\n                },\n                \"KMS_INVALID_STATE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"KMS_InvalidStateException\"\n                    }\n                },\n                \"KMS_DISABLED_KEY\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"KMS_DisabledException\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.ssooidc#InvalidRequestRegionException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"error\": {\n                    \"target\": \"com.amazonaws.ssooidc#Error\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Single error code. For this exception the value will be\\n      <code>invalid_request</code>.</p>\"\n                    }\n                },\n                \"error_description\": {\n                    \"target\": \"com.amazonaws.ssooidc#ErrorDescription\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Human-readable text providing additional information, used to assist the client developer\\n      in understanding the error that occurred.</p>\"\n                    }\n                },\n                \"endpoint\": {\n                    \"target\": \"com.amazonaws.ssooidc#Location\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates the IAM Identity Center endpoint which the requester may call with this token.</p>\"\n                    }\n                },\n                \"region\": {\n                    \"target\": \"com.amazonaws.ssooidc#Region\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates the region which the requester may call with this token.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Indicates that a token provided as input to the request was issued by and is only usable\\n      by calling IAM Identity Center endpoints in another region.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.ssooidc#InvalidScopeException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"error\": {\n                    \"target\": \"com.amazonaws.ssooidc#Error\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Single error code. For this exception the value will be <code>invalid_scope</code>.</p>\"\n                    }\n                },\n                \"error_description\": {\n                    \"target\": \"com.amazonaws.ssooidc#ErrorDescription\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Human-readable text providing additional information, used to assist the client developer\\n      in understanding the error that occurred.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Indicates that the scope provided in the request is invalid.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.ssooidc#Location\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ssooidc#LongTimeStampType\": {\n            \"type\": \"long\",\n            \"traits\": {\n                \"smithy.api#default\": 0\n            }\n        },\n        \"com.amazonaws.ssooidc#RedirectUris\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ssooidc#URI\"\n            }\n        },\n        \"com.amazonaws.ssooidc#RefreshToken\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#sensitive\": {}\n            }\n        },\n        \"com.amazonaws.ssooidc#Region\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ssooidc#RegisterClient\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ssooidc#RegisterClientRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ssooidc#RegisterClientResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.ssooidc#InternalServerException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ssooidc#InvalidClientMetadataException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ssooidc#InvalidRedirectUriException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ssooidc#InvalidRequestException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ssooidc#InvalidScopeException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ssooidc#SlowDownException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ssooidc#UnsupportedGrantTypeException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#auth\": [],\n                \"smithy.api#documentation\": \"<p>Registers a public client with IAM Identity Center. This allows clients to perform authorization using\\n      the authorization code grant with Proof Key for Code Exchange (PKCE) or the device\\n      code grant.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"Call OAuth/OIDC /register-client endpoint\",\n                        \"documentation\": \"\",\n                        \"input\": {\n                            \"clientName\": \"My IDE Plugin\",\n                            \"clientType\": \"public\",\n                            \"scopes\": [\n                                \"sso:account:access\",\n                                \"codewhisperer:completions\"\n                            ],\n                            \"redirectUris\": [\n                                \"127.0.0.1:PORT/oauth/callback\"\n                            ],\n                            \"grantTypes\": [\n                                \"authorization_code\",\n                                \"refresh_token\"\n                            ],\n                            \"issuerUrl\": \"https://identitycenter.amazonaws.com/ssoins-1111111111111111\",\n                            \"entitledApplicationArn\": \"arn:aws:sso::ACCOUNTID:application/ssoins-1111111111111111/apl-1111111111111111\"\n                        },\n                        \"output\": {\n                            \"clientId\": \"_yzkThXVzLWVhc3QtMQEXAMPLECLIENTID\",\n                            \"clientSecret\": \"VERYLONGSECRETeyJraWQiOiJrZXktMTU2NDAyODA5OSIsImFsZyI6IkhTMzg0In0\",\n                            \"clientIdIssuedAt\": 1579725929,\n                            \"clientSecretExpiresAt\": 1587584729\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"POST\",\n                    \"uri\": \"/client/register\",\n                    \"code\": 200\n                },\n                \"smithy.api#optionalAuth\": {}\n            }\n        },\n        \"com.amazonaws.ssooidc#RegisterClientRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"clientName\": {\n                    \"target\": \"com.amazonaws.ssooidc#ClientName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The friendly name of the client.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"clientType\": {\n                    \"target\": \"com.amazonaws.ssooidc#ClientType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of client. The service supports only <code>public</code> as a client type.\\n      Anything other than public will be rejected by the service.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"scopes\": {\n                    \"target\": \"com.amazonaws.ssooidc#Scopes\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The list of scopes that are defined by the client. Upon authorization, this list is used\\n      to restrict permissions when granting an access token.</p>\"\n                    }\n                },\n                \"redirectUris\": {\n                    \"target\": \"com.amazonaws.ssooidc#RedirectUris\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The list of redirect URI that are defined by the client. At completion of authorization,\\n      this list is used to restrict what locations the user agent can be redirected back to.</p>\"\n                    }\n                },\n                \"grantTypes\": {\n                    \"target\": \"com.amazonaws.ssooidc#GrantTypes\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The list of OAuth 2.0 grant types that are defined by the client. This list is used to\\n      restrict the token granting flows available to the client. Supports the following OAuth 2.0\\n      grant types: Authorization Code, Device Code, and Refresh Token. </p>\\n         <p>* Authorization Code - <code>authorization_code</code>\\n         </p>\\n         <p>* Device Code - <code>urn:ietf:params:oauth:grant-type:device_code</code>\\n         </p>\\n         <p>* Refresh Token - <code>refresh_token</code>\\n         </p>\"\n                    }\n                },\n                \"issuerUrl\": {\n                    \"target\": \"com.amazonaws.ssooidc#URI\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The IAM Identity Center Issuer URL associated with an instance of IAM Identity Center. This value is needed for user\\n      access to resources through the client.</p>\"\n                    }\n                },\n                \"entitledApplicationArn\": {\n                    \"target\": \"com.amazonaws.ssooidc#ArnType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>This IAM Identity Center application ARN is used to define administrator-managed configuration for\\n      public client access to resources. At authorization, the scopes, grants, and redirect URI\\n      available to this client will be restricted by this application resource.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ssooidc#RegisterClientResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"clientId\": {\n                    \"target\": \"com.amazonaws.ssooidc#ClientId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The unique identifier string for each client. This client uses this identifier to get\\n      authenticated by the service in subsequent calls.</p>\"\n                    }\n                },\n                \"clientSecret\": {\n                    \"target\": \"com.amazonaws.ssooidc#ClientSecret\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A secret string generated for the client. The client will use this string to get\\n      authenticated by the service in subsequent calls.</p>\"\n                    }\n                },\n                \"clientIdIssuedAt\": {\n                    \"target\": \"com.amazonaws.ssooidc#LongTimeStampType\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>Indicates the time at which the <code>clientId</code> and <code>clientSecret</code> were\\n      issued.</p>\"\n                    }\n                },\n                \"clientSecretExpiresAt\": {\n                    \"target\": \"com.amazonaws.ssooidc#LongTimeStampType\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>Indicates the time at which the <code>clientId</code> and <code>clientSecret</code> will\\n      become invalid.</p>\"\n                    }\n                },\n                \"authorizationEndpoint\": {\n                    \"target\": \"com.amazonaws.ssooidc#URI\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An endpoint that the client can use to request authorization.</p>\"\n                    }\n                },\n                \"tokenEndpoint\": {\n                    \"target\": \"com.amazonaws.ssooidc#URI\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An endpoint that the client can use to create tokens.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ssooidc#Scope\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ssooidc#Scopes\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.ssooidc#Scope\"\n            }\n        },\n        \"com.amazonaws.ssooidc#SlowDownException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"error\": {\n                    \"target\": \"com.amazonaws.ssooidc#Error\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Single error code. For this exception the value will be <code>slow_down</code>.</p>\"\n                    }\n                },\n                \"error_description\": {\n                    \"target\": \"com.amazonaws.ssooidc#ErrorDescription\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Human-readable text providing additional information, used to assist the client developer\\n      in understanding the error that occurred.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Indicates that the client is making the request too frequently and is more than the\\n      service can handle. </p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.ssooidc#StartDeviceAuthorization\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.ssooidc#StartDeviceAuthorizationRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.ssooidc#StartDeviceAuthorizationResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.ssooidc#InternalServerException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ssooidc#InvalidClientException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ssooidc#InvalidRequestException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ssooidc#SlowDownException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.ssooidc#UnauthorizedClientException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#auth\": [],\n                \"smithy.api#documentation\": \"<p>Initiates device authorization by requesting a pair of verification codes from the\\n      authorization service.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"Call OAuth/OIDC /start-device-authorization endpoint\",\n                        \"documentation\": \"\",\n                        \"input\": {\n                            \"clientId\": \"_yzkThXVzLWVhc3QtMQEXAMPLECLIENTID\",\n                            \"clientSecret\": \"VERYLONGSECRETeyJraWQiOiJrZXktMTU2NDAyODA5OSIsImFsZyI6IkhTMzg0In0\",\n                            \"startUrl\": \"https://identitycenter.amazonaws.com/ssoins-111111111111\"\n                        },\n                        \"output\": {\n                            \"deviceCode\": \"yJraWQiOiJrZXktMTU2Njk2ODA4OCIsImFsZyI6IkhTMzIn0EXAMPLEDEVICECODE\",\n                            \"userCode\": \"makdfsk83yJraWQiOiJrZXktMTU2Njk2sImFsZyI6IkhTMzIn0EXAMPLEUSERCODE\",\n                            \"verificationUri\": \"https://directory-alias-example.awsapps.com/start/#/device\",\n                            \"verificationUriComplete\": \"https://directory-alias-example.awsapps.com/start/#/device?user_code=makdfsk83yJraWQiOiJrZXktMTU2Njk2sImFsZyI6IkhTMzIn0EXAMPLEUSERCODE\",\n                            \"expiresIn\": 1579729529,\n                            \"interval\": 1\n                        }\n                    }\n                ],\n                \"smithy.api#http\": {\n                    \"method\": \"POST\",\n                    \"uri\": \"/device_authorization\",\n                    \"code\": 200\n                },\n                \"smithy.api#optionalAuth\": {}\n            }\n        },\n        \"com.amazonaws.ssooidc#StartDeviceAuthorizationRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"clientId\": {\n                    \"target\": \"com.amazonaws.ssooidc#ClientId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The unique identifier string for the client that is registered with IAM Identity Center. This value\\n      should come from the persisted result of the <a>RegisterClient</a> API\\n      operation.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"clientSecret\": {\n                    \"target\": \"com.amazonaws.ssooidc#ClientSecret\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A secret string that is generated for the client. This value should come from the\\n      persisted result of the <a>RegisterClient</a> API operation.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"startUrl\": {\n                    \"target\": \"com.amazonaws.ssooidc#URI\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The URL for the Amazon Web Services access portal. For more information, see <a href=\\\"https://docs.aws.amazon.com/singlesignon/latest/userguide/using-the-portal.html\\\">Using\\n        the Amazon Web Services access portal</a> in the <i>IAM Identity Center User Guide</i>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.ssooidc#StartDeviceAuthorizationResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"deviceCode\": {\n                    \"target\": \"com.amazonaws.ssooidc#DeviceCode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The short-lived code that is used by the device when polling for a session token.</p>\"\n                    }\n                },\n                \"userCode\": {\n                    \"target\": \"com.amazonaws.ssooidc#UserCode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A one-time user verification code. This is needed to authorize an in-use device.</p>\"\n                    }\n                },\n                \"verificationUri\": {\n                    \"target\": \"com.amazonaws.ssooidc#URI\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The URI of the verification page that takes the <code>userCode</code> to authorize the\\n      device.</p>\"\n                    }\n                },\n                \"verificationUriComplete\": {\n                    \"target\": \"com.amazonaws.ssooidc#URI\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An alternate URL that the client can use to automatically launch a browser. This process\\n      skips the manual step in which the user visits the verification page and enters their\\n      code.</p>\"\n                    }\n                },\n                \"expiresIn\": {\n                    \"target\": \"com.amazonaws.ssooidc#ExpirationInSeconds\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>Indicates the number of seconds in which the verification code will become invalid.</p>\"\n                    }\n                },\n                \"interval\": {\n                    \"target\": \"com.amazonaws.ssooidc#IntervalInSeconds\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>Indicates the number of seconds the client must wait between attempts when polling for a\\n      session.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.ssooidc#SubjectToken\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#sensitive\": {}\n            }\n        },\n        \"com.amazonaws.ssooidc#TokenType\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ssooidc#TokenTypeURI\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ssooidc#URI\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.ssooidc#UnauthorizedClientException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"error\": {\n                    \"target\": \"com.amazonaws.ssooidc#Error\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Single error code. For this exception the value will be\\n      <code>unauthorized_client</code>.</p>\"\n                    }\n                },\n                \"error_description\": {\n                    \"target\": \"com.amazonaws.ssooidc#ErrorDescription\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Human-readable text providing additional information, used to assist the client developer\\n      in understanding the error that occurred.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Indicates that the client is not currently authorized to make the request. This can happen\\n      when a <code>clientId</code> is not issued for a public client.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.ssooidc#UnsupportedGrantTypeException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"error\": {\n                    \"target\": \"com.amazonaws.ssooidc#Error\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Single error code. For this exception the value will be\\n        <code>unsupported_grant_type</code>.</p>\"\n                    }\n                },\n                \"error_description\": {\n                    \"target\": \"com.amazonaws.ssooidc#ErrorDescription\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Human-readable text providing additional information, used to assist the client developer\\n      in understanding the error that occurred.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Indicates that the grant type in the request is not supported by the service.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.ssooidc#UserCode\": {\n            \"type\": \"string\"\n        }\n    }\n}\n"
  },
  {
    "path": "aws/sdk/aws-models/sso.json",
    "content": "{\n    \"smithy\": \"2.0\",\n    \"metadata\": {\n        \"suppressions\": [\n            {\n                \"id\": \"HttpMethodSemantics\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"HttpResponseCodeSemantics\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"PaginatedTrait\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"HttpHeaderTrait\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"HttpUriConflict\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"Service\",\n                \"namespace\": \"*\"\n            }\n        ]\n    },\n    \"shapes\": {\n        \"com.amazonaws.sso#AccessKeyType\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.sso#AccessTokenType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#sensitive\": {}\n            }\n        },\n        \"com.amazonaws.sso#AccountIdType\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.sso#AccountInfo\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"accountId\": {\n                    \"target\": \"com.amazonaws.sso#AccountIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The identifier of the AWS account that is assigned to the user.</p>\"\n                    }\n                },\n                \"accountName\": {\n                    \"target\": \"com.amazonaws.sso#AccountNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The display name of the AWS account that is assigned to the user.</p>\"\n                    }\n                },\n                \"emailAddress\": {\n                    \"target\": \"com.amazonaws.sso#EmailAddressType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The email address of the AWS account that is assigned to the user.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Provides information about your AWS account.</p>\"\n            }\n        },\n        \"com.amazonaws.sso#AccountListType\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.sso#AccountInfo\"\n            }\n        },\n        \"com.amazonaws.sso#AccountNameType\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.sso#EmailAddressType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 254\n                }\n            }\n        },\n        \"com.amazonaws.sso#ErrorDescription\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.sso#ExpirationTimestampType\": {\n            \"type\": \"long\",\n            \"traits\": {\n                \"smithy.api#default\": 0\n            }\n        },\n        \"com.amazonaws.sso#GetRoleCredentials\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.sso#GetRoleCredentialsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.sso#GetRoleCredentialsResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.sso#InvalidRequestException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.sso#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.sso#TooManyRequestsException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.sso#UnauthorizedException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#auth\": [],\n                \"smithy.api#documentation\": \"<p>Returns the STS short-term credentials for a given role name that is assigned to the\\n      user.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/federation/credentials\",\n                    \"code\": 200\n                },\n                \"smithy.api#optionalAuth\": {}\n            }\n        },\n        \"com.amazonaws.sso#GetRoleCredentialsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"roleName\": {\n                    \"target\": \"com.amazonaws.sso#RoleNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The friendly name of the role that is assigned to the user.</p>\",\n                        \"smithy.api#httpQuery\": \"role_name\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"accountId\": {\n                    \"target\": \"com.amazonaws.sso#AccountIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The identifier for the AWS account that is assigned to the user.</p>\",\n                        \"smithy.api#httpQuery\": \"account_id\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"accessToken\": {\n                    \"target\": \"com.amazonaws.sso#AccessTokenType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token issued by the <code>CreateToken</code> API call. For more information, see\\n        <a href=\\\"https://docs.aws.amazon.com/singlesignon/latest/OIDCAPIReference/API_CreateToken.html\\\">CreateToken</a> in the <i>IAM Identity Center OIDC API Reference Guide</i>.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amz-sso_bearer_token\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.sso#GetRoleCredentialsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"roleCredentials\": {\n                    \"target\": \"com.amazonaws.sso#RoleCredentials\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The credentials for the role that is assigned to the user.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.sso#InvalidRequestException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.sso#ErrorDescription\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Indicates that a problem occurred with the input to the request. For example, a required\\n      parameter might be missing or out of range.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.sso#ListAccountRoles\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.sso#ListAccountRolesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.sso#ListAccountRolesResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.sso#InvalidRequestException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.sso#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.sso#TooManyRequestsException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.sso#UnauthorizedException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#auth\": [],\n                \"smithy.api#documentation\": \"<p>Lists all roles that are assigned to the user for a given AWS account.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/assignment/roles\",\n                    \"code\": 200\n                },\n                \"smithy.api#optionalAuth\": {},\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"nextToken\",\n                    \"outputToken\": \"nextToken\",\n                    \"items\": \"roleList\",\n                    \"pageSize\": \"maxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.sso#ListAccountRolesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"nextToken\": {\n                    \"target\": \"com.amazonaws.sso#NextTokenType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The page token from the previous response output when you request subsequent pages.</p>\",\n                        \"smithy.api#httpQuery\": \"next_token\"\n                    }\n                },\n                \"maxResults\": {\n                    \"target\": \"com.amazonaws.sso#MaxResultType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of items that clients can request per page.</p>\",\n                        \"smithy.api#httpQuery\": \"max_result\"\n                    }\n                },\n                \"accessToken\": {\n                    \"target\": \"com.amazonaws.sso#AccessTokenType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token issued by the <code>CreateToken</code> API call. For more information, see\\n        <a href=\\\"https://docs.aws.amazon.com/singlesignon/latest/OIDCAPIReference/API_CreateToken.html\\\">CreateToken</a> in the <i>IAM Identity Center OIDC API Reference Guide</i>.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amz-sso_bearer_token\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"accountId\": {\n                    \"target\": \"com.amazonaws.sso#AccountIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The identifier for the AWS account that is assigned to the user.</p>\",\n                        \"smithy.api#httpQuery\": \"account_id\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.sso#ListAccountRolesResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"nextToken\": {\n                    \"target\": \"com.amazonaws.sso#NextTokenType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The page token client that is used to retrieve the list of accounts.</p>\"\n                    }\n                },\n                \"roleList\": {\n                    \"target\": \"com.amazonaws.sso#RoleListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A paginated response with the list of roles and the next token if more results are\\n      available.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.sso#ListAccounts\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.sso#ListAccountsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.sso#ListAccountsResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.sso#InvalidRequestException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.sso#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.sso#TooManyRequestsException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.sso#UnauthorizedException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#auth\": [],\n                \"smithy.api#documentation\": \"<p>Lists all AWS accounts assigned to the user. These AWS accounts are assigned by the\\n      administrator of the account. For more information, see <a href=\\\"https://docs.aws.amazon.com/singlesignon/latest/userguide/useraccess.html#assignusers\\\">Assign User Access</a> in the <i>IAM Identity Center User Guide</i>. This operation\\n      returns a paginated response.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/assignment/accounts\",\n                    \"code\": 200\n                },\n                \"smithy.api#optionalAuth\": {},\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"nextToken\",\n                    \"outputToken\": \"nextToken\",\n                    \"items\": \"accountList\",\n                    \"pageSize\": \"maxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.sso#ListAccountsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"nextToken\": {\n                    \"target\": \"com.amazonaws.sso#NextTokenType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>(Optional) When requesting subsequent pages, this is the page token from the previous\\n      response output.</p>\",\n                        \"smithy.api#httpQuery\": \"next_token\"\n                    }\n                },\n                \"maxResults\": {\n                    \"target\": \"com.amazonaws.sso#MaxResultType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>This is the number of items clients can request per page.</p>\",\n                        \"smithy.api#httpQuery\": \"max_result\"\n                    }\n                },\n                \"accessToken\": {\n                    \"target\": \"com.amazonaws.sso#AccessTokenType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token issued by the <code>CreateToken</code> API call. For more information, see\\n        <a href=\\\"https://docs.aws.amazon.com/singlesignon/latest/OIDCAPIReference/API_CreateToken.html\\\">CreateToken</a> in the <i>IAM Identity Center OIDC API Reference Guide</i>.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amz-sso_bearer_token\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.sso#ListAccountsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"nextToken\": {\n                    \"target\": \"com.amazonaws.sso#NextTokenType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The page token client that is used to retrieve the list of accounts.</p>\"\n                    }\n                },\n                \"accountList\": {\n                    \"target\": \"com.amazonaws.sso#AccountListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A paginated response with the list of account information and the next token if more\\n      results are available.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.sso#Logout\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.sso#LogoutRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.sso#InvalidRequestException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.sso#TooManyRequestsException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.sso#UnauthorizedException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#auth\": [],\n                \"smithy.api#documentation\": \"<p>Removes the locally stored SSO tokens from the client-side cache and sends an API call to\\n      the IAM Identity Center service to invalidate the corresponding server-side IAM Identity Center sign in\\n      session.</p>\\n         <note>\\n            <p>If a user uses IAM Identity Center to access the AWS CLI, the user’s IAM Identity Center sign in session is\\n        used to obtain an IAM session, as specified in the corresponding IAM Identity Center permission set.\\n        More specifically, IAM Identity Center assumes an IAM role in the target account on behalf of the user,\\n        and the corresponding temporary AWS credentials are returned to the client.</p>\\n            <p>After user logout, any existing IAM role sessions that were created by using IAM Identity Center\\n        permission sets continue based on the duration configured in the permission set.\\n        For more information, see <a href=\\\"https://docs.aws.amazon.com/singlesignon/latest/userguide/authconcept.html\\\">User\\n          authentications</a> in the <i>IAM Identity Center User\\n        Guide</i>.</p>\\n         </note>\",\n                \"smithy.api#http\": {\n                    \"method\": \"POST\",\n                    \"uri\": \"/logout\",\n                    \"code\": 200\n                },\n                \"smithy.api#optionalAuth\": {}\n            }\n        },\n        \"com.amazonaws.sso#LogoutRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"accessToken\": {\n                    \"target\": \"com.amazonaws.sso#AccessTokenType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token issued by the <code>CreateToken</code> API call. For more information, see\\n        <a href=\\\"https://docs.aws.amazon.com/singlesignon/latest/OIDCAPIReference/API_CreateToken.html\\\">CreateToken</a> in the <i>IAM Identity Center OIDC API Reference Guide</i>.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amz-sso_bearer_token\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.sso#MaxResultType\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 100\n                }\n            }\n        },\n        \"com.amazonaws.sso#NextTokenType\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.sso#ResourceNotFoundException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.sso#ErrorDescription\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The specified resource doesn't exist.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 404\n            }\n        },\n        \"com.amazonaws.sso#RoleCredentials\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"accessKeyId\": {\n                    \"target\": \"com.amazonaws.sso#AccessKeyType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The identifier used for the temporary security credentials. For more information, see\\n        <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_use-resources.html\\\">Using Temporary Security Credentials to Request Access to AWS Resources</a> in the\\n        <i>AWS IAM User Guide</i>.</p>\"\n                    }\n                },\n                \"secretAccessKey\": {\n                    \"target\": \"com.amazonaws.sso#SecretAccessKeyType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The key that is used to sign the request. For more information, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_use-resources.html\\\">Using Temporary Security Credentials to Request Access to AWS Resources</a> in the\\n        <i>AWS IAM User Guide</i>.</p>\"\n                    }\n                },\n                \"sessionToken\": {\n                    \"target\": \"com.amazonaws.sso#SessionTokenType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token used for temporary credentials. For more information, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_use-resources.html\\\">Using Temporary Security Credentials to Request Access to AWS Resources</a> in the\\n        <i>AWS IAM User Guide</i>.</p>\"\n                    }\n                },\n                \"expiration\": {\n                    \"target\": \"com.amazonaws.sso#ExpirationTimestampType\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The date on which temporary security credentials expire.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Provides information about the role credentials that are assigned to the user.</p>\"\n            }\n        },\n        \"com.amazonaws.sso#RoleInfo\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"roleName\": {\n                    \"target\": \"com.amazonaws.sso#RoleNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The friendly name of the role that is assigned to the user.</p>\"\n                    }\n                },\n                \"accountId\": {\n                    \"target\": \"com.amazonaws.sso#AccountIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The identifier of the AWS account assigned to the user.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Provides information about the role that is assigned to the user.</p>\"\n            }\n        },\n        \"com.amazonaws.sso#RoleListType\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.sso#RoleInfo\"\n            }\n        },\n        \"com.amazonaws.sso#RoleNameType\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.sso#SWBPortalService\": {\n            \"type\": \"service\",\n            \"version\": \"2019-06-10\",\n            \"operations\": [\n                {\n                    \"target\": \"com.amazonaws.sso#GetRoleCredentials\"\n                },\n                {\n                    \"target\": \"com.amazonaws.sso#ListAccountRoles\"\n                },\n                {\n                    \"target\": \"com.amazonaws.sso#ListAccounts\"\n                },\n                {\n                    \"target\": \"com.amazonaws.sso#Logout\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#service\": {\n                    \"sdkId\": \"SSO\",\n                    \"arnNamespace\": \"awsssoportal\",\n                    \"cloudFormationName\": \"SSO\",\n                    \"cloudTrailEventSource\": \"sso.amazonaws.com\",\n                    \"endpointPrefix\": \"portal.sso\"\n                },\n                \"aws.auth#sigv4\": {\n                    \"name\": \"awsssoportal\"\n                },\n                \"aws.protocols#restJson1\": {},\n                \"smithy.api#documentation\": \"<p>AWS IAM Identity Center (successor to AWS Single Sign-On) Portal is a web service that makes it easy for you to assign user access to\\n      IAM Identity Center resources such as the AWS access portal. Users can get AWS account applications and roles\\n      assigned to them and get federated into the application.</p>\\n         <note>\\n            <p>Although AWS Single Sign-On was renamed, the <code>sso</code> and\\n          <code>identitystore</code> API namespaces will continue to retain their original name for\\n        backward compatibility purposes. For more information, see <a href=\\\"https://docs.aws.amazon.com/singlesignon/latest/userguide/what-is.html#renamed\\\">IAM Identity Center rename</a>.</p>\\n         </note>\\n         <p>This reference guide describes the IAM Identity Center Portal operations that you can call\\n      programatically and includes detailed information on data types and errors.</p>\\n         <note>\\n            <p>AWS provides SDKs that consist of libraries and sample code for various programming\\n        languages and platforms, such as Java, Ruby, .Net, iOS, or Android. The SDKs provide a\\n        convenient way to create programmatic access to IAM Identity Center and other AWS services. For more\\n        information about the AWS SDKs, including how to download and install them, see <a href=\\\"http://aws.amazon.com/tools/\\\">Tools for Amazon Web Services</a>.</p>\\n         </note>\",\n                \"smithy.api#title\": \"AWS Single Sign-On\",\n                \"smithy.rules#endpointRuleSet\": {\n                    \"version\": \"1.0\",\n                    \"parameters\": {\n                        \"Region\": {\n                            \"builtIn\": \"AWS::Region\",\n                            \"required\": false,\n                            \"documentation\": \"The AWS region used to dispatch the request.\",\n                            \"type\": \"String\"\n                        },\n                        \"UseDualStack\": {\n                            \"builtIn\": \"AWS::UseDualStack\",\n                            \"required\": true,\n                            \"default\": false,\n                            \"documentation\": \"When true, use the dual-stack endpoint. If the configured endpoint does not support dual-stack, dispatching the request MAY return an error.\",\n                            \"type\": \"Boolean\"\n                        },\n                        \"UseFIPS\": {\n                            \"builtIn\": \"AWS::UseFIPS\",\n                            \"required\": true,\n                            \"default\": false,\n                            \"documentation\": \"When true, send this request to the FIPS-compliant regional endpoint. If the configured endpoint does not have a FIPS compliant endpoint, dispatching the request will return an error.\",\n                            \"type\": \"Boolean\"\n                        },\n                        \"Endpoint\": {\n                            \"builtIn\": \"SDK::Endpoint\",\n                            \"required\": false,\n                            \"documentation\": \"Override the endpoint used to send this request\",\n                            \"type\": \"String\"\n                        }\n                    },\n                    \"rules\": [\n                        {\n                            \"conditions\": [\n                                {\n                                    \"fn\": \"isSet\",\n                                    \"argv\": [\n                                        {\n                                            \"ref\": \"Endpoint\"\n                                        }\n                                    ]\n                                }\n                            ],\n                            \"rules\": [\n                                {\n                                    \"conditions\": [\n                                        {\n                                            \"fn\": \"booleanEquals\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"UseFIPS\"\n                                                },\n                                                true\n                                            ]\n                                        }\n                                    ],\n                                    \"error\": \"Invalid Configuration: FIPS and custom endpoint are not supported\",\n                                    \"type\": \"error\"\n                                },\n                                {\n                                    \"conditions\": [\n                                        {\n                                            \"fn\": \"booleanEquals\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"UseDualStack\"\n                                                },\n                                                true\n                                            ]\n                                        }\n                                    ],\n                                    \"error\": \"Invalid Configuration: Dualstack and custom endpoint are not supported\",\n                                    \"type\": \"error\"\n                                },\n                                {\n                                    \"conditions\": [],\n                                    \"endpoint\": {\n                                        \"url\": {\n                                            \"ref\": \"Endpoint\"\n                                        },\n                                        \"properties\": {},\n                                        \"headers\": {}\n                                    },\n                                    \"type\": \"endpoint\"\n                                }\n                            ],\n                            \"type\": \"tree\"\n                        },\n                        {\n                            \"conditions\": [\n                                {\n                                    \"fn\": \"isSet\",\n                                    \"argv\": [\n                                        {\n                                            \"ref\": \"Region\"\n                                        }\n                                    ]\n                                }\n                            ],\n                            \"rules\": [\n                                {\n                                    \"conditions\": [\n                                        {\n                                            \"fn\": \"aws.partition\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"Region\"\n                                                }\n                                            ],\n                                            \"assign\": \"PartitionResult\"\n                                        }\n                                    ],\n                                    \"rules\": [\n                                        {\n                                            \"conditions\": [\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseFIPS\"\n                                                        },\n                                                        true\n                                                    ]\n                                                },\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseDualStack\"\n                                                        },\n                                                        true\n                                                    ]\n                                                }\n                                            ],\n                                            \"rules\": [\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                true,\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"PartitionResult\"\n                                                                        },\n                                                                        \"supportsFIPS\"\n                                                                    ]\n                                                                }\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                true,\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"PartitionResult\"\n                                                                        },\n                                                                        \"supportsDualStack\"\n                                                                    ]\n                                                                }\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"rules\": [\n                                                        {\n                                                            \"conditions\": [],\n                                                            \"endpoint\": {\n                                                                \"url\": \"https://portal.sso-fips.{Region}.{PartitionResult#dualStackDnsSuffix}\",\n                                                                \"properties\": {},\n                                                                \"headers\": {}\n                                                            },\n                                                            \"type\": \"endpoint\"\n                                                        }\n                                                    ],\n                                                    \"type\": \"tree\"\n                                                },\n                                                {\n                                                    \"conditions\": [],\n                                                    \"error\": \"FIPS and DualStack are enabled, but this partition does not support one or both\",\n                                                    \"type\": \"error\"\n                                                }\n                                            ],\n                                            \"type\": \"tree\"\n                                        },\n                                        {\n                                            \"conditions\": [\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseFIPS\"\n                                                        },\n                                                        true\n                                                    ]\n                                                }\n                                            ],\n                                            \"rules\": [\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"PartitionResult\"\n                                                                        },\n                                                                        \"supportsFIPS\"\n                                                                    ]\n                                                                },\n                                                                true\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"rules\": [\n                                                        {\n                                                            \"conditions\": [\n                                                                {\n                                                                    \"fn\": \"stringEquals\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"fn\": \"getAttr\",\n                                                                            \"argv\": [\n                                                                                {\n                                                                                    \"ref\": \"PartitionResult\"\n                                                                                },\n                                                                                \"name\"\n                                                                            ]\n                                                                        },\n                                                                        \"aws-us-gov\"\n                                                                    ]\n                                                                }\n                                                            ],\n                                                            \"endpoint\": {\n                                                                \"url\": \"https://portal.sso.{Region}.amazonaws.com\",\n                                                                \"properties\": {},\n                                                                \"headers\": {}\n                                                            },\n                                                            \"type\": \"endpoint\"\n                                                        },\n                                                        {\n                                                            \"conditions\": [],\n                                                            \"endpoint\": {\n                                                                \"url\": \"https://portal.sso-fips.{Region}.{PartitionResult#dnsSuffix}\",\n                                                                \"properties\": {},\n                                                                \"headers\": {}\n                                                            },\n                                                            \"type\": \"endpoint\"\n                                                        }\n                                                    ],\n                                                    \"type\": \"tree\"\n                                                },\n                                                {\n                                                    \"conditions\": [],\n                                                    \"error\": \"FIPS is enabled but this partition does not support FIPS\",\n                                                    \"type\": \"error\"\n                                                }\n                                            ],\n                                            \"type\": \"tree\"\n                                        },\n                                        {\n                                            \"conditions\": [\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseDualStack\"\n                                                        },\n                                                        true\n                                                    ]\n                                                }\n                                            ],\n                                            \"rules\": [\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                true,\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"PartitionResult\"\n                                                                        },\n                                                                        \"supportsDualStack\"\n                                                                    ]\n                                                                }\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"rules\": [\n                                                        {\n                                                            \"conditions\": [],\n                                                            \"endpoint\": {\n                                                                \"url\": \"https://portal.sso.{Region}.{PartitionResult#dualStackDnsSuffix}\",\n                                                                \"properties\": {},\n                                                                \"headers\": {}\n                                                            },\n                                                            \"type\": \"endpoint\"\n                                                        }\n                                                    ],\n                                                    \"type\": \"tree\"\n                                                },\n                                                {\n                                                    \"conditions\": [],\n                                                    \"error\": \"DualStack is enabled but this partition does not support DualStack\",\n                                                    \"type\": \"error\"\n                                                }\n                                            ],\n                                            \"type\": \"tree\"\n                                        },\n                                        {\n                                            \"conditions\": [],\n                                            \"endpoint\": {\n                                                \"url\": \"https://portal.sso.{Region}.{PartitionResult#dnsSuffix}\",\n                                                \"properties\": {},\n                                                \"headers\": {}\n                                            },\n                                            \"type\": \"endpoint\"\n                                        }\n                                    ],\n                                    \"type\": \"tree\"\n                                }\n                            ],\n                            \"type\": \"tree\"\n                        },\n                        {\n                            \"conditions\": [],\n                            \"error\": \"Invalid Configuration: Missing Region\",\n                            \"type\": \"error\"\n                        }\n                    ]\n                },\n                \"smithy.rules#endpointTests\": {\n                    \"testCases\": [\n                        {\n                            \"documentation\": \"For region ap-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://portal.sso.ap-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-northeast-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://portal.sso.ap-northeast-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-northeast-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-northeast-2 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://portal.sso.ap-northeast-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-northeast-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-northeast-3 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://portal.sso.ap-northeast-3.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-northeast-3\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-south-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://portal.sso.ap-south-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-south-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-southeast-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://portal.sso.ap-southeast-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-southeast-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-southeast-2 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://portal.sso.ap-southeast-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-southeast-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ca-central-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://portal.sso.ca-central-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ca-central-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-central-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://portal.sso.eu-central-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-central-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-north-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://portal.sso.eu-north-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-north-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-south-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://portal.sso.eu-south-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-south-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-west-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://portal.sso.eu-west-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-west-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-west-2 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://portal.sso.eu-west-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-west-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-west-3 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://portal.sso.eu-west-3.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-west-3\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region me-south-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://portal.sso.me-south-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"me-south-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region sa-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://portal.sso.sa-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"sa-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://portal.sso.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-2 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://portal.sso.us-east-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-west-2 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://portal.sso.us-west-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-west-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-1 with FIPS enabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://portal.sso-fips.us-east-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://portal.sso-fips.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-1 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://portal.sso.us-east-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-north-1 with FIPS enabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://portal.sso-fips.cn-north-1.api.amazonwebservices.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-north-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-north-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://portal.sso-fips.cn-north-1.amazonaws.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-north-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-north-1 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://portal.sso.cn-north-1.api.amazonwebservices.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-north-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-north-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://portal.sso.cn-north-1.amazonaws.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-north-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://portal.sso.us-gov-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-west-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://portal.sso.us-gov-west-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-west-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-east-1 with FIPS enabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://portal.sso-fips.us-gov-east-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-east-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://portal.sso.us-gov-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-east-1 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://portal.sso.us-gov-east-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-iso-east-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://portal.sso-fips.us-iso-east-1.c2s.ic.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-iso-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-iso-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://portal.sso.us-iso-east-1.c2s.ic.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-iso-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-isob-east-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://portal.sso-fips.us-isob-east-1.sc2s.sgov.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-isob-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-isob-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://portal.sso.us-isob-east-1.sc2s.sgov.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-isob-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For custom endpoint with region set and fips disabled and dualstack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://example.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"For custom endpoint with region not set and fips disabled and dualstack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://example.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"For custom endpoint with fips enabled and dualstack disabled\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: FIPS and custom endpoint are not supported\"\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false,\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"For custom endpoint with fips disabled and dualstack enabled\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: Dualstack and custom endpoint are not supported\"\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true,\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"Missing region\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: Missing Region\"\n                            }\n                        }\n                    ],\n                    \"version\": \"1.0\"\n                }\n            }\n        },\n        \"com.amazonaws.sso#SecretAccessKeyType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#sensitive\": {}\n            }\n        },\n        \"com.amazonaws.sso#SessionTokenType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#sensitive\": {}\n            }\n        },\n        \"com.amazonaws.sso#TooManyRequestsException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.sso#ErrorDescription\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Indicates that the request is being made too frequently and is more than what the server\\n      can handle.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 429\n            }\n        },\n        \"com.amazonaws.sso#UnauthorizedException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.sso#ErrorDescription\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Indicates that the request is not authorized. This can happen due to an invalid access\\n      token in the request.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 401\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "aws/sdk/aws-models/sts.json",
    "content": "{\n    \"smithy\": \"2.0\",\n    \"metadata\": {\n        \"suppressions\": [\n            {\n                \"id\": \"HttpMethodSemantics\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"HttpResponseCodeSemantics\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"PaginatedTrait\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"HttpHeaderTrait\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"HttpUriConflict\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"Service\",\n                \"namespace\": \"*\"\n            }\n        ]\n    },\n    \"shapes\": {\n        \"com.amazonaws.sts#AWSSecurityTokenServiceV20110615\": {\n            \"type\": \"service\",\n            \"version\": \"2011-06-15\",\n            \"operations\": [\n                {\n                    \"target\": \"com.amazonaws.sts#AssumeRole\"\n                },\n                {\n                    \"target\": \"com.amazonaws.sts#AssumeRoleWithSAML\"\n                },\n                {\n                    \"target\": \"com.amazonaws.sts#AssumeRoleWithWebIdentity\"\n                },\n                {\n                    \"target\": \"com.amazonaws.sts#AssumeRoot\"\n                },\n                {\n                    \"target\": \"com.amazonaws.sts#DecodeAuthorizationMessage\"\n                },\n                {\n                    \"target\": \"com.amazonaws.sts#GetAccessKeyInfo\"\n                },\n                {\n                    \"target\": \"com.amazonaws.sts#GetCallerIdentity\"\n                },\n                {\n                    \"target\": \"com.amazonaws.sts#GetFederationToken\"\n                },\n                {\n                    \"target\": \"com.amazonaws.sts#GetSessionToken\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#service\": {\n                    \"sdkId\": \"STS\",\n                    \"arnNamespace\": \"sts\",\n                    \"cloudFormationName\": \"STS\",\n                    \"cloudTrailEventSource\": \"sts.amazonaws.com\",\n                    \"endpointPrefix\": \"sts\"\n                },\n                \"aws.auth#sigv4\": {\n                    \"name\": \"sts\"\n                },\n                \"aws.protocols#awsQuery\": {},\n                \"smithy.api#documentation\": \"<fullname>Security Token Service</fullname>\\n         <p>Security Token Service (STS) enables you to request temporary, limited-privilege \\n      credentials for users. This guide provides descriptions of the STS API. For \\n      more information about using this service, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp.html\\\">Temporary Security Credentials</a>.</p>\",\n                \"smithy.api#title\": \"AWS Security Token Service\",\n                \"smithy.api#xmlNamespace\": {\n                    \"uri\": \"https://sts.amazonaws.com/doc/2011-06-15/\"\n                },\n                \"smithy.rules#endpointRuleSet\": {\n                    \"version\": \"1.0\",\n                    \"parameters\": {\n                        \"Region\": {\n                            \"builtIn\": \"AWS::Region\",\n                            \"required\": false,\n                            \"documentation\": \"The AWS region used to dispatch the request.\",\n                            \"type\": \"String\"\n                        },\n                        \"UseDualStack\": {\n                            \"builtIn\": \"AWS::UseDualStack\",\n                            \"required\": true,\n                            \"default\": false,\n                            \"documentation\": \"When true, use the dual-stack endpoint. If the configured endpoint does not support dual-stack, dispatching the request MAY return an error.\",\n                            \"type\": \"Boolean\"\n                        },\n                        \"UseFIPS\": {\n                            \"builtIn\": \"AWS::UseFIPS\",\n                            \"required\": true,\n                            \"default\": false,\n                            \"documentation\": \"When true, send this request to the FIPS-compliant regional endpoint. If the configured endpoint does not have a FIPS compliant endpoint, dispatching the request will return an error.\",\n                            \"type\": \"Boolean\"\n                        },\n                        \"Endpoint\": {\n                            \"builtIn\": \"SDK::Endpoint\",\n                            \"required\": false,\n                            \"documentation\": \"Override the endpoint used to send this request\",\n                            \"type\": \"String\"\n                        },\n                        \"UseGlobalEndpoint\": {\n                            \"builtIn\": \"AWS::STS::UseGlobalEndpoint\",\n                            \"required\": true,\n                            \"default\": false,\n                            \"documentation\": \"Whether the global endpoint should be used, rather then the regional endpoint for us-east-1.\",\n                            \"type\": \"Boolean\"\n                        }\n                    },\n                    \"rules\": [\n                        {\n                            \"conditions\": [\n                                {\n                                    \"fn\": \"booleanEquals\",\n                                    \"argv\": [\n                                        {\n                                            \"ref\": \"UseGlobalEndpoint\"\n                                        },\n                                        true\n                                    ]\n                                },\n                                {\n                                    \"fn\": \"not\",\n                                    \"argv\": [\n                                        {\n                                            \"fn\": \"isSet\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"Endpoint\"\n                                                }\n                                            ]\n                                        }\n                                    ]\n                                },\n                                {\n                                    \"fn\": \"isSet\",\n                                    \"argv\": [\n                                        {\n                                            \"ref\": \"Region\"\n                                        }\n                                    ]\n                                },\n                                {\n                                    \"fn\": \"aws.partition\",\n                                    \"argv\": [\n                                        {\n                                            \"ref\": \"Region\"\n                                        }\n                                    ],\n                                    \"assign\": \"PartitionResult\"\n                                },\n                                {\n                                    \"fn\": \"booleanEquals\",\n                                    \"argv\": [\n                                        {\n                                            \"ref\": \"UseFIPS\"\n                                        },\n                                        false\n                                    ]\n                                },\n                                {\n                                    \"fn\": \"booleanEquals\",\n                                    \"argv\": [\n                                        {\n                                            \"ref\": \"UseDualStack\"\n                                        },\n                                        false\n                                    ]\n                                }\n                            ],\n                            \"rules\": [\n                                {\n                                    \"conditions\": [\n                                        {\n                                            \"fn\": \"stringEquals\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"Region\"\n                                                },\n                                                \"ap-northeast-1\"\n                                            ]\n                                        }\n                                    ],\n                                    \"endpoint\": {\n                                        \"url\": \"https://sts.amazonaws.com\",\n                                        \"properties\": {\n                                            \"authSchemes\": [\n                                                {\n                                                    \"name\": \"sigv4\",\n                                                    \"signingName\": \"sts\",\n                                                    \"signingRegion\": \"us-east-1\"\n                                                }\n                                            ]\n                                        },\n                                        \"headers\": {}\n                                    },\n                                    \"type\": \"endpoint\"\n                                },\n                                {\n                                    \"conditions\": [\n                                        {\n                                            \"fn\": \"stringEquals\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"Region\"\n                                                },\n                                                \"ap-south-1\"\n                                            ]\n                                        }\n                                    ],\n                                    \"endpoint\": {\n                                        \"url\": \"https://sts.amazonaws.com\",\n                                        \"properties\": {\n                                            \"authSchemes\": [\n                                                {\n                                                    \"name\": \"sigv4\",\n                                                    \"signingName\": \"sts\",\n                                                    \"signingRegion\": \"us-east-1\"\n                                                }\n                                            ]\n                                        },\n                                        \"headers\": {}\n                                    },\n                                    \"type\": \"endpoint\"\n                                },\n                                {\n                                    \"conditions\": [\n                                        {\n                                            \"fn\": \"stringEquals\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"Region\"\n                                                },\n                                                \"ap-southeast-1\"\n                                            ]\n                                        }\n                                    ],\n                                    \"endpoint\": {\n                                        \"url\": \"https://sts.amazonaws.com\",\n                                        \"properties\": {\n                                            \"authSchemes\": [\n                                                {\n                                                    \"name\": \"sigv4\",\n                                                    \"signingName\": \"sts\",\n                                                    \"signingRegion\": \"us-east-1\"\n                                                }\n                                            ]\n                                        },\n                                        \"headers\": {}\n                                    },\n                                    \"type\": \"endpoint\"\n                                },\n                                {\n                                    \"conditions\": [\n                                        {\n                                            \"fn\": \"stringEquals\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"Region\"\n                                                },\n                                                \"ap-southeast-2\"\n                                            ]\n                                        }\n                                    ],\n                                    \"endpoint\": {\n                                        \"url\": \"https://sts.amazonaws.com\",\n                                        \"properties\": {\n                                            \"authSchemes\": [\n                                                {\n                                                    \"name\": \"sigv4\",\n                                                    \"signingName\": \"sts\",\n                                                    \"signingRegion\": \"us-east-1\"\n                                                }\n                                            ]\n                                        },\n                                        \"headers\": {}\n                                    },\n                                    \"type\": \"endpoint\"\n                                },\n                                {\n                                    \"conditions\": [\n                                        {\n                                            \"fn\": \"stringEquals\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"Region\"\n                                                },\n                                                \"aws-global\"\n                                            ]\n                                        }\n                                    ],\n                                    \"endpoint\": {\n                                        \"url\": \"https://sts.amazonaws.com\",\n                                        \"properties\": {\n                                            \"authSchemes\": [\n                                                {\n                                                    \"name\": \"sigv4\",\n                                                    \"signingName\": \"sts\",\n                                                    \"signingRegion\": \"us-east-1\"\n                                                }\n                                            ]\n                                        },\n                                        \"headers\": {}\n                                    },\n                                    \"type\": \"endpoint\"\n                                },\n                                {\n                                    \"conditions\": [\n                                        {\n                                            \"fn\": \"stringEquals\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"Region\"\n                                                },\n                                                \"ca-central-1\"\n                                            ]\n                                        }\n                                    ],\n                                    \"endpoint\": {\n                                        \"url\": \"https://sts.amazonaws.com\",\n                                        \"properties\": {\n                                            \"authSchemes\": [\n                                                {\n                                                    \"name\": \"sigv4\",\n                                                    \"signingName\": \"sts\",\n                                                    \"signingRegion\": \"us-east-1\"\n                                                }\n                                            ]\n                                        },\n                                        \"headers\": {}\n                                    },\n                                    \"type\": \"endpoint\"\n                                },\n                                {\n                                    \"conditions\": [\n                                        {\n                                            \"fn\": \"stringEquals\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"Region\"\n                                                },\n                                                \"eu-central-1\"\n                                            ]\n                                        }\n                                    ],\n                                    \"endpoint\": {\n                                        \"url\": \"https://sts.amazonaws.com\",\n                                        \"properties\": {\n                                            \"authSchemes\": [\n                                                {\n                                                    \"name\": \"sigv4\",\n                                                    \"signingName\": \"sts\",\n                                                    \"signingRegion\": \"us-east-1\"\n                                                }\n                                            ]\n                                        },\n                                        \"headers\": {}\n                                    },\n                                    \"type\": \"endpoint\"\n                                },\n                                {\n                                    \"conditions\": [\n                                        {\n                                            \"fn\": \"stringEquals\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"Region\"\n                                                },\n                                                \"eu-north-1\"\n                                            ]\n                                        }\n                                    ],\n                                    \"endpoint\": {\n                                        \"url\": \"https://sts.amazonaws.com\",\n                                        \"properties\": {\n                                            \"authSchemes\": [\n                                                {\n                                                    \"name\": \"sigv4\",\n                                                    \"signingName\": \"sts\",\n                                                    \"signingRegion\": \"us-east-1\"\n                                                }\n                                            ]\n                                        },\n                                        \"headers\": {}\n                                    },\n                                    \"type\": \"endpoint\"\n                                },\n                                {\n                                    \"conditions\": [\n                                        {\n                                            \"fn\": \"stringEquals\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"Region\"\n                                                },\n                                                \"eu-west-1\"\n                                            ]\n                                        }\n                                    ],\n                                    \"endpoint\": {\n                                        \"url\": \"https://sts.amazonaws.com\",\n                                        \"properties\": {\n                                            \"authSchemes\": [\n                                                {\n                                                    \"name\": \"sigv4\",\n                                                    \"signingName\": \"sts\",\n                                                    \"signingRegion\": \"us-east-1\"\n                                                }\n                                            ]\n                                        },\n                                        \"headers\": {}\n                                    },\n                                    \"type\": \"endpoint\"\n                                },\n                                {\n                                    \"conditions\": [\n                                        {\n                                            \"fn\": \"stringEquals\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"Region\"\n                                                },\n                                                \"eu-west-2\"\n                                            ]\n                                        }\n                                    ],\n                                    \"endpoint\": {\n                                        \"url\": \"https://sts.amazonaws.com\",\n                                        \"properties\": {\n                                            \"authSchemes\": [\n                                                {\n                                                    \"name\": \"sigv4\",\n                                                    \"signingName\": \"sts\",\n                                                    \"signingRegion\": \"us-east-1\"\n                                                }\n                                            ]\n                                        },\n                                        \"headers\": {}\n                                    },\n                                    \"type\": \"endpoint\"\n                                },\n                                {\n                                    \"conditions\": [\n                                        {\n                                            \"fn\": \"stringEquals\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"Region\"\n                                                },\n                                                \"eu-west-3\"\n                                            ]\n                                        }\n                                    ],\n                                    \"endpoint\": {\n                                        \"url\": \"https://sts.amazonaws.com\",\n                                        \"properties\": {\n                                            \"authSchemes\": [\n                                                {\n                                                    \"name\": \"sigv4\",\n                                                    \"signingName\": \"sts\",\n                                                    \"signingRegion\": \"us-east-1\"\n                                                }\n                                            ]\n                                        },\n                                        \"headers\": {}\n                                    },\n                                    \"type\": \"endpoint\"\n                                },\n                                {\n                                    \"conditions\": [\n                                        {\n                                            \"fn\": \"stringEquals\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"Region\"\n                                                },\n                                                \"sa-east-1\"\n                                            ]\n                                        }\n                                    ],\n                                    \"endpoint\": {\n                                        \"url\": \"https://sts.amazonaws.com\",\n                                        \"properties\": {\n                                            \"authSchemes\": [\n                                                {\n                                                    \"name\": \"sigv4\",\n                                                    \"signingName\": \"sts\",\n                                                    \"signingRegion\": \"us-east-1\"\n                                                }\n                                            ]\n                                        },\n                                        \"headers\": {}\n                                    },\n                                    \"type\": \"endpoint\"\n                                },\n                                {\n                                    \"conditions\": [\n                                        {\n                                            \"fn\": \"stringEquals\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"Region\"\n                                                },\n                                                \"us-east-1\"\n                                            ]\n                                        }\n                                    ],\n                                    \"endpoint\": {\n                                        \"url\": \"https://sts.amazonaws.com\",\n                                        \"properties\": {\n                                            \"authSchemes\": [\n                                                {\n                                                    \"name\": \"sigv4\",\n                                                    \"signingName\": \"sts\",\n                                                    \"signingRegion\": \"us-east-1\"\n                                                }\n                                            ]\n                                        },\n                                        \"headers\": {}\n                                    },\n                                    \"type\": \"endpoint\"\n                                },\n                                {\n                                    \"conditions\": [\n                                        {\n                                            \"fn\": \"stringEquals\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"Region\"\n                                                },\n                                                \"us-east-2\"\n                                            ]\n                                        }\n                                    ],\n                                    \"endpoint\": {\n                                        \"url\": \"https://sts.amazonaws.com\",\n                                        \"properties\": {\n                                            \"authSchemes\": [\n                                                {\n                                                    \"name\": \"sigv4\",\n                                                    \"signingName\": \"sts\",\n                                                    \"signingRegion\": \"us-east-1\"\n                                                }\n                                            ]\n                                        },\n                                        \"headers\": {}\n                                    },\n                                    \"type\": \"endpoint\"\n                                },\n                                {\n                                    \"conditions\": [\n                                        {\n                                            \"fn\": \"stringEquals\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"Region\"\n                                                },\n                                                \"us-west-1\"\n                                            ]\n                                        }\n                                    ],\n                                    \"endpoint\": {\n                                        \"url\": \"https://sts.amazonaws.com\",\n                                        \"properties\": {\n                                            \"authSchemes\": [\n                                                {\n                                                    \"name\": \"sigv4\",\n                                                    \"signingName\": \"sts\",\n                                                    \"signingRegion\": \"us-east-1\"\n                                                }\n                                            ]\n                                        },\n                                        \"headers\": {}\n                                    },\n                                    \"type\": \"endpoint\"\n                                },\n                                {\n                                    \"conditions\": [\n                                        {\n                                            \"fn\": \"stringEquals\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"Region\"\n                                                },\n                                                \"us-west-2\"\n                                            ]\n                                        }\n                                    ],\n                                    \"endpoint\": {\n                                        \"url\": \"https://sts.amazonaws.com\",\n                                        \"properties\": {\n                                            \"authSchemes\": [\n                                                {\n                                                    \"name\": \"sigv4\",\n                                                    \"signingName\": \"sts\",\n                                                    \"signingRegion\": \"us-east-1\"\n                                                }\n                                            ]\n                                        },\n                                        \"headers\": {}\n                                    },\n                                    \"type\": \"endpoint\"\n                                },\n                                {\n                                    \"conditions\": [],\n                                    \"endpoint\": {\n                                        \"url\": \"https://sts.{Region}.{PartitionResult#dnsSuffix}\",\n                                        \"properties\": {\n                                            \"authSchemes\": [\n                                                {\n                                                    \"name\": \"sigv4\",\n                                                    \"signingName\": \"sts\",\n                                                    \"signingRegion\": \"{Region}\"\n                                                }\n                                            ]\n                                        },\n                                        \"headers\": {}\n                                    },\n                                    \"type\": \"endpoint\"\n                                }\n                            ],\n                            \"type\": \"tree\"\n                        },\n                        {\n                            \"conditions\": [\n                                {\n                                    \"fn\": \"isSet\",\n                                    \"argv\": [\n                                        {\n                                            \"ref\": \"Endpoint\"\n                                        }\n                                    ]\n                                }\n                            ],\n                            \"rules\": [\n                                {\n                                    \"conditions\": [\n                                        {\n                                            \"fn\": \"booleanEquals\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"UseFIPS\"\n                                                },\n                                                true\n                                            ]\n                                        }\n                                    ],\n                                    \"error\": \"Invalid Configuration: FIPS and custom endpoint are not supported\",\n                                    \"type\": \"error\"\n                                },\n                                {\n                                    \"conditions\": [\n                                        {\n                                            \"fn\": \"booleanEquals\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"UseDualStack\"\n                                                },\n                                                true\n                                            ]\n                                        }\n                                    ],\n                                    \"error\": \"Invalid Configuration: Dualstack and custom endpoint are not supported\",\n                                    \"type\": \"error\"\n                                },\n                                {\n                                    \"conditions\": [],\n                                    \"endpoint\": {\n                                        \"url\": {\n                                            \"ref\": \"Endpoint\"\n                                        },\n                                        \"properties\": {},\n                                        \"headers\": {}\n                                    },\n                                    \"type\": \"endpoint\"\n                                }\n                            ],\n                            \"type\": \"tree\"\n                        },\n                        {\n                            \"conditions\": [\n                                {\n                                    \"fn\": \"isSet\",\n                                    \"argv\": [\n                                        {\n                                            \"ref\": \"Region\"\n                                        }\n                                    ]\n                                }\n                            ],\n                            \"rules\": [\n                                {\n                                    \"conditions\": [\n                                        {\n                                            \"fn\": \"aws.partition\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"Region\"\n                                                }\n                                            ],\n                                            \"assign\": \"PartitionResult\"\n                                        }\n                                    ],\n                                    \"rules\": [\n                                        {\n                                            \"conditions\": [\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseFIPS\"\n                                                        },\n                                                        true\n                                                    ]\n                                                },\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseDualStack\"\n                                                        },\n                                                        true\n                                                    ]\n                                                }\n                                            ],\n                                            \"rules\": [\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                true,\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"PartitionResult\"\n                                                                        },\n                                                                        \"supportsFIPS\"\n                                                                    ]\n                                                                }\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                true,\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"PartitionResult\"\n                                                                        },\n                                                                        \"supportsDualStack\"\n                                                                    ]\n                                                                }\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"rules\": [\n                                                        {\n                                                            \"conditions\": [],\n                                                            \"endpoint\": {\n                                                                \"url\": \"https://sts-fips.{Region}.{PartitionResult#dualStackDnsSuffix}\",\n                                                                \"properties\": {},\n                                                                \"headers\": {}\n                                                            },\n                                                            \"type\": \"endpoint\"\n                                                        }\n                                                    ],\n                                                    \"type\": \"tree\"\n                                                },\n                                                {\n                                                    \"conditions\": [],\n                                                    \"error\": \"FIPS and DualStack are enabled, but this partition does not support one or both\",\n                                                    \"type\": \"error\"\n                                                }\n                                            ],\n                                            \"type\": \"tree\"\n                                        },\n                                        {\n                                            \"conditions\": [\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseFIPS\"\n                                                        },\n                                                        true\n                                                    ]\n                                                }\n                                            ],\n                                            \"rules\": [\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"PartitionResult\"\n                                                                        },\n                                                                        \"supportsFIPS\"\n                                                                    ]\n                                                                },\n                                                                true\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"rules\": [\n                                                        {\n                                                            \"conditions\": [\n                                                                {\n                                                                    \"fn\": \"stringEquals\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"fn\": \"getAttr\",\n                                                                            \"argv\": [\n                                                                                {\n                                                                                    \"ref\": \"PartitionResult\"\n                                                                                },\n                                                                                \"name\"\n                                                                            ]\n                                                                        },\n                                                                        \"aws-us-gov\"\n                                                                    ]\n                                                                }\n                                                            ],\n                                                            \"endpoint\": {\n                                                                \"url\": \"https://sts.{Region}.amazonaws.com\",\n                                                                \"properties\": {},\n                                                                \"headers\": {}\n                                                            },\n                                                            \"type\": \"endpoint\"\n                                                        },\n                                                        {\n                                                            \"conditions\": [],\n                                                            \"endpoint\": {\n                                                                \"url\": \"https://sts-fips.{Region}.{PartitionResult#dnsSuffix}\",\n                                                                \"properties\": {},\n                                                                \"headers\": {}\n                                                            },\n                                                            \"type\": \"endpoint\"\n                                                        }\n                                                    ],\n                                                    \"type\": \"tree\"\n                                                },\n                                                {\n                                                    \"conditions\": [],\n                                                    \"error\": \"FIPS is enabled but this partition does not support FIPS\",\n                                                    \"type\": \"error\"\n                                                }\n                                            ],\n                                            \"type\": \"tree\"\n                                        },\n                                        {\n                                            \"conditions\": [\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseDualStack\"\n                                                        },\n                                                        true\n                                                    ]\n                                                }\n                                            ],\n                                            \"rules\": [\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                true,\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"PartitionResult\"\n                                                                        },\n                                                                        \"supportsDualStack\"\n                                                                    ]\n                                                                }\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"rules\": [\n                                                        {\n                                                            \"conditions\": [],\n                                                            \"endpoint\": {\n                                                                \"url\": \"https://sts.{Region}.{PartitionResult#dualStackDnsSuffix}\",\n                                                                \"properties\": {},\n                                                                \"headers\": {}\n                                                            },\n                                                            \"type\": \"endpoint\"\n                                                        }\n                                                    ],\n                                                    \"type\": \"tree\"\n                                                },\n                                                {\n                                                    \"conditions\": [],\n                                                    \"error\": \"DualStack is enabled but this partition does not support DualStack\",\n                                                    \"type\": \"error\"\n                                                }\n                                            ],\n                                            \"type\": \"tree\"\n                                        },\n                                        {\n                                            \"conditions\": [\n                                                {\n                                                    \"fn\": \"stringEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"Region\"\n                                                        },\n                                                        \"aws-global\"\n                                                    ]\n                                                }\n                                            ],\n                                            \"endpoint\": {\n                                                \"url\": \"https://sts.amazonaws.com\",\n                                                \"properties\": {\n                                                    \"authSchemes\": [\n                                                        {\n                                                            \"name\": \"sigv4\",\n                                                            \"signingName\": \"sts\",\n                                                            \"signingRegion\": \"us-east-1\"\n                                                        }\n                                                    ]\n                                                },\n                                                \"headers\": {}\n                                            },\n                                            \"type\": \"endpoint\"\n                                        },\n                                        {\n                                            \"conditions\": [],\n                                            \"endpoint\": {\n                                                \"url\": \"https://sts.{Region}.{PartitionResult#dnsSuffix}\",\n                                                \"properties\": {},\n                                                \"headers\": {}\n                                            },\n                                            \"type\": \"endpoint\"\n                                        }\n                                    ],\n                                    \"type\": \"tree\"\n                                }\n                            ],\n                            \"type\": \"tree\"\n                        },\n                        {\n                            \"conditions\": [],\n                            \"error\": \"Invalid Configuration: Missing Region\",\n                            \"type\": \"error\"\n                        }\n                    ]\n                },\n                \"smithy.rules#endpointTests\": {\n                    \"testCases\": [\n                        {\n                            \"documentation\": \"For region af-south-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://sts.af-south-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"af-south-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://sts.ap-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-northeast-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://sts.ap-northeast-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-northeast-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-northeast-2 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://sts.ap-northeast-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-northeast-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-northeast-3 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://sts.ap-northeast-3.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-northeast-3\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-south-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://sts.ap-south-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-south-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-southeast-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://sts.ap-southeast-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-southeast-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-southeast-2 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://sts.ap-southeast-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-southeast-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-southeast-3 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://sts.ap-southeast-3.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-southeast-3\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region aws-global with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"sts\",\n                                                \"signingRegion\": \"us-east-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://sts.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"aws-global\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ca-central-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://sts.ca-central-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ca-central-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-central-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://sts.eu-central-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-central-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-north-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://sts.eu-north-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-north-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-south-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://sts.eu-south-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-south-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-west-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://sts.eu-west-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-west-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-west-2 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://sts.eu-west-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-west-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-west-3 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://sts.eu-west-3.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-west-3\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region me-south-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://sts.me-south-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"me-south-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region sa-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://sts.sa-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"sa-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://sts.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://sts-fips.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-2 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://sts.us-east-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-2 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://sts-fips.us-east-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-2\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-west-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://sts.us-west-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-west-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-west-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://sts-fips.us-west-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-west-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-west-2 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://sts.us-west-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-west-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-west-2 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://sts-fips.us-west-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-west-2\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-1 with FIPS enabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://sts-fips.us-east-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-1 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://sts.us-east-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-north-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://sts.cn-north-1.amazonaws.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-north-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-northwest-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://sts.cn-northwest-1.amazonaws.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-northwest-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-north-1 with FIPS enabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://sts-fips.cn-north-1.api.amazonwebservices.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-north-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-north-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://sts-fips.cn-north-1.amazonaws.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-north-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-north-1 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://sts.cn-north-1.api.amazonwebservices.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-north-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://sts.us-gov-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-east-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://sts.us-gov-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-west-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://sts.us-gov-west-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-west-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-west-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://sts.us-gov-west-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-west-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-east-1 with FIPS enabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://sts-fips.us-gov-east-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-east-1 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://sts.us-gov-east-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-iso-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://sts.us-iso-east-1.c2s.ic.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-iso-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-iso-west-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://sts.us-iso-west-1.c2s.ic.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-iso-west-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-iso-east-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://sts-fips.us-iso-east-1.c2s.ic.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-iso-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-isob-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://sts.us-isob-east-1.sc2s.sgov.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-isob-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-isob-east-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://sts-fips.us-isob-east-1.sc2s.sgov.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-isob-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For custom endpoint with region set and fips disabled and dualstack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://example.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"For custom endpoint with region not set and fips disabled and dualstack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://example.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"For custom endpoint with fips enabled and dualstack disabled\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: FIPS and custom endpoint are not supported\"\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false,\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"For custom endpoint with fips disabled and dualstack enabled\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: Dualstack and custom endpoint are not supported\"\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true,\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"Missing region\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: Missing Region\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"UseGlobalEndpoint with legacy region `ap-northeast-1`\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"sts\",\n                                                \"signingRegion\": \"us-east-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://sts.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"ap-northeast-1\",\n                                        \"AWS::STS::UseGlobalEndpoint\": true\n                                    },\n                                    \"operationName\": \"GetCallerIdentity\"\n                                }\n                            ],\n                            \"params\": {\n                                \"Region\": \"ap-northeast-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"UseGlobalEndpoint\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"UseGlobalEndpoint with legacy region `ap-south-1`\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"sts\",\n                                                \"signingRegion\": \"us-east-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://sts.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"ap-south-1\",\n                                        \"AWS::STS::UseGlobalEndpoint\": true\n                                    },\n                                    \"operationName\": \"GetCallerIdentity\"\n                                }\n                            ],\n                            \"params\": {\n                                \"Region\": \"ap-south-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"UseGlobalEndpoint\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"UseGlobalEndpoint with legacy region `ap-southeast-1`\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"sts\",\n                                                \"signingRegion\": \"us-east-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://sts.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"ap-southeast-1\",\n                                        \"AWS::STS::UseGlobalEndpoint\": true\n                                    },\n                                    \"operationName\": \"GetCallerIdentity\"\n                                }\n                            ],\n                            \"params\": {\n                                \"Region\": \"ap-southeast-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"UseGlobalEndpoint\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"UseGlobalEndpoint with legacy region `ap-southeast-2`\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"sts\",\n                                                \"signingRegion\": \"us-east-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://sts.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"ap-southeast-2\",\n                                        \"AWS::STS::UseGlobalEndpoint\": true\n                                    },\n                                    \"operationName\": \"GetCallerIdentity\"\n                                }\n                            ],\n                            \"params\": {\n                                \"Region\": \"ap-southeast-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"UseGlobalEndpoint\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"UseGlobalEndpoint with legacy region `aws-global`\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"sts\",\n                                                \"signingRegion\": \"us-east-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://sts.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"aws-global\",\n                                        \"AWS::STS::UseGlobalEndpoint\": true\n                                    },\n                                    \"operationName\": \"GetCallerIdentity\"\n                                }\n                            ],\n                            \"params\": {\n                                \"Region\": \"aws-global\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"UseGlobalEndpoint\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"UseGlobalEndpoint with legacy region `ca-central-1`\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"sts\",\n                                                \"signingRegion\": \"us-east-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://sts.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"ca-central-1\",\n                                        \"AWS::STS::UseGlobalEndpoint\": true\n                                    },\n                                    \"operationName\": \"GetCallerIdentity\"\n                                }\n                            ],\n                            \"params\": {\n                                \"Region\": \"ca-central-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"UseGlobalEndpoint\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"UseGlobalEndpoint with legacy region `eu-central-1`\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"sts\",\n                                                \"signingRegion\": \"us-east-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://sts.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"eu-central-1\",\n                                        \"AWS::STS::UseGlobalEndpoint\": true\n                                    },\n                                    \"operationName\": \"GetCallerIdentity\"\n                                }\n                            ],\n                            \"params\": {\n                                \"Region\": \"eu-central-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"UseGlobalEndpoint\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"UseGlobalEndpoint with legacy region `eu-north-1`\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"sts\",\n                                                \"signingRegion\": \"us-east-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://sts.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"eu-north-1\",\n                                        \"AWS::STS::UseGlobalEndpoint\": true\n                                    },\n                                    \"operationName\": \"GetCallerIdentity\"\n                                }\n                            ],\n                            \"params\": {\n                                \"Region\": \"eu-north-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"UseGlobalEndpoint\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"UseGlobalEndpoint with legacy region `eu-west-1`\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"sts\",\n                                                \"signingRegion\": \"us-east-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://sts.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"eu-west-1\",\n                                        \"AWS::STS::UseGlobalEndpoint\": true\n                                    },\n                                    \"operationName\": \"GetCallerIdentity\"\n                                }\n                            ],\n                            \"params\": {\n                                \"Region\": \"eu-west-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"UseGlobalEndpoint\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"UseGlobalEndpoint with legacy region `eu-west-2`\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"sts\",\n                                                \"signingRegion\": \"us-east-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://sts.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"eu-west-2\",\n                                        \"AWS::STS::UseGlobalEndpoint\": true\n                                    },\n                                    \"operationName\": \"GetCallerIdentity\"\n                                }\n                            ],\n                            \"params\": {\n                                \"Region\": \"eu-west-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"UseGlobalEndpoint\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"UseGlobalEndpoint with legacy region `eu-west-3`\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"sts\",\n                                                \"signingRegion\": \"us-east-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://sts.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"eu-west-3\",\n                                        \"AWS::STS::UseGlobalEndpoint\": true\n                                    },\n                                    \"operationName\": \"GetCallerIdentity\"\n                                }\n                            ],\n                            \"params\": {\n                                \"Region\": \"eu-west-3\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"UseGlobalEndpoint\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"UseGlobalEndpoint with legacy region `sa-east-1`\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"sts\",\n                                                \"signingRegion\": \"us-east-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://sts.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"sa-east-1\",\n                                        \"AWS::STS::UseGlobalEndpoint\": true\n                                    },\n                                    \"operationName\": \"GetCallerIdentity\"\n                                }\n                            ],\n                            \"params\": {\n                                \"Region\": \"sa-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"UseGlobalEndpoint\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"UseGlobalEndpoint with legacy region `us-east-1`\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"sts\",\n                                                \"signingRegion\": \"us-east-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://sts.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-1\",\n                                        \"AWS::STS::UseGlobalEndpoint\": true\n                                    },\n                                    \"operationName\": \"GetCallerIdentity\"\n                                }\n                            ],\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"UseGlobalEndpoint\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"UseGlobalEndpoint with legacy region `us-east-2`\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"sts\",\n                                                \"signingRegion\": \"us-east-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://sts.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-2\",\n                                        \"AWS::STS::UseGlobalEndpoint\": true\n                                    },\n                                    \"operationName\": \"GetCallerIdentity\"\n                                }\n                            ],\n                            \"params\": {\n                                \"Region\": \"us-east-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"UseGlobalEndpoint\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"UseGlobalEndpoint with legacy region `us-west-1`\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"sts\",\n                                                \"signingRegion\": \"us-east-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://sts.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-west-1\",\n                                        \"AWS::STS::UseGlobalEndpoint\": true\n                                    },\n                                    \"operationName\": \"GetCallerIdentity\"\n                                }\n                            ],\n                            \"params\": {\n                                \"Region\": \"us-west-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"UseGlobalEndpoint\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"UseGlobalEndpoint with legacy region `us-west-2`\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"sts\",\n                                                \"signingRegion\": \"us-east-1\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://sts.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-west-2\",\n                                        \"AWS::STS::UseGlobalEndpoint\": true\n                                    },\n                                    \"operationName\": \"GetCallerIdentity\"\n                                }\n                            ],\n                            \"params\": {\n                                \"Region\": \"us-west-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"UseGlobalEndpoint\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"UseGlobalEndpoint with Non-legacy region `us-east-3`\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"properties\": {\n                                        \"authSchemes\": [\n                                            {\n                                                \"name\": \"sigv4\",\n                                                \"signingName\": \"sts\",\n                                                \"signingRegion\": \"us-east-3\"\n                                            }\n                                        ]\n                                    },\n                                    \"url\": \"https://sts.us-east-3.amazonaws.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-east-3\",\n                                        \"AWS::STS::UseGlobalEndpoint\": true\n                                    },\n                                    \"operationName\": \"GetCallerIdentity\"\n                                }\n                            ],\n                            \"params\": {\n                                \"Region\": \"us-east-3\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"UseGlobalEndpoint\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"UseGlobalEndpoint with legacy region and custom endpoint\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://example.com\"\n                                }\n                            },\n                            \"operationInputs\": [\n                                {\n                                    \"builtInParams\": {\n                                        \"AWS::Region\": \"us-west-1\",\n                                        \"AWS::STS::UseGlobalEndpoint\": true,\n                                        \"SDK::Endpoint\": \"https://example.com\"\n                                    },\n                                    \"operationName\": \"GetCallerIdentity\"\n                                }\n                            ],\n                            \"params\": {\n                                \"Region\": \"us-west-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"UseGlobalEndpoint\": true,\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"UseGlobalEndpoint with unset region and custom endpoint\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://example.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"UseGlobalEndpoint\": false,\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        }\n                    ],\n                    \"version\": \"1.0\"\n                }\n            }\n        },\n        \"com.amazonaws.sts#AssumeRole\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.sts#AssumeRoleRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.sts#AssumeRoleResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.sts#ExpiredTokenException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.sts#MalformedPolicyDocumentException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.sts#PackedPolicyTooLargeException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.sts#RegionDisabledException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns a set of temporary security credentials that you can use to access Amazon Web Services\\n         resources. These temporary credentials consist of an access key ID, a secret access key,\\n         and a security token. Typically, you use <code>AssumeRole</code> within your account or for\\n         cross-account access. For a comparison of <code>AssumeRole</code> with other API operations\\n         that produce temporary credentials, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html\\\">Requesting Temporary Security\\n            Credentials</a> and <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_sts-comparison.html\\\">Compare STS\\n            credentials</a> in the <i>IAM User Guide</i>.</p>\\n         <p>\\n            <b>Permissions</b>\\n         </p>\\n         <p>The temporary security credentials created by <code>AssumeRole</code> can be used to\\n         make API calls to any Amazon Web Services service with the following exception: You cannot call the\\n         Amazon Web Services STS <code>GetFederationToken</code> or <code>GetSessionToken</code> API\\n         operations.</p>\\n         <p>(Optional) You can pass inline or managed session policies to this operation. You can\\n         pass a single JSON policy document to use as an inline session policy. You can also specify\\n         up to 10 managed policy Amazon Resource Names (ARNs) to use as managed session policies.\\n         The plaintext that you use for both inline and managed session policies can't exceed 2,048\\n         characters. Passing policies to this operation returns new \\n         temporary credentials. The resulting session's permissions are the intersection of the \\n         role's identity-based policy and the session policies. You can use the role's temporary \\n         credentials in subsequent Amazon Web Services API calls to access resources in the account that owns \\n         the role. You cannot use session policies to grant more permissions than those allowed \\n         by the identity-based policy of the role that is being assumed. For more information, see\\n            <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session\\\">Session\\n            Policies</a> in the <i>IAM User Guide</i>.</p>\\n         <p>When you create a role, you create two policies: a role trust policy that specifies\\n            <i>who</i> can assume the role, and a permissions policy that specifies\\n            <i>what</i> can be done with the role. You specify the trusted principal\\n         that is allowed to assume the role in the role trust policy.</p>\\n         <p>To assume a role from a different account, your Amazon Web Services account must be trusted by the\\n         role. The trust relationship is defined in the role's trust policy when the role is\\n         created. That trust policy states which accounts are allowed to delegate that access to\\n         users in the account. </p>\\n         <p>A user who wants to access a role in a different account must also have permissions that\\n         are delegated from the account administrator. The administrator must attach a policy that\\n         allows the user to call <code>AssumeRole</code> for the ARN of the role in the other\\n         account.</p>\\n         <p>To allow a user to assume a role in the same account, you can do either of the\\n         following:</p>\\n         <ul>\\n            <li>\\n               <p>Attach a policy to the user that allows the user to call <code>AssumeRole</code>\\n               (as long as the role's trust policy trusts the account).</p>\\n            </li>\\n            <li>\\n               <p>Add the user as a principal directly in the role's trust policy.</p>\\n            </li>\\n         </ul>\\n         <p>You can do either because the role’s trust policy acts as an IAM resource-based\\n         policy. When a resource-based policy grants access to a principal in the same account, no\\n         additional identity-based policy is required. For more information about trust policies and\\n         resource-based policies, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html\\\">IAM Policies</a> in the\\n            <i>IAM User Guide</i>.</p>\\n         <p>\\n            <b>Tags</b>\\n         </p>\\n         <p>(Optional) You can pass tag key-value pairs to your session. These tags are called\\n         session tags. For more information about session tags, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_session-tags.html\\\">Passing Session Tags in STS</a> in the\\n            <i>IAM User Guide</i>.</p>\\n         <p>An administrator must grant you the permissions necessary to pass session tags. The\\n         administrator can also create granular permissions to allow you to pass only specific\\n         session tags. For more information, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/tutorial_attribute-based-access-control.html\\\">Tutorial: Using Tags\\n            for Attribute-Based Access Control</a> in the\\n         <i>IAM User Guide</i>.</p>\\n         <p>You can set the session tags as transitive. Transitive tags persist during role\\n         chaining. For more information, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_session-tags.html#id_session-tags_role-chaining\\\">Chaining Roles\\n            with Session Tags</a> in the <i>IAM User Guide</i>.</p>\\n         <p>\\n            <b>Using MFA with AssumeRole</b>\\n         </p>\\n         <p>(Optional) You can include multi-factor authentication (MFA) information when you call\\n            <code>AssumeRole</code>. This is useful for cross-account scenarios to ensure that the\\n         user that assumes the role has been authenticated with an Amazon Web Services MFA device. In that\\n         scenario, the trust policy of the role being assumed includes a condition that tests for\\n         MFA authentication. If the caller does not include valid MFA information, the request to\\n         assume the role is denied. The condition in a trust policy that tests for MFA\\n         authentication might look like the following example.</p>\\n         <p>\\n            <code>\\\"Condition\\\": {\\\"Bool\\\": {\\\"aws:MultiFactorAuthPresent\\\": true}}</code>\\n         </p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/MFAProtectedAPI.html\\\">Configuring MFA-Protected API Access</a>\\n         in the <i>IAM User Guide</i> guide.</p>\\n         <p>To use MFA with <code>AssumeRole</code>, you pass values for the\\n            <code>SerialNumber</code> and <code>TokenCode</code> parameters. The\\n            <code>SerialNumber</code> value identifies the user's hardware or virtual MFA device.\\n         The <code>TokenCode</code> is the time-based one-time password (TOTP) that the MFA device\\n         produces. </p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To assume a role\",\n                        \"documentation\": \"\",\n                        \"input\": {\n                            \"RoleArn\": \"arn:aws:iam::123456789012:role/demo\",\n                            \"RoleSessionName\": \"testAssumeRoleSession\",\n                            \"Policy\": \"{\\\"Version\\\":\\\"2012-10-17\\\",\\\"Statement\\\":[{\\\"Sid\\\":\\\"Stmt1\\\",\\\"Effect\\\":\\\"Allow\\\",\\\"Action\\\":\\\"s3:ListAllMyBuckets\\\",\\\"Resource\\\":\\\"*\\\"}]}\",\n                            \"Tags\": [\n                                {\n                                    \"Key\": \"Project\",\n                                    \"Value\": \"Unicorn\"\n                                },\n                                {\n                                    \"Key\": \"Team\",\n                                    \"Value\": \"Automation\"\n                                },\n                                {\n                                    \"Key\": \"Cost-Center\",\n                                    \"Value\": \"12345\"\n                                }\n                            ],\n                            \"TransitiveTagKeys\": [\n                                \"Project\",\n                                \"Cost-Center\"\n                            ],\n                            \"ExternalId\": \"123ABC\"\n                        },\n                        \"output\": {\n                            \"Credentials\": {\n                                \"SessionToken\": \"AQoDYXdzEPT//////////wEXAMPLEtc764bNrC9SAPBSM22wDOk4x4HIZ8j4FZTwdQWLWsKWHGBuFqwAeMicRXmxfpSPfIeoIYRqTflfKD8YUuwthAx7mSEI/qkPpKPi/kMcGdQrmGdeehM4IC1NtBmUpp2wUE8phUZampKsburEDy0KPkyQDYwT7WZ0wq5VSXDvp75YU9HFvlRd8Tx6q6fE8YQcHNVXAkiY9q6d+xo0rKwT38xVqr7ZD0u0iPPkUL64lIZbqBAz+scqKmlzm8FDrypNC9Yjc8fPOLn9FX9KSYvKTr4rvx3iSIlTJabIQwj2ICCR/oLxBA==\",\n                                \"AccessKeyId\": \"AKIAIOSFODNN7EXAMPLE\",\n                                \"SecretAccessKey\": \"wJalrXUtnFEMI/K7MDENG/bPxRfiCYzEXAMPLEKEY\",\n                                \"Expiration\": \"2011-07-15T23:28:33.359Z\"\n                            },\n                            \"AssumedRoleUser\": {\n                                \"Arn\": \"arn:aws:sts::123456789012:assumed-role/demo/Bob\",\n                                \"AssumedRoleId\": \"ARO123EXAMPLE123:Bob\"\n                            },\n                            \"PackedPolicySize\": 8\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.sts#AssumeRoleRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RoleArn\": {\n                    \"target\": \"com.amazonaws.sts#arnType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the role to assume.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"RoleSessionName\": {\n                    \"target\": \"com.amazonaws.sts#roleSessionNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An identifier for the assumed role session.</p>\\n         <p>Use the role session name to uniquely identify a session when the same role is assumed\\n         by different principals or for different reasons. In cross-account scenarios, the role\\n         session name is visible to, and can be logged by the account that owns the role. The role\\n         session name is also used in the ARN of the assumed role principal. This means that\\n         subsequent cross-account API requests that use the temporary security credentials will\\n         expose the role session name to the external account in their CloudTrail logs.</p>\\n         <p>For security purposes, administrators can view this field in <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/cloudtrail-integration.html#cloudtrail-integration_signin-tempcreds\\\">CloudTrail logs</a> to help identify who performed an action in Amazon Web Services. Your\\n         administrator might require that you specify your user name as the session name when you\\n         assume the role. For more information, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_iam-condition-keys.html#ck_rolesessionname\\\">\\n               <code>sts:RoleSessionName</code>\\n            </a>.</p>\\n         <p>The regex used to validate this parameter is a string of characters \\n    consisting of upper- and lower-case alphanumeric characters with no spaces. You can \\n    also include underscores or any of the following characters: =,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"PolicyArns\": {\n                    \"target\": \"com.amazonaws.sts#policyDescriptorListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Names (ARNs) of the IAM managed policies that you want to use as\\n         managed session policies. The policies must exist in the same account as the role.</p>\\n         <p>This parameter is optional. You can provide up to 10 managed policy ARNs. However, the\\n         plaintext that you use for both inline and managed session policies can't exceed 2,048\\n         characters. For more information about ARNs, see <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html\\\">Amazon Resource Names (ARNs) and Amazon Web Services\\n            Service Namespaces</a> in the Amazon Web Services General Reference.</p>\\n         <note>\\n            <p>An Amazon Web Services conversion compresses the passed inline session policy, managed policy ARNs,\\n            and session tags into a packed binary format that has a separate limit. Your request can\\n            fail for this limit even if your plaintext meets the other requirements. The\\n               <code>PackedPolicySize</code> response element indicates by percentage how close the\\n            policies and tags for your request are to the upper size limit.</p>\\n         </note>\\n         <p>Passing policies to this operation returns new \\n         temporary credentials. The resulting session's permissions are the intersection of the \\n         role's identity-based policy and the session policies. You can use the role's temporary \\n         credentials in subsequent Amazon Web Services API calls to access resources in the account that owns \\n         the role. You cannot use session policies to grant more permissions than those allowed \\n         by the identity-based policy of the role that is being assumed. For more information, see\\n            <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session\\\">Session\\n            Policies</a> in the <i>IAM User Guide</i>.</p>\"\n                    }\n                },\n                \"Policy\": {\n                    \"target\": \"com.amazonaws.sts#unrestrictedSessionPolicyDocumentType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An IAM policy in JSON format that you want to use as an inline session policy.</p>\\n         <p>This parameter is optional. Passing policies to this operation returns new \\n         temporary credentials. The resulting session's permissions are the intersection of the \\n         role's identity-based policy and the session policies. You can use the role's temporary \\n         credentials in subsequent Amazon Web Services API calls to access resources in the account that owns \\n         the role. You cannot use session policies to grant more permissions than those allowed \\n         by the identity-based policy of the role that is being assumed. For more information, see\\n            <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session\\\">Session\\n            Policies</a> in the <i>IAM User Guide</i>.</p>\\n         <p>The plaintext that you use for both inline and managed session policies can't exceed\\n         2,048 characters. The JSON policy characters can be any ASCII character from the space\\n         character to the end of the valid character list (\\\\u0020 through \\\\u00FF). It can also\\n         include the tab (\\\\u0009), linefeed (\\\\u000A), and carriage return (\\\\u000D)\\n         characters.</p>\\n         <note>\\n            <p>An Amazon Web Services conversion compresses the passed inline session policy, managed policy ARNs,\\n            and session tags into a packed binary format that has a separate limit. Your request can\\n            fail for this limit even if your plaintext meets the other requirements. The\\n               <code>PackedPolicySize</code> response element indicates by percentage how close the\\n            policies and tags for your request are to the upper size limit.</p>\\n         </note>\\n         <p>For more information about role session permissions, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session\\\">Session\\n            policies</a>.</p>\"\n                    }\n                },\n                \"DurationSeconds\": {\n                    \"target\": \"com.amazonaws.sts#roleDurationSecondsType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The duration, in seconds, of the role session. The value specified can range from 900\\n         seconds (15 minutes) up to the maximum session duration set for the role. The maximum\\n         session duration setting can have a value from 1 hour to 12 hours. If you specify a value\\n         higher than this setting or the administrator setting (whichever is lower), the operation\\n         fails. For example, if you specify a session duration of 12 hours, but your administrator\\n         set the maximum session duration to 6 hours, your operation fails. </p>\\n         <p>Role chaining limits your Amazon Web Services CLI or Amazon Web Services API role session to a maximum of one hour.\\n         When you use the <code>AssumeRole</code> API operation to assume a role, you can specify\\n         the duration of your role session with the <code>DurationSeconds</code> parameter. You can\\n         specify a parameter value of up to 43200 seconds (12 hours), depending on the maximum\\n         session duration setting for your role. However, if you assume a role using role chaining\\n         and provide a <code>DurationSeconds</code> parameter value greater than one hour, the\\n         operation fails. To learn how to view the maximum value for your role, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_update-role-settings.html#id_roles_update-session-duration\\\">Update the maximum session duration for a role</a>.</p>\\n         <p>By default, the value is set to <code>3600</code> seconds. </p>\\n         <note>\\n            <p>The <code>DurationSeconds</code> parameter is separate from the duration of a console\\n            session that you might request using the returned credentials. The request to the\\n            federation endpoint for a console sign-in token takes a <code>SessionDuration</code>\\n            parameter that specifies the maximum length of the console session. For more\\n            information, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_enable-console-custom-url.html\\\">Creating a URL\\n               that Enables Federated Users to Access the Amazon Web Services Management Console</a> in the\\n               <i>IAM User Guide</i>.</p>\\n         </note>\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.sts#tagListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of session tags that you want to pass. Each session tag consists of a key name\\n         and an associated value. For more information about session tags, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_session-tags.html\\\">Tagging Amazon Web Services STS\\n            Sessions</a> in the <i>IAM User Guide</i>.</p>\\n         <p>This parameter is optional. You can pass up to 50 session tags. The plaintext session\\n         tag keys can’t exceed 128 characters, and the values can’t exceed 256 characters. For these\\n         and additional limits, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_iam-limits.html#reference_iam-limits-entity-length\\\">IAM\\n            and STS Character Limits</a> in the <i>IAM User Guide</i>.</p>\\n         <note>\\n            <p>An Amazon Web Services conversion compresses the passed inline session policy, managed policy ARNs,\\n            and session tags into a packed binary format that has a separate limit. Your request can\\n            fail for this limit even if your plaintext meets the other requirements. The\\n               <code>PackedPolicySize</code> response element indicates by percentage how close the\\n            policies and tags for your request are to the upper size limit.</p>\\n         </note>\\n         <p>You can pass a session tag with the same key as a tag that is already attached to the\\n         role. When you do, session tags override a role tag with the same key. </p>\\n         <p>Tag key–value pairs are not case sensitive, but case is preserved. This means that you\\n         cannot have separate <code>Department</code> and <code>department</code> tag keys. Assume\\n         that the role has the <code>Department</code>=<code>Marketing</code> tag and you pass the\\n            <code>department</code>=<code>engineering</code> session tag. <code>Department</code>\\n         and <code>department</code> are not saved as separate tags, and the session tag passed in\\n         the request takes precedence over the role tag.</p>\\n         <p>Additionally, if you used temporary credentials to perform this operation, the new\\n         session inherits any transitive session tags from the calling session. If you pass a\\n         session tag with the same key as an inherited tag, the operation fails. To view the\\n         inherited tags for a session, see the CloudTrail logs. For more information, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_session-tags.html#id_session-tags_ctlogs\\\">Viewing Session Tags in CloudTrail</a> in the\\n         <i>IAM User Guide</i>.</p>\"\n                    }\n                },\n                \"TransitiveTagKeys\": {\n                    \"target\": \"com.amazonaws.sts#tagKeyListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of keys for session tags that you want to set as transitive. If you set a tag key\\n         as transitive, the corresponding key and value passes to subsequent sessions in a role\\n         chain. For more information, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_session-tags.html#id_session-tags_role-chaining\\\">Chaining Roles\\n            with Session Tags</a> in the <i>IAM User Guide</i>.</p>\\n         <p>This parameter is optional. The transitive status of a session tag does not impact its\\n         packed binary size.</p>\\n         <p>If you choose not to specify a transitive tag key, then no tags are passed from this\\n         session to any subsequent sessions.</p>\"\n                    }\n                },\n                \"ExternalId\": {\n                    \"target\": \"com.amazonaws.sts#externalIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A unique identifier that might be required when you assume a role in another account. If\\n         the administrator of the account to which the role belongs provided you with an external\\n         ID, then provide that value in the <code>ExternalId</code> parameter. This value can be any\\n         string, such as a passphrase or account number. A cross-account role is usually set up to\\n         trust everyone in an account. Therefore, the administrator of the trusting account might\\n         send an external ID to the administrator of the trusted account. That way, only someone\\n         with the ID can assume the role, rather than everyone in the account. For more information\\n         about the external ID, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user_externalid.html\\\">How to Use an External ID\\n            When Granting Access to Your Amazon Web Services Resources to a Third Party</a> in the\\n            <i>IAM User Guide</i>.</p>\\n         <p>The regex used to validate this parameter is a string of \\n    characters consisting of upper- and lower-case alphanumeric characters with no spaces. \\n    You can also include underscores or any of the following characters: =,.@:/-</p>\"\n                    }\n                },\n                \"SerialNumber\": {\n                    \"target\": \"com.amazonaws.sts#serialNumberType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The identification number of the MFA device that is associated with the user who is\\n         making the <code>AssumeRole</code> call. Specify this value if the trust policy of the role\\n         being assumed includes a condition that requires MFA authentication. The value is either\\n         the serial number for a hardware device (such as <code>GAHT12345678</code>) or an Amazon\\n         Resource Name (ARN) for a virtual device (such as\\n            <code>arn:aws:iam::123456789012:mfa/user</code>).</p>\\n         <p>The regex used to validate this parameter is a string of characters \\n    consisting of upper- and lower-case alphanumeric characters with no spaces. You can \\n    also include underscores or any of the following characters: =,.@-</p>\"\n                    }\n                },\n                \"TokenCode\": {\n                    \"target\": \"com.amazonaws.sts#tokenCodeType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The value provided by the MFA device, if the trust policy of the role being assumed\\n         requires MFA. (In other words, if the policy includes a condition that tests for MFA). If\\n         the role being assumed requires MFA and if the <code>TokenCode</code> value is missing or\\n         expired, the <code>AssumeRole</code> call returns an \\\"access denied\\\" error.</p>\\n         <p>The format for this parameter, as described by its regex pattern, is a sequence of six\\n         numeric digits.</p>\"\n                    }\n                },\n                \"SourceIdentity\": {\n                    \"target\": \"com.amazonaws.sts#sourceIdentityType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The source identity specified by the principal that is calling the\\n            <code>AssumeRole</code> operation. The source identity value persists across <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html#iam-term-role-chaining\\\">chained role</a> sessions.</p>\\n         <p>You can require users to specify a source identity when they assume a role. You do this\\n         by using the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceidentity\\\">\\n               <code>sts:SourceIdentity</code>\\n            </a> condition key in a role trust policy. You\\n         can use source identity information in CloudTrail logs to determine who took actions with a\\n         role. You can use the <code>aws:SourceIdentity</code> condition key to further control\\n         access to Amazon Web Services resources based on the value of source identity. For more information about\\n         using source identity, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_control-access_monitor.html\\\">Monitor and control\\n            actions taken with assumed roles</a> in the\\n         <i>IAM User Guide</i>.</p>\\n         <p>The regex used to validate this parameter is a string of characters consisting of upper-\\n         and lower-case alphanumeric characters with no spaces. You can also include underscores or\\n         any of the following characters: +=,.@-. You cannot use a value that begins with the text\\n            <code>aws:</code>. This prefix is reserved for Amazon Web Services internal use.</p>\"\n                    }\n                },\n                \"ProvidedContexts\": {\n                    \"target\": \"com.amazonaws.sts#ProvidedContextsListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of previously acquired trusted context assertions in the format of a JSON array.\\n         The trusted context assertion is signed and encrypted by Amazon Web Services STS.</p>\\n         <p>The following is an example of a <code>ProvidedContext</code> value that includes a\\n         single trusted context assertion and the ARN of the context provider from which the trusted\\n         context assertion was generated.</p>\\n         <p>\\n            <code>[{\\\"ProviderArn\\\":\\\"arn:aws:iam::aws:contextProvider/IdentityCenter\\\",\\\"ContextAssertion\\\":\\\"trusted-context-assertion\\\"}]</code>\\n         </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.sts#AssumeRoleResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Credentials\": {\n                    \"target\": \"com.amazonaws.sts#Credentials\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The temporary security credentials, which include an access key ID, a secret access key,\\n         and a security (or session) token.</p>\\n         <note>\\n            <p>The size of the security token that STS API operations return is not fixed. We\\n        strongly recommend that you make no assumptions about the maximum size.</p>\\n         </note>\"\n                    }\n                },\n                \"AssumedRoleUser\": {\n                    \"target\": \"com.amazonaws.sts#AssumedRoleUser\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) and the assumed role ID, which are identifiers that you\\n         can use to refer to the resulting temporary security credentials. For example, you can\\n         reference these credentials as a principal in a resource-based policy by using the ARN or\\n         assumed role ID. The ARN and ID include the <code>RoleSessionName</code> that you specified\\n         when you called <code>AssumeRole</code>. </p>\"\n                    }\n                },\n                \"PackedPolicySize\": {\n                    \"target\": \"com.amazonaws.sts#nonNegativeIntegerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A percentage value that indicates the packed size of the session policies and session \\n      tags combined passed in the request. The request fails if the packed size is greater than 100 percent, \\n      which means the policies and tags exceeded the allowed space.</p>\"\n                    }\n                },\n                \"SourceIdentity\": {\n                    \"target\": \"com.amazonaws.sts#sourceIdentityType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The source identity specified by the principal that is calling the\\n            <code>AssumeRole</code> operation.</p>\\n         <p>You can require users to specify a source identity when they assume a role. You do this\\n         by using the <code>sts:SourceIdentity</code> condition key in a role trust policy. You can\\n         use source identity information in CloudTrail logs to determine who took actions with a role.\\n         You can use the <code>aws:SourceIdentity</code> condition key to further control access to\\n         Amazon Web Services resources based on the value of source identity. For more information about using\\n         source identity, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_control-access_monitor.html\\\">Monitor and control\\n            actions taken with assumed roles</a> in the\\n         <i>IAM User Guide</i>.</p>\\n         <p>The regex used to validate this parameter is a string of characters consisting of upper-\\n         and lower-case alphanumeric characters with no spaces. You can also include underscores or\\n         any of the following characters: =,.@-</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the response to a successful <a>AssumeRole</a> request, including\\n      temporary Amazon Web Services credentials that can be used to make Amazon Web Services requests. </p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.sts#AssumeRoleWithSAML\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.sts#AssumeRoleWithSAMLRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.sts#AssumeRoleWithSAMLResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.sts#ExpiredTokenException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.sts#IDPRejectedClaimException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.sts#InvalidIdentityTokenException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.sts#MalformedPolicyDocumentException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.sts#PackedPolicyTooLargeException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.sts#RegionDisabledException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#auth\": [],\n                \"smithy.api#documentation\": \"<p>Returns a set of temporary security credentials for users who have been authenticated\\n         via a SAML authentication response. This operation provides a mechanism for tying an\\n         enterprise identity store or directory to role-based Amazon Web Services access without user-specific\\n         credentials or configuration. For a comparison of <code>AssumeRoleWithSAML</code> with the\\n         other API operations that produce temporary credentials, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html\\\">Requesting Temporary Security\\n            Credentials</a> and <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_sts-comparison.html\\\">Compare STS\\n            credentials</a> in the <i>IAM User Guide</i>.</p>\\n         <p>The temporary security credentials returned by this operation consist of an access key\\n         ID, a secret access key, and a security token. Applications can use these temporary\\n         security credentials to sign calls to Amazon Web Services services.</p>\\n         <p>\\n            <b>Session Duration</b>\\n         </p>\\n         <p>By default, the temporary security credentials created by\\n            <code>AssumeRoleWithSAML</code> last for one hour. However, you can use the optional\\n            <code>DurationSeconds</code> parameter to specify the duration of your session. Your\\n         role session lasts for the duration that you specify, or until the time specified in the\\n         SAML authentication response's <code>SessionNotOnOrAfter</code> value, whichever is\\n         shorter. You can provide a <code>DurationSeconds</code> value from 900 seconds (15 minutes)\\n         up to the maximum session duration setting for the role. This setting can have a value from\\n         1 hour to 12 hours. To learn how to view the maximum value for your role, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html#id_roles_use_view-role-max-session\\\">View the\\n            Maximum Session Duration Setting for a Role</a> in the\\n            <i>IAM User Guide</i>. The maximum session duration limit applies when\\n         you use the <code>AssumeRole*</code> API operations or the <code>assume-role*</code> CLI\\n         commands. However the limit does not apply when you use those operations to create a\\n         console URL. For more information, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html\\\">Using IAM Roles</a> in the\\n            <i>IAM User Guide</i>.</p>\\n         <note>\\n            <p>\\n               <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_terms-and-concepts.html#iam-term-role-chaining\\\">Role chaining</a> limits your CLI or Amazon Web Services API role\\n            session to a maximum of one hour. When you use the <code>AssumeRole</code> API operation\\n            to assume a role, you can specify the duration of your role session with the\\n               <code>DurationSeconds</code> parameter. You can specify a parameter value of up to\\n            43200 seconds (12 hours), depending on the maximum session duration setting for your\\n            role. However, if you assume a role using role chaining and provide a\\n               <code>DurationSeconds</code> parameter value greater than one hour, the operation\\n            fails.</p>\\n         </note>\\n         <p>\\n            <b>Permissions</b>\\n         </p>\\n         <p>The temporary security credentials created by <code>AssumeRoleWithSAML</code> can be\\n         used to make API calls to any Amazon Web Services service with the following exception: you cannot call\\n         the STS <code>GetFederationToken</code> or <code>GetSessionToken</code> API\\n         operations.</p>\\n         <p>(Optional) You can pass inline or managed <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session\\\">session policies</a> to\\n         this operation. You can pass a single JSON policy document to use as an inline session\\n         policy. You can also specify up to 10 managed policy Amazon Resource Names (ARNs) to use as\\n         managed session policies. The plaintext that you use for both inline and managed session\\n         policies can't exceed 2,048 characters. Passing policies to this operation returns new \\n         temporary credentials. The resulting session's permissions are the intersection of the \\n         role's identity-based policy and the session policies. You can use the role's temporary \\n         credentials in subsequent Amazon Web Services API calls to access resources in the account that owns \\n         the role. You cannot use session policies to grant more permissions than those allowed \\n         by the identity-based policy of the role that is being assumed. For more information, see\\n            <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session\\\">Session\\n            Policies</a> in the <i>IAM User Guide</i>.</p>\\n         <p>Calling <code>AssumeRoleWithSAML</code> does not require the use of Amazon Web Services security\\n         credentials. The identity of the caller is validated by using keys in the metadata document\\n         that is uploaded for the SAML provider entity for your identity provider. </p>\\n         <important>\\n            <p>Calling <code>AssumeRoleWithSAML</code> can result in an entry in your CloudTrail logs.\\n            The entry includes the value in the <code>NameID</code> element of the SAML assertion.\\n            We recommend that you use a <code>NameIDType</code> that is not associated with any\\n            personally identifiable information (PII). For example, you could instead use the\\n            persistent identifier\\n            (<code>urn:oasis:names:tc:SAML:2.0:nameid-format:persistent</code>).</p>\\n         </important>\\n         <p>\\n            <b>Tags</b>\\n         </p>\\n         <p>(Optional) You can configure your IdP to pass attributes into your SAML assertion as\\n         session tags. Each session tag consists of a key name and an associated value. For more\\n         information about session tags, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_session-tags.html\\\">Passing Session Tags in STS</a> in the\\n            <i>IAM User Guide</i>.</p>\\n         <p>You can pass up to 50 session tags. The plaintext session tag keys can’t exceed 128\\n         characters and the values can’t exceed 256 characters. For these and additional limits, see\\n            <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_iam-limits.html#reference_iam-limits-entity-length\\\">IAM\\n            and STS Character Limits</a> in the <i>IAM User Guide</i>.</p>\\n         <note>\\n            <p>An Amazon Web Services conversion compresses the passed inline session policy, managed policy ARNs,\\n            and session tags into a packed binary format that has a separate limit. Your request can\\n            fail for this limit even if your plaintext meets the other requirements. The\\n               <code>PackedPolicySize</code> response element indicates by percentage how close the\\n            policies and tags for your request are to the upper size limit.</p>\\n         </note>\\n         <p>You can pass a session tag with the same key as a tag that is attached to the role. When\\n         you do, session tags override the role's tags with the same key.</p>\\n         <p>An administrator must grant you the permissions necessary to pass session tags. The\\n         administrator can also create granular permissions to allow you to pass only specific\\n         session tags. For more information, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/tutorial_attribute-based-access-control.html\\\">Tutorial: Using Tags\\n            for Attribute-Based Access Control</a> in the\\n         <i>IAM User Guide</i>.</p>\\n         <p>You can set the session tags as transitive. Transitive tags persist during role\\n         chaining. For more information, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_session-tags.html#id_session-tags_role-chaining\\\">Chaining Roles\\n            with Session Tags</a> in the <i>IAM User Guide</i>.</p>\\n         <p>\\n            <b>SAML Configuration</b>\\n         </p>\\n         <p>Before your application can call <code>AssumeRoleWithSAML</code>, you must configure\\n         your SAML identity provider (IdP) to issue the claims required by Amazon Web Services. Additionally, you\\n         must use Identity and Access Management (IAM) to create a SAML provider entity in your Amazon Web Services account that\\n         represents your identity provider. You must also create an IAM role that specifies this\\n         SAML provider in its trust policy. </p>\\n         <p>For more information, see the following resources:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_saml.html\\\">About\\n                  SAML 2.0-based Federation</a> in the <i>IAM User Guide</i>.\\n            </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_create_saml.html\\\">Creating SAML Identity Providers</a> in the\\n                  <i>IAM User Guide</i>. </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_create_saml_relying-party.html\\\">Configuring\\n                  a Relying Party and Claims</a> in the <i>IAM User Guide</i>.\\n            </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-idp_saml.html\\\">Creating a Role for SAML 2.0 Federation</a> in the\\n                  <i>IAM User Guide</i>. </p>\\n            </li>\\n         </ul>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To assume a role using a SAML assertion\",\n                        \"documentation\": \"\",\n                        \"input\": {\n                            \"RoleArn\": \"arn:aws:iam::123456789012:role/TestSaml\",\n                            \"PrincipalArn\": \"arn:aws:iam::123456789012:saml-provider/SAML-test\",\n                            \"SAMLAssertion\": \"VERYLONGENCODEDASSERTIONEXAMPLExzYW1sOkF1ZGllbmNlPmJsYW5rPC9zYW1sOkF1ZGllbmNlPjwvc2FtbDpBdWRpZW5jZVJlc3RyaWN0aW9uPjwvc2FtbDpDb25kaXRpb25zPjxzYW1sOlN1YmplY3Q+PHNhbWw6TmFtZUlEIEZvcm1hdD0idXJuOm9hc2lzOm5hbWVzOnRjOlNBTUw6Mi4wOm5hbWVpZC1mb3JtYXQ6dHJhbnNpZW50Ij5TYW1sRXhhbXBsZTwvc2FtbDpOYW1lSUQ+PHNhbWw6U3ViamVjdENvbmZpcm1hdGlvbiBNZXRob2Q9InVybjpvYXNpczpuYW1lczp0YzpTQU1MOjIuMDpjbTpiZWFyZXIiPjxzYW1sOlN1YmplY3RDb25maXJtYXRpb25EYXRhIE5vdE9uT3JBZnRlcj0iMjAxOS0xMS0wMVQyMDoyNTowNS4xNDVaIiBSZWNpcGllbnQ9Imh0dHBzOi8vc2lnbmluLmF3cy5hbWF6b24uY29tL3NhbWwiLz48L3NhbWw6U3ViamVjdENvbmZpcm1hdGlvbj48L3NhbWw6U3ViamVjdD48c2FtbDpBdXRoblN0YXRlbWVudCBBdXRoPD94bWwgdmpSZXNwb25zZT4=\",\n                            \"DurationSeconds\": 3600\n                        },\n                        \"output\": {\n                            \"Issuer\": \"https://integ.example.com/idp/shibboleth\",\n                            \"AssumedRoleUser\": {\n                                \"AssumedRoleId\": \"ARO456EXAMPLE789:TestSaml\",\n                                \"Arn\": \"arn:aws:sts::123456789012:assumed-role/TestSaml\"\n                            },\n                            \"Credentials\": {\n                                \"SecretAccessKey\": \"8P+SQvWIuLnKhh8d++jpw0nNmQRBZvNEXAMPLEKEY\",\n                                \"AccessKeyId\": \"ASIAV3ZUEFP6EXAMPLE\",\n                                \"SessionToken\": \"IQoJb3JpZ2luX2VjEOz////////////////////wEXAMPLEtMSJHMEUCIDoKK3JH9uGQE1z0sINr5M4jk+Na8KHDcCYRVjJCZEvOAiEA3OvJGtw1EcViOleS2vhs8VdCKFJQWPQrmGdeehM4IC1NtBmUpp2wUE8phUZampKsburEDy0KPkyQDYwT7WZ0wq5VSXDvp75YU9HFvlRd8Tx6q6fE8YQcHNVXAkiY9q6d+xo0rKwT38xVqr7ZD0u0iPPkUL64lIZbqBAz+scqKmlzm8FDrypNC9Yjc8fPOLn9FX9KSYvKTr4rvx3iSIlTJabIQwj2ICCR/oLxBA==\",\n                                \"Expiration\": \"2019-11-01T20:26:47Z\"\n                            },\n                            \"Audience\": \"https://signin.aws.amazon.com/saml\",\n                            \"SubjectType\": \"transient\",\n                            \"PackedPolicySize\": 6,\n                            \"NameQualifier\": \"SbdGOnUkh1i4+EXAMPLExL/jEvs=\",\n                            \"Subject\": \"SamlExample\"\n                        }\n                    }\n                ],\n                \"smithy.api#optionalAuth\": {}\n            }\n        },\n        \"com.amazonaws.sts#AssumeRoleWithSAMLRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RoleArn\": {\n                    \"target\": \"com.amazonaws.sts#arnType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the role that the caller is assuming.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"PrincipalArn\": {\n                    \"target\": \"com.amazonaws.sts#arnType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the SAML provider in IAM that describes the\\n         IdP.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"SAMLAssertion\": {\n                    \"target\": \"com.amazonaws.sts#SAMLAssertionType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The base64 encoded SAML authentication response provided by the IdP.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/create-role-saml-IdP-tasks.html\\\">Configuring a Relying Party and\\n            Adding Claims</a> in the <i>IAM User Guide</i>. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"PolicyArns\": {\n                    \"target\": \"com.amazonaws.sts#policyDescriptorListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Names (ARNs) of the IAM managed policies that you want to use as\\n         managed session policies. The policies must exist in the same account as the role.</p>\\n         <p>This parameter is optional. You can provide up to 10 managed policy ARNs. However, the\\n         plaintext that you use for both inline and managed session policies can't exceed 2,048\\n         characters. For more information about ARNs, see <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html\\\">Amazon Resource Names (ARNs) and Amazon Web Services\\n            Service Namespaces</a> in the Amazon Web Services General Reference.</p>\\n         <note>\\n            <p>An Amazon Web Services conversion compresses the passed inline session policy, managed policy ARNs,\\n            and session tags into a packed binary format that has a separate limit. Your request can\\n            fail for this limit even if your plaintext meets the other requirements. The\\n               <code>PackedPolicySize</code> response element indicates by percentage how close the\\n            policies and tags for your request are to the upper size limit.</p>\\n         </note>\\n         <p>Passing policies to this operation returns new \\n         temporary credentials. The resulting session's permissions are the intersection of the \\n         role's identity-based policy and the session policies. You can use the role's temporary \\n         credentials in subsequent Amazon Web Services API calls to access resources in the account that owns \\n         the role. You cannot use session policies to grant more permissions than those allowed \\n         by the identity-based policy of the role that is being assumed. For more information, see\\n            <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session\\\">Session\\n            Policies</a> in the <i>IAM User Guide</i>.</p>\"\n                    }\n                },\n                \"Policy\": {\n                    \"target\": \"com.amazonaws.sts#sessionPolicyDocumentType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An IAM policy in JSON format that you want to use as an inline session policy.</p>\\n         <p>This parameter is optional. Passing policies to this operation returns new \\n         temporary credentials. The resulting session's permissions are the intersection of the \\n         role's identity-based policy and the session policies. You can use the role's temporary \\n         credentials in subsequent Amazon Web Services API calls to access resources in the account that owns \\n         the role. You cannot use session policies to grant more permissions than those allowed \\n         by the identity-based policy of the role that is being assumed. For more information, see\\n            <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session\\\">Session\\n            Policies</a> in the <i>IAM User Guide</i>. </p>\\n         <p>The plaintext that you use for both inline and managed session policies can't exceed\\n         2,048 characters. The JSON policy characters can be any ASCII character from the space\\n         character to the end of the valid character list (\\\\u0020 through \\\\u00FF). It can also\\n         include the tab (\\\\u0009), linefeed (\\\\u000A), and carriage return (\\\\u000D)\\n         characters.</p>\\n         <p>For more information about role session permissions, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session\\\">Session\\n            policies</a>.</p>\\n         <note>\\n            <p>An Amazon Web Services conversion compresses the passed inline session policy, managed policy ARNs,\\n            and session tags into a packed binary format that has a separate limit. Your request can\\n            fail for this limit even if your plaintext meets the other requirements. The\\n               <code>PackedPolicySize</code> response element indicates by percentage how close the\\n            policies and tags for your request are to the upper size limit.</p>\\n         </note>\"\n                    }\n                },\n                \"DurationSeconds\": {\n                    \"target\": \"com.amazonaws.sts#roleDurationSecondsType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The duration, in seconds, of the role session. Your role session lasts for the duration\\n         that you specify for the <code>DurationSeconds</code> parameter, or until the time\\n         specified in the SAML authentication response's <code>SessionNotOnOrAfter</code> value,\\n         whichever is shorter. You can provide a <code>DurationSeconds</code> value from 900 seconds\\n         (15 minutes) up to the maximum session duration setting for the role. This setting can have\\n         a value from 1 hour to 12 hours. If you specify a value higher than this setting, the\\n         operation fails. For example, if you specify a session duration of 12 hours, but your\\n         administrator set the maximum session duration to 6 hours, your operation fails. To learn\\n         how to view the maximum value for your role, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html#id_roles_use_view-role-max-session\\\">View the\\n            Maximum Session Duration Setting for a Role</a> in the\\n            <i>IAM User Guide</i>.</p>\\n         <p>By default, the value is set to <code>3600</code> seconds. </p>\\n         <note>\\n            <p>The <code>DurationSeconds</code> parameter is separate from the duration of a console\\n            session that you might request using the returned credentials. The request to the\\n            federation endpoint for a console sign-in token takes a <code>SessionDuration</code>\\n            parameter that specifies the maximum length of the console session. For more\\n            information, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_enable-console-custom-url.html\\\">Creating a URL\\n               that Enables Federated Users to Access the Amazon Web Services Management Console</a> in the\\n               <i>IAM User Guide</i>.</p>\\n         </note>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.sts#AssumeRoleWithSAMLResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Credentials\": {\n                    \"target\": \"com.amazonaws.sts#Credentials\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The temporary security credentials, which include an access key ID, a secret access key,\\n         and a security (or session) token.</p>\\n         <note>\\n            <p>The size of the security token that STS API operations return is not fixed. We\\n        strongly recommend that you make no assumptions about the maximum size.</p>\\n         </note>\"\n                    }\n                },\n                \"AssumedRoleUser\": {\n                    \"target\": \"com.amazonaws.sts#AssumedRoleUser\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The identifiers for the temporary security credentials that the operation\\n         returns.</p>\"\n                    }\n                },\n                \"PackedPolicySize\": {\n                    \"target\": \"com.amazonaws.sts#nonNegativeIntegerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A percentage value that indicates the packed size of the session policies and session \\n      tags combined passed in the request. The request fails if the packed size is greater than 100 percent, \\n      which means the policies and tags exceeded the allowed space.</p>\"\n                    }\n                },\n                \"Subject\": {\n                    \"target\": \"com.amazonaws.sts#Subject\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The value of the <code>NameID</code> element in the <code>Subject</code> element of the\\n         SAML assertion.</p>\"\n                    }\n                },\n                \"SubjectType\": {\n                    \"target\": \"com.amazonaws.sts#SubjectType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The format of the name ID, as defined by the <code>Format</code> attribute in the\\n            <code>NameID</code> element of the SAML assertion. Typical examples of the format are\\n            <code>transient</code> or <code>persistent</code>. </p>\\n         <p> If the format includes the prefix\\n            <code>urn:oasis:names:tc:SAML:2.0:nameid-format</code>, that prefix is removed. For\\n         example, <code>urn:oasis:names:tc:SAML:2.0:nameid-format:transient</code> is returned as\\n            <code>transient</code>. If the format includes any other prefix, the format is returned\\n         with no modifications.</p>\"\n                    }\n                },\n                \"Issuer\": {\n                    \"target\": \"com.amazonaws.sts#Issuer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The value of the <code>Issuer</code> element of the SAML assertion.</p>\"\n                    }\n                },\n                \"Audience\": {\n                    \"target\": \"com.amazonaws.sts#Audience\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The value of the <code>Recipient</code> attribute of the\\n            <code>SubjectConfirmationData</code> element of the SAML assertion. </p>\"\n                    }\n                },\n                \"NameQualifier\": {\n                    \"target\": \"com.amazonaws.sts#NameQualifier\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A hash value based on the concatenation of the following:</p>\\n         <ul>\\n            <li>\\n               <p>The <code>Issuer</code> response value.</p>\\n            </li>\\n            <li>\\n               <p>The Amazon Web Services account ID.</p>\\n            </li>\\n            <li>\\n               <p>The friendly name (the last part of the ARN) of the SAML provider in IAM.</p>\\n            </li>\\n         </ul>\\n         <p>The combination of <code>NameQualifier</code> and <code>Subject</code> can be used to\\n         uniquely identify a user.</p>\\n         <p>The following pseudocode shows how the hash value is calculated:</p>\\n         <p>\\n            <code>BASE64 ( SHA1 ( \\\"https://example.com/saml\\\" + \\\"123456789012\\\" + \\\"/MySAMLIdP\\\" ) )</code>\\n         </p>\"\n                    }\n                },\n                \"SourceIdentity\": {\n                    \"target\": \"com.amazonaws.sts#sourceIdentityType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The value in the <code>SourceIdentity</code> attribute in the SAML assertion. The source\\n         identity value persists across <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html#iam-term-role-chaining\\\">chained role</a>\\n         sessions.</p>\\n         <p>You can require users to set a source identity value when they assume a role. You do\\n         this by using the <code>sts:SourceIdentity</code> condition key in a role trust policy.\\n         That way, actions that are taken with the role are associated with that user. After the\\n         source identity is set, the value cannot be changed. It is present in the request for all\\n         actions that are taken by the role and persists across <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html#id_roles_terms-and-concepts\\\">chained role</a>\\n         sessions. You can configure your SAML identity provider to use an attribute associated with\\n         your users, like user name or email, as the source identity when calling\\n            <code>AssumeRoleWithSAML</code>. You do this by adding an attribute to the SAML\\n         assertion. For more information about using source identity, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_control-access_monitor.html\\\">Monitor and control\\n            actions taken with assumed roles</a> in the\\n         <i>IAM User Guide</i>.</p>\\n         <p>The regex used to validate this parameter is a string of characters \\n    consisting of upper- and lower-case alphanumeric characters with no spaces. You can \\n    also include underscores or any of the following characters: =,.@-</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the response to a successful <a>AssumeRoleWithSAML</a> request,\\n      including temporary Amazon Web Services credentials that can be used to make Amazon Web Services requests. </p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.sts#AssumeRoleWithWebIdentity\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.sts#AssumeRoleWithWebIdentityRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.sts#AssumeRoleWithWebIdentityResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.sts#ExpiredTokenException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.sts#IDPCommunicationErrorException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.sts#IDPRejectedClaimException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.sts#InvalidIdentityTokenException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.sts#MalformedPolicyDocumentException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.sts#PackedPolicyTooLargeException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.sts#RegionDisabledException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#auth\": [],\n                \"smithy.api#documentation\": \"<p>Returns a set of temporary security credentials for users who have been authenticated in\\n         a mobile or web application with a web identity provider. Example providers include the\\n         OAuth 2.0 providers Login with Amazon and Facebook, or any OpenID Connect-compatible\\n         identity provider such as Google or <a href=\\\"https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-identity.html\\\">Amazon Cognito federated identities</a>.</p>\\n         <note>\\n            <p>For mobile applications, we recommend that you use Amazon Cognito. You can use Amazon Cognito with the\\n               <a href=\\\"http://aws.amazon.com/sdkforios/\\\">Amazon Web Services SDK for iOS Developer Guide</a> and the <a href=\\\"http://aws.amazon.com/sdkforandroid/\\\">Amazon Web Services SDK for Android Developer Guide</a> to uniquely\\n            identify a user. You can also supply the user with a consistent identity throughout the\\n            lifetime of an application.</p>\\n            <p>To learn more about Amazon Cognito, see <a href=\\\"https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-identity.html\\\">Amazon Cognito identity\\n               pools</a> in <i>Amazon Cognito Developer Guide</i>.</p>\\n         </note>\\n         <p>Calling <code>AssumeRoleWithWebIdentity</code> does not require the use of Amazon Web Services\\n         security credentials. Therefore, you can distribute an application (for example, on mobile\\n         devices) that requests temporary security credentials without including long-term Amazon Web Services\\n         credentials in the application. You also don't need to deploy server-based proxy services\\n         that use long-term Amazon Web Services credentials. Instead, the identity of the caller is validated by\\n         using a token from the web identity provider. For a comparison of\\n            <code>AssumeRoleWithWebIdentity</code> with the other API operations that produce\\n         temporary credentials, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html\\\">Requesting Temporary Security\\n            Credentials</a> and <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_sts-comparison.html\\\">Compare STS\\n            credentials</a> in the <i>IAM User Guide</i>.</p>\\n         <p>The temporary security credentials returned by this API consist of an access key ID, a\\n         secret access key, and a security token. Applications can use these temporary security\\n         credentials to sign calls to Amazon Web Services service API operations.</p>\\n         <p>\\n            <b>Session Duration</b>\\n         </p>\\n         <p>By default, the temporary security credentials created by\\n            <code>AssumeRoleWithWebIdentity</code> last for one hour. However, you can use the\\n         optional <code>DurationSeconds</code> parameter to specify the duration of your session.\\n         You can provide a value from 900 seconds (15 minutes) up to the maximum session duration\\n         setting for the role. This setting can have a value from 1 hour to 12 hours. To learn how\\n         to view the maximum value for your role, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_update-role-settings.html#id_roles_update-session-duration\\\">Update the maximum session duration for a role </a> in the\\n            <i>IAM User Guide</i>. The maximum session duration limit applies when\\n         you use the <code>AssumeRole*</code> API operations or the <code>assume-role*</code> CLI\\n         commands. However the limit does not apply when you use those operations to create a\\n         console URL. For more information, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html\\\">Using IAM Roles</a> in the\\n            <i>IAM User Guide</i>. </p>\\n         <p>\\n            <b>Permissions</b>\\n         </p>\\n         <p>The temporary security credentials created by <code>AssumeRoleWithWebIdentity</code> can\\n         be used to make API calls to any Amazon Web Services service with the following exception: you cannot\\n         call the STS <code>GetFederationToken</code> or <code>GetSessionToken</code> API\\n         operations.</p>\\n         <p>(Optional) You can pass inline or managed <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session\\\">session policies</a> to\\n         this operation. You can pass a single JSON policy document to use as an inline session\\n         policy. You can also specify up to 10 managed policy Amazon Resource Names (ARNs) to use as\\n         managed session policies. The plaintext that you use for both inline and managed session\\n         policies can't exceed 2,048 characters. Passing policies to this operation returns new \\n         temporary credentials. The resulting session's permissions are the intersection of the \\n         role's identity-based policy and the session policies. You can use the role's temporary \\n         credentials in subsequent Amazon Web Services API calls to access resources in the account that owns \\n         the role. You cannot use session policies to grant more permissions than those allowed \\n         by the identity-based policy of the role that is being assumed. For more information, see\\n            <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session\\\">Session\\n            Policies</a> in the <i>IAM User Guide</i>.</p>\\n         <p>\\n            <b>Tags</b>\\n         </p>\\n         <p>(Optional) You can configure your IdP to pass attributes into your web identity token as\\n         session tags. Each session tag consists of a key name and an associated value. For more\\n         information about session tags, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_session-tags.html\\\">Passing Session Tags in STS</a> in the\\n            <i>IAM User Guide</i>.</p>\\n         <p>You can pass up to 50 session tags. The plaintext session tag keys can’t exceed 128\\n         characters and the values can’t exceed 256 characters. For these and additional limits, see\\n            <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_iam-limits.html#reference_iam-limits-entity-length\\\">IAM\\n            and STS Character Limits</a> in the <i>IAM User Guide</i>.</p>\\n         <note>\\n            <p>An Amazon Web Services conversion compresses the passed inline session policy, managed policy ARNs,\\n            and session tags into a packed binary format that has a separate limit. Your request can\\n            fail for this limit even if your plaintext meets the other requirements. The\\n               <code>PackedPolicySize</code> response element indicates by percentage how close the\\n            policies and tags for your request are to the upper size limit.</p>\\n         </note>\\n         <p>You can pass a session tag with the same key as a tag that is attached to the role. When\\n         you do, the session tag overrides the role tag with the same key.</p>\\n         <p>An administrator must grant you the permissions necessary to pass session tags. The\\n         administrator can also create granular permissions to allow you to pass only specific\\n         session tags. For more information, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/tutorial_attribute-based-access-control.html\\\">Tutorial: Using Tags\\n            for Attribute-Based Access Control</a> in the\\n         <i>IAM User Guide</i>.</p>\\n         <p>You can set the session tags as transitive. Transitive tags persist during role\\n         chaining. For more information, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_session-tags.html#id_session-tags_role-chaining\\\">Chaining Roles\\n            with Session Tags</a> in the <i>IAM User Guide</i>.</p>\\n         <p>\\n            <b>Identities</b>\\n         </p>\\n         <p>Before your application can call <code>AssumeRoleWithWebIdentity</code>, you must have\\n         an identity token from a supported identity provider and create a role that the application\\n         can assume. The role that your application assumes must trust the identity provider that is\\n         associated with the identity token. In other words, the identity provider must be specified\\n         in the role's trust policy. </p>\\n         <important>\\n            <p>Calling <code>AssumeRoleWithWebIdentity</code> can result in an entry in your\\n            CloudTrail logs. The entry includes the <a href=\\\"http://openid.net/specs/openid-connect-core-1_0.html#Claims\\\">Subject</a> of\\n            the provided web identity token. We recommend that you avoid using any personally\\n            identifiable information (PII) in this field. For example, you could instead use a GUID\\n            or a pairwise identifier, as <a href=\\\"http://openid.net/specs/openid-connect-core-1_0.html#SubjectIDTypes\\\">suggested\\n               in the OIDC specification</a>.</p>\\n         </important>\\n         <p>For more information about how to use OIDC federation and the\\n            <code>AssumeRoleWithWebIdentity</code> API, see the following resources: </p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_oidc_manual.html\\\">Using Web Identity Federation API Operations for Mobile Apps</a> and <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html#api_assumerolewithwebidentity\\\">Federation Through a Web-based Identity Provider</a>. </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"http://aws.amazon.com/sdkforios/\\\">Amazon Web Services SDK for iOS Developer Guide</a> and <a href=\\\"http://aws.amazon.com/sdkforandroid/\\\">Amazon Web Services SDK for Android Developer Guide</a>. These toolkits\\n               contain sample apps that show how to invoke the identity providers. The toolkits then\\n               show how to use the information from these providers to get and use temporary\\n               security credentials. </p>\\n            </li>\\n         </ul>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To assume a role as an OpenID Connect-federated user\",\n                        \"documentation\": \"\",\n                        \"input\": {\n                            \"RoleArn\": \"arn:aws:iam::123456789012:role/FederatedWebIdentityRole\",\n                            \"RoleSessionName\": \"app1\",\n                            \"Policy\": \"{\\\"Version\\\":\\\"2012-10-17\\\",\\\"Statement\\\":[{\\\"Sid\\\":\\\"Stmt1\\\",\\\"Effect\\\":\\\"Allow\\\",\\\"Action\\\":\\\"s3:ListAllMyBuckets\\\",\\\"Resource\\\":\\\"*\\\"}]}\",\n                            \"WebIdentityToken\": \"Atza%7CIQEBLjAsAhRFiXuWpUXuRvQ9PZL3GMFcYevydwIUFAHZwXZXXXXXXXXJnrulxKDHwy87oGKPznh0D6bEQZTSCzyoCtL_8S07pLpr0zMbn6w1lfVZKNTBdDansFBmtGnIsIapjI6xKR02Yc_2bQ8LZbUXSGm6Ry6_BG7PrtLZtj_dfCTj92xNGed-CrKqjG7nPBjNIL016GGvuS5gSvPRUxWES3VYfm1wl7WTI7jn-Pcb6M-buCgHhFOzTQxod27L9CqnOLio7N3gZAGpsp6n1-AJBOCJckcyXe2c6uD0srOJeZlKUm2eTDVMf8IehDVI0r1QOnTV6KzzAI3OY87Vd_cVMQ\",\n                            \"ProviderId\": \"www.amazon.com\",\n                            \"DurationSeconds\": 3600\n                        },\n                        \"output\": {\n                            \"Credentials\": {\n                                \"SessionToken\": \"AQoDYXdzEE0a8ANXXXXXXXXNO1ewxE5TijQyp+IEXAMPLE\",\n                                \"SecretAccessKey\": \"wJalrXUtnFEMI/K7MDENG/bPxRfiCYzEXAMPLEKEY\",\n                                \"Expiration\": \"2014-10-24T23:00:23Z\",\n                                \"AccessKeyId\": \"AKIAIOSFODNN7EXAMPLE\"\n                            },\n                            \"SubjectFromWebIdentityToken\": \"amzn1.account.AF6RHO7KZU5XRVQJGXK6HEXAMPLE\",\n                            \"AssumedRoleUser\": {\n                                \"Arn\": \"arn:aws:sts::123456789012:assumed-role/FederatedWebIdentityRole/app1\",\n                                \"AssumedRoleId\": \"AROACLKWSDQRAOEXAMPLE:app1\"\n                            },\n                            \"PackedPolicySize\": 123,\n                            \"Provider\": \"www.amazon.com\",\n                            \"Audience\": \"client.5498841531868486423.1548@apps.example.com\"\n                        }\n                    }\n                ],\n                \"smithy.api#optionalAuth\": {}\n            }\n        },\n        \"com.amazonaws.sts#AssumeRoleWithWebIdentityRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RoleArn\": {\n                    \"target\": \"com.amazonaws.sts#arnType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the role that the caller is assuming.</p>\\n         <note>\\n            <p>Additional considerations apply to Amazon Cognito identity pools that assume <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies-cross-account-resource-access.html\\\">cross-account IAM roles</a>. The trust policies of these roles must accept the\\n               <code>cognito-identity.amazonaws.com</code> service principal and must contain the\\n               <code>cognito-identity.amazonaws.com:aud</code> condition key to restrict role\\n            assumption to users from your intended identity pools. A policy that trusts Amazon Cognito\\n            identity pools without this condition creates a risk that a user from an unintended\\n            identity pool can assume the role. For more information, see <a href=\\\"https://docs.aws.amazon.com/cognito/latest/developerguide/iam-roles.html#trust-policies\\\"> Trust policies for\\n               IAM roles in Basic (Classic) authentication </a> in the <i>Amazon Cognito\\n               Developer Guide</i>.</p>\\n         </note>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"RoleSessionName\": {\n                    \"target\": \"com.amazonaws.sts#roleSessionNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An identifier for the assumed role session. Typically, you pass the name or identifier\\n         that is associated with the user who is using your application. That way, the temporary\\n         security credentials that your application will use are associated with that user. This\\n         session name is included as part of the ARN and assumed role ID in the\\n            <code>AssumedRoleUser</code> response element.</p>\\n         <p>For security purposes, administrators can view this field in <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/cloudtrail-integration.html#cloudtrail-integration_signin-tempcreds\\\">CloudTrail logs</a> to help identify who performed an action in Amazon Web Services. Your\\n         administrator might require that you specify your user name as the session name when you\\n         assume the role. For more information, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_iam-condition-keys.html#ck_rolesessionname\\\">\\n               <code>sts:RoleSessionName</code>\\n            </a>.</p>\\n         <p>The regex used to validate this parameter is a string of characters \\n    consisting of upper- and lower-case alphanumeric characters with no spaces. You can \\n    also include underscores or any of the following characters: =,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"WebIdentityToken\": {\n                    \"target\": \"com.amazonaws.sts#clientTokenType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The OAuth 2.0 access token or OpenID Connect ID token that is provided by the identity\\n         provider. Your application must get this token by authenticating the user who is using your\\n         application with a web identity provider before the application makes an\\n            <code>AssumeRoleWithWebIdentity</code> call. Timestamps in the token must be formatted\\n         as either an integer or a long integer. Tokens must be signed using either RSA keys (RS256,\\n         RS384, or RS512) or ECDSA keys (ES256, ES384, or ES512).</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ProviderId\": {\n                    \"target\": \"com.amazonaws.sts#urlType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The fully qualified host component of the domain name of the OAuth 2.0 identity\\n         provider. Do not specify this value for an OpenID Connect identity provider.</p>\\n         <p>Currently <code>www.amazon.com</code> and <code>graph.facebook.com</code> are the only\\n         supported identity providers for OAuth 2.0 access tokens. Do not include URL schemes and\\n         port numbers.</p>\\n         <p>Do not specify this value for OpenID Connect ID tokens.</p>\"\n                    }\n                },\n                \"PolicyArns\": {\n                    \"target\": \"com.amazonaws.sts#policyDescriptorListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Names (ARNs) of the IAM managed policies that you want to use as\\n         managed session policies. The policies must exist in the same account as the role.</p>\\n         <p>This parameter is optional. You can provide up to 10 managed policy ARNs. However, the\\n         plaintext that you use for both inline and managed session policies can't exceed 2,048\\n         characters. For more information about ARNs, see <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html\\\">Amazon Resource Names (ARNs) and Amazon Web Services\\n            Service Namespaces</a> in the Amazon Web Services General Reference.</p>\\n         <note>\\n            <p>An Amazon Web Services conversion compresses the passed inline session policy, managed policy ARNs,\\n            and session tags into a packed binary format that has a separate limit. Your request can\\n            fail for this limit even if your plaintext meets the other requirements. The\\n               <code>PackedPolicySize</code> response element indicates by percentage how close the\\n            policies and tags for your request are to the upper size limit.</p>\\n         </note>\\n         <p>Passing policies to this operation returns new \\n         temporary credentials. The resulting session's permissions are the intersection of the \\n         role's identity-based policy and the session policies. You can use the role's temporary \\n         credentials in subsequent Amazon Web Services API calls to access resources in the account that owns \\n         the role. You cannot use session policies to grant more permissions than those allowed \\n         by the identity-based policy of the role that is being assumed. For more information, see\\n            <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session\\\">Session\\n            Policies</a> in the <i>IAM User Guide</i>.</p>\"\n                    }\n                },\n                \"Policy\": {\n                    \"target\": \"com.amazonaws.sts#sessionPolicyDocumentType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An IAM policy in JSON format that you want to use as an inline session policy.</p>\\n         <p>This parameter is optional. Passing policies to this operation returns new \\n         temporary credentials. The resulting session's permissions are the intersection of the \\n         role's identity-based policy and the session policies. You can use the role's temporary \\n         credentials in subsequent Amazon Web Services API calls to access resources in the account that owns \\n         the role. You cannot use session policies to grant more permissions than those allowed \\n         by the identity-based policy of the role that is being assumed. For more information, see\\n            <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session\\\">Session\\n            Policies</a> in the <i>IAM User Guide</i>.</p>\\n         <p>The plaintext that you use for both inline and managed session policies can't exceed\\n         2,048 characters. The JSON policy characters can be any ASCII character from the space\\n         character to the end of the valid character list (\\\\u0020 through \\\\u00FF). It can also\\n         include the tab (\\\\u0009), linefeed (\\\\u000A), and carriage return (\\\\u000D)\\n         characters.</p>\\n         <p>For more information about role session permissions, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session\\\">Session\\n            policies</a>.</p>\\n         <note>\\n            <p>An Amazon Web Services conversion compresses the passed inline session policy, managed policy ARNs,\\n            and session tags into a packed binary format that has a separate limit. Your request can\\n            fail for this limit even if your plaintext meets the other requirements. The\\n               <code>PackedPolicySize</code> response element indicates by percentage how close the\\n            policies and tags for your request are to the upper size limit.</p>\\n         </note>\"\n                    }\n                },\n                \"DurationSeconds\": {\n                    \"target\": \"com.amazonaws.sts#roleDurationSecondsType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The duration, in seconds, of the role session. The value can range from 900 seconds (15\\n         minutes) up to the maximum session duration setting for the role. This setting can have a\\n         value from 1 hour to 12 hours. If you specify a value higher than this setting, the\\n         operation fails. For example, if you specify a session duration of 12 hours, but your\\n         administrator set the maximum session duration to 6 hours, your operation fails. To learn\\n         how to view the maximum value for your role, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html#id_roles_use_view-role-max-session\\\">View the\\n            Maximum Session Duration Setting for a Role</a> in the\\n            <i>IAM User Guide</i>.</p>\\n         <p>By default, the value is set to <code>3600</code> seconds. </p>\\n         <note>\\n            <p>The <code>DurationSeconds</code> parameter is separate from the duration of a console\\n            session that you might request using the returned credentials. The request to the\\n            federation endpoint for a console sign-in token takes a <code>SessionDuration</code>\\n            parameter that specifies the maximum length of the console session. For more\\n            information, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_enable-console-custom-url.html\\\">Creating a URL\\n               that Enables Federated Users to Access the Amazon Web Services Management Console</a> in the\\n               <i>IAM User Guide</i>.</p>\\n         </note>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.sts#AssumeRoleWithWebIdentityResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Credentials\": {\n                    \"target\": \"com.amazonaws.sts#Credentials\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The temporary security credentials, which include an access key ID, a secret access key,\\n         and a security token.</p>\\n         <note>\\n            <p>The size of the security token that STS API operations return is not fixed. We\\n        strongly recommend that you make no assumptions about the maximum size.</p>\\n         </note>\"\n                    }\n                },\n                \"SubjectFromWebIdentityToken\": {\n                    \"target\": \"com.amazonaws.sts#webIdentitySubjectType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The unique user identifier that is returned by the identity provider. This identifier is\\n         associated with the <code>WebIdentityToken</code> that was submitted with the\\n            <code>AssumeRoleWithWebIdentity</code> call. The identifier is typically unique to the\\n         user and the application that acquired the <code>WebIdentityToken</code> (pairwise\\n         identifier). For OpenID Connect ID tokens, this field contains the value returned by the\\n         identity provider as the token's <code>sub</code> (Subject) claim. </p>\"\n                    }\n                },\n                \"AssumedRoleUser\": {\n                    \"target\": \"com.amazonaws.sts#AssumedRoleUser\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) and the assumed role ID, which are identifiers that you\\n         can use to refer to the resulting temporary security credentials. For example, you can\\n         reference these credentials as a principal in a resource-based policy by using the ARN or\\n         assumed role ID. The ARN and ID include the <code>RoleSessionName</code> that you specified\\n         when you called <code>AssumeRole</code>. </p>\"\n                    }\n                },\n                \"PackedPolicySize\": {\n                    \"target\": \"com.amazonaws.sts#nonNegativeIntegerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A percentage value that indicates the packed size of the session policies and session \\n      tags combined passed in the request. The request fails if the packed size is greater than 100 percent, \\n      which means the policies and tags exceeded the allowed space.</p>\"\n                    }\n                },\n                \"Provider\": {\n                    \"target\": \"com.amazonaws.sts#Issuer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The issuing authority of the web identity token presented. For OpenID Connect ID\\n         tokens, this contains the value of the <code>iss</code> field. For OAuth 2.0 access tokens,\\n         this contains the value of the <code>ProviderId</code> parameter that was passed in the\\n            <code>AssumeRoleWithWebIdentity</code> request.</p>\"\n                    }\n                },\n                \"Audience\": {\n                    \"target\": \"com.amazonaws.sts#Audience\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The intended audience (also known as client ID) of the web identity token. This is\\n         traditionally the client identifier issued to the application that requested the web\\n         identity token.</p>\"\n                    }\n                },\n                \"SourceIdentity\": {\n                    \"target\": \"com.amazonaws.sts#sourceIdentityType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The value of the source identity that is returned in the JSON web token (JWT) from the\\n         identity provider.</p>\\n         <p>You can require users to set a source identity value when they assume a role. You do\\n         this by using the <code>sts:SourceIdentity</code> condition key in a role trust policy.\\n         That way, actions that are taken with the role are associated with that user. After the\\n         source identity is set, the value cannot be changed. It is present in the request for all\\n         actions that are taken by the role and persists across <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html#id_roles_terms-and-concepts\\\">chained role</a>\\n         sessions. You can configure your identity provider to use an attribute associated with your\\n         users, like user name or email, as the source identity when calling\\n            <code>AssumeRoleWithWebIdentity</code>. You do this by adding a claim to the JSON web\\n         token. To learn more about OIDC tokens and claims, see <a href=\\\"https://docs.aws.amazon.com/cognito/latest/developerguide/amazon-cognito-user-pools-using-tokens-with-identity-providers.html\\\">Using Tokens with User Pools</a> in the <i>Amazon Cognito Developer Guide</i>.\\n         For more information about using source identity, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_control-access_monitor.html\\\">Monitor and control\\n            actions taken with assumed roles</a> in the\\n         <i>IAM User Guide</i>.</p>\\n         <p>The regex used to validate this parameter is a string of characters \\n    consisting of upper- and lower-case alphanumeric characters with no spaces. You can \\n    also include underscores or any of the following characters: =,.@-</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the response to a successful <a>AssumeRoleWithWebIdentity</a>\\n      request, including temporary Amazon Web Services credentials that can be used to make Amazon Web Services requests. </p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.sts#AssumeRoot\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.sts#AssumeRootRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.sts#AssumeRootResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.sts#ExpiredTokenException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.sts#RegionDisabledException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns a set of short term credentials you can use to perform privileged tasks on a\\n         member account in your organization.</p>\\n         <p>Before you can launch a privileged session, you must have centralized root access in\\n         your organization. For steps to enable this feature, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_root-enable-root-access.html\\\">Centralize root access for\\n            member accounts</a> in the <i>IAM User Guide</i>.</p>\\n         <note>\\n            <p>The STS global endpoint is not supported for AssumeRoot. You must send this request\\n            to a Regional STS endpoint. For more information, see <a href=\\\"https://docs.aws.amazon.com/STS/latest/APIReference/welcome.html#sts-endpoints\\\">Endpoints</a>.</p>\\n         </note>\\n         <p>You can track AssumeRoot in CloudTrail logs to determine what actions were performed in a\\n         session. For more information, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/cloudtrail-track-privileged-tasks.html\\\">Track privileged tasks\\n            in CloudTrail</a> in the <i>IAM User Guide</i>.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To launch a privileged session\",\n                        \"documentation\": \"The following command retrieves a set of short-term credentials you can use to unlock an S3 bucket for a member account by removing the bucket policy.\",\n                        \"input\": {\n                            \"TargetPrincipal\": \"111122223333\",\n                            \"TaskPolicyArn\": {\n                                \"arn\": \"arn:aws:iam::aws:policy/root-task/S3UnlockBucketPolicy\"\n                            },\n                            \"DurationSeconds\": 900\n                        },\n                        \"output\": {\n                            \"Credentials\": {\n                                \"SecretAccessKey\": \"9drTJvcXLB89EXAMPLELB8923FB892xMFI\",\n                                \"SessionToken\": \"AQoXdzELDDY//////////wEaoAK1wvxJY12r2IrDFT2IvAzTCn3zHoZ7YNtpiQLF0MqZye/qwjzP2iEXAMPLEbw/m3hsj8VBTkPORGvr9jM5sgP+w9IZWZnU+LWhmg+a5fDi2oTGUYcdg9uexQ4mtCHIHfi4citgqZTgco40Yqr4lIlo4V2b2Dyauk0eYFNebHtYlFVgAUj+7Indz3LU0aTWk1WKIjHmmMCIoTkyYp/k7kUG7moeEYKSitwQIi6Gjn+nyzM+PtoA3685ixzv0R7i5rjQi0YE0lf1oeie3bDiNHncmzosRM6SFiPzSvp6h/32xQuZsjcypmwsPSDtTPYcs0+YN/8BRi2/IcrxSpnWEXAMPLEXSDFTAQAM6Dl9zR0tXoybnlrZIwMLlMi1Kcgo5OytwU=\",\n                                \"Expiration\": \"2024-11-15T00:05:07Z\",\n                                \"AccessKeyId\": \"ASIAJEXAMPLEXEG2JICEA\"\n                            },\n                            \"SourceIdentity\": \"Alice\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.sts#AssumeRootRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TargetPrincipal\": {\n                    \"target\": \"com.amazonaws.sts#TargetPrincipalType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The member account principal ARN or account ID.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TaskPolicyArn\": {\n                    \"target\": \"com.amazonaws.sts#PolicyDescriptorType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The identity based policy that scopes the session to the privileged tasks that can be\\n         performed. You can use one of following Amazon Web Services managed policies to scope root session\\n         actions.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/security-iam-awsmanpol.html#security-iam-awsmanpol-IAMAuditRootUserCredentials\\\">IAMAuditRootUserCredentials</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/security-iam-awsmanpol.html#security-iam-awsmanpol-IAMCreateRootUserPassword\\\">IAMCreateRootUserPassword</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/security-iam-awsmanpol.html#security-iam-awsmanpol-IAMDeleteRootUserCredentials\\\">IAMDeleteRootUserCredentials</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/security-iam-awsmanpol.html#security-iam-awsmanpol-S3UnlockBucketPolicy\\\">S3UnlockBucketPolicy</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/security-iam-awsmanpol.html#security-iam-awsmanpol-SQSUnlockQueuePolicy\\\">SQSUnlockQueuePolicy</a>\\n               </p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DurationSeconds\": {\n                    \"target\": \"com.amazonaws.sts#RootDurationSecondsType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The duration, in seconds, of the privileged session. The value can range from 0 seconds\\n         up to the maximum session duration of 900 seconds (15 minutes). If you specify a value\\n         higher than this setting, the operation fails.</p>\\n         <p>By default, the value is set to <code>900</code> seconds.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.sts#AssumeRootResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Credentials\": {\n                    \"target\": \"com.amazonaws.sts#Credentials\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The temporary security credentials, which include an access key ID, a secret access key,\\n         and a security token.</p>\\n         <note>\\n            <p>The size of the security token that STS API operations return is not fixed. We\\n        strongly recommend that you make no assumptions about the maximum size.</p>\\n         </note>\"\n                    }\n                },\n                \"SourceIdentity\": {\n                    \"target\": \"com.amazonaws.sts#sourceIdentityType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The source identity specified by the principal that is calling the\\n            <code>AssumeRoot</code> operation.</p>\\n         <p>You can use the <code>aws:SourceIdentity</code> condition key to control access based on\\n         the value of source identity. For more information about using source identity, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_control-access_monitor.html\\\">Monitor and control\\n            actions taken with assumed roles</a> in the\\n         <i>IAM User Guide</i>.</p>\\n         <p>The regex used to validate this parameter is a string of characters consisting of upper-\\n         and lower-case alphanumeric characters with no spaces. You can also include underscores or\\n         any of the following characters: =,.@-</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.sts#AssumedRoleUser\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AssumedRoleId\": {\n                    \"target\": \"com.amazonaws.sts#assumedRoleIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A unique identifier that contains the role ID and the role session name of the role that\\n         is being assumed. The role ID is generated by Amazon Web Services when the role is created.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Arn\": {\n                    \"target\": \"com.amazonaws.sts#arnType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the temporary security credentials that are returned from the <a>AssumeRole</a> action. For more information about ARNs and how to use them in\\n         policies, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html\\\">IAM Identifiers</a> in the\\n            <i>IAM User Guide</i>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The identifiers for the temporary security credentials that the operation\\n         returns.</p>\"\n            }\n        },\n        \"com.amazonaws.sts#Audience\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.sts#Credentials\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccessKeyId\": {\n                    \"target\": \"com.amazonaws.sts#accessKeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The access key ID that identifies the temporary security credentials.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"SecretAccessKey\": {\n                    \"target\": \"com.amazonaws.sts#accessKeySecretType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The secret access key that can be used to sign requests.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"SessionToken\": {\n                    \"target\": \"com.amazonaws.sts#tokenType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The token that users must pass to the service API to use the temporary\\n         credentials.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Expiration\": {\n                    \"target\": \"com.amazonaws.sts#dateType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date on which the current credentials expire.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Amazon Web Services credentials for API authentication.</p>\"\n            }\n        },\n        \"com.amazonaws.sts#DecodeAuthorizationMessage\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.sts#DecodeAuthorizationMessageRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.sts#DecodeAuthorizationMessageResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.sts#InvalidAuthorizationMessageException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Decodes additional information about the authorization status of a request from an\\n         encoded message returned in response to an Amazon Web Services request.</p>\\n         <p>For example, if a user is not authorized to perform an operation that he or she has\\n         requested, the request returns a <code>Client.UnauthorizedOperation</code> response (an\\n         HTTP 403 response). Some Amazon Web Services operations additionally return an encoded message that can\\n         provide details about this authorization failure. </p>\\n         <note>\\n            <p>Only certain Amazon Web Services operations return an encoded authorization message. The\\n            documentation for an individual operation indicates whether that operation returns an\\n            encoded message in addition to returning an HTTP code.</p>\\n         </note>\\n         <p>The message is encoded because the details of the authorization status can contain\\n         privileged information that the user who requested the operation should not see. To decode\\n         an authorization status message, a user must be granted permissions through an IAM <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html\\\">policy</a> to\\n         request the <code>DecodeAuthorizationMessage</code>\\n            (<code>sts:DecodeAuthorizationMessage</code>) action. </p>\\n         <p>The decoded message includes the following type of information:</p>\\n         <ul>\\n            <li>\\n               <p>Whether the request was denied due to an explicit deny or due to the absence of an\\n               explicit allow. For more information, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_evaluation-logic.html#policy-eval-denyallow\\\">Determining Whether a Request is Allowed or Denied</a> in the\\n                  <i>IAM User Guide</i>. </p>\\n            </li>\\n            <li>\\n               <p>The principal who made the request.</p>\\n            </li>\\n            <li>\\n               <p>The requested action.</p>\\n            </li>\\n            <li>\\n               <p>The requested resource.</p>\\n            </li>\\n            <li>\\n               <p>The values of condition keys in the context of the user's request.</p>\\n            </li>\\n         </ul>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To decode information about an authorization status of a request\",\n                        \"documentation\": \"\",\n                        \"input\": {\n                            \"EncodedMessage\": \"<encoded-message>\"\n                        },\n                        \"output\": {\n                            \"DecodedMessage\": \"{\\\"allowed\\\": \\\"false\\\",\\\"explicitDeny\\\": \\\"false\\\",\\\"matchedStatements\\\": \\\"\\\",\\\"failures\\\": \\\"\\\",\\\"context\\\": {\\\"principal\\\": {\\\"id\\\": \\\"AIDACKCEVSQ6C2EXAMPLE\\\",\\\"name\\\": \\\"Bob\\\",\\\"arn\\\": \\\"arn:aws:iam::123456789012:user/Bob\\\"},\\\"action\\\": \\\"ec2:StopInstances\\\",\\\"resource\\\": \\\"arn:aws:ec2:us-east-1:123456789012:instance/i-dd01c9bd\\\",\\\"conditions\\\": [{\\\"item\\\": {\\\"key\\\": \\\"ec2:Tenancy\\\",\\\"values\\\": [\\\"default\\\"]},{\\\"item\\\": {\\\"key\\\": \\\"ec2:ResourceTag/elasticbeanstalk:environment-name\\\",\\\"values\\\": [\\\"Default-Environment\\\"]}},(Additional items ...)]}}\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.sts#DecodeAuthorizationMessageRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"EncodedMessage\": {\n                    \"target\": \"com.amazonaws.sts#encodedMessageType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The encoded message that was returned with the response.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.sts#DecodeAuthorizationMessageResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DecodedMessage\": {\n                    \"target\": \"com.amazonaws.sts#decodedMessageType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The API returns a response with the decoded message.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A document that contains additional information about the authorization status of a\\n      request from an encoded message that is returned in response to an Amazon Web Services request.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.sts#ExpiredTokenException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.sts#expiredIdentityTokenMessage\"\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"ExpiredTokenException\",\n                    \"httpResponseCode\": 400\n                },\n                \"smithy.api#documentation\": \"<p>The web identity token that was passed is expired or is not valid. Get a new identity\\n            token from the identity provider and then retry the request.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.sts#FederatedUser\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"FederatedUserId\": {\n                    \"target\": \"com.amazonaws.sts#federatedIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The string that identifies the federated user associated with the credentials, similar\\n         to the unique ID of an IAM user.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Arn\": {\n                    \"target\": \"com.amazonaws.sts#arnType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN that specifies the federated user that is associated with the credentials. For\\n         more information about ARNs and how to use them in policies, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html\\\">IAM\\n            Identifiers</a> in the <i>IAM User Guide</i>. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Identifiers for the federated user that is associated with the credentials.</p>\"\n            }\n        },\n        \"com.amazonaws.sts#GetAccessKeyInfo\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.sts#GetAccessKeyInfoRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.sts#GetAccessKeyInfoResponse\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns the account identifier for the specified access key ID.</p>\\n         <p>Access keys consist of two parts: an access key ID (for example,\\n            <code>AKIAIOSFODNN7EXAMPLE</code>) and a secret access key (for example,\\n            <code>wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY</code>). For more information about\\n         access keys, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html\\\">Managing Access Keys for IAM\\n            Users</a> in the <i>IAM User Guide</i>.</p>\\n         <p>When you pass an access key ID to this operation, it returns the ID of the Amazon Web Services account\\n         to which the keys belong. Access key IDs beginning with <code>AKIA</code> are long-term\\n         credentials for an IAM user or the Amazon Web Services account root user. Access key IDs\\n         beginning with <code>ASIA</code> are temporary credentials that are created using STS\\n         operations. If the account in the response belongs to you, you can sign in as the root user and review your root user access keys. Then, you can pull a <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_getting-report.html\\\">credentials\\n            report</a> to learn which IAM user owns the keys. To learn who\\n         requested the temporary credentials for an <code>ASIA</code> access key, view the STS\\n         events in your <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/cloudtrail-integration.html\\\">CloudTrail logs</a> in the <i>IAM User Guide</i>.</p>\\n         <p>This operation does not indicate the state of the access key. The key might be active,\\n         inactive, or deleted. Active keys might not have permissions to perform an operation.\\n         Providing a deleted access key might return an error that the key doesn't exist.</p>\"\n            }\n        },\n        \"com.amazonaws.sts#GetAccessKeyInfoRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AccessKeyId\": {\n                    \"target\": \"com.amazonaws.sts#accessKeyIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The identifier of an access key.</p>\\n         <p>This parameter allows (through its regex pattern) a string of characters that can\\n         consist of any upper- or lowercase letter or digit.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.sts#GetAccessKeyInfoResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Account\": {\n                    \"target\": \"com.amazonaws.sts#accountType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number used to identify the Amazon Web Services account.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.sts#GetCallerIdentity\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.sts#GetCallerIdentityRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.sts#GetCallerIdentityResponse\"\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns details about the IAM user or role whose credentials are used to\\n         call the operation.</p>\\n         <note>\\n            <p>No permissions are required to perform this operation. If an administrator attaches a\\n            policy to your identity that explicitly denies access to the\\n               <code>sts:GetCallerIdentity</code> action, you can still perform this operation.\\n            Permissions are not required because the same information is returned when access is\\n            denied. To view an example response, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/troubleshoot_general.html#troubleshoot_general_access-denied-delete-mfa\\\">I Am Not Authorized to Perform: iam:DeleteVirtualMFADevice</a> in the\\n               <i>IAM User Guide</i>.</p>\\n         </note>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To get details about a calling IAM user\",\n                        \"documentation\": \"This example shows a request and response made with the credentials for a user named Alice in the AWS account 123456789012.\",\n                        \"output\": {\n                            \"UserId\": \"AKIAI44QH8DHBEXAMPLE\",\n                            \"Account\": \"123456789012\",\n                            \"Arn\": \"arn:aws:iam::123456789012:user/Alice\"\n                        }\n                    },\n                    {\n                        \"title\": \"To get details about a calling user federated with AssumeRole\",\n                        \"documentation\": \"This example shows a request and response made with temporary credentials created by AssumeRole. The name of the assumed role is my-role-name, and the RoleSessionName is set to my-role-session-name.\",\n                        \"output\": {\n                            \"UserId\": \"AKIAI44QH8DHBEXAMPLE:my-role-session-name\",\n                            \"Account\": \"123456789012\",\n                            \"Arn\": \"arn:aws:sts::123456789012:assumed-role/my-role-name/my-role-session-name\"\n                        }\n                    },\n                    {\n                        \"title\": \"To get details about a calling user federated with GetFederationToken\",\n                        \"documentation\": \"This example shows a request and response made with temporary credentials created by using GetFederationToken. The Name parameter is set to my-federated-user-name.\",\n                        \"output\": {\n                            \"UserId\": \"123456789012:my-federated-user-name\",\n                            \"Account\": \"123456789012\",\n                            \"Arn\": \"arn:aws:sts::123456789012:federated-user/my-federated-user-name\"\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.sts#GetCallerIdentityRequest\": {\n            \"type\": \"structure\",\n            \"members\": {},\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.sts#GetCallerIdentityResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"UserId\": {\n                    \"target\": \"com.amazonaws.sts#userIdType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The unique identifier of the calling entity. The exact value depends on the type of\\n         entity that is making the call. The values returned are those listed in the <b>aws:userid</b> column in the <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_variables.html#principaltable\\\">Principal\\n            table</a> found on the <b>Policy Variables</b> reference\\n         page in the <i>IAM User Guide</i>.</p>\"\n                    }\n                },\n                \"Account\": {\n                    \"target\": \"com.amazonaws.sts#accountType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services account ID number of the account that owns or contains the calling\\n         entity.</p>\"\n                    }\n                },\n                \"Arn\": {\n                    \"target\": \"com.amazonaws.sts#arnType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Web Services ARN associated with the calling entity.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the response to a successful <a>GetCallerIdentity</a> request,\\n         including information about the entity making the request.</p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.sts#GetFederationToken\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.sts#GetFederationTokenRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.sts#GetFederationTokenResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.sts#MalformedPolicyDocumentException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.sts#PackedPolicyTooLargeException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.sts#RegionDisabledException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns a set of temporary security credentials (consisting of an access key ID, a\\n         secret access key, and a security token) for a user. A typical use is in a proxy\\n         application that gets temporary security credentials on behalf of distributed applications\\n         inside a corporate network.</p>\\n         <p>You must call the <code>GetFederationToken</code> operation using the long-term security\\n         credentials of an IAM user. As a result, this call is appropriate in\\n         contexts where those credentials can be safeguarded, usually in a server-based application.\\n         For a comparison of <code>GetFederationToken</code> with the other API operations that\\n         produce temporary credentials, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html\\\">Requesting Temporary Security\\n            Credentials</a> and <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_sts-comparison.html\\\">Compare STS\\n            credentials</a> in the <i>IAM User Guide</i>.</p>\\n         <p>Although it is possible to call <code>GetFederationToken</code> using the security\\n         credentials of an Amazon Web Services account root user rather than an IAM user that you\\n         create for the purpose of a proxy application, we do not recommend it. For more\\n         information, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#lock-away-credentials\\\">Safeguard your root user credentials and don't use them for everyday tasks</a> in the\\n            <i>IAM User Guide</i>. </p>\\n         <note>\\n            <p>You can create a mobile-based or browser-based app that can authenticate users using\\n            a web identity provider like Login with Amazon, Facebook, Google, or an OpenID\\n            Connect-compatible identity provider. In this case, we recommend that you use <a href=\\\"http://aws.amazon.com/cognito/\\\">Amazon Cognito</a> or\\n               <code>AssumeRoleWithWebIdentity</code>. For more information, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html#api_assumerolewithwebidentity\\\">Federation Through a Web-based Identity Provider</a> in the\\n               <i>IAM User Guide</i>.</p>\\n         </note>\\n         <p>\\n            <b>Session duration</b>\\n         </p>\\n         <p>The temporary credentials are valid for the specified duration, from 900 seconds (15\\n         minutes) up to a maximum of 129,600 seconds (36 hours). The default session duration is\\n         43,200 seconds (12 hours). Temporary credentials obtained by using the root user\\n         credentials have a maximum duration of 3,600 seconds (1 hour).</p>\\n         <p>\\n            <b>Permissions</b>\\n         </p>\\n         <p>You can use the temporary credentials created by <code>GetFederationToken</code> in any\\n         Amazon Web Services service with the following exceptions:</p>\\n         <ul>\\n            <li>\\n               <p>You cannot call any IAM operations using the CLI or the Amazon Web Services API. This\\n               limitation does not apply to console sessions.</p>\\n            </li>\\n            <li>\\n               <p>You cannot call any STS operations except <code>GetCallerIdentity</code>.</p>\\n            </li>\\n         </ul>\\n         <p>You can use temporary credentials for single sign-on (SSO) to the console.</p>\\n         <p>You must pass an inline or managed <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session\\\">session policy</a> to\\n         this operation. You can pass a single JSON policy document to use as an inline session\\n         policy. You can also specify up to 10 managed policy Amazon Resource Names (ARNs) to use as\\n         managed session policies. The plaintext that you use for both inline and managed session\\n         policies can't exceed 2,048 characters.</p>\\n         <p>Though the session policy parameters are optional, if you do not pass a policy, then the\\n         resulting federated user session has no permissions. When you pass session policies, the\\n         session permissions are the intersection of the IAM user policies and the\\n         session policies that you pass. This gives you a way to further restrict the permissions\\n         for a federated user. You cannot use session policies to grant more permissions than those\\n         that are defined in the permissions policy of the IAM user. For more\\n         information, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session\\\">Session Policies</a> in\\n         the <i>IAM User Guide</i>. For information about using\\n            <code>GetFederationToken</code> to create temporary security credentials, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html#api_getfederationtoken\\\">GetFederationToken—Federation Through a Custom Identity Broker</a>. </p>\\n         <p>You can use the credentials to access a resource that has a resource-based policy. If\\n         that policy specifically references the federated user session in the\\n            <code>Principal</code> element of the policy, the session has the permissions allowed by\\n         the policy. These permissions are granted in addition to the permissions granted by the\\n         session policies.</p>\\n         <p>\\n            <b>Tags</b>\\n         </p>\\n         <p>(Optional) You can pass tag key-value pairs to your session. These are called session\\n         tags. For more information about session tags, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_session-tags.html\\\">Passing Session Tags in STS</a> in the\\n            <i>IAM User Guide</i>.</p>\\n         <note>\\n            <p>You can create a mobile-based or browser-based app that can authenticate users using\\n            a web identity provider like Login with Amazon, Facebook, Google, or an OpenID\\n            Connect-compatible identity provider. In this case, we recommend that you use <a href=\\\"http://aws.amazon.com/cognito/\\\">Amazon Cognito</a> or\\n               <code>AssumeRoleWithWebIdentity</code>. For more information, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html#api_assumerolewithwebidentity\\\">Federation Through a Web-based Identity Provider</a> in the\\n               <i>IAM User Guide</i>.</p>\\n         </note>\\n         <p>An administrator must grant you the permissions necessary to pass session tags. The\\n         administrator can also create granular permissions to allow you to pass only specific\\n         session tags. For more information, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/tutorial_attribute-based-access-control.html\\\">Tutorial: Using Tags\\n            for Attribute-Based Access Control</a> in the\\n         <i>IAM User Guide</i>.</p>\\n         <p>Tag key–value pairs are not case sensitive, but case is preserved. This means that you\\n         cannot have separate <code>Department</code> and <code>department</code> tag keys. Assume\\n         that the user that you are federating has the\\n            <code>Department</code>=<code>Marketing</code> tag and you pass the\\n            <code>department</code>=<code>engineering</code> session tag. <code>Department</code>\\n         and <code>department</code> are not saved as separate tags, and the session tag passed in\\n         the request takes precedence over the user tag.</p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To get temporary credentials for a role by using GetFederationToken\",\n                        \"documentation\": \"\",\n                        \"input\": {\n                            \"Name\": \"testFedUserSession\",\n                            \"Policy\": \"{\\\"Version\\\":\\\"2012-10-17\\\",\\\"Statement\\\":[{\\\"Sid\\\":\\\"Stmt1\\\",\\\"Effect\\\":\\\"Allow\\\",\\\"Action\\\":\\\"s3:ListAllMyBuckets\\\",\\\"Resource\\\":\\\"*\\\"}]}\",\n                            \"DurationSeconds\": 3600,\n                            \"Tags\": [\n                                {\n                                    \"Key\": \"Project\",\n                                    \"Value\": \"Pegasus\"\n                                },\n                                {\n                                    \"Key\": \"Cost-Center\",\n                                    \"Value\": \"98765\"\n                                }\n                            ]\n                        },\n                        \"output\": {\n                            \"Credentials\": {\n                                \"SessionToken\": \"AQoDYXdzEPT//////////wEXAMPLEtc764bNrC9SAPBSM22wDOk4x4HIZ8j4FZTwdQWLWsKWHGBuFqwAeMicRXmxfpSPfIeoIYRqTflfKD8YUuwthAx7mSEI/qkPpKPi/kMcGdQrmGdeehM4IC1NtBmUpp2wUE8phUZampKsburEDy0KPkyQDYwT7WZ0wq5VSXDvp75YU9HFvlRd8Tx6q6fE8YQcHNVXAkiY9q6d+xo0rKwT38xVqr7ZD0u0iPPkUL64lIZbqBAz+scqKmlzm8FDrypNC9Yjc8fPOLn9FX9KSYvKTr4rvx3iSIlTJabIQwj2ICCR/oLxBA==\",\n                                \"SecretAccessKey\": \"wJalrXUtnFEMI/K7MDENG/bPxRfiCYzEXAMPLEKEY\",\n                                \"Expiration\": \"2011-07-15T23:28:33.359Z\",\n                                \"AccessKeyId\": \"AKIAIOSFODNN7EXAMPLE\"\n                            },\n                            \"FederatedUser\": {\n                                \"Arn\": \"arn:aws:sts::123456789012:federated-user/Bob\",\n                                \"FederatedUserId\": \"123456789012:Bob\"\n                            },\n                            \"PackedPolicySize\": 8\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.sts#GetFederationTokenRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Name\": {\n                    \"target\": \"com.amazonaws.sts#userNameType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the federated user. The name is used as an identifier for the temporary\\n         security credentials (such as <code>Bob</code>). For example, you can reference the\\n         federated user name in a resource-based policy, such as in an Amazon S3 bucket policy.</p>\\n         <p>The regex used to validate this parameter is a string of characters \\n    consisting of upper- and lower-case alphanumeric characters with no spaces. You can \\n    also include underscores or any of the following characters: =,.@-</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Policy\": {\n                    \"target\": \"com.amazonaws.sts#sessionPolicyDocumentType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An IAM policy in JSON format that you want to use as an inline session policy.</p>\\n         <p>You must pass an inline or managed <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session\\\">session policy</a> to\\n         this operation. You can pass a single JSON policy document to use as an inline session\\n         policy. You can also specify up to 10 managed policy Amazon Resource Names (ARNs) to use as\\n         managed session policies.</p>\\n         <p>This parameter is optional. However, if you do not pass any session policies, then the\\n         resulting federated user session has no permissions.</p>\\n         <p>When you pass session policies, the session permissions are the intersection of the\\n            IAM user policies and the session policies that you pass. This gives you\\n         a way to further restrict the permissions for a federated user. You cannot use session\\n         policies to grant more permissions than those that are defined in the permissions policy of\\n         the IAM user. For more information, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session\\\">Session Policies</a> in\\n         the <i>IAM User Guide</i>.</p>\\n         <p>The resulting credentials can be used to access a resource that has a resource-based\\n         policy. If that policy specifically references the federated user session in the\\n            <code>Principal</code> element of the policy, the session has the permissions allowed by\\n         the policy. These permissions are granted in addition to the permissions that are granted\\n         by the session policies.</p>\\n         <p>The plaintext that you use for both inline and managed session policies can't exceed\\n         2,048 characters. The JSON policy characters can be any ASCII character from the space\\n         character to the end of the valid character list (\\\\u0020 through \\\\u00FF). It can also\\n         include the tab (\\\\u0009), linefeed (\\\\u000A), and carriage return (\\\\u000D)\\n         characters.</p>\\n         <note>\\n            <p>An Amazon Web Services conversion compresses the passed inline session policy, managed policy ARNs,\\n            and session tags into a packed binary format that has a separate limit. Your request can\\n            fail for this limit even if your plaintext meets the other requirements. The\\n               <code>PackedPolicySize</code> response element indicates by percentage how close the\\n            policies and tags for your request are to the upper size limit.</p>\\n         </note>\"\n                    }\n                },\n                \"PolicyArns\": {\n                    \"target\": \"com.amazonaws.sts#policyDescriptorListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Names (ARNs) of the IAM managed policies that you want to use as a\\n         managed session policy. The policies must exist in the same account as the IAM user that is requesting federated access.</p>\\n         <p>You must pass an inline or managed <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session\\\">session policy</a> to\\n         this operation. You can pass a single JSON policy document to use as an inline session\\n         policy. You can also specify up to 10 managed policy Amazon Resource Names (ARNs) to use as\\n         managed session policies. The plaintext that you use for both inline and managed session\\n         policies can't exceed 2,048 characters. You can provide up to 10 managed policy ARNs. For\\n         more information about ARNs, see <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html\\\">Amazon Resource Names (ARNs) and Amazon Web Services\\n            Service Namespaces</a> in the Amazon Web Services General Reference.</p>\\n         <p>This parameter is optional. However, if you do not pass any session policies, then the\\n         resulting federated user session has no permissions.</p>\\n         <p>When you pass session policies, the session permissions are the intersection of the\\n            IAM user policies and the session policies that you pass. This gives you\\n         a way to further restrict the permissions for a federated user. You cannot use session\\n         policies to grant more permissions than those that are defined in the permissions policy of\\n         the IAM user. For more information, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session\\\">Session Policies</a> in\\n         the <i>IAM User Guide</i>.</p>\\n         <p>The resulting credentials can be used to access a resource that has a resource-based\\n         policy. If that policy specifically references the federated user session in the\\n            <code>Principal</code> element of the policy, the session has the permissions allowed by\\n         the policy. These permissions are granted in addition to the permissions that are granted\\n         by the session policies.</p>\\n         <note>\\n            <p>An Amazon Web Services conversion compresses the passed inline session policy, managed policy ARNs,\\n            and session tags into a packed binary format that has a separate limit. Your request can\\n            fail for this limit even if your plaintext meets the other requirements. The\\n               <code>PackedPolicySize</code> response element indicates by percentage how close the\\n            policies and tags for your request are to the upper size limit.</p>\\n         </note>\"\n                    }\n                },\n                \"DurationSeconds\": {\n                    \"target\": \"com.amazonaws.sts#durationSecondsType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The duration, in seconds, that the session should last. Acceptable durations for\\n         federation sessions range from 900 seconds (15 minutes) to 129,600 seconds (36 hours), with\\n         43,200 seconds (12 hours) as the default. Sessions obtained using root user\\n         credentials are restricted to a maximum of 3,600 seconds (one hour). If the specified\\n         duration is longer than one hour, the session obtained by using root user\\n         credentials defaults to one hour.</p>\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.sts#tagListType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of session tags. Each session tag consists of a key name and an associated value.\\n         For more information about session tags, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_session-tags.html\\\">Passing Session Tags in STS</a> in the\\n            <i>IAM User Guide</i>.</p>\\n         <p>This parameter is optional. You can pass up to 50 session tags. The plaintext session\\n         tag keys can’t exceed 128 characters and the values can’t exceed 256 characters. For these\\n         and additional limits, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_iam-limits.html#reference_iam-limits-entity-length\\\">IAM\\n            and STS Character Limits</a> in the <i>IAM User Guide</i>.</p>\\n         <note>\\n            <p>An Amazon Web Services conversion compresses the passed inline session policy, managed policy ARNs,\\n            and session tags into a packed binary format that has a separate limit. Your request can\\n            fail for this limit even if your plaintext meets the other requirements. The\\n               <code>PackedPolicySize</code> response element indicates by percentage how close the\\n            policies and tags for your request are to the upper size limit.</p>\\n         </note>\\n         <p>You can pass a session tag with the same key as a tag that is already attached to the\\n         user you are federating. When you do, session tags override a user tag with the same key. </p>\\n         <p>Tag key–value pairs are not case sensitive, but case is preserved. This means that you\\n         cannot have separate <code>Department</code> and <code>department</code> tag keys. Assume\\n         that the role has the <code>Department</code>=<code>Marketing</code> tag and you pass the\\n            <code>department</code>=<code>engineering</code> session tag. <code>Department</code>\\n         and <code>department</code> are not saved as separate tags, and the session tag passed in\\n         the request takes precedence over the role tag.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.sts#GetFederationTokenResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Credentials\": {\n                    \"target\": \"com.amazonaws.sts#Credentials\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The temporary security credentials, which include an access key ID, a secret access key,\\n         and a security (or session) token.</p>\\n         <note>\\n            <p>The size of the security token that STS API operations return is not fixed. We\\n        strongly recommend that you make no assumptions about the maximum size.</p>\\n         </note>\"\n                    }\n                },\n                \"FederatedUser\": {\n                    \"target\": \"com.amazonaws.sts#FederatedUser\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Identifiers for the federated user associated with the credentials (such as\\n            <code>arn:aws:sts::123456789012:federated-user/Bob</code> or\\n            <code>123456789012:Bob</code>). You can use the federated user's ARN in your\\n         resource-based policies, such as an Amazon S3 bucket policy. </p>\"\n                    }\n                },\n                \"PackedPolicySize\": {\n                    \"target\": \"com.amazonaws.sts#nonNegativeIntegerType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A percentage value that indicates the packed size of the session policies and session \\n      tags combined passed in the request. The request fails if the packed size is greater than 100 percent, \\n      which means the policies and tags exceeded the allowed space.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the response to a successful <a>GetFederationToken</a> request,\\n      including temporary Amazon Web Services credentials that can be used to make Amazon Web Services requests. </p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.sts#GetSessionToken\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.sts#GetSessionTokenRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.sts#GetSessionTokenResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.sts#RegionDisabledException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns a set of temporary credentials for an Amazon Web Services account or IAM user.\\n         The credentials consist of an access key ID, a secret access key, and a security token.\\n         Typically, you use <code>GetSessionToken</code> if you want to use MFA to protect\\n         programmatic calls to specific Amazon Web Services API operations like Amazon EC2\\n         <code>StopInstances</code>.</p>\\n         <p>MFA-enabled IAM users must call <code>GetSessionToken</code> and submit\\n         an MFA code that is associated with their MFA device. Using the temporary security\\n         credentials that the call returns, IAM users can then make programmatic\\n         calls to API operations that require MFA authentication. An incorrect MFA code causes the\\n         API to return an access denied error. For a comparison of <code>GetSessionToken</code> with\\n         the other API operations that produce temporary credentials, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html\\\">Requesting\\n            Temporary Security Credentials</a> and <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_sts-comparison.html\\\">Compare STS\\n            credentials</a> in the <i>IAM User Guide</i>.</p>\\n         <note>\\n            <p>No permissions are required for users to perform this operation. The purpose of the\\n               <code>sts:GetSessionToken</code> operation is to authenticate the user using MFA. You\\n            cannot use policies to control authentication operations. For more information, see\\n               <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_control-access_getsessiontoken.html\\\">Permissions for GetSessionToken</a> in the\\n            <i>IAM User Guide</i>.</p>\\n         </note>\\n         <p>\\n            <b>Session Duration</b>\\n         </p>\\n         <p>The <code>GetSessionToken</code> operation must be called by using the long-term Amazon Web Services\\n         security credentials of an IAM user. Credentials that are created by IAM users are valid for the duration that you specify. This duration can range\\n         from 900 seconds (15 minutes) up to a maximum of 129,600 seconds (36 hours), with a default\\n         of 43,200 seconds (12 hours). Credentials based on account credentials can range from 900\\n         seconds (15 minutes) up to 3,600 seconds (1 hour), with a default of 1 hour. </p>\\n         <p>\\n            <b>Permissions</b>\\n         </p>\\n         <p>The temporary security credentials created by <code>GetSessionToken</code> can be used\\n         to make API calls to any Amazon Web Services service with the following exceptions:</p>\\n         <ul>\\n            <li>\\n               <p>You cannot call any IAM API operations unless MFA authentication information is\\n               included in the request.</p>\\n            </li>\\n            <li>\\n               <p>You cannot call any STS API <i>except</i>\\n                  <code>AssumeRole</code> or <code>GetCallerIdentity</code>.</p>\\n            </li>\\n         </ul>\\n         <p>The credentials that <code>GetSessionToken</code> returns are based on permissions\\n         associated with the IAM user whose credentials were used to call the\\n         operation. The temporary credentials have the same permissions as the IAM user.</p>\\n         <note>\\n            <p>Although it is possible to call <code>GetSessionToken</code> using the security\\n            credentials of an Amazon Web Services account root user rather than an IAM user, we do\\n            not recommend it. If <code>GetSessionToken</code> is called using root user\\n            credentials, the temporary credentials have root user permissions. For more\\n            information, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#lock-away-credentials\\\">Safeguard your root user credentials and don't use them for everyday tasks</a> in the\\n               <i>IAM User Guide</i>\\n            </p>\\n         </note>\\n         <p>For more information about using <code>GetSessionToken</code> to create temporary\\n         credentials, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_request.html#api_getsessiontoken\\\">Temporary\\n            Credentials for Users in Untrusted Environments</a> in the\\n            <i>IAM User Guide</i>. </p>\",\n                \"smithy.api#examples\": [\n                    {\n                        \"title\": \"To get temporary credentials for an IAM user or an AWS account\",\n                        \"documentation\": \"\",\n                        \"input\": {\n                            \"DurationSeconds\": 3600,\n                            \"SerialNumber\": \"YourMFASerialNumber\",\n                            \"TokenCode\": \"123456\"\n                        },\n                        \"output\": {\n                            \"Credentials\": {\n                                \"SessionToken\": \"AQoEXAMPLEH4aoAH0gNCAPyJxz4BlCFFxWNE1OPTgk5TthT+FvwqnKwRcOIfrRh3c/LTo6UDdyJwOOvEVPvLXCrrrUtdnniCEXAMPLE/IvU1dYUg2RVAJBanLiHb4IgRmpRV3zrkuWJOgQs8IZZaIv2BXIa2R4OlgkBN9bkUDNCJiBeb/AXlzBBko7b15fjrBs2+cTQtpZ3CYWFXG8C5zqx37wnOE49mRl/+OtkIKGO7fAE\",\n                                \"SecretAccessKey\": \"wJalrXUtnFEMI/K7MDENG/bPxRfiCYzEXAMPLEKEY\",\n                                \"Expiration\": \"2011-07-11T19:55:29.611Z\",\n                                \"AccessKeyId\": \"AKIAIOSFODNN7EXAMPLE\"\n                            }\n                        }\n                    }\n                ]\n            }\n        },\n        \"com.amazonaws.sts#GetSessionTokenRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DurationSeconds\": {\n                    \"target\": \"com.amazonaws.sts#durationSecondsType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The duration, in seconds, that the credentials should remain valid. Acceptable durations\\n         for IAM user sessions range from 900 seconds (15 minutes) to 129,600 seconds\\n         (36 hours), with 43,200 seconds (12 hours) as the default. Sessions for Amazon Web Services account\\n         owners are restricted to a maximum of 3,600 seconds (one hour). If the duration is longer\\n         than one hour, the session for Amazon Web Services account owners defaults to one hour.</p>\"\n                    }\n                },\n                \"SerialNumber\": {\n                    \"target\": \"com.amazonaws.sts#serialNumberType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The identification number of the MFA device that is associated with the IAM user who is making the <code>GetSessionToken</code> call. Specify this value\\n         if the IAM user has a policy that requires MFA authentication. The value is\\n         either the serial number for a hardware device (such as <code>GAHT12345678</code>) or an\\n         Amazon Resource Name (ARN) for a virtual device (such as\\n            <code>arn:aws:iam::123456789012:mfa/user</code>). You can find the device for an IAM user by going to the Amazon Web Services Management Console and viewing the user's security credentials. </p>\\n         <p>The regex used to validate this parameter is a string of \\n    characters consisting of upper- and lower-case alphanumeric characters with no spaces. \\n    You can also include underscores or any of the following characters: =,.@:/-</p>\"\n                    }\n                },\n                \"TokenCode\": {\n                    \"target\": \"com.amazonaws.sts#tokenCodeType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The value provided by the MFA device, if MFA is required. If any policy requires the\\n            IAM user to submit an MFA code, specify this value. If MFA authentication\\n         is required, the user must provide a code when requesting a set of temporary security\\n         credentials. A user who fails to provide the code receives an \\\"access denied\\\" response when\\n         requesting resources that require MFA authentication.</p>\\n         <p>The format for this parameter, as described by its regex pattern, is a sequence of six\\n         numeric digits.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.sts#GetSessionTokenResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Credentials\": {\n                    \"target\": \"com.amazonaws.sts#Credentials\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The temporary security credentials, which include an access key ID, a secret access key,\\n         and a security (or session) token.</p>\\n         <note>\\n            <p>The size of the security token that STS API operations return is not fixed. We\\n        strongly recommend that you make no assumptions about the maximum size.</p>\\n         </note>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the response to a successful <a>GetSessionToken</a> request,\\n      including temporary Amazon Web Services credentials that can be used to make Amazon Web Services requests. </p>\",\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.sts#IDPCommunicationErrorException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.sts#idpCommunicationErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"IDPCommunicationError\",\n                    \"httpResponseCode\": 400\n                },\n                \"smithy.api#documentation\": \"<p>The request could not be fulfilled because the identity provider (IDP) that was asked\\n            to verify the incoming identity token could not be reached. This is often a transient\\n            error caused by network conditions. Retry the request a limited number of times so that\\n            you don't exceed the request rate. If the error persists, the identity provider might be\\n            down or not responding.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.sts#IDPRejectedClaimException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.sts#idpRejectedClaimMessage\"\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"IDPRejectedClaim\",\n                    \"httpResponseCode\": 403\n                },\n                \"smithy.api#documentation\": \"<p>The identity provider (IdP) reported that authentication failed. This might be because\\n            the claim is invalid.</p>\\n         <p>If this error is returned for the <code>AssumeRoleWithWebIdentity</code> operation, it\\n            can also mean that the claim has expired or has been explicitly revoked. </p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 403\n            }\n        },\n        \"com.amazonaws.sts#InvalidAuthorizationMessageException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.sts#invalidAuthorizationMessage\"\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"InvalidAuthorizationMessageException\",\n                    \"httpResponseCode\": 400\n                },\n                \"smithy.api#documentation\": \"<p>The error returned if the message passed to <code>DecodeAuthorizationMessage</code>\\n            was invalid. This can happen if the token contains invalid characters, such as line\\n            breaks, or if the message has expired.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.sts#InvalidIdentityTokenException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.sts#invalidIdentityTokenMessage\"\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"InvalidIdentityToken\",\n                    \"httpResponseCode\": 400\n                },\n                \"smithy.api#documentation\": \"<p>The web identity token that was passed could not be validated by Amazon Web Services. Get a new\\n            identity token from the identity provider and then retry the request.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.sts#Issuer\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.sts#MalformedPolicyDocumentException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.sts#malformedPolicyDocumentMessage\"\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"MalformedPolicyDocument\",\n                    \"httpResponseCode\": 400\n                },\n                \"smithy.api#documentation\": \"<p>The request was rejected because the policy document was malformed. The error message\\n            describes the specific error.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.sts#NameQualifier\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.sts#PackedPolicyTooLargeException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.sts#packedPolicyTooLargeMessage\"\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"PackedPolicyTooLarge\",\n                    \"httpResponseCode\": 400\n                },\n                \"smithy.api#documentation\": \"<p>The request was rejected because the total packed size of the session policies and\\n            session tags combined was too large. An Amazon Web Services conversion compresses the session policy\\n            document, session policy ARNs, and session tags into a packed binary format that has a\\n            separate limit. The error message indicates by percentage how close the policies and\\n            tags are to the upper size limit. For more information, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_session-tags.html\\\">Passing Session Tags in STS</a> in\\n            the <i>IAM User Guide</i>.</p>\\n         <p>You could receive this error even though you meet other defined session policy and\\n            session tag limits. For more information, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_iam-quotas.html#reference_iam-limits-entity-length\\\">IAM and STS Entity Character Limits</a> in the <i>IAM User\\n                Guide</i>.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.sts#PolicyDescriptorType\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"arn\": {\n                    \"target\": \"com.amazonaws.sts#arnType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the IAM managed policy to use as a session policy\\n         for the role. For more information about ARNs, see <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/aws-arns-and-namespaces.html\\\">Amazon Resource Names (ARNs) and Amazon Web Services\\n            Service Namespaces</a> in the <i>Amazon Web Services General Reference</i>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A reference to the IAM managed policy that is passed as a session policy for a role\\n         session or a federated user session.</p>\"\n            }\n        },\n        \"com.amazonaws.sts#ProvidedContext\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ProviderArn\": {\n                    \"target\": \"com.amazonaws.sts#arnType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The context provider ARN from which the trusted context assertion was generated.</p>\"\n                    }\n                },\n                \"ContextAssertion\": {\n                    \"target\": \"com.amazonaws.sts#contextAssertionType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The signed and encrypted trusted context assertion generated by the context provider.\\n         The trusted context assertion is signed and encrypted by Amazon Web Services STS.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains information about the provided context. This includes the signed and encrypted\\n         trusted context assertion and the context provider ARN from which the trusted context\\n         assertion was generated.</p>\"\n            }\n        },\n        \"com.amazonaws.sts#ProvidedContextsListType\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.sts#ProvidedContext\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 5\n                }\n            }\n        },\n        \"com.amazonaws.sts#RegionDisabledException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"message\": {\n                    \"target\": \"com.amazonaws.sts#regionDisabledMessage\"\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"RegionDisabledException\",\n                    \"httpResponseCode\": 403\n                },\n                \"smithy.api#documentation\": \"<p>STS is not activated in the requested region for the account that is being asked to\\n            generate credentials. The account administrator must use the IAM console to activate\\n            STS in that region. For more information, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html\\\">Activating and\\n                Deactivating STS in an Amazon Web Services Region</a> in the <i>IAM User\\n                Guide</i>.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 403\n            }\n        },\n        \"com.amazonaws.sts#RootDurationSecondsType\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 0,\n                    \"max\": 900\n                }\n            }\n        },\n        \"com.amazonaws.sts#SAMLAssertionType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 4,\n                    \"max\": 100000\n                },\n                \"smithy.api#sensitive\": {}\n            }\n        },\n        \"com.amazonaws.sts#Subject\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.sts#SubjectType\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.sts#Tag\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Key\": {\n                    \"target\": \"com.amazonaws.sts#tagKeyType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The key for a session tag.</p>\\n         <p>You can pass up to 50 session tags. The plain text session tag keys can’t exceed 128\\n         characters. For these and additional limits, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_iam-limits.html#reference_iam-limits-entity-length\\\">IAM\\n            and STS Character Limits</a> in the <i>IAM User Guide</i>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Value\": {\n                    \"target\": \"com.amazonaws.sts#tagValueType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The value for a session tag.</p>\\n         <p>You can pass up to 50 session tags. The plain text session tag values can’t exceed 256\\n         characters. For these and additional limits, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_iam-limits.html#reference_iam-limits-entity-length\\\">IAM\\n            and STS Character Limits</a> in the <i>IAM User Guide</i>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>You can pass custom key-value pair attributes when you assume a role or federate a user.\\n         These are called session tags. You can then use the session tags to control access to\\n         resources. For more information, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/id_session-tags.html\\\">Tagging Amazon Web Services STS Sessions</a> in the\\n            <i>IAM User Guide</i>.</p>\"\n            }\n        },\n        \"com.amazonaws.sts#TargetPrincipalType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 12,\n                    \"max\": 2048\n                }\n            }\n        },\n        \"com.amazonaws.sts#accessKeyIdType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 16,\n                    \"max\": 128\n                },\n                \"smithy.api#pattern\": \"^[\\\\w]*$\"\n            }\n        },\n        \"com.amazonaws.sts#accessKeySecretType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#sensitive\": {}\n            }\n        },\n        \"com.amazonaws.sts#accountType\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.sts#arnType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 20,\n                    \"max\": 2048\n                },\n                \"smithy.api#pattern\": \"^[\\\\u0009\\\\u000A\\\\u000D\\\\u0020-\\\\u007E\\\\u0085\\\\u00A0-\\\\uD7FF\\\\uE000-\\\\uFFFD\\\\u10000-\\\\u10FFFF]+$\"\n            }\n        },\n        \"com.amazonaws.sts#assumedRoleIdType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 2,\n                    \"max\": 193\n                },\n                \"smithy.api#pattern\": \"^[\\\\w+=,.@:-]*$\"\n            }\n        },\n        \"com.amazonaws.sts#clientTokenType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 4,\n                    \"max\": 20000\n                },\n                \"smithy.api#sensitive\": {}\n            }\n        },\n        \"com.amazonaws.sts#contextAssertionType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 4,\n                    \"max\": 2048\n                }\n            }\n        },\n        \"com.amazonaws.sts#dateType\": {\n            \"type\": \"timestamp\"\n        },\n        \"com.amazonaws.sts#decodedMessageType\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.sts#durationSecondsType\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 900,\n                    \"max\": 129600\n                }\n            }\n        },\n        \"com.amazonaws.sts#encodedMessageType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 10240\n                }\n            }\n        },\n        \"com.amazonaws.sts#expiredIdentityTokenMessage\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.sts#externalIdType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 2,\n                    \"max\": 1224\n                },\n                \"smithy.api#pattern\": \"^[\\\\w+=,.@:\\\\/-]*$\"\n            }\n        },\n        \"com.amazonaws.sts#federatedIdType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 2,\n                    \"max\": 193\n                },\n                \"smithy.api#pattern\": \"^[\\\\w+=,.@\\\\:-]*$\"\n            }\n        },\n        \"com.amazonaws.sts#idpCommunicationErrorMessage\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.sts#idpRejectedClaimMessage\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.sts#invalidAuthorizationMessage\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.sts#invalidIdentityTokenMessage\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.sts#malformedPolicyDocumentMessage\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.sts#nonNegativeIntegerType\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 0\n                }\n            }\n        },\n        \"com.amazonaws.sts#packedPolicyTooLargeMessage\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.sts#policyDescriptorListType\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.sts#PolicyDescriptorType\"\n            }\n        },\n        \"com.amazonaws.sts#regionDisabledMessage\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.sts#roleDurationSecondsType\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 900,\n                    \"max\": 43200\n                }\n            }\n        },\n        \"com.amazonaws.sts#roleSessionNameType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 2,\n                    \"max\": 64\n                },\n                \"smithy.api#pattern\": \"^[\\\\w+=,.@-]*$\"\n            }\n        },\n        \"com.amazonaws.sts#serialNumberType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 9,\n                    \"max\": 256\n                },\n                \"smithy.api#pattern\": \"^[\\\\w+=/:,.@-]*$\"\n            }\n        },\n        \"com.amazonaws.sts#sessionPolicyDocumentType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 2048\n                },\n                \"smithy.api#pattern\": \"^[\\\\u0009\\\\u000A\\\\u000D\\\\u0020-\\\\u00FF]+$\"\n            }\n        },\n        \"com.amazonaws.sts#sourceIdentityType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 2,\n                    \"max\": 64\n                },\n                \"smithy.api#pattern\": \"^[\\\\w+=,.@-]*$\"\n            }\n        },\n        \"com.amazonaws.sts#tagKeyListType\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.sts#tagKeyType\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 50\n                }\n            }\n        },\n        \"com.amazonaws.sts#tagKeyType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 128\n                },\n                \"smithy.api#pattern\": \"^[\\\\p{L}\\\\p{Z}\\\\p{N}_.:/=+\\\\-@]+$\"\n            }\n        },\n        \"com.amazonaws.sts#tagListType\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.sts#Tag\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 50\n                }\n            }\n        },\n        \"com.amazonaws.sts#tagValueType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 256\n                },\n                \"smithy.api#pattern\": \"^[\\\\p{L}\\\\p{Z}\\\\p{N}_.:/=+\\\\-@]*$\"\n            }\n        },\n        \"com.amazonaws.sts#tokenCodeType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 6,\n                    \"max\": 6\n                },\n                \"smithy.api#pattern\": \"^[\\\\d]*$\"\n            }\n        },\n        \"com.amazonaws.sts#tokenType\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.sts#unrestrictedSessionPolicyDocumentType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1\n                },\n                \"smithy.api#pattern\": \"^[\\\\u0009\\\\u000A\\\\u000D\\\\u0020-\\\\u00FF]+$\"\n            }\n        },\n        \"com.amazonaws.sts#urlType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 4,\n                    \"max\": 2048\n                }\n            }\n        },\n        \"com.amazonaws.sts#userIdType\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.sts#userNameType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 2,\n                    \"max\": 32\n                },\n                \"smithy.api#pattern\": \"^[\\\\w+=,.@-]*$\"\n            }\n        },\n        \"com.amazonaws.sts#webIdentitySubjectType\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 6,\n                    \"max\": 255\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "aws/sdk/aws-models/timestream-query.json",
    "content": "{\n    \"smithy\": \"2.0\",\n    \"metadata\": {\n        \"suppressions\": [\n            {\n                \"id\": \"HttpMethodSemantics\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"HttpResponseCodeSemantics\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"PaginatedTrait\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"HttpHeaderTrait\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"HttpUriConflict\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"Service\",\n                \"namespace\": \"*\"\n            }\n        ]\n    },\n    \"shapes\": {\n        \"com.amazonaws.timestreamquery#AccessDeniedException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Message\": {\n                    \"target\": \"com.amazonaws.timestreamquery#ServiceErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"aws.protocols#awsQueryError\": {\n                    \"code\": \"AccessDenied\",\n                    \"httpResponseCode\": 403\n                },\n                \"smithy.api#documentation\": \"<p>You do not have the necessary permissions to access the account settings.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 403\n            }\n        },\n        \"com.amazonaws.timestreamquery#AccountSettingsNotificationConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SnsConfiguration\": {\n                    \"target\": \"com.amazonaws.timestreamquery#SnsConfiguration\"\n                },\n                \"RoleArn\": {\n                    \"target\": \"com.amazonaws.timestreamquery#AmazonResourceName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An Amazon Resource Name (ARN) that grants Timestream permission to publish notifications. This field is only visible if SNS Topic is provided when updating the account settings.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Configuration settings for notifications related to account settings.</p>\"\n            }\n        },\n        \"com.amazonaws.timestreamquery#AmazonResourceName\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 2048\n                }\n            }\n        },\n        \"com.amazonaws.timestreamquery#CancelQuery\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.timestreamquery#CancelQueryRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.timestreamquery#CancelQueryResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#AccessDeniedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#InternalServerException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#InvalidEndpointException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#ThrottlingException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#clientDiscoveredEndpoint\": {\n                    \"required\": true\n                },\n                \"smithy.api#documentation\": \"<p> Cancels a query that has been issued. Cancellation is provided only if the query has\\n            not completed running before the cancellation request was issued. Because cancellation\\n            is an idempotent operation, subsequent cancellation requests will return a\\n                <code>CancellationMessage</code>, indicating that the query has already been\\n            canceled. See <a href=\\\"https://docs.aws.amazon.com/timestream/latest/developerguide/code-samples.cancel-query.html\\\">code\\n                sample</a> for details. </p>\",\n                \"smithy.api#idempotent\": {}\n            }\n        },\n        \"com.amazonaws.timestreamquery#CancelQueryRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"QueryId\": {\n                    \"target\": \"com.amazonaws.timestreamquery#QueryId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The ID of the query that needs to be cancelled. <code>QueryID</code> is returned as\\n            part of the query result. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.timestreamquery#CancelQueryResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CancellationMessage\": {\n                    \"target\": \"com.amazonaws.timestreamquery#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> A <code>CancellationMessage</code> is returned when a <code>CancelQuery</code>\\n            request for the query specified by <code>QueryId</code> has already been issued. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.timestreamquery#ClientRequestToken\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 32,\n                    \"max\": 128\n                },\n                \"smithy.api#sensitive\": {}\n            }\n        },\n        \"com.amazonaws.timestreamquery#ClientToken\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 32,\n                    \"max\": 128\n                },\n                \"smithy.api#sensitive\": {}\n            }\n        },\n        \"com.amazonaws.timestreamquery#ColumnInfo\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Name\": {\n                    \"target\": \"com.amazonaws.timestreamquery#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The name of the result set column. The name of the result set is available for\\n            columns of all data types except for arrays. </p>\"\n                    }\n                },\n                \"Type\": {\n                    \"target\": \"com.amazonaws.timestreamquery#Type\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The data type of the result set column. The data type can be a scalar or complex.\\n            Scalar data types are integers, strings, doubles, Booleans, and others. Complex data\\n            types are types such as arrays, rows, and others. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p> Contains the metadata for query results such as the column names, data types, and\\n            other attributes. </p>\"\n            }\n        },\n        \"com.amazonaws.timestreamquery#ColumnInfoList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.timestreamquery#ColumnInfo\"\n            }\n        },\n        \"com.amazonaws.timestreamquery#ComputeMode\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ON_DEMAND\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ON_DEMAND\"\n                    }\n                },\n                \"PROVISIONED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"PROVISIONED\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.timestreamquery#ConflictException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Message\": {\n                    \"target\": \"com.amazonaws.timestreamquery#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p> Unable to poll results for a cancelled query. </p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 409\n            }\n        },\n        \"com.amazonaws.timestreamquery#CreateScheduledQuery\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.timestreamquery#CreateScheduledQueryRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.timestreamquery#CreateScheduledQueryResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#AccessDeniedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#ConflictException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#InternalServerException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#InvalidEndpointException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#ServiceQuotaExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#ThrottlingException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#clientDiscoveredEndpoint\": {\n                    \"required\": true\n                },\n                \"smithy.api#documentation\": \"<p> Create a scheduled query that will be run on your behalf at the configured schedule.\\n            Timestream assumes the execution role provided as part of the\\n                <code>ScheduledQueryExecutionRoleArn</code> parameter to run the query. You can use\\n            the <code>NotificationConfiguration</code> parameter to configure notification for your\\n            scheduled query operations.</p>\",\n                \"smithy.api#idempotent\": {}\n            }\n        },\n        \"com.amazonaws.timestreamquery#CreateScheduledQueryRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Name\": {\n                    \"target\": \"com.amazonaws.timestreamquery#ScheduledQueryName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Name of the scheduled query.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"QueryString\": {\n                    \"target\": \"com.amazonaws.timestreamquery#QueryString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The query string to run. Parameter names can be specified in the query string\\n                <code>@</code> character followed by an identifier. The named Parameter\\n                <code>@scheduled_runtime</code> is reserved and can be used in the query to get the\\n            time at which the query is scheduled to run.</p>\\n         <p>The timestamp calculated according to the ScheduleConfiguration parameter, will be the\\n            value of <code>@scheduled_runtime</code> paramater for each query run. For example,\\n            consider an instance of a scheduled query executing on 2021-12-01 00:00:00. For this\\n            instance, the <code>@scheduled_runtime</code> parameter is initialized to the timestamp\\n            2021-12-01 00:00:00 when invoking the query.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ScheduleConfiguration\": {\n                    \"target\": \"com.amazonaws.timestreamquery#ScheduleConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The schedule configuration for the query.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"NotificationConfiguration\": {\n                    \"target\": \"com.amazonaws.timestreamquery#NotificationConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Notification configuration for the scheduled query. A notification is sent by\\n            Timestream when a query run finishes, when the state is updated or when you delete it.\\n        </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TargetConfiguration\": {\n                    \"target\": \"com.amazonaws.timestreamquery#TargetConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Configuration used for writing the result of a query.</p>\"\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.timestreamquery#ClientToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Using a ClientToken makes the call to CreateScheduledQuery idempotent, in other words,\\n            making the same request repeatedly will produce the same result. Making multiple\\n            identical CreateScheduledQuery requests has the same effect as making a single request. </p>\\n         <ul>\\n            <li>\\n               <p> If CreateScheduledQuery is called without a <code>ClientToken</code>, the\\n                    Query SDK generates a <code>ClientToken</code> on your behalf.</p>\\n            </li>\\n            <li>\\n               <p> After 8 hours, any request with the same <code>ClientToken</code> is treated\\n                    as a new request. </p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#idempotencyToken\": {}\n                    }\n                },\n                \"ScheduledQueryExecutionRoleArn\": {\n                    \"target\": \"com.amazonaws.timestreamquery#AmazonResourceName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN for the IAM role that Timestream will assume when running the scheduled query.\\n        </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.timestreamquery#TagList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of key-value pairs to label the scheduled query.</p>\"\n                    }\n                },\n                \"KmsKeyId\": {\n                    \"target\": \"com.amazonaws.timestreamquery#StringValue2048\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon KMS key used to encrypt the scheduled query resource, at-rest. If the\\n            Amazon KMS key is not specified, the scheduled query resource will be encrypted with a\\n            Timestream owned Amazon KMS key. To specify a KMS key, use the key ID, key ARN, alias\\n            name, or alias ARN. When using an alias name, prefix the name with\\n                <i>alias/</i>\\n         </p>\\n         <p>If ErrorReportConfiguration uses <code>SSE_KMS</code> as encryption type, the same\\n            KmsKeyId is used to encrypt the error report at rest.</p>\"\n                    }\n                },\n                \"ErrorReportConfiguration\": {\n                    \"target\": \"com.amazonaws.timestreamquery#ErrorReportConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Configuration for error reporting. Error reports will be generated when a problem is\\n            encountered when writing the query results. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.timestreamquery#CreateScheduledQueryResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Arn\": {\n                    \"target\": \"com.amazonaws.timestreamquery#AmazonResourceName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>ARN for the created scheduled query.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.timestreamquery#Datum\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ScalarValue\": {\n                    \"target\": \"com.amazonaws.timestreamquery#ScalarValue\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> Indicates if the data point is a scalar value such as integer, string, double, or\\n            Boolean. </p>\"\n                    }\n                },\n                \"TimeSeriesValue\": {\n                    \"target\": \"com.amazonaws.timestreamquery#TimeSeriesDataPointList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> Indicates if the data point is a timeseries data type. </p>\"\n                    }\n                },\n                \"ArrayValue\": {\n                    \"target\": \"com.amazonaws.timestreamquery#DatumList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> Indicates if the data point is an array. </p>\"\n                    }\n                },\n                \"RowValue\": {\n                    \"target\": \"com.amazonaws.timestreamquery#Row\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> Indicates if the data point is a row. </p>\"\n                    }\n                },\n                \"NullValue\": {\n                    \"target\": \"com.amazonaws.timestreamquery#NullableBoolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> Indicates if the data point is null. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p> Datum represents a single data point in a query result. </p>\"\n            }\n        },\n        \"com.amazonaws.timestreamquery#DatumList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.timestreamquery#Datum\"\n            }\n        },\n        \"com.amazonaws.timestreamquery#DeleteScheduledQuery\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.timestreamquery#DeleteScheduledQueryRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#AccessDeniedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#InternalServerException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#InvalidEndpointException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#ThrottlingException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#clientDiscoveredEndpoint\": {\n                    \"required\": true\n                },\n                \"smithy.api#documentation\": \"<p>Deletes a given scheduled query. This is an irreversible operation. </p>\",\n                \"smithy.api#idempotent\": {}\n            }\n        },\n        \"com.amazonaws.timestreamquery#DeleteScheduledQueryRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ScheduledQueryArn\": {\n                    \"target\": \"com.amazonaws.timestreamquery#AmazonResourceName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the scheduled query. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.timestreamquery#DescribeAccountSettings\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.timestreamquery#DescribeAccountSettingsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.timestreamquery#DescribeAccountSettingsResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#AccessDeniedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#InternalServerException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#InvalidEndpointException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#ThrottlingException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#clientDiscoveredEndpoint\": {\n                    \"required\": true\n                },\n                \"smithy.api#documentation\": \"<p>Describes the settings for your account that include the query pricing model and the configured maximum TCUs the service can use for your query workload.</p>\\n         <p>You're charged only for the duration of compute units used for your workloads.</p>\"\n            }\n        },\n        \"com.amazonaws.timestreamquery#DescribeAccountSettingsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {},\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.timestreamquery#DescribeAccountSettingsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"MaxQueryTCU\": {\n                    \"target\": \"com.amazonaws.timestreamquery#MaxQueryCapacity\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of <a href=\\\"https://docs.aws.amazon.com/timestream/latest/developerguide/tcu.html\\\">Timestream compute units</a> (TCUs) the service will use at any point in time to serve your queries. To run queries, you must set a minimum capacity of 4 TCU. You can set the maximum number of TCU in multiples of 4, for example, 4, 8, 16, 32, and so on. This configuration is applicable only for on-demand usage of (TCUs). \\n        \\n        \\n        </p>\"\n                    }\n                },\n                \"QueryPricingModel\": {\n                    \"target\": \"com.amazonaws.timestreamquery#QueryPricingModel\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The pricing model for queries in your account.</p>\\n         <note>\\n            <p>The <code>QueryPricingModel</code> parameter is used by several Timestream operations; however, the <code>UpdateAccountSettings</code> API operation doesn't recognize any values other than <code>COMPUTE_UNITS</code>.</p>\\n         </note>\"\n                    }\n                },\n                \"QueryCompute\": {\n                    \"target\": \"com.amazonaws.timestreamquery#QueryComputeResponse\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An object that contains the usage settings for Timestream Compute Units (TCUs) in your account for the query workload. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.timestreamquery#DescribeEndpoints\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.timestreamquery#DescribeEndpointsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.timestreamquery#DescribeEndpointsResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#InternalServerException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#ThrottlingException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>DescribeEndpoints returns a list of available endpoints to make Timestream\\n            API calls against. This API is available through both Write and Query.</p>\\n         <p>Because the Timestream SDKs are designed to transparently work with the\\n            service’s architecture, including the management and mapping of the service endpoints,\\n                <i>it is not recommended that you use this API unless</i>:</p>\\n         <ul>\\n            <li>\\n               <p>You are using <a href=\\\"https://docs.aws.amazon.com/timestream/latest/developerguide/VPCEndpoints\\\">VPC endpoints (Amazon Web Services PrivateLink) with Timestream\\n                    </a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Your application uses a programming language that does not yet have SDK\\n                    support</p>\\n            </li>\\n            <li>\\n               <p>You require better control over the client-side implementation</p>\\n            </li>\\n         </ul>\\n         <p>For detailed information on how and when to use and implement DescribeEndpoints, see\\n                <a href=\\\"https://docs.aws.amazon.com/timestream/latest/developerguide/Using.API.html#Using-API.endpoint-discovery\\\">The Endpoint Discovery Pattern</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.timestreamquery#DescribeEndpointsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {},\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.timestreamquery#DescribeEndpointsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Endpoints\": {\n                    \"target\": \"com.amazonaws.timestreamquery#Endpoints\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An <code>Endpoints</code> object is returned when a <code>DescribeEndpoints</code>\\n            request is made.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.timestreamquery#DescribeScheduledQuery\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.timestreamquery#DescribeScheduledQueryRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.timestreamquery#DescribeScheduledQueryResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#AccessDeniedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#InternalServerException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#InvalidEndpointException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#ThrottlingException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#clientDiscoveredEndpoint\": {\n                    \"required\": true\n                },\n                \"smithy.api#documentation\": \"<p>Provides detailed information about a scheduled query.</p>\"\n            }\n        },\n        \"com.amazonaws.timestreamquery#DescribeScheduledQueryRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ScheduledQueryArn\": {\n                    \"target\": \"com.amazonaws.timestreamquery#AmazonResourceName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the scheduled query.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.timestreamquery#DescribeScheduledQueryResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ScheduledQuery\": {\n                    \"target\": \"com.amazonaws.timestreamquery#ScheduledQueryDescription\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The scheduled query.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.timestreamquery#DimensionMapping\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Name\": {\n                    \"target\": \"com.amazonaws.timestreamquery#SchemaName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Column name from query result.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DimensionValueType\": {\n                    \"target\": \"com.amazonaws.timestreamquery#DimensionValueType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Type for the dimension. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This type is used to map column(s) from the query result to a dimension in the\\n            destination table.</p>\"\n            }\n        },\n        \"com.amazonaws.timestreamquery#DimensionMappingList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.timestreamquery#DimensionMapping\"\n            }\n        },\n        \"com.amazonaws.timestreamquery#DimensionValueType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"VARCHAR\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"VARCHAR\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.timestreamquery#Double\": {\n            \"type\": \"double\",\n            \"traits\": {\n                \"smithy.api#default\": 0\n            }\n        },\n        \"com.amazonaws.timestreamquery#Endpoint\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Address\": {\n                    \"target\": \"com.amazonaws.timestreamquery#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An endpoint address.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"CachePeriodInMinutes\": {\n                    \"target\": \"com.amazonaws.timestreamquery#Long\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The TTL for the endpoint, in minutes.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents an available endpoint against which to make API calls against, as well as\\n            the TTL for that endpoint.</p>\"\n            }\n        },\n        \"com.amazonaws.timestreamquery#Endpoints\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.timestreamquery#Endpoint\"\n            }\n        },\n        \"com.amazonaws.timestreamquery#ErrorMessage\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.timestreamquery#ErrorReportConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"S3Configuration\": {\n                    \"target\": \"com.amazonaws.timestreamquery#S3Configuration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The S3 configuration for the error reports.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Configuration required for error reporting.</p>\"\n            }\n        },\n        \"com.amazonaws.timestreamquery#ErrorReportLocation\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"S3ReportLocation\": {\n                    \"target\": \"com.amazonaws.timestreamquery#S3ReportLocation\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The S3 location where error reports are written.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>This contains the location of the error report for a single scheduled query call.\\n        </p>\"\n            }\n        },\n        \"com.amazonaws.timestreamquery#ExecuteScheduledQuery\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.timestreamquery#ExecuteScheduledQueryRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#AccessDeniedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#InternalServerException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#InvalidEndpointException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#ThrottlingException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#clientDiscoveredEndpoint\": {\n                    \"required\": true\n                },\n                \"smithy.api#documentation\": \"<p> You can use this API to run a scheduled query manually. </p>\\n         <p>If you enabled <code>QueryInsights</code>, this API also returns insights and metrics related to the query that you executed as part of an Amazon SNS notification. <code>QueryInsights</code> helps with performance tuning of your query. For more information about <code>QueryInsights</code>, see <a href=\\\"https://docs.aws.amazon.com/timestream/latest/developerguide/using-query-insights.html\\\">Using query insights to optimize queries in Amazon Timestream</a>.</p>\",\n                \"smithy.api#idempotent\": {}\n            }\n        },\n        \"com.amazonaws.timestreamquery#ExecuteScheduledQueryRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ScheduledQueryArn\": {\n                    \"target\": \"com.amazonaws.timestreamquery#AmazonResourceName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>ARN of the scheduled query.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"InvocationTime\": {\n                    \"target\": \"com.amazonaws.timestreamquery#Time\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The timestamp in UTC. Query will be run as if it was invoked at this timestamp.\\n        </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.timestreamquery#ClientToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Not used. </p>\",\n                        \"smithy.api#idempotencyToken\": {}\n                    }\n                },\n                \"QueryInsights\": {\n                    \"target\": \"com.amazonaws.timestreamquery#ScheduledQueryInsights\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Encapsulates settings for enabling <code>QueryInsights</code>.</p>\\n         <p>Enabling <code>QueryInsights</code> returns insights and metrics as a part of the Amazon SNS notification for the query that you executed. You can use <code>QueryInsights</code> to tune your query performance and cost.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.timestreamquery#ExecutionStats\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ExecutionTimeInMillis\": {\n                    \"target\": \"com.amazonaws.timestreamquery#Long\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>Total time, measured in milliseconds, that was needed for the scheduled query run to\\n            complete.</p>\"\n                    }\n                },\n                \"DataWrites\": {\n                    \"target\": \"com.amazonaws.timestreamquery#Long\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>Data writes metered for records ingested in a single scheduled query run.</p>\"\n                    }\n                },\n                \"BytesMetered\": {\n                    \"target\": \"com.amazonaws.timestreamquery#Long\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>Bytes metered for a single scheduled query run.</p>\"\n                    }\n                },\n                \"CumulativeBytesScanned\": {\n                    \"target\": \"com.amazonaws.timestreamquery#Long\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>Bytes scanned for a single scheduled query run.</p>\"\n                    }\n                },\n                \"RecordsIngested\": {\n                    \"target\": \"com.amazonaws.timestreamquery#Long\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The number of records ingested for a single scheduled query run. </p>\"\n                    }\n                },\n                \"QueryResultRows\": {\n                    \"target\": \"com.amazonaws.timestreamquery#Long\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>Number of rows present in the output from running a query before ingestion to\\n            destination data source.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Statistics for a single scheduled query run.</p>\"\n            }\n        },\n        \"com.amazonaws.timestreamquery#InternalServerException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Message\": {\n                    \"target\": \"com.amazonaws.timestreamquery#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>An internal server error occurred while processing the request.</p>\",\n                \"smithy.api#error\": \"server\",\n                \"smithy.api#httpError\": 500\n            }\n        },\n        \"com.amazonaws.timestreamquery#InvalidEndpointException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Message\": {\n                    \"target\": \"com.amazonaws.timestreamquery#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The requested endpoint is invalid.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 421\n            }\n        },\n        \"com.amazonaws.timestreamquery#LastUpdate\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TargetQueryTCU\": {\n                    \"target\": \"com.amazonaws.timestreamquery#QueryTCU\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of TimeStream Compute Units (TCUs) requested in the last account settings update.</p>\"\n                    }\n                },\n                \"Status\": {\n                    \"target\": \"com.amazonaws.timestreamquery#LastUpdateStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The status of the last update. Can be either <code>PENDING</code>, <code>FAILED</code>, or <code>SUCCEEDED</code>.</p>\"\n                    }\n                },\n                \"StatusMessage\": {\n                    \"target\": \"com.amazonaws.timestreamquery#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Error message describing the last account settings update status, visible only if an error occurred.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Configuration object that contains the most recent account settings update, visible only if settings have been updated previously.</p>\"\n            }\n        },\n        \"com.amazonaws.timestreamquery#LastUpdateStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"PENDING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"PENDING\"\n                    }\n                },\n                \"FAILED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"FAILED\"\n                    }\n                },\n                \"SUCCEEDED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"SUCCEEDED\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.timestreamquery#ListScheduledQueries\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.timestreamquery#ListScheduledQueriesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.timestreamquery#ListScheduledQueriesResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#AccessDeniedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#InternalServerException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#InvalidEndpointException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#ThrottlingException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#clientDiscoveredEndpoint\": {\n                    \"required\": true\n                },\n                \"smithy.api#documentation\": \"<p>Gets a list of all scheduled queries in the caller's Amazon account and Region.\\n                <code>ListScheduledQueries</code> is eventually consistent. </p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"ScheduledQueries\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.timestreamquery#ListScheduledQueriesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.timestreamquery#MaxScheduledQueriesResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of items to return in the output. If the total number of items\\n            available is more than the value specified, a <code>NextToken</code> is provided in the\\n            output. To resume pagination, provide the <code>NextToken</code> value as the argument\\n            to the subsequent call to <code>ListScheduledQueriesRequest</code>.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.timestreamquery#NextScheduledQueriesResultsToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> A pagination token to resume pagination.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.timestreamquery#ListScheduledQueriesResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ScheduledQueries\": {\n                    \"target\": \"com.amazonaws.timestreamquery#ScheduledQueryList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of scheduled queries.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.timestreamquery#NextScheduledQueriesResultsToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A token to specify where to start paginating. This is the NextToken from a previously\\n            truncated response.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.timestreamquery#ListTagsForResource\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.timestreamquery#ListTagsForResourceRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.timestreamquery#ListTagsForResourceResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#InvalidEndpointException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#ThrottlingException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#clientDiscoveredEndpoint\": {\n                    \"required\": true\n                },\n                \"smithy.api#documentation\": \"<p>List all tags on a Timestream query resource.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"Tags\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.timestreamquery#ListTagsForResourceRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ResourceARN\": {\n                    \"target\": \"com.amazonaws.timestreamquery#AmazonResourceName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Timestream resource with tags to be listed. This value is an Amazon Resource Name\\n            (ARN).</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.timestreamquery#MaxTagsForResourceResult\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of tags to return.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.timestreamquery#NextTagsForResourceResultsToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A pagination token to resume pagination.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.timestreamquery#ListTagsForResourceResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.timestreamquery#TagList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags currently associated with the Timestream resource. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.timestreamquery#NextTagsForResourceResultsToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A pagination token to resume pagination with a subsequent call to\\n                <code>ListTagsForResourceResponse</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.timestreamquery#Long\": {\n            \"type\": \"long\",\n            \"traits\": {\n                \"smithy.api#default\": 0\n            }\n        },\n        \"com.amazonaws.timestreamquery#MaxQueryCapacity\": {\n            \"type\": \"integer\"\n        },\n        \"com.amazonaws.timestreamquery#MaxQueryResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.timestreamquery#MaxScheduledQueriesResults\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 1000\n                }\n            }\n        },\n        \"com.amazonaws.timestreamquery#MaxTagsForResourceResult\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 200\n                }\n            }\n        },\n        \"com.amazonaws.timestreamquery#MeasureValueType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"BIGINT\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"BIGINT\"\n                    }\n                },\n                \"BOOLEAN\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"BOOLEAN\"\n                    }\n                },\n                \"DOUBLE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DOUBLE\"\n                    }\n                },\n                \"VARCHAR\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"VARCHAR\"\n                    }\n                },\n                \"MULTI\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"MULTI\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.timestreamquery#MixedMeasureMapping\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"MeasureName\": {\n                    \"target\": \"com.amazonaws.timestreamquery#SchemaName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Refers to the value of measure_name in a result row. This field is required if\\n            MeasureNameColumn is provided.</p>\"\n                    }\n                },\n                \"SourceColumn\": {\n                    \"target\": \"com.amazonaws.timestreamquery#SchemaName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>This field refers to the source column from which measure-value is to be read for\\n            result materialization.</p>\"\n                    }\n                },\n                \"TargetMeasureName\": {\n                    \"target\": \"com.amazonaws.timestreamquery#SchemaName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Target measure name to be used. If not provided, the target measure name by default\\n            would be measure-name if provided, or sourceColumn otherwise. </p>\"\n                    }\n                },\n                \"MeasureValueType\": {\n                    \"target\": \"com.amazonaws.timestreamquery#MeasureValueType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Type of the value that is to be read from sourceColumn. If the mapping is for MULTI,\\n            use MeasureValueType.MULTI.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"MultiMeasureAttributeMappings\": {\n                    \"target\": \"com.amazonaws.timestreamquery#MultiMeasureAttributeMappingList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Required when measureValueType is MULTI. Attribute mappings for MULTI value\\n            measures.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>MixedMeasureMappings are mappings that can be used to ingest data into a mixture of\\n            narrow and multi measures in the derived table.</p>\"\n            }\n        },\n        \"com.amazonaws.timestreamquery#MixedMeasureMappingList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.timestreamquery#MixedMeasureMapping\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1\n                }\n            }\n        },\n        \"com.amazonaws.timestreamquery#MultiMeasureAttributeMapping\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SourceColumn\": {\n                    \"target\": \"com.amazonaws.timestreamquery#SchemaName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Source column from where the attribute value is to be read.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TargetMultiMeasureAttributeName\": {\n                    \"target\": \"com.amazonaws.timestreamquery#SchemaName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Custom name to be used for attribute name in derived table. If not provided, source\\n            column name would be used.</p>\"\n                    }\n                },\n                \"MeasureValueType\": {\n                    \"target\": \"com.amazonaws.timestreamquery#ScalarMeasureValueType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Type of the attribute to be read from the source column.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Attribute mapping for MULTI value measures.</p>\"\n            }\n        },\n        \"com.amazonaws.timestreamquery#MultiMeasureAttributeMappingList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.timestreamquery#MultiMeasureAttributeMapping\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1\n                }\n            }\n        },\n        \"com.amazonaws.timestreamquery#MultiMeasureMappings\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TargetMultiMeasureName\": {\n                    \"target\": \"com.amazonaws.timestreamquery#SchemaName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the target multi-measure name in the derived table. This input is required\\n            when measureNameColumn is not provided. If MeasureNameColumn is provided, then value\\n            from that column will be used as multi-measure name.</p>\"\n                    }\n                },\n                \"MultiMeasureAttributeMappings\": {\n                    \"target\": \"com.amazonaws.timestreamquery#MultiMeasureAttributeMappingList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Required. Attribute mappings to be used for mapping query results to ingest data for\\n            multi-measure attributes.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Only one of MixedMeasureMappings or MultiMeasureMappings is to be provided.\\n            MultiMeasureMappings can be used to ingest data as multi measures in the derived\\n            table.</p>\"\n            }\n        },\n        \"com.amazonaws.timestreamquery#NextScheduledQueriesResultsToken\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.timestreamquery#NextTagsForResourceResultsToken\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.timestreamquery#NotificationConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SnsConfiguration\": {\n                    \"target\": \"com.amazonaws.timestreamquery#SnsConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Details about the Amazon Simple Notification Service (SNS) configuration. This field is visible only when SNS Topic is provided when updating the account settings.  </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Notification configuration for a scheduled query. A notification is sent by Timestream\\n            when a scheduled query is created, its state is updated or when it is deleted. </p>\"\n            }\n        },\n        \"com.amazonaws.timestreamquery#NullableBoolean\": {\n            \"type\": \"boolean\"\n        },\n        \"com.amazonaws.timestreamquery#PaginationToken\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 2048\n                }\n            }\n        },\n        \"com.amazonaws.timestreamquery#ParameterMapping\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Name\": {\n                    \"target\": \"com.amazonaws.timestreamquery#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Parameter name.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Type\": {\n                    \"target\": \"com.amazonaws.timestreamquery#Type\",\n                    \"traits\": {\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Mapping for named parameters.</p>\"\n            }\n        },\n        \"com.amazonaws.timestreamquery#ParameterMappingList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.timestreamquery#ParameterMapping\"\n            }\n        },\n        \"com.amazonaws.timestreamquery#PartitionKey\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.timestreamquery#PartitionKeyList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.timestreamquery#PartitionKey\"\n            }\n        },\n        \"com.amazonaws.timestreamquery#PrepareQuery\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.timestreamquery#PrepareQueryRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.timestreamquery#PrepareQueryResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#AccessDeniedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#InternalServerException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#InvalidEndpointException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#ThrottlingException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#clientDiscoveredEndpoint\": {\n                    \"required\": true\n                },\n                \"smithy.api#documentation\": \"<p>A synchronous operation that allows you to submit a query with parameters to be stored\\n            by Timestream for later running. Timestream only supports using this operation with\\n                <code>ValidateOnly</code> set to <code>true</code>. </p>\",\n                \"smithy.api#idempotent\": {}\n            }\n        },\n        \"com.amazonaws.timestreamquery#PrepareQueryRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"QueryString\": {\n                    \"target\": \"com.amazonaws.timestreamquery#QueryString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Timestream query string that you want to use as a prepared statement. Parameter\\n            names can be specified in the query string <code>@</code> character followed by an\\n            identifier. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ValidateOnly\": {\n                    \"target\": \"com.amazonaws.timestreamquery#NullableBoolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>By setting this value to <code>true</code>, Timestream will only validate that the\\n            query string is a valid Timestream query, and not store the prepared query for later\\n            use.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.timestreamquery#PrepareQueryResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"QueryString\": {\n                    \"target\": \"com.amazonaws.timestreamquery#QueryString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The query string that you want prepare.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Columns\": {\n                    \"target\": \"com.amazonaws.timestreamquery#SelectColumnList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of SELECT clause columns of the submitted query string. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Parameters\": {\n                    \"target\": \"com.amazonaws.timestreamquery#ParameterMappingList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of parameters used in the submitted query string. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.timestreamquery#ProvisionedCapacityRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TargetQueryTCU\": {\n                    \"target\": \"com.amazonaws.timestreamquery#QueryTCU\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The target compute capacity for querying data, specified in Timestream Compute Units (TCUs).</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"NotificationConfiguration\": {\n                    \"target\": \"com.amazonaws.timestreamquery#AccountSettingsNotificationConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Configuration settings for notifications related to the provisioned capacity update.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A request to update the provisioned capacity settings for querying data.</p>\"\n            }\n        },\n        \"com.amazonaws.timestreamquery#ProvisionedCapacityResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ActiveQueryTCU\": {\n                    \"target\": \"com.amazonaws.timestreamquery#QueryTCU\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The number of Timestream Compute Units (TCUs) provisioned in the account. This field is only visible when the compute mode is <code>PROVISIONED</code>.</p>\"\n                    }\n                },\n                \"NotificationConfiguration\": {\n                    \"target\": \"com.amazonaws.timestreamquery#AccountSettingsNotificationConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An object that contains settings for notifications that are sent whenever the provisioned capacity settings are modified. This field is only visible when the compute mode is <code>PROVISIONED</code>.</p>\"\n                    }\n                },\n                \"LastUpdate\": {\n                    \"target\": \"com.amazonaws.timestreamquery#LastUpdate\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Information about the last update to the provisioned capacity settings.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The response to a request to update the provisioned capacity settings for querying data.</p>\"\n            }\n        },\n        \"com.amazonaws.timestreamquery#Query\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.timestreamquery#QueryRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.timestreamquery#QueryResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#AccessDeniedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#ConflictException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#InternalServerException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#InvalidEndpointException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#QueryExecutionException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#ThrottlingException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#clientDiscoveredEndpoint\": {\n                    \"required\": true\n                },\n                \"smithy.api#documentation\": \"<p>\\n            <code>Query</code> is a synchronous operation that enables you to run a query against\\n            your Amazon Timestream data.</p>\\n         <p>If you enabled <code>QueryInsights</code>, this API also returns insights and metrics related to the query that you executed. <code>QueryInsights</code> helps with performance tuning of your query. For more information about <code>QueryInsights</code>, see <a href=\\\"https://docs.aws.amazon.com/timestream/latest/developerguide/using-query-insights.html\\\">Using query insights to optimize queries in Amazon Timestream</a>.</p>\\n         <note>\\n            <p>The maximum number of <code>Query</code> API requests you're allowed to make with <code>QueryInsights</code> enabled is 1 query per second (QPS). If you exceed this query rate, it might result in throttling.</p>\\n         </note>\\n         <p>\\n            <code>Query</code> will time out after 60 seconds.\\n            You must update the default timeout in the SDK to support a timeout of 60 seconds. See\\n            the <a href=\\\"https://docs.aws.amazon.com/timestream/latest/developerguide/code-samples.run-query.html\\\">code\\n                sample</a> for details. </p>\\n         <p>Your query request will fail in the following cases:</p>\\n         <ul>\\n            <li>\\n               <p> If you submit a <code>Query</code> request with the same client token outside\\n                    of the 5-minute idempotency window. </p>\\n            </li>\\n            <li>\\n               <p> If you submit a <code>Query</code> request with the same client token, but\\n                    change other parameters, within the 5-minute idempotency window. </p>\\n            </li>\\n            <li>\\n               <p> If the size of the row (including the query metadata) exceeds 1 MB, then the\\n                    query will fail with the following error message: </p>\\n               <p>\\n                  <code>Query aborted as max page response size has been exceeded by the output\\n                        result row</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p> If the IAM principal of the query initiator and the result reader are not the\\n                    same and/or the query initiator and the result reader do not have the same query\\n                    string in the query requests, the query will fail with an <code>Invalid\\n                        pagination token</code> error. </p>\\n            </li>\\n         </ul>\",\n                \"smithy.api#idempotent\": {},\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"items\": \"Rows\",\n                    \"pageSize\": \"MaxRows\"\n                }\n            }\n        },\n        \"com.amazonaws.timestreamquery#QueryComputeRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ComputeMode\": {\n                    \"target\": \"com.amazonaws.timestreamquery#ComputeMode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The mode in which Timestream Compute Units (TCUs) are allocated and utilized within an account. Note that in the Asia Pacific (Mumbai)  region, the API operation only recognizes the value <code>PROVISIONED</code>.</p>\"\n                    }\n                },\n                \"ProvisionedCapacity\": {\n                    \"target\": \"com.amazonaws.timestreamquery#ProvisionedCapacityRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Configuration object that contains settings for provisioned Timestream Compute Units (TCUs) in your account.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A request to retrieve or update the compute capacity settings for querying data.</p>\"\n            }\n        },\n        \"com.amazonaws.timestreamquery#QueryComputeResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ComputeMode\": {\n                    \"target\": \"com.amazonaws.timestreamquery#ComputeMode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The mode in which Timestream Compute Units (TCUs) are allocated and utilized within an account. Note that in the Asia Pacific (Mumbai)  region, the API operation only recognizes the value <code>PROVISIONED</code>.</p>\"\n                    }\n                },\n                \"ProvisionedCapacity\": {\n                    \"target\": \"com.amazonaws.timestreamquery#ProvisionedCapacityResponse\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Configuration object that contains settings for provisioned Timestream Compute Units (TCUs) in your account.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The response to a request to retrieve or update the compute capacity settings for querying data.</p>\"\n            }\n        },\n        \"com.amazonaws.timestreamquery#QueryExecutionException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Message\": {\n                    \"target\": \"com.amazonaws.timestreamquery#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>\\n            Timestream was unable to run the query successfully. </p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.timestreamquery#QueryId\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 64\n                },\n                \"smithy.api#pattern\": \"^[a-zA-Z0-9]+$\"\n            }\n        },\n        \"com.amazonaws.timestreamquery#QueryInsights\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Mode\": {\n                    \"target\": \"com.amazonaws.timestreamquery#QueryInsightsMode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Provides the following modes to enable <code>QueryInsights</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>ENABLED_WITH_RATE_CONTROL</code> – Enables <code>QueryInsights</code> for the queries being processed. This mode also includes a rate control mechanism, which limits the <code>QueryInsights</code> feature to 1 query per second (QPS).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>DISABLED</code> – Disables <code>QueryInsights</code>.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>\\n            <code>QueryInsights</code> is a performance tuning feature that helps you optimize your queries, reducing costs and improving performance. With <code>QueryInsights</code>, you can assess the pruning efficiency of your queries and identify areas for improvement to enhance query performance. With <code>QueryInsights</code>, you can also analyze the effectiveness of your queries in terms of temporal and spatial pruning, and identify opportunities to improve performance. Specifically, you can evaluate how well your queries use time-based and partition key-based indexing strategies to optimize data retrieval. To optimize query performance, it's essential that you fine-tune both the temporal and spatial parameters that govern query execution.</p>\\n         <p>The key metrics provided by <code>QueryInsights</code> are <code>QuerySpatialCoverage</code> and <code>QueryTemporalRange</code>. <code>QuerySpatialCoverage</code> indicates how much of the spatial axis the query scans, with lower values being more efficient. <code>QueryTemporalRange</code> shows the time range scanned, with narrower ranges being more performant.</p>\\n         <p>\\n            <b>Benefits of QueryInsights</b>\\n         </p>\\n         <p>The following are the key benefits of using <code>QueryInsights</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <b>Identifying inefficient queries</b> – <code>QueryInsights</code> provides information on the time-based and attribute-based pruning of the tables accessed by the query. This information helps you identify the tables that are sub-optimally accessed.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>Optimizing your data model and partitioning</b> – You can use the <code>QueryInsights</code> information to access and fine-tune your data model and partitioning strategy.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>Tuning queries</b> – <code>QueryInsights</code> highlights opportunities to use indexes more effectively.</p>\\n            </li>\\n         </ul>\\n         <note>\\n            <p>The maximum number of <code>Query</code> API requests you're allowed to make with <code>QueryInsights</code> enabled is 1 query per second (QPS). If you exceed this query rate, it might result in throttling.</p>\\n         </note>\"\n            }\n        },\n        \"com.amazonaws.timestreamquery#QueryInsightsMode\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ENABLED_WITH_RATE_CONTROL\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ENABLED_WITH_RATE_CONTROL\"\n                    }\n                },\n                \"DISABLED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DISABLED\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.timestreamquery#QueryInsightsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"QuerySpatialCoverage\": {\n                    \"target\": \"com.amazonaws.timestreamquery#QuerySpatialCoverage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Provides insights into the spatial coverage of the query, including the table with sub-optimal (max) spatial pruning. This information can help you identify areas for improvement in your partitioning strategy to enhance spatial pruning. </p>\"\n                    }\n                },\n                \"QueryTemporalRange\": {\n                    \"target\": \"com.amazonaws.timestreamquery#QueryTemporalRange\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Provides insights into the temporal range of the query, including the table with the largest (max) time range. Following are some of the potential options for optimizing time-based pruning:</p>\\n         <ul>\\n            <li>\\n               <p>Add missing time-predicates.</p>\\n            </li>\\n            <li>\\n               <p>Remove functions around the time predicates.</p>\\n            </li>\\n            <li>\\n               <p>Add time predicates to all the sub-queries.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"QueryTableCount\": {\n                    \"target\": \"com.amazonaws.timestreamquery#Long\",\n                    \"traits\": {\n                        \"smithy.api#default\": null,\n                        \"smithy.api#documentation\": \"<p>Indicates the number of tables in the query.</p>\"\n                    }\n                },\n                \"OutputRows\": {\n                    \"target\": \"com.amazonaws.timestreamquery#Long\",\n                    \"traits\": {\n                        \"smithy.api#default\": null,\n                        \"smithy.api#documentation\": \"<p>Indicates the total number of rows returned as part of the query result set. You can use this data to validate if the number of rows in the result set have changed as part of the query tuning exercise.</p>\"\n                    }\n                },\n                \"OutputBytes\": {\n                    \"target\": \"com.amazonaws.timestreamquery#Long\",\n                    \"traits\": {\n                        \"smithy.api#default\": null,\n                        \"smithy.api#documentation\": \"<p>Indicates the size of query result set in bytes. You can use this data to validate if the result set has changed as part of the query tuning exercise.</p>\"\n                    }\n                },\n                \"UnloadPartitionCount\": {\n                    \"target\": \"com.amazonaws.timestreamquery#Long\",\n                    \"traits\": {\n                        \"smithy.api#default\": null,\n                        \"smithy.api#documentation\": \"<p>Indicates the partitions created by the <code>Unload</code> operation.</p>\"\n                    }\n                },\n                \"UnloadWrittenRows\": {\n                    \"target\": \"com.amazonaws.timestreamquery#Long\",\n                    \"traits\": {\n                        \"smithy.api#default\": null,\n                        \"smithy.api#documentation\": \"<p>Indicates the rows written by the <code>Unload</code> query.</p>\"\n                    }\n                },\n                \"UnloadWrittenBytes\": {\n                    \"target\": \"com.amazonaws.timestreamquery#Long\",\n                    \"traits\": {\n                        \"smithy.api#default\": null,\n                        \"smithy.api#documentation\": \"<p>Indicates the size, in bytes, written by the <code>Unload</code> operation.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Provides various insights and metrics related to the query that you executed.</p>\"\n            }\n        },\n        \"com.amazonaws.timestreamquery#QueryPricingModel\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"BYTES_SCANNED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"BYTES_SCANNED\"\n                    }\n                },\n                \"COMPUTE_UNITS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"COMPUTE_UNITS\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.timestreamquery#QueryRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"QueryString\": {\n                    \"target\": \"com.amazonaws.timestreamquery#QueryString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The query to be run by Timestream. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.timestreamquery#ClientRequestToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> Unique, case-sensitive string of up to 64 ASCII characters specified when a\\n                <code>Query</code> request is made. Providing a <code>ClientToken</code> makes the\\n            call to <code>Query</code>\\n            <i>idempotent</i>. This means that running the same query repeatedly will\\n            produce the same result. In other words, making multiple identical <code>Query</code>\\n            requests has the same effect as making a single request. When using\\n                <code>ClientToken</code> in a query, note the following: </p>\\n         <ul>\\n            <li>\\n               <p> If the Query API is instantiated without a <code>ClientToken</code>, the\\n                    Query SDK generates a <code>ClientToken</code> on your behalf.</p>\\n            </li>\\n            <li>\\n               <p>If the <code>Query</code> invocation only contains the\\n                        <code>ClientToken</code> but does not include a <code>NextToken</code>, that\\n                    invocation of <code>Query</code> is assumed to be a new query run.</p>\\n            </li>\\n            <li>\\n               <p>If the invocation contains <code>NextToken</code>, that particular invocation\\n                    is assumed to be a subsequent invocation of a prior call to the Query API, and a\\n                    result set is returned.</p>\\n            </li>\\n            <li>\\n               <p> After 4 hours, any request with the same <code>ClientToken</code> is treated\\n                    as a new request. </p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#idempotencyToken\": {}\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.timestreamquery#PaginationToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> A pagination token used to return a set of results. When the <code>Query</code> API\\n            is invoked using <code>NextToken</code>, that particular invocation is assumed to be a\\n            subsequent invocation of a prior call to <code>Query</code>, and a result set is\\n            returned. However, if the <code>Query</code> invocation only contains the\\n                <code>ClientToken</code>, that invocation of <code>Query</code> is assumed to be a\\n            new query run. </p>\\n         <p>Note the following when using NextToken in a query:</p>\\n         <ul>\\n            <li>\\n               <p>A pagination token can be used for up to five <code>Query</code> invocations,\\n                    OR for a duration of up to 1 hour – whichever comes first.</p>\\n            </li>\\n            <li>\\n               <p>Using the same <code>NextToken</code> will return the same set of records. To\\n                    keep paginating through the result set, you must to use the most recent\\n                        <code>nextToken</code>.</p>\\n            </li>\\n            <li>\\n               <p>Suppose a <code>Query</code> invocation returns two <code>NextToken</code>\\n                    values, <code>TokenA</code> and <code>TokenB</code>. If <code>TokenB</code> is\\n                    used in a subsequent <code>Query</code> invocation, then <code>TokenA</code> is\\n                    invalidated and cannot be reused.</p>\\n            </li>\\n            <li>\\n               <p>To request a previous result set from a query after pagination has begun, you\\n                    must re-invoke the Query API.</p>\\n            </li>\\n            <li>\\n               <p>The latest <code>NextToken</code> should be used to paginate until\\n                        <code>null</code> is returned, at which point a new <code>NextToken</code>\\n                    should be used.</p>\\n            </li>\\n            <li>\\n               <p> If the IAM principal of the query initiator and the result reader are not the\\n                    same and/or the query initiator and the result reader do not have the same query\\n                    string in the query requests, the query will fail with an <code>Invalid\\n                        pagination token</code> error. </p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"MaxRows\": {\n                    \"target\": \"com.amazonaws.timestreamquery#MaxQueryResults\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The total number of rows to be returned in the <code>Query</code> output. The initial\\n            run of <code>Query</code> with a <code>MaxRows</code> value specified will return the\\n            result set of the query in two cases: </p>\\n         <ul>\\n            <li>\\n               <p>The size of the result is less than <code>1MB</code>.</p>\\n            </li>\\n            <li>\\n               <p>The number of rows in the result set is less than the value of\\n                        <code>maxRows</code>.</p>\\n            </li>\\n         </ul>\\n         <p>Otherwise, the initial invocation of <code>Query</code> only returns a\\n                <code>NextToken</code>, which can then be used in subsequent calls to fetch the\\n            result set. To resume pagination, provide the <code>NextToken</code> value in the\\n            subsequent command.</p>\\n         <p>If the row size is large (e.g. a row has many columns), Timestream may return\\n            fewer rows to keep the response size from exceeding the 1 MB limit. If\\n                <code>MaxRows</code> is not provided, Timestream will send the necessary\\n            number of rows to meet the 1 MB limit.</p>\"\n                    }\n                },\n                \"QueryInsights\": {\n                    \"target\": \"com.amazonaws.timestreamquery#QueryInsights\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Encapsulates settings for enabling <code>QueryInsights</code>.</p>\\n         <p>Enabling <code>QueryInsights</code> returns insights and metrics in addition to query results for the query that you executed. You can use <code>QueryInsights</code> to tune your query performance.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.timestreamquery#QueryResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"QueryId\": {\n                    \"target\": \"com.amazonaws.timestreamquery#QueryId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> A unique ID for the given query. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.timestreamquery#PaginationToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> A pagination token that can be used again on a <code>Query</code> call to get the\\n            next set of results. </p>\"\n                    }\n                },\n                \"Rows\": {\n                    \"target\": \"com.amazonaws.timestreamquery#RowList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The result set rows returned by the query. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ColumnInfo\": {\n                    \"target\": \"com.amazonaws.timestreamquery#ColumnInfoList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The column data types of the returned result set. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"QueryStatus\": {\n                    \"target\": \"com.amazonaws.timestreamquery#QueryStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Information about the status of the query, including progress and bytes\\n            scanned.</p>\"\n                    }\n                },\n                \"QueryInsightsResponse\": {\n                    \"target\": \"com.amazonaws.timestreamquery#QueryInsightsResponse\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Encapsulates <code>QueryInsights</code> containing insights and metrics related to the query that you executed.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.timestreamquery#QuerySpatialCoverage\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Max\": {\n                    \"target\": \"com.amazonaws.timestreamquery#QuerySpatialCoverageMax\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Provides insights into the spatial coverage of the executed query and the table with the most inefficient spatial pruning.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>Value</code> – The maximum ratio of spatial coverage.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>TableArn</code> – The Amazon Resource Name (ARN) of the table with sub-optimal spatial pruning.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>PartitionKey</code> – The partition key used for partitioning, which can be a default <code>measure_name</code> or a CDPK.</p>\\n            </li>\\n         </ul>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Provides insights into the spatial coverage of the query, including the table with sub-optimal (max) spatial pruning. This information can help you identify areas for improvement in your partitioning strategy to enhance spatial pruning</p>\\n         <p>For example, you can do the following with the <code>QuerySpatialCoverage</code> information:</p>\\n         <ul>\\n            <li>\\n               <p>Add measure_name or use <a href=\\\"https://docs.aws.amazon.com/timestream/latest/developerguide/customer-defined-partition-keys.html\\\">customer-defined partition key</a> (CDPK) predicates.</p>\\n            </li>\\n            <li>\\n               <p>If you've already done the preceding action, remove functions around them or clauses, such as <code>LIKE</code>.</p>\\n            </li>\\n         </ul>\"\n            }\n        },\n        \"com.amazonaws.timestreamquery#QuerySpatialCoverageMax\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Value\": {\n                    \"target\": \"com.amazonaws.timestreamquery#Double\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The maximum ratio of spatial coverage.</p>\"\n                    }\n                },\n                \"TableArn\": {\n                    \"target\": \"com.amazonaws.timestreamquery#AmazonResourceName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the table with the most sub-optimal spatial pruning.</p>\"\n                    }\n                },\n                \"PartitionKey\": {\n                    \"target\": \"com.amazonaws.timestreamquery#PartitionKeyList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The partition key used for partitioning, which can be a default <code>measure_name</code> or a <a href=\\\"https://docs.aws.amazon.com/timestream/latest/developerguide/customer-defined-partition-keys.html\\\">customer defined partition key</a>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Provides insights into the table with the most sub-optimal spatial range scanned by your query.</p>\"\n            }\n        },\n        \"com.amazonaws.timestreamquery#QueryStatus\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ProgressPercentage\": {\n                    \"target\": \"com.amazonaws.timestreamquery#Double\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The progress of the query, expressed as a percentage.</p>\"\n                    }\n                },\n                \"CumulativeBytesScanned\": {\n                    \"target\": \"com.amazonaws.timestreamquery#Long\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The amount of data scanned by the query in bytes. This is a cumulative sum and\\n            represents the total amount of bytes scanned since the query was started. </p>\"\n                    }\n                },\n                \"CumulativeBytesMetered\": {\n                    \"target\": \"com.amazonaws.timestreamquery#Long\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The amount of data scanned by the query in bytes that you will be charged for. This is\\n            a cumulative sum and represents the total amount of data that you will be charged for\\n            since the query was started. The charge is applied only once and is either applied when\\n            the query completes running or when the query is cancelled. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information about the status of the query, including progress and bytes\\n            scanned.</p>\"\n            }\n        },\n        \"com.amazonaws.timestreamquery#QueryString\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 262144\n                },\n                \"smithy.api#sensitive\": {}\n            }\n        },\n        \"com.amazonaws.timestreamquery#QueryTCU\": {\n            \"type\": \"integer\"\n        },\n        \"com.amazonaws.timestreamquery#QueryTemporalRange\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Max\": {\n                    \"target\": \"com.amazonaws.timestreamquery#QueryTemporalRangeMax\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Encapsulates the following properties that provide insights into the most sub-optimal performing table on the temporal axis:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>Value</code> – The maximum duration in nanoseconds between the start and end of the query.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>TableArn</code> – The Amazon Resource Name (ARN) of the table which is queried with the largest time range.</p>\\n            </li>\\n         </ul>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Provides insights into the temporal range of the query, including the table with the largest (max) time range.</p>\"\n            }\n        },\n        \"com.amazonaws.timestreamquery#QueryTemporalRangeMax\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Value\": {\n                    \"target\": \"com.amazonaws.timestreamquery#Long\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The maximum duration in nanoseconds between the start and end of the query.</p>\"\n                    }\n                },\n                \"TableArn\": {\n                    \"target\": \"com.amazonaws.timestreamquery#AmazonResourceName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the table which is queried with the largest time range.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Provides insights into the table with the most sub-optimal temporal pruning scanned by your query.</p>\"\n            }\n        },\n        \"com.amazonaws.timestreamquery#ResourceName\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.timestreamquery#ResourceNotFoundException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Message\": {\n                    \"target\": \"com.amazonaws.timestreamquery#ErrorMessage\"\n                },\n                \"ScheduledQueryArn\": {\n                    \"target\": \"com.amazonaws.timestreamquery#AmazonResourceName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ARN of the scheduled query.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The requested resource could not be found.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 404\n            }\n        },\n        \"com.amazonaws.timestreamquery#Row\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Data\": {\n                    \"target\": \"com.amazonaws.timestreamquery#DatumList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>List of data points in a single row of the result set.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents a single row in the query results.</p>\"\n            }\n        },\n        \"com.amazonaws.timestreamquery#RowList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.timestreamquery#Row\"\n            }\n        },\n        \"com.amazonaws.timestreamquery#S3BucketName\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 3,\n                    \"max\": 63\n                },\n                \"smithy.api#pattern\": \"^[a-z0-9][\\\\.\\\\-a-z0-9]{1,61}[a-z0-9]$\"\n            }\n        },\n        \"com.amazonaws.timestreamquery#S3Configuration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"BucketName\": {\n                    \"target\": \"com.amazonaws.timestreamquery#S3BucketName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> Name of the S3 bucket under which error reports will be created.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ObjectKeyPrefix\": {\n                    \"target\": \"com.amazonaws.timestreamquery#S3ObjectKeyPrefix\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> Prefix for the error report key. Timestream by default adds the following prefix to\\n            the error report path. </p>\"\n                    }\n                },\n                \"EncryptionOption\": {\n                    \"target\": \"com.amazonaws.timestreamquery#S3EncryptionOption\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> Encryption at rest options for the error reports. If no encryption option is\\n            specified, Timestream will choose SSE_S3 as default. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Details on S3 location for error reports that result from running a query. </p>\"\n            }\n        },\n        \"com.amazonaws.timestreamquery#S3EncryptionOption\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"SSE_S3\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"SSE_S3\"\n                    }\n                },\n                \"SSE_KMS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"SSE_KMS\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.timestreamquery#S3ObjectKey\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.timestreamquery#S3ObjectKeyPrefix\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 896\n                },\n                \"smithy.api#pattern\": \"^[a-zA-Z0-9|!\\\\-_*'\\\\(\\\\)]([a-zA-Z0-9]|[!\\\\-_*'\\\\(\\\\)\\\\/.])+$\"\n            }\n        },\n        \"com.amazonaws.timestreamquery#S3ReportLocation\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"BucketName\": {\n                    \"target\": \"com.amazonaws.timestreamquery#S3BucketName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> S3 bucket name. </p>\"\n                    }\n                },\n                \"ObjectKey\": {\n                    \"target\": \"com.amazonaws.timestreamquery#S3ObjectKey\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>S3 key. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p> S3 report location for the scheduled query run.</p>\"\n            }\n        },\n        \"com.amazonaws.timestreamquery#ScalarMeasureValueType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"BIGINT\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"BIGINT\"\n                    }\n                },\n                \"BOOLEAN\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"BOOLEAN\"\n                    }\n                },\n                \"DOUBLE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DOUBLE\"\n                    }\n                },\n                \"VARCHAR\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"VARCHAR\"\n                    }\n                },\n                \"TIMESTAMP\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"TIMESTAMP\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.timestreamquery#ScalarType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"VARCHAR\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"VARCHAR\"\n                    }\n                },\n                \"BOOLEAN\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"BOOLEAN\"\n                    }\n                },\n                \"BIGINT\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"BIGINT\"\n                    }\n                },\n                \"DOUBLE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DOUBLE\"\n                    }\n                },\n                \"TIMESTAMP\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"TIMESTAMP\"\n                    }\n                },\n                \"DATE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DATE\"\n                    }\n                },\n                \"TIME\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"TIME\"\n                    }\n                },\n                \"INTERVAL_DAY_TO_SECOND\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"INTERVAL_DAY_TO_SECOND\"\n                    }\n                },\n                \"INTERVAL_YEAR_TO_MONTH\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"INTERVAL_YEAR_TO_MONTH\"\n                    }\n                },\n                \"UNKNOWN\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"UNKNOWN\"\n                    }\n                },\n                \"INTEGER\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"INTEGER\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.timestreamquery#ScalarValue\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.timestreamquery#ScheduleConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ScheduleExpression\": {\n                    \"target\": \"com.amazonaws.timestreamquery#ScheduleExpression\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An expression that denotes when to trigger the scheduled query run. This can be a cron\\n            expression or a rate expression. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Configuration of the schedule of the query.</p>\"\n            }\n        },\n        \"com.amazonaws.timestreamquery#ScheduleExpression\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 256\n                }\n            }\n        },\n        \"com.amazonaws.timestreamquery#ScheduledQuery\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Arn\": {\n                    \"target\": \"com.amazonaws.timestreamquery#AmazonResourceName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Name\": {\n                    \"target\": \"com.amazonaws.timestreamquery#ScheduledQueryName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the scheduled query.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"CreationTime\": {\n                    \"target\": \"com.amazonaws.timestreamquery#Time\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The creation time of the scheduled query.</p>\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.timestreamquery#ScheduledQueryState\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>State of scheduled query. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"PreviousInvocationTime\": {\n                    \"target\": \"com.amazonaws.timestreamquery#Time\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The last time the scheduled query was run.</p>\"\n                    }\n                },\n                \"NextInvocationTime\": {\n                    \"target\": \"com.amazonaws.timestreamquery#Time\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The next time the scheduled query is to be run.</p>\"\n                    }\n                },\n                \"ErrorReportConfiguration\": {\n                    \"target\": \"com.amazonaws.timestreamquery#ErrorReportConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Configuration for scheduled query error reporting.</p>\"\n                    }\n                },\n                \"TargetDestination\": {\n                    \"target\": \"com.amazonaws.timestreamquery#TargetDestination\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Target data source where final scheduled query result will be written.</p>\"\n                    }\n                },\n                \"LastRunStatus\": {\n                    \"target\": \"com.amazonaws.timestreamquery#ScheduledQueryRunStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Status of the last scheduled query run.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Scheduled Query</p>\"\n            }\n        },\n        \"com.amazonaws.timestreamquery#ScheduledQueryDescription\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Arn\": {\n                    \"target\": \"com.amazonaws.timestreamquery#AmazonResourceName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Scheduled query ARN.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Name\": {\n                    \"target\": \"com.amazonaws.timestreamquery#ScheduledQueryName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Name of the scheduled query.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"QueryString\": {\n                    \"target\": \"com.amazonaws.timestreamquery#QueryString\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The query to be run.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"CreationTime\": {\n                    \"target\": \"com.amazonaws.timestreamquery#Time\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Creation time of the scheduled query.</p>\"\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.timestreamquery#ScheduledQueryState\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>State of the scheduled query. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"PreviousInvocationTime\": {\n                    \"target\": \"com.amazonaws.timestreamquery#Time\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Last time the query was run.</p>\"\n                    }\n                },\n                \"NextInvocationTime\": {\n                    \"target\": \"com.amazonaws.timestreamquery#Time\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The next time the scheduled query is scheduled to run.</p>\"\n                    }\n                },\n                \"ScheduleConfiguration\": {\n                    \"target\": \"com.amazonaws.timestreamquery#ScheduleConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Schedule configuration.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"NotificationConfiguration\": {\n                    \"target\": \"com.amazonaws.timestreamquery#NotificationConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Notification configuration.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TargetConfiguration\": {\n                    \"target\": \"com.amazonaws.timestreamquery#TargetConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Scheduled query target store configuration.</p>\"\n                    }\n                },\n                \"ScheduledQueryExecutionRoleArn\": {\n                    \"target\": \"com.amazonaws.timestreamquery#AmazonResourceName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>IAM role that Timestream uses to run the schedule query.</p>\"\n                    }\n                },\n                \"KmsKeyId\": {\n                    \"target\": \"com.amazonaws.timestreamquery#StringValue2048\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A customer provided KMS key used to encrypt the scheduled query resource.</p>\"\n                    }\n                },\n                \"ErrorReportConfiguration\": {\n                    \"target\": \"com.amazonaws.timestreamquery#ErrorReportConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Error-reporting configuration for the scheduled query.</p>\"\n                    }\n                },\n                \"LastRunSummary\": {\n                    \"target\": \"com.amazonaws.timestreamquery#ScheduledQueryRunSummary\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Runtime summary for the last scheduled query run. </p>\"\n                    }\n                },\n                \"RecentlyFailedRuns\": {\n                    \"target\": \"com.amazonaws.timestreamquery#ScheduledQueryRunSummaryList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Runtime summary for the last five failed scheduled query runs.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Structure that describes scheduled query.</p>\"\n            }\n        },\n        \"com.amazonaws.timestreamquery#ScheduledQueryInsights\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Mode\": {\n                    \"target\": \"com.amazonaws.timestreamquery#ScheduledQueryInsightsMode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Provides the following modes to enable <code>ScheduledQueryInsights</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>ENABLED_WITH_RATE_CONTROL</code> – Enables <code>ScheduledQueryInsights</code> for the queries being processed. This mode also includes a rate control mechanism, which limits the <code>QueryInsights</code> feature to 1 query per second (QPS).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>DISABLED</code> – Disables <code>ScheduledQueryInsights</code>.</p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Encapsulates settings for enabling <code>QueryInsights</code> on an <code>ExecuteScheduledQueryRequest</code>.</p>\"\n            }\n        },\n        \"com.amazonaws.timestreamquery#ScheduledQueryInsightsMode\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ENABLED_WITH_RATE_CONTROL\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ENABLED_WITH_RATE_CONTROL\"\n                    }\n                },\n                \"DISABLED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DISABLED\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.timestreamquery#ScheduledQueryInsightsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"QuerySpatialCoverage\": {\n                    \"target\": \"com.amazonaws.timestreamquery#QuerySpatialCoverage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Provides insights into the spatial coverage of the query, including the table with sub-optimal (max) spatial pruning. This information can help you identify areas for improvement in your partitioning strategy to enhance spatial pruning.</p>\"\n                    }\n                },\n                \"QueryTemporalRange\": {\n                    \"target\": \"com.amazonaws.timestreamquery#QueryTemporalRange\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Provides insights into the temporal range of the query, including the table with the largest (max) time range. Following are some of the potential options for optimizing time-based pruning:</p>\\n         <ul>\\n            <li>\\n               <p>Add missing time-predicates.</p>\\n            </li>\\n            <li>\\n               <p>Remove functions around the time predicates.</p>\\n            </li>\\n            <li>\\n               <p>Add time predicates to all the sub-queries.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"QueryTableCount\": {\n                    \"target\": \"com.amazonaws.timestreamquery#Long\",\n                    \"traits\": {\n                        \"smithy.api#default\": null,\n                        \"smithy.api#documentation\": \"<p>Indicates the number of tables in the query.</p>\"\n                    }\n                },\n                \"OutputRows\": {\n                    \"target\": \"com.amazonaws.timestreamquery#Long\",\n                    \"traits\": {\n                        \"smithy.api#default\": null,\n                        \"smithy.api#documentation\": \"<p>Indicates the total number of rows returned as part of the query result set. You can use this data to validate if the number of rows in the result set have changed as part of the query tuning exercise.</p>\"\n                    }\n                },\n                \"OutputBytes\": {\n                    \"target\": \"com.amazonaws.timestreamquery#Long\",\n                    \"traits\": {\n                        \"smithy.api#default\": null,\n                        \"smithy.api#documentation\": \"<p>Indicates the size of query result set in bytes. You can use this data to validate if the result set has changed as part of the query tuning exercise.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Provides various insights and metrics related to the <code>ExecuteScheduledQueryRequest</code> that was executed.</p>\"\n            }\n        },\n        \"com.amazonaws.timestreamquery#ScheduledQueryList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.timestreamquery#ScheduledQuery\"\n            }\n        },\n        \"com.amazonaws.timestreamquery#ScheduledQueryName\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 64\n                },\n                \"smithy.api#pattern\": \"^[a-zA-Z0-9|!\\\\-_*'\\\\(\\\\)]([a-zA-Z0-9]|[!\\\\-_*'\\\\(\\\\)\\\\/.])+$\"\n            }\n        },\n        \"com.amazonaws.timestreamquery#ScheduledQueryRunStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"AUTO_TRIGGER_SUCCESS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AUTO_TRIGGER_SUCCESS\"\n                    }\n                },\n                \"AUTO_TRIGGER_FAILURE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AUTO_TRIGGER_FAILURE\"\n                    }\n                },\n                \"MANUAL_TRIGGER_SUCCESS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"MANUAL_TRIGGER_SUCCESS\"\n                    }\n                },\n                \"MANUAL_TRIGGER_FAILURE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"MANUAL_TRIGGER_FAILURE\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.timestreamquery#ScheduledQueryRunSummary\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"InvocationTime\": {\n                    \"target\": \"com.amazonaws.timestreamquery#Time\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>InvocationTime for this run. This is the time at which the query is scheduled to run.\\n            Parameter <code>@scheduled_runtime</code> can be used in the query to get the value.\\n        </p>\"\n                    }\n                },\n                \"TriggerTime\": {\n                    \"target\": \"com.amazonaws.timestreamquery#Time\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The actual time when the query was run.</p>\"\n                    }\n                },\n                \"RunStatus\": {\n                    \"target\": \"com.amazonaws.timestreamquery#ScheduledQueryRunStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The status of a scheduled query run.</p>\"\n                    }\n                },\n                \"ExecutionStats\": {\n                    \"target\": \"com.amazonaws.timestreamquery#ExecutionStats\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Runtime statistics for a scheduled run.</p>\"\n                    }\n                },\n                \"QueryInsightsResponse\": {\n                    \"target\": \"com.amazonaws.timestreamquery#ScheduledQueryInsightsResponse\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Provides various insights and metrics related to the run summary of the scheduled query.</p>\"\n                    }\n                },\n                \"ErrorReportLocation\": {\n                    \"target\": \"com.amazonaws.timestreamquery#ErrorReportLocation\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>S3 location for error report.</p>\"\n                    }\n                },\n                \"FailureReason\": {\n                    \"target\": \"com.amazonaws.timestreamquery#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Error message for the scheduled query in case of failure. You might have to look at\\n            the error report to get more detailed error reasons. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Run summary for the scheduled query</p>\"\n            }\n        },\n        \"com.amazonaws.timestreamquery#ScheduledQueryRunSummaryList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.timestreamquery#ScheduledQueryRunSummary\"\n            }\n        },\n        \"com.amazonaws.timestreamquery#ScheduledQueryState\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ENABLED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ENABLED\"\n                    }\n                },\n                \"DISABLED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DISABLED\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.timestreamquery#SchemaName\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.timestreamquery#SelectColumn\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Name\": {\n                    \"target\": \"com.amazonaws.timestreamquery#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Name of the column.</p>\"\n                    }\n                },\n                \"Type\": {\n                    \"target\": \"com.amazonaws.timestreamquery#Type\"\n                },\n                \"DatabaseName\": {\n                    \"target\": \"com.amazonaws.timestreamquery#ResourceName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> Database that has this column.</p>\"\n                    }\n                },\n                \"TableName\": {\n                    \"target\": \"com.amazonaws.timestreamquery#ResourceName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Table within the database that has this column. </p>\"\n                    }\n                },\n                \"Aliased\": {\n                    \"target\": \"com.amazonaws.timestreamquery#NullableBoolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>True, if the column name was aliased by the query. False otherwise.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Details of the column that is returned by the query. </p>\"\n            }\n        },\n        \"com.amazonaws.timestreamquery#SelectColumnList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.timestreamquery#SelectColumn\"\n            }\n        },\n        \"com.amazonaws.timestreamquery#ServiceErrorMessage\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.timestreamquery#ServiceQuotaExceededException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Message\": {\n                    \"target\": \"com.amazonaws.timestreamquery#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>You have exceeded the service quota.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 402\n            }\n        },\n        \"com.amazonaws.timestreamquery#SnsConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TopicArn\": {\n                    \"target\": \"com.amazonaws.timestreamquery#AmazonResourceName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>SNS topic ARN that the scheduled query status notifications will be sent to.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Details on SNS that are required to send the notification.</p>\"\n            }\n        },\n        \"com.amazonaws.timestreamquery#String\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.timestreamquery#StringValue2048\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 2048\n                }\n            }\n        },\n        \"com.amazonaws.timestreamquery#Tag\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Key\": {\n                    \"target\": \"com.amazonaws.timestreamquery#TagKey\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The key of the tag. Tag keys are case sensitive. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Value\": {\n                    \"target\": \"com.amazonaws.timestreamquery#TagValue\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The value of the tag. Tag values are case sensitive and can be null. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A tag is a label that you assign to a Timestream database and/or table. Each tag\\n            consists of a key and an optional value, both of which you define. Tags enable you to\\n            categorize databases and/or tables, for example, by purpose, owner, or environment.\\n        </p>\"\n            }\n        },\n        \"com.amazonaws.timestreamquery#TagKey\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 128\n                }\n            }\n        },\n        \"com.amazonaws.timestreamquery#TagKeyList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.timestreamquery#TagKey\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 200\n                }\n            }\n        },\n        \"com.amazonaws.timestreamquery#TagList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.timestreamquery#Tag\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 200\n                }\n            }\n        },\n        \"com.amazonaws.timestreamquery#TagResource\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.timestreamquery#TagResourceRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.timestreamquery#TagResourceResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#InvalidEndpointException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#ServiceQuotaExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#ThrottlingException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#clientDiscoveredEndpoint\": {\n                    \"required\": true\n                },\n                \"smithy.api#documentation\": \"<p>Associate a set of tags with a Timestream resource. You can then activate these\\n            user-defined tags so that they appear on the Billing and Cost Management console for\\n            cost allocation tracking. </p>\"\n            }\n        },\n        \"com.amazonaws.timestreamquery#TagResourceRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ResourceARN\": {\n                    \"target\": \"com.amazonaws.timestreamquery#AmazonResourceName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Identifies the Timestream resource to which tags should be added. This value is an\\n            Amazon Resource Name (ARN).</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.timestreamquery#TagList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The tags to be assigned to the Timestream resource.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.timestreamquery#TagResourceResponse\": {\n            \"type\": \"structure\",\n            \"members\": {},\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.timestreamquery#TagValue\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 256\n                }\n            }\n        },\n        \"com.amazonaws.timestreamquery#TargetConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TimestreamConfiguration\": {\n                    \"target\": \"com.amazonaws.timestreamquery#TimestreamConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Configuration needed to write data into the Timestream database and table.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Configuration used for writing the output of a query.</p>\"\n            }\n        },\n        \"com.amazonaws.timestreamquery#TargetDestination\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TimestreamDestination\": {\n                    \"target\": \"com.amazonaws.timestreamquery#TimestreamDestination\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Query result destination details for Timestream data source.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Destination details to write data for a target data source. Current supported data\\n            source is Timestream.</p>\"\n            }\n        },\n        \"com.amazonaws.timestreamquery#ThrottlingException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Message\": {\n                    \"target\": \"com.amazonaws.timestreamquery#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The request was throttled due to excessive requests.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 429\n            }\n        },\n        \"com.amazonaws.timestreamquery#Time\": {\n            \"type\": \"timestamp\"\n        },\n        \"com.amazonaws.timestreamquery#TimeSeriesDataPoint\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Time\": {\n                    \"target\": \"com.amazonaws.timestreamquery#Timestamp\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The timestamp when the measure value was collected.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Value\": {\n                    \"target\": \"com.amazonaws.timestreamquery#Datum\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The measure value for the data point.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The timeseries data type represents the values of a measure over time. A time series\\n            is an array of rows of timestamps and measure values, with rows sorted in ascending\\n            order of time. A TimeSeriesDataPoint is a single data point in the time series. It\\n            represents a tuple of (time, measure value) in a time series. </p>\"\n            }\n        },\n        \"com.amazonaws.timestreamquery#TimeSeriesDataPointList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.timestreamquery#TimeSeriesDataPoint\"\n            }\n        },\n        \"com.amazonaws.timestreamquery#Timestamp\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.timestreamquery#TimestreamConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DatabaseName\": {\n                    \"target\": \"com.amazonaws.timestreamquery#ResourceName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Name of Timestream database to which the query result will be written.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TableName\": {\n                    \"target\": \"com.amazonaws.timestreamquery#ResourceName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Name of Timestream table that the query result will be written to. The table should be\\n            within the same database that is provided in Timestream configuration.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TimeColumn\": {\n                    \"target\": \"com.amazonaws.timestreamquery#SchemaName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Column from query result that should be used as the time column in destination table.\\n            Column type for this should be TIMESTAMP.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DimensionMappings\": {\n                    \"target\": \"com.amazonaws.timestreamquery#DimensionMappingList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> This is to allow mapping column(s) from the query result to the dimension in the\\n            destination table. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"MultiMeasureMappings\": {\n                    \"target\": \"com.amazonaws.timestreamquery#MultiMeasureMappings\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Multi-measure mappings.</p>\"\n                    }\n                },\n                \"MixedMeasureMappings\": {\n                    \"target\": \"com.amazonaws.timestreamquery#MixedMeasureMappingList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies how to map measures to multi-measure records.</p>\"\n                    }\n                },\n                \"MeasureNameColumn\": {\n                    \"target\": \"com.amazonaws.timestreamquery#SchemaName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Name of the measure column.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p> Configuration to write data into Timestream database and table. This configuration\\n            allows the user to map the query result select columns into the destination table\\n            columns. </p>\"\n            }\n        },\n        \"com.amazonaws.timestreamquery#TimestreamDestination\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DatabaseName\": {\n                    \"target\": \"com.amazonaws.timestreamquery#ResourceName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Timestream database name. </p>\"\n                    }\n                },\n                \"TableName\": {\n                    \"target\": \"com.amazonaws.timestreamquery#ResourceName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Timestream table name. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Destination for scheduled query.</p>\"\n            }\n        },\n        \"com.amazonaws.timestreamquery#Timestream_20181101\": {\n            \"type\": \"service\",\n            \"version\": \"2018-11-01\",\n            \"operations\": [\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#CancelQuery\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#CreateScheduledQuery\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#DeleteScheduledQuery\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#DescribeAccountSettings\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#DescribeEndpoints\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#DescribeScheduledQuery\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#ExecuteScheduledQuery\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#ListScheduledQueries\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#ListTagsForResource\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#PrepareQuery\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#Query\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#TagResource\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#UntagResource\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#UpdateAccountSettings\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#UpdateScheduledQuery\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#clientEndpointDiscovery\": {\n                    \"operation\": \"com.amazonaws.timestreamquery#DescribeEndpoints\",\n                    \"error\": \"com.amazonaws.timestreamquery#InvalidEndpointException\"\n                },\n                \"aws.api#service\": {\n                    \"sdkId\": \"Timestream Query\",\n                    \"arnNamespace\": \"timestream\",\n                    \"cloudFormationName\": \"TimestreamQuery\",\n                    \"cloudTrailEventSource\": \"timestreamquery.amazonaws.com\",\n                    \"endpointPrefix\": \"query.timestream\"\n                },\n                \"aws.auth#sigv4\": {\n                    \"name\": \"timestream\"\n                },\n                \"aws.protocols#awsJson1_0\": {},\n                \"smithy.api#documentation\": \"<fullname>Amazon Timestream Query\\n        </fullname>\\n         <p></p>\",\n                \"smithy.api#title\": \"Amazon Timestream Query\",\n                \"smithy.rules#endpointRuleSet\": {\n                    \"version\": \"1.0\",\n                    \"parameters\": {\n                        \"Region\": {\n                            \"builtIn\": \"AWS::Region\",\n                            \"required\": false,\n                            \"documentation\": \"The AWS region used to dispatch the request.\",\n                            \"type\": \"String\"\n                        },\n                        \"UseDualStack\": {\n                            \"builtIn\": \"AWS::UseDualStack\",\n                            \"required\": true,\n                            \"default\": false,\n                            \"documentation\": \"When true, use the dual-stack endpoint. If the configured endpoint does not support dual-stack, dispatching the request MAY return an error.\",\n                            \"type\": \"Boolean\"\n                        },\n                        \"UseFIPS\": {\n                            \"builtIn\": \"AWS::UseFIPS\",\n                            \"required\": true,\n                            \"default\": false,\n                            \"documentation\": \"When true, send this request to the FIPS-compliant regional endpoint. If the configured endpoint does not have a FIPS compliant endpoint, dispatching the request will return an error.\",\n                            \"type\": \"Boolean\"\n                        },\n                        \"Endpoint\": {\n                            \"builtIn\": \"SDK::Endpoint\",\n                            \"required\": false,\n                            \"documentation\": \"Override the endpoint used to send this request\",\n                            \"type\": \"String\"\n                        }\n                    },\n                    \"rules\": [\n                        {\n                            \"conditions\": [\n                                {\n                                    \"fn\": \"isSet\",\n                                    \"argv\": [\n                                        {\n                                            \"ref\": \"Endpoint\"\n                                        }\n                                    ]\n                                }\n                            ],\n                            \"rules\": [\n                                {\n                                    \"conditions\": [\n                                        {\n                                            \"fn\": \"booleanEquals\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"UseFIPS\"\n                                                },\n                                                true\n                                            ]\n                                        }\n                                    ],\n                                    \"error\": \"Invalid Configuration: FIPS and custom endpoint are not supported\",\n                                    \"type\": \"error\"\n                                },\n                                {\n                                    \"conditions\": [\n                                        {\n                                            \"fn\": \"booleanEquals\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"UseDualStack\"\n                                                },\n                                                true\n                                            ]\n                                        }\n                                    ],\n                                    \"error\": \"Invalid Configuration: Dualstack and custom endpoint are not supported\",\n                                    \"type\": \"error\"\n                                },\n                                {\n                                    \"conditions\": [],\n                                    \"endpoint\": {\n                                        \"url\": {\n                                            \"ref\": \"Endpoint\"\n                                        },\n                                        \"properties\": {},\n                                        \"headers\": {}\n                                    },\n                                    \"type\": \"endpoint\"\n                                }\n                            ],\n                            \"type\": \"tree\"\n                        },\n                        {\n                            \"conditions\": [\n                                {\n                                    \"fn\": \"isSet\",\n                                    \"argv\": [\n                                        {\n                                            \"ref\": \"Region\"\n                                        }\n                                    ]\n                                }\n                            ],\n                            \"rules\": [\n                                {\n                                    \"conditions\": [\n                                        {\n                                            \"fn\": \"aws.partition\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"Region\"\n                                                }\n                                            ],\n                                            \"assign\": \"PartitionResult\"\n                                        }\n                                    ],\n                                    \"rules\": [\n                                        {\n                                            \"conditions\": [\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseFIPS\"\n                                                        },\n                                                        true\n                                                    ]\n                                                },\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseDualStack\"\n                                                        },\n                                                        true\n                                                    ]\n                                                }\n                                            ],\n                                            \"rules\": [\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                true,\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"PartitionResult\"\n                                                                        },\n                                                                        \"supportsFIPS\"\n                                                                    ]\n                                                                }\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                true,\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"PartitionResult\"\n                                                                        },\n                                                                        \"supportsDualStack\"\n                                                                    ]\n                                                                }\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"rules\": [\n                                                        {\n                                                            \"conditions\": [\n                                                                {\n                                                                    \"fn\": \"stringEquals\",\n                                                                    \"argv\": [\n                                                                        \"aws\",\n                                                                        {\n                                                                            \"fn\": \"getAttr\",\n                                                                            \"argv\": [\n                                                                                {\n                                                                                    \"ref\": \"PartitionResult\"\n                                                                                },\n                                                                                \"name\"\n                                                                            ]\n                                                                        }\n                                                                    ]\n                                                                }\n                                                            ],\n                                                            \"endpoint\": {\n                                                                \"url\": \"https://timestream-query-fips.{Region}.api.aws\",\n                                                                \"properties\": {},\n                                                                \"headers\": {}\n                                                            },\n                                                            \"type\": \"endpoint\"\n                                                        },\n                                                        {\n                                                            \"conditions\": [\n                                                                {\n                                                                    \"fn\": \"stringEquals\",\n                                                                    \"argv\": [\n                                                                        \"aws-us-gov\",\n                                                                        {\n                                                                            \"fn\": \"getAttr\",\n                                                                            \"argv\": [\n                                                                                {\n                                                                                    \"ref\": \"PartitionResult\"\n                                                                                },\n                                                                                \"name\"\n                                                                            ]\n                                                                        }\n                                                                    ]\n                                                                }\n                                                            ],\n                                                            \"endpoint\": {\n                                                                \"url\": \"https://timestream-query.{Region}.api.aws\",\n                                                                \"properties\": {},\n                                                                \"headers\": {}\n                                                            },\n                                                            \"type\": \"endpoint\"\n                                                        },\n                                                        {\n                                                            \"conditions\": [],\n                                                            \"endpoint\": {\n                                                                \"url\": \"https://query.timestream-fips.{Region}.{PartitionResult#dualStackDnsSuffix}\",\n                                                                \"properties\": {},\n                                                                \"headers\": {}\n                                                            },\n                                                            \"type\": \"endpoint\"\n                                                        }\n                                                    ],\n                                                    \"type\": \"tree\"\n                                                },\n                                                {\n                                                    \"conditions\": [],\n                                                    \"error\": \"FIPS and DualStack are enabled, but this partition does not support one or both\",\n                                                    \"type\": \"error\"\n                                                }\n                                            ],\n                                            \"type\": \"tree\"\n                                        },\n                                        {\n                                            \"conditions\": [\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseFIPS\"\n                                                        },\n                                                        true\n                                                    ]\n                                                }\n                                            ],\n                                            \"rules\": [\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"PartitionResult\"\n                                                                        },\n                                                                        \"supportsFIPS\"\n                                                                    ]\n                                                                },\n                                                                true\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"rules\": [\n                                                        {\n                                                            \"conditions\": [\n                                                                {\n                                                                    \"fn\": \"stringEquals\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"fn\": \"getAttr\",\n                                                                            \"argv\": [\n                                                                                {\n                                                                                    \"ref\": \"PartitionResult\"\n                                                                                },\n                                                                                \"name\"\n                                                                            ]\n                                                                        },\n                                                                        \"aws-us-gov\"\n                                                                    ]\n                                                                }\n                                                            ],\n                                                            \"endpoint\": {\n                                                                \"url\": \"https://query.timestream.{Region}.amazonaws.com\",\n                                                                \"properties\": {},\n                                                                \"headers\": {}\n                                                            },\n                                                            \"type\": \"endpoint\"\n                                                        },\n                                                        {\n                                                            \"conditions\": [],\n                                                            \"endpoint\": {\n                                                                \"url\": \"https://query.timestream-fips.{Region}.{PartitionResult#dnsSuffix}\",\n                                                                \"properties\": {},\n                                                                \"headers\": {}\n                                                            },\n                                                            \"type\": \"endpoint\"\n                                                        }\n                                                    ],\n                                                    \"type\": \"tree\"\n                                                },\n                                                {\n                                                    \"conditions\": [],\n                                                    \"error\": \"FIPS is enabled but this partition does not support FIPS\",\n                                                    \"type\": \"error\"\n                                                }\n                                            ],\n                                            \"type\": \"tree\"\n                                        },\n                                        {\n                                            \"conditions\": [\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseDualStack\"\n                                                        },\n                                                        true\n                                                    ]\n                                                }\n                                            ],\n                                            \"rules\": [\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                true,\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"PartitionResult\"\n                                                                        },\n                                                                        \"supportsDualStack\"\n                                                                    ]\n                                                                }\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"rules\": [\n                                                        {\n                                                            \"conditions\": [\n                                                                {\n                                                                    \"fn\": \"stringEquals\",\n                                                                    \"argv\": [\n                                                                        \"aws\",\n                                                                        {\n                                                                            \"fn\": \"getAttr\",\n                                                                            \"argv\": [\n                                                                                {\n                                                                                    \"ref\": \"PartitionResult\"\n                                                                                },\n                                                                                \"name\"\n                                                                            ]\n                                                                        }\n                                                                    ]\n                                                                }\n                                                            ],\n                                                            \"endpoint\": {\n                                                                \"url\": \"https://timestream-query.{Region}.api.aws\",\n                                                                \"properties\": {},\n                                                                \"headers\": {}\n                                                            },\n                                                            \"type\": \"endpoint\"\n                                                        },\n                                                        {\n                                                            \"conditions\": [\n                                                                {\n                                                                    \"fn\": \"stringEquals\",\n                                                                    \"argv\": [\n                                                                        \"aws-us-gov\",\n                                                                        {\n                                                                            \"fn\": \"getAttr\",\n                                                                            \"argv\": [\n                                                                                {\n                                                                                    \"ref\": \"PartitionResult\"\n                                                                                },\n                                                                                \"name\"\n                                                                            ]\n                                                                        }\n                                                                    ]\n                                                                }\n                                                            ],\n                                                            \"endpoint\": {\n                                                                \"url\": \"https://timestream-query.{Region}.api.aws\",\n                                                                \"properties\": {},\n                                                                \"headers\": {}\n                                                            },\n                                                            \"type\": \"endpoint\"\n                                                        },\n                                                        {\n                                                            \"conditions\": [],\n                                                            \"endpoint\": {\n                                                                \"url\": \"https://query.timestream.{Region}.{PartitionResult#dualStackDnsSuffix}\",\n                                                                \"properties\": {},\n                                                                \"headers\": {}\n                                                            },\n                                                            \"type\": \"endpoint\"\n                                                        }\n                                                    ],\n                                                    \"type\": \"tree\"\n                                                },\n                                                {\n                                                    \"conditions\": [],\n                                                    \"error\": \"DualStack is enabled but this partition does not support DualStack\",\n                                                    \"type\": \"error\"\n                                                }\n                                            ],\n                                            \"type\": \"tree\"\n                                        },\n                                        {\n                                            \"conditions\": [],\n                                            \"endpoint\": {\n                                                \"url\": \"https://query.timestream.{Region}.{PartitionResult#dnsSuffix}\",\n                                                \"properties\": {},\n                                                \"headers\": {}\n                                            },\n                                            \"type\": \"endpoint\"\n                                        }\n                                    ],\n                                    \"type\": \"tree\"\n                                }\n                            ],\n                            \"type\": \"tree\"\n                        },\n                        {\n                            \"conditions\": [],\n                            \"error\": \"Invalid Configuration: Missing Region\",\n                            \"type\": \"error\"\n                        }\n                    ]\n                },\n                \"smithy.rules#endpointTests\": {\n                    \"testCases\": [\n                        {\n                            \"documentation\": \"For region ap-northeast-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://query.timestream.ap-northeast-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-northeast-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-northeast-1 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://timestream-query.ap-northeast-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-northeast-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-south-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://query.timestream.ap-south-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-south-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-south-1 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://timestream-query.ap-south-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-south-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-southeast-2 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://query.timestream.ap-southeast-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-southeast-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-southeast-2 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://timestream-query.ap-southeast-2.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-southeast-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-central-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://query.timestream.eu-central-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-central-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-central-1 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://timestream-query.eu-central-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-central-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-west-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://query.timestream.eu-west-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-west-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-west-1 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://timestream-query.eu-west-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-west-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://query.timestream.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-1 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://timestream-query.us-east-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-1 with FIPS enabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://timestream-query-fips.us-east-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-2 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://query.timestream.us-east-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-2 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://timestream-query.us-east-2.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-2 with FIPS enabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://timestream-query-fips.us-east-2.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-2\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-west-2 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://query.timestream.us-west-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-west-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-west-2 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://timestream-query.us-west-2.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-west-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-west-2 with FIPS enabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://timestream-query-fips.us-west-2.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-west-2\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://query.timestream-fips.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-north-1 with FIPS enabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://query.timestream-fips.cn-north-1.api.amazonwebservices.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-north-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-north-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://query.timestream-fips.cn-north-1.amazonaws.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-north-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-north-1 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://query.timestream.cn-north-1.api.amazonwebservices.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-north-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-north-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://query.timestream.cn-north-1.amazonaws.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-north-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-west-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://query.timestream.us-gov-west-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-west-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-west-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://query.timestream.us-gov-west-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-west-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-west-1 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://timestream-query.us-gov-west-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-west-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-west-1 with FIPS enabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://timestream-query.us-gov-west-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-west-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-east-1 with FIPS enabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://timestream-query.us-gov-east-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-east-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://query.timestream.us-gov-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-east-1 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://timestream-query.us-gov-east-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://query.timestream.us-gov-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-iso-east-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://query.timestream-fips.us-iso-east-1.c2s.ic.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-iso-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-iso-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://query.timestream.us-iso-east-1.c2s.ic.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-iso-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-isob-east-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://query.timestream-fips.us-isob-east-1.sc2s.sgov.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-isob-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-isob-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://query.timestream.us-isob-east-1.sc2s.sgov.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-isob-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For custom endpoint with region set and fips disabled and dualstack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://example.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"For custom endpoint with region not set and fips disabled and dualstack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://example.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"For custom endpoint with fips enabled and dualstack disabled\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: FIPS and custom endpoint are not supported\"\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false,\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"For custom endpoint with fips disabled and dualstack enabled\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: Dualstack and custom endpoint are not supported\"\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true,\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"Missing region\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: Missing Region\"\n                            }\n                        }\n                    ],\n                    \"version\": \"1.0\"\n                }\n            }\n        },\n        \"com.amazonaws.timestreamquery#Type\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ScalarType\": {\n                    \"target\": \"com.amazonaws.timestreamquery#ScalarType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates if the column is of type string, integer, Boolean, double, timestamp, date,\\n            time. For more information, see <a href=\\\"https://docs.aws.amazon.com/timestream/latest/developerguide/supported-data-types.html\\\">Supported data\\n                types</a>.</p>\"\n                    }\n                },\n                \"ArrayColumnInfo\": {\n                    \"target\": \"com.amazonaws.timestreamquery#ColumnInfo\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates if the column is an array.</p>\"\n                    }\n                },\n                \"TimeSeriesMeasureValueColumnInfo\": {\n                    \"target\": \"com.amazonaws.timestreamquery#ColumnInfo\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates if the column is a timeseries data type.</p>\"\n                    }\n                },\n                \"RowColumnInfo\": {\n                    \"target\": \"com.amazonaws.timestreamquery#ColumnInfoList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates if the column is a row.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the data type of a column in a query result set. The data type can be scalar\\n            or complex. The supported scalar data types are integers, Boolean, string, double,\\n            timestamp, date, time, and intervals. The supported complex data types are arrays, rows,\\n            and timeseries.</p>\"\n            }\n        },\n        \"com.amazonaws.timestreamquery#UntagResource\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.timestreamquery#UntagResourceRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.timestreamquery#UntagResourceResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#InvalidEndpointException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#ThrottlingException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#clientDiscoveredEndpoint\": {\n                    \"required\": true\n                },\n                \"smithy.api#documentation\": \"<p>Removes the association of tags from a Timestream query resource.</p>\"\n            }\n        },\n        \"com.amazonaws.timestreamquery#UntagResourceRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ResourceARN\": {\n                    \"target\": \"com.amazonaws.timestreamquery#AmazonResourceName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Timestream resource that the tags will be removed from. This value is an Amazon\\n            Resource Name (ARN). </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TagKeys\": {\n                    \"target\": \"com.amazonaws.timestreamquery#TagKeyList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of tags keys. Existing tags of the resource whose keys are members of this list\\n            will be removed from the Timestream resource. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.timestreamquery#UntagResourceResponse\": {\n            \"type\": \"structure\",\n            \"members\": {},\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.timestreamquery#UpdateAccountSettings\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.timestreamquery#UpdateAccountSettingsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.timestreamquery#UpdateAccountSettingsResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#AccessDeniedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#InternalServerException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#InvalidEndpointException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#ThrottlingException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#clientDiscoveredEndpoint\": {\n                    \"required\": true\n                },\n                \"smithy.api#documentation\": \"<p>Transitions your account to use TCUs for query pricing and modifies the maximum query compute units that you've configured. If you reduce the value of <code>MaxQueryTCU</code> to a desired configuration, the new value can take up to 24 hours to be effective.</p>\\n         <note>\\n            <p>After you've transitioned your account to use TCUs for query pricing, you can't transition to using bytes scanned for query pricing.</p>\\n         </note>\",\n                \"smithy.api#idempotent\": {}\n            }\n        },\n        \"com.amazonaws.timestreamquery#UpdateAccountSettingsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"MaxQueryTCU\": {\n                    \"target\": \"com.amazonaws.timestreamquery#MaxQueryCapacity\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The maximum number of compute units the service will use at any point in time to serve your queries. To run queries, you must set a minimum capacity of 4 TCU. You can set the maximum number of TCU in multiples of 4, for example, 4, 8, 16, 32, and so on. The maximum value supported for <code>MaxQueryTCU</code> is 1000. To request an increase to this soft limit, contact Amazon Web Services Support. For information about the default quota for maxQueryTCU, see Default quotas. This configuration is applicable only for on-demand usage of Timestream Compute Units (TCUs).</p>\\n         <p>The maximum value supported for <code>MaxQueryTCU</code> is 1000. To request an increase to this soft limit, contact Amazon Web Services Support. For information about the default quota for <code>maxQueryTCU</code>, see <a href=\\\"https://docs.aws.amazon.com/timestream/latest/developerguide/ts-limits.html#limits.default\\\">Default quotas</a>.</p>\"\n                    }\n                },\n                \"QueryPricingModel\": {\n                    \"target\": \"com.amazonaws.timestreamquery#QueryPricingModel\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The pricing model for queries in an account.</p>\\n         <note>\\n            <p>The <code>QueryPricingModel</code> parameter is used by several Timestream operations; however, the <code>UpdateAccountSettings</code> API operation doesn't recognize any values other than <code>COMPUTE_UNITS</code>.</p>\\n         </note>\"\n                    }\n                },\n                \"QueryCompute\": {\n                    \"target\": \"com.amazonaws.timestreamquery#QueryComputeRequest\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Modifies the query compute settings configured in your account, including the query pricing model and provisioned Timestream Compute Units (TCUs) in your account.</p>\\n         <note>\\n            <p>This API is idempotent, meaning that making the same request multiple times will have the same effect as making the request once.</p>\\n         </note>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.timestreamquery#UpdateAccountSettingsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"MaxQueryTCU\": {\n                    \"target\": \"com.amazonaws.timestreamquery#MaxQueryCapacity\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The configured maximum number of compute units the service will use at any point in time to serve your queries.</p>\"\n                    }\n                },\n                \"QueryPricingModel\": {\n                    \"target\": \"com.amazonaws.timestreamquery#QueryPricingModel\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The pricing model for an account.</p>\"\n                    }\n                },\n                \"QueryCompute\": {\n                    \"target\": \"com.amazonaws.timestreamquery#QueryComputeResponse\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Confirms the updated account settings for querying data in your account.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.timestreamquery#UpdateScheduledQuery\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.timestreamquery#UpdateScheduledQueryRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#AccessDeniedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#InternalServerException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#InvalidEndpointException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#ThrottlingException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamquery#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#clientDiscoveredEndpoint\": {\n                    \"required\": true\n                },\n                \"smithy.api#documentation\": \"<p>Update a scheduled query.</p>\"\n            }\n        },\n        \"com.amazonaws.timestreamquery#UpdateScheduledQueryRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ScheduledQueryArn\": {\n                    \"target\": \"com.amazonaws.timestreamquery#AmazonResourceName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>ARN of the scheuled query.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"State\": {\n                    \"target\": \"com.amazonaws.timestreamquery#ScheduledQueryState\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>State of the scheduled query. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.timestreamquery#ValidationException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Message\": {\n                    \"target\": \"com.amazonaws.timestreamquery#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p> Invalid or malformed request. </p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "aws/sdk/aws-models/timestream-write.json",
    "content": "{\n    \"smithy\": \"2.0\",\n    \"metadata\": {\n        \"suppressions\": [\n            {\n                \"id\": \"HttpMethodSemantics\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"HttpResponseCodeSemantics\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"PaginatedTrait\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"HttpHeaderTrait\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"HttpUriConflict\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"Service\",\n                \"namespace\": \"*\"\n            }\n        ]\n    },\n    \"shapes\": {\n        \"com.amazonaws.timestreamwrite#AccessDeniedException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Message\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>You are not authorized to perform this action.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 403\n            }\n        },\n        \"com.amazonaws.timestreamwrite#AmazonResourceName\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 1011\n                }\n            }\n        },\n        \"com.amazonaws.timestreamwrite#BatchLoadDataFormat\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"CSV\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"CSV\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.timestreamwrite#BatchLoadProgressReport\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RecordsProcessed\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#Long\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                },\n                \"RecordsIngested\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#Long\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                },\n                \"ParseFailures\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#Long\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                },\n                \"RecordIngestionFailures\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#Long\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                },\n                \"FileFailures\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#Long\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                },\n                \"BytesMetered\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#Long\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Details about the progress of a batch load task.</p>\"\n            }\n        },\n        \"com.amazonaws.timestreamwrite#BatchLoadStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"CREATED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"CREATED\"\n                    }\n                },\n                \"IN_PROGRESS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"IN_PROGRESS\"\n                    }\n                },\n                \"FAILED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"FAILED\"\n                    }\n                },\n                \"SUCCEEDED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"SUCCEEDED\"\n                    }\n                },\n                \"PROGRESS_STOPPED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"PROGRESS_STOPPED\"\n                    }\n                },\n                \"PENDING_RESUME\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"PENDING_RESUME\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.timestreamwrite#BatchLoadTask\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TaskId\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#BatchLoadTaskId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the batch load task.</p>\"\n                    }\n                },\n                \"TaskStatus\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#BatchLoadStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Status of the batch load task.</p>\"\n                    }\n                },\n                \"DatabaseName\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#ResourceName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Database name for the database into which a batch load task loads data.</p>\"\n                    }\n                },\n                \"TableName\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#ResourceName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Table name for the table into which a batch load task loads data.</p>\"\n                    }\n                },\n                \"CreationTime\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#Date\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time when the Timestream batch load task was created.</p>\"\n                    }\n                },\n                \"LastUpdatedTime\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#Date\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time when the Timestream batch load task was last updated.</p>\"\n                    }\n                },\n                \"ResumableUntil\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#Date\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>\\n      </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Details about a batch load task.</p>\"\n            }\n        },\n        \"com.amazonaws.timestreamwrite#BatchLoadTaskDescription\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TaskId\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#BatchLoadTaskId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the batch load task.</p>\"\n                    }\n                },\n                \"ErrorMessage\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#StringValue2048\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                },\n                \"DataSourceConfiguration\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#DataSourceConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Configuration details about the data source for a batch load task.</p>\"\n                    }\n                },\n                \"ProgressReport\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#BatchLoadProgressReport\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                },\n                \"ReportConfiguration\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#ReportConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Report configuration for a batch load task. This contains details about where error\\n         reports are stored.</p>\"\n                    }\n                },\n                \"DataModelConfiguration\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#DataModelConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Data model configuration for a batch load task. This contains details about where a data\\n         model for a batch load task is stored.</p>\"\n                    }\n                },\n                \"TargetDatabaseName\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#ResourceName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                },\n                \"TargetTableName\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#ResourceName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                },\n                \"TaskStatus\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#BatchLoadStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Status of the batch load task.</p>\"\n                    }\n                },\n                \"RecordVersion\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#RecordVersion\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                },\n                \"CreationTime\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#Date\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time when the Timestream batch load task was created.</p>\"\n                    }\n                },\n                \"LastUpdatedTime\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#Date\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time when the Timestream batch load task was last updated.</p>\"\n                    }\n                },\n                \"ResumableUntil\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#Date\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>\\n      </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Details about a batch load task.</p>\"\n            }\n        },\n        \"com.amazonaws.timestreamwrite#BatchLoadTaskId\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 3,\n                    \"max\": 32\n                },\n                \"smithy.api#pattern\": \"^[A-Z0-9]+$\"\n            }\n        },\n        \"com.amazonaws.timestreamwrite#BatchLoadTaskList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.timestreamwrite#BatchLoadTask\"\n            }\n        },\n        \"com.amazonaws.timestreamwrite#Boolean\": {\n            \"type\": \"boolean\"\n        },\n        \"com.amazonaws.timestreamwrite#ClientRequestToken\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 64\n                },\n                \"smithy.api#sensitive\": {}\n            }\n        },\n        \"com.amazonaws.timestreamwrite#ConflictException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Message\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Timestream was unable to process this request because it contains resource that\\n         already exists.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 409\n            }\n        },\n        \"com.amazonaws.timestreamwrite#CreateBatchLoadTask\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.timestreamwrite#CreateBatchLoadTaskRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.timestreamwrite#CreateBatchLoadTaskResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#AccessDeniedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#ConflictException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#InternalServerException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#InvalidEndpointException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#ServiceQuotaExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#ThrottlingException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#clientDiscoveredEndpoint\": {\n                    \"required\": true\n                },\n                \"smithy.api#documentation\": \"<p>Creates a new Timestream batch load task. A batch load task processes data from\\n         a CSV source in an S3 location and writes to a Timestream table. A mapping from\\n         source to target is defined in a batch load task. Errors and events are written to a report\\n         at an S3 location. For the report, if the KMS key is not specified, the\\n         report will be encrypted with an S3 managed key when <code>SSE_S3</code> is the option.\\n         Otherwise an error is thrown. For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk\\\">Amazon Web Services managed\\n            keys</a>. <a href=\\\"https://docs.aws.amazon.com/timestream/latest/developerguide/ts-limits.html\\\">Service quotas apply</a>. For\\n         details, see <a href=\\\"https://docs.aws.amazon.com/timestream/latest/developerguide/code-samples.create-batch-load.html\\\">code\\n            sample</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.timestreamwrite#CreateBatchLoadTaskRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ClientToken\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#ClientRequestToken\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\",\n                        \"smithy.api#idempotencyToken\": {}\n                    }\n                },\n                \"DataModelConfiguration\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#DataModelConfiguration\"\n                },\n                \"DataSourceConfiguration\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#DataSourceConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Defines configuration details about the data source for a batch load task.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ReportConfiguration\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#ReportConfiguration\",\n                    \"traits\": {\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TargetDatabaseName\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#ResourceCreateAPIName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Target Timestream database for a batch load task.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TargetTableName\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#ResourceCreateAPIName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Target Timestream table for a batch load task.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"RecordVersion\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#RecordVersion\",\n                    \"traits\": {\n                        \"smithy.api#default\": null,\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.timestreamwrite#CreateBatchLoadTaskResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TaskId\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#BatchLoadTaskId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the batch load task.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.timestreamwrite#CreateDatabase\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.timestreamwrite#CreateDatabaseRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.timestreamwrite#CreateDatabaseResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#AccessDeniedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#ConflictException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#InternalServerException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#InvalidEndpointException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#ServiceQuotaExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#ThrottlingException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#clientDiscoveredEndpoint\": {\n                    \"required\": true\n                },\n                \"smithy.api#documentation\": \"<p>Creates a new Timestream database. If the KMS key is not\\n         specified, the database will be encrypted with a Timestream managed KMS key located in your account. For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk\\\">Amazon Web Services managed keys</a>. <a href=\\\"https://docs.aws.amazon.com/timestream/latest/developerguide/ts-limits.html\\\">Service quotas apply</a>. For\\n         details, see <a href=\\\"https://docs.aws.amazon.com/timestream/latest/developerguide/code-samples.create-db.html\\\">code sample</a>.\\n      </p>\"\n            }\n        },\n        \"com.amazonaws.timestreamwrite#CreateDatabaseRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DatabaseName\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#ResourceCreateAPIName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the Timestream database.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"KmsKeyId\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#StringValue2048\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The KMS key for the database. If the KMS key is not\\n         specified, the database will be encrypted with a Timestream managed KMS key located in your account. For more information, see <a href=\\\"https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#aws-managed-cmk\\\">Amazon Web Services managed keys</a>.</p>\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#TagList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> A list of key-value pairs to label the table. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.timestreamwrite#CreateDatabaseResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Database\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#Database\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The newly created Timestream database.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.timestreamwrite#CreateTable\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.timestreamwrite#CreateTableRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.timestreamwrite#CreateTableResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#AccessDeniedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#ConflictException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#InternalServerException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#InvalidEndpointException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#ServiceQuotaExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#ThrottlingException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#clientDiscoveredEndpoint\": {\n                    \"required\": true\n                },\n                \"smithy.api#documentation\": \"<p>Adds a new table to an existing database in your account. In an Amazon Web Services account, table names must be at least unique within each Region if they are in the same\\n         database. You might have identical table names in the same Region if the tables are in\\n         separate databases. While creating the table, you must specify the table name, database\\n         name, and the retention properties. <a href=\\\"https://docs.aws.amazon.com/timestream/latest/developerguide/ts-limits.html\\\">Service quotas apply</a>. See\\n            <a href=\\\"https://docs.aws.amazon.com/timestream/latest/developerguide/code-samples.create-table.html\\\">code\\n            sample</a> for details. </p>\"\n            }\n        },\n        \"com.amazonaws.timestreamwrite#CreateTableRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DatabaseName\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#ResourceCreateAPIName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the Timestream database.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TableName\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#ResourceCreateAPIName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the Timestream table.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"RetentionProperties\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#RetentionProperties\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The duration for which your time-series data must be stored in the memory store and the\\n         magnetic store.</p>\"\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#TagList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> A list of key-value pairs to label the table. </p>\"\n                    }\n                },\n                \"MagneticStoreWriteProperties\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#MagneticStoreWriteProperties\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Contains properties to set on the table when enabling magnetic store writes.</p>\"\n                    }\n                },\n                \"Schema\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#Schema\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The schema of the table. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.timestreamwrite#CreateTableResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Table\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#Table\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The newly created Timestream table.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.timestreamwrite#CsvConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ColumnSeparator\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#StringValue1\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Column separator can be one of comma (','), pipe ('|), semicolon (';'), tab('/t'), or\\n         blank space (' '). </p>\"\n                    }\n                },\n                \"EscapeChar\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#StringValue1\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Escape character can be one of </p>\"\n                    }\n                },\n                \"QuoteChar\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#StringValue1\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Can be single quote (') or double quote (\\\").</p>\"\n                    }\n                },\n                \"NullValue\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#StringValue256\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Can be blank space (' ').</p>\"\n                    }\n                },\n                \"TrimWhiteSpace\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specifies to trim leading and trailing white space.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A delimited data format where the column separator can be a comma and the record\\n         separator is a newline character.</p>\"\n            }\n        },\n        \"com.amazonaws.timestreamwrite#DataModel\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TimeColumn\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#StringValue256\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Source column to be mapped to time.</p>\"\n                    }\n                },\n                \"TimeUnit\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#TimeUnit\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The granularity of the timestamp unit. It indicates if the time value is in seconds,\\n         milliseconds, nanoseconds, or other supported values. Default is <code>MILLISECONDS</code>.\\n      </p>\"\n                    }\n                },\n                \"DimensionMappings\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#DimensionMappings\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Source to target mappings for dimensions.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"MultiMeasureMappings\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#MultiMeasureMappings\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Source to target mappings for multi-measure records.</p>\"\n                    }\n                },\n                \"MixedMeasureMappings\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#MixedMeasureMappingList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Source to target mappings for measures.</p>\"\n                    }\n                },\n                \"MeasureNameColumn\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#StringValue256\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Data model for a batch load task.</p>\"\n            }\n        },\n        \"com.amazonaws.timestreamwrite#DataModelConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DataModel\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#DataModel\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                },\n                \"DataModelS3Configuration\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#DataModelS3Configuration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p></p>\"\n            }\n        },\n        \"com.amazonaws.timestreamwrite#DataModelS3Configuration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"BucketName\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#S3BucketName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                },\n                \"ObjectKey\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#S3ObjectKey\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p></p>\"\n            }\n        },\n        \"com.amazonaws.timestreamwrite#DataSourceConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DataSourceS3Configuration\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#DataSourceS3Configuration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Configuration of an S3 location for a file which contains data to load.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"CsvConfiguration\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#CsvConfiguration\"\n                },\n                \"DataFormat\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#BatchLoadDataFormat\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>This is currently CSV.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Defines configuration details about the data source.</p>\"\n            }\n        },\n        \"com.amazonaws.timestreamwrite#DataSourceS3Configuration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"BucketName\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#S3BucketName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The bucket name of the customer S3 bucket.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ObjectKeyPrefix\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#S3ObjectKey\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>\\n      </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>\\n      </p>\"\n            }\n        },\n        \"com.amazonaws.timestreamwrite#Database\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Arn\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name that uniquely identifies this database.</p>\"\n                    }\n                },\n                \"DatabaseName\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#ResourceName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the Timestream database.</p>\"\n                    }\n                },\n                \"TableCount\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#Long\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The total number of tables found within a Timestream database. </p>\"\n                    }\n                },\n                \"KmsKeyId\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#StringValue2048\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The identifier of the KMS key used to encrypt the data stored in the\\n         database.</p>\"\n                    }\n                },\n                \"CreationTime\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#Date\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time when the database was created, calculated from the Unix epoch time.</p>\"\n                    }\n                },\n                \"LastUpdatedTime\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#Date\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The last time that this database was updated. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A top-level container for a table. Databases and tables are the fundamental management\\n         concepts in Amazon Timestream. All tables in a database are encrypted with the\\n         same KMS key.</p>\"\n            }\n        },\n        \"com.amazonaws.timestreamwrite#DatabaseList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.timestreamwrite#Database\"\n            }\n        },\n        \"com.amazonaws.timestreamwrite#Date\": {\n            \"type\": \"timestamp\"\n        },\n        \"com.amazonaws.timestreamwrite#DeleteDatabase\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.timestreamwrite#DeleteDatabaseRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#AccessDeniedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#InternalServerException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#InvalidEndpointException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#ThrottlingException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#clientDiscoveredEndpoint\": {\n                    \"required\": true\n                },\n                \"smithy.api#documentation\": \"<p>Deletes a given Timestream database. <i>This is an irreversible\\n            operation. After a database is deleted, the time-series data from its tables cannot be\\n            recovered.</i>\\n         </p>\\n         <note>\\n            <p>All tables in the database must be deleted first, or a ValidationException error will\\n            be thrown. </p>\\n            <p>Due to the nature of distributed retries, the operation can return either success or\\n            a ResourceNotFoundException. Clients should consider them equivalent.</p>\\n         </note>\\n         <p>See <a href=\\\"https://docs.aws.amazon.com/timestream/latest/developerguide/code-samples.delete-db.html\\\">code sample</a>\\n         for details.</p>\"\n            }\n        },\n        \"com.amazonaws.timestreamwrite#DeleteDatabaseRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DatabaseName\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#ResourceName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the Timestream database to be deleted.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.timestreamwrite#DeleteTable\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.timestreamwrite#DeleteTableRequest\"\n            },\n            \"output\": {\n                \"target\": \"smithy.api#Unit\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#AccessDeniedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#InternalServerException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#InvalidEndpointException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#ThrottlingException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#clientDiscoveredEndpoint\": {\n                    \"required\": true\n                },\n                \"smithy.api#documentation\": \"<p>Deletes a given Timestream table. This is an irreversible operation. After a\\n            Timestream database table is deleted, the time-series data stored in the table\\n         cannot be recovered. </p>\\n         <note>\\n            <p>Due to the nature of distributed retries, the operation can return either success or\\n            a ResourceNotFoundException. Clients should consider them equivalent.</p>\\n         </note>\\n         <p>See <a href=\\\"https://docs.aws.amazon.com/timestream/latest/developerguide/code-samples.delete-table.html\\\">code\\n            sample</a> for details.</p>\"\n            }\n        },\n        \"com.amazonaws.timestreamwrite#DeleteTableRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DatabaseName\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#ResourceName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the database where the Timestream database is to be deleted.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TableName\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#ResourceName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the Timestream table to be deleted.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.timestreamwrite#DescribeBatchLoadTask\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.timestreamwrite#DescribeBatchLoadTaskRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.timestreamwrite#DescribeBatchLoadTaskResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#AccessDeniedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#InternalServerException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#InvalidEndpointException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#ThrottlingException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#clientDiscoveredEndpoint\": {\n                    \"required\": true\n                },\n                \"smithy.api#documentation\": \"<p>Returns information about the batch load task, including configurations, mappings,\\n         progress, and other details. <a href=\\\"https://docs.aws.amazon.com/timestream/latest/developerguide/ts-limits.html\\\">Service quotas apply</a>. See\\n            <a href=\\\"https://docs.aws.amazon.com/timestream/latest/developerguide/code-samples.describe-batch-load.html\\\">code\\n            sample</a> for details.</p>\"\n            }\n        },\n        \"com.amazonaws.timestreamwrite#DescribeBatchLoadTaskRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TaskId\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#BatchLoadTaskId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the batch load task.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.timestreamwrite#DescribeBatchLoadTaskResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"BatchLoadTaskDescription\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#BatchLoadTaskDescription\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Description of the batch load task.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.timestreamwrite#DescribeDatabase\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.timestreamwrite#DescribeDatabaseRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.timestreamwrite#DescribeDatabaseResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#AccessDeniedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#InternalServerException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#InvalidEndpointException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#ThrottlingException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#clientDiscoveredEndpoint\": {\n                    \"required\": true\n                },\n                \"smithy.api#documentation\": \"<p>Returns information about the database, including the database name, time that the\\n         database was created, and the total number of tables found within the database. <a href=\\\"https://docs.aws.amazon.com/timestream/latest/developerguide/ts-limits.html\\\">Service\\n            quotas apply</a>. See <a href=\\\"https://docs.aws.amazon.com/timestream/latest/developerguide/code-samples.describe-db.html\\\">code sample</a>\\n         for details.</p>\"\n            }\n        },\n        \"com.amazonaws.timestreamwrite#DescribeDatabaseRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DatabaseName\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#ResourceName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the Timestream database.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.timestreamwrite#DescribeDatabaseResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Database\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#Database\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the Timestream table.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.timestreamwrite#DescribeEndpoints\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.timestreamwrite#DescribeEndpointsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.timestreamwrite#DescribeEndpointsResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#InternalServerException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#ThrottlingException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Returns a list of available endpoints to make Timestream API calls against.\\n         This API operation is available through both the Write and Query APIs.</p>\\n         <p>Because the Timestream SDKs are designed to transparently work with the\\n         service’s architecture, including the management and mapping of the service endpoints,\\n            <i>we don't recommend that you use this API operation unless</i>:</p>\\n         <ul>\\n            <li>\\n               <p>You are using <a href=\\\"https://docs.aws.amazon.com/timestream/latest/developerguide/VPCEndpoints\\\">VPC endpoints (Amazon Web Services PrivateLink) with Timestream</a>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Your application uses a programming language that does not yet have SDK\\n               support</p>\\n            </li>\\n            <li>\\n               <p>You require better control over the client-side implementation</p>\\n            </li>\\n         </ul>\\n         <p>For detailed information on how and when to use and implement DescribeEndpoints, see\\n            <a href=\\\"https://docs.aws.amazon.com/timestream/latest/developerguide/Using.API.html#Using-API.endpoint-discovery\\\">The\\n            Endpoint Discovery Pattern</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.timestreamwrite#DescribeEndpointsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {},\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.timestreamwrite#DescribeEndpointsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Endpoints\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#Endpoints\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An <code>Endpoints</code> object is returned when a <code>DescribeEndpoints</code>\\n         request is made.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.timestreamwrite#DescribeTable\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.timestreamwrite#DescribeTableRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.timestreamwrite#DescribeTableResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#AccessDeniedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#InternalServerException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#InvalidEndpointException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#ThrottlingException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#clientDiscoveredEndpoint\": {\n                    \"required\": true\n                },\n                \"smithy.api#documentation\": \"<p>Returns information about the table, including the table name, database name, retention\\n         duration of the memory store and the magnetic store. <a href=\\\"https://docs.aws.amazon.com/timestream/latest/developerguide/ts-limits.html\\\">Service quotas apply</a>. See\\n            <a href=\\\"https://docs.aws.amazon.com/timestream/latest/developerguide/code-samples.describe-table.html\\\">code\\n            sample</a> for details. </p>\"\n            }\n        },\n        \"com.amazonaws.timestreamwrite#DescribeTableRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DatabaseName\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#ResourceName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the Timestream database.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TableName\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#ResourceName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the Timestream table.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.timestreamwrite#DescribeTableResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Table\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#Table\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Timestream table.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.timestreamwrite#Dimension\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Name\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#SchemaName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> Dimension represents the metadata attributes of the time series. For example, the name\\n         and Availability Zone of an EC2 instance or the name of the manufacturer of a wind turbine\\n         are dimensions. </p>\\n         <p>For constraints on dimension names, see <a href=\\\"https://docs.aws.amazon.com/timestream/latest/developerguide/ts-limits.html#limits.naming\\\">Naming\\n            Constraints</a>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Value\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#SchemaValue\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The value of the dimension.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DimensionValueType\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#DimensionValueType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The data type of the dimension for the time-series data point.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents the metadata attributes of the time series. For example, the name and\\n         Availability Zone of an EC2 instance or the name of the manufacturer of a wind turbine are\\n         dimensions. </p>\"\n            }\n        },\n        \"com.amazonaws.timestreamwrite#DimensionMapping\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SourceColumn\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#SchemaName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                },\n                \"DestinationColumn\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#SchemaName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>\\n      </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p></p>\"\n            }\n        },\n        \"com.amazonaws.timestreamwrite#DimensionMappings\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.timestreamwrite#DimensionMapping\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1\n                }\n            }\n        },\n        \"com.amazonaws.timestreamwrite#DimensionValueType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"VARCHAR\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"VARCHAR\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.timestreamwrite#Dimensions\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.timestreamwrite#Dimension\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 128\n                }\n            }\n        },\n        \"com.amazonaws.timestreamwrite#Endpoint\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Address\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An endpoint address.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"CachePeriodInMinutes\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#Long\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The TTL for the endpoint, in minutes.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents an available endpoint against which to make API calls against, as well as the\\n         TTL for that endpoint.</p>\"\n            }\n        },\n        \"com.amazonaws.timestreamwrite#Endpoints\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.timestreamwrite#Endpoint\"\n            }\n        },\n        \"com.amazonaws.timestreamwrite#ErrorMessage\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.timestreamwrite#Integer\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#default\": 0\n            }\n        },\n        \"com.amazonaws.timestreamwrite#InternalServerException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Message\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>\\n         Timestream was unable to fully process this request because of an internal server\\n         error.</p>\",\n                \"smithy.api#error\": \"server\",\n                \"smithy.api#httpError\": 500\n            }\n        },\n        \"com.amazonaws.timestreamwrite#InvalidEndpointException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Message\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The requested endpoint was not valid.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 421\n            }\n        },\n        \"com.amazonaws.timestreamwrite#ListBatchLoadTasks\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.timestreamwrite#ListBatchLoadTasksRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.timestreamwrite#ListBatchLoadTasksResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#AccessDeniedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#InternalServerException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#InvalidEndpointException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#ThrottlingException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#clientDiscoveredEndpoint\": {\n                    \"required\": true\n                },\n                \"smithy.api#documentation\": \"<p>Provides a list of batch load tasks, along with the name, status, when the task is\\n         resumable until, and other details. See <a href=\\\"https://docs.aws.amazon.com/timestream/latest/developerguide/code-samples.list-batch-load-tasks.html\\\">code\\n            sample</a> for details.</p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.timestreamwrite#ListBatchLoadTasksRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A token to specify where to start paginating. This is the NextToken from a previously\\n         truncated response.</p>\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#PageLimit\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The total number of items to return in the output. If the total number of items\\n         available is more than the value specified, a NextToken is provided in the output. To\\n         resume pagination, provide the NextToken value as argument of a subsequent API\\n         invocation.</p>\"\n                    }\n                },\n                \"TaskStatus\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#BatchLoadStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Status of the batch load task.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.timestreamwrite#ListBatchLoadTasksResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A token to specify where to start paginating. Provide the next\\n         ListBatchLoadTasksRequest.</p>\"\n                    }\n                },\n                \"BatchLoadTasks\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#BatchLoadTaskList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of batch load task details.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.timestreamwrite#ListDatabases\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.timestreamwrite#ListDatabasesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.timestreamwrite#ListDatabasesResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#AccessDeniedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#InternalServerException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#InvalidEndpointException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#ThrottlingException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#clientDiscoveredEndpoint\": {\n                    \"required\": true\n                },\n                \"smithy.api#documentation\": \"<p>Returns a list of your Timestream databases. <a href=\\\"https://docs.aws.amazon.com/timestream/latest/developerguide/ts-limits.html\\\">Service quotas apply</a>. See\\n            <a href=\\\"https://docs.aws.amazon.com/timestream/latest/developerguide/code-samples.list-db.html\\\">code sample</a> for\\n         details. </p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.timestreamwrite#ListDatabasesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The pagination token. To resume pagination, provide the NextToken value as argument of a\\n         subsequent API invocation.</p>\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#PaginationLimit\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The total number of items to return in the output. If the total number of items\\n         available is more than the value specified, a NextToken is provided in the output. To\\n         resume pagination, provide the NextToken value as argument of a subsequent API\\n         invocation.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.timestreamwrite#ListDatabasesResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Databases\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#DatabaseList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of database names.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The pagination token. This parameter is returned when the response is truncated.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.timestreamwrite#ListTables\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.timestreamwrite#ListTablesRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.timestreamwrite#ListTablesResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#AccessDeniedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#InternalServerException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#InvalidEndpointException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#ThrottlingException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#clientDiscoveredEndpoint\": {\n                    \"required\": true\n                },\n                \"smithy.api#documentation\": \"<p>Provides a list of tables, along with the name, status, and retention properties of each\\n         table. See <a href=\\\"https://docs.aws.amazon.com/timestream/latest/developerguide/code-samples.list-table.html\\\">code sample</a>\\n         for details. </p>\",\n                \"smithy.api#paginated\": {\n                    \"inputToken\": \"NextToken\",\n                    \"outputToken\": \"NextToken\",\n                    \"pageSize\": \"MaxResults\"\n                }\n            }\n        },\n        \"com.amazonaws.timestreamwrite#ListTablesRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DatabaseName\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#ResourceName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the Timestream database.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The pagination token. To resume pagination, provide the NextToken value as argument of a\\n         subsequent API invocation.</p>\"\n                    }\n                },\n                \"MaxResults\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#PaginationLimit\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The total number of items to return in the output. If the total number of items\\n         available is more than the value specified, a NextToken is provided in the output. To\\n         resume pagination, provide the NextToken value as argument of a subsequent API\\n         invocation.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.timestreamwrite#ListTablesResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Tables\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#TableList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of tables.</p>\"\n                    }\n                },\n                \"NextToken\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A token to specify where to start paginating. This is the NextToken from a previously\\n         truncated response.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.timestreamwrite#ListTagsForResource\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.timestreamwrite#ListTagsForResourceRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.timestreamwrite#ListTagsForResourceResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#InvalidEndpointException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#ThrottlingException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#clientDiscoveredEndpoint\": {\n                    \"required\": true\n                },\n                \"smithy.api#documentation\": \"<p> Lists all tags on a Timestream resource. </p>\"\n            }\n        },\n        \"com.amazonaws.timestreamwrite#ListTagsForResourceRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ResourceARN\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#AmazonResourceName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The Timestream resource with tags to be listed. This value is an Amazon\\n         Resource Name (ARN). </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.timestreamwrite#ListTagsForResourceResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#TagList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The tags currently associated with the Timestream resource. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.timestreamwrite#Long\": {\n            \"type\": \"long\",\n            \"traits\": {\n                \"smithy.api#default\": 0\n            }\n        },\n        \"com.amazonaws.timestreamwrite#MagneticStoreRejectedDataLocation\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"S3Configuration\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#S3Configuration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Configuration of an S3 location to write error reports for records rejected,\\n         asynchronously, during magnetic store writes.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The location to write error reports for records rejected, asynchronously, during\\n         magnetic store writes.</p>\"\n            }\n        },\n        \"com.amazonaws.timestreamwrite#MagneticStoreRetentionPeriodInDays\": {\n            \"type\": \"long\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 73000\n                }\n            }\n        },\n        \"com.amazonaws.timestreamwrite#MagneticStoreWriteProperties\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"EnableMagneticStoreWrites\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A flag to enable magnetic store writes.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"MagneticStoreRejectedDataLocation\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#MagneticStoreRejectedDataLocation\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The location to write error reports for records rejected asynchronously during magnetic\\n         store writes.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The set of properties on a table for configuring magnetic store writes.</p>\"\n            }\n        },\n        \"com.amazonaws.timestreamwrite#MeasureValue\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Name\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#SchemaName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The name of the MeasureValue. </p>\\n         <p> For constraints on MeasureValue names, see <a href=\\\"https://docs.aws.amazon.com/timestream/latest/developerguide/ts-limits.html#limits.naming\\\"> Naming Constraints</a> in the Amazon Timestream Developer Guide.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Value\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#StringValue2048\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The value for the MeasureValue. For information, see <a href=\\\"https://docs.aws.amazon.com/timestream/latest/developerguide/writes.html#writes.data-types\\\">Data\\n         types</a>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Type\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#MeasureValueType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Contains the data type of the MeasureValue for the time-series data point.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p> Represents the data attribute of the time series. For example, the CPU utilization of\\n         an EC2 instance or the RPM of a wind turbine are measures. MeasureValue has both name and\\n         value. </p>\\n         <p> MeasureValue is only allowed for type <code>MULTI</code>. Using <code>MULTI</code>\\n         type, you can pass multiple data attributes associated with the same time series in a\\n         single record </p>\"\n            }\n        },\n        \"com.amazonaws.timestreamwrite#MeasureValueType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"DOUBLE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DOUBLE\"\n                    }\n                },\n                \"BIGINT\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"BIGINT\"\n                    }\n                },\n                \"VARCHAR\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"VARCHAR\"\n                    }\n                },\n                \"BOOLEAN\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"BOOLEAN\"\n                    }\n                },\n                \"TIMESTAMP\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"TIMESTAMP\"\n                    }\n                },\n                \"MULTI\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"MULTI\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.timestreamwrite#MeasureValues\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.timestreamwrite#MeasureValue\"\n            }\n        },\n        \"com.amazonaws.timestreamwrite#MemoryStoreRetentionPeriodInHours\": {\n            \"type\": \"long\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 8766\n                }\n            }\n        },\n        \"com.amazonaws.timestreamwrite#MixedMeasureMapping\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"MeasureName\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#SchemaName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                },\n                \"SourceColumn\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#SchemaName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                },\n                \"TargetMeasureName\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#SchemaName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                },\n                \"MeasureValueType\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#MeasureValueType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"MultiMeasureAttributeMappings\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#MultiMeasureAttributeMappingList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p></p>\"\n            }\n        },\n        \"com.amazonaws.timestreamwrite#MixedMeasureMappingList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.timestreamwrite#MixedMeasureMapping\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1\n                }\n            }\n        },\n        \"com.amazonaws.timestreamwrite#MultiMeasureAttributeMapping\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SourceColumn\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#SchemaName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TargetMultiMeasureAttributeName\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#SchemaName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                },\n                \"MeasureValueType\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#ScalarMeasureValueType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p></p>\"\n            }\n        },\n        \"com.amazonaws.timestreamwrite#MultiMeasureAttributeMappingList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.timestreamwrite#MultiMeasureAttributeMapping\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1\n                }\n            }\n        },\n        \"com.amazonaws.timestreamwrite#MultiMeasureMappings\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TargetMultiMeasureName\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#SchemaName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                },\n                \"MultiMeasureAttributeMappings\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#MultiMeasureAttributeMappingList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p></p>\"\n            }\n        },\n        \"com.amazonaws.timestreamwrite#PageLimit\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 100\n                }\n            }\n        },\n        \"com.amazonaws.timestreamwrite#PaginationLimit\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 1,\n                    \"max\": 20\n                }\n            }\n        },\n        \"com.amazonaws.timestreamwrite#PartitionKey\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Type\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#PartitionKeyType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The type of the partition key. Options are DIMENSION (dimension key) and MEASURE\\n         (measure key). </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Name\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#SchemaName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The name of the attribute used for a dimension key. </p>\"\n                    }\n                },\n                \"EnforcementInRecord\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#PartitionKeyEnforcementLevel\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The level of enforcement for the specification of a dimension key in ingested records.\\n         Options are REQUIRED (dimension key must be specified) and OPTIONAL (dimension key does not\\n         have to be specified). </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p> An attribute used in partitioning data in a table. A dimension key partitions data\\n         using the values of the dimension specified by the dimension-name as partition key, while a\\n         measure key partitions data using measure names (values of the 'measure_name' column).\\n      </p>\"\n            }\n        },\n        \"com.amazonaws.timestreamwrite#PartitionKeyEnforcementLevel\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"REQUIRED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"REQUIRED\"\n                    }\n                },\n                \"OPTIONAL\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"OPTIONAL\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.timestreamwrite#PartitionKeyList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.timestreamwrite#PartitionKey\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1\n                }\n            }\n        },\n        \"com.amazonaws.timestreamwrite#PartitionKeyType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"DIMENSION\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DIMENSION\"\n                    }\n                },\n                \"MEASURE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"MEASURE\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.timestreamwrite#Record\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Dimensions\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#Dimensions\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Contains the list of dimensions for time-series data points.</p>\"\n                    }\n                },\n                \"MeasureName\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#SchemaName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Measure represents the data attribute of the time series. For example, the CPU\\n         utilization of an EC2 instance or the RPM of a wind turbine are measures. </p>\"\n                    }\n                },\n                \"MeasureValue\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#StringValue2048\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> Contains the measure value for the time-series data point. </p>\"\n                    }\n                },\n                \"MeasureValueType\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#MeasureValueType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> Contains the data type of the measure value for the time-series data point. Default\\n         type is <code>DOUBLE</code>. For more information, see <a href=\\\"https://docs.aws.amazon.com/timestream/latest/developerguide/writes.html#writes.data-types\\\">Data\\n         types</a>.</p>\"\n                    }\n                },\n                \"Time\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#StringValue256\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> Contains the time at which the measure value for the data point was collected. The time\\n         value plus the unit provides the time elapsed since the epoch. For example, if the time\\n         value is <code>12345</code> and the unit is <code>ms</code>, then <code>12345 ms</code>\\n         have elapsed since the epoch. </p>\"\n                    }\n                },\n                \"TimeUnit\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#TimeUnit\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The granularity of the timestamp unit. It indicates if the time value is in seconds,\\n         milliseconds, nanoseconds, or other supported values. Default is <code>MILLISECONDS</code>.\\n      </p>\"\n                    }\n                },\n                \"Version\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#RecordVersion\",\n                    \"traits\": {\n                        \"smithy.api#default\": null,\n                        \"smithy.api#documentation\": \"<p>64-bit attribute used for record updates. Write requests for duplicate data with a\\n         higher version number will update the existing measure value and version. In cases where\\n         the measure value is the same, <code>Version</code> will still be updated. Default value is\\n            <code>1</code>.</p>\\n         <note>\\n            <p>\\n               <code>Version</code> must be <code>1</code> or greater, or you will receive a\\n               <code>ValidationException</code> error.</p>\\n         </note>\"\n                    }\n                },\n                \"MeasureValues\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#MeasureValues\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> Contains the list of MeasureValue for time-series data points. </p>\\n         <p> This is only allowed for type <code>MULTI</code>. For scalar values, use\\n            <code>MeasureValue</code> attribute of the record directly. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents a time-series data point being written into Timestream. Each record\\n         contains an array of dimensions. Dimensions represent the metadata attributes of a\\n         time-series data point, such as the instance name or Availability Zone of an EC2 instance.\\n         A record also contains the measure name, which is the name of the measure being collected\\n         (for example, the CPU utilization of an EC2 instance). Additionally, a record contains the\\n         measure value and the value type, which is the data type of the measure value. Also, the\\n         record contains the timestamp of when the measure was collected and the timestamp unit,\\n         which represents the granularity of the timestamp. </p>\\n         <p> Records have a <code>Version</code> field, which is a 64-bit <code>long</code> that you\\n         can use for updating data points. Writes of a duplicate record with the same dimension,\\n         timestamp, and measure name but different measure value will only succeed if the\\n            <code>Version</code> attribute of the record in the write request is higher than that of\\n         the existing record. Timestream defaults to a <code>Version</code> of\\n            <code>1</code> for records without the <code>Version</code> field. </p>\"\n            }\n        },\n        \"com.amazonaws.timestreamwrite#RecordIndex\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#default\": 0\n            }\n        },\n        \"com.amazonaws.timestreamwrite#RecordVersion\": {\n            \"type\": \"long\",\n            \"traits\": {\n                \"smithy.api#default\": 0\n            }\n        },\n        \"com.amazonaws.timestreamwrite#Records\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.timestreamwrite#Record\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 100\n                }\n            }\n        },\n        \"com.amazonaws.timestreamwrite#RecordsIngested\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Total\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#Integer\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>Total count of successfully ingested records.</p>\"\n                    }\n                },\n                \"MemoryStore\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#Integer\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>Count of records ingested into the memory store.</p>\"\n                    }\n                },\n                \"MagneticStore\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#Integer\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>Count of records ingested into the magnetic store.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Information on the records ingested by this request.</p>\"\n            }\n        },\n        \"com.amazonaws.timestreamwrite#RejectedRecord\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RecordIndex\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#RecordIndex\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p> The index of the record in the input request for WriteRecords. Indexes begin with 0.\\n      </p>\"\n                    }\n                },\n                \"Reason\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The reason why a record was not successfully inserted into Timestream.\\n         Possible causes of failure include: </p>\\n         <ul>\\n            <li>\\n               <p>Records with duplicate data where there are multiple records with the same\\n               dimensions, timestamps, and measure names but: </p>\\n               <ul>\\n                  <li>\\n                     <p>Measure values are different</p>\\n                  </li>\\n                  <li>\\n                     <p>Version is not present in the request, <i>or</i> the value of\\n                     version in the new record is equal to or lower than the existing value</p>\\n                  </li>\\n               </ul>\\n               <p>If Timestream rejects data for this case, the\\n                  <code>ExistingVersion</code> field in the <code>RejectedRecords</code> response\\n               will indicate the current record’s version. To force an update, you can resend the\\n               request with a version for the record set to a value greater than the\\n                  <code>ExistingVersion</code>.</p>\\n            </li>\\n            <li>\\n               <p> Records with timestamps that lie outside the retention duration of the memory\\n               store. </p>\\n               <note>\\n                  <p>When the retention window is updated, you will receive a\\n                     <code>RejectedRecords</code> exception if you immediately try to ingest data\\n                  within the new window. To avoid a <code>RejectedRecords</code> exception, wait\\n                  until the duration of the new window to ingest new data. For further information,\\n                  see <a href=\\\"https://docs.aws.amazon.com/timestream/latest/developerguide/best-practices.html#configuration\\\"> Best\\n                     Practices for Configuring Timestream</a> and <a href=\\\"https://docs.aws.amazon.com/timestream/latest/developerguide/storage.html\\\">the\\n                     explanation of how storage works in Timestream</a>.</p>\\n               </note>\\n            </li>\\n            <li>\\n               <p> Records with dimensions or measures that exceed the Timestream defined\\n               limits. </p>\\n            </li>\\n         </ul>\\n         <p> For more information, see <a href=\\\"https://docs.aws.amazon.com/timestream/latest/developerguide/ts-limits.html\\\">Access Management</a> in the\\n            Timestream Developer Guide. </p>\"\n                    }\n                },\n                \"ExistingVersion\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#RecordVersion\",\n                    \"traits\": {\n                        \"smithy.api#default\": null,\n                        \"smithy.api#documentation\": \"<p>The existing version of the record. This value is populated in scenarios where an\\n         identical record exists with a higher version than the version in the write request.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p> Represents records that were not successfully inserted into Timestream due to\\n         data validation issues that must be resolved before reinserting time-series data into the\\n         system. </p>\"\n            }\n        },\n        \"com.amazonaws.timestreamwrite#RejectedRecords\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.timestreamwrite#RejectedRecord\"\n            }\n        },\n        \"com.amazonaws.timestreamwrite#RejectedRecordsException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Message\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#ErrorMessage\"\n                },\n                \"RejectedRecords\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#RejectedRecords\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>\\n      </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p> WriteRecords would throw this exception in the following cases: </p>\\n         <ul>\\n            <li>\\n               <p>Records with duplicate data where there are multiple records with the same\\n               dimensions, timestamps, and measure names but: </p>\\n               <ul>\\n                  <li>\\n                     <p>Measure values are different</p>\\n                  </li>\\n                  <li>\\n                     <p>Version is not present in the request <i>or</i> the value of\\n                     version in the new record is equal to or lower than the existing value</p>\\n                  </li>\\n               </ul>\\n               <p> In this case, if Timestream rejects data, the\\n                  <code>ExistingVersion</code> field in the <code>RejectedRecords</code> response\\n               will indicate the current record’s version. To force an update, you can resend the\\n               request with a version for the record set to a value greater than the\\n                  <code>ExistingVersion</code>.</p>\\n            </li>\\n            <li>\\n               <p> Records with timestamps that lie outside the retention duration of the memory\\n               store. </p>\\n            </li>\\n            <li>\\n               <p> Records with dimensions or measures that exceed the Timestream defined\\n               limits. </p>\\n            </li>\\n         </ul>\\n         <p> For more information, see <a href=\\\"https://docs.aws.amazon.com/timestream/latest/developerguide/ts-limits.html\\\">Quotas</a> in the Amazon Timestream Developer Guide. </p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 419\n            }\n        },\n        \"com.amazonaws.timestreamwrite#ReportConfiguration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ReportS3Configuration\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#ReportS3Configuration\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Configuration of an S3 location to write error reports and events for a batch\\n         load.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Report configuration for a batch load task. This contains details about where error\\n         reports are stored.</p>\"\n            }\n        },\n        \"com.amazonaws.timestreamwrite#ReportS3Configuration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"BucketName\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#S3BucketName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ObjectKeyPrefix\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#S3ObjectKeyPrefix\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                },\n                \"EncryptionOption\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#S3EncryptionOption\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                },\n                \"KmsKeyId\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#StringValue2048\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p></p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p></p>\"\n            }\n        },\n        \"com.amazonaws.timestreamwrite#ResourceCreateAPIName\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#pattern\": \"^[a-zA-Z0-9_.-]+$\"\n            }\n        },\n        \"com.amazonaws.timestreamwrite#ResourceName\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.timestreamwrite#ResourceNotFoundException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Message\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The operation tried to access a nonexistent resource. The resource might not be\\n         specified correctly, or its status might not be ACTIVE.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 404\n            }\n        },\n        \"com.amazonaws.timestreamwrite#ResumeBatchLoadTask\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.timestreamwrite#ResumeBatchLoadTaskRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.timestreamwrite#ResumeBatchLoadTaskResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#AccessDeniedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#InternalServerException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#InvalidEndpointException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#ThrottlingException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#clientDiscoveredEndpoint\": {\n                    \"required\": true\n                },\n                \"smithy.api#documentation\": \"<p>\\n      </p>\"\n            }\n        },\n        \"com.amazonaws.timestreamwrite#ResumeBatchLoadTaskRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TaskId\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#BatchLoadTaskId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the batch load task to resume.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.timestreamwrite#ResumeBatchLoadTaskResponse\": {\n            \"type\": \"structure\",\n            \"members\": {},\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.timestreamwrite#RetentionProperties\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"MemoryStoreRetentionPeriodInHours\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#MemoryStoreRetentionPeriodInHours\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The duration for which data must be stored in the memory store. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"MagneticStoreRetentionPeriodInDays\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#MagneticStoreRetentionPeriodInDays\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The duration for which data must be stored in the magnetic store. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Retention properties contain the duration for which your time-series data must be stored\\n         in the magnetic store and the memory store. </p>\"\n            }\n        },\n        \"com.amazonaws.timestreamwrite#S3BucketName\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 3,\n                    \"max\": 63\n                },\n                \"smithy.api#pattern\": \"^[a-z0-9][\\\\.\\\\-a-z0-9]{1,61}[a-z0-9]$\"\n            }\n        },\n        \"com.amazonaws.timestreamwrite#S3Configuration\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"BucketName\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#S3BucketName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The bucket name of the customer S3 bucket.</p>\"\n                    }\n                },\n                \"ObjectKeyPrefix\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#S3ObjectKeyPrefix\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The object key preview for the customer S3 location.</p>\"\n                    }\n                },\n                \"EncryptionOption\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#S3EncryptionOption\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The encryption option for the customer S3 location. Options are S3 server-side\\n         encryption with an S3 managed key or Amazon Web Services managed key.</p>\"\n                    }\n                },\n                \"KmsKeyId\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#StringValue2048\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The KMS key ID for the customer S3 location when encrypting with an\\n            Amazon Web Services managed key.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The configuration that specifies an S3 location.</p>\"\n            }\n        },\n        \"com.amazonaws.timestreamwrite#S3EncryptionOption\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"SSE_S3\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"SSE_S3\"\n                    }\n                },\n                \"SSE_KMS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"SSE_KMS\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.timestreamwrite#S3ObjectKey\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 1024\n                },\n                \"smithy.api#pattern\": \"^[a-zA-Z0-9|!\\\\-_*'\\\\(\\\\)]([a-zA-Z0-9]|[!\\\\-_*'\\\\(\\\\)\\\\/.])+$\"\n            }\n        },\n        \"com.amazonaws.timestreamwrite#S3ObjectKeyPrefix\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 928\n                },\n                \"smithy.api#pattern\": \"^[a-zA-Z0-9|!\\\\-_*'\\\\(\\\\)]([a-zA-Z0-9]|[!\\\\-_*'\\\\(\\\\)\\\\/.])+$\"\n            }\n        },\n        \"com.amazonaws.timestreamwrite#ScalarMeasureValueType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"DOUBLE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DOUBLE\"\n                    }\n                },\n                \"BIGINT\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"BIGINT\"\n                    }\n                },\n                \"BOOLEAN\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"BOOLEAN\"\n                    }\n                },\n                \"VARCHAR\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"VARCHAR\"\n                    }\n                },\n                \"TIMESTAMP\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"TIMESTAMP\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.timestreamwrite#Schema\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CompositePartitionKey\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#PartitionKeyList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A non-empty list of partition keys defining the attributes used to partition the table\\n         data. The order of the list determines the partition hierarchy. The name and type of each\\n         partition key as well as the partition key order cannot be changed after the table is\\n         created. However, the enforcement level of each partition key can be changed. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p> A Schema specifies the expected data model of the table. </p>\"\n            }\n        },\n        \"com.amazonaws.timestreamwrite#SchemaName\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1\n                }\n            }\n        },\n        \"com.amazonaws.timestreamwrite#SchemaValue\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.timestreamwrite#ServiceQuotaExceededException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Message\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#ErrorMessage\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p> The instance quota of resource exceeded for this account.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 402\n            }\n        },\n        \"com.amazonaws.timestreamwrite#String\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.timestreamwrite#StringValue1\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 1\n                }\n            }\n        },\n        \"com.amazonaws.timestreamwrite#StringValue2048\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 2048\n                }\n            }\n        },\n        \"com.amazonaws.timestreamwrite#StringValue256\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 256\n                }\n            }\n        },\n        \"com.amazonaws.timestreamwrite#Table\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Arn\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name that uniquely identifies this table.</p>\"\n                    }\n                },\n                \"TableName\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#ResourceName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the Timestream table.</p>\"\n                    }\n                },\n                \"DatabaseName\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#ResourceName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the Timestream database that contains this table.</p>\"\n                    }\n                },\n                \"TableStatus\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#TableStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The current state of the table:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>DELETING</code> - The table is being deleted.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ACTIVE</code> - The table is ready for use.</p>\\n            </li>\\n         </ul>\"\n                    }\n                },\n                \"RetentionProperties\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#RetentionProperties\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The retention duration for the memory store and magnetic store.</p>\"\n                    }\n                },\n                \"CreationTime\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#Date\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time when the Timestream table was created. </p>\"\n                    }\n                },\n                \"LastUpdatedTime\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#Date\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time when the Timestream table was last updated.</p>\"\n                    }\n                },\n                \"MagneticStoreWriteProperties\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#MagneticStoreWriteProperties\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Contains properties to set on the table when enabling magnetic store writes.</p>\"\n                    }\n                },\n                \"Schema\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#Schema\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The schema of the table. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Represents a database table in Timestream. Tables contain one or more related\\n         time series. You can modify the retention duration of the memory store and the magnetic\\n         store for a table. </p>\"\n            }\n        },\n        \"com.amazonaws.timestreamwrite#TableList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.timestreamwrite#Table\"\n            }\n        },\n        \"com.amazonaws.timestreamwrite#TableStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"ACTIVE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ACTIVE\"\n                    }\n                },\n                \"DELETING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DELETING\"\n                    }\n                },\n                \"RESTORING\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"RESTORING\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.timestreamwrite#Tag\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Key\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#TagKey\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The key of the tag. Tag keys are case sensitive. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Value\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#TagValue\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The value of the tag. Tag values are case-sensitive and can be null. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p> A tag is a label that you assign to a Timestream database and/or table. Each\\n         tag consists of a key and an optional value, both of which you define. With tags, you can\\n         categorize databases and/or tables, for example, by purpose, owner, or environment. </p>\"\n            }\n        },\n        \"com.amazonaws.timestreamwrite#TagKey\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 128\n                }\n            }\n        },\n        \"com.amazonaws.timestreamwrite#TagKeyList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.timestreamwrite#TagKey\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 200\n                }\n            }\n        },\n        \"com.amazonaws.timestreamwrite#TagList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.timestreamwrite#Tag\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 200\n                }\n            }\n        },\n        \"com.amazonaws.timestreamwrite#TagResource\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.timestreamwrite#TagResourceRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.timestreamwrite#TagResourceResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#InvalidEndpointException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#ServiceQuotaExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#ThrottlingException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#clientDiscoveredEndpoint\": {\n                    \"required\": true\n                },\n                \"smithy.api#documentation\": \"<p> Associates a set of tags with a Timestream resource. You can then activate\\n         these user-defined tags so that they appear on the Billing and Cost Management console for\\n         cost allocation tracking. </p>\"\n            }\n        },\n        \"com.amazonaws.timestreamwrite#TagResourceRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ResourceARN\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#AmazonResourceName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> Identifies the Timestream resource to which tags should be added. This value\\n         is an Amazon Resource Name (ARN). </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Tags\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#TagList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The tags to be assigned to the Timestream resource. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.timestreamwrite#TagResourceResponse\": {\n            \"type\": \"structure\",\n            \"members\": {},\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.timestreamwrite#TagValue\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 256\n                }\n            }\n        },\n        \"com.amazonaws.timestreamwrite#ThrottlingException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Message\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p> Too many requests were made by a user and they exceeded the service quotas. The request\\n         was throttled.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 429\n            }\n        },\n        \"com.amazonaws.timestreamwrite#TimeUnit\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"MILLISECONDS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"MILLISECONDS\"\n                    }\n                },\n                \"SECONDS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"SECONDS\"\n                    }\n                },\n                \"MICROSECONDS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"MICROSECONDS\"\n                    }\n                },\n                \"NANOSECONDS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"NANOSECONDS\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.timestreamwrite#Timestream_20181101\": {\n            \"type\": \"service\",\n            \"version\": \"2018-11-01\",\n            \"operations\": [\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#CreateBatchLoadTask\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#CreateDatabase\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#CreateTable\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#DeleteDatabase\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#DeleteTable\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#DescribeBatchLoadTask\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#DescribeDatabase\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#DescribeEndpoints\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#DescribeTable\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#ListBatchLoadTasks\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#ListDatabases\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#ListTables\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#ListTagsForResource\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#ResumeBatchLoadTask\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#TagResource\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#UntagResource\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#UpdateDatabase\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#UpdateTable\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#WriteRecords\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#clientEndpointDiscovery\": {\n                    \"operation\": \"com.amazonaws.timestreamwrite#DescribeEndpoints\",\n                    \"error\": \"com.amazonaws.timestreamwrite#InvalidEndpointException\"\n                },\n                \"aws.api#service\": {\n                    \"sdkId\": \"Timestream Write\",\n                    \"arnNamespace\": \"timestream\",\n                    \"cloudFormationName\": \"TimestreamWrite\",\n                    \"cloudTrailEventSource\": \"timestreamwrite.amazonaws.com\",\n                    \"endpointPrefix\": \"ingest.timestream\"\n                },\n                \"aws.auth#sigv4\": {\n                    \"name\": \"timestream\"\n                },\n                \"aws.protocols#awsJson1_0\": {},\n                \"smithy.api#documentation\": \"<fullname>Amazon Timestream Write</fullname>\\n         <p>Amazon Timestream is a fast, scalable, fully managed time-series database service\\n         that makes it easy to store and analyze trillions of time-series data points per day. With\\n            Timestream, you can easily store and analyze IoT sensor data to derive insights\\n         from your IoT applications. You can analyze industrial telemetry to streamline equipment\\n         management and maintenance. You can also store and analyze log data and metrics to improve\\n         the performance and availability of your applications. </p>\\n         <p>Timestream is built from the ground up to effectively ingest, process, and\\n         store time-series data. It organizes data to optimize query processing. It automatically\\n         scales based on the volume of data ingested and on the query volume to ensure you receive\\n         optimal performance while inserting and querying data. As your data grows over time,\\n            Timestream’s adaptive query processing engine spans across storage tiers to\\n         provide fast analysis while reducing costs.</p>\",\n                \"smithy.api#title\": \"Amazon Timestream Write\",\n                \"smithy.rules#endpointRuleSet\": {\n                    \"version\": \"1.0\",\n                    \"parameters\": {\n                        \"Region\": {\n                            \"builtIn\": \"AWS::Region\",\n                            \"required\": false,\n                            \"documentation\": \"The AWS region used to dispatch the request.\",\n                            \"type\": \"String\"\n                        },\n                        \"UseDualStack\": {\n                            \"builtIn\": \"AWS::UseDualStack\",\n                            \"required\": true,\n                            \"default\": false,\n                            \"documentation\": \"When true, use the dual-stack endpoint. If the configured endpoint does not support dual-stack, dispatching the request MAY return an error.\",\n                            \"type\": \"Boolean\"\n                        },\n                        \"UseFIPS\": {\n                            \"builtIn\": \"AWS::UseFIPS\",\n                            \"required\": true,\n                            \"default\": false,\n                            \"documentation\": \"When true, send this request to the FIPS-compliant regional endpoint. If the configured endpoint does not have a FIPS compliant endpoint, dispatching the request will return an error.\",\n                            \"type\": \"Boolean\"\n                        },\n                        \"Endpoint\": {\n                            \"builtIn\": \"SDK::Endpoint\",\n                            \"required\": false,\n                            \"documentation\": \"Override the endpoint used to send this request\",\n                            \"type\": \"String\"\n                        }\n                    },\n                    \"rules\": [\n                        {\n                            \"conditions\": [\n                                {\n                                    \"fn\": \"isSet\",\n                                    \"argv\": [\n                                        {\n                                            \"ref\": \"Endpoint\"\n                                        }\n                                    ]\n                                }\n                            ],\n                            \"rules\": [\n                                {\n                                    \"conditions\": [\n                                        {\n                                            \"fn\": \"booleanEquals\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"UseFIPS\"\n                                                },\n                                                true\n                                            ]\n                                        }\n                                    ],\n                                    \"error\": \"Invalid Configuration: FIPS and custom endpoint are not supported\",\n                                    \"type\": \"error\"\n                                },\n                                {\n                                    \"conditions\": [\n                                        {\n                                            \"fn\": \"booleanEquals\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"UseDualStack\"\n                                                },\n                                                true\n                                            ]\n                                        }\n                                    ],\n                                    \"error\": \"Invalid Configuration: Dualstack and custom endpoint are not supported\",\n                                    \"type\": \"error\"\n                                },\n                                {\n                                    \"conditions\": [],\n                                    \"endpoint\": {\n                                        \"url\": {\n                                            \"ref\": \"Endpoint\"\n                                        },\n                                        \"properties\": {},\n                                        \"headers\": {}\n                                    },\n                                    \"type\": \"endpoint\"\n                                }\n                            ],\n                            \"type\": \"tree\"\n                        },\n                        {\n                            \"conditions\": [\n                                {\n                                    \"fn\": \"isSet\",\n                                    \"argv\": [\n                                        {\n                                            \"ref\": \"Region\"\n                                        }\n                                    ]\n                                }\n                            ],\n                            \"rules\": [\n                                {\n                                    \"conditions\": [\n                                        {\n                                            \"fn\": \"aws.partition\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"Region\"\n                                                }\n                                            ],\n                                            \"assign\": \"PartitionResult\"\n                                        }\n                                    ],\n                                    \"rules\": [\n                                        {\n                                            \"conditions\": [\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseFIPS\"\n                                                        },\n                                                        true\n                                                    ]\n                                                },\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseDualStack\"\n                                                        },\n                                                        true\n                                                    ]\n                                                }\n                                            ],\n                                            \"rules\": [\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                true,\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"PartitionResult\"\n                                                                        },\n                                                                        \"supportsFIPS\"\n                                                                    ]\n                                                                }\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                true,\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"PartitionResult\"\n                                                                        },\n                                                                        \"supportsDualStack\"\n                                                                    ]\n                                                                }\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"rules\": [\n                                                        {\n                                                            \"conditions\": [\n                                                                {\n                                                                    \"fn\": \"stringEquals\",\n                                                                    \"argv\": [\n                                                                        \"aws\",\n                                                                        {\n                                                                            \"fn\": \"getAttr\",\n                                                                            \"argv\": [\n                                                                                {\n                                                                                    \"ref\": \"PartitionResult\"\n                                                                                },\n                                                                                \"name\"\n                                                                            ]\n                                                                        }\n                                                                    ]\n                                                                }\n                                                            ],\n                                                            \"endpoint\": {\n                                                                \"url\": \"https://timestream-ingest-fips.{Region}.api.aws\",\n                                                                \"properties\": {},\n                                                                \"headers\": {}\n                                                            },\n                                                            \"type\": \"endpoint\"\n                                                        },\n                                                        {\n                                                            \"conditions\": [\n                                                                {\n                                                                    \"fn\": \"stringEquals\",\n                                                                    \"argv\": [\n                                                                        \"aws-us-gov\",\n                                                                        {\n                                                                            \"fn\": \"getAttr\",\n                                                                            \"argv\": [\n                                                                                {\n                                                                                    \"ref\": \"PartitionResult\"\n                                                                                },\n                                                                                \"name\"\n                                                                            ]\n                                                                        }\n                                                                    ]\n                                                                }\n                                                            ],\n                                                            \"endpoint\": {\n                                                                \"url\": \"https://timestream-ingest.{Region}.api.aws\",\n                                                                \"properties\": {},\n                                                                \"headers\": {}\n                                                            },\n                                                            \"type\": \"endpoint\"\n                                                        },\n                                                        {\n                                                            \"conditions\": [],\n                                                            \"endpoint\": {\n                                                                \"url\": \"https://ingest.timestream-fips.{Region}.{PartitionResult#dualStackDnsSuffix}\",\n                                                                \"properties\": {},\n                                                                \"headers\": {}\n                                                            },\n                                                            \"type\": \"endpoint\"\n                                                        }\n                                                    ],\n                                                    \"type\": \"tree\"\n                                                },\n                                                {\n                                                    \"conditions\": [],\n                                                    \"error\": \"FIPS and DualStack are enabled, but this partition does not support one or both\",\n                                                    \"type\": \"error\"\n                                                }\n                                            ],\n                                            \"type\": \"tree\"\n                                        },\n                                        {\n                                            \"conditions\": [\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseFIPS\"\n                                                        },\n                                                        true\n                                                    ]\n                                                }\n                                            ],\n                                            \"rules\": [\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"PartitionResult\"\n                                                                        },\n                                                                        \"supportsFIPS\"\n                                                                    ]\n                                                                },\n                                                                true\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"rules\": [\n                                                        {\n                                                            \"conditions\": [\n                                                                {\n                                                                    \"fn\": \"stringEquals\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"fn\": \"getAttr\",\n                                                                            \"argv\": [\n                                                                                {\n                                                                                    \"ref\": \"PartitionResult\"\n                                                                                },\n                                                                                \"name\"\n                                                                            ]\n                                                                        },\n                                                                        \"aws-us-gov\"\n                                                                    ]\n                                                                }\n                                                            ],\n                                                            \"endpoint\": {\n                                                                \"url\": \"https://ingest.timestream.{Region}.amazonaws.com\",\n                                                                \"properties\": {},\n                                                                \"headers\": {}\n                                                            },\n                                                            \"type\": \"endpoint\"\n                                                        },\n                                                        {\n                                                            \"conditions\": [],\n                                                            \"endpoint\": {\n                                                                \"url\": \"https://ingest.timestream-fips.{Region}.{PartitionResult#dnsSuffix}\",\n                                                                \"properties\": {},\n                                                                \"headers\": {}\n                                                            },\n                                                            \"type\": \"endpoint\"\n                                                        }\n                                                    ],\n                                                    \"type\": \"tree\"\n                                                },\n                                                {\n                                                    \"conditions\": [],\n                                                    \"error\": \"FIPS is enabled but this partition does not support FIPS\",\n                                                    \"type\": \"error\"\n                                                }\n                                            ],\n                                            \"type\": \"tree\"\n                                        },\n                                        {\n                                            \"conditions\": [\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseDualStack\"\n                                                        },\n                                                        true\n                                                    ]\n                                                }\n                                            ],\n                                            \"rules\": [\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                true,\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"PartitionResult\"\n                                                                        },\n                                                                        \"supportsDualStack\"\n                                                                    ]\n                                                                }\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"rules\": [\n                                                        {\n                                                            \"conditions\": [\n                                                                {\n                                                                    \"fn\": \"stringEquals\",\n                                                                    \"argv\": [\n                                                                        \"aws\",\n                                                                        {\n                                                                            \"fn\": \"getAttr\",\n                                                                            \"argv\": [\n                                                                                {\n                                                                                    \"ref\": \"PartitionResult\"\n                                                                                },\n                                                                                \"name\"\n                                                                            ]\n                                                                        }\n                                                                    ]\n                                                                }\n                                                            ],\n                                                            \"endpoint\": {\n                                                                \"url\": \"https://timestream-ingest.{Region}.api.aws\",\n                                                                \"properties\": {},\n                                                                \"headers\": {}\n                                                            },\n                                                            \"type\": \"endpoint\"\n                                                        },\n                                                        {\n                                                            \"conditions\": [\n                                                                {\n                                                                    \"fn\": \"stringEquals\",\n                                                                    \"argv\": [\n                                                                        \"aws-us-gov\",\n                                                                        {\n                                                                            \"fn\": \"getAttr\",\n                                                                            \"argv\": [\n                                                                                {\n                                                                                    \"ref\": \"PartitionResult\"\n                                                                                },\n                                                                                \"name\"\n                                                                            ]\n                                                                        }\n                                                                    ]\n                                                                }\n                                                            ],\n                                                            \"endpoint\": {\n                                                                \"url\": \"https://timestream-ingest.{Region}.api.aws\",\n                                                                \"properties\": {},\n                                                                \"headers\": {}\n                                                            },\n                                                            \"type\": \"endpoint\"\n                                                        },\n                                                        {\n                                                            \"conditions\": [],\n                                                            \"endpoint\": {\n                                                                \"url\": \"https://ingest.timestream.{Region}.{PartitionResult#dualStackDnsSuffix}\",\n                                                                \"properties\": {},\n                                                                \"headers\": {}\n                                                            },\n                                                            \"type\": \"endpoint\"\n                                                        }\n                                                    ],\n                                                    \"type\": \"tree\"\n                                                },\n                                                {\n                                                    \"conditions\": [],\n                                                    \"error\": \"DualStack is enabled but this partition does not support DualStack\",\n                                                    \"type\": \"error\"\n                                                }\n                                            ],\n                                            \"type\": \"tree\"\n                                        },\n                                        {\n                                            \"conditions\": [],\n                                            \"endpoint\": {\n                                                \"url\": \"https://ingest.timestream.{Region}.{PartitionResult#dnsSuffix}\",\n                                                \"properties\": {},\n                                                \"headers\": {}\n                                            },\n                                            \"type\": \"endpoint\"\n                                        }\n                                    ],\n                                    \"type\": \"tree\"\n                                }\n                            ],\n                            \"type\": \"tree\"\n                        },\n                        {\n                            \"conditions\": [],\n                            \"error\": \"Invalid Configuration: Missing Region\",\n                            \"type\": \"error\"\n                        }\n                    ]\n                },\n                \"smithy.rules#endpointTests\": {\n                    \"testCases\": [\n                        {\n                            \"documentation\": \"For region ap-northeast-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ingest.timestream.ap-northeast-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-northeast-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-northeast-1 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://timestream-ingest.ap-northeast-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-northeast-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-south-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ingest.timestream.ap-south-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-south-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-south-1 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://timestream-ingest.ap-south-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-south-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-southeast-2 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ingest.timestream.ap-southeast-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-southeast-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-southeast-2 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://timestream-ingest.ap-southeast-2.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-southeast-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-central-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ingest.timestream.eu-central-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-central-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-central-1 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://timestream-ingest.eu-central-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-central-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-west-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ingest.timestream.eu-west-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-west-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-west-1 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://timestream-ingest.eu-west-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-west-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ingest.timestream.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-1 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://timestream-ingest.us-east-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-1 with FIPS enabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://timestream-ingest-fips.us-east-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-2 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ingest.timestream.us-east-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-2 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://timestream-ingest.us-east-2.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-2 with FIPS enabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://timestream-ingest-fips.us-east-2.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-2\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-west-2 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ingest.timestream.us-west-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-west-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-west-2 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://timestream-ingest.us-west-2.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-west-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-west-2 with FIPS enabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://timestream-ingest-fips.us-west-2.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-west-2\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ingest.timestream-fips.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-north-1 with FIPS enabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ingest.timestream-fips.cn-north-1.api.amazonwebservices.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-north-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-north-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ingest.timestream-fips.cn-north-1.amazonaws.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-north-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-north-1 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ingest.timestream.cn-north-1.api.amazonwebservices.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-north-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-north-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ingest.timestream.cn-north-1.amazonaws.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-north-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-west-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ingest.timestream.us-gov-west-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-west-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-west-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ingest.timestream.us-gov-west-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-west-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-west-1 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://timestream-ingest.us-gov-west-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-west-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-west-1 with FIPS enabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://timestream-ingest.us-gov-west-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-west-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-east-1 with FIPS enabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://timestream-ingest.us-gov-east-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-east-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ingest.timestream.us-gov-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-east-1 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://timestream-ingest.us-gov-east-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ingest.timestream.us-gov-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-iso-east-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ingest.timestream-fips.us-iso-east-1.c2s.ic.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-iso-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-iso-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ingest.timestream.us-iso-east-1.c2s.ic.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-iso-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-isob-east-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ingest.timestream-fips.us-isob-east-1.sc2s.sgov.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-isob-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-isob-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://ingest.timestream.us-isob-east-1.sc2s.sgov.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-isob-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For custom endpoint with region set and fips disabled and dualstack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://example.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"For custom endpoint with region not set and fips disabled and dualstack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://example.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"For custom endpoint with fips enabled and dualstack disabled\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: FIPS and custom endpoint are not supported\"\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false,\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"For custom endpoint with fips disabled and dualstack enabled\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: Dualstack and custom endpoint are not supported\"\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true,\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"Missing region\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: Missing Region\"\n                            }\n                        }\n                    ],\n                    \"version\": \"1.0\"\n                }\n            }\n        },\n        \"com.amazonaws.timestreamwrite#UntagResource\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.timestreamwrite#UntagResourceRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.timestreamwrite#UntagResourceResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#InvalidEndpointException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#ServiceQuotaExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#ThrottlingException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#clientDiscoveredEndpoint\": {\n                    \"required\": true\n                },\n                \"smithy.api#documentation\": \"<p> Removes the association of tags from a Timestream resource. </p>\"\n            }\n        },\n        \"com.amazonaws.timestreamwrite#UntagResourceRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ResourceARN\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#AmazonResourceName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The Timestream resource that the tags will be removed from. This value is an\\n         Amazon Resource Name (ARN). </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TagKeys\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#TagKeyList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> A list of tags keys. Existing tags of the resource whose keys are members of this list\\n         will be removed from the Timestream resource. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.timestreamwrite#UntagResourceResponse\": {\n            \"type\": \"structure\",\n            \"members\": {},\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.timestreamwrite#UpdateDatabase\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.timestreamwrite#UpdateDatabaseRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.timestreamwrite#UpdateDatabaseResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#AccessDeniedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#InternalServerException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#InvalidEndpointException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#ServiceQuotaExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#ThrottlingException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#clientDiscoveredEndpoint\": {\n                    \"required\": true\n                },\n                \"smithy.api#documentation\": \"<p> Modifies the KMS key for an existing database. While updating the\\n         database, you must specify the database name and the identifier of the new KMS key to be used (<code>KmsKeyId</code>). If there are any concurrent\\n            <code>UpdateDatabase</code> requests, first writer wins. </p>\\n         <p>See <a href=\\\"https://docs.aws.amazon.com/timestream/latest/developerguide/code-samples.update-db.html\\\">code sample</a>\\n         for details.</p>\"\n            }\n        },\n        \"com.amazonaws.timestreamwrite#UpdateDatabaseRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DatabaseName\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#ResourceName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The name of the database. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"KmsKeyId\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#StringValue2048\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The identifier of the new KMS key (<code>KmsKeyId</code>) to be used to\\n         encrypt the data stored in the database. If the <code>KmsKeyId</code> currently registered\\n         with the database is the same as the <code>KmsKeyId</code> in the request, there will not\\n         be any update. </p>\\n         <p>You can specify the <code>KmsKeyId</code> using any of the following:</p>\\n         <ul>\\n            <li>\\n               <p>Key ID: <code>1234abcd-12ab-34cd-56ef-1234567890ab</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Key ARN:\\n                  <code>arn:aws:kms:us-east-1:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Alias name: <code>alias/ExampleAlias</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>Alias ARN:\\n               <code>arn:aws:kms:us-east-1:111122223333:alias/ExampleAlias</code>\\n               </p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.timestreamwrite#UpdateDatabaseResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Database\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#Database\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.timestreamwrite#UpdateTable\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.timestreamwrite#UpdateTableRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.timestreamwrite#UpdateTableResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#AccessDeniedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#InternalServerException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#InvalidEndpointException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#ThrottlingException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#clientDiscoveredEndpoint\": {\n                    \"required\": true\n                },\n                \"smithy.api#documentation\": \"<p>Modifies the retention duration of the memory store and magnetic store for your Timestream table. Note that the change in retention duration takes effect immediately.\\n         For example, if the retention period of the memory store was initially set to 2 hours and\\n         then changed to 24 hours, the memory store will be capable of holding 24 hours of data, but\\n         will be populated with 24 hours of data 22 hours after this change was made. Timestream does not retrieve data from the magnetic store to populate the memory store. </p>\\n         <p>See <a href=\\\"https://docs.aws.amazon.com/timestream/latest/developerguide/code-samples.update-table.html\\\">code\\n            sample</a> for details.</p>\"\n            }\n        },\n        \"com.amazonaws.timestreamwrite#UpdateTableRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DatabaseName\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#ResourceName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the Timestream database.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TableName\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#ResourceName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the Timestream table.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"RetentionProperties\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#RetentionProperties\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The retention duration of the memory store and the magnetic store.</p>\"\n                    }\n                },\n                \"MagneticStoreWriteProperties\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#MagneticStoreWriteProperties\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Contains properties to set on the table when enabling magnetic store writes.</p>\"\n                    }\n                },\n                \"Schema\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#Schema\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p> The schema of the table. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.timestreamwrite#UpdateTableResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Table\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#Table\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The updated Timestream table.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.timestreamwrite#ValidationException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Message\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#ErrorMessage\",\n                    \"traits\": {\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p> An invalid or malformed request.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.timestreamwrite#WriteRecords\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.timestreamwrite#WriteRecordsRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.timestreamwrite#WriteRecordsResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#AccessDeniedException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#InternalServerException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#InvalidEndpointException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#RejectedRecordsException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#ResourceNotFoundException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#ThrottlingException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.timestreamwrite#ValidationException\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#clientDiscoveredEndpoint\": {\n                    \"required\": true\n                },\n                \"smithy.api#documentation\": \"<p>Enables you to write your time-series data into Timestream. You can specify a\\n         single data point or a batch of data points to be inserted into the system. Timestream offers you a flexible schema that auto detects the column names and data\\n         types for your Timestream tables based on the dimension names and data types of\\n         the data points you specify when invoking writes into the database. </p>\\n         <p>Timestream supports eventual consistency read semantics. This means that when\\n         you query data immediately after writing a batch of data into Timestream, the\\n         query results might not reflect the results of a recently completed write operation. The\\n         results may also include some stale data. If you repeat the query request after a short\\n         time, the results should return the latest data. <a href=\\\"https://docs.aws.amazon.com/timestream/latest/developerguide/ts-limits.html\\\">Service quotas apply</a>. </p>\\n         <p>See <a href=\\\"https://docs.aws.amazon.com/timestream/latest/developerguide/code-samples.write.html\\\">code sample</a> for\\n         details.</p>\\n         <p>\\n            <b>Upserts</b>\\n         </p>\\n         <p>You can use the <code>Version</code> parameter in a <code>WriteRecords</code> request to\\n         update data points. Timestream tracks a version number with each record.\\n            <code>Version</code> defaults to <code>1</code> when it's not specified for the record\\n         in the request. Timestream updates an existing record’s measure value along with\\n         its <code>Version</code> when it receives a write request with a higher\\n            <code>Version</code> number for that record. When it receives an update request where\\n         the measure value is the same as that of the existing record, Timestream still\\n         updates <code>Version</code>, if it is greater than the existing value of\\n            <code>Version</code>. You can update a data point as many times as desired, as long as\\n         the value of <code>Version</code> continuously increases. </p>\\n         <p> For example, suppose you write a new record without indicating <code>Version</code> in\\n         the request. Timestream stores this record, and set <code>Version</code> to\\n            <code>1</code>. Now, suppose you try to update this record with a\\n            <code>WriteRecords</code> request of the same record with a different measure value but,\\n         like before, do not provide <code>Version</code>. In this case, Timestream will\\n         reject this update with a <code>RejectedRecordsException</code> since the updated record’s\\n         version is not greater than the existing value of Version. </p>\\n         <p>However, if you were to resend the update request with <code>Version</code> set to\\n            <code>2</code>, Timestream would then succeed in updating the record’s value,\\n         and the <code>Version</code> would be set to <code>2</code>. Next, suppose you sent a\\n            <code>WriteRecords</code> request with this same record and an identical measure value,\\n         but with <code>Version</code> set to <code>3</code>. In this case, Timestream\\n         would only update <code>Version</code> to <code>3</code>. Any further updates would need to\\n         send a version number greater than <code>3</code>, or the update requests would receive a\\n            <code>RejectedRecordsException</code>. </p>\"\n            }\n        },\n        \"com.amazonaws.timestreamwrite#WriteRecordsRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"DatabaseName\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#ResourceName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the Timestream database.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"TableName\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#ResourceName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the Timestream table.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"CommonAttributes\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#Record\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A record that contains the common measure, dimension, time, and version attributes\\n         shared across all the records in the request. The measure and dimension attributes\\n         specified will be merged with the measure and dimension attributes in the records object\\n         when the data is written into Timestream. Dimensions may not overlap, or a\\n            <code>ValidationException</code> will be thrown. In other words, a record must contain\\n         dimensions with unique names. </p>\"\n                    }\n                },\n                \"Records\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#Records\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An array of records that contain the unique measure, dimension, time, and version\\n         attributes for each time-series data point. </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.timestreamwrite#WriteRecordsResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RecordsIngested\": {\n                    \"target\": \"com.amazonaws.timestreamwrite#RecordsIngested\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Information on the records ingested by this request.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "aws/sdk/aws-models/transcribe-streaming.json",
    "content": "{\n    \"smithy\": \"2.0\",\n    \"metadata\": {\n        \"suppressions\": [\n            {\n                \"id\": \"HttpMethodSemantics\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"HttpResponseCodeSemantics\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"PaginatedTrait\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"HttpHeaderTrait\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"HttpUriConflict\",\n                \"namespace\": \"*\"\n            },\n            {\n                \"id\": \"Service\",\n                \"namespace\": \"*\"\n            }\n        ]\n    },\n    \"shapes\": {\n        \"com.amazonaws.transcribestreaming#Alternative\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Transcript\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Contains transcribed text.</p>\"\n                    }\n                },\n                \"Items\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#ItemList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Contains words, phrases, or punctuation marks in your transcription output.</p>\"\n                    }\n                },\n                \"Entities\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#EntityList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Contains entities identified as personally identifiable information (PII) in your transcription \\n      output.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A list of possible alternative transcriptions for the input audio. Each alternative may contain\\n      one or more of <code>Items</code>, <code>Entities</code>, or <code>Transcript</code>.</p>\"\n            }\n        },\n        \"com.amazonaws.transcribestreaming#AlternativeList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.transcribestreaming#Alternative\"\n            }\n        },\n        \"com.amazonaws.transcribestreaming#AudioChunk\": {\n            \"type\": \"blob\"\n        },\n        \"com.amazonaws.transcribestreaming#AudioEvent\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AudioChunk\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#AudioChunk\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>\\n    An audio blob containing the next segment of audio from your application,\\n    with a maximum duration of 1 second. \\n    The maximum size in bytes varies based on audio properties.\\n  </p>\\n         <p>Find recommended size in <a href=\\\"https://docs.aws.amazon.com/transcribe/latest/dg/streaming.html#best-practices\\\">Transcribing streaming best practices</a>.\\n  </p>\\n         <p>\\n    Size calculation: <code>Duration (s) * Sample Rate (Hz) * Number of Channels * 2 (Bytes per Sample)</code>\\n         </p>\\n         <p>\\n    For example, a 1-second chunk of 16 kHz, 2-channel, 16-bit audio would be \\n    <code>1 * 16000 * 2 * 2 = 64000 bytes</code>.\\n  </p>\\n         <p>\\n    For 8 kHz, 1-channel, 16-bit audio, a 1-second chunk would be \\n    <code>1 * 8000 * 1 * 2 = 16000 bytes</code>.\\n  </p>\",\n                        \"smithy.api#eventPayload\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A wrapper for your audio chunks. Your audio stream consists of one or more audio\\n      events, which consist of one or more audio chunks.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/transcribe/latest/dg/event-stream.html\\\">Event stream encoding</a>.</p>\"\n            }\n        },\n        \"com.amazonaws.transcribestreaming#AudioStream\": {\n            \"type\": \"union\",\n            \"members\": {\n                \"AudioEvent\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#AudioEvent\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A blob of audio from your application. Your audio stream consists of one or more audio\\n      events.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/transcribe/latest/dg/event-stream.html\\\">Event stream encoding</a>.</p>\"\n                    }\n                },\n                \"ConfigurationEvent\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#ConfigurationEvent\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Contains audio channel definitions and post-call analytics settings.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>An encoded stream of audio blobs. Audio streams are encoded as either HTTP/2 or WebSocket \\n      data frames.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/transcribe/latest/dg/streaming.html\\\">Transcribing streaming audio</a>.</p>\",\n                \"smithy.api#streaming\": {}\n            }\n        },\n        \"com.amazonaws.transcribestreaming#BadRequestException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Message\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#String\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>One or more arguments to the <code>StartStreamTranscription</code>, \\n      <code>StartMedicalStreamTranscription</code>, or <code>StartCallAnalyticsStreamTranscription</code> \\n      operation was not valid. For example, <code>MediaEncoding</code> or <code>LanguageCode</code> \\n      used unsupported values. Check the specified parameters and try your request again.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 400\n            }\n        },\n        \"com.amazonaws.transcribestreaming#Boolean\": {\n            \"type\": \"boolean\",\n            \"traits\": {\n                \"smithy.api#default\": false\n            }\n        },\n        \"com.amazonaws.transcribestreaming#BucketName\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 0,\n                    \"max\": 64\n                },\n                \"smithy.api#pattern\": \"^[a-z0-9][\\\\.\\\\-a-z0-9]{1,61}[a-z0-9]$\"\n            }\n        },\n        \"com.amazonaws.transcribestreaming#CallAnalyticsEntity\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"BeginOffsetMillis\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#Long\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time, in milliseconds, from the beginning of the audio stream to the start of the identified entity.</p>\"\n                    }\n                },\n                \"EndOffsetMillis\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#Long\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time, in milliseconds, from the beginning of the audio stream to the end of the identified entity.</p>\"\n                    }\n                },\n                \"Category\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The category of information identified. For example, <code>PII</code>.</p>\"\n                    }\n                },\n                \"Type\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of PII identified. For example, <code>NAME</code> or \\n      <code>CREDIT_DEBIT_NUMBER</code>.</p>\"\n                    }\n                },\n                \"Content\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The word or words that represent the identified entity.</p>\"\n                    }\n                },\n                \"Confidence\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#Confidence\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The confidence score associated with the identification of an entity in your transcript.</p>\\n         <p>Confidence scores are values between 0 and 1. A larger value indicates a higher\\n      probability that the identified entity correctly matches the entity spoken in your\\n      media.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains entities identified as personally identifiable information (PII) in your\\n      transcription output, along with various associated attributes. Examples include category,\\n      confidence score, content, type, and start and end times.</p>\"\n            }\n        },\n        \"com.amazonaws.transcribestreaming#CallAnalyticsEntityList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.transcribestreaming#CallAnalyticsEntity\"\n            }\n        },\n        \"com.amazonaws.transcribestreaming#CallAnalyticsItem\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"BeginOffsetMillis\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#Long\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time, in milliseconds, from the beginning of the audio stream to the start of the identified item.</p>\"\n                    }\n                },\n                \"EndOffsetMillis\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#Long\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time, in milliseconds, from the beginning of the audio stream to the end of the identified item.</p>\"\n                    }\n                },\n                \"Type\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#ItemType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of item identified. Options are: <code>PRONUNCIATION</code> (spoken words) and\\n      <code>PUNCTUATION</code>.</p>\"\n                    }\n                },\n                \"Content\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The word or punctuation that was transcribed.</p>\"\n                    }\n                },\n                \"Confidence\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#Confidence\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The confidence score associated with a word or phrase in your transcript.</p>\\n         <p>Confidence scores are values between 0 and 1. A larger value indicates a higher\\n      probability that the identified item correctly matches the item spoken in your media.</p>\"\n                    }\n                },\n                \"VocabularyFilterMatch\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Indicates whether the specified item matches a word in the vocabulary filter included in\\n      your Call Analytics request. If <code>true</code>, there is a vocabulary filter match.</p>\"\n                    }\n                },\n                \"Stable\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#Stable\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If partial result stabilization is enabled, <code>Stable</code> indicates whether the specified \\n      item is stable (<code>true</code>) or if it may change when the segment is complete \\n      (<code>false</code>).</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A word, phrase, or punctuation mark in your Call Analytics transcription output, along with various \\n      associated attributes, such as confidence score, type, and start and end times.</p>\"\n            }\n        },\n        \"com.amazonaws.transcribestreaming#CallAnalyticsItemList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.transcribestreaming#CallAnalyticsItem\"\n            }\n        },\n        \"com.amazonaws.transcribestreaming#CallAnalyticsLanguageCode\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"EN_US\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"en-US\"\n                    }\n                },\n                \"EN_GB\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"en-GB\"\n                    }\n                },\n                \"ES_US\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"es-US\"\n                    }\n                },\n                \"FR_CA\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"fr-CA\"\n                    }\n                },\n                \"FR_FR\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"fr-FR\"\n                    }\n                },\n                \"EN_AU\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"en-AU\"\n                    }\n                },\n                \"IT_IT\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"it-IT\"\n                    }\n                },\n                \"DE_DE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"de-DE\"\n                    }\n                },\n                \"PT_BR\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"pt-BR\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.transcribestreaming#CallAnalyticsLanguageIdentification\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.transcribestreaming#CallAnalyticsLanguageWithScore\"\n            }\n        },\n        \"com.amazonaws.transcribestreaming#CallAnalyticsLanguageWithScore\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LanguageCode\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#CallAnalyticsLanguageCode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The language code of the identified language.</p>\"\n                    }\n                },\n                \"Score\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#Double\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The confidence score associated with the identified language code. Confidence scores are values between zero and one; larger values indicate a higher confidence in the identified language.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The language code that represents the language identified in your audio, including the associated\\n      confidence score.</p>\"\n            }\n        },\n        \"com.amazonaws.transcribestreaming#CallAnalyticsTranscriptResultStream\": {\n            \"type\": \"union\",\n            \"members\": {\n                \"UtteranceEvent\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#UtteranceEvent\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Contains set of transcription results from one or more audio segments, along with additional \\n      information per your request parameters. This can include information relating to channel definitions,\\n      partial result stabilization, sentiment, issue detection, and other transcription-related data.</p>\"\n                    }\n                },\n                \"CategoryEvent\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#CategoryEvent\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Provides information on matched categories that were used to generate real-time supervisor \\n      alerts.</p>\"\n                    }\n                },\n                \"BadRequestException\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#BadRequestException\"\n                },\n                \"LimitExceededException\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#LimitExceededException\"\n                },\n                \"InternalFailureException\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#InternalFailureException\"\n                },\n                \"ConflictException\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#ConflictException\"\n                },\n                \"ServiceUnavailableException\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#ServiceUnavailableException\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains detailed information about your real-time Call Analytics session. These details are \\n      provided in the <code>UtteranceEvent</code> and <code>CategoryEvent</code> objects.</p>\",\n                \"smithy.api#streaming\": {}\n            }\n        },\n        \"com.amazonaws.transcribestreaming#CategoryEvent\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"MatchedCategories\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#StringList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Lists the categories that were matched in your audio segment.</p>\"\n                    }\n                },\n                \"MatchedDetails\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#MatchedCategoryDetails\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Contains information about the matched categories, including category names and timestamps.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Provides information on any <code>TranscriptFilterType</code> categories that matched your \\n      transcription output. Matches are identified for each segment upon completion of that segment.</p>\"\n            }\n        },\n        \"com.amazonaws.transcribestreaming#ChannelDefinition\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ChannelId\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#ChannelId\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>Specify the audio channel you want to define.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ParticipantRole\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#ParticipantRole\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify the speaker you want to define. Omitting this parameter is equivalent to\\n      specifying both participants.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Makes it possible to specify which speaker is on which audio channel. For example, if your\\n      agent is the first participant to speak, you would set <code>ChannelId</code> to\\n      <code>0</code> (to indicate the first channel) and <code>ParticipantRole</code> to\\n      <code>AGENT</code> (to indicate that it's the agent speaking).</p>\"\n            }\n        },\n        \"com.amazonaws.transcribestreaming#ChannelDefinitions\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.transcribestreaming#ChannelDefinition\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 2,\n                    \"max\": 2\n                }\n            }\n        },\n        \"com.amazonaws.transcribestreaming#ChannelId\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#default\": 0,\n                \"smithy.api#range\": {\n                    \"min\": 0,\n                    \"max\": 1\n                }\n            }\n        },\n        \"com.amazonaws.transcribestreaming#CharacterOffsets\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Begin\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Provides the character count of the first character where a match is identified. For example, the first\\n      character associated with an issue or a category match in a segment transcript.</p>\"\n                    }\n                },\n                \"End\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#Integer\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Provides the character count of the last character where a match is identified. For example, the last \\n      character associated with an issue or a category match in a segment transcript.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Provides the location, using character count, in your transcript where a match is identified. For example, \\n      the location of an issue or a category match within a segment.</p>\"\n            }\n        },\n        \"com.amazonaws.transcribestreaming#ClinicalNoteGenerationResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ClinicalNoteOutputLocation\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#Uri\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Holds the Amazon S3 URI for the output Clinical Note. </p>\"\n                    }\n                },\n                \"TranscriptOutputLocation\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#Uri\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Holds the Amazon S3 URI for the output Transcript. </p>\"\n                    }\n                },\n                \"Status\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#ClinicalNoteGenerationStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The status of the clinical note generation.</p>\\n         <p>Possible Values:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>IN_PROGRESS</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>FAILED</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>COMPLETED</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>\\n      After audio streaming finishes, and you send a <code>MedicalScribeSessionControlEvent</code> event (with END_OF_SESSION as the Type),\\n      the status is set to <code>IN_PROGRESS</code>.\\n      If the status is <code>COMPLETED</code>, the analytics completed successfully, and you can find the\\n      results at the locations specified in <code>ClinicalNoteOutputLocation</code> and <code>TranscriptOutputLocation</code>.\\n      If the status is <code>FAILED</code>, <code>FailureReason</code> provides details about the failure.\\n    </p>\"\n                    }\n                },\n                \"FailureReason\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If <code>ClinicalNoteGenerationResult</code> is <code>FAILED</code>, information about why it failed. </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The details for clinical note generation,\\n      including status, and output locations for clinical note and aggregated transcript if the analytics completed,\\n      or failure reason if the analytics failed.\\n    </p>\"\n            }\n        },\n        \"com.amazonaws.transcribestreaming#ClinicalNoteGenerationSettings\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"OutputBucketName\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#BucketName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the Amazon S3 bucket where you want the output of Amazon Web Services HealthScribe post-stream analytics stored. Don't include the <code>S3://</code> prefix of the specified bucket. </p>\\n         <p>HealthScribe outputs transcript and clinical note files under the prefix:\\n        <code>S3://$output-bucket-name/healthscribe-streaming/session-id/post-stream-analytics/clinical-notes</code>\\n         </p>\\n         <p>The role <code>ResourceAccessRoleArn</code> specified in the <code>MedicalScribeConfigurationEvent</code> must have\\n      permission to use the specified location. You can change Amazon S3 permissions using the <a href=\\\"https://console.aws.amazon.com/s3\\\">\\n        Amazon Web Services Management Console\\n      </a>. See also <a href=\\\"https://docs.aws.amazon.com/transcribe/latest/dg/security_iam_id-based-policy-examples.html#auth-role-iam-user\\\">Permissions Required for IAM User Roles </a> . </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"NoteTemplate\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#MedicalScribeNoteTemplate\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify one of the following templates to use for the clinical note summary. The default is <code>HISTORY_AND_PHYSICAL</code>.</p>\\n         <ul>\\n            <li>\\n               <p>HISTORY_AND_PHYSICAL: Provides summaries for key sections of the clinical documentation. Examples of sections include Chief Complaint, History of Present Illness, Review of Systems, Past Medical History, Assessment, and Plan.\\n        </p>\\n            </li>\\n            <li>\\n               <p>GIRPP: Provides summaries based on the patients progress toward goals. Examples of sections include Goal, Intervention,\\n          Response, Progress, and Plan.</p>\\n            </li>\\n            <li>\\n               <p>BIRP: Focuses on the patient's behavioral patterns and responses. Examples of sections include Behavior, Intervention, Response, and Plan.</p>\\n            </li>\\n            <li>\\n               <p>SIRP: Emphasizes the situational context of therapy. Examples of sections include Situation, Intervention, Response, and Plan.</p>\\n            </li>\\n            <li>\\n               <p>DAP: Provides a simplified format for clinical documentation. Examples of sections include Data, Assessment, and Plan.</p>\\n            </li>\\n            <li>\\n               <p>BEHAVIORAL_SOAP: Behavioral health focused documentation format. Examples of sections include Subjective, Objective, Assessment, and Plan.</p>\\n            </li>\\n            <li>\\n               <p>PHYSICAL_SOAP: Physical health focused documentation format. Examples of sections include Subjective, Objective, Assessment, and Plan.</p>\\n            </li>\\n         </ul>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The output configuration for aggregated transcript and clinical note generation.</p>\"\n            }\n        },\n        \"com.amazonaws.transcribestreaming#ClinicalNoteGenerationStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"IN_PROGRESS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"IN_PROGRESS\"\n                    }\n                },\n                \"FAILED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"FAILED\"\n                    }\n                },\n                \"COMPLETED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"COMPLETED\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.transcribestreaming#Confidence\": {\n            \"type\": \"double\"\n        },\n        \"com.amazonaws.transcribestreaming#ConfigurationEvent\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ChannelDefinitions\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#ChannelDefinitions\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates which speaker is on which audio channel.</p>\"\n                    }\n                },\n                \"PostCallAnalyticsSettings\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#PostCallAnalyticsSettings\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Provides additional optional settings for your Call Analytics post-call request, including \\n      encryption and output locations for your redacted transcript.</p>\\n         <p>\\n            <code>PostCallAnalyticsSettings</code> provides you with the same insights as a \\n      Call Analytics post-call transcription. Refer to <a href=\\\"https://docs.aws.amazon.com/transcribe/latest/dg/tca-post-call.html\\\">Post-call analytics</a> for more information \\n      on this feature.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Allows you to set audio channel definitions and post-call analytics settings.</p>\"\n            }\n        },\n        \"com.amazonaws.transcribestreaming#ConflictException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Message\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#String\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A new stream started with the same session ID. The current stream has been terminated.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 409\n            }\n        },\n        \"com.amazonaws.transcribestreaming#ContentIdentificationType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"PII\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"PII\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.transcribestreaming#ContentRedactionOutput\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"REDACTED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"redacted\"\n                    }\n                },\n                \"REDACTED_AND_UNREDACTED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"redacted_and_unredacted\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.transcribestreaming#ContentRedactionType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"PII\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"PII\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.transcribestreaming#DateTime\": {\n            \"type\": \"timestamp\"\n        },\n        \"com.amazonaws.transcribestreaming#Double\": {\n            \"type\": \"double\",\n            \"traits\": {\n                \"smithy.api#default\": 0\n            }\n        },\n        \"com.amazonaws.transcribestreaming#Entity\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"StartTime\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#Double\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The start time of the utterance that was identified as PII in seconds, with millisecond precision (e.g., 1.056)</p>\"\n                    }\n                },\n                \"EndTime\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#Double\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The end time of the utterance that was identified as PII in seconds, with millisecond precision (e.g., 1.056)</p>\"\n                    }\n                },\n                \"Category\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The category of information identified. The only category is <code>PII</code>.</p>\"\n                    }\n                },\n                \"Type\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of PII identified. For example, <code>NAME</code> or \\n      <code>CREDIT_DEBIT_NUMBER</code>.</p>\"\n                    }\n                },\n                \"Content\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The word or words identified as PII.</p>\"\n                    }\n                },\n                \"Confidence\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#Confidence\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The confidence score associated with the identified PII entity in your audio.</p>\\n         <p>Confidence scores are values between 0 and 1. A larger value indicates a higher\\n      probability that the identified entity correctly matches the entity spoken in your\\n      media.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains entities identified as personally identifiable information (PII) in your\\n      transcription output, along with various associated attributes. Examples include category,\\n      confidence score, type, stability score, and start and end times.</p>\"\n            }\n        },\n        \"com.amazonaws.transcribestreaming#EntityList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.transcribestreaming#Entity\"\n            }\n        },\n        \"com.amazonaws.transcribestreaming#GetMedicalScribeStream\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.transcribestreaming#GetMedicalScribeStreamRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.transcribestreaming#GetMedicalScribeStreamResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.transcribestreaming#BadRequestException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.transcribestreaming#InternalFailureException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.transcribestreaming#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.transcribestreaming#ResourceNotFoundException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Provides details about the specified Amazon Web Services HealthScribe streaming session.\\n      To view the status of the streaming session, check the <code>StreamStatus</code> field in the response. To get the\\n      details of post-stream analytics, including its status, check the <code>PostStreamAnalyticsResult</code> field in the response.\\n    </p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"GET\",\n                    \"uri\": \"/medical-scribe-stream/{SessionId}\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.transcribestreaming#GetMedicalScribeStreamRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SessionId\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#SessionId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The identifier of the HealthScribe streaming session you want information about.</p>\",\n                        \"smithy.api#httpLabel\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.transcribestreaming#GetMedicalScribeStreamResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"MedicalScribeStreamDetails\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#MedicalScribeStreamDetails\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Provides details about a HealthScribe streaming session.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.transcribestreaming#IamRoleArn\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 20,\n                    \"max\": 2048\n                },\n                \"smithy.api#pattern\": \"^arn:(aws|aws-cn|aws-us-gov|aws-iso-{0,1}[a-z]{0,1}):iam::[0-9]{0,63}:role/[A-Za-z0-9:_/+=,@.-]{0,1024}$\"\n            }\n        },\n        \"com.amazonaws.transcribestreaming#Integer\": {\n            \"type\": \"integer\"\n        },\n        \"com.amazonaws.transcribestreaming#InternalFailureException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Message\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#String\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A problem occurred while processing the audio. Amazon Transcribe terminated \\n      processing.</p>\",\n                \"smithy.api#error\": \"server\",\n                \"smithy.api#httpError\": 500\n            }\n        },\n        \"com.amazonaws.transcribestreaming#IssueDetected\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"CharacterOffsets\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#CharacterOffsets\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Provides the timestamps that identify when in an audio segment the specified issue occurs.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Lists the issues that were identified in your audio segment.</p>\"\n            }\n        },\n        \"com.amazonaws.transcribestreaming#IssuesDetected\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.transcribestreaming#IssueDetected\"\n            }\n        },\n        \"com.amazonaws.transcribestreaming#Item\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"StartTime\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#Double\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The start time of the transcribed item in seconds, with millisecond precision (e.g., 1.056)</p>\"\n                    }\n                },\n                \"EndTime\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#Double\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The end time of the transcribed item in seconds, with millisecond precision (e.g., 1.056)</p>\"\n                    }\n                },\n                \"Type\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#ItemType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of item identified. Options are: <code>PRONUNCIATION</code> (spoken words) and\\n      <code>PUNCTUATION</code>.</p>\"\n                    }\n                },\n                \"Content\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The word or punctuation that was transcribed.</p>\"\n                    }\n                },\n                \"VocabularyFilterMatch\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Indicates whether the specified item matches a word in the vocabulary filter included in\\n      your request. If <code>true</code>, there is a vocabulary filter match.</p>\"\n                    }\n                },\n                \"Speaker\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If speaker partitioning is enabled, <code>Speaker</code> labels the speaker of the\\n      specified item.</p>\"\n                    }\n                },\n                \"Confidence\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#Confidence\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The confidence score associated with a word or phrase in your transcript.</p>\\n         <p>Confidence scores are values between 0 and 1. A larger value indicates a higher\\n      probability that the identified item correctly matches the item spoken in your media.</p>\"\n                    }\n                },\n                \"Stable\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#Stable\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If partial result stabilization is enabled, <code>Stable</code> indicates whether the specified \\n      item is stable (<code>true</code>) or if it may change when the segment is complete \\n      (<code>false</code>).</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A word, phrase, or punctuation mark in your transcription output, along with various associated\\n      attributes, such as confidence score, type, and start and end times.</p>\"\n            }\n        },\n        \"com.amazonaws.transcribestreaming#ItemList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.transcribestreaming#Item\"\n            }\n        },\n        \"com.amazonaws.transcribestreaming#ItemType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"PRONUNCIATION\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"pronunciation\"\n                    }\n                },\n                \"PUNCTUATION\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"punctuation\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.transcribestreaming#KMSEncryptionContextMap\": {\n            \"type\": \"map\",\n            \"key\": {\n                \"target\": \"com.amazonaws.transcribestreaming#NonEmptyString\"\n            },\n            \"value\": {\n                \"target\": \"com.amazonaws.transcribestreaming#NonEmptyString\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 10\n                }\n            }\n        },\n        \"com.amazonaws.transcribestreaming#KMSKeyId\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 2048\n                },\n                \"smithy.api#pattern\": \"^[A-Za-z0-9][A-Za-z0-9:_/+=,@.-]{0,2048}$\"\n            }\n        },\n        \"com.amazonaws.transcribestreaming#LanguageCode\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"EN_US\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"en-US\"\n                    }\n                },\n                \"EN_GB\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"en-GB\"\n                    }\n                },\n                \"ES_US\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"es-US\"\n                    }\n                },\n                \"FR_CA\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"fr-CA\"\n                    }\n                },\n                \"FR_FR\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"fr-FR\"\n                    }\n                },\n                \"EN_AU\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"en-AU\"\n                    }\n                },\n                \"IT_IT\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"it-IT\"\n                    }\n                },\n                \"DE_DE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"de-DE\"\n                    }\n                },\n                \"PT_BR\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"pt-BR\"\n                    }\n                },\n                \"JA_JP\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ja-JP\"\n                    }\n                },\n                \"KO_KR\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ko-KR\"\n                    }\n                },\n                \"ZH_CN\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"zh-CN\"\n                    }\n                },\n                \"TH_TH\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"th-TH\"\n                    }\n                },\n                \"ES_ES\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"es-ES\"\n                    }\n                },\n                \"AR_SA\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ar-SA\"\n                    }\n                },\n                \"PT_PT\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"pt-PT\"\n                    }\n                },\n                \"CA_ES\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ca-ES\"\n                    }\n                },\n                \"AR_AE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ar-AE\"\n                    }\n                },\n                \"HI_IN\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"hi-IN\"\n                    }\n                },\n                \"ZH_HK\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"zh-HK\"\n                    }\n                },\n                \"NL_NL\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"nl-NL\"\n                    }\n                },\n                \"NO_NO\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"no-NO\"\n                    }\n                },\n                \"SV_SE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"sv-SE\"\n                    }\n                },\n                \"PL_PL\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"pl-PL\"\n                    }\n                },\n                \"FI_FI\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"fi-FI\"\n                    }\n                },\n                \"ZH_TW\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"zh-TW\"\n                    }\n                },\n                \"EN_IN\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"en-IN\"\n                    }\n                },\n                \"EN_IE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"en-IE\"\n                    }\n                },\n                \"EN_NZ\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"en-NZ\"\n                    }\n                },\n                \"EN_AB\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"en-AB\"\n                    }\n                },\n                \"EN_ZA\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"en-ZA\"\n                    }\n                },\n                \"EN_WL\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"en-WL\"\n                    }\n                },\n                \"DE_CH\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"de-CH\"\n                    }\n                },\n                \"AF_ZA\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"af-ZA\"\n                    }\n                },\n                \"EU_ES\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"eu-ES\"\n                    }\n                },\n                \"HR_HR\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"hr-HR\"\n                    }\n                },\n                \"CS_CZ\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"cs-CZ\"\n                    }\n                },\n                \"DA_DK\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"da-DK\"\n                    }\n                },\n                \"FA_IR\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"fa-IR\"\n                    }\n                },\n                \"GL_ES\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"gl-ES\"\n                    }\n                },\n                \"EL_GR\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"el-GR\"\n                    }\n                },\n                \"HE_IL\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"he-IL\"\n                    }\n                },\n                \"ID_ID\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"id-ID\"\n                    }\n                },\n                \"LV_LV\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"lv-LV\"\n                    }\n                },\n                \"MS_MY\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ms-MY\"\n                    }\n                },\n                \"RO_RO\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ro-RO\"\n                    }\n                },\n                \"RU_RU\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ru-RU\"\n                    }\n                },\n                \"SR_RS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"sr-RS\"\n                    }\n                },\n                \"SK_SK\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"sk-SK\"\n                    }\n                },\n                \"SO_SO\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"so-SO\"\n                    }\n                },\n                \"TL_PH\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"tl-PH\"\n                    }\n                },\n                \"UK_UA\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"uk-UA\"\n                    }\n                },\n                \"VI_VN\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"vi-VN\"\n                    }\n                },\n                \"ZU_ZA\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"zu-ZA\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.transcribestreaming#LanguageIdentification\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.transcribestreaming#LanguageWithScore\"\n            }\n        },\n        \"com.amazonaws.transcribestreaming#LanguageOptions\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 200\n                },\n                \"smithy.api#pattern\": \"^[a-zA-Z-,]+$\"\n            }\n        },\n        \"com.amazonaws.transcribestreaming#LanguageWithScore\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LanguageCode\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#LanguageCode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The language code of the identified language.</p>\"\n                    }\n                },\n                \"Score\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#Double\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The confidence score associated with the identified language code. Confidence scores are values\\n      between zero and one; larger values indicate a higher confidence in the identified language.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The language code that represents the language identified in your audio, including the associated\\n      confidence score. If you enabled channel identification in your request and each channel contained a \\n      different language, you will have more than one <code>LanguageWithScore</code> result.</p>\"\n            }\n        },\n        \"com.amazonaws.transcribestreaming#LimitExceededException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Message\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#String\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Your client has exceeded one of the Amazon Transcribe limits. This is typically the audio length\\n      limit. Break your audio stream into smaller chunks and try your request again.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 429\n            }\n        },\n        \"com.amazonaws.transcribestreaming#Long\": {\n            \"type\": \"long\"\n        },\n        \"com.amazonaws.transcribestreaming#MatchedCategoryDetails\": {\n            \"type\": \"map\",\n            \"key\": {\n                \"target\": \"com.amazonaws.transcribestreaming#String\"\n            },\n            \"value\": {\n                \"target\": \"com.amazonaws.transcribestreaming#PointsOfInterest\"\n            }\n        },\n        \"com.amazonaws.transcribestreaming#MediaEncoding\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"PCM\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"pcm\"\n                    }\n                },\n                \"OGG_OPUS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ogg-opus\"\n                    }\n                },\n                \"FLAC\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"flac\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.transcribestreaming#MediaSampleRateHertz\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 8000,\n                    \"max\": 48000\n                }\n            }\n        },\n        \"com.amazonaws.transcribestreaming#MedicalAlternative\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Transcript\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Contains transcribed text.</p>\"\n                    }\n                },\n                \"Items\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#MedicalItemList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Contains words, phrases, or punctuation marks in your transcription output.</p>\"\n                    }\n                },\n                \"Entities\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#MedicalEntityList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Contains entities identified as personal health information (PHI) in your transcription \\n            output.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A list of possible alternative transcriptions for the input audio. Each alternative may\\n            contain one or more of <code>Items</code>, <code>Entities</code>, or\\n            <code>Transcript</code>.</p>\"\n            }\n        },\n        \"com.amazonaws.transcribestreaming#MedicalAlternativeList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.transcribestreaming#MedicalAlternative\"\n            }\n        },\n        \"com.amazonaws.transcribestreaming#MedicalContentIdentificationType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"PHI\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"PHI\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.transcribestreaming#MedicalEntity\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"StartTime\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#Double\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The start time, in seconds, of the utterance that was identified as PHI.</p>\"\n                    }\n                },\n                \"EndTime\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#Double\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The end time, in seconds, of the utterance that was identified as PHI.</p>\"\n                    }\n                },\n                \"Category\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The category of information identified. The only category is <code>PHI</code>.</p>\"\n                    }\n                },\n                \"Content\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The word or words identified as PHI.</p>\"\n                    }\n                },\n                \"Confidence\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#Confidence\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The confidence score associated with the identified PHI entity in your audio.</p>\\n         <p>Confidence scores are values between 0 and 1. A larger value indicates a higher\\n            probability that the identified entity correctly matches the entity spoken in your\\n            media.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains entities identified as personal health information (PHI) in your\\n            transcription output, along with various associated attributes. Examples include\\n            category, confidence score, type, stability score, and start and end times.</p>\"\n            }\n        },\n        \"com.amazonaws.transcribestreaming#MedicalEntityList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.transcribestreaming#MedicalEntity\"\n            }\n        },\n        \"com.amazonaws.transcribestreaming#MedicalItem\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"StartTime\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#Double\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The start time, in seconds, of the transcribed item.</p>\"\n                    }\n                },\n                \"EndTime\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#Double\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The end time, in seconds, of the transcribed item.</p>\"\n                    }\n                },\n                \"Type\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#ItemType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of item identified. Options are: <code>PRONUNCIATION</code> (spoken \\n            words) and <code>PUNCTUATION</code>.</p>\"\n                    }\n                },\n                \"Content\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The word or punctuation that was transcribed.</p>\"\n                    }\n                },\n                \"Confidence\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#Confidence\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The confidence score associated with a word or phrase in your transcript.</p>\\n         <p>Confidence scores are values between 0 and 1. A larger value indicates a higher\\n            probability that the identified item correctly matches the item spoken in your\\n            media.</p>\"\n                    }\n                },\n                \"Speaker\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>If speaker partitioning is enabled, <code>Speaker</code> labels the speaker of the\\n            specified item.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A word, phrase, or punctuation mark in your transcription output, along with various \\n            associated attributes, such as confidence score, type, and start and end times.</p>\"\n            }\n        },\n        \"com.amazonaws.transcribestreaming#MedicalItemList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.transcribestreaming#MedicalItem\"\n            }\n        },\n        \"com.amazonaws.transcribestreaming#MedicalResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ResultId\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Provides a unique identifier for the <code>Result</code>.</p>\"\n                    }\n                },\n                \"StartTime\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#Double\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The start time, in seconds, of the <code>Result</code>.</p>\"\n                    }\n                },\n                \"EndTime\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#Double\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The end time, in seconds, of the <code>Result</code>.</p>\"\n                    }\n                },\n                \"IsPartial\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Indicates if the segment is complete.</p>\\n         <p>If <code>IsPartial</code> is <code>true</code>, the segment is not complete. If\\n                <code>IsPartial</code> is <code>false</code>, the segment is complete.</p>\"\n                    }\n                },\n                \"Alternatives\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#MedicalAlternativeList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of possible alternative transcriptions for the input audio. Each alternative may \\n            contain one or more of <code>Items</code>, <code>Entities</code>, or\\n            <code>Transcript</code>.</p>\"\n                    }\n                },\n                \"ChannelId\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates the channel identified for the <code>Result</code>.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The <code>Result</code> associated with a \\n            <code></code>.</p>\\n         <p>Contains a set of transcription results from one or more audio segments, along with\\n            additional information per your request parameters. This can include information relating to\\n            alternative transcriptions, channel identification, partial result stabilization, language \\n            identification, and other transcription-related data.</p>\"\n            }\n        },\n        \"com.amazonaws.transcribestreaming#MedicalResultList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.transcribestreaming#MedicalResult\"\n            }\n        },\n        \"com.amazonaws.transcribestreaming#MedicalScribeAudioEvent\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"AudioChunk\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#AudioChunk\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>\\n    An audio blob containing the next segment of audio from your application,\\n    with a maximum duration of 1 second. \\n    The maximum size in bytes varies based on audio properties.\\n  </p>\\n         <p>Find recommended size in <a href=\\\"https://docs.aws.amazon.com/transcribe/latest/dg/streaming.html#best-practices\\\">Transcribing streaming best practices</a>.\\n  </p>\\n         <p>\\n    Size calculation: <code>Duration (s) * Sample Rate (Hz) * Number of Channels * 2 (Bytes per Sample)</code>\\n         </p>\\n         <p>\\n    For example, a 1-second chunk of 16 kHz, 2-channel, 16-bit audio would be \\n    <code>1 * 16000 * 2 * 2 = 64000 bytes</code>.\\n  </p>\\n         <p>\\n    For 8 kHz, 1-channel, 16-bit audio, a 1-second chunk would be \\n    <code>1 * 8000 * 1 * 2 = 16000 bytes</code>.\\n  </p>\",\n                        \"smithy.api#eventPayload\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A wrapper for your audio chunks</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/transcribe/latest/dg/event-stream.html\\\">Event stream encoding</a>.\\n    </p>\"\n            }\n        },\n        \"com.amazonaws.transcribestreaming#MedicalScribeChannelDefinition\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ChannelId\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#MedicalScribeChannelId\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>Specify the audio channel you want to define.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ParticipantRole\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#MedicalScribeParticipantRole\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify the participant that you want to flag.\\n      The allowed options are <code>CLINICIAN</code> and\\n      <code>PATIENT</code>.\\n    </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Makes it possible to specify which speaker is on which channel.\\n      For example, if the clinician is the first participant to speak, you would set the <code>ChannelId</code> of the first\\n      <code>ChannelDefinition</code>\\n      in the list to <code>0</code> (to indicate the first channel) and <code>ParticipantRole</code> to\\n      <code>CLINICIAN</code>\\n      (to indicate that it's the clinician speaking).\\n      Then you would set the <code>ChannelId</code> of the second <code>ChannelDefinition</code> in the list to\\n      <code>1</code>\\n      (to indicate the second channel) and <code>ParticipantRole</code> to <code>PATIENT</code> (to indicate that it's the patient speaking).\\n    </p>\\n         <p>If you don't specify a channel definition, HealthScribe will diarize the transcription and identify speaker roles for each speaker.</p>\"\n            }\n        },\n        \"com.amazonaws.transcribestreaming#MedicalScribeChannelDefinitions\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.transcribestreaming#MedicalScribeChannelDefinition\"\n            },\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 2,\n                    \"max\": 2\n                }\n            }\n        },\n        \"com.amazonaws.transcribestreaming#MedicalScribeChannelId\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#default\": 0,\n                \"smithy.api#range\": {\n                    \"min\": 0,\n                    \"max\": 1\n                }\n            }\n        },\n        \"com.amazonaws.transcribestreaming#MedicalScribeConfigurationEvent\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"VocabularyName\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#VocabularyName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify the name of the custom vocabulary you want to use for your streaming session.\\n      Custom vocabulary names are case-sensitive.\\n    </p>\"\n                    }\n                },\n                \"VocabularyFilterName\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#VocabularyFilterName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify the name of the custom vocabulary filter you want to include in your streaming session.\\n      Custom vocabulary filter names are case-sensitive.\\n    </p>\\n         <p>If you include <code>VocabularyFilterName</code> in the <code>MedicalScribeConfigurationEvent</code>,\\n      you must also include <code>VocabularyFilterMethod</code>.\\n    </p>\"\n                    }\n                },\n                \"VocabularyFilterMethod\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#MedicalScribeVocabularyFilterMethod\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify how you want your custom vocabulary filter applied to the streaming session.</p>\\n         <p>To replace words with <code>***</code>, specify <code>mask</code>.\\n    </p>\\n         <p>To delete words, specify <code>remove</code>.\\n    </p>\\n         <p>To flag words without changing them, specify <code>tag</code>.\\n    </p>\"\n                    }\n                },\n                \"ResourceAccessRoleArn\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#IamRoleArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of an IAM role that has permissions to access the Amazon S3 output\\n      bucket you specified, and use your KMS key if supplied. If the role that you specify doesn’t have the\\n      appropriate permissions, your request fails. </p>\\n         <p>\\n      IAM\\n      role ARNs have the format\\n      <code>arn:partition:iam::account:role/role-name-with-path</code>.\\n      For example: <code>arn:aws:iam::111122223333:role/Admin</code>.\\n    </p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/transcribe/latest/dg/health-scribe-streaming.html\\\">Amazon Web Services HealthScribe</a>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ChannelDefinitions\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#MedicalScribeChannelDefinitions\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify which speaker is on which audio channel.</p>\"\n                    }\n                },\n                \"EncryptionSettings\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#MedicalScribeEncryptionSettings\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify the encryption settings for your streaming session.</p>\"\n                    }\n                },\n                \"PostStreamAnalyticsSettings\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#MedicalScribePostStreamAnalyticsSettings\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify settings for post-stream analytics.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"MedicalScribeContext\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#MedicalScribeContext\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>MedicalScribeContext</code> object that contains contextual information used to generate\\n            customized clinical notes.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Specify details to configure the streaming session, including channel definitions, encryption settings, post-stream analytics\\n      settings, resource access role ARN and vocabulary settings.\\n    </p>\\n         <p>Whether you are starting a new session or resuming an existing session, \\n      your first event must be a <code>MedicalScribeConfigurationEvent</code>.\\n      If you are resuming a session, then this event must have the same configurations that you provided to start the session.\\n    </p>\"\n            }\n        },\n        \"com.amazonaws.transcribestreaming#MedicalScribeContext\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"PatientContext\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#MedicalScribePatientContext\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Contains patient-specific information used to customize the clinical note generation.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The <code>MedicalScribeContext</code> object that contains contextual information which is used during clinical note generation\\n            to add relevant context to the note.</p>\"\n            }\n        },\n        \"com.amazonaws.transcribestreaming#MedicalScribeEncryptionSettings\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"KmsEncryptionContext\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#KMSEncryptionContextMap\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A map of plain text, non-secret key:value pairs, known as encryption context pairs, that provide an added layer of\\n      security for your data. For more information, see <a href=\\\"https://docs.aws.amazon.com/transcribe/latest/dg/key-management.html#kms-context\\\">KMSencryption context </a> and <a href=\\\"https://docs.aws.amazon.com/transcribe/latest/dg/symmetric-asymmetric.html\\\">Asymmetric keys in KMS\\n      </a>. </p>\"\n                    }\n                },\n                \"KmsKeyId\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#KMSKeyId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The ID of the KMS key you want to use for your streaming session. You\\n      can specify its KMS key ID, key Amazon Resource Name (ARN), alias name, or alias ARN. When using an alias name, prefix it with <code>\\\"alias/\\\"</code>. \\n      To specify a KMS key in a different Amazon Web Services account, you must use the key ARN or alias ARN.</p>\\n         <p>For example:</p>\\n         <ul>\\n            <li>\\n               <p>Key ID: 1234abcd-12ab-34cd-56ef-1234567890ab</p>\\n            </li>\\n            <li>\\n               <p>Key ARN: arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab</p>\\n            </li>\\n            <li>\\n               <p>\\n          Alias name: alias/ExampleAlias</p>\\n            </li>\\n            <li>\\n               <p>\\n          Alias ARN: arn:aws:kms:us-east-2:111122223333:alias/ExampleAlias  \\n        </p>\\n            </li>\\n         </ul>\\n         <p>\\n      To get the key ID and key ARN for a KMS key, use the <a href=\\\"https://docs.aws.amazon.com/kms/latest/APIReference/API_ListKeys.html\\\">ListKeys</a> or <a href=\\\"https://docs.aws.amazon.com/kms/latest/APIReference/API_DescribeKey.html\\\">DescribeKey</a> KMS API operations. \\n      To get the alias name and alias ARN, use <a href=\\\"https://docs.aws.amazon.com/kms/latest/APIReference/API_ListAliases.html\\\">ListKeys</a> API operation.     \\n    </p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains encryption related settings to be used for data encryption with Key Management Service, including KmsEncryptionContext and KmsKeyId.\\n     The KmsKeyId is required, while KmsEncryptionContext is optional for additional layer of security.\\n    </p>\\n         <p>By default, Amazon Web Services HealthScribe provides encryption at rest to protect sensitive customer data using Amazon S3-managed keys. HealthScribe uses the KMS key you specify as a second layer of\\n      encryption.</p>\\n         <p>\\n      Your <code>ResourceAccessRoleArn</code>\\n      must permission to use your KMS key.\\n      For more information, see <a href=\\\"https://docs.aws.amazon.com/transcribe/latest/dg/health-scribe-encryption.html\\\">Data Encryption at rest for Amazon Web Services HealthScribe</a>.\\n    </p>\"\n            }\n        },\n        \"com.amazonaws.transcribestreaming#MedicalScribeInputStream\": {\n            \"type\": \"union\",\n            \"members\": {\n                \"AudioEvent\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#MedicalScribeAudioEvent\"\n                },\n                \"SessionControlEvent\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#MedicalScribeSessionControlEvent\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify the lifecycle of your streaming session, such as ending the session.</p>\"\n                    }\n                },\n                \"ConfigurationEvent\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#MedicalScribeConfigurationEvent\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify additional streaming session configurations beyond those provided in your initial start request headers. For example, specify\\n      channel definitions, encryption settings, and post-stream analytics settings.\\n    </p>\\n         <p>Whether you are starting a new session or resuming an existing session, \\n      your first event must be a <code>MedicalScribeConfigurationEvent</code>.\\n    </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>An encoded stream of events. The stream is encoded as HTTP/2 data frames.</p>\\n         <p>An input stream consists of the following types of events. The first element of the input stream must be the <code>MedicalScribeConfigurationEvent</code> event type.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>MedicalScribeConfigurationEvent</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>MedicalScribeAudioEvent</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>MedicalScribeSessionControlEvent</code>\\n               </p>\\n            </li>\\n         </ul>\",\n                \"smithy.api#streaming\": {}\n            }\n        },\n        \"com.amazonaws.transcribestreaming#MedicalScribeLanguageCode\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"EN_US\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"en-US\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.transcribestreaming#MedicalScribeMediaEncoding\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"PCM\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"pcm\"\n                    }\n                },\n                \"OGG_OPUS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ogg-opus\"\n                    }\n                },\n                \"FLAC\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"flac\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.transcribestreaming#MedicalScribeMediaSampleRateHertz\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 16000,\n                    \"max\": 48000\n                }\n            }\n        },\n        \"com.amazonaws.transcribestreaming#MedicalScribeNoteTemplate\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"HISTORY_AND_PHYSICAL\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"HISTORY_AND_PHYSICAL\"\n                    }\n                },\n                \"GIRPP\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"GIRPP\"\n                    }\n                },\n                \"DAP\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DAP\"\n                    }\n                },\n                \"SIRP\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"SIRP\"\n                    }\n                },\n                \"BIRP\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"BIRP\"\n                    }\n                },\n                \"BEHAVIORAL_SOAP\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"BEHAVIORAL_SOAP\"\n                    }\n                },\n                \"PHYSICAL_SOAP\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"PHYSICAL_SOAP\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.transcribestreaming#MedicalScribeParticipantRole\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"PATIENT\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"PATIENT\"\n                    }\n                },\n                \"CLINICIAN\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"CLINICIAN\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.transcribestreaming#MedicalScribePatientContext\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Pronouns\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#Pronouns\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The patient's preferred pronouns that the user wants to provide as a context for clinical note generation .</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains patient-specific information. </p>\"\n            }\n        },\n        \"com.amazonaws.transcribestreaming#MedicalScribePostStreamAnalyticsResult\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ClinicalNoteGenerationResult\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#ClinicalNoteGenerationResult\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Provides the Clinical Note Generation result for post-stream analytics.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains details for the result of post-stream analytics.\\n    </p>\"\n            }\n        },\n        \"com.amazonaws.transcribestreaming#MedicalScribePostStreamAnalyticsSettings\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ClinicalNoteGenerationSettings\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#ClinicalNoteGenerationSettings\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify settings for the post-stream clinical note generation.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The settings for post-stream analytics.\\n    </p>\"\n            }\n        },\n        \"com.amazonaws.transcribestreaming#MedicalScribeResultStream\": {\n            \"type\": \"union\",\n            \"members\": {\n                \"TranscriptEvent\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#MedicalScribeTranscriptEvent\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The transcript event that contains real-time transcription results.\\n    </p>\"\n                    }\n                },\n                \"BadRequestException\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#BadRequestException\"\n                },\n                \"LimitExceededException\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#LimitExceededException\"\n                },\n                \"InternalFailureException\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#InternalFailureException\"\n                },\n                \"ConflictException\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#ConflictException\"\n                },\n                \"ServiceUnavailableException\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#ServiceUnavailableException\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Result stream where you will receive the output events.\\n      The details are provided in the <code>MedicalScribeTranscriptEvent</code> object.\\n    </p>\",\n                \"smithy.api#streaming\": {}\n            }\n        },\n        \"com.amazonaws.transcribestreaming#MedicalScribeSessionControlEvent\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Type\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#MedicalScribeSessionControlEventType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of <code>MedicalScribeSessionControlEvent</code>.\\n    </p>\\n         <p>Possible Values:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>END_OF_SESSION</code> - Indicates the audio streaming is complete. After you\\n          send an END_OF_SESSION event, Amazon Web Services HealthScribe starts the post-stream analytics.\\n          The session can't be resumed after this event is sent. After Amazon Web Services HealthScribe processes the event, the real-time <code>StreamStatus</code> is <code>COMPLETED</code>.\\n          You get the <code>StreamStatus</code> and other stream details with the <a href=\\\"https://docs.aws.amazon.com/transcribe/latest/APIReference/API_streaming_GetMedicalScribeStream.html\\\">GetMedicalScribeStream</a> API operation.\\n          For more information about different streaming statuses, see the <code>StreamStatus</code> description in the <a href=\\\"https://docs.aws.amazon.com/transcribe/latest/APIReference/API_streaming_MedicalScribeStreamDetails.html\\\">MedicalScribeStreamDetails</a>.      \\n        </p>\\n            </li>\\n         </ul>\",\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Specify the lifecycle of your streaming session.</p>\"\n            }\n        },\n        \"com.amazonaws.transcribestreaming#MedicalScribeSessionControlEventType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"END_OF_SESSION\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"END_OF_SESSION\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.transcribestreaming#MedicalScribeStreamDetails\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SessionId\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#SessionId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The identifier of the HealthScribe streaming session.</p>\"\n                    }\n                },\n                \"StreamCreatedAt\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#DateTime\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time when the HealthScribe streaming session was created.</p>\"\n                    }\n                },\n                \"StreamEndedAt\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#DateTime\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The date and time when the HealthScribe streaming session was ended.</p>\"\n                    }\n                },\n                \"LanguageCode\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#MedicalScribeLanguageCode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Language Code of the HealthScribe streaming session.</p>\"\n                    }\n                },\n                \"MediaSampleRateHertz\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#MedicalScribeMediaSampleRateHertz\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The sample rate (in hertz) of the HealthScribe streaming session.</p>\"\n                    }\n                },\n                \"MediaEncoding\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#MedicalScribeMediaEncoding\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Media Encoding of the HealthScribe streaming session.</p>\"\n                    }\n                },\n                \"VocabularyName\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#VocabularyName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The vocabulary name of the HealthScribe streaming session.</p>\"\n                    }\n                },\n                \"VocabularyFilterName\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#VocabularyFilterName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The name of the vocabulary filter used for the HealthScribe streaming session .</p>\"\n                    }\n                },\n                \"VocabularyFilterMethod\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#MedicalScribeVocabularyFilterMethod\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The method of the vocabulary filter for the HealthScribe streaming session.</p>\"\n                    }\n                },\n                \"ResourceAccessRoleArn\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#IamRoleArn\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the role used in the HealthScribe streaming session.</p>\"\n                    }\n                },\n                \"ChannelDefinitions\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#MedicalScribeChannelDefinitions\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Channel Definitions of the HealthScribe streaming session.</p>\"\n                    }\n                },\n                \"EncryptionSettings\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#MedicalScribeEncryptionSettings\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Encryption Settings of the HealthScribe streaming session.</p>\"\n                    }\n                },\n                \"StreamStatus\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#MedicalScribeStreamStatus\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The streaming status of the HealthScribe streaming session.</p>\\n         <p>Possible Values:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>IN_PROGRESS</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>PAUSED</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>FAILED</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>COMPLETED</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <note>\\n            <p>This status is specific to real-time streaming.\\n      A <code>COMPLETED</code> status doesn't mean that the post-stream analytics is complete.\\n      To get status of an analytics result, check the <code>Status</code> field for the analytics result within the\\n      <code>MedicalScribePostStreamAnalyticsResult</code>. For example, you can view the status of the \\n      <code>ClinicalNoteGenerationResult</code>.\\n    </p>\\n         </note>\"\n                    }\n                },\n                \"PostStreamAnalyticsSettings\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#MedicalScribePostStreamAnalyticsSettings\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The post-stream analytics settings of the HealthScribe streaming session.</p>\"\n                    }\n                },\n                \"PostStreamAnalyticsResult\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#MedicalScribePostStreamAnalyticsResult\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The result of post-stream analytics for the HealthScribe streaming session.</p>\"\n                    }\n                },\n                \"MedicalScribeContextProvided\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#NullableBoolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether the <code>MedicalScribeContext</code> object was provided when the stream was started.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains details about a Amazon Web Services HealthScribe streaming session.</p>\"\n            }\n        },\n        \"com.amazonaws.transcribestreaming#MedicalScribeStreamStatus\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"IN_PROGRESS\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"IN_PROGRESS\"\n                    }\n                },\n                \"PAUSED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"PAUSED\"\n                    }\n                },\n                \"FAILED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"FAILED\"\n                    }\n                },\n                \"COMPLETED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"COMPLETED\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.transcribestreaming#MedicalScribeTranscriptEvent\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TranscriptSegment\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#MedicalScribeTranscriptSegment\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>TranscriptSegment</code> associated with a <code>MedicalScribeTranscriptEvent</code>.\\n    </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The event associated with <code>MedicalScribeResultStream</code>.\\n    </p>\\n         <p>Contains <code>MedicalScribeTranscriptSegment</code>, which contains segment related information.\\n    </p>\"\n            }\n        },\n        \"com.amazonaws.transcribestreaming#MedicalScribeTranscriptItem\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"BeginAudioTime\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#Double\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The start time, in milliseconds, of the transcribed item.</p>\"\n                    }\n                },\n                \"EndAudioTime\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#Double\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The end time, in milliseconds, of the transcribed item.</p>\"\n                    }\n                },\n                \"Type\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#MedicalScribeTranscriptItemType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The type of item identified. Options are: <code>PRONUNCIATION</code> (spoken words)\\n      and <code>PUNCTUATION</code>.\\n    </p>\"\n                    }\n                },\n                \"Confidence\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#Confidence\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The confidence score associated with a word or phrase in your transcript.</p>\\n         <p>Confidence scores are values between 0 and 1. A larger value indicates a higher\\n      probability that the identified item correctly matches the item spoken in your media.\\n    </p>\"\n                    }\n                },\n                \"Content\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The word, phrase or punctuation mark that was transcribed.</p>\"\n                    }\n                },\n                \"VocabularyFilterMatch\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#NullableBoolean\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates whether the specified item matches a word in the vocabulary filter included in\\n      your configuration event. If <code>true</code>, there is a vocabulary filter match.\\n    </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>A word, phrase, or punctuation mark in your transcription output, along with various associated\\n      attributes, such as confidence score, type, and start and end times.\\n    </p>\"\n            }\n        },\n        \"com.amazonaws.transcribestreaming#MedicalScribeTranscriptItemList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.transcribestreaming#MedicalScribeTranscriptItem\"\n            }\n        },\n        \"com.amazonaws.transcribestreaming#MedicalScribeTranscriptItemType\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"PRONUNCIATION\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"pronunciation\"\n                    }\n                },\n                \"PUNCTUATION\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"punctuation\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.transcribestreaming#MedicalScribeTranscriptSegment\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SegmentId\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The identifier of the segment.</p>\"\n                    }\n                },\n                \"BeginAudioTime\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#Double\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The start time, in milliseconds, of the segment.</p>\"\n                    }\n                },\n                \"EndAudioTime\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#Double\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The end time, in milliseconds, of the segment.</p>\"\n                    }\n                },\n                \"Content\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Contains transcribed text of the segment.</p>\"\n                    }\n                },\n                \"Items\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#MedicalScribeTranscriptItemList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Contains words, phrases, or punctuation marks in your segment.</p>\"\n                    }\n                },\n                \"IsPartial\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Indicates if the segment is complete.</p>\\n         <p>If <code>IsPartial</code> is <code>true</code>, the segment is not complete.\\n      If <code>IsPartial</code> is <code>false</code>, the segment is complete.\\n    </p>\"\n                    }\n                },\n                \"ChannelId\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates which audio channel is associated with the <code>MedicalScribeTranscriptSegment</code>.\\n    </p>\\n         <p>If <code>MedicalScribeChannelDefinition</code> is not provided in the <code>MedicalScribeConfigurationEvent</code>,\\n      then this field will not be included.\\n    </p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains a set of transcription results, along with additional information of the segment.</p>\"\n            }\n        },\n        \"com.amazonaws.transcribestreaming#MedicalScribeVocabularyFilterMethod\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"REMOVE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"remove\"\n                    }\n                },\n                \"MASK\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"mask\"\n                    }\n                },\n                \"TAG\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"tag\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.transcribestreaming#MedicalTranscript\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Results\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#MedicalResultList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Contains a set of transcription results from one or more audio segments, along with \\n            additional information per your request parameters. This can include information relating to \\n            alternative transcriptions, channel identification, partial result stabilization, language \\n            identification, and other transcription-related data.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The <code>MedicalTranscript</code> associated with a \\n            <code></code>.</p>\\n         <p>\\n            <code>MedicalTranscript</code> contains <code>Results</code>, which contains a set of \\n            transcription results from one or more audio segments, along with additional information per your \\n            request parameters.</p>\"\n            }\n        },\n        \"com.amazonaws.transcribestreaming#MedicalTranscriptEvent\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Transcript\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#MedicalTranscript\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Contains <code>Results</code>, which contains a set of transcription results from one or \\n            more audio segments, along with additional information per your request parameters. This can\\n            include information relating to alternative transcriptions, channel identification, partial result \\n            stabilization, language identification, and other transcription-related data.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The <code>MedicalTranscriptEvent</code> associated with a \\n            <code>MedicalTranscriptResultStream</code>.</p>\\n         <p>Contains a set of transcription results from one or more audio segments, along with additional \\n            information per your request parameters.</p>\"\n            }\n        },\n        \"com.amazonaws.transcribestreaming#MedicalTranscriptResultStream\": {\n            \"type\": \"union\",\n            \"members\": {\n                \"TranscriptEvent\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#MedicalTranscriptEvent\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The <code>MedicalTranscriptEvent</code> associated with a \\n            <code>MedicalTranscriptResultStream</code>.</p>\\n         <p>Contains a set of transcription results from one or more audio segments, along with \\n            additional information per your request parameters. This can include information relating to\\n            alternative transcriptions, channel identification, partial result stabilization, language \\n            identification, and other transcription-related data.</p>\"\n                    }\n                },\n                \"BadRequestException\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#BadRequestException\"\n                },\n                \"LimitExceededException\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#LimitExceededException\"\n                },\n                \"InternalFailureException\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#InternalFailureException\"\n                },\n                \"ConflictException\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#ConflictException\"\n                },\n                \"ServiceUnavailableException\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#ServiceUnavailableException\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains detailed information about your streaming session.</p>\",\n                \"smithy.api#streaming\": {}\n            }\n        },\n        \"com.amazonaws.transcribestreaming#ModelName\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 200\n                },\n                \"smithy.api#pattern\": \"^[0-9a-zA-Z._-]+$\"\n            }\n        },\n        \"com.amazonaws.transcribestreaming#NonEmptyString\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 2000\n                },\n                \"smithy.api#pattern\": \"\\\\S\"\n            }\n        },\n        \"com.amazonaws.transcribestreaming#NullableBoolean\": {\n            \"type\": \"boolean\"\n        },\n        \"com.amazonaws.transcribestreaming#NumberOfChannels\": {\n            \"type\": \"integer\",\n            \"traits\": {\n                \"smithy.api#range\": {\n                    \"min\": 2\n                }\n            }\n        },\n        \"com.amazonaws.transcribestreaming#PartialResultsStability\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"HIGH\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"high\"\n                    }\n                },\n                \"MEDIUM\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"medium\"\n                    }\n                },\n                \"LOW\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"low\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.transcribestreaming#ParticipantRole\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"AGENT\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"AGENT\"\n                    }\n                },\n                \"CUSTOMER\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"CUSTOMER\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.transcribestreaming#PiiEntityTypes\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 300\n                },\n                \"smithy.api#pattern\": \"^[A-Z_, ]+$\"\n            }\n        },\n        \"com.amazonaws.transcribestreaming#PointsOfInterest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"TimestampRanges\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#TimestampRanges\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Contains the timestamp ranges (start time through end time) of matched categories and rules.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the timestamps of matched categories.</p>\"\n            }\n        },\n        \"com.amazonaws.transcribestreaming#PostCallAnalyticsSettings\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"OutputLocation\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon S3 location where you want your Call Analytics post-call \\n      transcription output stored. You can use any of the following formats to specify the output \\n      location:</p>\\n         <ol>\\n            <li>\\n               <p>s3://DOC-EXAMPLE-BUCKET</p>\\n            </li>\\n            <li>\\n               <p>s3://DOC-EXAMPLE-BUCKET/my-output-folder/</p>\\n            </li>\\n            <li>\\n               <p>s3://DOC-EXAMPLE-BUCKET/my-output-folder/my-call-analytics-job.json</p>\\n            </li>\\n         </ol>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"DataAccessRoleArn\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of an IAM role that has permissions to\\n      access the Amazon S3 bucket that contains your input files. If the role that you\\n      specify doesn’t have the appropriate permissions to access the specified Amazon S3 \\n      location, your request fails.</p>\\n         <p>IAM role ARNs have the format\\n      <code>arn:partition:iam::account:role/role-name-with-path</code>. For example:\\n      <code>arn:aws:iam::111122223333:role/Admin</code>. For more information, see <a href=\\\"https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_identifiers.html#identifiers-arns\\\">IAM\\n        ARNs</a>.</p>\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ContentRedactionOutput\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#ContentRedactionOutput\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify whether you want only a redacted transcript or both a redacted and an unredacted \\n      transcript. If you choose redacted and unredacted, two JSON files are generated and stored in the \\n      Amazon S3 output location you specify.</p>\\n         <p>Note that to include <code>ContentRedactionOutput</code> in your request, you must \\n      enable content redaction (<code>ContentRedactionType</code>).</p>\"\n                    }\n                },\n                \"OutputEncryptionKMSKeyId\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The KMS key you want to use to encrypt your Call Analytics post-call\\n      output.</p>\\n         <p>If using a key located in the <b>current</b>\\n      Amazon Web Services account, you can specify your KMS key in one of four\\n      ways:</p>\\n         <ol>\\n            <li>\\n               <p>Use the KMS key ID itself. For example,\\n          <code>1234abcd-12ab-34cd-56ef-1234567890ab</code>.</p>\\n            </li>\\n            <li>\\n               <p>Use an alias for the KMS key ID. For example,\\n          <code>alias/ExampleAlias</code>.</p>\\n            </li>\\n            <li>\\n               <p>Use the Amazon Resource Name (ARN) for the KMS key ID. For\\n          example,\\n          <code>arn:aws:kms:region:account-ID:key/1234abcd-12ab-34cd-56ef-1234567890ab</code>.</p>\\n            </li>\\n            <li>\\n               <p>Use the ARN for the KMS key alias. For example,\\n          <code>arn:aws:kms:region:account-ID:alias/ExampleAlias</code>.</p>\\n            </li>\\n         </ol>\\n         <p>If using a key located in a <b>different</b>\\n      Amazon Web Services account than the current Amazon Web Services account, you can specify\\n      your KMS key in one of two ways:</p>\\n         <ol>\\n            <li>\\n               <p>Use the ARN for the KMS key ID. For example,\\n          <code>arn:aws:kms:region:account-ID:key/1234abcd-12ab-34cd-56ef-1234567890ab</code>.</p>\\n            </li>\\n            <li>\\n               <p>Use the ARN for the KMS key alias. For example,\\n          <code>arn:aws:kms:region:account-ID:alias/ExampleAlias</code>.</p>\\n            </li>\\n         </ol>\\n         <p>Note that the role making the \\n      request must have permission to use the specified KMS key.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Allows you to specify additional settings for your Call Analytics post-call request, \\n      including output locations for your redacted transcript, which IAM role to use, \\n      and which encryption key to use.</p>\\n         <p>\\n            <code>DataAccessRoleArn</code> and <code>OutputLocation</code> are required \\n      fields.</p>\\n         <p>\\n            <code>PostCallAnalyticsSettings</code> provides you with the same insights as a \\n      Call Analytics post-call transcription. Refer to <a href=\\\"https://docs.aws.amazon.com/transcribe/latest/dg/tca-post-call.html\\\">Post-call analytics</a> for more information \\n      on this feature.</p>\"\n            }\n        },\n        \"com.amazonaws.transcribestreaming#Pronouns\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"HE_HIM\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"HE_HIM\"\n                    }\n                },\n                \"SHE_HER\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"SHE_HER\"\n                    }\n                },\n                \"THEY_THEM\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"THEY_THEM\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#sensitive\": {}\n            }\n        },\n        \"com.amazonaws.transcribestreaming#RequestId\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.transcribestreaming#ResourceNotFoundException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Message\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#String\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The request references a resource which doesn't exist.</p>\",\n                \"smithy.api#error\": \"client\",\n                \"smithy.api#httpError\": 404\n            }\n        },\n        \"com.amazonaws.transcribestreaming#Result\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"ResultId\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Provides a unique identifier for the <code>Result</code>.</p>\"\n                    }\n                },\n                \"StartTime\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#Double\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The start time of the <code>Result</code> in seconds, with millisecond precision (e.g., 1.056).</p>\"\n                    }\n                },\n                \"EndTime\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#Double\",\n                    \"traits\": {\n                        \"smithy.api#default\": 0,\n                        \"smithy.api#documentation\": \"<p>The end time of the <code>Result</code> in seconds, with millisecond precision (e.g., 1.056).</p>\"\n                    }\n                },\n                \"IsPartial\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Indicates if the segment is complete.</p>\\n         <p>If <code>IsPartial</code> is <code>true</code>, the segment is not complete. If\\n        <code>IsPartial</code> is <code>false</code>, the segment is complete.</p>\"\n                    }\n                },\n                \"Alternatives\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#AlternativeList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A list of possible alternative transcriptions for the input audio. Each alternative may contain\\n      one or more of <code>Items</code>, <code>Entities</code>, or <code>Transcript</code>.</p>\"\n                    }\n                },\n                \"ChannelId\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Indicates which audio channel is associated with the <code>Result</code>.</p>\"\n                    }\n                },\n                \"LanguageCode\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#LanguageCode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The language code that represents the language spoken in your audio stream.</p>\"\n                    }\n                },\n                \"LanguageIdentification\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#LanguageIdentification\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The language code of the dominant language identified in your stream.</p>\\n         <p>If you enabled channel identification and each channel of your audio contains a different language,\\n      you may have more than one result.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The <code>Result</code> associated with a \\n      <code></code>.</p>\\n         <p>Contains a set of transcription results from one or more audio segments, along with additional \\n      information per your request parameters. This can include information relating to alternative\\n      transcriptions, channel identification, partial result stabilization, language identification, and other\\n      transcription-related data.</p>\"\n            }\n        },\n        \"com.amazonaws.transcribestreaming#ResultList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.transcribestreaming#Result\"\n            }\n        },\n        \"com.amazonaws.transcribestreaming#Sentiment\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"POSITIVE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"POSITIVE\"\n                    }\n                },\n                \"NEGATIVE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"NEGATIVE\"\n                    }\n                },\n                \"MIXED\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"MIXED\"\n                    }\n                },\n                \"NEUTRAL\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"NEUTRAL\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.transcribestreaming#ServiceUnavailableException\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Message\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#String\"\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The service is currently unavailable. Try your request later.</p>\",\n                \"smithy.api#error\": \"server\",\n                \"smithy.api#httpError\": 503\n            }\n        },\n        \"com.amazonaws.transcribestreaming#SessionId\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 36,\n                    \"max\": 36\n                },\n                \"smithy.api#pattern\": \"^[a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12}$\"\n            }\n        },\n        \"com.amazonaws.transcribestreaming#Specialty\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"PRIMARYCARE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"PRIMARYCARE\"\n                    }\n                },\n                \"CARDIOLOGY\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"CARDIOLOGY\"\n                    }\n                },\n                \"NEUROLOGY\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"NEUROLOGY\"\n                    }\n                },\n                \"ONCOLOGY\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"ONCOLOGY\"\n                    }\n                },\n                \"RADIOLOGY\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"RADIOLOGY\"\n                    }\n                },\n                \"UROLOGY\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"UROLOGY\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.transcribestreaming#Stable\": {\n            \"type\": \"boolean\"\n        },\n        \"com.amazonaws.transcribestreaming#StartCallAnalyticsStreamTranscription\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.transcribestreaming#StartCallAnalyticsStreamTranscriptionRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.transcribestreaming#StartCallAnalyticsStreamTranscriptionResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.transcribestreaming#BadRequestException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.transcribestreaming#ConflictException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.transcribestreaming#InternalFailureException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.transcribestreaming#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.transcribestreaming#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Starts a bidirectional HTTP/2 or WebSocket stream where audio is streamed to \\n      Amazon Transcribe and the transcription results are streamed to your application. Use this operation\\n      for <a href=\\\"https://docs.aws.amazon.com/transcribe/latest/dg/call-analytics.html\\\">Call Analytics</a> transcriptions.</p>\\n         <p>The following parameters are required:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>language-code</code> or <code>identify-language</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>media-encoding</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>sample-rate</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>For more information on streaming with Amazon Transcribe, see <a href=\\\"https://docs.aws.amazon.com/transcribe/latest/dg/streaming.html\\\">Transcribing streaming audio</a>.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"POST\",\n                    \"uri\": \"/call-analytics-stream-transcription\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.transcribestreaming#StartCallAnalyticsStreamTranscriptionRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LanguageCode\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#CallAnalyticsLanguageCode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify the language code that represents the language spoken in your audio.</p>\\n         <p>For a list of languages supported with real-time Call Analytics, refer to the \\n      <a href=\\\"https://docs.aws.amazon.com/transcribe/latest/dg/supported-languages.html\\\">Supported \\n        languages</a> table.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-language-code\"\n                    }\n                },\n                \"MediaSampleRateHertz\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#MediaSampleRateHertz\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The sample rate of the input audio (in hertz). Low-quality audio, such as telephone audio,\\n      is typically around 8,000 Hz. High-quality audio typically ranges from 16,000 Hz to 48,000 Hz.\\n      Note that the sample rate you specify must match that of your audio.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-sample-rate\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"MediaEncoding\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#MediaEncoding\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify the encoding of your input audio. Supported formats are:</p>\\n         <ul>\\n            <li>\\n               <p>FLAC</p>\\n            </li>\\n            <li>\\n               <p>OPUS-encoded audio in an Ogg container</p>\\n            </li>\\n            <li>\\n               <p>PCM (only signed 16-bit little-endian audio formats, which does not include WAV)</p>\\n            </li>\\n         </ul>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/transcribe/latest/dg/how-input.html#how-input-audio\\\">Media formats</a>.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-media-encoding\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"VocabularyName\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#VocabularyName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify the name of the custom vocabulary that you want to use when processing your\\n      transcription. Note that vocabulary names are case sensitive.</p>\\n         <p>If the language of the specified custom vocabulary doesn't match the language identified in\\n      your media, the custom vocabulary is not applied to your transcription.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/transcribe/latest/dg/custom-vocabulary.html\\\">Custom vocabularies</a>.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-vocabulary-name\"\n                    }\n                },\n                \"SessionId\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#SessionId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify a name for your Call Analytics transcription session. If you don't include this parameter\\n      in your request, Amazon Transcribe generates an ID and returns it in the response.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-session-id\"\n                    }\n                },\n                \"AudioStream\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#AudioStream\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An encoded stream of audio blobs. Audio streams are encoded as either HTTP/2 or WebSocket \\n      data frames.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/transcribe/latest/dg/streaming.html\\\">Transcribing streaming audio</a>.</p>\",\n                        \"smithy.api#httpPayload\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"VocabularyFilterName\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#VocabularyFilterName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify the name of the custom vocabulary filter that you want to use when processing your\\n      transcription. Note that vocabulary filter names are case sensitive.</p>\\n         <p>If the language of the specified custom vocabulary filter doesn't match the language identified in\\n      your media, the vocabulary filter is not applied to your transcription.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/transcribe/latest/dg/vocabulary-filtering.html\\\">Using vocabulary filtering with unwanted \\n      words</a>.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-vocabulary-filter-name\"\n                    }\n                },\n                \"VocabularyFilterMethod\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#VocabularyFilterMethod\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify how you want your vocabulary filter applied to your transcript.</p>\\n         <p>To replace words with <code>***</code>, choose <code>mask</code>.</p>\\n         <p>To delete words, choose <code>remove</code>.</p>\\n         <p>To flag words without changing them, choose <code>tag</code>.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-vocabulary-filter-method\"\n                    }\n                },\n                \"LanguageModelName\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#ModelName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify the name of the custom language model that you want to use when processing your\\n      transcription. Note that language model names are case sensitive.</p>\\n         <p>The language of the specified language model must match the language code you specify\\n      in your transcription request. If the languages don't match, the custom language model isn't applied. \\n      There are no errors or warnings associated with a language mismatch.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/transcribe/latest/dg/custom-language-models.html\\\">Custom language models</a>.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-language-model-name\"\n                    }\n                },\n                \"IdentifyLanguage\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Enables automatic language identification for your Call Analytics transcription.</p>\\n         <p>If you include <code>IdentifyLanguage</code>, you must include a list of\\n      language codes, using <code>LanguageOptions</code>, that you think may be present in \\n      your audio stream. You must provide a minimum of two language selections.</p>\\n         <p>You can also include a preferred language using <code>PreferredLanguage</code>. Adding a \\n      preferred language can help Amazon Transcribe identify the language faster than if you omit this \\n      parameter.</p>\\n         <p>Note that you must include either <code>LanguageCode</code> or \\n      <code>IdentifyLanguage</code> in your request. If you include both parameters, your transcription job\\n      fails.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-identify-language\"\n                    }\n                },\n                \"LanguageOptions\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#LanguageOptions\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify two or more language codes that represent the languages you think may be present \\n      in your media.</p>\\n         <p>Including language options can improve the accuracy of language identification.</p>\\n         <p>If you include <code>LanguageOptions</code> in your request, you must also include \\n      <code>IdentifyLanguage</code>.</p>\\n         <p>For a list of languages supported with Call Analytics streaming, refer to the \\n      <a href=\\\"https://docs.aws.amazon.com/transcribe/latest/dg/supported-languages.html\\\">Supported \\n        languages</a> table.</p>\\n         <important>\\n            <p>You can only include one language dialect per language per stream. For example, you\\n        cannot include <code>en-US</code> and <code>en-AU</code> in the same request.</p>\\n         </important>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-language-options\"\n                    }\n                },\n                \"PreferredLanguage\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#CallAnalyticsLanguageCode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify a preferred language from the subset of languages codes you specified in \\n      <code>LanguageOptions</code>.</p>\\n         <p>You can only use this parameter if you've included <code>IdentifyLanguage</code> and\\n        <code>LanguageOptions</code> in your request.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-preferred-language\"\n                    }\n                },\n                \"VocabularyNames\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#VocabularyNames\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify the names of the custom vocabularies that you want to use when processing your\\n      Call Analytics transcription. Note that vocabulary names are case sensitive.</p>\\n         <p>If the custom vocabulary's language doesn't match the identified media language, it won't be applied to the transcription.</p>\\n         <important>\\n            <p>This parameter is only intended for use <b>with</b> the\\n          <code>IdentifyLanguage</code> parameter. If you're <b>not</b>\\n        including <code>IdentifyLanguage</code> in your request and want to use a custom vocabulary\\n        with your transcription, use the <code>VocabularyName</code> parameter instead.</p>\\n         </important>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/transcribe/latest/dg/custom-vocabulary.html\\\">Custom vocabularies</a>.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-vocabulary-names\"\n                    }\n                },\n                \"VocabularyFilterNames\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#VocabularyFilterNames\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify the names of the custom vocabulary filters that you want to use when processing\\n      your Call Analytics transcription. Note that vocabulary filter names are case sensitive.</p>\\n         <p>These filters serve to customize the transcript output.</p>\\n         <important>\\n            <p>This parameter is only intended for use <b>with</b> \\n        the <code>IdentifyLanguage</code> parameter. If you're <b>not</b> \\n        including <code>IdentifyLanguage</code> in your request and want to use a custom vocabulary filter \\n        with your transcription, use the <code>VocabularyFilterName</code> parameter instead.</p>\\n         </important>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/transcribe/latest/dg/vocabulary-filtering.html\\\">Using vocabulary filtering with unwanted \\n      words</a>.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-vocabulary-filter-names\"\n                    }\n                },\n                \"EnablePartialResultsStabilization\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Enables partial result stabilization for your transcription. Partial result stabilization can reduce\\n      latency in your output, but may impact accuracy. For more information, see \\n      <a href=\\\"https://docs.aws.amazon.com/transcribe/latest/dg/streaming.html#streaming-partial-result-stabilization\\\">Partial-result \\n        stabilization</a>.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-enable-partial-results-stabilization\"\n                    }\n                },\n                \"PartialResultsStability\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#PartialResultsStability\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify the level of stability to use when you enable partial results stabilization \\n      (<code>EnablePartialResultsStabilization</code>).</p>\\n         <p>Low stability provides the highest accuracy. High stability transcribes faster, but with slightly\\n      lower accuracy.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/transcribe/latest/dg/streaming.html#streaming-partial-result-stabilization\\\">Partial-result \\n      stabilization</a>.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-partial-results-stability\"\n                    }\n                },\n                \"ContentIdentificationType\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#ContentIdentificationType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Labels all personally identifiable information (PII) identified in your transcript.</p>\\n         <p>Content identification is performed at the segment level; PII specified in \\n      <code>PiiEntityTypes</code> is flagged upon complete transcription of an audio segment. If you don't\\n      include <code>PiiEntityTypes</code> in your request, all PII is identified.</p>\\n         <p>You can’t set <code>ContentIdentificationType</code> and <code>ContentRedactionType</code>\\n      in the same request. If you set both, your request returns a\\n      <code>BadRequestException</code>.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/transcribe/latest/dg/pii-redaction.html\\\">Redacting or identifying personally identifiable\\n      information</a>.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-content-identification-type\"\n                    }\n                },\n                \"ContentRedactionType\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#ContentRedactionType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Redacts all personally identifiable information (PII) identified in your transcript.</p>\\n         <p>Content redaction is performed at the segment level; PII specified in \\n      <code>PiiEntityTypes</code> is redacted upon complete transcription of an audio segment. If you don't\\n      include <code>PiiEntityTypes</code> in your request, all PII is redacted.</p>\\n         <p>You can’t set <code>ContentRedactionType</code> and <code>ContentIdentificationType</code>\\n      in the same request. If you set both, your request returns a <code>BadRequestException</code>.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/transcribe/latest/dg/pii-redaction.html\\\">Redacting or identifying personally identifiable\\n      information</a>.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-content-redaction-type\"\n                    }\n                },\n                \"PiiEntityTypes\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#PiiEntityTypes\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify which types of personally identifiable information (PII) you want to redact in your \\n      transcript. You can include as many types as you'd like, or you can select \\n      <code>ALL</code>.</p>\\n         <p>Values must be comma-separated and can include: <code>ADDRESS</code>, \\n      <code>BANK_ACCOUNT_NUMBER</code>, <code>BANK_ROUTING</code>,\\n      <code>CREDIT_DEBIT_CVV</code>, <code>CREDIT_DEBIT_EXPIRY</code>,\\n      <code>CREDIT_DEBIT_NUMBER</code>, <code>EMAIL</code>, \\n      <code>NAME</code>, <code>PHONE</code>, <code>PIN</code>, \\n      <code>SSN</code>, or <code>ALL</code>.</p>\\n         <p>Note that if you include <code>PiiEntityTypes</code> in your request, you must also include \\n      <code>ContentIdentificationType</code> or <code>ContentRedactionType</code>.</p>\\n         <p>If you include <code>ContentRedactionType</code> or \\n      <code>ContentIdentificationType</code> in your request, but do not include \\n      <code>PiiEntityTypes</code>, all PII is redacted or identified.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-pii-entity-types\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.transcribestreaming#StartCallAnalyticsStreamTranscriptionResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RequestId\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#RequestId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Provides the identifier for your real-time Call Analytics request.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-request-id\"\n                    }\n                },\n                \"LanguageCode\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#CallAnalyticsLanguageCode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Provides the language code that you specified in your Call Analytics request.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-language-code\"\n                    }\n                },\n                \"MediaSampleRateHertz\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#MediaSampleRateHertz\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Provides the sample rate that you specified in your Call Analytics request.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-sample-rate\"\n                    }\n                },\n                \"MediaEncoding\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#MediaEncoding\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Provides the media encoding you specified in your Call Analytics request.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-media-encoding\"\n                    }\n                },\n                \"VocabularyName\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#VocabularyName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Provides the name of the custom vocabulary that you specified in your Call Analytics request.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-vocabulary-name\"\n                    }\n                },\n                \"SessionId\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#SessionId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Provides the identifier for your Call Analytics transcription session.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-session-id\"\n                    }\n                },\n                \"CallAnalyticsTranscriptResultStream\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#CallAnalyticsTranscriptResultStream\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Provides detailed information about your real-time Call Analytics session.</p>\",\n                        \"smithy.api#httpPayload\": {}\n                    }\n                },\n                \"VocabularyFilterName\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#VocabularyFilterName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Provides the name of the custom vocabulary filter that you specified in your Call Analytics\\n      request.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-vocabulary-filter-name\"\n                    }\n                },\n                \"VocabularyFilterMethod\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#VocabularyFilterMethod\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Provides the vocabulary filtering method used in your Call Analytics transcription.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-vocabulary-filter-method\"\n                    }\n                },\n                \"LanguageModelName\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#ModelName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Provides the name of the custom language model that you specified in your Call Analytics \\n      request.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-language-model-name\"\n                    }\n                },\n                \"IdentifyLanguage\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Shows whether automatic language identification was enabled for your Call Analytics transcription.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-identify-language\"\n                    }\n                },\n                \"LanguageOptions\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#LanguageOptions\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Provides the language codes that you specified in your Call Analytics request.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-language-options\"\n                    }\n                },\n                \"PreferredLanguage\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#CallAnalyticsLanguageCode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Provides the preferred language that you specified in your Call Analytics request.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-preferred-language\"\n                    }\n                },\n                \"VocabularyNames\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#VocabularyNames\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Provides the names of the custom vocabularies that you specified in your Call Analytics request.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-vocabulary-names\"\n                    }\n                },\n                \"VocabularyFilterNames\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#VocabularyFilterNames\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Provides the names of the custom vocabulary filters that you specified in your Call Analytics request.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-vocabulary-filter-names\"\n                    }\n                },\n                \"EnablePartialResultsStabilization\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Shows whether partial results stabilization was enabled for your Call Analytics transcription.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-enable-partial-results-stabilization\"\n                    }\n                },\n                \"PartialResultsStability\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#PartialResultsStability\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Provides the stabilization level used for your transcription.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-partial-results-stability\"\n                    }\n                },\n                \"ContentIdentificationType\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#ContentIdentificationType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Shows whether content identification was enabled for your Call Analytics transcription.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-content-identification-type\"\n                    }\n                },\n                \"ContentRedactionType\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#ContentRedactionType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Shows whether content redaction was enabled for your Call Analytics transcription.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-content-redaction-type\"\n                    }\n                },\n                \"PiiEntityTypes\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#PiiEntityTypes\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Lists the PII entity types you specified in your Call Analytics request.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-pii-entity-types\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.transcribestreaming#StartMedicalScribeStream\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.transcribestreaming#StartMedicalScribeStreamRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.transcribestreaming#StartMedicalScribeStreamResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.transcribestreaming#BadRequestException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.transcribestreaming#ConflictException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.transcribestreaming#InternalFailureException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.transcribestreaming#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.transcribestreaming#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Starts a bidirectional HTTP/2 stream, where audio is streamed to\\n      Amazon Web Services HealthScribe\\n      and the transcription results are streamed to your application.</p>\\n         <p>When you start a stream, you first specify the stream configuration in a <code>MedicalScribeConfigurationEvent</code>. \\n      This event includes channel definitions, encryption settings, medical scribe context, and post-stream analytics settings, such as the output configuration for aggregated transcript and clinical note generation. These are additional\\n      streaming session configurations beyond those provided in your initial start request headers. Whether you are starting a new session or resuming an existing session, \\n      your first event must be a <code>MedicalScribeConfigurationEvent</code>. </p>\\n         <p>\\n      After you send a <code>MedicalScribeConfigurationEvent</code>, you start <code>AudioEvents</code> and Amazon Web Services HealthScribe \\n      responds with real-time transcription results. When you are finished, to start processing the results with the post-stream analytics, send a <code>MedicalScribeSessionControlEvent</code> with a <code>Type</code> of \\n      <code>END_OF_SESSION</code> and Amazon Web Services HealthScribe starts the analytics.\\n    </p>\\n         <p>You can pause or resume streaming.\\n     To pause streaming, complete the input stream without sending the\\n      <code>MedicalScribeSessionControlEvent</code>.\\n      To resume streaming, call the <code>StartMedicalScribeStream</code> and specify the same SessionId you used to start the stream.\\n    </p>\\n         <p>The following parameters are required:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>language-code</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>media-encoding</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>media-sample-rate-hertz</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p></p>\\n         <p>For more information on streaming with\\n      Amazon Web Services HealthScribe,\\n      see <a href=\\\"https://docs.aws.amazon.com/transcribe/latest/dg/health-scribe-streaming.html\\\">Amazon Web Services HealthScribe</a>.\\n    </p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"POST\",\n                    \"uri\": \"/medical-scribe-stream\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.transcribestreaming#StartMedicalScribeStreamRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SessionId\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#SessionId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify an identifier for your streaming session (in UUID format).\\n      If you don't include a SessionId in your request,\\n      Amazon Web Services HealthScribe generates an ID and returns it in the response.\\n    </p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-session-id\"\n                    }\n                },\n                \"LanguageCode\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#MedicalScribeLanguageCode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify the language code for your HealthScribe streaming session.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-language-code\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"MediaSampleRateHertz\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#MedicalScribeMediaSampleRateHertz\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify the sample rate of the input audio (in hertz).\\n      Amazon Web Services HealthScribe supports a range from 16,000 Hz to 48,000 Hz.\\n      The sample rate you specify must match that of your audio.\\n    </p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-sample-rate\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"MediaEncoding\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#MedicalScribeMediaEncoding\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify the encoding used for the input audio.</p>\\n         <p>Supported formats are:</p>\\n         <ul>\\n            <li>\\n               <p>FLAC</p>\\n            </li>\\n            <li>\\n               <p>OPUS-encoded audio in an Ogg container</p>\\n            </li>\\n            <li>\\n               <p>PCM (only signed 16-bit little-endian audio formats, which does not include\\n          WAV)\\n        </p>\\n            </li>\\n         </ul>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/transcribe/latest/dg/how-input.html#how-input-audio\\\">Media\\n      formats</a>.\\n    </p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-media-encoding\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"InputStream\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#MedicalScribeInputStream\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify the input stream where you will send events in real time.</p>\\n         <p>The first element of the input stream must be a <code>MedicalScribeConfigurationEvent</code>.\\n    </p>\",\n                        \"smithy.api#httpPayload\": {},\n                        \"smithy.api#required\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.transcribestreaming#StartMedicalScribeStreamResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"SessionId\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#SessionId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The identifier (in UUID format) for your streaming session.</p>\\n         <p>If you already started streaming, this is same ID as the one you specified in your initial <code>StartMedicalScribeStreamRequest</code>.\\n    </p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-session-id\"\n                    }\n                },\n                \"RequestId\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#RequestId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The unique identifier for your streaming request.\\n    </p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-request-id\"\n                    }\n                },\n                \"LanguageCode\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#MedicalScribeLanguageCode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Language Code that you specified in your request.\\n      Same as provided in the <code>StartMedicalScribeStreamRequest</code>.\\n    </p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-language-code\"\n                    }\n                },\n                \"MediaSampleRateHertz\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#MedicalScribeMediaSampleRateHertz\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The sample rate (in hertz) that you specified in your request.\\n      Same as provided in the\\n      <code>StartMedicalScribeStreamRequest</code>\\n         </p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-sample-rate\"\n                    }\n                },\n                \"MediaEncoding\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#MedicalScribeMediaEncoding\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The Media Encoding you specified in your request.\\n      Same as provided in the\\n      <code>StartMedicalScribeStreamRequest</code>\\n         </p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-media-encoding\"\n                    }\n                },\n                \"ResultStream\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#MedicalScribeResultStream\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The result stream where you will receive the output events.\\n    </p>\",\n                        \"smithy.api#httpPayload\": {}\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.transcribestreaming#StartMedicalStreamTranscription\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.transcribestreaming#StartMedicalStreamTranscriptionRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.transcribestreaming#StartMedicalStreamTranscriptionResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.transcribestreaming#BadRequestException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.transcribestreaming#ConflictException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.transcribestreaming#InternalFailureException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.transcribestreaming#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.transcribestreaming#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Starts a bidirectional HTTP/2 or WebSocket stream where audio is streamed to \\n            Amazon Transcribe Medical and the transcription results are streamed to your\\n            application.</p>\\n         <p>The following parameters are required:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>language-code</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>media-encoding</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>sample-rate</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>For more information on streaming with Amazon Transcribe Medical, see \\n            <a href=\\\"https://docs.aws.amazon.com/transcribe/latest/dg/streaming.html\\\">Transcribing\\n                streaming audio</a>.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"POST\",\n                    \"uri\": \"/medical-stream-transcription\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.transcribestreaming#StartMedicalStreamTranscriptionRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LanguageCode\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#LanguageCode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify the language code that represents the language spoken in your audio.</p>\\n         <important>\\n            <p>Amazon Transcribe Medical only supports US English (<code>en-US</code>).</p>\\n         </important>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-language-code\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"MediaSampleRateHertz\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#MediaSampleRateHertz\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The sample rate of the input audio (in hertz). Amazon Transcribe Medical supports a\\n            range from 16,000 Hz to 48,000 Hz. Note that the sample rate you specify must match that\\n            of your audio.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-sample-rate\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"MediaEncoding\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#MediaEncoding\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify the encoding used for the input audio. Supported formats are:</p>\\n         <ul>\\n            <li>\\n               <p>FLAC</p>\\n            </li>\\n            <li>\\n               <p>OPUS-encoded audio in an Ogg container</p>\\n            </li>\\n            <li>\\n               <p>PCM (only signed 16-bit little-endian audio formats, which does not include\\n                    WAV)</p>\\n            </li>\\n         </ul>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/transcribe/latest/dg/how-input.html#how-input-audio\\\">Media formats</a>.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-media-encoding\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"VocabularyName\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#VocabularyName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify the name of the custom vocabulary that you want to use when processing your\\n            transcription. Note that vocabulary names are case sensitive.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-vocabulary-name\"\n                    }\n                },\n                \"Specialty\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#Specialty\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify the medical specialty contained in your audio.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-specialty\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"Type\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#Type\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify the type of input audio. For example, choose <code>DICTATION</code> for a \\n            provider dictating patient notes and <code>CONVERSATION</code> for a dialogue between a\\n            patient and a medical professional.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-type\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"ShowSpeakerLabel\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Enables speaker partitioning (diarization) in your transcription output. Speaker\\n            partitioning labels the speech from individual speakers in your media file.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/transcribe/latest/dg/diarization.html\\\">Partitioning speakers (diarization)</a>.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-show-speaker-label\"\n                    }\n                },\n                \"SessionId\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#SessionId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify a name for your transcription session. If you don't include this parameter in \\n            your request, Amazon Transcribe Medical generates an ID and returns it in the\\n            response.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-session-id\"\n                    }\n                },\n                \"AudioStream\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#AudioStream\",\n                    \"traits\": {\n                        \"smithy.api#httpPayload\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"EnableChannelIdentification\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Enables channel identification in multi-channel audio.</p>\\n         <p>Channel identification transcribes the audio on each channel independently, then appends\\n            the output for each channel into one transcript.</p>\\n         <p>If you have multi-channel audio and do not enable channel identification, your audio is \\n            transcribed in a continuous manner and your transcript is not separated by channel.</p>\\n         <p>If you include <code>EnableChannelIdentification</code> in your request, you must also \\n            include <code>NumberOfChannels</code>.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/transcribe/latest/dg/channel-id.html\\\">Transcribing multi-channel audio</a>.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-enable-channel-identification\"\n                    }\n                },\n                \"NumberOfChannels\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#NumberOfChannels\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify the number of channels in your audio stream. This value must be \\n            <code>2</code>, as only two channels are supported. If your audio doesn't contain \\n            multiple channels, do not include this parameter in your request.</p>\\n         <p>If you include <code>NumberOfChannels</code> in your request, you must also \\n            include <code>EnableChannelIdentification</code>.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-number-of-channels\"\n                    }\n                },\n                \"ContentIdentificationType\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#MedicalContentIdentificationType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Labels all personal health information (PHI) identified in your transcript.</p>\\n         <p>Content identification is performed at the segment level; PHI is flagged upon complete\\n            transcription of an audio segment.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/transcribe/latest/dg/phi-id.html\\\">Identifying personal health information (PHI) in a\\n            transcription</a>.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-content-identification-type\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.transcribestreaming#StartMedicalStreamTranscriptionResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RequestId\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#RequestId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Provides the identifier for your streaming request.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-request-id\"\n                    }\n                },\n                \"LanguageCode\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#LanguageCode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Provides the language code that you specified in your request. This must be\\n                <code>en-US</code>.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-language-code\"\n                    }\n                },\n                \"MediaSampleRateHertz\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#MediaSampleRateHertz\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Provides the sample rate that you specified in your request.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-sample-rate\"\n                    }\n                },\n                \"MediaEncoding\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#MediaEncoding\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Provides the media encoding you specified in your request.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-media-encoding\"\n                    }\n                },\n                \"VocabularyName\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#VocabularyName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Provides the name of the custom vocabulary that you specified in your request.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-vocabulary-name\"\n                    }\n                },\n                \"Specialty\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#Specialty\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Provides the medical specialty that you specified in your request.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-specialty\"\n                    }\n                },\n                \"Type\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#Type\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Provides the type of audio you specified in your request.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-type\"\n                    }\n                },\n                \"ShowSpeakerLabel\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Shows whether speaker partitioning was enabled for your transcription.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-show-speaker-label\"\n                    }\n                },\n                \"SessionId\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#SessionId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Provides the identifier for your transcription session.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-session-id\"\n                    }\n                },\n                \"TranscriptResultStream\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#MedicalTranscriptResultStream\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Provides detailed information about your streaming session.</p>\",\n                        \"smithy.api#httpPayload\": {}\n                    }\n                },\n                \"EnableChannelIdentification\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Shows whether channel identification was enabled for your transcription.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-enable-channel-identification\"\n                    }\n                },\n                \"NumberOfChannels\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#NumberOfChannels\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Provides the number of channels that you specified in your request.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-number-of-channels\"\n                    }\n                },\n                \"ContentIdentificationType\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#MedicalContentIdentificationType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Shows whether content identification was enabled for your transcription.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-content-identification-type\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.transcribestreaming#StartStreamTranscription\": {\n            \"type\": \"operation\",\n            \"input\": {\n                \"target\": \"com.amazonaws.transcribestreaming#StartStreamTranscriptionRequest\"\n            },\n            \"output\": {\n                \"target\": \"com.amazonaws.transcribestreaming#StartStreamTranscriptionResponse\"\n            },\n            \"errors\": [\n                {\n                    \"target\": \"com.amazonaws.transcribestreaming#BadRequestException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.transcribestreaming#ConflictException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.transcribestreaming#InternalFailureException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.transcribestreaming#LimitExceededException\"\n                },\n                {\n                    \"target\": \"com.amazonaws.transcribestreaming#ServiceUnavailableException\"\n                }\n            ],\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Starts a bidirectional HTTP/2 or WebSocket stream where audio is streamed to \\n      Amazon Transcribe and the transcription results are streamed to your application.</p>\\n         <p>The following parameters are required:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>language-code</code> or <code>identify-language</code> or <code>identify-multiple-language</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>media-encoding</code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>sample-rate</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>For more information on streaming with Amazon Transcribe, see <a href=\\\"https://docs.aws.amazon.com/transcribe/latest/dg/streaming.html\\\">Transcribing streaming audio</a>.</p>\",\n                \"smithy.api#http\": {\n                    \"method\": \"POST\",\n                    \"uri\": \"/stream-transcription\",\n                    \"code\": 200\n                }\n            }\n        },\n        \"com.amazonaws.transcribestreaming#StartStreamTranscriptionRequest\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"LanguageCode\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#LanguageCode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify the language code that represents the language spoken in your audio.</p>\\n         <p>If you're unsure of the language spoken in your audio, consider using \\n      <code>IdentifyLanguage</code> to enable automatic language identification.</p>\\n         <p>For a list of languages supported with Amazon Transcribe streaming, refer to the \\n      <a href=\\\"https://docs.aws.amazon.com/transcribe/latest/dg/supported-languages.html\\\">Supported \\n        languages</a> table.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-language-code\"\n                    }\n                },\n                \"MediaSampleRateHertz\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#MediaSampleRateHertz\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The sample rate of the input audio (in hertz). Low-quality audio, such as telephone audio,\\n      is typically around 8,000 Hz. High-quality audio typically ranges from 16,000 Hz to 48,000 Hz.\\n      Note that the sample rate you specify must match that of your audio.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-sample-rate\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"MediaEncoding\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#MediaEncoding\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify the encoding of your input audio. Supported formats are:</p>\\n         <ul>\\n            <li>\\n               <p>FLAC</p>\\n            </li>\\n            <li>\\n               <p>OPUS-encoded audio in an Ogg container</p>\\n            </li>\\n            <li>\\n               <p>PCM (only signed 16-bit little-endian audio formats, which does not include WAV)</p>\\n            </li>\\n         </ul>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/transcribe/latest/dg/how-input.html#how-input-audio\\\">Media formats</a>.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-media-encoding\",\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"VocabularyName\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#VocabularyName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify the name of the custom vocabulary that you want to use when processing your\\n      transcription. Note that vocabulary names are case sensitive.</p>\\n         <p>If the language of the specified custom vocabulary doesn't match the language identified in\\n      your media, the custom vocabulary is not applied to your transcription.</p>\\n         <important>\\n            <p>This parameter is <b>not</b> intended for use with the\\n          <code>IdentifyLanguage</code> parameter. If you're including <code>IdentifyLanguage</code>\\n        in your request and want to use one or more custom vocabularies with your transcription, use\\n        the <code>VocabularyNames</code> parameter instead.</p>\\n         </important>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/transcribe/latest/dg/custom-vocabulary.html\\\">Custom vocabularies</a>.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-vocabulary-name\"\n                    }\n                },\n                \"SessionId\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#SessionId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify a name for your transcription session. If you don't include this parameter in your request, \\n      Amazon Transcribe generates an ID and returns it in the response.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-session-id\"\n                    }\n                },\n                \"AudioStream\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#AudioStream\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>An encoded stream of audio blobs. Audio streams are encoded as either HTTP/2 or WebSocket \\n      data frames.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/transcribe/latest/dg/streaming.html\\\">Transcribing streaming audio</a>.</p>\",\n                        \"smithy.api#httpPayload\": {},\n                        \"smithy.api#required\": {}\n                    }\n                },\n                \"VocabularyFilterName\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#VocabularyFilterName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify the name of the custom vocabulary filter that you want to use when processing your\\n      transcription. Note that vocabulary filter names are case sensitive.</p>\\n         <p>If the language of the specified custom vocabulary filter doesn't match the language identified in\\n      your media, the vocabulary filter is not applied to your transcription.</p>\\n         <important>\\n            <p>This parameter is <b>not</b> intended for use with the\\n          <code>IdentifyLanguage</code> parameter. If you're including <code>IdentifyLanguage</code>\\n        in your request and want to use one or more vocabulary filters with your transcription, use\\n        the <code>VocabularyFilterNames</code> parameter instead.</p>\\n         </important>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/transcribe/latest/dg/vocabulary-filtering.html\\\">Using vocabulary filtering with unwanted \\n      words</a>.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-vocabulary-filter-name\"\n                    }\n                },\n                \"VocabularyFilterMethod\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#VocabularyFilterMethod\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify how you want your vocabulary filter applied to your transcript.</p>\\n         <p>To replace words with <code>***</code>, choose <code>mask</code>.</p>\\n         <p>To delete words, choose <code>remove</code>.</p>\\n         <p>To flag words without changing them, choose <code>tag</code>.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-vocabulary-filter-method\"\n                    }\n                },\n                \"ShowSpeakerLabel\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Enables speaker partitioning (diarization) in your transcription output. Speaker partitioning \\n      labels the speech from individual speakers in your media file.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/transcribe/latest/dg/diarization.html\\\">Partitioning speakers (diarization)</a>.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-show-speaker-label\"\n                    }\n                },\n                \"EnableChannelIdentification\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Enables channel identification in multi-channel audio.</p>\\n         <p>Channel identification transcribes the audio on each channel independently, then appends the \\n      output for each channel into one transcript.</p>\\n         <p>If you have multi-channel audio and do not enable channel identification, your audio is \\n      transcribed in a continuous manner and your transcript is not separated by channel.</p>\\n         <p>If you include <code>EnableChannelIdentification</code> in your request, you must also \\n      include <code>NumberOfChannels</code>.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/transcribe/latest/dg/channel-id.html\\\">Transcribing multi-channel audio</a>.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-enable-channel-identification\"\n                    }\n                },\n                \"NumberOfChannels\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#NumberOfChannels\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify the number of channels in your audio stream. This value must be \\n      <code>2</code>, as only two channels are supported. If your audio doesn't contain \\n      multiple channels, do not include this parameter in your request.</p>\\n         <p>If you include <code>NumberOfChannels</code> in your request, you must also \\n      include <code>EnableChannelIdentification</code>.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-number-of-channels\"\n                    }\n                },\n                \"EnablePartialResultsStabilization\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Enables partial result stabilization for your transcription. Partial result stabilization can reduce\\n      latency in your output, but may impact accuracy. For more information, see \\n      <a href=\\\"https://docs.aws.amazon.com/transcribe/latest/dg/streaming.html#streaming-partial-result-stabilization\\\">Partial-result \\n      stabilization</a>.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-enable-partial-results-stabilization\"\n                    }\n                },\n                \"PartialResultsStability\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#PartialResultsStability\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify the level of stability to use when you enable partial results stabilization \\n      (<code>EnablePartialResultsStabilization</code>).</p>\\n         <p>Low stability provides the highest accuracy. High stability transcribes faster, but with slightly\\n      lower accuracy.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/transcribe/latest/dg/streaming.html#streaming-partial-result-stabilization\\\">Partial-result \\n      stabilization</a>.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-partial-results-stability\"\n                    }\n                },\n                \"ContentIdentificationType\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#ContentIdentificationType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Labels all personally identifiable information (PII) identified in your transcript.</p>\\n         <p>Content identification is performed at the segment level; PII specified in \\n      <code>PiiEntityTypes</code> is flagged upon complete transcription of an audio segment. If you don't\\n      include <code>PiiEntityTypes</code> in your request, all PII is identified.</p>\\n         <p>You can’t set <code>ContentIdentificationType</code> and <code>ContentRedactionType</code>\\n      in the same request. If you set both, your request returns a\\n      <code>BadRequestException</code>.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/transcribe/latest/dg/pii-redaction.html\\\">Redacting or identifying personally identifiable\\n      information</a>.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-content-identification-type\"\n                    }\n                },\n                \"ContentRedactionType\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#ContentRedactionType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Redacts all personally identifiable information (PII) identified in your transcript.</p>\\n         <p>Content redaction is performed at the segment level; PII specified in \\n      <code>PiiEntityTypes</code> is redacted upon complete transcription of an audio segment. If you don't\\n      include <code>PiiEntityTypes</code> in your request, all PII is redacted.</p>\\n         <p>You can’t set <code>ContentRedactionType</code> and <code>ContentIdentificationType</code>\\n      in the same request. If you set both, your request returns a <code>BadRequestException</code>.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/transcribe/latest/dg/pii-redaction.html\\\">Redacting or identifying personally identifiable\\n      information</a>.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-content-redaction-type\"\n                    }\n                },\n                \"PiiEntityTypes\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#PiiEntityTypes\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify which types of personally identifiable information (PII) you want to redact in your \\n      transcript. You can include as many types as you'd like, or you can select \\n      <code>ALL</code>.</p>\\n         <p>Values must be comma-separated and can include: <code>ADDRESS</code>, \\n      <code>BANK_ACCOUNT_NUMBER</code>, <code>BANK_ROUTING</code>,\\n      <code>CREDIT_DEBIT_CVV</code>, <code>CREDIT_DEBIT_EXPIRY</code>,\\n      <code>CREDIT_DEBIT_NUMBER</code>, <code>EMAIL</code>, \\n      <code>NAME</code>, <code>PHONE</code>, <code>PIN</code>, \\n      <code>SSN</code>, or <code>ALL</code>.</p>\\n         <p>Note that if you include <code>PiiEntityTypes</code> in your request, you must also include \\n      <code>ContentIdentificationType</code> or <code>ContentRedactionType</code>.</p>\\n         <p>If you include <code>ContentRedactionType</code> or \\n      <code>ContentIdentificationType</code> in your request, but do not include \\n      <code>PiiEntityTypes</code>, all PII is redacted or identified.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-pii-entity-types\"\n                    }\n                },\n                \"LanguageModelName\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#ModelName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify the name of the custom language model that you want to use when processing your\\n      transcription. Note that language model names are case sensitive.</p>\\n         <p>The language of the specified language model must match the language code you specify\\n      in your transcription request. If the languages don't match, the custom language model isn't applied. \\n      There are no errors or warnings associated with a language mismatch.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/transcribe/latest/dg/custom-language-models.html\\\">Custom language models</a>.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-language-model-name\"\n                    }\n                },\n                \"IdentifyLanguage\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Enables automatic language identification for your transcription.</p>\\n         <p>If you include <code>IdentifyLanguage</code>, you must include a list of\\n      language codes, using <code>LanguageOptions</code>, that you think may be present in \\n      your audio stream. </p>\\n         <p>You can also include a preferred language using <code>PreferredLanguage</code>. Adding a \\n      preferred language can help Amazon Transcribe identify the language faster than if you omit this \\n      parameter.</p>\\n         <p>If you have multi-channel audio that contains different languages on each channel, and you've \\n      enabled channel identification, automatic language identification identifies the dominant language on \\n      each audio channel.</p>\\n         <p>Note that you must include either <code>LanguageCode</code> or \\n      <code>IdentifyLanguage</code> or <code>IdentifyMultipleLanguages</code> in your request. If you include more than one of these parameters, your transcription job\\n      fails.</p>\\n         <p>Streaming language identification can't be combined with custom language models or \\n      redaction.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-identify-language\"\n                    }\n                },\n                \"LanguageOptions\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#LanguageOptions\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify two or more language codes that represent the languages you think may be present \\n      in your media; including more than five is not recommended.</p>\\n         <p>Including language options can improve the accuracy of language identification.</p>\\n         <p>If you include <code>LanguageOptions</code> in your request, you must also include \\n      <code>IdentifyLanguage</code> or <code>IdentifyMultipleLanguages</code>.</p>\\n         <p>For a list of languages supported with Amazon Transcribe streaming, refer to the \\n      <a href=\\\"https://docs.aws.amazon.com/transcribe/latest/dg/supported-languages.html\\\">Supported \\n        languages</a> table.</p>\\n         <important>\\n            <p>You can only include one language dialect per language per stream. For example, you\\n        cannot include <code>en-US</code> and <code>en-AU</code> in the same request.</p>\\n         </important>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-language-options\"\n                    }\n                },\n                \"PreferredLanguage\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#LanguageCode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify a preferred language from the subset of languages codes you specified in \\n      <code>LanguageOptions</code>.</p>\\n         <p>You can only use this parameter if you've included <code>IdentifyLanguage</code> and\\n        <code>LanguageOptions</code> in your request.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-preferred-language\"\n                    }\n                },\n                \"IdentifyMultipleLanguages\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Enables automatic multi-language identification in your transcription job request. Use this parameter if your stream contains more than one language. If your stream contains only one language, use IdentifyLanguage instead.</p>\\n         <p>If you include <code>IdentifyMultipleLanguages</code>, you must include a list of language codes, using <code>LanguageOptions</code>, that you think may be present in your stream.</p>\\n         <p>If you want to apply a custom vocabulary or a custom vocabulary filter to your automatic multiple language identification request, include <code>VocabularyNames</code> or <code>VocabularyFilterNames</code>.</p>\\n         <p>Note that you must include one of <code>LanguageCode</code>, <code>IdentifyLanguage</code>, or <code>IdentifyMultipleLanguages</code> in your request. If you include more than one of these parameters, your transcription job fails.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-identify-multiple-languages\"\n                    }\n                },\n                \"VocabularyNames\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#VocabularyNames\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify the names of the custom vocabularies that you want to use when processing your\\n      transcription. Note that vocabulary names are case sensitive.</p>\\n         <p>If none of the languages of the specified custom vocabularies match the language identified in \\n      your media, your job fails.</p>\\n         <important>\\n            <p>This parameter is only intended for use <b>with</b> the\\n          <code>IdentifyLanguage</code> parameter. If you're <b>not</b>\\n        including <code>IdentifyLanguage</code> in your request and want to use a custom vocabulary\\n        with your transcription, use the <code>VocabularyName</code> parameter instead.</p>\\n         </important>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/transcribe/latest/dg/custom-vocabulary.html\\\">Custom vocabularies</a>.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-vocabulary-names\"\n                    }\n                },\n                \"VocabularyFilterNames\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#VocabularyFilterNames\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Specify the names of the custom vocabulary filters that you want to use when processing\\n      your transcription. Note that vocabulary filter names are case sensitive.</p>\\n         <p>If none of the languages of the specified custom vocabulary filters match the language identified\\n      in your media, your job fails.</p>\\n         <important>\\n            <p>This parameter is only intended for use <b>with</b> \\n        the <code>IdentifyLanguage</code> parameter. If you're <b>not</b> \\n        including <code>IdentifyLanguage</code> in your request and want to use a custom vocabulary filter \\n        with your transcription, use the <code>VocabularyFilterName</code> parameter instead.</p>\\n         </important>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/transcribe/latest/dg/vocabulary-filtering.html\\\">Using vocabulary filtering with unwanted \\n      words</a>.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-vocabulary-filter-names\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#input\": {}\n            }\n        },\n        \"com.amazonaws.transcribestreaming#StartStreamTranscriptionResponse\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"RequestId\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#RequestId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Provides the identifier for your streaming request.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-request-id\"\n                    }\n                },\n                \"LanguageCode\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#LanguageCode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Provides the language code that you specified in your request.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-language-code\"\n                    }\n                },\n                \"MediaSampleRateHertz\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#MediaSampleRateHertz\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Provides the sample rate that you specified in your request.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-sample-rate\"\n                    }\n                },\n                \"MediaEncoding\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#MediaEncoding\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Provides the media encoding you specified in your request.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-media-encoding\"\n                    }\n                },\n                \"VocabularyName\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#VocabularyName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Provides the name of the custom vocabulary that you specified in your request.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-vocabulary-name\"\n                    }\n                },\n                \"SessionId\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#SessionId\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Provides the identifier for your transcription session.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-session-id\"\n                    }\n                },\n                \"TranscriptResultStream\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#TranscriptResultStream\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Provides detailed information about your streaming session.</p>\",\n                        \"smithy.api#httpPayload\": {}\n                    }\n                },\n                \"VocabularyFilterName\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#VocabularyFilterName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Provides the name of the custom vocabulary filter that you specified in your\\n      request.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-vocabulary-filter-name\"\n                    }\n                },\n                \"VocabularyFilterMethod\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#VocabularyFilterMethod\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Provides the vocabulary filtering method used in your transcription.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-vocabulary-filter-method\"\n                    }\n                },\n                \"ShowSpeakerLabel\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Shows whether speaker partitioning was enabled for your transcription.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-show-speaker-label\"\n                    }\n                },\n                \"EnableChannelIdentification\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Shows whether channel identification was enabled for your transcription.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-enable-channel-identification\"\n                    }\n                },\n                \"NumberOfChannels\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#NumberOfChannels\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Provides the number of channels that you specified in your request.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-number-of-channels\"\n                    }\n                },\n                \"EnablePartialResultsStabilization\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Shows whether partial results stabilization was enabled for your transcription.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-enable-partial-results-stabilization\"\n                    }\n                },\n                \"PartialResultsStability\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#PartialResultsStability\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Provides the stabilization level used for your transcription.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-partial-results-stability\"\n                    }\n                },\n                \"ContentIdentificationType\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#ContentIdentificationType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Shows whether content identification was enabled for your transcription.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-content-identification-type\"\n                    }\n                },\n                \"ContentRedactionType\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#ContentRedactionType\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Shows whether content redaction was enabled for your transcription.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-content-redaction-type\"\n                    }\n                },\n                \"PiiEntityTypes\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#PiiEntityTypes\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Lists the PII entity types you specified in your request.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-pii-entity-types\"\n                    }\n                },\n                \"LanguageModelName\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#ModelName\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Provides the name of the custom language model that you specified in your request.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-language-model-name\"\n                    }\n                },\n                \"IdentifyLanguage\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Shows whether automatic language identification was enabled for your \\n      transcription.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-identify-language\"\n                    }\n                },\n                \"LanguageOptions\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#LanguageOptions\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Provides the language codes that you specified in your request.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-language-options\"\n                    }\n                },\n                \"PreferredLanguage\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#LanguageCode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Provides the preferred language that you specified in your request.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-preferred-language\"\n                    }\n                },\n                \"IdentifyMultipleLanguages\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Shows whether automatic multi-language identification was enabled for your transcription.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-identify-multiple-languages\"\n                    }\n                },\n                \"VocabularyNames\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#VocabularyNames\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Provides the names of the custom vocabularies that you specified in your request.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-vocabulary-names\"\n                    }\n                },\n                \"VocabularyFilterNames\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#VocabularyFilterNames\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Provides the names of the custom vocabulary filters that you specified in your\\n      request.</p>\",\n                        \"smithy.api#httpHeader\": \"x-amzn-transcribe-vocabulary-filter-names\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#output\": {}\n            }\n        },\n        \"com.amazonaws.transcribestreaming#String\": {\n            \"type\": \"string\"\n        },\n        \"com.amazonaws.transcribestreaming#StringList\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.transcribestreaming#String\"\n            }\n        },\n        \"com.amazonaws.transcribestreaming#TimestampRange\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"BeginOffsetMillis\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#Long\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time, in milliseconds, from the beginning of the audio stream to the start of the category \\n      match.</p>\"\n                    }\n                },\n                \"EndOffsetMillis\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#Long\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time, in milliseconds, from the beginning of the audio stream to the end of the category \\n      match.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains the timestamp range (start time through end time) of a matched category.</p>\"\n            }\n        },\n        \"com.amazonaws.transcribestreaming#TimestampRanges\": {\n            \"type\": \"list\",\n            \"member\": {\n                \"target\": \"com.amazonaws.transcribestreaming#TimestampRange\"\n            }\n        },\n        \"com.amazonaws.transcribestreaming#Transcribe\": {\n            \"type\": \"service\",\n            \"version\": \"2017-10-26\",\n            \"operations\": [\n                {\n                    \"target\": \"com.amazonaws.transcribestreaming#GetMedicalScribeStream\"\n                },\n                {\n                    \"target\": \"com.amazonaws.transcribestreaming#StartCallAnalyticsStreamTranscription\"\n                },\n                {\n                    \"target\": \"com.amazonaws.transcribestreaming#StartMedicalScribeStream\"\n                },\n                {\n                    \"target\": \"com.amazonaws.transcribestreaming#StartMedicalStreamTranscription\"\n                },\n                {\n                    \"target\": \"com.amazonaws.transcribestreaming#StartStreamTranscription\"\n                }\n            ],\n            \"traits\": {\n                \"aws.api#service\": {\n                    \"sdkId\": \"Transcribe Streaming\",\n                    \"arnNamespace\": \"transcribe\",\n                    \"cloudFormationName\": \"TranscribeStreaming\",\n                    \"cloudTrailEventSource\": \"transcribestreaming.amazonaws.com\",\n                    \"endpointPrefix\": \"transcribestreaming\"\n                },\n                \"aws.auth#sigv4\": {\n                    \"name\": \"transcribe\"\n                },\n                \"aws.protocols#restJson1\": {\n                    \"http\": [\n                        \"http/1.1\",\n                        \"h2\"\n                    ],\n                    \"eventStreamHttp\": [\n                        \"h2\"\n                    ]\n                },\n                \"smithy.api#documentation\": \"<p>Amazon Transcribe streaming offers four main types of real-time transcription:\\n      <b>Standard</b>, <b>Medical</b>,\\n      <b>Call Analytics</b>,\\n      and <b>Health Scribe</b>.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <b>Standard transcriptions</b> are the most common option. Refer\\n      to  for details.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>Medical transcriptions</b> are tailored to medical professionals \\n      and incorporate medical terms. A common use case for this service is transcribing doctor-patient \\n      dialogue in real time, so doctors can focus on their patient instead of taking notes. Refer to\\n       for details.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>Call Analytics transcriptions</b> are designed for use with call\\n          center audio on two different channels; if you're looking for insight into customer service calls, use this \\n          option. Refer to  for details.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <b>HealthScribe transcriptions</b> are designed to\\n          automatically create clinical notes from patient-clinician conversations using generative AI.\\n          Refer to [here] for details.</p>\\n            </li>\\n         </ul>\",\n                \"smithy.api#title\": \"Amazon Transcribe Streaming Service\",\n                \"smithy.rules#endpointRuleSet\": {\n                    \"version\": \"1.0\",\n                    \"parameters\": {\n                        \"Region\": {\n                            \"builtIn\": \"AWS::Region\",\n                            \"required\": false,\n                            \"documentation\": \"The AWS region used to dispatch the request.\",\n                            \"type\": \"String\"\n                        },\n                        \"UseDualStack\": {\n                            \"builtIn\": \"AWS::UseDualStack\",\n                            \"required\": true,\n                            \"default\": false,\n                            \"documentation\": \"When true, use the dual-stack endpoint. If the configured endpoint does not support dual-stack, dispatching the request MAY return an error.\",\n                            \"type\": \"Boolean\"\n                        },\n                        \"UseFIPS\": {\n                            \"builtIn\": \"AWS::UseFIPS\",\n                            \"required\": true,\n                            \"default\": false,\n                            \"documentation\": \"When true, send this request to the FIPS-compliant regional endpoint. If the configured endpoint does not have a FIPS compliant endpoint, dispatching the request will return an error.\",\n                            \"type\": \"Boolean\"\n                        },\n                        \"Endpoint\": {\n                            \"builtIn\": \"SDK::Endpoint\",\n                            \"required\": false,\n                            \"documentation\": \"Override the endpoint used to send this request\",\n                            \"type\": \"String\"\n                        }\n                    },\n                    \"rules\": [\n                        {\n                            \"conditions\": [\n                                {\n                                    \"fn\": \"isSet\",\n                                    \"argv\": [\n                                        {\n                                            \"ref\": \"Endpoint\"\n                                        }\n                                    ]\n                                }\n                            ],\n                            \"rules\": [\n                                {\n                                    \"conditions\": [\n                                        {\n                                            \"fn\": \"booleanEquals\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"UseFIPS\"\n                                                },\n                                                true\n                                            ]\n                                        }\n                                    ],\n                                    \"error\": \"Invalid Configuration: FIPS and custom endpoint are not supported\",\n                                    \"type\": \"error\"\n                                },\n                                {\n                                    \"conditions\": [\n                                        {\n                                            \"fn\": \"booleanEquals\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"UseDualStack\"\n                                                },\n                                                true\n                                            ]\n                                        }\n                                    ],\n                                    \"error\": \"Invalid Configuration: Dualstack and custom endpoint are not supported\",\n                                    \"type\": \"error\"\n                                },\n                                {\n                                    \"conditions\": [],\n                                    \"endpoint\": {\n                                        \"url\": {\n                                            \"ref\": \"Endpoint\"\n                                        },\n                                        \"properties\": {},\n                                        \"headers\": {}\n                                    },\n                                    \"type\": \"endpoint\"\n                                }\n                            ],\n                            \"type\": \"tree\"\n                        },\n                        {\n                            \"conditions\": [\n                                {\n                                    \"fn\": \"isSet\",\n                                    \"argv\": [\n                                        {\n                                            \"ref\": \"Region\"\n                                        }\n                                    ]\n                                }\n                            ],\n                            \"rules\": [\n                                {\n                                    \"conditions\": [\n                                        {\n                                            \"fn\": \"aws.partition\",\n                                            \"argv\": [\n                                                {\n                                                    \"ref\": \"Region\"\n                                                }\n                                            ],\n                                            \"assign\": \"PartitionResult\"\n                                        }\n                                    ],\n                                    \"rules\": [\n                                        {\n                                            \"conditions\": [\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseFIPS\"\n                                                        },\n                                                        true\n                                                    ]\n                                                },\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseDualStack\"\n                                                        },\n                                                        true\n                                                    ]\n                                                }\n                                            ],\n                                            \"rules\": [\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                true,\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"PartitionResult\"\n                                                                        },\n                                                                        \"supportsFIPS\"\n                                                                    ]\n                                                                }\n                                                            ]\n                                                        },\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                true,\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"PartitionResult\"\n                                                                        },\n                                                                        \"supportsDualStack\"\n                                                                    ]\n                                                                }\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"rules\": [\n                                                        {\n                                                            \"conditions\": [],\n                                                            \"endpoint\": {\n                                                                \"url\": \"https://transcribestreaming-fips.{Region}.{PartitionResult#dualStackDnsSuffix}\",\n                                                                \"properties\": {},\n                                                                \"headers\": {}\n                                                            },\n                                                            \"type\": \"endpoint\"\n                                                        }\n                                                    ],\n                                                    \"type\": \"tree\"\n                                                },\n                                                {\n                                                    \"conditions\": [],\n                                                    \"error\": \"FIPS and DualStack are enabled, but this partition does not support one or both\",\n                                                    \"type\": \"error\"\n                                                }\n                                            ],\n                                            \"type\": \"tree\"\n                                        },\n                                        {\n                                            \"conditions\": [\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseFIPS\"\n                                                        },\n                                                        true\n                                                    ]\n                                                }\n                                            ],\n                                            \"rules\": [\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"PartitionResult\"\n                                                                        },\n                                                                        \"supportsFIPS\"\n                                                                    ]\n                                                                },\n                                                                true\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"rules\": [\n                                                        {\n                                                            \"conditions\": [],\n                                                            \"endpoint\": {\n                                                                \"url\": \"https://transcribestreaming-fips.{Region}.{PartitionResult#dnsSuffix}\",\n                                                                \"properties\": {},\n                                                                \"headers\": {}\n                                                            },\n                                                            \"type\": \"endpoint\"\n                                                        }\n                                                    ],\n                                                    \"type\": \"tree\"\n                                                },\n                                                {\n                                                    \"conditions\": [],\n                                                    \"error\": \"FIPS is enabled but this partition does not support FIPS\",\n                                                    \"type\": \"error\"\n                                                }\n                                            ],\n                                            \"type\": \"tree\"\n                                        },\n                                        {\n                                            \"conditions\": [\n                                                {\n                                                    \"fn\": \"booleanEquals\",\n                                                    \"argv\": [\n                                                        {\n                                                            \"ref\": \"UseDualStack\"\n                                                        },\n                                                        true\n                                                    ]\n                                                }\n                                            ],\n                                            \"rules\": [\n                                                {\n                                                    \"conditions\": [\n                                                        {\n                                                            \"fn\": \"booleanEquals\",\n                                                            \"argv\": [\n                                                                true,\n                                                                {\n                                                                    \"fn\": \"getAttr\",\n                                                                    \"argv\": [\n                                                                        {\n                                                                            \"ref\": \"PartitionResult\"\n                                                                        },\n                                                                        \"supportsDualStack\"\n                                                                    ]\n                                                                }\n                                                            ]\n                                                        }\n                                                    ],\n                                                    \"rules\": [\n                                                        {\n                                                            \"conditions\": [],\n                                                            \"endpoint\": {\n                                                                \"url\": \"https://transcribestreaming.{Region}.{PartitionResult#dualStackDnsSuffix}\",\n                                                                \"properties\": {},\n                                                                \"headers\": {}\n                                                            },\n                                                            \"type\": \"endpoint\"\n                                                        }\n                                                    ],\n                                                    \"type\": \"tree\"\n                                                },\n                                                {\n                                                    \"conditions\": [],\n                                                    \"error\": \"DualStack is enabled but this partition does not support DualStack\",\n                                                    \"type\": \"error\"\n                                                }\n                                            ],\n                                            \"type\": \"tree\"\n                                        },\n                                        {\n                                            \"conditions\": [],\n                                            \"endpoint\": {\n                                                \"url\": \"https://transcribestreaming.{Region}.{PartitionResult#dnsSuffix}\",\n                                                \"properties\": {},\n                                                \"headers\": {}\n                                            },\n                                            \"type\": \"endpoint\"\n                                        }\n                                    ],\n                                    \"type\": \"tree\"\n                                }\n                            ],\n                            \"type\": \"tree\"\n                        },\n                        {\n                            \"conditions\": [],\n                            \"error\": \"Invalid Configuration: Missing Region\",\n                            \"type\": \"error\"\n                        }\n                    ]\n                },\n                \"smithy.rules#endpointTests\": {\n                    \"testCases\": [\n                        {\n                            \"documentation\": \"For region ap-northeast-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://transcribestreaming.ap-northeast-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-northeast-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-northeast-2 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://transcribestreaming.ap-northeast-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-northeast-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ap-southeast-2 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://transcribestreaming.ap-southeast-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ap-southeast-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region ca-central-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://transcribestreaming.ca-central-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"ca-central-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-central-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://transcribestreaming.eu-central-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-central-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-west-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://transcribestreaming.eu-west-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-west-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region eu-west-2 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://transcribestreaming.eu-west-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"eu-west-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region sa-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://transcribestreaming.sa-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"sa-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://transcribestreaming.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-2 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://transcribestreaming.us-east-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-west-2 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://transcribestreaming.us-west-2.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-west-2\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-1 with FIPS enabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://transcribestreaming-fips.us-east-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://transcribestreaming-fips.us-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-east-1 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://transcribestreaming.us-east-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-north-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://transcribestreaming.cn-north-1.amazonaws.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-north-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-northwest-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://transcribestreaming.cn-northwest-1.amazonaws.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-northwest-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-north-1 with FIPS enabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://transcribestreaming-fips.cn-north-1.api.amazonwebservices.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-north-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-north-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://transcribestreaming-fips.cn-north-1.amazonaws.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-north-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region cn-north-1 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://transcribestreaming.cn-north-1.api.amazonwebservices.com.cn\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"cn-north-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://transcribestreaming.us-gov-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-west-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://transcribestreaming.us-gov-west-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-west-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-east-1 with FIPS enabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://transcribestreaming-fips.us-gov-east-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-east-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://transcribestreaming-fips.us-gov-east-1.amazonaws.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-gov-east-1 with FIPS disabled and DualStack enabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://transcribestreaming.us-gov-east-1.api.aws\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-gov-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-iso-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://transcribestreaming.us-iso-east-1.c2s.ic.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-iso-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-iso-east-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://transcribestreaming-fips.us-iso-east-1.c2s.ic.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-iso-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-isob-east-1 with FIPS enabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://transcribestreaming-fips.us-isob-east-1.sc2s.sgov.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-isob-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For region us-isob-east-1 with FIPS disabled and DualStack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://transcribestreaming.us-isob-east-1.sc2s.sgov.gov\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-isob-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false\n                            }\n                        },\n                        {\n                            \"documentation\": \"For custom endpoint with region set and fips disabled and dualstack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://example.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"For custom endpoint with region not set and fips disabled and dualstack disabled\",\n                            \"expect\": {\n                                \"endpoint\": {\n                                    \"url\": \"https://example.com\"\n                                }\n                            },\n                            \"params\": {\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": false,\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"For custom endpoint with fips enabled and dualstack disabled\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: FIPS and custom endpoint are not supported\"\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": true,\n                                \"UseDualStack\": false,\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"For custom endpoint with fips disabled and dualstack enabled\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: Dualstack and custom endpoint are not supported\"\n                            },\n                            \"params\": {\n                                \"Region\": \"us-east-1\",\n                                \"UseFIPS\": false,\n                                \"UseDualStack\": true,\n                                \"Endpoint\": \"https://example.com\"\n                            }\n                        },\n                        {\n                            \"documentation\": \"Missing region\",\n                            \"expect\": {\n                                \"error\": \"Invalid Configuration: Missing Region\"\n                            }\n                        }\n                    ],\n                    \"version\": \"1.0\"\n                }\n            }\n        },\n        \"com.amazonaws.transcribestreaming#Transcript\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Results\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#ResultList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Contains a set of transcription results from one or more audio segments, along with additional \\n      information per your request parameters. This can include information relating to alternative\\n      transcriptions, channel identification, partial result stabilization, language identification, and other\\n      transcription-related data.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The <code>Transcript</code> associated with a \\n      <code></code>.</p>\\n         <p>\\n            <code>Transcript</code> contains <code>Results</code>, which contains a set of transcription\\n      results from one or more audio segments, along with additional information per your request \\n      parameters.</p>\"\n            }\n        },\n        \"com.amazonaws.transcribestreaming#TranscriptEvent\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"Transcript\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#Transcript\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Contains <code>Results</code>, which contains a set of transcription results from one or\\n      more audio segments, along with additional information per your request parameters. This can\\n      include information relating to alternative transcriptions, channel identification, partial\\n      result stabilization, language identification, and other transcription-related data.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>The <code>TranscriptEvent</code> associated with a \\n      <code>TranscriptResultStream</code>.</p>\\n         <p>Contains a set of transcription results from one or more audio segments, along with additional \\n      information per your request parameters.</p>\"\n            }\n        },\n        \"com.amazonaws.transcribestreaming#TranscriptResultStream\": {\n            \"type\": \"union\",\n            \"members\": {\n                \"TranscriptEvent\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#TranscriptEvent\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Contains <code>Transcript</code>, which contains <code>Results</code>. The \\n      <code></code> object contains a set of transcription \\n      results from one or more audio segments, along with additional information per your request \\n      parameters.</p>\"\n                    }\n                },\n                \"BadRequestException\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#BadRequestException\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A client error occurred when the stream was created. Check the parameters of the request\\n      and try your request again.</p>\"\n                    }\n                },\n                \"LimitExceededException\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#LimitExceededException\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Your client has exceeded one of the Amazon Transcribe limits. This is typically the audio length\\n      limit. Break your audio stream into smaller chunks and try your request again.</p>\"\n                    }\n                },\n                \"InternalFailureException\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#InternalFailureException\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A problem occurred while processing the audio. Amazon Transcribe terminated \\n      processing.</p>\"\n                    }\n                },\n                \"ConflictException\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#ConflictException\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>A new stream started with the same session ID. The current stream has been\\n      terminated.</p>\"\n                    }\n                },\n                \"ServiceUnavailableException\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#ServiceUnavailableException\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The service is currently unavailable. Try your request later.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains detailed information about your streaming session.</p>\",\n                \"smithy.api#streaming\": {}\n            }\n        },\n        \"com.amazonaws.transcribestreaming#Type\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"CONVERSATION\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"CONVERSATION\"\n                    }\n                },\n                \"DICTATION\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"DICTATION\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.transcribestreaming#Uri\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 2000\n                },\n                \"smithy.api#pattern\": \"^(s3://|http(s*)://).+$\"\n            }\n        },\n        \"com.amazonaws.transcribestreaming#UtteranceEvent\": {\n            \"type\": \"structure\",\n            \"members\": {\n                \"UtteranceId\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The unique identifier that is associated with the specified <code>UtteranceEvent</code>.</p>\"\n                    }\n                },\n                \"IsPartial\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#Boolean\",\n                    \"traits\": {\n                        \"smithy.api#default\": false,\n                        \"smithy.api#documentation\": \"<p>Indicates whether the segment in the <code>UtteranceEvent</code> is complete \\n      (<code>FALSE</code>) or partial (<code>TRUE</code>).</p>\"\n                    }\n                },\n                \"ParticipantRole\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#ParticipantRole\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Provides the role of the speaker for each audio channel, either <code>CUSTOMER</code> or \\n      <code>AGENT</code>.</p>\"\n                    }\n                },\n                \"BeginOffsetMillis\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#Long\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time, in milliseconds, from the beginning of the audio stream to the start of the\\n      <code>UtteranceEvent</code>.</p>\"\n                    }\n                },\n                \"EndOffsetMillis\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#Long\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The time, in milliseconds, from the beginning of the audio stream to the start of the \\n      <code>UtteranceEvent</code>.</p>\"\n                    }\n                },\n                \"Transcript\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#String\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Contains transcribed text.</p>\"\n                    }\n                },\n                \"Items\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#CallAnalyticsItemList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Contains words, phrases, or punctuation marks that are associated with the specified \\n      <code>UtteranceEvent</code>.</p>\"\n                    }\n                },\n                \"Entities\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#CallAnalyticsEntityList\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Contains entities identified as personally identifiable information (PII) in your transcription \\n      output.</p>\"\n                    }\n                },\n                \"Sentiment\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#Sentiment\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Provides the sentiment that was detected in the specified segment.</p>\"\n                    }\n                },\n                \"IssuesDetected\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#IssuesDetected\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>Provides the issue that was detected in the specified segment.</p>\"\n                    }\n                },\n                \"LanguageCode\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#CallAnalyticsLanguageCode\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The language code that represents the language spoken in your audio stream.</p>\"\n                    }\n                },\n                \"LanguageIdentification\": {\n                    \"target\": \"com.amazonaws.transcribestreaming#CallAnalyticsLanguageIdentification\",\n                    \"traits\": {\n                        \"smithy.api#documentation\": \"<p>The language code of the dominant language identified in your stream.</p>\"\n                    }\n                }\n            },\n            \"traits\": {\n                \"smithy.api#documentation\": \"<p>Contains set of transcription results from one or more audio segments, along with additional \\n      information about the parameters included in your request. For example, channel definitions, partial result \\n      stabilization, sentiment, and issue detection.</p>\"\n            }\n        },\n        \"com.amazonaws.transcribestreaming#VocabularyFilterMethod\": {\n            \"type\": \"enum\",\n            \"members\": {\n                \"REMOVE\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"remove\"\n                    }\n                },\n                \"MASK\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"mask\"\n                    }\n                },\n                \"TAG\": {\n                    \"target\": \"smithy.api#Unit\",\n                    \"traits\": {\n                        \"smithy.api#enumValue\": \"tag\"\n                    }\n                }\n            }\n        },\n        \"com.amazonaws.transcribestreaming#VocabularyFilterName\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 200\n                },\n                \"smithy.api#pattern\": \"^[0-9a-zA-Z._-]+$\"\n            }\n        },\n        \"com.amazonaws.transcribestreaming#VocabularyFilterNames\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 3000\n                },\n                \"smithy.api#pattern\": \"^[a-zA-Z0-9,-._]+$\"\n            }\n        },\n        \"com.amazonaws.transcribestreaming#VocabularyName\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 200\n                },\n                \"smithy.api#pattern\": \"^[0-9a-zA-Z._-]+$\"\n            }\n        },\n        \"com.amazonaws.transcribestreaming#VocabularyNames\": {\n            \"type\": \"string\",\n            \"traits\": {\n                \"smithy.api#length\": {\n                    \"min\": 1,\n                    \"max\": 3000\n                },\n                \"smithy.api#pattern\": \"^[a-zA-Z0-9,-._]+$\"\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "aws/sdk/aws-models-extra/README.md",
    "content": "This directory contains additional protocol tests for specific AWS service models. These models are ALWAYS\nsourced alongside the real models by matching on the `sdkId` of the model. The convention is `{sdkId}-tests.smithy`.\n"
  },
  {
    "path": "aws/sdk/aws-models-extra/batch-tests.smithy",
    "content": "$version: \"1.0\"\n\nnamespace com.amazonaws.batch\nuse smithy.test#httpResponseTests\napply DescribeComputeEnvironments @httpResponseTests([\n    {\n        id: \"DeserializeDescribeCompute\",\n        documentation: \"This test case validates a bug where unboxed primitives were incorrectly marked as required\",\n        body: \"\"\"\n            {\n                \"computeEnvironments\":[{\n                    \"computeEnvironmentName\":\"test-batch-compute\",\n                    \"computeEnvironmentArn\":\"arn\",\n                    \"ecsClusterArn\":\"clusteran\",\n                    \"tags\":{\"foo\": \"bar\"},\n                    \"type\":\"MANAGED\",\n                    \"state\":\"ENABLED\",\n                    \"status\":\"VALID\",\n                    \"statusReason\":\"ComputeEnvironment Healthy\",\n                    \"computeResources\":{\n                        \"type\":\"EC2\",\n                        \"minvCpus\":0,\n                        \"maxvCpus\":256,\n                        \"desiredvCpus\":0,\n                        \"instanceTypes\":[\"optimal\"],\n                        \"subnets\":[\"subnet-c745b79c\",\"subnet-d4e24fe8\"],\n                        \"securityGroupIds\":[\"sg-06a55e7b\"],\n                        \"instanceRole\":\"instancerole\",\n                        \"tags\":{\"Name\":\"batch-compute\"},\n                        \"ec2Configuration\":[{\"imageType\":\"ECS_AL1\"}]\n                    },\n                    \"serviceRole\":\"arn:aws:iam::432762038596:role/service-role/AWSBatchServiceRole\"\n                }]\n            }\n        \"\"\",\n        code: 200,\n        protocol: \"aws.protocols#restJson1\",\n        params: {\n                \"computeEnvironments\":[{\n                    \"computeEnvironmentName\":\"test-batch-compute\",\n                    \"computeEnvironmentArn\":\"arn\",\n                    \"ecsClusterArn\":\"clusteran\",\n                    \"tags\":{\"foo\": \"bar\"},\n                    \"type\":\"MANAGED\",\n                    \"state\":\"ENABLED\",\n                    \"status\":\"VALID\",\n                    \"statusReason\":\"ComputeEnvironment Healthy\",\n                    \"computeResources\":{\n                        \"type\":\"EC2\",\n                        \"minvCpus\":0,\n                        \"maxvCpus\":256,\n                        \"desiredvCpus\":0,\n                        \"instanceTypes\":[\"optimal\"],\n                        \"subnets\":[\"subnet-c745b79c\",\"subnet-d4e24fe8\"],\n                        \"securityGroupIds\":[\"sg-06a55e7b\"],\n                        \"instanceRole\":\"instancerole\",\n                        \"tags\":{\"Name\":\"batch-compute\"},\n                        \"ec2Configuration\":[{\"imageType\":\"ECS_AL1\"}]\n                    },\n                    \"serviceRole\":\"arn:aws:iam::432762038596:role/service-role/AWSBatchServiceRole\"\n                }]\n            }\n    }\n])\n"
  },
  {
    "path": "aws/sdk/aws-models-extra/ebs-tests.smithy",
    "content": "$version: \"1.0\"\nnamespace com.amazonaws.ebs\n\nuse smithy.test#httpResponseTests\n\napply ValidationException @httpResponseTests([\n    {\n        id: \"LowercaseMessage\",\n        documentation: \"This test case validates case insensitive parsing of `message`\",\n        params: {\n            Message: \"1 validation error detected\"\n        },\n        bodyMediaType: \"application/json\",\n        body: \"\"\"\n        {\n          \"message\": \"1 validation error detected\"\n        }\n        \"\"\",\n        protocol: \"aws.protocols#restJson1\",\n        code: 400,\n        headers:  {\n            \"x-amzn-requestid\": \"2af8f013-250a-4f6e-88ae-6dd7f6e12807\",\n            \"x-amzn-errortype\": \"ValidationException:http://internal.amazon.com/coral/com.amazon.coral.validate/\",\n            \"content-type\": \"application/json\",\n            \"content-length\": \"77\",\n            \"date\": \"Wed, 30 Jun 2021 23:42:27 GMT\"\n        },\n    },\n\n    {\n        id: \"UppercaseMessage\",\n        documentation: \"This test case validates case insensitive parsing of `message`\",\n        params: {\n            Message: \"Invalid volume size: 99999999999\",\n            Reason: \"INVALID_VOLUME_SIZE\"\n        },\n        bodyMediaType: \"application/json\",\n        body: \"\"\"\n        {\"Message\":\"Invalid volume size: 99999999999\",\"Reason\":\"INVALID_VOLUME_SIZE\"}\n        \"\"\",\n        protocol: \"aws.protocols#restJson1\",\n        code: 400,\n        headers:  {\n            \"x-amzn-requestid\": \"2af8f013-250a-4f6e-88ae-6dd7f6e12807\",\n            \"x-amzn-errortype\": \"ValidationException:http://internal.amazon.com/coral/com.amazon.zeppelindataservice/\",\n            \"content-type\": \"application/json\",\n            \"content-length\": \"77\",\n            \"date\": \"Wed, 30 Jun 2021 23:42:27 GMT\"\n        },\n    },\n])\n"
  },
  {
    "path": "aws/sdk/aws-models-extra/glacier-tests.smithy",
    "content": "$version: \"1.0\"\n\nnamespace com.amazonaws.glacier\n\nuse smithy.test#httpRequestTests\nuse aws.protocols#restJson1\n\napply UploadArchive @httpRequestTests([\n    {\n        id: \"GlacierVersionHeader\",\n        documentation: \"Glacier requires that a version header be set on all requests.\",\n        protocol: restJson1,\n        method: \"POST\",\n        uri: \"/foo/vaults/bar/archives\",\n        headers: {\n            \"X-Amz-Glacier-Version\": \"2012-06-01\",\n        },\n        body: \"\",\n        params: {\n            accountId: \"foo\",\n            vaultName: \"bar\",\n        },\n        vendorParams: {\n            \"endpointParams\": {\n                \"builtInParams\": {\n                    \"AWS::Region\": \"us-east-1\"\n                }\n            }\n        }\n    },\n    {\n        id: \"GlacierChecksums\",\n        documentation: \"Glacier requires checksum headers that are cumbersome to provide.\",\n        protocol: restJson1,\n        method: \"POST\",\n        uri: \"/foo/vaults/bar/archives\",\n        headers: {\n            \"X-Amz-Glacier-Version\": \"2012-06-01\",\n            \"X-Amz-Content-Sha256\": \"b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9\",\n            \"X-Amz-Sha256-Tree-Hash\": \"b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9\",\n        },\n        body: \"hello world\",\n        params: {\n            accountId: \"foo\",\n            vaultName: \"bar\",\n            body: \"hello world\"\n        },\n        vendorParams: {\n            \"endpointParams\": {\n                \"builtInParams\": {\n                    \"AWS::Region\": \"us-east-1\"\n                }\n            }\n        }\n        appliesTo: \"client\",\n    },\n    {\n        id: \"GlacierAccountIdEmpty\",\n        documentation: \"\"\"\n            Glacier requires that the account id be set, but you can just use a\n            hyphen (-) to indicate the current account. This should be default\n            behavior if the customer provides a null or empty string.\"\"\",\n        protocol: restJson1,\n        method: \"POST\",\n        uri: \"/-/vaults/bar/archives\",\n        headers: {\n            \"X-Amz-Glacier-Version\": \"2012-06-01\",\n        },\n        body: \"\",\n        params: {\n            accountId: \"\",\n            vaultName: \"bar\",\n        },\n        vendorParams: {\n            \"endpointParams\": {\n                \"builtInParams\": {\n                    \"AWS::Region\": \"us-east-1\"\n                }\n            }\n        }\n        appliesTo: \"client\",\n    },\n    {\n        id: \"GlacierAccountIdUnset\",\n        documentation: \"\"\"\n            Glacier requires that the account id be set, but you can just use a\n            hyphen (-) to indicate the current account. This should be default\n            behavior if the customer provides a null or empty string.\"\"\",\n        protocol: restJson1,\n        method: \"POST\",\n        uri: \"/-/vaults/bar/archives\",\n        headers: {\n            \"X-Amz-Glacier-Version\": \"2012-06-01\",\n        },\n        body: \"\",\n        params: {\n            vaultName: \"bar\",\n            accountId: null\n        },\n        vendorParams: {\n            \"endpointParams\": {\n                \"builtInParams\": {\n                    \"AWS::Region\": \"us-east-1\"\n                }\n            }\n        }\n        appliesTo: \"client\",\n    }\n])\n\napply UploadMultipartPart @httpRequestTests([\n    {\n        id: \"GlacierMultipartChecksums\",\n        documentation: \"Glacier requires checksum headers that are cumbersome to provide.\",\n        protocol: restJson1,\n        method: \"PUT\",\n        uri: \"/foo/vaults/bar/multipart-uploads/baz\",\n        headers: {\n            \"X-Amz-Glacier-Version\": \"2012-06-01\",\n            \"X-Amz-Content-Sha256\": \"b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9\",\n            \"X-Amz-Sha256-Tree-Hash\": \"b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9\",\n        },\n        body: \"hello world\",\n        params: {\n            accountId: \"foo\",\n            vaultName: \"bar\",\n            uploadId: \"baz\",\n            body: \"hello world\"\n        },\n        vendorParams: {\n            \"endpointParams\": {\n                \"builtInParams\": {\n                    \"AWS::Region\": \"us-east-1\"\n                }\n            }\n        }\n        appliesTo: \"client\",\n    }\n])\n"
  },
  {
    "path": "aws/sdk/aws-models-extra/route53-tests.smithy",
    "content": "$version: \"1.0\"\n\nnamespace com.amazonaws.route53\n\nuse smithy.test#httpRequestTests\n\n\napply ListResourceRecordSets @httpRequestTests([\n    {\n        id: \"ListResourceRecordSetsTrimHostedZone\",\n        documentation: \"This test validates that hosted zone is correctly trimmed\",\n        method: \"GET\",\n        protocol: \"aws.protocols#restXml\",\n        uri: \"/2013-04-01/hostedzone/IDOFMYHOSTEDZONE/rrset\",\n        bodyMediaType: \"application/xml\",\n        params: {\n            \"HostedZoneId\": \"/hostedzone/IDOFMYHOSTEDZONE\"\n        }\n        vendorParams: {\n            \"endpointParams\": {\n                \"builtInParams\": {\n                    \"AWS::Region\": \"us-east-1\"\n                }\n            }\n        }\n    }\n])\n\napply GetChange @httpRequestTests([\n    {\n        id: \"GetChangeTrimChangeId\",\n        documentation: \"This test validates that change id is correctly trimmed\",\n        method: \"GET\",\n        protocol: \"aws.protocols#restXml\",\n        uri: \"/2013-04-01/change/SOMECHANGEID\",\n        bodyMediaType: \"application/xml\",\n        params: {\n            \"Id\": \"/change/SOMECHANGEID\"\n        }\n        vendorParams: {\n            \"endpointParams\": {\n                \"builtInParams\": {\n                    \"AWS::Region\": \"us-east-1\"\n                }\n            }\n        }\n    },\n])\n\napply GetReusableDelegationSet @httpRequestTests([\n    {\n        id: \"GetReusableDelegationSetTrimDelegationSetId\",\n        documentation: \"This test validates that delegation set id is correctly trimmed\",\n        method: \"GET\",\n        protocol: \"aws.protocols#restXml\",\n        uri: \"/2013-04-01/delegationset/DELEGATIONSETID\",\n        bodyMediaType: \"application/xml\",\n        params: {\n            \"Id\": \"/delegationset/DELEGATIONSETID\"\n        }\n        vendorParams: {\n            \"endpointParams\": {\n                \"builtInParams\": {\n                    \"AWS::Region\": \"us-east-1\"\n                }\n            }\n        }\n    },\n])\n"
  },
  {
    "path": "aws/sdk/aws-models-extra/s3-tests.smithy",
    "content": "$version: \"1.0\"\n\nnamespace com.amazonaws.s3\n\nuse smithy.test#httpResponseTests\nuse smithy.test#httpRequestTests\n\napply NotFound @httpResponseTests([\n    {\n        id: \"HeadObjectEmptyBody\",\n        documentation: \"This test case validates https://github.com/smithy-lang/smithy-rs/issues/456\",\n        params: {\n        },\n        bodyMediaType: \"application/xml\",\n        body: \"\",\n        protocol: \"aws.protocols#restXml\",\n        code: 404,\n        headers: {\n            \"x-amz-request-id\": \"GRZ6BZ468DF52F2E\",\n            \"x-amz-id-2\": \"UTniwu6QmCIjVeuK2ZfeWBOnu7SqMQOS3Vac6B/K4H2ZCawYUl+nDbhGTImuyhZ5DFiojR3Kcz4=\",\n            \"content-type\": \"application/xml\",\n            \"date\": \"Thu, 03 Jun 2021 04:05:52 GMT\",\n            \"server\": \"AmazonS3\"\n        }\n    }\n])\n\n\napply GetBucketLocation @httpResponseTests([\n    {\n        id: \"GetBucketLocation\",\n        documentation: \"This test case validates https://github.com/awslabs/aws-sdk-rust/issues/116\",\n        code: 200,\n        body: \"<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?>\\n<LocationConstraint xmlns=\\\"http://s3.amazonaws.com/doc/2006-03-01/\\\">us-west-2</LocationConstraint>\",\n        params: {\n            \"LocationConstraint\": \"us-west-2\"\n        },\n        bodyMediaType: \"application/xml\",\n        protocol: \"aws.protocols#restXml\"\n    }\n])\n\napply ListObjects @httpResponseTests([\n    {\n        id: \"KeysWithWhitespace\",\n        documentation: \"This test validates that parsing respects whitespace\",\n        code: 200,\n        bodyMediaType: \"application/xml\",\n        protocol: \"aws.protocols#restXml\",\n        body: \"\"\"\n        <?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?>\\n\n        <ListBucketResult\n        \txmlns=\\\"http://s3.amazonaws.com/doc/2006-03-01/\\\">\n        \t<Name>bucketname</Name>\n        \t<Prefix></Prefix>\n        \t<Marker></Marker>\n        \t<MaxKeys>1000</MaxKeys>\n        \t<IsTruncated>false</IsTruncated>\n        \t<Contents>\n        \t\t<Key>    </Key>\n        \t\t<LastModified>2021-07-16T16:20:53.000Z</LastModified>\n        \t\t<ETag>&quot;etag123&quot;</ETag>\n        \t\t<Size>0</Size>\n        \t\t<Owner>\n        \t\t\t<ID>owner</ID>\n        \t\t</Owner>\n        \t\t<StorageClass>STANDARD</StorageClass>\n        \t</Contents>\n        \t<Contents>\n        \t\t<Key> a </Key>\n        \t\t<LastModified>2021-07-16T16:02:10.000Z</LastModified>\n        \t\t<ETag>&quot;etag123&quot;</ETag>\n        \t\t<Size>0</Size>\n        \t\t<Owner>\n        \t\t\t<ID>owner</ID>\n        \t\t</Owner>\n        \t\t<StorageClass>STANDARD</StorageClass>\n        \t</Contents>\n        </ListBucketResult>\n        \"\"\",\n        params: {\n            MaxKeys: 1000,\n            IsTruncated: false,\n            Marker: \"\",\n            Name: \"bucketname\",\n            Prefix: \"\",\n            Contents: [{\n                           Key: \"    \",\n                           LastModified: 1626452453,\n                           ETag: \"\\\"etag123\\\"\",\n                           Size: 0,\n                           Owner: { ID: \"owner\" },\n                           StorageClass: \"STANDARD\"\n                       }, {\n                           Key: \" a \",\n                           LastModified: 1626451330,\n                           ETag: \"\\\"etag123\\\"\",\n                           Size: 0,\n                           Owner: { ID: \"owner\" },\n                           StorageClass: \"STANDARD\"\n                       }]\n        }\n    }\n])\n\napply PutBucketLifecycleConfiguration @httpRequestTests([\n    {\n        id: \"PutBucketLifecycleConfiguration\",\n        documentation: \"This test validates that the content md5 header is set correctly\",\n        method: \"PUT\",\n        protocol: \"aws.protocols#restXml\",\n        uri: \"/\",\n        headers: {\n            \"x-amz-checksum-crc32\": \"11+f3g==\",\n        },\n        bodyMediaType: \"application/xml\",\n        body: \"\"\"\n        <LifecycleConfiguration xmlns=\\\"http://s3.amazonaws.com/doc/2006-03-01/\\\">\n            <Rule>\n                <Expiration>\n                    <Days>1</Days>\n                </Expiration>\n                <ID>Expire</ID>\n                <Status>Enabled</Status>\n            </Rule>\n        </LifecycleConfiguration>\n        \"\"\",\n        params: {\n            \"Bucket\": \"test-bucket\",\n            \"LifecycleConfiguration\": {\n                \"Rules\": [\n                    {\"Expiration\": { \"Days\": 1 }, \"Status\": \"Enabled\", \"ID\": \"Expire\" },\n                ]\n            }\n        },\n        vendorParams: {\n            \"endpointParams\": {\n                \"builtInParams\": {\n                    \"AWS::Region\": \"us-east-1\"\n                }\n            }\n        }\n    }\n])\n\napply CreateMultipartUpload @httpRequestTests([\n    {\n        id: \"CreateMultipartUploadUriConstruction\",\n        documentation: \"This test validates that the URI for CreateMultipartUpload is created correctly\",\n        method: \"POST\",\n        protocol: \"aws.protocols#restXml\",\n        uri: \"/object.txt\",\n        queryParams: [\n            \"uploads\"\n        ],\n        params: {\n            \"Bucket\": \"test-bucket\",\n            \"Key\": \"object.txt\"\n        },\n        vendorParams: {\n            \"endpointParams\": {\n                \"builtInParams\": {\n                    \"AWS::Region\": \"us-east-1\"\n                }\n            }\n        }\n    }\n])\n\napply PutObject @httpRequestTests([\n    {\n        id: \"DontSendDuplicateContentType\",\n        documentation: \"This test validates that if a content-type is specified, that only one content-type header is sent\",\n        method: \"PUT\",\n        protocol: \"aws.protocols#restXml\",\n        uri: \"/test-key\",\n        headers: { \"content-type\": \"text/html\" },\n        params: {\n            Bucket: \"test-bucket\",\n            Key: \"test-key\",\n            ContentType: \"text/html\"\n        },\n        vendorParams: {\n            \"endpointParams\": {\n                \"builtInParams\": {\n                    \"AWS::Region\": \"us-east-1\"\n                }\n            }\n        }\n    },\n    // TODO(BDD): reenable this, but currently it is causing an error I don't quite understand and that doesn't seem to be related\n    // to the BDD work:\n    // Projection s3 failed: software.amazon.smithy.codegen.core.CodegenException: Protocol test defines data for member shape `Body`,\n    // but member shape was not found on structure shape com.amazonaws.s3.synthetic#PutObjectInput\n    // {\n    //     id: \"DontSendDuplicateContentLength\",\n    //     documentation: \"This test validates that if a content-length is specified, that only one content-length header is sent\",\n    //     method: \"PUT\",\n    //     protocol: \"aws.protocols#restXml\",\n    //     uri: \"/test-key\",\n    //     headers: { \"content-length\": \"2\" },\n    //     params: {\n    //         Bucket: \"test-bucket\",\n    //         Key: \"test-key\",\n    //         ContentLength: 2,\n    //         Body: \"ab\"\n    //     },\n    //     vendorParams: {\n    //         \"endpointParams\": {\n    //             \"builtInParams\": {\n    //                 \"AWS::Region\": \"us-east-1\"\n    //             }\n    //         }\n    //     }\n    // }\n])\n\napply HeadObject @httpRequestTests([\n    {\n        id: \"HeadObjectUriEncoding\",\n        documentation: \"https://github.com/awslabs/aws-sdk-rust/issues/331\",\n\n        method: \"HEAD\",\n        protocol: \"aws.protocols#restXml\",\n        uri: \"/%3C%3E%20%60%3F%F0%9F%90%B1\",\n        params: {\n            Bucket: \"test-bucket\",\n            Key: \"<> `?🐱\",\n        },\n        vendorParams: {\n            \"endpointParams\": {\n                \"builtInParams\": {\n                    \"AWS::Region\": \"us-east-1\"\n                }\n            }\n        }\n    }\n])\n\napply GetObject @httpRequestTests([\n    {\n        id: \"GetObjectIfModifiedSince\",\n        documentation: \"https://github.com/awslabs/aws-sdk-rust/issues/818\",\n\n        method: \"GET\",\n        protocol: \"aws.protocols#restXml\",\n        uri: \"/object.txt\",\n        headers: { \"if-modified-since\": \"Fri, 16 Jul 2021 16:20:53 GMT\" }\n        params: {\n            Bucket: \"test-bucket\",\n            Key: \"object.txt\"\n            IfModifiedSince: 1626452453.123,\n        },\n        vendorParams: {\n            \"endpointParams\": {\n                \"builtInParams\": {\n                    \"AWS::Region\": \"us-east-1\"\n                }\n            }\n        }\n    }\n])\n\napply ListObjectVersions @httpResponseTests([\n    {\n        id: \"OutOfOrderVersions\",\n        documentation: \"Verify that interleaving list elements (DeleteMarker and Version) from different lists works\",\n        code: 200,\n        bodyMediaType: \"application/xml\",\n        protocol: \"aws.protocols#restXml\",\n        body: \"\"\"\n        <?xml version=\"1.0\"?>\n        <ListVersionsResult xmlns=\"http://s3.amazonaws.com/doc/2006-03-01/\">\n          <Name>sdk-obj-versions-test</Name>\n          <Prefix/>\n          <KeyMarker/>\n          <VersionIdMarker/>\n          <MaxKeys>1000</MaxKeys>\n          <IsTruncated>false</IsTruncated>\n          <DeleteMarker>\n            <Key>build.gradle.kts</Key>\n            <VersionId>null</VersionId>\n            <IsLatest>true</IsLatest>\n            <LastModified>2009-02-13T23:31:30Z</LastModified>\n            <Owner>\n              <ID>c1665459250c459f1849ddce9b291fc3a72bcf5220dc8f6391a0a1045c683b34</ID>\n              <DisplayName>test-name</DisplayName>\n            </Owner>\n          </DeleteMarker>\n          <Version>\n            <Key>build.gradle.kts</Key>\n            <VersionId>IfK9Z4.H5TLAtMxFrxN_C7rFEZbufF3V</VersionId>\n            <IsLatest>false</IsLatest>\n            <LastModified>2009-02-13T23:31:30Z</LastModified>\n            <ETag>\"99613b85e3f38b222c4ee548cde1e59d\"</ETag>\n            <Size>6903</Size>\n            <Owner>\n              <ID>c1665459250c459f1849ddce9b291fc3a72bcf5220dc8f6391a0a1045c683b34</ID>\n              <DisplayName>test-name</DisplayName>\n            </Owner>\n            <StorageClass>STANDARD</StorageClass>\n          </Version>\n          <DeleteMarker>\n            <Key>file-2</Key>\n            <VersionId>o98RL6vmlOYiymftbX7wgy_4XWQG4AmY</VersionId>\n            <IsLatest>true</IsLatest>\n            <LastModified>2009-02-13T23:31:30Z</LastModified>\n            <Owner>\n              <ID>c1665459250c459f1849ddce9b291fc3a72bcf5220dc8f6391a0a1045c683b34</ID>\n              <DisplayName>test-name</DisplayName>\n            </Owner>\n          </DeleteMarker>\n          <Version>\n            <Key>file-2</Key>\n            <VersionId>PSVAbvQihRdsNiktGothjGng7q.5ou9Q</VersionId>\n            <IsLatest>false</IsLatest>\n            <LastModified>2009-02-13T23:31:30Z</LastModified>\n            <ETag>\"1727d9cb38dd325d9c12c973ef3675fc\"</ETag>\n            <Size>14</Size>\n            <Owner>\n              <ID>c1665459250c459f1849ddce9b291fc3a72bcf5220dc8f6391a0a1045c683b34</ID>\n              <DisplayName>test-name</DisplayName>\n            </Owner>\n            <StorageClass>STANDARD</StorageClass>\n          </Version>\n        </ListVersionsResult>\n        \"\"\",\n            \"params\": {\n                \"Name\": \"sdk-obj-versions-test\",\n                \"Prefix\": \"\",\n                \"KeyMarker\": \"\",\n                \"VersionIdMarker\": \"\",\n                \"MaxKeys\": 1000,\n                \"IsTruncated\": false,\n                \"DeleteMarkers\": [\n                    {\n                        \"Key\": \"build.gradle.kts\",\n                        \"VersionId\": \"null\",\n                        \"IsLatest\": true,\n                        \"LastModified\": 1234567890,\n                        \"Owner\": {\n                            \"ID\": \"c1665459250c459f1849ddce9b291fc3a72bcf5220dc8f6391a0a1045c683b34\",\n                            \"DisplayName\": \"test-name\"\n                        }\n                    },\n                    {\n                        \"Key\": \"file-2\",\n                        \"VersionId\": \"o98RL6vmlOYiymftbX7wgy_4XWQG4AmY\",\n                        \"IsLatest\": true,\n                        \"LastModified\": 1234567890,\n                        \"Owner\": {\n                            \"ID\": \"c1665459250c459f1849ddce9b291fc3a72bcf5220dc8f6391a0a1045c683b34\",\n                            \"DisplayName\": \"test-name\"\n                        }\n                    }\n                ],\n                \"Versions\": [\n                    {\n                        \"Key\": \"build.gradle.kts\",\n                        \"VersionId\": \"IfK9Z4.H5TLAtMxFrxN_C7rFEZbufF3V\",\n                        \"IsLatest\": false,\n                        \"LastModified\": 1234567890,\n                        \"ETag\": \"\\\"99613b85e3f38b222c4ee548cde1e59d\\\"\",\n                        \"Size\": 6903,\n                        \"Owner\": {\n                            \"ID\": \"c1665459250c459f1849ddce9b291fc3a72bcf5220dc8f6391a0a1045c683b34\",\n                            \"DisplayName\": \"test-name\"\n                        },\n                        \"StorageClass\": \"STANDARD\"\n                    },\n                    {\n                        \"Key\": \"file-2\",\n                        \"VersionId\": \"PSVAbvQihRdsNiktGothjGng7q.5ou9Q\",\n                        \"IsLatest\": false,\n                        \"LastModified\": 1234567890,\n                        \"ETag\": \"\\\"1727d9cb38dd325d9c12c973ef3675fc\\\"\",\n                        \"Size\": 14,\n                        \"Owner\": {\n                            \"ID\": \"c1665459250c459f1849ddce9b291fc3a72bcf5220dc8f6391a0a1045c683b34\",\n                            \"DisplayName\": \"test-name\"\n                        },\n                        \"StorageClass\": \"STANDARD\"\n                    }\n                ]\n            }\n}]\n)\n\n\n// TODO(https://github.com/smithy-lang/smithy-rs/issues/157) - Remove duplicated tests if these make it into the actual model or otherwise become easier\n// to integrate.\n// Protocol tests below are duplicated from\n// https://github.com/smithy-lang/smithy/blob/main/smithy-aws-protocol-tests/model/restXml/services/s3.smithy\n// NOTE: These are duplicated because of currently difficult to replicate structural differences in the build.\n// S3 pulls in `aws-config` which requires all runtime crates to point to `build` dir. This makes adding the protocol tests\n// to `sdk-adhoc-test` difficult as it does not replicate relocating runtimes and re-processing Cargo.toml files.\n\napply DeleteObjectTagging @httpRequestTests([\n    {\n        id: \"S3EscapeObjectKeyInUriLabel\",\n        documentation: \"\"\"\n            S3 clients should escape special characters in Object Keys\n            when the Object Key is used as a URI label binding.\n        \"\"\",\n        protocol: \"aws.protocols#restXml\",\n        method: \"DELETE\",\n        uri: \"/my%20key.txt\",\n        host: \"s3.us-west-2.amazonaws.com\",\n        resolvedHost: \"mybucket.s3.us-west-2.amazonaws.com\",\n        body: \"\",\n        queryParams: [\n            \"tagging\"\n        ],\n        params: {\n            Bucket: \"mybucket\",\n            Key: \"my key.txt\"\n        },\n        vendorParams: {\n            scopedConfig: {\n                client: {\n                    region: \"us-west-2\",\n                },\n            },\n        },\n    },\n    {\n        id: \"S3EscapePathObjectKeyInUriLabel\",\n        documentation: \"\"\"\n            S3 clients should preserve an Object Key representing a path\n            when the Object Key is used as a URI label binding, but still\n            escape special characters.\n        \"\"\",\n        protocol: \"aws.protocols#restXml\",\n        method: \"DELETE\",\n        uri: \"/foo/bar/my%20key.txt\",\n        host: \"s3.us-west-2.amazonaws.com\",\n        resolvedHost: \"mybucket.s3.us-west-2.amazonaws.com\",\n        body: \"\",\n        queryParams: [\n            \"tagging\"\n        ],\n        params: {\n            Bucket: \"mybucket\",\n            Key: \"foo/bar/my key.txt\"\n        },\n        vendorParams: {\n            scopedConfig: {\n                client: {\n                    region: \"us-west-2\",\n                },\n            },\n        },\n    }\n])\n\napply GetObject @httpRequestTests([\n    {\n        id: \"S3PreservesLeadingDotSegmentInUriLabel\",\n        documentation: \"\"\"\n            S3 clients should not remove dot segments from request paths.\n        \"\"\",\n        protocol: \"aws.protocols#restXml\",\n        method: \"GET\",\n        uri: \"/../key.txt\",\n        host: \"s3.us-west-2.amazonaws.com\",\n        resolvedHost: \"mybucket.s3.us-west-2.amazonaws.com\",\n        body: \"\",\n        params: {\n            Bucket: \"mybucket\",\n            Key: \"../key.txt\"\n        },\n        vendorParams: {\n            scopedConfig: {\n                client: {\n                    region: \"us-west-2\",\n                    s3: {\n                        addressing_style: \"virtual\",\n                    },\n                },\n            },\n        },\n    },\n    {\n        id: \"S3PreservesEmbeddedDotSegmentInUriLabel\",\n        documentation: \"\"\"\n            S3 clients should not remove dot segments from request paths.\n        \"\"\",\n        protocol: \"aws.protocols#restXml\",\n        method: \"GET\",\n        uri: \"/foo/../key.txt\",\n        host: \"s3.us-west-2.amazonaws.com\",\n        resolvedHost: \"mybucket.s3.us-west-2.amazonaws.com\",\n        body: \"\",\n        params: {\n            Bucket: \"mybucket\",\n            Key: \"foo/../key.txt\"\n        },\n        vendorParams: {\n            scopedConfig: {\n                client: {\n                    region: \"us-west-2\",\n                    s3: {\n                        addressing_style: \"virtual\",\n                    },\n                },\n            },\n        },\n    }\n])\n"
  },
  {
    "path": "aws/sdk/aws-models-extra/sqs-tests.smithy",
    "content": "$version: \"1.0\"\n\nnamespace com.amazonaws.sqs\nuse smithy.test#httpRequestTests\n\napply ChangeMessageVisibility @httpRequestTests([\n    {\n        id: \"SqsSetVisibilityZero\",\n        documentation: \"This test case validates a bug found here: https://github.com/aws/aws-sdk-go-v2/issues/1087\",\n        params: {\n            QueueUrl: \"http://somequeue.amazon.com\",\n            ReceiptHandle: \"handlehandle\",\n            VisibilityTimeout: 0\n        },\n        body: \"Action=ChangeMessageVisibility&Version=2012-11-05&QueueUrl=http%3A%2F%2Fsomequeue.amazon.com&ReceiptHandle=handlehandle&VisibilityTimeout=0\",\n        protocol: \"aws.protocols#awsQuery\",\n        bodyMediaType: \"application/x-www-formurl-encoded\",\n        method: \"POST\",\n        uri: \"/\"\n    }\n])\n"
  },
  {
    "path": "aws/sdk/benchmarks/previous-release-comparison/Cargo.toml",
    "content": "[package]\nname = \"previous-release-comparison\"\nversion = \"0.1.0\"\nedition = \"2021\"\n\n# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html\n\n[dependencies]\naws-config = { path = \"../../build/aws-sdk/sdk/aws-config\" }\naws-credential-types = { path = \"../../build/aws-sdk/sdk/aws-credential-types\", features = [\"test-util\"] }\naws-sdk-s3 = { path = \"../../build/aws-sdk/sdk/s3\" }\naws-smithy-http-client = { path = \"../../build/aws-sdk/sdk/aws-smithy-http-client\", features = [\"test-util\"] }\ncriterion = { version = \"0.5\", features = [\"async_tokio\"] }\nhttp = \"1\"\nprevious-http-client = { version = \"1\", package = \"aws-smithy-http-client\", features = [\"test-util\"] }\nprevious-s3 = { version = \"1\", package = \"aws-sdk-s3\", features = [\"test-util\"] }\ntokio = { version = \"1.23.1\", features = [\"macros\", \"test-util\", \"rt-multi-thread\"] }\n\n[profile.release]\ndebug = 1\n\n[[bench]]\nname = \"previous_release_comparison\"\nharness = false\n"
  },
  {
    "path": "aws/sdk/benchmarks/previous-release-comparison/README.md",
    "content": "# Previous Release Comparison Benchmark\n\nCompares the **current locally-built SDK** against the **latest published release** on crates.io\nusing [Criterion](https://github.com/bheisler/criterion.rs) for statistically rigorous measurement.\n\nThis is useful for measuring the performance impact of local changes (on any branch) relative to\nthe last released version. The benchmark uses a mock HTTP client so results reflect pure SDK\noverhead with no network variability.\n\n## Running\n\nFirst, build the SDK from your current branch and navigate to the benchmark directory:\n\n```bash\n./gradlew :aws:sdk:assemble\ncd aws/sdk/benchmarks/previous-release-comparison\n```\n\nThen run benchmarks:\n\n```bash\n# Run all benchmarks (previous release vs current)\ncargo bench\n\n# Run only the current (local build) benchmark\ncargo bench -- \"compare/current\"\n\n# Run only the previous (published release) benchmark\ncargo bench -- \"compare/previous\"\n```\n\n## Output\n\nCriterion reports per-iteration timing with confidence intervals for both `previous` (published\nrelease) and `current` (local build). On subsequent runs it also reports whether performance\nchanged relative to the last run.\n"
  },
  {
    "path": "aws/sdk/benchmarks/previous-release-comparison/benches/previous_release_comparison.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n#[macro_use]\nextern crate criterion;\nuse criterion::{BenchmarkId, Criterion};\n\nconst LIST_OBJECTS_RESPONSE: &str = r#\"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n    <ListBucketResult>\n        <Name>test-bucket</Name>\n        <Prefix>prefix~</Prefix>\n        <KeyCount>1</KeyCount>\n        <MaxKeys>1000</MaxKeys>\n        <IsTruncated>false</IsTruncated>\n        <Contents>\n            <Key>some-file.file</Key>\n            <LastModified>2009-10-12T17:50:30.000Z</LastModified>\n            <Size>434234</Size>\n            <StorageClass>STANDARD</StorageClass>\n        </Contents>\n    </ListBucketResult>\"#;\n\nmacro_rules! test_client {\n    (previous) => {\n        test_client!(@internal previous_http_client)\n    };\n    (current) => {\n        test_client!(@internal aws_smithy_http_client)\n    };\n    (@internal $crate_path:ident) => {\n        $crate_path::test_util::infallible_client_fn(|req| {\n            assert_eq!(\n                \"https://test-bucket.s3.us-east-1.amazonaws.com/?list-type=2&prefix=prefix~\",\n                req.uri().to_string()\n            );\n            http::Response::builder()\n                .status(200)\n                .body(LIST_OBJECTS_RESPONSE)\n                .unwrap()\n        })\n    };\n}\n\nmacro_rules! test {\n    (previous, $client:ident) => {\n        test!(@internal, $client)\n    };\n    (current, $client:ident) => {\n        test!(@internal, $client)\n    };\n    (@internal, $client:ident) => {\n        $client\n            .list_objects_v2()\n            .bucket(\"test-bucket\")\n            .prefix(\"prefix~\")\n            .send()\n            .await\n            .expect(\"successful execution\")\n    };\n}\n\nfn bench(c: &mut Criterion) {\n    let current_client = {\n        let http_client = test_client!(current);\n        let config = aws_sdk_s3::Config::builder()\n            .behavior_version(aws_sdk_s3::config::BehaviorVersion::latest())\n            .credentials_provider(aws_sdk_s3::config::Credentials::for_tests())\n            .region(aws_sdk_s3::config::Region::new(\"us-east-1\"))\n            .http_client(http_client)\n            .build();\n        aws_sdk_s3::Client::from_conf(config)\n    };\n    let previous_client = {\n        let http_client = test_client!(previous);\n        let config = previous_s3::Config::builder()\n            .behavior_version(previous_s3::config::BehaviorVersion::latest())\n            .credentials_provider(previous_s3::config::Credentials::for_tests())\n            .region(previous_s3::config::Region::new(\"us-east-1\"))\n            .http_client(http_client)\n            .build();\n        previous_s3::Client::from_conf(config)\n    };\n\n    let mut group = c.benchmark_group(\"compare\");\n    let param = \"S3 ListObjectsV2\";\n    group.bench_with_input(BenchmarkId::new(\"previous\", param), param, |b, _| {\n        b.to_async(tokio::runtime::Runtime::new().unwrap())\n            .iter(|| async { std::hint::black_box(test!(previous, previous_client)) })\n    });\n    group.bench_with_input(BenchmarkId::new(\"current\", param), param, |b, _| {\n        b.to_async(tokio::runtime::Runtime::new().unwrap())\n            .iter(|| async { std::hint::black_box(test!(current, current_client)) })\n    });\n    group.finish();\n}\n\ncriterion_group!(benches, bench);\ncriterion_main!(benches);\n"
  },
  {
    "path": "aws/sdk/benchmarks/s3-express/Cargo.toml",
    "content": "[package]\nname = \"s3-express\"\nversion = \"0.1.0\"\nedition = \"2021\"\n\n# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html\n\n[dependencies]\naws-config = { path = \"../../build/aws-sdk/sdk/aws-config\", features = [\"behavior-version-latest\"] }\naws-sdk-s3 = { path = \"../../build/aws-sdk/sdk/s3\", features = [\"behavior-version-latest\"] }\ncriterion = { version = \"0.5\", features = [\"async_tokio\"] }\nfutures-util = { version = \"0.3.29\", default-features = false, features = [\"alloc\"] }\ntokio = { version = \"1.23.1\", features = [\"macros\", \"test-util\", \"rt-multi-thread\"] }\n\n[[bench]]\nname = \"concurrent_put_get\"\nharness = false\n\n[[bench]]\nname = \"get_object\"\nharness = false\n\n[[bench]]\nname = \"put_get_delete\"\nharness = false\n\n[[bench]]\nname = \"put_object\"\nharness = false\n\n[profile.bench]\ndebug = true\n"
  },
  {
    "path": "aws/sdk/benchmarks/s3-express/README.md",
    "content": "# S3 Express Benchmark\n\nThis directory contains S3 Express One Zone benchmarks that measure end-to-end throughput when using the AWS Rust SDK to put, get, and delete objects to/from S3 Express One Zone buckets. We use [`Criterion`](https://github.com/bheisler/criterion.rs) for benchmarks. A sibling directory `s3-throughput` also measures throughput to put and get objects to/from S3 but currently does not support generating benchmark results with a given confidence interval, which is why we have this separate benchmark suite.\n\nPerformance numbers will vary depending on the benchmarking environment, but relative performance should still be accurate (i.e. regular S3 bucket vs. S3 Express bucket or comparing with a previous release of the Rust SDK).\n\n## Benchmark targets\n- `get_object`: Invoke `GetObject` the specified number of times (20 by default) against a given set of buckets, using both 64KB and 1MB objects.\n- `put_object`: Invoke `PutObject` the specified number of times (20 by default) against a given set of buckets, using both 64KB and 1MB objects.\n- `put_get_delete`: `PutObject`, `GetObject`, and `DeleteObject` using sequential invocations (20 by default) of operations across different buckets, switching buckets on every request and using both 64KB and 1MB objects.\n- `concurrent_put_get`: Schedule the equal number of async tasks of `PutObject` (20 by default) to different buckets, wait for completion, then schedule the equal number of async tasks of `GetObject` to different buckets, and wait for completion, using the 64KB objects.\n\n## Running benchmarks\nExample of running the `put_object` benchmark in local dev environment:\n\n```bash\nexport BUCKETS=test0--usw2-az1--x-s3,test1--usw2-az1--x-s3\ncargo bench --bench put_object\n```\nTo configure how the benchmark is run, set the following environment variables:\n#### required\n- `BUCKETS`: a list of comma separated bucket names\n\n#### optional\n- `CONFIDENCE_LEVEL`: the confidence level for benchmarks in a group (0.99 by default)\n- `NUMBER_OF_ITERATIONS`: the number of times a set of operations runs for measurement (20 by default)\n- `SAMPLE_SIZE`: the size of the sample for benchmarks in a group (10 by default)\n\n### Flamegraph generation\nUse [`flamegraph`](https://github.com/flamegraph-rs/flamegraph) to generate one for a target bench, for instance:\n```bash\nexport BUCKETS=test0--usw2-az1--x-s3,test1--usw2-az1--x-s3\ncargo flamegraph --bench put_get_delete -- --bench\n```\n\nThe resulting flamegraph `flamegraph.svg` should be generated in the current directory.\n\n\n## Limitation\nBenchmarks currently measure end-to-end throughput of operations, including both the Rust SDK latency and the server side latency. To detect regressions in the Rust SDK reliably, we should only capture the time taken before sending a request and after receiving a response.\n\n## Baseline\nAs of b172a1e, here are performance numbers for the targets `get_object` and `put_object` run against a single express bucket within the `us-west-2` region (showing additional outputs to display config parameters). The benchmarks are measured on Amazon Linux 2 x86_64 5.10 Kernel with a host type c5.4xlarge.\n```\n[src/lib.rs:30] sample_size = 10\n[src/lib.rs:14] confidence_level = 0.99\n[src/lib.rs:23] number_of_iterations = 20\nmeasuring 20 of GetObject against [\n    \"s3express-rust-sdk-benchmark--usw2-az1--x-s3\",\n], switching buckets on every operation if more than one bucket is specified\nget_object/size/65536   time:   [304.20 ms 311.62 ms 317.62 ms]\nget_object/size/1048576 time:   [283.94 ms 289.16 ms 293.42 ms]\n\n[src/lib.rs:30] sample_size = 10\n[src/lib.rs:14] confidence_level = 0.99\n[src/lib.rs:23] number_of_iterations = 20\nmeasuring 20 of PutObject against [\n    \"s3express-rust-sdk-benchmark--usw2-az1--x-s3\",\n], switching buckets on every operation if more than one bucket is specified\nput_object/size/65536   time:   [163.01 ms 172.76 ms 185.16 ms]\nput_object/size/1048576 time:   [356.49 ms 368.64 ms 383.51 ms]\n```\n"
  },
  {
    "path": "aws/sdk/benchmarks/s3-express/benches/concurrent_put_get.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_config::BehaviorVersion;\nuse aws_sdk_s3::primitives::ByteStream;\nuse criterion::{criterion_group, criterion_main, BenchmarkId, Criterion};\nuse s3_express::{confidence_level, number_of_iterations, sample_size};\nuse tokio::runtime::Runtime;\nuse tokio::task;\n\npub fn concurrent_put_get(c: &mut Criterion) {\n    let buckets = if let Ok(buckets) = std::env::var(\"BUCKETS\") {\n        buckets.split(\",\").map(String::from).collect::<Vec<_>>()\n    } else {\n        panic!(\"required environment variable `BUCKETS` should be set: e.g. `BUCKETS=\\\"bucket1,bucket2\\\"`\")\n    };\n\n    let number_of_iterations = number_of_iterations();\n\n    println!(\n        \"measuring {number_of_iterations} concurrent PutObject followed by \\\n            {number_of_iterations} concurrent GetObject against \\\n            {buckets:#?}, with each bucket being assigned equal number of operations\\n\"\n    );\n\n    let client = Runtime::new().unwrap().block_on(async {\n        let config = aws_config::load_defaults(BehaviorVersion::latest()).await;\n        aws_sdk_s3::Client::new(&config)\n    });\n\n    const KB: usize = 1024;\n    const SIZE: usize = 64 * KB;\n    let object: Vec<u8> = vec![0; SIZE];\n    let mut group = c.benchmark_group(\"concurrent_put_delete\");\n    group.bench_with_input(BenchmarkId::new(\"size\", SIZE), &SIZE, |b, _| {\n        b.to_async(Runtime::new().unwrap()).iter(|| async {\n            let put_futures = (0..number_of_iterations)\n                .map({\n                    let client = client.clone();\n                    let buckets = buckets.clone();\n                    let object = object.clone();\n                    move |i| {\n                        task::spawn({\n                            let client = client.clone();\n                            let buckets = buckets.clone();\n                            let object = object.clone();\n                            async move {\n                                client\n                                    .put_object()\n                                    .bucket(&buckets[i % buckets.len()])\n                                    .key(&format!(\"test{i}\"))\n                                    .body(ByteStream::from(object))\n                                    .send()\n                                    .await\n                                    .unwrap();\n                            }\n                        })\n                    }\n                })\n                .collect::<Vec<_>>();\n            ::futures_util::future::join_all(put_futures).await;\n\n            let get_futures = (0..number_of_iterations)\n                .map({\n                    let client = client.clone();\n                    let buckets = buckets.clone();\n                    move |i| {\n                        task::spawn({\n                            let client = client.clone();\n                            let buckets = buckets.clone();\n                            async move {\n                                client\n                                    .get_object()\n                                    .bucket(&buckets[i % buckets.len()])\n                                    .key(&format!(\"test{i}\"))\n                                    .send()\n                                    .await\n                                    .unwrap();\n                            }\n                        })\n                    }\n                })\n                .collect::<Vec<_>>();\n            ::futures_util::future::join_all(get_futures).await;\n        });\n    });\n    group.finish();\n}\n\ncriterion_group!(\n    name = benches;\n    config = Criterion::default().sample_size(sample_size()).confidence_level(confidence_level());\n    targets = concurrent_put_get\n);\ncriterion_main!(benches);\n"
  },
  {
    "path": "aws/sdk/benchmarks/s3-express/benches/get_object.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_config::BehaviorVersion;\nuse aws_sdk_s3::primitives::ByteStream;\nuse criterion::{criterion_group, criterion_main, BenchmarkId, Criterion};\nuse s3_express::{confidence_level, number_of_iterations, sample_size};\nuse tokio::runtime::Runtime;\n\nasync fn prepare_test_objects<T: AsRef<str>>(buckets: &[T], object_sizes: &[usize]) {\n    let config = aws_config::load_defaults(BehaviorVersion::latest()).await;\n    let client = aws_sdk_s3::Client::new(&config);\n\n    for size in object_sizes {\n        let object: Vec<u8> = vec![0; *size];\n        for bucket in buckets.as_ref() {\n            client\n                .put_object()\n                .bucket(bucket.as_ref())\n                .key(&format!(\"test-{size}\"))\n                .body(ByteStream::from(object.clone()))\n                .send()\n                .await\n                .unwrap();\n        }\n    }\n}\n\npub fn get_object(c: &mut Criterion) {\n    let buckets = if let Ok(buckets) = std::env::var(\"BUCKETS\") {\n        buckets.split(\",\").map(String::from).collect::<Vec<_>>()\n    } else {\n        panic!(\"required environment variable `BUCKETS` should be set: e.g. `BUCKETS=\\\"bucket1,bucket2\\\"`\")\n    };\n\n    let number_of_iterations = number_of_iterations();\n\n    println!(\n        \"measuring {number_of_iterations} of GetObject against {buckets:#?}, \\\n        switching buckets on every operation if more than one bucket is specified\\n\"\n    );\n\n    const KB: usize = 1024;\n    let sizes = [64 * KB, KB * KB];\n\n    let client = Runtime::new().unwrap().block_on(async {\n        prepare_test_objects(&buckets, &sizes).await;\n\n        // Return a new client that has an empty identity cache\n        let config = aws_config::load_defaults(BehaviorVersion::latest()).await;\n        aws_sdk_s3::Client::new(&config)\n    });\n\n    let mut group = c.benchmark_group(\"get_object\");\n\n    for size in sizes.iter() {\n        let key = format!(\"test-{size}\");\n        group.bench_with_input(BenchmarkId::new(\"size\", size), size, |b, _| {\n            b.to_async(Runtime::new().unwrap()).iter(|| async {\n                for i in 0..number_of_iterations {\n                    let bucket = &buckets[i % buckets.len()];\n                    client\n                        .get_object()\n                        .bucket(bucket)\n                        .key(&key)\n                        .send()\n                        .await\n                        .unwrap();\n                }\n            });\n        });\n    }\n    group.finish();\n\n    // Clean up test objects\n    Runtime::new().unwrap().block_on(async {\n        for size in sizes {\n            let key = format!(\"test-{size}\");\n            for bucket in &buckets {\n                client\n                    .delete_object()\n                    .bucket(bucket)\n                    .key(&key)\n                    .send()\n                    .await\n                    .unwrap();\n            }\n        }\n    });\n}\n\ncriterion_group!(\n    name = benches;\n    config = Criterion::default().sample_size(sample_size()).confidence_level(confidence_level());\n    targets = get_object\n);\ncriterion_main!(benches);\n"
  },
  {
    "path": "aws/sdk/benchmarks/s3-express/benches/put_get_delete.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_config::BehaviorVersion;\nuse aws_sdk_s3::primitives::ByteStream;\nuse criterion::{criterion_group, criterion_main, BenchmarkId, Criterion};\nuse s3_express::{confidence_level, number_of_iterations, sample_size};\nuse tokio::runtime::Runtime;\n\npub fn put_get_delete(c: &mut Criterion) {\n    let buckets = if let Ok(buckets) = std::env::var(\"BUCKETS\") {\n        buckets.split(\",\").map(String::from).collect::<Vec<_>>()\n    } else {\n        panic!(\"required environment variable `BUCKETS` should be set: e.g. `BUCKETS=\\\"bucket1,bucket2\\\"`\")\n    };\n\n    let number_of_iterations = number_of_iterations();\n\n    println!(\n        \"measuring {number_of_iterations} sequences of \\\n            PutObject -> GetObject -> DeleteObject against \\\n            {buckets:#?}, switching buckets on every sequence of operations if more than one bucket is specified\\n\"\n    );\n\n    let client = Runtime::new().unwrap().block_on(async {\n        let config = aws_config::load_defaults(BehaviorVersion::latest()).await;\n        aws_sdk_s3::Client::new(&config)\n    });\n\n    let mut group = c.benchmark_group(\"put_get_delete\");\n\n    const KB: usize = 1024;\n    for size in [64 * KB, KB * KB].iter() {\n        let object: Vec<u8> = vec![0; *size];\n        group.bench_with_input(BenchmarkId::new(\"size\", size), size, |b, _| {\n            b.to_async(Runtime::new().unwrap()).iter(|| async {\n                for i in 0..number_of_iterations {\n                    let bucket = &buckets[i % buckets.len()];\n                    let key = \"test\";\n                    client\n                        .put_object()\n                        .bucket(bucket)\n                        .key(key)\n                        .body(ByteStream::from(object.clone()))\n                        .send()\n                        .await\n                        .unwrap();\n\n                    client\n                        .get_object()\n                        .bucket(bucket)\n                        .key(key)\n                        .send()\n                        .await\n                        .unwrap();\n\n                    client\n                        .delete_object()\n                        .bucket(bucket)\n                        .key(key)\n                        .send()\n                        .await\n                        .unwrap();\n                }\n            });\n        });\n    }\n    group.finish();\n}\n\ncriterion_group!(\n    name = benches;\n    config = Criterion::default().sample_size(sample_size()).confidence_level(confidence_level());\n    targets = put_get_delete\n);\ncriterion_main!(benches);\n"
  },
  {
    "path": "aws/sdk/benchmarks/s3-express/benches/put_object.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_config::BehaviorVersion;\nuse aws_sdk_s3::primitives::ByteStream;\nuse criterion::{criterion_group, criterion_main, BenchmarkId, Criterion};\nuse s3_express::{confidence_level, number_of_iterations, sample_size};\nuse tokio::runtime::Runtime;\n\npub fn put_object(c: &mut Criterion) {\n    let buckets = if let Ok(buckets) = std::env::var(\"BUCKETS\") {\n        buckets.split(\",\").map(String::from).collect::<Vec<_>>()\n    } else {\n        panic!(\"required environment variable `BUCKETS` should be set: e.g. `BUCKETS=\\\"bucket1,bucket2\\\"`\")\n    };\n\n    let number_of_iterations = number_of_iterations();\n\n    println!(\n        \"measuring {number_of_iterations} of PutObject against {buckets:#?}, \\\n        switching buckets on every operation if more than one bucket is specified\\n\"\n    );\n\n    let client = Runtime::new().unwrap().block_on(async {\n        let config = aws_config::load_defaults(BehaviorVersion::latest()).await;\n        aws_sdk_s3::Client::new(&config)\n    });\n\n    let mut group = c.benchmark_group(\"put_object\");\n\n    let key = \"test\";\n    const KB: usize = 1024;\n    for size in [64 * KB, KB * KB].iter() {\n        let object: Vec<u8> = vec![0; *size];\n        group.bench_with_input(BenchmarkId::new(\"size\", size), size, |b, _| {\n            b.to_async(Runtime::new().unwrap()).iter(|| async {\n                for i in 0..number_of_iterations {\n                    let bucket = &buckets[i % buckets.len()];\n                    client\n                        .put_object()\n                        .bucket(bucket)\n                        .key(key)\n                        .body(ByteStream::from(object.clone()))\n                        .send()\n                        .await\n                        .unwrap();\n                }\n            });\n        });\n    }\n    group.finish();\n\n    // Clean up test objects\n    Runtime::new().unwrap().block_on(async {\n        for bucket in buckets {\n            client\n                .delete_object()\n                .bucket(bucket)\n                .key(key)\n                .send()\n                .await\n                .unwrap();\n        }\n    });\n}\n\ncriterion_group!(\n    name = benches;\n    config = Criterion::default().sample_size(sample_size()).confidence_level(confidence_level());\n    targets = put_object\n);\ncriterion_main!(benches);\n"
  },
  {
    "path": "aws/sdk/benchmarks/s3-express/src/lib.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nconst DEFAULT_CONFIDENCE_LEVEL: f64 = 0.99;\nconst DEFAULT_NUMBER_OF_ITERATIONS: usize = 20;\nconst DEFAULT_SAMPLE_SIZE: usize = 10;\n\n/// Configures the confidence level for benchmarks\npub fn confidence_level() -> f64 {\n    let confidence_level = std::env::var(\"CONFIDENCE_LEVEL\")\n        .map_or(DEFAULT_CONFIDENCE_LEVEL, |s| s.parse::<f64>().unwrap());\n    dbg!(confidence_level)\n}\n\n/// Configures the number of times operations run for measurement\npub fn number_of_iterations() -> usize {\n    let number_of_iterations = std::env::var(\"NUMBER_OF_ITERATIONS\")\n        .map_or(DEFAULT_NUMBER_OF_ITERATIONS, |n| {\n            n.parse::<usize>().unwrap()\n        });\n    dbg!(number_of_iterations)\n}\n\n/// Configures the sample size for benchmarks\npub fn sample_size() -> usize {\n    let sample_size =\n        std::env::var(\"SAMPLE_SIZE\").map_or(DEFAULT_SAMPLE_SIZE, |s| s.parse::<usize>().unwrap());\n    dbg!(sample_size)\n}\n"
  },
  {
    "path": "aws/sdk/benchmarks/s3-throughput/README.md",
    "content": "S3 Benchmark\n============\n\nThis directory contains a S3 benchmark that measures throughput when using the AWS Rust SDK to put and get objects to/from S3.\nThe `benchmark/` directory has the Rust benchmark code, and `infrastructure/` contains the CDK infrastructure to stand up\na `c5n.18xlarge` EC2 instance, compile/run the benchmark, and upload the results to S3.\n\nExample of running the `get-object-multipart` benchmark in local dev:\n\n```bash\ncargo run -- --bench get-object-multipart --fs disk --part-size-bytes 5242880 --size-bytes 6000000 --bucket my-test-bucket --region us-west-2 --profile my-aws-credentials-profile\n```\n\nOn Linux, the `--fs` option can be given either `disk` or `tmpfs` (for an in-memory filesystem), while on other OSes, only `disk` is available.\n\nIn addition to `get-object-multipart`, there are `put-object-multipart`, `put-object`, and `get-object`. All of these take the\nsame CLI arguments, although `--part-size-bytes` is unused by `put-object` and `get-object`.\n\nTo run the actual benchmark, it must be deployed via CDK from the `infrastructure/` directory:\n\n```bash\nnpm install\nnpm run build\nnpx cdk bootstrap --profile my-aws-credentials-profile\nnpx cdk synthesize --profile my-aws-credentials-profile\nnpx cdk deploy --profile my-aws-credentials-profile\n```\n\nThe `lib/instrastructure-stack.ts` defines the actual CloudFormation stack that creates the EC2 Instance.\nThis instance is configured to run the `assets/init_instance.sh` and `assets/run_benchmark.sh` scripts on start-up.\nIt's also configured for SSH access via a key pair named \"S3BenchmarkKeyPair\". This key pair has to be created manually\nbefore deploying the CDK stack.\n"
  },
  {
    "path": "aws/sdk/benchmarks/s3-throughput/benchmark/Cargo.toml",
    "content": "[package]\nname = \"benchmark\"\nversion = \"0.1.0\"\nauthors = [\"AWS Rust SDK Team <aws-sdk-rust@amazon.com>\", \"John DiSanti <jdisanti@amazon.com>\"]\ndescription = \"S3 benchmark\"\nedition = \"2021\"\nlicense = \"Apache-2.0\"\nrepository = \"https://github.com/smithy-lang/smithy-rs\"\npublish = false\n\n[dependencies]\naws-config = { version = \"1\", features = [\"behavior-version-latest\"] }\naws-sdk-s3 = \"1\"\nclap = { version = \"4.3.2\", default-features = false, features = [\"derive\", \"std\", \"help\"] }\ntokio = { version = \"1.28.2\", features = [\"full\"] }\ntracing-subscriber = { version = \"0.3.17\", features = [\"env-filter\"] }\ntracing = \"0.1\"\nasync-trait = \"0.1.74\"\nhyper = { version = \"0.14.27\", features = [\"client\"] }\n"
  },
  {
    "path": "aws/sdk/benchmarks/s3-throughput/benchmark/src/get_test.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::{verify, Args, BoxError};\nuse async_trait::async_trait;\nuse aws_config::SdkConfig;\nuse aws_sdk_s3::Client;\nuse std::path::{Path, PathBuf};\n\npub(crate) struct GetTestResult {\n    pub(crate) expected: PathBuf,\n    pub(crate) actual: PathBuf,\n}\n\n#[async_trait]\npub(crate) trait GetBenchmark {\n    type Setup: Send;\n    async fn prepare(&self, conf: &SdkConfig) -> Self::Setup;\n    async fn do_get(\n        &self,\n        state: Self::Setup,\n        target_path: &Path,\n        args: &Args,\n    ) -> Result<PathBuf, BoxError>;\n    async fn do_bench(\n        &self,\n        state: Self::Setup,\n        args: &Args,\n        expected_path: &Path,\n    ) -> Result<GetTestResult, BoxError> {\n        let target_path = expected_path.with_extension(\"downloaded\");\n        let downloaded_path = self.do_get(state, &target_path, args).await?;\n        Ok(GetTestResult {\n            expected: expected_path.to_path_buf(),\n            actual: downloaded_path,\n        })\n    }\n\n    async fn verify(\n        &self,\n        _client: &Client,\n        _args: &Args,\n        result: GetTestResult,\n    ) -> Result<(), BoxError> {\n        verify::diff(&result.actual, &result.expected).await\n    }\n}\n"
  },
  {
    "path": "aws/sdk/benchmarks/s3-throughput/benchmark/src/latencies.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::fmt;\nuse std::time;\n\nconst ONE_GIGABYTE: u64 = 1000 * 1000 * 1000;\n\n#[derive(Debug)]\npub struct Latencies {\n    object_size_bytes: u64,\n    raw_values: Vec<f64>,\n}\n\nimpl Latencies {\n    pub fn new(object_size_bytes: u64) -> Self {\n        Self {\n            object_size_bytes,\n            raw_values: Vec::new(),\n        }\n    }\n\n    pub fn push(&mut self, value: time::Duration) {\n        self.raw_values.push(value.as_secs_f64());\n    }\n\n    /// Calculates the standard deviation squared of the given values.\n    fn variance(values: &[f64], average: f64) -> f64 {\n        values\n            .iter()\n            .map(|value| (value - average).powi(2))\n            .sum::<f64>()\n            / values.len() as f64\n    }\n}\n\nimpl fmt::Display for Latencies {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        let object_size_gigabits = self.object_size_bytes as f64 / ONE_GIGABYTE as f64 * 8f64;\n\n        let average_latency = self.raw_values.iter().sum::<f64>() / self.raw_values.len() as f64;\n        let lowest_latency = self\n            .raw_values\n            .iter()\n            .fold(std::f64::INFINITY, |acc, &x| acc.min(x));\n        let variance = Self::variance(&self.raw_values, average_latency);\n        writeln!(f, \"Latency values (s): {:?}\", self.raw_values)?;\n        writeln!(f, \"Average latency (s): {average_latency}\")?;\n        writeln!(f, \"Latency variance (s): {variance}\")?;\n        writeln!(f, \"Object size (Gigabits): {object_size_gigabits}\")?;\n        writeln!(\n            f,\n            \"Average throughput (Gbps): {}\",\n            object_size_gigabits / average_latency\n        )?;\n        writeln!(\n            f,\n            \"Highest average throughput (Gbps): {}\",\n            object_size_gigabits / lowest_latency\n        )?;\n        Ok(())\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use crate::latencies::{Latencies, ONE_GIGABYTE};\n\n    #[test]\n    fn test_display() {\n        let latencies = Latencies {\n            object_size_bytes: 30 * ONE_GIGABYTE,\n            raw_values: vec![\n                33.261f64, 41.114, 33.014, 32.97, 34.138, 33.972, 33.001, 34.12,\n            ],\n        };\n\n        let expected = \"\\\n            Latency values (s): [33.261, 41.114, 33.014, 32.97, 34.138, 33.972, 33.001, 34.12]\\n\\\n            Average latency (s): 34.448750000000004\\n\\\n            Latency variance (s): 6.576178687499994\\n\\\n            Object size (Gigabits): 240\\n\\\n            Average throughput (Gbps): 6.966871076599295\\n\\\n            Highest average throughput (Gbps): 7.279344858962694\\n\";\n        let actual = latencies.to_string();\n        assert_eq!(expected, actual);\n    }\n}\n"
  },
  {
    "path": "aws/sdk/benchmarks/s3-throughput/benchmark/src/main.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::latencies::Latencies;\nuse crate::multipart_put::{put_object_multipart, PutObjectMultipart};\nuse async_trait::async_trait;\nuse aws_config::SdkConfig;\nuse aws_sdk_s3 as s3;\nuse aws_sdk_s3::Client;\nuse clap::Parser as _;\nuse s3::error::DisplayErrorContext;\nuse s3::primitives::ByteStream;\nuse std::error::Error as StdError;\nuse std::path::Path;\nuse std::path::PathBuf;\nuse std::process;\nuse std::process::{Command, Stdio};\nuse std::time;\n\nmod get_test;\nmod latencies;\nmod multipart_get;\nmod multipart_put;\nmod put_test;\nmod verify;\n\npub type BoxError = Box<dyn StdError + Send + Sync>;\n\npub const BENCH_KEY: &str = \"s3_bench_file\";\n\nuse crate::get_test::GetBenchmark;\nuse crate::put_test::PutBenchmark;\nuse tracing::Instrument;\n\n#[derive(Copy, Clone, Debug, clap::ValueEnum)]\npub enum Fs {\n    #[cfg(target_os = \"linux\")]\n    // Use tmpfs\n    Tmpfs,\n    // Use the disk\n    Disk,\n}\n\n#[derive(Copy, Clone, Debug, clap::ValueEnum)]\npub enum Bench {\n    PutObject,\n    GetObject,\n    PutObjectMultipart,\n    GetObjectMultipart,\n}\n\n#[derive(Debug, Clone, clap::Parser)]\n#[command()]\npub struct Args {\n    /// Which benchmark to run.\n    #[arg(long)]\n    bench: Bench,\n\n    /// Local FS type to use.\n    #[arg(long)]\n    fs: Fs,\n\n    /// Size of the object to benchmark with.\n    #[arg(long)]\n    size_bytes: u64,\n\n    /// S3 bucket to test against.\n    #[arg(long)]\n    bucket: String,\n\n    /// AWS region to use. Defaults to us-east-1.\n    #[arg(long, default_value = \"us-east-1\")]\n    region: String,\n\n    /// AWS credentials profile to use.\n    #[arg(long)]\n    profile: Option<String>,\n\n    /// Part size for multipart benchmarks. Defaults to 8 MiB.\n    #[arg(long, default_value_t = 8_388_608)]\n    part_size_bytes: u64,\n\n    /// Number of benchmark iterations to perform.\n    #[arg(long, default_value_t = 8)]\n    iterations: usize,\n\n    /// Number of concurrent uploads/downloads to perform.\n    #[arg(long, default_value_t = 4)]\n    concurrency: usize,\n\n    #[arg(long, default_value_t = 1000)]\n    part_upload_timeout_millis: u64,\n}\n\n#[tokio::main]\nasync fn main() {\n    tracing_subscriber::fmt::init();\n\n    let args = Args::parse();\n    let config = {\n        let mut loader =\n            aws_config::from_env().region(s3::config::Region::new(args.region.clone()));\n        if let Some(profile) = args.profile.as_ref() {\n            loader = loader.profile_name(profile);\n        }\n        loader.load().await\n    };\n\n    let result = match args.bench {\n        Bench::PutObject => benchmark_put_object(&config, &args).await,\n        Bench::GetObject => benchmark_get_object(&config, &args).await,\n        Bench::PutObjectMultipart => benchmark_put_object_multipart(&config, &args).await,\n        Bench::GetObjectMultipart => benchmark_get_object_multipart(&config, &args).await,\n    };\n    match result {\n        Ok(latencies) => {\n            println!(\"benchmark succeeded\");\n            println!(\"=============== {:?} Result ================\", args.bench);\n            println!(\"{latencies}\");\n            println!(\"==========================================================\");\n        }\n        Err(err) => {\n            println!(\"benchmark failed: {}\", DisplayErrorContext(err.as_ref()));\n            process::exit(1);\n        }\n    }\n}\n\nmacro_rules! benchmark {\n    ($sdk_config:ident, $args:ident, setup => $setup:expr, operation => $operation:expr) => {{\n        #[allow(unused)]\n        use crate::get_test::GetBenchmark;\n        #[allow(unused)]\n        use crate::put_test::PutBenchmark;\n        println!(\"setting up...\");\n        let test_file_path = generate_test_file($args)?;\n        let setup_client = aws_sdk_s3::Client::new(&$sdk_config);\n        $setup(&setup_client, $args, &test_file_path).await?;\n        println!(\"setup complete\");\n\n        let mut latencies = Latencies::new($args.size_bytes);\n        for i in 0..$args.iterations {\n            let span = tracing::info_span!(\"run operation\");\n            let bench = $operation;\n            let client = bench.prepare($sdk_config).await;\n            let start = time::Instant::now();\n            let result = bench\n                .do_bench(client, $args, &test_file_path)\n                .instrument(span)\n                .await?;\n            let latency = start.elapsed();\n            if let Err(e) = bench.verify(&setup_client, $args, result).await {\n                println!(\"benchmark did not finish correctly: {}\", e);\n            }\n            latencies.push(latency);\n            println!(\n                \"finished iteration {i} in {} seconds\",\n                latency.as_secs_f64()\n            );\n        }\n\n        Ok(latencies)\n    }};\n}\n\nasync fn benchmark_put_object(conf: &SdkConfig, args: &Args) -> Result<Latencies, BoxError> {\n    struct PutObject;\n    #[async_trait]\n    impl PutBenchmark for PutObject {\n        type Setup = Client;\n\n        async fn prepare(&self, conf: &SdkConfig) -> Self::Setup {\n            Client::new(conf)\n        }\n\n        async fn do_put(\n            &self,\n            state: Self::Setup,\n            target_key: &str,\n            local_file: &Path,\n            args: &Args,\n        ) -> Result<(), BoxError> {\n            state\n                .put_object()\n                .bucket(&args.bucket)\n                .key(target_key)\n                .body(ByteStream::from_path(local_file).await?)\n                .send()\n                .await?;\n            Ok(())\n        }\n    }\n    benchmark!(conf, args, setup => no_setup, operation => PutObject)\n}\n\nasync fn benchmark_get_object(client: &SdkConfig, args: &Args) -> Result<Latencies, BoxError> {\n    struct GetObject;\n    #[async_trait]\n    impl GetBenchmark for GetObject {\n        type Setup = Client;\n\n        async fn prepare(&self, conf: &SdkConfig) -> Self::Setup {\n            Client::new(conf)\n        }\n\n        async fn do_get(\n            &self,\n            state: Self::Setup,\n            target_path: &Path,\n            args: &Args,\n        ) -> Result<PathBuf, BoxError> {\n            let output = state\n                .get_object()\n                .bucket(&args.bucket)\n                .key(BENCH_KEY)\n                .send()\n                .await?;\n            let mut body = output.body.into_async_read();\n            let mut file = tokio::fs::File::create(target_path).await?;\n            tokio::io::copy(&mut body, &mut file).await?;\n            Ok(target_path.to_path_buf())\n        }\n    }\n    benchmark!(client, args, setup => put_object_intelligent, operation => GetObject)\n}\n\nasync fn benchmark_put_object_multipart(\n    conf: &SdkConfig,\n    args: &Args,\n) -> Result<Latencies, BoxError> {\n    benchmark!(conf, args, setup => no_setup, operation => PutObjectMultipart)\n}\n\nasync fn benchmark_get_object_multipart(\n    config: &SdkConfig,\n    args: &Args,\n) -> Result<Latencies, BoxError> {\n    benchmark!(config, args, setup => put_object_intelligent, operation => multipart_get::GetObjectMultipart::new())\n}\n\nfn generate_test_file(args: &Args) -> Result<PathBuf, BoxError> {\n    let path = match args.fs {\n        Fs::Disk => format!(\"/tmp/{BENCH_KEY}\").into(),\n        #[cfg(target_os = \"linux\")]\n        Fs::Tmpfs => {\n            if !PathBuf::from(\"/dev/shm\").exists() {\n                return Err(\"tmpfs not available on this machine\".into());\n            }\n            format!(\"/dev/shm/{BENCH_KEY}\").into()\n        }\n    };\n\n    let mut yes_process = Command::new(\"yes\")\n        .arg(\"01234567890abcdefghijklmnopqrstuvwxyz\")\n        .stdout(Stdio::piped())\n        .spawn()?;\n\n    let mut head_process = Command::new(\"head\")\n        .arg(\"-c\")\n        .arg(format!(\"{}\", args.size_bytes))\n        .stdin(yes_process.stdout.take().unwrap())\n        .stdout(Stdio::piped())\n        .spawn()?;\n\n    let mut file = std::fs::File::create(&path)?;\n    head_process.stdout.as_mut().unwrap();\n    std::io::copy(&mut head_process.stdout.take().unwrap(), &mut file)?;\n\n    let exit_status = head_process.wait()?;\n\n    if !exit_status.success() {\n        Err(\"failed to generate temp file\")?\n    }\n\n    Ok(path)\n}\n\nasync fn no_setup(_client: &s3::Client, _args: &Args, _path: &Path) -> Result<(), BoxError> {\n    Ok(())\n}\n\nasync fn put_object_intelligent(\n    client: &s3::Client,\n    args: &Args,\n    path: &Path,\n) -> Result<(), BoxError> {\n    if args.size_bytes > args.part_size_bytes {\n        put_object_multipart(&[client.clone()], args, BENCH_KEY, path).await\n    } else {\n        put_object(client, args, path).await\n    }\n}\n\nasync fn put_object(client: &s3::Client, args: &Args, path: &Path) -> Result<(), BoxError> {\n    client\n        .put_object()\n        .bucket(&args.bucket)\n        .key(BENCH_KEY)\n        .body(ByteStream::from_path(&path).await?)\n        .send()\n        .await?;\n    Ok(())\n}\n"
  },
  {
    "path": "aws/sdk/benchmarks/s3-throughput/benchmark/src/multipart_get.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::{Args, BoxError, BENCH_KEY};\nuse async_trait::async_trait;\nuse aws_config::SdkConfig;\nuse aws_sdk_s3 as s3;\nuse aws_sdk_s3::primitives::AggregatedBytes;\nuse aws_sdk_s3::Client;\nuse std::fmt;\nuse std::fs::File;\nuse std::os::unix::fs::FileExt;\nuse std::path::{Path, PathBuf};\nuse std::sync::Arc;\nuse std::time::{Duration, SystemTime};\n\nuse crate::get_test::GetBenchmark;\nuse tokio::sync::Semaphore;\nuse tokio::task::spawn_blocking;\nuse tokio::time::timeout;\nuse tracing::{info_span, Instrument};\n\npub(crate) struct GetObjectMultipart {}\nimpl GetObjectMultipart {\n    pub(crate) fn new() -> Self {\n        Self {}\n    }\n}\n\n#[async_trait]\nimpl GetBenchmark for GetObjectMultipart {\n    type Setup = Vec<Client>;\n\n    async fn prepare(&self, conf: &SdkConfig) -> Self::Setup {\n        let clients = (0..32).map(|_| Client::new(conf)).collect::<Vec<_>>();\n        for client in &clients {\n            let _ = client.list_buckets().send().await;\n        }\n        clients\n    }\n\n    async fn do_get(\n        &self,\n        state: Self::Setup,\n        target_path: &Path,\n        args: &Args,\n    ) -> Result<PathBuf, BoxError> {\n        get_object_multipart(&state, args, target_path, &args.bucket, BENCH_KEY).await?;\n        Ok(target_path.to_path_buf())\n    }\n}\n\npub async fn get_object_multipart(\n    clients: &[s3::Client],\n    args: &Args,\n    target_path: &Path,\n    bucket: &str,\n    key: &str,\n) -> Result<(), BoxError> {\n    let mut part_count = args.size_bytes / args.part_size_bytes + 1;\n    let mut size_of_last_part = args.size_bytes % args.part_size_bytes;\n    if size_of_last_part == 0 {\n        size_of_last_part = args.part_size_bytes;\n        part_count -= 1;\n    }\n\n    let ranges = (0..part_count).map(|i| {\n        if i == part_count - 1 {\n            let start = i * args.part_size_bytes;\n            ContentRange::new(start, start + size_of_last_part - 1)\n        } else {\n            ContentRange::new(i * args.part_size_bytes, (i + 1) * args.part_size_bytes - 1)\n        }\n    });\n\n    let semaphore = Arc::new(Semaphore::new(args.concurrency));\n    let mut tasks = Vec::new();\n    let file = Arc::new(File::create(target_path)?);\n    for (id, range) in ranges.enumerate() {\n        let semaphore = semaphore.clone();\n        let client = clients[id % clients.len()].clone();\n        let file = file.clone();\n        let bucket = bucket.to_string();\n        let key = key.to_string();\n        tasks.push(tokio::spawn(\n            async move {\n                let _permit = semaphore.acquire_owned().await?;\n\n                let start = SystemTime::now();\n                tracing::debug!(range = ?range);\n\n                let body =\n                    download_part_retry_on_timeout(id, &range, &client, &bucket, &key).await?;\n                tracing::debug!(id =? id, load_duration = ?start.elapsed().unwrap());\n                let mut offset = range.start;\n                let write_duration = SystemTime::now();\n                spawn_blocking(move || {\n                    for part in body.into_segments() {\n                        file.write_all_at(&part, offset)?;\n                        offset += part.len() as u64;\n                    }\n                    Ok::<_, BoxError>(())\n                })\n                .await??;\n                tracing::debug!(id =? id, write_duration = ?write_duration.elapsed().unwrap());\n                Result::<_, BoxError>::Ok(())\n            }\n            .instrument(info_span!(\"run-collect-part\", id = id)),\n        ));\n    }\n    for task in tasks {\n        task.await??;\n    }\n\n    Ok(())\n}\n\nasync fn download_part_retry_on_timeout(\n    id: usize,\n    range: &ContentRange,\n    client: &Client,\n    bucket: &str,\n    key: &str,\n) -> Result<AggregatedBytes, BoxError> {\n    loop {\n        match timeout(\n            Duration::from_millis(1000),\n            download_part(id, range, client, bucket, key),\n        )\n        .await\n        {\n            Ok(result) => return result,\n            Err(_) => tracing::warn!(\"get part timeout\"),\n        }\n    }\n}\n\nasync fn download_part(\n    id: usize,\n    range: &ContentRange,\n    client: &Client,\n    bucket: &str,\n    key: &str,\n) -> Result<AggregatedBytes, BoxError> {\n    let part = client\n        .get_object()\n        .bucket(bucket)\n        .key(key)\n        .range(range.to_string())\n        .send()\n        .instrument(info_span!(\"get_object\", id = id))\n        .await?;\n\n    let body = part\n        .body\n        .collect()\n        .instrument(info_span!(\"collect-body\", id = id))\n        .await?;\n    Ok(body)\n}\n\n#[derive(Debug)]\nstruct ContentRange {\n    start: u64,\n    end: u64,\n}\n\nimpl ContentRange {\n    fn new(start: u64, end: u64) -> Self {\n        Self { start, end }\n    }\n}\n\nimpl fmt::Display for ContentRange {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        write!(f, \"bytes={}-{}\", self.start, self.end)\n    }\n}\n"
  },
  {
    "path": "aws/sdk/benchmarks/s3-throughput/benchmark/src/multipart_put.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::put_test::PutBenchmark;\nuse crate::{Args, BoxError, BENCH_KEY};\nuse async_trait::async_trait;\nuse aws_config::SdkConfig;\nuse aws_sdk_s3 as s3;\nuse aws_sdk_s3::primitives::ByteStream;\nuse aws_sdk_s3::Client;\nuse s3::types::CompletedMultipartUpload;\nuse s3::types::CompletedPart;\nuse std::io::SeekFrom;\nuse std::path::Path;\nuse std::path::PathBuf;\nuse std::sync::Arc;\nuse std::time::{Duration, SystemTime};\nuse tokio::fs::File;\nuse tokio::io::{AsyncReadExt, AsyncSeekExt};\nuse tokio::sync::{OwnedSemaphorePermit, Semaphore};\nuse tokio::time::timeout;\n\npub(crate) struct PutObjectMultipart;\n\n#[async_trait]\nimpl PutBenchmark for PutObjectMultipart {\n    type Setup = Vec<Client>;\n\n    async fn prepare(&self, conf: &SdkConfig) -> Self::Setup {\n        let clients = (0..32).map(|_| Client::new(conf)).collect::<Vec<_>>();\n        for client in &clients {\n            let _ = client.list_buckets().send().await;\n        }\n        clients\n    }\n\n    async fn do_put(\n        &self,\n        state: Self::Setup,\n        target_key: &str,\n        local_file: &Path,\n        args: &Args,\n    ) -> Result<(), BoxError> {\n        put_object_multipart(&state, args, target_key, local_file).await\n    }\n}\n\npub async fn put_object_multipart(\n    client: &[s3::Client],\n    args: &Args,\n    target_key: &str,\n    path: &Path,\n) -> Result<(), BoxError> {\n    let upload_id = client[0]\n        .create_multipart_upload()\n        .bucket(&args.bucket)\n        .key(target_key)\n        .send()\n        .await?\n        .upload_id\n        .expect(\"missing upload id\");\n\n    let mut part_count = args.size_bytes / args.part_size_bytes + 1;\n    let mut size_of_last_part = args.size_bytes % args.part_size_bytes;\n    if size_of_last_part == 0 {\n        size_of_last_part = args.part_size_bytes;\n        part_count -= 1;\n    }\n\n    let semaphore = Arc::new(Semaphore::new(args.concurrency));\n    let mut tasks = Vec::new();\n    for part in 0..part_count {\n        let offset = args.part_size_bytes * part;\n        let length = if part == part_count - 1 {\n            size_of_last_part\n        } else {\n            args.part_size_bytes\n        };\n        let permit = semaphore.clone().acquire_owned().await?;\n        tasks.push(tokio::spawn(upload_part_retry_on_timeout(\n            permit,\n            client[part as usize % client.len()].clone(),\n            args.bucket.clone(),\n            upload_id.clone(),\n            path.to_path_buf(),\n            offset,\n            length,\n            part,\n            Duration::from_millis(args.part_upload_timeout_millis),\n        )));\n    }\n    let mut parts = Vec::new();\n    for task in tasks {\n        parts.push(task.await??);\n    }\n\n    client[0]\n        .complete_multipart_upload()\n        .bucket(&args.bucket)\n        .key(BENCH_KEY)\n        .upload_id(&upload_id)\n        .multipart_upload(\n            CompletedMultipartUpload::builder()\n                .set_parts(Some(parts))\n                .build(),\n        )\n        .send()\n        .await?;\n\n    Ok(())\n}\n\n#[allow(clippy::too_many_arguments)]\nasync fn upload_part_retry_on_timeout(\n    permit: OwnedSemaphorePermit,\n    client: s3::Client,\n    bucket: String,\n    upload_id: String,\n    path: PathBuf,\n    offset: u64,\n    length: u64,\n    part: u64,\n    timeout_dur: Duration,\n) -> Result<CompletedPart, BoxError> {\n    loop {\n        match timeout(\n            timeout_dur,\n            upload_part(&client, &bucket, &upload_id, &path, offset, length, part),\n        )\n        .await\n        {\n            Ok(res) => {\n                drop(permit);\n                return res;\n            }\n            Err(_) => tracing::warn!(id = ?part, \"timeout!\"),\n        }\n    }\n}\n\n#[allow(clippy::too_many_arguments)]\nasync fn upload_part(\n    client: &s3::Client,\n    bucket: &str,\n    upload_id: &str,\n    path: &Path,\n    offset: u64,\n    length: u64,\n    part: u64,\n) -> Result<CompletedPart, BoxError> {\n    let start = SystemTime::now();\n    let mut file = File::open(path).await?;\n    file.seek(SeekFrom::Start(offset)).await?;\n    let mut buf = vec![0; length as usize];\n    file.read_exact(&mut buf).await?;\n    let stream = ByteStream::from(buf);\n    let part_output = client\n        .upload_part()\n        .key(BENCH_KEY)\n        .bucket(bucket)\n        .upload_id(upload_id)\n        .body(stream)\n        .part_number(part as i32 + 1) // S3 takes a 1-based index\n        .send()\n        .await?;\n    tracing::debug!(part = ?part, upload_duration = ?start.elapsed().unwrap(), \"upload-part\");\n    Ok(CompletedPart::builder()\n        .part_number(part as i32 + 1)\n        .e_tag(part_output.e_tag.expect(\"must have an e-tag\"))\n        .build())\n}\n"
  },
  {
    "path": "aws/sdk/benchmarks/s3-throughput/benchmark/src/put_test.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::multipart_get::get_object_multipart;\nuse crate::{verify, Args, BoxError, BENCH_KEY};\nuse async_trait::async_trait;\nuse aws_config::SdkConfig;\nuse aws_sdk_s3::Client;\nuse std::env::temp_dir;\nuse std::path::{Path, PathBuf};\n\npub(crate) struct PutTestResult {\n    local_file: PathBuf,\n    bucket: String,\n    key: String,\n}\n\n#[async_trait]\npub(crate) trait PutBenchmark {\n    type Setup: Send;\n    async fn prepare(&self, conf: &SdkConfig) -> Self::Setup;\n    async fn do_put(\n        &self,\n        state: Self::Setup,\n        target_key: &str,\n        local_file: &Path,\n        args: &Args,\n    ) -> Result<(), BoxError>;\n    async fn do_bench(\n        &self,\n        state: Self::Setup,\n        args: &Args,\n        file: &Path,\n    ) -> Result<PutTestResult, BoxError> {\n        self.do_put(state, BENCH_KEY, file, args).await?;\n        Ok(PutTestResult {\n            local_file: file.to_path_buf(),\n            bucket: args.bucket.clone(),\n            key: BENCH_KEY.to_string(),\n        })\n    }\n\n    async fn verify(\n        &self,\n        client: &Client,\n        args: &Args,\n        result: PutTestResult,\n    ) -> Result<(), BoxError> {\n        let dir = temp_dir();\n        let downloaded_path = dir.join(\"downloaded_file\");\n        get_object_multipart(\n            &[client.clone()][..],\n            args,\n            &downloaded_path,\n            &result.bucket,\n            &result.key,\n        )\n        .await?;\n        verify::diff(&result.local_file, &downloaded_path).await\n    }\n}\n"
  },
  {
    "path": "aws/sdk/benchmarks/s3-throughput/benchmark/src/verify.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::BoxError;\nuse std::path::Path;\nuse std::time::SystemTime;\nuse tokio::process::Command;\n\npub(crate) async fn diff(a: &Path, b: &Path) -> Result<(), BoxError> {\n    let start_diff = SystemTime::now();\n    let diff_ok = Command::new(\"diff\")\n        .arg(a)\n        .arg(b)\n        .arg(\"-q\")\n        .spawn()\n        .unwrap()\n        .wait()\n        .await\n        .unwrap();\n    tracing::info!(diff_duration = ?start_diff.elapsed().unwrap());\n    if !diff_ok.success() {\n        Err(\"files differ\")?\n    } else {\n        Ok(())\n    }\n}\n"
  },
  {
    "path": "aws/sdk/benchmarks/s3-throughput/infrastructure/.eslintrc.json",
    "content": "{\n    \"env\": {\n        \"browser\": false,\n        \"es2021\": true\n    },\n    \"extends\": [\"eslint:recommended\", \"plugin:@typescript-eslint/recommended\", \"prettier\"],\n    \"parser\": \"@typescript-eslint/parser\",\n    \"parserOptions\": {\n        \"ecmaVersion\": 13,\n        \"sourceType\": \"module\"\n    },\n    \"plugins\": [\"@typescript-eslint\"],\n    \"rules\": {\n        \"@typescript-eslint/no-empty-function\": \"off\"\n    }\n}\n"
  },
  {
    "path": "aws/sdk/benchmarks/s3-throughput/infrastructure/.gitignore",
    "content": "*.js\n!jest.config.js\n*.d.ts\n/node_modules\n/build\n\n# CDK asset staging directory\n.cdk.staging\ncdk.out\n"
  },
  {
    "path": "aws/sdk/benchmarks/s3-throughput/infrastructure/.npmignore",
    "content": "*.ts\n!*.d.ts\n\n# CDK asset staging directory\n.cdk.staging\ncdk.out\n"
  },
  {
    "path": "aws/sdk/benchmarks/s3-throughput/infrastructure/.prettierrc",
    "content": "tabWidth: 4\nsingleQuote: false\nbracketSpacing: true\ntrailingComma: all\nprintWidth: 100\n"
  },
  {
    "path": "aws/sdk/benchmarks/s3-throughput/infrastructure/assets/init_instance.sh",
    "content": "#!/bin/bash\n#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\n\necho \"init_instance.sh starting\"\nset -eux\n\nBENCHMARK_ZIP_PATH=\"${1}\"\necho \"benchmark zip path: ${BENCHMARK_ZIP_PATH}\"\n\nsudo yum -y install \\\n    autoconf \\\n    automake \\\n    gcc \\\n    gcc-c++ \\\n    git \\\n    make \\\n    openssl-devel\n\n# Install Rustup and Rust\ncurl https://static.rust-lang.org/rustup/archive/1.24.3/x86_64-unknown-linux-gnu/rustup-init --output rustup-init\necho \"3dc5ef50861ee18657f9db2eeb7392f9c2a6c95c90ab41e45ab4ca71476b4338 rustup-init\" | sha256sum --check\nchmod +x rustup-init\n./rustup-init -y --no-modify-path --profile minimal --default-toolchain 1.67.1\nrm rustup-init\n\n# Verify install\nsource \"${HOME}/.cargo/env\"\nrustc --version\ncargo --version\n\n# Compile the benchmark\nunzip -d benchmark \"${BENCHMARK_ZIP_PATH}\"\ncd benchmark\ncargo build --release\n"
  },
  {
    "path": "aws/sdk/benchmarks/s3-throughput/infrastructure/assets/run_benchmark.sh",
    "content": "#!/bin/bash\n#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\n\necho \"run_benchmark.sh starting\"\nset -eux\n\nBENCHMARK_BUCKET=\"${1}\"\necho \"benchmark bucket: ${BENCHMARK_BUCKET}\"\n\nCOMMON_ARGS=\"--concurrency 30 --bucket ${BENCHMARK_BUCKET} --region us-east-1\"\n\nsource \"${HOME}/.cargo/env\"\ncd benchmark\n\n# 1B\nfor fs in \"tmpfs\" \"disk\"; do\n    BENCH_RESULT_FILE=\"bench_results_put_object_${fs}_1B.txt\"\n    cargo run --release -- --bench put-object --fs \"${fs}\" --size-bytes 1 ${COMMON_ARGS} &> \"${BENCH_RESULT_FILE}\"\n    aws s3 cp \"${BENCH_RESULT_FILE}\" \"s3://${BENCHMARK_BUCKET}/\"\n\n    BENCH_RESULT_FILE=\"bench_results_get_object_${fs}_1B.txt\"\n    cargo run --release -- --bench get-object --fs \"${fs}\" --size-bytes 1 ${COMMON_ARGS} &> \"${BENCH_RESULT_FILE}\"\n    aws s3 cp \"${BENCH_RESULT_FILE}\" \"s3://${BENCHMARK_BUCKET}/\"\ndone\n\n# multipart\nfor fs in \"tmpfs\" \"disk\"; do\n    for size_bytes in \"8388607\" \"8388609\" \"134217728\" \"4294967296\" \"32212254720\"; do\n        BENCH_RESULT_FILE=\"bench_results_put_object_multipart_${fs}_${size_bytes}B.txt\"\n        cargo run --release -- --bench put-object-multipart --fs \"${fs}\" --size-bytes \"${size_bytes}\" --part-size-bytes \"8388608\" ${COMMON_ARGS} &> \"${BENCH_RESULT_FILE}\"\n        aws s3 cp \"${BENCH_RESULT_FILE}\" \"s3://${BENCHMARK_BUCKET}/\"\n\n        BENCH_RESULT_FILE=\"bench_results_get_object_multipart_${fs}_${size_bytes}B.txt\"\n        cargo run --release -- --bench get-object-multipart --fs \"${fs}\" --size-bytes \"${size_bytes}\" --part-size-bytes \"8388608\" ${COMMON_ARGS} &> \"${BENCH_RESULT_FILE}\"\n        aws s3 cp \"${BENCH_RESULT_FILE}\" \"s3://${BENCHMARK_BUCKET}/\"\n    done\ndone\n\necho \"Benchmark finished. Results have been uploaded to ${BENCHMARK_BUCKET}\"\n"
  },
  {
    "path": "aws/sdk/benchmarks/s3-throughput/infrastructure/bin/infrastructure.ts",
    "content": "#!/usr/bin/env node\n/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport \"source-map-support/register\";\nimport * as cdk from \"aws-cdk-lib\";\nimport { InfrastructureStack } from \"../lib/infrastructure-stack\";\n\nconst app = new cdk.App();\nnew InfrastructureStack(app, \"InfrastructureStack\", {\n    env: { account: process.env.CDK_DEFAULT_ACCOUNT, region: \"us-east-1\" },\n});\n"
  },
  {
    "path": "aws/sdk/benchmarks/s3-throughput/infrastructure/cdk.context.json",
    "content": "{\n  \"availability-zones:account=422563069514:region=us-east-1\": [\n    \"us-east-1a\",\n    \"us-east-1b\",\n    \"us-east-1c\",\n    \"us-east-1d\",\n    \"us-east-1e\",\n    \"us-east-1f\"\n  ]\n}\n"
  },
  {
    "path": "aws/sdk/benchmarks/s3-throughput/infrastructure/cdk.json",
    "content": "{\n  \"app\": \"npx ts-node --prefer-ts-exts bin/infrastructure.ts\",\n  \"watch\": {\n    \"include\": [\n      \"**\"\n    ],\n    \"exclude\": [\n      \"README.md\",\n      \"cdk*.json\",\n      \"**/*.d.ts\",\n      \"**/*.js\",\n      \"tsconfig.json\",\n      \"package*.json\",\n      \"yarn.lock\",\n      \"node_modules\",\n      \"test\"\n    ]\n  },\n  \"context\": {\n    \"@aws-cdk/aws-lambda:recognizeLayerVersion\": true,\n    \"@aws-cdk/core:checkSecretUsage\": true,\n    \"@aws-cdk/core:target-partitions\": [\n      \"aws\",\n      \"aws-cn\"\n    ],\n    \"@aws-cdk-containers/ecs-service-extensions:enableDefaultLogDriver\": true,\n    \"@aws-cdk/aws-ec2:uniqueImdsv2TemplateName\": true,\n    \"@aws-cdk/aws-ecs:arnFormatIncludesClusterName\": true,\n    \"@aws-cdk/aws-iam:minimizePolicies\": true,\n    \"@aws-cdk/core:validateSnapshotRemovalPolicy\": true,\n    \"@aws-cdk/aws-codepipeline:crossAccountKeyAliasStackSafeResourceName\": true,\n    \"@aws-cdk/aws-s3:createDefaultLoggingPolicy\": true,\n    \"@aws-cdk/aws-sns-subscriptions:restrictSqsDescryption\": true,\n    \"@aws-cdk/aws-apigateway:disableCloudWatchRole\": true,\n    \"@aws-cdk/core:enablePartitionLiterals\": true,\n    \"@aws-cdk/aws-events:eventsTargetQueueSameAccount\": true,\n    \"@aws-cdk/aws-iam:standardizedServicePrincipals\": true,\n    \"@aws-cdk/aws-ecs:disableExplicitDeploymentControllerForCircuitBreaker\": true,\n    \"@aws-cdk/aws-iam:importedRoleStackSafeDefaultPolicyName\": true,\n    \"@aws-cdk/aws-s3:serverAccessLogsUseBucketPolicy\": true,\n    \"@aws-cdk/aws-route53-patters:useCertificate\": true,\n    \"@aws-cdk/customresources:installLatestAwsSdkDefault\": false,\n    \"@aws-cdk/aws-rds:databaseProxyUniqueResourceName\": true,\n    \"@aws-cdk/aws-codedeploy:removeAlarmsFromDeploymentGroup\": true,\n    \"@aws-cdk/aws-apigateway:authorizerChangeDeploymentLogicalId\": true,\n    \"@aws-cdk/aws-ec2:launchTemplateDefaultUserData\": true,\n    \"@aws-cdk/aws-secretsmanager:useAttachedSecretResourcePolicyForSecretTargetAttachments\": true,\n    \"@aws-cdk/aws-redshift:columnId\": true,\n    \"@aws-cdk/aws-stepfunctions-tasks:enableEmrServicePolicyV2\": true,\n    \"@aws-cdk/aws-ec2:restrictDefaultSecurityGroup\": true,\n    \"@aws-cdk/aws-apigateway:requestValidatorUniqueId\": true\n  }\n}\n"
  },
  {
    "path": "aws/sdk/benchmarks/s3-throughput/infrastructure/lib/infrastructure-stack.ts",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport * as cdk from \"aws-cdk-lib\";\nimport { Construct } from \"constructs\";\nimport * as ec2 from \"aws-cdk-lib/aws-ec2\";\nimport * as s3 from \"aws-cdk-lib/aws-s3\";\nimport * as iam from \"aws-cdk-lib/aws-iam\";\nimport * as assets from \"aws-cdk-lib/aws-s3-assets\";\nimport * as path from \"path\";\n\nexport class InfrastructureStack extends cdk.Stack {\n    constructor(scope: Construct, id: string, props?: cdk.StackProps) {\n        super(scope, id, props);\n\n        const assetInitInstance = new assets.Asset(this, \"assetInitInstance\", {\n            path: path.join(__dirname, \"../assets/init_instance.sh\"),\n        });\n        const assetRunBenchmark = new assets.Asset(this, \"assetRunBenchmark\", {\n            path: path.join(__dirname, \"../assets/run_benchmark.sh\"),\n        });\n        const assetBenchmark = new assets.Asset(this, \"assetBenchmark\", {\n            path: path.join(__dirname, \"../../benchmark\"),\n        });\n        const assetBucket = s3.Bucket.fromBucketName(\n            this,\n            \"assetBucket\",\n            assetInitInstance.s3BucketName,\n        );\n\n        const benchmarkBucket = new s3.Bucket(this, \"benchmarkBucket\", {\n            blockPublicAccess: s3.BlockPublicAccess.BLOCK_ALL,\n            encryption: s3.BucketEncryption.S3_MANAGED,\n            enforceSSL: true,\n            versioned: false,\n            removalPolicy: cdk.RemovalPolicy.DESTROY,\n        });\n\n        const instanceUserData = ec2.UserData.forLinux();\n        const initInstancePath = instanceUserData.addS3DownloadCommand({\n            bucket: assetBucket,\n            bucketKey: assetInitInstance.s3ObjectKey,\n        });\n        const runBenchmarkPath = instanceUserData.addS3DownloadCommand({\n            bucket: assetBucket,\n            bucketKey: assetRunBenchmark.s3ObjectKey,\n        });\n        const benchmarkPath = instanceUserData.addS3DownloadCommand({\n            bucket: assetBucket,\n            bucketKey: assetBenchmark.s3ObjectKey,\n        });\n        instanceUserData.addExecuteFileCommand({\n            filePath: initInstancePath,\n            arguments: `${benchmarkPath}`,\n        });\n        instanceUserData.addExecuteFileCommand({\n            filePath: runBenchmarkPath,\n            arguments: `${benchmarkBucket.bucketName}`,\n        });\n\n        const vpc = new ec2.Vpc(this, \"VPC\", {});\n        const securityGroup = new ec2.SecurityGroup(this, \"securityGroup\", {\n            vpc,\n            description: \"Allow outbound and SSH inbound\",\n            allowAllOutbound: true,\n        });\n        securityGroup.addIngressRule(ec2.Peer.anyIpv4(), ec2.Port.tcp(22), \"SSH\");\n\n        const executionRole = new iam.Role(this, \"executionRole\", {\n            assumedBy: new iam.ServicePrincipal(\"ec2.amazonaws.com\"),\n        });\n        assetBucket.grantRead(executionRole);\n        benchmarkBucket.grantReadWrite(executionRole);\n\n        new ec2.Instance(this, `S3Benchmark_${this.stackName}`, {\n            instanceType: ec2.InstanceType.of(ec2.InstanceClass.C5N, ec2.InstanceSize.XLARGE18),\n            vpc,\n            machineImage: ec2.MachineImage.latestAmazonLinux2023(),\n            userData: instanceUserData,\n            role: executionRole,\n            keyName: \"S3BenchmarkKeyPair\",\n            securityGroup,\n            vpcSubnets: { subnets: vpc.publicSubnets },\n            requireImdsv2: true,\n        });\n    }\n}\n"
  },
  {
    "path": "aws/sdk/benchmarks/s3-throughput/infrastructure/package.json",
    "content": "{\n  \"name\": \"infrastructure\",\n  \"version\": \"1.0.0\",\n  \"description\": \"CDK infrastructure for the S3 benchmark\",\n  \"main\": \"index.js\",\n  \"scripts\": {\n    \"format\": \"prettier --write '**/*.ts'\",\n    \"lint\": \"eslint --ext .ts lib\",\n    \"build\": \"tsc\",\n    \"watch\": \"tsc -w\",\n    \"cdk\": \"cdk\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/smithy-lang/smithy-rs.git\"\n  },\n  \"author\": \"AWS Rust SDK Team\",\n  \"license\": \"Apache-2.0\",\n  \"bugs\": {\n    \"url\": \"https://github.com/smithy-lang/smithy-rs/issues\"\n  },\n  \"homepage\": \"https://github.com/smithy-lang/smithy-rs#readme\",\n  \"publish\": false,\n  \"devDependencies\": {\n    \"@types/node\": \"20.1.7\",\n    \"@typescript-eslint/eslint-plugin\": \"^5.59.9\",\n    \"@typescript-eslint/parser\": \"^5.59.9\",\n    \"aws-cdk\": \"^2.82.0\",\n    \"aws-cdk-lib\": \"^2.82.0\",\n    \"constructs\": \"^10.0.0\",\n    \"eslint\": \"^8.42.0\",\n    \"eslint-config-prettier\": \"^8.8.0\",\n    \"prettier\": \"^2.8.8\",\n    \"source-map-support\": \"^0.5.21\",\n    \"ts-jest\": \"^29.1.0\",\n    \"ts-node\": \"^10.9.1\",\n    \"typescript\": \"^5.1.3\"\n  }\n}\n"
  },
  {
    "path": "aws/sdk/benchmarks/s3-throughput/infrastructure/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"ES2020\",\n    \"module\": \"commonjs\",\n    \"lib\": [\n      \"es2020\",\n      \"dom\"\n    ],\n    \"declaration\": true,\n    \"strict\": true,\n    \"noImplicitAny\": true,\n    \"strictNullChecks\": true,\n    \"noImplicitThis\": true,\n    \"alwaysStrict\": true,\n    \"noUnusedLocals\": false,\n    \"noUnusedParameters\": false,\n    \"noImplicitReturns\": true,\n    \"noFallthroughCasesInSwitch\": false,\n    \"inlineSourceMap\": true,\n    \"inlineSources\": true,\n    \"experimentalDecorators\": true,\n    \"strictPropertyInitialization\": false,\n    \"typeRoots\": [\n      \"./node_modules/@types\"\n    ],\n    \"outDir\": \"./build\"\n  },\n  \"exclude\": [\n    \"node_modules\",\n    \"cdk.out\",\n    \"build\"\n  ]\n}\n"
  },
  {
    "path": "aws/sdk/benchmarks/sdk-perf/Cargo.toml",
    "content": "[package]\nname = \"sdk-perf\"\nversion = \"0.1.0\"\nedition = \"2021\"\n\n[dependencies]\n# SDK deps\n# Note if you need more than dynamodb you will need to add the new services to the\n# assemble command in the tools/ci-scripts/generate-sdk-perf-bin script\naws-sdk-dynamodb = {path = \"../../build/aws-sdk/sdk/dynamodb\"}\naws-smithy-runtime-api = {path = \"../../build/aws-sdk/sdk/aws-smithy-runtime-api\", features = [\"http-1x\"]}\naws-smithy-types = {path = \"../../build/aws-sdk/sdk/aws-smithy-types\"}\n# External deps\nbytes = \"1.9.0\"\nclap = { version = \"4.5.23\", features = [\"derive\"] }\nhttp = \"1.2.0\"\nserde = {version = \"1.0.216\", features = [\"derive\"]}\nserde_json = \"1.0.133\"\n"
  },
  {
    "path": "aws/sdk/benchmarks/sdk-perf/src/ddb_serde.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_sdk_dynamodb::operation::put_item::{PutItem, PutItemInput};\nuse aws_sdk_dynamodb::operation::query::QueryOutput;\nuse aws_sdk_dynamodb::types::AttributeValue;\nuse aws_smithy_runtime_api::client::interceptors::context::Input;\nuse aws_smithy_runtime_api::client::orchestrator::HttpResponse;\nuse aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugin;\nuse aws_smithy_runtime_api::client::ser_de::{DeserializeResponse, SharedResponseDeserializer};\nuse aws_smithy_runtime_api::client::ser_de::{SerializeRequest, SharedRequestSerializer};\nuse aws_smithy_types::body::SdkBody;\nuse aws_smithy_types::config_bag::ConfigBag;\n\npub(crate) fn deserialize() {\n    use aws_sdk_dynamodb::operation::query::Query;\n    use bytes::Bytes;\n\n    let response = HttpResponse::try_from(http::Response::builder()\n         .header(\"server\", \"Server\")\n         .header(\"date\", \"Mon, 08 Mar 2021 15:51:23 GMT\")\n         .header(\"content-type\", \"application/x-amz-json-1.0\")\n         .header(\"content-length\", \"1231\")\n         .header(\"connection\", \"keep-alive\")\n         .header(\"x-amzn-requestid\", \"A5FGSJ9ET4OKB8183S9M47RQQBVV4KQNSO5AEMVJF66Q9ASUAAJG\")\n         .header(\"x-amz-crc32\", \"624725176\")\n         .status(http::StatusCode::from_u16(200).unwrap())\n         .body(SdkBody::from(Bytes::copy_from_slice(br#\"{\"Count\":2,\"Items\":[{\"year\":{\"N\":\"2013\"},\"info\":{\"M\":{\"actors\":{\"L\":[{\"S\":\"Daniel Bruhl\"},{\"S\":\"Chris Hemsworth\"},{\"S\":\"Olivia Wilde\"}]},\"plot\":{\"S\":\"A re-creation of the merciless 1970s rivalry between Formula One rivals James Hunt and Niki Lauda.\"},\"release_date\":{\"S\":\"2013-09-02T00:00:00Z\"},\"image_url\":{\"S\":\"http://ia.media-imdb.com/images/M/MV5BMTQyMDE0MTY0OV5BMl5BanBnXkFtZTcwMjI2OTI0OQ@@._V1_SX400_.jpg\"},\"genres\":{\"L\":[{\"S\":\"Action\"},{\"S\":\"Biography\"},{\"S\":\"Drama\"},{\"S\":\"Sport\"}]},\"directors\":{\"L\":[{\"S\":\"Ron Howard\"}]},\"rating\":{\"N\":\"8.3\"},\"rank\":{\"N\":\"2\"},\"running_time_secs\":{\"N\":\"7380\"}}},\"title\":{\"S\":\"Rush\"}},{\"year\":{\"N\":\"2013\"},\"info\":{\"M\":{\"actors\":{\"L\":[{\"S\":\"David Matthewman\"},{\"S\":\"Ann Thomas\"},{\"S\":\"Jonathan G. Neff\"}]},\"release_date\":{\"S\":\"2013-01-18T00:00:00Z\"},\"plot\":{\"S\":\"A rock band plays their music at high volumes, annoying the neighbors.\"},\"genres\":{\"L\":[{\"S\":\"Comedy\"},{\"S\":\"Drama\"}]},\"image_url\":{\"S\":\"http://ia.media-imdb.com/images/N/O9ERWAU7FS797AJ7LU8HN09AMUP908RLlo5JF90EWR7LJKQ7@@._V1_SX400_.jpg\"},\"directors\":{\"L\":[{\"S\":\"Alice Smith\"},{\"S\":\"Bob Jones\"}]},\"rating\":{\"N\":\"6.2\"},\"rank\":{\"N\":\"11\"},\"running_time_secs\":{\"N\":\"5215\"}}},\"title\":{\"S\":\"Turn It Down, Or Else!\"}}],\"ScannedCount\":2}\"#)))\n         .unwrap()).unwrap();\n\n    let operation = Query::new();\n    let config = operation.config().expect(\"operation should have config\");\n    let deserializer = config\n        .load::<SharedResponseDeserializer>()\n        .expect(\"operation should set a deserializer\");\n\n    let output = deserializer\n        .deserialize_nonstreaming(&response)\n        .expect(\"success\");\n    let output = output.downcast::<QueryOutput>().expect(\"correct type\");\n    assert_eq!(2, output.count);\n}\n\nmacro_rules! attr_s {\n    ($str_val:expr) => {\n        AttributeValue::S($str_val.into())\n    };\n}\nmacro_rules! attr_n {\n    ($str_val:expr) => {\n        AttributeValue::N($str_val.into())\n    };\n}\nmacro_rules! attr_list {\n    ( $($attr_val:expr),* ) => {\n        AttributeValue::L(vec![$($attr_val),*])\n    }\n}\nmacro_rules! attr_obj {\n    { $($str_val:expr => $attr_val:expr),* } => {\n        AttributeValue::M(\n            vec![\n                $(($str_val.to_string(), $attr_val)),*\n            ].into_iter().collect()\n        )\n    };\n}\n\npub(crate) fn serialize() {\n    let input = PutItemInput::builder()\n            .table_name(\"Movies-5\")\n            .set_item(Some(\n                attr_obj! {\n                \"year\" => attr_n!(\"2013\"),\n                \"title\" => attr_s!(\"Turn It Down, Or Else!\"),\n                \"info\" => attr_obj! {\n                    \"directors\" => attr_list![attr_s!(\"Alice Smith\"), attr_s!(\"Bob Jones\")],\n                    \"release_date\" => attr_s!(\"2013-01-18T00:00:00Z\"),\n                    \"rating\" => attr_n!(\"6.2\"),\n                    \"genres\" => attr_list!(attr_s!(\"Comedy\"), attr_s!(\"Drama\")),\n                    \"image_url\" => attr_s!(\"http://ia.media-imdb.com/images/N/O9ERWAU7FS797AJ7LU8HN09AMUP908RLlo5JF90EWR7LJKQ7@@._V1_SX400_.jpg\"),\n                    \"plot\" => attr_s!(\"A rock band plays their music at high volumes, annoying the neighbors.\"),\n                    \"rank\" => attr_n!(\"11\"),\n                    \"running_time_secs\" => attr_n!(\"5215\"),\n                    \"actors\" => attr_list!(attr_s!(\"David Matthewman\"), attr_s!(\"Ann Thomas\"), attr_s!(\"Jonathan G. Neff\"))\n                }\n            }.as_m().unwrap().clone(),\n            ))\n            .build()\n            .expect(\"valid input\");\n    let operation = PutItem::new();\n    let config = operation.config().expect(\"operation should have config\");\n    let serializer = config\n        .load::<SharedRequestSerializer>()\n        .expect(\"operation should set a serializer\");\n    let mut config_bag = ConfigBag::base();\n    let input = Input::erase(input.clone());\n\n    let request = serializer\n        .serialize_input(input, &mut config_bag)\n        .expect(\"success\");\n    let body = request.body().bytes().unwrap();\n    assert_eq!(body[0], b'{');\n}\n"
  },
  {
    "path": "aws/sdk/benchmarks/sdk-perf/src/main.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nmod ddb_serde;\nmod results;\nmod test_util;\n\nuse clap::Parser;\nuse ddb_serde::{deserialize, serialize};\nuse results::Results;\nuse test_util::{run_test, TestConfig};\n\n#[derive(Parser, Debug)]\n#[command(version, about, long_about = None)]\nstruct Args {\n    /// Name of the person to greet\n    #[arg(short, long)]\n    commit_id: String,\n}\n\nfn main() {\n    let args = Args::parse();\n\n    let mut results = Results {\n        product_id: \"aws-sdk-rust\".into(),\n        sdk_version: None,\n        commit_id: args.commit_id,\n        results: Vec::new(),\n    };\n\n    // Note: in the below microseconds should be case insensitive, but due to a\n    // bug in the perf test evaluation it is currently not. Can get rid of the\n    // capitalization when that is fixed.\n    let deserialize_config = TestConfig {\n        name: \"deserialize.ddb\".into(),\n        description: \"Deserializing a DDB response.\".into(),\n        unit: \"Microseconds\".into(),\n        runs: 10,\n    };\n\n    let serialize_config = TestConfig {\n        name: \"serialize.ddb\".into(),\n        description: \"Serializing a DDB request.\".into(),\n        unit: \"Microseconds\".into(),\n        runs: 10,\n    };\n\n    run_test(&deserialize_config, &mut results, deserialize);\n    run_test(&serialize_config, &mut results, serialize);\n\n    let output = serde_json::to_string(&results).unwrap();\n    println!(\"{output:#}\");\n}\n"
  },
  {
    "path": "aws/sdk/benchmarks/sdk-perf/src/results.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse serde::Serialize;\n\n#[derive(Serialize)]\n#[serde(rename_all = \"camelCase\")]\npub(crate) struct Results {\n    pub(crate) product_id: String,\n    #[serde(skip_serializing_if = \"Option::is_none\")]\n    pub(crate) sdk_version: Option<String>,\n    pub(crate) commit_id: String,\n    pub(crate) results: Vec<Result>,\n}\n\n#[derive(Serialize)]\n#[serde(rename_all = \"camelCase\")]\npub(crate) struct Result {\n    pub(crate) name: String,\n    pub(crate) description: String,\n    #[serde(skip_serializing_if = \"Option::is_none\")]\n    pub(crate) publish_to_cloudwatch: Option<bool>,\n    #[serde(skip_serializing_if = \"Option::is_none\")]\n    pub(crate) dimensions: Option<Vec<Dimension>>,\n    pub(crate) date: u64,\n    pub(crate) measurements: Vec<f64>,\n    pub(crate) unit: String,\n}\n\n#[derive(Serialize)]\n#[serde(rename_all = \"camelCase\")]\npub(crate) struct Dimension {\n    pub(crate) name: String,\n    pub(crate) value: String,\n}\n"
  },
  {
    "path": "aws/sdk/benchmarks/sdk-perf/src/test_util.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::results::{Result, Results};\nuse std::time::SystemTime;\n\npub(crate) struct TestConfig {\n    pub(crate) name: String,\n    pub(crate) description: String,\n    pub(crate) unit: String,\n    pub(crate) runs: u8,\n}\n\npub(crate) fn run_test<F: Fn()>(config: &TestConfig, results: &mut Results, func: F) {\n    let mut result = Result {\n        name: config.name.clone(),\n        description: config.description.clone(),\n        publish_to_cloudwatch: Some(true),\n        dimensions: None,\n        date: SystemTime::now()\n            .duration_since(SystemTime::UNIX_EPOCH)\n            .unwrap()\n            .as_secs(),\n        measurements: Vec::new(),\n        unit: config.unit.clone(),\n    };\n\n    // warmup the function\n    for _i in 0..5 {\n        func()\n    }\n\n    for _i in 0..config.runs {\n        let start = SystemTime::now();\n        func();\n        let time = start.elapsed().unwrap().as_micros() as f64;\n        result.measurements.push(time);\n    }\n\n    results.results.push(result);\n}\n"
  },
  {
    "path": "aws/sdk/benchmarks/standardized-benches/Cargo.toml",
    "content": "[package]\nname = \"standardized-benches\"\nversion = \"0.1.0\"\nedition = \"2021\"\n\n[lib]\nname = \"standardized_benches\"\npath = \"src/lib.rs\"\n\n[dependencies]\naws-config = { path = \"../../build/aws-sdk/sdk/aws-config\" }\naws-sdk-dynamodb = { path = \"../../build/aws-sdk/sdk/dynamodb\" }\naws-sdk-lambda = { path = \"../../build/aws-sdk/sdk/lambda\" }\naws-sdk-s3 = { path = \"../../build/aws-sdk/sdk/s3\" }\naws-smithy-types = { path = \"../../build/aws-sdk/sdk/aws-smithy-types\" }\nclap = { version = \"4\", features = [\"derive\"] }\nfutures = \"0.3\"\nserde = { version = \"1\", features = [\"derive\"] }\nserde_json = \"1\"\nsysinfo = \"0.30\"\ntokio = { version = \"1\", features = [\"full\"] }\n"
  },
  {
    "path": "aws/sdk/benchmarks/standardized-benches/README.md",
    "content": "Standardized Benchmarks\n=======================\n\nCross-SDK standardized benchmarks for the AWS Rust SDK, covering two categories:\n\n- **E2E (end-to-end)**: Measures API call latency (DynamoDB) and throughput (S3) against live AWS services.\n- **Endpoint**: Measures endpoint resolution performance for S3 and Lambda.\n\n## Why a separate crate from sdk-perf?\n\n`sdk-perf` is designed for RoadRunner. The standardized benchmark spec does not prescribe the use of RoadRunner and proposes using different benchmark frameworks. For now, it is cleaner to keep a separate crate without polluting `sdk-perf`.\n\n## Why not criterion?\n\nPlain binaries with simple stats are useful for generating flamegraphs. Additionally, extracting results in a custom output format is not straightforward with criterion, which matters when we want to migrate to RoadRunner since it defines its own output format.\n\n## Prerequisites\n\n- AWS credentials configured (via environment, profile, etc.)\n- The SDK must be built first: `./gradlew :aws:sdk:assemble` from the smithy-rs root\n\n## E2E Benchmarks\n\nE2E benchmarks run against live AWS services. Each benchmark is driven by a JSON config file.\n\n### S3\n\n```bash\ncargo run --bin s3_e2e -- --config-path e2e-configs/s3-upload-256KiB-throughput-benchmark.json\ncargo run --bin s3_e2e -- --config-path e2e-configs/s3-download-256KiB-throughput-benchmark.json\n```\n\nExample output (S3 upload, `cpuStats` in %, `memoryStats` in MB):\n\n```json\n{\n  \"name\": \"s3-upload-256KiB-throughput-benchmark\",\n  \"iterations\": [\n    { \"totalTimeSeconds\": 4.93, \"throughputGbps\": 4.25 },\n    { \"totalTimeSeconds\": 4.80, \"throughputGbps\": 4.37 },\n    { \"totalTimeSeconds\": 5.19, \"throughputGbps\": 4.04 }\n  ],\n  \"cpuStats\": {\n    \"mean\": 79.72,\n    \"max\": 108.64\n  },\n  \"memoryStats\": {\n    \"mean\": 2943.24,\n    \"max\": 2944.67\n  }\n}\n```\n\n### DynamoDB\n\n```bash\ncargo run --bin ddb_e2e -- --config-path e2e-configs/ddb-putitem-1KiB-latency-benchmark.json\ncargo run --bin ddb_e2e -- --config-path e2e-configs/ddb-getitem-1KiB-latency-benchmark.json\n```\n\nExample output (DynamoDB, `cpuStats` in %, `memoryStats` in MB):\n\n```json\n{\n  \"name\": \"ddb-putitem-1KiB-latency-benchmark\",\n  \"latencyStats\": {\n    \"meanMs\": 66.51297124400017,\n    \"p50Ms\": 65.959283,\n    \"p90Ms\": 67.485355,\n    \"p99Ms\": 77.957288,\n    \"stdDevMs\": 2.224000635462994\n  },\n  \"cpuStats\": {\n    \"mean\": 0.2734170206661882,\n    \"max\": 9.876543045043945\n  },\n  \"memoryStats\": {\n    \"mean\": 13.51953125,\n    \"max\": 13.51953125\n  }\n}\n```\n\n### Config Format\n\nConfig files control e2e benchmark behavior. See the files in `e2e-configs/` for more examples.\n\nFor S3, `batch.concurrency` can be specified to control how many tasks are in flight concurrently.\n\n```json\n{\n  \"version\": 1,\n  \"name\": \"s3-upload-256KiB-throughput-benchmark\",\n  \"description\": \"S3 PutObject throughput benchmark\",\n  \"service\": \"s3\",\n  \"action\": \"upload\",\n  \"actionConfig\": {\n    ...\n  },\n  \"batch\": {\n    \"numberOfActions\": 10000,\n    \"sequentialExecution\": false,\n    \"concurrency\": 100\n  },\n  ...\n}\n```\n\n## Endpoint Benchmarks\n\nEndpoint benchmarks measure endpoint resolution performance without making network calls.\n\n```bash\ncargo run --bin s3_endpoint\ncargo run --bin lambda_endpoint\n```\n\nExample output (S3 endpoint):\n\n```json\n{\n  \"product_id\": \"aws-sdk-rust\",\n  \"results\": [\n    {\n      \"description\": \"S3 outposts vanilla test\",\n      \"id\": \"s3_outposts_endpoint_resolution\",\n      \"mean_ns\": 2132.6549815498156,\n      \"median_ns\": 2123.0,\n      \"n\": 9214,\n      \"outliers_removed\": 786,\n      \"p90_ns\": 2318,\n      \"p99_ns\": 3439,\n      \"std_dev_ns\": 73.8085510800762\n    },\n    ...\n  ]\n}\n```\n"
  },
  {
    "path": "aws/sdk/benchmarks/standardized-benches/e2e-configs/ddb-getitem-1KiB-latency-benchmark.json",
    "content": "{\n  \"version\": 1,\n  \"name\": \"ddb-getitem-1KiB-latency-benchmark\",\n  \"description\": \"DynamoDB GetItem latency benchmark - measures SDK latency for read operations with 1KiB items executed sequentially\",\n  \"service\": \"dynamodb\",\n  \"action\": \"getitem\",\n  \"actionConfig\": {\n    \"tableName\": \"benchmark-table\",\n    \"region\": \"us-east-1\",\n    \"keyPrefix\": \"item-\",\n    \"deleteTableAfterBenchmark\": true\n  },\n  \"batch\": {\n    \"description\": \"A batch is 1,000 GetItem actions executed sequentially\",\n    \"numberOfActions\": 1000,\n    \"sequentialExecution\": true\n  },\n  \"warmup\": {\n    \"batches\": 2\n  },\n  \"measurement\": {\n    \"batches\": 3,\n    \"collectMetrics\": true,\n    \"metricsInterval\": 100\n  }\n}\n"
  },
  {
    "path": "aws/sdk/benchmarks/standardized-benches/e2e-configs/ddb-putitem-1KiB-latency-benchmark.json",
    "content": "{\n  \"version\": 1,\n  \"name\": \"ddb-putitem-1KiB-latency-benchmark\",\n  \"description\": \"DynamoDB PutItem latency benchmark - measures SDK latency for write operations executed sequentially.\",\n  \"service\": \"dynamodb\",\n  \"action\": \"putitem\",\n  \"actionConfig\": {\n    \"description\": \"Each item has a string partition key 'pk' (format: '<keyPrefix><index>') and a binary attribute 'data' with <dataLength> bytes of String type data.\",\n    \"tableName\": \"benchmark-table\",\n    \"region\": \"us-east-1\",\n    \"dataLength\": 1024,\n    \"keyPrefix\": \"item-\"\n  },\n  \"batch\": {\n    \"description\": \"A batch is 1,000 PutItem actions executed sequentially\",\n    \"numberOfActions\": 1000,\n    \"sequentialExecution\": true\n  },\n  \"warmup\": {\n    \"batches\": 2\n  },\n  \"measurement\": {\n    \"batches\": 3,\n    \"collectMetrics\": true,\n    \"metricsInterval\": 100\n  }\n}\n"
  },
  {
    "path": "aws/sdk/benchmarks/standardized-benches/e2e-configs/s3-download-256KiB-throughput-benchmark.json",
    "content": "{\n  \"version\": 1,\n  \"name\": \"s3-download-256KiB-throughput-benchmark\",\n  \"description\": \"S3 GetObject throughput benchmark - measures maximum download throughput with 256KiB objects under high concurrency\",\n  \"service\": \"s3\",\n  \"action\": \"download\",\n  \"actionConfig\": {\n    \"bucketName\": \"replace with your bucket name\",\n    \"region\": \"us-east-1\",\n    \"objectSize\": 262144,\n    \"keyPrefix\": \"objects/256KiB/\",\n    \"cleanupObjectsAfterBenchmark\": true\n  },\n  \"batch\": {\n    \"description\": \"A batch is 10,000 GetObject actions executed concurrently with SDK's optimal concurrency\",\n    \"numberOfActions\": 10000,\n    \"sequentialExecution\": false\n  },\n  \"warmup\": {\n    \"batches\": 2\n  },\n  \"measurement\": {\n    \"batches\": 3,\n    \"collectMetrics\": true,\n    \"metricsInterval\": 100\n  }\n}\n"
  },
  {
    "path": "aws/sdk/benchmarks/standardized-benches/e2e-configs/s3-upload-256KiB-throughput-benchmark.json",
    "content": "{\n  \"version\": 1,\n  \"name\": \"s3-upload-256KiB-throughput-benchmark\",\n  \"description\": \"S3 PutObject throughput benchmark - measures maximum upload throughput with 256KiB objects under high concurrency\",\n  \"service\": \"s3\",\n  \"action\": \"upload\",\n  \"actionConfig\": {\n    \"bucketName\": \"replace with your bucket name\",\n    \"region\": \"us-east-1\",\n    \"objectSize\": 262144,\n    \"filesOnDisk\": false,\n    \"checksum\": null,\n    \"keyPrefix\": \"objects/256KiB/\"\n  },\n  \"batch\": {\n    \"description\": \"A batch is 10,000 PutObject actions executed concurrently with SDK's optimal concurrency\",\n    \"numberOfActions\": 10000,\n    \"sequentialExecution\": false\n  },\n  \"warmup\": {\n    \"batches\": 2\n  },\n  \"measurement\": {\n    \"batches\": 3,\n    \"collectMetrics\": true,\n    \"metricsInterval\": 100\n  }\n}\n"
  },
  {
    "path": "aws/sdk/benchmarks/standardized-benches/src/bench_utils.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/// Filter outliers using IQR method (1.5 × IQR fence).\n/// Input must be sorted. Returns a new vec with outliers removed.\npub fn filter_outliers(sorted: &[f64]) -> Vec<f64> {\n    let n = sorted.len();\n    let q1 = sorted[n / 4];\n    let q3 = sorted[3 * n / 4];\n    let iqr = q3 - q1;\n    let lo = q1 - 1.5 * iqr;\n    let hi = q3 + 1.5 * iqr;\n    sorted\n        .iter()\n        .copied()\n        .filter(|&x| x >= lo && x <= hi)\n        .collect()\n}\n\n/// Compute the median of a pre-sorted slice.\npub fn median(sorted: &[f64]) -> f64 {\n    let n = sorted.len();\n    if n % 2 == 0 {\n        (sorted[n / 2 - 1] + sorted[n / 2]) / 2.0\n    } else {\n        sorted[n / 2]\n    }\n}\n\n/// Compute the p-th percentile (0.0–1.0) of a pre-sorted slice.\npub fn percentile<T: Copy + PartialOrd>(sorted: &[T], p: f64) -> T {\n    let idx = (p * (sorted.len() - 1) as f64).round() as usize;\n    sorted[idx]\n}\n\npub struct BasicStats {\n    pub mean: f64,\n    pub max: f64,\n    pub std_dev: f64,\n}\n\n/// Compute mean, max, and population standard deviation for a set of samples.\npub fn basic_stats(samples: &[f64]) -> BasicStats {\n    if samples.is_empty() {\n        return BasicStats {\n            mean: 0.0,\n            max: 0.0,\n            std_dev: 0.0,\n        };\n    }\n    let mean = samples.iter().sum::<f64>() / samples.len() as f64;\n    let max = samples.iter().cloned().fold(f64::NEG_INFINITY, f64::max);\n    let std_dev =\n        (samples.iter().map(|x| (x - mean).powi(2)).sum::<f64>() / samples.len() as f64).sqrt();\n    BasicStats { mean, max, std_dev }\n}\n"
  },
  {
    "path": "aws/sdk/benchmarks/standardized-benches/src/bin/ddb_e2e.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse clap::Parser;\nuse standardized_benches::e2e::benchmark_types::BenchmarkConfig;\nuse standardized_benches::e2e::ddb::{run_benchmark, ActionConfig};\nuse std::fs;\n\n#[derive(Parser)]\nstruct Args {\n    #[arg(short, long)]\n    config_path: String,\n}\n\n#[tokio::main]\nasync fn main() {\n    let args = Args::parse();\n    let config_str = fs::read_to_string(&args.config_path).expect(\"config file should be readable\");\n    let config: BenchmarkConfig<ActionConfig> =\n        serde_json::from_str(&config_str).expect(\"config file should be valid JSON\");\n    let results = run_benchmark(config).await;\n    println!(\n        \"{}\",\n        serde_json::to_string_pretty(&results).expect(\"results should be rendered\")\n    );\n}\n"
  },
  {
    "path": "aws/sdk/benchmarks/standardized-benches/src/bin/lambda_endpoint.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse standardized_benches::endpoint::lambda::LambdaEndpointBenchmark;\nuse standardized_benches::endpoint::{run_benchmark, BenchmarkConfig};\n\n#[tokio::main]\nasync fn main() {\n    let mut results = Vec::new();\n\n    let benchmarks: Vec<(BenchmarkConfig, LambdaEndpointBenchmark)> = vec![\n        (\n            BenchmarkConfig {\n                id: \"lambda_standard_endpoint_resolution\",\n                description: \"Lambda standard endpoint resolution\",\n                runs: 10000,\n            },\n            LambdaEndpointBenchmark::standard(),\n        ),\n        (\n            BenchmarkConfig {\n                id: \"lambda_govcloud_fips_dualstack_endpoint_resolution\",\n                description: \"Lambda GovCloud FIPS dual-stack endpoint resolution\",\n                runs: 10000,\n            },\n            LambdaEndpointBenchmark::govcloud_fips_dualstack(),\n        ),\n    ];\n    for (config, bench) in &benchmarks {\n        results.push(run_benchmark(config, || bench.resolve()).await);\n    }\n\n    let output = serde_json::json!({\n        \"product_id\": \"aws-sdk-rust\",\n        \"results\": results,\n    });\n    println!(\n        \"{}\",\n        serde_json::to_string_pretty(&output).expect(\"output should be serialized\")\n    );\n}\n"
  },
  {
    "path": "aws/sdk/benchmarks/standardized-benches/src/bin/s3_e2e.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse clap::Parser;\nuse standardized_benches::e2e::benchmark_types::BenchmarkConfig;\nuse standardized_benches::e2e::s3::{run_benchmark, ActionConfig};\nuse std::fs;\n\n#[derive(Parser)]\nstruct Args {\n    #[arg(short, long)]\n    config_path: String,\n}\n\n#[tokio::main]\nasync fn main() {\n    let args = Args::parse();\n    let config_str = fs::read_to_string(&args.config_path).expect(\"config file should be readable\");\n    let config: BenchmarkConfig<ActionConfig> =\n        serde_json::from_str(&config_str).expect(\"config file should be valid JSON\");\n    let results = run_benchmark(config).await;\n    println!(\n        \"{}\",\n        serde_json::to_string_pretty(&results).expect(\"results should be rendered\")\n    );\n}\n"
  },
  {
    "path": "aws/sdk/benchmarks/standardized-benches/src/bin/s3_endpoint.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse standardized_benches::endpoint::s3::S3EndpointBenchmark;\nuse standardized_benches::endpoint::{run_benchmark, BenchmarkConfig};\n\n#[tokio::main]\nasync fn main() {\n    let mut results = Vec::new();\n\n    let benchmarks: Vec<(BenchmarkConfig, S3EndpointBenchmark)> = vec![\n        (\n            BenchmarkConfig {\n                id: \"s3_outposts_endpoint_resolution\",\n                description: \"S3 outposts vanilla test\",\n                runs: 10000,\n            },\n            S3EndpointBenchmark::outposts(),\n        ),\n        (\n            BenchmarkConfig {\n                id: \"s3_accesspoint_endpoint_resolution\",\n                description: \"S3 Access Point endpoint resolution benchmark\",\n                runs: 10000,\n            },\n            S3EndpointBenchmark::accesspoint(),\n        ),\n        (\n            BenchmarkConfig {\n                id: \"s3express_endpoint_resolution\",\n                description: \"Data Plane with short zone name\",\n                runs: 10000,\n            },\n            S3EndpointBenchmark::express(),\n        ),\n        (\n            BenchmarkConfig {\n                id: \"s3_path_style_endpoint_resolution\",\n                description: \"vanilla path style@us-west-2\",\n                runs: 10000,\n            },\n            S3EndpointBenchmark::path_style(),\n        ),\n        (\n            BenchmarkConfig {\n                id: \"s3_virtual_addressing_endpoint_resolution\",\n                description: \"vanilla virtual addressing@us-west-2\",\n                runs: 10000,\n            },\n            S3EndpointBenchmark::virtual_addressing(),\n        ),\n    ];\n    for (config, bench) in &benchmarks {\n        results.push(run_benchmark(config, || bench.resolve()).await);\n    }\n\n    let output = serde_json::json!({\n        \"product_id\": \"aws-sdk-rust\",\n        \"results\": results,\n    });\n    println!(\n        \"{}\",\n        serde_json::to_string_pretty(&output).expect(\"output should be serialized\")\n    );\n}\n"
  },
  {
    "path": "aws/sdk/benchmarks/standardized-benches/src/e2e/benchmark_types.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse serde::{Deserialize, Serialize};\n\n#[derive(Debug, Deserialize)]\n#[serde(rename_all = \"camelCase\")]\npub struct BenchmarkConfig<T> {\n    pub version: u32,\n    pub name: String,\n    pub description: String,\n    pub service: String,\n    pub action: String,\n    pub action_config: T,\n    pub batch: BatchConfig,\n    pub warmup: WarmupConfig,\n    pub measurement: MeasurementConfig,\n    /// Timeout in seconds for waiter operations (e.g. wait_until_bucket_exists).\n    /// Defaults to 60 if not specified.\n    #[serde(default = \"default_waiter_timeout_secs\")]\n    pub waiter_timeout_secs: u64,\n}\n\nfn default_waiter_timeout_secs() -> u64 {\n    60\n}\n\n#[derive(Debug, Deserialize)]\n#[serde(rename_all = \"camelCase\")]\npub struct BatchConfig {\n    pub description: String,\n    pub number_of_actions: usize,\n    pub sequential_execution: bool,\n    pub concurrency: Option<usize>,\n}\n\n#[derive(Debug, Deserialize)]\n#[serde(rename_all = \"camelCase\")]\npub struct WarmupConfig {\n    pub batches: usize,\n}\n\n#[derive(Debug, Deserialize)]\n#[serde(rename_all = \"camelCase\")]\npub struct MeasurementConfig {\n    pub batches: usize,\n    pub collect_metrics: bool,\n    pub metrics_interval: u64,\n}\n\n#[derive(Debug, Serialize)]\n#[serde(rename_all = \"camelCase\")]\npub struct ResourceStats {\n    pub mean: f64,\n    pub max: f64,\n}\n\nimpl From<crate::bench_utils::BasicStats> for ResourceStats {\n    fn from(s: crate::bench_utils::BasicStats) -> Self {\n        Self {\n            mean: s.mean,\n            max: s.max,\n        }\n    }\n}\n"
  },
  {
    "path": "aws/sdk/benchmarks/standardized-benches/src/e2e/ddb.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse super::benchmark_types::{BenchmarkConfig, ResourceStats};\nuse super::ResourceMonitor;\nuse crate::bench_utils::{basic_stats, percentile};\nuse aws_sdk_dynamodb::client::Waiters;\nuse aws_sdk_dynamodb::types::AttributeValue;\nuse aws_sdk_dynamodb::Client;\nuse serde::{Deserialize, Serialize};\nuse std::collections::HashMap;\nuse std::time::Instant;\n\n#[derive(Debug, Deserialize)]\n#[serde(rename_all = \"camelCase\")]\npub struct ActionConfig {\n    pub table_name: String,\n    pub region: String,\n    pub key_prefix: String,\n    #[serde(default)]\n    pub delete_table_after_benchmark: bool,\n}\n\n#[derive(Debug, Serialize)]\n#[serde(rename_all = \"camelCase\")]\npub struct BenchmarkResults {\n    pub name: String,\n    pub latency_stats: LatencyStats,\n    pub cpu_stats: ResourceStats,\n    pub memory_stats: ResourceStats,\n}\n\n#[derive(Debug, Serialize)]\n#[serde(rename_all = \"camelCase\")]\npub struct LatencyStats {\n    pub mean_ms: f64,\n    pub p50_ms: f64,\n    pub p90_ms: f64,\n    pub p99_ms: f64,\n    pub std_dev_ms: f64,\n}\n\npub async fn run_benchmark(config: BenchmarkConfig<ActionConfig>) -> BenchmarkResults {\n    let sdk_config = aws_config::defaults(aws_config::BehaviorVersion::latest())\n        .region(aws_config::Region::new(config.action_config.region.clone()))\n        .load()\n        .await;\n    let client = Client::new(&sdk_config);\n\n    setup_table(&client, &config).await;\n\n    for _ in 0..config.warmup.batches {\n        run_batch(&client, &config).await;\n    }\n\n    let monitor = ResourceMonitor::spawn(config.measurement.metrics_interval);\n    let mut all_latencies = Vec::new();\n\n    for _ in 0..config.measurement.batches {\n        let latencies = run_batch_with_latencies(&client, &config).await;\n        all_latencies.extend(latencies);\n    }\n\n    let (cpu, mem) = monitor.stop();\n\n    if config.action_config.delete_table_after_benchmark {\n        if let Err(e) = client\n            .delete_table()\n            .table_name(&config.action_config.table_name)\n            .send()\n            .await\n        {\n            eprintln!(\"Warning: failed to delete table: {e}\");\n        } else if let Err(e) = client\n            .wait_until_table_not_exists()\n            .table_name(&config.action_config.table_name)\n            .wait(std::time::Duration::from_secs(config.waiter_timeout_secs))\n            .await\n        {\n            eprintln!(\"Warning: table deletion did not complete: {e}\");\n        }\n    }\n\n    BenchmarkResults {\n        name: config.name,\n        latency_stats: calculate_latency_stats(&all_latencies),\n        cpu_stats: basic_stats(&cpu).into(),\n        memory_stats: basic_stats(&mem).into(),\n    }\n}\n\nasync fn setup_table(client: &Client, config: &BenchmarkConfig<ActionConfig>) {\n    let table_name = &config.action_config.table_name;\n\n    let _ = client\n        .create_table()\n        .table_name(table_name)\n        .key_schema(\n            aws_sdk_dynamodb::types::KeySchemaElement::builder()\n                .attribute_name(\"id\")\n                .key_type(aws_sdk_dynamodb::types::KeyType::Hash)\n                .build()\n                .expect(\"valid key schema\"),\n        )\n        .attribute_definitions(\n            aws_sdk_dynamodb::types::AttributeDefinition::builder()\n                .attribute_name(\"id\")\n                .attribute_type(aws_sdk_dynamodb::types::ScalarAttributeType::S)\n                .build()\n                .expect(\"valid attribute definition\"),\n        )\n        .billing_mode(aws_sdk_dynamodb::types::BillingMode::Provisioned)\n        .provisioned_throughput(\n            aws_sdk_dynamodb::types::ProvisionedThroughput::builder()\n                .read_capacity_units(5000)\n                .write_capacity_units(5000)\n                .build()\n                .expect(\"valid throughput\"),\n        )\n        .send()\n        .await;\n\n    client\n        .wait_until_table_exists()\n        .table_name(table_name)\n        .wait(std::time::Duration::from_secs(config.waiter_timeout_secs))\n        .await\n        .expect(\"table should become active\");\n\n    if config.action == \"getitem\" {\n        let data = \"x\".repeat(1024);\n        for i in 0..config.batch.number_of_actions {\n            let key = format!(\"{}{}\", config.action_config.key_prefix, i);\n            let mut item = HashMap::new();\n            item.insert(\"id\".to_string(), AttributeValue::S(key));\n            item.insert(\"data\".to_string(), AttributeValue::S(data.clone()));\n            client\n                .put_item()\n                .table_name(table_name)\n                .set_item(Some(item))\n                .send()\n                .await\n                .expect(\"seed putitem should succeed\");\n        }\n    }\n}\n\nasync fn run_batch(client: &Client, config: &BenchmarkConfig<ActionConfig>) {\n    let data = \"x\".repeat(1024);\n    for i in 0..config.batch.number_of_actions {\n        let key = format!(\"{}{}\", config.action_config.key_prefix, i);\n        match config.action.as_str() {\n            \"putitem\" => {\n                let mut item = HashMap::new();\n                item.insert(\"id\".to_string(), AttributeValue::S(key));\n                item.insert(\"data\".to_string(), AttributeValue::S(data.clone()));\n                client\n                    .put_item()\n                    .table_name(&config.action_config.table_name)\n                    .set_item(Some(item))\n                    .send()\n                    .await\n                    .expect(\"putitem should succeed\");\n            }\n            \"getitem\" => {\n                client\n                    .get_item()\n                    .table_name(&config.action_config.table_name)\n                    .key(\"id\", AttributeValue::S(key))\n                    .send()\n                    .await\n                    .expect(\"getitem should succeed\");\n            }\n            other => panic!(\"unsupported action: {other}\"),\n        }\n    }\n}\n\nasync fn run_batch_with_latencies(\n    client: &Client,\n    config: &BenchmarkConfig<ActionConfig>,\n) -> Vec<f64> {\n    let data = \"x\".repeat(1024);\n    let mut latencies = Vec::with_capacity(config.batch.number_of_actions);\n\n    for i in 0..config.batch.number_of_actions {\n        let key = format!(\"{}{}\", config.action_config.key_prefix, i);\n        let start = Instant::now();\n        match config.action.as_str() {\n            \"putitem\" => {\n                let mut item = HashMap::new();\n                item.insert(\"id\".to_string(), AttributeValue::S(key));\n                item.insert(\"data\".to_string(), AttributeValue::S(data.clone()));\n                client\n                    .put_item()\n                    .table_name(&config.action_config.table_name)\n                    .set_item(Some(item))\n                    .send()\n                    .await\n                    .expect(\"putitem should succeed\");\n            }\n            \"getitem\" => {\n                client\n                    .get_item()\n                    .table_name(&config.action_config.table_name)\n                    .key(\"id\", AttributeValue::S(key))\n                    .send()\n                    .await\n                    .expect(\"getitem should succeed\");\n            }\n            other => panic!(\"unsupported action: {other}\"),\n        }\n        latencies.push(start.elapsed().as_secs_f64() * 1000.0);\n    }\n\n    latencies\n}\n\nfn calculate_latency_stats(latencies: &[f64]) -> LatencyStats {\n    let mut sorted = latencies.to_vec();\n    sorted.sort_by(|a, b| a.partial_cmp(b).expect(\"no NaN in latency data\"));\n\n    let stats = basic_stats(&sorted);\n    LatencyStats {\n        mean_ms: stats.mean,\n        p50_ms: percentile(&sorted, 0.5),\n        p90_ms: percentile(&sorted, 0.9),\n        p99_ms: percentile(&sorted, 0.99),\n        std_dev_ms: stats.std_dev,\n    }\n}\n"
  },
  {
    "path": "aws/sdk/benchmarks/standardized-benches/src/e2e/s3.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse super::benchmark_types::{BenchmarkConfig, ResourceStats};\nuse super::ResourceMonitor;\nuse crate::bench_utils::basic_stats;\nuse aws_sdk_s3::primitives::ByteStream;\nuse aws_sdk_s3::Client;\nuse aws_smithy_types::error::display::DisplayErrorContext;\nuse futures::future::join_all;\nuse serde::{Deserialize, Serialize};\nuse std::sync::Arc;\nuse std::time::Instant;\n\n#[derive(Debug, Deserialize)]\n#[serde(rename_all = \"camelCase\")]\npub struct ActionConfig {\n    pub bucket_name: String,\n    pub region: String,\n    pub object_size: usize,\n    pub key_prefix: String,\n    #[serde(default)]\n    pub files_on_disk: bool,\n    pub checksum: Option<String>,\n    #[serde(default)]\n    pub cleanup_objects_after_benchmark: bool,\n}\n\n#[derive(Debug, Serialize)]\n#[serde(rename_all = \"camelCase\")]\npub struct BenchmarkResults {\n    pub name: String,\n    pub iterations: Vec<IterationResult>,\n    pub cpu_stats: ResourceStats,\n    pub memory_stats: ResourceStats,\n}\n\n#[derive(Debug, Serialize)]\n#[serde(rename_all = \"camelCase\")]\npub struct IterationResult {\n    pub total_time_seconds: f64,\n    pub throughput_gbps: f64,\n}\n\npub async fn run_benchmark(config: BenchmarkConfig<ActionConfig>) -> BenchmarkResults {\n    let mut config_loader = aws_config::defaults(aws_config::BehaviorVersion::latest())\n        .region(aws_config::Region::new(config.action_config.region.clone()));\n    if config.action_config.checksum.is_none() {\n        config_loader = config_loader\n            .request_checksum_calculation(\n                aws_sdk_s3::config::RequestChecksumCalculation::WhenRequired,\n            )\n            .response_checksum_validation(\n                aws_sdk_s3::config::ResponseChecksumValidation::WhenRequired,\n            );\n    }\n    let sdk_config = config_loader.load().await;\n    let client = Client::new(&sdk_config);\n\n    ensure_bucket_exists(&client, &config).await;\n\n    let data = vec![0u8; config.action_config.object_size];\n\n    if config.action == \"download\" {\n        setup_objects(&client, &config, &data).await;\n    }\n\n    for _ in 0..config.warmup.batches {\n        run_batch(&client, &config, &data).await;\n    }\n\n    let monitor = ResourceMonitor::spawn(config.measurement.metrics_interval);\n    let mut iterations = Vec::new();\n\n    for _ in 0..config.measurement.batches {\n        let start = Instant::now();\n        run_batch(&client, &config, &data).await;\n        let total_time = start.elapsed().as_secs_f64();\n        let throughput_gbps =\n            (config.batch.number_of_actions as f64 * config.action_config.object_size as f64 * 8.0)\n                / total_time\n                / 1_000_000_000.0;\n        iterations.push(IterationResult {\n            total_time_seconds: total_time,\n            throughput_gbps,\n        });\n    }\n\n    let (cpu, mem) = monitor.stop();\n\n    if config.action_config.cleanup_objects_after_benchmark {\n        cleanup_objects(&client, &config).await;\n    }\n\n    BenchmarkResults {\n        name: config.name,\n        iterations,\n        cpu_stats: basic_stats(&cpu).into(),\n        memory_stats: basic_stats(&mem).into(),\n    }\n}\n\nfn assert_all_ok<T, E: std::fmt::Debug + std::error::Error>(\n    results: &[Result<T, E>],\n    label: &str,\n    expected: usize,\n) {\n    let ok_count = results.iter().filter(|r| r.is_ok()).count();\n    if ok_count != expected {\n        if let Some(first_err) = results.iter().find_map(|r| r.as_ref().err()) {\n            eprintln!(\"  First error: {}\", DisplayErrorContext(first_err));\n        }\n        panic!(\n            \"{}: only {}/{} operations succeeded\",\n            label, ok_count, expected\n        );\n    }\n}\n\nasync fn cleanup_objects(client: &Client, config: &BenchmarkConfig<ActionConfig>) {\n    let tasks: Vec<_> = (0..config.batch.number_of_actions)\n        .map(|i| {\n            let key = format!(\"{}{}\", config.action_config.key_prefix, i);\n            client\n                .delete_object()\n                .bucket(&config.action_config.bucket_name)\n                .key(key)\n                .send()\n        })\n        .collect();\n    let results = join_all(tasks).await;\n    let ok_count = results.iter().filter(|r| r.is_ok()).count();\n    if ok_count != config.batch.number_of_actions {\n        eprintln!(\n            \"  Warning: cleanup {}/{} succeeded\",\n            ok_count, config.batch.number_of_actions\n        );\n    }\n}\n\nasync fn ensure_bucket_exists(client: &Client, config: &BenchmarkConfig<ActionConfig>) {\n    let bucket_name = &config.action_config.bucket_name;\n    let waiter_timeout = std::time::Duration::from_secs(config.waiter_timeout_secs);\n\n    if client\n        .head_bucket()\n        .bucket(bucket_name)\n        .send()\n        .await\n        .is_ok()\n    {\n        return;\n    }\n\n    let mut req = client.create_bucket().bucket(bucket_name);\n\n    if bucket_name.ends_with(\"--x-s3\") {\n        use aws_sdk_s3::types::{\n            BucketInfo, BucketType, CreateBucketConfiguration, DataRedundancy, LocationInfo,\n            LocationType,\n        };\n        let parts: Vec<&str> = bucket_name.split(\"--\").collect();\n        let az_id = parts[parts.len() - 2];\n        let config = CreateBucketConfiguration::builder()\n            .location(\n                LocationInfo::builder()\n                    .r#type(LocationType::AvailabilityZone)\n                    .name(az_id)\n                    .build(),\n            )\n            .bucket(\n                BucketInfo::builder()\n                    .r#type(BucketType::Directory)\n                    .data_redundancy(DataRedundancy::SingleAvailabilityZone)\n                    .build(),\n            )\n            .build();\n        req = req.create_bucket_configuration(config);\n    } else if client.config().region().map(|r| r.as_ref()) != Some(\"us-east-1\") {\n        use aws_sdk_s3::types::{BucketLocationConstraint, CreateBucketConfiguration};\n        if let Some(region) = client.config().region() {\n            let config = CreateBucketConfiguration::builder()\n                .location_constraint(BucketLocationConstraint::from(region.as_ref()))\n                .build();\n            req = req.create_bucket_configuration(config);\n        }\n    }\n\n    req.send()\n        .await\n        .unwrap_or_else(|e| panic!(\"failed to create bucket '{}': {:?}\", bucket_name, e));\n\n    use aws_sdk_s3::client::Waiters;\n    client\n        .wait_until_bucket_exists()\n        .bucket(bucket_name)\n        .wait(waiter_timeout)\n        .await\n        .unwrap_or_else(|e| panic!(\"timed out waiting for bucket '{}': {:?}\", bucket_name, e));\n}\n\nasync fn setup_objects(client: &Client, config: &BenchmarkConfig<ActionConfig>, data: &[u8]) {\n    let concurrency = config\n        .batch\n        .concurrency\n        .unwrap_or(config.batch.number_of_actions);\n    let sem = Arc::new(tokio::sync::Semaphore::new(concurrency));\n    let tasks: Vec<_> = (0..config.batch.number_of_actions)\n        .map(|i| {\n            let key = format!(\"{}{}\", config.action_config.key_prefix, i);\n            let body = ByteStream::from(data.to_vec());\n            let sem = sem.clone();\n            let fut = client\n                .put_object()\n                .bucket(&config.action_config.bucket_name)\n                .key(key)\n                .body(body)\n                .send();\n            async move {\n                let _permit = sem.acquire().await.expect(\"semaphore should not be closed\");\n                fut.await\n            }\n        })\n        .collect();\n    let results = join_all(tasks).await;\n    assert_all_ok(&results, \"setup_objects\", config.batch.number_of_actions);\n}\n\nasync fn run_batch(client: &Client, config: &BenchmarkConfig<ActionConfig>, data: &[u8]) {\n    let concurrency = config\n        .batch\n        .concurrency\n        .unwrap_or(config.batch.number_of_actions);\n    let sem = Arc::new(tokio::sync::Semaphore::new(concurrency));\n\n    if config.action == \"upload\" {\n        let tasks: Vec<_> = (0..config.batch.number_of_actions)\n            .map(|i| {\n                let key = format!(\"{}{}\", config.action_config.key_prefix, i);\n                let body = ByteStream::from(data.to_vec());\n                let sem = sem.clone();\n                let fut = client\n                    .put_object()\n                    .bucket(&config.action_config.bucket_name)\n                    .key(key)\n                    .body(body)\n                    .send();\n                async move {\n                    let _permit = sem.acquire().await.expect(\"semaphore should not be closed\");\n                    fut.await\n                }\n            })\n            .collect();\n        let results = join_all(tasks).await;\n        assert_all_ok(&results, \"upload\", config.batch.number_of_actions);\n    } else {\n        let tasks: Vec<_> = (0..config.batch.number_of_actions)\n            .map(|i| {\n                let key = format!(\"{}{}\", config.action_config.key_prefix, i);\n                let sem = sem.clone();\n                let fut = client\n                    .get_object()\n                    .bucket(&config.action_config.bucket_name)\n                    .key(key)\n                    .send();\n                async move {\n                    let _permit = sem.acquire().await.expect(\"semaphore should not be closed\");\n                    let resp = fut.await.expect(\"download request should succeed\");\n                    resp.body\n                        .collect()\n                        .await\n                        .expect(\"download body read should succeed\");\n                }\n            })\n            .collect();\n        join_all(tasks).await;\n    }\n}\n"
  },
  {
    "path": "aws/sdk/benchmarks/standardized-benches/src/e2e.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::sync::{Arc, Mutex};\nuse sysinfo::{Pid, ProcessRefreshKind, System};\nuse tokio::task::JoinHandle;\n\npub mod benchmark_types;\npub mod ddb;\npub mod s3;\n\npub struct ResourceMonitor {\n    handle: JoinHandle<()>,\n    cpu_samples: Arc<Mutex<Vec<f64>>>,\n    memory_samples: Arc<Mutex<Vec<f64>>>,\n}\n\nimpl ResourceMonitor {\n    pub fn spawn(interval_ms: u64) -> Self {\n        let cpu_samples = Arc::new(Mutex::new(Vec::new()));\n        let memory_samples = Arc::new(Mutex::new(Vec::new()));\n        let cpu = cpu_samples.clone();\n        let mem = memory_samples.clone();\n\n        let handle = tokio::spawn(async move {\n            let mut sys = System::new();\n            let pid = Pid::from_u32(std::process::id());\n            sys.refresh_process_specifics(pid, ProcessRefreshKind::new().with_cpu());\n            tokio::time::sleep(tokio::time::Duration::from_millis(200)).await;\n\n            loop {\n                sys.refresh_process_specifics(\n                    pid,\n                    ProcessRefreshKind::new().with_cpu().with_memory(),\n                );\n                if let Some(process) = sys.process(pid) {\n                    cpu.lock()\n                        .expect(\"cpu lock poisoned\")\n                        .push(process.cpu_usage() as f64);\n                    mem.lock()\n                        .expect(\"mem lock poisoned\")\n                        .push(process.memory() as f64 / 1024.0 / 1024.0);\n                }\n                tokio::time::sleep(tokio::time::Duration::from_millis(interval_ms)).await;\n            }\n        });\n\n        Self {\n            handle,\n            cpu_samples,\n            memory_samples,\n        }\n    }\n\n    pub fn stop(self) -> (Vec<f64>, Vec<f64>) {\n        self.handle.abort();\n        let cpu = self.cpu_samples.lock().expect(\"cpu lock poisoned\").clone();\n        let mem = self\n            .memory_samples\n            .lock()\n            .expect(\"mem lock poisoned\")\n            .clone();\n        (cpu, mem)\n    }\n}\n"
  },
  {
    "path": "aws/sdk/benchmarks/standardized-benches/src/endpoint/lambda.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_sdk_lambda::config::endpoint::{DefaultResolver, Params, ResolveEndpoint};\nuse aws_smithy_types::endpoint::Endpoint;\n\npub struct LambdaEndpointBenchmark {\n    resolver: DefaultResolver,\n    params: Params,\n}\n\nimpl LambdaEndpointBenchmark {\n    fn new(params: Params) -> Self {\n        Self {\n            resolver: DefaultResolver::new(),\n            params,\n        }\n    }\n\n    pub async fn resolve(&self) -> Endpoint {\n        self.resolver\n            .resolve_endpoint(&self.params)\n            .await\n            .expect(\"valid endpoint\")\n    }\n\n    pub fn standard() -> Self {\n        Self::new(\n            Params::builder()\n                .set_region(Some(\"us-east-1\".to_owned()))\n                .set_use_fips(Some(false))\n                .set_use_dual_stack(Some(false))\n                .build()\n                .expect(\"valid params\"),\n        )\n    }\n\n    pub fn govcloud_fips_dualstack() -> Self {\n        Self::new(\n            Params::builder()\n                .set_region(Some(\"us-gov-east-1\".to_owned()))\n                .set_use_fips(Some(true))\n                .set_use_dual_stack(Some(true))\n                .build()\n                .expect(\"valid params\"),\n        )\n    }\n}\n"
  },
  {
    "path": "aws/sdk/benchmarks/standardized-benches/src/endpoint/s3.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_sdk_s3::config::endpoint::{DefaultResolver, Params, ResolveEndpoint};\nuse aws_smithy_types::endpoint::Endpoint;\n\npub struct S3EndpointBenchmark {\n    resolver: DefaultResolver,\n    params: Params,\n}\n\nimpl S3EndpointBenchmark {\n    fn new(params: Params) -> Self {\n        Self {\n            resolver: DefaultResolver::new(),\n            params,\n        }\n    }\n\n    pub async fn resolve(&self) -> Endpoint {\n        self.resolver\n            .resolve_endpoint(&self.params)\n            .await\n            .expect(\"valid endpoint\")\n    }\n\n    pub fn outposts() -> Self {\n        Self::new(\n            Params::builder()\n                .set_region(Some(\"us-west-2\".to_owned()))\n                .set_bucket(Some(\n                    \"arn:aws:s3-outposts:us-west-2:123456789012:outpost/op-01234567890123456/accesspoint/reports\".to_owned()\n                ))\n                .set_key(Some(\"key\".to_owned()))\n                .build()\n                .expect(\"valid params\"),\n        )\n    }\n\n    pub fn accesspoint() -> Self {\n        Self::new(\n            Params::builder()\n                .set_region(Some(\"us-west-2\".to_owned()))\n                .set_bucket(Some(\n                    \"arn:aws:s3:us-west-2:123456789012:accesspoint:myendpoint\".to_owned(),\n                ))\n                .set_key(Some(\"key\".to_owned()))\n                .build()\n                .expect(\"valid params\"),\n        )\n    }\n\n    pub fn express() -> Self {\n        Self::new(\n            Params::builder()\n                .set_region(Some(\"us-east-1\".to_owned()))\n                .set_bucket(Some(\"mybucket--abcd-ab1--x-s3\".to_owned()))\n                .set_key(Some(\"key\".to_owned()))\n                .build()\n                .expect(\"valid params\"),\n        )\n    }\n\n    pub fn path_style() -> Self {\n        Self::new(\n            Params::builder()\n                .set_region(Some(\"us-west-2\".to_owned()))\n                .set_bucket(Some(\"bucket-name\".to_owned()))\n                .set_key(Some(\"key\".to_owned()))\n                .set_force_path_style(Some(true))\n                .build()\n                .expect(\"valid params\"),\n        )\n    }\n\n    pub fn virtual_addressing() -> Self {\n        Self::new(\n            Params::builder()\n                .set_region(Some(\"us-west-2\".to_owned()))\n                .set_bucket(Some(\"bucket-name\".to_owned()))\n                .set_key(Some(\"key\".to_owned()))\n                .build()\n                .expect(\"valid params\"),\n        )\n    }\n}\n"
  },
  {
    "path": "aws/sdk/benchmarks/standardized-benches/src/endpoint.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse serde::Serialize;\nuse std::hint::black_box;\nuse std::time::Instant;\n\npub mod lambda;\npub mod s3;\n\npub struct BenchmarkConfig {\n    pub id: &'static str,\n    pub description: &'static str,\n    pub runs: usize,\n}\n\n#[derive(Serialize)]\npub struct BenchmarkResult {\n    pub id: &'static str,\n    pub description: &'static str,\n    pub n: usize,\n    pub outliers_removed: usize,\n    pub mean_ns: f64,\n    pub median_ns: f64,\n    pub std_dev_ns: f64,\n    pub p90_ns: u64,\n    pub p99_ns: u64,\n}\n\npub async fn run_benchmark<F, Fut>(config: &BenchmarkConfig, f: F) -> BenchmarkResult\nwhere\n    F: Fn() -> Fut,\n    Fut: std::future::Future,\n{\n    use crate::bench_utils::{basic_stats, filter_outliers, median, percentile};\n\n    for _ in 0..5 {\n        black_box(f().await);\n    }\n\n    let mut timings = Vec::with_capacity(config.runs);\n    for _ in 0..config.runs {\n        let start = Instant::now();\n        black_box(f().await);\n        timings.push(start.elapsed().as_nanos() as u64);\n    }\n\n    timings.sort_unstable();\n    let raw_n = timings.len();\n    let p90 = percentile(&timings, 0.9);\n    let p99 = percentile(&timings, 0.99);\n\n    let timings_f64: Vec<f64> = timings.iter().map(|&x| x as f64).collect();\n    let filtered = filter_outliers(&timings_f64);\n    let n = filtered.len();\n    let stats = basic_stats(&filtered);\n\n    BenchmarkResult {\n        id: config.id,\n        description: config.description,\n        n,\n        outliers_removed: raw_n - n,\n        mean_ns: stats.mean,\n        median_ns: median(&filtered),\n        std_dev_ns: stats.std_dev,\n        p90_ns: p90,\n        p99_ns: p99,\n    }\n}\n"
  },
  {
    "path": "aws/sdk/benchmarks/standardized-benches/src/lib.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npub mod bench_utils;\npub mod e2e;\npub mod endpoint;\n"
  },
  {
    "path": "aws/sdk/build.gradle.kts",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport aws.sdk.AwsServices\nimport aws.sdk.Membership\nimport aws.sdk.discoverServices\nimport aws.sdk.docsLandingPage\nimport aws.sdk.parseMembership\n\nextra[\"displayName\"] = \"Smithy :: Rust :: AWS-SDK\"\nextra[\"moduleName\"] = \"software.amazon.smithy.rust.awssdk\"\n\nplugins {\n    java\n    alias(libs.plugins.smithy.gradle.base)\n    alias(libs.plugins.smithy.gradle.jar)\n}\n\ntasks.jar.configure {\n    enabled = false\n}\n\nconfigure<software.amazon.smithy.gradle.SmithyExtension> {\n    smithyBuildConfigs = files(layout.buildDirectory.file(\"smithy-build.json\"))\n    allowUnknownTraits = true\n}\n\nval properties = PropertyRetriever(rootProject, project)\n\nval crateHasherToolPath = rootProject.projectDir.resolve(\"tools/ci-build/crate-hasher\")\nval publisherToolPath = rootProject.projectDir.resolve(\"tools/ci-build/publisher\")\nval sdkVersionerToolPath = rootProject.projectDir.resolve(\"tools/ci-build/sdk-versioner\")\nval awsConfigPath = rootProject.projectDir.resolve(\"aws/rust-runtime/aws-config\")\nval rustRuntimePath = rootProject.projectDir.resolve(\"rust-runtime\")\nval awsRustRuntimePath = rootProject.projectDir.resolve(\"aws/rust-runtime\")\nval awsSdkPath = rootProject.projectDir.resolve(\"aws/sdk\")\nval outputDir = layout.buildDirectory.dir(\"aws-sdk\").get()\nval sdkOutputDir = outputDir.dir(\"sdk\")\nval checkedInSdkLockfile = rootProject.projectDir.resolve(\"aws/sdk/Cargo.lock\")\nval generatedSdkLockfile = outputDir.file(\"Cargo.lock\")\n\n\ndependencies {\n    implementation(project(\":aws:codegen-aws-sdk\"))\n    implementation(libs.smithy.protocol.test.traits)\n    implementation(libs.smithy.aws.traits)\n    implementation(libs.smithy.aws.iam.traits)\n    implementation(libs.smithy.aws.cloudformation.traits)\n}\n\n// Class and functions for service and protocol membership for SDK generation\n\nval awsServices: AwsServices by lazy {\n    discoverServices(properties.get(\"aws.sdk.models.path\"), loadServiceMembership())\n}\nval crateVersioner by lazy { aws.sdk.CrateVersioner.defaultFor(rootProject, properties) }\n\nfun getRustMSRV(): String = properties.get(\"rust.msrv\") ?: throw Exception(\"Rust MSRV missing\")\nfun getPreviousReleaseVersionManifestPath(): String? = properties.get(\"aws.sdk.previous.release.versions.manifest\")\nfun getNullabilityCheckMode(): String = properties.get(\"nullability.check.mode\") ?: \"CLIENT_CAREFUL\"\n\nfun loadServiceMembership(): Membership {\n    val membershipOverride = properties.get(\"aws.services\")?.let { parseMembership(it) }\n    println(membershipOverride)\n    val fullSdk =\n        parseMembership(properties.get(\"aws.services\") ?: throw Exception(\"aws.services list missing\"))\n    return membershipOverride ?: fullSdk\n}\n\nfun generateSmithyBuild(services: AwsServices): String {\n    val awsConfigVersion = properties.get(CrateSet.STABLE_VERSION_PROP_NAME)\n        ?: throw IllegalStateException(\"missing ${CrateSet.STABLE_VERSION_PROP_NAME} for aws-config version\")\n    val debugMode = properties.get(\"debugMode\").toBoolean()\n    val serviceProjections = services.services.map { service ->\n        val files = service.modelFiles().map { extraFile ->\n            software.amazon.smithy.utils.StringUtils.escapeJavaString(\n                extraFile.absolutePath,\n                \"\",\n            )\n        }\n        val moduleName = \"aws-sdk-${service.module}\"\n        val defaultConfigPath =\n            services.defaultConfigPath.let { software.amazon.smithy.utils.StringUtils.escapeJavaString(it, \"\") }\n        val partitionsConfigPath =\n            services.partitionsConfigPath.let { software.amazon.smithy.utils.StringUtils.escapeJavaString(it, \"\") }\n        val integrationTestPath = project.projectDir.resolve(\"integration-tests\")\n            .let { software.amazon.smithy.utils.StringUtils.escapeJavaString(it, \"\") }\n        \"\"\"\n            \"${service.module}\": {\n                \"imports\": [${files.joinToString()}],\n\n                \"plugins\": {\n                    \"rust-client-codegen\": {\n                        \"runtimeConfig\": {\n                            \"relativePath\": \"../\"\n                        },\n                        \"codegen\": {\n                            \"includeFluentClient\": false,\n                            \"includeEndpointUrlConfig\": false,\n                            \"renameErrors\": false,\n                            \"debugMode\": $debugMode,\n                            \"enableUserConfigurableRuntimePlugins\": false,\n                            \"nullabilityCheckMode\": \"${getNullabilityCheckMode()}\"\n                        },\n                        \"service\": \"${service.service}\",\n                        \"module\": \"$moduleName\",\n                        \"moduleVersion\": \"${crateVersioner.decideCrateVersion(moduleName, service)}\",\n                        \"moduleAuthors\": [\"AWS Rust SDK Team <aws-sdk-rust@amazon.com>\", \"Russell Cohen <rcoh@amazon.com>\"],\n                        \"moduleDescription\": \"${service.moduleDescription}\",\n                        \"moduleRepository\": \"https://github.com/awslabs/aws-sdk-rust\",\n                        \"license\": \"Apache-2.0\",\n                        \"minimumSupportedRustVersion\": \"${getRustMSRV()}\",\n                        \"customizationConfig\": {\n                            \"awsSdk\": {\n                                \"awsSdkBuild\": true,\n                                \"awsConfigVersion\": \"$awsConfigVersion\",\n                                \"defaultConfigPath\": $defaultConfigPath,\n                                \"partitionsConfigPath\": $partitionsConfigPath,\n                                \"integrationTestPath\": $integrationTestPath\n                            }\n                        }\n                        ${service.extraConfig ?: \"\"}\n                    }\n                }\n            }\n        \"\"\".trimIndent()\n    }\n    val projections = serviceProjections.joinToString(\",\\n\")\n    return \"\"\"\n    {\n        \"version\": \"1.0\",\n        \"projections\": { $projections }\n    }\n    \"\"\"\n}\n\n/**\n * Task to generate smithyBuild.json dynamically\n */\ntasks.register(\"generateSmithyBuild\") {\n    description = \"generate smithy-build.json\"\n    inputs.property(\"servicelist\", awsServices.services.toString())\n    inputs.dir(projectDir.resolve(\"aws-models\"))\n    outputs.file(layout.buildDirectory.file(\"smithy-build.json\"))\n\n    doFirst {\n        layout.buildDirectory.file(\"smithy-build.json\").get().asFile.writeText(generateSmithyBuild(awsServices))\n    }\n    // TODO(https://github.com/smithy-lang/smithy-rs/issues/3599)\n    outputs.upToDateWhen { false }\n}\n\ntasks.register(\"generateIndexMd\") {\n    dependsOn(\"jar\")\n\n    inputs.property(\"servicelist\", awsServices.services.toString())\n    val indexMd = outputDir.file(\"index.md\").asFile\n    outputs.file(indexMd)\n    doLast {\n        project.docsLandingPage(awsServices, indexMd)\n    }\n}\n\ntasks.register(\"relocateServices\") {\n    description = \"relocate AWS services to their final destination\"\n    dependsOn(\"jar\")\n\n    doLast {\n        awsServices.services.forEach {\n            logger.info(\"Relocating ${it.module}...\")\n            copy {\n                from(layout.buildDirectory.dir(\"smithyprojections/sdk/${it.module}/rust-client-codegen\"))\n                into(sdkOutputDir.dir(it.module))\n            }\n\n            copy {\n                from(projectDir.resolve(\"integration-tests/${it.module}/tests\"))\n                into(sdkOutputDir.dir(it.module).dir(\"tests\"))\n            }\n\n            copy {\n                from(projectDir.resolve(\"integration-tests/${it.module}/benches\"))\n                into(sdkOutputDir.dir(it.module).dir(\"benches\"))\n            }\n        }\n    }\n    inputs.dir(layout.buildDirectory.dir(\"smithyprojections/sdk\"))\n    outputs.dir(sdkOutputDir)\n}\n\ntasks.register(\"relocateTests\") {\n    description = \"relocate the root integration tests and rewrite path dependencies\"\n    dependsOn(\"jar\")\n\n    doLast {\n        if (awsServices.rootTests.isNotEmpty()) {\n            copy {\n                val testDir = projectDir.resolve(\"integration-tests\")\n                from(testDir)\n                awsServices.rootTests.forEach { test ->\n                    include(test.path.toRelativeString(testDir) + \"/**\")\n                }\n                into(outputDir.dir(\"tests\"))\n                exclude(\"**/target\")\n                filter { line -> line.replace(\"build/aws-sdk/sdk/\", \"sdk/\") }\n            }\n        }\n    }\n    for (test in awsServices.rootTests) {\n        inputs.dir(test.path)\n    }\n    outputs.dir(outputDir)\n}\n\n/**\n * The aws/rust-runtime crates depend on local versions of the Smithy core runtime enabling local compilation. However,\n * those paths need to be replaced in the final build. We should probably fix this with some symlinking.\n */\nfun rewritePathDependency(line: String): String {\n    // some runtime crates are actually dependent on the generated bindings:\n    return line.replace(\"../sdk/build/aws-sdk/sdk/\", \"\")\n        // others use relative dependencies::\n        .replace(\"../../rust-runtime/\", \"\")\n}\n\ntasks.register<Copy>(\"copyAllRuntimes\") {\n    dependsOn(\"jar\")\n    from(\"$rootDir/aws/rust-runtime\") {\n        CrateSet.AWS_SDK_RUNTIME.forEach { include(\"${it.name}/**\") }\n    }\n    from(\"$rootDir/rust-runtime\") {\n        CrateSet.AWS_SDK_SMITHY_RUNTIME.forEach { include(\"${it.name}/**\") }\n    }\n    exclude(\"**/target\")\n    exclude(\"**/Cargo.lock\")\n    exclude(\"**/node_modules\")\n    into(sdkOutputDir)\n}\n\ntasks.register(\"relocateAwsRuntime\") {\n    dependsOn(\"copyAllRuntimes\")\n    doLast {\n        // Patch the Cargo.toml files\n        CrateSet.AWS_SDK_RUNTIME.forEach { module ->\n            patchFile(sdkOutputDir.file(\"${module.name}/Cargo.toml\").asFile) { line ->\n                rewriteRuntimeCrateVersion(\n                    properties.get(module.versionPropertyName)!!,\n                    line.let(::rewritePathDependency),\n                )\n            }\n        }\n    }\n}\ntasks.register(\"relocateRuntime\") {\n    dependsOn(\"copyAllRuntimes\")\n    doLast {\n        // Patch the Cargo.toml files\n        CrateSet.AWS_SDK_SMITHY_RUNTIME.forEach { module ->\n            patchFile(sdkOutputDir.file(\"${module.name}/Cargo.toml\").asFile) { line ->\n                rewriteRuntimeCrateVersion(properties.get(module.versionPropertyName)!!, line)\n            }\n        }\n    }\n}\n\ntasks.register<Copy>(\"relocateChangelog\") {\n    dependsOn(\"jar\")\n    from(\"$rootDir/aws\")\n    include(\"SDK_CHANGELOG.md\")\n    into(outputDir)\n    rename(\"SDK_CHANGELOG.md\", \"CHANGELOG.md\")\n}\n\nfun generateCargoWorkspace(services: AwsServices): String {\n    return \"\"\"\n    |[workspace]\n    |resolver = \"2\"\n    |exclude = [${\"\\n\"}${services.excludedFromWorkspace().joinToString(\",\\n\") { \"|    \\\"$it\\\"\" }}\n    |]\n    |members = [${\"\\n\"}${services.includedInWorkspace().joinToString(\",\\n\") { \"|    \\\"$it\\\"\" }}\n    |]\n    \"\"\".trimMargin()\n}\n\ntasks.register(\"generateCargoWorkspace\") {\n    description = \"generate Cargo.toml workspace file\"\n    doFirst {\n        outputDir.asFile.mkdirs()\n        outputDir.file(\"Cargo.toml\").asFile.writeText(generateCargoWorkspace(awsServices))\n        rootProject.rootDir.resolve(\"clippy-root.toml\").copyTo(outputDir.file(\"clippy.toml\").asFile, overwrite = true)\n    }\n    inputs.property(\"servicelist\", awsServices.moduleNames.toString())\n    for (test in awsServices.rootTests) {\n        inputs.dir(test.path)\n    }\n    outputs.file(outputDir.file(\"Cargo.toml\"))\n    outputs.file(outputDir.file(\"clippy.toml\"))\n    outputs.upToDateWhen { false }\n}\n\ntasks.register<ExecRustBuildTool>(\"fixManifests\") {\n    description = \"Run the publisher tool's `fix-manifests` sub-command on the generated services\"\n    dependsOn(\"relocateServices\")\n    dependsOn(\"relocateRuntime\")\n    dependsOn(\"relocateAwsRuntime\")\n    dependsOn(\"relocateTests\")\n\n    inputs.dir(publisherToolPath)\n    outputs.dir(outputDir)\n\n    toolPath = publisherToolPath\n    binaryName = \"publisher\"\n    arguments = mutableListOf(\"fix-manifests\", \"--location\", outputDir.asFile.absolutePath)\n}\n\ntasks.register<ExecRustBuildTool>(\"hydrateReadme\") {\n    description = \"Run the publisher tool's `hydrate-readme` sub-command to create the final AWS Rust SDK README file\"\n    dependsOn(\"generateVersionManifest\")\n\n    inputs.dir(publisherToolPath)\n    inputs.file(rootProject.projectDir.resolve(\"aws/SDK_README.md.hb\"))\n    outputs.file(outputDir.file(\"README.md\").asFile.absolutePath)\n\n    toolPath = publisherToolPath\n    binaryName = \"publisher\"\n    arguments = listOf(\n        \"hydrate-readme\",\n        \"--versions-manifest\", outputDir.file(\"versions.toml\").toString(),\n        \"--msrv\", getRustMSRV(),\n        \"--input\", rootProject.projectDir.resolve(\"aws/SDK_README.md.hb\").toString(),\n        \"--output\", outputDir.file(\"README.md\").asFile.absolutePath,\n    )\n}\n\ntasks.register<RequireRustBuildTool>(\"requireCrateHasher\") {\n    description = \"Ensures the crate-hasher tool is available\"\n    inputs.dir(crateHasherToolPath)\n    toolPath = crateHasherToolPath\n}\n\ntasks.register<ExecRustBuildTool>(\"generateVersionManifest\") {\n    description = \"Generate the SDK version.toml file\"\n    dependsOn(\"requireCrateHasher\")\n    dependsOn(\"fixManifests\")\n\n    inputs.dir(publisherToolPath)\n\n    toolPath = publisherToolPath\n    binaryName = \"publisher\"\n    arguments = mutableListOf(\n        \"generate-version-manifest\",\n        \"--input-location\",\n        sdkOutputDir.asFile.absolutePath,\n        \"--output-location\",\n        outputDir.asFile.absolutePath,\n        \"--smithy-build\",\n        layout.buildDirectory.file(\"smithy-build.json\").get().asFile.normalize().absolutePath,\n    ).apply {\n        getPreviousReleaseVersionManifestPath()?.let { manifestPath ->\n            add(\"--previous-release-versions\")\n            add(manifestPath)\n        }\n    }\n}\n\ntasks.smithyBuild.configure {\n    inputs.file(layout.buildDirectory.file(\"smithy-build.json\"))\n    inputs.dir(projectDir.resolve(\"aws-models\"))\n    dependsOn(\"generateSmithyBuild\")\n    dependsOn(\"generateCargoWorkspace\")\n    outputs.upToDateWhen { false }\n}\n\ntasks.assemble.configure {\n    dependsOn(\n        \"deleteSdk\",\n        \"jar\",\n        \"relocateServices\",\n        \"relocateRuntime\",\n        \"relocateAwsRuntime\",\n        \"relocateTests\",\n        \"generateIndexMd\",\n        \"fixManifests\",\n        \"generateVersionManifest\",\n        \"hydrateReadme\",\n        \"relocateChangelog\",\n    )\n    finalizedBy(\"copyCheckedInSdkLockfile\")\n    outputs.upToDateWhen { false }\n}\n\ntasks.register<Copy>(\"copyCheckedInSdkLockfile\") {\n    description = \"Copy the checked-in SDK lockfile to the build directory\"\n    this.outputs.upToDateWhen { false }\n    from(checkedInSdkLockfile)\n    into(outputDir)\n}\n\ntasks.register<Copy>(\"replaceCheckedInSdkLockfile\") {\n    description = \"Replace the checked-in SDK lockfile by copying the one in the build directory back to `aws/sdk`\"\n    dependsOn(\"copyCheckedInSdkLockfile\")\n    dependsOn(\"downgradeAwsSdkLockfile\")\n    this.outputs.upToDateWhen { false }\n    from(generatedSdkLockfile)\n    into(awsSdkPath)\n}\n\nproject.registerCargoCommandsTasks(outputDir.asFile)\nproject.registerGenerateCargoConfigTomlTask(outputDir.asFile)\n\n// The task name \"test\" is already registered by one of our plugins\ntasks.register(\"sdkTest\") {\n    description = \"Run Cargo clippy/test/docs against the generated SDK.\"\n    dependsOn(\"assemble\")\n    finalizedBy(Cargo.CLIPPY.toString, Cargo.TEST.toString, Cargo.DOCS.toString)\n}\n\n/**\n * Generate tasks for pinning broken dependencies to bypass compatibility issues\n *\n * Some dependencies may have compatibility issues that prevent updating to the latest versions.\n * In such cases, we pin these dependencies to the last known working versions.\n *\n * To update broken dependencies (maybe for CI/CD with the latest versions), run a task with the flag, e.g.,\n * `./gradlew -Paws.sdk.force.update.broken.dependencies aws:sdk:cargoUpdateAllLockfiles`\n */\nfun Project.registerDowngradeFor(\n    dir: File,\n    name: String,\n): TaskProvider<Exec> {\n    return tasks.register<Exec>(\"downgrade${name}Lockfile\") {\n        onlyIf {\n            properties[\"aws.sdk.force.update.broken.dependencies\"] == null\n        }\n        executable = \"sh\" // noop to avoid execCommand == null\n        doLast {\n            val crateNameToLastKnownWorkingVersions =\n                mapOf(\n                    \"minicbor\" to \"0.24.2\",\n                    \"libfuzzer-sys\" to \"0.4.7\", // TODO(https://github.com/rust-fuzz/libfuzzer/issues/126)\n                    \"crc-fast\" to \"1.9.0\", // TODO(https://github.com/smithy-lang/smithy-rs/issues/3981)\n                    \"serde_json\" to \"1.0.146\",\n                )\n\n            crateNameToLastKnownWorkingVersions.forEach { (crate, version) ->\n                // doesn't matter even if the specified crate does not exist in the lockfile\n                exec {\n                    workingDir(dir)\n                    commandLine(\"sh\", \"-c\", \"cargo update $crate --precise $version || true\")\n                }\n            }\n        }\n    }\n}\n\nval downgradeAwsConfigLockfile = registerDowngradeFor(awsConfigPath, \"AwsConfig\")\nval downgradeAwsRuntimeLockfile = registerDowngradeFor(awsRustRuntimePath, \"AwsRustRuntime\")\nval downgradeSmithyRuntimeLockfile = registerDowngradeFor(rustRuntimePath, \"RustRuntime\")\nval downgradeAwsSdkLockfile = registerDowngradeFor(outputDir.asFile, \"AwsSdk\")\n\n// Tasks for updating individual Cargo.lock files\nfun Project.registerCargoUpdateFor(\n    dir: File,\n    name: String,\n    dependsOn: List<String> = emptyList(),\n): TaskProvider<Exec> {\n    return tasks.register<Exec>(\"cargoUpdate${name}Lockfile\") {\n        dependsOn(dependsOn)\n        workingDir(dir)\n        environment(\"RUSTFLAGS\", \"--cfg aws_sdk_unstable\")\n        commandLine(\"cargo\", \"update\")\n        finalizedBy(\"downgrade${name}Lockfile\")\n    }\n}\n\nval cargoUpdateAwsConfigLockfile = registerCargoUpdateFor(awsConfigPath, \"AwsConfig\", listOf(\"assemble\"))\nval cargoUpdateAwsRuntimeLockfile = registerCargoUpdateFor(awsRustRuntimePath, \"AwsRustRuntime\")\nval cargoUpdateSmithyRuntimeLockfile = registerCargoUpdateFor(rustRuntimePath, \"RustRuntime\")\n\n/**\n * Updates the lockfile located in the `aws/sdk` directory.\n *\n * Previously, we would run `cargo generate-lockfile` in the `aws-sdk-rust` repository and then copy the resulting\n * `Cargo.lock` into the `smithy-rs` repository. This approach introduced a delay, as new dependencies added to runtime\n * crates would not be reflected in the SDK lockfile until the runtime crates were released to the `aws-sdk-rust`\n * repository.\n *\n * We now generate a lockfile directly in `aws/sdk/build/aws-sdk`, which suffices for our CI/CD purposes, as it covers\n * the crate dependencies used by the SDK:\n * - Smithy runtime crates and inlineables\n * - Smithy codegen decorators\n * - Aws runtime crates and inlineables\n * - Aws SDK codegen decorators\n * - Service customizations (as long as we have their models in `aws/sdk/aws-models`)\n */\nval cargoUpdateAwsSdkLockfile = tasks.register<Exec>(\"cargoUpdateAwsSdkLockfile\") {\n    dependsOn(\"assemble\")\n    workingDir(outputDir)\n    environment(\"RUSTFLAGS\", \"--cfg aws_sdk_unstable\")\n    commandLine(\"cargo\", \"update\")\n    finalizedBy(\n        \"downgradeAwsSdkLockfile\",\n        \"replaceCheckedInSdkLockfile\",\n    )\n}\n\ntasks.register<Exec>(\"syncAwsSdkLockfile\") {\n    description = \"\"\"\n       Synchronize the SDK lockfile to ensure that it includes all dependencies specified in runtime lockfiles.\n    \"\"\"\n    dependsOn(\"assemble\")\n    workingDir(outputDir)\n    environment(\"RUSTFLAGS\", \"--cfg aws_sdk_unstable\")\n    // Using `cargo generate-lockfile` or `cargo update` is not suitable here, as they update dependencies to their\n    // latest versions. Instead, we need to preserve the existing dependencies in the SDK lockfile while incorporating\n    // new dependencies introduced by runtime crates. This can be achieved by running `cargo check` with the lockfile\n    // copied to the `aws/sdk/build/aws-sdk` directory.\n    commandLine(\"cargo\", \"check\", \"--all-features\")\n    doLast {\n        // We avoid using `replaceCheckedInSdkLockfile` in favor of `copy` to prevent dependency on\n        // `downgradeAwsSdkLockfile`. Downgrading dependencies is unnecessary when synchronizing the SDK lockfile with\n        // runtime lockfiles.\n        copy {\n            from(generatedSdkLockfile)\n            into(awsSdkPath)\n        }\n    }\n}\n\n// Parent task to update all the Cargo.lock files\ntasks.register(\"cargoUpdateAllLockfiles\") {\n    description = \"\"\"\n        Update Cargo.lock files for aws-config, aws/rust-runtime, rust-runtime, and the workspace created by the\n        assemble task.\n    \"\"\"\n    finalizedBy(\n        cargoUpdateAwsSdkLockfile,\n        cargoUpdateAwsConfigLockfile,\n        cargoUpdateAwsRuntimeLockfile,\n        cargoUpdateSmithyRuntimeLockfile,\n    )\n}\n\ntasks.register<Delete>(\"deleteSdk\") {\n    delete(\n        fileTree(outputDir) {\n            // Delete files but keep directories so that terminals don't get messed up in local development\n            include(\"**/*.*\")\n        },\n    )\n}\ntasks[\"clean\"].dependsOn(\"deleteSdk\")\ntasks[\"clean\"].doFirst {\n    delete(layout.buildDirectory.file(\"smithy-build.json\"))\n}\n"
  },
  {
    "path": "aws/sdk/gradle.properties",
    "content": "#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\naws.services=\n"
  },
  {
    "path": "aws/sdk/integration-tests/.gitignore",
    "content": "Cargo.lock\ntarget/\nwebassembly/src/bindings.rs\n"
  },
  {
    "path": "aws/sdk/integration-tests/Cargo.toml",
    "content": "# Note: This workspace exists so that these tests can be run without having to build the entire SDK. When you run\n# `./gradlew -Paws.fullsdk=true :aws:sdk:assemble` these tests are copied into their respective Service crates.\n[workspace]\nresolver = \"2\"\nmembers = [\n    \"bedrockruntime\",\n    \"cloudwatchlogs\",\n    \"codecatalyst\",\n    \"dynamodb\",\n    \"ec2\",\n    \"glacier\",\n    \"iam\",\n    \"kms\",\n    \"lambda\",\n    \"no-default-features\",\n    \"polly\",\n    \"s3\",\n    \"s3control\",\n    \"sts\",\n    \"telemetry\",\n    \"timestreamquery\",\n    \"transcribestreaming\",\n    \"webassembly-no-os\",\n    \"webassembly-wstd\",\n]\n"
  },
  {
    "path": "aws/sdk/integration-tests/Makefile",
    "content": "all: test\n\ntest:\n\t./test.sh\n\n.PHONY: all test\n"
  },
  {
    "path": "aws/sdk/integration-tests/README.md",
    "content": "# Handwritten Integration Test Root\n\nThis folder contains handwritten integration tests that are specific to\nindividual services. In order for your test to be merged into the final artifact:\n\n- The crate name must match the generated crate name, e.g. `kms`, `dynamodb`\n- Your test must be placed into the `tests` folder. **Everything else in your test crate is ignored.**\n\nThe contents of the `test` folder will be combined with code-generated integration\ntests & inserted into the `tests` folder of the final generated service crate.\n\n## Benchmarks\n\nSome integration test roots have a `benches/` directory. In these, `cargo bench` can be\ninvoked to run the benchmarks against the current version of smithy-rs. To compare\nacross smithy-rs versions, you can `git checkout` the version to compare against,\nrun the benchmark, and then `git checkout` the other version and run it again:\n\n```bash\n# For example, this was the very first commit that had a benchmark\ngit checkout 1fd6e978ae43fb8139cc091997f0ab76ae9fdafa\n\n# Re-generate the SDK before benchmarking to make sure you have the correct code\n./gradlew :aws:sdk:assemble\n\n# The DynamoDB integration tests have benchmarks. Let's run them\ncd aws/sdk/integration-tests/dynamodb\ncargo bench\n\n# Record the results...\n\n# Now, run against the latest\ngit checkout main\n\n# Re-generate the SDK before benchmarking to make sure you have the correct code\ncd ../../../..\n./gradlew :aws:sdk:assemble\n\n# Go run the same benchmarks with the latest version\ncd aws/sdk/integration-tests/dynamodb\ncargo bench\n\n# Compare!\n```\n\n## Adding dependencies to tests\n\nWhen adding new dependencies or adding new features to old dependencies, don't forget to update the\n[`IntegrationTestDependencies` file][IntegrationTestDependencies]. Otherwise, after your tests have been copied into\ntheir respective SDK crates may fail when run due to a dependency resolution error.\n\n[IntegrationTestDependencies]: ../../codegen-aws-sdk/src/main/kotlin/software/amazon/smithy/rustsdk/IntegrationTestDependencies.kt\n"
  },
  {
    "path": "aws/sdk/integration-tests/bedrockruntime/Cargo.toml",
    "content": "# This Cargo.toml is unused in generated code. It exists solely to enable these tests to compile in-situ\n[package]\nname = \"bedrockruntime-tests\"\nversion = \"0.1.0\"\nauthors = [\"AWS Rust SDK Team <aws-sdk-rust@amazon.com>\"]\nedition = \"2021\"\nlicense = \"Apache-2.0\"\nrepository = \"https://github.com/smithy-lang/smithy-rs\"\npublish = false\n\n[dev-dependencies]\naws-sdk-bedrockruntime = { path = \"../../build/aws-sdk/sdk/bedrockruntime\", features = [\"behavior-version-latest\"] }\naws-runtime = { path = \"../../build/aws-sdk/sdk/aws-runtime\", features = [\"test-util\"] }\naws-smithy-http-client = { path = \"../../build/aws-sdk/sdk/aws-smithy-http-client\", features = [\"test-util\"] }\naws-smithy-runtime = { path = \"../../build/aws-sdk/sdk/aws-smithy-runtime\", features = [\"client\"] }\naws-smithy-runtime-api = { path = \"../../build/aws-sdk/sdk/aws-smithy-runtime-api\", features = [\"client\"] }\naws-types = { path = \"../../build/aws-sdk/sdk/aws-types\" }\ntokio = { version = \"1.23.1\", features = [\"full\", \"test-util\"]}\n"
  },
  {
    "path": "aws/sdk/integration-tests/bedrockruntime/tests/environment_token_provider.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_runtime::env_config::EnvConfigValue;\nuse aws_runtime::user_agent::test_util::{\n    assert_ua_contains_metric_values, assert_ua_does_not_contain_metric_values,\n};\nuse aws_sdk_bedrockruntime::config::{Region, Token};\nuse aws_sdk_bedrockruntime::error::DisplayErrorContext;\nuse aws_smithy_http_client::test_util::capture_request;\nuse aws_smithy_runtime::assert_str_contains;\nuse aws_smithy_runtime_api::client::auth::http::HTTP_BEARER_AUTH_SCHEME_ID;\nuse aws_types::origin::Origin;\nuse aws_types::os_shim_internal::Env;\nuse aws_types::service_config::{LoadServiceConfig, ServiceConfigKey};\nuse aws_types::SdkConfig;\n\n#[derive(Debug)]\nstruct TestEnv {\n    env: Env,\n}\n\nimpl LoadServiceConfig for TestEnv {\n    fn load_config(&self, key: ServiceConfigKey<'_>) -> Option<String> {\n        let (value, _source) = EnvConfigValue::new()\n            .env(key.env())\n            .profile(key.profile())\n            .service_id(key.service_id())\n            .load(&self.env, None)?;\n\n        Some(value.to_string())\n    }\n}\n\n#[tokio::test]\nasync fn test_valid_service_specific_token_configured() {\n    let (http_client, captured_request) = capture_request(None);\n    let expected_token = \"bedrock-token\";\n    let shared_config = SdkConfig::builder()\n        .region(Region::new(\"us-west-2\"))\n        .http_client(http_client)\n        .service_config(TestEnv {\n            env: Env::from_slice(&[(\"AWS_BEARER_TOKEN_BEDROCK\", expected_token)]),\n        })\n        .build();\n    let client = aws_sdk_bedrockruntime::Client::new(&shared_config);\n    let _ = client\n        .get_async_invoke()\n        .invocation_arn(\"arn:aws:bedrock:us-west-2:123456789012:invoke/ExampleModel\")\n        .send()\n        .await;\n    let request = captured_request.expect_request();\n    let authorization_header = request.headers().get(\"authorization\").unwrap();\n    assert!(authorization_header.starts_with(&format!(\"Bearer {expected_token}\")));\n\n    // Verify that the user agent contains the expected metric value (BEARER_SERVICE_ENV_VARS: 3)\n    let user_agent = request.headers().get(\"x-amz-user-agent\").unwrap();\n    assert_ua_contains_metric_values(user_agent, &[\"3\"]);\n}\n\n#[tokio::test]\nasync fn test_token_configured_for_different_service() {\n    let (http_client, _) = capture_request(None);\n    let shared_config = SdkConfig::builder()\n        .region(Region::new(\"us-west-2\"))\n        .http_client(http_client)\n        .service_config(TestEnv {\n            env: Env::from_slice(&[(\"AWS_BEARER_TOKEN_FOO\", \"foo-token\")]),\n        })\n        .build();\n    let client = aws_sdk_bedrockruntime::Client::new(&shared_config);\n    let err = client\n        .get_async_invoke()\n        .invocation_arn(\"arn:aws:bedrock:us-west-2:123456789012:invoke/ExampleModel\")\n        .send()\n        .await\n        .unwrap_err();\n    assert_str_contains!(\n        format!(\"{}\", DisplayErrorContext(err)),\n        \"failed to select an auth scheme to sign the request with.\"\n    );\n}\n\n#[tokio::test]\nasync fn test_token_configured_with_auth_scheme_preference_also_set_in_env() {\n    let (http_client, captured_request) = capture_request(None);\n    let expected_token = \"bedrock-token\";\n    let mut shared_config = SdkConfig::builder()\n        .region(Region::new(\"us-west-2\"))\n        .http_client(http_client)\n        .service_config(TestEnv {\n            env: Env::from_slice(&[(\"AWS_BEARER_TOKEN_BEDROCK\", expected_token)]),\n        })\n        .auth_scheme_preference([\n            aws_runtime::auth::sigv4::SCHEME_ID,\n            HTTP_BEARER_AUTH_SCHEME_ID,\n        ]);\n    // Pretend as if the auth scheme preference were set through the environment variable\n    shared_config.insert_origin(\n        \"auth_scheme_preference\",\n        Origin::shared_environment_variable(),\n    );\n    let shared_config = shared_config.build();\n    let client = aws_sdk_bedrockruntime::Client::new(&shared_config);\n    let _ = client\n        .get_async_invoke()\n        .invocation_arn(\"arn:aws:bedrock:us-west-2:123456789012:invoke/ExampleModel\")\n        .send()\n        .await;\n    let request = captured_request.expect_request();\n    let authorization_header = request.headers().get(\"authorization\").unwrap();\n    assert!(authorization_header.starts_with(&format!(\"Bearer {expected_token}\")));\n\n    // Verify that the user agent contains the expected metric value (BEARER_SERVICE_ENV_VARS: 3)\n    let user_agent = request.headers().get(\"x-amz-user-agent\").unwrap();\n    assert_ua_contains_metric_values(user_agent, &[\"3\"]);\n}\n\n#[tokio::test]\nasync fn test_explicit_service_config_takes_precedence() {\n    let (http_client, captured_request) = capture_request(None);\n    let shared_config = SdkConfig::builder()\n        .region(Region::new(\"us-west-2\"))\n        .http_client(http_client)\n        .service_config(TestEnv {\n            env: Env::from_slice(&[(\"AWS_BEARER_TOKEN_BEDROCK\", \"bedrock-token\")]),\n        })\n        .build();\n    let expected_token = \"explicit-code-token\";\n    let conf = aws_sdk_bedrockruntime::config::Builder::from(&shared_config)\n        .token_provider(Token::new(expected_token, None))\n        .build();\n    let client = aws_sdk_bedrockruntime::Client::from_conf(conf);\n    let _ = client\n        .get_async_invoke()\n        .invocation_arn(\"arn:aws:bedrock:us-west-2:123456789012:invoke/ExampleModel\")\n        .send()\n        .await;\n    let request = captured_request.expect_request();\n    let authorization_header = request.headers().get(\"authorization\").unwrap();\n    assert!(authorization_header.starts_with(&format!(\"Bearer {expected_token}\")));\n\n    // Verify that the user agent does NOT contain the expected metric value (BEARER_SERVICE_ENV_VARS: 3)\n    // since the token explicitly set in code was used.\n    let user_agent = request.headers().get(\"x-amz-user-agent\").unwrap();\n    assert_ua_does_not_contain_metric_values(user_agent, &[\"3\"]);\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/cloudwatchlogs/Cargo.toml",
    "content": "# This Cargo.toml is unused in generated code. It exists solely to enable these tests to compile in-situ\n[package]\nname = \"cloudwatchlogs-tests\"\nversion = \"0.1.0\"\nauthors = [\"AWS Rust SDK Team <aws-sdk-rust@amazon.com>\"]\nedition = \"2021\"\nlicense = \"Apache-2.0\"\nrepository = \"https://github.com/smithy-lang/smithy-rs\"\npublish = false\n\n# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html\n\n[dev-dependencies]\naws-credential-types = { path = \"../../build/aws-sdk/sdk/aws-credential-types\", features = [\"test-util\"] }\naws-runtime = { path = \"../../build/aws-sdk/sdk/aws-runtime\" }\naws-sdk-cloudwatchlogs = { path = \"../../build/aws-sdk/sdk/cloudwatchlogs\", features = [\"test-util\", \"behavior-version-latest\"] }\naws-smithy-async = { path = \"../../build/aws-sdk/sdk/aws-smithy-async\", features = [\"test-util\"] }\naws-smithy-eventstream = { path = \"../../build/aws-sdk/sdk/aws-smithy-eventstream\", features = [\"test-util\"] }\naws-smithy-http = { path = \"../../build/aws-sdk/sdk/aws-smithy-http\" }\naws-smithy-types = { path = \"../../build/aws-sdk/sdk/aws-smithy-types\" }\naws-smithy-runtime = { path = \"../../build/aws-sdk/sdk/aws-smithy-runtime\", features = [\"client\", \"test-util\"] }\naws-smithy-runtime-api = { path = \"../../build/aws-sdk/sdk/aws-smithy-runtime-api\", features = [\"test-util\"] }\nbytes = \"1.0.0\"\nhttp = \"0.2.0\"\ntokio = { version = \"1.23.1\", features = [\"full\", \"test-util\"] }\ntracing-subscriber = { version = \"0.3.15\", features = [\"env-filter\"] }\n"
  },
  {
    "path": "aws/sdk/integration-tests/cloudwatchlogs/tests/event_stream.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_credential_types::Credentials;\nuse aws_sdk_cloudwatchlogs::{\n    config::Region, operation::start_live_tail::StartLiveTailOutput,\n    types::LiveTailSessionMetadata, Client, Config,\n};\nuse aws_smithy_eventstream::test_util::validate_body;\nuse aws_smithy_runtime::client::http::test_util::dvr::ReplayingClient;\n\n#[ignore] // TODO(re-enable this after success.json has been updated)\n#[tokio::test]\nasync fn operation_with_rpc_bound_protocol() {\n    let (replayer, mut output) = start_request(\"us-west-2\", \"tests/success.json\").await;\n\n    let mut session_metadata: Option<LiveTailSessionMetadata> = None;\n\n    while let Some(event) = output.response_stream.recv().await.unwrap() {\n        match event {\n            aws_sdk_cloudwatchlogs::types::StartLiveTailResponseStream::SessionStart(_) => {\n                // `SessionStart` event has been removed from `success.json` for security reason\n            }\n            aws_sdk_cloudwatchlogs::types::StartLiveTailResponseStream::SessionUpdate(\n                live_tail_session_update,\n            ) => {\n                session_metadata = live_tail_session_update.session_metadata;\n            }\n            otherwise => panic!(\"received unexpected event type: {:?}\", otherwise),\n        }\n    }\n\n    replayer\n        .validate(&[\"content-type\", \"content-length\"], validate_success_body)\n        .await\n        .unwrap();\n\n    assert_eq!(\n        Some(LiveTailSessionMetadata::builder().sampled(false).build()),\n        session_metadata\n    );\n}\n\nasync fn start_request(\n    region: &'static str,\n    events_json: &str,\n) -> (ReplayingClient, StartLiveTailOutput) {\n    let replayer = ReplayingClient::from_file(events_json).unwrap();\n\n    let config = Config::builder()\n        .region(Region::from_static(region))\n        .http_client(replayer.clone())\n        .with_test_defaults()\n        .credentials_provider(Credentials::for_tests())\n        .build();\n    let client = Client::from_conf(config);\n\n    let output = client\n        .start_live_tail()\n        .set_log_group_identifiers(Some(vec![format!(\"arn:aws:logs:{region}:123456789123:log-group:/aws/codebuild/CodeBuildS3PublisherProject-aBCdEfGHIjkO\")]))\n        .send()\n        .await\n        .unwrap();\n\n    (replayer, output)\n}\n\nfn validate_success_body(\n    expected_body: &[u8],\n    actual_body: &[u8],\n) -> Result<(), Box<dyn std::error::Error>> {\n    validate_body(expected_body, actual_body, true)\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/cloudwatchlogs/tests/success.json",
    "content": "{\n  \"events\": [\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Request\": {\n          \"request\": {\n            \"uri\": \"https://streaming-logs.us-west-2.amazonaws.com/\",\n            \"headers\": {\n              \"content-type\": [\n                \"application/x-amz-json-1.1\"\n              ],\n              \"x-amz-target\": [\n                \"Logs_20140328.StartLiveTail\"\n              ],\n              \"content-length\": [\n                \"129\"\n              ],\n              \"user-agent\": [\n                \"aws-sdk-rust/0.123.test os/windows/XPSP3 lang/rust/1.50.0\"\n              ],\n              \"x-amz-user-agent\": [\n                \"aws-sdk-rust/0.123.test ua/0.1 api/test-service/0.123 os/windows/XPSP3 lang/rust/1.50.0 m/E md/http#replaying-client\"\n              ],\n              \"x-amz-date\": [\n                \"20090213T233130Z\"\n              ],\n              \"authorization\": [\n                \"AWS4-HMAC-SHA256 Credential=ANOTREAL/20090213/us-west-2/logs/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-date;x-amz-target;x-amz-user-agent, Signature=6c7b4139449c4c6ae6391f46eb572f1070bcce6adedfecb51e2ed70f04714a81\"\n              ],\n              \"amz-sdk-request\": [\n                \"attempt=1; max=1\"\n              ]\n            },\n            \"method\": \"POST\"\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"{\\\"logGroupIdentifiers\\\":[\\\"arn:aws:logs:us-west-2:123456789123:log-group:/aws/codebuild/CodeBuildS3PublisherProject-aBCdEfGHIjkO\\\"]}\"\n          },\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Response\": {\n          \"response\": {\n            \"Ok\": {\n              \"status\": 200,\n              \"headers\": {\n                \"x-amzn-requestid\": [\n                  \"629c2b67-0741-48ba-9e8d-4cd9cca8cbc5\"\n                ],\n                \"date\": [\n                  \"Fri, 07 Feb 2025 22:41:14 GMT\"\n                ],\n                \"content-type\": [\n                  \"application/vnd.amazon.eventstream\"\n                ]\n              }\n            }\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Base64\": \"AAAAcgAAAGCrgg2eCzpldmVudC10eXBlBwAQaW5pdGlhbC1yZXNwb25zZQ06Y29udGVudC10eXBlBwAaYXBwbGljYXRpb24veC1hbXotanNvbi0xLjENOm1lc3NhZ2UtdHlwZQcABWV2ZW50e32srmt9\"\n          },\n          \"direction\": \"Response\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Base64\": \"AAAApgAAAF2Pn5gWCzpldmVudC10eXBlBwANc2Vzc2lvblVwZGF0ZQ06Y29udGVudC10eXBlBwAaYXBwbGljYXRpb24veC1hbXotanNvbi0xLjENOm1lc3NhZ2UtdHlwZQcABWV2ZW50eyJzZXNzaW9uTWV0YWRhdGEiOnsic2FtcGxlZCI6ZmFsc2V9LCJzZXNzaW9uUmVzdWx0cyI6W119dg+Kdw==\"\n          },\n          \"direction\": \"Response\"\n        }\n      }\n    }\n  ],\n  \"docs\": \"traffic recording of the StartLiveTail API to verify an event stream operation, removing message for SessionStart event for security reason\",\n  \"version\": \"V0\"\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/codecatalyst/Cargo.toml",
    "content": "# This Cargo.toml is unused in generated code. It exists solely to enable these tests to compile in-situ\n[package]\nname = \"codecatalyst-tests\"\nversion = \"0.1.0\"\nauthors = [\"AWS Rust SDK Team <aws-sdk-rust@amazon.com>\"]\nedition = \"2021\"\nlicense = \"Apache-2.0\"\nrepository = \"https://github.com/smithy-lang/smithy-rs\"\npublish = false\n\n# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html\n\n[dependencies]\naws-sdk-codecatalyst = { path = \"../../build/aws-sdk/sdk/codecatalyst\", features = [\"behavior-version-latest\", \"test-util\"] }\naws-smithy-runtime = { path = \"../../build/aws-sdk/sdk/aws-smithy-runtime\", features = [\"client\"] }\naws-smithy-http-client = { path = \"../../build/aws-sdk/sdk/aws-smithy-http-client\", features = [\"wire-mock\", \"test-util\"] }\ntokio = { version = \"1.23.1\", features = [\"full\", \"test-util\"] }\ntracing-subscriber = { version = \"0.3.17\", features = [\"env-filter\"] }\n"
  },
  {
    "path": "aws/sdk/integration-tests/codecatalyst/tests/sso_bearer_auth.json",
    "content": "{\n    \"events\": [\n        {\n            \"connection_id\": 0,\n            \"action\": {\n                \"Request\": {\n                    \"request\": {\n                        \"uri\": \"https://codecatalyst.global.api.aws/v1/spaces\",\n                        \"headers\": {\n                            \"x-amz-user-agent\": [\n                                \"aws-sdk-rust/0.123.test api/test-service/0.123 os/windows/XPSP3 lang/rust/1.50.0\"\n                            ],\n                            \"authorization\": [\n                                \"Bearer sso_bearer_auth_test\"\n                            ],\n                            \"content-length\": [\n                                \"2\"\n                            ],\n                            \"user-agent\": [\n                                \"aws-sdk-rust/0.123.test os/windows/XPSP3 lang/rust/1.50.0\"\n                            ],\n                            \"content-type\": [\n                                \"application/json\"\n                            ],\n                            \"amz-sdk-request\": [\n                                \"attempt=1; max=1\"\n                            ]\n                        },\n                        \"method\": \"POST\"\n                    }\n                }\n            }\n        },\n        {\n            \"connection_id\": 0,\n            \"action\": {\n                \"Data\": {\n                    \"data\": {\n                        \"Utf8\": \"{}\"\n                    },\n                    \"direction\": \"Request\"\n                }\n            }\n        },\n        {\n            \"connection_id\": 0,\n            \"action\": {\n                \"Eof\": {\n                    \"ok\": true,\n                    \"direction\": \"Request\"\n                }\n            }\n        },\n        {\n            \"connection_id\": 0,\n            \"action\": {\n                \"Response\": {\n                    \"response\": {\n                        \"Ok\": {\n                            \"status\": 200,\n                            \"headers\": {\n                                \"x-amzn-served-from\": [\n                                    \"us-west-2,us-west-2\"\n                                ],\n                                \"access-control-allow-credentials\": [\n                                    \"true\"\n                                ],\n                                \"content-type\": [\n                                    \"application/json; charset=utf-8\"\n                                ],\n                                \"strict-transport-security\": [\n                                    \"max-age=63072000; includeSubDomains\"\n                                ],\n                                \"access-control-expose-headers\": [\n                                    \"anti-csrftoken-a2z,x-amzn-requestid\"\n                                ],\n                                \"date\": [\n                                    \"Tue, 27 Feb 2024 00:12:28 GMT\"\n                                ],\n                                \"vary\": [\n                                    \"Origin\"\n                                ],\n                                \"x-amzn-requestid\": [\n                                    \"some-request-id\"\n                                ]\n                            }\n                        }\n                    }\n                }\n            }\n        },\n        {\n            \"connection_id\": 0,\n            \"action\": {\n                \"Data\": {\n                    \"data\": {\n                        \"Utf8\": \"{\\\"nextToken\\\":\\\"\\\",\\\"items\\\":[{\\\"name\\\":\\\"somespacename\\\",\\\"regionName\\\":\\\"us-west-2\\\",\\\"displayName\\\":\\\"somedisplayname\\\"}]}\"\n                    },\n                    \"direction\": \"Response\"\n                }\n            }\n        },\n        {\n            \"connection_id\": 0,\n            \"action\": {\n                \"Data\": {\n                    \"data\": {\n                        \"Utf8\": \"\"\n                    },\n                    \"direction\": \"Response\"\n                }\n            }\n        },\n        {\n            \"connection_id\": 0,\n            \"action\": {\n                \"Eof\": {\n                    \"ok\": true,\n                    \"direction\": \"Response\"\n                }\n            }\n        }\n    ],\n    \"docs\": \"traffic for codecatalyst sso_bearer_auth integration test\",\n    \"version\": \"V0\"\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/codecatalyst/tests/sso_bearer_auth.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_sdk_codecatalyst::config::retry::RetryConfig;\nuse aws_sdk_codecatalyst::config::Token;\n\n#[tokio::test]\nasync fn sso_bearer_auth() {\n    let replay = aws_smithy_http_client::test_util::dvr::ReplayingClient::from_file(\n        \"tests/sso_bearer_auth.json\",\n    )\n    .unwrap();\n\n    let config = aws_sdk_codecatalyst::Config::builder()\n        .with_test_defaults()\n        .http_client(replay.clone())\n        .token_provider(Token::new(\"sso_bearer_auth_test\", None))\n        .retry_config(RetryConfig::disabled())\n        .build();\n    let client = aws_sdk_codecatalyst::Client::from_conf(config);\n\n    let response = client\n        .list_spaces()\n        .send()\n        .await\n        .expect(\"successful response\");\n    let item = &response.items.unwrap()[0];\n    assert_eq!(\"somespacename\", item.name);\n\n    replay.relaxed_validate(\"application/json\").await.unwrap();\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/dynamodb/Cargo.toml",
    "content": "# This Cargo.toml is unused in generated code. It exists solely to enable these tests to compile in-situ\n[package]\nname = \"dynamo-tests\"\nversion = \"0.1.0\"\nauthors = [\"AWS Rust SDK Team <aws-sdk-rust@amazon.com>\", \"Russell Cohen <rcoh@amazon.com>\"]\nedition = \"2021\"\nlicense = \"Apache-2.0\"\nrepository = \"https://github.com/smithy-lang/smithy-rs\"\npublish = false\n\n# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html\n\n[dependencies]\napprox = \"0.5.1\"\naws-config = { path = \"../../build/aws-sdk/sdk/aws-config\" }\naws-runtime = { path = \"../../build/aws-sdk/sdk/aws-runtime\", features = [\"test-util\"] }\naws-credential-types = { path = \"../../build/aws-sdk/sdk/aws-credential-types\", features = [\"test-util\"] }\naws-sdk-dynamodb = { path = \"../../build/aws-sdk/sdk/dynamodb\", features = [\"behavior-version-latest\"] }\naws-smithy-async = { path = \"../../build/aws-sdk/sdk/aws-smithy-async\", features = [\"test-util\"] }\naws-smithy-http = { path = \"../../build/aws-sdk/sdk/aws-smithy-http\" }\naws-smithy-protocol-test = { path = \"../../build/aws-sdk/sdk/aws-smithy-protocol-test\" }\naws-smithy-runtime = { path = \"../../build/aws-sdk/sdk/aws-smithy-runtime\", features = [\"client\", \"test-util\"] }\naws-smithy-http-client = { path = \"../../build/aws-sdk/sdk/aws-smithy-http-client\", features = [\"test-util\", \"wire-mock\"] }\naws-smithy-runtime-api = { path = \"../../build/aws-sdk/sdk/aws-smithy-runtime-api\", features = [\"test-util\"]}\naws-smithy-types = { path = \"../../build/aws-sdk/sdk/aws-smithy-types\", features = [\"test-util\"]}\naws-types = { path = \"../../build/aws-sdk/sdk/aws-types\" }\nbytes = \"1.0.0\"\nfutures-util = { version = \"0.3.29\", default-features = false }\nhttp-1x = { package = \"http\", version = \"1\" }\nserde_json = \"1.0.0\"\ntokio = { version = \"1.23.1\", features = [\"full\", \"test-util\"] }\ntokio-stream = \"0.1.5\"\ntracing-subscriber = { version = \"0.3.17\", features = [\"env-filter\"] }\n\ncriterion = \"0.5\"\n\n[[bench]]\nname = \"deserialization_bench\"\nharness = false\n\n[[bench]]\nname = \"serialization_bench\"\nharness = false\n"
  },
  {
    "path": "aws/sdk/integration-tests/dynamodb/benches/deserialization_bench.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_sdk_dynamodb::operation::query::QueryOutput;\nuse aws_smithy_runtime_api::client::orchestrator::HttpResponse;\nuse aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugin;\nuse aws_smithy_runtime_api::client::ser_de::{DeserializeResponse, SharedResponseDeserializer};\nuse aws_smithy_types::body::SdkBody;\nuse criterion::{criterion_group, criterion_main, Criterion};\n\nfn do_bench() {\n    use aws_sdk_dynamodb::operation::query::Query;\n    use bytes::Bytes;\n\n    let response = HttpResponse::try_from(http_1x::Response::builder()\n        .header(\"server\", \"Server\")\n        .header(\"date\", \"Mon, 08 Mar 2021 15:51:23 GMT\")\n        .header(\"content-type\", \"application/x-amz-json-1.0\")\n        .header(\"content-length\", \"1231\")\n        .header(\"connection\", \"keep-alive\")\n        .header(\"x-amzn-requestid\", \"A5FGSJ9ET4OKB8183S9M47RQQBVV4KQNSO5AEMVJF66Q9ASUAAJG\")\n        .header(\"x-amz-crc32\", \"624725176\")\n        .status(http_1x::StatusCode::from_u16(200).unwrap())\n        .body(SdkBody::from(Bytes::copy_from_slice(br#\"{\"Count\":2,\"Items\":[{\"year\":{\"N\":\"2013\"},\"info\":{\"M\":{\"actors\":{\"L\":[{\"S\":\"Daniel Bruhl\"},{\"S\":\"Chris Hemsworth\"},{\"S\":\"Olivia Wilde\"}]},\"plot\":{\"S\":\"A re-creation of the merciless 1970s rivalry between Formula One rivals James Hunt and Niki Lauda.\"},\"release_date\":{\"S\":\"2013-09-02T00:00:00Z\"},\"image_url\":{\"S\":\"http://ia.media-imdb.com/images/M/MV5BMTQyMDE0MTY0OV5BMl5BanBnXkFtZTcwMjI2OTI0OQ@@._V1_SX400_.jpg\"},\"genres\":{\"L\":[{\"S\":\"Action\"},{\"S\":\"Biography\"},{\"S\":\"Drama\"},{\"S\":\"Sport\"}]},\"directors\":{\"L\":[{\"S\":\"Ron Howard\"}]},\"rating\":{\"N\":\"8.3\"},\"rank\":{\"N\":\"2\"},\"running_time_secs\":{\"N\":\"7380\"}}},\"title\":{\"S\":\"Rush\"}},{\"year\":{\"N\":\"2013\"},\"info\":{\"M\":{\"actors\":{\"L\":[{\"S\":\"David Matthewman\"},{\"S\":\"Ann Thomas\"},{\"S\":\"Jonathan G. Neff\"}]},\"release_date\":{\"S\":\"2013-01-18T00:00:00Z\"},\"plot\":{\"S\":\"A rock band plays their music at high volumes, annoying the neighbors.\"},\"genres\":{\"L\":[{\"S\":\"Comedy\"},{\"S\":\"Drama\"}]},\"image_url\":{\"S\":\"http://ia.media-imdb.com/images/N/O9ERWAU7FS797AJ7LU8HN09AMUP908RLlo5JF90EWR7LJKQ7@@._V1_SX400_.jpg\"},\"directors\":{\"L\":[{\"S\":\"Alice Smith\"},{\"S\":\"Bob Jones\"}]},\"rating\":{\"N\":\"6.2\"},\"rank\":{\"N\":\"11\"},\"running_time_secs\":{\"N\":\"5215\"}}},\"title\":{\"S\":\"Turn It Down, Or Else!\"}}],\"ScannedCount\":2}\"#)))\n        .unwrap()).unwrap();\n\n    let operation = Query::new();\n    let config = operation.config().expect(\"operation should have config\");\n    let deserializer = config\n        .load::<SharedResponseDeserializer>()\n        .expect(\"operation should set a deserializer\");\n\n    let output = deserializer\n        .deserialize_nonstreaming(&response)\n        .expect(\"success\");\n    let output = output.downcast::<QueryOutput>().expect(\"correct type\");\n    assert_eq!(2, output.count);\n}\n\nfn bench_group(c: &mut Criterion) {\n    c.bench_function(\"deserialization_bench\", |b| b.iter(do_bench));\n}\n\ncriterion_group!(benches, bench_group);\ncriterion_main!(benches);\n"
  },
  {
    "path": "aws/sdk/integration-tests/dynamodb/benches/serialization_bench.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_sdk_dynamodb::operation::put_item::{PutItem, PutItemInput};\nuse aws_sdk_dynamodb::types::AttributeValue;\nuse aws_smithy_runtime_api::client::interceptors::context::Input;\nuse aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugin;\nuse aws_smithy_runtime_api::client::ser_de::{SerializeRequest, SharedRequestSerializer};\nuse aws_smithy_types::config_bag::ConfigBag;\nuse criterion::{criterion_group, criterion_main, Criterion};\n\nmacro_rules! attr_s {\n    ($str_val:expr) => {\n        AttributeValue::S($str_val.into())\n    };\n}\nmacro_rules! attr_n {\n    ($str_val:expr) => {\n        AttributeValue::N($str_val.into())\n    };\n}\nmacro_rules! attr_list {\n    ( $($attr_val:expr),* ) => {\n        AttributeValue::L(vec![$($attr_val),*])\n    }\n}\nmacro_rules! attr_obj {\n    { $($str_val:expr => $attr_val:expr),* } => {\n        AttributeValue::M(\n            vec![\n                $(($str_val.to_string(), $attr_val)),*\n            ].into_iter().collect()\n        )\n    };\n}\n\nfn do_bench(input: &PutItemInput) {\n    let operation = PutItem::new();\n    let config = operation.config().expect(\"operation should have config\");\n    let serializer = config\n        .load::<SharedRequestSerializer>()\n        .expect(\"operation should set a serializer\");\n    let mut config_bag = ConfigBag::base();\n    let input = Input::erase(input.clone());\n\n    let request = serializer\n        .serialize_input(input, &mut config_bag)\n        .expect(\"success\");\n    let body = request.body().bytes().unwrap();\n    assert_eq!(body[0], b'{');\n}\n\nfn bench_group(c: &mut Criterion) {\n    c.bench_function(\"serialization_bench\", |b| {\n        let input = PutItemInput::builder()\n            .table_name(\"Movies-5\")\n            .set_item(Some(\n                attr_obj! {\n                \"year\" => attr_n!(\"2013\"),\n                \"title\" => attr_s!(\"Turn It Down, Or Else!\"),\n                \"info\" => attr_obj! {\n                    \"directors\" => attr_list![attr_s!(\"Alice Smith\"), attr_s!(\"Bob Jones\")],\n                    \"release_date\" => attr_s!(\"2013-01-18T00:00:00Z\"),\n                    \"rating\" => attr_n!(\"6.2\"),\n                    \"genres\" => attr_list!(attr_s!(\"Comedy\"), attr_s!(\"Drama\")),\n                    \"image_url\" => attr_s!(\"http://ia.media-imdb.com/images/N/O9ERWAU7FS797AJ7LU8HN09AMUP908RLlo5JF90EWR7LJKQ7@@._V1_SX400_.jpg\"),\n                    \"plot\" => attr_s!(\"A rock band plays their music at high volumes, annoying the neighbors.\"),\n                    \"rank\" => attr_n!(\"11\"),\n                    \"running_time_secs\" => attr_n!(\"5215\"),\n                    \"actors\" => attr_list!(attr_s!(\"David Matthewman\"), attr_s!(\"Ann Thomas\"), attr_s!(\"Jonathan G. Neff\"))\n                }\n            }.as_m().unwrap().clone(),\n            ))\n            .build()\n            .expect(\"valid input\");\n        b.iter(|| do_bench(&input))\n    });\n}\n\ncriterion_group!(benches, bench_group);\ncriterion_main!(benches);\n"
  },
  {
    "path": "aws/sdk/integration-tests/dynamodb/tests/account-based-endpoints.rs",
    "content": "/*\n* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n* SPDX-License-Identifier: Apache-2.0\n*/\n\nuse aws_config::Region;\nuse aws_credential_types::Credentials;\nuse aws_runtime::user_agent::test_util::assert_ua_contains_metric_values;\nuse aws_sdk_dynamodb::{\n    config::Builder,\n    error::{DisplayErrorContext, SdkError},\n    operation::batch_get_item::{BatchGetItemError, BatchGetItemOutput},\n    types::{AttributeValue, KeysAndAttributes},\n    Client, Config,\n};\nuse aws_smithy_http_client::test_util::{capture_request, CaptureRequestReceiver};\nuse aws_smithy_runtime::assert_str_contains;\nuse aws_smithy_runtime_api::http::Response;\nuse aws_types::endpoint_config::AccountIdEndpointMode;\n\nfn test_client(update_builder: fn(Builder) -> Builder) -> (Client, CaptureRequestReceiver) {\n    let (http_client, request) = capture_request(None);\n    let builder = Config::builder()\n        .region(Region::new(\"us-east-1\"))\n        .credentials_provider(\n            Credentials::builder()\n                .account_id(\"123456789012\")\n                .access_key_id(\"ANOTREAL\")\n                .secret_access_key(\"notrealrnrELgWzOk3IfjzDKtFBhDby\")\n                .provider_name(\"test\")\n                .build(),\n        )\n        .http_client(http_client);\n    (Client::from_conf(update_builder(builder).build()), request)\n}\n\nasync fn call_operation(\n    client: Client,\n    table_name: &str,\n) -> Result<BatchGetItemOutput, SdkError<BatchGetItemError, Response>> {\n    let mut attr_v = std::collections::HashMap::new();\n    attr_v.insert(\":s\".to_string(), AttributeValue::S(\"value\".into()));\n    let mut kv = std::collections::HashMap::new();\n    kv.insert(\":pk\".to_string(), AttributeValue::M(attr_v));\n    client\n        .batch_get_item()\n        .request_items(\n            table_name,\n            KeysAndAttributes::builder().keys(kv).build().unwrap(),\n        )\n        .send()\n        .await\n}\n\n#[tokio::test]\nasync fn basic_positive_cases() {\n    let test_cases: &[(fn(Builder) -> Builder, &str, &str, &[&'static str])] = &[\n        (\n            std::convert::identity,\n            \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\",\n            \"https://333333333333.ddb.us-east-1.amazonaws.com/\",\n            &[\"P\", \"T\"],\n        ),\n        (\n            std::convert::identity,\n            \"table_name\", // doesn't specify ARN for the table name\n            \"https://123456789012.ddb.us-east-1.amazonaws.com/\", // the account ID should come from credentials\n            &[\"P\", \"T\"],\n        ),\n        (\n            |b: Builder| b.credentials_provider(Credentials::for_tests()), // credentials do not provide an account ID\n            \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\",\n            \"https://333333333333.ddb.us-east-1.amazonaws.com/\",\n            &[\"P\"],\n        ),\n        (\n            |b: Builder| b.account_id_endpoint_mode(AccountIdEndpointMode::Preferred), // sets the default mode `Preferred` explicitly\n            \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\",\n            \"https://333333333333.ddb.us-east-1.amazonaws.com/\",\n            &[\"P\", \"T\"],\n        ),\n        (\n            |b: Builder| b.account_id_endpoint_mode(AccountIdEndpointMode::Disabled),\n            \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\",\n            \"https://dynamodb.us-east-1.amazonaws.com/\",\n            &[\"Q\", \"T\"],\n        ),\n        (\n            |b: Builder| b.account_id_endpoint_mode(AccountIdEndpointMode::Required),\n            \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\",\n            \"https://333333333333.ddb.us-east-1.amazonaws.com/\",\n            &[\"R\", \"T\"],\n        ),\n    ];\n\n    for (i, (update_builder, table_name, expected_uri, expected_metrics)) in\n        test_cases.into_iter().enumerate()\n    {\n        let (client, rx) = test_client(*update_builder);\n        let _ = call_operation(client, table_name).await;\n        let req = rx.expect_request();\n        assert_eq!(\n            *expected_uri,\n            req.uri(),\n            \"on the {i}th test case where table name is `{table_name}`\"\n        );\n\n        // Test User-Agent metrics for account ID tracking\n        let user_agent = req.headers().get(\"x-amz-user-agent\").unwrap();\n        assert_ua_contains_metric_values(user_agent, expected_metrics);\n    }\n}\n\n#[tokio::test]\nasync fn error_should_be_raised_when_account_id_is_expected_but_not_resolved() {\n    let (client, _) = test_client(|b| {\n        b.account_id_endpoint_mode(AccountIdEndpointMode::Required)\n            .credentials_provider(Credentials::for_tests())\n    });\n    // doesn't specify ARN for the table name\n    let err = call_operation(client, \"table_name\")\n        .await\n        .err()\n        .expect(\"request should fail\");\n\n    assert_str_contains!(\n        format!(\"{}\", DisplayErrorContext(err)),\n        \"AccountIdEndpointMode is required but no AccountID was provided or able to be loaded\"\n    );\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/dynamodb/tests/auth_scheme_error.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_sdk_dynamodb::config::Region;\nuse aws_sdk_dynamodb::error::DisplayErrorContext;\nuse aws_sdk_dynamodb::{Client, Config};\nuse aws_smithy_http_client::test_util::capture_request;\nuse aws_smithy_runtime::assert_str_contains;\n\n#[tokio::test]\nasync fn auth_scheme_error() {\n    let (http_client, _) = capture_request(None);\n    let config = Config::builder()\n        .behavior_version_latest()\n        .http_client(http_client)\n        .region(Region::new(\"us-west-2\"))\n        // intentionally omitting credentials_provider\n        .build();\n    let client = Client::from_conf(config);\n\n    let err = client\n        .list_tables()\n        .send()\n        .await\n        .expect_err(\"there is no credential provider, so this must fail\");\n    assert_str_contains!(\n        DisplayErrorContext(&err).to_string(),\n        \"\\\"sigv4\\\" wasn't a valid option because there was no identity resolver for it. Be sure to set an identity\"\n    );\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/dynamodb/tests/build-errors.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_sdk_dynamodb::error::SdkError;\nuse aws_sdk_dynamodb::operation::create_table::CreateTableError;\nuse aws_sdk_dynamodb::types::{KeySchemaElement, KeyType};\nuse aws_sdk_dynamodb::Client;\n\n#[allow(dead_code)]\nasync fn create_table_test(client: &Client) -> Result<(), SdkError<CreateTableError>> {\n    let _just_checking_compilation = client\n        .create_table()\n        .table_name(\"test\")\n        .key_schema(\n            KeySchemaElement::builder()\n                .attribute_name(\"year\")\n                .key_type(KeyType::Hash)\n                .build()?,\n        )\n        .send()\n        .await;\n    Ok(())\n}\n\n#[allow(dead_code)]\nasync fn create_table_test_super_error(client: &Client) -> Result<(), aws_sdk_dynamodb::Error> {\n    let _just_checking_compilation = client\n        .create_table()\n        .table_name(\"test\")\n        .key_schema(\n            KeySchemaElement::builder()\n                .attribute_name(\"year\")\n                .key_type(KeyType::Hash)\n                .build()?,\n        )\n        .send()\n        .await;\n    Ok(())\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/dynamodb/tests/cloning.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_credential_types::{provider::SharedCredentialsProvider, Credentials};\nuse aws_types::region::Region;\n\n// compiling this function validates that fluent builders are cloneable\n#[allow(dead_code)]\nasync fn ensure_builders_clone() {\n    let shared_config = aws_types::SdkConfig::builder()\n        .region(Region::new(\"us-east-4\"))\n        .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests()))\n        .build();\n    let client = aws_sdk_dynamodb::Client::new(&shared_config);\n    let base_query = client.list_tables();\n    let mut tables = vec![];\n    for i in 0..100 {\n        let query = base_query\n            .clone()\n            .exclusive_start_table_name(format!(\"table-{}\", i));\n        tables.extend(\n            query\n                .send()\n                .await\n                .expect(\"failed\")\n                .table_names\n                .unwrap_or_default(),\n        );\n    }\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/dynamodb/tests/data.json",
    "content": "[\n  {\n    \"year\": 2013,\n    \"title\": \"Turn It Down, Or Else!\",\n    \"info\": {\n      \"directors\": [\n        \"Alice Smith\",\n        \"Bob Jones\"\n      ],\n      \"release_date\": \"2013-01-18T00:00:00Z\",\n      \"rating\": 6.2,\n      \"genres\": [\n        \"Comedy\",\n        \"Drama\"\n      ],\n      \"image_url\": \"http://ia.media-imdb.com/images/N/O9ERWAU7FS797AJ7LU8HN09AMUP908RLlo5JF90EWR7LJKQ7@@._V1_SX400_.jpg\",\n      \"plot\": \"A rock band plays their music at high volumes, annoying the neighbors.\",\n      \"rank\": 11,\n      \"running_time_secs\": 5215,\n      \"actors\": [\n        \"David Matthewman\",\n        \"Ann Thomas\",\n        \"Jonathan G. Neff\"\n      ]\n    }\n  },\n  {\n    \"year\": 2013,\n    \"title\": \"Rush\",\n    \"info\": {\n      \"directors\": [\n        \"Ron Howard\"\n      ],\n      \"release_date\": \"2013-09-02T00:00:00Z\",\n      \"rating\": 8.3,\n      \"genres\": [\n        \"Action\",\n        \"Biography\",\n        \"Drama\",\n        \"Sport\"\n      ],\n      \"image_url\": \"http://ia.media-imdb.com/images/M/MV5BMTQyMDE0MTY0OV5BMl5BanBnXkFtZTcwMjI2OTI0OQ@@._V1_SX400_.jpg\",\n      \"plot\": \"A re-creation of the merciless 1970s rivalry between Formula One rivals James Hunt and Niki Lauda.\",\n      \"rank\": 2,\n      \"running_time_secs\": 7380,\n      \"actors\": [\n        \"Daniel Bruhl\",\n        \"Chris Hemsworth\",\n        \"Olivia Wilde\"\n      ]\n    }\n  }\n]\n"
  },
  {
    "path": "aws/sdk/integration-tests/dynamodb/tests/endpoints.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_sdk_dynamodb::config::{self, Credentials, Region};\nuse aws_smithy_http_client::test_util::capture_request;\nuse aws_types::SdkConfig;\nuse http_1x::Uri;\n\nasync fn expect_uri(\n    conf: SdkConfig,\n    uri: &'static str,\n    customize: fn(config::Builder) -> config::Builder,\n) {\n    let (http_client, request) = capture_request(None);\n    let conf = customize(\n        aws_sdk_dynamodb::config::Builder::from(&conf)\n            .credentials_provider(Credentials::for_tests())\n            .stalled_stream_protection(\n                aws_sdk_dynamodb::config::StalledStreamProtectionConfig::disabled(),\n            )\n            .http_client(http_client),\n    )\n    .build();\n    let svc = aws_sdk_dynamodb::Client::from_conf(conf);\n    // dbg to see why the request failed if this test is failing\n    let _ = dbg!(svc.list_tables().send().await);\n    assert_eq!(request.expect_request().uri(), &Uri::from_static(uri));\n}\n\n/// Integration test of loading clients from shared configuration\n#[tokio::test]\nasync fn endpoints_can_be_overridden_globally() {\n    let conf = aws_types::SdkConfig::builder()\n        .region(Region::new(\"us-east-4\"))\n        .endpoint_url(\"http://localhost:8000\")\n        .build();\n\n    expect_uri(conf, \"http://localhost:8000\", |b| b).await;\n}\n\n#[tokio::test]\nasync fn endpoints_can_be_overridden_locally() {\n    let shared_config = aws_types::SdkConfig::builder()\n        .region(Region::new(\"us-east-4\"))\n        .build();\n\n    expect_uri(shared_config, \"http://localhost:8000\", |b| {\n        b.endpoint_url(\"http://localhost:8000\")\n    })\n    .await;\n}\n\n#[tokio::test]\nasync fn dual_stack_endpoints() {\n    let shared_config = SdkConfig::builder()\n        .region(Region::new(\"us-east-4\"))\n        .use_dual_stack(true)\n        .build();\n    expect_uri(shared_config, \"https://dynamodb.us-east-4.api.aws/\", |b| b).await\n}\n\n#[tokio::test]\nasync fn dual_stack_disabled_locally_endpoints() {\n    let shared_config = SdkConfig::builder()\n        .region(Region::new(\"us-east-4\"))\n        .use_dual_stack(true)\n        .build();\n    expect_uri(\n        shared_config,\n        \"https://dynamodb.us-east-4.amazonaws.com/\",\n        |b| b.use_dual_stack(false),\n    )\n    .await\n}\n\n#[tokio::test]\nasync fn fips_endpoints() {\n    let shared_config = aws_types::SdkConfig::builder()\n        .region(Region::new(\"us-east-4\"))\n        .use_dual_stack(true)\n        .use_fips(true)\n        .build();\n\n    expect_uri(\n        shared_config,\n        \"https://dynamodb-fips.us-east-4.api.aws/\",\n        |b| b,\n    )\n    .await;\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/dynamodb/tests/movies.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_sdk_dynamodb as dynamodb;\nuse aws_smithy_async::assert_elapsed;\nuse aws_smithy_http_client::test_util::{ReplayEvent, StaticReplayClient};\nuse aws_smithy_types::body::SdkBody;\nuse dynamodb::config::{Credentials, Region};\nuse dynamodb::operation::query::QueryOutput;\nuse dynamodb::types::{\n    AttributeDefinition, AttributeValue, KeySchemaElement, KeyType, ProvisionedThroughput,\n    ScalarAttributeType, TableStatus,\n};\nuse dynamodb::Client;\nuse http_1x::header::AUTHORIZATION;\nuse http_1x::Uri;\nuse serde_json::Value;\nuse std::collections::HashMap;\nuse std::time::Duration;\n\nasync fn create_table(client: &Client, table_name: &str) {\n    client\n        .create_table()\n        .table_name(table_name)\n        .key_schema(\n            KeySchemaElement::builder()\n                .attribute_name(\"year\")\n                .key_type(KeyType::Hash)\n                .build()\n                .unwrap(),\n        )\n        .key_schema(\n            KeySchemaElement::builder()\n                .attribute_name(\"title\")\n                .key_type(KeyType::Range)\n                .build()\n                .unwrap(),\n        )\n        .attribute_definitions(\n            AttributeDefinition::builder()\n                .attribute_name(\"year\")\n                .attribute_type(ScalarAttributeType::N)\n                .build()\n                .unwrap(),\n        )\n        .attribute_definitions(\n            AttributeDefinition::builder()\n                .attribute_name(\"title\")\n                .attribute_type(ScalarAttributeType::S)\n                .build()\n                .unwrap(),\n        )\n        .provisioned_throughput(\n            ProvisionedThroughput::builder()\n                .read_capacity_units(10)\n                .write_capacity_units(10)\n                .build()\n                .unwrap(),\n        )\n        .send()\n        .await\n        .expect(\"failed to create table\");\n}\n\nfn value_to_item(value: Value) -> AttributeValue {\n    match value {\n        Value::Null => AttributeValue::Null(true),\n        Value::Bool(b) => AttributeValue::Bool(b),\n        Value::Number(n) => AttributeValue::N(n.to_string()),\n        Value::String(s) => AttributeValue::S(s),\n        Value::Array(a) => AttributeValue::L(a.into_iter().map(value_to_item).collect()),\n        Value::Object(o) => {\n            AttributeValue::M(o.into_iter().map(|(k, v)| (k, value_to_item(v))).collect())\n        }\n    }\n}\n\nasync fn add_item(client: &Client, table_name: impl Into<String>, item: Value) {\n    let attribute_value = match value_to_item(item) {\n        AttributeValue::M(map) => map,\n        other => panic!(\"can only insert top level values, got {:?}\", other),\n    };\n\n    client\n        .put_item()\n        .table_name(table_name)\n        .set_item(Some(attribute_value))\n        .send()\n        .await\n        .expect(\"valid operation\");\n}\n\nasync fn movies_in_year(client: &Client, table_name: &str, year: u16) -> QueryOutput {\n    let mut expr_attrib_names = HashMap::new();\n    expr_attrib_names.insert(\"#yr\".to_string(), \"year\".to_string());\n    let mut expr_attrib_values = HashMap::new();\n    expr_attrib_values.insert(\":yyyy\".to_string(), AttributeValue::N(year.to_string()));\n\n    client\n        .query()\n        .table_name(table_name)\n        .key_condition_expression(\"#yr = :yyyy\")\n        .set_expression_attribute_names(Some(expr_attrib_names))\n        .set_expression_attribute_values(Some(expr_attrib_values))\n        .send()\n        .await\n        .expect(\"valid operation\")\n}\n\n/// Poll the DescribeTable operation once per second until the table exists.\nasync fn wait_for_ready_table(client: &Client, table_name: &str) {\n    loop {\n        if let Some(table) = client\n            .describe_table()\n            .table_name(table_name)\n            .send()\n            .await\n            .expect(\"success\")\n            .table()\n        {\n            if !matches!(table.table_status, Some(TableStatus::Creating)) {\n                break;\n            }\n        }\n        tokio::time::sleep(Duration::from_secs(1)).await;\n    }\n}\n\n/// A partial reimplementation of https://docs.amazonaws.cn/en_us/amazondynamodb/latest/developerguide/GettingStarted.Ruby.html\n/// in Rust\n///\n/// - Create table\n/// - Wait for table to be ready\n/// - Add a couple of rows\n/// - Query for those rows\n#[tokio::test]\nasync fn movies_it() {\n    let table_name = \"Movies-5\";\n    // The waiter will retry 5 times\n    tokio::time::pause();\n    let http_client = movies_it_test_connection(); // RecordingConnection::https();\n    let conf = dynamodb::Config::builder()\n        .region(Region::new(\"us-east-1\"))\n        .http_client(http_client.clone())\n        .credentials_provider(Credentials::for_tests())\n        .build();\n    let client = Client::from_conf(conf);\n\n    create_table(&client, table_name).await;\n\n    let waiter_start = tokio::time::Instant::now();\n    wait_for_ready_table(&client, table_name).await;\n\n    assert_elapsed!(\n        waiter_start,\n        Duration::from_secs(4),\n        Duration::from_millis(10)\n    );\n    // data.json contains 2 movies from 2013\n    let data = match serde_json::from_str(include_str!(\"data.json\")).expect(\"should be valid JSON\")\n    {\n        Value::Array(inner) => inner,\n        data => panic!(\"data must be an array, got: {:?}\", data),\n    };\n    for item in data {\n        add_item(&client, table_name, item.clone()).await;\n    }\n    let films_2222 = movies_in_year(&client, table_name, 2222).await;\n    // this isn't \"Back To The Future\", there are no movies from 2222\n    assert_eq!(films_2222.count, 0);\n\n    let films_2013 = movies_in_year(&client, table_name, 2013).await;\n    assert_eq!(films_2013.count, 2);\n    let titles: Vec<AttributeValue> = films_2013\n        .items\n        .unwrap()\n        .into_iter()\n        .map(|mut row| row.remove(\"title\").expect(\"row should have title\"))\n        .collect();\n    assert_eq!(\n        titles,\n        vec![\n            AttributeValue::S(\"Rush\".to_string()),\n            AttributeValue::S(\"Turn It Down, Or Else!\".to_string())\n        ]\n    );\n\n    http_client.assert_requests_match(&[AUTHORIZATION.as_str(), \"x-amz-date\"]);\n}\n\n/// Test connection for the movies IT\n/// headers are signed with actual creds, at some point we could replace them with verifiable test\n/// credentials, but there are plenty of other tests that target signing\nfn movies_it_test_connection() -> StaticReplayClient {\n    StaticReplayClient::new(vec![\n        ReplayEvent::new(\n         http_1x::Request::builder()\n                 .header(\"content-type\", \"application/x-amz-json-1.0\")\n                 .header(\"x-amz-target\", \"DynamoDB_20120810.CreateTable\")\n                 .header(\"content-length\", \"313\")\n                 .header(\"authorization\", \"AWS4-HMAC-SHA256 Credential=ASIAR6OFQKMAFQIIYZ5T/20210308/us-east-1/dynamodb/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-target, Signature=4a832eba37651836b524b587986be607607b077ad133c57b4bf7300d2e02f476\")\n                 .header(\"x-amz-date\", \"20210308T155118Z\")\n                 .uri(Uri::from_static(\"https://dynamodb.us-east-1.amazonaws.com/\"))\n                 .body(SdkBody::from(r#\"{\"AttributeDefinitions\":[{\"AttributeName\":\"year\",\"AttributeType\":\"N\"},{\"AttributeName\":\"title\",\"AttributeType\":\"S\"}],\"TableName\":\"Movies-5\",\"KeySchema\":[{\"AttributeName\":\"year\",\"KeyType\":\"HASH\"},{\"AttributeName\":\"title\",\"KeyType\":\"RANGE\"}],\"ProvisionedThroughput\":{\"ReadCapacityUnits\":10,\"WriteCapacityUnits\":10}}\"#)).unwrap(),\n         http_1x::Response::builder()\n                 .header(\"server\", \"Server\")\n                 .header(\"date\", \"Mon, 08 Mar 2021 15:51:18 GMT\")\n                 .header(\"content-type\", \"application/x-amz-json-1.0\")\n                 .header(\"content-length\", \"572\")\n                 .header(\"connection\", \"keep-alive\")\n                 .header(\"x-amzn-requestid\", \"RCII0AALE00UALC7LJ9AD600B7VV4KQNSO5AEMVJF66Q9ASUAAJG\")\n                 .header(\"x-amz-crc32\", \"3715137447\")\n                 .status(http_1x::StatusCode::from_u16(200).unwrap())\n                 .body(SdkBody::from(r#\"{\"TableDescription\":{\"AttributeDefinitions\":[{\"AttributeName\":\"title\",\"AttributeType\":\"S\"},{\"AttributeName\":\"year\",\"AttributeType\":\"N\"}],\"CreationDateTime\":1.615218678973E9,\"ItemCount\":0,\"KeySchema\":[{\"AttributeName\":\"year\",\"KeyType\":\"HASH\"},{\"AttributeName\":\"title\",\"KeyType\":\"RANGE\"}],\"ProvisionedThroughput\":{\"NumberOfDecreasesToday\":0,\"ReadCapacityUnits\":10,\"WriteCapacityUnits\":10},\"TableArn\":\"arn:aws:dynamodb:us-east-1:134095065856:table/Movies-5\",\"TableId\":\"b08c406a-7dbc-4f7d-b7c6-672a43ec21cd\",\"TableName\":\"Movies-5\",\"TableSizeBytes\":0,\"TableStatus\":\"CREATING\"}}\"#)).unwrap()),\n         ReplayEvent::new(http_1x::Request::builder()\n                  .header(\"content-type\", \"application/x-amz-json-1.0\")\n                  .header(\"x-amz-target\", \"DynamoDB_20120810.DescribeTable\")\n                  .header(\"content-length\", \"24\")\n                  .header(\"authorization\", \"AWS4-HMAC-SHA256 Credential=ASIAR6OFQKMAFQIIYZ5T/20210308/us-east-1/dynamodb/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-target, Signature=01b0129a2a4fb3af14559fde8163d59de9c43907152a12479002b3a7c75fa0df\")\n                  .header(\"x-amz-date\", \"20210308T155119Z\")\n                  .uri(Uri::from_static(\"https://dynamodb.us-east-1.amazonaws.com/\"))\n                  .body(SdkBody::from(r#\"{\"TableName\":\"Movies-5\"}\"#)).unwrap(),\n          http_1x::Response::builder()\n              .header(\"server\", \"Server\")\n              .header(\"date\", \"Mon, 08 Mar 2021 15:51:18 GMT\")\n              .header(\"content-type\", \"application/x-amz-json-1.0\")\n              .header(\"content-length\", \"561\")\n              .header(\"connection\", \"keep-alive\")\n              .header(\"x-amzn-requestid\", \"O1C6QKCG8GT7D2K922T4QRL9N3VV4KQNSO5AEMVJF66Q9ASUAAJG\")\n              .header(\"x-amz-crc32\", \"46742265\")\n              .status(http_1x::StatusCode::from_u16(200).unwrap())\n              .body(SdkBody::from(r#\"{\"Table\":{\"AttributeDefinitions\":[{\"AttributeName\":\"title\",\"AttributeType\":\"S\"},{\"AttributeName\":\"year\",\"AttributeType\":\"N\"}],\"CreationDateTime\":1.615218678973E9,\"ItemCount\":0,\"KeySchema\":[{\"AttributeName\":\"year\",\"KeyType\":\"HASH\"},{\"AttributeName\":\"title\",\"KeyType\":\"RANGE\"}],\"ProvisionedThroughput\":{\"NumberOfDecreasesToday\":0,\"ReadCapacityUnits\":10,\"WriteCapacityUnits\":10},\"TableArn\":\"arn:aws:dynamodb:us-east-1:134095065856:table/Movies-5\",\"TableId\":\"b08c406a-7dbc-4f7d-b7c6-672a43ec21cd\",\"TableName\":\"Movies-5\",\"TableSizeBytes\":0,\"TableStatus\":\"CREATING\"}}\"#)).unwrap()),\n         ReplayEvent::new(http_1x::Request::builder()\n              .header(\"content-type\", \"application/x-amz-json-1.0\")\n              .header(\"x-amz-target\", \"DynamoDB_20120810.DescribeTable\")\n              .header(\"content-length\", \"24\")\n              .header(\"authorization\", \"AWS4-HMAC-SHA256 Credential=ASIAR6OFQKMAFQIIYZ5T/20210308/us-east-1/dynamodb/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-target, Signature=7f3a743bb460f26296640ae775d282f0153eda750855ec00ace1815becfd2de5\")\n              .header(\"x-amz-date\", \"20210308T155120Z\")\n              .uri(Uri::from_static(\"https://dynamodb.us-east-1.amazonaws.com/\")).body(SdkBody::from(r#\"{\"TableName\":\"Movies-5\"}\"#)).unwrap(),\n          http_1x::Response::builder()\n              .header(\"server\", \"Server\")\n              .header(\"date\", \"Mon, 08 Mar 2021 15:51:20 GMT\")\n              .header(\"content-type\", \"application/x-amz-json-1.0\")\n              .header(\"content-length\", \"561\")\n              .header(\"connection\", \"keep-alive\")\n              .header(\"x-amzn-requestid\", \"EN5N26BO1FAOEMUUSD7B7SUPPVVV4KQNSO5AEMVJF66Q9ASUAAJG\")\n              .header(\"x-amz-crc32\", \"46742265\")\n              .status(http_1x::StatusCode::from_u16(200).unwrap())\n              .body(SdkBody::from(r#\"{\"Table\":{\"AttributeDefinitions\":[{\"AttributeName\":\"title\",\"AttributeType\":\"S\"},{\"AttributeName\":\"year\",\"AttributeType\":\"N\"}],\"CreationDateTime\":1.615218678973E9,\"ItemCount\":0,\"KeySchema\":[{\"AttributeName\":\"year\",\"KeyType\":\"HASH\"},{\"AttributeName\":\"title\",\"KeyType\":\"RANGE\"}],\"ProvisionedThroughput\":{\"NumberOfDecreasesToday\":0,\"ReadCapacityUnits\":10,\"WriteCapacityUnits\":10},\"TableArn\":\"arn:aws:dynamodb:us-east-1:134095065856:table/Movies-5\",\"TableId\":\"b08c406a-7dbc-4f7d-b7c6-672a43ec21cd\",\"TableName\":\"Movies-5\",\"TableSizeBytes\":0,\"TableStatus\":\"CREATING\"}}\"#)).unwrap()),\n         ReplayEvent::new(http_1x::Request::builder()\n              .header(\"content-type\", \"application/x-amz-json-1.0\")\n              .header(\"x-amz-target\", \"DynamoDB_20120810.DescribeTable\")\n              .header(\"content-length\", \"24\")\n              .header(\"authorization\", \"AWS4-HMAC-SHA256 Credential=ASIAR6OFQKMAFQIIYZ5T/20210308/us-east-1/dynamodb/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-target, Signature=46a148c560139bc0da171bd915ea8c0b96a7012629f5db7b6bf70fcd1a66fd24\")\n              .header(\"x-amz-date\", \"20210308T155121Z\")\n              .uri(Uri::from_static(\"https://dynamodb.us-east-1.amazonaws.com/\"))\n              .body(SdkBody::from(r#\"{\"TableName\":\"Movies-5\"}\"#)).unwrap(),\n          http_1x::Response::builder()\n              .header(\"server\", \"Server\")\n              .header(\"date\", \"Mon, 08 Mar 2021 15:51:21 GMT\")\n              .header(\"content-type\", \"application/x-amz-json-1.0\")\n              .header(\"content-length\", \"561\")\n              .header(\"connection\", \"keep-alive\")\n              .header(\"x-amzn-requestid\", \"PHCMGEVI6JLN9JNMKSSA3M76H3VV4KQNSO5AEMVJF66Q9ASUAAJG\")\n              .header(\"x-amz-crc32\", \"46742265\")\n              .status(http_1x::StatusCode::from_u16(200).unwrap())\n              .body(SdkBody::from(r#\"{\"Table\":{\"AttributeDefinitions\":[{\"AttributeName\":\"title\",\"AttributeType\":\"S\"},{\"AttributeName\":\"year\",\"AttributeType\":\"N\"}],\"CreationDateTime\":1.615218678973E9,\"ItemCount\":0,\"KeySchema\":[{\"AttributeName\":\"year\",\"KeyType\":\"HASH\"},{\"AttributeName\":\"title\",\"KeyType\":\"RANGE\"}],\"ProvisionedThroughput\":{\"NumberOfDecreasesToday\":0,\"ReadCapacityUnits\":10,\"WriteCapacityUnits\":10},\"TableArn\":\"arn:aws:dynamodb:us-east-1:134095065856:table/Movies-5\",\"TableId\":\"b08c406a-7dbc-4f7d-b7c6-672a43ec21cd\",\"TableName\":\"Movies-5\",\"TableSizeBytes\":0,\"TableStatus\":\"CREATING\"}}\"#)).unwrap()),\n         ReplayEvent::new(http_1x::Request::builder()\n              .header(\"content-type\", \"application/x-amz-json-1.0\")\n              .header(\"x-amz-target\", \"DynamoDB_20120810.DescribeTable\")\n              .header(\"content-length\", \"24\")\n              .header(\"authorization\", \"AWS4-HMAC-SHA256 Credential=ASIAR6OFQKMAFQIIYZ5T/20210308/us-east-1/dynamodb/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-target, Signature=15bb7c9b2350747d62349091b3ea59d9e1800d1dca04029943329259bba85cb4\")\n              .header(\"x-amz-date\", \"20210308T155122Z\")\n              .uri(Uri::from_static(\"https://dynamodb.us-east-1.amazonaws.com/\"))\n              .body(SdkBody::from(r#\"{\"TableName\":\"Movies-5\"}\"#)).unwrap(),\n          http_1x::Response::builder()\n              .header(\"server\", \"Server\")\n              .header(\"date\", \"Mon, 08 Mar 2021 15:51:22 GMT\")\n              .header(\"content-type\", \"application/x-amz-json-1.0\")\n              .header(\"content-length\", \"561\")\n              .header(\"connection\", \"keep-alive\")\n              .header(\"x-amzn-requestid\", \"1Q22O983HD3511TN6Q5RRTP0MFVV4KQNSO5AEMVJF66Q9ASUAAJG\")\n              .header(\"x-amz-crc32\", \"46742265\")\n              .status(http_1x::StatusCode::from_u16(200).unwrap())\n              .body(SdkBody::from(r#\"{\"Table\":{\"AttributeDefinitions\":[{\"AttributeName\":\"title\",\"AttributeType\":\"S\"},{\"AttributeName\":\"year\",\"AttributeType\":\"N\"}],\"CreationDateTime\":1.615218678973E9,\"ItemCount\":0,\"KeySchema\":[{\"AttributeName\":\"year\",\"KeyType\":\"HASH\"},{\"AttributeName\":\"title\",\"KeyType\":\"RANGE\"}],\"ProvisionedThroughput\":{\"NumberOfDecreasesToday\":0,\"ReadCapacityUnits\":10,\"WriteCapacityUnits\":10},\"TableArn\":\"arn:aws:dynamodb:us-east-1:134095065856:table/Movies-5\",\"TableId\":\"b08c406a-7dbc-4f7d-b7c6-672a43ec21cd\",\"TableName\":\"Movies-5\",\"TableSizeBytes\":0,\"TableStatus\":\"CREATING\"}}\"#)).unwrap()),\n         ReplayEvent::new(http_1x::Request::builder()\n              .header(\"content-type\", \"application/x-amz-json-1.0\")\n              .header(\"x-amz-target\", \"DynamoDB_20120810.DescribeTable\")\n              .header(\"content-length\", \"24\")\n              .header(\"authorization\", \"AWS4-HMAC-SHA256 Credential=ASIAR6OFQKMAFQIIYZ5T/20210308/us-east-1/dynamodb/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-target, Signature=6d0a78087bc112c68a91b4b2d457efd8c09149b85b8f998f8c4b3f9916c8a743\")\n              .header(\"x-amz-date\", \"20210308T155123Z\")\n              .uri(Uri::from_static(\"https://dynamodb.us-east-1.amazonaws.com/\"))\n              .body(SdkBody::from(r#\"{\"TableName\":\"Movies-5\"}\"#)).unwrap(),\n          http_1x::Response::builder()\n              .header(\"server\", \"Server\")\n              .header(\"date\", \"Mon, 08 Mar 2021 15:51:23 GMT\")\n              .header(\"content-type\", \"application/x-amz-json-1.0\")\n              .header(\"content-length\", \"559\")\n              .header(\"connection\", \"keep-alive\")\n              .header(\"x-amzn-requestid\", \"ONJBNV2A9GBNUT34KH73JLL23BVV4KQNSO5AEMVJF66Q9ASUAAJG\")\n              .header(\"x-amz-crc32\", \"24113616\")\n              .status(http_1x::StatusCode::from_u16(200).unwrap())\n              .body(SdkBody::from(r#\"{\"Table\":{\"AttributeDefinitions\":[{\"AttributeName\":\"title\",\"AttributeType\":\"S\"},{\"AttributeName\":\"year\",\"AttributeType\":\"N\"}],\"CreationDateTime\":1.615218678973E9,\"ItemCount\":0,\"KeySchema\":[{\"AttributeName\":\"year\",\"KeyType\":\"HASH\"},{\"AttributeName\":\"title\",\"KeyType\":\"RANGE\"}],\"ProvisionedThroughput\":{\"NumberOfDecreasesToday\":0,\"ReadCapacityUnits\":10,\"WriteCapacityUnits\":10},\"TableArn\":\"arn:aws:dynamodb:us-east-1:134095065856:table/Movies-5\",\"TableId\":\"b08c406a-7dbc-4f7d-b7c6-672a43ec21cd\",\"TableName\":\"Movies-5\",\"TableSizeBytes\":0,\"TableStatus\":\"ACTIVE\"}}\"#)).unwrap()),\n         ReplayEvent::new(http_1x::Request::builder()\n              .header(\"content-type\", \"application/x-amz-json-1.0\")\n              .header(\"x-amz-target\", \"DynamoDB_20120810.PutItem\")\n              .header(\"content-length\", \"619\")\n              .header(\"authorization\", \"AWS4-HMAC-SHA256 Credential=ASIAR6OFQKMAFQIIYZ5T/20210308/us-east-1/dynamodb/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-target, Signature=85fc7d2064a0e6d9c38d64751d39d311ad415ae4079ef21ef254b23ecf093519\")\n              .header(\"x-amz-date\", \"20210308T155123Z\")\n              .uri(Uri::from_static(\"https://dynamodb.us-east-1.amazonaws.com/\"))\n              .body(SdkBody::from(r#\"{\"TableName\":\"Movies-5\",\"Item\":{\"info\":{\"M\":{\"rating\":{\"N\":\"6.2\"},\"genres\":{\"L\":[{\"S\":\"Comedy\"},{\"S\":\"Drama\"}]},\"image_url\":{\"S\":\"http://ia.media-imdb.com/images/N/O9ERWAU7FS797AJ7LU8HN09AMUP908RLlo5JF90EWR7LJKQ7@@._V1_SX400_.jpg\"},\"release_date\":{\"S\":\"2013-01-18T00:00:00Z\"},\"actors\":{\"L\":[{\"S\":\"David Matthewman\"},{\"S\":\"Ann Thomas\"},{\"S\":\"Jonathan G. Neff\"}]},\"plot\":{\"S\":\"A rock band plays their music at high volumes, annoying the neighbors.\"},\"running_time_secs\":{\"N\":\"5215\"},\"rank\":{\"N\":\"11\"},\"directors\":{\"L\":[{\"S\":\"Alice Smith\"},{\"S\":\"Bob Jones\"}]}}},\"title\":{\"S\":\"Turn It Down, Or Else!\"},\"year\":{\"N\":\"2013\"}}}\"#)).unwrap(),\n          http_1x::Response::builder()\n              .header(\"server\", \"Server\")\n              .header(\"date\", \"Mon, 08 Mar 2021 15:51:23 GMT\")\n              .header(\"content-type\", \"application/x-amz-json-1.0\")\n              .header(\"content-length\", \"2\")\n              .header(\"connection\", \"keep-alive\")\n              .header(\"x-amzn-requestid\", \"E6TGS5HKHHV08HSQA31IO1IDMFVV4KQNSO5AEMVJF66Q9ASUAAJG\")\n              .header(\"x-amz-crc32\", \"2745614147\")\n              .status(http_1x::StatusCode::from_u16(200).unwrap())\n              .body(SdkBody::from(r#\"{}\"#)).unwrap()),\n         ReplayEvent::new(http_1x::Request::builder()\n              .header(\"content-type\", \"application/x-amz-json-1.0\")\n              .header(\"x-amz-target\", \"DynamoDB_20120810.PutItem\")\n              .header(\"content-length\", \"636\")\n              .header(\"authorization\", \"AWS4-HMAC-SHA256 Credential=ASIAR6OFQKMAFQIIYZ5T/20210308/us-east-1/dynamodb/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-target, Signature=e4b1658c9f5129b3656381f6592a30e0061b1566263fbf27d982817ea79483f6\")\n              .header(\"x-amz-date\", \"20210308T155123Z\")\n              .uri(Uri::from_static(\"https://dynamodb.us-east-1.amazonaws.com/\"))\n              .body(SdkBody::from(r#\"{\"TableName\":\"Movies-5\",\"Item\":{\"info\":{\"M\":{\"plot\":{\"S\":\"A re-creation of the merciless 1970s rivalry between Formula One rivals James Hunt and Niki Lauda.\"},\"rating\":{\"N\":\"8.3\"},\"rank\":{\"N\":\"2\"},\"release_date\":{\"S\":\"2013-09-02T00:00:00Z\"},\"directors\":{\"L\":[{\"S\":\"Ron Howard\"}]},\"image_url\":{\"S\":\"http://ia.media-imdb.com/images/M/MV5BMTQyMDE0MTY0OV5BMl5BanBnXkFtZTcwMjI2OTI0OQ@@._V1_SX400_.jpg\"},\"actors\":{\"L\":[{\"S\":\"Daniel Bruhl\"},{\"S\":\"Chris Hemsworth\"},{\"S\":\"Olivia Wilde\"}]},\"running_time_secs\":{\"N\":\"7380\"},\"genres\":{\"L\":[{\"S\":\"Action\"},{\"S\":\"Biography\"},{\"S\":\"Drama\"},{\"S\":\"Sport\"}]}}},\"title\":{\"S\":\"Rush\"},\"year\":{\"N\":\"2013\"}}}\"#)).unwrap(),\n          http_1x::Response::builder()\n              .header(\"server\", \"Server\")\n              .header(\"date\", \"Mon, 08 Mar 2021 15:51:23 GMT\")\n              .header(\"content-type\", \"application/x-amz-json-1.0\")\n              .header(\"content-length\", \"2\")\n              .header(\"connection\", \"keep-alive\")\n              .header(\"x-amzn-requestid\", \"B63D54LP2FOGQK9JE5KLJT49HJVV4KQNSO5AEMVJF66Q9ASUAAJG\")\n              .header(\"x-amz-crc32\", \"2745614147\")\n              .status(http_1x::StatusCode::from_u16(200).unwrap())\n              .body(SdkBody::from(r#\"{}\"#)).unwrap()),\n         ReplayEvent::new(http_1x::Request::builder()\n              .header(\"content-type\", \"application/x-amz-json-1.0\")\n              .header(\"x-amz-target\", \"DynamoDB_20120810.Query\")\n              .header(\"content-length\", \"156\")\n              .header(\"authorization\", \"AWS4-HMAC-SHA256 Credential=ASIAR6OFQKMAFQIIYZ5T/20210308/us-east-1/dynamodb/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-target, Signature=c9a0fdd0c7c3a792faddabca1fc154c8fbb54ddee7b06a8082e1c587615198b5\")\n              .header(\"x-amz-date\", \"20210308T155123Z\")\n              .uri(Uri::from_static(\"https://dynamodb.us-east-1.amazonaws.com/\"))\n              .body(SdkBody::from(r##\"{\"TableName\":\"Movies-5\",\"KeyConditionExpression\":\"#yr = :yyyy\",\"ExpressionAttributeNames\":{\"#yr\":\"year\"},\"ExpressionAttributeValues\":{\":yyyy\":{\"N\":\"2222\"}}}\"##)).unwrap(),\n          http_1x::Response::builder()\n              .header(\"server\", \"Server\")\n              .header(\"date\", \"Mon, 08 Mar 2021 15:51:23 GMT\")\n              .header(\"content-type\", \"application/x-amz-json-1.0\")\n              .header(\"content-length\", \"39\")\n              .header(\"connection\", \"keep-alive\")\n              .header(\"x-amzn-requestid\", \"AUAS9KJ0TK9BSR986TRPC2RGTRVV4KQNSO5AEMVJF66Q9ASUAAJG\")\n              .header(\"x-amz-crc32\", \"3413411624\")\n              .status(http_1x::StatusCode::from_u16(200).unwrap())\n              .body(SdkBody::from(r#\"{\"Count\":0,\"Items\":[],\"ScannedCount\":0}\"#)).unwrap()),\n         ReplayEvent::new(http_1x::Request::builder()\n              .header(\"content-type\", \"application/x-amz-json-1.0\")\n              .header(\"x-amz-target\", \"DynamoDB_20120810.Query\")\n              .header(\"content-length\", \"156\")\n              .header(\"authorization\", \"AWS4-HMAC-SHA256 Credential=ASIAR6OFQKMAFQIIYZ5T/20210308/us-east-1/dynamodb/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-target, Signature=504d6b4de7093b20255b55057085937ec515f62f3c61da68c03bff3f0ce8a160\")\n              .header(\"x-amz-date\", \"20210308T155123Z\")\n              .uri(Uri::from_static(\"https://dynamodb.us-east-1.amazonaws.com/\"))\n              .body(SdkBody::from(r##\"{\"TableName\":\"Movies-5\",\"KeyConditionExpression\":\"#yr = :yyyy\",\"ExpressionAttributeNames\":{\"#yr\":\"year\"},\"ExpressionAttributeValues\":{\":yyyy\":{\"N\":\"2013\"}}}\"##)).unwrap(),\n          http_1x::Response::builder()\n              .header(\"server\", \"Server\")\n              .header(\"date\", \"Mon, 08 Mar 2021 15:51:23 GMT\")\n              .header(\"content-type\", \"application/x-amz-json-1.0\")\n              .header(\"content-length\", \"1231\")\n              .header(\"connection\", \"keep-alive\")\n              .header(\"x-amzn-requestid\", \"A5FGSJ9ET4OKB8183S9M47RQQBVV4KQNSO5AEMVJF66Q9ASUAAJG\")\n              .header(\"x-amz-crc32\", \"624725176\")\n              .status(http_1x::StatusCode::from_u16(200).unwrap())\n              .body(SdkBody::from(r#\"{\"Count\":2,\"Items\":[{\"year\":{\"N\":\"2013\"},\"info\":{\"M\":{\"actors\":{\"L\":[{\"S\":\"Daniel Bruhl\"},{\"S\":\"Chris Hemsworth\"},{\"S\":\"Olivia Wilde\"}]},\"plot\":{\"S\":\"A re-creation of the merciless 1970s rivalry between Formula One rivals James Hunt and Niki Lauda.\"},\"release_date\":{\"S\":\"2013-09-02T00:00:00Z\"},\"image_url\":{\"S\":\"http://ia.media-imdb.com/images/M/MV5BMTQyMDE0MTY0OV5BMl5BanBnXkFtZTcwMjI2OTI0OQ@@._V1_SX400_.jpg\"},\"genres\":{\"L\":[{\"S\":\"Action\"},{\"S\":\"Biography\"},{\"S\":\"Drama\"},{\"S\":\"Sport\"}]},\"directors\":{\"L\":[{\"S\":\"Ron Howard\"}]},\"rating\":{\"N\":\"8.3\"},\"rank\":{\"N\":\"2\"},\"running_time_secs\":{\"N\":\"7380\"}}},\"title\":{\"S\":\"Rush\"}},{\"year\":{\"N\":\"2013\"},\"info\":{\"M\":{\"actors\":{\"L\":[{\"S\":\"David Matthewman\"},{\"S\":\"Ann Thomas\"},{\"S\":\"Jonathan G. Neff\"}]},\"release_date\":{\"S\":\"2013-01-18T00:00:00Z\"},\"plot\":{\"S\":\"A rock band plays their music at high volumes, annoying the neighbors.\"},\"genres\":{\"L\":[{\"S\":\"Comedy\"},{\"S\":\"Drama\"}]},\"image_url\":{\"S\":\"http://ia.media-imdb.com/images/N/O9ERWAU7FS797AJ7LU8HN09AMUP908RLlo5JF90EWR7LJKQ7@@._V1_SX400_.jpg\"},\"directors\":{\"L\":[{\"S\":\"Alice Smith\"},{\"S\":\"Bob Jones\"}]},\"rating\":{\"N\":\"6.2\"},\"rank\":{\"N\":\"11\"},\"running_time_secs\":{\"N\":\"5215\"}}},\"title\":{\"S\":\"Turn It Down, Or Else!\"}}],\"ScannedCount\":2}\"#)).unwrap())\n    ])\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/dynamodb/tests/paginators.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::collections::HashMap;\nuse std::iter::FromIterator;\n\nuse aws_credential_types::Credentials;\nuse aws_sdk_dynamodb::types::AttributeValue;\nuse aws_sdk_dynamodb::{Client, Config};\nuse aws_smithy_http_client::test_util::{capture_request, ReplayEvent, StaticReplayClient};\nuse aws_smithy_protocol_test::{assert_ok, validate_body, MediaType};\nuse aws_smithy_runtime_api::client::http::HttpClient;\nuse aws_smithy_types::body::SdkBody;\nuse aws_types::region::Region;\n\nfn stub_config(http_client: impl HttpClient + 'static) -> Config {\n    Config::builder()\n        .region(Region::new(\"us-east-1\"))\n        .credentials_provider(Credentials::for_tests())\n        .http_client(http_client)\n        .build()\n}\n\n/// Validate that arguments are passed on to the paginator\n#[tokio::test]\nasync fn paginators_pass_args() {\n    let (http_client, request) = capture_request(None);\n    let client = Client::from_conf(stub_config(http_client));\n    let mut paginator = client\n        .scan()\n        .table_name(\"test-table\")\n        .into_paginator()\n        .page_size(32)\n        .send();\n    let _ = paginator.next().await;\n    let request = request.expect_request();\n    let body = request.body().bytes().expect(\"data is loaded\");\n    assert_ok(validate_body(\n        body,\n        r#\"{\"TableName\":\"test-table\",\"Limit\":32}\"#,\n        MediaType::Json,\n    ));\n}\n\nfn mk_request(body: &'static str) -> http_1x::Request<SdkBody> {\n    http_1x::Request::builder()\n        .uri(\"https://dynamodb.us-east-1.amazonaws.com/\")\n        .body(SdkBody::from(body))\n        .unwrap()\n}\n\nfn mk_response(body: &'static str) -> http_1x::Response<SdkBody> {\n    http_1x::Response::builder()\n        .body(SdkBody::from(body))\n        .unwrap()\n}\n\n#[tokio::test(flavor = \"current_thread\")]\nasync fn paginators_loop_until_completion() {\n    let http_client = StaticReplayClient::new(vec![\n        ReplayEvent::new(\n            mk_request(r#\"{\"TableName\":\"test-table\",\"Limit\":32}\"#),\n            mk_response(\n                r#\"{\n                            \"Count\": 1,\n                            \"Items\": [{\n                                \"PostedBy\": {\n                                    \"S\": \"joe@example.com\"\n                                }\n                            }],\n                            \"LastEvaluatedKey\": {\n                                \"PostedBy\": { \"S\": \"joe@example.com\" }\n                            }\n                        }\"#,\n            ),\n        ),\n        ReplayEvent::new(\n            mk_request(\n                r#\"{\"TableName\":\"test-table\",\"Limit\":32,\"ExclusiveStartKey\":{\"PostedBy\":{\"S\":\"joe@example.com\"}}}\"#,\n            ),\n            mk_response(\n                r#\"{\n                            \"Count\": 1,\n                            \"Items\": [{\n                                \"PostedBy\": {\n                                    \"S\": \"jack@example.com\"\n                                }\n                            }]\n                        }\"#,\n            ),\n        ),\n    ]);\n    let client = Client::from_conf(stub_config(http_client.clone()));\n    let mut paginator = client\n        .scan()\n        .table_name(\"test-table\")\n        .into_paginator()\n        .page_size(32)\n        .send();\n    assert_eq!(http_client.actual_requests().count(), 0);\n    let first_page = paginator\n        .try_next()\n        .await\n        .expect(\"success\")\n        .expect(\"page exists\");\n    assert_eq!(\n        first_page.items.unwrap_or_default(),\n        vec![HashMap::from_iter([(\n            \"PostedBy\".to_string(),\n            AttributeValue::S(\"joe@example.com\".to_string())\n        )])]\n    );\n    assert_eq!(http_client.actual_requests().count(), 1);\n    let second_page = paginator\n        .try_next()\n        .await\n        .expect(\"success\")\n        .expect(\"page exists\");\n    assert_eq!(\n        second_page.items.unwrap_or_default(),\n        vec![HashMap::from_iter([(\n            \"PostedBy\".to_string(),\n            AttributeValue::S(\"jack@example.com\".to_string())\n        )])]\n    );\n    assert_eq!(http_client.actual_requests().count(), 2);\n    assert!(\n        paginator.next().await.is_none(),\n        \"no more pages should exist\"\n    );\n    // we shouldn't make another request, we know we're at the end\n    assert_eq!(http_client.actual_requests().count(), 2);\n    http_client.assert_requests_match(&[]);\n}\n\n#[tokio::test]\nasync fn paginators_handle_errors() {\n    // LastEvaluatedKey is set but there is only one response in the test connection\n    let http_client = StaticReplayClient::new(vec![ReplayEvent::new(\n        mk_request(r#\"{\"TableName\":\"test-table\",\"Limit\":32}\"#),\n        mk_response(\n            r#\"{\n                   \"Count\": 1,\n                   \"Items\": [{\n                       \"PostedBy\": {\n                           \"S\": \"joe@example.com\"\n                       }\n                   }],\n                   \"LastEvaluatedKey\": {\n                       \"PostedBy\": { \"S\": \"joe@example.com\" }\n                   }\n               }\"#,\n        ),\n    )]);\n    let client = Client::from_conf(stub_config(http_client.clone()));\n    let mut rows = client\n        .scan()\n        .table_name(\"test-table\")\n        .into_paginator()\n        .page_size(32)\n        .items()\n        .send();\n    assert_eq!(\n        rows.try_next()\n            .await\n            .expect(\"no error\")\n            .expect(\"not EOS\")\n            .get(\"PostedBy\"),\n        Some(&AttributeValue::S(\"joe@example.com\".to_string()))\n    );\n    rows.try_next().await.expect_err(\"failure\");\n    assert_eq!(rows.try_next().await.expect(\"ok\"), None);\n}\n\n#[tokio::test]\nasync fn paginators_stop_on_duplicate_token_by_default() {\n    let response = r#\"{\n        \"Count\": 1,\n        \"Items\": [{\n            \"PostedBy\": {\n                \"S\": \"joe@example.com\"\n            }\n        }],\n        \"LastEvaluatedKey\": {\n            \"PostedBy\": { \"S\": \"joe@example.com\" }\n        }\n    }\"#;\n    // send the same response twice with the same pagination token\n    let http_client = StaticReplayClient::new(vec![\n        ReplayEvent::new(\n            mk_request(r#\"{\"TableName\":\"test-table\",\"Limit\":32}\"#),\n            mk_response(response),\n        ),\n        ReplayEvent::new(\n            mk_request(\n                r#\"{\"TableName\":\"test-table\",\"Limit\":32,\"ExclusiveStartKey\":{\"PostedBy\":{\"S\":\"joe@example.com\"}}}\"#,\n            ),\n            mk_response(response),\n        ),\n    ]);\n    let client = Client::from_conf(stub_config(http_client.clone()));\n    let mut rows = client\n        .scan()\n        .table_name(\"test-table\")\n        .into_paginator()\n        .page_size(32)\n        .items()\n        .send();\n    assert_eq!(\n        rows.try_next()\n            .await\n            .expect(\"no error\")\n            .expect(\"not EOS\")\n            .get(\"PostedBy\"),\n        Some(&AttributeValue::S(\"joe@example.com\".to_string()))\n    );\n    assert_eq!(\n        rows.try_next()\n            .await\n            .expect(\"no error\")\n            .expect(\"not EOS\")\n            .get(\"PostedBy\"),\n        Some(&AttributeValue::S(\"joe@example.com\".to_string()))\n    );\n    assert_eq!(None, rows.try_next().await.expect(\"success\"));\n}\n\n#[tokio::test]\nasync fn paginators_can_continue_on_duplicate_token() {\n    let response = r#\"{\n        \"Count\": 1,\n        \"Items\": [{\n            \"PostedBy\": {\n                \"S\": \"joe@example.com\"\n            }\n        }],\n        \"LastEvaluatedKey\": {\n            \"PostedBy\": { \"S\": \"joe@example.com\" }\n        }\n    }\"#;\n    // send the same response twice with the same pagination token\n    let http_client = StaticReplayClient::new(vec![\n        ReplayEvent::new(\n            mk_request(r#\"{\"TableName\":\"test-table\",\"Limit\":32}\"#),\n            mk_response(response),\n        ),\n        ReplayEvent::new(\n            mk_request(\n                r#\"{\"TableName\":\"test-table\",\"Limit\":32,\"ExclusiveStartKey\":{\"PostedBy\":{\"S\":\"joe@example.com\"}}}\"#,\n            ),\n            mk_response(response),\n        ),\n        ReplayEvent::new(\n            mk_request(\n                r#\"{\"TableName\":\"test-table\",\"Limit\":32,\"ExclusiveStartKey\":{\"PostedBy\":{\"S\":\"joe@example.com\"}}}\"#,\n            ),\n            mk_response(response),\n        ),\n    ]);\n    let client = Client::from_conf(stub_config(http_client.clone()));\n    let mut rows = client\n        .scan()\n        .table_name(\"test-table\")\n        .into_paginator()\n        .stop_on_duplicate_token(false)\n        .page_size(32)\n        .items()\n        .send();\n    assert_eq!(\n        rows.try_next()\n            .await\n            .expect(\"no error\")\n            .expect(\"not EOS\")\n            .get(\"PostedBy\"),\n        Some(&AttributeValue::S(\"joe@example.com\".to_string()))\n    );\n    assert_eq!(\n        rows.try_next()\n            .await\n            .expect(\"no error\")\n            .expect(\"not EOS\")\n            .get(\"PostedBy\"),\n        Some(&AttributeValue::S(\"joe@example.com\".to_string()))\n    );\n    assert_eq!(\n        rows.try_next()\n            .await\n            .expect(\"no error\")\n            .expect(\"not EOS\")\n            .get(\"PostedBy\"),\n        Some(&AttributeValue::S(\"joe@example.com\".to_string()))\n    );\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/dynamodb/tests/retries-with-client-rate-limiting.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_sdk_dynamodb::config::{\n    Credentials, Region, SharedAsyncSleep, StalledStreamProtectionConfig,\n};\nuse aws_sdk_dynamodb::{config::retry::RetryConfig, error::ProvideErrorMetadata};\nuse aws_smithy_async::test_util::instant_time_and_sleep;\nuse aws_smithy_async::time::SharedTimeSource;\nuse aws_smithy_http_client::test_util::{ReplayEvent, StaticReplayClient};\nuse aws_smithy_runtime::client::retries::RetryPartition;\nuse aws_smithy_types::body::SdkBody;\nuse std::time::{Duration, SystemTime};\n\nfn req() -> http_1x::Request<SdkBody> {\n    http_1x::Request::builder()\n        .body(SdkBody::from(\"request body\"))\n        .unwrap()\n}\n\nfn ok() -> http_1x::Response<SdkBody> {\n    let body = \"{ \\\"TableNames\\\": [ \\\"Test\\\" ] }\";\n    http_1x::Response::builder()\n        .status(200)\n        .header(\"server\", \"Server\")\n        .header(\"content-type\", \"application/x-amz-json-1.0\")\n        .header(\"content-length\", body.len().to_string())\n        .header(\"connection\", \"keep-alive\")\n        .header(\"x-amz-crc32\", \"2335643545\")\n        .body(SdkBody::from(body))\n        .unwrap()\n}\n\nfn err() -> http_1x::Response<SdkBody> {\n    http_1x::Response::builder()\n        .status(500)\n        .body(SdkBody::from(\"{ \\\"message\\\": \\\"The request has failed because of an unknown error, exception or failure.\\\", \\\"code\\\": \\\"InternalServerError\\\" }\"))\n        .unwrap()\n}\n\nfn throttling_err() -> http_1x::Response<SdkBody> {\n    http_1x::Response::builder()\n        .status(400)\n        .body(SdkBody::from(\"{ \\\"message\\\": \\\"The request was denied due to request throttling.\\\", \\\"code\\\": \\\"ThrottlingException\\\" }\"))\n        .unwrap()\n}\n\n#[tokio::test]\nasync fn test_adaptive_retries_with_no_throttling_errors() {\n    let (time_source, sleep_impl) = instant_time_and_sleep(SystemTime::UNIX_EPOCH);\n\n    let events = vec![\n        // First operation\n        ReplayEvent::new(req(), err()),\n        ReplayEvent::new(req(), err()),\n        ReplayEvent::new(req(), ok()),\n        // Second operation\n        ReplayEvent::new(req(), err()),\n        ReplayEvent::new(req(), ok()),\n        // Third operation will fail, only errors\n        ReplayEvent::new(req(), err()),\n        ReplayEvent::new(req(), err()),\n        ReplayEvent::new(req(), err()),\n        ReplayEvent::new(req(), err()),\n    ];\n\n    let http_client = StaticReplayClient::new(events);\n    let config = aws_sdk_dynamodb::Config::builder()\n        .stalled_stream_protection(StalledStreamProtectionConfig::disabled())\n        .credentials_provider(Credentials::for_tests())\n        .region(Region::new(\"us-east-1\"))\n        .retry_config(\n            RetryConfig::adaptive()\n                .with_max_attempts(4)\n                .with_use_static_exponential_base(true),\n        )\n        .time_source(SharedTimeSource::new(time_source))\n        .sleep_impl(SharedAsyncSleep::new(sleep_impl.clone()))\n        .retry_partition(RetryPartition::new(\n            \"test_adaptive_retries_with_no_throttling_errors\",\n        ))\n        .http_client(http_client.clone())\n        .build();\n    let expected_table_names = vec![\"Test\".to_owned()];\n\n    // We create a new client each time to ensure that the cross-client retry state is working.\n    let client = aws_sdk_dynamodb::Client::from_conf(config.clone());\n    let res = client.list_tables().send().await.unwrap();\n    assert_eq!(sleep_impl.total_duration(), Duration::from_secs(3));\n    assert_eq!(res.table_names(), expected_table_names.as_slice());\n    // Three requests should have been made, two failing & one success\n    assert_eq!(http_client.actual_requests().count(), 3);\n\n    let client = aws_sdk_dynamodb::Client::from_conf(config.clone());\n    let res = client.list_tables().send().await.unwrap();\n    assert_eq!(sleep_impl.total_duration(), Duration::from_secs(3 + 1));\n    assert_eq!(res.table_names(), expected_table_names.as_slice());\n    // Two requests should have been made, one failing & one success (plus previous requests)\n    assert_eq!(http_client.actual_requests().count(), 5);\n\n    let client = aws_sdk_dynamodb::Client::from_conf(config);\n    let err = client.list_tables().send().await.unwrap_err();\n    assert_eq!(sleep_impl.total_duration(), Duration::from_secs(3 + 1 + 7),);\n    assert_eq!(err.code(), Some(\"InternalServerError\"));\n    // four requests should have been made, all failing (plus previous requests)\n    assert_eq!(http_client.actual_requests().count(), 9);\n}\n\n#[tokio::test]\nasync fn test_adaptive_retries_with_throttling_errors() {\n    let (time_source, sleep_impl) = instant_time_and_sleep(SystemTime::UNIX_EPOCH);\n\n    let events = vec![\n        // First operation\n        ReplayEvent::new(req(), throttling_err()),\n        ReplayEvent::new(req(), throttling_err()),\n        ReplayEvent::new(req(), ok()),\n        // Second operation\n        ReplayEvent::new(req(), err()),\n        ReplayEvent::new(req(), ok()),\n    ];\n\n    let http_client = StaticReplayClient::new(events);\n    let config = aws_sdk_dynamodb::Config::builder()\n        .stalled_stream_protection(StalledStreamProtectionConfig::disabled())\n        .credentials_provider(Credentials::for_tests())\n        .region(Region::new(\"us-east-1\"))\n        .retry_config(\n            RetryConfig::adaptive()\n                .with_max_attempts(4)\n                .with_use_static_exponential_base(true),\n        )\n        .time_source(SharedTimeSource::new(time_source))\n        .sleep_impl(SharedAsyncSleep::new(sleep_impl.clone()))\n        .retry_partition(RetryPartition::new(\n            \"test_adaptive_retries_with_throttling_errors\",\n        ))\n        .http_client(http_client.clone())\n        .build();\n    let expected_table_names = vec![\"Test\".to_owned()];\n\n    // We create a new client each time to ensure that the cross-client retry state is working.\n    let client = aws_sdk_dynamodb::Client::from_conf(config.clone());\n    let res = client.list_tables().send().await.unwrap();\n    assert_eq!(sleep_impl.total_duration(), Duration::from_secs(40));\n    assert_eq!(res.table_names(), expected_table_names.as_slice());\n    // Three requests should have been made, two failing & one success\n    assert_eq!(http_client.actual_requests().count(), 3);\n\n    let client = aws_sdk_dynamodb::Client::from_conf(config.clone());\n    let res = client.list_tables().send().await.unwrap();\n    assert!(Duration::from_secs(48) < sleep_impl.total_duration());\n    assert!(Duration::from_secs(49) > sleep_impl.total_duration());\n    assert_eq!(res.table_names(), expected_table_names.as_slice());\n    // Two requests should have been made, one failing & one success (plus previous requests)\n    assert_eq!(http_client.actual_requests().count(), 5);\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/dynamodb/tests/shared-config.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_sdk_dynamodb::config::{Credentials, Region, StalledStreamProtectionConfig};\nuse aws_smithy_http_client::test_util::capture_request;\nuse http_1x::Uri;\n\n/// Iterative test of loading clients from shared configuration\n#[tokio::test]\nasync fn shared_config_testbed() {\n    let shared_config = aws_types::SdkConfig::builder()\n        .region(Region::new(\"us-east-4\"))\n        .stalled_stream_protection(StalledStreamProtectionConfig::disabled())\n        .build();\n    let (http_client, request) = capture_request(None);\n    let conf = aws_sdk_dynamodb::config::Builder::from(&shared_config)\n        .credentials_provider(Credentials::for_tests())\n        .http_client(http_client)\n        .endpoint_url(\"http://localhost:8000\")\n        .build();\n    let svc = aws_sdk_dynamodb::Client::from_conf(conf);\n    let _ = svc.list_tables().send().await;\n    assert_eq!(\n        request.expect_request().uri(),\n        &Uri::from_static(\"http://localhost:8000\")\n    );\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/dynamodb/tests/test-error-classification.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::time::Duration;\n\nuse aws_credential_types::Credentials;\nuse aws_sdk_dynamodb::types::AttributeValue;\nuse aws_sdk_dynamodb::Client;\nuse aws_smithy_async::rt::sleep::{SharedAsyncSleep, TokioSleep};\nuse aws_smithy_http_client::test_util::wire::{ev, match_events, ReplayedEvent, WireMockServer};\nuse aws_smithy_types::retry::RetryConfig;\nuse aws_smithy_types::timeout::TimeoutConfig;\nuse aws_types::region::Region;\nuse bytes::Bytes;\n\nconst DYNAMO_THROTTLING_RESPONSE: &str = r#\"{\"__type\":\"com.amazonaws.dynamodb.v20120810#ThrottlingException\",\n\"message\":\"enhance your calm\"}\"#;\n\nconst DYNAMODB_DB_SUCCESS_RESPONSE: &str = r#\"{\"Count\":0,\"Items\":[],\"ScannedCount\":2}\"#;\n\n#[tokio::test]\nasync fn test_no_reconnect_500_throttling() {\n    assert_error_not_transient(ReplayedEvent::HttpResponse {\n        status: 500,\n        body: Bytes::from(DYNAMO_THROTTLING_RESPONSE),\n    })\n    .await\n}\n\n#[tokio::test]\nasync fn test_no_reconnect_429_throttling() {\n    assert_error_not_transient(ReplayedEvent::HttpResponse {\n        status: 429,\n        body: Bytes::from(DYNAMO_THROTTLING_RESPONSE),\n    })\n    .await\n}\n\nasync fn assert_error_not_transient(error: ReplayedEvent) {\n    let mock = WireMockServer::start(vec![\n        error,\n        ReplayedEvent::with_body(DYNAMODB_DB_SUCCESS_RESPONSE),\n    ])\n    .await;\n\n    let config = aws_sdk_dynamodb::Config::builder()\n        .region(Region::from_static(\"us-east-2\"))\n        .credentials_provider(Credentials::for_tests())\n        .sleep_impl(SharedAsyncSleep::new(TokioSleep::new()))\n        .endpoint_url(mock.endpoint_url())\n        .http_client(mock.http_client())\n        .timeout_config(\n            TimeoutConfig::builder()\n                .operation_attempt_timeout(Duration::from_millis(100))\n                .build(),\n        )\n        .retry_config(RetryConfig::standard())\n        .build();\n    let client = Client::from_conf(config);\n    let _item = client\n        .get_item()\n        .table_name(\"arn:aws:dynamodb:us-east-2:333333333333:table/table_name\")\n        .key(\"foo\", AttributeValue::Bool(true))\n        .send()\n        .await\n        .expect(\"should succeed\");\n    match_events!(ev!(dns), ev!(connect), _, ev!(http(200)))(&mock.events());\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/dynamodb/tests/timeouts.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::time::Duration;\n\nuse aws_credential_types::provider::SharedCredentialsProvider;\nuse aws_sdk_dynamodb::config::{Credentials, Region, StalledStreamProtectionConfig};\nuse aws_sdk_dynamodb::error::SdkError;\nuse aws_smithy_async::rt::sleep::{AsyncSleep, SharedAsyncSleep, Sleep};\nuse aws_smithy_http_client::test_util::NeverClient;\nuse aws_smithy_types::retry::RetryConfig;\nuse aws_smithy_types::timeout::TimeoutConfig;\nuse aws_types::SdkConfig;\n\n#[derive(Debug, Clone)]\nstruct InstantSleep;\nimpl AsyncSleep for InstantSleep {\n    fn sleep(&self, _duration: Duration) -> Sleep {\n        Sleep::new(Box::pin(async move {}))\n    }\n}\n\n#[tokio::test]\nasync fn api_call_timeout_retries() {\n    let http_client = NeverClient::new();\n    let conf = SdkConfig::builder()\n        .region(Region::new(\"us-east-2\"))\n        .http_client(http_client.clone())\n        .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests()))\n        .timeout_config(\n            TimeoutConfig::builder()\n                .operation_attempt_timeout(Duration::new(123, 0))\n                .build(),\n        )\n        .retry_config(RetryConfig::standard())\n        .stalled_stream_protection(StalledStreamProtectionConfig::disabled())\n        .sleep_impl(SharedAsyncSleep::new(InstantSleep))\n        .build();\n    let client = aws_sdk_dynamodb::Client::new(&conf);\n    let resp = client\n        .list_tables()\n        .send()\n        .await\n        .expect_err(\"call should fail\");\n    assert_eq!(\n        http_client.num_calls(),\n        3,\n        \"client level timeouts should be retried\"\n    );\n    assert!(\n        matches!(resp, SdkError::TimeoutError { .. }),\n        \"expected a timeout error, got: {}\",\n        resp\n    );\n}\n\n#[tokio::test]\nasync fn no_retries_on_operation_timeout() {\n    let http_client = NeverClient::new();\n    let conf = SdkConfig::builder()\n        .region(Region::new(\"us-east-2\"))\n        .http_client(http_client.clone())\n        .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests()))\n        .timeout_config(\n            TimeoutConfig::builder()\n                .operation_timeout(Duration::new(123, 0))\n                .build(),\n        )\n        .stalled_stream_protection(StalledStreamProtectionConfig::disabled())\n        .retry_config(RetryConfig::standard())\n        .sleep_impl(SharedAsyncSleep::new(InstantSleep))\n        .build();\n    let client = aws_sdk_dynamodb::Client::from_conf(aws_sdk_dynamodb::Config::new(&conf));\n    let resp = client\n        .list_tables()\n        .send()\n        .await\n        .expect_err(\"call should fail\");\n    assert_eq!(\n        http_client.num_calls(),\n        1,\n        \"operation level timeouts should not be retried\"\n    );\n    assert!(\n        matches!(resp, SdkError::TimeoutError { .. }),\n        \"expected a timeout error, got: {}\",\n        resp\n    );\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/ec2/Cargo.toml",
    "content": "[package]\nname = \"ec2-tests\"\nversion = \"0.1.0\"\nedition = \"2021\"\nlicense = \"Apache-2.0\"\nrepository = \"https://github.com/smithy-lang/smithy-rs\"\npublish = false\n\n[dev-dependencies]\naws-credential-types = { path = \"../../build/aws-sdk/sdk/aws-credential-types\", features = [\"test-util\"] }\naws-runtime = { path = \"../../build/aws-sdk/sdk/aws-runtime\", features = [\"test-util\"] }\naws-smithy-async = { path = \"../../build/aws-sdk/sdk/aws-smithy-async\", features = [\"test-util\"] }\naws-smithy-runtime = { path = \"../../build/aws-sdk/sdk/aws-smithy-runtime\", features = [\"client\", \"test-util\"] }\n# TODO(hyper1) - remove legacy-test-util feature by providing an http 1.x answer to take_requests() function\naws-smithy-http-client = { path = \"../../build/aws-sdk/sdk/aws-smithy-http-client\", features = [\"test-util\", \"legacy-test-util\"] }\naws-smithy-runtime-api = { path = \"../../build/aws-sdk/sdk/aws-smithy-runtime-api\", features = [\"client\", \"http-1x\"] }\naws-smithy-types = { path = \"../../build/aws-sdk/sdk/aws-smithy-types\" }\naws-sdk-ec2 = { path = \"../../build/aws-sdk/sdk/ec2\", features = [\"behavior-version-latest\", \"test-util\"] }\ntokio = { version = \"1.23.1\", features = [\"full\"]}\nhttp-1x = { package = \"http\", version = \"1\" }\ntokio-stream = \"0.1.5\"\n"
  },
  {
    "path": "aws/sdk/integration-tests/ec2/src/lib.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n"
  },
  {
    "path": "aws/sdk/integration-tests/ec2/tests/instance-status-ok-waiter-success.json",
    "content": "{\n  \"events\": [\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Request\": {\n          \"request\": {\n            \"uri\": \"https://ec2.us-west-2.amazonaws.com/\",\n            \"headers\": {\n              \"content-type\": [\n                \"application/x-www-form-urlencoded\"\n              ],\n              \"content-length\": [\n                \"73\"\n              ],\n              \"amz-sdk-request\": [\n                \"attempt=1; max=3\"\n              ]\n            },\n            \"method\": \"POST\"\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"Action=StartInstances&Version=2016-11-15&InstanceId.1=i-09fb4224219ac6902\"\n          },\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Response\": {\n          \"response\": {\n            \"Ok\": {\n              \"status\": 200,\n              \"headers\": {\n                \"x-amzn-requestid\": [\n                  \"bec35864-7ea6-430e-864e-229454f8b80d\"\n                ],\n                \"cache-control\": [\n                  \"no-cache, no-store\"\n                ],\n                \"strict-transport-security\": [\n                  \"max-age=31536000; includeSubDomains\"\n                ],\n                \"content-type\": [\n                  \"text/xml;charset=UTF-8\"\n                ],\n                \"content-length\": [\n                  \"579\"\n                ],\n                \"date\": [\n                  \"Fri, 19 Apr 2024 00:26:55 GMT\"\n                ],\n                \"server\": [\n                  \"AmazonEC2\"\n                ]\n              }\n            }\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?>\\n<StartInstancesResponse xmlns=\\\"http://ec2.amazonaws.com/doc/2016-11-15/\\\">\\n    <requestId>bec35864-7ea6-430e-864e-229454f8b80d</requestId>\\n    <instancesSet>\\n        <item>\\n            <instanceId>i-09fb4224219ac6902</instanceId>\\n            <currentState>\\n                <code>0</code>\\n                <name>pending</name>\\n            </currentState>\\n            <previousState>\\n                <code>80</code>\\n                <name>stopped</name>\\n            </previousState>\\n        </item>\\n    </instancesSet>\\n</StartInstancesResponse>\\n\"\n          },\n          \"direction\": \"Response\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Response\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 1,\n      \"action\": {\n        \"Request\": {\n          \"request\": {\n            \"uri\": \"https://ec2.us-west-2.amazonaws.com/\",\n            \"headers\": {\n              \"content-type\": [\n                \"application/x-www-form-urlencoded\"\n              ],\n              \"content-length\": [\n                \"81\"\n              ],\n              \"amz-sdk-request\": [\n                \"attempt=1; max=3\"\n              ]\n            },\n            \"method\": \"POST\"\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 1,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"Action=DescribeInstanceStatus&Version=2016-11-15&InstanceId.1=i-09fb4224219ac6902\"\n          },\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 1,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 1,\n      \"action\": {\n        \"Response\": {\n          \"response\": {\n            \"Ok\": {\n              \"status\": 200,\n              \"headers\": {\n                \"x-amzn-requestid\": [\n                  \"02147aa0-b2d0-41a3-afd7-570bb2d75151\"\n                ],\n                \"cache-control\": [\n                  \"no-cache, no-store\"\n                ],\n                \"strict-transport-security\": [\n                  \"max-age=31536000; includeSubDomains\"\n                ],\n                \"content-type\": [\n                  \"text/xml;charset=UTF-8\"\n                ],\n                \"content-length\": [\n                  \"243\"\n                ],\n                \"date\": [\n                  \"Fri, 19 Apr 2024 00:26:56 GMT\"\n                ],\n                \"server\": [\n                  \"AmazonEC2\"\n                ]\n              }\n            }\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 1,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?>\\n<DescribeInstanceStatusResponse xmlns=\\\"http://ec2.amazonaws.com/doc/2016-11-15/\\\">\\n    <requestId>02147aa0-b2d0-41a3-afd7-570bb2d75151</requestId>\\n    <instanceStatusSet/>\\n</DescribeInstanceStatusResponse>\"\n          },\n          \"direction\": \"Response\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 1,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Response\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 2,\n      \"action\": {\n        \"Request\": {\n          \"request\": {\n            \"uri\": \"https://ec2.us-west-2.amazonaws.com/\",\n            \"headers\": {\n              \"content-type\": [\n                \"application/x-www-form-urlencoded\"\n              ],\n              \"content-length\": [\n                \"81\"\n              ],\n              \"amz-sdk-request\": [\n                \"attempt=1; max=3\"\n              ]\n            },\n            \"method\": \"POST\"\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 2,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"Action=DescribeInstanceStatus&Version=2016-11-15&InstanceId.1=i-09fb4224219ac6902\"\n          },\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 2,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 2,\n      \"action\": {\n        \"Response\": {\n          \"response\": {\n            \"Ok\": {\n              \"status\": 200,\n              \"headers\": {\n                \"x-amzn-requestid\": [\n                  \"4ddc4e65-50f4-42f9-a327-ad1c1fa717c8\"\n                ],\n                \"cache-control\": [\n                  \"no-cache, no-store\"\n                ],\n                \"strict-transport-security\": [\n                  \"max-age=31536000; includeSubDomains\"\n                ],\n                \"content-type\": [\n                  \"text/xml;charset=UTF-8\"\n                ],\n                \"content-length\": [\n                  \"1171\"\n                ],\n                \"date\": [\n                  \"Fri, 19 Apr 2024 00:27:11 GMT\"\n                ],\n                \"server\": [\n                  \"AmazonEC2\"\n                ]\n              }\n            }\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 2,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?>\\n<DescribeInstanceStatusResponse xmlns=\\\"http://ec2.amazonaws.com/doc/2016-11-15/\\\">\\n    <requestId>4ddc4e65-50f4-42f9-a327-ad1c1fa717c8</requestId>\\n    <instanceStatusSet>\\n        <item>\\n            <instanceId>i-09fb4224219ac6902</instanceId>\\n            <availabilityZone>us-west-2d</availabilityZone>\\n            <instanceState>\\n                <code>16</code>\\n                <name>running</name>\\n            </instanceState>\\n            <systemStatus>\\n                <status>initializing</status>\\n                <details>\\n                    <item>\\n                        <name>reachability</name>\\n                        <status>initializing</status>\\n                    </item>\\n                </details>\\n            </systemStatus>\\n            <instanceStatus>\\n                <status>initializing</status>\\n                <details>\\n                    <item>\\n                        <name>reachability</name>\\n                        <status>initializing</status>\\n                    </item>\\n                </details>\\n            </instanceStatus>\\n        </item>\\n    </instanceStatusSet>\\n</DescribeInstanceStatusResponse>\"\n          },\n          \"direction\": \"Response\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 2,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Response\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 3,\n      \"action\": {\n        \"Request\": {\n          \"request\": {\n            \"uri\": \"https://ec2.us-west-2.amazonaws.com/\",\n            \"headers\": {\n              \"content-type\": [\n                \"application/x-www-form-urlencoded\"\n              ],\n              \"content-length\": [\n                \"81\"\n              ],\n              \"amz-sdk-request\": [\n                \"attempt=1; max=3\"\n              ]\n            },\n            \"method\": \"POST\"\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 3,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"Action=DescribeInstanceStatus&Version=2016-11-15&InstanceId.1=i-09fb4224219ac6902\"\n          },\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 3,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 3,\n      \"action\": {\n        \"Response\": {\n          \"response\": {\n            \"Ok\": {\n              \"status\": 200,\n              \"headers\": {\n                \"x-amzn-requestid\": [\n                  \"78adf8db-74c8-462e-98c5-17db37544534\"\n                ],\n                \"cache-control\": [\n                  \"no-cache, no-store\"\n                ],\n                \"strict-transport-security\": [\n                  \"max-age=31536000; includeSubDomains\"\n                ],\n                \"content-type\": [\n                  \"text/xml;charset=UTF-8\"\n                ],\n                \"content-length\": [\n                  \"1171\"\n                ],\n                \"date\": [\n                  \"Fri, 19 Apr 2024 00:27:39 GMT\"\n                ],\n                \"server\": [\n                  \"AmazonEC2\"\n                ]\n              }\n            }\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 3,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?>\\n<DescribeInstanceStatusResponse xmlns=\\\"http://ec2.amazonaws.com/doc/2016-11-15/\\\">\\n    <requestId>78adf8db-74c8-462e-98c5-17db37544534</requestId>\\n    <instanceStatusSet>\\n        <item>\\n            <instanceId>i-09fb4224219ac6902</instanceId>\\n            <availabilityZone>us-west-2d</availabilityZone>\\n            <instanceState>\\n                <code>16</code>\\n                <name>running</name>\\n            </instanceState>\\n            <systemStatus>\\n                <status>initializing</status>\\n                <details>\\n                    <item>\\n                        <name>reachability</name>\\n                        <status>initializing</status>\\n                    </item>\\n                </details>\\n            </systemStatus>\\n            <instanceStatus>\\n                <status>initializing</status>\\n                <details>\\n                    <item>\\n                        <name>reachability</name>\\n                        <status>initializing</status>\\n                    </item>\\n                </details>\\n            </instanceStatus>\\n        </item>\\n    </instanceStatusSet>\\n</DescribeInstanceStatusResponse>\"\n          },\n          \"direction\": \"Response\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 3,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Response\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 4,\n      \"action\": {\n        \"Request\": {\n          \"request\": {\n            \"uri\": \"https://ec2.us-west-2.amazonaws.com/\",\n            \"headers\": {\n              \"content-type\": [\n                \"application/x-www-form-urlencoded\"\n              ],\n              \"content-length\": [\n                \"81\"\n              ],\n              \"amz-sdk-request\": [\n                \"attempt=1; max=3\"\n              ]\n            },\n            \"method\": \"POST\"\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 4,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"Action=DescribeInstanceStatus&Version=2016-11-15&InstanceId.1=i-09fb4224219ac6902\"\n          },\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 4,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 4,\n      \"action\": {\n        \"Response\": {\n          \"response\": {\n            \"Ok\": {\n              \"status\": 200,\n              \"headers\": {\n                \"x-amzn-requestid\": [\n                  \"48fb29e8-5b25-4854-a127-586f1b0ff62c\"\n                ],\n                \"cache-control\": [\n                  \"no-cache, no-store\"\n                ],\n                \"strict-transport-security\": [\n                  \"max-age=31536000; includeSubDomains\"\n                ],\n                \"content-type\": [\n                  \"text/xml;charset=UTF-8\"\n                ],\n                \"content-length\": [\n                  \"1171\"\n                ],\n                \"date\": [\n                  \"Fri, 19 Apr 2024 00:28:34 GMT\"\n                ],\n                \"server\": [\n                  \"AmazonEC2\"\n                ]\n              }\n            }\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 4,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?>\\n<DescribeInstanceStatusResponse xmlns=\\\"http://ec2.amazonaws.com/doc/2016-11-15/\\\">\\n    <requestId>48fb29e8-5b25-4854-a127-586f1b0ff62c</requestId>\\n    <instanceStatusSet>\\n        <item>\\n            <instanceId>i-09fb4224219ac6902</instanceId>\\n            <availabilityZone>us-west-2d</availabilityZone>\\n            <instanceState>\\n                <code>16</code>\\n                <name>running</name>\\n            </instanceState>\\n            <systemStatus>\\n                <status>initializing</status>\\n                <details>\\n                    <item>\\n                        <name>reachability</name>\\n                        <status>initializing</status>\\n                    </item>\\n                </details>\\n            </systemStatus>\\n            <instanceStatus>\\n                <status>initializing</status>\\n                <details>\\n                    <item>\\n                        <name>reachability</name>\\n                        <status>initializing</status>\\n                    </item>\\n                </details>\\n            </instanceStatus>\\n        </item>\\n    </instanceStatusSet>\\n</DescribeInstanceStatusResponse>\"\n          },\n          \"direction\": \"Response\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 4,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Response\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 5,\n      \"action\": {\n        \"Request\": {\n          \"request\": {\n            \"uri\": \"https://ec2.us-west-2.amazonaws.com/\",\n            \"headers\": {\n              \"content-type\": [\n                \"application/x-www-form-urlencoded\"\n              ],\n              \"content-length\": [\n                \"81\"\n              ],\n              \"amz-sdk-request\": [\n                \"attempt=1; max=3\"\n              ]\n            },\n            \"method\": \"POST\"\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 5,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"Action=DescribeInstanceStatus&Version=2016-11-15&InstanceId.1=i-09fb4224219ac6902\"\n          },\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 5,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 5,\n      \"action\": {\n        \"Response\": {\n          \"response\": {\n            \"Ok\": {\n              \"status\": 200,\n              \"headers\": {\n                \"x-amzn-requestid\": [\n                  \"c9b9b2a0-ddbc-4ea8-a76a-4339a9a99de4\"\n                ],\n                \"cache-control\": [\n                  \"no-cache, no-store\"\n                ],\n                \"strict-transport-security\": [\n                  \"max-age=31536000; includeSubDomains\"\n                ],\n                \"content-type\": [\n                  \"text/xml;charset=UTF-8\"\n                ],\n                \"content-length\": [\n                  \"1139\"\n                ],\n                \"date\": [\n                  \"Fri, 19 Apr 2024 00:29:53 GMT\"\n                ],\n                \"server\": [\n                  \"AmazonEC2\"\n                ]\n              }\n            }\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 5,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?>\\n<DescribeInstanceStatusResponse xmlns=\\\"http://ec2.amazonaws.com/doc/2016-11-15/\\\">\\n    <requestId>c9b9b2a0-ddbc-4ea8-a76a-4339a9a99de4</requestId>\\n    <instanceStatusSet>\\n        <item>\\n            <instanceId>i-09fb4224219ac6902</instanceId>\\n            <availabilityZone>us-west-2d</availabilityZone>\\n            <instanceState>\\n                <code>16</code>\\n                <name>running</name>\\n            </instanceState>\\n            <systemStatus>\\n                <status>ok</status>\\n                <details>\\n                    <item>\\n                        <name>reachability</name>\\n                        <status>passed</status>\\n                    </item>\\n                </details>\\n            </systemStatus>\\n            <instanceStatus>\\n                <status>ok</status>\\n                <details>\\n                    <item>\\n                        <name>reachability</name>\\n                        <status>passed</status>\\n                    </item>\\n                </details>\\n            </instanceStatus>\\n        </item>\\n    </instanceStatusSet>\\n</DescribeInstanceStatusResponse>\"\n          },\n          \"direction\": \"Response\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 5,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Response\"\n        }\n      }\n    }\n  ],\n  \"docs\": \"traffic recording of EC2 start_instance followed by EC2 wait_until_instance_status_ok being successful\",\n  \"version\": \"V0\"\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/ec2/tests/paginators.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_runtime::user_agent::test_util::assert_ua_contains_metric_values;\nuse aws_sdk_ec2::{config::Credentials, config::Region, types::InstanceType, Client, Config};\nuse aws_smithy_http_client::test_util::capture_request;\nuse aws_smithy_runtime_api::client::http::HttpClient;\nuse aws_smithy_types::body::SdkBody;\nuse std::collections::HashSet;\n\nfn stub_config(http_client: impl HttpClient + 'static) -> Config {\n    Config::builder()\n        .region(Region::new(\"us-east-1\"))\n        .credentials_provider(Credentials::for_tests())\n        .http_client(http_client)\n        .build()\n}\n\nfn validate_query_string(expected_str: &str, actual_str: &str) {\n    assert_eq!(expected_str.len(), actual_str.len());\n    let expected = expected_str.split('&').collect::<HashSet<_>>();\n    let actual = actual_str.split('&').collect::<HashSet<_>>();\n    assert_eq!(expected, actual);\n}\n\n/// See https://github.com/awslabs/aws-sdk-rust/issues/391\n///\n/// EC2 replies with `<nextToken></nextToken>` which our XML parser parses as empty string and not \"none\"\n#[tokio::test]\nasync fn paginators_handle_empty_tokens() {\n    let response = r#\"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n        <DescribeSpotPriceHistoryResponse xmlns=\"http://ec2.amazonaws.com/doc/2016-11-15/\">\n            <requestId>edf3e86c-4baf-47c1-9228-9a5ea09542e8</requestId>\n            <spotPriceHistorySet/>\n            <nextToken></nextToken>\n        </DescribeSpotPriceHistoryResponse>\"#;\n    let response = http_1x::Response::builder()\n        .status(200)\n        .body(SdkBody::from(response))\n        .unwrap();\n    let (http_client, captured_request) = capture_request(Some(response));\n    let client = Client::from_conf(stub_config(http_client.clone()));\n    let instance_type = InstanceType::from(\"g5.48xlarge\");\n    let mut paginator = client\n        .describe_spot_price_history()\n        .instance_types(instance_type)\n        .product_descriptions(\"Linux/UNIX\")\n        .availability_zone(\"eu-north-1a\")\n        .into_paginator()\n        .items()\n        .send();\n    let first_item = paginator.try_next().await.expect(\"success\");\n    assert_eq!(first_item, None);\n    let req = captured_request.expect_request();\n    let actual_body = std::str::from_utf8(req.body().bytes().unwrap()).unwrap();\n    let expected_body = \"Action=DescribeSpotPriceHistory&Version=2016-11-15&AvailabilityZone=eu-north-1a&InstanceType.1=g5.48xlarge&ProductDescription.1=Linux%2FUNIX\";\n    validate_query_string(expected_body, actual_body);\n}\n\n/// See https://github.com/awslabs/aws-sdk-rust/issues/405\n///\n/// EC2 can also reply with the token truly unset which will be interpreted as `None`\n#[tokio::test]\nasync fn paginators_handle_unset_tokens() {\n    let response = r#\"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n        <DescribeSpotPriceHistoryResponse xmlns=\"http://ec2.amazonaws.com/doc/2016-11-15/\">\n            <requestId>edf3e86c-4baf-47c1-9228-9a5ea09542e8</requestId>\n            <spotPriceHistorySet/>\n        </DescribeSpotPriceHistoryResponse>\"#;\n    let response = http_1x::Response::builder()\n        .status(200)\n        .body(SdkBody::from(response))\n        .unwrap();\n    let (http_client, captured_request) = capture_request(Some(response));\n    let client = Client::from_conf(stub_config(http_client.clone()));\n    let instance_type = InstanceType::from(\"g5.48xlarge\");\n    let mut paginator = client\n        .describe_spot_price_history()\n        .instance_types(instance_type)\n        .product_descriptions(\"Linux/UNIX\")\n        .availability_zone(\"eu-north-1a\")\n        .into_paginator()\n        .items()\n        .send();\n    let first_item = paginator.try_next().await.expect(\"success\");\n    assert_eq!(first_item, None);\n    let req = captured_request.expect_request();\n    let actual_body = std::str::from_utf8(req.body().bytes().unwrap()).unwrap();\n    let expected_body = \"Action=DescribeSpotPriceHistory&Version=2016-11-15&AvailabilityZone=eu-north-1a&InstanceType.1=g5.48xlarge&ProductDescription.1=Linux%2FUNIX\";\n    validate_query_string(expected_body, actual_body);\n}\n\n#[tokio::test]\nasync fn should_emit_business_metric_for_paginator_in_user_agent() {\n    let (http_client, captured_request) = capture_request(None);\n    let client = Client::from_conf(stub_config(http_client.clone()));\n    let instance_type = InstanceType::from(\"g5.48xlarge\");\n    let _ = client\n        .describe_spot_price_history()\n        .instance_types(instance_type)\n        .product_descriptions(\"Linux/UNIX\")\n        .availability_zone(\"eu-north-1a\")\n        .into_paginator()\n        .items()\n        .send()\n        .collect::<Vec<_>>()\n        .await;\n    let expected_req = captured_request.expect_request();\n    let user_agent = expected_req.headers().get(\"x-amz-user-agent\").unwrap();\n    assert_ua_contains_metric_values(user_agent, &[\"C\"]);\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/ec2/tests/waiters.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_runtime::user_agent::test_util::assert_ua_contains_metric_values;\nuse aws_sdk_ec2::{client::Waiters, config::Region, error::DisplayErrorContext, Client};\nuse aws_smithy_async::test_util::tick_advance_sleep::{\n    tick_advance_time_and_sleep, TickAdvanceTime,\n};\nuse aws_smithy_http_client::test_util::dvr::ReplayingClient;\nuse aws_smithy_runtime::test_util::capture_test_logs::show_test_logs;\nuse aws_smithy_runtime_api::client::waiters::error::WaiterError;\nuse aws_smithy_types::retry::RetryConfig;\nuse std::time::Duration;\n\nasync fn prerequisites() -> (Client, ReplayingClient, TickAdvanceTime) {\n    let (time_source, sleep_impl) = tick_advance_time_and_sleep();\n    let client =\n        ReplayingClient::from_file(\"tests/instance-status-ok-waiter-success.json\").unwrap();\n    let config = aws_sdk_ec2::Config::builder()\n        .with_test_defaults()\n        .http_client(client.clone())\n        .time_source(time_source.clone())\n        .sleep_impl(sleep_impl)\n        .region(Region::new(\"us-west-2\"))\n        .retry_config(RetryConfig::standard())\n        .build();\n    (aws_sdk_ec2::Client::from_conf(config), client, time_source)\n}\n\n#[tokio::test]\nasync fn waiters_success() {\n    let _logs = show_test_logs();\n\n    let (ec2, http_client, time_source) = prerequisites().await;\n\n    ec2.start_instances()\n        .instance_ids(\"i-09fb4224219ac6902\")\n        .send()\n        .await\n        .unwrap();\n\n    let waiter_task = tokio::spawn(\n        ec2.wait_until_instance_status_ok()\n            .instance_ids(\"i-09fb4224219ac6902\")\n            .wait(Duration::from_secs(300)),\n    );\n\n    // The responses in the test data will make the waiter poll a few times, so it will take some time\n    // to complete. If successful, it shouldn't take a full 300 seconds. However, in the event it isn't successful,\n    // waiting the full 300 seconds will result in a max time exceeded error instead of a never ending test.\n    time_source.tick(Duration::from_secs(305)).await;\n    waiter_task.await.unwrap().unwrap();\n\n    http_client.full_validate(\"application/xml\").await.unwrap();\n}\n\n#[tokio::test]\nasync fn waiters_exceed_max_wait_time() {\n    let _logs = show_test_logs();\n\n    let (ec2, _, time_source) = prerequisites().await;\n\n    ec2.start_instances()\n        .instance_ids(\"i-09fb4224219ac6902\")\n        .send()\n        .await\n        .unwrap();\n\n    let waiter_task = tokio::spawn(\n        ec2.wait_until_instance_status_ok()\n            .instance_ids(\"i-09fb4224219ac6902\")\n            .wait(Duration::from_secs(30)),\n    );\n\n    time_source.tick(Duration::from_secs(35)).await;\n    let err = waiter_task.await.unwrap().err().expect(\"should fail\");\n    match err {\n        WaiterError::ExceededMaxWait(context) => {\n            assert_eq!(30, context.max_wait().as_secs());\n            assert_eq!(30, context.elapsed().as_secs());\n            assert_eq!(3, context.poll_count());\n        }\n        err => panic!(\"unexpected error: {}\", DisplayErrorContext(&err)),\n    }\n}\n\n#[tokio::test]\nasync fn should_emit_business_metric_for_waiter_in_user_agent() {\n    // This function has the same setup and execution as `waiters_success`, but differs in the verification step.\n    // Because `full_validate` consumes the recorded requests after being called, we need a separate test\n    // to examine these requests.\n\n    let _logs = show_test_logs();\n\n    let (ec2, http_client, time_source) = prerequisites().await;\n\n    ec2.start_instances()\n        .instance_ids(\"i-09fb4224219ac6902\")\n        .send()\n        .await\n        .unwrap();\n\n    let waiter_task = tokio::spawn(\n        ec2.wait_until_instance_status_ok()\n            .instance_ids(\"i-09fb4224219ac6902\")\n            .wait(Duration::from_secs(300)),\n    );\n\n    time_source.tick(Duration::from_secs(305)).await;\n    waiter_task.await.unwrap().unwrap();\n\n    // Verify the corresponding business metric value has been emitted\n    let actual_requests = http_client.take_requests().await;\n    let user_agent_in_last_request = actual_requests\n        .last()\n        .unwrap()\n        .headers()\n        .get(\"x-amz-user-agent\")\n        .unwrap()\n        .to_str()\n        .unwrap();\n    assert_ua_contains_metric_values(user_agent_in_last_request, &[\"B\"]);\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/glacier/Cargo.toml",
    "content": "# This Cargo.toml is unused in generated code. It exists solely to enable these tests to compile in-situ\n[package]\nname = \"glacier-tests\"\nversion = \"0.1.0\"\nauthors = [\"AWS Rust SDK Team <aws-sdk-rust@amazon.com>\"]\nedition = \"2021\"\nlicense = \"Apache-2.0\"\nrepository = \"https://github.com/smithy-lang/smithy-rs\"\npublish = false\n\n# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html\n\n[dev-dependencies]\naws-credential-types = { path = \"../../build/aws-sdk/sdk/aws-credential-types\", features = [\"test-util\"] }\naws-sdk-glacier = { path = \"../../build/aws-sdk/sdk/glacier\", features = [\"behavior-version-latest\"] }\naws-smithy-protocol-test = { path = \"../../build/aws-sdk/sdk/aws-smithy-protocol-test\"}\naws-smithy-runtime = { path = \"../../build/aws-sdk/sdk/aws-smithy-runtime\", features = [\"client\"] }\naws-smithy-http-client = { path = \"../../build/aws-sdk/sdk/aws-smithy-http-client\", features = [\"test-util\"] }\nbytes = \"1.0.0\"\nhttp-1x = { package = \"http\", version = \"1\" }\ntokio = { version = \"1.23.1\", features = [\"full\", \"test-util\"]}\ntracing-subscriber = { version = \"0.3.15\", features = [\"env-filter\"] }\n"
  },
  {
    "path": "aws/sdk/integration-tests/glacier/tests/custom-headers.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_sdk_glacier::config::{Credentials, Region};\nuse aws_sdk_glacier::primitives::ByteStream;\nuse aws_smithy_http_client::test_util::capture_request;\nuse aws_smithy_protocol_test::{assert_ok, validate_headers};\n\n#[tokio::test]\nasync fn set_correct_headers() {\n    let (http_client, handler) = capture_request(None);\n    let conf = aws_sdk_glacier::Config::builder()\n        .region(Region::new(\"us-east-1\"))\n        .credentials_provider(Credentials::for_tests())\n        .http_client(http_client)\n        .build();\n\n    let client = aws_sdk_glacier::Client::from_conf(conf);\n    let _resp = client\n        .upload_archive()\n        .vault_name(\"vault\")\n        .body(ByteStream::from_path(\"tests/test-file.txt\").await.unwrap())\n        .send()\n        .await;\n    let req = handler.expect_request();\n    assert_ok(validate_headers(\n        req.headers(),\n        [\n            (\n                \"x-amz-sha256-tree-hash\",\n                \"2af02ea61585d13604b26ae314a99fc8e972d1f11daba655a68681843cfced9f\",\n            ),\n            (\n                \"x-amz-content-sha256\",\n                \"2af02ea61585d13604b26ae314a99fc8e972d1f11daba655a68681843cfced9f\",\n            ),\n        ],\n    ));\n}\n\n#[tokio::test]\nasync fn autofill_account_id() {\n    let (http_client, handler) = capture_request(None);\n    let conf = aws_sdk_glacier::Config::builder()\n        .region(Region::new(\"us-east-1\"))\n        .credentials_provider(Credentials::for_tests())\n        .http_client(http_client)\n        .build();\n\n    let client = aws_sdk_glacier::Client::from_conf(conf);\n    let _resp = client\n        .abort_multipart_upload()\n        .vault_name(\"vault\")\n        .upload_id(\"some/upload/id\")\n        .send()\n        .await;\n    let req = handler.expect_request();\n    assert_eq!(\n        \"https://glacier.us-east-1.amazonaws.com/-/vaults/vault/multipart-uploads/some%2Fupload%2Fid\",\n        req.uri()\n    );\n}\n\n#[tokio::test]\nasync fn api_version_set() {\n    let (http_client, handler) = capture_request(None);\n    let conf = aws_sdk_glacier::Config::builder()\n        .region(Region::new(\"us-east-1\"))\n        .credentials_provider(Credentials::for_tests())\n        .http_client(http_client)\n        .build();\n\n    let client = aws_sdk_glacier::Client::from_conf(conf);\n    let _resp = client\n        .abort_multipart_upload()\n        .vault_name(\"vault\")\n        .upload_id(\"some/upload/id\")\n        .send()\n        .await;\n    let req = handler.expect_request();\n    assert_ok(validate_headers(\n        req.headers(),\n        [(\"x-amz-glacier-version\", \"2012-06-01\")],\n    ));\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/glacier/tests/test-file.txt",
    "content": "this is a test file that will be uploaded to glacier.\n"
  },
  {
    "path": "aws/sdk/integration-tests/iam/Cargo.toml",
    "content": "# This Cargo.toml is unused in generated code. It exists solely to enable these tests to compile in-situ\n[package]\nname = \"iam-tests\"\nversion = \"0.1.0\"\nauthors = [\"AWS Rust SDK Team <aws-sdk-rust@amazon.com>\"]\nedition = \"2021\"\nlicense = \"Apache-2.0\"\nrepository = \"https://github.com/smithy-lang/smithy-rs\"\npublish = false\n\n# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html\n\n[dev-dependencies]\naws-credential-types = { path = \"../../build/aws-sdk/sdk/aws-credential-types\", features = [\"test-util\"] }\naws-sdk-iam = { path = \"../../build/aws-sdk/sdk/iam\", features = [\"behavior-version-latest\"] }\naws-smithy-runtime = { path = \"../../build/aws-sdk/sdk/aws-smithy-runtime\", features = [\"client\"] }\naws-smithy-http-client = { path = \"../../build/aws-sdk/sdk/aws-smithy-http-client\", features = [\"test-util\"] }\naws-smithy-types = { path = \"../../build/aws-sdk/sdk/aws-smithy-types\" }\nbytes = \"1.0.0\"\nhttp-1x = { package = \"http\", version = \"1\" }\ntokio = { version = \"1.23.1\", features = [\"full\", \"test-util\"]}\ntracing-subscriber = { version = \"0.3.15\", features = [\"env-filter\"] }\n"
  },
  {
    "path": "aws/sdk/integration-tests/iam/tests/resolve-global-endpoint.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_sdk_iam::config::{Credentials, Region};\nuse aws_smithy_http_client::test_util::capture_request;\n\n#[tokio::test]\nasync fn correct_endpoint_resolver() {\n    let (http_client, request) = capture_request(None);\n    let conf = aws_sdk_iam::Config::builder()\n        .credentials_provider(Credentials::for_tests())\n        .use_fips(true)\n        .region(Region::new(\"us-east-1\"))\n        .http_client(http_client)\n        .build();\n    let client = aws_sdk_iam::Client::from_conf(conf);\n    let _ = dbg!(client.list_roles().send().await);\n    let req = request.expect_request();\n    assert_eq!(&req.uri().to_string(), \"https://iam-fips.amazonaws.com/\");\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/kms/Cargo.toml",
    "content": "# This Cargo.toml is unused in generated code. It exists solely to enable these tests to compile in-situ\n[package]\nname = \"kms-tests\"\nversion = \"0.1.0\"\nauthors = [\"Russell Cohen <rcoh@amazon.com>\"]\nedition = \"2021\"\nlicense = \"Apache-2.0\"\nrepository = \"https://github.com/smithy-lang/smithy-rs\"\npublish = false\n\n# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html\n\n[features]\ndefault = [\"test-util\"]\ntest-util = []\n\n[dev-dependencies]\naws-credential-types = { path = \"../../build/aws-sdk/sdk/aws-credential-types\", features = [\"test-util\"] }\naws-runtime = { path = \"../../build/aws-sdk/sdk/aws-runtime\" }\naws-sdk-kms = { path = \"../../build/aws-sdk/sdk/kms\", features = [\"test-util\", \"behavior-version-latest\"] }\naws-smithy-async = { path = \"../../build/aws-sdk/sdk/aws-smithy-async\", features = [\"test-util\"] }\naws-smithy-http = { path = \"../../build/aws-sdk/sdk/aws-smithy-http\" }\naws-smithy-types = { path = \"../../build/aws-sdk/sdk/aws-smithy-types\" }\naws-smithy-runtime = { path = \"../../build/aws-sdk/sdk/aws-smithy-runtime\", features = [\"client\"] }\naws-smithy-http-client = { path = \"../../build/aws-sdk/sdk/aws-smithy-http-client\", features = [\"test-util\"] }\naws-smithy-runtime-api = { path = \"../../build/aws-sdk/sdk/aws-smithy-runtime-api\", features = [\"test-util\"] }\nbytes = \"1.0.0\"\nhttp-1x = { package = \"http\", version = \"1\" }\ntokio = { version = \"1.23.1\", features = [\"full\", \"test-util\"] }\ntracing-subscriber = { version = \"0.3.15\", features = [\"env-filter\"] }\n"
  },
  {
    "path": "aws/sdk/integration-tests/kms/tests/integration.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_sdk_kms as kms;\nuse aws_sdk_kms::operation::RequestId;\nuse aws_smithy_http_client::test_util::{ReplayEvent, StaticReplayClient};\nuse aws_smithy_runtime_api::client::result::SdkError;\nuse aws_smithy_types::body::SdkBody;\nuse http_1x::Uri;\nuse kms::config::{Config, Credentials, Region};\n\n// TODO(DVR): having the full HTTP requests right in the code is a bit gross, consider something\n// like https://github.com/davidbarsky/sigv4/blob/master/aws-sigv4/src/lib.rs#L283-L315 to store\n// the requests/responses externally\n\n/// Validate that for CN regions we set the URI correctly\n#[tokio::test]\nasync fn generate_random_cn() {\n    let http_client= StaticReplayClient::new(vec![ReplayEvent::new(\n        http_1x::Request::builder()\n            .uri(Uri::from_static(\"https://kms.cn-north-1.amazonaws.com.cn/\"))\n            .body(SdkBody::from(r#\"{\"NumberOfBytes\":64}\"#)).unwrap(),\n        http_1x::Response::builder()\n            .status(http_1x::StatusCode::from_u16(200).unwrap())\n            .body(SdkBody::from(r#\"{\"Plaintext\":\"6CG0fbzzhg5G2VcFCPmJMJ8Njv3voYCgrGlp3+BZe7eDweCXgiyDH9BnkKvLmS7gQhnYDUlyES3fZVGwv5+CxA==\"}\"#)).unwrap())\n    ]);\n    let conf = Config::builder()\n        .http_client(http_client.clone())\n        .region(Region::new(\"cn-north-1\"))\n        .credentials_provider(Credentials::for_tests())\n        .build();\n    let client = kms::Client::from_conf(conf);\n    let _ = client\n        .generate_random()\n        .number_of_bytes(64)\n        .send()\n        .await\n        .expect(\"success\");\n\n    assert_eq!(http_client.actual_requests().count(), 1);\n    http_client.assert_requests_match(&[]);\n}\n\n#[cfg(feature = \"test-util\")]\n#[tokio::test]\nasync fn generate_random() {\n    let http_client = StaticReplayClient::new(vec![ReplayEvent::new(\n        http_1x::Request::builder()\n            .header(\"content-type\", \"application/x-amz-json-1.1\")\n            .header(\"x-amz-target\", \"TrentService.GenerateRandom\")\n            .header(\"content-length\", \"20\")\n            .header(\"authorization\", \"AWS4-HMAC-SHA256 Credential=ANOTREAL/20090213/us-east-1/kms/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-date;x-amz-target;x-amz-user-agent, Signature=53dcf70f6f852cb576185dcabef5aaa3d068704cf1b7ea7dc644efeaa46674d7\")\n            .header(\"x-amz-date\", \"20090213T233130Z\")\n            .header(\"user-agent\", \"aws-sdk-rust/0.123.test os/windows/XPSP3 lang/rust/1.50.0\")\n            .header(\"x-amz-user-agent\", \"aws-sdk-rust/0.123.test api/test-service/0.123 os/windows/XPSP3 lang/rust/1.50.0\")\n            .uri(Uri::from_static(\"https://kms.us-east-1.amazonaws.com/\"))\n            .body(SdkBody::from(r#\"{\"NumberOfBytes\":64}\"#)).unwrap(),\n        http_1x::Response::builder()\n            .status(http_1x::StatusCode::from_u16(200).unwrap())\n            .body(SdkBody::from(r#\"{\"Plaintext\":\"6CG0fbzzhg5G2VcFCPmJMJ8Njv3voYCgrGlp3+BZe7eDweCXgiyDH9BnkKvLmS7gQhnYDUlyES3fZVGwv5+CxA==\"}\"#)).unwrap())\n    ]);\n    let conf = Config::builder()\n        .http_client(http_client.clone())\n        .region(Region::new(\"us-east-1\"))\n        .credentials_provider(Credentials::for_tests_with_session_token())\n        .with_test_defaults()\n        .build();\n    let client = kms::Client::from_conf(conf);\n    let resp = client\n        .generate_random()\n        .number_of_bytes(64)\n        .customize()\n        .mutate_request(|req| {\n            // Remove the invocation ID since the signed request above doesn't have it\n            req.headers_mut().remove(\"amz-sdk-invocation-id\");\n        })\n        .send()\n        .await\n        .expect(\"request should succeed\");\n    // primitive checksum\n    assert_eq!(\n        resp.plaintext\n            .expect(\"blob should exist\")\n            .as_ref()\n            .iter()\n            .map(|i| *i as u32)\n            .sum::<u32>(),\n        8562\n    );\n    http_client.relaxed_requests_match();\n}\n\n#[tokio::test]\nasync fn generate_random_malformed_response() {\n    let http_client = StaticReplayClient::new(vec![ReplayEvent::new(\n        http_1x::Request::builder().body(SdkBody::from(r#\"{\"NumberOfBytes\":64}\"#)).unwrap(),\n        http_1x::Response::builder()\n            .status(http_1x::StatusCode::from_u16(200).unwrap())\n            // last `}` replaced with a space, invalid JSON\n            .body(SdkBody::from(r#\"{\"Plaintext\":\"6CG0fbzzhg5G2VcFCPmJMJ8Njv3voYCgrGlp3+BZe7eDweCXgiyDH9BnkKvLmS7gQhnYDUlyES3fZVGwv5+CxA==\" \"#)).unwrap())\n    ]);\n    let conf = Config::builder()\n        .http_client(http_client.clone())\n        .region(Region::new(\"us-east-1\"))\n        .credentials_provider(Credentials::for_tests())\n        .build();\n    let client = kms::Client::from_conf(conf);\n    client\n        .generate_random()\n        .number_of_bytes(64)\n        .send()\n        .await\n        .expect_err(\"response was malformed\");\n}\n\n#[cfg(feature = \"test-util\")]\n#[tokio::test]\nasync fn generate_random_keystore_not_found() {\n    let http_client = StaticReplayClient::new(vec![ReplayEvent::new(\n        http_1x::Request::builder()\n            .header(\"content-type\", \"application/x-amz-json-1.1\")\n            .header(\"x-amz-target\", \"TrentService.GenerateRandom\")\n            .header(\"content-length\", \"56\")\n            .header(\"authorization\", \"AWS4-HMAC-SHA256 Credential=ANOTREAL/20090213/us-east-1/kms/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-target, Signature=ffef92c6b75d66cc511daa896eb4a085ec053a2592e17d1f22ecaf167f2fa4bb\")\n            .header(\"x-amz-date\", \"20090213T233130Z\")\n            .header(\"user-agent\", \"aws-sdk-rust/0.123.test os/windows/XPSP3 lang/rust/1.50.0\")\n            .header(\"x-amz-user-agent\", \"aws-sdk-rust/0.123.test api/test-service/0.123 os/windows/XPSP3 lang/rust/1.50.0\")\n            .uri(Uri::from_static(\"https://kms.us-east-1.amazonaws.com/\"))\n            .body(SdkBody::from(r#\"{\"NumberOfBytes\":64,\"CustomKeyStoreId\":\"does not exist\"}\"#)).unwrap(),\n        http_1x::Response::builder()\n            .status(http_1x::StatusCode::from_u16(400).unwrap())\n            .header(\"x-amzn-requestid\", \"bfe81a0a-9a08-4e71-9910-cdb5ab6ea3b6\")\n            .header(\"cache-control\", \"no-cache, no-store, must-revalidate, private\")\n            .header(\"expires\", \"0\")\n            .header(\"pragma\", \"no-cache\")\n            .header(\"date\", \"Fri, 05 Mar 2021 15:01:40 GMT\")\n            .header(\"content-type\", \"application/x-amz-json-1.1\")\n            .header(\"content-length\", \"44\")\n            .body(SdkBody::from(r#\"{\"__type\":\"CustomKeyStoreNotFoundException\"}\"#)).unwrap())\n    ]);\n    let conf = Config::builder()\n        .http_client(http_client.clone())\n        .region(Region::new(\"us-east-1\"))\n        .credentials_provider(Credentials::for_tests_with_session_token())\n        .with_test_defaults()\n        .build();\n    let client = kms::Client::from_conf(conf);\n\n    let err = client\n        .generate_random()\n        .number_of_bytes(64)\n        .custom_key_store_id(\"does not exist\")\n        .send()\n        .await\n        .expect_err(\"key store doesn't exist\");\n\n    let inner = match err {\n        SdkError::ServiceError(context) => context.into_err(),\n        other => panic!(\"Incorrect error received: {:}\", other),\n    };\n    assert!(inner.is_custom_key_store_not_found_exception());\n    assert_eq!(\n        inner.request_id(),\n        Some(\"bfe81a0a-9a08-4e71-9910-cdb5ab6ea3b6\")\n    );\n    http_client.relaxed_requests_match();\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/kms/tests/retryable_errors.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_credential_types::Credentials;\nuse aws_runtime::retries::classifiers::AwsErrorCodeClassifier;\nuse aws_sdk_kms as kms;\nuse aws_smithy_http_client::test_util::infallible_client_fn;\nuse aws_smithy_runtime_api::client::interceptors::context::{Error, Input, InterceptorContext};\nuse aws_smithy_runtime_api::client::orchestrator::{HttpResponse, OrchestratorError};\nuse aws_smithy_runtime_api::client::result::SdkError;\nuse aws_smithy_runtime_api::client::retries::classifiers::{ClassifyRetry, RetryAction};\nuse bytes::Bytes;\nuse kms::operation::create_alias::CreateAliasError;\n\nasync fn make_err(\n    response: impl Fn() -> http_1x::Response<Bytes> + Send + Sync + 'static,\n) -> SdkError<CreateAliasError, HttpResponse> {\n    let http_client = infallible_client_fn(move |_| response());\n    let conf = kms::Config::builder()\n        .http_client(http_client)\n        .credentials_provider(Credentials::for_tests())\n        .region(kms::config::Region::from_static(\"us-east-1\"))\n        .build();\n    let client = kms::Client::from_conf(conf);\n    client\n        .create_alias()\n        .send()\n        .await\n        .expect_err(\"response was a failure\")\n}\n\n/// Parse a semi-real response body and assert that the correct retry status is returned\n#[tokio::test]\nasync fn errors_are_retryable() {\n    let err = make_err(|| {\n        http_1x::Response::builder()\n            .status(400)\n            .body(Bytes::from_static(\n                br#\"{ \"code\": \"LimitExceededException\" }\"#,\n            ))\n            .unwrap()\n    })\n    .await;\n\n    dbg!(&err);\n    let classifier = AwsErrorCodeClassifier::<CreateAliasError>::new();\n    let mut ctx = InterceptorContext::new(Input::doesnt_matter());\n    let err = err.into_service_error();\n    ctx.set_output_or_error(Err(OrchestratorError::operation(Error::erase(err))));\n    let retry_action = classifier.classify_retry(&ctx);\n    assert_eq!(RetryAction::throttling_error(), retry_action);\n}\n\n#[tokio::test]\nasync fn unmodeled_errors_are_retryable() {\n    let err = make_err(|| {\n        http_1x::Response::builder()\n            .status(400)\n            .body(Bytes::from_static(br#\"{ \"code\": \"ThrottlingException\" }\"#))\n            .unwrap()\n    })\n    .await;\n\n    dbg!(&err);\n    let classifier = AwsErrorCodeClassifier::<CreateAliasError>::new();\n    let mut ctx = InterceptorContext::new(Input::doesnt_matter());\n    let err = err.into_service_error();\n    ctx.set_output_or_error(Err(OrchestratorError::operation(Error::erase(err))));\n    let retry_action = classifier.classify_retry(&ctx);\n    assert_eq!(RetryAction::throttling_error(), retry_action);\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/kms/tests/sensitive-it.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_sdk_kms as kms;\nuse kms::operation::generate_random::GenerateRandomOutput;\nuse kms::primitives::Blob;\n\n#[test]\nfn validate_sensitive_trait() {\n    let builder = GenerateRandomOutput::builder().plaintext(Blob::new(\"some output\"));\n    assert_eq!(\n        format!(\"{:?}\", builder),\n        \"GenerateRandomOutputBuilder { plaintext: \\\"*** Sensitive Data Redacted ***\\\", ciphertext_for_recipient: None, _request_id: None }\"\n    );\n    let output = GenerateRandomOutput::builder()\n        .plaintext(Blob::new(\"some output\"))\n        .build();\n    assert_eq!(\n        format!(\"{:?}\", output),\n        \"GenerateRandomOutput { plaintext: \\\"*** Sensitive Data Redacted ***\\\", ciphertext_for_recipient: None, _request_id: None }\"\n    );\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/kms/tests/traits.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_sdk_kms as kms;\nuse kms::operation::create_alias::CreateAliasError;\nuse kms::operation::generate_random::GenerateRandom;\n\nfn assert_send_sync<T: Send + Sync + 'static>() {}\nfn assert_send_fut<T: Send + 'static>(_: T) {}\nfn assert_debug<T: std::fmt::Debug>() {}\n\n#[tokio::test]\nasync fn types_are_send_sync() {\n    assert_send_sync::<kms::Error>();\n    assert_send_sync::<kms::error::SdkError<CreateAliasError>>();\n    assert_send_sync::<kms::operation::create_alias::CreateAliasError>();\n    assert_send_sync::<kms::operation::create_alias::CreateAliasOutput>();\n    assert_send_sync::<kms::Client>();\n    assert_send_sync::<GenerateRandom>();\n    let conf = kms::Config::builder().build();\n    assert_send_fut(kms::Client::from_conf(conf).list_keys().send());\n}\n\n#[tokio::test]\nasync fn client_is_debug() {\n    let conf = kms::Config::builder().build();\n    let client = kms::Client::from_conf(conf);\n    assert_ne!(format!(\"{:?}\", client), \"\");\n}\n\n#[tokio::test]\nasync fn client_is_clone() {\n    let conf = kms::Config::builder().build();\n    let client = kms::Client::from_conf(conf);\n\n    fn is_clone(it: impl Clone) {\n        drop(it)\n    }\n\n    is_clone(client);\n}\n\n#[test]\nfn types_are_debug() {\n    assert_debug::<kms::Client>();\n    assert_debug::<kms::operation::generate_random::builders::GenerateRandomFluentBuilder>();\n    assert_debug::<kms::operation::create_alias::builders::CreateAliasFluentBuilder>();\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/lambda/Cargo.toml",
    "content": "[package]\nname = \"lambda\"\nversion = \"0.1.0\"\nauthors = [\"AWS Rust SDK Team <aws-sdk-rust@amazon.com>\", \"Zelda Hessler <zhessler@amazon.com>\"]\nedition = \"2021\"\nlicense = \"Apache-2.0\"\nrepository = \"https://github.com/smithy-lang/smithy-rs\"\npublish = false\n\n[dev-dependencies]\nasync-stream = \"0.3.0\"\naws-credential-types = { path = \"../../build/aws-sdk/sdk/aws-credential-types\", features = [\"test-util\"] }\naws-sdk-lambda = { path = \"../../build/aws-sdk/sdk/lambda\", features = [\"behavior-version-latest\"] }\naws-smithy-eventstream = { path = \"../../build/aws-sdk/sdk/aws-smithy-eventstream\" }\naws-smithy-http = { path = \"../../build/aws-sdk/sdk/aws-smithy-http\" }\naws-smithy-runtime = { path = \"../../build/aws-sdk/sdk/aws-smithy-runtime\", features = [\"client\"] }\naws-smithy-http-client = { path = \"../../build/aws-sdk/sdk/aws-smithy-http-client\", features = [\"test-util\"] }\nbase64 = \"0.13.0\"\nbytes = \"1.0.0\"\nfutures-core = \"0.3.29\"\nhttp-1x = { package = \"http\", version = \"1\" }\nserde_json = \"1.0.0\"\ntokio = { version = \"1.23.1\", features = [\"full\", \"test-util\"] }\ntracing-subscriber = { version = \"0.3.15\", features = [\"env-filter\"] }\n"
  },
  {
    "path": "aws/sdk/integration-tests/lambda/tests/blns/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2015-2020 Max Woolf\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "aws/sdk/integration-tests/lambda/tests/blns/blns.txt",
    "content": "# you can update the list of strings by running curl:\n# $ curl https://raw.githubusercontent.com/minimaxir/big-list-of-naughty-strings/master/blns.txt > blns.txt\n\n#\tReserved Strings\n#\n#\tStrings which may be used elsewhere in code\n\nundefined\nundef\nnull\nNULL\n(null)\nnil\nNIL\ntrue\nfalse\nTrue\nFalse\nTRUE\nFALSE\nNone\nhasOwnProperty\nthen\nconstructor\n\\\n\\\\\n\n#\tNumeric Strings\n#\n#\tStrings which can be interpreted as numeric\n\n0\n1\n1.00\n$1.00\n1/2\n1E2\n1E02\n1E+02\n-1\n-1.00\n-$1.00\n-1/2\n-1E2\n-1E02\n-1E+02\n1/0\n0/0\n-2147483648/-1\n-9223372036854775808/-1\n-0\n-0.0\n+0\n+0.0\n0.00\n0..0\n.\n0.0.0\n0,00\n0,,0\n,\n0,0,0\n0.0/0\n1.0/0.0\n0.0/0.0\n1,0/0,0\n0,0/0,0\n--1\n-\n-.\n-,\n999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999\nNaN\nInfinity\n-Infinity\nINF\n1#INF\n-1#IND\n1#QNAN\n1#SNAN\n1#IND\n0x0\n0xffffffff\n0xffffffffffffffff\n0xabad1dea\n123456789012345678901234567890123456789\n1,000.00\n1 000.00\n1'000.00\n1,000,000.00\n1 000 000.00\n1'000'000.00\n1.000,00\n1 000,00\n1'000,00\n1.000.000,00\n1 000 000,00\n1'000'000,00\n01000\n08\n09\n2.2250738585072011e-308\n\n#\tSpecial Characters\n#\n# ASCII punctuation.  All of these characters may need to be escaped in some\n# contexts.  Divided into three groups based on (US-layout) keyboard position.\n\n,./;'[]\\-=\n<>?:\"{}|_+\n!@#$%^&*()`~\n\n# Non-whitespace C0 controls: U+0001 through U+0008, U+000E through U+001F,\n# and U+007F (DEL)\n# Often forbidden to appear in various text-based file formats (e.g. XML),\n# or reused for internal delimiters on the theory that they should never\n# appear in input.\n# The next line may appear to be blank or mojibake in some viewers.\n\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f\n\n# Non-whitespace C1 controls: U+0080 through U+0084 and U+0086 through U+009F.\n# Commonly misinterpreted as additional graphic characters.\n# The next line may appear to be blank, mojibake, or dingbats in some viewers.\n\n\n# Whitespace: all of the characters with category Zs, Zl, or Zp (in Unicode\n# version 8.0.0), plus U+0009 (HT), U+000B (VT), U+000C (FF), U+0085 (NEL),\n# and U+200B (ZERO WIDTH SPACE), which are in the C categories but are often\n# treated as whitespace in some contexts.\n# This file unfortunately cannot express strings containing\n# U+0000, U+000A, or U+000D (NUL, LF, CR).\n# The next line may appear to be blank or mojibake in some viewers.\n# The next line may be flagged for \"trailing whitespace\" in some viewers.\n\t\u000b\f              ​    　\n\n# Unicode additional control characters: all of the characters with\n# general category Cf (in Unicode 8.0.0).\n# The next line may appear to be blank or mojibake in some viewers.\n­؀؁؂؃؄؅؜۝܏᠎​‌‍‎‏‪‫‬‭‮⁠⁡⁢⁣⁤⁦⁧⁨⁩⁪⁫⁬⁭⁮⁯﻿￹￺￻𑂽𛲠𛲡𛲢𛲣𝅳𝅴𝅵𝅶𝅷𝅸𝅹𝅺󠀁󠀠󠀡󠀢󠀣󠀤󠀥󠀦󠀧󠀨󠀩󠀪󠀫󠀬󠀭󠀮󠀯󠀰󠀱󠀲󠀳󠀴󠀵󠀶󠀷󠀸󠀹󠀺󠀻󠀼󠀽󠀾󠀿󠁀󠁁󠁂󠁃󠁄󠁅󠁆󠁇󠁈󠁉󠁊󠁋󠁌󠁍󠁎󠁏󠁐󠁑󠁒󠁓󠁔󠁕󠁖󠁗󠁘󠁙󠁚󠁛󠁜󠁝󠁞󠁟󠁠󠁡󠁢󠁣󠁤󠁥󠁦󠁧󠁨󠁩󠁪󠁫󠁬󠁭󠁮󠁯󠁰󠁱󠁲󠁳󠁴󠁵󠁶󠁷󠁸󠁹󠁺󠁻󠁼󠁽󠁾󠁿\n\n# \"Byte order marks\", U+FEFF and U+FFFE, each on its own line.\n# The next two lines may appear to be blank or mojibake in some viewers.\n﻿\n￾\n\n#\tUnicode Symbols\n#\n#\tStrings which contain common unicode symbols (e.g. smart quotes)\n\nΩ≈ç√∫˜µ≤≥÷\nåß∂ƒ©˙∆˚¬…æ\nœ∑´®†¥¨ˆøπ“‘\n¡™£¢∞§¶•ªº–≠\n¸˛Ç◊ı˜Â¯˘¿\nÅÍÎÏ˝ÓÔÒÚÆ☃\nŒ„´‰ˇÁ¨ˆØ∏”’\n`⁄€‹›ﬁﬂ‡°·‚—±\n⅛⅜⅝⅞\nЁЂЃЄЅІЇЈЉЊЋЌЍЎЏАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя\n٠١٢٣٤٥٦٧٨٩\n\n#\tUnicode Subscript/Superscript/Accents\n#\n#\tStrings which contain unicode subscripts/superscripts; can cause rendering issues\n\n⁰⁴⁵\n₀₁₂\n⁰⁴⁵₀₁₂\nด้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็ ด้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็ ด้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็\n\n#\tQuotation Marks\n#\n#\tStrings which contain misplaced quotation marks; can cause encoding errors\n\n'\n\"\n''\n\"\"\n'\"'\n\"''''\"'\"\n\"'\"'\"''''\"\n<foo val=“bar” />\n<foo val=“bar” />\n<foo val=”bar“ />\n<foo val=`bar' />\n\n#\tTwo-Byte Characters\n#\n#\tStrings which contain two-byte characters: can cause rendering issues or character-length issues\n\n田中さんにあげて下さい\nパーティーへ行かないか\n和製漢語\n部落格\n사회과학원 어학연구소\n찦차를 타고 온 펲시맨과 쑛다리 똠방각하\n社會科學院語學研究所\n울란바토르\n𠜎𠜱𠝹𠱓𠱸𠲖𠳏\n\n#\tStrings which contain two-byte letters: can cause issues with naïve UTF-16 capitalizers which think that 16 bits == 1 character\n\n𐐜 𐐔𐐇𐐝𐐀𐐡𐐇𐐓 𐐙𐐊𐐡𐐝𐐓/𐐝𐐇𐐗𐐊𐐤𐐔 𐐒𐐋𐐗 𐐒𐐌 𐐜 𐐡𐐀𐐖𐐇𐐤𐐓𐐝 𐐱𐑂 𐑄 𐐔𐐇𐐝𐐀𐐡𐐇𐐓 𐐏𐐆𐐅𐐤𐐆𐐚𐐊𐐡𐐝𐐆𐐓𐐆\n\n#\tSpecial Unicode Characters Union\n#\n#\tA super string recommended by VMware Inc. Globalization Team: can effectively cause rendering issues or character-length issues to validate product globalization readiness.\n#\n#\t表          CJK_UNIFIED_IDEOGRAPHS (U+8868)\n#\tポ          KATAKANA LETTER PO (U+30DD)\n#\tあ          HIRAGANA LETTER A (U+3042)\n#\tA           LATIN CAPITAL LETTER A (U+0041)\n#\t鷗          CJK_UNIFIED_IDEOGRAPHS (U+9DD7)\n#\tŒ           LATIN SMALL LIGATURE OE (U+0153)\n#\té           LATIN SMALL LETTER E WITH ACUTE (U+00E9)\n#\tＢ           FULLWIDTH LATIN CAPITAL LETTER B (U+FF22)\n#\t逍          CJK_UNIFIED_IDEOGRAPHS (U+900D)\n#\tÜ           LATIN SMALL LETTER U WITH DIAERESIS (U+00FC)\n#\tß           LATIN SMALL LETTER SHARP S (U+00DF)\n#\tª           FEMININE ORDINAL INDICATOR (U+00AA)\n#\tą           LATIN SMALL LETTER A WITH OGONEK (U+0105)\n#\tñ           LATIN SMALL LETTER N WITH TILDE (U+00F1)\n#\t丂          CJK_UNIFIED_IDEOGRAPHS (U+4E02)\n#\t㐀          CJK Ideograph Extension A, First (U+3400)\n#\t𠀀          CJK Ideograph Extension B, First (U+20000)\n\n表ポあA鷗ŒéＢ逍Üßªąñ丂㐀𠀀\n\n#\tChanging length when lowercased\n#\n#\tCharacters which increase in length (2 to 3 bytes) when lowercased\n#\tCredit: https://twitter.com/jifa/status/625776454479970304\n\nȺ\nȾ\n\n#\tJapanese Emoticons\n#\n#\tStrings which consists of Japanese-style emoticons which are popular on the web\n\nヽ༼ຈل͜ຈ༽ﾉ ヽ༼ຈل͜ຈ༽ﾉ\n(｡◕ ∀ ◕｡)\n｀ｨ(´∀｀∩\n__ﾛ(,_,*)\n・(￣∀￣)・:*:\nﾟ･✿ヾ╲(｡◕‿◕｡)╱✿･ﾟ\n,。・:*:・゜’( ☻ ω ☻ )。・:*:・゜’\n(╯°□°）╯︵ ┻━┻)\n(ﾉಥ益ಥ）ﾉ﻿ ┻━┻\n┬─┬ノ( º _ ºノ)\n( ͡° ͜ʖ ͡°)\n¯\\_(ツ)_/¯\n\n#\tEmoji\n#\n#\tStrings which contain Emoji; should be the same behavior as two-byte characters, but not always\n\n😍\n👩🏽\n👨‍🦰 👨🏿‍🦰 👨‍🦱 👨🏿‍🦱 🦹🏿‍♂️\n👾 🙇 💁 🙅 🙆 🙋 🙎 🙍\n🐵 🙈 🙉 🙊\n❤️ 💔 💌 💕 💞 💓 💗 💖 💘 💝 💟 💜 💛 💚 💙\n✋🏿 💪🏿 👐🏿 🙌🏿 👏🏿 🙏🏿\n👨‍👩‍👦 👨‍👩‍👧‍👦 👨‍👨‍👦 👩‍👩‍👧 👨‍👦 👨‍👧‍👦 👩‍👦 👩‍👧‍👦\n🚾 🆒 🆓 🆕 🆖 🆗 🆙 🏧\n0️⃣ 1️⃣ 2️⃣ 3️⃣ 4️⃣ 5️⃣ 6️⃣ 7️⃣ 8️⃣ 9️⃣ 🔟\n\n#       Regional Indicator Symbols\n#\n#       Regional Indicator Symbols can be displayed differently across\n#       fonts, and have a number of special behaviors\n\n🇺🇸🇷🇺🇸 🇦🇫🇦🇲🇸\n🇺🇸🇷🇺🇸🇦🇫🇦🇲\n🇺🇸🇷🇺🇸🇦\n\n#\tUnicode Numbers\n#\n#\tStrings which contain unicode numbers; if the code is localized, it should see the input as numeric\n\n１２３\n١٢٣\n\n#\tRight-To-Left Strings\n#\n#\tStrings which contain text that should be rendered RTL if possible (e.g. Arabic, Hebrew)\n\nثم نفس سقطت وبالتحديد،, جزيرتي باستخدام أن دنو. إذ هنا؟ الستار وتنصيب كان. أهّل ايطاليا، بريطانيا-فرنسا قد أخذ. سليمان، إتفاقية بين ما, يذكر الحدود أي بعد, معاملة بولندا، الإطلاق عل إيو.\nבְּרֵאשִׁית, בָּרָא אֱלֹהִים, אֵת הַשָּׁמַיִם, וְאֵת הָאָרֶץ\nהָיְתָהtestالصفحات التّحول\n﷽\nﷺ\nمُنَاقَشَةُ سُبُلِ اِسْتِخْدَامِ اللُّغَةِ فِي النُّظُمِ الْقَائِمَةِ وَفِيم يَخُصَّ التَّطْبِيقَاتُ الْحاسُوبِيَّةُ،\nالكل في المجمو عة (5)\n\n#\tOgham Text\n#\n#\tThe only unicode alphabet to use a space which isn't empty but should still act like a space.\n\n᚛ᚄᚓᚐᚋᚒᚄ ᚑᚄᚂᚑᚏᚅ᚜\n᚛                 ᚜\n\n#\tTrick Unicode\n#\n#\tStrings which contain unicode with unusual properties (e.g. Right-to-left override) (c.f. http://www.unicode.org/charts/PDF/U2000.pdf)\n\n‪‪test‪\n‫test‫\n test \ntest⁠test‫\n⁦test⁧\n\n#\tZalgo Text\n#\n#\tStrings which contain \"corrupted\" text. The corruption will not appear in non-HTML text, however. (via http://www.eeemo.net)\n\nṰ̺̺̕o͞ ̷i̲̬͇̪͙n̝̗͕v̟̜̘̦͟o̶̙̰̠kè͚̮̺̪̹̱̤ ̖t̝͕̳̣̻̪͞h̼͓̲̦̳̘̲e͇̣̰̦̬͎ ̢̼̻̱̘h͚͎͙̜̣̲ͅi̦̲̣̰̤v̻͍e̺̭̳̪̰-m̢iͅn̖̺̞̲̯̰d̵̼̟͙̩̼̘̳ ̞̥̱̳̭r̛̗̘e͙p͠r̼̞̻̭̗e̺̠̣͟s̘͇̳͍̝͉e͉̥̯̞̲͚̬͜ǹ̬͎͎̟̖͇̤t͍̬̤͓̼̭͘ͅi̪̱n͠g̴͉ ͏͉ͅc̬̟h͡a̫̻̯͘o̫̟̖͍̙̝͉s̗̦̲.̨̹͈̣\n̡͓̞ͅI̗̘̦͝n͇͇͙v̮̫ok̲̫̙͈i̖͙̭̹̠̞n̡̻̮̣̺g̲͈͙̭͙̬͎ ̰t͔̦h̞̲e̢̤ ͍̬̲͖f̴̘͕̣è͖ẹ̥̩l͖͔͚i͓͚̦͠n͖͍̗͓̳̮g͍ ̨o͚̪͡f̘̣̬ ̖̘͖̟͙̮c҉͔̫͖͓͇͖ͅh̵̤̣͚͔á̗̼͕ͅo̼̣̥s̱͈̺̖̦̻͢.̛̖̞̠̫̰\n̗̺͖̹̯͓Ṯ̤͍̥͇͈h̲́e͏͓̼̗̙̼̣͔ ͇̜̱̠͓͍ͅN͕͠e̗̱z̘̝̜̺͙p̤̺̹͍̯͚e̠̻̠͜r̨̤͍̺̖͔̖̖d̠̟̭̬̝͟i̦͖̩͓͔̤a̠̗̬͉̙n͚͜ ̻̞̰͚ͅh̵͉i̳̞v̢͇ḙ͎͟-҉̭̩̼͔m̤̭̫i͕͇̝̦n̗͙ḍ̟ ̯̲͕͞ǫ̟̯̰̲͙̻̝f ̪̰̰̗̖̭̘͘c̦͍̲̞͍̩̙ḥ͚a̮͎̟̙͜ơ̩̹͎s̤.̝̝ ҉Z̡̖̜͖̰̣͉̜a͖̰͙̬͡l̲̫̳͍̩g̡̟̼̱͚̞̬ͅo̗͜.̟\n̦H̬̤̗̤͝e͜ ̜̥̝̻͍̟́w̕h̖̯͓o̝͙̖͎̱̮ ҉̺̙̞̟͈W̷̼̭a̺̪͍į͈͕̭͙̯̜t̶̼̮s̘͙͖̕ ̠̫̠B̻͍͙͉̳ͅe̵h̵̬͇̫͙i̹͓̳̳̮͎̫̕n͟d̴̪̜̖ ̰͉̩͇͙̲͞ͅT͖̼͓̪͢h͏͓̮̻e̬̝̟ͅ ̤̹̝W͙̞̝͔͇͝ͅa͏͓͔̹̼̣l̴͔̰̤̟͔ḽ̫.͕\nZ̮̞̠͙͔ͅḀ̗̞͈̻̗Ḷ͙͎̯̹̞͓G̻O̭̗̮\n\n#\tUnicode Upsidedown\n#\n#\tStrings which contain unicode with an \"upsidedown\" effect (via http://www.upsidedowntext.com)\n\n˙ɐnbᴉlɐ ɐuƃɐɯ ǝɹolop ʇǝ ǝɹoqɐl ʇn ʇunpᴉpᴉɔuᴉ ɹodɯǝʇ poɯsnᴉǝ op pǝs 'ʇᴉlǝ ƃuᴉɔsᴉdᴉpɐ ɹnʇǝʇɔǝsuoɔ 'ʇǝɯɐ ʇᴉs ɹolop ɯnsdᴉ ɯǝɹo˥\n00˙Ɩ$-\n\n#\tUnicode font\n#\n#\tStrings which contain bold/italic/etc. versions of normal characters\n\nＴｈｅ ｑｕｉｃｋ ｂｒｏｗｎ ｆｏｘ ｊｕｍｐｓ ｏｖｅｒ ｔｈｅ ｌａｚｙ ｄｏｇ\n𝐓𝐡𝐞 𝐪𝐮𝐢𝐜𝐤 𝐛𝐫𝐨𝐰𝐧 𝐟𝐨𝐱 𝐣𝐮𝐦𝐩𝐬 𝐨𝐯𝐞𝐫 𝐭𝐡𝐞 𝐥𝐚𝐳𝐲 𝐝𝐨𝐠\n𝕿𝖍𝖊 𝖖𝖚𝖎𝖈𝖐 𝖇𝖗𝖔𝖜𝖓 𝖋𝖔𝖝 𝖏𝖚𝖒𝖕𝖘 𝖔𝖛𝖊𝖗 𝖙𝖍𝖊 𝖑𝖆𝖟𝖞 𝖉𝖔𝖌\n𝑻𝒉𝒆 𝒒𝒖𝒊𝒄𝒌 𝒃𝒓𝒐𝒘𝒏 𝒇𝒐𝒙 𝒋𝒖𝒎𝒑𝒔 𝒐𝒗𝒆𝒓 𝒕𝒉𝒆 𝒍𝒂𝒛𝒚 𝒅𝒐𝒈\n𝓣𝓱𝓮 𝓺𝓾𝓲𝓬𝓴 𝓫𝓻𝓸𝔀𝓷 𝓯𝓸𝔁 𝓳𝓾𝓶𝓹𝓼 𝓸𝓿𝓮𝓻 𝓽𝓱𝓮 𝓵𝓪𝔃𝔂 𝓭𝓸𝓰\n𝕋𝕙𝕖 𝕢𝕦𝕚𝕔𝕜 𝕓𝕣𝕠𝕨𝕟 𝕗𝕠𝕩 𝕛𝕦𝕞𝕡𝕤 𝕠𝕧𝕖𝕣 𝕥𝕙𝕖 𝕝𝕒𝕫𝕪 𝕕𝕠𝕘\n𝚃𝚑𝚎 𝚚𝚞𝚒𝚌𝚔 𝚋𝚛𝚘𝚠𝚗 𝚏𝚘𝚡 𝚓𝚞𝚖𝚙𝚜 𝚘𝚟𝚎𝚛 𝚝𝚑𝚎 𝚕𝚊𝚣𝚢 𝚍𝚘𝚐\n⒯⒣⒠ ⒬⒰⒤⒞⒦ ⒝⒭⒪⒲⒩ ⒡⒪⒳ ⒥⒰⒨⒫⒮ ⒪⒱⒠⒭ ⒯⒣⒠ ⒧⒜⒵⒴ ⒟⒪⒢\n\n#\tScript Injection\n#\n#\tStrings which attempt to invoke a benign script injection; shows vulnerability to XSS\n\n<script>alert(0)</script>\n&lt;script&gt;alert(&#39;1&#39;);&lt;/script&gt;\n<img src=x onerror=alert(2) />\n<svg><script>123<1>alert(3)</script>\n\"><script>alert(4)</script>\n'><script>alert(5)</script>\n><script>alert(6)</script>\n</script><script>alert(7)</script>\n< / script >< script >alert(8)< / script >\n onfocus=JaVaSCript:alert(9) autofocus\n\" onfocus=JaVaSCript:alert(10) autofocus\n' onfocus=JaVaSCript:alert(11) autofocus\n＜script＞alert(12)＜/script＞\n<sc<script>ript>alert(13)</sc</script>ript>\n--><script>alert(14)</script>\n\";alert(15);t=\"\n';alert(16);t='\nJavaSCript:alert(17)\n;alert(18);\nsrc=JaVaSCript:prompt(19)\n\"><script>alert(20);</script x=\"\n'><script>alert(21);</script x='\n><script>alert(22);</script x=\n\" autofocus onkeyup=\"javascript:alert(23)\n' autofocus onkeyup='javascript:alert(24)\n<script\\x20type=\"text/javascript\">javascript:alert(25);</script>\n<script\\x3Etype=\"text/javascript\">javascript:alert(26);</script>\n<script\\x0Dtype=\"text/javascript\">javascript:alert(27);</script>\n<script\\x09type=\"text/javascript\">javascript:alert(28);</script>\n<script\\x0Ctype=\"text/javascript\">javascript:alert(29);</script>\n<script\\x2Ftype=\"text/javascript\">javascript:alert(30);</script>\n<script\\x0Atype=\"text/javascript\">javascript:alert(31);</script>\n'`\"><\\x3Cscript>javascript:alert(32)</script>\n'`\"><\\x00script>javascript:alert(33)</script>\nABC<div style=\"x\\x3Aexpression(javascript:alert(34)\">DEF\nABC<div style=\"x:expression\\x5C(javascript:alert(35)\">DEF\nABC<div style=\"x:expression\\x00(javascript:alert(36)\">DEF\nABC<div style=\"x:exp\\x00ression(javascript:alert(37)\">DEF\nABC<div style=\"x:exp\\x5Cression(javascript:alert(38)\">DEF\nABC<div style=\"x:\\x0Aexpression(javascript:alert(39)\">DEF\nABC<div style=\"x:\\x09expression(javascript:alert(40)\">DEF\nABC<div style=\"x:\\xE3\\x80\\x80expression(javascript:alert(41)\">DEF\nABC<div style=\"x:\\xE2\\x80\\x84expression(javascript:alert(42)\">DEF\nABC<div style=\"x:\\xC2\\xA0expression(javascript:alert(43)\">DEF\nABC<div style=\"x:\\xE2\\x80\\x80expression(javascript:alert(44)\">DEF\nABC<div style=\"x:\\xE2\\x80\\x8Aexpression(javascript:alert(45)\">DEF\nABC<div style=\"x:\\x0Dexpression(javascript:alert(46)\">DEF\nABC<div style=\"x:\\x0Cexpression(javascript:alert(47)\">DEF\nABC<div style=\"x:\\xE2\\x80\\x87expression(javascript:alert(48)\">DEF\nABC<div style=\"x:\\xEF\\xBB\\xBFexpression(javascript:alert(49)\">DEF\nABC<div style=\"x:\\x20expression(javascript:alert(50)\">DEF\nABC<div style=\"x:\\xE2\\x80\\x88expression(javascript:alert(51)\">DEF\nABC<div style=\"x:\\x00expression(javascript:alert(52)\">DEF\nABC<div style=\"x:\\xE2\\x80\\x8Bexpression(javascript:alert(53)\">DEF\nABC<div style=\"x:\\xE2\\x80\\x86expression(javascript:alert(54)\">DEF\nABC<div style=\"x:\\xE2\\x80\\x85expression(javascript:alert(55)\">DEF\nABC<div style=\"x:\\xE2\\x80\\x82expression(javascript:alert(56)\">DEF\nABC<div style=\"x:\\x0Bexpression(javascript:alert(57)\">DEF\nABC<div style=\"x:\\xE2\\x80\\x81expression(javascript:alert(58)\">DEF\nABC<div style=\"x:\\xE2\\x80\\x83expression(javascript:alert(59)\">DEF\nABC<div style=\"x:\\xE2\\x80\\x89expression(javascript:alert(60)\">DEF\n<a href=\"\\x0Bjavascript:javascript:alert(61)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\x0Fjavascript:javascript:alert(62)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\xC2\\xA0javascript:javascript:alert(63)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\x05javascript:javascript:alert(64)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\xE1\\xA0\\x8Ejavascript:javascript:alert(65)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\x18javascript:javascript:alert(66)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\x11javascript:javascript:alert(67)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\xE2\\x80\\x88javascript:javascript:alert(68)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\xE2\\x80\\x89javascript:javascript:alert(69)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\xE2\\x80\\x80javascript:javascript:alert(70)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\x17javascript:javascript:alert(71)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\x03javascript:javascript:alert(72)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\x0Ejavascript:javascript:alert(73)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\x1Ajavascript:javascript:alert(74)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\x00javascript:javascript:alert(75)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\x10javascript:javascript:alert(76)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\xE2\\x80\\x82javascript:javascript:alert(77)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\x20javascript:javascript:alert(78)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\x13javascript:javascript:alert(79)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\x09javascript:javascript:alert(80)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\xE2\\x80\\x8Ajavascript:javascript:alert(81)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\x14javascript:javascript:alert(82)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\x19javascript:javascript:alert(83)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\xE2\\x80\\xAFjavascript:javascript:alert(84)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\x1Fjavascript:javascript:alert(85)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\xE2\\x80\\x81javascript:javascript:alert(86)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\x1Djavascript:javascript:alert(87)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\xE2\\x80\\x87javascript:javascript:alert(88)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\x07javascript:javascript:alert(89)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\xE1\\x9A\\x80javascript:javascript:alert(90)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\xE2\\x80\\x83javascript:javascript:alert(91)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\x04javascript:javascript:alert(92)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\x01javascript:javascript:alert(93)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\x08javascript:javascript:alert(94)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\xE2\\x80\\x84javascript:javascript:alert(95)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\xE2\\x80\\x86javascript:javascript:alert(96)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\xE3\\x80\\x80javascript:javascript:alert(97)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\x12javascript:javascript:alert(98)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\x0Djavascript:javascript:alert(99)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\x0Ajavascript:javascript:alert(100)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\x0Cjavascript:javascript:alert(101)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\x15javascript:javascript:alert(102)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\xE2\\x80\\xA8javascript:javascript:alert(103)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\x16javascript:javascript:alert(104)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\x02javascript:javascript:alert(105)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\x1Bjavascript:javascript:alert(106)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\x06javascript:javascript:alert(107)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\xE2\\x80\\xA9javascript:javascript:alert(108)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\xE2\\x80\\x85javascript:javascript:alert(109)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\x1Ejavascript:javascript:alert(110)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\xE2\\x81\\x9Fjavascript:javascript:alert(111)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\x1Cjavascript:javascript:alert(112)\" id=\"fuzzelement1\">test</a>\n<a href=\"javascript\\x00:javascript:alert(113)\" id=\"fuzzelement1\">test</a>\n<a href=\"javascript\\x3A:javascript:alert(114)\" id=\"fuzzelement1\">test</a>\n<a href=\"javascript\\x09:javascript:alert(115)\" id=\"fuzzelement1\">test</a>\n<a href=\"javascript\\x0D:javascript:alert(116)\" id=\"fuzzelement1\">test</a>\n<a href=\"javascript\\x0A:javascript:alert(117)\" id=\"fuzzelement1\">test</a>\n`\"'><img src=xxx:x \\x0Aonerror=javascript:alert(118)>\n`\"'><img src=xxx:x \\x22onerror=javascript:alert(119)>\n`\"'><img src=xxx:x \\x0Bonerror=javascript:alert(120)>\n`\"'><img src=xxx:x \\x0Donerror=javascript:alert(121)>\n`\"'><img src=xxx:x \\x2Fonerror=javascript:alert(122)>\n`\"'><img src=xxx:x \\x09onerror=javascript:alert(123)>\n`\"'><img src=xxx:x \\x0Conerror=javascript:alert(124)>\n`\"'><img src=xxx:x \\x00onerror=javascript:alert(125)>\n`\"'><img src=xxx:x \\x27onerror=javascript:alert(126)>\n`\"'><img src=xxx:x \\x20onerror=javascript:alert(127)>\n\"`'><script>\\x3Bjavascript:alert(128)</script>\n\"`'><script>\\x0Djavascript:alert(129)</script>\n\"`'><script>\\xEF\\xBB\\xBFjavascript:alert(130)</script>\n\"`'><script>\\xE2\\x80\\x81javascript:alert(131)</script>\n\"`'><script>\\xE2\\x80\\x84javascript:alert(132)</script>\n\"`'><script>\\xE3\\x80\\x80javascript:alert(133)</script>\n\"`'><script>\\x09javascript:alert(134)</script>\n\"`'><script>\\xE2\\x80\\x89javascript:alert(135)</script>\n\"`'><script>\\xE2\\x80\\x85javascript:alert(136)</script>\n\"`'><script>\\xE2\\x80\\x88javascript:alert(137)</script>\n\"`'><script>\\x00javascript:alert(138)</script>\n\"`'><script>\\xE2\\x80\\xA8javascript:alert(139)</script>\n\"`'><script>\\xE2\\x80\\x8Ajavascript:alert(140)</script>\n\"`'><script>\\xE1\\x9A\\x80javascript:alert(141)</script>\n\"`'><script>\\x0Cjavascript:alert(142)</script>\n\"`'><script>\\x2Bjavascript:alert(143)</script>\n\"`'><script>\\xF0\\x90\\x96\\x9Ajavascript:alert(144)</script>\n\"`'><script>-javascript:alert(145)</script>\n\"`'><script>\\x0Ajavascript:alert(146)</script>\n\"`'><script>\\xE2\\x80\\xAFjavascript:alert(147)</script>\n\"`'><script>\\x7Ejavascript:alert(148)</script>\n\"`'><script>\\xE2\\x80\\x87javascript:alert(149)</script>\n\"`'><script>\\xE2\\x81\\x9Fjavascript:alert(150)</script>\n\"`'><script>\\xE2\\x80\\xA9javascript:alert(151)</script>\n\"`'><script>\\xC2\\x85javascript:alert(152)</script>\n\"`'><script>\\xEF\\xBF\\xAEjavascript:alert(153)</script>\n\"`'><script>\\xE2\\x80\\x83javascript:alert(154)</script>\n\"`'><script>\\xE2\\x80\\x8Bjavascript:alert(155)</script>\n\"`'><script>\\xEF\\xBF\\xBEjavascript:alert(156)</script>\n\"`'><script>\\xE2\\x80\\x80javascript:alert(157)</script>\n\"`'><script>\\x21javascript:alert(158)</script>\n\"`'><script>\\xE2\\x80\\x82javascript:alert(159)</script>\n\"`'><script>\\xE2\\x80\\x86javascript:alert(160)</script>\n\"`'><script>\\xE1\\xA0\\x8Ejavascript:alert(161)</script>\n\"`'><script>\\x0Bjavascript:alert(162)</script>\n\"`'><script>\\x20javascript:alert(163)</script>\n\"`'><script>\\xC2\\xA0javascript:alert(164)</script>\n<img \\x00src=x onerror=\"alert(165)\">\n<img \\x47src=x onerror=\"javascript:alert(166)\">\n<img \\x11src=x onerror=\"javascript:alert(167)\">\n<img \\x12src=x onerror=\"javascript:alert(168)\">\n<img\\x47src=x onerror=\"javascript:alert(169)\">\n<img\\x10src=x onerror=\"javascript:alert(170)\">\n<img\\x13src=x onerror=\"javascript:alert(171)\">\n<img\\x32src=x onerror=\"javascript:alert(172)\">\n<img\\x47src=x onerror=\"javascript:alert(173)\">\n<img\\x11src=x onerror=\"javascript:alert(174)\">\n<img \\x47src=x onerror=\"javascript:alert(175)\">\n<img \\x34src=x onerror=\"javascript:alert(176)\">\n<img \\x39src=x onerror=\"javascript:alert(177)\">\n<img \\x00src=x onerror=\"javascript:alert(178)\">\n<img src\\x09=x onerror=\"javascript:alert(179)\">\n<img src\\x10=x onerror=\"javascript:alert(180)\">\n<img src\\x13=x onerror=\"javascript:alert(181)\">\n<img src\\x32=x onerror=\"javascript:alert(182)\">\n<img src\\x12=x onerror=\"javascript:alert(183)\">\n<img src\\x11=x onerror=\"javascript:alert(184)\">\n<img src\\x00=x onerror=\"javascript:alert(185)\">\n<img src\\x47=x onerror=\"javascript:alert(186)\">\n<img src=x\\x09onerror=\"javascript:alert(187)\">\n<img src=x\\x10onerror=\"javascript:alert(188)\">\n<img src=x\\x11onerror=\"javascript:alert(189)\">\n<img src=x\\x12onerror=\"javascript:alert(190)\">\n<img src=x\\x13onerror=\"javascript:alert(191)\">\n<img[a][b][c]src[d]=x[e]onerror=[f]\"alert(192)\">\n<img src=x onerror=\\x09\"javascript:alert(193)\">\n<img src=x onerror=\\x10\"javascript:alert(194)\">\n<img src=x onerror=\\x11\"javascript:alert(195)\">\n<img src=x onerror=\\x12\"javascript:alert(196)\">\n<img src=x onerror=\\x32\"javascript:alert(197)\">\n<img src=x onerror=\\x00\"javascript:alert(198)\">\n<a href=java&#1&#2&#3&#4&#5&#6&#7&#8&#11&#12script:javascript:alert(199)>XXX</a>\n<img src=\"x` `<script>javascript:alert(200)</script>\"` `>\n<img src onerror /\" '\"= alt=javascript:alert(201)//\">\n<title onpropertychange=javascript:alert(202)></title><title title=>\n<a href=http://foo.bar/#x=`y></a><img alt=\"`><img src=x:x onerror=javascript:alert(203)></a>\">\n<!--[if]><script>javascript:alert(204)</script -->\n<!--[if<img src=x onerror=javascript:alert(205)//]> -->\n<script src=\"/\\%(jscript)s\"></script>\n<script src=\"\\\\%(jscript)s\"></script>\n<IMG \"\"\"><SCRIPT>alert(\"206\")</SCRIPT>\">\n<IMG SRC=javascript:alert(String.fromCharCode(50,48,55))>\n<IMG SRC=# onmouseover=\"alert('208')\">\n<IMG SRC= onmouseover=\"alert('209')\">\n<IMG onmouseover=\"alert('210')\">\n<IMG SRC=&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#39;&#50;&#49;&#49;&#39;&#41;>\n<IMG SRC=&#0000106&#0000097&#0000118&#0000097&#0000115&#0000099&#0000114&#0000105&#0000112&#0000116&#0000058&#0000097&#0000108&#0000101&#0000114&#0000116&#0000040&#0000039&#0000050&#0000049&#0000050&#0000039&#0000041>\n<IMG SRC=&#x6A&#x61&#x76&#x61&#x73&#x63&#x72&#x69&#x70&#x74&#x3A&#x61&#x6C&#x65&#x72&#x74&#x28&#x27&#x32&#x31&#x33&#x27&#x29>\n<IMG SRC=\"jav   ascript:alert('214');\">\n<IMG SRC=\"jav&#x09;ascript:alert('215');\">\n<IMG SRC=\"jav&#x0A;ascript:alert('216');\">\n<IMG SRC=\"jav&#x0D;ascript:alert('217');\">\nperl -e 'print \"<IMG SRC=java\\0script:alert(\\\"218\\\")>\";' > out\n<IMG SRC=\" &#14;  javascript:alert('219');\">\n<SCRIPT/XSS SRC=\"http://ha.ckers.org/xss.js\"></SCRIPT>\n<BODY onload!#$%&()*~+-_.,:;?@[/|\\]^`=alert(\"220\")>\n<SCRIPT/SRC=\"http://ha.ckers.org/xss.js\"></SCRIPT>\n<<SCRIPT>alert(\"221\");//<</SCRIPT>\n<SCRIPT SRC=http://ha.ckers.org/xss.js?< B >\n<SCRIPT SRC=//ha.ckers.org/.j>\n<IMG SRC=\"javascript:alert('222')\"\n<iframe src=http://ha.ckers.org/scriptlet.html <\n\\\";alert('223');//\n<u oncopy=alert()> Copy me</u>\n<i onwheel=alert(224)> Scroll over me </i>\n<plaintext>\nhttp://a/%%30%30\n</textarea><script>alert(225)</script>\n\n#\tSQL Injection\n#\n#\tStrings which can cause a SQL injection if inputs are not sanitized\n\n1;DROP TABLE users\n1'; DROP TABLE users-- 1\n' OR 1=1 -- 1\n' OR '1'='1\n'; EXEC sp_MSForEachTable 'DROP TABLE ?'; --\n\n%\n_\n\n#\tServer Code Injection\n#\n#\tStrings which can cause user to run code on server as a privileged user (c.f. https://news.ycombinator.com/item?id=7665153)\n\n-\n--\n--version\n--help\n$USER\n/dev/null; touch /tmp/blns.fail ; echo\n`touch /tmp/blns.fail`\n$(touch /tmp/blns.fail)\n@{[system \"touch /tmp/blns.fail\"]}\n\n#\tCommand Injection (Ruby)\n#\n#\tStrings which can call system commands within Ruby/Rails applications\n\neval(\"puts 'hello world'\")\nSystem(\"ls -al /\")\n`ls -al /`\nKernel.exec(\"ls -al /\")\nKernel.exit(1)\n%x('ls -al /')\n\n#      XXE Injection (XML)\n#\n#\tString which can reveal system files when parsed by a badly configured XML parser\n\n<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?><!DOCTYPE foo [ <!ELEMENT foo ANY ><!ENTITY xxe SYSTEM \"file:///etc/passwd\" >]><foo>&xxe;</foo>\n\n#\tUnwanted Interpolation\n#\n#\tStrings which can be accidentally expanded into different strings if evaluated in the wrong context, e.g. used as a printf format string or via Perl or shell eval. Might expose sensitive data from the program doing the interpolation, or might just represent the wrong string.\n\n$HOME\n$ENV{'HOME'}\n%d\n%s%s%s%s%s\n{0}\n%*.*s\n%@\n%n\nFile:///\n\n#\tFile Inclusion\n#\n#\tStrings which can cause user to pull in files that should not be a part of a web server\n\n../../../../../../../../../../../etc/passwd%00\n../../../../../../../../../../../etc/hosts\n\n#\tKnown CVEs and Vulnerabilities\n#\n#\tStrings that test for known vulnerabilities\n\n() { 0; }; touch /tmp/blns.shellshock1.fail;\n() { _; } >_[$($())] { touch /tmp/blns.shellshock2.fail; }\n<<< %s(un='%s') = %u\n+++ATH0\n\n#\tMSDOS/Windows Special Filenames\n#\n#\tStrings which are reserved characters in MSDOS/Windows\n\nCON\nPRN\nAUX\nCLOCK$\nNUL\nA:\nZZ:\nCOM1\nLPT1\nLPT2\nLPT3\nCOM2\nCOM3\nCOM4\n\n#   IRC specific strings\n#\n#   Strings that may occur on IRC clients that make security products freak out\n\nDCC SEND STARTKEYLOGGER 0 0 0\n\n#\tScunthorpe Problem\n#\n#\tInnocuous strings which may be blocked by profanity filters (https://en.wikipedia.org/wiki/Scunthorpe_problem)\n\nScunthorpe General Hospital\nPenistone Community Church\nLightwater Country Park\nJimmy Clitheroe\nHorniman Museum\nshitake mushrooms\nRomansInSussex.co.uk\nhttp://www.cum.qc.ca/\nCraig Cockburn, Software Specialist\nLinda Callahan\nDr. Herman I. Libshitz\nmagna cum laude\nSuper Bowl XXX\nmedieval erection of parapets\nevaluate\nmocha\nexpression\nArsenal canal\nclassic\nTyson Gay\nDick Van Dyke\nbasement\n\n#\tHuman injection\n#\n#\tStrings which may cause human to reinterpret worldview\n\nIf you're reading this, you've been in a coma for almost 20 years now. We're trying a new technique. We don't know where this message will end up in your dream, but we hope it works. Please wake up, we miss you.\n\n#\tTerminal escape codes\n#\n#\tStrings which punish the fools who use cat/type on this file\n\nRoses are \u001b[0;31mred\u001b[0m, violets are \u001b[0;34mblue. Hope you enjoy terminal hue\nBut now...\u001b[20Cfor my greatest trick...\u001b[8m\nThe quic\b\b\b\b\b\bk brown fo\u0007\u0007\u0007\u0007\u0007\u0007\u0007\u0007\u0007\u0007\u0007x... [Beeeep]\n\n#\tiOS Vulnerabilities\n#\n#\tStrings which crashed iMessage in various versions of iOS\n\nPowerلُلُصّبُلُلصّبُررً ॣ ॣh ॣ ॣ冗\n🏳0🌈️\nజ్ఞ‌ా\n\n# Persian special characters\n#\n# This is a four characters string which includes Persian special characters (گچپژ)\n\nگچپژ\n\n# jinja2 injection\n#\n# first one is supposed to raise \"MemoryError\" exception\n# second, obviously, prints contents of /etc/passwd\n\n{% print 'x' * 64 * 1024**3 %}\n{{ \"\".__class__.__mro__[2].__subclasses__()[40](\"/etc/passwd\").read() }}\n"
  },
  {
    "path": "aws/sdk/integration-tests/lambda/tests/naughty-strings-client-context.rs",
    "content": "#![allow(dead_code)]\n/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n// use http_1x::HeaderValue;\n\nconst NAUGHTY_STRINGS: &str = include_str!(\"blns/blns.txt\");\n\n/// A list of lines to skipped when iterating over the blns. These lines should all fail when\n/// entered into the AWS CLI too. In the below test, every one of these lines will produce an\n/// `InvalidSignatureException` error with the message:\n/// > The request signature we calculated does not match the signature you provided. Check your AWS\n/// > Secret Access Key and signing method. Consult the service documentation for details.\nconst SKIPPED_LINES: &[usize] = &[\n    124, // ''\n    139, // `cargo build` can't handle this one\n    143, // '﻿'\n    144, // '￾'\n    150, // 'Ω≈ç√∫˜µ≤≥÷'\n    151, // 'åß∂ƒ©˙∆˚¬…æ'\n    152, // 'œ∑´®†¥¨ˆøπ“‘'\n    153, // '¡™£¢∞§¶•ªº–≠'\n    154, // '¸˛Ç◊ı˜Â¯˘¿'\n    155, // 'ÅÍÎÏ˝ÓÔÒÚÆ☃'\n    156, // 'Œ„´‰ˇÁ¨ˆØ∏”’'\n    157, // '`⁄€‹›ﬁﬂ‡°·‚—±'\n    158, // '⅛⅜⅝⅞'\n    159, // 'ЁЂЃЄЅІЇЈЉЊЋЌЍЎЏАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя'\n    160, // '٠١٢٣٤٥٦٧٨٩'\n    166, // '⁰⁴⁵'\n    167, // '₀₁₂'\n    168, // '⁰⁴⁵₀₁₂'\n    169, // 'ด้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็ ด้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็ ด้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็'\n    182, // '<foo val=“bar” />'\n    183, // '<foo val=“bar” />'\n    184, // '<foo val=”bar“ />'\n    191, // '田中さんにあげて下さい'\n    192, // 'パーティーへ行かないか'\n    193, // '和製漢語'\n    194, // '部落格'\n    195, // '사회과학원 어학연구소'\n    196, // '찦차를 타고 온 펲시맨과 쑛다리 똠방각하'\n    197, // '社會科學院語學研究所'\n    198, // '울란바토르'\n    199, // '𠜎𠜱𠝹𠱓𠱸𠲖𠳏'\n    203, // '𐐜 𐐔𐐇𐐝𐐀𐐡𐐇𐐓 𐐙𐐊𐐡𐐝𐐓/𐐝𐐇𐐗𐐊𐐤𐐔 𐐒𐐋𐐗 𐐒𐐌 𐐜 𐐡𐐀𐐖𐐇𐐤𐐓𐐝 𐐱𐑂 𐑄 𐐔𐐇𐐝𐐀𐐡𐐇𐐓 𐐏𐐆𐐅𐐤𐐆𐐚𐐊𐐡𐐝𐐆𐐓𐐆'\n    227, // '表ポあA鷗ŒéＢ逍Üßªąñ丂㐀𠀀'\n    234, // 'Ⱥ'\n    235, // 'Ⱦ'\n    241, // 'ヽ༼ຈل͜ຈ༽ﾉ ヽ༼ຈل͜ຈ༽ﾉ'\n    242, // '(｡◕ ∀ ◕｡)'\n    243, // '｀ｨ(´∀｀∩'\n    244, // '__ﾛ(,_,*)'\n    245, // '・(￣∀￣)・:*:'\n    246, // 'ﾟ･✿ヾ╲(｡◕‿◕｡)╱✿･ﾟ'\n    247, // ',。・:*:・゜’( ☻ ω ☻ )。・:*:・゜’'\n    248, // '(╯°□°）╯︵ ┻━┻)'\n    249, // '(ﾉಥ益ಥ）ﾉ﻿ ┻━┻'\n    250, // '┬─┬ノ( º _ ºノ)'\n    251, // '( ͡° ͜ʖ ͡°)'\n    252, // '¯\\_(ツ)_/¯'\n    258, // '😍'\n    259, // '👩🏽'\n    260, // '👨‍🦰 👨🏿‍🦰 👨‍🦱 👨🏿‍🦱 🦹🏿‍♂️'\n    261, // '👾 🙇 💁 🙅 🙆 🙋 🙎 🙍'\n    262, // '🐵 🙈 🙉 🙊'\n    263, // '❤️ 💔 💌 💕 💞 💓 💗 💖 💘 💝 💟 💜 💛 💚 💙'\n    264, // '✋🏿 💪🏿 👐🏿 🙌🏿 👏🏿 🙏🏿'\n    265, // '👨‍👩‍👦 👨‍👩‍👧‍👦 👨‍👨‍👦 👩‍👩‍👧 👨‍👦 👨‍👧‍👦 👩‍👦 👩‍👧‍👦'\n    266, // '🚾 🆒 🆓 🆕 🆖 🆗 🆙 🏧'\n    267, // '0️⃣ 1️⃣ 2️⃣ 3️⃣ 4️⃣ 5️⃣ 6️⃣ 7️⃣ 8️⃣ 9️⃣ 🔟'\n    274, // '🇺🇸🇷🇺🇸 🇦🇫🇦🇲🇸'\n    275, // '🇺🇸🇷🇺🇸🇦🇫🇦🇲'\n    276, // '🇺🇸🇷🇺🇸🇦'\n    282, // '１２３'\n    283, // '١٢٣'\n    289, // 'ثم نفس سقطت وبالتحديد،, جزيرتي باستخدام أن دنو. إذ هنا؟ الستار وتنصيب كان. أهّل ايطاليا، بريطانيا-فرنسا قد أخذ. سليمان، إتفاقية بين ما, يذكر الحدود أي بعد, معاملة بولندا، الإطلاق عل إيو.'\n    290, // 'בְּרֵאשִׁית, בָּרָא אֱלֹהִים, אֵת הַשָּׁמַיִם, וְאֵת הָאָרֶץ'\n    291, // 'הָיְתָהtestالصفحات التّحول'\n    292, // '﷽'\n    293, // 'ﷺ'\n    294, // 'مُنَاقَشَةُ سُبُلِ اِسْتِخْدَامِ اللُّغَةِ فِي النُّظُمِ الْقَائِمَةِ وَفِيم يَخُصَّ التَّطْبِيقَاتُ الْحاسُوبِيَّةُ،'\n    295, // 'الكل في المجمو عة (5)'\n    301, // '᚛ᚄᚓᚐᚋᚒᚄ ᚑᚄᚂᚑᚏᚅ᚜'\n    302, // '᚛                 ᚜'\n    308, // `cargo build` can't handle this one\n    309, // `cargo build` can't handle this one\n    310, // I couldn't paste this one because my IDE parsed it as a syntax error\n    311, // `cargo build` can't handle this one\n    312, // `cargo build` can't handle this one\n    318, // 'Ṱ̺̺̕o͞ ̷i̲̬͇̪͙n̝̗͕v̟̜̘̦͟o̶̙̰̠kè͚̮̺̪̹̱̤ ̖t̝͕̳̣̻̪͞h̼͓̲̦̳̘̲e͇̣̰̦̬͎ ̢̼̻̱̘h͚͎͙̜̣̲ͅi̦̲̣̰̤v̻͍e̺̭̳̪̰-m̢iͅn̖̺̞̲̯̰d̵̼̟͙̩̼̘̳ ̞̥̱̳̭r̛̗̘e͙p͠r̼̞̻̭̗e̺̠̣͟s̘͇̳͍̝͉e͉̥̯̞̲͚̬͜ǹ̬͎͎̟̖͇̤t͍̬̤͓̼̭͘ͅi̪̱n͠g̴͉ ͏͉ͅc̬̟h͡a̫̻̯͘o̫̟̖͍̙̝͉s̗̦̲.̨̹͈̣'\n    319, // '̡͓̞ͅI̗̘̦͝n͇͇͙v̮̫ok̲̫̙͈i̖͙̭̹̠̞n̡̻̮̣̺g̲͈͙̭͙̬͎ ̰t͔̦h̞̲e̢̤ ͍̬̲͖f̴̘͕̣è͖ẹ̥̩l͖͔͚i͓͚̦͠n͖͍̗͓̳̮g͍ ̨o͚̪͡f̘̣̬ ̖̘͖̟͙̮c҉͔̫͖͓͇͖ͅh̵̤̣͚͔á̗̼͕ͅo̼̣̥s̱͈̺̖̦̻͢.̛̖̞̠̫̰'\n    320, // '̗̺͖̹̯͓Ṯ̤͍̥͇͈h̲́e͏͓̼̗̙̼̣͔ ͇̜̱̠͓͍ͅN͕͠e̗̱z̘̝̜̺͙p̤̺̹͍̯͚e̠̻̠͜r̨̤͍̺̖͔̖̖d̠̟̭̬̝͟i̦͖̩͓͔̤a̠̗̬͉̙n͚͜ ̻̞̰͚ͅh̵͉i̳̞v̢͇ḙ͎͟-҉̭̩̼͔m̤̭̫i͕͇̝̦n̗͙ḍ̟ ̯̲͕͞ǫ̟̯̰̲͙̻̝f ̪̰̰̗̖̭̘͘c̦͍̲̞͍̩̙ḥ͚a̮͎̟̙͜ơ̩̹͎s̤.̝̝ ҉Z̡̖̜͖̰̣͉̜a͖̰͙̬͡l̲̫̳͍̩g̡̟̼̱͚̞̬ͅo̗͜.̟'\n    321, // '̦H̬̤̗̤͝e͜ ̜̥̝̻͍̟́w̕h̖̯͓o̝͙̖͎̱̮ ҉̺̙̞̟͈W̷̼̭a̺̪͍į͈͕̭͙̯̜t̶̼̮s̘͙͖̕ ̠̫̠B̻͍͙͉̳ͅe̵h̵̬͇̫͙i̹͓̳̳̮͎̫̕n͟d̴̪̜̖ ̰͉̩͇͙̲͞ͅT͖̼͓̪͢h͏͓̮̻e̬̝̟ͅ ̤̹̝W͙̞̝͔͇͝ͅa͏͓͔̹̼̣l̴͔̰̤̟͔ḽ̫.͕'\n    322, // 'Z̮̞̠͙͔ͅḀ̗̞͈̻̗Ḷ͙͎̯̹̞͓G̻O̭̗̮'\n    328, // '˙ɐnbᴉlɐ ɐuƃɐɯ ǝɹolop ʇǝ ǝɹoqɐl ʇn ʇunpᴉpᴉɔuᴉ ɹodɯǝʇ poɯsnᴉǝ op pǝs 'ʇᴉlǝ ƃuᴉɔsᴉdᴉpɐ ɹnʇǝʇɔǝsuoɔ 'ʇǝɯɐ ʇᴉs ɹolop ɯnsdᴉ ɯǝɹo˥'\n    329, // '00˙Ɩ$-'\n    335, // 'Ｔｈｅ ｑｕｉｃｋ ｂｒｏｗｎ ｆｏｘ ｊｕｍｐｓ ｏｖｅｒ ｔｈｅ ｌａｚｙ ｄｏｇ'\n    336, // '𝐓𝐡𝐞 𝐪𝐮𝐢𝐜𝐤 𝐛𝐫𝐨𝐰𝐧 𝐟𝐨𝐱 𝐣𝐮𝐦𝐩𝐬 𝐨𝐯𝐞𝐫 𝐭𝐡𝐞 𝐥𝐚𝐳𝐲 𝐝𝐨𝐠'\n    337, // '𝕿𝖍𝖊 𝖖𝖚𝖎𝖈𝖐 𝖇𝖗𝖔𝖜𝖓 𝖋𝖔𝖝 𝖏𝖚𝖒𝖕𝖘 𝖔𝖛𝖊𝖗 𝖙𝖍𝖊 𝖑𝖆𝖟𝖞 𝖉𝖔𝖌'\n    338, // '𝑻𝒉𝒆 𝒒𝒖𝒊𝒄𝒌 𝒃𝒓𝒐𝒘𝒏 𝒇𝒐𝒙 𝒋𝒖𝒎𝒑𝒔 𝒐𝒗𝒆𝒓 𝒕𝒉𝒆 𝒍𝒂𝒛𝒚 𝒅𝒐𝒈'\n    339, // '𝓣𝓱𝓮 𝓺𝓾𝓲𝓬𝓴 𝓫𝓻𝓸𝔀𝓷 𝓯𝓸𝔁 𝓳𝓾𝓶𝓹𝓼 𝓸𝓿𝓮𝓻 𝓽𝓱𝓮 𝓵𝓪𝔃𝔂 𝓭𝓸𝓰'\n    340, // '𝕋𝕙𝕖 𝕢𝕦𝕚𝕔𝕜 𝕓𝕣𝕠𝕨𝕟 𝕗𝕠𝕩 𝕛𝕦𝕞𝕡𝕤 𝕠𝕧𝕖𝕣 𝕥𝕙𝕖 𝕝𝕒𝕫𝕪 𝕕𝕠𝕘'\n    341, // '𝚃𝚑𝚎 𝚚𝚞𝚒𝚌𝚔 𝚋𝚛𝚘𝚠𝚗 𝚏𝚘𝚡 𝚓𝚞𝚖𝚙𝚜 𝚘𝚟𝚎𝚛 𝚝𝚑𝚎 𝚕𝚊𝚣𝚢 𝚍𝚘𝚐'\n    342, // '⒯⒣⒠ ⒬⒰⒤⒞⒦ ⒝⒭⒪⒲⒩ ⒡⒪⒳ ⒥⒰⒨⒫⒮ ⒪⒱⒠⒭ ⒯⒣⒠ ⒧⒜⒵⒴ ⒟⒪⒢'\n    357, // ' onfocus=JaVaSCript:alert(9) autofocus'\n    360, // '＜script＞alert(12)＜/script＞'\n    564, // '<IMG SRC=\"jav   ascript:alert('214');\">'\n    569, // '<IMG SRC=\" &#14;  javascript:alert('219');\">'\n    729, // 'Powerلُلُصّبُلُلصّبُررً ॣ ॣh ॣ ॣ冗'\n    730, // '🏳0🌈️'\n    731, // 'జ్ఞ‌ా'\n    737, // 'گچپژ'\n];\n\n// #[tokio::test]\n// async fn test_client_context_field_against_naughty_strings_list() {\n//     tracing_subscriber::fmt::init();\n//\n//     // re-add `aws-config = { path = \"../../build/aws-sdk/aws-config\" }` to this project's Cargo.toml\n//     let config = aws_config::load_from_env().await;\n//     let client = aws_sdk_lambda::Client::new(&config);\n//     let invalid_request_content_exception = \"InvalidRequestContentException: Client context must be a valid Base64-encoded JSON object.\";\n//     let unrecognized_client_exception =\n//         \"UnrecognizedClientException: The security token included in the request is invalid.\";\n//\n//     let mut encountered_errors = false;\n//\n//     for (idx, line) in NAUGHTY_STRINGS.split('\\n').enumerate() {\n//         // Some lines in blns aren't even accepted by the AWS CLI so it's reasonable to skip them\n//         if SKIPPED_LINES.contains(&(idx + 1)) {\n//             continue;\n//         }\n//\n//         // add lines to metadata unless they're a comment or empty\n//         // Some naughty strings aren't valid HeaderValues so we skip those too\n//         if !line.starts_with(\"#\") && !line.is_empty() && HeaderValue::from_str(line).is_ok() {\n//             let err = client\n//                 .invoke()\n//                 .function_name(\"testFunctionThatDoesNothing\")\n//                 .client_context(line)\n//                 .send()\n//                 .await\n//                 .unwrap_err();\n//\n//             match err.to_string() {\n//                 // If this happens, it means that someone tried to run the test without valid creds\n//                 err if err == unrecognized_client_exception => {\n//                     panic!(\"Set valid credentials before running this test.\");\n//                 }\n//                 // This is the expected error so we ignore it and continue\n//                 err if err == invalid_request_content_exception => continue,\n//                 // Other errors are bad and so we bring attention to them\n//                 err => {\n//                     encountered_errors = true;\n//                     // 1 is added to idx because line numbers start at one\n//                     eprintln!(\n//                         \"line {} '{}' caused unexpected error: {}\",\n//                         idx + 1,\n//                         line,\n//                         err\n//                     );\n//                 }\n//             }\n//         }\n//     }\n//\n//     if encountered_errors {\n//         panic!(\n//             \"one or more errors were encountered while testing lambda invoke with naughty strings\"\n//         );\n//     }\n// }\n"
  },
  {
    "path": "aws/sdk/integration-tests/lambda/tests/request_id.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_sdk_lambda::config::{Credentials, Region};\nuse aws_sdk_lambda::operation::list_functions::ListFunctionsError;\nuse aws_sdk_lambda::operation::RequestId;\nuse aws_sdk_lambda::{Client, Config};\nuse aws_smithy_http_client::test_util::infallible_client_fn;\n\n#[allow(deprecated)]\nasync fn run_test(\n    response: impl Fn() -> http_1x::Response<&'static str> + Send + Sync + 'static,\n    expect_error: bool,\n) {\n    let http_client = infallible_client_fn(move |_| response());\n    let conf = Config::builder()\n        .http_client(http_client)\n        .credentials_provider(Credentials::for_tests())\n        .region(Region::from_static(\"us-east-1\"))\n        .build();\n    let client = Client::from_conf(conf);\n    let resp = client.list_functions().send().await;\n    if expect_error {\n        let err = resp.expect_err(\"should be an error\").into_service_error();\n        assert!(matches!(err, ListFunctionsError::Unhandled(_)));\n        assert_eq!(Some(\"correct-request-id\"), err.request_id());\n        assert_eq!(Some(\"correct-request-id\"), err.meta().request_id());\n    } else {\n        let output = resp.expect(\"should be successful\");\n        assert_eq!(Some(\"correct-request-id\"), output.request_id());\n    }\n}\n\n#[tokio::test]\nasync fn get_request_id_from_unmodeled_error() {\n    run_test(\n        || {\n            http_1x::Response::builder()\n                .header(\"x-amzn-RequestId\", \"correct-request-id\")\n                .header(\"X-Amzn-Errortype\", \"ListFunctions\")\n                .status(500)\n                .body(\"{}\")\n                .unwrap()\n        },\n        true,\n    )\n    .await;\n}\n\n#[tokio::test]\nasync fn get_request_id_from_successful_response() {\n    run_test(\n        || {\n            http_1x::Response::builder()\n                .header(\"x-amzn-RequestId\", \"correct-request-id\")\n                .status(200)\n                .body(r#\"{\"Functions\":[],\"NextMarker\":null}\"#)\n                .unwrap()\n        },\n        false,\n    )\n    .await;\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/no-default-features/Cargo.toml",
    "content": "[package]\nname = \"no-default-features\"\nversion = \"0.1.0\"\nauthors = [\"Zelda Hessler <zhessler@amazon.com>\"]\ndescription = \"\"\"\nThese tests ensure that things will fail (or not fail) as expected\nwhen default features are disabled for all SDK and runtime crates.\n\"\"\"\nedition = \"2021\"\nlicense = \"Apache-2.0\"\nrepository = \"https://github.com/smithy-lang/smithy-rs\"\npublish = false\n\n# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html\n\n[dev-dependencies]\naws-config = { path = \"../../build/aws-sdk/sdk/aws-config\", default-features = false }\naws-sdk-s3 = { path = \"../../build/aws-sdk/sdk/s3\", default-features = false }\naws-smithy-async = { path = \"../../build/aws-sdk/sdk/aws-smithy-async\" }\naws-smithy-runtime = { path = \"../../build/aws-sdk/sdk/aws-smithy-runtime\", features = [\"test-util\"] }\naws-smithy-http-client = { path = \"../../build/aws-sdk/sdk/aws-smithy-http-client\", features = [\"test-util\"] }\naws-credential-types = { path = \"../../build/aws-sdk/sdk/aws-credential-types\", features = [\"test-util\"] }\nfutures = \"0.3.25\"\ntokio = { version = \"1.23.1\", features = [\"full\", \"test-util\"] }\ntracing-subscriber = { version = \"0.3.15\", features = [\"env-filter\"] }\nhttp-1x = { package = \"http\", version = \"1\" }\n"
  },
  {
    "path": "aws/sdk/integration-tests/no-default-features/tests/client-construction.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_sdk_s3::config::IdentityCache;\n\nuse aws_sdk_s3::config::{\n    retry::RetryConfig, timeout::TimeoutConfig, BehaviorVersion, Config, Credentials, Region,\n    SharedAsyncSleep, Sleep, StalledStreamProtectionConfig,\n};\nuse aws_sdk_s3::primitives::SdkBody;\nuse aws_smithy_http_client::test_util::infallible_client_fn;\n\nuse aws_sdk_s3::error::DisplayErrorContext;\nuse aws_smithy_async::rt::sleep::AsyncSleep;\nuse aws_smithy_http_client::test_util::capture_request;\nuse aws_smithy_runtime::test_util::capture_test_logs::capture_test_logs;\nuse std::time::Duration;\n\n// This will fail due to lack of a connector when constructing the SDK Config\n// If this test doesn't panic, you may have accidentally unified features, resulting in\n// the connector being enabled transitively\n#[tokio::test]\n#[should_panic(\n    expected = \"Enable the `default-https-client` crate feature or configure an HTTP client to fix this.\"\n)]\nasync fn test_clients_from_sdk_config() {\n    aws_config::load_defaults(BehaviorVersion::latest()).await;\n}\n\n// This will fail due to lack of a connector when constructing the service client\n#[tokio::test]\nasync fn test_clients_from_service_config() {\n    use aws_sdk_s3::config::Region;\n\n    #[derive(Clone, Debug)]\n    struct StubSleep;\n    impl AsyncSleep for StubSleep {\n        fn sleep(&self, _duration: Duration) -> Sleep {\n            Sleep::new(Box::pin(async { /* no-op */ }))\n        }\n    }\n\n    let config = Config::builder()\n        .region(Region::new(\"us-east-1\"))\n        .credentials_provider(Credentials::for_tests())\n        .sleep_impl(SharedAsyncSleep::new(StubSleep))\n        .behavior_version(BehaviorVersion::latest())\n        .build();\n    // Creating the client shouldn't panic or error since presigning doesn't require a connector\n    let client = aws_sdk_s3::Client::from_conf(config);\n\n    let err = client\n        .list_buckets()\n        .send()\n        .await\n        .expect_err(\"it should fail to send a request because there is no HTTP client\");\n    let msg = format!(\"{}\", DisplayErrorContext(err));\n    assert!(\n        msg.contains(\"No HTTP client was available to send this request. Enable the `default-https-client` crate feature or configure an HTTP client to fix this.\"),\n        \"expected '{msg}' to contain 'No HTTP client was available to send this request. Enable the `default-https-client` crate feature or set an HTTP client to fix this.'\"\n    );\n}\n\n#[tokio::test]\n#[should_panic(expected = \"Invalid client configuration: A behavior major version must be set\")]\nasync fn test_missing_behavior_version() {\n    use aws_sdk_s3::config::Region;\n    let http_client =\n        infallible_client_fn(|_req| http_1x::Response::builder().body(SdkBody::empty()).unwrap());\n\n    let config = Config::builder()\n        .region(Region::new(\"us-east-1\"))\n        .identity_cache(IdentityCache::no_cache())\n        .credentials_provider(Credentials::for_tests())\n        .http_client(http_client)\n        .build();\n    // This line panics\n    let _client = aws_sdk_s3::Client::from_conf(config);\n}\n\n#[tokio::test]\n#[should_panic(\n    expected = \"Invalid client configuration: An async sleep implementation is required for retry to work.\"\n)]\nasync fn test_missing_async_sleep_time_source_retries() {\n    let _logs = capture_test_logs();\n    let (http_client, _) = capture_request(None);\n\n    // Configure retry and timeouts without providing a sleep impl\n    let config = Config::builder()\n        .http_client(http_client)\n        .region(Region::new(\"us-east-1\"))\n        .credentials_provider(Credentials::for_tests())\n        .retry_config(RetryConfig::standard())\n        .timeout_config(TimeoutConfig::disabled())\n        .behavior_version(BehaviorVersion::latest())\n        .build();\n\n    // should panic with a validation error\n    let _client = aws_sdk_s3::Client::from_conf(config);\n}\n\n#[tokio::test]\n#[should_panic(\n    expected = \"Invalid client configuration: An async sleep implementation is required for timeouts to work.\"\n)]\nasync fn test_missing_async_sleep_time_source_timeouts() {\n    let _logs = capture_test_logs();\n    let (http_client, _) = capture_request(None);\n\n    // Configure retry and timeouts without providing a sleep impl\n    let config = Config::builder()\n        .http_client(http_client)\n        .region(Region::new(\"us-east-1\"))\n        .credentials_provider(Credentials::for_tests())\n        .retry_config(RetryConfig::disabled())\n        .behavior_version(BehaviorVersion::latest())\n        .timeout_config(\n            TimeoutConfig::builder()\n                .operation_timeout(Duration::from_secs(5))\n                .build(),\n        )\n        .build();\n\n    // should panic with a validation error\n    let _client = aws_sdk_s3::Client::from_conf(config);\n}\n\n#[tokio::test]\n#[should_panic(\n    expected = \"Invalid client configuration: Lazy identity caching requires an async sleep implementation to be configured.\"\n)]\nasync fn test_time_source_for_identity_cache() {\n    let _logs = capture_test_logs();\n    let (http_client, _) = capture_request(None);\n\n    // Configure an identity cache without providing a sleep impl or time source\n    let config = Config::builder()\n        .http_client(http_client)\n        .region(Region::new(\"us-east-1\"))\n        .identity_cache(IdentityCache::lazy().build())\n        .credentials_provider(Credentials::for_tests())\n        .retry_config(RetryConfig::disabled())\n        .stalled_stream_protection(StalledStreamProtectionConfig::disabled())\n        .timeout_config(TimeoutConfig::disabled())\n        .behavior_version(BehaviorVersion::latest())\n        .build();\n\n    // should panic with a validation error\n    let _client = aws_sdk_s3::Client::from_conf(config);\n}\n\n#[allow(deprecated)] // intentionally testing an old behavior version\n#[tokio::test]\nasync fn behavior_mv_from_aws_config() {\n    let (http_client, req) = capture_request(None);\n    let cfg = aws_config::defaults(BehaviorVersion::v2023_11_09())\n        .http_client(http_client)\n        .retry_config(RetryConfig::disabled())\n        .credentials_provider(Credentials::for_tests())\n        .identity_cache(IdentityCache::no_cache())\n        .timeout_config(TimeoutConfig::disabled())\n        .stalled_stream_protection(StalledStreamProtectionConfig::disabled())\n        .region(Region::new(\"us-west-2\"))\n        .load()\n        .await;\n    let s3_client = aws_sdk_s3::Client::new(&cfg);\n    let _err = s3_client\n        .list_buckets()\n        .send()\n        .await\n        .expect_err(\"it should fail to send a request because there is no HTTP client\");\n    assert!(req\n        .expect_request()\n        .uri()\n        .starts_with(\"https://s3.us-west-2.amazonaws.com/\"));\n}\n\n#[allow(deprecated)] // intentionally testing an old behavior version\n#[tokio::test]\nasync fn behavior_mv_from_client_construction() {\n    let (http_client, req) = capture_request(None);\n    let cfg = aws_config::SdkConfig::builder()\n        .http_client(http_client)\n        .retry_config(RetryConfig::disabled())\n        .identity_cache(IdentityCache::no_cache())\n        .timeout_config(TimeoutConfig::disabled())\n        .stalled_stream_protection(StalledStreamProtectionConfig::disabled())\n        .region(Region::new(\"us-west-2\"))\n        .build();\n    let s3_client = aws_sdk_s3::Client::from_conf(\n        aws_sdk_s3::config::Builder::from(&cfg)\n            .credentials_provider(Credentials::for_tests())\n            .behavior_version(aws_sdk_s3::config::BehaviorVersion::v2023_11_09())\n            .build(),\n    );\n    let _err = dbg!(s3_client\n        .list_buckets()\n        .send()\n        .await\n        .expect_err(\"it should fail to send a request because there is no HTTP client\"));\n    assert!(req\n        .expect_request()\n        .uri()\n        .starts_with(\"https://s3.us-west-2.amazonaws.com/\"));\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/polly/Cargo.toml",
    "content": "# This Cargo.toml is unused in generated code. It exists solely to enable these tests to compile in-situ\n[package]\nname = \"polly-tests\"\nversion = \"0.1.0\"\nauthors = [\"John DiSanti <jdisanti@amazon.com>\"]\nedition = \"2021\"\nlicense = \"Apache-2.0\"\nrepository = \"https://github.com/smithy-lang/smithy-rs\"\npublish = false\n\n# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html\n\n[dev-dependencies]\naws-credential-types = { path = \"../../build/aws-sdk/sdk/aws-credential-types\", features = [\"test-util\"] }\naws-sdk-polly = { path = \"../../build/aws-sdk/sdk/polly\", features = [\"behavior-version-latest\"] }\naws-smithy-http = { path = \"../../build/aws-sdk/sdk/aws-smithy-http\" }\nbytes = \"1.0.0\"\nhttp-1x = { package = \"http\", version = \"1\" }\ntokio = { version = \"1.23.1\", features = [\"full\"]}\ntracing-subscriber = { version = \"0.3.15\", features = [\"env-filter\"] }\n"
  },
  {
    "path": "aws/sdk/integration-tests/polly/tests/presigning.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_sdk_polly as polly;\nuse polly::config::{Config, Credentials, Region};\nuse polly::presigning::PresigningConfig;\nuse polly::types::{OutputFormat, VoiceId};\nuse std::time::{Duration, SystemTime};\n\n#[tokio::test]\nasync fn test_presigning() {\n    let config = Config::builder()\n        .credentials_provider(Credentials::for_tests_with_session_token())\n        .region(Region::new(\"us-east-1\"))\n        .build();\n    let client = polly::Client::from_conf(config);\n\n    let presigned = client\n        .synthesize_speech()\n        .output_format(OutputFormat::Mp3)\n        .text(\"hello, world\")\n        .voice_id(VoiceId::Joanna)\n        .presigned(\n            PresigningConfig::builder()\n                .start_time(SystemTime::UNIX_EPOCH + Duration::from_secs(1234567891))\n                .expires_in(Duration::from_secs(30))\n                .build()\n                .unwrap(),\n        )\n        .await\n        .expect(\"success\");\n\n    let uri = presigned.uri().parse::<http_1x::Uri>().unwrap();\n    let pq = uri.path_and_query().unwrap();\n    let path = pq.path();\n    let query = pq.query().unwrap();\n    let mut query_params: Vec<&str> = query.split('&').collect();\n    query_params.sort();\n\n    assert_eq!(\"GET\", presigned.method());\n    assert_eq!(\"/v1/speech\", path);\n    assert_eq!(\n        &[\n            \"OutputFormat=mp3\",\n            \"Text=hello%2C%20world\",\n            \"VoiceId=Joanna\",\n            \"X-Amz-Algorithm=AWS4-HMAC-SHA256\",\n            \"X-Amz-Credential=ANOTREAL%2F20090213%2Fus-east-1%2Fpolly%2Faws4_request\",\n            \"X-Amz-Date=20090213T233131Z\",\n            \"X-Amz-Expires=30\",\n            \"X-Amz-Security-Token=notarealsessiontoken\",\n            \"X-Amz-Signature=79fcf765b063aa29d852fa9d7c2a9ccff94d727d743adbff84a0be6afe9a92e8\",\n            \"X-Amz-SignedHeaders=host\",\n        ][..],\n        &query_params\n    );\n    assert_eq!(presigned.headers().count(), 0);\n}\n\n#[tokio::test]\nasync fn test_presigning_customized() {\n    let config = Config::builder()\n        .credentials_provider(Credentials::for_tests_with_session_token())\n        .region(Region::new(\"us-east-1\"))\n        .build();\n    let client = polly::Client::from_conf(config);\n\n    let presigned = client\n        .synthesize_speech()\n        .output_format(OutputFormat::Mp3)\n        .text(\"hello, world\")\n        .voice_id(VoiceId::Joanna)\n        .customize()\n        .config_override(Config::builder().region(Region::new(\"us-west-1\")))\n        .mutate_request(|req| req.set_uri(req.uri().to_string() + \"&test\").expect(\"valid\"))\n        .presigned(\n            PresigningConfig::builder()\n                .start_time(SystemTime::UNIX_EPOCH + Duration::from_secs(1234567891))\n                .expires_in(Duration::from_secs(30))\n                .build()\n                .unwrap(),\n        )\n        .await\n        .expect(\"success\");\n\n    let uri = presigned.uri().parse::<http_1x::Uri>().unwrap();\n    let pq = uri.path_and_query().unwrap();\n    let path = pq.path();\n    let query = pq.query().unwrap();\n    let mut query_params: Vec<&str> = query.split('&').collect();\n    query_params.sort();\n\n    assert_eq!(\"GET\", presigned.method());\n    assert_eq!(\"/v1/speech\", path);\n    assert_eq!(\n        &[\n            \"OutputFormat=mp3\",\n            \"Text=hello%2C%20world\",\n            \"VoiceId=Joanna\",\n            \"X-Amz-Algorithm=AWS4-HMAC-SHA256\",\n            \"X-Amz-Credential=ANOTREAL%2F20090213%2Fus-west-1%2Fpolly%2Faws4_request\",\n            \"X-Amz-Date=20090213T233131Z\",\n            \"X-Amz-Expires=30\",\n            \"X-Amz-Security-Token=notarealsessiontoken\",\n            \"X-Amz-Signature=7cc39d2dfa3b8057f901b2827522790b48c6162571ed7e09c9725178c1cdd1fb\",\n            \"X-Amz-SignedHeaders=host\",\n            \"test\",\n        ][..],\n        &query_params\n    );\n    assert_eq!(presigned.headers().count(), 0);\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/s3/Cargo.toml",
    "content": "# This Cargo.toml is unused in generated code. It exists solely to enable these tests to compile in-situ\n[package]\nname = \"s3-tests\"\nversion = \"0.1.0\"\nauthors = [\"Russell Cohen <rcoh@amazon.com>\"]\nedition = \"2021\"\nlicense = \"Apache-2.0\"\nrepository = \"https://github.com/smithy-lang/smithy-rs\"\npublish = false\n\n# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html\n\n[features]\ndefault = [\"test-util\"]\ntest-util = []\n\n[dev-dependencies]\nasync-std = \"1.12.0\"\naws-config = { path = \"../../build/aws-sdk/sdk/aws-config\", features = [\"behavior-version-latest\"] }\naws-credential-types = { path = \"../../build/aws-sdk/sdk/aws-credential-types\", features = [\"test-util\"] }\naws-runtime = { path = \"../../build/aws-sdk/sdk/aws-runtime\", features = [\"test-util\"] }\naws-sdk-s3 = { path = \"../../build/aws-sdk/sdk/s3\", features = [\"test-util\", \"behavior-version-latest\"] }\naws-smithy-async = { path = \"../../build/aws-sdk/sdk/aws-smithy-async\", features = [\"test-util\", \"rt-tokio\"] }\naws-smithy-http = { path = \"../../build/aws-sdk/sdk/aws-smithy-http\" }\naws-smithy-protocol-test = { path = \"../../build/aws-sdk/sdk/aws-smithy-protocol-test\" }\naws-smithy-runtime = { path = \"../../build/aws-sdk/sdk/aws-smithy-runtime\", features = [\"test-util\"] }\naws-smithy-runtime-api = { path = \"../../build/aws-sdk/sdk/aws-smithy-runtime-api\", features = [\"test-util\", \"http-1x\"] }\naws-smithy-types = { path = \"../../build/aws-sdk/sdk/aws-smithy-types\" }\naws-smithy-http-client = { path = \"../../build/aws-sdk/sdk/aws-smithy-http-client\", features = [\"default-client\", \"rustls-ring\", \"test-util\", \"wire-mock\"] }\naws-smithy-mocks = { path = \"../../build/aws-sdk/sdk/aws-smithy-mocks\" }\naws-types = { path = \"../../build/aws-sdk/sdk/aws-types\" }\nbytes = \"1\"\nbytes-utils = \"0.1.2\"\nfastrand = \"2.3.0\"\nfutures-util = { version = \"0.3.29\", default-features = false, features = [\"alloc\"] }\nhdrhistogram = \"7.5.2\"\nhttp-1x = { package = \"http\", version = \"1\" }\nhttp-body-1x = { package = \"http-body\", version = \"1\" }\nhttp-body-util = \"0.1.3\"\nhyper = { version = \"0.14.26\", features = [\"stream\"] }\npretty_assertions = \"1.3\"\nserde_json = \"1\"\nsmol = \"1.2\"\ntempfile = \"3.16.0\"\ntokio = { version = \"1.23.1\", features = [\"macros\", \"test-util\", \"rt-multi-thread\"] }\ntracing = \"0.1.37\"\ntracing-appender = \"0.2.2\"\ntracing-subscriber = { version = \"0.3.15\", features = [\"env-filter\", \"json\"] }\n# If you're writing a test with this, take heed! `no-env-filter` means you'll be capturing\n# logs from everything that speaks, so be specific with your asserts.\ntracing-test = { version = \"0.2.4\", features = [\"no-env-filter\"] }\n\n[dependencies]\npin-project-lite = \"0.2.13\"\n"
  },
  {
    "path": "aws/sdk/integration-tests/s3/tests/alternative-async-runtime.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_config::retry::RetryConfig;\nuse aws_credential_types::provider::SharedCredentialsProvider;\nuse aws_sdk_s3::config::{Credentials, Region, StalledStreamProtectionConfig};\nuse aws_sdk_s3::types::{\n    CompressionType, CsvInput, CsvOutput, ExpressionType, FileHeaderInfo, InputSerialization,\n    OutputSerialization,\n};\nuse aws_sdk_s3::{Client, Config};\nuse aws_smithy_async::assert_elapsed;\nuse aws_smithy_async::rt::sleep::{AsyncSleep, SharedAsyncSleep, Sleep};\nuse aws_smithy_http_client::test_util::NeverClient;\nuse aws_smithy_runtime::test_util::capture_test_logs::capture_test_logs;\nuse aws_smithy_runtime_api::client::result::SdkError;\nuse aws_smithy_types::error::display::DisplayErrorContext;\nuse aws_smithy_types::timeout::TimeoutConfig;\nuse std::fmt::Debug;\nuse std::time::{Duration, Instant};\n\n#[derive(Debug)]\nstruct SmolSleep;\n\nimpl AsyncSleep for SmolSleep {\n    fn sleep(&self, duration: Duration) -> Sleep {\n        Sleep::new(async move {\n            smol::Timer::after(duration).await;\n        })\n    }\n}\n\n#[test]\nfn test_smol_runtime_timeouts() {\n    let _guard = capture_test_logs();\n\n    if let Err(err) = smol::block_on(async { timeout_test(SharedAsyncSleep::new(SmolSleep)).await })\n    {\n        println!(\"{err}\");\n        panic!();\n    }\n}\n\n#[test]\nfn test_smol_runtime_retry() {\n    let _guard = capture_test_logs();\n\n    if let Err(err) = smol::block_on(async { retry_test(SharedAsyncSleep::new(SmolSleep)).await }) {\n        println!(\"{err}\");\n        panic!();\n    }\n}\n\n#[derive(Debug)]\nstruct AsyncStdSleep;\n\nimpl AsyncSleep for AsyncStdSleep {\n    fn sleep(&self, duration: Duration) -> Sleep {\n        Sleep::new(async move { async_std::task::sleep(duration).await })\n    }\n}\n\n#[test]\nfn test_async_std_runtime_timeouts() {\n    let _guard = capture_test_logs();\n\n    if let Err(err) = async_std::task::block_on(async {\n        timeout_test(SharedAsyncSleep::new(AsyncStdSleep)).await\n    }) {\n        println!(\"{err}\");\n        panic!();\n    }\n}\n\n#[test]\nfn test_async_std_runtime_retry() {\n    let _guard = capture_test_logs();\n\n    if let Err(err) =\n        async_std::task::block_on(async { retry_test(SharedAsyncSleep::new(AsyncStdSleep)).await })\n    {\n        println!(\"{err}\");\n        panic!();\n    }\n}\n\nasync fn timeout_test(sleep_impl: SharedAsyncSleep) -> Result<(), Box<dyn std::error::Error>> {\n    let http_client = NeverClient::new();\n    let region = Region::from_static(\"us-east-2\");\n    let timeout_config = TimeoutConfig::builder()\n        .operation_timeout(Duration::from_secs_f32(0.5))\n        .build();\n    let config = Config::builder()\n        .region(region)\n        .http_client(http_client.clone())\n        .credentials_provider(Credentials::for_tests())\n        .timeout_config(timeout_config)\n        .sleep_impl(sleep_impl)\n        .build();\n    let client = Client::from_conf(config);\n\n    let now = Instant::now();\n\n    let err = client\n        .select_object_content()\n        .bucket(\"aws-rust-sdk\")\n        .key(\"sample_data.csv\")\n        .expression_type(ExpressionType::Sql)\n        .expression(\"SELECT * FROM s3object s WHERE s.\\\"Name\\\" = 'Jane'\")\n        .input_serialization(\n            InputSerialization::builder()\n                .csv(\n                    CsvInput::builder()\n                        .file_header_info(FileHeaderInfo::Use)\n                        .build(),\n                )\n                .compression_type(CompressionType::None)\n                .build(),\n        )\n        .output_serialization(\n            OutputSerialization::builder()\n                .csv(CsvOutput::builder().build())\n                .build(),\n        )\n        .send()\n        .await\n        .unwrap_err();\n\n    let expected = \"operation timeout (all attempts including retries) occurred after 500ms\";\n    let message = format!(\"{}\", DisplayErrorContext(err));\n    assert!(\n        message.contains(expected),\n        \"expected '{message}' to contain '{expected}'\"\n    );\n    // Assert 500ms have passed with a 150ms margin of error\n    assert_elapsed!(now, Duration::from_millis(500), Duration::from_millis(150));\n\n    Ok(())\n}\n\nasync fn retry_test(sleep_impl: SharedAsyncSleep) -> Result<(), Box<dyn std::error::Error>> {\n    let http_client = NeverClient::new();\n    let conf = aws_types::SdkConfig::builder()\n        .region(Region::new(\"us-east-2\"))\n        .http_client(http_client.clone())\n        .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests()))\n        .retry_config(RetryConfig::standard().with_max_attempts(3))\n        .stalled_stream_protection(StalledStreamProtectionConfig::disabled())\n        .timeout_config(\n            TimeoutConfig::builder()\n                .operation_attempt_timeout(Duration::from_secs_f64(0.1))\n                .build(),\n        )\n        .sleep_impl(sleep_impl)\n        .build();\n    let client = Client::new(&conf);\n    let resp = client\n        .list_buckets()\n        .send()\n        .await\n        .expect_err(\"call should fail\");\n    assert!(\n        matches!(resp, SdkError::TimeoutError { .. }),\n        \"expected a timeout error, got: {:?}\",\n        resp\n    );\n    assert_eq!(\n        3,\n        http_client.num_calls(),\n        \"client level timeouts should be retried\"\n    );\n\n    Ok(())\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/s3/tests/auth_scheme_preference.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_sdk_s3::config::Region;\nuse aws_sdk_s3::{Client, Config};\nuse aws_smithy_http_client::test_util::capture_request;\n\n// S3 is one of the servies that relies on endpoint-based auth scheme resolution.\n// An auth scheme preference should not be overridden by other resolution methods.\n\n#[tracing_test::traced_test]\n#[tokio::test]\nasync fn auth_scheme_preference_at_client_level_should_take_the_highest_priority() {\n    let (http_client, _) = capture_request(None);\n    let conf = Config::builder()\n        .http_client(http_client)\n        .region(Region::new(\"us-east-2\"))\n        .with_test_defaults()\n        // Explicitly set a preference that favors `sigv4`, otherwise `sigv4a`\n        // would normally be resolved based on the endpoint authSchemes property.\n        .auth_scheme_preference([aws_runtime::auth::sigv4::SCHEME_ID])\n        .build();\n    let client = Client::from_conf(conf);\n    let _ = client\n        .get_object()\n        .bucket(\"arn:aws:s3::123456789012:accesspoint/mfzwi23gnjvgw.mrap\")\n        .key(\"doesnotmatter\")\n        .send()\n        .await;\n\n    assert!(logs_contain(&format!(\n        \"resolving identity scheme_id=AuthSchemeId {{ scheme_id: \\\"{auth_scheme_id_str}\\\" }}\",\n        auth_scheme_id_str = aws_runtime::auth::sigv4::SCHEME_ID.inner(),\n    )));\n}\n\n#[tracing_test::traced_test]\n#[tokio::test]\nasync fn auth_scheme_preference_at_operation_level_should_take_the_highest_priority() {\n    let (http_client, _) = capture_request(None);\n    let conf = Config::builder()\n        .http_client(http_client)\n        .region(Region::new(\"us-east-2\"))\n        .with_test_defaults()\n        .build();\n    let client = Client::from_conf(conf);\n    let _ = client\n        .get_object()\n        .bucket(\"arn:aws:s3::123456789012:accesspoint/mfzwi23gnjvgw.mrap\")\n        .key(\"doesnotmatter\")\n        .customize()\n        .config_override(\n            // Explicitly set a preference that favors `sigv4`, otherwise `sigv4a`\n            // would normally be resolved based on the endpoint authSchemes property.\n            Config::builder().auth_scheme_preference([aws_runtime::auth::sigv4::SCHEME_ID]),\n        )\n        .send()\n        .await;\n\n    assert!(logs_contain(&format!(\n        \"resolving identity scheme_id=AuthSchemeId {{ scheme_id: \\\"{auth_scheme_id_str}\\\" }}\",\n        auth_scheme_id_str = aws_runtime::auth::sigv4::SCHEME_ID.inner(),\n    )));\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/s3/tests/aws_chunked.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::pin::Pin;\nuse std::task::{Context, Poll};\nuse std::time::{Duration, UNIX_EPOCH};\n\nuse aws_runtime::auth::PayloadSigningOverride;\nuse aws_runtime::content_encoding::header::X_AMZ_TRAILER_SIGNATURE;\nuse aws_runtime::content_encoding::{AwsChunkedBodyOptions, DeferredSigner};\nuse aws_sdk_s3::config::Region;\nuse aws_sdk_s3::error::DisplayErrorContext;\nuse aws_sdk_s3::primitives::ByteStream;\nuse aws_sdk_s3::{Client, Config};\nuse aws_smithy_async::test_util::ManualTimeSource;\nuse aws_smithy_async::time::SharedTimeSource;\nuse aws_smithy_http_client::test_util::capture_request;\nuse aws_smithy_http_client::test_util::dvr::ReplayingClient;\nuse aws_smithy_runtime_api::box_error::BoxError;\nuse aws_smithy_runtime_api::client::interceptors::context::BeforeTransmitInterceptorContextMut;\nuse aws_smithy_runtime_api::client::interceptors::Intercept;\nuse aws_smithy_runtime_api::client::runtime_components::RuntimeComponents;\nuse aws_smithy_types::config_bag::ConfigBag;\nuse bytes::Bytes;\nuse http_body_1x::{Body, SizeHint};\nuse pin_project_lite::pin_project;\n\n// Interceptor that forces chunk signing for testing purposes.\n//\n// Chunk signing during AWS chunked content encoding only occurs when requests are sent\n// without TLS. This interceptor overrides the `AwsChunkedContentEncodingInterceptor`\n// configuration to enable chunk signing for testing.\n#[derive(Debug)]\nstruct ForceChunkedSigningInterceptor {\n    time_source: ManualTimeSource,\n}\n\nimpl Intercept for ForceChunkedSigningInterceptor {\n    fn name(&self) -> &'static str {\n        \"ForceChunkedSigningInterceptor\"\n    }\n\n    fn modify_before_signing(\n        &self,\n        _context: &mut BeforeTransmitInterceptorContextMut<'_>,\n        _runtime_components: &RuntimeComponents,\n        cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        // Grab existing options and update them with signing enabled\n        let chunked_body_options = cfg\n            .get_mut_from_interceptor_state::<AwsChunkedBodyOptions>()\n            .expect(\"AwsChunkedBodyOptions should be set\");\n\n        let chunked_body_options = std::mem::take(chunked_body_options)\n            .signed_chunked_encoding(true)\n            .with_trailer_len((X_AMZ_TRAILER_SIGNATURE.len() + \":\".len() + 64) as u64);\n\n        cfg.interceptor_state().store_put(chunked_body_options);\n\n        let (signer, sender) = DeferredSigner::new();\n        cfg.interceptor_state().store_put(signer);\n        cfg.interceptor_state().store_put(sender);\n\n        cfg.interceptor_state()\n            .store_put(PayloadSigningOverride::StreamingSignedPayloadTrailer);\n\n        Ok(())\n    }\n\n    // Verifies the chunk signer uses a `StaticTimeSource` by advancing time by 1 second\n    // before transmission. If a dynamic time source were used, the test would fail with\n    // a chunk signature mismatch.\n    fn modify_before_transmit(\n        &self,\n        _context: &mut BeforeTransmitInterceptorContextMut<'_>,\n        _runtime_components: &RuntimeComponents,\n        _cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        self.time_source.advance(Duration::from_secs(1));\n        Ok(())\n    }\n}\n\n// Custom streaming body\npin_project! {\n    #[derive(Clone)]\n    struct TestBody {\n        data: Option<Bytes>,\n    }\n}\n\nimpl Body for TestBody {\n    type Data = Bytes;\n    type Error = aws_smithy_types::body::Error;\n\n    fn poll_frame(\n        self: Pin<&mut Self>,\n        _cx: &mut Context<'_>,\n    ) -> Poll<Option<Result<http_body_1x::Frame<Self::Data>, Self::Error>>> {\n        let this = self.project();\n\n        if let Some(data) = this.data.take() {\n            return Poll::Ready(Some(Ok(http_body_1x::Frame::data(data))));\n        }\n\n        Poll::Ready(None)\n    }\n\n    fn size_hint(&self) -> SizeHint {\n        let mut size = SizeHint::default();\n        size.set_lower(self.data.as_ref().map_or(0, |d| d.len() as u64));\n        size.set_upper(self.data.as_ref().map_or(0, |d| d.len() as u64));\n        size\n    }\n}\n\n#[tokio::test]\nasync fn test_signing_for_aws_chunked_content_encoding() {\n    let time_source = ManualTimeSource::new(UNIX_EPOCH + Duration::from_secs(1234567890));\n\n    let http_client = ReplayingClient::from_file(\"tests/data/aws_chunked/chunk-signing.json\")\n        .expect(\"recorded HTTP communication exists\");\n    let config = Config::builder()\n        .with_test_defaults()\n        .http_client(http_client.clone())\n        .region(Region::new(\"us-east-1\"))\n        .time_source(SharedTimeSource::new(time_source.clone()))\n        .aws_chunked_encoding_chunk_size(Some(8 * 1024)) // 8 KiB chunk size\n        .build();\n\n    let client = Client::from_conf(config);\n\n    // 10 KiB of 'a' characters. With a 8 KiB chunk size, the payload splits into four chunks:\n    // 8 KiB, 2 KiB, 0 bytes, and the final chunk containing trailing headers.\n    let data = \"a\".repeat(10 * 1024);\n    let body = TestBody {\n        data: Some(Bytes::from(data)),\n    };\n    let body = ByteStream::from_body_1_x(body);\n\n    let _ = dbg!(client\n        .put_object()\n        .body(body)\n        .bucket(\"test-bucket\")\n        .key(\"10KiBofA.txt\")\n        .customize()\n        .config_override(\n            Config::builder().interceptor(ForceChunkedSigningInterceptor { time_source })\n        )\n        .send()\n        .await\n        .unwrap());\n\n    http_client\n        .validate_body_and_headers(\n            Some(&[\"content-encoding\", \"x-amz-content-sha256\"]),\n            \"application/octet-stream\",\n        )\n        .await\n        .unwrap();\n}\n\n#[tokio::test]\nasync fn test_aws_chunked_content_encoding_with_custom_chunk_size() {\n    let http_client = ReplayingClient::from_file(\"tests/data/aws_chunked/custom-chunk-size.json\")\n        .expect(\"recorded HTTP communication exists\");\n    let config = Config::builder()\n        .with_test_defaults()\n        .http_client(http_client.clone())\n        .region(Region::new(\"us-east-1\"))\n        .build();\n\n    let client = Client::from_conf(config);\n\n    // 10 KiB of 'a' characters\n    let data = \"a\".repeat(10 * 1024);\n    let body = TestBody {\n        data: Some(Bytes::from(data)),\n    };\n    let body = ByteStream::from_body_1_x(body);\n\n    // Demonstrate that chunk size can be overridden per-request\n    let _ = dbg!(client\n        .put_object()\n        .body(body)\n        .bucket(\"test-bucket\")\n        .key(\"10KiBofA.txt\")\n        .customize()\n        .config_override(Config::builder().aws_chunked_encoding_chunk_size(Some(8 * 1024)))\n        .send()\n        .await\n        .unwrap());\n\n    http_client\n        .validate_body_and_headers(\n            Some(&[\"content-encoding\", \"x-amz-content-sha256\"]),\n            \"application/octet-stream\",\n        )\n        .await\n        .unwrap();\n}\n\n#[tokio::test]\nasync fn test_aws_chunked_content_encoding_with_no_chunking() {\n    let http_client = ReplayingClient::from_file(\"tests/data/aws_chunked/no-chunking.json\")\n        .expect(\"recorded HTTP communication exists\");\n    let config = Config::builder()\n        .with_test_defaults()\n        .http_client(http_client.clone())\n        .region(Region::new(\"us-east-1\"))\n        .aws_chunked_encoding_chunk_size(None) // No chunking\n        .build();\n\n    let client = Client::from_conf(config);\n\n    // 65 KiB of 'a' characters. Without chunking, the payload splits into two chunks:\n    // 65 KiB and the final chunk containg 0 bytes data and trailing headers.\n    let data = \"a\".repeat(65 * 1024);\n    let body = TestBody {\n        data: Some(Bytes::from(data)),\n    };\n    let body = ByteStream::from_body_1_x(body);\n\n    let _ = dbg!(client\n        .put_object()\n        .body(body)\n        .bucket(\"test-bucket\")\n        .key(\"65KiBofA.txt\")\n        .send()\n        .await\n        .unwrap());\n\n    http_client\n        .validate_body_and_headers(\n            Some(&[\"content-encoding\", \"x-amz-content-sha256\"]),\n            \"application/octet-stream\",\n        )\n        .await\n        .unwrap();\n}\n\n#[tokio::test]\nasync fn test_chunk_size_too_small_fails() {\n    let (http_client, _rcvr) = capture_request(None);\n    let config = Config::builder()\n        .with_test_defaults()\n        .http_client(http_client)\n        .region(Region::new(\"us-east-1\"))\n        .aws_chunked_encoding_chunk_size(Some(4096)) // Too small - less than 8 KiB\n        .build();\n\n    let client = Client::from_conf(config);\n\n    let data = \"a\".repeat(10 * 1024);\n    let body = TestBody {\n        data: Some(Bytes::from(data)),\n    };\n\n    let result = dbg!(\n        client\n            .put_object()\n            .body(ByteStream::from_body_1_x(body.clone()))\n            .bucket(\"test-bucket\")\n            .key(\"10KiBofA.txt\")\n            .send()\n            .await\n    );\n\n    assert!(result.is_err());\n    let err_msg = DisplayErrorContext(&result.unwrap_err()).to_string();\n    assert!(\n        err_msg.contains(\"Chunk size must be at least 8192 bytes, but 4096 was provided\"),\n        \"Expected error about minimum chunk size, got: {}\",\n        err_msg\n    );\n\n    let result = dbg!(\n        client\n            .put_object()\n            .body(ByteStream::from_body_1_x(body))\n            .bucket(\"test-bucket\")\n            .key(\"10KiBofA.txt\")\n            .customize()\n            .config_override(Config::builder().aws_chunked_encoding_chunk_size(Some(0))) // Test edge case of 0\n            .send()\n            .await\n    );\n\n    assert!(result.is_err());\n    let err_msg = DisplayErrorContext(&result.unwrap_err()).to_string();\n    assert!(\n        err_msg.contains(\"Chunk size must be at least 8192 bytes, but 0 was provided\"),\n        \"Expected error about minimum chunk size, got: {}\",\n        err_msg\n    );\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/s3/tests/blns/LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2015-2020 Max Woolf\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "aws/sdk/integration-tests/s3/tests/blns/blns.txt",
    "content": "# you can update the list of strings by running curl:\n# $ curl https://raw.githubusercontent.com/minimaxir/big-list-of-naughty-strings/master/blns.txt > blns.txt\n\n#\tReserved Strings\n#\n#\tStrings which may be used elsewhere in code\n\nundefined\nundef\nnull\nNULL\n(null)\nnil\nNIL\ntrue\nfalse\nTrue\nFalse\nTRUE\nFALSE\nNone\nhasOwnProperty\nthen\nconstructor\n\\\n\\\\\n\n#\tNumeric Strings\n#\n#\tStrings which can be interpreted as numeric\n\n0\n1\n1.00\n$1.00\n1/2\n1E2\n1E02\n1E+02\n-1\n-1.00\n-$1.00\n-1/2\n-1E2\n-1E02\n-1E+02\n1/0\n0/0\n-2147483648/-1\n-9223372036854775808/-1\n-0\n-0.0\n+0\n+0.0\n0.00\n0..0\n.\n0.0.0\n0,00\n0,,0\n,\n0,0,0\n0.0/0\n1.0/0.0\n0.0/0.0\n1,0/0,0\n0,0/0,0\n--1\n-\n-.\n-,\n999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999\nNaN\nInfinity\n-Infinity\nINF\n1#INF\n-1#IND\n1#QNAN\n1#SNAN\n1#IND\n0x0\n0xffffffff\n0xffffffffffffffff\n0xabad1dea\n123456789012345678901234567890123456789\n1,000.00\n1 000.00\n1'000.00\n1,000,000.00\n1 000 000.00\n1'000'000.00\n1.000,00\n1 000,00\n1'000,00\n1.000.000,00\n1 000 000,00\n1'000'000,00\n01000\n08\n09\n2.2250738585072011e-308\n\n#\tSpecial Characters\n#\n# ASCII punctuation.  All of these characters may need to be escaped in some\n# contexts.  Divided into three groups based on (US-layout) keyboard position.\n\n,./;'[]\\-=\n<>?:\"{}|_+\n!@#$%^&*()`~\n\n# Non-whitespace C0 controls: U+0001 through U+0008, U+000E through U+001F,\n# and U+007F (DEL)\n# Often forbidden to appear in various text-based file formats (e.g. XML),\n# or reused for internal delimiters on the theory that they should never\n# appear in input.\n# The next line may appear to be blank or mojibake in some viewers.\n\u0001\u0002\u0003\u0004\u0005\u0006\u0007\b\u000e\u000f\u0010\u0011\u0012\u0013\u0014\u0015\u0016\u0017\u0018\u0019\u001a\u001b\u001c\u001d\u001e\u001f\n\n# Non-whitespace C1 controls: U+0080 through U+0084 and U+0086 through U+009F.\n# Commonly misinterpreted as additional graphic characters.\n# The next line may appear to be blank, mojibake, or dingbats in some viewers.\n\n\n# Whitespace: all of the characters with category Zs, Zl, or Zp (in Unicode\n# version 8.0.0), plus U+0009 (HT), U+000B (VT), U+000C (FF), U+0085 (NEL),\n# and U+200B (ZERO WIDTH SPACE), which are in the C categories but are often\n# treated as whitespace in some contexts.\n# This file unfortunately cannot express strings containing\n# U+0000, U+000A, or U+000D (NUL, LF, CR).\n# The next line may appear to be blank or mojibake in some viewers.\n# The next line may be flagged for \"trailing whitespace\" in some viewers.\n\t\u000b\f              ​    　\n\n# Unicode additional control characters: all of the characters with\n# general category Cf (in Unicode 8.0.0).\n# The next line may appear to be blank or mojibake in some viewers.\n­؀؁؂؃؄؅؜۝܏᠎​‌‍‎‏‪‫‬‭‮⁠⁡⁢⁣⁤⁦⁧⁨⁩⁪⁫⁬⁭⁮⁯﻿￹￺￻𑂽𛲠𛲡𛲢𛲣𝅳𝅴𝅵𝅶𝅷𝅸𝅹𝅺󠀁󠀠󠀡󠀢󠀣󠀤󠀥󠀦󠀧󠀨󠀩󠀪󠀫󠀬󠀭󠀮󠀯󠀰󠀱󠀲󠀳󠀴󠀵󠀶󠀷󠀸󠀹󠀺󠀻󠀼󠀽󠀾󠀿󠁀󠁁󠁂󠁃󠁄󠁅󠁆󠁇󠁈󠁉󠁊󠁋󠁌󠁍󠁎󠁏󠁐󠁑󠁒󠁓󠁔󠁕󠁖󠁗󠁘󠁙󠁚󠁛󠁜󠁝󠁞󠁟󠁠󠁡󠁢󠁣󠁤󠁥󠁦󠁧󠁨󠁩󠁪󠁫󠁬󠁭󠁮󠁯󠁰󠁱󠁲󠁳󠁴󠁵󠁶󠁷󠁸󠁹󠁺󠁻󠁼󠁽󠁾󠁿\n\n# \"Byte order marks\", U+FEFF and U+FFFE, each on its own line.\n# The next two lines may appear to be blank or mojibake in some viewers.\n﻿\n￾\n\n#\tUnicode Symbols\n#\n#\tStrings which contain common unicode symbols (e.g. smart quotes)\n\nΩ≈ç√∫˜µ≤≥÷\nåß∂ƒ©˙∆˚¬…æ\nœ∑´®†¥¨ˆøπ“‘\n¡™£¢∞§¶•ªº–≠\n¸˛Ç◊ı˜Â¯˘¿\nÅÍÎÏ˝ÓÔÒÚÆ☃\nŒ„´‰ˇÁ¨ˆØ∏”’\n`⁄€‹›ﬁﬂ‡°·‚—±\n⅛⅜⅝⅞\nЁЂЃЄЅІЇЈЉЊЋЌЍЎЏАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя\n٠١٢٣٤٥٦٧٨٩\n\n#\tUnicode Subscript/Superscript/Accents\n#\n#\tStrings which contain unicode subscripts/superscripts; can cause rendering issues\n\n⁰⁴⁵\n₀₁₂\n⁰⁴⁵₀₁₂\nด้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็ ด้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็ ด้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็็้้้้้้้้็็็็็้้้้้็็็็\n\n#\tQuotation Marks\n#\n#\tStrings which contain misplaced quotation marks; can cause encoding errors\n\n'\n\"\n''\n\"\"\n'\"'\n\"''''\"'\"\n\"'\"'\"''''\"\n<foo val=“bar” />\n<foo val=“bar” />\n<foo val=”bar“ />\n<foo val=`bar' />\n\n#\tTwo-Byte Characters\n#\n#\tStrings which contain two-byte characters: can cause rendering issues or character-length issues\n\n田中さんにあげて下さい\nパーティーへ行かないか\n和製漢語\n部落格\n사회과학원 어학연구소\n찦차를 타고 온 펲시맨과 쑛다리 똠방각하\n社會科學院語學研究所\n울란바토르\n𠜎𠜱𠝹𠱓𠱸𠲖𠳏\n\n#\tStrings which contain two-byte letters: can cause issues with naïve UTF-16 capitalizers which think that 16 bits == 1 character\n\n𐐜 𐐔𐐇𐐝𐐀𐐡𐐇𐐓 𐐙𐐊𐐡𐐝𐐓/𐐝𐐇𐐗𐐊𐐤𐐔 𐐒𐐋𐐗 𐐒𐐌 𐐜 𐐡𐐀𐐖𐐇𐐤𐐓𐐝 𐐱𐑂 𐑄 𐐔𐐇𐐝𐐀𐐡𐐇𐐓 𐐏𐐆𐐅𐐤𐐆𐐚𐐊𐐡𐐝𐐆𐐓𐐆\n\n#\tSpecial Unicode Characters Union\n#\n#\tA super string recommended by VMware Inc. Globalization Team: can effectively cause rendering issues or character-length issues to validate product globalization readiness.\n#\n#\t表          CJK_UNIFIED_IDEOGRAPHS (U+8868)\n#\tポ          KATAKANA LETTER PO (U+30DD)\n#\tあ          HIRAGANA LETTER A (U+3042)\n#\tA           LATIN CAPITAL LETTER A (U+0041)\n#\t鷗          CJK_UNIFIED_IDEOGRAPHS (U+9DD7)\n#\tŒ           LATIN SMALL LIGATURE OE (U+0153)\n#\té           LATIN SMALL LETTER E WITH ACUTE (U+00E9)\n#\tＢ           FULLWIDTH LATIN CAPITAL LETTER B (U+FF22)\n#\t逍          CJK_UNIFIED_IDEOGRAPHS (U+900D)\n#\tÜ           LATIN SMALL LETTER U WITH DIAERESIS (U+00FC)\n#\tß           LATIN SMALL LETTER SHARP S (U+00DF)\n#\tª           FEMININE ORDINAL INDICATOR (U+00AA)\n#\tą           LATIN SMALL LETTER A WITH OGONEK (U+0105)\n#\tñ           LATIN SMALL LETTER N WITH TILDE (U+00F1)\n#\t丂          CJK_UNIFIED_IDEOGRAPHS (U+4E02)\n#\t㐀          CJK Ideograph Extension A, First (U+3400)\n#\t𠀀          CJK Ideograph Extension B, First (U+20000)\n\n表ポあA鷗ŒéＢ逍Üßªąñ丂㐀𠀀\n\n#\tChanging length when lowercased\n#\n#\tCharacters which increase in length (2 to 3 bytes) when lowercased\n#\tCredit: https://twitter.com/jifa/status/625776454479970304\n\nȺ\nȾ\n\n#\tJapanese Emoticons\n#\n#\tStrings which consists of Japanese-style emoticons which are popular on the web\n\nヽ༼ຈل͜ຈ༽ﾉ ヽ༼ຈل͜ຈ༽ﾉ\n(｡◕ ∀ ◕｡)\n｀ｨ(´∀｀∩\n__ﾛ(,_,*)\n・(￣∀￣)・:*:\nﾟ･✿ヾ╲(｡◕‿◕｡)╱✿･ﾟ\n,。・:*:・゜’( ☻ ω ☻ )。・:*:・゜’\n(╯°□°）╯︵ ┻━┻)\n(ﾉಥ益ಥ）ﾉ﻿ ┻━┻\n┬─┬ノ( º _ ºノ)\n( ͡° ͜ʖ ͡°)\n¯\\_(ツ)_/¯\n\n#\tEmoji\n#\n#\tStrings which contain Emoji; should be the same behavior as two-byte characters, but not always\n\n😍\n👩🏽\n👨‍🦰 👨🏿‍🦰 👨‍🦱 👨🏿‍🦱 🦹🏿‍♂️\n👾 🙇 💁 🙅 🙆 🙋 🙎 🙍\n🐵 🙈 🙉 🙊\n❤️ 💔 💌 💕 💞 💓 💗 💖 💘 💝 💟 💜 💛 💚 💙\n✋🏿 💪🏿 👐🏿 🙌🏿 👏🏿 🙏🏿\n👨‍👩‍👦 👨‍👩‍👧‍👦 👨‍👨‍👦 👩‍👩‍👧 👨‍👦 👨‍👧‍👦 👩‍👦 👩‍👧‍👦\n🚾 🆒 🆓 🆕 🆖 🆗 🆙 🏧\n0️⃣ 1️⃣ 2️⃣ 3️⃣ 4️⃣ 5️⃣ 6️⃣ 7️⃣ 8️⃣ 9️⃣ 🔟\n\n#       Regional Indicator Symbols\n#\n#       Regional Indicator Symbols can be displayed differently across\n#       fonts, and have a number of special behaviors\n\n🇺🇸🇷🇺🇸 🇦🇫🇦🇲🇸\n🇺🇸🇷🇺🇸🇦🇫🇦🇲\n🇺🇸🇷🇺🇸🇦\n\n#\tUnicode Numbers\n#\n#\tStrings which contain unicode numbers; if the code is localized, it should see the input as numeric\n\n１２３\n١٢٣\n\n#\tRight-To-Left Strings\n#\n#\tStrings which contain text that should be rendered RTL if possible (e.g. Arabic, Hebrew)\n\nثم نفس سقطت وبالتحديد،, جزيرتي باستخدام أن دنو. إذ هنا؟ الستار وتنصيب كان. أهّل ايطاليا، بريطانيا-فرنسا قد أخذ. سليمان، إتفاقية بين ما, يذكر الحدود أي بعد, معاملة بولندا، الإطلاق عل إيو.\nבְּרֵאשִׁית, בָּרָא אֱלֹהִים, אֵת הַשָּׁמַיִם, וְאֵת הָאָרֶץ\nהָיְתָהtestالصفحات التّحول\n﷽\nﷺ\nمُنَاقَشَةُ سُبُلِ اِسْتِخْدَامِ اللُّغَةِ فِي النُّظُمِ الْقَائِمَةِ وَفِيم يَخُصَّ التَّطْبِيقَاتُ الْحاسُوبِيَّةُ،\nالكل في المجمو عة (5)\n\n#\tOgham Text\n#\n#\tThe only unicode alphabet to use a space which isn't empty but should still act like a space.\n\n᚛ᚄᚓᚐᚋᚒᚄ ᚑᚄᚂᚑᚏᚅ᚜\n᚛                 ᚜\n\n#\tTrick Unicode\n#\n#\tStrings which contain unicode with unusual properties (e.g. Right-to-left override) (c.f. http://www.unicode.org/charts/PDF/U2000.pdf)\n\n‪‪test‪\n‫test‫\n test \ntest⁠test‫\n⁦test⁧\n\n#\tZalgo Text\n#\n#\tStrings which contain \"corrupted\" text. The corruption will not appear in non-HTML text, however. (via http://www.eeemo.net)\n\nṰ̺̺̕o͞ ̷i̲̬͇̪͙n̝̗͕v̟̜̘̦͟o̶̙̰̠kè͚̮̺̪̹̱̤ ̖t̝͕̳̣̻̪͞h̼͓̲̦̳̘̲e͇̣̰̦̬͎ ̢̼̻̱̘h͚͎͙̜̣̲ͅi̦̲̣̰̤v̻͍e̺̭̳̪̰-m̢iͅn̖̺̞̲̯̰d̵̼̟͙̩̼̘̳ ̞̥̱̳̭r̛̗̘e͙p͠r̼̞̻̭̗e̺̠̣͟s̘͇̳͍̝͉e͉̥̯̞̲͚̬͜ǹ̬͎͎̟̖͇̤t͍̬̤͓̼̭͘ͅi̪̱n͠g̴͉ ͏͉ͅc̬̟h͡a̫̻̯͘o̫̟̖͍̙̝͉s̗̦̲.̨̹͈̣\n̡͓̞ͅI̗̘̦͝n͇͇͙v̮̫ok̲̫̙͈i̖͙̭̹̠̞n̡̻̮̣̺g̲͈͙̭͙̬͎ ̰t͔̦h̞̲e̢̤ ͍̬̲͖f̴̘͕̣è͖ẹ̥̩l͖͔͚i͓͚̦͠n͖͍̗͓̳̮g͍ ̨o͚̪͡f̘̣̬ ̖̘͖̟͙̮c҉͔̫͖͓͇͖ͅh̵̤̣͚͔á̗̼͕ͅo̼̣̥s̱͈̺̖̦̻͢.̛̖̞̠̫̰\n̗̺͖̹̯͓Ṯ̤͍̥͇͈h̲́e͏͓̼̗̙̼̣͔ ͇̜̱̠͓͍ͅN͕͠e̗̱z̘̝̜̺͙p̤̺̹͍̯͚e̠̻̠͜r̨̤͍̺̖͔̖̖d̠̟̭̬̝͟i̦͖̩͓͔̤a̠̗̬͉̙n͚͜ ̻̞̰͚ͅh̵͉i̳̞v̢͇ḙ͎͟-҉̭̩̼͔m̤̭̫i͕͇̝̦n̗͙ḍ̟ ̯̲͕͞ǫ̟̯̰̲͙̻̝f ̪̰̰̗̖̭̘͘c̦͍̲̞͍̩̙ḥ͚a̮͎̟̙͜ơ̩̹͎s̤.̝̝ ҉Z̡̖̜͖̰̣͉̜a͖̰͙̬͡l̲̫̳͍̩g̡̟̼̱͚̞̬ͅo̗͜.̟\n̦H̬̤̗̤͝e͜ ̜̥̝̻͍̟́w̕h̖̯͓o̝͙̖͎̱̮ ҉̺̙̞̟͈W̷̼̭a̺̪͍į͈͕̭͙̯̜t̶̼̮s̘͙͖̕ ̠̫̠B̻͍͙͉̳ͅe̵h̵̬͇̫͙i̹͓̳̳̮͎̫̕n͟d̴̪̜̖ ̰͉̩͇͙̲͞ͅT͖̼͓̪͢h͏͓̮̻e̬̝̟ͅ ̤̹̝W͙̞̝͔͇͝ͅa͏͓͔̹̼̣l̴͔̰̤̟͔ḽ̫.͕\nZ̮̞̠͙͔ͅḀ̗̞͈̻̗Ḷ͙͎̯̹̞͓G̻O̭̗̮\n\n#\tUnicode Upsidedown\n#\n#\tStrings which contain unicode with an \"upsidedown\" effect (via http://www.upsidedowntext.com)\n\n˙ɐnbᴉlɐ ɐuƃɐɯ ǝɹolop ʇǝ ǝɹoqɐl ʇn ʇunpᴉpᴉɔuᴉ ɹodɯǝʇ poɯsnᴉǝ op pǝs 'ʇᴉlǝ ƃuᴉɔsᴉdᴉpɐ ɹnʇǝʇɔǝsuoɔ 'ʇǝɯɐ ʇᴉs ɹolop ɯnsdᴉ ɯǝɹo˥\n00˙Ɩ$-\n\n#\tUnicode font\n#\n#\tStrings which contain bold/italic/etc. versions of normal characters\n\nＴｈｅ ｑｕｉｃｋ ｂｒｏｗｎ ｆｏｘ ｊｕｍｐｓ ｏｖｅｒ ｔｈｅ ｌａｚｙ ｄｏｇ\n𝐓𝐡𝐞 𝐪𝐮𝐢𝐜𝐤 𝐛𝐫𝐨𝐰𝐧 𝐟𝐨𝐱 𝐣𝐮𝐦𝐩𝐬 𝐨𝐯𝐞𝐫 𝐭𝐡𝐞 𝐥𝐚𝐳𝐲 𝐝𝐨𝐠\n𝕿𝖍𝖊 𝖖𝖚𝖎𝖈𝖐 𝖇𝖗𝖔𝖜𝖓 𝖋𝖔𝖝 𝖏𝖚𝖒𝖕𝖘 𝖔𝖛𝖊𝖗 𝖙𝖍𝖊 𝖑𝖆𝖟𝖞 𝖉𝖔𝖌\n𝑻𝒉𝒆 𝒒𝒖𝒊𝒄𝒌 𝒃𝒓𝒐𝒘𝒏 𝒇𝒐𝒙 𝒋𝒖𝒎𝒑𝒔 𝒐𝒗𝒆𝒓 𝒕𝒉𝒆 𝒍𝒂𝒛𝒚 𝒅𝒐𝒈\n𝓣𝓱𝓮 𝓺𝓾𝓲𝓬𝓴 𝓫𝓻𝓸𝔀𝓷 𝓯𝓸𝔁 𝓳𝓾𝓶𝓹𝓼 𝓸𝓿𝓮𝓻 𝓽𝓱𝓮 𝓵𝓪𝔃𝔂 𝓭𝓸𝓰\n𝕋𝕙𝕖 𝕢𝕦𝕚𝕔𝕜 𝕓𝕣𝕠𝕨𝕟 𝕗𝕠𝕩 𝕛𝕦𝕞𝕡𝕤 𝕠𝕧𝕖𝕣 𝕥𝕙𝕖 𝕝𝕒𝕫𝕪 𝕕𝕠𝕘\n𝚃𝚑𝚎 𝚚𝚞𝚒𝚌𝚔 𝚋𝚛𝚘𝚠𝚗 𝚏𝚘𝚡 𝚓𝚞𝚖𝚙𝚜 𝚘𝚟𝚎𝚛 𝚝𝚑𝚎 𝚕𝚊𝚣𝚢 𝚍𝚘𝚐\n⒯⒣⒠ ⒬⒰⒤⒞⒦ ⒝⒭⒪⒲⒩ ⒡⒪⒳ ⒥⒰⒨⒫⒮ ⒪⒱⒠⒭ ⒯⒣⒠ ⒧⒜⒵⒴ ⒟⒪⒢\n\n#\tScript Injection\n#\n#\tStrings which attempt to invoke a benign script injection; shows vulnerability to XSS\n\n<script>alert(0)</script>\n&lt;script&gt;alert(&#39;1&#39;);&lt;/script&gt;\n<img src=x onerror=alert(2) />\n<svg><script>123<1>alert(3)</script>\n\"><script>alert(4)</script>\n'><script>alert(5)</script>\n><script>alert(6)</script>\n</script><script>alert(7)</script>\n< / script >< script >alert(8)< / script >\n onfocus=JaVaSCript:alert(9) autofocus\n\" onfocus=JaVaSCript:alert(10) autofocus\n' onfocus=JaVaSCript:alert(11) autofocus\n＜script＞alert(12)＜/script＞\n<sc<script>ript>alert(13)</sc</script>ript>\n--><script>alert(14)</script>\n\";alert(15);t=\"\n';alert(16);t='\nJavaSCript:alert(17)\n;alert(18);\nsrc=JaVaSCript:prompt(19)\n\"><script>alert(20);</script x=\"\n'><script>alert(21);</script x='\n><script>alert(22);</script x=\n\" autofocus onkeyup=\"javascript:alert(23)\n' autofocus onkeyup='javascript:alert(24)\n<script\\x20type=\"text/javascript\">javascript:alert(25);</script>\n<script\\x3Etype=\"text/javascript\">javascript:alert(26);</script>\n<script\\x0Dtype=\"text/javascript\">javascript:alert(27);</script>\n<script\\x09type=\"text/javascript\">javascript:alert(28);</script>\n<script\\x0Ctype=\"text/javascript\">javascript:alert(29);</script>\n<script\\x2Ftype=\"text/javascript\">javascript:alert(30);</script>\n<script\\x0Atype=\"text/javascript\">javascript:alert(31);</script>\n'`\"><\\x3Cscript>javascript:alert(32)</script>\n'`\"><\\x00script>javascript:alert(33)</script>\nABC<div style=\"x\\x3Aexpression(javascript:alert(34)\">DEF\nABC<div style=\"x:expression\\x5C(javascript:alert(35)\">DEF\nABC<div style=\"x:expression\\x00(javascript:alert(36)\">DEF\nABC<div style=\"x:exp\\x00ression(javascript:alert(37)\">DEF\nABC<div style=\"x:exp\\x5Cression(javascript:alert(38)\">DEF\nABC<div style=\"x:\\x0Aexpression(javascript:alert(39)\">DEF\nABC<div style=\"x:\\x09expression(javascript:alert(40)\">DEF\nABC<div style=\"x:\\xE3\\x80\\x80expression(javascript:alert(41)\">DEF\nABC<div style=\"x:\\xE2\\x80\\x84expression(javascript:alert(42)\">DEF\nABC<div style=\"x:\\xC2\\xA0expression(javascript:alert(43)\">DEF\nABC<div style=\"x:\\xE2\\x80\\x80expression(javascript:alert(44)\">DEF\nABC<div style=\"x:\\xE2\\x80\\x8Aexpression(javascript:alert(45)\">DEF\nABC<div style=\"x:\\x0Dexpression(javascript:alert(46)\">DEF\nABC<div style=\"x:\\x0Cexpression(javascript:alert(47)\">DEF\nABC<div style=\"x:\\xE2\\x80\\x87expression(javascript:alert(48)\">DEF\nABC<div style=\"x:\\xEF\\xBB\\xBFexpression(javascript:alert(49)\">DEF\nABC<div style=\"x:\\x20expression(javascript:alert(50)\">DEF\nABC<div style=\"x:\\xE2\\x80\\x88expression(javascript:alert(51)\">DEF\nABC<div style=\"x:\\x00expression(javascript:alert(52)\">DEF\nABC<div style=\"x:\\xE2\\x80\\x8Bexpression(javascript:alert(53)\">DEF\nABC<div style=\"x:\\xE2\\x80\\x86expression(javascript:alert(54)\">DEF\nABC<div style=\"x:\\xE2\\x80\\x85expression(javascript:alert(55)\">DEF\nABC<div style=\"x:\\xE2\\x80\\x82expression(javascript:alert(56)\">DEF\nABC<div style=\"x:\\x0Bexpression(javascript:alert(57)\">DEF\nABC<div style=\"x:\\xE2\\x80\\x81expression(javascript:alert(58)\">DEF\nABC<div style=\"x:\\xE2\\x80\\x83expression(javascript:alert(59)\">DEF\nABC<div style=\"x:\\xE2\\x80\\x89expression(javascript:alert(60)\">DEF\n<a href=\"\\x0Bjavascript:javascript:alert(61)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\x0Fjavascript:javascript:alert(62)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\xC2\\xA0javascript:javascript:alert(63)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\x05javascript:javascript:alert(64)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\xE1\\xA0\\x8Ejavascript:javascript:alert(65)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\x18javascript:javascript:alert(66)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\x11javascript:javascript:alert(67)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\xE2\\x80\\x88javascript:javascript:alert(68)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\xE2\\x80\\x89javascript:javascript:alert(69)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\xE2\\x80\\x80javascript:javascript:alert(70)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\x17javascript:javascript:alert(71)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\x03javascript:javascript:alert(72)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\x0Ejavascript:javascript:alert(73)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\x1Ajavascript:javascript:alert(74)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\x00javascript:javascript:alert(75)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\x10javascript:javascript:alert(76)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\xE2\\x80\\x82javascript:javascript:alert(77)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\x20javascript:javascript:alert(78)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\x13javascript:javascript:alert(79)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\x09javascript:javascript:alert(80)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\xE2\\x80\\x8Ajavascript:javascript:alert(81)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\x14javascript:javascript:alert(82)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\x19javascript:javascript:alert(83)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\xE2\\x80\\xAFjavascript:javascript:alert(84)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\x1Fjavascript:javascript:alert(85)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\xE2\\x80\\x81javascript:javascript:alert(86)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\x1Djavascript:javascript:alert(87)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\xE2\\x80\\x87javascript:javascript:alert(88)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\x07javascript:javascript:alert(89)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\xE1\\x9A\\x80javascript:javascript:alert(90)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\xE2\\x80\\x83javascript:javascript:alert(91)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\x04javascript:javascript:alert(92)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\x01javascript:javascript:alert(93)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\x08javascript:javascript:alert(94)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\xE2\\x80\\x84javascript:javascript:alert(95)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\xE2\\x80\\x86javascript:javascript:alert(96)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\xE3\\x80\\x80javascript:javascript:alert(97)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\x12javascript:javascript:alert(98)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\x0Djavascript:javascript:alert(99)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\x0Ajavascript:javascript:alert(100)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\x0Cjavascript:javascript:alert(101)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\x15javascript:javascript:alert(102)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\xE2\\x80\\xA8javascript:javascript:alert(103)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\x16javascript:javascript:alert(104)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\x02javascript:javascript:alert(105)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\x1Bjavascript:javascript:alert(106)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\x06javascript:javascript:alert(107)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\xE2\\x80\\xA9javascript:javascript:alert(108)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\xE2\\x80\\x85javascript:javascript:alert(109)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\x1Ejavascript:javascript:alert(110)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\xE2\\x81\\x9Fjavascript:javascript:alert(111)\" id=\"fuzzelement1\">test</a>\n<a href=\"\\x1Cjavascript:javascript:alert(112)\" id=\"fuzzelement1\">test</a>\n<a href=\"javascript\\x00:javascript:alert(113)\" id=\"fuzzelement1\">test</a>\n<a href=\"javascript\\x3A:javascript:alert(114)\" id=\"fuzzelement1\">test</a>\n<a href=\"javascript\\x09:javascript:alert(115)\" id=\"fuzzelement1\">test</a>\n<a href=\"javascript\\x0D:javascript:alert(116)\" id=\"fuzzelement1\">test</a>\n<a href=\"javascript\\x0A:javascript:alert(117)\" id=\"fuzzelement1\">test</a>\n`\"'><img src=xxx:x \\x0Aonerror=javascript:alert(118)>\n`\"'><img src=xxx:x \\x22onerror=javascript:alert(119)>\n`\"'><img src=xxx:x \\x0Bonerror=javascript:alert(120)>\n`\"'><img src=xxx:x \\x0Donerror=javascript:alert(121)>\n`\"'><img src=xxx:x \\x2Fonerror=javascript:alert(122)>\n`\"'><img src=xxx:x \\x09onerror=javascript:alert(123)>\n`\"'><img src=xxx:x \\x0Conerror=javascript:alert(124)>\n`\"'><img src=xxx:x \\x00onerror=javascript:alert(125)>\n`\"'><img src=xxx:x \\x27onerror=javascript:alert(126)>\n`\"'><img src=xxx:x \\x20onerror=javascript:alert(127)>\n\"`'><script>\\x3Bjavascript:alert(128)</script>\n\"`'><script>\\x0Djavascript:alert(129)</script>\n\"`'><script>\\xEF\\xBB\\xBFjavascript:alert(130)</script>\n\"`'><script>\\xE2\\x80\\x81javascript:alert(131)</script>\n\"`'><script>\\xE2\\x80\\x84javascript:alert(132)</script>\n\"`'><script>\\xE3\\x80\\x80javascript:alert(133)</script>\n\"`'><script>\\x09javascript:alert(134)</script>\n\"`'><script>\\xE2\\x80\\x89javascript:alert(135)</script>\n\"`'><script>\\xE2\\x80\\x85javascript:alert(136)</script>\n\"`'><script>\\xE2\\x80\\x88javascript:alert(137)</script>\n\"`'><script>\\x00javascript:alert(138)</script>\n\"`'><script>\\xE2\\x80\\xA8javascript:alert(139)</script>\n\"`'><script>\\xE2\\x80\\x8Ajavascript:alert(140)</script>\n\"`'><script>\\xE1\\x9A\\x80javascript:alert(141)</script>\n\"`'><script>\\x0Cjavascript:alert(142)</script>\n\"`'><script>\\x2Bjavascript:alert(143)</script>\n\"`'><script>\\xF0\\x90\\x96\\x9Ajavascript:alert(144)</script>\n\"`'><script>-javascript:alert(145)</script>\n\"`'><script>\\x0Ajavascript:alert(146)</script>\n\"`'><script>\\xE2\\x80\\xAFjavascript:alert(147)</script>\n\"`'><script>\\x7Ejavascript:alert(148)</script>\n\"`'><script>\\xE2\\x80\\x87javascript:alert(149)</script>\n\"`'><script>\\xE2\\x81\\x9Fjavascript:alert(150)</script>\n\"`'><script>\\xE2\\x80\\xA9javascript:alert(151)</script>\n\"`'><script>\\xC2\\x85javascript:alert(152)</script>\n\"`'><script>\\xEF\\xBF\\xAEjavascript:alert(153)</script>\n\"`'><script>\\xE2\\x80\\x83javascript:alert(154)</script>\n\"`'><script>\\xE2\\x80\\x8Bjavascript:alert(155)</script>\n\"`'><script>\\xEF\\xBF\\xBEjavascript:alert(156)</script>\n\"`'><script>\\xE2\\x80\\x80javascript:alert(157)</script>\n\"`'><script>\\x21javascript:alert(158)</script>\n\"`'><script>\\xE2\\x80\\x82javascript:alert(159)</script>\n\"`'><script>\\xE2\\x80\\x86javascript:alert(160)</script>\n\"`'><script>\\xE1\\xA0\\x8Ejavascript:alert(161)</script>\n\"`'><script>\\x0Bjavascript:alert(162)</script>\n\"`'><script>\\x20javascript:alert(163)</script>\n\"`'><script>\\xC2\\xA0javascript:alert(164)</script>\n<img \\x00src=x onerror=\"alert(165)\">\n<img \\x47src=x onerror=\"javascript:alert(166)\">\n<img \\x11src=x onerror=\"javascript:alert(167)\">\n<img \\x12src=x onerror=\"javascript:alert(168)\">\n<img\\x47src=x onerror=\"javascript:alert(169)\">\n<img\\x10src=x onerror=\"javascript:alert(170)\">\n<img\\x13src=x onerror=\"javascript:alert(171)\">\n<img\\x32src=x onerror=\"javascript:alert(172)\">\n<img\\x47src=x onerror=\"javascript:alert(173)\">\n<img\\x11src=x onerror=\"javascript:alert(174)\">\n<img \\x47src=x onerror=\"javascript:alert(175)\">\n<img \\x34src=x onerror=\"javascript:alert(176)\">\n<img \\x39src=x onerror=\"javascript:alert(177)\">\n<img \\x00src=x onerror=\"javascript:alert(178)\">\n<img src\\x09=x onerror=\"javascript:alert(179)\">\n<img src\\x10=x onerror=\"javascript:alert(180)\">\n<img src\\x13=x onerror=\"javascript:alert(181)\">\n<img src\\x32=x onerror=\"javascript:alert(182)\">\n<img src\\x12=x onerror=\"javascript:alert(183)\">\n<img src\\x11=x onerror=\"javascript:alert(184)\">\n<img src\\x00=x onerror=\"javascript:alert(185)\">\n<img src\\x47=x onerror=\"javascript:alert(186)\">\n<img src=x\\x09onerror=\"javascript:alert(187)\">\n<img src=x\\x10onerror=\"javascript:alert(188)\">\n<img src=x\\x11onerror=\"javascript:alert(189)\">\n<img src=x\\x12onerror=\"javascript:alert(190)\">\n<img src=x\\x13onerror=\"javascript:alert(191)\">\n<img[a][b][c]src[d]=x[e]onerror=[f]\"alert(192)\">\n<img src=x onerror=\\x09\"javascript:alert(193)\">\n<img src=x onerror=\\x10\"javascript:alert(194)\">\n<img src=x onerror=\\x11\"javascript:alert(195)\">\n<img src=x onerror=\\x12\"javascript:alert(196)\">\n<img src=x onerror=\\x32\"javascript:alert(197)\">\n<img src=x onerror=\\x00\"javascript:alert(198)\">\n<a href=java&#1&#2&#3&#4&#5&#6&#7&#8&#11&#12script:javascript:alert(199)>XXX</a>\n<img src=\"x` `<script>javascript:alert(200)</script>\"` `>\n<img src onerror /\" '\"= alt=javascript:alert(201)//\">\n<title onpropertychange=javascript:alert(202)></title><title title=>\n<a href=http://foo.bar/#x=`y></a><img alt=\"`><img src=x:x onerror=javascript:alert(203)></a>\">\n<!--[if]><script>javascript:alert(204)</script -->\n<!--[if<img src=x onerror=javascript:alert(205)//]> -->\n<script src=\"/\\%(jscript)s\"></script>\n<script src=\"\\\\%(jscript)s\"></script>\n<IMG \"\"\"><SCRIPT>alert(\"206\")</SCRIPT>\">\n<IMG SRC=javascript:alert(String.fromCharCode(50,48,55))>\n<IMG SRC=# onmouseover=\"alert('208')\">\n<IMG SRC= onmouseover=\"alert('209')\">\n<IMG onmouseover=\"alert('210')\">\n<IMG SRC=&#106;&#97;&#118;&#97;&#115;&#99;&#114;&#105;&#112;&#116;&#58;&#97;&#108;&#101;&#114;&#116;&#40;&#39;&#50;&#49;&#49;&#39;&#41;>\n<IMG SRC=&#0000106&#0000097&#0000118&#0000097&#0000115&#0000099&#0000114&#0000105&#0000112&#0000116&#0000058&#0000097&#0000108&#0000101&#0000114&#0000116&#0000040&#0000039&#0000050&#0000049&#0000050&#0000039&#0000041>\n<IMG SRC=&#x6A&#x61&#x76&#x61&#x73&#x63&#x72&#x69&#x70&#x74&#x3A&#x61&#x6C&#x65&#x72&#x74&#x28&#x27&#x32&#x31&#x33&#x27&#x29>\n<IMG SRC=\"jav   ascript:alert('214');\">\n<IMG SRC=\"jav&#x09;ascript:alert('215');\">\n<IMG SRC=\"jav&#x0A;ascript:alert('216');\">\n<IMG SRC=\"jav&#x0D;ascript:alert('217');\">\nperl -e 'print \"<IMG SRC=java\\0script:alert(\\\"218\\\")>\";' > out\n<IMG SRC=\" &#14;  javascript:alert('219');\">\n<SCRIPT/XSS SRC=\"http://ha.ckers.org/xss.js\"></SCRIPT>\n<BODY onload!#$%&()*~+-_.,:;?@[/|\\]^`=alert(\"220\")>\n<SCRIPT/SRC=\"http://ha.ckers.org/xss.js\"></SCRIPT>\n<<SCRIPT>alert(\"221\");//<</SCRIPT>\n<SCRIPT SRC=http://ha.ckers.org/xss.js?< B >\n<SCRIPT SRC=//ha.ckers.org/.j>\n<IMG SRC=\"javascript:alert('222')\"\n<iframe src=http://ha.ckers.org/scriptlet.html <\n\\\";alert('223');//\n<u oncopy=alert()> Copy me</u>\n<i onwheel=alert(224)> Scroll over me </i>\n<plaintext>\nhttp://a/%%30%30\n</textarea><script>alert(225)</script>\n\n#\tSQL Injection\n#\n#\tStrings which can cause a SQL injection if inputs are not sanitized\n\n1;DROP TABLE users\n1'; DROP TABLE users-- 1\n' OR 1=1 -- 1\n' OR '1'='1\n'; EXEC sp_MSForEachTable 'DROP TABLE ?'; --\n\n%\n_\n\n#\tServer Code Injection\n#\n#\tStrings which can cause user to run code on server as a privileged user (c.f. https://news.ycombinator.com/item?id=7665153)\n\n-\n--\n--version\n--help\n$USER\n/dev/null; touch /tmp/blns.fail ; echo\n`touch /tmp/blns.fail`\n$(touch /tmp/blns.fail)\n@{[system \"touch /tmp/blns.fail\"]}\n\n#\tCommand Injection (Ruby)\n#\n#\tStrings which can call system commands within Ruby/Rails applications\n\neval(\"puts 'hello world'\")\nSystem(\"ls -al /\")\n`ls -al /`\nKernel.exec(\"ls -al /\")\nKernel.exit(1)\n%x('ls -al /')\n\n#      XXE Injection (XML)\n#\n#\tString which can reveal system files when parsed by a badly configured XML parser\n\n<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?><!DOCTYPE foo [ <!ELEMENT foo ANY ><!ENTITY xxe SYSTEM \"file:///etc/passwd\" >]><foo>&xxe;</foo>\n\n#\tUnwanted Interpolation\n#\n#\tStrings which can be accidentally expanded into different strings if evaluated in the wrong context, e.g. used as a printf format string or via Perl or shell eval. Might expose sensitive data from the program doing the interpolation, or might just represent the wrong string.\n\n$HOME\n$ENV{'HOME'}\n%d\n%s%s%s%s%s\n{0}\n%*.*s\n%@\n%n\nFile:///\n\n#\tFile Inclusion\n#\n#\tStrings which can cause user to pull in files that should not be a part of a web server\n\n../../../../../../../../../../../etc/passwd%00\n../../../../../../../../../../../etc/hosts\n\n#\tKnown CVEs and Vulnerabilities\n#\n#\tStrings that test for known vulnerabilities\n\n() { 0; }; touch /tmp/blns.shellshock1.fail;\n() { _; } >_[$($())] { touch /tmp/blns.shellshock2.fail; }\n<<< %s(un='%s') = %u\n+++ATH0\n\n#\tMSDOS/Windows Special Filenames\n#\n#\tStrings which are reserved characters in MSDOS/Windows\n\nCON\nPRN\nAUX\nCLOCK$\nNUL\nA:\nZZ:\nCOM1\nLPT1\nLPT2\nLPT3\nCOM2\nCOM3\nCOM4\n\n#   IRC specific strings\n#\n#   Strings that may occur on IRC clients that make security products freak out\n\nDCC SEND STARTKEYLOGGER 0 0 0\n\n#\tScunthorpe Problem\n#\n#\tInnocuous strings which may be blocked by profanity filters (https://en.wikipedia.org/wiki/Scunthorpe_problem)\n\nScunthorpe General Hospital\nPenistone Community Church\nLightwater Country Park\nJimmy Clitheroe\nHorniman Museum\nshitake mushrooms\nRomansInSussex.co.uk\nhttp://www.cum.qc.ca/\nCraig Cockburn, Software Specialist\nLinda Callahan\nDr. Herman I. Libshitz\nmagna cum laude\nSuper Bowl XXX\nmedieval erection of parapets\nevaluate\nmocha\nexpression\nArsenal canal\nclassic\nTyson Gay\nDick Van Dyke\nbasement\n\n#\tHuman injection\n#\n#\tStrings which may cause human to reinterpret worldview\n\nIf you're reading this, you've been in a coma for almost 20 years now. We're trying a new technique. We don't know where this message will end up in your dream, but we hope it works. Please wake up, we miss you.\n\n#\tTerminal escape codes\n#\n#\tStrings which punish the fools who use cat/type on this file\n\nRoses are \u001b[0;31mred\u001b[0m, violets are \u001b[0;34mblue. Hope you enjoy terminal hue\nBut now...\u001b[20Cfor my greatest trick...\u001b[8m\nThe quic\b\b\b\b\b\bk brown fo\u0007\u0007\u0007\u0007\u0007\u0007\u0007\u0007\u0007\u0007\u0007x... [Beeeep]\n\n#\tiOS Vulnerabilities\n#\n#\tStrings which crashed iMessage in various versions of iOS\n\nPowerلُلُصّبُلُلصّبُررً ॣ ॣh ॣ ॣ冗\n🏳0🌈️\nజ్ఞ‌ా\n\n# Persian special characters\n#\n# This is a four characters string which includes Persian special characters (گچپژ)\n\nگچپژ\n\n# jinja2 injection\n#\n# first one is supposed to raise \"MemoryError\" exception\n# second, obviously, prints contents of /etc/passwd\n\n{% print 'x' * 64 * 1024**3 %}\n{{ \"\".__class__.__mro__[2].__subclasses__()[40](\"/etc/passwd\").read() }}\n"
  },
  {
    "path": "aws/sdk/integration-tests/s3/tests/body_size_hint.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Body wrappers must pass through size_hint\n\nuse aws_config::SdkConfig;\nuse aws_sdk_s3::{\n    config::{Credentials, Region, SharedCredentialsProvider},\n    primitives::{ByteStream, SdkBody},\n    Client,\n};\nuse aws_smithy_http_client::test_util::{capture_request, infallible_client_fn};\nuse http_body_1x::Body;\n\n#[tokio::test]\nasync fn download_body_size_hint_check() {\n    let test_body_content = b\"hello\";\n    let test_body = || SdkBody::from(&test_body_content[..]);\n    assert_eq!(\n        Some(test_body_content.len() as u64),\n        (test_body)().size_hint().exact(),\n        \"pre-condition check\"\n    );\n\n    let http_client = infallible_client_fn(move |_| {\n        http_1x::Response::builder()\n            .status(200)\n            .body((test_body)())\n            .unwrap()\n    });\n    let sdk_config = SdkConfig::builder()\n        .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests()))\n        .region(Region::new(\"us-east-1\"))\n        .http_client(http_client)\n        .build();\n    let client = Client::new(&sdk_config);\n    let response = client\n        .get_object()\n        .bucket(\"foo\")\n        .key(\"foo\")\n        .send()\n        .await\n        .unwrap();\n    assert_eq!(\n        (\n            test_body_content.len() as u64,\n            Some(test_body_content.len() as u64),\n        ),\n        response.body.size_hint(),\n        \"the size hint should be passed through all the default body wrappers\"\n    );\n}\n\n#[tokio::test]\nasync fn upload_body_size_hint_check() {\n    let test_body_content = b\"hello\";\n\n    let (http_client, rx) = capture_request(None);\n    let sdk_config = SdkConfig::builder()\n        .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests()))\n        .region(Region::new(\"us-east-1\"))\n        .http_client(http_client)\n        .build();\n    let client = Client::new(&sdk_config);\n    let body = ByteStream::from_static(test_body_content);\n    assert_eq!(\n        (\n            test_body_content.len() as u64,\n            Some(test_body_content.len() as u64),\n        ),\n        body.size_hint(),\n        \"pre-condition check\"\n    );\n    let _response = client\n        .put_object()\n        .bucket(\"foo\")\n        .key(\"foo\")\n        .body(body)\n        .send()\n        .await;\n    let captured_request = rx.expect_request();\n    assert_eq!(\n        Some(test_body_content.len() as u64),\n        captured_request.body().size_hint().exact(),\n        \"the size hint should be passed through all the default body wrappers\"\n    );\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/s3/tests/bucket-required.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_config::SdkConfig;\nuse aws_credential_types::provider::SharedCredentialsProvider;\nuse aws_sdk_s3::config::{Credentials, Region, StalledStreamProtectionConfig};\nuse aws_sdk_s3::Client;\nuse aws_smithy_http_client::test_util::capture_request;\n\n#[tokio::test]\nasync fn dont_dispatch_when_bucket_is_unset() {\n    let (http_client, rcvr) = capture_request(None);\n    let sdk_config = SdkConfig::builder()\n        .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests()))\n        .region(Region::new(\"us-east-1\"))\n        .stalled_stream_protection(StalledStreamProtectionConfig::disabled())\n        .http_client(http_client.clone())\n        .build();\n    let client = Client::new(&sdk_config);\n    let err = client\n        .list_objects_v2()\n        .send()\n        .await\n        .expect_err(\"bucket not set\");\n    assert_eq!(format!(\"{}\", err), \"failed to construct request\");\n    rcvr.expect_no_request();\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/s3/tests/business_metrics.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_config::Region;\nuse aws_runtime::{\n    sdk_feature::AwsSdkFeature, user_agent::test_util::assert_ua_contains_metric_values,\n};\nuse aws_sdk_s3::{\n    config::{Intercept, IntoShared},\n    primitives::ByteStream,\n    Client, Config,\n};\nuse aws_smithy_http_client::test_util::capture_request;\n\n#[derive(Debug)]\nstruct TransferManagerFeatureInterceptor;\n\nimpl Intercept for TransferManagerFeatureInterceptor {\n    fn name(&self) -> &'static str {\n        \"TransferManagerFeature\"\n    }\n\n    fn read_before_execution(\n        &self,\n        _ctx: &aws_sdk_s3::config::interceptors::BeforeSerializationInterceptorContextRef<'_>,\n        cfg: &mut aws_sdk_s3::config::ConfigBag,\n    ) -> Result<(), aws_sdk_s3::error::BoxError> {\n        cfg.interceptor_state()\n            .store_append(AwsSdkFeature::S3Transfer);\n        Ok(())\n    }\n}\n\n#[tokio::test]\nasync fn test_track_metric_for_s3_transfer_manager() {\n    let (http_client, captured_request) = capture_request(None);\n    let mut conf_builder = Config::builder()\n        .region(Region::new(\"us-east-1\"))\n        .http_client(http_client.clone())\n        .with_test_defaults();\n    // The S3 Transfer Manager uses a passed-in S3 client SDK for operations.\n    // By configuring an interceptor at the client level to track metrics,\n    // all operations executed by the client will automatically include the metric.\n    // This eliminates the need to apply `.config_override` on individual operations\n    // to insert the `TransferManagerFeatureInterceptor`.\n    conf_builder.push_interceptor(TransferManagerFeatureInterceptor.into_shared());\n    let client = Client::from_conf(conf_builder.build());\n\n    let _ = client\n        .put_object()\n        .bucket(\"doesnotmatter\")\n        .key(\"doesnotmatter\")\n        .body(ByteStream::from_static(\"Hello, world\".as_bytes()))\n        .send()\n        .await\n        .unwrap();\n\n    let expected_req = captured_request.expect_request();\n    let user_agent = expected_req.headers().get(\"x-amz-user-agent\").unwrap();\n    assert_ua_contains_metric_values(user_agent, &[\"G\"]);\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/s3/tests/checksums.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n#![cfg(feature = \"test-util\")]\n\nuse aws_config::SdkConfig;\nuse aws_credential_types::provider::SharedCredentialsProvider;\nuse aws_sdk_s3::config::{Credentials, Region, StalledStreamProtectionConfig};\nuse aws_sdk_s3::operation::put_object::PutObjectOutput;\nuse aws_sdk_s3::primitives::ByteStream;\nuse aws_sdk_s3::types::ChecksumMode;\nuse aws_sdk_s3::{operation::get_object::GetObjectOutput, types::ChecksumAlgorithm};\nuse aws_sdk_s3::{Client, Config};\nuse aws_smithy_http_client::test_util::{capture_request, ReplayEvent, StaticReplayClient};\nuse aws_smithy_mocks::RuleMode;\nuse aws_smithy_runtime_api::box_error::BoxError;\nuse aws_smithy_runtime_api::client::http::{\n    HttpClient, HttpConnector, HttpConnectorFuture, HttpConnectorSettings, SharedHttpClient,\n    SharedHttpConnector,\n};\nuse aws_smithy_runtime_api::client::interceptors::context::BeforeTransmitInterceptorContextRef;\nuse aws_smithy_runtime_api::client::interceptors::Intercept;\nuse aws_smithy_runtime_api::client::orchestrator::HttpRequest;\nuse aws_smithy_runtime_api::client::runtime_components::RuntimeComponents;\nuse aws_smithy_runtime_api::shared::IntoShared;\nuse aws_smithy_types::body::SdkBody;\nuse aws_smithy_types::config_bag::ConfigBag;\nuse aws_smithy_types::retry::RetryConfig;\nuse http_1x::header::AUTHORIZATION;\nuse http_1x::{HeaderValue, Uri};\nuse std::path::PathBuf;\nuse std::sync::{Arc, Mutex};\nuse std::time::{Duration, UNIX_EPOCH};\nuse tracing_test::traced_test;\n\n/// Test connection for the movies IT\n/// headers are signed with actual creds, at some point we could replace them with verifiable test\n/// credentials, but there are plenty of other tests that target signing\nfn new_checksum_validated_response_test_connection(\n    checksum_header_name: &'static str,\n    checksum_header_value: &'static str,\n) -> StaticReplayClient {\n    StaticReplayClient::new(vec![ReplayEvent::new(\n        http_1x::Request::builder()\n            .header(\"x-amz-checksum-mode\", \"ENABLED\")\n            .header(\n                \"user-agent\",\n                \"aws-sdk-rust/0.123.test os/windows/XPSP3 lang/rust/1.50.0\",\n            )\n            .header(\"x-amz-date\", \"20090213T233130Z\")\n            .header(\n                \"x-amz-content-sha256\",\n                \"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\",\n            )\n            .header(\n                \"x-amz-user-agent\",\n                \"aws-sdk-rust/0.123.test api/test-service/0.123 os/windows/XPSP3 lang/rust/1.50.0\",\n            )\n            .header(\"authorization\", \"not-relevant\")\n            .uri(Uri::from_static(\n                \"https://some-test-bucket.s3.us-east-1.amazonaws.com/test.txt?x-id=GetObject\",\n            ))\n            .body(SdkBody::empty())\n            .unwrap(),\n        http_1x::Response::builder()\n            .header(\"x-amz-request-id\", \"4B4NGF0EAWN0GE63\")\n            .header(\"content-length\", \"11\")\n            .header(\"etag\", \"\\\"3e25960a79dbc69b674cd4ec67a72c62\\\"\")\n            .header(checksum_header_name, checksum_header_value)\n            .header(\"content-type\", \"application/octet-stream\")\n            .header(\"server\", \"AmazonS3\")\n            .header(\"content-encoding\", \"\")\n            .header(\"last-modified\", \"Tue, 21 Jun 2022 16:29:14 GMT\")\n            .header(\"date\", \"Tue, 21 Jun 2022 16:29:23 GMT\")\n            .header(\n                \"x-amz-id-2\",\n                \"kPl+IVVZAwsN8ePUyQJZ40WD9dzaqtr4eNESArqE68GSKtVvuvCTDe+SxhTT+JTUqXB1HL4OxNM=\",\n            )\n            .header(\"accept-ranges\", \"bytes\")\n            .status(http_1x::StatusCode::from_u16(200).unwrap())\n            .body(SdkBody::from(r#\"Hello world\"#))\n            .unwrap(),\n    )])\n}\n\nasync fn test_checksum_on_streaming_response(\n    checksum_header_name: &'static str,\n    checksum_header_value: &'static str,\n) -> GetObjectOutput {\n    let http_client = new_checksum_validated_response_test_connection(\n        checksum_header_name,\n        checksum_header_value,\n    );\n    let config = Config::builder()\n        .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests()))\n        .time_source(UNIX_EPOCH + Duration::from_secs(1624036048))\n        .region(Region::new(\"us-east-1\"))\n        .http_client(http_client.clone())\n        .with_test_defaults()\n        .build();\n    let client = Client::from_conf(config);\n\n    let res = client\n        .get_object()\n        .bucket(\"some-test-bucket\")\n        .key(\"test.txt\")\n        .checksum_mode(aws_sdk_s3::types::ChecksumMode::Enabled)\n        .send()\n        .await\n        .unwrap();\n\n    http_client.assert_requests_match(&[\n        \"x-amz-checksum-mode\",\n        \"x-amz-user-agent\",\n        AUTHORIZATION.as_str(),\n    ]);\n\n    res\n}\n\n#[tokio::test]\nasync fn test_crc32_checksum_on_streaming_response() {\n    let res = test_checksum_on_streaming_response(\"x-amz-checksum-crc32\", \"i9aeUg==\").await;\n\n    // Header checksums are base64 encoded\n    assert_eq!(res.checksum_crc32(), Some(\"i9aeUg==\"));\n    let body = collect_body_into_string(res.body.into_inner()).await;\n\n    assert_eq!(body, \"Hello world\");\n}\n\n#[tokio::test]\nasync fn test_crc32c_checksum_on_streaming_response() {\n    let res = test_checksum_on_streaming_response(\"x-amz-checksum-crc32c\", \"crUfeA==\").await;\n\n    // Header checksums are base64 encoded\n    assert_eq!(res.checksum_crc32_c(), Some(\"crUfeA==\"));\n    let body = collect_body_into_string(res.body.into_inner()).await;\n\n    assert_eq!(body, \"Hello world\");\n}\n\n#[tokio::test]\nasync fn test_sha1_checksum_on_streaming_response() {\n    let res =\n        test_checksum_on_streaming_response(\"x-amz-checksum-sha1\", \"e1AsOh9IyGCa4hLN+2Od7jlnP14=\")\n            .await;\n\n    // Header checksums are base64 encoded\n    assert_eq!(res.checksum_sha1(), Some(\"e1AsOh9IyGCa4hLN+2Od7jlnP14=\"));\n    let body = collect_body_into_string(res.body.into_inner()).await;\n\n    assert_eq!(body, \"Hello world\");\n}\n\n#[tokio::test]\nasync fn test_sha256_checksum_on_streaming_response() {\n    let res = test_checksum_on_streaming_response(\n        \"x-amz-checksum-sha256\",\n        \"ZOyIygCyaOW6GjVnihtTFtIS9PNmskdyMlNKiuyjfzw=\",\n    )\n    .await;\n\n    // Header checksums are base64 encoded\n    assert_eq!(\n        res.checksum_sha256(),\n        Some(\"ZOyIygCyaOW6GjVnihtTFtIS9PNmskdyMlNKiuyjfzw=\")\n    );\n    let body = collect_body_into_string(res.body.into_inner()).await;\n\n    assert_eq!(body, \"Hello world\");\n}\n\n// The test structure is identical for all supported checksum algorithms\nasync fn test_checksum_on_streaming_request<'a>(\n    body: &'static [u8],\n    checksum_algorithm: ChecksumAlgorithm,\n    checksum_header_name: &'static str,\n    expected_decoded_content_length: &'a str,\n    expected_encoded_content_length: &'a str,\n    expected_aws_chunked_encoded_body: &'a str,\n) {\n    let (http_client, rcvr) = capture_request(None);\n    let config = Config::builder()\n        .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests()))\n        .region(Region::new(\"us-east-1\"))\n        .http_client(http_client.clone())\n        .with_test_defaults()\n        .build();\n    let client = Client::from_conf(config);\n\n    // ByteStreams created from a file are streaming and have a known size\n    let mut file = tempfile::NamedTempFile::new().unwrap();\n    use std::io::Write;\n    file.write_all(body).unwrap();\n\n    let body = aws_sdk_s3::primitives::ByteStream::read_from()\n        .path(file.path())\n        .buffer_size(1024)\n        .build()\n        .await\n        .unwrap();\n\n    // The response from the fake connection won't return the expected XML but we don't care about\n    // that error in this test\n    let _ = client\n        .put_object()\n        .bucket(\"test-bucket\")\n        .key(\"test.txt\")\n        .content_encoding(\"custom\")\n        .body(body)\n        .checksum_algorithm(checksum_algorithm)\n        .send()\n        .await\n        .unwrap();\n\n    let mut req = rcvr.expect_request();\n\n    let headers = req.headers();\n    let x_amz_content_sha256 = headers\n        .get(\"x-amz-content-sha256\")\n        .expect(\"x-amz-content-sha256 header exists\");\n    let x_amz_trailer = headers\n        .get(\"x-amz-trailer\")\n        .expect(\"x-amz-trailer header exists\");\n    let x_amz_decoded_content_length = headers\n        .get(\"x-amz-decoded-content-length\")\n        .expect(\"x-amz-decoded-content-length header exists\");\n    let content_length = headers\n        .get(\"Content-Length\")\n        .expect(\"Content-Length header exists\");\n    let content_encoding = headers.get_all(\"Content-Encoding\").collect::<Vec<_>>();\n\n    assert_eq!(\n        HeaderValue::from_static(\"STREAMING-UNSIGNED-PAYLOAD-TRAILER\"),\n        x_amz_content_sha256,\n        \"signing header is incorrect\"\n    );\n    assert_eq!(\n        HeaderValue::from_static(checksum_header_name),\n        x_amz_trailer,\n        \"x-amz-trailer is incorrect\"\n    );\n    // The position for `aws-chunked` in `content_encoding` doesn't matter for the target service.\n    // The expected here just reflects the current behavior of appending `aws-chunked` to the header.\n    assert_eq!(vec![\"custom\", \"aws-chunked\"], content_encoding);\n\n    // The length of the string \"Hello world\"\n    assert_eq!(\n        HeaderValue::from_str(expected_decoded_content_length).unwrap(),\n        x_amz_decoded_content_length,\n        \"decoded content length was wrong\"\n    );\n    // The sum of the length of the original body, chunk markers, and trailers\n    assert_eq!(\n        HeaderValue::from_str(expected_encoded_content_length).unwrap(),\n        content_length,\n        \"content-length was expected to be {} but was {} instead\",\n        expected_encoded_content_length,\n        content_length\n    );\n\n    let body = collect_body_into_string(req.take_body()).await;\n    // When sending a streaming body with a checksum, the trailers are included as part of the body content\n    assert_eq!(body.as_str(), expected_aws_chunked_encoded_body,);\n}\n\n#[tokio::test]\nasync fn test_crc32_checksum_on_streaming_request() {\n    let expected_aws_chunked_encoded_body =\n        \"B\\r\\nHello world\\r\\n0\\r\\nx-amz-checksum-crc32:i9aeUg==\\r\\n\\r\\n\";\n    let expected_encoded_content_length = format!(\"{}\", expected_aws_chunked_encoded_body.len());\n    test_checksum_on_streaming_request(\n        b\"Hello world\",\n        ChecksumAlgorithm::Crc32,\n        \"x-amz-checksum-crc32\",\n        \"11\",\n        &expected_encoded_content_length,\n        expected_aws_chunked_encoded_body,\n    )\n    .await\n}\n\n// This test isn't a duplicate. It tests CRC32C (note the C) checksum request validation\n#[tokio::test]\nasync fn test_crc32c_checksum_on_streaming_request() {\n    let expected_aws_chunked_encoded_body =\n        \"B\\r\\nHello world\\r\\n0\\r\\nx-amz-checksum-crc32c:crUfeA==\\r\\n\\r\\n\";\n    let expected_encoded_content_length = format!(\"{}\", expected_aws_chunked_encoded_body.len());\n    test_checksum_on_streaming_request(\n        b\"Hello world\",\n        ChecksumAlgorithm::Crc32C,\n        \"x-amz-checksum-crc32c\",\n        \"11\",\n        &expected_encoded_content_length,\n        expected_aws_chunked_encoded_body,\n    )\n    .await\n}\n\n#[tokio::test]\nasync fn test_sha1_checksum_on_streaming_request() {\n    let expected_aws_chunked_encoded_body =\n        \"B\\r\\nHello world\\r\\n0\\r\\nx-amz-checksum-sha1:e1AsOh9IyGCa4hLN+2Od7jlnP14=\\r\\n\\r\\n\";\n    let expected_encoded_content_length = format!(\"{}\", expected_aws_chunked_encoded_body.len());\n    test_checksum_on_streaming_request(\n        b\"Hello world\",\n        ChecksumAlgorithm::Sha1,\n        \"x-amz-checksum-sha1\",\n        \"11\",\n        &expected_encoded_content_length,\n        expected_aws_chunked_encoded_body,\n    )\n    .await\n}\n\n#[tokio::test]\nasync fn test_sha256_checksum_on_streaming_request() {\n    let expected_aws_chunked_encoded_body = \"B\\r\\nHello world\\r\\n0\\r\\nx-amz-checksum-sha256:ZOyIygCyaOW6GjVnihtTFtIS9PNmskdyMlNKiuyjfzw=\\r\\n\\r\\n\";\n    let expected_encoded_content_length = format!(\"{}\", expected_aws_chunked_encoded_body.len());\n    test_checksum_on_streaming_request(\n        b\"Hello world\",\n        ChecksumAlgorithm::Sha256,\n        \"x-amz-checksum-sha256\",\n        \"11\",\n        &expected_encoded_content_length,\n        expected_aws_chunked_encoded_body,\n    )\n    .await\n}\n\nasync fn collect_body_into_string(body: aws_smithy_types::body::SdkBody) -> String {\n    use bytes::Buf;\n    use bytes_utils::SegmentedBuf;\n    use std::io::Read;\n\n    let mut stream = ByteStream::new(body);\n    let mut output = SegmentedBuf::new();\n    while let Some(buf) = stream.next().await {\n        output.push(buf.unwrap());\n    }\n\n    let mut output_text = String::new();\n    output\n        .reader()\n        .read_to_string(&mut output_text)\n        .expect(\"Doesn't cause IO errors\");\n\n    output_text\n}\n\n#[tokio::test]\n#[traced_test]\nasync fn test_get_multipart_upload_part_checksum_validation() {\n    let expected_checksum = \"cpjwid==-12\";\n    let (http_client, rcvr) = capture_request(Some(\n        http_1x::Response::builder()\n            .header(\"etag\", \"\\\"3e25960a79dbc69b674cd4ec67a72c62\\\"\")\n            .header(\"x-amz-checksum-crc32\", expected_checksum)\n            .body(SdkBody::empty())\n            .unwrap(),\n    ));\n    let sdk_config = SdkConfig::builder()\n        .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests()))\n        .region(Region::new(\"us-east-1\"))\n        .http_client(http_client.clone())\n        .stalled_stream_protection(StalledStreamProtectionConfig::disabled())\n        .build();\n    let client = Client::new(&sdk_config);\n\n    // The response from the fake connection won't return the expected XML but we don't care about\n    // that error in this test\n    let res = client\n        .get_object()\n        .bucket(\"test-bucket\")\n        .key(\"test.txt\")\n        .checksum_mode(ChecksumMode::Enabled)\n        .send()\n        .await\n        .expect(\"request should succeed, despite the non-base64-decodable checksum\");\n\n    let _req = rcvr.expect_request();\n\n    let actual_checksum = res.checksum_crc32().unwrap();\n    assert_eq!(expected_checksum, actual_checksum);\n\n    logs_assert(|lines: &[&str]| {\n        let checksum_warning = lines.iter().find(|&&line| {\n            line.contains(\"This checksum is a part-level checksum which can't be validated by the Rust SDK. Disable checksum validation for this request to fix this warning.\")\n        });\n\n        match checksum_warning {\n            Some(_) => Ok(()),\n            None => Err(\"Checksum warning was not issued\".to_string()),\n        }\n    });\n}\n\n#[tokio::test]\n#[traced_test]\nasync fn test_response_checksum_ignores_invalid_base64() {\n    let expected_checksum = \"{}{!!#{})!{)@$(}\";\n    let (http_client, rcvr) = capture_request(Some(\n        http_1x::Response::builder()\n            .header(\"etag\", \"\\\"3e25960a79dbc69b674cd4ec67a72c62\\\"\")\n            .header(\"x-amz-checksum-crc32\", expected_checksum)\n            .body(SdkBody::empty())\n            .unwrap(),\n    ));\n    let sdk_config = SdkConfig::builder()\n        .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests()))\n        .stalled_stream_protection(StalledStreamProtectionConfig::disabled())\n        .region(Region::new(\"us-east-1\"))\n        .http_client(http_client.clone())\n        .build();\n    let client = Client::new(&sdk_config);\n\n    // The response from the fake connection won't return the expected XML but we don't care about\n    // that error in this test\n    let res = client\n        .get_object()\n        .bucket(\"test-bucket\")\n        .key(\"test.txt\")\n        .checksum_mode(ChecksumMode::Enabled)\n        .send()\n        .await\n        .expect(\"request should succeed, despite the non-base64-decodable checksum\");\n\n    let _req = rcvr.expect_request();\n\n    let actual_checksum = res.checksum_crc32().unwrap();\n    assert_eq!(expected_checksum, actual_checksum);\n\n    logs_assert(|lines: &[&str]| {\n        let checksum_warning = lines.iter().find(|&&line| {\n            line.contains(\"Checksum received from server could not be base64 decoded. No checksum validation will be performed.\")\n        });\n\n        match checksum_warning {\n            Some(_) => Ok(()),\n            None => Err(\"Checksum error was not issued\".to_string()),\n        }\n    });\n}\n\n#[derive(Debug, Clone)]\nstruct CaptureHttpClient {\n    inner: SharedHttpClient,\n    captured_requests: Arc<Mutex<Vec<CapturedRequest>>>,\n}\n\nimpl CaptureHttpClient {\n    fn new() -> Self {\n        Self {\n            inner: aws_smithy_mocks::create_mock_http_client(),\n            captured_requests: Arc::new(Mutex::new(Vec::new())),\n        }\n    }\n\n    fn take_captured_requests(&self) -> Vec<CapturedRequest> {\n        let mut captured = self.captured_requests.lock().unwrap();\n        std::mem::take(&mut *captured)\n    }\n\n    fn attempt(&self) -> usize {\n        self.captured_requests.lock().unwrap().len() + 1\n    }\n}\n\n#[derive(Debug)]\nstruct CaptureConnector {\n    inner: SharedHttpConnector,\n    captured_requests: Arc<Mutex<Vec<CapturedRequest>>>,\n}\n\n#[derive(Debug)]\nstruct CapturedRequest {\n    headers: aws_smithy_runtime_api::http::Headers,\n    body: Result<http_body_util::Collected<bytes::Bytes>, BoxError>,\n}\n\nimpl CapturedRequest {\n    fn headers(&self) -> &aws_smithy_runtime_api::http::Headers {\n        &self.headers\n    }\n}\n\nimpl HttpConnector for CaptureConnector {\n    fn call(&self, request: HttpRequest) -> HttpConnectorFuture {\n        let captured_requests = self.captured_requests.clone();\n        let inner = self.inner.clone();\n        HttpConnectorFuture::new(async move {\n            let mut request = request;\n            // the body isn't read by the inner connector so it's safe to take it here\n            // we need to read it as if we were the actual server here and consume it to be able to\n            // test retry behavior of streaming bodies which must be read for checksums to be triggered\n            let body = request.take_body();\n\n            let output = http_body_util::BodyExt::collect(body)\n                .await\n                .map_err(|e| BoxError::from(e));\n            let captured = CapturedRequest {\n                headers: request.headers().clone(),\n                body: output,\n            };\n\n            {\n                let mut captured_requests = captured_requests.lock().unwrap();\n                captured_requests.push(captured);\n            }\n\n            inner.call(request).await\n        })\n    }\n}\n\nimpl HttpClient for CaptureHttpClient {\n    fn http_connector(\n        &self,\n        settings: &HttpConnectorSettings,\n        components: &RuntimeComponents,\n    ) -> SharedHttpConnector {\n        let inner = self.inner.http_connector(settings, components);\n        let connector = CaptureConnector {\n            inner,\n            captured_requests: self.captured_requests.clone(),\n        };\n        connector.into_shared()\n    }\n}\n\n#[tokio::test]\n#[traced_test]\nasync fn test_checksum_reuse_on_retry() {\n    let retry_rule = aws_smithy_mocks::mock!(aws_sdk_s3::Client::put_object)\n        .sequence()\n        .http_status(503, None)\n        .output(|| PutObjectOutput::builder().build())\n        .build();\n\n    let http_client = CaptureHttpClient::new();\n    let client = aws_smithy_mocks::mock_client!(\n        aws_sdk_s3,\n        RuleMode::Sequential,\n        &[retry_rule],\n        |client_builder| {\n            client_builder\n                .http_client(http_client.clone())\n                .retry_config(RetryConfig::standard().with_max_attempts(3))\n        }\n    );\n\n    let http_client_clone = http_client.clone();\n    let change_body = SdkBody::retryable(move || {\n        let current_attempt = http_client_clone.attempt();\n        tracing::info!(\"test body current attempt: {}\", current_attempt);\n        match current_attempt {\n            1 => SdkBody::from(\"initial content\"),\n            _ => SdkBody::from(\"retry content\"),\n        }\n    });\n\n    let body = ByteStream::new(change_body);\n\n    let _res = client\n        .put_object()\n        .body(body)\n        .checksum_algorithm(ChecksumAlgorithm::Sha256)\n        .bucket(\"test-bucket\")\n        .key(\"test.txt\")\n        .send()\n        .await\n        .expect(\"request should succeed, despite the non-base64-decodable checksum\");\n\n    let requests = http_client.take_captured_requests();\n    assert_eq!(2, requests.len());\n    let first_checksum = requests[0]\n        .headers()\n        .get(\"x-amz-checksum-sha256\")\n        .expect(\"x-amz-checksum-sha256 header exists\");\n\n    let second_checksum = requests[1]\n        .headers()\n        .get(\"x-amz-checksum-sha256\")\n        .expect(\"x-amz-checksum-sha256 header exists\");\n\n    let initial_content_checksum = \"kWo/C8OkKOGhaPRAjfgs1bu4sIxtesVe/53/KYJRNN8=\";\n    assert_eq!(initial_content_checksum, first_checksum);\n    assert_eq!(initial_content_checksum, second_checksum);\n}\n\n/// Swaps the file content on subsequent attempts\n#[derive(Debug)]\nstruct ChangeBodyInterceptor {\n    http_client: CaptureHttpClient,\n    content_path: PathBuf,\n    retry_content: &'static str,\n}\n\nimpl Intercept for ChangeBodyInterceptor {\n    fn name(&self) -> &'static str {\n        \"ChangeBodyInterceptor\"\n    }\n\n    fn read_before_attempt(\n        &self,\n        _context: &BeforeTransmitInterceptorContextRef<'_>,\n        _runtime_components: &RuntimeComponents,\n        _cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        if self.http_client.attempt() > 1 {\n            std::fs::write(self.content_path.as_path(), self.retry_content.as_bytes())\n                .expect(\"replace contents successful\");\n        }\n        Ok(())\n    }\n}\n\nasync fn run_checksum_reuse_streaming_request_test(\n    initial_content: &'static str,\n    retry_content: &'static str,\n    expected_checksum: &'static str,\n) {\n    let retry_rule = aws_smithy_mocks::mock!(aws_sdk_s3::Client::put_object)\n        .sequence()\n        .http_status(503, None)\n        .output(|| PutObjectOutput::builder().build())\n        .build();\n\n    let mut file = tempfile::NamedTempFile::new().unwrap();\n    let content_path = file.path().to_path_buf();\n    use std::io::Write;\n    file.write_all(initial_content.as_bytes()).unwrap();\n\n    let http_client = CaptureHttpClient::new();\n    let client = aws_smithy_mocks::mock_client!(\n        aws_sdk_s3,\n        RuleMode::Sequential,\n        &[retry_rule],\n        |client_builder| {\n            let change_body_interceptor = ChangeBodyInterceptor {\n                http_client: http_client.clone(),\n                content_path: content_path.clone(),\n                retry_content,\n            };\n            client_builder\n                .http_client(http_client.clone())\n                .retry_config(RetryConfig::standard().with_max_attempts(3))\n                .interceptor(change_body_interceptor)\n        }\n    );\n\n    let body = aws_sdk_s3::primitives::ByteStream::read_from()\n        .path(file.path())\n        .buffer_size(1024)\n        .build()\n        .await\n        .unwrap();\n\n    let _res = client\n        .put_object()\n        .body(body)\n        .checksum_algorithm(ChecksumAlgorithm::Sha256)\n        .bucket(\"test-bucket\")\n        .key(\"test.txt\")\n        .send()\n        .await\n        .expect(\"request should succeed, despite the non-base64-decodable checksum\");\n\n    let mut requests = http_client.take_captured_requests();\n    assert_eq!(2, requests.len());\n\n    assert_streaming_request_checksum(\n        requests.remove(0),\n        \"x-amz-checksum-sha256\",\n        expected_checksum,\n    )\n    .await;\n    assert_streaming_request_checksum(\n        requests.remove(0),\n        \"x-amz-checksum-sha256\",\n        expected_checksum,\n    )\n    .await;\n}\n\nasync fn assert_streaming_request_checksum(\n    request: CapturedRequest,\n    checksum_header_name: &'static str,\n    expected_checksum: &'static str,\n) {\n    let headers = request.headers();\n    let x_amz_content_sha256 = headers\n        .get(\"x-amz-content-sha256\")\n        .expect(\"x-amz-content-sha256 header exists\");\n    let x_amz_trailer = headers\n        .get(\"x-amz-trailer\")\n        .expect(\"x-amz-trailer header exists\");\n    let content_encoding = headers.get_all(\"Content-Encoding\").collect::<Vec<_>>();\n\n    assert_eq!(\n        HeaderValue::from_static(\"STREAMING-UNSIGNED-PAYLOAD-TRAILER\"),\n        x_amz_content_sha256,\n        \"signing header is incorrect\"\n    );\n    assert_eq!(\n        HeaderValue::from_static(checksum_header_name),\n        x_amz_trailer,\n        \"x-amz-trailer is incorrect\"\n    );\n\n    assert!(content_encoding.contains(&\"aws-chunked\"));\n    // let body = collect_body_into_string(request.take_body()).await;\n    let body = request.body.expect(\"body collected\").to_bytes();\n    let body_str = bytes_utils::Str::try_from(body)\n        .expect(\"body is utf-8\")\n        .to_string();\n    let actual_checksum =\n        extract_checksum_value(&body_str, checksum_header_name).expect(\"trailing checksum exists\");\n    assert_eq!(actual_checksum, expected_checksum);\n}\n\nfn extract_checksum_value<'a, 'b>(input: &'a str, checksum_name: &'b str) -> Option<&'a str> {\n    input\n        .find(&format!(\"{}:\", checksum_name))\n        .and_then(|start| {\n            let value_start = start + checksum_name.len() + 1;\n            input[value_start..]\n                .find(\"\\r\\n\\r\\n\")\n                .map(|end| &input[value_start..value_start + end])\n        })\n}\n\n/// Test checksum is re-used for aws-chunked/streaming content when the content changes\n/// between retries but the content length differs\n///\n/// NOTE: Because we set the overall body size hint only once when the stream is constructed\n///       we end up throwing an error :696\n#[tokio::test]\n#[traced_test]\n#[should_panic(expected = \"StreamLengthMismatch { actual: 13, expected: 15 }\")]\nasync fn test_checksum_reuse_on_retry_streaming_content_len_differs() {\n    run_checksum_reuse_streaming_request_test(\n        \"initial content\",\n        \"retry content\",\n        \"kWo/C8OkKOGhaPRAjfgs1bu4sIxtesVe/53/KYJRNN8=\",\n    )\n    .await;\n}\n\n/// Test checksum is re-used for aws-chunked/streaming content when the content changes\n/// between retries but the content length is the same\n#[tokio::test]\n#[traced_test]\nasync fn test_checksum_reuse_on_retry_streaming_content_len_same() {\n    run_checksum_reuse_streaming_request_test(\n        \"initial content\",\n        \"in1t1al content\",\n        \"kWo/C8OkKOGhaPRAjfgs1bu4sIxtesVe/53/KYJRNN8=\",\n    )\n    .await;\n\n    logs_assert(|lines: &[&str]| {\n        let checksum_warning = lines.iter().find(|&&line| {\n            line.contains( r#\"calculated checksum differs from cached checksum! cached={\"x-amz-checksum-sha256\": \"kWo/C8OkKOGhaPRAjfgs1bu4sIxtesVe/53/KYJRNN8=\"} calculated={\"x-amz-checksum-sha256\": \"pPv/1lYp3XTWCZXJWT1heRy9+ZQyPn99ZqMQn1MK3Bw=\"}\"#)\n        });\n\n        match checksum_warning {\n            Some(_) => Ok(()),\n            None => Err(\"Checksum mismatch warning was not issued\".to_string()),\n        }\n    });\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/s3/tests/client_construction.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nmod with_sdk_config {\n    use aws_config::SdkConfig;\n    use aws_sdk_s3 as s3;\n    use s3::config::StalledStreamProtectionConfig;\n\n    #[tokio::test]\n    async fn using_config_loader() {\n        // When using `aws_config::load_from_env`, things should just work\n        let config = aws_config::load_from_env().await;\n        assert!(config.timeout_config().unwrap().has_timeouts());\n        assert!(config.retry_config().unwrap().has_retry());\n        let _s3 = s3::Client::new(&config);\n    }\n\n    #[test]\n    fn manual_config_construction_all_defaults() {\n        // When manually constructing `SdkConfig` with everything unset,\n        // it should work since there will be no timeouts or retries enabled,\n        // and thus, no sleep impl is required.\n        let config = SdkConfig::builder()\n            .stalled_stream_protection(StalledStreamProtectionConfig::disabled())\n            .build();\n        assert!(config.timeout_config().is_none());\n        assert!(config.retry_config().is_none());\n        let _s3 = s3::Client::new(&config);\n    }\n\n    #[test]\n    fn bytestream_from_path_exists() {\n        let _ = aws_sdk_s3::primitives::ByteStream::from_path(\"a/b.txt\");\n    }\n}\n\nmod with_service_config {\n    use aws_sdk_s3 as s3;\n    use aws_smithy_runtime_api::client::behavior_version::BehaviorVersion;\n\n    #[test]\n    fn manual_config_construction_all_defaults() {\n        // When manually constructing `Config` with everything unset,\n        // it should work since there will be no timeouts or retries enabled,\n        // and thus, no sleep impl is required.\n        let config = s3::Config::builder().build();\n        let _s3 = s3::Client::from_conf(config);\n    }\n\n    #[test]\n    fn test_default_retry_enabled_with_bmv_2026_01_12() {\n        // With v2026_01_12 and later, retries are enabled by default for AWS SDK clients\n        // This test verifies the client builds without panicking about missing sleep impl\n        let config = s3::Config::builder()\n            .behavior_version(BehaviorVersion::v2026_01_12())\n            .region(aws_types::region::Region::new(\"us-east-1\"))\n            .credentials_provider(aws_credential_types::Credentials::for_tests())\n            .build();\n\n        // Should build successfully even though retries are enabled\n        // (sleep impl is provided by default)\n        let _client = s3::Client::from_conf(config);\n    }\n\n    #[test]\n    #[allow(deprecated)]\n    fn test_client_with_old_behavior_version_builds_successfully() {\n        // With v2024_03_28 (older than v2026_01_12), retries are NOT enabled by default\n        // This test verifies the client builds without requiring a sleep impl\n        let config = s3::Config::builder()\n            .behavior_version(BehaviorVersion::v2024_03_28())\n            .region(aws_types::region::Region::new(\"us-east-1\"))\n            .credentials_provider(aws_credential_types::Credentials::for_tests())\n            .build();\n\n        // Should build successfully (no retries = no sleep impl needed)\n        let _client = s3::Client::from_conf(config);\n    }\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/s3/tests/concurrency.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_credential_types::provider::SharedCredentialsProvider;\nuse aws_credential_types::Credentials;\nuse aws_sdk_s3::Client;\nuse aws_smithy_types::timeout::TimeoutConfig;\nuse aws_types::region::Region;\nuse aws_types::SdkConfig;\nuse bytes::BytesMut;\nuse hdrhistogram::sync::SyncHistogram;\nuse hdrhistogram::Histogram;\nuse std::future::Future;\nuse std::iter::repeat_with;\nuse std::net::SocketAddr;\nuse std::sync::Arc;\nuse tokio::sync::Semaphore;\nuse tokio::time::{Duration, Instant};\nuse tracing::debug;\n\n// WARNING:\n// When testing this on your own computer, be sure to run the tests in several different terminals.\n// Depending on the terminal used, you may run into errors related to \"Too many open files\".\n\nconst TASK_COUNT: usize = 1_000;\n// Larger requests take longer to send, which means we'll consume more network resources per\n// request, which means we can't support as many concurrent connections to S3.\nconst TASK_PAYLOAD_LENGTH: usize = 5_000;\n// At 130 and above, this test will fail with a `ConnectorError` from `hyper`. I've seen:\n// - ConnectorError { kind: Io, source: hyper::Error(Canceled, hyper::Error(Io, Os { code: 54, kind: ConnectionReset, message: \"Connection reset by peer\" })) }\n// - ConnectorError { kind: Io, source: hyper::Error(BodyWrite, Os { code: 32, kind: BrokenPipe, message: \"Broken pipe\" }) }\n// These errors don't necessarily occur when actually running against S3 with concurrency levels\n// above 129. You can test it for yourself by running the\n// `test_concurrency_put_object_against_live` test that appears at the bottom of this file.\nconst CONCURRENCY_LIMIT: usize = 50;\n\n#[tokio::test(flavor = \"multi_thread\")]\nasync fn test_concurrency_on_multi_thread_against_dummy_server() {\n    let (server, server_addr) = start_agreeable_server().await;\n    let _ = tokio::spawn(server);\n    let sdk_config = SdkConfig::builder()\n        .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests()))\n        .region(Region::new(\"us-east-1\"))\n        .endpoint_url(format!(\"http://{server_addr}\"))\n        .build();\n\n    test_concurrency(sdk_config).await;\n}\n\n#[tokio::test(flavor = \"current_thread\")]\nasync fn test_concurrency_on_single_thread_against_dummy_server() {\n    let (server, server_addr) = start_agreeable_server().await;\n    let _ = tokio::spawn(server);\n    let sdk_config = SdkConfig::builder()\n        .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests()))\n        .region(Region::new(\"us-east-1\"))\n        .endpoint_url(format!(\"http://{server_addr}\"))\n        .build();\n\n    test_concurrency(sdk_config).await;\n}\n\n#[ignore = \"this test runs against S3 and requires credentials\"]\n#[tokio::test(flavor = \"multi_thread\")]\nasync fn test_concurrency_on_multi_thread_against_s3() {\n    let sdk_config = aws_config::from_env()\n        .timeout_config(\n            TimeoutConfig::builder()\n                .connect_timeout(Duration::from_secs(30))\n                .read_timeout(Duration::from_secs(30))\n                .build(),\n        )\n        .load()\n        .await;\n\n    test_concurrency(sdk_config).await;\n}\n\n#[derive(Clone, Copy)]\nenum State {\n    Listening,\n    Speaking,\n}\n\n// This server is agreeable because it always replies with `OK`\nasync fn start_agreeable_server() -> (impl Future<Output = ()>, SocketAddr) {\n    use tokio::net::{TcpListener, TcpStream};\n    use tokio::time::sleep;\n\n    let listener = TcpListener::bind(\"0.0.0.0:0\")\n        .await\n        .expect(\"socket is free\");\n    let bind_addr = listener.local_addr().unwrap();\n    async fn handle_tcp_stream(tcp_stream: TcpStream) {\n        let mut buf = BytesMut::new();\n        let mut state = State::Listening;\n\n        let response: &[u8] = b\"HTTP/1.1 200 OK\\r\\n\\r\\n\";\n        let mut bytes_left_to_write = response.len();\n\n        loop {\n            match state {\n                State::Listening => {\n                    match tcp_stream.try_read_buf(&mut buf) {\n                        Ok(_) => {\n                            // Check for CRLF to see if we've received the entire HTTP request.\n                            let s = String::from_utf8_lossy(&buf);\n                            if let Some(content_length) = discern_content_length(&s) {\n                                if let Some(body_length) = discern_body_length(&s) {\n                                    if body_length == content_length {\n                                        state = State::Speaking;\n                                    }\n                                }\n                            }\n                        }\n                        Err(e) if e.kind() == std::io::ErrorKind::WouldBlock => {\n                            // reading would block, sleeping for 1ms and then trying again\n                            sleep(Duration::from_millis(1)).await;\n                        }\n                        Err(err) => {\n                            panic!(\"{}\", err)\n                        }\n                    }\n                }\n                State::Speaking => {\n                    if tcp_stream.writable().await.is_ok() {\n                        let bytes_written = tcp_stream.try_write(response).unwrap();\n                        bytes_left_to_write -= bytes_written;\n                        if bytes_left_to_write == 0 {\n                            break;\n                        }\n                    }\n                }\n            }\n        }\n    }\n\n    let fut = async move {\n        loop {\n            let (tcp_stream, _addr) = listener\n                .accept()\n                .await\n                .expect(\"listener can accept new connections\");\n            handle_tcp_stream(tcp_stream).await;\n        }\n    };\n\n    (fut, bind_addr)\n}\n\nfn discern_content_length(s: &str) -> Option<usize> {\n    // split on newlines\n    s.split(\"\\r\\n\")\n        // throw out all lines that aren't the content-length header\n        .find(|s| s.contains(\"content-length: \"))\n        // attempt to parse the numeric part of the header as a usize\n        .and_then(|s| s.trim_start_matches(\"content-length: \").parse().ok())\n}\n\nfn discern_body_length(s: &str) -> Option<usize> {\n    // If the request doesn't have a double CRLF, then we haven't finished reading it yet\n    if !s.contains(\"\\r\\n\\r\\n\") {\n        return None;\n    }\n    // starting from end, split on the double CRLF that separates the body from the header\n    s.rsplit(\"\\r\\n\\r\\n\")\n        // get the body, which must be the first element (we don't send trailers with PutObject requests)\n        .next()\n        // get the length of the body, in bytes, being sure to trim off the final newline\n        .map(|s| s.trim_end().len())\n}\n\nasync fn test_concurrency(sdk_config: SdkConfig) {\n    let client = Client::new(&sdk_config);\n\n    let histogram =\n        Histogram::new_with_bounds(1, Duration::from_secs(60 * 60).as_nanos() as u64, 3)\n            .unwrap()\n            .into_sync();\n\n    debug!(\"creating futures\");\n    // This semaphore ensures we only run up to <CONCURRENCY_LIMIT> requests at once.\n    let semaphore = Arc::new(Semaphore::new(CONCURRENCY_LIMIT));\n    let futures = (0..TASK_COUNT).map(|i| {\n        let client = client.clone();\n        let key = format!(\"concurrency/test_object_{:05}\", i);\n        let body: Vec<_> = repeat_with(fastrand::alphanumeric)\n            .take(TASK_PAYLOAD_LENGTH)\n            .map(|c| c as u8)\n            .collect();\n        let fut = client\n            .put_object()\n            .bucket(\"your-test-bucket-here\")\n            .key(key)\n            .body(body.into())\n            .send();\n        // make a clone of the semaphore and the recorder that can live in the future\n        let semaphore = semaphore.clone();\n        let mut histogram_recorder = histogram.recorder();\n\n        // because we wait on a permit from the semaphore, only <CONCURRENCY_LIMIT> futures\n        // will be run at once. Otherwise, we'd quickly get rate-limited by S3.\n        async move {\n            let permit = semaphore\n                .acquire()\n                .await\n                .expect(\"we'll get one if we wait long enough\");\n            let start = Instant::now();\n            let res = fut.await.expect(\"request should succeed\");\n            histogram_recorder.saturating_record(start.elapsed().as_nanos() as u64);\n            drop(permit);\n            res\n        }\n    });\n\n    debug!(\"joining futures\");\n    let res: Vec<_> = ::futures_util::future::join_all(futures).await;\n    // Assert we ran all the tasks\n    assert_eq!(TASK_COUNT, res.len());\n\n    display_metrics(\n        \"Request Latency\",\n        histogram,\n        \"s\",\n        Duration::from_secs(1).as_nanos() as f64,\n    );\n}\n\nfn display_metrics(name: &str, mut h: SyncHistogram<u64>, unit: &str, scale: f64) {\n    // Refreshing is required or else we won't see any results at all\n    h.refresh();\n    debug!(\"displaying {} results from {name} histogram\", h.len());\n    debug!(\n        \"{name}\\n\\\n        \\tmean:\\t{:.1}{unit},\\n\\\n        \\tp50:\\t{:.1}{unit},\\n\\\n        \\tp90:\\t{:.1}{unit},\\n\\\n        \\tp99:\\t{:.1}{unit},\\n\\\n        \\tmax:\\t{:.1}{unit}\",\n        h.mean() / scale,\n        h.value_at_quantile(0.5) as f64 / scale,\n        h.value_at_quantile(0.9) as f64 / scale,\n        h.value_at_quantile(0.99) as f64 / scale,\n        h.max() as f64 / scale,\n    );\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/s3/tests/config-override.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_credential_types::provider::SharedCredentialsProvider;\nuse aws_sdk_s3::config::{Credentials, Region};\nuse aws_sdk_s3::Client;\nuse aws_smithy_http_client::test_util::{capture_request, CaptureRequestReceiver};\nuse aws_types::SdkConfig;\n\nfn test_client() -> (CaptureRequestReceiver, Client) {\n    let (http_client, captured_request) = capture_request(None);\n    let sdk_config = SdkConfig::builder()\n        .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests()))\n        .region(Region::new(\"us-west-2\"))\n        .http_client(http_client)\n        .build();\n    let client = Client::new(&sdk_config);\n    (captured_request, client)\n}\n\n#[tokio::test]\nasync fn operation_overrides_force_path_style() {\n    let (captured_request, client) = test_client();\n    let _ = client\n        .list_objects_v2()\n        .bucket(\"test-bucket\")\n        .customize()\n        .config_override(aws_sdk_s3::config::Config::builder().force_path_style(true))\n        .send()\n        .await;\n    assert_eq!(\n        captured_request.expect_request().uri().to_string(),\n        \"https://s3.us-west-2.amazonaws.com/test-bucket/?list-type=2\"\n    );\n}\n\n#[tokio::test]\nasync fn operation_overrides_fips() {\n    let (captured_request, client) = test_client();\n    let _ = client\n        .list_objects_v2()\n        .bucket(\"test-bucket\")\n        .customize()\n        .config_override(aws_sdk_s3::config::Config::builder().use_fips(true))\n        .send()\n        .await;\n    assert_eq!(\n        captured_request.expect_request().uri().to_string(),\n        \"https://test-bucket.s3-fips.us-west-2.amazonaws.com/?list-type=2\"\n    );\n}\n\n#[tokio::test]\nasync fn operation_overrides_dual_stack() {\n    let (captured_request, client) = test_client();\n    let _ = client\n        .list_objects_v2()\n        .bucket(\"test-bucket\")\n        .customize()\n        .config_override(aws_sdk_s3::config::Config::builder().use_dual_stack(true))\n        .send()\n        .await;\n    assert_eq!(\n        captured_request.expect_request().uri().to_string(),\n        \"https://test-bucket.s3.dualstack.us-west-2.amazonaws.com/?list-type=2\"\n    );\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/s3/tests/config_to_builder.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n#[tokio::test]\nasync fn test_config_to_builder() {\n    use aws_sdk_s3::config::AppName;\n\n    let config = aws_config::load_from_env().await;\n    let config = aws_sdk_s3::Config::new(&config);\n    // should not panic\n    let _ = config\n        .to_builder()\n        .app_name(AppName::new(\"SomeAppName\").unwrap())\n        .build();\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/s3/tests/content-length-enforcement.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_sdk_s3::{\n    config::retry::RetryConfig, config::Region, error::DisplayErrorContext, Client, Config,\n};\nuse aws_smithy_http_client::test_util::dvr::ReplayingClient;\n\n#[tokio::test]\nasync fn test_content_length_enforcement_is_not_applied_to_head_request() {\n    let http_client =\n        ReplayingClient::from_file(\"tests/data/content-length-enforcement/head-object.json\")\n            .expect(\"recorded HTTP communication exists\");\n    let config = Config::builder()\n        .with_test_defaults()\n        .http_client(http_client.clone())\n        .region(Region::new(\"us-east-1\"))\n        .retry_config(RetryConfig::disabled()) // Disable retries for replay test\n        .build();\n    let client = Client::from_conf(config);\n    let _resp = client\n        .head_object()\n        .key(\"dontcare.json\")\n        .bucket(\"dontcare\")\n        .send()\n        .await\n        .expect(\"content length enforcement must not apply to HEAD requests\");\n\n    // The body returned will be empty, so we pass an empty string for `media_type` to\n    // `validate_body_and_headers_except`. That way, it'll do a string equality check on the empty\n    // strings.\n    http_client.relaxed_validate(\"\").await.unwrap();\n}\n\n#[tokio::test]\nasync fn test_content_length_enforcement_get_request_short() {\n    let http_client =\n        ReplayingClient::from_file(\"tests/data/content-length-enforcement/get-object-short.json\")\n            .expect(\"recorded HTTP communication exists\");\n    let config = Config::builder()\n        .with_test_defaults()\n        .http_client(http_client.clone())\n        .region(Region::new(\"us-east-1\"))\n        .retry_config(RetryConfig::disabled()) // Disable retries for replay test\n        .build();\n    let client = Client::from_conf(config);\n    // The file we're fetching is exactly 10,000 bytes long, but we've set the\n    // response's content-length to 9,999 bytes. This should trigger the\n    // content-length enforcement.\n\n    // This will succeed.\n    let output = client\n        .get_object()\n        .key(\"1000-lines.txt\")\n        .bucket(\"dontcare\")\n        .send()\n        .await\n        .unwrap();\n\n    // This will fail with a content-length mismatch error.\n    let content_length_err = output.body.collect().await.unwrap_err();\n\n    http_client\n        .relaxed_validate(\"application/text\")\n        .await\n        .unwrap();\n    assert_eq!(\n        DisplayErrorContext(content_length_err).to_string(),\n        \"streaming error: Invalid Content-Length: Expected 9999 bytes but 10000 bytes were received (Error { kind: StreamingError(ContentLengthError { expected: 9999, received: 10000 }) })\"\n    );\n}\n\n#[tokio::test]\nasync fn test_content_length_enforcement_get_request_long() {\n    let http_client =\n        ReplayingClient::from_file(\"tests/data/content-length-enforcement/get-object-long.json\")\n            .expect(\"recorded HTTP communication exists\");\n    let config = Config::builder()\n        .with_test_defaults()\n        .http_client(http_client.clone())\n        .region(Region::new(\"us-east-1\"))\n        .retry_config(RetryConfig::disabled()) // Disable retries for replay test\n        .build();\n    let client = Client::from_conf(config);\n    // The file we're fetching is exactly 10,000 bytes long, but we've set the\n    // response's content-length to 9,999 bytes. This should trigger the\n    // content-length enforcement.\n\n    // This will succeed.\n    let output = client\n        .get_object()\n        .key(\"1000-lines.txt\")\n        .bucket(\"dontcare\")\n        .send()\n        .await\n        .unwrap();\n\n    // This will fail with a content-length mismatch error.\n    let content_length_err = output.body.collect().await.unwrap_err();\n\n    http_client\n        .relaxed_validate(\"application/text\")\n        .await\n        .unwrap();\n    assert_eq!(\n        DisplayErrorContext(content_length_err).to_string(),\n        \"streaming error: Invalid Content-Length: Expected 10001 bytes but 10000 bytes were received (Error { kind: StreamingError(ContentLengthError { expected: 10001, received: 10000 }) })\"\n    );\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/s3/tests/credential_features.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_config::credential_process::CredentialProcessProvider;\nuse aws_config::Region;\nuse aws_runtime::user_agent::test_util::assert_ua_contains_metric_values;\nuse aws_sdk_s3::{Client, Config};\nuse aws_smithy_http_client::test_util::capture_request;\n\n// Test that the user-agent contains the feature flag for a credential provider, in this case the CredentialProcess feature.\n#[tokio::test]\nasync fn process_ua_feature() {\n    let (http_client, request) = capture_request(None);\n\n    let provider = CredentialProcessProvider::new(String::from(\n        r#\"echo '{ \"Version\": 1, \"AccessKeyId\": \"ASIARTESTID\", \"SecretAccessKey\": \"TESTSECRETKEY\", \"SessionToken\": \"TESTSESSIONTOKEN\", \"AccountId\": \"123456789001\", \"Expiration\": \"2022-05-02T18:36:00+00:00\" }'\"#,\n    ));\n    let config = Config::builder()\n        .with_test_defaults()\n        .region(Region::from_static(\"fake\"))\n        .http_client(http_client.clone())\n        .credentials_provider(provider)\n        .build();\n\n    let client = Client::from_conf(config);\n\n    let _ = client\n        .head_bucket()\n        .bucket(\"fake\")\n        .send()\n        .await\n        .expect(\"Call succeeds\");\n\n    let request = request.expect_request();\n    let ua = request.headers().get(\"x-amz-user-agent\").unwrap();\n    assert_ua_contains_metric_values(ua, &[\"w\"]);\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/s3/tests/customizable-operation.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_credential_types::provider::SharedCredentialsProvider;\nuse aws_sdk_s3::config::{Credentials, Region};\nuse aws_sdk_s3::presigning::PresigningConfig;\nuse aws_sdk_s3::{Client, Config};\nuse aws_smithy_http_client::test_util::capture_request;\nuse http_1x::HeaderValue;\nuse std::time::{Duration, SystemTime};\n\n#[tokio::test]\nasync fn test_s3_ops_are_customizable() {\n    let (http_client, rcvr) = capture_request(None);\n    let config = Config::builder()\n        .credentials_provider(SharedCredentialsProvider::new(\n            Credentials::for_tests_with_session_token(),\n        ))\n        .region(Region::new(\"us-east-1\"))\n        .http_client(http_client.clone())\n        .build();\n\n    let client = Client::from_conf(config);\n\n    // The response from the fake connection won't return the expected XML but we don't care about\n    // that error in this test\n    let _ = assert_send(\n        client\n            .list_buckets()\n            .customize()\n            .mutate_request(|req| {\n                req.headers_mut()\n                    .append(\"test-header\", HeaderValue::from_static(\"test-value\"));\n            })\n            .send(),\n    )\n    .await\n    .expect_err(\"this will fail due to not receiving a proper XML response.\");\n\n    let expected_req = rcvr.expect_request();\n    let test_header = expected_req\n        .headers()\n        .get(\"test-header\")\n        .unwrap()\n        .to_owned();\n\n    assert_eq!(\"test-value\", test_header);\n}\n\n#[tokio::test]\nasync fn customized_presigning() {\n    let creds = Credentials::for_tests_with_session_token();\n    let config = Config::builder()\n        .credentials_provider(creds)\n        .region(Region::new(\"us-east-1\"))\n        .build();\n    let client = Client::from_conf(config);\n    let static_ps_config = PresigningConfig::builder()\n        .start_time(SystemTime::UNIX_EPOCH + Duration::from_secs(1234567891))\n        .expires_in(Duration::from_secs(30))\n        .build()\n        .unwrap();\n    let req = assert_send(\n        client\n            .get_object()\n            .bucket(\"foo\")\n            .key(\"bar\")\n            .customize()\n            .mutate_request(|req| {\n                req.set_uri(req.uri().to_string() + \"&a=b\")\n                    .expect(\"failed to update URI\")\n            })\n            .presigned(static_ps_config),\n    )\n    .await\n    .unwrap();\n    let expect = \"https://foo.s3.us-east-1.amazonaws.com/bar?x-id=GetObject&a=b&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ANOTREAL%2F20090213%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20090213T233131Z&X-Amz-Expires=30&X-Amz-SignedHeaders=host&X-Amz-Signature=2e1a459c206932ce53beb07028c711cf70f3a61dc876c6f9ce0aed5823f60234&X-Amz-Security-Token=notarealsessiontoken\";\n    assert_eq!(req.uri(), expect);\n}\n\nfn assert_send<T: Send>(t: T) -> T {\n    t\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/s3/tests/data/aws_chunked/chunk-signing.json",
    "content": "{\n  \"events\": [\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Request\": {\n          \"request\": {\n            \"uri\": \"https://test-bucket.s3.us-east-1.amazonaws.com/10KiBofA.txt?x-id=PutObject\",\n            \"headers\": {\n              \"content-type\": [\n                \"application/octet-stream\"\n              ],\n              \"content-length\": [\n                \"10291\"\n              ],\n              \"x-amz-sdk-checksum-algorithm\": [\n                \"CRC32\"\n              ],\n              \"user-agent\": [\n                \"aws-sdk-rust/0.123.test os/windows/XPSP3 lang/rust/1.50.0\"\n              ],\n              \"x-amz-user-agent\": [\n                \"aws-sdk-rust/0.123.test ua/0.1 api/test-service/0.123 os/windows/XPSP3 lang/rust/1.50.0 m/U,Z,E md/http#replaying-client\"\n              ],\n              \"x-amz-trailer\": [\n                \"x-amz-checksum-crc32\"\n              ],\n              \"x-amz-decoded-content-length\": [\n                \"10240\"\n              ],\n              \"content-encoding\": [\n                \"aws-chunked\"\n              ],\n              \"x-amz-date\": [\n                \"20090213T233130Z\"\n              ],\n              \"authorization\": [\n                \"AWS4-HMAC-SHA256 Credential=ANOTREAL/20090213/us-east-1/s3/aws4_request, SignedHeaders=content-encoding;content-length;content-type;host;x-amz-content-sha256;x-amz-date;x-amz-decoded-content-length;x-amz-sdk-checksum-algorithm;x-amz-trailer;x-amz-user-agent, Signature=4d5247cc603cc816a7ab5272ed9e47cf173e45bc42bfa68e1181267dd0f0bf73\"\n              ],\n              \"x-amz-content-sha256\": [\n                \"STREAMING-AWS4-HMAC-SHA256-PAYLOAD-TRAILER\"\n              ],\n              \"amz-sdk-request\": [\n                \"attempt=1; max=3\"\n              ]\n            },\n            \"method\": \"PUT\"\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"2000;chunk-signature=25851a3d29c435720498cdfd7540bb131ae653ea7371cb885f4fe1ba092d37f3\\r\\naaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\r\\n\"\n          },\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"800;chunk-signature=bf16b3638d50be9f090044f98d838e6643fa2d37db299cbdb884a92d2a659a03\\r\\naaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\r\\n\"\n          },\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"0;chunk-signature=7110bd9a94d4fa381c0ad159f6b14acb99e93ecec95cb3fd0fd61b414a692ae6\\r\\n\"\n          },\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"x-amz-checksum-crc32:X9RA0w==\\r\\nx-amz-trailer-signature:a1764ee8bc0edc8b723a91b19c28bbcc7f8ac8a5932b0e7b7497dd6a8fee78f0\\r\\n\\r\\n\"\n          },\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Response\": {\n          \"response\": {\n            \"Ok\": {\n              \"status\": 200,\n              \"headers\": {\n                \"x-amz-id-2\": [\n                  \"UuP2+g3Y9lunpr7KDXxlzxZmhYpNxQmSvnUV367KW/sLHvShbbg0tVuvyuh6VqwC2DZbo4liYeo=\"\n                ],\n                \"x-amz-request-id\": [\n                  \"NQX9B4FNKRNY7TA5\"\n                ],\n                \"date\": [\n                  \"Wed, 28 Jan 2026 06:45:11 GMT\"\n                ],\n                \"x-amz-server-side-encryption\": [\n                  \"AES256\"\n                ],\n                \"etag\": [\n                  \"\\\"416671d9da6b155c340c93ca08845194\\\"\"\n                ],\n                \"x-amz-checksum-crc32\": [\n                  \"X9RA0w==\"\n                ],\n                \"x-amz-checksum-type\": [\n                  \"FULL_OBJECT\"\n                ],\n                \"content-length\": [\n                  \"0\"\n                ],\n                \"server\": [\n                  \"AmazonS3\"\n                ]\n              }\n            }\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Response\"\n        }\n      }\n    }\n  ],\n  \"docs\": \"Connection recording for signing chunks during a PutObject operation.\",\n  \"version\": \"V0\"\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/s3/tests/data/aws_chunked/custom-chunk-size.json",
    "content": "{\n  \"events\": [\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Request\": {\n          \"request\": {\n            \"uri\": \"https://test-bucket.s3.us-east-1.amazonaws.com/10KiBofA.txt?x-id=PutObject\",\n            \"headers\": {\n              \"content-type\": [\n                \"application/octet-stream\"\n              ],\n              \"content-length\": [\n                \"10291\"\n              ],\n              \"x-amz-sdk-checksum-algorithm\": [\n                \"CRC32\"\n              ],\n              \"user-agent\": [\n                \"aws-sdk-rust/0.123.test os/windows/XPSP3 lang/rust/1.50.0\"\n              ],\n              \"x-amz-user-agent\": [\n                \"aws-sdk-rust/0.123.test ua/0.1 api/test-service/0.123 os/windows/XPSP3 lang/rust/1.50.0 m/U,Z,E md/http#replaying-client\"\n              ],\n              \"x-amz-trailer\": [\n                \"x-amz-checksum-crc32\"\n              ],\n              \"x-amz-decoded-content-length\": [\n                \"10240\"\n              ],\n              \"content-encoding\": [\n                \"aws-chunked\"\n              ],\n              \"x-amz-date\": [\n                \"20090213T233130Z\"\n              ],\n              \"authorization\": [\n                \"AWS4-HMAC-SHA256 Credential=ANOTREAL/20090213/us-east-1/s3/aws4_request, SignedHeaders=content-encoding;content-length;content-type;host;x-amz-content-sha256;x-amz-date;x-amz-decoded-content-length;x-amz-sdk-checksum-algorithm;x-amz-trailer;x-amz-user-agent, Signature=0747794497b419d708069544097654a3b771e0a6d5d71c5066369038618acadc\"\n              ],\n              \"x-amz-content-sha256\": [\n                \"STREAMING-UNSIGNED-PAYLOAD-TRAILER\"\n              ],\n              \"amz-sdk-request\": [\n                \"attempt=1; max=3\"\n              ]\n            },\n            \"method\": \"PUT\"\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"2000\\r\\naaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\r\\n\"\n          },\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"800\\r\\naaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\r\\n\"\n          },\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"0\\r\\nx-amz-checksum-crc32:X9RA0w==\\r\\n\\r\\n\"\n          },\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Response\": {\n          \"response\": {\n            \"Ok\": {\n              \"status\": 200,\n              \"headers\": {\n                \"x-amz-id-2\": [\n                  \"piL+QJ22vS0W4CWpeN3JesBMc3Izjl87LkidL/9GmZXsov7ZW9dFplLKIkpkry9CHOaMsoUEVbo=\"\n                ],\n                \"x-amz-request-id\": [\n                  \"M67NKASWV8EPYSD7\"\n                ],\n                \"date\": [\n                  \"Wed, 28 Jan 2026 05:07:13 GMT\"\n                ],\n                \"x-amz-server-side-encryption\": [\n                  \"AES256\"\n                ],\n                \"etag\": [\n                  \"\\\"416671d9da6b155c340c93ca08845194\\\"\"\n                ],\n                \"x-amz-checksum-crc32\": [\n                  \"X9RA0w==\"\n                ],\n                \"x-amz-checksum-type\": [\n                  \"FULL_OBJECT\"\n                ],\n                \"content-length\": [\n                  \"0\"\n                ],\n                \"server\": [\n                  \"AmazonS3\"\n                ]\n              }\n            }\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Response\"\n        }\n      }\n    }\n  ],\n  \"docs\": \"Connection recording for a PutObject operation with custom chunk size.\",\n  \"version\": \"V0\"\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/s3/tests/data/aws_chunked/no-chunking.json",
    "content": "{\n  \"events\": [\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Request\": {\n          \"request\": {\n            \"uri\": \"https://test-bucket.s3.us-east-1.amazonaws.com/65KiBofA.txt?x-id=PutObject\",\n            \"headers\": {\n              \"content-type\": [\n                \"application/octet-stream\"\n              ],\n              \"content-length\": [\n                \"66605\"\n              ],\n              \"x-amz-sdk-checksum-algorithm\": [\n                \"CRC32\"\n              ],\n              \"user-agent\": [\n                \"aws-sdk-rust/0.123.test os/windows/XPSP3 lang/rust/1.50.0\"\n              ],\n              \"x-amz-user-agent\": [\n                \"aws-sdk-rust/0.123.test ua/0.1 api/test-service/0.123 os/windows/XPSP3 lang/rust/1.50.0 m/U,Z,E md/http#replaying-client\"\n              ],\n              \"x-amz-trailer\": [\n                \"x-amz-checksum-crc32\"\n              ],\n              \"x-amz-decoded-content-length\": [\n                \"66560\"\n              ],\n              \"content-encoding\": [\n                \"aws-chunked\"\n              ],\n              \"x-amz-date\": [\n                \"20090213T233130Z\"\n              ],\n              \"authorization\": [\n                \"AWS4-HMAC-SHA256 Credential=ANOTREAL/20090213/us-east-1/s3/aws4_request, SignedHeaders=content-encoding;content-length;content-type;host;x-amz-content-sha256;x-amz-date;x-amz-decoded-content-length;x-amz-sdk-checksum-algorithm;x-amz-trailer;x-amz-user-agent, Signature=5ffa7eabf99ba6cb8555a282db646934c8d17a102809dad9c6d44e84a1c1c935\"\n              ],\n              \"x-amz-content-sha256\": [\n                \"STREAMING-UNSIGNED-PAYLOAD-TRAILER\"\n              ],\n              \"amz-sdk-request\": [\n                \"attempt=1; max=3\"\n              ]\n            },\n            \"method\": \"PUT\"\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"10400\\r\\naaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa\\r\\n\"\n          },\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"0\\r\\nx-amz-checksum-crc32:sK4Y7A==\\r\\n\\r\\n\"\n          },\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Response\": {\n          \"response\": {\n            \"Ok\": {\n              \"status\": 200,\n              \"headers\": {\n                \"x-amz-id-2\": [\n                  \"EmW1TNINP6Zx0Pfy1xXrOO5znK9xyR+ikkB3/l7sIrT3RVnBBTCb2rzFRFg94v2lKSiboRbd/YXrd0IzBlz/E2fiPNgefbKg\"\n                ],\n                \"x-amz-request-id\": [\n                  \"817NGV38097CVDDZ\"\n                ],\n                \"date\": [\n                  \"Wed, 28 Jan 2026 05:39:28 GMT\"\n                ],\n                \"x-amz-server-side-encryption\": [\n                  \"AES256\"\n                ],\n                \"etag\": [\n                  \"\\\"da0d2e17cd5a8f14633c6b4aebad7e02\\\"\"\n                ],\n                \"x-amz-checksum-crc32\": [\n                  \"sK4Y7A==\"\n                ],\n                \"x-amz-checksum-type\": [\n                  \"FULL_OBJECT\"\n                ],\n                \"content-length\": [\n                  \"0\"\n                ],\n                \"server\": [\n                  \"AmazonS3\"\n                ]\n              }\n            }\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Response\"\n        }\n      }\n    }\n  ],\n  \"docs\": \"todo docs\",\n  \"version\": \"V0\"\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/s3/tests/data/content-length-enforcement/get-object-long.json",
    "content": "{\n    \"events\": [\n        {\n            \"connection_id\": 0,\n            \"action\": {\n                \"Request\": {\n                    \"request\": {\n                        \"uri\": \"https://dontcare.s3.us-east-1.amazonaws.com/1000-lines.txt?x-id=GetObject\",\n                        \"headers\": {\n                            \"user-agent\": [\n                                \"aws-sdk-rust/0.123.test os/windows/XPSP3 lang/rust/1.50.0\"\n                            ],\n                            \"x-amz-user-agent\": [\n                                \"aws-sdk-rust/0.123.test api/test-service/0.123 os/windows/XPSP3 lang/rust/1.50.0\"\n                            ],\n                            \"x-amz-date\": [\n                                \"20090213T233130Z\"\n                            ],\n                            \"authorization\": [\n                                \"AWS4-HMAC-SHA256 Credential=ANOTREAL/20090213/us-east-1/s3/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date;x-amz-user-agent, Signature=62edebbcadc277f9482344af1467f4a48e9fe852585382f3a50c141421697c6b\"\n                            ],\n                            \"x-amz-content-sha256\": [\n                                \"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\"\n                            ],\n                            \"amz-sdk-request\": [\n                                \"attempt=1; max=1\"\n                            ]\n                        },\n                        \"method\": \"GET\"\n                    }\n                }\n            }\n        },\n        {\n            \"connection_id\": 0,\n            \"action\": {\n                \"Eof\": {\n                    \"ok\": true,\n                    \"direction\": \"Request\"\n                }\n            }\n        },\n        {\n            \"connection_id\": 0,\n            \"action\": {\n                \"Response\": {\n                    \"response\": {\n                        \"Ok\": {\n                            \"status\": 200,\n                            \"headers\": {\n                                \"x-amz-id-2\": [\n                                    \"BCXc551R1SFxVDbfoKFjqALf+WmHMMZGc2V9dmV8CcuI7q056VHc3Wne4UqbFkkKpACF6LUkSs8pUhjIYm8rJ5lffUg73aEMJyZJaHnakTk=\"\n                                ],\n                                \"x-amz-request-id\": [\n                                    \"KWFKT9SCC4MFHPHM\"\n                                ],\n                                \"date\": [\n                                    \"Wed, 22 May 2024 15:34:28 GMT\"\n                                ],\n                                \"x-amz-replication-status\": [\n                                    \"FAILED\"\n                                ],\n                                \"last-modified\": [\n                                    \"Fri, 07 Oct 2022 15:00:29 GMT\"\n                                ],\n                                \"etag\": [\n                                    \"\\\"983b8597be0f4c15bb8ece7029140d0f\\\"\"\n                                ],\n                                \"x-amz-version-id\": [\n                                    \"null\"\n                                ],\n                                \"accept-ranges\": [\n                                    \"bytes\"\n                                ],\n                                \"content-type\": [\n                                    \"text/plain\"\n                                ],\n                                \"server\": [\n                                    \"AmazonS3\"\n                                ],\n                                \"content-length\": [\n                                    \"10001\"\n                                ]\n                            }\n                        }\n                    }\n                }\n            }\n        },\n        {\n            \"connection_id\": 0,\n            \"action\": {\n                \"Data\": {\n                    \"data\": {\n                        \"Utf8\": \"Line 0001\\nLine 0002\\nLine 0003\\nLine 0004\\nLine 0005\\nLine 0006\\nLine 0007\\nLine 0008\\nLine 0009\\nLine 0010\\nLine 0011\\nLine 0012\\nLine 0013\\nLine 0014\\nLine 0015\\nLine 0016\\nLine 0017\\nLine 0018\\nLine 0019\\nLine 0020\\nLine 0021\\nLine 0022\\nLine 0023\\nLine 0024\\nLine 0025\\nLine 0026\\nLine 0027\\nLine 0028\\nLine 0029\\nLine 0030\\nLine 0031\\nLine 0032\\nLine 0033\\nLine 0034\\nLine 0035\\nLine 0036\\nLine 0037\\nLine 0038\\nLine 0039\\nLine 0040\\nLine 0041\\nLine 0042\\nLine 0043\\nLine 0044\\nLine 0045\\nLine 0046\\nLine 0047\\nLine 0048\\nLine 0049\\nLine 0050\\nLine 0051\\nLine 0052\\nLine 0053\\nLine 0054\\nLine 0055\\nLine 0056\\nLine 0057\\nLine 0058\\nLine 0059\\nLine 0060\\nLine 0061\\nLine 0062\\nLine 0063\\nLine 0064\\nLine 0065\\nLine 0066\\nLine 0067\\nLine 0068\\nLine 0069\\nLine 0070\\nLine 0071\\nLine 0072\\nLine 0073\\nLine 0074\\nLine 0075\\nLine 0076\\nLine 0077\\nLine 0078\\nLine 0079\\nLine 0080\\nLine 0081\\nLine 0082\\nLine 0083\\nLine 0084\\nLine 0085\\nLine 0086\\nLine 0087\\nLine 0088\\nLine 0089\\nLine 0090\\nLine 0091\\nLine 0092\\nLine 0093\\nLine 0094\\nLine 0095\\nLine 0096\\nLine 0097\\nLine 0098\\nLine 0099\\nLine 0100\\nLine 0101\\nLine 0102\\nLine 0103\\nLine 0104\\nLine 0105\\nLine 0106\\nLine 0107\\nLine 0108\\nLine 0109\\nLine 0110\\nLine 0111\\nLine 0112\\nLine 0113\\nLine 0114\\nLine 0115\\nLine 0116\\nLine 0117\\nLine 0118\\nLine 0119\\nLine 0120\\nLine 0121\\nLine 0122\\nLine 0123\\nLine 0124\\nLine 0125\\nLine 0126\\nLine 0127\\nLine 0128\\nLine 0129\\nLine 0130\\nLine 0131\\nLine 0132\\nLine 0133\\nLine 0134\\nLine 0135\\nLine 0136\\nLine 0137\\nLine 0138\\nLine 0139\\nLine 0140\\nLine 0141\\nLine 0142\\nLine 0143\\nLine 0144\\nLine 0145\\nLine 0146\\nLine 0147\\nLine 0148\\nLine 0149\"\n                    },\n                    \"direction\": \"Response\"\n                }\n            }\n        },\n        {\n            \"connection_id\": 0,\n            \"action\": {\n                \"Data\": {\n                    \"data\": {\n                        \"Utf8\": \"\\nLine 0150\\nLine 0151\\nLine 0152\\nLine 0153\\nLine 0154\\nLine 0155\\nLine 0156\\nLine 0157\\nLine 0158\\nLine 0159\\nLine 0160\\nLine 0161\\nLine 0162\\nLine 0163\\nLine 0164\\nLine 0165\\nLine 0166\\nLine 0167\\nLine 0168\\nLine 0169\\nLine 0170\\nLine 0171\\nLine 0172\\nLine 0173\\nLine 0174\\nLine 0175\\nLine 0176\\nLine 0177\\nLine 0178\\nLine 0179\\nLine 0180\\nLine 0181\\nLine 0182\\nLine 0183\\nLine 0184\\nLine 0185\\nLine 0186\\nLine 0187\\nLine 0188\\nLine 0189\\nLine 0190\\nLine 0191\\nLine 0192\\nLine 0193\\nLine 0194\\nLine 0195\\nLine 0196\\nLine 0197\\nLine 0198\\nLine 0199\\nLine 0200\\nLine 0201\\nLine 0202\\nLine 0203\\nLine 0204\\nLine 0205\\nLine 0206\\nLine 0207\\nLine 0208\\nLine 0209\\nLine 0210\\nLine 0211\\nLine 0212\\nLine 0213\\nLine 0214\\nLine 0215\\nLine 0216\\nLine 0217\\nLine 0218\\nLine 0219\\nLine 0220\\nLine 0221\\nLine 0222\\nLine 0223\\nLine 0224\\nLine 0225\\nLine 0226\\nLine 0227\\nLine 0228\\nLine 0229\\nLine 0230\\nLine 0231\\nLine 0232\\nLine 0233\\nLine 0234\\nLine 0235\\nLine 0236\\nLine 0237\\nLine 0238\\nLine 0239\\nLine 0240\\nLine 0241\\nLine 0242\\nLine 0243\\nLine 0244\\nLine 0245\\nLine 0246\\nLine 0247\\nLine 0248\\nLine 0249\\nLine 0250\\nLine 0251\\nLine 0252\\nLine 0253\\nLine 0254\\nLine 0255\\nLine 0256\\nLine 0257\\nLine 0258\\nLine 0259\\nLine 0260\\nLine 0261\\nLine 0262\\nLine 0263\\nLine 0264\\nLine 0265\\nLine 0266\\nLine 0267\\nLine 0268\\nLine 0269\\nLine 0270\\nLine 0271\\nLine 0272\\nLine 0273\\nLine 0274\\nLine 0275\\nLine 0276\\nLine 0277\\nLine 0278\\nLine 0279\\nLine 0280\\nLine 0281\\nLine 0282\\nLine 0283\\nLine 0284\\nLine 0285\\nLine 0286\\nLine 0287\\nLine 0288\\nLine 0289\\nLine 0290\\nLine 0291\\nLine 0292\\nLine 0293\\nLine 0294\\nLine 0295\\nLine 0296\\nLine 0297\\nLine 0298\\nLine 0299\\nLine 0300\\nLine 0301\\nLine 0302\\nLine 0303\\nLine 0304\\nLine 0305\\nLine 0306\\nLine 0307\\nLine 0308\\nLine 0309\\nLine 0310\\nLine 0311\\nLine 0312\\nLine 0313\\nLine 0314\\nLine 0315\\nLine 0316\\nLine 0317\\nLine 0318\\nLine 0319\\nLine 0320\\nLine 0321\\nLine 0322\\nLine 0323\\nLine 0324\\nLine 0325\\nLine 0326\\nLine 0327\\nLine 0328\\nLine 0329\\nLine 0330\\nLine 0331\\nLine 0332\\nLine 0333\\nLine 0334\\nLine 0335\\nLine 0336\\nLine 0337\\nLine 0338\\nLine 0339\\nLine 0340\\nLine 0341\\nLine 0342\\nLine 0343\\nLine 0344\\nLine 0345\\nLine 0346\\nLine 0347\\nLine 0348\\nLine 0349\\nLine 0350\\nLine 0351\\nLine 0352\\nLine 0353\\nLine 0354\\nLine 0355\\nLine 0356\\nLine 0357\\nLine 0358\\nLine 0359\\nLine 0360\\nLine 0361\\nLine 0362\\nLine 0363\\nLine 0364\\nLine 0365\\nLine 0366\\nLine 0367\\nLine 0368\\nLine 0369\\nLine 0370\\nLine 0371\\nLine 0372\\nLine 0373\\nLine 0374\\nLine 0375\\nLine 0376\\nLine 0377\\nLine 0378\\nLine 0379\\nLine 0380\\nLine 0381\\nLine 0382\\nLine 0383\\nLine 0384\\nLine 0385\\nLine 0386\\nLine 0387\\nLine 0388\\nLine 0389\\nLine 0390\\nLine 0391\\nLine 0392\\nLine 0393\\nLine 0394\\nLine 0395\\nLine 0396\\nLine 0397\\nLine 0398\\nLine 0399\\nLine 0400\\nLine 0401\\nLine 0402\\nLine 0403\\nLine 0404\\nLine 0405\\nLine 0406\\nLine 0407\\nLine 0408\\nLine 0409\\nLine 0410\\nLine 0411\\nLine 0412\\nLine 0413\\nLine 0414\\nLine 0415\\nLine 0416\\nLine 0417\\nLine 0418\\nLine 0419\\nLine 0420\\nLine 0421\\nLine 0422\\nLine 0423\\nLine 0424\\nLine 0425\\nLine 0426\\nLine 0427\\nLine 0428\\nLine 0429\\nLine 0430\\nLine 0431\\nLine 0432\\nLine 0433\\nLine 0434\\nLine 0435\\nLine 0436\\nLine 0437\\nLine 0438\\nLine 0439\\nLine 0440\\nLine 0441\\nLine 0442\\nLine 0443\\nLine 0444\\nLine 0445\\nLine 0446\\nLine 0447\\nLine 0448\\nLine 0449\\nLine 0450\\nLine 0451\\nLine 0452\\nLine 0453\\nLine 0454\\nLine 0455\\nLine 0456\\nLine 0457\\nLine 0458\\nLine 0459\\nLine 0460\\nLine 0461\\nLine 0462\\nLine 0463\\nLine 0464\\nLine 0465\\nLine 0466\\nLine 0467\\nLine 0468\\nLine 0469\\nLine 0470\\nLine 0471\\nLine 0472\\nLine 0473\\nLine 0474\\nLine 0475\\nLine 0476\\nLine 0477\\nLine 0478\\nLine 0479\\nLine 0480\\nLine 0481\\nLine 0482\\nLine 0483\\nLine 0484\\nLine 0485\\nLine 0486\\nLine 0487\\nLine 0488\\nLine 0489\\nLine 0490\\nLine 0491\\nLine 0492\\nLine 0493\\nLine 0494\\nLine 0495\\nLine 0496\\nLine 0497\\nLine 0498\\nLine 0499\\nLine 0500\\nLine 0501\\nLine 0502\\nLine 0503\\nLine 0504\\nLine 0505\\nLine 0506\\nLine 0507\\nLine 0508\\nLine 0509\\nLine 0510\\nLine 0511\\nLine 0512\\nLine 0513\\nLine 0514\\nLine 0515\\nLine 0516\\nLine 0517\\nLine 0518\\nLine 0519\\nLine 0520\\nLine 0521\\nLine 0522\\nLine 0523\\nLine 0524\\nLine 0525\\nLine 0526\\nLine 0527\\nLine 0528\\nLine 0529\\nLine 0530\\nLine 0531\\nLine 0532\\nLine 0533\\nLine 0534\\nLine 0535\\nLine 0536\\nLine 0537\\nLine 0538\\nLine 0539\\nLine 0540\\nLine 0541\\nLine 0542\\nLine 0543\\nLine 0544\\nLine 0545\\nLine 0546\\nLine 0547\\nLine 0548\\nLine 0549\\nLine 0550\\nLine 0551\\nLine 0552\\nLine 0553\\nLine 0554\\nLine 0555\\nLine 0556\\nLine 0557\\nLine 0558\\nLine 0559\\nLine 0560\\nLine 0561\\nLine 0562\\nLine 0563\\nLine 0564\\nLine 0565\\nLine 0566\\nLine 0567\\nLine 0568\\nLine 0569\\nLine 0570\\nLine 0571\\nLine 0572\\nLine 0573\\nLine 0574\\nLine 0575\\nLine 0576\\nLine 0577\\nLine 0578\\nLine 0579\\nLine 0580\\nLine 0581\\nLine 0582\\nLine 0583\\nLine 0584\\nLine 0585\\nLine 0586\\nLine 0587\\nLine 0588\\nLine 0589\\nLine 0590\\nLine 0591\\nLine 0592\\nLine 0593\\nLine 0594\\nLine 0595\\nLine 0596\\nLine 0597\\nLine 0598\\nLine 0599\\nLine 0600\\nLine 0601\\nLine 0602\\nLine 0603\\nLine 0604\\nLine 0605\\nLine 0606\\nLine 0607\\nLine 0608\\nLine 0609\\nLine 0610\\nLine 0611\\nLine 0612\\nLine 0613\\nLine 0614\\nLine 0615\\nLine 0616\\nLine 0617\\nLine 0618\\nLine 0619\\nLine 0620\\nLine 0621\\nLine 0622\\nLine 0623\\nLine 0624\\nLine 0625\\nLine 0626\\nLine 0627\\nLine 0628\\nLine 0629\\nLine 0630\\nLine 0631\\nLine 0632\\nLine 0633\\nLine 0634\\nLine 0635\\nLine 0636\\nLine 0637\\nLine 0638\\nLine 0639\\nLine 0640\\nLine 0641\\nLine 0642\\nLine 0643\\nLine 0644\\nLine 0645\\nLine 0646\\nLine 0647\\nLine 0648\\nLine 0649\\nLine 0650\\nLine 0651\\nLine 0652\\nLine 0653\\nLine 0654\\nLine 0655\\nLine 0656\\nLine 0657\\nLine 0658\\nLine 0659\\nLine 0660\\nLine 0661\\nLine 0662\\nLine 0663\\nLine 0664\\nLine 0665\\nLine 0666\\nLine 0667\\nLine 0668\\nLine 0669\\nLine 0670\\nLine 0671\\nLine 0672\\nLine 0673\\nLine 0674\\nLine 0675\\nLine 0676\\nLine 0677\\nLine 0678\\nLine 0679\\nLine 0680\\nLine 0681\\nLine 0682\\nLine 0683\\nLine 0684\\nLine 0685\\nLine 0686\\nLine 0687\\nLine 0688\\nLine 0689\\nLine 0690\\nLine 0691\\nLine 0692\\nLine 0693\\nLine 0694\\nLine 0695\\nLine 0696\\nLine 0697\\nLine 0698\\nLine 0699\\nLine 0700\\nLine 0701\\nLine 0702\\nLine 0703\\nLine 0704\\nLine 0705\\nLine 0706\\nLine 0707\\nLine 0708\\nLine 0709\\nLine 0710\\nLine 0711\\nLine 0712\\nLine 0713\\nLine 0714\\nLine 0715\\nLine 0716\\nLine 0717\\nLine 0718\\nLine 0719\\nLine 0720\\nLine 0721\\nLine 0722\\nLine 0723\\nLine 0724\\nLine 0725\\nLine 0726\\nLine 0727\\nLine 0728\\nLine 0729\\nLine 0730\\nLine 0731\\nLine 0732\\nLine 0733\\nLine 0734\\nLine 0735\\nLine 0736\\nLine 0737\\nLine 0738\\nLine 0739\\nLine 0740\\nLine 0741\\nLine 0742\\nLine 0743\\nLine 0744\\nLine 0745\\nLine 0746\\nLine 0747\\nLine 0748\\nLine 0749\\nLine 0750\\nLine 0751\\nLine 0752\\nLine 0753\\nLine 0754\\nLine 0755\\nLine 0756\\nLine 0757\\nLine 0758\\nLine 0759\\nLine 0760\\nLine 0761\\nLine 0762\\nLine 0763\\nLine 0764\\nLine 0765\\nLine 0766\\nLine 0767\\nLine 0768\\nLine 0769\\nLine 0770\\nLine 0771\\nLine 0772\\nLine 0773\\nLine 0774\\nLine 0775\\nLine 0776\\nLine 0777\\nLine 0778\\nLine 0779\\nLine 0780\\nLine 0781\\nLine 0782\\nLine 0783\\nLine 0784\\nLine 0785\\nLine 0786\\nLine 0787\\nLine 0788\\nLine 0789\\nLine 0790\\nLine 0791\\nLine 0792\\nLine 0793\\nLine 0794\\nLine 0795\\nLine 0796\\nLine 0797\\nLine 0798\\nLine 0799\\nLine 0800\\nLine 0801\\nLine 0802\\nLine 0803\\nLine 0804\\nLine 0805\\nLine 0806\\nLine 0807\\nLine 0808\\nLine 0809\\nLine 0810\\nLine 0811\\nLine 0812\\nLine 0813\\nLine 0814\\nLine 0815\\nLine 0816\\nLine 0817\\nLine 0818\\nLine 0819\\nLine 0820\\nLine 0821\\nLine 0822\\nLine 0823\\nLine 0824\\nLine 0825\\nLine 0826\\nLine 0827\\nLine 0828\\nLine 0829\\nLine 0830\\nLine 0831\\nLine 0832\\nLine 0833\\nLine 0834\\nLine 0835\\nLine 0836\\nLine 0837\\nLine 0838\\nLine 0839\\nLine 0840\\nLine 0841\\nLine 0842\\nLine 0843\\nLine 0844\\nLine 0845\\nLine 0846\\nLine 0847\\nLine 0848\\nLine 0849\\nLine 0850\\nLine 0851\\nLine 0852\\nLine 0853\\nLine 0854\\nLine 0855\\nLine 0856\\nLine 0857\\nLine 0858\\nLine 0859\\nLine 0860\\nLine 0861\\nLine 0862\\nLine 0863\\nLine 0864\\nLine 0865\\nLine 0866\\nLine 0867\\nLine 0868\\nLine 0869\\nLine 0870\\nLine 0871\\nLine 0872\\nLine 0873\\nLine 0874\\nLine 0875\\nLine 0876\\nLine 0877\\nLine 0878\\nLine 0879\\nLine 0880\\nLine 0881\\nLine 0882\\nLine 0883\\nLine 0884\\nLine 0885\\nLine 0886\\nLine 0887\\nLine 0888\\nLine 0889\\nLine 0890\\nLine 0891\\nLine 0892\\nLine 0893\\nLine 0894\\nLine 0895\\nLine 0896\\nLine 0897\\nLine 0898\\nLine 0899\\nLine 0900\\nLine 0901\\nLine 0902\\nLine 0903\\nLine 0904\\nLine 0905\\nLine 0906\\nLine 0907\\nLine 0908\\nLine 0909\\nLine 0910\\nLine 0911\\nLine 0912\\nLine 0913\\nLine 0914\\nLine 0915\\nLine 0916\\nLine 0917\\nLine 0918\\nLine 0919\\nLine 0920\\nLine 0921\\nLine 0922\\nLine 0923\\nLine 0924\\nLine 0925\\nLine 0926\\nLine 0927\\nLine 0928\\nLine 0929\\nLine 0930\\nLine 0931\\nLine 0932\\nLine 0933\\nLine 0934\\nLine 0935\\nLine 0936\\nLine 0937\\nLine 0938\\nLine 0939\\nLine 0940\\nLine 0941\\nLine 0942\\nLine 0943\\nLine 0944\\nLine 0945\\nLine 0946\\nLine 0947\\nLine 0948\\nLine 0949\\nLine 0950\\nLine 0951\\nLine 0952\\nLine 0953\\nLine 0954\\nLine 0955\\nLine 0956\\nLine 0957\\nLine 0958\\nLine 0959\\nLine 0960\\nLine 0961\\nLine 0962\\nLine 0963\\nLine 0964\\nLine 0965\\nLine 0966\\nLine 0967\\nLine 0968\\nL\"\n                    },\n                    \"direction\": \"Response\"\n                }\n            }\n        },\n        {\n            \"connection_id\": 0,\n            \"action\": {\n                \"Data\": {\n                    \"data\": {\n                        \"Utf8\": \"ine 0969\\nLine 0970\\nLine 0971\\nLine 0972\\nLine 0973\\nLine 0974\\nLine 0975\\nLine 0976\\nLine 0977\\nLine 0978\\nLine 0979\\nLine 0980\\nLine 0981\\nLine 0982\\nLine 0983\\nLine 0984\\nLine 0985\\nLine 0986\\nLine 0987\\nLine 0988\\nLine 0989\\nLine 0990\\nLine 0991\\nLine 0992\\nLine 0993\\nLine 0994\\nLine 0995\\nLine 0996\\nLine 0997\\nLine 0998\\nLine 0999\\nLine 1000\\n\"\n                    },\n                    \"direction\": \"Response\"\n                }\n            }\n        },\n        {\n            \"connection_id\": 0,\n            \"action\": {\n                \"Eof\": {\n                    \"ok\": true,\n                    \"direction\": \"Response\"\n                }\n            }\n        }\n    ],\n    \"docs\": \"todo docs\",\n    \"version\": \"V0\"\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/s3/tests/data/content-length-enforcement/get-object-short.json",
    "content": "{\n    \"events\": [\n        {\n            \"connection_id\": 0,\n            \"action\": {\n                \"Request\": {\n                    \"request\": {\n                        \"uri\": \"https://dontcare.s3.us-east-1.amazonaws.com/1000-lines.txt?x-id=GetObject\",\n                        \"headers\": {\n                            \"user-agent\": [\n                                \"aws-sdk-rust/0.123.test os/windows/XPSP3 lang/rust/1.50.0\"\n                            ],\n                            \"x-amz-user-agent\": [\n                                \"aws-sdk-rust/0.123.test api/test-service/0.123 os/windows/XPSP3 lang/rust/1.50.0\"\n                            ],\n                            \"x-amz-date\": [\n                                \"20090213T233130Z\"\n                            ],\n                            \"authorization\": [\n                                \"AWS4-HMAC-SHA256 Credential=ANOTREAL/20090213/us-east-1/s3/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date;x-amz-user-agent, Signature=62edebbcadc277f9482344af1467f4a48e9fe852585382f3a50c141421697c6b\"\n                            ],\n                            \"x-amz-content-sha256\": [\n                                \"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\"\n                            ],\n                            \"amz-sdk-request\": [\n                                \"attempt=1; max=1\"\n                            ]\n                        },\n                        \"method\": \"GET\"\n                    }\n                }\n            }\n        },\n        {\n            \"connection_id\": 0,\n            \"action\": {\n                \"Eof\": {\n                    \"ok\": true,\n                    \"direction\": \"Request\"\n                }\n            }\n        },\n        {\n            \"connection_id\": 0,\n            \"action\": {\n                \"Response\": {\n                    \"response\": {\n                        \"Ok\": {\n                            \"status\": 200,\n                            \"headers\": {\n                                \"x-amz-id-2\": [\n                                    \"BCXc551R1SFxVDbfoKFjqALf+WmHMMZGc2V9dmV8CcuI7q056VHc3Wne4UqbFkkKpACF6LUkSs8pUhjIYm8rJ5lffUg73aEMJyZJaHnakTk=\"\n                                ],\n                                \"x-amz-request-id\": [\n                                    \"KWFKT9SCC4MFHPHM\"\n                                ],\n                                \"date\": [\n                                    \"Wed, 22 May 2024 15:34:28 GMT\"\n                                ],\n                                \"x-amz-replication-status\": [\n                                    \"FAILED\"\n                                ],\n                                \"last-modified\": [\n                                    \"Fri, 07 Oct 2022 15:00:29 GMT\"\n                                ],\n                                \"etag\": [\n                                    \"\\\"983b8597be0f4c15bb8ece7029140d0f\\\"\"\n                                ],\n                                \"x-amz-version-id\": [\n                                    \"null\"\n                                ],\n                                \"accept-ranges\": [\n                                    \"bytes\"\n                                ],\n                                \"content-type\": [\n                                    \"text/plain\"\n                                ],\n                                \"server\": [\n                                    \"AmazonS3\"\n                                ],\n                                \"content-length\": [\n                                    \"9999\"\n                                ]\n                            }\n                        }\n                    }\n                }\n            }\n        },\n        {\n            \"connection_id\": 0,\n            \"action\": {\n                \"Data\": {\n                    \"data\": {\n                        \"Utf8\": \"Line 0001\\nLine 0002\\nLine 0003\\nLine 0004\\nLine 0005\\nLine 0006\\nLine 0007\\nLine 0008\\nLine 0009\\nLine 0010\\nLine 0011\\nLine 0012\\nLine 0013\\nLine 0014\\nLine 0015\\nLine 0016\\nLine 0017\\nLine 0018\\nLine 0019\\nLine 0020\\nLine 0021\\nLine 0022\\nLine 0023\\nLine 0024\\nLine 0025\\nLine 0026\\nLine 0027\\nLine 0028\\nLine 0029\\nLine 0030\\nLine 0031\\nLine 0032\\nLine 0033\\nLine 0034\\nLine 0035\\nLine 0036\\nLine 0037\\nLine 0038\\nLine 0039\\nLine 0040\\nLine 0041\\nLine 0042\\nLine 0043\\nLine 0044\\nLine 0045\\nLine 0046\\nLine 0047\\nLine 0048\\nLine 0049\\nLine 0050\\nLine 0051\\nLine 0052\\nLine 0053\\nLine 0054\\nLine 0055\\nLine 0056\\nLine 0057\\nLine 0058\\nLine 0059\\nLine 0060\\nLine 0061\\nLine 0062\\nLine 0063\\nLine 0064\\nLine 0065\\nLine 0066\\nLine 0067\\nLine 0068\\nLine 0069\\nLine 0070\\nLine 0071\\nLine 0072\\nLine 0073\\nLine 0074\\nLine 0075\\nLine 0076\\nLine 0077\\nLine 0078\\nLine 0079\\nLine 0080\\nLine 0081\\nLine 0082\\nLine 0083\\nLine 0084\\nLine 0085\\nLine 0086\\nLine 0087\\nLine 0088\\nLine 0089\\nLine 0090\\nLine 0091\\nLine 0092\\nLine 0093\\nLine 0094\\nLine 0095\\nLine 0096\\nLine 0097\\nLine 0098\\nLine 0099\\nLine 0100\\nLine 0101\\nLine 0102\\nLine 0103\\nLine 0104\\nLine 0105\\nLine 0106\\nLine 0107\\nLine 0108\\nLine 0109\\nLine 0110\\nLine 0111\\nLine 0112\\nLine 0113\\nLine 0114\\nLine 0115\\nLine 0116\\nLine 0117\\nLine 0118\\nLine 0119\\nLine 0120\\nLine 0121\\nLine 0122\\nLine 0123\\nLine 0124\\nLine 0125\\nLine 0126\\nLine 0127\\nLine 0128\\nLine 0129\\nLine 0130\\nLine 0131\\nLine 0132\\nLine 0133\\nLine 0134\\nLine 0135\\nLine 0136\\nLine 0137\\nLine 0138\\nLine 0139\\nLine 0140\\nLine 0141\\nLine 0142\\nLine 0143\\nLine 0144\\nLine 0145\\nLine 0146\\nLine 0147\\nLine 0148\\nLine 0149\"\n                    },\n                    \"direction\": \"Response\"\n                }\n            }\n        },\n        {\n            \"connection_id\": 0,\n            \"action\": {\n                \"Data\": {\n                    \"data\": {\n                        \"Utf8\": \"\\nLine 0150\\nLine 0151\\nLine 0152\\nLine 0153\\nLine 0154\\nLine 0155\\nLine 0156\\nLine 0157\\nLine 0158\\nLine 0159\\nLine 0160\\nLine 0161\\nLine 0162\\nLine 0163\\nLine 0164\\nLine 0165\\nLine 0166\\nLine 0167\\nLine 0168\\nLine 0169\\nLine 0170\\nLine 0171\\nLine 0172\\nLine 0173\\nLine 0174\\nLine 0175\\nLine 0176\\nLine 0177\\nLine 0178\\nLine 0179\\nLine 0180\\nLine 0181\\nLine 0182\\nLine 0183\\nLine 0184\\nLine 0185\\nLine 0186\\nLine 0187\\nLine 0188\\nLine 0189\\nLine 0190\\nLine 0191\\nLine 0192\\nLine 0193\\nLine 0194\\nLine 0195\\nLine 0196\\nLine 0197\\nLine 0198\\nLine 0199\\nLine 0200\\nLine 0201\\nLine 0202\\nLine 0203\\nLine 0204\\nLine 0205\\nLine 0206\\nLine 0207\\nLine 0208\\nLine 0209\\nLine 0210\\nLine 0211\\nLine 0212\\nLine 0213\\nLine 0214\\nLine 0215\\nLine 0216\\nLine 0217\\nLine 0218\\nLine 0219\\nLine 0220\\nLine 0221\\nLine 0222\\nLine 0223\\nLine 0224\\nLine 0225\\nLine 0226\\nLine 0227\\nLine 0228\\nLine 0229\\nLine 0230\\nLine 0231\\nLine 0232\\nLine 0233\\nLine 0234\\nLine 0235\\nLine 0236\\nLine 0237\\nLine 0238\\nLine 0239\\nLine 0240\\nLine 0241\\nLine 0242\\nLine 0243\\nLine 0244\\nLine 0245\\nLine 0246\\nLine 0247\\nLine 0248\\nLine 0249\\nLine 0250\\nLine 0251\\nLine 0252\\nLine 0253\\nLine 0254\\nLine 0255\\nLine 0256\\nLine 0257\\nLine 0258\\nLine 0259\\nLine 0260\\nLine 0261\\nLine 0262\\nLine 0263\\nLine 0264\\nLine 0265\\nLine 0266\\nLine 0267\\nLine 0268\\nLine 0269\\nLine 0270\\nLine 0271\\nLine 0272\\nLine 0273\\nLine 0274\\nLine 0275\\nLine 0276\\nLine 0277\\nLine 0278\\nLine 0279\\nLine 0280\\nLine 0281\\nLine 0282\\nLine 0283\\nLine 0284\\nLine 0285\\nLine 0286\\nLine 0287\\nLine 0288\\nLine 0289\\nLine 0290\\nLine 0291\\nLine 0292\\nLine 0293\\nLine 0294\\nLine 0295\\nLine 0296\\nLine 0297\\nLine 0298\\nLine 0299\\nLine 0300\\nLine 0301\\nLine 0302\\nLine 0303\\nLine 0304\\nLine 0305\\nLine 0306\\nLine 0307\\nLine 0308\\nLine 0309\\nLine 0310\\nLine 0311\\nLine 0312\\nLine 0313\\nLine 0314\\nLine 0315\\nLine 0316\\nLine 0317\\nLine 0318\\nLine 0319\\nLine 0320\\nLine 0321\\nLine 0322\\nLine 0323\\nLine 0324\\nLine 0325\\nLine 0326\\nLine 0327\\nLine 0328\\nLine 0329\\nLine 0330\\nLine 0331\\nLine 0332\\nLine 0333\\nLine 0334\\nLine 0335\\nLine 0336\\nLine 0337\\nLine 0338\\nLine 0339\\nLine 0340\\nLine 0341\\nLine 0342\\nLine 0343\\nLine 0344\\nLine 0345\\nLine 0346\\nLine 0347\\nLine 0348\\nLine 0349\\nLine 0350\\nLine 0351\\nLine 0352\\nLine 0353\\nLine 0354\\nLine 0355\\nLine 0356\\nLine 0357\\nLine 0358\\nLine 0359\\nLine 0360\\nLine 0361\\nLine 0362\\nLine 0363\\nLine 0364\\nLine 0365\\nLine 0366\\nLine 0367\\nLine 0368\\nLine 0369\\nLine 0370\\nLine 0371\\nLine 0372\\nLine 0373\\nLine 0374\\nLine 0375\\nLine 0376\\nLine 0377\\nLine 0378\\nLine 0379\\nLine 0380\\nLine 0381\\nLine 0382\\nLine 0383\\nLine 0384\\nLine 0385\\nLine 0386\\nLine 0387\\nLine 0388\\nLine 0389\\nLine 0390\\nLine 0391\\nLine 0392\\nLine 0393\\nLine 0394\\nLine 0395\\nLine 0396\\nLine 0397\\nLine 0398\\nLine 0399\\nLine 0400\\nLine 0401\\nLine 0402\\nLine 0403\\nLine 0404\\nLine 0405\\nLine 0406\\nLine 0407\\nLine 0408\\nLine 0409\\nLine 0410\\nLine 0411\\nLine 0412\\nLine 0413\\nLine 0414\\nLine 0415\\nLine 0416\\nLine 0417\\nLine 0418\\nLine 0419\\nLine 0420\\nLine 0421\\nLine 0422\\nLine 0423\\nLine 0424\\nLine 0425\\nLine 0426\\nLine 0427\\nLine 0428\\nLine 0429\\nLine 0430\\nLine 0431\\nLine 0432\\nLine 0433\\nLine 0434\\nLine 0435\\nLine 0436\\nLine 0437\\nLine 0438\\nLine 0439\\nLine 0440\\nLine 0441\\nLine 0442\\nLine 0443\\nLine 0444\\nLine 0445\\nLine 0446\\nLine 0447\\nLine 0448\\nLine 0449\\nLine 0450\\nLine 0451\\nLine 0452\\nLine 0453\\nLine 0454\\nLine 0455\\nLine 0456\\nLine 0457\\nLine 0458\\nLine 0459\\nLine 0460\\nLine 0461\\nLine 0462\\nLine 0463\\nLine 0464\\nLine 0465\\nLine 0466\\nLine 0467\\nLine 0468\\nLine 0469\\nLine 0470\\nLine 0471\\nLine 0472\\nLine 0473\\nLine 0474\\nLine 0475\\nLine 0476\\nLine 0477\\nLine 0478\\nLine 0479\\nLine 0480\\nLine 0481\\nLine 0482\\nLine 0483\\nLine 0484\\nLine 0485\\nLine 0486\\nLine 0487\\nLine 0488\\nLine 0489\\nLine 0490\\nLine 0491\\nLine 0492\\nLine 0493\\nLine 0494\\nLine 0495\\nLine 0496\\nLine 0497\\nLine 0498\\nLine 0499\\nLine 0500\\nLine 0501\\nLine 0502\\nLine 0503\\nLine 0504\\nLine 0505\\nLine 0506\\nLine 0507\\nLine 0508\\nLine 0509\\nLine 0510\\nLine 0511\\nLine 0512\\nLine 0513\\nLine 0514\\nLine 0515\\nLine 0516\\nLine 0517\\nLine 0518\\nLine 0519\\nLine 0520\\nLine 0521\\nLine 0522\\nLine 0523\\nLine 0524\\nLine 0525\\nLine 0526\\nLine 0527\\nLine 0528\\nLine 0529\\nLine 0530\\nLine 0531\\nLine 0532\\nLine 0533\\nLine 0534\\nLine 0535\\nLine 0536\\nLine 0537\\nLine 0538\\nLine 0539\\nLine 0540\\nLine 0541\\nLine 0542\\nLine 0543\\nLine 0544\\nLine 0545\\nLine 0546\\nLine 0547\\nLine 0548\\nLine 0549\\nLine 0550\\nLine 0551\\nLine 0552\\nLine 0553\\nLine 0554\\nLine 0555\\nLine 0556\\nLine 0557\\nLine 0558\\nLine 0559\\nLine 0560\\nLine 0561\\nLine 0562\\nLine 0563\\nLine 0564\\nLine 0565\\nLine 0566\\nLine 0567\\nLine 0568\\nLine 0569\\nLine 0570\\nLine 0571\\nLine 0572\\nLine 0573\\nLine 0574\\nLine 0575\\nLine 0576\\nLine 0577\\nLine 0578\\nLine 0579\\nLine 0580\\nLine 0581\\nLine 0582\\nLine 0583\\nLine 0584\\nLine 0585\\nLine 0586\\nLine 0587\\nLine 0588\\nLine 0589\\nLine 0590\\nLine 0591\\nLine 0592\\nLine 0593\\nLine 0594\\nLine 0595\\nLine 0596\\nLine 0597\\nLine 0598\\nLine 0599\\nLine 0600\\nLine 0601\\nLine 0602\\nLine 0603\\nLine 0604\\nLine 0605\\nLine 0606\\nLine 0607\\nLine 0608\\nLine 0609\\nLine 0610\\nLine 0611\\nLine 0612\\nLine 0613\\nLine 0614\\nLine 0615\\nLine 0616\\nLine 0617\\nLine 0618\\nLine 0619\\nLine 0620\\nLine 0621\\nLine 0622\\nLine 0623\\nLine 0624\\nLine 0625\\nLine 0626\\nLine 0627\\nLine 0628\\nLine 0629\\nLine 0630\\nLine 0631\\nLine 0632\\nLine 0633\\nLine 0634\\nLine 0635\\nLine 0636\\nLine 0637\\nLine 0638\\nLine 0639\\nLine 0640\\nLine 0641\\nLine 0642\\nLine 0643\\nLine 0644\\nLine 0645\\nLine 0646\\nLine 0647\\nLine 0648\\nLine 0649\\nLine 0650\\nLine 0651\\nLine 0652\\nLine 0653\\nLine 0654\\nLine 0655\\nLine 0656\\nLine 0657\\nLine 0658\\nLine 0659\\nLine 0660\\nLine 0661\\nLine 0662\\nLine 0663\\nLine 0664\\nLine 0665\\nLine 0666\\nLine 0667\\nLine 0668\\nLine 0669\\nLine 0670\\nLine 0671\\nLine 0672\\nLine 0673\\nLine 0674\\nLine 0675\\nLine 0676\\nLine 0677\\nLine 0678\\nLine 0679\\nLine 0680\\nLine 0681\\nLine 0682\\nLine 0683\\nLine 0684\\nLine 0685\\nLine 0686\\nLine 0687\\nLine 0688\\nLine 0689\\nLine 0690\\nLine 0691\\nLine 0692\\nLine 0693\\nLine 0694\\nLine 0695\\nLine 0696\\nLine 0697\\nLine 0698\\nLine 0699\\nLine 0700\\nLine 0701\\nLine 0702\\nLine 0703\\nLine 0704\\nLine 0705\\nLine 0706\\nLine 0707\\nLine 0708\\nLine 0709\\nLine 0710\\nLine 0711\\nLine 0712\\nLine 0713\\nLine 0714\\nLine 0715\\nLine 0716\\nLine 0717\\nLine 0718\\nLine 0719\\nLine 0720\\nLine 0721\\nLine 0722\\nLine 0723\\nLine 0724\\nLine 0725\\nLine 0726\\nLine 0727\\nLine 0728\\nLine 0729\\nLine 0730\\nLine 0731\\nLine 0732\\nLine 0733\\nLine 0734\\nLine 0735\\nLine 0736\\nLine 0737\\nLine 0738\\nLine 0739\\nLine 0740\\nLine 0741\\nLine 0742\\nLine 0743\\nLine 0744\\nLine 0745\\nLine 0746\\nLine 0747\\nLine 0748\\nLine 0749\\nLine 0750\\nLine 0751\\nLine 0752\\nLine 0753\\nLine 0754\\nLine 0755\\nLine 0756\\nLine 0757\\nLine 0758\\nLine 0759\\nLine 0760\\nLine 0761\\nLine 0762\\nLine 0763\\nLine 0764\\nLine 0765\\nLine 0766\\nLine 0767\\nLine 0768\\nLine 0769\\nLine 0770\\nLine 0771\\nLine 0772\\nLine 0773\\nLine 0774\\nLine 0775\\nLine 0776\\nLine 0777\\nLine 0778\\nLine 0779\\nLine 0780\\nLine 0781\\nLine 0782\\nLine 0783\\nLine 0784\\nLine 0785\\nLine 0786\\nLine 0787\\nLine 0788\\nLine 0789\\nLine 0790\\nLine 0791\\nLine 0792\\nLine 0793\\nLine 0794\\nLine 0795\\nLine 0796\\nLine 0797\\nLine 0798\\nLine 0799\\nLine 0800\\nLine 0801\\nLine 0802\\nLine 0803\\nLine 0804\\nLine 0805\\nLine 0806\\nLine 0807\\nLine 0808\\nLine 0809\\nLine 0810\\nLine 0811\\nLine 0812\\nLine 0813\\nLine 0814\\nLine 0815\\nLine 0816\\nLine 0817\\nLine 0818\\nLine 0819\\nLine 0820\\nLine 0821\\nLine 0822\\nLine 0823\\nLine 0824\\nLine 0825\\nLine 0826\\nLine 0827\\nLine 0828\\nLine 0829\\nLine 0830\\nLine 0831\\nLine 0832\\nLine 0833\\nLine 0834\\nLine 0835\\nLine 0836\\nLine 0837\\nLine 0838\\nLine 0839\\nLine 0840\\nLine 0841\\nLine 0842\\nLine 0843\\nLine 0844\\nLine 0845\\nLine 0846\\nLine 0847\\nLine 0848\\nLine 0849\\nLine 0850\\nLine 0851\\nLine 0852\\nLine 0853\\nLine 0854\\nLine 0855\\nLine 0856\\nLine 0857\\nLine 0858\\nLine 0859\\nLine 0860\\nLine 0861\\nLine 0862\\nLine 0863\\nLine 0864\\nLine 0865\\nLine 0866\\nLine 0867\\nLine 0868\\nLine 0869\\nLine 0870\\nLine 0871\\nLine 0872\\nLine 0873\\nLine 0874\\nLine 0875\\nLine 0876\\nLine 0877\\nLine 0878\\nLine 0879\\nLine 0880\\nLine 0881\\nLine 0882\\nLine 0883\\nLine 0884\\nLine 0885\\nLine 0886\\nLine 0887\\nLine 0888\\nLine 0889\\nLine 0890\\nLine 0891\\nLine 0892\\nLine 0893\\nLine 0894\\nLine 0895\\nLine 0896\\nLine 0897\\nLine 0898\\nLine 0899\\nLine 0900\\nLine 0901\\nLine 0902\\nLine 0903\\nLine 0904\\nLine 0905\\nLine 0906\\nLine 0907\\nLine 0908\\nLine 0909\\nLine 0910\\nLine 0911\\nLine 0912\\nLine 0913\\nLine 0914\\nLine 0915\\nLine 0916\\nLine 0917\\nLine 0918\\nLine 0919\\nLine 0920\\nLine 0921\\nLine 0922\\nLine 0923\\nLine 0924\\nLine 0925\\nLine 0926\\nLine 0927\\nLine 0928\\nLine 0929\\nLine 0930\\nLine 0931\\nLine 0932\\nLine 0933\\nLine 0934\\nLine 0935\\nLine 0936\\nLine 0937\\nLine 0938\\nLine 0939\\nLine 0940\\nLine 0941\\nLine 0942\\nLine 0943\\nLine 0944\\nLine 0945\\nLine 0946\\nLine 0947\\nLine 0948\\nLine 0949\\nLine 0950\\nLine 0951\\nLine 0952\\nLine 0953\\nLine 0954\\nLine 0955\\nLine 0956\\nLine 0957\\nLine 0958\\nLine 0959\\nLine 0960\\nLine 0961\\nLine 0962\\nLine 0963\\nLine 0964\\nLine 0965\\nLine 0966\\nLine 0967\\nLine 0968\\nL\"\n                    },\n                    \"direction\": \"Response\"\n                }\n            }\n        },\n        {\n            \"connection_id\": 0,\n            \"action\": {\n                \"Data\": {\n                    \"data\": {\n                        \"Utf8\": \"ine 0969\\nLine 0970\\nLine 0971\\nLine 0972\\nLine 0973\\nLine 0974\\nLine 0975\\nLine 0976\\nLine 0977\\nLine 0978\\nLine 0979\\nLine 0980\\nLine 0981\\nLine 0982\\nLine 0983\\nLine 0984\\nLine 0985\\nLine 0986\\nLine 0987\\nLine 0988\\nLine 0989\\nLine 0990\\nLine 0991\\nLine 0992\\nLine 0993\\nLine 0994\\nLine 0995\\nLine 0996\\nLine 0997\\nLine 0998\\nLine 0999\\nLine 1000\\n\"\n                    },\n                    \"direction\": \"Response\"\n                }\n            }\n        },\n        {\n            \"connection_id\": 0,\n            \"action\": {\n                \"Eof\": {\n                    \"ok\": true,\n                    \"direction\": \"Response\"\n                }\n            }\n        }\n    ],\n    \"docs\": \"todo docs\",\n    \"version\": \"V0\"\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/s3/tests/data/content-length-enforcement/head-object.json",
    "content": "{\n    \"events\": [\n        {\n            \"connection_id\": 0,\n            \"action\": {\n                \"Request\": {\n                    \"request\": {\n                        \"uri\": \"https://dontcare.s3.us-east-1.amazonaws.com/dontcare.json\",\n                        \"headers\": {\n                            \"user-agent\": [\n                                \"aws-sdk-rust/0.123.test os/windows/XPSP3 lang/rust/1.50.0\"\n                            ],\n                            \"x-amz-user-agent\": [\n                                \"aws-sdk-rust/0.123.test api/test-service/0.123 os/windows/XPSP3 lang/rust/1.50.0\"\n                            ],\n                            \"x-amz-date\": [\n                                \"20090213T233130Z\"\n                            ],\n                            \"authorization\": [\n                                \"AWS4-HMAC-SHA256 Credential=ANOTREAL/20090213/us-east-1/s3/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date;x-amz-user-agent, Signature=6d5c92e11af515195eb16138091fee14bfda1213466804a292ba29c164e6cc99\"\n                            ],\n                            \"x-amz-content-sha256\": [\n                                \"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\"\n                            ],\n                            \"amz-sdk-request\": [\n                                \"attempt=1; max=1\"\n                            ]\n                        },\n                        \"method\": \"HEAD\"\n                    }\n                }\n            }\n        },\n        {\n            \"connection_id\": 0,\n            \"action\": {\n                \"Eof\": {\n                    \"ok\": true,\n                    \"direction\": \"Request\"\n                }\n            }\n        },\n        {\n            \"connection_id\": 0,\n            \"action\": {\n                \"Response\": {\n                    \"response\": {\n                        \"Ok\": {\n                            \"status\": 200,\n                            \"headers\": {\n                                \"x-amz-id-2\": [\n                                    \"jCslBVSBWRcOPfOdanOAgY1Fx9SxH/BkvhwhhDCcrF5ldlaCXDLy26UmJu1HhT52LKmlGKxit5A=\"\n                                ],\n                                \"x-amz-request-id\": [\n                                    \"P0MZE86W8DZP20SM\"\n                                ],\n                                \"date\": [\n                                    \"Wed, 22 May 2024 15:01:06 GMT\"\n                                ],\n                                \"last-modified\": [\n                                    \"Wed, 28 Dec 2022 22:16:55 GMT\"\n                                ],\n                                \"etag\": [\n                                    \"\\\"65a32c4cbf8ee97c54864cf33986b8d8-53\\\"\"\n                                ],\n                                \"x-amz-server-side-encryption\": [\n                                    \"AES256\"\n                                ],\n                                \"x-amz-version-id\": [\n                                    \"null\"\n                                ],\n                                \"accept-ranges\": [\n                                    \"bytes\"\n                                ],\n                                \"content-type\": [\n                                    \"application/json\"\n                                ],\n                                \"server\": [\n                                    \"AmazonS3\"\n                                ],\n                                \"content-length\": [\n                                    \"905831718\"\n                                ]\n                            }\n                        }\n                    }\n                }\n            }\n        },\n        {\n            \"connection_id\": 0,\n            \"action\": {\n                \"Eof\": {\n                    \"ok\": true,\n                    \"direction\": \"Response\"\n                }\n            }\n        }\n    ],\n    \"docs\": \"todo docs\",\n    \"version\": \"V0\"\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/s3/tests/data/express/mixed-auths.json",
    "content": "{\n  \"events\": [\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Request\": {\n          \"request\": {\n            \"uri\": \"https://s3express-test-bucket--usw2-az1--x-s3.s3express-usw2-az1.us-west-2.amazonaws.com/?session\",\n            \"headers\": {\n              \"authorization\": [\n                \"AWS4-HMAC-SHA256 Credential=ANOTREAL/20090213/us-west-2/s3express/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date;x-amz-user-agent, Signature=41c2b04a140b0973d5f82d18c412c21a2328d86435b5568e4fbdf6af5d99ebb5\"\n              ],\n              \"amz-sdk-request\": [\n                \"attempt=1; max=3\"\n              ],\n              \"user-agent\": [\n                \"aws-sdk-rust/0.123.test os/windows/XPSP3 lang/rust/1.50.0\"\n              ],\n              \"x-amz-content-sha256\": [\n                \"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\"\n              ],\n              \"x-amz-user-agent\": [\n                \"aws-sdk-rust/0.123.test os/windows/XPSP3 lang/rust/1.50.0\"\n              ],\n              \"x-amz-date\": [\n                \"20090213T233130Z\"\n              ]\n            },\n            \"method\": \"GET\"\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Response\": {\n          \"response\": {\n            \"Ok\": {\n              \"status\": 200,\n              \"headers\": {\n                \"content-type\": [\n                  \"application/xml\"\n                ],\n                \"server\": [\n                  \"AmazonS3\"\n                ],\n                \"content-length\": [\n                  \"333\"\n                ],\n                \"date\": [\n                  \"Fri, 13 Feb 2009 23:31:30 GMT\"\n                ],\n                \"x-amz-request-id\": [\n                  \"0033eada6b00018d62cbbce90509fbf343a84844\"\n                ],\n                \"x-amz-id-2\": [\n                  \"ucekwm0\"\n                ]\n              }\n            }\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?>\\n<CreateSessionResult xmlns=\\\"http://s3.amazonaws.com/doc/2006-03-01/\\\"><Credentials><SessionToken>TESTSESSIONTOKEN</SessionToken><SecretAccessKey>TESTSECRETKEY</SecretAccessKey><AccessKeyId>ASIARTESTID</AccessKeyId><Expiration>2024-01-29T18:53:01Z</Expiration></Credentials></CreateSessionResult>\"\n          },\n          \"direction\": \"Response\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Response\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 1,\n      \"action\": {\n        \"Request\": {\n          \"request\": {\n            \"uri\": \"https://s3express-test-bucket--usw2-az1--x-s3.s3express-usw2-az1.us-west-2.amazonaws.com/?list-type=2\",\n            \"headers\": {\n              \"user-agent\": [\n                \"aws-sdk-rust/0.123.test os/windows/XPSP3 lang/rust/1.50.0\"\n              ],\n              \"x-amz-s3session-token\": [\n                \"TESTSESSIONTOKEN\"\n              ],\n              \"authorization\": [\n                \"AWS4-HMAC-SHA256 Credential=ASIARTESTID/20090213/us-west-2/s3express/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date;x-amz-s3session-token;x-amz-user-agent, Signature=d1765aa7ec005607ba94fdda08c6739228d5ee14eb8316e80264c35649661a19\"\n              ],\n              \"amz-sdk-request\": [\n                \"attempt=1; max=3\"\n              ],\n              \"x-amz-date\": [\n                \"20090213T233130Z\"\n              ],\n              \"x-amz-user-agent\": [\n                \"aws-sdk-rust/0.123.test api/test-service/0.123 os/windows/XPSP3 lang/rust/1.50.0\"\n              ],\n              \"x-amz-content-sha256\": [\n                \"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\"\n              ]\n            },\n            \"method\": \"GET\"\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 1,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 1,\n      \"action\": {\n        \"Response\": {\n          \"response\": {\n            \"Ok\": {\n              \"status\": 200,\n              \"headers\": {\n                \"server\": [\n                  \"AmazonS3\"\n                ],\n                \"x-amz-bucket-region\": [\n                  \"us-west-2\"\n                ],\n                \"x-amz-request-id\": [\n                  \"0033eada6b00018d62cbbd9c0509eacc646e551d\"\n                ],\n                \"date\": [\n                  \"Fri, 13 Feb 2009 23:31:30 GMT\"\n                ],\n                \"content-length\": [\n                  \"520\"\n                ],\n                \"content-type\": [\n                  \"application/xml\"\n                ],\n                \"x-amz-id-2\": [\n                  \"VLW4GcfH\"\n                ]\n              }\n            }\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 1,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?>\\n<ListBucketResult xmlns=\\\"http://s3.amazonaws.com/doc/2006-03-01/\\\"><Name>s3express-test-bucket--usw2-az1--x-s3</Name><Prefix/><KeyCount>1</KeyCount><MaxKeys>1000</MaxKeys><IsTruncated>false</IsTruncated><Contents><ChecksumAlgorithm>CRC32</ChecksumAlgorithm><ETag>&quot;b357dc928b454965a8dd11716a37dab8&quot;</ETag><Key>hello-world.txt</Key><LastModified>2024-01-29T18:32:24.000Z</LastModified><Size>14</Size><StorageClass>EXPRESS_ONEZONE</StorageClass></Contents></ListBucketResult>\"\n          },\n          \"direction\": \"Response\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 1,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Response\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 2,\n      \"action\": {\n        \"Request\": {\n          \"request\": {\n            \"uri\": \"https://regular-test-bucket.s3.us-west-2.amazonaws.com/?list-type=2\",\n            \"headers\": {\n              \"x-amz-content-sha256\": [\n                \"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\"\n              ],\n              \"x-amz-user-agent\": [\n                \"aws-sdk-rust/0.123.test api/test-service/0.123 os/windows/XPSP3 lang/rust/1.50.0\"\n              ],\n              \"authorization\": [\n                \"AWS4-HMAC-SHA256 Credential=ANOTREAL/20090213/us-west-2/s3/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date;x-amz-user-agent, Signature=28c4fed28f2d3ee6780b5ce36a052becdb4257e910a991467eb947aad3d7ea81\"\n              ],\n              \"amz-sdk-request\": [\n                \"attempt=1; max=3\"\n              ],\n              \"x-amz-date\": [\n                \"20090213T233130Z\"\n              ],\n              \"user-agent\": [\n                \"aws-sdk-rust/0.123.test os/windows/XPSP3 lang/rust/1.50.0\"\n              ]\n            },\n            \"method\": \"GET\"\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 2,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 2,\n      \"action\": {\n        \"Response\": {\n          \"response\": {\n            \"Ok\": {\n              \"status\": 200,\n              \"headers\": {\n                \"x-amz-request-id\": [\n                  \"SCS4NK66GX0KHW8Q\"\n                ],\n                \"content-type\": [\n                  \"application/xml\"\n                ],\n                \"server\": [\n                  \"AmazonS3\"\n                ],\n                \"x-amz-bucket-region\": [\n                  \"us-west-2\"\n                ],\n                \"transfer-encoding\": [\n                  \"chunked\"\n                ],\n                \"x-amz-id-2\": [\n                  \"1TqTeHEvPfLuR0LGMqatChbIYSJm6p0VsCbdOG0HG5q3BsVhYg5RMIOzAGYSF0xBVn+SLpmTkU6m1ARguYLRnA==\"\n                ],\n                \"date\": [\n                  \"Fri, 13 Feb 2009 23:31:30 GMT\"\n                ]\n              }\n            }\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 2,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?>\\n<ListBucketResult xmlns=\\\"http://s3.amazonaws.com/doc/2006-03-01/\\\"><Name>regular-test-bucket</Name><Prefix></Prefix><KeyCount>1</KeyCount><MaxKeys>1000</MaxKeys><IsTruncated>false</IsTruncated><Contents><Key>ferris.png</Key><LastModified>2024-02-01T03:48:28.000Z</LastModified><ETag>&quot;1316cc7c39e43c50c160f0aa8168db41&quot;</ETag><Size>58413</Size><StorageClass>STANDARD</StorageClass></Contents></ListBucketResult>\"\n          },\n          \"direction\": \"Response\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 2,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Response\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 3,\n      \"action\": {\n        \"Request\": {\n          \"request\": {\n            \"uri\": \"https://s3express-test-bucket-2--usw2-az3--x-s3.s3express-usw2-az3.us-west-2.amazonaws.com/?session\",\n            \"headers\": {\n              \"amz-sdk-request\": [\n                \"attempt=1; max=3\"\n              ],\n              \"user-agent\": [\n                \"aws-sdk-rust/0.123.test os/windows/XPSP3 lang/rust/1.50.0\"\n              ],\n              \"x-amz-user-agent\": [\n                \"aws-sdk-rust/0.123.test api/test-service/0.123 os/windows/XPSP3 lang/rust/1.50.0\"\n              ],\n              \"x-amz-date\": [\n                \"20090213T233130Z\"\n              ],\n              \"authorization\": [\n                \"AWS4-HMAC-SHA256 Credential=ANOTREAL/20090213/us-west-2/s3express/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date;x-amz-user-agent, Signature=44d20d3ee77ea1d7d0dd871e27b862b48803e1810ac4ae4debed958ceef3af4e\"\n              ],\n              \"x-amz-content-sha256\": [\n                \"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\"\n              ]\n            },\n            \"method\": \"GET\"\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 3,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 3,\n      \"action\": {\n        \"Response\": {\n          \"response\": {\n            \"Ok\": {\n              \"status\": 200,\n              \"headers\": {\n                \"server\": [\n                  \"AmazonS3\"\n                ],\n                \"content-type\": [\n                  \"application/xml\"\n                ],\n                \"x-amz-request-id\": [\n                  \"0033eada6b00018d62cbc0e3050ad61d5828bce1\"\n                ],\n                \"content-length\": [\n                  \"333\"\n                ],\n                \"date\": [\n                  \"Fri, 13 Feb 2009 23:31:30 GMT\"\n                ],\n                \"x-amz-id-2\": [\n                  \"bL6uF0sLOL\"\n                ]\n              }\n            }\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 3,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?>\\n<CreateSessionResult xmlns=\\\"http://s3.amazonaws.com/doc/2006-03-01/\\\"><Credentials><SessionToken>TESTSESSIONTOKEN</SessionToken><SecretAccessKey>TESTSECRETKEY</SecretAccessKey><AccessKeyId>ASIARTESTID</AccessKeyId><Expiration>2024-01-29T18:53:01Z</Expiration></Credentials></CreateSessionResult>\"\n          },\n          \"direction\": \"Response\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 3,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Response\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 4,\n      \"action\": {\n        \"Request\": {\n          \"request\": {\n            \"uri\": \"https://s3express-test-bucket-2--usw2-az3--x-s3.s3express-usw2-az3.us-west-2.amazonaws.com/?list-type=2\",\n            \"headers\": {\n              \"authorization\": [\n                \"AWS4-HMAC-SHA256 Credential=ASIARTESTID/20090213/us-west-2/s3express/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date;x-amz-s3session-token;x-amz-user-agent, Signature=53848e132e259d7dbc06eb3063d5a32a243525f4fbf2cd015d45ff03f354d6f1\"\n              ],\n              \"x-amz-content-sha256\": [\n                \"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\"\n              ],\n              \"x-amz-user-agent\": [\n                \"aws-sdk-rust/0.123.test api/test-service/0.123 os/windows/XPSP3 lang/rust/1.50.0\"\n              ],\n              \"user-agent\": [\n                \"aws-sdk-rust/0.123.test os/windows/XPSP3 lang/rust/1.50.0\"\n              ],\n              \"x-amz-date\": [\n                \"20090213T233130Z\"\n              ],\n              \"amz-sdk-request\": [\n                \"attempt=1; max=3\"\n              ],\n              \"x-amz-s3session-token\": [\n                \"TESTSESSIONTOKEN\"\n              ]\n            },\n            \"method\": \"GET\"\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 4,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 4,\n      \"action\": {\n        \"Response\": {\n          \"response\": {\n            \"Ok\": {\n              \"status\": 200,\n              \"headers\": {\n                \"x-amz-request-id\": [\n                  \"0033eada6b00018d62cbc175050a70195c6f02fc\"\n                ],\n                \"content-length\": [\n                  \"517\"\n                ],\n                \"x-amz-id-2\": [\n                  \"PrnjEZSu97xW\"\n                ],\n                \"server\": [\n                  \"AmazonS3\"\n                ],\n                \"x-amz-bucket-region\": [\n                  \"us-west-2\"\n                ],\n                \"content-type\": [\n                  \"application/xml\"\n                ],\n                \"date\": [\n                  \"Fri, 13 Feb 2009 23:31:30 GMT\"\n                ]\n              }\n            }\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 4,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?>\\n<ListBucketResult xmlns=\\\"http://s3.amazonaws.com/doc/2006-03-01/\\\"><Name>s3express-test-bucket-2--usw2-az3--x-s3</Name><Prefix/><KeyCount>1</KeyCount><MaxKeys>1000</MaxKeys><IsTruncated>false</IsTruncated><Contents><ChecksumAlgorithm>CRC32</ChecksumAlgorithm><ETag>&quot;278b621d9c444360b3614a78cf1a64d1&quot;</ETag><Key>foobar.txt</Key><LastModified>2024-02-01T03:32:07.000Z</LastModified><Size>10</Size><StorageClass>EXPRESS_ONEZONE</StorageClass></Contents></ListBucketResult>\"\n          },\n          \"direction\": \"Response\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 4,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Response\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 5,\n      \"action\": {\n        \"Request\": {\n          \"request\": {\n            \"uri\": \"https://s3express-test-bucket--usw2-az1--x-s3.s3express-usw2-az1.us-west-2.amazonaws.com/?list-type=2\",\n            \"headers\": {\n              \"x-amz-user-agent\": [\n                \"aws-sdk-rust/0.123.test api/test-service/0.123 os/windows/XPSP3 lang/rust/1.50.0\"\n              ],\n              \"x-amz-date\": [\n                \"20090213T233130Z\"\n              ],\n              \"x-amz-content-sha256\": [\n                \"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\"\n              ],\n              \"user-agent\": [\n                \"aws-sdk-rust/0.123.test os/windows/XPSP3 lang/rust/1.50.0\"\n              ],\n              \"x-amz-s3session-token\": [\n                \"TESTSESSIONTOKEN\"\n              ],\n              \"amz-sdk-request\": [\n                \"attempt=1; max=3\"\n              ],\n              \"authorization\": [\n                \"AWS4-HMAC-SHA256 Credential=ASIARTESTID/20090213/us-west-2/s3express/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date;x-amz-s3session-token;x-amz-user-agent, Signature=d1765aa7ec005607ba94fdda08c6739228d5ee14eb8316e80264c35649661a19\"\n              ]\n            },\n            \"method\": \"GET\"\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 5,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 5,\n      \"action\": {\n        \"Response\": {\n          \"response\": {\n            \"Ok\": {\n              \"status\": 200,\n              \"headers\": {\n                \"x-amz-id-2\": [\n                  \"LX0peO7j\"\n                ],\n                \"x-amz-request-id\": [\n                  \"0033eada6b00018d62cbc1cd0509f0c8b6f330e7\"\n                ],\n                \"server\": [\n                  \"AmazonS3\"\n                ],\n                \"x-amz-bucket-region\": [\n                  \"us-west-2\"\n                ],\n                \"date\": [\n                  \"Fri, 13 Feb 2009 23:31:30 GMT\"\n                ],\n                \"content-type\": [\n                  \"application/xml\"\n                ],\n                \"content-length\": [\n                  \"520\"\n                ]\n              }\n            }\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 5,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?>\\n<ListBucketResult xmlns=\\\"http://s3.amazonaws.com/doc/2006-03-01/\\\"><Name>s3express-test-bucket--usw2-az1--x-s3</Name><Prefix/><KeyCount>1</KeyCount><MaxKeys>1000</MaxKeys><IsTruncated>false</IsTruncated><Contents><ChecksumAlgorithm>CRC32</ChecksumAlgorithm><ETag>&quot;b357dc928b454965a8dd11716a37dab8&quot;</ETag><Key>hello-world.txt</Key><LastModified>2024-01-29T18:32:24.000Z</LastModified><Size>14</Size><StorageClass>EXPRESS_ONEZONE</StorageClass></Contents></ListBucketResult>\"\n          },\n          \"direction\": \"Response\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 5,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Response\"\n        }\n      }\n    }\n  ],\n  \"docs\": \"traffic recording of listing objects in both an S3 Express One Zone bucket and a regular S3 bucket\",\n  \"version\": \"V0\"\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/s3/tests/data/no_auth/get-object.json",
    "content": "{\n  \"events\": [\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Request\": {\n          \"request\": {\n            \"uri\": \"https://gdc-organoid-pancreatic-phs001611-2-open.s3.us-east-1.amazonaws.com/0431cddc-a418-4a79-a34d-6c041394e8e4/a6ddcc84-8e4d-4c68-885c-2d51168eec97.FPKM-UQ.txt.gz?x-id=GetObject\",\n            \"headers\": {\n              \"amz-sdk-request\": [\n                \"attempt=1; max=3\"\n              ],\n              \"user-agent\": [\n                \"aws-sdk-rust/0.123.test os/windows/XPSP3 lang/rust/1.50.0\"\n              ],\n              \"x-amz-user-agent\": [\n                \"aws-sdk-rust/0.123.test api/test-service/0.123 os/windows/XPSP3 lang/rust/1.50.0\"\n              ]\n            },\n            \"method\": \"GET\"\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Response\": {\n          \"response\": {\n            \"Ok\": {\n              \"status\": 200,\n              \"version\": \"HTTP/1.1\",\n              \"headers\": {\n                \"content-type\": [\n                  \"binary/octet-stream\"\n                ],\n                \"x-amz-id-2\": [\n                  \"mO5q2ZSztYdEU923Zi5sHNctHwRRzOyngQEWsZWHwOJEgxrj9dw0KH0IVovTxu2Y8V0ps5z4KMQ=\"\n                ],\n                \"content-length\": [\n                  \"386910\"\n                ],\n                \"accept-ranges\": [\n                  \"bytes\"\n                ],\n                \"x-amz-server-side-encryption\": [\n                  \"AES256\"\n                ],\n                \"x-amz-request-id\": [\n                  \"EGGB3A7GXR9YWDYM\"\n                ],\n                \"last-modified\": [\n                  \"Mon, 27 Jan 2020 20:56:51 GMT\"\n                ],\n                \"date\": [\n                  \"Mon, 07 Aug 2023 20:44:42 GMT\"\n                ],\n                \"x-amz-meta-description\": [\n                  \"{\\\"url\\\": \\\"s3://cleversafe.service.consul/stage-submission-5/ORGANOID-PANCREATIC/0431cddc-a418-4a79-a34d-6c041394e8e4/a6ddcc84-8e4d-4c68-885c-2d51168eec97.FPKM-UQ.txt.gz\\\", \\\"node_id\\\": \\\"0431cddc-a418-4a79-a34d-6c041394e8e4/a6ddcc84-8e4d-4c68-885c-2d51168eec97.FPKM-UQ.txt.gz\\\"}\"\n                ],\n                \"server\": [\n                  \"AmazonS3\"\n                ],\n                \"etag\": [\n                  \"\\\"446fc665f99183cd0540d7656a79d3ed\\\"\"\n                ]\n              }\n            }\n          }\n        }\n      }\n    }\n  ],\n  \"docs\": \"traffic recording of optional auth (no Authorization header is included)\",\n  \"version\": \"V0\"\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/s3/tests/data/no_auth/head-object.json",
    "content": "{\n  \"events\": [\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Request\": {\n          \"request\": {\n            \"uri\": \"https://gdc-organoid-pancreatic-phs001611-2-open.s3.us-east-1.amazonaws.com/0431cddc-a418-4a79-a34d-6c041394e8e4/a6ddcc84-8e4d-4c68-885c-2d51168eec97.FPKM-UQ.txt.gz\",\n            \"headers\": {\n              \"user-agent\": [\n                \"aws-sdk-rust/0.123.test os/windows/XPSP3 lang/rust/1.50.0\"\n              ],\n              \"amz-sdk-request\": [\n                \"attempt=1; max=3\"\n              ],\n              \"x-amz-user-agent\": [\n                \"aws-sdk-rust/0.123.test api/test-service/0.123 os/windows/XPSP3 lang/rust/1.50.0\"\n              ]\n            },\n            \"method\": \"HEAD\"\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Response\": {\n          \"response\": {\n            \"Ok\": {\n              \"status\": 200,\n              \"version\": \"HTTP/1.1\",\n              \"headers\": {\n                \"last-modified\": [\n                  \"Mon, 27 Jan 2020 20:56:51 GMT\"\n                ],\n                \"content-type\": [\n                  \"binary/octet-stream\"\n                ],\n                \"date\": [\n                  \"Mon, 07 Aug 2023 20:44:42 GMT\"\n                ],\n                \"server\": [\n                  \"AmazonS3\"\n                ],\n                \"accept-ranges\": [\n                  \"bytes\"\n                ],\n                \"x-amz-server-side-encryption\": [\n                  \"AES256\"\n                ],\n                \"x-amz-id-2\": [\n                  \"+d6tSM3krTTrvY+y6PFHnkw9OhAtJhQy8RzFrPO6vnUOIuvqViB9gFZvfJCcVMj7gX+dpIvZ3HI=\"\n                ],\n                \"x-amz-request-id\": [\n                  \"EGGF3G9KFMFHZ3E0\"\n                ],\n                \"etag\": [\n                  \"\\\"446fc665f99183cd0540d7656a79d3ed\\\"\"\n                ],\n                \"x-amz-meta-description\": [\n                  \"{\\\"url\\\": \\\"s3://cleversafe.service.consul/stage-submission-5/ORGANOID-PANCREATIC/0431cddc-a418-4a79-a34d-6c041394e8e4/a6ddcc84-8e4d-4c68-885c-2d51168eec97.FPKM-UQ.txt.gz\\\", \\\"node_id\\\": \\\"0431cddc-a418-4a79-a34d-6c041394e8e4/a6ddcc84-8e4d-4c68-885c-2d51168eec97.FPKM-UQ.txt.gz\\\"}\"\n                ]\n              }\n            }\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Response\"\n        }\n      }\n    }\n  ],\n  \"docs\": \"traffic recording of optional auth (no Authorization header is included)\",\n  \"version\": \"V0\"\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/s3/tests/data/no_auth/list-objects-v2.json",
    "content": "{\n  \"events\": [\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Request\": {\n          \"request\": {\n            \"uri\": \"https://gdc-organoid-pancreatic-phs001611-2-open.s3.us-east-1.amazonaws.com/?list-type=2&max-keys=3\",\n            \"headers\": {\n              \"amz-sdk-request\": [\n                \"attempt=1; max=3\"\n              ],\n              \"x-amz-user-agent\": [\n                \"aws-sdk-rust/0.123.test api/test-service/0.123 os/windows/XPSP3 lang/rust/1.50.0\"\n              ],\n              \"user-agent\": [\n                \"aws-sdk-rust/0.123.test os/windows/XPSP3 lang/rust/1.50.0\"\n              ]\n            },\n            \"method\": \"GET\"\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Response\": {\n          \"response\": {\n            \"Ok\": {\n              \"status\": 200,\n              \"version\": \"HTTP/1.1\",\n              \"headers\": {\n                \"x-amz-id-2\": [\n                  \"InRlbSiDTNSjIiYuGbkpnrz0TIgFVsDu8bnzVwF2UvZiOuiwhvdA3oltBT1ILZqNyFzSIkShTKk=\"\n                ],\n                \"x-amz-request-id\": [\n                  \"H8T96AN5TTDT3SSQ\"\n                ],\n                \"server\": [\n                  \"AmazonS3\"\n                ],\n                \"x-amz-bucket-region\": [\n                  \"us-east-1\"\n                ],\n                \"date\": [\n                  \"Mon, 07 Aug 2023 20:44:41 GMT\"\n                ],\n                \"content-type\": [\n                  \"application/xml\"\n                ],\n                \"transfer-encoding\": [\n                  \"chunked\"\n                ]\n              }\n            }\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?>\\n<ListBucketResult xmlns=\\\"http://s3.amazonaws.com/doc/2006-03-01/\\\"><Name>gdc-organoid-pancreatic-phs001611-2-open</Name><Prefix></Prefix><NextContinuationToken>1SL9nYFaimMAwnR9dJnF4M5NMfm3Em6/ClPUVLEH3GOSw5yjeI+wCBLj3THB8DuJSUFhKNy5cGK5QBb/SvE+MKMZurarr0ZhOhQae2SQ8B4QQPkqQHKp9MeJXsYe4UH8/okpqJUZNS2AQt7gXrz7mFdIJXPuSckj02e06tvxZAOkHu7ER4xTJ+odI774K2xB+pcD3H0pqTUt+TebzB83BzA==</NextContinuationToken><KeyCount>3</KeyCount><MaxKeys>3</MaxKeys><IsTruncated>true</IsTruncated><Contents><Key>0431cddc-a418-4a79-a34d-6c041394e8e4/a6ddcc84-8e4d-4c68-885c-2d51168eec97.FPKM-UQ.txt.gz</Key><LastModified>2020-01-27T20:56:51.000Z</LastModified><ETag>&quot;446fc665f99183cd0540d7656a79d3ed&quot;</ETag><Size>386910</Size><StorageClass>STANDARD</StorageClass></Contents><Contents><Key>04a0a508-459a-4758-ac40-c3e8cb966683/30520ecd-c6bd-4039-9b1a-d3f999235598.FPKM-UQ.txt.gz</Key><LastModified>2020-01-27T20:56:50.000Z</LastModified><ETag>&quot;a2c6997aa0c6a9fd697af3e0517d96be&quot;</ETag><Size>388349</Size><StorageClass>STANDARD</StorageClass></Contents><Contents><Key>0541851c-ac0c-496e-93d2-3c03921fa6bd/c92f3dc4-24ea-457b-b90a-d6d599b14a73.rna_seq.star_gene_counts.tsv.gz</Key><LastModified>2020-01-27T20:56:51.000Z</LastModified><ETag>&quot;f2c4e159c9b2f4233c4c0c27f4c25472&quot;</ETag><Size>396626</Size><StorageClass>STANDARD</StorageClass></Contents></ListBucketResult>\"\n          },\n          \"direction\": \"Response\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Response\"\n        }\n      }\n    }\n  ],\n  \"docs\": \"traffic recording of optional auth (no Authorization header is included)\",\n  \"version\": \"V0\"\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/s3/tests/data/no_auth/list-objects.json",
    "content": "{\n  \"events\": [\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Request\": {\n          \"request\": {\n            \"uri\": \"https://gdc-organoid-pancreatic-phs001611-2-open.s3.us-east-1.amazonaws.com/?max-keys=3\",\n            \"headers\": {\n              \"x-amz-user-agent\": [\n                \"aws-sdk-rust/0.123.test api/test-service/0.123 os/windows/XPSP3 lang/rust/1.50.0\"\n              ],\n              \"amz-sdk-request\": [\n                \"attempt=1; max=3\"\n              ],\n              \"user-agent\": [\n                \"aws-sdk-rust/0.123.test os/windows/XPSP3 lang/rust/1.50.0\"\n              ]\n            },\n            \"method\": \"GET\"\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Response\": {\n          \"response\": {\n            \"Ok\": {\n              \"status\": 200,\n              \"version\": \"HTTP/1.1\",\n              \"headers\": {\n                \"transfer-encoding\": [\n                  \"chunked\"\n                ],\n                \"server\": [\n                  \"AmazonS3\"\n                ],\n                \"x-amz-id-2\": [\n                  \"9/ufVv0fY5POrsdgAV2QMGmmpa78fx0YlL5KkQHzg46B0/NAWr/l0YsmR/F2HPn8ByFIwO5NdFs=\"\n                ],\n                \"x-amz-bucket-region\": [\n                  \"us-east-1\"\n                ],\n                \"date\": [\n                  \"Mon, 07 Aug 2023 20:44:40 GMT\"\n                ],\n                \"x-amz-request-id\": [\n                  \"QJE4M4NA5KFKN6YA\"\n                ],\n                \"content-type\": [\n                  \"application/xml\"\n                ]\n              }\n            }\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?>\\n<ListBucketResult xmlns=\\\"http://s3.amazonaws.com/doc/2006-03-01/\\\"><Name>gdc-organoid-pancreatic-phs001611-2-open</Name><Prefix></Prefix><Marker></Marker><MaxKeys>3</MaxKeys><IsTruncated>true</IsTruncated><Contents><Key>0431cddc-a418-4a79-a34d-6c041394e8e4/a6ddcc84-8e4d-4c68-885c-2d51168eec97.FPKM-UQ.txt.gz</Key><LastModified>2020-01-27T20:56:51.000Z</LastModified><ETag>&quot;446fc665f99183cd0540d7656a79d3ed&quot;</ETag><Size>386910</Size><Owner><ID>118c9f5f9e6a1a31d2f3be2a5e3aea8b3075cdc9dfbb29978656b42b7cad1c08</ID><DisplayName>dcfopen-buckets</DisplayName></Owner><StorageClass>STANDARD</StorageClass></Contents><Contents><Key>04a0a508-459a-4758-ac40-c3e8cb966683/30520ecd-c6bd-4039-9b1a-d3f999235598.FPKM-UQ.txt.gz</Key><LastModified>2020-01-27T20:56:50.000Z</LastModified><ETag>&quot;a2c6997aa0c6a9fd697af3e0517d96be&quot;</ETag><Size>388349</Size><Owner><ID>118c9f5f9e6a1a31d2f3be2a5e3aea8b3075cdc9dfbb29978656b42b7cad1c08</ID><DisplayName>dcfopen-buckets</DisplayName></Owner><StorageClass>STANDARD</StorageClass></Contents><Contents><Key>0541851c-ac0c-496e-93d2-3c03921fa6bd/c92f3dc4-24ea-457b-b90a-d6d599b14a73.rna_seq.star_gene_counts.tsv.gz</Key><LastModified>2020-01-27T20:56:51.000Z</LastModified><ETag>&quot;f2c4e159c9b2f4233c4c0c27f4c25472&quot;</ETag><Size>396626</Size><Owner><ID>118c9f5f9e6a1a31d2f3be2a5e3aea8b3075cdc9dfbb29978656b42b7cad1c08</ID><DisplayName>dcfopen-buckets</DisplayName></Owner><StorageClass>STANDARD</StorageClass></Contents></ListBucketResult>\"\n          },\n          \"direction\": \"Response\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Response\"\n        }\n      }\n    }\n  ],\n  \"docs\": \"traffic recording of optional auth (no Authorization header is included)\",\n  \"version\": \"V0\"\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/s3/tests/data/request-information-headers/slow-network-and-late-client-clock.json",
    "content": "{\n  \"events\": [\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Request\": {\n          \"request\": {\n            \"uri\": \"https://test-bucket.s3.us-east-1.amazonaws.com/?list-type=2&prefix=prefix~\",\n            \"headers\": {\n              \"x-amz-security-token\": [\n                \"notarealsessiontoken\"\n              ],\n              \"authorization\": [\n                \"AWS4-HMAC-SHA256 Credential=ANOTREAL/20210618/us-east-1/s3/aws4_request, SignedHeaders=amz-sdk-invocation-id;host;x-amz-content-sha256;x-amz-date;x-amz-security-token;x-amz-user-agent, Signature=e7eccf4e792113f5f17a50bfd8f1719479e89ba0b476894e6f3dba030dc87f82\"\n              ],\n              \"x-amz-user-agent\": [\n                \"aws-sdk-rust/0.123.test api/test-service/0.123 os/windows/XPSP3 lang/rust/1.50.0\"\n              ],\n              \"x-amz-date\": [\n                \"20210618T170728Z\"\n              ],\n              \"x-amz-content-sha256\": [\n                \"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\"\n              ],\n              \"amz-sdk-invocation-id\": [\n                \"00000000-0000-4000-8000-000000000000\"\n              ],\n              \"user-agent\": [\n                \"aws-sdk-rust/0.123.test os/windows/XPSP3 lang/rust/1.50.0\"\n              ]\n            },\n            \"method\": \"GET\"\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Response\": {\n          \"response\": {\n            \"Ok\": {\n              \"status\": 200,\n              \"version\": \"HTTP/1.1\",\n              \"headers\": {\n                \"x-amz-request-id\": [\n                  \"9X5E7C9EAB6AQEP2\"\n                ],\n                \"x-amz-id-2\": [\n                  \"gZsrBxajPyo1Q0DE2plGf7T6kAnxd4Xx7/S+8lq18GegL6kFbnVXLLh1LnBzpEpFiHN9XoNHkeA=\"\n                ],\n                \"content-type\": [\n                  \"application/xml\"\n                ],\n                \"transfer-encoding\": [\n                  \"chunked\"\n                ],\n                \"server\": [\n                  \"AmazonS3\"\n                ],\n                \"date\": [\n                  \"Wed, 26 Apr 2023 14:00:24 GMT\"\n                ],\n                \"x-amz-bucket-region\": [\n                  \"us-east-1\"\n                ]\n              }\n            }\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?>\\n<ListBucketResult>\\n    <Name>test-bucket</Name>\\n    <Prefix>prefix~</Prefix>\\n    <KeyCount>1</KeyCount>\\n    <MaxKeys>1000</MaxKeys>\\n    <IsTruncated>false</IsTruncated>\\n    <Contents>\\n        <Key>some-file.file</Key>\\n        <LastModified>2009-10-12T17:50:30.000Z</LastModified>\\n        <Size>434234</Size>\\n        <StorageClass>STANDARD</StorageClass>\\n    </Contents>\\n</ListBucketResult>\"\n          },\n          \"direction\": \"Response\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Response\"\n        }\n      }\n    }\n  ],\n  \"docs\": \"One SDK operation invocation. Client retries 3 times, successful response on 3rd attempt. Slow network, one way latency is 2 seconds. Server takes 1 second to generate response. Client clock is 10 minutes behind server clock. One second delay between retries.\",\n  \"version\": \"V0\"\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/s3/tests/data/request-information-headers/three-retries_and-then-success.json",
    "content": "{\n  \"events\": [\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Request\": {\n          \"request\": {\n            \"uri\": \"https://test-bucket.s3.us-east-1.amazonaws.com/?list-type=2&prefix=prefix~\",\n            \"headers\": {\n              \"x-amz-security-token\": [\n                \"notarealsessiontoken\"\n              ],\n              \"authorization\": [\n                \"AWS4-HMAC-SHA256 Credential=ANOTREAL/20190601/us-east-1/s3/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date;x-amz-security-token;x-amz-user-agent, Signature=43970cfd0324cb28a86459789b7a1c7684cf54b0b3c9842a84f3b24343fa038a\"\n              ],\n              \"x-amz-user-agent\": [\n                \"aws-sdk-rust/0.123.test api/test-service/0.123 os/windows/XPSP3 lang/rust/1.50.0\"\n              ],\n              \"x-amz-date\": [\n                \"20190601T000000Z\"\n              ],\n              \"x-amz-content-sha256\": [\n                \"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\"\n              ],\n              \"amz-sdk-invocation-id\": [\n                \"00000000-0000-4000-8000-000000000000\"\n              ],\n              \"amz-sdk-request\": [\n                \"attempt=1; max=3\"\n              ],\n              \"user-agent\": [\n                \"aws-sdk-rust/0.123.test os/windows/XPSP3 lang/rust/1.50.0\"\n              ]\n            },\n            \"method\": \"GET\"\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Response\": {\n          \"response\": {\n            \"Ok\": {\n              \"status\": 500,\n              \"version\": \"HTTP/1.1\",\n              \"headers\": {\n                \"x-amz-request-id\": [\n                  \"foo-id\"\n                ],\n                \"x-amz-id-2\": [\n                  \"foo-id\"\n                ],\n                \"content-type\": [\n                  \"application/xml\"\n                ],\n                \"transfer-encoding\": [\n                  \"chunked\"\n                ],\n                \"server\": [\n                  \"AmazonS3\"\n                ],\n                \"date\": [\n                  \"Sat, 01 Jun 2019 00:00:00 GMT\"\n                ]\n              }\n            }\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?>\\n    <Error>\\n    <Type>Server</Type>\\n    <Code>InternalError</Code>\\n    <Message>We encountered an internal error. Please try again.</Message>\\n    <RequestId>foo-id</RequestId>\\n</Error>\"\n          },\n          \"direction\": \"Response\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Response\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 1,\n      \"action\": {\n        \"Request\": {\n          \"request\": {\n            \"uri\": \"https://test-bucket.s3.us-east-1.amazonaws.com/?list-type=2&prefix=prefix~\",\n            \"headers\": {\n              \"x-amz-security-token\": [\n                \"notarealsessiontoken\"\n              ],\n              \"authorization\": [\n                \"AWS4-HMAC-SHA256 Credential=ANOTREAL/20190601/us-east-1/s3/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date;x-amz-security-token;x-amz-user-agent, Signature=6d0f0da831a7d3ad1bde4e98580177bc0ef0acc21064dd26394006006392cb14\"\n              ],\n              \"x-amz-user-agent\": [\n                \"aws-sdk-rust/0.123.test api/test-service/0.123 os/windows/XPSP3 lang/rust/1.50.0\"\n              ],\n              \"x-amz-date\": [\n                \"20190601T000001Z\"\n              ],\n              \"x-amz-content-sha256\": [\n                \"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\"\n              ],\n              \"amz-sdk-invocation-id\": [\n                \"00000000-0000-4000-8000-000000000000\"\n              ],\n              \"amz-sdk-request\": [\n                \"ttl=20190601T000011Z; attempt=2; max=3\"\n              ],\n              \"user-agent\": [\n                \"aws-sdk-rust/0.123.test os/windows/XPSP3 lang/rust/1.50.0\"\n              ]\n            },\n            \"method\": \"GET\"\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 1,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 1,\n      \"action\": {\n        \"Response\": {\n          \"response\": {\n            \"Ok\": {\n              \"status\": 500,\n              \"version\": \"HTTP/1.1\",\n              \"headers\": {\n                \"x-amz-request-id\": [\n                  \"foo-id\"\n                ],\n                \"x-amz-id-2\": [\n                  \"foo-id\"\n                ],\n                \"content-type\": [\n                  \"application/xml\"\n                ],\n                \"transfer-encoding\": [\n                  \"chunked\"\n                ],\n                \"server\": [\n                  \"AmazonS3\"\n                ],\n                \"date\": [\n                  \"Sat, 01 Jun 2019 00:00:01 GMT\"\n                ]\n              }\n            }\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 1,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?>\\n    <Error>\\n    <Type>Server</Type>\\n    <Code>InternalError</Code>\\n    <Message>We encountered an internal error. Please try again.</Message>\\n    <RequestId>foo-id</RequestId>\\n</Error>\"\n          },\n          \"direction\": \"Response\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 1,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Response\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 2,\n      \"action\": {\n        \"Request\": {\n          \"request\": {\n            \"uri\": \"https://test-bucket.s3.us-east-1.amazonaws.com/?list-type=2&prefix=prefix~\",\n            \"headers\": {\n              \"x-amz-security-token\": [\n                \"notarealsessiontoken\"\n              ],\n              \"authorization\": [\n                \"AWS4-HMAC-SHA256 Credential=ANOTREAL/20190601/us-east-1/s3/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date;x-amz-security-token;x-amz-user-agent, Signature=8160b1d1200c10cde681ac6f4490c98023af9c4b3b8fd8a82e7560f87c126a53\"\n              ],\n              \"x-amz-user-agent\": [\n                \"aws-sdk-rust/0.123.test api/test-service/0.123 os/windows/XPSP3 lang/rust/1.50.0\"\n              ],\n              \"x-amz-date\": [\n                \"20190601T000002Z\"\n              ],\n              \"x-amz-content-sha256\": [\n                \"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\"\n              ],\n              \"amz-sdk-invocation-id\": [\n                \"00000000-0000-4000-8000-000000000000\"\n              ],\n              \"amz-sdk-request\": [\n                \"ttl=20190601T000012Z; attempt=3; max=3\"\n              ],\n              \"user-agent\": [\n                \"aws-sdk-rust/0.123.test os/windows/XPSP3 lang/rust/1.50.0\"\n              ]\n            },\n            \"method\": \"GET\"\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 2,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 2,\n      \"action\": {\n        \"Response\": {\n          \"response\": {\n            \"Ok\": {\n              \"status\": 200,\n              \"version\": \"HTTP/1.1\",\n              \"headers\": {\n                \"x-amz-request-id\": [\n                  \"9X5E7C9EAB6AQEP2\"\n                ],\n                \"x-amz-id-2\": [\n                  \"gZsrBxajPyo1Q0DE2plGf7T6kAnxd4Xx7/S+8lq18GegL6kFbnVXLLh1LnBzpEpFiHN9XoNHkeA=\"\n                ],\n                \"content-type\": [\n                  \"application/xml\"\n                ],\n                \"transfer-encoding\": [\n                  \"chunked\"\n                ],\n                \"server\": [\n                  \"AmazonS3\"\n                ],\n                \"date\": [\n                  \"Sat, 01 Jun 2019 00:00:02 GMT\"\n                ],\n                \"x-amz-bucket-region\": [\n                  \"us-east-1\"\n                ]\n              }\n            }\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 2,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?>\\n<ListBucketResult>\\n    <Name>test-bucket</Name>\\n    <Prefix>prefix~</Prefix>\\n    <KeyCount>1</KeyCount>\\n    <MaxKeys>1000</MaxKeys>\\n    <IsTruncated>false</IsTruncated>\\n    <Contents>\\n        <Key>some-file.file</Key>\\n        <LastModified>2009-10-12T17:50:30.000Z</LastModified>\\n        <Size>434234</Size>\\n        <StorageClass>STANDARD</StorageClass>\\n    </Contents>\\n</ListBucketResult>\"\n          },\n          \"direction\": \"Response\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 2,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Response\"\n        }\n      }\n    }\n  ],\n  \"docs\": \"One SDK operation invocation. Client retries 3 times, successful response on 3rd attempt. Fast network, latency + server time is less than one second. No clock skew. Client waits 1 second between retry attempts.\",\n  \"version\": \"V0\"\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/s3/tests/data/request-information-headers/three-successful-attempts.json",
    "content": "{\n  \"events\": [\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Request\": {\n          \"request\": {\n            \"uri\": \"https://test-bucket.s3.us-east-1.amazonaws.com/?list-type=2&prefix=prefix~\",\n            \"headers\": {\n              \"x-amz-security-token\": [\n                \"notarealsessiontoken\"\n              ],\n              \"authorization\": [\n                \"AWS4-HMAC-SHA256 Credential=ANOTREAL/20210618/us-east-1/s3/aws4_request, SignedHeaders=amz-sdk-invocation-id;host;x-amz-content-sha256;x-amz-date;x-amz-security-token;x-amz-user-agent, Signature=e7eccf4e792113f5f17a50bfd8f1719479e89ba0b476894e6f3dba030dc87f82\"\n              ],\n              \"x-amz-user-agent\": [\n                \"aws-sdk-rust/0.123.test api/test-service/0.123 os/windows/XPSP3 lang/rust/1.50.0\"\n              ],\n              \"x-amz-date\": [\n                \"20210618T170728Z\"\n              ],\n              \"x-amz-content-sha256\": [\n                \"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\"\n              ],\n              \"amz-sdk-invocation-id\": [\n                \"00000000-0000-4000-8000-000000000000\"\n              ],\n              \"user-agent\": [\n                \"aws-sdk-rust/0.123.test os/windows/XPSP3 lang/rust/1.50.0\"\n              ]\n            },\n            \"method\": \"GET\"\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Response\": {\n          \"response\": {\n            \"Ok\": {\n              \"status\": 200,\n              \"version\": \"HTTP/1.1\",\n              \"headers\": {\n                \"x-amz-request-id\": [\n                  \"9X5E7C9EAB6AQEP2\"\n                ],\n                \"x-amz-id-2\": [\n                  \"gZsrBxajPyo1Q0DE2plGf7T6kAnxd4Xx7/S+8lq18GegL6kFbnVXLLh1LnBzpEpFiHN9XoNHkeA=\"\n                ],\n                \"content-type\": [\n                  \"application/xml\"\n                ],\n                \"transfer-encoding\": [\n                  \"chunked\"\n                ],\n                \"server\": [\n                  \"AmazonS3\"\n                ],\n                \"date\": [\n                  \"Wed, 26 Apr 2023 14:00:24 GMT\"\n                ],\n                \"x-amz-bucket-region\": [\n                  \"us-east-1\"\n                ]\n              }\n            }\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?>\\n<ListBucketResult>\\n    <Name>test-bucket</Name>\\n    <Prefix>prefix~</Prefix>\\n    <KeyCount>1</KeyCount>\\n    <MaxKeys>1000</MaxKeys>\\n    <IsTruncated>false</IsTruncated>\\n    <Contents>\\n        <Key>some-file.file</Key>\\n        <LastModified>2009-10-12T17:50:30.000Z</LastModified>\\n        <Size>434234</Size>\\n        <StorageClass>STANDARD</StorageClass>\\n    </Contents>\\n</ListBucketResult>\"\n          },\n          \"direction\": \"Response\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Response\"\n        }\n      }\n    }\n  ],\n  \"docs\": \"Client makes 3 separate SDK operation invocations; All succeed on first attempt. Fast network, latency + server time is less than one second.\",\n  \"version\": \"V0\"\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/s3/tests/endpoints.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n#![cfg(feature = \"test-util\")]\n\nuse aws_credential_types::provider::SharedCredentialsProvider;\nuse aws_sdk_s3::config::Builder;\nuse aws_sdk_s3::config::{Credentials, Region};\nuse aws_sdk_s3::{Client, Config};\nuse aws_smithy_http_client::test_util::{capture_request, CaptureRequestReceiver};\n\nfn test_client(update_builder: fn(Builder) -> Builder) -> (CaptureRequestReceiver, Client) {\n    let (http_client, captured_request) = capture_request(None);\n    let config = Config::builder()\n        .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests()))\n        .region(Region::new(\"us-west-4\"))\n        .http_client(http_client)\n        .behavior_version(aws_sdk_s3::config::BehaviorVersion::latest())\n        .with_test_defaults();\n    let client = Client::from_conf(update_builder(config).build());\n    (captured_request, client)\n}\n\n#[tokio::test]\nasync fn virtual_hosted_buckets() {\n    let (captured_request, client) = test_client(|b| b);\n    let _ = client.list_objects_v2().bucket(\"test-bucket\").send().await;\n    assert_eq!(\n        captured_request.expect_request().uri().to_string(),\n        \"https://test-bucket.s3.us-west-4.amazonaws.com/?list-type=2\"\n    );\n}\n\n#[tokio::test]\nasync fn force_path_style() {\n    let (captured_request, client) = test_client(|b| b.force_path_style(true));\n    let _ = client.list_objects_v2().bucket(\"test-bucket\").send().await;\n    assert_eq!(\n        captured_request.expect_request().uri().to_string(),\n        \"https://s3.us-west-4.amazonaws.com/test-bucket/?list-type=2\"\n    );\n}\n\n#[tokio::test]\nasync fn fips() {\n    let (captured_request, client) = test_client(|b| b.use_fips(true));\n    let _ = client.list_objects_v2().bucket(\"test-bucket\").send().await;\n    assert_eq!(\n        captured_request.expect_request().uri().to_string(),\n        \"https://test-bucket.s3-fips.us-west-4.amazonaws.com/?list-type=2\"\n    );\n}\n\n#[tokio::test]\nasync fn dual_stack() {\n    let (captured_request, client) = test_client(|b| b.use_dual_stack(true));\n    let _ = client.list_objects_v2().bucket(\"test-bucket\").send().await;\n    assert_eq!(\n        captured_request.expect_request().uri().to_string(),\n        \"https://test-bucket.s3.dualstack.us-west-4.amazonaws.com/?list-type=2\"\n    );\n}\n\n#[tokio::test]\nasync fn multi_region_access_points() {\n    let (captured_request, client) = test_client(|b| b);\n    let _ = client\n        .get_object()\n        .bucket(\"arn:aws:s3::123456789012:accesspoint/mfzwi23gnjvgw.mrap\")\n        .key(\"blah\")\n        .send()\n        .await;\n    let captured_request = captured_request.expect_request();\n    assert_eq!(\n        captured_request.uri().to_string(),\n        \"https://mfzwi23gnjvgw.mrap.accesspoint.s3-global.amazonaws.com/blah?x-id=GetObject\"\n    );\n    let auth_header = captured_request.headers().get(\"AUTHORIZATION\").unwrap();\n    // Verifies that the sigv4a signing algorithm was used, that the signing scope doesn't include a region, and that the x-amz-region-set header was signed.\n    let expected_start =\n        \"AWS4-ECDSA-P256-SHA256 Credential=ANOTREAL/20090213/s3/aws4_request, SignedHeaders=host;x-amz-checksum-mode;x-amz-content-sha256;x-amz-date;x-amz-region-set;x-amz-user-agent, Signature=\";\n\n    assert!(\n        auth_header.starts_with(expected_start),\n        \"expected auth header to start with {} but it was {}\",\n        expected_start,\n        auth_header\n    );\n}\n\n#[tokio::test]\nasync fn s3_object_lambda() {\n    let (captured_request, client) = test_client(|b| b);\n    let _ = client\n        .get_object()\n        .bucket(\"arn:aws:s3-object-lambda:us-east-100:123412341234:accesspoint/myolap\")\n        .key(\"s3.txt\")\n        .send()\n        .await\n        .unwrap();\n    let captured_request = captured_request.expect_request();\n    assert_eq!(captured_request.uri().to_string(), \"https://myolap-123412341234.s3-object-lambda.us-east-100.amazonaws.com/s3.txt?x-id=GetObject\");\n    let auth_header = captured_request.headers().get(\"AUTHORIZATION\").unwrap();\n    // verifies that both the signing scope (s3-object-lambda) has been set as well as the ARN region\n    // us-east-100\n    let expected_start =\n        \"AWS4-HMAC-SHA256 Credential=ANOTREAL/20090213/us-east-100/s3-object-lambda/aws4_request\";\n\n    assert!(\n        auth_header.starts_with(expected_start),\n        \"expected auth header to start with {} but it was {}\",\n        expected_start,\n        auth_header\n    );\n}\n\n#[tokio::test]\nasync fn s3_object_lambda_no_cross_region() {\n    let (_, client) = test_client(|b| b.use_arn_region(false));\n    let err = client\n        .get_object()\n        .bucket(\"arn:aws:s3-object-lambda:us-east-1:123412341234:accesspoint/myolap\")\n        .key(\"s3.txt\")\n        .send()\n        .await\n        .expect_err(\"should fail—cross region invalid arn\");\n    assert!(\n        format!(\"{:?}\", err).contains(\n            \"Invalid configuration: region from ARN `us-east-1` \\\n    does not match client region `us-west-4` and UseArnRegion is `false`\"\n        ),\n        \"{}\",\n        err\n    );\n}\n\n#[tokio::test]\nasync fn write_get_object_response() {\n    let (req, client) = test_client(|b| b);\n    let _write = dbg!(\n        client\n            .write_get_object_response()\n            .request_route(\"req-route\")\n            .request_token(\"token\")\n            .status_code(200)\n            .body(vec![1, 2, 3].into())\n            .send()\n            .await\n    );\n\n    let captured_request = req.expect_request();\n    let uri_no_query = captured_request\n        .uri()\n        .splitn(2, '?')\n        .into_iter()\n        .next()\n        .unwrap()\n        .to_string();\n\n    assert_eq!(\n        uri_no_query,\n        \"https://req-route.s3-object-lambda.us-west-4.amazonaws.com/WriteGetObjectResponse\"\n    );\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/s3/tests/expires_interceptor.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n#![cfg(feature = \"test-util\")]\nuse aws_sdk_s3::{config::Region, Client, Config};\nuse aws_smithy_http_client::test_util::{ReplayEvent, StaticReplayClient};\nuse aws_smithy_types::body::SdkBody;\nuse aws_smithy_types::date_time::{DateTime, Format};\n\nfn make_client(expires_val: &str) -> Client {\n    let http_client = StaticReplayClient::new(vec![ReplayEvent::new(\n        http_1x::Request::builder()\n            .uri(http_1x::Uri::from_static(\n                \"https://some-test-bucket.s3.us-east-1.amazonaws.com/test.txt?attributes\",\n            ))\n            .body(SdkBody::empty())\n            .unwrap(),\n        http_1x::Response::builder()\n            .header(\"Expires\", expires_val)\n            .status(200)\n            .body(SdkBody::empty())\n            .unwrap(),\n    )]);\n\n    let config = Config::builder()\n        .region(Region::new(\"us-east-1\"))\n        .http_client(http_client)\n        .with_test_defaults()\n        .build();\n\n    Client::from_conf(config)\n}\n\n#[allow(deprecated)]\n#[tokio::test]\nasync fn expires_customization_works_with_non_date_value() {\n    let client = make_client(\"foo\");\n\n    let out = client\n        .get_object()\n        .bucket(\"some-test-bucket\")\n        .key(\"test.txt\")\n        .send()\n        .await\n        .unwrap();\n\n    assert_eq!(out.expires, None);\n    assert_eq!(out.expires_string.unwrap(), \"foo\".to_string())\n}\n\n#[allow(deprecated)]\n#[tokio::test]\nasync fn expires_customization_works_with_valid_date_format() {\n    let date = \"Tue, 29 Apr 2014 18:30:38 GMT\";\n    let date_time = DateTime::from_str(date, Format::HttpDate).unwrap();\n\n    let client = make_client(date);\n\n    let out = client\n        .get_object()\n        .bucket(\"some-test-bucket\")\n        .key(\"test.txt\")\n        .send()\n        .await\n        .unwrap();\n\n    assert_eq!(out.expires.unwrap(), date_time);\n    assert_eq!(out.expires_string.unwrap(), date);\n}\n\n#[allow(deprecated)]\n#[tokio::test]\nasync fn expires_customization_works_with_non_http_date_format() {\n    let date = \"1985-04-12T23:20:50.52Z\";\n\n    let client = make_client(date);\n\n    let out = client\n        .get_object()\n        .bucket(\"some-test-bucket\")\n        .key(\"test.txt\")\n        .send()\n        .await\n        .unwrap();\n\n    assert_eq!(out.expires, None);\n    assert_eq!(out.expires_string.unwrap(), date);\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/s3/tests/express.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::time::{Duration, SystemTime};\n\nuse aws_config::timeout::TimeoutConfig;\nuse aws_config::Region;\nuse aws_runtime::user_agent::test_util::{\n    assert_ua_contains_metric_values, assert_ua_does_not_contain_metric_values,\n};\nuse aws_sdk_s3::config::endpoint::{EndpointFuture, Params, ResolveEndpoint};\nuse aws_sdk_s3::config::{Builder, Credentials};\nuse aws_sdk_s3::presigning::PresigningConfig;\nuse aws_sdk_s3::primitives::SdkBody;\nuse aws_sdk_s3::types::ChecksumAlgorithm;\nuse aws_sdk_s3::{Client, Config};\nuse aws_smithy_http_client::test_util::dvr::ReplayingClient;\nuse aws_smithy_http_client::test_util::{capture_request, ReplayEvent, StaticReplayClient};\nuse aws_smithy_runtime::test_util::capture_test_logs::capture_test_logs;\nuse aws_smithy_types::endpoint::Endpoint;\nuse http_1x::Uri;\n\nasync fn test_client<F>(update_builder: F) -> Client\nwhere\n    F: Fn(Builder) -> Builder,\n{\n    let sdk_config = aws_config::from_env().region(\"us-west-2\").load().await;\n    let config = Config::from(&sdk_config).to_builder().with_test_defaults();\n    aws_sdk_s3::Client::from_conf(update_builder(config).build())\n}\n\n#[tokio::test]\nasync fn create_session_request_should_not_include_x_amz_s3session_token() {\n    let (http_client, request) = capture_request(None);\n    // There was a bug where a regular SigV4 session token was overwritten by an express session token\n    // even for CreateSession API request.\n    // To exercise that code path, it is important to include credentials with a session token below.\n    let conf = Config::builder()\n        .http_client(http_client)\n        .region(Region::new(\"us-west-2\"))\n        .credentials_provider(::aws_credential_types::Credentials::for_tests_with_session_token())\n        .build();\n    let client = Client::from_conf(conf);\n\n    let _ = client\n        .list_objects_v2()\n        .bucket(\"s3express-test-bucket--usw2-az1--x-s3\")\n        .send()\n        .await;\n\n    let req = request.expect_request();\n    assert!(\n        req.headers().get(\"x-amz-create-session-mode\").is_none(),\n        \"`x-amz-create-session-mode` should not appear in headers of the first request when an express bucket is specified\"\n    );\n    assert!(req.headers().get(\"x-amz-security-token\").is_some());\n    assert!(req.headers().get(\"x-amz-s3session-token\").is_none());\n\n    // The first request uses regular SigV4 credentials (for CreateSession), not S3 Express credentials,\n    // so metric \"J\" should NOT be present yet. It will appear on subsequent requests that use S3 Express credentials.\n    let user_agent = req.headers().get(\"x-amz-user-agent\").unwrap();\n    assert_ua_does_not_contain_metric_values(user_agent, &[\"J\"]);\n}\n\n#[tokio::test]\nasync fn mixed_auths() {\n    let _logs = capture_test_logs();\n\n    let http_client = ReplayingClient::from_file(\"tests/data/express/mixed-auths.json\").unwrap();\n    let client = test_client(|b| b.http_client(http_client.clone())).await;\n\n    // A call to an S3 Express bucket where we should see two request/response pairs,\n    // one for the `create_session` API and the other for `list_objects_v2` in S3 Express bucket.\n    let result = client\n        .list_objects_v2()\n        .bucket(\"s3express-test-bucket--usw2-az1--x-s3\")\n        .send()\n        .await;\n    dbg!(result).expect(\"success\");\n\n    // A call to a regular bucket, and request headers should not contain `x-amz-s3session-token`.\n    let result = client\n        .list_objects_v2()\n        .bucket(\"regular-test-bucket\")\n        .send()\n        .await;\n    dbg!(result).expect(\"success\");\n\n    // A call to another S3 Express bucket where we should again see two request/response pairs,\n    // one for the `create_session` API and the other for `list_objects_v2` in S3 Express bucket.\n    let result = client\n        .list_objects_v2()\n        .bucket(\"s3express-test-bucket-2--usw2-az3--x-s3\")\n        .send()\n        .await;\n    dbg!(result).expect(\"success\");\n\n    // This call should be an identity cache hit for the first S3 Express bucket,\n    // thus no HTTP request should be sent to the `create_session` API.\n    let result = client\n        .list_objects_v2()\n        .bucket(\"s3express-test-bucket--usw2-az1--x-s3\")\n        .send()\n        .await;\n    dbg!(result).expect(\"success\");\n\n    http_client\n        .validate_body_and_headers(Some(&[\"x-amz-s3session-token\"]), \"application/xml\")\n        .await\n        .unwrap();\n}\n\nfn create_session_request() -> http_1x::Request<SdkBody> {\n    http_1x::Request::builder()\n        .uri(\"https://s3express-test-bucket--usw2-az1--x-s3.s3express-usw2-az1.us-west-2.amazonaws.com/?session\")\n        .method(\"GET\")\n        .body(SdkBody::empty())\n        .unwrap()\n}\n\nfn create_session_response() -> http_1x::Response<SdkBody> {\n    http_1x::Response::builder()\n        .status(200)\n        .body(SdkBody::from(\n            r#\"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n            <CreateSessionResult xmlns=\"http://s3.amazonaws.com/doc/2006-03-01/\">\n                <Credentials>\n                    <SessionToken>TESTSESSIONTOKEN</SessionToken>\n                    <SecretAccessKey>TESTSECRETKEY</SecretAccessKey>\n                    <AccessKeyId>ASIARTESTID</AccessKeyId>\n                    <Expiration>2024-01-29T18:53:01Z</Expiration>\n                </Credentials>\n            </CreateSessionResult>\n            \"#,\n        ))\n        .unwrap()\n}\n\n#[tokio::test]\nasync fn presigning() {\n    let http_client = StaticReplayClient::new(vec![ReplayEvent::new(\n        create_session_request(),\n        create_session_response(),\n    )]);\n\n    let client = test_client(|b| b.http_client(http_client.clone())).await;\n\n    let presigning_config = PresigningConfig::builder()\n        .start_time(SystemTime::UNIX_EPOCH + Duration::from_secs(1234567891))\n        .expires_in(Duration::from_secs(30))\n        .build()\n        .unwrap();\n\n    let presigned = client\n        .get_object()\n        .bucket(\"s3express-test-bucket--usw2-az1--x-s3\")\n        .key(\"ferris.png\")\n        .presigned(presigning_config)\n        .await\n        .unwrap();\n\n    let uri = presigned.uri().parse::<Uri>().unwrap();\n\n    let pq = uri.path_and_query().unwrap();\n    let path = pq.path();\n    let query = pq.query().unwrap();\n    let mut query_params: Vec<&str> = query.split('&').collect();\n    query_params.sort();\n\n    pretty_assertions::assert_eq!(\n        \"s3express-test-bucket--usw2-az1--x-s3.s3express-usw2-az1.us-west-2.amazonaws.com\",\n        uri.authority().unwrap()\n    );\n    assert_eq!(\"GET\", presigned.method());\n    assert_eq!(\"/ferris.png\", path);\n    pretty_assertions::assert_eq!(\n        &[\n            \"X-Amz-Algorithm=AWS4-HMAC-SHA256\",\n            \"X-Amz-Credential=ASIARTESTID%2F20090213%2Fus-west-2%2Fs3express%2Faws4_request\",\n            \"X-Amz-Date=20090213T233131Z\",\n            \"X-Amz-Expires=30\",\n            \"X-Amz-S3session-Token=TESTSESSIONTOKEN\",\n            \"X-Amz-Signature=c09c93c7878184492cb960d59e148af932dff6b19609e63e3484599903d97e44\",\n            \"X-Amz-SignedHeaders=host\",\n            \"x-id=GetObject\"\n        ][..],\n        &query_params\n    );\n    // Presigned request has no headers by default\n    assert_eq!(presigned.headers().count(), 0);\n}\n\nfn operation_request_with_checksum(\n    query: &str,\n    kv: Option<(&str, &str)>,\n) -> http_1x::Request<SdkBody> {\n    let mut b = http_1x::Request::builder()\n        .uri(&format!(\"https://s3express-test-bucket--usw2-az1--x-s3.s3express-usw2-az1.us-west-2.amazonaws.com/{query}\"))\n        .method(\"GET\");\n    if let Some((key, value)) = kv {\n        b = b.header(key, value);\n    }\n    b.body(SdkBody::empty()).unwrap()\n}\n\nfn response_ok() -> http_1x::Response<SdkBody> {\n    http_1x::Response::builder()\n        .status(200)\n        .body(SdkBody::empty())\n        .unwrap()\n}\n\n#[tokio::test]\nasync fn user_specified_checksum_should_be_respected() {\n    async fn runner(checksum: ChecksumAlgorithm, value: &str) {\n        let http_client = StaticReplayClient::new(vec![\n            ReplayEvent::new(create_session_request(), create_session_response()),\n            ReplayEvent::new(\n                operation_request_with_checksum(\n                    \"test?x-id=PutObject\",\n                    Some((\n                        &format!(\"x-amz-checksum-{}\", checksum.as_str().to_lowercase()),\n                        &format!(\"{value}\"),\n                    )),\n                ),\n                response_ok(),\n            ),\n        ]);\n        let client = test_client(|b| b.http_client(http_client.clone())).await;\n\n        let _ = client\n            .put_object()\n            .bucket(\"s3express-test-bucket--usw2-az1--x-s3\")\n            .key(\"test\")\n            .body(SdkBody::empty().into())\n            .checksum_algorithm(checksum)\n            .send()\n            .await;\n\n        http_client.assert_requests_match(&[\"\"]);\n    }\n\n    let checksum_value_pairs = &[\n        (ChecksumAlgorithm::Crc32, \"AAAAAA==\"),\n        (ChecksumAlgorithm::Crc32C, \"AAAAAA==\"),\n        (ChecksumAlgorithm::Sha1, \"2jmj7l5rSw0yVb/vlWAYkK/YBwk=\"),\n        (\n            ChecksumAlgorithm::Sha256,\n            \"47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=\",\n        ),\n    ];\n    for (checksum, value) in checksum_value_pairs {\n        runner(checksum.clone(), *value).await;\n    }\n}\n\n#[tokio::test]\nasync fn default_checksum_should_be_crc32_for_operation_requiring_checksum() {\n    let http_client = StaticReplayClient::new(vec![\n        ReplayEvent::new(create_session_request(), create_session_response()),\n        ReplayEvent::new(\n            operation_request_with_checksum(\"?delete\", Some((\"x-amz-checksum-crc32\", \"AAAAAA==\"))),\n            response_ok(),\n        ),\n    ]);\n    let client = test_client(|b| b.http_client(http_client.clone())).await;\n\n    let _ = client\n        .delete_objects()\n        .bucket(\"s3express-test-bucket--usw2-az1--x-s3\")\n        .send()\n        .await;\n\n    let checksum_headers: Vec<_> = http_client\n        .actual_requests()\n        .last()\n        .unwrap()\n        .headers()\n        .iter()\n        .filter(|(key, _)| key.starts_with(\"x-amz-checksum\"))\n        .collect();\n    assert_eq!(1, checksum_headers.len());\n    assert_eq!(\"x-amz-checksum-crc32\", checksum_headers[0].0);\n\n    http_client.assert_requests_match(&[\"\"]);\n}\n\n#[tokio::test]\nasync fn default_checksum_should_be_none() {\n    let http_client = StaticReplayClient::new(vec![\n        ReplayEvent::new(create_session_request(), create_session_response()),\n        ReplayEvent::new(\n            operation_request_with_checksum(\"test?x-id=PutObject\", None),\n            response_ok(),\n        ),\n    ]);\n    let client = test_client(|b| b.http_client(http_client.clone())).await;\n\n    let _ = client\n        .put_object()\n        .bucket(\"s3express-test-bucket--usw2-az1--x-s3\")\n        .key(\"test\")\n        .body(SdkBody::empty().into())\n        .send()\n        .await;\n\n    http_client.assert_requests_match(&[\"\"]);\n\n    let mut all_checksums = ChecksumAlgorithm::values()\n        .iter()\n        .map(|checksum| format!(\"amz-checksum-{}\", checksum.to_lowercase()))\n        .chain(std::iter::once(\"content-md5\".to_string()));\n    assert!(!all_checksums.any(|checksum| http_client\n        .actual_requests()\n        .any(|req| req.headers().iter().any(|(key, _)| key == checksum))));\n}\n\n#[tokio::test]\nasync fn disable_s3_express_session_auth_at_service_client_level() {\n    let (http_client, request) = capture_request(None);\n    let conf = Config::builder()\n        .http_client(http_client)\n        .region(Region::new(\"us-west-2\"))\n        .with_test_defaults()\n        .disable_s3_express_session_auth(true)\n        .build();\n    let client = Client::from_conf(conf);\n\n    let _ = client\n        .list_objects_v2()\n        .bucket(\"s3express-test-bucket--usw2-az1--x-s3\")\n        .send()\n        .await;\n\n    let req = request.expect_request();\n    assert!(\n        req.headers().get(\"x-amz-create-session-mode\").is_none(),\n        \"x-amz-create-session-mode should not appear in headers when S3 Express session auth is disabled\"\n    );\n\n    // Verify that the User-Agent does NOT contain the S3ExpressBucket metric \"J\" when session auth is disabled\n    let user_agent = req.headers().get(\"x-amz-user-agent\").unwrap();\n    assert_ua_does_not_contain_metric_values(user_agent, &[\"J\"]);\n}\n\n#[tokio::test]\nasync fn disable_s3_express_session_auth_at_operation_level() {\n    let (http_client, request) = capture_request(None);\n    let conf = Config::builder()\n        .http_client(http_client)\n        .region(Region::new(\"us-west-2\"))\n        .with_test_defaults()\n        .build();\n    let client = Client::from_conf(conf);\n\n    let _ = client\n        .list_objects_v2()\n        .bucket(\"s3express-test-bucket--usw2-az1--x-s3\")\n        .customize()\n        .config_override(Config::builder().disable_s3_express_session_auth(true))\n        .send()\n        .await;\n\n    let req = request.expect_request();\n    assert!(\n        req.headers().get(\"x-amz-create-session-mode\").is_none(),\n        \"x-amz-create-session-mode should not appear in headers when S3 Express session auth is disabled\"\n    );\n}\n\n#[tokio::test]\nasync fn support_customer_overriding_express_credentials_provider() {\n    let expected_session_token = \"testsessiontoken\";\n    let client_overriding_express_credentials_provider = || async move {\n        let (http_client, rx) = capture_request(None);\n        let client = test_client(|b| {\n            let credentials = Credentials::new(\n                \"testaccess\",\n                \"testsecret\",\n                Some(expected_session_token.to_owned()),\n                None,\n                \"test\",\n            );\n            b.http_client(http_client.clone())\n                // Pass a credential with a session token so that\n                // `x-amz-s3session-token` should appear in the request header\n                // when s3 session auth is enabled.\n                .express_credentials_provider(credentials.clone())\n                // Pass a credential with a session token so that\n                // `x-amz-security-token` should appear in the request header\n                // when s3 session auth is disabled.\n                .credentials_provider(credentials)\n        })\n        .await;\n        (client, rx)\n    };\n\n    // Test `x-amz-s3session-token` should be present with `expected_session_token`.\n    let (client, rx) = client_overriding_express_credentials_provider().await;\n    let _ = client\n        .list_objects_v2()\n        .bucket(\"s3express-test-bucket--usw2-az1--x-s3\")\n        .send()\n        .await;\n\n    let req = rx.expect_request();\n    let actual_session_token = req\n        .headers()\n        .get(\"x-amz-s3session-token\")\n        .expect(\"x-amz-s3session-token should be present\");\n    assert_eq!(expected_session_token, actual_session_token);\n    assert!(req.headers().get(\"x-amz-security-token\").is_none());\n\n    // With a regular S3 bucket, test `x-amz-security-token` should be present with `expected_session_token`,\n    // instead of `x-amz-s3session-token`.\n    let (client, rx) = client_overriding_express_credentials_provider().await;\n    let _ = client\n        .list_objects_v2()\n        .bucket(\"regular-test-bucket\")\n        .send()\n        .await;\n\n    let req = rx.expect_request();\n    let actual_session_token = req\n        .headers()\n        .get(\"x-amz-security-token\")\n        .expect(\"x-amz-security-token should be present\");\n    assert_eq!(expected_session_token, actual_session_token);\n    assert!(req.headers().get(\"x-amz-s3session-token\").is_none());\n\n    // Verify that the User-Agent does NOT contain the S3ExpressBucket metric \"J\" for regular buckets\n    let user_agent = req.headers().get(\"x-amz-user-agent\").unwrap();\n    assert_ua_does_not_contain_metric_values(user_agent, &[\"J\"]);\n}\n\n#[tokio::test]\nasync fn s3_express_auth_flow_should_not_be_reached_with_no_auth_schemes() {\n    #[derive(Debug)]\n    struct TestResolver {\n        url: String,\n    }\n    impl ResolveEndpoint for TestResolver {\n        fn resolve_endpoint(&self, _params: &Params) -> EndpointFuture<'_> {\n            EndpointFuture::ready(Ok(Endpoint::builder().url(self.url.clone()).build()))\n        }\n    }\n\n    let (http_client, request) = capture_request(None);\n    let conf = Config::builder()\n        .http_client(http_client)\n        .region(Region::new(\"us-west-2\"))\n        .endpoint_resolver(TestResolver {\n            url: \"http://127.0.0.1\".to_owned(),\n        })\n        .with_test_defaults()\n        .timeout_config(\n            TimeoutConfig::builder()\n                .operation_attempt_timeout(Duration::from_secs(1))\n                .build(),\n        )\n        .build();\n    let client = Client::from_conf(conf);\n\n    // Note that we pass a regular bucket; when the bug was present, it still went through s3 Express auth flow.\n    let _ = client.list_objects_v2().bucket(\"test-bucket\").send().await;\n    // If s3 Express auth flow were exercised, no request would be received, most likely due to `TimeoutError`.\n    let _ = request.expect_request();\n}\n\n#[tokio::test]\nasync fn s3_express_request_contains_metric_j() {\n    let _logs = capture_test_logs();\n\n    let http_client = ReplayingClient::from_file(\"tests/data/express/mixed-auths.json\").unwrap();\n    let client = test_client(|b| b.http_client(http_client.clone())).await;\n\n    let _result = client\n        .list_objects_v2()\n        .bucket(\"s3express-test-bucket--usw2-az1--x-s3\")\n        .send()\n        .await\n        .expect(\"Request should succeed\");\n\n    let requests = http_client.take_requests().await;\n\n    let s3_express_request = requests\n        .iter()\n        .find(|req| req.headers().get(\"x-amz-s3session-token\").is_some())\n        .expect(\"Should have at least one S3 Express request with session token\");\n\n    let user_agent = s3_express_request\n        .headers()\n        .get(\"x-amz-user-agent\")\n        .expect(\"User-Agent header should be present\")\n        .to_str()\n        .expect(\"User-Agent should be valid UTF-8\");\n\n    assert_ua_contains_metric_values(user_agent, &[\"J\"]);\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/s3/tests/identity-cache.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::sync::atomic::{AtomicI32, Ordering};\nuse std::sync::Arc;\n\nuse aws_config::{BehaviorVersion, Region};\nuse aws_credential_types::{\n    provider::{future::ProvideCredentials as ProvideCredentialsFuture, ProvideCredentials},\n    Credentials,\n};\nuse aws_sdk_s3::Client;\nuse aws_smithy_http_client::test_util::infallible_client_fn;\n\n// NOTE: These tests are _not_ S3 specific and would apply to any AWS SDK but due to the need to consume `aws-config`\n// (which depends on relocated runtime crates) we can't make this an `awsSdkIntegrationTest(..)`.\n\n#[tokio::test]\nasync fn test_identity_cache_reused_by_default() {\n    let http_client = infallible_client_fn(|_req| {\n        http_1x::Response::builder()\n            .status(200)\n            .body(\"OK!\")\n            .unwrap()\n    });\n\n    let provider = TestCredProvider::new();\n    let config = aws_config::defaults(BehaviorVersion::latest())\n        .http_client(http_client)\n        .credentials_provider(provider.clone())\n        .region(Region::new(\"us-west-2\"))\n        .load()\n        .await;\n\n    let c1 = Client::new(&config);\n    let _ = c1.list_buckets().send().await;\n    assert_eq!(1, provider.invoke_count.load(Ordering::SeqCst));\n\n    let c2 = Client::new(&config);\n    let _ = c2.list_buckets().send().await;\n    assert_eq!(1, provider.invoke_count.load(Ordering::SeqCst));\n}\n\n#[allow(deprecated)] // intentionally testing an old behavior version\n#[tokio::test]\nasync fn test_identity_cache_ga_behavior_version() {\n    let http_client = infallible_client_fn(|_req| {\n        http_1x::Response::builder()\n            .status(200)\n            .body(\"OK!\")\n            .unwrap()\n    });\n\n    let provider = TestCredProvider::new();\n\n    // no cache is defined in this behavior version by default so each client should get their own\n    let config = aws_config::defaults(BehaviorVersion::v2023_11_09())\n        .http_client(http_client)\n        .credentials_provider(provider.clone())\n        .region(Region::new(\"us-west-2\"))\n        .load()\n        .await;\n\n    let c1 = Client::new(&config);\n    let _ = c1.list_buckets().send().await;\n    assert_eq!(1, provider.invoke_count.load(Ordering::SeqCst));\n\n    let c2 = Client::new(&config);\n    let _ = c2.list_buckets().send().await;\n    assert_eq!(2, provider.invoke_count.load(Ordering::SeqCst));\n}\n\n#[derive(Clone, Debug)]\nstruct TestCredProvider {\n    invoke_count: Arc<AtomicI32>,\n    creds: Credentials,\n}\n\nimpl TestCredProvider {\n    fn new() -> Self {\n        TestCredProvider {\n            invoke_count: Arc::new(AtomicI32::default()),\n            creds: Credentials::for_tests(),\n        }\n    }\n}\n\nimpl ProvideCredentials for TestCredProvider {\n    fn provide_credentials<'a>(\n        &'a self,\n    ) -> aws_credential_types::provider::future::ProvideCredentials<'a>\n    where\n        Self: 'a,\n    {\n        self.invoke_count.fetch_add(1, Ordering::SeqCst);\n        ProvideCredentialsFuture::ready(Ok(self.creds.clone()))\n    }\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/s3/tests/ignore-invalid-xml-body-root.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n#![cfg(feature = \"test-util\")]\n\nuse aws_credential_types::provider::SharedCredentialsProvider;\nuse aws_sdk_s3::Config;\nuse aws_sdk_s3::{config::Credentials, config::Region, types::ObjectAttributes, Client};\nuse aws_smithy_http_client::test_util::{ReplayEvent, StaticReplayClient};\nuse aws_smithy_types::body::SdkBody;\n\nconst RESPONSE_BODY_XML: &[u8] = b\"<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\"?>\\n<GetObjectAttributesResponse xmlns=\\\"http://s3.amazonaws.com/doc/2006-03-01/\\\"><Checksum><ChecksumSHA1>e1AsOh9IyGCa4hLN+2Od7jlnP14=</ChecksumSHA1></Checksum></GetObjectAttributesResponse>\";\n\n#[tokio::test]\nasync fn ignore_invalid_xml_body_root() {\n    let http_client = StaticReplayClient::new(vec![\n        ReplayEvent::new(http_1x::Request::builder()\n             .header(\"x-amz-object-attributes\", \"Checksum\")\n             .header(\"x-amz-user-agent\", \"aws-sdk-rust/0.123.test api/test-service/0.123 os/windows/XPSP3 lang/rust/1.50.0\")\n             .header(\"x-amz-date\", \"20090213T233130Z\")\n             .header(\"authorization\", \"AWS4-HMAC-SHA256 Credential=ANOTREAL/20210618/us-east-1/s3/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date;x-amz-object-attributes;x-amz-security-token;x-amz-user-agent, Signature=0e6ec749db5a0af07890a83f553319eda95be0e498d058c64880471a474c5378\")\n             .header(\"x-amz-content-sha256\", \"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\")\n             .uri(http_1x::Uri::from_static(\"https://some-test-bucket.s3.us-east-1.amazonaws.com/test.txt?attributes\"))\n             .body(SdkBody::empty())\n             .unwrap(),\n         http_1x::Response::builder()\n             .header(\n                 \"x-amz-id-2\",\n                 \"rbipIUyF3YKPIcqpz6hrP9x9mzYMSqkHzDEp6TEN/STcKvylDIE/LLN6x9t6EKJRrgctNsdNHWk=\",\n             )\n             .header(\"x-amz-request-id\", \"K8036R3D4NZNMMVC\")\n             .header(\"date\", \"Tue, 23 Aug 2022 18:17:23 GMT\")\n             .header(\"last-modified\", \"Tue, 21 Jun 2022 16:30:01 GMT\")\n             .header(\"server\", \"AmazonS3\")\n             .header(\"content-length\", \"224\")\n             .status(200)\n             .body(SdkBody::from(RESPONSE_BODY_XML))\n             .unwrap())\n    ]);\n\n    let config = Config::builder()\n        .credentials_provider(SharedCredentialsProvider::new(\n            Credentials::for_tests_with_session_token(),\n        ))\n        .region(Region::new(\"us-east-1\"))\n        .http_client(http_client.clone())\n        .with_test_defaults()\n        .build();\n    let client = Client::from_conf(config);\n\n    let _ = client\n        .get_object_attributes()\n        .bucket(\"some-test-bucket\")\n        .key(\"test.txt\")\n        .object_attributes(ObjectAttributes::Checksum)\n        .send()\n        .await\n        .unwrap();\n\n    http_client.relaxed_requests_match();\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/s3/tests/interceptors.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_sdk_s3::config::interceptors::BeforeTransmitInterceptorContextMut;\nuse aws_sdk_s3::config::{Credentials, Region};\nuse aws_sdk_s3::Client;\nuse aws_smithy_http_client::test_util::capture_request;\nuse aws_smithy_runtime_api::box_error::BoxError;\nuse aws_smithy_runtime_api::client::interceptors::Intercept;\nuse aws_smithy_runtime_api::client::runtime_components::RuntimeComponents;\nuse aws_smithy_types::config_bag::{ConfigBag, Layer, Storable, StoreReplace};\nuse http_1x::header::USER_AGENT;\nuse http_1x::HeaderValue;\n\n#[tokio::test]\nasync fn interceptor_priority() {\n    #[derive(Debug, Eq, PartialEq)]\n    struct TestValue(&'static str);\n    impl Storable for TestValue {\n        type Storer = StoreReplace<Self>;\n    }\n\n    #[derive(Debug)]\n    struct TestInterceptor(&'static str);\n    impl Intercept for TestInterceptor {\n        fn name(&self) -> &'static str {\n            \"TestInterceptor\"\n        }\n\n        fn modify_before_signing(\n            &self,\n            _context: &mut BeforeTransmitInterceptorContextMut<'_>,\n            _components: &RuntimeComponents,\n            cfg: &mut ConfigBag,\n        ) -> Result<(), BoxError> {\n            let mut layer = Layer::new(\"test\");\n            layer.store_put(TestValue(self.0));\n            cfg.push_layer(layer);\n            Ok(())\n        }\n\n        fn modify_before_transmit(\n            &self,\n            context: &mut BeforeTransmitInterceptorContextMut<'_>,\n            _runtime_components: &RuntimeComponents,\n            cfg: &mut ConfigBag,\n        ) -> Result<(), BoxError> {\n            let value = cfg.load::<TestValue>().unwrap();\n            context\n                .request_mut()\n                .headers_mut()\n                .insert(\"test-header\", HeaderValue::from_static(value.0));\n            Ok(())\n        }\n    }\n\n    let (http_client, rx) = capture_request(None);\n\n    // The first `TestInterceptor` will put `value1` into config\n    let config = aws_sdk_s3::Config::builder()\n        .credentials_provider(Credentials::for_tests())\n        .region(Region::new(\"us-east-1\"))\n        .http_client(http_client)\n        .interceptor(TestInterceptor(\"value1\"))\n        .build();\n    let client = Client::from_conf(config);\n\n    // The second `TestInterceptor` will replace `value1` with `value2` in config\n    dbg!(\n        client\n            .list_objects_v2()\n            .bucket(\"test-bucket\")\n            .prefix(\"prefix~\")\n            .customize()\n            .interceptor(TestInterceptor(\"value2\"))\n            .send()\n            .await\n    )\n    .expect_err(\"no fake response set\");\n\n    let request = rx.expect_request();\n    assert_eq!(\"value2\", request.headers().get(\"test-header\").unwrap());\n}\n\n#[tokio::test]\nasync fn set_test_user_agent_through_request_mutation() {\n    let (http_client, rx) = capture_request(None);\n\n    let config = aws_sdk_s3::Config::builder()\n        .credentials_provider(Credentials::for_tests())\n        .region(Region::new(\"us-east-1\"))\n        .http_client(http_client.clone())\n        .build();\n    let client = Client::from_conf(config);\n\n    dbg!(\n        client\n            .list_objects_v2()\n            .bucket(\"test-bucket\")\n            .prefix(\"prefix~\")\n            .customize()\n            .mutate_request(|request| {\n                let headers = request.headers_mut();\n                headers.insert(USER_AGENT, HeaderValue::try_from(\"test\").unwrap());\n                headers.insert(\"x-amz-user-agent\", HeaderValue::try_from(\"test\").unwrap());\n            })\n            .send()\n            .await\n    )\n    .expect_err(\"no fake response set\");\n\n    let request = rx.expect_request();\n    assert_eq!(\"test\", request.headers().get(USER_AGENT).unwrap());\n    assert_eq!(\"test\", request.headers().get(\"x-amz-user-agent\").unwrap());\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/s3/tests/mocks.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Integration tests for `aws-smithy-mocks`. These tests are not necessarily specific to S3 but\n//! we need to test the macros against an actual SDK.\n\nuse aws_sdk_s3::config::retry::RetryConfig;\nuse aws_sdk_s3::operation::get_object::{GetObjectError, GetObjectOutput};\nuse aws_sdk_s3::operation::list_buckets::ListBucketsError;\nuse aws_smithy_mocks::{mock, mock_client, RuleMode};\nuse aws_smithy_runtime_api::client::orchestrator::HttpResponse;\nuse aws_smithy_runtime_api::http::StatusCode;\nuse aws_smithy_types::body::SdkBody;\nuse aws_smithy_types::byte_stream::ByteStream;\nuse aws_smithy_types::error::metadata::ProvideErrorMetadata;\nuse aws_smithy_types::error::ErrorMetadata;\n\nconst S3_NO_SUCH_KEY: &str = r#\"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Error>\n  <Code>NoSuchKey</Code>\n  <Message>The resource you requested does not exist</Message>\n  <Resource>/mybucket/myfoto.jpg</Resource>\n  <RequestId>4442587FB7D0A2F9</RequestId>\n</Error>\"#;\n\n#[tokio::test]\nasync fn test_mock_client() {\n    let s3_404 = mock!(aws_sdk_s3::Client::get_object)\n        .match_requests(|inp| {\n            inp.bucket() == Some(\"test-bucket\") && inp.key() != Some(\"correct-key\")\n        })\n        .then_http_response(|| {\n            HttpResponse::new(\n                StatusCode::try_from(400).unwrap(),\n                SdkBody::from(S3_NO_SUCH_KEY),\n            )\n        });\n\n    let s3_real_object = mock!(aws_sdk_s3::Client::get_object)\n        .match_requests(|inp| {\n            inp.bucket() == Some(\"test-bucket\") && inp.key() == Some(\"correct-key\")\n        })\n        .then_output(|| {\n            GetObjectOutput::builder()\n                .body(ByteStream::from_static(b\"test-test-test\"))\n                .build()\n        });\n\n    let modeled_error = mock!(aws_sdk_s3::Client::list_buckets).then_error(|| {\n        ListBucketsError::generic(ErrorMetadata::builder().code(\"InvalidAccessKey\").build())\n    });\n\n    let s3 = mock_client!(aws_sdk_s3, &[&s3_404, &s3_real_object, &modeled_error]);\n\n    let error = s3\n        .get_object()\n        .bucket(\"test-bucket\")\n        .key(\"foo\")\n        .send()\n        .await\n        .expect_err(\"404\");\n\n    assert!(matches!(\n        error.into_service_error(),\n        GetObjectError::NoSuchKey(_)\n    ));\n\n    assert_eq!(s3_404.num_calls(), 1);\n\n    let data = s3\n        .get_object()\n        .bucket(\"test-bucket\")\n        .key(\"correct-key\")\n        .send()\n        .await\n        .expect(\"success response\")\n        .body\n        .collect()\n        .await\n        .expect(\"successful read\")\n        .to_vec();\n\n    assert_eq!(data, b\"test-test-test\");\n    assert_eq!(s3_real_object.num_calls(), 1);\n\n    let err = s3.list_buckets().send().await.expect_err(\"bad access key\");\n    assert_eq!(err.code(), Some(\"InvalidAccessKey\"));\n}\n\n#[tokio::test]\nasync fn test_mock_client_compute() {\n    let s3_computed = mock!(aws_sdk_s3::Client::get_object)\n        .match_requests(|inp| {\n            inp.bucket() == Some(\"test-bucket\") && inp.key() == Some(\"correct-key\")\n        })\n        .then_compute_output(|input| {\n            let content =\n                format!(\"{}.{}\", input.bucket().unwrap(), input.key().unwrap()).into_bytes();\n            GetObjectOutput::builder()\n                .body(ByteStream::from(content))\n                .build()\n        });\n\n    let s3 = mock_client!(aws_sdk_s3, &[&s3_computed]);\n\n    let data = s3\n        .get_object()\n        .bucket(\"test-bucket\")\n        .key(\"correct-key\")\n        .send()\n        .await\n        .expect(\"success response\")\n        .body\n        .collect()\n        .await\n        .expect(\"successful read\")\n        .to_vec();\n\n    assert_eq!(data, b\"test-bucket.correct-key\");\n    assert_eq!(s3_computed.num_calls(), 1);\n}\n\n#[tokio::test]\nasync fn test_mock_client_sequence() {\n    let rule = mock!(aws_sdk_s3::Client::get_object)\n        .sequence()\n        .http_status(400, Some(S3_NO_SUCH_KEY.to_string()))\n        .output(|| {\n            GetObjectOutput::builder()\n                .body(ByteStream::from_static(b\"test-test-test\"))\n                .build()\n        })\n        .build();\n\n    // test client builder override\n    let s3 = mock_client!(\n        aws_sdk_s3,\n        RuleMode::Sequential,\n        [&rule],\n        |client_builder| { client_builder.endpoint_url(\"http://localhost:9000\") }\n    );\n\n    let error = s3\n        .get_object()\n        .bucket(\"test-bucket\")\n        .key(\"foo\")\n        .send()\n        .await\n        .expect_err(\"404\");\n\n    assert!(matches!(\n        error.into_service_error(),\n        GetObjectError::NoSuchKey(_)\n    ));\n    assert_eq!(1, rule.num_calls());\n    let data = s3\n        .get_object()\n        .bucket(\"test-bucket\")\n        .key(\"correct-key\")\n        .send()\n        .await\n        .expect(\"success response\")\n        .body\n        .collect()\n        .await\n        .expect(\"successful read\")\n        .to_vec();\n\n    assert_eq!(data, b\"test-test-test\");\n    assert_eq!(2, rule.num_calls());\n}\n\n#[tokio::test]\nasync fn test_mock_client_retries() {\n    let rule = mock!(aws_sdk_s3::Client::get_object)\n        .sequence()\n        .http_status(503, None)\n        .times(2)\n        .output(|| {\n            GetObjectOutput::builder()\n                .body(ByteStream::from_static(b\"test-test-test\"))\n                .build()\n        })\n        .build();\n\n    // test client builder override\n    let s3 = mock_client!(\n        aws_sdk_s3,\n        RuleMode::Sequential,\n        [&rule],\n        |client_builder| {\n            client_builder.retry_config(RetryConfig::standard().with_max_attempts(3))\n        }\n    );\n\n    let data = s3\n        .get_object()\n        .bucket(\"test-bucket\")\n        .key(\"correct-key\")\n        .send()\n        .await\n        .expect(\"success response\")\n        .body\n        .collect()\n        .await\n        .expect(\"successful read\")\n        .to_vec();\n\n    assert_eq!(data, b\"test-test-test\");\n    assert_eq!(3, rule.num_calls());\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/s3/tests/naughty-string-metadata.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n#![cfg(feature = \"test-util\")]\n\nuse aws_credential_types::provider::SharedCredentialsProvider;\nuse aws_sdk_s3::Config;\nuse aws_sdk_s3::{config::Credentials, config::Region, primitives::ByteStream, Client};\nuse aws_smithy_http_client::test_util::capture_request;\nuse http_1x::HeaderValue;\n\nconst NAUGHTY_STRINGS: &str = include_str!(\"blns/blns.txt\");\n\n// // A useful way to find leaks in the signing system that requires an actual S3 bucket to test with\n// // If you want to use this, update the credentials to be your credentials and change the bucket name\n// // to your bucket\n// // NOTE: this won't actually succeed, you'll get a 400 back from S3 because the headers are too long.\n// #[tokio::test]\n// async fn test_metadata_field_against_naughty_strings_list() -> Result<(), aws_sdk_s3::Error> {\n//     // re-add `aws-config = { path = \"../../build/aws-sdk/aws-config\" }` to this project's Cargo.toml\n//\n//     let config = aws_config::load_from_env().await;\n//     let client = aws_sdk_s3::Client::new(&config);\n//\n//     let mut req = client\n//         .put_object()\n//         .bucket(\"your-test-bucket-goes-here\")\n//         .key(\"test.txt\")\n//         .body(aws_sdk_s3::ByteStream::from_static(b\"some test text\"));\n//\n//     for (idx, line) in NAUGHTY_STRINGS.split('\\n').enumerate() {\n//         // add lines to metadata unless they're a comment or empty\n//         // Some naughty strings aren't valid HeaderValues so we skip those too\n//         if !line.starts_with(\"#\") && !line.is_empty() && HeaderValue::from_str(line).is_ok() {\n//             let key = format!(\"line-{}\", idx);\n//\n//             req = req.metadata(key, line);\n//         }\n//     }\n//\n//     // If this fails due to signing then the signer choked on a bad string. To find out which string,\n//     // send one request per line instead of adding all lines as metadata for one request.\n//     let _ = req.send().await.unwrap();\n//\n//     Ok(())\n// }\n\n#[tokio::test]\nasync fn test_s3_signer_with_naughty_string_metadata() {\n    let (http_client, rcvr) = capture_request(None);\n    let config = Config::builder()\n        .credentials_provider(SharedCredentialsProvider::new(\n            Credentials::for_tests_with_session_token(),\n        ))\n        .region(Region::new(\"us-east-1\"))\n        .http_client(http_client.clone())\n        .with_test_defaults()\n        .force_path_style(true)\n        .build();\n\n    let client = Client::from_conf(config);\n    let mut builder = client\n        .put_object()\n        .bucket(\"test-bucket\")\n        .key(\"text.txt\")\n        .body(ByteStream::from_static(b\"some test text\"));\n\n    for (idx, line) in NAUGHTY_STRINGS.split('\\n').enumerate() {\n        // add lines to metadata unless they're a comment or empty\n        // Some naughty strings aren't valid HeaderValues so we skip those too\n        if !line.starts_with('#') && !line.is_empty() && HeaderValue::from_str(line).is_ok() {\n            let key = format!(\"line-{}\", idx);\n\n            builder = builder.metadata(key, line);\n        }\n    }\n\n    let _ = builder.send().await.unwrap();\n\n    // As long as a request can be extracted and the `Authorization` header exits, we're good.\n    // We cannot compare a signature in the `Authorization` header between expected and actual\n    // because the signature is subject to change as we update the `x-amz-user-agent` header, e.g.\n    // due to the introduction of a new metric.\n    let expected_req = rcvr.expect_request();\n    let _ = expected_req.headers().get(\"Authorization\").unwrap();\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/s3/tests/no_auth.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_sdk_s3::config::Region;\nuse aws_sdk_s3::{Client, Config};\nuse aws_smithy_http_client::test_util::capture_request;\nuse aws_smithy_http_client::test_util::dvr::ReplayingClient;\nuse aws_smithy_runtime::client::auth::no_auth::NO_AUTH_SCHEME_ID;\nuse aws_smithy_runtime::test_util::capture_test_logs::capture_test_logs;\nuse aws_smithy_runtime_api::client::auth::AuthSchemeId;\n\n#[tokio::test]\nasync fn list_objects() {\n    let _logs = capture_test_logs();\n\n    let http_client = ReplayingClient::from_file(\"tests/data/no_auth/list-objects.json\").unwrap();\n    let config = aws_config::from_env()\n        .http_client(http_client.clone())\n        .no_credentials()\n        .region(\"us-east-1\")\n        .load()\n        .await;\n    let config = Config::from(&config)\n        .to_builder()\n        .with_test_defaults()\n        .build();\n    let client = aws_sdk_s3::Client::from_conf(config);\n\n    let result = client\n        .list_objects()\n        .bucket(\"gdc-organoid-pancreatic-phs001611-2-open\")\n        .max_keys(3)\n        .send()\n        .await;\n    dbg!(result).expect(\"success\");\n\n    http_client\n        .relaxed_validate(\"application/xml\")\n        .await\n        .unwrap();\n}\n\n#[tokio::test]\nasync fn list_objects_v2() {\n    let _logs = capture_test_logs();\n\n    let http_client =\n        ReplayingClient::from_file(\"tests/data/no_auth/list-objects-v2.json\").unwrap();\n    let config = aws_config::from_env()\n        .http_client(http_client.clone())\n        .no_credentials()\n        .region(\"us-east-1\")\n        .load()\n        .await;\n    let config = Config::from(&config)\n        .to_builder()\n        .with_test_defaults()\n        .build();\n    let client = Client::from_conf(config);\n\n    let result = client\n        .list_objects_v2()\n        .bucket(\"gdc-organoid-pancreatic-phs001611-2-open\")\n        .max_keys(3)\n        .send()\n        .await;\n    dbg!(result).expect(\"success\");\n\n    http_client\n        .relaxed_validate(\"application/xml\")\n        .await\n        .unwrap();\n}\n\n#[tokio::test]\nasync fn head_object() {\n    let _logs = capture_test_logs();\n\n    let http_client = ReplayingClient::from_file(\"tests/data/no_auth/head-object.json\").unwrap();\n    let config = aws_config::from_env()\n        .http_client(http_client.clone())\n        .no_credentials()\n        .region(\"us-east-1\")\n        .load()\n        .await;\n    let config = Config::from(&config)\n        .to_builder()\n        .with_test_defaults()\n        .build();\n    let client = Client::from_conf(config);\n\n    let result = client\n        .head_object()\n        .bucket(\"gdc-organoid-pancreatic-phs001611-2-open\")\n        .key(\"0431cddc-a418-4a79-a34d-6c041394e8e4/a6ddcc84-8e4d-4c68-885c-2d51168eec97.FPKM-UQ.txt.gz\")\n        .send()\n        .await;\n    dbg!(result).expect(\"success\");\n\n    http_client\n        .relaxed_validate(\"application/xml\")\n        .await\n        .unwrap();\n}\n\n#[tokio::test]\nasync fn get_object() {\n    let _logs = capture_test_logs();\n\n    let http_client = ReplayingClient::from_file(\"tests/data/no_auth/get-object.json\").unwrap();\n    let config = aws_config::from_env()\n        .http_client(http_client.clone())\n        .no_credentials()\n        .region(\"us-east-1\")\n        .load()\n        .await;\n    let config = Config::from(&config)\n        .to_builder()\n        .with_test_defaults()\n        .build();\n    let client = Client::from_conf(config);\n\n    let result = client\n        .get_object()\n        .bucket(\"gdc-organoid-pancreatic-phs001611-2-open\")\n        .key(\"0431cddc-a418-4a79-a34d-6c041394e8e4/a6ddcc84-8e4d-4c68-885c-2d51168eec97.FPKM-UQ.txt.gz\")\n        .send()\n        .await;\n    dbg!(result).expect(\"success\");\n\n    http_client\n        .relaxed_validate(\"application/xml\")\n        .await\n        .unwrap();\n}\n\n#[tracing_test::traced_test]\n#[tokio::test]\nasync fn no_auth_should_be_selected_when_no_credentials_is_configured() {\n    let (http_client, _) = capture_request(None);\n    let config = aws_config::from_env()\n        .http_client(http_client)\n        .region(Region::new(\"us-east-2\"))\n        .no_credentials()\n        .load()\n        .await;\n\n    let client = Client::new(&config);\n    let _ = dbg!(\n        client\n            .list_objects_v2()\n            .bucket(\"doesnotmatter\")\n            .send()\n            .await\n    );\n\n    assert!(logs_contain(&format!(\n        \"resolving identity scheme_id=AuthSchemeId {{ scheme_id: \\\"{auth_scheme_id_str}\\\" }}\",\n        auth_scheme_id_str = NO_AUTH_SCHEME_ID.inner(),\n    )));\n}\n\n#[tracing_test::traced_test]\n#[tokio::test]\nasync fn auth_scheme_preference_specifying_legacy_no_auth_scheme_id_should_be_supported() {\n    let (http_client, _) = capture_request(None);\n    let conf = Config::builder()\n        .http_client(http_client)\n        .region(Region::new(\"us-east-2\"))\n        .with_test_defaults()\n        .auth_scheme_preference([AuthSchemeId::from(\"no_auth\")])\n        .build();\n    let client = Client::from_conf(conf);\n    let _ = client\n        .get_object()\n        .bucket(\"arn:aws:s3::123456789012:accesspoint/mfzwi23gnjvgw.mrap\")\n        .key(\"doesnotmatter\")\n        .send()\n        .await;\n\n    // What should appear in the log is the updated no auth scheme ID, not the legacy one.\n    // The legacy no auth scheme ID passed to the auth scheme preference merely reprioritizes\n    // ones supported in the runtime, which should contain the updated no auth scheme ID.\n    assert!(logs_contain(&format!(\n        \"resolving identity scheme_id=AuthSchemeId {{ scheme_id: \\\"{auth_scheme_id_str}\\\" }}\",\n        auth_scheme_id_str = NO_AUTH_SCHEME_ID.inner(),\n    )));\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/s3/tests/normalize-uri-path.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_credential_types::provider::SharedCredentialsProvider;\nuse aws_sdk_s3::primitives::ByteStream;\nuse aws_sdk_s3::Config;\nuse aws_sdk_s3::{config::Credentials, config::Region, Client};\nuse aws_smithy_http_client::test_util::capture_request;\n\n#[tokio::test]\nasync fn test_operation_should_not_normalize_uri_path() {\n    let (http_client, rx) = capture_request(None);\n    let config = Config::builder()\n        .credentials_provider(SharedCredentialsProvider::new(\n            Credentials::for_tests_with_session_token(),\n        ))\n        .region(Region::new(\"us-east-1\"))\n        .http_client(http_client.clone())\n        .with_test_defaults()\n        .build();\n    let client = Client::from_conf(config);\n\n    let bucket_name = \"test-bucket-ad7c9f01-7f7b-4669-b550-75cc6d4df0f1\";\n\n    client\n        .put_object()\n        .bucket(bucket_name)\n        .key(\"a/.././b.txt\") // object key with dot segments\n        .body(ByteStream::from_static(\"Hello, world\".as_bytes()))\n        .send()\n        .await\n        .unwrap();\n\n    let request = rx.expect_request();\n    let actual_uri = request.uri();\n    let expected_uri = \"https://test-bucket-ad7c9f01-7f7b-4669-b550-75cc6d4df0f1.s3.us-east-1.amazonaws.com/a/.././b.txt?x-id=PutObject\";\n    assert_eq!(expected_uri, actual_uri);\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/s3/tests/presigning.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_sdk_s3 as s3;\nuse std::collections::HashMap;\n\nuse futures_util::future::FutureExt;\nuse futures_util::Future;\nuse http_1x::header::{CONTENT_LENGTH, CONTENT_TYPE};\nuse http_1x::Uri;\nuse s3::config::{Credentials, Region};\nuse s3::operation::get_object::builders::GetObjectFluentBuilder;\nuse s3::operation::head_object::builders::HeadObjectFluentBuilder;\nuse s3::operation::put_object::builders::PutObjectFluentBuilder;\nuse s3::operation::upload_part::builders::UploadPartFluentBuilder;\nuse s3::presigning::{PresignedRequest, PresigningConfig};\nuse std::pin::Pin;\nuse std::time::{Duration, SystemTime};\n\ntrait TestOperation {\n    fn presign_for_test(\n        self,\n        config: PresigningConfig,\n    ) -> Pin<Box<dyn Future<Output = PresignedRequest>>>;\n}\n\nmacro_rules! rig_operation {\n    ($fluent_builder:ident) => {\n        impl TestOperation for $fluent_builder {\n            fn presign_for_test(\n                self,\n                config: PresigningConfig,\n            ) -> Pin<Box<dyn Future<Output = PresignedRequest>>> {\n                Box::pin($fluent_builder::presigned(self, config).map(|out| out.expect(\"success\")))\n            }\n        }\n    };\n}\n\nrig_operation!(GetObjectFluentBuilder);\nrig_operation!(PutObjectFluentBuilder);\nrig_operation!(UploadPartFluentBuilder);\nrig_operation!(HeadObjectFluentBuilder);\n\n/// Generates a `PresignedRequest` from the given input.\n/// Assumes that that input has a `presigned` method on it.\nasync fn presign<O, F>(operation: O) -> PresignedRequest\nwhere\n    O: FnOnce(s3::Client) -> F,\n    F: TestOperation,\n{\n    let creds = Credentials::for_tests_with_session_token();\n    let config = s3::Config::builder()\n        .credentials_provider(creds)\n        .region(Region::new(\"us-east-1\"))\n        .build();\n    let client = s3::Client::from_conf(config);\n\n    operation(client)\n        .presign_for_test(\n            PresigningConfig::builder()\n                .start_time(SystemTime::UNIX_EPOCH + Duration::from_secs(1234567891))\n                .expires_in(Duration::from_secs(30))\n                .build()\n                .unwrap(),\n        )\n        .await\n}\n\n#[tokio::test]\nasync fn test_presigning() {\n    let presigned =\n        presign(|client| client.get_object().bucket(\"test-bucket\").key(\"test-key\")).await;\n    let uri = presigned.uri().parse::<Uri>().unwrap();\n\n    let pq = uri.path_and_query().unwrap();\n    let path = pq.path();\n    let query = pq.query().unwrap();\n    let mut query_params: Vec<&str> = query.split('&').collect();\n    query_params.sort();\n\n    pretty_assertions::assert_eq!(\n        \"test-bucket.s3.us-east-1.amazonaws.com\",\n        uri.authority().unwrap()\n    );\n    assert_eq!(\"GET\", presigned.method());\n    assert_eq!(\"/test-key\", path);\n    pretty_assertions::assert_eq!(\n        &[\n            \"X-Amz-Algorithm=AWS4-HMAC-SHA256\",\n            \"X-Amz-Credential=ANOTREAL%2F20090213%2Fus-east-1%2Fs3%2Faws4_request\",\n            \"X-Amz-Date=20090213T233131Z\",\n            \"X-Amz-Expires=30\",\n            \"X-Amz-Security-Token=notarealsessiontoken\",\n            \"X-Amz-Signature=758353318739033a850182c7b3435076eebbbd095f8dcf311383a6a1e124c4cb\",\n            \"X-Amz-SignedHeaders=host\",\n            \"x-id=GetObject\"\n        ][..],\n        &query_params\n    );\n    assert_eq!(presigned.headers().count(), 0);\n    let headers = presigned.headers().collect::<HashMap<_, _>>();\n\n    // Checksum headers should not be included by default in presigned requests\n    assert_eq!(headers.get(\"x-amz-sdk-checksum-algorithm\"), None);\n    assert_eq!(headers.get(\"x-amz-checksum-crc32\"), None);\n    assert_eq!(headers.get(\"x-amz-checksum-mode\"), None);\n}\n\n#[tokio::test]\nasync fn test_presigning_with_payload_headers() {\n    let presigned = presign(|client| {\n        client\n            .put_object()\n            .bucket(\"test-bucket\")\n            .key(\"test-key\")\n            .content_length(12345)\n            .content_type(\"application/x-test\")\n    })\n    .await;\n    let uri = presigned.uri().parse::<Uri>().unwrap();\n\n    let pq = uri.path_and_query().unwrap();\n    let path = pq.path();\n    let query = pq.query().unwrap();\n    let mut query_params: Vec<&str> = query.split('&').collect();\n    query_params.sort();\n\n    pretty_assertions::assert_eq!(\n        \"test-bucket.s3.us-east-1.amazonaws.com\",\n        uri.authority().unwrap()\n    );\n    assert_eq!(\"PUT\", presigned.method());\n    assert_eq!(\"/test-key\", path);\n    pretty_assertions::assert_eq!(\n        &[\n            \"X-Amz-Algorithm=AWS4-HMAC-SHA256\",\n            \"X-Amz-Credential=ANOTREAL%2F20090213%2Fus-east-1%2Fs3%2Faws4_request\",\n            \"X-Amz-Date=20090213T233131Z\",\n            \"X-Amz-Expires=30\",\n            \"X-Amz-Security-Token=notarealsessiontoken\",\n            \"X-Amz-Signature=be1d41dc392f7019750e4f5e577234fb9059dd20d15f6a99734196becce55e52\",\n            \"X-Amz-SignedHeaders=content-length%3Bcontent-type%3Bhost\",\n            \"x-id=PutObject\"\n        ][..],\n        &query_params\n    );\n    let headers = presigned.headers().collect::<HashMap<_, _>>();\n\n    assert_eq!(\n        headers.get(CONTENT_TYPE.as_str()),\n        Some(&\"application/x-test\")\n    );\n    assert_eq!(headers.get(CONTENT_LENGTH.as_str()), Some(&\"12345\"));\n\n    // Checksum headers should not be included by default in presigned requests\n    assert_eq!(headers.get(\"x-amz-sdk-checksum-algorithm\"), None);\n    assert_eq!(headers.get(\"x-amz-checksum-crc32\"), None);\n\n    assert_eq!(headers.len(), 2);\n}\n\n#[tokio::test]\nasync fn test_presigned_upload_part() {\n    let presigned = presign(|client| {\n        client\n            .upload_part()\n            .content_length(12345)\n            .bucket(\"bucket\")\n            .key(\"key\")\n            .part_number(0)\n            .upload_id(\"upload-id\")\n    })\n    .await;\n    pretty_assertions::assert_eq!(\n        \"https://bucket.s3.us-east-1.amazonaws.com/key?x-id=UploadPart&partNumber=0&uploadId=upload-id&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ANOTREAL%2F20090213%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20090213T233131Z&X-Amz-Expires=30&X-Amz-SignedHeaders=content-length%3Bhost&X-Amz-Signature=a702867244f0bd1fb4d161e2a062520dcbefae3b9992d2e5366bcd61a60c6ddd&X-Amz-Security-Token=notarealsessiontoken\",\n        presigned.uri().to_string(),\n    );\n}\n\n#[tokio::test]\nasync fn test_presigning_object_lambda() {\n    let presigned = presign(|client| {\n        client\n            .get_object()\n            .bucket(\"arn:aws:s3-object-lambda:us-west-2:123456789012:accesspoint:my-banner-ap-name\")\n            .key(\"test2.txt\")\n    })\n    .await;\n    // since the URI is `my-banner-api-name...` we know EP2 is working properly for presigning\n    pretty_assertions::assert_eq!(\n        \"https://my-banner-ap-name-123456789012.s3-object-lambda.us-west-2.amazonaws.com/test2.txt?x-id=GetObject&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ANOTREAL%2F20090213%2Fus-west-2%2Fs3-object-lambda%2Faws4_request&X-Amz-Date=20090213T233131Z&X-Amz-Expires=30&X-Amz-SignedHeaders=host&X-Amz-Signature=027976453050b6f9cca7af80a59c05ee572b462e0fc1ef564c59412b903fcdf2&X-Amz-Security-Token=notarealsessiontoken\",\n        presigned.uri().to_string()\n    );\n}\n\n#[tokio::test]\nasync fn test_presigned_head_object() {\n    let presigned = presign(|client| client.head_object().bucket(\"bucket\").key(\"key\")).await;\n\n    assert_eq!(\"HEAD\", presigned.method());\n    pretty_assertions::assert_eq!(\n        \"https://bucket.s3.us-east-1.amazonaws.com/key?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ANOTREAL%2F20090213%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20090213T233131Z&X-Amz-Expires=30&X-Amz-SignedHeaders=host&X-Amz-Signature=6b97012e70d5ee3528b5591e0e90c0f45e0fa303506f854eff50ff922751a193&X-Amz-Security-Token=notarealsessiontoken\",\n        presigned.uri().to_string(),\n    );\n}\n\n#[tokio::test]\nasync fn test_presigned_user_provided_checksum() {\n    let presigned = presign(|client| {\n        client\n            .put_object()\n            .checksum_crc64_nvme(\"NotARealChecksum\")\n            .bucket(\"test-bucket\")\n            .key(\"test-key\")\n    })\n    .await;\n\n    // The x-amz-checksum-crc64nvme header is added to the signed headers\n    pretty_assertions::assert_eq!(\n        \"https://test-bucket.s3.us-east-1.amazonaws.com/test-key?x-id=PutObject&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ANOTREAL%2F20090213%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20090213T233131Z&X-Amz-Expires=30&X-Amz-SignedHeaders=host%3Bx-amz-checksum-crc64nvme&X-Amz-Signature=40e6ea102769a53f440db587be0b6898893d9a0f8268d2f8d2315ca0abc42fee&X-Amz-Security-Token=notarealsessiontoken\",\n        presigned.uri().to_string(),\n    );\n\n    // Checksum value header is persisted into the request\n    let headers = presigned.headers().collect::<HashMap<_, _>>();\n    assert_eq!(\n        headers.get(\"x-amz-checksum-crc64nvme\"),\n        Some(&\"NotARealChecksum\")\n    );\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/s3/tests/query-strings-are-correctly-encoded.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n#![cfg(feature = \"test-util\")]\n\nuse aws_credential_types::provider::SharedCredentialsProvider;\nuse aws_sdk_s3::config::{Credentials, Region};\nuse aws_sdk_s3::operation::list_objects_v2::ListObjectsV2Error;\nuse aws_sdk_s3::{Client, Config};\nuse aws_smithy_http_client::test_util::capture_request;\n\n#[tokio::test]\nasync fn test_s3_signer_query_string_with_all_valid_chars() {\n    let (http_client, rcvr) = capture_request(None);\n    let config = Config::builder()\n        .credentials_provider(SharedCredentialsProvider::new(\n            Credentials::for_tests_with_session_token(),\n        ))\n        .region(Region::new(\"us-east-1\"))\n        .http_client(http_client.clone())\n        .with_test_defaults()\n        .build();\n    let client = Client::from_conf(config);\n\n    // Generate a string containing all printable ASCII chars\n    let prefix: String = (32u8..127).map(char::from).collect();\n\n    // The response from the fake connection won't return the expected XML but we don't care about\n    // that error in this test\n    let _ = client\n        .list_objects_v2()\n        .bucket(\"test-bucket\")\n        .prefix(&prefix)\n        .send()\n        .await;\n\n    // As long as a request can be extracted and the `Authorization` header exits, we're good.\n    // We cannot compare a signature in the `Authorization` header between expected and actual\n    // because the signature is subject to change as we update the `x-amz-user-agent` header, e.g.\n    // due to the introduction of a new metric.\n    let expected_req = rcvr.expect_request();\n    let _ = expected_req.headers().get(\"Authorization\").unwrap();\n}\n\n// This test can help identify individual characters that break the signing of query strings. This\n// test must be run against an actual bucket so we `ignore` it unless the runner specifically requests it\n#[tokio::test]\n#[ignore]\n#[allow(deprecated)]\nasync fn test_query_strings_are_correctly_encoded() {\n    use aws_smithy_runtime_api::client::result::SdkError;\n\n    tracing_subscriber::fmt::init();\n    let config = aws_config::load_from_env().await;\n    let client = Client::new(&config);\n\n    let mut chars_that_break_signing = Vec::new();\n    let mut chars_that_break_uri_parsing = Vec::new();\n    let mut chars_that_are_invalid_arguments = Vec::new();\n\n    // We test all possible bytes to check for issues with URL construction or signing\n    for byte in u8::MIN..u8::MAX {\n        let char = char::from(byte);\n        let res = client\n            .list_objects_v2()\n            .bucket(\"a-bucket-to-test-with\")\n            .prefix(char)\n            .send()\n            .await;\n        if let Err(SdkError::ServiceError(context)) = res {\n            let err = context.err();\n            let msg = err.to_string();\n            let unhandled = matches!(err, ListObjectsV2Error::Unhandled(_));\n            if unhandled && msg.contains(\"SignatureDoesNotMatch\") {\n                chars_that_break_signing.push(byte);\n            } else if unhandled && msg.to_string().contains(\"InvalidUri\") {\n                chars_that_break_uri_parsing.push(byte);\n            } else if unhandled && msg.to_string().contains(\"InvalidArgument\") {\n                chars_that_are_invalid_arguments.push(byte);\n            } else if unhandled && msg.to_string().contains(\"InvalidToken\") {\n                panic!(\"refresh your credentials and run this test again\");\n            } else {\n                todo!(\"unexpected error: {:?}\", err);\n            }\n        }\n    }\n\n    if chars_that_break_signing.is_empty()\n        && chars_that_break_uri_parsing.is_empty()\n        && chars_that_are_invalid_arguments.is_empty()\n    {\n        return;\n    }\n\n    fn char_transform(c: u8) -> String {\n        format!(\"byte {}: {}\\n\", c, char::from(c))\n    }\n    if !chars_that_break_signing.is_empty() {\n        eprintln!(\n            \"The following characters caused a signature mismatch:\\n{}(end)\",\n            chars_that_break_signing\n                .clone()\n                .into_iter()\n                .map(char_transform)\n                .collect::<String>()\n        );\n    }\n    if !chars_that_break_uri_parsing.is_empty() {\n        eprintln!(\n            \"The following characters caused a URI parse failure:\\n{}(end)\",\n            chars_that_break_uri_parsing\n                .clone()\n                .into_iter()\n                .map(char_transform)\n                .collect::<String>()\n        );\n    }\n    if !chars_that_are_invalid_arguments.is_empty() {\n        eprintln!(\n            \"The following characters caused an \\\"Invalid Argument\\\" failure:\\n{}(end)\",\n            chars_that_are_invalid_arguments\n                .clone()\n                .into_iter()\n                .map(char_transform)\n                .collect::<String>()\n        );\n    }\n\n    panic!(\"test failed due to invalid characters\")\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/s3/tests/reconnects.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_sdk_s3::config::retry::{ReconnectMode, RetryConfig};\nuse aws_sdk_s3::config::{Credentials, Region, SharedAsyncSleep};\nuse aws_smithy_async::rt::sleep::TokioSleep;\nuse aws_smithy_http_client::test_util::wire::{ev, match_events, ReplayedEvent, WireMockServer};\n\n#[tokio::test]\nasync fn test_disable_reconnect_on_503() {\n    let mock = WireMockServer::start(vec![\n        ReplayedEvent::status(503),\n        ReplayedEvent::status(503),\n        ReplayedEvent::with_body(\"here-is-your-object\"),\n    ])\n    .await;\n\n    let config = aws_sdk_s3::Config::builder()\n        .region(Region::from_static(\"us-east-2\"))\n        .credentials_provider(Credentials::for_tests())\n        .sleep_impl(SharedAsyncSleep::new(TokioSleep::new()))\n        .endpoint_url(mock.endpoint_url())\n        .http_client(mock.http_client())\n        .retry_config(\n            RetryConfig::standard().with_reconnect_mode(ReconnectMode::ReuseAllConnections),\n        )\n        .build();\n    let client = aws_sdk_s3::Client::from_conf(config);\n    let resp = client\n        .get_object()\n        .bucket(\"bucket\")\n        .key(\"key\")\n        .send()\n        .await\n        .expect(\"succeeds after retries\");\n    assert_eq!(\n        resp.body.collect().await.unwrap().to_vec(),\n        b\"here-is-your-object\"\n    );\n    match_events!(\n        ev!(dns),\n        ev!(connect),\n        ev!(http(503)),\n        ev!(http(503)),\n        ev!(http(200))\n    )(&mock.events());\n}\n\n#[tokio::test]\nasync fn test_enabling_reconnect_on_503() {\n    let mock = WireMockServer::start(vec![\n        ReplayedEvent::status(503),\n        ReplayedEvent::status(503),\n        ReplayedEvent::with_body(\"here-is-your-object\"),\n    ])\n    .await;\n\n    let config = aws_sdk_s3::Config::builder()\n        .region(Region::from_static(\"us-east-2\"))\n        .credentials_provider(Credentials::for_tests())\n        .sleep_impl(SharedAsyncSleep::new(TokioSleep::new()))\n        .endpoint_url(mock.endpoint_url())\n        .http_client(mock.http_client())\n        .retry_config(\n            RetryConfig::standard().with_reconnect_mode(ReconnectMode::ReconnectOnTransientError),\n        )\n        .build();\n    let client = aws_sdk_s3::Client::from_conf(config);\n    let resp = client\n        .get_object()\n        .bucket(\"bucket\")\n        .key(\"key\")\n        .send()\n        .await\n        .expect(\"succeeds after retries\");\n    assert_eq!(\n        resp.body.collect().await.unwrap().to_vec(),\n        b\"here-is-your-object\"\n    );\n    match_events!(\n        ev!(dns),\n        ev!(connect),\n        ev!(http(503)),\n        ev!(dns),\n        ev!(connect),\n        ev!(http(503)),\n        ev!(dns),\n        ev!(connect),\n        ev!(http(200))\n    )(&mock.events());\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/s3/tests/recursion-detection.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_config::SdkConfig;\nuse aws_credential_types::provider::SharedCredentialsProvider;\nuse aws_sdk_s3::config::{Credentials, Region};\nuse aws_sdk_s3::Client;\nuse aws_smithy_http_client::test_util::capture_request;\n\n#[tokio::test]\nasync fn recursion_detection_applied() {\n    std::env::set_var(\"AWS_LAMBDA_FUNCTION_NAME\", \"some-function\");\n    std::env::set_var(\"_X_AMZN_TRACE_ID\", \"traceid\");\n    let (http_client, captured_request) = capture_request(None);\n    let sdk_config = SdkConfig::builder()\n        .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests()))\n        .region(Region::new(\"us-east-1\"))\n        .http_client(http_client.clone())\n        .build();\n    let client = Client::new(&sdk_config);\n    let _ = client.list_objects_v2().bucket(\"test-bucket\").send().await;\n    assert_eq!(\n        captured_request\n            .expect_request()\n            .headers()\n            .get(\"x-amzn-trace-id\"),\n        Some(\"traceid\")\n    );\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/s3/tests/request_id.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_sdk_s3::operation::get_object::GetObjectError;\nuse aws_sdk_s3::operation::{RequestId, RequestIdExt};\nuse aws_sdk_s3::{config::Credentials, config::Region, Client, Config};\nuse aws_smithy_http_client::test_util::capture_request;\nuse aws_smithy_types::body::SdkBody;\n\n#[tokio::test]\nasync fn get_request_id_from_modeled_error() {\n    let (http_client, request) = capture_request(Some(\n        http_1x::Response::builder()\n            .header(\"x-amz-request-id\", \"correct-request-id\")\n            .header(\"x-amz-id-2\", \"correct-extended-request-id\")\n            .status(404)\n            .body(SdkBody::from(\n                r#\"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n                <Error>\n                  <Code>NoSuchKey</Code>\n                  <Message>The resource you requested does not exist</Message>\n                  <Resource>/mybucket/myfoto.jpg</Resource>\n                  <RequestId>incorrect-request-id</RequestId>\n                </Error>\"#,\n            ))\n            .unwrap(),\n    ));\n    let config = Config::builder()\n        .http_client(http_client)\n        .credentials_provider(Credentials::for_tests())\n        .region(Region::new(\"us-east-1\"))\n        .build();\n    let client = Client::from_conf(config);\n    let err = client\n        .get_object()\n        .key(\"dontcare\")\n        .bucket(\"dontcare\")\n        .send()\n        .await\n        .expect_err(\"status was 404, this is an error\")\n        .into_service_error();\n    request.expect_request();\n    assert!(\n        matches!(err, GetObjectError::NoSuchKey(_)),\n        \"expected NoSuchKey, got {err:?}\",\n    );\n    assert_eq!(Some(\"correct-request-id\"), err.request_id());\n    assert_eq!(Some(\"correct-request-id\"), err.meta().request_id());\n    assert_eq!(\n        Some(\"correct-extended-request-id\"),\n        err.extended_request_id()\n    );\n    assert_eq!(\n        Some(\"correct-extended-request-id\"),\n        err.meta().extended_request_id()\n    );\n}\n\n#[tokio::test]\n#[allow(deprecated)]\nasync fn get_request_id_from_unmodeled_error() {\n    let (http_client, request) = capture_request(Some(\n        http_1x::Response::builder()\n            .header(\"x-amz-request-id\", \"correct-request-id\")\n            .header(\"x-amz-id-2\", \"correct-extended-request-id\")\n            .status(500)\n            .body(SdkBody::from(\n                r#\"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n                <Error>\n                  <Code>SomeUnmodeledError</Code>\n                  <Message>Something bad happened</Message>\n                  <Resource>/mybucket/myfoto.jpg</Resource>\n                  <RequestId>incorrect-request-id</RequestId>\n                </Error>\"#,\n            ))\n            .unwrap(),\n    ));\n    let config = Config::builder()\n        .http_client(http_client)\n        .credentials_provider(Credentials::for_tests())\n        .region(Region::new(\"us-east-1\"))\n        .retry_config(aws_smithy_types::retry::RetryConfig::disabled())\n        .build();\n    let client = Client::from_conf(config);\n    let err = client\n        .get_object()\n        .bucket(\"dontcare\")\n        .key(\"dontcare\")\n        .send()\n        .await\n        .expect_err(\"status 500\")\n        .into_service_error();\n    request.expect_request();\n    assert!(matches!(err, GetObjectError::Unhandled(_)));\n    assert_eq!(Some(\"correct-request-id\"), err.request_id());\n    assert_eq!(Some(\"correct-request-id\"), err.meta().request_id());\n    assert_eq!(\n        Some(\"correct-extended-request-id\"),\n        err.extended_request_id()\n    );\n    assert_eq!(\n        Some(\"correct-extended-request-id\"),\n        err.meta().extended_request_id()\n    );\n}\n\n#[tokio::test]\nasync fn get_request_id_from_successful_nonstreaming_response() {\n    let (http_client, request) = capture_request(Some(\n        http_1x::Response::builder()\n            .header(\"x-amz-request-id\", \"correct-request-id\")\n            .header(\"x-amz-id-2\", \"correct-extended-request-id\")\n            .status(200)\n            .body(SdkBody::from(\n                r#\"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n                <ListAllMyBucketsResult xmlns=\"http://s3.amazonaws.com/doc/2006-03-01/\">\n                  <Owner><ID>some-id</ID><DisplayName>some-display-name</DisplayName></Owner>\n                  <Buckets></Buckets>\n                </ListAllMyBucketsResult>\"#,\n            ))\n            .unwrap(),\n    ));\n    let config = Config::builder()\n        .http_client(http_client)\n        .credentials_provider(Credentials::for_tests())\n        .region(Region::new(\"us-east-1\"))\n        .build();\n    let client = Client::from_conf(config);\n    let output = client\n        .list_buckets()\n        .send()\n        .await\n        .expect(\"valid successful response\");\n    request.expect_request();\n    assert_eq!(Some(\"correct-request-id\"), output.request_id());\n    assert_eq!(\n        Some(\"correct-extended-request-id\"),\n        output.extended_request_id()\n    );\n}\n\n#[tokio::test]\nasync fn get_request_id_from_successful_streaming_response() {\n    let (http_client, request) = capture_request(Some(\n        http_1x::Response::builder()\n            .header(\"x-amz-request-id\", \"correct-request-id\")\n            .header(\"x-amz-id-2\", \"correct-extended-request-id\")\n            .status(200)\n            .body(SdkBody::from(\"some streaming file data\"))\n            .unwrap(),\n    ));\n    let config = Config::builder()\n        .http_client(http_client)\n        .credentials_provider(Credentials::for_tests())\n        .region(Region::new(\"us-east-1\"))\n        .build();\n    let client = Client::from_conf(config);\n    let output = client\n        .get_object()\n        .key(\"dontcare\")\n        .bucket(\"dontcare\")\n        .send()\n        .await\n        .expect(\"valid successful response\");\n    request.expect_request();\n    assert_eq!(Some(\"correct-request-id\"), output.request_id());\n    assert_eq!(\n        Some(\"correct-extended-request-id\"),\n        output.extended_request_id()\n    );\n}\n\n// Verify that the conversion from operation error to the top-level service error maintains the request ID\n#[tokio::test]\nasync fn conversion_to_service_error_maintains_request_id() {\n    let (http_client, request) = capture_request(Some(\n        http_1x::Response::builder()\n            .header(\"x-amz-request-id\", \"correct-request-id\")\n            .header(\"x-amz-id-2\", \"correct-extended-request-id\")\n            .status(404)\n            .body(SdkBody::from(\n                r#\"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n                <Error>\n                  <Code>NoSuchKey</Code>\n                  <Message>The resource you requested does not exist</Message>\n                  <Resource>/mybucket/myfoto.jpg</Resource>\n                  <RequestId>incorrect-request-id</RequestId>\n                </Error>\"#,\n            ))\n            .unwrap(),\n    ));\n    let config = Config::builder()\n        .http_client(http_client)\n        .credentials_provider(Credentials::for_tests())\n        .region(Region::new(\"us-east-1\"))\n        .build();\n    let client = Client::from_conf(config);\n    let err = client\n        .get_object()\n        .bucket(\"dontcare\")\n        .key(\"dontcare\")\n        .send()\n        .await\n        .expect_err(\"status was 404, this is an error\");\n    request.expect_request();\n    let service_error: aws_sdk_s3::Error = err.into();\n    assert_eq!(Some(\"correct-request-id\"), service_error.request_id());\n    assert_eq!(\n        Some(\"correct-extended-request-id\"),\n        service_error.extended_request_id()\n    );\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/s3/tests/request_information_headers.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_runtime::invocation_id::{InvocationId, PredefinedInvocationIdGenerator};\nuse aws_runtime::user_agent::AwsUserAgent;\nuse aws_sdk_s3::config::interceptors::BeforeSerializationInterceptorContextMut;\nuse aws_sdk_s3::config::interceptors::FinalizerInterceptorContextRef;\nuse aws_sdk_s3::config::retry::RetryConfig;\nuse aws_sdk_s3::config::timeout::TimeoutConfig;\nuse aws_sdk_s3::config::{Credentials, Region};\nuse aws_sdk_s3::config::{Intercept, SharedAsyncSleep};\nuse aws_sdk_s3::Client;\nuse aws_smithy_async::test_util::InstantSleep;\nuse aws_smithy_async::test_util::ManualTimeSource;\nuse aws_smithy_async::time::SharedTimeSource;\nuse aws_smithy_http_client::test_util::dvr::ReplayingClient;\nuse aws_smithy_runtime::test_util::capture_test_logs::capture_test_logs;\nuse aws_smithy_runtime_api::box_error::BoxError;\nuse aws_smithy_runtime_api::client::runtime_components::RuntimeComponents;\nuse aws_smithy_types::config_bag::{ConfigBag, Layer};\nuse std::time::{Duration, UNIX_EPOCH};\n\n// # One SDK operation invocation.\n// # Client retries 3 times, successful response on 3rd attempt.\n// # Fast network, latency + server time is less than one second.\n// # No clock skew\n// # Client waits 1 second between retry attempts.\n#[tokio::test]\nasync fn three_retries_and_then_success() {\n    let _logs = capture_test_logs();\n\n    #[derive(Debug)]\n    struct TimeInterceptor {\n        time_source: ManualTimeSource,\n    }\n    impl Intercept for TimeInterceptor {\n        fn name(&self) -> &'static str {\n            \"TimeInterceptor\"\n        }\n\n        fn modify_before_serialization(\n            &self,\n            _context: &mut BeforeSerializationInterceptorContextMut<'_>,\n            _runtime_components: &RuntimeComponents,\n            cfg: &mut ConfigBag,\n        ) -> Result<(), BoxError> {\n            let mut layer = Layer::new(\"test\");\n            layer.store_put(AwsUserAgent::for_tests());\n            cfg.push_layer(layer);\n            Ok(())\n        }\n\n        fn read_after_attempt(\n            &self,\n            _context: &FinalizerInterceptorContextRef<'_>,\n            _runtime_components: &RuntimeComponents,\n            _cfg: &mut ConfigBag,\n        ) -> Result<(), BoxError> {\n            self.time_source.advance(Duration::from_secs(1));\n            tracing::info!(\n                \"################ ADVANCED TIME BY 1 SECOND, {:?}\",\n                &self.time_source\n            );\n            Ok(())\n        }\n    }\n\n    let time_source = ManualTimeSource::new(UNIX_EPOCH + Duration::from_secs(1559347200));\n\n    let path = \"tests/data/request-information-headers/three-retries_and-then-success.json\";\n    let http_client = ReplayingClient::from_file(path).unwrap();\n    let config = aws_sdk_s3::Config::builder()\n        .credentials_provider(Credentials::for_tests_with_session_token())\n        .region(Region::new(\"us-east-1\"))\n        .http_client(http_client.clone())\n        .time_source(SharedTimeSource::new(time_source.clone()))\n        .sleep_impl(SharedAsyncSleep::new(InstantSleep::new(Default::default())))\n        .retry_config(RetryConfig::standard())\n        .timeout_config(\n            TimeoutConfig::builder()\n                .connect_timeout(Duration::from_secs(10))\n                .read_timeout(Duration::from_secs(10))\n                .build(),\n        )\n        .invocation_id_generator(PredefinedInvocationIdGenerator::new(vec![\n            InvocationId::new_from_str(\"00000000-0000-4000-8000-000000000000\"),\n        ]))\n        .interceptor(TimeInterceptor { time_source })\n        .build();\n    let client = Client::from_conf(config);\n\n    let resp = dbg!(\n        client\n            .list_objects_v2()\n            .bucket(\"test-bucket\")\n            .prefix(\"prefix~\")\n            .send()\n            .await\n    );\n\n    let resp = resp.expect(\"valid e2e test\");\n    assert_eq!(resp.name(), Some(\"test-bucket\"));\n    http_client\n        .relaxed_validate(\"application/xml\")\n        .await\n        .unwrap();\n}\n\n// TODO(simulate time): Currently commented out since the test is work in progress.\n//  Consider using `tick_advance_time_and_sleep` to simulate client and server times.\n// // # Client makes 3 separate SDK operation invocations\n// // # All succeed on first attempt.\n// // # Fast network, latency + server time is less than one second.\n// // - request:\n// //     time: 2019-06-01T00:00:00Z\n// //     headers:\n// //       amz-sdk-invocation-id: 3dfe4f26-c090-4887-8c14-7bac778bca07\n// //       amz-sdk-request: attempt=1; max=3\n// //   response:\n// //     status: 200\n// //     time_received: 2019-06-01T00:00:00Z\n// //     headers:\n// //       Date: Sat, 01 Jun 2019 00:00:00 GMT\n// // - request:\n// //     time: 2019-06-01T00:01:01Z\n// //     headers:\n// //       # Note the different invocation id because it's a new SDK\n// //       # invocation operation.\n// //       amz-sdk-invocation-id: 70370531-7b83-4b90-8b93-46975687ecf6\n// //       amz-sdk-request: ttl=20190601T000011Z; attempt=1; max=3\n// //   response:\n// //     status: 200\n// //     time_received: 2019-06-01T00:00:01Z\n// //     headers:\n// //       Date: Sat, 01 Jun 2019 00:00:01 GMT\n// // - request:\n// //     time: 2019-06-01T00:00:02Z\n// //     headers:\n// //       amz-sdk-invocation-id: 910bf450-6c90-43de-a508-3fa126a06b71\n// //       amz-sdk-request: ttl=20190601T000012Z; attempt=1; max=3\n// //   response:\n// //     status: 200\n// //     time_received: 2019-06-01T00:00:02Z\n// //     headers:\n// //       Date: Sat, 01 Jun 2019 00:00:02 GMT\n// const THREE_SUCCESSFUL_ATTEMPTS_PATH: &str = \"test-data/request-information-headers/three-successful-attempts.json\";\n// #[tokio::test]\n// async fn three_successful_attempts() {\n//     tracing_subscriber::fmt::init();\n//\n//     impl RuntimePlugin for FixupPlugin {\n//         fn configure(\n//             &self,\n//             cfg: &mut ConfigBag,\n//         ) -> Result<(), aws_smithy_runtime_api::client::runtime_plugin::BoxError> {\n//             let params_builder = Params::builder()\n//                 .set_region(self.client.conf().region().map(|c| c.as_ref().to_string()))\n//                 .bucket(\"test-bucket\");\n//\n//             cfg.put(params_builder);\n//             cfg.set_request_time(RequestTime::new(self.timestamp.clone()));\n//             cfg.put(AwsUserAgent::for_tests());\n//             cfg.put(InvocationId::for_tests());\n//             Ok(())\n//         }\n//     }\n//\n//     let conn = dvr::ReplayingConnection::from_file(THREE_SUCCESSFUL_ATTEMPTS_PATH).unwrap();\n//     let config = aws_sdk_s3::Config::builder()\n//         .credentials_provider(Credentials::for_tests())\n//         .region(Region::new(\"us-east-1\"))\n//         .http_client(DynConnector::new(conn.clone()))\n//         .build();\n//     let client = Client::from_conf(config);\n//     let fixup = FixupPlugin {\n//         client: client.clone(),\n//         timestamp: UNIX_EPOCH + Duration::from_secs(1624036048),\n//     };\n//\n//     let resp = dbg!(\n//         client\n//             .list_objects_v2()\n//             .bucket(\"test-bucket\")\n//             .prefix(\"prefix~\")\n//             .send_v2_with_plugin(Some(fixup))\n//             .await\n//     );\n//\n//     let resp = resp.expect(\"valid e2e test\");\n//     assert_eq!(resp.name(), Some(\"test-bucket\"));\n//     conn.full_validate(MediaType::Xml).await.expect(\"failed\")\n// }\n\n// TODO(simulate time): Currently commented out since the test is work in progress.\n//  Consider using `tick_advance_time_and_sleep` to simulate client and server times.\n// // # One SDK operation invocation.\n// // # Client retries 3 times, successful response on 3rd attempt.\n// // # Slow network, one way latency is 2 seconds.\n// // # Server takes 1 second to generate response.\n// // # Client clock is 10 minutes behind server clock.\n// // # One second delay between retries.\n// // - request:\n// //     time: 2019-06-01T00:00:00Z\n// //     headers:\n// //       amz-sdk-invocation-id: 3dfe4f26-c090-4887-8c14-7bac778bca07\n// //       amz-sdk-request: attempt=1; max=3\n// //   response:\n// //     status: 500\n// //     time_received: 2019-06-01T00:00:05Z\n// //     headers:\n// //       Date: Sat, 01 Jun 2019 00:10:03 GMT\n// // - request:\n// //     time: 2019-06-01T00:00:06Z\n// //     # The ttl is 00:00:16 with the client clock,\n// //     # but accounting for skew we have\n// //     # 00:10:03 - 00:00:05 = 00:09:58\n// //     # ttl = 00:00:16 + 00:09:58 = 00:10:14\n// //     headers:\n// //       amz-sdk-invocation-id: 3dfe4f26-c090-4887-8c14-7bac778bca07\n// //       amz-sdk-request: ttl=20190601T001014Z; attempt=2; max=3\n// //   response:\n// //     status: 500\n// //     time_received: 2019-06-01T00:00:11Z\n// //     headers:\n// //       Date: Sat, 01 Jun 2019 00:10:09 GMT\n// // - request:\n// //     time: 2019-06-01T00:00:12Z\n// //     headers:\n// //       # ttl = 00:00:12 + 20 = 00:00:22\n// //       # skew is:\n// //       # 00:10:09 - 00:00:11\n// //       amz-sdk-invocation-id: 3dfe4f26-c090-4887-8c14-7bac778bca07\n// //       amz-sdk-request: ttl=20190601T001020Z; attempt=3; max=3\n// //   response:\n// //     status: 200\n// //     time_received: 2019-06-01T00:00:17Z\n// //     headers:\n// //       Date: Sat, 01 Jun 2019 00:10:15 GMT\n// const SLOW_NETWORK_AND_LATE_CLIENT_CLOCK_PATH: &str = \"test-data/request-information-headers/slow-network-and-late-client-clock.json\";\n// #[tokio::test]\n// async fn slow_network_and_late_client_clock() {\n//     tracing_subscriber::fmt::init();\n//\n//     impl RuntimePlugin for FixupPlugin {\n//         fn configure(\n//             &self,\n//             cfg: &mut ConfigBag,\n//         ) -> Result<(), aws_smithy_runtime_api::client::runtime_plugin::BoxError> {\n//             let params_builder = Params::builder()\n//                 .set_region(self.client.conf().region().map(|c| c.as_ref().to_string()))\n//                 .bucket(\"test-bucket\");\n//\n//             cfg.put(params_builder);\n//             cfg.set_request_time(RequestTime::new(self.timestamp.clone()));\n//             cfg.put(AwsUserAgent::for_tests());\n//             cfg.put(InvocationId::for_tests());\n//             Ok(())\n//         }\n//     }\n//\n//     let conn = dvr::ReplayingConnection::from_file(SLOW_NETWORK_AND_LATE_CLIENT_CLOCK_PATH).unwrap();\n//     let config = aws_sdk_s3::Config::builder()\n//         .credentials_provider(Credentials::for_tests())\n//         .region(Region::new(\"us-east-1\"))\n//         .http_client(DynConnector::new(conn.clone()))\n//         .build();\n//     let client = Client::from_conf(config);\n//     let fixup = FixupPlugin {\n//         client: client.clone(),\n//         timestamp: UNIX_EPOCH + Duration::from_secs(1624036048),\n//     };\n//\n//     let resp = dbg!(\n//         client\n//             .list_objects_v2()\n//             .bucket(\"test-bucket\")\n//             .prefix(\"prefix~\")\n//             .send_v2_with_plugin(Some(fixup))\n//             .await\n//     );\n//\n//     let resp = resp.expect(\"valid e2e test\");\n//     assert_eq!(resp.name(), Some(\"test-bucket\"));\n//     conn.full_validate(MediaType::Xml).await.expect(\"failed\")\n// }\n"
  },
  {
    "path": "aws/sdk/integration-tests/s3/tests/required-query-params.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_sdk_s3::config::{Credentials, Region};\nuse aws_sdk_s3::error::DisplayErrorContext;\nuse aws_sdk_s3::Client;\nuse aws_smithy_http_client::test_util::capture_request;\nuse aws_smithy_types::error::operation::BuildError;\n\n#[tokio::test]\nasync fn test_error_when_required_query_param_is_unset() {\n    let (http_client, _request) = capture_request(None);\n    let config = aws_sdk_s3::Config::builder()\n        .http_client(http_client)\n        .credentials_provider(Credentials::for_tests())\n        .region(Region::new(\"us-east-1\"))\n        .build();\n    let client = Client::from_conf(config);\n\n    let err = client\n        .abort_multipart_upload()\n        .bucket(\"test-bucket\")\n        .key(\"test.txt\")\n        .send()\n        .await\n        .unwrap_err();\n    let expected = BuildError::missing_field(\"upload_id\", \"cannot be empty or unset\").to_string();\n    let actual = format!(\"{}\", DisplayErrorContext(err));\n    assert!(\n        actual.contains(&expected),\n        \"expected error to contain '{expected}', but was '{actual}'\",\n    )\n}\n\n#[tokio::test]\nasync fn test_error_when_required_query_param_is_set_but_empty() {\n    let (http_client, _request) = capture_request(None);\n    let config = aws_sdk_s3::Config::builder()\n        .http_client(http_client)\n        .credentials_provider(Credentials::for_tests())\n        .region(Region::new(\"us-east-1\"))\n        .build();\n    let client = Client::from_conf(config);\n\n    let err = client\n        .abort_multipart_upload()\n        .bucket(\"test-bucket\")\n        .key(\"test.txt\")\n        .upload_id(\"\")\n        .send()\n        .await\n        .unwrap_err();\n\n    let expected = BuildError::missing_field(\"upload_id\", \"cannot be empty or unset\").to_string();\n    let actual = format!(\"{}\", DisplayErrorContext(err));\n    assert!(\n        actual.contains(&expected),\n        \"expected error to contain '{expected}', but was '{actual}'\",\n    )\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/s3/tests/retry-classifier-customization.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_sdk_s3::config::interceptors::InterceptorContext;\nuse aws_sdk_s3::config::retry::{ClassifyRetry, RetryAction, RetryConfig};\nuse aws_sdk_s3::config::SharedAsyncSleep;\nuse aws_smithy_async::rt::sleep::TokioSleep;\nuse aws_smithy_http_client::test_util::{ReplayEvent, StaticReplayClient};\nuse aws_smithy_runtime_api::client::retries::classifiers::RetryClassifierPriority;\nuse aws_smithy_types::body::SdkBody;\nuse std::sync::{Arc, Mutex};\n\n#[derive(Debug, Clone)]\nstruct CustomizationTestClassifier {\n    counter: Arc<Mutex<u8>>,\n}\n\nimpl CustomizationTestClassifier {\n    pub fn new() -> Self {\n        Self {\n            counter: Arc::new(Mutex::new(0u8)),\n        }\n    }\n\n    pub fn counter(&self) -> u8 {\n        *self.counter.lock().unwrap()\n    }\n}\n\nimpl ClassifyRetry for CustomizationTestClassifier {\n    fn classify_retry(&self, ctx: &InterceptorContext) -> RetryAction {\n        *self.counter.lock().unwrap() += 1;\n\n        // Interceptors may call this classifier before a response is received. If a response was received,\n        // ensure that it has the expected status code.\n        if let Some(res) = ctx.response() {\n            assert_eq!(\n                500,\n                res.status().as_u16(),\n                \"expected a 500 response from test connection\"\n            );\n        }\n\n        RetryAction::RetryForbidden\n    }\n\n    fn name(&self) -> &'static str {\n        \"Custom Retry Classifier\"\n    }\n}\n\nfn req() -> http_1x::Request<SdkBody> {\n    http_1x::Request::builder()\n        .body(SdkBody::from(\"request body\"))\n        .unwrap()\n}\n\nfn ok() -> http_1x::Response<SdkBody> {\n    http_1x::Response::builder()\n        .status(200)\n        .body(SdkBody::from(\"Hello!\"))\n        .unwrap()\n}\n\nfn err() -> http_1x::Response<SdkBody> {\n    http_1x::Response::builder()\n        .status(500)\n        .body(SdkBody::from(\"This was an error\"))\n        .unwrap()\n}\n\n#[tokio::test]\nasync fn test_retry_classifier_customization_for_service() {\n    let http_client = StaticReplayClient::new(vec![\n        ReplayEvent::new(req(), err()),\n        ReplayEvent::new(req(), ok()),\n    ]);\n\n    let customization_test_classifier = CustomizationTestClassifier::new();\n\n    let config = aws_sdk_s3::Config::builder()\n        .with_test_defaults()\n        .sleep_impl(SharedAsyncSleep::new(TokioSleep::new()))\n        .http_client(http_client)\n        .retry_config(RetryConfig::standard())\n        .retry_classifier(customization_test_classifier.clone())\n        .build();\n\n    let client = aws_sdk_s3::Client::from_conf(config);\n    let _ = client\n        .get_object()\n        .bucket(\"bucket\")\n        .key(\"key\")\n        .send()\n        .await\n        .expect_err(\"fails without attempting a retry\");\n\n    // ensure our custom retry classifier was called at least once.\n    assert_ne!(customization_test_classifier.counter(), 0);\n}\n\n#[tokio::test]\nasync fn test_retry_classifier_customization_for_operation() {\n    let http_client = StaticReplayClient::new(vec![\n        ReplayEvent::new(req(), err()),\n        ReplayEvent::new(req(), ok()),\n    ]);\n\n    let customization_test_classifier = CustomizationTestClassifier::new();\n\n    let config = aws_sdk_s3::Config::builder()\n        .with_test_defaults()\n        .sleep_impl(SharedAsyncSleep::new(TokioSleep::new()))\n        .http_client(http_client)\n        .retry_config(RetryConfig::standard())\n        .build();\n\n    let client = aws_sdk_s3::Client::from_conf(config);\n    let _ = client\n        .get_object()\n        .bucket(\"bucket\")\n        .key(\"key\")\n        .customize()\n        .config_override(\n            aws_sdk_s3::config::Config::builder()\n                .retry_classifier(customization_test_classifier.clone()),\n        )\n        .send()\n        .await\n        .expect_err(\"fails without attempting a retry\");\n\n    // ensure our custom retry classifier was called at least once.\n    assert_ne!(customization_test_classifier.counter(), 0);\n}\n\n#[derive(Debug, Clone)]\nstruct OrderingTestClassifier {\n    counter: Arc<Mutex<u8>>,\n    name: &'static str,\n    priority: RetryClassifierPriority,\n}\n\nimpl OrderingTestClassifier {\n    pub fn new(name: &'static str, priority: RetryClassifierPriority) -> Self {\n        Self {\n            counter: Arc::new(Mutex::new(0u8)),\n            name,\n            priority,\n        }\n    }\n\n    pub fn counter(&self) -> u8 {\n        *self.counter.lock().unwrap()\n    }\n}\n\nimpl ClassifyRetry for OrderingTestClassifier {\n    fn classify_retry(&self, _ctx: &InterceptorContext) -> RetryAction {\n        tracing::debug!(\"Running classifier {}\", self.name);\n        *self.counter.lock().unwrap() += 1;\n        RetryAction::NoActionIndicated\n    }\n\n    fn name(&self) -> &'static str {\n        \"Ordering Test Retry Classifier\"\n    }\n\n    fn priority(&self) -> RetryClassifierPriority {\n        self.priority.clone()\n    }\n}\n\n#[tracing_test::traced_test]\n#[tokio::test]\nasync fn test_retry_classifier_customization_ordering() {\n    let http_client = StaticReplayClient::new(vec![\n        ReplayEvent::new(req(), err()),\n        ReplayEvent::new(req(), ok()),\n    ]);\n\n    let classifier_a = OrderingTestClassifier::new(\"6\", RetryClassifierPriority::default());\n    let classifier_b = OrderingTestClassifier::new(\n        \"5\",\n        RetryClassifierPriority::run_before(classifier_a.priority()),\n    );\n    let classifier_c = OrderingTestClassifier::new(\n        \"4\",\n        RetryClassifierPriority::run_before(classifier_b.priority()),\n    );\n    let classifier_d = OrderingTestClassifier::new(\n        \"3\",\n        RetryClassifierPriority::run_before(classifier_c.priority()),\n    );\n    let classifier_e = OrderingTestClassifier::new(\n        \"2\",\n        RetryClassifierPriority::run_before(classifier_d.priority()),\n    );\n    let classifier_f = OrderingTestClassifier::new(\n        \"1\",\n        RetryClassifierPriority::run_before(classifier_e.priority()),\n    );\n\n    let config = aws_sdk_s3::Config::builder()\n        .with_test_defaults()\n        .sleep_impl(SharedAsyncSleep::new(TokioSleep::new()))\n        .http_client(http_client)\n        .retry_config(RetryConfig::standard())\n        .retry_classifier(classifier_d.clone())\n        .retry_classifier(classifier_b.clone())\n        .retry_classifier(classifier_f.clone())\n        .build();\n\n    let client = aws_sdk_s3::Client::from_conf(config);\n    let _ = client\n        .get_object()\n        .bucket(\"bucket\")\n        .key(\"key\")\n        .customize()\n        .config_override(\n            aws_sdk_s3::config::Config::builder()\n                .retry_classifier(classifier_c.clone())\n                .retry_classifier(classifier_a.clone())\n                .retry_classifier(classifier_e.clone()),\n        )\n        .send()\n        .await\n        .expect_err(\"fails without attempting a retry\");\n\n    // ensure our classifiers were each called at least once.\n    assert_ne!(classifier_a.counter(), 0, \"classifier_a was never called\");\n    assert_ne!(classifier_b.counter(), 0, \"classifier_b was never called\");\n    assert_ne!(classifier_c.counter(), 0, \"classifier_c was never called\");\n    assert_ne!(classifier_d.counter(), 0, \"classifier_d was never called\");\n    assert_ne!(classifier_e.counter(), 0, \"classifier_e was never called\");\n    assert_ne!(classifier_f.counter(), 0, \"classifier_f was never called\");\n\n    // ensure the classifiers were called in the correct order.\n    logs_assert(|lines: &[&str]| {\n        let mut found_log_a = false;\n        let mut line_iter = lines.iter();\n\n        while found_log_a == false {\n            match line_iter.next() {\n                Some(&line) => {\n                    if line.contains(\"Running classifier 1\") {\n                        found_log_a = true;\n                    }\n                }\n                None => {\n                    return Err(\"Couldn't find log line for classifier 1\".to_owned());\n                }\n            }\n        }\n\n        for i in 2..=6 {\n            match line_iter.next() {\n                Some(&line) => {\n                    if line.contains(&format!(\"Running classifier {i}\")) {\n                        // pass\n                    } else {\n                        return Err(format!(\"Expected to find log line for classifier {i} after {} but found '{line}'\", i - 1));\n                    }\n                }\n                None => {\n                    return Err(format!(\"Logs ended earlier than expected ({i})\"));\n                }\n            }\n        }\n\n        Ok(())\n    });\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/s3/tests/select-object-content.json",
    "content": "[\n  {\n    \"connection_id\": 0,\n    \"action\": {\n      \"Request\": {\n        \"request\": {\n          \"uri\": \"https://aws-rust-sdk.s3.us-east-2.amazonaws.com/sample_data.csv?select&select-type=2\",\n          \"headers\": {\n            \"x-amz-date\": [\n              \"20211126T205841Z\"\n            ],\n            \"x-amz-content-sha256\": [\n              \"591d6c5a9bb1019b499d65fb01a6e473346ad65f2b513f03e17e388b3c788f53\"\n            ],\n            \"content-type\": [\n              \"application/xml\"\n            ],\n            \"user-agent\": [\n              \"aws-sdk-rust/0.0.26-alpha os/macos lang/rust/1.53.0\"\n            ],\n            \"x-amz-user-agent\": [\n              \"aws-sdk-rust/0.0.26-alpha api/s3/0.0.26-alpha os/macos lang/rust/1.53.0\"\n            ],\n            \"authorization\": [\n              \"AWS4-HMAC-SHA256 Credential=test/20211126/us-east-2/s3/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-content-sha256;x-amz-date;x-amz-user-agent, Signature=c7fd94cc4ec7b902c0d606919a350927c0cdcd625e7a0135c4bfa213dcedd4c1\"\n            ],\n            \"content-length\": [\n              \"415\"\n            ]\n          },\n          \"method\": \"POST\"\n        }\n      }\n    }\n  },\n  {\n    \"connection_id\": 0,\n    \"action\": {\n      \"Data\": {\n        \"data\": {\n          \"Utf8\": \"<SelectObjectContentRequest xmlns=\\\"http://s3.amazonaws.com/doc/2006-03-01/\\\"><Expression>SELECT * FROM s3object s WHERE s.&quot;Name&quot; = &apos;Jane&apos;</Expression><ExpressionType>SQL</ExpressionType><InputSerialization><CSV><FileHeaderInfo>USE</FileHeaderInfo></CSV><CompressionType>NONE</CompressionType></InputSerialization><OutputSerialization><CSV></CSV></OutputSerialization></SelectObjectContentRequest>\"\n        },\n        \"direction\": \"Request\"\n      }\n    }\n  },\n  {\n    \"connection_id\": 0,\n    \"action\": {\n      \"Eof\": {\n        \"ok\": true,\n        \"direction\": \"Request\"\n      }\n    }\n  },\n  {\n    \"connection_id\": 0,\n    \"action\": {\n      \"Response\": {\n        \"response\": {\n          \"Ok\": {\n            \"status\": 200,\n            \"version\": \"HTTP/1.1\",\n            \"headers\": {\n              \"server\": [\n                \"AmazonS3\"\n              ],\n              \"x-amz-id-2\": [\n                \"geaWcKlzoJpu+EJLNG+t9uaD/9EOuQzGqcxL41SguR9xoDOVMFnjw7CFLm/yHQc3AVpHqHCo3a0=\"\n              ],\n              \"date\": [\n                \"Tue, 31 Aug 2021 01:00:52 GMT\"\n              ],\n              \"transfer-encoding\": [\n                \"chunked\"\n              ],\n              \"x-amz-request-id\": [\n                \"NVKMNP55BP15194G\"\n              ]\n            }\n          }\n        }\n      }\n    }\n  },\n  {\n    \"connection_id\": 0,\n    \"action\": {\n      \"Data\": {\n        \"data\": {\n          \"Base64\": \"AAAAjAAAAFUKNSeBDTptZXNzYWdlLXR5cGUHAAVldmVudAs6ZXZlbnQtdHlwZQcAB1JlY29yZHMNOmNvbnRlbnQtdHlwZQcAGGFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbUphbmUsKDk0OSkgNTU1LTY3MDQsQ2hpY2FnbyxEZXZlbG9wZXINCuadLyI=\"\n        },\n        \"direction\": \"Response\"\n      }\n    }\n  },\n  {\n    \"connection_id\": 0,\n    \"action\": {\n      \"Data\": {\n        \"data\": {\n          \"Base64\": \"AAAA0AAAAEMDArAaDTptZXNzYWdlLXR5cGUHAAVldmVudAs6ZXZlbnQtdHlwZQcABVN0YXRzDTpjb250ZW50LXR5cGUHAAh0ZXh0L3htbDxTdGF0cyB4bWxucz0iIj48Qnl0ZXNTY2FubmVkPjMzMzwvQnl0ZXNTY2FubmVkPjxCeXRlc1Byb2Nlc3NlZD4zMzM8L0J5dGVzUHJvY2Vzc2VkPjxCeXRlc1JldHVybmVkPjM5PC9CeXRlc1JldHVybmVkPjwvU3RhdHM+Ey79egAAADgAAAAowcaE1A06bWVzc2FnZS10eXBlBwAFZXZlbnQLOmV2ZW50LXR5cGUHAANFbmTPl9OS\"\n        },\n        \"direction\": \"Response\"\n      }\n    }\n  },\n  {\n    \"connection_id\": 0,\n    \"action\": {\n      \"Eof\": {\n        \"ok\": true,\n        \"direction\": \"Response\"\n      }\n    }\n  }\n]\n"
  },
  {
    "path": "aws/sdk/integration-tests/s3/tests/select-object-content.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_config::SdkConfig;\nuse aws_credential_types::provider::SharedCredentialsProvider;\nuse aws_sdk_s3::config::{Credentials, Region};\nuse aws_sdk_s3::types::{\n    CompressionType, CsvInput, CsvOutput, ExpressionType, FileHeaderInfo, InputSerialization,\n    OutputSerialization, SelectObjectContentEventStream,\n};\nuse aws_sdk_s3::Client;\nuse aws_smithy_http_client::test_util::dvr::{Event, ReplayingClient};\nuse aws_smithy_protocol_test::{assert_ok, validate_body, MediaType};\nuse std::error::Error;\n\n#[tokio::test]\nasync fn test_success() {\n    let events: Vec<Event> =\n        serde_json::from_str(include_str!(\"select-object-content.json\")).unwrap();\n    let replayer = ReplayingClient::new(events);\n    let sdk_config = SdkConfig::builder()\n        .region(Region::from_static(\"us-east-2\"))\n        .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests()))\n        .http_client(replayer.clone())\n        .build();\n    let client = Client::new(&sdk_config);\n\n    let mut output = client\n        .select_object_content()\n        .bucket(\"aws-rust-sdk\")\n        .key(\"sample_data.csv\")\n        .expression_type(ExpressionType::Sql)\n        .expression(\"SELECT * FROM s3object s WHERE s.\\\"Name\\\" = 'Jane'\")\n        .input_serialization(\n            InputSerialization::builder()\n                .csv(\n                    CsvInput::builder()\n                        .file_header_info(FileHeaderInfo::Use)\n                        .build(),\n                )\n                .compression_type(CompressionType::None)\n                .build(),\n        )\n        .output_serialization(\n            OutputSerialization::builder()\n                .csv(CsvOutput::builder().build())\n                .build(),\n        )\n        .send()\n        .await\n        .unwrap();\n\n    let mut received = Vec::new();\n    while let Some(event) = output.payload.recv().await.unwrap() {\n        match event {\n            SelectObjectContentEventStream::Records(records) => {\n                received.push(\n                    std::str::from_utf8(records.payload.as_ref().unwrap().as_ref())\n                        .unwrap()\n                        .trim()\n                        .to_string(),\n                );\n            }\n            SelectObjectContentEventStream::Stats(stats) => {\n                let stats = stats.details.unwrap();\n                received.push(format!(\n                    \"scanned:{},processed:{},returned:{}\",\n                    stats.bytes_scanned.unwrap(),\n                    stats.bytes_processed.unwrap(),\n                    stats.bytes_returned.unwrap()\n                ))\n            }\n            SelectObjectContentEventStream::End(_) => {}\n            otherwise => panic!(\"unexpected message: {:?}\", otherwise),\n        }\n    }\n    assert_eq!(\n        vec![\n            \"Jane,(949) 555-6704,Chicago,Developer\".to_string(),\n            \"scanned:333,processed:333,returned:39\".to_string()\n        ],\n        received\n    );\n\n    // Validate the requests\n    replayer\n        .validate(&[\"content-type\", \"content-length\"], body_validator)\n        .await\n        .unwrap();\n}\n\nfn body_validator(expected_body: &[u8], actual_body: &[u8]) -> Result<(), Box<dyn Error>> {\n    let expected = std::str::from_utf8(expected_body).unwrap();\n    let actual = std::str::from_utf8(actual_body).unwrap();\n    assert_ok(validate_body(actual, expected, MediaType::Xml));\n    Ok(())\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/s3/tests/service_timeout_overrides.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_credential_types::provider::SharedCredentialsProvider;\nuse aws_credential_types::Credentials;\nuse aws_smithy_async::assert_elapsed;\nuse aws_smithy_async::rt::sleep::{SharedAsyncSleep, TokioSleep};\nuse aws_smithy_http_client::test_util::NeverClient;\nuse aws_smithy_runtime::test_util::capture_test_logs::capture_test_logs;\nuse aws_smithy_runtime_api::client::behavior_version::BehaviorVersion;\nuse aws_smithy_runtime_api::client::result::SdkError;\nuse aws_smithy_types::retry::RetryConfig;\nuse aws_smithy_types::timeout::TimeoutConfig;\nuse aws_types::region::Region;\nuse aws_types::SdkConfig;\nuse std::time::Duration;\nuse tokio::time::Instant;\n\n/// Use a 5 second operation timeout on SdkConfig and a 0ms operation timeout on the service config\n#[tokio::test]\nasync fn timeouts_can_be_set_by_service() {\n    let (_guard, _) = capture_test_logs();\n    let sdk_config = SdkConfig::builder()\n        .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests()))\n        .region(Region::from_static(\"us-east-1\"))\n        .sleep_impl(SharedAsyncSleep::new(TokioSleep::new()))\n        .retry_config(RetryConfig::disabled())\n        .timeout_config(\n            TimeoutConfig::builder()\n                .operation_timeout(Duration::from_secs(5))\n                .read_timeout(Duration::from_secs(1))\n                .build(),\n        )\n        .http_client(NeverClient::new())\n        // ip that\n        .endpoint_url(\n            // Emulate a connect timeout error by hitting an unroutable IP\n            \"http://172.255.255.0:18104\",\n        )\n        .build();\n    let config = aws_sdk_s3::config::Builder::from(&sdk_config)\n        .timeout_config(\n            TimeoutConfig::builder()\n                .operation_timeout(Duration::from_secs(0))\n                .build(),\n        )\n        .build();\n\n    let client = aws_sdk_s3::Client::from_conf(config);\n    let start = Instant::now();\n    let err = client\n        .get_object()\n        .key(\"foo\")\n        .bucket(\"bar\")\n        .send()\n        .await\n        .expect_err(\"unroutable IP should timeout\");\n    match err {\n        SdkError::TimeoutError(_err) => { /* ok */ }\n        // if the connect timeout is not respected, this times out after 5 seconds because of the operation timeout with `SdkError::Timeout`\n        _other => panic!(\"unexpected error: {:?}\", _other),\n    }\n    // there should be a 0ms timeout, we gotta set some stuff up. Just want to make sure\n    // it's shorter than the 5 second timeout if the test is broken\n    assert!(start.elapsed() < Duration::from_millis(500));\n}\n\n/// Ensures that a default timeout from aws-config is still persisted even if an operation_timeout\n/// is set.\n#[tokio::test]\nasync fn default_connect_timeout_set() {\n    let (_guard, _) = capture_test_logs();\n    let sdk_config = aws_config::defaults(BehaviorVersion::latest())\n        .test_credentials()\n        .region(Region::from_static(\"us-east-1\"))\n        .timeout_config(\n            TimeoutConfig::builder()\n                .operation_timeout(Duration::from_secs(10))\n                .build(),\n        )\n        .retry_config(RetryConfig::disabled())\n        // ip that\n        .endpoint_url(\n            // Emulate a connect timeout error by hitting an unroutable IP\n            \"http://172.255.255.0:18104\",\n        )\n        .load()\n        .await;\n    assert_eq!(\n        sdk_config.timeout_config(),\n        Some(\n            &TimeoutConfig::builder()\n                .connect_timeout(Duration::from_millis(3100))\n                .operation_timeout(Duration::from_secs(10))\n                .build()\n        )\n    );\n    assert_eq!(\n        sdk_config.endpoint_url(),\n        Some(\"http://172.255.255.0:18104\")\n    );\n\n    let config = aws_sdk_s3::config::Builder::from(&sdk_config)\n        // .endpoint_url(\"http://172.255.255.0:18104\")\n        .timeout_config(\n            TimeoutConfig::builder()\n                .operation_attempt_timeout(Duration::from_secs(8))\n                .build(),\n        )\n        .build();\n\n    let client = aws_sdk_s3::Client::from_conf(config);\n    let start = Instant::now();\n    let err = client\n        .get_object()\n        .key(\"foo\")\n        .bucket(\"bar\")\n        .send()\n        .await\n        .expect_err(\"unroutable IP should timeout\");\n    assert!(\n        matches!(err, SdkError::DispatchFailure { .. }),\n        \"expected DispatchFailure got {}\",\n        err\n    );\n    // ensure that of the three timeouts, the one we hit is connect timeout.\n    assert_elapsed!(\n        start,\n        Duration::from_millis(3100),\n        Duration::from_millis(1000)\n    );\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/s3/tests/signing-it.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n#![cfg(feature = \"test-util\")]\n\nuse aws_credential_types::provider::SharedCredentialsProvider;\nuse aws_sdk_s3::config::{Credentials, Region};\nuse aws_sdk_s3::primitives::ByteStream;\nuse aws_sdk_s3::{Client, Config};\nuse aws_smithy_http_client::test_util::{capture_request, ReplayEvent, StaticReplayClient};\nuse aws_smithy_types::body::SdkBody;\nuse http_1x::header::AUTHORIZATION;\n\n#[tokio::test]\nasync fn test_signer() {\n    let http_client = StaticReplayClient::new(vec![ReplayEvent::new(\n        http_1x::Request::builder()\n            .header(\"authorization\", \"AWS4-HMAC-SHA256 Credential=ANOTREAL/20090213/us-east-1/s3/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date;x-amz-user-agent, Signature=27e3f59ec3cffaa10e4f1c92112e8fb62d468a04cd32be39e68215f830404dbb\")\n            .uri(\"https://test-bucket.s3.us-east-1.amazonaws.com/?list-type=2&prefix=prefix~\")\n            .body(SdkBody::empty())\n            .unwrap(),\n        http_1x::Response::builder().status(200).body(SdkBody::empty()).unwrap(),\n    )]);\n    let config = Config::builder()\n        .credentials_provider(SharedCredentialsProvider::new(\n            Credentials::for_tests_with_session_token(),\n        ))\n        .region(Region::new(\"us-east-1\"))\n        .http_client(http_client.clone())\n        .with_test_defaults()\n        .build();\n    let client = Client::from_conf(config);\n    let _ = client\n        .list_objects_v2()\n        .bucket(\"test-bucket\")\n        .prefix(\"prefix~\")\n        .send()\n        .await;\n\n    http_client.assert_requests_match(&[AUTHORIZATION.as_str()]);\n}\n\n#[tokio::test]\nasync fn disable_payload_signing_works() {\n    let (http_client, request) = capture_request(None);\n    let conf = aws_sdk_s3::Config::builder()\n        .with_test_defaults()\n        .behavior_version_latest()\n        .region(Region::new(\"us-east-1\"))\n        .http_client(http_client)\n        .build();\n    let client = aws_sdk_s3::Client::from_conf(conf);\n    let _ = client\n        .put_object()\n        .bucket(\"XXXXXXXXXXX\")\n        .key(\"test-key\")\n        .body(ByteStream::from_static(b\"Hello, world!\"))\n        .customize()\n        .disable_payload_signing()\n        .send()\n        .await;\n\n    let request = request.expect_request();\n    let x_amz_content_sha256 = request\n        .headers()\n        .get(\"x-amz-content-sha256\")\n        .expect(\"x-amz-content-sha256 is set\")\n        .to_owned();\n    assert_eq!(\"UNSIGNED-PAYLOAD\", x_amz_content_sha256);\n}\n\n// This test ensures that the request checksum interceptor payload signing\n// override takes priority over the runtime plugin's override. If it didn't,\n// then disabling payload signing would cause requests to incorrectly omit\n// trailers.\n#[tokio::test]\nasync fn disable_payload_signing_works_with_checksums() {\n    let (http_client, request) = capture_request(None);\n    let conf = aws_sdk_s3::Config::builder()\n        .with_test_defaults()\n        .behavior_version_latest()\n        .region(Region::new(\"us-east-1\"))\n        .http_client(http_client)\n        .build();\n    let client = aws_sdk_s3::Client::from_conf(conf);\n\n    // ByteStreams created from a file are streaming and have a known size\n    let mut file = tempfile::NamedTempFile::new().unwrap();\n    use std::io::Write;\n    file.write_all(b\"Hello, world!\").unwrap();\n\n    let body = aws_sdk_s3::primitives::ByteStream::read_from()\n        .path(file.path())\n        .buffer_size(1024)\n        .build()\n        .await\n        .unwrap();\n\n    let _ = client\n        .put_object()\n        .bucket(\"XXXXXXXXXXX\")\n        .key(\"test-key\")\n        .body(body)\n        .checksum_algorithm(aws_sdk_s3::types::ChecksumAlgorithm::Crc32)\n        .customize()\n        .disable_payload_signing()\n        .send()\n        .await;\n\n    let request = request.expect_request();\n    let x_amz_content_sha256 = request\n        .headers()\n        .get(\"x-amz-content-sha256\")\n        .expect(\"x-amz-content-sha256 is set\")\n        .to_owned();\n    // The checksum interceptor sets this.\n    assert_eq!(\"STREAMING-UNSIGNED-PAYLOAD-TRAILER\", x_amz_content_sha256);\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/s3/tests/sigv4a_signing_region_set.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_sdk_s3::config::Region;\nuse aws_sdk_s3::{Client, Config};\nuse aws_smithy_http_client::test_util::capture_request;\nuse aws_types::region::SigningRegionSet;\n\n// Verify that a user-configured signing region set is applied during SigV4a signing.\n\n#[tokio::test]\nasync fn sigv4a_signing_region_set_on_service_config() {\n    let (http_client, rx) = capture_request(None);\n    let conf = Config::builder()\n        .http_client(http_client)\n        .region(Region::new(\"us-east-2\"))\n        .with_test_defaults()\n        .sigv4a_signing_region_set(\"*\")\n        .auth_scheme_preference([aws_runtime::auth::sigv4a::SCHEME_ID])\n        .build();\n    let client = Client::from_conf(conf);\n    let _ = client\n        .get_object()\n        .bucket(\"arn:aws:s3::123456789012:accesspoint/mfzwi23gnjvgw.mrap\")\n        .key(\"test\")\n        .send()\n        .await;\n    let req = rx.expect_request();\n    let region_set = req\n        .headers()\n        .get(\"x-amz-region-set\")\n        .expect(\"x-amz-region-set header\");\n    assert_eq!(region_set, \"*\");\n}\n\n#[tokio::test]\nasync fn sigv4a_signing_region_set_getter_returns_configured_value() {\n    let conf = Config::builder()\n        .region(Region::new(\"us-east-2\"))\n        .with_test_defaults()\n        .sigv4a_signing_region_set(\"*\")\n        .build();\n    assert_eq!(\n        conf.sigv4a_signing_region_set(),\n        Some(&SigningRegionSet::from(\"*\"))\n    );\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/s3/tests/size-type.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_sdk_s3::types::Object;\n\n// Tests that `com.amazonaws.s3#Size` is correctly customized to be a long instead of an int.\n#[test]\nfn size_type() {\n    let size = i64::MAX;\n\n    // Should only compile if the type is correctly customized\n    let object = Object::builder().size(size).build();\n    assert_eq!(Some(size), object.size);\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/s3/tests/stalled-stream-protection.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_credential_types::Credentials;\nuse aws_sdk_s3::{\n    config::{Region, StalledStreamProtectionConfig},\n    error::BoxError,\n};\nuse aws_sdk_s3::{error::DisplayErrorContext, primitives::ByteStream};\nuse aws_sdk_s3::{Client, Config};\nuse aws_smithy_runtime::{assert_str_contains, test_util::capture_test_logs::capture_test_logs};\nuse aws_smithy_types::body::SdkBody;\nuse bytes::{Bytes, BytesMut};\nuse http_body_1x::Body;\nuse std::error::Error;\nuse std::time::Duration;\nuse std::{future::Future, task::Poll};\nuse std::{net::SocketAddr, pin::Pin, task::Context};\nuse tokio::{\n    net::{TcpListener, TcpStream},\n    time::sleep,\n};\nuse tracing::debug;\n\nenum SlowBodyState {\n    Wait(Pin<Box<dyn std::future::Future<Output = ()> + Send + Sync + 'static>>),\n    Send,\n    Taken,\n}\n\nstruct SlowBody {\n    state: SlowBodyState,\n}\n\nimpl SlowBody {\n    fn new() -> Self {\n        Self {\n            state: SlowBodyState::Send,\n        }\n    }\n}\n\nimpl Body for SlowBody {\n    type Data = Bytes;\n    type Error = BoxError;\n\n    fn poll_frame(\n        mut self: Pin<&mut Self>,\n        cx: &mut Context<'_>,\n    ) -> Poll<Option<Result<http_body_1x::Frame<Self::Data>, Self::Error>>> {\n        loop {\n            let mut state = SlowBodyState::Taken;\n            std::mem::swap(&mut state, &mut self.state);\n            match state {\n                SlowBodyState::Wait(mut fut) => match fut.as_mut().poll(cx) {\n                    Poll::Ready(_) => self.state = SlowBodyState::Send,\n                    Poll::Pending => {\n                        self.state = SlowBodyState::Wait(fut);\n                        return Poll::Pending;\n                    }\n                },\n                SlowBodyState::Send => {\n                    self.state = SlowBodyState::Wait(Box::pin(sleep(Duration::from_micros(100))));\n                    return Poll::Ready(Some(Ok(http_body_1x::Frame::data(Bytes::from_static(\n                        b\"data_data_data_data_data_data_data_data_data_data_data_data_\\\n                          data_data_data_data_data_data_data_data_data_data_data_data_\\\n                          data_data_data_data_data_data_data_data_data_data_data_data_\\\n                          data_data_data_data_data_data_data_data_data_data_data_data_\",\n                    )))));\n                }\n                SlowBodyState::Taken => unreachable!(),\n            }\n        }\n    }\n}\n\n#[tokio::test]\nasync fn test_stalled_stream_protection_defaults_for_upload() {\n    let _logs = capture_test_logs();\n\n    // We spawn a faulty server that will stop all request processing after reading half of the request body.\n    let (server, server_addr) = start_faulty_upload_server().await;\n    let _ = tokio::spawn(server);\n\n    let conf = Config::builder()\n        // Stalled stream protection MUST BE enabled by default. Do not configure it explicitly.\n        .credentials_provider(Credentials::for_tests())\n        .region(Region::new(\"us-east-1\"))\n        .endpoint_url(format!(\"http://{server_addr}\"))\n        // The Body used here is odd and fails the body.size_hint().exact() check in the streaming branch of\n        // the `RequestChecksumInterceptor`\n        .request_checksum_calculation(aws_sdk_s3::config::RequestChecksumCalculation::WhenRequired)\n        .build();\n    let client = Client::from_conf(conf);\n\n    let err = client\n        .put_object()\n        .bucket(\"a-test-bucket\")\n        .key(\"stalled-stream-test.txt\")\n        .body(ByteStream::new(SdkBody::from_body_1_x(SlowBody::new())))\n        .send()\n        .await\n        .expect_err(\"upload stream stalled out\");\n\n    let err_msg = DisplayErrorContext(&err).to_string();\n    assert_str_contains!(\n        err_msg,\n        \"minimum throughput was specified at 1 B/s, but throughput of 0 B/s was observed\"\n    );\n}\n\nasync fn start_faulty_upload_server() -> (impl Future<Output = ()>, SocketAddr) {\n    let listener = TcpListener::bind(\"0.0.0.0:0\")\n        .await\n        .expect(\"socket is free\");\n    let bind_addr = listener.local_addr().unwrap();\n\n    async fn process_socket(socket: TcpStream) {\n        let mut buf = BytesMut::new();\n        let mut time_to_stall = false;\n\n        while !time_to_stall {\n            match socket.try_read_buf(&mut buf) {\n                Ok(0) => {\n                    unreachable!(\n                        \"The connection will be closed before this branch is ever reached\"\n                    );\n                }\n                Ok(n) => {\n                    debug!(\"read {n} bytes from the socket\");\n                    if buf.len() >= 128 {\n                        time_to_stall = true;\n                    }\n                }\n                Err(e) if e.kind() == std::io::ErrorKind::WouldBlock => {\n                    debug!(\"reading would block, sleeping for 1ms and then trying again\");\n                    sleep(Duration::from_millis(1)).await;\n                }\n                Err(e) => {\n                    panic!(\"{e}\")\n                }\n            }\n        }\n\n        debug!(\"faulty server has read partial request, now getting stuck\");\n        loop {\n            tokio::task::yield_now().await\n        }\n    }\n\n    let fut = async move {\n        loop {\n            let (socket, addr) = listener\n                .accept()\n                .await\n                .expect(\"listener can accept new connections\");\n            debug!(\"server received new connection from {addr:?}\");\n            let start = std::time::Instant::now();\n            process_socket(socket).await;\n            debug!(\n                \"connection to {addr:?} closed after {:.02?}\",\n                start.elapsed()\n            );\n        }\n    };\n\n    (fut, bind_addr)\n}\n\n#[tokio::test]\nasync fn test_explicitly_configured_stalled_stream_protection_for_downloads() {\n    // We spawn a faulty server that will close the connection after\n    // writing half of the response body.\n    let (server, server_addr) = start_faulty_download_server().await;\n    let _ = tokio::spawn(server);\n\n    let conf = Config::builder()\n        .credentials_provider(Credentials::for_tests())\n        .region(Region::new(\"us-east-1\"))\n        .endpoint_url(format!(\"http://{server_addr}\"))\n        .stalled_stream_protection(\n            StalledStreamProtectionConfig::enabled()\n                // Fail stalled streams immediately\n                .grace_period(Duration::from_secs(0))\n                .build(),\n        )\n        .build();\n    let client = Client::from_conf(conf);\n\n    let res = client\n        .get_object()\n        .bucket(\"a-test-bucket\")\n        .key(\"stalled-stream-test.txt\")\n        .send()\n        .await\n        .unwrap();\n\n    let err = res\n        .body\n        .collect()\n        .await\n        .expect_err(\"download stream stalled out\");\n    let err = err.source().expect(\"inner error exists\");\n    assert_eq!(\n        err.to_string(),\n        \"minimum throughput was specified at 1 B/s, but throughput of 0 B/s was observed\"\n    );\n}\n\n#[tokio::test]\nasync fn test_stalled_stream_protection_for_downloads_can_be_disabled() {\n    // We spawn a faulty server that will close the connection after\n    // writing half of the response body.\n    let (server, server_addr) = start_faulty_download_server().await;\n    let _ = tokio::spawn(server);\n\n    let conf = Config::builder()\n        .credentials_provider(Credentials::for_tests())\n        .region(Region::new(\"us-east-1\"))\n        .endpoint_url(format!(\"http://{server_addr}\"))\n        .stalled_stream_protection(StalledStreamProtectionConfig::disabled())\n        .build();\n    let client = Client::from_conf(conf);\n\n    let res = client\n        .get_object()\n        .bucket(\"a-test-bucket\")\n        .key(\"stalled-stream-test.txt\")\n        .send()\n        .await\n        .unwrap();\n\n    let timeout_duration = Duration::from_secs(2);\n    match tokio::time::timeout(timeout_duration, res.body.collect()).await {\n        Ok(_) => panic!(\"stalled stream protection kicked in but it shouldn't have\"),\n        // If timeout elapses, then stalled stream protection didn't end the stream early.\n        Err(elapsed) => assert_eq!(\"deadline has elapsed\".to_owned(), elapsed.to_string()),\n    }\n}\n\n// This test will always take as long as whatever grace period is set by default.\n#[tokio::test]\nasync fn test_stalled_stream_protection_for_downloads_is_enabled_by_default() {\n    // We spawn a faulty server that will close the connection after\n    // writing half of the response body.\n    let (server, server_addr) = start_faulty_download_server().await;\n    let _ = tokio::spawn(server);\n\n    // Stalled stream protection should be enabled by default.\n    let sdk_config = aws_config::from_env()\n        // Stalled stream protection MUST BE enabled by default. Do not configure it explicitly.\n        .credentials_provider(Credentials::for_tests())\n        .region(Region::new(\"us-east-1\"))\n        .endpoint_url(format!(\"http://{server_addr}\"))\n        .load()\n        .await;\n    let client = Client::new(&sdk_config);\n\n    let res = client\n        .get_object()\n        .bucket(\"a-test-bucket\")\n        .key(\"stalled-stream-test.txt\")\n        .send()\n        .await\n        .unwrap();\n\n    let start = std::time::Instant::now();\n    let err = res\n        .body\n        .collect()\n        .await\n        .expect_err(\"download stream stalled out\");\n    let err = err.source().expect(\"inner error exists\");\n    assert_eq!(\n        err.to_string(),\n        \"minimum throughput was specified at 1 B/s, but throughput of 0 B/s was observed\"\n    );\n    // 5s grace period\n    let elapsed_secs = start.elapsed().as_secs();\n    assert!(\n        elapsed_secs == 5,\n        \"elapsed secs should be 5, but was {elapsed_secs}\"\n    )\n}\n\nasync fn start_faulty_download_server() -> (impl Future<Output = ()>, SocketAddr) {\n    let listener = TcpListener::bind(\"0.0.0.0:0\")\n        .await\n        .expect(\"socket is free\");\n    let bind_addr = listener.local_addr().unwrap();\n\n    async fn process_socket(socket: TcpStream) {\n        let mut buf = BytesMut::new();\n        let response: &[u8] = br#\"HTTP/1.1 200 OK\nx-amz-request-id: 4B4NGF0EAWN0GE63\ncontent-length: 12\netag: 3e25960a79dbc69b674cd4ec67a72c62\ncontent-type: application/octet-stream\nserver: AmazonS3\ncontent-encoding:\nlast-modified: Tue, 21 Jun 2022 16:29:14 GMT\ndate: Tue, 21 Jun 2022 16:29:23 GMT\nx-amz-id-2: kPl+IVVZAwsN8ePUyQJZ40WD9dzaqtr4eNESArqE68GSKtVvuvCTDe+SxhTT+JTUqXB1HL4OxNM=\naccept-ranges: bytes\n\n\"#;\n        let mut time_to_respond = false;\n\n        loop {\n            match socket.try_read_buf(&mut buf) {\n                Ok(0) => {\n                    unreachable!(\n                        \"The connection will be closed before this branch is ever reached\"\n                    );\n                }\n                Ok(n) => {\n                    debug!(\"read {n} bytes from the socket\");\n\n                    // Check for CRLF to see if we've received the entire HTTP request.\n                    if buf.ends_with(b\"\\r\\n\\r\\n\") {\n                        time_to_respond = true;\n                    }\n                }\n                Err(e) if e.kind() == std::io::ErrorKind::WouldBlock => {\n                    debug!(\"reading would block, sleeping for 1ms and then trying again\");\n                    sleep(Duration::from_millis(1)).await;\n                }\n                Err(e) => {\n                    panic!(\"{e}\")\n                }\n            }\n\n            if socket.writable().await.is_ok() && time_to_respond {\n                // The content length is 12 but we'll only write 5 bytes\n                socket.try_write(response).unwrap();\n                // We break from the R/W loop after sending a partial response in order to\n                // close the connection early.\n                debug!(\"faulty server has written partial response, now getting stuck\");\n                break;\n            }\n        }\n\n        loop {\n            tokio::task::yield_now().await\n        }\n    }\n\n    let fut = async move {\n        loop {\n            let (socket, addr) = listener\n                .accept()\n                .await\n                .expect(\"listener can accept new connections\");\n            debug!(\"server received new connection from {addr:?}\");\n            let start = std::time::Instant::now();\n            process_socket(socket).await;\n            debug!(\n                \"connection to {addr:?} closed after {:.02?}\",\n                start.elapsed()\n            );\n        }\n    };\n\n    (fut, bind_addr)\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/s3/tests/status-200-errors.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_config::retry::{RetryConfigBuilder, RetryMode};\nuse aws_credential_types::provider::SharedCredentialsProvider;\nuse aws_credential_types::Credentials;\nuse aws_sdk_s3::Client;\nuse aws_smithy_http_client::test_util::infallible_client_fn;\nuse aws_smithy_runtime::assert_str_contains;\nuse aws_smithy_types::body::SdkBody;\nuse aws_smithy_types::error::metadata::ProvideErrorMetadata;\nuse aws_types::region::Region;\nuse aws_types::SdkConfig;\n\nconst ERROR_RESPONSE: &str = r#\"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n        <Error>\n            <Code>SlowDown</Code>\n            <Message>Please reduce your request rate.</Message>\n            <RequestId>K2H6N7ZGQT6WHCEG</RequestId>\n            <HostId>WWoZlnK4pTjKCYn6eNV7GgOurabfqLkjbSyqTvDMGBaI9uwzyNhSaDhOCPs8paFGye7S6b/AB3A=</HostId>\n        </Error>\n\"#;\n\n#[tokio::test]\nasync fn status_200_errors() {\n    let http_client =\n        infallible_client_fn(|_req| http_1x::Response::new(SdkBody::from(ERROR_RESPONSE)));\n    let sdk_config = SdkConfig::builder()\n        .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests()))\n        .region(Region::new(\"us-west-4\"))\n        .http_client(http_client)\n        .build();\n    let client = Client::new(&sdk_config);\n    let error = client\n        .delete_objects()\n        .bucket(\"bucket\")\n        .send()\n        .await\n        .expect_err(\"should fail\");\n    assert_eq!(error.as_service_error().unwrap().code(), Some(\"SlowDown\"));\n    assert_str_contains!(format!(\"{:?}\", error), \"Please reduce your request rate\");\n}\n\n#[tracing_test::traced_test]\n#[tokio::test]\nasync fn retry_200_internal_error() {\n    let http_client = infallible_client_fn(|_req| {\n        http_1x::Response::new(SdkBody::from(\n            r#\"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n            <Error>\n                <Type>Server</Type>\n                <Code>InternalError</Code>\n                <Message>>We encountered an internal error. Please try again.</Message>\n                <RequestId>DOESNOTMATTER</RequestId>\n            </Error>\n        \"#,\n        ))\n    });\n    let sdk_config = SdkConfig::builder()\n        .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests()))\n        .region(Region::new(\"us-west-4\"))\n        .http_client(http_client)\n        .retry_config(\n            RetryConfigBuilder::new()\n                .max_attempts(2)\n                .mode(RetryMode::Standard)\n                .build(),\n        )\n        .build();\n    let client = Client::new(&sdk_config);\n    let error = client\n        .delete_objects()\n        .bucket(\"bucket\")\n        .send()\n        .await\n        .expect_err(\"should fail\");\n    assert_eq!(\n        error.as_service_error().unwrap().code(),\n        Some(\"InternalError\")\n    );\n    assert!(\n        logs_contain(\"retrying after\")\n            && logs_contain(\"set the result of classification to 'retry transient error error'\")\n    );\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/s3/tests/streaming-response.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_config::SdkConfig;\nuse aws_credential_types::provider::SharedCredentialsProvider;\nuse aws_sdk_s3::config::{Credentials, Region};\nuse aws_sdk_s3::error::DisplayErrorContext;\nuse aws_sdk_s3::Client;\nuse aws_smithy_http_client::test_util::infallible_client_fn;\nuse aws_smithy_runtime::assert_str_contains;\nuse aws_smithy_types::body::SdkBody;\nuse bytes::BytesMut;\nuse http_1x::header::CONTENT_LENGTH;\nuse std::future::Future;\nuse std::net::SocketAddr;\nuse std::time::Duration;\nuse tracing::debug;\n\n#[tokio::test]\nasync fn test_too_short_body_causes_an_error() {\n    // this is almost impossible to reproduce with Hyper—you need to do stuff like run each request\n    // in its own async runtime. But there's no reason a customer couldn't run their _own_ HttpClient\n    // that was more poorly behaved, so we'll do that here.\n    let http_client = infallible_client_fn(|_req| {\n        http_1x::Response::builder()\n            .header(CONTENT_LENGTH, 5000)\n            .body(SdkBody::from(\"definitely not 5000 characters\"))\n            .unwrap()\n    });\n\n    let client = aws_sdk_s3::Client::from_conf(\n        aws_sdk_s3::Config::builder()\n            .with_test_defaults()\n            .region(Region::new(\"us-east-1\"))\n            .http_client(http_client)\n            .build(),\n    );\n\n    let content = client\n        .get_object()\n        .bucket(\"some-test-bucket\")\n        .key(\"test.txt\")\n        .send()\n        .await\n        .unwrap()\n        .body;\n    let error = content.collect().await.expect_err(\"content too short\");\n    assert_str_contains!(\n        format!(\"{}\", DisplayErrorContext(error)),\n        \"Invalid Content-Length: Expected 5000 bytes but 30 bytes were received\"\n    );\n}\n\n// test will hang forever with the default (single-threaded) test executor\n#[tokio::test(flavor = \"multi_thread\")]\nasync fn test_streaming_response_fails_when_eof_comes_before_content_length_reached() {\n    // We spawn a faulty server that will close the connection after\n    // writing half of the response body.\n    let (server, server_addr) = start_faulty_server().await;\n    let _ = tokio::spawn(server);\n\n    let sdk_config = SdkConfig::builder()\n        .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests()))\n        .region(Region::new(\"us-east-1\"))\n        .endpoint_url(format!(\"http://{server_addr}\"))\n        .build();\n\n    let client = Client::new(&sdk_config);\n\n    // This will succeed b/c the head of the response is fine.\n    let res = client\n        .get_object()\n        .bucket(\"some-test-bucket\")\n        .key(\"test.txt\")\n        .send()\n        .await\n        .unwrap();\n\n    // Should panic here when the body is read with an \"UnexpectedEof\" error\n    if let Err(e) = res.body.collect().await {\n        let message = format!(\"{}\", DisplayErrorContext(e));\n        let expected =\n            \"error reading a body from connection: end of file before message length reached\";\n        assert!(\n            message.contains(expected),\n            \"Expected `{message}` to contain `{expected}`\"\n        );\n    } else {\n        panic!(\"response did not error\")\n    }\n}\n\nasync fn start_faulty_server() -> (impl Future<Output = ()>, SocketAddr) {\n    use tokio::net::{TcpListener, TcpStream};\n    use tokio::time::sleep;\n\n    let listener = TcpListener::bind(\"0.0.0.0:0\")\n        .await\n        .expect(\"socket is free\");\n    let bind_addr = listener.local_addr().unwrap();\n\n    async fn process_socket(socket: TcpStream) {\n        let mut buf = BytesMut::new();\n        let response: &[u8] = br#\"HTTP/1.1 200 OK\nx-amz-request-id: 4B4NGF0EAWN0GE63\ncontent-length: 12\netag: 3e25960a79dbc69b674cd4ec67a72c62\ncontent-type: application/octet-stream\nserver: AmazonS3\ncontent-encoding:\nlast-modified: Tue, 21 Jun 2022 16:29:14 GMT\ndate: Tue, 21 Jun 2022 16:29:23 GMT\nx-amz-id-2: kPl+IVVZAwsN8ePUyQJZ40WD9dzaqtr4eNESArqE68GSKtVvuvCTDe+SxhTT+JTUqXB1HL4OxNM=\naccept-ranges: bytes\n\nHello\"#;\n        let mut time_to_respond = false;\n\n        loop {\n            match socket.try_read_buf(&mut buf) {\n                Ok(0) => {\n                    unreachable!(\n                        \"The connection will be closed before this branch is ever reached\"\n                    );\n                }\n                Ok(n) => {\n                    debug!(\"read {n} bytes from the socket\");\n                    if let Ok(s) = std::str::from_utf8(&buf) {\n                        debug!(\"buf currently looks like:\\n{s:?}\");\n                    }\n\n                    // Check for CRLF to see if we've received the entire HTTP request.\n                    if buf.ends_with(b\"\\r\\n\\r\\n\") {\n                        time_to_respond = true;\n                    }\n                }\n                Err(e) if e.kind() == std::io::ErrorKind::WouldBlock => {\n                    debug!(\"reading would block, sleeping for 1ms and then trying again\");\n                    sleep(Duration::from_millis(1)).await;\n                }\n                Err(e) => {\n                    panic!(\"{e}\")\n                }\n            }\n\n            if socket.writable().await.is_ok() && time_to_respond {\n                // The content length is 12 but we'll only write 5 bytes\n                socket.try_write(response).unwrap();\n                // We break from the R/W loop after sending a partial response in order to\n                // close the connection early.\n                debug!(\"faulty server has written partial response, now closing connection\");\n                break;\n            }\n        }\n    }\n\n    let fut = async move {\n        loop {\n            let (socket, addr) = listener\n                .accept()\n                .await\n                .expect(\"listener can accept new connections\");\n            debug!(\"server received new connection from {addr:?}\");\n            let start = std::time::Instant::now();\n            process_socket(socket).await;\n            debug!(\n                \"connection to {addr:?} closed after {:.02?}\",\n                start.elapsed()\n            );\n        }\n    };\n\n    (fut, bind_addr)\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/s3/tests/timeouts.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_sdk_s3::config::{retry::RetryConfig, timeout::TimeoutConfig, Region};\nuse aws_sdk_s3::error::DisplayErrorContext;\nuse aws_sdk_s3::primitives::ByteStream;\nuse aws_sdk_s3::types::{\n    CompressionType, CsvInput, CsvOutput, ExpressionType, FileHeaderInfo, InputSerialization,\n    OutputSerialization,\n};\nuse aws_sdk_s3::{Client, Config};\nuse aws_smithy_async::assert_elapsed;\nuse aws_smithy_http_client::test_util::NeverClient;\nuse std::future::Future;\nuse std::net::SocketAddr;\nuse std::time::Duration;\nuse tokio::net::TcpListener;\nuse tokio::time::timeout;\n\n#[tokio::test(start_paused = true)]\nasync fn test_event_stream_request_times_out_if_server_is_unresponsive() {\n    let config = Config::builder()\n        .with_test_defaults()\n        .region(Region::new(\"us-east-2\"))\n        .http_client(NeverClient::new())\n        .timeout_config(\n            TimeoutConfig::builder()\n                .operation_timeout(Duration::from_millis(500))\n                .build(),\n        )\n        .build();\n    let client = Client::from_conf(config);\n\n    let now = tokio::time::Instant::now();\n\n    let err = client\n        .select_object_content()\n        .bucket(\"aws-rust-sdk\")\n        .key(\"sample_data.csv\")\n        .expression_type(ExpressionType::Sql)\n        .expression(\"SELECT * FROM s3object s WHERE s.\\\"Name\\\" = 'Jane'\")\n        .input_serialization(\n            InputSerialization::builder()\n                .csv(\n                    CsvInput::builder()\n                        .file_header_info(FileHeaderInfo::Use)\n                        .build(),\n                )\n                .compression_type(CompressionType::None)\n                .build(),\n        )\n        .output_serialization(\n            OutputSerialization::builder()\n                .csv(CsvOutput::builder().build())\n                .build(),\n        )\n        .send()\n        .await\n        .unwrap_err();\n\n    let expected = \"operation timeout (all attempts including retries) occurred after 500ms\";\n    let message = format!(\"{}\", DisplayErrorContext(err));\n    assert!(\n        message.contains(expected),\n        \"expected '{message}' to contain '{expected}'\"\n    );\n    assert_elapsed!(now, Duration::from_millis(500));\n}\n\n#[tokio::test(start_paused = true)]\nasync fn test_upload_request_times_out_if_server_is_unresponsive() {\n    let config = Config::builder()\n        .with_test_defaults()\n        .region(Region::new(\"us-east-2\"))\n        .http_client(NeverClient::new())\n        .timeout_config(\n            TimeoutConfig::builder()\n                .operation_timeout(Duration::from_millis(500))\n                .build(),\n        )\n        .build();\n    let client = Client::from_conf(config);\n\n    let now = tokio::time::Instant::now();\n\n    let err = client\n        .put_object()\n        .bucket(\"aws-rust-sdk\")\n        .key(\"sample_data.csv\")\n        .body(ByteStream::from_static(b\"Hello world!\"))\n        .send()\n        .await\n        .unwrap_err();\n\n    let expected = \"operation timeout (all attempts including retries) occurred after 500ms\";\n    let message = format!(\"{}\", DisplayErrorContext(err));\n    assert!(\n        message.contains(expected),\n        \"expected '{message}' to contain '{expected}'\"\n    );\n    assert_elapsed!(now, std::time::Duration::from_secs_f32(0.5));\n}\n\n#[tokio::test]\nasync fn test_read_timeout() {\n    async fn run_server(\n        mut shutdown_receiver: tokio::sync::oneshot::Receiver<()>,\n    ) -> (impl Future<Output = ()>, SocketAddr) {\n        let listener = TcpListener::bind(\"0.0.0.0:0\").await.unwrap();\n        let listener_addr = listener.local_addr().unwrap();\n\n        (\n            async move {\n                while shutdown_receiver.try_recv().is_err() {\n                    if let Ok(Ok((_socket, _))) =\n                        timeout(Duration::from_millis(100), listener.accept()).await\n                    {\n                        tokio::time::sleep(Duration::from_millis(1000)).await;\n                    }\n                }\n            },\n            listener_addr,\n        )\n    }\n    let (server_shutdown, server_shutdown_receiver) = tokio::sync::oneshot::channel();\n    let (server_fut, server_addr) = run_server(server_shutdown_receiver).await;\n    let server_handle = tokio::spawn(server_fut);\n    tokio::time::sleep(Duration::from_millis(100)).await;\n\n    let config = Config::builder()\n        .with_test_defaults()\n        .region(Region::new(\"us-east-1\"))\n        .retry_config(RetryConfig::disabled())\n        .timeout_config(\n            TimeoutConfig::builder()\n                .read_timeout(Duration::from_millis(300))\n                .build(),\n        )\n        .endpoint_url(format!(\"http://{server_addr}\"))\n        .build();\n    let client = Client::from_conf(config);\n\n    if let Ok(result) = timeout(\n        Duration::from_millis(1000),\n        client.get_object().bucket(\"test\").key(\"test\").send(),\n    )\n    .await\n    {\n        match result {\n            Ok(_) => panic!(\"should not have succeeded\"),\n            Err(err) => {\n                let message = format!(\"{}\", DisplayErrorContext(&err));\n                let expected = \"timeout: HTTP read timeout occurred after 300ms\";\n                assert!(\n                    message.contains(expected),\n                    \"expected '{message}' to contain '{expected}'\"\n                );\n            }\n        }\n    } else {\n        panic!(\"the client didn't timeout\");\n    }\n\n    server_shutdown.send(()).unwrap();\n    server_handle.await.unwrap();\n}\n\n#[tokio::test]\nasync fn test_connect_timeout() {\n    let config = Config::builder()\n        .with_test_defaults()\n        .region(Region::new(\"us-east-1\"))\n        .retry_config(RetryConfig::disabled())\n        .timeout_config(\n            TimeoutConfig::builder()\n                .connect_timeout(Duration::from_millis(300))\n                .build(),\n        )\n        .endpoint_url(\n            // Emulate a connect timeout error by hitting an unroutable IP\n            \"http://172.255.255.0:18104\",\n        )\n        .build();\n    let client = Client::from_conf(config);\n\n    if let Ok(result) = timeout(\n        Duration::from_millis(1000),\n        client.get_object().bucket(\"test\").key(\"test\").send(),\n    )\n    .await\n    {\n        match result {\n            Ok(_) => panic!(\"should not have succeeded\"),\n            Err(err) => {\n                let message = format!(\"{}\", DisplayErrorContext(&err));\n                let expected =\n                    \"timeout: client error (Connect): HTTP connect timeout occurred after 300ms\";\n                assert!(\n                    message.contains(expected),\n                    \"expected '{message}' to contain '{expected}'\"\n                );\n            }\n        }\n    } else {\n        panic!(\"the client didn't timeout\");\n    }\n}\n\n#[tokio::test]\nasync fn test_default_connect_timeout_with_bmv_2026_01_12() {\n    use aws_smithy_runtime_api::client::behavior_version::BehaviorVersion;\n\n    // With BehaviorVersion >= v2025_01_17, a 3.1s connect timeout is enabled by default\n    // This test uses v2026_01_12 (the latest) to verify timeout behavior\n    let config = Config::builder()\n        .behavior_version(BehaviorVersion::v2026_01_12())\n        .region(Region::new(\"us-east-1\"))\n        .retry_config(RetryConfig::disabled())\n        .endpoint_url(\n            // Emulate a connect timeout error by hitting an unroutable IP\n            \"http://172.255.255.0:18104\",\n        )\n        .build();\n    let client = Client::from_conf(config);\n\n    if let Ok(result) = timeout(\n        Duration::from_millis(5000),\n        client.get_object().bucket(\"test\").key(\"test\").send(),\n    )\n    .await\n    {\n        match result {\n            Ok(_) => panic!(\"should not have succeeded\"),\n            Err(err) => {\n                let message = format!(\"{}\", DisplayErrorContext(&err));\n                // Should timeout with the default 3.1s connect timeout\n                let expected = \"HTTP connect timeout occurred after 3.1s\";\n                assert!(\n                    message.contains(expected),\n                    \"expected '{message}' to contain '{expected}'\"\n                );\n            }\n        }\n    } else {\n        panic!(\"the client didn't timeout\");\n    }\n}\n\n#[tokio::test]\n#[expect(deprecated)]\nasync fn test_old_behavior_version_has_no_default_connect_timeout() {\n    use aws_credential_types::Credentials;\n    use aws_smithy_runtime_api::client::behavior_version::BehaviorVersion;\n\n    // With v2024_03_28 (older BMV), no default connect timeout should be set\n    let config = Config::builder()\n        .behavior_version(BehaviorVersion::v2024_03_28())\n        .region(Region::new(\"us-east-1\"))\n        .credentials_provider(Credentials::for_tests())\n        .retry_config(RetryConfig::disabled())\n        .endpoint_url(\"http://172.255.255.0:18104\") // Unroutable IP\n        .build();\n    let client = Client::from_conf(config);\n\n    // The client should hang indefinitely without a timeout\n    // We wrap it in a short test timeout to verify it doesn't complete quickly\n    let result = timeout(\n        Duration::from_millis(500),\n        client.get_object().bucket(\"test\").key(\"test\").send(),\n    )\n    .await;\n\n    // Should timeout at the test wrapper level (not at client level)\n    // This proves the client has no default connect timeout\n    assert!(\n        result.is_err(),\n        \"client should hang without default timeout, causing test timeout\"\n    );\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/s3/tests/token_bucket_time_source.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n#![cfg(feature = \"test-util\")]\n\nuse aws_config::retry::RetryConfig;\nuse aws_sdk_s3::config::retry::RetryPartition;\nuse aws_sdk_s3::{config::Region, Client, Config};\nuse aws_smithy_async::test_util::ManualTimeSource;\nuse aws_smithy_async::time::SharedTimeSource;\nuse aws_smithy_http_client::test_util::{ReplayEvent, StaticReplayClient};\nuse aws_smithy_runtime::client::retries::TokenBucket;\nuse aws_smithy_runtime_api::box_error::BoxError;\nuse aws_smithy_runtime_api::client::interceptors::Intercept;\nuse aws_smithy_runtime_api::client::runtime_components::RuntimeComponents;\nuse aws_smithy_types::body::SdkBody;\nuse aws_smithy_types::config_bag::ConfigBag;\nuse std::sync::Mutex;\nuse std::sync::{Arc, LazyLock};\nuse std::time::{Duration, SystemTime, UNIX_EPOCH};\n\nstatic THE_TIME: LazyLock<SystemTime> =\n    LazyLock::new(|| UNIX_EPOCH + Duration::from_secs(12344321));\n\n#[derive(Debug)]\nstruct TimeSourceValidationInterceptor {\n    current_attempt: Arc<Mutex<u32>>,\n}\n\nimpl Intercept for TimeSourceValidationInterceptor {\n    fn name(&self) -> &'static str {\n        \"TimeSourceValidationInterceptor\"\n    }\n\n    fn read_before_attempt(\n        &self,\n        _context: &aws_sdk_s3::config::interceptors::BeforeTransmitInterceptorContextRef<'_>,\n        _runtime_components: &RuntimeComponents,\n        cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        if let Some(token_bucket) = cfg.load::<TokenBucket>() {\n            *self.current_attempt.lock().unwrap() += 1;\n\n            if *self.current_attempt.lock().unwrap() == 1 {\n                let last_refill = token_bucket\n                    .last_refill_time_secs()\n                    .load(std::sync::atomic::Ordering::Relaxed);\n                assert_eq!(last_refill, 0);\n            } else if *self.current_attempt.lock().unwrap() == 2 {\n                let last_refill = token_bucket\n                    .last_refill_time_secs()\n                    .load(std::sync::atomic::Ordering::Relaxed);\n                assert_eq!(last_refill, 12344321);\n            } else {\n                panic!(\"No attempts past the second should happen\");\n            }\n        }\n        Ok(())\n    }\n}\n\n#[tokio::test]\nasync fn test_token_bucket_gets_time_source_from_config() {\n    let time_source = ManualTimeSource::new(*THE_TIME);\n    let shared_time_source = SharedTimeSource::new(time_source);\n\n    let http_client = StaticReplayClient::new(vec![\n        ReplayEvent::new(\n            http_1x::Request::builder()\n                .uri(\"https://www.doesntmatter.com\")\n                .body(SdkBody::empty())\n                .unwrap(),\n            http_1x::Response::builder()\n                .status(500)\n                .body(SdkBody::from(\"This was an error\"))\n                .unwrap(),\n        ),\n        ReplayEvent::new(\n            http_1x::Request::builder()\n                .uri(\"https://www.doesntmatter.com\")\n                .body(SdkBody::empty())\n                .unwrap(),\n            http_1x::Response::builder()\n                .status(200)\n                .body(SdkBody::from(\"<ListBucketResult></ListBucketResult>\"))\n                .unwrap(),\n        ),\n    ]);\n\n    let config = Config::builder()\n        .region(Region::new(\"us-east-1\"))\n        .http_client(http_client)\n        .time_source(shared_time_source)\n        .interceptor(TimeSourceValidationInterceptor {\n            current_attempt: Arc::new(Mutex::new(0)),\n        })\n        .retry_config(RetryConfig::standard())\n        .retry_partition(\n            RetryPartition::custom(\"test\")\n                .token_bucket(TokenBucket::builder().refill_rate(100.0).build())\n                .build(),\n        )\n        .build();\n\n    let client = Client::from_conf(config);\n\n    let _result = client\n        .list_objects_v2()\n        .bucket(\"test-bucket\")\n        .send()\n        .await\n        .unwrap();\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/s3control/Cargo.toml",
    "content": "# This Cargo.toml is unused in generated code. It exists solely to enable these tests to compile in-situ\n[package]\nname = \"s3control\"\nversion = \"0.1.0\"\nauthors = [\"AWS Rust SDK Team <aws-sdk-rust@amazon.com>\"]\nedition = \"2021\"\nlicense = \"Apache-2.0\"\nrepository = \"https://github.com/smithy-lang/smithy-rs\"\npublish = false\n\n# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html\n\n[features]\ndefault = [\"test-util\"]\ntest-util = []\n\n[dev-dependencies]\naws-credential-types = { path = \"../../build/aws-sdk/sdk/aws-credential-types\", features = [\"test-util\"] }\naws-sdk-s3control = { path = \"../../build/aws-sdk/sdk/s3control\", features = [\"test-util\", \"behavior-version-latest\"] }\naws-smithy-async = { path = \"../../build/aws-sdk/sdk/aws-smithy-async\" }\naws-smithy-runtime = { path = \"../../build/aws-sdk/sdk/aws-smithy-runtime\", features = [\"client\"] }\naws-smithy-http-client = { path = \"../../build/aws-sdk/sdk/aws-smithy-http-client\", features = [\"test-util\"] }\naws-smithy-types = { path = \"../../build/aws-sdk/sdk/aws-smithy-types\" }\naws-types = { path = \"../../build/aws-sdk/sdk/aws-types\" }\nbytes = \"1.0.0\"\nhttp-1x = { package = \"http\", version = \"1\" }\nserde_json = \"1.0.0\"\ntokio = { version = \"1.23.1\", features = [\"full\", \"test-util\"] }\ntracing-subscriber = { version = \"0.3.15\", features = [\"env-filter\"] }\n\n[[test]]\nname = \"signing-it\"\nrequired-features = [\"test-util\"]\n"
  },
  {
    "path": "aws/sdk/integration-tests/s3control/tests/signing-it.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_credential_types::provider::SharedCredentialsProvider;\nuse aws_sdk_s3control::config::{Credentials, Region};\nuse aws_sdk_s3control::{Client, Config};\nuse aws_smithy_http_client::test_util::{ReplayEvent, StaticReplayClient};\nuse aws_smithy_types::body::SdkBody;\nuse http_1x::header::AUTHORIZATION;\n\n#[tokio::test]\nasync fn test_signer() {\n    let http_client = StaticReplayClient::new(vec![ReplayEvent::new(\n        http_1x::Request::builder()\n        .header(\"authorization\",\n                    \"AWS4-HMAC-SHA256 Credential=ANOTREAL/20090213/us-east-1/s3/aws4_request, \\\n                    SignedHeaders=host;x-amz-account-id;x-amz-content-sha256;x-amz-date;x-amz-user-agent, \\\n                    Signature=0102a74cb220f8445c4efada17660572ff813e07b524032ec831e8c2514be903\")\n            .uri(\"https://test-bucket.s3-control.us-east-1.amazonaws.com/v20180820/accesspoint\")\n            .body(SdkBody::empty())\n            .unwrap(),\n        http_1x::Response::builder().status(200).body(SdkBody::empty()).unwrap(),\n    )]);\n    let config = Config::builder()\n        .credentials_provider(SharedCredentialsProvider::new(\n            Credentials::for_tests_with_session_token(),\n        ))\n        .http_client(http_client.clone())\n        .region(Region::new(\"us-east-1\"))\n        .with_test_defaults()\n        .build();\n    let client = Client::from_conf(config);\n\n    let _ = client\n        .list_access_points()\n        .account_id(\"test-bucket\")\n        .send()\n        .await\n        .expect_err(\"empty response\");\n\n    http_client.assert_requests_match(&[AUTHORIZATION.as_str()]);\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/sts/Cargo.toml",
    "content": "# This Cargo.toml is unused in generated code. It exists solely to enable these tests to compile in-situ\n[package]\nname = \"sts-tests\"\nversion = \"0.1.0\"\nauthors = [\"Russell Cohen <rcoh@amazon.com>\"]\nedition = \"2021\"\nlicense = \"Apache-2.0\"\nrepository = \"https://github.com/smithy-lang/smithy-rs\"\npublish = false\n\n# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html\n\n[dev-dependencies]\naws-credential-types = { path = \"../../build/aws-sdk/sdk/aws-credential-types\", features = [\"test-util\"] }\naws-sdk-sts = { path = \"../../build/aws-sdk/sdk/sts\", features = [\"behavior-version-latest\"] }\naws-smithy-http = { path = \"../../build/aws-sdk/sdk/aws-smithy-http\" }\naws-smithy-runtime = { path = \"../../build/aws-sdk/sdk/aws-smithy-runtime\", features = [\"client\"] }\naws-smithy-http-client = { path = \"../../build/aws-sdk/sdk/aws-smithy-http-client\", features = [\"test-util\"] }\naws-smithy-types = { path = \"../../build/aws-sdk/sdk/aws-smithy-types\" }\ntokio = { version = \"1.23.1\", features = [\"full\", \"test-util\"] }\ntracing-subscriber = { version = \"0.3.15\", features = [\"env-filter\"] }\n"
  },
  {
    "path": "aws/sdk/integration-tests/sts/tests/retry_idp_comms_err.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_sdk_sts as sts;\nuse aws_smithy_types::error::ErrorMetadata;\nuse aws_smithy_types::retry::{ErrorKind, ProvideErrorKind};\nuse sts::operation::assume_role_with_web_identity::AssumeRoleWithWebIdentityError;\nuse sts::types::error::IdpCommunicationErrorException;\n\n#[tokio::test]\nasync fn idp_comms_err_retryable() {\n    let error = AssumeRoleWithWebIdentityError::IdpCommunicationErrorException(\n        IdpCommunicationErrorException::builder()\n            .message(\"test\")\n            .meta(\n                ErrorMetadata::builder()\n                    .code(\"IDPCommunicationError\")\n                    .message(\"test\")\n                    .build(),\n            )\n            .build(),\n    );\n    assert_eq!(\n        Some(ErrorKind::ServerError),\n        error.retryable_error_kind(),\n        \"IdpCommunicationErrorException should be a retryable server error\"\n    );\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/sts/tests/signing-it.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_sdk_sts::config::{Credentials, Region};\nuse aws_smithy_http_client::test_util::capture_request;\n\n#[tokio::test]\nasync fn assume_role_signed() {\n    let creds = Credentials::for_tests();\n    let (http_client, request) = capture_request(None);\n    let conf = aws_sdk_sts::Config::builder()\n        .behavior_version_latest()\n        .credentials_provider(creds)\n        .region(Region::new(\"us-east-1\"))\n        .http_client(http_client)\n        .build();\n    let client = aws_sdk_sts::Client::from_conf(conf);\n    let _ = client.assume_role().send().await;\n    // assume role should have an auth header\n    assert_ne!(\n        request.expect_request().headers().get(\"AUTHORIZATION\"),\n        None\n    );\n}\n\n#[tokio::test]\nasync fn web_identity_unsigned() {\n    let (http_client, request) = capture_request(None);\n    let conf = aws_sdk_sts::Config::builder()\n        .behavior_version_latest()\n        .region(Region::new(\"us-east-1\"))\n        .http_client(http_client)\n        .build();\n    let client = aws_sdk_sts::Client::from_conf(conf);\n    let _ = client.assume_role_with_web_identity().send().await;\n    // web identity should be unsigned\n    assert_eq!(\n        request.expect_request().headers().get(\"AUTHORIZATION\"),\n        None\n    );\n}\n\n#[tokio::test]\nasync fn assume_role_saml_unsigned() {\n    let (http_client, request) = capture_request(None);\n    let conf = aws_sdk_sts::Config::builder()\n        .behavior_version_latest()\n        .region(Region::new(\"us-east-1\"))\n        .http_client(http_client)\n        .build();\n    let client = aws_sdk_sts::Client::from_conf(conf);\n    let _ = client.assume_role_with_saml().send().await;\n    // web identity should be unsigned\n    assert_eq!(\n        request.expect_request().headers().get(\"AUTHORIZATION\"),\n        None\n    );\n}\n\n#[tokio::test]\nasync fn web_identity_no_creds() {\n    let (http_client, request) = capture_request(None);\n    let conf = aws_sdk_sts::Config::builder()\n        .behavior_version_latest()\n        .region(Region::new(\"us-east-1\"))\n        .http_client(http_client)\n        .build();\n    let client = aws_sdk_sts::Client::from_conf(conf);\n    let _ = client.assume_role_with_web_identity().send().await;\n    // web identity should be unsigned and work without credentials\n    assert_eq!(\n        request.expect_request().headers().get(\"AUTHORIZATION\"),\n        None\n    );\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/telemetry/Cargo.toml",
    "content": "# This Cargo.toml is unused in generated code. It exists solely to enable these tests to compile in-situ\n[package]\nname = \"telemetry-tests\"\nversion = \"0.1.0\"\nauthors = [\"AWS Rust SDK Team <aws-sdk-rust@amazon.com>\"]\nedition = \"2021\"\nlicense = \"Apache-2.0\"\nrepository = \"https://github.com/smithy-lang/smithy-rs\"\npublish = false\n\n# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html\n\n[dev-dependencies]\naws-config = { path = \"../../build/aws-sdk/sdk/aws-config\", features = [\"test-util\", \"behavior-version-latest\"] }\naws-runtime = { path = \"../../build/aws-sdk/sdk/aws-runtime\", features = [\"test-util\"] }\naws-sdk-dynamodb = { path = \"../../build/aws-sdk/sdk/dynamodb\", features = [\"test-util\", \"behavior-version-latest\"] }\naws-sdk-s3 = { path = \"../../build/aws-sdk/sdk/s3\", features = [\"test-util\", \"behavior-version-latest\"] }\naws-smithy-observability = { path = \"../../build/aws-sdk/sdk/aws-smithy-observability\" }\naws-smithy-observability-otel = { path = \"../../build/aws-sdk/sdk/aws-smithy-observability-otel\" }\naws-smithy-runtime = { path = \"../../build/aws-sdk/sdk/aws-smithy-runtime\", features = [\"client\", \"test-util\"]}\naws-smithy-types = { path = \"../../build/aws-sdk/sdk/aws-smithy-types\" }\nhttp = \"0.2.0\"\nopentelemetry = { version = \"0.26.0\", features = [\"metrics\"] }\nopentelemetry_sdk = { version = \"0.26.0\", features = [\"metrics\", \"testing\"] }\nserial_test = \"3.1.1\"\ntokio = { version = \"1.23.1\", features = [\"full\", \"test-util\"] }\ntracing = \"0.1.40\"\ntracing-subscriber = \"0.3.18\"\ntracing-fluent-assertions = \"0.3.0\"\n"
  },
  {
    "path": "aws/sdk/integration-tests/telemetry/tests/metrics.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse opentelemetry::KeyValue;\nuse opentelemetry_sdk::metrics::data::Histogram;\nuse serial_test::serial;\nuse std::borrow::Cow;\nuse utils::{\n    extract_metric_attributes, extract_metric_data, init_metrics, make_config, make_ddb_call,\n    make_s3_call,\n};\nmod utils;\n\n// Note, all of these tests are written with a multi threaded runtime since OTel requires that to work\n// and they are all run serially since they touch global state\n#[tokio::test(flavor = \"multi_thread\", worker_threads = 1)]\n#[serial]\nasync fn service_clients_get_unique_scope_names() {\n    let (meter_provider, exporter) = init_metrics();\n    let config = make_config(false);\n    make_s3_call(&config).await;\n    make_ddb_call(&config).await;\n\n    meter_provider.flush().unwrap();\n    let finished_metrics = exporter.get_finished_metrics().unwrap();\n\n    let scope_names: &Vec<Cow<'_, str>> = &finished_metrics[0]\n        .scope_metrics\n        .iter()\n        .map(|scope_metric| scope_metric.scope.clone().name)\n        .collect();\n\n    // Metrics aren't necessarily aggregated in the order they were first emitted\n    assert!(scope_names.contains(&Cow::from(\"aws-sdk-s3\")));\n    assert!(scope_names.contains(&Cow::from(\"aws-sdk-dynamodb\")));\n}\n\n#[tokio::test(flavor = \"multi_thread\", worker_threads = 1)]\n#[serial]\nasync fn correct_metrics_collected() {\n    let (meter_provider, exporter) = init_metrics();\n    make_s3_call(&make_config(false)).await;\n\n    meter_provider.flush().unwrap();\n    let finished_metrics = exporter.get_finished_metrics().unwrap();\n\n    let extracted_metric_names: &Vec<Cow<'_, str>> = &finished_metrics[0].scope_metrics[0]\n        .metrics\n        .iter()\n        .map(|metric| metric.name.clone())\n        .collect();\n\n    // Correct metric names emitted\n    assert!(extracted_metric_names.contains(&Cow::from(\"smithy.client.call.duration\")));\n    assert!(extracted_metric_names.contains(&Cow::from(\"smithy.client.call.attempt.duration\")));\n\n    let call_duration =\n        extract_metric_data::<Histogram<f64>>(&finished_metrics, \"smithy.client.call.duration\")\n            .data_points[0]\n            .sum;\n\n    let attempt_duration = extract_metric_data::<Histogram<f64>>(\n        &finished_metrics,\n        \"smithy.client.call.attempt.duration\",\n    )\n    .data_points[0]\n        .sum;\n\n    // Both metrics have a non-zero value\n    assert!(call_duration > 0.0);\n    assert!(attempt_duration > 0.0);\n}\n\n#[tokio::test(flavor = \"multi_thread\", worker_threads = 1)]\n#[serial]\nasync fn metrics_have_expected_attributes() {\n    let (meter_provider, exporter) = init_metrics();\n    make_s3_call(&make_config(true)).await;\n\n    meter_provider.flush().unwrap();\n    let finished_metrics = exporter.get_finished_metrics().unwrap();\n\n    // Both metrics contain the method and service attributes\n    let call_duration_attributes =\n        extract_metric_attributes(&finished_metrics, \"smithy.client.call.duration\");\n    assert!(call_duration_attributes[0].contains(&KeyValue::new(\"rpc.method\", \"GetObject\")));\n    assert!(call_duration_attributes[0].contains(&KeyValue::new(\"rpc.service\", \"S3\")));\n\n    let attempt_duration_attributes =\n        extract_metric_attributes(&finished_metrics, \"smithy.client.call.attempt.duration\");\n    assert!(attempt_duration_attributes[0].contains(&KeyValue::new(\"rpc.method\", \"GetObject\")));\n    assert!(attempt_duration_attributes[0].contains(&KeyValue::new(\"rpc.service\", \"S3\")));\n\n    // The attempt metric contains an attempt counter attribute that correctly increments\n    assert!(attempt_duration_attributes\n        .iter()\n        .find(|attrs| attrs.contains(&KeyValue::new(\"attempt\", 1)))\n        .is_some());\n    assert!(attempt_duration_attributes\n        .iter()\n        .find(|attrs| attrs.contains(&KeyValue::new(\"attempt\", 2)))\n        .is_some());\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/telemetry/tests/observability_feature_metrics.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_config::Region;\nuse aws_runtime::user_agent::test_util::{\n    assert_ua_contains_metric_values, assert_ua_does_not_contain_metric_values,\n};\nuse aws_sdk_s3::config::{Credentials, SharedCredentialsProvider};\nuse aws_smithy_observability::TelemetryProvider;\nuse aws_smithy_runtime::client::http::test_util::{ReplayEvent, StaticReplayClient};\nuse aws_smithy_types::body::SdkBody;\nuse serial_test::serial;\nuse utils::init_metrics;\n\nmod utils;\n\n// Note: These tests are written with a multi-threaded runtime since OTel requires that to work\n// and they are all run serially since they touch global state\n\n#[tokio::test(flavor = \"multi_thread\", worker_threads = 1)]\n#[serial]\nasync fn observability_otel_metrics_feature_tracked_in_user_agent() {\n    let (meter_provider, _exporter) = init_metrics();\n\n    // Create a replay client to capture the actual HTTP request\n    let http_client = StaticReplayClient::new(vec![ReplayEvent::new(\n        http::Request::builder().body(SdkBody::empty()).unwrap(),\n        http::Response::builder().body(SdkBody::empty()).unwrap(),\n    )]);\n\n    let config = aws_config::SdkConfig::builder()\n        .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests()))\n        .region(Region::new(\"us-east-1\"))\n        .http_client(http_client.clone())\n        .build();\n\n    let s3_client = aws_sdk_s3::Client::new(&config);\n    let _ = s3_client\n        .get_object()\n        .bucket(\"test-bucket\")\n        .key(\"test.txt\")\n        .send()\n        .await;\n\n    // Get the actual HTTP request that was made\n    let requests = http_client.actual_requests();\n    let last_request = requests.last().expect(\"should have made a request\");\n\n    let user_agent = last_request\n        .headers()\n        .get(\"x-amz-user-agent\")\n        .expect(\"should have user-agent header\");\n\n    // Should contain OBSERVABILITY_OTEL_METRICS metric (value \"7\")\n    assert_ua_contains_metric_values(user_agent, &[\"7\"]);\n\n    meter_provider.flush().unwrap();\n\n    // Reset to noop for other tests\n    aws_smithy_observability::global::set_telemetry_provider(TelemetryProvider::noop()).unwrap();\n}\n\n#[tokio::test(flavor = \"multi_thread\", worker_threads = 1)]\n#[serial]\nasync fn noop_provider_does_not_track_observability_metrics() {\n    // Reset to noop provider\n    aws_smithy_observability::global::set_telemetry_provider(TelemetryProvider::noop()).unwrap();\n\n    // Create a replay client to capture the actual HTTP request\n    let http_client = StaticReplayClient::new(vec![ReplayEvent::new(\n        http::Request::builder().body(SdkBody::empty()).unwrap(),\n        http::Response::builder().body(SdkBody::empty()).unwrap(),\n    )]);\n\n    let config = aws_config::SdkConfig::builder()\n        .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests()))\n        .region(Region::new(\"us-east-1\"))\n        .http_client(http_client.clone())\n        .build();\n\n    let s3_client = aws_sdk_s3::Client::new(&config);\n    let _ = s3_client\n        .get_object()\n        .bucket(\"test-bucket\")\n        .key(\"test.txt\")\n        .send()\n        .await;\n\n    // Get the actual HTTP request that was made\n    let requests = http_client.actual_requests();\n    let last_request = requests.last().expect(\"should have made a request\");\n\n    let user_agent = last_request\n        .headers()\n        .get(\"x-amz-user-agent\")\n        .expect(\"should have user-agent header\");\n\n    // Should NOT contain OBSERVABILITY_OTEL_METRICS metric when using noop provider\n    assert_ua_does_not_contain_metric_values(user_agent, &[\"7\"]);\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/telemetry/tests/spans.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_config::meta::region::RegionProviderChain;\nuse aws_config::{BehaviorVersion, Region};\nuse std::collections::HashMap;\nuse std::fmt;\nuse tracing::field::{Field, Visit};\nuse tracing::span::{Attributes, Id};\nuse tracing::Subscriber;\nuse tracing_fluent_assertions::{AssertionRegistry, AssertionsLayer};\nuse tracing_subscriber::layer::SubscriberExt;\nuse tracing_subscriber::layer::{Context, Layer};\nuse tracing_subscriber::registry::LookupSpan;\nmod utils;\nuse utils::{make_config, make_ddb_call, make_s3_call};\n\n#[tokio::test]\nasync fn top_level_spans_exist_with_correct_attributes() {\n    let s3_top_level: fn() -> Box<dyn Visit + 'static> = || Box::new(S3TestVisitor);\n    let ddb_top_level: fn() -> Box<dyn Visit + 'static> = || Box::new(DdbTestVisitor);\n    let subscriber = tracing_subscriber::registry::Registry::default().with(TestLayer {\n        visitor_factories: HashMap::from([\n            (\"S3.GetObject\", s3_top_level),\n            (\"DynamoDB.GetItem\", ddb_top_level),\n        ]),\n    });\n    let _guard = tracing::subscriber::set_default(subscriber);\n\n    let config = make_config(false);\n    make_s3_call(&config).await;\n    make_ddb_call(&config).await;\n}\n\n#[tokio::test]\nasync fn try_attempt_spans_emitted_per_retry() {\n    let assertion_registry = AssertionRegistry::default();\n    let base_subscriber = tracing_subscriber::Registry::default();\n    let subscriber = base_subscriber.with(AssertionsLayer::new(&assertion_registry));\n    let _guard = tracing::subscriber::set_default(subscriber);\n\n    let two_try_attempts = assertion_registry\n        .build()\n        .with_name(\"try_attempt\")\n        .with_span_field(\"attempt\")\n        .was_closed_exactly(2)\n        .finalize();\n\n    let config = make_config(true);\n    make_s3_call(&config).await;\n\n    two_try_attempts.assert();\n}\n\n#[tokio::test]\nasync fn all_expected_operation_spans_emitted_with_correct_nesting() {\n    let assertion_registry = AssertionRegistry::default();\n    let base_subscriber = tracing_subscriber::Registry::default();\n    let subscriber = base_subscriber.with(AssertionsLayer::new(&assertion_registry));\n    let _guard = tracing::subscriber::set_default(subscriber);\n\n    const OPERATION_NAME: &str = \"S3.GetObject\";\n    const TRY_OP: &str = \"try_op\";\n    const TRY_ATTEMPT: &str = \"try_attempt\";\n\n    let apply_configuration = assertion_registry\n        .build()\n        .with_name(\"apply_configuration\")\n        .with_parent_name(OPERATION_NAME)\n        .was_closed_exactly(1)\n        .finalize();\n\n    let serialization = assertion_registry\n        .build()\n        .with_name(\"serialization\")\n        .with_parent_name(OPERATION_NAME)\n        .with_parent_name(TRY_OP)\n        .was_closed_exactly(1)\n        .finalize();\n\n    let orchestrate_endpoint = assertion_registry\n        .build()\n        .with_name(\"orchestrate_endpoint\")\n        .with_parent_name(OPERATION_NAME)\n        .with_parent_name(TRY_OP)\n        .with_parent_name(TRY_ATTEMPT)\n        .was_closed_exactly(1)\n        .finalize();\n\n    let lazy_load_identity = assertion_registry\n        .build()\n        .with_name(\"lazy_load_identity\")\n        .with_parent_name(OPERATION_NAME)\n        .with_parent_name(TRY_OP)\n        .with_parent_name(TRY_ATTEMPT)\n        .was_closed_exactly(1)\n        .finalize();\n\n    let deserialize_streaming = assertion_registry\n        .build()\n        .with_name(\"deserialize_streaming\")\n        .with_parent_name(OPERATION_NAME)\n        .with_parent_name(TRY_OP)\n        .with_parent_name(TRY_ATTEMPT)\n        .was_closed_exactly(1)\n        .finalize();\n\n    let deserialization = assertion_registry\n        .build()\n        .with_name(\"deserialization\")\n        .with_parent_name(OPERATION_NAME)\n        .with_parent_name(TRY_OP)\n        .with_parent_name(TRY_ATTEMPT)\n        .was_closed_exactly(1)\n        .finalize();\n\n    let try_attempt = assertion_registry\n        .build()\n        .with_name(TRY_ATTEMPT)\n        .with_span_field(\"attempt\")\n        .with_parent_name(OPERATION_NAME)\n        .with_parent_name(TRY_OP)\n        .was_closed_exactly(1)\n        .finalize();\n\n    let finally_attempt = assertion_registry\n        .build()\n        .with_name(\"finally_attempt\")\n        .with_parent_name(OPERATION_NAME)\n        .with_parent_name(TRY_OP)\n        .was_closed_exactly(1)\n        .finalize();\n\n    let try_op = assertion_registry\n        .build()\n        .with_name(TRY_OP)\n        .with_parent_name(OPERATION_NAME)\n        .was_closed_exactly(1)\n        .finalize();\n\n    let finally_op = assertion_registry\n        .build()\n        .with_name(\"finally_op\")\n        .with_parent_name(OPERATION_NAME)\n        .was_closed_exactly(1)\n        .finalize();\n\n    let operation = assertion_registry\n        .build()\n        .with_name(OPERATION_NAME)\n        .was_closed_exactly(1)\n        .finalize();\n\n    let config = make_config(false);\n    make_s3_call(&config).await;\n\n    apply_configuration.assert();\n    serialization.assert();\n    orchestrate_endpoint.assert();\n    lazy_load_identity.assert();\n    deserialize_streaming.assert();\n    deserialization.assert();\n    try_attempt.assert();\n    finally_attempt.assert();\n    try_op.assert();\n    finally_op.assert();\n    operation.assert();\n}\n\n#[tokio::test]\nasync fn config_spans_emitted() {\n    let assertion_registry = AssertionRegistry::default();\n    let base_subscriber = tracing_subscriber::Registry::default();\n    let subscriber = base_subscriber.with(AssertionsLayer::new(&assertion_registry));\n    let _guard = tracing::subscriber::set_default(subscriber);\n\n    let load_config_file = assertion_registry\n        .build()\n        .with_name(\"load_config_file\")\n        .with_span_field(\"file\")\n        .was_closed_exactly(2)\n        .finalize();\n\n    let build_profile_file_credentials_provider = assertion_registry\n        .build()\n        .with_name(\"build_profile_file_credentials_provider\")\n        .was_closed_exactly(1)\n        .finalize();\n\n    let build_profile_token_provider = assertion_registry\n        .build()\n        .with_name(\"build_profile_token_provider\")\n        .was_closed_exactly(1)\n        .finalize();\n\n    let _config = aws_config::defaults(BehaviorVersion::latest())\n        .region(Region::from_static(\"foo\"))\n        .load()\n        .await;\n\n    load_config_file.assert();\n    build_profile_file_credentials_provider.assert();\n    build_profile_token_provider.assert();\n}\n\n// NOTE: this test is being temporarily ignored since, although it succeeds both locally and in the\n// GitHub CI, it fails in our CodeBuild CI, likely because CodeBuild runs on EC2 so IMDS is present\n// and causes different behavior.\n#[tokio::test]\n#[ignore]\nasync fn region_spans_emitted() {\n    let assertion_registry = AssertionRegistry::default();\n    let base_subscriber = tracing_subscriber::Registry::default();\n    let subscriber = base_subscriber.with(AssertionsLayer::new(&assertion_registry));\n    let _guard = tracing::subscriber::set_default(subscriber);\n\n    let region_provider_chain = assertion_registry\n        .build()\n        .with_name(\"region_provider_chain\")\n        .with_span_field(\"provider\")\n        .was_closed_exactly(5)\n        .finalize();\n\n    let imds_load_region = assertion_registry\n        .build()\n        .with_name(\"imds_load_region\")\n        .with_parent_name(\"region_provider_chain\")\n        .was_closed_exactly(1)\n        .finalize();\n\n    // IMDS calls invoke twice, once with get and once with get_token\n    let invoke = assertion_registry\n        .build()\n        .with_name(\"invoke\")\n        .with_parent_name(\"imds_load_region\")\n        .was_closed_exactly(2)\n        .finalize();\n\n    let region_provider = RegionProviderChain::default_provider().or_else(\"us-east-1\");\n    let _config = aws_config::defaults(BehaviorVersion::latest())\n        .region(region_provider)\n        .load()\n        .await;\n\n    region_provider_chain.assert();\n    imds_load_region.assert();\n    invoke.assert();\n}\n\n/// Layer for testing top-level spans. Takes in a hashmap where the keys are the names of top level spans\n/// and the values are structs implementing [Visit] that make assertions about the attributes of those spans\nstruct TestLayer<F: Fn() -> Box<dyn Visit> + 'static> {\n    visitor_factories: HashMap<&'static str, F>,\n}\n\nimpl<S, F> Layer<S> for TestLayer<F>\nwhere\n    S: Subscriber,\n    S: for<'lookup> LookupSpan<'lookup>,\n    F: Fn() -> Box<dyn Visit>,\n{\n    fn on_new_span(&self, attrs: &Attributes<'_>, id: &Id, ctx: Context<'_, S>) {\n        let span = ctx.span(id).unwrap();\n        let span_name = span.metadata().name();\n\n        // Assert that any top level spans are the operation spans from\n        // visitor_factories\n        if span.parent().is_none() {\n            assert!(\n                self.visitor_factories.contains_key(span_name),\n                \"Encountered unexpected top level span {span_name}\"\n            )\n        }\n\n        for (asserted_span, visitor_factory) in &self.visitor_factories {\n            if &span_name == asserted_span {\n                let mut visitor = visitor_factory();\n                attrs.values().record(&mut *visitor);\n            }\n        }\n    }\n}\n\nstruct S3TestVisitor;\n\nimpl Visit for S3TestVisitor {\n    fn record_debug(&mut self, field: &Field, value: &dyn fmt::Debug) {\n        let field_name = field.name();\n        let field_value = format!(\"{value:?}\").replace(\"\\\"\", \"\");\n        if field_name == \"rpc.system\" {\n            assert_eq!(\"aws-api\".to_string(), field_value);\n        } else if field_name == \"rpc.service\" {\n            assert_eq!(\"S3\".to_string(), field_value);\n        } else if field_name == \"rpc.method\" {\n            assert_eq!(\"GetObject\".to_string(), field_value);\n        } else if field_name == \"sdk_invocation_id\" {\n            let num: u32 = field_value.parse().unwrap();\n            assert!(1_000_000 <= num);\n            assert!(num < 10_000_000);\n        } else {\n            panic!(\"Unknown attribute present on top level operation span - {field_name}: {field_value}\")\n        }\n    }\n}\n\nstruct DdbTestVisitor;\n\nimpl Visit for DdbTestVisitor {\n    fn record_debug(&mut self, field: &Field, value: &dyn fmt::Debug) {\n        let field_name = field.name();\n        let field_value = format!(\"{value:?}\").replace(\"\\\"\", \"\");\n        if field_name == \"rpc.system\" {\n            assert_eq!(\"aws-api\".to_string(), field_value);\n        } else if field_name == \"rpc.service\" {\n            assert_eq!(\"DynamoDB\".to_string(), field_value);\n        } else if field_name == \"rpc.method\" {\n            assert_eq!(\"GetItem\".to_string(), field_value);\n        } else if field_name == \"sdk_invocation_id\" {\n            let num: u32 = field_value.parse().unwrap();\n            assert!(1_000_000 <= num);\n            assert!(num < 10_000_000);\n        } else {\n            panic!(\"Unknown attribute present on top level operation span - {field_name}: {field_value}\")\n        }\n    }\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/telemetry/tests/utils/mod.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::{sync::Arc, time::Instant};\n\nuse aws_config::{retry::RetryConfig, Region, SdkConfig};\nuse aws_sdk_dynamodb::types::AttributeValue;\nuse aws_sdk_s3::config::{Credentials, SharedCredentialsProvider};\nuse aws_smithy_observability::{global::set_telemetry_provider, TelemetryProvider};\nuse aws_smithy_observability_otel::meter::OtelMeterProvider;\nuse aws_smithy_runtime::client::http::test_util::{ReplayEvent, StaticReplayClient};\nuse aws_smithy_types::body::SdkBody;\nuse opentelemetry::KeyValue;\nuse opentelemetry_sdk::{\n    metrics::{\n        data::{Histogram, ResourceMetrics},\n        PeriodicReader, SdkMeterProvider,\n    },\n    runtime::Tokio,\n    testing::metrics::InMemoryMetricsExporter,\n};\nuse tracing::{\n    field::{Field, Visit},\n    span::{Attributes, Id},\n    Subscriber,\n};\nuse tracing_subscriber::{layer::Context, registry::LookupSpan, Layer};\n\n#[allow(unused)]\npub(crate) fn init_metrics() -> (Arc<OtelMeterProvider>, InMemoryMetricsExporter) {\n    let exporter = InMemoryMetricsExporter::default();\n    let reader = PeriodicReader::builder(exporter.clone(), Tokio).build();\n    let otel_mp = SdkMeterProvider::builder().with_reader(reader).build();\n\n    let sdk_mp = Arc::new(OtelMeterProvider::new(otel_mp));\n    let sdk_ref = sdk_mp.clone();\n    let sdk_tp = TelemetryProvider::builder().meter_provider(sdk_mp).build();\n\n    let _ = set_telemetry_provider(sdk_tp);\n\n    (sdk_ref, exporter)\n}\n\n#[allow(dead_code)]\npub(crate) fn new_replay_client(num_requests: usize, with_retry: bool) -> StaticReplayClient {\n    let mut events = Vec::with_capacity(num_requests);\n    let mut start = 0;\n\n    if with_retry {\n        events.push(ReplayEvent::new(\n            http::Request::builder().body(SdkBody::empty()).unwrap(),\n            http::Response::builder()\n                .status(500)\n                .body(SdkBody::empty())\n                .unwrap(),\n        ));\n        start += 1;\n    }\n\n    for _ in start..num_requests {\n        events.push(ReplayEvent::new(\n            http::Request::builder().body(SdkBody::empty()).unwrap(),\n            http::Response::builder().body(SdkBody::empty()).unwrap(),\n        ))\n    }\n    StaticReplayClient::new(events)\n}\n\n#[allow(unused)]\npub(crate) fn extract_metric_data<'a, T: 'static>(\n    metrics: &'a Vec<ResourceMetrics>,\n    metric_name: &str,\n) -> &'a T {\n    &metrics[0].scope_metrics[0]\n        .metrics\n        .iter()\n        .find(|metric| metric.name == metric_name)\n        .unwrap()\n        .data\n        .as_any()\n        .downcast_ref::<T>()\n        .unwrap()\n}\n\n#[allow(unused)]\npub(crate) fn extract_metric_attributes<'a>(\n    metrics: &'a Vec<ResourceMetrics>,\n    metric_name: &str,\n) -> Vec<Vec<KeyValue>> {\n    extract_metric_data::<Histogram<f64>>(metrics, metric_name)\n        .data_points\n        .iter()\n        .map(|dp| dp.attributes.clone())\n        .collect()\n}\n\n#[allow(dead_code)]\npub(crate) async fn make_s3_call(config: &SdkConfig) {\n    let s3_client = aws_sdk_s3::Client::new(config);\n    let _ = s3_client\n        .get_object()\n        .bucket(\"some-test-bucket\")\n        .key(\"test.txt\")\n        .send()\n        .await;\n}\n\n#[allow(dead_code)]\npub(crate) async fn make_ddb_call(config: &SdkConfig) {\n    let ddb_client = aws_sdk_dynamodb::Client::new(&config);\n    let _ = ddb_client\n        .get_item()\n        .table_name(\"test-table\")\n        .key(\"foo\", AttributeValue::Bool(true))\n        .send()\n        .await;\n}\n\n#[allow(dead_code)]\npub(crate) fn make_config(with_retry: bool) -> SdkConfig {\n    SdkConfig::builder()\n        .credentials_provider(SharedCredentialsProvider::new(Credentials::for_tests()))\n        .region(Region::new(\"us-east-1\"))\n        .http_client(new_replay_client(2, with_retry))\n        .retry_config(RetryConfig::standard())\n        .build()\n}\n\n/// Util for printing spans for debugging purposes. Can be used with:\n/// ```\n/// let subscriber = tracing_subscriber::registry::Registry::default().with(PrintLayer);\n/// let _guard = tracing::subscriber::set_default(subscriber);\n/// ```\n///\n/// Outputs logs like:\n/// ```sh\n/// Span Created: s3.GetObject\n/// ATTR: rpc.service: s3\n/// ATTR: rpc.method: GetObject\n/// ATTR: sdk_invocation_id: 7048479\n/// Span Created: invoke\n/// ATTR: rpc.service: s3\n/// ATTR: rpc.method: GetObject\n/// Span Created: apply_configuration\n/// Span Closed: apply_configuration, Duration:  150\n/// ```\n#[allow(unused)]\npub(crate) struct PrintLayer;\n\n#[allow(unused)]\npub(crate) struct Timing {\n    started_at: Instant,\n}\n\nimpl<S> Layer<S> for PrintLayer\nwhere\n    S: Subscriber,\n    S: for<'lookup> LookupSpan<'lookup>,\n{\n    fn on_new_span(&self, attrs: &Attributes<'_>, id: &Id, ctx: Context<'_, S>) {\n        let span = ctx.span(id).unwrap();\n\n        println!(\"Span Created: {}\", span.metadata().name());\n        span.extensions_mut().insert(Timing {\n            started_at: Instant::now(),\n        });\n\n        attrs.values().record(&mut PrintVisitor);\n    }\n\n    fn on_close(&self, id: Id, ctx: Context<'_, S>) {\n        let span = ctx.span(&id).unwrap();\n\n        let started_at = span.extensions().get::<Timing>().unwrap().started_at;\n\n        println!(\n            \"Span Closed: {}, Duration:  {}\",\n            span.metadata().name(),\n            (Instant::now() - started_at).as_micros(),\n        );\n    }\n}\n\n#[allow(unused)]\npub(crate) struct PrintVisitor;\n\nimpl Visit for PrintVisitor {\n    fn record_debug(&mut self, field: &Field, value: &dyn std::fmt::Debug) {\n        let field_name = field.name();\n        let field_value = format!(\"{value:?}\").replace(\"\\\"\", \"\");\n        println!(\"ATTR: {field_name}: {field_value}\")\n    }\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/test.sh",
    "content": "#!/bin/bash\n#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\n\nset -eu -o pipefail\n\nfor f in *; do\n   if [[ -f \"${f}/Cargo.toml\" ]]; then\n      echo\n      echo \"Testing ${f}...\"\n      echo \"###############\"\n      if [ \"$f\" != \"webassembly\" ]; then\n         cargo test --manifest-path \"${f}/Cargo.toml\" --all-features\n      else\n         # The webassembly tests use a custom runner set in config.toml that\n         # is not picked up when running the tests outside of the package\n         # The tests are written for `wasm32-wasip1` but the manifest config also specifies\n         # `wasm32-unknown-unknown` so we can ensure the test build on that platform as well.\n         # For executing the tests, however, we explicitly choose a target `wasm32-wasip1`.\n         cd webassembly && cargo component test --all-features --target wasm32-wasip1 && cd ..\n      fi\n   fi\ndone\n"
  },
  {
    "path": "aws/sdk/integration-tests/timestreamquery/Cargo.toml",
    "content": "# This Cargo.toml is unused in generated code. It exists solely to enable these tests to compile in-situ\n[package]\nname = \"timestream-tests\"\nversion = \"0.1.0\"\nauthors = [\"Russell Cohen <rcoh@amazon.com>\"]\nedition = \"2021\"\nlicense = \"Apache-2.0\"\nrepository = \"https://github.com/smithy-lang/smithy-rs\"\npublish = false\n\n# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html\n\n[dev-dependencies]\naws-credential-types = { path = \"../../build/aws-sdk/sdk/aws-credential-types\", features = [\"test-util\"] }\naws-sdk-timestreamquery = { path = \"../../build/aws-sdk/sdk/timestreamquery\", features = [\"behavior-version-latest\"] }\naws-smithy-async = { path = \"../../build/aws-sdk/sdk/aws-smithy-async\", features = [\"test-util\"] }\naws-smithy-runtime = { path = \"../../build/aws-sdk/sdk/aws-smithy-runtime\", features = [\"test-util\"] }\naws-smithy-http-client = { path = \"../../build/aws-sdk/sdk/aws-smithy-http-client\", features = [\"test-util\"] }\naws-types = { path = \"../../build/aws-sdk/sdk/aws-types\" }\ntokio = { version = \"1.23.1\", features = [\"full\", \"test-util\"] }\ntracing-subscriber = \"0.3.17\"\n"
  },
  {
    "path": "aws/sdk/integration-tests/timestreamquery/tests/endpoint_disco.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_smithy_http_client::test_util::dvr::ReplayingClient;\n\n#[tokio::test]\nasync fn do_endpoint_discovery() {\n    use aws_credential_types::provider::SharedCredentialsProvider;\n    use aws_sdk_timestreamquery as query;\n    use aws_sdk_timestreamquery::config::{Credentials, StalledStreamProtectionConfig};\n    use aws_smithy_async::rt::sleep::SharedAsyncSleep;\n    use aws_smithy_async::test_util::controlled_time_and_sleep;\n    use aws_smithy_async::time::{SharedTimeSource, TimeSource};\n    use aws_types::region::Region;\n    use aws_types::SdkConfig;\n    use std::time::{Duration, UNIX_EPOCH};\n\n    let _logs = aws_smithy_runtime::test_util::capture_test_logs::capture_test_logs();\n\n    // For recording, switch to:\n    // let http_client = aws_smithy_runtime::client::http::test_util::dvr::RecordingClient::new(client);\n    let http_client = ReplayingClient::from_file(\"tests/traffic.json\").unwrap();\n    let start = UNIX_EPOCH + Duration::from_secs(1234567890);\n    let (ts, sleep, mut gate) = controlled_time_and_sleep(start);\n    let config = SdkConfig::builder()\n        .http_client(http_client.clone())\n        .region(Region::from_static(\"us-west-2\"))\n        .sleep_impl(SharedAsyncSleep::new(sleep))\n        .credentials_provider(SharedCredentialsProvider::new(\n            Credentials::for_tests_with_session_token(),\n        ))\n        .stalled_stream_protection(StalledStreamProtectionConfig::disabled())\n        .time_source(SharedTimeSource::new(ts.clone()))\n        .build();\n    let conf = query::config::Builder::from(&config)\n        .idempotency_token_provider(\"0000-0000-0000\")\n        .build();\n    let (client, reloader) = query::Client::from_conf(conf)\n        .with_endpoint_discovery_enabled()\n        .await\n        .expect(\"initial setup of endpoint discovery failed\");\n\n    tokio::spawn(reloader.reload_task());\n\n    let _resp = client\n        .query()\n        .query_string(\"SELECT now() as time_now\")\n        .send()\n        .await\n        .unwrap();\n\n    // wait 10 minutes for the endpoint to expire\n    while ts.now() < start + Duration::from_secs(60 * 10) {\n        assert_eq!(\n            gate.expect_sleep().await.duration(),\n            Duration::from_secs(60)\n        );\n    }\n\n    // the recording validates that this request hits another endpoint\n    let _resp = client\n        .query()\n        .query_string(\"SELECT now() as time_now\")\n        .send()\n        .await\n        .unwrap();\n    // if you want to update this test:\n    // conn.dump_to_file(\"tests/traffic.json\").unwrap();\n    http_client\n        .validate_body_and_headers(\n            Some(&[\n                \"x-amz-security-token\",\n                \"x-amz-date\",\n                \"content-type\",\n                \"x-amz-target\",\n            ]),\n            \"application/json\",\n        )\n        .await\n        .unwrap();\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/timestreamquery/tests/traffic.json",
    "content": "{\n  \"events\": [\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Request\": {\n          \"request\": {\n            \"uri\": \"https://query.timestream.us-west-2.amazonaws.com/\",\n            \"headers\": {\n              \"content-type\": [\n                \"application/x-amz-json-1.0\"\n              ],\n              \"x-amz-user-agent\": [\n                \"aws-sdk-rust/0.0.0-smithy-rs-head api/timestreamquery/0.0.0-local os/macos lang/rust/1.67.1\"\n              ],\n              \"authorization\": [\n                \"AWS4-HMAC-SHA256 Credential=ANOTREAL/20090213/us-west-2/timestream/aws4_request, SignedHeaders=content-type;host;x-amz-date;x-amz-security-token;x-amz-target;x-amz-user-agent, Signature=1b50e2545f06c8e1ca0e205c20f25a34b6aab82f3a47e4cc370e9a5fea01d08c\"\n              ],\n              \"x-amz-security-token\": [\n                \"notarealsessiontoken\"\n              ],\n              \"x-amz-target\": [\n                \"Timestream_20181101.DescribeEndpoints\"\n              ],\n              \"user-agent\": [\n                \"aws-sdk-rust/0.0.0-smithy-rs-head os/macos lang/rust/1.67.1\"\n              ],\n              \"x-amz-date\": [\n                \"20090213T233130Z\"\n              ]\n            },\n            \"method\": \"POST\"\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"{}\"\n          },\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Response\": {\n          \"response\": {\n            \"Ok\": {\n              \"status\": 200,\n              \"headers\": {\n                \"x-amzn-requestid\": [\n                  \"fcfdab03-2bb8-45e9-a284-b789cf7efb63\"\n                ],\n                \"content-type\": [\n                  \"application/x-amz-json-1.0\"\n                ],\n                \"date\": [\n                  \"Wed, 24 May 2023 15:51:07 GMT\"\n                ],\n                \"content-length\": [\n                  \"102\"\n                ]\n              }\n            }\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"{\\\"Endpoints\\\":[{\\\"Address\\\":\\\"query-cell1.timestream.us-west-2.amazonaws.com\\\",\\\"CachePeriodInMinutes\\\":10}]}\"\n          },\n          \"direction\": \"Response\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Response\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 1,\n      \"action\": {\n        \"Request\": {\n          \"request\": {\n            \"uri\": \"https://query-cell1.timestream.us-west-2.amazonaws.com/\",\n            \"headers\": {\n              \"content-type\": [\n                \"application/x-amz-json-1.0\"\n              ],\n              \"content-length\": [\n                \"73\"\n              ],\n              \"x-amz-security-token\": [\n                \"notarealsessiontoken\"\n              ],\n              \"user-agent\": [\n                \"aws-sdk-rust/0.0.0-smithy-rs-head os/macos lang/rust/1.67.1\"\n              ],\n              \"x-amz-date\": [\n                \"20090213T233130Z\"\n              ],\n              \"authorization\": [\n                \"AWS4-HMAC-SHA256 Credential=ANOTREAL/20090213/us-west-2/timestream/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-date;x-amz-security-token;x-amz-target;x-amz-user-agent, Signature=8174b6ca0ece22834b562b60785f47ef354b2c1ddf7a541482f255006b5f98c2\"\n              ],\n              \"x-amz-user-agent\": [\n                \"aws-sdk-rust/0.0.0-smithy-rs-head api/timestreamquery/0.0.0-local os/macos lang/rust/1.67.1\"\n              ],\n              \"x-amz-target\": [\n                \"Timestream_20181101.Query\"\n              ]\n            },\n            \"method\": \"POST\"\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 1,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"{\\\"QueryString\\\":\\\"SELECT now() as time_now\\\",\\\"ClientToken\\\":\\\"0000-0000-0000\\\"}\"\n          },\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 1,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 1,\n      \"action\": {\n        \"Response\": {\n          \"response\": {\n            \"Ok\": {\n              \"status\": 200,\n              \"headers\": {\n                \"content-type\": [\n                  \"application/x-amz-json-1.0\"\n                ],\n                \"date\": [\n                  \"Wed, 24 May 2023 15:51:08 GMT\"\n                ],\n                \"x-amzn-requestid\": [\n                  \"OFO47BQ6XAXGTIK3XH4S6GBFLQ\"\n                ],\n                \"content-length\": [\n                  \"318\"\n                ]\n              }\n            }\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 1,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"{\\\"ColumnInfo\\\":[{\\\"Name\\\":\\\"time_now\\\",\\\"Type\\\":{\\\"ScalarType\\\":\\\"TIMESTAMP\\\"}}],\\\"QueryId\\\":\\\"AEDACANMQDLSTQR3SPDV6HEWYACX5IALTEWGK7JM3VSFQQ5J5F3HGKVEMNHBRHY\\\",\\\"QueryStatus\\\":{\\\"CumulativeBytesMetered\\\":10000000,\\\"CumulativeBytesScanned\\\":0,\\\"ProgressPercentage\\\":100.0},\\\"Rows\\\":[{\\\"Data\\\":[{\\\"ScalarValue\\\":\\\"2023-05-24 15:51:08.760000000\\\"}]}]}\"\n          },\n          \"direction\": \"Response\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 1,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Response\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 2,\n      \"action\": {\n        \"Request\": {\n          \"request\": {\n            \"uri\": \"https://query.timestream.us-west-2.amazonaws.com/\",\n            \"headers\": {\n              \"content-type\": [\n                \"application/x-amz-json-1.0\"\n              ],\n              \"user-agent\": [\n                \"aws-sdk-rust/0.0.0-smithy-rs-head os/macos lang/rust/1.67.1\"\n              ],\n              \"x-amz-user-agent\": [\n                \"aws-sdk-rust/0.0.0-smithy-rs-head api/timestreamquery/0.0.0-local os/macos lang/rust/1.67.1\"\n              ],\n              \"x-amz-date\": [\n                \"20090213T234030Z\"\n              ],\n              \"authorization\": [\n                \"AWS4-HMAC-SHA256 Credential=ANOTREAL/20090213/us-west-2/timestream/aws4_request, SignedHeaders=content-type;host;x-amz-date;x-amz-security-token;x-amz-target;x-amz-user-agent, Signature=32e468e574c514ba0fa4a0f0304cef82b72f82965b9e8792fd63f6efb67b297c\"\n              ],\n              \"x-amz-target\": [\n                \"Timestream_20181101.DescribeEndpoints\"\n              ],\n              \"x-amz-security-token\": [\n                \"notarealsessiontoken\"\n              ]\n            },\n            \"method\": \"POST\"\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 2,\n      \"action\": {\n        \"Response\": {\n          \"response\": {\n            \"Ok\": {\n              \"status\": 200,\n              \"headers\": {\n                \"content-type\": [\n                  \"application/x-amz-json-1.0\"\n                ],\n                \"content-length\": [\n                  \"102\"\n                ],\n                \"date\": [\n                  \"Wed, 24 May 2023 15:51:07 GMT\"\n                ],\n                \"x-amzn-requestid\": [\n                  \"fcfdab03-2bb8-45e9-a284-b789cf7efb63\"\n                ]\n              }\n            }\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 2,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"{}\"\n          },\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 2,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 2,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"{\\\"Endpoints\\\":[{\\\"Address\\\":\\\"query-cell2.timestream.us-west-2.amazonaws.com\\\",\\\"CachePeriodInMinutes\\\":10}]}\"\n          },\n          \"direction\": \"Response\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 2,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Response\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 3,\n      \"action\": {\n        \"Request\": {\n          \"request\": {\n            \"uri\": \"https://query-cell2.timestream.us-west-2.amazonaws.com/\",\n            \"headers\": {\n              \"authorization\": [\n                \"AWS4-HMAC-SHA256 Credential=ANOTREAL/20090213/us-west-2/timestream/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-date;x-amz-security-token;x-amz-target;x-amz-user-agent, Signature=8b2abd7688aefb4004200e5fa087f6c154fde879f2df79d3f6c57934cdc8f62a\"\n              ],\n              \"x-amz-date\": [\n                \"20090213T234130Z\"\n              ],\n              \"user-agent\": [\n                \"aws-sdk-rust/0.0.0-smithy-rs-head os/macos lang/rust/1.67.1\"\n              ],\n              \"x-amz-target\": [\n                \"Timestream_20181101.Query\"\n              ],\n              \"x-amz-user-agent\": [\n                \"aws-sdk-rust/0.0.0-smithy-rs-head api/timestreamquery/0.0.0-local os/macos lang/rust/1.67.1\"\n              ],\n              \"content-type\": [\n                \"application/x-amz-json-1.0\"\n              ],\n              \"content-length\": [\n                \"73\"\n              ],\n              \"x-amz-security-token\": [\n                \"notarealsessiontoken\"\n              ]\n            },\n            \"method\": \"POST\"\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 3,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"{\\\"QueryString\\\":\\\"SELECT now() as time_now\\\",\\\"ClientToken\\\":\\\"0000-0000-0000\\\"}\"\n          },\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 3,\n      \"action\": {\n        \"Response\": {\n          \"response\": {\n            \"Ok\": {\n              \"status\": 200,\n              \"headers\": {\n                \"content-type\": [\n                  \"application/x-amz-json-1.0\"\n                ],\n                \"date\": [\n                  \"Wed, 24 May 2023 15:51:08 GMT\"\n                ],\n                \"x-amzn-requestid\": [\n                  \"OFO47BQ6XAXGTIK3XH4S6GBFLQ\"\n                ],\n                \"content-length\": [\n                  \"318\"\n                ]\n              }\n            }\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 3,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"{\\\"ColumnInfo\\\":[{\\\"Name\\\":\\\"time_now\\\",\\\"Type\\\":{\\\"ScalarType\\\":\\\"TIMESTAMP\\\"}}],\\\"QueryId\\\":\\\"AEDACANMQDLSTQR3SPDV6HEWYACX5IALTEWGK7JM3VSFQQ5J5F3HGKVEMNHBRHY\\\",\\\"QueryStatus\\\":{\\\"CumulativeBytesMetered\\\":10000000,\\\"CumulativeBytesScanned\\\":0,\\\"ProgressPercentage\\\":100.0},\\\"Rows\\\":[{\\\"Data\\\":[{\\\"ScalarValue\\\":\\\"2023-05-24 15:51:08.760000000\\\"}]}]}\"\n          },\n          \"direction\": \"Response\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 3,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Response\"\n        }\n      }\n    }\n  ],\n  \"docs\": \"todo docs\",\n  \"version\": \"V0\"\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/transcribestreaming/Cargo.toml",
    "content": "# This Cargo.toml is unused in generated code. It exists solely to enable these tests to compile in-situ\n[package]\nname = \"transcribestreaming\"\nversion = \"0.1.0\"\nauthors = [\"AWS Rust SDK Team <aws-sdk-rust@amazon.com>\", \"John DiSanti <jdisanti@amazon.com>\"]\nedition = \"2021\"\nlicense = \"Apache-2.0\"\nrepository = \"https://github.com/smithy-lang/smithy-rs\"\npublish = false\n\n[dev-dependencies]\nasync-stream = \"0.3.0\"\naws-credential-types = { path = \"../../build/aws-sdk/sdk/aws-credential-types\", features = [\"test-util\"] }\naws-sdk-transcribestreaming = { path = \"../../build/aws-sdk/sdk/transcribestreaming\", features = [\"behavior-version-latest\"] }\naws-smithy-eventstream = { path = \"../../build/aws-sdk/sdk/aws-smithy-eventstream\", features = [\"test-util\"] }\naws-smithy-http = { path = \"../../build/aws-sdk/sdk/aws-smithy-http\" }\naws-smithy-http-client= { path = \"../../build/aws-sdk/sdk/aws-smithy-http-client\", features = [\"test-util\"] }\nbytes = \"1.0.0\"\nfutures-core = \"0.3.29\"\nhound = \"3.4.0\"\nhttp-1x = { package = \"http\", version = \"1\" }\nserde_json = \"1.0.0\"\ntokio = { version = \"1.23.1\", features = [\"full\", \"test-util\"] }\ntracing = \"0.1\"\ntracing-subscriber = { version = \"0.3.15\", features = [\"env-filter\"] }\n"
  },
  {
    "path": "aws/sdk/integration-tests/transcribestreaming/tests/error.json",
    "content": "[\n  {\n    \"connection_id\": 0,\n    \"action\": {\n      \"Request\": {\n        \"request\": {\n          \"uri\": \"https://transcribestreaming.us-east-1.amazonaws.com/stream-transcription\",\n          \"headers\": {\n            \"user-agent\": [\n              \"aws-sdk-rust/0.1.0 os/linux lang/rust/1.52.1\"\n            ],\n            \"x-amzn-transcribe-sample-rate\": [\n              \"8000\"\n            ],\n            \"x-amzn-transcribe-language-code\": [\n              \"en-GB\"\n            ],\n            \"x-amz-user-agent\": [\n              \"aws-sdk-rust/0.1.0 api/transcribestreaming/0.0.16-alpha os/linux lang/rust/1.52.1\"\n            ],\n            \"x-amzn-transcribe-media-encoding\": [\n              \"pcm\"\n            ],\n            \"authorization\": [\n              \"AWS4-HMAC-SHA256 Credential=test/test/us-east-1/transcribe/aws4_request, SignedHeaders=content-type;host;x-amz-date;x-amz-security-token;x-amz-user-agent;x-amzn-transcribe-language-code;x-amzn-transcribe-media-encoding;x-amzn-transcribe-sample-rate, Signature=test\"\n            ],\n            \"x-amz-date\": [\n              \"20210831T003902Z\"\n            ],\n            \"x-amz-security-token\": [\n              \"test\"\n            ],\n            \"content-type\": [\n              \"application/vnd.amazon.eventstream\"\n            ]\n          },\n          \"method\": \"POST\"\n        }\n      }\n    }\n  },\n  {\n    \"connection_id\": 0,\n    \"action\": {\n      \"Data\": {\n        \"data\": {\n          \"Base64\": \"AAAguwAAAEPqTPNwEDpjaHVuay1zaWduYXR1cmUGACDwg8n8YCSkwJe0HkL5bnSVzcWB5MqlRyKEmYOoVoOOFgU6ZGF0ZQgAAAF7maUkcAAAIGgAAABYrnw/FQ06bWVzc2FnZS10eXBlBwAFZXZlbnQLOmV2ZW50LXR5cGUHAApBdWRpb0V2ZW50DTpjb250ZW50LXR5cGUHABhhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0AAAAAAAAAAAAAAAAAAAAAAAAAAAEA/f8EAPz/BAD9/wEAAAABAP7/AwD+/wAAAgD9/wQA/f8BAP//AQAAAAAAAAD+/wMA/v8AAAEA/v8CAP//AAD//wEAAAAAAAAA//8AAAEA//8BAP//AAABAP7/AwD8/wUA+/8EAP3/AgD//wAAAAAAAAAAAQD+/wEAAAD//wIA/v8BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wEAAAD//wEA//8BAP//AQD//wAAAQD//wEAAAD+/wMA/v8BAAAA//8CAP7/AQAAAAAAAAABAP7/AQAAAAAAAAABAP7/AQABAP7/AgD//wAAAAABAP7/AgD//wAA//8AAAEA/v8CAP7/AAACAP7/AgD+/wAAAQD//wEA/////wIA/////wIA/v8BAAEA/v8BAAEA/v8CAP7/AQAAAP7/AwD9/wIA//8AAAEA/////wIA/f8DAP3/AgAAAP//AQD+/wIA//8BAP//AAAAAAAAAQD//wEA////////AQD7/wQA+f8CAPv/AQD7/wIA+f8CAPn/AAD7/wEA+f8CAPn//v/7//3/+//9//r//P/8//v//P/6//v/+//6//v/+P/7//j//P/3//z/9v/9//b//P/2//r/+f/4//n/+P/5//f/+v/3//r/9v/7//X/+//0//v/9f/7//X/+f/4//j/+f/2//r/9f/4//b/+P/3//X/+P/1//j/9P/3//T/9v/0//f/8v/3//T/9P/1//b/8f/4/+//9//w//X/8v/1//H/8//x//P/8f/x//L/8P/0//D/8f/y//D/8v/t//P/7//x/+7/7//t/+//7//t//H/7v/z//H/7//z/+3/8f/w/+z/8v/r//H/7v/v/+z/8P/s//D/7P/t/+//6v/u/+r/7v/r/+7/6v/s/+z/7P/r/+7/6//s/+z/6//t/+z/6v/v/+b/7P/p/+v/6f/q/+j/6v/o/+b/6P/o/+j/6//m/+r/5v/o/+j/5//o/+j/6P/q/+n/6P/s/+b/8P/m/+3/6//q/+7/6f/t/+n/7P/p/+v/6v/r/+n/5v/p/+T/6v/i/+n/5f/o/+f/5//n/+b/6f/o/+f/5//n/+b/6f/m/+f/6//n/+v/6v/m/+v/6P/u/+f/7P/q/+v/6v/r/+z/6P/s/+f/7P/p/+z/5v/v/+X/7P/n/+n/6P/o/+X/6P/o/+j/6P/n/+f/6v/n/+v/6P/r/+r/7//r//D/7f/y/+//9P/v//H/8f/w//T/8f/1//H/7//w/+//7//u/+7/7//p/+3/6f/r/+f/5v/p/+L/7P/k/+z/6P/q/+j/6f/n/+n/6f/q/+f/7f/o/+n/6f/q/+z/6v/u/+j/6//o/+n/5//o/+b/6//l/+r/5f/q/+b/6P/l/+T/5v/j/+X/5f/l/+X/4v/j/97/3//a/9z/2f/c/9f/2v/Z/9X/2v/V/9j/1v/V/9f/1f/U/9X/1P/V/9D/1//T/9X/1P/T/9T/0//V/9n/1//b/93/4//h/+X/5P/j/+f/4v/s/+j/6v/n/+b/4f/k/+D/4v/h/+X/4//k/+j/4//n/+f/5//r/+j/6v/o/+j/6//l/+v/5v/s/+H/7P/i/+f/5f/k/+v/5P/o/+b/6//k/+P/5//j/+b/6P/j/+n/4//o/+X/5//k/+f/5f/p/+f/6f/l/+z/6f/q/+n/6f/o/+n/6f/q/+3/6f/r/+z/6//v/+3/8//q//P/7f/w/+//7P/t/+n/8P/s//L/6v/v/+f/8v/n//L/8P/u//D/7//t//D/7P/t/+//7v/0/+z/8f/q/+v/7P/r/+v/7v/r/+r/6v/n/+v/5v/q/+z/7f/s/+z/7f/s/+v/6v/p/+j/4//p/+P/6P/l/+r/6P/r/+r/6//p/+r/5f/r/+b/6f/o/+P/6P/l/+f/5f/n/+P/5P/l/+T/6f/i/+f/5f/m/+H/5v/g/+P/3//i/+H/3v/g/9r/3//b/97/4P/g/+D/2//f/9j/3v/j/+H/5P/k/+z/7v/o//D/5//w/+j/6f/n/+f/5f/j/+P/3//h/+L/2//h/9v/3f/Y/9f/1//Y/9n/2//Y/9z/3P/Y/9r/1P/f/9P/3f/Z/9v/2//e/9z/2//j/9z/4P/f/+P/4f/g/97/4f/d/+D/3P/j/+D/3//j/9z/3//Y/93/2v/W/9j/0P/T/87/zv/K/87/yf/L/8b/wf/K/8P/yf/J/8r/yf/H/8n/yP/J/8n/0P/M/9P/zf/S/9D/1//O/9f/y//S/9P/0P/O/8//zv/P/87/zv/M/8z/zf/H/8//yf/S/83/0f/P/9D/0f/P/8j/zf/K/8T/y//D/8v/xf/F/8L/wf/B/8H/vv/E/8H/yf/G/8n/wP/I/8T/yf/K/8r/z//L/87/0//M/9f/z//U/83/0f/T/9L/1v/T/93/2f/e/+D/2P/l/93/4f/X/+D/2P/a/9z/3f/c/9D/0//Z/9L/zf/O/9//0//I/9D/1//T/9P/yf/O/9P/3P/G/8b/zv/m/9X/yv/I/9b/2P/U/9X/yf/M/+n/2P+5/83/8P/d/9L/1P/k/9v/zf/Y/9z/3P/U/8n/yf/V/9T/0P/U/9n/4//i/9T/1v/c/9f/0P/W/97/1P/Z/+b/2f/U/9P/6v/v/+r/4v/p//X/3v/b/+b/5P/W/+z/5v/v/9//5//u/+D/2f/8//f/+P/J/+v/AgD5/+f/wP/H//r//v/4/+b/+/8TAOz/8v/l/yYA5//R//f/VQDq/+b/4v8hAOz/OADm/0YAXQC8AJoAGwF0A5MI0QuV9rftVAB9C6j9SvF1/RMKAAR995n7uAbmBmH+CPm0AC4F2v5Z/bf89QPyAcz9dAA2APQArf5XAF8AYv5p/57/nP77AZAAGf/j/yMBtv+l/nUBaAC9APX/GwAdATEAXv2p/qIC8/8+/Sz/JwIXA6v+BP4+Ac8CigCi/HsAwQHKABMBzP9N/pEBTQTs/Sr9lAGDAWv9FP63ApEAg//7AO7/W/5nAIYBf//F/W7+ngFPAcT9Tf7nASUCD//M/mICHAG0/kwADAGk/woAGgAqAGQAbv+vAD0Af/4L/yUAWP8b/Vz+i//I/T3+Cv91/xz/egAIAML+gQAsAQwAzf+pAdEAvAD4AGIAywA6AeYAfAHRAtoAMAHBAzYDBAK9AYkDXQP8AToCCQFPAD0AOf7P+0787fs2+Xz4T/mv+MX4W/m1+c36mftm/Nb9F/9GACYCnQMVBVoGlgdkCAgJHguIDV8NmA0VDpQK9wjYB0QCr/5W/vb5R/Nq8d7x8u6E6wHtk/BC8nLy8PUM/AH+tP0JAFgEJgYMBfwFcQliCoYJbQq1C68M0QzwDtoQaA6yC48LbAoeBRYBp/zU9z/1EfAw6zvsMOy36M3qn/A38wP06feE/cMAIAGwAfUEmgbNBsoI+whaCZMLWQy/DGYPAhJVE3QR1g/6EEkNHgbnAZ/+zfeJ8SntWuro6HnnOud86mPukfEY9nj6n/6FAoYEegW6BvoHhggICBQJwQmuCQYLWgzADXYSSBTxEaISmBIKDaUGXgJu/Kn0je7D6brlkOQW5W/lR+jE7oDz3/bT/PwBAgSSBiEITQjUCGYIEgh7CfQJtAlaCjsLmw/GFLgUQhLHFGgTnAoEBdcA0/cS8GnreOX84lbjb+NP5rrr/u8A9YH7YgAmA10GsgfMCM8IHgiXB+QIHAl+CHQKywvnDuYTMxeJEmsS3BQLDoYE8QDo+t/wXusP54rjU+IU4wblI+p373rzm/lZ/zUCEQbFB4IIignkCZAIrgm+CuIJMQufDCUOWhPkGFoTUhEsFRgQPAV5/4f6o/I26+fkxeLy4WDhcuPj6I3uFPNL+AX+5wK4BU0HBQkQCksKBgrHCV4KCgt7CyINoA7tE0AYpROAEloWRRCEBfUA5vq58WPqcOW94szgYeAx5N3o2OzT8u74av0IAu8FqAfACF4KxQp7Co8KFQuhC2MMoA7CEJcVbRdOFOwTFRSQC8gCx/489i7tRugy5PLhi+HD4f3mGuyF7371pvu3/6oDrAbvB6MJrArhCU8LPgvLCu4LdQ0KEJoTRhcXFnMVPBalD+YGugJS+THwjuvj5IDh7eHW4I3kQurg7LzzVPr1/BoCUAZfB/gIzwlgCZAKxAsYCvcK2Qw5Dn8RXBanFgkUSxTsEqAJMQIt/dnz0+x551rkIeJ64t7jf+hu7Zrx+PfA/BEBBwQCBmUIWwl2CREKVgv0C9IL1gteDVsOjxNfGHkSLhEeFawM3f+C/7P4H+776XbmoOWj4xnk2emP7WzwIfZj+kn+ywH2AtEFygisBkQI3ApBCo8KyQs8DKMNFRANFrkVyhD6ErUP8AbFAJz8HfWU7lXqYefL5X7lIudg68HuqfJn+H/7eP/qAmgEvgbbB+UHtgiRCqAKOgsHDAsNlQ4XEhgV9hEqESAPqQq9AuX8Tfis86Ht2+rc6hzoeeqG61nucfIJ9Zj4Lv0x/uwATQRBBKcFDQffB9IIXQpPCn4LOQ33DG0OZQ7cDZINJwp8CD8HwQFL/T78xfdE9FzzFvHW8KDx5fDb8lb1MPbU+PX5MPsM/YD9fP6r/54ARwFyAgUE7QUoB9EHUQlVCvoJHQoFC5YJ5AhqCC8GPwXyA/UBeAFXABr/qv6U/Wj8U/uN+gH5Dvh+9zX3vfZ59rj2EffN9yP48vgm+nX7kPzo/Xz/KwHpAmQEOga5ByQJPwpRCwUMPwz6CykLXAosCa8HOAaFBLoCJgGk/xD+Avxi+v74S/fk9Zn0j/MO87/y+/LH88f0jvZi+D76YPx9/pEAugJbBCAGxAfZCPcJ+Qq+Cx8MPQzZC2kLUwoRCaUH5gVMBGYCiADD/g39U/vS+Yv4Y/dl9rv1P/UG9T71ffVO9k73ZfjK+W37A/3F/jkAxgE8A3cErwW4BrUHighBCYwJwgmVCS0JngjEB70GmgVSBA0DrwFPAPb+r/1i/CX7C/oY+Wb4sfd991P3cPex9yT44Pi8+cz6x/sK/Vb+kP/WABcCHAM9BEQFHAbVBlQHtQcACAUI0wdlB9IGCwYWBfED4ALEAYkAQf8a/hz9J/w++5L67/l6+SH5x/jN+O34Lfmh+Vn6Ifsg/B79SP5t/40AkAGCAmEDFgTBBEUFwAUGBk4GcgaABmwGLAbABSAFawSPA38ChwFpAFL/N/4j/Un8kvvR+j765vmS+YT5l/nA+Sb6ofpU+y78Gf0k/jL/GAAUAeUBsgJ+Ax4ErgQwBZUFzAX4BfgF2gWNBSUFhgTMA+0C9wEBAfn/C/8k/kz9jvz2+3T7EvvE+oz6ffqJ+rj6Dvt7+w78xfx9/WT+PP8gAO0ArQFtAhYDrwMkBJEEzwQFBRoFCgXqBKoEQQTLAywDhALGAQkBNgB2/7v+Gf6B/QD9pPxa/CP8DvwE/B/8Ofxz/Ln8Ev2E/QD+hf4O/6v/SADiAGQB1QE4AosCxQLwAgMDGgMXAxsD/gLpAr8CkgJNAvsBjgEVAZEA/v9u/+f+b/79/Z39Vf0g/fr84/zi/PH8Ev0//YT91f0y/qf+GP+a/xMAkQAHAW4BxQEPAkcCdAKOAqoCsgK0AqQCjAJmAjYC8wGkAU8B5QB0AAEAiP8V/6D+P/7n/Z79Yv1A/S/9Nv1Q/Xn9uf37/VX+sv4U/3//6f9PAK0AAwFLAYgBuAHfAfkBAAICAvQB5QHEAaMBcwFCAQQBzgCSAFoAHQDg/5f/Tv8R/9L+nf51/lT+NP43/jX+Tf5v/pf+0v4O/1r/ov/m/yoAZgCkANEA/gAoATsBUQFcAVIBRwE8ARoBAAHXAKkAdABFABEA4P+s/4L/Wf8z/xf/+P7h/tP+yf7C/s7+2f7y/hb/Qv9x/6H/0/8OADcAbQCKALIAxgDhAO4A9gD5AO8A4gDOALoAnQB5AFUAJgD//8//rP+H/2r/Sv86/yj/Iv8b/xb/Hf8o/zD/SP9o/4X/qf/J//P/FwA7AFYAagCMAKMArwC9ALQAtgCiAJsAgAB2AFwAPgAlAAsA7P/V/7v/pv+L/4L/bv9p/2j/av90/4v/m/+y/8z/5P/8/wwAIgAvAEMATABcAGAAaABrAGsAaABhAFQASAA7ADAAGwALAPT/3f/F/7L/o/+R/4L/e/95/3b/ev9+/4j/k/+j/6//w//S/+P/9P8EABgAHQAvADsASgBJAFYAUwBTAE0ASwA7AC8AIgAQAAMA7v/j/9b/vP+v/53/k/+O/43/iv+M/4//lP+g/6r/w//O/+L/8P8GABIAIwAmADUAOQBAAEMAOQBBADcAMQApACUAGwAKAAEA+v/1/+b/3f/V/8v/xv+9/8D/vP+7/73/xv/H/8r/zv/W/+D/7v/5/wYACAAUABMAGgAbABoAIAAaAB4AFwAUAA4AAwAEAPn/9f/v/+f/3v/b/9P/1//O/9P/xv/J/8f/x//Q/9H/2//e/+H/6f/w//f//f8BAAkAEQAMABYADAARAAoADgALAA0ACgAIAAIA///2//X/6v/n/+T/2P/Y/87/z//L/9H/1P/O/9P/2P/Y/9v/2f/n/9v/6f/o/+z/7P/w//D/+P/1//b/9//2//f/9f/y//H/7P/o/+f/3f/i/9//2//a/9T/1P/W/9L/2//R/9b/1f/X/9z/2P/d/93/4v/e/+D/4v/h/+T/3P/i/97/4v/l/+H/4f/c/9z/2v/d/9T/1//Q/8v/0P/J/8n/yv/Q/83/z//S/9T/1//a/9j/3P/c/9r/3f/j/93/3//g/97/3P/Z/9f/2P/b/9r/2v/a/9f/2f/T/9P/0f/R/87/zf/O/9L/zv/U/9n/1//b/9r/4f/k/+b/6v/n/+3/7P/x//T/7v/v//L/7f/w/+v/6v/q/+H/6f/i/+X/4v/g/9r/3f/S/9r/1f/Z/9n/1v/c/9v/3//c/97/4//g/+X/5//o/+j/7P/q/+b/7P/l/+v/8v/0//D/8v/v//L/7//z//3////2//T/+//4//P/CAD1//z/AAACAAEA7//3/wEA6P/+//v/+f/S//H/6v/l/9L/CQDg/97/5P/9//D/7v8LABMA9v///zcA///z//H/BAAOADEAuP8wAOL/UwAlAGUACABmAKr/eQBkAP8AtQEcBI4GA/lD/zsCfPx8ACcAtQD1/BT+IgNS/ov+wQMKATsBq/2eAMQBYf8vAd3+qf4Q/xcA+QDy/3z+tgEDAGv88gIrAJz9dQLV/68Bxf2/APYCifu6AK4B7/6q/Tv/RAA3/tD+r/8qAFT9fQA0Af79ZwEVAPj/hv+3AO0Apv3uASEAKv7HAPf/4wDn/qwA9wDI/WgB7P+n/9X/FP++AMX+uf8BACT/ewAhAOv/JADh/2IA4gDEACQB6ADu/2gAJwDf/7oAn/9M/3b/C/8u/1D/qf8Z/xf/YQAZAVcCogFtAmQE7gKUA4MDgwIKA1YCBgPnAXUBuwLF/if+1/9H/Qn8q/th+975LvhP+SP4KPcS+bT4XvlQ/HX9Dv+WAasCbwRVBq8GFgjXCBEJjwvoDPEMuQ5HD/4MhwuGCi8HYgKq/AX4QPTW7ljrE+oj6ZTpRuuN71bzjvfl/fj/wwIaB3MFqQRuBScEywNUAhMDSgSjAyEHVQnFDFUTRRZMFwIWZxTHEMAIQwM++5XwVey/5S3h/+G64bvnCe138mv8jQB1BcsKYgvqC5MH4QMrABv5zfe39lb2tvqx/nIEIgkoDx8Yxxx+IwIkQB9XHloTnwbV/Brwj+fR3l3aB9z+213iZOs08nj87wR2Cm8PMw+wDXEKDAS1/t32FfFl72vspPAz9mf8hQZyDDcWyxs+H7YlEigmJCYarxaCC1r45PG750beqNtg2C3hWuIP51P5Zf1rA+gNbRDdEDwNbQriBT36L/XQ8cLrJOsZ7qLztfohA0EPGxUBGfwf6CE8IjMk4yJwFtoPhgmO9zLta+gk4FjaPd595eflJe0u/GwAYgTGC/QNkwlbBQMGDf7g8nb0a/FD6u3uBPVy+ar+mAkTE9wU8RneGx8aWBr2F6AciBh7DIAPsgWP99DzU+ti5+/hcuS/6qznBfIv+6f7lQMFBiIHQAXb/7oA+viu8i/zPfJQ8Hryxfjr/p8D8glwEQIUfxaHF8wTRRSTFIgUehw6EdEL/BGD/0v1vfRP6hTjv+LA6K3qReil9pcAdvyBAqwIyAVb/9z8wvyp9ObvcfL+8kHyFvcxAO0EfQlTEEkWjRaGFIMUbBCaDYkNiBXXFpYMABPJD1n/yfno9DLsteLq42vqQuZM61r5K/rC/WkEgAZaA2P/vv/R+cjyAPQq9LXx2PUj/IkAzAQaC2IOYBAuE2QSUg8DDYELjwv7EA4aHxXNDcgUDAqk9gH0HPD25UPgz+Va7ADpgvM9AOP+qgJ/CBEHMwFq/M780veI8BD0S/Xc84D5KABgAxgHzAuMDskOHhDyD5kMVwg8C60NYRR8G9YQShG4ER3/CPYx8Azq0eSp4PDq4OvF7Tn9uwGNAW8IeAgcA+j+P/tH+HnxH/Gf8y7y2fbY/KD/yQVUBxkMjg1WDf0Rfgw2C20KbAqmEGsaQxomD9oU1A6W99j0//H15XviQunr7dDrXPVzAeEBvwDwBy4HkPvL+6v7c/JI8NryV/IR81X5X/8rAfkF4wtUCzkLlA7iDW0InwgQCdIJTA68GVIe4w4fFqoS3vjc92T1/uc64pbqf+936fHzHQEl/g4BrQc3BTD8kfzO/OzxD/Fo823wOfK/+Sn9KP8TBcoKtArZCtkPWQ0GC6gLIQnnCJIMVROoGzwTmRCsFMMBOPh392DsV+Rj6o/sien87y/7/Pu7/FQGkwOJ/un/3fws9nT07vRW80HzRfmP/Cv+HANTBysJawkuDTUOKwv9C6oKrwa/CxAPmhhYF9MNmBfZC9b5Yfxk9Ivnzuj97SLq+ujv9+z66PXPAl0FT/2r/7L/o/l39Sr2sPWc87T2dPqJ/AcBNQT2BrIJBQujDK4N7wziC1YKGgtqDYQPYhrCECENRRaLAp/6Vf338LjpgOvA7tjpoOnt+Pf1EvU7AigBIfzn/3kBVPrm9qT6+PbC86b4Svp4+wD/yALjBR8I0An0DT4OMQx0DDwNLAlKDF8ToxbHDuQSUhZh/5gBFACv7ojtMfAm6x/nne1C9LrwBvfv/zb9Hv5XAtUB6fql+6z8PfZh9Tf6Qvji92D+PgGIAdYFNgw4C3sMhg+sDpALGQvjDiYRihfPEc8RwxR9A6IBpP+A8YvvIe/46/Dne+s98sDvovQp/VP91v2fAZsCuv2Z/TL+YfgF+Pj4/fey9zD8iv35/kQEAQiqCbEMuBAsD/QNyQ3LDvEMxBKkFNsM4hCKDewBSgEu/BHyoPBu8JfqQOlG7UzvQu8/9sH61Poh/w0BXQGv/r0AdP5x+vf7uPl9+JL6Tfyp/dv/kgSQB+kIgw31DnsN3g4HDvMMLw/oEzsRgwwwEH4JFQIlAXr7ZvKL8WHwCumj6e7ti+3q7oz2xPjd+AwA0AHz/oICFgIw/lL+jv2x+jr6J/19/P/8twFJAtAFGwl9CwYN6Q3PDtAMSw9tEFwSTRGODvwOkgjMA1YCbvk29ALzbe41647pWu2W7NXtAfYx9tL4pP97/5sADwNNAbwAR/9Q/nb8h/uZ/Er8WP1K/74BOAMaB78JmQsODeMOnw5lDtQQkxDOE8gO6AwWDw4F1QE2Anz15vHG9KDrLehr7A7tg+l68K32gfNO+p4By/0rAdkFDQAZAMAC5/08/Cr+ifyd+zb+WwASABQFUQgHCRoNDA6kDhYPLw9FEaARxhFlDyQOAgsTBeUDH/xN9jv19e4o7BDr8OmN687r+PAg82b1EvwY/WL/7QJYAvwB+QI6AFL/x/7k/Bb89fw+/aP9cgCVA9UF6Qf6DEANUQ0REPcQChBCEscViQ0rDnYOfgIzA47/8/RN9bry5esn7P7s1OoI7CfymPE69BP8uPqu/ZACKAGTAZcCzQExAH//tv+e/eL9jf72/r//iQICBe4GOwquDIwNag7VEJcQWBJdFH8RxA7XDhAIOgSoAXL5mvb/85HuC+zP6xHqB+t47R/vbfFa9uH4t/ox/08AogCXAlMC3AC9AckAa//n/zj/+f/XAP8BpAReBqAIgQv7DGkNJBAgEQMRaRMyEp4PKw8XCxMG7gPu/fn3bvfY8HjssO3M6UzpiOyq7Ijuj/Oc9pL4YvyQ/7r/0QGqAmkBTwIGAm4AeQCsAJz/bABPAk0CmwSGB3IIWwuhDNkNhA+uEIoRVBMtEqYPxA8wCmYGgANB/Tf5kPW98cTt8euo6z7pOOt87XPte/LV9TD3k/um/vz+tAHsAh8CPgMWA2sBzAGbAV4AMwHwAZsCVAThBqgHnApWDLIMsA9fEMcQrBOuEuwPxhDqDJUHSQVxAef5FfcU9XDtGuyf7LfnIOmK7Ivq5u6Q8zT0avgC/a/96f/NAu8BtAL2A0sCrAICA+cBbgLwAqQDwATTBr4HyQnFC0YMWA6rD0wQnhE0ElEQpg/2DcQI/AXMAj78Hfni9XXwYe0B7Rfq8+hM7ATrpu2W8sXy1PZM+zH88P6jAdgBHQLxAxEDMAJgA2wCvQErA0cDrwPiBSEHYQgPC+ML4gwbD9UPWRDEEPgQgA+RDV0LmAgzBIIBi/xf+CP2efFt72nt9Ovt69XrF+2h76nw/vML95H40PsD/g3/kgCXAfQBPAJ0AvQCXgJpA8gDHgTvBXcG1Ad6CaUKUws3DOcNgw0XDjsPfQ0eDigMcQpACMsEpgJe/iP7Jfjb9HDx2e9r7j7tM+3d7bvu3fAB8zf14Pdh+r78f/6AAOoAdQH0AvoBIQL8AkUt2ZgzZarA\"\n        },\n        \"direction\": \"Request\"\n      }\n    }\n  },\n  {\n    \"connection_id\": 0,\n    \"action\": {\n      \"Eof\": {\n        \"ok\": true,\n        \"direction\": \"Request\"\n      }\n    }\n  },\n  {\n    \"connection_id\": 0,\n    \"action\": {\n      \"Response\": {\n        \"response\": {\n          \"Ok\": {\n            \"status\": 200,\n            \"version\": \"HTTP/2.0\",\n            \"headers\": {\n              \"x-amzn-request-id\": [\n                \"2a403be0-845e-421f-9994-a396ed77c5b3\"\n              ],\n              \"x-amzn-transcribe-language-code\": [\n                \"en-GB\"\n              ],\n              \"x-amzn-transcribe-session-id\": [\n                \"a045ee4a-0748-4abb-9193-2b437e4158a2\"\n              ],\n              \"x-amzn-transcribe-media-encoding\": [\n                \"pcm\"\n              ],\n              \"x-amzn-transcribe-show-speaker-label\": [\n                \"false\"\n              ],\n              \"x-amzn-transcribe-enable-channel-identification\": [\n                \"false\"\n              ],\n              \"content-type\": [\n                \"application/vnd.amazon.eventstream\"\n              ],\n              \"x-amzn-transcribe-sample-rate\": [\n                \"8000\"\n              ],\n              \"x-amzn-requestid\": [\n                \"2a403be0-845e-421f-9994-a396ed77c5b3\"\n              ],\n              \"x-amzn-transcribe-enable-partial-results-stabilization\": [\n                \"false\"\n              ],\n              \"date\": [\n                \"Tue, 31 Aug 2021 00:39:02 GMT\"\n              ]\n            }\n          }\n        }\n      }\n    }\n  },\n  {\n    \"connection_id\": 0,\n    \"action\": {\n      \"Data\": {\n        \"data\": {\n          \"Base64\": \"AAAAvAAAAGGKoGuyDzpleGNlcHRpb24tdHlwZQcAE0JhZFJlcXVlc3RFeGNlcHRpb24NOmNvbnRlbnQtdHlwZQcAEGFwcGxpY2F0aW9uL2pzb24NOm1lc3NhZ2UtdHlwZQcACWV4Y2VwdGlvbnsiTWVzc2FnZSI6IkEgY29tcGxldGUgc2lnbmFsIHdhcyBzZW50IHdpdGhvdXQgdGhlIHByZWNlZGluZyBlbXB0eSBmcmFtZS4ifRYzqy8=\"\n        },\n        \"direction\": \"Response\"\n      }\n    }\n  },\n  {\n    \"connection_id\": 0,\n    \"action\": {\n      \"Data\": {\n        \"data\": {\n          \"Utf8\": \"\"\n        },\n        \"direction\": \"Response\"\n      }\n    }\n  },\n  {\n    \"connection_id\": 0,\n    \"action\": {\n      \"Eof\": {\n        \"ok\": true,\n        \"direction\": \"Response\"\n      }\n    }\n  }\n]\n"
  },
  {
    "path": "aws/sdk/integration-tests/transcribestreaming/tests/success.json",
    "content": "[\n  {\n    \"connection_id\": 0,\n    \"action\": {\n      \"Request\": {\n        \"request\": {\n          \"uri\": \"https://transcribestreaming.us-west-2.amazonaws.com/stream-transcription\",\n          \"headers\": {\n            \"user-agent\": [\n              \"aws-sdk-rust/0.1.0 os/linux lang/rust/1.52.1\"\n            ],\n            \"authorization\": [\n              \"AWS4-HMAC-SHA256 Credential=test/test/us-west-2/transcribe/aws4_request, SignedHeaders=content-type;host;x-amz-date;x-amz-user-agent;x-amzn-transcribe-language-code;x-amzn-transcribe-media-encoding;x-amzn-transcribe-sample-rate, Signature=test\"\n            ],\n            \"content-type\": [\n              \"application/vnd.amazon.eventstream\"\n            ],\n            \"x-amzn-transcribe-language-code\": [\n              \"en-GB\"\n            ],\n            \"x-amz-user-agent\": [\n              \"aws-sdk-rust/0.1.0 api/transcribestreaming/0.0.16-alpha os/linux lang/rust/1.52.1\"\n            ],\n            \"x-amzn-transcribe-sample-rate\": [\n              \"8000\"\n            ],\n            \"x-amzn-transcribe-media-encoding\": [\n              \"pcm\"\n            ],\n            \"x-amz-date\": [\n              \"20210827T200822Z\"\n            ]\n          },\n          \"method\": \"POST\"\n        }\n      }\n    }\n  },\n  {\n    \"connection_id\": 0,\n    \"action\": {\n      \"Data\": {\n        \"data\": {\n          \"Base64\": \"AAAguwAAAEPqTPNwEDpjaHVuay1zaWduYXR1cmUGACCwAg9cEv/Y/foIGAaJxU4UAcyjUPB9Vms4dy2jn4KybAU6ZGF0ZQgAAAF7iTpG2AAAIGgAAABYrnw/FQ06bWVzc2FnZS10eXBlBwAFZXZlbnQLOmV2ZW50LXR5cGUHAApBdWRpb0V2ZW50DTpjb250ZW50LXR5cGUHABhhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0AAAAAAAAAAAAAAAAAAAAAAAAAAAEA/f8EAPz/BAD9/wEAAAABAP7/AwD+/wAAAgD9/wQA/f8BAP//AQAAAAAAAAD+/wMA/v8AAAEA/v8CAP//AAD//wEAAAAAAAAA//8AAAEA//8BAP//AAABAP7/AwD8/wUA+/8EAP3/AgD//wAAAAAAAAAAAQD+/wEAAAD//wIA/v8BAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//wEAAAD//wEA//8BAP//AQD//wAAAQD//wEAAAD+/wMA/v8BAAAA//8CAP7/AQAAAAAAAAABAP7/AQAAAAAAAAABAP7/AQABAP7/AgD//wAAAAABAP7/AgD//wAA//8AAAEA/v8CAP7/AAACAP7/AgD+/wAAAQD//wEA/////wIA/////wIA/v8BAAEA/v8BAAEA/v8CAP7/AQAAAP7/AwD9/wIA//8AAAEA/////wIA/f8DAP3/AgAAAP//AQD+/wIA//8BAP//AAAAAAAAAQD//wEA////////AQD7/wQA+f8CAPv/AQD7/wIA+f8CAPn/AAD7/wEA+f8CAPn//v/7//3/+//9//r//P/8//v//P/6//v/+//6//v/+P/7//j//P/3//z/9v/9//b//P/2//r/+f/4//n/+P/5//f/+v/3//r/9v/7//X/+//0//v/9f/7//X/+f/4//j/+f/2//r/9f/4//b/+P/3//X/+P/1//j/9P/3//T/9v/0//f/8v/3//T/9P/1//b/8f/4/+//9//w//X/8v/1//H/8//x//P/8f/x//L/8P/0//D/8f/y//D/8v/t//P/7//x/+7/7//t/+//7//t//H/7v/z//H/7//z/+3/8f/w/+z/8v/r//H/7v/v/+z/8P/s//D/7P/t/+//6v/u/+r/7v/r/+7/6v/s/+z/7P/r/+7/6//s/+z/6//t/+z/6v/v/+b/7P/p/+v/6f/q/+j/6v/o/+b/6P/o/+j/6//m/+r/5v/o/+j/5//o/+j/6P/q/+n/6P/s/+b/8P/m/+3/6//q/+7/6f/t/+n/7P/p/+v/6v/r/+n/5v/p/+T/6v/i/+n/5f/o/+f/5//n/+b/6f/o/+f/5//n/+b/6f/m/+f/6//n/+v/6v/m/+v/6P/u/+f/7P/q/+v/6v/r/+z/6P/s/+f/7P/p/+z/5v/v/+X/7P/n/+n/6P/o/+X/6P/o/+j/6P/n/+f/6v/n/+v/6P/r/+r/7//r//D/7f/y/+//9P/v//H/8f/w//T/8f/1//H/7//w/+//7//u/+7/7//p/+3/6f/r/+f/5v/p/+L/7P/k/+z/6P/q/+j/6f/n/+n/6f/q/+f/7f/o/+n/6f/q/+z/6v/u/+j/6//o/+n/5//o/+b/6//l/+r/5f/q/+b/6P/l/+T/5v/j/+X/5f/l/+X/4v/j/97/3//a/9z/2f/c/9f/2v/Z/9X/2v/V/9j/1v/V/9f/1f/U/9X/1P/V/9D/1//T/9X/1P/T/9T/0//V/9n/1//b/93/4//h/+X/5P/j/+f/4v/s/+j/6v/n/+b/4f/k/+D/4v/h/+X/4//k/+j/4//n/+f/5//r/+j/6v/o/+j/6//l/+v/5v/s/+H/7P/i/+f/5f/k/+v/5P/o/+b/6//k/+P/5//j/+b/6P/j/+n/4//o/+X/5//k/+f/5f/p/+f/6f/l/+z/6f/q/+n/6f/o/+n/6f/q/+3/6f/r/+z/6//v/+3/8//q//P/7f/w/+//7P/t/+n/8P/s//L/6v/v/+f/8v/n//L/8P/u//D/7//t//D/7P/t/+//7v/0/+z/8f/q/+v/7P/r/+v/7v/r/+r/6v/n/+v/5v/q/+z/7f/s/+z/7f/s/+v/6v/p/+j/4//p/+P/6P/l/+r/6P/r/+r/6//p/+r/5f/r/+b/6f/o/+P/6P/l/+f/5f/n/+P/5P/l/+T/6f/i/+f/5f/m/+H/5v/g/+P/3//i/+H/3v/g/9r/3//b/97/4P/g/+D/2//f/9j/3v/j/+H/5P/k/+z/7v/o//D/5//w/+j/6f/n/+f/5f/j/+P/3//h/+L/2//h/9v/3f/Y/9f/1//Y/9n/2//Y/9z/3P/Y/9r/1P/f/9P/3f/Z/9v/2//e/9z/2//j/9z/4P/f/+P/4f/g/97/4f/d/+D/3P/j/+D/3//j/9z/3//Y/93/2v/W/9j/0P/T/87/zv/K/87/yf/L/8b/wf/K/8P/yf/J/8r/yf/H/8n/yP/J/8n/0P/M/9P/zf/S/9D/1//O/9f/y//S/9P/0P/O/8//zv/P/87/zv/M/8z/zf/H/8//yf/S/83/0f/P/9D/0f/P/8j/zf/K/8T/y//D/8v/xf/F/8L/wf/B/8H/vv/E/8H/yf/G/8n/wP/I/8T/yf/K/8r/z//L/87/0//M/9f/z//U/83/0f/T/9L/1v/T/93/2f/e/+D/2P/l/93/4f/X/+D/2P/a/9z/3f/c/9D/0//Z/9L/zf/O/9//0//I/9D/1//T/9P/yf/O/9P/3P/G/8b/zv/m/9X/yv/I/9b/2P/U/9X/yf/M/+n/2P+5/83/8P/d/9L/1P/k/9v/zf/Y/9z/3P/U/8n/yf/V/9T/0P/U/9n/4//i/9T/1v/c/9f/0P/W/97/1P/Z/+b/2f/U/9P/6v/v/+r/4v/p//X/3v/b/+b/5P/W/+z/5v/v/9//5//u/+D/2f/8//f/+P/J/+v/AgD5/+f/wP/H//r//v/4/+b/+/8TAOz/8v/l/yYA5//R//f/VQDq/+b/4v8hAOz/OADm/0YAXQC8AJoAGwF0A5MI0QuV9rftVAB9C6j9SvF1/RMKAAR995n7uAbmBmH+CPm0AC4F2v5Z/bf89QPyAcz9dAA2APQArf5XAF8AYv5p/57/nP77AZAAGf/j/yMBtv+l/nUBaAC9APX/GwAdATEAXv2p/qIC8/8+/Sz/JwIXA6v+BP4+Ac8CigCi/HsAwQHKABMBzP9N/pEBTQTs/Sr9lAGDAWv9FP63ApEAg//7AO7/W/5nAIYBf//F/W7+ngFPAcT9Tf7nASUCD//M/mICHAG0/kwADAGk/woAGgAqAGQAbv+vAD0Af/4L/yUAWP8b/Vz+i//I/T3+Cv91/xz/egAIAML+gQAsAQwAzf+pAdEAvAD4AGIAywA6AeYAfAHRAtoAMAHBAzYDBAK9AYkDXQP8AToCCQFPAD0AOf7P+0787fs2+Xz4T/mv+MX4W/m1+c36mftm/Nb9F/9GACYCnQMVBVoGlgdkCAgJHguIDV8NmA0VDpQK9wjYB0QCr/5W/vb5R/Nq8d7x8u6E6wHtk/BC8nLy8PUM/AH+tP0JAFgEJgYMBfwFcQliCoYJbQq1C68M0QzwDtoQaA6yC48LbAoeBRYBp/zU9z/1EfAw6zvsMOy36M3qn/A38wP06feE/cMAIAGwAfUEmgbNBsoI+whaCZMLWQy/DGYPAhJVE3QR1g/6EEkNHgbnAZ/+zfeJ8SntWuro6HnnOud86mPukfEY9nj6n/6FAoYEegW6BvoHhggICBQJwQmuCQYLWgzADXYSSBTxEaISmBIKDaUGXgJu/Kn0je7D6brlkOQW5W/lR+jE7oDz3/bT/PwBAgSSBiEITQjUCGYIEgh7CfQJtAlaCjsLmw/GFLgUQhLHFGgTnAoEBdcA0/cS8GnreOX84lbjb+NP5rrr/u8A9YH7YgAmA10GsgfMCM8IHgiXB+QIHAl+CHQKywvnDuYTMxeJEmsS3BQLDoYE8QDo+t/wXusP54rjU+IU4wblI+p373rzm/lZ/zUCEQbFB4IIignkCZAIrgm+CuIJMQufDCUOWhPkGFoTUhEsFRgQPAV5/4f6o/I26+fkxeLy4WDhcuPj6I3uFPNL+AX+5wK4BU0HBQkQCksKBgrHCV4KCgt7CyINoA7tE0AYpROAEloWRRCEBfUA5vq58WPqcOW94szgYeAx5N3o2OzT8u74av0IAu8FqAfACF4KxQp7Co8KFQuhC2MMoA7CEJcVbRdOFOwTFRSQC8gCx/489i7tRugy5PLhi+HD4f3mGuyF7371pvu3/6oDrAbvB6MJrArhCU8LPgvLCu4LdQ0KEJoTRhcXFnMVPBalD+YGugJS+THwjuvj5IDh7eHW4I3kQurg7LzzVPr1/BoCUAZfB/gIzwlgCZAKxAsYCvcK2Qw5Dn8RXBanFgkUSxTsEqAJMQIt/dnz0+x551rkIeJ64t7jf+hu7Zrx+PfA/BEBBwQCBmUIWwl2CREKVgv0C9IL1gteDVsOjxNfGHkSLhEeFawM3f+C/7P4H+776XbmoOWj4xnk2emP7WzwIfZj+kn+ywH2AtEFygisBkQI3ApBCo8KyQs8DKMNFRANFrkVyhD6ErUP8AbFAJz8HfWU7lXqYefL5X7lIudg68HuqfJn+H/7eP/qAmgEvgbbB+UHtgiRCqAKOgsHDAsNlQ4XEhgV9hEqESAPqQq9AuX8Tfis86Ht2+rc6hzoeeqG61nucfIJ9Zj4Lv0x/uwATQRBBKcFDQffB9IIXQpPCn4LOQ33DG0OZQ7cDZINJwp8CD8HwQFL/T78xfdE9FzzFvHW8KDx5fDb8lb1MPbU+PX5MPsM/YD9fP6r/54ARwFyAgUE7QUoB9EHUQlVCvoJHQoFC5YJ5AhqCC8GPwXyA/UBeAFXABr/qv6U/Wj8U/uN+gH5Dvh+9zX3vfZ59rj2EffN9yP48vgm+nX7kPzo/Xz/KwHpAmQEOga5ByQJPwpRCwUMPwz6CykLXAosCa8HOAaFBLoCJgGk/xD+Avxi+v74S/fk9Zn0j/MO87/y+/LH88f0jvZi+D76YPx9/pEAugJbBCAGxAfZCPcJ+Qq+Cx8MPQzZC2kLUwoRCaUH5gVMBGYCiADD/g39U/vS+Yv4Y/dl9rv1P/UG9T71ffVO9k73ZfjK+W37A/3F/jkAxgE8A3cErwW4BrUHighBCYwJwgmVCS0JngjEB70GmgVSBA0DrwFPAPb+r/1i/CX7C/oY+Wb4sfd991P3cPex9yT44Pi8+cz6x/sK/Vb+kP/WABcCHAM9BEQFHAbVBlQHtQcACAUI0wdlB9IGCwYWBfED4ALEAYkAQf8a/hz9J/w++5L67/l6+SH5x/jN+O34Lfmh+Vn6Ifsg/B79SP5t/40AkAGCAmEDFgTBBEUFwAUGBk4GcgaABmwGLAbABSAFawSPA38ChwFpAFL/N/4j/Un8kvvR+j765vmS+YT5l/nA+Sb6ofpU+y78Gf0k/jL/GAAUAeUBsgJ+Ax4ErgQwBZUFzAX4BfgF2gWNBSUFhgTMA+0C9wEBAfn/C/8k/kz9jvz2+3T7EvvE+oz6ffqJ+rj6Dvt7+w78xfx9/WT+PP8gAO0ArQFtAhYDrwMkBJEEzwQFBRoFCgXqBKoEQQTLAywDhALGAQkBNgB2/7v+Gf6B/QD9pPxa/CP8DvwE/B/8Ofxz/Ln8Ev2E/QD+hf4O/6v/SADiAGQB1QE4AosCxQLwAgMDGgMXAxsD/gLpAr8CkgJNAvsBjgEVAZEA/v9u/+f+b/79/Z39Vf0g/fr84/zi/PH8Ev0//YT91f0y/qf+GP+a/xMAkQAHAW4BxQEPAkcCdAKOAqoCsgK0AqQCjAJmAjYC8wGkAU8B5QB0AAEAiP8V/6D+P/7n/Z79Yv1A/S/9Nv1Q/Xn9uf37/VX+sv4U/3//6f9PAK0AAwFLAYgBuAHfAfkBAAICAvQB5QHEAaMBcwFCAQQBzgCSAFoAHQDg/5f/Tv8R/9L+nf51/lT+NP43/jX+Tf5v/pf+0v4O/1r/ov/m/yoAZgCkANEA/gAoATsBUQFcAVIBRwE8ARoBAAHXAKkAdABFABEA4P+s/4L/Wf8z/xf/+P7h/tP+yf7C/s7+2f7y/hb/Qv9x/6H/0/8OADcAbQCKALIAxgDhAO4A9gD5AO8A4gDOALoAnQB5AFUAJgD//8//rP+H/2r/Sv86/yj/Iv8b/xb/Hf8o/zD/SP9o/4X/qf/J//P/FwA7AFYAagCMAKMArwC9ALQAtgCiAJsAgAB2AFwAPgAlAAsA7P/V/7v/pv+L/4L/bv9p/2j/av90/4v/m/+y/8z/5P/8/wwAIgAvAEMATABcAGAAaABrAGsAaABhAFQASAA7ADAAGwALAPT/3f/F/7L/o/+R/4L/e/95/3b/ev9+/4j/k/+j/6//w//S/+P/9P8EABgAHQAvADsASgBJAFYAUwBTAE0ASwA7AC8AIgAQAAMA7v/j/9b/vP+v/53/k/+O/43/iv+M/4//lP+g/6r/w//O/+L/8P8GABIAIwAmADUAOQBAAEMAOQBBADcAMQApACUAGwAKAAEA+v/1/+b/3f/V/8v/xv+9/8D/vP+7/73/xv/H/8r/zv/W/+D/7v/5/wYACAAUABMAGgAbABoAIAAaAB4AFwAUAA4AAwAEAPn/9f/v/+f/3v/b/9P/1//O/9P/xv/J/8f/x//Q/9H/2//e/+H/6f/w//f//f8BAAkAEQAMABYADAARAAoADgALAA0ACgAIAAIA///2//X/6v/n/+T/2P/Y/87/z//L/9H/1P/O/9P/2P/Y/9v/2f/n/9v/6f/o/+z/7P/w//D/+P/1//b/9//2//f/9f/y//H/7P/o/+f/3f/i/9//2//a/9T/1P/W/9L/2//R/9b/1f/X/9z/2P/d/93/4v/e/+D/4v/h/+T/3P/i/97/4v/l/+H/4f/c/9z/2v/d/9T/1//Q/8v/0P/J/8n/yv/Q/83/z//S/9T/1//a/9j/3P/c/9r/3f/j/93/3//g/97/3P/Z/9f/2P/b/9r/2v/a/9f/2f/T/9P/0f/R/87/zf/O/9L/zv/U/9n/1//b/9r/4f/k/+b/6v/n/+3/7P/x//T/7v/v//L/7f/w/+v/6v/q/+H/6f/i/+X/4v/g/9r/3f/S/9r/1f/Z/9n/1v/c/9v/3//c/97/4//g/+X/5//o/+j/7P/q/+b/7P/l/+v/8v/0//D/8v/v//L/7//z//3////2//T/+//4//P/CAD1//z/AAACAAEA7//3/wEA6P/+//v/+f/S//H/6v/l/9L/CQDg/97/5P/9//D/7v8LABMA9v///zcA///z//H/BAAOADEAuP8wAOL/UwAlAGUACABmAKr/eQBkAP8AtQEcBI4GA/lD/zsCfPx8ACcAtQD1/BT+IgNS/ov+wQMKATsBq/2eAMQBYf8vAd3+qf4Q/xcA+QDy/3z+tgEDAGv88gIrAJz9dQLV/68Bxf2/APYCifu6AK4B7/6q/Tv/RAA3/tD+r/8qAFT9fQA0Af79ZwEVAPj/hv+3AO0Apv3uASEAKv7HAPf/4wDn/qwA9wDI/WgB7P+n/9X/FP++AMX+uf8BACT/ewAhAOv/JADh/2IA4gDEACQB6ADu/2gAJwDf/7oAn/9M/3b/C/8u/1D/qf8Z/xf/YQAZAVcCogFtAmQE7gKUA4MDgwIKA1YCBgPnAXUBuwLF/if+1/9H/Qn8q/th+975LvhP+SP4KPcS+bT4XvlQ/HX9Dv+WAasCbwRVBq8GFgjXCBEJjwvoDPEMuQ5HD/4MhwuGCi8HYgKq/AX4QPTW7ljrE+oj6ZTpRuuN71bzjvfl/fj/wwIaB3MFqQRuBScEywNUAhMDSgSjAyEHVQnFDFUTRRZMFwIWZxTHEMAIQwM++5XwVey/5S3h/+G64bvnCe138mv8jQB1BcsKYgvqC5MH4QMrABv5zfe39lb2tvqx/nIEIgkoDx8Yxxx+IwIkQB9XHloTnwbV/Brwj+fR3l3aB9z+213iZOs08nj87wR2Cm8PMw+wDXEKDAS1/t32FfFl72vspPAz9mf8hQZyDDcWyxs+H7YlEigmJCYarxaCC1r45PG750beqNtg2C3hWuIP51P5Zf1rA+gNbRDdEDwNbQriBT36L/XQ8cLrJOsZ7qLztfohA0EPGxUBGfwf6CE8IjMk4yJwFtoPhgmO9zLta+gk4FjaPd595eflJe0u/GwAYgTGC/QNkwlbBQMGDf7g8nb0a/FD6u3uBPVy+ar+mAkTE9wU8RneGx8aWBr2F6AciBh7DIAPsgWP99DzU+ti5+/hcuS/6qznBfIv+6f7lQMFBiIHQAXb/7oA+viu8i/zPfJQ8Hryxfjr/p8D8glwEQIUfxaHF8wTRRSTFIgUehw6EdEL/BGD/0v1vfRP6hTjv+LA6K3qReil9pcAdvyBAqwIyAVb/9z8wvyp9ObvcfL+8kHyFvcxAO0EfQlTEEkWjRaGFIMUbBCaDYkNiBXXFpYMABPJD1n/yfno9DLsteLq42vqQuZM61r5K/rC/WkEgAZaA2P/vv/R+cjyAPQq9LXx2PUj/IkAzAQaC2IOYBAuE2QSUg8DDYELjwv7EA4aHxXNDcgUDAqk9gH0HPD25UPgz+Va7ADpgvM9AOP+qgJ/CBEHMwFq/M780veI8BD0S/Xc84D5KABgAxgHzAuMDskOHhDyD5kMVwg8C60NYRR8G9YQShG4ER3/CPYx8Azq0eSp4PDq4OvF7Tn9uwGNAW8IeAgcA+j+P/tH+HnxH/Gf8y7y2fbY/KD/yQVUBxkMjg1WDf0Rfgw2C20KbAqmEGsaQxomD9oU1A6W99j0//H15XviQunr7dDrXPVzAeEBvwDwBy4HkPvL+6v7c/JI8NryV/IR81X5X/8rAfkF4wtUCzkLlA7iDW0InwgQCdIJTA68GVIe4w4fFqoS3vjc92T1/uc64pbqf+936fHzHQEl/g4BrQc3BTD8kfzO/OzxD/Fo823wOfK/+Sn9KP8TBcoKtArZCtkPWQ0GC6gLIQnnCJIMVROoGzwTmRCsFMMBOPh392DsV+Rj6o/sien87y/7/Pu7/FQGkwOJ/un/3fws9nT07vRW80HzRfmP/Cv+HANTBysJawkuDTUOKwv9C6oKrwa/CxAPmhhYF9MNmBfZC9b5Yfxk9Ivnzuj97SLq+ujv9+z66PXPAl0FT/2r/7L/o/l39Sr2sPWc87T2dPqJ/AcBNQT2BrIJBQujDK4N7wziC1YKGgtqDYQPYhrCECENRRaLAp/6Vf338LjpgOvA7tjpoOnt+Pf1EvU7AigBIfzn/3kBVPrm9qT6+PbC86b4Svp4+wD/yALjBR8I0An0DT4OMQx0DDwNLAlKDF8ToxbHDuQSUhZh/5gBFACv7ojtMfAm6x/nne1C9LrwBvfv/zb9Hv5XAtUB6fql+6z8PfZh9Tf6Qvji92D+PgGIAdYFNgw4C3sMhg+sDpALGQvjDiYRihfPEc8RwxR9A6IBpP+A8YvvIe/46/Dne+s98sDvovQp/VP91v2fAZsCuv2Z/TL+YfgF+Pj4/fey9zD8iv35/kQEAQiqCbEMuBAsD/QNyQ3LDvEMxBKkFNsM4hCKDewBSgEu/BHyoPBu8JfqQOlG7UzvQu8/9sH61Poh/w0BXQGv/r0AdP5x+vf7uPl9+JL6Tfyp/dv/kgSQB+kIgw31DnsN3g4HDvMMLw/oEzsRgwwwEH4JFQIlAXr7ZvKL8WHwCumj6e7ti+3q7oz2xPjd+AwA0AHz/oICFgIw/lL+jv2x+jr6J/19/P/8twFJAtAFGwl9CwYN6Q3PDtAMSw9tEFwSTRGODvwOkgjMA1YCbvk29ALzbe41647pWu2W7NXtAfYx9tL4pP97/5sADwNNAbwAR/9Q/nb8h/uZ/Er8WP1K/74BOAMaB78JmQsODeMOnw5lDtQQkxDOE8gO6AwWDw4F1QE2Anz15vHG9KDrLehr7A7tg+l68K32gfNO+p4By/0rAdkFDQAZAMAC5/08/Cr+ifyd+zb+WwASABQFUQgHCRoNDA6kDhYPLw9FEaARxhFlDyQOAgsTBeUDH/xN9jv19e4o7BDr8OmN687r+PAg82b1EvwY/WL/7QJYAvwB+QI6AFL/x/7k/Bb89fw+/aP9cgCVA9UF6Qf6DEANUQ0REPcQChBCEscViQ0rDnYOfgIzA47/8/RN9bry5esn7P7s1OoI7CfymPE69BP8uPqu/ZACKAGTAZcCzQExAH//tv+e/eL9jf72/r//iQICBe4GOwquDIwNag7VEJcQWBJdFH8RxA7XDhAIOgSoAXL5mvb/85HuC+zP6xHqB+t47R/vbfFa9uH4t/ox/08AogCXAlMC3AC9AckAa//n/zj/+f/XAP8BpAReBqAIgQv7DGkNJBAgEQMRaRMyEp4PKw8XCxMG7gPu/fn3bvfY8HjssO3M6UzpiOyq7Ijuj/Oc9pL4YvyQ/7r/0QGqAmkBTwIGAm4AeQCsAJz/bABPAk0CmwSGB3IIWwuhDNkNhA+uEIoRVBMtEqYPxA8wCmYGgANB/Tf5kPW98cTt8euo6z7pOOt87XPte/LV9TD3k/um/vz+tAHsAh8CPgMWA2sBzAGbAV4AMwHwAZsCVAThBqgHnApWDLIMsA9fEMcQrBOuEuwPxhDqDJUHSQVxAef5FfcU9XDtGuyf7LfnIOmK7Ivq5u6Q8zT0avgC/a/96f/NAu8BtAL2A0sCrAICA+cBbgLwAqQDwATTBr4HyQnFC0YMWA6rD0wQnhE0ElEQpg/2DcQI/AXMAj78Hfni9XXwYe0B7Rfq8+hM7ATrpu2W8sXy1PZM+zH88P6jAdgBHQLxAxEDMAJgA2wCvQErA0cDrwPiBSEHYQgPC+ML4gwbD9UPWRDEEPgQgA+RDV0LmAgzBIIBi/xf+CP2efFt72nt9Ovt69XrF+2h76nw/vML95H40PsD/g3/kgCXAfQBPAJ0AvQCXgJpA8gDHgTvBXcG1Ad6CaUKUws3DOcNgw0XDjsPfQ0eDigMcQpACMsEpgJe/iP7Jfjb9HDx2e9r7j7tM+3d7bvu3fAB8zf14Pdh+r78f/6AAOoAdQH0AvoBIQL8AkUt2Zi5iYE/\"\n        },\n        \"direction\": \"Request\"\n      }\n    }\n  },\n  {\n    \"connection_id\": 0,\n    \"action\": {\n      \"Data\": {\n        \"data\": {\n          \"Base64\": \"AAAguwAAAEPqTPNwEDpjaHVuay1zaWduYXR1cmUGACBffeGVQs6bpDB7SC9B9hvR4CaY9helyMzkXV1cfBCP3AU6ZGF0ZQgAAAF7iTpG2AAAIGgAAABYrnw/FQ06bWVzc2FnZS10eXBlBwAFZXZlbnQLOmV2ZW50LXR5cGUHAApBdWRpb0V2ZW50DTpjb250ZW50LXR5cGUHABhhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW2GAskCiQNdBJAEUQZ4B54HDgkECjIKGQuQC7QLLQzMC0gLBAvPCMkIXQb+AkUCz/40/FH57vak9TjzpvHI8fHw5vCZ8Sjz/vNr9bn3iPl5+nz8ev58/iwAZAE8ASICWwIDA4QD/gJVBHEEWAVzBfYFCQcrB0wHQQgxCGMI6QinCIMIcgdlB8cFUgTXAygCzQAEADL+Y/32+8L7YvoS+s35Qvgy+aP4NfhU+OH4o/hE+av5k/r8+qH7xvyj/NH9YP4Q/5X/+/+/AFUBYgESAncC7gIdA18D5APrAzoEUwRqBCUEewT9A/8DnQNWAzkDkwJxAvsBfQEQAbkABwDu/0P/7/6i/h3+L/7R/af9s/2N/YP9wP2U/eX96f00/nb+gP7v/hf/T/+S/+H/AQBFAJcAuAD8ACMBYwGXAZsBwwHhAecByQHNAdIBigGEAWcBJgEbAdcAjwBVAAAAyP+F/y3/Ev/P/rD+lv6N/pX+hP6w/qL+sv7t/t/+9P4y/zP/Xf9//6b/u//t/xcAHgBVAHEAgQCiALcAsgDbAMcAwgDDALQAkQCLAHgAPwAyABQA7v/J/7z/of+Y/4//gf9//37/h/9//4z/mf+X/63/rP/A/73/0P/U/+T/5//0//X/BwAZABQALQAsACwAQQA0ADgANQArAC0ADAATAPT/5f/d/8X/q/+r/5v/lP+Q/5f/kv+e/6H/rv++/8j/2P/r/+7//f8NAAoAEgAZABoAEgAgABIADgALAAcA8f/1/+f/1v/Z/8X/wP/A/7L/tf+0/7L/qv+5/67/w//A/87/zv/h//H/9v8GAA0AFwAkADAAKQA1ACwAKAAhACEAEAALAAAA8//o/+P/yf/H/7f/rv+o/6D/m/+b/5n/mv+j/57/qv+s/7j/wf/R/9z/5P/4//n/CgAHABgAEgAeAB0AKgAjADIALAArACoAJQAgABcADQABAPn/5//c/8//vv+t/6z/mf+S/4n/if+I/5D/i/+h/57/rf+3/8P/0P/c//P/AwAIACAALAAmADsALQBBACwAPQA4ACkAKgAjABEABAAGAPP/AwDm/+L/3f/J/9P/wf+7/8X/sv+7/7H/t/+t/8L/xf/V/9T/9//z//7/FQAQABcAKwApADoAOQArAE0AKABJABEAPAAPACMADAASAPL/FgDz/wkAAgAFAPT/AwAJAPL/HQD//zAALABgAKwAkgCmAGUBl/2VAQcAjv/D/0j/EQH8/gABb/7PAB8AYwE2AHoAsP+W/yIBm/90/40ANADQ/4EAwv7mAOT/JwFz/7v/vgBTABf/+P/1//7+KQA7AMv/RP/IAA8Ae/+uAFIABf9dAM//RP/P/+UAAAC//+cAXAEq/4IBwgEF/4UAswBrAAT/NwBrAJn/oP/nABEBuf7JAFsCt/2qAB4Cm/81/7UA1wGJ/XX/3gCq/uT+uf9tAfL+K/8TAiP9jgALAVz9HQH4/vf/w/80/iICav9R/u0AAgCC/yL/+QDf/6n+LAAkAN7/9/4JAQIAbf1CAXIAJv6yAOAAr/+3/xoBagHDALMAJgHsAFr/EQHVACv/GgJUAAb/ZwH+/7//lf9cAKAAXv65AEcAlP70AM//z/8gAEoASgBu/nwBaABZ/lkBa/9t/wP/Jv+6AYj98AA+Aor9HAEQAMn+Xv+3/r0AVv66/+kBh/4DALMBmP+z/tQBdwDW/YABgADA/1sAvP9dAkz+Kf8mAvz9+f8dAMb+YABk/4D/CgHO/nL/ygCU/jwAawF4/igAXgFP/lr/SwDZAFz/Ov89Atn+yv9WAhf/vwF1AFn/qwEa/3j+HwGm/6T+QwAgAFsAwP0/AtgAQ/1fAqAAZP5dAVf/wf+FAFb+0QCi/0f/0gC5/9cAFgFA/y8BdQAq/18ANwEA/30AqwCy/93+GQGNANP8uwKK/8H+bgGe/9P/KP/6/5sBuv27ALsATf1eAof+hv9SAjP+hwFdAIn/ggGf/h0BTf/w/pEAQgDZACcA8f6TAR8AE/4FA2H/cP+2Ae0AO/94/y8B2f+1/VQAuf9J/qsB6v62/5wBlf6r/ygBs/9fAAj/GQEUAP3+vwDY/7r/ZgD2/pcAmgAmADQAWP+EAaL+GgApAIT/hQD2/wn/UgF8/3z+MwG6/5D/fP+hALT/vP9/AFj/fwBrAJn/1v9XAMsAS//RAaj/kgBxAc3/3ACT/1EAfP+FAHr/V/9cAM3/uf7WABMAA/6kAaX9hP4GAQH+j/+r/qYAS/8z/loBDf7F/6cAoP4IAH0AN/8/ALgAzv8cAJEAmgEcAPEAZwIwAZoBdwIjAW0CJQL1AMQCdwHJAY0CPwA4AbsA+P6H/z3+cv5l/a/7ZPxf+1362/tz+lT6S/tH+z/77vun/LX8Df7t/l3/wADQAQQDHwUPBN4GZQf0BnsJ1gdXCkwJqwiSCbYIzQdqBbwFDwIGAeL+3fz7++74J/mb9qf1ovWU8zf0DvPC89T0IfRm9mH4xfh9+iH9uv0h/6UB4AOkAsAHWwgnBxEMRAtjC/sN3w1/DfIOxQ1MD+UNAQ3sC8gHCQiKBLcATv2m+sv44PL+82Lx8O1I8M/t8u1W7/jvmvFa80f2J/bY+Er89fo2/+X/uP/6AjADHgT2BXwIvweICWYMFQvjDIUOFg4xD9YPKA+SD0gNXAxHDIUICAcnBLgBH/7W+Un5iPMq87Hxb+0n8Nbtme0674LvxfAr8kH0VfYt94j6OfuX/Vr/l/8cAm0CTgSXBGMGRAdqCN0IbgpsC9oL6AwDDuQOdQ6dD6UPDA6LDlsMpAnSCQQFqQLJ/9X7XvhT9efyJ/B87iju9+wo7TnuPO6a8JXx3vOh9c/3w/kH+//90P5/AAoCwAL2A/4ETAZiBtUH1wgdCY0KQQuYC9oMuQ3EDRUP3Q4iD8gO7A0JDc8KNQlhBgsD7f/D/Mr4e/V/8gjw0e087fPrG+u07Nrse+5S8KfyPvSo95f5lfuK/or/+AEHA8AEHQXIBTQHAgfsB2gIqwjLCegJWwpbC5MLKQyeDfsMdw77DXEOUQ2LC8ULuQZ4BskBAP/G+1L3yPVa8d/vWe717JTs7OwE7aXu/u8H8s7zFPai+CP6t/x6/vf/kAG7AuQDWgQfBWcF5AWKBtQGaAfmB7UI8wjwCQEKLQuPCy0MAg1cDRcOSQ2VDM0LbAlRBxUFfwG4/q77OPg/9RLz8fAH73nuB+6h7b3unu818bjyDfWZ9ib52Pr3/LX+8P8hAuMB1wMpBFsERwVWBcQFrQaiBi0H9wfnB5oItgnhCV4KyAv7C/0MUQ1wDZUM3At9CoYIJgYmA/IAOf2M+rj3qPTV8vvwmu9J71XuGu+f76LwZvK98132f/dS+kz8p/3f/xIBqgENA28DvQNxBGQEYAT/BKgFNgVpBvQGxgYUCH0IJQnvCbQKtgvCCxgN6gwWDIELKgoUCMsFOANYAGj9h/po+Lb1cPNP8izx5e+E8CrwD/Hs8RPzz/RL9iD4rPnj++78U/6h/7wAAgEOArgCfgJvA8UDzANbBD8FXQUxBuQGYwc8CA8JDQpgCgALAQygDLkMwgwMDDwLlQkXCKEFZwK2AEn9p/p3+GH1y/NB8r3w9e/v70XwJfAN8sTyDfSw9vr3Pvrh+9f9wf5IAKUBewHGAs8C5wJfA4kDUAPXAxUEmQQkBZkFyQZYB2gI7AiLCnEK1Au8DKUMcQ05DE0LNwttCPkFGgViABv/BvzP+Lf2XfQC88zwEfDH717vx+9n8VHxlvO99Qb3OflV+xr9/v2jAJgAigEJAzsCMwNvA/4CiwPfA40DKQTxBCsFXAZUB5gHHwmQCWYKpQsTDNUMZg1dDUMM8wumCvsHjQbNAwUARP58+k/3d/Xs8qbwaO8p77Ttge5c78rvHfLZ88r1Q/ga+mj8MP6f/ycB+QGrAgUDyANVA28DoQNnA2ED5gNhBJoE7wXgBo8HxAgOCpEK1wvQDCoNxg0/DtIM9gyZC1MI+wdfBH0Atv4p+1L3sfXz8oDw5+9o7sLtsO627s3v8/FJ85H1uvf9+cX74/1Q/6IA7QEWAhMDHwMAAyUD3wLjAkwDEgPSA8gEKwUEB7IHzwhtCrILfQy6DR0PTQ9ZD4sOWQ4XDNcJgAjMBOkA//7g+nb2VfXX8fbucO8v7UHsyu517v3uoPLJ87v1PPni+on90P7cAAkCLQK4AysDHwOeA6gCWAKiAg8CQAKpAn0DQAQsBdYGDwgECQoL/wtbDdwOjQ8aEJQP2A7QDa8L4QiuBgUDcf6w+2P4gfMK8YnvDe2L683rF+y77CHuPfAJ8/j00/fu+gn93P4VAbwCtwJmA/QDvgLPAnYCdQFDAUwBxQBdAakCQQPXBNkGWQjGCT0M9w1gD/AQWxLqEw0SCxHGEWoNYgnWB3ACQ/z8+YL1tu/S7QPsoOh26FTpOOkw6/ntvPCj81L3efoX/jAAawKuBAoFNgW3BQYFXwMbA+wB4ADc/5j/4f/y/wgBqAKDBJEGfwgvC1ANyw6LEZQTOBW3FRwUThOzEsQNPAmZBo8Am/rO9qfxIu2m6ifov+ZS5+rnAulP7Fbv4/GL9lH6mPwqAAUDHgRBBf0FlgUcBTMEawI8AQ8A0v50/V39Ev5a/vP/jQIeBWIHCAoWDSEPOhFWFMUWqxfqFVoVHRUQEFoKbAefAqH6C/aF8sXs/eir5zvm6+Xs5uXoQ+uD7qzyPPYQ+rj9JgExAykF2wbEBmMG8gVpBHgCyADU/lf9FPw0+137RfyH/fj/FAM7BvsIqAtND/0RNBTqFrkZGRnjFa8WAxSrDDYIqQRO/WT2VfIR7YzoJua/5G7kguVc5wvr1e7W8tr3a/xYANEDnAZSCOII9ggjCDoGAQSGASz/ofw8+tL4iPgV+PH4R/v7/dQArwStCLgL2Q6LEokVkhccGgsbVBhVFsQVCxCMCMME6P+398Dx/u1c6SrmE+V55ELl4ufK6gDvgPPL97j8JAHQBBkH3QgPCpsJ7gdkBgEEzwAu/or7Wvm/9xH3SPdJ+Bj6Mv3+ADIEJwh2DGQPtRFbFZYYPRqZGnwY+BZzFcIPRgn+BEr/P/ig8oHtiulc59bkHOT+5ZHnNeov723zYPeZ/P4AkwTgBq4ILgq4CfsH6walBD0B8P7p/Bj62fht+Pz3D/nS+nf9WQCbA2AH+QqcDTYQzxL7FZIXwRgAGGQVlBQpEOAJDAbwAOf5avWH8I3rvOnD5yzlYOY86EDqqO0z8Sn1t/n6/WQA+AODBiIHqwfkBzoGiQTAAi4AdP6f/En62Pnr+bL5NPu3/T4AywKZBg0KlAwRDy8RGBMuFRkWPha5FIgSwRAfDLoGDgPG/c73TvPE77XsZequ6ETo++nu6iftw/A+9N33EPvd/tkB6ANMBV4G2AYNBrkENAOxAX3/Ev4k/VP76fqC+wz8Sf1C/2oB/gOtBgcJQwtMDRAPMxAJEqoTYhNPE6EQVw61DQ0ITwKOAEP8Jfb28u3vGu6A7Mzpq+qi7Y/tx+7I89H2Dflk/Df/EAJQBCsEjwThBbAEYgK5Ab0Anf5y/V/87Pt4/Ob8vv3l/5sBJwP0BRgI1Qm5C2sNSQ6hD7MQ/xHxEtYQgQ1vDOQKGAU5Adv/c/v89UH0HvL674ruw+xH76PvaO+P8dLzS/YJ+Ir6kfzg/s4AIAFmAmgD4wIlAvwBygHKALb/dv8fAPn/j/++AJEBVQJnA50EAAYsB3sICQn6CQILTQs0C2kLJwuSCvAJrAi6Bs8E3ANiAVb+yfz9+7j5c/e39i/21PXw9P70zfXl9Rf2dPei+Mb48/n7+tD7TPys/M/9Nv5h/vb+sf/w/3UAaAFDAbMBigLjAksDowMoBK8EwgQOBa8FBAYeBmgG7AYlBwsH9gYHB9sGQAaDBcsEDwTWAtIB4ACY/2H+e/2h/KD7/PqW+vf5jvml+U35N/me+XT50fl2+pr63fpX+9r7TvzF/Ez9+f18/tf+iv84AJYAYwESAlUC/AJaA3oD9wNEBFAEZQSbBLIEjgSdBJ8EZwRfBCYE5gOKA0oD6gJ7AugBRAG6AAUAO/+e/gP+c/0B/Zf8J/zh+5n7avtu+2b7b/ud+6z77ftU/Jf80fw4/bf9D/6D/gD/aP/0/0IAtQAVAXkBwAEQAk4CbQKQAqkC1QLGAskC5ALZAsQCtAKbAmoCPwIHAsEBfQE2AeEAhAAsANz/mP9S/wD/zP6i/mf+UP4z/hn+BP75/Qf+B/4U/if+Rv5+/p3+2v4a/2b/rP/w/zIAcwCzAN0AAgEqATwBSAFCAUQBKgEOAe8AxgCoAHcARAApAPj/0P+0/57/kf+A/4P/fv9//4z/if+N/43/nf+d/63/uP/A/8f/y//H/87/zP/N/8P/y/+y/7P/qf+m/53/nv+T/5P/m/+b/6f/sP/E/97/6/8IABQAJwAxAD4ASQBMAFEAUABPAFIAWQBPAEkASQBDADEANgAiACEAFAAMAAEA+P/y/+D/0f/O/8b/uv+5/7j/wP+0/73/vf+//8H/x//B/8n/y//W/9r/4f/o//b/9v/7/wIABgAGAAkACgAIAAgACAAGAAUA///+//r/+P/1//P/9v/y//X/7f/w/+7/7f/p/+b/5P/i/+L/1v/V/8//yv/H/7z/v/+7/7L/tv+w/7v/uv++/8r/0v/Y/+T/7//u//v//v8HAAoACgAQABMACgAQAAwADgAJAAgABwABAAEA9//z//X/8//2//b/8P/3//D/+//z//f/8//u/+z/5//p/+r/5v/p/+r/6f/r/+//6f/u/+n/7P/u/+7/8v/w//X/8f/3//T//f8AAPz/BwAMABIAEgAZABwAHgAeAB8AGgAWABQAEAANAAYACgAAAAIA/P////D/8P/x/+j/3v/Z/9P/0P/U/9b/3P/U/9z/3P/l/+b/6v/0//L/AwD7//X/BQD///b/CgALAPn//P8EAPv//////wIA+//x//f/4v/x//T/4v/t//D/6P/v/+v/7v/6//H/CQDZ/wAA8//z/w8AJwACABEAMwAMACUAMQAgADkAQgAgAD0ASgBfAIIAJAHkAGgAZv6x/lwAQwFz/27+egBy/jgBr/+d/RACzv8K/3EAfgBH/wYAKwBQ/+j/7QB9/6T+qQEY/fn/rAEu/uz+ngEoALv9YQFRAIv+XgBZAVr+1P8AAf//eP+gAPv+YP/DAQIBHP78/pkCV/4T/1cBNP9w/9QAnv8GAEUAQP/6AFQA7v0AAecBRP4A//8BGP/j/tQC1/8F/scAVgAnAV388gCYA1X9WwEl/GsDIgIc/XwAFQGm/qb+BQMG/VMAhwH3/8L8VQJ8AYz9c/6sA6H+0vz/A6T+3AFD/csBewAs/uICM/9w/sIBk/+k/UYDFv9x/IkErf0w/XEEHP88/ub/5gK0/yb9HQKgAon8HP8BAggA9P6J/r/94gWS/Ib9BAN8/bkCufzSAor+pf6VAVv+hQTv/ID+fQaY+cgAVAJV/3kDLvsSAA7+FgSU/8H9GALm/rYBPf0O/1cDOP81+0QHKf8m/MAA7AKc/4r7WgQa/vUB2AAq/sj7cwVjAlz3UQMdADT/ywNR+73/jAPE/479W//NAZkBzwBL/SIBSf+OAWv+4gBH/q4Czv+h+24Def9hA136lQAdBAT9R/99/74COQAJ/QQBEACS//UB7f2Q/54AgAGV/9j6VgbxAFj5RQL2AwL/Qv3QAzH8EwSEAUb6IQFRApoEiPlp/0YD0wCy/yX+sP1PAVIE2fzD+5UBoAPZ/h3+Pv2yADYHTPxs+soFeQBGAIX9igFn/+n+3gGA/mkAz/vEA8YBJv7E+pAEAQdJ+e/9DwTI/DsAkgVG95oAxwX+APL53gCAA5L8bQJD/a/96gNBA+f8ZQHXAD8B+P4pAFr/f/w5AmIAeQHh/0D8GQNqAv78dP+9AWIAc/waBY76e/7DCLf5W/rFBu4BpvsNAl8BKv1PA6QCFfuxAd0BXAEW/Gz/IwSsADH9Pf3xBD0AM/qOA9oAE/2DA0H9kP0mBTYAaP0s/6kCTAPH/EMBmv09AiMEbP4V/EsBMQJ4AfcBbffCBmgD5vpTAP3/3v28AqYCVPzw//0A3AFi++b+ngKE/1kCGgDc/lwDfv8VAYL+hP7WBJL65f8fAj7/RQIB/7z/IP/YA2ABBPphAqUDgf8z/zz/AP93AE8E6vxW/WYDIAA5ALb/Bf4qAM8DaAIz/Q78IAQxA0/9Nf0F/mIDmQKI/lv6sgB9BdH+av43/kYBwARrACf8jvwyAJwETQEi/aj9cQJFBbP+0foL/5sF7QL/+xH+ZQODAhMAPfsR/o4CvAJ0/dL57gH7AzkBQf7D/rgAjQKGABP9Mf3iARAB5/55/y3/lgE/AmwB2/wGAawCkv2//zcAaP6xANkA1/4W/zkAWQIOAm4BDgA0/YIAXwGq+7X+0ADGAAQCXv5xAPMCRwGi/q//SgAYAMv/GP7aATT/cf49AMH+OP8XAH0Atv9R/1sBVgEEAN0AGf5q/ooAy/93/nMABgK3/7b/SP+F/+IBSQCr/ab/VwINA8T/vf8sAXAB0ALa/s/+4gHWAvAABv6e/vYAWQGd/2j/S//iAAYC7/8x/an+m/+s/sb+vv7T/Vv9HP9D/8L+1P9FAF3+Kf6X/2sAOv/D//MAFAGbAnYBuf9fAN8DwQS+AiECawJhAw8DrgKyAUgB/QJiA74BlQBDAW//Pf4I/1r90/oe+3n8gvuT+1z76fmj+oL8u/tc+av69vzB/Cf9Zv0f/V7/MwITApkBHAOxBIwEigZ9CLwHNwhyCEAIfgmpCmYJagnaCVAJMwj7A9P/C/0f+5n5nveE9yv4LPiD9//1dvSI8z/1O/a39IX0ivaj+Hv6Uvys+5j73/1C/pf+GwEJA3oEMgZTB90GyQYBCAcJdwmBCkYLZQtZDa8PDRCbENMSWhCKB2n/tfqC92X2+vPF8q33Gvsc+p/27/Vl9TT0MPPN8OTxAPUH9zX3NPnf+9P89fsD/CH93/0G/30A7AFmA4oE4gV8B6UIuwpADAoMHAsfDNcMTgw3DI0QIBV7Gzwahwdn/iz9//eG9OTyrPGp9lj9APob9Gz0Cfd99aTyvPCV8Xb14/cn+H33Rvkk/LH8qPx7/eX9bv4V/1H91/3ZABkCcQIDBE4GDAg/CQsKHgt7C+4LDQtnCjkNjA9ME4wZshqeDeMAKv57+sL4wPZb8wb1if3s/Yr34vXC9bj2EvOP72PvyPM++Uj62Pib+KT7vPwH/Cj7TPvk/J7+/P06/VT/1gHkAtQDDwQ9BK8FnAS+A5cHZAr1CnoLuQugCe8MgRJcFskbexsrDXj7jPiM96H4nPmA9gP5wwB3AHz57fRJ8UvyT/FO8HbxYfTr+VL8dPnq+In66frT/Dr8ofuy/Of9pP0v/Zb/UQH3AdwBVgLbA0YFNwSYAgwFZgdmCJoL0gxyC4ALMgu0DC4R8BhCH1cVlAGJ+RD5//mD+9z39faI/hMDZf109BfvTO8j8fLwyvCC8zz4cPtH+nD5P/q6+j77GfsO+337fP3E/tX+6v4xADYBMgH1AGYBzALXA0oE6QRMB74IDQlCCUMKsgtrDfkLBAvNDmcUnxy/H6EN5PX18r74WP9w/cr0QPlzAqYANPdC7LrqzPIG9HPyTPJ89Vr7OPz392H2VPjO+tf81fyj/VD+N/80ANb+oP4hAGIAZgCsAG8COAWeBWQDEAMUBekHygmvCAAJkAvdDNALoAuZDfASIRkXHwsVMvql73n1zv1uAUj64ffJ/SEBlvw07tHoavFw9gX2SPMK8935//1k+aT0EfYU+tv8nvsx+qv9eQHwAOj9Cfwb/nUBJQESAA0CnAQfBT4EjAJVBJEH2Al8C00JAwosDBYKawk2C2cOThR0GqcYcwuZ/Qj3zvnA/2D7ifnY+4L9pf/19a7tcO8D8/X1BPNG8GT1YfkG+xn5a/VD+H37sfyM+xr7x/39/6AB1P8O/VL+6ABKAvUADQCcAuQDAwRaBCcE0wUWCAwJqQj4CWcMFQuzCHkJWgwSELwUxBhsFSoJH/0T+Sn7p/xV+U/2XfkH/WX8ufVD72Xw2PMJ9FzxIPHB9Of4VfoF+eH3PPle/NL82vsH/Lv9EgBMANr+H/+GAOUBCwJoAHsBhgJAAwYExAQaBsMGuwcDCWgJXApaCogJIAkiCRkM/w6REmIUCxQ4DuMBC/uf/Mf88/ra9xT2Gvth/Cv4hvIE7wrzJ/aK8YnvQPIB9+v6EPmo+Pz5JPta/Lb6Gfpw/Gf+2/4l/9r+YACWAZUA4gBDAQ4DZgRlAyYDVQSDBVAGNwa/B58KEgttCs4IJwh5CQQNmg8OECsSMxQjDvUBqfww/sf/XPvh9j32r/fd+gX4afJ18HXynPON8YrwcvJW9p74i/ie+Lv52/so/G77w/yv/T7+Zf5c/k4AmgCkAGQB1gA6AowDDwOPA1wDbwQtBkAG3wYwCJgIhwmmCecJJAoKCtQLAQ1UD88RFRNcDQQEAv95/wQAKvzo9xr3YPjN+Qr4TPMC8s3y+/PI8hvxU/Ia9q/4IfmK+EP5Uvv++/37hvxF/v7+0/5O/nP+Q/8dAO4AEAEZAekBGgPEA5ADfQMXBDwFGwbGBrAHnginCdUJwAmiCcoJngqKC+UMdw/kD9QLcAapAv8AxP9x/Aj5tvcT+Or4zfYC9Bzz2/Mt9Yr0r/Oo9OH1c/ea+Dv5NfoM+4H7vPwq/v7+//4D/0//z/81ACIAcwDuAJABgwICAx8DPQMFA80DwgRIBQkGhQZSB/0HPAjxCDQJnAmXCQIKZws/DEIM7wqDCcsGkQXiBAoB//yX+tv5SfkP9670kvPh8x/1x/SL83Dz0/Sm9l/3effr97r4bPrD+6X8DP3G/a3+Mv/d/9Csuq47kCmn\"\n        },\n        \"direction\": \"Request\"\n      }\n    }\n  },\n  {\n    \"connection_id\": 0,\n    \"action\": {\n      \"Response\": {\n        \"response\": {\n          \"Ok\": {\n            \"status\": 200,\n            \"version\": \"HTTP/2.0\",\n            \"headers\": {\n              \"x-amzn-requestid\": [\n                \"43736651-0286-4f25-9699-95d85620803c\"\n              ],\n              \"x-amzn-transcribe-enable-channel-identification\": [\n                \"false\"\n              ],\n              \"x-amzn-transcribe-enable-partial-results-stabilization\": [\n                \"false\"\n              ],\n              \"x-amzn-transcribe-media-encoding\": [\n                \"pcm\"\n              ],\n              \"x-amzn-transcribe-session-id\": [\n                \"207abc31-4dc9-4e00-a586-d77f2e5c4c40\"\n              ],\n              \"content-type\": [\n                \"application/vnd.amazon.eventstream\"\n              ],\n              \"x-amzn-transcribe-show-speaker-label\": [\n                \"false\"\n              ],\n              \"date\": [\n                \"Fri, 27 Aug 2021 20:08:23 GMT\"\n              ],\n              \"x-amzn-transcribe-sample-rate\": [\n                \"8000\"\n              ],\n              \"x-amzn-request-id\": [\n                \"43736651-0286-4f25-9699-95d85620803c\"\n              ],\n              \"x-amzn-transcribe-language-code\": [\n                \"en-GB\"\n              ]\n            }\n          }\n        }\n      }\n    }\n  },\n  {\n    \"connection_id\": 0,\n    \"action\": {\n      \"Data\": {\n        \"data\": {\n          \"Base64\": \"AAAguwAAAEPqTPNwEDpjaHVuay1zaWduYXR1cmUGACAn8c/lAQsH6qmKnW3lIWs+t70wkoNpZevDEeljvsXg+gU6ZGF0ZQgAAAF7iTpG2AAAIGgAAABYrnw/FQ06bWVzc2FnZS10eXBlBwAFZXZlbnQLOmV2ZW50LXR5cGUHAApBdWRpb0V2ZW50DTpjb250ZW50LXR5cGUHABhhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW1yAM0AHwFSAVIBuAEWApACqALWAlgDGgTpBMAFMwZ7BjoH4gc3CIgI9ggnCaIJCAqOCtoKnwpDCkgJUQijBqsE0AIrALP9ZvtM+aD3yfWZ9MPzQ/NL8+ry9PLA86f0q/WM9kv3RviL+bP62Pvp/Pj9uf4N/3D///93ADkBogEFAoACtQIbA1kDowM/BOYEZgW4Bc8FLAaWBr8G5QY0B3sH2AcpCGIItQgGCSwJTQl3Cf4IqAdhBkYFjAN0Aeb+avx4+q/4rvYC9cnzEfOl8lvynvL38rPzzvTs9fb28PcD+U/6mvup/IL9Nv4k//3/mAAAAUIBtgEoApoC+QJEA60DDQSCBBkFiwX0BW0GyQYRB00HiQcVCGIICAjTBxkIjAifCGMILwjtB7EHEAeYBQsEfgK0AOT+zvy6+gH5UvcG9r70mvMk8+HyC/Or80T0I/Uv9kT3cPhl+Wz6lft7/G39Vf4W/9//cgD8AHcB2gFbAsQCCwN3A9gDUgS/BBAFSQWtBR0GtwYUB1UHkAfJB/IHCgjRB5IHiQeUB4QHPgf7BnYG4gUvBfADhALoAFD/sv3s+xP6f/gw9xj2M/WW9Ej0U/Sp9CL13fW39n/3cvhp+WP6avtE/A39w/1//j3/v/8xAMQAWgHuAVYCswIcA50DEARWBLUEEAV0BewFMQZcBpYGwQYBBxwHCAf5Bt0GrgbGBrAGmgaBBg8GjQXUBNEDvgJnAfb/d/7u/Ij7GPrG+Nb37fZj9u71qPXC9Qf2e/YS96/3ZPgd+ff51PqO+1v8Of3q/ZH+MP+6/yoAyQBsAfQBbQLlAmMDvwMJBEQEiAQEBV8FqAXOBfgFLQZHBlMGSAYvBiwGEwbPBY4FXgUoBecEsgRZBOEDJgNkAmoBRAAF/8/9lPxj+176dfmt+O73cfcv9yz3LPds9/D3fvgN+Z75OfrX+nf7JfzE/Gn9G/6q/jH/u/9FALwAWQHwAY8C9wJgA90DPQSOBMUE/QQ0BVkFfgWBBZAFrQWTBXsFRgUdBfkEtQRyBD4E9AOYAzEDwQJHArEBFwGCANH/Cf80/mj9mvzf+z37uPpx+jf6Dfrd+dL5+Pkq+mD6tPoI+4n75vs9/LL8H/2x/TH+sP4y/8j/VADNADcBvwEbAnECugL7AjwDYQNwA5gDqgOuA7ADtAOlA5MDjANtAzUDEAPuAtMClQJHAgsCwgF4AS8B6wCdAHQANwAdAMj/tP9B/+P+uv6F/i/+rv2x/V/9L/32/Or83PwW/S39Af06/WL9mv2p/dn9Kf5r/sb+Gf8a/2v/ZP/G/0AAWgBsAMgALgF9AYYBzgEIAj8CWwJyAtUCkAKxAtgCogJ+AmACKwIoAgQC5gFuASsBGAG5AI8ASgBFAFwAqP+7/8//W/9b/2b/5/4Q/yH/Gf8c/5D+Dv+q/jX/GP/m/gL/EP8U/6r+HP/c/kX/0/4x/+T++/49/8f+Mf8W/1z/Tv+B/2X/if+U/ygA+P/C/wsA5P8gAPr////u/zMAOwASAMD//f8WAP7/+//X/yMAQwBmAB4AaQBTALIAbgBvAHMAMACbAO3/NwDu/9j/KgDk/5n/KAAEAFcAvv/c/0UAUP8aAOz/6/8TAO7/qv/x/9b/9f9X/4H/vf+Q/woAeP8KAHr/6v/J/6T/CwC7/3X/PABaAOf/AgA4AAUAxf9RAM3/2v/V/3kABQAfAAkAHwAEABsAFgAvABQAHACeAKL/hgCw/3kASQDn/1sA1/8qAA0AIgAoAOL/IwB3AE8AbwDl/0oACwAnAFQABADL/0kAXgCm/xcABwCJACEAwv+FAEMAbQAnAML/zP9mAAcAgf8gAEsA7v/J/9X/4/+4AGIAQAB7/0gArgCpAEwAmf//AGEAw/8RAMD/1f/TAIv/FgDP/4MAowCJ/2cAW/+iAHUAq/+O/zcA7f+YAD//iv/IAOL/PQA0/ygAlv9XAML/M//M/5EAKAAkACUA6v5dALr/9v/C/3n/oAD2//v/cv8vAO8AOf+E/3v/AwC4ABIAqf/4/3IAZABY/4UABABM/9j/AQAUAGn/TwD7/xEAl//AABMAyP4sAOr/zf+k/73/KgDe/zUA4P+a/wEARADa/+EAVQAs/wMArQAbADL/OABSAPv/Of8aAAAAEwA1AJz/bgAOAPP/pv+4/6gAmwBCAFP/xP/NAL3/nv9V/3wAngCs/z//sv9DAFYAqgAy/7P/xv+KACH/NQAPACMARwDC/2kAWv/YAJv/+P+8/08AtP8LAO3/iABXAK7/zf/c/4wA1//E/yn/3QBZADYAav/1/xEAdAAIAKD/IAB+/0YA4P9j/67/mf9bAPMAlv9K/0MAmwDW/6T/tP+NALr/0/9RAFD/+f/N/93/jwAp/6z/wP81AEgAr/8xAK3/RQAsAI8A9f4bAP3/BwAtAPb/DwA0/4MApP8OAIf/8f+p/yMBQQBt/0oAyP9QAKD/ev/4/x8ACgD4/z3/XAAsAPr/f//4/zsAbgAlAPn/GQCB/0gADgAhAAoAOwDU/zH/XACiAHkAOv8b/38AtQB6AIj/GP+6ABUBJwCE/5v/5QD0//T/t/9JAHr+MQB7AVoAV//t/qoAZgAIAbP/sf8z/4UAdAD4/2b/Y//TAJEAHgEOAE//CwCR/78ASwAqAOT/Xf98AMb/QwAq/20AeQD0/y7/XQA/AIj/+/9QAIwATv83AEkAEgAJAI3/8/96AAT/bwCD/48AwgDP/pz//P5aAIQBfv+i/2n/xv8fAbP/QAAQAF8AhAB5AJAAfv97/vcAwABxADT/v/6NAFMACwEWAAAArv8rAP7//gCGADIA3v84/+L/Jv8MAJIAHQC1/1z/QwAW/2oAUQH4/9v/vf7AAJYAuwDU/6//RQDX/5sAHwAPAKD/ov8fAHcA/v+g////JQCNAD0As/8OANv/iwBHACUAUADs/8P/TwAwAKT/GwBNAFAA+f/o/+3/DwBwACQAFgBGAOj/XQAKAFIAEgD9/0cAAQAVAKf/4f8fAF0A6v/N/6j/wf/o/ygAPgD0/9r/xf8SAAAAEgAHAMr/6//8/+3/EADv/+H/7f/Z/+n/DAAGAAoA6v/q/wsA9f8KABsA7f/o////GwAJAAAA8f/g//v/8P8lAPr/3P/Z/7v/JQA1ABIAyv/2//L/EQBSANr/5//V/zwA8P/1//3/1//5/9H/DgDp/9b//P/r//X/BADx////1//u/xEACwDp//3/5/8KAP3/8f8OAO3//f/z/+P/6v8TAPr/+v/c/+//8v/q/w0ABwDe/wEA3/8CAAMAFgAWANf/BQD8/zAA5v/1/+f//v8PAAwA6f/b//v/5v/1/+//7P/v//D/6//t/+r/5v/Z/+T/7v///+r/4//k/9T/8P/s//T/5//p/97/4//f/+r/6v/s/+j/3f/a/+z/5f/y/+n/1//m/+n/8v/b/+L/4v/r/+7/8//w/+H/5P/t/+r/7f/q/+b/5v/q/+X/7f/r//P/5//n//X/7v/2/+z/8f/r//D/5v/p/+L/6//q/+j/5f/k//D/7f/z/+j/7v/t//T/6//y/+7/5//r/+v/5//s/+r/7f/o/+3/6//p/+H/6v/m/+b/6v/s//H/7f/v/+z/6P/n/+n/6f/3//D/7//p/97/4//l//L/5v/w/+v/7//r/+X/4//t//b/9v/p/+H/2f/c/+X/5v/1/+7/6P/m/9j/3//q//H/8v/q/+T/3f/i/+T/7v/w/+//7P/c/9T/3P/e/+j/8f/z//L/4f/g/9//6P/2//3////w/9n/2//e/+P/6//p/+r/1//V/8//2//k/+n/6v/e/9n/3f/q//T/7f/y//H/+//+//f/8P/h/9v/8//7//7/8f/2/+v/9v/x/wcAEwAcABEA+f8DABIAMQBJAIAAuwAdAVwBKgF9AJz+Rvyv++r9kQGXA7MC9P/K/Wf9Lv90AeMBaAEWAYEAGP8X/vf+eQAyAewA0f8Y/1L/s/+bANcA/f+u/wMAy/+L/wsAoAC2ACIA9v8PAOX/+P8GAFEArwCGAJf/4/6e/5MAcgDo/4X/5P4B/1kAqgGaARkAGP+I/6n/sf9LAGUAQQDo/5r/Nf+F//n/o/9w/6QAQAEhAfIAd//K/qH/kgCiAFoAEABY///+AwCGAWQBYv86/un+wv+GADgBfgD7/qr+3/6s/0oB+AGGAKT+xf6h/7cAzgGaAev/XP5//tL/XgFPATj/tv2t/s0AOAJMAkcAov0h/e/+cgG5AqcB0v4d/ev+rgHtAZgAZ/9b/g/+2/+WARYByP/+/qv+2v42ACMBwwCJ/3f9N/5eASsCWQCp/9b/lv9L/8P/igDTAbkBg/7Q/Cn+DwHnAkADxQHL/TL8Gf56AOgCmwK3/jb8Zf00AJsCpQPNAZT93Pro+x0AyQORA+//D/3e/X4AdQMABA4BVP4M/h7/iQCfAcwAI/5G/NT8eP8lAoICiABw/nz+FwCoAfoB7QFoAB3+OP9UAUIBKQFdALn9K/zn/AIAQgJ5AS8ASP8m/9T/GgE8AQwAqf88ABkAP/8D/7T/lQARABT/Zf75/1sCcgJxAbcAff+y/tH/QAGaAWgAl/5j/cD9Mf9mAMIAr/+9/gn/BgD2AIoABwAzAMn/9f05/en+FwGbAXkAWf+r/sv+SwBMAZcAzf8J/5z+f/+dAWEB1v+d/1D/FADjAVQCPwIgAzwC7/8v/34AgQG4AfIAlP+0/3IAigAPAJj/FP8m/rH9ZP7S/g/+Ff3a/Dz9JP0b/f399/60/v/9jf1g/Xv+2f/h/y3/TP+h/wYAAQLdAxgE3wNiBMwF5AaKB7cISwltCEIHVwYFBkMHXgfnBOwBnf4k+9r49vdu9nT0gvRW9db09PQG9tD1qfU19xv5i/ol/O/8Jvx0+8r8Sf/QAOwBNgOwA7wDggRdBv8HVQjuCMQJNwo7C+gLaAsbC00NSBAXE90UBxFWBxz9QvYb84/yIfOO8r3wDvAk8cDzRvfT+gz8j/pO+cj5XPuW/F78BftF+QL46fgN/GT/lwAnAPj/7QCiAtMDMQRmBAoEmAOMBM4GeAiTCOkIbwk2CbMJsAsnDiQSthYJGjgauRD1/4n0p/Do7pbvRvIm83vx2fH39n/7tfs0+qX3EvWJ9XL4Y/ob+mb5o/jV+Ev8/f9tAGj/rf6D/lv/2gAgArABr/85/68BYwN5AyYEbgT+BEcH5QgkCWsI0AdmCf0LShBKF9Ab/BzfGX4Kb/b/7B3tgfAk9J/1yPSx9Rb6lf1W/ZP6jvWL8Q/yuPb9+hr7qfmx+FT55PvE/r0AFQDz/Tz+SABpAC3/M/9x/xX/Lv/9ANICxgI2AqMCpgOVBUoHFAcbB6cIqQqjDE8OxA4JEkMabiD5HicNH/U377fyjfMY+FP7N/c29kD91gF5/tz4SvJ46+3sJ/SB9/v2sfaL91j6m/5MAX8AQf45/kv/5f4a/j79+Pux/DL/nQHyArACcgLPAj8D6wIWAoQCdwRCBuUH7QkRCh4IpQfzCbcOvRO2GVcg8CADEaT5GPFy8kX11fgs9wT0KfjAAZcFU/9A9w3w5euv7zz0wfQ69Jj16vhl+1T9Wf6e/FT8Iv5K/pL9Kv0V/rL/pv9v/qT8C/1WAIUCEwOUA3gEjAQ1BFsE0QU6CO4IcwndCDUIrgrnDM8OqRN7GO8YNxj1DZf2i+3i+Kv7Y/iz+fr2LPiLAiEFNfhA7sruYPGS9IT37/PS70P2FP+g/oj8nPui+RH8FQBU/q76wvsj/isB4gIQAGD9U/7/AF8DpwP5AjMC0wD1AVoDQwQiBxsJMAkCCfAHAQjYB1YI+guIEGEUBRmUHOIP8/nE8Vz04/kr/ln6xPRZ9y0APAPv+sXxSu5Z7xj05vZZ9Az1dPtl/vr7Ofra+Nz4WPww/oD7HPtB/t3/WQDv/5r/+/4//5kA1QEuAxsDkAEXAukC7wKvBMEF7gVqCdsLLAqICVUJWwl4C/8N7w5OEgEYQRhpCpv1Ce3F9KEBWAUD/TP26PmFAFkAT/aD6zbqHfKJ92j0cPEs9J/6nP+j/Pj1Ivc7/AH9IPzo+j34hfu+AzAEfP9c/woBDQLvAmgBOgDLAgwEFwR8BCcEvQR/Bg8IMggzCXAJLwjHB4oIYgw0Dm8PrBGhFp8Y1whI9iTxd/Wp/i0EDv0v9+b7PgAC/cHz1eqt6kDzWvdh9bn09/ZR/Pf/2vto92/4UPqX+wz8Avt5+8r/8QL3ARQA5P7C/40BDgER/xH/DAITA9oCFwQ+BKMECQaYBuEFlgdZCc4HGQiaB+wFdAm8DskR3w9tEzwWxQj7+rf31/iL/L4Anfj69PL+MALT+4XzYO2m7XL1wfcp85Tx/Pbk/LT+kftb9qP1mvmw/OH7tfzo/cH+zQAHAqoAP/82AXQBSQEkArgBnQHzAqMDZwNKBE0EJAP4A9gFLwbAB8oH5gfeBn0FRga/CWkKQA2+Fb4XmRG9AQf3l/Xd+R/+if5E/W38oQFYAOb10e7J7k/x3PXw9Qjzz/bf+2v7Fvrc+Uv5Z/qf+0P7wfrc+iT9qv85ACgAtAD2ATYCLwKxAKoA8gEfA/gDFgQgBFMDsgRUBQ0F9QTDBhMJJggAB/EFlgZACNEJUQrrDcYSTBd1Dcr2JPA09pr+ZwTY/uL3jP3gAbf8dvOc7CrvhPZa+A32A/XO9kr8Hf7L+n/4CfrC+4P89voR+Zb7LQDOAU4Ag/+L/6cB0QJeAPP+DQCMAtwEPwReAi0DrQRsBfEF1wQUBOIFGwefBj4GogeeCUEKAQr+Cs4Ljg4mEOAIgPth9KL5TQCaBOEByvuN/O//cvxq9H3vgvA295L6h/dh9fr4hvzI/W38Kvgr+Oj7qfwm+0v7cPud/uIB5v+y/pH/hf8TADcBSQDdAP4CdwE4AYwEVAQ1BMIDSQPWBDcGEAZ6BrcHdQfaBgIGIgeCCT0LWQybDd0M4gyeAzr2PPWH+m8AgwSTAOH7v/6j/Uz3bfK18Df0cfn8+MD2mfjB+9n8+/p3+Er5Y/tb/Kn8+ftx/F3++/21/KX9dP+GAR0Baf8hACQCOwK0ASgBXQLSBCAFLwTTA2YE0gUsBjUFKAc2CNgFDwVEBmYH4AhqCcIL0g94Ea8KWvxk9fT4OQDHAWL+YP2eALYCaf2r9GLwN/TJ98X2HvSs9Xb72P4G/Mr4XvmB+q/7ZPtL+q37Vf9o/8D9Ev7j/rf/JwEdAbj/oAAuAfsA0gFpAsMCbQNTBJ0FMwZRBQQEtQPaBIAGkAZkBiYGHgZ5CHoJOgiwCdcMVgyBBbb/Kfqc+X0ASwAE/vH9Kf9g/1n7FfUu8lnz+PUy+HT2bfcL+9z70Prw+QL5BvlY+sr6evqX++X9x/4j/6z/l/9qALkAQAArAPYAwQHyAR8DgQM9BMgEtwRnBToG5QQtBJ4DdAJeBZIHogciCI0IsgcRCHgIMQqKDOwM5Qcr//T77voX/BYAPQA///cBR/8P+Yj0AfMC9XH1ifYX+TD6dfqU+wD6Q/iX+NP4lPjx+Wv8fvxH/ZP+uv4L/8j/h/+F/8cAwQG3AREBhgG4Ap0EIgZ9BdwEWwXTBlIHjQWrBNUFqgfPB90GkAc0B5gFiwZpCgEMXAvhCOcC1AC4/Y37mfsS+gH9TP++/Ib6Ufod91/0PvP68pv1F/kj+c34Fvug+7b6G/mp9235QvxW+n36o/x0//oAJADX/+0AqgNkAZX/LAGlAnwEpgR9AzsF5wduBgMF+QZZB6wHOweiBcQGHQgPBzYHcQf3BWYJsQvsCdIHtgNx/nf/uf0G93n76f7++0n8LPr197/5Ifcm8tLzC/c++JT4h/h//JL+evt5+v76C/od+hf6evrt/a3/rv6a/yACfgJ/AFn/MQBIAWUBRAJDBIwF8wbvBrUFpQZBB6gGzwUrBq8GjQYeBsEHvAgKCAUJHAz6DY8GAwHg/2D9ofxa/3YA7v2h/Yv8+vnu+Cn3xvSV9ZT3CvY99q/5Gvrx+jz6Cfqr+iD62foC/Hf94PzP/YD9nv3Z/x0AMgB0AAsBNgKOAYgATwLLBNcEAwVOB5AGtwWuBUwG+AavB7IH0wZHCdUIowf1CAcMcg4xCV4Ajf+RAov/hvqj/RgBB/+S/OD4J/r4+Sv2UvVs9fD13Pc8+CH5RPqE+Q76/vks+aD5VfuX+0r8L/7+/d78sP7z/gb/hQCkAGcBOwJcAqgBYAKmAz0FnQX7BegGqQaMBlUHIghhB/sHZQk5CuMLVAxtDeINnAf3AWgBzf0C+ub9Bv7M+z3/aP7F+jr5xvi89wv1GvTJ9V32oPdE+dn5Hfv7+pD6hvtR+876Q/vi+0v81vuN/EL/+f+v/0kCJgKaARQE9AJ+AoIEdAMXAxoG8Ac7B4kJzgsuCXsIkwowCRkJPA2kEDoR1gk4BfcFcwCC+IH4HPys/VT8TPwl/wH8k/a49kv2A/Px83z2Dvht+OD5X/xP/HD6mvnX+dP5tflc+dn6m/vB/NL/6v9vAFoCTwFJAe4BSQHcAdMC+wQcBxkIogj6CfAJQgiqCAEJjwiPDNMOLAu6DxwQuwQeAigDpvxD+V78E/2g+yH9gv7k+qX3QvhU9kT0y/Qv9Rz2n/dH+Nb4CvlR+Q/6vfi9+UH6z/mV+xP9v/yW/ob/cf9nAuQCfgNFBJIEPwVcBt8GhAcoCAAJdwl5Cb8K3gvJCisNfhBtEX0PGQlzBnYDT/xW+sT8h/k1/EL/vfv6+wb7APhI9zH1jvNs9fT1dPVk96b6+flA+Zv6e/lZ+J35Y/nl+br7yvwA/jgA8ABbAa4BcAKXA+MC5wOhBV4HXQcYCYgKFAo5CiMLmAyyC/wMPRFkD20J2AlmB/D+EP0w/ab5hfnA/CX9Z/ry+jv7K/cs9ZP2e/Rd8zb3nvcK96H4rfl1+Ur4hPrF+zb7qfxT/dL9Ff56/1cA1//mAcADOgP2BLwGXgelB0IJzgnrCAcKpwv7C8ENTBE2DxcM8wnVBxIBE/2n/4r7L/f0+9n8aPcF+rX7sveQ9h74ovah9Bv2UvZ49gT3oPe1+fT5WPq4/Ab9yvwU/mX+Pf70/l//ZwDnAbUC4ATSBs0GvAdfCJUIbgh/CPgK4wvgDHcOiA1fClgGiwR7Af39vv1D/Oz64vsY+gX58PkR+Nb2OfjI97f2g/hI9+311veU+Cj4uvmL/AX91/3a/zgANACJAS8CIgJeAx4F6AS3BZkHpQc7CJwJ6AkGCu4JTQnKCD4G8QWCBCMBmAF/ANL9zf25/ID6l/oV+tH5m/iG+FH5hvf492v5//gT+aT6gvtM+6j8VP6E/mL/KQAYAZEBhgGLA5kEsgSHBm0Hrgd4CPgJLQlpCAoLOweOBeQGKgIwAdkBPfwm/FX9TvgY+VT6dPgB+IL5Ivny96j50Pm4+P/5C/ve+sr71vzN/Vf+i/+eAeoB7gIwBawFyAYTCEgIhAg8Ce0IHgkBCjgGKwePB48CtQOzAV/+8P2T+3T6Xvkd+PD3+veX94P3m/j0+Hv4Pfpj+xH7KvzG/PT97f1s/uEAGgHVAesDEgWUBd4G/QeaCNUI0gh5CfsI/wb6BjEGUQPeAc8Av/60+6f6bvor+EP3GPji9+z23fdy+Yf4i/mn+3v7Tvz9/Q/+m/5SAA8BJgIhA9gEawZWBwAJVQpKCh0LhQsCCpkInwd2BfoBegHh/bn6zfrM93L2YPeQ9tb1hffh9xv44PkK++X62PuF/bz98vxt/zsBPACjAhoFFgXQBswJugmSCnwL7gs6C30JHwm3BR4D6QAZ/dn67vge90L2U/Wf9bP2r/YF+KD5VPpT+xX8yfxn/SL+G/+J/3EARgIoA6QDeAauBy8I0Qo8C48KQQsNCj4HMAZ4BLQAyf62/YT5S/id+HP1rfXk9lj2iPe0+HX5T/ob+8D8Fv2d/aT/GQB8AE0CeANEBP8FwQc3CIkJlQoTCtkKjwlmBygHuAQFAqEA5f15+5b5r/er9mL1+PRV9vD1rfb/+PT5R/vv/Ej+9v5MADEBZQJ9A34ExQX7BqkHEwhACQkJ5QhNCZEIDgcrBhcERQFn/2/8U/q5+Db2ffXk9dr0//Tn9pb3QPh3+q780PyF/rEA8QGMA4UEcwX6BloH4wddCIoIdQnuCKEIEghpBn4EAgNOAEn+I/35+jf5uPhB+O32AfcV91b3B/hF+Vf6lfsq/ZD+2v9lAdUCzAOlBOAFuwavBkEHVgctB/8GCAYZBQ0EfwKkAUkA1v4P/hH9EPyZ+xT7p/rN+p/6wfqc+yj8XPx1/Zv+PP/x/9MAgAECApcCDgNgA9kD+gPeA7wDOgOeAkECsAEDAY4A6f95/zH/qf5b/iD+y/2+/bj92v3t/ST+dv6+/uv+S/+o/7v/EABkAJUAygANARUBNwFaAUMBBAECAeIApAB6AFAAEgDx/wEAwv+r/5n/hf9r/3n/dP9X/2P/bv9x/2f/j/+3/7b/AQAJABcAVABkAF4AjACQAIYAmwB/AH4AbQBMADsAOgAIAOX/3//G/6D/mv+k/5T/hv+V/57/oP+g/7P/xv/W/+v/AgAgAEcAUwBrAHEAegCBAH8AcQBmAGUAWAA1AC4AGgABAPX/0//M/7v/qv+d/5j/iv+H/4D/if+Y/6f/tP/a/+f//v8PABoAJAArAD0AOwA4ADgAMAArACYAHQARAAoABAABAO7/6P/e/9X/1//O/8r/zP/Q/8f/w//Q/8z/2f/h//D////9/w4AFwAVABoAIQAiACMAIwAjACAAGgAZAAkAEQAEAAIA/v/w/+7/5P/l/+X/2P/a/9P/z//L/9L/z//T/9f/4//r//L/+f8AABQAGQAlAB0AIAAgABkAGQAPAA0A//8EAPP/7//n/+D/3//X/9j/0v/P/9D/0P/Q/9L/3f/a/+X/6P/x/6LPje5R7W9X\"\n        },\n        \"direction\": \"Request\"\n      }\n    }\n  },\n  {\n    \"connection_id\": 0,\n    \"action\": {\n      \"Data\": {\n        \"data\": {\n          \"Base64\": \"AAAguwAAAEPqTPNwEDpjaHVuay1zaWduYXR1cmUGACDLYeJ9LuCxYwsw52qw1nnIgE/cgnoX5FUcSdNL8dCOGQU6ZGF0ZQgAAAF7iTpG2AAAIGgAAABYrnw/FQ06bWVzc2FnZS10eXBlBwAFZXZlbnQLOmV2ZW50LXR5cGUHAApBdWRpb0V2ZW50DTpjb250ZW50LXR5cGUHABhhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW3x//f//v/9/wcABgANABAAFAAMAAoABAAAAP3/9f/z/+//5//j/9v/2//Y/9r/3v/a/9//3f/g/+H/4//l/+P/7f/t//P/9v/+////AwACAAEAAAABAP7////+//r/AAD3//z/+P/y//X/7P/x/+7/7P/0//L/9v/3//v//P/9/////////wMA+/8BAPv//f/6//f/9v/y//T/8v/0//L/7f/r/+z/5//j/+P/4f/l/+D/6f/g/+7/6f/1/+//+f/2//v/AAAAAAcABQAFAAoA/f8FAP7/AwD8//v/9f/0/+7/4//p/+D/4v/Y/9n/0v/T/9P/zv/b/9f/3f/c/97/4v/n/+b/6P/s//H/8f/z//T/9P/w//T/7v/x//T/7f/u/+n/5v/j/93/3f/b/9T/1P/N/9L/y//P/83/0//T/8v/1v/R/9X/1//Y/9v/2//a/9//3P/e/97/2//a/9n/3P/b/9T/1v/T/9n/0f/T/83/0f/O/8j/0f/I/9H/zv/R/8//0f/Q/9X/0f/Q/8//zf/J/8n/xv/N/8f/xP/E/8f/yP/G/8r/x//U/83/2f/U/9n/2f/c/9v/2v/k/97/5//j/+T/5P/f/+b/5P/f/+H/4//l/+T/5//r/+L/4v/o/+f/5v/t/+j/6v/o/+j/6//s/+7/6f/q/+r/7f/s/+T/8f/i/+3/4//m/+r/5P/l/+j/5//u/+//AQADABYAKABGAGgAmgC2ALwAWgAFAO//WQBkAIr//v97AGwAvf+q/y0A+f/Y/6X/XgC+AAUA8f/1/xsAFwDY////AwARABcA0v/Q//D/8P/8/6T/wP+xAEcAtv8WACAAcADg/4P/FAD3/zcA9P96/9L/UwAYAMT/9P8+AP3/8f/i/+j/NQANAO3/5//r/ygABgD1/xoAKAAgAAEA6P/8/+n/AwAsAAIACQAIANj/7P/6/8X/6P8WAPP/vv+4/xkABgDJ/xgANgAfANb/yv8NAAMA8v/o/wAAQAAWAN3/8f8fAPv/BQAJAPL/5v/v//r/2v/l/9b////x/83/3v/I/7v/zP/d/9f/9//Z//v/AQCv/7H/1v/U/8P/x//d/xAA9P/I//P/6/8SABIAvP/O//j/CgDh/6P/8v8uAOr/w//X/wkAHQD3/9T/9f8SAAMA8f/H//b/3f/I/+n/3f/j/9H/6v8UAOv/6P/U/9f/AADn/8n/3P/0/wsA1f/L////GAD9//H/BwANAPH/BAAoAAcA+v/x//z/6v/Y/93/4P/8/woA7//w/+r/5//f/8v/1f8MABgADwDu//b/9f/h/+//6v/m/wUAFQD6/+v/+f8YAAcAAAACAO7/4v/4/+b/2f/h/wQADADb/+D//P8NAPz/5//z/xwA7v/w/+n//v/2/+P/5f8DABwAEgAIAPP/AQD2/w8ABgACABYAAwD5/9//5P////L/9P/4/w0ADAAKAPT/8//8//j/CwD///X/+v8AAPj/9//y/wkACwD2/+7/9//4//v/+P/1/wkACgAPAAUA+v8AAAIA/P8DAPv//f8FAAYA9//s/+T/8f/7/+3/9//x/wUAGAAYAAYAAwAKAAkA/P/r/93/9f////b//f8OAAUA9//y//7/+v/l//n/DQARAPn/7//x/wkAAgDu/+r/AgAMAAIA/P8CAAgACQDz/wAA+////wcA//8CAPf/7f/8//v/AgAHAP3/+/8CAAMA+v/1//H/AQD0//H/9v/4/wAA9P/y//r/+//z//3/+f/9////AAD7/+//4//u/+z/6v/0/wEABQD///X//f8GAP//BQABAAgA+//5//L/8f/8//n/+//1/wIA/f/y//D/8/////b/+f/t//n/8//v/+z/8//1//P/9P/w//j/9P/+//X/+v/v//f/7v/3//T/+f/+//n/9//0////+P/8//z///8AAP7/9P/1//v/8f/6//L/9//1//z//f///wAA/f8CAP3/AwAAAAEABAACAPr/AwD6//z/9//8//n/+//8//7////7//z//v////3/+//6//f/+v/x//j/9//2//j/7v/1//H/+f/2//f//v/5//r//P/4//T/8f/u/+7/8P/y//L/8f/1//L/9f/z//f/9//2//b/9P/3//v/8//1//f/+v/2//L/9v/w//H/7P/w/+3/7v/w/+z/7v/v//D/7P/v//X/7f/w/+v/5v/r/+f/6P/n/+z/7f/o/+f/4//q/+T/4//m/+j/4v/p/93/6P/g/+z/4//k/+b/5P/l/+j/4f/o/+H/5v/e/+L/4P/h/+L/3v/j/97/4//e/+L/5f/j/9//4v/h/+f/4P/o/9//5//d/+P/3//i/+P/4//e/+j/4v/m/+H/5P/k/+D/4f/e/+L/3f/d/+D/3P/e/9r/3f/e/9j/2P/S/9z/1f/a/9j/3P/d/9v/3//V/9z/1//b/9v/2//Z/9z/2//a/93/3f/k/+X/5P/k/+b/5//p/+r/7//t//P/7f/v/+//7//r/+7/7P/t/+z/7//s/+r/6v/m/+v/6f/s/+X/6//i/+n/5f/n/+b/6f/k/+j/5v/o/+f/5//n/+X/6P/j/+3/5P/s/+X/5v/p/+n/6v/q/+v/6//s/+j/7P/p/+n/7v/o/+3/6v/r/+b/7P/o/+j/6v/p/+v/7P/p/+v/7f/q/+v/6f/p/+j/6//o/+r/4v/p/+b/5P/m/+H/5P/k/97/4v/e/9//3//h/9z/4v/d/+L/4P/f/+P/4P/e/9//4f/f/+D/4f/e/+T/3v/l/93/5P/c/+L/3//g/9//4f/g/+H/3//g/+H/4P/j/9//4P/f/9//3//h/9z/4f/e/9//2v/e/9r/3f/Z/9z/2P/d/9f/4P/X/+H/2f/f/9z/3//c/+D/3v/f/+L/3//h/+D/4//h/+T/4v/m/+D/5f/i/+P/5v/i/+j/5f/p/+X/6v/m/+f/6P/m/+n/6P/m/+n/5//p/+n/6v/o/+n/5//p/+z/5//t/+b/8f/p/+3/6P/s/+r/7P/p/+v/6v/t/+n/7P/m/+r/6P/p/+j/6P/q/+f/6//n/+v/6P/s/+n/7P/p/+z/6f/q/+z/6//s/+v/7f/s/+//6//v/+v/8P/q/+//7f/u/+3/7//r//L/7f/y/+//8f/w/+//8f/x//L/8f/y//L/8//z//P/8v/z//T/9P/y//b/8P/4//H/9P/1//L/8//0//P/9f/z//X/9P/1//X/9f/2//X/9v/1//j/8//4//X/9f/5//H/+v/y//f/9v/3//b/9f/6//P//v/y//v/9//4//v/9v/7//n/+f/6//f//P/4//v/+f/7//v//P/4//3/+P/+//r//f/6//3/+//8//z//f/8//7/+//9//7//v/8/////P////3//v////3////+//7///8AAP3/AgD8/wEA///+/wEA/v8BAAAA//8BAP7/AQD//wEA//8BAAAA/v8CAP7/AQD//wIA/v8BAAAA/f8EAPz/AgAAAP7/AgD+/wMA/f8CAP7/AQAAAP//AQD//wIA/v8CAP7/AwD9/wQA/f8BAAEA//8AAAEA//8AAAAA//8BAP//AQD+/wEAAAD//wIA/v8BAAAA/v8DAPz/AwD/////AgD+/wEAAAD//wEA//8CAPz/BgD6/wQA/////wIA/f8EAPv/BgD6/wYA+/8EAP3/AgAAAP//AQD//wEAAAAAAP//AgD9/wQA/f8CAP//AAAAAAEA/v8CAP//AAABAP//AAABAP7/AwD9/wMA/f8DAP3/AgD//wAAAQD//wAAAQD+/wIA//8AAAAAAAAAAP//AgD9/wMA/v8AAAEA//8BAP//AQD//wEA//8BAP//AQD//wEA//8BAP//AQD//wIA/f8DAP3/AwD+/wEA//8BAP//AQD//wEA//8BAP//AQD//wEAAAD//wIA/v8BAAAAAAAAAAEA/f8EAPz/AwD/////AQD//wEAAAAAAP7/AwD+/wIA/f8DAP3/BAD9/wEAAAAAAAAAAAAAAAAAAQD+/wIA/v8DAP3/AgD//wAAAQD//wEA//8AAAEA/v8DAP3/AgD//wEA//8BAP//AQAAAP//AQD//wEA//8BAP7/AwD9/wIA//8BAP7/AgD//wEAAAD/////AwD8/wUA/P8CAP//AAABAP//AQD//wEA//8BAP//AQD//wEA/v8DAP7/AAABAP7/AwD9/wMA/P8EAP7/AAACAPz/BAD+/wEA//8BAP7/AwD9/wMA/f8DAP3/AgAAAP7/AwD9/wMA/f8DAP3/AgAAAP//AQD//wEAAAAAAAAAAAD//wIA/////wMA/P8EAP3/AQAAAAEA/v8CAP7/AQABAP7/AgD+/wEAAAAAAAAAAQD+/wIA/v8CAP7/AgD//wAAAQD9/wMA/////wMA/P8DAP7/AgD+/wMA/P8EAPz/BAD9/wIA//8AAAAAAAABAP7/AwD8/wQA/f8CAP7/AgD+/wIA/v8CAP7/AgD+/wIA/v8CAP7/AQAAAAAAAAD//wEA//8BAAAA//8CAP3/AwD9/wMA/////wEA//8BAAEA/f8DAP3/AgAAAP//AAABAP7/AwD9/wIA//8AAAEA//8BAP7/AgD//wAAAQD+/wIA//8AAAAAAQD+/wMA/P8EAP3/AgD//wAAAQD//wAAAQD//wEA//8BAP//AQD//wAAAQD//wIA/f8DAP3/AgAAAP//AgD+/wEAAAAAAAAAAQD+/wIA//8AAAEA/v8CAP//AAABAP7/AwD9/wMA/v8AAAIA/v8AAAIA/f8DAP7/AAABAP//AAABAP//AAABAP7/AgD//wAAAQD//wAAAAABAP7/AwD9/wIA//8BAP7/AgD//wAAAQD/////AgD//wAAAgD9/wIA//8BAP//AgD9/wMA/v8BAAAAAAAAAAAAAAAAAAEA//8AAAAAAQD+/wMA/P8EAP3/AgD//wAAAAABAP7/AwD9/wIA/v8DAP3/AgD//wAAAAABAP7/AgAAAP7/AwD9/wIAAAD//wEA//8BAP//AQD//wEAAAD//wEA//8BAP//AgD9/wMA/f8DAP7/AQD//wAAAQD//wIA/v8AAAEA//8BAAAAAAD+/wMA/f8DAP3/AwD9/wMA/f8CAAAA//8BAP//AQD//wIA/f8DAP3/AwD+/wEA//8BAAAA//8BAP//AQD//wEA//8BAP//AAAAAAEA//8AAAEA/v8CAAAA/v8DAP3/AgD//wAAAQD//wEA/v8DAPz/BAD9/wEAAQD//wAAAQD9/wMA//8AAAEA/v8BAAEA/v8DAPz/BAD9/wIA//8AAAAAAQD+/wMA/f8BAAEA/v8CAAAA/v8DAPz/BAD+/wAAAQD+/wMA/v8AAAEA//8BAP//AQD//wEA//8BAP//AQD//wAAAQD//wEAAAD//wEA//8BAAAAAAD//wIA/v8CAP7/AQD//wMA/P8DAP3/AwD+/wEA//8AAAEAAAD//wEA//8AAAIA/f8DAP7/AQD//wEA//8BAAAA//8BAP//AQD//wEA//8AAAEA//8AAAEA/f8FAPv/AwD/////AgD+/wEAAAAAAP//AgD9/wQA/P8DAP7/AgD+/wIA/v8CAP7/AgD+/wEAAAAAAAEA/v8BAAAAAAAAAAAAAQD+/wMA/P8DAAAA/v8DAP3/AgD//wEA//8BAP//AQD//wAAAQD//wEA//8AAAAAAQD//wEA/v8BAAEA//8BAP////8DAP3/AgD//wAAAQD//wEA/v8CAP//AQD//wEA//8AAAIA/f8DAP7/AAABAAAA//8CAP7/AQAAAP//AgD+/wIA/v8BAAAA//8CAP3/BAD8/wMA/////wIA/v8BAAEA/v8CAP3/BAD8/wQA/P8DAP7/AgD+/wIA/v8CAP7/AgD+/wIA/v8CAP7/AgD/////AgD+/wIA/v8BAP//AQD//wEA//8BAP7/AwD9/wIA//8AAAAAAQD+/wIA/v8CAP7/AwD8/wQA/f8CAP//AAAAAAAAAQD+/wIA//8AAAEA/v8DAP3/AgAAAP7/AwD9/wIAAAD//wEA//8BAAAA//8CAP3/BAD8/wMA/v8BAAEA/f8EAPz/AwD/////AwD7/wYA+/8DAP////8BAAEA/v8BAAAA/v8FAPn/BwD6/wQA/v8BAP//AgD9/wMA/f8CAAEA/f8EAPz/AgABAP7/AgD//wAAAAAAAAAAAAAAAAAAAAAAAP//AQAAAP//AgD9/wMA/v8BAP//AQAAAP//AgD9/wQA/P8DAP7/AgD+/wIA/v8BAAAA//8BAAAA//8CAP3/AwD+/wIA/v8CAP3/BAD8/wQA/P8CAAAA//8CAP3/AgAAAP7/BAD8/wMA/v8BAAAA//8DAPz/BAD8/wMA/v8CAP//AAAAAAAAAAABAP//AAABAP//AQD//wAAAQD+/wMA/f8CAP////8CAP//AAABAP7/AgD/////AgD+/wIA//8AAAAA//8BAAEA/v8CAP3/AwD+/wIA/v8BAP//AQAAAAAAAAAAAP7/BAD8/wQA/P8DAP7/AgD+/wEAAAAAAAAA//8BAAAA//8BAP//AQAAAP7/AwD+/wEAAAD//wEAAQD9/wMA/v8BAAAAAAD//wIA/f8DAP7/AQAAAP//AgD+/wEAAAD//wIA//8AAAEA/v8CAP//AAABAP//AQD+/wIA/v8CAP7/AgD+/wEAAAAAAAAAAAD//wIA/v8CAP7/AQAAAAAAAAAAAP//AgD+/wEAAAD//wEAAQD8/wYA+v8EAP7/AQAAAAEA/f8EAPv/BQD9/wEAAAAAAP//AgD+/wIA/v8CAP7/AQAAAAAAAAAAAP//AQAAAAAAAAD//wIA/v8BAAAAAAD//wIA/f8EAPz/AwD+/wEAAQD9/wQA/P8DAP////8CAP7/AQD//wIA/f8DAP7/AAACAP3/BAD8/wMA/v8CAP7/AgD9/wQA/f8CAP7/AQD//wIA/v8BAAEA/P8GAPr/BAD+/wAAAgD9/wQA+/8FAPv/BQD8/wQA/P8DAP7/AgD/////AgD+/wIA//8AAAAAAQD9/wQA/f8CAP////8CAP7/AgD+/wIA//8AAAAAAAAAAAAAAAAAAAAAAAD//wIA/v8CAP7/AgD//wAAAQD//wAAAQD//wEA//8AAAAAAQD//wAAAQD+/wIA/v8CAP7/AwD8/wQA/f8BAAEA/f8FAPv/AwD//wAAAAABAP3/BQD7/wQA/f8BAAEA//8AAAAAAAAAAAEA/v8CAP7/AgD+/wIA/v8CAP7/AgD+/wIA/v8BAAEA/v8CAP7/AQAAAAAAAAAAAP//AQAAAAAAAAAAAP//AgD+/wIA/v8CAP7/AgD+/wIA/v8CAP7/AgD+/wIA//8AAAAAAAAAAAEA/v8CAP7/AQAAAP//AQD//wEA//8CAP3/AgAAAP7/BAD8/wMA/v8BAP//AQD//wEAAAD+/wMA/f8CAP//AAABAP//AQD+/wMA/f8DAP3/AgAAAP//AQD//wAAAgD9/wMA/f8DAP7/AgD+/wEAAQD+/wIA//8AAAEA/v8CAP7/AgD+/wEAAAAAAP//AgD+/wEAAAD//wIA/v8BAAAAAAD//wIA/v8CAP//AAABAP7/AwD9/wIA//8AAAEA//8AAAEA/v8DAP7/AAABAP//AQD//wEA//8BAP//AQD//wEA//8BAAAA//8BAP//AQAAAAAA//8BAP//AgD9/wQA+/8FAPz/AwD+/wEA//8BAAAAAAAAAP//AQD//wIA/v8BAAAA//8CAP7/AQAAAP//AwD7/wUA/P8DAP3/AwD9/wMA/v8AAAAAAQD//wEAAAD+/wQA+/8FAPz/AwD+/wEAAAD//wIA/v8BAAAA//8CAP7/AgD+/wIA/v8CAP7/AgD+/wIA/v8BAAAA//8CAP7/AQD//wIA/f8EAPv/BQD8/wIA//8BAP//AQD+/wIA//8BAP7/AgD+/wIA/////wIA/f8EAPz/AgD//wEA//8CAPz/BQD7/wUA+/8EAP3/AwD+/wAAAQD//wEAAAD//wEAAAD//wEAAAD//wEAAAD//wEAAAAAAP//AgD+/wIA//8AAP//AgD+/wIA/v8BAP//AQD//wEAAAD//wAAAQD//wIA/f8DAPz/BQD8/wIAAAD+/wMA/f8DAP7/AQD+/wMA/f8EAPz/AgAAAP//AgD/////AgD+/wIAAAD+/wMA/f8CAP//AQD//wEA//8BAP//AQD//wAAAQD//wEAAAD+/wMA/f8DAP7/AQAAAP//AQD//wIA/f8DAP7/AQAAAP//AQAAAP//AQAAAAAA//8CAP3/BAD8/wMA/v8CAP7/AgD9/wQA/P8DAP//AAAAAAAAAAAAAAEA/v8CAP//AAABAP7/AgD//wEA/v8CAP7/AgD/////AwD7/wYA+v8GAPv/BAD8/wQA/f8CAAAA/v8CAP//AAABAP7/AgD//wEA/v8CAP7/AwD9/wIA//8AAAIA/f8DAP3/AgAAAP//AgD9/wMA/f8DAP7/AAABAP//AQAAAP7/AwD9/wIAAAD+/wQA+/8EAP7/AQAAAP//AQD//wEAAAD//wEA//8BAAAAAAAAAAAA//8CAP//AAAAAAAAAAAAAAAA//8CAP7/AgD9/wMA/v8BAAEA/f8DAP7/AgD+/wIA/v8BAAEA/f8EAPv/BgD6/wUA/P8CAAAA//8CAP7/AQAAAAAA//8CAP////8DAPz/AwD/////AgD+/wIA/f8EAPz/AwD//wAAAAAAAP//AgD//wAA//8BAAAAAAAAAP//AAACAP3/AwD+/wAAAgD8/wUA+/8FAPz/AwD9/wMA/v8BAAAAAAAAAAAA//8BAAAAAAD//wIA/f8EAPz/AwD/////AgD+/wIA//8AAP//AgD9/wQA/P8DAP7/AAABAAAA/v8EAPv/BAD+/wAAAQAAAP//AQD+/wMA/f8EAPv/BAD+/wEAAAD//wEA//8CAP7/AQAAAP//AgD+/wEAAAD//wMA/P8DAP////8DAPz/BAD9/wMA/P8EAP3/AwD9/wIA//8BAP//AQD//wIA/f8DAP7/AQAAAP//AQAAAP//AQD//wEAAAD//wEA//8BAAAAAAD//wEAAAD//wIA/v8BAAAA//8BAP//AgD9/wQA/P8DAP7/AgD+/wIA/v8CAP//AAAAAAAAAAABAP7/AwD9/wMA/f8DAP3/AgD//wAAAgD9/wEAAAAAAAEA//8AAAAAAQD//wAAAQD+/wIA//8AAAAAAQD+/wIA//8AAAEA/v8CAP//AAABAP7/AgD//wAAAAAAAAAAAAAAAAAA//8CAP7/AgD+/wEA//8CAP7/AgD///7/BAD8/wMA/v8BAAAAAAAAAP//AQABAP7/AwD8/wMA//8BAP//AAAAAAAAAQD//wAAAQD+/wIA//8AAAEA/v8CAP7/AgD/////AgD+/wEAAAAAAP//AgD9/wMA/v8BAAAA//8BAAAA//8CAP7/AgD+/wIA/v8CAP//AAABAP//AAABAP//AQD//wEA/v8EAPv/BAD9/wIA//8AAAAAAAAAAAAAAAAAAAAAAAAAAP//AgD9/wQA/P8DAP7/AQD//wEAAAD//wIA/f8DAP3/AwD9/wQA/P8CAP//AQAAAAAA//8BAAAAAAD//wIA/f8DAP////8BAAAA//8CAP3/BAD7/wYA+f8HAPr/BAD/////AgD9/wMA/v8CAP7/AQD//wIA/v8BAAAA/v8EAPz/AwD+/wEA//8CAP7/AQAAAP//AwD8/wQA+/8FAP3/AQABAPz/BQD8/wMA/v8BAP//AQAAAP//AQAAAP//AQAAAP//AgD+/wIA/v8CAP//AAABAP7/AwD9/wMA/f8CAP//AQD//wAAAQD//wEA//8AAAEA//8BAP//AQD//wEA//8BAP//AQD//wEA//8BAP//AAABAP7/AwD9/wIA/v8CAP//AAABAP7/AwD9/wMA/f8CAP//AQD//wEA//8BAP//AQD//wEA//8AAAEAAAD//wEA/v8DAP3/AwD9/wIAAAD//wEA//8BAP//AQD//wEAAAD//wEA//8BAP//AQD//wEAAAD+/wMA/f8DAP7/AAABAAAA//8BAP//AQAAAP//AAABAP//AQD//wAAAQD+/wQA+/8FAPz/AwD9/wQA/P8EAPz/AwD9/wQA/f8BAAAA//8CAP//AAAAAAAAAAAAAAAAAAD//wIA/f8EAPv/BQD8/wMA/////wIA/v8CAP7/AgD+/wIA/v8CAP7/AQAAAP//AgD9/wMA/v8BAAAA//8BAAAAAAAAAP//AgD+/wIA/v8CAP3/BAD8/wQA/P8DAP7/AQABAP7/AQAAAP//AgD+/wEAAAD//wIA/f8EAPz/AwD9/wMA/v8BAAAA//8BAAAAAAAAAAAAAAD//wMA/f8BAAAA//8BAAAA//8BAP//AAABAP//AQD//wAAAQD//wEA//8AAAEA//8AAAEA/v8CAP//AAAAAAAAAAAAAAEA/v8CAP//AAABAP//AQD//wEA//8CAP3/AwD9/wMA/v8AAAEA/v8DAP3/AgD+/wEAAQD+/wIA/v8CAP7/AgD+/wIA/v8CAP7/AgD+/wIA/v8BAAEA/f8EAPz/AwD+/wIA/v8BAAAAAAAAAAAAAAAAAAEA/v8BAAEA//8AAAEA/v8DAP3/AgD//wAAAQD//wAAAQD+/wIA/v8CAP7/AQABAP3/BAD8/wMA/v8CAP7/AwD8/wMA/v8CAP//AAD//wIA/v8CAP7/AQAAAAAAAAAAAP//AgD+/wIA//8AAAAAAAAAAAEA/v8CAP7/AgD/////AgD+/wIA/////wIA/////wMA/P8EAFOofvhX6JMI\"\n        },\n        \"direction\": \"Request\"\n      }\n    }\n  },\n  {\n    \"connection_id\": 0,\n    \"action\": {\n      \"Data\": {\n        \"data\": {\n          \"Base64\": \"AAAguwAAAEPqTPNwEDpjaHVuay1zaWduYXR1cmUGACBHNzJEwRJDqJr6h+i3rlUVaxtNNoom46Ir9l4MiCp/FgU6ZGF0ZQgAAAF7iTpG2AAAIGgAAABYrnw/FQ06bWVzc2FnZS10eXBlBwAFZXZlbnQLOmV2ZW50LXR5cGUHAApBdWRpb0V2ZW50DTpjb250ZW50LXR5cGUHABhhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW39/wEAAQD//wEA/v8BAAAAAQD+/wMA+/8GAPv/AwD//wAAAQD//wEA//8AAAEA//8BAP//AQD//wEAAAD//wEAAAAAAAAAAAD//wIA//8AAAAAAAAAAAAAAAD//wIA/v8BAAAA//8BAP//AQAAAP//AQAAAP//AQD//wEAAAAAAP//AQAAAAAA//8CAP7/AgD//wAAAAABAP7/AgD//wEA/v8CAP7/AgD+/wIA/v8CAP3/AwD+/wEAAAD//wEA//8BAAAAAAD//wIA/P8GAPv/AgAAAP//AQD//wAAAAABAP//AQD+/wEAAQD//wIA/f8CAP7/AgAAAP//AAABAP7/AwD9/wIA//8BAP//AQD+/wQA+/8FAPz/AgD//wEA//8CAP3/AwD+/wIA/v8BAAAAAAABAP7/AQAAAAAAAAAAAAAA//8CAP3/BAD8/wMA/f8DAP7/AgD9/wMA/f8EAPz/AgAAAP//AgD9/wIA//8CAP7/AAACAPz/BgD5/wcA+/8CAAAA//8BAAEA/f8DAP7/AQD//wIA/P8FAPr/BgD7/wMA/v8BAAAAAAD//wEA//8CAP7/AQAAAP7/AwD8/wQA/f8BAP//AQD+/wMA/f8CAP//AQD+/wIA//8BAP//AAAAAAAAAQD+/wIA/v8CAP7/AgD+/wIA/v8CAP7/AAD+/wAA/v/+/////f////7/+v8BAPn/AgD5//7//P/8//z//f/6//z/+//8//n//P/4//z/+v/4//r/+f/5//v/9//4//r/9v/5//b/+P/3//j/9//3//b/9//4//b/9//2//f/9v/3//T/9//1//b/9//0//b/9P/5//H/+v/v//n/8//1//X/8v/1//P/8v/1//H/9f/x//T/8//x//P/8v/w//b/7//0/+//8P/y//D/8P/w/+//8P/v//D/7f/w/+7/7//x/+3/8f/s//L/6v/w/+r/7//r/+7/6v/t/+z/6f/v/+j/6//p/+j/6f/o/+j/6f/m/+r/6//p/+v/6P/o/+b/6P/m/+X/5v/j/+b/5P/j/+X/5P/j/+X/4f/n/+H/5//i/+b/4//l/+H/5P/j/+L/4v/h/+H/4v/f/+H/4P/i/+H/3//g/9v/3v/c/93/2//d/9n/3f/X/9z/1f/e/9T/3f/W/9z/2P/Z/9v/2P/d/9f/2//c/9r/3v/X/97/2f/b/93/2v/b/9r/3P/Y/9z/2P/a/9b/2f/S/9f/0v/Y/9L/1P/T/9f/1P/Y/9P/1f/T/9X/1P/V/9T/0//V/9T/1v/W/9b/0v/X/9L/0P/V/8//2P/U/9j/2f/V/9v/1v/Z/9f/2f/W/9f/2f/V/9f/1P/W/9P/1v/R/9T/0//Q/9T/zv/R/9X/zv/X/9L/1v/T/9b/2P/W/9b/1v/Z/9n/2v/c/9r/3P/Z/9v/2//e/9r/2v/Y/9j/2v/W/9r/2f/b/9b/1//Q/9f/0P/U/87/1f/N/9P/0P/S/9L/1f/T/9b/0//V/9f/2P/T/9j/2P/W/9b/0//Y/9b/0//V/9H/0//S/9D/0P/P/9D/zf/O/9H/zv/P/9H/yf/S/8n/0P/J/87/yf/O/8r/yf/J/8z/yP/J/8X/wf/E/8L/x//B/8H/wP++/8D/xP/A/8X/wP/F/8D/wP/A/8X/v//D/7//wf+9/77/v//C/8L/yf/H/8z/x//L/8r/z//J/83/zf/T/8z/z//N/87/yv/R/8j/zv/G/9D/zv/R/9T/zP/Q/9H/z//U/9D/1f/T/9b/0v/Y/9X/2P/S/9j/1P/U/8//0f/P/9X/0f/W/9b/0f/V/9H/0//U/9f/0//T/9T/1P/Y/9j/0f/a/9L/2f/T/9j/1//Z/9f/1//e/9n/3f/a/9z/3f/a/9n/2//a/9//3f/m/9//4P/f/97/4v/g/9z/4P/d/+f/4P/f/+L/3P/j/9//3//j/+L/5//l/+T/5//g/+X/3//l/+X/4f/k/+L/4f/i/+H/2f/n/9r/5v/Y/9//3P/f/93/4P/k/+j/4P/o/+X/6P/m/+T/6f/j/+L/4//j/+T/4//i/+X/5f/m/+j/5//q/+j/6f/n/+b/6v/l/+n/4v/j/+X/4P/j/9//5P/h/+b/5P/g/+L/4P/e/+D/3//e/+D/3f/e/9z/4P/c/9//3//c/9//3f/g/9v/3f/W/93/2//c/9z/2//k/+T/4v/k/+P/5//j/+X/5f/h/+P/5P/j/+D/4f/g/93/3v/d/+D/2P/b/9n/2//a/97/1P/g/9H/3//T/93/2f/g/9j/3f/Z/97/3P/b/93/3v/g/9//3f/g/97/5P/e/+T/3P/i/+L/5P/g/+L/5f/j/+X/3//j/+L/4P/h/9n/2//W/9n/1f/V/9X/1//T/9H/0f/T/9L/0//P/9P/0v/R/9P/0//U/9n/1//a/9v/1v/e/9v/4f/d/93/4v/e/+L/3P/f/+D/3v/a/97/1//W/9f/0//Z/9X/2v/X/9b/2f/V/9v/0//V/9X/0f/U/87/0//P/83/z//K/8v/yf/N/8z/yv/N/8f/yf/I/8f/x//I/83/zP/N/8//z//Q/9L/0P/Y/9H/0//Q/9D/0f/Z/9H/3f/X/9//2//i/+H/4//i/+X/5f/p/+n/5//m/+v/5f/t/+P/6f/g/+P/3//j/+P/4P/h/+L/4P/l/9z/5f/j/+P/5P/h/+P/4//n/+b/6P/l/+f/5//l/+H/4v/j/+D/4f/m/+P/5//p/+f/5f/l/+n/6P/r/+T/6f/n/+r/7P/r/+z/6f/r/+v/7P/r/+3/6//u/+r/5v/w/+T/8v/p/+//7P/w//D/9P/w//b/8f/5//T/9//y//T/8f/3//P/9//y//b/8f/1//P/8P/x/+3/9P/t//P/7//z/+//8v/t//H/7f/z//D/8f/z/+z/8v/z//D/8v/s/+z/7//q/+n/5v/q/+f/5//o/+H/6P/g/+P/5P/h/+H/4f/g/+D/2//j/9z/4v/c/+L/4v/f/+X/3v/n/9//4P/h/9//3//j/+L/4f/k/+P/6f/j/+f/5v/p/+n/6P/r/+X/6//u/+v/7P/r/+v/8P/n/+z/5//v/+r/7f/u/+v/8P/r//D/5//v/+n/8v/w/+7/7//x/+//7//z/+3/9v/x//T/7v/v//H/8f/z/+//7v/p/+7/7f/v/+7/8v/u/+3/8f/t//P/8v/r//L/7//w//D/7v/w//H/8v/z/+z/8//u//P/6v/1/+r/8f/s//H/7//t/+j/6f/o/+b/5P/d/+b/3v/f/97/2f/f/93/4//c/9//3//j/+D/5v/h/9//4v/b/+H/4P/j/+P/5f/i/+D/6//m/+j/5P/n/+b/7f/n/+f/6f/q/+b/5//j/+n/4f/l/97/3f/j/+D/4//d/+D/3//h/+H/3//i/+D/4//e/+L/3//d/+X/5f/g/+f/5v/m/+f/4//o/+T/6v/o/+n/6v/r/+v/6P/q/+v/6//t/+n/6//w/+n/6//p/+r/7f/p/+j/5v/p/+L/6f/j/+D/4v/b/97/3P/a/9j/3P/i/93/4P/j/+r/4f/t/+n/8f/n/+v/6//t/+n/8P/0//T/6//l/+f/6v/v/+X/4v/o/+r/6v/m/+T/5//j/+b/5P/l/+f/6v/t/+r/7v/x//X//f/9/wEA/f8DAAMABQAIAAcADgAHABMADQAVAAoACwAIAAcA/f/+//v/9P/3/+r/7P/m/+b/4f/W/93/zP/O/8n/zP/I/8H/wv/E/8T/0f/a/97/6P/x////EQAZABsAJgAoAD4ANgBBAEUAPAA8ADsAOAAmACkAEwAKAPj/4//T/8f/rf+n/4T/fv9m/2j/W/9d/2T/c/95/53/vf/R//n/IABJAGsAoADFAPUAEQE1AUoBZQGGAZMBjwF0AV8BOAEFAdIAkgBNAAUAwf9s/yj/4v6i/kf+Hv7y/cH9qP2S/X39j/2l/dT9DP48/p/+7P5U/8L/IwCLAAMBpgErAnMCwQJUA+ED6QMEBEAESARMBPUDtgNQAwcDbwLUAVEBkwDc/zH/kf72/Ur9sfxE/NH7cfsb+9f62/r2+v76LvuF+/b7cPwR/cT9ev4//9b/mABdASAC2QJiA/QDngQEBTsFcAWTBZAFaAVFBfgEjQQmBKEDJQOGAuABJwGHANn/Nf9x/sH9Mf2V/Of7Rvvd+n76Kvrs+dH58/k5+mb6pvpH++D7e/wj/d79pP6O/08AEwH0AdICfAMZBK0EKwWVBe0FKwZWBnUGagaEBn0GKQbTBYkFzwQCBEgDVQJPAToAIP8v/iz9KfxY+5r60vku+dX4afgo+D34TPhy+Bn5h/kb+vP63vvc/KH9qv7S/4wAYwE5AhIDzwNMBNQEcgUIBjAGpwbWBhMHSgcwBwgHvQapBu4FPQWOBKsD3QLDAc8AAQAC/8z9fPxb+7D6Ivo2+Xb4RPjJ91T3Yfd+9+b3W/jc+JP5Tvpa+7X8dv16/uL/xAB0ATcCXgNIBPEEmQVwBtwGMAeKB8AHAwjwB88HqwcnBxoHSQYvBR8FgASAA2MCSAFAABj/NP0g/Cb7Bvol+UH45vcw9+D2h/ar9tL2Sfeu9933Bvk0+jj7vvto/Y3+u/8aAVYCsQN+BHwF1wWeBgYHxgciCLAIuAiZCNEINQjCB5UH2gZeBpAFdwOhA/YCPwExAHb/WP6a/MX7wvr3+TT5qfjD92b2WvZ69hr2Rfax9/X3Rfi3+bX69PuP/cX+PQDEAaQC1wNBBf8GmQfYB6MInQinCEUITghKCGAHVAdwB4QIHwi4BvQGbQc5BO8CSwPD/8b9aftV+Dn3yfTz8przOPIm8jHyQ/MW9DP0D/fE9z75uPyW/t3+kQHAA1ME2QX3BgIISAljClAKwgpEC6kLkwt2C30LswuYC8oKTgpUB6YEZQGd/lX8Afj89fbz6/Dx7yDw/+/u7qTvW/N09Nb0xvcd+mr8t/50AG8DwwMABXoHvQYiCOQJQgplCwYMOAvwC60LwQuYDeMOsg0qChUHaQWfAY38Ivko9TXyW+497OXs4OtQ7GDvLfOA9WD3R/t2/x0BlAKuBJUF2QWEBRMG5QbCBnMHZAm+CSQKbwpQCvwLkw1BEX4RGAtYCRgK6gEw+dT3rfPW64Pp3umq6WLodevB8TLzRvZS/Pv+zwHGA+kESwfbBZUEiQSnA+IDKAUFBtIHJgmPCggMEw0qDycUVhbFDsgLYAzpAlz5BPXH8F7pfePb5RTmH+SD6tXzYPWg9/cAUAajBFEGFAppCIkE+AN9A78A3gEdBewFzwdlC+4NiBAQFKcaTBkOD5MRVA7m+173efUi7AnkD+Lj5/TkHuXL8lv13fS9/10F/gLkA2IHBAfZ/5H+2gFG/gL+FwGoBMQGBwgVDqoSuhUCHFEWTRN3FXgIxf7L+KHvS+ql497jcOn64zntrfkC95z+vQbrBisIZwaKBxcFr/1OAL3/4fu6/1oDlQVpB3kLXBJUFfMYKBPJEAYRFAP2+SL0QOuN5sDhgOET5yHnCfCt+O76GQRHCEEJBwttCF4HJQUUAXMCjwJhAs0F3QVSCdMO9hEvGSUXLRIzFLIL3/1P+IPxTuea4VThFuW540/p9vVD+OL9VAfWByoIfQnZB1gGoAJGAwoD2wBxBWoGLggED24UpxpyFTMRCRZMCUf6hfds7ejiet8I4GjjuOIX7Cb5TPoaAFMKWwoDCrALLwqVB+0E3gVTBKYDWQddCRMLfBEKGQ0UFg+NEg8IVfo89gjv4+TJ32Xjf+VD5GLuR/ip+aP/VgjrCPMH2AtFCicGOwdXCEoFbwXiBz4JAgzbEkAW7RACEBkOGgGm98r0q+sd4znkmOYv5UHpivRs+Oj5DQUpCAsGFwp1CxEIiwZnCFEI0gXnBqAJDguAEfYTNxAbDtwMEgTY+G71FfDN5kHlAemZ59/pUvPC9zf6mQAFBu4FkwaKCZMIPQeACCsJEwjaB0kKKgwdDqUS0A18C6oLngDn+cr1YO+V6RHnheqT6uXqfPUN+e74YQEOBVQEqgcRCaEJMgkECh8MPwlzCYcL/QwJD1wO7wlNCokFPfxj93Xzpe6y51ToWez06h3uGPZ1+Ij6VADzBBgGfwcNC1MM/wqZDU0NxAv5CuUMbg7LDDgMqQl8Bpj+APoB9S7uWuuG6Ffpxez57H/xI/fb+M/9AAJoBYQHyAn5DNwM/QzoDokMBAvhDMEMgw3jC5EIHQeGAUX7ufem8izuhevt66vtKu1T8HD1k/eC+ioATwMUBWIISgvdC7EL5g3TDEUKMwxLDdgLxwsxCWoFwwGm/F74uPSF8e/ufu5675zvVPHK9Wn38fnu/tsBdgMWBgwJAQu+CXUK4wsGC3IKZAoUDKsJGgfWBQsDsP0Z+hf4PvVT8sjxXfPA8ery9PaT+P34Cv0VAfABjQLdBooHxQZiCbQJqwmgCBIKFguIB68FjQZoA27/uv0w+xT5Sfew9r31GvX19kX3cvel+sf8bf0H/0kBMgO4Ao4DHwZPBtIGiAbRByIHgAXCBnMElwO0AvYA9P/e/ND7ZftK+ZH5hvjT+Yj61fme+7n8Zv1//jUA3QCHAngC/wPIAwYExAREBPoD7wObBAsCoAJDAgoAL/+e/3L+Hf21/NL9nP1L/KD9D/1m/Sr8/v20/rD+EgDGAFsBuABQAZUB2AGfAdABQQJlAi0B7QBdAFEB7v/1/ioAuwBZ/r3/q//e/mgAr/0f/4b/Nf7c/t//kP/k/6L/AgGuAO7+1QAjA+7+YwAGAgoBHP/h/zIBPgACAGT/JQIm/mIAmv+6/13/Ev/QAaf+E/8HARAAJgAF/y8BLAEX/iIAnv9t/4b+ggB1/yMANQD6/zUBPf8SAFMB1f/M/p0Al//R/+T+7f8nAf7+3gCTAPf/NgGEAGEAPQA8AYf/Yf+BAOD/MP9HAAoB9v42AGUAkP9s/47/nQD4/hr/pgA9/vD/p/9K/7sAcP+IADAAAgCSAKX/sQDFAGL/aQB7APr/Zv+hAMcA4/8hACQBYQDd/r8AYAAx/xH/lwBdAOv9OgD4AP3+4v+pAEcAlP8wAF8Apv+M/68AZP9V/2gAjP+2/2MARwBy/x0BDQBk/z8AUQDe/y3/oABVAPf+hwBjAHX/GgDHACQAM//2AGkAP/////0AsP91/8sA+f9c/+r/oABL/3P/vwDr/wP/WwCcADb/2P+5AOf/dv9QAHsAg//T/44A3v+o/zcAKADQ/wMACwD1/woA7v/4/zAADQDE/wUAagCs/8X/hAD//1//QwCkAIT/tf+zAAwAS/94AIkAXv+b/8QAEgAx/3UAfwBN/73/jAAGAID/XwC9AG3/uv+MABwAf/+5/3MAxv8gAG0A9v+N//3/TAAtABYAqv8jACEA1v8cAGEAw/+u/wkAYwCq/7n/1AB0/4T/MgCiANv/dP+LAMr/wv9SAFYA2f90/woBFADm/t4AIgCz/7b/2ADp/8v+GgGQ/4v/z/9nAPb/Sf/SAIH/xP81AOj/QgCL/ygAcwDl/w8AgP8iADAAWgAXAFf/cACx/wgASADc/9r/uP/3//X/0f9kAAcAHP8oABEASgA2AOz/SP+x/5MAdACBAEL/BgC5/+T/IABu/woA4/+/AEIAhP+RAMf/Sf9IAPH/KAC9/0QAu/8T/z4AMAC6/8f/UgCr/4sAmgANAH//IQAXAHn/TgCI/0MAlP9ZALcApv8sAPD/1v9Q/xEAsADX/53/HQAJAL//9f8vAMT/MgCV/0kAcwBs/14B3/+M/2EApP9D/9H/SgA4APz/eP/2/1//qQBBALX/jwDt/wwADQAiAMD/DACGAAIA/v5DAB8Acv86AJ7/IwBtADkAdQCu/6X/fADq/1wA3f8cAJP/Lf+9ANn/SwD8/4cA4v9s/2cAQwAIALv/fwDK/ygAjP/f/6f/7/4FAE0AQgDS/2oA4/8qAHf/4P8CAZz/1v/d/9//6f/e/7cAmf9P/7EAKP80APj/JQB8AJb+9AC2/7n/PQCe/yoAhP8sAJMAYP8+ACwAbv+IAYH/OQCWAJ/+QgALAD0Aw/9GAGMAF//L/4cAEQBp/9f/dABAAJz/4v/j/5//mgBOAFX//P89ACAAOP8JALkAsf9lABAAkP/q/3AAlf9v/+IAUwBg/1gAzwAWALT/cQDU/1/+wQAMAoP+c/+nAUj/Lf+B/7IB8v89/5EBhv/D/6L/0ACcAKr+xv9SAO7/AgBbAOf/QwADAFQA+f8CABQAk/+cAP3/Wv8YAH4Aof+d/24A8QAZ/+T/QQAKAIv/4P8eAQn/ggBbAMz/YP87/ygBUP/X/14BbP/X/9AAyv8hAAMAhQBLAK//agAs/0AAhACq/zP/VAD7AB//dv/+ADgAGv9x/5cAGQAL/7kAoACO/9r/BwHLAFr/TwCEAZ7/wf/2APX/wP5GABwBgf5F//IAj/82/6sAxgCO/9P/wgAQAOn/WgGxAP3+LgCdAJT/UP9SAEcAUv4MAHABT/8hABYBugBe/1UAmgBu/40AUgCI/1//WAAKAJj/xP8zANP/u/9FAAoA2f/l/ygACgFBAJD/0AA9ANj/AgDv/wYAgv8PAM//mf5EAKgAOP/8/xcAm/9C/y4AIQBD//z/n/+u//z+PQDU/zz/MwAmAIMA6v/QADQBoQDtAHUB5wC5AFIB9QC9/5H/ov8K/wb+Yf3Z/Vz9VfyH/DX9Hf3d/Lz++v9rAMoCVQQJBdsGHQggCW0IBwhSB64C2v7i+135XPYo9Nn0ovO58m31d/e5+DL81wG6BEAH3wvdDU0P6Q7aEG8QcQnGBccBDv2b9mzz4/I87jXuFPDD8UXzKfaz+yX/vALzBjQKDA1gDeoNiw9rDs8OcQ2RBkgBNv8G+RLy4/Ct8ZTv5u1E8qn1LfXa+W3/PwLnBBkJBw0iDGcNig8WDfMLtgxmCIQCygCt/Nf02PKl81PwRu4f84n1gPSC+Uf+d/8oAhwGRwl5CmYLjg3tDBIMMgwBDKYGIQM/ABj7wPV98oHzBfCj8FPzIPWK9lb5ef6KAFgCBQZMCUAKCAviDH0M/QliCrkMeAewAa4Bxvzg9Vby5fMz8oPwK/Of9ZD3kvk1/UcAowIqBoMIrwl9CiMM2AzWCmIKYAxHCnUArQAt/sb1D/NB8n7zy+9D8TD2UPbi+Ef8PAA7A4UE8QipCnUKVwxUDLIMxQrXCr8LIQIo/2T+Vvfk8+XxafOM8pXwTvVU9yr4ffua/skC4wPUBd0JPAveCrwLvwwXDNoI+AqhB8v/Ef+K+x72i/Ib86fzhPFu8hL2K/e1+db7IwBBA6wEoQcQC+sLKArjDF8MRwq6CigKWAO5/l3+o/m39MHzjfTq8ufyA/XK9mT4MPrZ/ZsANQJQBQ8IAQrRCW4L+QyeCsELpQq9Bw8Dn//N/BX41/VK9DD0QvPh8+/0g/fx+Hj64v5tAJcClQWwBwkK1ApvC8AKqQrNCwUIAQW9A/r/RP1n+LP3L/fT8xH23PS19Zj3CvgN+/L8Cv/TASQEBQaAB/YIRAmdCcAIWwjeCK4G6wQ7AxIBYv58+/z4mPgY98r0mPaw94L3Ivqy+tD8zP4BAGECXgLnBXMGNAZJCNYH2QhbB9cIfAdWA2sDjABO/b76rPhv+C73/PU4+HL4pfk/+sz7+f35/rcA1QJmBfoEtQZgBpIHIwdbBl8HigTlBJ8CFQBA/1X8TvuV+tv4pfmq+bn5l/k9+538E/y0/nn/KQN7Aa8CEgZxA8cFrwQLBWkGdQTdA44DJQP3AIL9q/9I/dz63/ty+tH8Gvka+4L9vPqw/U/+/f4qAVoA+wHLA9IAywODA4gCXgMUA+oDsQG8ATEC0QDp/gsAd//W/q79v/5n/rr86f2H/C3+ZP3p/Q3/hv9T/2AAFgGo/xEBvQGeAaQAwALXAlIBcgAmA8gBpf9FAQkBYwGt/Yf/qv8p/sL9AP1n/83+MP3i/t3/ZP+5/7v+TAH0/+//cgCvADUCiQArAZ8AmwJIAMz/pgIYAev/VwCQ/9n/f/9D/j4AVf+//+r+O/9r/wL/gv89/zwAdf9uALz/if9BAFUAHv8TALQAlv/U/x8A/AHf/8X/aQFuABj/1gAbAcf/6wBoAKz/DP9//8f/wP/+/hIBngAt/6YAyv+Z/xn/gwAaAJX+OwA2AB3/rv9YAF8A0f8RAK0ACwD/AE4AsAA/AML/LAA+/9QA9P9n/4QApADk/yf/aQBPAAj/MwCiALr/HQCrAF0A7//3AJwAFwAJAOv/BAC+/xwA0/9h/8j/BQAh/zH/8f8V/53/8v93/2MAAAD+/zoA+/+FAOP/OQC0ABMA6/+3AOcAyP9wANkAkgBsAI7/JgAMAF//lP/b/9//Of/o/8H/cP9j/3j/dQA2/+3/4wDY/98AFwAuAPcAnf8rAPv/aQDv/8gA9ACp/70A0/8dAM8AjP8zAAsAhP9wAP/+3//G/+f/Nf+g/1oAAv++/xT/3f9v/ycAkACz/wsAMAEPANUAdABPALEAgv+kAC8ApADl/rwA7v+S/xAA8P9oAIr/qP8QACMAxf8zADX/ZQA5/wQBSv+i//kALP8kAPn/NgCt/00A4v96AN3/3ACj/14AgACw/20AJwBBAMP/ywB//9oAEQAZACEAYQBmAPP/TgAtAGoAy/8mAML/TQCP/00Arf8jANH/q/8aAJz/RwCH/w4AGQDp/8X/MwDH/x4Atf/N/xkAvP/s/9z/+//r/+L/6f/8/9H/+P/c//X/AgDw/x8A/f8MADIABwBDABsAPwAyAC0AMQAyACcAIwAsAAoAPADf/zcA6f8SAPP/CQAIAO3/+/8BAAoA0f8fANr/FgDG/xYA6P8HAO3/CAD3/9f/KQDC/xgA3v8BAPL/BQDm//b/1v8HAB0vsBaq+6Cz\"\n        },\n        \"direction\": \"Request\"\n      }\n    }\n  },\n  {\n    \"connection_id\": 0,\n    \"action\": {\n      \"Data\": {\n        \"data\": {\n          \"Base64\": \"AAAguwAAAEPqTPNwEDpjaHVuay1zaWduYXR1cmUGACCh22N2iBT9lQt6csw8TiPiVJqjckBEY47oEz900wMijgU6ZGF0ZQgAAAF7iTpG2AAAIGgAAABYrnw/FQ06bWVzc2FnZS10eXBlBwAFZXZlbnQLOmV2ZW50LXR5cGUHAApBdWRpb0V2ZW50DTpjb250ZW50LXR5cGUHABhhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW3W/87/BgC+//r/xv/i/9L/2f/D/+z/0P/e/+f/w/8IANT/3/8BANv/AQDt/+X/HQDn/wAAEQDi/woA8P/0//X/5f/+/9D/9f/S/+L/5v/S/+P/yP/e/9P/4//M/+//yv/9/9//7f/3//P/7f/8//D/6P8LANz/BgDY//r/8P/w/+n/8//i/+T//P/Y/wUA0v/4/+r/6P/n//X/3//2//T/4v/5/+P/9//q//P/6v/3/+n/9f/m/+j/7//a//X/2//q/93/5//j/+D/7v/W/+b/5f/Y/+T/4f/g/+j/3v/n/+v/3f/3/+X/7//w/+f/9v/w//b/8v/5/+j/+v/q//z/9//y//T/9P/4//T/9f/0//L/5////+L/+f/r/+//7f/v/+r/6//t/+v/5//n/+r/6v/o/+f/6P/o/+b/4P/i/+T/4v/g/9//4f/h/93/3v/e/+L/3//e/+D/4f/j/+f/4//o/+X/6//n/+3/5P/s/+X/6//m/+3/7f/s/+3/7P/q/+3/7f/v//L/8f/1//P/8//y//P/9v/1//f/9v/8//b/+f/x//v/9f/5//j////4//n/+//6//r/9v/8//r//f/4//j/+f/y//v/9//6//r/8//5//f/9v/5//T/+v/1//f/8f/4//P/9f/5//L/+//0//P/8//1//X/+P/2//j/8//4//T/9P/0//D/9v/v/+//7v/v/+7/7f/u/+n/6//u//P/8//4//D/9P/2//f/9f/y//b/7//z//X/8f/3/+//9f/v/+//8f/v//D/8P/w//X/8f/0/+7/8v/x//P/8f/t/+n/7P/q/+3/6f/o/+f/6f/m/+z/6P/r/+v/6v/r/+r/6f/u/+n/7P/m/+f/5//m/+X/5//h/+3/4P/o/+D/5v/j/+X/5f/g/+T/4P/k/+D/5v/j/+P/4v/h/+T/3//m/+P/5P/g/+T/5P/o/+b/6P/n/+z/8P/t/+v/7f/q/+n/6P/o/+f/6f/l/+3/6v/n/+T/4//h/+T/4v/i/+D/4P/i/9v/5f/d/+P/3P/e/9//4P/b/97/2//b/93/1//b/9n/3P/d/+H/3//l/+P/5P/f/+r/4P/i/+X/4//j/93/5f/d/9//3v/c/9//3f/f/+H/2v/b/9v/2v/b/9z/2//e/9v/4f/j/9//3P/g/9z/3v/b/97/2v/c/+L/3f/l/93/4f/c/9//3v/e/9v/3v/b/9z/2f/a/9j/1f/W/9r/2P/W/9v/2f/d/93/4P/f/+X/4f/m/+L/4//d/+T/3v/p/+X/5//p/+7/7f/s/+j/5//p/+T/5//m/+H/5//k/+b/4f/g/+H/5P/k/+H/5f/c/97/1v/Z/9f/0v/V/87/1f/O/9P/0P/U/9b/1//X/9b/1f/W/93/1v/f/9f/1//a/9r/3P/W/9r/2f/b/9n/2P/d/93/4f/a/97/4v/e/9//1v/g/9X/3f/c/93/2f/k/9//2P/W/9T/2v/c/9X/2v/Z/9b/3//Y/93/3f/b/+P/2f/j/97/5v/f/+//5P/s/+T/6v/p/+X/5//n/+z/5v/l/+j/6P/n/+n/6P/m/+H/4f/g/+X/2//e/+D/5v/m/93/1//k/+j/2v/a/87/3v/T/83/7//P/8//1//d/9j/3f/Z/9X/5/+9/9D/1//d/+P/4//c/+j/2//d/+b/7P8LAPL/KwA5AMEAPgFpAtwCswQOBAb9O/46ArkAagAP/w//pP/E/+P/Sv9AALIAvQAgAKwAvAD7/9v/6f/L/6IA+P8n/7r/hf+O/679Qf4FAJIAsQASABD/QP8t//X+g/6p/mH/Wf/P/xkA8v8o/6j/q/9S/9//Wf/L/kX/7P+1ANz/Pv8mADMA4/+B/93/7//f/5j/p/8NAN7/6/+d/2X/rv+r/wQAjAAEAEIADwBE/y7/tP/MAKoANgCf//X/2gDWAM4ABwGuAD8AMADg/33/mACoAPX/x/8lAMQABAGkAW8BzgCBAGsAxwD9AAEAQgA9/7/+3f/WAA8BsAA2AOcArQHgAGUApP+Q/vT+uf9fANsAQgA8/+f+VwCVAC8BRwDC/xEALgDF/yj/tv4O/04ASwB9AML/yv+i/+v/vQCgARsBnACB/xz/9P/3/2L/qf47/kb/AgLIAskBOf8K/ur9NAAOAt8BrQBj/1j/jf9TAKwAMgDT/vT9dv4GAc0CIgLkAPD+Uv1h/hAA0QGqAZz/O/48/sf/JgFUAZYAsP4e/nj/JQJ+A6gBIv/J/Iv91/+aAeMCOwJT/xb+Df82ABkBTwG3/2z+8P2u/rIAjwEsASIAP/8P/4//dP9lADsAwQCvAKv/0f+6/yUAdv9d/jL9uv4lAJoB5QFHAZ3/Bf8mAOb/kQH0/9n8L/xG/jcBdwNlA1IBbv+T/pT+/P/rAEYAMf82/sH9Hv9PATwC3wFm/w7/tP+QAO4AUQFU/wP+ifwd/T4AeQESAocBUQEnAvsB+v9q/rT8ZfzR/o8AGQJYAeP9bf1b/lUCqwTcA7H/APxz+t38sgCdAZIBev/8/lAAUAJGA4oDBwAc/WX8Wf05APoA3wBkAID/df/QADABiAAu/9X8Gv2t/joBrgMKA1EB//7f/GP+ugDZATwBuv+m/nj/wgAkAwEEmQGK/179+fz9/nUCOAJpAQf/ZP1F/Qj/EQBPAVwBvP/V/jf95/7yAMoCAALP/sX7/Pw6AEECWwIHASf+E/4eAB8C9wMNAnz+Ofw5/XEBtAXkBV8BvfvI+dD8bgJ4BQkDm/1V+vb6mf8+BT0GcwHK+034sfrX/wIEvQQ+Af38u/sO/fv/NAMlBGUDGQHY/yX/Pf/BABMBhgE0AlABhwAW/xj+V/4k/4D/4f4D/gP+df5XAOMA4gDF/03+bf1E/o4AEgLZAnkBRADs/uz/iAEoBDwEvwMbAu3/if7D/Uv+Tf8kAD7+Av1G+5L79PwQ/gH+qfwK++X7IP47AZEDewKlAEr+GP4WAGoEdAd+CM0GyQI/Aj8EwgcnChcJaQRo/nv7vvoH/NX8cfyF+gD4a/b69pz5mPvh/FT7wfnT+T/7UP49Ae8CuwNLA0sDnwTjBsUJLwrpCAgITAgtCq4JwQYoA8v/GP1y+3H4Ivej94b3jfjw95j3xvfj+B35QPhx+CL63Pz9/9MBhwM+BaAFRgbSBtgH2ApqCxQM+AwODg8QmwwlCE3/YfiA9PrzDvZl93j4Hvjz9gj2+/a497f4A/gV93H3cfmw/DEAjgJ2BLsFcAdVCekLdgzPCyoKhQquDBERcBMaEEEHzvkh8DbshfA59p/7U/vl95bzxvKP9Qr5v/qS+DP2NvWs+Ij+dASOB5oHpwZ5B0AKGA12DdgMdQxsD94TahbAEa0G3vdS7R3rW/C99zD7lPpq9dHyGPRm93b6DPqA9gb1uPW2+dP+rwGgAtYDRwaqClcPvRCWDmEKxgn8Du0VQRn9FBUIx/eR7abrdPCP9wD6gPgG9Q3zFPY6+QT6/vfq83bzfvZl+6T/SgEvATUCJwXRClEPGhAbDboIaggqDloWDRxQGfYKkvo07j3rWO9J9b34afiu9qb1Lvf/+DX6f/jC9NbyP/Tw+LL9xgCFAYoB0QN3CfEOsRDeDaoHSQbFC4EXrx5kGjMMsvrg7mvs+/Bt9fL2DPWy9B72o/oB/lX8evev8nzxyvTx+uP+x/82/g7+yAGHCNcPPxJIDX0GVgTqCd8Vvx4mHMIPw/8+9FjwqfEc9JD0fPOa89/1H/q6/Tr9j/jF8xnyj/RM+Vb8eP3R/d/+ZAGcBeEJcg0vDgwLVwcUB6IMlBa7HQsZqwut/OLyBPHN8vX06PRa8wXzCveV+2j+Kf2I977zMPMC9oz6kv3N/YH+qf5sAQoG8Qn6DFkMfgktB1IHKAwUFkEcpxhuC6v85vPO8ivzAvPy8VLx0fUO+k/9pv0j+rz2r/Vw9nv4/fk++gP78vymAEUEgQb5BxIKKgvmCo4JEQnVCxEU1BxPGnsOdgCO9tn0c/VE8qLu5uza8JX4dv1Z/tj6GPf39Vb3EPmn+W35hfmu+xb/7wEYBHUFDQfwCb8Lzgs4CswKcw86F9gaShQ5Cc7+D/r/+H31cfC17QDvqPTU+Rr7uPk8+N/3FPkj+qn5ifkL+VL6v/3I/7oBrQL5AwcH0wkqDO4L+gngCYMPMxfHGboS5AfY/wD7j/q/9fDvbe3g78n2lvkF+mT4wfdm+VX6Jvp5+Xv5Ufq5+538F/5q/xoBcAPpBUcI8QnkCq8K2wrUC1UQWhVtFKsPOAkJAyn/TfvD9MDwZvCd8bz14/X59Nf2v/iS+p76ZPni+Uf8g/2I/hb9G/1o/6UA8AIqBKEFSggBCpcKZgkVCbwLkQ4eEDcOTAkEBs8DrQDT/Qf5oPWv9In0IvRR88rzMfQt9qj3xviS+hP8G/0I/mT+O/72/s//MAGjAoID7wTeBWsGIQhtCCsJ/grhDMwO8A51Dk0LHgkVBjkBrf7G+rj3JPVm8pbwRfBK8PfwxfED8/D1w/fu+dz7Wv0l/wIASwHOAgYEVAVMBjoH+QcfCScK9gpdDJoOzhBeEWMPmg28CmkIWgUD/5r7Kfge9fHx+e4A7d7s2+1h7j/wv/L49d74OvsE/Zb/QQFlAtgDHAQaBWwGKQcuCPQIqwmLCnsLLQ2cDz8RKBHwD5QNWAs4CMcDMP9++iP33fLh7obsGOvt6/TsMe6V8Gnzgfai+cf7Uf6nAMoBwgIdA6QDgwQ7BS4GvQcECaQJlgqFC/AMPQ/qD+cQHxBXDtYMcAkkBkgB9ft79yLzBPCA7ZzrG+ul6wXt+u5q8V/0p/dx+ln9tf+fAQQDmwOIBFoFCAauBu8GTAe5CHgJqAqJC7UMFg7AD1AQzA5FDlILggi8BT0AuftP91Tzd/Cq7cPrKuvO64ztTe+e8UD0Zve/+j/9eP97AUIDcAQwBU4F0AXGBhAHxQdECCUJuQkcCgwLIAy4DUEOJA4sDpMMVAq2B24Dp/+U+1j3xvNF8PftqOzD6zbsse2g72/yBfXK9zv72P1RAA8CfwO6BFMFswXaBT0GqAY6B4AHNgjHCCEJGQo4C7EMqQ2jDZUNVgwbCgcIAARzAFD9E/mi9X3yjO+K7v/tb+2A7uvvwfJU9TP3rfqV/E//eAHcAZgDUQSUBLQErQRvBSUGRAZ5BkAHLwgUCakJmArJCwwN4Q1ODdIMuQrwB2QFMgFH/VH6uPYm8wHxiu/j7dLtvu6271DyUPRt9vj54fwK/yEB6gEhAwcEFQMCA8sDwAPNAyAEdASJBXcGcweLBy8JiQqCCwsNVw57DscMIQu1CGIGJAM5/4n6d/jn9J3xGfAS76PvFe7a7lfy8fSJ9ob5evu9/v8A0wDHAK8BjwHTAPAAzgBiAeUBNgM8AxUFwAaFB80IegpmCxEMfA1BDrsPmw9jDGoJFQf+AqT/J/vc9x/1DPN68HfuxO/v78fwE/LR9OX2YvkK/AH+gP+bAGkBIQG2AMn/7v83ANsAfQHPAhcEzAR8Bs4HzggiCjEKcwviCygMrg0iDwwR3g1dCpcIVQWx/k/7Tfnq8u/wJ/Aa7j3uKPCe8KLxyfWq+EH5Wvwc/77+af+E/x/+vP18/Z78zPyQ/br+IQB0ArQERQafB64JrwpPCvULSgwGDKYMig0eDzcRTxAXDZYMbQuwAyr80/qG9afu/ezt7N/qrury7Z/vVfOX9+f50/yv/gYAKQCF/8f+Bv4f/VD8jfwy/EX9oP4MAEICNQQMBlUHBgkQC3AL9ApMC+YKHgu5CwMMkA9BEUAQOA0PC68KcwPB/X/6o/V08abtVOtV6oXrvOx07r7xu/Ut+Qz8nv8NAWEBewE0APX+SP2b/Aj8Dvsr/K/8Kf7oAP4BMgSxBucGAgi5CeAJvQkmCpkK4AnsCRcLVw1zDyoRfw83DQ4PFQorBJcCx/ut9Anzwe0j6A7puun96J7qevAi9AX2LvxSAOb/EgI+BVcCfv8iAf/9nvrS/OX7sfod/Vr+uf8KAn4E/QXkBuwJmgpOCpELbAoYCooKqQk+CqwKOQygDqYP3g2xCxsN+QgyAo0BlfpJ83ny/O3i507ovemh59/rSvAG8q/28vte/nQA4AO7BGkD0QPtAp7/a/+e/n/8fPyG/G38X/0Y/8cAagKQBMsFjQZQCH8ICQk1CsAJXgpkCooKMAyoDIMN1Q9pDiENIw20CFQFlQLg/NP30fTt7zvrOupb6ULopOpt7XDvd/Mn+Pv63v6kAY8CXgRPBEwElQNAASUAJf/l/A/91/w4/Jn9vf7B/mQAmgKpAv4E0QWzBgEJGwlWCsYKDgu8CxoMpgyODRoPoA+ZDgwNLAyvCaYGzgKE/hX6FvUJ8j7uaOvK6TPp7ekI63PubfEi9Ab5ffye/g8CLgQyBCkFlwTGAoYCxgCB/jb+Ff0J/FT8svwC/R7+v/86ANkB5wM8BN4FFQgHCFQJBguICggL+AteC5ILqgzmDCwNlg3VDPIKzQktB7QD8f8L/H33CPRV8JvsluvT6YXpX+qs7Kbu7vG99kn4p/yyAO4A+wOGBTAE+QTCBCMCUAHlAD3+iP1B/tz8MP26/rH+2P8mAkkDsQNIBjQHFAdXCXkJHAnfCkYKuQnkCpwKyArlCwAMGwxiDPoJfwm9BxwDEwEe/eb3jfU/8ovtpewa7B7qiusw7mPuyfKE9sj3fvxU/38AAgNyBAsELwSBBLMC3AF8AVf/DP+9/vX9R/4f//L+DwBXAXkBLwOZBMcEzAXHBgQH6AcdCHsIrAiOCPkITwljCVAK5QozC3cKKgoECqoGNwVXAyP+Uvsm+dnyBPHH76rrHOyX7Drsae5P8UTzgfY2+rL8IP+2AVwD6QP+BNoEswPyA2wCSQEYAaX/Nv9a/xD/7/4HAF8AuQBBAuwCdwP2BGUFygX4BvIGcQdfCNAHPAjoCGoIEgkSCjsKZgqUClUK/giEB3MGuQLe/+j9Ofkd9uvzfPCJ7ubtKe0X7cPu3fAd8v713vi2+ov+rwCZASEExwTiAxkF2gM2AlAC5ABe/5D/Nf9Z/jn/nf9y//gA4AE0Ao4DeASRBM4FSQbjBeUGtwaNBjsHLgcjB80HfwjVCO0IaQmOCYEIYQjfBrYDggKs//z7wPme9trzrvEA8A7vbu5W78TwyPFw9Fz3Tvl+/Pf+eQBlAkADqQPHA08DjwLGAb4A+P+E/8n+4/5S/2T/IAAKAXcBcgKKAxMEtARrBasFnQVlBukFiAVyBpsFvgWZBiwGngacB5EHmQfkB+kHpwZiBZkEHgEP/zX9OPkN92/1zvKE8TvxzfAU8ZfyN/RV9UT4ovox/Lf+ggBkAUcCDwMLA6oCfQL9AfEAmwBJAGn/Yf+v/4j/6f/AAB4BpAGyAj0DjgNpBMYEvgQzBTYF9gQsBUAFCgUnBSIFIwUzBeYEVAUxBUEF1wRYBDcEBQMoAg4BLP+G/Sb8BPqM+Iz3afbA9YX1u/Ux9sX2z/f/+OT5Svtb/Hf9fP5M/x8AYgDuAGwBSAGWAboBcQF8AaEBZgFwAZsBdQGQAcoB5QEKAkACjwKvAtgCGAMaAxYDIAPyArICkAINAtUBpAEcARoBxQCoAI8AbACBAFgASABKABoA+f/o/9H/kv9Z/0T/5P6v/pT+Wv4L/uH9xv2Z/Yf9kf2S/Zz9tv3M/fP9Ef5G/nX+p/7i/hL/S/+U/8X/+v8mAGEAhQC4AN0A9wAXATQBKgE7AUEBMAEiARYBDwEAAecA0ADKALkApACcAJUAfgCOAHQAcwB4AG4AWQBdAEAALwAfAPj/5P/A/5z/fv9i/0P/Nf8i/wj//P7z/uP+4/7k/uP+7P7x/gf/Ev8q/0P/Uv9u/5P/s//Y//r/GAA2AFUAYQB/AJMAmQCnALYAswDFAMIAsAC2AKEAlgCAAGsASAAzABcA7f/S/7z/oP+R/3P/Z/9Z/1L/Sf9Q/0//Tf9p/1//ev+C/5r/ov+2/8j/2v/v/wAABwAXACQAKAAqADIAMAAqAC0AJwAeABsACwAHAPT/7v/m/9b/2v/W/8//0f/c/9v/3v/h/+f/6//v//T//f8EAAgADAAQAAcAFAALAAkACQD6//j/6f/l/9j/0f/G/8T/u/+2/7P/tf+x/73/vf/D/83/1v/n/+n/9/8BAAkADAATABsAIAAfABsAGQAXABQADAANAPv/+v/t/+n/2f/b/9H/1P/Q/9P/0P/b/9f/3f/m/+T/7P/r//r/9P8CAP7/BAACAAMAAAD8//b/9P/w/+r/6//m/+P/3P/a/9v/1v/Y/9H/1//Q/9n/1P/a/9f/4P/f/+f/4//t/+//8//3//P/9//1//z/+v/8//H/+f/v//f/7v/v//P/7v/v/+3/8P/u//L/8f/y//L/8//x/+f/5v/c/+T/2P/W/9j/1//b/9H/0P/R/83/zP/K/83/zf/L/9D/zv/S/8//2f/Y/+L/4P/p/+b/5//p/+3/7v/o/+j/4f/m/9//4P/e/9r/3P/U/9T/1P/S/8//zv/L/8//xv/O/8r/0v/U/8z/2//V/93/3f/b/+H/2v/e/9z/3//i/+P/4v/i/9//4f/a/9z/2//Z/9r/1P/a/9L/2P/V/9j/1f/a/9X/2P/X/9j/2f/X/9X/1//R/9T/zf/W/9P/1//a/9X/2P/T/9z/3P/i/+n/4f/m/9z/6v/j/+j/3//b/+P/4//j/+f/5P/j/+n/6P/p/+7/8f/x/+//8//q//D/7P/u/+z/7//0//f/8v/x//r/9P/8//T/AQD4/wIA+/8BAPb/CwD0/wMACgAbABsAQQBXABUBEgITATn+Ef82AXv/dAA1/+b/mf4i/3QASP+HALP/XQB4/8cAW/8TAI4Afv+7/3L/fgAJ/30Au/+T/x0Ak/+2AI3+twAYAJr/9/8PAIb/w/+cAGn/JgCK/28Amf48Ad3/bQDx/4r/mACN/zEAqP96AHT/LwC7/+b/TgA3/xEAJgAp/+gAqv/4/w0Aq/+p/5//SgDvAOX+zP/LAMb/ZwH+/5oAPADc/xf/YgAHAB4ATP+k/7QAx/4x/4v/jgBp/uD/gf/w/8n/KgC0/+f/eADE/4UAFv+KAB7/EgGN/pcA4f9oAI3/wf+lARv+PQH//loBFf9rAG//dgDL/2wAgQCi/hgB2/74/xf/VAE9/3AAj/6+AVz/hgAPAVsAgAGM/ngBaADPABH+HgHu/toAvwCx/sEAkACB/3r/n/8mATAAIv5m/1wANf9r/5oAbP85AVwAIv+e/w4Cov8U/x7/9gDL/2b/4v4lANAAif3u/yf/SwEq/1L+2gDyAOb+qP44AmYA8/+n////igF2/0v/pP/GADP/Tv7IAJgAqwB4/4EBRQDF/38AW/+jAUYAdwEN/z7/SgDt/xr/WQCGAGf+1AB8/40AxP/O/7L/av9JAPf+mP8IASwAwf8tAD3/fwDk/e38DQA+ADEApv5VARsBsf5+ADQBTAHo/4UAu/9+AGD/cf60/zMB/f+f/pQAtQErAkT/g//AANgAYgF//vz99AEXAWD9s/7M/4MB2ADX/ff/kADFAWX+yv0GAoQBuP37/RABEALe/+38JwBPAsf/zvwsAMECbgEB/jD/TgGkAFf/H//p/xEBUgHm/gX/SQBdAZH/yf59AF8BnP/r/iD/tgAzAZb/t/5f/+wAmQBs/1H/QgEWAbf/zP64/y8AkgAq/1D/JwHAADr/M/72ACsBw/8+/kUAXQHi/0v+0f5HAR0BZgDs/f7+pAHaAKH+YgB5AVv/v/5HANoBzP/b/cH/cQKy/zn9Uf57AdMCPv/A/RIB1QK7/9f9H//vAHMAg/8b/34A8ADm/rn/MQIkAtz+H/76/8L/P/8U/1kA5gFN/2/+tP9CAjUBvf1Q/kkCwQLi/mn9Tf+AAuIA3/4jAGYAKv/h/ikAtgFVABL/2v4xAO0BI/+f/YcAlQLCAMr+D//bAJ0CYQDH/Qn/mADv/3T+lv5GANIB3f+X/e/++wE9AiH/3Pyt/7YC+gDT/ln+tQB7At0ApP58/h8AcQF6AOz+oP/ZACQBuwCa/5D/4QCjAJz/rP9i//v/WQGeALT/wP4R/2cAugA6ADL/vv6l/9QA4AAzALL+Ov5n/9EAPADq/uj+6v9RAdoAk/9E/27/VABFAJn/KAAvAPv/pwCyAEMALwBIABUAWAAyAWwAhP+v/wEASABYAP//QP+//zUA7v9v/yb/Jv8R/9D+Z/6v/i7//P77/h7/gv+3/9z/1//b/0AAEwCh/2j///9yAPgA1QBuANkAkAGUArQCAwJcAV4CBQPqAtIBUAE3AtQCfwKkARgBxwByACr/yP3t/Lr8r/tr+w78WvzD+zX6wPni+jv8d/3l/Yj9YP1F/Y/+TgBBAYoBEgHMAMACaQTzBJsFPwVaBaYGNwgTCXoIEAfYBQkFaATjAxICIABq/pL8GvvA+FP3nvfC+AP53fe89fz0bfZ8+Bb6vfoS+z37Efyb/Ub/0wCUAgUEdQQXBREGYQfUCK8JewpHCwAL/wq3CwsLbAn4BzAGBgTnAen+w/sU+tv3CfbQ9J3zkPOl8/XzWPS+9Lf1XPcm+a36N/zI/a3+OP8oAPkATwLpA/MEPAbIBygJogroC3cMAg0SDQwNqg3PDUENgwtKCKEDQf9b+7j40faQ9B7ylu9/7sruS/BT8o/09fWB90H5aftv/SD/0P/u/woA1QBiAukDFQVkBRYGOgfnCEILjw2LDvQOYQ5iDekM9Az3DEULfAdJAX77cve79NXyEPHu7iXtBO1p7jfxsPRM91T5D/ul/Ir+MgD9ACsBqgAjAFMAKQEUAisDQQSQBbsH5AntC24NVg4ID4EPrhA/EbsQZg5VCYwCFvzN9530PfKQ7wztsOuW61Xtt/Bh9K/3cfo0/DiUWv7q6n1U\"\n        },\n        \"direction\": \"Request\"\n      }\n    }\n  },\n  {\n    \"connection_id\": 0,\n    \"action\": {\n      \"Data\": {\n        \"data\": {\n          \"Base64\": \"AAAguwAAAEPqTPNwEDpjaHVuay1zaWduYXR1cmUGACAAGm4QALxmSZ6USmdPgEsh+d/8saXmOROZyPHEHQ7JHQU6ZGF0ZQgAAAF7iTpG2AAAIGgAAABYrnw/FQ06bWVzc2FnZS10eXBlBwAFZXZlbnQLOmV2ZW50LXR5cGUHAApBdWRpb0V2ZW50DTpjb250ZW50LXR5cGUHABhhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW31/dn/EQHWAdcB3wDd/9X+xv7F/zABxwJeBMsF2wczClgM/Q0KDyQPvw/mEGIR0xDZDbcIRQEy+2r3ZfQj8ovvruwP63brY+0f8RP1sPig+8H9U//sAMIBCwK0AYAAHv8R/qz9Q/6z/3MBlQOiBeQHfQrWDE0O7g6MDmAODw9NEIkQLA/5CigEYv3A9yP0FfK48PLuIe0N7Gfspu6U8ij3dvtZ/uj/vgAcAXQBiwFjAZUAQf/Z/TD9mf1X/6UBNAS7BkIJpQtWDYYOxw7LDjQPOhD1EGAQrA1zCJMBofpn9RnyivCZ747uM+3Y7J/ta/Dt9D75GP1Y/zsArgABAUgBVwG9AET/kv1b/Aj8M/1B/6sBPQSGBrcItgprDOQNEA/bD38QehFDEmIRmA40CcoBw/om9ZvxQfDV79jumu2p7DPt+O+Y9Nf5J/5gALoAUgDg/ycAvgCsAKn/BP4t/I/7J/wo/ggB0gN2Br8IrAqlDFMOdA9gEMsQehFTEkQSHRBUCzQEuvws9inx4e4o7vvtze1B7WLtBu9q8gr3uftO/0EBhQH3ADoA6f/J/1T/ov5z/Xr8bfx7/aX/ygLhBb4ICQuRDL0NOQ5RDr8Ocg+YEKcRbhGuDskIDwEX+SHz3O8P73HviO/t7u7tue2H7zPz+vfl/HgAMAIgAgsBtP8m/wH/4v6B/qn92fzD/N39TgBuA88GwgmxC+IMkA20DesNUw7WDggQ2RA0EGQNQQggAfz5QvS88NfvBPAU8ILvk+4y7qrv6/KJ9yL8iv8oAQoBEQBR/yX/d//I/27/wP78/ar9bf6BACYDWQY0CSgLRAygDIwMugx5DUgOvQ9lENQPHw7rCVYEBv629zrzwvDK7+fv5u9k7xzveu9d8cj05/jt/J//0gBqAIj/xf61/jX/sv/n/4b///7h/tb/vwF/BJQHGwrTC58MmQxFDI4MPg10DocPjQ9bDk4LZwaIAOr6e/bi877yJ/KU8brwsO9w74fwD/Oy9j76x/wT/kv+9f31/Zf+uf//AHcBXQG5APn/4v+1AE0CdwTEBokIwgknChEKBgp4CgkL/AvoDDMNbQxmCiwH8wKc/uX6TfjT9h72LfUJ9KDyYvEL8QryXfRt9/v5svuT/Mz8Cv2N/XH+ef9qAPYAEQEUAVcBwQGCAkMDNgRVBXcGjgd9CCAJXglrCXAJtAkECk8KagquCdcH2wRgAdr9RPun+Qj58viL+In3+vWS9Cn05vSr9vD4yvrv+zP8EPw5/N38B/5O/0UAswDUAOoASAEGAgUD9gOJBKsEiwR1BKcE/gRyBcAFrQVABZgE3wNPA+gCmAI0AqAB5wAUAGH/y/5S/uv9av3f/FT84/ut+9T7KvyU/PD8Lv0q/Tf9YP2v/SL+f/7W/vb+I/9B/5r/+f+DAPQAQQFhAYUBuAESAnwCxgLeAsYCgwI1Au0BtAGvAdsB6QG+AVABrgAmANj/0f/b/+f/tP9u/yX/7v7i/vr+F/8c/xj/E/8T/zn/YP9r/1//NP8U/wz/JP9f/67/1v/o/97/0f/R/+v//P8UABgAGQATAAgACwAhADkAWgBnAE4ANAAdABUAIgAxADgAEwDq/63/d/9h/2r/f/+t/7z/wf+6/6L/o/+i/8n/9f8jADMAQQA2ADMAHAAEAOz/3P/Y/9L/0v/L/8z/x//F/7n/w//S//j/DQAoACsALAAvACUAIQAaABQACQADAOn/3f/L/8f/xP/T/+f/4P/k/9j/2//c//P/BQAgAC4AKAAcABIACwAHAPf/6//i/97/2v/Z/83/zv/F/8r/zf/X/97/5P/3////CAAJAAsACQAJAAcA///7//T/9f/2//T/8f/w/+//9P/2//f//f8CAAMACwAGAAsAAgACAPz/9//r/+b/4f/j/93/3f/d/+b/8f/2/wMA//8OABEAFQASABoAFQAUAAsABQAIAAQAAgD9/////v/+//b/8f/n/+3/4f/n/+P/3f/b/9v/0//f/+f/9v/l/+j/7f8FAAgADQAcACcALwAYABgAFgAgABYAAQD4/wIAAgD1/+n/6f/3//n/7//h/+3/9P/t/+z/8P/j/9//3//l/9z/4f/i/+n/1f/U/+L/7v/y/+7/6v/z//L/8//z//b/9P/0//b//P/4//n/8f/u//n/8f/k//z/AQDo/+3/+v/0/+//BQAEAPb/6P/j/+z/9//4//z/DAAEAPr/8f/r/9j/AQDw/+X/5P/0/+b/7P/9/+3/5f8AABIADgD2//v/CgAeAC0A/P8bAAUANwDz/zQAPQCMAFUAXwGyAm0FkwTI+fr3ZQMuCM77OveTAMsCw/9t/H79KAPYA0H9dPxvAg4FBwC5+8X+3AHSAEr8d//TARwBGf+Q/rgAGQLWAaP9PP5vAgUCwv27/sMBQAPq/tv94v9tAmkAvf1B/scAcwIz/5r+iP9NAgIA5f54/8UAXgCI/u7+bP/n/zr/mf7xAKUBMP43/2YCKAFh/vL/7gHaAL39n//BAUb/e/4g/zABSQEE/gj+DwBbAov/NP6dAJ0ATQBkAE0AH/5/AdsAY/00ABEC+/0x/4EBUP4E/+kAn/8Q/8cCHgA9/hACnQHk/Xf/8gHT/mf+1QCd//r9hgEVADb9AwFyATL/BQCOAjsBHP/PALQBeP8kAFYBG/+T/tf/6gDq/lj/nf9r/9MAOADI/7oAqADMAbAAJ/84AVgBuv+o/kIB9f+2/FT+hQLP/4D9iwAlAZ3/QABEAqv/xv8dASsA0/65ANL/sP6VAEoAGAGL/yUAYgBr/7QA/AACAEL/dQF9/9f+UwD+/4n/mv+d/yf/mQDk/nD/4wBj/xz/0AB3ACn/1gCRAJD+HAFV/3L+MgGY/7UAjf9N/wcAjf7/AGcAM/5/ASAAeP81AR8ACgAvAYQBHwCuAcMAe/7qAJMAff7U/3z/tP5DAL4AUP9WAMcATAAHALAA0QDN/+cAWP/P/g7/QP5B/7v+Lv8PADEAqf5nABcDiv4hACgCdAApAKEBKQAl/w0Chf94/ysBRAAG/1EAdwCe/+D/AgB0AM7/KgBfAK7/GwBQAHv/pv9LACUAzv/Z/5IARP9U/i0BiP/R/vMAAQBd/wkBVQEZ/xEBUQJw/+gAGgJFAGUAOgHoAAEAMgAUABr/6v/W/z7+aP8Z/6r9tv6f/jz+Ef9n/2/+9P72/2j+KP/n/8r+8v76/zL/gP+YAGD/SACoAJAA3gCiAQICPALlAtgCMQPlA3kDGwPmA7oCnwKsA4QBTgA1ApX/Ef9yAE/94vzA/Rj8F/vS+8n6evpq+oz6HPr7+dj6yvrq+rL7Hf1y/e79Sf9SAEoAowGPAtkCWwT8BPYFegaVB0IILAh0CoMKuwmTCw0L/gjiCV4IIQUhBE8AX/41/HH4JPjG9bDzLfRh8yzyE/Ra9If03PY19/X3hPmM+m/71fzH/b/+5/94AX8BdgKpA/8DiAXXBkEHaQhpCQMJognyCX8KPAsuDEENwQ1LC88L5gsLB6MHjQTa/hD+Afrp9Br1d/Jl79rw3O9t78nxSvI182b2pfft+JX6XfuY/AP9D/65/pn+HgC0AO0AcwLzAhAEPQWmBnIHWQjGCYAJOgq2CvEKbQt1C7IMvQxvDaUOgg1BDA4KWQdSBf0A/Py4+hn2AfMC8V7tT+187TPthO8i8f3ydPXE97b5avvH/Cr+j/4T/4z/gv+T/+T/LABPAF8BBgIjA1kEVAVPBokHCQgqCDoJMQmOCSQKswpcC/ALYA1rDcIM0gwKC1wJwwd+A/EAKP2e+Hj2DvMN8fLvY+9Z7xzwQfF18nL0rvYh+Nn5P/sa+1r8z/zJ/M39TP6S/mP///9UAFgBlwJOAyIEFwVLBSEGJQc/B1EIIQhuCOIIogieCS8KGgs7DHwNBg5/DecLIQpuBywE5wFD/gn7Lfhr9H3yKfDt7lTvce9z8MPxIPOu9JH2R/j8+Wr7rPyE/fT9sf7f/kz/TgBgAAkBpwFuAVQCegJ4AnkDgAMyBBAFTgWLBkwH9wfkCKEJ+wkgC6QLtgx3DnsOkg7pDVELygj/BSMCif+k/BX5UPa482LxTvAB8EXwSvFB8sXzxvTp9eP3Mfms+hT8fPwe/Z/9zv2D/uP+l/89AG0AdwGfAeUB8wKrAikD9QOpA38EDAU9BYYGCweNB6cIpQiMCYkKMwtlDG4Nsw0qDREMNQqaB7UEVgJI/7r8Qfop9zf1SPOX8Yvx/vA58W7ylfK68zP1CfbI9zb5Afqo+1T8N/1C/ov+g/8ZAF0ALwF2AcMBYAJzAt8CiAOlAzgE1QQwBeAFoAZoBw4I4ghmCa0JtQp0C0wMLg16DV0NPwy/CsMILwaHA9QA6/0G+2H4rvVd89XxufBD8ITwBvGz8cnyDvRV9QL3m/j9+S/7R/xV/Q7+rP5a/9v/NgCyAAQBMwF2AccB9AFVAr4CSgPeA3kEKgW7BZkGmAc4CPAIvglHChELyAt9DCEN8w2ODSkMswpaCOEFhgP8AE/+a/uV+OL1YPME8iLxl/DM8PrwZPFi8onzHfXU9kb4vfnA+rP78PyY/Zv+kP/t/58A6AAMAZMBAwJaAtUCCwNHA4ADtAMwBLcEWgVABtsGTQcOCHUIIAkQCuUK1wvFDLgNyQ1WDX0MZQo3CM4FrgIhAEv9HvqV9+L0tvJ68Uzwte/G7+Hv2vDy8Rzz0vRG9t33d/m0+uP7QP1T/mL/XQDxAHoB6AEsAoUCzgIWA08DTgNoA4MDrwMmBMMEYAUsBugGhwc5COEIpAlhCugKqAtoDAENXQ3gDKkLyglGB7sE7gEO/078Pflh9gX0/vF98LHvOu8y77nvmfDj8bfzjfVo9wL5e/rw+yv9Zv50/zEA5gBMAXEBnQHSARQCZgKjAs8CBQM8A5UDLwTUBIQFXgYiB/EHkwgkCboJQQrQCmoLyAtBDJcMXQy/C6oKvAhmBvcDPwF//rj7D/l89iz0QvLS8NXvju/f71LwVfGd8ubzh/Ut97v4WfqY+/L8Av6t/oX/+/8yALMA/ABTAdQBAgI7AlwCfQLyAncDEgTlBI4FHgbkBogHSwgxCcIJaQrwCisLrgsLDBwMUAwmDEILEQouCNkFeAPAAPj9S/uR+ED2IPQ08vXwCvCv7xPwuPCf8cHyAvSU9Uj3+/i/+i78Yv1Z/iP/nf8gAHUAxQAVAUwBhwGzAdYBQgKlAi0D7wO2BHEFIAbNBl8H5Ad8CAEJYwmxCccJ1gkICioKSQpqCkcK1AkACccHPgZGBA8Ct/8c/ZX6QfgR9mP0BPP18WrxTvGf8Vbyf/Pf9DT2f/ey+PP5D/sX/PT8vf1W/q3+Gf9d/3z/3f9LAKcAVwHiAWUCDQN+AyUE/QSoBYIGMwd2B9cHMwhbCIYIZggqCAgI2wfGB8QHwgeFBy0HugbgBcsEtQNQAvgAff+n/e77V/rX+JT3dfar9R71zPTt9E/1r/V69kv3SfhF+Rj6/vrO+4P8Nv2z/Sj+pv74/ln/5v9UAMgAXAH7AYUCOwPaA28E/ARVBZgF5AUGBioGSwZsBnYGfQZOBhYGCAblBdsFtQWMBUAFzQRUBMIDEANMAl4BcgCm/8b+4v3s/Av8SPuP+gH6i/k++ST5Afnt+Aj5WPm5+TX6mPoQ+2/79vt7/Aj9hv3t/Tv+mP4c/4n/HwCOAAcBjQESApQC+AJYA5cDxQPoAyAERwSKBLAE4wS2BK8EhQRdBFYEJgToA7cDRgPCAl4CvAFlAREBqQBYAP7/vf9t/xP/ov4q/tj9nf1l/T79Bv3Y/KD8hfxd/Gz8kvyq/L78ufzO/PL8Gv2C/QH+nP4A/zX/af9+/5z/6/8fAGcAjgCnAJsAeABgAFsAZACHALcAzADkAOgA3QDqAAABFQExAT8BUAFkAXEBfwF7AYgBjAGaAaEBnAGXAX8BQwEVAeAAsQCOAFgAIgDd/53/cv83/xT/4/7I/q3+Yf40/v393/3U/d796/0T/jr+Y/6J/q/+5v4V/03/iv/A/+X/CQAaADEAQgBZAGoAjwCwAMMA0ADLAL4AvAC6AK4AqQCjAJIAkACLAIMAeAB7AIQAdABqAF8ASwBDADgAKwAfAAsA8f/G/6T/kv+H/43/hf+S/5f/qf+5/9D/4v/0/wcACwAiAB8AGQAYABYADwALAAYABAAGAPv/+P/h/9j/wv+w/5z/kP+B/3z/eP9r/3r/hP+F/5n/pf+t/7r/0f/k/+7/+/8RAB8AKAAwADsARgBHAEwAQgBHAEQANwA1ADAAMgAoACYAIAAgACQAIAAfABYAEQAKAPz/9P/p/+T/2P/S/83/z//D/8H/uf+5/7X/qf+m/6H/pf+0/8D/0//g/+X/9/8AAAwAFQAUABcAFwAYABoAGgAbABkAGgAcAB8AFwAPAAQA+P/y/+j/6f/g/9z/2P/c/8//1P/O/9f/1v/V/83/zv/O/9L/0P/Z/9n/3//p//H//f8EAAMA+//4//L/8P/r/+L/5f/g/+H/1//P/8z/w//K/8P/x//H/8D/v/+7/7j/vv++/8L/y//X/9r/5f/4//T/BgAGAAwAFAAXACIAGgAWABgACAAAAAUA9P/t/+v/3f/Z/7r/y/++/8T/zf/G/8T/zP/L/9X/4f/s//r//v8EAAQAEgAQABEA///n//X/7//t//3/8//u/93/w//R////7f8MAPn/MQDy/yQAHAAoABUAUgALADcAAwA/AHIA/wCVAecDuAN6/av+9v6R/L394gHr/+b9Sf88ACD+u/7uAYf/ngCMAOMBJf8U/1cBcf/YAJkAMf82AJr+4/6yAEH+TwBaAJf+zv9EAGL/wQCE/yABhf9TAAQB2v6jAfT+6/+o/w0CBf/w/+H/XQFKAAH/DgFM/5AARP+IAar+eAEjALr/vwFZ/7///wBO/+L/DwCbAHUA3v+oAJEAHwA7APv/yP+tAEv+egHw/vYAwgAW/yMBaQA4ACUAVgEO/y0AzQDt/4/+ogAuAJT+LwFl/18ARwD6/3wAOAAyAC0AZv/U/5MADgCH/w//8gCF/+n/BgC//zH/FgELADj/QP9hARoALP6aAUUA3P+AAPMAqv+eAOH/mwBWACoAfP/7/2IAyv5z/9j/1/8tAPv/EP/n/08Ayv+t/3EArwDz/hkA3AA9/8f/7QAvAID+RwFgAKv++gBmAcn+tgBoAFr/Jf8aAOAAn/49ADABdv8B/4MB8//Q/zYAfgBXAMT/if8+AEAAOP9dALYAyP58/7QANP84/8T/mAAqAEX/vAD//w3/sQBcAL//e/8XAVcAPv8BADYBpf+5//P/FAASAAb+zAClAA/+NQBvAcb+IP/lAGkBNP5/AFkC2P37/5UBWf5i/3cBn/8u/n4A7QCW/uz/IwHk/hwAtAF1/2AAXwGI/7r+fQGP/3/+BwHq/wL/bgBGADn/ov9qACn/Jv8AAtP+hf/+AXL/Uv9SAAAB1P4p/wYCtP4z/rcCc/9X/sgBHQDl/jQAVgFL/6r+pAEbADn+xQCnAAH/GgA+ACoAcP/9/2MAa/9gACoAs/+8/28AFwCG/yAAvACA/zf/jwAA//X+UADr/4L/PABAAMj/ev9/ADgAJP/RAEAAo/8uAIn/pv8rALz/DgBjALT/pACJ/y8A2QBO/y4B0QBQ/9gArgFq//L/GQHZ/wH/+wCnAJf+ugDIAID+4f/BAN7+IP9wAOH/HP66/x8AU/6d/zQAtf42//f/+/91/6D/KAAmAGIAOgBzAMwAQwDe/zkBmgDn/1QBFQGTAB0CBwGIAQgCPAF3AkgBJwHQAZkB1QCHAJYAGgB2/1v/ff7z/Tn+KP2M/Hr83/u4+6n7bfok+0r7EfuP+638JP2l/WT/1P5IAIQBtQFTA88DowTUBTMGVQbCBxwIKwcrCcUI4QfJCAoI8QYPBrkErwJ4Aej+B/38++/5jPiR+Jf2VfXs9hL1G/Wo9i32BfeR+Bz5bvlI+yr8MPzR/c7+Pv9aAKsBBgKIAr4D/gNABOMEkQVnBTAGuAbqBkwHmQdlCEAIxgg7CXgJkAnmCccJmAjyB4EG0wQYA0gA9v3K+/n4FfdS9UrzmvJE8vfxj/JQ8yn1RvYE+H36Ffzv/fD+LwC2AAEBdAHiAKQADAGmAPn/iwBNAOP/ywCUAF8BNQK1AvoDCgU3BuoGKAizCEkJ5goJCw8LJwwQDMQLzQoqCqIIbgbRBPoBSf/e/GX6UvdL9aDzLvIT8e/wX/GC8THzd/QD9hr44fmV+z39pf7O/2cAOQF1AUEBZQF0AL8APwC+/wYAmP/0/2IAjQCJAf8BmwLrA5oEZAWCBk4HCQgxCcAJZAr7CjoMwwswDFIM5gr/Cb8IIAYmA4QBzv3H+ob43fUu8+bx8PCl7zPwFPG78V/zyvV691b5zftZ/Xn+SgDUAOEAuAGWAcgA2QB9AGb/n/+S/+r+p/8IADcA7gDPAYICUANWBEkF0wUAB+MHJAhpCYMJTwrmCpcK8AvCC/gKKgvlCYUHwAbkBJ0Acf/l/CL4S/cV9bXxpfFc8QvwxPCd8tnyOfRa92f47PkS/db98/4FAU8BSgHfAewBKwEsAbcAIADE/+P/ov+J/zcAkwDDAM8BvAJFA5wEwQUeBicHBQhiCAIJbwmyCa8JnQq7CjkKtQoZCl0IjAfaBdgCRwGj/qP7kflB98f0XfNB8h/xVvGb8dTx/fPf9N/1A/nw+Vb7//2d/o//MwFFAWIBAQLvAT8BZwEhAVkAsQCaAA4AigDYAK4AnAE8AosCoANkBMkE1wVlBs4GfQc3CHAIGwmpCY4J9QpBCowKFgrtB7YHSgWVAsUA+/3t+vb4pvZt9CTzFfK18VPxF/I28/jz7vV+9xH58vqT/Kf9V//n/3sAeAE4ATMBkQE8AbIAEAHjAHEAAQE/Af0AvAFhAkUC7AIGBM4DjARxBXIFPQb/BhEHlAdPCJsIJglvCZ0J7wnLCUQIDQhVBv4DvQLE/0j92vrD+G/2ZPR685by2fFM8ujyX/PY9IP25/eo+YD7z/wq/oL/JQDmAFMBVQGOAXgBHwEPAc4AmwCDAJoAngAHAW0BjAFiArACawPNA2YEAAVkBeYFkQbgBmIHFwhfCOYIJwmdCcIJPQlSCWIIhwaSBTUD+ABu/j38Dvpr98P1RfTQ8hDycPIK8sHyNfQZ9Xv2yPgZ+k77nv1n/if/uwDAAN4AugFLAfEATwHgAGAApQBlADQA6QD7AC0BEgJ1AuMCuwNeBLEEhwVABqIGRgfuB0QIxgjpCFYJaAlyCTMJVgi4B1oGjwTNAsYASv5c/F76Jfi59pb17PNe85DzL/O08+D0pvXY9r34zfn++uf83v2g/uP/ZACqADoBKwElASkBDwH4AMIA7gC5APUAKgFHAeEBMQLBAm4DIgS/BFIF4QVbBt8GTQfNB9sHAQhTCPUHEQj2B0QHqgaTBWYEywI5AZn/g/3P+/j5hfj09gj2T/XI9PP0C/XE9YD2k/fm+Lf5P/t9/AL9gf7n/mX/JwBkAC8AogC+AD8A0QC4AJUA7gAbAQYBhgH0AQcCjgItA2QD+AOyBKAEWQWzBcsFVAa3Bs0GCgeBB1sHnAdcB/AGawZ8BW4EGwP0AP7/4P3e++z6qPj297H2IPaQ9ar16fUD9j731vfk+DX6Lfsj/GH9FP7T/pH/4P9HAF8AbACDAHsAZgBXAI8AeAC+AO0APgGdAeABZgKtAiUDiQPuAygEiQTYBDgFPQWxBQYGUQakBt0GVgf0BiIHmQbbBS8F0gN4AvYAbf+G/Sz8gPog+TT4J/em9kv2ZPaL9h/31Pep+LX5lfqO+3z8XP32/cb+Bv94/8j/yv8OADAAZQBJAMkAugABAYYBrgH/AWsCuwILAzUDwAMIBEgEjQTTBCgFVwXkBdEFZQaCBssG9gbuBvQGKQYQBpsEnwNZAp4ALf9i/eH7OPpB+ev3S/fQ9oH2eva99iz3pPfG+Fb5b/pW+1X8H/3q/b/+G//n/z4AdgDLAAYB+wAKARgBFwEfAWMBawGEAQ4CFQJ/AtQCDwOfA8wDUgRUBK0EAwX2BGgFgAWjBfMFuwXgBdUFVQUkBXIEVwOJAiMB0P99/vr8s/uD+pj5svhL+Oz3xvfo9yn4gPgC+cH5Ufr++tf7bvwu/e/9Yf4f/3H/AwAlAK0AugD7AA8BQgFRAVABzwGNARwCSAK6AhIDoAP3A0kEBQXmBH4FkAWxBc4F+gXiBb8F6wVCBfIErgTVA+UCUgLqABIAMf+i/Yn8p/uK+ov5Lfl2+FD4Vfhm+H34F/l++Q/6xfpu+0/88Py0/XP+Lf9u/zUALACTAMQAyADlAP8AHAElAXABfgHjARMCiwLmAkkDuAMwBFcE0wQaBSAFhAVvBYsFsQWgBYcFhAUtBfEEfwTaAyYDYQJIAV4AZP8e/gP9VfwT+2D64fkK+c34o/iH+JT4Kvly+fb5wfo2+/P7wPxa/Rv+yP4i/6X/CQAgAJQAkgCaAMcABAH5AEEBtAGeAWgCiwL7AnoDAgQYBMAEDAU0Ba4F1QUWBu8FTgbtBcoFogUlBboEDgRnA2wCvAGrAFT/jP4K/Tb8KvtD+or5mPhq+Nn3+PcF+JH4JfnY+af6Nfss/Mv8lv0b/t/+Hf+m/woAIQCTAIYA8ADhADQBFQFdAYgBwQEJAjgCyQIWA10D5gNGBHYE3wQ5BUsFmgUPBt4FJQbLBRgGdgVFBbUE8gN0A0ACtQFNAGT/Gv40/bn7Cfvg+Tn5sfgg+PD3wfcx+A345/gl+RH6zPpj+2j8B/21/UH+wf4g/5r/IwAjAKEA4wDwAEoBbAGyAe0BQgKkAhkDeQPfA1QEiATVBEoFSAV+BeMFhQW4Bd4FYgWGBWcFEgVrBGEEdAP5AicC8gB4AO/+Nf7e/Nj7yfoF+o7v7RS6j4RI\"\n        },\n        \"direction\": \"Request\"\n      }\n    }\n  },\n  {\n    \"connection_id\": 0,\n    \"action\": {\n      \"Data\": {\n        \"data\": {\n          \"Base64\": \"AAAguwAAAEPqTPNwEDpjaHVuay1zaWduYXR1cmUGACCQR/qlsRyHcsQtCPirk/geouchP5Ncrm2ltFpy4/ZedAU6ZGF0ZQgAAAF7iTpG2AAAIGgAAABYrnw/FQ06bWVzc2FnZS10eXBlBwAFZXZlbnQLOmV2ZW50LXR5cGUHAApBdWRpb0V2ZW50DTpjb250ZW50LXR5cGUHABhhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0v+ZL4ffjt9yP4Rfhe+Cb5cPkC+vH6gvsg/O38jv3w/an+Fv+C//n/kgC3AEEBmQG8AQ4CXgKHAsMCDAMDA4QDhAP6AyMETASFBNEECwUNBVcFhAWDBakFcAVgBSEFzgReBCsEiQP6AdIBFgBH/9f9wvzF+yX6dvqN+JX4bfiT92v44ve4+OD4l/lM+rv64Pvn+xj9g/38/b7+Iv/G/yYAdADuAB0BTgGxAe8B4gFvAvMCfQKRA4ADyQNZBFsEyQS5BHYFhwV2BRoG7gXWBXIGowX1Be4FEwUUBWAE1gPJAsMBVgFk/2X+mf1o+xr70Pmk+E74d/fT9732x/fb99L3bPl0+SX6afth/Ej87f1U/lH+gP/c/4f/TwDDAA8A/AAJAdQAqQHwARYCgAJGAz4DewOrBCIEzwRuBQMFngXNBacFKAYHBvcFDgauBZEFMAXMBA4E2wM2AiYCsABT/8/+lPwz/NP6w/nG+In4k/dv9873evcB+Jf4yvmZ+R77y/tw/In9Cv6Z/gz/DQB7/0gAbwAzAKMAyAChAP4AWAGBAZEBPwK3AmcCiANKA0AESgRnBDkFpgTLBWoF4gX0BbQFVQYLBg8G6gWbBRQFWASrA7MCDAGGALH+VP1v/Iz6u/mP+Oz39fb99s/2r/Z69+P3RviA+S76wvr4+6f8UP3e/bb+rf6R/6n/0v9oAFoAsQDRADsBcwHVATwCsgImA6sD2AOABM0ExARVBecF0AUuBkkGdwZPBnIGeQYbBkkG9QUKBvoEJgXwA90CKAJdADT/0v1U/J36uPkJ+Cb3mvag9cH17/XW9cT2gvc4+HL5Qfp7+2r8M/1u/ov+df9vAL3/AwH1AI0AgQGZAU0B2QGpAuIB2wJhAwsDxQOlBBYEBQXIBXgFRwY8BuoGswZ9BwkHdgdvB8sGWwfVBYcGWAXEA8kDKgHV/6v+N/zQ+jX54/c/9mX1AfUB9FL04fTI9O71APgU+Kz5I/wI/Nn9av8w/yQA/wAQAc0ALgHnAO4ADQHJACwBVwEsATYCLAJXAv4DtwNdBJwFYAUGBtAG2QYLB8AH7wd+By8I+QctB5UHhwfxBR4G0gR/AtwBMAD1/A385PoD97D2u/WE82Dz2vO288HzxvUt9k73v/mo+iP8t/0e/9b/cwA6AVMBSwFNAV0B8gCQAGwAaQAKAFYAuABOAJUBKgL3AYwD8QPoAyoF+gXRBegGiQeIB0QIDQgsCJgIHAgJCIwIGwdDB1cGEQSrA1IB6/8W/q76nPkU+G/1TvTA8+vy8fJm83XzvvQa9rv3L/lz+or8yf3G/hMAjQDZACUBEAEQAbUAfQA6ADoADAApAKoAdAAyAUQCcQIUA1oE3ASDBVMG1QafBzgIdgjrCEsJGwmCCVQKxgkSCXYJHwhTBkAFMAPGAHD+6/yk+Tb3Xfbf8yDyWfJf8dvwDPOd8/Hzpvao+Pf4u/vn/Xf9f/9FAQEAxwAJAoQAiwA/AXcAwP85AFEACgBUABUBawEHAu4CVQNrBDIF6wW1BgAHVAiECFEIyAmaCVcJPwoMCjYJKAqtCXcH3gZZBUYClQCh/0v7u/lY+QT1zvPM87Xx/vCL8tLy0PKO9U/3FPha+l78Sf2Q/iwAEQCNAJkBfwBOAPsACwCZ/93/hv/4/s3/+P8rABYBhgFxAnEDJQSsBOgFeAbLBsEHZgh2CN8I7wmdCYcJ6wmZCX4JyQjzB3wG1gSfA+MBFP8m/cz77fjB9uf1xvMT8i/zHfJ08bz0yvSm9Hr48/m3+V78uf5V/nb/IwErAGkADQGKAAoAnP/J/4j/Df+8/3EAQAA9AboCjgLAA4wFfQW9BpEH3gdACIsIGAnnCGYJQgkxCXAJownqCHIIvgd6Bm0FEwO6AQ8A//zY+g/5nvat9HHzT/IG8gfydPLe86z0+/Xs93T5//ow/F79Fv8c/0b/UQDc/wAA7/9W/7H/5f/4/pr/lwDT/7sASQLtAd4CUQSIBGsFTgasBo8HaAj0B+UIcgltCWoJ4AmMCu0J+wkTCm4IXQe/BjoEOwJwAFz9XfrJ+Ar2lPMJ87Lx7/At8XDxKvNI9An1kvgt+oD6AP4z/1H+/QCPAWr/CAERAfH++/8JALv+dv/h/3b/2QBXAckBbgMzBBAF9wWWBq4HNAi+B/4IVwmUCBAJIwqPCVwJEwpWCmUJUghmCC0GzAOtAsYA5Pwa+5z5MvYS9FrzZfL58CLxRPKo8jX04fVc9xT6oPpR/Lz+nP7i/s0AdwC+/1kAFQB6/3L/kv9G/97/5P9OAPMA2gGjAikD7wM2BR8GnAUZBwsILQf5B5oIjQiwCBQJZglPCTAJNgl8CBwH4wboBaICggCL/wj86/jH9xz13PJ+8sbxUvAI8Q/zJPN69AD31vgy+uL7qP28/ov/MQDlAMwAewCeAIAAQgBjAPn/GgC5ALQABwH1AXkCAQMVBM0EqAWvBloHEAg4CVMJgQluCpUK5gorC+sKZgpWCbQHkgY2BVMCiP/8/R77cPi/9sz0sPOy8uvx1vFr8s/y6fPK9f72lPhs+pH7Sv2F/sb+rf9OAPn//P+jADoA4/9TAHgArACpABMB5QFgAgEDrwNPBEsFBAaJBpUHDgg4CPsIQAmHCUkKRgt4C1oKgwqcCpUIkwY+BZkC3P8m/fz5lvfD9bDzA/Jh8QjxQvF18VjyQvTD9Tr3WPkS+3z8Cf4Y/8z/OADGABABwADOAMEAoQC/AKQAaQDCAH0BjwEjAioD6wMDBX0FVAajBy0INQgsCbEJvgkeCqsKXwsXC6QKwgrSCRYIbwY4BPEBd/8o/Hn5gvf89GfyDvGL8FjwZ/Dt8JXySPSQ9dP3Hfoy+4X8Tv45/5j/JQBWAK8AagDZ/zIAEgCn/zgAkgCHAJQBEgJ7AuUDugR3Bc8GdgcqCIAJ3gnGCaoKywpdCg0LIQuCChoK9wgACBkH1wM0ATIAoP1z+p73VvUF9EnyF/Dh7+TwDvF78RbzBvVa9zP5afpW/Fv+WP+8/zcA5AA0AcoAKgAjAG4AOADt/z0A5wBvAcoBIQJPA7UEsQVqBiMHJwj9CHsJ6wlRCrwK9QrKCvYKVAuzCjMJWQh5B3MFyAIuAOX92/vn+H/1sPPZ8qzxTfD279nwQvI180X0ffYD+dX6K/yX/R3/KwBpAGMArwD2AIcAzf+W/63/5v8eAEkAzwCqAVACMQNvBLQFqAaNB2QIGgnHCewJNQqpCtsK4Qq6CqIKigodCdAGowU4BMMBBf99/I/6vfi69WXzjPLm8e7wEPHf8Q3z6fQ/9r/32/nH+y/9Zf7+/s7/XQAXACAAWAALAOf/1f+o/0QAywAOAcABuAKiA8EEmQV0BmYHNwiLCLcIIgk+CXAJqAm6CZIJwwmGCcAIiQcMBgoFSwOCANj9nPu0+Wr3wvTN8hfyrPG88NjwGfID9Ar2jfcz+VH7t/0c/8b/egA4AQkCygHIAJsAFgHGAOv/hf87AGUBlQGIAbQCZwR+BYoF9gV3B2oIaQhcCLAIQwmMCSoJwQjiCNEI9AebBu0EmQN7AiAAVP1e+3v5ufcH9kn0afM38/7yG/P48wP1ovZ1+Or5X/vZ/E/+i/8gADgAcwD7AMIAYQD9/8f/FgBhAJkAtACZAbICfwMUBJoEhAWMBlQHlgdJB1gH7gdJCPwHygdrB64GhwYIBlsFRwT/AgECnwCV/sf8fvsb+vb4tPd39vX19/U+9nD2WPbf9kb4jvld+uv68fuW/U/+Vv6V/pz/VgA5ACMAbgBrAdMB2QH5AcECAATqBLoEVwQ5BTcGVwYhBm0GcwZVBkoGQAZcBjIG7AX9BH8EmQTVAxACigCw/3X+2vx7+zb6QvnC+D349fft9yv4NPhl+LT5wvrG+kL7bPw8/dL93v3X/ZL+YP97/57/QQDWAE4BDgI6AkcCxgIDA0kDSQSWBDgEwQR+BZsFLgV7BFcFRwb0BcUEKASSBfkEcwNMA3oDSQOiAbX/Zf8VAHD//Pz9+jb7+vsd+/r4ovjH+W76Avoa+XX5kfoD+6D7xvsG/DL83Pzl/Zz+A/+a/vP+UgAOAUgBDwK+AhoDRwMLBGgEkAS/BAUFXgX9Bd4FDgUOBacFJgZcBSwEWQOkA9sDFANHAZ4AswATAOH+Dv0T/Q39l/zD+3T6q/r2+s36Kfr9+KH54Pob+3b6kvpU/Dv9mv11/cz9l/5Y/zEAj/9y/4gA7ABeAXMBOAI+AqICkAOgAngDGgT9A/EDSQTTBOgEGQRnAwEE6QTeA8MCdgJXAvgCSwGlAHMAAQCu/rL9bf7K/Wr9xPz7+2H8av1R/I774fsX/Y79Pfwo/Uv+wv6H/Xb9lv/g/0H/0/74/twAJQFx/oj9zgCLAYv/5f/nAOYBBgL4AOcBKwMYA7QCbQG3AhwEZAPwAacCFAOJAhoBfgH1AoUBjv8h/mwAfwAD/0j+sP4E/y3/5P6f/Qn+Xf8I/7X9AP6h/oj+s/03/ln+nP4M/vH9Wv5w/s//YP9D/1X/JgDa/9X/vQCsAAYB2gCTAFUBDwGW/wEB+gHQAe0AqQDvAIgBjAJrALv/JAHHAXz/fv6YAQMCBQAt/9z+bwDZAfIAZ//N/s4AQQCl/hP/XgDTAGb/j/0A/n7/HAEUANT9/f1G/wMAtv41/6r/QwAg/z3/Ov9XABIB4QA3AEv/b/+j/sYAygHy/2X+PwCyAGICawC9/q0AvABxAK3/iQCT/4UAIQG9/yQAEAArAZgAMgGe/hP+zQGSAQcAFP2+/vUAwQGT/1b/tv87APT/3v/C/1EAdgDz/U//HgHOADD+hv4bAAQBfQEr/17++QBG/zkBcgEvAOz/Xv+p/mz+1gBOA74Ahf5wAB3/AQHlAF0CowC//0v+pP6pADcBmwB1/oX+1/+YAbf/u/9GAX4AfAC4ACX+tv8nAGABh/+o/ij/zP4n/00BMAGP/+EAq/1g/rsBpQJWAXD/uv7w/hwAMwEa/0wA0f+w//j/tgDeAI3/TQBWAGcAAQDR/y3/pv86/wACKgA5/zf+v/8nAtH/kAAoAdoA9f3m/xMAnwH1ART+nv7k/0YA1/9cADkA0QCe/57+yv8XAUoBqv66AP3/ZQBKAI3+kwFaADwA8f9h/3j/Qv+xAWP///5JAeH/UwAq/2AAIgBjAKcAU/5T/zwBOgAP//7/Z/8eAbUA3gA6/0r/NwFa/xQAAgEkAAr/af9/AKT/tP9nAZ//E/9qAI7/NgB5AGsAnwAi/vT/RABMAEMAPABCAKb+WwBkAX7/vP+qAB8AYQBS/hwB1//4/24ARP+L/3EABQHj/yAA2v8LAKn+DAGXADUAIgCQAFT/lf76AIEAT/95AGH/1P4NAKwAuQAw/+n/W/+9AIb/pQDZ/8n+6gCm/xgBg/+t/yAAOwCz/8n/Tv9O/lkBDgDF/xL/bQCTAar/2v8GADIBi/8B/68AFAAqABj/yf8bAdD/XwF4/2P+p/9eAREBe/9L/yD/ZgC0AGkAOf/A/xMAUgALAIQACQERAKj+Nf/tAGgAPQB9/7f/4P9L/6b/tABBAez/8P7M/0cANACfAC4A7v+V/x4BVQA//pAA4QBi/yQAWgD2/x7/NwAxABP/rQB//9v/HABqAEgABQAwANf/owA0/0EAYQDr/+IASf7t/loBPAEuAC//+/8bAIcATf8a/wgBSAAoADP/Uf9lAd3/Sv8JAMEAigDz/jb/MAEpATv/if+Z/+H/qAAlAF0A5f8AAP7/XP9yAFcBJQDm/o3+k/+wAaYBGgB2/jz/9f9jAAwA1f9ZAJYAF/+V/4sAGAG2Acn+3/5AADgB7v9F/8X+3/9sAWoAhP6o/wEBcQB4/4X/6wHH/+L/lP/L/rsAGgGv/yT/cP+PAO3/q/5JAc8A3P8d/5f/GQAVAQkBLv+6/7v/jQDW/0D/mAGOAUP/Pf78/vIBzgALAXX/lv31/zMALgC9/zYBcP+K/u3/TwBB/xYB5wDa/gwATP8fAEQAtABBAAL/6P9nAPn/1//ZANT/rv6VAFMATQBaAHgAN/+d/qQAngCoAIb//v6L/zUAggBx/7n/sv9yAKABHwCA/3oAaQAKAKj++P8iAVAAdP8Q/BgBAwPx/jD/WfwJAJgDtAIX/4/8yf/9AHsBw/8eAMX/pQDA/0P/vACnAD4Bsf4s/yb/4P+RAEMASQDu/4j/Rv+Q/y0BtAJD/xEACwF4/87/dv8XADn/kP/zAI//6P4iANYAYP/+/gkBzwAAADUADP+x/2EAFADCAFz/3f4EAF0Acv97/7EA2P/A/1EACwBO/x0A2ABPAFD/0P4NAJMAxgAVABX/j/9gAJAAQAD0/1z/if/AAAcBEAF/AGsAOQFdAU4BiQGuAToB0gDEAGIBIAFeAAwAmP9K/0n/7f51/lD9+vtz+6P7/Pu4+7H7y/ul+zH89vy1/WL+i/73/jkACwKXA+4EywVWBvYGlQfXCBwK0wvqDHoMuAvmCmMJkAenBYsBr/sY92P1rfSu8snwz+858NfxqPMZ9ez1/vc6+mb7mvyx/YP+DP8AALAA3AD6AZUDMAXXBikI+AmGCzkMwwxCDVgOfREmFsEXTRQMDloISANC/hD6GvW170Tsd+yt7ZLuzvA88+n0zfcF+5P8Dv17/V39/fvs+qv6x/p8++n8b/6I/1ABVAMEBQMG+gZ1CMMJbAo1CtMJAgrQC40OFhKgFXoYHhZCDTgFIwDI/Dz5vfOB7pHrMezf7pfwufG686/2R/lI+xb9If0S/Cr7qvqj+kD7nPxk/cn9vf5oAAQCXAN6BB8FswXCBqgHngeOB8MIrAr2C6cMNA7LEfIVthcPFFoMYARi/x38bPdT8l7uAu247TzvZ/DR8Sj0K/dp+WP7Qv1d/ev7FPua+/j7vftS+2f70Pw+/4IBPAIzAkED0wTOBRoGJQZDBjMH9wgXChoK9wm4CjkNUhGpFT8XuxIuCWcCKQHi/oj4lvIo7z/uPO9B8MbvF/Dw8uP1hPfD+If6uPtu++T6yvo1+xz8ofy3/KL9y/+MAf4B4QEQAtMCzQNpBOoE+wWbB2UJTQqGCgIL4QtwDb4PvhIxFQYUOw72BuMB/f5A/J73jPKz72zvVfA68OTvBfGw8432PvgF+c755vqY+437JPs3+8j7wPuH+0j8X/03/g//v/9zAGkBmwIYBLEFKgeVCPsJbgshDOwLKwwnDVYORhA4E74UWBI6Da0IJgUvAvv+QvrQ9QLz1PHI8LHuh+1b7k3wcfIL9Bv1Ufae99H40Pl2+uf6//ph+078Rf3w/cf+mv8hAKQAiAGcAjcEDwZDBy4ILwk6CjgLTQwMDfcNtA6wDzoRORLwEVAPsAuxCIUFFwLB/qf7xPjt9Uzz6/AY74vuwu4x763vUfCe8UPzmfTd9Ur39vh3+nX77fua/Lv9Bf/q/60AuAGmAtED+gSoBXEGjgfHCAgK5wqxC6AMng32DjsQYRFvEtESOxLDEGMOLwufB+MDKQB0/K745fRU8Yburey762DrqOtm7Hzt1u6R8HnyePRB9hn43PlV+5v8q/2f/rD/9QAuAhQDxgPOBNsFGwcmCOoI2wkaCz8MFw2yDaMOrg/IEPERsxLFEtkRHxCMDXUK9wYrAyL/MPtG94rzE/BB7VXrH+q36S/qHesv7LPt2+8n8mn0wPbv+Of6i/z9/VP/aABqAUUCFAPrA+8E6QXUBp8Hpwj6CTsLUAyPDYoOXg8rEPMQSRL9EsQS6RFNEBQOUwunB+kD6v+2+633d/Oo7+jsBOvd6U/pb+mV6j3sGe438IXy/PSP99n51fty/cH+7//tAIwBAAKVAlsDPQTqBIAFRQZJB2wIrAnCCtYLAw0JDuwOBBAlEUMSxhJ+ElYReQ8KDfgJjAbUAtr+x/rJ9tfya+/e7FLrgeor6l7qS+vL7KbuvvDU8iz1svfd+Z37Dv1I/pT/nwB1ASsCwwKOA5QEhwVqBlkHVAiTCcwK0QvrDMANqg61D6IQjhEtEhcSphEsEBMOyAt2CNEEGgEU/Vj5ZvWl8cfumexL653qauro6hXstO2P74zx0vMh9lz4Vfr0+1H9k/6K/2sAGwHIAYQCMQMGBN0E4QUDBzMIWAmHCq0LwgzrDdYObA9CECwR3xE5EsURYhCIDjAMNgmOBX8Bn/3H+ej1RfIV78Lsfuvi6s/qHusI7J/tbu9y8YvzwPX599b5ZPuX/LD9yv6a/zcA3ACHAW4CVQP4A/oEGAZEB50IvQn2CvsLBw0ODr4OcA8rELQQaRGoEf0QBxA0DuYL/whFBYgBwv3N+Tn2nPKe75btGex863Xr8esP7XnuE/Ds8eHz+/UK+Mj5Jvti/Ir9eP4p/7f/VgDrAJwBOgIJA/sD+gQeBkkHlQjlCSMLHgwIDckNZA7PDioPyw8BENYPRg8gDskMrwrkB/IErAE5/uj6o/ev9EjyNfDt7iPu5u1C7tjuz+8W8ajyU/QI9on32/gg+i37GfzP/HX9P/4p//P/rQBkAUgCVANcBHAFjQabB6sIpAljCvEKbwvSCxAMMQwxDC0MFwzSC18LngqXCV0IpgbNBMsCWgDZ/Vr79/jn9gf1afNQ8pHxVPF18avxUPJB81H0sfXx9j34gfmH+oT7VvwK/df9jv5J/zcA7wC4AYcCVgMwBOsEpAVoBhgHtQc0CHIIrAjqCBsJOAlCCUcJNgkWCecIiggHCDYHIQbTBEwDowHn/xv+VPyh+hH53vcB9xH2dvUs9SH1QfV+9f71wvaI91/4RPlO+j37KvwG/db9mv5b/wgAtwB6AUEC6gKJAwoEhQTiBBMFLwVZBYsFqwW3BcYFygXaBcoFvAWcBYEFYQUxBfYEuwR/BDYEzAMsA1QCWAE4AAv/0v2w/Kz7w/oB+nz5BvnG+I34kfiz+Nf4JfmA+dD5Sfr3+rb7iPxB/RT+8f6y/2EAPgH1AZwC8AJVA5UD1gPiA74DmgPYA4QENAX4BWcGegdrB6IF1AQSB28ICQgnBTgCjwIyAmwBxv52/f39tvwx/Kv6Lfjf+BX4D/jT9xr2SPgm+137BfhQ+DL94v7k+2f8f/6pAGkB6f32/awAHwIeAfIA2wCyBJEFiAL7AwwFmQfYB14G6wgoC9MLmwuKBsEGTglbB5UD0/+6/gL+1/wf+o74Evn6+Sf5DvmV+Lz6M/yy+m758Pgu/Gj8uPmS+cT6tv3c/bT7wfy0/g8Bgv/h/NP+DQFmAX8B5AAdAyIG8AQJBEEFQAfLCRMKFwsAD1gSVBJ5DWIJageTBScC1vsC98j2GPf79JbyW/KP9L/34fh9+K35t/sS/tP+Jvzl+sv7f/s5+tr4c/iM+t38P/36/Uv/lgA0AY4AQwDfAf4CWAL+ApMEeQV+B90HSwiFCr4OdBTHF18YZBTPDsoM+QmaAlz5F/OG8rryp+6b6r7u0PQi92j3mvcr/C8BHwBy/HP7xvzD/CT5rPXj9vr5yfqn+Tn6Q/4DATYAEf8HAEUBmwCQ/8v/hAK7BAkF/AUxCOcL1g2TDkoS6xf8HUId7ROgDCoKsgdb//b06u6N7/rxtu4T6x3tZ/Sn+Tf6Kfor/YUA/v+c/b76DPqq+tj4M/b29ZT4Nvpj+tf6Pfws/3wAp/+G/yYB1gEzAUoAkAHxAx8FcgYICOsJXgysDUARJxanGhQflhgbD/wKRAg5A+v6APHo69buuu/u7InrnO+19Zv6xPtH+9796/+I/wT9kfr5+Tz6K/lG92P3Lvn5+sr7nvtW/Mz/9QEuAZ8ASAH/ARgBMgB6AC4CrQSnBnsIiQklC6QNcxETFg0b7R3IGN8QzwvQB68CrPzk9I3uK+5W7t/s8utV7rDxdfUe+Q37ef0lABwBvP+j/aP8+Pto+tr4svcj+KX5v/o1+7T89v7BAEsBagG8AaEBxAGtAWABDgJUA5EE9Qa9CLAJ/gqWDbERDhbaGUcb9RVBDaoIGAZ8Aun8N/bo8DDv9e5A7Unske5S8qr1Aviz+vb9AwD0AKsAfv+C/qf9t/t1+fX4tvm3+uf7kfyc/XD/HAGNAc4BDgJHAp0CjwItAj0CqQPSBHwG8AekCKwJoguID4YTpxYUF8cT4g3LCEwGzgND/w/6KfUr8fXvy+547UXu7PC38x72dvge+r37qv3j/g//Wv8B/8P9Bf27/AD8yPua/Oj8XP1Y/mj/8wAAAtYBWAGrAUQC2AKKA3kEBwX0BY8HYwjdCGcJ6QpADcQQRxVTFbUQPguCB9wEDwKR/on5xvQQ8mjw7e6c7mnvxPDG8mP13vfB+cf7xfw5/U7+0/4f/pr9hP0e/aP8tvxu/Sv+xP53/wEAwwDYAW0CTwLBAc4BcQIqAysEeQUqBhwH+gc9CGoIFQkeC9ENMhCJEZsRJw51Cf4FdgNQAcL+SPsM9+nzzvG/8MPwgvFz8tnzXPUZ9xf5gvoh/DL9b/1y/ZH9/v0m/i/+4P2l/TD+3P40/4D/RgBaAbgB4AExAlkCeQKDAkMC/QIWBKwEVwXpBRsGcwaxB9sItApKDUoObg5fDugLHQhPBZoC+v+y/Uf7V/hx9Ynz6/GB8SzyJfNo9J31V/cQ+Yv64/uI/O78kP15/vz+If8Z/8T+WP59/hP/xP9+AOEA6wDPAFEBbAIEAxEDMgMnA3oDLQQzBeIF1QXhBawF2AVsBuAHyQkOC/kLhgs/Cm8IbgVDAzEBKP82/XH7+Pn+9wv23/RP9LD0ofVB9m33rfh1+Q/6p/oU+0n7IPwZ/cD9cf7i/hj/P/+D/zkA0ABtAeAB1gHbAe8BUAKgAvAC6gIBA20DEATOBBkFIQWQBegF9wV6BtoGCAgSCYsJdwmBCXUHFwTSAisBEf9X/cD77Plt+GD3ifZO9mP25vZG97f3tfiT+Y76c/sX/J386/wm/bb9g/4k/3j/7v8tAF4ApwDhAJDcZ/1UOCqs\"\n        },\n        \"direction\": \"Request\"\n      }\n    }\n  },\n  {\n    \"connection_id\": 0,\n    \"action\": {\n      \"Data\": {\n        \"data\": {\n          \"Base64\": \"AAAguwAAAEPqTPNwEDpjaHVuay1zaWduYXR1cmUGACAqzTaxkqQdzpmfzXcFSz28986NtuN85zJWBfH0zYbgQQU6ZGF0ZQgAAAF7iTpG2AAAIGgAAABYrnw/FQ06bWVzc2FnZS10eXBlBwAFZXZlbnQLOmV2ZW50LXR5cGUHAApBdWRpb0V2ZW50DTpjb250ZW50LXR5cGUHABhhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW3zAAkBowHrAbwBoQHYAYYC5gIgA30D9wOPBMEE/ASABewFRgbGBm8HogfOB9QHUgcVB/gFLgQ4AlcAPf+w/ez7Pvrv+B74nPdQ9/X2+/Zz9wH4nPha+Ub6J/vr+3D8uvyi/V/+vP4L/1//mf+p/zYAkQB8ABYBYwEyAXoBvQHZATcC4QJSA9sDKQQuBFcEzARtBfMFTQa/BhcHMQd3B3wHdQcFB3sFFwQrA9YBWAAe/6L9AfyP+kn5iPgk+Pn35vev99n3IfhZ+DT5Mvod+7/7Gvxs/MH8pP1J/qb+AP99/9v/3f9IANEAJwF9AZABpgHTASQCcwKtAv4CpgM3BKEEzQQgBYgFEQZ0BpAGhwZqBoIGogazBi8GXwV/BAADkQFUAPD+iv1n/G37LfoS+VD45ff19z34Q/iY+DL5nvks+qf6XPst/PX8PP2J/Rv+l/4B/1P/tP/b/9D/+P9jAOEASQFgAZUBCQJEAnECogISA5gDFwRbBLQE+QQ/BakFDAZuBrIG/AYBB0oGxQX1BLQD4gISAs8AMv/l/dP83PsK+1H6x/mP+Rj5//hr+Yn5u/k0+tD6XPv4+6X8bf3x/Qv+Mf6A/qv+2P4x/2b/af8y/1j/lf8PAN8ASAFRAX0BlQGPAfgBdwL7AqED+QMGBCYEwwQ5BWgFtgX2BYgG0AbVBuoGtAXeA5sCkwGUAL//+P4L/pz8Vvsl+gf5n/gb+dP5QPqU+gj7gfva+w38fPxx/dT9tv2m/Y/9pP35/R/+N/5k/mb+hf6z/gL/lf+JADEBcAGXAc8BPgIOAw4EzARjBVcFKgW+BKUEhASsBOcECwWLBW4FIgXbBLcErASyBAEEAANsAiABWP9n/tD9yfxo+wz6K/nB+Kf4f/hq+Hv4FvgG+LD49fkQ+9f7zvxT/WH9ef07/kv/5v8bAAYAHwBmANcAeQEBAoAC1QICA24DvwPhAzMEBQTKA3AELAUHBnMG6Qb9BoYG2wY9Bz4Iuwg1CAkHEAZyBHECLACR/c/7AfpP+Pf2jvaG9Wb0fvOT89f0xvai+Bb6S/vK+3/8o/3u/ln/mv+9/3P/Kv9a/9L/LQA1ADgAdgD/AAUC4wI/A00DogO3A4cEkAXNBtMHKAhhCI4IFQmhCSsKYwr6CpcLGgwUCpQFnwFX/kr7BPlV+LT3Nvbn8rfvC+818X/0TPeS+PX4O/nm+ar7fP3d/rD+mv3//Lv8Y/2T/nL/l/8b/z3/DwC2ASgDigOBAyoDMwMDBDIFoAZgCCkJcQmaCWIJMwn6CeoLzg1UD3APQg0yCVQEY//m+0v6Rvg19Q7yBO8k7Yjtj/Df89f1Nvef+Nz6lf11/9X/fP4//BX7xvtI/U/+CP7m/Av8pPzM/nABNAOZA0ID+gIzA1oEbwWEBpcHZAgECaIJrArlC5gMjQ2zD4sSNhVaFCYOLAU8/dv4bffn9U7yie3N6RTprevn8BD2E/ie+Fn6f/1rAGYBKwCI/RP78PkR+hn7oPtA+536p/rD/Oz/BwKzAqwCAwODA28E5QXeBrkH7wjhCgUMNAzrDJEOvRAaEyoXbRotFmUKZf4m97D0X/MK8ZbsQuj+6NPuVvWw+KH5G/rW+/P+eAEeAd79PvpF92r2HPcm+HX5sPrr+zH+ygFPBNAEtgNbAj4CLwPxAwAEtgOABOgH8wvkDQwOpg0lDkkQaxQHGmYcexR7BLP4vvWz9H7wxOpn5wbomO1I9e35+Ptb/Yr+VwD3AS8Bm/20+Dj0RfKD87T1Ovjp+mn9QgAoAz4FAgYTBaEC3gGRAggC5gGMAjQEwAe7C7YNKQ0rDbwOVBGfFu0ckB2eEhQBz/UM9NXztO9e6vPoRO3S9An7DP0V/Qf+mP4F/hb9L/tB+Of1UvVF9cf2E/rs/Mz+6v8KAjYE1wOZASj/Iv7r/i0AGAFHAsUEKQjhCsYMMQ1VDDEMmw15EkoZMR9uGxAJFvrf9XLzKfB27JjrFO/V9O35vvo1+yX+lf77/KD70vqp+Y/2DfX29S337vl+/Wz/GwBJAfkBGwE2AIj/m/6J/sX/egLVBOMFbgcTCg8Nvg3vC90J8ApZEa4aQCCsGNUH4/ov9dzxju4C7I7rsvG7+WT8aPwg/LD7qPrC+Fb2xfVs91T60PuR+4z8Av03/pb/b/9X/0b/Rf+K/sv+0v/jAGgCVgS7BiwJGAs9C7kKLQs5CgkLjxHVFkgcqhoZCIn4i/J/8Mvwiu837xD0JP6EAfP7YPis9ln2J/jO97T1nvfV+qP6xfpW/NH8X/2+/t3+eP8zAK3/HACZAOQAAgKmAzAFFQcBCYQKaQ09DhAMygunEUMaDR+wF+0CpPSf8ZvxmPG38LTzNPppAbr/Gfe79Ab1gPRF87Pyk/bf+4j9R/ub+Qj60vu//TT/9v+WAI8BLgA5/9//GwFYBO4GlwjJCcsKAQvCCEQH9wkSE80eriGrE4gAAvSp7zPyi/JH8sr3x/8zAsj+M/hQ9Cj1SfXM80f07ff2+pH8Dvtx+c37P/40/wUACQGUACr/Zv7//iABgwSEBw8JHQvyC/IJWAbFBrkL7BKMGVUbGhGlAOj1RPD88aH04vQ79xj7Uv4t/oD5kPU99ef0pfS59fb42vyr/LD5n/d3+Jr8CQFjA9gCOAJHAAj+9f2kADAG8wvBDxwPGQwrCcII4gsgElYYUBrTDjD9L/TJ75bwQfL28w75Ef9LAJf6o/V59TX3yvab9Tj2dvn4/Ir7cPgw+Af6Cv7f/2IAvAEEAtMBswH0AQUEUwj1C6ANxguWCnEMMxE7GCcbZhTgB4r6gvFs8e7wafNx+ED80gAX/pL4S/Q685P2tvaC9f72mvhL+0/8p/p2+t/7xv5MAroCEAKDAigCugL/AxUHPQpdC+UKEQrKC8sQABaDF60SmQZK/cz3c/Tp8h3zbvbB+rb9oftI+N327/as9RvzefJF9VT5mfsY+9v5EPus/Sr/jwBKA2gFmwbqBMED5gWpCY0M0gpXCU4KVw3jE8cVixDjCCkAjfv59vvyBfNr9dD5Kvxo+hf3EPeD99H2n/W58yf1vfgI+jX6evqQ/OP/oAB4AeUCmAThBh4HSgYlB6YJ1QpZCAUHFwnQDkQWOBRRDEAFqP8M/Kn2uPKn9DP5sfzq+n31rfRX97D5+/fV8/D0oPke+zX5M/ca+mn/qgFSAXsAXANeB1UIfQf0BlcJzwpUCbQHsggdDVUSZhG2CvwEb/8r/Hz4HvXH9qH5KfzV+Xj1p/U1+KP48fXB87P1x/mY+4b6afmJ+/L+vgDPAFIBZANUBlIIvQewBxYJQAqhCfMIKQpDDXoPhw2NCaUDpv++/KP52fjZ9+b4V/la+Hj38vUu9rH2Ovcn93f21PdH+pH7v/sh/B/+wQDLASEDcgWNB6gIMQjSB8QIIQk4CIAIRwtEDlwOBwqsA1r/EP67/Fv5SfiU+DH5QfmM9qf1tfcC+Tn5yvcf+Ab6Afo3+jr5a/tx/+QBeAPPAzUGDQjpB0EHPQY7BqcH5QjwCSQKjgsdCycHjQM5AEv+zPwF/Lr67fnf+G/3XPe192z41vix+YT53fjr+AD6H/tb+0v8pv6JADUDtQQQBaQFyQU1BzYGJAdWB0cHgwj5CMcJAQgPBpADIAGX/+L9yfwF+w/6w/kQ+ev5+/il+E/57Pnn+nn6Lfp8+g38cP2T/WH+dQHNAroCvAIsA38FGAW5BQEGrwUkCBIGRwVABOAExwWtAkUBgwDg/yL/ev0s/HD89/sy/Ob6cfpc+4P7afv4+uL6Bv2t/YL9i/0I/qMA5v++/0gBYgL2AyYDnQNlBGcEOwVHBDoEowNuBDkDQgOyAVEBRgHc/rT+2/yN/qj+Nv0//bP9K/7d/P35CPwS/M38Q/0s/CH/Ov8vAQsAAf8yAQgCbwLXAVwBzgHFAfABlAI9AR8CGQJlAv0CTwFzATMAgwAtAB7/QQBR/zv/Pf9b/8v/f/0L/p79OP2//RT+6/4F/5L/9QDa/2j/r/+t/7MBuP+vALb/IgFsAJf/bwC8AcQBBQE8AX8BxwHW/0YAI/8+AYQASQDW/lMAHgECAFb/Iv+sAJ3/OP+//qn+Zf+c/4b/GQCu/84ASwBwAPv/rf+RAPEAav9f/9j/fABKAMb+8QADAKQAmgABAKAANv8PAAoAnP8sAEr/Sf92AK3/pQDZ/iIAawBoAGkAwv7e/ygAcgE4/4n/Xf+WAMP/Sv89ABQA6gAjABEAegDYAHsAif+T/xsBCQBK/6z+YwCOACIAj/85ACQBTgDZ/yH/OgCx/1T/CACAAO//D//v/mcAyP8sAL//+/9hAAYAKQAM/xkABgAjAQ4AfAAVADwAqgCI/8r/TP8sAGYA3/8HALH/wf9AAHr/AAC9/ygA7v8P/7z/j//C/7v/tP/g/67/+v9DAEkAOgBUABEAQwAMAPb/2P/0/0QA8//E/w8AkQDAABwAuv8PAGQAEwAy/2D/u/+0//7+Lf8GAH8APQDP/x0ARAAwAL3/3P8BAAIApv/U/wwAKwDa/7f/3P8PAEcAMgBPACQANwDY/6L/lP/3/20ACwCg/2P/yf/2/4X/P/+8/0IASQCh/+z/JgBSAN//Y//a/z4AgAAUALj/mf+Y/4H/qf+v/wQAUABqABwAtP8KAEkAOQDh/7n/FwAoAOP/kv9+/6r/5P+w/+D/GgBBABkArf+t/6r/0/8NAOz/2P/j/zEAAwCj/83/OABHANT/sv81AIAAsf+R/7v/CQD9/+P/zf90AEIAuv9k/w4AcgDG//X/gv8yAPH/rP+6//7/+f/I/xEABADV//j/HADM//b/xf/S/yAAGwDQ/8T/zv8GAPb/1v8uACgA8/+2/w0AeQAEACAA9v8TAMn/lv/3/xcAEQASAOL//v86AP7/8//O/9H//f+R/+7/BgAOAD4A/v8rALP/DwAnANv/1P///6L/LwCH/y8A5v/F/6EAaP8hAKv/SwDe/xcAKgDu/8v/XgCC/1wAyf85ABMArf+DAH7/wQAu/9cAWv+uAKP/0/9QAGf/xwBn/10AcP/+////7f83AAIAvv8rAJf/AQAJAMb/SQC3/9z/HgDH/0EAzv87APH/0/8vAHj/YwD5/0QA1v/S/+3/UgDk/9T/BgAWAD4Akf8cAAMABADw/7//JQATAO3/+f/O/0sA///u/+f/+f/6/8n/8v/g//v/7v8NAM7/6/8fAMD/+P/3/yQA+P+7/1cAs/8fAPn/AAABALP/TQC2//n//f/u/+T/AgD+//v/4P/k/wwA6/////P/DQDz//v/CADg/9r/CADM/wgA4v/X/yUAsP86ALH/FQD5/7v/LwCn/yYAzf/5/97/9P8DAN7/5v8DAPP/+P/m//b/AADQ/xsA0P/w/+j/9P/l/97/+f/q/+D//f/u/+7/4f8IAOb/+f/w/+D/FADS//z/z//7/+L/7f/r//T/BADf//H/9v/t//3/3f/w//3/2//7/+X/5P/5/+P/8f/s/+7/7v/o//n/6f/2/+X/9f/m//H/7P/r/+n/+v/1//X/+v/t/wYA8//9//3/8P/9//b/7v/9/+//9v/3/+z/9v/v//P/6P/v/+n/+P/o//T/7//0//b/8f/x/+7/9//o//L/9v/t/+z/5P/l//P/2f/0/97/7f/e/+T/4//l/9//3P/u/9n/5P/h/+T/5v/d/+X/5f/f/+T/2P/n/+P/5f/l/+X/6v/k/+n/4v/p/+b/5f/m/+T/3P/i/9//3f/g/+D/3f/f/9r/3P/a/9r/3P/g/9T/4v/a/+D/3f/c/93/2v/l/93/4P/k/+L/5//l/+X/5//j/+v/5v/m/+T/5//i/+b/3P/k/9v/3f/e/9n/4P/Z/+D/2f/e/9z/3v/a/+P/2v/k/9v/4v/f/+L/4v/i/+T/4//n/+L/5f/h/+P/3//a/9v/2f/e/9v/3P/e/+D/3//k/9z/4f/h/9//5P/f/+f/5v/o/+L/3//f/9v/4f/X/+L/4P/i/+X/4P/e/+T/3v/W/8//0v/V/9X/1v/Q/9T/1f/O/9b/2P/W/9f/2f/c/9//2//d/+P/5//j/9//5v/f/+H/5f/o/+r/5//r/9//7f/v/+//7v/z//j/8//8//r/AgD+//f/AgD4/wYA9P8MAAUALABEAIUArQDVARwC7f9N/sj+pP47/7z/Xf+H//f+Xv+b/zcAKgBLABQAOQACAJj/ggCLAOIAQgAZ/04AYQBe/8gAigD2/zsAwP/RAJr/m/9cALD/2wDy/roA6wCFACr/QAC0AHD/wP96/1kBB/87ABkAyv9gANb/y//x/3H/VwDi/+H/HwCp/0kA0P/V/5j/NAC4/xAAdP93AEoAv/93ABsAiP/S/6T/kf+v/7z/MAB9/zIAZwADAPz/MwCSAPwAJgCtANwAOwACALv/PQDU/zr/cf/d/xT/R/96/+//xP+F/1cAXgBHAGf/fP/5/27/U/9O/93/3v+h/6L/7P8mAOT/5////wIA6//Z/wQA8f/4/3IACgBDAHkAYQBMAAkAiQBOAGYAOAAuAFkABgD7/+3/PwAyAAYA1/8rAD8Auf/Z/xIAGwDU/8n/+v8DAIX/jf/D/7v/u/+l/97/+//p/9T/CAD6/xQA+P8IAB4A3f/w/+v/JADd/9D/FAAYAAAA6P8nABEA9P/i/wUAFADw//7/AgACAAAA/v/4//v/6//t/+r/2f/X/9T/wv/Q/9f/t//o/83/6f/l/8T/9P/T/9r/x//T/+P/z//I/8n/8//s/+P/6/8JAPT/8/8QAAEAAAAXAPv/CAD//+n/+f/Q/+b/4f/j/+X/2f/8////8f8OAAcAHgATAAsAHwAJAAkA+P/5//z/4f/v/+L/4P/y/+n/7f/v//v/8//g//T/8P/3/+H/8v/2//b/AAD0/xEA8f/3//j/6v/4/+P/8P/s/+7/6//x/+r/5P/q/+X/3f/l/+3/9f/k/+L/AgDr/+X/7//4//b/2//t/+7/6v/d/+n/5v/X/+H/5//u/+L/7f/s//L/7v/z//L/+//y/wAA8v/8//f/8v/t//b/7P/h/+D/3//e/+P/4f/p/+T/6f/q/+P/6f/j/+f/4P/Z/93/2//e/+X/5//3/+r/+P/s//H/7v/m/+v/5v/j/+j/7v/y//L/9v/4//r/8v/y//D/8P/l/+r/6v/u/+//8//r//P/+f/1//b/8//1//P/7P/o//L/6v/0//D/9//4//v/+//1//X/9P/x//D/7//v//H/7v/w/+X/5P/i/+P/6f/g/+T/3//o/+X/5v/p/+X/6f/m/+f/5P/k/+P/4//j/+P/5v/n/+v/5//p/+b/6//k/+b/4f/j/+P/4v/i/+D/4P/X/93/3v/d/9T/2v/T/93/0//b/9f/2f/Y/9b/1f/Z/9T/1//W/9P/0P/V/87/0f/T/9L/0//T/9L/2//V/9z/3v/h/+H/4//j/+b/4v/i/+H/3f/g/+L/5f/l/+D/6P/f/+H/3//d/+D/2//e/9//2//f/9b/2//e/9z/2//d/9r/4f/c/97/4P/f/+L/3f/d/+T/3v/f/9f/3v/c/97/4P/c/+D/3//h/93/3v/i/+H/6f/l/+z/7P/p/+3/6v/x/+f/6f/o/+//7P/s/+j/8v/q/+T/5f/m/+L/5P/h/+L/3v/n/+H/5P/l/9//5//m/+v/5//q/+r/5P/k/+f/5P/l/+T/8P/n/+//4v/n/+X/5//j/+X/5//o/+v/6P/r/+n/6v/l/+//5//u/+3/7v/r/+r/7f/m/+v/5//l/+v/6f/z/+j/+P/q/+r/7f/q/+n/6v/1/+//8v/6//L/8//7/+b/+P/t/+n/8f/v/+f/+P/x/+z/+v/r//P/9v/7/+X/9P/3/+L/8f8AAPX/+f/4//L/8//o//D/8P/9//T/6v8QAP//+P/0/w0A///4/wQAIQASAB8AGAAHABYABAAeADIAOQBPAGwAVwDo/y0ATwDt/yQALQDs/xQAWQCgAIkA8wAkATcAEgCYAC8BrgDa/1oAjwAN/zT9hf6V/vf8HP66/XX94/2v/uX/4f89APQACgHp/z4AUgDe/lr/AQLSA0gFOQlCECgVEQVG70/2R/Zl7J/0KP0/BY0EmQdvDL8Cu/9a/Sr5qfmY+Y3+yQDjAGEFuQRHAav/6/1v/sL+cv3q/9cAhwDIANr/8QD//9T/WgDb/4kA9f/TAecCTgK7AgYCzwEsAhEBIABHAlABbACTAY7/Ef+HAB3/c/1z/bb8m/u2++P8Xf3T/U3+9vzm/Ff92PtF/Nz7t/za/RH+eQFYAuoCowRMBSwG4ARIBxgJ3AsfEyAephzt+TX0EfvL5nrn9PG8+rz/8wH0B1gCqfwl/cb2wvQA9yn5Lv2cAEMDIwO6AyUBsP6p/V/8Gf5HAQICDwNEBGkFQwZABKIFfQVyA84EPgYfCFIHUQW5BH8CYP+D+5L2NvW++RT8kvuB/Mr+Sf1x+hv62fjK+N/66v7A/qUA4wLI/wj/BQFkAUsAHAIlBccFdQV+B18IjAu4DM8QxBXrEf4BHvnk/anwvenH8pr6KflS/wwGfv33+0D8C/eB8GT0OvsO+037XwGCAjn/v/0D/oEAev8WAtcDmgXiBzUFdASgBVoGqwaGCeQIwAq1FXUZsgw0/pj8cPS36LXvq/Rj9Vr8SgChAGj9xvqQ+U70XvHx8wT4Ifl0+rz/o/8g/6kBOgJVAooBAQNoB80FqgUiBpYERwa6CFwKwA1fE7YbbSDhC2MBzf/38WPq4enF8Qz3lfYF/YoAg/yf+on3x/Uz85vxLvW+97T2NfuD/oj+aP8aAhwDjAAgBFQH2wUTBd0HRgsGCKAKtQ5qDLgPSBioH/4PqgQUA2H2auyE5n7rZ/ML9SX8yf8N/wX+o/gd97HxTvBd9CP1vvY2+oL9Cv5g/X0ArAGeAqUEjQbKBTIFXQgqByUKeQq9CqgNsRGHGG4fAxluDL0I8P2/7q7od+lR7CLyuvk8/yr8of2W/l74lfQt8pvzqvOm8/n2FPqi+5/8hAD2AXcC/AQZBrMF4AXeBpsHpAowC8ELZQsNDEoSgBjfGHMROAsoCIP5g+7J61rpGO/S8hX5g/vK+n3/Zf3p9/n0xPP88hnx7PMN95v4Tvz8/64CmgO7BZAG4wTxBHUGJQZQB2AJ6wuXC1oMzQ8eEzgaFxpADtgG5AaZ+HXrgewH7pXuDPIw+a76K/vc/in8j/fv9jv14fLJ8RP1vfa791X8nP+vAl8DkgTYBeIEBwXhBKEFkggVCuAJiQvGDOkO1BLUGesWuQwGDWMGn/cL8NnuAO5V7DLybPp8+IH73P9M+1D4ovfs9ejxRfL29HP2Vvn9+w3/lgLdAsUDGgXpBfEFgQYJCNAHjAkICnkLjwxOEN4UfRl1Ff4LmgrnAZH3f+/c71zvpOzA9Aj3p/eu+tL8pPvE99P40Pew8+7zIPWQ9sP4Eft0/tMAAgPGBdcF5QZVB/gHlgikBisJDAlsCoEMiw9TEiEWERM8CG4KHgP5+afzhvLm82rtdPRw9fjyKvnz+kv70Ped+Ab76vPg8xL2yfWT9635x/3C/7sCfAb6B6wHTgmbCa8JoAlBCK8KjwohCogMDg8xFKMSlQ18CykEsP229jP0KfEd7xj0GvIX8wD2V/dC+C74j/ml+G/3EvdH9i33Xfd8+EL7V/0wArMDEQfWCPMIjQvVC0MLkggdClAKpggaCp0NsxG7EPYOMAwSB2ECivz7+Df1GPOV877xNfKi8cPyXPVz9Yn3efjU+JL59/du+G/4Hvhi+0P8y/2/ATUFBwcxCEwKeAyrC2MKZgs4Co8KhAopCzMN2AyQDAMJUAf5BeP/uPxL+nz37/Ul9b/1B/R282D1+PRz9Aj2EPdk92z4R/pB+s75Fvz3/LH8qP52AbgDQQQyBpkInwghCccJIAnuCL0J4AlyCtwKNwuyCvEHKwd2BdYCWQC1/dn7cfko+Kf2P/Yd9+j2UfYj9mL3mfdx98v4APlI+qP6w/od/BD8a/53/tn+EgIEA50E/QSEBs8IcgeYB3wIWgljCR4I6wiOCRAJMAeqBd8D7wEvAAz+ov0G/W78x/ss+4n6LPn2+OP49fio+Yv56fku+Xn5ivrI+Yn78vsT/Qf/Wf7PAJwA/ACDA7YCNgWaBJgE/gZBBIMFwAXwBBcGFQTDBUoFLATvBPQB4wFFARAA9/9r/iz+IfzT/Lf9c/sa/Mn7S/zP+0b7nf1o++b7JP3F+7H9+fwX/o3/z/1h/0T/5f/tAI7/EALVAlgBtALzAgADqgMxA10DSwNfAxMEQQLkASIDLwEoAUgB8//MAHf/j/7Q/kT+1P7F/L78t/4e/bT9p/7W/QT+7/2z/lT+wf28/k7+hv5A/+T+Z//z/2oAxAAgAYEB4gAoAUIB1ADDAXUBEQFdAVIBSwE9AL8AEAGd/9IAFgHm/9H/RP/P/4//Ov8AAHj/CAAiAOP+cf9Y/4X+ov6y/gv/QP8c/3H/TP+C/1kAlP/T/9EAXQCtAHgAYQD0ABYAjgDBAK0ATgF/ANYAygDS/1kAKQAiADQAFwBqAKD/nf/W/4H/ov+G/7P/mP+c/7L/SP9S/yH/OP+A/3j/tv+U/6n/t/+W//f/GgBuALsA0QDtANYAowCOAHYAfQCsALgA8QD2APYA0wCgAIwAWQBDADcA8v/W/5D/Yf9O/1X/nv+5/yIAAQAcAMr/b/8p/w7/Nv8f/4L/6P/h/+n/GQBFAFcATABMAPn/ZQD1//z/AAC9/97/ZADWAIAA0wDOAD4AMAAgACMA3/+o//P/wf/B/5//HQDW/5D/CACy/7f/bv+V/4X/Q/9i/2r/5v8LAAoAFwDl/3gA6v/b/0cAHwDv/9f/dwBZALUAuABVAKAASQB+AKIAiQBsABML0jkgvREN\"\n        },\n        \"direction\": \"Request\"\n      }\n    }\n  },\n  {\n    \"connection_id\": 0,\n    \"action\": {\n      \"Data\": {\n        \"data\": {\n          \"Base64\": \"AAAguwAAAEPqTPNwEDpjaHVuay1zaWduYXR1cmUGACC7hQIZ+nIqdx3aksllhQNaZMdR/hs8ZRqq1ibNSqkw0gU6ZGF0ZQgAAAF7iTpKwAAAIGgAAABYrnw/FQ06bWVzc2FnZS10eXBlBwAFZXZlbnQLOmV2ZW50LXR5cGUHAApBdWRpb0V2ZW50DTpjb250ZW50LXR5cGUHABhhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW3i/wYA3P8dAN7/0f8rAMb/NAAoAPv/DgBY/0//lv85AKP/pv8sAF7/Z/85/7L/DQAOACgA5P9NADsA1//I/9n/nwCu/zsAwAAJALb/q/8rAJn/RACzAOoAfgCm/zUA5v8P/3UArgAJAIb/gwDK/7D/cwAR/2L/hf8DADEAaACA/4j/pQBvAKT/eQC//5L/Kv/R/+//yP92APH/ngDV/yUA0f8wAEEAeQCgAGAAx/9hAG3/g/8LAIEAGAAIALgAD/8BAOr/TACi//r/2v/u/97/vf/v/0kAfP8VAHMABQDf/3r/UQBt/4AAxf9EAKD/QQCkADAA+//C/37/KwDu/5z/VACMABgAcv/gAJD/YQDX/9//gv9NAAoAdf8OAPj/zv/u/wIAKgAnAMD/sQDG/xUATv+TAJT/IwAJAIL/5P9PADIAuf+dAGwAh//I/48A1f8mAKD/6wBX//f/5f8yANb/j/9KAAoABQDC//H/SgBeAKD/HADY/2IAT/+tANb/7//e/97/EQD9/9n/y/+6AFMAq/+n/3UAn/8bAJz/UgCt/ykAu//Q/xwAigBxAMP/uf9BAI4Ahv8oAMP/JQC1/+3/mf82AN7/EAD+/zMA/P8LADQA/P9vAA0ALQC1/3YAw//9/9D/RADN/+r/EQAUAPP/bAAaALP/SgBLAB8Anf+VAN3/tf8KAFkAkP9XAAQA5v9gAPn//v9HACAAGwDZ/xIAawCF/24AEAC5/wIAYwC+/wkATQD+/w8AHAD3/0gA9//X/ycABwBEANv/SgDj/0IA3f/q/3AA2f/n/z0Aq/9UACoAuP8aAMn/fQDZ/+f/LAA9AND/GQDf/wIAGgAMABAA+P+5/wgAHgC9/1wAnf8YAOr/+/8qAAoA5/8fAMb/FAARAPD/KQAYAN//rf+HALn/0P8/ABgA4v86ANX/9f8TAOv/LwAEAL//7f8PALv/IwAXAOT/z//y//H/QgC5/z0A8f/g/ygAy/80ALz/LADQ//T////8/9r/GAD3//H/6f8PACwAy/8KAPD/JgDU/xEAwP8iABwA5f8EAPr/DgAcAOT/IQDx//z/5P8KAPr/7/88AKr/IwDc//f/7f8IANP/EgDt/+X/BADQ/zYAzP/y//3/6v/r//X/8/8PANz/+//y//n/BADt/w0A8//p//T/AgDi/wUA0P8FAAgAz/8RAPL/BgDu//P/CwDv/+///P/1/+j/+//1/+7/8f/v/+r/9P/x//L/7v/j//H/7P/t/+j/+P/r//L/9f/t//7/7P/y////8P/3//7/7P/9/+7/AgD5//D/9v/1////8P/7/+f/AADs//f/DADt/wQA/v///wIA+f8BAP///f8CAPP//f/1/////P/t/wAA6f/9/+X/9f/y/+z/8P/0/+v/9P/v//T/9f/j//f/6//w//L/8v/l//j/6P/y//D/6//5/+v/5//w/+//7f/h/+b/6//i/+v/3//w/+T/5v/q/+T/7//k/+j/5P/o/+X/3//j/+f/4f/j/97/6f/c/+j/2f/o/97/6f/o/+D/6f/o/+r/6v/k/+j/6P/l/+j/5v/q/+D/5f/f/+L/4f/i/93/5P/h/+H/3P/l/+b/2//i/93/5f/b/+T/4P/i/+P/4f/m/+X/4P/j/+T/3f/m/9//4f/f/97/4v/e/+P/4v/j/93/7P/a/+b/3P/q/97/5f/g/93/3f/b/9v/2//a/9n/1//T/9r/1f/e/9P/2//V/9r/1v/a/9f/1//P/9r/1P/S/9f/0//X/9D/2//S/9b/1f/X/9L/2P/R/9T/1P/V/9T/1f/W/9P/0v/U/9X/1//U/9n/1f/b/9P/2P/W/9n/0f/Y/9L/2v/T/9T/0//Y/9L/2f/R/9X/0P/X/9P/1//O/9H/zv/W/9H/zf/T/87/0P/Q/9L/1f/U/9T/0f/X/9L/1//T/9j/1//a/9n/1//c/9f/3f/a/97/1f/d/9r/3f/Y/+P/4v/j/+H/2//i/9r/1//V/9z/2P/Q/9r/0f/M/9b/0//L/9f/1f/f/9P/2f/f/93/2//Z/+P/2//V/9v/3f/P/9X/0//Z/9H/4v/V/9z/3v/i/93/3f/c/+r/7f/s/+r/7//q/+j/4P/m/+7/5f/j/+j/4//Y/9f/0v/c/9j/1f/G/9L/4P/c/93/3//q//X/7P/a/+7/8P8BAOX/6f/m/+H/3v/W/97/1//l/+P/5//f/+z/6P/z/+3/8f/6/+n/AgDr//D/8f/6//n/9v8GABMADwAaADgAQgCTAI0BXgLE/2X9G//X/wD/9v9QAG3/Pf/KAEj/Sv8hAoMB2wAKACgBcQAx/88Aef8m/1gAjf4hABgBa/8j/1D/c/9dACQAEQB9AEn/VwCb/ykACv88AHoAZP61ACr/EQDpANIAMgAAAFcAdv8/APEA+/+S/kUB0wCP/xEBKADp/9v/1v82AND/AQC5APz+FgBCAPL/BwDe/7IAdf+WAIf/SwBp/ywArADQ/qEADADJAKf/bACSAHL/2QCR/9n/xv/c/+P/sf75AAgAOv+nAPH/FwAmAO4A6f+9/wwBSAA1/0AAo/+0//b/UP7JAeH+wP+mAYD+1wBR/1sBNQD+/vMBGf+B/xX/Cv/Y/67+Iv/u/9n/RADv/0cAgQH0/zkBoQDZ/2kBnP+2AHr/eP81Aef+uP91AOL/BQBKALX/+/9TAPb/ev9nAF4ACP9LAYz/If/aAFb/GACl/7wANADW/vgARQCo/5cAGQCn/zAApQD5/3j/+wB6AD3/0QD3/+X/TwAnAG0ANP/HAFAA6/7tAFcARf/z/50ADgCS/wABIAAu/24AeQD//9b/MABfALn/Gf+yAG0Aj/5/ADgACf8m/y8Alf8B/vUAUf+P/kcBJv/1/xgAm/8oAeT/QQDyAOP/wwBwAW8A/QC9Ad4AvACUASQBIQB6AScBw/+9ADYADP9r/1j/0P04/ln+svyC/RD9cPzM/C/8RP0R/VL9X/5A/kL/1v97AHsB9gELAxgEkwR7BVAGGQczBwAIRgiSBw8IGwYnBR4EtwCF/nP8zPnZ9jD1S/Q58rbxu/Kc8tPz3PUc+Dj6z/sW/6kBvwIVBvQGjwcoCt8JVQtODIYNlA2aDvYOWwz/DKsK2QjpBDYCa/83+Rr4UPOo8IbvnuzR7DPtbe7P72/zy/Vv+HP87v2mAJAC3gMmBQEGwAYyB6kHcwjuCHUJOQuPC+kMqg3gDvAOCg6CDscKjQizBUwAwPxb+J/zRvBw7XjrGOqe6rfsfu2C8f30aPc4/Oz+ngBpA2wFEgVTBkMH2QUnB5oHvAaMCAwJ+gmKCxANbg5mD2kQgQ/DDm8MXQniBK8ABfzv9ZXy7u2g6k7pruej6Hfqq+x48LjzCPhT+9b++QGWAzkGjAbHBxwIzAchCZUIWAkaChoK2gsaDBgO3A5mDroQlg3SDFgLsQW2A7X9Hfkx9czvRu0D6tHoL+hF6V7rXu1n8af0hfhb/JD/YAK8BNgGfge6CC8JHgmDCbkJ5wlxCq8KvAtHDIANVA50DfUObwynC2UJ6QRxArb8Sfl89HDw2O1p6vrpNunR6QbsG+6g8Qn1Dvmf/Mj/FQP9BAsHPggFCXoJegncCYkJ9gnyCS8KCgtUC/wMcw2zDA8ONgxiCo0JKQQIArH9Z/jJ9XHwZu7E69bpqeo26rHsR++28dD1rPno/E4AlQMdBVMHqAizCHsJgwkBCV8JGQneCEkJtglvCooLXQw0DAINKwyLCuYIlwUjAoD+4/mG9Ybyau5l7ITrQuq56yPtee8R89H1IPp9/V0AnQM0Bc4GFgiGCJgI3ginCDkIvAgHCGQI9QgvCeIKEwt9CxYMUwsMCqAIPQV8Agj/b/pi91jzRvAv7oPs+etL7NTt4++g8sL1Gflx/I//cwJYBBYGbgcTCGQIsQi0CIMImwiPCAkI7QhcCe0J+Aq3ClcLRApjCeEHsQSdAtj++voX+Cn0YPGe76ftS+3y7YLu2fBI87j1V/kD/ND+ngG7AyMFngamB2oHZQh4CMAH3gg9CBsIAgkDCcYJpQrnCtwKxQp2CcgH1wWFAr3/lvxw+Lv1wvLs7/Pu9O247TLvV/Cp8nH1I/hd+9/9wQDjAnkENQYPB38H6Qc6CJAHPwg5CMsHDQnFCLEJ0gq2CjML1QqhCUQI7QXvAjYApPxX+S/2C/MN8WDviO6F7j3voPCJ8vz0vvdt+m/96P/LARIEUgVRBngHeAfPByAI0AdDCDMIXwgfCQEJPApxCs8JZArICAMHFQafAhkA2v3U+cH3EPVP8svxT/Ab8CjxsvGW86f1y/dn+qP8/f7tAJ4CHAQUBQoGmwbnBi8HWgebB80H8wd8CMUIWAnKCUgJdwlSCCkHnwU5Ax8BKf6x+/v4afaY9P7yRvKf8SHy8vIM9PX1uvf0+fb7Bv7z/2kBuQL9A+EEgQUyBpUGyAZsB2kHpgc3CEwIpAjcCAYJ7QjQB1UH1QWcA2gCcP9f/Vr7e/g891v1S/Tu83XzLvTd9Cn2jfd2+TH72vzs/hQApQGfAokDwATlBIoF7wXfBVMGawZQBrwGuga+Bg0HoAbcBsgFbgWEBIQCAQJ7//H9cfyM+nr5/fed9732u/YX9zP3Qfj/+Db6bvuR/A7++v4uAGQByQEfA2QDjwOtBGwE2wR1BUgFbAUWBnoFpgXwBfoESAVGBMUDFQM+AR8Bb/9a/sr9Ffyg+8P6Ovoe+q35Gfoc+o/6L/uT+2H8wPzp/Xv+z/4SADkAzQCiAbMBYwLtAhgDeAPEA8YD+wPmA+oDwgOkA8EDvwLNAl0CJQFxAUgAj/81/x7+1/06/dj85Px2/J78//yK/OL8PP0T/bj95P0R/nH+2/75/mH/nP+W/0cARAB7AB0BYQFjAUUCTQL3AfcCTAKZAqECEwIwAi8BbAHiAC4AlgDF/3L/nP/7/ur++P5s/sv+cv5w/uz+Of6//gD/n/5L/27/K//h/8b/z/8uABIAcgBuAJIAqACdALEAsgCmAJAAtAB0AIAAWAAnADAA3f/u/6//pP+O/2z/hP9R/3P/e/9v/4T/if+k/7f/0v/2//v/NAA2AGsAaACAAK0AigCkAM4AmACcAKsAXgBzAGQALgAjAAYA4P/T/6H/nf+B/2X/cP9S/1//S/9P/1z/Uv90/3n/k/+j/8H/0v/t/wsAFABBAEYAWABzAGEAdQB3AG0AawBtAFcAQQBEAA4ACwABAOL/4f/D/8P/uP+d/7H/kv+X/6v/mP+//7f/x//h/97/AgACABYAKQApAEQAQQBUAEcAWgBWAEkASQBFACwAJwAaAAgAAgD4/+//4v/e/9P/yv/F/7//wv++/8r/xP/U/9T/2//k//L//f8HABEAFAAkAB8AJwAsADMAMQA1ACkAKAAqACgAIgAZABwACQALAAkA9v/5/+f/6f/g/9r/4P/S/9f/0//R/87/1f/X/9v/5f/m/+j/9f/3/wUACAAEAAsADQAQABQADQARABgAFAAaABgADgAMAA8AAAAGAP3/8v/8//D/7f/u/+b/6P/o/+X/7f/r//D/7v/u//b/8P/8//j/AAAEAAIABQAGAAEACQAGAAkAAgD+/////P/9//v/9P/0//T/7v/n/+3/6f/s/+z/5v/r/+3/6f/w/+j/7f/r//L/8f/z//n/9//7//f/9v/6//n//P/2//v/9f/8//b//f/w//j/8//z//b/8//x//H/7v/r/+b/6v/i/+v/3f/r/+L/5//j/+H/4//i/+L/4v/m/+b/5v/m/+z/6v/v/+7/6v/w/+z/7v/s/+z/7//n/+z/5v/p/+j/6P/l/+D/4v/e/93/2P/Y/9j/2v/X/9H/1f/Z/97/3v/h/+L/6P/i/+b/5f/o/+X/7//w/+v/8f/r//b/8f/4//D/9//v//b/8P/w/+//7P/v/+n/6P/i/+X/4P/i/+D/4//g/+T/4v/j/+b/4//p/+r/7f/y//P/8v/0//H/8//0//L/9f/x//H/8//w/+7/8P/p/+r/6f/l/+r/5P/p/+b/4//m/+b/4v/n/+X/5f/j/+P/4f/Z/9//1v/e/9n/3//i/+L/6P/g/+7/5//l/+L/6f/s/+j/5v/h/+T/3P/h/93/1//X/9n/1P/e/87/1P/Q/9P/0v/T/9v/0P/Z/9n/3//a/9z/2//d/97/5P/T/9v/2//R/9z/5f/i/+H/2//Y/9D/0//h/97/4//d/93/4P/f/9v/4//d/+H/5v/k/+H/4//t/+f/6f/x/+3/6f/s//D/9P/q//n/9//w/+n/+v/r//T/8P/3/9//7P/1//b/5P/5/+r/6v/o//T/4//h/wAA3P/w/+7/6P/x/+n/+//1/+T/BADh/wYA7v8lAPz/IQAcAFMATQDVAOUASgJMAzcD6/3O+24EIPnn/qYEkvaoAdr/I/3JAF7/SgEZ/48CHP9rAP4AmQDO/2b7Rwat/fv8SAXf+F0AlQJc/GkBeP8sAS3+uv9+Aln+MAE8AfP/sv+4Adn//P/vAG3/mwCq/93/gwAS/5AA2/8Q/icB3gEQ/VYAUwIn/Wf/rQFs/nL/LwJZ/RcBUgDo/94BDv+rAFkA6QCv/5D/uv7C/tH/q/8s/wsAtgDU/noAfQC4/z4A9AG6/9sAAQE6/tACR/5dAUIAp/6fAEH/vQD9/fwAGv+0//X/uf6Q/9v/VAF9/4ABCAHW/z4Bcf70ALj/bv4uAaL+LADSAFj+5f/yAHn+pgALAn/9tQKb/63+3AJr/ZUAef59/ucA8P1fAbb/hP6BAdj+FgCCAB8BFf73ADkANP4IAaP/zwHG/qAAAgFAAHkBJv/4/nwB9/24/g0A5/4y//UAPQDq/9cCYgArAIT/gwDz/vD+0QCb/VcAnwG3/V8CVwDM/mYAPwHp/5v9cQIb/sv+CwEG/0AAEwDu/ycAIQDyACEAz/9fAN7/kf+A/xkAGgGT/3AAOgH4/ucAWv+v/xgA9QBw/0AAWgHp/pQByQAUAOT/IQG0/oj/rgDQ/sT/lQBZ/vj/rQB4/74BC//2AFYACgDuASL/swBlAYj+hQCc/j//nACo/UoCUf+J/x8B0v9+AY7+TAH5AKj+ugAwAF//sv+u/2L/U/9Q/6cARAAeAGwBAwCSAEIBW//m/9//yP8gAOn/RP+d/60AyP9s/04ATQDC/hsAkACS/98AZQDR/t4AdAA1/uH/BQDQ/xcBdP/3/qsAIwCh/1AAxQBK/zsBMgHW/vL/JgD7/pX/0QC6/Z7/6wCZ/zwA0wBGAcz/qwArAL//4v6b/3r/BP4wAOX/nv5/AD0AbAC8AIwALAFw/6kA1v+h/k4AP/9n/1gAif4NADUBRgABAFX/zwAxAGD/yAAB//v/gQC8/hoAx/6S/98Alf9AACwBiP82ABAAzv8VABr/ygCk/3L/KAHBAf4AzQAqARkBGP8S/9wADv/K/9YB3f+LAIgBsv9v/7L/+/9u/sL/1v/t/WsAaQBv/sr//QDi/5b/xP9f/gD/Sv+c/tv+R/8oAUv/fgBiAR3/ZgGqABP+y//p/xP+PgBQAKb+cAF9Ak3/RwC6AhcAe/9eAWsAav85AH//p/4EAYv/V/+mATX/+v8wATP/fwDQ/xf/Jf+6/hQAGf/1/9IAzP/A/9wAkf9W/6n/hv+WAGEAmQBTAMQA5gCjAKj+ff+VAIz/UQEaARoATQHqACz/IP6I/x8AYP5/AIEAEv/t/pD/CQDD/mD+ywFBAYb9xP8EAZv+a/5dADH/Qf8DAe8Bxv7L/58C7/3E/pYB1P4eAFYBzwCOACb/KwE8/63+kP+5/rMAxwAcAewALv6MAIz/Sf6xAfz/FgASAuEALv/v/08Aq//I//v/ev/vAAoA7v8qAV8A9/8w/4P++P0KAf/9qv6PAjAAaP9cAGj/Gv/4ADz+gP5+AkYBG/+WAdv/yf6SAWIAL//u/2YB+AA+AAkB6QDZAfIDwgB+/ygDkAAk/tUBtgCt/TT/wABDAJH+6P+d/xv8wv1R/rH72PwjARMBg/xr/z8BBf1f/ioAvf9nAakBAwAOACoA+v/4AtEBVAHRBYUC5wE2BEQCNgNxAvcBtQFuABQCUv/X/+//zv1w/6j8O/ze/rb7ivgu/9b85vjz/g3/xPv3/EUAjPyn/NL/Of2+/moDNQLhAbgDAQJWAisEhAITAhsEiANaAzoCPwTFBK4B/gThAzQBXwLGAL//sf6R/QX+T/u6+2H+Dv4U/qf9Av1d+9v6k/vk+yH8zPwY/on9Av7A/j//0QBHALP/owFBATIBggKjAUYBRQNOAxgCrgIgA38C2gG0AYsCPAAPAJwGpwCu/icF0gGf/9kC5QPA/sH/WQLW/wX80/38/hX7vPud/cX8j/sD/bf8g/r++cn8UfzZ+6H9DgCOAH/+EwFdAif/TgDBBCAB8wG3BlEFbgTCBgMHlgNHBo4JCAZ2B34KMAYrA6QDFwIe/Dn6Z/zF+GP3X/u1+bv2nvff+CT1APQN+Yv4Xffb/HX/cvz6/9cBCwAUAHQDcwX9BKoIKAoNCIEHwwlNCdoIIww9DV8J4wmUCSQCBf7D/tD6UvYq+G74S/VA9d34WPUw8573QPVG88T3uPjK+bT74P7f/7f+eALuA4sEgAbqCDgIigh0CbcIQgoRCwsNXA6sD4sPmAk2BhUCkvxF+sj2iPbM9q31ofd89oz0fvdU9QrzGfXz9C/1HvgY/Bf8Mf0JAYwBpgBvBLQHxwWWB5ILBQlFCWAMoQqQCxwP7w7mDBYLfAhKBLL+5Pkf+Ev2vPWX9Yn15ff09eD25PYb9Pz0DvXA9Sv3EPpQ/Rj+iv7TAF8CwgJjBccHJgj9CrML7wqMCnYKOgteDcQOUgqJCsQKuQL4/KP8nffz81z3wvZo9If3N/lP9s70p/U19sL0DPbp+fT67/sM/3n/DwDlASgExQTfBeQJVws4ChwLDQx3CdsKhA6PDL4K2QwbCR8C6f0V/Mz36PMp91/11fMN+OH3sfTZ9WX3F/Wg9dP3NfnI+e77r/5z/SYA+gJ0A0wFfgepCZsJiQrYC9sJvgn4CiYM7g/CDSALwArtAgv9KPul9UXzCPWb9Rf1nfYz+cj2jPSv9lj2avSD9975Bvny+wD/BP41AGIDCQT8BOAHEwqdCXcJKwsfCv4HzgrjCyYQmRALC4MKYQXS/In55vVI8mPzKvYi9hz1+vhn+KP0cfVn9mr0S/Yw+jH5M/s5/mn+mv8uAsgEKAaiB8kJuwnzCX0JaQmJCScJuwulDwAQrQw2C8gHcP9Q+vD3uvJX8gD12fVO9kr3tPh497L2sfbd9ZX22vdn+CH76vxg/e7/YwKBAj0DWAcaCD4HkAnMCu0J1AlTC8cKPguyEFwPXAi0Cs4GhPvG+UT4ffJN8Zf3Y/ZT89r4hvke9Kn2LPnT9ID2xPl3+dn5SPwq/s7+1ABVA1cEvwUNCCAJEQnLCSQLBgs4CtULpgy1D1IRPgyYC8MHBv9b+tL3XvOx8X32XfYB80j3IvqS9E312fjD9ef08fjO+A/4DfzU/b/9fgBDA/gC1QRWB4kGwQbBCY0JcAh1CnwLfwsoDX8SqhCHDLEMjQUQ/sX5+/Xp8pPzofbA9TD3Mfm9+DL4Jvc095D2nfXV97n3h/hd+2H8Hf9RALEB+gOPBJUFPAbGBrMHUQj4CG0I3AgVCkELpg60EDsNpwpjCYMAlPny+Bf2kPOF9pn4Fvcm+Af7j/gQ92P5Y/db92n4IPl0+VT6CP0Z/lr/+ACNAkgD3gNRBYYFmAWXBmcHhwgOCMkHBAmUCR0LbQ40DRIKOQq2BDz9cvrZ9wr3rfaS95n54Pcq+fD5zfcb9734IPiO9qD5Jvr9+KX7zP32/Af/FQELAaMBIgPtBFMEnQQ9B9wGLwcaCdoI5gilCQ4LnwyjDkkOTwoxCQUEb/s7+3X3I/QB9/X3efcd9xn6YPm49lT4bfkT99L3afrc+ML4hPsT/FL8//5kAFsA3QHoAt4CDQQDBYEFKwbrBwQJOQjMCVALeAmrCtsPHw1/CvsMZge7AyT/7fmS+VP3Yfbu9nH21PXk98f37vW69n/5uvc998L6HvlK+bb7uPuT/Lr9H/8dABgB1wK6AlAEswS8BUYHWAeaCOYIDgmgCd8IOwpxC18MWA/GDBMKGAnJBLP+kPzT+fL1qvbo9s/0EPXY93/22PWQ9w336/WL+PL4HPeg+V377flz+3D+If1v/rUBJQEXAUcD/wNUAzMFaQeWBiwI3Qm/CH4JNwneCRMLmgvtDe8NbQuICRoHHwL1/gj9pPjD9vL26PSI8xr1cvXc9Ir2MPhQ97b3zvnt+In4C/pY+kb6aPyJ/df9+v8KATgBOAKbAtoDZQQGBegG6AZWB+kHzgfYB9MHiwcbCf4IqAjkC4QNcguUCdsKCwXS/qv/Sfss9T/3S/dL82f17vek9X30Lfgo94H0YPhA+SP3Z/lG+9z53/o8/qX9yv3DANIARgBYAtACagIPBDgFJAUFBpEHMgc8CJ8IIwj4CH0JDQmqCaoKDQwUDf0KbwqZBxQCRQDo/Hj3G/c79yz0N/T59oT19fTW98v2/fUv+Nr4wPdl+KP6evnC+Z780vut/D7/Sf+X/zkBRwIEAi0DRwShA2YFugaSBnwHfgh8CJMIAQncCIgI8QhNCosKVwnhCnAMlwakBkIH8P5e/az9bfcA9fX4OPZZ80z4effH9Bn43fdO9Xn3iPno9nz3Y/qv+Nb4Uvyg+0v74P7T/zb/7AF+AxMCFwT3BNwD/QRDBvAFhQalCMMH2QdYCRgI0gaTCNAIcweNCSULjglnCC8K2gSAACwDZ/3M+E/6Xvib9ej2h/eI9Yb2efh39oL28/id9yT3PflI+Sj4afpz+xT7Bf0C/oH+fP9GANUAyADsAFbDVQfwJ1AG\"\n        },\n        \"direction\": \"Request\"\n      }\n    }\n  },\n  {\n    \"connection_id\": 0,\n    \"action\": {\n      \"Data\": {\n        \"data\": {\n          \"Base64\": \"AAAQ2wAAAEN3BIOQEDpjaHVuay1zaWduYXR1cmUGACAoWxbzumTv+75l9I6Lo1I/QjzFvs+SzAAPT1RE4v3KQAU6ZGF0ZQgAAAF7iTpKwAAAEIgAAABYgtL/Zw06bWVzc2FnZS10eXBlBwAFZXZlbnQLOmV2ZW50LXR5cGUHAApBdWRpb0V2ZW50DTpjb250ZW50LXR5cGUHABhhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW1vAW4BdQIOBNQEqQXNBmQHHgfeBxwINQfYB4sI3AcsCN8JdQmeCBALOgpcB+QH/gSOAT8AGPzi+Zf4b/Ya9hn1vfRA9gv2QvYn+BH4QPiE+Zr5UflB+sj6bfpG+9n7jPzk/L/9EP++/jAAdwEMAfwBRAM9A/4DhAU8Bf4F2QdcB7IGhAenBysHUwcmCLcIzwjsCTIKigkxCrwJ5QdBBeEDBgFh/Nn6MfnD9v71lvb29PfzyPa99WH03ffr96j2uPlU+hz5gPup/Fb7lvw7/mn9Rf79/4T+5f9rAVIAZwE1AlECjQLZA/YDxQMHBWkF1AS4BWsG7gVOBtEGjwf4BkAH0QiMCGoINAq/CRUHDQjEB9kB8gBLAav68vjf+sD1kvPA+Of0V/KT+MD2ivQt+dT5rvYR+qb8EPkj+/P9O/ua+wz/Uv1Z/eUA2f+0/xsC5wHhADoDjQNiAlIEmgTJAxwFigU1BWgFBwYfBscFtgY5B50GpwdiCFwHagjfCAAI5AdGBzEFcQPFASsA5v0D+1H7vvjj9n/3evWG9Tv2T/a69lj3xPjk+Hb5JPu3+gH7uvz7+1X8+P2a/e79Vf+Y/0T/rwD9AKkA9QElAvIBQgNFA64C8gPkA3AD+wTABHQEwwWhBbMFQwa3BncGUwd6B3IHdAjzBx8IywfSBjkFVQRlAqX/cv+k/C76Y/pK+IL2/PZh9sf1Q/Z99iz3z/fy+OX5Q/p1+2n7ovuW/Eb8MP32/f/9Mv9E/9b/tQCnAEgBUgG8ASoCiAL0AsICmQOnA1QDhgQwBHwEZwVpBY8FIwYIBu0Fywa+BuYGKwcgBzsH5ganBf4EwgQ1AkgAyP8P/dP6FPuX+M/2N/go9oj1e/eN9hf3Yvkm+Zn5p/vA+yD8EP1q/WT9bv0t/lj+Jf5B/4r/mf+cAIAA6gByAbgB1gFcAisDzQJFAzcEfAPrA9AEBASoBFsFzgQiBU0FSwWXBYcFPQZgBvEGegfDBjEGIAbeBBwDcQKGAOD96Pwg+8n4ffgM92r2L/Z89oj25vZC+Ij4vfm1+k375fuc/P78Hf2G/Qf+EP6d/g//Uv/Z/10A3AAvAbwBDQIdArwC1wLZAhkDKQMzA0wD5APnAzMEkgSPBLMEHQULBQsFtgW/BYwFQAZ/BioG3QYWB/EF5AT9A9oBcv+C/kP8jvmj+bT3Rfbg9u312vUK9zL33vcU+Tb66PqT+4X8wfwJ/Yv9Gv7X/VT+3/5Y/gT/xP9z/4MARQEwATsCkgKWAgUDcgNNA4UD7gOkAwMEfwTtA08EzgQXBK4EKgWmBE0F0AVABQwGVQbVBTIGNgZyBYIE2QPrAeb/wv6V/Mv6CfqZ+I73Q/ej9l327vb39rP3KvmG+YP62fvS+8L8h/0c/Tr+eP5H/h//RP8E/+P/LwAgABoBmgHgAZsCDgNhA8AD5gMzBOcDVQSCBB4EbwRyBFoEMgRnBK8EVwTpBGYF2gScBawFUgV6BVIFAwXvAywDFwLE/7H+PP2s+jL6NPmJ97D3LPdC9iv3l/ev9/z4Jvpx+ov7mPy5/ET9MP41/vP9M/8g/6v+8P+D/6T/lgA7AAUBaAEpAW4CJQK2Ao0D0gLWA8ID8QPZBOADFQVHBTEEZQWyBDEEBgXNBIEExwT/BIMEkAQABfwDfAO5A54BTQERAMv9Y/21+wv6qPmW+L73CfiJ91/3hfj2+BP5g/oX+yT7ufwt/bP8Gf4m/s79h/6m/kv+yf4uAFf/BgAvAbsAuAFyAmgCOAMiBOwDZgSWBEAEhwRlBAoEfARsBOkDmAQvBOcDwgRxBH8E5QR+BMcEyAQmBNADZANdAjUBgQDp/gr+IP1m+8z6Mvrr+MX4vPhF+Lr4QflH+fD5w/oA+6H7ZvyQ/Nv8sf3F/Zr9iP66/tv+uP/u/w4A9AD5AT4BRQJxA9oBfAN4BHcChQTBBPsCugR/BGIDjwQSBf4D+wSKBUUEyARcBTgELQT/BJwDSAPeAy8CZQGMAfT/nv62/jb9Evwd/Az7bPpR+iP6n/nd+SP6vPl7+sT6v/qZ+/D7JPyx/Eb9jv3r/YH+XP7B/j//EP+H/wQAQwCsACQBsAFFAr0CTAO/AwYEbgRuBNYExgRvBOEEyQQvBLQEmAS6A3kEKQQvA/MDuAMHA1QDAgN8AvMBeAGpAF7/Ef8i/uf8ofz3+wT72Pqb+gD6/Plb+jH6HvrQ+v76Cvvb+z38Mfzd/HD9Pv0M/oz+P/4P/2D/Lv/s/2MAZAAzAdMBvAGmAvQCCgPEA88D9QNaBDEETwQvBB4EKAQABBwE/gPRA/4DxwN5A60DXgM3A/sCUwJZAkQBcwDYAJ/+JP6i/kT8OPxj/N/66fpi+3r6bfpA++f6pvri+537Ovvj/EP8MPyo/R79MP03/jL+Uv4t/2X/gf9mAJkA0QCmAcABFwLbArYCQwPKA4gD/wMoBO0DIgQhBBgEGwRSBDkE3wMzBLgDbAPPA7YC8gK7AmYBtAHWAKz/4P/Q/jL+Mv5q/TX9jPxx/Ab8W/uf+4T75vqS+7T7GPvo+y381/tr/Pf8oPx6/Qj+z/21/h3/8v7O/y0Az//IABkBBwHFASsCOwKrAikDLQMVA8EDfANsA/8DZAOAA68DYQMPAzkDMwOeAuMC0wLxAUECzgHoADcBZwC+/5//Lv9u/gj+1v04/en86Pyf/ET8X/x9/Aj88Pto/AL8Cfyt/KP8yvxC/a/9xf30/dP+0v7v/hsADgAiABUBCwE8AeAB0gFPAnwCWAIQA+MCEgOXA1oDqQNpA3gDqgPoAiID6gITAlACBQJ6AY8BTwEJAfYAaABRABcAov9g/yn/mv4K/gz+Zv37/FD90/xJ/M/8kPw//Mb8tPyj/B39af1i/c39VP5K/tH+If9F/7n/7v85AHkAmwD+AAoBUwGxAZ8B+QE4Ai8CUwJrAmYCWwJlAmECNQI6AgwC1wHRAYkBaQEzAfkAzQBjACUAFgCk/1v/W/8G/6j+qf6S/jv+S/5O/hT+Gv5T/jn+Sf5y/o7+dP64/tr+iP4T/yf/IP+I/5D/zP+9//b/IwDw/1YAZwA+AKMAkQCnAMsAkgD0ANEAuAD0AAEB1ADlAAsBtAC9AOoAnwDJAJQAfACmAG8ATgBbADEACgAFAMH/rf+u/6P/mf+Y/6v/hP+M/4L/ev+f/77/wP/L/9L/2//i/9X/5f/4/+z/+f8HABIAIwA/ADEAPgBFAD4ATQAfAD0APQAtAFUASwBVAFcARgBOAB0AKAAvAAoAIQAlAAYACQAVAOj/8f8JAO3/7P/9//f/2v/v/+P/3P/m/+H/4P/u/+//8P/2//P/2f/a/+D/5P/U/+n/4P/c/8//1v/P/9P/1v/U/9r/7P/f/9r/3f/o/+f/6v/4/+3/+//r//T/9f/p//D/AQABAP7//f8BAPr/9v8AAAUABwAOAAcACQAIAPj/+/8AAPb/9f8AAO//9f/6//T/7//4//L//P8EAPX//f/9/+7/+P/u//f/+v/6/w4ABAAGAAEA/f8BAPf/9f8BAPL/AQD9//b/9f/v//v/+f8EAPf//P8IAPr//f8DAAMA+v8AAAcA9v////r/+//v//r/9v/5//b/+//3//b/9//3//D/+f/8//b/+/8DAAMA9/8CAAEA/f8IAAIADwAMAAoABQAIAP7/BwAEAAQABwAFAAcACQAJAAEABQD//wkAAwALAAgABAAGAAQA///7//7/9v/+//j/+P/4//X/9P/3//f/9//0//L/8P/t//L/9f/3//7/AQD8/wIA/f///wMA//8IAAAABgACAAEAAQADAAIAAwABAAUAAQAAAAQA/f8IAPv/BgD8////+v/8//r/9f/1//f//v/3////9f/8//L/+//2//X/9f/0//L/8f/0//H/9f/5//v//P/8//r/+v/6//b/+f/1//b/+v/1//j/8v/z//f/8f/3//P/+f/2//r/+//5//j/9//7//j/+f/2//P/7//t//H/6//s//P/7v/w/+z/7v/n/+z/5v/u/+v/7P/t//H/7v/u//D/7//x/+7/8v/v//H/8f/w//D/8P/s/+//8v/x/+7/8f/3//H/8//2//D/9P/y//H/8P/w//D/7//r/+3/5//s/+b/6//o/+v/7P/r/+7/6v/v/+z/6v/s/+j/8P/m/+n/5f/r/+b/6v/s//H/7//x/+3/6//r/+3/7//x/+n/7//r//D/6v/s/+//7P/y/+v/7//q//H/7f/s/+3/6f/r/+z/6P/n/+b/4f/j/9z/4v/b/+D/3//f/93/4//c/+H/3P/d/+D/3P/h/9z/5P/d/+H/3f/j/93/3v/g/9j/3v/X/9v/3//a/93/3f/b/9v/2f/b/93/3P/V/9v/1P/a/9j/2//Y/9j/3P/a/9v/3f/e/97/4P/d/+H/3v/i/+L/5f/l/+D/5f/i/+H/5v/f/+T/4//f/+j/3//o/+H/5f/h/+T/3v/g/9v/4P/b/97/3f/e/97/4P/f/+H/3//f/+H/3v/i/+H/4v/k/+P/5P/l/+P/4v/l/+D/5v/j/+X/4//j/+X/5v/l/+b/5f/l/+X/4//m/+X/5v/l/+X/5v/m/+j/6v/n/+r/6f/n/+j/6P/p/+f/6f/k/+7/5P/r/+f/6f/o/+j/5P/o/+X/5//q/+b/6P/l/+j/6f/k/+r/4f/r/+P/7v/m/+r/5v/q/+f/6//o/+r/7P/q/+3/6v/r/+r/6//o/+v/6f/s/+r/7f/r/+3/7//r/+v/7f/n//D/6f/t/+v/6//r/+r/7P/o/+3/5v/t/+X/6v/o/+z/6f/s/+n/7v/q/+v/7v/p//D/6f/v/+3/7v/t//D/7v/v//D/8P/v//D/7//v//H/7//x//D/8P/w//D/8v/v//H/8f/x//L/8//x//L/9P/w//T/8P/2//T/8v/5//P/+f/z//f/9f/2//b/9v/1//f/9P/4//b/8//5//P/+v/1//j/+P/3//n/+P/6//j/9//6//b/+v/4//b/+v/1//f/+f/1//b/+P/z//j/9f/2//j/8//4//X/+P/3//f/9//4//X/+//1//r/9//5//j/+v/4//v/9//6//r/+f/7//r/+v/7//r/+//5//3/+P/7//v/+P/+//n//P/7//v//P/7//v//P/8//3/+//+//n/AAD6//3//f/5/////P/8////+/////z////+//3/AAD9/wAA///+/wEA/f8DAP3/AgD//wEA/v8CAP7/AgAAAP7/AwD8/wUA/P8DAP3/AgD+/wMA/f8CAP7/AgD//wEA//8AAAEA//8BAP//AQD//wEA//8BAP//AQD//wEA//8BAAAA//8CAP3/AwD/////AgD+/wIA//8AAAEA//8BAAAA//8CAP7/AgD+/wMA/f8CAAAA/v8EAPz/AwD+/wEAAQD+/wIA/v8CAP//AQD//wAAAgD9/wMA/v8AAAIA/v8CAP////8CAP7/AgA8/VYAT4DNpw==\"\n        },\n        \"direction\": \"Request\"\n      }\n    }\n  },\n  {\n    \"connection_id\": 0,\n    \"action\": {\n      \"Data\": {\n        \"data\": {\n          \"Base64\": \"AAAAUwAAAEP1RHpYEDpjaHVuay1zaWduYXR1cmUGACB8Q7H82S5nYng2RHDOYP51sOb8SKz7spstA6nobriT2gU6ZGF0ZQgAAAF7iTpKwJhjx3A=\"\n        },\n        \"direction\": \"Request\"\n      }\n    }\n  },\n  {\n    \"connection_id\": 0,\n    \"action\": {\n      \"Eof\": {\n        \"ok\": true,\n        \"direction\": \"Request\"\n      }\n    }\n  },\n  {\n    \"connection_id\": 0,\n    \"action\": {\n      \"Data\": {\n        \"data\": {\n          \"Base64\": \"AAAAggAAAFW1BZngCzpldmVudC10eXBlBwAPVHJhbnNjcmlwdEV2ZW50DTpjb250ZW50LXR5cGUHABBhcHBsaWNhdGlvbi9qc29uDTptZXNzYWdlLXR5cGUHAAVldmVudHsiVHJhbnNjcmlwdCI6eyJSZXN1bHRzIjpbXX19rFqDKg==\"\n        },\n        \"direction\": \"Response\"\n      }\n    }\n  },\n  {\n    \"connection_id\": 0,\n    \"action\": {\n      \"Data\": {\n        \"data\": {\n          \"Base64\": \"AAAAggAAAFW1BZngCzpldmVudC10eXBlBwAPVHJhbnNjcmlwdEV2ZW50DTpjb250ZW50LXR5cGUHABBhcHBsaWNhdGlvbi9qc29uDTptZXNzYWdlLXR5cGUHAAVldmVudHsiVHJhbnNjcmlwdCI6eyJSZXN1bHRzIjpbXX19rFqDKg==\"\n        },\n        \"direction\": \"Response\"\n      }\n    }\n  },\n  {\n    \"connection_id\": 0,\n    \"action\": {\n      \"Data\": {\n        \"data\": {\n          \"Base64\": \"AAAAggAAAFW1BZngCzpldmVudC10eXBlBwAPVHJhbnNjcmlwdEV2ZW50DTpjb250ZW50LXR5cGUHABBhcHBsaWNhdGlvbi9qc29uDTptZXNzYWdlLXR5cGUHAAVldmVudHsiVHJhbnNjcmlwdCI6eyJSZXN1bHRzIjpbXX19rFqDKg==\"\n        },\n        \"direction\": \"Response\"\n      }\n    }\n  },\n  {\n    \"connection_id\": 0,\n    \"action\": {\n      \"Data\": {\n        \"data\": {\n          \"Base64\": \"AAAB4AAAAFWdq25oCzpldmVudC10eXBlBwAPVHJhbnNjcmlwdEV2ZW50DTpjb250ZW50LXR5cGUHABBhcHBsaWNhdGlvbi9qc29uDTptZXNzYWdlLXR5cGUHAAVldmVudHsiVHJhbnNjcmlwdCI6eyJSZXN1bHRzIjpbeyJBbHRlcm5hdGl2ZXMiOlt7Ikl0ZW1zIjpbeyJDb250ZW50IjoiR29vZCIsIkVuZFRpbWUiOjAuMiwiU3RhcnRUaW1lIjowLjEzLCJUeXBlIjoicHJvbnVuY2lhdGlvbiIsIlZvY2FidWxhcnlGaWx0ZXJNYXRjaCI6ZmFsc2V9LHsiQ29udGVudCI6Ii4iLCJFbmRUaW1lIjowLjIsIlN0YXJ0VGltZSI6MC4yLCJUeXBlIjoicHVuY3R1YXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfV0sIlRyYW5zY3JpcHQiOiJHb29kLiJ9XSwiRW5kVGltZSI6MC4yNCwiSXNQYXJ0aWFsIjp0cnVlLCJSZXN1bHRJZCI6ImI1YmRkZWUwLTRiNjQtNGFiOS1hN2E2LTdlNzc3ZmQ3M2FjOCIsIlN0YXJ0VGltZSI6MC4xM31dfX0RNOFF\"\n        },\n        \"direction\": \"Response\"\n      }\n    }\n  },\n  {\n    \"connection_id\": 0,\n    \"action\": {\n      \"Data\": {\n        \"data\": {\n          \"Base64\": \"AAACTQAAAFWTiEfhCzpldmVudC10eXBlBwAPVHJhbnNjcmlwdEV2ZW50DTpjb250ZW50LXR5cGUHABBhcHBsaWNhdGlvbi9qc29uDTptZXNzYWdlLXR5cGUHAAVldmVudHsiVHJhbnNjcmlwdCI6eyJSZXN1bHRzIjpbeyJBbHRlcm5hdGl2ZXMiOlt7Ikl0ZW1zIjpbeyJDb250ZW50IjoiR29vZCIsIkVuZFRpbWUiOjAuMTksIlN0YXJ0VGltZSI6MC4xMywiVHlwZSI6InByb251bmNpYXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfSx7IkNvbnRlbnQiOiJkYXkiLCJFbmRUaW1lIjowLjMxLCJTdGFydFRpbWUiOjAuMiwiVHlwZSI6InByb251bmNpYXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfSx7IkNvbnRlbnQiOiIuIiwiRW5kVGltZSI6MC4zMSwiU3RhcnRUaW1lIjowLjMxLCJUeXBlIjoicHVuY3R1YXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfV0sIlRyYW5zY3JpcHQiOiJHb29kIGRheS4ifV0sIkVuZFRpbWUiOjAuMzQsIklzUGFydGlhbCI6dHJ1ZSwiUmVzdWx0SWQiOiJiNWJkZGVlMC00YjY0LTRhYjktYTdhNi03ZTc3N2ZkNzNhYzgiLCJTdGFydFRpbWUiOjAuMTN9XX19Tfd4MQ==\"\n        },\n        \"direction\": \"Response\"\n      }\n    }\n  },\n  {\n    \"connection_id\": 0,\n    \"action\": {\n      \"Data\": {\n        \"data\": {\n          \"Base64\": \"AAACTAAAAFWu6G5RCzpldmVudC10eXBlBwAPVHJhbnNjcmlwdEV2ZW50DTpjb250ZW50LXR5cGUHABBhcHBsaWNhdGlvbi9qc29uDTptZXNzYWdlLXR5cGUHAAVldmVudHsiVHJhbnNjcmlwdCI6eyJSZXN1bHRzIjpbeyJBbHRlcm5hdGl2ZXMiOlt7Ikl0ZW1zIjpbeyJDb250ZW50IjoiR29vZCIsIkVuZFRpbWUiOjAuMTksIlN0YXJ0VGltZSI6MC4xMywiVHlwZSI6InByb251bmNpYXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfSx7IkNvbnRlbnQiOiJkYXRlIiwiRW5kVGltZSI6MC41LCJTdGFydFRpbWUiOjAuMiwiVHlwZSI6InByb251bmNpYXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfSx7IkNvbnRlbnQiOiIuIiwiRW5kVGltZSI6MC41LCJTdGFydFRpbWUiOjAuNSwiVHlwZSI6InB1bmN0dWF0aW9uIiwiVm9jYWJ1bGFyeUZpbHRlck1hdGNoIjpmYWxzZX1dLCJUcmFuc2NyaXB0IjoiR29vZCBkYXRlLiJ9XSwiRW5kVGltZSI6MC41NCwiSXNQYXJ0aWFsIjp0cnVlLCJSZXN1bHRJZCI6ImI1YmRkZWUwLTRiNjQtNGFiOS1hN2E2LTdlNzc3ZmQ3M2FjOCIsIlN0YXJ0VGltZSI6MC4xM31dfX06yQgP\"\n        },\n        \"direction\": \"Response\"\n      }\n    }\n  },\n  {\n    \"connection_id\": 0,\n    \"action\": {\n      \"Data\": {\n        \"data\": {\n          \"Base64\": \"AAACUQAAAFU2mD1iCzpldmVudC10eXBlBwAPVHJhbnNjcmlwdEV2ZW50DTpjb250ZW50LXR5cGUHABBhcHBsaWNhdGlvbi9qc29uDTptZXNzYWdlLXR5cGUHAAVldmVudHsiVHJhbnNjcmlwdCI6eyJSZXN1bHRzIjpbeyJBbHRlcm5hdGl2ZXMiOlt7Ikl0ZW1zIjpbeyJDb250ZW50IjoiR29vZCIsIkVuZFRpbWUiOjAuMTksIlN0YXJ0VGltZSI6MC4xMywiVHlwZSI6InByb251bmNpYXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfSx7IkNvbnRlbnQiOiJkYXkiLCJFbmRUaW1lIjowLjM0LCJTdGFydFRpbWUiOjAuMiwiVHlwZSI6InByb251bmNpYXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfSx7IkNvbnRlbnQiOiJ0byIsIkVuZFRpbWUiOjAuNiwiU3RhcnRUaW1lIjowLjM1LCJUeXBlIjoicHJvbnVuY2lhdGlvbiIsIlZvY2FidWxhcnlGaWx0ZXJNYXRjaCI6ZmFsc2V9XSwiVHJhbnNjcmlwdCI6Ikdvb2QgZGF5IHRvIn1dLCJFbmRUaW1lIjowLjY0LCJJc1BhcnRpYWwiOnRydWUsIlJlc3VsdElkIjoiYjViZGRlZTAtNGI2NC00YWI5LWE3YTYtN2U3NzdmZDczYWM4IiwiU3RhcnRUaW1lIjowLjEzfV19fcmyJDE=\"\n        },\n        \"direction\": \"Response\"\n      }\n    }\n  },\n  {\n    \"connection_id\": 0,\n    \"action\": {\n      \"Data\": {\n        \"data\": {\n          \"Base64\": \"AAADIQAAAFUEFg4ICzpldmVudC10eXBlBwAPVHJhbnNjcmlwdEV2ZW50DTpjb250ZW50LXR5cGUHABBhcHBsaWNhdGlvbi9qc29uDTptZXNzYWdlLXR5cGUHAAVldmVudHsiVHJhbnNjcmlwdCI6eyJSZXN1bHRzIjpbeyJBbHRlcm5hdGl2ZXMiOlt7Ikl0ZW1zIjpbeyJDb250ZW50IjoiR29vZCIsIkVuZFRpbWUiOjAuMTksIlN0YXJ0VGltZSI6MC4xMywiVHlwZSI6InByb251bmNpYXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfSx7IkNvbnRlbnQiOiJkYXkiLCJFbmRUaW1lIjowLjM0LCJTdGFydFRpbWUiOjAuMiwiVHlwZSI6InByb251bmNpYXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfSx7IkNvbnRlbnQiOiJ0byIsIkVuZFRpbWUiOjAuNTcsIlN0YXJ0VGltZSI6MC4zNSwiVHlwZSI6InByb251bmNpYXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfSx7IkNvbnRlbnQiOiJ5b3UiLCJFbmRUaW1lIjowLjcxLCJTdGFydFRpbWUiOjAuNTgsIlR5cGUiOiJwcm9udW5jaWF0aW9uIiwiVm9jYWJ1bGFyeUZpbHRlck1hdGNoIjpmYWxzZX0seyJDb250ZW50IjoiLiIsIkVuZFRpbWUiOjAuNzEsIlN0YXJ0VGltZSI6MC43MSwiVHlwZSI6InB1bmN0dWF0aW9uIiwiVm9jYWJ1bGFyeUZpbHRlck1hdGNoIjpmYWxzZX1dLCJUcmFuc2NyaXB0IjoiR29vZCBkYXkgdG8geW91LiJ9XSwiRW5kVGltZSI6MC43NCwiSXNQYXJ0aWFsIjp0cnVlLCJSZXN1bHRJZCI6ImI1YmRkZWUwLTRiNjQtNGFiOS1hN2E2LTdlNzc3ZmQ3M2FjOCIsIlN0YXJ0VGltZSI6MC4xM31dfX3sm8SY\"\n        },\n        \"direction\": \"Response\"\n      }\n    }\n  },\n  {\n    \"connection_id\": 0,\n    \"action\": {\n      \"Data\": {\n        \"data\": {\n          \"Base64\": \"AAADmQAAAFUkoU3dCzpldmVudC10eXBlBwAPVHJhbnNjcmlwdEV2ZW50DTpjb250ZW50LXR5cGUHABBhcHBsaWNhdGlvbi9qc29uDTptZXNzYWdlLXR5cGUHAAVldmVudHsiVHJhbnNjcmlwdCI6eyJSZXN1bHRzIjpbeyJBbHRlcm5hdGl2ZXMiOlt7Ikl0ZW1zIjpbeyJDb250ZW50IjoiR29vZCIsIkVuZFRpbWUiOjAuMTksIlN0YXJ0VGltZSI6MC4xMywiVHlwZSI6InByb251bmNpYXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfSx7IkNvbnRlbnQiOiJkYXkiLCJFbmRUaW1lIjowLjM0LCJTdGFydFRpbWUiOjAuMiwiVHlwZSI6InByb251bmNpYXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfSx7IkNvbnRlbnQiOiJ0byIsIkVuZFRpbWUiOjAuNTcsIlN0YXJ0VGltZSI6MC4zNSwiVHlwZSI6InByb251bmNpYXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfSx7IkNvbnRlbnQiOiJ5b3UiLCJFbmRUaW1lIjowLjcsIlN0YXJ0VGltZSI6MC41OCwiVHlwZSI6InByb251bmNpYXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfSx7IkNvbnRlbnQiOiJ0cmFuc2NyaWJlIiwiRW5kVGltZSI6MS40MSwiU3RhcnRUaW1lIjowLjcxLCJUeXBlIjoicHJvbnVuY2lhdGlvbiIsIlZvY2FidWxhcnlGaWx0ZXJNYXRjaCI6ZmFsc2V9LHsiQ29udGVudCI6Ii4iLCJFbmRUaW1lIjoxLjQxLCJTdGFydFRpbWUiOjEuNDEsIlR5cGUiOiJwdW5jdHVhdGlvbiIsIlZvY2FidWxhcnlGaWx0ZXJNYXRjaCI6ZmFsc2V9XSwiVHJhbnNjcmlwdCI6Ikdvb2QgZGF5IHRvIHlvdSB0cmFuc2NyaWJlLiJ9XSwiRW5kVGltZSI6MS40NCwiSXNQYXJ0aWFsIjp0cnVlLCJSZXN1bHRJZCI6ImI1YmRkZWUwLTRiNjQtNGFiOS1hN2E2LTdlNzc3ZmQ3M2FjOCIsIlN0YXJ0VGltZSI6MC4xM31dfX3qJzr0\"\n        },\n        \"direction\": \"Response\"\n      }\n    }\n  },\n  {\n    \"connection_id\": 0,\n    \"action\": {\n      \"Data\": {\n        \"data\": {\n          \"Base64\": \"AAAD8QAAAFWN43FRCzpldmVudC10eXBlBwAPVHJhbnNjcmlwdEV2ZW50DTpjb250ZW50LXR5cGUHABBhcHBsaWNhdGlvbi9qc29uDTptZXNzYWdlLXR5cGUHAAVldmVudHsiVHJhbnNjcmlwdCI6eyJSZXN1bHRzIjpbeyJBbHRlcm5hdGl2ZXMiOlt7Ikl0ZW1zIjpbeyJDb25maWRlbmNlIjoxLjAsIkNvbnRlbnQiOiJHb29kIiwiRW5kVGltZSI6MC4yOCwiU3RhcnRUaW1lIjowLjEzLCJUeXBlIjoicHJvbnVuY2lhdGlvbiIsIlZvY2FidWxhcnlGaWx0ZXJNYXRjaCI6ZmFsc2V9LHsiQ29uZmlkZW5jZSI6MS4wLCJDb250ZW50IjoiZGF5IiwiRW5kVGltZSI6MC41MSwiU3RhcnRUaW1lIjowLjI5LCJUeXBlIjoicHJvbnVuY2lhdGlvbiIsIlZvY2FidWxhcnlGaWx0ZXJNYXRjaCI6ZmFsc2V9LHsiQ29uZmlkZW5jZSI6MS4wLCJDb250ZW50IjoidG8iLCJFbmRUaW1lIjowLjY0LCJTdGFydFRpbWUiOjAuNTIsIlR5cGUiOiJwcm9udW5jaWF0aW9uIiwiVm9jYWJ1bGFyeUZpbHRlck1hdGNoIjpmYWxzZX0seyJDb25maWRlbmNlIjoxLjAsIkNvbnRlbnQiOiJ5b3UiLCJFbmRUaW1lIjowLjc5LCJTdGFydFRpbWUiOjAuNjUsIlR5cGUiOiJwcm9udW5jaWF0aW9uIiwiVm9jYWJ1bGFyeUZpbHRlck1hdGNoIjpmYWxzZX0seyJDb25maWRlbmNlIjowLjk5LCJDb250ZW50IjoidHJhbnNjcmliZSIsIkVuZFRpbWUiOjEuNjcsIlN0YXJ0VGltZSI6MC44LCJUeXBlIjoicHJvbnVuY2lhdGlvbiIsIlZvY2FidWxhcnlGaWx0ZXJNYXRjaCI6ZmFsc2V9LHsiQ29udGVudCI6Ii4iLCJFbmRUaW1lIjoxLjY3LCJTdGFydFRpbWUiOjEuNjcsIlR5cGUiOiJwdW5jdHVhdGlvbiIsIlZvY2FidWxhcnlGaWx0ZXJNYXRjaCI6ZmFsc2V9XSwiVHJhbnNjcmlwdCI6Ikdvb2QgZGF5IHRvIHlvdSB0cmFuc2NyaWJlLiJ9XSwiRW5kVGltZSI6MS42NywiSXNQYXJ0aWFsIjpmYWxzZSwiUmVzdWx0SWQiOiJiNWJkZGVlMC00YjY0LTRhYjktYTdhNi03ZTc3N2ZkNzNhYzgiLCJTdGFydFRpbWUiOjAuMTN9XX197jQqbg==\"\n        },\n        \"direction\": \"Response\"\n      }\n    }\n  },\n  {\n    \"connection_id\": 0,\n    \"action\": {\n      \"Data\": {\n        \"data\": {\n          \"Base64\": \"AAAAggAAAFW1BZngCzpldmVudC10eXBlBwAPVHJhbnNjcmlwdEV2ZW50DTpjb250ZW50LXR5cGUHABBhcHBsaWNhdGlvbi9qc29uDTptZXNzYWdlLXR5cGUHAAVldmVudHsiVHJhbnNjcmlwdCI6eyJSZXN1bHRzIjpbXX19rFqDKg==\"\n        },\n        \"direction\": \"Response\"\n      }\n    }\n  },\n  {\n    \"connection_id\": 0,\n    \"action\": {\n      \"Data\": {\n        \"data\": {\n          \"Base64\": \"AAAAggAAAFW1BZngCzpldmVudC10eXBlBwAPVHJhbnNjcmlwdEV2ZW50DTpjb250ZW50LXR5cGUHABBhcHBsaWNhdGlvbi9qc29uDTptZXNzYWdlLXR5cGUHAAVldmVudHsiVHJhbnNjcmlwdCI6eyJSZXN1bHRzIjpbXX19rFqDKg==\"\n        },\n        \"direction\": \"Response\"\n      }\n    }\n  },\n  {\n    \"connection_id\": 0,\n    \"action\": {\n      \"Data\": {\n        \"data\": {\n          \"Base64\": \"AAAB4wAAAFXaCxS4CzpldmVudC10eXBlBwAPVHJhbnNjcmlwdEV2ZW50DTpjb250ZW50LXR5cGUHABBhcHBsaWNhdGlvbi9qc29uDTptZXNzYWdlLXR5cGUHAAVldmVudHsiVHJhbnNjcmlwdCI6eyJSZXN1bHRzIjpbeyJBbHRlcm5hdGl2ZXMiOlt7Ikl0ZW1zIjpbeyJDb250ZW50IjoiVGhpcyIsIkVuZFRpbWUiOjIuMzEsIlN0YXJ0VGltZSI6Mi4yMywiVHlwZSI6InByb251bmNpYXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfSx7IkNvbnRlbnQiOiIuIiwiRW5kVGltZSI6Mi4zMSwiU3RhcnRUaW1lIjoyLjMxLCJUeXBlIjoicHVuY3R1YXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfV0sIlRyYW5zY3JpcHQiOiJUaGlzLiJ9XSwiRW5kVGltZSI6Mi4zNCwiSXNQYXJ0aWFsIjp0cnVlLCJSZXN1bHRJZCI6IjJiOWVjYzgyLTEzMzgtNDJhNy1iMzI4LTdhZmM3Y2MxZjRhNSIsIlN0YXJ0VGltZSI6Mi4yM31dfX3kwjuv\"\n        },\n        \"direction\": \"Response\"\n      }\n    }\n  },\n  {\n    \"connection_id\": 0,\n    \"action\": {\n      \"Data\": {\n        \"data\": {\n          \"Base64\": \"AAAB6AAAAFWt2yWpCzpldmVudC10eXBlBwAPVHJhbnNjcmlwdEV2ZW50DTpjb250ZW50LXR5cGUHABBhcHBsaWNhdGlvbi9qc29uDTptZXNzYWdlLXR5cGUHAAVldmVudHsiVHJhbnNjcmlwdCI6eyJSZXN1bHRzIjpbeyJBbHRlcm5hdGl2ZXMiOlt7Ikl0ZW1zIjpbeyJDb250ZW50IjoiVGhpcyIsIkVuZFRpbWUiOjIuMzQsIlN0YXJ0VGltZSI6Mi4yMywiVHlwZSI6InByb251bmNpYXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfSx7IkNvbnRlbnQiOiJpcyIsIkVuZFRpbWUiOjIuNDEsIlN0YXJ0VGltZSI6Mi4zNSwiVHlwZSI6InByb251bmNpYXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfV0sIlRyYW5zY3JpcHQiOiJUaGlzIGlzIn1dLCJFbmRUaW1lIjoyLjQ0LCJJc1BhcnRpYWwiOnRydWUsIlJlc3VsdElkIjoiMmI5ZWNjODItMTMzOC00MmE3LWIzMjgtN2FmYzdjYzFmNGE1IiwiU3RhcnRUaW1lIjoyLjIzfV19fQzFLMI=\"\n        },\n        \"direction\": \"Response\"\n      }\n    }\n  },\n  {\n    \"connection_id\": 0,\n    \"action\": {\n      \"Data\": {\n        \"data\": {\n          \"Base64\": \"AAAB6AAAAFWt2yWpCzpldmVudC10eXBlBwAPVHJhbnNjcmlwdEV2ZW50DTpjb250ZW50LXR5cGUHABBhcHBsaWNhdGlvbi9qc29uDTptZXNzYWdlLXR5cGUHAAVldmVudHsiVHJhbnNjcmlwdCI6eyJSZXN1bHRzIjpbeyJBbHRlcm5hdGl2ZXMiOlt7Ikl0ZW1zIjpbeyJDb250ZW50IjoiVGhpcyIsIkVuZFRpbWUiOjIuMzQsIlN0YXJ0VGltZSI6Mi4yMywiVHlwZSI6InByb251bmNpYXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfSx7IkNvbnRlbnQiOiJpcyIsIkVuZFRpbWUiOjIuNDgsIlN0YXJ0VGltZSI6Mi4zNSwiVHlwZSI6InByb251bmNpYXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfV0sIlRyYW5zY3JpcHQiOiJUaGlzIGlzIn1dLCJFbmRUaW1lIjoyLjY0LCJJc1BhcnRpYWwiOnRydWUsIlJlc3VsdElkIjoiMmI5ZWNjODItMTMzOC00MmE3LWIzMjgtN2FmYzdjYzFmNGE1IiwiU3RhcnRUaW1lIjoyLjIzfV19fY23fdk=\"\n        },\n        \"direction\": \"Response\"\n      }\n    }\n  },\n  {\n    \"connection_id\": 0,\n    \"action\": {\n      \"Data\": {\n        \"data\": {\n          \"Base64\": \"AAACuQAAAFUuPLF8CzpldmVudC10eXBlBwAPVHJhbnNjcmlwdEV2ZW50DTpjb250ZW50LXR5cGUHABBhcHBsaWNhdGlvbi9qc29uDTptZXNzYWdlLXR5cGUHAAVldmVudHsiVHJhbnNjcmlwdCI6eyJSZXN1bHRzIjpbeyJBbHRlcm5hdGl2ZXMiOlt7Ikl0ZW1zIjpbeyJDb250ZW50IjoiVGhpcyIsIkVuZFRpbWUiOjIuMzQsIlN0YXJ0VGltZSI6Mi4yMywiVHlwZSI6InByb251bmNpYXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfSx7IkNvbnRlbnQiOiJpcyIsIkVuZFRpbWUiOjIuNDcsIlN0YXJ0VGltZSI6Mi4zNSwiVHlwZSI6InByb251bmNpYXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfSx7IkNvbnRlbnQiOiJQYXVsIiwiRW5kVGltZSI6Mi43MSwiU3RhcnRUaW1lIjoyLjQ4LCJUeXBlIjoicHJvbnVuY2lhdGlvbiIsIlZvY2FidWxhcnlGaWx0ZXJNYXRjaCI6ZmFsc2V9LHsiQ29udGVudCI6Ii4iLCJFbmRUaW1lIjoyLjcxLCJTdGFydFRpbWUiOjIuNzEsIlR5cGUiOiJwdW5jdHVhdGlvbiIsIlZvY2FidWxhcnlGaWx0ZXJNYXRjaCI6ZmFsc2V9XSwiVHJhbnNjcmlwdCI6IlRoaXMgaXMgUGF1bC4ifV0sIkVuZFRpbWUiOjIuNzQsIklzUGFydGlhbCI6dHJ1ZSwiUmVzdWx0SWQiOiIyYjllY2M4Mi0xMzM4LTQyYTctYjMyOC03YWZjN2NjMWY0YTUiLCJTdGFydFRpbWUiOjIuMjN9XX19iwFRHQ==\"\n        },\n        \"direction\": \"Response\"\n      }\n    }\n  },\n  {\n    \"connection_id\": 0,\n    \"action\": {\n      \"Data\": {\n        \"data\": {\n          \"Base64\": \"AAACuwAAAFVU/OIcCzpldmVudC10eXBlBwAPVHJhbnNjcmlwdEV2ZW50DTpjb250ZW50LXR5cGUHABBhcHBsaWNhdGlvbi9qc29uDTptZXNzYWdlLXR5cGUHAAVldmVudHsiVHJhbnNjcmlwdCI6eyJSZXN1bHRzIjpbeyJBbHRlcm5hdGl2ZXMiOlt7Ikl0ZW1zIjpbeyJDb250ZW50IjoiVGhpcyIsIkVuZFRpbWUiOjIuMzQsIlN0YXJ0VGltZSI6Mi4yMywiVHlwZSI6InByb251bmNpYXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfSx7IkNvbnRlbnQiOiJpcyIsIkVuZFRpbWUiOjIuNDcsIlN0YXJ0VGltZSI6Mi4zNSwiVHlwZSI6InByb251bmNpYXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfSx7IkNvbnRlbnQiOiJQb2xseSIsIkVuZFRpbWUiOjIuODEsIlN0YXJ0VGltZSI6Mi40OCwiVHlwZSI6InByb251bmNpYXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfSx7IkNvbnRlbnQiOiIuIiwiRW5kVGltZSI6Mi44MSwiU3RhcnRUaW1lIjoyLjgxLCJUeXBlIjoicHVuY3R1YXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfV0sIlRyYW5zY3JpcHQiOiJUaGlzIGlzIFBvbGx5LiJ9XSwiRW5kVGltZSI6Mi44NCwiSXNQYXJ0aWFsIjp0cnVlLCJSZXN1bHRJZCI6IjJiOWVjYzgyLTEzMzgtNDJhNy1iMzI4LTdhZmM3Y2MxZjRhNSIsIlN0YXJ0VGltZSI6Mi4yM31dfX22vfhB\"\n        },\n        \"direction\": \"Response\"\n      }\n    }\n  },\n  {\n    \"connection_id\": 0,\n    \"action\": {\n      \"Data\": {\n        \"data\": {\n          \"Base64\": \"AAACwAAAAFXa/jPCCzpldmVudC10eXBlBwAPVHJhbnNjcmlwdEV2ZW50DTpjb250ZW50LXR5cGUHABBhcHBsaWNhdGlvbi9qc29uDTptZXNzYWdlLXR5cGUHAAVldmVudHsiVHJhbnNjcmlwdCI6eyJSZXN1bHRzIjpbeyJBbHRlcm5hdGl2ZXMiOlt7Ikl0ZW1zIjpbeyJDb250ZW50IjoiVGhpcyIsIkVuZFRpbWUiOjIuMzQsIlN0YXJ0VGltZSI6Mi4yMywiVHlwZSI6InByb251bmNpYXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfSx7IkNvbnRlbnQiOiJpcyIsIkVuZFRpbWUiOjIuNDcsIlN0YXJ0VGltZSI6Mi4zNSwiVHlwZSI6InByb251bmNpYXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfSx7IkNvbnRlbnQiOiJQb2xseSIsIkVuZFRpbWUiOjIuODEsIlN0YXJ0VGltZSI6Mi40OCwiVHlwZSI6InByb251bmNpYXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfSx7IkNvbnRlbnQiOiJ0byIsIkVuZFRpbWUiOjIuOTEsIlN0YXJ0VGltZSI6Mi44MiwiVHlwZSI6InByb251bmNpYXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfV0sIlRyYW5zY3JpcHQiOiJUaGlzIGlzIFBvbGx5IHRvIn1dLCJFbmRUaW1lIjoyLjk0LCJJc1BhcnRpYWwiOnRydWUsIlJlc3VsdElkIjoiMmI5ZWNjODItMTMzOC00MmE3LWIzMjgtN2FmYzdjYzFmNGE1IiwiU3RhcnRUaW1lIjoyLjIzfV19feiY030=\"\n        },\n        \"direction\": \"Response\"\n      }\n    }\n  },\n  {\n    \"connection_id\": 0,\n    \"action\": {\n      \"Data\": {\n        \"data\": {\n          \"Base64\": \"AAAAggAAAFW1BZngCzpldmVudC10eXBlBwAPVHJhbnNjcmlwdEV2ZW50DTpjb250ZW50LXR5cGUHABBhcHBsaWNhdGlvbi9qc29uDTptZXNzYWdlLXR5cGUHAAVldmVudHsiVHJhbnNjcmlwdCI6eyJSZXN1bHRzIjpbXX19rFqDKg==\"\n        },\n        \"direction\": \"Response\"\n      }\n    }\n  },\n  {\n    \"connection_id\": 0,\n    \"action\": {\n      \"Data\": {\n        \"data\": {\n          \"Base64\": \"AAACwAAAAFXa/jPCCzpldmVudC10eXBlBwAPVHJhbnNjcmlwdEV2ZW50DTpjb250ZW50LXR5cGUHABBhcHBsaWNhdGlvbi9qc29uDTptZXNzYWdlLXR5cGUHAAVldmVudHsiVHJhbnNjcmlwdCI6eyJSZXN1bHRzIjpbeyJBbHRlcm5hdGl2ZXMiOlt7Ikl0ZW1zIjpbeyJDb250ZW50IjoiVGhpcyIsIkVuZFRpbWUiOjIuMzQsIlN0YXJ0VGltZSI6Mi4yMywiVHlwZSI6InByb251bmNpYXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfSx7IkNvbnRlbnQiOiJpcyIsIkVuZFRpbWUiOjIuNDcsIlN0YXJ0VGltZSI6Mi4zNSwiVHlwZSI6InByb251bmNpYXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfSx7IkNvbnRlbnQiOiJQb2xseSIsIkVuZFRpbWUiOjIuODEsIlN0YXJ0VGltZSI6Mi40OCwiVHlwZSI6InByb251bmNpYXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfSx7IkNvbnRlbnQiOiJ0byIsIkVuZFRpbWUiOjIuOTgsIlN0YXJ0VGltZSI6Mi44MiwiVHlwZSI6InByb251bmNpYXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfV0sIlRyYW5zY3JpcHQiOiJUaGlzIGlzIFBvbGx5IHRvIn1dLCJFbmRUaW1lIjozLjA0LCJJc1BhcnRpYWwiOnRydWUsIlJlc3VsdElkIjoiMmI5ZWNjODItMTMzOC00MmE3LWIzMjgtN2FmYzdjYzFmNGE1IiwiU3RhcnRUaW1lIjoyLjIzfV19fUbBSYE=\"\n        },\n        \"direction\": \"Response\"\n      }\n    }\n  },\n  {\n    \"connection_id\": 0,\n    \"action\": {\n      \"Data\": {\n        \"data\": {\n          \"Base64\": \"AAADKAAAAFUJBmx5CzpldmVudC10eXBlBwAPVHJhbnNjcmlwdEV2ZW50DTpjb250ZW50LXR5cGUHABBhcHBsaWNhdGlvbi9qc29uDTptZXNzYWdlLXR5cGUHAAVldmVudHsiVHJhbnNjcmlwdCI6eyJSZXN1bHRzIjpbeyJBbHRlcm5hdGl2ZXMiOlt7Ikl0ZW1zIjpbeyJDb250ZW50IjoiVGhpcyIsIkVuZFRpbWUiOjIuMzQsIlN0YXJ0VGltZSI6Mi4yMywiVHlwZSI6InByb251bmNpYXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfSx7IkNvbnRlbnQiOiJpcyIsIkVuZFRpbWUiOjIuNDcsIlN0YXJ0VGltZSI6Mi4zNSwiVHlwZSI6InByb251bmNpYXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfSx7IkNvbnRlbnQiOiJQb2xseSIsIkVuZFRpbWUiOjIuODEsIlN0YXJ0VGltZSI6Mi40OCwiVHlwZSI6InByb251bmNpYXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfSx7IkNvbnRlbnQiOiJ0YWxrIiwiRW5kVGltZSI6My4xMSwiU3RhcnRUaW1lIjoyLjgyLCJUeXBlIjoicHJvbnVuY2lhdGlvbiIsIlZvY2FidWxhcnlGaWx0ZXJNYXRjaCI6ZmFsc2V9LHsiQ29udGVudCI6Ii4iLCJFbmRUaW1lIjozLjExLCJTdGFydFRpbWUiOjMuMTEsIlR5cGUiOiJwdW5jdHVhdGlvbiIsIlZvY2FidWxhcnlGaWx0ZXJNYXRjaCI6ZmFsc2V9XSwiVHJhbnNjcmlwdCI6IlRoaXMgaXMgUG9sbHkgdGFsay4ifV0sIkVuZFRpbWUiOjMuMTQsIklzUGFydGlhbCI6dHJ1ZSwiUmVzdWx0SWQiOiIyYjllY2M4Mi0xMzM4LTQyYTctYjMyOC03YWZjN2NjMWY0YTUiLCJTdGFydFRpbWUiOjIuMjN9XX19QuQVbw==\"\n        },\n        \"direction\": \"Response\"\n      }\n    }\n  },\n  {\n    \"connection_id\": 0,\n    \"action\": {\n      \"Data\": {\n        \"data\": {\n          \"Base64\": \"AAACuwAAAFVU/OIcCzpldmVudC10eXBlBwAPVHJhbnNjcmlwdEV2ZW50DTpjb250ZW50LXR5cGUHABBhcHBsaWNhdGlvbi9qc29uDTptZXNzYWdlLXR5cGUHAAVldmVudHsiVHJhbnNjcmlwdCI6eyJSZXN1bHRzIjpbeyJBbHRlcm5hdGl2ZXMiOlt7Ikl0ZW1zIjpbeyJDb250ZW50IjoiVGhpcyIsIkVuZFRpbWUiOjIuMzQsIlN0YXJ0VGltZSI6Mi4yMywiVHlwZSI6InByb251bmNpYXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfSx7IkNvbnRlbnQiOiJpcyIsIkVuZFRpbWUiOjIuNDcsIlN0YXJ0VGltZSI6Mi4zNSwiVHlwZSI6InByb251bmNpYXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfSx7IkNvbnRlbnQiOiJQb2xseSIsIkVuZFRpbWUiOjIuODEsIlN0YXJ0VGltZSI6Mi40OCwiVHlwZSI6InByb251bmNpYXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfSx7IkNvbnRlbnQiOiIuIiwiRW5kVGltZSI6Mi44MSwiU3RhcnRUaW1lIjoyLjgxLCJUeXBlIjoicHVuY3R1YXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfV0sIlRyYW5zY3JpcHQiOiJUaGlzIGlzIFBvbGx5LiJ9XSwiRW5kVGltZSI6My4yNCwiSXNQYXJ0aWFsIjp0cnVlLCJSZXN1bHRJZCI6IjJiOWVjYzgyLTEzMzgtNDJhNy1iMzI4LTdhZmM3Y2MxZjRhNSIsIlN0YXJ0VGltZSI6Mi4yM31dfX3OJREz\"\n        },\n        \"direction\": \"Response\"\n      }\n    }\n  },\n  {\n    \"connection_id\": 0,\n    \"action\": {\n      \"Data\": {\n        \"data\": {\n          \"Base64\": \"AAADLgAAAFWGRpnZCzpldmVudC10eXBlBwAPVHJhbnNjcmlwdEV2ZW50DTpjb250ZW50LXR5cGUHABBhcHBsaWNhdGlvbi9qc29uDTptZXNzYWdlLXR5cGUHAAVldmVudHsiVHJhbnNjcmlwdCI6eyJSZXN1bHRzIjpbeyJBbHRlcm5hdGl2ZXMiOlt7Ikl0ZW1zIjpbeyJDb250ZW50IjoiVGhpcyIsIkVuZFRpbWUiOjIuMzQsIlN0YXJ0VGltZSI6Mi4yMywiVHlwZSI6InByb251bmNpYXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfSx7IkNvbnRlbnQiOiJpcyIsIkVuZFRpbWUiOjIuNDcsIlN0YXJ0VGltZSI6Mi4zNSwiVHlwZSI6InByb251bmNpYXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfSx7IkNvbnRlbnQiOiJQb2xseSIsIkVuZFRpbWUiOjIuODEsIlN0YXJ0VGltZSI6Mi40OCwiVHlwZSI6InByb251bmNpYXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfSx7IkNvbnRlbnQiOiJ0YWxraW5nIiwiRW5kVGltZSI6My4yOCwiU3RhcnRUaW1lIjoyLjgyLCJUeXBlIjoicHJvbnVuY2lhdGlvbiIsIlZvY2FidWxhcnlGaWx0ZXJNYXRjaCI6ZmFsc2V9LHsiQ29udGVudCI6Ii4iLCJFbmRUaW1lIjozLjI4LCJTdGFydFRpbWUiOjMuMjgsIlR5cGUiOiJwdW5jdHVhdGlvbiIsIlZvY2FidWxhcnlGaWx0ZXJNYXRjaCI6ZmFsc2V9XSwiVHJhbnNjcmlwdCI6IlRoaXMgaXMgUG9sbHkgdGFsa2luZy4ifV0sIkVuZFRpbWUiOjMuMzQsIklzUGFydGlhbCI6dHJ1ZSwiUmVzdWx0SWQiOiIyYjllY2M4Mi0xMzM4LTQyYTctYjMyOC03YWZjN2NjMWY0YTUiLCJTdGFydFRpbWUiOjIuMjN9XX19d3d0qw==\"\n        },\n        \"direction\": \"Response\"\n      }\n    }\n  },\n  {\n    \"connection_id\": 0,\n    \"action\": {\n      \"Data\": {\n        \"data\": {\n          \"Base64\": \"AAADMwAAAFUeNsrqCzpldmVudC10eXBlBwAPVHJhbnNjcmlwdEV2ZW50DTpjb250ZW50LXR5cGUHABBhcHBsaWNhdGlvbi9qc29uDTptZXNzYWdlLXR5cGUHAAVldmVudHsiVHJhbnNjcmlwdCI6eyJSZXN1bHRzIjpbeyJBbHRlcm5hdGl2ZXMiOlt7Ikl0ZW1zIjpbeyJDb250ZW50IjoiVGhpcyIsIkVuZFRpbWUiOjIuMzQsIlN0YXJ0VGltZSI6Mi4yMywiVHlwZSI6InByb251bmNpYXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfSx7IkNvbnRlbnQiOiJpcyIsIkVuZFRpbWUiOjIuNDcsIlN0YXJ0VGltZSI6Mi4zNSwiVHlwZSI6InByb251bmNpYXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfSx7IkNvbnRlbnQiOiJQb2xseSIsIkVuZFRpbWUiOjIuODEsIlN0YXJ0VGltZSI6Mi40OCwiVHlwZSI6InByb251bmNpYXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfSx7IkNvbnRlbnQiOiJ0YWxraW5nIiwiRW5kVGltZSI6My4yNywiU3RhcnRUaW1lIjoyLjgyLCJUeXBlIjoicHJvbnVuY2lhdGlvbiIsIlZvY2FidWxhcnlGaWx0ZXJNYXRjaCI6ZmFsc2V9LHsiQ29udGVudCI6InRvIiwiRW5kVGltZSI6My40MSwiU3RhcnRUaW1lIjozLjI4LCJUeXBlIjoicHJvbnVuY2lhdGlvbiIsIlZvY2FidWxhcnlGaWx0ZXJNYXRjaCI6ZmFsc2V9XSwiVHJhbnNjcmlwdCI6IlRoaXMgaXMgUG9sbHkgdGFsa2luZyB0byJ9XSwiRW5kVGltZSI6My40NCwiSXNQYXJ0aWFsIjp0cnVlLCJSZXN1bHRJZCI6IjJiOWVjYzgyLTEzMzgtNDJhNy1iMzI4LTdhZmM3Y2MxZjRhNSIsIlN0YXJ0VGltZSI6Mi4yM31dfX0c5Lx3\"\n        },\n        \"direction\": \"Response\"\n      }\n    }\n  },\n  {\n    \"connection_id\": 0,\n    \"action\": {\n      \"Data\": {\n        \"data\": {\n          \"Base64\": \"AAAEAQAAAFXY0hG0CzpldmVudC10eXBlBwAPVHJhbnNjcmlwdEV2ZW50DTpjb250ZW50LXR5cGUHABBhcHBsaWNhdGlvbi9qc29uDTptZXNzYWdlLXR5cGUHAAVldmVudHsiVHJhbnNjcmlwdCI6eyJSZXN1bHRzIjpbeyJBbHRlcm5hdGl2ZXMiOlt7Ikl0ZW1zIjpbeyJDb250ZW50IjoiVGhpcyIsIkVuZFRpbWUiOjIuMzQsIlN0YXJ0VGltZSI6Mi4yMywiVHlwZSI6InByb251bmNpYXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfSx7IkNvbnRlbnQiOiJpcyIsIkVuZFRpbWUiOjIuNDcsIlN0YXJ0VGltZSI6Mi4zNSwiVHlwZSI6InByb251bmNpYXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfSx7IkNvbnRlbnQiOiJQb2xseSIsIkVuZFRpbWUiOjIuODEsIlN0YXJ0VGltZSI6Mi40OCwiVHlwZSI6InByb251bmNpYXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfSx7IkNvbnRlbnQiOiJ0YWxraW5nIiwiRW5kVGltZSI6My4yNywiU3RhcnRUaW1lIjoyLjgyLCJUeXBlIjoicHJvbnVuY2lhdGlvbiIsIlZvY2FidWxhcnlGaWx0ZXJNYXRjaCI6ZmFsc2V9LHsiQ29udGVudCI6InRvIiwiRW5kVGltZSI6My4zOSwiU3RhcnRUaW1lIjozLjI4LCJUeXBlIjoicHJvbnVuY2lhdGlvbiIsIlZvY2FidWxhcnlGaWx0ZXJNYXRjaCI6ZmFsc2V9LHsiQ29udGVudCI6InlvdSIsIkVuZFRpbWUiOjMuNTEsIlN0YXJ0VGltZSI6My40LCJUeXBlIjoicHJvbnVuY2lhdGlvbiIsIlZvY2FidWxhcnlGaWx0ZXJNYXRjaCI6ZmFsc2V9LHsiQ29udGVudCI6Ii4iLCJFbmRUaW1lIjozLjUxLCJTdGFydFRpbWUiOjMuNTEsIlR5cGUiOiJwdW5jdHVhdGlvbiIsIlZvY2FidWxhcnlGaWx0ZXJNYXRjaCI6ZmFsc2V9XSwiVHJhbnNjcmlwdCI6IlRoaXMgaXMgUG9sbHkgdGFsa2luZyB0byB5b3UuIn1dLCJFbmRUaW1lIjozLjU0LCJJc1BhcnRpYWwiOnRydWUsIlJlc3VsdElkIjoiMmI5ZWNjODItMTMzOC00MmE3LWIzMjgtN2FmYzdjYzFmNGE1IiwiU3RhcnRUaW1lIjoyLjIzfV19fTwJkB0=\"\n        },\n        \"direction\": \"Response\"\n      }\n    }\n  },\n  {\n    \"connection_id\": 0,\n    \"action\": {\n      \"Data\": {\n        \"data\": {\n          \"Base64\": \"AAAAggAAAFW1BZngCzpldmVudC10eXBlBwAPVHJhbnNjcmlwdEV2ZW50DTpjb250ZW50LXR5cGUHABBhcHBsaWNhdGlvbi9qc29uDTptZXNzYWdlLXR5cGUHAAVldmVudHsiVHJhbnNjcmlwdCI6eyJSZXN1bHRzIjpbXX19rFqDKg==\"\n        },\n        \"direction\": \"Response\"\n      }\n    }\n  },\n  {\n    \"connection_id\": 0,\n    \"action\": {\n      \"Data\": {\n        \"data\": {\n          \"Base64\": \"AAAECgAAAFWvAiClCzpldmVudC10eXBlBwAPVHJhbnNjcmlwdEV2ZW50DTpjb250ZW50LXR5cGUHABBhcHBsaWNhdGlvbi9qc29uDTptZXNzYWdlLXR5cGUHAAVldmVudHsiVHJhbnNjcmlwdCI6eyJSZXN1bHRzIjpbeyJBbHRlcm5hdGl2ZXMiOlt7Ikl0ZW1zIjpbeyJDb250ZW50IjoiVGhpcyIsIkVuZFRpbWUiOjIuMzQsIlN0YXJ0VGltZSI6Mi4yMywiVHlwZSI6InByb251bmNpYXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfSx7IkNvbnRlbnQiOiJpcyIsIkVuZFRpbWUiOjIuNDcsIlN0YXJ0VGltZSI6Mi4zNSwiVHlwZSI6InByb251bmNpYXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfSx7IkNvbnRlbnQiOiJQb2xseSIsIkVuZFRpbWUiOjIuODEsIlN0YXJ0VGltZSI6Mi40OCwiVHlwZSI6InByb251bmNpYXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfSx7IkNvbnRlbnQiOiJ0YWxraW5nIiwiRW5kVGltZSI6My4yNywiU3RhcnRUaW1lIjoyLjgyLCJUeXBlIjoicHJvbnVuY2lhdGlvbiIsIlZvY2FidWxhcnlGaWx0ZXJNYXRjaCI6ZmFsc2V9LHsiQ29udGVudCI6InRvIiwiRW5kVGltZSI6My4zOSwiU3RhcnRUaW1lIjozLjI4LCJUeXBlIjoicHJvbnVuY2lhdGlvbiIsIlZvY2FidWxhcnlGaWx0ZXJNYXRjaCI6ZmFsc2V9LHsiQ29udGVudCI6InlvdSIsIkVuZFRpbWUiOjMuNjIsIlN0YXJ0VGltZSI6My40LCJUeXBlIjoicHJvbnVuY2lhdGlvbiIsIlZvY2FidWxhcnlGaWx0ZXJNYXRjaCI6ZmFsc2V9LHsiQ29udGVudCI6ImZyb20iLCJFbmRUaW1lIjozLjkxLCJTdGFydFRpbWUiOjMuNjMsIlR5cGUiOiJwcm9udW5jaWF0aW9uIiwiVm9jYWJ1bGFyeUZpbHRlck1hdGNoIjpmYWxzZX1dLCJUcmFuc2NyaXB0IjoiVGhpcyBpcyBQb2xseSB0YWxraW5nIHRvIHlvdSBmcm9tIn1dLCJFbmRUaW1lIjozLjk0LCJJc1BhcnRpYWwiOnRydWUsIlJlc3VsdElkIjoiMmI5ZWNjODItMTMzOC00MmE3LWIzMjgtN2FmYzdjYzFmNGE1IiwiU3RhcnRUaW1lIjoyLjIzfV19fZSNXi8=\"\n        },\n        \"direction\": \"Response\"\n      }\n    }\n  },\n  {\n    \"connection_id\": 0,\n    \"action\": {\n      \"Data\": {\n        \"data\": {\n          \"Base64\": \"AAAEdQAAAFXUgFe7CzpldmVudC10eXBlBwAPVHJhbnNjcmlwdEV2ZW50DTpjb250ZW50LXR5cGUHABBhcHBsaWNhdGlvbi9qc29uDTptZXNzYWdlLXR5cGUHAAVldmVudHsiVHJhbnNjcmlwdCI6eyJSZXN1bHRzIjpbeyJBbHRlcm5hdGl2ZXMiOlt7Ikl0ZW1zIjpbeyJDb250ZW50IjoiVGhpcyIsIkVuZFRpbWUiOjIuMzQsIlN0YXJ0VGltZSI6Mi4yMywiVHlwZSI6InByb251bmNpYXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfSx7IkNvbnRlbnQiOiJpcyIsIkVuZFRpbWUiOjIuNDcsIlN0YXJ0VGltZSI6Mi4zNSwiVHlwZSI6InByb251bmNpYXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfSx7IkNvbnRlbnQiOiJQb2xseSIsIkVuZFRpbWUiOjIuODEsIlN0YXJ0VGltZSI6Mi40OCwiVHlwZSI6InByb251bmNpYXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfSx7IkNvbnRlbnQiOiJ0YWxraW5nIiwiRW5kVGltZSI6My4yNywiU3RhcnRUaW1lIjoyLjgyLCJUeXBlIjoicHJvbnVuY2lhdGlvbiIsIlZvY2FidWxhcnlGaWx0ZXJNYXRjaCI6ZmFsc2V9LHsiQ29udGVudCI6InRvIiwiRW5kVGltZSI6My4zOSwiU3RhcnRUaW1lIjozLjI4LCJUeXBlIjoicHJvbnVuY2lhdGlvbiIsIlZvY2FidWxhcnlGaWx0ZXJNYXRjaCI6ZmFsc2V9LHsiQ29udGVudCI6InlvdSIsIkVuZFRpbWUiOjMuNjIsIlN0YXJ0VGltZSI6My40LCJUeXBlIjoicHJvbnVuY2lhdGlvbiIsIlZvY2FidWxhcnlGaWx0ZXJNYXRjaCI6ZmFsc2V9LHsiQ29udGVudCI6ImZyb20iLCJFbmRUaW1lIjozLjkzLCJTdGFydFRpbWUiOjMuNjMsIlR5cGUiOiJwcm9udW5jaWF0aW9uIiwiVm9jYWJ1bGFyeUZpbHRlck1hdGNoIjpmYWxzZX0seyJDb250ZW50IjoidGhlIiwiRW5kVGltZSI6NC4wMSwiU3RhcnRUaW1lIjozLjk0LCJUeXBlIjoicHJvbnVuY2lhdGlvbiIsIlZvY2FidWxhcnlGaWx0ZXJNYXRjaCI6ZmFsc2V9XSwiVHJhbnNjcmlwdCI6IlRoaXMgaXMgUG9sbHkgdGFsa2luZyB0byB5b3UgZnJvbSB0aGUifV0sIkVuZFRpbWUiOjQuMDQsIklzUGFydGlhbCI6dHJ1ZSwiUmVzdWx0SWQiOiIyYjllY2M4Mi0xMzM4LTQyYTctYjMyOC03YWZjN2NjMWY0YTUiLCJTdGFydFRpbWUiOjIuMjN9XX199C6xyw==\"\n        },\n        \"direction\": \"Response\"\n      }\n    }\n  },\n  {\n    \"connection_id\": 0,\n    \"action\": {\n      \"Data\": {\n        \"data\": {\n          \"Base64\": \"AAAFQgAAAFUM3eCICzpldmVudC10eXBlBwAPVHJhbnNjcmlwdEV2ZW50DTpjb250ZW50LXR5cGUHABBhcHBsaWNhdGlvbi9qc29uDTptZXNzYWdlLXR5cGUHAAVldmVudHsiVHJhbnNjcmlwdCI6eyJSZXN1bHRzIjpbeyJBbHRlcm5hdGl2ZXMiOlt7Ikl0ZW1zIjpbeyJDb250ZW50IjoiVGhpcyIsIkVuZFRpbWUiOjIuMzQsIlN0YXJ0VGltZSI6Mi4yMywiVHlwZSI6InByb251bmNpYXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfSx7IkNvbnRlbnQiOiJpcyIsIkVuZFRpbWUiOjIuNDcsIlN0YXJ0VGltZSI6Mi4zNSwiVHlwZSI6InByb251bmNpYXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfSx7IkNvbnRlbnQiOiJQb2xseSIsIkVuZFRpbWUiOjIuODEsIlN0YXJ0VGltZSI6Mi40OCwiVHlwZSI6InByb251bmNpYXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfSx7IkNvbnRlbnQiOiJ0YWxraW5nIiwiRW5kVGltZSI6My4yNywiU3RhcnRUaW1lIjoyLjgyLCJUeXBlIjoicHJvbnVuY2lhdGlvbiIsIlZvY2FidWxhcnlGaWx0ZXJNYXRjaCI6ZmFsc2V9LHsiQ29udGVudCI6InRvIiwiRW5kVGltZSI6My4zOSwiU3RhcnRUaW1lIjozLjI4LCJUeXBlIjoicHJvbnVuY2lhdGlvbiIsIlZvY2FidWxhcnlGaWx0ZXJNYXRjaCI6ZmFsc2V9LHsiQ29udGVudCI6InlvdSIsIkVuZFRpbWUiOjMuNjIsIlN0YXJ0VGltZSI6My40LCJUeXBlIjoicHJvbnVuY2lhdGlvbiIsIlZvY2FidWxhcnlGaWx0ZXJNYXRjaCI6ZmFsc2V9LHsiQ29udGVudCI6ImZyb20iLCJFbmRUaW1lIjozLjkzLCJTdGFydFRpbWUiOjMuNjMsIlR5cGUiOiJwcm9udW5jaWF0aW9uIiwiVm9jYWJ1bGFyeUZpbHRlck1hdGNoIjpmYWxzZX0seyJDb250ZW50IjoidGhlIiwiRW5kVGltZSI6NC4wLCJTdGFydFRpbWUiOjMuOTQsIlR5cGUiOiJwcm9udW5jaWF0aW9uIiwiVm9jYWJ1bGFyeUZpbHRlck1hdGNoIjpmYWxzZX0seyJDb250ZW50IjoicnVzdCIsIkVuZFRpbWUiOjQuMywiU3RhcnRUaW1lIjo0LjAxLCJUeXBlIjoicHJvbnVuY2lhdGlvbiIsIlZvY2FidWxhcnlGaWx0ZXJNYXRjaCI6ZmFsc2V9LHsiQ29udGVudCI6Ii4iLCJFbmRUaW1lIjo0LjMsIlN0YXJ0VGltZSI6NC4zLCJUeXBlIjoicHVuY3R1YXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfV0sIlRyYW5zY3JpcHQiOiJUaGlzIGlzIFBvbGx5IHRhbGtpbmcgdG8geW91IGZyb20gdGhlIHJ1c3QuIn1dLCJFbmRUaW1lIjo0LjM0LCJJc1BhcnRpYWwiOnRydWUsIlJlc3VsdElkIjoiMmI5ZWNjODItMTMzOC00MmE3LWIzMjgtN2FmYzdjYzFmNGE1IiwiU3RhcnRUaW1lIjoyLjIzfV19fcJmtnQ=\"\n        },\n        \"direction\": \"Response\"\n      }\n    }\n  },\n  {\n    \"connection_id\": 0,\n    \"action\": {\n      \"Data\": {\n        \"data\": {\n          \"Base64\": \"AAAFRQAAAFW+/TyYCzpldmVudC10eXBlBwAPVHJhbnNjcmlwdEV2ZW50DTpjb250ZW50LXR5cGUHABBhcHBsaWNhdGlvbi9qc29uDTptZXNzYWdlLXR5cGUHAAVldmVudHsiVHJhbnNjcmlwdCI6eyJSZXN1bHRzIjpbeyJBbHRlcm5hdGl2ZXMiOlt7Ikl0ZW1zIjpbeyJDb250ZW50IjoiVGhpcyIsIkVuZFRpbWUiOjIuMzQsIlN0YXJ0VGltZSI6Mi4yMywiVHlwZSI6InByb251bmNpYXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfSx7IkNvbnRlbnQiOiJpcyIsIkVuZFRpbWUiOjIuNDcsIlN0YXJ0VGltZSI6Mi4zNSwiVHlwZSI6InByb251bmNpYXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfSx7IkNvbnRlbnQiOiJQb2xseSIsIkVuZFRpbWUiOjIuODEsIlN0YXJ0VGltZSI6Mi40OCwiVHlwZSI6InByb251bmNpYXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfSx7IkNvbnRlbnQiOiJ0YWxraW5nIiwiRW5kVGltZSI6My4yNywiU3RhcnRUaW1lIjoyLjgyLCJUeXBlIjoicHJvbnVuY2lhdGlvbiIsIlZvY2FidWxhcnlGaWx0ZXJNYXRjaCI6ZmFsc2V9LHsiQ29udGVudCI6InRvIiwiRW5kVGltZSI6My4zOSwiU3RhcnRUaW1lIjozLjI4LCJUeXBlIjoicHJvbnVuY2lhdGlvbiIsIlZvY2FidWxhcnlGaWx0ZXJNYXRjaCI6ZmFsc2V9LHsiQ29udGVudCI6InlvdSIsIkVuZFRpbWUiOjMuNjIsIlN0YXJ0VGltZSI6My40LCJUeXBlIjoicHJvbnVuY2lhdGlvbiIsIlZvY2FidWxhcnlGaWx0ZXJNYXRjaCI6ZmFsc2V9LHsiQ29udGVudCI6ImZyb20iLCJFbmRUaW1lIjozLjkzLCJTdGFydFRpbWUiOjMuNjMsIlR5cGUiOiJwcm9udW5jaWF0aW9uIiwiVm9jYWJ1bGFyeUZpbHRlck1hdGNoIjpmYWxzZX0seyJDb250ZW50IjoidGhlIiwiRW5kVGltZSI6NC4wLCJTdGFydFRpbWUiOjMuOTQsIlR5cGUiOiJwcm9udW5jaWF0aW9uIiwiVm9jYWJ1bGFyeUZpbHRlck1hdGNoIjpmYWxzZX0seyJDb250ZW50IjoicnVzdCIsIkVuZFRpbWUiOjQuMzEsIlN0YXJ0VGltZSI6NC4wMSwiVHlwZSI6InByb251bmNpYXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfSx7IkNvbnRlbnQiOiIuIiwiRW5kVGltZSI6NC4zMSwiU3RhcnRUaW1lIjo0LjMxLCJUeXBlIjoicHVuY3R1YXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfV0sIlRyYW5zY3JpcHQiOiJUaGlzIGlzIFBvbGx5IHRhbGtpbmcgdG8geW91IGZyb20gdGhlIHJ1c3QuIn1dLCJFbmRUaW1lIjo0LjU0LCJJc1BhcnRpYWwiOnRydWUsIlJlc3VsdElkIjoiMmI5ZWNjODItMTMzOC00MmE3LWIzMjgtN2FmYzdjYzFmNGE1IiwiU3RhcnRUaW1lIjoyLjIzfV19feAovoQ=\"\n        },\n        \"direction\": \"Response\"\n      }\n    }\n  },\n  {\n    \"connection_id\": 0,\n    \"action\": {\n      \"Data\": {\n        \"data\": {\n          \"Base64\": \"AAAFSAAAAFVGbfgpCzpldmVudC10eXBlBwAPVHJhbnNjcmlwdEV2ZW50DTpjb250ZW50LXR5cGUHABBhcHBsaWNhdGlvbi9qc29uDTptZXNzYWdlLXR5cGUHAAVldmVudHsiVHJhbnNjcmlwdCI6eyJSZXN1bHRzIjpbeyJBbHRlcm5hdGl2ZXMiOlt7Ikl0ZW1zIjpbeyJDb250ZW50IjoiVGhpcyIsIkVuZFRpbWUiOjIuMzQsIlN0YXJ0VGltZSI6Mi4yMywiVHlwZSI6InByb251bmNpYXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfSx7IkNvbnRlbnQiOiJpcyIsIkVuZFRpbWUiOjIuNDcsIlN0YXJ0VGltZSI6Mi4zNSwiVHlwZSI6InByb251bmNpYXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfSx7IkNvbnRlbnQiOiJQb2xseSIsIkVuZFRpbWUiOjIuODEsIlN0YXJ0VGltZSI6Mi40OCwiVHlwZSI6InByb251bmNpYXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfSx7IkNvbnRlbnQiOiJ0YWxraW5nIiwiRW5kVGltZSI6My4yNywiU3RhcnRUaW1lIjoyLjgyLCJUeXBlIjoicHJvbnVuY2lhdGlvbiIsIlZvY2FidWxhcnlGaWx0ZXJNYXRjaCI6ZmFsc2V9LHsiQ29udGVudCI6InRvIiwiRW5kVGltZSI6My4zOSwiU3RhcnRUaW1lIjozLjI4LCJUeXBlIjoicHJvbnVuY2lhdGlvbiIsIlZvY2FidWxhcnlGaWx0ZXJNYXRjaCI6ZmFsc2V9LHsiQ29udGVudCI6InlvdSIsIkVuZFRpbWUiOjMuNjIsIlN0YXJ0VGltZSI6My40LCJUeXBlIjoicHJvbnVuY2lhdGlvbiIsIlZvY2FidWxhcnlGaWx0ZXJNYXRjaCI6ZmFsc2V9LHsiQ29udGVudCI6ImZyb20iLCJFbmRUaW1lIjozLjkzLCJTdGFydFRpbWUiOjMuNjMsIlR5cGUiOiJwcm9udW5jaWF0aW9uIiwiVm9jYWJ1bGFyeUZpbHRlck1hdGNoIjpmYWxzZX0seyJDb250ZW50IjoidGhlIiwiRW5kVGltZSI6NC4wLCJTdGFydFRpbWUiOjMuOTQsIlR5cGUiOiJwcm9udW5jaWF0aW9uIiwiVm9jYWJ1bGFyeUZpbHRlck1hdGNoIjpmYWxzZX0seyJDb250ZW50IjoiUnVzdCIsIkVuZFRpbWUiOjQuMzEsIlN0YXJ0VGltZSI6NC4wMSwiVHlwZSI6InByb251bmNpYXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfSx7IkNvbnRlbnQiOiJzIiwiRW5kVGltZSI6NC41NywiU3RhcnRUaW1lIjo0LjM4LCJUeXBlIjoicHJvbnVuY2lhdGlvbiIsIlZvY2FidWxhcnlGaWx0ZXJNYXRjaCI6ZmFsc2V9XSwiVHJhbnNjcmlwdCI6IlRoaXMgaXMgUG9sbHkgdGFsa2luZyB0byB5b3UgZnJvbSB0aGUgUnVzdCBzIn1dLCJFbmRUaW1lIjo0LjY0LCJJc1BhcnRpYWwiOnRydWUsIlJlc3VsdElkIjoiMmI5ZWNjODItMTMzOC00MmE3LWIzMjgtN2FmYzdjYzFmNGE1IiwiU3RhcnRUaW1lIjoyLjIzfV19ff2tU5s=\"\n        },\n        \"direction\": \"Response\"\n      }\n    }\n  },\n  {\n    \"connection_id\": 0,\n    \"action\": {\n      \"Data\": {\n        \"data\": {\n          \"Base64\": \"AAAFrgAAAFXh+cpWCzpldmVudC10eXBlBwAPVHJhbnNjcmlwdEV2ZW50DTpjb250ZW50LXR5cGUHABBhcHBsaWNhdGlvbi9qc29uDTptZXNzYWdlLXR5cGUHAAVldmVudHsiVHJhbnNjcmlwdCI6eyJSZXN1bHRzIjpbeyJBbHRlcm5hdGl2ZXMiOlt7Ikl0ZW1zIjpbeyJDb250ZW50IjoiVGhpcyIsIkVuZFRpbWUiOjIuMzQsIlN0YXJ0VGltZSI6Mi4yMywiVHlwZSI6InByb251bmNpYXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfSx7IkNvbnRlbnQiOiJpcyIsIkVuZFRpbWUiOjIuNDcsIlN0YXJ0VGltZSI6Mi4zNSwiVHlwZSI6InByb251bmNpYXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfSx7IkNvbnRlbnQiOiJQb2xseSIsIkVuZFRpbWUiOjIuODEsIlN0YXJ0VGltZSI6Mi40OCwiVHlwZSI6InByb251bmNpYXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfSx7IkNvbnRlbnQiOiJ0YWxraW5nIiwiRW5kVGltZSI6My4yNywiU3RhcnRUaW1lIjoyLjgyLCJUeXBlIjoicHJvbnVuY2lhdGlvbiIsIlZvY2FidWxhcnlGaWx0ZXJNYXRjaCI6ZmFsc2V9LHsiQ29udGVudCI6InRvIiwiRW5kVGltZSI6My4zOSwiU3RhcnRUaW1lIjozLjI4LCJUeXBlIjoicHJvbnVuY2lhdGlvbiIsIlZvY2FidWxhcnlGaWx0ZXJNYXRjaCI6ZmFsc2V9LHsiQ29udGVudCI6InlvdSIsIkVuZFRpbWUiOjMuNjIsIlN0YXJ0VGltZSI6My40LCJUeXBlIjoicHJvbnVuY2lhdGlvbiIsIlZvY2FidWxhcnlGaWx0ZXJNYXRjaCI6ZmFsc2V9LHsiQ29udGVudCI6ImZyb20iLCJFbmRUaW1lIjozLjkzLCJTdGFydFRpbWUiOjMuNjMsIlR5cGUiOiJwcm9udW5jaWF0aW9uIiwiVm9jYWJ1bGFyeUZpbHRlck1hdGNoIjpmYWxzZX0seyJDb250ZW50IjoidGhlIiwiRW5kVGltZSI6NC4wLCJTdGFydFRpbWUiOjMuOTQsIlR5cGUiOiJwcm9udW5jaWF0aW9uIiwiVm9jYWJ1bGFyeUZpbHRlck1hdGNoIjpmYWxzZX0seyJDb250ZW50IjoiUnVzdCIsIkVuZFRpbWUiOjQuMzEsIlN0YXJ0VGltZSI6NC4wMSwiVHlwZSI6InByb251bmNpYXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfSx7IkNvbnRlbnQiOiJTVCIsIkVuZFRpbWUiOjQuNzEsIlN0YXJ0VGltZSI6NC4zOCwiVHlwZSI6InByb251bmNpYXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfSx7IkNvbnRlbnQiOiIuIiwiRW5kVGltZSI6NC43MSwiU3RhcnRUaW1lIjo0LjcxLCJUeXBlIjoicHVuY3R1YXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfV0sIlRyYW5zY3JpcHQiOiJUaGlzIGlzIFBvbGx5IHRhbGtpbmcgdG8geW91IGZyb20gdGhlIFJ1c3QgU1QuIn1dLCJFbmRUaW1lIjo0Ljc0LCJJc1BhcnRpYWwiOnRydWUsIlJlc3VsdElkIjoiMmI5ZWNjODItMTMzOC00MmE3LWIzMjgtN2FmYzdjYzFmNGE1IiwiU3RhcnRUaW1lIjoyLjIzfV19ffcOGbU=\"\n        },\n        \"direction\": \"Response\"\n      }\n    }\n  },\n  {\n    \"connection_id\": 0,\n    \"action\": {\n      \"Data\": {\n        \"data\": {\n          \"Base64\": \"AAAGFQAAAFUAeoH9CzpldmVudC10eXBlBwAPVHJhbnNjcmlwdEV2ZW50DTpjb250ZW50LXR5cGUHABBhcHBsaWNhdGlvbi9qc29uDTptZXNzYWdlLXR5cGUHAAVldmVudHsiVHJhbnNjcmlwdCI6eyJSZXN1bHRzIjpbeyJBbHRlcm5hdGl2ZXMiOlt7Ikl0ZW1zIjpbeyJDb250ZW50IjoiVGhpcyIsIkVuZFRpbWUiOjIuMzQsIlN0YXJ0VGltZSI6Mi4yMywiVHlwZSI6InByb251bmNpYXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfSx7IkNvbnRlbnQiOiJpcyIsIkVuZFRpbWUiOjIuNDcsIlN0YXJ0VGltZSI6Mi4zNSwiVHlwZSI6InByb251bmNpYXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfSx7IkNvbnRlbnQiOiJQb2xseSIsIkVuZFRpbWUiOjIuODEsIlN0YXJ0VGltZSI6Mi40OCwiVHlwZSI6InByb251bmNpYXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfSx7IkNvbnRlbnQiOiJ0YWxraW5nIiwiRW5kVGltZSI6My4yNywiU3RhcnRUaW1lIjoyLjgyLCJUeXBlIjoicHJvbnVuY2lhdGlvbiIsIlZvY2FidWxhcnlGaWx0ZXJNYXRjaCI6ZmFsc2V9LHsiQ29udGVudCI6InRvIiwiRW5kVGltZSI6My4zOSwiU3RhcnRUaW1lIjozLjI4LCJUeXBlIjoicHJvbnVuY2lhdGlvbiIsIlZvY2FidWxhcnlGaWx0ZXJNYXRjaCI6ZmFsc2V9LHsiQ29udGVudCI6InlvdSIsIkVuZFRpbWUiOjMuNjIsIlN0YXJ0VGltZSI6My40LCJUeXBlIjoicHJvbnVuY2lhdGlvbiIsIlZvY2FidWxhcnlGaWx0ZXJNYXRjaCI6ZmFsc2V9LHsiQ29udGVudCI6ImZyb20iLCJFbmRUaW1lIjozLjkzLCJTdGFydFRpbWUiOjMuNjMsIlR5cGUiOiJwcm9udW5jaWF0aW9uIiwiVm9jYWJ1bGFyeUZpbHRlck1hdGNoIjpmYWxzZX0seyJDb250ZW50IjoidGhlIiwiRW5kVGltZSI6NC4wLCJTdGFydFRpbWUiOjMuOTQsIlR5cGUiOiJwcm9udW5jaWF0aW9uIiwiVm9jYWJ1bGFyeUZpbHRlck1hdGNoIjpmYWxzZX0seyJDb250ZW50IjoiUnVzdCIsIkVuZFRpbWUiOjQuMzEsIlN0YXJ0VGltZSI6NC4wMSwiVHlwZSI6InByb251bmNpYXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfSx7IkNvbnRlbnQiOiJTVCIsIkVuZFRpbWUiOjQuNzMsIlN0YXJ0VGltZSI6NC4zOCwiVHlwZSI6InByb251bmNpYXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfSx7IkNvbnRlbnQiOiJLIiwiRW5kVGltZSI6NC45NywiU3RhcnRUaW1lIjo0Ljc0LCJUeXBlIjoicHJvbnVuY2lhdGlvbiIsIlZvY2FidWxhcnlGaWx0ZXJNYXRjaCI6ZmFsc2V9LHsiQ29udGVudCI6Ii4iLCJFbmRUaW1lIjo0Ljk3LCJTdGFydFRpbWUiOjQuOTcsIlR5cGUiOiJwdW5jdHVhdGlvbiIsIlZvY2FidWxhcnlGaWx0ZXJNYXRjaCI6ZmFsc2V9XSwiVHJhbnNjcmlwdCI6IlRoaXMgaXMgUG9sbHkgdGFsa2luZyB0byB5b3UgZnJvbSB0aGUgUnVzdCBTVCBLLiJ9XSwiRW5kVGltZSI6NS4wNCwiSXNQYXJ0aWFsIjp0cnVlLCJSZXN1bHRJZCI6IjJiOWVjYzgyLTEzMzgtNDJhNy1iMzI4LTdhZmM3Y2MxZjRhNSIsIlN0YXJ0VGltZSI6Mi4yM31dfX11mPSb\"\n        },\n        \"direction\": \"Response\"\n      }\n    }\n  },\n  {\n    \"connection_id\": 0,\n    \"action\": {\n      \"Data\": {\n        \"data\": {\n          \"Base64\": \"AAAGFQAAAFUAeoH9CzpldmVudC10eXBlBwAPVHJhbnNjcmlwdEV2ZW50DTpjb250ZW50LXR5cGUHABBhcHBsaWNhdGlvbi9qc29uDTptZXNzYWdlLXR5cGUHAAVldmVudHsiVHJhbnNjcmlwdCI6eyJSZXN1bHRzIjpbeyJBbHRlcm5hdGl2ZXMiOlt7Ikl0ZW1zIjpbeyJDb250ZW50IjoiVGhpcyIsIkVuZFRpbWUiOjIuNDIsIlN0YXJ0VGltZSI6Mi4yMywiVHlwZSI6InByb251bmNpYXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfSx7IkNvbnRlbnQiOiJpcyIsIkVuZFRpbWUiOjIuNTcsIlN0YXJ0VGltZSI6Mi40MywiVHlwZSI6InByb251bmNpYXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfSx7IkNvbnRlbnQiOiJQb2xseSIsIkVuZFRpbWUiOjIuOTMsIlN0YXJ0VGltZSI6Mi41OCwiVHlwZSI6InByb251bmNpYXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfSx7IkNvbnRlbnQiOiJ0YWxraW5nIiwiRW5kVGltZSI6My4zNCwiU3RhcnRUaW1lIjoyLjk0LCJUeXBlIjoicHJvbnVuY2lhdGlvbiIsIlZvY2FidWxhcnlGaWx0ZXJNYXRjaCI6ZmFsc2V9LHsiQ29udGVudCI6InRvIiwiRW5kVGltZSI6My40OSwiU3RhcnRUaW1lIjozLjM1LCJUeXBlIjoicHJvbnVuY2lhdGlvbiIsIlZvY2FidWxhcnlGaWx0ZXJNYXRjaCI6ZmFsc2V9LHsiQ29udGVudCI6InlvdSIsIkVuZFRpbWUiOjMuOCwiU3RhcnRUaW1lIjozLjUsIlR5cGUiOiJwcm9udW5jaWF0aW9uIiwiVm9jYWJ1bGFyeUZpbHRlck1hdGNoIjpmYWxzZX0seyJDb250ZW50IjoiZnJvbSIsIkVuZFRpbWUiOjMuOTcsIlN0YXJ0VGltZSI6My44MSwiVHlwZSI6InByb251bmNpYXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfSx7IkNvbnRlbnQiOiJ0aGUiLCJFbmRUaW1lIjo0LjA4LCJTdGFydFRpbWUiOjMuOTgsIlR5cGUiOiJwcm9udW5jaWF0aW9uIiwiVm9jYWJ1bGFyeUZpbHRlck1hdGNoIjpmYWxzZX0seyJDb250ZW50IjoiUnVzdCIsIkVuZFRpbWUiOjQuMzYsIlN0YXJ0VGltZSI6NC4wOSwiVHlwZSI6InByb251bmNpYXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfSx7IkNvbnRlbnQiOiJTVCIsIkVuZFRpbWUiOjQuODUsIlN0YXJ0VGltZSI6NC4zOCwiVHlwZSI6InByb251bmNpYXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfSx7IkNvbnRlbnQiOiJLIiwiRW5kVGltZSI6NS4zNCwiU3RhcnRUaW1lIjo0Ljg2LCJUeXBlIjoicHJvbnVuY2lhdGlvbiIsIlZvY2FidWxhcnlGaWx0ZXJNYXRjaCI6ZmFsc2V9LHsiQ29udGVudCI6Ii4iLCJFbmRUaW1lIjo1LjM0LCJTdGFydFRpbWUiOjUuMzQsIlR5cGUiOiJwdW5jdHVhdGlvbiIsIlZvY2FidWxhcnlGaWx0ZXJNYXRjaCI6ZmFsc2V9XSwiVHJhbnNjcmlwdCI6IlRoaXMgaXMgUG9sbHkgdGFsa2luZyB0byB5b3UgZnJvbSB0aGUgUnVzdCBTVCBLLiJ9XSwiRW5kVGltZSI6NS4zNCwiSXNQYXJ0aWFsIjp0cnVlLCJSZXN1bHRJZCI6IjJiOWVjYzgyLTEzMzgtNDJhNy1iMzI4LTdhZmM3Y2MxZjRhNSIsIlN0YXJ0VGltZSI6Mi4yM31dfX3YPpjL\"\n        },\n        \"direction\": \"Response\"\n      }\n    }\n  },\n  {\n    \"connection_id\": 0,\n    \"action\": {\n      \"Data\": {\n        \"data\": {\n          \"Base64\": \"AAAG1QAAAFXpb2kmCzpldmVudC10eXBlBwAPVHJhbnNjcmlwdEV2ZW50DTpjb250ZW50LXR5cGUHABBhcHBsaWNhdGlvbi9qc29uDTptZXNzYWdlLXR5cGUHAAVldmVudHsiVHJhbnNjcmlwdCI6eyJSZXN1bHRzIjpbeyJBbHRlcm5hdGl2ZXMiOlt7Ikl0ZW1zIjpbeyJDb25maWRlbmNlIjoxLjAsIkNvbnRlbnQiOiJUaGlzIiwiRW5kVGltZSI6Mi40MiwiU3RhcnRUaW1lIjoyLjIzLCJUeXBlIjoicHJvbnVuY2lhdGlvbiIsIlZvY2FidWxhcnlGaWx0ZXJNYXRjaCI6ZmFsc2V9LHsiQ29uZmlkZW5jZSI6MS4wLCJDb250ZW50IjoiaXMiLCJFbmRUaW1lIjoyLjU3LCJTdGFydFRpbWUiOjIuNDMsIlR5cGUiOiJwcm9udW5jaWF0aW9uIiwiVm9jYWJ1bGFyeUZpbHRlck1hdGNoIjpmYWxzZX0seyJDb25maWRlbmNlIjowLjY1LCJDb250ZW50IjoiUG9sbHkiLCJFbmRUaW1lIjoyLjkzLCJTdGFydFRpbWUiOjIuNTgsIlR5cGUiOiJwcm9udW5jaWF0aW9uIiwiVm9jYWJ1bGFyeUZpbHRlck1hdGNoIjpmYWxzZX0seyJDb25maWRlbmNlIjoxLjAsIkNvbnRlbnQiOiJ0YWxraW5nIiwiRW5kVGltZSI6My4zNCwiU3RhcnRUaW1lIjoyLjk0LCJUeXBlIjoicHJvbnVuY2lhdGlvbiIsIlZvY2FidWxhcnlGaWx0ZXJNYXRjaCI6ZmFsc2V9LHsiQ29uZmlkZW5jZSI6MS4wLCJDb250ZW50IjoidG8iLCJFbmRUaW1lIjozLjQ5LCJTdGFydFRpbWUiOjMuMzUsIlR5cGUiOiJwcm9udW5jaWF0aW9uIiwiVm9jYWJ1bGFyeUZpbHRlck1hdGNoIjpmYWxzZX0seyJDb25maWRlbmNlIjoxLjAsIkNvbnRlbnQiOiJ5b3UiLCJFbmRUaW1lIjozLjgsIlN0YXJ0VGltZSI6My41LCJUeXBlIjoicHJvbnVuY2lhdGlvbiIsIlZvY2FidWxhcnlGaWx0ZXJNYXRjaCI6ZmFsc2V9LHsiQ29uZmlkZW5jZSI6MS4wLCJDb250ZW50IjoiZnJvbSIsIkVuZFRpbWUiOjMuOTcsIlN0YXJ0VGltZSI6My44MSwiVHlwZSI6InByb251bmNpYXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfSx7IkNvbmZpZGVuY2UiOjEuMCwiQ29udGVudCI6InRoZSIsIkVuZFRpbWUiOjQuMDgsIlN0YXJ0VGltZSI6My45OCwiVHlwZSI6InByb251bmNpYXRpb24iLCJWb2NhYnVsYXJ5RmlsdGVyTWF0Y2giOmZhbHNlfSx7IkNvbmZpZGVuY2UiOjAuODksIkNvbnRlbnQiOiJSdXN0IiwiRW5kVGltZSI6NC4zNiwiU3RhcnRUaW1lIjo0LjA5LCJUeXBlIjoicHJvbnVuY2lhdGlvbiIsIlZvY2FidWxhcnlGaWx0ZXJNYXRjaCI6ZmFsc2V9LHsiQ29uZmlkZW5jZSI6MC41OSwiQ29udGVudCI6IlNUIiwiRW5kVGltZSI6NC44NSwiU3RhcnRUaW1lIjo0LjM4LCJUeXBlIjoicHJvbnVuY2lhdGlvbiIsIlZvY2FidWxhcnlGaWx0ZXJNYXRjaCI6ZmFsc2V9LHsiQ29uZmlkZW5jZSI6MC45NiwiQ29udGVudCI6IksiLCJFbmRUaW1lIjo1LjM0LCJTdGFydFRpbWUiOjQuODYsIlR5cGUiOiJwcm9udW5jaWF0aW9uIiwiVm9jYWJ1bGFyeUZpbHRlck1hdGNoIjpmYWxzZX0seyJDb250ZW50IjoiLiIsIkVuZFRpbWUiOjUuMzQsIlN0YXJ0VGltZSI6NS4zNCwiVHlwZSI6InB1bmN0dWF0aW9uIiwiVm9jYWJ1bGFyeUZpbHRlck1hdGNoIjpmYWxzZX1dLCJUcmFuc2NyaXB0IjoiVGhpcyBpcyBQb2xseSB0YWxraW5nIHRvIHlvdSBmcm9tIHRoZSBSdXN0IFNUIEsuIn1dLCJFbmRUaW1lIjo1LjM0LCJJc1BhcnRpYWwiOmZhbHNlLCJSZXN1bHRJZCI6IjJiOWVjYzgyLTEzMzgtNDJhNy1iMzI4LTdhZmM3Y2MxZjRhNSIsIlN0YXJ0VGltZSI6Mi4yM31dfX2yOZDl\"\n        },\n        \"direction\": \"Response\"\n      }\n    }\n  },\n  {\n    \"connection_id\": 0,\n    \"action\": {\n      \"Data\": {\n        \"data\": {\n          \"Utf8\": \"\"\n        },\n        \"direction\": \"Response\"\n      }\n    }\n  },\n  {\n    \"connection_id\": 0,\n    \"action\": {\n      \"Eof\": {\n        \"ok\": true,\n        \"direction\": \"Response\"\n      }\n    }\n  }\n]\n"
  },
  {
    "path": "aws/sdk/integration-tests/transcribestreaming/tests/test.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse async_stream::stream;\nuse aws_sdk_transcribestreaming::config::{Credentials, Region};\nuse aws_sdk_transcribestreaming::error::SdkError;\nuse aws_sdk_transcribestreaming::operation::start_stream_transcription::StartStreamTranscriptionOutput;\n#[allow(unused)] // making sure `EventReceiver` is re-exported\nuse aws_sdk_transcribestreaming::primitives::event_stream::EventReceiver;\nuse aws_sdk_transcribestreaming::primitives::Blob;\nuse aws_sdk_transcribestreaming::types::error::{AudioStreamError, TranscriptResultStreamError};\nuse aws_sdk_transcribestreaming::types::{\n    AudioEvent, AudioStream, LanguageCode, MediaEncoding, TranscriptResultStream,\n};\nuse aws_sdk_transcribestreaming::{Client, Config};\nuse aws_smithy_eventstream::test_util::validate_body;\nuse aws_smithy_http_client::test_util::dvr::{Event, ReplayingClient};\nuse bytes::BufMut;\nuse futures_core::Stream;\nuse std::error::Error as StdError;\n\nconst CHUNK_SIZE: usize = 8192;\n\n#[tokio::test]\nasync fn test_success() {\n    let input_stream = stream! {\n        let pcm = pcm_data();\n        for chunk in pcm.chunks(CHUNK_SIZE) {\n            yield Ok(AudioStream::AudioEvent(AudioEvent::builder().audio_chunk(Blob::new(chunk)).build()));\n        }\n    };\n    let (replayer, mut output) =\n        start_request(\"us-west-2\", include_str!(\"success.json\"), input_stream).await;\n\n    let mut full_message = String::new();\n    while let Some(event) = output.transcript_result_stream.recv().await.unwrap() {\n        match event {\n            TranscriptResultStream::TranscriptEvent(transcript_event) => {\n                let transcript = transcript_event.transcript.unwrap();\n                for result in transcript.results.unwrap_or_default() {\n                    if !result.is_partial {\n                        let first_alternative = &result.alternatives.as_ref().unwrap()[0];\n                        full_message += first_alternative.transcript.as_ref().unwrap();\n                        full_message.push('\\n');\n                    }\n                }\n            }\n            otherwise => panic!(\"received unexpected event type: {:?}\", otherwise),\n        }\n    }\n\n    // Validate the requests\n    replayer\n        .validate(&[\"content-type\", \"content-length\"], validate_success_body)\n        .await\n        .unwrap();\n\n    // Validate the responses\n    assert_eq!(\n        \"Good day to you transcribe.\\nThis is Polly talking to you from the Rust ST K.\\n\",\n        full_message\n    );\n}\n\n#[tokio::test]\nasync fn test_error() {\n    let input_stream = stream! {\n        let pcm = pcm_data();\n        for chunk in pcm.chunks(CHUNK_SIZE).take(1) {\n            yield Ok(AudioStream::AudioEvent(AudioEvent::builder().audio_chunk(Blob::new(chunk)).build()));\n        }\n    };\n    let (replayer, mut output) =\n        start_request(\"us-east-1\", include_str!(\"error.json\"), input_stream).await;\n\n    match output.transcript_result_stream.recv().await {\n        Err(SdkError::ServiceError(context)) => match context.err() {\n            TranscriptResultStreamError::BadRequestException(err) => {\n                assert_eq!(\n                    Some(\"A complete signal was sent without the preceding empty frame.\"),\n                    err.message()\n                );\n            }\n            otherwise => panic!(\"Expected BadRequestException, got: {:?}\", otherwise),\n        },\n        otherwise => panic!(\"Expected BadRequestException, got: {:?}\", otherwise),\n    }\n\n    // Validate the requests\n    replayer\n        .validate(&[\"content-type\", \"content-length\"], validate_error_body)\n        .await\n        .unwrap();\n}\n\nasync fn start_request(\n    region: &'static str,\n    events_json: &str,\n    input_stream: impl Stream<Item = Result<AudioStream, AudioStreamError>> + Send + Sync + 'static,\n) -> (ReplayingClient, StartStreamTranscriptionOutput) {\n    let events: Vec<Event> = serde_json::from_str(events_json).unwrap();\n    let replayer = ReplayingClient::new(events);\n\n    let region = Region::from_static(region);\n    let config = Config::builder()\n        .region(region)\n        .http_client(replayer.clone())\n        .credentials_provider(Credentials::for_tests())\n        .build();\n    let client = Client::from_conf(config);\n\n    let output = client\n        .start_stream_transcription()\n        .language_code(LanguageCode::EnGb)\n        .media_sample_rate_hertz(8000)\n        .media_encoding(MediaEncoding::Pcm)\n        .audio_stream(input_stream.into())\n        .send()\n        .await\n        .unwrap();\n\n    (replayer, output)\n}\n\nfn validate_success_body(\n    expected_body: &[u8],\n    actual_body: &[u8],\n) -> Result<(), Box<dyn StdError>> {\n    validate_body(expected_body, actual_body, true)\n}\n\n// For the error test, the second request frame may not be sent by the client depending on when\n// the error response is parsed and bubbled up to the user.\nfn validate_error_body(expected_body: &[u8], actual_body: &[u8]) -> Result<(), Box<dyn StdError>> {\n    validate_body(expected_body, actual_body, false)\n}\n\nfn pcm_data() -> Vec<u8> {\n    let audio = include_bytes!(\"hello-transcribe-8000.wav\");\n    let reader = hound::WavReader::new(&audio[..]).unwrap();\n    let samples_result: hound::Result<Vec<i16>> = reader.into_samples::<i16>().collect();\n\n    let mut pcm: Vec<u8> = Vec::new();\n    for sample in samples_result.unwrap() {\n        pcm.put_i16_le(sample);\n    }\n    pcm\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/webassembly-no-os/.cargo/config.toml",
    "content": "[build]\ntarget = [\"wasm32-unknown-unknown\", \"wasm32-wasip2\"]\n\n[target.wasm32-wasip2]\nrunner = [\n    \"wasmtime\",\n    \"-C\", \"cache=n\",\n    \"-S\", \"preview2=y\",\n    \"-S\", \"http=y\"\n]\n\n\n[target.wasm32-unknown-unknown]\n# Required for getrandom crate to compile\n# https://docs.rs/getrandom/0.3.3/getrandom/#webassembly-support\nrustflags = ['--cfg', 'getrandom_backend=\"wasm_js\"']\nrunner = [\n    \"./run-wasm32-unknown-unknown.sh\",\n]\n"
  },
  {
    "path": "aws/sdk/integration-tests/webassembly-no-os/Cargo.toml",
    "content": "# This Cargo.toml is unused in generated code. It exists solely to enable these tests to compile in-situ\n[package]\nname = \"webassembly-no-os\"\nversion = \"0.1.0\"\nauthors = [\n    \"Eduardo Rodrigues <16357187+eduardomourar@users.noreply.github.com>\",\n]\ndescription = \"\"\"\nThese tests ensure that things will fail (or not fail) as expected\nwhen target is set to wasm32-wasip1 for all SDK and runtime crates.\n\"\"\"\nedition = \"2021\"\nlicense = \"Apache-2.0\"\nrepository = \"https://github.com/smithy-lang/smithy-rs\"\npublish = false\n\n[target.'cfg(target_family = \"wasm\")'.dependencies]\naws-config = { path = \"../../build/aws-sdk/sdk/aws-config\", default-features = false, features = [\n    \"rt-tokio\",\n    \"behavior-version-latest\"\n] }\naws-credential-types = { path = \"../../build/aws-sdk/sdk/aws-credential-types\", features = [\"hardcoded-credentials\"] }\naws-sdk-s3 = { path = \"../../build/aws-sdk/sdk/s3\", default-features = false }\naws-smithy-async = { path = \"../../build/aws-sdk/sdk/aws-smithy-async\", default-features = false, features = [\"test-util\", \"rt-tokio\"] }\naws-smithy-http = { path = \"../../build/aws-sdk/sdk/aws-smithy-http\" }\naws-smithy-http-client = { path = \"../../build/aws-sdk/sdk/aws-smithy-http-client\", default-features = false, features = [\"test-util\"] }\naws-smithy-runtime = { path = \"../../build/aws-sdk/sdk/aws-smithy-runtime\", features = [\"client\"] }\naws-smithy-runtime-api = { path = \"../../build/aws-sdk/sdk/aws-smithy-runtime-api\", features = [\"client\"] }\naws-smithy-types = { path = \"../../build/aws-sdk/sdk/aws-smithy-types\" }\naws-smithy-wasm = { path = \"../../build/aws-sdk/sdk/aws-smithy-wasm\" }\nhttp-1x = { package = \"http\", version = \"1\" }\ntokio = { version = \"1.32.0\", features = [\"macros\", \"rt\"] }\n# getrandom is a transitive dependency, but requires the wasm_js feature to compile for wasm\n# also requires a compiler flag which is set in .cargo/config.toml\n# https://docs.rs/getrandom/0.3.3/getrandom/#webassembly-support\ngetrandom = {version=\"0.3.3\", features = [\"wasm_js\"]}\n\n[lib]\ncrate-type = [\"cdylib\"]\n\n# metadata used by cargo-component to identify which wit world to embed in the binary\n[package.metadata.component]\npackage = \"aws:component\"\n"
  },
  {
    "path": "aws/sdk/integration-tests/webassembly-no-os/run-wasm32-unknown-unknown.sh",
    "content": "#!/bin/bash\n#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\n\nwasmtime --invoke main -D logging=y -D debug-info=y -D address-map=y \"$@\" 0 0\n"
  },
  {
    "path": "aws/sdk/integration-tests/webassembly-no-os/src/lib.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n#![cfg(target_family = \"wasm\")]\n\n// Note the tests here are not gated since they should pass successfully in both\n// wasm32-unknown-unknown and wasm32-wasip2\nmod wasm32_unknown_unknown;\n\n#[cfg(all(target_arch = \"wasm32\", target_env = \"p2\"))]\nmod wasm32_wasip2;\n"
  },
  {
    "path": "aws/sdk/integration-tests/webassembly-no-os/src/wasm32_unknown_unknown.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n#[cfg(test)]\nmod test {\n\n    use aws_config::{retry::RetryConfig, BehaviorVersion};\n    use aws_sdk_s3::config::{AsyncSleep, Sleep};\n    use aws_sdk_s3::Client;\n    use aws_sdk_s3::{config::Region, Config};\n    use aws_smithy_async::test_util::ManualTimeSource;\n    use aws_smithy_http_client::test_util::{ReplayEvent, StaticReplayClient};\n    use aws_smithy_types::body::SdkBody;\n    use std::time::UNIX_EPOCH;\n\n    #[derive(Debug, Clone)]\n    struct FakeSleep;\n    impl AsyncSleep for FakeSleep {\n        fn sleep(&self, _duration: std::time::Duration) -> Sleep {\n            Sleep::new(async move {\n                // This is fake, we do nothing\n            })\n        }\n    }\n\n    #[test]\n    fn basic_operation_with_retries() {\n        // Since wasm32-unknown-unknown is sandboxed it is hard to know that your tests are actually\n        // running. wasmtime will happily exit with 0 even if no tests are run. Enabling this makes\n        // it very obvious if they are running or not.\n        // panic!(\"The tests are actually running.\");\n\n        let runtime = tokio::runtime::Builder::new_current_thread()\n            .build()\n            .unwrap();\n\n        let http_client = StaticReplayClient::new(vec![\n            ReplayEvent::new(\n                http_1x::Request::builder()\n                    .uri(\"https://www.doesntmatter.com\")\n                    .body(SdkBody::empty())\n                    .unwrap(),\n                http_1x::Response::builder()\n                    .status(500)\n                    .body(SdkBody::from(\"This was an error\"))\n                    .unwrap(),\n            ),\n            ReplayEvent::new(\n                http_1x::Request::builder()\n                    .uri(\"https://www.doesntmatter.com\")\n                    .body(SdkBody::empty())\n                    .unwrap(),\n                http_1x::Response::builder()\n                    .status(500)\n                    .body(SdkBody::from(\"This was an error\"))\n                    .unwrap(),\n            ),\n            ReplayEvent::new(\n                http_1x::Request::builder()\n                    .uri(\"https://www.doesntmatter.com\")\n                    .body(SdkBody::empty())\n                    .unwrap(),\n                http_1x::Response::builder()\n                    .status(200)\n                    .body(SdkBody::from(\n                        r#\"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n                    <ListBucketResult>\n                        <Name>test-bucket</Name>\n                        <Prefix>prefix~</Prefix>\n                        <KeyCount>1</KeyCount>\n                        <MaxKeys>1000</MaxKeys>\n                        <IsTruncated>false</IsTruncated>\n                        <Contents>\n                            <Key>some-file.file</Key>\n                            <LastModified>2009-10-12T17:50:30.000Z</LastModified>\n                            <Size>434234</Size>\n                            <StorageClass>STANDARD</StorageClass>\n                        </Contents>\n                    </ListBucketResult>\n                    \"#,\n                    ))\n                    .unwrap(),\n            ),\n        ]);\n\n        let config = Config::builder()\n            .behavior_version(BehaviorVersion::latest())\n            .region(Region::new(\"us-east-1\"))\n            .http_client(http_client)\n            .time_source(ManualTimeSource::new(UNIX_EPOCH))\n            .sleep_impl(FakeSleep)\n            .retry_config(RetryConfig::standard())\n            .build();\n\n        let client = Client::from_conf(config);\n\n        let result = runtime\n            .block_on(client.list_objects_v2().bucket(\"test-bucket\").send())\n            .unwrap();\n\n        assert_eq!(result.name.unwrap(), \"test-bucket\");\n        assert_eq!(result.prefix.unwrap(), \"prefix~\");\n    }\n\n    #[test]\n    #[should_panic]\n    fn no_sleep_impl() {\n        let runtime = tokio::runtime::Builder::new_current_thread()\n            .build()\n            .unwrap();\n\n        let http_client = StaticReplayClient::new(vec![\n            ReplayEvent::new(\n                http_1x::Request::builder()\n                    .uri(\"https://www.doesntmatter.com\")\n                    .body(SdkBody::empty())\n                    .unwrap(),\n                http_1x::Response::builder()\n                    .status(500)\n                    .body(SdkBody::from(\"This was an error\"))\n                    .unwrap(),\n            ),\n            ReplayEvent::new(\n                http_1x::Request::builder()\n                    .uri(\"https://www.doesntmatter.com\")\n                    .body(SdkBody::empty())\n                    .unwrap(),\n                http_1x::Response::builder()\n                    .status(500)\n                    .body(SdkBody::from(\"This was an error\"))\n                    .unwrap(),\n            ),\n            ReplayEvent::new(\n                http_1x::Request::builder()\n                    .uri(\"https://www.doesntmatter.com\")\n                    .body(SdkBody::empty())\n                    .unwrap(),\n                http_1x::Response::builder()\n                    .status(200)\n                    .body(SdkBody::from(\n                        r#\"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n                    <ListBucketResult>\n                        <Name>test-bucket</Name>\n                        <Prefix>prefix~</Prefix>\n                        <KeyCount>1</KeyCount>\n                        <MaxKeys>1000</MaxKeys>\n                        <IsTruncated>false</IsTruncated>\n                        <Contents>\n                            <Key>some-file.file</Key>\n                            <LastModified>2009-10-12T17:50:30.000Z</LastModified>\n                            <Size>434234</Size>\n                            <StorageClass>STANDARD</StorageClass>\n                        </Contents>\n                    </ListBucketResult>\n                    \"#,\n                    ))\n                    .unwrap(),\n            ),\n        ]);\n\n        let config = Config::builder()\n            .behavior_version(BehaviorVersion::latest())\n            .region(Region::new(\"us-east-1\"))\n            .http_client(http_client)\n            .time_source(ManualTimeSource::new(UNIX_EPOCH))\n            .retry_config(RetryConfig::standard())\n            .build();\n\n        let client = Client::from_conf(config);\n\n        let _result = runtime\n            .block_on(client.list_objects_v2().bucket(\"test-bucket\").send())\n            .unwrap();\n    }\n\n    #[test]\n    #[should_panic]\n    fn no_time_source() {\n        let runtime = tokio::runtime::Builder::new_current_thread()\n            .build()\n            .unwrap();\n\n        let http_client = StaticReplayClient::new(vec![\n            ReplayEvent::new(\n                http_1x::Request::builder()\n                    .uri(\"https://www.doesntmatter.com\")\n                    .body(SdkBody::empty())\n                    .unwrap(),\n                http_1x::Response::builder()\n                    .status(500)\n                    .body(SdkBody::from(\"This was an error\"))\n                    .unwrap(),\n            ),\n            ReplayEvent::new(\n                http_1x::Request::builder()\n                    .uri(\"https://www.doesntmatter.com\")\n                    .body(SdkBody::empty())\n                    .unwrap(),\n                http_1x::Response::builder()\n                    .status(500)\n                    .body(SdkBody::from(\"This was an error\"))\n                    .unwrap(),\n            ),\n            ReplayEvent::new(\n                http_1x::Request::builder()\n                    .uri(\"https://www.doesntmatter.com\")\n                    .body(SdkBody::empty())\n                    .unwrap(),\n                http_1x::Response::builder()\n                    .status(200)\n                    .body(SdkBody::from(\n                        r#\"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n                    <ListBucketResult>\n                        <Name>test-bucket</Name>\n                        <Prefix>prefix~</Prefix>\n                        <KeyCount>1</KeyCount>\n                        <MaxKeys>1000</MaxKeys>\n                        <IsTruncated>false</IsTruncated>\n                        <Contents>\n                            <Key>some-file.file</Key>\n                            <LastModified>2009-10-12T17:50:30.000Z</LastModified>\n                            <Size>434234</Size>\n                            <StorageClass>STANDARD</StorageClass>\n                        </Contents>\n                    </ListBucketResult>\n                    \"#,\n                    ))\n                    .unwrap(),\n            ),\n        ]);\n\n        let config = Config::builder()\n            .behavior_version(BehaviorVersion::latest())\n            .region(Region::new(\"us-east-1\"))\n            .http_client(http_client)\n            .sleep_impl(FakeSleep)\n            .retry_config(RetryConfig::standard())\n            .build();\n\n        let client = Client::from_conf(config);\n\n        let _result = runtime\n            .block_on(client.list_objects_v2().bucket(\"test-bucket\").send())\n            .unwrap();\n    }\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/webassembly-no-os/src/wasm32_wasip2.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n#[cfg(test)]\nmod test {\n    use aws_config::timeout::TimeoutConfig;\n    use aws_config::{retry::RetryConfig, BehaviorVersion};\n    use aws_sdk_s3::Client;\n    use aws_sdk_s3::{config::Region, Config};\n    use aws_smithy_http_client::test_util::{ReplayEvent, StaticReplayClient};\n    use aws_smithy_types::body::SdkBody;\n    use aws_smithy_wasm::wasi::WasiHttpClientBuilder;\n\n    // Test constructing an operation using an SdkConfig with a WASI http client\n    // We do not send the request to keep these tests sandboxable, a full test of\n    // the client is in the SDK canary.\n    #[tokio::test]\n    async fn test_operation_construction() {\n        let http_client = WasiHttpClientBuilder::new().build();\n        let wasi_config = aws_config::from_env()\n            .region(\"us-east-2\")\n            .timeout_config(TimeoutConfig::disabled())\n            .retry_config(RetryConfig::disabled())\n            .no_credentials()\n            .http_client(http_client)\n            .load()\n            .await;\n\n        let client = Client::new(&wasi_config);\n        let operation = client\n            .list_objects_v2()\n            .bucket(\"nara-national-archives-catalog\")\n            .delimiter(\"/\")\n            .prefix(\"authority-records/organization/\")\n            .max_keys(5);\n\n        assert_eq!(\n            operation.get_bucket(),\n            &Some(\"nara-national-archives-catalog\".to_string())\n        );\n    }\n\n    #[tokio::test]\n    async fn basic_operation_with_retries_no_sleep_no_time() {\n        let http_client = StaticReplayClient::new(vec![\n            ReplayEvent::new(\n                http_1x::Request::builder()\n                    .uri(\"https://www.doesntmatter.com\")\n                    .body(SdkBody::empty())\n                    .unwrap(),\n                http_1x::Response::builder()\n                    .status(500)\n                    .body(SdkBody::from(\"This was an error\"))\n                    .unwrap(),\n            ),\n            ReplayEvent::new(\n                http_1x::Request::builder()\n                    .uri(\"https://www.doesntmatter.com\")\n                    .body(SdkBody::empty())\n                    .unwrap(),\n                http_1x::Response::builder()\n                    .status(500)\n                    .body(SdkBody::from(\"This was an error\"))\n                    .unwrap(),\n            ),\n            ReplayEvent::new(\n                http_1x::Request::builder()\n                    .uri(\"https://www.doesntmatter.com\")\n                    .body(SdkBody::empty())\n                    .unwrap(),\n                http_1x::Response::builder()\n                    .status(200)\n                    .body(SdkBody::from(\n                        r#\"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n                    <ListBucketResult>\n                        <Name>test-bucket</Name>\n                        <Prefix>prefix~</Prefix>\n                        <KeyCount>1</KeyCount>\n                        <MaxKeys>1000</MaxKeys>\n                        <IsTruncated>false</IsTruncated>\n                        <Contents>\n                            <Key>some-file.file</Key>\n                            <LastModified>2009-10-12T17:50:30.000Z</LastModified>\n                            <Size>434234</Size>\n                            <StorageClass>STANDARD</StorageClass>\n                        </Contents>\n                    </ListBucketResult>\n                    \"#,\n                    ))\n                    .unwrap(),\n            ),\n        ]);\n\n        let config = Config::builder()\n            .behavior_version(BehaviorVersion::latest())\n            .region(Region::new(\"us-east-1\"))\n            .http_client(http_client)\n            .retry_config(RetryConfig::standard())\n            .build();\n\n        let client = Client::from_conf(config);\n\n        let result = client\n            .list_objects_v2()\n            .bucket(\"test-bucket\")\n            .send()\n            .await\n            .unwrap();\n\n        assert_eq!(result.name.unwrap(), \"test-bucket\");\n        assert_eq!(result.prefix.unwrap(), \"prefix~\");\n    }\n}\n"
  },
  {
    "path": "aws/sdk/integration-tests/webassembly-wstd/.cargo/config.toml",
    "content": "[build]\ntarget = [\"wasm32-unknown-unknown\", \"wasm32-wasip2\"]\n\n[target.wasm32-wasip2]\nrunner = [\n    \"wasmtime\",\n    \"-C\", \"cache=n\",\n    \"-S\", \"preview2=y\",\n    \"-S\", \"http=y\"\n]\n\n\n[target.wasm32-unknown-unknown]\n# Required for getrandom crate to compile\n# https://docs.rs/getrandom/0.3.3/getrandom/#webassembly-support\nrustflags = ['--cfg', 'getrandom_backend=\"wasm_js\"']\nrunner = [\n    \"./run-wasm32-unknown-unknown.sh\",\n]\n"
  },
  {
    "path": "aws/sdk/integration-tests/webassembly-wstd/Cargo.toml",
    "content": "# This Cargo.toml is unused in generated code. It exists solely to enable these tests to compile in-situ\n[package]\nname = \"webassembly-wstd\"\nversion = \"0.1.0\"\nauthors = [\n    \"Eduardo Rodrigues <16357187+eduardomourar@users.noreply.github.com>\",\n    \"Pat Hickey <pat@moreproductive.org>\"\n]\ndescription = \"\"\"\nThese tests ensure that things will fail (or not fail) as expected\nwhen target is set to wasm32-wasip2 for all SDK and runtime crates.\n\"\"\"\nedition = \"2021\"\nlicense = \"Apache-2.0\"\nrepository = \"https://github.com/smithy-lang/smithy-rs\"\npublish = false\n\n[target.'cfg(all(target_family = \"wasm\", target_env = \"p2\"))'.dependencies]\naws-config = { path = \"../../build/aws-sdk/sdk/aws-config\", default-features = false, features = [\n    \"behavior-version-latest\"\n] }\naws-credential-types = { path = \"../../build/aws-sdk/sdk/aws-credential-types\", features = [\"hardcoded-credentials\"] }\naws-sdk-s3 = { path = \"../../build/aws-sdk/sdk/s3\", default-features = false }\naws-smithy-async = { path = \"../../build/aws-sdk/sdk/aws-smithy-async\", default-features = false }\naws-smithy-http = { path = \"../../build/aws-sdk/sdk/aws-smithy-http\", default-features = false }\naws-smithy-http-client = { path = \"../../build/aws-sdk/sdk/aws-smithy-http-client\", default-features = false, features = [\"test-util\"] }\naws-smithy-runtime = { path = \"../../build/aws-sdk/sdk/aws-smithy-runtime\", features = [\"client\"] }\naws-smithy-runtime-api = { path = \"../../build/aws-sdk/sdk/aws-smithy-runtime-api\", features = [\"client\"] }\naws-smithy-types = { path = \"../../build/aws-sdk/sdk/aws-smithy-types\" }\naws-smithy-wasm = { path = \"../../build/aws-sdk/sdk/aws-smithy-wasm\" }\nhttp-1x = { package = \"http\", version = \"1\" }\nwstd = \"0.6.5\"\n"
  },
  {
    "path": "aws/sdk/integration-tests/webassembly-wstd/src/lib.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n#![cfg(all(target_arch = \"wasm32\", target_env = \"p2\"))]\n\n#[cfg(test)]\nmod test {\n    use aws_config::timeout::TimeoutConfig;\n    use aws_config::{retry::RetryConfig, BehaviorVersion};\n    use aws_sdk_s3::Client;\n    use aws_sdk_s3::{config::Region, Config};\n    use aws_smithy_http_client::test_util::{ReplayEvent, StaticReplayClient};\n    use aws_smithy_types::body::SdkBody;\n    use aws_smithy_wasm::wasi::{WasiHttpClientBuilder, WasiSleep};\n\n    // Test constructing an operation using an SdkConfig with a WASI http client\n    // We do not send the request to keep these tests sandboxable, a full test of\n    // the client is in the SDK canary.\n    #[wstd::test]\n    async fn test_operation_construction() {\n        let http_client = WasiHttpClientBuilder::new().build();\n        let wasi_config = aws_config::from_env()\n            .region(\"us-east-2\")\n            .timeout_config(TimeoutConfig::disabled())\n            .retry_config(RetryConfig::disabled())\n            .no_credentials()\n            .http_client(http_client)\n            .sleep_impl(WasiSleep)\n            .load()\n            .await;\n\n        let client = Client::new(&wasi_config);\n        let operation = client\n            .list_objects_v2()\n            .bucket(\"nara-national-archives-catalog\")\n            .delimiter(\"/\")\n            .prefix(\"authority-records/organization/\")\n            .max_keys(5);\n\n        assert_eq!(\n            operation.get_bucket(),\n            &Some(\"nara-national-archives-catalog\".to_string())\n        );\n    }\n\n    #[wstd::test]\n    async fn basic_operation_with_retries() {\n        let http_client = StaticReplayClient::new(vec![\n            ReplayEvent::new(\n                http_1x::Request::builder()\n                    .uri(\"https://www.doesntmatter.com\")\n                    .body(SdkBody::empty())\n                    .unwrap(),\n                http_1x::Response::builder()\n                    .status(500)\n                    .body(SdkBody::from(\"This was an error\"))\n                    .unwrap(),\n            ),\n            ReplayEvent::new(\n                http_1x::Request::builder()\n                    .uri(\"https://www.doesntmatter.com\")\n                    .body(SdkBody::empty())\n                    .unwrap(),\n                http_1x::Response::builder()\n                    .status(500)\n                    .body(SdkBody::from(\"This was an error\"))\n                    .unwrap(),\n            ),\n            ReplayEvent::new(\n                http_1x::Request::builder()\n                    .uri(\"https://www.doesntmatter.com\")\n                    .body(SdkBody::empty())\n                    .unwrap(),\n                http_1x::Response::builder()\n                    .status(200)\n                    .body(SdkBody::from(\n                        r#\"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n                    <ListBucketResult>\n                        <Name>test-bucket</Name>\n                        <Prefix>prefix~</Prefix>\n                        <KeyCount>1</KeyCount>\n                        <MaxKeys>1000</MaxKeys>\n                        <IsTruncated>false</IsTruncated>\n                        <Contents>\n                            <Key>some-file.file</Key>\n                            <LastModified>2009-10-12T17:50:30.000Z</LastModified>\n                            <Size>434234</Size>\n                            <StorageClass>STANDARD</StorageClass>\n                        </Contents>\n                    </ListBucketResult>\n                    \"#,\n                    ))\n                    .unwrap(),\n            ),\n        ]);\n\n        let config = Config::builder()\n            .behavior_version(BehaviorVersion::latest())\n            .region(Region::new(\"us-east-1\"))\n            .http_client(http_client)\n            .sleep_impl(WasiSleep)\n            .retry_config(RetryConfig::standard())\n            .build();\n\n        let client = Client::from_conf(config);\n\n        let result = client\n            .list_objects_v2()\n            .bucket(\"test-bucket\")\n            .send()\n            .await\n            .unwrap();\n\n        assert_eq!(result.name.unwrap(), \"test-bucket\");\n        assert_eq!(result.prefix.unwrap(), \"prefix~\");\n    }\n}\n"
  },
  {
    "path": "aws/sdk/sdk-external-types.toml",
    "content": "# These are the allowed external types in the `aws-sdk-*` generated crates, checked by CI.\nallowed_external_types = [\n    \"aws_smithy_types::*\",\n    \"aws_credential_types::*\",\n    \"aws_types::*\",\n    \"aws_smithy_runtime_api::*\",\n    \"aws_smithy_async::rt::sleep::*\",\n    \"aws_smithy_async::time::*\",\n    \"aws_smithy_async::future::pagination_stream::PaginationStream\",\n    # only allowed in from impl for presigned request\n    \"http::request::Request\",\n\n    # TODO(https://github.com/smithy-lang/smithy-rs/issues/1193): Once tooling permits it, only allow the following types in the `event-stream` feature\n    \"aws_smithy_eventstream::*\",\n\n    \"aws_smithy_runtime::client::identity::cache::IdentityCache\",\n    \"aws_smithy_runtime::client::retries::RetryPartition\",\n    \"aws_smithy_runtime::client::retries::client_rate_limiter::ClientRateLimiter\",\n    \"aws_smithy_runtime::client::retries::token_bucket::TokenBucket\",\n\n    \"aws_runtime::invocation_id::SharedInvocationIdGenerator\",\n    \"aws_runtime::invocation_id::InvocationIdGenerator\",\n\n    # Only exposed in transcribestreaming. This crate will be major version bumped if we MV aws_smithy_http\n    \"aws_smithy_http::event_stream::sender::EventStreamSender\",\n]\n"
  },
  {
    "path": "aws/sdk/sync-models.py",
    "content": "#!/usr/bin/env python3\n#  Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n#  SPDX-License-Identifier: Apache-2.0\n\nimport sys\nimport os\nimport os.path as path\nfrom pathlib import Path\nimport subprocess\n\n# Ensure working directory is the script path\nscript_path = path.dirname(path.realpath(__file__))\n\n# Looks for aws-sdk-rust in the parent directory of smithy-rs\ndef discover_aws_models():\n    repo_path = path.abspath(path.join(script_path, \"../../../aws-sdk-rust\"))\n    git_path = repo_path + \"/.git\"\n    if path.exists(repo_path) and path.exists(git_path):\n        print(f\"Discovered aws-models at {repo_path}\")\n        return Path(repo_path) / 'aws-models'\n    else:\n        return None\n\ndef copy_model(source_path, model_path):\n    dest_path = Path(\"aws-models\") / model_path\n    source = source_path.read_text()\n    # Add a newline at the end when copying the model over\n    with open(dest_path, \"w\") as file:\n        file.write(source)\n        if not source.endswith(\"\\n\"):\n            file.write(\"\\n\")\n\ndef copy_known_models(aws_models_repo):\n    known_models = set()\n    for model_file in os.listdir(\"aws-models\"):\n        if not model_file.endswith('.json'):\n            continue\n        known_models.add(model_file)\n        source_path = Path(aws_models_repo) / model_file\n        if not source_path.exists():\n            print(f\"  Warning: cannot find model for '{model_file}' in aws-models, but it exists in smithy-rs\")\n            continue\n        copy_model(source_path, model_file)\n    return known_models\n\ndef copy_sdk_configs(aws_models_repo):\n    for model_file in os.listdir(aws_models_repo):\n        if model_file.startswith('sdk-'):\n            print('copying SDK configuration file', model_file)\n            copy_model(aws_models_repo / model_file, model_file)\ndef main():\n    # Acquire model location\n    aws_models_repo = discover_aws_models()\n    if aws_models_repo == None:\n        if len(sys.argv) != 2:\n            print(\"Please provide the location of the aws-models repository as the first argument\")\n            sys.exit(1)\n        else:\n            aws_models_repo = sys.argv[1]\n\n    print(\"Copying over known models...\")\n    copy_known_models(aws_models_repo)\n    copy_sdk_configs(aws_models_repo)\n\n    print(\"Models synced.\")\n\nif __name__ == \"__main__\":\n    main()\n"
  },
  {
    "path": "aws/sdk/test-services.py",
    "content": "#  Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n#  SPDX-License-Identifier: Apache-2.0\n\n\"\"\"\nGenerate a list of services which have non-trivial unit tests\n\nThis script generates output like `-p aws-sdk-s3 -p aws-sdk-dynamodb`. It is intended to be used in conjunction with\n`cargo test` to compile a subset of services when running tests:\n\n```bash\ncargo test $(python test-services.py)\n```\n\"\"\"\n\nimport os\nfrom pathlib import Path\n\n\ndef main():\n    # change working directory to `aws/sdk`:\n    script_path = os.path.abspath(__file__)\n    os.chdir(os.path.dirname(script_path))\n\n    services = set()\n    for service in os.listdir('integration-tests'):\n        if os.path.isdir(Path('integration-tests') / service):\n            services.add(service)\n\n    for model in os.listdir('aws-models'):\n        if model.endswith('-tests.smithy'):\n            service = model[:-len('-tests.smithy')]\n            services.add(service)\n\n    services = sorted(list(services))\n    aws_packages = set()\n    for aws_package in os.listdir('../rust-runtime'):\n        if aws_package.startswith('aws-') and 'inlineable' not in aws_package:\n            aws_packages.add(aws_package)\n    as_arguments = [f'-p aws-sdk-{service}' for service in services]\n    as_arguments.extend([f'-p {aws_package}' for aws_package in aws_packages])\n\n    print(' '.join(as_arguments), end='')\n\n\nif __name__ == \"__main__\":\n    main()\n"
  },
  {
    "path": "aws/sdk-adhoc-test/.gitignore",
    "content": "smithy-build.json\n"
  },
  {
    "path": "aws/sdk-adhoc-test/README.md",
    "content": "AWS SDK Adhoc Codegen Test\n==========================\n\nThis module tests that adhoc SDKs can be generated without the rest of the\nrelease automation machinery used to make the official SDK releases.\nThe `build.gradle.kts` generates a `smithy-build.json` file as part of\nthe build, and the Smithy build plugin then invokes the SDK codegen\nto generate a client.\n\nThis module also exists to code generate and execute service specific protocol tests such as\n[ApiGateway](https://github.com/awslabs/smithy/blob/main/smithy-aws-protocol-tests/model/restJson1/services/apigateway.smithy).\n\nUsage\n-----\n\n```\n# From repo root:\n./gradlew :aws:sdk-adhoc-test:test\n```\n"
  },
  {
    "path": "aws/sdk-adhoc-test/build.gradle.kts",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nextra[\"displayName\"] = \"Smithy :: Rust :: AWS-SDK :: Ad-hoc Test\"\nextra[\"moduleName\"] = \"software.amazon.smithy.rust.awssdk.adhoc.test\"\n\ntasks[\"jar\"].enabled = false\n\nplugins {\n    java\n    alias(libs.plugins.smithy.gradle.base)\n    alias(libs.plugins.smithy.gradle.jar)\n}\n\nval properties = PropertyRetriever(rootProject, project)\n\nval pluginName = \"rust-client-codegen\"\nval workingDirUnderBuildDir = \"smithyprojections/sdk-adhoc-test/\"\n\nconfigure<software.amazon.smithy.gradle.SmithyExtension> {\n    outputDirectory = layout.buildDirectory.dir(workingDirUnderBuildDir).get().asFile\n}\n\nval checkedInSdkLockfile = rootProject.projectDir.resolve(\"aws/sdk/Cargo.lock\")\n\ndependencies {\n    implementation(project(\":aws:codegen-aws-sdk\"))\n    implementation(libs.smithy.aws.protocol.tests)\n    implementation(libs.smithy.protocol.test.traits)\n    implementation(libs.smithy.aws.traits)\n    implementation(libs.smithy.model)\n}\n\nfun getNullabilityCheckMode(): String = properties.get(\"nullability.check.mode\") ?: \"CLIENT_CAREFUL\"\n\nfun baseTest(service: String, module: String, imports: List<String> = listOf()): CodegenTest {\n    return CodegenTest(\n        service = service,\n        module = module,\n        imports = imports,\n        extraCodegenConfig = \"\"\"\n            \"includeFluentClient\": false,\n            \"nullabilityCheckMode\": \"${getNullabilityCheckMode()}\"\n        \"\"\",\n    )\n}\n\nval allCodegenTests = listOf(\n    baseTest(\n        \"com.amazonaws.testservice#TestService\",\n        \"endpoint-test-service\",\n        imports = listOf(\"models/single-static-endpoint.smithy\"),\n    ),\n    baseTest(\n        \"com.amazonaws.testservice#RequiredValues\",\n        \"required-values\",\n        imports = listOf(\"models/required-value-test.smithy\"),\n    ),\n    // service specific protocol tests\n    baseTest(\n        \"com.amazonaws.apigateway#BackplaneControlService\",\n        \"apigateway\",\n        imports = listOf(\"models/apigateway-rules.smithy\"),\n    ),\n    baseTest(\n        \"com.amazonaws.glacier#Glacier\",\n        \"glacier\",\n    ),\n    // TODO(https://github.com/smithy-lang/smithy-rs/issues/139) - we assume this will be handled by EP2.0 rules but\n    //  the machinelearning service model has yet to be updated to include rules that handle the expected customization\n    // baseTest(\n    //     \"com.amazonaws.machinelearning#AmazonML_20141212\",\n    //     \"machinelearning\",\n    // ),\n)\n\nproject.registerGenerateSmithyBuildTask(rootProject, pluginName, allCodegenTests)\nproject.registerGenerateCargoWorkspaceTask(rootProject, pluginName, allCodegenTests, workingDirUnderBuildDir)\nproject.registerGenerateCargoConfigTomlTask(layout.buildDirectory.dir(workingDirUnderBuildDir).get().asFile)\nproject.registerCopyCheckedInCargoLockfileTask(checkedInSdkLockfile, layout.buildDirectory.dir(workingDirUnderBuildDir).get().asFile)\n\ntasks[\"smithyBuild\"].dependsOn(\"generateSmithyBuild\")\ntasks[\"assemble\"].dependsOn(\"generateCargoWorkspace\").finalizedBy(\"copyCheckedInCargoLockfile\")\n\nproject.registerModifyMtimeTask()\nproject.registerCargoCommandsTasks(layout.buildDirectory.dir(workingDirUnderBuildDir).get().asFile)\n\ntasks[\"test\"].finalizedBy(cargoCommands(properties).map { it.toString })\n\ntasks[\"clean\"].doFirst { delete(\"smithy-build.json\") }\n"
  },
  {
    "path": "aws/sdk-adhoc-test/models/apigateway-rules.smithy",
    "content": "// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\n// The API Gateway model is coming from Smithy's protocol tests, and includes an `Accept` header test:\n// https://github.com/awslabs/smithy/blob/2f6553ff39e6bba9edc644ef5832661821785319/smithy-aws-protocol-tests/model/restJson1/services/apigateway.smithy#L30-L43\n\n$version: \"1.0\"\n\nnamespace com.amazonaws.apigateway\n\nuse smithy.rules#endpointRuleSet\n\n// Add an endpoint ruleset to the Smithy protocol test API Gateway model so that the code generator doesn't fail\napply BackplaneControlService @endpointRuleSet({\n    \"version\": \"1.0\",\n    \"rules\": [{\n                  \"type\": \"endpoint\",\n                  \"conditions\": [],\n                  \"endpoint\": { \"url\": \"https://www.example.com\" }\n              }],\n    \"parameters\": {\n        \"Region\": { \"required\": false, \"type\": \"String\", \"builtIn\": \"AWS::Region\" },\n    }\n})\n"
  },
  {
    "path": "aws/sdk-adhoc-test/models/required-value-test.smithy",
    "content": "$version: \"1.0\"\n\nnamespace com.amazonaws.testservice\n\nuse aws.api#service\nuse aws.protocols#restJson1\n\n@restJson1\n@title(\"Test Service\")\n@service(sdkId: \"Test\")\n@aws.auth#sigv4(name: \"test-service\")\nservice RequiredValues {\n    operations: [TestOperation]\n}\n\n@http(method: \"GET\", uri: \"/\")\noperation TestOperation {\n    errors: [Error]\n}\n\n@error(\"client\")\nstructure Error {\n    @required\n    requestId: String\n\n    @required\n    message: String\n}\n"
  },
  {
    "path": "aws/sdk-adhoc-test/models/single-static-endpoint.smithy",
    "content": "$version: \"2\"\nnamespace com.amazonaws.testservice\n\nuse aws.api#service\nuse aws.protocols#restJson1\nuse smithy.rules#endpointRuleSet\nuse smithy.rules#endpointTests\n\n@endpointRuleSet({\n    \"version\": \"1.0\",\n    \"parameters\": {\n        \"Region\": {\n            \"required\": true,\n            \"type\": \"String\",\n            \"builtIn\": \"AWS::Region\",\n            \"default\": \"us-east-2\",\n        },\n    },\n    \"rules\": [\n        {\n            \"type\": \"endpoint\",\n            \"conditions\": [],\n            \"endpoint\": {\n                \"url\": \"https://prod.{Region}.api.myservice.aws.dev\",\n                \"properties\": {\n                    \"authSchemes\": [{\n                                        \"name\": \"sigv4\",\n                                        \"signingRegion\": \"{Region}\",\n                                        \"signingName\": \"blah\"\n                                    }]\n                }\n            }\n        }\n    ]\n})\n@endpointTests({\"version\": \"1\", \"testCases\": [\n    {\n        \"documentation\": \"region set\",\n        \"expect\": {\n            \"endpoint\": {\n                \"url\": \"https://prod.us-east-1.api.myservice.aws.dev\",\n                \"properties\": {\n                    \"authSchemes\": [{\n                                        \"name\": \"sigv4\",\n                                        \"signingRegion\": \"us-east-1\",\n                                        \"signingName\": \"blah\"\n                                    }]\n\n                }\n            }\n        },\n        \"params\": { \"Region\": \"us-east-1\" }\n        \"operationInputs\": [ ]\n    },\n    {\n        \"documentation\": \"region should fallback to the default\",\n        \"expect\": {\n            \"endpoint\": {\n                \"url\": \"https://prod.us-east-2.api.myservice.aws.dev\",\n                \"properties\": {\n                    \"authSchemes\": [{\n                                        \"name\": \"sigv4\",\n                                        \"signingRegion\": \"us-east-2\",\n                                        \"signingName\": \"blah\"\n                                    }]\n\n                }\n            }\n        },\n        \"params\": { }\n        \"operationInputs\": [\n            { \"operationName\": \"TestOperation\", \"operationParams\": {\n                \"bar\": { f: \"blah\" }\n              } }\n        ]\n    }]\n})\n@restJson1\n@title(\"Test Service\")\n@service(sdkId: \"Test\")\n@aws.auth#sigv4(name: \"test-service\")\nservice TestService {\n    operations: [TestOperation]\n}\n\n@input\nstructure Foo { bar: Bar }\n\nstructure Bar { f: String }\n\n@http(uri: \"/foo\", method: \"POST\")\noperation TestOperation {\n    input: Foo\n}\n"
  },
  {
    "path": "build.gradle.kts",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport org.jreleaser.model.Active\n\nbuildscript {\n    repositories {\n        mavenCentral()\n        google()\n    }\n\n    dependencies {\n        classpath(libs.kotlin.gradle.plugin)\n    }\n}\n\nplugins {\n    alias(libs.plugins.jreleaser)\n}\n\n\nallprojects {\n    val allowLocalDeps: String by project\n    repositories {\n        if (allowLocalDeps.toBoolean()) {\n            mavenLocal()\n        }\n        mavenCentral()\n        google()\n    }\n\n    group = \"software.amazon.smithy.rust\"\n    val codegenVersion: String by project\n    version = codegenVersion\n}\n\n\n// jreleaser requires a \"clean\" task to exist\ntasks.register(\"clean\")\n\n// Register custom tasks for Maven Central publishing\ntasks.register<tasks.VerifyCodegenVersionBump>(\"verifyCodegenVersionBump\")\ntasks.register<tasks.CheckMavenCentralPublishingNeeded>(\"checkMavenCentralPublishingNeeded\")\n\njreleaser {\n    // Creates a generic release, which won't publish anything (we are only interested in publishing the jar)\n    // https://jreleaser.org/guide/latest/reference/release/index.html\n    release {\n        generic {\n            enabled = true\n            skipRelease = true\n        }\n    }\n\n    // Used to announce a release to configured announcers.\n    // https://jreleaser.org/guide/latest/reference/announce/index.html\n    announce {\n        active = Active.NEVER\n    }\n\n    // Signing configuration.\n    // https://jreleaser.org/guide/latest/reference/signing.html\n    signing {\n        active = Active.ALWAYS\n        armored = true\n    }\n\n    // Configuration for deploying to Maven Central.\n    // https://jreleaser.org/guide/latest/examples/maven/maven-central.html#_gradle\n    deploy {\n        maven {\n            mavenCentral {\n                create(\"maven-central\") {\n                    active = Active.ALWAYS\n                    url = \"https://central.sonatype.com/api/v1/publisher\"\n                    stagingRepository(stagingDir().get().asFile.path)\n                    maxRetries = 100\n                    retryDelay = 60\n                }\n            }\n        }\n    }\n}\n\n\n\n\nval ktlint by configurations.creating\n\ndependencies {\n    ktlint(libs.ktlint.cli) {\n        attributes {\n            attribute(Bundling.BUNDLING_ATTRIBUTE, objects.named(Bundling.EXTERNAL))\n        }\n    }\n}\n\nval lintPaths =\n    listOf(\n        \"**/*.kt\",\n        // Exclude build output directories\n        \"!**/build/**\",\n        \"!**/node_modules/**\",\n        \"!**/target/**\",\n    )\n\ntasks.register<JavaExec>(\"ktlint\") {\n    description = \"Check Kotlin code style.\"\n    group = LifecycleBasePlugin.VERIFICATION_GROUP\n    classpath = ktlint\n    mainClass.set(\"com.pinterest.ktlint.Main\")\n    args = listOf(\"--log-level=info\", \"--relative\", \"--\") + lintPaths\n    // https://github.com/pinterest/ktlint/issues/1195#issuecomment-1009027802\n    jvmArgs(\"--add-opens\", \"java.base/java.lang=ALL-UNNAMED\")\n}\n\ntasks.register<JavaExec>(\"ktlintFormat\") {\n    description = \"Auto fix Kotlin code style violations\"\n    group = LifecycleBasePlugin.VERIFICATION_GROUP\n    classpath = ktlint\n    mainClass.set(\"com.pinterest.ktlint.Main\")\n    args = listOf(\"--log-level=info\", \"--relative\", \"--format\", \"--\") + lintPaths\n    // https://github.com/pinterest/ktlint/issues/1195#issuecomment-1009027802\n    jvmArgs(\"--add-opens\", \"java.base/java.lang=ALL-UNNAMED\")\n}\n\nif (System.getProperties().containsKey(\"ktlintPreCommitArgs\")) {\n    tasks.register<JavaExec>(\"ktlintPreCommit\") {\n        description = \"Check Kotlin code style (for the pre-commit hooks).\"\n        group = LifecycleBasePlugin.VERIFICATION_GROUP\n        classpath = ktlint\n        mainClass.set(\"com.pinterest.ktlint.Main\")\n        args = listOf(\"--log-level=warn\", \"--color\", \"--relative\", \"--format\", \"--\") +\n            System.getProperty(\"ktlintPreCommitArgs\").let { args ->\n                check(args.isNotBlank()) { \"need to pass in -DktlintPreCommitArgs=<some file paths to check>\" }\n                args.split(\" \")\n            }\n        // https://github.com/pinterest/ktlint/issues/1195#issuecomment-1009027802\n        jvmArgs(\"--add-opens\", \"java.base/java.lang=ALL-UNNAMED\")\n    }\n}\n"
  },
  {
    "path": "buildSrc/build.gradle.kts",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport org.gradle.api.tasks.testing.logging.TestExceptionFormat\nimport org.jetbrains.kotlin.gradle.dsl.JvmTarget\n\nplugins {\n    `kotlin-dsl`\n}\n\nrepositories {\n    mavenCentral()\n    google()\n}\n\njava {\n    sourceCompatibility = JavaVersion.VERSION_11\n    targetCompatibility = JavaVersion.VERSION_11\n}\n\ntasks.compileKotlin {\n    compilerOptions.jvmTarget.set(JvmTarget.JVM_11)\n}\n\ntasks.compileTestKotlin {\n    compilerOptions.jvmTarget.set(JvmTarget.JVM_11)\n}\n\ndependencies {\n    api(libs.smithy.codegen.core)\n    implementation(libs.smithy.utils)\n    implementation(libs.smithy.protocol.test.traits)\n    implementation(libs.smithy.aws.traits)\n    implementation(libs.smithy.aws.iam.traits)\n    implementation(libs.smithy.aws.cloudformation.traits)\n    implementation(gradleApi())\n    implementation(libs.toml4j)\n    // required for convention plugins to use\n    implementation(libs.kotlin.gradle.plugin)\n    testImplementation(libs.junit.jupiter)\n\n    // https://github.com/gradle/gradle/issues/15383\n    implementation(files(libs.javaClass.superclass.protectionDomain.codeSource.location))\n\n    constraints {\n        implementation(\"com.google.code.gson:gson:2.8.9\") {\n            because(\"transitive dependency of toml4j has vulnerabilities; this upgrades it to the patched version\")\n        }\n    }\n}\n\ntasks.test {\n    useJUnitPlatform()\n    testLogging {\n        events(\"passed\", \"skipped\", \"failed\")\n        exceptionFormat = TestExceptionFormat.FULL\n        showCauses = true\n        showExceptions = true\n        showStackTraces = true\n        showStandardStreams = true\n    }\n}\n"
  },
  {
    "path": "buildSrc/settings.gradle.kts",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\ndependencyResolutionManagement {\n    versionCatalogs {\n        create(\"libs\") {\n            from(files(\"../gradle/libs.versions.toml\"))\n        }\n    }\n}\n"
  },
  {
    "path": "buildSrc/src/main/kotlin/CodegenTestCommon.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport org.gradle.api.Project\nimport org.gradle.api.tasks.Copy\nimport org.gradle.api.tasks.Exec\nimport org.gradle.kotlin.dsl.extra\nimport org.gradle.kotlin.dsl.register\nimport java.io.File\n\n/**\n * This file contains common functionality shared across the build scripts for the\n * `codegen-client-test` and `codegen-server-test` modules.\n */\n\ndata class CodegenTest(\n    val service: String,\n    val module: String,\n    val extraConfig: String? = null,\n    val extraCodegenConfig: String? = null,\n    val imports: List<String> = emptyList(),\n)\n\n/**\n * Extension function to generate both http@0 (legacy) and http@1 versions of a CodegenTest.\n *\n * @return List containing both http@0 (with -http0x suffix) and http@1 (no suffix) versions\n */\nfun CodegenTest.bothHttpVersions(): List<CodegenTest> {\n    return listOf(\n        // http@0 version (legacy) - no http-1x flag, add -http0x suffix\n        this.copy(\n            module = \"${this.module}-http0x\",\n        ),\n        // http@1 version - with http-1x flag, no suffix\n        this.copy(\n            extraCodegenConfig =\n                if (this.extraCodegenConfig?.isNotEmpty() == true) {\n                    \"\"\"\"http-1x\": true, ${this.extraCodegenConfig}\"\"\"\n                } else {\n                    \"\"\"\"http-1x\": true\"\"\"\n                },\n        ),\n    )\n}\n\nfun generateImports(imports: List<String>): String =\n    if (imports.isEmpty()) {\n        \"\"\n    } else {\n        \"\\\"imports\\\": [${imports.joinToString(\", \") { \"\\\"$it\\\"\" }}],\"\n    }\n\nval RustKeywords =\n    setOf(\n        \"as\",\n        \"break\",\n        \"const\",\n        \"continue\",\n        \"crate\",\n        \"else\",\n        \"enum\",\n        \"extern\",\n        \"false\",\n        \"fn\",\n        \"for\",\n        \"if\",\n        \"impl\",\n        \"in\",\n        \"let\",\n        \"loop\",\n        \"match\",\n        \"mod\",\n        \"move\",\n        \"mut\",\n        \"pub\",\n        \"ref\",\n        \"return\",\n        \"self\",\n        \"Self\",\n        \"static\",\n        \"struct\",\n        \"super\",\n        \"trait\",\n        \"true\",\n        \"type\",\n        \"unsafe\",\n        \"use\",\n        \"where\",\n        \"while\",\n        \"async\",\n        \"await\",\n        \"dyn\",\n        \"abstract\",\n        \"become\",\n        \"box\",\n        \"do\",\n        \"final\",\n        \"macro\",\n        \"override\",\n        \"priv\",\n        \"typeof\",\n        \"unsized\",\n        \"virtual\",\n        \"yield\",\n        \"try\",\n    )\n\nfun toRustCrateName(input: String): String {\n    if (input.isBlank()) {\n        throw IllegalArgumentException(\"Rust crate name cannot be empty\")\n    }\n    val lowerCased = input.lowercase()\n    // Replace any sequence of characters that are not lowercase letters, numbers, dashes, or underscores with a single underscore.\n    val sanitized = lowerCased.replace(Regex(\"[^a-z0-9_-]+\"), \"_\")\n    // Trim leading or trailing underscores.\n    val trimmed = sanitized.trim('_')\n    // Check if the resulting string is empty, purely numeric, or a reserved name\n    val finalName =\n        when {\n            trimmed.isEmpty() -> throw IllegalArgumentException(\"Rust crate name after sanitizing cannot be empty.\")\n            trimmed.matches(Regex(\"\\\\d+\")) -> \"n$trimmed\" // Prepend 'n' if the name is purely numeric.\n            trimmed in RustKeywords -> \"${trimmed}_\" // Append an underscore if the name is reserved.\n            else -> trimmed\n        }\n    return finalName\n}\n\nprivate fun generateSmithyBuild(\n    projectDir: String,\n    pluginName: String,\n    tests: List<CodegenTest>,\n): String {\n    val projections =\n        tests.joinToString(\",\\n\") {\n            \"\"\"\n            \"${it.module}\": {\n                ${generateImports(it.imports)}\n                \"plugins\": {\n                    \"$pluginName\": {\n                        \"runtimeConfig\": {\n                            \"relativePath\": \"$projectDir/rust-runtime\"\n                        },\n                        \"codegen\": {\n                            ${it.extraCodegenConfig ?: \"\"}\n                        },\n                        \"service\": \"${it.service}\",\n                        \"module\": \"${toRustCrateName(it.module)}\",\n                        \"moduleVersion\": \"0.0.1\",\n                        \"moduleDescription\": \"test\",\n                        \"moduleAuthors\": [\"protocoltest@example.com\"]\n                        ${it.extraConfig ?: \"\"}\n                    }\n                }\n            }\n            \"\"\".trimIndent()\n        }\n    return (\n        \"\"\"\n        {\n            \"version\": \"1.0\",\n            \"projections\": {\n                $projections\n            }\n        }\n        \"\"\".trimIndent()\n    )\n}\n\nenum class Cargo(val toString: String) {\n    CHECK(\"cargoCheck\"),\n    TEST(\"cargoTest\"),\n    DOCS(\"cargoDoc\"),\n    CLIPPY(\"cargoClippy\"),\n}\n\nprivate fun generateCargoWorkspace(\n    pluginName: String,\n    tests: List<CodegenTest>,\n) = (\n    \"\"\"\n    [workspace]\n    resolver = \"2\"\n    members = [\n        ${tests.joinToString(\",\") { \"\\\"${it.module}/$pluginName\\\"\" }}\n    ]\n    \"\"\".trimIndent()\n)\n\n/**\n * Filter the service integration tests for which to generate Rust crates in [allTests] using the given [properties].\n */\nprivate fun codegenTests(\n    properties: PropertyRetriever,\n    allTests: List<CodegenTest>,\n): List<CodegenTest> {\n    val modulesOverride = properties.get(\"modules\")?.split(\",\")?.map { it.trim() }\n\n    val ret =\n        if (modulesOverride != null) {\n            println(\"modulesOverride: $modulesOverride\")\n            allTests.filter { modulesOverride.contains(it.module) }\n        } else {\n            allTests\n        }\n    require(ret.isNotEmpty()) {\n        \"None of the provided module overrides (`$modulesOverride`) are valid test services (`${\n            allTests.map {\n                it.module\n            }\n        }`)\"\n    }\n    return ret\n}\n\nval AllCargoCommands = listOf(Cargo.CHECK, Cargo.TEST, Cargo.CLIPPY, Cargo.DOCS)\n\n/**\n * Filter the Cargo commands to be run on the generated Rust crates using the given [properties].\n * The list of Cargo commands that is run by default is defined in [AllCargoCommands].\n */\nfun cargoCommands(properties: PropertyRetriever): List<Cargo> {\n    val cargoCommandsOverride =\n        properties.get(\"cargoCommands\")?.split(\",\")?.map { it.trim() }?.map {\n            when (it) {\n                \"check\" -> Cargo.CHECK\n                \"test\" -> Cargo.TEST\n                \"doc\" -> Cargo.DOCS\n                \"clippy\" -> Cargo.CLIPPY\n                else -> throw IllegalArgumentException(\"Unexpected Cargo command `$it` (valid commands are `check`, `test`, `doc`, `clippy`)\")\n            }\n        }\n\n    val ret =\n        if (cargoCommandsOverride != null) {\n            println(\"cargoCommandsOverride: $cargoCommandsOverride\")\n            AllCargoCommands.filter { cargoCommandsOverride.contains(it) }\n        } else {\n            AllCargoCommands\n        }\n    require(ret.isNotEmpty()) {\n        \"None of the provided cargo commands (`$cargoCommandsOverride`) are valid cargo commands (`${\n            AllCargoCommands.map {\n                it.toString\n            }\n        }`)\"\n    }\n    return ret\n}\n\nfun Project.registerGenerateSmithyBuildTask(\n    rootProject: Project,\n    pluginName: String,\n    allCodegenTests: List<CodegenTest>,\n) {\n    val properties = PropertyRetriever(rootProject, this)\n    this.tasks.register(\"generateSmithyBuild\") {\n        description = \"generate smithy-build.json\"\n        outputs.file(project.projectDir.resolve(\"smithy-build.json\"))\n        // Declare Smithy model files as inputs so task reruns when they change\n        allCodegenTests.flatMap { it.imports }.forEach {\n            val resolvedPath = project.projectDir.resolve(it)\n            if (resolvedPath.exists()) {\n                inputs.file(resolvedPath)\n            }\n        }\n\n        doFirst {\n            project.projectDir.resolve(\"smithy-build.json\")\n                .writeText(\n                    generateSmithyBuild(\n                        rootProject.projectDir.absolutePath,\n                        pluginName,\n                        codegenTests(properties, allCodegenTests),\n                    ),\n                )\n\n            // If this is a rebuild, cache all the hashes of the generated Rust files. These are later used by the\n            // `modifyMtime` task.\n            project.extra[PREVIOUS_BUILD_HASHES_KEY] =\n                project.layout.buildDirectory.get().asFile.walk()\n                    .filter { it.isFile }\n                    .map {\n                        getChecksumForFile(it) to it.lastModified()\n                    }\n                    .toMap()\n        }\n    }\n}\n\nfun Project.registerGenerateCargoWorkspaceTask(\n    rootProject: Project,\n    pluginName: String,\n    allCodegenTests: List<CodegenTest>,\n    workingDirUnderBuildDir: String,\n) {\n    val properties = PropertyRetriever(rootProject, this)\n    project.tasks.register(\"generateCargoWorkspace\") {\n        description = \"generate Cargo.toml workspace file\"\n        val path = project.layout.buildDirectory.file(\"$workingDirUnderBuildDir/Cargo.toml\")\n        outputs.file(path)\n        doFirst {\n            path.get().asFile.writeText(generateCargoWorkspace(pluginName, codegenTests(properties, allCodegenTests)))\n        }\n    }\n}\n\nfun Project.registerGenerateCargoConfigTomlTask(outputDir: File) {\n    this.tasks.register(\"generateCargoConfigToml\") {\n        description = \"generate `.cargo/config.toml`\"\n        // TODO(https://github.com/smithy-lang/smithy-rs/issues/1068): Once doc normalization\n        // is completed, warnings can be prohibited in rustdoc by setting `rustdocflags` to `-D warnings`.\n        doFirst {\n            outputDir.resolve(\".cargo\").mkdirs()\n            outputDir.resolve(\".cargo/config.toml\")\n                .writeText(\n                    \"\"\"\n                    [build]\n                    rustflags = [\"--deny\", \"warnings\", \"--cfg\", \"aws_sdk_unstable\"]\n                    \"\"\".trimIndent(),\n                )\n        }\n    }\n}\n\nfun Project.registerCopyCheckedInCargoLockfileTask(\n    lockfile: File,\n    destinationDir: File,\n) {\n    this.tasks.register<Copy>(\"copyCheckedInCargoLockfile\") {\n        description = \"copy checked-in `Cargo.lock` to the destination directory\"\n        from(lockfile)\n        into(destinationDir)\n    }\n}\n\nconst val PREVIOUS_BUILD_HASHES_KEY = \"previousBuildHashes\"\n\nfun Project.registerModifyMtimeTask() {\n    // Cargo uses `mtime` (among other factors) to determine whether a compilation unit needs a rebuild. While developing,\n    // it is likely that only a small number of the generated crate files are modified across rebuilds. This task compares\n    // the hashes of the newly generated files with the (previously cached) old ones, and restores their `mtime`s if the\n    // hashes coincide.\n    // Debugging tip: it is useful to run with `CARGO_LOG=cargo::core::compiler::fingerprint=trace` to learn why Cargo\n    // determines a compilation unit needs a rebuild.\n    // For more information see https://github.com/smithy-lang/smithy-rs/issues/1412.\n    this.tasks.register(\"modifyMtime\") {\n        description = \"modify Rust files' `mtime` if the contents did not change\"\n        dependsOn(\"generateSmithyBuild\")\n\n        doFirst {\n            if (!project.extra.has(PREVIOUS_BUILD_HASHES_KEY)) {\n                println(\"No hashes from a previous build exist because `generateSmithyBuild` is up to date, skipping `mtime` fixups\")\n            } else {\n                @Suppress(\"UNCHECKED_CAST\")\n                val previousBuildHashes: Map<String, Long> =\n                    project.extra[PREVIOUS_BUILD_HASHES_KEY] as Map<String, Long>\n\n                project.layout.buildDirectory.get().asFile.walk()\n                    .filter { it.isFile }\n                    .map {\n                        getChecksumForFile(it) to it\n                    }\n                    .forEach { (currentHash, currentFile) ->\n                        previousBuildHashes[currentHash]?.also { oldMtime ->\n                            println(\"Setting `mtime` of $currentFile back to `$oldMtime` because its hash `$currentHash` remained unchanged after a rebuild.\")\n                            currentFile.setLastModified(oldMtime)\n                        }\n                    }\n            }\n        }\n    }\n}\n\nfun Project.registerCargoCommandsTasks(outputDir: File) {\n    val dependentTasks =\n        listOfNotNull(\n            \"assemble\",\n            \"generateCargoConfigToml\",\n            this.tasks.findByName(\"modifyMtime\")?.let { \"modifyMtime\" },\n        )\n\n    this.tasks.register<Exec>(Cargo.CHECK.toString) {\n        dependsOn(dependentTasks)\n        workingDir(outputDir)\n        commandLine(\"cargo\", \"check\", \"--lib\", \"--tests\", \"--benches\", \"--all-features\")\n    }\n\n    this.tasks.register<Exec>(Cargo.TEST.toString) {\n        dependsOn(dependentTasks)\n        workingDir(outputDir)\n        commandLine(\"cargo\", \"test\", \"--all-features\", \"--no-fail-fast\")\n    }\n\n    this.tasks.register<Exec>(Cargo.DOCS.toString) {\n        dependsOn(dependentTasks)\n        workingDir(outputDir)\n        val args =\n            mutableListOf(\n                \"--no-deps\",\n                \"--document-private-items\",\n            )\n        commandLine(\"cargo\", \"doc\", *args.toTypedArray())\n    }\n\n    this.tasks.register<Exec>(Cargo.CLIPPY.toString) {\n        dependsOn(dependentTasks)\n        workingDir(outputDir)\n        commandLine(\"cargo\", \"clippy\")\n    }\n}\n"
  },
  {
    "path": "buildSrc/src/main/kotlin/CrateSet.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\ndata class Crate(val name: String, val versionPropertyName: String)\n\nobject CrateSet {\n    const val STABLE_VERSION_PROP_NAME = \"smithy.rs.runtime.crate.stable.version\"\n    const val UNSTABLE_VERSION_PROP_NAME = \"smithy.rs.runtime.crate.unstable.version\"\n\n    /*\n     * Crates marked as `STABLE_VERSION_PROP_NAME` should have the following package metadata in their `Cargo.toml`\n     *\n     * [package.metadata.smithy-rs-release-tooling]\n     * stable = true\n     */\n\n    val StableCrates =\n        setOf(\n            // AWS crates\n            \"aws-config\",\n            \"aws-credential-types\",\n            \"aws-runtime\",\n            \"aws-runtime-api\",\n            \"aws-sigv4\",\n            \"aws-types\",\n            // smithy crates\n            \"aws-smithy-async\",\n            \"aws-smithy-runtime-api\",\n            \"aws-smithy-runtime-api-macros\",\n            \"aws-smithy-runtime\",\n            \"aws-smithy-types\",\n            \"aws-smithy-http-client\",\n        )\n\n    val version = { name: String ->\n        when {\n            StableCrates.contains(name) -> STABLE_VERSION_PROP_NAME\n            else -> UNSTABLE_VERSION_PROP_NAME\n        }\n    }\n\n    // If we make changes to `AWS_SDK_RUNTIME`, also update the list in\n    // https://github.com/smithy-lang/smithy-rs/blob/main/tools/ci-build/sdk-lockfiles/src/audit.rs#L22\n    val AWS_SDK_RUNTIME =\n        listOf(\n            \"aws-config\",\n            \"aws-credential-types\",\n            \"aws-runtime\",\n            \"aws-runtime-api\",\n            \"aws-sigv4\",\n            \"aws-types\",\n        ).map { Crate(it, version(it)) }\n\n    val SMITHY_RUNTIME_COMMON =\n        listOf(\n            \"aws-smithy-async\",\n            \"aws-smithy-cbor\",\n            \"aws-smithy-checksums\",\n            \"aws-smithy-compression\",\n            \"aws-smithy-dns\",\n            \"aws-smithy-eventstream\",\n            \"aws-smithy-experimental\",\n            \"aws-smithy-http\",\n            \"aws-smithy-http-client\",\n            \"aws-smithy-json\",\n            \"aws-smithy-legacy-http\",\n            \"aws-smithy-mocks\",\n            \"aws-smithy-observability\",\n            \"aws-smithy-observability-otel\",\n            \"aws-smithy-protocol-test\",\n            \"aws-smithy-query\",\n            \"aws-smithy-runtime\",\n            \"aws-smithy-runtime-api\",\n            \"aws-smithy-runtime-api-macros\",\n            \"aws-smithy-types\",\n            \"aws-smithy-types-convert\",\n            \"aws-smithy-wasm\",\n            \"aws-smithy-xml\",\n        ).map { Crate(it, version(it)) }\n\n    val AWS_SDK_SMITHY_RUNTIME = SMITHY_RUNTIME_COMMON\n\n    // If we make changes to `SERVER_SPECIFIC_SMITHY_RUNTIME`, also update the list in\n    // https://github.com/smithy-lang/smithy-rs/blob/main/tools/ci-build/sdk-lockfiles/src/audit.rs#L38\n    private val SERVER_SPECIFIC_SMITHY_RUNTIME =\n        listOf(\n            Crate(\"aws-smithy-http-server\", UNSTABLE_VERSION_PROP_NAME),\n            Crate(\"aws-smithy-http-server-metrics\", UNSTABLE_VERSION_PROP_NAME),\n            Crate(\"aws-smithy-http-server-metrics-macro\", UNSTABLE_VERSION_PROP_NAME),\n            Crate(\"aws-smithy-http-server-python\", UNSTABLE_VERSION_PROP_NAME),\n            Crate(\"aws-smithy-http-server-typescript\", UNSTABLE_VERSION_PROP_NAME),\n            Crate(\"aws-smithy-legacy-http-server\", UNSTABLE_VERSION_PROP_NAME),\n        )\n\n    val SERVER_SMITHY_RUNTIME = SMITHY_RUNTIME_COMMON + SERVER_SPECIFIC_SMITHY_RUNTIME\n\n    val ENTIRE_SMITHY_RUNTIME = (AWS_SDK_SMITHY_RUNTIME + SERVER_SMITHY_RUNTIME).toSortedSet(compareBy { it.name })\n\n    val ALL_CRATES = AWS_SDK_RUNTIME + ENTIRE_SMITHY_RUNTIME\n}\n"
  },
  {
    "path": "buildSrc/src/main/kotlin/Extensions.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport org.gradle.api.Project\nimport org.gradle.api.file.Directory\nimport org.gradle.api.provider.Provider\n\n// JReleaser publishes artifacts from a local staging repository, rather than maven local.\n// https://jreleaser.org/guide/latest/examples/maven/staging-artifacts.html#_gradle\nfun Project.stagingDir(): Provider<Directory> {\n    return rootProject.layout.buildDirectory.dir(\"m2\")\n}\n"
  },
  {
    "path": "buildSrc/src/main/kotlin/HashUtils.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport java.io.File\nimport java.security.MessageDigest\n\nfun ByteArray.toHex() = joinToString(separator = \"\") { byte -> \"%02x\".format(byte) }\n\nfun getChecksumForFile(\n    file: File,\n    digest: MessageDigest = MessageDigest.getInstance(\"SHA-256\"),\n): String = digest.digest(file.readText().toByteArray()).toHex()\n"
  },
  {
    "path": "buildSrc/src/main/kotlin/ManifestPatcher.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport java.io.File\n\nfun rewriteCrateVersion(\n    line: String,\n    version: String,\n): String =\n    line.replace(\n        \"\"\"^\\s*version\\s*=\\s*\"0.0.0-smithy-rs-head\"$\"\"\".toRegex(),\n        \"version = \\\"$version\\\"\",\n    )\n\n/**\n * Dependently versioned Smithy runtime crate versions in smithy-rs are all `0.0.0-smithy-rs-head`.\n * When copying over to the AWS SDK, these should be changed to the corresponding\n * stable/unstable runtime crate version from gradle.properties.\n *\n * In the future when all the runtime crates are independently versioned, this can be removed.\n */\nfun rewriteRuntimeCrateVersion(\n    version: String,\n    line: String,\n): String = rewriteCrateVersion(line, version)\n\n/** Patches a file with the result of the given `operation` being run on each line */\nfun patchFile(\n    path: File,\n    operation: (String) -> String,\n) {\n    val patchedContents = path.readLines().joinToString(\"\\n\", transform = operation)\n    path.writeText(patchedContents)\n}\n"
  },
  {
    "path": "buildSrc/src/main/kotlin/PropertyRetriever.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport org.gradle.api.Project\nimport java.io.File\nimport java.util.Properties\n\nclass PropertyRetriever(private val rootProject: Project, private val project: Project) {\n    /** Get a project property by name if it exists (including from local.properties) */\n    fun get(name: String): String? {\n        if (project.hasProperty(name)) {\n            return project.properties[name].toString()\n        }\n\n        val localProperties = Properties()\n        val propertiesFile: File = rootProject.file(\"local.properties\")\n        if (propertiesFile.exists()) {\n            propertiesFile.inputStream().use { localProperties.load(it) }\n\n            if (localProperties.containsKey(name)) {\n                return localProperties[name].toString()\n            }\n        }\n        return null\n    }\n}\n"
  },
  {
    "path": "buildSrc/src/main/kotlin/RustBuildTool.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nimport org.gradle.api.DefaultTask\nimport org.gradle.api.model.ObjectFactory\nimport org.gradle.api.tasks.Input\nimport org.gradle.api.tasks.InputDirectory\nimport org.gradle.api.tasks.TaskAction\nimport org.gradle.process.internal.DefaultExecSpec\nimport org.gradle.process.internal.ExecActionFactory\nimport java.io.File\nimport javax.inject.Inject\n\nprivate fun runCli(\n    execActionFactory: ExecActionFactory,\n    objectFactory: ObjectFactory,\n    commandLine: List<String>,\n    workingDirectory: File? = null,\n) {\n    execActionFactory.newExecAction().let { action ->\n        objectFactory\n            .newInstance(DefaultExecSpec::class.java)\n            .apply {\n                commandLine(commandLine)\n                if (workingDirectory != null) {\n                    workingDir(workingDirectory)\n                }\n            }\n            .copyTo(action)\n        action.execute()\n    }\n}\n\n/**\n * Runs a smithy-rs build tool that is written in Rust and also included in the Docker build base image.\n * If it detects that Gradle is running inside the Docker build image, it uses the prebuilt tool binary.\n * Otherwise, it compiles the tool and runs it.\n */\nabstract class ExecRustBuildTool : DefaultTask() {\n    @get:InputDirectory\n    var toolPath: File? = null\n\n    @get:Input\n    var binaryName: String? = null\n\n    @get:Input\n    var arguments: List<String>? = null\n\n    @Inject\n    protected open fun getObjectFactory(): ObjectFactory = throw UnsupportedOperationException()\n\n    @Inject\n    protected open fun getExecActionFactory(): ExecActionFactory = throw UnsupportedOperationException()\n\n    @TaskAction\n    fun run() {\n        checkNotNull(toolPath) { \"toolPath must be set\" }\n        checkNotNull(binaryName) { \"binaryName must be set\" }\n        checkNotNull(arguments) { \"arguments must be set\" }\n\n        // When building with the build Docker image, the Rust tools are already on the path. Just use them.\n        if (System.getenv()[\"SMITHY_RS_DOCKER_BUILD_IMAGE\"] == \"1\") {\n            runCli(\n                getExecActionFactory(),\n                getObjectFactory(),\n                listOf(binaryName!!) + arguments!!,\n                workingDirectory = null,\n            )\n        } else {\n            runCli(\n                getExecActionFactory(),\n                getObjectFactory(),\n                listOf(\"cargo\", \"run\", \"--bin\", binaryName!!, \"--\") + arguments!!,\n                workingDirectory = toolPath,\n            )\n        }\n    }\n}\n\n/**\n * Verifies a smithy-rs build tool is available on the PATH, or in local dev,\n * builds and places the build tool on the path.\n */\nabstract class RequireRustBuildTool : DefaultTask() {\n    @get:InputDirectory\n    var toolPath: File? = null\n\n    @Inject\n    protected open fun getObjectFactory(): ObjectFactory = throw UnsupportedOperationException()\n\n    @Inject\n    protected open fun getExecActionFactory(): ExecActionFactory = throw UnsupportedOperationException()\n\n    @TaskAction\n    fun run() {\n        checkNotNull(toolPath) { \"toolPath must be set\" }\n\n        // When building with the build Docker image, the Rust tools are already on the path.\n        // Otherwise, in local dev, run `cargo install` to make sure the tool is on the path.\n        if (System.getenv()[\"SMITHY_RS_DOCKER_BUILD_IMAGE\"] != \"1\") {\n            val command = mutableListOf(\"cargo\")\n            command.add(\"install\")\n            command.add(\"--locked\")\n            command.add(\"--path\")\n            command.add(toolPath!!.absolutePath)\n            runCli(\n                getExecActionFactory(),\n                getObjectFactory(),\n                command,\n            )\n        }\n    }\n}\n"
  },
  {
    "path": "buildSrc/src/main/kotlin/aws/sdk/CrateVersioner.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage aws.sdk\n\nimport PropertyRetriever\nimport org.gradle.api.Project\nimport org.slf4j.LoggerFactory\nimport java.io.File\nimport java.security.MessageDigest\n\nconst val LOCAL_DEV_VERSION: String = \"0.0.0-local\"\n\nobject CrateVersioner {\n    fun defaultFor(\n        rootProject: Project,\n        properties: PropertyRetriever,\n    ): VersionCrate =\n        when (val versionsManifestPath = properties.get(\"aws.sdk.previous.release.versions.manifest\")) {\n            // In local dev, use special `0.0.0-local` version number for all SDK crates\n            null -> SynchronizedCrateVersioner(properties, sdkVersion = LOCAL_DEV_VERSION)\n            else -> {\n                val modelMetadataPath =\n                    properties.get(\"aws.sdk.model.metadata\")\n                        ?: throw IllegalArgumentException(\"Property `aws.sdk.model.metadata` required for independent crate version builds\")\n                IndependentCrateVersioner(\n                    VersionsManifest.fromFile(versionsManifestPath),\n                    ModelMetadata.fromFile(modelMetadataPath),\n                    devPreview = false,\n                    smithyRsVersion = getSmithyRsVersion(rootProject),\n                )\n            }\n        }\n}\n\ninterface VersionCrate {\n    fun decideCrateVersion(\n        moduleName: String,\n        service: AwsService,\n    ): String\n}\n\nclass SynchronizedCrateVersioner(\n    properties: PropertyRetriever,\n    private val sdkVersion: String =\n        properties.get(CrateSet.STABLE_VERSION_PROP_NAME)\n            ?: throw Exception(\"SDK runtime crate version missing\"),\n) : VersionCrate {\n    init {\n        LoggerFactory.getLogger(javaClass).info(\"Using synchronized SDK crate versioning with version `$sdkVersion`\")\n    }\n\n    override fun decideCrateVersion(\n        moduleName: String,\n        service: AwsService,\n    ): String = sdkVersion\n}\n\nprivate data class SemVer(\n    val major: Int,\n    val minor: Int,\n    val patch: Int,\n) {\n    companion object {\n        fun parse(value: String): SemVer {\n            val parseNote = \"Note: This implementation doesn't implement pre-release/build version support\"\n            val failure = IllegalArgumentException(\"Unrecognized semver version number: $value. $parseNote\")\n            val parts = value.split(\".\")\n            if (parts.size != 3) {\n                throw failure\n            }\n            return SemVer(\n                major = parts[0].toIntOrNull() ?: throw failure,\n                minor = parts[1].toIntOrNull() ?: throw failure,\n                patch = parts[2].toIntOrNull() ?: throw failure,\n            )\n        }\n    }\n\n    fun bumpMajor(): SemVer = copy(major = major + 1, minor = 0, patch = 0)\n\n    fun bumpMinor(): SemVer = copy(minor = minor + 1, patch = 0)\n\n    fun bumpPatch(): SemVer = copy(patch = patch + 1)\n\n    override fun toString(): String {\n        return \"$major.$minor.$patch\"\n    }\n}\n\nfun getSmithyRsVersion(rootProject: Project): String {\n    Runtime.getRuntime().let { runtime ->\n        val command = arrayOf(\"git\", \"-C\", rootProject.rootDir.absolutePath, \"rev-parse\", \"HEAD\")\n        val process = runtime.exec(command)\n        if (process.waitFor() != 0) {\n            throw RuntimeException(\n                \"Failed to run `${command.joinToString(\" \")}`:\\n\" +\n                    \"stdout: \" +\n                    String(process.inputStream.readAllBytes()) +\n                    \"stderr: \" +\n                    String(process.errorStream.readAllBytes()),\n            )\n        }\n        return String(process.inputStream.readAllBytes()).trim()\n    }\n}\n\nclass IndependentCrateVersioner(\n    private val versionsManifest: VersionsManifest,\n    private val modelMetadata: ModelMetadata,\n    private val devPreview: Boolean,\n    smithyRsVersion: String,\n    private val hashModelsFn: (AwsService) -> String = { service -> hashModels(service) },\n) : VersionCrate {\n    private val smithyRsChanged = versionsManifest.smithyRsRevision != smithyRsVersion\n    private val logger = LoggerFactory.getLogger(javaClass)\n\n    init {\n        logger.info(\"Using independent SDK crate versioning. Dev preview: $devPreview\")\n        logger.info(\n            \"Current smithy-rs HEAD: `$smithyRsVersion`. \" +\n                \"Previous smithy-rs HEAD from versions.toml: `${versionsManifest.smithyRsRevision}`. \" +\n                \"Code generator changed: $smithyRsChanged\",\n        )\n    }\n\n    override fun decideCrateVersion(\n        moduleName: String,\n        service: AwsService,\n    ): String {\n        var previousVersion: SemVer? = null\n        val (reason, newVersion) =\n            when (val existingCrate = versionsManifest.crates.get(moduleName)) {\n                // The crate didn't exist before, so create a new major version\n                null -> \"new service\" to newMajorVersion()\n                else -> {\n                    previousVersion = SemVer.parse(existingCrate.version)\n                    if (smithyRsChanged) {\n                        \"smithy-rs changed\" to previousVersion.bumpCodegenChanged()\n                    } else {\n                        when (modelMetadata.changeType(moduleName)) {\n                            ChangeType.FEATURE -> \"its API changed\" to previousVersion.bumpModelChanged()\n                            ChangeType.DOCUMENTATION -> \"it has new docs\" to previousVersion.bumpDocsChanged()\n                            ChangeType.UNCHANGED -> {\n                                val currentModelsHash = hashModelsFn(service)\n                                val previousModelsHash = existingCrate.modelHash\n                                if (currentModelsHash != previousModelsHash) {\n                                    \"its model(s) changed\" to previousVersion.bumpModelChanged()\n                                } else {\n                                    \"no change\" to previousVersion\n                                }\n                            }\n                        }\n                    }\n                }\n            }\n        if (previousVersion == null) {\n            logger.info(\"`$moduleName` is a new service. Starting it at `$newVersion`\")\n        } else if (previousVersion != newVersion) {\n            logger.info(\"Version bumping `$moduleName` from `$previousVersion` to `$newVersion` because $reason\")\n        } else {\n            logger.info(\"No changes expected for `$moduleName`\")\n        }\n        return newVersion.toString()\n    }\n\n    private fun newMajorVersion(): SemVer =\n        when (devPreview) {\n            true -> SemVer.parse(\"0.1.0\")\n            else -> SemVer.parse(\"1.0.0\")\n        }\n\n    private fun SemVer.bumpCodegenChanged(): SemVer = bumpMinor()\n\n    private fun SemVer.bumpModelChanged(): SemVer =\n        when (devPreview) {\n            true -> bumpPatch()\n            else -> bumpMinor()\n        }\n\n    private fun SemVer.bumpDocsChanged(): SemVer = bumpPatch()\n}\n\nprivate fun ByteArray.toLowerHex(): String = joinToString(\"\") { byte -> \"%02x\".format(byte) }\n\nfun hashModels(\n    awsService: AwsService,\n    loadFile: (File) -> ByteArray = File::readBytes,\n): String {\n    // Needs to match hashing done in the `generate-version-manifest` tool:\n    val sha256 = MessageDigest.getInstance(\"SHA-256\")\n    val hashes =\n        awsService.modelFiles().fold(\"\") { hashes, file ->\n            val fileHash = sha256.digest(loadFile(file)).toLowerHex()\n            hashes + fileHash + \"\\n\"\n        }\n    return sha256.digest(hashes.toByteArray(Charsets.UTF_8)).toLowerHex()\n}\n"
  },
  {
    "path": "buildSrc/src/main/kotlin/aws/sdk/DocsLandingPage.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage aws.sdk\n\nimport org.gradle.api.Project\nimport software.amazon.smithy.utils.SimpleCodeWriter\nimport java.io.File\n\n/**\n * Generate a basic docs landing page into [outputDir]\n *\n * The generated docs will include links to crates.io, docs.rs and GitHub examples for all generated services. The generated docs will\n * be written to `docs.md` in the provided [outputDir].\n */\nfun Project.docsLandingPage(\n    awsServices: AwsServices,\n    outputPath: File,\n) {\n    val project = this\n    val writer = SimpleCodeWriter()\n    with(writer) {\n        write(\"# AWS SDK for Rust\")\n        write(\n            \"The AWS SDK for Rust contains one crate for each AWS service, as well as ${cratesIo(\"aws-config\")} \" +\n                \"${docsRs(\"aws-config\")}, a crate implementing configuration loading such as credential providers. \" +\n                \"For usage documentation see the [Developer Guide](https://docs.aws.amazon.com/sdk-for-rust/latest/dg/welcome.html). \" +\n                \"For code examples refer to the [Code Examples Repository](https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/rustv1).\",\n        )\n\n        writer.write(\"## AWS Services\")\n        writer.write(\"\") // empty line between header and table\n        // generate a basic markdown table\n        writer.write(\"| Service | Package |\")\n        writer.write(\"| ------- | ------- |\")\n        awsServices.services.sortedBy { it.humanName }.forEach {\n            val items = listOfNotNull(cratesIo(it), docsRs(it)).joinToString(\" \")\n            writer.write(\n                \"| ${it.humanName} | $items |\",\n            )\n        }\n    }\n    outputPath.writeText(writer.toString())\n}\n\n/**\n * Generate a link to the docs\n */\nprivate fun docsRs(service: AwsService) = docsRs(service.crate())\n\nprivate fun docsRs(crate: String) = \"([docs](https://docs.rs/$crate))\"\n\nprivate fun cratesIo(service: AwsService) = cratesIo(service.crate())\n\nprivate fun cratesIo(crate: String) = \"[$crate](https://crates.io/crates/$crate)\"\n"
  },
  {
    "path": "buildSrc/src/main/kotlin/aws/sdk/ModelMetadata.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage aws.sdk\n\nimport com.moandjiezana.toml.Toml\nimport java.io.File\n\nenum class ChangeType {\n    UNCHANGED,\n    FEATURE,\n    DOCUMENTATION,\n}\n\n/** Model metadata toml file */\ndata class ModelMetadata(\n    private val crates: Map<String, ChangeType>,\n) {\n    companion object {\n        fun fromFile(path: String): ModelMetadata {\n            val contents = File(path).readText()\n            return fromString(contents)\n        }\n\n        fun fromString(value: String): ModelMetadata {\n            val toml = Toml().read(value)\n            return ModelMetadata(\n                crates =\n                    toml.getTable(\"crates\")?.entrySet()?.map { entry ->\n                        entry.key to\n                            when (val kind = (entry.value as Toml).getString(\"kind\")) {\n                                \"Feature\" -> ChangeType.FEATURE\n                                \"Documentation\" -> ChangeType.DOCUMENTATION\n                                else -> throw IllegalArgumentException(\"Unrecognized change type: $kind\")\n                            }\n                    }?.toMap() ?: emptyMap(),\n            )\n        }\n    }\n\n    fun hasCrates(): Boolean = crates.isNotEmpty()\n\n    fun changeType(moduleName: String): ChangeType = crates[moduleName] ?: ChangeType.UNCHANGED\n}\n"
  },
  {
    "path": "buildSrc/src/main/kotlin/aws/sdk/ServiceLoader.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage aws.sdk\n\nimport CrateSet\nimport org.gradle.api.Project\nimport software.amazon.smithy.aws.traits.ServiceTrait\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.ServiceShape\nimport software.amazon.smithy.model.traits.TitleTrait\nimport java.io.File\nimport kotlin.streams.toList\n\ndata class RootTest(\n    val path: File,\n    val manifestName: String,\n)\n\nclass AwsServices(\n    private val project: Project,\n    services: List<AwsService>,\n    val partitionsConfigPath: File,\n    val defaultConfigPath: File,\n) {\n    val services: List<AwsService>\n    val moduleNames: Set<String> by lazy { services.map { it.module }.toSortedSet() }\n\n    init {\n        this.services = services.sortedBy { it.module }\n    }\n\n    val allModules: Set<String> by lazy {\n        (\n            services.map(AwsService::module).map { \"sdk/$it\" } +\n                CrateSet.AWS_SDK_SMITHY_RUNTIME.map { \"sdk/${it.name}\" } +\n                CrateSet.AWS_SDK_RUNTIME.map { \"sdk/${it.name}\" }\n            // Root tests should not be included since they can't be part of the root Cargo workspace\n            // in order to test differences in Cargo features.\n        ).toSortedSet()\n    }\n\n    /**\n     * Tests in `aws/sdk/integration-tests` that are not named after a service module, and therefore,\n     * are not included in a service's `tests/` directory. These are to be included at the SDK root\n     * `tests/` directory for inclusion in CI.\n     */\n    val rootTests: List<RootTest> by lazy {\n        project.projectDir.resolve(\"integration-tests\")\n            .listFiles { file -> !file.name.startsWith(\".\") }.orEmpty().toList()\n            .filter { file -> !moduleNames.contains(file.name) && manifestCompatibleWithGeneratedServices(file) }\n            .map { file -> RootTest(file, \"tests/${file.name}\") }\n    }\n\n    /**\n     * Returns true if the Cargo manifest in the given path is compatible with the set of generated services.\n     */\n    private fun manifestCompatibleWithGeneratedServices(path: File) =\n        File(path, \"Cargo.toml\").let { cargoToml ->\n            if (cargoToml.exists()) {\n                val usedModules =\n                    cargoToml.readLines()\n                        .map { line -> line.substringBefore('=').trim() }\n                        .filter { line -> line.startsWith(\"aws-sdk-\") }\n                        .map { line -> line.substringAfter(\"aws-sdk-\") }\n                        .toSet()\n                moduleNames.containsAll(usedModules)\n            } else {\n                false\n            }\n        }\n\n    /**\n     * Returns a sorted set of members included in the workspace.\n     */\n    fun includedInWorkspace() = allModules\n\n    /**\n     * Returns a list of crates excluded from the workspace.\n     */\n    fun excludedFromWorkspace() = rootTests.map(RootTest::manifestName)\n}\n\n/**\n * Discovers services from the `aws-models` directory within the project.\n *\n * Since this function parses all models, it is relatively expensive to call. The result should be cached in a property\n * during build.\n */\nfun Project.discoverServices(\n    awsModelsPath: String?,\n    serviceMembership: Membership,\n): AwsServices {\n    val models = awsModelsPath?.let { File(it) } ?: project.file(\"aws-models\")\n    val extrasDir = project.file(\"aws-models-extra\")\n    logger.info(\"Using model path: $models\")\n    val files = fileTree(models).sortedBy { file -> file.name }\n    logger.info(\"Discovered potential model files: ${files.map { file -> file.name }}\")\n    val baseServices =\n        files\n            .mapNotNull { file ->\n                val model = Model.assembler().addImport(file.absolutePath).assemble().result.get()\n                val services: List<ServiceShape> = model.shapes(ServiceShape::class.java).sorted().toList()\n                if (services.size > 1) {\n                    throw Exception(\"There must be exactly one service in each aws model file\")\n                }\n                if (services.isEmpty()) {\n                    logger.info(\"${file.name} has no services\")\n                    null\n                } else {\n                    val service = services[0]\n                    val title = service.expectTrait(TitleTrait::class.java).value\n                    val sdkId =\n                        service.expectTrait(ServiceTrait::class.java).sdkId\n                            .lowercase()\n                            .replace(\" \", \"\")\n                            // The smithy models should not include the suffix \"service\" but currently they do\n                            .removeSuffix(\"service\")\n                            .removeSuffix(\"api\")\n                    val testFile = extrasDir.resolve(\"$sdkId-tests.smithy\")\n                    val extras =\n                        if (testFile.exists()) {\n                            logger.warn(\"Discovered protocol tests for ${file.name}\")\n                            listOf(testFile)\n                        } else {\n                            listOf()\n                        }\n\n                    AwsService(\n                        service = service.id.toString(),\n                        module = sdkId,\n                        moduleDescription = \"AWS SDK for $title\",\n                        modelFile = file,\n                        // Order is important for the versions.toml model hash calculation\n                        extraFiles = extras.sorted(),\n                        humanName = title,\n                    )\n                }\n            }\n    val baseModules = baseServices.map { it.module }.toSet()\n    logger.info(\"Discovered base service modules to generate: $baseModules\")\n\n    // validate the full exclusion list hits if the models directory is set\n    if (awsModelsPath != null) {\n        serviceMembership.exclusions.forEach { disabledService ->\n            check(baseModules.contains(disabledService)) {\n                \"Service $disabledService was explicitly disabled but no service was generated with that name. Generated:\\n ${\n                    baseModules.joinToString(\n                        \"\\n \",\n                    )\n                }\"\n            }\n        }\n    }\n\n    // validate inclusion list hits\n    serviceMembership.inclusions.forEach { service ->\n        check(baseModules.contains(service)) { \"Service $service was in explicit inclusion list but not generated!\" }\n    }\n    return AwsServices(\n        this,\n        baseServices.filter {\n            serviceMembership.isMember(it.module)\n        }.also { services ->\n            val moduleNames = services.map { it.module }\n            logger.info(\"Final service module list: $moduleNames\")\n        },\n        models.resolve(\"sdk-partitions.json\"),\n        models.resolve(\"sdk-default-configuration.json\"),\n    )\n}\n\ndata class Membership(val inclusions: Set<String> = emptySet(), val exclusions: Set<String> = emptySet())\n\ndata class AwsService(\n    val service: String,\n    val module: String,\n    val moduleDescription: String,\n    val modelFile: File,\n    val extraConfig: String? = null,\n    val extraFiles: List<File>,\n    val humanName: String,\n) {\n    fun modelFiles(): List<File> = listOf(modelFile) + extraFiles\n}\n\nfun AwsService.crate(): String = \"aws-sdk-$module\"\n\nprivate fun Membership.isMember(member: String): Boolean =\n    when {\n        exclusions.contains(member) -> false\n        inclusions.contains(member) -> true\n        inclusions.isEmpty() -> true\n        else -> false\n    }\n\nfun parseMembership(rawList: String): Membership {\n    val inclusions = mutableSetOf<String>()\n    val exclusions = mutableSetOf<String>()\n\n    rawList.split(\",\").map { it.trim() }.filter { it.isNotEmpty() }.forEach { item ->\n        when {\n            item.startsWith('-') -> exclusions.add(item.substring(1))\n            item.startsWith('+') -> inclusions.add(item.substring(1))\n            else -> error(\"Must specify inclusion (+) or exclusion (-) prefix character to $item.\")\n        }\n    }\n\n    val conflictingMembers = inclusions.intersect(exclusions)\n    require(conflictingMembers.isEmpty()) {\n        \"$conflictingMembers specified both for inclusion and exclusion in $rawList\"\n    }\n\n    return Membership(inclusions, exclusions)\n}\n"
  },
  {
    "path": "buildSrc/src/main/kotlin/aws/sdk/VersionsManifest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage aws.sdk\n\nimport com.moandjiezana.toml.Toml\nimport java.io.File\n\ndata class CrateVersion(\n    val category: String,\n    val version: String,\n    val sourceHash: String? = null,\n    val modelHash: String? = null,\n)\n\n/** Kotlin representation of aws-sdk-rust's `versions.toml` file */\ndata class VersionsManifest(\n    val smithyRsRevision: String,\n    val crates: Map<String, CrateVersion>,\n) {\n    companion object {\n        fun fromFile(path: String): VersionsManifest {\n            val contents = File(path).readText()\n            return fromString(contents)\n        }\n\n        fun fromString(value: String): VersionsManifest {\n            val toml = Toml().read(value)\n            return VersionsManifest(\n                smithyRsRevision = toml.getString(\"smithy_rs_revision\"),\n                crates =\n                    toml.getTable(\"crates\").entrySet().map { entry ->\n                        val crate = (entry.value as Toml)\n                        entry.key to\n                            CrateVersion(\n                                category = crate.getString(\"category\"),\n                                version = crate.getString(\"version\"),\n                                sourceHash = crate.getString(\"source_hash\"),\n                                modelHash = crate.getString(\"model_hash\"),\n                            )\n                    }.toMap(),\n            )\n        }\n    }\n}\n"
  },
  {
    "path": "buildSrc/src/main/kotlin/smithy-rs.kotlin-conventions.gradle.kts",
    "content": "import org.gradle.api.tasks.testing.logging.TestExceptionFormat\nimport org.gradle.kotlin.dsl.the\nimport org.jetbrains.kotlin.gradle.dsl.JvmTarget\n\nplugins {\n    kotlin(\"jvm\")\n}\n\n// Workaround per: https://github.com/gradle/gradle/issues/15383\nval Project.libs get() = the<org.gradle.accessors.dm.LibrariesForLibs>()\n\njava {\n    sourceCompatibility = JavaVersion.VERSION_11\n    targetCompatibility = JavaVersion.VERSION_11\n    withSourcesJar()\n}\n\ntasks.compileKotlin {\n    compilerOptions.jvmTarget.set(JvmTarget.JVM_11)\n}\n\ntasks.compileTestKotlin {\n    compilerOptions.jvmTarget.set(JvmTarget.JVM_11)\n}\n\n// Reusable license copySpec\nval licenseSpec = copySpec {\n    from(\"${project.rootDir}/LICENSE\")\n    from(\"${project.rootDir}/NOTICE\")\n}\n\n// Configure jars to include license related info\ntasks.jar {\n    metaInf.with(licenseSpec)\n    inputs.property(\"moduleName\", project.name)\n    manifest {\n        attributes[\"Automatic-Module-Name\"] = project.name\n    }\n}\n\n\ntasks.test {\n    useJUnitPlatform()\n    testLogging {\n        events(\"failed\")\n        exceptionFormat = TestExceptionFormat.FULL\n        showCauses = true\n        showExceptions = true\n        showStackTraces = true\n    }\n}\n\n\ntasks.test.configure {\n    val isTestingEnabled: String by project\n    enabled = isTestingEnabled.toBoolean()\n}\n"
  },
  {
    "path": "buildSrc/src/main/kotlin/smithy-rs.publishing-conventions.gradle.kts",
    "content": "plugins {\n    `maven-publish`\n    signing\n}\n// FIXME(publishing): create a real \"javadoc\" JAR from Dokka output\nval javadocJar = tasks.register<Jar>(\"emptyJar\") {\n    archiveClassifier.set(\"javadoc\")\n    destinationDirectory.set(layout.buildDirectory.dir(\"libs\"))\n    from()\n}\n\npublishing {\n    publications {\n        create<MavenPublication>(\"codegen\") {\n            from(components[\"java\"])\n            artifact(javadocJar)\n\n            afterEvaluate {\n                pom {\n                    name.set(project.ext[\"displayName\"].toString())\n                    description.set(project.description)\n                    url.set(\"https://github.com/smithy-lang/smithy-rs\")\n                    licenses {\n                        license {\n                            name.set(\"Apache License 2.0\")\n                            url.set(\"http://www.apache.org/licenses/LICENSE-2.0.txt\")\n                            distribution.set(\"repo\")\n                        }\n                    }\n                    developers {\n                        developer {\n                            id.set(\"smithy-rs\")\n                            name.set(\"Smithy Rust\")\n                            organization.set(\"Amazon Web Services\")\n                            organizationUrl.set(\"https://aws.amazon.com\")\n                            roles.add(\"developer\")\n                        }\n                    }\n                    scm {\n                        url.set(\"https://github.com/smithy-lang/smithy-rs.git\")\n                    }\n                }\n            }\n\n\n        }\n    }\n    repositories {\n        maven {\n            name = \"localStaging\"\n            url = uri(stagingDir())\n        }\n    }\n\n    // Don't sign the artifacts if we didn't get a key and password to use.\n    if (project.hasProperty(\"signingKey\") && project.hasProperty(\"signingPassword\")) {\n        signing {\n            useInMemoryPgpKeys(\n                project.property(\"signingKey\").toString(),\n                project.property(\"signingPassword\").toString()\n            )\n            sign(publishing.publications[\"codegen\"])\n        }\n    }\n}\n"
  },
  {
    "path": "buildSrc/src/main/kotlin/tasks/CheckMavenCentralPublishingNeeded.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage tasks\n\nimport org.gradle.api.DefaultTask\nimport org.gradle.api.tasks.TaskAction\nimport java.net.HttpURLConnection\nimport java.net.URL\n\n/**\n * Gradle task that checks if publishing to Maven Central is needed.\n * This task checks if the current version is a SNAPSHOT or if it already exists in Maven Central.\n * The result is written to a properties file that can be read by the GitHub workflow.\n */\nopen class CheckMavenCentralPublishingNeeded : DefaultTask() {\n    init {\n        description = \"Check if publishing to Maven Central is needed\"\n    }\n\n    @TaskAction\n    fun check() {\n        val codegenVersion = project.properties[\"codegenVersion\"].toString()\n        val outputDir = project.layout.buildDirectory.dir(\"maven-central\").get().asFile\n        outputDir.mkdirs()\n        val outputFile = outputDir.resolve(\"publishing.properties\")\n\n        // Check if version contains SNAPSHOT\n        if (codegenVersion.contains(\"-SNAPSHOT\")) {\n            logger.lifecycle(\"Version $codegenVersion is a SNAPSHOT, skipping Maven Central publishing\")\n            outputFile.writeText(\"mavenCentralPublishingNeeded=false\")\n            return\n        }\n\n        val artifactName = \"codegen-core\"\n        // Check if version already exists in Maven Central\n        val url = \"https://repo1.maven.org/maven2/software/amazon/smithy/rust/$artifactName/$codegenVersion/$artifactName-$codegenVersion.pom\"\n        val connection = URL(url).openConnection() as HttpURLConnection\n        connection.requestMethod = \"HEAD\"\n\n        try {\n            connection.connect()\n            val responseCode = connection.responseCode\n\n            if (responseCode == 200) {\n                logger.lifecycle(\"Version $codegenVersion already exists in Maven Central, skipping publishing\")\n                outputFile.writeText(\"mavenCentralPublishingNeeded=false\")\n                return\n            }\n        } finally {\n            connection.disconnect()\n        }\n\n        logger.lifecycle(\"Version $codegenVersion not found on Maven Central, release required\")\n        outputFile.writeText(\"mavenCentralPublishingNeeded=true\")\n    }\n}\n"
  },
  {
    "path": "buildSrc/src/main/kotlin/tasks/VerifyCodegenVersionBump.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage tasks\n\nimport org.gradle.api.DefaultTask\nimport org.gradle.api.GradleException\nimport org.gradle.api.tasks.Input\nimport org.gradle.api.tasks.Optional\nimport org.gradle.api.tasks.TaskAction\nimport java.io.ByteArrayOutputStream\nimport java.net.URL\nimport javax.xml.parsers.DocumentBuilderFactory\n\n/**\n * Gradle task that verifies if the codegenVersion has been bumped when codegen files have changed.\n * This task checks if any files in the codegen projects have changed since the base reference,\n * and if they have, verifies that the codegenVersion in gradle.properties has been incremented.\n *\n * The task fetches the latest published version from Maven Central's maven-metadata.xml\n * to determine if the current version is newer.\n */\nopen class VerifyCodegenVersionBump : DefaultTask() {\n    /**\n     * The base git reference to compare against.\n     * If not provided, the task will try to infer it from GitHub Actions environment variables,\n     * or fall back to 'origin/main'.\n     */\n    @Input\n    @Optional\n    var baseRef: String? = null\n\n    init {\n        description = \"Verify that codegenVersion has been bumped if codegen files have changed\"\n    }\n\n    @TaskAction\n    fun verify() {\n        val publishedCodegenProjectPaths =\n            listOf(\n                \"codegen-client\", \"codegen-core\", \"codegen-serde\",\n                \"codegen-server\", \"fuzzgen\", \"aws/codegen-aws-sdk\",\n            )\n\n        // Determine the base reference\n        val effectiveBaseRef = determineBaseRef()\n        logger.lifecycle(\"Using base reference: $effectiveBaseRef\")\n\n        // Check if any files in codegen projects have changed\n        var hasChanges = false\n        publishedCodegenProjectPaths.forEach { projectName ->\n            val changesOutput = ByteArrayOutputStream()\n            project.exec {\n                commandLine(\"git\", \"diff\", \"--name-only\", effectiveBaseRef, \"HEAD\", \"--\", projectName)\n                standardOutput = changesOutput\n            }\n\n            if (changesOutput.toString().isNotEmpty()) {\n                hasChanges = true\n                logger.lifecycle(\"Changes detected in $projectName\")\n            }\n        }\n\n        if (!hasChanges) {\n            logger.lifecycle(\"No changes detected in codegen projects, skipping version check\")\n            return\n        }\n\n        // Get current version from gradle.properties\n        val codegenVersion = project.properties[\"codegenVersion\"].toString()\n\n        // Get the latest published version from Maven Central\n        val latestPublishedVersion = getLatestPublishedVersion()\n\n        logger.lifecycle(\"Current version: $codegenVersion\")\n        logger.lifecycle(\"Latest published version: $latestPublishedVersion\")\n\n        // Compare versions using semver comparison\n        if (!isVersionBumped(latestPublishedVersion, codegenVersion)) {\n            throw GradleException(\"Codegen files have changed but codegenVersion ($codegenVersion) has not been bumped from the latest published version ($latestPublishedVersion)\")\n        } else {\n            logger.lifecycle(\"Version has been bumped from $latestPublishedVersion to $codegenVersion\")\n        }\n    }\n\n    /**\n     * Determines the base reference to use for comparison.\n     * Priority:\n     * 1. Explicitly provided baseRef property\n     * 2. GitHub Actions environment variables (GITHUB_BASE_REF)\n     * 3. Fallback to 'origin/main'\n     *\n     * @return The base reference to use\n     */\n    private fun determineBaseRef(): String {\n        // Use explicitly provided baseRef if available\n        if (!baseRef.isNullOrBlank()) {\n            return baseRef!!\n        }\n\n        // Try to get from GitHub Actions environment variables\n        val githubBaseRef = System.getenv(\"GITHUB_BASE_REF\")\n        if (!githubBaseRef.isNullOrBlank()) {\n            return \"origin/$githubBaseRef\"\n        }\n\n        // Try to get the default branch\n        val defaultBranchOutput = ByteArrayOutputStream()\n        project.exec {\n            commandLine(\"git\", \"remote\", \"show\", \"origin\")\n            standardOutput = defaultBranchOutput\n            isIgnoreExitValue = true\n        }\n\n        val defaultBranchLines = defaultBranchOutput.toString().lines()\n        val headBranchLine = defaultBranchLines.find { it.contains(\"HEAD branch:\") }\n        if (headBranchLine != null) {\n            val defaultBranch = headBranchLine.substringAfter(\"HEAD branch:\").trim()\n            return \"origin/$defaultBranch\"\n        }\n\n        // Fallback to origin/main\n        return \"origin/main\"\n    }\n\n    /**\n     * Fetches the latest published version from Maven Central's maven-metadata.xml.\n     *\n     * @return The latest published version string\n     */\n    private fun getLatestPublishedVersion(): String {\n        try {\n            val metadataUrl =\n                URL(\"https://repo1.maven.org/maven2/software/amazon/smithy/rust/codegen-core/maven-metadata.xml\")\n            val connection = metadataUrl.openConnection()\n            connection.connectTimeout = 5000\n            connection.readTimeout = 5000\n\n            val inputStream = connection.getInputStream()\n            val dbFactory = DocumentBuilderFactory.newInstance()\n            val dBuilder = dbFactory.newDocumentBuilder()\n            val doc = dBuilder.parse(inputStream)\n            doc.documentElement.normalize()\n\n            val latestElement = doc.getElementsByTagName(\"latest\").item(0)\n            if (latestElement != null) {\n                return latestElement.textContent\n            }\n\n            // If no \"latest\" tag, get the last \"version\" tag\n            val versionElements = doc.getElementsByTagName(\"version\")\n            if (versionElements.length > 0) {\n                return versionElements.item(versionElements.length - 1).textContent\n            }\n\n            throw GradleException(\"Could not find version information in maven-metadata.xml\")\n        } catch (e: Exception) {\n            logger.warn(\"Failed to fetch latest version from Maven Central: ${e.message}\")\n            logger.warn(\"Falling back to version 0.0.0 for comparison\")\n            return \"0.0.0\"\n        }\n    }\n\n    /**\n     * Helper function to compare versions and determine if the new version is higher than the old version.\n     * This is a simple implementation that can be enhanced with a proper semver comparison library if needed.\n     *\n     * @param oldVersion The old version string\n     * @param newVersion The new version string\n     * @return True if the new version is higher than the old version, false otherwise\n     */\n    private fun isVersionBumped(\n        oldVersion: String,\n        newVersion: String,\n    ): Boolean {\n        // Simple implementation - can be enhanced with proper semver comparison library\n        val oldParts = oldVersion.split(\".\")\n        val newParts = newVersion.split(\".\")\n\n        for (i in 0 until minOf(oldParts.size, newParts.size)) {\n            val oldPart = oldParts[i].toIntOrNull() ?: 0\n            val newPart = newParts[i].toIntOrNull() ?: 0\n\n            if (newPart > oldPart) return true\n            if (newPart < oldPart) return false\n        }\n\n        return newParts.size > oldParts.size\n    }\n}\n"
  },
  {
    "path": "buildSrc/src/test/kotlin/CrateSetTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport CrateSet.AWS_SDK_RUNTIME\nimport CrateSet.SERVER_SMITHY_RUNTIME\nimport CrateSet.SMITHY_RUNTIME_COMMON\nimport CrateSet.STABLE_VERSION_PROP_NAME\nimport CrateSet.UNSTABLE_VERSION_PROP_NAME\nimport com.moandjiezana.toml.Toml\nimport org.junit.jupiter.api.Assertions.assertEquals\nimport org.junit.jupiter.api.Test\nimport java.io.File\nimport java.util.logging.Logger\n\nclass CrateSetTest {\n    private val logger: Logger = Logger.getLogger(\"CrateSetTest\")\n\n    /*\n     * Checks whether `versionPropertyName` for a system under test, i.e. `Crate` in `CrateSet.kt`,\n     * matches what `package.metadata.smithy-rs-release-tooling` says in the `Cargo.toml`\n     * for the corresponding crate.\n     */\n    private fun sutStabilityMatchesManifestStability(\n        versionPropertyName: String,\n        stabilityInManifest: Boolean,\n        crate: String,\n    ) {\n        when (stabilityInManifest) {\n            true -> assertEquals(STABLE_VERSION_PROP_NAME, versionPropertyName, \"Crate: $crate\")\n            false -> assertEquals(UNSTABLE_VERSION_PROP_NAME, versionPropertyName, \"Crate: $crate\")\n        }\n    }\n\n    /*\n     * Checks whether each element in `crateSet` specifies the correct `versionPropertyName` according to\n     * what `package.metadata.smithy-rs-release-tooling` says in the `Cargo.toml` for the corresponding crate,\n     * located at `relativePathToRustRuntime`.\n     *\n     * If `package.metadata.smithy-rs-release-tooling` does not exist in a `Cargo.toml`, the implementation\n     * will treat that crate as unstable.\n     */\n    private fun crateSetStabilitiesMatchManifestStabilities(\n        crateSet: List<Crate>,\n        relativePathToRustRuntime: String,\n    ) {\n        crateSet.forEach {\n            val path = \"$relativePathToRustRuntime/${it.name}/Cargo.toml\"\n            val contents = File(path).readText()\n            val isStable =\n                try {\n                    Toml().read(contents).getTable(\"package.metadata.smithy-rs-release-tooling\")?.getBoolean(\"stable\")\n                        ?: false\n                } catch (e: java.lang.IllegalStateException) {\n                    // Several crates are stable, but their Cargo.toml does not properly parse due to cfg statements\n                    // like `[target.'cfg(not(target_family = \"wasm\"))'.dependencies]`. Those packages are handled here\n                    contents.contains(\"[package.metadata.smithy-rs-release-tooling]\\nstable = true\")\n                }\n            sutStabilityMatchesManifestStability(it.versionPropertyName, isStable, it.name)\n        }\n    }\n\n    @Test\n    fun `aws runtime stabilities should match those in manifest files`() {\n        crateSetStabilitiesMatchManifestStabilities(AWS_SDK_RUNTIME, \"../aws/rust-runtime\")\n    }\n\n    @Test\n    fun `common smithy runtime stabilities should match those in manifest files`() {\n        crateSetStabilitiesMatchManifestStabilities(SMITHY_RUNTIME_COMMON, \"../rust-runtime\")\n    }\n\n    @Test\n    fun `server smithy runtime stabilities should match those in manifest files`() {\n        crateSetStabilitiesMatchManifestStabilities(SERVER_SMITHY_RUNTIME, \"../rust-runtime\")\n    }\n}\n"
  },
  {
    "path": "buildSrc/src/test/kotlin/ManifestPatcherTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport org.junit.jupiter.api.Assertions.assertEquals\nimport org.junit.jupiter.api.Test\n\nclass ManifestPatcherTest {\n    @Test\n    fun `it should rewrite crate versions`() {\n        val version = \"0.10.0\"\n        assertEquals(\"\", rewriteCrateVersion(\"\", version))\n        assertEquals(\"version = \\\"0.10.0\\\"\", rewriteCrateVersion(\"version=\\\"0.0.0-smithy-rs-head\\\"\", version))\n        assertEquals(\"version = \\\"0.10.0\\\"\", rewriteCrateVersion(\" version = \\\"0.0.0-smithy-rs-head\\\"\", version))\n        assertEquals(\"version = \\\"1.5.0\\\"\", rewriteCrateVersion(\"version = \\\"1.5.0\\\"\", version))\n    }\n}\n"
  },
  {
    "path": "buildSrc/src/test/kotlin/aws/sdk/IndependentCrateVersionerTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage aws.sdk\n\nimport org.junit.jupiter.api.Assertions.assertEquals\nimport org.junit.jupiter.api.Test\nimport java.io.File\n\nprivate fun service(name: String): AwsService =\n    AwsService(\n        name,\n        \"test\",\n        \"test\",\n        File(\"testmodel\"),\n        null,\n        emptyList(),\n        name,\n    )\n\nclass IndependentCrateVersionerTest {\n    @Test\n    fun devPreviewSmithyRsChanged() {\n        val dynamoDb = service(\"dynamodb\")\n        val ec2 = service(\"ec2\")\n        val s3 = service(\"s3\")\n        val someNewService = service(\"somenewservice\")\n\n        val versioner =\n            IndependentCrateVersioner(\n                VersionsManifest(\n                    smithyRsRevision = \"smithy-rs-1\",\n                    crates =\n                        mapOf(\n                            \"aws-sdk-dynamodb\" to\n                                CrateVersion(\n                                    category = \"AwsSdk\",\n                                    version = \"0.11.3\",\n                                    modelHash = \"dynamodb-hash\",\n                                ),\n                            \"aws-sdk-ec2\" to\n                                CrateVersion(\n                                    category = \"AwsSdk\",\n                                    version = \"0.10.1\",\n                                    modelHash = \"ec2-hash\",\n                                ),\n                            \"aws-sdk-s3\" to\n                                CrateVersion(\n                                    category = \"AwsSdk\",\n                                    version = \"0.12.0\",\n                                    modelHash = \"s3-hash\",\n                                ),\n                        ),\n                ),\n                ModelMetadata(\n                    crates =\n                        mapOf(\n                            \"aws-sdk-dynamodb\" to ChangeType.FEATURE,\n                            \"aws-sdk-ec2\" to ChangeType.DOCUMENTATION,\n                        ),\n                ),\n                devPreview = true,\n                smithyRsVersion = \"smithy-rs-2\",\n                hashModelsFn = { service ->\n                    when (service) {\n                        dynamoDb -> \"dynamodb-hash\"\n                        ec2 -> \"ec2-hash\"\n                        s3 -> \"s3-hash\"\n                        else -> throw IllegalStateException(\"unreachable\")\n                    }\n                },\n            )\n\n        // The code generator changed, so all minor versions should bump\n        assertEquals(\"0.12.0\", versioner.decideCrateVersion(\"aws-sdk-dynamodb\", dynamoDb))\n        assertEquals(\"0.11.0\", versioner.decideCrateVersion(\"aws-sdk-ec2\", ec2))\n        assertEquals(\"0.13.0\", versioner.decideCrateVersion(\"aws-sdk-s3\", s3))\n        assertEquals(\"0.1.0\", versioner.decideCrateVersion(\"aws-sdk-somenewservice\", someNewService))\n    }\n\n    @Test\n    fun devPreviewSameCodeGenerator() {\n        val dynamoDb = service(\"dynamodb\")\n        val ec2 = service(\"ec2\")\n        val polly = service(\"polly\")\n        val s3 = service(\"s3\")\n        val someNewService = service(\"somenewservice\")\n\n        val versioner =\n            IndependentCrateVersioner(\n                VersionsManifest(\n                    smithyRsRevision = \"smithy-rs-1\",\n                    crates =\n                        mapOf(\n                            \"aws-sdk-dynamodb\" to\n                                CrateVersion(\n                                    category = \"AwsSdk\",\n                                    version = \"0.11.3\",\n                                    modelHash = \"dynamodb-hash\",\n                                ),\n                            \"aws-sdk-ec2\" to\n                                CrateVersion(\n                                    category = \"AwsSdk\",\n                                    version = \"0.10.1\",\n                                    modelHash = \"ec2-hash\",\n                                ),\n                            \"aws-sdk-polly\" to\n                                CrateVersion(\n                                    category = \"AwsSdk\",\n                                    version = \"0.9.0\",\n                                    modelHash = \"old-polly-hash\",\n                                ),\n                            \"aws-sdk-s3\" to\n                                CrateVersion(\n                                    category = \"AwsSdk\",\n                                    version = \"0.12.0\",\n                                    modelHash = \"s3-hash\",\n                                ),\n                        ),\n                ),\n                ModelMetadata(\n                    crates =\n                        mapOf(\n                            \"aws-sdk-dynamodb\" to ChangeType.FEATURE,\n                            \"aws-sdk-ec2\" to ChangeType.DOCUMENTATION,\n                            // polly has a model change, but is absent from the model metadata file\n                        ),\n                ),\n                devPreview = true,\n                smithyRsVersion = \"smithy-rs-1\",\n                hashModelsFn = { service ->\n                    when (service) {\n                        dynamoDb -> \"dynamodb-hash\"\n                        ec2 -> \"ec2-hash\"\n                        polly -> \"NEW-polly-hash\"\n                        s3 -> \"s3-hash\"\n                        else -> throw IllegalStateException(\"unreachable\")\n                    }\n                },\n            )\n\n        assertEquals(\"0.11.4\", versioner.decideCrateVersion(\"aws-sdk-dynamodb\", dynamoDb))\n        assertEquals(\"0.10.2\", versioner.decideCrateVersion(\"aws-sdk-ec2\", ec2))\n        assertEquals(\"0.12.0\", versioner.decideCrateVersion(\"aws-sdk-s3\", s3))\n        assertEquals(\"0.9.1\", versioner.decideCrateVersion(\"aws-sdk-polly\", polly))\n        assertEquals(\"0.1.0\", versioner.decideCrateVersion(\"aws-sdk-somenewservice\", someNewService))\n    }\n\n    @Test\n    fun smithyRsChanged() {\n        val dynamoDb = service(\"dynamodb\")\n        val ec2 = service(\"ec2\")\n        val s3 = service(\"s3\")\n        val someNewService = service(\"somenewservice\")\n\n        val versioner =\n            IndependentCrateVersioner(\n                VersionsManifest(\n                    smithyRsRevision = \"smithy-rs-1\",\n                    crates =\n                        mapOf(\n                            \"aws-sdk-dynamodb\" to\n                                CrateVersion(\n                                    category = \"AwsSdk\",\n                                    version = \"1.11.3\",\n                                ),\n                            \"aws-sdk-ec2\" to\n                                CrateVersion(\n                                    category = \"AwsSdk\",\n                                    version = \"1.10.1\",\n                                ),\n                            \"aws-sdk-s3\" to\n                                CrateVersion(\n                                    category = \"AwsSdk\",\n                                    version = \"1.12.0\",\n                                ),\n                        ),\n                ),\n                ModelMetadata(\n                    crates =\n                        mapOf(\n                            \"aws-sdk-dynamodb\" to ChangeType.FEATURE,\n                            \"aws-sdk-ec2\" to ChangeType.DOCUMENTATION,\n                        ),\n                ),\n                devPreview = false,\n                smithyRsVersion = \"smithy-rs-2\",\n            )\n\n        // The code generator changed, so all minor versions should bump\n        assertEquals(\"1.12.0\", versioner.decideCrateVersion(\"aws-sdk-dynamodb\", dynamoDb))\n        assertEquals(\"1.11.0\", versioner.decideCrateVersion(\"aws-sdk-ec2\", ec2))\n        assertEquals(\"1.13.0\", versioner.decideCrateVersion(\"aws-sdk-s3\", s3))\n        assertEquals(\"1.0.0\", versioner.decideCrateVersion(\"aws-sdk-somenewservice\", someNewService))\n    }\n\n    @Test\n    fun sameCodeGenerator() {\n        val dynamoDb = service(\"dynamodb\")\n        val ec2 = service(\"ec2\")\n        val polly = service(\"polly\")\n        val s3 = service(\"s3\")\n        val someNewService = service(\"somenewservice\")\n\n        val versioner =\n            IndependentCrateVersioner(\n                VersionsManifest(\n                    smithyRsRevision = \"smithy-rs-1\",\n                    crates =\n                        mapOf(\n                            \"aws-sdk-dynamodb\" to\n                                CrateVersion(\n                                    category = \"AwsSdk\",\n                                    version = \"1.11.3\",\n                                    modelHash = \"dynamodb-hash\",\n                                ),\n                            \"aws-sdk-ec2\" to\n                                CrateVersion(\n                                    category = \"AwsSdk\",\n                                    version = \"1.10.1\",\n                                    modelHash = \"ec2-hash\",\n                                ),\n                            \"aws-sdk-polly\" to\n                                CrateVersion(\n                                    category = \"AwsSdk\",\n                                    version = \"1.9.0\",\n                                    modelHash = \"old-polly-hash\",\n                                ),\n                            \"aws-sdk-s3\" to\n                                CrateVersion(\n                                    category = \"AwsSdk\",\n                                    version = \"1.12.0\",\n                                    modelHash = \"s3-hash\",\n                                ),\n                        ),\n                ),\n                ModelMetadata(\n                    crates =\n                        mapOf(\n                            \"aws-sdk-dynamodb\" to ChangeType.FEATURE,\n                            \"aws-sdk-ec2\" to ChangeType.DOCUMENTATION,\n                            // polly has a model change, but is absent from the model metadata file\n                        ),\n                ),\n                devPreview = false,\n                smithyRsVersion = \"smithy-rs-1\",\n                hashModelsFn = { service ->\n                    when (service) {\n                        dynamoDb -> \"dynamodb-hash\"\n                        ec2 -> \"ec2-hash\"\n                        polly -> \"NEW-polly-hash\"\n                        s3 -> \"s3-hash\"\n                        else -> throw IllegalStateException(\"unreachable\")\n                    }\n                },\n            )\n\n        assertEquals(\"1.12.0\", versioner.decideCrateVersion(\"aws-sdk-dynamodb\", dynamoDb))\n        assertEquals(\"1.10.2\", versioner.decideCrateVersion(\"aws-sdk-ec2\", ec2))\n        assertEquals(\"1.10.0\", versioner.decideCrateVersion(\"aws-sdk-polly\", s3))\n        assertEquals(\"1.12.0\", versioner.decideCrateVersion(\"aws-sdk-s3\", s3))\n        assertEquals(\"1.0.0\", versioner.decideCrateVersion(\"aws-sdk-somenewservice\", someNewService))\n    }\n}\n\nclass HashModelsTest {\n    @Test\n    fun testHashModels() {\n        val service =\n            service(\"test\").copy(\n                modelFile = File(\"model1a\"),\n                extraFiles = listOf(File(\"model1b\")),\n            )\n        val hash =\n            hashModels(service) { file ->\n                when (file.toString()) {\n                    \"model1a\" -> \"foo\".toByteArray(Charsets.UTF_8)\n                    \"model1b\" -> \"bar\".toByteArray(Charsets.UTF_8)\n                    else -> throw IllegalStateException(\"unreachable\")\n                }\n            }\n        assertEquals(\"964021077fb6c3d42ae162ab2e2255be64c6d96a6d77bca089569774d54ef69b\", hash)\n    }\n}\n"
  },
  {
    "path": "buildSrc/src/test/kotlin/aws/sdk/ModelMetadataTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage aws.sdk\n\nimport org.junit.jupiter.api.Assertions.assertEquals\nimport org.junit.jupiter.api.Assertions.assertFalse\nimport org.junit.jupiter.api.Test\n\nclass ModelMetadataTest {\n    @Test\n    fun `it should parse an empty file`() {\n        val result = ModelMetadata.fromString(\"\")\n        assertFalse(result.hasCrates())\n    }\n\n    @Test\n    fun `it should parse`() {\n        val contents =\n            \"\"\"\n            [crates.aws-sdk-someservice]\n            kind = \"Feature\"\n\n            [crates.aws-sdk-s3]\n            kind = \"Documentation\"\n            \"\"\".trimIndent()\n\n        val result = ModelMetadata.fromString(contents)\n        assertEquals(ChangeType.FEATURE, result.changeType(\"aws-sdk-someservice\"))\n        assertEquals(ChangeType.DOCUMENTATION, result.changeType(\"aws-sdk-s3\"))\n    }\n}\n"
  },
  {
    "path": "buildSrc/src/test/kotlin/aws/sdk/VersionsManifestTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage aws.sdk\n\nimport org.junit.jupiter.api.Assertions.assertEquals\nimport org.junit.jupiter.api.Test\n\nclass VersionsManifestTest {\n    @Test\n    fun `it should parse versions toml`() {\n        val manifest =\n            VersionsManifest.fromString(\n                \"\"\"\n                smithy_rs_revision = 'some-smithy-rs-revision'\n\n                [crates.aws-config]\n                category = 'AwsRuntime'\n                version = '0.12.0'\n                source_hash = '12d172094a2576e6f4d00a8ba58276c0d4abc4e241bb75f0d3de8ac3412e8e47'\n\n                [crates.aws-sdk-account]\n                category = 'AwsSdk'\n                version = '0.12.0'\n                source_hash = 'a0dfc080638b1d803745f0bd66b610131783cf40ab88fd710dce906fc69b983e'\n                model_hash = '179bbfd915093dc3bec5444771da2b20d99a37d104ba25f0acac9aa0d5bb758a'\n                \"\"\".trimIndent(),\n            )\n\n        assertEquals(\"some-smithy-rs-revision\", manifest.smithyRsRevision)\n        assertEquals(\n            mapOf(\n                \"aws-config\" to\n                    CrateVersion(\n                        category = \"AwsRuntime\",\n                        version = \"0.12.0\",\n                        sourceHash = \"12d172094a2576e6f4d00a8ba58276c0d4abc4e241bb75f0d3de8ac3412e8e47\",\n                    ),\n                \"aws-sdk-account\" to\n                    CrateVersion(\n                        category = \"AwsSdk\",\n                        version = \"0.12.0\",\n                        sourceHash = \"a0dfc080638b1d803745f0bd66b610131783cf40ab88fd710dce906fc69b983e\",\n                        modelHash = \"179bbfd915093dc3bec5444771da2b20d99a37d104ba25f0acac9aa0d5bb758a\",\n                    ),\n            ),\n            manifest.crates,\n        )\n    }\n}\n"
  },
  {
    "path": "ci",
    "content": "#!/bin/bash\n#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\n\nset -e\n\nif [[ $# -lt 1 ]]; then\n    echo \"Usage: ci <action> [args...]\"\n    echo\n    echo \"Runs a CI action from tools/ci-build/scripts within the Docker build image.\"\n    echo \"Requires Docker and docker compose to both be installed.\"\n    echo\n    echo \"Note: Some actions may require 'aws-sdk-rust' and/or 'aws-doc-sdk-examples'\"\n    echo \"to be checked out in the same directory as 'smithy-rs'.\"\n    exit 1\nfi\n\nACTION_NAME=$1\nshift\nACTION_ARGS=(\"$@\")\n\ncd ..\nmake -f ./smithy-rs/ci.mk \"${ACTION_NAME}\" ARGS=\"${ACTION_ARGS[*]}\"\n"
  },
  {
    "path": "ci.mk",
    "content": "#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\n\n# This is a makefile executed by the `./ci` script that\n# has a target for every single CI script in `tools/ci-scripts`,\n# with dependencies between targets included so that it's not necessary\n# to remember to generate a SDK for the targets that require one.\n\nARGS=\nCI_BUILD=./smithy-rs/tools/ci-build\nCI_ACTION=$(CI_BUILD)/ci-action\n\n.PHONY: acquire-build-image\nacquire-build-image:\n\t./smithy-rs/.github/scripts/acquire-build-image\n\n.PHONY: check-aws-config\ncheck-aws-config: generate-aws-sdk-smoketest\n\t$(CI_ACTION) $@ $(ARGS)\n\n.PHONY: check-aws-sdk-canary\ncheck-aws-sdk-canary: generate-aws-sdk-smoketest\n\t$(CI_ACTION) $@ $(ARGS)\n\n.PHONY: check-aws-sdk-adhoc-tests\ncheck-aws-sdk-adhoc-tests:\n\t$(CI_ACTION) $@ $(ARGS)\n\n.PHONY: check-aws-sdk-services\ncheck-aws-sdk-services: generate-aws-sdk\n\t$(CI_ACTION) $@ $(ARGS)\n\n.PHONY: check-only-aws-sdk-services\ncheck-only-aws-sdk-services: generate-aws-sdk\n\t$(CI_ACTION) $@ $(ARGS)\n\n.PHONY: check-aws-sdk-smoketest-docs-clippy-udeps\ncheck-aws-sdk-smoketest-docs-clippy-udeps: generate-aws-sdk-smoketest\n\t$(CI_ACTION) $@ $(ARGS)\n\n.PHONY: check-aws-sdk-smoketest-unit-tests\ncheck-aws-sdk-smoketest-unit-tests: generate-aws-sdk-smoketest\n\t$(CI_ACTION) $@ $(ARGS)\n\n.PHONY: check-aws-sdk-standalone-integration-tests\ncheck-aws-sdk-standalone-integration-tests: generate-aws-sdk-smoketest\n\t$(CI_ACTION) $@ $(ARGS)\n\n.PHONY: check-book\ncheck-book: check-rust-runtimes\n\t$(CI_ACTION) $@ $(ARGS)\n\n.PHONY: check-client-codegen-integration-tests\ncheck-client-codegen-integration-tests:\n\t$(CI_ACTION) $@ $(ARGS)\n\n.PHONY: check-client-codegen-unit-tests\ncheck-client-codegen-unit-tests:\n\t$(CI_ACTION) $@ $(ARGS)\n\n.PHONY: check-core-codegen-unit-tests\ncheck-core-codegen-unit-tests:\n\t$(CI_ACTION) $@ $(ARGS)\n\n.PHONY: check-rust-runtimes\ncheck-rust-runtimes:\n\t$(CI_ACTION) $@ $(ARGS)\n\n.PHONY: check-tools\ncheck-tools:\n\t$(CI_ACTION) $@ $(ARGS)\n\n.PHONY: check-sdk-codegen-unit-tests\ncheck-sdk-codegen-unit-tests:\n\t$(CI_ACTION) $@ $(ARGS)\n\n.PHONY: check-server-codegen-integration-tests\ncheck-server-codegen-integration-tests:\n\t$(CI_ACTION) $@ $(ARGS)\n\n.PHONY: check-server-codegen-unit-tests\ncheck-server-codegen-unit-tests:\n\t$(CI_ACTION) $@ $(ARGS)\n\n.PHONY: check-serde-codegen-unit-tests\ncheck-serde-codegen-unit-tests:\n\t$(CI_ACTION) $@ $(ARGS)\n\n.PHONY: check-server-codegen-integration-tests-python\ncheck-server-codegen-integration-tests-python:\n\t$(CI_ACTION) $@ $(ARGS)\n\n.PHONY: check-server-codegen-unit-tests-python\ncheck-server-codegen-unit-tests-python:\n\t$(CI_ACTION) $@ $(ARGS)\n\n.PHONY: check-server-e2e-test\ncheck-server-e2e-test:\n\t$(CI_ACTION) $@ $(ARGS)\n\n.PHONY: check-server-python-e2e-test\ncheck-server-python-e2e-test:\n\t$(CI_ACTION) $@ $(ARGS)\n\n.PHONY: check-style-and-lints\ncheck-style-and-lints:\n\t$(CI_ACTION) $@ $(ARGS)\n\n.PHONY: generate-aws-sdk-smoketest\ngenerate-aws-sdk-smoketest:\n\t$(CI_ACTION) $@ $(ARGS)\n\n.PHONY: generate-aws-sdk\ngenerate-aws-sdk:\n\t$(CI_ACTION) $@ $(ARGS)\n\n.PHONY: generate-codegen-diff\ngenerate-codegen-diff:\n\t$(CI_ACTION) $@ $(ARGS)\n\n.PHONY: check-deterministic-codegen\ncheck-deterministic-codegen:\n\t$(CI_ACTION) $@ $(ARGS)\n\n.PHONY: check-semver\ncheck-semver:\n\t$(CI_ACTION) $@ $(ARGS)\n\n.PHONY: generate-smithy-rs-release\ngenerate-smithy-rs-release:\n\t$(CI_ACTION) $@ $(ARGS)\n\n.PHONY: verify-tls-config\nverify-tls-config:\n\t$(CI_ACTION) $@ $(ARGS)\n"
  },
  {
    "path": "clippy-root.toml",
    "content": "# this file is named `clippy-root.toml` so it isn't picked up automagically. Clippy\n# will search up the filesystem for a clippy.toml and this causes problems with tools.\ndisallowed-methods = [\n    # fully qualified function/method name:\n    \"std::time::SystemTime::now\",\n    \"std::time::SystemTime::elapsed\",\n    \"std::time::Instant::now\",\n    \"std::time::Instant::elapsed\"\n]\n"
  },
  {
    "path": "codegen-client/build.gradle.kts",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nplugins {\n    id(\"smithy-rs.kotlin-conventions\")\n    id(\"smithy-rs.publishing-conventions\")\n}\n\ndescription = \"Generates Rust client code from Smithy models\"\nextra[\"displayName\"] = \"Smithy :: Rust :: CodegenClient\"\nextra[\"moduleName\"] = \"software.amazon.smithy.rust.codegen.client\"\n\ndependencies {\n    implementation(project(\":codegen-core\"))\n    implementation(kotlin(\"stdlib-jdk8\"))\n    api(libs.smithy.codegen.core)\n    implementation(libs.jackson.dataformat.cbor)\n    implementation(libs.smithy.aws.traits)\n    implementation(libs.smithy.protocol.test.traits)\n    implementation(libs.smithy.waiters)\n    implementation(libs.smithy.rules.engine)\n    testImplementation(libs.smithy.rules.engine.tests)\n    implementation(libs.smithy.protocol.traits)\n\n    // `smithy.framework#ValidationException` is defined here, which is used in event stream\n    // marshalling/unmarshalling tests.\n    testImplementation(libs.smithy.validation.model)\n\n    runtimeOnly(project(\":rust-runtime\"))\n    testImplementation(libs.junit.jupiter)\n    testImplementation(libs.kotest.assertions.core.jvm)\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientCodegenContext.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy\n\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.ServiceShape\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.ClientBuilderInstantiator\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenContext\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenTarget\nimport software.amazon.smithy.rust.codegen.core.smithy.ModuleDocProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.BuilderInstantiator\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.Protocol\n\n/**\n * [ClientCodegenContext] contains code-generation context that is _specific_ to the [RustClientCodegenPlugin] plugin\n * from the `codegen-client` subproject.\n *\n * It inherits from [CodegenContext], which contains code-generation context that is common to _all_ smithy-rs plugins.\n */\ndata class ClientCodegenContext(\n    override val model: Model,\n    override val symbolProvider: RustSymbolProvider,\n    override val moduleDocProvider: ModuleDocProvider?,\n    override val serviceShape: ServiceShape,\n    override val protocol: ShapeId,\n    override val settings: ClientRustSettings,\n    // Expose the `rootDecorator`, enabling customizations to compose by referencing information from the root codegen\n    // decorator\n    val rootDecorator: ClientCodegenDecorator,\n    val protocolImpl: Protocol? = null,\n) : CodegenContext(\n        model, symbolProvider, moduleDocProvider, serviceShape, protocol, settings, CodegenTarget.CLIENT,\n    ) {\n    val enableUserConfigurableRuntimePlugins: Boolean get() = settings.codegenConfig.enableUserConfigurableRuntimePlugins\n\n    override fun builderInstantiator(): BuilderInstantiator {\n        return ClientBuilderInstantiator(this)\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientCodegenVisitor.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy\n\nimport software.amazon.smithy.build.PluginContext\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.ServiceShape\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.shapes.ShapeVisitor\nimport software.amazon.smithy.model.shapes.StringShape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.shapes.UnionShape\nimport software.amazon.smithy.model.traits.EnumTrait\nimport software.amazon.smithy.model.traits.ErrorTrait\nimport software.amazon.smithy.model.transform.ModelTransformer\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.ClientEnumGenerator\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.OperationGenerator\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceGenerator\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.client.CustomizableOperationImplGenerator\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.error.ErrorGenerator\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.error.OperationErrorGenerator\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.protocol.ClientProtocolTestGenerator\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.protocol.SerdeBenchmarkTestGenerator\nimport software.amazon.smithy.rust.codegen.client.smithy.protocols.ClientProtocolLoader\nimport software.amazon.smithy.rust.codegen.client.smithy.transformers.AddErrorMessage\nimport software.amazon.smithy.rust.codegen.client.smithy.transformers.DisableStalledStreamProtection\nimport software.amazon.smithy.rust.codegen.core.rustlang.EscapeFor\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustModule\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustReservedWords\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.implBlock\nimport software.amazon.smithy.rust.codegen.core.smithy.DirectedWalker\nimport software.amazon.smithy.rust.codegen.core.smithy.RustCrate\nimport software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProviderConfig\nimport software.amazon.smithy.rust.codegen.core.smithy.contextName\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.BuilderGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.StructureGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.UnionGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.ProtocolGeneratorFactory\nimport software.amazon.smithy.rust.codegen.core.smithy.transformers.EventStreamNormalizer\nimport software.amazon.smithy.rust.codegen.core.smithy.transformers.OperationNormalizer\nimport software.amazon.smithy.rust.codegen.core.smithy.transformers.RecursiveShapeBoxer\nimport software.amazon.smithy.rust.codegen.core.util.CommandError\nimport software.amazon.smithy.rust.codegen.core.util.getTrait\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\nimport software.amazon.smithy.rust.codegen.core.util.isEventStream\nimport software.amazon.smithy.rust.codegen.core.util.letIf\nimport software.amazon.smithy.rust.codegen.core.util.runCommand\nimport software.amazon.smithy.rust.codegen.core.util.serviceNameOrDefault\nimport software.amazon.smithy.rust.codegen.core.util.toSnakeCase\nimport java.util.logging.Logger\n\n/**\n * Entry point for client code generation\n */\nclass ClientCodegenVisitor(\n    context: PluginContext,\n    private val codegenDecorator: ClientCodegenDecorator,\n) : ShapeVisitor.Default<Unit>() {\n    private val logger = Logger.getLogger(javaClass.name)\n    private val settings = ClientRustSettings.from(context.model, context.settings)\n\n    private val symbolProvider: RustSymbolProvider\n    private val rustCrate: RustCrate\n    private val fileManifest = context.fileManifest\n    private val model: Model\n    private var codegenContext: ClientCodegenContext\n    private val protocolGeneratorFactory: ProtocolGeneratorFactory<OperationGenerator, ClientCodegenContext>\n    private val operationGenerator: OperationGenerator\n\n    init {\n        val rustSymbolProviderConfig =\n            RustSymbolProviderConfig(\n                runtimeConfig = settings.runtimeConfig,\n                renameExceptions = settings.codegenConfig.renameExceptions,\n                nullabilityCheckMode = settings.codegenConfig.nullabilityCheckMode,\n                moduleProvider = ClientModuleProvider,\n                nameBuilderFor = { symbol -> \"${symbol.name}Builder\" },\n            )\n\n        val baseModel = baselineTransform(context.model)\n        val untransformedService = settings.getService(baseModel)\n        val (protocol, generator) =\n            ClientProtocolLoader(\n                codegenDecorator.protocols(untransformedService.id, ClientProtocolLoader.DefaultProtocols),\n            ).protocolFor(context.model, untransformedService)\n        protocolGeneratorFactory = generator\n        model = codegenDecorator.transformModel(untransformedService, baseModel, settings)\n        // the model transformer _might_ change the service shape\n        val service = settings.getService(model)\n        symbolProvider =\n            RustClientCodegenPlugin.baseSymbolProvider(\n                settings,\n                model,\n                service,\n                rustSymbolProviderConfig,\n                codegenDecorator,\n            )\n\n        codegenContext =\n            ClientCodegenContext(\n                model,\n                symbolProvider,\n                null,\n                service,\n                protocol,\n                settings,\n                codegenDecorator,\n            )\n\n        codegenContext =\n            codegenContext.copy(\n                moduleDocProvider =\n                    codegenDecorator.moduleDocumentationCustomization(\n                        codegenContext,\n                        ClientModuleDocProvider(codegenContext, service.serviceNameOrDefault(\"the service\")),\n                    ),\n                protocolImpl = protocolGeneratorFactory.protocol(codegenContext),\n            )\n\n        rustCrate =\n            RustCrate(\n                context.fileManifest,\n                symbolProvider,\n                codegenContext.settings.codegenConfig,\n                codegenContext.expectModuleDocProvider(),\n            )\n        operationGenerator = protocolGeneratorFactory.buildProtocolGenerator(codegenContext)\n    }\n\n    /**\n     * Base model transformation applied to all services\n     * See below for details.\n     */\n    internal fun baselineTransform(model: Model) =\n        model\n            // Flattens mixins out of the model and removes them from the model\n            .let { ModelTransformer.create().flattenAndRemoveMixins(it) }\n            // Add errors attached at the service level to the models\n            .let { ModelTransformer.create().copyServiceErrorsToOperations(it, settings.getService(it)) }\n            // Add `Box<T>` to recursive shapes as necessary\n            .let(RecursiveShapeBoxer()::transform)\n            // Normalize the `message` field on errors when enabled in settings (default: true)\n            .letIf(settings.codegenConfig.addMessageToErrors, AddErrorMessage::transform)\n            // NormalizeOperations by ensuring every operation has an input & output shape\n            .let(OperationNormalizer::transform)\n            // Normalize event stream operations\n            .let(EventStreamNormalizer::transform)\n            // Mark operations incompatible with stalled stream protection as such\n            .let(DisableStalledStreamProtection::transformModel)\n\n    /**\n     * Execute code generation\n     *\n     * 1. Load the service from RustSettings\n     * 2. Traverse every shape in the closure of the service.\n     * 3. Loop through each shape and visit them (calling the override functions in this class)\n     * 4. Call finalization tasks specified by decorators.\n     * 5. Write the in-memory buffers out to files.\n     *\n     * The main work of code generation (serializers, protocols, etc.) is handled in `fn serviceShape` below.\n     */\n    fun execute() {\n        logger.info(\"generating Rust client...\")\n        val service = settings.getService(model)\n        val serviceShapes = DirectedWalker(model).walkShapes(service)\n        serviceShapes.forEach { it.accept(this) }\n        codegenDecorator.extras(codegenContext, rustCrate)\n        // finalize actually writes files into the base directory, renders any inline functions that were used, and\n        // performs finalization like generating a Cargo.toml\n        rustCrate.finalize(\n            settings,\n            model,\n            codegenDecorator.crateManifestCustomizations(codegenContext),\n            codegenDecorator.libRsCustomizations(\n                codegenContext,\n                listOf(),\n            ),\n            protocolId = codegenContext.protocol,\n        )\n        try {\n            // use an increased max_width to make rustfmt fail less frequently\n            \"cargo fmt -- --config max_width=150\".runCommand(\n                fileManifest.baseDir,\n                timeout = settings.codegenConfig.formatTimeoutSeconds.toLong(),\n            )\n        } catch (err: CommandError) {\n            logger.warning(\"Failed to run cargo fmt: [${service.id}]\\n${err.output}\")\n        }\n\n        logger.info(\"Rust Client generation complete!\")\n    }\n\n    /**\n     * Generate service-specific code for the model:\n     * - Serializers\n     * - Deserializers\n     * - Fluent client\n     * - Trait implementations\n     * - Protocol tests\n     * - Operation structures\n     */\n    override fun serviceShape(shape: ServiceShape) {\n        ServiceGenerator(rustCrate, codegenContext, codegenDecorator).render()\n    }\n\n    override fun getDefault(shape: Shape?) {\n    }\n\n    private fun privateModule(shape: Shape): RustModule.LeafModule =\n        RustModule.private(privateModuleName(shape), parent = symbolProvider.moduleForShape(shape))\n\n    private fun privateModuleName(shape: Shape): String =\n        shape.contextName(codegenContext.serviceShape).let(this::privateModuleName)\n\n    private fun privateModuleName(name: String): String =\n        // Add the underscore to avoid colliding with public module names\n        \"_\" + RustReservedWords.escapeIfNeeded(name.toSnakeCase(), EscapeFor.ModuleName)\n\n    /**\n     * Structure Shape Visitor\n     *\n     * For each structure shape, generate:\n     * - A Rust structure for the shape (StructureGenerator)\n     * - A builder for the shape\n     *\n     * This function _does not_ generate any serializers\n     */\n    override fun structureShape(shape: StructureShape) {\n        val (renderStruct, renderBuilder) =\n            when (val errorTrait = shape.getTrait<ErrorTrait>()) {\n                null -> {\n                    val struct: Writable = {\n                        StructureGenerator(\n                            model,\n                            symbolProvider,\n                            this,\n                            shape,\n                            codegenDecorator.structureCustomizations(codegenContext, emptyList()),\n                            structSettings = codegenContext.structSettings(),\n                        ).render()\n\n                        implBlock(symbolProvider.toSymbol(shape)) {\n                            BuilderGenerator.renderConvenienceMethod(this, symbolProvider, shape)\n                            if (codegenContext.protocolImpl?.httpBindingResolver?.handlesEventStreamInitialResponse(\n                                    shape,\n                                ) == true\n                            ) {\n                                BuilderGenerator.renderIntoBuilderMethod(this, symbolProvider, shape)\n                            }\n                        }\n                    }\n                    val builder: Writable = {\n                        BuilderGenerator(\n                            codegenContext.model,\n                            codegenContext.symbolProvider,\n                            shape,\n                            codegenDecorator.builderCustomizations(codegenContext, emptyList()),\n                        ).render(this)\n                    }\n                    struct to builder\n                }\n\n                else -> {\n                    val errorGenerator =\n                        ErrorGenerator(\n                            model,\n                            symbolProvider,\n                            shape,\n                            errorTrait,\n                            codegenDecorator.errorImplCustomizations(codegenContext, emptyList()),\n                            codegenContext.structSettings(),\n                        )\n                    errorGenerator::renderStruct to errorGenerator::renderBuilder\n                }\n            }\n\n        val privateModule = privateModule(shape)\n        rustCrate.inPrivateModuleWithReexport(privateModule, symbolProvider.toSymbol(shape)) {\n            renderStruct(this)\n        }\n        rustCrate.inPrivateModuleWithReexport(privateModule, symbolProvider.symbolForBuilder(shape)) {\n            renderBuilder(this)\n        }\n    }\n\n    /**\n     * String Shape Visitor\n     *\n     * Although raw strings require no code generation, enums are actually `EnumTrait` applied to string shapes.\n     */\n    override fun stringShape(shape: StringShape) {\n        if (shape.hasTrait<EnumTrait>()) {\n            val privateModule = privateModule(shape)\n            rustCrate.inPrivateModuleWithReexport(privateModule, symbolProvider.toSymbol(shape)) {\n                ClientEnumGenerator(\n                    codegenContext,\n                    shape,\n                    codegenDecorator.enumCustomizations(codegenContext, emptyList()),\n                ).render(this)\n            }\n        }\n    }\n\n    /**\n     * Union Shape Visitor\n     *\n     * Generate an `enum` for union shapes.\n     *\n     * Note: this does not generate serializers\n     */\n    override fun unionShape(shape: UnionShape) {\n        rustCrate.inPrivateModuleWithReexport(privateModule(shape), symbolProvider.toSymbol(shape)) {\n            UnionGenerator(model, symbolProvider, this, shape, renderUnknownVariant = true).render()\n        }\n        if (shape.isEventStream()) {\n            rustCrate.withModule(symbolProvider.moduleForEventStreamError(shape)) {\n                OperationErrorGenerator(\n                    model,\n                    symbolProvider,\n                    shape,\n                    codegenDecorator.errorCustomizations(codegenContext, emptyList()),\n                ).render(this)\n            }\n        }\n    }\n\n    /**\n     * Generate operations\n     */\n    override fun operationShape(operationShape: OperationShape) {\n        rustCrate.useShapeWriter(operationShape) {\n            // Render the operation shape\n            operationGenerator.renderOperation(\n                this,\n                operationShape,\n                codegenDecorator,\n            )\n\n            // render protocol tests into `operation.rs` (note operationWriter vs. inputWriter)\n            val baseGenerator =\n                ClientProtocolTestGenerator(\n                    codegenContext,\n                    protocolGeneratorFactory.support(),\n                    operationShape,\n                )\n            val generator =\n                if (baseGenerator.allMatchingTestCases().any { it.tags.contains(\"serde-benchmark\") }) {\n                    SerdeBenchmarkTestGenerator(codegenContext, protocolGeneratorFactory.support(), operationShape)\n                } else {\n                    baseGenerator\n                }\n            codegenDecorator.protocolTestGenerator(codegenContext, generator).render(this)\n        }\n\n        rustCrate.withModule(symbolProvider.moduleForOperationError(operationShape)) {\n            OperationErrorGenerator(\n                model,\n                symbolProvider,\n                operationShape,\n                codegenDecorator.errorCustomizations(codegenContext, emptyList()),\n            ).render(this)\n        }\n\n        rustCrate.withModule(ClientRustModule.Client.customize) {\n            CustomizableOperationImplGenerator(\n                codegenContext,\n                operationShape,\n                codegenDecorator.operationCustomizations(codegenContext, operationShape, emptyList()),\n            ).render(this)\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientReExports.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy\n\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\n\n/** Returns a symbol for a type re-exported into crate::config\n *  Although it is not always possible to use this, this is the preferred method for using types in config customizations\n *  and ensures that your type will be re-exported if it is used.\n */\nfun configReexport(type: RuntimeType): RuntimeType =\n    RuntimeType.forInlineFun(type.name, module = ClientRustModule.config) {\n        rustTemplate(\"pub use #{type};\", \"type\" to type)\n    }\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientReservedWords.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy\n\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustReservedWordConfig\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.StructureGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.UnionGenerator\n\nval ClientReservedWords =\n    RustReservedWordConfig(\n        structureMemberMap =\n            StructureGenerator.structureMemberNameMap +\n                mapOf(\n                    \"send\" to \"send_value\",\n                    // To avoid conflicts with the `make_operation` and `presigned` functions on generated inputs\n                    \"make_operation\" to \"make_operation_value\",\n                    \"presigned\" to \"presigned_value\",\n                    \"customize\" to \"customize_value\",\n                    // To avoid conflicts with the error metadata `meta` field\n                    \"meta\" to \"meta_value\",\n                ),\n        unionMemberMap =\n            mapOf(\n                // Unions contain an `Unknown` variant. This exists to support parsing data returned from the server\n                // that represent union variants that have been added since this SDK was generated.\n                UnionGenerator.UNKNOWN_VARIANT_NAME to \"${UnionGenerator.UNKNOWN_VARIANT_NAME}Value\",\n                \"${UnionGenerator.UNKNOWN_VARIANT_NAME}Value\" to \"${UnionGenerator.UNKNOWN_VARIANT_NAME}Value_\",\n            ),\n        enumMemberMap =\n            mapOf(\n                // Unknown is used as the name of the variant containing unexpected values\n                \"Unknown\" to \"UnknownValue\",\n                // Real models won't end in `_` so it's safe to stop here\n                \"UnknownValue\" to \"UnknownValue_\",\n            ),\n    )\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientRustModule.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy\n\nimport software.amazon.smithy.codegen.core.Symbol\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.knowledge.TopDownIndex\nimport software.amazon.smithy.model.shapes.EnumShape\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.shapes.StringShape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.shapes.UnionShape\nimport software.amazon.smithy.model.traits.EnumTrait\nimport software.amazon.smithy.model.traits.ErrorTrait\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.client.FluentClientDocs\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.client.FluentClientGenerator\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.EscapeFor\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustModule\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustReservedWords\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.docs\nimport software.amazon.smithy.rust.codegen.core.rustlang.docsTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.escape\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.ModuleDocProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.ModuleProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.ModuleProviderContext\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.contextName\nimport software.amazon.smithy.rust.codegen.core.smithy.module\nimport software.amazon.smithy.rust.codegen.core.smithy.traits.SyntheticInputTrait\nimport software.amazon.smithy.rust.codegen.core.smithy.traits.SyntheticOutputTrait\nimport software.amazon.smithy.rust.codegen.core.util.PANIC\nimport software.amazon.smithy.rust.codegen.core.util.UNREACHABLE\nimport software.amazon.smithy.rust.codegen.core.util.getTrait\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\nimport software.amazon.smithy.rust.codegen.core.util.toSnakeCase\n\n/**\n * Modules for code generated client crates.\n */\nobject ClientRustModule {\n    /** crate */\n    val root = RustModule.LibRs\n\n    /** crate::client */\n    val client = Client.self\n\n    object Client {\n        /** crate::client */\n        val self = RustModule.public(\"client\")\n\n        /** crate::client::customize */\n        val customize = RustModule.public(\"customize\", parent = self)\n    }\n\n    /** crate::config */\n    val config = Config.self\n\n    object Config {\n        /** crate::client */\n        val self = RustModule.public(\"config\")\n\n        /** crate::config::auth */\n        val auth = RustModule.public(\"auth\", parent = self)\n\n        /** crate::config::endpoint */\n        val endpoint = RustModule.public(\"endpoint\", parent = self)\n\n        /** crate::config::http */\n        val http = RustModule.public(\"http\", parent = self)\n\n        /** crate::config::interceptors */\n        val interceptors = RustModule.public(\"interceptors\", parent = self)\n\n        /** crate::config::retry */\n        val retry = RustModule.public(\"retry\", parent = self)\n\n        /** crate::config::timeout */\n        val timeout = RustModule.public(\"timeout\", parent = self)\n    }\n\n    val Error = RustModule.public(\"error\")\n    val Operation = RustModule.public(\"operation\")\n    val Meta = RustModule.public(\"meta\")\n    val Input = RustModule.public(\"input\")\n    val Output = RustModule.public(\"output\")\n\n    /** crate::primitives */\n    val primitives = Primitives.self\n\n    object Primitives {\n        /** crate::primitives */\n        val self = RustModule.public(\"primitives\")\n\n        /** crate::primitives::event_stream */\n        val EventStream = RustModule.public(\"event_stream\", parent = self)\n    }\n\n    /** crate::types */\n    val types = Types.self\n\n    object Types {\n        /** crate::types */\n        val self = RustModule.public(\"types\")\n\n        /** crate::types::error */\n        val Error = RustModule.public(\"error\", parent = self)\n    }\n\n    val waiters = RustModule.public(\"waiters\")\n}\n\nclass ClientModuleDocProvider(\n    private val codegenContext: ClientCodegenContext,\n    private val serviceName: String,\n) : ModuleDocProvider {\n    override fun docsWriter(module: RustModule.LeafModule): Writable? {\n        val strDoc: (String) -> Writable = { str -> writable { docs(escape(str)) } }\n        return when (module) {\n            ClientRustModule.client -> clientModuleDoc()\n            ClientRustModule.Client.customize -> customizeModuleDoc()\n            ClientRustModule.config -> strDoc(\"Configuration for $serviceName.\")\n            ClientRustModule.Config.auth -> strDoc(\"Types needed to configure auth scheme resolution.\")\n            ClientRustModule.Config.endpoint -> strDoc(\"Types needed to configure endpoint resolution.\")\n            ClientRustModule.Config.retry -> strDoc(\"Retry configuration.\")\n            ClientRustModule.Config.timeout -> strDoc(\"Timeout configuration.\")\n            ClientRustModule.Config.http -> strDoc(\"HTTP request and response types.\")\n            ClientRustModule.Config.interceptors -> strDoc(\"Types needed to implement [`Intercept`](crate::config::Intercept).\")\n            ClientRustModule.Error -> strDoc(\"Common errors and error handling utilities.\")\n            ClientRustModule.Operation -> strDoc(\"All operations that this crate can perform.\")\n            ClientRustModule.Meta -> strDoc(\"Information about this crate.\")\n            ClientRustModule.Input -> PANIC(\"this module shouldn't exist in the new scheme\")\n            ClientRustModule.Output -> PANIC(\"this module shouldn't exist in the new scheme\")\n            ClientRustModule.primitives -> strDoc(\"Primitives such as `Blob` or `DateTime` used by other types.\")\n            ClientRustModule.Primitives.EventStream -> strDoc(\"Event stream related primitives such as `Message` or `Header`.\")\n            ClientRustModule.types -> strDoc(\"Data structures used by operation inputs/outputs.\")\n            ClientRustModule.Types.Error -> strDoc(\"Error types that $serviceName can respond with.\")\n            ClientRustModule.waiters -> strDoc(\"Supporting types for waiters.\\n\\nNote: to use waiters, import the [`Waiters`](crate::client::Waiters) trait, which adds methods prefixed with `wait_until` to the client.\")\n            else -> TODO(\"Document this module: $module\")\n        }\n    }\n\n    private fun clientModuleDoc(): Writable =\n        writable {\n            val genericClientConstructionDocs = FluentClientDocs.clientConstructionDocs(codegenContext)\n            val writeClientConstructionDocs =\n                codegenContext.rootDecorator\n                    .clientConstructionDocs(codegenContext, genericClientConstructionDocs)\n\n            writeClientConstructionDocs(this)\n            FluentClientDocs.clientUsageDocs(codegenContext)(this)\n            FluentClientDocs.waiterDocs(codegenContext)(this)\n        }\n\n    private fun customizeModuleDoc(): Writable =\n        writable {\n            val model = codegenContext.model\n            val operations = TopDownIndex.of(model).getContainedOperations(codegenContext.serviceShape)\n            docs(\"Operation customization and supporting types.\\n\")\n            if (operations.isNotEmpty()) {\n                val opFnName =\n                    FluentClientGenerator.clientOperationFnName(\n                        operations.minOf { it.id }\n                            .let { model.expectShape(it, OperationShape::class.java) },\n                        codegenContext.symbolProvider,\n                    )\n                val moduleUseName = codegenContext.moduleUseName()\n                docsTemplate(\n                    \"\"\"\n                    The underlying HTTP requests made during an operation can be customized\n                    by calling the `customize()` method on the builder returned from a client\n                    operation call. For example, this can be used to add an additional HTTP header:\n\n                    ```ignore\n                    ## async fn wrapper() -> #{Result}<(), $moduleUseName::Error> {\n                    ## let client: $moduleUseName::Client = unimplemented!();\n                    use #{http}::header::{HeaderName, HeaderValue};\n\n                    let result = client.$opFnName()\n                        .customize()\n                        .mutate_request(|req| {\n                            // Add `x-example-header` with value\n                            req.headers_mut()\n                                .insert(\n                                    HeaderName::from_static(\"x-example-header\"),\n                                    HeaderValue::from_static(\"1\"),\n                                );\n                        })\n                        .send()\n                        .await;\n                    ## }\n                    ```\n                    \"\"\".trimIndent(),\n                    *RuntimeType.preludeScope,\n                    \"http\" to CargoDependency.Http1x.toDevDependency().toType(),\n                )\n            }\n        }\n}\n\nobject ClientModuleProvider : ModuleProvider {\n    override fun moduleForShape(\n        context: ModuleProviderContext,\n        shape: Shape,\n    ): RustModule.LeafModule {\n        fun shouldNotBeRendered(): Nothing = PANIC(\"Shape ${shape.id} should not be rendered in any module\")\n        return when (shape) {\n            is OperationShape -> perOperationModule(context, shape)\n            is StructureShape ->\n                when {\n                    shape.hasTrait<ErrorTrait>() -> ClientRustModule.Types.Error\n                    shape.hasTrait<SyntheticInputTrait>() -> perOperationModule(context, shape)\n                    shape.hasTrait<SyntheticOutputTrait>() -> perOperationModule(context, shape)\n                    else -> ClientRustModule.types\n                }\n\n            is UnionShape, is EnumShape -> ClientRustModule.types\n            is StringShape -> {\n                if (shape.hasTrait<EnumTrait>()) {\n                    ClientRustModule.types\n                } else {\n                    shouldNotBeRendered()\n                }\n            }\n\n            else -> shouldNotBeRendered()\n        }\n    }\n\n    override fun moduleForOperationError(\n        context: ModuleProviderContext,\n        operation: OperationShape,\n    ): RustModule.LeafModule = perOperationModule(context, operation)\n\n    override fun moduleForEventStreamError(\n        context: ModuleProviderContext,\n        eventStream: UnionShape,\n    ): RustModule.LeafModule = ClientRustModule.Types.Error\n\n    override fun moduleForBuilder(\n        context: ModuleProviderContext,\n        shape: Shape,\n        symbol: Symbol,\n    ): RustModule.LeafModule =\n        RustModule.public(\"builders\", parent = symbol.module(), documentationOverride = \"Builders\")\n\n    private fun Shape.findOperation(model: Model): OperationShape {\n        val inputTrait = getTrait<SyntheticInputTrait>()\n        val outputTrait = getTrait<SyntheticOutputTrait>()\n        return when {\n            this is OperationShape -> this\n            inputTrait != null -> model.expectShape(inputTrait.operation, OperationShape::class.java)\n            outputTrait != null -> model.expectShape(outputTrait.operation, OperationShape::class.java)\n            else -> UNREACHABLE(\"this is only called with compatible shapes\")\n        }\n    }\n\n    private fun perOperationModule(\n        context: ModuleProviderContext,\n        shape: Shape,\n    ): RustModule.LeafModule {\n        val operationShape = shape.findOperation(context.model)\n        val contextName = operationShape.contextName(context.serviceShape)\n        val operationModuleName =\n            RustReservedWords.escapeIfNeeded(contextName.toSnakeCase(), EscapeFor.ModuleName)\n        return RustModule.public(\n            operationModuleName,\n            parent = ClientRustModule.Operation,\n            documentationOverride = \"Types for the `$contextName` operation.\",\n            // TODO(https://github.com/tokio-rs/tokio/issues/5683): Uncomment the NoImplicitPrelude attribute once this Tokio issue is resolved\n            // // Disable the Rust prelude since every prelude type should be referenced with its\n            // // fully qualified name to avoid name collisions with the generated operation shapes.\n            // additionalAttributes = listOf(Attribute.NoImplicitPrelude)\n        )\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientRustSettings.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy\n\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.knowledge.NullableIndex\nimport software.amazon.smithy.model.node.ObjectNode\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.rust.codegen.core.smithy.CODEGEN_SETTINGS\nimport software.amazon.smithy.rust.codegen.core.smithy.CoreCodegenConfig\nimport software.amazon.smithy.rust.codegen.core.smithy.CoreRustSettings\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig\nimport java.util.Optional\n\n/*\n * [ClientRustSettings] and [ClientCodegenConfig] classes.\n *\n * These are specializations of [CoreRustSettings] and [CodegenConfig] for the `rust-client-codegen`\n * client Smithy plugin. Refer to the documentation of those for the inherited properties.\n */\n\n/**\n * Settings used by [RustClientCodegenPlugin].\n */\ndata class ClientRustSettings(\n    override val service: ShapeId,\n    override val moduleName: String,\n    override val moduleVersion: String,\n    override val moduleAuthors: List<String>,\n    override val moduleDescription: String?,\n    override val moduleRepository: String?,\n    override val runtimeConfig: RuntimeConfig,\n    override val codegenConfig: ClientCodegenConfig,\n    override val license: String?,\n    override val examplesUri: String?,\n    override val minimumSupportedRustVersion: String? = null,\n    override val customizationConfig: ObjectNode?,\n) : CoreRustSettings(\n        service,\n        moduleName,\n        moduleVersion,\n        moduleAuthors,\n        moduleDescription,\n        moduleRepository,\n        runtimeConfig,\n        codegenConfig,\n        license,\n        examplesUri,\n        minimumSupportedRustVersion,\n        customizationConfig,\n    ) {\n    companion object {\n        fun from(\n            model: Model,\n            config: ObjectNode,\n        ): ClientRustSettings {\n            val coreRustSettings = CoreRustSettings.from(model, config)\n            val codegenSettingsNode = config.getObjectMember(CODEGEN_SETTINGS)\n            val coreCodegenConfig = CoreCodegenConfig.fromNode(codegenSettingsNode)\n            return ClientRustSettings(\n                service = coreRustSettings.service,\n                moduleName = coreRustSettings.moduleName,\n                moduleVersion = coreRustSettings.moduleVersion,\n                moduleAuthors = coreRustSettings.moduleAuthors,\n                moduleDescription = coreRustSettings.moduleDescription,\n                moduleRepository = coreRustSettings.moduleRepository,\n                runtimeConfig = coreRustSettings.runtimeConfig,\n                codegenConfig = ClientCodegenConfig.fromCodegenConfigAndNode(coreCodegenConfig, codegenSettingsNode),\n                license = coreRustSettings.license,\n                examplesUri = coreRustSettings.examplesUri,\n                minimumSupportedRustVersion = coreRustSettings.minimumSupportedRustVersion,\n                customizationConfig = coreRustSettings.customizationConfig,\n            )\n        }\n    }\n}\n\n/**\n * [renameExceptions]: Rename `Exception` to `Error` in the generated SDK\n * [includeFluentClient]: Generate a `client` module in the generated SDK (currently the AWS SDK sets this to `false`\n *   and generates its own client)\n * [addMessageToErrors]: Adds a `message` field automatically to all error shapes\n */\ndata class ClientCodegenConfig(\n    override val formatTimeoutSeconds: Int = DEFAULT_FORMAT_TIMEOUT_SECONDS,\n    override val debugMode: Boolean = DEFAULT_DEBUG_MODE,\n    override val flattenCollectionAccessors: Boolean = DEFAULT_FLATTEN_ACCESSORS,\n    val nullabilityCheckMode: NullableIndex.CheckMode = NullableIndex.CheckMode.CLIENT,\n    val renameExceptions: Boolean = DEFAULT_RENAME_EXCEPTIONS,\n    val includeFluentClient: Boolean = DEFAULT_INCLUDE_FLUENT_CLIENT,\n    val addMessageToErrors: Boolean = DEFAULT_ADD_MESSAGE_TO_ERRORS,\n    /** If true, adds `endpoint_url`/`set_endpoint_url` methods to the service config */\n    val includeEndpointUrlConfig: Boolean = DEFAULT_INCLUDE_ENDPOINT_URL_CONFIG,\n    val enableUserConfigurableRuntimePlugins: Boolean = DEFAULT_ENABLE_USER_CONFIGURABLE_RUNTIME_PLUGINS,\n) : CoreCodegenConfig(\n        formatTimeoutSeconds, debugMode, DEFAULT_FLATTEN_ACCESSORS,\n    ) {\n    companion object {\n        private const val DEFAULT_RENAME_EXCEPTIONS = true\n        private const val DEFAULT_INCLUDE_FLUENT_CLIENT = true\n        private const val DEFAULT_ADD_MESSAGE_TO_ERRORS = true\n        private const val DEFAULT_INCLUDE_ENDPOINT_URL_CONFIG = true\n        private const val DEFAULT_ENABLE_USER_CONFIGURABLE_RUNTIME_PLUGINS = true\n        private const val DEFAULT_NULLABILITY_CHECK_MODE = \"CLIENT\"\n\n        // Note: only clients default to true, servers default to false\n        private const val DEFAULT_FLATTEN_ACCESSORS = true\n\n        fun fromCodegenConfigAndNode(\n            coreCodegenConfig: CoreCodegenConfig,\n            node: Optional<ObjectNode>,\n        ) = if (node.isPresent) {\n            ClientCodegenConfig(\n                formatTimeoutSeconds = coreCodegenConfig.formatTimeoutSeconds,\n                flattenCollectionAccessors =\n                    node.get()\n                        .getBooleanMemberOrDefault(\"flattenCollectionAccessors\", DEFAULT_FLATTEN_ACCESSORS),\n                debugMode = coreCodegenConfig.debugMode,\n                renameExceptions = node.get().getBooleanMemberOrDefault(\"renameErrors\", DEFAULT_RENAME_EXCEPTIONS),\n                includeFluentClient =\n                    node.get()\n                        .getBooleanMemberOrDefault(\"includeFluentClient\", DEFAULT_INCLUDE_FLUENT_CLIENT),\n                addMessageToErrors =\n                    node.get()\n                        .getBooleanMemberOrDefault(\"addMessageToErrors\", DEFAULT_ADD_MESSAGE_TO_ERRORS),\n                includeEndpointUrlConfig =\n                    node.get()\n                        .getBooleanMemberOrDefault(\"includeEndpointUrlConfig\", DEFAULT_INCLUDE_ENDPOINT_URL_CONFIG),\n                enableUserConfigurableRuntimePlugins =\n                    node.get().getBooleanMemberOrDefault(\n                        \"enableUserConfigurableRuntimePlugins\",\n                        DEFAULT_ENABLE_USER_CONFIGURABLE_RUNTIME_PLUGINS,\n                    ),\n                nullabilityCheckMode =\n                    NullableIndex.CheckMode.valueOf(\n                        node.get().getStringMemberOrDefault(\"nullabilityCheckMode\", DEFAULT_NULLABILITY_CHECK_MODE),\n                    ),\n            )\n        } else {\n            ClientCodegenConfig(\n                formatTimeoutSeconds = coreCodegenConfig.formatTimeoutSeconds,\n                debugMode = coreCodegenConfig.debugMode,\n                nullabilityCheckMode = NullableIndex.CheckMode.valueOf(DEFAULT_NULLABILITY_CHECK_MODE),\n            )\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/RustClientCodegenPlugin.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy\n\nimport software.amazon.smithy.build.PluginContext\nimport software.amazon.smithy.codegen.core.ReservedWordSymbolProvider\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.ServiceShape\nimport software.amazon.smithy.rust.codegen.client.smithy.auth.AuthDecorator\nimport software.amazon.smithy.rust.codegen.client.smithy.customizations.ClientCustomizations\nimport software.amazon.smithy.rust.codegen.client.smithy.customizations.HttpAuthDecorator\nimport software.amazon.smithy.rust.codegen.client.smithy.customizations.HttpConnectorConfigDecorator\nimport software.amazon.smithy.rust.codegen.client.smithy.customizations.IdempotencyTokenDecorator\nimport software.amazon.smithy.rust.codegen.client.smithy.customizations.NoAuthDecorator\nimport software.amazon.smithy.rust.codegen.client.smithy.customizations.SensitiveOutputDecorator\nimport software.amazon.smithy.rust.codegen.client.smithy.customizations.StaticSdkFeatureTrackerDecorator\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.CombinedClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.RequiredCustomizations\nimport software.amazon.smithy.rust.codegen.client.smithy.endpoint.EndpointParamsDecorator\nimport software.amazon.smithy.rust.codegen.client.smithy.endpoint.EndpointsDecorator\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.client.FluentClientDecorator\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.config.StalledStreamProtectionDecorator\nimport software.amazon.smithy.rust.codegen.client.testutil.ClientDecoratableBuildPlugin\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute.Companion.NonExhaustive\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustReservedWordSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.BaseSymbolMetadataProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenTarget\nimport software.amazon.smithy.rust.codegen.core.smithy.EventStreamSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProviderConfig\nimport software.amazon.smithy.rust.codegen.core.smithy.StreamingShapeMetadataProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.StreamingShapeSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.SymbolVisitor\nimport java.util.logging.Level\nimport java.util.logging.Logger\n\n/**\n * Rust Client Codegen Plugin\n *\n * This is the entrypoint for code generation, triggered by the smithy-build plugin.\n * `resources/META-INF.services/software.amazon.smithy.build.SmithyBuildPlugin` refers to this class by name which\n * enables the smithy-build plugin to invoke `execute` with all Smithy plugin context + models.\n */\nclass RustClientCodegenPlugin : ClientDecoratableBuildPlugin() {\n    override fun getName(): String = \"rust-client-codegen\"\n\n    override fun executeWithDecorator(\n        context: PluginContext,\n        vararg decorator: ClientCodegenDecorator,\n    ) {\n        // Suppress extremely noisy logs about reserved words\n        Logger.getLogger(ReservedWordSymbolProvider::class.java.name).level = Level.OFF\n        // Discover `RustCodegenDecorators` on the classpath. `RustCodegenDecorator` returns different types of\n        // customizations. A customization is a function of:\n        // - location (e.g. the mutate section of an operation)\n        // - context (e.g. the of the operation)\n        // - writer: The active RustWriter at the given location\n        val codegenDecorator =\n            CombinedClientCodegenDecorator.fromClasspath(\n                context,\n                ClientCustomizations(),\n                RequiredCustomizations(),\n                FluentClientDecorator(),\n                EndpointsDecorator(),\n                EndpointParamsDecorator(),\n                AuthDecorator(),\n                NoAuthDecorator(),\n                HttpAuthDecorator(),\n                HttpConnectorConfigDecorator(),\n                SensitiveOutputDecorator(),\n                IdempotencyTokenDecorator(),\n                StalledStreamProtectionDecorator(),\n                StaticSdkFeatureTrackerDecorator(),\n                *decorator,\n            )\n\n        // ClientCodegenVisitor is the main driver of code generation that traverses the model and generates code\n        ClientCodegenVisitor(context, codegenDecorator).execute()\n    }\n\n    companion object {\n        /**\n         * When generating code, smithy types need to be converted into Rust types—that is the core role of the symbol provider\n         *\n         * The Symbol provider is composed of a base [SymbolVisitor] which handles the core functionality, then is layered\n         * with other symbol providers, documented inline, to handle the full scope of Smithy types.\n         */\n        fun baseSymbolProvider(\n            settings: ClientRustSettings,\n            model: Model,\n            serviceShape: ServiceShape,\n            rustSymbolProviderConfig: RustSymbolProviderConfig,\n            codegenDecorator: ClientCodegenDecorator,\n        ) = SymbolVisitor(settings, model, serviceShape = serviceShape, config = rustSymbolProviderConfig)\n            // Generate different types for EventStream shapes (e.g. transcribe streaming)\n            .let { EventStreamSymbolProvider(rustSymbolProviderConfig.runtimeConfig, it, CodegenTarget.CLIENT) }\n            // Generate `ByteStream` instead of `Blob` for streaming binary shapes (e.g. S3 GetObject)\n            .let { StreamingShapeSymbolProvider(it) }\n            // Add Rust attributes (like `#[derive(PartialEq)]`) to generated shapes\n            .let { BaseSymbolMetadataProvider(it, additionalAttributes = listOf(NonExhaustive)) }\n            // Streaming shapes need different derives (e.g. they cannot derive `PartialEq`)\n            .let { StreamingShapeMetadataProvider(it) }\n            // Rename shapes that clash with Rust reserved words & and other SDK specific features e.g. `send()` cannot\n            // be the name of an operation input\n            .let { RustReservedWordSymbolProvider(it, ClientReservedWords) }\n            // Allows decorators to inject a custom symbol provider\n            .let { codegenDecorator.symbolProvider(it) }\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/auth/AuthDecorator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.auth\n\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginSection\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.config.ServiceConfig\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.NamedCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.Section\n\n/**\n * An interface that provides information relevant to `AuthSchemeOption` during code generation\n *\n * * The shape ID of auth scheme ID\n * * A method that renders itself as a type `AuthSchemeOption` in Rust\n */\ninterface AuthSchemeOption {\n    val authSchemeId: ShapeId\n\n    fun render(\n        codegenContext: ClientCodegenContext,\n        operation: OperationShape? = null,\n    ): Writable\n}\n\n/**\n * Auth-related code generation customization sections\n */\nsealed class AuthSection(name: String) : Section(name) {\n    /**\n     * Hook to add additional logic within the implementation of the\n     * `crate::config::auth::ResolveAuthScheme::resolve_auth_scheme` method for the default auth scheme resolver\n     */\n    data object DefaultResolverAdditionalImpl : AuthSection(\"DefaultResolverAdditionalImpl\")\n}\n\ntypealias AuthCustomization = NamedCustomization<AuthSection>\n\n/**\n * Codegen decorator that:\n * * Injects service-specific default auth scheme resolver\n * * Adds setters to the service config builder for configuring the auth scheme and auth scheme resolver\n * * Adds getters to the service config for retrieving the currently configured auth scheme and auth scheme resolver\n */\nclass AuthDecorator : ClientCodegenDecorator {\n    override val name: String = \"Auth\"\n    override val order: Byte = ORDER\n\n    companion object {\n        const val ORDER: Byte = 0\n    }\n\n    override fun configCustomizations(\n        codegenContext: ClientCodegenContext,\n        baseCustomizations: List<ConfigCustomization>,\n    ): List<ConfigCustomization> =\n        baseCustomizations + AuthDecoratorConfigCustomizations(codegenContext) + AuthSchemePreferenceConfigCustomization(codegenContext)\n\n    override fun serviceRuntimePluginCustomizations(\n        codegenContext: ClientCodegenContext,\n        baseCustomizations: List<ServiceRuntimePluginCustomization>,\n    ): List<ServiceRuntimePluginCustomization> {\n        return baseCustomizations +\n            object : ServiceRuntimePluginCustomization() {\n                override fun section(section: ServiceRuntimePluginSection): Writable {\n                    return when (section) {\n                        is ServiceRuntimePluginSection.RegisterRuntimeComponents ->\n                            writable {\n                                section.registerAuthSchemeOptionResolver(\n                                    this,\n                                    defaultAuthSchemeResolver(codegenContext),\n                                )\n                            }\n\n                        else -> emptySection\n                    }\n                }\n            }\n    }\n}\n\n// Returns default auth scheme resolver for this service\nprivate fun defaultAuthSchemeResolver(codegenContext: ClientCodegenContext): Writable {\n    val generator = AuthTypesGenerator(codegenContext)\n    return writable {\n        rustTemplate(\n            \"\"\"{\n            use #{ServiceSpecificResolver};\n            #{DefaultResolver}::default().into_shared_resolver()\n            }\"\"\",\n            \"DefaultResolver\" to generator.defaultAuthSchemeResolver(),\n            \"ServiceSpecificResolver\" to generator.serviceSpecificResolveAuthSchemeTrait(),\n        )\n    }\n}\n\nprivate class AuthDecoratorConfigCustomizations(private val codegenContext: ClientCodegenContext) :\n    ConfigCustomization() {\n    val codegenScope =\n        arrayOf(\n            *preludeScope,\n            \"AuthScheme\" to RuntimeType.smithyRuntimeApiClient(codegenContext.runtimeConfig).resolve(\"client::auth::AuthScheme\"),\n            \"NoAuthRuntimePluginV2\" to\n                RuntimeType.smithyRuntime(codegenContext.runtimeConfig).resolve(\"client::auth::no_auth::NoAuthRuntimePluginV2\"),\n            \"ResolveAuthSchemeOptions\" to AuthTypesGenerator(codegenContext).serviceSpecificResolveAuthSchemeTrait(),\n            \"SharedAuthScheme\" to RuntimeType.smithyRuntimeApiClient(codegenContext.runtimeConfig).resolve(\"client::auth::SharedAuthScheme\"),\n            \"SharedAuthSchemeOptionResolver\" to RuntimeType.smithyRuntimeApiClient(codegenContext.runtimeConfig).resolve(\"client::auth::SharedAuthSchemeOptionResolver\"),\n        )\n\n    override fun section(section: ServiceConfig) =\n        writable {\n            val moduleUseName = codegenContext.moduleUseName()\n            when (section) {\n                is ServiceConfig.BuilderImpl -> {\n                    rustTemplate(\n                        \"\"\"\n                        /// Adds an auth scheme to the builder\n                        ///\n                        /// If `auth_scheme` has an existing [AuthSchemeId](aws_smithy_runtime_api::client::auth::AuthSchemeId) in the runtime, the current identity\n                        /// resolver and signer for that scheme will be replaced by those from `auth_scheme`.\n                        ///\n                        /// _Important:_ When introducing a custom auth scheme, ensure you override either\n                        /// [`Self::auth_scheme_resolver`] or [`Self::set_auth_scheme_resolver`]\n                        /// so that the custom auth scheme is included in the list of resolved auth scheme options.\n                        /// [The default auth scheme resolver](crate::config::auth::DefaultAuthSchemeResolver) will not recognize your custom auth scheme.\n                        ///\n                        /// ## Examples\n                        /// ```no_run\n                        /// ## use aws_smithy_runtime_api::{\n                        /// ##     box_error::BoxError,\n                        /// ##     client::{\n                        /// ##         auth::{\n                        /// ##             AuthScheme, AuthSchemeEndpointConfig, AuthSchemeId, AuthSchemeOption,\n                        /// ##             AuthSchemeOptionsFuture, Sign,\n                        /// ##         },\n                        /// ##         identity::{Identity, IdentityFuture, ResolveIdentity, SharedIdentityResolver},\n                        /// ##         orchestrator::HttpRequest,\n                        /// ##         runtime_components::{GetIdentityResolver, RuntimeComponents},\n                        /// ##   },\n                        /// ##   shared::IntoShared,\n                        /// ## };\n                        /// ## use aws_smithy_types::config_bag::ConfigBag;\n                        /// // Auth scheme with customer identity resolver and signer\n                        /// ##[derive(Debug)]\n                        /// struct CustomAuthScheme {\n                        ///     id: AuthSchemeId,\n                        ///     identity_resolver: SharedIdentityResolver,\n                        ///     signer: CustomSigner,\n                        /// }\n                        /// impl Default for CustomAuthScheme {\n                        ///     fn default() -> Self {\n                        ///         Self {\n                        ///             id: AuthSchemeId::new(\"custom\"),\n                        ///             identity_resolver: CustomIdentityResolver.into_shared(),\n                        ///             signer: CustomSigner,\n                        ///         }\n                        ///     }\n                        /// }\n                        /// impl AuthScheme for CustomAuthScheme {\n                        ///     fn scheme_id(&self) -> AuthSchemeId {\n                        ///         self.id.clone()\n                        ///     }\n                        ///     fn identity_resolver(\n                        ///         &self,\n                        ///         _identity_resolvers: &dyn GetIdentityResolver,\n                        ///     ) -> Option<SharedIdentityResolver> {\n                        ///         Some(self.identity_resolver.clone())\n                        ///     }\n                        ///     fn signer(&self) -> &dyn Sign {\n                        ///         &self.signer\n                        ///     }\n                        /// }\n                        ///\n                        /// ##[derive(Debug, Default)]\n                        /// struct CustomSigner;\n                        /// impl Sign for CustomSigner {\n                        ///     fn sign_http_request(\n                        ///         &self,\n                        ///         _request: &mut HttpRequest,\n                        ///         _identity: &Identity,\n                        ///         _auth_scheme_endpoint_config: AuthSchemeEndpointConfig<'_>,\n                        ///         _runtime_components: &RuntimeComponents,\n                        ///         _config_bag: &ConfigBag,\n                        ///     ) -> Result<(), BoxError> {\n                        ///         // --snip--\n                        /// ##      todo!()\n                        ///     }\n                        /// }\n                        ///\n                        /// ##[derive(Debug)]\n                        /// struct CustomIdentityResolver;\n                        /// impl ResolveIdentity for CustomIdentityResolver {\n                        ///     fn resolve_identity<'a>(\n                        ///         &'a self,\n                        ///         _runtime_components: &'a RuntimeComponents,\n                        ///         _config_bag: &'a ConfigBag,\n                        ///     ) -> IdentityFuture<'a> {\n                        ///         // --snip--\n                        /// ##      todo!()\n                        ///     }\n                        /// }\n                        ///\n                        /// // Auth scheme resolver that favors `CustomAuthScheme`\n                        /// ##[derive(Debug)]\n                        /// struct CustomAuthSchemeResolver;\n                        /// impl $moduleUseName::config::auth::ResolveAuthScheme for CustomAuthSchemeResolver {\n                        ///     fn resolve_auth_scheme<'a>(\n                        ///         &'a self,\n                        ///         _params: &'a $moduleUseName::config::auth::Params,\n                        ///         _cfg: &'a ConfigBag,\n                        ///         _runtime_components: &'a RuntimeComponents,\n                        ///     ) -> AuthSchemeOptionsFuture<'a> {\n                        ///         AuthSchemeOptionsFuture::ready(Ok(vec![AuthSchemeOption::from(AuthSchemeId::new(\n                        ///             \"custom\",\n                        ///         ))]))\n                        ///     }\n                        /// }\n                        ///\n                        /// let config = $moduleUseName::Config::builder()\n                        ///     .push_auth_scheme(CustomAuthScheme::default())\n                        ///     .auth_scheme_resolver(CustomAuthSchemeResolver)\n                        ///     // other configurations\n                        ///     .build();\n                        /// ```\n                        pub fn push_auth_scheme(mut self, auth_scheme: impl #{AuthScheme} + 'static) -> Self {\n                            self.runtime_components.push_auth_scheme(auth_scheme);\n                            self\n                        }\n\n                        /// Set the auth scheme resolver for the builder\n                        ///\n                        /// ## Examples\n                        /// ```no_run\n                        /// ## use aws_smithy_runtime_api::{\n                        /// ##     client::{\n                        /// ##         auth::AuthSchemeOptionsFuture,\n                        /// ##         runtime_components::RuntimeComponents,\n                        /// ##   },\n                        /// ## };\n                        /// ## use aws_smithy_types::config_bag::ConfigBag;\n                        /// ##[derive(Debug)]\n                        /// struct CustomAuthSchemeResolver;\n                        /// impl $moduleUseName::config::auth::ResolveAuthScheme for CustomAuthSchemeResolver {\n                        ///     fn resolve_auth_scheme<'a>(\n                        ///         &'a self,\n                        ///         _params: &'a $moduleUseName::config::auth::Params,\n                        ///         _cfg: &'a ConfigBag,\n                        ///         _runtime_components: &'a RuntimeComponents,\n                        ///     ) -> AuthSchemeOptionsFuture<'a> {\n                        ///         // --snip--\n                        /// ##      todo!()\n                        ///     }\n                        /// }\n                        ///\n                        /// let config = $moduleUseName::Config::builder()\n                        ///     .auth_scheme_resolver(CustomAuthSchemeResolver)\n                        ///     // other configurations\n                        ///     .build();\n                        /// ```\n                        pub fn auth_scheme_resolver(mut self, auth_scheme_resolver: impl #{ResolveAuthSchemeOptions} + 'static) -> Self {\n                            self.set_auth_scheme_resolver(auth_scheme_resolver);\n                            self\n                        }\n\n                        /// Set the auth scheme resolver for the builder\n                        ///\n                        /// ## Examples\n                        /// See an example for [`Self::auth_scheme_resolver`].\n                        pub fn set_auth_scheme_resolver(&mut self, auth_scheme_resolver: impl #{ResolveAuthSchemeOptions} + 'static) -> &mut Self {\n                            self.runtime_components.set_auth_scheme_option_resolver(#{Some}(auth_scheme_resolver.into_shared_resolver()));\n                            self\n                        }\n\n                        /// Enable no authentication regardless of what authentication mechanisms operations support\n                        ///\n                        /// This adds [NoAuthScheme](aws_smithy_runtime::client::auth::no_auth::NoAuthScheme) as a fallback\n                        /// and the auth scheme resolver will use it when no other auth schemes are applicable.\n                        pub fn allow_no_auth(mut self) -> Self {\n                            self.set_allow_no_auth();\n                            self\n                        }\n\n                        /// Enable no authentication regardless of what authentication mechanisms operations support\n                        ///\n                        /// This adds [NoAuthScheme](aws_smithy_runtime::client::auth::no_auth::NoAuthScheme) as a fallback\n                        /// and the auth scheme resolver will use it when no other auth schemes are applicable.\n                        pub fn set_allow_no_auth(&mut self) -> &mut Self {\n                            self.push_runtime_plugin(#{NoAuthRuntimePluginV2}::new().into_shared());\n                            self\n                        }\n                        \"\"\",\n                        *codegenScope,\n                    )\n                }\n\n                is ServiceConfig.ConfigImpl -> {\n                    rustTemplate(\n                        \"\"\"\n                        /// Return the auth schemes configured on this service config\n                        pub fn auth_schemes(&self) -> impl Iterator<Item = #{SharedAuthScheme}> + '_ {\n                            self.runtime_components.auth_schemes()\n                        }\n\n                        /// Return the auth scheme resolver configured on this service config\n                        pub fn auth_scheme_resolver(&self) -> #{Option}<#{SharedAuthSchemeOptionResolver}> {\n                            self.runtime_components.auth_scheme_option_resolver()\n                        }\n                        \"\"\",\n                        *codegenScope,\n                    )\n                }\n\n                else -> emptySection\n            }\n        }\n}\n\nprivate class AuthSchemePreferenceConfigCustomization(codegenContext: ClientCodegenContext) : ConfigCustomization() {\n    private val codegenScope =\n        arrayOf(\n            *preludeScope,\n            \"AuthSchemePreference\" to\n                RuntimeType.smithyRuntimeApiClient(codegenContext.runtimeConfig)\n                    .resolve(\"client::auth::AuthSchemePreference\"),\n        )\n    private val moduleUseName = codegenContext.moduleUseName()\n\n    override fun section(section: ServiceConfig) =\n        writable {\n            when (section) {\n                is ServiceConfig.ConfigImpl -> {\n                    rustTemplate(\n                        \"\"\"\n                        /// Returns the configured auth scheme preference\n                        pub fn auth_scheme_preference(&self) -> #{Option}<&#{AuthSchemePreference}> {\n                            self.config.load::<#{AuthSchemePreference}>()\n                        }\n                        \"\"\",\n                        *codegenScope,\n                    )\n                }\n\n                is ServiceConfig.BuilderImpl -> {\n                    val docs = \"\"\"\n                        /// Set the auth scheme preference for an auth scheme resolver\n                        /// (typically the default auth scheme resolver).\n                        ///\n                        /// Each operation has a predefined order of auth schemes, as determined by the service,\n                        /// for auth scheme resolution. By using the auth scheme preference, customers\n                        /// can reorder the schemes resolved by the auth scheme resolver.\n                        ///\n                        /// The preference list is intended as a hint rather than a strict override.\n                        /// Any schemes not present in the originally resolved auth schemes will be ignored.\n                        ///\n                        /// ## Examples\n                        ///\n                        /// ```no_run\n                        /// ## use aws_smithy_runtime_api::client::auth::AuthSchemeId;\n                        /// let config = $moduleUseName::Config::builder()\n                        ///     .auth_scheme_preference([AuthSchemeId::from(\"scheme1\"), AuthSchemeId::from(\"scheme2\")])\n                        ///     // ...\n                        ///     .build();\n                        /// let client = $moduleUseName::Client::from_conf(config);\n                        /// ```\n                    \"\"\"\n                    rustTemplate(\n                        \"\"\"\n                        $docs\n                        pub fn auth_scheme_preference(mut self, preference: impl #{Into}<#{AuthSchemePreference}>) -> Self {\n                            self.set_auth_scheme_preference(#{Some}(preference.into()));\n                            self\n                        }\n\n                        $docs\n                        pub fn set_auth_scheme_preference(&mut self, preference: #{Option}<#{AuthSchemePreference}>) -> &mut Self {\n                            self.config.store_or_unset(preference);\n                            self\n                        }\n                        \"\"\",\n                        *codegenScope,\n                    )\n                }\n\n                is ServiceConfig.BuilderFromConfigBag ->\n                    rustTemplate(\n                        \"${section.builder}.set_auth_scheme_preference(${section.configBag}.load::<#{AuthSchemePreference}>().cloned());\",\n                        *codegenScope,\n                    )\n\n                else -> emptySection\n            }\n        }\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/auth/AuthIndex.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.auth\n\nimport software.amazon.smithy.model.knowledge.ServiceIndex\nimport software.amazon.smithy.model.knowledge.TopDownIndex\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.model.traits.AuthTrait\nimport software.amazon.smithy.model.traits.OptionalAuthTrait\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.customizations.NoAuthSchemeOption\nimport software.amazon.smithy.rust.codegen.client.smithy.customizations.SyntheticNoAuthTrait\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\nimport software.amazon.smithy.rust.codegen.core.util.letIf\n\n/**\n * Knowledge index for dealing with authentication traits and AuthSchemeOptions\n *\n * This class is a port of the Kotlin SDK counterpart:\n * https://github.com/smithy-lang/smithy-kotlin/blob/main/codegen/smithy-kotlin-codegen/src/main/kotlin/software/amazon/smithy/kotlin/codegen/model/knowledge/AuthIndex.kt\n */\nclass AuthIndex(private val ctx: ClientCodegenContext) {\n    /**\n     * Get the Map of [AuthSchemeOption]'s registered. The returned map is de-duplicated by\n     * scheme ID with the last integration taking precedence. This map is not yet reconciled with the\n     * auth schemes used by the model.\n     */\n    fun authOptions(): Map<ShapeId, AuthSchemeOption> =\n        ctx.rootDecorator.authSchemeOptions(ctx, emptyList())\n            .associateBy {\n                it.authSchemeId\n            }\n\n    /**\n     * Get the prioritized list of effective [AuthSchemeOption] for a service.\n     */\n    fun effectiveAuthOptionsForService(): List<AuthSchemeOption> {\n        val serviceIndex = ServiceIndex.of(ctx.model)\n        val allAuthOptions = authOptions()\n\n        val effectiveAuthScheme = serviceIndex.getEffectiveAuthSchemes(ctx.serviceShape, ServiceIndex.AuthSchemeMode.NO_AUTH_AWARE)\n        return effectiveAuthScheme\n            .mapNotNull {\n                allAuthOptions[it.key]\n            }.letIf(ctx.serviceShape.hasTrait<SyntheticNoAuthTrait>()) {\n                // Supports a workaround `AddSyntheticNoAuth` in S3's model transformer.\n                // See the comment in the `SyntheticNoAuthTrait` class for more context.\n                it + listOf(NoAuthSchemeOption())\n            }\n    }\n\n    /**\n     * Get the prioritized list of effective [AuthSchemeOption]s for an operation.\n     */\n    fun effectiveAuthOptionsForOperation(op: OperationShape): List<AuthSchemeOption> {\n        val serviceIndex = ServiceIndex.of(ctx.model)\n        val allAuthOptions = authOptions()\n\n        return serviceIndex.getEffectiveAuthSchemes(ctx.serviceShape, op, ServiceIndex.AuthSchemeMode.NO_AUTH_AWARE)\n            .mapNotNull {\n                allAuthOptions[it.key]\n            }\n    }\n\n    /**\n     * Get the set of operations that need overridden in the generated auth scheme resolver.\n     */\n    fun operationsWithOverrides(): Set<OperationShape> =\n        TopDownIndex.of(ctx.model)\n            .getContainedOperations(ctx.serviceShape)\n            .filter { op ->\n                op.hasTrait<AuthTrait>() || op.hasTrait<OptionalAuthTrait>()\n            }.toSet()\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/auth/AuthSchemeParamsGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.auth\n\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute.Companion.derive\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.docs\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlockTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\n\n/**\n * Generate types for a service-specific auth scheme parameters\n */\nclass AuthSchemeParamsGenerator(codegenContext: ClientCodegenContext) {\n    private val codegenScope =\n        arrayOf(\n            *preludeScope,\n            \"AuthSchemeOption\" to\n                RuntimeType.smithyRuntimeApiClient(codegenContext.runtimeConfig)\n                    .resolve(\"client::auth::AuthSchemeOption\"),\n            \"Cow\" to RuntimeType.Cow,\n            \"Params\" to paramsStruct(),\n        )\n\n    /**\n     * Return [RuntimeType] for a service-specific auth scheme params struct\n     */\n    fun paramsStruct(): RuntimeType =\n        RuntimeType.forInlineFun(\"Params\", ClientRustModule.Config.auth) {\n            generateAuthSchemeParamsStruct()\n        }\n\n    private fun paramsBuilder(): RuntimeType =\n        RuntimeType.forInlineFun(\"ParamsBuilder\", ClientRustModule.Config.auth) {\n            generateAuthSchemeParamsBuilder()\n        }\n\n    private fun paramsBuildError(): RuntimeType =\n        RuntimeType.forInlineFun(\"BuildError\", ClientRustModule.Config.auth) {\n            rustTemplate(\n                \"\"\"\n                /// An error that occurred while constructing `config::auth::Params`\n                ##[derive(Debug)]\n                pub struct BuildError {\n                    field: #{Cow}<'static, str>\n                }\n\n                impl BuildError {\n                    fn missing(field: &'static str) -> Self {\n                        Self { field: field.into() }\n                    }\n                }\n\n                impl std::fmt::Display for BuildError {\n                    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n                        write!(f, \"a required field was missing: `{}`\", self.field)\n                    }\n                }\n\n                impl std::error::Error for BuildError { }\n                \"\"\",\n                *codegenScope,\n            )\n        }\n\n    private fun RustWriter.generateAuthSchemeParamsStruct() {\n        docs(\"Configuration parameters for resolving the correct auth scheme\")\n        Attribute(derive(RuntimeType.Debug, RuntimeType.PartialEq, RuntimeType.Clone)).render(this)\n        rustBlock(\"pub struct Params\") {\n            rustTemplate(\"operation_name: #{Cow}<'static, str>\", *codegenScope)\n        }\n\n        rustBlock(\"impl Params\") {\n            rustTemplate(\n                \"\"\"\n                /// Create a builder for [`Params`]\n                pub fn builder() -> #{ParamsBuilder} {\n                    #{ParamsBuilder}::default()\n                }\n\n                /// Return the operation name for [`Params`]\n                pub fn operation_name(&self) -> &str {\n                    self.operation_name.as_ref()\n                }\n                \"\"\",\n                \"ParamsBuilder\" to paramsBuilder(),\n            )\n        }\n    }\n\n    private fun RustWriter.generateAuthSchemeParamsBuilder() {\n        Attribute(derive(RuntimeType.Clone, RuntimeType.Debug, RuntimeType.Default, RuntimeType.PartialEq)).render(this)\n        docs(\"Builder for [`Params`]\")\n        rustBlock(\"pub struct ParamsBuilder\") {\n            rustTemplate(\n                \"\"\"\n                operation_name: #{Option}<#{Cow}<'static, str>>,\n                \"\"\",\n                *codegenScope,\n            )\n        }\n\n        rustBlock(\"impl ParamsBuilder\") {\n            rustTemplate(\n                \"\"\"\n                /// Set the operation name for the builder\n                pub fn operation_name(self, operation_name: impl Into<#{Cow}<'static, str>>) -> Self {\n                    self.set_operation_name(#{Some}(operation_name.into()))\n                }\n\n                /// Set the operation name for the builder\n                pub fn set_operation_name(mut self, operation_name: #{Option}<#{Cow}<'static, str>>) -> Self {\n                    self.operation_name = operation_name;\n                    self\n                }\n                \"\"\",\n                *codegenScope,\n            )\n            docs(\n                \"\"\"Consume this builder, create [`Params`].\"\n\n                Return [`BuildError`] if any of the required fields are unset.\n                \"\"\",\n            )\n            rustBlockTemplate(\n                \"pub fn build(self) -> #{Result}<#{Params}, #{BuildError}>\",\n                *preludeScope,\n                \"Params\" to paramsStruct(),\n                \"BuildError\" to paramsBuildError(),\n            ) {\n                rustTemplate(\n                    \"\"\"\n                    #{Ok}(#{Params} {\n                        operation_name: self.operation_name\n                            .ok_or_else(||BuildError::missing(\"operation_name\"))?\n                    })\n                    \"\"\",\n                    *codegenScope,\n                )\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/auth/AuthSchemeResolverGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.auth\n\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule\nimport software.amazon.smithy.rust.codegen.core.rustlang.join\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.withBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.writeCustomizations\nimport software.amazon.smithy.rust.codegen.core.util.dq\nimport software.amazon.smithy.rust.codegen.core.util.serviceNameOrDefault\n\n/**\n * Generate a service-specific auth scheme resolver struct and a service-specific trait for auth scheme resolution.\n * ```rust\n * pub struct DefaultAuthSchemeResolver {\n *     service_defaults: Vec<AuthSchemeOption>,\n *     operation_overrides: HashMap<&'static str, Vec<AuthSchemeOption>>,\n * }\n *\n * impl crate::config::auth::ResolveEndpoint for DefaultAuthSchemeResolver {\n *      fn resolve_auth_scheme<'a>(\n *          &'a self,\n *          params: &'a crate::config::auth::Params,\n *          cfg: &'a ConfigBag,\n *          runtime_components: &'a RuntimeComponents,\n *      ) -> AuthSchemeOptionsFuture<'a> {\n *          // --snip--\n *      }\n * }\n * ```\n */\nclass AuthSchemeResolverGenerator(\n    private val codegenContext: ClientCodegenContext,\n    private val customizations: List<AuthCustomization>,\n) {\n    private val authIndex = AuthIndex(codegenContext)\n    private val runtimeConfig = codegenContext.runtimeConfig\n    private val authSchemeParamsGenerator = AuthSchemeParamsGenerator(codegenContext)\n    private val codegenScope =\n        arrayOf(\n            *preludeScope,\n            \"AuthSchemeOption\" to\n                RuntimeType.smithyRuntimeApiClient(codegenContext.runtimeConfig)\n                    .resolve(\"client::auth::AuthSchemeOption\"),\n            \"AuthSchemeOptionResolverParams\" to RuntimeType.smithyRuntimeApiClient(codegenContext.runtimeConfig).resolve(\"client::auth::AuthSchemeOptionResolverParams\"),\n            \"AuthSchemeOptionsFuture\" to RuntimeType.smithyRuntimeApiClient(runtimeConfig).resolve(\"client::auth::AuthSchemeOptionsFuture\"),\n            \"BoxError\" to RuntimeType.boxError(runtimeConfig),\n            \"ConfigBag\" to RuntimeType.configBag(codegenContext.runtimeConfig),\n            \"Debug\" to RuntimeType.Debug,\n            \"HashMap\" to RuntimeType.HashMap,\n            \"Params\" to authSchemeParamsGenerator.paramsStruct(),\n            \"ResolveAuthSchemeOptions\" to RuntimeType.smithyRuntimeApiClient(runtimeConfig).resolve(\"client::auth::ResolveAuthSchemeOptions\"),\n            \"RuntimeComponents\" to RuntimeType.runtimeComponents(runtimeConfig),\n            \"ServiceSpecificResolveAuthScheme\" to serviceSpecificResolveAuthSchemeTrait(),\n            \"SharedAuthSchemeOptionResolver\" to RuntimeType.smithyRuntimeApiClient(runtimeConfig).resolve(\"client::auth::SharedAuthSchemeOptionResolver\"),\n        )\n\n    /**\n     * Return [RuntimeType] for the service-specific default auth scheme resolver\n     */\n    fun defaultAuthSchemeResolver(): RuntimeType {\n        return RuntimeType.forInlineFun(\"DefaultAuthSchemeResolver\", ClientRustModule.Config.auth) {\n            rustTemplate(\n                \"\"\"\n                /// The default auth scheme resolver\n                ##[derive(Debug)]\n                ##[allow(dead_code)]\n                pub struct DefaultAuthSchemeResolver {\n                    service_defaults: Vec<#{AuthSchemeOption}>,\n                    operation_overrides: #{HashMap}<&'static str, Vec<#{AuthSchemeOption}>>,\n                }\n\n                // TODO(https://github.com/smithy-lang/smithy-rs/issues/4177): Remove `allow(...)` once the issue is addressed.\n                // When generating code for tests (e.g., `codegen-client-test`), this manual implementation\n                // of the `Default` trait may appear as if it could be derived automatically.\n                // However, that is not the case in production.\n                ##[allow(clippy::derivable_impls)]\n                impl Default for DefaultAuthSchemeResolver {\n                    fn default() -> Self {\n                        Self {\n                            service_defaults: vec![#{service_defaults:W}],\n                            operation_overrides: #{operation_overrides:W},\n                        }\n                    }\n                }\n\n                impl #{ServiceSpecificResolveAuthScheme} for DefaultAuthSchemeResolver {\n                    fn resolve_auth_scheme<'a>(\n                        &'a self,\n                        params: &'a #{Params},\n                        _cfg: &'a #{ConfigBag},\n                        _runtime_components: &'a #{RuntimeComponents},\n                    ) -> #{AuthSchemeOptionsFuture}<'a> {\n                        let operation_name = params.operation_name();\n\n                        let modeled_auth_options = match self.operation_overrides.get(operation_name) {\n                            Some(overrides) => overrides,\n                            None => &self.service_defaults,\n                        };\n\n                        let _fut = #{AuthSchemeOptionsFuture}::ready(Ok(modeled_auth_options.clone()));\n\n                        #{additional_impl:W}\n\n                        _fut\n                    }\n                }\n                \"\"\",\n                *codegenScope,\n                \"service_defaults\" to\n                    authIndex.effectiveAuthOptionsForService().map {\n                        it.render(codegenContext)\n                    }.join(\", \"),\n                \"operation_overrides\" to renderOperationAuthOptionOverrides(),\n                \"additional_impl\" to\n                    writable {\n                        writeCustomizations(\n                            customizations,\n                            AuthSection.DefaultResolverAdditionalImpl,\n                        )\n                    },\n            )\n        }\n    }\n\n    private fun renderOperationAuthOptionOverrides() =\n        writable {\n            val operationsWithOverrides = authIndex.operationsWithOverrides()\n            if (operationsWithOverrides.isEmpty()) {\n                rustTemplate(\"#{HashMap}::new()\", *codegenScope)\n            } else {\n                withBlock(\"[\", \"]\") {\n                    operationsWithOverrides.forEach { op ->\n                        val operationAuthSchemes =\n                            authIndex.effectiveAuthOptionsForOperation(op)\n                        if (operationAuthSchemes.isNotEmpty()) {\n                            rustTemplate(\n                                \"(${op.id.name.dq()}, vec![#{auth_options:W}])\",\n                                \"auth_options\" to\n                                    operationAuthSchemes.map {\n                                        it.render(codegenContext, op)\n                                    }.join(\", \"),\n                            )\n                            rust(\", \")\n                        }\n                    }\n                }\n                rust(\".into()\")\n            }\n        }\n\n    /**\n     * Return [RuntimeType] representing the per-service trait definition for auth scheme resolution\n     */\n    fun serviceSpecificResolveAuthSchemeTrait(): RuntimeType {\n        return RuntimeType.forInlineFun(\"ResolveAuthScheme\", ClientRustModule.Config.auth) {\n            rustTemplate(\n                \"\"\"\n                /// Auth scheme resolver trait specific to ${codegenContext.serviceShape.serviceNameOrDefault(\"this service\")}\n                pub trait ResolveAuthScheme: #{Send} + #{Sync} + #{Debug} {\n                    /// Resolve a priority list of auth scheme options with the given parameters\n                    fn resolve_auth_scheme<'a>(\n                        &'a self,\n                        params: &'a #{Params},\n                        cfg: &'a #{ConfigBag},\n                        runtime_components: &'a #{RuntimeComponents},\n                    ) -> #{AuthSchemeOptionsFuture}<'a>;\n\n                    /// Convert this service-specific resolver into a `SharedAuthSchemeOptionResolver`\n                    fn into_shared_resolver(self) -> #{SharedAuthSchemeOptionResolver}\n                    where\n                        Self: #{Sized} + 'static,\n                    {\n                        #{SharedAuthSchemeOptionResolver}::new(DowncastParams(self))\n                    }\n                }\n\n                ##[derive(Debug)]\n                struct DowncastParams<T>(T);\n                impl<T> #{ResolveAuthSchemeOptions} for DowncastParams<T>\n                where\n                    T: ResolveAuthScheme,\n                {\n                    fn resolve_auth_scheme_options_v2<'a>(\n                        &'a self,\n                        params: &'a #{AuthSchemeOptionResolverParams},\n                        cfg: &'a #{ConfigBag},\n                        runtime_components: &'a #{RuntimeComponents},\n                    ) -> #{AuthSchemeOptionsFuture}<'a> {\n                        match params.get::<#{Params}>() {\n                            #{Some}(concrete_params) => self.0.resolve_auth_scheme(concrete_params, cfg, runtime_components),\n                            #{None} => #{AuthSchemeOptionsFuture}::ready(#{Err}(\"params of expected type was not present\".into())),\n                        }\n                    }\n                }\n                \"\"\",\n                *codegenScope,\n            )\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/auth/AuthTypesGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.auth\n\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\n\n/**\n * Class responsible for generating [RuntimeType]s used to code generate auth-related types\n */\nclass AuthTypesGenerator(codegenContext: ClientCodegenContext) {\n    private val customizations = codegenContext.rootDecorator.authCustomizations(codegenContext, emptyList())\n    private val resolverGenerator = AuthSchemeResolverGenerator(codegenContext, customizations)\n\n    /**\n     * Return [RuntimeType] for the service-specific default auth scheme resolver\n     */\n    fun defaultAuthSchemeResolver(): RuntimeType = resolverGenerator.defaultAuthSchemeResolver()\n\n    /**\n     * Return [RuntimeType] representing the per-service trait definition for auth scheme resolution\n     */\n    fun serviceSpecificResolveAuthSchemeTrait(): RuntimeType = resolverGenerator.serviceSpecificResolveAuthSchemeTrait()\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/AuthEndpointOrchestrationV2MarkerCustomization.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.customizations\n\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginSection\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.smithyRuntime\n\n/**\n * A service runtime plugin customization that places `AuthSchemeAndEndpointOrchestrationV2` in the config bag.\n *\n * SDKs generated with this marker signal to the Smithy runtime that they follow the correct resolution order:\n * authentication scheme resolution, identity resolution, and endpoint resolution, as specified in the SRA.\n */\nclass AuthEndpointOrchestrationV2MarkerCustomization(codegenContext: ClientCodegenContext) :\n    ServiceRuntimePluginCustomization() {\n    private val runtimeConfig = codegenContext.runtimeConfig\n\n    override fun section(section: ServiceRuntimePluginSection) =\n        writable {\n            when (section) {\n                is ServiceRuntimePluginSection.AdditionalConfig -> {\n                    section.putConfigValue(\n                        this,\n                        writable {\n                            rust(\n                                \"#T\",\n                                smithyRuntime(runtimeConfig).resolve(\"client::orchestrator::AuthSchemeAndEndpointOrchestrationV2\"),\n                            )\n                        },\n                    )\n                }\n\n                else -> emptySection\n            }\n        }\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ClientCustomizations.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.customizations\n\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.LibRsCustomization\n\n/**\n * Customizations that apply only to generated clients.\n */\nclass ClientCustomizations : ClientCodegenDecorator {\n    override val name: String = \"ClientCustomizations\"\n    override val order: Byte = 0\n\n    override fun libRsCustomizations(\n        codegenContext: ClientCodegenContext,\n        baseCustomizations: List<LibRsCustomization>,\n    ): List<LibRsCustomization> = baseCustomizations + ClientDocsGenerator(codegenContext)\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ClientDocsGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.customizations\n\nimport software.amazon.smithy.model.traits.TitleTrait\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.containerDocs\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.DirectedWalker\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.LibRsCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.LibRsSection\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.ModuleDocSection\nimport software.amazon.smithy.rust.codegen.core.util.getTrait\n\nclass ClientDocsGenerator(private val codegenContext: ClientCodegenContext) : LibRsCustomization() {\n    override fun section(section: LibRsSection): Writable {\n        return when (section) {\n            is LibRsSection.ModuleDoc ->\n                if (section.subsection is ModuleDocSection.CrateOrganization) {\n                    crateLayout()\n                } else {\n                    emptySection\n                }\n            else -> emptySection\n        }\n    }\n\n    private fun crateLayout(): Writable =\n        writable {\n            val hasTypesModule =\n                DirectedWalker(codegenContext.model).walkShapes(codegenContext.serviceShape)\n                    .any {\n                        try {\n                            codegenContext.symbolProvider.moduleForShape(it).name == ClientRustModule.types.name\n                        } catch (ex: RuntimeException) {\n                            // The shape should not be rendered in any module.\n                            false\n                        }\n                    }\n            val typesModuleSentence =\n                if (hasTypesModule) {\n                    \"These structs and enums live in [`types`](crate::types). \"\n                } else {\n                    \"\"\n                }\n            val serviceName = codegenContext.serviceShape.getTrait<TitleTrait>()?.value ?: \"the service\"\n            containerDocs(\n                \"\"\"\n                The entry point for most customers will be [`Client`], which exposes one method for each API\n                offered by $serviceName. The return value of each of these methods is a \"fluent builder\",\n                where the different inputs for that API are added by builder-style function call chaining,\n                followed by calling `send()` to get a [`Future`](std::future::Future) that will result in\n                either a successful output or a [`SdkError`](crate::error::SdkError).\n\n                Some of these API inputs may be structs or enums to provide more complex structured information.\n                ${typesModuleSentence}There are some simpler types for\n                representing data such as date times or binary blobs that live in [`primitives`](crate::primitives).\n\n                All types required to configure a client via the [`Config`](crate::Config) struct live\n                in [`config`](crate::config).\n\n                The [`operation`](crate::operation) module has a submodule for every API, and in each submodule\n                is the input, output, and error type for that API, as well as builders to construct each of those.\n\n                There is a top-level [`Error`](crate::Error) type that encompasses all the errors that the\n                client can return. Any other error type can be converted to this `Error` type via the\n                [`From`](std::convert::From) trait.\n\n                The other modules within this crate are not required for normal usage.\n                \"\"\".trimEnd(),\n            )\n        }\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ConnectionPoisoningConfigCustomization.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.customizations\n\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginSection\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.smithyRuntime\n\nclass ConnectionPoisoningRuntimePluginCustomization(\n    codegenContext: ClientCodegenContext,\n) : ServiceRuntimePluginCustomization() {\n    private val runtimeConfig = codegenContext.runtimeConfig\n\n    override fun section(section: ServiceRuntimePluginSection): Writable =\n        writable {\n            when (section) {\n                is ServiceRuntimePluginSection.RegisterRuntimeComponents -> {\n                    // This interceptor assumes that a compatible Connector is set. Otherwise, connection poisoning\n                    // won't work and an error message will be logged.\n                    section.registerPermanentInterceptor(runtimeConfig, this) {\n                        rust(\n                            \"#T::new()\",\n                            smithyRuntime(runtimeConfig).resolve(\"client::http::connection_poisoning::ConnectionPoisoningInterceptor\"),\n                        )\n                    }\n                }\n\n                else -> emptySection\n            }\n        }\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/DocsRsMetadataDecorator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.customizations\n\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.ManifestCustomizations\n\n/**\n * See https://docs.rs/about/metadata for more information\n */\ndata class DocsRsMetadataSettings(\n    val features: List<String>? = null,\n    val allFeatures: Boolean? = null,\n    val noDefaultFeatures: Boolean? = null,\n    val defaultTarget: String? = null,\n    val targets: List<String>? = null,\n    val rustcArgs: List<String>? = null,\n    val rustdocArgs: List<String>? = null,\n    val cargoArgs: List<String>? = null,\n    /** Any custom key-value pairs to be inserted into the docsrs metadata */\n    val custom: HashMap<String, Any> = HashMap(),\n)\n\nfun DocsRsMetadataSettings.asMap(): Map<String, Any> {\n    val inner =\n        listOfNotNull(\n            features?.let { \"features\" to it },\n            allFeatures?.let { \"all-features\" to it },\n            noDefaultFeatures?.let { \"no-default-features\" to it },\n            defaultTarget?.let { \"no-default-target\" to it },\n            targets?.let { \"targets\" to it },\n            rustcArgs?.let { \"rustc-args\" to it },\n            rustdocArgs?.let { \"rustdoc-args\" to it },\n            cargoArgs?.let { \"cargo-args\" to it },\n        ).toMap() + custom\n    return mapOf(\"package\" to mapOf(\"metadata\" to mapOf(\"docs\" to mapOf(\"rs\" to inner))))\n}\n\n/**\n * Write docs.rs metdata settings into Cargo.toml\n *\n * docs.rs can be configured via data set at `[package.metadata.docs.rs]`. This decorator will write [DocsRsMetadataSettings]\n * into the appropriate location.\n *\n * # Notes\n * This decorator is not used by default, code generators must manually configure and include it in their builds.\n */\nclass DocsRsMetadataDecorator(private val docsRsMetadataSettings: DocsRsMetadataSettings) : ClientCodegenDecorator {\n    override val name: String = \"DocsRsMetadataDecorator\"\n    override val order: Byte = 0\n\n    override fun crateManifestCustomizations(codegenContext: ClientCodegenContext): ManifestCustomizations {\n        return docsRsMetadataSettings.asMap()\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpAuthDecorator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.customizations\n\nimport software.amazon.smithy.model.knowledge.ServiceIndex\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.model.traits.HttpApiKeyAuthTrait\nimport software.amazon.smithy.model.traits.HttpBasicAuthTrait\nimport software.amazon.smithy.model.traits.HttpBearerAuthTrait\nimport software.amazon.smithy.model.traits.HttpDigestAuthTrait\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.auth.AuthSchemeOption\nimport software.amazon.smithy.rust.codegen.client.smithy.configReexport\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginSection\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.config.ServiceConfig\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.util.dq\nimport software.amazon.smithy.rust.codegen.core.util.getTrait\nimport software.amazon.smithy.rust.codegen.core.util.letIf\n\nprivate fun codegenScope(runtimeConfig: RuntimeConfig): Array<Pair<String, Any>> {\n    val smithyRuntime =\n        CargoDependency.smithyRuntime(runtimeConfig).withFeature(\"http-auth\").toType()\n    val smithyRuntimeApi = CargoDependency.smithyRuntimeApiClient(runtimeConfig).withFeature(\"http-auth\").toType()\n    val authHttp = smithyRuntime.resolve(\"client::auth::http\")\n    val authHttpApi = smithyRuntimeApi.resolve(\"client::auth::http\")\n    return arrayOf(\n        \"AuthSchemeOption\" to\n            RuntimeType.smithyRuntimeApiClient(runtimeConfig)\n                .resolve(\"client::auth::AuthSchemeOption\"),\n        \"IntoShared\" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve(\"shared::IntoShared\"),\n        \"Token\" to configReexport(smithyRuntimeApi.resolve(\"client::identity::http::Token\")),\n        \"Login\" to configReexport(smithyRuntimeApi.resolve(\"client::identity::http::Login\")),\n        \"ResolveIdentity\" to configReexport(smithyRuntimeApi.resolve(\"client::identity::ResolveIdentity\")),\n        \"AuthSchemeId\" to smithyRuntimeApi.resolve(\"client::auth::AuthSchemeId\"),\n        \"ApiKeyAuthScheme\" to authHttp.resolve(\"ApiKeyAuthScheme\"),\n        \"ApiKeyLocation\" to authHttp.resolve(\"ApiKeyLocation\"),\n        \"BasicAuthScheme\" to authHttp.resolve(\"BasicAuthScheme\"),\n        \"BearerAuthScheme\" to authHttp.resolve(\"BearerAuthScheme\"),\n        \"DigestAuthScheme\" to authHttp.resolve(\"DigestAuthScheme\"),\n        \"HTTP_API_KEY_AUTH_SCHEME_ID\" to authHttpApi.resolve(\"HTTP_API_KEY_AUTH_SCHEME_ID\"),\n        \"HTTP_BASIC_AUTH_SCHEME_ID\" to authHttpApi.resolve(\"HTTP_BASIC_AUTH_SCHEME_ID\"),\n        \"HTTP_BEARER_AUTH_SCHEME_ID\" to authHttpApi.resolve(\"HTTP_BEARER_AUTH_SCHEME_ID\"),\n        \"HTTP_DIGEST_AUTH_SCHEME_ID\" to authHttpApi.resolve(\"HTTP_DIGEST_AUTH_SCHEME_ID\"),\n        \"SharedAuthScheme\" to smithyRuntimeApi.resolve(\"client::auth::SharedAuthScheme\"),\n        \"SharedIdentityResolver\" to smithyRuntimeApi.resolve(\"client::identity::SharedIdentityResolver\"),\n    )\n}\n\nprivate data class HttpAuthSchemes(\n    val apiKey: Boolean,\n    val basic: Boolean,\n    val bearer: Boolean,\n    val digest: Boolean,\n) {\n    companion object {\n        fun from(codegenContext: ClientCodegenContext): HttpAuthSchemes {\n            val authSchemes = ServiceIndex.of(codegenContext.model).getAuthSchemes(codegenContext.serviceShape).keys\n            return HttpAuthSchemes(\n                apiKey = authSchemes.contains(HttpApiKeyAuthTrait.ID),\n                basic = authSchemes.contains(HttpBasicAuthTrait.ID),\n                bearer = authSchemes.contains(HttpBearerAuthTrait.ID),\n                digest = authSchemes.contains(HttpDigestAuthTrait.ID),\n            )\n        }\n    }\n\n    fun anyEnabled(): Boolean = isTokenBased() || isLoginBased()\n\n    fun isTokenBased(): Boolean = apiKey || bearer\n\n    fun isLoginBased(): Boolean = basic || digest\n}\n\nclass HttpAuthDecorator : ClientCodegenDecorator {\n    override val name: String get() = \"HttpAuthDecorator\"\n    override val order: Byte = 0\n\n    override fun authSchemeOptions(\n        codegenContext: ClientCodegenContext,\n        baseAuthSchemeOptions: List<AuthSchemeOption>,\n    ): List<AuthSchemeOption> {\n        val serviceIndex = ServiceIndex.of(codegenContext.model)\n        val authSchemes = serviceIndex.getAuthSchemes(codegenContext.serviceShape)\n        val options = ArrayList<AuthSchemeOption>()\n        for (authScheme in authSchemes.keys) {\n            fun addOption(\n                schemeShapeId: ShapeId,\n                name: String,\n            ) {\n                options.add(\n                    object : AuthSchemeOption {\n                        override val authSchemeId = schemeShapeId\n\n                        override fun render(\n                            codegenContext: ClientCodegenContext,\n                            operation: OperationShape?,\n                        ) = writable {\n                            rustTemplate(\n                                \"\"\"\n                                #{AuthSchemeOption}::builder()\n                                    .scheme_id($name)\n                                    .build()\n                                    .expect(\"required fields set\")\n                                \"\"\",\n                                *codegenScope(codegenContext.runtimeConfig),\n                            )\n                        }\n                    },\n                )\n            }\n            when (authScheme) {\n                HttpApiKeyAuthTrait.ID -> addOption(authScheme, \"#{HTTP_API_KEY_AUTH_SCHEME_ID}\")\n                HttpBasicAuthTrait.ID -> addOption(authScheme, \"#{HTTP_BASIC_AUTH_SCHEME_ID}\")\n                HttpBearerAuthTrait.ID -> addOption(authScheme, \"#{HTTP_BEARER_AUTH_SCHEME_ID}\")\n                HttpDigestAuthTrait.ID -> addOption(authScheme, \"#{HTTP_DIGEST_AUTH_SCHEME_ID}\")\n                else -> {}\n            }\n        }\n        return baseAuthSchemeOptions + options\n    }\n\n    override fun configCustomizations(\n        codegenContext: ClientCodegenContext,\n        baseCustomizations: List<ConfigCustomization>,\n    ): List<ConfigCustomization> =\n        HttpAuthSchemes.from(codegenContext).let { authSchemes ->\n            baseCustomizations.letIf(authSchemes.anyEnabled()) {\n                it + HttpAuthConfigCustomization(codegenContext, authSchemes)\n            }\n        }\n\n    override fun serviceRuntimePluginCustomizations(\n        codegenContext: ClientCodegenContext,\n        baseCustomizations: List<ServiceRuntimePluginCustomization>,\n    ): List<ServiceRuntimePluginCustomization> =\n        HttpAuthSchemes.from(codegenContext).let { authSchemes ->\n            baseCustomizations.letIf(authSchemes.anyEnabled()) {\n                it + HttpAuthServiceRuntimePluginCustomization(codegenContext, authSchemes)\n            }\n        }\n}\n\nprivate class HttpAuthServiceRuntimePluginCustomization(\n    codegenContext: ClientCodegenContext,\n    private val authSchemes: HttpAuthSchemes,\n) : ServiceRuntimePluginCustomization() {\n    private val serviceShape = codegenContext.serviceShape\n    private val codegenScope = codegenScope(codegenContext.runtimeConfig)\n\n    override fun section(section: ServiceRuntimePluginSection): Writable =\n        writable {\n            when (section) {\n                is ServiceRuntimePluginSection.RegisterRuntimeComponents -> {\n                    fun registerAuthScheme(scheme: Writable) {\n                        section.registerAuthScheme(this) {\n                            rustTemplate(\"#{SharedAuthScheme}::new(#{Scheme})\", *codegenScope, \"Scheme\" to scheme)\n                        }\n                    }\n\n                    fun registerNamedAuthScheme(name: String) {\n                        registerAuthScheme {\n                            rustTemplate(\"#{$name}::new()\", *codegenScope)\n                        }\n                    }\n\n                    if (authSchemes.apiKey) {\n                        val trait = serviceShape.getTrait<HttpApiKeyAuthTrait>()!!\n                        val location =\n                            when (trait.`in`!!) {\n                                HttpApiKeyAuthTrait.Location.HEADER -> \"Header\"\n                                HttpApiKeyAuthTrait.Location.QUERY -> \"Query\"\n                            }\n\n                        registerAuthScheme {\n                            rustTemplate(\n                                \"\"\"\n                                #{ApiKeyAuthScheme}::new(\n                                    ${trait.scheme.orElse(\"\").dq()},\n                                    #{ApiKeyLocation}::$location,\n                                    ${trait.name.dq()},\n                                )\n                                \"\"\",\n                                *codegenScope,\n                            )\n                        }\n                    }\n                    if (authSchemes.basic) {\n                        registerNamedAuthScheme(\"BasicAuthScheme\")\n                    }\n                    if (authSchemes.bearer) {\n                        registerNamedAuthScheme(\"BearerAuthScheme\")\n                    }\n                    if (authSchemes.digest) {\n                        registerNamedAuthScheme(\"DigestAuthScheme\")\n                    }\n                }\n\n                else -> emptySection\n            }\n        }\n}\n\nprivate class HttpAuthConfigCustomization(\n    codegenContext: ClientCodegenContext,\n    private val authSchemes: HttpAuthSchemes,\n) : ConfigCustomization() {\n    private val codegenScope = codegenScope(codegenContext.runtimeConfig)\n\n    override fun section(section: ServiceConfig): Writable =\n        writable {\n            when (section) {\n                is ServiceConfig.BuilderImpl -> {\n                    if (authSchemes.apiKey) {\n                        rustTemplate(\n                            \"\"\"\n                            /// Sets the API key that will be used for authentication.\n                            pub fn api_key(self, api_key: #{Token}) -> Self {\n                                self.api_key_resolver(api_key)\n                            }\n\n                            /// Sets an API key resolver will be used for authentication.\n                            pub fn api_key_resolver(mut self, api_key_resolver: impl #{ResolveIdentity} + 'static) -> Self {\n                                self.runtime_components.set_identity_resolver(\n                                    #{HTTP_API_KEY_AUTH_SCHEME_ID},\n                                    #{IntoShared}::<#{SharedIdentityResolver}>::into_shared(api_key_resolver)\n                                );\n                                self\n                            }\n                            \"\"\",\n                            *codegenScope,\n                        )\n                    }\n                    if (authSchemes.bearer) {\n                        rustTemplate(\n                            \"\"\"\n                            /// Sets the bearer token that will be used for HTTP bearer auth.\n                            pub fn bearer_token(self, bearer_token: #{Token}) -> Self {\n                                self.bearer_token_resolver(bearer_token)\n                            }\n\n                            /// Sets a bearer token provider that will be used for HTTP bearer auth.\n                            pub fn bearer_token_resolver(mut self, bearer_token_resolver: impl #{ResolveIdentity} + 'static) -> Self {\n                                self.runtime_components.set_identity_resolver(\n                                    #{HTTP_BEARER_AUTH_SCHEME_ID},\n                                    #{IntoShared}::<#{SharedIdentityResolver}>::into_shared(bearer_token_resolver)\n                                );\n                                self\n                            }\n                            \"\"\",\n                            *codegenScope,\n                        )\n                    }\n                    if (authSchemes.basic) {\n                        rustTemplate(\n                            \"\"\"\n                            /// Sets the login that will be used for HTTP basic auth.\n                            pub fn basic_auth_login(self, basic_auth_login: #{Login}) -> Self {\n                                self.basic_auth_login_resolver(basic_auth_login)\n                            }\n\n                            /// Sets a login resolver that will be used for HTTP basic auth.\n                            pub fn basic_auth_login_resolver(mut self, basic_auth_resolver: impl #{ResolveIdentity} + 'static) -> Self {\n                                self.runtime_components.set_identity_resolver(\n                                    #{HTTP_BASIC_AUTH_SCHEME_ID},\n                                    #{IntoShared}::<#{SharedIdentityResolver}>::into_shared(basic_auth_resolver)\n                                );\n                                self\n                            }\n                            \"\"\",\n                            *codegenScope,\n                        )\n                    }\n                    if (authSchemes.digest) {\n                        rustTemplate(\n                            \"\"\"\n                            /// Sets the login that will be used for HTTP digest auth.\n                            pub fn digest_auth_login(self, digest_auth_login: #{Login}) -> Self {\n                                self.digest_auth_login_resolver(digest_auth_login)\n                            }\n\n                            /// Sets a login resolver that will be used for HTTP digest auth.\n                            pub fn digest_auth_login_resolver(mut self, digest_auth_resolver: impl #{ResolveIdentity} + 'static) -> Self {\n                                self.runtime_components.set_identity_resolver(\n                                    #{HTTP_DIGEST_AUTH_SCHEME_ID},\n                                    #{IntoShared}::<#{SharedIdentityResolver}>::into_shared(digest_auth_resolver)\n                                );\n                                self\n                            }\n                            \"\"\",\n                            *codegenScope,\n                        )\n                    }\n                }\n\n                else -> {}\n            }\n        }\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpChecksumRequiredGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.customizations\n\nimport software.amazon.smithy.codegen.core.CodegenException\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.traits.HttpChecksumRequiredTrait\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.OperationSection\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.InlineDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustModule\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.toType\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenContext\nimport software.amazon.smithy.rust.codegen.core.util.hasStreamingMember\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\nimport software.amazon.smithy.rust.codegen.core.util.inputShape\n\nclass HttpChecksumRequiredGenerator(\n    private val codegenContext: CodegenContext,\n    private val operationShape: OperationShape,\n) : OperationCustomization() {\n    override fun section(section: OperationSection): Writable {\n        if (!operationShape.hasTrait<HttpChecksumRequiredTrait>()) {\n            return emptySection\n        }\n        if (operationShape.inputShape(codegenContext.model).hasStreamingMember(codegenContext.model)) {\n            throw CodegenException(\"HttpChecksum required cannot be applied to a streaming shape\")\n        }\n        return when (section) {\n            is OperationSection.AdditionalRuntimePlugins ->\n                writable {\n                    section.addOperationRuntimePlugin(this) {\n                        rustTemplate(\n                            \"#{HttpChecksumRequiredRuntimePlugin}::new()\",\n                            \"HttpChecksumRequiredRuntimePlugin\" to\n                                InlineDependency.forRustFile(\n                                    RustModule.pubCrate(\n                                        \"client_http_checksum_required\",\n                                        parent = ClientRustModule.root,\n                                    ),\n                                    \"/inlineable/src/client_http_checksum_required.rs\",\n                                    CargoDependency.smithyRuntimeApiClient(codegenContext.runtimeConfig),\n                                    CargoDependency.smithyTypes(codegenContext.runtimeConfig),\n                                    CargoDependency.Http1x,\n                                    CargoDependency.Md5,\n                                ).toType().resolve(\"HttpChecksumRequiredRuntimePlugin\"),\n                        )\n                    }\n                }\n\n            else -> emptySection\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpConnectorConfigDecorator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.customizations\n\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.configReexport\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.config.ServiceConfig\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\n\nclass HttpConnectorConfigDecorator : ClientCodegenDecorator {\n    override val name: String = \"HttpConnectorConfigDecorator\"\n    override val order: Byte = 0\n\n    override fun configCustomizations(\n        codegenContext: ClientCodegenContext,\n        baseCustomizations: List<ConfigCustomization>,\n    ): List<ConfigCustomization> = baseCustomizations + HttpConnectorConfigCustomization(codegenContext)\n}\n\nprivate class HttpConnectorConfigCustomization(\n    codegenContext: ClientCodegenContext,\n) : ConfigCustomization() {\n    private val runtimeConfig = codegenContext.runtimeConfig\n    private val moduleUseName = codegenContext.moduleUseName()\n    private val codegenScope =\n        arrayOf(\n            *preludeScope,\n            \"HttpClient\" to\n                configReexport(\n                    RuntimeType.smithyRuntimeApiClient(runtimeConfig).resolve(\"client::http::HttpClient\"),\n                ),\n            \"IntoShared\" to configReexport(RuntimeType.smithyRuntimeApi(runtimeConfig).resolve(\"shared::IntoShared\")),\n            \"SharedHttpClient\" to\n                configReexport(\n                    RuntimeType.smithyRuntimeApiClient(runtimeConfig).resolve(\"client::http::SharedHttpClient\"),\n                ),\n        )\n\n    override fun section(section: ServiceConfig): Writable {\n        return when (section) {\n            is ServiceConfig.ConfigImpl ->\n                writable {\n                    rustTemplate(\n                        \"\"\"\n                        /// Return the [`SharedHttpClient`](#{SharedHttpClient}) to use when making requests, if any.\n                        pub fn http_client(&self) -> Option<#{SharedHttpClient}> {\n                            self.runtime_components.http_client()\n                        }\n                        \"\"\",\n                        *codegenScope,\n                    )\n                }\n\n            ServiceConfig.BuilderImpl ->\n                writable {\n                    rustTemplate(\n                        \"\"\"\n                        /// Sets the HTTP client to use when making requests.\n                        ///\n                        /// ## Examples\n                        /// ```no_run\n                        /// ## ##[cfg(test)]\n                        /// ## mod tests {\n                        /// ## ##[test]\n                        /// ## fn example() {\n                        /// use std::time::Duration;\n                        /// use $moduleUseName::config::Config;\n                        /// use aws_smithy_runtime::client::http::hyper_014::HyperClientBuilder;\n                        ///\n                        /// let https_connector = hyper_rustls::HttpsConnectorBuilder::new()\n                        ///     .with_webpki_roots()\n                        ///     .https_only()\n                        ///     .enable_http1()\n                        ///     .enable_http2()\n                        ///     .build();\n                        /// let hyper_client = HyperClientBuilder::new().build(https_connector);\n                        ///\n                        /// // This connector can then be given to a generated service Config\n                        /// let config = my_service_client::Config::builder()\n                        ///     .endpoint_url(\"https://example.com\")\n                        ///     .http_client(hyper_client)\n                        ///     .build();\n                        /// let client = my_service_client::Client::from_conf(config);\n                        /// ## }\n                        /// ## }\n                        /// ```\n                        pub fn http_client(mut self, http_client: impl #{HttpClient} + 'static) -> Self {\n                            self.set_http_client(#{Some}(#{IntoShared}::into_shared(http_client)));\n                            self\n                        }\n\n                        /// Sets the HTTP client to use when making requests.\n                        ///\n                        /// ## Examples\n                        /// ```no_run\n                        /// ## ##[cfg(test)]\n                        /// ## mod tests {\n                        /// ## ##[test]\n                        /// ## fn example() {\n                        /// use std::time::Duration;\n                        /// use $moduleUseName::config::{Builder, Config};\n                        /// use aws_smithy_runtime::client::http::hyper_014::HyperClientBuilder;\n                        ///\n                        /// fn override_http_client(builder: &mut Builder) {\n                        ///     let https_connector = hyper_rustls::HttpsConnectorBuilder::new()\n                        ///         .with_webpki_roots()\n                        ///         .https_only()\n                        ///         .enable_http1()\n                        ///         .enable_http2()\n                        ///         .build();\n                        ///     let hyper_client = HyperClientBuilder::new().build(https_connector);\n                        ///     builder.set_http_client(Some(hyper_client));\n                        /// }\n                        ///\n                        /// let mut builder = $moduleUseName::Config::builder();\n                        /// override_http_client(&mut builder);\n                        /// let config = builder.build();\n                        /// ## }\n                        /// ## }\n                        /// ```\n                        pub fn set_http_client(&mut self, http_client: Option<#{SharedHttpClient}>) -> &mut Self {\n                            self.runtime_components.set_http_client(http_client);\n                            self\n                        }\n                        \"\"\",\n                        *codegenScope,\n                    )\n                }\n\n            else -> emptySection\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/IdempotencyTokenDecorator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.customizations\n\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginSection\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.config.IdempotencyTokenProviderCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.config.needsIdempotencyToken\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.util.extendIf\n\nclass IdempotencyTokenDecorator : ClientCodegenDecorator {\n    override val name: String = \"IdempotencyToken\"\n    override val order: Byte = 0\n\n    private fun enabled(ctx: ClientCodegenContext) = ctx.serviceShape.needsIdempotencyToken(ctx.model)\n\n    override fun configCustomizations(\n        codegenContext: ClientCodegenContext,\n        baseCustomizations: List<ConfigCustomization>,\n    ): List<ConfigCustomization> =\n        baseCustomizations.extendIf(enabled(codegenContext)) {\n            IdempotencyTokenProviderCustomization(codegenContext)\n        }\n\n    override fun operationCustomizations(\n        codegenContext: ClientCodegenContext,\n        operation: OperationShape,\n        baseCustomizations: List<OperationCustomization>,\n    ): List<OperationCustomization> {\n        return baseCustomizations + IdempotencyTokenGenerator(codegenContext, operation)\n    }\n\n    override fun serviceRuntimePluginCustomizations(\n        codegenContext: ClientCodegenContext,\n        baseCustomizations: List<ServiceRuntimePluginCustomization>,\n    ): List<ServiceRuntimePluginCustomization> {\n        return baseCustomizations.extendIf(enabled(codegenContext)) {\n            object : ServiceRuntimePluginCustomization() {\n                override fun section(section: ServiceRuntimePluginSection) =\n                    writable {\n                        if (section is ServiceRuntimePluginSection.AdditionalConfig) {\n                            section.putConfigValue(this, defaultTokenProvider((codegenContext.runtimeConfig)))\n                        }\n                    }\n            }\n        }\n    }\n}\n\nprivate fun defaultTokenProvider(runtimeConfig: RuntimeConfig) =\n    writable { rust(\"#T()\", RuntimeType.idempotencyToken(runtimeConfig).resolve(\"default_provider\")) }\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/IdempotencyTokenGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.customizations\n\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.traits.IdempotencyTokenTrait\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.OperationSection\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.InlineDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustModule\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.toType\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenContext\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\nimport software.amazon.smithy.rust.codegen.core.smithy.isOptional\nimport software.amazon.smithy.rust.codegen.core.util.UNREACHABLE\nimport software.amazon.smithy.rust.codegen.core.util.findMemberWithTrait\nimport software.amazon.smithy.rust.codegen.core.util.inputShape\n\nclass IdempotencyTokenGenerator(\n    codegenContext: CodegenContext,\n    private val operationShape: OperationShape,\n) : OperationCustomization() {\n    private val model = codegenContext.model\n    private val runtimeConfig = codegenContext.runtimeConfig\n    private val symbolProvider = codegenContext.symbolProvider\n    private val inputShape = operationShape.inputShape(model)\n    private val idempotencyTokenMember = inputShape.findMemberWithTrait<IdempotencyTokenTrait>(model)\n\n    override fun section(section: OperationSection): Writable {\n        if (idempotencyTokenMember == null) {\n            return emptySection\n        }\n        val memberName = symbolProvider.toMemberName(idempotencyTokenMember)\n        val codegenScope =\n            arrayOf(\n                *preludeScope,\n                \"Input\" to symbolProvider.toSymbol(inputShape),\n                \"IdempotencyTokenRuntimePlugin\" to\n                    InlineDependency.forRustFile(\n                        RustModule.pubCrate(\"client_idempotency_token\", parent = ClientRustModule.root),\n                        \"/inlineable/src/client_idempotency_token.rs\",\n                        CargoDependency.smithyRuntimeApiClient(runtimeConfig),\n                        CargoDependency.smithyTypes(runtimeConfig),\n                        InlineDependency.idempotencyToken(runtimeConfig),\n                    ).toType().resolve(\"IdempotencyTokenRuntimePlugin\"),\n            )\n\n        return when (section) {\n            is OperationSection.AdditionalRuntimePlugins ->\n                writable {\n                    section.addOperationRuntimePlugin(this) {\n                        if (!symbolProvider.toSymbol(idempotencyTokenMember).isOptional()) {\n                            UNREACHABLE(\"top level input members are always optional. $operationShape\")\n                        }\n                        // An idempotency token is optional. If the user didn't specify a token\n                        // then we'll generate one and set it.\n                        rustTemplate(\n                            \"\"\"\n                            #{IdempotencyTokenRuntimePlugin}::new(|token_provider, input| {\n                                let input: &mut #{Input} = input.downcast_mut().expect(\"correct type\");\n                                if input.$memberName.is_none() {\n                                    input.$memberName = #{Some}(token_provider.make_idempotency_token());\n                                }\n                            })\n                            \"\"\",\n                            *codegenScope,\n                        )\n                    }\n                }\n\n            else -> emptySection\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/IdentityCacheDecorator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.customizations\n\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.configReexport\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.config.ServiceConfig\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\n\nclass IdentityCacheConfigCustomization(codegenContext: ClientCodegenContext) : ConfigCustomization() {\n    private val moduleUseName = codegenContext.moduleUseName()\n\n    private val codegenScope =\n        codegenContext.runtimeConfig.let { rc ->\n            val api = RuntimeType.smithyRuntimeApiClient(rc)\n            arrayOf(\n                *preludeScope,\n                \"ResolveCachedIdentity\" to configReexport(api.resolve(\"client::identity::ResolveCachedIdentity\")),\n                \"SharedIdentityCache\" to configReexport(api.resolve(\"client::identity::SharedIdentityCache\")),\n            )\n        }\n\n    override fun section(section: ServiceConfig): Writable =\n        writable {\n            when (section) {\n                is ServiceConfig.BuilderImpl -> {\n                    val docs = \"\"\"\n                        /// Set the identity cache for auth.\n                        ///\n                        /// The identity cache defaults to a lazy caching implementation that will resolve\n                        /// an identity when it is requested, and place it in the cache thereafter. Subsequent\n                        /// requests will take the value from the cache while it is still valid. Once it expires,\n                        /// the next request will result in refreshing the identity.\n                        ///\n                        /// This configuration allows you to disable or change the default caching mechanism.\n                        /// To use a custom caching mechanism, implement the [`ResolveCachedIdentity`](#{ResolveCachedIdentity})\n                        /// trait and pass that implementation into this function.\n                        ///\n                        /// ## Examples\n                        ///\n                        /// Disabling identity caching:\n                        /// ```no_run\n                        /// use $moduleUseName::config::IdentityCache;\n                        ///\n                        /// let config = $moduleUseName::Config::builder()\n                        ///     .identity_cache(IdentityCache::no_cache())\n                        ///     // ...\n                        ///     .build();\n                        /// let client = $moduleUseName::Client::from_conf(config);\n                        /// ```\n                        ///\n                        /// Customizing lazy caching:\n                        /// ```no_run\n                        /// use $moduleUseName::config::IdentityCache;\n                        /// use std::time::Duration;\n                        ///\n                        /// let config = $moduleUseName::Config::builder()\n                        ///     .identity_cache(\n                        ///         IdentityCache::lazy()\n                        ///             // change the load timeout to 10 seconds\n                        ///             .load_timeout(Duration::from_secs(10))\n                        ///             .build()\n                        ///     )\n                        ///     // ...\n                        ///     .build();\n                        /// let client = $moduleUseName::Client::from_conf(config);\n                        /// ```\n                    ///\"\"\"\n                    rustTemplate(\n                        \"\"\"\n                        $docs\n                        pub fn identity_cache(mut self, identity_cache: impl #{ResolveCachedIdentity} + 'static) -> Self {\n                            self.set_identity_cache(identity_cache);\n                            self\n                        }\n\n                        $docs\n                        pub fn set_identity_cache(&mut self, identity_cache: impl #{ResolveCachedIdentity} + 'static) -> &mut Self {\n                            self.runtime_components.set_identity_cache(#{Some}(identity_cache));\n                            self\n                        }\n                        \"\"\",\n                        *codegenScope,\n                    )\n                }\n\n                is ServiceConfig.ConfigImpl -> {\n                    rustTemplate(\n                        \"\"\"\n                        /// Returns the configured identity cache for auth.\n                        pub fn identity_cache(&self) -> #{Option}<#{SharedIdentityCache}> {\n                            self.runtime_components.identity_cache()\n                        }\n                        \"\"\",\n                        *codegenScope,\n                    )\n                }\n\n                else -> {}\n            }\n        }\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/InterceptorConfigCustomization.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.customizations\n\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.configReexport\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.config.ServiceConfig\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\n\nclass InterceptorConfigCustomization(codegenContext: ClientCodegenContext) : ConfigCustomization() {\n    private val moduleUseName = codegenContext.moduleUseName()\n    private val runtimeConfig = codegenContext.runtimeConfig\n\n    private val codegenScope =\n        arrayOf(\n            \"Intercept\" to configReexport(RuntimeType.intercept(runtimeConfig)),\n            \"SharedInterceptor\" to configReexport(RuntimeType.sharedInterceptor(runtimeConfig)),\n            // TODO(Http1x): Update this dependency to Http1x\n            \"Http\" to CargoDependency.Http0x.toType(),\n        )\n\n    override fun section(section: ServiceConfig) =\n        writable {\n            when (section) {\n                ServiceConfig.ConfigImpl ->\n                    rustTemplate(\n                        \"\"\"\n                        /// Returns interceptors currently registered by the user.\n                        pub fn interceptors(&self) -> impl Iterator<Item = #{SharedInterceptor}> + '_ {\n                            self.runtime_components.interceptors()\n                        }\n                        \"\"\",\n                        *codegenScope,\n                    )\n\n                ServiceConfig.BuilderImpl ->\n                    rustTemplate(\n                        \"\"\"\n                        /// Add an [interceptor](#{Intercept}) that runs at specific stages of the request execution pipeline.\n                        ///\n                        /// Interceptors targeted at a certain stage are executed according to the pre-defined priority.\n                        /// The SDK provides a default set of interceptors. An interceptor configured by this method\n                        /// will run after those default interceptors.\n                        ///\n                        /// ## Examples\n                        /// ```no_run\n                        /// ## fn example() {\n                        /// use aws_smithy_runtime_api::box_error::BoxError;\n                        /// use aws_smithy_runtime_api::client::interceptors::context::BeforeTransmitInterceptorContextMut;\n                        /// use aws_smithy_runtime_api::client::interceptors::Intercept;\n                        /// use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents;\n                        /// use aws_smithy_types::config_bag::ConfigBag;\n                        /// use $moduleUseName::config::Config;\n                        /// use #{Http}::uri::Uri;\n                        ///\n                        /// fn base_url() -> String {\n                        ///     // ...\n                        ///     ## String::new()\n                        /// }\n                        ///\n                        /// ##[derive(Debug)]\n                        /// pub struct UriModifierInterceptor;\n                        /// impl Intercept for UriModifierInterceptor {\n                        ///     fn name(&self) -> &'static str {\n                        ///         \"UriModifierInterceptor\"\n                        ///     }\n                        ///     fn modify_before_signing(\n                        ///         &self,\n                        ///         context: &mut BeforeTransmitInterceptorContextMut<'_>,\n                        ///         _runtime_components: &RuntimeComponents,\n                        ///         _cfg: &mut ConfigBag,\n                        ///     ) -> Result<(), BoxError> {\n                        ///         let request = context.request_mut();\n                        ///         let uri = format!(\"{}{}\", base_url(), request.uri());\n                        ///         *request.uri_mut() = uri.parse::<Uri>()?.into();\n                        ///\n                        ///         Ok(())\n                        ///     }\n                        /// }\n                        ///\n                        /// let config = Config::builder()\n                        ///     .interceptor(UriModifierInterceptor)\n                        ///     .build();\n                        /// ## }\n                        /// ```\n                        pub fn interceptor(mut self, interceptor: impl #{Intercept} + 'static) -> Self {\n                            self.push_interceptor(#{SharedInterceptor}::new(interceptor));\n                            self\n                        }\n\n                        /// Like [`Self::interceptor`], but takes a [`SharedInterceptor`](#{SharedInterceptor}).\n                        pub fn push_interceptor(&mut self, interceptor: #{SharedInterceptor}) -> &mut Self {\n                            self.runtime_components.push_interceptor(interceptor);\n                            self\n                        }\n\n                        /// Set [`SharedInterceptor`](#{SharedInterceptor})s for the builder.\n                        pub fn set_interceptors(&mut self, interceptors: impl IntoIterator<Item = #{SharedInterceptor}>) -> &mut Self {\n                            self.runtime_components.set_interceptors(interceptors.into_iter());\n                            self\n                        }\n                        \"\"\",\n                        *codegenScope,\n                    )\n\n                else -> emptySection\n            }\n        }\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ManifestHintsDecorator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.customizations\n\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.ManifestCustomizations\n\n/**\n * See https://blog.rust-lang.org/inside-rust/2025/07/15/call-for-testing-hint-mostly-unused/ for more information\n */\ndata class ManifestHintsSettings(\n    val mostlyUnused: Boolean? = null,\n)\n\nfun ManifestHintsSettings.asMap(): Map<String, Any> {\n    val inner =\n        listOfNotNull(\n            mostlyUnused?.let { \"mostly-unused\" to it },\n        ).toMap()\n    return mapOf(\"hints\" to inner)\n}\n\n/**\n * Write compilation hints metdata settings into Cargo.toml.\n *\n * # Notes\n * This decorator is not used by default, code generators must manually configure and include it in their builds.\n */\nclass ManifestHintsDecorator(private val manifestHintsSettings: ManifestHintsSettings) : ClientCodegenDecorator {\n    override val name: String = \"ManifestHintsDecorator\"\n    override val order: Byte = 0\n\n    override fun crateManifestCustomizations(codegenContext: ClientCodegenContext): ManifestCustomizations {\n        return manifestHintsSettings.asMap()\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/MetadataCustomization.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.customizations\n\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.OperationSection\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.util.dq\nimport software.amazon.smithy.rust.codegen.core.util.sdkId\n\nclass MetadataCustomization(\n    private val codegenContext: ClientCodegenContext,\n    operation: OperationShape,\n) : OperationCustomization() {\n    private val operationName = codegenContext.symbolProvider.toSymbol(operation).name\n    private val runtimeConfig = codegenContext.runtimeConfig\n    private val codegenScope by lazy {\n        arrayOf(\n            \"Metadata\" to RuntimeType.smithyRuntimeApiClient(runtimeConfig).resolve(\"client::orchestrator::Metadata\"),\n        )\n    }\n\n    override fun section(section: OperationSection): Writable =\n        writable {\n            when (section) {\n                is OperationSection.AdditionalRuntimePluginConfig -> {\n                    rustTemplate(\n                        \"\"\"\n                        ${section.newLayerName}.store_put(#{Metadata}::new(\n                            ${operationName.dq()},\n                            ${codegenContext.serviceShape.sdkId().dq()},\n                        ));\n                        \"\"\",\n                        *codegenScope,\n                    )\n                }\n\n                else -> {}\n            }\n        }\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/NoAuthDecorator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.customizations\n\nimport software.amazon.smithy.model.node.Node\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.model.traits.Trait\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.auth.AuthSchemeOption\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\n\n/**\n * Synthetic auth trait representing `noAuth`.\n *\n * This trait should not be used generally — it was specifically introduced to revise a workaround\n * in the S3's model transformer. Previously, the transformer added `@optionalAuth` to every operation.\n * However, that would cause all operations to appear in the `operation_overrides` field of the default\n * auth resolver when querying the `AuthIndex`, since `AuthIndex` uses the presence of the\n * `optionalAuth` trait to determine whether overrides are needed.\n *\n * Ideally, we would annotate the service shape instead, but the `optionalAuth` trait is only\n * allowed on operation shapes, so we introduce this synthetic trait instead.\n */\nclass SyntheticNoAuthTrait : Trait {\n    val ID = ShapeId.from(\"software.amazon.smithy.rust.codegen.client.smithy.synthetic#NoAuth\")\n\n    override fun toNode(): Node = Node.objectNode()\n\n    override fun toShapeId(): ShapeId = ID\n}\n\nprivate fun noAuthModule(codegenContext: ClientCodegenContext): RuntimeType =\n    CargoDependency.smithyRuntime(codegenContext.runtimeConfig)\n        .toType()\n        .resolve(\"client::auth::no_auth\")\n\nclass NoAuthDecorator : ClientCodegenDecorator {\n    override val name: String = \"NoAuthDecorator\"\n    override val order: Byte = 0\n\n    override fun authSchemeOptions(\n        codegenContext: ClientCodegenContext,\n        baseAuthSchemeOptions: List<AuthSchemeOption>,\n    ): List<AuthSchemeOption> = baseAuthSchemeOptions + NoAuthSchemeOption()\n}\n\nclass NoAuthSchemeOption : AuthSchemeOption {\n    override val authSchemeId: ShapeId = ShapeId.from(\"smithy.api#noAuth\")\n\n    override fun render(\n        codegenContext: ClientCodegenContext,\n        operation: OperationShape?,\n    ) = writable {\n        rustTemplate(\n            \"\"\"\n            #{AuthSchemeOption}::from(#{NO_AUTH_SCHEME_ID})\n            \"\"\",\n            \"AuthSchemeOption\" to\n                RuntimeType.smithyRuntimeApiClient(codegenContext.runtimeConfig)\n                    .resolve(\"client::auth::AuthSchemeOption\"),\n            \"NO_AUTH_SCHEME_ID\" to noAuthModule(codegenContext).resolve(\"NO_AUTH_SCHEME_ID\"),\n        )\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/RequestCompressionGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.customizations\n\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.traits.RequestCompressionTrait\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.OperationSection\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenContext\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.util.getTrait\nimport java.util.logging.Logger\n\n// Currently, gzip is the only supported encoding.\nfun isSupportedEncoding(encoding: String): Boolean = encoding == \"gzip\"\n\nfun firstSupportedEncoding(encodings: List<String>): String? = encodings.firstOrNull { isSupportedEncoding(it) }\n\n// This generator was implemented based on this spec:\n// https://smithy.io/2.0/spec/behavior-traits.html#requestcompression-trait\nclass RequestCompressionGenerator(\n    private val codegenContext: CodegenContext,\n    private val operationShape: OperationShape,\n) : OperationCustomization() {\n    override fun section(section: OperationSection): Writable {\n        operationShape.getTrait<RequestCompressionTrait>()?.let { requestCompressionTrait ->\n            val logger = Logger.getLogger(\"SdkSettings\")\n            if (requestCompressionTrait.encodings.isEmpty()) {\n                logger.warning { \"No encodings were specified for the requestCompressionTrait on ${operationShape.id}\" }\n                return emptySection\n            }\n            val encoding = firstSupportedEncoding(requestCompressionTrait.encodings) ?: return emptySection\n            // We can remove this once we start supporting other algorithms.\n            // Until then, we shouldn't see anything else coming up here.\n            assert(encoding == \"gzip\") { \"Only gzip is supported but encoding was `$encoding`\" }\n            val runtimeConfig = codegenContext.runtimeConfig\n            val compression = RuntimeType.clientRequestCompression(runtimeConfig)\n\n            return writable {\n                when (section) {\n                    is OperationSection.AdditionalRuntimePlugins ->\n                        section.addOperationRuntimePlugin(this) {\n                            rust(\"#T::new()\", compression.resolve(\"RequestCompressionRuntimePlugin\"))\n                        }\n\n                    else -> {}\n                }\n            }\n        }\n\n        return emptySection\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ResiliencyConfigCustomization.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.customizations\n\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule\nimport software.amazon.smithy.rust.codegen.client.smithy.configReexport\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.config.ServiceConfig\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\nimport software.amazon.smithy.rust.codegen.core.smithy.RustCrate\nimport software.amazon.smithy.rust.codegen.core.util.sdkId\n\nclass ResiliencyConfigCustomization(codegenContext: ClientCodegenContext) : ConfigCustomization() {\n    private val runtimeConfig = codegenContext.runtimeConfig\n    private val retryConfig = RuntimeType.smithyTypes(runtimeConfig).resolve(\"retry\")\n    private val sleepModule = RuntimeType.smithyAsync(runtimeConfig).resolve(\"rt::sleep\")\n    private val timeoutModule = RuntimeType.smithyTypes(runtimeConfig).resolve(\"timeout\")\n    private val retries = RuntimeType.smithyRuntime(runtimeConfig).resolve(\"client::retries\")\n    private val moduleUseName = codegenContext.moduleUseName()\n    private val sdkId = codegenContext.serviceShape.sdkId()\n    private val defaultRetryPartition = sdkId.lowercase().replace(\" \", \"\")\n    private val codegenScope =\n        arrayOf(\n            *preludeScope,\n            \"AsyncSleep\" to configReexport(sleepModule.resolve(\"AsyncSleep\")),\n            \"SharedAsyncSleep\" to configReexport(sleepModule.resolve(\"SharedAsyncSleep\")),\n            \"Sleep\" to configReexport(sleepModule.resolve(\"Sleep\")),\n            \"ClientRateLimiter\" to retries.resolve(\"ClientRateLimiter\"),\n            \"ClientRateLimiterPartition\" to retries.resolve(\"ClientRateLimiterPartition\"),\n            \"debug\" to RuntimeType.Tracing.resolve(\"debug\"),\n            \"IntoShared\" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve(\"shared::IntoShared\"),\n            \"RetryConfig\" to retryConfig.resolve(\"RetryConfig\"),\n            \"RetryMode\" to RuntimeType.smithyTypes(runtimeConfig).resolve(\"retry::RetryMode\"),\n            \"RetryPartition\" to retries.resolve(\"RetryPartition\"),\n            \"SharedAsyncSleep\" to configReexport(sleepModule.resolve(\"SharedAsyncSleep\")),\n            \"SharedRetryStrategy\" to configReexport(RuntimeType.smithyRuntimeApiClient(runtimeConfig).resolve(\"client::retries::SharedRetryStrategy\")),\n            \"SharedTimeSource\" to configReexport(RuntimeType.smithyAsync(runtimeConfig).resolve(\"time::SharedTimeSource\")),\n            \"StandardRetryStrategy\" to configReexport(retries.resolve(\"strategy::StandardRetryStrategy\")),\n            \"SystemTime\" to RuntimeType.std.resolve(\"time::SystemTime\"),\n            \"TimeoutConfig\" to timeoutModule.resolve(\"TimeoutConfig\"),\n        )\n\n    override fun section(section: ServiceConfig) =\n        writable {\n            when (section) {\n                is ServiceConfig.ConfigImpl -> {\n                    rustTemplate(\n                        \"\"\"\n                        /// Return a reference to the retry configuration contained in this config, if any.\n                        pub fn retry_config(&self) -> #{Option}<&#{RetryConfig}> {\n                            self.config.load::<#{RetryConfig}>()\n                        }\n\n                        /// Return a cloned shared async sleep implementation from this config, if any.\n                        pub fn sleep_impl(&self) -> #{Option}<#{SharedAsyncSleep}> {\n                            self.runtime_components.sleep_impl()\n                        }\n\n                        /// Return a reference to the timeout configuration contained in this config, if any.\n                        pub fn timeout_config(&self) -> #{Option}<&#{TimeoutConfig}> {\n                            self.config.load::<#{TimeoutConfig}>()\n                        }\n\n                        /// Returns a reference to the retry partition contained in this config, if any.\n                        ///\n                        /// WARNING: This method is unstable and may be removed at any time. Do not rely on this\n                        /// method for anything!\n                        pub fn retry_partition(&self) -> #{Option}<&#{RetryPartition}> {\n                            self.config.load::<#{RetryPartition}>()\n                        }\n                        \"\"\",\n                        *codegenScope,\n                    )\n                }\n\n                is ServiceConfig.BuilderImpl -> {\n                    rustTemplate(\n                        \"\"\"\n                        /// Set the retry_config for the builder\n                        ///\n                        /// ## Examples\n                        /// ```no_run\n                        /// use $moduleUseName::config::Config;\n                        /// use $moduleUseName::config::retry::RetryConfig;\n                        ///\n                        /// let retry_config = RetryConfig::standard().with_max_attempts(5);\n                        /// let config = Config::builder().retry_config(retry_config).build();\n                        /// ```\n                        pub fn retry_config(mut self, retry_config: #{RetryConfig}) -> Self {\n                            self.set_retry_config(Some(retry_config));\n                            self\n                        }\n\n                        /// Set the retry_config for the builder\n                        ///\n                        /// ## Examples\n                        /// ```no_run\n                        /// use $moduleUseName::config::{Builder, Config};\n                        /// use $moduleUseName::config::retry::RetryConfig;\n                        ///\n                        /// fn disable_retries(builder: &mut Builder) {\n                        ///     let retry_config = RetryConfig::standard().with_max_attempts(1);\n                        ///     builder.set_retry_config(Some(retry_config));\n                        /// }\n                        ///\n                        /// let mut builder = Config::builder();\n                        /// disable_retries(&mut builder);\n                        /// let config = builder.build();\n                        /// ```\n                        \"\"\",\n                        *codegenScope,\n                    )\n\n                    rustTemplate(\n                        \"\"\"\n                        pub fn set_retry_config(&mut self, retry_config: #{Option}<#{RetryConfig}>) -> &mut Self {\n                            retry_config.map(|r| self.config.store_put(r));\n                            self\n                        }\n                        \"\"\",\n                        *codegenScope,\n                    )\n\n                    rustTemplate(\n                        \"\"\"\n\n                        /// Set the sleep_impl for the builder\n                        ///\n                        /// ## Examples\n                        ///\n                        /// ```no_run\n                        /// use $moduleUseName::config::{AsyncSleep, Config, SharedAsyncSleep, Sleep};\n                        ///\n                        /// ##[derive(Debug)]\n                        /// pub struct ForeverSleep;\n                        ///\n                        /// impl AsyncSleep for ForeverSleep {\n                        ///     fn sleep(&self, duration: std::time::Duration) -> Sleep {\n                        ///         Sleep::new(std::future::pending())\n                        ///     }\n                        /// }\n                        ///\n                        /// let sleep_impl = SharedAsyncSleep::new(ForeverSleep);\n                        /// let config = Config::builder().sleep_impl(sleep_impl).build();\n                        /// ```\n                        pub fn sleep_impl(mut self, sleep_impl: impl #{AsyncSleep} + 'static) -> Self {\n                            self.set_sleep_impl(Some(#{IntoShared}::into_shared(sleep_impl)));\n                            self\n                        }\n\n                        /// Set the sleep_impl for the builder\n                        ///\n                        /// ## Examples\n                        ///\n                        /// ```no_run\n                        /// use $moduleUseName::config::{AsyncSleep, Builder, Config, SharedAsyncSleep, Sleep};\n                        ///\n                        /// ##[derive(Debug)]\n                        /// pub struct ForeverSleep;\n                        ///\n                        /// impl AsyncSleep for ForeverSleep {\n                        ///     fn sleep(&self, duration: std::time::Duration) -> Sleep {\n                        ///         Sleep::new(std::future::pending())\n                        ///     }\n                        /// }\n                        ///\n                        /// fn set_never_ending_sleep_impl(builder: &mut Builder) {\n                        ///     let sleep_impl = SharedAsyncSleep::new(ForeverSleep);\n                        ///     builder.set_sleep_impl(Some(sleep_impl));\n                        /// }\n                        ///\n                        /// let mut builder = Config::builder();\n                        /// set_never_ending_sleep_impl(&mut builder);\n                        /// let config = builder.build();\n                        /// ```\n                        \"\"\",\n                        *codegenScope,\n                    )\n\n                    rustTemplate(\n                        \"\"\"\n                        pub fn set_sleep_impl(&mut self, sleep_impl: #{Option}<#{SharedAsyncSleep}>) -> &mut Self {\n                            self.runtime_components.set_sleep_impl(sleep_impl);\n                            self\n                        }\n                        \"\"\",\n                        *codegenScope,\n                    )\n\n                    rustTemplate(\n                        \"\"\"\n\n                        /// Set the timeout_config for the builder\n                        ///\n                        /// ## Examples\n                        ///\n                        /// ```no_run\n                        /// ## use std::time::Duration;\n                        /// use $moduleUseName::config::Config;\n                        /// use $moduleUseName::config::timeout::TimeoutConfig;\n                        ///\n                        /// let timeout_config = TimeoutConfig::builder()\n                        ///     .operation_attempt_timeout(Duration::from_secs(1))\n                        ///     .build();\n                        /// let config = Config::builder().timeout_config(timeout_config).build();\n                        /// ```\n                        pub fn timeout_config(mut self, timeout_config: #{TimeoutConfig}) -> Self {\n                            self.set_timeout_config(Some(timeout_config));\n                            self\n                        }\n\n                        /// Set the timeout_config for the builder.\n                        ///\n                        /// Setting this to `None` has no effect if another source of configuration has set timeouts. If you\n                        /// are attempting to disable timeouts, use [`TimeoutConfig::disabled`](#{TimeoutConfig}::disabled)\n                        ///\n                        ///\n                        /// ## Examples\n                        ///\n                        /// ```no_run\n                        /// ## use std::time::Duration;\n                        /// use $moduleUseName::config::{Builder, Config};\n                        /// use $moduleUseName::config::timeout::TimeoutConfig;\n                        ///\n                        /// fn set_request_timeout(builder: &mut Builder) {\n                        ///     let timeout_config = TimeoutConfig::builder()\n                        ///         .operation_attempt_timeout(Duration::from_secs(1))\n                        ///         .build();\n                        ///     builder.set_timeout_config(Some(timeout_config));\n                        /// }\n                        ///\n                        /// let mut builder = Config::builder();\n                        /// set_request_timeout(&mut builder);\n                        /// let config = builder.build();\n                        /// ```\n                        \"\"\",\n                        *codegenScope,\n                    )\n\n                    // A timeout config can be set from SdkConfig. We want to merge that with a timeout config set here.\n                    // Ideally, we would actually preserve `SdkConfig` as a separate layer (probably by converting it into\n                    // its own runtime plugin). In the short term, this functionality accomplishes that for\n                    // timeout configs.\n                    rustTemplate(\n                        \"\"\"\n                        pub fn set_timeout_config(&mut self, timeout_config: #{Option}<#{TimeoutConfig}>) -> &mut Self {\n                            // passing None has no impact.\n                            let Some(mut timeout_config) = timeout_config else {\n                                return self\n                            };\n\n                            if let Some(base) = self.config.load::<#{TimeoutConfig}>() {\n                                timeout_config.take_defaults_from(base);\n                            }\n                            self.config.store_put(timeout_config);\n                            self\n                        }\n                        \"\"\",\n                        *codegenScope,\n                    )\n\n                    rustTemplate(\n                        \"\"\"\n                        /// Set the partition for retry-related state. When clients share a retry partition, they will\n                        /// also share components such as token buckets and client rate limiters.\n                        /// See the [`RetryPartition`](#{RetryPartition}) documentation for more details.\n                        ///\n                        /// ## Default Behavior\n                        ///\n                        /// When no retry partition is explicitly set, the SDK automatically creates a default retry partition named `$defaultRetryPartition`\n                        /// (or `$defaultRetryPartition-<region>` if a region is configured).\n                        /// All $sdkId clients without an explicit retry partition will share this default partition.\n                        ///\n                        /// ## Notes\n                        ///\n                        /// - This is an advanced setting — most users won't need to modify it.\n                        /// - A configured client rate limiter has no effect unless [`RetryConfig::adaptive`](#{RetryConfig}::adaptive) is used.\n                        ///\n                        /// ## Examples\n                        ///\n                        /// Creating a custom retry partition with a token bucket:\n                        /// ```no_run\n                        /// use $moduleUseName::config::Config;\n                        /// use $moduleUseName::config::retry::{RetryPartition, TokenBucket};\n                        ///\n                        /// let token_bucket = TokenBucket::new(10);\n                        /// let config = Config::builder()\n                        ///     .retry_partition(RetryPartition::custom(\"custom\")\n                        ///         .token_bucket(token_bucket)\n                        ///         .build()\n                        ///     )\n                        ///     .build();\n                        /// ```\n                        ///\n                        /// Configuring a client rate limiter with adaptive retry mode:\n                        /// ```no_run\n                        /// use $moduleUseName::config::Config;\n                        /// use $moduleUseName::config::retry::{ClientRateLimiter, RetryConfig, RetryPartition};\n                        ///\n                        /// let client_rate_limiter = ClientRateLimiter::new(10.0);\n                        /// let config = Config::builder()\n                        ///     .retry_partition(RetryPartition::custom(\"custom\")\n                        ///         .client_rate_limiter(client_rate_limiter)\n                        ///         .build()\n                        ///     )\n                        ///     .retry_config(RetryConfig::adaptive())\n                        ///     .build();\n                        /// ```\n                        pub fn retry_partition(mut self, retry_partition: #{RetryPartition}) -> Self {\n                            self.set_retry_partition(Some(retry_partition));\n                            self\n                        }\n                        \"\"\",\n                        *codegenScope,\n                    )\n\n                    rustTemplate(\n                        \"\"\"\n                        /// Like [`Self::retry_partition`], but takes a mutable reference to the builder and an optional `RetryPartition`\n                        pub fn set_retry_partition(&mut self, retry_partition: #{Option}<#{RetryPartition}>) -> &mut Self {\n                            retry_partition.map(|r| self.config.store_put(r));\n                            self\n                        }\n                        \"\"\",\n                        *codegenScope,\n                    )\n                }\n\n                is ServiceConfig.BuilderFromConfigBag -> {\n                    rustTemplate(\n                        \"${section.builder}.set_retry_config(${section.configBag}.load::<#{RetryConfig}>().cloned());\",\n                        *codegenScope,\n                    )\n                    rustTemplate(\n                        \"${section.builder}.set_timeout_config(${section.configBag}.load::<#{TimeoutConfig}>().cloned());\",\n                        *codegenScope,\n                    )\n                    rustTemplate(\n                        \"${section.builder}.set_retry_partition(${section.configBag}.load::<#{RetryPartition}>().cloned());\",\n                        *codegenScope,\n                    )\n                }\n\n                else -> emptySection\n            }\n        }\n}\n\nclass ResiliencyReExportCustomization(codegenContext: ClientCodegenContext) {\n    private val runtimeConfig = codegenContext.runtimeConfig\n\n    fun extras(rustCrate: RustCrate) {\n        rustCrate.withModule(ClientRustModule.config) {\n            rustTemplate(\n                \"pub use #{sleep}::{Sleep};\",\n                \"sleep\" to RuntimeType.smithyAsync(runtimeConfig).resolve(\"rt::sleep\"),\n            )\n        }\n        rustCrate.withModule(ClientRustModule.Config.retry) {\n            rustTemplate(\n                \"pub use #{types_retry}::{RetryConfig, RetryConfigBuilder, RetryMode, ReconnectMode};\",\n                \"types_retry\" to RuntimeType.smithyTypes(runtimeConfig).resolve(\"retry\"),\n            )\n\n            rustTemplate(\n                \"pub use #{types_retry}::{ClientRateLimiter, RetryPartition, TokenBucket};\",\n                \"types_retry\" to RuntimeType.smithyRuntime(runtimeConfig).resolve(\"client::retries\"),\n            )\n        }\n        rustCrate.withModule(ClientRustModule.Config.timeout) {\n            rustTemplate(\n                \"pub use #{timeout}::{TimeoutConfig, TimeoutConfigBuilder};\",\n                \"timeout\" to RuntimeType.smithyTypes(runtimeConfig).resolve(\"timeout\"),\n            )\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/RetryClassifierConfigCustomization.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.customizations\n\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.OperationSection\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginSection\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.config.ServiceConfig\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\n\nclass RetryClassifierConfigCustomization(codegenContext: ClientCodegenContext) : ConfigCustomization() {\n    private val runtimeConfig = codegenContext.runtimeConfig\n    private val moduleUseName = codegenContext.moduleUseName()\n\n    private val retries = RuntimeType.smithyRuntimeApi(runtimeConfig).resolve(\"client::retries\")\n    private val classifiers = retries.resolve(\"classifiers\")\n    private val codegenScope =\n        arrayOf(\n            \"ClassifyRetry\" to classifiers.resolve(\"ClassifyRetry\"),\n            \"RetryStrategy\" to retries.resolve(\"RetryStrategy\"),\n            \"SharedRetryClassifier\" to classifiers.resolve(\"SharedRetryClassifier\"),\n            \"RetryClassifierPriority\" to classifiers.resolve(\"RetryClassifierPriority\"),\n        )\n\n    override fun section(section: ServiceConfig) =\n        writable {\n            when (section) {\n                ServiceConfig.ConfigImpl ->\n                    rustTemplate(\n                        \"\"\"\n                        /// Returns retry classifiers currently registered by the user.\n                        pub fn retry_classifiers(&self) -> impl Iterator<Item = #{SharedRetryClassifier}> + '_ {\n                            self.runtime_components.retry_classifiers()\n                        }\n                        \"\"\",\n                        *codegenScope,\n                    )\n\n                ServiceConfig.BuilderImpl ->\n                    rustTemplate(\n                        \"\"\"\n                        /// Add type implementing [`ClassifyRetry`](#{ClassifyRetry}) that will be used by the\n                        /// [`RetryStrategy`](#{RetryStrategy}) to determine what responses should be retried.\n                        ///\n                        /// A retry classifier configured by this method will run according to its [priority](#{RetryClassifierPriority}).\n                        ///\n                        /// ## Examples\n                        /// ```no_run\n                        /// ## fn example() {\n                        /// use aws_smithy_runtime_api::client::interceptors::context::InterceptorContext;\n                        /// use aws_smithy_runtime_api::client::orchestrator::OrchestratorError;\n                        /// use aws_smithy_runtime_api::client::retries::classifiers::{\n                        ///     ClassifyRetry, RetryAction, RetryClassifierPriority,\n                        /// };\n                        /// use aws_smithy_types::error::metadata::ProvideErrorMetadata;\n                        /// use aws_smithy_types::retry::ErrorKind;\n                        /// use std::error::Error as StdError;\n                        /// use std::marker::PhantomData;\n                        /// use std::fmt;\n                        /// use $moduleUseName::config::Config;\n                        /// ## ##[derive(Debug)]\n                        /// ## struct SomeOperationError {}\n                        /// ## impl StdError for SomeOperationError {}\n                        /// ## impl fmt::Display for SomeOperationError {\n                        /// ##    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { todo!() }\n                        /// ## }\n                        /// ## impl ProvideErrorMetadata for SomeOperationError {\n                        /// ##    fn meta(&self) -> &$moduleUseName::error::ErrorMetadata { todo!() }\n                        /// ## }\n                        ///\n                        /// const RETRYABLE_ERROR_CODES: &[&str] = &[\n                        ///     // List error codes to be retried here...\n                        /// ];\n                        ///\n                        /// // When classifying at an operation's error type, classifiers require a generic parameter.\n                        /// // When classifying the HTTP response alone, no generic is needed.\n                        /// ##[derive(Debug, Default)]\n                        /// pub struct ExampleErrorCodeClassifier<E> {\n                        ///     _inner: PhantomData<E>,\n                        /// }\n                        ///\n                        /// impl<E> ExampleErrorCodeClassifier<E> {\n                        ///     pub fn new() -> Self {\n                        ///         Self {\n                        ///             _inner: PhantomData,\n                        ///         }\n                        ///     }\n                        /// }\n                        ///\n                        /// impl<E> ClassifyRetry for ExampleErrorCodeClassifier<E>\n                        /// where\n                        ///     // Adding a trait bound for ProvideErrorMetadata allows us to inspect the error code.\n                        ///     E: StdError + ProvideErrorMetadata + Send + Sync + 'static,\n                        /// {\n                        ///     fn classify_retry(&self, ctx: &InterceptorContext) -> RetryAction {\n                        ///         // Check for a result\n                        ///         let output_or_error = ctx.output_or_error();\n                        ///         // Check for an error\n                        ///         let error = match output_or_error {\n                        ///             Some(Ok(_)) | None => return RetryAction::NoActionIndicated,\n                        ///               Some(Err(err)) => err,\n                        ///         };\n                        ///\n                        ///         // Downcast the generic error and extract the code\n                        ///         let error_code = OrchestratorError::as_operation_error(error)\n                        ///             .and_then(|err| err.downcast_ref::<E>())\n                        ///             .and_then(|err| err.code());\n                        ///\n                        ///         // If this error's code is in our list, return an action that tells the RetryStrategy to retry this request.\n                        ///         if let Some(error_code) = error_code {\n                        ///             if RETRYABLE_ERROR_CODES.contains(&error_code) {\n                        ///                 return RetryAction::transient_error();\n                        ///             }\n                        ///         }\n                        ///\n                        ///         // Otherwise, return that no action is indicated i.e. that this classifier doesn't require a retry.\n                        ///         // Another classifier may still classify this response as retryable.\n                        ///         RetryAction::NoActionIndicated\n                        ///     }\n                        ///\n                        ///     fn name(&self) -> &'static str { \"Example Error Code Classifier\" }\n                        /// }\n                        ///\n                        /// let config = Config::builder()\n                        ///     .retry_classifier(ExampleErrorCodeClassifier::<SomeOperationError>::new())\n                        ///     .build();\n                        /// ## }\n                        /// ```\n                        pub fn retry_classifier(mut self, retry_classifier: impl #{ClassifyRetry} + 'static) -> Self {\n                            self.push_retry_classifier(#{SharedRetryClassifier}::new(retry_classifier));\n                            self\n                        }\n\n                        /// Like [`Self::retry_classifier`], but takes a [`SharedRetryClassifier`](#{SharedRetryClassifier}).\n                        pub fn push_retry_classifier(&mut self, retry_classifier: #{SharedRetryClassifier}) -> &mut Self {\n                            self.runtime_components.push_retry_classifier(retry_classifier);\n                            self\n                        }\n\n                        /// Set [`SharedRetryClassifier`](#{SharedRetryClassifier})s for the builder, replacing any that\n                        /// were previously set.\n                        pub fn set_retry_classifiers(&mut self, retry_classifiers: impl IntoIterator<Item = #{SharedRetryClassifier}>) -> &mut Self {\n                            self.runtime_components.set_retry_classifiers(retry_classifiers.into_iter());\n                            self\n                        }\n                        \"\"\",\n                        *codegenScope,\n                    )\n\n                else -> emptySection\n            }\n        }\n}\n\nclass RetryClassifierServiceRuntimePluginCustomization(codegenContext: ClientCodegenContext) : ServiceRuntimePluginCustomization() {\n    private val runtimeConfig = codegenContext.runtimeConfig\n    private val retries = RuntimeType.smithyRuntime(runtimeConfig).resolve(\"client::retries\")\n\n    override fun section(section: ServiceRuntimePluginSection): Writable =\n        writable {\n            when (section) {\n                is ServiceRuntimePluginSection.RegisterRuntimeComponents -> {\n                    section.registerRetryClassifier(this) {\n                        rustTemplate(\n                            \"#{HttpStatusCodeClassifier}::default()\",\n                            \"HttpStatusCodeClassifier\" to retries.resolve(\"classifiers::HttpStatusCodeClassifier\"),\n                        )\n                    }\n                }\n\n                else -> emptySection\n            }\n        }\n}\n\nclass RetryClassifierOperationCustomization(\n    codegenContext: ClientCodegenContext,\n    val operation: OperationShape,\n) : OperationCustomization() {\n    private val runtimeConfig = codegenContext.runtimeConfig\n    private val symbolProvider = codegenContext.symbolProvider\n\n    override fun section(section: OperationSection): Writable =\n        writable {\n            val classifiers = RuntimeType.smithyRuntime(runtimeConfig).resolve(\"client::retries::classifiers\")\n\n            val codegenScope =\n                arrayOf(\n                    *RuntimeType.preludeScope,\n                    \"TransientErrorClassifier\" to classifiers.resolve(\"TransientErrorClassifier\"),\n                    \"ModeledAsRetryableClassifier\" to classifiers.resolve(\"ModeledAsRetryableClassifier\"),\n                    \"OperationError\" to symbolProvider.symbolForOperationError(operation),\n                )\n\n            when (section) {\n                is OperationSection.RetryClassifiers -> {\n                    section.registerRetryClassifier(this) {\n                        rustTemplate(\n                            \"#{TransientErrorClassifier}::<#{OperationError}>::new()\",\n                            *codegenScope,\n                        )\n                    }\n                    section.registerRetryClassifier(this) {\n                        rustTemplate(\n                            \"#{ModeledAsRetryableClassifier}::<#{OperationError}>::new()\",\n                            *codegenScope,\n                        )\n                    }\n                }\n                else -> emptySection\n            }\n        }\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/RetryModeFeatureTrackerRuntimePluginCustomization.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.customizations\n\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginSection\nimport software.amazon.smithy.rust.codegen.core.rustlang.InlineDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\n\nclass RetryModeFeatureTrackerRuntimePluginCustomization(codegenContext: ClientCodegenContext) :\n    ServiceRuntimePluginCustomization() {\n    private val runtimeConfig = codegenContext.runtimeConfig\n\n    override fun section(section: ServiceRuntimePluginSection): Writable =\n        writable {\n            when (section) {\n                is ServiceRuntimePluginSection.RegisterRuntimeComponents -> {\n                    section.registerPermanentInterceptor(runtimeConfig, this) {\n                        rust(\n                            \"#T::new()\",\n                            RuntimeType.forInlineDependency(\n                                InlineDependency.sdkFeatureTracker(runtimeConfig),\n                            ).resolve(\"retry_mode::RetryModeFeatureTrackerInterceptor\"),\n                        )\n                    }\n                }\n\n                else -> emptySection\n            }\n        }\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/SensitiveOutputDecorator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.customizations\n\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.OperationSection\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.SensitiveIndex\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\n\nclass SensitiveOutputDecorator : ClientCodegenDecorator {\n    override val name: String get() = \"SensitiveOutputDecorator\"\n    override val order: Byte get() = 0\n\n    override fun operationCustomizations(\n        codegenContext: ClientCodegenContext,\n        operation: OperationShape,\n        baseCustomizations: List<OperationCustomization>,\n    ): List<OperationCustomization> =\n        baseCustomizations + listOf(SensitiveOutputCustomization(codegenContext, operation))\n}\n\nprivate class SensitiveOutputCustomization(\n    private val codegenContext: ClientCodegenContext,\n    private val operation: OperationShape,\n) : OperationCustomization() {\n    private val sensitiveIndex = SensitiveIndex.of(codegenContext.model)\n\n    override fun section(section: OperationSection): Writable =\n        writable {\n            if (section is OperationSection.AdditionalRuntimePluginConfig && sensitiveIndex.hasSensitiveOutput(operation)) {\n                rustTemplate(\n                    \"\"\"\n                    ${section.newLayerName}.store_put(#{SensitiveOutput});\n                    \"\"\",\n                    \"SensitiveOutput\" to\n                        RuntimeType.smithyRuntimeApiClient(codegenContext.runtimeConfig)\n                            .resolve(\"client::orchestrator::SensitiveOutput\"),\n                )\n            }\n        }\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/StaticSdkFeatureTrackerDecorator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.customizations\n\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginSection\nimport software.amazon.smithy.rust.codegen.core.rustlang.InlineDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\n\n/**\n * A decorator for tracking Smithy SDK features that are enabled according to the model at code generation time.\n *\n * Other Smithy SDK features are typically tracked at runtime by their respective interceptors, because whether\n * they are enabled is not determined until later during the execution.\n */\nclass StaticSdkFeatureTrackerDecorator : ClientCodegenDecorator {\n    override val name: String = \"StaticSdkFeatureTrackerDecorator\"\n    override val order: Byte = 0\n\n    override fun serviceRuntimePluginCustomizations(\n        codegenContext: ClientCodegenContext,\n        baseCustomizations: List<ServiceRuntimePluginCustomization>,\n    ): List<ServiceRuntimePluginCustomization> =\n        baseCustomizations + RpcV2CborFeatureTrackerRuntimePluginCustomization(codegenContext)\n}\n\nprivate class RpcV2CborFeatureTrackerRuntimePluginCustomization(private val codegenContext: ClientCodegenContext) :\n    ServiceRuntimePluginCustomization() {\n    private val rpcV2CborProtocolShapeId = ShapeId.from(\"smithy.protocols#rpcv2Cbor\")\n\n    override fun section(section: ServiceRuntimePluginSection): Writable =\n        writable {\n            when (section) {\n                is ServiceRuntimePluginSection.RegisterRuntimeComponents -> {\n                    if (codegenContext.protocol == rpcV2CborProtocolShapeId) {\n                        section.registerPermanentInterceptor(codegenContext.runtimeConfig, this) {\n                            rustTemplate(\n                                \"#{RpcV2CborFeatureTrackerInterceptor}::new()\",\n                                \"RpcV2CborFeatureTrackerInterceptor\" to\n                                    RuntimeType.forInlineDependency(\n                                        InlineDependency.sdkFeatureTracker(codegenContext.runtimeConfig),\n                                    ).resolve(\"rpc_v2_cbor::RpcV2CborFeatureTrackerInterceptor\"),\n                            )\n                        }\n                    }\n                }\n\n                else -> emptySection\n            }\n        }\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/TimeSourceCustomization.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.customizations\n\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.config.ServiceConfig\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlockTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\n\nclass TimeSourceCustomization(codegenContext: ClientCodegenContext) : ConfigCustomization() {\n    private val codegenScope =\n        arrayOf(\n            *preludeScope,\n            \"IntoShared\" to RuntimeType.smithyRuntimeApi(codegenContext.runtimeConfig).resolve(\"shared::IntoShared\"),\n            \"SharedTimeSource\" to RuntimeType.smithyAsync(codegenContext.runtimeConfig).resolve(\"time::SharedTimeSource\"),\n            \"StaticTimeSource\" to RuntimeType.smithyAsync(codegenContext.runtimeConfig).resolve(\"time::StaticTimeSource\"),\n            \"TimeSource\" to RuntimeType.smithyAsync(codegenContext.runtimeConfig).resolve(\"time::TimeSource\"),\n            \"UNIX_EPOCH\" to RuntimeType.std.resolve(\"time::UNIX_EPOCH\"),\n            \"Duration\" to RuntimeType.std.resolve(\"time::Duration\"),\n        )\n\n    override fun section(section: ServiceConfig) =\n        writable {\n            when (section) {\n                is ServiceConfig.ConfigImpl -> {\n                    rust(\"/// Return time source used for this service.\")\n                    rustBlockTemplate(\n                        \"pub fn time_source(&self) -> #{Option}<#{SharedTimeSource}>\",\n                        *codegenScope,\n                    ) {\n                        rustTemplate(\n                            \"\"\"self.runtime_components.time_source()\"\"\",\n                            *codegenScope,\n                        )\n                    }\n                }\n\n                ServiceConfig.BuilderImpl -> {\n                    rustTemplate(\n                        \"\"\"\n                        /// Sets the time source used for this service\n                        pub fn time_source(\n                            mut self,\n                            time_source: impl #{TimeSource} + 'static,\n                        ) -> Self {\n                            self.set_time_source(#{Some}(#{IntoShared}::into_shared(time_source)));\n                            self\n                        }\n                        \"\"\",\n                        *codegenScope,\n                    )\n\n                    rustTemplate(\n                        \"\"\"\n                        /// Sets the time source used for this service\n                        pub fn set_time_source(\n                            &mut self,\n                            time_source: #{Option}<#{SharedTimeSource}>,\n                        ) -> &mut Self {\n                            self.runtime_components.set_time_source(time_source);\n                            self\n                        }\n                        \"\"\",\n                        *codegenScope,\n                    )\n                }\n\n                ServiceConfig.BuilderBuild -> {\n                    rustTemplate(\n                        \"\"\"\n                        if self.runtime_components.time_source().is_none() {\n                            self.runtime_components.set_time_source(#{Some}(#{Default}::default()));\n                        }\n                        \"\"\",\n                        *codegenScope,\n                    )\n                }\n\n                is ServiceConfig.DefaultForTests -> {\n                    rustTemplate(\n                        \"\"\"\n                        ${section.configBuilderRef}\n                            .set_time_source(#{Some}(#{SharedTimeSource}::new(\n                                #{StaticTimeSource}::new(#{UNIX_EPOCH} + #{Duration}::from_secs(1234567890)))\n                            ));\n                        \"\"\",\n                        *codegenScope,\n                    )\n                }\n\n                else -> emptySection\n            }\n        }\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/ClientCodegenDecorator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.customize\n\nimport software.amazon.smithy.build.PluginContext\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientRustSettings\nimport software.amazon.smithy.rust.codegen.client.smithy.auth.AuthCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.auth.AuthSchemeOption\nimport software.amazon.smithy.rust.codegen.client.smithy.endpoint.EndpointCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.OperationGenerator\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.error.ErrorCustomization\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.CombinedCoreCodegenDecorator\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.CoreCodegenDecorator\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.ProtocolMap\nimport java.util.ServiceLoader\nimport java.util.logging.Logger\n\ntypealias ClientProtocolMap = ProtocolMap<OperationGenerator, ClientCodegenContext>\n\n/**\n * [ClientCodegenDecorator] allows downstream users to customize code generation.\n *\n * For example, AWS-specific code generation generates customizations required to support\n * AWS services. A different downstream customer may wish to add a different set of derive\n * attributes to the generated classes.\n */\ninterface ClientCodegenDecorator : CoreCodegenDecorator<ClientCodegenContext, ClientRustSettings> {\n    fun authSchemeOptions(\n        codegenContext: ClientCodegenContext,\n        baseAuthSchemeOptions: List<AuthSchemeOption>,\n    ): List<AuthSchemeOption> = baseAuthSchemeOptions\n\n    fun configCustomizations(\n        codegenContext: ClientCodegenContext,\n        baseCustomizations: List<ConfigCustomization>,\n    ): List<ConfigCustomization> = baseCustomizations\n\n    fun operationCustomizations(\n        codegenContext: ClientCodegenContext,\n        operation: OperationShape,\n        baseCustomizations: List<OperationCustomization>,\n    ): List<OperationCustomization> = baseCustomizations\n\n    /**\n     * Hook to customize generated errors.\n     */\n    fun errorCustomizations(\n        codegenContext: ClientCodegenContext,\n        baseCustomizations: List<ErrorCustomization>,\n    ): List<ErrorCustomization> = baseCustomizations\n\n    fun protocols(\n        serviceId: ShapeId,\n        currentProtocols: ClientProtocolMap,\n    ): ClientProtocolMap = currentProtocols\n\n    fun authCustomizations(\n        codegenContext: ClientCodegenContext,\n        baseCustomizations: List<AuthCustomization>,\n    ): List<AuthCustomization> = baseCustomizations\n\n    fun endpointCustomizations(codegenContext: ClientCodegenContext): List<EndpointCustomization> = listOf()\n\n    /**\n     * Hook to customize client construction documentation.\n     */\n    fun clientConstructionDocs(\n        codegenContext: ClientCodegenContext,\n        baseDocs: Writable,\n    ): Writable = baseDocs\n\n    /**\n     * Hooks to register additional service-level runtime plugins at codegen time\n     */\n    fun serviceRuntimePluginCustomizations(\n        codegenContext: ClientCodegenContext,\n        baseCustomizations: List<ServiceRuntimePluginCustomization>,\n    ): List<ServiceRuntimePluginCustomization> = baseCustomizations\n}\n\n/**\n * [CombinedClientCodegenDecorator] merges the results of multiple decorators into a single decorator.\n *\n * This makes the actual concrete codegen simpler by not needing to deal with multiple separate decorators.\n */\nopen class CombinedClientCodegenDecorator(decorators: List<ClientCodegenDecorator>) :\n    CombinedCoreCodegenDecorator<ClientCodegenContext, ClientRustSettings, ClientCodegenDecorator>(decorators), ClientCodegenDecorator {\n    override val name: String\n        get() = \"CombinedClientCodegenDecorator\"\n    override val order: Byte\n        get() = 0\n\n    override fun authSchemeOptions(\n        codegenContext: ClientCodegenContext,\n        baseAuthSchemeOptions: List<AuthSchemeOption>,\n    ): List<AuthSchemeOption> =\n        combineCustomizations(baseAuthSchemeOptions) { decorator, authOptions ->\n            decorator.authSchemeOptions(codegenContext, authOptions)\n        }\n\n    override fun configCustomizations(\n        codegenContext: ClientCodegenContext,\n        baseCustomizations: List<ConfigCustomization>,\n    ): List<ConfigCustomization> =\n        combineCustomizations(baseCustomizations) { decorator, customizations ->\n            decorator.configCustomizations(codegenContext, customizations)\n        }\n\n    override fun operationCustomizations(\n        codegenContext: ClientCodegenContext,\n        operation: OperationShape,\n        baseCustomizations: List<OperationCustomization>,\n    ): List<OperationCustomization> =\n        combineCustomizations(baseCustomizations) { decorator, customizations ->\n            decorator.operationCustomizations(codegenContext, operation, customizations)\n        }\n\n    override fun errorCustomizations(\n        codegenContext: ClientCodegenContext,\n        baseCustomizations: List<ErrorCustomization>,\n    ): List<ErrorCustomization> =\n        combineCustomizations(baseCustomizations) { decorator, customizations ->\n            decorator.errorCustomizations(codegenContext, customizations)\n        }\n\n    override fun protocols(\n        serviceId: ShapeId,\n        currentProtocols: ClientProtocolMap,\n    ): ClientProtocolMap =\n        combineCustomizations(currentProtocols) { decorator, protocolMap ->\n            decorator.protocols(serviceId, protocolMap)\n        }\n\n    override fun authCustomizations(\n        codegenContext: ClientCodegenContext,\n        baseCustomizations: List<AuthCustomization>,\n    ): List<AuthCustomization> =\n        combineCustomizations(baseCustomizations) { decorator, customizations ->\n            decorator.authCustomizations(codegenContext, customizations)\n        }\n\n    override fun endpointCustomizations(codegenContext: ClientCodegenContext): List<EndpointCustomization> =\n        addCustomizations { decorator -> decorator.endpointCustomizations(codegenContext) }\n\n    override fun clientConstructionDocs(\n        codegenContext: ClientCodegenContext,\n        baseDocs: Writable,\n    ): Writable =\n        combineCustomizations(baseDocs) { decorator, customizations ->\n            decorator.clientConstructionDocs(codegenContext, customizations)\n        }\n\n    override fun serviceRuntimePluginCustomizations(\n        codegenContext: ClientCodegenContext,\n        baseCustomizations: List<ServiceRuntimePluginCustomization>,\n    ): List<ServiceRuntimePluginCustomization> =\n        combineCustomizations(baseCustomizations) { decorator, customizations ->\n            decorator.serviceRuntimePluginCustomizations(codegenContext, customizations)\n        }\n\n    companion object {\n        fun fromClasspath(\n            context: PluginContext,\n            vararg extras: ClientCodegenDecorator,\n            logger: Logger = Logger.getLogger(\"RustClientCodegenSPILoader\"),\n        ): CombinedClientCodegenDecorator {\n            val decorators =\n                ServiceLoader.load(\n                    ClientCodegenDecorator::class.java,\n                    context.pluginClassLoader.orElse(ClientCodegenDecorator::class.java.classLoader),\n                )\n\n            val filteredDecorators =\n                decorators.asSequence()\n                    .onEach { logger.info(\"Discovered Codegen Decorator: ${it.javaClass.name}\") }\n                    .filter { it.classpathDiscoverable() }\n                    .onEach { logger.info(\"Adding Codegen Decorator: ${it.javaClass.name}\") }\n                    .toList()\n            return CombinedClientCodegenDecorator(filteredDecorators + extras)\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/ConditionalDecorator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.customize\n\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.ServiceShape\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.model.shapes.ToShapeId\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientRustSettings\nimport software.amazon.smithy.rust.codegen.client.smithy.auth.AuthCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.auth.AuthSchemeOption\nimport software.amazon.smithy.rust.codegen.client.smithy.endpoint.EndpointCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.error.ErrorCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.RustCrate\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.AdHocCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.BuilderCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.LibRsCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.ManifestCustomizations\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.StructureCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.error.ErrorImplCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.protocol.ProtocolTestGenerator\n\n/**\n * Delegating decorator that only applies when a condition is true\n */\nopen class ConditionalDecorator(\n    /** Decorator to delegate to */\n    private val delegateTo: ClientCodegenDecorator,\n    private val predicate: (ClientCodegenContext?, ToShapeId?) -> Boolean,\n) : ClientCodegenDecorator {\n    override val name: String = delegateTo.name\n    override val order: Byte = delegateTo.order\n\n    private fun <T> T.maybeApply(\n        codegenContext: ClientCodegenContext? = null,\n        serviceShapeId: ToShapeId? = null,\n        delegatedValue: () -> T,\n    ): T =\n        if (predicate(codegenContext, (serviceShapeId ?: codegenContext?.serviceShape)?.toShapeId())) {\n            delegatedValue()\n        } else {\n            this\n        }\n\n    // This kind of decorator gets explicitly added to the root sdk-codegen decorator\n    override fun classpathDiscoverable(): Boolean = false\n\n    final override fun authSchemeOptions(\n        codegenContext: ClientCodegenContext,\n        baseAuthSchemeOptions: List<AuthSchemeOption>,\n    ): List<AuthSchemeOption> =\n        baseAuthSchemeOptions.maybeApply(codegenContext) {\n            delegateTo.authSchemeOptions(codegenContext, baseAuthSchemeOptions)\n        }\n\n    final override fun builderCustomizations(\n        codegenContext: ClientCodegenContext,\n        baseCustomizations: List<BuilderCustomization>,\n    ): List<BuilderCustomization> =\n        baseCustomizations.maybeApply(codegenContext) {\n            delegateTo.builderCustomizations(codegenContext, baseCustomizations)\n        }\n\n    final override fun configCustomizations(\n        codegenContext: ClientCodegenContext,\n        baseCustomizations: List<ConfigCustomization>,\n    ): List<ConfigCustomization> =\n        baseCustomizations.maybeApply(codegenContext) {\n            delegateTo.configCustomizations(codegenContext, baseCustomizations)\n        }\n\n    final override fun crateManifestCustomizations(codegenContext: ClientCodegenContext): ManifestCustomizations =\n        emptyMap<String, Any?>().maybeApply(codegenContext) {\n            delegateTo.crateManifestCustomizations(codegenContext)\n        }\n\n    final override fun authCustomizations(\n        codegenContext: ClientCodegenContext,\n        baseCustomizations: List<AuthCustomization>,\n    ): List<AuthCustomization> =\n        baseCustomizations.maybeApply(codegenContext) {\n            delegateTo.authCustomizations(codegenContext, baseCustomizations)\n        }\n\n    final override fun endpointCustomizations(codegenContext: ClientCodegenContext): List<EndpointCustomization> =\n        emptyList<EndpointCustomization>().maybeApply(codegenContext) {\n            delegateTo.endpointCustomizations(codegenContext)\n        }\n\n    final override fun errorCustomizations(\n        codegenContext: ClientCodegenContext,\n        baseCustomizations: List<ErrorCustomization>,\n    ): List<ErrorCustomization> =\n        baseCustomizations.maybeApply(codegenContext) {\n            delegateTo.errorCustomizations(codegenContext, baseCustomizations)\n        }\n\n    final override fun errorImplCustomizations(\n        codegenContext: ClientCodegenContext,\n        baseCustomizations: List<ErrorImplCustomization>,\n    ): List<ErrorImplCustomization> =\n        baseCustomizations.maybeApply(codegenContext) {\n            delegateTo.errorImplCustomizations(codegenContext, baseCustomizations)\n        }\n\n    final override fun extras(\n        codegenContext: ClientCodegenContext,\n        rustCrate: RustCrate,\n    ) {\n        maybeApply(codegenContext) {\n            delegateTo.extras(codegenContext, rustCrate)\n        }\n    }\n\n    final override fun libRsCustomizations(\n        codegenContext: ClientCodegenContext,\n        baseCustomizations: List<LibRsCustomization>,\n    ): List<LibRsCustomization> =\n        baseCustomizations.maybeApply(codegenContext) {\n            delegateTo.libRsCustomizations(codegenContext, baseCustomizations)\n        }\n\n    final override fun operationCustomizations(\n        codegenContext: ClientCodegenContext,\n        operation: OperationShape,\n        baseCustomizations: List<OperationCustomization>,\n    ): List<OperationCustomization> =\n        baseCustomizations.maybeApply(codegenContext) {\n            delegateTo.operationCustomizations(codegenContext, operation, baseCustomizations)\n        }\n\n    final override fun protocols(\n        serviceId: ShapeId,\n        currentProtocols: ClientProtocolMap,\n    ): ClientProtocolMap =\n        currentProtocols.maybeApply(serviceShapeId = serviceId) {\n            delegateTo.protocols(serviceId, currentProtocols)\n        }\n\n    final override fun structureCustomizations(\n        codegenContext: ClientCodegenContext,\n        baseCustomizations: List<StructureCustomization>,\n    ): List<StructureCustomization> =\n        baseCustomizations.maybeApply(codegenContext) {\n            delegateTo.structureCustomizations(codegenContext, baseCustomizations)\n        }\n\n    final override fun transformModel(\n        service: ServiceShape,\n        model: Model,\n        settings: ClientRustSettings,\n    ): Model =\n        model.maybeApply(serviceShapeId = service) {\n            delegateTo.transformModel(service, model, settings)\n        }\n\n    final override fun serviceRuntimePluginCustomizations(\n        codegenContext: ClientCodegenContext,\n        baseCustomizations: List<ServiceRuntimePluginCustomization>,\n    ): List<ServiceRuntimePluginCustomization> =\n        baseCustomizations.maybeApply(codegenContext) {\n            delegateTo.serviceRuntimePluginCustomizations(codegenContext, baseCustomizations)\n        }\n\n    final override fun protocolTestGenerator(\n        codegenContext: ClientCodegenContext,\n        baseGenerator: ProtocolTestGenerator,\n    ): ProtocolTestGenerator =\n        baseGenerator.maybeApply(codegenContext) {\n            delegateTo.protocolTestGenerator(codegenContext, baseGenerator)\n        }\n\n    final override fun extraSections(codegenContext: ClientCodegenContext): List<AdHocCustomization> =\n        listOf<AdHocCustomization>().maybeApply(codegenContext) {\n            delegateTo.extraSections(codegenContext)\n        }\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/RequiredCustomizations.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.customize\n\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule\nimport software.amazon.smithy.rust.codegen.client.smithy.customizations.AuthEndpointOrchestrationV2MarkerCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.customizations.ConnectionPoisoningRuntimePluginCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.customizations.HttpChecksumRequiredGenerator\nimport software.amazon.smithy.rust.codegen.client.smithy.customizations.IdentityCacheConfigCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.customizations.InterceptorConfigCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.customizations.MetadataCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.customizations.RequestCompressionGenerator\nimport software.amazon.smithy.rust.codegen.client.smithy.customizations.ResiliencyConfigCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.customizations.ResiliencyReExportCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.customizations.RetryClassifierConfigCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.customizations.RetryClassifierOperationCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.customizations.RetryClassifierServiceRuntimePluginCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.customizations.RetryModeFeatureTrackerRuntimePluginCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.customizations.TimeSourceCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization\nimport software.amazon.smithy.rust.codegen.core.rustlang.Feature\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RustCrate\nimport software.amazon.smithy.rust.codegen.core.smithy.customizations.AllowLintsCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.customizations.CrateVersionCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.customizations.pubUseSmithyPrimitives\nimport software.amazon.smithy.rust.codegen.core.smithy.customizations.pubUseSmithyPrimitivesEventStream\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.LibRsCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.operationBuildError\n\nval TestUtilFeature = Feature(\"test-util\", false, listOf())\n\n/**\n * A set of customizations that are included in all protocols.\n *\n * This exists as a convenient place to gather these modifications, these are not true customizations.\n */\nclass RequiredCustomizations : ClientCodegenDecorator {\n    override val name: String = \"Required\"\n    override val order: Byte = -1\n\n    override fun operationCustomizations(\n        codegenContext: ClientCodegenContext,\n        operation: OperationShape,\n        baseCustomizations: List<OperationCustomization>,\n    ): List<OperationCustomization> =\n        baseCustomizations +\n            MetadataCustomization(codegenContext, operation) +\n            HttpChecksumRequiredGenerator(codegenContext, operation) +\n            RetryClassifierOperationCustomization(codegenContext, operation) +\n            RequestCompressionGenerator(codegenContext, operation)\n\n    override fun configCustomizations(\n        codegenContext: ClientCodegenContext,\n        baseCustomizations: List<ConfigCustomization>,\n    ): List<ConfigCustomization> =\n        baseCustomizations +\n            ResiliencyConfigCustomization(codegenContext) +\n            IdentityCacheConfigCustomization(codegenContext) +\n            InterceptorConfigCustomization(codegenContext) +\n            TimeSourceCustomization(codegenContext) +\n            RetryClassifierConfigCustomization(codegenContext)\n\n    override fun libRsCustomizations(\n        codegenContext: ClientCodegenContext,\n        baseCustomizations: List<LibRsCustomization>,\n    ): List<LibRsCustomization> = baseCustomizations + AllowLintsCustomization()\n\n    override fun extras(\n        codegenContext: ClientCodegenContext,\n        rustCrate: RustCrate,\n    ) {\n        val rc = codegenContext.runtimeConfig\n\n        // Add rt-tokio feature for `ByteStream::from_path`\n        rustCrate.mergeFeature(\n            Feature(\n                \"rt-tokio\",\n                true,\n                listOf(\"aws-smithy-async/rt-tokio\", \"aws-smithy-types/rt-tokio\"),\n            ),\n        )\n\n        rustCrate.mergeFeature(TestUtilFeature)\n\n        // Re-export resiliency types\n        ResiliencyReExportCustomization(codegenContext).extras(rustCrate)\n\n        rustCrate.withModule(ClientRustModule.primitives) {\n            pubUseSmithyPrimitives(codegenContext, codegenContext.model, rustCrate)(this)\n        }\n        rustCrate.withModule(ClientRustModule.Primitives.EventStream) {\n            pubUseSmithyPrimitivesEventStream(codegenContext, codegenContext.model)(this)\n        }\n        rustCrate.withModule(ClientRustModule.Error) {\n            rustTemplate(\n                \"\"\"\n                /// Error type returned by the client.\n                pub type SdkError<E, R = #{R}> = #{SdkError}<E, R>;\n                pub use #{BuildError};\n                pub use #{ConnectorError};\n\n                pub use #{DisplayErrorContext};\n                pub use #{ProvideErrorMetadata};\n                pub use #{ErrorMetadata};\n                \"\"\",\n                \"DisplayErrorContext\" to RuntimeType.smithyTypes(rc).resolve(\"error::display::DisplayErrorContext\"),\n                \"ProvideErrorMetadata\" to RuntimeType.smithyTypes(rc).resolve(\"error::metadata::ProvideErrorMetadata\"),\n                \"ErrorMetadata\" to RuntimeType.smithyTypes(rc).resolve(\"error::metadata::ErrorMetadata\"),\n                \"R\" to RuntimeType.smithyRuntimeApiClient(rc).resolve(\"client::orchestrator::HttpResponse\"),\n                \"SdkError\" to RuntimeType.sdkError(rc),\n                // this can't use the auto-rexport because the builder generator is defined in codegen core\n                \"BuildError\" to rc.operationBuildError(),\n                \"ConnectorError\" to RuntimeType.smithyRuntimeApi(rc).resolve(\"client::result::ConnectorError\"),\n            )\n        }\n\n        ClientRustModule.Meta.also { metaModule ->\n            rustCrate.withModule(metaModule) {\n                CrateVersionCustomization.extras(rustCrate, metaModule)\n            }\n        }\n    }\n\n    override fun serviceRuntimePluginCustomizations(\n        codegenContext: ClientCodegenContext,\n        baseCustomizations: List<ServiceRuntimePluginCustomization>,\n    ): List<ServiceRuntimePluginCustomization> =\n        baseCustomizations +\n            ConnectionPoisoningRuntimePluginCustomization(codegenContext) +\n            RetryClassifierServiceRuntimePluginCustomization(codegenContext) +\n            RetryModeFeatureTrackerRuntimePluginCustomization(codegenContext) +\n            AuthEndpointOrchestrationV2MarkerCustomization(codegenContext)\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/ClientContextConfigCustomization.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.endpoint\n\nimport software.amazon.smithy.codegen.core.Symbol\nimport software.amazon.smithy.model.shapes.BooleanShape\nimport software.amazon.smithy.model.shapes.ListShape\nimport software.amazon.smithy.model.shapes.ShapeType\nimport software.amazon.smithy.model.shapes.StringShape\nimport software.amazon.smithy.rulesengine.traits.ClientContextParamDefinition\nimport software.amazon.smithy.rulesengine.traits.ClientContextParamsTrait\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigParam\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.config.ServiceConfig\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.config.configParamNewtype\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.config.standardConfigParam\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustReservedWords\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.docs\nimport software.amazon.smithy.rust.codegen.core.rustlang.join\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig\nimport software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.util.getTrait\nimport software.amazon.smithy.rust.codegen.core.util.orNull\nimport software.amazon.smithy.rust.codegen.core.util.toPascalCase\nimport software.amazon.smithy.rust.codegen.core.util.toSnakeCase\n\n/**\n * This decorator adds `ClientContextParams` to the service config.\n *\n * This handles injecting parameters like `s3::Accelerate` or `s3::ForcePathStyle`. The resulting parameters become\n * setters on the config builder object.\n */\nclass ClientContextConfigCustomization(ctx: ClientCodegenContext) : ConfigCustomization() {\n    private val runtimeConfig = ctx.runtimeConfig\n    private val configParams =\n        ctx.serviceShape.getTrait<ClientContextParamsTrait>()?.parameters.orEmpty().toList()\n            .map { (key, value) -> fromClientParam(key, value, ctx.symbolProvider, runtimeConfig) }\n    private val decorators = configParams.map { standardConfigParam(it) }\n\n    companion object {\n        fun toSymbol(\n            shapeType: ShapeType,\n            symbolProvider: RustSymbolProvider,\n        ): Symbol =\n            symbolProvider.toSymbol(\n                when (shapeType) {\n                    ShapeType.STRING -> StringShape.builder().id(\"smithy.api#String\").build()\n                    ShapeType.BOOLEAN -> BooleanShape.builder().id(\"smithy.api#Boolean\").build()\n                    ShapeType.LIST -> ListShape.builder().id(\"smithy.api#List\").build()\n                    else -> TODO(\"unsupported type\")\n                },\n            )\n\n        fun fromClientParam(\n            name: String,\n            definition: ClientContextParamDefinition,\n            symbolProvider: RustSymbolProvider,\n            runtimeConfig: RuntimeConfig,\n        ): ConfigParam {\n            val inner = toSymbol(definition.type, symbolProvider)\n            return ConfigParam(\n                RustReservedWords.escapeIfNeeded(name.toSnakeCase()),\n                inner,\n                configParamNewtype(RustReservedWords.escapeIfNeeded(name.toPascalCase()), inner, runtimeConfig),\n                definition.documentation.orNull()?.let { writable { docs(it) } },\n            )\n        }\n    }\n\n    override fun section(section: ServiceConfig): Writable {\n        return decorators.map { it.section(section) }.join(\"\\n\")\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointConfigCustomization.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.endpoint\n\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule\nimport software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators.serviceSpecificEndpointResolver\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.config.ServiceConfig\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\n\n/**\n * Customization which injects an Endpoints 2.0 Endpoint Resolver into the service config struct\n */\ninternal class EndpointConfigCustomization(\n    private val codegenContext: ClientCodegenContext,\n    private val typesGenerator: EndpointTypesGenerator,\n) :\n    ConfigCustomization() {\n    private val runtimeConfig = codegenContext.runtimeConfig\n    private val moduleUseName = codegenContext.moduleUseName()\n    private val epModule = RuntimeType.smithyRuntimeApiClient(runtimeConfig).resolve(\"client::endpoint\")\n    private val epRuntimeModule = RuntimeType.smithyRuntime(runtimeConfig).resolve(\"client::orchestrator::endpoints\")\n\n    private val codegenScope =\n        arrayOf(\n            *preludeScope,\n            \"Params\" to typesGenerator.paramsStruct(),\n            \"Resolver\" to RuntimeType.smithyRuntime(runtimeConfig).resolve(\"client::config_override::Resolver\"),\n            \"SharedEndpointResolver\" to epModule.resolve(\"SharedEndpointResolver\"),\n            \"StaticUriEndpointResolver\" to epRuntimeModule.resolve(\"StaticUriEndpointResolver\"),\n            \"ServiceSpecificResolver\" to codegenContext.serviceSpecificEndpointResolver(),\n            \"IntoShared\" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve(\"shared::IntoShared\"),\n        )\n\n    override fun section(section: ServiceConfig): Writable {\n        return writable {\n            when (section) {\n                is ServiceConfig.ConfigImpl -> {\n                    rustTemplate(\n                        \"\"\"\n                        /// Returns the endpoint resolver.\n                        pub fn endpoint_resolver(&self) -> #{SharedEndpointResolver} {\n                            self.runtime_components.endpoint_resolver().expect(\"resolver defaulted if not set\")\n                        }\n                        \"\"\",\n                        *codegenScope,\n                    )\n                }\n\n                ServiceConfig.BuilderImpl -> {\n                    val endpointModule =\n                        ClientRustModule.Config.endpoint.fullyQualifiedPath()\n                            .replace(\"crate::\", \"$moduleUseName::\")\n                    // if there are no rules, we don't generate a default resolver—we need to also suppress those docs.\n                    val defaultResolverDocs =\n                        if (typesGenerator.defaultResolver() != null) {\n                            \"\"\"///\n                            /// When unset, the client will used a generated endpoint resolver based on the endpoint resolution\n                            /// rules for `$moduleUseName`.\n                            ///\"\"\"\n                        } else {\n                            \"/// This service does not define a default endpoint resolver.\"\n                        }\n                    if (codegenContext.settings.codegenConfig.includeEndpointUrlConfig) {\n                        rustTemplate(\n                            \"\"\"\n                            /// Set the endpoint URL to use when making requests.\n                            ///\n                            /// Note: setting an endpoint URL will replace any endpoint resolver that has been set.\n                            ///\n                            /// ## Panics\n                            /// Panics if an invalid URL is given.\n                            pub fn endpoint_url(mut self, endpoint_url: impl #{Into}<#{String}>) -> Self {\n                                self.set_endpoint_url(#{Some}(endpoint_url.into()));\n                                self\n                            }\n\n                            /// Set the endpoint URL to use when making requests.\n                            ///\n                            /// Note: setting an endpoint URL will replace any endpoint resolver that has been set.\n                            ///\n                            /// ## Panics\n                            /// Panics if an invalid URL is given.\n                            pub fn set_endpoint_url(&mut self, endpoint_url: #{Option}<#{String}>) -> &mut Self {\n                                ##[allow(deprecated)]\n                                self.set_endpoint_resolver(\n                                    endpoint_url.map(|url| {\n                                        #{IntoShared}::into_shared(#{StaticUriEndpointResolver}::uri(url))\n                                    })\n                                );\n                                self\n                            }\n                            \"\"\",\n                            *codegenScope,\n                        )\n                    }\n                    rustTemplate(\n                        \"\"\"\n                        /// Sets the endpoint resolver to use when making requests.\n                        ///\n                        $defaultResolverDocs\n                        ///\n                        /// Note: setting an endpoint resolver will replace any endpoint URL that has been set.\n                        /// This method accepts an endpoint resolver [specific to this service](#{ServiceSpecificResolver}). If you want to\n                        /// provide a shared endpoint resolver, use [`Self::set_endpoint_resolver`].\n                        ///\n                        /// ## Examples\n                        /// Create a custom endpoint resolver that resolves a different endpoing per-stage, e.g. staging vs. production.\n                        /// ```no_run\n                        /// use $endpointModule::{ResolveEndpoint, EndpointFuture, Params, Endpoint};\n                        /// ##[derive(Debug)]\n                        /// struct StageResolver { stage: String }\n                        /// impl ResolveEndpoint for StageResolver {\n                        ///     fn resolve_endpoint(&self, params: &Params) -> EndpointFuture<'_> {\n                        ///         let stage = &self.stage;\n                        ///         EndpointFuture::ready(Ok(Endpoint::builder().url(format!(\"{stage}.myservice.com\")).build()))\n                        ///     }\n                        /// }\n                        /// let resolver = StageResolver { stage: std::env::var(\"STAGE\").unwrap() };\n                        /// let config = $moduleUseName::Config::builder().endpoint_resolver(resolver).build();\n                        /// let client = $moduleUseName::Client::from_conf(config);\n                        /// ```\n                        pub fn endpoint_resolver(mut self, endpoint_resolver: impl #{ServiceSpecificResolver} + 'static) -> Self {\n                            self.set_endpoint_resolver(#{Some}(endpoint_resolver.into_shared_resolver()));\n                            self\n                        }\n\n                        /// Sets the endpoint resolver to use when making requests.\n                        ///\n                        $defaultResolverDocs\n                        \"\"\",\n                        *codegenScope,\n                    )\n\n                    rustTemplate(\n                        \"\"\"\n                        pub fn set_endpoint_resolver(&mut self, endpoint_resolver: #{Option}<#{SharedEndpointResolver}>) -> &mut Self {\n                            self.runtime_components.set_endpoint_resolver(endpoint_resolver);\n                            self\n                        }\n                        \"\"\",\n                        *codegenScope,\n                    )\n                }\n\n                else -> emptySection\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointParamsDecorator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.endpoint\n\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.OperationSection\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\n\n/**\n * Decorator that injects operation-level interceptors that configure an endpoint parameters builder\n * with operation specific information, e.g. a bucket name.\n *\n * Whenever a setter needs to be called on the endpoint parameters builder with operation specific information,\n * this decorator must be used.\n */\nclass EndpointParamsDecorator : ClientCodegenDecorator {\n    override val name: String get() = \"EndpointParamsDecorator\"\n    override val order: Byte get() = 0\n\n    override fun operationCustomizations(\n        codegenContext: ClientCodegenContext,\n        operation: OperationShape,\n        baseCustomizations: List<OperationCustomization>,\n    ): List<OperationCustomization> =\n        baseCustomizations + listOf(EndpointParametersCustomization(codegenContext, operation))\n}\n\nprivate class EndpointParametersCustomization(\n    private val codegenContext: ClientCodegenContext,\n    private val operation: OperationShape,\n) : OperationCustomization() {\n    override fun section(section: OperationSection): Writable =\n        writable {\n            val symbolProvider = codegenContext.symbolProvider\n            val operationName = symbolProvider.toSymbol(operation).name\n            if (section is OperationSection.AdditionalInterceptors) {\n                section.registerPermanentInterceptor(codegenContext.runtimeConfig, this) {\n                    rust(\"${operationName}EndpointParamsInterceptor\")\n                }\n            }\n        }\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointRulesetIndex.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.endpoint\n\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.knowledge.KnowledgeIndex\nimport software.amazon.smithy.model.shapes.ServiceShape\nimport software.amazon.smithy.rulesengine.language.EndpointRuleSet\nimport software.amazon.smithy.rulesengine.traits.EndpointBddTrait\nimport software.amazon.smithy.rulesengine.traits.EndpointRuleSetTrait\nimport software.amazon.smithy.rulesengine.traits.EndpointTestsTrait\nimport software.amazon.smithy.rust.codegen.core.util.getTrait\nimport java.util.concurrent.ConcurrentHashMap\n\n/**\n * Index to ensure that endpoint rulesets are parsed only once\n */\nclass EndpointRulesetIndex : KnowledgeIndex {\n    private val ruleSets: ConcurrentHashMap<ServiceShape, EndpointRuleSet?> = ConcurrentHashMap()\n\n    fun endpointRulesForService(serviceShape: ServiceShape) =\n        ruleSets.computeIfAbsent(\n            serviceShape,\n        ) {\n            serviceShape.getTrait<EndpointRuleSetTrait>()?.ruleSet?.let { EndpointRuleSet.fromNode(it) }\n                ?.also { it.typeCheck() }\n        }\n\n    fun hasEndpointBddTrait(serviceShape: ServiceShape): Boolean = serviceShape.hasTrait(EndpointBddTrait::class.java)\n\n    fun getEndpointBddTrait(serviceShape: ServiceShape): EndpointBddTrait? =\n        serviceShape.getTrait(EndpointBddTrait::class.java).orElse(null)\n\n    fun endpointTests(serviceShape: ServiceShape) =\n        serviceShape.getTrait<EndpointTestsTrait>()?.testCases ?: emptyList()\n\n    companion object {\n        fun of(model: Model): EndpointRulesetIndex {\n            return model.getKnowledge(EndpointRulesetIndex::class.java) { EndpointRulesetIndex() }\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointTypesGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.endpoint\n\nimport software.amazon.smithy.rulesengine.language.EndpointRuleSet\nimport software.amazon.smithy.rulesengine.language.syntax.parameters.Parameter\nimport software.amazon.smithy.rulesengine.language.syntax.parameters.Parameters\nimport software.amazon.smithy.rulesengine.traits.EndpointTestCase\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators.EndpointBddGenerator\nimport software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators.EndpointParamsGenerator\nimport software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators.EndpointResolverGenerator\nimport software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators.EndpointTestGenerator\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\n\n/**\n * Entrypoint for Endpoints 2.0 Code generation\n *\n * This exposes [RuntimeType]s for the individual components of endpoints 2.0\n */\nclass EndpointTypesGenerator(\n    private val codegenContext: ClientCodegenContext,\n    private val rules: EndpointRuleSet?,\n    val tests: List<EndpointTestCase>,\n    private val bddParameters: Parameters?,\n) {\n    val params: Parameters = bddParameters ?: rules?.parameters ?: Parameters.builder().build()\n    private val runtimeConfig = codegenContext.runtimeConfig\n    private val customizations = codegenContext.rootDecorator.endpointCustomizations(codegenContext)\n    private val stdlib =\n        customizations\n            .flatMap { it.customRuntimeFunctions(codegenContext) }\n    private val endpointIndex = EndpointRulesetIndex.of(codegenContext.model)\n\n    companion object {\n        fun fromContext(codegenContext: ClientCodegenContext): EndpointTypesGenerator {\n            val index = EndpointRulesetIndex.of(codegenContext.model)\n\n            // If service has BDD trait, extract parameters from it\n            // TODO(bdd): Make this the default when BDDs published for all models\n            val bddTrait = index.getEndpointBddTrait(codegenContext.serviceShape)\n            if (bddTrait != null) {\n                return EndpointTypesGenerator(\n                    codegenContext,\n                    null,\n                    index.endpointTests(codegenContext.serviceShape),\n                    bddTrait.parameters,\n                )\n            }\n\n            val rulesOrNull = index.endpointRulesForService(codegenContext.serviceShape)\n            return EndpointTypesGenerator(\n                codegenContext,\n                rulesOrNull,\n                index.endpointTests(codegenContext.serviceShape),\n                null,\n            )\n        }\n    }\n\n    fun paramsStruct(): RuntimeType = EndpointParamsGenerator(codegenContext, params).paramsStruct()\n\n    fun paramsBuilder(): RuntimeType = EndpointParamsGenerator(codegenContext, params).paramsBuilder()\n\n    fun defaultResolver(): RuntimeType? =\n        defaultResolverBdd() ?: rules?.let {\n            EndpointResolverGenerator(codegenContext, stdlib).defaultEndpointResolver(\n                it,\n            )\n        }\n\n    fun defaultResolverBdd(): RuntimeType? =\n        endpointIndex.getEndpointBddTrait(codegenContext.serviceShape)?.let {\n            EndpointBddGenerator(\n                codegenContext,\n                it,\n                stdlib,\n            ).generateBddResolver()\n        }\n\n    fun testGenerator(): Writable =\n        // BDD takes priority just like in EndpointDecorator\n        // TODO(bdd): Make this the default when BDDs published for all models\n        defaultResolverBdd()?.let {\n            EndpointTestGenerator(\n                tests,\n                paramsStruct(),\n                it,\n                params,\n                codegenContext = codegenContext,\n            ).generate()\n        } ?: defaultResolver()?.let {\n            EndpointTestGenerator(\n                tests,\n                paramsStruct(),\n                it,\n                params,\n                codegenContext = codegenContext,\n            ).generate()\n        }\n            ?: {}\n\n    /**\n     * Load the builtIn value for [parameter] from the endpoint customizations. If the built-in comes from service config,\n     * [config] refers to `&crate::config::Config`\n     *\n     * Exactly one endpoint customization must provide the value for this builtIn or null is returned.\n     */\n    fun builtInFor(\n        parameter: Parameter,\n        config: String,\n    ): Writable? {\n        val defaultProviders =\n            customizations\n                .mapNotNull { it.loadBuiltInFromServiceConfig(parameter, config) }\n        if (defaultProviders.size > 1) {\n            error(\"Multiple providers provided a value for the builtin $parameter\")\n        }\n        return defaultProviders.firstOrNull()\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecorator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.endpoint\n\nimport software.amazon.smithy.model.node.Node\nimport software.amazon.smithy.rulesengine.language.syntax.parameters.Parameter\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators.CustomRuntimeFunction\nimport software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators.EndpointBddGenerator\nimport software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators.endpointTestsModule\nimport software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators.serviceSpecificEndpointResolver\nimport software.amazon.smithy.rust.codegen.client.smithy.endpoint.rulesgen.SmithyEndpointsStdLib\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginSection\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization\nimport software.amazon.smithy.rust.codegen.core.rustlang.Feature\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RustCrate\n\n/**\n * BuiltInResolver enables potentially external codegen stages to provide sources for `builtIn` parameters.\n * For example, this allows AWS to provide the value for the region builtIn\n * in separate codegen.\n *\n * If this resolver does not recognize the value, it MUST return `null`.\n */\ninterface EndpointCustomization {\n    /**\n     * Provide the default value for [parameter] given a reference to the service config struct ([configRef])\n     *\n     * If this parameter is not recognized, return null.\n     *\n     * Example:\n     * ```kotlin\n     * override fun loadBuiltInFromServiceConfig(parameter: Parameter, configRef: String): Writable? {\n     *     return when (parameter.builtIn) {\n     *         AwsBuiltIns.REGION.builtIn -> writable { rust(\"$configRef.region.as_ref().map(|r|r.as_ref().to_owned())\") }\n     *         else -> null\n     *     }\n     * }\n     * ```\n     */\n    fun loadBuiltInFromServiceConfig(\n        parameter: Parameter,\n        configRef: String,\n    ): Writable? = null\n\n    /**\n     * Set a given builtIn value on the service config builder. If this builtIn is not recognized, return null\n     *\n     * Example:\n     * ```kotlin\n     * override fun setBuiltInOnServiceConfig(name: String, value: Node, configBuilderRef: String): Writable? {\n     *     if (name != AwsBuiltIns.REGION.builtIn.get()) {\n     *         return null\n     *     }\n     *     return writable {\n     *         rustTemplate(\n     *             \"let $configBuilderRef = $configBuilderRef.region(#{Region}::new(${value.expectStringNode().value.dq()}));\",\n     *             \"Region\" to region(codegenContext.runtimeConfig).resolve(\"Region\"),\n     *         )\n     *     }\n     * }\n     * ```\n     */\n\n    fun setBuiltInOnServiceConfig(\n        name: String,\n        value: Node,\n        configBuilderRef: String,\n    ): Writable? = null\n\n    /**\n     * Provide a list of additional endpoints standard library functions that rules can use\n     */\n    fun customRuntimeFunctions(codegenContext: ClientCodegenContext): List<CustomRuntimeFunction> = listOf()\n\n    /**\n     * Allows overriding the `finalize_params` method  in the `ResolveEndpoint` trait within\n     * service-specific EndpointResolver, which is rendered in `serviceSpecificEndpointResolver`.\n     *\n     * `ResolveEndpoint::finalize_params` provides a default no-op implementation,\n     * and this customization enables the implementor to provide an alternative implementation.\n     *\n     * Example:\n     * ```kotlin\n     * override fun serviceSpecificEndpointParamsFinalizer(codegenContext: ClientCodegenContext, params: String): Writable? {\n     *     return writable {\n     *         rustTemplate(\"\"\"\n     *             let identity = $params\n     *                 .get_property_mut::<#{Identity}>();\n     *             // do more things on `params`\n     *         \"\"\",\n     *         \"Identity\" to RuntimeType.smithyRuntimeApiClient(codegenContext.runtimeConfig)\n     *             .resolve(\"client::identity::Identity\"),\n     *         )\n     *     }\n     * }\n     * ```\n     */\n    fun serviceSpecificEndpointParamsFinalizer(\n        codegenContext: ClientCodegenContext,\n        params: String,\n    ): Writable? = null\n\n    /**\n     * Allows injecting validation logic for endpoint parameters into the `ParamsBuilder::build` method.\n     *\n     * e.g. when generating the builder for the endpoint parameters this allows you to insert validation logic before\n     * being finalizing the parameters.\n     *\n     * ```rs\n     * impl ParamsBuilder {\n     *     pub fn build(self) -> ::std::result::Result<crate::config::endpoint::Params, crate::config::endpoint::InvalidParams> {\n     *         <validation logic>\n     *         ...\n     *     }\n     * }\n     *\n     * Example:\n     * ```kotlin\n     *\n     *  override fun endpointParamsBuilderValidator(codegenContext: ClientCodegenContext, parameter: Parameter): Writable? {\n     *  rustTemplate(\"\"\"\n     *      if let Some(region) = self.${parameter.memberName()} {\n     *          if #{is_valid_host_label}(region.as_ref() as &str, false, #{DiagnosticCollector}::new()) {\n     *              return Err(#{ParamsError}::invalid_value(${parameter.memberName().dq()}, \"must be a valid host label\"))\n     *          }\n     *      }\n     *      \"\"\",\n     *          \"is_valid_host_label\" to EndpointsLib.isValidHostLabel,\n     *          \"ParamsError\" to EndpointParamsGenerator.paramsError(),\n     *          \"DiagnosticCollector\" to EndpointsLib.DiagnosticCollector,\n     *       )\n     *   }\n     * ```\n     */\n    fun endpointParamsBuilderValidator(\n        codegenContext: ClientCodegenContext,\n        parameter: Parameter,\n    ): Writable? = null\n}\n\n/**\n * Decorator that injects endpoints 2.0 resolvers throughout the client.\n *\n * 1. Add ClientContext params to the config struct\n * 2. Inject params / endpoint results into the operation properties\n * 3. Set a default endpoint resolver (when available)\n * 4. Create an endpoint params structure/builder\n * 5. Generate endpoint tests (when available)\n *\n * This decorator installs the core standard library functions. It DOES NOT inject the AWS specific functions which\n * must be injected separately.\n *\n * If the service DOES NOT provide custom endpoint rules, this decorator is a no-op.\n */\nclass EndpointsDecorator : ClientCodegenDecorator {\n    override val name: String = \"Endpoints\"\n    override val order: Byte = 0\n\n    override fun endpointCustomizations(codegenContext: ClientCodegenContext): List<EndpointCustomization> {\n        return listOf(\n            object : EndpointCustomization {\n                override fun customRuntimeFunctions(codegenContext: ClientCodegenContext): List<CustomRuntimeFunction> {\n                    return SmithyEndpointsStdLib\n                }\n            },\n        )\n    }\n\n    override fun configCustomizations(\n        codegenContext: ClientCodegenContext,\n        baseCustomizations: List<ConfigCustomization>,\n    ): List<ConfigCustomization> {\n        return baseCustomizations + ClientContextConfigCustomization(codegenContext) +\n            EndpointConfigCustomization(codegenContext, EndpointTypesGenerator.fromContext(codegenContext))\n    }\n\n    override fun serviceRuntimePluginCustomizations(\n        codegenContext: ClientCodegenContext,\n        baseCustomizations: List<ServiceRuntimePluginCustomization>,\n    ): List<ServiceRuntimePluginCustomization> {\n        return baseCustomizations +\n            object : ServiceRuntimePluginCustomization() {\n                override fun section(section: ServiceRuntimePluginSection): Writable {\n                    return when (section) {\n                        is ServiceRuntimePluginSection.RegisterRuntimeComponents ->\n                            writable {\n                                codegenContext.defaultEndpointResolver()?.also { resolver ->\n                                    section.registerEndpointResolver(this, resolver)\n                                }\n                            }\n\n                        else -> emptySection\n                    }\n                }\n            }\n    }\n\n    override fun extras(\n        codegenContext: ClientCodegenContext,\n        rustCrate: RustCrate,\n    ) {\n        val generator = EndpointTypesGenerator.fromContext(codegenContext)\n        rustCrate.withModule(ClientRustModule.Config.endpoint) {\n            withInlineModule(endpointTestsModule(), rustCrate.moduleDocProvider) {\n                generator.testGenerator()(this)\n            }\n        }\n        rustCrate.mergeFeature(\n            Feature(\n                \"gated-tests\",\n                default = false,\n                emptyList(),\n            ),\n        )\n    }\n}\n\n/**\n * Returns the rules-generated endpoint resolver for this service\n *\n * If no endpoint rules are provided, `null` will be returned.\n */\nprivate fun ClientCodegenContext.defaultEndpointResolver(): Writable? {\n    val index = EndpointRulesetIndex.of(this.model)\n\n    // Prioritize BDD trait\n    if (index.hasEndpointBddTrait(this.serviceShape)) {\n        val bddTrait = index.getEndpointBddTrait(this.serviceShape) ?: return null\n        val customizations = this.rootDecorator.endpointCustomizations(this)\n        val stdlib = SmithyEndpointsStdLib + customizations.flatMap { it.customRuntimeFunctions(this) }\n        val bddGenerator = EndpointBddGenerator(this, bddTrait, stdlib)\n        val bddResolver = bddGenerator.generateBddResolver()\n\n        return writable {\n            rustTemplate(\n                \"\"\"{\n                use #{ServiceSpecificResolver};\n                #{BddResolver}::new().into_shared_resolver()\n                }\"\"\",\n                \"ServiceSpecificResolver\" to serviceSpecificEndpointResolver(),\n                \"BddResolver\" to bddResolver,\n            )\n        }\n    }\n\n    // Fall back to rule-based generation\n    val generator = EndpointTypesGenerator.fromContext(this)\n    val defaultResolver = generator.defaultResolver() ?: return null\n    val ctx =\n        arrayOf(\"DefaultResolver\" to defaultResolver, \"ServiceSpecificResolver\" to serviceSpecificEndpointResolver())\n    return writable {\n        rustTemplate(\n            \"\"\"{\n            use #{ServiceSpecificResolver};\n            #{DefaultResolver}::new().into_shared_resolver()\n            }\"\"\",\n            *ctx,\n        )\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/Util.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.endpoint\n\nimport software.amazon.smithy.codegen.core.Symbol\nimport software.amazon.smithy.rulesengine.language.Endpoint\nimport software.amazon.smithy.rulesengine.language.EndpointRuleSet\nimport software.amazon.smithy.rulesengine.language.syntax.Identifier\nimport software.amazon.smithy.rulesengine.language.syntax.expressions.Expression\nimport software.amazon.smithy.rulesengine.language.syntax.expressions.literal.Literal\nimport software.amazon.smithy.rulesengine.language.syntax.parameters.Parameter\nimport software.amazon.smithy.rulesengine.language.syntax.parameters.ParameterType\nimport software.amazon.smithy.rulesengine.language.syntax.rule.Rule\nimport software.amazon.smithy.rulesengine.language.syntax.rule.RuleValueVisitor\nimport software.amazon.smithy.rulesengine.traits.ContextParamTrait\nimport software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators.EndpointStdLib\nimport software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators.FunctionRegistry\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.InlineDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustModule\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustType\nimport software.amazon.smithy.rust.codegen.core.rustlang.toType\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.makeOptional\nimport software.amazon.smithy.rust.codegen.core.smithy.rustType\nimport software.amazon.smithy.rust.codegen.core.smithy.unsafeToRustName\nimport software.amazon.smithy.rust.codegen.core.util.letIf\nimport software.amazon.smithy.rust.codegen.core.util.orNull\n\ndata class Context(\n    val functionRegistry: FunctionRegistry,\n    val runtimeConfig: RuntimeConfig,\n    val isBddMode: Boolean = false,\n)\n\n/**\n * Utility function to convert an [Identifier] into a valid Rust identifier (snake case)\n */\nfun Identifier.rustName(): String {\n    return this.toString().unsafeToRustName()\n}\n\n/**\n * Endpoints standard library\n */\nobject EndpointsLib {\n    val DiagnosticCollector = endpointsLib(\"diagnostic\").toType().resolve(\"DiagnosticCollector\")\n\n    fun partitionResolver(runtimeConfig: RuntimeConfig) =\n        endpointsLib(\"partition\", CargoDependency.smithyJson(runtimeConfig), CargoDependency.RegexLite).toType()\n            .resolve(\"PartitionResolver\")\n\n    fun partition(\n        runtimeConfig: RuntimeConfig,\n        lifetimeName: String = \"a\",\n    ) = endpointsLib(\"partition\", CargoDependency.smithyJson(runtimeConfig), CargoDependency.RegexLite).toType()\n        .resolve(\"Partition<'$lifetimeName>\")\n\n    val substring =\n        endpointsLib(\"substring\", CargoDependency.Proptest).toType().resolve(\"substring\")\n    val isValidHostLabel =\n        endpointsLib(\"host\", CargoDependency.Proptest).toType().resolve(\"is_valid_host_label\")\n    val parseUrl =\n        endpointsLib(\"parse_url\", CargoDependency.Http1x, CargoDependency.Url)\n            .toType()\n            .resolve(\"parse_url\")\n    val split =\n        endpointsLib(\"split\", CargoDependency.Proptest).toType().resolve(\"split\")\n\n    fun url(lifetimeName: String = \"a\") =\n        endpointsLib(\"parse_url\", CargoDependency.Http1x, CargoDependency.Url)\n            .toType()\n            .resolve(\"Url<'$lifetimeName>\")\n\n    val uriEncode =\n        endpointsLib(\"uri_encode\", CargoDependency.PercentEncoding)\n            .toType()\n            .resolve(\"uri_encode\")\n    val coalesce =\n        endpointsLib(\"coalesce\").toType().resolve(\"coalesce!\")\n    val ite =\n        endpointsLib(\"ite\").toType().resolve(\"ite!\")\n    val evaluateBdd =\n        endpointsLib(\"bdd_interpreter\").toType().resolve(\"evaluate_bdd\")\n    val bddNode =\n        endpointsLib(\"bdd_interpreter\").toType().resolve(\"BddNode\")\n\n    val awsParseArn = endpointsLib(\"arn\").toType().resolve(\"parse_arn\")\n\n    fun arn(lifetimeName: String = \"a\") = endpointsLib(\"arn\").toType().resolve(\"Arn<'$lifetimeName>\")\n\n    val awsIsVirtualHostableS3Bucket =\n        endpointsLib(\"s3\", endpointsLib(\"host\"), CargoDependency.RegexLite)\n            .toType()\n            .resolve(\"is_virtual_hostable_s3_bucket\")\n\n    private fun endpointsLib(\n        name: String,\n        vararg additionalDependency: RustDependency,\n    ) = InlineDependency.forRustFile(\n        RustModule.pubCrate(\n            name,\n            parent = EndpointStdLib,\n        ),\n        \"/inlineable/src/endpoint_lib/$name.rs\",\n        *additionalDependency,\n    )\n}\n\nclass Types(runtimeConfig: RuntimeConfig) {\n    private val smithyTypesEndpointModule =\n        RuntimeType.smithyTypes(runtimeConfig).resolve(\"endpoint\")\n    val smithyHttpEndpointModule = RuntimeType.smithyHttp(runtimeConfig).resolve(\"endpoint\")\n    val smithyEndpoint = smithyTypesEndpointModule.resolve(\"Endpoint\")\n    val endpointFuture =\n        RuntimeType.smithyRuntimeApiClient(runtimeConfig)\n            .resolve(\"client::endpoint::EndpointFuture\")\n    private val endpointRtApi =\n        RuntimeType.smithyRuntimeApiClient(runtimeConfig).resolve(\"client::endpoint\")\n    val resolveEndpointError = smithyHttpEndpointModule.resolve(\"ResolveEndpointError\")\n\n    fun toArray() =\n        arrayOf(\n            \"Endpoint\" to smithyEndpoint,\n            \"EndpointFuture\" to endpointFuture,\n            \"SharedEndpointResolver\" to endpointRtApi.resolve(\"SharedEndpointResolver\"),\n            \"EndpointResolverParams\" to endpointRtApi.resolve(\"EndpointResolverParams\"),\n            \"ResolveEndpoint\" to endpointRtApi.resolve(\"ResolveEndpoint\"),\n        )\n}\n\n/**\n * Returns the memberName() for a given [Parameter]\n */\nfun Parameter.memberName(): String {\n    return name.rustName()\n}\n\nfun ContextParamTrait.memberName(): String = this.name.unsafeToRustName()\n\n/**\n * Returns the symbol for a given parameter. This enables [software.amazon.smithy.rust.codegen.core.rustlang.RustWriter] to generate the correct [RustType].\n */\nfun Parameter.symbol(): Symbol {\n    val rustType =\n        when (this.type) {\n            ParameterType.STRING -> RustType.String\n            ParameterType.BOOLEAN -> RustType.Bool\n            ParameterType.STRING_ARRAY -> RustType.Vec(RustType.String)\n            else -> TODO(\"unexpected type: ${this.type}\")\n        }\n    // Parameter return types are always optional\n    return Symbol.builder().rustType(rustType).build().letIf(!this.isRequired) { it.makeOptional() }\n}\n\n/**\n * A class for fetching the set of auth schemes supported by an `EndpointRuleSet`.\n */\nclass AuthSchemeLister : RuleValueVisitor<Set<String>> {\n    companion object {\n        fun authSchemesForRuleset(endpointRuleSet: EndpointRuleSet): Set<String> {\n            return AuthSchemeLister().visitTreeRule(endpointRuleSet.rules)\n        }\n    }\n\n    override fun visitEndpointRule(endpoint: Endpoint): Set<String> {\n        return endpoint.properties\n            .getOrDefault(Identifier.of(\"authSchemes\"), Literal.tupleLiteral(listOf()))\n            .asTupleLiteral()\n            .orNull()\n            ?.let {\n                it.map { authScheme ->\n                    authScheme.asRecordLiteral().get()[Identifier.of(\"name\")]!!\n                        .asStringLiteral()\n                        .get()\n                        .expectLiteral()\n                }\n            }\n            ?.toHashSet()\n            ?: hashSetOf()\n    }\n\n    override fun visitTreeRule(rules: MutableList<Rule>): Set<String> {\n        return rules.map { it.accept(this) }.reduce { a, b -> a.union(b) }\n    }\n\n    override fun visitErrorRule(error: Expression?): Set<String> {\n        return setOf()\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointBddGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators\n\nimport software.amazon.smithy.rulesengine.language.Endpoint\nimport software.amazon.smithy.rulesengine.language.evaluation.type.AnyType\nimport software.amazon.smithy.rulesengine.language.evaluation.type.ArrayType\nimport software.amazon.smithy.rulesengine.language.evaluation.type.BooleanType\nimport software.amazon.smithy.rulesengine.language.evaluation.type.OptionalType\nimport software.amazon.smithy.rulesengine.language.evaluation.type.StringType\nimport software.amazon.smithy.rulesengine.language.evaluation.type.Type\nimport software.amazon.smithy.rulesengine.language.syntax.Identifier\nimport software.amazon.smithy.rulesengine.language.syntax.expressions.Expression\nimport software.amazon.smithy.rulesengine.language.syntax.expressions.ExpressionVisitor\nimport software.amazon.smithy.rulesengine.language.syntax.expressions.Reference\nimport software.amazon.smithy.rulesengine.language.syntax.expressions.Template\nimport software.amazon.smithy.rulesengine.language.syntax.expressions.TemplateVisitor\nimport software.amazon.smithy.rulesengine.language.syntax.expressions.functions.Coalesce\nimport software.amazon.smithy.rulesengine.language.syntax.expressions.functions.FunctionDefinition\nimport software.amazon.smithy.rulesengine.language.syntax.expressions.functions.GetAttr\nimport software.amazon.smithy.rulesengine.language.syntax.expressions.functions.Ite\nimport software.amazon.smithy.rulesengine.language.syntax.expressions.functions.ParseUrl\nimport software.amazon.smithy.rulesengine.language.syntax.expressions.literal.Literal\nimport software.amazon.smithy.rulesengine.language.syntax.expressions.literal.LiteralVisitor\nimport software.amazon.smithy.rulesengine.language.syntax.parameters.Parameter\nimport software.amazon.smithy.rulesengine.language.syntax.parameters.ParameterType\nimport software.amazon.smithy.rulesengine.language.syntax.rule.Condition\nimport software.amazon.smithy.rulesengine.language.syntax.rule.EndpointRule\nimport software.amazon.smithy.rulesengine.language.syntax.rule.ErrorRule\nimport software.amazon.smithy.rulesengine.language.syntax.rule.NoMatchRule\nimport software.amazon.smithy.rulesengine.language.syntax.rule.Rule\nimport software.amazon.smithy.rulesengine.language.syntax.rule.RuleValueVisitor\nimport software.amazon.smithy.rulesengine.traits.EndpointBddTrait\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule\nimport software.amazon.smithy.rust.codegen.client.smithy.endpoint.Context\nimport software.amazon.smithy.rust.codegen.client.smithy.endpoint.EndpointTypesGenerator\nimport software.amazon.smithy.rust.codegen.client.smithy.endpoint.EndpointsLib\nimport software.amazon.smithy.rust.codegen.client.smithy.endpoint.Types\nimport software.amazon.smithy.rust.codegen.client.smithy.endpoint.memberName\nimport software.amazon.smithy.rust.codegen.client.smithy.endpoint.rulesgen.BddExpressionGenerator\nimport software.amazon.smithy.rust.codegen.client.smithy.endpoint.rulesgen.ExpressionGenerator\nimport software.amazon.smithy.rust.codegen.client.smithy.endpoint.rulesgen.Ownership\nimport software.amazon.smithy.rust.codegen.client.smithy.endpoint.rustName\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\nimport software.amazon.smithy.rust.codegen.core.util.dq\n\n/**\n * Generator for BDD-based endpoint resolvers\n */\nclass EndpointBddGenerator(\n    private val codegenContext: ClientCodegenContext,\n    private val bddTrait: EndpointBddTrait,\n    private val stdlib: List<CustomRuntimeFunction>,\n) {\n    private val runtimeConfig = codegenContext.runtimeConfig\n    private val allRefs = AnnotatedRefs.from(bddTrait, runtimeConfig)\n\n    companion object {\n        private const val COND_PREFIX = \"Cond\"\n        private const val RESULT_PREFIX = \"Result\"\n        private const val BINDING_PREFIX = \"binding_\"\n        private const val CONDITION_FN_PREFIX = \"cond_\"\n    }\n\n    private data class GenerationContext(\n        val typeGenerator: EndpointTypesGenerator,\n        val registry: FunctionRegistry,\n        val context: Context,\n        val fnsUsed: List<CustomRuntimeFunction>,\n        val conditionScope: Map<String, Writable>,\n        val additionalArgsSignature: List<Writable>,\n        val conditionCount: Int,\n        val resultCount: Int,\n    )\n\n    private fun generateEnumVariants(\n        count: Int,\n        prefix: String,\n    ): String = (0 until count).joinToString(\",\\n    \") { \"$prefix$it\" }\n\n    private fun generateMatchArms(\n        count: Int,\n        template: (Int) -> String,\n    ): String = (0 until count).joinToString(\",\\n\") { idx -> template(idx) }\n\n    /**\n     * Main entrypoint for creating a BDD based endpoint resolver\n     */\n    private fun generateBddResolverImpl(writer: RustWriter) {\n        val genContext = prepareGenerationContext()\n\n        writer.rustTemplate(\n            \"\"\"\n            #{ResolverStruct:W}\n            #{ConditionFn:W}\n            #{ResultEndpoint:W}\n            #{Nodes:W}\n            #{ConditionContext:W}\n            \"\"\",\n            \"ResolverStruct\" to generateResolverStruct(genContext),\n            \"ConditionFn\" to generateConditionFn(genContext),\n            \"ResultEndpoint\" to generateResultEndpoint(genContext),\n            \"Nodes\" to generateNodeArray(),\n            \"ConditionContext\" to generateContextStruct(),\n        )\n    }\n\n    private fun prepareGenerationContext(): GenerationContext {\n        val conditionCount = bddTrait.conditions.size\n        val resultCount = bddTrait.results.size\n        val typeGenerator = EndpointTypesGenerator.fromContext(codegenContext)\n        val registry = FunctionRegistry(stdlib)\n        val context = Context(registry, runtimeConfig, isBddMode = true)\n\n        // Render conditions to a dummy writer to populate the function registry\n        bddTrait.conditions.forEach { cond ->\n            val bddExpressionGenerator =\n                BddExpressionGenerator(cond, Ownership.Borrowed, context, allRefs, codegenContext)\n            bddExpressionGenerator.generateCondition(cond)(\n                RustWriter.root(),\n            )\n        }\n\n        val fnsUsed = registry.fnsUsed()\n        val additionalArgsSignature = fnsUsed.mapNotNull { it.additionalArgsSignatureBdd() }\n\n        val conditionScope =\n            bddTrait.conditions.withIndex().associate { (idx, cond) ->\n                val bddExpressionGenerator =\n                    BddExpressionGenerator(cond, Ownership.Borrowed, context, allRefs, codegenContext)\n                \"$CONDITION_FN_PREFIX$idx\" to bddExpressionGenerator.generateCondition(cond)\n            }\n\n        return GenerationContext(\n            typeGenerator, registry, context, fnsUsed, conditionScope,\n            additionalArgsSignature, conditionCount, resultCount,\n        )\n    }\n\n    private fun generateResolverStruct(genContext: GenerationContext) =\n        writable {\n            rustTemplate(\n                \"\"\"\n                ##[derive(Debug)]\n                /// The default endpoint resolver.\n                pub struct DefaultResolver {\n                    #{CustomFields}\n                }\n\n                 impl Default for DefaultResolver {\n                    fn default() -> Self {\n                        Self::new()\n                    }\n                 }\n\n                impl DefaultResolver {\n                    /// Create a new DefaultResolver\n                    pub fn new() -> Self {\n                        Self {\n                            #{CustomFieldsInit}\n                        }\n                    }\n\n                    ##[allow(clippy::needless_borrow)]\n                    pub(crate) fn evaluate_fn(\n                        &self,\n                    ) -> impl for<'a> FnMut(\n                        &ConditionFn,\n                        &'a Params,\n                        &mut ConditionContext<'a>,\n                        &mut #{DiagnosticCollector},\n                    ) -> bool\n                           + '_ {\n                        move |cond, params, context, _diagnostic_collector| {\n                            cond.evaluate(\n                                params,\n                                context,\n                                #{CustomFieldsArgs}\n                                _diagnostic_collector,\n                            )\n                        }\n                    }\n\n                    fn resolve_endpoint<'a>(&'a self, params: &'a #{Params}) -> #{Result}<#{SmithyEndpoint}, #{BoxError}> {\n                        let mut diagnostic_collector = #{DiagnosticCollector}::new();\n                        let mut condition_context = ConditionContext::default();\n                        let result = #{EvaluateBdd}(\n                            &NODES,\n                            &CONDITIONS,\n                            &RESULTS,\n                            ${bddTrait.bdd.rootRef},\n                            params,\n                            &mut condition_context,\n                            &mut diagnostic_collector,\n                            self.evaluate_fn(),\n                        );\n\n                        match result {\n                            #{Some}(endpoint) => match endpoint.to_endpoint(params, &condition_context) {\n                                Ok(ep) => Ok(ep),\n                                Err(err) => Err(Box::new(err)),\n                            },\n                            #{None} => #{Err}(Box::new(#{ResolveEndpointError}::message(\"No endpoint rule matched\"))),\n                        }\n                    }\n                }\n\n                impl #{ServiceSpecificEndpointResolver} for DefaultResolver {\n                    fn resolve_endpoint<'a>(&'a self, params: &'a #{Params}) -> #{EndpointFuture}<'a> {\n                        let result = self.resolve_endpoint(params);\n\n                        #{EndpointFuture}::ready(result)\n                    }\n                }\n                \"\"\",\n                *preludeScope,\n                \"BoxError\" to RuntimeType.boxError(runtimeConfig),\n                \"CustomFields\" to\n                    writable {\n                        genContext.fnsUsed.mapNotNull { it.structFieldBdd() }.forEach { rust(\"#W,\", it) }\n                    },\n                \"CustomFieldsArgs\" to\n                    writable {\n                        genContext.fnsUsed.mapNotNull { it.additionalArgsInvocation(\"self\") }\n                            .forEach { rust(\"#W,\", it) }\n                    },\n                \"CustomFieldsInit\" to\n                    writable {\n                        genContext.fnsUsed.mapNotNull { it.structFieldInitBdd() }.forEach { rust(\"#W,\", it) }\n                    },\n                \"DiagnosticCollector\" to EndpointsLib.DiagnosticCollector,\n                \"EvaluateBdd\" to EndpointsLib.evaluateBdd,\n                \"Params\" to genContext.typeGenerator.paramsStruct(),\n                \"ResolveEndpointError\" to Types(runtimeConfig).resolveEndpointError,\n                \"ServiceSpecificEndpointResolver\" to codegenContext.serviceSpecificEndpointResolver(),\n                \"SmithyEndpoint\" to Types(runtimeConfig).smithyEndpoint,\n                *Types(runtimeConfig).toArray(),\n            )\n        }\n\n    private fun generateConditionFn(genContext: GenerationContext) =\n        writable {\n            rustTemplate(\n                \"\"\"\n                ##[derive(Debug)]\n                pub(crate) enum ConditionFn {\n                    ${generateEnumVariants(genContext.conditionCount, COND_PREFIX)}\n                }\n\n                impl ConditionFn {\n                    ##[allow(unused_variables, unused_parens, clippy::double_parens,\n                        clippy::useless_conversion, clippy::bool_comparison, clippy::comparison_to_empty,\n                        clippy::needless_borrow, clippy::useless_asref, )]\n                    fn evaluate<'a>(&self, params: &'a Params, context: &mut ConditionContext<'a>#{AdditionalArgsSigPrefix}#{AdditionalArgsSig}, _diagnostic_collector: &mut #{DiagnosticCollector}) -> bool {\n                        // Param bindings\n                        #{ParamBindings:W}\n\n                        // Non-Param references\n                        #{NonParamRefBindings:W}\n                        match self {\n                            ${generateMatchArms(genContext.conditionCount) { idx -> \"Self::$COND_PREFIX$idx => {#{$CONDITION_FN_PREFIX$idx:W}}\" }}\n                        }\n                    }\n                }\n\n                const CONDITIONS: [ConditionFn; ${genContext.conditionCount}] = [\n                    ${generateEnumVariants(genContext.conditionCount, \"ConditionFn::$COND_PREFIX\")}\n                ];\n                \"\"\",\n                *preludeScope,\n                \"AdditionalArgsSig\" to\n                    writable {\n                        genContext.additionalArgsSignature.forEachIndexed { i, it ->\n                            if (i > 0) rust(\", \")\n                            rust(\"#W\", it)\n                        }\n                    },\n                \"AdditionalArgsSigPrefix\" to writable { if (genContext.additionalArgsSignature.isNotEmpty()) rust(\", \") },\n                \"DiagnosticCollector\" to EndpointsLib.DiagnosticCollector,\n                \"NonParamRefBindings\" to generateNonParamReferences(),\n                \"ParamBindings\" to generateParamBindings(),\n                *genContext.conditionScope.toList().toTypedArray(),\n            )\n        }\n\n    private fun generateResultEndpoint(genContext: GenerationContext) =\n        writable {\n            rustTemplate(\n                \"\"\"\n                ##[derive(Debug, Clone)]\n                enum ResultEndpoint {\n                    ${generateEnumVariants(genContext.resultCount, RESULT_PREFIX)}\n                }\n\n                impl<'a> ResultEndpoint {\n                    ##[allow(unused_variables, clippy::useless_asref)]\n                    fn to_endpoint(&self, params: &'a Params, context: &ConditionContext<'a>) -> #{Result}<#{Endpoint}, #{ResolveEndpointError}> {\n                        match self {\n                            #{ResultArms:W}\n                        }\n                    }\n                }\n\n                const RESULTS: [ResultEndpoint; ${genContext.resultCount}] = [\n                    ${generateEnumVariants(genContext.resultCount, \"ResultEndpoint::$RESULT_PREFIX\")}\n                ];\n                \"\"\",\n                *preludeScope,\n                \"Endpoint\" to Types(runtimeConfig).smithyEndpoint,\n                \"ResolveEndpointError\" to Types(runtimeConfig).resolveEndpointError,\n                \"ResultArms\" to generateResultArmsWithBindings(genContext.context),\n            )\n        }\n\n    /**\n     * Generates bindings for the Params attached to the `endpointBddTrait`\n     */\n    private fun generateParamBindings(forResults: Boolean = false) =\n        writable {\n            bddTrait.parameters.toList().forEach { param ->\n                rust(generateParamBinding(param, forResults))\n            }\n        }\n\n    private fun generateParamBinding(\n        param: Parameter,\n        forResults: Boolean,\n    ): String {\n        val memberName = param.memberName()\n\n        if (!forResults) {\n            return \"let $memberName = &params.$memberName;\"\n        }\n\n        return when {\n            param.isRequired && (param.type == ParameterType.STRING || param.type == ParameterType.STRING_ARRAY) ->\n                \"let $memberName = &params.$memberName;\"\n\n            param.isRequired ->\n                \"let $memberName = params.$memberName;\"\n\n            isStringRef(memberName) ->\n                \"let $memberName = params.$memberName.as_ref().map(|s| s.clone()).unwrap_or_default();\"\n\n            else ->\n                \"let $memberName = params.$memberName.expect(\\\"Guaranteed to have a value by earlier checks.\\\");\"\n        }\n    }\n\n    private fun isStringRef(memberName: String): Boolean {\n        val stringRefs =\n            allRefs.filter { ref -> ref.runtimeType == RuntimeType.String }\n                .map { ref -> ref.name }\n        return stringRefs.contains(memberName)\n    }\n\n    /**\n     * Generates references that do not come from the trait params. These can be set\n     * as part of the evaluation of a Condition. They all start as `None` since they may\n     * never be set.\n     */\n    private fun generateNonParamReferences() =\n        writable {\n            val varRefs = allRefs.variableRefs()\n            varRefs.forEach {\n                rust(\"let ${it.value.name} = &mut context.${it.value.name};\")\n            }\n        }\n\n    /**\n     * Generate the arms of the `Result` match statement with bindings inlined.\n     */\n    private fun generateResultArmsWithBindings(context: Context) =\n        writable {\n            val visitor = RuleVisitor(context)\n            bddTrait.results.forEachIndexed { idx, rule ->\n                // Skip NoMatchRule (index 0), it doesn't support visitor pattern\n                if (rule is NoMatchRule) {\n                    rustTemplate(\n                        \"Self::Result$idx => #{Err}(#{ResolveEndpointError}::message(\\\"No endpoint rule matched\\\")),\\n\",\n                        *preludeScope,\n                        \"ResolveEndpointError\" to Types(runtimeConfig).resolveEndpointError,\n                    )\n                } else {\n                    val usedVars = collectUsedVariables(rule)\n                    val bindings = generateBindingsForVariables(usedVars)\n                    val ruleOutput = rule.accept(visitor)\n                    rustTemplate(\n                        \"\"\"\n                        Self::Result$idx => {\n                            #{bindings:W}\n                            #{output:W}\n                        },\n                        \"\"\",\n                        \"bindings\" to bindings,\n                        \"output\" to ruleOutput,\n                    )\n                }\n            }\n        }\n\n    /**\n     * Collect all variables (params and context refs) used in a rule.\n     */\n    private fun collectUsedVariables(rule: Rule): Set<String> {\n        val usedVars = mutableSetOf<String>()\n\n        // Forward declaration via late init\n        lateinit var collectFromExpression: (Expression) -> Unit\n        lateinit var collectFromLiteral: (Literal) -> Unit\n\n        collectFromLiteral = { literal ->\n            literal.accept(\n                object : LiteralVisitor<Unit> {\n                    override fun visitBoolean(b: Boolean) {}\n\n                    override fun visitString(value: Template) {\n                        // For templates, we need to extract the dynamic parts\n                        val parts =\n                            value.accept(\n                                object :\n                                    TemplateVisitor<Expression?> {\n                                    override fun visitStaticTemplate(value: String) = null\n\n                                    override fun visitSingleDynamicTemplate(expr: Expression) = expr\n\n                                    override fun visitStaticElement(str: String) = null\n\n                                    override fun visitDynamicElement(expr: Expression) = expr\n\n                                    override fun startMultipartTemplate() = null\n\n                                    override fun finishMultipartTemplate() = null\n                                },\n                            )\n                        parts.forEach { if (it != null) collectFromExpression(it) }\n                    }\n\n                    override fun visitRecord(members: MutableMap<Identifier, Literal>) {\n                        members.values.forEach { collectFromLiteral(it) }\n                    }\n\n                    override fun visitTuple(members: MutableList<Literal>) {\n                        members.forEach { collectFromLiteral(it) }\n                    }\n\n                    override fun visitInteger(value: Int) {}\n                },\n            )\n        }\n\n        collectFromExpression = { expr ->\n            expr.accept(\n                object : ExpressionVisitor<Unit> {\n                    override fun visitLiteral(literal: Literal) {\n                        collectFromLiteral(literal)\n                    }\n\n                    override fun visitRef(reference: Reference) {\n                        usedVars.add(reference.name.rustName())\n                    }\n\n                    override fun visitGetAttr(getAttr: GetAttr) {\n                        collectFromExpression(getAttr.target)\n                    }\n\n                    override fun visitIsSet(target: Expression) {\n                        collectFromExpression(target)\n                    }\n\n                    override fun visitNot(not: Expression) {\n                        collectFromExpression(not)\n                    }\n\n                    override fun visitBoolEquals(\n                        left: Expression,\n                        right: Expression,\n                    ) {\n                        collectFromExpression(left)\n                        collectFromExpression(right)\n                    }\n\n                    override fun visitStringEquals(\n                        left: Expression,\n                        right: Expression,\n                    ) {\n                        collectFromExpression(left)\n                        collectFromExpression(right)\n                    }\n\n                    override fun visitLibraryFunction(\n                        fn: FunctionDefinition,\n                        args: MutableList<Expression>,\n                    ) {\n                        args.forEach { collectFromExpression(it) }\n                    }\n                },\n            )\n        }\n\n        when (rule) {\n            is EndpointRule -> {\n                val endpoint = rule.endpoint\n                collectFromExpression(endpoint.url)\n                endpoint.headers.values.forEach { values -> values.forEach { collectFromExpression(it) } }\n                endpoint.properties.values.forEach { collectFromExpression(it) }\n            }\n\n            is ErrorRule -> {\n                collectFromExpression(rule.error)\n            }\n        }\n\n        return usedVars\n    }\n\n    /**\n     * Generate bindings for the specified variables.\n     */\n    private fun generateBindingsForVariables(usedVars: Set<String>) =\n        writable {\n            // Generate param bindings for used params\n            bddTrait.parameters.toList().forEach { param ->\n                val memberName = param.memberName()\n                if (usedVars.contains(memberName)) {\n                    rust(generateParamBinding(param, forResults = true) + \"\\n\")\n                }\n            }\n\n            // Generate non-param reference bindings for used refs\n            val varRefs = allRefs.variableRefs()\n            varRefs.values.forEachIndexed { idx, ref ->\n                val rustName = ref.name\n                if (usedVars.contains(rustName)) {\n                    if (allRefs.filter { it.runtimeType == RuntimeType.document(runtimeConfig) }\n                            .map { it.name }.contains(rustName)\n                    ) {\n                        rust(\n                            \"\"\"\n                            let binding_$idx = context.$rustName.as_ref().map(|s| s.clone()).unwrap_or_default();\n                            let $rustName = binding_$idx.as_string().unwrap_or_default();\n\n                            \"\"\".trimIndent(),\n                        )\n                    } else {\n                        rust(\"let $rustName = context.$rustName.as_ref().map(|s| s.clone()).expect(\\\"Guaranteed to have a value by earlier checks.\\\");\\n\")\n                    }\n                }\n            }\n        }\n\n    /**\n     * The rule visitor used to construct the match arms for `ResultEndpoint`\n     */\n    inner class RuleVisitor(private val context: Context) : RuleValueVisitor<Writable> {\n        override fun visitTreeRule(rules: List<Rule>): Writable {\n            throw UnsupportedOperationException(\"Tree rules not supported in BDD endpoint resolver\")\n        }\n\n        override fun visitErrorRule(error: Expression): Writable =\n            writable {\n                rustTemplate(\n                    \"#{Err}(#{ResolveEndpointError}::message(#{message:W}))\",\n                    *preludeScope,\n                    \"ResolveEndpointError\" to Types(runtimeConfig).resolveEndpointError,\n                    \"message\" to ExpressionGenerator(Ownership.Owned, context).generate(error),\n                )\n            }\n\n        override fun visitEndpointRule(endpoint: Endpoint): Writable =\n            writable {\n                rustTemplate(\"#{Ok}(#{endpoint:W})\", *preludeScope, \"endpoint\" to generateEndpoint(endpoint))\n            }\n    }\n\n    /**\n     * Generates an `Endpoint` using an `Endpoint::builder()` and the same `Params`/`ConditionContext`\n     * used in Condition evaluation.\n     */\n    private fun generateEndpoint(endpoint: Endpoint): Writable {\n        val registry = FunctionRegistry(stdlib)\n        val context = Context(registry, runtimeConfig, isBddMode = true)\n        val generator = ExpressionGenerator(Ownership.Owned, context)\n        val url = generator.generate(endpoint.url)\n        val headers = endpoint.headers.mapValues { entry -> entry.value.map { generator.generate(it) } }\n        val properties = endpoint.properties.mapValues { entry -> generator.generate(entry.value) }\n        return writable {\n            rustTemplate(\n                \"#{SmithyEndpoint}::builder().url(#{url:W})\",\n                \"SmithyEndpoint\" to Types(runtimeConfig).smithyEndpoint,\n                \"url\" to url,\n            )\n            headers.forEach { (name, values) -> values.forEach { rust(\".header(${name.dq()}, #W)\", it) } }\n            properties.forEach { (name, value) -> rust(\".property(${name.toString().dq()}, #W)\", value) }\n            rust(\".build()\")\n        }\n    }\n\n    /**\n     * Generate the `ConditionContext` struct that is passed to each condition evaluation.\n     * This allows passing mutable state between the conditions.\n     */\n    private fun generateContextStruct() =\n        writable {\n            val varRefs = allRefs.variableRefs()\n            val registry = FunctionRegistry(stdlib)\n\n            var memberDefs =\n                varRefs.map { entry ->\n                    val ref = entry.value\n                    val rustType = inferContextMemberType(ref, registry)\n                    formatContextMember(ref.name, rustType)\n                }.joinToString(\",\\n\")\n\n            if (memberDefs.isNotEmpty()) {\n                memberDefs += \",\"\n            }\n\n            rustTemplate(\n                \"\"\"\n                // These are all optional since they are set by conditions and will\n                // all be unset when we start evaluation\n                ##[derive(Default)]\n                ##[allow(unused_lifetimes)]\n                pub(crate) struct ConditionContext<'a> {\n                    $memberDefs\n                    // Sometimes none of the members reference the lifetime, this makes it still valid\n                    phantom: std::marker::PhantomData<&'a ()>\n                }\n                \"\"\".trimIndent(),\n            )\n        }\n\n    private fun inferContextMemberType(\n        ref: AnnotatedRefs.AnnotatedRef,\n        registry: FunctionRegistry,\n    ): RuntimeType {\n        val fn = ref.condition?.function ?: throw IllegalArgumentException(\"Variable ref missing condition\")\n        val type = if (ref.type is OptionalType) (ref.type as OptionalType).inner() else ref.type\n\n        return when {\n            fn is GetAttr -> matchRuleTypeToRustType(fn.type(), runtimeConfig)\n            fn is Coalesce -> matchRuleTypeToRustType(fn.type(), runtimeConfig)\n            fn is Ite -> matchRuleTypeToRustType(fn.type(), runtimeConfig)\n            type is StringType -> RuntimeType.String\n            type is BooleanType -> RuntimeType.Bool\n            type is ArrayType -> RuntimeType.typedVec(RuntimeType.String)\n            else ->\n                registry.fnFor(fn.functionDefinition.id)?.returnType()\n                    ?: throw IllegalArgumentException(\"Unsupported reference type $ref\")\n        }\n    }\n\n    private fun formatContextMember(\n        name: String,\n        rustType: RuntimeType,\n    ): String {\n        return if (rustType.namespace.startsWith(\"::std::option::Option<\")) {\n            \"pub(crate) $name: ${rustType.render()}\"\n        } else {\n            \"pub(crate) $name: Option<${rustType.render()}>\"\n        }\n    }\n\n    /**\n     * Generate the array of `BddNode`s that model the evaluation DAG\n     */\n    private fun generateNodeArray() =\n        writable {\n            val bdd = bddTrait.bdd\n            val nodes = mutableListOf<String>()\n            val length = bdd.nodeCount\n\n            bdd.getNodes { condIdx, high, low ->\n                nodes.add(\"#{BddNode} { condition_index: $condIdx, high_ref: $high, low_ref: $low }\")\n            }\n\n            rustTemplate(\n                \"const NODES: [#{BddNode}; $length] = [\\n${nodes.joinToString(\",\\n\")}\\n];\",\n                \"BddNode\" to EndpointsLib.bddNode,\n            )\n        }\n\n    /**\n     * Used for generating tests\n     */\n    fun generateBddResolver(): RuntimeType {\n        return RuntimeType.forInlineFun(\"DefaultResolver\", ClientRustModule.Config.endpoint) {\n            generateBddResolverImpl(this)\n        }\n    }\n}\n\n/**\n * Maps Smithy rule types to Rust runtime types\n */\nclass RustTypeMapper(private val runtimeConfig: RuntimeConfig) {\n    fun mapRuleType(ruleType: Type): RuntimeType =\n        when (ruleType) {\n            is StringType -> RuntimeType.String\n            is BooleanType -> RuntimeType.Bool\n            is ArrayType -> RuntimeType.typedVec(mapRuleType(ruleType.member))\n            is OptionalType -> RuntimeType.typedOption(mapRuleType(ruleType.inner()))\n            is AnyType -> RuntimeType.document(runtimeConfig)\n            else -> throw IllegalArgumentException(\"Unsupported rules type: $ruleType\")\n        }\n\n    fun mapParameterType(paramType: ParameterType): RuntimeType =\n        when (paramType) {\n            ParameterType.STRING -> RuntimeType.String\n            ParameterType.STRING_ARRAY -> RuntimeType.typedVec(RuntimeType.String)\n            ParameterType.BOOLEAN -> RuntimeType.Bool\n        }\n}\n\nfun matchRuleTypeToRustType(\n    ruleType: Type,\n    runtimeConfig: RuntimeConfig,\n): RuntimeType = RustTypeMapper(runtimeConfig).mapRuleType(ruleType)\n\n/**\n * Container for annotated references, these are the variables the condition evaluation can potentially\n * refer to. They come in two variants: Parameters (which are immutable), and Variables (which are all Optional,\n * begin as None, and might be set by a condition during evaluation).\n */\nclass AnnotatedRefs(\n    private val refs: Map<String, AnnotatedRef>,\n) {\n    enum class RefType {\n        Parameter,\n        Variable,\n    }\n\n    data class AnnotatedRef(\n        val name: String,\n        val refType: RefType,\n        val isOptional: Boolean,\n        val runtimeType: RuntimeType,\n        // These two are only present when RefType == Variable\n        val condition: Condition?,\n        val type: Type?,\n    )\n\n    operator fun get(name: String): AnnotatedRef? = refs[name]\n\n    fun filter(predicate: (AnnotatedRef) -> Boolean): List<AnnotatedRef> = refs.values.filter(predicate)\n\n    fun map(transform: (AnnotatedRef) -> String): List<String> = refs.values.map(transform)\n\n    fun variableRefs(): Map<String, AnnotatedRef> = refs.filter { entry -> entry.value.refType == RefType.Variable }\n\n    fun paramRefs(): Map<String, AnnotatedRef> = refs.filter { entry -> entry.value.refType == RefType.Parameter }\n\n    fun allRefs(): Map<String, AnnotatedRef> = refs\n\n    companion object {\n        fun from(\n            bddTrait: EndpointBddTrait,\n            runtimeConfig: RuntimeConfig,\n        ): AnnotatedRefs {\n            val refs = mutableMapOf<String, AnnotatedRef>()\n            val typeMapper = RustTypeMapper(runtimeConfig)\n\n            bddTrait.parameters.forEach { param ->\n                val runtimeType =\n                    param.type?.let { typeMapper.mapParameterType(it) }\n                        ?: throw IllegalArgumentException(\"Unsupported parameter type ${param.type}\")\n\n                refs[param.memberName()] =\n                    AnnotatedRef(\n                        param.memberName(),\n                        RefType.Parameter,\n                        !param.isRequired,\n                        runtimeType,\n                        null,\n                        null,\n                    )\n            }\n\n            bddTrait.conditions.forEach { cond ->\n                val result = cond.result.orElse(null)\n                if (result !== null) {\n                    val returnType =\n                        if (cond.function.functionDefinition.returnType is OptionalType) {\n                            (cond.function.functionDefinition.returnType as OptionalType).inner()\n                        } else {\n                            cond.function.functionDefinition.returnType\n                        }\n\n                    val runtimeType =\n                        when {\n                            cond.function is Coalesce -> matchRuleTypeToRustType(cond.function.type(), runtimeConfig)\n                            cond.function is Ite -> matchRuleTypeToRustType(cond.function.type(), runtimeConfig)\n                            cond.function is GetAttr -> matchRuleTypeToRustType(cond.function.type(), runtimeConfig)\n                            cond.function is ParseUrl -> EndpointsLib.url()\n                            cond.function.name == \"aws.partition\" -> EndpointsLib.partition(runtimeConfig)\n                            cond.function.name == \"aws.parseArn\" -> EndpointsLib.arn()\n                            else -> matchRuleTypeToRustType(returnType, runtimeConfig)\n                        }\n\n                    refs[result.rustName()] =\n                        AnnotatedRef(result.rustName(), RefType.Variable, true, runtimeType, cond, returnType)\n                }\n            }\n\n            return AnnotatedRefs(refs)\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointParamsGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators\n\nimport software.amazon.smithy.rulesengine.language.evaluation.value.ArrayValue\nimport software.amazon.smithy.rulesengine.language.evaluation.value.BooleanValue\nimport software.amazon.smithy.rulesengine.language.evaluation.value.StringValue\nimport software.amazon.smithy.rulesengine.language.evaluation.value.Value\nimport software.amazon.smithy.rulesengine.language.syntax.Identifier\nimport software.amazon.smithy.rulesengine.language.syntax.parameters.Parameters\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule\nimport software.amazon.smithy.rust.codegen.client.smithy.endpoint.memberName\nimport software.amazon.smithy.rust.codegen.client.smithy.endpoint.rustName\nimport software.amazon.smithy.rust.codegen.client.smithy.endpoint.symbol\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute.Companion.derive\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustModule\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustType\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.Visibility\nimport software.amazon.smithy.rust.codegen.core.rustlang.asDeref\nimport software.amazon.smithy.rust.codegen.core.rustlang.docs\nimport software.amazon.smithy.rust.codegen.core.rustlang.isCopy\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlockTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.stripOuter\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\nimport software.amazon.smithy.rust.codegen.core.smithy.isOptional\nimport software.amazon.smithy.rust.codegen.core.smithy.makeOptional\nimport software.amazon.smithy.rust.codegen.core.smithy.mapRustType\nimport software.amazon.smithy.rust.codegen.core.smithy.rustType\nimport software.amazon.smithy.rust.codegen.core.util.dq\nimport software.amazon.smithy.rust.codegen.core.util.orNull\n\n// internals contains the actual resolver function\nfun endpointImplModule() = RustModule.private(\"internals\", parent = ClientRustModule.Config.endpoint)\n\nfun endpointTestsModule() =\n    RustModule.new(\n        \"test\",\n        visibility = Visibility.PRIVATE,\n        parent = ClientRustModule.Config.endpoint,\n        inline = true,\n        documentationOverride = \"\",\n    ).cfgTest()\n\n// stdlib is isolated because it contains code generated names of stdlib functions–we want to ensure we avoid clashing\nval EndpointStdLib = RustModule.private(\"endpoint_lib\")\n\n/** Endpoint Parameters generator.\n *\n * This class generates the `Params` struct for an [EndpointRuleset]. The struct has `pub(crate)` fields, a `Builder`,\n * and an error type, `InvalidParams` that is created to handle when construction fails.\n *\n * The builder of this struct generates a fallible `build()` method because endpoint params MAY have required fields.\n * However, the external parts of this struct (the public accessors) will _always_ be optional to ensure a public\n * interface is maintained.\n *\n * The following snippet contains an example of what is generated (eliding the error):\n *  ```rust\n *  #[non_exhaustive]\n *  #[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]\n *  /// Configuration parameters for resolving the correct endpoint\n *  pub struct Params {\n *      pub(crate) region: std::option::Option<std::string::String>,\n *  }\n *  impl Params {\n *      /// Create a builder for [`Params`]\n *      pub fn builder() -> crate::endpoint::ParamsBuilder {\n *          crate::endpoint::Builder::default()\n *      }\n *      /// Gets the value for region\n *      pub fn region(&self) -> std::option::Option<&str> {\n *          self.region.as_deref()\n *      }\n *  }\n *\n *  /// Builder for [`Params`]\n *  #[derive(std::default::Default, std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]\n *  pub struct ParamsBuilder {\n *      region: std::option::Option<std::string::String>,\n *  }\n *  impl ParamsBuilder {\n *      /// Consume this builder, creating [`Params`].\n *      pub fn build(\n *          self,\n *      ) -> Result<crate::endpoint::Params, crate::endpoint::Error> {\n *          Ok(crate::endpoint::Params {\n *                  region: self.region,\n *          })\n *      }\n *\n *      /// Sets the value for region\n *      pub fn region(mut self, value: std::string::String) -> Self {\n *          self.region = Some(value);\n *          self\n *      }\n *\n *      /// Sets the value for region\n *      pub fn set_region(mut self, param: Option<impl Into<std::string::String>>) -> Self {\n *          self.region = param.map(|t| t.into());\n *          self\n *      }\n *  }\n *  ```\n */\n\nclass EndpointParamsGenerator(\n    private val codegenContext: ClientCodegenContext,\n    private val parameters: Parameters,\n) {\n    companion object {\n        fun memberName(parameterName: String) = Identifier.of(parameterName).rustName()\n\n        fun setterName(parameterName: String) = \"set_${memberName(parameterName)}\"\n\n        fun getterName(parameterName: String) = \"get_${memberName(parameterName)}\"\n\n        fun paramsError(): RuntimeType =\n            RuntimeType.forInlineFun(\"InvalidParams\", ClientRustModule.Config.endpoint) {\n                rust(\n                    \"\"\"\n                    /// An error that occurred during endpoint resolution\n                    ##[derive(Debug)]\n                    pub struct InvalidParams {\n                        field: std::borrow::Cow<'static, str>,\n                        kind: InvalidParamsErrorKind,\n                    }\n\n                    /// The kind of invalid parameter error\n                    ##[derive(Debug)]\n                    enum InvalidParamsErrorKind {\n                        MissingField,\n                        InvalidValue {\n                            message: &'static str,\n                        }\n                    }\n\n                    impl InvalidParams {\n                        ##[allow(dead_code)]\n                        fn missing(field: &'static str) -> Self {\n                            Self { field: field.into(), kind: InvalidParamsErrorKind::MissingField }\n                        }\n\n                        ##[allow(dead_code)]\n                        fn invalid_value(field: &'static str, message: &'static str) -> Self {\n                            Self { field: field.into(), kind: InvalidParamsErrorKind::InvalidValue { message }}\n                        }\n                    }\n\n                    impl std::fmt::Display for InvalidParams {\n                        fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n                            match self.kind {\n                                InvalidParamsErrorKind::MissingField => write!(f, \"a required field was missing: `{}`\", self.field),\n                                InvalidParamsErrorKind::InvalidValue { message} => write!(f, \"invalid value for field: `{}` - {}\", self.field, message),\n                            }\n                        }\n                    }\n\n                    impl std::error::Error for InvalidParams { }\n                    \"\"\",\n                )\n            }\n    }\n\n    fun paramsStruct(): RuntimeType =\n        RuntimeType.forInlineFun(\"Params\", ClientRustModule.Config.endpoint) {\n            generateEndpointsStruct(this)\n        }\n\n    internal fun paramsBuilder(): RuntimeType =\n        RuntimeType.forInlineFun(\"ParamsBuilder\", ClientRustModule.Config.endpoint) {\n            generateEndpointParamsBuilder(this)\n        }\n\n    /**\n     * Generates an endpoints struct based on the provided endpoint rules. The struct fields are `pub(crate)`\n     * with optionality as indicated by the required status of the parameter.\n     */\n    private fun generateEndpointsStruct(writer: RustWriter) {\n        // Ensure that fields can be added in the future\n        Attribute.NonExhaustive.render(writer)\n        // Automatically implement standard Rust functionality\n        Attribute(derive(RuntimeType.Debug, RuntimeType.PartialEq, RuntimeType.Clone)).render(writer)\n        // Generate the struct block:\n        //    pub struct Params {\n        //        ... members: pub(crate) field\n        //    }\n        writer.docs(\"Configuration parameters for resolving the correct endpoint\")\n        writer.rustBlock(\"pub struct Params\") {\n            parameters.toList().forEach { parameter ->\n                // Render documentation for each parameter\n                parameter.documentation.orNull()?.also { docs(it) }\n                rust(\"pub(crate) ${parameter.memberName()}: #T,\", parameter.symbol())\n            }\n        }\n\n        // Generate the impl block for the struct\n        writer.rustBlock(\"impl Params\") {\n            rustTemplate(\n                \"\"\"\n                /// Create a builder for [`Params`]\n                pub fn builder() -> #{Builder} {\n                    #{Builder}::default()\n                }\n                \"\"\",\n                \"Builder\" to paramsBuilder(),\n            )\n            parameters.toList().forEach { parameter ->\n                val name = parameter.memberName()\n                val type = parameter.symbol()\n\n                (parameter.documentation.orNull() ?: \"Gets the value for `$name`\").also { docs(it) }\n                rustTemplate(\n                    \"\"\"\n                    pub fn ${parameter.memberName()}(&self) -> #{paramType} {\n                        #{param:W}\n                    }\n\n                    \"\"\",\n                    \"paramType\" to type.makeOptional().mapRustType { t -> t.asDeref() },\n                    \"param\" to\n                        writable {\n                            when {\n                                type.isOptional() && type.rustType().isCopy() -> rust(\"self.$name\")\n                                type.isOptional() -> rust(\"self.$name.as_deref()\")\n                                type.rustType().isCopy() -> rust(\"Some(self.$name)\")\n                                else -> rust(\"Some(&self.$name)\")\n                            }\n                        },\n                )\n            }\n        }\n    }\n\n    private fun value(value: Value): String {\n        return when (value) {\n            is StringValue -> value.value.dq() + \".to_string()\"\n            is BooleanValue -> value.value.toString()\n            is ArrayValue -> {\n                val elements = value.values.joinToString(\", \") { value(it) }\n                \"vec![$elements]\"\n            }\n\n            else -> TODO(\"unexpected type: $value\")\n        }\n    }\n\n    private fun generateEndpointParamsBuilder(rustWriter: RustWriter) {\n        rustWriter.docs(\"Builder for [`Params`]\")\n        Attribute(derive(RuntimeType.Debug, RuntimeType.Default, RuntimeType.PartialEq, RuntimeType.Clone)).render(\n            rustWriter,\n        )\n        rustWriter.rustBlock(\"pub struct ParamsBuilder\") {\n            parameters.toList().forEach { parameter ->\n                val name = parameter.memberName()\n                val type = parameter.symbol().makeOptional()\n                rust(\"$name: #T,\", type)\n            }\n        }\n\n        rustWriter.rustBlock(\"impl ParamsBuilder\") {\n            docs(\"Consume this builder, creating [`Params`].\")\n            rustBlockTemplate(\n                \"pub fn build(self) -> #{Result}<#{Params}, #{ParamsError}>\",\n                *preludeScope,\n                \"Params\" to paramsStruct(),\n                \"ParamsError\" to paramsError(),\n            ) {\n                // additional validation for endpoint parameters during construction\n                parameters.toList().forEach { parameter ->\n                    val validators =\n                        codegenContext.rootDecorator.endpointCustomizations(codegenContext)\n                            .mapNotNull { it.endpointParamsBuilderValidator(codegenContext, parameter) }\n\n                    validators.forEach { validator ->\n                        rust(\"#W;\", validator)\n                    }\n                }\n\n                val params =\n                    writable {\n                        Attribute.AllowClippyUnnecessaryLazyEvaluations.render(this)\n                        rustBlockTemplate(\"#{Params}\", \"Params\" to paramsStruct()) {\n                            parameters.toList().forEach { parameter ->\n                                rust(\"${parameter.memberName()}: self.${parameter.memberName()}\")\n                                parameter.default.orNull()\n                                    ?.also { default -> rust(\".or_else(||Some(${value(default)}))\") }\n                                if (parameter.isRequired) {\n                                    rustTemplate(\n                                        \".ok_or_else(||#{Error}::missing(${parameter.memberName().dq()}))?\",\n                                        \"Error\" to paramsError(),\n                                    )\n                                }\n                                rust(\",\")\n                            }\n                        }\n                    }\n                rust(\"Ok(#W)\", params)\n            }\n            parameters.toList().forEach { parameter ->\n                val name = parameter.memberName()\n                check(name == memberName(parameter.name.toString()))\n                check(\"set_$name\" == setterName(parameter.name.toString()))\n                val type = parameter.symbol().mapRustType { t -> t.stripOuter<RustType.Option>() }\n                rustTemplate(\n                    \"\"\"\n                    /// Sets the value for $name #{extraDocs:W}\n                    pub fn $name(mut self, value: impl Into<#{type}>) -> Self {\n                        self.$name = Some(value.into());\n                        self\n                    }\n\n                    /// Sets the value for $name #{extraDocs:W}\n                    pub fn set_$name(mut self, param: Option<#{nonOptionalType}>) -> Self {\n                        self.$name = param;\n                        self\n                    }\n                    \"\"\",\n                    \"nonOptionalType\" to parameter.symbol().mapRustType { it.stripOuter<RustType.Option>() },\n                    \"type\" to type,\n                    \"extraDocs\" to\n                        writable {\n                            if (parameter.default.isPresent || parameter.documentation.isPresent) {\n                                docs(\"\")\n                            }\n                            parameter.default.orNull()?.also {\n                                docs(\"When unset, this parameter has a default value of `$it`.\")\n                            }\n                            parameter.documentation.orNull()?.also { docs(it) }\n                        },\n                )\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointParamsInterceptorGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators\n\nimport software.amazon.smithy.jmespath.JmespathExpression\nimport software.amazon.smithy.model.node.ArrayNode\nimport software.amazon.smithy.model.node.BooleanNode\nimport software.amazon.smithy.model.node.Node\nimport software.amazon.smithy.model.node.StringNode\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.traits.EndpointTrait\nimport software.amazon.smithy.rulesengine.language.syntax.parameters.Parameters\nimport software.amazon.smithy.rulesengine.traits.ContextIndex\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.endpoint.ClientContextConfigCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.endpoint.EndpointTypesGenerator\nimport software.amazon.smithy.rust.codegen.client.smithy.endpoint.rustName\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.EndpointTraitBindings\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.config.configParamNewtype\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.config.loadFromConfigBag\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.waiters.RustJmespathShapeTraversalGenerator\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.waiters.TraversalBinding\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.waiters.TraversalContext\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.waiters.TraversedShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustType\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.asRef\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlockTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.withBlockTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.enforceRequired\nimport software.amazon.smithy.rust.codegen.core.smithy.rustType\nimport software.amazon.smithy.rust.codegen.core.util.PANIC\nimport software.amazon.smithy.rust.codegen.core.util.dq\nimport software.amazon.smithy.rust.codegen.core.util.inputShape\nimport software.amazon.smithy.rust.codegen.core.util.orNull\nimport software.amazon.smithy.rust.codegen.core.util.toPascalCase\n\nclass EndpointParamsInterceptorGenerator(\n    private val codegenContext: ClientCodegenContext,\n) {\n    private val model = codegenContext.model\n    private val symbolProvider = codegenContext.symbolProvider\n    private val endpointTypesGenerator = EndpointTypesGenerator.fromContext(codegenContext)\n    private val codegenScope =\n        codegenContext.runtimeConfig.let { rc ->\n            val endpointTypesGenerator = EndpointTypesGenerator.fromContext(codegenContext)\n            val runtimeApi = CargoDependency.smithyRuntimeApiClient(rc).toType()\n            val interceptors = runtimeApi.resolve(\"client::interceptors\")\n            val orchestrator = runtimeApi.resolve(\"client::orchestrator\")\n            arrayOf(\n                *preludeScope,\n                \"BoxError\" to RuntimeType.boxError(rc),\n                \"ConfigBag\" to RuntimeType.configBag(rc),\n                \"ContextAttachedError\" to interceptors.resolve(\"error::ContextAttachedError\"),\n                \"EndpointResolverParams\" to runtimeApi.resolve(\"client::endpoint::EndpointResolverParams\"),\n                \"HttpRequest\" to orchestrator.resolve(\"HttpRequest\"),\n                \"HttpResponse\" to orchestrator.resolve(\"HttpResponse\"),\n                \"Intercept\" to RuntimeType.intercept(rc),\n                \"dyn_dispatch_hint\" to RuntimeType.dynDispatchHint(rc),\n                \"InterceptorContext\" to RuntimeType.interceptorContext(rc),\n                \"BeforeSerializationInterceptorContextRef\" to RuntimeType.beforeSerializationInterceptorContextRef(rc),\n                \"Input\" to interceptors.resolve(\"context::Input\"),\n                \"Output\" to interceptors.resolve(\"context::Output\"),\n                \"Error\" to interceptors.resolve(\"context::Error\"),\n                \"InterceptorError\" to interceptors.resolve(\"error::InterceptorError\"),\n                \"Params\" to endpointTypesGenerator.paramsStruct(),\n            )\n        }\n\n    fun render(\n        writer: RustWriter,\n        operationShape: OperationShape,\n    ) {\n        val operationName = symbolProvider.toSymbol(operationShape).name\n        val operationInput = symbolProvider.toSymbol(operationShape.inputShape(model))\n        val interceptorName = \"${operationName}EndpointParamsInterceptor\"\n        writer.rustTemplate(\n            \"\"\"\n            ##[derive(Debug)]\n            struct $interceptorName;\n\n            ##[#{dyn_dispatch_hint}]\n            impl #{Intercept} for $interceptorName {\n                fn name(&self) -> &'static str {\n                    ${interceptorName.dq()}\n                }\n\n                fn read_before_execution(\n                    &self,\n                    context: &#{BeforeSerializationInterceptorContextRef}<'_, #{Input}, #{Output}, #{Error}>,\n                    cfg: &mut #{ConfigBag},\n                ) -> #{Result}<(), #{BoxError}> {\n                    let _input = context.input()\n                        .downcast_ref::<${operationInput.name}>()\n                        .ok_or(\"failed to downcast to ${operationInput.name}\")?;\n\n                    #{endpoint_prefix:W}\n\n                    let params = #{Params}::builder()\n                        #{param_setters}\n                        .build()\n                        .map_err(|err| #{ContextAttachedError}::new(\"endpoint params could not be built\", err))?;\n                    cfg.interceptor_state().store_put(#{EndpointResolverParams}::new(params));\n                    #{Ok}(())\n                }\n            }\n\n            // The get_* functions below are generated from JMESPath expressions in the\n            // operationContextParams trait. They target the operation's input shape.\n\n            #{jmespath_getters}\n            \"\"\",\n            *codegenScope,\n            \"endpoint_prefix\" to endpointPrefix(operationShape),\n            \"param_setters\" to paramSetters(operationShape, endpointTypesGenerator.params),\n            \"jmespath_getters\" to jmesPathGetters(operationShape),\n        )\n    }\n\n    private fun paramSetters(\n        operationShape: OperationShape,\n        params: Parameters,\n    ) = writable {\n        val idx = ContextIndex.of(codegenContext.model)\n        val memberParams = idx.getContextParams(operationShape).toList().sortedBy { it.first.memberName }\n        val builtInParams = params.toList().filter { it.isBuiltIn }\n        // first load builtins and their defaults\n        builtInParams.forEach { param ->\n            endpointTypesGenerator.builtInFor(param, \"cfg\")?.also { defaultValue ->\n                rust(\".set_${param.name.rustName()}(#W)\", defaultValue)\n            }\n        }\n\n        idx.getClientContextParams(codegenContext.serviceShape).orNull()?.parameters?.forEach { (name, param) ->\n            val setterName = EndpointParamsGenerator.setterName(name)\n            val inner = ClientContextConfigCustomization.toSymbol(param.type, symbolProvider)\n            val newtype = configParamNewtype(name.toPascalCase(), inner, codegenContext.runtimeConfig)\n            rustTemplate(\n                \".$setterName(cfg.#{load_from_service_config_layer})\",\n                \"load_from_service_config_layer\" to loadFromConfigBag(inner.name, newtype),\n            )\n        }\n\n        idx.getStaticContextParams(operationShape).orNull()?.parameters?.forEach { (name, param) ->\n            val setterName = EndpointParamsGenerator.setterName(name)\n            val value = param.value.toWritable()\n            rust(\".$setterName(#W)\", value)\n        }\n\n        idx.getOperationContextParams(operationShape).orNull()?.parameters?.forEach { (name, param) ->\n            val setterName = EndpointParamsGenerator.setterName(name)\n            val getterName = EndpointParamsGenerator.getterName(name)\n            val pathValue = param.path\n            val pathExpression = JmespathExpression.parse(pathValue)\n            val pathTraversal =\n                RustJmespathShapeTraversalGenerator(codegenContext).generate(\n                    pathExpression,\n                    listOf(\n                        TraversalBinding.Global(\n                            \"input\",\n                            TraversedShape.from(model, operationShape.inputShape(model)),\n                        ),\n                    ),\n                    TraversalContext(retainOption = false),\n                )\n\n            when (pathTraversal.outputType) {\n                is RustType.Vec -> {\n                    if (pathTraversal.outputType.member is RustType.Reference) {\n                        rust(\".$setterName($getterName(_input).map(|v| v.into_iter().cloned().collect::<Vec<_>>()))\")\n                    } else {\n                        rust(\".$setterName($getterName(_input))\")\n                    }\n                }\n                else -> rust(\".$setterName($getterName(_input).cloned())\")\n            }\n        }\n\n        // lastly, allow these to be overridden by members\n        memberParams.forEach { (memberShape, param) ->\n            val memberName = codegenContext.symbolProvider.toMemberName(memberShape)\n            val member = memberShape.enforceRequired(writable(\"_input.$memberName.clone()\"), codegenContext)\n\n            rustTemplate(\n                \".${EndpointParamsGenerator.setterName(param.name)}(#{member})\", \"member\" to member,\n            )\n        }\n    }\n\n    private fun jmesPathGetters(operationShape: OperationShape) =\n        writable {\n            val idx = ContextIndex.of(codegenContext.model)\n            val inputShape = operationShape.inputShape(codegenContext.model)\n            val input = symbolProvider.toSymbol(inputShape)\n\n            idx.getOperationContextParams(operationShape).orNull()?.parameters?.forEach { (name, param) ->\n                val getterName = EndpointParamsGenerator.getterName(name)\n                val pathValue = param.path\n                val pathExpression = JmespathExpression.parse(pathValue)\n                val pathTraversal =\n                    RustJmespathShapeTraversalGenerator(codegenContext).generate(\n                        pathExpression,\n                        listOf(\n                            TraversalBinding.Global(\n                                \"input\",\n                                TraversedShape.from(model, operationShape.inputShape(model)),\n                            ),\n                        ),\n                        TraversalContext(retainOption = false),\n                    )\n\n                rust(\"// Generated from JMESPath Expression: $pathValue\")\n                rustBlockTemplate(\n                    \"fn $getterName(input: #{Input}) -> Option<#{Ret}>\",\n                    \"Input\" to input.rustType().asRef(),\n                    \"Ret\" to pathTraversal.outputType,\n                ) {\n                    pathTraversal.output(this)\n                    rust(\"Some(${pathTraversal.identifier})\")\n                }\n            }\n        }\n\n    private fun Node.toWritable(): Writable {\n        val node = this\n        return writable {\n            when (node) {\n                is StringNode -> rust(\"Some(${node.value.dq()}.to_string())\")\n                is BooleanNode -> rust(\"Some(${node.value})\")\n                is ArrayNode -> {\n                    // Cast the elements to a StringNode so this will fail if non-string values are provided\n                    val elms = node.elements.map { \"${(it as StringNode).value.dq()}.to_string()\" }.joinToString(\",\")\n                    rust(\"Some(vec![$elms])\")\n                }\n\n                else -> PANIC(\"unsupported default value: $node\")\n            }\n        }\n    }\n\n    private fun endpointPrefix(operationShape: OperationShape): Writable =\n        writable {\n            operationShape.getTrait(EndpointTrait::class.java).map { epTrait ->\n                val endpointTraitBindings =\n                    EndpointTraitBindings(\n                        codegenContext.model,\n                        symbolProvider,\n                        codegenContext.runtimeConfig,\n                        operationShape,\n                        epTrait,\n                    )\n                withBlockTemplate(\n                    \"let endpoint_prefix = \",\n                    \"\"\".map_err(|err| #{ContextAttachedError}::new(\"endpoint prefix could not be built\", err))?;\"\"\",\n                    *codegenScope,\n                ) {\n                    endpointTraitBindings.render(\n                        this,\n                        \"_input\",\n                    )\n                }\n                rust(\"cfg.interceptor_state().store_put(endpoint_prefix);\")\n            }\n        }\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointResolverGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators\n\nimport software.amazon.smithy.rulesengine.language.Endpoint\nimport software.amazon.smithy.rulesengine.language.EndpointRuleSet\nimport software.amazon.smithy.rulesengine.language.evaluation.type.BooleanType\nimport software.amazon.smithy.rulesengine.language.evaluation.type.OptionalType\nimport software.amazon.smithy.rulesengine.language.syntax.expressions.Expression\nimport software.amazon.smithy.rulesengine.language.syntax.expressions.Reference\nimport software.amazon.smithy.rulesengine.language.syntax.expressions.functions.IsSet\nimport software.amazon.smithy.rulesengine.language.syntax.rule.Condition\nimport software.amazon.smithy.rulesengine.language.syntax.rule.Rule\nimport software.amazon.smithy.rulesengine.language.syntax.rule.RuleValueVisitor\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule\nimport software.amazon.smithy.rust.codegen.client.smithy.endpoint.Context\nimport software.amazon.smithy.rust.codegen.client.smithy.endpoint.EndpointTypesGenerator\nimport software.amazon.smithy.rust.codegen.client.smithy.endpoint.EndpointsLib\nimport software.amazon.smithy.rust.codegen.client.smithy.endpoint.Types\nimport software.amazon.smithy.rust.codegen.client.smithy.endpoint.memberName\nimport software.amazon.smithy.rust.codegen.client.smithy.endpoint.rulesgen.ExpressionGenerator\nimport software.amazon.smithy.rust.codegen.client.smithy.endpoint.rulesgen.Ownership\nimport software.amazon.smithy.rust.codegen.client.smithy.endpoint.rustName\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute.Companion.allow\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.comment\nimport software.amazon.smithy.rust.codegen.core.rustlang.escape\nimport software.amazon.smithy.rust.codegen.core.rustlang.join\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlockTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\nimport software.amazon.smithy.rust.codegen.core.util.dq\nimport software.amazon.smithy.rust.codegen.core.util.orNull\nimport software.amazon.smithy.rust.codegen.core.util.serviceNameOrDefault\n\nabstract class CustomRuntimeFunction {\n    abstract val id: String\n\n    /**\n     * The type returned by the function\n     */\n    abstract fun returnType(): RuntimeType\n\n    /** Initialize the struct field to a default value */\n    abstract fun structFieldInit(): Writable?\n\n    /** Initialize the struct field to a default value for BDD codegen */\n    abstract fun structFieldInitBdd(): Writable?\n\n    /** The argument slot of the runtime function. MUST NOT end with `,`\n     * e.g `partition_data: &PartitionData`\n     * */\n    abstract fun additionalArgsSignature(): Writable?\n\n    /** The argument slot of the runtime function for BDD codegen. Some refs in BDD's require\n     * a lifetime, so this is separate from the version for tree based codegen.\n     *  MUST NOT end with `,`\n     *  e.g `partition_data: &PartitionData`\n     * */\n    abstract fun additionalArgsSignatureBdd(): Writable?\n\n    /**\n     * A writable that passes additional args from `self` into the function.\n     *\n     * - Must match the order of additionalArgsSignature\n     * - Must not end with `,`\n     */\n    abstract fun additionalArgsInvocation(self: String): Writable?\n\n    /**\n     * Any additional struct fields this runtime function adds to the resolver\n     */\n    abstract fun structField(): Writable?\n\n    /**\n     * Any additional struct fields this runtime function adds to the resolver for BDD codegen.\n     */\n    abstract fun structFieldBdd(): Writable?\n\n    /**\n     * Invoking the runtime function—(parens / args not needed): `$fn`\n     *\n     * e.g. `crate::endpoint_lib::uri_encode::uri_encode`\n     *\n     * The function signature must match the standard endpoints function signature:\n     * - arguments in the order matching the spec\n     * - additionalArgsInvocation (if needed)\n     * - &mut DiagnosticCollector\n     */\n    abstract fun usage(): Writable\n}\n\nclass FunctionRegistry(private val functions: List<CustomRuntimeFunction>) {\n    private var usedFunctions = mutableSetOf<CustomRuntimeFunction>()\n\n    fun fnFor(id: String): CustomRuntimeFunction? =\n        functions.firstOrNull { it.id == id }?.also { usedFunctions.add(it) }\n\n    fun fnsUsed(): List<CustomRuntimeFunction> = usedFunctions.toList().sortedBy { it.id }\n}\n\n/**\n * Generate an endpoint resolver struct. The struct may contain additional fields required by the usage of\n * additional functions e.g. `aws.partition` requires a `PartitionResolver` to cache the parsed result of `partitions.json`\n * and to facilitate loading additional partitions at runtime.\n *\n * Additionally, runtime functions will conditionally bring in:\n * 1. resolver configuration (e.g. a custom partitions.json)\n * 2. extra function arguments in the resolver\n * 3. the runtime type of the library function\n *\n * These dependencies are only brought in when the rules actually use these functions.\n *\n * ```rust\n * pub struct DefaultResolver {\n *   partition: PartitionResolver\n * }\n *\n * impl aws_smithy_http::endpoint::ResolveEndpoint<crate::endpoint::Params> for DefaultResolver {\n *     fn resolve_endpoint(&self, params: &Params) -> aws_smithy_http::endpoint::Result {\n *         let mut diagnostic_collector = crate::endpoint_lib::diagnostic::DiagnosticCollector::new();\n *         crate::endpoint::internals::resolve_endpoint(params, &self.partition_resolver, &mut diagnostic_collector)\n *             .map_err(|err| err.with_source(diagnostic_collector.take_last_error()))\n *     }\n * }\n *\n * mod internals {\n *   fn resolve_endpoint(params: &crate::endpoint::Params,\n *      // conditionally inserted, only when used\n *      partition_resolver: &PartitionResolver, _diagnostics: &mut DiagnosticCollector) -> endpoint::Result {\n *      // lots of generated code to actually resolve an endpoint\n *   }\n * }\n * ```\n *\n */\n\ninternal class EndpointResolverGenerator(\n    private val codegenContext: ClientCodegenContext,\n    stdlib: List<CustomRuntimeFunction>,\n) {\n    private val runtimeConfig = codegenContext.runtimeConfig\n    private val registry: FunctionRegistry = FunctionRegistry(stdlib)\n    private val types = Types(runtimeConfig)\n    private val codegenScope =\n        arrayOf(\n            \"BoxError\" to RuntimeType.boxError(runtimeConfig),\n            \"endpoint\" to types.smithyHttpEndpointModule,\n            \"SmithyEndpoint\" to types.smithyEndpoint,\n            \"EndpointFuture\" to types.endpointFuture,\n            \"ResolveEndpointError\" to types.resolveEndpointError,\n            \"EndpointError\" to types.resolveEndpointError,\n            \"ServiceSpecificEndpointResolver\" to codegenContext.serviceSpecificEndpointResolver(),\n            \"DiagnosticCollector\" to EndpointsLib.DiagnosticCollector,\n            *preludeScope,\n        )\n\n    private val allowLintsForResolver =\n        listOf(\n            // we generate if x { if y { if z { ... } } }\n            \"clippy::collapsible_if\",\n            // we generate `if (true) == expr { ... }`\n            \"clippy::bool_comparison\",\n            // we generate `if !(a == b)`\n            \"clippy::nonminimal_bool\",\n            // we generate `if x == \"\" { ... }`\n            \"clippy::comparison_to_empty\",\n            // we generate `if let Some(_) = ... { ... }`\n            \"clippy::redundant_pattern_matching\",\n            // we generate `if (s.as_ref() as &str) == (\"arn:\") { ... }`, and `s` can be either `String` or `&str`\n            \"clippy::useless_asref\",\n        )\n    private val context = Context(registry, runtimeConfig)\n\n    companion object {\n        const val DIAGNOSTIC_COLLECTOR = \"_diagnostic_collector\"\n        private const val PARAMS_NAME = \"_params\"\n    }\n\n    /**\n     * Generates the endpoint resolver struct\n     *\n     * If the rules require a runtime function that has state (e.g., the partition resolver,\n     * the `[CustomRuntimeFunction.structField]`) will insert the required fields into the resolver so that they can\n     * be used later.\n     */\n    fun defaultEndpointResolver(endpointRuleSet: EndpointRuleSet): RuntimeType {\n        check(endpointRuleSet.rules.isNotEmpty()) { \"EndpointRuleset must contain at least one rule.\" }\n        // Here, we play a little trick: we run the resolver and actually render it into a writer. This allows the\n        // function registry to record what functions we actually need. We need to do this, because the functions we\n        // actually use impacts the function signature that we need to return\n        resolverFnBody(endpointRuleSet)(RustWriter.root())\n\n        // Now that we rendered the rules once (and then threw it away) we can see what functions we actually used!\n        val fnsUsed = registry.fnsUsed()\n        return RuntimeType.forInlineFun(\"DefaultResolver\", ClientRustModule.Config.endpoint) {\n            rustTemplate(\n                \"\"\"\n                /// The default endpoint resolver\n                ##[derive(Debug, Default)]\n                pub struct DefaultResolver {\n                    #{custom_fields:W}\n                }\n\n                impl DefaultResolver {\n                    /// Create a new endpoint resolver with default settings\n                    pub fn new() -> Self {\n                        Self { #{custom_fields_init:W} }\n                    }\n\n                    fn resolve_endpoint(&self, params: &#{Params}) -> #{Result}<#{SmithyEndpoint}, #{BoxError}> {\n                        let mut diagnostic_collector = #{DiagnosticCollector}::new();\n                        Ok(#{resolver_fn}(params, &mut diagnostic_collector, #{additional_args})\n                            .map_err(|err|err.with_source(diagnostic_collector.take_last_error()))?)\n                    }\n                }\n\n                impl #{ServiceSpecificEndpointResolver} for DefaultResolver {\n                    fn resolve_endpoint(&self, params: &#{Params}) -> #{EndpointFuture}<'_> {\n                        #{EndpointFuture}::ready(self.resolve_endpoint(params))\n                    }\n                }\n                \"\"\",\n                \"custom_fields\" to fnsUsed.mapNotNull { it.structField() }.join(\",\"),\n                \"custom_fields_init\" to fnsUsed.mapNotNull { it.structFieldInit() }.join(\",\"),\n                \"Params\" to EndpointParamsGenerator(codegenContext, endpointRuleSet.parameters).paramsStruct(),\n                \"additional_args\" to fnsUsed.mapNotNull { it.additionalArgsInvocation(\"self\") }.join(\",\"),\n                \"resolver_fn\" to resolverFn(endpointRuleSet, fnsUsed),\n                *codegenScope,\n            )\n        }\n    }\n\n    private fun resolverFn(\n        endpointRuleSet: EndpointRuleSet,\n        fnsUsed: List<CustomRuntimeFunction>,\n    ): RuntimeType {\n        return RuntimeType.forInlineFun(\"resolve_endpoint\", endpointImplModule()) {\n            Attribute(allow(allowLintsForResolver)).render(this)\n            rustTemplate(\n                \"\"\"\n                pub(super) fn resolve_endpoint($PARAMS_NAME: &#{Params}, $DIAGNOSTIC_COLLECTOR: &mut #{DiagnosticCollector}, #{additional_args}) -> #{endpoint}::Result {\n                  #{body:W}\n                }\n\n                \"\"\",\n                *codegenScope,\n                \"Params\" to EndpointParamsGenerator(codegenContext, endpointRuleSet.parameters).paramsStruct(),\n                \"additional_args\" to fnsUsed.mapNotNull { it.additionalArgsSignature() }.join(\",\"),\n                \"body\" to resolverFnBody(endpointRuleSet),\n            )\n        }\n    }\n\n    private fun resolverFnBody(endpointRuleSet: EndpointRuleSet) =\n        writable {\n            endpointRuleSet.parameters.toList().forEach {\n                Attribute.AllowUnusedVariables.render(this)\n                rust(\"let ${it.memberName()} = &$PARAMS_NAME.${it.memberName()};\")\n            }\n            generateRulesList(endpointRuleSet.rules)(this)\n        }\n\n    private fun generateRulesList(rules: List<Rule>) =\n        writable {\n            rules.forEach { rule ->\n                rule.documentation.orNull()?.also { comment(escape(it)) }\n                generateRule(rule)(this)\n            }\n            if (!isExhaustive(rules.last())) {\n                // it's hard to figure out if these are always needed or not\n                Attribute.AllowUnreachableCode.render(this)\n                rustTemplate(\n                    \"\"\"return Err(#{EndpointError}::message(format!(\"No rules matched these parameters. This is a bug. {$PARAMS_NAME:?}\")));\"\"\",\n                    *codegenScope,\n                )\n            }\n        }\n\n    private fun isExhaustive(rule: Rule): Boolean =\n        rule.conditions.isEmpty() ||\n            rule.conditions.all {\n                when (it.function.type()) {\n                    is BooleanType -> false\n                    is OptionalType -> false\n                    else -> true\n                }\n            }\n\n    private fun generateRule(rule: Rule): Writable {\n        return generateRuleInternal(rule, rule.conditions)\n    }\n\n    /**\n     * deal with the actual target of the condition but flattening through isSet\n     */\n    private fun Condition.targetFunction(): Expression {\n        return when (val fn = this.function) {\n            is IsSet -> fn.arguments[0]\n            else -> fn\n        }\n    }\n\n    /**\n     * Recursive function is generate a rule and its list of conditions.\n     *\n     * The resulting generated code is a series of nested-if statements, nesting each condition inside the previous.\n     */\n    private fun generateRuleInternal(\n        rule: Rule,\n        conditions: List<Condition>,\n    ): Writable {\n        if (conditions.isEmpty()) {\n            return rule.accept(RuleVisitor())\n        } else {\n            val condition = conditions.first()\n            val rest = conditions.drop(1)\n            return {\n                val generator = ExpressionGenerator(Ownership.Borrowed, context)\n                val fn = condition.targetFunction()\n\n                // there are three patterns we need to handle:\n                // 1. the RHS returns an option which we need to guard as \"Some(...)\"\n                // 2. the RHS returns a boolean which we need to gate on\n                // 3. the RHS is infallible (e.g. uriEncode)\n                val resultName =\n                    (condition.result.orNull() ?: (fn as? Reference)?.name)?.rustName() ?: \"_\"\n                val target = generator.generate(fn)\n                val next = generateRuleInternal(rule, rest)\n                when {\n                    fn.type() is OptionalType -> {\n                        Attribute.AllowUnusedVariables.render(this)\n                        rustTemplate(\n                            \"if let Some($resultName) = #{target:W} { #{next:W} }\",\n                            \"target\" to target,\n                            \"next\" to next,\n                        )\n                    }\n\n                    fn.type() is BooleanType -> {\n                        rustTemplate(\n                            \"\"\"\n                            if #{target:W} {#{binding}\n                                #{next:W}\n                            }\n                            \"\"\",\n                            \"target\" to target,\n                            \"next\" to next,\n                            // handle the rare but possible case where we bound the name of a variable to a boolean condition\n                            \"binding\" to\n                                writable {\n                                    if (resultName != \"_\") {\n                                        rust(\"let $resultName = true;\")\n                                    }\n                                },\n                        )\n                    }\n\n                    else -> {\n                        // the function is infallible: just create a binding\n                        rustTemplate(\n                            \"\"\"\n                            let $resultName = #{target:W};\n                            #{next:W}\n                            \"\"\",\n                            \"target\" to generator.generate(fn),\n                            \"next\" to generateRuleInternal(rule, rest),\n                        )\n                    }\n                }\n            }\n        }\n    }\n\n    inner class RuleVisitor : RuleValueVisitor<Writable> {\n        override fun visitTreeRule(rules: List<Rule>) = generateRulesList(rules)\n\n        override fun visitErrorRule(error: Expression) =\n            writable {\n                rustTemplate(\n                    \"return Err(#{EndpointError}::message(#{message:W}));\",\n                    *codegenScope,\n                    \"message\" to ExpressionGenerator(Ownership.Owned, context).generate(error),\n                )\n            }\n\n        override fun visitEndpointRule(endpoint: Endpoint): Writable =\n            writable {\n                rust(\"return Ok(#W);\", generateEndpoint(endpoint))\n            }\n    }\n\n    /**\n     * generate the rust code for `[endpoint]`\n     */\n    internal fun generateEndpoint(endpoint: Endpoint): Writable {\n        val generator = ExpressionGenerator(Ownership.Owned, context)\n        val url = generator.generate(endpoint.url)\n        val headers = endpoint.headers.mapValues { entry -> entry.value.map { generator.generate(it) } }\n        val properties = endpoint.properties.mapValues { entry -> generator.generate(entry.value) }\n        return writable {\n            rustTemplate(\"#{SmithyEndpoint}::builder().url(#{url:W})\", *codegenScope, \"url\" to url)\n            headers.forEach { (name, values) -> values.forEach { rust(\".header(${name.dq()}, #W)\", it) } }\n            properties.forEach { (name, value) -> rust(\".property(${name.toString().dq()}, #W)\", value) }\n            rust(\".build()\")\n        }\n    }\n}\n\nfun ClientCodegenContext.serviceSpecificEndpointResolver(): RuntimeType {\n    val ctx = this\n    val generator = EndpointTypesGenerator.fromContext(this)\n    val endpointCustomizations = rootDecorator.endpointCustomizations(this)\n    return RuntimeType.forInlineFun(\"ResolveEndpoint\", ClientRustModule.Config.endpoint) {\n        val codegenScope =\n            arrayOf(\n                *preludeScope,\n                \"BoxError\" to RuntimeType.boxError(runtimeConfig),\n                \"Params\" to generator.paramsStruct(),\n                *Types(runtimeConfig).toArray(),\n                \"Debug\" to RuntimeType.Debug,\n            )\n        val paramsFinalizers =\n            endpointCustomizations.mapNotNull {\n                it.serviceSpecificEndpointParamsFinalizer(ctx, \"params\")\n            }\n        rustTemplate(\n            \"\"\"\n            /// Endpoint resolver trait specific to ${serviceShape.serviceNameOrDefault(\"this service\")}\n            pub trait ResolveEndpoint: #{Send} + #{Sync} + #{Debug} {\n                /// Resolve an endpoint with the given parameters\n                fn resolve_endpoint<'a>(&'a self, params: &'a #{Params}) -> #{EndpointFuture}<'a>;\n\n                /// Convert this service-specific resolver into a `SharedEndpointResolver`\n                ///\n                /// The resulting resolver will downcast `EndpointResolverParams` into `#{Params}`.\n                fn into_shared_resolver(self) -> #{SharedEndpointResolver}\n                where\n                    Self: Sized + 'static,\n                {\n                    #{SharedEndpointResolver}::new(DowncastParams(self))\n                }\n            }\n\n            ##[derive(Debug)]\n            struct DowncastParams<T>(T);\n            impl<T> #{ResolveEndpoint} for DowncastParams<T>\n            where\n                T: ResolveEndpoint,\n            {\n                fn resolve_endpoint<'a>(&'a self, params: &'a #{EndpointResolverParams}) -> #{EndpointFuture}<'a> {\n                    let ep = match params.get::<#{Params}>() {\n                        Some(params) => self.0.resolve_endpoint(params),\n                        None => #{EndpointFuture}::ready(Err(\"params of expected type was not present\".into())),\n                    };\n                    ep\n                }\n                #{finalize_endpoint_params:W}\n            }\n\n            \"\"\",\n            *codegenScope,\n            \"finalize_endpoint_params\" to finalizeEndpointParams(codegenScope, paramsFinalizers),\n        )\n    }\n}\n\nprivate fun finalizeEndpointParams(\n    codegenScope: Array<Pair<String, RuntimeType>>,\n    paramsFinalizers: List<Writable>,\n) = writable {\n    if (paramsFinalizers.isNotEmpty()) {\n        rustBlockTemplate(\n            \"\"\"\n            fn finalize_params<'a>(&'a self, params: &'a mut #{EndpointResolverParams}) -> #{Result}<(), #{BoxError}>\n            \"\"\",\n            *codegenScope,\n        ) {\n            paramsFinalizers.forEach {\n                it(this)\n            }\n            rustTemplate(\"#{Ok}(())\", *codegenScope)\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/generators/EndpointTestGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators\n\nimport software.amazon.smithy.rulesengine.language.evaluation.value.ArrayValue\nimport software.amazon.smithy.rulesengine.language.evaluation.value.BooleanValue\nimport software.amazon.smithy.rulesengine.language.evaluation.value.IntegerValue\nimport software.amazon.smithy.rulesengine.language.evaluation.value.RecordValue\nimport software.amazon.smithy.rulesengine.language.evaluation.value.StringValue\nimport software.amazon.smithy.rulesengine.language.evaluation.value.Value\nimport software.amazon.smithy.rulesengine.language.syntax.Identifier\nimport software.amazon.smithy.rulesengine.language.syntax.parameters.Parameters\nimport software.amazon.smithy.rulesengine.traits.EndpointTestCase\nimport software.amazon.smithy.rulesengine.traits.ExpectedEndpoint\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.endpoint.Types\nimport software.amazon.smithy.rust.codegen.client.smithy.endpoint.rustName\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.docs\nimport software.amazon.smithy.rust.codegen.core.rustlang.escape\nimport software.amazon.smithy.rust.codegen.core.rustlang.join\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.util.PANIC\nimport software.amazon.smithy.rust.codegen.core.util.dq\nimport software.amazon.smithy.rust.codegen.core.util.orNull\n\ninternal class EndpointTestGenerator(\n    private val testCases: List<EndpointTestCase>,\n    private val paramsType: RuntimeType,\n    private val resolverType: RuntimeType,\n    private val params: Parameters,\n    codegenContext: ClientCodegenContext,\n) {\n    private val runtimeConfig = codegenContext.runtimeConfig\n    private val types = Types(runtimeConfig)\n    private val codegenScope =\n        arrayOf(\n            \"Endpoint\" to types.smithyEndpoint,\n            \"Error\" to types.resolveEndpointError,\n            \"Document\" to RuntimeType.document(runtimeConfig),\n            \"HashMap\" to RuntimeType.HashMap,\n            \"capture_request\" to RuntimeType.captureRequest(runtimeConfig),\n        )\n\n    private fun EndpointTestCase.docs(): Writable {\n        val self = this\n        return writable { docs(self.documentation.orElse(\"no docs\")) }\n    }\n\n    private fun generateBaseTest(\n        testCase: EndpointTestCase,\n        id: Int,\n    ): Writable =\n        writable {\n            rustTemplate(\n                \"\"\"\n                #{docs:W}\n                ##[test]\n                fn test_$id() {\n                    let params = #{params:W};\n                    let resolver = #{resolver}::new();\n                    let endpoint = resolver.resolve_endpoint(&params);\n                    #{assertion:W}\n                }\n                \"\"\",\n                *codegenScope,\n                \"docs\" to testCase.docs(),\n                \"params\" to params(testCase),\n                \"resolver\" to resolverType,\n                \"assertion\" to\n                    writable {\n                        testCase.expect.endpoint.ifPresent { endpoint ->\n                            rustTemplate(\n                                \"\"\"\n                                let endpoint = endpoint.expect(\"Expected valid endpoint: ${escape(endpoint.url)}\");\n                                assert_eq!(endpoint, #{expected:W});\n                                \"\"\",\n                                *codegenScope, \"expected\" to generateEndpoint(endpoint),\n                            )\n                        }\n                        testCase.expect.error.ifPresent { error ->\n                            val expectedError =\n                                escape(\"expected error: $error [${testCase.documentation.orNull() ?: \"no docs\"}]\")\n                            rustTemplate(\n                                \"\"\"\n                                let error = endpoint.expect_err(${expectedError.dq()});\n                                assert_eq!(format!(\"{}\", error), ${escape(error).dq()})\n                                \"\"\",\n                                *codegenScope,\n                            )\n                        }\n                    },\n            )\n        }\n\n    fun generate(): Writable =\n        writable {\n            var id = 0\n            testCases.forEach { testCase ->\n                id += 1\n                generateBaseTest(testCase, id)(this)\n            }\n        }\n\n    private fun params(testCase: EndpointTestCase) =\n        writable {\n            rust(\"#T::builder()\", paramsType)\n            testCase.params.members.forEach { (id, value) ->\n                if (params.get(Identifier.of(id)).isPresent) {\n                    rust(\".${Identifier.of(id).rustName()}(#W)\", generateValue(Value.fromNode(value)))\n                }\n            }\n            rust(\"\"\".build().expect(\"invalid params\")\"\"\")\n        }\n\n    private fun generateValue(value: Value): Writable {\n        return {\n            when (value) {\n                is StringValue -> rust(escape(value.value).dq() + \".to_string()\")\n                is BooleanValue -> rust(value.toString())\n                is ArrayValue -> {\n                    rust(\n                        \"vec![#W]\",\n                        value.values.map { member ->\n                            writable {\n                                rustTemplate(\n                                    /*\n                                     * If we wrote \"#{Document}::from(#{value:W})\" here, we could encounter a\n                                     * compile error due to the following type mismatch:\n                                     *  the trait `From<Vec<Document>>` is not implemented for `Vec<std::string::String>`\n                                     *\n                                     * given the following method signature:\n                                     *  fn resource_arn_list(mut self, value: impl Into<::std::vec::Vec<::std::string::String>>)\n                                     *\n                                     * with a call site like this:\n                                     *  .resource_arn_list(vec![::aws_smithy_types::Document::from(\n                                     *      \"arn:aws:dynamodb:us-east-1:333333333333:table/table_name\".to_string(),\n                                     *  )])\n                                     *\n                                     * For this reason we use `into()` instead to allow types that need to be converted\n                                     * to `Document` to continue working as before, and to support the above use case.\n                                     */\n                                    \"#{value:W}.into()\",\n                                    *codegenScope,\n                                    \"value\" to generateValue(member),\n                                )\n                            }\n                        }.join(\",\"),\n                    )\n                }\n\n                is IntegerValue -> rust(value.value.toString())\n\n                is RecordValue ->\n                    rustBlock(\"\") {\n                        rustTemplate(\n                            \"let mut out = #{HashMap}::<String, #{Document}>::new();\",\n                            *codegenScope,\n                        )\n                        val ids = mutableListOf<Identifier>()\n                        value.value.forEach { (id, _) -> ids.add(id) }\n                        ids.forEach { id ->\n                            val v = value.get(id)\n                            rust(\n                                \"out.insert(${id.toString().dq()}.to_string(), #W.into());\",\n                                // When writing into the hashmap, it always needs to be an owned type\n                                generateValue(v),\n                            )\n                        }\n                        rustTemplate(\"out\")\n                    }\n\n                else -> PANIC(\"unexpected type: $value\")\n            }\n        }\n    }\n\n    private fun generateEndpoint(value: ExpectedEndpoint) =\n        writable {\n            rustTemplate(\"#{Endpoint}::builder().url(${escape(value.url).dq()})\", *codegenScope)\n            value.headers.forEach { (headerName, values) ->\n                values.forEach { headerValue ->\n                    rust(\".header(${headerName.dq()}, ${headerValue.dq()})\")\n                }\n            }\n            value.properties.forEach { (name, value) ->\n                rust(\n                    \".property(${name.dq()}, #W)\",\n                    generateValue(Value.fromNode(value)),\n                )\n            }\n            rust(\".build()\")\n        }\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/rulesgen/BddExpressionGenerator.kt",
    "content": "/*\n *  Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n *  SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.endpoint.rulesgen\n\nimport software.amazon.smithy.rulesengine.language.evaluation.type.BooleanType\nimport software.amazon.smithy.rulesengine.language.evaluation.type.OptionalType\nimport software.amazon.smithy.rulesengine.language.evaluation.type.StringType\nimport software.amazon.smithy.rulesengine.language.evaluation.type.Type\nimport software.amazon.smithy.rulesengine.language.syntax.Identifier\nimport software.amazon.smithy.rulesengine.language.syntax.expressions.Expression\nimport software.amazon.smithy.rulesengine.language.syntax.expressions.ExpressionVisitor\nimport software.amazon.smithy.rulesengine.language.syntax.expressions.Reference\nimport software.amazon.smithy.rulesengine.language.syntax.expressions.functions.FunctionDefinition\nimport software.amazon.smithy.rulesengine.language.syntax.expressions.functions.GetAttr\nimport software.amazon.smithy.rulesengine.language.syntax.expressions.functions.LibraryFunction\nimport software.amazon.smithy.rulesengine.language.syntax.expressions.literal.Literal\nimport software.amazon.smithy.rulesengine.language.syntax.expressions.literal.StringLiteral\nimport software.amazon.smithy.rulesengine.language.syntax.rule.Condition\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.endpoint.Context\nimport software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators.AnnotatedRefs\nimport software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators.EndpointResolverGenerator\nimport software.amazon.smithy.rust.codegen.client.smithy.endpoint.rustName\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.conditionalBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.join\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.util.PANIC\nimport java.lang.RuntimeException\n\n/**\n * Root expression generator.\n */\nclass BddExpressionGenerator(\n    private val condition: Condition,\n    private val ownership: Ownership,\n    private val context: Context,\n    private val refs: AnnotatedRefs,\n    private val codegenContext: ClientCodegenContext,\n    /**\n     * Tracks references that are known to be Some at this point in evaluation.\n     * This allows us to unwrap them safely without additional checks.\n     */\n    private val knownSomeRefs: MutableSet<AnnotatedRefs.AnnotatedRef> = mutableSetOf(),\n) {\n    private val optionalRefNames = refs.filter { it.isOptional }.map { it.name }\n    private val knownSomeRefsNames = knownSomeRefs.map { it.name }\n    private val documentRefNames =\n        refs.filter { it.runtimeType == RuntimeType.document(codegenContext.runtimeConfig) }.map { it.name }\n\n    fun generateCondition(condition: Condition): Writable {\n        return condition.function.accept(OuterExprGeneratorVisitor(ownership))\n    }\n\n    private fun generateExpression(expr: Expression): Writable {\n        return expr.accept(\n            ExprGeneratorVisitor(ownership),\n        )\n    }\n\n    // ============================================================================\n    // Reference Type Helpers\n    // ============================================================================\n\n    private fun isOptionalRef(expr: Expression): Boolean =\n        expr is Reference && optionalRefNames.contains(expr.name.rustName())\n\n    private fun isDocumentRef(expr: Expression): Boolean =\n        expr is Reference && documentRefNames.contains(expr.name.rustName())\n\n    private fun isKnownSomeRef(ref: Reference): Boolean = knownSomeRefsNames.contains(ref.name.rustName())\n\n    private fun createChildGenerator(): BddExpressionGenerator =\n        BddExpressionGenerator(condition, ownership, context, refs, codegenContext, knownSomeRefs)\n\n    // ============================================================================\n    // Expression Generation - Inner Visitor\n    // ============================================================================\n\n    /**\n     * Inner generator based on ExpressionVisitor\n     */\n    private open inner class ExprGeneratorVisitor(\n        private val ownership: Ownership,\n    ) :\n        ExpressionVisitor<Writable> {\n        override fun visitLiteral(literal: Literal): Writable {\n            return literal.accept(LiteralGenerator(ownership, context))\n        }\n\n        override fun visitRef(ref: Reference) =\n            writable {\n                if (isKnownSomeRef(ref)) {\n                    rust(\"\"\"${ref.name.rustName()}.expect(\"${ref.name.rustName()} was set my a previous condition.\")\"\"\")\n                } else {\n                    rust(ref.name.rustName())\n                }\n            }\n\n        override fun visitGetAttr(getAttr: GetAttr): Writable {\n            val target = createChildGenerator().generateExpression(getAttr.target)\n            val path = generateAttrPath(getAttr)\n\n            return if (isOptionalRef(getAttr.target)) {\n                wrapInOptionalCheck(target, path)\n            } else {\n                writable { rust(\"#W#W\", target, path) }\n            }\n        }\n\n        private fun generateAttrPath(getAttr: GetAttr): Writable =\n            writable {\n                getAttr.path.toList().forEach { part ->\n                    when (part) {\n                        is GetAttr.Part.Key -> rust(\".${part.key().rustName()}()\")\n                        is GetAttr.Part.Index -> {\n                            val index = part.index()\n                            when {\n                                index == 0 -> rust(\".first().cloned()\")\n                                index < 0 -> rust(\".iter().nth_back(${-index - 1}).cloned()\")\n                                else -> rust(\".get($index).cloned()\")\n                            }\n                        }\n                    }\n                }\n                if (ownership == Ownership.Owned && shouldAddToOwned(getAttr)) {\n                    rust(if (getAttr.type() is OptionalType) \".map(|t|t.to_owned())\" else \".to_owned()\")\n                }\n            }\n\n        private fun shouldAddToOwned(getAttr: GetAttr): Boolean {\n            return try {\n                getAttr.type() != Type.booleanType()\n            } catch (_: RuntimeException) {\n                true // Default to .to_owned() when typechecking unavailable\n            }\n        }\n\n        private fun wrapInOptionalCheck(\n            target: Writable,\n            path: Writable,\n        ): Writable =\n            writable {\n                rustTemplate(\n                    \"\"\"\n                    if let Some(inner) = #{Target} {\n                        inner#{Path}\n                    }else{\n                        return false\n                    }\n                    \"\"\".trimIndent(),\n                    \"Target\" to target, \"Path\" to path,\n                )\n            }\n\n        override fun visitIsSet(fn: Expression) =\n            writable {\n                val expressionGenerator = createChildGenerator()\n                if (fn is Reference) {\n                    // All references are in refs so safe to assert non-null\n                    knownSomeRefs.add(refs.get(fn.name.rustName())!!)\n                }\n                rust(\"#W.is_some()\", expressionGenerator.generateExpression(fn))\n            }\n\n        override fun visitNot(not: Expression) =\n            writable {\n                rust(\"!(#W)\", createChildGenerator().generateExpression(not))\n            }\n\n        override fun visitBoolEquals(\n            left: Expression,\n            right: Expression,\n        ) = writable {\n            val expressionGenerator = createChildGenerator()\n            val lhsIsOptionalRef = isOptionalRef(left)\n            val rhsIsOptionalRef = isOptionalRef(right)\n            val (lhsRef, rhsRef) = getBoolEqualityModifier(left, right)\n\n            conditionalBlock(\"&mut Some(\", \")\", conditional = rhsIsOptionalRef) {\n                rust(\"($lhsRef#W)\", expressionGenerator.generateExpression(left))\n            }\n            rust(\"==\")\n            conditionalBlock(\"&mut Some(\", \")\", conditional = lhsIsOptionalRef) {\n                rust(\"($rhsRef#W)\", expressionGenerator.generateExpression(right))\n            }\n        }\n\n        override fun visitStringEquals(\n            left: Expression,\n            right: Expression,\n        ) = writable {\n            val expressionGenerator = createChildGenerator()\n            val lhsIsOptionalRef = isOptionalRef(left)\n            val rhsIsOptionalRef = isOptionalRef(right)\n            val (lhsInto, rhsInto) = getStringEqualityModifier(left, lhsIsOptionalRef, right, rhsIsOptionalRef)\n\n            conditionalBlock(\"&mut Some(\", \")\", conditional = rhsIsOptionalRef) {\n                rust(\"(#W$lhsInto)\", expressionGenerator.generateExpression(left))\n            }\n            rust(\"==\")\n            conditionalBlock(\"&mut Some(\", \")\", conditional = lhsIsOptionalRef) {\n                rust(\"(#W$rhsInto)\", expressionGenerator.generateExpression(right))\n            }\n        }\n\n        private fun getBoolEqualityModifier(\n            left: Expression,\n            right: Expression,\n        ): Pair<String, String> {\n            val lhsIsRef = left is Reference\n            val rhsIsRef = right is Reference\n            val lhsIsOptionalRef = isOptionalRef(left)\n            val rhsIsOptionalRef = isOptionalRef(right)\n\n            val rhsRef = if (lhsIsRef && !lhsIsOptionalRef && right is Literal) \"&\" else \"\"\n            val lhsRef = if (rhsIsRef && !rhsIsOptionalRef && left is Literal) \"&\" else \"\"\n\n            return Pair(lhsRef, rhsRef)\n        }\n\n        private fun getStringEqualityModifier(\n            left: Expression,\n            lhsIsOptionalRef: Boolean,\n            right: Expression,\n            rhsIsOptionalRef: Boolean,\n        ): Pair<String, String> {\n            // References are always stored as String, but functions (GetAttr, coalesce, etc) often produce\n            // &str, so we .into() those result to match the reference.\n            val rhsInto =\n                if (left is Reference && lhsIsOptionalRef && (right is Literal || right is GetAttr)) \".into()\" else \"\"\n            val lhsInto =\n                if (right is Reference && rhsIsOptionalRef && (left is Literal || left is GetAttr)) \".into()\" else \"\"\n\n            return Pair(lhsInto, rhsInto)\n        }\n\n        private fun isOptionalArgument(arg: Expression): Boolean {\n            return isOptionalRef(arg) ||\n                (arg is StringLiteral && optionalRefNames.contains(Identifier.of(arg.value().toString()).rustName())) ||\n                (arg is LibraryFunction && arg.functionDefinition.returnType is OptionalType)\n        }\n\n        /**\n         * Wraps function arguments based on the function type.\n         * Coalesce and ite functions need special handling for optional arguments.\n         */\n        private fun wrapArgument(\n            arg: Expression,\n            fn: FunctionDefinition,\n        ): Writable {\n            val expressionGenerator = createChildGenerator()\n            return when (fn.id) {\n                \"coalesce\" -> wrapCoalesceArg(arg, expressionGenerator)\n                \"ite\" -> wrapIteArg(arg, expressionGenerator)\n                else -> wrapDefaultArg(arg, expressionGenerator)\n            }\n        }\n\n        private fun wrapCoalesceArg(\n            arg: Expression,\n            expressionGenerator: BddExpressionGenerator,\n        ): Writable =\n            writable {\n                when {\n                    !isOptionalArgument(arg) -> rust(\"#W\", expressionGenerator.generateExpression(arg))\n                    arg is LibraryFunction && arg.functionDefinition.returnType is OptionalType ->\n                        rust(\n                            \"\"\"\n                            if let Some(inner) = #W{\n                                inner\n                            } else {\n                                return false\n                            }\n                            \"\"\".trimMargin(),\n                            expressionGenerator.generateExpression(arg),\n                        )\n\n                    else -> rust(\"*#W\", expressionGenerator.generateExpression(arg))\n                }\n            }\n\n        private fun wrapIteArg(\n            arg: Expression,\n            expressionGenerator: BddExpressionGenerator,\n        ): Writable =\n            writable {\n                when {\n                    arg is StringLiteral ->\n                        rust(\"#W.to_string()\", expressionGenerator.generateExpression(arg))\n\n                    arg is GetAttr && arg.type() is StringType ->\n                        rust(\"#W.to_string()\", expressionGenerator.generateExpression(arg))\n\n                    !isOptionalArgument(arg) ->\n                        rust(\"#W\", expressionGenerator.generateExpression(arg))\n\n                    isOptionalRef(arg) ->\n                        rust(\n                            \"#W.clone().expect(\\\"Reference already confirmed Some\\\")\",\n                            expressionGenerator.generateExpression(arg),\n                        )\n\n                    else ->\n                        rust(\"*#W\", expressionGenerator.generateExpression(arg))\n                }\n            }\n\n        private fun wrapDefaultArg(\n            arg: Expression,\n            expressionGenerator: BddExpressionGenerator,\n        ): Writable {\n            if (!isOptionalArgument(arg)) {\n                return expressionGenerator.generateExpression(arg)\n            }\n            return writable {\n                val param =\n                    if (isDocumentRef(arg)) {\n                        \"\"\"&param.as_string().expect(\"Document was string type.\")\"\"\"\n                    } else {\n                        \"param\"\n                    }\n\n                rust(\n                    \"\"\"\n                    if let Some(param) = #W{\n                        $param\n                    } else {\n                        return false\n                    }\n                    \"\"\".trimMargin(),\n                    expressionGenerator.generateExpression(arg),\n                )\n            }\n        }\n\n        override fun visitLibraryFunction(\n            fn: FunctionDefinition,\n            args: MutableList<Expression>,\n        ): Writable =\n            writable {\n                val fnDefinition =\n                    context.functionRegistry.fnFor(fn.id)\n                        ?: PANIC(\n                            \"no runtime function for ${fn.id} \" +\n                                \"(hint: if this is a custom or aws-specific runtime function, ensure the relevant standard library has been loaded \" +\n                                \"on the classpath)\",\n                        )\n\n                val argWritables = args.map { wrapArgument(it, fn) }\n\n                val template =\n                    if (fn.id == \"coalesce\" || fn.id == \"ite\") {\n                        \"#{fn}(#{args})\"\n                    } else {\n                        \"#{fn}(#{args}, ${EndpointResolverGenerator.DIAGNOSTIC_COLLECTOR})\"\n                    }\n\n                rustTemplate(template, \"fn\" to fnDefinition.usage(), \"args\" to argWritables.join(\",\"))\n\n                if (ownership == Ownership.Owned) {\n                    rust(\".to_owned()\")\n                }\n            }\n    }\n\n    // ============================================================================\n    // Expression Generation - Outer Visitor (handles assignments)\n    // ============================================================================\n\n    /**\n     * Outer expression generator visitor that handles cases that only happen in the\n     * outermost evaluation, like assignment to condition context.\n     */\n    private inner class OuterExprGeneratorVisitor(\n        private val ownership: Ownership,\n    ) : ExprGeneratorVisitor(ownership) {\n        /**\n         * Handles getAttr when it appears as the outermost condition expression.\n         * Special case: assigns the result to the condition context if present.\n         */\n        override fun visitGetAttr(getAttr: GetAttr): Writable =\n            writable {\n                val innerGen = createChildGenerator()\n                val fnExpr = innerGen.generateExpression(condition.function)\n                val pathContainsIdx = getAttr.path.toList().any { it is GetAttr.Part.Index }\n\n                if (condition.result.isPresent) {\n                    rust(\"#W\", generateGetAttrAssignment(fnExpr, pathContainsIdx))\n                } else {\n                    rust(\"#W\", generateGetAttrEvaluation(fnExpr, pathContainsIdx))\n                }\n            }\n\n        private fun generateGetAttrAssignment(\n            fnExpr: Writable,\n            pathContainsIdx: Boolean,\n        ): Writable =\n            writable {\n                val resultName = condition.result.get().rustName()\n                if (pathContainsIdx) {\n                    // Path contains index, resulting type is Option<T>\n                    rustTemplate(\n                        \"\"\"\n                        {\n                            *$resultName = #{FN:W}.map(|inner| inner.into());\n                            $resultName.is_some()\n                        }\n                        \"\"\".trimIndent(),\n                        \"FN\" to fnExpr,\n                    )\n                } else {\n                    // No index in path, getting the field is infallible\n                    rustTemplate(\n                        \"\"\"\n                        {\n                            *$resultName = Some(#{FN:W}.into());\n                            true\n                        }\n                        \"\"\".trimIndent(),\n                        \"FN\" to fnExpr,\n                    )\n                }\n            }\n\n        private fun generateGetAttrEvaluation(\n            fnExpr: Writable,\n            pathContainsIdx: Boolean,\n        ): Writable =\n            writable {\n                rustTemplate(\n                    \"\"\"\n                    #{FN:W}\n                    ${if (pathContainsIdx) \".is_some()\" else \"\"}\n                    \"\"\".trimIndent(),\n                    \"FN\" to fnExpr,\n                )\n            }\n\n        override fun visitLibraryFunction(\n            fn: FunctionDefinition,\n            args: MutableList<Expression>,\n        ): Writable =\n            writable {\n                val innerGen = createChildGenerator()\n                val fnExpr = innerGen.generateExpression(condition.function)\n                val fnReturnType = condition.function.functionDefinition.returnType\n\n                if (condition.result.isPresent) {\n                    rust(\"#W\", generateLibraryFunctionAssignment(fnExpr, fnReturnType))\n                } else {\n                    rust(\"#W\", generateLibraryFunctionEvaluation(fnExpr, fnReturnType))\n                }\n            }\n\n        private fun generateLibraryFunctionAssignment(\n            fnExpr: Writable,\n            returnType: Type,\n        ): Writable =\n            writable {\n                val resultName = condition.result.get().rustName()\n                val isOptional = returnType is OptionalType\n                val isBoolean = returnType is BooleanType\n\n                when {\n                    // Non-optional boolean: assign and return the value\n                    !isOptional && isBoolean ->\n                        rustTemplate(\n                            \"\"\"\n                            {\n                                let temp = #{FN:W}.into();\n                                *$resultName = Some(temp);\n                                temp\n                            }\n                            \"\"\".trimIndent(),\n                            \"FN\" to fnExpr,\n                        )\n                    // Non-optional non-boolean: infallible, always return true\n                    !isOptional && !isBoolean ->\n                        rustTemplate(\n                            \"\"\"\n                            {\n                                *$resultName = Some(#{FN:W}.into());\n                                true\n                            }\n                            \"\"\".trimIndent(),\n                            \"FN\" to fnExpr,\n                        )\n                    // Optional: assign and check if Some\n                    else ->\n                        rustTemplate(\n                            \"\"\"\n                            {\n                                *$resultName = #{FN:W}.map(|inner| inner.into());\n                                $resultName.is_some()\n                            }\n                            \"\"\".trimIndent(),\n                            \"FN\" to fnExpr,\n                        )\n                }\n            }\n\n        private fun generateLibraryFunctionEvaluation(\n            fnExpr: Writable,\n            returnType: Type,\n        ): Writable =\n            writable {\n                val isOptional = returnType is OptionalType\n                val isBoolean = returnType is BooleanType\n\n                // For optional non-boolean types, Some(_) is true and None is false\n                if (!isBoolean && isOptional) {\n                    rustTemplate(\"(#{FN:W}).is_some()\", \"FN\" to fnExpr)\n                } else {\n                    rustTemplate(\"#{FN:W}\", \"FN\" to fnExpr)\n                }\n            }\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/rulesgen/ExpressionGenerator.kt",
    "content": "/*\n *  Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n *  SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.endpoint.rulesgen\n\nimport org.jetbrains.annotations.Contract\nimport software.amazon.smithy.rulesengine.language.evaluation.type.BooleanType\nimport software.amazon.smithy.rulesengine.language.evaluation.type.OptionalType\nimport software.amazon.smithy.rulesengine.language.evaluation.type.StringType\nimport software.amazon.smithy.rulesengine.language.evaluation.type.Type\nimport software.amazon.smithy.rulesengine.language.syntax.expressions.Expression\nimport software.amazon.smithy.rulesengine.language.syntax.expressions.ExpressionVisitor\nimport software.amazon.smithy.rulesengine.language.syntax.expressions.Reference\nimport software.amazon.smithy.rulesengine.language.syntax.expressions.functions.FunctionDefinition\nimport software.amazon.smithy.rulesengine.language.syntax.expressions.functions.GetAttr\nimport software.amazon.smithy.rulesengine.language.syntax.expressions.literal.Literal\nimport software.amazon.smithy.rust.codegen.client.smithy.endpoint.Context\nimport software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators.EndpointResolverGenerator\nimport software.amazon.smithy.rust.codegen.client.smithy.endpoint.rustName\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.join\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.util.PANIC\nimport java.lang.RuntimeException\n\n/**\n * Root expression generator.\n */\nclass ExpressionGenerator(\n    private val ownership: Ownership,\n    private val context: Context,\n) {\n    @Contract(pure = true)\n    fun generate(expr: Expression): Writable {\n        return expr.accept(ExprGeneratorVisitor(ownership))\n    }\n\n    /**\n     * Inner generator based on ExprVisitor\n     */\n    private inner class ExprGeneratorVisitor(\n        private val ownership: Ownership,\n    ) :\n        ExpressionVisitor<Writable> {\n        override fun visitLiteral(literal: Literal): Writable {\n            return literal.accept(LiteralGenerator(ownership, context))\n        }\n\n        override fun visitRef(ref: Reference) =\n            writable {\n                if (ownership == Ownership.Owned) {\n                    try {\n                        when (ref.type()) {\n                            is BooleanType -> rust(\"*${ref.name.rustName()}\")\n                            else -> rust(\"${ref.name.rustName()}.to_owned()\")\n                        }\n                    } catch (_: RuntimeException) {\n                        // Typechecking was never invoked, default to .to_owned()\n                        rust(\"${ref.name.rustName()}.to_owned()\")\n                    }\n                } else {\n                    try {\n                        when (ref.type()) {\n                            // This ensures we obtain a `&str`, regardless of whether `ref.name.rustName()` returns a `String` or a `&str`.\n                            // Typically, we don't know which type will be returned due to code generation.\n                            // In BDD mode, parameters are already bound as references, so the cast is unnecessary and causes errors.\n                            is StringType -> {\n                                if (context.isBddMode) {\n                                    rust(\"${ref.name.rustName()}.as_ref()\")\n                                } else {\n                                    rust(\"${ref.name.rustName()}.as_ref() as &str\")\n                                }\n                            }\n                            else -> rust(ref.name.rustName())\n                        }\n                    } catch (_: RuntimeException) {\n                        // Because Typechecking was never invoked upon calling `.type()` on Reference for an expression\n                        // like \"{ref}: rust\". See `generateLiterals2` in ExprGeneratorTest.\n                        rust(ref.name.rustName())\n                    }\n                }\n            }\n\n        override fun visitGetAttr(getAttr: GetAttr): Writable {\n            val target = ExpressionGenerator(Ownership.Borrowed, context).generate(getAttr.target)\n            val path =\n                writable {\n                    getAttr.path.toList().forEach { part ->\n                        when (part) {\n                            is GetAttr.Part.Key -> rust(\".${part.key().rustName()}()\")\n                            is GetAttr.Part.Index -> {\n                                if (part.index() == 0) {\n                                    // In this case, `.first()` is more idiomatic and `.get(0)` triggers lint warnings\n                                    rust(\".first().cloned()\")\n                                } else {\n                                    rust(\".get(${part.index()}).cloned()\") // we end up with Option<&&T>, we need to get to Option<&T>\n                                }\n                            }\n                        }\n                    }\n                    if (ownership == Ownership.Owned) {\n                        try {\n                            if (getAttr.type() != Type.booleanType()) {\n                                if (getAttr.type() is OptionalType) {\n                                    rust(\".map(|t|t.to_owned())\")\n                                } else {\n                                    rust(\".to_owned()\")\n                                }\n                            }\n                        } catch (_: RuntimeException) {\n                            // Typechecking was never invoked, default to .to_owned()\n                            rust(\".to_owned()\")\n                        }\n                    }\n                }\n            return writable { rust(\"#W#W\", target, path) }\n        }\n\n        override fun visitIsSet(fn: Expression) =\n            writable {\n                val expressionGenerator = ExpressionGenerator(Ownership.Borrowed, context)\n                rust(\"#W.is_some()\", expressionGenerator.generate(fn))\n            }\n\n        override fun visitNot(not: Expression) =\n            writable {\n                rust(\"!(#W)\", ExpressionGenerator(Ownership.Borrowed, context).generate(not))\n            }\n\n        override fun visitBoolEquals(\n            left: Expression,\n            right: Expression,\n        ) = writable {\n            val expressionGenerator = ExpressionGenerator(Ownership.Owned, context)\n            rust(\"(#W) == (#W)\", expressionGenerator.generate(left), expressionGenerator.generate(right))\n        }\n\n        override fun visitStringEquals(\n            left: Expression,\n            right: Expression,\n        ) = writable {\n            val expressionGenerator = ExpressionGenerator(Ownership.Borrowed, context)\n            rust(\"(#W) == (#W)\", expressionGenerator.generate(left), expressionGenerator.generate(right))\n        }\n\n        override fun visitLibraryFunction(\n            fn: FunctionDefinition,\n            args: MutableList<Expression>,\n        ): Writable =\n            writable {\n                val fnDefinition =\n                    context.functionRegistry.fnFor(fn.id)\n                        ?: PANIC(\n                            \"no runtime function for ${fn.id} \" +\n                                \"(hint: if this is a custom or aws-specific runtime function, ensure the relevant standard library has been loaded \" +\n                                \"on the classpath)\",\n                        )\n                val expressionGenerator = ExpressionGenerator(Ownership.Borrowed, context)\n                val argWritables = args.map { expressionGenerator.generate(it) }\n                rustTemplate(\n                    \"#{fn}(#{args}, ${EndpointResolverGenerator.DIAGNOSTIC_COLLECTOR})\",\n                    \"fn\" to fnDefinition.usage(),\n                    \"args\" to argWritables.join(\",\"),\n                )\n                if (ownership == Ownership.Owned) {\n                    rust(\".to_owned()\")\n                }\n            }\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/rulesgen/LiteralGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.endpoint.rulesgen\n\nimport software.amazon.smithy.rulesengine.language.syntax.Identifier\nimport software.amazon.smithy.rulesengine.language.syntax.expressions.Template\nimport software.amazon.smithy.rulesengine.language.syntax.expressions.literal.Literal\nimport software.amazon.smithy.rulesengine.language.syntax.expressions.literal.LiteralVisitor\nimport software.amazon.smithy.rust.codegen.client.smithy.endpoint.Context\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.util.dq\nimport java.util.stream.Stream\n\n/**\n * Generator for literals (strings, numbers, bools, lists and objects)\n *\n * The `Document` type is used to support generating JSON-like documents\n */\nclass LiteralGenerator(private val ownership: Ownership, private val context: Context) :\n    LiteralVisitor<Writable> {\n    private val runtimeConfig = context.runtimeConfig\n    private val codegenScope =\n        arrayOf(\n            \"Document\" to RuntimeType.document(runtimeConfig),\n            \"HashMap\" to RuntimeType.HashMap,\n        )\n\n    override fun visitBoolean(b: Boolean) =\n        writable {\n            rust(b.toString())\n        }\n\n    override fun visitString(value: Template) =\n        writable {\n            val parts: Stream<Writable> =\n                value.accept(\n                    TemplateGenerator(ownership) { expr, ownership ->\n                        ExpressionGenerator(ownership, context).generate(expr)\n                    },\n                )\n            parts.forEach { part -> part(this) }\n        }\n\n    override fun visitRecord(members: MutableMap<Identifier, Literal>) =\n        writable {\n            rustBlock(\"\") {\n                rustTemplate(\n                    \"let mut out = #{HashMap}::<String, #{Document}>::new();\",\n                    *codegenScope,\n                )\n                members.keys.sortedBy { it.toString() }.map { k -> k to members[k]!! }.forEach { (identifier, literal) ->\n                    rust(\n                        \"out.insert(${identifier.toString().dq()}.to_string(), #W.into());\",\n                        // When writing into the hashmap, it always needs to be an owned type\n                        ExpressionGenerator(Ownership.Owned, context).generate(literal),\n                    )\n                }\n                rustTemplate(\"out\")\n            }\n        }\n\n    override fun visitTuple(members: MutableList<Literal>) =\n        writable {\n            rustTemplate(\n                \"vec![#{inner:W}]\", *codegenScope,\n                \"inner\" to\n                    writable {\n                        members.forEach { literal ->\n                            rustTemplate(\n                                \"#{Document}::from(#{literal:W}),\",\n                                *codegenScope,\n                                \"literal\" to\n                                    ExpressionGenerator(\n                                        Ownership.Owned,\n                                        context,\n                                    ).generate(literal),\n                            )\n                        }\n                    },\n            )\n        }\n\n    override fun visitInteger(value: Int) =\n        writable {\n            rust(\"$value\")\n        }\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/rulesgen/Ownership.kt",
    "content": "/*\n *  Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n *  SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.endpoint.rulesgen\n\nsealed class Ownership {\n    object Borrowed : Ownership() {\n        override fun toString(): String {\n            return \"Borrowed\"\n        }\n    }\n\n    object Owned : Ownership() {\n        override fun toString(): String {\n            return \"Owned\"\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/rulesgen/StdLib.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.endpoint.rulesgen\n\nimport software.amazon.smithy.model.node.Node\nimport software.amazon.smithy.rust.codegen.client.smithy.endpoint.EndpointsLib\nimport software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators.CustomRuntimeFunction\nimport software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators.EndpointStdLib\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.util.dq\n\n/**\n * Standard library functions available to all generated crates (e.g. not `aws.` specific / prefixed)\n */\ninternal val SmithyEndpointsStdLib: List<CustomRuntimeFunction> =\n    listOf(\n        SimpleRuntimeFunction(\"substring\", EndpointsLib.substring, RuntimeType.lifetimeStr()),\n        SimpleRuntimeFunction(\"isValidHostLabel\", EndpointsLib.isValidHostLabel, RuntimeType.Bool),\n        SimpleRuntimeFunction(\"parseURL\", EndpointsLib.parseUrl, EndpointsLib.url()),\n        SimpleRuntimeFunction(\"uriEncode\", EndpointsLib.uriEncode, RuntimeType.lifetimeCow()),\n        SimpleRuntimeFunction(\"split\", EndpointsLib.split, RuntimeType.typedVec(RuntimeType.lifetimeStr())),\n        // The runtime types for coalesce, ite, and evaluate_bdd are a bit of a lie since the return type is generic.\n        // In practice they aren't actually used.\n        SimpleRuntimeFunction(\"coalesce\", EndpointsLib.coalesce, RuntimeType.Option),\n        SimpleRuntimeFunction(\"ite\", EndpointsLib.ite, RuntimeType.Option),\n        SimpleRuntimeFunction(\"evaluate_bdd\", EndpointsLib.evaluateBdd, RuntimeType.Option),\n    )\n\n/**\n * AWS Standard library functions\n *\n * This is defined in client-codegen to support running tests—it is not used when generating smithy-native services.\n */\nfun awsStandardLib(\n    runtimeConfig: RuntimeConfig,\n    partitionsDotJson: Node,\n) = listOf(\n    SimpleRuntimeFunction(\"aws.parseArn\", EndpointsLib.awsParseArn, EndpointsLib.arn()),\n    SimpleRuntimeFunction(\"aws.isVirtualHostableS3Bucket\", EndpointsLib.awsIsVirtualHostableS3Bucket, RuntimeType.Bool),\n    AwsPartitionResolver(runtimeConfig, partitionsDotJson),\n)\n\n/**\n * Implementation of the `aws.partition` standard library function.\n *\n * A default `partitionsDotJson` node MUST be provided. The node MUST contain an AWS partition.\n */\nclass AwsPartitionResolver(private val runtimeConfig: RuntimeConfig, private val partitionsDotJson: Node) :\n    CustomRuntimeFunction() {\n    override val id: String = \"aws.partition\"\n    private val codegenScope =\n        arrayOf(\n            \"Partition\" to EndpointsLib.partition(runtimeConfig),\n            \"PartitionResolver\" to EndpointsLib.partitionResolver(runtimeConfig),\n            \"tracing\" to RuntimeType.Tracing,\n        )\n\n    private val defaultPartitionResolver =\n        RuntimeType.forInlineFun(\"DEFAULT_PARTITION_RESOLVER\", EndpointStdLib) {\n            rustTemplate(\n                \"\"\"\n                // Loading the partition JSON is expensive since it involves many regex compilations,\n                // so cache the result so that it only need to be paid for the first constructed client.\n                pub(crate) static DEFAULT_PARTITION_RESOLVER: std::sync::LazyLock<#{PartitionResolver}> =\n                    std::sync::LazyLock::new(|| {\n                        match std::env::var(\"SMITHY_CLIENT_SDK_CUSTOM_PARTITION\") {\n                            Ok(partitions) => {\n                                #{tracing}::debug!(\"loading custom partitions located at {partitions}\");\n                                let partition_dot_json = std::fs::read_to_string(partitions).expect(\"should be able to read a custom partition JSON\");\n                                #{PartitionResolver}::new_from_json(partition_dot_json.as_bytes()).expect(\"valid JSON\")\n                            },\n                            _ => {\n                                #{tracing}::debug!(\"loading default partitions\");\n                                #{PartitionResolver}::new_from_json(b${\n                    Node.printJson(partitionsDotJson).dq()\n                }).expect(\"valid JSON\")\n                            }\n                        }\n                    });\n                \"\"\",\n                *codegenScope,\n            )\n        }\n\n    override fun structFieldInit() =\n        writable {\n            rustTemplate(\n                \"\"\"partition_resolver: #{DEFAULT_PARTITION_RESOLVER}.clone()\"\"\",\n                *codegenScope,\n                \"DEFAULT_PARTITION_RESOLVER\" to\n                    defaultPartitionResolver,\n            )\n        }\n\n    override fun structFieldInitBdd() =\n        writable {\n            val json = Node.printJson(partitionsDotJson).dq()\n            rustTemplate(\n                \"\"\"partition_resolver: &#{DEFAULT_PARTITION_RESOLVER}\"\"\",\n                *codegenScope,\n                \"DEFAULT_PARTITION_RESOLVER\" to\n                    defaultPartitionResolver,\n            )\n        }\n\n    override fun additionalArgsSignature(): Writable =\n        writable {\n            rustTemplate(\"partition_resolver: &#{PartitionResolver}\", *codegenScope)\n        }\n\n    override fun additionalArgsSignatureBdd(): Writable =\n        writable {\n            rustTemplate(\"partition_resolver: &'a #{PartitionResolver}\", *codegenScope)\n        }\n\n    override fun additionalArgsInvocation(self: String) =\n        writable {\n            rust(\"&$self.partition_resolver\")\n        }\n\n    override fun structField(): Writable =\n        writable {\n            rustTemplate(\"partition_resolver: #{PartitionResolver}\", *codegenScope)\n        }\n\n    override fun structFieldBdd(): Writable =\n        writable {\n            rustTemplate(\"partition_resolver: &'static #{PartitionResolver}\", *codegenScope)\n        }\n\n    override fun usage() = writable { rust(\"partition_resolver.resolve_partition\") }\n\n    override fun returnType(): RuntimeType = EndpointsLib.partition(runtimeConfig)\n}\n\n/**\n * A runtime function that doesn't need any support structures and can be invoked directly.\n *\n * Currently, this is every runtime function other than `aws.partition`.\n */\nprivate class SimpleRuntimeFunction(\n    override val id: String,\n    private val runtimeType: RuntimeType,\n    val returnType: RuntimeType,\n) :\n    CustomRuntimeFunction() {\n    override fun structFieldInit(): Writable? = null\n\n    override fun structFieldInitBdd(): Writable? = null\n\n    override fun additionalArgsSignature(): Writable? = null\n\n    override fun additionalArgsSignatureBdd(): Writable? = null\n\n    override fun additionalArgsInvocation(self: String): Writable? = null\n\n    override fun structField(): Writable? = null\n\n    override fun structFieldBdd(): Writable? = null\n\n    override fun usage() = writable { rust(\"#T\", runtimeType) }\n\n    override fun returnType() = returnType\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/rulesgen/TemplateGenerator.kt",
    "content": "/*\n *  Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n *  SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.endpoint.rulesgen\n\nimport software.amazon.smithy.rulesengine.language.syntax.expressions.Expression\nimport software.amazon.smithy.rulesengine.language.syntax.expressions.TemplateVisitor\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.util.dq\n\n/**\n * Template Generator\n *\n * Templates can be in one of 3 possible formats:\n * 1. Single static string: `https://staticurl.com`. In this case, we return a string literal.\n * 2. Single dynamic string: `{Region}`. In this case we delegate directly to the underlying expression.\n * 3. Compound string: `https://{Region}.example.com`. In this case, we use a string builder:\n * ```rust\n * {\n *   let mut out = String::new();\n *   out.push_str(\"https://\");\n *   out.push_str(region);\n *   out.push_str(\".example.com);\n *   out\n * }\n * ```\n */\nclass TemplateGenerator(\n    private val ownership: Ownership,\n    private val exprGenerator: (Expression, Ownership) -> Writable,\n) : TemplateVisitor<Writable> {\n    override fun visitStaticTemplate(value: String) =\n        writable {\n            // In the case of a static template, return the literal string, eg. `\"foo\"`.\n            rust(value.dq())\n            if (ownership == Ownership.Owned) {\n                rust(\".to_string()\")\n            }\n        }\n\n    override fun visitSingleDynamicTemplate(expr: Expression): Writable {\n        return exprGenerator(expr, ownership)\n    }\n\n    override fun visitStaticElement(str: String) =\n        writable {\n            when (str.length) {\n                0 -> {}\n                1 -> rust(\"out.push('$str');\")\n                else -> rust(\"out.push_str(${str.dq()});\")\n            }\n        }\n\n    override fun visitDynamicElement(expr: Expression) =\n        writable {\n            // we don't need to own the argument to push_str\n            Attribute.AllowClippyNeedlessBorrow.render(this)\n            rust(\"out.push_str(&#W);\", exprGenerator(expr, Ownership.Borrowed))\n        }\n\n    override fun startMultipartTemplate() =\n        writable {\n            if (ownership == Ownership.Borrowed) {\n                rust(\"&\")\n            }\n            rust(\"{ let mut out = String::new();\")\n        }\n\n    override fun finishMultipartTemplate() =\n        writable {\n            rust(\" out }\")\n        }\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientBuilderInstantiator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.generators\n\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.map\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.BuilderGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.BuilderInstantiator\n\nclass ClientBuilderInstantiator(private val clientCodegenContext: ClientCodegenContext) : BuilderInstantiator {\n    override fun setField(\n        builder: String,\n        value: Writable,\n        field: MemberShape,\n    ): Writable {\n        return setFieldWithSetter(builder, value, field)\n    }\n\n    /**\n     * For the client, we finalize builders with error correction enabled\n     */\n    override fun finalizeBuilder(\n        builder: String,\n        shape: StructureShape,\n        mapErr: Writable?,\n    ): Writable =\n        writable {\n            val correctErrors = clientCodegenContext.correctErrors(shape)\n            val builderW =\n                writable {\n                    when {\n                        correctErrors != null -> rustTemplate(\"#{correctErrors}($builder)\", \"correctErrors\" to correctErrors)\n                        else -> rustTemplate(builder)\n                    }\n                }\n            if (BuilderGenerator.hasFallibleBuilder(shape, clientCodegenContext.symbolProvider)) {\n                rustTemplate(\n                    \"#{builder}.build()#{mapErr}\",\n                    \"builder\" to builderW,\n                    \"mapErr\" to (\n                        mapErr?.map {\n                            rust(\".map_err(#T)?\", it)\n                        } ?: writable { }\n                    ),\n                )\n            } else {\n                rustTemplate(\n                    \"#{builder}.build()\",\n                    \"builder\" to builderW,\n                )\n            }\n        }\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientEnumGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.generators\n\nimport software.amazon.smithy.model.shapes.StringShape\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustModule\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.Visibility\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.docs\nimport software.amazon.smithy.rust.codegen.core.rustlang.rawRust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.EnumCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.EnumGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.EnumGeneratorContext\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.EnumMemberModel\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.EnumType\nimport software.amazon.smithy.rust.codegen.core.util.dq\n\n/** Infallible enums have an `Unknown` variant and can't fail to parse */\ndata class InfallibleEnumType(\n    val unknownVariantModule: RustModule,\n) : EnumType() {\n    companion object {\n        /** Name of the generated unknown enum member name for enums with named members. */\n        const val UNKNOWN_VARIANT = \"Unknown\"\n\n        /** Name of the opaque struct that is inner data for the generated [UNKNOWN_VARIANT]. */\n        const val UNKNOWN_VARIANT_VALUE = \"UnknownVariantValue\"\n    }\n\n    override fun implFromForStr(context: EnumGeneratorContext): Writable =\n        writable {\n            rustTemplate(\n                \"\"\"\n                impl #{From}<&str> for ${context.enumName} {\n                    fn from(s: &str) -> Self {\n                        match s {\n                            #{matchArms}\n                        }\n                    }\n                }\n                \"\"\",\n                \"From\" to RuntimeType.From,\n                \"matchArms\" to\n                    writable {\n                        context.sortedMembers.forEach { member ->\n                            rawRust(\"${member.value.dq()} => ${context.enumName}::${member.derivedName()},\\n\")\n                        }\n                        rust(\n                            \"other => ${context.enumName}::$UNKNOWN_VARIANT(#T(other.to_owned()))\",\n                            unknownVariantValue(context),\n                        )\n                    },\n            )\n        }\n\n    override fun implFromStr(context: EnumGeneratorContext): Writable =\n        writable {\n            rustTemplate(\n                \"\"\"\n                impl ::std::str::FromStr for ${context.enumName} {\n                    type Err = ::std::convert::Infallible;\n\n                    fn from_str(s: &str) -> #{Result}<Self, <Self as ::std::str::FromStr>::Err> {\n                        #{Ok}(${context.enumName}::from(s))\n                    }\n                }\n                \"\"\",\n                *preludeScope,\n            )\n        }\n\n    override fun implFromForStrForUnnamedEnum(context: EnumGeneratorContext): Writable =\n        writable {\n            rustTemplate(\n                \"\"\"\n                impl<T> #{From}<T> for ${context.enumName} where T: #{AsRef}<str> {\n                    fn from(s: T) -> Self {\n                        ${context.enumName}(s.as_ref().to_owned())\n                    }\n                }\n                \"\"\",\n                *preludeScope,\n            )\n        }\n\n    override fun implFromStrForUnnamedEnum(context: EnumGeneratorContext): Writable =\n        writable {\n            // Add an infallible FromStr implementation for uniformity\n            rustTemplate(\n                \"\"\"\n                impl ::std::str::FromStr for ${context.enumName} {\n                    type Err = ::std::convert::Infallible;\n\n                    fn from_str(s: &str) -> #{Result}<Self, <Self as ::std::str::FromStr>::Err> {\n                        #{Ok}(${context.enumName}::from(s))\n                    }\n                }\n                \"\"\",\n                *preludeScope,\n            )\n        }\n\n    override fun additionalEnumImpls(context: EnumGeneratorContext): Writable =\n        writable {\n            // `try_parse` isn't needed for unnamed enums\n            if (context.enumTrait.hasNames()) {\n                rustTemplate(\n                    \"\"\"\n                    impl ${context.enumName} {\n                        /// Parses the enum value while disallowing unknown variants.\n                        ///\n                        /// Unknown variants will result in an error.\n                        pub fn try_parse(value: &str) -> #{Result}<Self, #{UnknownVariantError}> {\n                            match Self::from(value) {\n                                ##[allow(deprecated)]\n                                Self::Unknown(_) => #{Err}(#{UnknownVariantError}::new(value)),\n                                known => Ok(known),\n                            }\n                        }\n                    }\n                    \"\"\",\n                    *preludeScope,\n                    \"UnknownVariantError\" to unknownVariantError(),\n                )\n\n                rustTemplate(\n                    \"\"\"\n                    impl #{Display} for ${context.enumName} {\n                        fn fmt(&self, f: &mut #{Fmt}::Formatter) -> #{Fmt}::Result {\n                            match self {\n                                #{matchArms}\n                            }\n                        }\n                    }\n                    \"\"\",\n                    \"Display\" to RuntimeType.Display,\n                    \"Fmt\" to RuntimeType.stdFmt,\n                    \"matchArms\" to\n                        writable {\n                            context.sortedMembers.forEach { member ->\n                                rawRust(\"${context.enumName}::${member.derivedName()} => write!(f, ${member.value.dq()}),\\n\")\n                            }\n                            rust(\"\"\"${context.enumName}::Unknown(value) => write!(f, \"{value}\")\"\"\")\n                        },\n                )\n            }\n        }\n\n    override fun additionalDocs(context: EnumGeneratorContext): Writable =\n        writable {\n            renderForwardCompatibilityNote(\n                context.enumName,\n                context.sortedMembers,\n                UNKNOWN_VARIANT,\n                UNKNOWN_VARIANT_VALUE,\n            )\n        }\n\n    override fun additionalEnumMembers(context: EnumGeneratorContext): Writable =\n        writable {\n            docs(\"`$UNKNOWN_VARIANT` contains new variants that have been added since this code was generated.\")\n            rust(\n                \"\"\"##[deprecated(note = \"Don't directly match on `$UNKNOWN_VARIANT`. See the docs on this enum for the correct way to handle unknown variants.\")]\"\"\",\n            )\n            rust(\"$UNKNOWN_VARIANT(#T)\", unknownVariantValue(context))\n        }\n\n    override fun additionalAsStrMatchArms(context: EnumGeneratorContext): Writable =\n        writable {\n            rust(\"${context.enumName}::$UNKNOWN_VARIANT(value) => value.as_str()\")\n        }\n\n    private fun unknownVariantValue(context: EnumGeneratorContext): RuntimeType {\n        return RuntimeType.forInlineFun(UNKNOWN_VARIANT_VALUE, unknownVariantModule) {\n            docs(\n                \"\"\"\n                Opaque struct used as inner data for the `Unknown` variant defined in enums in\n                the crate.\n\n                This is not intended to be used directly.\n                \"\"\".trimIndent(),\n            )\n\n            // The UnknownVariant's underlying opaque type should always derive `Debug`. If this isn't explicitly\n            // added and the first enum to render this module has the `@sensitive` trait then the UnknownVariant\n            // inherits that sensitivity and does not derive `Debug`. This leads to issues deriving `Debug` for\n            // all enum variants that are not marked `@sensitive`.\n            context.enumMeta.withDerives(RuntimeType.Debug).render(this)\n            rustTemplate(\"struct $UNKNOWN_VARIANT_VALUE(pub(crate) #{String});\", *preludeScope)\n            rustBlock(\"impl $UNKNOWN_VARIANT_VALUE\") {\n                // The generated as_str is not pub as we need to prevent users from calling it on this opaque struct.\n                rustBlock(\"pub(crate) fn as_str(&self) -> &str\") {\n                    rust(\"&self.0\")\n                }\n            }\n            rustTemplate(\n                \"\"\"\n                impl #{Display} for $UNKNOWN_VARIANT_VALUE {\n                    fn fmt(&self, f: &mut #{Fmt}::Formatter) -> #{Fmt}::Result {\n                        write!(f, \"{}\", self.0)\n                    }\n                }\n                \"\"\",\n                \"Display\" to RuntimeType.Display,\n                \"Fmt\" to RuntimeType.stdFmt,\n            )\n        }\n    }\n\n    /**\n     * Generate the rustdoc describing how to write a match expression against a generated enum in a\n     * forward-compatible way.\n     */\n    private fun RustWriter.renderForwardCompatibilityNote(\n        enumName: String,\n        sortedMembers: List<EnumMemberModel>,\n        unknownVariant: String,\n        unknownVariantValue: String,\n    ) {\n        docs(\n            \"\"\"\n            When writing a match expression against `$enumName`, it is important to ensure\n            your code is forward-compatible. That is, if a match arm handles a case for a\n            feature that is supported by the service but has not been represented as an enum\n            variant in a current version of SDK, your code should continue to work when you\n            upgrade SDK to a future version in which the enum does include a variant for that\n            feature.\n            \"\"\".trimIndent(),\n        )\n        docs(\"\")\n        docs(\"Here is an example of how you can make a match expression forward-compatible:\")\n        docs(\"\")\n        docs(\"```text\")\n        rust(\"/// ## let ${enumName.lowercase()} = unimplemented!();\")\n        rust(\"/// match ${enumName.lowercase()} {\")\n        sortedMembers.mapNotNull { it.name() }.forEach { member ->\n            rust(\"///     $enumName::${member.name} => { /* ... */ },\")\n        }\n        rust(\"\"\"///     other @ _ if other.as_str() == \"NewFeature\" => { /* handles a case for `NewFeature` */ },\"\"\")\n        rust(\"///     _ => { /* ... */ },\")\n        rust(\"/// }\")\n        docs(\"```\")\n        docs(\n            \"\"\"\n            The above code demonstrates that when `${enumName.lowercase()}` represents\n            `NewFeature`, the execution path will lead to the second last match arm,\n            even though the enum does not contain a variant `$enumName::NewFeature`\n            in the current version of SDK. The reason is that the variable `other`,\n            created by the `@` operator, is bound to\n            `$enumName::$unknownVariant($unknownVariantValue(\"NewFeature\".to_owned()))`\n            and calling `as_str` on it yields `\"NewFeature\"`.\n            This match expression is forward-compatible when executed with a newer\n            version of SDK where the variant `$enumName::NewFeature` is defined.\n            Specifically, when `${enumName.lowercase()}` represents `NewFeature`,\n            the execution path will hit the second last match arm as before by virtue of\n            calling `as_str` on `$enumName::NewFeature` also yielding `\"NewFeature\"`.\n            \"\"\".trimIndent(),\n        )\n        docs(\"\")\n        docs(\n            \"\"\"\n            Explicitly matching on the `$unknownVariant` variant should\n            be avoided for two reasons:\n            - The inner data `$unknownVariantValue` is opaque, and no further information can be extracted.\n            - It might inadvertently shadow other intended match arms.\n            \"\"\".trimIndent(),\n        )\n        docs(\"\")\n    }\n}\n\nclass ClientEnumGenerator(\n    codegenContext: ClientCodegenContext,\n    shape: StringShape,\n    customizations: List<EnumCustomization>,\n) :\n    EnumGenerator(\n            codegenContext.model,\n            codegenContext.symbolProvider,\n            shape,\n            InfallibleEnumType(\n                RustModule.new(\n                    \"sealed_enum_unknown\",\n                    visibility = Visibility.PUBCRATE,\n                    parent = ClientRustModule.primitives,\n                ),\n            ),\n            customizations,\n        )\n\nprivate fun unknownVariantError(): RuntimeType =\n    RuntimeType.forInlineFun(\"UnknownVariantError\", ClientRustModule.Error) {\n        rustTemplate(\n            \"\"\"\n            /// The given enum value failed to parse since it is not a known value.\n            ##[derive(Debug)]\n            pub struct UnknownVariantError {\n                value: #{String},\n            }\n            impl UnknownVariantError {\n                pub(crate) fn new(value: impl #{Into}<#{String}>) -> Self {\n                    Self { value: value.into() }\n                }\n            }\n            impl ::std::fmt::Display for UnknownVariantError {\n                fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> #{Result}<(), ::std::fmt::Error> {\n                    write!(f, \"unknown enum variant: '{}'\", self.value)\n                }\n            }\n            impl ::std::error::Error for UnknownVariantError {}\n            \"\"\",\n            *preludeScope,\n        )\n    }\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientInstantiator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.generators\n\nimport software.amazon.smithy.model.node.Node\nimport software.amazon.smithy.model.node.ObjectNode\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.client.FluentClientGenerator\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenContext\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.BuilderGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.Instantiator\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.setterName\n\nclass ClientBuilderKindBehavior(val codegenContext: CodegenContext) : Instantiator.BuilderKindBehavior {\n    override fun hasFallibleBuilder(shape: StructureShape): Boolean =\n        BuilderGenerator.hasFallibleBuilder(shape, codegenContext.symbolProvider)\n\n    override fun setterName(memberShape: MemberShape): String = memberShape.setterName()\n\n    override fun doesSetterTakeInOption(memberShape: MemberShape): Boolean = true\n}\n\nclass ClientInstantiator(private val codegenContext: ClientCodegenContext, withinTest: Boolean = false) : Instantiator(\n    codegenContext.symbolProvider,\n    codegenContext.model,\n    codegenContext.runtimeConfig,\n    ClientBuilderKindBehavior(codegenContext),\n    withinTest = false,\n) {\n    fun renderFluentCall(\n        writer: RustWriter,\n        clientName: String,\n        operationShape: OperationShape,\n        inputShape: StructureShape,\n        data: Node,\n        headers: Map<String, String> = mapOf(),\n        ctx: Ctx = Ctx(),\n    ) {\n        val operationBuilderName =\n            FluentClientGenerator.clientOperationFnName(operationShape, codegenContext.symbolProvider)\n\n        writer.rust(\"$clientName.$operationBuilderName()\")\n\n        renderStructureMembers(writer, inputShape, data as ObjectNode, headers, ctx)\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientRuntimeTypesReExportGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.generators\n\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule\nimport software.amazon.smithy.rust.codegen.client.smithy.endpoint.Types\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RustCrate\n\nclass ClientRuntimeTypesReExportGenerator(\n    private val codegenContext: ClientCodegenContext,\n    private val rustCrate: RustCrate,\n) {\n    fun render() {\n        val rc = codegenContext.runtimeConfig\n        val smithyRuntimeApi = RuntimeType.smithyRuntimeApiClient(rc)\n\n        rustCrate.withModule(ClientRustModule.config) {\n            rustTemplate(\n                \"\"\"\n                pub use #{ConfigBag};\n                pub use #{RuntimeComponents};\n                pub use #{IdentityCache};\n                \"\"\",\n                \"ConfigBag\" to RuntimeType.configBag(rc),\n                \"Intercept\" to RuntimeType.intercept(rc),\n                \"RuntimeComponents\" to RuntimeType.runtimeComponents(rc),\n                \"SharedInterceptor\" to RuntimeType.sharedInterceptor(rc),\n                \"IdentityCache\" to RuntimeType.smithyRuntime(rc).resolve(\"client::identity::IdentityCache\"),\n            )\n        }\n        rustCrate.withModule(ClientRustModule.Config.endpoint) {\n            rustTemplate(\n                \"\"\"\n                pub use #{SharedEndpointResolver};\n                pub use #{EndpointFuture};\n                pub use #{Endpoint};\n                \"\"\",\n                *Types(rc).toArray(),\n            )\n        }\n        rustCrate.withModule(ClientRustModule.Config.retry) {\n            rustTemplate(\n                \"\"\"\n                pub use #{ClassifyRetry};\n                pub use #{RetryAction};\n                pub use #{ShouldAttempt};\n                \"\"\",\n                \"ClassifyRetry\" to smithyRuntimeApi.resolve(\"client::retries::classifiers::ClassifyRetry\"),\n                \"RetryAction\" to smithyRuntimeApi.resolve(\"client::retries::classifiers::RetryAction\"),\n                \"ShouldAttempt\" to smithyRuntimeApi.resolve(\"client::retries::ShouldAttempt\"),\n            )\n        }\n        rustCrate.withModule(ClientRustModule.Config.http) {\n            rustTemplate(\n                \"\"\"\n                pub use #{HttpRequest};\n                pub use #{HttpResponse};\n                \"\"\",\n                \"HttpRequest\" to smithyRuntimeApi.resolve(\"client::orchestrator::HttpRequest\"),\n                \"HttpResponse\" to smithyRuntimeApi.resolve(\"client::orchestrator::HttpResponse\"),\n            )\n        }\n        rustCrate.withModule(ClientRustModule.Config.interceptors) {\n            rustTemplate(\n                \"\"\"\n                pub use #{AfterDeserializationInterceptorContextRef};\n                pub use #{BeforeDeserializationInterceptorContextMut};\n                pub use #{BeforeDeserializationInterceptorContextRef};\n                pub use #{BeforeSerializationInterceptorContextMut};\n                pub use #{BeforeSerializationInterceptorContextRef};\n                pub use #{BeforeTransmitInterceptorContextMut};\n                pub use #{BeforeTransmitInterceptorContextRef};\n                pub use #{FinalizerInterceptorContextMut};\n                pub use #{FinalizerInterceptorContextRef};\n                pub use #{InterceptorContext};\n                \"\"\",\n                \"AfterDeserializationInterceptorContextRef\" to RuntimeType.afterDeserializationInterceptorContextRef(rc),\n                \"BeforeDeserializationInterceptorContextMut\" to RuntimeType.beforeDeserializationInterceptorContextMut(rc),\n                \"BeforeDeserializationInterceptorContextRef\" to RuntimeType.beforeDeserializationInterceptorContextRef(rc),\n                \"BeforeSerializationInterceptorContextMut\" to RuntimeType.beforeSerializationInterceptorContextMut(rc),\n                \"BeforeSerializationInterceptorContextRef\" to RuntimeType.beforeSerializationInterceptorContextRef(rc),\n                \"BeforeTransmitInterceptorContextMut\" to RuntimeType.beforeTransmitInterceptorContextMut(rc),\n                \"BeforeTransmitInterceptorContextRef\" to RuntimeType.beforeTransmitInterceptorContextRef(rc),\n                \"FinalizerInterceptorContextMut\" to RuntimeType.finalizerInterceptorContextMut(rc),\n                \"FinalizerInterceptorContextRef\" to RuntimeType.finalizerInterceptorContextRef(rc),\n                \"InterceptorContext\" to RuntimeType.interceptorContext(rc),\n            )\n        }\n        rustCrate.withModule(ClientRustModule.Error) {\n            rustTemplate(\n                \"pub use #{BoxError};\",\n                \"BoxError\" to RuntimeType.boxError(rc),\n            )\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.generators\n\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.config.ConfigCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.config.ServiceConfig\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.writeCustomizations\n\nclass ConfigOverrideRuntimePluginGenerator(\n    codegenContext: ClientCodegenContext,\n) {\n    private val moduleUseName = codegenContext.moduleUseName()\n    private val codegenScope =\n        codegenContext.runtimeConfig.let { rc ->\n            val runtimeApi = RuntimeType.smithyRuntimeApiClient(rc)\n            val smithyTypes = RuntimeType.smithyTypes(rc)\n            arrayOf(\n                *RuntimeType.preludeScope,\n                \"Cow\" to RuntimeType.Cow,\n                \"CloneableLayer\" to smithyTypes.resolve(\"config_bag::CloneableLayer\"),\n                \"FrozenLayer\" to smithyTypes.resolve(\"config_bag::FrozenLayer\"),\n                \"InterceptorRegistrar\" to runtimeApi.resolve(\"client::interceptors::InterceptorRegistrar\"),\n                \"Layer\" to smithyTypes.resolve(\"config_bag::Layer\"),\n                \"Resolver\" to RuntimeType.smithyRuntime(rc).resolve(\"client::config_override::Resolver\"),\n                \"IdentityCache\" to RuntimeType.smithyRuntime(rc).resolve(\"client::identity::IdentityCache\"),\n                \"RuntimeComponentsBuilder\" to RuntimeType.runtimeComponentsBuilder(rc),\n                \"RuntimePlugin\" to RuntimeType.runtimePlugin(rc),\n            )\n        }\n\n    fun render(\n        writer: RustWriter,\n        customizations: List<ConfigCustomization>,\n    ) {\n        writer.rustTemplate(\n            \"\"\"\n            /// A plugin that enables configuration for a single operation invocation\n            ///\n            /// The `config` method will return a `FrozenLayer` by storing values from `config_override`.\n            /// In the case of default values requested, they will be obtained from `client_config`.\n            ##[derive(Debug)]\n            pub(crate) struct ConfigOverrideRuntimePlugin {\n                pub(crate) config: #{FrozenLayer},\n                pub(crate) components: #{RuntimeComponentsBuilder},\n            }\n\n            impl ConfigOverrideRuntimePlugin {\n                ##[allow(dead_code)] // unused when a service does not provide any operations\n                pub(crate) fn new(\n                    config_override: Builder,\n                    initial_config: #{FrozenLayer},\n                    initial_components: &#{RuntimeComponentsBuilder}\n                ) -> Self {\n                    let mut layer = config_override.config;\n                    let mut components = config_override.runtime_components;\n                    ##[allow(unused_mut)]\n                    let mut resolver = #{Resolver}::overrid(initial_config, initial_components, &mut layer, &mut components);\n\n                    #{config}\n\n                    let _ = resolver;\n\n                    // When the config override supplies an identity resolver for any auth scheme\n                    // known to the client or the override itself, we give this operation its own\n                    // short-lived identity cache so that new partitions don't accumulate in the\n                    // shared client cache. A lazy cache (not `no_cache`) is used so that resolved\n                    // identities are served from the short-lived identity cache on retries.\n                    //\n                    // This is skipped if the override already sets its own identity cache.\n                    if components.has_identity_resolvers() && components.identity_cache().is_none() {\n                        components.set_identity_cache(#{Some}(#{IdentityCache}::lazy().max_partitions(1).build()));\n                    }\n\n                    Self {\n                        config: #{Layer}::from(layer)\n                            .with_name(\"$moduleUseName::config::ConfigOverrideRuntimePlugin\").freeze(),\n                        components,\n                    }\n                }\n            }\n\n            impl #{RuntimePlugin} for ConfigOverrideRuntimePlugin {\n                fn config(&self) -> #{Option}<#{FrozenLayer}> {\n                    Some(self.config.clone())\n                }\n\n                fn runtime_components(&self, _: &#{RuntimeComponentsBuilder}) -> #{Cow}<'_, #{RuntimeComponentsBuilder}> {\n                    #{Cow}::Borrowed(&self.components)\n                }\n            }\n            \"\"\",\n            *codegenScope,\n            \"config\" to\n                writable {\n                    writeCustomizations(\n                        customizations,\n                        ServiceConfig.OperationConfigOverride(\"layer\"),\n                    )\n                },\n        )\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/EndpointTraitBindingGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.generators\n\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.traits.EndpointTrait\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.http.rustFormatString\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute.Companion.AllowUninlinedFormatArgs\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.isOptional\nimport software.amazon.smithy.rust.codegen.core.util.inputShape\n\nfun EndpointTrait.prefixFormatString(): String {\n    return this.hostPrefix.rustFormatString(\"\", \"\")\n}\n\nclass EndpointTraitBindings(\n    model: Model,\n    private val symbolProvider: RustSymbolProvider,\n    private val runtimeConfig: RuntimeConfig,\n    operationShape: OperationShape,\n    private val endpointTrait: EndpointTrait,\n) {\n    private val inputShape = operationShape.inputShape(model)\n    private val endpointPrefix = RuntimeType.smithyRuntimeApiClient(runtimeConfig).resolve(\"client::endpoint::EndpointPrefix\")\n\n    /**\n     * Render the `EndpointPrefix` struct. [input] refers to the symbol referring to the input of this operation.\n     *\n     * Generates code like:\n     * ```rust\n     * EndpointPrefix::new(format!(\"{}.aws.com\", input.bucket));\n     * ```\n     *\n     * The returned expression is a `Result<EndpointPrefix, UriError>`\n     */\n    fun render(\n        writer: RustWriter,\n        input: String,\n        generateValidation: Boolean = true,\n    ) {\n        // the Rust format pattern to make the endpoint prefix e.g. \"{}.foo\"\n        val formatLiteral = endpointTrait.prefixFormatString()\n        if (endpointTrait.hostPrefix.labels.isEmpty()) {\n            // if there are no labels, we don't need string formatting\n            writer.rustTemplate(\n                \"#{EndpointPrefix}::new($formatLiteral)\",\n                \"EndpointPrefix\" to endpointPrefix,\n            )\n        } else {\n            writer.rustBlock(\"\") {\n                // build a list of args: `labelname = \"field\"`\n                // these eventually end up in the format! macro invocation:\n                // ```format!(\"some.{endpoint}\", endpoint = endpoint);```\n                val args =\n                    endpointTrait.hostPrefix.labels.map { label ->\n                        val memberShape = inputShape.getMember(label.content).get()\n                        val field = symbolProvider.toMemberName(memberShape)\n                        if (symbolProvider.toSymbol(memberShape).isOptional()) {\n                            rust(\"let $field = $input.$field.as_deref().unwrap_or_default();\")\n                        } else {\n                            // NOTE: this is dead code until we start respecting @required\n                            rust(\"let $field = &$input.$field;\")\n                        }\n                        if (generateValidation) {\n                            val errorString = \"$field was unset or empty but must be set as part of the endpoint prefix\"\n                            val contents =\n                                \"\"\"\n                                if $field.is_empty() {\n                                    return Err(#{InvalidEndpointError}::failed_to_construct_uri(\"$errorString\").into());\n                                }\n                                \"\"\"\n                            rustTemplate(\n                                contents,\n                                \"InvalidEndpointError\" to\n                                    RuntimeType.smithyRuntimeApiClient(runtimeConfig)\n                                        .resolve(\"client::endpoint::error::InvalidEndpointError\"),\n                            )\n                        }\n                        \"${label.content} = $field\"\n                    }\n                // Suppress the suggestion that would change the following:\n                //   EndpointPrefix::new(format!(\"{accountId}.\"))\n                // To:\n                //   EndpointPrefix::new(format!(\"{accountId}.\", accountId = account_id))\n                AllowUninlinedFormatArgs.render(this)\n                rustTemplate(\n                    \"#{EndpointPrefix}::new(format!($formatLiteral, ${args.joinToString()}))\",\n                    \"EndpointPrefix\" to endpointPrefix,\n                )\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ErrorCorrection.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.generators\n\nimport software.amazon.smithy.model.node.Node\nimport software.amazon.smithy.model.shapes.BlobShape\nimport software.amazon.smithy.model.shapes.BooleanShape\nimport software.amazon.smithy.model.shapes.DocumentShape\nimport software.amazon.smithy.model.shapes.EnumShape\nimport software.amazon.smithy.model.shapes.ListShape\nimport software.amazon.smithy.model.shapes.MapShape\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.NumberShape\nimport software.amazon.smithy.model.shapes.StringShape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.shapes.TimestampShape\nimport software.amazon.smithy.model.shapes.UnionShape\nimport software.amazon.smithy.model.traits.EnumTrait\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustModule\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.isEmpty\nimport software.amazon.smithy.rust.codegen.core.rustlang.map\nimport software.amazon.smithy.rust.codegen.core.rustlang.plus\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.some\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.BuilderGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.PrimitiveInstantiator\nimport software.amazon.smithy.rust.codegen.core.smithy.isRustBoxed\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.shapeFunctionName\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\nimport software.amazon.smithy.rust.codegen.core.util.isEventStream\nimport software.amazon.smithy.rust.codegen.core.util.isStreaming\nimport software.amazon.smithy.rust.codegen.core.util.letIf\n\n/**\n * For AWS-services, the spec defines error correction semantics to recover from missing default values for required members:\n * https://smithy.io/2.0/spec/aggregate-types.html?highlight=error%20correction#client-error-correction\n */\n\nprivate fun ClientCodegenContext.errorCorrectedDefault(member: MemberShape): Writable? {\n    if (!member.isRequired) {\n        return null\n    }\n    val target = model.expectShape(member.target)\n    val memberSymbol = symbolProvider.toSymbol(member)\n    val targetSymbol = symbolProvider.toSymbol(target)\n    if (member.isEventStream(model) || member.isStreaming(model)) {\n        return null\n    }\n    val instantiator = PrimitiveInstantiator(runtimeConfig, symbolProvider)\n    return writable {\n        when {\n            target is EnumShape || target.hasTrait<EnumTrait>() ->\n                rustTemplate(\n                    \"\"\"\"no value was set\".parse::<#{Shape}>().ok()\"\"\",\n                    \"Shape\" to targetSymbol,\n                )\n\n            target is BooleanShape || target is NumberShape || target is StringShape || target is DocumentShape || target is ListShape || target is MapShape ->\n                rust(\n                    \"Some(Default::default())\",\n                )\n\n            target is StructureShape ->\n                rustTemplate(\n                    \"{ let builder = #{Builder}::default(); #{instantiate} }\",\n                    \"Builder\" to symbolProvider.symbolForBuilder(target),\n                    \"instantiate\" to\n                        builderInstantiator().finalizeBuilder(\"builder\", target).map {\n                            if (BuilderGenerator.hasFallibleBuilder(target, symbolProvider)) {\n                                rust(\"#T.ok()\", it)\n                            } else {\n                                it.some()(this)\n                            }\n                        }.letIf(memberSymbol.isRustBoxed()) {\n                            it.plus { rustTemplate(\".map(#{Box}::new)\", *preludeScope) }\n                        },\n                )\n\n            target is TimestampShape -> instantiator.instantiate(target, Node.from(0)).some()(this)\n            target is BlobShape -> instantiator.instantiate(target, Node.from(\"\")).some()(this)\n            target is UnionShape ->\n                rustTemplate(\n                    \"Some(#{unknown})\", *preludeScope,\n                    \"unknown\" to\n                        writable {\n                            if (memberSymbol.isRustBoxed()) {\n                                rust(\"Box::new(#T::Unknown)\", targetSymbol)\n                            } else {\n                                rust(\"#T::Unknown\", targetSymbol)\n                            }\n                        },\n                )\n        }\n    }\n}\n\nfun ClientCodegenContext.correctErrors(shape: StructureShape): RuntimeType? {\n    val name = symbolProvider.shapeFunctionName(serviceShape, shape) + \"_correct_errors\"\n    val corrections =\n        writable {\n            shape.members().forEach { member ->\n                val memberName = symbolProvider.toMemberName(member)\n                errorCorrectedDefault(member)?.also { default ->\n                    rustTemplate(\n                        \"\"\"if builder.$memberName.is_none() { builder.$memberName = #{default} }\"\"\",\n                        \"default\" to default,\n                    )\n                }\n            }\n        }\n\n    if (corrections.isEmpty()) {\n        return null\n    }\n\n    return RuntimeType.forInlineFun(name, RustModule.private(\"serde_util\")) {\n        rustTemplate(\n            \"\"\"\n            pub(crate) fn $name(mut builder: #{Builder}) -> #{Builder} {\n                #{corrections}\n                builder\n            }\n\n            \"\"\",\n            \"Builder\" to symbolProvider.symbolForBuilder(shape),\n            \"corrections\" to corrections,\n        )\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/NestedAccessorGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.generators\n\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustModule\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustType\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenContext\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\nimport software.amazon.smithy.rust.codegen.core.smithy.isOptional\nimport software.amazon.smithy.rust.codegen.core.smithy.makeOptional\nimport software.amazon.smithy.rust.codegen.core.smithy.mapRustType\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.nestedAccessorName\n\n/** Generator for accessing nested fields through optional values **/\nclass NestedAccessorGenerator(private val codegenContext: CodegenContext) {\n    private val symbolProvider = codegenContext.symbolProvider\n    private val module = RustModule.private(\"lens\")\n\n    /**\n     * Generate an accessor on [root] that consumes [root] and returns an `Option<T>` for the nested item\n     */\n    fun generateOwnedAccessor(\n        root: StructureShape,\n        path: List<MemberShape>,\n    ): RuntimeType {\n        check(path.isNotEmpty()) { \"must not be called on an empty path\" }\n        val baseType = symbolProvider.toSymbol(path.last())\n        val fnName = symbolProvider.nestedAccessorName(codegenContext.serviceShape, \"\", root, path)\n        return RuntimeType.forInlineFun(fnName, module) {\n            rustTemplate(\n                \"\"\"\n                pub(crate) fn $fnName(input: #{Input}) -> #{Output} {\n                    #{body:W}\n                }\n                \"\"\",\n                \"Input\" to symbolProvider.toSymbol(root),\n                \"Output\" to baseType.makeOptional(),\n                \"body\" to generateBody(path, false),\n            )\n        }\n    }\n\n    /**\n     * Generate an accessor on [root] that takes a reference and returns an `Option<&T>` for the nested item\n     */\n    fun generateBorrowingAccessor(\n        root: StructureShape,\n        path: List<MemberShape>,\n    ): RuntimeType {\n        check(path.isNotEmpty()) { \"must not be called on an empty path\" }\n        val baseType = symbolProvider.toSymbol(path.last()).makeOptional()\n        val fnName = symbolProvider.nestedAccessorName(codegenContext.serviceShape, \"ref\", root, path)\n        val referencedType = baseType.mapRustType { (it as RustType.Option).referenced(lifetime = null) }\n        return RuntimeType.forInlineFun(fnName, module) {\n            rustTemplate(\n                \"\"\"\n                pub(crate) fn $fnName(input: &#{Input}) -> #{Output} {\n                    #{body:W}\n                }\n                \"\"\",\n                \"Input\" to symbolProvider.toSymbol(root),\n                \"Output\" to referencedType,\n                \"body\" to generateBody(path, true),\n            )\n        }\n    }\n\n    private fun generateBody(\n        path: List<MemberShape>,\n        reference: Boolean,\n    ): Writable =\n        writable {\n            if (path.isEmpty()) {\n                rustTemplate(\"#{Some}(input)\", *preludeScope)\n            } else {\n                val head = path.first()\n                if (symbolProvider.toSymbol(head).isOptional()) {\n                    if (reference) {\n                        rustTemplate(\n                            \"\"\"\n                            let input = match &input.${symbolProvider.toMemberName(head)} {\n                                #{None} => return #{None},\n                                #{Some}(t) => t\n                            };\n                            \"\"\",\n                            *preludeScope,\n                        )\n                    } else {\n                        rustTemplate(\n                            \"\"\"\n                            let input = input.${symbolProvider.toMemberName(head)}?;\n                            \"\"\",\n                            *preludeScope,\n                        )\n                    }\n                } else {\n                    rust(\"let input = input.${symbolProvider.toMemberName(head)};\")\n                }\n                // Note: although _this_ function is recursive, it generates a series of `if let` statements with early returns.\n                generateBody(path.drop(1), reference)(this)\n            }\n        }\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationCustomization.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.generators\n\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.NamedCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.Section\nimport software.amazon.smithy.rust.codegen.core.util.dq\n\nsealed class OperationSection(name: String) : Section(name) {\n    abstract val customizations: List<OperationCustomization>\n\n    /** Write custom code into the `impl` block of this operation */\n    data class OperationImplBlock(override val customizations: List<OperationCustomization>) :\n        OperationSection(\"OperationImplBlock\")\n\n    data class MutateOutput(\n        override val customizations: List<OperationCustomization>,\n        val operationShape: OperationShape,\n        /** Name of the response headers map (for referring to it in Rust code) */\n        val responseHeadersName: String,\n    ) : OperationSection(\"MutateOutput\")\n\n    /**\n     * Allows for adding additional properties to the `extras` field on the\n     * `aws_smithy_types::error::ErrorMetadata`.\n     */\n    data class PopulateErrorMetadataExtras(\n        override val customizations: List<OperationCustomization>,\n        /** Name of the generic error builder (for referring to it in Rust code) */\n        val builderName: String,\n        /** Name of the response status (for referring to it in Rust code) */\n        val responseStatusName: String,\n        /** Name of the response headers map (for referring to it in Rust code) */\n        val responseHeadersName: String,\n    ) : OperationSection(\"PopulateErrorMetadataExtras\")\n\n    /**\n     * Hook to add custom code right before the response is parsed.\n     */\n    data class BeforeParseResponse(\n        override val customizations: List<OperationCustomization>,\n        val responseName: String,\n        /**\n         * Name of the `force_error` variable. Set this to true to trigger error parsing.\n         */\n        val forceError: String,\n        /**\n         * When set, the name of the response body data field\n         */\n        val body: String?,\n    ) : OperationSection(\"BeforeParseResponse\")\n\n    /**\n     * Hook for adding additional things to config inside operation runtime plugins.\n     */\n    data class AdditionalRuntimePluginConfig(\n        override val customizations: List<OperationCustomization>,\n        val newLayerName: String,\n        val operationShape: OperationShape,\n    ) : OperationSection(\"AdditionalRuntimePluginConfig\")\n\n    data class AdditionalInterceptors(\n        override val customizations: List<OperationCustomization>,\n        val operationShape: OperationShape,\n    ) : OperationSection(\"AdditionalInterceptors\") {\n        fun registerInterceptor(\n            runtimeConfig: RuntimeConfig,\n            writer: RustWriter,\n            interceptor: Writable,\n        ) {\n            writer.rustTemplate(\n                \".with_interceptor(#{interceptor})\",\n                \"interceptor\" to interceptor,\n            )\n        }\n\n        fun registerPermanentInterceptor(\n            runtimeConfig: RuntimeConfig,\n            writer: RustWriter,\n            interceptor: Writable,\n        ) {\n            writer.rustTemplate(\n                \".with_interceptor(#{SharedInterceptor}::permanent(#{interceptor}))\",\n                \"SharedInterceptor\" to RuntimeType.sharedInterceptor(runtimeConfig),\n                \"interceptor\" to interceptor,\n            )\n        }\n    }\n\n    /**\n     * Hook for adding supporting types for operation-specific runtime plugins.\n     * Examples include various operation-specific types (retry classifiers, config bag types, etc.)\n     */\n    data class RuntimePluginSupportingTypes(\n        override val customizations: List<OperationCustomization>,\n        val configBagName: String,\n        val operationShape: OperationShape,\n    ) : OperationSection(\"RuntimePluginSupportingTypes\")\n\n    /**\n     * Hook for adding additional runtime plugins to an operation.\n     */\n    data class AdditionalRuntimePlugins(\n        override val customizations: List<OperationCustomization>,\n        val operationShape: OperationShape,\n    ) : OperationSection(\"AdditionalRuntimePlugins\") {\n        fun addClientPlugin(\n            writer: RustWriter,\n            plugin: Writable,\n        ) {\n            writer.rustTemplate(\".with_client_plugin(#{plugin})\", \"plugin\" to plugin)\n        }\n\n        fun addOperationRuntimePlugin(\n            writer: RustWriter,\n            plugin: Writable,\n        ) {\n            writer.rustTemplate(\".with_operation_plugin(#{plugin})\", \"plugin\" to plugin)\n        }\n    }\n\n    data class RetryClassifiers(\n        override val customizations: List<OperationCustomization>,\n        val operationShape: OperationShape,\n    ) : OperationSection(\"RetryClassifiers\") {\n        fun registerRetryClassifier(\n            writer: RustWriter,\n            classifier: Writable,\n        ) {\n            writer.rustTemplate(\".with_retry_classifier(#{classifier})\", \"classifier\" to classifier)\n        }\n    }\n\n    data class CustomizableOperationImpl(\n        override val customizations: List<OperationCustomization>,\n        val operationShape: OperationShape,\n    ) : OperationSection(\"CustomizableOperationImpl\")\n\n    /**\n     * Hook for adding additional fields to the operation's tracing span.\n     */\n    data class AdditionalOperationSpanFields(\n        override val customizations: List<OperationCustomization>,\n        val operationShape: OperationShape,\n    ) : OperationSection(\"AdditionalOperationSpanFields\") {\n        fun addField(\n            writer: RustWriter,\n            metricName: String,\n            value: Writable,\n        ) {\n            writer.rustTemplate(\"${metricName.dq()} = #{value},\", \"value\" to value)\n        }\n    }\n}\n\nabstract class OperationCustomization : NamedCustomization<OperationSection>()\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.generators\n\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators.EndpointParamsInterceptorGenerator\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.protocol.RequestSerializerGenerator\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.protocol.ResponseDeserializerGenerator\nimport software.amazon.smithy.rust.codegen.client.smithy.protocols.ClientHttpBoundProtocolPayloadGenerator\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute.Companion.derive\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.docs\nimport software.amazon.smithy.rust.codegen.core.rustlang.implBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.isNotEmpty\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.writeCustomizations\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.protocol.ProtocolPayloadGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.Protocol\nimport software.amazon.smithy.rust.codegen.core.util.dq\nimport software.amazon.smithy.rust.codegen.core.util.inputShape\nimport software.amazon.smithy.rust.codegen.core.util.outputShape\nimport software.amazon.smithy.rust.codegen.core.util.sdkId\n\nopen class OperationGenerator(\n    private val codegenContext: ClientCodegenContext,\n    private val protocol: Protocol,\n    private val bodyGenerator: ProtocolPayloadGenerator =\n        ClientHttpBoundProtocolPayloadGenerator(\n            codegenContext, protocol,\n        ),\n) {\n    private val model = codegenContext.model\n    private val runtimeConfig = codegenContext.runtimeConfig\n    private val symbolProvider = codegenContext.symbolProvider\n\n    /**\n     * Render the operation struct and its supporting code.\n     */\n    fun renderOperation(\n        operationWriter: RustWriter,\n        operationShape: OperationShape,\n        codegenDecorator: ClientCodegenDecorator,\n    ) {\n        val operationCustomizations =\n            codegenDecorator.operationCustomizations(codegenContext, operationShape, emptyList())\n        renderOperationStruct(\n            operationWriter,\n            operationShape,\n            operationCustomizations,\n        )\n    }\n\n    private fun renderOperationStruct(\n        operationWriter: RustWriter,\n        operationShape: OperationShape,\n        operationCustomizations: List<OperationCustomization>,\n    ) {\n        val operationName = symbolProvider.toSymbol(operationShape).name\n        val serviceName = codegenContext.serviceShape.sdkId()\n\n        // pub struct Operation { ... }\n        operationWriter.rust(\n            \"\"\"\n            /// Orchestration and serialization glue logic for `$operationName`.\n            \"\"\",\n        )\n        Attribute(derive(RuntimeType.Clone, RuntimeType.Default, RuntimeType.Debug)).render(operationWriter)\n        Attribute.NonExhaustive.render(operationWriter)\n        operationWriter.rust(\"pub struct $operationName;\")\n        operationWriter.implBlock(symbolProvider.toSymbol(operationShape)) {\n            docs(\"Creates a new `$operationName`\")\n            rustBlock(\"pub fn new() -> Self\") {\n                rust(\"Self\")\n            }\n\n            val outputType = symbolProvider.toSymbol(operationShape.outputShape(model))\n            val errorType = symbolProvider.symbolForOperationError(operationShape)\n            val codegenScope =\n                arrayOf(\n                    *preludeScope,\n                    \"Arc\" to RuntimeType.Arc,\n                    \"ConcreteInput\" to symbolProvider.toSymbol(operationShape.inputShape(model)),\n                    \"Input\" to\n                        RuntimeType.smithyRuntimeApiClient(runtimeConfig)\n                            .resolve(\"client::interceptors::context::Input\"),\n                    \"Operation\" to symbolProvider.toSymbol(operationShape),\n                    \"OperationError\" to errorType,\n                    \"OperationOutput\" to outputType,\n                    \"HttpResponse\" to\n                        RuntimeType.smithyRuntimeApiClient(runtimeConfig)\n                            .resolve(\"client::orchestrator::HttpResponse\"),\n                    \"SdkError\" to RuntimeType.sdkError(runtimeConfig),\n                )\n            val additionalPlugins =\n                writable {\n                    writeCustomizations(\n                        operationCustomizations,\n                        OperationSection.AdditionalRuntimePlugins(operationCustomizations, operationShape),\n                    )\n                }\n            val additionalSpanFields =\n                writable {\n                    writeCustomizations(\n                        operationCustomizations,\n                        OperationSection.AdditionalOperationSpanFields(operationCustomizations, operationShape),\n                    )\n                }\n            rustTemplate(\n                \"\"\"\n                pub(crate) async fn orchestrate(\n                    runtime_plugins: &#{RuntimePlugins},\n                    input: #{ConcreteInput},\n                ) -> #{Result}<#{OperationOutput}, #{SdkError}<#{OperationError}, #{HttpResponse}>> {\n                    let map_err = |err: #{SdkError}<#{Error}, #{HttpResponse}>| {\n                        err.map_service_error(|err| {\n                            err.downcast::<#{OperationError}>().expect(\"correct error type\")\n                        })\n                    };\n                    let context = Self::orchestrate_with_stop_point(runtime_plugins, input, #{StopPoint}::None)\n                        .await\n                        .map_err(map_err)?;\n                    let output = context.finalize().map_err(map_err)?;\n                    #{Ok}(output.downcast::<#{OperationOutput}>().expect(\"correct output type\"))\n                }\n\n                pub(crate) async fn orchestrate_with_stop_point(\n                    runtime_plugins: &#{RuntimePlugins},\n                    input: #{ConcreteInput},\n                    stop_point: #{StopPoint},\n                ) -> #{Result}<#{InterceptorContext}, #{SdkError}<#{Error}, #{HttpResponse}>> {\n                    let input = #{Input}::erase(input);\n                    use #{Tracing}::Instrument;\n                    #{invoke_with_stop_point}(\n                        ${serviceName.dq()},\n                        ${operationName.dq()},\n                        input,\n                        runtime_plugins,\n                        stop_point\n                    )\n                    // Create a parent span for the entire operation. Includes a random, internal-only,\n                    // seven-digit ID for the operation orchestration so that it can be correlated in the logs.\n                    .instrument(#{Tracing}::debug_span!(\n                            \"$serviceName.$operationName\",\n                            \"rpc.service\" = ${serviceName.dq()},\n                            \"rpc.method\" = ${operationName.dq()},\n                            \"sdk_invocation_id\" = #{FastRand}::u32(1_000_000..10_000_000),\n                            #{AdditionalSpanFields}\n                        ))\n                    .await\n                }\n\n                pub(crate) fn operation_runtime_plugins(\n                    client_runtime_plugins: #{RuntimePlugins},\n                    client_config: &crate::config::Config,\n                    config_override: #{Option}<crate::config::Builder>,\n                ) -> #{RuntimePlugins} {\n                    let mut runtime_plugins = client_runtime_plugins.with_operation_plugin(Self::new());\n                    #{additional_runtime_plugins}\n                    if let #{Some}(config_override) = config_override {\n                        for plugin in config_override.runtime_plugins.iter().cloned() {\n                            runtime_plugins = runtime_plugins.with_operation_plugin(plugin);\n                        }\n                        runtime_plugins = runtime_plugins.with_operation_plugin(\n                            crate::config::ConfigOverrideRuntimePlugin::new(config_override, client_config.config.clone(), &client_config.runtime_components)\n                        );\n                    }\n                    runtime_plugins\n                }\n                \"\"\",\n                *codegenScope,\n                \"Error\" to\n                    RuntimeType.smithyRuntimeApiClient(runtimeConfig)\n                        .resolve(\"client::interceptors::context::Error\"),\n                \"InterceptorContext\" to RuntimeType.interceptorContext(runtimeConfig),\n                \"OrchestratorError\" to\n                    RuntimeType.smithyRuntimeApiClient(runtimeConfig)\n                        .resolve(\"client::orchestrator::error::OrchestratorError\"),\n                \"RuntimePlugin\" to RuntimeType.runtimePlugin(runtimeConfig),\n                \"RuntimePlugins\" to RuntimeType.runtimePlugins(runtimeConfig),\n                \"StopPoint\" to RuntimeType.smithyRuntime(runtimeConfig).resolve(\"client::orchestrator::StopPoint\"),\n                \"invoke_with_stop_point\" to\n                    RuntimeType.smithyRuntime(runtimeConfig)\n                        .resolve(\"client::orchestrator::invoke_with_stop_point\"),\n                \"additional_runtime_plugins\" to\n                    writable {\n                        if (additionalPlugins.isNotEmpty()) {\n                            rustTemplate(\n                                \"\"\"\n                                runtime_plugins = runtime_plugins\n                                    #{additional_runtime_plugins};\n                                \"\"\",\n                                \"additional_runtime_plugins\" to additionalPlugins,\n                            )\n                        }\n                    },\n                \"Tracing\" to RuntimeType.Tracing,\n                \"FastRand\" to RuntimeType.FastRand,\n                \"AdditionalSpanFields\" to additionalSpanFields,\n            )\n\n            writeCustomizations(operationCustomizations, OperationSection.OperationImplBlock(operationCustomizations))\n        }\n\n        OperationRuntimePluginGenerator(codegenContext).render(\n            operationWriter,\n            operationShape,\n            operationName,\n            operationCustomizations,\n        )\n\n        ResponseDeserializerGenerator(codegenContext, protocol)\n            .render(operationWriter, operationShape, operationCustomizations)\n        RequestSerializerGenerator(codegenContext, protocol, bodyGenerator)\n            .render(operationWriter, operationShape)\n\n        EndpointParamsInterceptorGenerator(codegenContext)\n            .render(operationWriter, operationShape)\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/OperationRuntimePluginGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.generators\n\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.auth.AuthSchemeParamsGenerator\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.writeCustomizations\nimport software.amazon.smithy.rust.codegen.core.util.dq\n\n/**\n * Generates operation-level runtime plugins\n */\nclass OperationRuntimePluginGenerator(\n    private val codegenContext: ClientCodegenContext,\n) {\n    private val codegenScope =\n        codegenContext.runtimeConfig.let { rc ->\n            val runtimeApi = RuntimeType.smithyRuntimeApiClient(rc)\n            val smithyTypes = RuntimeType.smithyTypes(rc)\n            arrayOf(\n                *preludeScope,\n                \"AuthSchemeOptionResolverParams\" to runtimeApi.resolve(\"client::auth::AuthSchemeOptionResolverParams\"),\n                \"BoxError\" to RuntimeType.boxError(codegenContext.runtimeConfig),\n                \"ConfigBag\" to RuntimeType.configBag(codegenContext.runtimeConfig),\n                \"Cow\" to RuntimeType.Cow,\n                \"FrozenLayer\" to smithyTypes.resolve(\"config_bag::FrozenLayer\"),\n                \"IntoShared\" to runtimeApi.resolve(\"shared::IntoShared\"),\n                \"Layer\" to smithyTypes.resolve(\"config_bag::Layer\"),\n                \"RetryClassifiers\" to runtimeApi.resolve(\"client::retries::RetryClassifiers\"),\n                \"RuntimeComponentsBuilder\" to RuntimeType.runtimeComponentsBuilder(codegenContext.runtimeConfig),\n                \"RuntimePlugin\" to RuntimeType.runtimePlugin(codegenContext.runtimeConfig),\n                \"ServiceSpecificAuthSchemeParams\" to AuthSchemeParamsGenerator(codegenContext).paramsStruct(),\n                \"SharedAuthSchemeOptionResolver\" to runtimeApi.resolve(\"client::auth::SharedAuthSchemeOptionResolver\"),\n                \"SharedRequestSerializer\" to runtimeApi.resolve(\"client::ser_de::SharedRequestSerializer\"),\n                \"SharedResponseDeserializer\" to runtimeApi.resolve(\"client::ser_de::SharedResponseDeserializer\"),\n            )\n        }\n\n    fun render(\n        writer: RustWriter,\n        operationShape: OperationShape,\n        operationStructName: String,\n        customizations: List<OperationCustomization>,\n    ) {\n        val layerName = operationShape.id.name.dq()\n        writer.rustTemplate(\n            \"\"\"\n            impl #{RuntimePlugin} for $operationStructName {\n                fn config(&self) -> #{Option}<#{FrozenLayer}> {\n                    let mut cfg = #{Layer}::new($layerName);\n\n                    cfg.store_put(#{SharedRequestSerializer}::new(${operationStructName}RequestSerializer));\n                    cfg.store_put(#{SharedResponseDeserializer}::new(${operationStructName}ResponseDeserializer));\n\n                    cfg.store_put(#{AuthSchemeOptionResolverParams}::new(\n                        #{ServiceSpecificAuthSchemeParams}::builder()\n                            .operation_name(${operationShape.id.name.dq()})\n                            .build()\n                            .expect(\"required fields set\")\n                    ));\n\n                    #{additional_config}\n\n                    #{Some}(cfg.freeze())\n                }\n\n                fn runtime_components(&self, _: &#{RuntimeComponentsBuilder}) -> #{Cow}<'_, #{RuntimeComponentsBuilder}> {\n                    ##[allow(unused_mut)]\n                    let mut rcb = #{RuntimeComponentsBuilder}::new($layerName)\n                            #{interceptors}\n                            #{retry_classifiers};\n\n                    #{Cow}::Owned(rcb)\n                }\n            }\n\n            #{runtime_plugin_supporting_types}\n            \"\"\",\n            *codegenScope,\n            *preludeScope,\n            \"additional_config\" to\n                writable {\n                    writeCustomizations(\n                        customizations,\n                        OperationSection.AdditionalRuntimePluginConfig(\n                            customizations,\n                            newLayerName = \"cfg\",\n                            operationShape,\n                        ),\n                    )\n                },\n            \"runtime_plugin_supporting_types\" to\n                writable {\n                    writeCustomizations(\n                        customizations,\n                        OperationSection.RuntimePluginSupportingTypes(customizations, \"cfg\", operationShape),\n                    )\n                },\n            \"interceptors\" to\n                writable {\n                    writeCustomizations(\n                        customizations,\n                        OperationSection.AdditionalInterceptors(customizations, operationShape),\n                    )\n                },\n            \"retry_classifiers\" to\n                writable {\n                    writeCustomizations(\n                        customizations,\n                        OperationSection.RetryClassifiers(customizations, operationShape),\n                    )\n                },\n        )\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/PaginatorGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.generators\n\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.knowledge.PaginatedIndex\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.traits.IdempotencyTokenTrait\nimport software.amazon.smithy.model.traits.PaginatedTrait\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.traits.IsTruncatedPaginatorTrait\nimport software.amazon.smithy.rust.codegen.core.rustlang.InlineDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustModule\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustType\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.render\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.stripOuter\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\nimport software.amazon.smithy.rust.codegen.core.smithy.rustType\nimport software.amazon.smithy.rust.codegen.core.smithy.traits.SyntheticOutputTrait\nimport software.amazon.smithy.rust.codegen.core.util.PANIC\nimport software.amazon.smithy.rust.codegen.core.util.findMemberWithTrait\nimport software.amazon.smithy.rust.codegen.core.util.getTrait\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\nimport software.amazon.smithy.rust.codegen.core.util.inputShape\nimport software.amazon.smithy.rust.codegen.core.util.orNull\nimport software.amazon.smithy.rust.codegen.core.util.outputShape\nimport software.amazon.smithy.rust.codegen.core.util.toPascalCase\n\n// TODO(https://github.com/smithy-lang/smithy-rs/issues/1013) Support pagination when the idempotency trait is present\nfun OperationShape.isPaginated(model: Model) =\n    hasTrait<PaginatedTrait>() && inputShape(model)\n        .findMemberWithTrait<IdempotencyTokenTrait>(model) == null\n\nclass PaginatorGenerator private constructor(\n    private val codegenContext: ClientCodegenContext,\n    operation: OperationShape,\n) {\n    companion object {\n        fun paginatorType(\n            codegenContext: ClientCodegenContext,\n            operationShape: OperationShape,\n        ): RuntimeType? {\n            return if (operationShape.isPaginated(codegenContext.model)) {\n                PaginatorGenerator(codegenContext, operationShape).paginatorType()\n            } else {\n                null\n            }\n        }\n    }\n\n    private val model = codegenContext.model\n    private val symbolProvider = codegenContext.symbolProvider\n    private val runtimeConfig = codegenContext.runtimeConfig\n    private val paginatorName = \"${operation.id.name.toPascalCase()}Paginator\"\n    private val idx = PaginatedIndex.of(model)\n    private val paginationInfo =\n        idx.getPaginationInfo(codegenContext.serviceShape, operation).orNull()\n            ?: PANIC(\"failed to load pagination info\")\n    private val module =\n        RustModule.public(\n            \"paginator\",\n            parent = symbolProvider.moduleForShape(operation),\n            documentationOverride = \"Paginator for this operation\",\n        )\n\n    private val inputType = symbolProvider.toSymbol(operation.inputShape(model))\n    private val outputShape = operation.outputShape(model)\n    private val outputType = symbolProvider.toSymbol(outputShape)\n    private val errorType = symbolProvider.symbolForOperationError(operation)\n\n    private val isTruncatedPaginator =\n        codegenContext.model.getShape(outputShape.toShapeId()).orNull().let { shape ->\n            shape?.getTrait<SyntheticOutputTrait>()?.originalId.let { shapeId ->\n                codegenContext.model.getShape(shapeId).orNull()?.hasTrait<IsTruncatedPaginatorTrait>() ?: false\n            }\n        }\n\n    private fun paginatorType(): RuntimeType =\n        RuntimeType.forInlineFun(\n            paginatorName,\n            module,\n            generate(),\n        )\n\n    private val codegenScope =\n        arrayOf(\n            *preludeScope,\n            \"page_size_setter\" to pageSizeSetter(),\n            // Operation Types\n            \"operation\" to symbolProvider.toSymbol(operation),\n            \"Input\" to inputType,\n            \"Output\" to outputType,\n            \"Error\" to errorType,\n            \"Builder\" to symbolProvider.symbolForBuilder(operation.inputShape(model)),\n            // SDK Types\n            \"HttpResponse\" to\n                RuntimeType.smithyRuntimeApiClient(runtimeConfig)\n                    .resolve(\"client::orchestrator::HttpResponse\"),\n            \"SdkError\" to RuntimeType.sdkError(runtimeConfig),\n            \"pagination_stream\" to RuntimeType.smithyAsync(runtimeConfig).resolve(\"future::pagination_stream\"),\n            // External Types\n            \"Stream\" to RuntimeType.TokioStream.resolve(\"Stream\"),\n        )\n\n    /** Generate the paginator struct & impl **/\n    private fun generate() =\n        writable {\n            val outputTokenLens =\n                NestedAccessorGenerator(codegenContext).generateBorrowingAccessor(\n                    outputShape,\n                    paginationInfo.outputTokenMemberPath,\n                )\n            val inputTokenMember = symbolProvider.toMemberName(paginationInfo.inputTokenMember)\n            rustTemplate(\n                \"\"\"\n                /// Paginator for #{operation:D}\n                pub struct $paginatorName {\n                    handle: std::sync::Arc<crate::client::Handle>,\n                    builder: #{Builder},\n                    stop_on_duplicate_token: bool,\n                }\n\n                impl $paginatorName {\n                    /// Create a new paginator-wrapper\n                    pub(crate) fn new(handle: std::sync::Arc<crate::client::Handle>, builder: #{Builder}) -> Self {\n                        Self {\n                            handle,\n                            builder,\n                            stop_on_duplicate_token: true,\n                        }\n                    }\n\n                    #{page_size_setter:W}\n\n                    #{items_fn:W}\n\n                    /// Stop paginating when the service returns the same pagination token twice in a row.\n                    ///\n                    /// Defaults to true.\n                    ///\n                    /// For certain operations, it may be useful to continue on duplicate token. For example,\n                    /// if an operation is for tailing a log file in real-time, then continuing may be desired.\n                    /// This option can be set to `false` to accommodate these use cases.\n                    pub fn stop_on_duplicate_token(mut self, stop_on_duplicate_token: bool) -> Self {\n                        self.stop_on_duplicate_token = stop_on_duplicate_token;\n                        self\n                    }\n\n                    /// Create the pagination stream\n                    ///\n                    /// _Note:_ No requests will be dispatched until the stream is used\n                    /// (e.g. with the [`.next().await`](aws_smithy_async::future::pagination_stream::PaginationStream::next) method).\n                    pub fn send(self) -> #{pagination_stream}::PaginationStream<#{item_type}> {\n                        // Move individual fields out of self for the borrow checker\n                        let builder = self.builder;\n                        let handle = self.handle;\n                        #{runtime_plugin_init}\n                        #{pagination_stream}::PaginationStream::new(#{pagination_stream}::fn_stream::FnStream::new(move |tx| #{Box}::pin(async move {\n                            // Build the input for the first time. If required fields are missing, this is where we'll produce an early error.\n                            let mut input = match builder.build().map_err(#{SdkError}::construction_failure) {\n                                #{Ok}(input) => input,\n                                #{Err}(e) => { let _ = tx.send(#{Err}(e)).await; return; }\n                            };\n                            loop {\n                                let resp = #{orchestrate};\n                                // If the input member is None or it was an error\n                                let done = match resp {\n                                    #{Ok}(ref resp) => {\n                                        let new_token = #{output_token}(resp);\n                                        #{is_empty_setter:W}\n                                        if !is_empty && new_token == input.$inputTokenMember.as_ref() && self.stop_on_duplicate_token {\n                                            true\n                                        } else {\n                                            input.$inputTokenMember = new_token.cloned();\n                                            is_empty\n                                        }\n                                    },\n                                    #{Err}(_) => true,\n                                };\n                                if tx.send(resp).await.is_err() {\n                                    // receiving end was dropped\n                                    return\n                                }\n                                if done {\n                                    return\n                                }\n                            }\n                        })))\n                    }\n                }\n                \"\"\",\n                *codegenScope,\n                \"items_fn\" to itemsFn(),\n                \"output_token\" to outputTokenLens,\n                \"item_type\" to\n                    writable {\n                        rustTemplate(\"#{Result}<#{Output}, #{SdkError}<#{Error}, #{HttpResponse}>>\", *codegenScope)\n                    },\n                \"orchestrate\" to\n                    writable {\n                        rustTemplate(\n                            \"#{operation}::orchestrate(&runtime_plugins, input.clone()).await\",\n                            *codegenScope,\n                        )\n                    },\n                \"runtime_plugin_init\" to\n                    writable {\n                        rustTemplate(\n                            \"\"\"\n                            let runtime_plugins = #{operation}::operation_runtime_plugins(\n                                handle.runtime_plugins.clone(),\n                                &handle.conf,\n                                #{None},\n                            ).with_operation_plugin(#{PaginatorFeatureTrackerRuntimePlugin}::new());\n                            \"\"\",\n                            *codegenScope,\n                            \"PaginatorFeatureTrackerRuntimePlugin\" to\n                                RuntimeType.forInlineDependency(\n                                    InlineDependency.sdkFeatureTracker(runtimeConfig),\n                                ).resolve(\"paginator::PaginatorFeatureTrackerRuntimePlugin\"),\n                            \"RuntimePlugins\" to RuntimeType.runtimePlugins(runtimeConfig),\n                        )\n                    },\n                \"is_empty_setter\" to isEmptySetter(),\n            )\n        }\n\n    /** Generate code to calculate the value of is_empty. For most paginators this\n     * is indicated by the next token being the empty string. But for paginators\n     * with the isTruncatedPaginator trait the next token is not necessarily empty.\n     * (ex: for s3 ListParts the final next token is \"0\" when pagination is complete,\n     * causing the paginator to go back to the first page and loop forever)\n     * In this case we use a false value of isTruncated as the only indicator that\n     * the pagination is exhausted.\n     * */\n    private fun isEmptySetter() =\n        writable {\n            if (isTruncatedPaginator) {\n                rustTemplate(\n                    \"\"\"\n                    // Pagination is exhausted when `is_truncated` is false\n                    let is_empty = !resp.is_truncated.unwrap_or(false);\n                    \"\"\",\n                )\n            } else {\n                rustTemplate(\n                    \"\"\"\n                    // Pagination is exhausted when the next token is an empty string\n                    let is_empty = new_token.map(|token| token.is_empty()).unwrap_or(true);\n                    \"\"\",\n                )\n            }\n        }\n\n    /** Type of the inner item of the paginator */\n    private fun itemType(): String {\n        val members = paginationInfo.itemsMemberPath\n        val type = symbolProvider.toSymbol(model.expectShape(members.last().target)).rustType()\n        check(type is RustType.Vec || type is RustType.HashMap)\n        return when (type) {\n            is RustType.Vec -> type.member.render(true)\n            is RustType.HashMap -> \"(${type.key.render(true)}, ${type.member.render(true)})\"\n            else -> PANIC(\"only HashMaps or Vecs may be used for item pagination.\")\n        }\n    }\n\n    /** Generate an `.items()` function to expose flattened pagination when modeled */\n    private fun itemsFn(): Writable =\n        writable {\n            itemsPaginator()?.also { itemPaginatorType ->\n                val documentedPath =\n                    paginationInfo.itemsMemberPath.joinToString(\".\") { symbolProvider.toMemberName(it) }\n                rustTemplate(\n                    \"\"\"\n                    /// Create a flattened paginator\n                    ///\n                    /// This paginator automatically flattens results using `$documentedPath`. Queries to the underlying service\n                    /// are dispatched lazily.\n                    pub fn items(self) -> #{ItemPaginator} {\n                        #{ItemPaginator}(self)\n                    }\n                    \"\"\",\n                    \"ItemPaginator\" to itemPaginatorType,\n                )\n            }\n        }\n\n    /** Generate a struct with a `items()` method that flattens the paginator **/\n    private fun itemsPaginator(): RuntimeType? =\n        if (paginationInfo.itemsMemberPath.isEmpty()) {\n            null\n        } else {\n            RuntimeType.forInlineFun(\"${paginatorName}Items\", module) {\n                rustTemplate(\n                    \"\"\"\n                    /// Flattened paginator for `$paginatorName`\n                    ///\n                    /// This is created with [`.items()`]($paginatorName::items)\n                    pub struct ${paginatorName}Items($paginatorName);\n\n                    impl ${paginatorName}Items {\n                        /// Create the pagination stream\n                        ///\n                        /// _Note_: No requests will be dispatched until the stream is used\n                        /// (e.g. with the [`.next().await`](aws_smithy_async::future::pagination_stream::PaginationStream::next) method).\n                        ///\n                        /// To read the entirety of the paginator, use [`.collect::<Result<Vec<_>, _>()`](aws_smithy_async::future::pagination_stream::PaginationStream::collect).\n                        pub fn send(self) -> #{pagination_stream}::PaginationStream<#{item_type}> {\n                            #{pagination_stream}::TryFlatMap::new(self.0.send()).flat_map(|page| #{extract_items}(page).unwrap_or_default().into_iter())\n                        }\n                    }\n\n                    \"\"\",\n                    \"extract_items\" to\n                        NestedAccessorGenerator(codegenContext).generateOwnedAccessor(\n                            outputShape,\n                            paginationInfo.itemsMemberPath,\n                        ),\n                    \"item_type\" to\n                        writable {\n                            rustTemplate(\n                                \"#{Result}<${itemType()}, #{SdkError}<#{Error}, #{HttpResponse}>>\",\n                                *codegenScope,\n                            )\n                        },\n                    *codegenScope,\n                )\n            }\n        }\n\n    private fun pageSizeSetter() =\n        writable {\n            paginationInfo.pageSizeMember.orNull()?.also {\n                val memberName = symbolProvider.toMemberName(it)\n                val pageSizeT =\n                    symbolProvider.toSymbol(it).rustType().stripOuter<RustType.Option>().render(true)\n                rustTemplate(\n                    \"\"\"\n                    /// Set the page size\n                    ///\n                    /// _Note: this method will override any previously set value for `$memberName`_\n                    pub fn page_size(mut self, limit: $pageSizeT) -> Self {\n                        self.builder.$memberName = #{Some}(limit);\n                        self\n                    }\n                    \"\"\",\n                    *preludeScope,\n                )\n            }\n        }\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/SensitiveIndex.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.generators\n\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.knowledge.KnowledgeIndex\nimport software.amazon.smithy.model.selector.Selector\nimport software.amazon.smithy.model.shapes.OperationShape\n\nclass SensitiveIndex(model: Model) : KnowledgeIndex {\n    private val sensitiveInputSelector = Selector.parse(\"operation:test(-[input]-> ~> [trait|sensitive])\")\n    private val sensitiveOutputSelector = Selector.parse(\"operation:test(-[output]-> ~> [trait|sensitive])\")\n    private val sensitiveInputs = sensitiveInputSelector.select(model).map { it.id }.toSet()\n    private val sensitiveOutputs = sensitiveOutputSelector.select(model).map { it.id }.toSet()\n\n    fun hasSensitiveInput(operationShape: OperationShape): Boolean = sensitiveInputs.contains(operationShape.id)\n\n    fun hasSensitiveOutput(operationShape: OperationShape): Boolean = sensitiveOutputs.contains(operationShape.id)\n\n    companion object {\n        fun of(model: Model): SensitiveIndex {\n            return model.getKnowledge(SensitiveIndex::class.java) {\n                SensitiveIndex(it)\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ServiceGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.generators\n\nimport software.amazon.smithy.model.knowledge.TopDownIndex\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.TestUtilFeature\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.config.ServiceConfigGenerator\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.error.ServiceErrorGenerator\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute\nimport software.amazon.smithy.rust.codegen.core.smithy.RustCrate\n\n/**\n * ServiceGenerator\n *\n * Service generator is the main code generation entry point for Smithy services. Individual structures and unions are\n * generated in codegen visitor, but this class handles all protocol-specific code generation.\n */\nclass ServiceGenerator(\n    private val rustCrate: RustCrate,\n    private val codegenContext: ClientCodegenContext,\n    private val decorator: ClientCodegenDecorator,\n) {\n    private val index = TopDownIndex.of(codegenContext.model)\n\n    /**\n     * Render Service-specific code. Code will end up in different files via `useShapeWriter`. See `SymbolVisitor.kt`\n     * which assigns a symbol location to each shape.\n     */\n    fun render() {\n        val operations = index.getContainedOperations(codegenContext.serviceShape).sortedBy { it.id }\n        ServiceErrorGenerator(\n            codegenContext,\n            operations,\n            decorator.errorCustomizations(codegenContext, emptyList()),\n        ).render(rustCrate)\n\n        rustCrate.withModule(ClientRustModule.config) {\n            val serviceConfigGenerator =\n                ServiceConfigGenerator.withBaseBehavior(\n                    codegenContext,\n                    extraCustomizations = decorator.configCustomizations(codegenContext, listOf()),\n                )\n            serviceConfigGenerator.render(this)\n\n            // Enable users to opt in to the `test-util` feature in the runtime crate\n            rustCrate.mergeFeature(TestUtilFeature.copy(deps = listOf(\"aws-smithy-runtime/test-util\")))\n\n            ServiceRuntimePluginGenerator(codegenContext)\n                .render(this, decorator.serviceRuntimePluginCustomizations(codegenContext, emptyList()))\n\n            ConfigOverrideRuntimePluginGenerator(codegenContext)\n                .render(this, decorator.configCustomizations(codegenContext, listOf()))\n        }\n\n        rustCrate.lib {\n            Attribute.DocInline.render(this)\n            write(\"pub use config::Config;\")\n        }\n\n        ClientRuntimeTypesReExportGenerator(codegenContext, rustCrate).render()\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ServiceRuntimePluginGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.generators\n\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.isNotEmpty\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.NamedCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.Section\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.writeCustomizations\nimport software.amazon.smithy.rust.codegen.core.util.dq\n\nsealed class ServiceRuntimePluginSection(name: String) : Section(name) {\n    /**\n     * Hook for declaring singletons that store cross-operation state.\n     *\n     * Examples include token buckets, ID generators, etc.\n     */\n    class DeclareSingletons : ServiceRuntimePluginSection(\"DeclareSingletons\")\n\n    /**\n     * Hook for adding additional things to config inside service runtime plugins.\n     */\n    data class AdditionalConfig(val newLayerName: String, val serviceConfigName: String) :\n        ServiceRuntimePluginSection(\"AdditionalConfig\") {\n        /** Adds a value to the config bag */\n        fun putConfigValue(\n            writer: RustWriter,\n            value: Writable,\n        ) {\n            writer.rust(\"$newLayerName.store_put(#T);\", value)\n        }\n    }\n\n    data class RegisterRuntimeComponents(val serviceConfigName: String) :\n        ServiceRuntimePluginSection(\"RegisterRuntimeComponents\") {\n        /** Generates the code to register an interceptor */\n        fun registerInterceptor(\n            writer: RustWriter,\n            interceptor: Writable,\n        ) {\n            writer.rust(\"runtime_components.push_interceptor(#T);\", interceptor)\n        }\n\n        /** Generates the code to register a permanent interceptor that cannot be disabled */\n        fun registerPermanentInterceptor(\n            runtimeConfig: RuntimeConfig,\n            writer: RustWriter,\n            interceptor: Writable,\n        ) {\n            writer.rustTemplate(\n                \"runtime_components.push_interceptor(#{SharedInterceptor}::permanent(#{interceptor}));\",\n                \"SharedInterceptor\" to RuntimeType.sharedInterceptor(runtimeConfig),\n                \"interceptor\" to interceptor,\n            )\n        }\n\n        fun registerAuthScheme(\n            writer: RustWriter,\n            authScheme: Writable,\n        ) {\n            writer.rust(\"runtime_components.push_auth_scheme(#T);\", authScheme)\n        }\n\n        fun registerAuthSchemeOptionResolver(\n            writer: RustWriter,\n            resolver: Writable,\n        ) {\n            writer.rustTemplate(\"runtime_components.set_auth_scheme_option_resolver(#{Some}(#{resolver}));\", *preludeScope, \"resolver\" to resolver)\n        }\n\n        fun registerEndpointResolver(\n            writer: RustWriter,\n            resolver: Writable,\n        ) {\n            writer.rustTemplate(\"runtime_components.set_endpoint_resolver(#{Some}(#{resolver}));\", *preludeScope, \"resolver\" to resolver)\n        }\n\n        fun registerRetryClassifier(\n            writer: RustWriter,\n            classifier: Writable,\n        ) {\n            writer.rust(\"runtime_components.push_retry_classifier(#T);\", classifier)\n        }\n\n        fun registerIdentityResolver(\n            writer: RustWriter,\n            schemeId: Writable,\n            identityResolver: Writable,\n        ) {\n            writer.rust(\"runtime_components.set_identity_resolver(#T, #T);\", schemeId, identityResolver)\n        }\n    }\n}\ntypealias ServiceRuntimePluginCustomization = NamedCustomization<ServiceRuntimePluginSection>\n\n/**\n * Generates the service-level runtime plugin\n */\nclass ServiceRuntimePluginGenerator(\n    private val codegenContext: ClientCodegenContext,\n) {\n    private val codegenScope =\n        codegenContext.runtimeConfig.let { rc ->\n            val runtimeApi = RuntimeType.smithyRuntimeApiClient(rc)\n            val smithyTypes = RuntimeType.smithyTypes(rc)\n            arrayOf(\n                *preludeScope,\n                \"Arc\" to RuntimeType.Arc,\n                \"BoxError\" to RuntimeType.boxError(codegenContext.runtimeConfig),\n                \"Cow\" to RuntimeType.Cow,\n                \"FrozenLayer\" to smithyTypes.resolve(\"config_bag::FrozenLayer\"),\n                \"IntoShared\" to runtimeApi.resolve(\"shared::IntoShared\"),\n                \"Layer\" to smithyTypes.resolve(\"config_bag::Layer\"),\n                \"RuntimeComponentsBuilder\" to RuntimeType.runtimeComponentsBuilder(rc),\n                \"RuntimePlugin\" to RuntimeType.runtimePlugin(rc),\n                \"Order\" to runtimeApi.resolve(\"client::runtime_plugin::Order\"),\n            )\n        }\n\n    fun render(\n        writer: RustWriter,\n        customizations: List<ServiceRuntimePluginCustomization>,\n    ) {\n        val additionalConfig =\n            writable {\n                writeCustomizations(\n                    customizations,\n                    ServiceRuntimePluginSection.AdditionalConfig(\"cfg\", \"_service_config\"),\n                )\n            }\n        writer.rustTemplate(\n            \"\"\"\n            ##[derive(::std::fmt::Debug)]\n            pub(crate) struct ServiceRuntimePlugin {\n                config: #{Option}<#{FrozenLayer}>,\n                runtime_components: #{RuntimeComponentsBuilder},\n            }\n\n            impl ServiceRuntimePlugin {\n                pub fn new(_service_config: crate::config::Config) -> Self {\n                    let config = { #{config} };\n                    let mut runtime_components = #{RuntimeComponentsBuilder}::new(\"ServiceRuntimePlugin\");\n                    #{runtime_components}\n                    Self { config, runtime_components }\n                }\n            }\n\n            impl #{RuntimePlugin} for ServiceRuntimePlugin {\n                fn config(&self) -> #{Option}<#{FrozenLayer}> {\n                    self.config.clone()\n                }\n\n                fn order(&self) -> #{Order} {\n                    #{Order}::Defaults\n                }\n\n                fn runtime_components(&self, _: &#{RuntimeComponentsBuilder}) -> #{Cow}<'_, #{RuntimeComponentsBuilder}> {\n                    #{Cow}::Borrowed(&self.runtime_components)\n                }\n            }\n\n            // Cross-operation shared-state singletons\n            #{declare_singletons}\n            \"\"\",\n            *codegenScope,\n            \"config\" to\n                writable {\n                    if (additionalConfig.isNotEmpty()) {\n                        rustTemplate(\n                            \"\"\"\n                            let mut cfg = #{Layer}::new(${codegenContext.serviceShape.id.name.dq()});\n                            #{additional_config}\n                            #{Some}(cfg.freeze())\n                            \"\"\",\n                            *codegenScope,\n                            \"additional_config\" to additionalConfig,\n                        )\n                    } else {\n                        rust(\"None\")\n                    }\n                },\n            \"runtime_components\" to\n                writable {\n                    writeCustomizations(\n                        customizations,\n                        ServiceRuntimePluginSection.RegisterRuntimeComponents(\"_service_config\"),\n                    )\n                },\n            \"declare_singletons\" to\n                writable {\n                    writeCustomizations(customizations, ServiceRuntimePluginSection.DeclareSingletons())\n                },\n        )\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/CustomizableOperationDecorator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.generators.client\n\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.AdHocSection\n\nsealed class CustomizableOperationSection(name: String) : AdHocSection(name) {\n    /** Write custom code into a customizable operation's impl block */\n    object CustomizableOperationImpl : CustomizableOperationSection(\"CustomizableOperationImpl\")\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/CustomizableOperationGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.generators.client\n\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustModule\nimport software.amazon.smithy.rust.codegen.core.rustlang.Visibility\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\nimport software.amazon.smithy.rust.codegen.core.smithy.RustCrate\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.writeCustomizations\n\n/**\n * Generates the code required to add the `.customize()` function to the\n * fluent client builders.\n */\n\nval InternalTraitsModule = RustModule.new(\"internal\", Visibility.PUBCRATE, false, ClientRustModule.Client.customize)\n\nclass CustomizableOperationGenerator(\n    codegenContext: ClientCodegenContext,\n) {\n    private val runtimeConfig = codegenContext.runtimeConfig\n    private val customizations = codegenContext.rootDecorator.extraSections(codegenContext)\n\n    fun render(crate: RustCrate) {\n        val codegenScope =\n            arrayOf(\n                *preludeScope,\n                \"CustomizableOperation\" to\n                    ClientRustModule.Client.customize.toType()\n                        .resolve(\"CustomizableOperation\"),\n                \"CustomizableSend\" to\n                    ClientRustModule.Client.customize.toType()\n                        .resolve(\"internal::CustomizableSend\"),\n                \"HttpRequest\" to\n                    RuntimeType.smithyRuntimeApiClient(runtimeConfig)\n                        .resolve(\"client::orchestrator::HttpRequest\"),\n                \"HttpResponse\" to\n                    RuntimeType.smithyRuntimeApiClient(runtimeConfig)\n                        .resolve(\"client::orchestrator::HttpResponse\"),\n                \"Intercept\" to RuntimeType.intercept(runtimeConfig),\n                \"MapRequestInterceptor\" to\n                    RuntimeType.smithyRuntime(runtimeConfig)\n                        .resolve(\"client::interceptors::MapRequestInterceptor\"),\n                \"MutateRequestInterceptor\" to\n                    RuntimeType.smithyRuntime(runtimeConfig)\n                        .resolve(\"client::interceptors::MutateRequestInterceptor\"),\n                \"PhantomData\" to RuntimeType.Phantom,\n                \"RuntimePlugin\" to RuntimeType.runtimePlugin(runtimeConfig),\n                \"SharedRuntimePlugin\" to RuntimeType.sharedRuntimePlugin(runtimeConfig),\n                \"SendResult\" to\n                    ClientRustModule.Client.customize.toType()\n                        .resolve(\"internal::SendResult\"),\n                \"SdkBody\" to RuntimeType.sdkBody(runtimeConfig),\n                \"SdkError\" to RuntimeType.sdkError(runtimeConfig),\n                \"SharedInterceptor\" to\n                    RuntimeType.smithyRuntimeApiClient(runtimeConfig)\n                        .resolve(\"client::interceptors::SharedInterceptor\"),\n            )\n\n        val customizeModule = ClientRustModule.Client.customize\n        crate.withModule(customizeModule) {\n            renderInternalTraits(crate)\n\n            rustTemplate(\n                \"\"\"\n                /// `CustomizableOperation` allows for configuring a single operation invocation before it is sent.\n                pub struct CustomizableOperation<T, E, B> {\n                    customizable_send: B,\n                    config_override: #{Option}<crate::config::Builder>,\n                    interceptors: Vec<#{SharedInterceptor}>,\n                    runtime_plugins: Vec<#{SharedRuntimePlugin}>,\n                    _output: #{PhantomData}<T>,\n                    _error: #{PhantomData}<E>,\n                }\n\n                    impl<T, E, B> CustomizableOperation<T, E, B> {\n                        /// Creates a new `CustomizableOperation` from `customizable_send`.\n                        ##[allow(dead_code)] // unused when a service does not provide any operations\n                        pub(crate) fn new(customizable_send: B) -> Self {\n                            Self {\n                                customizable_send,\n                                config_override: #{None},\n                                interceptors: vec![],\n                                runtime_plugins: vec![],\n                                _output: #{PhantomData},\n                                _error: #{PhantomData}\n                            }\n                        }\n\n                        pub(crate) fn execute<U>(self, f: impl #{FnOnce}(B, crate::config::Builder) -> U) -> U {\n                            let mut config_override = self.config_override.unwrap_or_default();\n                            self.interceptors.into_iter().for_each(|interceptor| {\n                                config_override.push_interceptor(interceptor);\n                            });\n                            self.runtime_plugins.into_iter().for_each(|plugin| {\n                                config_override.push_runtime_plugin(plugin);\n                            });\n                            f(self.customizable_send, config_override)\n                        }\n\n                    /// Adds an [interceptor](#{Intercept}) that runs at specific stages of the request execution pipeline.\n                    ///\n                    /// Note that interceptors can also be added to `CustomizableOperation` by `config_override`,\n                    /// `map_request`, and `mutate_request` (the last two are implemented via interceptors under the hood).\n                    /// The order in which those user-specified operation interceptors are invoked should not be relied upon\n                    /// as it is an implementation detail.\n                    pub fn interceptor(mut self, interceptor: impl #{Intercept} + 'static) -> Self {\n                        self.interceptors.push(#{SharedInterceptor}::new(interceptor));\n                        self\n                    }\n\n                    /// Adds a runtime plugin.\n                    ##[allow(unused)]\n                    pub(crate) fn runtime_plugin(mut self, runtime_plugin: impl #{RuntimePlugin} + 'static) -> Self {\n                        self.runtime_plugins.push(#{SharedRuntimePlugin}::new(runtime_plugin));\n                        self\n                    }\n\n                    /// Allows for customizing the operation's request.\n                    pub fn map_request<F, MapE>(mut self, f: F) -> Self\n                    where\n                        F: #{Fn}(#{HttpRequest}) -> #{Result}<#{HttpRequest}, MapE>\n                            + #{Send}\n                            + #{Sync}\n                            + 'static,\n                        MapE: ::std::error::Error + #{Send} + #{Sync} + 'static,\n                    {\n                        self.interceptors.push(\n                            #{SharedInterceptor}::new(\n                                #{MapRequestInterceptor}::new(f),\n                            ),\n                        );\n                        self\n                    }\n\n                        /// Convenience for `map_request` where infallible direct mutation of request is acceptable.\n                        pub fn mutate_request<F>(mut self, f: F) -> Self\n                        where\n                            F: #{Fn}(&mut #{HttpRequest}) + #{Send} + #{Sync} + 'static,\n                        {\n                            self.interceptors.push(\n                                #{SharedInterceptor}::new(\n                                    #{MutateRequestInterceptor}::new(f),\n                                ),\n                            );\n                            self\n                        }\n\n                    /// Overrides config for a single operation invocation.\n                    ///\n                    /// `config_override` is applied to the operation configuration level.\n                    /// The fields in the builder that are `Some` override those applied to the service\n                    /// configuration level. For instance,\n                    ///\n                    /// | Config A           | overridden by Config B | = Config C         |\n                    /// |--------------------|------------------------|--------------------|\n                    /// | field_1: None,     | field_1: Some(v2),     | field_1: Some(v2), |\n                    /// | field_2: Some(v1), | field_2: Some(v2),     | field_2: Some(v2), |\n                    /// | field_3: Some(v1), | field_3: None,         | field_3: Some(v1), |\n                    pub fn config_override(\n                        mut self,\n                        config_override: impl #{Into}<crate::config::Builder>,\n                    ) -> Self {\n                        self.config_override = Some(config_override.into());\n                        self\n                    }\n\n                    /// Sends the request and returns the response.\n                    pub async fn send(\n                        self,\n                    ) -> #{SendResult}<T, E>\n                    where\n                        E: std::error::Error + #{Send} + #{Sync} + 'static,\n                        B: #{CustomizableSend}<T, E>,\n                    {\n                        self.execute(|sender, config|sender.send(config)).await\n                    }\n\n                    #{additional_methods}\n                }\n                \"\"\",\n                *codegenScope,\n                \"additional_methods\" to\n                    writable {\n                        writeCustomizations(\n                            customizations,\n                            CustomizableOperationSection.CustomizableOperationImpl,\n                        )\n                    },\n            )\n        }\n    }\n\n    private fun renderInternalTraits(crate: RustCrate) {\n        crate.withModule(InternalTraitsModule) {\n            rustTemplate(\n                \"\"\"\n                pub type BoxFuture<T> = ::std::pin::Pin<#{Box}<dyn ::std::future::Future<Output = T> + #{Send}>>;\n\n                pub type SendResult<T, E> = #{Result}<\n                    T,\n                    #{SdkError}<\n                        E,\n                        #{HttpResponse},\n                    >,\n                >;\n\n                pub trait CustomizableSend<T, E>: #{Send} + #{Sync} {\n                    // Takes an owned `self` as the implementation will internally call methods that take `self`.\n                    // If it took `&self`, that would make this trait object safe, but some implementing types do not\n                    // derive `Clone`, unable to yield `self` from `&self`.\n                    fn send(self, config_override: crate::config::Builder) -> BoxFuture<SendResult<T, E>>;\n                }\n                \"\"\",\n                *preludeScope,\n                \"HttpResponse\" to\n                    RuntimeType.smithyRuntimeApiClient(runtimeConfig)\n                        .resolve(\"client::orchestrator::HttpResponse\"),\n                \"SdkError\" to RuntimeType.sdkError(runtimeConfig),\n            )\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/CustomizableOperationImplGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.generators.client\n\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.OperationSection\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlock\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.allCustomizationsAreEmpty\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.writeCustomizations\n\nclass CustomizableOperationImplGenerator(\n    private val codegenContext: ClientCodegenContext,\n    private val operation: OperationShape,\n    private val customizations: List<OperationCustomization>,\n) {\n    fun render(writer: RustWriter) {\n        val section = OperationSection.CustomizableOperationImpl(customizations, operation)\n        // When no customizations are set or there is nothing to write, return early.\n        if (customizations.isEmpty() || allCustomizationsAreEmpty(customizations, section)) {\n            return\n        }\n\n        operation.output\n            .map { codegenContext.model.expectShape(it) }\n            .map { codegenContext.symbolProvider.toSymbol(it) }\n            .ifPresent {\n                writer.rustBlock(\"impl<E, B> CustomizableOperation<#T, E, B>\", it) {\n                    writer.writeCustomizations(customizations, section)\n                }\n            }\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentBuilderGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\npackage software.amazon.smithy.rust.codegen.client.smithy.generators.client\n\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.PaginatorGenerator\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute\nimport software.amazon.smithy.rust.codegen.core.rustlang.InlineDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustType\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.asArgument\nimport software.amazon.smithy.rust.codegen.core.rustlang.asOptional\nimport software.amazon.smithy.rust.codegen.core.rustlang.deprecatedShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.docs\nimport software.amazon.smithy.rust.codegen.core.rustlang.documentShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.stripOuter\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.forInlineDependency\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.writeCustomizations\nimport software.amazon.smithy.rust.codegen.core.smithy.expectRustMetadata\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.getterName\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.setterName\nimport software.amazon.smithy.rust.codegen.core.smithy.rustType\nimport software.amazon.smithy.rust.codegen.core.util.inputShape\nimport software.amazon.smithy.rust.codegen.core.util.isEventStream\nimport software.amazon.smithy.rust.codegen.core.util.isOutputEventStream\nimport software.amazon.smithy.rust.codegen.core.util.outputShape\n\n/**\n * Codegen configuration for the fluent builder generator.\n *\n * Null values indicate \"use the default\", and defaults are oriented towards\n * the main fluent builders used by the client.\n *\n * These can be overridden for secondary fluent builders, such as used by\n * waiters.\n */\ninterface FluentBuilderConfig {\n    /** Top-level documentation for the builder struct */\n    fun documentBuilder(): Writable? = null\n\n    /** `send()` (and friends) method  on the builder */\n    fun sendMethods(): Writable? = null\n\n    /** Whether to include paginators or not */\n    fun includePaginators(): Boolean = true\n\n    /** Whether to include config override or not */\n    fun includeConfigOverride(): Boolean = true\n}\n\nprivate fun FluentBuilderConfig.sendOverridden(): Boolean = sendMethods() != null\n\n/** Default fluent builder generator config */\nclass DefaultFluentBuilderConfig : FluentBuilderConfig\n\n/**\n * Generates the fluent builders returned by the generated client.\n */\nclass FluentBuilderGenerator(\n    private val codegenContext: ClientCodegenContext,\n    private val operation: OperationShape,\n    private val customizations: List<FluentClientCustomization> = emptyList(),\n    private val builderName: String = operation.fluentBuilderType(codegenContext.symbolProvider).name,\n    private val config: FluentBuilderConfig = DefaultFluentBuilderConfig(),\n) {\n    private val runtimeConfig = codegenContext.runtimeConfig\n    private val symbolProvider = codegenContext.symbolProvider\n    private val model = codegenContext.model\n\n    private val inputShape = operation.inputShape(model)\n    private val inputBuilderType = symbolProvider.symbolForBuilder(inputShape)\n\n    private val outputShape = operation.outputShape(model)\n    private val outputType = symbolProvider.toSymbol(outputShape)\n    private val errorType = symbolProvider.symbolForOperationError(operation)\n    private val operationType = symbolProvider.toSymbol(operation)\n\n    private val scope =\n        arrayOf(\n            *preludeScope,\n            \"Arc\" to RuntimeType.Arc,\n            \"BoxError\" to RuntimeType.boxError(runtimeConfig),\n            \"CustomizableOperation\" to\n                ClientRustModule.Client.customize.toType()\n                    .resolve(\"CustomizableOperation\"),\n            \"HttpResponse\" to\n                RuntimeType.smithyRuntimeApiClient(runtimeConfig)\n                    .resolve(\"client::orchestrator::HttpResponse\"),\n            \"InputBuilder\" to inputBuilderType,\n            \"Operation\" to operationType,\n            \"OperationError\" to errorType,\n            \"OperationOutput\" to outputType,\n            \"RuntimePlugins\" to RuntimeType.runtimePlugins(runtimeConfig),\n            \"SdkBody\" to RuntimeType.sdkBody(runtimeConfig),\n            \"SdkError\" to RuntimeType.sdkError(runtimeConfig),\n            \"StatusCode\" to\n                RuntimeType.smithyRuntimeApiClient(runtimeConfig)\n                    .resolve(\"http::StatusCode\"),\n            \"SendResult\" to\n                ClientRustModule.Client.customize.toType()\n                    .resolve(\"internal::SendResult\"),\n            \"event_receiver\" to forInlineDependency(InlineDependency.eventReceiver(runtimeConfig)),\n        )\n\n    fun render(writer: RustWriter) {\n        if (!config.sendOverridden()) {\n            writer.renderInputBuilderImpls()\n        }\n        writer.renderStruct()\n        if (!config.sendOverridden()) {\n            writer.renderTraitImpls()\n        }\n        writer.renderImpl()\n    }\n\n    private fun defaultDocumentBuilder(): Writable =\n        writable {\n            docs(\"Fluent builder constructing a request to `${operationType.name}`.\\n\")\n            documentShape(operation, model, autoSuppressMissingDocs = false)\n            if (codegenContext.protocolImpl?.httpBindingResolver?.handlesEventStreamInitialResponse(operation) == true) {\n                docs(\n                    \"\"\"\n                    [`${outputType.name}`]($outputType) contains an event stream field as well as one or more non-event stream fields.\n                    Due to its current implementation, the non-event stream fields are not fully deserialized\n                    until the [`send`](Self::send) method completes. As a result, accessing these fields of the operation\n                    output struct within an interceptor may return uninitialized values.\n                    \"\"\",\n                )\n            }\n        }\n\n    private fun defaultSend(): Writable =\n        writable {\n            rustTemplate(\n                \"\"\"\n                /// Sends the request and returns the response.\n                ///\n                /// If an error occurs, an `SdkError` will be returned with additional details that\n                /// can be matched against.\n                ///\n                /// By default, any retryable failures will be retried twice. Retry behavior\n                /// is configurable with the [RetryConfig](aws_smithy_types::retry::RetryConfig), which can be\n                /// set when configuring the client.\n                pub async fn send(self) -> #{Result}<#{OperationOutput}, #{SdkError}<#{OperationError}, #{HttpResponse}>> {\n                    let input = self.inner.build().map_err(#{SdkError}::construction_failure)?;\n                    let runtime_plugins = #{Operation}::operation_runtime_plugins(\n                        self.handle.runtime_plugins.clone(),\n                        &self.handle.conf,\n                        self.config_override,\n                    );\n                    #{epilogue:W}\n                }\n\n                /// Consumes this builder, creating a customizable operation that can be modified before being sent.\n                pub fn customize(\n                    self,\n                ) -> #{CustomizableOperation}<#{OperationOutput}, #{OperationError}, Self> {\n                    #{CustomizableOperation}::new(self)\n                }\n                \"\"\",\n                *scope,\n                \"epilogue\" to (\n                    handleEventStreamInitialResponse() ?: writable {\n                        rustTemplate(\"#{Operation}::orchestrate(&runtime_plugins, input).await\", *scope)\n                    }\n                ),\n            )\n        }\n\n    private fun handleEventStreamInitialResponse(): Writable? {\n        if (!operation.isOutputEventStream(model)) {\n            return null\n        }\n\n        // The variable eventStreamMember is guaranteed to be non-null because of the short-circuit above.\n        // It's guaranteed by the spec that there is exactly one member with the streaming trait.\n        // See Validation in https://smithy.io/2.0/spec/streaming.html#streaming-trait\n        val eventStreamMember =\n            outputShape.members().find { member ->\n                member.isEventStream(codegenContext.model)\n            }!!\n\n        return writable {\n            val eventStreamMemberName = symbolProvider.toMemberName(eventStreamMember)\n            rustTemplate(\n                \"\"\"\n                let mut output =\n                    #{Operation}::orchestrate(\n                        &runtime_plugins,\n                        input,\n                    )\n                    .await?;\n\n                // Converts any error encountered beyond this point into an `SdkError` response error\n                // with an `HttpResponse`. However, since we have already exited the `orchestrate`\n                // function, the original `HttpResponse` is no longer available and cannot be restored.\n                // This means that header information from the original response has been lost.\n                //\n                // Note that the response body would have been consumed by the deserializer\n                // regardless, even if the initial message was hypothetically processed during\n                // the orchestrator's deserialization phase but later resulted in an error.\n                fn response_error(\n                    err: impl #{Into}<#{BoxError}>\n                ) -> #{SdkError}<#{OperationError}, #{HttpResponse}> {\n                    #{SdkError}::response_error(err, #{HttpResponse}::new(\n                        #{StatusCode}::try_from(200).expect(\"valid successful code\"),\n                        #{SdkBody}::empty()))\n                }\n\n                let message = output.$eventStreamMemberName.try_recv_initial_response().await.map_err(response_error)?;\n\n                match message {\n                    #{Some}(_message) => {\n                        #{maybeRecreateOutputWithNonEventStreamMembers:W}\n                        #{Ok}(output)\n                    }\n                    #{None} => #{Ok}(output),\n                }\n                \"\"\",\n                *scope,\n                \"maybeRecreateOutputWithNonEventStreamMembers\" to\n                    writable {\n                        val structuredDataParser = codegenContext.protocolImpl?.structuredDataParser()\n                        structuredDataParser?.operationParser(operation)?.also { parser ->\n                            rustTemplate(\n                                \"\"\"\n                                let mut builder = output.into_builder();\n                                builder = #{parser}(\n                                    _message.payload(),\n                                    builder\n                                )\n                                .map_err(response_error)?;\n                                let output = builder.build().map_err(response_error)?;\n                                \"\"\",\n                                \"parser\" to parser,\n                                *scope,\n                            )\n                        }\n                    },\n            )\n        }\n    }\n\n    private fun RustWriter.renderStruct() {\n        // Filter out any derive that isn't Clone. Then add a Debug derive input name\n        val derives =\n            symbolProvider.toSymbol(inputShape).expectRustMetadata().derives.let { baseDerives ->\n                baseDerives.filter { it == RuntimeType.Clone } + RuntimeType.Debug\n            }\n\n        (config.documentBuilder() ?: defaultDocumentBuilder())()\n        deprecatedShape(operation)\n        Attribute(Attribute.derive(derives.toSet())).render(this)\n        val configOverride =\n            when (config.includeConfigOverride()) {\n                true -> \"\\nconfig_override: #{Option}<crate::config::Builder>,\"\n                else -> \"\"\n            }\n        rustTemplate(\n            \"\"\"\n            pub struct $builderName {\n                handle: #{Arc}<crate::client::Handle>,\n                inner: #{InputBuilder},$configOverride\n            }\n            \"\"\",\n            *scope,\n        )\n    }\n\n    private fun RustWriter.renderImpl() {\n        rustBlock(\"impl $builderName\") {\n            val configOverride =\n                when (config.includeConfigOverride()) {\n                    true -> \"\\nconfig_override: #{None},\"\n                    else -> \"\"\n                }\n            rustTemplate(\n                \"\"\"\n                /// Creates a new `$builderName`.\n                pub(crate) fn new(handle: #{Arc}<crate::client::Handle>) -> Self {\n                    Self {\n                        handle,\n                        inner: #{Default}::default(),$configOverride\n                    }\n                }\n                \"\"\",\n                *scope,\n            )\n\n            rustTemplate(\n                \"\"\"\n                /// Access the ${operationType.name} as a reference.\n                pub fn as_input(&self) -> &#{InputBuilder} {\n                    &self.inner\n                }\n                \"\"\",\n                *scope,\n            )\n\n            // Output the send method\n            (config.sendMethods() ?: defaultSend())()\n\n            if (config.includeConfigOverride()) {\n                rustTemplate(\n                    \"\"\"\n                    pub(crate) fn config_override(\n                        mut self,\n                        config_override: impl #{Into}<crate::config::Builder>,\n                    ) -> Self {\n                        self.set_config_override(#{Some}(config_override.into()));\n                        self\n                    }\n\n                    pub(crate) fn set_config_override(\n                        &mut self,\n                        config_override: #{Option}<crate::config::Builder>,\n                    ) -> &mut Self {\n                        self.config_override = config_override;\n                        self\n                    }\n                    \"\"\",\n                    *scope,\n                )\n            }\n\n            if (config.includePaginators()) {\n                PaginatorGenerator.paginatorType(codegenContext, operation)\n                    ?.also { paginatorType ->\n                        rustTemplate(\n                            \"\"\"\n                            /// Create a paginator for this request\n                            ///\n                            /// Paginators are used by calling [`send().await`](#{Paginator}::send) which returns a [`PaginationStream`](aws_smithy_async::future::pagination_stream::PaginationStream).\n                            pub fn into_paginator(self) -> #{Paginator} {\n                                #{Paginator}::new(self.handle, self.inner)\n                            }\n                            \"\"\",\n                            \"Paginator\" to paginatorType,\n                        )\n                    }\n            }\n\n            writeCustomizations(\n                customizations,\n                FluentClientSection.FluentBuilderImpl(operation, errorType),\n            )\n\n            inputShape.members().forEach { member ->\n                val memberName = symbolProvider.toMemberName(member)\n                // All fields in the builder are optional\n                val memberSymbol = symbolProvider.toSymbol(member)\n                val outerType = memberSymbol.rustType()\n                when (val coreType = outerType.stripOuter<RustType.Option>()) {\n                    is RustType.Vec -> renderVecHelper(member, memberName, coreType)\n                    is RustType.HashMap -> renderMapHelper(member, memberName, coreType)\n                    else -> renderInputHelper(member, memberName, coreType)\n                }\n                // pure setter\n                val setterName = member.setterName()\n                val optionalInputType = outerType.asOptional()\n                renderInputHelper(member, setterName, optionalInputType)\n\n                val getterName = member.getterName()\n                renderGetterHelper(member, getterName, optionalInputType)\n            }\n        }\n    }\n\n    private fun RustWriter.renderTraitImpls() {\n        rustTemplate(\n            \"\"\"\n            impl\n                crate::client::customize::internal::CustomizableSend<\n                    #{OperationOutput},\n                    #{OperationError},\n                > for $builderName\n            {\n                fn send(\n                    self,\n                    config_override: crate::config::Builder,\n                ) -> crate::client::customize::internal::BoxFuture<\n                    crate::client::customize::internal::SendResult<\n                        #{OperationOutput},\n                        #{OperationError},\n                    >,\n                > {\n                    #{Box}::pin(async move { self.config_override(config_override).send().await })\n                }\n            }\n            \"\"\",\n            *scope,\n        )\n    }\n\n    private fun RustWriter.renderInputBuilderImpls() {\n        FluentClientGenerator.clientOperationFnName(operation, symbolProvider).also { fnName ->\n            rustTemplate(\n                \"\"\"\n                impl #{InputBuilder} {\n                    /// Sends a request with this input using the given client.\n                    pub async fn send_with(self, client: &crate::Client) -> #{Result}<\n                        #{OperationOutput},\n                        #{SdkError}<\n                            #{OperationError},\n                            #{HttpResponse}\n                        >\n                    > {\n                        let mut fluent_builder = client.$fnName();\n                        fluent_builder.inner = self;\n                        fluent_builder.send().await\n                    }\n                }\n                \"\"\",\n                *scope,\n            )\n        }\n    }\n\n    /** Generate and write Rust code for a builder method that sets a Vec<T> */\n    private fun RustWriter.renderVecHelper(\n        member: MemberShape,\n        memberName: String,\n        coreType: RustType.Vec,\n    ) {\n        docs(\n            \"\"\"\n            Appends an item to `${member.memberName}`.\n\n            To override the contents of this collection use [`${member.setterName()}`](Self::${member.setterName()}).\n            \"\"\",\n        )\n        documentShape(member, model)\n        deprecatedShape(member)\n        coreType.member.asArgument(\"input\").also { input ->\n            rust(\n                \"\"\"\n                pub fn $memberName(mut self, ${input.argument}) -> Self {\n                    self.inner = self.inner.$memberName(${input.value});\n                    self\n                }\n                \"\"\",\n            )\n        }\n    }\n\n    /** Generate and write Rust code for a builder method that sets a HashMap<K,V> */\n    private fun RustWriter.renderMapHelper(\n        member: MemberShape,\n        memberName: String,\n        coreType: RustType.HashMap,\n    ) {\n        val k = coreType.key.asArgument(\"k\")\n        val v = coreType.member.asArgument(\"v\")\n\n        docs(\n            \"\"\"\n            Adds a key-value pair to `${member.memberName}`.\n\n            To override the contents of this collection use [`${member.setterName()}`](Self::${member.setterName()}).\n            \"\"\",\n        )\n        documentShape(member, model)\n        deprecatedShape(member)\n        rust(\n            \"\"\"\n            pub fn $memberName(mut self, ${k.argument}, ${v.argument}) -> Self {\n                self.inner = self.inner.$memberName(${k.value}, ${v.value});\n                self\n            }\n            \"\"\",\n        )\n    }\n\n    /**\n     * Generate and write Rust code for a builder method that sets an input. Can be used for setter methods as well e.g.\n     *\n     * `renderInputHelper(memberShape, \"foo\", RustType.String)` -> `pub fn foo(mut self, input: impl Into<String>) -> Self { ... }`\n     * `renderInputHelper(memberShape, \"set_bar\", RustType.Option)` -> `pub fn set_bar(mut self, input: Option<String>) -> Self { ... }`\n     */\n    private fun RustWriter.renderInputHelper(\n        member: MemberShape,\n        memberName: String,\n        coreType: RustType,\n    ) {\n        val functionInput = coreType.asArgument(\"input\")\n\n        documentShape(member, model)\n        deprecatedShape(member)\n        rust(\n            \"\"\"\n            pub fn $memberName(mut self, ${functionInput.argument}) -> Self {\n                self.inner = self.inner.$memberName(${functionInput.value});\n                self\n            }\n            \"\"\",\n        )\n    }\n\n    /**\n     * Generate and write Rust code for a getter method that returns a reference to the inner data.\n     */\n    private fun RustWriter.renderGetterHelper(\n        member: MemberShape,\n        memberName: String,\n        coreType: RustType,\n    ) {\n        documentShape(member, model)\n        deprecatedShape(member)\n        rustTemplate(\n            \"\"\"\n            pub fn $memberName(&self) -> &#{CoreType} {\n                self.inner.$memberName()\n            }\n            \"\"\",\n            \"CoreType\" to coreType,\n        )\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientDecorator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.generators.client\n\nimport software.amazon.smithy.codegen.core.Symbol\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.ServiceShape\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.core.rustlang.Feature\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.docs\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RustCrate\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.NamedCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.Section\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.LibRsCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.LibRsSection\nimport software.amazon.smithy.rust.codegen.core.util.serviceNameOrDefault\n\n/**\n * Generates the client via codegen decorator.\n *\n * > Why is this a decorator instead of a normal generator that gets called from the codegen visitor?\n *\n * The AWS SDK needs to make significant changes from what smithy-rs generates for generic clients,\n * and the easiest way to do that is to completely replace the client generator. With this as\n * a decorator, it can be excluded entirely and replaced in the sdk-codegen plugin.\n */\nclass FluentClientDecorator : ClientCodegenDecorator {\n    override val name: String = \"FluentClient\"\n    override val order: Byte = 0\n\n    private fun applies(codegenContext: ClientCodegenContext): Boolean =\n        codegenContext.settings.codegenConfig.includeFluentClient\n\n    override fun extras(\n        codegenContext: ClientCodegenContext,\n        rustCrate: RustCrate,\n    ) {\n        if (!applies(codegenContext)) {\n            return\n        }\n\n        FluentClientGenerator(\n            codegenContext,\n            customizations = listOf(GenericFluentClient(codegenContext)),\n        ).render(rustCrate)\n\n        // TODO(hyper1): disable rustls as a default feature in future release\n        // NOTE: We enable both rustls and default-https-client as default features. This keeps the legacy hyper+rustls\n        // stack working as is and lets BehaviorVersion control which client you get. In a future release we will\n        // break this and disable the rustls feature by default (and break old BMV versions w.r.t http client default).\n        rustCrate.mergeFeature(Feature(\"rustls\", default = true, listOf(\"aws-smithy-runtime/tls-rustls\")))\n        rustCrate.mergeFeature(Feature(\"default-https-client\", default = true, listOf(\"aws-smithy-runtime/default-https-client\")))\n    }\n\n    override fun libRsCustomizations(\n        codegenContext: ClientCodegenContext,\n        baseCustomizations: List<LibRsCustomization>,\n    ): List<LibRsCustomization> {\n        if (!applies(codegenContext)) {\n            return baseCustomizations\n        }\n\n        return baseCustomizations +\n            object : LibRsCustomization() {\n                override fun section(section: LibRsSection) =\n                    when (section) {\n                        is LibRsSection.Body ->\n                            writable {\n                                rust(\"pub use client::Client;\")\n                            }\n                        else -> emptySection\n                    }\n            }\n    }\n}\n\nsealed class FluentClientSection(name: String) : Section(name) {\n    /** Write custom code into an operation fluent builder's impl block */\n    data class FluentBuilderImpl(\n        val operationShape: OperationShape,\n        val operationErrorType: Symbol,\n    ) : FluentClientSection(\"FluentBuilderImpl\")\n\n    /** Write custom code into the docs */\n    data class FluentClientDocs(val serviceShape: ServiceShape) : FluentClientSection(\"FluentClientDocs\")\n\n    /** Write custom code for adding additional client plugins to base_client_runtime_plugins */\n    data class AdditionalBaseClientPlugins(val plugins: String, val config: String) :\n        FluentClientSection(\"AdditionalBaseClientPlugins\")\n\n    /** Write additional code before plugins are configured */\n    data class BeforeBaseClientPluginSetup(val config: String) :\n        FluentClientSection(\"BeforeBaseClientPluginSetup\")\n\n    /** Customize DefaultPluginParams construction */\n    data object CustomizeDefaultPluginParams : FluentClientSection(\"CustomizeDefaultPluginParams\")\n}\n\nabstract class FluentClientCustomization : NamedCustomization<FluentClientSection>()\n\nclass GenericFluentClient(private val codegenContext: ClientCodegenContext) : FluentClientCustomization() {\n    override fun section(section: FluentClientSection): Writable {\n        return when (section) {\n            is FluentClientSection.FluentClientDocs ->\n                writable {\n                    val serviceName = codegenContext.serviceShape.serviceNameOrDefault(\"the service\")\n                    docs(\n                        \"\"\"\n                        An ergonomic client for $serviceName.\n\n                        This client allows ergonomic access to $serviceName.\n                        Each method corresponds to an API defined in the service's Smithy model,\n                        and the request and response shapes are auto-generated from that same model.\n                        \"\"\",\n                    )\n                    FluentClientDocs.clientConstructionDocs(codegenContext)(this)\n                    FluentClientDocs.clientUsageDocs(codegenContext)(this)\n                    FluentClientDocs.waiterDocs(codegenContext)(this)\n                }\n            else -> emptySection\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientDocs.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.generators.client\n\nimport software.amazon.smithy.model.knowledge.TopDownIndex\nimport software.amazon.smithy.model.shapes.StringShape\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.core.rustlang.docs\nimport software.amazon.smithy.rust.codegen.core.rustlang.docsTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\nimport software.amazon.smithy.rust.codegen.core.util.inputShape\nimport software.amazon.smithy.rust.codegen.core.util.serviceNameOrDefault\nimport software.amazon.smithy.waiters.WaitableTrait\n\nobject FluentClientDocs {\n    fun clientConstructionDocs(codegenContext: ClientCodegenContext) =\n        writable {\n            val serviceName = codegenContext.serviceShape.serviceNameOrDefault(\"the service\")\n            val moduleUseName = codegenContext.moduleUseName()\n            docsTemplate(\n                \"\"\"\n                Client for calling $serviceName.\n\n                #### Constructing a `Client`\n\n                A `Client` requires a config in order to be constructed. With the default set of Cargo features,\n                this config will only require an endpoint to produce a functioning client. However, some Smithy\n                features will require additional configuration. For example, `@auth` requires some kind of identity\n                or identity resolver to be configured. The config is used to customize various aspects of the client,\n                such as:\n\n                  - [The underlying HTTP client](crate::config::Builder::http_client)\n                  - [Retries](crate::config::Builder::retry_config)\n                  - [Timeouts](crate::config::Builder::timeout_config)\n                  - [... and more](crate::config::Builder)\n\n                Below is a minimal example of how to create a client:\n\n                ```rust,no_run\n                let config = $moduleUseName::Config::builder()\n                    .endpoint_url(\"http://localhost:1234\")\n                    .build();\n                let client = $moduleUseName::Client::from_conf(config);\n                ```\n\n                _Note:_ Client construction is expensive due to connection thread pool initialization, and should be done\n                once at application start-up. Cloning a client is cheap (it's just an [`Arc`](std::sync::Arc) under the hood),\n                so creating it once at start-up and cloning it around the application as needed is recommended.\n                \"\"\".trimIndent(),\n            )\n        }\n\n    fun clientUsageDocs(codegenContext: ClientCodegenContext) =\n        writable {\n            val model = codegenContext.model\n            val symbolProvider = codegenContext.symbolProvider\n            val operations = TopDownIndex.of(model).getContainedOperations(codegenContext.serviceShape)\n            if (operations.isNotEmpty()) {\n                // Find an operation with a simple string member shape\n                val (operation, member) =\n                    operations\n                        .map { op ->\n                            val member =\n                                op.inputShape(model)\n                                    .members()\n                                    .firstOrNull { model.expectShape(it.target) is StringShape }\n                            op to member\n                        }\n                        .sortedBy { it.first.id }\n                        .firstOrNull { (_, member) -> member != null } ?: (null to null)\n                if (operation != null && member != null) {\n                    val operationSymbol = symbolProvider.toSymbol(operation)\n                    val memberSymbol = symbolProvider.toSymbol(member)\n                    val operationFnName = FluentClientGenerator.clientOperationFnDocsName(operation, symbolProvider)\n                    docsTemplate(\n                        \"\"\"\n                        ## Using the `Client`\n\n                        A client has a function for every operation that can be performed by the service.\n                        For example, the [`${operationSymbol.name}`](${operationSymbol.namespace}) operation has\n                        a [`Client::$operationFnName`], function which returns a builder for that operation.\n                        The fluent builder ultimately has a `send()` function that returns an async future that\n                        returns a result, as illustrated below:\n\n                        ```rust,ignore\n                        let result = client.$operationFnName()\n                            .${memberSymbol.name}(\"example\")\n                            .send()\n                            .await;\n                        ```\n\n                        The underlying HTTP requests that get made by this can be modified with the `customize_operation`\n                        function on the fluent builder. See the [`customize`](crate::client::customize) module for more\n                        information.\n                        \"\"\".trimIndent(),\n                        \"operation\" to operationSymbol,\n                    )\n                }\n            }\n        }\n\n    fun waiterDocs(codegenContext: ClientCodegenContext) =\n        writable {\n            val operations = TopDownIndex.of(codegenContext.model).getContainedOperations(codegenContext.serviceShape)\n            if (operations.any { it.hasTrait<WaitableTrait>() }) {\n                docs(\n                    \"\"\"\n                    ## Waiters\n\n                    This client provides `wait_until` methods behind the [`Waiters`](crate::client::Waiters) trait.\n                    To use them, simply import the trait, and then call one of the `wait_until` methods. This will\n                    return a waiter fluent builder that takes various parameters, which are documented on the builder\n                    type. Once parameters have been provided, the `wait` method can be called to initiate waiting.\n\n                    For example, if there was a `wait_until_thing` method, it could look like:\n                    ```rust,ignore\n                    let result = client.wait_until_thing()\n                        .thing_id(\"someId\")\n                        .wait(Duration::from_secs(120))\n                        .await;\n                    ```\n                    \"\"\".trimIndent(),\n                    trimStart = false,\n                )\n            }\n        }\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.generators.client\n\nimport software.amazon.smithy.codegen.core.SymbolProvider\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.knowledge.TopDownIndex\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.traits.DocumentationTrait\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.isPaginated\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.waiters.WaitableGenerator\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.EscapeFor\nimport software.amazon.smithy.rust.codegen.core.rustlang.Feature\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustModule\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustReservedWords\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustType\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.asArgumentType\nimport software.amazon.smithy.rust.codegen.core.rustlang.deprecatedShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.docLink\nimport software.amazon.smithy.rust.codegen.core.rustlang.escape\nimport software.amazon.smithy.rust.codegen.core.rustlang.featureGatedBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.normalizeHtml\nimport software.amazon.smithy.rust.codegen.core.rustlang.qualifiedName\nimport software.amazon.smithy.rust.codegen.core.rustlang.render\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.stripOuter\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\nimport software.amazon.smithy.rust.codegen.core.smithy.RustCrate\nimport software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.writeCustomizations\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.setterName\nimport software.amazon.smithy.rust.codegen.core.smithy.rustType\nimport software.amazon.smithy.rust.codegen.core.util.dq\nimport software.amazon.smithy.rust.codegen.core.util.inputShape\nimport software.amazon.smithy.rust.codegen.core.util.orNull\nimport software.amazon.smithy.rust.codegen.core.util.outputShape\nimport software.amazon.smithy.rust.codegen.core.util.sdkId\nimport software.amazon.smithy.rust.codegen.core.util.toSnakeCase\n\nprivate val BehaviorVersionLatest = Feature(\"behavior-version-latest\", false, listOf())\n\nclass FluentClientGenerator(\n    private val codegenContext: ClientCodegenContext,\n    private val customizations: List<FluentClientCustomization> = emptyList(),\n) {\n    companion object {\n        fun clientOperationFnName(\n            operationShape: OperationShape,\n            symbolProvider: RustSymbolProvider,\n        ): String = RustReservedWords.escapeIfNeeded(clientOperationFnDocsName(operationShape, symbolProvider))\n\n        /** When using the function name in Rust docs, there's no need to escape Rust reserved words. **/\n        fun clientOperationFnDocsName(\n            operationShape: OperationShape,\n            symbolProvider: RustSymbolProvider,\n        ): String = symbolProvider.toSymbol(operationShape).name.toSnakeCase()\n\n        fun clientOperationModuleName(\n            operationShape: OperationShape,\n            symbolProvider: RustSymbolProvider,\n        ): String =\n            RustReservedWords.escapeIfNeeded(\n                symbolProvider.toSymbol(operationShape).name.toSnakeCase(),\n                EscapeFor.ModuleName,\n            )\n    }\n\n    private val serviceShape = codegenContext.serviceShape\n    private val operations =\n        TopDownIndex.of(codegenContext.model).getContainedOperations(serviceShape).sortedBy { it.id }\n    private val symbolProvider = codegenContext.symbolProvider\n    private val model = codegenContext.model\n    private val runtimeConfig = codegenContext.runtimeConfig\n\n    fun render(crate: RustCrate) {\n        renderFluentClient(crate)\n\n        val customizableOperationGenerator = CustomizableOperationGenerator(codegenContext)\n        operations.forEach { operation ->\n            crate.withModule(symbolProvider.moduleForBuilder(operation)) {\n                FluentBuilderGenerator(codegenContext, operation, customizations).render(this)\n            }\n        }\n\n        customizableOperationGenerator.render(crate)\n\n        WaitableGenerator(codegenContext, operations).render(crate)\n    }\n\n    private fun renderFluentClient(crate: RustCrate) {\n        crate.mergeFeature(BehaviorVersionLatest)\n        crate.withModule(ClientRustModule.client) {\n            rustTemplate(\n                \"\"\"\n                ##[derive(Debug)]\n                pub(crate) struct Handle {\n                    pub(crate) conf: crate::Config,\n                    ##[allow(dead_code)] // unused when a service does not provide any operations\n                    pub(crate) runtime_plugins: #{RuntimePlugins},\n                }\n\n                #{client_docs:W}\n                ##[derive(#{Clone}, ::std::fmt::Debug)]\n                pub struct Client {\n                    handle: #{Arc}<Handle>,\n                }\n\n                impl Client {\n                    /// Creates a new client from the service [`Config`](crate::Config).\n                    ///\n                    /// ## Panics\n                    ///\n                    /// This method will panic in the following cases:\n                    ///\n                    /// - Retries or timeouts are enabled without a `sleep_impl` configured.\n                    /// - Identity caching is enabled without a `sleep_impl` and `time_source` configured.\n                    /// - No `behavior_version` is provided.\n                    ///\n                    /// The panic message for each of these will have instructions on how to resolve them.\n                    ##[track_caller]\n                    pub fn from_conf(conf: crate::Config) -> Self {\n                        let handle = Handle {\n                            conf: conf.clone(),\n                            runtime_plugins: #{base_client_runtime_plugins}(conf),\n                        };\n                        if let Err(err) = Self::validate_config(&handle) {\n                            panic!(\"Invalid client configuration: {err}\");\n                        }\n                        Self {\n                            handle: #{Arc}::new(handle)\n                        }\n                    }\n\n                    /// Returns the client's configuration.\n                    pub fn config(&self) -> &crate::Config {\n                        &self.handle.conf\n                    }\n\n                    fn validate_config(handle: &Handle) -> #{Result}<(), #{BoxError}> {\n                        let mut cfg = #{ConfigBag}::base();\n                        handle.runtime_plugins\n                            .apply_client_configuration(&mut cfg)?\n                            .validate_base_client_config(&cfg)?;\n                        Ok(())\n                    }\n                }\n                \"\"\",\n                *preludeScope,\n                \"Arc\" to RuntimeType.Arc,\n                \"base_client_runtime_plugins\" to baseClientRuntimePluginsFn(codegenContext, customizations),\n                \"BoxError\" to RuntimeType.boxError(runtimeConfig),\n                \"client_docs\" to\n                    writable {\n                        customizations.forEach {\n                            it.section(\n                                FluentClientSection.FluentClientDocs(\n                                    serviceShape,\n                                ),\n                            )(this)\n                        }\n                    },\n                \"ConfigBag\" to RuntimeType.configBag(runtimeConfig),\n                \"RuntimePlugins\" to RuntimeType.runtimePlugins(runtimeConfig),\n                \"tracing\" to CargoDependency.Tracing.toType(),\n            )\n        }\n\n        operations.forEach { operation ->\n            val name = symbolProvider.toSymbol(operation).name\n            val fnName = clientOperationFnName(operation, symbolProvider)\n            val moduleName = clientOperationModuleName(operation, symbolProvider)\n\n            val privateModule = RustModule.private(moduleName, parent = ClientRustModule.client)\n            crate.withModule(privateModule) {\n                rustBlock(\"impl super::Client\") {\n                    val fullPath = operation.fullyQualifiedFluentBuilder(symbolProvider)\n                    val maybePaginated =\n                        if (operation.isPaginated(model)) {\n                            \"\\n/// This operation supports pagination; See [`into_paginator()`]($fullPath::into_paginator).\"\n                        } else {\n                            \"\"\n                        }\n\n                    val output = operation.outputShape(model)\n                    val operationOk = symbolProvider.toSymbol(output)\n                    val operationErr = symbolProvider.symbolForOperationError(operation)\n\n                    val inputFieldsBody =\n                        generateOperationShapeDocs(this, symbolProvider, operation, model)\n                            .joinToString(\"\\n\") { \"///   - $it\" }\n\n                    val inputFieldsHead =\n                        if (inputFieldsBody.isNotEmpty()) {\n                            \"The fluent builder is configurable:\\n\"\n                        } else {\n                            \"The fluent builder takes no input, just [`send`]($fullPath::send) it.\"\n                        }\n\n                    val outputFieldsBody =\n                        generateShapeMemberDocs(this, symbolProvider, output, model).joinToString(\"\\n\") {\n                            \"///   - $it\"\n                        }\n\n                    var outputFieldsHead = \"On success, responds with [`${operationOk.name}`]($operationOk)\"\n                    if (outputFieldsBody.isNotEmpty()) {\n                        outputFieldsHead += \" with field(s):\\n\"\n                    }\n\n                    rustTemplate(\n                        \"\"\"\n                        /// Constructs a fluent builder for the [`$name`]($fullPath) operation.$maybePaginated\n                        ///\n                        /// - $inputFieldsHead$inputFieldsBody\n                        /// - $outputFieldsHead$outputFieldsBody\n                        /// - On failure, responds with [`SdkError<${operationErr.name}>`]($operationErr)\n                        \"\"\",\n                    )\n\n                    // Write a deprecation notice if this operation is deprecated.\n                    deprecatedShape(operation)\n\n                    rustTemplate(\n                        \"\"\"\n                        pub fn $fnName(&self) -> #{FluentBuilder} {\n                            #{FluentBuilder}::new(self.handle.clone())\n                        }\n                        \"\"\",\n                        \"FluentBuilder\" to operation.fluentBuilderType(symbolProvider),\n                    )\n                }\n            }\n        }\n    }\n}\n\nprivate fun baseClientRuntimePluginsFn(\n    codegenContext: ClientCodegenContext,\n    customizations: List<FluentClientCustomization>,\n): RuntimeType =\n    codegenContext.runtimeConfig.let { rc ->\n        RuntimeType.forInlineFun(\"base_client_runtime_plugins\", ClientRustModule.config) {\n            val api = RuntimeType.smithyRuntimeApiClient(rc)\n            val rt = RuntimeType.smithyRuntime(rc)\n            val serviceId = codegenContext.serviceShape.sdkId().lowercase().replace(\" \", \"\")\n            val behaviorVersionError =\n                \"Invalid client configuration: A behavior major version must be set when sending a \" +\n                    \"request or constructing a client. You must set it during client construction or by enabling the \" +\n                    \"`${BehaviorVersionLatest.name}` cargo feature.\"\n            rustTemplate(\n                \"\"\"\n                pub(crate) fn base_client_runtime_plugins(\n                    mut config: crate::Config,\n                ) -> #{RuntimePlugins} {\n                    let mut configured_plugins = #{Vec}::new();\n                    ::std::mem::swap(&mut config.runtime_plugins, &mut configured_plugins);\n                    #{update_bmv}\n\n                    let default_retry_partition = ${serviceId.dq()};\n                    #{before_plugin_setup}\n\n                    let scope = ${codegenContext.moduleName.dq()};\n\n                    ##[allow(deprecated)]\n                    let mut plugins = #{RuntimePlugins}::new()\n                        // defaults\n                        .with_client_plugins(#{default_plugins}(\n                            #{DefaultPluginParams}::new()\n                                .with_retry_partition_name(default_retry_partition)\n                                .with_behavior_version(config.behavior_version.expect(${behaviorVersionError.dq()}))\n                                #{customize_default_plugin_params:W}\n                        ))\n                        // user config\n                        .with_client_plugin(\n                            #{StaticRuntimePlugin}::new()\n                                .with_config(config.config.clone())\n                                .with_runtime_components(config.runtime_components.clone())\n                        )\n                        // codegen config\n                        .with_client_plugin(crate::config::ServiceRuntimePlugin::new(config.clone()))\n                        .with_client_plugin(#{NoAuthRuntimePlugin}::new())\n                        .with_client_plugin(\n                            #{MetricsRuntimePlugin}::builder()\n                                .with_scope(scope)\n                                .with_time_source(config.runtime_components.time_source().unwrap_or_default())\n                                .build()\n                                .expect(\"All required fields have been set\")\n                        );\n\n                    #{additional_client_plugins:W}\n\n                    for plugin in configured_plugins {\n                        plugins = plugins.with_client_plugin(plugin);\n                    }\n                    plugins\n                }\n                \"\"\",\n                *preludeScope,\n                \"customize_default_plugin_params\" to\n                    writable {\n                        writeCustomizations(\n                            customizations,\n                            FluentClientSection.CustomizeDefaultPluginParams,\n                        )\n                    },\n                \"additional_client_plugins\" to\n                    writable {\n                        writeCustomizations(\n                            customizations,\n                            FluentClientSection.AdditionalBaseClientPlugins(\"plugins\", \"config\"),\n                        )\n                    },\n                \"before_plugin_setup\" to\n                    writable {\n                        writeCustomizations(\n                            customizations,\n                            FluentClientSection.BeforeBaseClientPluginSetup(\"config\"),\n                        )\n                    },\n                \"DefaultPluginParams\" to rt.resolve(\"client::defaults::DefaultPluginParams\"),\n                \"default_plugins\" to rt.resolve(\"client::defaults::default_plugins\"),\n                \"NoAuthRuntimePlugin\" to rt.resolve(\"client::auth::no_auth::NoAuthRuntimePlugin\"),\n                \"RuntimePlugins\" to RuntimeType.runtimePlugins(rc),\n                \"StaticRuntimePlugin\" to api.resolve(\"client::runtime_plugin::StaticRuntimePlugin\"),\n                \"MetricsRuntimePlugin\" to rt.resolve(\"client::metrics::MetricsRuntimePlugin\"),\n                \"update_bmv\" to\n                    featureGatedBlock(BehaviorVersionLatest) {\n                        rustTemplate(\n                            \"\"\"\n                            if config.behavior_version.is_none() {\n                                config.behavior_version = Some(#{BehaviorVersion}::latest());\n                            }\n\n                            \"\"\",\n                            \"BehaviorVersion\" to api.resolve(\"client::behavior_version::BehaviorVersion\"),\n                        )\n                    },\n            )\n        }\n    }\n\n/**\n * For a given `operation` shape, return a list of strings where each string describes the name and input type of one of\n * the operation's corresponding fluent builder methods as well as that method's documentation from the smithy model\n *\n * _NOTE: This function generates the docs that appear under **\"The fluent builder is configurable:\"**_\n */\nprivate fun generateOperationShapeDocs(\n    writer: RustWriter,\n    symbolProvider: RustSymbolProvider,\n    operation: OperationShape,\n    model: Model,\n): List<String> {\n    val input = operation.inputShape(model)\n    val fluentBuilderFullyQualifiedName = operation.fullyQualifiedFluentBuilder(symbolProvider)\n    return input.members().map { memberShape ->\n        val builderInputDoc = memberShape.asFluentBuilderInputDoc(symbolProvider)\n        val builderInputLink = docLink(\"$fluentBuilderFullyQualifiedName::${symbolProvider.toMemberName(memberShape)}\")\n        val builderSetterDoc = memberShape.asFluentBuilderSetterDoc(symbolProvider)\n        val builderSetterLink = docLink(\"$fluentBuilderFullyQualifiedName::${memberShape.setterName()}\")\n\n        val docTrait = memberShape.getMemberTrait(model, DocumentationTrait::class.java).orNull()\n        val docs =\n            when (docTrait?.value?.isNotBlank()) {\n                true -> normalizeHtml(writer.escape(docTrait.value)).replace(\"\\n\", \" \")\n                else -> \"(undocumented)\"\n            }\n\n        \"[`$builderInputDoc`]($builderInputLink) / [`$builderSetterDoc`]($builderSetterLink):<br>required: **${memberShape.isRequired}**<br>$docs<br>\"\n    }\n}\n\n/**\n * For a give `struct` shape, return a list of strings where each string describes the name and type of a struct field\n * as well as that field's documentation from the smithy model\n *\n *  * _NOTE: This function generates the list of types that appear under **\"On success, responds with\"**_\n */\nprivate fun generateShapeMemberDocs(\n    writer: RustWriter,\n    symbolProvider: SymbolProvider,\n    shape: StructureShape,\n    model: Model,\n): List<String> {\n    val structName = symbolProvider.toSymbol(shape).rustType().qualifiedName()\n    return shape.members().map { memberShape ->\n        val name = symbolProvider.toMemberName(memberShape)\n        val member = symbolProvider.toSymbol(memberShape).rustType().render(fullyQualified = false)\n        val docTrait = memberShape.getMemberTrait(model, DocumentationTrait::class.java).orNull()\n        val docs =\n            when (docTrait?.value?.isNotBlank()) {\n                true -> normalizeHtml(writer.escape(docTrait.value)).replace(\"\\n\", \" \")\n                else -> \"(undocumented)\"\n            }\n\n        \"[`$name($member)`](${docLink(\"$structName::$name\")}): $docs\"\n    }\n}\n\nfun OperationShape.fluentBuilderType(symbolProvider: RustSymbolProvider): RuntimeType =\n    symbolProvider.moduleForBuilder(this).toType()\n        .resolve(symbolProvider.toSymbol(this).name + \"FluentBuilder\")\n\n/**\n * Generate a valid fully-qualified Type for a fluent builder e.g.\n * `OperationShape(AssumeRole)` -> `\"crate::operations::assume_role::AssumeRoleFluentBuilder\"`\n *\n *  * _NOTE: This function generates the links that appear under **\"The fluent builder is configurable:\"**_\n */\nprivate fun OperationShape.fullyQualifiedFluentBuilder(symbolProvider: RustSymbolProvider): String =\n    fluentBuilderType(symbolProvider).fullyQualifiedName()\n\n/**\n * Generate a string that looks like a Rust function pointer for documenting a fluent builder method e.g.\n * `<MemberShape representing a struct method>` -> `\"method_name(MethodInputType)\"`\n *\n * _NOTE: This function generates the type names that appear under **\"The fluent builder is configurable:\"**_\n */\ninternal fun MemberShape.asFluentBuilderInputDoc(symbolProvider: SymbolProvider): String {\n    val memberName = symbolProvider.toMemberName(this)\n    val outerType = symbolProvider.toSymbol(this).rustType().stripOuter<RustType.Option>()\n    // We generate Vec/HashMap helpers\n    val renderedType =\n        when (outerType) {\n            is RustType.Vec -> listOf(outerType.member)\n            is RustType.HashMap -> listOf(outerType.key, outerType.member)\n            else -> listOf(outerType)\n        }\n    val args = renderedType.joinToString { it.asArgumentType(fullyQualified = false) }\n\n    return \"$memberName($args)\"\n}\n\n/**\n * Generate a string that looks like a Rust function pointer for documenting a fluent builder setter method e.g.\n * `<MemberShape representing a struct method>` -> `\"set_method_name(Option<MethodInputType>)\"`\n *\n *  _NOTE: This function generates the setter type names that appear under **\"The fluent builder is configurable:\"**_\n */\nprivate fun MemberShape.asFluentBuilderSetterDoc(symbolProvider: SymbolProvider): String {\n    val memberName = this.setterName()\n    val outerType = symbolProvider.toSymbol(this).rustType()\n\n    return \"$memberName(${outerType.asArgumentType(fullyQualified = false)})\"\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/IdempotencyTokenProviderCustomization.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.generators.config\n\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.NamedCustomization\n\n/**\n * Add an `idempotency_token_provider` field to Service config.\n */\nclass IdempotencyTokenProviderCustomization(codegenContext: ClientCodegenContext) : NamedCustomization<ServiceConfig>() {\n    private val runtimeConfig = codegenContext.runtimeConfig\n    private val codegenScope =\n        arrayOf(\n            *preludeScope,\n            \"IdempotencyTokenProvider\" to RuntimeType.idempotencyToken(runtimeConfig).resolve(\"IdempotencyTokenProvider\"),\n        )\n\n    override fun section(section: ServiceConfig): Writable {\n        return when (section) {\n            ServiceConfig.BuilderImpl ->\n                writable {\n                    rustTemplate(\n                        \"\"\"\n                        /// Sets the idempotency token provider to use for service calls that require tokens.\n                        pub fn idempotency_token_provider(mut self, idempotency_token_provider: impl #{Into}<#{IdempotencyTokenProvider}>) -> Self {\n                            self.set_idempotency_token_provider(#{Some}(idempotency_token_provider.into()));\n                            self\n                        }\n                        \"\"\",\n                        *codegenScope,\n                    )\n\n                    rustTemplate(\n                        \"\"\"\n                        /// Sets the idempotency token provider to use for service calls that require tokens.\n                        pub fn set_idempotency_token_provider(&mut self, idempotency_token_provider: #{Option}<#{IdempotencyTokenProvider}>) -> &mut Self {\n                            self.config.store_or_unset(idempotency_token_provider);\n                            self\n                        }\n                        \"\"\",\n                        *codegenScope,\n                    )\n                }\n\n            is ServiceConfig.DefaultForTests ->\n                writable {\n                    rust(\"\"\"${section.configBuilderRef}.set_idempotency_token_provider(Some(\"00000000-0000-4000-8000-000000000000\".into()));\"\"\")\n                }\n\n            else -> writable { }\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.generators.config\n\nimport software.amazon.smithy.codegen.core.Symbol\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.knowledge.OperationIndex\nimport software.amazon.smithy.model.knowledge.TopDownIndex\nimport software.amazon.smithy.model.shapes.ServiceShape\nimport software.amazon.smithy.model.traits.IdempotencyTokenTrait\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule\nimport software.amazon.smithy.rust.codegen.client.smithy.configReexport\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.TestUtilFeature\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute\nimport software.amazon.smithy.rust.codegen.core.rustlang.AttributeKind\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.docs\nimport software.amazon.smithy.rust.codegen.core.rustlang.docsOrFallback\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlockTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.NamedCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.Section\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\n\n/**\n * [ServiceConfig] is the parent type of sections that can be overridden when generating a config for a service.\n *\n * This functions similar to a strongly typed version of `CodeWriter`'s named sections\n * (and may eventually be modified to use that for implementation), however, it's currently strictly additive.\n *\n * As this becomes used for more complex customizations, the ability to fully replace the contents will become\n * necessary.\n *\n * Usage:\n * ```kotlin\n * class AddRegion : NamedCustomization<ServiceConfig>() {\n *  override fun section(section: ServiceConfig): Writable {\n *    return when (section) {\n *      is ServiceConfig.ConfigStruct -> writeable {\n *          rust(\"pub (crate) region: String,\")\n *      }\n *      else -> emptySection\n *    }\n * }\n * ```\n */\nsealed class ServiceConfig(name: String) : Section(name) {\n    /**\n     * Additional documentation comments for the `Config` struct.\n     */\n    data object ConfigStructAdditionalDocs : ServiceConfig(\"ConfigStructAdditionalDocs\")\n\n    /**\n     * Struct definition of `Config`. Fields should end with `,` (e.g. `foo: Box<u64>,`)\n     */\n    data object ConfigStruct : ServiceConfig(\"ConfigStruct\")\n\n    /**\n     * impl block of `Config`. (e.g. to add functions)\n     * e.g.\n     * ```kotlin\n     * rust(\"pub fn is_cross_region() -> bool { true }\")\n     * ```\n     */\n    data object ConfigImpl : ServiceConfig(\"ConfigImpl\")\n\n    /** Struct definition of `ConfigBuilder` **/\n    data object BuilderStruct : ServiceConfig(\"BuilderStruct\")\n\n    /** impl block of `ConfigBuilder` **/\n    data object BuilderImpl : ServiceConfig(\"BuilderImpl\")\n\n    // It is important to ensure through type system that each field added to config implements this injection,\n    // tracked by smithy-rs#3419\n\n    /**\n     * Load a value from a config bag and store it in ConfigBuilder\n     *  e.g.\n     *  ```kotlin\n     *  rust(\"\"\"builder.set_field(config_bag.load::<FieldType>().cloned())\"\"\")\n     *  ```\n     */\n    data class BuilderFromConfigBag(val builder: String, val configBag: String) : ServiceConfig(\"BuilderFromConfigBag\")\n\n    /**\n     * Convert from a field in the builder to the final field in config\n     *  e.g.\n     *  ```kotlin\n     *  rust(\"\"\"my_field: my_field.unwrap_or_else(||\"default\")\"\"\")\n     *  ```\n     */\n    data object BuilderBuild : ServiceConfig(\"BuilderBuild\")\n\n    /**\n     * A section for setting up a field to be used by ConfigOverrideRuntimePlugin\n     */\n    data class OperationConfigOverride(val cfg: String) : ServiceConfig(\"ToRuntimePlugin\")\n\n    /**\n     * A section for extra functionality that needs to be defined with the config module\n     */\n    data object Extras : ServiceConfig(\"Extras\")\n\n    /**\n     * The set default value of a field for use in tests, e.g `${configBuilderRef}.set_credentials(Credentials::for_tests())`\n     */\n    data class DefaultForTests(val configBuilderRef: String) : ServiceConfig(\"DefaultForTests\")\n\n    /**\n     * Set default value of a field for use in tests, e.g `${configBuilderRef}.set_credentials(Credentials::for_tests())`\n     *\n     * NOTE: V2 was added for backwards compatibility\n     */\n    data class DefaultForTestsV2(val configBuilderRef: String) : ServiceConfig(\"DefaultForTestsV2\")\n}\n\ndata class ConfigParam(\n    val name: String,\n    val type: Symbol,\n    val newtype: RuntimeType?,\n    val setterDocs: Writable?,\n    val getterDocs: Writable? = null,\n    val optional: Boolean = true,\n) {\n    data class Builder(\n        var name: String? = null,\n        var type: Symbol? = null,\n        var newtype: RuntimeType? = null,\n        var setterDocs: Writable? = null,\n        var getterDocs: Writable? = null,\n        var optional: Boolean = true,\n    ) {\n        fun name(name: String) = apply { this.name = name }\n\n        fun type(type: Symbol) = apply { this.type = type }\n\n        fun newtype(newtype: RuntimeType) = apply { this.newtype = newtype }\n\n        fun setterDocs(setterDocs: Writable?) = apply { this.setterDocs = setterDocs }\n\n        fun getterDocs(getterDocs: Writable?) = apply { this.getterDocs = getterDocs }\n\n        fun optional(optional: Boolean) = apply { this.optional = optional }\n\n        fun build() = ConfigParam(name!!, type!!, newtype, setterDocs, getterDocs, optional)\n    }\n}\n\n/**\n * Generate a [RuntimeType] for a newtype whose name is [newtypeName] that wraps [inner].\n *\n * When config parameters are stored in a config map in Rust, stored parameters are keyed by type.\n * Therefore, primitive types, such as bool and String, need to be wrapped in newtypes to make them distinct.\n */\nfun configParamNewtype(\n    newtypeName: String,\n    inner: Symbol,\n    runtimeConfig: RuntimeConfig,\n) = RuntimeType.forInlineFun(newtypeName, ClientRustModule.config) {\n    val codegenScope =\n        arrayOf(\n            \"Storable\" to RuntimeType.smithyTypes(runtimeConfig).resolve(\"config_bag::Storable\"),\n            \"StoreReplace\" to RuntimeType.smithyTypes(runtimeConfig).resolve(\"config_bag::StoreReplace\"),\n        )\n    rustTemplate(\n        \"\"\"\n        ##[derive(Debug, Clone)]\n        pub(crate) struct $newtypeName(pub(crate) $inner);\n        impl #{Storable} for $newtypeName {\n            type Storer = #{StoreReplace}<Self>;\n        }\n        \"\"\",\n        *codegenScope,\n    )\n}\n\n/**\n * Render an expression that loads a value from a config bag.\n *\n * The expression to be rendered handles a case where a newtype is stored in the config bag, but the user expects\n * the underlying raw type after the newtype has been loaded from the bag.\n */\nfun loadFromConfigBag(\n    innerTypeName: String,\n    newtype: RuntimeType,\n): Writable =\n    writable {\n        rustTemplate(\n            \"\"\"\n            load::<#{newtype}>().map(#{f})\n            \"\"\",\n            \"newtype\" to newtype,\n            \"f\" to\n                writable {\n                    if (innerTypeName == \"bool\") {\n                        rust(\"|ty| ty.0\")\n                    } else {\n                        rust(\"|ty| ty.0.clone()\")\n                    }\n                },\n        )\n    }\n\n/**\n * Config customization for a config param with no special behavior:\n * 1. `pub(crate)` field\n * 2. convenience setter (non-optional)\n * 3. standard setter (&mut self)\n */\nfun standardConfigParam(param: ConfigParam): ConfigCustomization =\n    object : ConfigCustomization() {\n        override fun section(section: ServiceConfig): Writable {\n            return when (section) {\n                ServiceConfig.BuilderImpl ->\n                    writable {\n                        docsOrFallback(param.setterDocs)\n                        rust(\n                            \"\"\"\n                            pub fn ${param.name}(mut self, ${param.name}: impl Into<#T>) -> Self {\n                                self.set_${param.name}(Some(${param.name}.into()));\n                                self\n                    }\"\"\",\n                            param.type,\n                        )\n\n                        docsOrFallback(param.setterDocs)\n                        rustTemplate(\n                            \"\"\"\n                            pub fn set_${param.name}(&mut self, ${param.name}: Option<#{T}>) -> &mut Self {\n                                self.config.store_or_unset(${param.name}.map(#{newtype}));\n                                self\n                            }\n                            \"\"\",\n                            \"T\" to param.type,\n                            \"newtype\" to param.newtype!!,\n                        )\n                    }\n\n                is ServiceConfig.BuilderFromConfigBag ->\n                    writable {\n                        rustTemplate(\n                            \"\"\"\n                            ${section.builder}.set_${param.name}(${section.configBag}.#{load_from_config_bag});\n                            \"\"\",\n                            \"load_from_config_bag\" to loadFromConfigBag(param.type.name, param.newtype!!),\n                        )\n                    }\n\n                else -> emptySection\n            }\n        }\n    }\n\nfun ServiceShape.needsIdempotencyToken(model: Model): Boolean {\n    val operationIndex = OperationIndex.of(model)\n    val topDownIndex = TopDownIndex.of(model)\n    return topDownIndex.getContainedOperations(this.id).flatMap { operationIndex.getInputMembers(it).values }\n        .any { it.hasTrait<IdempotencyTokenTrait>() }\n}\n\ntypealias ConfigCustomization = NamedCustomization<ServiceConfig>\n\n/**\n * Generate a `Config` struct, implementation & builder for a given service, approximately:\n * ```rust\n * struct Config {\n *    // various members\n * }\n * impl Config {\n *    // some public functions\n * }\n *\n * struct ConfigBuilder {\n *    // generally, optional members corresponding to members of `Config`\n * }\n * impl ConfigBuilder {\n *    // builder implementation\n * }\n */\n\nclass ServiceConfigGenerator(\n    codegenContext: ClientCodegenContext,\n    private val customizations: List<ConfigCustomization> = listOf(),\n) {\n    companion object {\n        fun withBaseBehavior(\n            codegenContext: ClientCodegenContext,\n            extraCustomizations: List<ConfigCustomization>,\n        ): ServiceConfigGenerator {\n            val baseFeatures = mutableListOf<ConfigCustomization>()\n            return ServiceConfigGenerator(codegenContext, baseFeatures + extraCustomizations)\n        }\n    }\n\n    private val moduleUseName = codegenContext.moduleUseName()\n    private val runtimeConfig = codegenContext.runtimeConfig\n    private val enableUserConfigurableRuntimePlugins = codegenContext.enableUserConfigurableRuntimePlugins\n    private val smithyTypes = RuntimeType.smithyTypes(runtimeConfig)\n    val codegenScope =\n        arrayOf(\n            *preludeScope,\n            \"BoxError\" to RuntimeType.boxError(runtimeConfig),\n            \"CloneableLayer\" to smithyTypes.resolve(\"config_bag::CloneableLayer\"),\n            \"ConfigBag\" to RuntimeType.configBag(codegenContext.runtimeConfig),\n            \"Cow\" to RuntimeType.Cow,\n            \"FrozenLayer\" to configReexport(smithyTypes.resolve(\"config_bag::FrozenLayer\")),\n            \"Layer\" to configReexport(smithyTypes.resolve(\"config_bag::Layer\")),\n            \"Resolver\" to RuntimeType.smithyRuntime(runtimeConfig).resolve(\"client::config_override::Resolver\"),\n            \"RuntimeComponentsBuilder\" to configReexport(RuntimeType.runtimeComponentsBuilder(runtimeConfig)),\n            \"RuntimePlugin\" to configReexport(RuntimeType.runtimePlugin(runtimeConfig)),\n            \"SharedRuntimePlugin\" to configReexport(RuntimeType.sharedRuntimePlugin(runtimeConfig)),\n            \"runtime_plugin\" to RuntimeType.smithyRuntimeApiClient(runtimeConfig).resolve(\"client::runtime_plugin\"),\n            \"BehaviorVersion\" to\n                configReexport(\n                    RuntimeType.smithyRuntimeApi(runtimeConfig).resolve(\"client::behavior_version::BehaviorVersion\"),\n                ),\n        )\n\n    private fun builderFromConfigBag() =\n        writable {\n            val builderVar = \"builder\"\n            val configBagVar = \"config_bag\"\n\n            docs(\"Constructs a config builder from the given `$configBagVar`, setting only fields stored in the config bag,\")\n            docs(\"but not those in runtime components.\")\n            Attribute.AllowUnused.render(this)\n            rustBlockTemplate(\n                \"pub(crate) fn from_config_bag($configBagVar: &#{ConfigBag}) -> Self\",\n                *codegenScope,\n            ) {\n                rust(\"let mut $builderVar = Self::new();\")\n                customizations.forEach {\n                    it.section(ServiceConfig.BuilderFromConfigBag(builderVar, configBagVar))(this)\n                }\n                rust(builderVar)\n            }\n        }\n\n    private fun behaviorMv() =\n        writable {\n            val docs = \"\"\"\n                /// Sets the [`behavior major version`](crate::config::BehaviorVersion).\n                ///\n                /// Over time, new best-practice behaviors are introduced. However, these behaviors might not be backwards\n                /// compatible. For example, a change which introduces new default timeouts or a new retry-mode for\n                /// all operations might be the ideal behavior but could break existing applications.\n                ///\n                /// ## Examples\n                ///\n                /// Set the behavior major version to `latest`. This is equivalent to enabling the `behavior-version-latest` cargo feature.\n                /// ```no_run\n                /// use $moduleUseName::config::BehaviorVersion;\n                ///\n                /// let config = $moduleUseName::Config::builder()\n                ///     .behavior_version(BehaviorVersion::latest())\n                ///     // ...\n                ///     .build();\n                /// let client = $moduleUseName::Client::from_conf(config);\n                /// ```\n                ///\n                /// Customizing behavior major version:\n                /// ```no_run\n                /// use $moduleUseName::config::BehaviorVersion;\n                ///\n                /// let config = $moduleUseName::Config::builder()\n                ///     .behavior_version(BehaviorVersion::v2023_11_09())\n                ///     // ...\n                ///     .build();\n                /// let client = $moduleUseName::Client::from_conf(config);\n                /// ```\n            ///\"\"\"\n            rustTemplate(\n                \"\"\"\n                $docs\n                pub fn behavior_version(mut self, behavior_version: crate::config::BehaviorVersion) -> Self {\n                    self.set_behavior_version(Some(behavior_version));\n                    self\n                }\n\n                $docs\n                pub fn set_behavior_version(&mut self, behavior_version: Option<crate::config::BehaviorVersion>) -> &mut Self {\n                    self.behavior_version = behavior_version;\n                    self\n                }\n\n                /// Convenience method to set the latest behavior major version\n                ///\n                /// This is equivalent to enabling the `behavior-version-latest` Cargo feature\n                pub fn behavior_version_latest(mut self) -> Self {\n                    self.set_behavior_version(Some(crate::config::BehaviorVersion::latest()));\n                    self\n                }\n                \"\"\",\n                *codegenScope,\n            )\n        }\n\n    fun render(writer: RustWriter) {\n        val configDocs = \"\"\"\n            Constructs a config builder.\n            <div class=\"warning\">\n            Note that a config created from this builder will not have the same safe defaults as one created by\n            the <a href=\"https://crates.io/crates/aws-config\" target=\"_blank\">aws-config</a> crate.\n            </div>\n        \"\"\"\n\n        // The doc line directly following this attribute is sometimes followed by empty lines.\n        // This triggers a clippy lint. I cannot figure out what is adding those lines, so\n        // allowing the line for now. Setting it as an inner attribute since this happens several\n        // times in this file.\n        Attribute.AllowClippyEmptyLineAfterDocComments.render(writer, AttributeKind.Inner)\n        writer.docs(\"Configuration for a $moduleUseName service client.\\n\")\n        customizations.forEach {\n            it.section(ServiceConfig.ConfigStructAdditionalDocs)(writer)\n        }\n        Attribute(Attribute.derive(RuntimeType.Clone, RuntimeType.Debug)).render(writer)\n        writer.rustBlock(\"pub struct Config\") {\n            rustTemplate(\n                \"\"\"\n                // Both `config` and `cloneable` are the same config, but the cloneable one\n                // is kept around so that it is possible to convert back into a builder. This can be\n                // optimized in the future.\n                pub(crate) config: #{FrozenLayer},\n                cloneable: #{CloneableLayer},\n                pub(crate) runtime_components: #{RuntimeComponentsBuilder},\n                pub(crate) runtime_plugins: #{Vec}<#{SharedRuntimePlugin}>,\n                pub(crate) behavior_version: #{Option}<#{BehaviorVersion}>,\n                \"\"\",\n                *codegenScope,\n            )\n            customizations.forEach {\n                it.section(ServiceConfig.ConfigStruct)(this)\n            }\n        }\n\n        writer.rustBlock(\"impl Config\") {\n            writer.docs(configDocs)\n            writer.rustTemplate(\n                \"\"\"\n                pub fn builder() -> Builder { Builder::default() }\n                \"\"\",\n            )\n            writer.rustTemplate(\n                \"\"\"\n                /// Converts this config back into a builder so that it can be tweaked.\n                pub fn to_builder(&self) -> Builder {\n                    Builder {\n                        config: self.cloneable.clone(),\n                        runtime_components: self.runtime_components.clone(),\n                        runtime_plugins: self.runtime_plugins.clone(),\n                        behavior_version: self.behavior_version,\n                    }\n                }\n                \"\"\",\n            )\n            customizations.forEach {\n                it.section(ServiceConfig.ConfigImpl)(this)\n            }\n        }\n\n        writer.docs(\"Builder for creating a `Config`.\")\n        Attribute(Attribute.derive(RuntimeType.Clone, RuntimeType.Debug)).render(writer)\n        writer.rustBlock(\"pub struct Builder\") {\n            rustTemplate(\n                \"\"\"\n                pub(crate) config: #{CloneableLayer},\n                pub(crate) runtime_components: #{RuntimeComponentsBuilder},\n                pub(crate) runtime_plugins: #{Vec}<#{SharedRuntimePlugin}>,\n                pub(crate) behavior_version: #{Option}<#{BehaviorVersion}>,\n                \"\"\",\n                *codegenScope,\n            )\n            customizations.forEach {\n                it.section(ServiceConfig.BuilderStruct)(this)\n            }\n        }\n\n        // Custom implementation of Default to give the runtime components builder a name\n        writer.rustBlockTemplate(\"impl #{Default} for Builder\", *codegenScope) {\n            writer.rustTemplate(\n                \"\"\"\n                fn default() -> Self {\n                    Self {\n                        config: #{Default}::default(),\n                        runtime_components: #{RuntimeComponentsBuilder}::new(\"service config\"),\n                        runtime_plugins: #{Default}::default(),\n                        behavior_version: #{Default}::default(),\n                    }\n                }\n                \"\"\",\n                *codegenScope,\n            )\n        }\n\n        writer.rustBlock(\"impl Builder\") {\n            writer.docs(configDocs)\n            writer.rust(\"pub fn new() -> Self { Self::default() }\")\n\n            builderFromConfigBag()(this)\n            customizations.forEach {\n                it.section(ServiceConfig.BuilderImpl)(this)\n            }\n            behaviorMv()(this)\n\n            val visibility =\n                if (enableUserConfigurableRuntimePlugins) {\n                    \"pub\"\n                } else {\n                    \"pub(crate)\"\n                }\n\n            docs(\"Adds a runtime plugin to the config.\")\n            if (!enableUserConfigurableRuntimePlugins) {\n                Attribute.AllowUnused.render(this)\n            }\n            rustTemplate(\n                \"\"\"\n                $visibility fn runtime_plugin(mut self, plugin: impl #{RuntimePlugin} + 'static) -> Self {\n                    self.push_runtime_plugin(#{SharedRuntimePlugin}::new(plugin));\n                    self\n                }\n                \"\"\",\n                *codegenScope,\n            )\n            docs(\"Adds a runtime plugin to the config.\")\n            if (!enableUserConfigurableRuntimePlugins) {\n                Attribute.AllowUnused.render(this)\n            }\n            rustTemplate(\n                \"\"\"\n                $visibility fn push_runtime_plugin(&mut self, plugin: #{SharedRuntimePlugin}) -> &mut Self {\n                    self.runtime_plugins.push(plugin);\n                    self\n                }\n                \"\"\",\n                *codegenScope,\n            )\n\n            val testUtilOnly =\n                Attribute(Attribute.cfg(Attribute.any(Attribute.feature(TestUtilFeature.name), writable(\"test\"))))\n\n            testUtilOnly.render(this)\n            Attribute.AllowUnusedMut.render(this)\n            docs(\"Apply test defaults to the builder. NOTE: Consider migrating to use `apply_test_defaults_v2` instead.\")\n            rustBlock(\"pub fn apply_test_defaults(&mut self) -> &mut Self\") {\n                customizations.forEach { it.section(ServiceConfig.DefaultForTests(\"self\"))(this) }\n                rustTemplate(\n                    \"self.behavior_version = #{Some}(crate::config::BehaviorVersion::latest());\",\n                    *preludeScope,\n                )\n                rust(\"self\")\n            }\n\n            testUtilOnly.render(this)\n            Attribute.AllowUnusedMut.render(this)\n            docs(\"Apply test defaults to the builder. NOTE: Consider migrating to use `with_test_defaults_v2` instead.\")\n            rustBlock(\"pub fn with_test_defaults(mut self) -> Self\") {\n                rust(\"self.apply_test_defaults(); self\")\n            }\n\n            testUtilOnly.render(this)\n            Attribute.AllowUnusedMut.render(this)\n            docs(\"Apply test defaults to the builder. V2 of this function sets additional test defaults such as region configuration (if applicable).\")\n            rustBlock(\"pub fn apply_test_defaults_v2(&mut self) -> &mut Self\") {\n                rust(\"self.apply_test_defaults();\")\n                customizations.forEach { it.section(ServiceConfig.DefaultForTestsV2(\"self\"))(this) }\n                rust(\"self\")\n            }\n\n            testUtilOnly.render(this)\n            Attribute.AllowUnusedMut.render(this)\n            docs(\"Apply test defaults to the builder. V2 of this function sets additional test defaults such as region configuration (if applicable).\")\n            rustBlock(\"pub fn with_test_defaults_v2(mut self) -> Self\") {\n                rust(\"self.apply_test_defaults_v2(); self\")\n            }\n\n            docs(\"Builds a [`Config`].\")\n            rust(\"##[allow(unused_mut)]\")\n            rustBlock(\"pub fn build(mut self) -> Config\") {\n                rustTemplate(\n                    \"\"\"\n                    let mut layer = self.config;\n                    \"\"\",\n                    *codegenScope,\n                )\n                customizations.forEach {\n                    it.section(ServiceConfig.BuilderBuild)(this)\n                }\n                rustBlock(\"Config\") {\n                    rustTemplate(\n                        \"\"\"\n                        config: #{Layer}::from(layer.clone()).with_name(\"$moduleUseName::config::Config\").freeze(),\n                        cloneable: layer,\n                        runtime_components: self.runtime_components,\n                        runtime_plugins: self.runtime_plugins,\n                        behavior_version: self.behavior_version,\n                        \"\"\",\n                        *codegenScope,\n                    )\n                }\n            }\n\n            customizations.forEach {\n                it.section(ServiceConfig.Extras)(writer)\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/StalledStreamProtectionConfigCustomization.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.generators.config\n\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.configReexport\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.OperationSection\nimport software.amazon.smithy.rust.codegen.client.smithy.traits.IncompatibleWithStalledStreamProtectionTrait\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.NamedCustomization\n\nclass StalledStreamProtectionDecorator : ClientCodegenDecorator {\n    override val name: String = \"StalledStreamProtection\"\n    override val order: Byte = 0\n\n    override fun configCustomizations(\n        codegenContext: ClientCodegenContext,\n        baseCustomizations: List<ConfigCustomization>,\n    ): List<ConfigCustomization> {\n        return baseCustomizations + StalledStreamProtectionConfigCustomization(codegenContext)\n    }\n\n    override fun operationCustomizations(\n        codegenContext: ClientCodegenContext,\n        operation: OperationShape,\n        baseCustomizations: List<OperationCustomization>,\n    ): List<OperationCustomization> {\n        return baseCustomizations + StalledStreamProtectionOperationCustomization(codegenContext, operation)\n    }\n}\n\n/**\n * Add a `stalled_stream_protection` field to Service config.\n */\nclass StalledStreamProtectionConfigCustomization(codegenContext: ClientCodegenContext) : NamedCustomization<ServiceConfig>() {\n    private val rc = codegenContext.runtimeConfig\n    private val codegenScope =\n        arrayOf(\n            *preludeScope,\n            \"StalledStreamProtectionConfig\" to configReexport(RuntimeType.smithyRuntimeApi(rc).resolve(\"client::stalled_stream_protection::StalledStreamProtectionConfig\")),\n        )\n\n    override fun section(section: ServiceConfig): Writable {\n        return when (section) {\n            ServiceConfig.ConfigImpl ->\n                writable {\n                    rustTemplate(\n                        \"\"\"\n                        /// Return a reference to the stalled stream protection configuration contained in this config, if any.\n                        pub fn stalled_stream_protection(&self) -> #{Option}<&#{StalledStreamProtectionConfig}> {\n                            self.config.load::<#{StalledStreamProtectionConfig}>()\n                        }\n                        \"\"\",\n                        *codegenScope,\n                    )\n                }\n            ServiceConfig.BuilderImpl ->\n                writable {\n                    rustTemplate(\n                        \"\"\"\n                        /// Set the [`StalledStreamProtectionConfig`](#{StalledStreamProtectionConfig})\n                        /// to configure protection for stalled streams.\n                        pub fn stalled_stream_protection(\n                            mut self,\n                            stalled_stream_protection_config: #{StalledStreamProtectionConfig}\n                        ) -> Self {\n                            self.set_stalled_stream_protection(#{Some}(stalled_stream_protection_config));\n                            self\n                        }\n                        \"\"\",\n                        *codegenScope,\n                    )\n\n                    rustTemplate(\n                        \"\"\"\n                        /// Set the [`StalledStreamProtectionConfig`](#{StalledStreamProtectionConfig})\n                        /// to configure protection for stalled streams.\n                        pub fn set_stalled_stream_protection(\n                            &mut self,\n                            stalled_stream_protection_config: #{Option}<#{StalledStreamProtectionConfig}>\n                        ) -> &mut Self {\n                            self.config.store_or_unset(stalled_stream_protection_config);\n                            self\n                        }\n                        \"\"\",\n                        *codegenScope,\n                    )\n                }\n\n            is ServiceConfig.BuilderFromConfigBag ->\n                writable {\n                    rustTemplate(\n                        \"${section.builder}.set_stalled_stream_protection(${section.configBag}.load::<#{StalledStreamProtectionConfig}>().cloned());\",\n                        *codegenScope,\n                    )\n                }\n\n            else -> emptySection\n        }\n    }\n}\n\nclass StalledStreamProtectionOperationCustomization(\n    codegenContext: ClientCodegenContext,\n    private val operationShape: OperationShape,\n) : OperationCustomization() {\n    private val rc = codegenContext.runtimeConfig\n\n    override fun section(section: OperationSection): Writable =\n        writable {\n            // Don't add the stalled stream protection interceptor if the operation is incompatible with it.\n            // The absence of the stalled stream protection interceptor does not remove\n            // `StalledStreamProtectionConfig` from `ConfigBag`, nor does it disable the config. However, it will prevent\n            // `UploadThroughput` from being added to `ConfigBag`, which will eventually cause\n            // `MaybeUploadThroughputCheckFuture` to use the regular `HttpConnectorFuture` instead of `UploadThroughputCheckFuture`.\n            // `MinimumThroughputDownloadBody` will not be used, as it is only added by the stalled stream protection interceptor.\n            if (operationShape.hasTrait(IncompatibleWithStalledStreamProtectionTrait.ID)) {\n                return@writable\n            }\n\n            when (section) {\n                is OperationSection.AdditionalInterceptors -> {\n                    val stalledStreamProtectionModule = RuntimeType.smithyRuntime(rc).resolve(\"client::stalled_stream_protection\")\n                    section.registerPermanentInterceptor(rc, this) {\n                        rustTemplate(\n                            \"\"\"\n                            #{StalledStreamProtectionInterceptor}::default()\n                            \"\"\",\n                            *preludeScope,\n                            \"StalledStreamProtectionInterceptor\" to stalledStreamProtectionModule.resolve(\"StalledStreamProtectionInterceptor\"),\n                        )\n                    }\n                }\n                else -> { }\n            }\n        }\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/error/ErrorCustomization.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.generators.error\n\nimport software.amazon.smithy.codegen.core.Symbol\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.NamedCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.Section\n\n/** Error customization sections */\nsealed class ErrorSection(name: String) : Section(name) {\n    /** Use this section to add additional trait implementations to the generated operation errors */\n    data class OperationErrorAdditionalTraitImpls(val errorSymbol: Symbol, val allErrors: List<StructureShape>) :\n        ErrorSection(\"OperationErrorAdditionalTraitImpls\")\n\n    /** Use this section to add additional trait implementations to the generated service error */\n    class ServiceErrorAdditionalTraitImpls(val allErrors: List<StructureShape>) :\n        ErrorSection(\"ServiceErrorAdditionalTraitImpls\")\n}\n\n/** Customizations for generated errors */\nabstract class ErrorCustomization : NamedCustomization<ErrorSection>()\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/error/ErrorGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.generators.error\n\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.traits.ErrorTrait\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.implBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenTarget\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.errorMetadata\nimport software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.BuilderCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.BuilderGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.BuilderSection\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.StructSettings\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.StructureCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.StructureGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.StructureSection\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.error.ErrorImplCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.error.ErrorImplGenerator\n\nclass ErrorGenerator(\n    private val model: Model,\n    private val symbolProvider: RustSymbolProvider,\n    private val shape: StructureShape,\n    private val error: ErrorTrait,\n    private val implCustomizations: List<ErrorImplCustomization>,\n    private val structSettings: StructSettings,\n) {\n    private val runtimeConfig = symbolProvider.config.runtimeConfig\n    private val symbol = symbolProvider.toSymbol(shape)\n\n    fun renderStruct(writer: RustWriter) {\n        writer.apply {\n            StructureGenerator(\n                model, symbolProvider, this, shape,\n                listOf(\n                    object : StructureCustomization() {\n                        override fun section(section: StructureSection): Writable =\n                            writable {\n                                when (section) {\n                                    is StructureSection.AdditionalFields -> {\n                                        rust(\"pub(crate) meta: #T,\", errorMetadata(runtimeConfig))\n                                    }\n\n                                    is StructureSection.AdditionalDebugFields -> {\n                                        rust(\"\"\"${section.formatterName}.field(\"meta\", &self.meta);\"\"\")\n                                    }\n\n                                    else -> {}\n                                }\n                            }\n                    },\n                ),\n                structSettings,\n            ).render()\n\n            ErrorImplGenerator(\n                model,\n                symbolProvider,\n                this,\n                shape,\n                error,\n                implCustomizations,\n            ).render(CodegenTarget.CLIENT)\n\n            rustBlock(\"impl #T for ${symbol.name}\", RuntimeType.provideErrorMetadataTrait(runtimeConfig)) {\n                rust(\"fn meta(&self) -> &#T { &self.meta }\", errorMetadata(runtimeConfig))\n            }\n\n            implBlock(symbol) {\n                BuilderGenerator.renderConvenienceMethod(this, symbolProvider, shape)\n            }\n        }\n    }\n\n    fun renderBuilder(writer: RustWriter) {\n        writer.apply {\n            BuilderGenerator(\n                model, symbolProvider, shape,\n                listOf(\n                    object : BuilderCustomization() {\n                        override fun section(section: BuilderSection): Writable =\n                            writable {\n                                when (section) {\n                                    is BuilderSection.AdditionalFields -> {\n                                        rust(\"meta: std::option::Option<#T>,\", errorMetadata(runtimeConfig))\n                                    }\n\n                                    is BuilderSection.AdditionalMethods -> {\n                                        rustTemplate(\n                                            \"\"\"\n                                            /// Sets error metadata\n                                            pub fn meta(mut self, meta: #{error_metadata}) -> Self {\n                                                self.meta = Some(meta);\n                                                self\n                                            }\n\n                                            /// Sets error metadata\n                                            pub fn set_meta(&mut self, meta: std::option::Option<#{error_metadata}>) -> &mut Self {\n                                                self.meta = meta;\n                                                self\n                                            }\n                                            \"\"\",\n                                            \"error_metadata\" to errorMetadata(runtimeConfig),\n                                        )\n                                    }\n\n                                    is BuilderSection.AdditionalFieldsInBuild -> {\n                                        rust(\"meta: self.meta.unwrap_or_default(),\")\n                                    }\n\n                                    else -> {}\n                                }\n                            }\n                    },\n                ),\n            ).render(this)\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/error/OperationErrorGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.generators.error\n\nimport software.amazon.smithy.codegen.core.Symbol\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.shapes.UnionShape\nimport software.amazon.smithy.model.traits.RetryableTrait\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustMetadata\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.Visibility\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.deprecatedShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.docs\nimport software.amazon.smithy.rust.codegen.core.rustlang.documentShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlockTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.errorMetadata\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\nimport software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.Section\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.writeCustomizations\nimport software.amazon.smithy.rust.codegen.core.smithy.transformers.eventStreamErrors\nimport software.amazon.smithy.rust.codegen.core.smithy.transformers.operationErrors\nimport software.amazon.smithy.rust.codegen.core.util.UNREACHABLE\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\nimport software.amazon.smithy.rust.codegen.core.util.toSnakeCase\n\n/**\n * Generates a unified error enum for [operation]. [ErrorGenerator] handles generating the individual variants,\n * but we must still combine those variants into an enum covering all possible errors for a given operation.\n *\n * This generator also generates errors for event streams.\n */\nclass OperationErrorGenerator(\n    private val model: Model,\n    private val symbolProvider: RustSymbolProvider,\n    private val operationOrEventStream: Shape,\n    private val customizations: List<ErrorCustomization>,\n) {\n    private val runtimeConfig = symbolProvider.config.runtimeConfig\n    private val errorMetadata = errorMetadata(symbolProvider.config.runtimeConfig)\n    private val createUnhandledError =\n        RuntimeType.smithyRuntimeApiClient(runtimeConfig).resolve(\"client::result::CreateUnhandledError\")\n\n    private fun operationErrors(): List<StructureShape> =\n        (operationOrEventStream as OperationShape).operationErrors(model).map { it.asStructureShape().get() }\n\n    private fun eventStreamErrors(): List<StructureShape> =\n        (operationOrEventStream as UnionShape).eventStreamErrors()\n            .map { model.expectShape(it.asMemberShape().get().target, StructureShape::class.java) }\n\n    fun render(writer: RustWriter) {\n        val (errorSymbol, errors) =\n            when (operationOrEventStream) {\n                is OperationShape -> symbolProvider.symbolForOperationError(operationOrEventStream) to operationErrors()\n                is UnionShape -> symbolProvider.symbolForEventStreamError(operationOrEventStream) to eventStreamErrors()\n                else -> UNREACHABLE(\"OperationErrorGenerator only supports operation or event stream shapes\")\n            }\n\n        val meta =\n            RustMetadata(\n                derives = setOf(RuntimeType.Debug),\n                additionalAttributes = listOf(Attribute.NonExhaustive),\n                visibility = Visibility.PUBLIC,\n            )\n\n        writer.rust(\"/// Error type for the `${errorSymbol.name}` operation.\")\n        meta.render(writer)\n        writer.rustBlock(\"enum ${errorSymbol.name}\") {\n            errors.forEach { errorVariant ->\n                documentShape(errorVariant, model)\n                deprecatedShape(errorVariant)\n                val errorVariantSymbol = symbolProvider.toSymbol(errorVariant)\n                write(\"${errorVariantSymbol.name}(#T),\", errorVariantSymbol)\n            }\n            rustTemplate(\n                \"\"\"\n                /// An unexpected error occurred (e.g., invalid JSON returned by the service or an unknown error code).\n                #{deprecation}\n                Unhandled(#{Unhandled}),\n                \"\"\",\n                \"deprecation\" to writable { renderUnhandledErrorDeprecation(runtimeConfig, errorSymbol.name) },\n                \"Unhandled\" to unhandledError(runtimeConfig),\n            )\n        }\n\n        writer.renderImpl(errorSymbol, errors)\n        writer.renderImplStdError(errorSymbol, errors)\n        writer.renderImplDisplay(errorSymbol, errors)\n        writer.renderImplProvideErrorKind(errorSymbol, errors)\n        writer.renderImplProvideErrorMetadata(errorSymbol, errors)\n        writer.renderImplCreateUnhandledError(errorSymbol)\n        writer.writeCustomizations(customizations, ErrorSection.OperationErrorAdditionalTraitImpls(errorSymbol, errors))\n    }\n\n    private fun RustWriter.renderImplCreateUnhandledError(errorSymbol: Symbol) {\n        rustBlock(\"impl #T for ${errorSymbol.name}\", createUnhandledError) {\n            rustBlockTemplate(\n                \"\"\"\n                fn create_unhandled_error(\n                    source: #{Box}<dyn #{StdError} + #{Send} + #{Sync} + 'static>,\n                    meta: #{Option}<#{ErrorMeta}>\n                ) -> Self\n                \"\"\",\n                *preludeScope,\n                \"StdError\" to RuntimeType.StdError,\n                \"ErrorMeta\" to errorMetadata,\n            ) {\n                rustTemplate(\n                    \"\"\"Self::Unhandled(#{Unhandled} { source, meta: meta.unwrap_or_default() })\"\"\",\n                    \"Unhandled\" to unhandledError(runtimeConfig),\n                )\n            }\n        }\n    }\n\n    private fun RustWriter.renderImplDisplay(\n        errorSymbol: Symbol,\n        errors: List<StructureShape>,\n    ) {\n        rustBlock(\"impl #T for ${errorSymbol.name}\", RuntimeType.Display) {\n            rustBlock(\"fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result\") {\n                delegateToVariants(errors) { variantMatch ->\n                    when (variantMatch) {\n                        is VariantMatch.Unhandled ->\n                            writable {\n                                rustTemplate(\n                                    \"\"\"\n                                    if let #{Some}(code) = #{ProvideErrorMetadata}::code(self) {\n                                        write!(f, \"unhandled error ({code})\")\n                                    } else {\n                                        f.write_str(\"unhandled error\")\n                                    }\n                                    \"\"\",\n                                    *preludeScope,\n                                    \"ProvideErrorMetadata\" to RuntimeType.provideErrorMetadataTrait(runtimeConfig),\n                                )\n                            }\n                        is VariantMatch.Modeled -> writable { rust(\"_inner.fmt(f)\") }\n                    }\n                }\n            }\n        }\n    }\n\n    private fun RustWriter.renderImplProvideErrorMetadata(\n        errorSymbol: Symbol,\n        errors: List<StructureShape>,\n    ) {\n        val errorMetadataTrait = RuntimeType.provideErrorMetadataTrait(runtimeConfig)\n        rustBlock(\"impl #T for ${errorSymbol.name}\", errorMetadataTrait) {\n            rustBlock(\"fn meta(&self) -> &#T\", errorMetadata(runtimeConfig)) {\n                delegateToVariants(errors) { variantMatch ->\n                    writable {\n                        when (variantMatch) {\n                            is VariantMatch.Unhandled -> rust(\"&_inner.meta\")\n                            is VariantMatch.Modeled -> rust(\"#T::meta(_inner)\", errorMetadataTrait)\n                        }\n                    }\n                }\n            }\n        }\n    }\n\n    private fun RustWriter.renderImplProvideErrorKind(\n        errorSymbol: Symbol,\n        errors: List<StructureShape>,\n    ) {\n        val retryErrorKindT = RuntimeType.retryErrorKind(symbolProvider.config.runtimeConfig)\n        rustBlock(\n            \"impl #T for ${errorSymbol.name}\",\n            RuntimeType.provideErrorKind(symbolProvider.config.runtimeConfig),\n        ) {\n            rustBlockTemplate(\"fn code(&self) -> #{Option}<&str>\", *preludeScope) {\n                rust(\"#T::code(self)\", RuntimeType.provideErrorMetadataTrait(runtimeConfig))\n            }\n\n            rustBlockTemplate(\n                \"fn retryable_error_kind(&self) -> #{Option}<#{ErrorKind}>\",\n                \"ErrorKind\" to retryErrorKindT,\n                *preludeScope,\n            ) {\n                val retryableVariants = errors.filter { it.hasTrait<RetryableTrait>() }\n                if (retryableVariants.isEmpty()) {\n                    rustTemplate(\"#{None}\", *preludeScope)\n                } else {\n                    rustBlock(\"match self\") {\n                        retryableVariants.forEach {\n                            val errorVariantSymbol = symbolProvider.toSymbol(it)\n                            rustTemplate(\n                                \"Self::${errorVariantSymbol.name}(inner) => #{Some}(inner.retryable_error_kind()),\",\n                                *preludeScope,\n                            )\n                        }\n                        rustTemplate(\"_ => #{None}\", *preludeScope)\n                    }\n                }\n            }\n        }\n    }\n\n    private fun RustWriter.renderImpl(\n        errorSymbol: Symbol,\n        errors: List<StructureShape>,\n    ) {\n        rustBlock(\"impl ${errorSymbol.name}\") {\n            rustTemplate(\n                \"\"\"\n                /// Creates the `${errorSymbol.name}::Unhandled` variant from any error type.\n                pub fn unhandled(err: impl #{Into}<#{Box}<dyn #{StdError} + #{Send} + #{Sync} + 'static>>) -> Self {\n                    Self::Unhandled(#{Unhandled} { source: err.into(), meta: #{Default}::default() })\n                }\n\n                /// Creates the `${errorSymbol.name}::Unhandled` variant from an [`ErrorMetadata`](#{ErrorMetadata}).\n                pub fn generic(err: #{ErrorMetadata}) -> Self {\n                    Self::Unhandled(#{Unhandled} { source: err.clone().into(), meta: err })\n                }\n                \"\"\",\n                *preludeScope,\n                \"ErrorMetadata\" to errorMetadata,\n                \"StdError\" to RuntimeType.StdError,\n                \"Unhandled\" to unhandledError(runtimeConfig),\n            )\n            docs(\n                \"\"\"\n                Returns error metadata, which includes the error code, message,\n                request ID, and potentially additional information.\n                \"\"\",\n            )\n            rustBlock(\"pub fn meta(&self) -> &#T\", errorMetadata) {\n                rustBlock(\"match self\") {\n                    errors.forEach { error ->\n                        val errorVariantSymbol = symbolProvider.toSymbol(error)\n                        rustTemplate(\n                            \"Self::${errorVariantSymbol.name}(e) => #{ProvideErrorMetadata}::meta(e),\",\n                            \"ProvideErrorMetadata\" to RuntimeType.provideErrorMetadataTrait(runtimeConfig),\n                        )\n                    }\n                    rust(\"Self::Unhandled(e) => &e.meta,\")\n                }\n            }\n            errors.forEach { error ->\n                val errorVariantSymbol = symbolProvider.toSymbol(error)\n                val fnName = errorVariantSymbol.name.toSnakeCase()\n                rust(\"/// Returns `true` if the error kind is `${errorSymbol.name}::${errorVariantSymbol.name}`.\")\n                rustBlock(\"pub fn is_$fnName(&self) -> bool\") {\n                    rust(\"matches!(self, Self::${errorVariantSymbol.name}(_))\")\n                }\n            }\n        }\n    }\n\n    private fun RustWriter.renderImplStdError(\n        errorSymbol: Symbol,\n        errors: List<StructureShape>,\n    ) {\n        rustBlock(\"impl #T for ${errorSymbol.name}\", RuntimeType.StdError) {\n            rustBlockTemplate(\n                \"fn source(&self) -> #{Option}<&(dyn #{StdError} + 'static)>\",\n                *preludeScope,\n                \"StdError\" to RuntimeType.StdError,\n            ) {\n                delegateToVariants(errors) { variantMatch ->\n                    when (variantMatch) {\n                        is VariantMatch.Unhandled ->\n                            writable {\n                                rustTemplate(\"#{Some}(&*_inner.source)\", *preludeScope)\n                            }\n                        is VariantMatch.Modeled ->\n                            writable {\n                                rustTemplate(\"#{Some}(_inner)\", *preludeScope)\n                            }\n                    }\n                }\n            }\n        }\n    }\n\n    sealed class VariantMatch(name: String) : Section(name) {\n        object Unhandled : VariantMatch(\"Unhandled\")\n\n        data class Modeled(val symbol: Symbol, val shape: Shape) : VariantMatch(\"Modeled\")\n    }\n\n    /**\n     * Generates code to delegate behavior to the variants, for example:\n     *\n     * ```rust\n     *  match self {\n     *      Self::InvalidGreeting(_inner) => inner.fmt(f),\n     *      Self::ComplexError(_inner) => inner.fmt(f),\n     *      Self::FooError(_inner) => inner.fmt(f),\n     *      Self::Unhandled(_inner) => _inner.fmt(f),\n     *  }\n     *  ```\n     *\n     * [handler] is passed an instance of [VariantMatch]—a [writable] should be returned containing the content to be\n     * written for this variant.\n     *\n     *  The field will always be bound as `_inner`.\n     */\n    fun RustWriter.delegateToVariants(\n        errors: List<StructureShape>,\n        handler: (VariantMatch) -> Writable,\n    ) {\n        rustBlock(\"match self\") {\n            errors.forEach {\n                val errorSymbol = symbolProvider.toSymbol(it)\n                rust(\"\"\"Self::${errorSymbol.name}(_inner) => \"\"\")\n                handler(VariantMatch.Modeled(errorSymbol, it))(this)\n                write(\",\")\n            }\n            val unhandledHandler = handler(VariantMatch.Unhandled)\n            rustBlock(\"Self::Unhandled(_inner) =>\") {\n                unhandledHandler(this)\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/error/ServiceErrorGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.generators.error\n\nimport software.amazon.smithy.codegen.core.Symbol\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustMetadata\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustModule\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.Visibility\nimport software.amazon.smithy.rust.codegen.core.rustlang.deprecatedShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.docs\nimport software.amazon.smithy.rust.codegen.core.rustlang.documentShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlockTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenContext\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\nimport software.amazon.smithy.rust.codegen.core.smithy.RustCrate\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.writeCustomizations\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.operationBuildError\nimport software.amazon.smithy.rust.codegen.core.smithy.transformers.allErrors\nimport software.amazon.smithy.rust.codegen.core.smithy.transformers.eventStreamErrors\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\nimport software.amazon.smithy.waiters.WaitableTrait\n\n/**\n * Each service defines its own \"top-level\" error combining all possible errors that a service can emit.\n *\n * Every service error is convertible into this top level error, which enables (if desired) authoring a single error handling\n * path. Eg:\n * ```rust\n * // dynamodb/src/lib.rs\n * enum Error {\n *   ListTablesError(ListTablesError),\n *   ValidationError(ValidationError),\n *   ...,\n *   // It also includes cases from SdkError\n * }\n * ```\n */\nclass ServiceErrorGenerator(\n    private val codegenContext: CodegenContext,\n    private val operations: List<OperationShape>,\n    private val customizations: List<ErrorCustomization>,\n) {\n    private val symbolProvider = codegenContext.symbolProvider\n    private val model = codegenContext.model\n\n    private val allErrors =\n        operations.flatMap {\n            it.allErrors(model)\n        }.map { it.id }.distinctBy { it.getName(codegenContext.serviceShape) }\n            .map { codegenContext.model.expectShape(it, StructureShape::class.java) }\n            .sortedBy { it.id.getName(codegenContext.serviceShape) }\n\n    private val sdkError = RuntimeType.sdkError(codegenContext.runtimeConfig)\n\n    fun render(crate: RustCrate) {\n        crate.withModule(RustModule.private(\"error_meta\")) {\n            renderDefinition()\n            renderImplDisplay()\n            renderImplFromBuildError()\n            renderImplProvideErrorMetadata()\n            // Every operation error can be converted into service::Error\n            operations.forEach { operationShape ->\n                // operation errors\n                renderImplFrom(symbolProvider.symbolForOperationError(operationShape), operationShape.errors)\n            }\n            // Every waiter error can be converted into service::Error\n            if (operations.any { it.hasTrait<WaitableTrait>() }) {\n                rustTemplate(\n                    \"\"\"\n                    impl<O, E> #{From}<#{WaiterError}<O, E>> for Error\n                    where\n                        O: #{Debug} + #{Send} + #{Sync} + 'static,\n                        E: #{StdError} + #{Send} + #{Sync} + 'static,\n                    {\n                        fn from(err: #{WaiterError}<O, E>) -> Self {\n                            Error::Unhandled(#{Unhandled} {\n                                meta: #{Default}::default(),\n                                source: err.into(),\n                            })\n                        }\n                    }\n                    \"\"\",\n                    *preludeScope,\n                    \"Debug\" to RuntimeType.Debug,\n                    \"StdError\" to RuntimeType.StdError,\n                    \"WaiterError\" to RuntimeType.smithyRuntimeApiClient(codegenContext.runtimeConfig).resolve(\"client::waiters::error::WaiterError\"),\n                    \"Unhandled\" to unhandledError(codegenContext.runtimeConfig),\n                )\n            }\n            // event stream errors\n            operations.map { it.eventStreamErrors(codegenContext.model) }\n                .flatMap { it.entries }\n                .associate { it.key to it.value }\n                .forEach { (unionShape, errors) ->\n                    renderImplFrom(\n                        symbolProvider.symbolForEventStreamError(unionShape),\n                        errors.map { it.id },\n                    )\n                }\n            rustBlock(\"impl #T for Error\", RuntimeType.StdError) {\n                rustBlock(\"fn source(&self) -> std::option::Option<&(dyn #T + 'static)>\", RuntimeType.StdError) {\n                    rustBlock(\"match self\") {\n                        allErrors.forEach {\n                            rust(\"Error::${symbolProvider.toSymbol(it).name}(inner) => inner.source(),\")\n                        }\n                        rustTemplate(\"Error::Unhandled(inner) => #{Some}(&*inner.source)\", *preludeScope)\n                    }\n                }\n            }\n            writeCustomizations(customizations, ErrorSection.ServiceErrorAdditionalTraitImpls(allErrors))\n        }\n        crate.lib { rust(\"pub use error_meta::Error;\") }\n    }\n\n    private fun RustWriter.renderImplDisplay() {\n        rustBlock(\"impl #T for Error\", RuntimeType.Display) {\n            rustBlock(\"fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result\") {\n                rustBlock(\"match self\") {\n                    allErrors.forEach {\n                        rust(\"Error::${symbolProvider.toSymbol(it).name}(inner) => inner.fmt(f),\")\n                    }\n                    rustTemplate(\n                        \"\"\"\n                        Error::Unhandled(_) => if let #{Some}(code) = #{ProvideErrorMetadata}::code(self) {\n                            write!(f, \"unhandled error ({code})\")\n                        } else {\n                            f.write_str(\"unhandled error\")\n                        }\n                        \"\"\",\n                        *preludeScope,\n                        \"ProvideErrorMetadata\" to RuntimeType.provideErrorMetadataTrait(codegenContext.runtimeConfig),\n                    )\n                }\n            }\n        }\n    }\n\n    private fun RustWriter.renderImplFromBuildError() {\n        rustTemplate(\n            \"\"\"\n            impl From<#{BuildError}> for Error {\n                fn from(value: #{BuildError}) -> Self {\n                    Error::Unhandled(#{Unhandled} { source: value.into(), meta: #{Default}::default() })\n                }\n            }\n\n            \"\"\",\n            *preludeScope,\n            \"BuildError\" to codegenContext.runtimeConfig.operationBuildError(),\n            \"Unhandled\" to unhandledError(codegenContext.runtimeConfig),\n        )\n    }\n\n    private fun RustWriter.renderImplFrom(\n        errorSymbol: Symbol,\n        errors: List<ShapeId>,\n    ) {\n        val operationErrors = errors.map { model.expectShape(it) }\n        rustBlock(\n            \"impl<R> From<#T<#T, R>> for Error where R: Send + Sync + std::fmt::Debug + 'static\",\n            sdkError,\n            errorSymbol,\n        ) {\n            rustBlockTemplate(\n                \"fn from(err: #{SdkError}<#{OpError}, R>) -> Self\",\n                \"SdkError\" to sdkError,\n                \"OpError\" to errorSymbol,\n            ) {\n                rustBlock(\"match err\") {\n                    rust(\"#T::ServiceError(context) => Self::from(context.into_err()),\", sdkError)\n                    rustTemplate(\n                        \"\"\"\n                        _ => Error::Unhandled(\n                            #{Unhandled} {\n                                meta: #{ProvideErrorMetadata}::meta(&err).clone(),\n                                source: err.into(),\n                            }\n                        ),\n                        \"\"\",\n                        \"Unhandled\" to unhandledError(codegenContext.runtimeConfig),\n                        \"ProvideErrorMetadata\" to RuntimeType.provideErrorMetadataTrait(codegenContext.runtimeConfig),\n                    )\n                }\n            }\n        }\n\n        rustBlock(\"impl From<#T> for Error\", errorSymbol) {\n            rustBlock(\"fn from(err: #T) -> Self\", errorSymbol) {\n                rustBlock(\"match err\") {\n                    operationErrors.forEach { errorShape ->\n                        val errSymbol = symbolProvider.toSymbol(errorShape)\n                        rust(\n                            \"#T::${errSymbol.name}(inner) => Error::${errSymbol.name}(inner),\",\n                            errorSymbol,\n                        )\n                    }\n                    rustTemplate(\n                        \"#{errorSymbol}::Unhandled(inner) => Error::Unhandled(inner),\",\n                        \"errorSymbol\" to errorSymbol,\n                        \"unhandled\" to unhandledError(codegenContext.runtimeConfig),\n                    )\n                }\n            }\n        }\n    }\n\n    private fun RustWriter.renderImplProvideErrorMetadata() {\n        rustTemplate(\n            \"\"\"\n            impl #{ProvideErrorMetadata} for Error {\n                fn meta(&self) -> &#{ErrorMetadata} {\n                    match self {\n                        #{matchers}\n                        Self::Unhandled(inner) => &inner.meta,\n                    }\n                }\n            }\n            \"\"\",\n            *preludeScope,\n            \"ErrorMetadata\" to\n                RuntimeType.smithyTypes(codegenContext.runtimeConfig)\n                    .resolve(\"error::metadata::ErrorMetadata\"),\n            \"ProvideErrorMetadata\" to\n                RuntimeType.smithyTypes(codegenContext.runtimeConfig)\n                    .resolve(\"error::metadata::ProvideErrorMetadata\"),\n            \"matchers\" to\n                writable {\n                    allErrors.forEach { errorShape ->\n                        val errSymbol = symbolProvider.toSymbol(errorShape)\n                        rust(\"Self::${errSymbol.name}(inner) => inner.meta(),\")\n                    }\n                },\n        )\n    }\n\n    private fun RustWriter.renderDefinition() {\n        rust(\"/// All possible error types for this service.\")\n        RustMetadata(\n            additionalAttributes = listOf(Attribute.NonExhaustive),\n            visibility = Visibility.PUBLIC,\n        ).withDerives(RuntimeType.Debug).render(this)\n        rustBlock(\"enum Error\") {\n            allErrors.forEach { error ->\n                documentShape(error, model)\n                deprecatedShape(error)\n                val sym = symbolProvider.toSymbol(error)\n                rust(\"${sym.name}(#T),\", sym)\n            }\n            docs(\"An unexpected error occurred (e.g., invalid JSON returned by the service or an unknown error code).\")\n            renderUnhandledErrorDeprecation(codegenContext.runtimeConfig, \"Error\")\n            rust(\"Unhandled(#T)\", unhandledError(codegenContext.runtimeConfig))\n        }\n    }\n}\n\nfun unhandledError(rc: RuntimeConfig): RuntimeType =\n    RuntimeType.forInlineFun(\n        \"Unhandled\",\n        // Place in a sealed module so that it can't be referenced at all\n        RustModule.pubCrate(\"sealed_unhandled\", ClientRustModule.Error),\n    ) {\n        rustTemplate(\n            \"\"\"\n            /// This struct is not intended to be used.\n            ///\n            /// This struct holds information about an unhandled error,\n            /// but that information should be obtained by using the\n            /// [`ProvideErrorMetadata`](#{ProvideErrorMetadata}) trait\n            /// on the error type.\n            ///\n            /// This struct intentionally doesn't yield any useful information itself.\n            #{deprecation}\n            ##[derive(Debug)]\n            pub struct Unhandled {\n                pub(crate) source: #{BoxError},\n                pub(crate) meta: #{ErrorMetadata},\n            }\n            \"\"\",\n            \"BoxError\" to RuntimeType.smithyRuntimeApi(rc).resolve(\"box_error::BoxError\"),\n            \"deprecation\" to writable { renderUnhandledErrorDeprecation(rc) },\n            \"ErrorMetadata\" to RuntimeType.smithyTypes(rc).resolve(\"error::metadata::ErrorMetadata\"),\n            \"ProvideErrorMetadata\" to RuntimeType.smithyTypes(rc).resolve(\"error::metadata::ProvideErrorMetadata\"),\n        )\n    }\n\nfun RustWriter.renderUnhandledErrorDeprecation(\n    rc: RuntimeConfig,\n    errorName: String? = null,\n) {\n    val link =\n        if (errorName != null) {\n            \"##impl-ProvideErrorMetadata-for-$errorName\"\n        } else {\n            \"#{ProvideErrorMetadata}\"\n        }\n    val message =\n        \"\"\"\n        Matching `Unhandled` directly is not forwards compatible. Instead, match using a\n        variable wildcard pattern and check `.code()`:<br/>\n        &nbsp;&nbsp;&nbsp;`err if err.code() == Some(\"SpecificExceptionCode\") => { /* handle the error */ }`<br/>\n        See [`ProvideErrorMetadata`]($link) for what information is available for the error.\n        \"\"\".trimIndent()\n    // `.dq()` doesn't quite do what we want here since we actually want a Rust multi-line string\n    val messageEscaped = message.replace(\"\\\"\", \"\\\\\\\"\").replace(\"\\n\", \" \\\\\\n\").replace(\"<br/>\", \"\\n\")\n    rustTemplate(\n        \"\"\"##[deprecated(note = \"$messageEscaped\")]\"\"\",\n        \"ProvideErrorMetadata\" to RuntimeType.provideErrorMetadataTrait(rc),\n    )\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/http/RequestBindingGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.generators.http\n\nimport software.amazon.smithy.model.knowledge.HttpBinding\nimport software.amazon.smithy.model.knowledge.HttpBindingIndex\nimport software.amazon.smithy.model.pattern.SmithyPattern\nimport software.amazon.smithy.model.shapes.MapShape\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.traits.EnumTrait\nimport software.amazon.smithy.model.traits.HttpTrait\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.autoDeref\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlockTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenContext\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.OperationBuildError\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.http.HttpBindingGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.operationBuildError\nimport software.amazon.smithy.rust.codegen.core.smithy.isOptional\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.Protocol\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.serialize.SerializerUtil\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.serialize.ValueExpression\nimport software.amazon.smithy.rust.codegen.core.util.dq\nimport software.amazon.smithy.rust.codegen.core.util.expectMember\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\nimport software.amazon.smithy.rust.codegen.core.util.inputShape\n\nfun HttpTrait.uriFormatString(): String {\n    return uri.rustFormatString(\"/\", \"/\")\n}\n\nfun SmithyPattern.rustFormatString(\n    prefix: String,\n    separator: String,\n): String {\n    val base =\n        segments.joinToString(separator = separator, prefix = prefix) {\n            when {\n                it.isLabel -> \"{${it.content}}\"\n                else -> it.content\n            }\n        }\n    return base.dq()\n}\n\n/**\n * Generates methods to serialize and deserialize requests based on the HTTP trait. Specifically:\n * 1. `fn update_http_request(builder: http::request::Builder) -> Builder`\n *\n * This method takes a builder (perhaps pre-configured with some headers) from the caller and sets the HTTP\n * headers & URL based on the HTTP trait implementation.\n */\nclass RequestBindingGenerator(\n    codegenContext: CodegenContext,\n    private val protocol: Protocol,\n    private val operationShape: OperationShape,\n) {\n    private val model = codegenContext.model\n    private val inputShape = operationShape.inputShape(model)\n    private val symbolProvider = codegenContext.symbolProvider\n    private val runtimeConfig = codegenContext.runtimeConfig\n    private val httpTrait = protocol.httpBindingResolver.httpTrait(operationShape)\n    private val httpBindingGenerator =\n        HttpBindingGenerator(protocol, codegenContext, codegenContext.symbolProvider, operationShape)\n    private val index = HttpBindingIndex.of(model)\n    private val encoder = RuntimeType.smithyTypes(runtimeConfig).resolve(\"primitive::Encoder\")\n    private val util = SerializerUtil(model, symbolProvider)\n\n    private val codegenScope =\n        arrayOf(\n            *preludeScope,\n            \"BuildError\" to runtimeConfig.operationBuildError(),\n            \"HttpRequestBuilder\" to RuntimeType.HttpRequestBuilder1x,\n            \"Input\" to symbolProvider.toSymbol(inputShape),\n        )\n\n    /**\n     * Generates `update_http_builder` and all necessary dependency functions into the impl block provided by\n     * [implBlockWriter]. The specific behavior is configured by [httpTrait].\n     */\n    fun renderUpdateHttpBuilder(implBlockWriter: RustWriter) {\n        uriBase(implBlockWriter)\n        val addHeadersFn = httpBindingGenerator.generateAddHeadersFn(operationShape, serializeEmptyHeaders = true)\n        val hasQuery = uriQuery(implBlockWriter)\n        Attribute.AllowClippyUnnecessaryWraps.render(implBlockWriter)\n        implBlockWriter.rustBlockTemplate(\n            \"\"\"\n            fn update_http_builder(\n                input: &#{Input},\n                builder: #{HttpRequestBuilder}\n            ) -> #{Result}<#{HttpRequestBuilder}, #{BuildError}>\n            \"\"\",\n            *codegenScope,\n        ) {\n            rustTemplate(\"let mut uri = #{String}::new();\", *preludeScope)\n            write(\"uri_base(input, &mut uri)?;\")\n            if (hasQuery) {\n                write(\"uri_query(input, &mut uri)?;\")\n            }\n            if (addHeadersFn != null) {\n                rust(\n                    \"\"\"\n                    let builder = #{T}(input, builder)?;\n                    \"\"\",\n                    addHeadersFn,\n                )\n            }\n            rustTemplate(\"#{Ok}(builder.method(${httpTrait.method.dq()}).uri(uri))\", *preludeScope)\n        }\n    }\n\n    // URI Generation **\n\n    /**\n     * Generate a function to build the request URI\n     */\n    private fun uriBase(writer: RustWriter) {\n        val formatString = httpTrait.uriFormatString()\n        // name of a local variable containing this member's component of the URI\n        val local = { member: MemberShape -> symbolProvider.toMemberName(member) }\n        val args =\n            httpTrait.uri.labels.map { label ->\n                val member = inputShape.expectMember(label.content)\n                \"${label.content} = ${local(member)}\"\n            }\n        val combinedArgs = listOf(formatString, *args.toTypedArray())\n        // Suppress the suggestion that would change the following:\n        //   ::std::write!(output, \"/snapshots/{SnapshotId}/blocks/{BlockIndex}\", SnapshotId = snapshot_id, BlockIndex = block_index)\n        // To:\n        //   ::std::write!(output, \"/snapshots/{snapshot_id}/blocks/{block_index}\")\n        Attribute.AllowUninlinedFormatArgs.render(writer)\n        writer.rustBlockTemplate(\n            \"fn uri_base(_input: &#{Input}, output: &mut #{String}) -> #{Result}<(), #{BuildError}>\",\n            *codegenScope,\n        ) {\n            rust(\"use #T as _;\", RuntimeType.stdFmt.resolve(\"Write\"))\n            httpTrait.uri.labels.map { label ->\n                val member = inputShape.expectMember(label.content)\n                serializeLabel(member, label, local(member))\n            }\n            rust(\"\"\"::std::write!(output, ${combinedArgs.joinToString(\", \")}).expect(\"formatting should succeed\");\"\"\")\n            rustTemplate(\"#{Ok}(())\", *codegenScope)\n        }\n    }\n\n    /**\n     * When needed, generate a function to build a query string\n     *\n     * This function uses aws_smithy_http::query::Query to append params to a query string:\n     * ```rust\n     *    fn uri_query(input: &Input, mut output: &mut String) {\n     *      let mut query = aws_smithy_http::query::Query::new(&mut output);\n     *      if let Some(inner_89) = &input.null_value {\n     *          query.push_kv(\"Null\", &aws_smithy_http::query::fmt_string(&inner_89));\n     *      }\n     *      if let Some(inner_90) = &input.empty_string {\n     *          query.push_kv(\"Empty\", &aws_smithy_http::query::fmt_string(&inner_90));\n     *      }\n     *    }\n     *  ```\n     */\n    private fun uriQuery(writer: RustWriter): Boolean {\n        // Don't bother generating the function if we aren't going to make a query string\n        val dynamicParams = index.getRequestBindings(operationShape, HttpBinding.Location.QUERY)\n        val mapParams = index.getRequestBindings(operationShape, HttpBinding.Location.QUERY_PARAMS)\n        val literalParams = httpTrait.uri.queryLiterals\n        if (dynamicParams.isEmpty() && literalParams.isEmpty() && mapParams.isEmpty()) {\n            return false\n        }\n        val preloadedParams = literalParams.keys + dynamicParams.map { it.locationName }\n        writer.rustBlockTemplate(\n            \"fn uri_query(_input: &#{Input}, mut output: &mut #{String}) -> #{Result}<(), #{BuildError}>\",\n            *codegenScope,\n        ) {\n            write(\"let mut query = #T::new(output);\", RuntimeType.queryFormat(runtimeConfig, \"Writer\"))\n            literalParams.forEach { (k, v) ->\n                // When `v` is an empty string, no value should be set.\n                // this generates a query string like `?k=v&xyz`\n                if (v.isEmpty()) {\n                    rust(\"query.push_v(${k.dq()});\")\n                } else {\n                    rust(\"query.push_kv(${k.dq()}, ${v.dq()});\")\n                }\n            }\n\n            if (mapParams.isNotEmpty()) {\n                rust(\"let protected_params = ${preloadedParams.joinToString(prefix = \"[\", postfix = \"]\") { it.dq() }};\")\n            }\n            mapParams.forEach { param ->\n                val memberShape = param.member\n                val memberSymbol = symbolProvider.toSymbol(memberShape)\n                val memberName = symbolProvider.toMemberName(memberShape)\n                val targetShape = model.expectShape(memberShape.target, MapShape::class.java)\n                val stringFormatter = RuntimeType.queryFormat(runtimeConfig, \"fmt_string\")\n                ifSet(\n                    model.expectShape(param.member.target),\n                    memberSymbol,\n                    ValueExpression.Reference(\"&_input.$memberName\"),\n                ) { value ->\n                    rustBlock(\"for (k, v) in ${value.asRef()}\") {\n                        // if v is a list, generate another level of iteration\n                        listForEach(model.expectShape(targetShape.value.target), \"v\") { innerField, _ ->\n                            rustBlock(\"if !protected_params.contains(&k.as_str())\") {\n                                rust(\"query.push_kv(&#1T(k), &#1T($innerField));\", stringFormatter)\n                            }\n                        }\n                    }\n                }\n            }\n\n            dynamicParams.forEach { param ->\n                val memberShape = param.member\n                val memberSymbol = symbolProvider.toSymbol(memberShape)\n                val memberName = symbolProvider.toMemberName(memberShape)\n                val target = model.expectShape(memberShape.target)\n\n                if (memberShape.isRequired) {\n                    val codegenScope =\n                        arrayOf(\n                            *preludeScope,\n                            \"BuildError\" to\n                                OperationBuildError(runtimeConfig).missingField(\n                                    memberName,\n                                    \"cannot be empty or unset\",\n                                ),\n                        )\n                    val derefName = safeName(\"inner\")\n                    rust(\"let $derefName = &_input.$memberName;\")\n                    if (memberSymbol.isOptional()) {\n                        rustTemplate(\n                            \"let $derefName = $derefName.as_ref().ok_or_else(|| #{BuildError:W})?;\",\n                            *codegenScope,\n                        )\n                    }\n\n                    // Strings that aren't enums must be checked to see if they're empty\n                    if (target.isStringShape && !target.hasTrait<EnumTrait>()) {\n                        rustBlock(\"if $derefName.is_empty()\") {\n                            rustTemplate(\"return #{Err}(#{BuildError:W});\", *codegenScope)\n                        }\n                    }\n\n                    paramList(target, derefName, param, writer, memberShape)\n                } else {\n                    // If we have an Option<T>, there won't be a default so nothing to ignore. If it's a primitive\n                    // boolean or number, we ignore the default.\n                    ifSome(memberSymbol, ValueExpression.Reference(\"&_input.$memberName\")) { field ->\n                        with(util) {\n                            ignoreDefaultsForNumbersAndBools(memberShape, field) {\n                                // if `param` is a list, generate another level of iteration\n                                paramList(target, field.name, param, writer, memberShape)\n                            }\n                        }\n                    }\n                }\n            }\n            writer.rustTemplate(\"#{Ok}(())\", *codegenScope)\n        }\n        return true\n    }\n\n    private fun RustWriter.paramList(\n        outerTarget: Shape,\n        field: String,\n        param: HttpBinding,\n        writer: RustWriter,\n        memberShape: MemberShape,\n    ) {\n        listForEach(outerTarget, field) { innerField, targetId ->\n            val target = model.expectShape(targetId)\n            val value = paramFmtFun(writer, target, memberShape, innerField)\n            rust(\"\"\"query.push_kv(\"${param.locationName}\", $value);\"\"\")\n        }\n    }\n\n    /**\n     * Format [member] when used as a queryParam\n     */\n    private fun paramFmtFun(\n        writer: RustWriter,\n        target: Shape,\n        member: MemberShape,\n        targetName: String,\n    ): String {\n        return when {\n            target.isStringShape -> {\n                val func = writer.format(RuntimeType.queryFormat(runtimeConfig, \"fmt_string\"))\n                if (target.hasTrait<EnumTrait>()) {\n                    \"&$func($targetName.as_str())\"\n                } else {\n                    \"&$func($targetName)\"\n                }\n            }\n\n            target.isTimestampShape -> {\n                val timestampFormat =\n                    index.determineTimestampFormat(member, HttpBinding.Location.QUERY, protocol.defaultTimestampFormat)\n                val timestampFormatType = RuntimeType.serializeTimestampFormat(runtimeConfig, timestampFormat)\n                val func = writer.format(RuntimeType.queryFormat(runtimeConfig, \"fmt_timestamp\"))\n                \"&$func($targetName, ${writer.format(timestampFormatType)})?\"\n            }\n\n            target.isListShape || target.isMemberShape -> {\n                throw IllegalArgumentException(\"lists should be handled at a higher level\")\n            }\n\n            else -> {\n                \"${writer.format(encoder)}::from(${autoDeref(targetName)}).encode()\"\n            }\n        }\n    }\n\n    private fun RustWriter.serializeLabel(\n        member: MemberShape,\n        label: SmithyPattern.Segment,\n        outputVar: String,\n    ) {\n        val target = model.expectShape(member.target)\n        val symbol = symbolProvider.toSymbol(member)\n        val buildError =\n            OperationBuildError(runtimeConfig).missingField(\n                symbolProvider.toMemberName(member),\n                \"cannot be empty or unset\",\n            )\n        val input = safeName(\"input\")\n        rust(\"let $input = &_input.${symbolProvider.toMemberName(member)};\")\n        if (symbol.isOptional()) {\n            rustTemplate(\"let $input = $input.as_ref().ok_or_else(|| #{buildError:W})?;\", \"buildError\" to buildError)\n        }\n        when {\n            target.isStringShape -> {\n                val func = format(RuntimeType.labelFormat(runtimeConfig, \"fmt_string\"))\n                val encodingStrategy =\n                    if (label.isGreedyLabel) {\n                        RuntimeType.labelFormat(runtimeConfig, \"EncodingStrategy::Greedy\")\n                    } else {\n                        RuntimeType.labelFormat(runtimeConfig, \"EncodingStrategy::Default\")\n                    }\n                val inputExpr = if (target.hasTrait<EnumTrait>()) \"$input.as_str()\" else \"$input\"\n                rust(\"let $outputVar = $func($inputExpr, #T);\", encodingStrategy)\n            }\n\n            target.isTimestampShape -> {\n                val timestampFormat =\n                    index.determineTimestampFormat(member, HttpBinding.Location.LABEL, protocol.defaultTimestampFormat)\n                val timestampFormatType = RuntimeType.serializeTimestampFormat(runtimeConfig, timestampFormat)\n                val func = format(RuntimeType.labelFormat(runtimeConfig, \"fmt_timestamp\"))\n                rust(\"let $outputVar = $func($input, ${format(timestampFormatType)})?;\")\n            }\n\n            else -> {\n                rust(\n                    \"let mut ${outputVar}_encoder = #T::from(${autoDeref(input)}); let $outputVar = ${outputVar}_encoder.encode();\",\n                    encoder,\n                )\n            }\n        }\n        rustTemplate(\n            \"\"\"\n            if $outputVar.is_empty() {\n                return #{Err}(#{buildError:W})\n            }\n            \"\"\",\n            *preludeScope,\n            \"buildError\" to buildError,\n        )\n    }\n    /** End URI generation **/\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/http/ResponseBindingGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.generators.http\n\nimport software.amazon.smithy.codegen.core.Symbol\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenContext\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.http.HttpBindingGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.HttpBindingDescriptor\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.Protocol\n\nclass ResponseBindingGenerator(\n    protocol: Protocol,\n    codegenContext: CodegenContext,\n    operationShape: OperationShape,\n) {\n    private val httpBindingGenerator =\n        HttpBindingGenerator(protocol, codegenContext, codegenContext.symbolProvider, operationShape)\n\n    fun generateDeserializeHeaderFn(binding: HttpBindingDescriptor): RuntimeType =\n        httpBindingGenerator.generateDeserializeHeaderFn(binding)\n\n    fun generateDeserializePrefixHeaderFn(binding: HttpBindingDescriptor): RuntimeType =\n        httpBindingGenerator.generateDeserializePrefixHeaderFn(binding)\n\n    fun generateDeserializePayloadFn(\n        binding: HttpBindingDescriptor,\n        errorSymbol: Symbol,\n        payloadParser: RustWriter.(String) -> Unit,\n    ): RuntimeType = httpBindingGenerator.generateDeserializePayloadFn(binding, errorSymbol, payloadParser)\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ClientProtocolTestGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.generators.protocol\n\nimport software.amazon.smithy.model.shapes.DoubleShape\nimport software.amazon.smithy.model.shapes.FloatShape\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.traits.ErrorTrait\nimport software.amazon.smithy.protocoltests.traits.AppliesTo\nimport software.amazon.smithy.protocoltests.traits.HttpRequestTestCase\nimport software.amazon.smithy.protocoltests.traits.HttpResponseTestCase\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.ClientInstantiator\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.escape\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.protocol.BrokenTest\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.protocol.FailingTest\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.protocol.ProtocolSupport\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.protocol.ProtocolTestGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.protocol.ServiceShapeId.AWS_JSON_10\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.protocol.ServiceShapeId.REST_JSON\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.protocol.ServiceShapeId.REST_XML\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.protocol.ServiceShapeId.RPC_V2_CBOR\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.protocol.TestCase\nimport software.amazon.smithy.rust.codegen.core.util.PANIC\nimport software.amazon.smithy.rust.codegen.core.util.dq\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\nimport software.amazon.smithy.rust.codegen.core.util.inputShape\nimport software.amazon.smithy.rust.codegen.core.util.isStreaming\nimport software.amazon.smithy.rust.codegen.core.util.orNull\nimport software.amazon.smithy.rust.codegen.core.util.outputShape\nimport java.util.logging.Logger\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType as RT\n\ndata class ClientCreationParams(\n    val codegenContext: ClientCodegenContext,\n    val httpClientName: String,\n    val configBuilderName: String,\n    val clientName: String,\n)\n\n/**\n * Generate client protocol tests for an [operationShape].\n */\nclass ClientProtocolTestGenerator(\n    override val codegenContext: ClientCodegenContext,\n    override val protocolSupport: ProtocolSupport,\n    override val operationShape: OperationShape,\n    private val renderClientCreation: RustWriter.(ClientCreationParams) -> Unit = { params ->\n        rustTemplate(\n            \"\"\"\n            let ${params.clientName} = #{Client}::from_conf(\n                ${params.configBuilderName}\n                    .http_client(${params.httpClientName})\n                    .build()\n            );\n            \"\"\",\n            \"Client\" to ClientRustModule.root.toType().resolve(\"Client\"),\n        )\n    },\n) : ProtocolTestGenerator() {\n    companion object {\n        private val ExpectFail =\n            setOf<FailingTest>(\n                // Failing because we don't serialize default values if they match the default.\n                FailingTest.ResponseTest(AWS_JSON_10, \"AwsJson10ClientPopulatesDefaultsValuesWhenMissingInResponse\"),\n                FailingTest.ResponseTest(\n                    AWS_JSON_10,\n                    \"AwsJson10ClientErrorCorrectsWithDefaultValuesWhenServerFailsToSerializeRequiredValues\",\n                ),\n                FailingTest.RequestTest(AWS_JSON_10, \"AwsJson10ClientUsesExplicitlyProvidedMemberValuesOverDefaults\"),\n                FailingTest.RequestTest(AWS_JSON_10, \"AwsJson10ClientPopulatesDefaultValuesInInput\"),\n                FailingTest.RequestTest(REST_JSON, \"RestJsonClientPopulatesDefaultValuesInInput\"),\n                FailingTest.RequestTest(REST_JSON, \"RestJsonClientUsesExplicitlyProvidedMemberValuesOverDefaults\"),\n                FailingTest.ResponseTest(REST_JSON, \"RestJsonClientPopulatesDefaultsValuesWhenMissingInResponse\"),\n                FailingTest.RequestTest(RPC_V2_CBOR, \"RpcV2CborClientPopulatesDefaultValuesInInput\"),\n                FailingTest.ResponseTest(\n                    RPC_V2_CBOR,\n                    \"RpcV2CborClientPopulatesDefaultsValuesWhenMissingInResponse\",\n                ),\n                FailingTest.RequestTest(RPC_V2_CBOR, \"RpcV2CborClientUsesExplicitlyProvidedMemberValuesOverDefaults\"),\n                // Failing due to bug in httpPreficHeaders serialization\n                // https://github.com/smithy-lang/smithy-rs/issues/4184\n                FailingTest.RequestTest(REST_XML, \"HttpEmptyPrefixHeadersRequestClient\"),\n                FailingTest.RequestTest(REST_JSON, \"RestJsonHttpEmptyPrefixHeadersRequestClient\"),\n                // Smithy protocol tests expect null to be silently dropped, but we now correctly reject it.\n                // These tests will be removed in https://github.com/smithy-lang/smithy/pull/2972\n                FailingTest.ResponseTest(REST_JSON, \"RestJsonDeserializesDenseSetMapAndSkipsNull\"),\n                FailingTest.ResponseTest(RPC_V2_CBOR, \"RpcV2CborDeserializesDenseSetMapAndSkipsNull\"),\n                FailingTest.ResponseTest(\"aws.protocoltests.restjson#RestJsonExtras\", \"NullInNonSparse\"),\n            )\n\n        private val BrokenTests:\n            Set<BrokenTest> = setOf()\n    }\n\n    override val appliesTo: AppliesTo\n        get() = AppliesTo.CLIENT\n    override val expectFail: Set<FailingTest>\n        get() = ExpectFail\n    override val generateOnly: Set<String>\n        get() = emptySet()\n    override val disabledTests: Set<String>\n        get() = emptySet()\n    override val brokenTests: Set<BrokenTest>\n        get() = BrokenTests\n\n    override val logger: Logger = Logger.getLogger(javaClass.name)\n\n    private val rc = codegenContext.runtimeConfig\n\n    private val inputShape = operationShape.inputShape(codegenContext.model)\n    private val outputShape = operationShape.outputShape(codegenContext.model)\n\n    private val instantiator = ClientInstantiator(codegenContext, withinTest = true)\n\n    private val codegenScope =\n        arrayOf(\n            \"AssertEq\" to RT.PrettyAssertions.resolve(\"assert_eq!\"),\n            \"Bytes\" to RT.Bytes,\n            \"Uri\" to RT.Http1x.resolve(\"Uri\"),\n        )\n\n    override fun RustWriter.renderAllTestCases(allTests: List<TestCase>) {\n        for (it in allTests) {\n            renderTestCaseBlock(it, this) {\n                when (it) {\n                    is TestCase.RequestTest -> this.renderHttpRequestTestCase(it.testCase)\n                    is TestCase.ResponseTest -> this.renderHttpResponseTestCase(it.testCase, it.targetShape)\n                    is TestCase.MalformedRequestTest -> PANIC(\"Client protocol test generation does not support HTTP compliance test case type `$it`\")\n                }\n            }\n        }\n    }\n\n    private fun RustWriter.renderHttpRequestTestCase(httpRequestTestCase: HttpRequestTestCase) {\n        logger.info(\"Generating request test: ${httpRequestTestCase.id}\")\n\n        if (!protocolSupport.requestSerialization) {\n            rust(\"/* test case disabled for this protocol (not yet supported) */\")\n            return\n        }\n        val customParams =\n            httpRequestTestCase.vendorParams.getObjectMember(\"endpointParams\").orNull()?.let { params ->\n                writable {\n                    val customizations = codegenContext.rootDecorator.endpointCustomizations(codegenContext)\n                    params.getObjectMember(\"builtInParams\").orNull()?.members?.forEach { (name, value) ->\n                        customizations.firstNotNullOf {\n                            it.setBuiltInOnServiceConfig(name.value, value, \"config_builder\")\n                        }(this)\n                    }\n                }\n            } ?: writable { }\n        // support test cases that set the host value, e.g: https://github.com/smithy-lang/smithy/blob/be68f3bbdfe5bf50a104b387094d40c8069f16b1/smithy-aws-protocol-tests/model/restJson1/endpoint-paths.smithy#L19\n        val host = \"https://${httpRequestTestCase.host.orNull() ?: \"example.com\"}\".dq()\n        rustTemplate(\n            \"\"\"\n            let (http_client, request_receiver) = #{capture_request}(None);\n            let config_builder = #{config}::Config::builder()\n                .with_test_defaults()\n                // TODO(https://github.com/smithy-lang/smithy-rs/issues/4177):\n                //  Until the incorrect separation is addressed, we need to rely on this workaround.\n                .allow_no_auth()\n                .endpoint_url($host);\n            #{customParams}\n\n            \"\"\",\n            \"capture_request\" to\n                CargoDependency.smithyHttpClientTestUtil(rc).toType()\n                    .resolve(\"test_util::capture_request\"),\n            \"config\" to ClientRustModule.config,\n            \"customParams\" to customParams,\n        )\n        renderClientCreation(this, ClientCreationParams(codegenContext, \"http_client\", \"config_builder\", \"client\"))\n\n        writeInline(\"let result = \")\n        instantiator.renderFluentCall(this, \"client\", operationShape, inputShape, httpRequestTestCase.params)\n        rust(\"\"\".send().await;\"\"\")\n        // Response parsing will always fail since we feed it an empty response body, so we don't care\n        // if it fails, but it is helpful to print what that failure was for debugging\n        rust(\"let _ = dbg!(result);\")\n        rust(\"\"\"let http_request = request_receiver.expect_request();\"\"\")\n\n        checkQueryParams(this, httpRequestTestCase.queryParams)\n        checkForbidQueryParams(this, httpRequestTestCase.forbidQueryParams)\n        checkRequiredQueryParams(this, httpRequestTestCase.requireQueryParams)\n        checkHeaders(this, \"http_request.headers()\", httpRequestTestCase.headers)\n        checkForbidHeaders(this, \"http_request.headers()\", httpRequestTestCase.forbidHeaders)\n        checkRequiredHeaders(this, \"http_request.headers()\", httpRequestTestCase.requireHeaders)\n\n        if (protocolSupport.requestBodySerialization) {\n            // \"If no request body is defined, then no assertions are made about the body of the message.\"\n            httpRequestTestCase.body.orNull()?.also { body ->\n                checkBody(this, body, httpRequestTestCase.bodyMediaType.orNull())\n            }\n        }\n\n        // Explicitly warn if the test case defined parameters that we aren't doing anything with\n        with(httpRequestTestCase) {\n            if (authScheme.isPresent) {\n                logger.warning(\"Test case provided authScheme but this was ignored\")\n            }\n            if (!httpRequestTestCase.vendorParams.isEmpty) {\n                logger.warning(\"Test case provided vendorParams but these were ignored\")\n            }\n\n            rustTemplate(\n                \"\"\"\n                let uri: #{Uri} = http_request.uri().parse().expect(\"invalid URI sent\");\n                #{AssertEq}(http_request.method(), ${method.dq()}, \"method was incorrect\");\n                #{AssertEq}(uri.path(), ${uri.dq()}, \"path was incorrect\");\n                \"\"\",\n                *codegenScope,\n            )\n\n            resolvedHost.orNull()?.also { host ->\n                rustTemplate(\n                    \"\"\"#{AssertEq}(uri.host().expect(\"host should be set\"), ${host.dq()});\"\"\",\n                    *codegenScope,\n                )\n            }\n        }\n    }\n\n    private fun RustWriter.renderHttpResponseTestCase(\n        testCase: HttpResponseTestCase,\n        expectedShape: StructureShape,\n    ) {\n        logger.info(\"Generating response test: ${testCase.id}\")\n\n        if (!protocolSupport.responseDeserialization || (\n                !protocolSupport.errorDeserialization &&\n                    expectedShape.hasTrait(\n                        ErrorTrait::class.java,\n                    )\n            )\n        ) {\n            rust(\"/* test case disabled for this protocol (not yet supported) */\")\n            return\n        }\n        writeInline(\"let expected_output =\")\n        instantiator.render(this, expectedShape, testCase.params)\n        write(\";\")\n        rustTemplate(\n            \"let mut http_response = #{Response}::try_from(#{HttpResponseBuilder}::new()\",\n            \"Response\" to RT.smithyRuntimeApi(rc).resolve(\"http::Response\"),\n            \"HttpResponseBuilder\" to RT.HttpResponseBuilder1x,\n        )\n        testCase.headers.forEach { (key, value) ->\n            writeWithNoFormatting(\".header(${key.dq()}, ${value.dq()})\")\n        }\n        rust(\n            \"\"\"\n            .status(${testCase.code})\n            .body(#T::from(${testCase.body.orNull()?.dq()?.replace(\"#\", \"##\") ?: \"vec![]\"}))\n            .unwrap()\n            ).unwrap();\n            \"\"\",\n            RT.sdkBody(runtimeConfig = rc),\n        )\n        val mediaType = testCase.bodyMediaType.orNull()\n        rustTemplate(\n            \"\"\"\n            use #{DeserializeResponse};\n            use #{RuntimePlugin};\n\n            let op = #{Operation}::new();\n            let config = op.config().expect(\"the operation has config\");\n            let de = config.load::<#{SharedResponseDeserializer}>().expect(\"the config must have a deserializer\");\n\n            let parsed = de.deserialize_streaming(&mut http_response);\n            let parsed = parsed.unwrap_or_else(|| {\n                let http_response = http_response.map(|body| {\n                    #{SdkBody}::from(#{copy_from_slice}(&#{decode_body_data}(body.bytes().unwrap(), #{MediaType}::from(${(mediaType ?: \"unknown\").dq()}))))\n                });\n                de.deserialize_nonstreaming(&http_response)\n            });\n            \"\"\",\n            \"copy_from_slice\" to RT.Bytes.resolve(\"copy_from_slice\"),\n            \"decode_body_data\" to RT.protocolTest(rc, \"decode_body_data\"),\n            \"DeserializeResponse\" to RT.smithyRuntimeApiClient(rc).resolve(\"client::ser_de::DeserializeResponse\"),\n            \"MediaType\" to RT.protocolTest(rc, \"MediaType\"),\n            \"Operation\" to codegenContext.symbolProvider.toSymbol(operationShape),\n            \"RuntimePlugin\" to RT.runtimePlugin(rc),\n            \"SdkBody\" to RT.sdkBody(rc),\n            \"SharedResponseDeserializer\" to\n                RT.smithyRuntimeApiClient(rc)\n                    .resolve(\"client::ser_de::SharedResponseDeserializer\"),\n        )\n        if (expectedShape.hasTrait<ErrorTrait>()) {\n            val errorSymbol = codegenContext.symbolProvider.symbolForOperationError(operationShape)\n            val errorVariant = codegenContext.symbolProvider.toSymbol(expectedShape).name\n            rust(\"\"\"let parsed = parsed.expect_err(\"should be error response\");\"\"\")\n            rustTemplate(\n                \"\"\"let parsed: &#{Error} = parsed.as_operation_error().expect(\"operation error\").downcast_ref().unwrap();\"\"\",\n                \"Error\" to codegenContext.symbolProvider.symbolForOperationError(operationShape),\n            )\n            rustBlock(\"if let #T::$errorVariant(parsed) = parsed\", errorSymbol) {\n                compareMembers(expectedShape)\n            }\n            rustBlock(\"else\") {\n                rust(\"panic!(\\\"wrong variant: Got: {:?}. Expected: {:?}\\\", parsed, expected_output);\")\n            }\n        } else {\n            rustTemplate(\n                \"\"\"let parsed = parsed.expect(\"should be successful response\").downcast::<#{Output}>().unwrap();\"\"\",\n                \"Output\" to codegenContext.symbolProvider.toSymbol(expectedShape),\n            )\n            compareMembers(outputShape)\n        }\n    }\n\n    private fun RustWriter.compareMembers(shape: StructureShape) {\n        shape.members().forEach { member ->\n            val memberName = codegenContext.symbolProvider.toMemberName(member)\n            if (member.isStreaming(codegenContext.model)) {\n                rustTemplate(\n                    \"\"\"\n                    #{AssertEq}(\n                        parsed.$memberName.collect().await.unwrap().into_bytes(),\n                        expected_output.$memberName.collect().await.unwrap().into_bytes()\n                    );\n                    \"\"\",\n                    *codegenScope,\n                )\n            } else {\n                when (codegenContext.model.expectShape(member.target)) {\n                    is DoubleShape, is FloatShape -> {\n                        addUseImports(RT.protocolTest(rc, \"FloatEquals\").toSymbol())\n                        rust(\n                            \"\"\"\n                            assert!(parsed.$memberName.float_equals(&expected_output.$memberName),\n                                \"Unexpected value for `$memberName` {:?} vs. {:?}\", expected_output.$memberName, parsed.$memberName);\n                            \"\"\",\n                        )\n                    }\n\n                    else ->\n                        rustTemplate(\n                            \"\"\"#{AssertEq}(parsed.$memberName, expected_output.$memberName, \"Unexpected value for `$memberName`\");\"\"\",\n                            *codegenScope,\n                        )\n                }\n            }\n        }\n    }\n\n    private fun checkBody(\n        rustWriter: RustWriter,\n        body: String,\n        mediaType: String?,\n    ) {\n        rustWriter.write(\"\"\"let body = http_request.body().bytes().expect(\"body should be strict\");\"\"\")\n        if (body == \"\") {\n            rustWriter.rustTemplate(\n                \"\"\"\n                // No body.\n                #{AssertEq}(&body, &#{Bytes}::new());\n                \"\"\",\n                *codegenScope,\n            )\n        } else {\n            // When we generate a body instead of a stub, drop the trailing `;` and enable the assertion\n            assertOk(rustWriter) {\n                rustWriter.write(\n                    \"#T(body, ${\n                        rustWriter.escape(body).dq()\n                    }, #T::from(${(mediaType ?: \"unknown\").dq()}))\",\n                    RT.protocolTest(rc, \"validate_body\"),\n                    RT.protocolTest(rc, \"MediaType\"),\n                )\n            }\n        }\n    }\n\n    private fun checkRequiredQueryParams(\n        rustWriter: RustWriter,\n        requiredParams: List<String>,\n    ) = basicCheck(\n        requiredParams,\n        rustWriter,\n        \"required_params\",\n        \"&http_request\",\n        \"require_query_params\",\n    )\n\n    private fun checkForbidQueryParams(\n        rustWriter: RustWriter,\n        forbidParams: List<String>,\n    ) = basicCheck(\n        forbidParams,\n        rustWriter,\n        \"forbid_params\",\n        \"&http_request\",\n        \"forbid_query_params\",\n    )\n\n    private fun checkQueryParams(\n        rustWriter: RustWriter,\n        queryParams: List<String>,\n    ) = basicCheck(\n        queryParams,\n        rustWriter,\n        \"expected_query_params\",\n        \"&http_request\",\n        \"validate_query_string\",\n    )\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolParserGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.generators.protocol\n\nimport software.amazon.smithy.codegen.core.Symbol\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.traits.ErrorTrait\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.OperationSection\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.http.ResponseBindingGenerator\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.assignment\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlockTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.withBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.writeCustomizations\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.setterName\nimport software.amazon.smithy.rust.codegen.core.smithy.isOptional\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.HttpBindingDescriptor\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.HttpLocation\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.Protocol\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.ProtocolFunctions\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.parse.StructuredDataParserGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.transformers.operationErrors\nimport software.amazon.smithy.rust.codegen.core.util.UNREACHABLE\nimport software.amazon.smithy.rust.codegen.core.util.dq\nimport software.amazon.smithy.rust.codegen.core.util.errorMessageMember\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\nimport software.amazon.smithy.rust.codegen.core.util.isStreaming\nimport software.amazon.smithy.rust.codegen.core.util.outputShape\n\nclass ProtocolParserGenerator(\n    private val codegenContext: ClientCodegenContext,\n    private val protocol: Protocol,\n) {\n    private val model = codegenContext.model\n    private val httpBindingResolver = protocol.httpBindingResolver\n    private val protocolFunctions = ProtocolFunctions(codegenContext)\n    private val symbolProvider: RustSymbolProvider = codegenContext.symbolProvider\n\n    private val codegenScope =\n        arrayOf(\n            \"Bytes\" to RuntimeType.Bytes,\n            \"Headers\" to RuntimeType.headers(codegenContext.runtimeConfig),\n            \"Response\" to RuntimeType.smithyRuntimeApi(codegenContext.runtimeConfig).resolve(\"http::Response\"),\n            \"http\" to RuntimeType.Http1x,\n            \"SdkBody\" to RuntimeType.sdkBody(codegenContext.runtimeConfig),\n        )\n\n    fun parseResponseFn(\n        operationShape: OperationShape,\n        customizations: List<OperationCustomization>,\n    ): RuntimeType {\n        val outputShape = operationShape.outputShape(model)\n        val outputSymbol = symbolProvider.toSymbol(outputShape)\n        val errorSymbol = symbolProvider.symbolForOperationError(operationShape)\n        return protocolFunctions.deserializeFn(operationShape, fnNameSuffix = \"http_response\") { fnName ->\n            Attribute.AllowClippyUnnecessaryWraps.render(this)\n            rustBlockTemplate(\n                \"pub fn $fnName(_response_status: u16, _response_headers: &#{Headers}, _response_body: &[u8]) -> std::result::Result<#{O}, #{E}>\",\n                *codegenScope,\n                \"O\" to outputSymbol,\n                \"E\" to errorSymbol,\n            ) {\n                withBlock(\"Ok({\", \"})\") {\n                    renderShapeParser(\n                        operationShape,\n                        outputShape,\n                        httpBindingResolver.responseBindings(operationShape),\n                        errorSymbol,\n                        customizations,\n                    )\n                }\n            }\n        }\n    }\n\n    fun parseErrorFn(\n        operationShape: OperationShape,\n        customizations: List<OperationCustomization>,\n    ): RuntimeType {\n        val outputShape = operationShape.outputShape(model)\n        val outputSymbol = symbolProvider.toSymbol(outputShape)\n        val errorSymbol = symbolProvider.symbolForOperationError(operationShape)\n        return protocolFunctions.deserializeFn(operationShape, fnNameSuffix = \"http_error\") { fnName ->\n            Attribute.AllowClippyUnnecessaryWraps.render(this)\n            rustBlockTemplate(\n                \"pub fn $fnName(_response_status: u16, _response_headers: &#{Headers}, _response_body: &[u8]) -> std::result::Result<#{O}, #{E}>\",\n                *codegenScope,\n                \"O\" to outputSymbol,\n                \"E\" to errorSymbol,\n            ) {\n                Attribute.AllowUnusedMut.render(this)\n                rust(\n                    \"let mut generic_builder = #T(_response_status, _response_headers, _response_body).map_err(#T::unhandled)?;\",\n                    protocol.parseHttpErrorMetadata(operationShape),\n                    errorSymbol,\n                )\n                writeCustomizations(\n                    customizations,\n                    OperationSection.PopulateErrorMetadataExtras(\n                        customizations,\n                        \"generic_builder\",\n                        \"_response_status\",\n                        \"_response_headers\",\n                    ),\n                )\n                rust(\"let generic = generic_builder.build();\")\n                if (operationShape.operationErrors(model).isNotEmpty()) {\n                    rustTemplate(\n                        \"\"\"\n                        let error_code = match generic.code() {\n                            Some(code) => code,\n                            None => return Err(#{error_symbol}::unhandled(generic))\n                        };\n\n                        let _error_message = generic.message().map(|msg|msg.to_owned());\n                        \"\"\",\n                        \"error_symbol\" to errorSymbol,\n                    )\n                    withBlock(\"Err(match error_code {\", \"})\") {\n                        val errors = operationShape.operationErrors(model)\n                        errors.forEach { error ->\n                            val errorShape = model.expectShape(error.id, StructureShape::class.java)\n                            val variantName = symbolProvider.toSymbol(model.expectShape(error.id)).name\n                            val errorCode = httpBindingResolver.errorCode(errorShape).dq()\n                            withBlock(\n                                \"$errorCode => #1T::$variantName({\",\n                                \"}),\",\n                                errorSymbol,\n                            ) {\n                                Attribute.AllowUnusedMut.render(this)\n                                assignment(\"mut tmp\") {\n                                    rustBlock(\"\") {\n                                        renderShapeParser(\n                                            operationShape,\n                                            errorShape,\n                                            httpBindingResolver.errorResponseBindings(errorShape),\n                                            errorSymbol,\n                                            listOf(\n                                                object : OperationCustomization() {\n                                                    override fun section(section: OperationSection): Writable =\n                                                        {\n                                                            if (section is OperationSection.MutateOutput) {\n                                                                rust(\"let output = output.meta(generic);\")\n                                                            }\n                                                        }\n                                                },\n                                            ),\n                                        )\n                                    }\n                                }\n                                val errorMessageMember = errorShape.errorMessageMember()\n                                // If the message member is optional and wasn't set, we set a generic error message.\n                                if (errorMessageMember != null) {\n                                    val symbol = symbolProvider.toSymbol(errorMessageMember)\n                                    if (symbol.isOptional()) {\n                                        rust(\n                                            \"\"\"\n                                            if tmp.message.is_none() {\n                                                tmp.message = _error_message;\n                                            }\n                                            \"\"\",\n                                        )\n                                    }\n                                }\n                                rust(\"tmp\")\n                            }\n                        }\n                        rust(\"_ => #T::generic(generic)\", errorSymbol)\n                    }\n                } else {\n                    rust(\"Err(#T::generic(generic))\", errorSymbol)\n                }\n            }\n        }\n    }\n\n    fun parseStreamingResponseFn(\n        operationShape: OperationShape,\n        customizations: List<OperationCustomization>,\n    ): RuntimeType {\n        val outputShape = operationShape.outputShape(model)\n        val outputSymbol = symbolProvider.toSymbol(outputShape)\n        val errorSymbol = symbolProvider.symbolForOperationError(operationShape)\n        return protocolFunctions.deserializeFn(operationShape, fnNameSuffix = \"http_response\") { fnName ->\n            Attribute.AllowClippyUnnecessaryWraps.render(this)\n            rustBlockTemplate(\n                \"pub fn $fnName(response: &mut #{Response}) -> std::result::Result<#{O}, #{E}>\",\n                *codegenScope,\n                \"O\" to outputSymbol,\n                \"E\" to errorSymbol,\n            ) {\n                rustTemplate(\n                    \"\"\"\n                    let mut _response_body = #{SdkBody}::taken();\n                    std::mem::swap(&mut _response_body, response.body_mut());\n                    let _response_body = &mut _response_body;\n\n                    let _response_status = response.status().as_u16();\n                    let _response_headers = response.headers();\n                    \"\"\",\n                    *codegenScope,\n                )\n                withBlock(\"Ok({\", \"})\") {\n                    renderShapeParser(\n                        operationShape,\n                        outputShape,\n                        httpBindingResolver.responseBindings(operationShape),\n                        errorSymbol,\n                        customizations,\n                    )\n                }\n            }\n        }\n    }\n\n    private fun RustWriter.renderShapeParser(\n        operationShape: OperationShape,\n        outputShape: StructureShape,\n        bindings: List<HttpBindingDescriptor>,\n        errorSymbol: Symbol,\n        customizations: List<OperationCustomization>,\n    ) {\n        val httpBindingGenerator = ResponseBindingGenerator(protocol, codegenContext, operationShape)\n        val structuredDataParser = protocol.structuredDataParser()\n        Attribute.AllowUnusedMut.render(this)\n        rust(\"let mut output = #T::default();\", symbolProvider.symbolForBuilder(outputShape))\n        if (outputShape.id == operationShape.output.get()) {\n            structuredDataParser.operationParser(operationShape)?.also { parser ->\n                // Don't deserialize non-event stream members for an event stream operation with RPC bound protocols,\n                // as they need to be deserialized from payload in the first frame of event stream.\n                // See https://smithy.io/2.0/spec/streaming.html#initial-response\n                if (codegenContext.protocolImpl?.httpBindingResolver?.handlesEventStreamInitialResponse(operationShape) != true) {\n                    rust(\n                        \"output = #T(_response_body, output).map_err(#T::unhandled)?;\",\n                        parser,\n                        errorSymbol,\n                    )\n                }\n            }\n        } else {\n            check(outputShape.hasTrait<ErrorTrait>()) { \"should only be called on outputs or errors $outputShape\" }\n            structuredDataParser.errorParser(outputShape)?.also { parser ->\n                rust(\n                    \"output = #T(_response_body, output).map_err(#T::unhandled)?;\",\n                    parser, errorSymbol,\n                )\n            }\n        }\n        for (binding in bindings) {\n            val member = binding.member\n            val parsedValue = renderBindingParser(binding, operationShape, httpBindingGenerator, structuredDataParser)\n            if (parsedValue != null) {\n                withBlock(\"output = output.${member.setterName()}(\", \");\") {\n                    parsedValue(this)\n                }\n            }\n        }\n\n        val mapErr =\n            writable {\n                rust(\"#T::unhandled\", errorSymbol)\n            }\n\n        writeCustomizations(\n            customizations,\n            OperationSection.MutateOutput(customizations, operationShape, \"_response_headers\"),\n        )\n        codegenContext.builderInstantiator().finalizeBuilder(\"output\", outputShape, mapErr)(this)\n    }\n\n    /**\n     * Generate a parser & a parsed value converter for each output member of `operationShape`\n     *\n     * Returns a map with key = memberName, value = parsedValue\n     */\n    private fun renderBindingParser(\n        binding: HttpBindingDescriptor,\n        operationShape: OperationShape,\n        httpBindingGenerator: ResponseBindingGenerator,\n        structuredDataParser: StructuredDataParserGenerator,\n    ): Writable? {\n        val errorSymbol = symbolProvider.symbolForOperationError(operationShape)\n        val member = binding.member\n        return when (binding.location) {\n            HttpLocation.HEADER ->\n                writable {\n                    val fnName = httpBindingGenerator.generateDeserializeHeaderFn(binding)\n                    rust(\n                        \"\"\"\n                        #T(_response_headers)\n                            .map_err(|_|#T::unhandled(\"Failed to parse ${member.memberName} from header `${binding.locationName}\"))?\n                        \"\"\",\n                        fnName, errorSymbol,\n                    )\n                }\n\n            HttpLocation.DOCUMENT -> {\n                // document is handled separately\n                null\n            }\n\n            HttpLocation.PAYLOAD -> {\n                val payloadParser: RustWriter.(String) -> Unit = { body ->\n                    rust(\"#T($body).map_err(#T::unhandled)\", structuredDataParser.payloadParser(member), errorSymbol)\n                }\n                val deserializer =\n                    httpBindingGenerator.generateDeserializePayloadFn(\n                        binding,\n                        errorSymbol,\n                        payloadParser = payloadParser,\n                    )\n                return if (binding.member.isStreaming(model)) {\n                    writable { rust(\"Some(#T(_response_body)?)\", deserializer) }\n                } else {\n                    writable { rust(\"#T(_response_body)?\", deserializer) }\n                }\n            }\n\n            HttpLocation.RESPONSE_CODE ->\n                writable {\n                    rust(\"Some(_response_status as _)\")\n                }\n\n            HttpLocation.PREFIX_HEADERS -> {\n                val sym = httpBindingGenerator.generateDeserializePrefixHeaderFn(binding)\n                writable {\n                    rustTemplate(\n                        \"\"\"\n                        #{deser}(_response_headers)\n                             .map_err(|_|\n                                #{err}::unhandled(\"Failed to parse ${member.memberName} from prefix header `${binding.locationName}\")\n                             )?\n                        \"\"\",\n                        \"deser\" to sym, \"err\" to errorSymbol,\n                    )\n                }\n            }\n\n            else -> {\n                UNREACHABLE(\"Unexpected binding location: ${binding.location}\")\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/RequestSerializerGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.generators.protocol\n\nimport software.amazon.smithy.model.shapes.BlobShape\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.http.RequestBindingGenerator\nimport software.amazon.smithy.rust.codegen.core.rustlang.InlineDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.protocol.ProtocolPayloadGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.Protocol\nimport software.amazon.smithy.rust.codegen.core.util.dq\nimport software.amazon.smithy.rust.codegen.core.util.findStreamingMember\nimport software.amazon.smithy.rust.codegen.core.util.inputShape\n\nclass RequestSerializerGenerator(\n    private val codegenContext: ClientCodegenContext,\n    private val protocol: Protocol,\n    private val bodyGenerator: ProtocolPayloadGenerator?,\n    private val nameOverride: String? = null,\n) {\n    private val httpBindingResolver = protocol.httpBindingResolver\n    private val symbolProvider = codegenContext.symbolProvider\n    private val codegenScope by lazy {\n        val runtimeApi = RuntimeType.smithyRuntimeApiClient(codegenContext.runtimeConfig)\n        val interceptorContext = runtimeApi.resolve(\"client::interceptors::context\")\n        arrayOf(\n            *preludeScope,\n            \"BoxError\" to RuntimeType.boxError(codegenContext.runtimeConfig),\n            \"config\" to ClientRustModule.config,\n            \"ConfigBag\" to RuntimeType.configBag(codegenContext.runtimeConfig),\n            \"header_util\" to RuntimeType.smithyHttp(codegenContext.runtimeConfig).resolve(\"header\"),\n            \"http\" to RuntimeType.Http1x,\n            \"HttpRequest\" to runtimeApi.resolve(\"client::orchestrator::HttpRequest\"),\n            \"HttpRequestBuilder\" to RuntimeType.HttpRequestBuilder1x,\n            \"Input\" to interceptorContext.resolve(\"Input\"),\n            \"SerializeRequest\" to runtimeApi.resolve(\"client::ser_de::SerializeRequest\"),\n            \"SdkBody\" to RuntimeType.sdkBody(codegenContext.runtimeConfig),\n            \"HeaderSerializationSettings\" to\n                RuntimeType.forInlineDependency(\n                    InlineDependency.serializationSettings(\n                        codegenContext.runtimeConfig,\n                    ),\n                ).resolve(\"HeaderSerializationSettings\"),\n        )\n    }\n\n    fun render(\n        writer: RustWriter,\n        operationShape: OperationShape,\n    ) {\n        val inputShape = operationShape.inputShape(codegenContext.model)\n        val operationName = symbolProvider.toSymbol(operationShape).name\n        val inputSymbol = symbolProvider.toSymbol(inputShape)\n        val serializerName = nameOverride ?: \"${operationName}RequestSerializer\"\n        writer.rustTemplate(\n            \"\"\"\n            ##[derive(Debug)]\n            struct $serializerName;\n            impl #{SerializeRequest} for $serializerName {\n                ##[allow(unused_mut, clippy::let_and_return, clippy::needless_borrow, clippy::useless_conversion)]\n                fn serialize_input(&self, input: #{Input}, _cfg: &mut #{ConfigBag}) -> #{Result}<#{HttpRequest}, #{BoxError}> {\n                    let input = input.downcast::<#{ConcreteInput}>().expect(\"correct type\");\n                    let _header_serialization_settings = _cfg.load::<#{HeaderSerializationSettings}>().cloned().unwrap_or_default();\n                    let mut request_builder = {\n                        #{create_http_request}\n                    };\n                    let body = #{generate_body};\n                    #{add_content_length}\n                    #{Ok}(request_builder.body(body).expect(\"valid request\").try_into().unwrap())\n                }\n            }\n            \"\"\",\n            *codegenScope,\n            \"ConcreteInput\" to inputSymbol,\n            \"create_http_request\" to createHttpRequest(operationShape),\n            \"generate_body\" to\n                writable {\n                    if (bodyGenerator != null) {\n                        val body =\n                            writable {\n                                bodyGenerator.generatePayload(this, \"input\", operationShape)\n                            }\n                        val streamingMember = inputShape.findStreamingMember(codegenContext.model)\n                        val isBlobStreaming =\n                            streamingMember != null && codegenContext.model.expectShape(streamingMember.target) is BlobShape\n                        if (isBlobStreaming) {\n                            // Consume the `ByteStream` into its inner `SdkBody`.\n                            rust(\"#T.into_inner()\", body)\n                        } else {\n                            rustTemplate(\"#{SdkBody}::from(#{body})\", *codegenScope, \"body\" to body)\n                        }\n                    } else {\n                        rustTemplate(\"#{SdkBody}::empty()\", *codegenScope)\n                    }\n                },\n            \"add_content_length\" to\n                if (needsContentLength(operationShape)) {\n                    writable {\n                        rustTemplate(\n                            \"\"\"\n                            if let Some(content_length) = body.content_length() {\n                                let content_length = content_length.to_string();\n                                request_builder = _header_serialization_settings.set_default_header(request_builder, #{http}::header::CONTENT_LENGTH, &content_length);\n                            }\n                            \"\"\",\n                            *codegenScope,\n                        )\n                    }\n                } else {\n                    writable { }\n                },\n        )\n    }\n\n    private fun needsContentLength(operationShape: OperationShape): Boolean =\n        protocol.needsRequestContentLength(operationShape)\n\n    private fun createHttpRequest(operationShape: OperationShape): Writable =\n        writable {\n            val httpBindingGenerator =\n                RequestBindingGenerator(\n                    codegenContext,\n                    protocol,\n                    operationShape,\n                )\n            httpBindingGenerator.renderUpdateHttpBuilder(this)\n            val contentType = httpBindingResolver.requestContentType(operationShape)\n\n            rustTemplate(\"let mut builder = update_http_builder(&input, #{HttpRequestBuilder}::new())?;\", *codegenScope)\n            if (contentType != null) {\n                rustTemplate(\n                    \"builder = _header_serialization_settings.set_default_header(builder, #{http}::header::CONTENT_TYPE, ${contentType.dq()});\",\n                    *codegenScope,\n                )\n            }\n            for (header in protocol.additionalRequestHeaders(operationShape)) {\n                rustTemplate(\n                    \"\"\"\n                    builder = _header_serialization_settings.set_default_header(\n                        builder,\n                        #{http}::header::HeaderName::from_static(${header.first.dq()}),\n                        ${header.second.dq()}\n                    );\n                    \"\"\",\n                    *codegenScope,\n                )\n            }\n            rust(\"builder\")\n        }\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ResponseDeserializerGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.generators.protocol\n\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.OperationSection\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.writeCustomizations\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.Protocol\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.ProtocolFunctions\nimport software.amazon.smithy.rust.codegen.core.util.hasStreamingMember\nimport software.amazon.smithy.rust.codegen.core.util.outputShape\n\nclass ResponseDeserializerGenerator(\n    codegenContext: ClientCodegenContext,\n    protocol: Protocol,\n) {\n    private val symbolProvider = codegenContext.symbolProvider\n    private val model = codegenContext.model\n    private val runtimeConfig = codegenContext.runtimeConfig\n    private val httpBindingResolver = protocol.httpBindingResolver\n    private val parserGenerator = ProtocolParserGenerator(codegenContext, protocol)\n\n    private val codegenScope by lazy {\n        val interceptorContext =\n            CargoDependency.smithyRuntimeApiClient(runtimeConfig).toType().resolve(\"client::interceptors::context\")\n        val orchestrator =\n            CargoDependency.smithyRuntimeApiClient(runtimeConfig).toType().resolve(\"client::orchestrator\")\n        arrayOf(\n            *preludeScope,\n            \"Error\" to interceptorContext.resolve(\"Error\"),\n            \"HttpResponse\" to orchestrator.resolve(\"HttpResponse\"),\n            \"Instrument\" to CargoDependency.Tracing.toType().resolve(\"Instrument\"),\n            \"Output\" to interceptorContext.resolve(\"Output\"),\n            \"OutputOrError\" to interceptorContext.resolve(\"OutputOrError\"),\n            \"OrchestratorError\" to orchestrator.resolve(\"OrchestratorError\"),\n            \"DeserializeResponse\" to RuntimeType.smithyRuntimeApiClient(runtimeConfig).resolve(\"client::ser_de::DeserializeResponse\"),\n            \"SdkBody\" to RuntimeType.sdkBody(runtimeConfig),\n            \"SdkError\" to RuntimeType.sdkError(runtimeConfig),\n            \"debug_span\" to RuntimeType.Tracing.resolve(\"debug_span\"),\n            \"type_erase_result\" to typeEraseResult(),\n        )\n    }\n\n    fun render(\n        writer: RustWriter,\n        operationShape: OperationShape,\n        customizations: List<OperationCustomization>,\n    ) {\n        val outputSymbol = symbolProvider.toSymbol(operationShape.outputShape(model))\n        val operationName = symbolProvider.toSymbol(operationShape).name\n        val streaming = operationShape.outputShape(model).hasStreamingMember(model)\n\n        writer.rustTemplate(\n            \"\"\"\n            ##[derive(Debug)]\n            struct ${operationName}ResponseDeserializer;\n            impl #{DeserializeResponse} for ${operationName}ResponseDeserializer {\n                #{deserialize_streaming}\n\n                fn deserialize_nonstreaming(&self, response: &#{HttpResponse}) -> #{OutputOrError} {\n                    #{deserialize_nonstreaming}\n                }\n            }\n            \"\"\",\n            *codegenScope,\n            \"O\" to outputSymbol,\n            \"E\" to symbolProvider.symbolForOperationError(operationShape),\n            \"deserialize_streaming\" to\n                writable {\n                    if (streaming) {\n                        deserializeStreaming(operationShape, customizations)\n                    }\n                },\n            \"deserialize_nonstreaming\" to\n                writable {\n                    when (streaming) {\n                        true -> deserializeStreamingError(operationShape, customizations)\n                        else -> deserializeNonStreaming(operationShape, customizations)\n                    }\n                },\n        )\n    }\n\n    private fun RustWriter.deserializeStreaming(\n        operationShape: OperationShape,\n        customizations: List<OperationCustomization>,\n    ) {\n        val successCode = httpBindingResolver.httpTrait(operationShape).code\n        rustTemplate(\n            \"\"\"\n            fn deserialize_streaming(&self, response: &mut #{HttpResponse}) -> #{Option}<#{OutputOrError}> {\n                ##[allow(unused_mut)]\n                let mut force_error = false;\n                #{BeforeParseResponse}\n\n                // If this is an error, defer to the non-streaming parser\n                if (!response.status().is_success() && response.status().as_u16() != $successCode) || force_error {\n                    return #{None};\n                }\n                #{Some}(#{type_erase_result}(#{parse_streaming_response}(response)))\n            }\n            \"\"\",\n            *codegenScope,\n            \"parse_streaming_response\" to parserGenerator.parseStreamingResponseFn(operationShape, customizations),\n            \"BeforeParseResponse\" to\n                writable {\n                    writeCustomizations(customizations, OperationSection.BeforeParseResponse(customizations, \"response\", \"force_error\", body = null))\n                },\n        )\n    }\n\n    private fun RustWriter.deserializeStreamingError(\n        operationShape: OperationShape,\n        customizations: List<OperationCustomization>,\n    ) {\n        rustTemplate(\n            \"\"\"\n            // For streaming operations, we only hit this case if its an error\n            let body = response.body().bytes().expect(\"body loaded\");\n            #{type_erase_result}(#{parse_error}(response.status().as_u16(), response.headers(), body))\n            \"\"\",\n            *codegenScope,\n            \"parse_error\" to parserGenerator.parseErrorFn(operationShape, customizations),\n        )\n    }\n\n    private fun RustWriter.deserializeNonStreaming(\n        operationShape: OperationShape,\n        customizations: List<OperationCustomization>,\n    ) {\n        val successCode = httpBindingResolver.httpTrait(operationShape).code\n        rustTemplate(\n            \"\"\"\n            let (success, status) = (response.status().is_success(), response.status().as_u16());\n            let headers = response.headers();\n            let body = response.body().bytes().expect(\"body loaded\");\n            ##[allow(unused_mut)]\n            let mut force_error = false;\n            #{BeforeParseResponse}\n            let parse_result = if !success && status != $successCode || force_error {\n                #{parse_error}(status, headers, body)\n            } else {\n                #{parse_response}(status, headers, body)\n            };\n            #{type_erase_result}(parse_result)\n            \"\"\",\n            *codegenScope,\n            \"parse_error\" to parserGenerator.parseErrorFn(operationShape, customizations),\n            \"parse_response\" to parserGenerator.parseResponseFn(operationShape, customizations),\n            \"BeforeParseResponse\" to\n                writable {\n                    writeCustomizations(customizations, OperationSection.BeforeParseResponse(customizations, \"response\", \"force_error\", \"body\"))\n                },\n        )\n    }\n\n    private fun typeEraseResult(): RuntimeType =\n        ProtocolFunctions.crossOperationFn(\"type_erase_result\") { fnName ->\n            rustTemplate(\n                \"\"\"\n                pub(crate) fn $fnName<O, E>(result: #{Result}<O, E>) -> #{Result}<#{Output}, #{OrchestratorError}<#{Error}>>\n                where\n                    O: ::std::fmt::Debug + #{Send} + #{Sync} + 'static,\n                    E: ::std::error::Error + std::fmt::Debug + #{Send} + #{Sync} + 'static,\n                {\n                    result.map(|output| #{Output}::erase(output))\n                        .map_err(|error| #{Error}::erase(error))\n                        .map_err(#{Into}::into)\n                }\n                \"\"\",\n                *codegenScope,\n            )\n        }\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/SerdeBenchmarkTestGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.generators.protocol\n\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.protocoltests.traits.AppliesTo\nimport software.amazon.smithy.protocoltests.traits.HttpRequestTestCase\nimport software.amazon.smithy.protocoltests.traits.HttpResponseTestCase\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.ClientInstantiator\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.docs\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.protocol.BrokenTest\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.protocol.FailingTest\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.protocol.ProtocolSupport\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.protocol.ProtocolTestGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.protocol.TestCase\nimport software.amazon.smithy.rust.codegen.core.util.dq\nimport software.amazon.smithy.rust.codegen.core.util.inputShape\nimport software.amazon.smithy.rust.codegen.core.util.orNull\nimport software.amazon.smithy.rust.codegen.core.util.toSnakeCase\nimport java.util.logging.Logger\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType as RT\n\n/**\n * Generates serde benchmark loops for protocol tests tagged with `serde-benchmark`.\n *\n * Instead of asserting correctness, each test case becomes a tight loop that\n * measures serialization or deserialization time and prints JSON stats.\n *\n * This generator is specific to protocol test models that use the `serde-benchmark` tag,\n * which is only used internally. It's better to keep the general-purpose [ProtocolTestGenerator]\n * intact rather than bifurcating it to support this special-purpose tag.\n */\nclass SerdeBenchmarkTestGenerator(\n    override val codegenContext: ClientCodegenContext,\n    override val protocolSupport: ProtocolSupport,\n    override val operationShape: OperationShape,\n) : ProtocolTestGenerator() {\n    override val appliesTo: AppliesTo = AppliesTo.CLIENT\n    override val logger: Logger = Logger.getLogger(javaClass.name)\n    override val expectFail: Set<FailingTest> = emptySet()\n    override val brokenTests: Set<BrokenTest> = emptySet()\n    override val generateOnly: Set<String> = emptySet()\n    override val disabledTests: Set<String> = emptySet()\n\n    private val rc = codegenContext.runtimeConfig\n    private val inputShape = operationShape.inputShape(codegenContext.model)\n    private val instantiator = ClientInstantiator(codegenContext, withinTest = true)\n\n    private val defaultBodyMediaType: String =\n        if (codegenContext.protocol.toString() == \"smithy.protocols#rpcv2Cbor\") \"application/cbor\" else \"unknown\"\n\n    override fun RustWriter.renderAllTestCases(allTests: List<TestCase>) {\n        for (testCase in allTests) {\n            renderBenchmarkTestCaseBlock(testCase, this) {\n                when (testCase) {\n                    is TestCase.RequestTest -> renderRequestBenchmark(testCase.testCase)\n                    is TestCase.ResponseTest -> renderResponseBenchmark(testCase.testCase)\n                    is TestCase.MalformedRequestTest -> {}\n                }\n            }\n        }\n    }\n\n    private fun renderBenchmarkTestCaseBlock(\n        testCase: TestCase,\n        writer: RustWriter,\n        block: Writable,\n    ) {\n        if (testCase.documentation != null) {\n            writer.docs(testCase.documentation!!, templating = false)\n        }\n        writer.docs(\"Benchmark: ${testCase.id}\")\n        Attribute.TokioTest.render(writer)\n        val fnNameSuffix =\n            when (testCase) {\n                is TestCase.ResponseTest -> \"_response\"\n                is TestCase.RequestTest -> \"_request\"\n                is TestCase.MalformedRequestTest -> \"_malformed_request\"\n            }\n        writer.rustBlock(\"async fn ${testCase.id.toSnakeCase()}$fnNameSuffix()\") {\n            block(this)\n        }\n    }\n\n    private fun RustWriter.renderRequestBenchmark(testCase: HttpRequestTestCase) {\n        writeInline(\"let input = \")\n        instantiator.render(this, inputShape, testCase.params)\n        rust(\";\")\n        rustTemplate(\n            \"\"\"\n            use #{RuntimePlugin};\n            use #{SerializeRequest};\n\n            let op = #{Operation}::new();\n            let config = op.config().expect(\"operation should have config\");\n            let serializer = config\n                .load::<#{SharedRequestSerializer}>()\n                .expect(\"operation should set a serializer\");\n\n            let mut timings = Vec::new();\n            for _ in 0..10000 {\n                // TODO(https://github.com/smithy-lang/smithy-rs/pull/4579##discussion_r2996838457)\n                // Consider hoisting `config_bag` creation outside the loop. For example:\n                //\n                // let config = op.config().expect(\"the operation has config\");\n                // let mut config_bag = ::aws_smithy_types::config_bag::ConfigBag::base();\n                // config_bag.push_shared_layer(config.clone()); // Didn't want this bit in the loop\n                // for _ in 0..10000 { ... }\n                let mut config_bag = #{ConfigBag}::base();\n                let input = #{Input}::erase(input.clone());\n                let start = std::time::Instant::now();\n                let _ = std::hint::black_box(serializer.serialize_input(input, &mut config_bag));\n                timings.push(start.elapsed().as_nanos() as u64);\n            }\n            \"\"\",\n            \"RuntimePlugin\" to RT.runtimePlugin(rc),\n            \"SerializeRequest\" to RT.smithyRuntimeApiClient(rc).resolve(\"client::ser_de::SerializeRequest\"),\n            \"Operation\" to codegenContext.symbolProvider.toSymbol(operationShape),\n            \"SharedRequestSerializer\" to RT.smithyRuntimeApiClient(rc).resolve(\"client::ser_de::SharedRequestSerializer\"),\n            \"ConfigBag\" to RT.configBag(rc),\n            \"Input\" to RT.smithyRuntimeApiClient(rc).resolve(\"client::interceptors::context::Input\"),\n        )\n        renderBenchmarkStats(testCase.id)\n    }\n\n    private fun RustWriter.renderResponseBenchmark(testCase: HttpResponseTestCase) {\n        val mediaType = testCase.bodyMediaType.orNull()\n        rustTemplate(\n            \"\"\"\n            use #{DeserializeResponse};\n            use #{RuntimePlugin};\n\n            let op = #{Operation}::new();\n            let config = op.config().expect(\"the operation has config\");\n            let de = config.load::<#{SharedResponseDeserializer}>().expect(\"the config must have a deserializer\");\n\n            let mut timings = Vec::new();\n            for _ in 0..10000 {\n                let mut http_response = #{Response}::try_from(#{HttpResponseBuilder}::new()\n            \"\"\",\n            \"DeserializeResponse\" to RT.smithyRuntimeApiClient(rc).resolve(\"client::ser_de::DeserializeResponse\"),\n            \"RuntimePlugin\" to RT.runtimePlugin(rc),\n            \"Operation\" to codegenContext.symbolProvider.toSymbol(operationShape),\n            \"SharedResponseDeserializer\" to\n                RT.smithyRuntimeApiClient(rc)\n                    .resolve(\"client::ser_de::SharedResponseDeserializer\"),\n            \"Response\" to RT.smithyRuntimeApi(rc).resolve(\"http::Response\"),\n            \"HttpResponseBuilder\" to RT.HttpResponseBuilder1x,\n        )\n        testCase.headers.forEach { (key, value) ->\n            writeWithNoFormatting(\".header(${key.dq()}, ${value.dq()})\")\n        }\n        rustTemplate(\n            \"\"\"\n            .status(${testCase.code})\n            .body(#{SdkBody}::from(${testCase.body.orNull()?.dq()?.replace(\"#\", \"##\") ?: \"vec![]\"}))\n            .unwrap()\n            ).unwrap();\n            let start = std::time::Instant::now();\n            let parsed = de.deserialize_streaming(&mut http_response);\n            let parsed = parsed.unwrap_or_else(|| {\n                let http_response = http_response.map(|body| {\n                    #{SdkBody}::from(#{copy_from_slice}(&#{decode_body_data}(body.bytes().unwrap(), #{MediaType}::from(${(mediaType ?: defaultBodyMediaType).dq()}))))\n                });\n                de.deserialize_nonstreaming(&http_response)\n            });\n            let _ = std::hint::black_box(parsed);\n            timings.push(start.elapsed().as_nanos() as u64);\n            }\n            \"\"\",\n            \"copy_from_slice\" to RT.Bytes.resolve(\"copy_from_slice\"),\n            \"decode_body_data\" to RT.protocolTest(rc, \"decode_body_data\"),\n            \"MediaType\" to RT.protocolTest(rc, \"MediaType\"),\n            \"SdkBody\" to RT.sdkBody(rc),\n        )\n        renderBenchmarkStats(testCase.id)\n    }\n\n    private fun RustWriter.renderBenchmarkStats(testId: String) {\n        rustTemplate(\n            \"\"\"\n            let mut sorted = timings.clone();\n            sorted.sort_unstable();\n            let n = timings.len();\n            let mean = timings.iter().sum::<u64>() / n as u64;\n            let variance = timings.iter().map(|&x| {\n                let diff = x as i64 - mean as i64;\n                (diff * diff) as u64\n            }).sum::<u64>() / n as u64;\n\n            let result = #{serde_json}::json!({\n                \"id\": \"$testId\",\n                \"n\": n,\n                \"mean\": mean,\n                \"p50\": sorted[n * 50 / 100],\n                \"p90\": sorted[n * 90 / 100],\n                \"p95\": sorted[n * 95 / 100],\n                \"p99\": sorted[n * 99 / 100],\n                \"std_dev\": (variance as f64).sqrt() as u64\n            });\n            println!(\"{}\", #{serde_json}::to_string_pretty(&result).unwrap());\n            \"\"\",\n            \"serde_json\" to CargoDependency.SerdeJson.toDevDependency().toType(),\n        )\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/waiters/RustJmespathShapeTraversalGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\npackage software.amazon.smithy.rust.codegen.client.smithy.generators.waiters\n\nimport software.amazon.smithy.jmespath.ExpressionSerializer\nimport software.amazon.smithy.jmespath.JmespathExpression\nimport software.amazon.smithy.jmespath.RuntimeType\nimport software.amazon.smithy.jmespath.ast.AndExpression\nimport software.amazon.smithy.jmespath.ast.BinaryExpression\nimport software.amazon.smithy.jmespath.ast.ComparatorExpression\nimport software.amazon.smithy.jmespath.ast.CurrentExpression\nimport software.amazon.smithy.jmespath.ast.ExpressionTypeExpression\nimport software.amazon.smithy.jmespath.ast.FieldExpression\nimport software.amazon.smithy.jmespath.ast.FilterProjectionExpression\nimport software.amazon.smithy.jmespath.ast.FlattenExpression\nimport software.amazon.smithy.jmespath.ast.FunctionExpression\nimport software.amazon.smithy.jmespath.ast.IndexExpression\nimport software.amazon.smithy.jmespath.ast.LiteralExpression\nimport software.amazon.smithy.jmespath.ast.MultiSelectHashExpression\nimport software.amazon.smithy.jmespath.ast.MultiSelectListExpression\nimport software.amazon.smithy.jmespath.ast.NotExpression\nimport software.amazon.smithy.jmespath.ast.ObjectProjectionExpression\nimport software.amazon.smithy.jmespath.ast.OrExpression\nimport software.amazon.smithy.jmespath.ast.ProjectionExpression\nimport software.amazon.smithy.jmespath.ast.SliceExpression\nimport software.amazon.smithy.jmespath.ast.Subexpression\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.BooleanShape\nimport software.amazon.smithy.model.shapes.CollectionShape\nimport software.amazon.smithy.model.shapes.EnumShape\nimport software.amazon.smithy.model.shapes.MapShape\nimport software.amazon.smithy.model.shapes.NumberShape\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.shapes.StringShape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.traits.EnumTrait\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustType\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.SafeNamer\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.asRef\nimport software.amazon.smithy.rust.codegen.core.rustlang.plus\nimport software.amazon.smithy.rust.codegen.core.rustlang.render\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlockTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.stripOuter\nimport software.amazon.smithy.rust.codegen.core.rustlang.withBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.withBlockTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\nimport software.amazon.smithy.rust.codegen.core.smithy.isOptional\nimport software.amazon.smithy.rust.codegen.core.smithy.rustType\nimport software.amazon.smithy.rust.codegen.core.util.dq\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\nimport software.amazon.smithy.rust.codegen.core.util.orNull\nimport java.text.NumberFormat\n\n/**\n * This needs to exist since there are computed values where there is no modeled\n * shape for the result of the evaluated expression. For example, the multi-select\n * list `['foo', 'baz']` is a list of string, but it isn't modeled anywhere,\n * so there is no Smithy shape to represent it. However, information is still\n * needed about the original shape in order to correctly generate code.\n */\nsealed class TraversedShape {\n    abstract val shape: Shape?\n\n    data class Array(override val shape: Shape?, val member: TraversedShape) : TraversedShape()\n\n    data class Object(override val shape: Shape?) : TraversedShape()\n\n    data class Bool(override val shape: Shape?) : TraversedShape()\n\n    data class Enum(override val shape: Shape?) : TraversedShape()\n\n    data class Number(override val shape: Shape?) : TraversedShape()\n\n    data class String(override val shape: Shape?) : TraversedShape()\n\n    companion object {\n        fun from(\n            model: Model,\n            shape: Shape,\n        ): TraversedShape =\n            when {\n                shape is MapShape || shape is StructureShape -> Object(shape)\n                shape is CollectionShape -> Array(shape, from(model, model.expectShape(shape.member.target)))\n                shape is BooleanShape -> Bool(shape)\n                shape is EnumShape || shape.hasTrait<EnumTrait>() -> Enum(shape)\n                shape is NumberShape -> Number(shape)\n                shape is StringShape -> String(shape)\n                else -> throw UnsupportedJmesPathException(\"Shape type ${shape.type} is not supported in JMESPath expressions in smithy-rs\")\n            }\n    }\n}\n\n/**\n * Contains information about the output of a visited [JmespathExpression].\n */\ndata class GeneratedExpression(\n    /** The name of the identifier that this expression's evaluation is placed into */\n    val identifier: String,\n    /** The TraversedShape for the output of the expression evaluation. */\n    val outputShape: TraversedShape,\n    /**\n     * The Rust type for the evaluated expression.\n     *\n     * For the most part, the code generator operates on output types rather than output shapes\n     * since there will always be an output type, whereas there will only sometimes be an output\n     * shape. Output shapes are only really used for handling enums and projections.\n     */\n    val outputType: RustType,\n    /** Writable to output this expression's generated code. */\n    val output: Writable,\n) {\n    internal fun isArray(): Boolean = outputShape is TraversedShape.Array\n\n    internal fun isBool(): Boolean = outputShape is TraversedShape.Bool\n\n    internal fun isEnum(): Boolean = outputShape is TraversedShape.Enum\n\n    internal fun isNumber(): Boolean = outputShape is TraversedShape.Number\n\n    internal fun isString(): Boolean = outputShape is TraversedShape.String\n\n    internal fun isStringOrEnum(): Boolean = isString() || isEnum()\n\n    internal fun isObject(): Boolean = outputShape is TraversedShape.Object\n\n    /** Dereferences this expression if it is a reference. */\n    internal fun dereference(namer: SafeNamer): GeneratedExpression =\n        if (outputType is RustType.Reference) {\n            namer.safeName(\"_tmp\").let { tmp ->\n                copy(\n                    identifier = tmp,\n                    outputType = outputType.member,\n                    output =\n                        output +\n                            writable {\n                                rust(\"let $tmp = *$identifier;\")\n                            },\n                )\n            }\n        } else {\n            this\n        }\n\n    /** Converts this expression into a &str. */\n    internal fun convertToStrRef(namer: SafeNamer): GeneratedExpression =\n        if (outputType.isDoubleReference()) {\n            dereference(namer).convertToStrRef(namer)\n        } else if (isEnum()) {\n            namer.safeName(\"_tmp\").let { tmp ->\n                GeneratedExpression(\n                    identifier = tmp,\n                    outputType = RustType.Reference(null, RustType.Opaque(\"str\")),\n                    outputShape = TraversedShape.String(null),\n                    output =\n                        output +\n                            writable {\n                                rust(\"let $tmp = $identifier.as_str();\")\n                            },\n                ).convertToStrRef(namer)\n            }\n        } else if (!outputType.isString()) {\n            namer.safeName(\"_tmp\").let { tmp ->\n                GeneratedExpression(\n                    identifier = tmp,\n                    outputType = RustType.String,\n                    outputShape = TraversedShape.String(null),\n                    output =\n                        output +\n                            writable {\n                                rust(\"let $tmp = $identifier.to_string();\")\n                            },\n                ).convertToStrRef(namer)\n            }\n        } else if (!outputType.isStr()) {\n            namer.safeName(\"_tmp\").let { tmp ->\n                GeneratedExpression(\n                    identifier = tmp,\n                    outputType = RustType.Reference(null, RustType.Opaque(\"str\")),\n                    outputShape = TraversedShape.String(null),\n                    output =\n                        output +\n                            writable {\n                                rust(\"let $tmp = $identifier.as_str();\")\n                            },\n                ).convertToStrRef(namer)\n            }\n        } else {\n            this\n        }\n\n    /**\n     * Coerces this expression to a boolean using JMESPath truthiness rules.\n     * - Booleans: used as-is\n     * - Arrays/Strings: truthy if non-empty (`!is_empty()`)\n     * - Numbers/Objects/Enums: always truthy (non-null values; null is handled by `?` short-circuiting)\n     */\n    internal fun coerceToBool(namer: SafeNamer): GeneratedExpression {\n        if (isBool()) return dereference(namer)\n        return namer.safeName(\"_truthy\").let { tmp ->\n            GeneratedExpression(\n                identifier = tmp,\n                outputType = RustType.Bool,\n                outputShape = TraversedShape.Bool(null),\n                output =\n                    output +\n                        writable {\n                            when {\n                                isArray() || isString() -> rust(\"let $tmp = !$identifier.is_empty();\")\n                                else -> rust(\"let $tmp = true;\")\n                            }\n                        },\n            )\n        }\n    }\n\n    /** Converts a number expression into a specific number type */\n    internal fun convertToNumberPrimitive(\n        namer: SafeNamer,\n        desiredPrimitive: RustType,\n    ): GeneratedExpression {\n        check(isNumber() && desiredPrimitive.isNumber()) {\n            \"this function only works on number types\"\n        }\n\n        return when {\n            desiredPrimitive is RustType.Reference -> convertToNumberPrimitive(namer, desiredPrimitive.member)\n            outputType is RustType.Reference -> dereference(namer).convertToNumberPrimitive(namer, desiredPrimitive)\n            outputType != desiredPrimitive ->\n                namer.safeName(\"_tmp\").let { tmp ->\n                    GeneratedExpression(\n                        identifier = tmp,\n                        outputType = desiredPrimitive,\n                        outputShape = this.outputShape,\n                        output =\n                            output +\n                                writable {\n                                    rust(\"let $tmp = $identifier as ${desiredPrimitive.render()};\")\n                                },\n                    )\n                }\n\n            else -> this\n        }\n    }\n}\n\n/**\n * Identifier binding for JmesPath expressions.\n */\nsealed class TraversalBinding {\n    /** The name of this binding in the generated Rust code */\n    abstract val rustName: String\n\n    /** The Smithy shape behind this binding */\n    abstract val shape: TraversedShape\n\n    /** Binds the given shape to the global namespace such that all its members are globally available */\n    data class Global(\n        override val rustName: String,\n        override val shape: TraversedShape,\n    ) : TraversalBinding()\n\n    /** Binds a shape to a name */\n    data class Named(\n        /** What this binding is referred to in JmesPath expressions */\n        val jmespathName: String,\n        override val rustName: String,\n        override val shape: TraversedShape,\n    ) : TraversalBinding()\n}\n\ntypealias TraversalBindings = List<TraversalBinding>\n\n/**\n * Bag of metadata accessible from the generate* methods that can affect how the resulting Rust code should be generated.\n *\n * [retainOption] determines whether `Option`s are preserved in the context of a projected list.\n * Specifically, when applying selectors (used in multi-select lists) to each entity on the left-hand side of a\n * projection, we want the resulting map function to return `Option<Vec<Option<&T>>>` (when `retainOption` is true)\n * rather than `Option<Vec<&T>>` (when it is false).\n * This distinction is crucial because the latter could incorrectly result in `None` if any of the selectors\n * refer to a field with a `None` value.\n */\ndata class TraversalContext(val retainOption: Boolean)\n\n/**\n * Indicates a feature that's part of the JmesPath spec, but that we explicitly decided\n * not to support in smithy-rs due to the complexity of code generating it for Rust.\n */\nclass UnsupportedJmesPathException(msg: String?, what: Throwable? = null) : RuntimeException(msg, what)\n\n/** Code can't be generated for the combination of the Smithy shape and the JmesPath expression. */\nclass InvalidJmesPathTraversalException(msg: String?, what: Throwable? = null) : RuntimeException(msg, what)\n\n/** This indicates a bug in the code generator itself that should be fixed. */\nclass JmesPathTraversalCodegenBugException(msg: String?, what: Throwable? = null) : RuntimeException(msg, what)\n\n/**\n * Generates code from a JmesPath expression to traverse generated Smithy shapes.\n *\n * This generator implements a subset of the JmesPath spec since the full spec has more features\n * than are needed for real-world Smithy waiters, and some of those features are very complex\n * to code generate for Rust.\n *\n * Specifically, the following Jmespath features are supported:\n * - Fields\n * - Sub-expressions\n * - Comparisons\n * - Filter projections\n * - Object projections\n * - Multi-select lists (but only when every item in the list is the exact same type)\n * - And/or/not boolean operations\n * - Functions `contains`, `length`, and `keys`.\n */\nclass RustJmespathShapeTraversalGenerator(\n    codegenContext: ClientCodegenContext,\n) {\n    private val model = codegenContext.model\n    private val symbolProvider = codegenContext.symbolProvider\n    private val safeNamer = SafeNamer()\n\n    fun generate(\n        expr: JmespathExpression,\n        bindings: TraversalBindings,\n        context: TraversalContext,\n    ): GeneratedExpression {\n        fun String.attachExpression() =\n            this.substringBefore(\"\\nExpression:\") + \"\\nExpression: ${ExpressionSerializer().serialize(expr)}\"\n        try {\n            val result =\n                when (expr) {\n                    is ComparatorExpression -> generateComparator(expr, bindings, context)\n                    is FunctionExpression -> generateFunction(expr, bindings, context)\n                    is FieldExpression -> generateField(expr, bindings, context)\n                    is LiteralExpression -> generateLiteral(expr)\n                    is MultiSelectListExpression -> generateMultiSelectList(expr, bindings, context)\n                    is AndExpression -> generateAnd(expr, bindings, context)\n                    is OrExpression -> generateOr(expr, bindings, context)\n                    is NotExpression -> generateNot(expr, bindings, context)\n                    is ObjectProjectionExpression -> generateObjectProjection(expr, bindings, context)\n                    is FilterProjectionExpression -> generateFilterProjection(expr, bindings, context)\n                    is ProjectionExpression -> generateProjection(expr, bindings, context)\n                    is Subexpression -> generateSubexpression(expr, bindings, context)\n                    is CurrentExpression -> throw JmesPathTraversalCodegenBugException(\"current expression must be handled in each expression type that can have one\")\n                    is ExpressionTypeExpression -> throw UnsupportedJmesPathException(\"Expression type expressions are not supported by smithy-rs\")\n                    is IndexExpression -> throw UnsupportedJmesPathException(\"Index expressions are not supported by smithy-rs\")\n                    is MultiSelectHashExpression -> throw UnsupportedJmesPathException(\"Multi-select hash expressions are not supported by smithy-rs\")\n                    is SliceExpression -> throw UnsupportedJmesPathException(\"Slice expressions are not supported by smithy-rs\")\n                    else -> throw UnsupportedJmesPathException(\"${expr.javaClass.name} expression type not supported by smithy-rs\")\n                }\n            return result.copy(\n                output =\n                    writable {\n                        result.output(this)\n                        if (debugMode) {\n                            rust(\"// ${result.identifier} = ${ExpressionSerializer().serialize(expr)}\")\n                        }\n                    },\n            )\n        } catch (ex: UnsupportedJmesPathException) {\n            throw UnsupportedJmesPathException(ex.message?.attachExpression(), ex)\n        } catch (ex: InvalidJmesPathTraversalException) {\n            throw InvalidJmesPathTraversalException(ex.message?.attachExpression(), ex)\n        } catch (ex: Exception) {\n            throw JmesPathTraversalCodegenBugException(ex.message?.attachExpression(), ex)\n        }\n    }\n\n    private fun generateComparator(\n        expr: ComparatorExpression,\n        bindings: TraversalBindings,\n        context: TraversalContext,\n    ): GeneratedExpression {\n        // When applying a comparator to the left and right operands, both must be non-optional types.\n        // For this, we avoid retaining `Option` values, even when `generateComparator` is invoked\n        // further down the chain from a projection expression.\n        val left = generate(expr.left, bindings, context.copy(retainOption = false))\n        val right = generate(expr.right, bindings, context.copy(retainOption = false))\n        return generateCompare(safeNamer, left, right, expr.comparator.toString())\n    }\n\n    private fun generateFunction(\n        expr: FunctionExpression,\n        bindings: TraversalBindings,\n        context: TraversalContext,\n    ): GeneratedExpression {\n        val ident = safeNamer.safeName(\"_ret\")\n        return when (expr.name) {\n            \"length\" -> {\n                if (expr.arguments.size != 1) {\n                    throw InvalidJmesPathTraversalException(\"Length function takes exactly one argument\")\n                }\n                val arg = generate(expr.arguments[0], bindings, context)\n                if (!arg.isArray() && !arg.isString()) {\n                    throw InvalidJmesPathTraversalException(\"Argument to `length` function must be a collection or string type\")\n                }\n                GeneratedExpression(\n                    identifier = ident,\n                    outputType = RustType.Integer(64),\n                    outputShape = TraversedShape.Number(null),\n                    output =\n                        writable {\n                            arg.output(this)\n                            rust(\"let $ident = ${arg.identifier}.len() as i64;\")\n                        },\n                )\n            }\n\n            \"contains\" -> {\n                if (expr.arguments.size != 2) {\n                    throw InvalidJmesPathTraversalException(\"Contains function takes exactly two arguments\")\n                }\n                val left = generate(expr.arguments[0], bindings, context)\n                if (!left.isArray() && !left.isString()) {\n                    throw InvalidJmesPathTraversalException(\"First argument to `contains` function must be a collection or string type\")\n                }\n                if (expr.arguments[1].isLiteralNull()) {\n                    throw UnsupportedJmesPathException(\"Checking for null with `contains` is not supported in smithy-rs\")\n                }\n                val right = generate(expr.arguments[1], bindings, context)\n                if (!right.isBool() && !right.isNumber() && !right.isString() && !right.isEnum()) {\n                    throw UnsupportedJmesPathException(\"Checking for anything other than booleans, numbers, strings, or enums in the `contains` function is not supported in smithy-rs\")\n                }\n                if (left.isString()) {\n                    return GeneratedExpression(\n                        identifier = ident,\n                        outputType = RustType.Bool,\n                        outputShape = TraversedShape.Bool(null),\n                        output =\n                            left.output +\n                                writable {\n                                    val rightStr = right.convertToStrRef(safeNamer).also { it.output(this) }\n                                    rust(\"let $ident = ${left.identifier}.contains(${rightStr.identifier});\")\n                                },\n                    )\n                } else {\n                    return GeneratedExpression(\n                        identifier = ident,\n                        outputType = RustType.Bool,\n                        outputShape = TraversedShape.Bool(null),\n                        output =\n                            left.output + right.output +\n                                writable {\n                                    withBlockTemplate(\"let $ident = ${left.identifier}.iter().any(|_v| {\", \"});\") {\n                                        val compare =\n                                            generateCompare(\n                                                safeNamer,\n                                                GeneratedExpression(\n                                                    identifier = \"_v\",\n                                                    outputShape = (left.outputShape as TraversedShape.Array).member,\n                                                    outputType =\n                                                        RustType.Reference(\n                                                            lifetime = null,\n                                                            member =\n                                                                left.outputType.collectionValue(),\n                                                        ),\n                                                    output = writable {},\n                                                ),\n                                                // Clear the output since we already wrote the right and don't want to duplicate it\n                                                right.copy(output = writable {}),\n                                                \"==\",\n                                            ).also { it.output(this) }\n\n                                        rust(compare.identifier)\n                                    }\n                                },\n                    )\n                }\n            }\n\n            \"keys\" -> {\n                if (expr.arguments.size != 1) {\n                    throw InvalidJmesPathTraversalException(\"Keys function takes exactly one argument\")\n                }\n                val arg = generate(expr.arguments[0], bindings, context)\n                if (!arg.isObject()) {\n                    throw InvalidJmesPathTraversalException(\"Argument to `keys` function must be an object type\")\n                }\n                GeneratedExpression(\n                    identifier = ident,\n                    outputType = RustType.Vec(RustType.String),\n                    outputShape = TraversedShape.Array(null, TraversedShape.String(null)),\n                    output =\n                        writable {\n                            arg.output(this)\n                            when (val outputShape = arg.outputShape.shape) {\n                                is StructureShape -> {\n                                    // Can't iterate a struct in Rust so source the keys from smithy\n                                    val keys =\n                                        outputShape.allMembers.keys.joinToString(\",\") { \"${it.dq()}.to_string()\" }\n                                    rust(\"let $ident = vec![$keys];\")\n                                }\n\n                                is MapShape -> {\n                                    rust(\"let $ident = ${arg.identifier}.keys().map(Clone::clone).collect::<Vec<String>>();\")\n                                }\n\n                                else ->\n                                    throw UnsupportedJmesPathException(\"The shape type for an input to the keys function must be a struct or a map, got ${outputShape?.type}\")\n                            }\n                        },\n                )\n            }\n\n            else -> throw UnsupportedJmesPathException(\"The `${expr.name}` function is not supported by smithy-rs\")\n        }\n    }\n\n    private fun generateField(\n        expr: FieldExpression,\n        bindings: TraversalBindings,\n        context: TraversalContext,\n    ): GeneratedExpression {\n        val globalBinding = bindings.find { it is TraversalBinding.Global }\n        val namedBinding = bindings.find { it is TraversalBinding.Named && it.jmespathName == expr.name }\n        if (namedBinding != null && namedBinding.shape is TraversedShape.Object) {\n            // If there's a named binding that matches, then immediately return it\n            return GeneratedExpression(\n                identifier = namedBinding.rustName,\n                outputShape = namedBinding.shape,\n                outputType = symbolProvider.toSymbol(namedBinding.shape.shape!!).rustType().asRef(),\n                output = writable { },\n            )\n        } else if (globalBinding != null && globalBinding.shape is TraversedShape.Object) {\n            // Otherwise, look in the global binding (if available)\n            val member =\n                globalBinding.shape.shape?.getMember(expr.name)?.orNull()\n                    ?: throw InvalidJmesPathTraversalException(\"Member `${expr.name}` doesn't exist on ${globalBinding.shape.shape?.id}\")\n            val memberSym = symbolProvider.toSymbol(member)\n\n            val target = model.expectShape(member.target)\n            val targetSym = symbolProvider.toSymbol(target)\n\n            val ident = safeNamer.safeName(\"_fld\")\n            if (context.retainOption) {\n                return GeneratedExpression(\n                    identifier = ident,\n                    outputShape = TraversedShape.from(model, target),\n                    outputType = RustType.Option(targetSym.rustType().asRef()),\n                    output =\n                        writable {\n                            rustTemplate(\n                                if (globalBinding.rustName.startsWith(\"_fld\")) {\n                                    if (memberSym.isOptional()) {\n                                        // This ensures that `ident` has a type with a single level of `Option`, rather than being\n                                        // doubly nested as `Option<Option<...>>`.\n                                        \"let $ident = ${globalBinding.rustName}.and_then(|v| v.${memberSym.name}.as_ref());\"\n                                    } else {\n                                        \"let $ident = ${globalBinding.rustName}.map(|v| &v.${memberSym.name});\"\n                                    }\n                                } else {\n                                    if (memberSym.isOptional()) {\n                                        \"let $ident = ${globalBinding.rustName}.${memberSym.name}.as_ref();\"\n                                    } else {\n                                        \"let $ident = #{Some}(&${globalBinding.rustName}.${memberSym.name});\"\n                                    }\n                                },\n                                *preludeScope,\n                            )\n                        },\n                )\n            } else {\n                return GeneratedExpression(\n                    identifier = ident,\n                    outputShape = TraversedShape.from(model, target),\n                    outputType = targetSym.rustType().asRef(),\n                    output =\n                        writable {\n                            rust(\n                                if (memberSym.isOptional()) {\n                                    \"let $ident = ${globalBinding.rustName}.${memberSym.name}.as_ref()?;\"\n                                } else {\n                                    \"let $ident = &${globalBinding.rustName}.${memberSym.name};\"\n                                },\n                            )\n                        },\n                )\n            }\n        } else if (namedBinding != null || globalBinding != null) {\n            throw InvalidJmesPathTraversalException(\"Cannot look up fields in non-struct shapes\")\n        } else {\n            throw JmesPathTraversalCodegenBugException(\"Missing jmespath traversal binding for ${expr.name}; available bindings: $bindings\")\n        }\n    }\n\n    private fun generateLiteral(expr: LiteralExpression): GeneratedExpression {\n        val (outputShape, outputType) =\n            when (expr.type) {\n                RuntimeType.BOOLEAN ->\n                    TraversedShape.Bool(null) to\n                        RustType.Reference(\n                            lifetime = null,\n                            member = RustType.Bool,\n                        )\n\n                RuntimeType.NUMBER ->\n                    TraversedShape.Number(null) to\n                        RustType.Reference(\n                            lifetime = null,\n                            member = RustType.Float(64),\n                        )\n\n                RuntimeType.STRING ->\n                    TraversedShape.String(null) to\n                        RustType.Reference(\n                            lifetime = null,\n                            member = RustType.Opaque(\"str\"),\n                        )\n\n                RuntimeType.NULL -> throw UnsupportedJmesPathException(\"Literal nulls are not supported by smithy-rs\")\n                else -> throw UnsupportedJmesPathException(\"Literal expression '${ExpressionSerializer().serialize(expr)}' is not supported by smithy-rs\")\n            }\n\n        fun fmtFloating(floating: Number) =\n            NumberFormat.getInstance().apply { minimumFractionDigits = 1 }.format(floating)\n\n        return safeNamer.safeName(\"_lit\").uppercase().let { ident ->\n            GeneratedExpression(\n                identifier = ident,\n                outputType = outputType,\n                outputShape = outputShape,\n                output =\n                    writable {\n                        when (expr.type) {\n                            RuntimeType.BOOLEAN -> rust(\"const $ident: &bool = &${expr.expectBooleanValue()};\")\n                            RuntimeType.NUMBER -> {\n                                rust(\"const $ident: #T = &${fmtFloating(expr.expectNumberValue())};\", outputType)\n                            }\n\n                            RuntimeType.STRING -> rust(\"const $ident: &str = ${expr.expectStringValue().dq()};\")\n                            else -> throw RuntimeException(\"unreachable\")\n                        }\n                    },\n            )\n        }\n    }\n\n    private fun generateMultiSelectList(\n        expr: MultiSelectListExpression,\n        bindings: TraversalBindings,\n        context: TraversalContext,\n    ): GeneratedExpression {\n        val expressions =\n            expr.expressions.map { subexpr ->\n                generate(subexpr, bindings, context)\n            }\n        // If we wanted to support mixed-types, we would need to use tuples, add tuple support to RustType,\n        // and update supported functions such as `contains` to operate on tuples.\n        for (pair in expressions.map { it.outputType }.windowed(2)) {\n            if (pair[0] != pair[1]) {\n                throw UnsupportedJmesPathException(\"Mixed-type multi-select lists are not supported by smithy-rs\")\n            }\n        }\n\n        return safeNamer.safeName(\"_msl\").let { ident ->\n            GeneratedExpression(\n                identifier = ident,\n                outputType = RustType.Vec(expressions[0].outputType),\n                outputShape = TraversedShape.Array(null, expressions[0].outputShape),\n                output =\n                    writable {\n                        expressions.forEach { it.output(this) }\n                        rust(\"let $ident = vec![${expressions.map { it.identifier }.joinToString(\", \")}];\")\n                    },\n            )\n        }\n    }\n\n    private fun generateAnd(\n        expr: AndExpression,\n        bindings: TraversalBindings,\n        context: TraversalContext,\n    ): GeneratedExpression = generateBooleanOp(expr, \"&&\", bindings, context)\n\n    private fun generateOr(\n        expr: OrExpression,\n        bindings: TraversalBindings,\n        context: TraversalContext,\n    ): GeneratedExpression = generateBooleanOp(expr, \"||\", bindings, context)\n\n    private fun generateBooleanOp(\n        expr: BinaryExpression,\n        op: String,\n        bindings: TraversalBindings,\n        context: TraversalContext,\n    ): GeneratedExpression {\n        val left = generate(expr.left, bindings, context)\n        val right = generate(expr.right, bindings, context)\n\n        return safeNamer.safeName(\"_bo\").let { ident ->\n            GeneratedExpression(\n                identifier = ident,\n                outputType = RustType.Bool,\n                outputShape = TraversedShape.Bool(null),\n                output =\n                    writable {\n                        val leftBool = left.coerceToBool(safeNamer).also { it.output(this) }\n                        val rightBool = right.coerceToBool(safeNamer).also { it.output(this) }\n                        rust(\"let $ident = ${leftBool.identifier} $op ${rightBool.identifier};\")\n                    },\n            )\n        }\n    }\n\n    private fun generateNot(\n        expr: NotExpression,\n        bindings: TraversalBindings,\n        context: TraversalContext,\n    ): GeneratedExpression {\n        val inner = generate(expr.expression, bindings, context)\n        if (!inner.isBool()) {\n            throw UnsupportedJmesPathException(\"Negation of a non-boolean type is not supported by smithy-rs\")\n        }\n\n        return safeNamer.safeName(\"_not\").let { ident ->\n            GeneratedExpression(\n                identifier = ident,\n                outputType = RustType.Bool,\n                outputShape = TraversedShape.Bool(null),\n                output =\n                    inner.output +\n                        writable {\n                            rust(\"let $ident = !${inner.identifier};\")\n                        },\n            )\n        }\n    }\n\n    private fun generateProjection(\n        expr: ProjectionExpression,\n        bindings: TraversalBindings,\n        context: TraversalContext,\n    ): GeneratedExpression {\n        val maybeFlatten = expr.left\n        if (maybeFlatten is SliceExpression) {\n            throw UnsupportedJmesPathException(\"Slice expressions are not supported by smithy-rs\")\n        }\n        val left =\n            when (maybeFlatten) {\n                is FlattenExpression -> generate(maybeFlatten.expression, bindings, context)\n                else -> generate(expr.left, bindings, context)\n            }\n\n        // Short-circuit in the case where the projection is unnecessary\n        if (left.isArray() && expr.right is CurrentExpression) {\n            return left\n        }\n\n        val leftTarget =\n            (\n                left.outputShape as? TraversedShape.Array\n                    ?: throw InvalidJmesPathTraversalException(\"Left side of the flatten projection MUST resolve to a list or set shape\")\n            ).member\n        val leftTargetSym: Any = (leftTarget.shape?.let { symbolProvider.toSymbol(it) }) ?: left.outputType\n        val leftBinding = \"_v\"\n\n        val right =\n            generate(\n                expr.right,\n                listOf(TraversalBinding.Global(leftBinding, leftTarget)),\n                context.copy(retainOption = true),\n            )\n\n        val (projectionType, flattenNeeded) = projectionType(right)\n\n        return safeNamer.safeName(\"_prj\").let { ident ->\n            GeneratedExpression(\n                identifier = ident,\n                outputShape = right.outputShape,\n                outputType = projectionType,\n                output =\n                    left.output +\n                        writable {\n                            rust(\"let $ident = ${left.identifier}.iter()\")\n                            withBlock(\".flat_map(|v| {\", \"})\") {\n                                renderMapToProject(this, leftBinding, leftTargetSym, right)\n                                rust(\"map(v)\")\n                            }\n                            if (flattenNeeded) {\n                                rust(\".flatten()\")\n                                // Eliminate temporary `Option` introduced by `retainOption = true` above.\n                                if (right.outputType.isCollectionOfOptions()) {\n                                    rust(\".flatten()\")\n                                }\n                            }\n                            rustTemplate(\".collect::<#{Vec}<_>>();\", *preludeScope)\n                        },\n            )\n        }\n    }\n\n    private fun generateFilterProjection(\n        expr: FilterProjectionExpression,\n        bindings: TraversalBindings,\n        context: TraversalContext,\n    ): GeneratedExpression {\n        val left = generate(expr.left, bindings, context)\n        if (!left.isArray()) {\n            throw UnsupportedJmesPathException(\"Filter projections can only be done on lists or sets in smithy-rs\")\n        }\n\n        val leftTarget = (left.outputShape as TraversedShape.Array).member\n        val leftTargetSym = symbolProvider.toSymbol(leftTarget.shape)\n        val leftBinding = \"_v\"\n\n        val right =\n            if (expr.right is CurrentExpression) {\n                left.copy(\n                    outputType = left.outputType.collectionValue().asRef(),\n                    outputShape = leftTarget,\n                    output = writable {},\n                )\n            } else {\n                generate(\n                    expr.right,\n                    listOf(TraversalBinding.Global(leftBinding, leftTarget)),\n                    context.copy(retainOption = true),\n                )\n            }\n\n        val comparison = generate(expr.comparison, listOf(TraversalBinding.Global(\"_v\", leftTarget)), context)\n        if (!comparison.isBool()) {\n            throw InvalidJmesPathTraversalException(\"The filter expression comparison must result in a boolean\")\n        }\n\n        val (projectionType, flattenNeeded) = projectionType(right)\n\n        return safeNamer.safeName(\"_fprj\").let { ident ->\n            GeneratedExpression(\n                identifier = ident,\n                outputShape = TraversedShape.Array(null, right.outputShape),\n                outputType = projectionType,\n                output =\n                    left.output +\n                        writable {\n                            rust(\"let $ident = ${left.identifier}.iter()\")\n                            withBlock(\".filter({\", \"})\") {\n                                rustBlockTemplate(\n                                    \"fn filter(_v: &#{Arg}) -> #{Option}<bool>\",\n                                    \"Arg\" to leftTargetSym,\n                                    *preludeScope,\n                                ) {\n                                    val toBool = comparison.dereference(safeNamer).also { it.output(this) }\n                                    rustTemplate(\"#{Some}(${toBool.identifier})\", *preludeScope)\n                                }\n                                rust(\"|v| filter(v).unwrap_or_default()\")\n                            }\n                            if (expr.right !is CurrentExpression) {\n                                withBlock(\".flat_map({\", \"})\") {\n                                    renderMapToProject(this, leftBinding, leftTargetSym, right)\n                                    rust(\"map\")\n                                }\n                                if (flattenNeeded) {\n                                    rust(\".flatten()\")\n                                    // Eliminate temporary `Option` introduced by `retainOption = true` above.\n                                    if (right.outputType.isCollectionOfOptions()) {\n                                        rust(\".flatten()\")\n                                    }\n                                }\n                            }\n                            rustTemplate(\".collect::<#{Vec}<_>>();\", *preludeScope)\n                        },\n            )\n        }\n    }\n\n    private fun generateObjectProjection(\n        expr: ObjectProjectionExpression,\n        bindings: TraversalBindings,\n        context: TraversalContext,\n    ): GeneratedExpression {\n        if (expr.left is CurrentExpression) {\n            throw UnsupportedJmesPathException(\"Object projection cannot be done on computed maps in smithy-rs\")\n        }\n        val left = generate(expr.left, bindings, context)\n        if (!left.outputType.isMap()) {\n            throw UnsupportedJmesPathException(\"Object projection is only supported on map types in smithy-rs\")\n        }\n        if (left.outputShape.shape == null) {\n            throw UnsupportedJmesPathException(\"Object projection cannot be done on computed maps in smithy-rs\")\n        }\n\n        val leftTarget = model.expectShape((left.outputShape.shape as MapShape).value.target)\n        val leftTargetSym = symbolProvider.toSymbol(leftTarget)\n        val leftBinding = \"_v\"\n\n        val right =\n            if (expr.right is CurrentExpression) {\n                left.copy(\n                    outputType =\n                        left.outputType.collectionValue().asRef(),\n                    outputShape = TraversedShape.from(model, leftTarget),\n                    output = writable {},\n                )\n            } else {\n                generate(\n                    expr.right,\n                    listOf(TraversalBinding.Global(leftBinding, TraversedShape.from(model, leftTarget))),\n                    context.copy(retainOption = true),\n                )\n            }\n\n        val (projectionType, flattenNeeded) = projectionType(right)\n\n        val ident = safeNamer.safeName(\"_oprj\")\n        return GeneratedExpression(\n            identifier = ident,\n            outputShape = TraversedShape.Array(null, right.outputShape),\n            outputType = projectionType,\n            output =\n                left.output +\n                    writable {\n                        if (expr.right is CurrentExpression) {\n                            rustTemplate(\"let $ident = ${left.identifier}.values().collect::<#{Vec}<_>>();\", *preludeScope)\n                        } else {\n                            withBlock(\"let $ident = ${left.identifier}.values().flat_map({\", \"})\") {\n                                renderMapToProject(this, leftBinding, leftTargetSym, right)\n                                rust(\"map\")\n                            }\n                            if (flattenNeeded) {\n                                rust(\".flatten()\")\n                                if (right.outputType.isCollectionOfOptions()) {\n                                    // Eliminate temporary `Option` introduced by `retainOption = true` above.\n                                    rust(\".flatten()\")\n                                }\n                            }\n                            rustTemplate(\".collect::<#{Vec}<_>>();\", *preludeScope)\n                        }\n                    },\n        )\n    }\n\n    private fun generateSubexpression(\n        expr: Subexpression,\n        bindings: TraversalBindings,\n        context: TraversalContext,\n    ): GeneratedExpression {\n        val left = generate(expr.left, bindings, context)\n        val right = generate(expr.right, listOf(TraversalBinding.Global(left.identifier, left.outputShape)), context)\n        return GeneratedExpression(\n            identifier = right.identifier,\n            outputShape = right.outputShape,\n            outputType = right.outputType,\n            output = left.output + right.output,\n        )\n    }\n}\n\ninternal fun generateCompare(\n    safeNamer: SafeNamer,\n    left: GeneratedExpression,\n    right: GeneratedExpression,\n    op: String,\n): GeneratedExpression =\n    if (left.outputType.isDoubleReference()) {\n        generateCompare(safeNamer, left.dereference(safeNamer), right, op)\n    } else if (right.outputType.isDoubleReference()) {\n        generateCompare(safeNamer, left, right.dereference(safeNamer), op)\n    } else {\n        safeNamer.safeName(\"_cmp\").let { ident ->\n            return GeneratedExpression(\n                identifier = ident,\n                outputType = RustType.Bool,\n                outputShape = TraversedShape.Bool(null),\n                output =\n                    if (left.isStringOrEnum() && right.isStringOrEnum()) {\n                        writable {\n                            val leftStr = left.convertToStrRef(safeNamer).also { it.output(this) }\n                            val rightStr = right.convertToStrRef(safeNamer).also { it.output(this) }\n                            rust(\"let $ident = ${leftStr.identifier} $op ${rightStr.identifier};\")\n                        }\n                    } else if (left.isNumber() && right.isNumber()) {\n                        writable {\n                            val leftPrim =\n                                left.convertToNumberPrimitive(safeNamer, left.outputType).also { it.output(this) }\n                            val rightPrim =\n                                right.convertToNumberPrimitive(safeNamer, left.outputType).also { it.output(this) }\n                            rust(\"let $ident = ${leftPrim.identifier} $op ${rightPrim.identifier};\")\n                        }\n                    } else if (left.isBool() && right.isBool()) {\n                        writable {\n                            val leftPrim = left.dereference(safeNamer).also { it.output(this) }\n                            val rightPrim = right.dereference(safeNamer).also { it.output(this) }\n                            rust(\"let $ident = ${leftPrim.identifier} $op ${rightPrim.identifier};\")\n                        }\n                    } else {\n                        throw UnsupportedJmesPathException(\"Comparison of ${left.outputType.render()} with ${right.outputType.render()} is not supported by smithy-rs\")\n                    },\n            )\n        }\n    }\n\nprivate fun renderMapToProject(\n    writer: RustWriter,\n    leftBinding: String,\n    leftTargetSym: Any,\n    right: GeneratedExpression,\n) {\n    writer.apply {\n        Attribute.AllowClippyLetAndReturn.render(this)\n        rustBlockTemplate(\n            if (right.outputType is RustType.Option) {\n                \"fn map($leftBinding: &#{Left}) -> #{Right}\"\n            } else {\n                \"fn map($leftBinding: &#{Left}) -> #{Option}<#{Right}>\"\n            },\n            *preludeScope,\n            \"Left\" to leftTargetSym,\n            \"Right\" to right.outputType,\n        ) {\n            right.output(this)\n            if (right.outputType is RustType.Option) {\n                rust(right.identifier)\n            } else {\n                rustTemplate(\"#{Some}(${right.identifier})\", *preludeScope)\n            }\n        }\n    }\n}\n\n/**\n * This function takes the `GeneratedExpression` of a projection expression's right-hand side (RHS)\n * and returns a pair:\n * - A `RustType` representing the final evaluation of the projection expression.\n * - A `Boolean` indicating whether the resulting vector needs to be flattened.\n *   Flattening ensures you get `Vec<&T>` instead of `Vec<&Vec<T>>`, which would otherwise cause\n *   subsequent projections to fail to compile.\n */\nprivate fun projectionType(right: GeneratedExpression) =\n    when {\n        right.isArray() && right.outputType is RustType.Vec -> {\n            // A case like `lists.structs[].[integer]` where RHS output type (`[integer]`) is `Vec<Option<&T>>`, and we want Vec<&T>\n            RustType.Vec(right.outputType.member.stripOuter<RustType.Option>()) to true\n        }\n\n        right.isArray() && right.outputType is RustType.Option -> {\n            // A case like `maps.structs[].strings` where RHS (strings) output type (`[strings]`) is `Option<&Vec<T>>`, and we want Vec<&T>\n            RustType.Vec(\n                right.outputType.member.stripOuter<RustType.Reference>().stripOuter<RustType.Vec>().asRef(),\n            ) to true\n        }\n\n        else -> {\n            RustType.Vec(right.outputType.stripOuter<RustType.Option>()) to false\n        }\n    }\n\nprivate fun RustType.dereference(): RustType =\n    if (this is RustType.Reference) {\n        this.member.dereference()\n    } else {\n        this\n    }\n\nprivate fun RustType.isMap(): Boolean = this.dereference() is RustType.HashMap\n\nprivate fun RustType.isString(): Boolean = this.dereference().let { it is RustType.String || it.isStr() }\n\nprivate fun RustType.isStr(): Boolean = this.dereference().let { it is RustType.Opaque && it.name == \"str\" }\n\nprivate fun RustType.isNumber(): Boolean = this.dereference().let { it is RustType.Integer || it is RustType.Float }\n\nprivate fun RustType.isDoubleReference(): Boolean = this is RustType.Reference && this.member is RustType.Reference\n\nprivate fun RustType.isCollectionOfOptions(): Boolean =\n    try {\n        collectionValue() is RustType.Option\n    } catch (_: RuntimeException) {\n        false\n    }\n\nprivate fun RustType.collectionValue(): RustType =\n    when (this) {\n        is RustType.Reference -> member.collectionValue()\n        is RustType.Vec -> member\n        is RustType.HashSet -> member\n        is RustType.HashMap -> member\n        else -> throw RuntimeException(\"expected collection type\")\n    }\n\nprivate fun JmespathExpression.isLiteralNull(): Boolean = this == LiteralExpression.NULL\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/waiters/RustWaiterMatcherGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\npackage software.amazon.smithy.rust.codegen.client.smithy.generators.waiters\n\nimport software.amazon.smithy.codegen.core.CodegenException\nimport software.amazon.smithy.codegen.core.Symbol\nimport software.amazon.smithy.jmespath.JmespathExpression\nimport software.amazon.smithy.model.node.Node\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustModule\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustType\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.SafeNamer\nimport software.amazon.smithy.rust.codegen.core.rustlang.docs\nimport software.amazon.smithy.rust.codegen.core.rustlang.replaceLifetimes\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlockTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\nimport software.amazon.smithy.rust.codegen.core.util.dq\nimport software.amazon.smithy.rust.codegen.core.util.toSnakeCase\nimport software.amazon.smithy.waiters.Matcher\nimport software.amazon.smithy.waiters.Matcher.ErrorTypeMember\nimport software.amazon.smithy.waiters.Matcher.InputOutputMember\nimport software.amazon.smithy.waiters.Matcher.OutputMember\nimport software.amazon.smithy.waiters.Matcher.SuccessMember\nimport software.amazon.smithy.waiters.PathComparator\nimport java.security.MessageDigest\n\nprivate typealias Scope = Array<Pair<String, Any>>\n\n/** True if the waiter matcher requires the operation input in its implementation */\nfun Matcher<*>.requiresInput(): Boolean = this is InputOutputMember\n\n/**\n * Generates the Rust code for the Smithy waiter \"matcher union\".\n * See https://smithy.io/2.0/additional-specs/waiters.html#matcher-union\n */\nclass RustWaiterMatcherGenerator(\n    private val codegenContext: ClientCodegenContext,\n    private val operationName: String,\n    private val inputShape: Shape,\n    private val outputShape: Shape,\n) {\n    private val model = codegenContext.model\n    private val runtimeConfig = codegenContext.runtimeConfig\n    private val module =\n        RustModule.pubCrate(\n            \"matchers\",\n            ClientRustModule.waiters,\n            additionalAttributes =\n                listOf(\n                    Attribute.AllowClippyNeedlessLifetimes,\n                    Attribute.AllowClippyLetAndReturn,\n                ),\n        )\n    private val inputSymbol = codegenContext.symbolProvider.toSymbol(inputShape)\n    private val outputSymbol = codegenContext.symbolProvider.toSymbol(outputShape)\n\n    fun generate(\n        errorSymbol: Symbol,\n        matcher: Matcher<*>,\n    ): RuntimeType {\n        val fnName = fnName(operationName, matcher)\n        val scope =\n            arrayOf(\n                *preludeScope,\n                \"Input\" to inputSymbol,\n                \"Output\" to outputSymbol,\n                \"Error\" to errorSymbol,\n                \"ProvideErrorMetadata\" to RuntimeType.provideErrorMetadataTrait(runtimeConfig),\n            )\n        return RuntimeType.forInlineFun(fnName, module) {\n            val inputArg =\n                when {\n                    matcher.requiresInput() -> \"_input: &#{Input}, \"\n                    else -> \"\"\n                }\n            docs(\"Matcher union: \" + Node.printJson(matcher.toNode()))\n            rustBlockTemplate(\n                \"pub(crate) fn $fnName(${inputArg}_result: #{Result}<&#{Output}, &#{Error}>) -> bool\",\n                *scope,\n            ) {\n                when (matcher) {\n                    is OutputMember -> generateOutputMember(outputShape, matcher, scope)\n                    is InputOutputMember -> generateInputOutputMember(matcher, scope)\n                    is SuccessMember -> generateSuccessMember(matcher)\n                    is ErrorTypeMember -> generateErrorTypeMember(matcher, scope)\n                    else -> throw CodegenException(\"Unknown waiter matcher type: $matcher\")\n                }\n            }\n        }\n    }\n\n    private fun RustWriter.generateOutputMember(\n        outputShape: Shape,\n        matcher: OutputMember,\n        scope: Scope,\n    ) {\n        val pathExpression = JmespathExpression.parse(matcher.value.path)\n        val pathTraversal =\n            RustJmespathShapeTraversalGenerator(codegenContext).generate(\n                pathExpression,\n                listOf(TraversalBinding.Global(\"_output\", TraversedShape.from(model, outputShape))),\n                TraversalContext(retainOption = false),\n            )\n\n        generatePathTraversalMatcher(\n            pathTraversal,\n            matcher.value.expected,\n            matcher.value.comparator,\n            scope,\n            matcher.requiresInput(),\n        )\n    }\n\n    private fun RustWriter.generateInputOutputMember(\n        matcher: InputOutputMember,\n        scope: Scope,\n    ) {\n        val pathExpression = JmespathExpression.parse(matcher.value.path)\n        val pathTraversal =\n            RustJmespathShapeTraversalGenerator(codegenContext).generate(\n                pathExpression,\n                listOf(\n                    TraversalBinding.Named(\"input\", \"_input\", TraversedShape.from(model, inputShape)),\n                    TraversalBinding.Named(\"output\", \"_output\", TraversedShape.from(model, outputShape)),\n                ),\n                TraversalContext(retainOption = false),\n            )\n\n        generatePathTraversalMatcher(\n            pathTraversal,\n            matcher.value.expected,\n            matcher.value.comparator,\n            scope,\n            matcher.requiresInput(),\n        )\n    }\n\n    private fun RustWriter.generatePathTraversalMatcher(\n        pathTraversal: GeneratedExpression,\n        expected: String,\n        comparatorKind: PathComparator,\n        scope: Scope,\n        requiresInput: Boolean,\n    ) {\n        val comparator =\n            writable {\n                val leftIsIterString =\n                    listOf(PathComparator.ALL_STRING_EQUALS, PathComparator.ANY_STRING_EQUALS).contains(comparatorKind)\n                val left =\n                    GeneratedExpression(\n                        identifier = \"value\",\n                        outputType =\n                            when {\n                                leftIsIterString -> RustType.Reference(null, RustType.String)\n                                else -> pathTraversal.outputType\n                            },\n                        outputShape =\n                            when {\n                                leftIsIterString -> (pathTraversal.outputShape as? TraversedShape.Array)?.member ?: pathTraversal.outputShape\n                                else -> pathTraversal.outputShape\n                            },\n                        output = writable {},\n                    )\n                val rightIsString = PathComparator.BOOLEAN_EQUALS != comparatorKind\n                val right =\n                    GeneratedExpression(\n                        identifier = \"right\",\n                        outputType =\n                            when {\n                                rightIsString -> RustType.Reference(null, RustType.Opaque(\"str\"))\n                                else -> RustType.Bool\n                            },\n                        outputShape =\n                            when {\n                                rightIsString -> TraversedShape.String(null)\n                                else -> TraversedShape.Bool(null)\n                            },\n                        output =\n                            writable {\n                                rust(\n                                    \"let right = \" +\n                                        when {\n                                            rightIsString -> expected.dq()\n                                            else -> expected\n                                        } + \";\",\n                                )\n                            },\n                    )\n                rustTemplate(\n                    when (comparatorKind) {\n                        PathComparator.ALL_STRING_EQUALS -> \"!value.is_empty() && value.iter().all(|value| { #{comparison} })\"\n                        PathComparator.ANY_STRING_EQUALS -> \"value.iter().any(|value| { #{comparison} })\"\n                        PathComparator.STRING_EQUALS -> \"#{comparison}\"\n                        PathComparator.BOOLEAN_EQUALS -> \"#{comparison}\"\n                        else -> throw CodegenException(\"Unknown path matcher comparator: $comparatorKind\")\n                    },\n                    \"comparison\" to\n                        writable {\n                            val compare = generateCompare(SafeNamer(), left, right, \"==\")\n                            compare.output(this)\n                            rust(compare.identifier)\n                        },\n                )\n            }\n\n        val (inputArgDecl, inputArg) =\n            when {\n                requiresInput -> \"_input: &'a #{Input}, \" to \"_input, \"\n                else -> \"\" to \"\"\n            }\n        rustTemplate(\n            \"\"\"\n            fn path_traversal<'a>(${inputArgDecl}_output: &'a #{Output}) -> #{Option}<#{TraversalOutput}> {\n                #{traversal}\n                #{Some}(${pathTraversal.identifier})\n            }\n            _result.as_ref()\n                .ok()\n                .and_then(|output| path_traversal(${inputArg}output))\n                .map(|value| { #{comparator} })\n                .unwrap_or_default()\n            \"\"\",\n            *scope,\n            \"traversal\" to pathTraversal.output,\n            \"TraversalOutput\" to pathTraversal.outputType.replaceLifetimes(\"a\"),\n            \"comparator\" to comparator,\n        )\n    }\n\n    private fun RustWriter.generateSuccessMember(matcher: SuccessMember) {\n        rust(\n            if (matcher.value) {\n                \"_result.is_ok()\"\n            } else {\n                \"_result.is_err()\"\n            },\n        )\n    }\n\n    private fun RustWriter.generateErrorTypeMember(\n        matcher: ErrorTypeMember,\n        scope: Scope,\n    ) {\n        rustTemplate(\n            \"\"\"\n            if let #{Err}(err) = _result {\n                if let #{Some}(code) = #{ProvideErrorMetadata}::code(err) {\n                    return code == ${matcher.value.dq()};\n                }\n            }\n            false\n            \"\"\",\n            *scope,\n        )\n    }\n\n    private fun fnName(\n        operationName: String,\n        matcher: Matcher<*>,\n    ): String {\n        // Smithy models don't give us anything useful to name these functions with, so just\n        // SHA-256 hash the matcher JSON and truncate it to a reasonable length. This will have\n        // a nice side-effect of de-duplicating identical matchers within a given operation.\n        val jsonValue = Node.printJson(matcher.toNode())\n        val bytes = MessageDigest.getInstance(\"SHA-256\").digest(jsonValue.toByteArray())\n        val hex = bytes.map { byte -> String.format(\"%02x\", byte) }.joinToString(\"\")\n        return \"match_${operationName.toSnakeCase()}_${hex.substring(0..16)}\"\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/waiters/WaitableGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.generators.waiters\n\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.client.FluentBuilderConfig\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.client.FluentBuilderGenerator\nimport software.amazon.smithy.rust.codegen.core.rustlang.EscapeFor\nimport software.amazon.smithy.rust.codegen.core.rustlang.InlineDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustModule\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustReservedWords\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.docs\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlockTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\nimport software.amazon.smithy.rust.codegen.core.smithy.RustCrate\nimport software.amazon.smithy.rust.codegen.core.util.getTrait\nimport software.amazon.smithy.rust.codegen.core.util.orNull\nimport software.amazon.smithy.rust.codegen.core.util.outputShape\nimport software.amazon.smithy.rust.codegen.core.util.toPascalCase\nimport software.amazon.smithy.rust.codegen.core.util.toSnakeCase\nimport software.amazon.smithy.waiters.WaitableTrait\nimport software.amazon.smithy.waiters.Waiter\n\n/**\n * Generates waiters for the Smithy @waitable trait.\n *\n * This will place waiter-specific fluent builders into individual waiter submodules of the `crate::waiter` module,\n * and place a `Waiters` trait in the client module that can be imported to initiate waiters.\n */\nclass WaitableGenerator(\n    private val codegenContext: ClientCodegenContext,\n    allOperations: List<OperationShape>,\n) {\n    private data class WaitableOp(\n        val shape: OperationShape,\n        val waiters: List<WaiterSpec>,\n    )\n\n    private data class WaiterSpec(\n        val waiterName: String,\n        val waiter: Waiter,\n        val fluentBuilder: RuntimeType,\n    )\n\n    private val operations =\n        allOperations.mapNotNull { op ->\n            op.getTrait<WaitableTrait>()?.let {\n                WaitableOp(\n                    op,\n                    it.waiters.entries.map { (name, waiter) ->\n                        WaiterSpec(\n                            name,\n                            waiter,\n                            waiterFluentBuilder(name, waiter, op),\n                        )\n                    },\n                )\n            }\n        }\n            .sortedBy { it.shape.id }\n\n    fun render(crate: RustCrate) {\n        if (operations.isEmpty()) {\n            return\n        }\n\n        crate.withModule(ClientRustModule.client) {\n            docs(\n                \"\"\"\n                Waiter functions for the client.\n\n                Import this trait to get `wait_until` methods on the client.\n                \"\"\",\n            )\n            rustBlockTemplate(\"pub trait Waiters\") {\n                for (op in operations) {\n                    for (spec in op.waiters) {\n                        val waiterDocs = spec.waiter.documentation.orNull() ?: \"Wait for `${spec.waiterName.toSnakeCase()}`\"\n                        docs(waiterDocs)\n                        renderWaiterFnDeclaration(spec)\n                        rust(\";\")\n                    }\n                }\n            }\n\n            rustBlockTemplate(\"impl Waiters for Client\") {\n                for (op in operations) {\n                    for (spec in op.waiters) {\n                        renderWaiterFnDeclaration(spec)\n                        rustTemplate(\n                            \"{ #{FluentBuilder}::new(self.handle.clone()) }\",\n                            \"FluentBuilder\" to spec.fluentBuilder,\n                        )\n                    }\n                }\n            }\n        }\n    }\n\n    private fun RustWriter.renderWaiterFnDeclaration(spec: WaiterSpec) {\n        val fnName = \"wait_until_${spec.waiterName.toSnakeCase()}\"\n        rustTemplate(\n            \"fn $fnName(&self) -> #{FluentBuilder}\",\n            \"FluentBuilder\" to spec.fluentBuilder,\n        )\n    }\n\n    private fun waiterModule(waiterName: String): RustModule =\n        RustModule.public(\n            RustReservedWords.escapeIfNeeded(waiterName.toSnakeCase(), EscapeFor.ModuleName),\n            ClientRustModule.waiters,\n            documentationOverride = \"Supporting types for the `${waiterName.toSnakeCase()}` waiter.\",\n        )\n\n    private fun waiterFluentBuilder(\n        waiterName: String,\n        waiter: Waiter,\n        operation: OperationShape,\n    ): RuntimeType {\n        val builderName = \"${waiterName.toPascalCase()}FluentBuilder\"\n        val waiterModule = waiterModule(waiterName)\n        return RuntimeType.forInlineFun(builderName, waiterModule) {\n            FluentBuilderGenerator(\n                codegenContext,\n                operation,\n                builderName = builderName,\n                config = WaiterFluentBuilderConfig(codegenContext, operation, waiter, waiterName, waiterModule),\n            ).render(this)\n        }\n    }\n}\n\nprivate class WaiterFluentBuilderConfig(\n    private val codegenContext: ClientCodegenContext,\n    private val operation: OperationShape,\n    private val waiter: Waiter,\n    private val waiterName: String,\n    private val waiterModule: RustModule,\n) : FluentBuilderConfig {\n    private val model = codegenContext.model\n    private val runtimeConfig = codegenContext.runtimeConfig\n    private val symbolProvider = codegenContext.symbolProvider\n\n    private val scope =\n        arrayOf(\n            *preludeScope,\n            \"ConfigBag\" to RuntimeType.configBag(runtimeConfig),\n            \"Duration\" to RuntimeType.Duration,\n            \"Error\" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve(\"client::interceptors::context::Error\"),\n            \"FinalPoll\" to RuntimeType.smithyRuntimeApiClient(runtimeConfig).resolve(\"client::waiters::FinalPoll\"),\n            \"HttpResponse\" to\n                RuntimeType.smithyRuntimeApiClient(runtimeConfig)\n                    .resolve(\"client::orchestrator::HttpResponse\"),\n            \"Operation\" to symbolProvider.toSymbol(operation),\n            \"OperationError\" to symbolProvider.symbolForOperationError(operation),\n            \"OperationOutput\" to symbolProvider.toSymbol(operation.outputShape(model)),\n            \"SdkError\" to RuntimeType.sdkError(runtimeConfig),\n            \"WaiterError\" to\n                RuntimeType.smithyRuntimeApiClient(runtimeConfig)\n                    .resolve(\"client::waiters::error::WaiterError\"),\n            \"WaiterOrchestrator\" to RuntimeType.smithyRuntime(runtimeConfig).resolve(\"client::waiters::WaiterOrchestrator\"),\n            \"attach_waiter_tracing_span\" to RuntimeType.smithyRuntime(runtimeConfig).resolve(\"client::waiters::attach_waiter_tracing_span\"),\n        )\n\n    override fun includeConfigOverride(): Boolean = false\n\n    override fun includePaginators(): Boolean = false\n\n    override fun documentBuilder(): Writable =\n        writable {\n            docs(\n                \"\"\"\n                Fluent builder for the `${waiterName.toSnakeCase()}` waiter.\n\n                This builder is intended to be used similar to the other fluent builders for\n                normal operations on the client. However, instead of a `send` method, it has\n                a `wait` method that takes a maximum amount of time to wait.\n\n                Construct this fluent builder using the client by importing the\n                [`Waiters`](crate::client::Waiters) trait and calling the methods\n                prefixed with `wait_until`.\n                \"\"\",\n            )\n        }\n\n    override fun sendMethods(): Writable =\n        writable {\n            val waiterDocs = waiter.documentation.orNull() ?: \"Wait for `${waiterName.toSnakeCase()}`\"\n            docs(waiterDocs)\n            rustTemplate(\n                \"\"\"\n                pub async fn wait(self, max_wait: #{Duration}) -> #{Result}<#{FinalPollAlias}, #{WaiterErrorAlias}> {\n                    let input = self.inner.build()\n                        .map_err(#{WaiterError}::construction_failure)?;\n                    let runtime_plugins = #{Operation}::operation_runtime_plugins(\n                        self.handle.runtime_plugins.clone(),\n                        &self.handle.conf,\n                        #{None},\n                    ).with_operation_plugin(#{WaiterFeatureTrackerRuntimePlugin}::new());\n                    let mut cfg = #{ConfigBag}::base();\n                    let runtime_components_builder = runtime_plugins.apply_client_configuration(&mut cfg)\n                        .map_err(#{WaiterError}::construction_failure)?;\n                    let time_components = runtime_components_builder.into_time_components();\n                    let sleep_impl = time_components.sleep_impl().expect(\"a sleep impl is required by waiters\");\n                    let time_source = time_components.time_source().expect(\"a time source is required by waiters\");\n\n                    #{acceptor}\n                    let operation = move || {\n                        let input = input.clone();\n                        let runtime_plugins = runtime_plugins.clone();\n                        async move {\n                            #{Operation}::orchestrate(&runtime_plugins, input).await\n                        }\n                    };\n                    let orchestrator = #{WaiterOrchestrator}::builder()\n                        .min_delay(#{Duration}::from_secs(${waiter.minDelay}))\n                        .max_delay(#{Duration}::from_secs(${waiter.maxDelay}))\n                        .max_wait(max_wait)\n                        .time_source(time_source)\n                        .sleep_impl(sleep_impl)\n                        .acceptor(acceptor)\n                        .operation(operation)\n                        .build();\n                    #{attach_waiter_tracing_span}(orchestrator.orchestrate()).await\n                }\n                \"\"\",\n                *scope,\n                \"acceptor\" to\n                    writable {\n                        WaiterAcceptorGenerator(codegenContext, operation, waiter, \"input\").render(this)\n                    },\n                \"FinalPollAlias\" to finalPollTypeAlias(),\n                \"WaiterErrorAlias\" to waiterErrorTypeAlias(),\n                \"WaiterFeatureTrackerRuntimePlugin\" to\n                    RuntimeType.forInlineDependency(\n                        InlineDependency.sdkFeatureTracker(runtimeConfig),\n                    ).resolve(\"waiter::WaiterFeatureTrackerRuntimePlugin\"),\n            )\n        }\n\n    private fun finalPollTypeAlias(): RuntimeType =\n        \"${waiterName.toPascalCase()}FinalPoll\".let { name ->\n            RuntimeType.forInlineFun(name, waiterModule) {\n                docs(\"Successful return type for the `${waiterName.toSnakeCase()}` waiter.\")\n                rustTemplate(\n                    \"pub type $name = #{FinalPoll}<#{OperationOutput}, #{SdkError}<#{OperationError}, #{HttpResponse}>>;\",\n                    *scope,\n                )\n            }\n        }\n\n    private fun waiterErrorTypeAlias(): RuntimeType =\n        \"WaitUntil${waiterName.toPascalCase()}Error\".let { name ->\n            RuntimeType.forInlineFun(name, waiterModule) {\n                docs(\"Error type for the `${waiterName.toSnakeCase()}` waiter.\")\n                rustTemplate(\"pub type $name = #{WaiterError}<#{OperationOutput}, #{OperationError}>;\", *scope)\n            }\n        }\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/waiters/WaiterAcceptorGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\npackage software.amazon.smithy.rust.codegen.client.smithy.generators.waiters\n\nimport software.amazon.smithy.model.node.Node\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\nimport software.amazon.smithy.rust.codegen.core.util.inputShape\nimport software.amazon.smithy.rust.codegen.core.util.outputShape\nimport software.amazon.smithy.waiters.AcceptorState\nimport software.amazon.smithy.waiters.Waiter\n\nclass WaiterAcceptorGenerator(\n    private val codegenContext: ClientCodegenContext,\n    operation: OperationShape,\n    private val waiter: Waiter,\n    private val inputName: String,\n) {\n    private val symbolProvider = codegenContext.symbolProvider\n    private val runtimeConfig = codegenContext.runtimeConfig\n    private val model = codegenContext.model\n\n    private val operationName = symbolProvider.toSymbol(operation).name\n    private val inputShape = operation.inputShape(model)\n    private val outputShape = operation.outputShape(model)\n    private val errorType = symbolProvider.symbolForOperationError(operation)\n\n    private val scope =\n        arrayOf(\n            *preludeScope,\n            \"AcceptorState\" to RuntimeType.smithyRuntime(runtimeConfig).resolve(\"client::waiters::AcceptorState\"),\n            \"Output\" to symbolProvider.toSymbol(outputShape),\n            \"Error\" to errorType,\n        )\n\n    fun render(writer: RustWriter) {\n        val matchers =\n            waiter.acceptors.map { acceptor ->\n                acceptor to\n                    RustWaiterMatcherGenerator(codegenContext, operationName, inputShape, outputShape).generate(\n                        errorType,\n                        acceptor.matcher,\n                    )\n            }\n\n        val anyRequiresInput = matchers.any { it.first.matcher.requiresInput() }\n        val inputPrep =\n            when {\n                anyRequiresInput -> \"let acceptor_input = $inputName.clone();\"\n                else -> \"\"\n            }\n        writer.rustTemplate(\n            \"\"\"\n            $inputPrep\n            let acceptor = move |result: #{Result}<&#{Output}, &#{Error}>| {\n                #{acceptors}\n            };\n            \"\"\",\n            *scope,\n            \"acceptors\" to\n                writable {\n                    for ((acceptor, matcherFn) in matchers) {\n                        val condition =\n                            when {\n                                acceptor.matcher.requiresInput() -> \"#{matcher_fn}(&acceptor_input, result)\"\n                                else -> \"#{matcher_fn}(result)\"\n                            }\n                        val matcherComment = Node.printJson(acceptor.matcher.toNode())\n                        val acceptorState = \"#{AcceptorState}::${acceptor.state.rustName()}\"\n                        rustTemplate(\n                            \"\"\"\n                            // Matches: $matcherComment\n                            if $condition { return $acceptorState; }\n                            \"\"\",\n                            *scope,\n                            \"matcher_fn\" to matcherFn,\n                        )\n                    }\n                    rustTemplate(\"#{AcceptorState}::NoAcceptorsMatched\", *scope)\n                },\n        )\n    }\n\n    private fun AcceptorState.rustName(): String =\n        when (this) {\n            AcceptorState.SUCCESS -> \"Success\"\n            AcceptorState.FAILURE -> \"Failure\"\n            AcceptorState.RETRY -> \"Retry\"\n        }\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/protocols/ClientProtocolLoader.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.protocols\n\nimport software.amazon.smithy.aws.traits.protocols.AwsJson1_0Trait\nimport software.amazon.smithy.aws.traits.protocols.AwsJson1_1Trait\nimport software.amazon.smithy.aws.traits.protocols.AwsQueryCompatibleTrait\nimport software.amazon.smithy.aws.traits.protocols.AwsQueryTrait\nimport software.amazon.smithy.aws.traits.protocols.Ec2QueryTrait\nimport software.amazon.smithy.aws.traits.protocols.RestJson1Trait\nimport software.amazon.smithy.aws.traits.protocols.RestXmlTrait\nimport software.amazon.smithy.model.shapes.ServiceShape\nimport software.amazon.smithy.protocol.traits.Rpcv2CborTrait\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.OperationGenerator\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenContext\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.protocol.ProtocolSupport\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.AwsJson\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.AwsJsonVersion\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.AwsQueryCompatible\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.AwsQueryProtocol\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.Ec2QueryProtocol\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.ParseErrorMetadataParams\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.Protocol\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.ProtocolGeneratorFactory\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.ProtocolLoader\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.ProtocolMap\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.RestJson\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.RestXml\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.RpcV2Cbor\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\n\nclass ClientProtocolLoader(supportedProtocols: ProtocolMap<OperationGenerator, ClientCodegenContext>) :\n    ProtocolLoader<OperationGenerator, ClientCodegenContext>(supportedProtocols) {\n    companion object {\n        val DefaultProtocols =\n            mapOf(\n                Rpcv2CborTrait.ID to ClientRpcV2CborFactory(),\n                AwsJson1_0Trait.ID to ClientAwsJsonFactory(AwsJsonVersion.Json10),\n                AwsJson1_1Trait.ID to ClientAwsJsonFactory(AwsJsonVersion.Json11),\n                RestJson1Trait.ID to ClientRestJsonFactory(),\n                RestXmlTrait.ID to ClientRestXmlFactory(),\n                AwsQueryTrait.ID to ClientAwsQueryFactory(),\n                Ec2QueryTrait.ID to ClientEc2QueryFactory(),\n            )\n        val Default = ClientProtocolLoader(DefaultProtocols)\n    }\n}\n\nprivate val CLIENT_PROTOCOL_SUPPORT =\n    ProtocolSupport(\n        // Client protocol codegen enabled\n        requestSerialization = true,\n        requestBodySerialization = true,\n        responseDeserialization = true,\n        errorDeserialization = true,\n        // Server protocol codegen disabled\n        requestDeserialization = false,\n        requestBodyDeserialization = false,\n        responseSerialization = false,\n        errorSerialization = false,\n    )\n\nprivate class ClientAwsJsonFactory(private val version: AwsJsonVersion) :\n    ProtocolGeneratorFactory<OperationGenerator, ClientCodegenContext> {\n    override fun protocol(codegenContext: ClientCodegenContext): Protocol =\n        if (compatibleWithAwsQuery(codegenContext.serviceShape, version)) {\n            AwsQueryCompatible(\n                codegenContext, AwsJson(codegenContext, version),\n                ParseErrorMetadataParams(\n                    RuntimeType.smithyJson(codegenContext.runtimeConfig)\n                        .resolve(\"deserialize::error::DeserializeError\"),\n                    writable {\n                        rustTemplate(\n                            \"\"\"\n                            #{parse_error_metadata}(response_body, response_headers)?\n                            \"\"\",\n                            \"parse_error_metadata\" to\n                                RuntimeType.jsonErrors(codegenContext.runtimeConfig)\n                                    .resolve(\"parse_error_metadata\"),\n                        )\n                    },\n                ),\n            )\n        } else {\n            AwsJson(codegenContext, version)\n        }\n\n    override fun buildProtocolGenerator(codegenContext: ClientCodegenContext): OperationGenerator =\n        OperationGenerator(codegenContext, protocol(codegenContext))\n\n    override fun support(): ProtocolSupport = CLIENT_PROTOCOL_SUPPORT\n\n    private fun compatibleWithAwsQuery(\n        serviceShape: ServiceShape,\n        version: AwsJsonVersion,\n    ) = serviceShape.hasTrait<AwsQueryCompatibleTrait>() && version == AwsJsonVersion.Json10\n}\n\nprivate class ClientAwsQueryFactory : ProtocolGeneratorFactory<OperationGenerator, ClientCodegenContext> {\n    override fun protocol(codegenContext: ClientCodegenContext): Protocol = AwsQueryProtocol(codegenContext)\n\n    override fun buildProtocolGenerator(codegenContext: ClientCodegenContext): OperationGenerator =\n        OperationGenerator(codegenContext, protocol(codegenContext))\n\n    override fun support(): ProtocolSupport = CLIENT_PROTOCOL_SUPPORT\n}\n\nprivate class ClientRestJsonFactory : ProtocolGeneratorFactory<OperationGenerator, ClientCodegenContext> {\n    override fun protocol(codegenContext: ClientCodegenContext): Protocol = RestJson(codegenContext)\n\n    override fun buildProtocolGenerator(codegenContext: ClientCodegenContext): OperationGenerator =\n        OperationGenerator(codegenContext, RestJson(codegenContext))\n\n    override fun support(): ProtocolSupport = CLIENT_PROTOCOL_SUPPORT\n}\n\nprivate class ClientEc2QueryFactory : ProtocolGeneratorFactory<OperationGenerator, ClientCodegenContext> {\n    override fun protocol(codegenContext: ClientCodegenContext): Protocol = Ec2QueryProtocol(codegenContext)\n\n    override fun buildProtocolGenerator(codegenContext: ClientCodegenContext): OperationGenerator =\n        OperationGenerator(codegenContext, protocol(codegenContext))\n\n    override fun support(): ProtocolSupport = CLIENT_PROTOCOL_SUPPORT\n}\n\nclass ClientRestXmlFactory(\n    private val generator: (CodegenContext) -> Protocol = { RestXml(it) },\n) : ProtocolGeneratorFactory<OperationGenerator, ClientCodegenContext> {\n    override fun protocol(codegenContext: ClientCodegenContext): Protocol = generator(codegenContext)\n\n    override fun buildProtocolGenerator(codegenContext: ClientCodegenContext): OperationGenerator =\n        OperationGenerator(codegenContext, protocol(codegenContext))\n\n    override fun support(): ProtocolSupport = CLIENT_PROTOCOL_SUPPORT\n}\n\nclass ClientRpcV2CborFactory : ProtocolGeneratorFactory<OperationGenerator, ClientCodegenContext> {\n    override fun protocol(codegenContext: ClientCodegenContext): Protocol =\n        if (compatibleWithAwsQuery(codegenContext.serviceShape)) {\n            AwsQueryCompatible(\n                codegenContext, RpcV2Cbor(codegenContext),\n                ParseErrorMetadataParams(\n                    RuntimeType.smithyCbor(codegenContext.runtimeConfig)\n                        .resolve(\"decode::DeserializeError\"),\n                    writable {\n                        rustTemplate(\n                            \"\"\"\n                            #{parse_error_metadata}(_response_status, response_headers, response_body)?\n                            \"\"\",\n                            \"parse_error_metadata\" to\n                                RuntimeType.cborErrors(codegenContext.runtimeConfig)\n                                    .resolve(\"parse_error_metadata\"),\n                        )\n                    },\n                ),\n            )\n        } else {\n            RpcV2Cbor(codegenContext)\n        }\n\n    override fun buildProtocolGenerator(codegenContext: ClientCodegenContext): OperationGenerator =\n        OperationGenerator(codegenContext, protocol(codegenContext))\n\n    override fun support(): ProtocolSupport = CLIENT_PROTOCOL_SUPPORT\n\n    private fun compatibleWithAwsQuery(serviceShape: ServiceShape) = serviceShape.hasTrait<AwsQueryCompatibleTrait>()\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/protocols/HttpBoundProtocolGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.protocols\n\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.http.HttpMessageType\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.protocol.ProtocolPayloadGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.EventStreamBodyParams\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.HttpBoundProtocolPayloadGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.Protocol\n\nclass ClientHttpBoundProtocolPayloadGenerator(\n    private val codegenContext: ClientCodegenContext,\n    protocol: Protocol,\n) : ProtocolPayloadGenerator by HttpBoundProtocolPayloadGenerator(\n        codegenContext, protocol, HttpMessageType.REQUEST,\n        renderEventStreamBody = { writer, params ->\n            writer.rustTemplate(\n                \"\"\"\n                {\n                    let error_marshaller = #{errorMarshallerConstructorFn}();\n                    let marshaller = #{marshallerConstructorFn}();\n                    let (signer, signer_sender) = #{DeferredSigner}::new();\n                    _cfg.interceptor_state().store_put(signer_sender);\n                    #{SdkBody}::from_body_1_x(#{http_body_util}::StreamBody::new(#{event_stream:W}))\n                }\n                \"\"\",\n                \"http_body_util\" to CargoDependency.HttpBodyUtil01x.toType(),\n                \"SdkBody\" to\n                    CargoDependency.smithyTypes(codegenContext.runtimeConfig).withFeature(\"http-body-1-x\")\n                        .toType().resolve(\"body::SdkBody\"),\n                \"aws_smithy_http\" to RuntimeType.smithyHttp(codegenContext.runtimeConfig),\n                \"DeferredSigner\" to\n                    RuntimeType.smithyEventStream(codegenContext.runtimeConfig)\n                        .resolve(\"frame::DeferredSigner\"),\n                \"marshallerConstructorFn\" to params.eventStreamMarshallerGenerator.render(),\n                \"errorMarshallerConstructorFn\" to params.errorMarshallerConstructorFn,\n                \"event_stream\" to (\n                    eventStreamWithInitialRequest(codegenContext, protocol, params)\n                        ?: messageStreamAdaptor(params.outerName, params.memberName)\n                ),\n            )\n        },\n    )\n\nprivate fun eventStreamWithInitialRequest(\n    codegenContext: ClientCodegenContext,\n    protocol: Protocol,\n    params: EventStreamBodyParams,\n): Writable? {\n    val parser = protocol.structuredDataSerializer().operationInputSerializer(params.operationShape) ?: return null\n\n    if (codegenContext.protocolImpl?.httpBindingResolver?.handlesEventStreamInitialRequest(params.operationShape) != true) {\n        return null\n    }\n\n    val smithyHttp = RuntimeType.smithyHttp(codegenContext.runtimeConfig)\n    val eventOrInitial = smithyHttp.resolve(\"event_stream::EventOrInitial\")\n    val eventOrInitialMarshaller = smithyHttp.resolve(\"event_stream::EventOrInitialMarshaller\")\n\n    return writable {\n        rustTemplate(\n            \"\"\"\n            {\n                use #{futures_util}::StreamExt;\n                let body = #{parser}(&input)?;\n                let initial_message = #{initial_message}(body);\n\n                // Wrap the marshaller to handle both initial and regular messages\n                let wrapped_marshaller = #{EventOrInitialMarshaller}::new(marshaller);\n\n                // Create stream with initial message\n                let initial_stream = #{futures_util}::stream::once(async move {\n                    #{Ok}(#{EventOrInitial}::InitialMessage(initial_message))\n                });\n\n                // Extract inner stream and map events\n                let event_stream = ${params.outerName}.${params.memberName}.into_inner()\n                    .map(|result| result.map(#{EventOrInitial}::Event));\n\n                // Chain streams and convert to EventStreamSender\n                let combined = initial_stream.chain(event_stream);\n                #{EventStreamSender}::from(combined)\n                    .into_body_stream(wrapped_marshaller, error_marshaller, signer)\n            }\n            \"\"\",\n            *preludeScope,\n            \"futures_util\" to CargoDependency.FuturesUtil.toType(),\n            \"initial_message\" to params.eventStreamMarshallerGenerator.renderInitialRequestGenerator(params.payloadContentType),\n            \"parser\" to parser,\n            \"EventOrInitial\" to eventOrInitial,\n            \"EventOrInitialMarshaller\" to eventOrInitialMarshaller,\n            \"EventStreamSender\" to smithyHttp.resolve(\"event_stream::EventStreamSender\"),\n        )\n    }\n}\n\nprivate fun messageStreamAdaptor(\n    outerName: String,\n    memberName: String,\n) = writable {\n    rust(\"$outerName.$memberName.into_body_stream(marshaller, error_marshaller, signer)\")\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/traits/IncompatibleWithStalledStreamProtectionTrait.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.traits\n\nimport software.amazon.smithy.model.node.Node\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.model.traits.AnnotationTrait\n\n/**\n * Indicates that an operation shape is incompatible with stalled stream protection.\n */\ninternal class IncompatibleWithStalledStreamProtectionTrait : AnnotationTrait(ID, Node.objectNode()) {\n    companion object {\n        val ID: ShapeId = ShapeId.from(\"software.amazon.smithy.rust.codegen.client.smithy.traits#incompatibleWithStalledStreamProtectionTrait\")\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/traits/IsTruncatedPaginatorTrait.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.traits\n\nimport software.amazon.smithy.model.node.Node\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.model.traits.AnnotationTrait\n\n/**\n * Indicates that an operation should use the IsTruncated field for detecting the end of pagination.\n */\nclass IsTruncatedPaginatorTrait : AnnotationTrait(ID, Node.objectNode()) {\n    companion object {\n        val ID: ShapeId =\n            ShapeId.from(\"software.amazon.smithy.rust.codegen.client.smithy.traits#isTruncatedPaginatorTrait\")\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/transformers/AddErrorMessage.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.transformers\n\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.traits.ErrorTrait\nimport software.amazon.smithy.model.transform.ModelTransformer\nimport software.amazon.smithy.rust.codegen.core.util.errorMessageMember\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\nimport java.util.logging.Logger\n\n/**\n * Ensure that all errors have error messages.\n *\n * Not all errors are modeled with an error message field. However, in many cases, the server can still send an error.\n * If an error, specifically, a structure shape with the error trait does not have a member `message` or `Message`,\n * this transformer will add a `Message` member targeting a string.\n *\n * This ensures that we always generate a modeled error message field enabling end users to easily extract the error\n * message when present.\n *\n * Currently, this is run on all models, however, we may restrict this to AWS SDK code generation in the future.\n */\nobject AddErrorMessage {\n    private val logger = Logger.getLogger(\"AddErrorMessage\")\n\n    /**\n     * Ensure that all errors have error messages.\n     */\n    fun transform(model: Model): Model {\n        return ModelTransformer.create().mapShapes(model) { shape ->\n            val addMessageField = shape.hasTrait<ErrorTrait>() && shape is StructureShape && shape.errorMessageMember() == null\n            if (addMessageField && shape is StructureShape) {\n                logger.info(\"Adding message field to ${shape.id}\")\n                shape.toBuilder().addMember(\"Message\", ShapeId.from(\"smithy.api#String\")).build()\n            } else {\n                shape\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/transformers/DisableStalledStreamProtection.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.transformers\n\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.transform.ModelTransformer\nimport software.amazon.smithy.rust.codegen.client.smithy.traits.IncompatibleWithStalledStreamProtectionTrait\nimport software.amazon.smithy.rust.codegen.core.util.isEventStream\nimport software.amazon.smithy.rust.codegen.core.util.letIf\nimport java.util.logging.Logger\n\n/**\n * This class provides model/shape transformers that disable stalled stream protection due to inherent incompatibility with certain operations.\n */\nobject DisableStalledStreamProtection {\n    private val logger: Logger = Logger.getLogger(javaClass.name)\n\n    /**\n     * Removes stalled stream protection from a model when it meets any of the following conditions:\n     *\n     * * The operations support event streams\n     */\n    fun transformModel(model: Model): Model =\n        ModelTransformer.create().mapShapes(model) { shape ->\n            shape.letIf(shape is OperationShape && shape.isEventStream(model)) {\n                logger.info(\"$it is an event stream operation, adding IncompatibleWithStalledStreamProtection trait\")\n                (shape as OperationShape).toBuilder().addTrait(IncompatibleWithStalledStreamProtectionTrait()).build()\n            }\n        }\n\n    /**\n     * Removes stalled stream protection from the given [operation].\n     *\n     * Use this method when removal criteria are specific to the service operation and cannot be generalized for use with [transformModel],\n     * e.g., S3's CopyObject operation.\n     */\n    fun transformOperation(operation: OperationShape): OperationShape {\n        logger.info(\"Adding IncompatibleWithStalledStreamProtection trait to $operation\")\n        return operation.toBuilder().addTrait(IncompatibleWithStalledStreamProtectionTrait()).build()\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/testutil/ClientCodegenIntegrationTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.testutil\n\nimport software.amazon.smithy.build.PluginContext\nimport software.amazon.smithy.build.SmithyBuildPlugin\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.RustClientCodegenPlugin\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.core.smithy.RustCrate\nimport software.amazon.smithy.rust.codegen.core.testutil.IntegrationTestParams\nimport software.amazon.smithy.rust.codegen.core.testutil.codegenIntegrationTest\nimport java.nio.file.Path\n\nfun clientIntegrationTest(\n    model: Model,\n    params: IntegrationTestParams =\n        IntegrationTestParams(cargoCommand = \"cargo test --features behavior-version-latest\"),\n    additionalDecorators: List<ClientCodegenDecorator> = listOf(),\n    buildPlugin: ClientDecoratableBuildPlugin = RustClientCodegenPlugin(),\n    environment: Map<String, String> = mapOf(),\n    test: (ClientCodegenContext, RustCrate) -> Unit = { _, _ -> },\n): Path {\n    fun invokeRustCodegenPlugin(ctx: PluginContext) {\n        val codegenDecorator =\n            object : ClientCodegenDecorator {\n                override val name: String = \"Add tests\"\n                override val order: Byte = 0\n\n                override fun classpathDiscoverable(): Boolean = false\n\n                override fun extras(\n                    codegenContext: ClientCodegenContext,\n                    rustCrate: RustCrate,\n                ) {\n                    test(codegenContext, rustCrate)\n                }\n            }\n        buildPlugin.executeWithDecorator(ctx, codegenDecorator, *additionalDecorators.toTypedArray())\n    }\n    return codegenIntegrationTest(model, params, invokePlugin = ::invokeRustCodegenPlugin, environment)\n}\n\n/**\n * A `SmithyBuildPlugin` that accepts an additional decorator.\n *\n * This exists to allow tests to easily customize the _real_ build without needing to list out customizations\n * or attempt to manually discover them from the path.\n */\nabstract class ClientDecoratableBuildPlugin : SmithyBuildPlugin {\n    abstract fun executeWithDecorator(\n        context: PluginContext,\n        vararg decorator: ClientCodegenDecorator,\n    )\n\n    override fun execute(context: PluginContext) {\n        executeWithDecorator(context)\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/testutil/EndpointTestDiscovery.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.testutil\n\nimport software.amazon.smithy.aws.traits.protocols.AwsJson1_0Trait\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.knowledge.ServiceIndex\nimport software.amazon.smithy.model.loader.ModelAssembler\nimport software.amazon.smithy.model.loader.ModelDiscovery\nimport software.amazon.smithy.model.transform.ModelTransformer\nimport software.amazon.smithy.rust.codegen.core.util.PANIC\nimport software.amazon.smithy.rust.codegen.core.util.letIf\n\nclass EndpointTestDiscovery {\n    fun testCases(): List<Model> {\n        // Find models from smithy-rules-engine-tests on the classpath\n        val testModels =\n            ModelDiscovery.findModels().filter { url ->\n                url.toString().contains(\"smithy-rules-engine-tests\") &&\n                    url.toString().endsWith(\".smithy\")\n            }\n\n        // Find trait definitions (exclude test models)\n        val traitModels =\n            ModelDiscovery.findModels().filter { url ->\n                val urlString = url.toString()\n                // Include trait definitions but exclude test models\n                !urlString.contains(\"smithy-rules-engine-tests\") &&\n                    !urlString.contains(\"smithy-protocol-tests\") &&\n                    urlString.endsWith(\".smithy\")\n            }\n\n        // Assemble each test model individually with trait definitions\n        val assembledModels =\n            testModels.map { testUrl ->\n                val assembler = ModelAssembler()\n                // Add all trait definitions\n                traitModels.forEach { assembler.addImport(it) }\n                // Add the specific test model\n                assembler.addImport(testUrl)\n                assembler.assemble().unwrap()\n            }\n\n        // Add protocol trait if needed\n        return assembledModels.map { model ->\n            if (model.serviceShapes.size > 1) {\n                PANIC(\"too many services\")\n            }\n            val service = model.serviceShapes.first()\n            if (ServiceIndex.of(model).getProtocols(service).isEmpty()) {\n                ModelTransformer.create().mapShapes(model) { s ->\n                    s.letIf(s == service) {\n                        s.asServiceShape().get().toBuilder().addTrait(\n                            AwsJson1_0Trait.builder().build(),\n                        ).build()\n                    }\n                }\n            } else {\n                model\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/testutil/TestHelpers.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.testutil\n\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.knowledge.NullableIndex\nimport software.amazon.smithy.model.node.ObjectNode\nimport software.amazon.smithy.model.shapes.ServiceShape\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenConfig\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientModuleProvider\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientRustSettings\nimport software.amazon.smithy.rust.codegen.client.smithy.RustClientCodegenPlugin\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.CombinedClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig\nimport software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProviderConfig\nimport software.amazon.smithy.rust.codegen.core.testutil.TestModuleDocProvider\nimport software.amazon.smithy.rust.codegen.core.testutil.TestRuntimeConfig\nimport software.amazon.smithy.rust.codegen.core.testutil.TestWriterDelegator\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\n\nfun testClientRustSettings(\n    service: ShapeId = ShapeId.from(\"notrelevant#notrelevant\"),\n    moduleName: String = \"test-module\",\n    moduleVersion: String = \"0.0.1\",\n    moduleAuthors: List<String> = listOf(\"notrelevant\"),\n    moduleDescription: String = \"not relevant\",\n    moduleRepository: String? = null,\n    runtimeConfig: RuntimeConfig = TestRuntimeConfig,\n    codegenConfig: ClientCodegenConfig = ClientCodegenConfig(),\n    license: String? = null,\n    examplesUri: String? = null,\n    minimumSupportedRustVersion: String? = null,\n    customizationConfig: ObjectNode? = null,\n) = ClientRustSettings(\n    service,\n    moduleName,\n    moduleVersion,\n    moduleAuthors,\n    moduleDescription,\n    moduleRepository,\n    runtimeConfig,\n    codegenConfig,\n    license,\n    examplesUri,\n    minimumSupportedRustVersion,\n    customizationConfig,\n)\n\nval TestClientRustSymbolProviderConfig =\n    RustSymbolProviderConfig(\n        runtimeConfig = TestRuntimeConfig,\n        renameExceptions = true,\n        nullabilityCheckMode = NullableIndex.CheckMode.CLIENT_ZERO_VALUE_V1,\n        moduleProvider = ClientModuleProvider,\n    )\n\nprivate class ClientTestCodegenDecorator : ClientCodegenDecorator {\n    override val name = \"test\"\n    override val order: Byte = 0\n}\n\nfun testSymbolProvider(\n    model: Model,\n    serviceShape: ServiceShape? = null,\n): RustSymbolProvider =\n    RustClientCodegenPlugin.baseSymbolProvider(\n        testClientRustSettings(),\n        model,\n        serviceShape ?: ServiceShape.builder().version(\"test\").id(\"test#Service\").build(),\n        TestClientRustSymbolProviderConfig,\n        ClientTestCodegenDecorator(),\n    )\n\nfun testClientCodegenContext(\n    model: Model = \"namespace empty\".asSmithyModel(),\n    symbolProvider: RustSymbolProvider? = null,\n    serviceShape: ServiceShape? = null,\n    settings: ClientRustSettings = testClientRustSettings(),\n    rootDecorator: ClientCodegenDecorator? = null,\n): ClientCodegenContext =\n    ClientCodegenContext(\n        model,\n        symbolProvider ?: testSymbolProvider(model),\n        TestModuleDocProvider,\n        serviceShape\n            ?: model.serviceShapes.firstOrNull()\n            ?: ServiceShape.builder().version(\"test\").id(\"test#Service\").build(),\n        ShapeId.from(\"test#Protocol\"),\n        settings,\n        rootDecorator ?: CombinedClientCodegenDecorator(emptyList()),\n    )\n\nfun ClientCodegenContext.withEnableUserConfigurableRuntimePlugins(\n    enableUserConfigurableRuntimePlugins: Boolean,\n): ClientCodegenContext =\n    copy(settings = settings.copy(codegenConfig = settings.codegenConfig.copy(enableUserConfigurableRuntimePlugins = enableUserConfigurableRuntimePlugins)))\n\nfun TestWriterDelegator.clientRustSettings() =\n    testClientRustSettings(\n        service = ShapeId.from(\"fake#Fake\"),\n        moduleName = \"test_${baseDir.toFile().nameWithoutExtension}\",\n        codegenConfig = codegenConfig as ClientCodegenConfig,\n    )\n\nfun TestWriterDelegator.clientCodegenContext(model: Model) =\n    testClientCodegenContext(model, settings = clientRustSettings())\n"
  },
  {
    "path": "codegen-client/src/main/resources/META-INF/services/software.amazon.smithy.build.SmithyBuildPlugin",
    "content": "#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\nsoftware.amazon.smithy.rust.codegen.client.smithy.RustClientCodegenPlugin\n"
  },
  {
    "path": "codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/BigNumberPrecisionTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy\n\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest\nimport software.amazon.smithy.rust.codegen.core.rustlang.rawRust\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.unitTest\n\nclass BigNumberPrecisionTest {\n    @Test\n    fun `test BigInteger and BigDecimal round trip through serializers with restJson1`() {\n        val model =\n            \"\"\"\n            namespace test\n            use aws.protocols#restJson1\n\n            @restJson1\n            service TestService {\n                version: \"2026-01-01\",\n                operations: [TestOp]\n            }\n\n            @http(uri: \"/test\", method: \"POST\")\n            operation TestOp {\n                input: TestInput,\n                output: TestOutput\n            }\n\n            structure TestInput {\n                bigInt: BigInteger,\n                bigDec: BigDecimal\n            }\n\n            structure TestOutput {\n                bigInt: BigInteger,\n                bigDec: BigDecimal\n            }\n            \"\"\".asSmithyModel()\n\n        clientIntegrationTest(model) { _, rustCrate ->\n            rustCrate.unitTest(\"big_number_round_trip\") {\n                rawRust(\n                    \"\"\"\n                    use aws_smithy_types::{BigInteger, BigDecimal};\n                    use std::str::FromStr;\n\n                    // Test values that exceed native type limits\n                    let big_int_str = \"99999999999999999999999999\";  // > u64::MAX\n                    let big_dec_precision_str = \"3.141592653589793238462643383279502884197\";  // > f64 precision (15-17 digits)\n                    let big_dec_magnitude_str = \"1.8e308\";  // > f64::MAX - tokenizer uses NaN for validation\n\n                    // Test 1: High precision BigDecimal\n                    let input = crate::operation::test_op::TestOpInput::builder()\n                        .big_int(BigInteger::from_str(big_int_str).unwrap())\n                        .big_dec(BigDecimal::from_str(big_dec_precision_str).unwrap())\n                        .build()\n                        .unwrap();\n\n                    let json_body = crate::protocol_serde::shape_test_op::ser_test_op_input(&input).unwrap();\n                    let serialized = String::from_utf8(json_body.bytes().unwrap().to_vec()).unwrap();\n\n                    assert!(serialized.contains(big_int_str));\n                    assert!(serialized.contains(big_dec_precision_str));\n\n                    // Test 2: Large magnitude BigDecimal (> f64::MAX)\n                    let mut json_response = String::from(r#\"{\"bigInt\":\"#);\n                    json_response.push_str(big_int_str);\n                    json_response.push_str(r#\",\"bigDec\":\"#);\n                    json_response.push_str(big_dec_magnitude_str);\n                    json_response.push('}');\n\n                    let headers = ::aws_smithy_runtime_api::http::Headers::new();\n                    let output = crate::protocol_serde::shape_test_op::de_test_op_http_response(\n                        200,\n                        &headers,\n                        json_response.as_bytes()\n                    ).unwrap();\n\n                    assert_eq!(output.big_int.unwrap().as_ref(), big_int_str);\n                    assert_eq!(output.big_dec.unwrap().as_ref(), big_dec_magnitude_str);\n                    \"\"\",\n                )\n            }\n        }\n    }\n\n    @Test\n    fun `test BigInteger and BigDecimal round trip through serializers with restXml`() {\n        val model =\n            \"\"\"\n            namespace test\n            use aws.protocols#restXml\n\n            @restXml\n            service TestService {\n                version: \"2026-01-01\",\n                operations: [TestOp]\n            }\n\n            @http(uri: \"/test\", method: \"POST\")\n            operation TestOp {\n                input: TestInput,\n                output: TestOutput\n            }\n\n            structure TestInput {\n                bigInt: BigInteger,\n                bigDec: BigDecimal\n            }\n\n            structure TestOutput {\n                bigInt: BigInteger,\n                bigDec: BigDecimal\n            }\n            \"\"\".asSmithyModel()\n\n        clientIntegrationTest(model) { _, rustCrate ->\n            rustCrate.unitTest(\"big_number_round_trip_xml\") {\n                rawRust(\n                    \"\"\"\n                    use aws_smithy_types::{BigInteger, BigDecimal};\n                    use std::str::FromStr;\n\n                    // Test values that exceed native type limits\n                    let big_int_str = \"99999999999999999999999999\";  // > u64::MAX\n                    let big_dec_precision_str = \"3.141592653589793238462643383279502884197\";  // > f64 precision (15-17 digits)\n                    let big_dec_magnitude_str = \"1.8e308\";  // > f64::MAX (~1.7976931348623157e308)\n\n                    // Test 1: High precision BigDecimal\n                    let input = crate::operation::test_op::TestOpInput::builder()\n                        .big_int(BigInteger::from_str(big_int_str).unwrap())\n                        .big_dec(BigDecimal::from_str(big_dec_precision_str).unwrap())\n                        .build()\n                        .unwrap();\n\n                    let xml_body = crate::protocol_serde::shape_test_op::ser_test_op_op_input(&input).unwrap();\n                    let serialized = String::from_utf8(xml_body.bytes().unwrap().to_vec()).unwrap();\n\n                    assert!(serialized.contains(big_int_str));\n                    assert!(serialized.contains(big_dec_precision_str));\n\n                    // Test 2: Large magnitude BigDecimal - construct XML manually\n                    let mut xml_response = String::from(r#\"<TestOutput><bigInt>\"#);\n                    xml_response.push_str(big_int_str);\n                    xml_response.push_str(r#\"</bigInt><bigDec>\"#);\n                    xml_response.push_str(big_dec_magnitude_str);\n                    xml_response.push_str(r#\"</bigDec></TestOutput>\"#);\n\n                    let headers = ::aws_smithy_runtime_api::http::Headers::new();\n                    let output = crate::protocol_serde::shape_test_op::de_test_op_http_response(\n                        200,\n                        &headers,\n                        xml_response.as_bytes()\n                    ).unwrap();\n\n                    assert_eq!(output.big_int.unwrap().as_ref(), big_int_str);\n                    assert_eq!(output.big_dec.unwrap().as_ref(), big_dec_magnitude_str);\n                    \"\"\",\n                )\n            }\n        }\n    }\n\n    @Test\n    fun `test BigInteger and BigDecimal round trip through serializers with awsJson1_1`() {\n        val model =\n            \"\"\"\n            namespace test\n            use aws.protocols#awsJson1_1\n\n            @awsJson1_1\n            service TestService {\n                version: \"2023-01-01\",\n                operations: [TestOp]\n            }\n\n            operation TestOp {\n                input: TestInput,\n                output: TestOutput\n            }\n\n            structure TestInput {\n                bigInt: BigInteger,\n                bigDec: BigDecimal\n            }\n\n            structure TestOutput {\n                bigInt: BigInteger,\n                bigDec: BigDecimal\n            }\n            \"\"\".asSmithyModel()\n\n        clientIntegrationTest(model) { _, rustCrate ->\n            rustCrate.unitTest(\"big_number_round_trip_aws_json\") {\n                rawRust(\n                    \"\"\"\n                    use aws_smithy_types::{BigInteger, BigDecimal};\n                    use std::str::FromStr;\n\n                    // Test values that exceed native type limits\n                    let big_int_str = \"99999999999999999999999999\";  // > u64::MAX\n                    let big_dec_precision_str = \"3.141592653589793238462643383279502884197\";  // > f64 precision\n                    let big_dec_magnitude_str = \"1.8e308\";  // > f64::MAX\n\n                    // Test 1: High precision BigDecimal\n                    let input = crate::operation::test_op::TestOpInput::builder()\n                        .big_int(BigInteger::from_str(big_int_str).unwrap())\n                        .big_dec(BigDecimal::from_str(big_dec_precision_str).unwrap())\n                        .build()\n                        .unwrap();\n\n                    let json_body = crate::protocol_serde::shape_test_op::ser_test_op_input(&input).unwrap();\n                    let serialized = String::from_utf8(json_body.bytes().unwrap().to_vec()).unwrap();\n\n                    assert!(serialized.contains(big_int_str));\n                    assert!(serialized.contains(big_dec_precision_str));\n\n                    // Test 2: Large magnitude BigDecimal\n                    let mut json_response = String::from(r#\"{\"bigInt\":\"#);\n                    json_response.push_str(big_int_str);\n                    json_response.push_str(r#\",\"bigDec\":\"#);\n                    json_response.push_str(big_dec_magnitude_str);\n                    json_response.push('}');\n\n                    let headers = ::aws_smithy_runtime_api::http::Headers::new();\n                    let output = crate::protocol_serde::shape_test_op::de_test_op_http_response(\n                        200,\n                        &headers,\n                        json_response.as_bytes()\n                    ).unwrap();\n\n                    assert_eq!(output.big_int.unwrap().as_ref(), big_int_str);\n                    assert_eq!(output.big_dec.unwrap().as_ref(), big_dec_magnitude_str);\n                    \"\"\",\n                )\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/ClientCodegenVisitorTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy\n\nimport io.kotest.matchers.shouldBe\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.rust.codegen.client.smithy.customizations.ClientCustomizations\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.CombinedClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.RequiredCustomizations\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.client.FluentClientDecorator\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.generatePluginContext\n\nclass ClientCodegenVisitorTest {\n    @Test\n    fun `baseline transform verify mixins removed`() {\n        val model =\n            \"\"\"\n            namespace com.example\n\n            use aws.protocols#awsJson1_0\n\n            @awsJson1_0\n            @aws.api#service(sdkId: \"Test\", endpointPrefix: \"differentPrefix\")\n            service Example {\n                operations: [ BasicOperation ]\n            }\n\n            operation BasicOperation {\n                input: Shape\n            }\n\n            @mixin\n            structure SimpleMixin {\n                name: String\n            }\n\n            structure Shape with [\n                SimpleMixin\n            ] {\n                greeting: String\n            }\n            \"\"\".asSmithyModel(smithyVersion = \"2.0\")\n        val (ctx, _) = generatePluginContext(model)\n        val codegenDecorator =\n            CombinedClientCodegenDecorator.fromClasspath(\n                ctx,\n                ClientCustomizations(),\n                RequiredCustomizations(),\n                FluentClientDecorator(),\n            )\n        val visitor = ClientCodegenVisitor(ctx, codegenDecorator)\n        val baselineModel = visitor.baselineTransform(model)\n        baselineModel.getShapesWithTrait(ShapeId.from(\"smithy.api#mixin\")).isEmpty() shouldBe true\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/EventStreamSymbolProviderTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy\n\nimport io.kotest.matchers.shouldBe\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.ServiceShape\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.rust.codegen.client.testutil.TestClientRustSymbolProviderConfig\nimport software.amazon.smithy.rust.codegen.client.testutil.testClientRustSettings\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustType\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenTarget\nimport software.amazon.smithy.rust.codegen.core.smithy.EventStreamSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.SymbolVisitor\nimport software.amazon.smithy.rust.codegen.core.smithy.rustType\nimport software.amazon.smithy.rust.codegen.core.smithy.transformers.OperationNormalizer\nimport software.amazon.smithy.rust.codegen.core.testutil.TestRuntimeConfig\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\n\nclass EventStreamSymbolProviderTest {\n    @Test\n    fun `it should adjust types for operations with event streams`() {\n        // Transform the model so that it has synthetic inputs/outputs\n        val model =\n            OperationNormalizer.transform(\n                \"\"\"\n                namespace test\n\n                structure Something { stuff: Blob }\n\n                @streaming\n                union SomeStream {\n                    Something: Something,\n                }\n\n                structure TestInput { inputStream: SomeStream }\n                structure TestOutput { outputStream: SomeStream }\n                operation TestOperation {\n                    input: TestInput,\n                    output: TestOutput,\n                }\n                service TestService { version: \"123\", operations: [TestOperation] }\n                \"\"\".asSmithyModel(),\n            )\n\n        val service = model.expectShape(ShapeId.from(\"test#TestService\")) as ServiceShape\n        val provider =\n            EventStreamSymbolProvider(\n                TestRuntimeConfig,\n                SymbolVisitor(testClientRustSettings(), model, service, TestClientRustSymbolProviderConfig),\n                CodegenTarget.CLIENT,\n            )\n\n        // Look up the synthetic input/output rather than the original input/output\n        val inputStream = model.expectShape(ShapeId.from(\"test.synthetic#TestOperationInput\\$inputStream\")) as MemberShape\n        val outputStream = model.expectShape(ShapeId.from(\"test.synthetic#TestOperationOutput\\$outputStream\")) as MemberShape\n\n        val inputType = provider.toSymbol(inputStream).rustType()\n        val outputType = provider.toSymbol(outputStream).rustType()\n\n        val someStream = RustType.Opaque(\"SomeStream\", \"crate::types\")\n        val someStreamError = RustType.Opaque(\"SomeStreamError\", \"crate::types::error\")\n\n        inputType shouldBe\n            RustType.Application(\n                RuntimeType.eventStreamSender(TestRuntimeConfig).toSymbol().rustType(),\n                listOf(someStream, someStreamError),\n            )\n        outputType shouldBe\n            RustType.Application(\n                RuntimeType.eventReceiver(TestRuntimeConfig).toSymbol().rustType(),\n                listOf(someStream, someStreamError),\n            )\n    }\n\n    @Test\n    fun `it should leave alone types for operations without event streams`() {\n        val model =\n            OperationNormalizer.transform(\n                \"\"\"\n                namespace test\n\n                structure Something { stuff: Blob }\n\n                union NotStreaming {\n                    Something: Something,\n                }\n\n                structure TestInput { inputStream: NotStreaming }\n                structure TestOutput { outputStream: NotStreaming }\n                operation TestOperation {\n                    input: TestInput,\n                    output: TestOutput,\n                }\n                service TestService { version: \"123\", operations: [TestOperation] }\n                \"\"\".asSmithyModel(),\n            )\n\n        val service = model.expectShape(ShapeId.from(\"test#TestService\")) as ServiceShape\n        val provider =\n            EventStreamSymbolProvider(\n                TestRuntimeConfig,\n                SymbolVisitor(testClientRustSettings(), model, service, TestClientRustSymbolProviderConfig),\n                CodegenTarget.CLIENT,\n            )\n\n        // Look up the synthetic input/output rather than the original input/output\n        val inputStream = model.expectShape(ShapeId.from(\"test.synthetic#TestOperationInput\\$inputStream\")) as MemberShape\n        val outputStream = model.expectShape(ShapeId.from(\"test.synthetic#TestOperationOutput\\$outputStream\")) as MemberShape\n\n        val inputType = provider.toSymbol(inputStream).rustType()\n        val outputType = provider.toSymbol(outputStream).rustType()\n\n        inputType shouldBe RustType.Option(RustType.Opaque(\"NotStreaming\", \"crate::types\"))\n        outputType shouldBe RustType.Option(RustType.Opaque(\"NotStreaming\", \"crate::types\"))\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/NamingObstacleCourseTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy\n\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.aws.traits.protocols.RestJson1Trait\nimport software.amazon.smithy.aws.traits.protocols.RestXmlTrait\nimport software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest\nimport software.amazon.smithy.rust.codegen.core.testutil.NamingObstacleCourseTestModels.reusedInputOutputShapesModel\nimport software.amazon.smithy.rust.codegen.core.testutil.NamingObstacleCourseTestModels.rustPreludeEnumVariantsModel\nimport software.amazon.smithy.rust.codegen.core.testutil.NamingObstacleCourseTestModels.rustPreludeEnumsModel\nimport software.amazon.smithy.rust.codegen.core.testutil.NamingObstacleCourseTestModels.rustPreludeOperationsModel\nimport software.amazon.smithy.rust.codegen.core.testutil.NamingObstacleCourseTestModels.rustPreludeStructsModel\n\nclass NamingObstacleCourseTest {\n    @Test\n    fun `test Rust prelude operation names compile`() {\n        clientIntegrationTest(rustPreludeOperationsModel()) { _, _ -> }\n    }\n\n    @Test\n    fun `test Rust prelude structure names compile`() {\n        clientIntegrationTest(rustPreludeStructsModel()) { _, _ -> }\n    }\n\n    @Test\n    fun `test Rust prelude enum names compile`() {\n        clientIntegrationTest(rustPreludeEnumsModel()) { _, _ -> }\n    }\n\n    @Test\n    fun `test Rust prelude enum variant names compile`() {\n        clientIntegrationTest(rustPreludeEnumVariantsModel()) { _, _ -> }\n    }\n\n    @Test\n    fun `test reuse of input and output shapes json`() {\n        clientIntegrationTest(reusedInputOutputShapesModel(RestJson1Trait.builder().build()))\n    }\n\n    @Test\n    fun `test reuse of input and output shapes xml`() {\n        clientIntegrationTest(reusedInputOutputShapesModel(RestXmlTrait.builder().build()))\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/StreamingShapeSymbolProviderTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy\n\nimport io.kotest.matchers.shouldBe\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.rust.codegen.client.testutil.testSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustType\nimport software.amazon.smithy.rust.codegen.core.smithy.Default\nimport software.amazon.smithy.rust.codegen.core.smithy.defaultValue\nimport software.amazon.smithy.rust.codegen.core.smithy.rustType\nimport software.amazon.smithy.rust.codegen.core.smithy.transformers.OperationNormalizer\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.util.lookup\n\ninternal class StreamingShapeSymbolProviderTest {\n    val model =\n        \"\"\"\n        namespace test\n        operation GenerateSpeech {\n            output: GenerateSpeechOutput,\n            input: GenerateSpeechOutput\n        }\n\n        structure GenerateSpeechOutput {\n            data: BlobStream\n        }\n\n        @streaming\n        blob BlobStream\n\n        \"\"\".asSmithyModel()\n\n    @Test\n    fun `generates a byte stream on streaming output`() {\n        // we could test exactly the streaming shape symbol provider, but we actually care about is the full stack\n        // \"doing the right thing\"\n        val modelWithOperationTraits = OperationNormalizer.transform(model)\n        val symbolProvider = testSymbolProvider(modelWithOperationTraits)\n        modelWithOperationTraits.lookup<MemberShape>(\"test.synthetic#GenerateSpeechOutput\\$data\").also { shape ->\n            symbolProvider.toSymbol(shape).also { symbol ->\n                symbol.name shouldBe \"data\"\n                symbol.rustType() shouldBe RustType.Opaque(\"ByteStream\", \"::aws_smithy_types::byte_stream\")\n            }\n        }\n        modelWithOperationTraits.lookup<MemberShape>(\"test.synthetic#GenerateSpeechInput\\$data\").also { shape ->\n            symbolProvider.toSymbol(shape).also { symbol ->\n                symbol.name shouldBe \"data\"\n                symbol.rustType() shouldBe RustType.Opaque(\"ByteStream\", \"::aws_smithy_types::byte_stream\")\n            }\n        }\n    }\n\n    @Test\n    fun `streaming members have a default`() {\n        val modelWithOperationTraits = OperationNormalizer.transform(model)\n        val symbolProvider = testSymbolProvider(modelWithOperationTraits)\n\n        val outputSymbol = symbolProvider.toSymbol(modelWithOperationTraits.lookup<MemberShape>(\"test.synthetic#GenerateSpeechOutput\\$data\"))\n        val inputSymbol = symbolProvider.toSymbol(modelWithOperationTraits.lookup<MemberShape>(\"test.synthetic#GenerateSpeechInput\\$data\"))\n        // Ensure that users don't need to set an input\n        outputSymbol.defaultValue() shouldBe Default.RustDefault\n        inputSymbol.defaultValue() shouldBe Default.RustDefault\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/auth/AuthDecoratorTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.auth\n\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.rust.codegen.client.smithy.customizations.TestModels\nimport software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.rawRust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.testutil.integrationTest\n\nclass AuthDecoratorTest {\n    private fun codegenScope(runtimeConfig: RuntimeConfig): Array<Pair<String, Any>> =\n        arrayOf(\n            \"ReplayEvent\" to\n                CargoDependency.smithyRuntime(runtimeConfig)\n                    .toDevDependency().withFeature(\"test-util\").toType()\n                    .resolve(\"client::http::test_util::ReplayEvent\"),\n            \"StaticReplayClient\" to\n                CargoDependency.smithyRuntime(runtimeConfig)\n                    .toDevDependency().withFeature(\"test-util\").toType()\n                    .resolve(\"client::http::test_util::StaticReplayClient\"),\n            \"SdkBody\" to RuntimeType.sdkBody(runtimeConfig),\n        )\n\n    @Test\n    fun `register existing auth scheme with no-op signer should disable signing`() {\n        clientIntegrationTest(TestModels.allSchemes) { codegenContext, rustCrate ->\n            rustCrate.integrationTest(\"override_auth_scheme_with_no_op_signer\") {\n                val moduleName = codegenContext.moduleUseName()\n                rawRust(\n                    \"\"\"\n                    use aws_smithy_runtime_api::{\n                        box_error::BoxError,\n                        client::{\n                            auth::{\n                                http::HTTP_API_KEY_AUTH_SCHEME_ID, AuthScheme, AuthSchemeEndpointConfig, AuthSchemeId,\n                                Sign,\n                            },\n                            identity::{Identity, SharedIdentityResolver},\n                            identity::http::Token,\n                            orchestrator::HttpRequest,\n                            runtime_components::{GetIdentityResolver, RuntimeComponents},\n                        },\n                    };\n                    use aws_smithy_types::config_bag::ConfigBag;\n\n                    #[derive(Debug, Default)]\n                    struct NoAuthSigner;\n\n                    impl Sign for NoAuthSigner {\n                        fn sign_http_request(\n                            &self,\n                            _request: &mut HttpRequest,\n                            _identity: &Identity,\n                            _auth_scheme_endpoint_config: AuthSchemeEndpointConfig<'_>,\n                            _runtime_components: &RuntimeComponents,\n                            _config_bag: &ConfigBag,\n                        ) -> Result<(), BoxError> {\n                            Ok(())\n                        }\n                    }\n\n                    #[derive(Debug)]\n                    struct ApiKeyAuthSchemeWithNoOpSigner {\n                        no_signer: NoAuthSigner\n                    }\n                    impl Default for ApiKeyAuthSchemeWithNoOpSigner {\n                        fn default() -> Self {\n                            Self { no_signer: NoAuthSigner }\n                        }\n                    }\n                    impl AuthScheme for ApiKeyAuthSchemeWithNoOpSigner {\n                        fn scheme_id(&self) -> AuthSchemeId {\n                            HTTP_API_KEY_AUTH_SCHEME_ID\n                        }\n\n                        fn identity_resolver(\n                            &self,\n                            identity_resolvers: &dyn GetIdentityResolver\n                        ) -> Option<SharedIdentityResolver> {\n                            identity_resolvers.identity_resolver(self.scheme_id())\n                        }\n\n                        fn signer(&self) -> &dyn Sign {\n                            &self.no_signer\n                        }\n                    }\n                    \"\"\",\n                )\n                Attribute.TokioTest.render(this)\n                rustTemplate(\n                    \"\"\"\n                    async fn override_auth_scheme_with_no_op_signer_on_service_config() {\n                        let http_client = #{StaticReplayClient}::new(\n                            vec![#{ReplayEvent}::new(\n                                http::Request::builder()\n                                    .uri(\"http://localhost:1234/SomeOperation\")\n                                    .body(#{SdkBody}::empty())\n                                    .unwrap(),\n                                http::Response::builder().status(200).body(#{SdkBody}::empty()).unwrap(),\n                            )],\n                        );\n                        let config = $moduleName::Config::builder()\n                            .endpoint_url(\"http://localhost:1234\")\n                            .api_key(Token::new(\"some-api-key\", None))\n                            .push_auth_scheme(ApiKeyAuthSchemeWithNoOpSigner::default())\n                            .http_client(http_client.clone())\n                            .build();\n                        let client = $moduleName::Client::from_conf(config);\n                        let _ = client.some_operation()\n                            .send()\n                            .await\n                            .expect(\"success\");\n                        http_client.assert_requests_match(&[]);\n                    }\n                    \"\"\",\n                    *codegenScope(codegenContext.runtimeConfig),\n                )\n\n                Attribute.TokioTest.render(this)\n                rustTemplate(\n                    \"\"\"\n                    async fn override_auth_scheme_with_no_op_signer_at_operation_level() {\n                        let http_client = #{StaticReplayClient}::new(\n                            vec![#{ReplayEvent}::new(\n                                http::Request::builder()\n                                    .uri(\"http://localhost:1234/SomeOperation\")\n                                    .body(#{SdkBody}::empty())\n                                    .unwrap(),\n                                http::Response::builder().status(200).body(#{SdkBody}::empty()).unwrap(),\n                            )],\n                        );\n                        let config = $moduleName::Config::builder()\n                            .endpoint_url(\"http://localhost:1234\")\n                            .api_key(Token::new(\"some-api-key\", None))\n                            .http_client(http_client.clone())\n                            .build();\n                        let client = $moduleName::Client::from_conf(config);\n                        let _ = client.some_operation()\n                            .customize()\n                            .config_override(\n                                $moduleName::Config::builder()\n                                    .push_auth_scheme(ApiKeyAuthSchemeWithNoOpSigner::default()),\n                            )\n                            .send()\n                            .await\n                            .expect(\"success\");\n                        http_client.assert_requests_match(&[]);\n                    }\n                    \"\"\",\n                    *codegenScope(codegenContext.runtimeConfig),\n                )\n            }\n        }\n    }\n\n    @Test\n    fun `register custom auth scheme with identity resolver and signer`() {\n        clientIntegrationTest(TestModels.allSchemes) { codegenContext, rustCrate ->\n            rustCrate.integrationTest(\"register_custom_auth_scheme\") {\n                val moduleName = codegenContext.moduleUseName()\n                rawRust(\n                    \"\"\"\n                    use aws_smithy_runtime_api::{\n                        box_error::BoxError,\n                        client::{\n                            auth::{\n                                AuthScheme, AuthSchemeEndpointConfig, AuthSchemeId, AuthSchemeOption,\n                                AuthSchemeOptionsFuture, Sign,\n                            },\n                            identity::{Identity, IdentityFuture, ResolveIdentity, SharedIdentityResolver},\n                            orchestrator::HttpRequest,\n                            runtime_components::{GetIdentityResolver, RuntimeComponents},\n                        },\n                        shared::IntoShared,\n                    };\n                    use aws_smithy_types::config_bag::ConfigBag;\n\n                    #[derive(Debug)]\n                    struct CustomIdentityData(String);\n\n                    #[derive(Debug, Default)]\n                    struct CustomSigner;\n\n                    impl Sign for CustomSigner {\n                        fn sign_http_request(\n                            &self,\n                            request: &mut HttpRequest,\n                            identity: &Identity,\n                            _auth_scheme_endpoint_config: AuthSchemeEndpointConfig<'_>,\n                            _runtime_components: &RuntimeComponents,\n                            _config_bag: &ConfigBag,\n                        ) -> Result<(), BoxError> {\n                            let data = &identity.data::<CustomIdentityData>().unwrap().0;\n                            let uri = request.uri();\n                            request.set_uri(format!(\"{uri}/{data}\")).unwrap();\n                            Ok(())\n                        }\n                    }\n\n                    #[derive(Debug)]\n                    struct CustomIdentityResolver;\n\n                    impl ResolveIdentity for CustomIdentityResolver {\n                        fn resolve_identity<'a>(\n                            &'a self,\n                            _runtime_components: &'a RuntimeComponents,\n                            _config_bag: &'a ConfigBag,\n                        ) -> IdentityFuture<'a> {\n                            IdentityFuture::ready(Ok(Identity::new(\n                                CustomIdentityData(\"customidentitydata\".to_owned()),\n                                None,\n                            )))\n                        }\n                    }\n\n                    #[derive(Debug)]\n                    struct CustomAuthScheme {\n                        id: AuthSchemeId,\n                        signer: CustomSigner,\n                        identity_resolver: SharedIdentityResolver,\n                    }\n                    impl Default for CustomAuthScheme {\n                        fn default() -> Self {\n                            Self {\n                                id: AuthSchemeId::new(\"custom\"),\n                                signer: CustomSigner,\n                                identity_resolver: CustomIdentityResolver.into_shared(),\n                            }\n                        }\n                    }\n                    impl AuthScheme for CustomAuthScheme {\n                        fn scheme_id(&self) -> AuthSchemeId {\n                            self.id.clone()\n                        }\n\n                        fn identity_resolver(\n                            &self,\n                            _identity_resolvers: &dyn GetIdentityResolver,\n                        ) -> Option<SharedIdentityResolver> {\n                            Some(self.identity_resolver.clone())\n                        }\n\n                        fn signer(&self) -> &dyn Sign {\n                            &self.signer\n                        }\n                    }\n\n                    #[derive(Debug)]\n                    struct CustomAuthSchemeResolver;\n                    impl $moduleName::config::auth::ResolveAuthScheme for CustomAuthSchemeResolver {\n                        fn resolve_auth_scheme<'a>(\n                            &'a self,\n                            _params: &'a $moduleName::config::auth::Params,\n                            _cfg: &'a ConfigBag,\n                            _runtime_components: &'a RuntimeComponents,\n                        ) -> AuthSchemeOptionsFuture<'a> {\n                            AuthSchemeOptionsFuture::ready(Ok(vec![AuthSchemeOption::from(AuthSchemeId::new(\n                                \"custom\",\n                            ))]))\n                        }\n                    }\n                    \"\"\",\n                )\n                Attribute.TokioTest.render(this)\n                rustTemplate(\n                    \"\"\"\n                    async fn register_custom_auth_scheme_on_service_config() {\n                        let http_client = #{StaticReplayClient}::new(\n                            vec![#{ReplayEvent}::new(\n                                http::Request::builder()\n                                    .uri(\"http://localhost:1234/SomeOperation/customidentitydata\")\n                                    .body(#{SdkBody}::empty())\n                                    .unwrap(),\n                                http::Response::builder().status(200).body(#{SdkBody}::empty()).unwrap(),\n                            )],\n                        );\n                        let config = $moduleName::Config::builder()\n                            .endpoint_url(\"http://localhost:1234\")\n                            .push_auth_scheme(CustomAuthScheme::default())\n                            .auth_scheme_resolver(CustomAuthSchemeResolver)\n                            .http_client(http_client.clone())\n                            .build();\n                        let client = $moduleName::Client::from_conf(config);\n                        let _ = client.some_operation()\n                            .send()\n                            .await\n                            .expect(\"success\");\n                        http_client.assert_requests_match(&[]);\n                    }\n                    \"\"\",\n                    *codegenScope(codegenContext.runtimeConfig),\n                )\n\n                Attribute.TokioTest.render(this)\n                rustTemplate(\n                    \"\"\"\n                    async fn register_custom_auth_scheme_at_operation_level() {\n                        let http_client = #{StaticReplayClient}::new(\n                            vec![#{ReplayEvent}::new(\n                                http::Request::builder()\n                                    .uri(\"http://localhost:1234/SomeOperation/customidentitydata\")\n                                    .body(#{SdkBody}::empty())\n                                    .unwrap(),\n                                http::Response::builder().status(200).body(#{SdkBody}::empty()).unwrap(),\n                            )],\n                        );\n                        let config = $moduleName::Config::builder()\n                            .endpoint_url(\"http://localhost:1234\")\n                            .http_client(http_client.clone())\n                            .build();\n                        let client = $moduleName::Client::from_conf(config);\n                        let _ = client.some_operation()\n                            .customize()\n                            .config_override(\n                                $moduleName::Config::builder()\n                                    .push_auth_scheme(CustomAuthScheme::default())\n                                    .auth_scheme_resolver(CustomAuthSchemeResolver)\n                            )\n                            .send()\n                            .await\n                            .expect(\"success\");\n                        http_client.assert_requests_match(&[]);\n                    }\n                    \"\"\",\n                    *codegenScope(codegenContext.runtimeConfig),\n                )\n\n                Attribute.TokioTest.render(this)\n                rustTemplate(\n                    \"\"\"\n                    async fn no_auth_aware_auth_scheme_option_resolver_via_plugin() {\n                        let http_client = #{StaticReplayClient}::new(\n                                vec![#{ReplayEvent}::new(\n                                    http::Request::builder()\n                                    .uri(\"http://localhost:1234/SomeOperation\") // there shouldn't be `customidentitydata` in URI\n                                    .body(#{SdkBody}::empty())\n                                    .unwrap(),\n                                http::Response::builder().status(200).body(#{SdkBody}::empty()).unwrap(),\n                            )],\n                        );\n\n                        let config = $moduleName::Config::builder()\n                            .endpoint_url(\"http://localhost:1234\")\n                            .http_client(http_client.clone())\n                            .push_auth_scheme(CustomAuthScheme::default())\n                            .auth_scheme_resolver(CustomAuthSchemeResolver)\n                            // Configures a noAuth-aware auth scheme resolver that appends `NO_AUTH_SCHEME_ID`\n                            // to the auth scheme options returned by `CustomAuthSchemeResolver`.\n                            .runtime_plugin(#{NoAuthRuntimePluginV2}::new())\n                            // Reorders resolved auth scheme options to place `NO_AUTH_SCHEME_ID` first.\n                            .auth_scheme_preference([#{NO_AUTH_SCHEME_ID}])\n                            .build();\n                        let client = $moduleName::Client::from_conf(config);\n                        let _ = client.some_operation().send().await.expect(\"success\");\n                        http_client.assert_requests_match(&[]);\n                    }\n                    \"\"\",\n                    *codegenScope(codegenContext.runtimeConfig),\n                    \"NO_AUTH_SCHEME_ID\" to\n                        RuntimeType.smithyRuntime(codegenContext.runtimeConfig)\n                            .resolve(\"client::auth::no_auth::NO_AUTH_SCHEME_ID\"),\n                    \"NoAuthRuntimePluginV2\" to\n                        RuntimeType.smithyRuntime(codegenContext.runtimeConfig)\n                            .resolve(\"client::auth::no_auth::NoAuthRuntimePluginV2\"),\n                )\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/auth/AuthIndexTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.auth\n\nimport org.junit.jupiter.api.Assertions.assertEquals\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.model.traits.HttpApiKeyAuthTrait\nimport software.amazon.smithy.model.traits.HttpBasicAuthTrait\nimport software.amazon.smithy.model.traits.HttpBearerAuthTrait\nimport software.amazon.smithy.model.traits.synthetic.NoAuthTrait\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.customizations.HttpAuthDecorator\nimport software.amazon.smithy.rust.codegen.client.smithy.customizations.NoAuthDecorator\nimport software.amazon.smithy.rust.codegen.client.smithy.customizations.NoAuthSchemeOption\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.CombinedClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.client.testutil.testClientCodegenContext\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\n\nclass AuthIndexTest {\n    private val model =\n        \"\"\"\n        namespace com.test\n\n        use aws.auth#unsignedPayload\n\n        @httpBearerAuth\n        @httpApiKeyAuth(name: \"X-Api-Key\", in: \"header\")\n        @httpBasicAuth\n        @auth([httpApiKeyAuth])\n        service Test {\n            version: \"1.0.0\",\n            operations: [\n                GetFooServiceDefault,\n                GetFooOpOverride,\n                GetFooAnonymous,\n                GetFooOptionalAuth,\n                GetFooUnsigned\n            ]\n        }\n\n        operation GetFooServiceDefault {}\n\n        @auth([httpBasicAuth, httpBearerAuth])\n        operation GetFooOpOverride{}\n\n        @auth([])\n        operation GetFooAnonymous{}\n\n        @optionalAuth\n        operation GetFooOptionalAuth{}\n\n        @unsignedPayload\n        operation GetFooUnsigned{}\n        \"\"\".asSmithyModel(smithyVersion = \"2.0\")\n\n    private fun testCodegenWithModel(model: Model) =\n        testClientCodegenContext(\n            model,\n            rootDecorator =\n                CombinedClientCodegenDecorator(\n                    listOf(\n                        AuthDecorator(),\n                        NoAuthDecorator(),\n                        HttpAuthDecorator(),\n                    ),\n                ),\n        )\n\n    private val testCodegenContext = testCodegenWithModel(model)\n\n    @Test\n    fun testAuthOptionsDedup() {\n        class TestAuthSchemeOption(\n            override val authSchemeId: ShapeId,\n            val testId: String,\n        ) : AuthSchemeOption {\n            override fun render(\n                codegenContext: ClientCodegenContext,\n                operation: OperationShape?,\n            ) = writable {}\n        }\n\n        val testCtx =\n            testClientCodegenContext(\n                model,\n                rootDecorator =\n                    CombinedClientCodegenDecorator(\n                        listOf(\n                            object : ClientCodegenDecorator {\n                                override val name = \"TestAuthDecorator1\"\n                                override val order: Byte = 0\n\n                                override fun authSchemeOptions(\n                                    codegenContext: ClientCodegenContext,\n                                    baseAuthSchemeOptions: List<AuthSchemeOption>,\n                                ) = listOf(TestAuthSchemeOption(HttpApiKeyAuthTrait.ID, \"test-id-1\"))\n                            },\n                            object : ClientCodegenDecorator {\n                                override val name = \"TestAuthDecorator2\"\n                                override val order: Byte = 10\n\n                                override fun authSchemeOptions(\n                                    codegenContext: ClientCodegenContext,\n                                    baseAuthSchemeOptions: List<AuthSchemeOption>,\n                                ) = listOf(TestAuthSchemeOption(HttpApiKeyAuthTrait.ID, \"test-id-2\"))\n                            },\n                        ),\n                    ),\n            )\n        val sut = AuthIndex(testCtx)\n        val authOptions = sut.authOptions().values.toList()\n        assertEquals(1, authOptions.size)\n        assertEquals(\"test-id-1\", (authOptions[0] as TestAuthSchemeOption).testId)\n    }\n\n    @Test\n    fun testEffectiveServiceAuthOptions() {\n        val sut = AuthIndex(testCodegenContext)\n        val effectiveServiceAuthOptions = sut.effectiveAuthOptionsForService()\n\n        val actual = effectiveServiceAuthOptions.map { it.authSchemeId }\n        val expected = listOf(HttpApiKeyAuthTrait.ID)\n        assertEquals(expected, actual)\n    }\n\n    @Test\n    fun testEffectiveServiceOptionsWithNoAuth() {\n        val sut =\n            AuthIndex(\n                testCodegenWithModel(\n                    \"\"\"\n                    namespace com.test\n\n                    use aws.protocols#awsJson1_1\n\n                    @awsJson1_1\n                    service Test {\n                        version: \"1.0.0\"\n                    }\n                    \"\"\".asSmithyModel(smithyVersion = \"2.0\"),\n                ),\n            )\n        val effectiveServiceAuthOptions = sut.effectiveAuthOptionsForService()\n\n        val actual = effectiveServiceAuthOptions.map { it.authSchemeId }\n        val expected = listOf(NoAuthTrait.ID)\n        assertEquals(expected, actual)\n    }\n\n    @Test\n    fun testEffectiveAuthOptionsForOperation() {\n        val testCases =\n            listOf(\n                \"com.test#GetFooServiceDefault\" to listOf(HttpApiKeyAuthTrait.ID),\n                \"com.test#GetFooOpOverride\" to listOf(HttpBasicAuthTrait.ID, HttpBearerAuthTrait.ID),\n                \"com.test#GetFooAnonymous\" to listOf(NoAuthSchemeOption().authSchemeId),\n                \"com.test#GetFooOptionalAuth\" to listOf(HttpApiKeyAuthTrait.ID, NoAuthSchemeOption().authSchemeId),\n            )\n        val sut = AuthIndex(testCodegenContext)\n        testCases.forEach { (opShapeId, expectedSchemes) ->\n            val op = model.expectShape(ShapeId.from(opShapeId), OperationShape::class.java)\n            val handlers = sut.effectiveAuthOptionsForOperation(op)\n            val actualSchemes = handlers.map { it.authSchemeId }\n            assertEquals(expectedSchemes, actualSchemes)\n        }\n    }\n\n    @Test\n    fun testOperationsWithOverrides() {\n        val sut = AuthIndex(testCodegenContext)\n        val actual = sut.operationsWithOverrides()\n        val expected =\n            setOf(\n                model.expectShape(ShapeId.from(\"com.test#GetFooOpOverride\"), OperationShape::class.java),\n                model.expectShape(ShapeId.from(\"com.test#GetFooAnonymous\"), OperationShape::class.java),\n                model.expectShape(ShapeId.from(\"com.test#GetFooOptionalAuth\"), OperationShape::class.java),\n            )\n        assertEquals(expected, actual)\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/auth/AuthTypesGeneratorTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.auth\n\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.rust.codegen.client.smithy.customizations.HttpAuthDecorator\nimport software.amazon.smithy.rust.codegen.client.smithy.customizations.NoAuthDecorator\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.CombinedClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.client.testutil.testClientCodegenContext\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.DependencyScope\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustModule\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.compileAndTest\nimport software.amazon.smithy.rust.codegen.core.testutil.tokioTest\n\nclass AuthTypesGeneratorTest {\n    val model =\n        \"\"\"\n        namespace com.test\n\n        use aws.auth#unsignedPayload\n\n        @httpBearerAuth\n        @httpApiKeyAuth(name: \"X-Api-Key\", in: \"header\")\n        @httpBasicAuth\n        @auth([httpApiKeyAuth, httpBasicAuth])\n        service Test {\n            version: \"1.0.0\",\n            operations: [\n                GetFooServiceDefault,\n                GetFooOpOverride,\n                GetFooAnonymous,\n            ]\n        }\n\n        operation GetFooServiceDefault {}\n\n        @auth([httpBasicAuth, httpBearerAuth])\n        operation GetFooOpOverride{}\n\n        @auth([])\n        operation GetFooAnonymous{}\n        \"\"\".asSmithyModel(smithyVersion = \"2.0\")\n\n    @Test\n    fun `basic test for default auth scheme resolver`() {\n        val ctx =\n            testClientCodegenContext(\n                model,\n                rootDecorator =\n                    CombinedClientCodegenDecorator(\n                        listOf(\n                            NoAuthDecorator(),\n                            HttpAuthDecorator(),\n                        ),\n                    ),\n            )\n        val sut = AuthTypesGenerator(ctx)\n        val project = TestWorkspace.testProject()\n        project.withModule(RustModule.private(\"default_auth_scheme_resolver\").cfgTest()) {\n            val codegenScope =\n                arrayOf(\n                    \"ConfigBag\" to\n                        CargoDependency.smithyTypes(ctx.runtimeConfig)\n                            .copy(features = setOf(\"test-util\"), scope = DependencyScope.Dev).toType()\n                            .resolve(\"config_bag::ConfigBag\"),\n                    \"DefaultAuthSchemeResolver\" to sut.defaultAuthSchemeResolver(),\n                    \"Params\" to AuthSchemeParamsGenerator(ctx).paramsStruct(),\n                    \"RuntimeComponentsBuilder\" to\n                        CargoDependency.smithyRuntimeApiClient(ctx.runtimeConfig)\n                            .copy(features = setOf(\"test-util\"), scope = DependencyScope.Dev).toType()\n                            .resolve(\"client::runtime_components::RuntimeComponentsBuilder\"),\n                    \"ServiceSpecificResolver\" to sut.serviceSpecificResolveAuthSchemeTrait(),\n                )\n            rustTemplate(\"use #{ServiceSpecificResolver};\", *codegenScope)\n            tokioTest(\"should_return_service_defaults\") {\n                rustTemplate(\n                    \"\"\"\n                    let sut = #{DefaultAuthSchemeResolver}::default();\n                    let params = #{Params}::builder()\n                        .operation_name(\"GetFooServiceDefault\")\n                        .build()\n                        .unwrap();\n                    let cfg = #{ConfigBag}::base();\n                    let rc =\n                        #{RuntimeComponentsBuilder}::for_tests()\n                        .build()\n                        .unwrap();\n                    let actual = sut\n                        .resolve_auth_scheme(&params, &cfg, &rc)\n                        .await\n                        .unwrap();\n                    let actual = actual\n                        .iter()\n                        .map(|opt| opt.scheme_id().inner())\n                        .collect::<Vec<_>>();\n                    assert_eq!(vec![\"httpApiKeyAuth\", \"httpBasicAuth\"], actual);\n                    \"\"\",\n                    *codegenScope,\n                )\n            }\n\n            tokioTest(\"should_return_operation_overrides\") {\n                rustTemplate(\n                    \"\"\"\n                    let sut = #{DefaultAuthSchemeResolver}::default();\n                    let params = #{Params}::builder()\n                        .operation_name(\"GetFooOpOverride\")\n                        .build()\n                        .unwrap();\n                    let cfg = #{ConfigBag}::base();\n                    let rc =\n                        #{RuntimeComponentsBuilder}::for_tests()\n                        .build()\n                        .unwrap();\n                    let actual = sut\n                        .resolve_auth_scheme(&params, &cfg, &rc)\n                        .await\n                        .unwrap();\n                    let actual = actual\n                        .iter()\n                        .map(|opt| opt.scheme_id().inner())\n                        .collect::<Vec<_>>();\n                    assert_eq!(vec![\"httpBasicAuth\", \"httpBearerAuth\"], actual);\n                    \"\"\",\n                    *codegenScope,\n                )\n            }\n        }\n        project.compileAndTest()\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/HttpAuthDecoratorTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.customizations\n\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.rawRust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.integrationTest\n\nclass HttpAuthDecoratorTest {\n    private fun codegenScope(runtimeConfig: RuntimeConfig): Array<Pair<String, Any>> =\n        arrayOf(\n            \"ReplayEvent\" to\n                CargoDependency.smithyRuntime(runtimeConfig)\n                    .toDevDependency().withFeature(\"test-util\").toType()\n                    .resolve(\"client::http::test_util::ReplayEvent\"),\n            \"StaticReplayClient\" to\n                CargoDependency.smithyRuntime(runtimeConfig)\n                    .toDevDependency().withFeature(\"test-util\").toType()\n                    .resolve(\"client::http::test_util::StaticReplayClient\"),\n            \"SdkBody\" to RuntimeType.sdkBody(runtimeConfig),\n        )\n\n    @Test\n    fun multipleAuthSchemesSchemeSelection() {\n        clientIntegrationTest(TestModels.allSchemes) { codegenContext, rustCrate ->\n            rustCrate.integrationTest(\"tests\") {\n                val moduleName = codegenContext.moduleUseName()\n                Attribute.TokioTest.render(this)\n                rustTemplate(\n                    \"\"\"\n                    async fn use_api_key_auth_when_api_key_provided() {\n                        use aws_smithy_runtime_api::client::identity::http::Token;\n\n                        let http_client = #{StaticReplayClient}::new(\n                            vec![#{ReplayEvent}::new(\n                                http::Request::builder()\n                                    .uri(\"http://localhost:1234/SomeOperation?api_key=some-api-key\")\n                                    .body(#{SdkBody}::empty())\n                                    .unwrap(),\n                                http::Response::builder().status(200).body(#{SdkBody}::empty()).unwrap(),\n                            )],\n                        );\n\n                        let config = $moduleName::Config::builder()\n                            .api_key(Token::new(\"some-api-key\", None))\n                            .endpoint_url(\"http://localhost:1234\")\n                            .http_client(http_client.clone())\n                            .build();\n                        let client = $moduleName::Client::from_conf(config);\n                        let _ = client.some_operation()\n                            .send()\n                            .await\n                            .expect(\"success\");\n                        http_client.assert_requests_match(&[]);\n                    }\n                    \"\"\",\n                    *codegenScope(codegenContext.runtimeConfig),\n                )\n                Attribute.TokioTest.render(this)\n                rustTemplate(\n                    \"\"\"\n                    async fn use_basic_auth_when_basic_auth_login_provided() {\n                        use aws_smithy_runtime_api::client::identity::http::Login;\n\n                        let http_client = #{StaticReplayClient}::new(\n                            vec![#{ReplayEvent}::new(\n                                http::Request::builder()\n                                    .header(\"authorization\", \"Basic c29tZS11c2VyOnNvbWUtcGFzcw==\")\n                                    .uri(\"http://localhost:1234/SomeOperation\")\n                                    .body(#{SdkBody}::empty())\n                                    .unwrap(),\n                                http::Response::builder().status(200).body(#{SdkBody}::empty()).unwrap(),\n                            )],\n                        );\n\n                        let config = $moduleName::Config::builder()\n                            .basic_auth_login(Login::new(\"some-user\", \"some-pass\", None))\n                            .endpoint_url(\"http://localhost:1234\")\n                            .http_client(http_client.clone())\n                            .build();\n                        let client = $moduleName::Client::from_conf(config);\n                        let _ = client.some_operation()\n                            .send()\n                            .await\n                            .expect(\"success\");\n                        http_client.assert_requests_match(&[]);\n                    }\n                    \"\"\",\n                    *codegenScope(codegenContext.runtimeConfig),\n                )\n            }\n        }\n    }\n\n    @Test\n    fun noAuthCustomAuth() {\n        clientIntegrationTest(TestModels.noSchemes) { ctx, rustCrate ->\n            rustCrate.integrationTest(\"custom_auth_scheme_works\") {\n                val moduleName = ctx.moduleUseName()\n                rawRust(\n                    \"\"\"\n                    use aws_smithy_runtime_api::client::auth::static_resolver::StaticAuthSchemeOptionResolver;\n                    use aws_smithy_runtime_api::client::auth::AuthScheme;\n                    use aws_smithy_runtime_api::client::auth::{AuthSchemeId, Sign};\n                    use aws_smithy_runtime_api::client::identity::{\n                        IdentityFuture, ResolveIdentity, SharedIdentityResolver,\n                    };\n                    use aws_smithy_runtime_api::box_error::BoxError;\n                    use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents;\n                    use aws_smithy_runtime_api::client::runtime_components::{\n                        GetIdentityResolver, RuntimeComponentsBuilder,\n                    };\n                    use aws_smithy_runtime_api::client::identity::Identity;\n                    use aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugin;\n                    use aws_smithy_runtime_api::client::auth::AuthSchemeEndpointConfig;\n                    use aws_smithy_types::config_bag::ConfigBag;\n                    use std::borrow::Cow;\n                    use aws_smithy_runtime_api::client::orchestrator::HttpRequest;\n                    #[derive(Debug)]\n                    struct CustomAuthRuntimePlugin {\n                        components: RuntimeComponentsBuilder,\n                    }\n\n                    impl RuntimePlugin for CustomAuthRuntimePlugin {\n                        fn runtime_components(\n                            &self,\n                            _current_components: &RuntimeComponentsBuilder,\n                        ) -> Cow<'_, RuntimeComponentsBuilder> {\n                            Cow::Borrowed(&self.components)\n                        }\n                    }\n\n                    #[derive(Debug)]\n                    struct TestAuthScheme { signer: CustomSigner }\n\n                    impl AuthScheme for TestAuthScheme {\n                        fn scheme_id(&self) -> AuthSchemeId {\n                            AuthSchemeId::new(\"customauth\")\n                        }\n\n                        fn identity_resolver(\n                            &self,\n                            identity_resolvers: &dyn GetIdentityResolver,\n                        ) -> Option<SharedIdentityResolver> {\n                            identity_resolvers.identity_resolver(self.scheme_id())\n                        }\n\n                        fn signer(&self) -> &dyn Sign {\n                            &self.signer\n                        }\n                    }\n\n                    #[derive(Debug, Default)]\n                    struct CustomSigner;\n\n                    #[derive(Debug)]\n                    struct CustomIdentity(String);\n\n                    impl Sign for CustomSigner {\n                        fn sign_http_request(\n                            &self,\n                            request: &mut HttpRequest,\n                            identity: &Identity,\n                            // In some advanced use cases, the Smithy `@endpointRuleSet` can\n                            // provide additional context in this config:\n                            _auth_scheme_endpoint_config: AuthSchemeEndpointConfig<'_>,\n                            _runtime_components: &RuntimeComponents,\n                            _config_bag: &ConfigBag,\n                        ) -> Result<(), BoxError> {\n                            // Downcast the identity to our known `Login` type\n                            let login = identity\n                                .data::<CustomIdentity>()\n                                .ok_or(\"custom auth requires a `Login` identity\")?;\n                            // Use the login to add an authorization header to the request\n                            request.headers_mut().try_append(\n                                http::header::AUTHORIZATION,\n                                login.0.to_string()\n                            )?;\n                            Ok(())\n                        }\n                    }\n\n\n                    #[derive(Debug)]\n                    struct TestResolver;\n                    impl ResolveIdentity for TestResolver {\n                        fn resolve_identity<'a>(\n                            &'a self,\n                            _runtime_components: &'a RuntimeComponents,\n                            _config_bag: &'a ConfigBag,\n                        ) -> IdentityFuture<'a> {\n                            IdentityFuture::ready(Ok(Identity::new(CustomIdentity(\"password\".to_string()), None)))\n                        }\n                    }\n\n                    impl CustomAuthRuntimePlugin {\n                        pub fn new() -> Self {\n                            let scheme_id = AuthSchemeId::new(\"customauth\");\n                            Self {\n                                components: RuntimeComponentsBuilder::new(\"test-auth-scheme\")\n                                    // Register our auth scheme\n                                    .with_auth_scheme(TestAuthScheme { signer: CustomSigner })\n                                    // Register our identity resolver with our auth scheme ID\n                                    .with_identity_resolver(\n                                        // This scheme ID needs to match the scheme ID returned in the auth scheme implementation\n                                        scheme_id.clone(),\n                                        TestResolver,\n                                    )\n                                    // Set the auth scheme option resolver to always use our basic auth auth scheme\n                                    .with_auth_scheme_option_resolver(Some(StaticAuthSchemeOptionResolver::new(vec![\n                                        scheme_id,\n                                    ]))),\n                            }\n                        }\n                    }\n\n                    #[test]\n                    fn compile() {}\n\n                    \"\"\",\n                )\n                Attribute.TokioTest.render(this)\n                rustTemplate(\n                    \"\"\"\n                    async fn apply_custom_auth_scheme() {\n                        let (_guard, _rx) = #{capture_test_logs}();\n                        let http_client = #{StaticReplayClient}::new(\n                            vec![#{ReplayEvent}::new(\n                                http::Request::builder()\n                                    .header(\"authorization\", \"password\")\n                                    .uri(\"http://localhost:1234/SomeOperation\")\n                                    .body(#{SdkBody}::empty())\n                                    .unwrap(),\n                                http::Response::builder().status(200).body(#{SdkBody}::empty()).unwrap(),\n                            )],\n                        );\n                        let config = $moduleName::Config::builder()\n                            .endpoint_url(\"http://localhost:1234\")\n                            .http_client(http_client.clone())\n                            .runtime_plugin(CustomAuthRuntimePlugin::new())\n                            .build();\n                        let client = $moduleName::Client::from_conf(config);\n                        let _req = dbg!(client.some_operation()\n                            .send()\n                            .await).expect(\"request should succeed\");\n\n                        http_client.assert_requests_match(&[]);\n                    }\n                    \"\"\",\n                    \"capture_test_logs\" to\n                        CargoDependency.smithyRuntimeTestUtil(ctx.runtimeConfig).toType()\n                            .resolve(\"test_util::capture_test_logs::capture_test_logs\"),\n                    *codegenScope(ctx.runtimeConfig),\n                )\n            }\n        }\n    }\n\n    @Test\n    fun apiKeyInQueryString() {\n        clientIntegrationTest(TestModels.apiKeyInQueryString) { codegenContext, rustCrate ->\n            rustCrate.integrationTest(\"api_key_applied_to_query_string\") {\n                val moduleName = codegenContext.moduleUseName()\n                Attribute.TokioTest.render(this)\n                rustTemplate(\n                    \"\"\"\n                    async fn api_key_applied_to_query_string() {\n                        use aws_smithy_runtime_api::client::identity::http::Token;\n\n                        let http_client = #{StaticReplayClient}::new(\n                            vec![#{ReplayEvent}::new(\n                                http::Request::builder()\n                                    .uri(\"http://localhost:1234/SomeOperation?api_key=some-api-key\")\n                                    .body(#{SdkBody}::empty())\n                                    .unwrap(),\n                                http::Response::builder().status(200).body(#{SdkBody}::empty()).unwrap(),\n                            )],\n                        );\n\n                        let config = $moduleName::Config::builder()\n                            .api_key(Token::new(\"some-api-key\", None))\n                            .endpoint_url(\"http://localhost:1234\")\n                            .http_client(http_client.clone())\n                            .build();\n                        let client = $moduleName::Client::from_conf(config);\n                        let _ = client.some_operation()\n                            .send()\n                            .await\n                            .expect(\"success\");\n                        http_client.assert_requests_match(&[]);\n                    }\n                    \"\"\",\n                    *codegenScope(codegenContext.runtimeConfig),\n                )\n            }\n        }\n    }\n\n    @Test\n    fun apiKeyInHeaders() {\n        clientIntegrationTest(TestModels.apiKeyInHeaders) { codegenContext, rustCrate ->\n            rustCrate.integrationTest(\"api_key_applied_to_headers\") {\n                val moduleName = codegenContext.moduleUseName()\n                Attribute.TokioTest.render(this)\n                rustTemplate(\n                    \"\"\"\n                    async fn api_key_applied_to_headers() {\n                        use aws_smithy_runtime_api::client::identity::http::Token;\n\n                        let http_client = #{StaticReplayClient}::new(\n                            vec![#{ReplayEvent}::new(\n                                http::Request::builder()\n                                    .header(\"authorization\", \"ApiKey some-api-key\")\n                                    .uri(\"http://localhost:1234/SomeOperation\")\n                                    .body(#{SdkBody}::empty())\n                                    .unwrap(),\n                                http::Response::builder().status(200).body(#{SdkBody}::empty()).unwrap(),\n                            )],\n                        );\n\n                        let config = $moduleName::Config::builder()\n                            .api_key(Token::new(\"some-api-key\", None))\n                            .endpoint_url(\"http://localhost:1234\")\n                            .http_client(http_client.clone())\n                            .build();\n                        let client = $moduleName::Client::from_conf(config);\n                        let _ = client.some_operation()\n                            .send()\n                            .await\n                            .expect(\"success\");\n                        http_client.assert_requests_match(&[]);\n                    }\n                    \"\"\",\n                    *codegenScope(codegenContext.runtimeConfig),\n                )\n            }\n        }\n    }\n\n    @Test\n    fun basicAuth() {\n        clientIntegrationTest(TestModels.basicAuth) { codegenContext, rustCrate ->\n            rustCrate.integrationTest(\"basic_auth\") {\n                val moduleName = codegenContext.moduleUseName()\n                Attribute.TokioTest.render(this)\n                rustTemplate(\n                    \"\"\"\n                    async fn basic_auth() {\n                        use aws_smithy_runtime_api::client::identity::http::Login;\n\n                        let http_client = #{StaticReplayClient}::new(\n                            vec![#{ReplayEvent}::new(\n                                http::Request::builder()\n                                    .header(\"authorization\", \"Basic c29tZS11c2VyOnNvbWUtcGFzcw==\")\n                                    .uri(\"http://localhost:1234/SomeOperation\")\n                                    .body(#{SdkBody}::empty())\n                                    .unwrap(),\n                                http::Response::builder().status(200).body(#{SdkBody}::empty()).unwrap(),\n                            )],\n                        );\n\n                        let config = $moduleName::Config::builder()\n                            .basic_auth_login(Login::new(\"some-user\", \"some-pass\", None))\n                            .endpoint_url(\"http://localhost:1234\")\n                            .http_client(http_client.clone())\n                            .build();\n                        let client = $moduleName::Client::from_conf(config);\n                        let _ = client.some_operation()\n                            .send()\n                            .await\n                            .expect(\"success\");\n                        http_client.assert_requests_match(&[]);\n                    }\n                    \"\"\",\n                    *codegenScope(codegenContext.runtimeConfig),\n                )\n            }\n        }\n    }\n\n    @Test\n    fun bearerAuth() {\n        clientIntegrationTest(TestModels.bearerAuth) { codegenContext, rustCrate ->\n            rustCrate.integrationTest(\"bearer_auth\") {\n                val moduleName = codegenContext.moduleUseName()\n                Attribute.TokioTest.render(this)\n                rustTemplate(\n                    \"\"\"\n                    async fn basic_auth() {\n                        use aws_smithy_runtime_api::client::identity::http::Token;\n\n                        let http_client = #{StaticReplayClient}::new(\n                            vec![#{ReplayEvent}::new(\n                                http::Request::builder()\n                                    .header(\"authorization\", \"Bearer some-token\")\n                                    .uri(\"http://localhost:1234/SomeOperation\")\n                                    .body(#{SdkBody}::empty())\n                                    .unwrap(),\n                                http::Response::builder().status(200).body(#{SdkBody}::empty()).unwrap(),\n                            )],\n                        );\n\n                        let config = $moduleName::Config::builder()\n                            .bearer_token(Token::new(\"some-token\", None))\n                            .endpoint_url(\"http://localhost:1234\")\n                            .http_client(http_client.clone())\n                            .build();\n                        let client = $moduleName::Client::from_conf(config);\n                        let _ = client.some_operation()\n                            .send()\n                            .await\n                            .expect(\"success\");\n                        http_client.assert_requests_match(&[]);\n                    }\n                    \"\"\",\n                    *codegenScope(codegenContext.runtimeConfig),\n                )\n            }\n        }\n    }\n\n    @Test\n    fun optionalAuth() {\n        clientIntegrationTest(TestModels.optionalAuth) { codegenContext, rustCrate ->\n            rustCrate.integrationTest(\"optional_auth\") {\n                val moduleName = codegenContext.moduleUseName()\n                Attribute.TokioTest.render(this)\n                rustTemplate(\n                    \"\"\"\n                    async fn optional_auth() {\n                        let http_client = #{StaticReplayClient}::new(\n                            vec![#{ReplayEvent}::new(\n                                http::Request::builder()\n                                    .uri(\"http://localhost:1234/SomeOperation\")\n                                    .body(#{SdkBody}::empty())\n                                    .unwrap(),\n                                http::Response::builder().status(200).body(#{SdkBody}::empty()).unwrap(),\n                            )],\n                        );\n\n                        let config = $moduleName::Config::builder()\n                            .endpoint_url(\"http://localhost:1234\")\n                            .http_client(http_client.clone())\n                            .build();\n                        let client = $moduleName::Client::from_conf(config);\n                        let _ = client.some_operation()\n                            .send()\n                            .await\n                            .expect(\"success\");\n                        http_client.assert_requests_match(&[]);\n                    }\n                    \"\"\",\n                    *codegenScope(codegenContext.runtimeConfig),\n                )\n            }\n        }\n    }\n}\n\ninternal object TestModels {\n    val allSchemes =\n        \"\"\"\n        namespace test\n\n        use aws.api#service\n        use aws.protocols#restJson1\n\n        @service(sdkId: \"Test Api Key Auth\")\n        @restJson1\n        @httpApiKeyAuth(name: \"api_key\", in: \"query\")\n        @httpBasicAuth\n        @httpBearerAuth\n        @httpDigestAuth\n        @auth([httpApiKeyAuth, httpBasicAuth, httpBearerAuth, httpDigestAuth])\n        service TestService {\n            version: \"2023-01-01\",\n            operations: [SomeOperation]\n        }\n\n        structure SomeOutput {\n            someAttribute: Long,\n            someVal: String\n        }\n\n        @http(uri: \"/SomeOperation\", method: \"GET\")\n        operation SomeOperation {\n            output: SomeOutput\n        }\n        \"\"\".asSmithyModel()\n\n    val noSchemes =\n        \"\"\"\n        namespace test\n\n        use aws.api#service\n        use aws.protocols#restJson1\n\n        @service(sdkId: \"Test Api Key Auth\")\n        @restJson1\n        service TestService {\n            version: \"2023-01-01\",\n            operations: [SomeOperation]\n        }\n\n        structure SomeOutput {\n            someAttribute: Long,\n            someVal: String\n        }\n\n        @http(uri: \"/SomeOperation\", method: \"GET\")\n        operation SomeOperation {\n            output: SomeOutput\n        }\"\"\".asSmithyModel()\n\n    val apiKeyInQueryString =\n        \"\"\"\n        namespace test\n\n        use aws.api#service\n        use aws.protocols#restJson1\n\n        @service(sdkId: \"Test Api Key Auth\")\n        @restJson1\n        @httpApiKeyAuth(name: \"api_key\", in: \"query\")\n        @auth([httpApiKeyAuth])\n        service TestService {\n            version: \"2023-01-01\",\n            operations: [SomeOperation]\n        }\n\n        structure SomeOutput {\n            someAttribute: Long,\n            someVal: String\n        }\n\n        @http(uri: \"/SomeOperation\", method: \"GET\")\n        operation SomeOperation {\n            output: SomeOutput\n        }\n        \"\"\".asSmithyModel()\n\n    val apiKeyInHeaders =\n        \"\"\"\n        namespace test\n\n        use aws.api#service\n        use aws.protocols#restJson1\n\n        @service(sdkId: \"Test Api Key Auth\")\n        @restJson1\n        @httpApiKeyAuth(name: \"authorization\", in: \"header\", scheme: \"ApiKey\")\n        @auth([httpApiKeyAuth])\n        service TestService {\n            version: \"2023-01-01\",\n            operations: [SomeOperation]\n        }\n\n        structure SomeOutput {\n            someAttribute: Long,\n            someVal: String\n        }\n\n        @http(uri: \"/SomeOperation\", method: \"GET\")\n        operation SomeOperation {\n            output: SomeOutput\n        }\n        \"\"\".asSmithyModel()\n\n    val basicAuth =\n        \"\"\"\n        namespace test\n\n        use aws.api#service\n        use aws.protocols#restJson1\n\n        @service(sdkId: \"Test Api Key Auth\")\n        @restJson1\n        @httpBasicAuth\n        @auth([httpBasicAuth])\n        service TestService {\n            version: \"2023-01-01\",\n            operations: [SomeOperation]\n        }\n\n        structure SomeOutput {\n            someAttribute: Long,\n            someVal: String\n        }\n\n        @http(uri: \"/SomeOperation\", method: \"GET\")\n        operation SomeOperation {\n            output: SomeOutput\n        }\n        \"\"\".asSmithyModel()\n\n    val bearerAuth =\n        \"\"\"\n        namespace test\n\n        use aws.api#service\n        use aws.protocols#restJson1\n\n        @service(sdkId: \"Test Api Key Auth\")\n        @restJson1\n        @httpBearerAuth\n        @auth([httpBearerAuth])\n        service TestService {\n            version: \"2023-01-01\",\n            operations: [SomeOperation]\n        }\n\n        structure SomeOutput {\n            someAttribute: Long,\n            someVal: String\n        }\n\n        @http(uri: \"/SomeOperation\", method: \"GET\")\n        operation SomeOperation {\n            output: SomeOutput\n        }\n        \"\"\".asSmithyModel()\n\n    val optionalAuth =\n        \"\"\"\n        namespace test\n\n        use aws.api#service\n        use aws.protocols#restJson1\n\n        @service(sdkId: \"Test Api Key Auth\")\n        @restJson1\n        @httpBearerAuth\n        @auth([httpBearerAuth])\n        service TestService {\n            version: \"2023-01-01\",\n            operations: [SomeOperation]\n        }\n\n        structure SomeOutput {\n            someAttribute: Long,\n            someVal: String\n        }\n\n        @http(uri: \"/SomeOperation\", method: \"GET\")\n        @optionalAuth\n        operation SomeOperation {\n            output: SomeOutput\n        }\n        \"\"\".asSmithyModel()\n}\n"
  },
  {
    "path": "codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/MetadataCustomizationTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.customizations\n\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\nimport software.amazon.smithy.rust.codegen.core.testutil.BasicTestModels\nimport software.amazon.smithy.rust.codegen.core.testutil.testModule\nimport software.amazon.smithy.rust.codegen.core.testutil.tokioTest\n\nclass MetadataCustomizationTest {\n    @Test\n    fun `extract metadata via customizable operation`() {\n        clientIntegrationTest(BasicTestModels.AwsJson10TestModel) { clientCodegenContext, rustCrate ->\n            val runtimeConfig = clientCodegenContext.runtimeConfig\n            val codegenScope =\n                arrayOf(\n                    *preludeScope,\n                    \"BeforeTransmitInterceptorContextMut\" to RuntimeType.beforeTransmitInterceptorContextMut(runtimeConfig),\n                    \"BoxError\" to RuntimeType.boxError(runtimeConfig),\n                    \"ConfigBag\" to RuntimeType.configBag(runtimeConfig),\n                    \"Intercept\" to RuntimeType.intercept(runtimeConfig),\n                    \"Metadata\" to RuntimeType.smithyRuntimeApiClient(runtimeConfig).resolve(\"client::orchestrator::Metadata\"),\n                    \"capture_request\" to RuntimeType.captureRequest(runtimeConfig),\n                    \"RuntimeComponents\" to\n                        RuntimeType.smithyRuntimeApiClient(runtimeConfig)\n                            .resolve(\"client::runtime_components::RuntimeComponents\"),\n                )\n            rustCrate.testModule {\n                addDependency(CargoDependency.Tokio.toDevDependency().withFeature(\"test-util\"))\n                tokioTest(\"test_extract_metadata_via_customizable_operation\") {\n                    rustTemplate(\n                        \"\"\"\n                        // Interceptors aren’t supposed to store states, but it is done this way for a testing purpose.\n                        ##[derive(Debug)]\n                        struct ExtractMetadataInterceptor(\n                            ::std::sync::Mutex<#{Option}<::std::sync::mpsc::Sender<(String, String)>>>,\n                        );\n\n                        impl #{Intercept} for ExtractMetadataInterceptor {\n                            fn name(&self) -> &'static str {\n                                \"ExtractMetadataInterceptor\"\n                            }\n\n                            fn modify_before_signing(\n                                &self,\n                                _context: &mut #{BeforeTransmitInterceptorContextMut}<'_>,\n                                _runtime_components: &#{RuntimeComponents},\n                                cfg: &mut #{ConfigBag},\n                            ) -> #{Result}<(), #{BoxError}> {\n                                let metadata = cfg\n                                    .load::<#{Metadata}>()\n                                    .expect(\"metadata should exist\");\n                                let service_name = metadata.service().to_string();\n                                let operation_name = metadata.name().to_string();\n                                let tx = self.0.lock().unwrap().take().unwrap();\n                                tx.send((service_name, operation_name)).unwrap();\n                                #{Ok}(())\n                            }\n                        }\n\n                        let (tx, rx) = ::std::sync::mpsc::channel();\n\n                        let (http_client, _captured_request) = #{capture_request}(#{None});\n                        let client_config = crate::config::Config::builder()\n                            .endpoint_url(\"http://localhost:1234/\")\n                            .http_client(http_client)\n                            .build();\n                        let client = crate::client::Client::from_conf(client_config);\n                        let _ = client\n                            .say_hello()\n                            .customize()\n                            .interceptor(ExtractMetadataInterceptor(::std::sync::Mutex::new(#{Some}(tx))))\n                            .send()\n                            .await;\n\n                        match rx.recv() {\n                            #{Ok}((service_name, operation_name)) => {\n                                assert_eq!(\"HelloService\", &service_name);\n                                assert_eq!(\"SayHello\", &operation_name);\n                            }\n                            #{Err}(_) => panic!(\n                                \"failed to receive service name and operation name from `ExtractMetadataInterceptor`\"\n                            ),\n                        }\n                        \"\"\",\n                        *codegenScope,\n                    )\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/ResiliencyConfigCustomizationTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.customizations\n\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.testutil.BasicTestModels\nimport software.amazon.smithy.rust.codegen.core.testutil.unitTest\n\ninternal class ResiliencyConfigCustomizationTest {\n    @Test\n    fun `generates a valid config`() {\n        clientIntegrationTest(BasicTestModels.AwsJson10TestModel) { _, crate ->\n            crate.unitTest(\"resiliency_fields\") {\n                rustTemplate(\n                    \"\"\"\n                    let mut conf = crate::Config::builder();\n                    conf.set_sleep_impl(None);\n                    conf.set_retry_config(None);\n                    \"\"\",\n                )\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customizations/SensitiveOutputDecoratorTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.customizations\n\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.integrationTest\n\nclass SensitiveOutputDecoratorTest {\n    private fun codegenScope(runtimeConfig: RuntimeConfig): Array<Pair<String, Any>> =\n        arrayOf(\n            \"capture_test_logs\" to\n                CargoDependency.smithyRuntimeTestUtil(runtimeConfig).toType()\n                    .resolve(\"test_util::capture_test_logs::capture_test_logs\"),\n            \"capture_request\" to RuntimeType.captureRequest(runtimeConfig),\n            \"SdkBody\" to RuntimeType.sdkBody(runtimeConfig),\n            \"http_1x\" to CargoDependency.Http1x.toType(),\n        )\n\n    private val model =\n        \"\"\"\n        namespace com.example\n        use aws.protocols#awsJson1_0\n        @awsJson1_0\n        service HelloService {\n            operations: [SayHello],\n            version: \"1\"\n        }\n        @optionalAuth\n        operation SayHello { output: TestOutput }\n\n        @sensitive\n        structure Credentials {\n           username: String,\n           password: String\n        }\n\n        structure TestOutput {\n           credentials: Credentials,\n        }\n        \"\"\".asSmithyModel()\n\n    @Test\n    fun `sensitive output in model should redact response body`() {\n        clientIntegrationTest(model) { codegenContext, rustCrate ->\n            rustCrate.integrationTest(\"redacting_sensitive_response_body\") {\n                val moduleName = codegenContext.moduleUseName()\n                Attribute.TokioTest.render(this)\n                rustTemplate(\n                    \"\"\"\n                    async fn redacting_sensitive_response_body() {\n                        let (_logs, logs_rx) = #{capture_test_logs}();\n                        let (http_client, _r) = #{capture_request}(Some(\n                            #{http_1x}::Response::builder()\n                                .status(200)\n                                .body(#{SdkBody}::from(\"\"))\n                                .unwrap(),\n                        ));\n\n                        let config = $moduleName::Config::builder()\n                            .endpoint_url(\"http://localhost:1234\")\n                            .http_client(http_client.clone())\n                            .build();\n                        let client = $moduleName::Client::from_conf(config);\n                        let _ = client.say_hello()\n                            .send()\n                            .await\n                            .expect(\"success\");\n\n                        let log_contents = logs_rx.contents();\n                        assert!(log_contents.contains(\"** REDACTED **\"));\n                    }\n                    \"\"\",\n                    *codegenScope(codegenContext.runtimeConfig),\n                )\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/ClientContextConfigCustomizationTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.endpoint\n\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.unitTest\n\nclass ClientContextConfigCustomizationTest {\n    val model =\n        \"\"\"\n        namespace test\n        use smithy.rules#clientContextParams\n        use aws.protocols#awsJson1_0\n\n        @clientContextParams(aStringParam: {\n            documentation: \"string docs\",\n            type: \"string\"\n        },\n        aBoolParam: {\n            documentation: \"bool docs\",\n            type: \"boolean\"\n        })\n        @awsJson1_0\n        service TestService { operations: [] }\n        \"\"\".asSmithyModel()\n\n    @Test\n    fun `client params generate a valid customization`() {\n        clientIntegrationTest(model) { _, crate ->\n            crate.unitTest {\n                rustTemplate(\n                    \"\"\"\n                    let conf = crate::Config::builder().a_string_param(\"hello!\").a_bool_param(true).build();\n                    assert_eq!(\n                        conf.config\n                            .load::<crate::config::AStringParam>()\n                            .map(|u| u.0.clone())\n                            .unwrap(),\n                        \"hello!\"\n                    );\n                    assert_eq!(\n                        conf.config\n                            .load::<crate::config::ABoolParam>()\n                            .map(|u| u.0),\n                        Some(true)\n                    );\n                    \"\"\",\n                )\n            }\n\n            crate.unitTest(\"unset_fields\") {\n                rustTemplate(\n                    \"\"\"\n                    let conf = crate::Config::builder().a_string_param(\"hello!\").build();\n                    assert_eq!(\n                        conf.config\n                            .load::<crate::config::AStringParam>()\n                            .map(|u| u.0.clone())\n                            .unwrap(),\n                        \"hello!\"\n                    );\n                    assert_eq!(\n                        conf.config\n                            .load::<crate::config::ABoolParam>()\n                            .map(|u| u.0),\n                        None,\n                    );\n                    \"\"\",\n                )\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointParamsGeneratorTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.endpoint\n\ninternal class EndpointParamsGeneratorTest {\n    /*\n    companion object {\n        @JvmStatic\n        fun testSuites(): Stream<TestDiscovery.RulesTestSuite> = TestDiscovery().testSuites()\n    }\n\n    @ParameterizedTest()\n    @MethodSource(\"testSuites\")\n    fun `generate endpoint params for provided test suites`(testSuite: TestDiscovery.RulesTestSuite) {\n        val project = TestWorkspace.testProject()\n        val context = testClientCodegenContext()\n        project.lib {\n            unitTest(\"params_work\") {\n                rustTemplate(\n                    \"\"\"\n                    // this might fail if there are required fields\n                    let _ = #{Params}::builder().build();\n                    \"\"\",\n                    \"Params\" to EndpointParamsGenerator(context, testSuite.ruleSet().parameters).paramsStruct(),\n                )\n            }\n        }\n        project.compileAndTest()\n    }*/\n}\n"
  },
  {
    "path": "codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointResolverGeneratorTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.endpoint\n\nimport org.junit.jupiter.params.ParameterizedTest\nimport org.junit.jupiter.params.provider.MethodSource\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.rust.codegen.client.testutil.EndpointTestDiscovery\nimport software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest\n\nclass EndpointResolverGeneratorTest {\n    companion object {\n        @JvmStatic\n        fun testSuites(): List<Model> {\n            return EndpointTestDiscovery().testCases()\n        }\n    }\n\n    // Useful test util to just run a single test\n//    @Test\n//    fun `test`() {\n//        `generate all rulesets`(testSuites()[0])\n//    }\n\n    @ParameterizedTest(name = \"{0}\")\n    @MethodSource(\"testSuites\")\n    fun `generate all rulesets`(suite: Model) {\n        val serviceId = suite.serviceShapes.firstOrNull()?.id?.toString() ?: \"\"\n\n        // Skip stringarray test - it contains a UnionShape and our JmesPath impl doesn't support that\n        if (serviceId.contains(\"StringArray\")) {\n            return\n        }\n\n        clientIntegrationTest(suite)\n    }\n\n    /*\n    @Test\n    fun `only include actually used functions in endpoints lib`() {\n        testSuites().map { it.ruleSet().sourceLocation.filename }.forEach { println(it) }\n        val suite =\n            testSuites().filter { it.ruleSet().sourceLocation.filename.endsWith(\"/uri-encode.json\") }.findFirst()\n                .orElseThrow()\n        val project = TestWorkspace.testProject()\n        val context = testClientCodegenContext()\n        suite.ruleSet().typecheck()\n        project.lib {\n            val ruleset = EndpointResolverGenerator(\n                context,\n                SmithyEndpointsStdLib + awsStandardLib(TestRuntimeConfig, partitionsJson),\n            ).defaultEndpointResolver(suite.ruleSet())\n            val testGenerator = EndpointTestGenerator(\n                suite.testSuite().testCases,\n                paramsType = EndpointParamsGenerator(context, suite.ruleSet().parameters).paramsStruct(),\n                resolverType = ruleset,\n                suite.ruleSet().parameters,\n                codegenContext = testClientCodegenContext(Model.builder().build()),\n                endpointCustomizations = listOf(),\n            )\n            testGenerator.generate()(this)\n        }\n        project.compileAndTest()\n        project.generatedFiles()\n            .filter { it.toAbsolutePath().toString().contains(\"endpoint_lib/\") }\n            .map { it.fileName.toString() }.sorted() shouldBe listOf(\n            \"diagnostic.rs\", \"uri_encode.rs\",\n        )\n    }\n\n    @Test\n    fun generateEndpoints() {\n        val endpoint = Endpoint.builder().url(Expression.of(\"https://{Region}.amazonaws.com\"))\n            .putHeader(\"x-amz-test\", listOf(Literal.of(\"header-value\")))\n            .addAuthScheme(\n                \"sigv4\",\n                hashMapOf(\"signingName\" to Literal.of(\"service\"), \"signingScope\" to Literal.of(\"{Region}\")),\n            )\n            .build()\n        val scope = Scope<Type>()\n        scope.insert(\"Region\", Type.stringType())\n        endpoint.typeCheck(scope)\n        val context = testClientCodegenContext()\n        val generator = EndpointResolverGenerator(context, listOf())\n        TestWorkspace.testProject().unitTest {\n            rustTemplate(\n                \"\"\"\n                // create a local for region to generate against\n                let region = \"us-east-1\";\n                let endpoint = #{endpoint:W};\n\n                \"\"\",\n                \"endpoint\" to generator.generateEndpoint(endpoint),\n            )\n        }.compileAndTest()\n    }*/\n}\n"
  },
  {
    "path": "codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/EndpointsDecoratorTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.endpoint\n\nimport io.kotest.assertions.throwables.shouldThrow\nimport io.kotest.matchers.string.shouldContain\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.testutil.IntegrationTestParams\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.integrationTest\nimport software.amazon.smithy.rust.codegen.core.testutil.runWithWarnings\nimport software.amazon.smithy.rust.codegen.core.util.CommandError\nimport software.amazon.smithy.rust.codegen.core.util.runCommand\n\n/**\n * End-to-end test of endpoint resolvers, attaching a real resolver to a fully generated service\n */\nclass EndpointsDecoratorTest {\n    val model =\n        \"\"\"\n        namespace test\n\n        use smithy.rules#endpointRuleSet\n        use smithy.rules#endpointTests\n\n        use smithy.rules#clientContextParams\n        use smithy.rules#staticContextParams\n        use smithy.rules#operationContextParams\n        use smithy.rules#contextParam\n        use aws.protocols#awsJson1_1\n\n        @awsJson1_1\n        @endpointRuleSet({\n            \"version\": \"1.0\",\n            \"rules\": [{\n                \"conditions\": [\n                    {\"fn\": \"isSet\", \"argv\": [{\"ref\":\"Region\"}]},\n                    {\"fn\": \"isSet\", \"argv\": [{\"ref\":\"ABoolParam\"}]},\n                    {\"fn\": \"booleanEquals\", \"argv\": [{\"ref\": \"ABoolParam\"}, false]}\n                ],\n                \"type\": \"endpoint\",\n                \"endpoint\": {\n                    \"url\": \"https://www.{Region}.example.com\",\n                    \"properties\": {\n                        \"first-properties\": {\n                            \"z-first\": \"zazz\",\n                            \"y-second\": \"bar\",\n                            \"x-third\": \"baz\"\n                        },\n                        \"second-properties\": [1,2,3]\n                    }\n                }\n            }],\n            \"parameters\": {\n                \"Bucket\": { \"required\": false, \"type\": \"string\" },\n                \"Region\": { \"required\": false, \"type\": \"string\", \"builtIn\": \"AWS::Region\" },\n                \"BuiltInWithDefault\": { \"required\": true, \"type\": \"string\", \"builtIn\": \"AWS::DefaultBuiltIn\", \"default\": \"some-default\" },\n                \"BoolBuiltInWithDefault\": { \"required\": true, \"type\": \"boolean\", \"builtIn\": \"AWS::FooBar\", \"default\": true },\n                \"AStringParam\": { \"required\": false, \"type\": \"string\" },\n                \"ABoolParam\": { \"required\": false, \"type\": \"boolean\" },\n                \"AStringArrayParam\": { \"required\": false, \"type\": \"stringArray\" },\n                \"JmesPathParamString\": {\"required\": false, type: \"string\"},\n                \"JmesPathParamBoolean\": {\"required\": false, type: \"boolean\"},\n                \"JmesPathParamStringArray\": {\"required\": false, type: \"stringArray\"},\n            }\n        })\n        @clientContextParams(\n            AStringParam: {\n                documentation: \"string docs\",\n                type: \"string\"\n            },\n            ABoolParam: {\n                documentation: \"bool docs\",\n                type: \"boolean\"\n            }\n        )\n        @endpointTests({\n          \"version\": \"1.0\",\n          \"testCases\": [\n            {\n              \"documentation\": \"uriEncode when the string has nothing to encode returns the input\",\n              \"params\": {\n                \"Region\": \"test-region\"\n              },\n              \"operationInputs\": [\n                { \"operationName\": \"TestOperation\", \"operationParams\": { \"nested\": { \"field\": \"test\" } } }\n              ],\n              \"expect\": {\n                \"endpoint\": {\n                    \"url\": \"https://failingtest.com\"\n                    \"properties\": {\n                        \"first-properties\": {\n                            \"a-first\": \"zazz\",\n                            \"b-second\": \"bar\",\n                            \"c-third\": \"baz\"\n                        },\n                        \"second-properties\": [1,2,3]\n                    }\n                }\n              }\n            }\n         ]\n        })\n        service TestService {\n            operations: [TestOperation]\n        }\n\n        @staticContextParams(\n            Region: { value: \"us-east-2\" },\n            AStringArrayParam: {value: [\"a\", \"b\", \"c\"]}\n        )\n        @operationContextParams(\n            JmesPathParamString: {\n                path: \"nested.field\",\n            }\n            JmesPathParamBoolean: {\n                path: \"nested.boolField\",\n            }\n            JmesPathParamStringArray: {\n                path: \"keys(nested.mapField)\",\n            }\n        )\n        operation TestOperation {\n            input: TestOperationInput\n        }\n\n        @input\n        structure TestOperationInput {\n            @contextParam(name: \"Bucket\")\n            @required\n            bucket: String,\n            nested: NestedStructure\n        }\n\n        structure NestedStructure {\n            field: String,\n            boolField: Boolean,\n            mapField: IntegerMap,\n        }\n\n        map IntegerMap {\n            key: String,\n            value: Integer\n        }\n        \"\"\".asSmithyModel(disableValidation = true)\n\n    val bddModel =\n        \"\"\"\n        namespace test\n\n        use aws.protocols#restJson1\n        use smithy.rules#clientContextParams\n        use smithy.rules#endpointBdd\n        use smithy.rules#endpointTests\n\n        @clientContextParams(\n            Region: {type: \"string\", documentation: \"docs\"}\n            UseFips: {type: \"boolean\", documentation: \"docs\"}\n        )\n        @endpointBdd({\n            version: \"1.1\"\n            \"parameters\": {\n                \"Region\": {\n                    \"required\": true,\n                    \"documentation\": \"The AWS region\",\n                    \"type\": \"string\"\n                },\n                \"UseFips\": {\n                    \"required\": true,\n                    \"default\": false,\n                    \"documentation\": \"Use FIPS endpoints\",\n                    \"type\": \"boolean\"\n                }\n            },\n            \"conditions\": [\n                {\n                    \"fn\": \"booleanEquals\",\n                    \"argv\": [\n                        {\n                            \"ref\": \"UseFips\"\n                        },\n                        true\n                    ]\n                }\n            ],\n            \"results\": [\n                {\n                    \"conditions\": [],\n                    \"endpoint\": {\n                        \"url\": \"https://service-fips.{Region}.amazonaws.com\",\n                        \"properties\": {},\n                        \"headers\": {}\n                    },\n                    \"type\": \"endpoint\"\n                },\n                {\n                    \"conditions\": [],\n                    \"endpoint\": {\n                        \"url\": \"https://service.{Region}.amazonaws.com\",\n                        \"properties\": {},\n                        \"headers\": {}\n                    },\n                    \"type\": \"endpoint\"\n                }\n            ],\n            \"root\": 2,\n            \"nodeCount\": 2,\n            \"nodes\": \"/////wAAAAH/////AAAAAAX14QEF9eEC\"\n        })\n        @endpointTests({\n          \"version\": \"1.0\",\n          \"testCases\": [\n            {\n              \"documentation\": \"Region properly added in url.\",\n              \"params\": {\n                \"Region\": \"test-region\"\n              },\n              \"operationInputs\": [\n                { \"operationName\": \"Echo\", \"operationParams\": { \"string\": \"Foo\" } }\n              ],\n              \"expect\": {\n                \"endpoint\": {\n                    \"url\": \"https://service.test-region.amazonaws.com\",\n                    \"properties\": {}\n                }\n              }\n            },\n            {\n              \"documentation\": \"Fips properly added in url.\",\n              \"params\": {\n                \"Region\": \"test-region\",\n                \"UseFips\": true\n              },\n              \"operationInputs\": [\n                { \"operationName\": \"Echo\", \"operationParams\": { \"string\": \"Foo\" } }\n              ],\n              \"expect\": {\n                \"endpoint\": {\n                    \"url\": \"https://service-fips.test-region.amazonaws.com\",\n                    \"properties\": {}\n                }\n              }\n            }\n         ]\n        })\n        @restJson1\n        service ServiceWithEndpointBdd {\n            version: \"2022-01-01\"\n            operations:[\n                Echo\n            ]\n        }\n        @http(method: \"PUT\", uri: \"/echo\")\n        operation Echo {\n            input := {\n                string: String\n            }\n            output := {\n                string: String\n            }\n        }\n        \"\"\".trimIndent().asSmithyModel(smithyVersion = \"2\")\n\n    @Test\n    fun `resolve endpoint BDD`() {\n        val testDir =\n            clientIntegrationTest(\n                bddModel,\n                // Just run endpoint tests.\n                IntegrationTestParams(command = { \"cargo test --lib config::endpoint\".runWithWarnings(it) }),\n            )\n        \"cargo clippy\".runWithWarnings(testDir)\n    }\n\n    @Test\n    fun `resolve endpoint`() {\n        val testDir =\n            clientIntegrationTest(\n                model,\n                // Just run integration tests.\n                IntegrationTestParams(command = { \"cargo test --all-features --test *\".runCommand(it) }),\n            ) { clientCodegenContext, rustCrate ->\n                rustCrate.integrationTest(\"endpoint_params_test\") {\n                    val moduleName = clientCodegenContext.moduleUseName()\n                    Attribute.TokioTest.render(this)\n                    rustTemplate(\n                        \"\"\"\n                        async fn endpoint_params_are_set() {\n                            use #{NeverClient};\n                            use #{TokioSleep};\n                            use aws_smithy_runtime_api::box_error::BoxError;\n                            use aws_smithy_runtime_api::client::endpoint::EndpointResolverParams;\n                            use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents;\n                            use aws_smithy_types::config_bag::ConfigBag;\n                            use aws_smithy_types::endpoint::Endpoint;\n                            use aws_smithy_types::timeout::TimeoutConfig;\n                            use std::sync::atomic::AtomicBool;\n                            use std::sync::atomic::Ordering;\n                            use std::sync::Arc;\n                            use std::time::Duration;\n                            use $moduleName::{\n                                config::endpoint::Params, config::interceptors::BeforeTransmitInterceptorContextRef,\n                                config::Intercept, config::SharedAsyncSleep, types::NestedStructure, Client, Config,\n                            };\n\n                            ##[derive(Clone, Debug, Default)]\n                            struct TestInterceptor {\n                                called: Arc<AtomicBool>,\n                            }\n                            impl Intercept for TestInterceptor {\n                                fn name(&self) -> &'static str {\n                                    \"TestInterceptor\"\n                                }\n\n                                fn read_before_transmit(\n                                    &self,\n                                    _context: &BeforeTransmitInterceptorContextRef<'_>,\n                                    _runtime_components: &RuntimeComponents,\n                                    cfg: &mut ConfigBag,\n                                ) -> Result<(), BoxError> {\n                                    let params = cfg\n                                        .load::<EndpointResolverParams>()\n                                        .expect(\"params set in config\");\n                                    let preset_params: &Params = params.get().expect(\"correct type\");\n                                    let manual_params: &Params = &Params::builder()\n                                        .bucket(\"bucket-name\".to_string())\n                                        .built_in_with_default(\"some-default\")\n                                        .bool_built_in_with_default(true)\n                                        .a_bool_param(false)\n                                        .a_string_param(\"hello\".to_string())\n                                        .region(\"us-east-2\".to_string())\n                                        .a_string_array_param(\n                                            vec![\"a\", \"b\", \"c\"]\n                                                .iter()\n                                                .map(ToString::to_string)\n                                                .collect::<Vec<_>>(),\n                                        )\n                                        .jmes_path_param_string_array(vec![\"key2\".to_string(), \"key1\".to_string()])\n                                        .jmes_path_param_string(\"nested-field\")\n                                        .build()\n                                        .unwrap();\n\n                                    // The params struct for this test contains a vec sourced from the JMESPath keys function which\n                                    // does not guarantee the order. Due to this we cannot compare the preset_params with the\n                                    // manual_params directly, instead we must assert equlaity field by field.\n                                    assert_eq!(preset_params.bucket(), manual_params.bucket());\n                                    assert_eq!(preset_params.region(), manual_params.region());\n                                    assert_eq!(\n                                        preset_params.a_string_param(),\n                                        manual_params.a_string_param()\n                                    );\n                                    assert_eq!(\n                                        preset_params.built_in_with_default(),\n                                        manual_params.built_in_with_default()\n                                    );\n                                    assert_eq!(\n                                        preset_params.bool_built_in_with_default(),\n                                        manual_params.bool_built_in_with_default()\n                                    );\n                                    assert_eq!(preset_params.a_bool_param(), manual_params.a_bool_param());\n                                    assert_eq!(\n                                        preset_params.a_string_array_param(),\n                                        manual_params.a_string_array_param()\n                                    );\n                                    assert_eq!(\n                                        preset_params.jmes_path_param_string(),\n                                        manual_params.jmes_path_param_string()\n                                    );\n                                    assert_eq!(\n                                        preset_params.jmes_path_param_boolean(),\n                                        manual_params.jmes_path_param_boolean()\n                                    );\n                                    assert!(preset_params\n                                        .jmes_path_param_string_array()\n                                        .unwrap()\n                                        .contains(&\"key1\".to_string()));\n                                    assert!(preset_params\n                                        .jmes_path_param_string_array()\n                                        .unwrap()\n                                        .contains(&\"key2\".to_string()));\n\n                                    let endpoint = cfg.load::<Endpoint>().expect(\"endpoint set in config\");\n                                    assert_eq!(endpoint.url(), \"https://www.us-east-2.example.com\");\n\n                                    self.called.store(true, Ordering::Relaxed);\n                                    Ok(())\n                                }\n                            }\n\n                            let interceptor = TestInterceptor::default();\n                            let config = Config::builder()\n                                .behavior_version_latest()\n                                .http_client(NeverClient::new())\n                                .interceptor(interceptor.clone())\n                                .timeout_config(\n                                    TimeoutConfig::builder()\n                                        .operation_timeout(Duration::from_millis(30))\n                                        .build(),\n                                )\n                                .sleep_impl(SharedAsyncSleep::new(TokioSleep::new()))\n                                .a_string_param(\"hello\")\n                                .a_bool_param(false)\n                                .build();\n                            let client = Client::from_conf(config);\n\n                            let _ = dbg!(\n                                client\n                                .test_operation()\n                                .bucket(\"bucket-name\")\n                                .nested(\n                                    NestedStructure::builder()\n                                        .field(\"nested-field\")\n                                        .map_field(\"key1\", 1)\n                                        .map_field(\"key2\", 2)\n                                        .build()\n                                )\n                                .send()\n                                .await\n                            );\n                            assert!(\n                                interceptor.called.load(Ordering::Relaxed),\n                                \"the interceptor should have been called\"\n                            );\n\n                            // bucket_name is unset and marked as required on the model, so we'll refuse to construct this request\n                            let err = client.test_operation().send().await.expect_err(\"param missing\");\n                            assert_eq!(format!(\"{}\", err), \"failed to construct request\");\n                        }\n                        \"\"\",\n                        \"NeverClient\" to\n                            CargoDependency.smithyHttpClientTestUtil(clientCodegenContext.runtimeConfig)\n                                .toType().resolve(\"test_util::NeverClient\"),\n                        \"TokioSleep\" to\n                            CargoDependency.smithyAsync(clientCodegenContext.runtimeConfig)\n                                .withFeature(\"rt-tokio\").toType().resolve(\"rt::sleep::TokioSleep\"),\n                    )\n                }\n            }\n        // the model has an intentionally failing test—ensure it fails\n        val failure = shouldThrow<CommandError> { \"cargo test\".runWithWarnings(testDir) }\n        failure.output shouldContain \"endpoint::test::test_1\"\n        failure.output shouldContain \"https://failingtest.com\"\n        \"cargo clippy\".runWithWarnings(testDir)\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/rulesgen/ExpressionGeneratorTest.kt",
    "content": "/*\n *  Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n *  SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.endpoint.rulesgen\n\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.model.node.ArrayNode\nimport software.amazon.smithy.model.node.BooleanNode\nimport software.amazon.smithy.model.node.Node\nimport software.amazon.smithy.rulesengine.language.syntax.Identifier\nimport software.amazon.smithy.rulesengine.language.syntax.expressions.Expression\nimport software.amazon.smithy.rulesengine.language.syntax.expressions.Template\nimport software.amazon.smithy.rulesengine.language.syntax.expressions.functions.BooleanEquals\nimport software.amazon.smithy.rulesengine.language.syntax.expressions.functions.StringEquals\nimport software.amazon.smithy.rulesengine.language.syntax.expressions.literal.Literal\nimport software.amazon.smithy.rust.codegen.client.smithy.endpoint.Context\nimport software.amazon.smithy.rust.codegen.client.smithy.endpoint.generators.FunctionRegistry\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.testutil.TestRuntimeConfig\nimport software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace\nimport software.amazon.smithy.rust.codegen.core.testutil.compileAndTest\nimport software.amazon.smithy.rust.codegen.core.testutil.unitTest\n\ninternal class ExprGeneratorTest {\n    private val testContext = Context(FunctionRegistry(listOf()), TestRuntimeConfig)\n\n    @Test\n    fun generateExprs() {\n        val boolEq = BooleanEquals.ofExpressions(Expression.of(true), Expression.of(true))\n        val strEq = StringEquals.ofExpressions(Expression.of(\"helloworld\"), Expression.of(\"goodbyeworld\")).not()\n        val combined = BooleanEquals.ofExpressions(boolEq, strEq)\n        TestWorkspace.testProject().unitTest {\n            val generator = ExpressionGenerator(Ownership.Borrowed, testContext)\n            rust(\"assert_eq!(true, #W);\", generator.generate(boolEq))\n            rust(\"assert_eq!(true, #W);\", generator.generate(strEq))\n            rust(\"assert_eq!(true, #W);\", generator.generate(combined))\n        }.compileAndTest(runClippy = true)\n    }\n\n    @Test\n    fun generateLiterals1() {\n        val literal =\n            Literal.recordLiteral(\n                mutableMapOf(\n                    Identifier.of(\"this\") to Literal.integerLiteral(5),\n                    Identifier.of(\"that\") to\n                        Literal.stringLiteral(\n                            Template.fromString(\"static\"),\n                        ),\n                ),\n            )\n        TestWorkspace.testProject().unitTest {\n            val generator =\n                ExpressionGenerator(Ownership.Borrowed, testContext)\n            rust(\"\"\"assert_eq!(Some(&(5.into())), #W.get(\"this\"));\"\"\", generator.generate(literal))\n        }.compileAndTest(runClippy = true)\n    }\n\n    @Test\n    fun generateLiterals2() {\n        val project = TestWorkspace.testProject()\n        val gen =\n            ExpressionGenerator(\n                Ownership.Borrowed,\n                Context(\n                    FunctionRegistry(listOf()),\n                    TestRuntimeConfig,\n                ),\n            )\n        project.unitTest {\n            rust(\"\"\"let extra = \"helloworld\";\"\"\")\n            rust(\"assert_eq!(true, #W);\", gen.generate(Expression.of(true)))\n            rust(\"assert_eq!(false, #W);\", gen.generate(Expression.of(false)))\n            rust(\"\"\"assert_eq!(\"blah\", #W);\"\"\", gen.generate(Expression.of(\"blah\")))\n            rust(\"\"\"assert_eq!(\"helloworld: rust\", #W);\"\"\", gen.generate(Expression.of(\"{extra}: rust\")))\n            rustTemplate(\n                \"\"\"\n                let mut expected = std::collections::HashMap::new();\n                expected.insert(\"a\".to_string(), #{Document}::Bool(true));\n                expected.insert(\"b\".to_string(), #{Document}::String(\"hello\".to_string()));\n                expected.insert(\"c\".to_string(), #{Document}::Array(vec![true.into()]));\n                assert_eq!(expected, #{actual:W});\n                \"\"\",\n                \"Document\" to RuntimeType.document(TestRuntimeConfig),\n                \"actual\" to\n                    gen.generate(\n                        Literal.fromNode(\n                            Node.objectNode().withMember(\"a\", true).withMember(\"b\", \"hello\")\n                                .withMember(\"c\", ArrayNode.arrayNode(BooleanNode.from(true))),\n                        ),\n                    ),\n            )\n        }.compileAndTest(runClippy = true)\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/endpoint/rulesgen/TemplateGeneratorTest.kt",
    "content": "/*\n *  Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n *  SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.endpoint.rulesgen\n\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.rulesengine.language.syntax.expressions.Expression\nimport software.amazon.smithy.rulesengine.language.syntax.expressions.Template\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace\nimport software.amazon.smithy.rust.codegen.core.testutil.compileAndTest\nimport software.amazon.smithy.rust.codegen.core.testutil.unitTest\nimport software.amazon.smithy.rust.codegen.core.util.dq\n\ninternal class TemplateGeneratorTest {\n    /**\n     * helper to assert that a template string is templated to the expected result\n     */\n    private fun assertTemplateEquals(\n        template: String,\n        result: String,\n    ) {\n        val literalTemplate = Template.fromString(template)\n        // For testing,\n        val exprFn = { expr: Expression, ownership: Ownership ->\n            writable {\n                rust(\n                    (expr.toString().uppercase() + ownership).dq(),\n                )\n                if (ownership == Ownership.Owned) {\n                    rust(\".to_string()\")\n                }\n            }\n        }\n        val borrowedGenerator = TemplateGenerator(Ownership.Borrowed, exprFn)\n        val ownedGenerator = TemplateGenerator(Ownership.Owned, exprFn)\n        val project = TestWorkspace.testProject()\n        project.unitTest {\n            rust(\n                \"assert_eq!(${result.dq()}, #W);\",\n                writable {\n                    literalTemplate.accept(borrowedGenerator).forEach { part -> part(this) }\n                },\n            )\n            rust(\n                \"let _: String = #W;\",\n                writable { literalTemplate.accept(ownedGenerator).forEach { part -> part(this) } },\n            )\n        }\n        project.compileAndTest()\n    }\n\n    @Test\n    fun testLiteralTemplate() {\n        assertTemplateEquals(\"https://example.com\", \"https://example.com\")\n    }\n\n    @Test\n    fun testDynamicTemplate() {\n        assertTemplateEquals(\"https://{Region}.example.com\", \"https://REGIONBorrowed.example.com\")\n    }\n\n    @Test\n    fun testSingleDynamicTemplate() {\n        assertTemplateEquals(\"{Region}\", \"REGIONBorrowed\")\n    }\n\n    @Test\n    fun testMultipartTemplate() {\n        assertTemplateEquals(\"https://{Region}.{Bucket}.foo.com\", \"https://REGIONBorrowed.BUCKETBorrowed.foo.com\")\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientEnumGeneratorTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.generators\n\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.StringShape\nimport software.amazon.smithy.rust.codegen.client.testutil.testClientCodegenContext\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.compileAndTest\nimport software.amazon.smithy.rust.codegen.core.testutil.unitTest\nimport software.amazon.smithy.rust.codegen.core.util.lookup\n\nclass ClientEnumGeneratorTest {\n    @Test\n    fun `matching on enum should be forward-compatible`() {\n        fun expectMatchExpressionCompiles(\n            model: Model,\n            shapeId: String,\n            enumToMatchOn: String,\n        ) {\n            val shape = model.lookup<StringShape>(shapeId)\n            val context = testClientCodegenContext(model)\n            val project = TestWorkspace.testProject(context.symbolProvider)\n            project.moduleFor(shape) {\n                ClientEnumGenerator(context, shape, emptyList()).render(this)\n                unitTest(\n                    \"matching_on_enum_should_be_forward_compatible\",\n                    \"\"\"\n                    match $enumToMatchOn {\n                        SomeEnum::Variant1 => panic!(\"expected `Variant3` but got `Variant1`\"),\n                        SomeEnum::Variant2 => panic!(\"expected `Variant3` but got `Variant2`\"),\n                        other @ _ if other.as_str() == \"Variant3\" => {},\n                        _ => panic!(\"expected `Variant3` but got `_`\"),\n                    }\n                    \"\"\",\n                )\n            }\n            project.compileAndTest()\n        }\n\n        val modelV1 =\n            \"\"\"\n            namespace test\n\n            @enum([\n                { name: \"Variant1\", value: \"Variant1\" },\n                { name: \"Variant2\", value: \"Variant2\" },\n            ])\n            string SomeEnum\n            \"\"\".asSmithyModel()\n        val variant3AsUnknown = \"\"\"SomeEnum::from(\"Variant3\")\"\"\"\n        expectMatchExpressionCompiles(modelV1, \"test#SomeEnum\", variant3AsUnknown)\n\n        val modelV2 =\n            \"\"\"\n            namespace test\n\n            @enum([\n                { name: \"Variant1\", value: \"Variant1\" },\n                { name: \"Variant2\", value: \"Variant2\" },\n                { name: \"Variant3\", value: \"Variant3\" },\n            ])\n            string SomeEnum\n            \"\"\".asSmithyModel()\n        val variant3AsVariant3 = \"SomeEnum::Variant3\"\n        expectMatchExpressionCompiles(modelV2, \"test#SomeEnum\", variant3AsVariant3)\n    }\n\n    @Test\n    fun `impl debug for non-sensitive enum should implement the derived debug trait`() {\n        val model =\n            \"\"\"\n            namespace test\n            @enum([\n                { name: \"Foo\", value: \"Foo\" },\n                { name: \"Bar\", value: \"Bar\" },\n            ])\n            string SomeEnum\n            \"\"\".asSmithyModel()\n\n        val shape = model.lookup<StringShape>(\"test#SomeEnum\")\n        val context = testClientCodegenContext(model)\n        val project = TestWorkspace.testProject(context.symbolProvider)\n        project.moduleFor(shape) {\n            ClientEnumGenerator(context, shape, emptyList()).render(this)\n            unitTest(\n                \"impl_debug_for_non_sensitive_enum_should_implement_the_derived_debug_trait\",\n                \"\"\"\n                assert_eq!(format!(\"{:?}\", SomeEnum::Foo), \"Foo\");\n                assert_eq!(format!(\"{:?}\", SomeEnum::Bar), \"Bar\");\n                assert_eq!(format!(\"{}\", SomeEnum::Foo), \"Foo\");\n                assert_eq!(SomeEnum::Bar.to_string(), \"Bar\");\n                assert_eq!(\n                    format!(\"{:?}\", SomeEnum::from(\"Baz\")),\n                    \"Unknown(UnknownVariantValue(\\\"Baz\\\"))\"\n                );\n                \"\"\",\n            )\n        }\n        project.compileAndTest()\n    }\n\n    // The idempotency of RustModules paired with Smithy's alphabetic order shape iteration meant that\n    // if an @sensitive enum was the first enum generated that the opaque type underlying the Unknown\n    // variant would not derive Debug, breaking all non-@sensitive enums\n    @Test\n    fun `sensitive enum in earlier alphabetic order does not break non-sensitive enums`() {\n        val model =\n            \"\"\"\n            namespace test\n\n            @sensitive\n            @enum([\n                { name: \"Foo\", value: \"Foo\" },\n                { name: \"Bar\", value: \"Bar\" },\n            ])\n            string FooA\n\n            @enum([\n                { name: \"Baz\", value: \"Baz\" },\n                { name: \"Ahh\", value: \"Ahh\" },\n            ])\n            string FooB\n            \"\"\".asSmithyModel()\n\n        val shapeA = model.lookup<StringShape>(\"test#FooA\")\n        val shapeB = model.lookup<StringShape>(\"test#FooB\")\n        val context = testClientCodegenContext(model)\n        val project = TestWorkspace.testProject(context.symbolProvider)\n        project.moduleFor(shapeA) {\n            ClientEnumGenerator(context, shapeA, emptyList()).render(this)\n        }\n        project.moduleFor(shapeB) {\n            ClientEnumGenerator(context, shapeB, emptyList()).render(this)\n            unitTest(\n                \"impl_debug_for_non_sensitive_enum_should_implement_the_derived_debug_trait\",\n                \"\"\"\n                assert_eq!(format!(\"{:?}\", FooB::Baz), \"Baz\");\n                assert_eq!(format!(\"{:?}\", FooB::Ahh), \"Ahh\");\n                assert_eq!(format!(\"{}\", FooB::Baz), \"Baz\");\n                assert_eq!(FooB::Ahh.to_string(), \"Ahh\");\n                assert_eq!(\n                    format!(\"{:?}\", FooB::from(\"Bar\")),\n                    \"Unknown(UnknownVariantValue(\\\"Bar\\\"))\"\n                );\n                \"\"\",\n            )\n        }\n        project.compileAndTest()\n    }\n\n    @Test\n    fun `it escapes the Unknown variant if the enum has an unknown value in the model`() {\n        val model =\n            \"\"\"\n            namespace test\n            @enum([\n                { name: \"Known\", value: \"Known\" },\n                { name: \"Unknown\", value: \"Unknown\" },\n                { name: \"UnknownValue\", value: \"UnknownValue\" },\n            ])\n            string SomeEnum\n            \"\"\".asSmithyModel()\n\n        val shape = model.lookup<StringShape>(\"test#SomeEnum\")\n        val context = testClientCodegenContext(model)\n        val project = TestWorkspace.testProject(context.symbolProvider)\n        project.moduleFor(shape) {\n            ClientEnumGenerator(context, shape, emptyList()).render(this)\n            unitTest(\n                \"it_escapes_the_unknown_variant_if_the_enum_has_an_unknown_value_in_the_model\",\n                \"\"\"\n                assert_eq!(SomeEnum::from(\"Unknown\"), SomeEnum::UnknownValue);\n                assert_eq!(SomeEnum::from(\"UnknownValue\"), SomeEnum::UnknownValue_);\n                assert_eq!(\n                    SomeEnum::from(\"SomethingNew\"),\n                    SomeEnum::Unknown(crate::primitives::sealed_enum_unknown::UnknownVariantValue(\"SomethingNew\".to_owned()))\n                );\n                \"\"\",\n            )\n        }\n        project.compileAndTest()\n    }\n\n    @Test\n    fun `generated named enums can roundtrip between string and enum value on the unknown variant`() {\n        val model =\n            \"\"\"\n            namespace test\n            @enum([\n                { value: \"t2.nano\", name: \"T2_NANO\" },\n                { value: \"t2.micro\", name: \"T2_MICRO\" },\n            ])\n            string InstanceType\n            \"\"\".asSmithyModel()\n\n        val shape = model.lookup<StringShape>(\"test#InstanceType\")\n        val context = testClientCodegenContext(model)\n        val project = TestWorkspace.testProject(context.symbolProvider)\n        project.moduleFor(shape) {\n            rust(\"##![allow(deprecated)]\")\n            ClientEnumGenerator(context, shape, emptyList()).render(this)\n            unitTest(\n                \"generated_named_enums_roundtrip\",\n                \"\"\"\n                let instance = InstanceType::T2Micro;\n                assert_eq!(instance.as_str(), \"t2.micro\");\n                assert_eq!(InstanceType::from(\"t2.nano\"), InstanceType::T2Nano);\n                assert_eq!(instance.to_string(), \"t2.micro\");\n                // round trip unknown variants:\n                assert_eq!(\n                    InstanceType::from(\"other\"),\n                    InstanceType::Unknown(crate::primitives::sealed_enum_unknown::UnknownVariantValue(\"other\".to_owned()))\n                );\n                assert_eq!(InstanceType::from(\"other\").as_str(), \"other\");\n                assert_eq!(InstanceType::from(\"other\").to_string(), \"other\");\n                \"\"\",\n            )\n        }\n        project.compileAndTest()\n    }\n\n    @Test\n    fun `it handles enum values containing hash characters`() {\n        val model =\n            \"\"\"\n            namespace test\n            @enum([\n                { value: \"Fruits#Apple\", name: \"FRUITS_APPLE\" },\n                { value: \"Fruits#Banana\", name: \"FRUITS_BANANA\" },\n                { value: \"Veggies#Carrot\", name: \"VEGGIES_CARROT\" },\n            ])\n            string FoodCategory\n            \"\"\".asSmithyModel()\n\n        val shape = model.lookup<StringShape>(\"test#FoodCategory\")\n        val context = testClientCodegenContext(model)\n        val project = TestWorkspace.testProject(context.symbolProvider)\n        project.moduleFor(shape) {\n            rust(\"##![allow(deprecated)]\")\n            ClientEnumGenerator(context, shape, emptyList()).render(this)\n            unitTest(\n                \"enum_values_with_hash_characters\",\n                \"\"\"\n                assert_eq!(FoodCategory::FruitsApple.as_str(), \"Fruits#Apple\");\n                assert_eq!(FoodCategory::FruitsBanana.as_str(), \"Fruits#Banana\");\n                assert_eq!(FoodCategory::VeggiesCarrot.as_str(), \"Veggies#Carrot\");\n                assert_eq!(FoodCategory::from(\"Fruits#Apple\"), FoodCategory::FruitsApple);\n                assert_eq!(FoodCategory::from(\"Veggies#Carrot\"), FoodCategory::VeggiesCarrot);\n                assert_eq!(format!(\"{}\", FoodCategory::FruitsApple), \"Fruits#Apple\");\n                \"\"\",\n            )\n        }\n        project.compileAndTest()\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientInstantiatorTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.generators\n\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.model.node.Node\nimport software.amazon.smithy.model.shapes.StringShape\nimport software.amazon.smithy.rust.codegen.client.testutil.testClientCodegenContext\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.withBlock\nimport software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.compileAndTest\nimport software.amazon.smithy.rust.codegen.core.testutil.unitTest\nimport software.amazon.smithy.rust.codegen.core.util.dq\nimport software.amazon.smithy.rust.codegen.core.util.lookup\n\ninternal class ClientInstantiatorTest {\n    private val model =\n        \"\"\"\n        namespace com.test\n\n        @enum([\n            { value: \"t2.nano\" },\n            { value: \"t2.micro\" },\n        ])\n        string UnnamedEnum\n\n        @enum([\n            {\n                value: \"t2.nano\",\n                name: \"T2_NANO\",\n            },\n            {\n                value: \"t2.micro\",\n                name: \"T2_MICRO\",\n            },\n        ])\n        string NamedEnum\n        \"\"\".asSmithyModel()\n\n    private val codegenContext = testClientCodegenContext(model)\n    private val symbolProvider = codegenContext.symbolProvider\n\n    @Test\n    fun `generate named enums`() {\n        val shape = model.lookup<StringShape>(\"com.test#NamedEnum\")\n        val sut = ClientInstantiator(codegenContext)\n        val data = Node.parse(\"t2.nano\".dq())\n\n        val project = TestWorkspace.testProject(symbolProvider)\n        project.moduleFor(shape) {\n            ClientEnumGenerator(codegenContext, shape, emptyList()).render(this)\n            unitTest(\"generate_named_enums\") {\n                withBlock(\"let result = \", \";\") {\n                    sut.render(this, shape, data)\n                }\n                rust(\"assert_eq!(result, NamedEnum::T2Nano);\")\n            }\n        }\n        project.compileAndTest()\n    }\n\n    @Test\n    fun `generate unnamed enums`() {\n        val shape = model.lookup<StringShape>(\"com.test#UnnamedEnum\")\n        val sut = ClientInstantiator(codegenContext)\n        val data = Node.parse(\"t2.nano\".dq())\n        // The client SDK should accept unknown variants as valid.\n        val notValidVariant = Node.parse(\"not-a-valid-variant\".dq())\n\n        val project = TestWorkspace.testProject(symbolProvider)\n        project.moduleFor(shape) {\n            ClientEnumGenerator(codegenContext, shape, emptyList()).render(this)\n            unitTest(\"generate_unnamed_enums\") {\n                withBlock(\"let result = \", \";\") {\n                    sut.render(this, shape, data)\n                }\n                rust(\"\"\"assert_eq!(result, UnnamedEnum(\"$data\".to_owned()));\"\"\")\n                withBlock(\"let result = \", \";\") {\n                    sut.render(this, shape, notValidVariant)\n                }\n                rust(\"\"\"assert_eq!(result, UnnamedEnum(\"$notValidVariant\".to_owned()));\"\"\")\n            }\n        }\n        project.compileAndTest()\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ClientRuntimeTypesReExportGeneratorTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.generators\n\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.unitTest\n\nclass ClientRuntimeTypesReExportGeneratorTest {\n    private val model =\n        \"\"\"\n        namespace test\n        use aws.protocols#awsJson1_0\n\n        @awsJson1_0\n        service HelloService {\n            operations: [],\n            version: \"1\"\n        }\n        \"\"\".asSmithyModel()\n\n    @Test\n    fun `it should reexport client runtime types`() {\n        clientIntegrationTest(model) { _, crate ->\n            crate.unitTest {\n                rust(\n                    \"\"\"\n                    ##[allow(unused_imports)]\n                    {\n                        use crate::config::ConfigBag;\n                        use crate::config::RuntimeComponents;\n                        use crate::config::IdentityCache;\n\n                        use crate::config::endpoint::SharedEndpointResolver;\n                        use crate::config::endpoint::EndpointFuture;\n                        use crate::config::endpoint::Endpoint;\n\n                        use crate::config::retry::ClassifyRetry;\n                        use crate::config::retry::RetryAction;\n                        use crate::config::retry::ShouldAttempt;\n\n                        use crate::config::http::HttpRequest;\n                        use crate::config::http::HttpResponse;\n\n                        use crate::config::interceptors::AfterDeserializationInterceptorContextRef;\n                        use crate::config::interceptors::BeforeDeserializationInterceptorContextMut;\n                        use crate::config::interceptors::BeforeDeserializationInterceptorContextRef;\n                        use crate::config::interceptors::BeforeSerializationInterceptorContextMut;\n                        use crate::config::interceptors::BeforeSerializationInterceptorContextRef;\n                        use crate::config::interceptors::BeforeTransmitInterceptorContextMut;\n                        use crate::config::interceptors::BeforeTransmitInterceptorContextRef;\n                        use crate::config::interceptors::FinalizerInterceptorContextMut;\n                        use crate::config::interceptors::FinalizerInterceptorContextRef;\n                        use crate::config::interceptors::InterceptorContext;\n\n                        use crate::error::BoxError;\n                    }\n                    \"\"\",\n                )\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ConfigOverrideRuntimePluginGeneratorTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.generators\n\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency.Companion.smithyRuntimeApiTestUtil\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.testModule\nimport software.amazon.smithy.rust.codegen.core.testutil.tokioTest\nimport software.amazon.smithy.rust.codegen.core.testutil.unitTest\n\ninternal class ConfigOverrideRuntimePluginGeneratorTest {\n    private val model =\n        \"\"\"\n        namespace com.example\n        use aws.protocols#awsJson1_0\n\n        @awsJson1_0\n        service HelloService {\n            operations: [SayHello],\n            version: \"1\"\n        }\n\n        @optionalAuth\n        operation SayHello { input: TestInput }\n        structure TestInput {\n           foo: String,\n        }\n        \"\"\".asSmithyModel()\n\n    @Test\n    fun `operation overrides endpoint resolver`() {\n        clientIntegrationTest(model) { clientCodegenContext, rustCrate ->\n            val runtimeConfig = clientCodegenContext.runtimeConfig\n            val codegenScope =\n                arrayOf(\n                    *preludeScope,\n                    \"EndpointResolverParams\" to\n                        RuntimeType.smithyRuntimeApi(runtimeConfig)\n                            .resolve(\"client::endpoint::EndpointResolverParams\"),\n                    \"RuntimePlugin\" to RuntimeType.runtimePlugin(runtimeConfig),\n                    \"RuntimeComponentsBuilder\" to RuntimeType.runtimeComponentsBuilder(runtimeConfig),\n                    \"capture_request\" to RuntimeType.captureRequest(runtimeConfig),\n                )\n            rustCrate.testModule {\n                addDependency(CargoDependency.Tokio.toDevDependency().withFeature(\"test-util\"))\n                tokioTest(\"test_operation_overrides_endpoint_resolver\") {\n                    rustTemplate(\n                        \"\"\"\n                        let expected_url = \"http://localhost:1234/\";\n                        let (http_client, req) = #{capture_request}(None);\n                        let client_config = crate::config::Config::builder().http_client(http_client).build();\n                        let config_override =\n                            crate::config::Config::builder().endpoint_url(expected_url);\n                        let client = crate::Client::from_conf(client_config);\n                        let _ = dbg!(client.say_hello().customize().config_override(config_override).send().await);\n                        assert_eq!(\"http://localhost:1234/\", req.expect_request().uri());\n                        \"\"\",\n                        *codegenScope,\n                    )\n                }\n            }\n        }\n    }\n\n    @Test\n    fun `operation overrides http connector`() {\n        clientIntegrationTest(model) { clientCodegenContext, rustCrate ->\n            val runtimeConfig = clientCodegenContext.runtimeConfig\n            val codegenScope =\n                arrayOf(\n                    *preludeScope,\n                    \"RuntimePlugin\" to RuntimeType.runtimePlugin(runtimeConfig),\n                )\n            rustCrate.testModule {\n                addDependency(CargoDependency.Tokio.toDevDependency().withFeature(\"test-util\"))\n                tokioTest(\"test_operation_overrides_http_client\") {\n                    rustTemplate(\n                        \"\"\"\n                        use #{AsyncSleep};\n\n                        let (http_client, captured_request) = #{capture_request}(#{None});\n                        let expected_url = \"http://localhost:1234/\";\n                        let client_config = crate::config::Config::builder()\n                            .endpoint_url(expected_url)\n                            .http_client(#{NeverClient}::new())\n                            .build();\n                        let client = crate::client::Client::from_conf(client_config.clone());\n                        let sleep = #{TokioSleep}::new();\n\n                        let send = client.say_hello().send();\n                        let timeout = #{Timeout}::new(\n                            send,\n                            sleep.sleep(::std::time::Duration::from_millis(100)),\n                        );\n\n                        // sleep future should win because the other future `send` is backed by `NeverConnector`,\n                        // yielding `Err`\n                        matches!(timeout.await, Err(_));\n\n                        let client = crate::client::Client::from_conf(client_config);\n                        let customizable_send = client\n                            .say_hello()\n                            .customize()\n                            .config_override(crate::config::Config::builder().http_client(http_client))\n                            .send();\n\n                        let timeout = #{Timeout}::new(\n                            customizable_send,\n                            sleep.sleep(::std::time::Duration::from_millis(100)),\n                        );\n\n                        // `conn` should shadow `NeverConnector` by virtue of `config_override`\n                        match timeout.await {\n                            Ok(_) => {\n                                assert_eq!(\n                                    expected_url,\n                                    captured_request.expect_request().uri().to_string()\n                                );\n                            }\n                            Err(_) => {\n                                panic!(\"this arm should not be reached since the `customizable_send` future should win\");\n                            }\n                        }\n                        \"\"\",\n                        *codegenScope,\n                        \"AsyncSleep\" to RuntimeType.smithyAsync(runtimeConfig).resolve(\"rt::sleep::AsyncSleep\"),\n                        \"capture_request\" to RuntimeType.captureRequest(runtimeConfig),\n                        \"NeverClient\" to\n                            CargoDependency.smithyHttpClientTestUtil(runtimeConfig).toType()\n                                .resolve(\"test_util::NeverClient\"),\n                        \"Timeout\" to RuntimeType.smithyAsync(runtimeConfig).resolve(\"future::timeout::Timeout\"),\n                        \"TokioSleep\" to\n                            CargoDependency.smithyAsync(runtimeConfig).withFeature(\"rt-tokio\")\n                                .toType().resolve(\"rt::sleep::TokioSleep\"),\n                    )\n                }\n            }\n        }\n    }\n\n    @Test\n    fun `operation overrides retry config`() {\n        clientIntegrationTest(model) { clientCodegenContext, rustCrate ->\n            val runtimeConfig = clientCodegenContext.runtimeConfig\n            val codegenScope =\n                arrayOf(\n                    *preludeScope,\n                    \"AlwaysRetry\" to\n                        RuntimeType.smithyRuntimeApi(runtimeConfig)\n                            .resolve(\"client::retries::AlwaysRetry\"),\n                    \"ConfigBag\" to RuntimeType.smithyTypes(runtimeConfig).resolve(\"config_bag::ConfigBag\"),\n                    \"ErrorKind\" to RuntimeType.smithyTypes(runtimeConfig).resolve(\"retry::ErrorKind\"),\n                    \"Input\" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve(\"client::interceptors::context::Input\"),\n                    \"InterceptorContext\" to RuntimeType.interceptorContext(runtimeConfig),\n                    \"Layer\" to RuntimeType.smithyTypes(runtimeConfig).resolve(\"config_bag::Layer\"),\n                    \"OrchestratorError\" to\n                        RuntimeType.smithyRuntimeApi(runtimeConfig)\n                            .resolve(\"client::orchestrator::OrchestratorError\"),\n                    \"RetryConfig\" to\n                        RuntimeType.smithyTypes(clientCodegenContext.runtimeConfig)\n                            .resolve(\"retry::RetryConfig\"),\n                    \"RequestAttempts\" to\n                        smithyRuntimeApiTestUtil(runtimeConfig).toType()\n                            .resolve(\"client::retries::RequestAttempts\"),\n                    \"RetryClassifiers\" to\n                        RuntimeType.smithyRuntimeApi(runtimeConfig)\n                            .resolve(\"client::retries::RetryClassifiers\"),\n                    \"RuntimeComponentsBuilder\" to RuntimeType.runtimeComponentsBuilder(runtimeConfig),\n                    \"RuntimePlugin\" to RuntimeType.runtimePlugin(runtimeConfig),\n                    \"StandardRetryStrategy\" to\n                        RuntimeType.smithyRuntime(runtimeConfig)\n                            .resolve(\"client::retries::strategy::StandardRetryStrategy\"),\n                    \"ShouldAttempt\" to\n                        RuntimeType.smithyRuntimeApi(runtimeConfig)\n                            .resolve(\"client::retries::ShouldAttempt\"),\n                    \"TokenBucket\" to RuntimeType.smithyRuntime(runtimeConfig).resolve(\"client::retries::TokenBucket\"),\n                )\n            rustCrate.testModule {\n                unitTest(\"test_operation_overrides_retry_config\") {\n                    rustTemplate(\n                        \"\"\"\n                        use #{RuntimePlugin};\n                        use ::aws_smithy_runtime_api::client::retries::RetryStrategy;\n\n                        let client_config = crate::config::Config::builder()\n                            .retry_config(#{RetryConfig}::standard().with_max_attempts(3))\n                            .build();\n\n                        let mut ctx = #{InterceptorContext}::new(#{Input}::doesnt_matter());\n                        ctx.set_output_or_error(#{Err}(#{OrchestratorError}::other(\"doesn't matter\")));\n\n                        let mut layer = #{Layer}::new(\"test\");\n                        layer.store_put(#{RequestAttempts}::new(1));\n                        layer.store_put(#{TokenBucket}::default());\n\n                        let mut cfg = #{ConfigBag}::of_layers(vec![layer]);\n                        let client_config_layer = client_config.config;\n                        cfg.push_shared_layer(client_config_layer.clone());\n\n                        let retry_classifiers_component = #{RuntimeComponentsBuilder}::new(\"retry_classifier\")\n                            .with_retry_classifier(#{AlwaysRetry}(#{ErrorKind}::TransientError));\n\n                        // Emulate the merging of runtime components from runtime plugins that the orchestrator does\n                        let runtime_components = #{RuntimeComponentsBuilder}::for_tests()\n                            // emulate the default retry config plugin by setting a retry strategy\n                            .with_retry_strategy(#{Some}(#{StandardRetryStrategy}::new()))\n                            .merge_from(&client_config.runtime_components)\n                            .merge_from(&retry_classifiers_component)\n                            .build()\n                            .unwrap();\n\n                        let retry = runtime_components.retry_strategy();\n                        assert!(matches!(\n                            retry.should_attempt_retry(&ctx, &runtime_components, &cfg).unwrap(),\n                            #{ShouldAttempt}::YesAfterDelay(_)\n                        ));\n\n                        // sets `max_attempts` to 1 implicitly by using `disabled()`, forcing it to run out of\n                        // attempts with respect to `RequestAttempts` set to 1 above\n                        let config_override_builder = crate::config::Config::builder()\n                            .retry_config(#{RetryConfig}::disabled());\n                        let config_override = config_override_builder.clone().build();\n                        let sut = crate::config::ConfigOverrideRuntimePlugin::new(\n                            config_override_builder,\n                            client_config_layer,\n                            &client_config.runtime_components,\n                        );\n                        let sut_layer = sut.config().unwrap();\n                        cfg.push_shared_layer(sut_layer);\n\n                        // Emulate the merging of runtime components from runtime plugins that the orchestrator does\n                        let runtime_components = #{RuntimeComponentsBuilder}::for_tests()\n                            // emulate the default retry config plugin by setting a retry strategy\n                            .with_retry_strategy(#{Some}(#{StandardRetryStrategy}::new()))\n                            .merge_from(&client_config.runtime_components)\n                            .merge_from(&retry_classifiers_component)\n                            .merge_from(&config_override.runtime_components)\n                            .build()\n                            .unwrap();\n\n                        let retry = runtime_components.retry_strategy();\n                        assert!(matches!(\n                            retry.should_attempt_retry(&ctx, &runtime_components, &cfg).unwrap(),\n                            #{ShouldAttempt}::No\n                        ));\n                        \"\"\",\n                        *codegenScope,\n                    )\n                }\n            }\n        }\n    }\n\n    private val authModel =\n        \"\"\"\n        namespace com.example\n        use aws.protocols#restJson1\n\n        @restJson1\n        @httpBearerAuth\n        @auth([httpBearerAuth])\n        service HelloService {\n            operations: [SayHello],\n            version: \"1\"\n        }\n\n        @http(uri: \"/SayHello\", method: \"POST\")\n        operation SayHello { input: TestInput }\n        structure TestInput {\n           foo: String,\n        }\n        \"\"\".asSmithyModel()\n\n    @Test\n    fun `config override with identity resolver gets operation-scoped cache`() {\n        clientIntegrationTest(authModel) { clientCodegenContext, rustCrate ->\n            val runtimeConfig = clientCodegenContext.runtimeConfig\n            val codegenScope =\n                arrayOf(\n                    *preludeScope,\n                    \"BearerAuthScheme\" to\n                        CargoDependency.smithyRuntime(runtimeConfig).withFeature(\"http-auth\")\n                            .toType().resolve(\"client::auth::http::BearerAuthScheme\"),\n                    \"ConfigBag\" to RuntimeType.smithyTypes(runtimeConfig).resolve(\"config_bag::ConfigBag\"),\n                    \"HTTP_BEARER_AUTH_SCHEME_ID\" to\n                        CargoDependency.smithyRuntimeApiClient(runtimeConfig).withFeature(\"http-auth\")\n                            .toType().resolve(\"client::auth::http::HTTP_BEARER_AUTH_SCHEME_ID\"),\n                    \"IdentityFuture\" to\n                        RuntimeType.smithyRuntimeApiClient(runtimeConfig)\n                            .resolve(\"client::identity::IdentityFuture\"),\n                    \"Identity\" to\n                        RuntimeType.smithyRuntimeApiClient(runtimeConfig)\n                            .resolve(\"client::identity::Identity\"),\n                    \"ResolveIdentity\" to\n                        RuntimeType.smithyRuntimeApiClient(runtimeConfig)\n                            .resolve(\"client::identity::ResolveIdentity\"),\n                    \"RuntimeComponents\" to\n                        RuntimeType.smithyRuntimeApiClient(runtimeConfig)\n                            .resolve(\"client::runtime_components::RuntimeComponents\"),\n                    \"RuntimeComponentsBuilder\" to RuntimeType.runtimeComponentsBuilder(runtimeConfig),\n                    \"RuntimePlugin\" to RuntimeType.runtimePlugin(runtimeConfig),\n                    \"SharedAuthScheme\" to\n                        RuntimeType.smithyRuntimeApiClient(runtimeConfig)\n                            .resolve(\"client::auth::SharedAuthScheme\"),\n                    \"IdentityCache\" to\n                        RuntimeType.smithyRuntime(runtimeConfig)\n                            .resolve(\"client::identity::IdentityCache\"),\n                )\n            rustCrate.testModule {\n                addDependency(CargoDependency.Tokio.toDevDependency().withFeature(\"test-util\"))\n                unitTest(\"config_override_with_identity_resolver_gets_scoped_cache\") {\n                    rustTemplate(\n                        \"\"\"\n                        use #{RuntimePlugin};\n\n                        ##[derive(Debug)]\n                        struct FakeResolver;\n                        impl #{ResolveIdentity} for FakeResolver {\n                            fn resolve_identity<'a>(\n                                &'a self,\n                                _: &'a #{RuntimeComponents},\n                                _: &'a #{ConfigBag},\n                            ) -> #{IdentityFuture}<'a> {\n                                #{IdentityFuture}::ready(#{Ok}(#{Identity}::new(\"fake\", #{None})))\n                            }\n                        }\n\n                        let client_config = crate::config::Config::builder().build();\n\n                        // Override with an identity resolver\n                        let mut override_builder = crate::config::Config::builder();\n                        override_builder.runtime_components.set_identity_resolver(\n                            #{HTTP_BEARER_AUTH_SCHEME_ID},\n                            FakeResolver,\n                        );\n\n                        let sut = crate::config::ConfigOverrideRuntimePlugin::new(\n                            override_builder,\n                            client_config.config.clone(),\n                            &client_config.runtime_components,\n                        );\n\n                        // The override should have its own identity cache\n                        let components = sut.runtime_components(&#{RuntimeComponentsBuilder}::new(\"test\"));\n                        assert!(\n                            components.identity_cache().is_some(),\n                            \"config override with identity resolver should get an operation-scoped identity cache\"\n                        );\n                        \"\"\",\n                        *codegenScope,\n                    )\n                }\n\n                unitTest(\"config_override_without_identity_resolver_has_no_scoped_cache\") {\n                    rustTemplate(\n                        \"\"\"\n                        use #{RuntimePlugin};\n\n                        let client_config = crate::config::Config::builder().build();\n\n                        // Override without an identity resolver\n                        let override_builder = crate::config::Config::builder();\n\n                        let sut = crate::config::ConfigOverrideRuntimePlugin::new(\n                            override_builder,\n                            client_config.config.clone(),\n                            &client_config.runtime_components,\n                        );\n\n                        // The override should NOT have its own identity cache\n                        let components = sut.runtime_components(&#{RuntimeComponentsBuilder}::new(\"test\"));\n                        assert!(\n                            components.identity_cache().is_none(),\n                            \"config override without identity resolver should not set an identity cache\"\n                        );\n                        \"\"\",\n                        *codegenScope,\n                    )\n                }\n\n                unitTest(\"config_override_explicit_identity_cache_is_not_overridden\") {\n                    rustTemplate(\n                        \"\"\"\n                        use #{RuntimePlugin};\n                        use aws_smithy_runtime_api::client::identity::ResolveCachedIdentity;\n\n                        let call_count = std::sync::Arc::new(std::sync::atomic::AtomicUsize::new(0));\n\n                        ##[derive(Debug)]\n                        struct CountingResolver(std::sync::Arc<std::sync::atomic::AtomicUsize>);\n                        impl #{ResolveIdentity} for CountingResolver {\n                            fn resolve_identity<'a>(\n                                &'a self,\n                                _: &'a #{RuntimeComponents},\n                                _: &'a #{ConfigBag},\n                            ) -> #{IdentityFuture}<'a> {\n                                self.0.fetch_add(1, std::sync::atomic::Ordering::Relaxed);\n                                #{IdentityFuture}::ready(#{Ok}(#{Identity}::new(\"fake\", #{None})))\n                            }\n                        }\n\n                        ##[derive(Debug)]\n                        struct StubCache;\n                        impl ResolveCachedIdentity for StubCache {\n                            fn resolve_cached_identity<'a>(\n                                &'a self,\n                                _resolver: aws_smithy_runtime_api::client::identity::SharedIdentityResolver,\n                                _components: &'a #{RuntimeComponents},\n                                _config_bag: &'a #{ConfigBag},\n                            ) -> #{IdentityFuture}<'a> {\n                                #{IdentityFuture}::ready(#{Ok}(#{Identity}::new(\"stub\", #{None})))\n                            }\n                        }\n\n                        let client_config = crate::config::Config::builder().build();\n\n                        // Override with both an identity resolver and an explicit custom cache\n                        let mut override_builder = crate::config::Config::builder();\n                        override_builder.runtime_components.set_identity_resolver(\n                            #{HTTP_BEARER_AUTH_SCHEME_ID},\n                            CountingResolver(call_count.clone()),\n                        );\n                        override_builder.runtime_components.set_identity_cache(#{Some}(StubCache));\n\n                        let sut = crate::config::ConfigOverrideRuntimePlugin::new(\n                            override_builder,\n                            client_config.config.clone(),\n                            &client_config.runtime_components,\n                        );\n\n                        // Verify the explicit cache was preserved by checking the debug output\n                        // contains \"StubCache\" (our custom type) rather than \"LazyCache\"\n                        let sut_components = sut.runtime_components(&#{RuntimeComponentsBuilder}::new(\"empty\"));\n                        let cache = sut_components.identity_cache().expect(\"identity cache should be set\");\n                        let debug_str = format!(\"{:?}\", cache);\n                        assert!(\n                            debug_str.contains(\"StubCache\"),\n                            \"explicit identity cache should be preserved, got: {debug_str}\"\n                        );\n                        \"\"\",\n                        *codegenScope,\n                    )\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/EndpointTraitBindingsTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.generators\n\nimport io.kotest.matchers.shouldBe\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.traits.EndpointTrait\nimport software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest\nimport software.amazon.smithy.rust.codegen.client.testutil.testSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustModule\nimport software.amazon.smithy.rust.codegen.core.rustlang.implBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlockTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.testutil.TestRuntimeConfig\nimport software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.compileAndTest\nimport software.amazon.smithy.rust.codegen.core.testutil.integrationTest\nimport software.amazon.smithy.rust.codegen.core.testutil.unitTest\nimport software.amazon.smithy.rust.codegen.core.util.lookup\nimport kotlin.io.path.ExperimentalPathApi\n\ninternal class EndpointTraitBindingsTest {\n    @Test\n    fun `generate correct format strings`() {\n        val epTrait = EndpointTrait.builder().hostPrefix(\"{foo}.data\").build()\n        epTrait.prefixFormatString() shouldBe (\"\\\"{foo}.data\\\"\")\n    }\n\n    @Test\n    fun `generate endpoint prefixes`() {\n        val model =\n            \"\"\"\n            namespace test\n            @readonly\n            @endpoint(hostPrefix: \"{foo}a.data.\")\n            operation GetStatus {\n                input: GetStatusInput,\n            }\n            structure GetStatusInput {\n                @required\n                @hostLabel\n                foo: String\n            }\n            \"\"\".asSmithyModel()\n        val operationShape: OperationShape = model.lookup(\"test#GetStatus\")\n        val symbolProvider = testSymbolProvider(model)\n        val endpointBindingGenerator =\n            EndpointTraitBindings(\n                model,\n                symbolProvider,\n                TestRuntimeConfig,\n                operationShape,\n                operationShape.expectTrait(EndpointTrait::class.java),\n            )\n        val project = TestWorkspace.testProject()\n        project.withModule(RustModule.private(\"test\")) {\n            rust(\n                \"\"\"\n                struct GetStatusInput {\n                    foo: Option<String>\n                }\n                \"\"\",\n            )\n            implBlock(symbolProvider.toSymbol(model.lookup(\"test#GetStatusInput\"))) {\n                rustBlockTemplate(\n                    \"fn endpoint_prefix(&self) -> std::result::Result<#{EndpointPrefix}, #{InvalidEndpointError}>\",\n                    \"EndpointPrefix\" to RuntimeType.smithyRuntimeApiClient(TestRuntimeConfig).resolve(\"client::endpoint::EndpointPrefix\"),\n                    \"InvalidEndpointError\" to RuntimeType.smithyRuntimeApiClient(TestRuntimeConfig).resolve(\"client::endpoint::error::InvalidEndpointError\"),\n                ) {\n                    endpointBindingGenerator.render(this, \"self\")\n                }\n            }\n            unitTest(\n                \"valid_prefix\",\n                \"\"\"\n                let inp = GetStatusInput { foo: Some(\"test_value\".to_string()) };\n                let prefix = inp.endpoint_prefix().unwrap();\n                assert_eq!(prefix.as_str(), \"test_valuea.data.\");\n                \"\"\",\n            )\n            unitTest(\n                \"invalid_prefix\",\n                \"\"\"\n                // not a valid URI component\n                let inp = GetStatusInput { foo: Some(\"test value\".to_string()) };\n                inp.endpoint_prefix().expect_err(\"invalid uri component\");\n                \"\"\",\n            )\n\n            unitTest(\n                \"unset_prefix\",\n                \"\"\"\n                // unset is invalid\n                let inp = GetStatusInput { foo: None };\n                inp.endpoint_prefix().expect_err(\"invalid uri component\");\n                \"\"\",\n            )\n\n            unitTest(\n                \"empty_prefix\",\n                \"\"\"\n                // empty is invalid\n                let inp = GetStatusInput { foo: Some(\"\".to_string()) };\n                inp.endpoint_prefix().expect_err(\"empty label is invalid\");\n                \"\"\",\n            )\n        }\n\n        project.compileAndTest()\n    }\n\n    @ExperimentalPathApi\n    @Test\n    fun `endpoint integration test`() {\n        val model =\n            \"\"\"\n            namespace com.example\n            use aws.protocols#awsJson1_0\n            use smithy.rules#endpointRuleSet\n\n            @awsJson1_0\n            @aws.api#service(sdkId: \"Test\", endpointPrefix: \"differentprefix\")\n            @endpointRuleSet({\n                \"version\": \"1.0\",\n                \"rules\": [{\n                    \"conditions\": [],\n                    \"type\": \"endpoint\",\n                    \"endpoint\": {\n                        \"url\": \"https://example.com\",\n                        \"properties\": {}\n                    }\n                }],\n                \"parameters\": {}\n            })\n            service TestService {\n                operations: [SayHello],\n                version: \"1\"\n            }\n            @endpoint(hostPrefix: \"test123.{greeting}.\")\n            operation SayHello {\n                input: SayHelloInput\n            }\n            structure SayHelloInput {\n                @required\n                @hostLabel\n                greeting: String\n            }\n            \"\"\".asSmithyModel()\n        clientIntegrationTest(model) { clientCodegenContext, rustCrate ->\n            val moduleName = clientCodegenContext.moduleUseName()\n            rustCrate.integrationTest(\"test_endpoint_prefix\") {\n                Attribute.TokioTest.render(this)\n                rustTemplate(\n                    \"\"\"\n                    async fn test_endpoint_prefix() {\n                        use #{capture_request};\n                        use aws_smithy_runtime_api::box_error::BoxError;\n                        use aws_smithy_runtime_api::client::endpoint::EndpointPrefix;\n                        use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents;\n                        use aws_smithy_types::body::SdkBody;\n                        use aws_smithy_types::config_bag::ConfigBag;\n                        use std::sync::atomic::{AtomicU32, Ordering};\n                        use std::sync::{Arc, Mutex};\n                        use $moduleName::{\n                            config::interceptors::BeforeTransmitInterceptorContextRef,\n                            config::Intercept,\n                            error::DisplayErrorContext,\n                            {Client, Config},\n                        };\n\n                        ##[derive(Clone, Debug, Default)]\n                        struct TestInterceptor {\n                            called: Arc<AtomicU32>,\n                            last_endpoint_prefix: Arc<Mutex<Option<EndpointPrefix>>>,\n                        }\n                        impl Intercept for TestInterceptor {\n                            fn name(&self) -> &'static str {\n                                \"TestInterceptor\"\n                            }\n\n                            fn read_before_transmit(\n                                &self,\n                                _context: &BeforeTransmitInterceptorContextRef<'_>,\n                                _runtime_components: &RuntimeComponents,\n                                cfg: &mut ConfigBag,\n                            ) -> Result<(), BoxError> {\n                                self.called.fetch_add(1, Ordering::Relaxed);\n                                if let Some(prefix) = cfg.load::<EndpointPrefix>() {\n                                    self.last_endpoint_prefix\n                                        .lock()\n                                        .unwrap()\n                                        .replace(prefix.clone());\n                                }\n                                Ok(())\n                            }\n                        }\n\n                        let (http_client, _r) = capture_request(Some(\n                            #{http_1x}::Response::builder()\n                                .status(200)\n                                .body(SdkBody::from(\"\"))\n                                .unwrap(),\n                        ));\n                        let interceptor = TestInterceptor::default();\n                        let config = Config::builder()\n                            .http_client(http_client)\n                            .interceptor(interceptor.clone())\n                            .build();\n                        let client = Client::from_conf(config);\n                        let err = dbg!(client.say_hello().greeting(\"hey there!\").send().await)\n                            .expect_err(\"the endpoint should be invalid since it has an exclamation mark in it\");\n                        let err_fmt = format!(\"{}\", DisplayErrorContext(err));\n                        assert!(\n                            err_fmt.contains(\"endpoint prefix could not be built\"),\n                            \"expected '{}' to contain 'endpoint prefix could not be built'\",\n                            err_fmt\n                        );\n\n                        assert!(\n                            interceptor.called.load(Ordering::Relaxed) == 0,\n                            \"the interceptor should not have been called since endpoint resolution failed\"\n                        );\n\n                        dbg!(client.say_hello().greeting(\"hello\").send().await)\n                            .expect(\"hello is a valid endpoint prefix\");\n                        assert!(\n                            interceptor.called.load(Ordering::Relaxed) == 1,\n                            \"the interceptor should have been called\"\n                        );\n                        assert_eq!(\n                            \"test123.hello.\",\n                            interceptor\n                                .last_endpoint_prefix\n                                .lock()\n                                .unwrap()\n                                .clone()\n                                .unwrap()\n                                .as_str()\n                        );\n                    }\n                    \"\"\",\n                    \"capture_request\" to\n                        CargoDependency.smithyHttpClientTestUtil(clientCodegenContext.runtimeConfig)\n                            .toType().resolve(\"test_util::capture_request\"),\n                    \"http_1x\" to CargoDependency.Http1x.toType(),\n                )\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/ErrorCorrectionTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\npackage software.amazon.smithy.rust.codegen.client.smithy.generators\n\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.unitTest\nimport software.amazon.smithy.rust.codegen.core.util.lookup\n\nclass ErrorCorrectionTest {\n    private val model =\n        \"\"\"\n        namespace com.example\n        use aws.protocols#awsJson1_0\n\n        @awsJson1_0\n        service HelloService {\n            operations: [SayHello],\n            version: \"1\"\n        }\n\n        operation SayHello { input: TestInput }\n        structure TestInput { nested: TestStruct }\n        structure TestStruct {\n           @required\n           foo: String,\n           @required\n           byteValue: Byte,\n           @required\n           listValue: StringList,\n           @required\n           mapValue: ListMap,\n           @required\n           doubleListValue: DoubleList\n           @required\n           document: Document\n           @required\n           nested: Nested\n           @required\n           blob: Blob\n           @required\n           enum: Enum\n           @required\n           union: U\n           notRequired: String\n        }\n\n        enum Enum {\n            A,\n            B,\n            C\n        }\n\n        union U {\n            A: Integer,\n            B: String,\n            C: Unit\n        }\n\n        structure Nested {\n            @required\n            a: String\n        }\n\n        list StringList {\n            member: String\n        }\n\n        list DoubleList {\n            member: StringList\n        }\n\n        map ListMap {\n            key: String,\n            value: StringList\n        }\n        \"\"\".asSmithyModel(smithyVersion = \"2.0\")\n\n    @Test\n    fun correctMissingFields() {\n        val shape = model.lookup<StructureShape>(\"com.example#TestStruct\")\n        clientIntegrationTest(model) { ctx, crate ->\n            crate.lib {\n                val codegenCtx =\n                    arrayOf(\"correct_errors\" to ctx.correctErrors(shape)!!, \"Shape\" to ctx.symbolProvider.toSymbol(shape))\n                rustTemplate(\n                    \"\"\"\n                    /// avoid unused warnings\n                pub fn use_fn_publicly() { #{correct_errors}(#{Shape}::builder()); } \"\"\",\n                    *codegenCtx,\n                )\n                unitTest(\"test_default_builder\") {\n                    rustTemplate(\n                        \"\"\"\n                        let builder = #{correct_errors}(#{Shape}::builder().foo(\"abcd\"));\n                        let shape = builder.build().unwrap();\n                        // don't override a field already set\n                        assert_eq!(shape.foo(), \"abcd\");\n                        // set nested fields\n                        assert_eq!(shape.nested().a(), \"\");\n                        // don't default non-required fields\n                        assert_eq!(shape.not_required(), None);\n\n                        // set defaults for everything else\n                        assert_eq!(shape.blob().as_ref(), b\"\");\n\n                        assert!(shape.list_value().is_empty());\n                        assert!(shape.map_value().is_empty());\n                        assert!(shape.double_list_value().is_empty());\n\n                        // enums and unions become unknown variants\n                        assert!(matches!(shape.r##enum(), crate::types::Enum::Unknown(_)));\n                        assert!(shape.union().is_unknown());\n                        \"\"\",\n                        *codegenCtx,\n                    )\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/PaginatorGeneratorTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.generators\n\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.transform.ModelTransformer\nimport software.amazon.smithy.rust.codegen.client.smithy.traits.IsTruncatedPaginatorTrait\nimport software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.integrationTest\nimport software.amazon.smithy.rust.codegen.core.util.letIf\n\ninternal class PaginatorGeneratorTest {\n    private val model =\n        \"\"\"\n        namespace test\n        use aws.protocols#awsJson1_1\n\n        @awsJson1_1\n        service TestService {\n            operations: [PaginatedList, PaginatedMap]\n        }\n\n        @readonly\n        @optionalAuth\n        @paginated(inputToken: \"nextToken\", outputToken: \"inner.token\",\n                   pageSize: \"maxResults\", items: \"inner.items\")\n        operation PaginatedList {\n            input: GetFoosInput,\n            output: GetFoosOutput\n        }\n\n        @readonly\n        @optionalAuth\n        @paginated(inputToken: \"nextToken\", outputToken: \"inner.token\",\n                   pageSize: \"maxResults\", items: \"inner.mapItems\")\n        operation PaginatedMap {\n            input: GetFoosInput,\n            output: GetFoosOutput\n        }\n\n        structure GetFoosInput {\n            maxResults: Integer,\n            nextToken: String\n        }\n\n        structure Inner {\n            token: String,\n\n            @required\n            items: StringList,\n\n            @required\n            mapItems: StringMap\n        }\n\n        structure GetFoosOutput {\n            inner: Inner,\n            isTruncated: Boolean,\n        }\n\n        list StringList {\n            member: String\n        }\n\n        map StringMap {\n            key: String,\n            value: Integer\n        }\n        \"\"\".asSmithyModel()\n\n    @Test\n    fun `generate paginators that compile`() {\n        clientIntegrationTest(model) { clientCodegenContext, rustCrate ->\n            rustCrate.integrationTest(\"paginators_generated\") {\n                Attribute.AllowUnusedImports.render(this)\n                rust(\"use ${clientCodegenContext.moduleUseName()}::operation::paginated_list::paginator::PaginatedListPaginator;\")\n            }\n        }\n    }\n\n    @Test\n    fun `isTruncated paginators compile`() {\n        // Adding IsTruncated trait to the output shape\n        val modifiedModel =\n            ModelTransformer.create().mapShapes(model) { shape ->\n                shape.letIf(shape.isStructureShape && shape.toShapeId() == ShapeId.from(\"test#GetFoosOutput\")) {\n                    (it as StructureShape).toBuilder().addTrait(IsTruncatedPaginatorTrait()).build()\n                }\n            }\n\n        clientIntegrationTest(model) { clientCodegenContext, rustCrate ->\n            rustCrate.integrationTest(\"is_truncated_paginators_generated\") {\n                Attribute.AllowUnusedImports.render(this)\n                rust(\"use ${clientCodegenContext.moduleUseName()}::operation::paginated_list::paginator::PaginatedListPaginator;\")\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/SensitiveIndexTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.generators\n\nimport org.junit.jupiter.api.Assertions.assertEquals\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.util.lookup\n\nclass SensitiveIndexTest {\n    val model =\n        \"\"\"\n        namespace com.example\n        service TestService {\n            operations: [\n                NotSensitive,\n                SensitiveInput,\n                SensitiveOutput,\n                NestedSensitiveInput,\n                NestedSensitiveOutput\n            ]\n        }\n\n        @sensitive\n        structure Credentials {\n           username: String,\n           password: String\n        }\n\n        operation NotSensitive {\n            input := { userId: String }\n\n            output := { response: String }\n        }\n\n        operation SensitiveInput {\n            input := { credentials: Credentials }\n        }\n\n        operation SensitiveOutput {\n            output := { credentials: Credentials }\n        }\n\n        operation NestedSensitiveInput {\n            input := { nested: Nested }\n        }\n\n        operation NestedSensitiveOutput {\n            output := { nested: Nested }\n        }\n\n        structure Nested {\n            inner: Inner\n        }\n\n        structure Inner {\n            credentials: Credentials\n        }\n        \"\"\".asSmithyModel(smithyVersion = \"2.0\")\n\n    @Test\n    fun `correctly identify operations`() {\n        val index = SensitiveIndex.of(model)\n\n        data class TestCase(val shape: String, val sensitiveInput: Boolean, val sensitiveOutput: Boolean)\n\n        val testCases =\n            listOf(\n                TestCase(\"NotSensitive\", sensitiveInput = false, sensitiveOutput = false),\n                TestCase(\"SensitiveInput\", sensitiveInput = true, sensitiveOutput = false),\n                TestCase(\"SensitiveOutput\", sensitiveInput = false, sensitiveOutput = true),\n                TestCase(\"NestedSensitiveInput\", sensitiveInput = true, sensitiveOutput = false),\n                TestCase(\"NestedSensitiveOutput\", sensitiveInput = false, sensitiveOutput = true),\n            )\n        testCases.forEach { tc ->\n            assertEquals(tc.sensitiveInput, index.hasSensitiveInput(model.lookup(\"com.example#${tc.shape}\")), \"input: $tc\")\n            assertEquals(tc.sensitiveOutput, index.hasSensitiveOutput(model.lookup(\"com.example#${tc.shape}\")), \"output: $tc \")\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/CustomizableOperationGeneratorTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.generators.client\n\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.smithy.RustCrate\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.integrationTest\n\nclass CustomizableOperationGeneratorTest {\n    val model =\n        \"\"\"\n        namespace com.example\n        use aws.protocols#awsJson1_0\n\n        @awsJson1_0\n        service HelloService {\n            operations: [SayHello],\n            version: \"1\"\n        }\n\n        @optionalAuth\n        operation SayHello { input: TestInput }\n        structure TestInput {\n           foo: String,\n        }\n        \"\"\".asSmithyModel()\n\n    @Test\n    fun `CustomizableOperation is send and sync`() {\n        val test: (ClientCodegenContext, RustCrate) -> Unit = { codegenContext, rustCrate ->\n            rustCrate.integrationTest(\"customizable_operation_is_send_and_sync\") {\n                val moduleName = codegenContext.moduleUseName()\n                rustTemplate(\n                    \"\"\"\n                    fn check_send_and_sync<T: Send + Sync>(_: T) {}\n\n                    ##[test]\n                    fn test() {\n                        let config = $moduleName::Config::builder()\n                            .http_client(#{NeverClient}::new())\n                            .endpoint_url(\"http://localhost:1234\")\n                            .build();\n                        let client = $moduleName::Client::from_conf(config);\n                        check_send_and_sync(client.say_hello().customize());\n                    }\n                    \"\"\",\n                    \"NeverClient\" to\n                        CargoDependency.smithyHttpClientTestUtil(codegenContext.runtimeConfig).toType()\n                            .resolve(\"test_util::NeverClient\"),\n                )\n            }\n        }\n        clientIntegrationTest(model, test = test)\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/client/FluentClientGeneratorTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.generators.client\n\nimport io.kotest.matchers.shouldBe\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest\nimport software.amazon.smithy.rust.codegen.client.testutil.testSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.integrationTest\nimport software.amazon.smithy.rust.codegen.core.util.lookup\n\nclass FluentClientGeneratorTest {\n    val model =\n        \"\"\"\n        namespace com.example\n        use aws.protocols#awsJson1_0\n\n        @awsJson1_0\n        service HelloService {\n            operations: [SayHello],\n            version: \"1\"\n        }\n\n        @optionalAuth\n        operation SayHello { input: TestInput }\n        structure TestInput {\n           foo: String,\n           byteValue: Byte,\n           listValue: StringList,\n           mapValue: ListMap,\n           doubleListValue: DoubleList\n        }\n\n        list StringList {\n            member: String\n        }\n\n        list DoubleList {\n            member: StringList\n        }\n\n        map ListMap {\n            key: String,\n            value: StringList\n        }\n        \"\"\".asSmithyModel()\n\n    @Test\n    fun `generate correct input docs`() {\n        val expectations =\n            mapOf(\n                \"listValue\" to \"list_value(impl Into<String>)\",\n                \"doubleListValue\" to \"double_list_value(Vec::<String>)\",\n                \"mapValue\" to \"map_value(impl Into<String>, Vec::<String>)\",\n                \"byteValue\" to \"byte_value(i8)\",\n            )\n        expectations.forEach { (name, expect) ->\n            val member = model.lookup<MemberShape>(\"com.example#TestInput\\$$name\")\n            member.asFluentBuilderInputDoc(testSymbolProvider(model)) shouldBe expect\n        }\n    }\n\n    @Test\n    fun `send() future implements Send`() {\n        clientIntegrationTest(model) { codegenContext, rustCrate ->\n            rustCrate.integrationTest(\"send_future_is_send\") {\n                val moduleName = codegenContext.moduleUseName()\n                rustTemplate(\n                    \"\"\"\n                    fn check_send<T: Send>(_: T) {}\n\n                    ##[test]\n                    fn test() {\n                        let config = $moduleName::Config::builder()\n                            .endpoint_url(\"http://localhost:1234\")\n                            .http_client(#{NeverClient}::new())\n                            .build();\n                        let client = $moduleName::Client::from_conf(config);\n                        check_send(client.say_hello().send());\n                    }\n                    \"\"\",\n                    \"NeverClient\" to\n                        CargoDependency.smithyHttpClientTestUtil(codegenContext.runtimeConfig).toType()\n                            .resolve(\"test_util::NeverClient\"),\n                )\n            }\n        }\n    }\n\n    @Test\n    fun `generate inner builders`() {\n        clientIntegrationTest(model) { codegenContext, rustCrate ->\n            rustCrate.integrationTest(\"inner_builder\") {\n                val moduleName = codegenContext.moduleUseName()\n                rustTemplate(\n                    \"\"\"\n                    ##[test]\n                    fn test() {\n                        let config = $moduleName::Config::builder()\n                            .endpoint_url(\"http://localhost:1234\")\n                            .http_client(#{NeverClient}::new())\n                            .build();\n                        let client = $moduleName::Client::from_conf(config);\n\n                        let say_hello_fluent_builder = client.say_hello().byte_value(4).foo(\"hello!\");\n                        assert_eq!(*say_hello_fluent_builder.get_foo(), Some(\"hello!\".to_string()));\n                        let input = say_hello_fluent_builder.as_input();\n                        assert_eq!(*input.get_byte_value(), Some(4));\n                    }\n                    \"\"\",\n                    \"NeverClient\" to\n                        CargoDependency.smithyHttpClientTestUtil(codegenContext.runtimeConfig).toType()\n                            .resolve(\"test_util::NeverClient\"),\n                )\n            }\n        }\n    }\n\n    @Test\n    fun `dead-code warning should not be issued when a service has no operations`() {\n        val model =\n            \"\"\"\n            namespace com.example\n            use aws.protocols#awsJson1_0\n\n            @awsJson1_0\n            service HelloService {\n                version: \"1\"\n            }\n            \"\"\".asSmithyModel()\n\n        clientIntegrationTest(model)\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/config/ServiceConfigGeneratorTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.generators.config\n\nimport io.kotest.matchers.shouldBe\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.model.shapes.ServiceShape\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.NamedCustomization\nimport software.amazon.smithy.rust.codegen.core.testutil.BasicTestModels\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.unitTest\nimport software.amazon.smithy.rust.codegen.core.util.lookup\nimport software.amazon.smithy.rust.codegen.core.util.toPascalCase\n\ninternal class ServiceConfigGeneratorTest {\n    private fun codegenScope(rc: RuntimeConfig): Array<Pair<String, Any>> =\n        arrayOf(\n            \"ConfigBag\" to RuntimeType.configBag(rc),\n        )\n\n    @Test\n    fun `idempotency token when used`() {\n        fun model(trait: String) =\n            \"\"\"\n            namespace com.example\n\n            use aws.protocols#restJson1\n            use smithy.test#httpRequestTests\n            use smithy.test#httpResponseTests\n\n            @restJson1\n            service HelloService {\n                operations: [SayHello],\n                version: \"1\"\n            }\n\n            operation SayHello {\n                input: IdempotentInput\n            }\n\n            structure IdempotentInput {\n                $trait\n                tok: String\n            }\n            \"\"\".asSmithyModel()\n\n        val withToken = model(\"@idempotencyToken\")\n        val withoutToken = model(\"\")\n        withToken.lookup<ServiceShape>(\"com.example#HelloService\").needsIdempotencyToken(withToken) shouldBe true\n        withoutToken.lookup<ServiceShape>(\"com.example#HelloService\").needsIdempotencyToken(withoutToken) shouldBe false\n    }\n\n    @Test\n    fun `find idempotency token via resources`() {\n        val model =\n            \"\"\"\n            namespace com.example\n            service ResourceService {\n                resources: [Resource],\n                version: \"1\"\n            }\n\n            resource Resource {\n                operations: [CreateResource]\n            }\n            operation CreateResource {\n                input: IdempotentInput\n            }\n\n            structure IdempotentInput {\n                @idempotencyToken\n                tok: String\n            }\n            \"\"\".asSmithyModel()\n        model.lookup<ServiceShape>(\"com.example#ResourceService\").needsIdempotencyToken(model) shouldBe true\n    }\n\n    @Test\n    fun `generate customizations as specified`() {\n        class ServiceCustomizer(private val codegenContext: ClientCodegenContext) :\n            NamedCustomization<ServiceConfig>() {\n            override fun section(section: ServiceConfig): Writable {\n                return when (section) {\n                    ServiceConfig.ConfigStructAdditionalDocs -> emptySection\n\n                    ServiceConfig.ConfigImpl ->\n                        writable {\n                            rustTemplate(\n                                \"\"\"\n                                ##[allow(missing_docs)]\n                                pub fn config_field(&self) -> u64 {\n                                    self.config.load::<#{T}>().map(|u| u.0).unwrap()\n                                }\n                                \"\"\",\n                                \"T\" to\n                                    configParamNewtype(\n                                        \"config_field\".toPascalCase(), RuntimeType.U64.toSymbol(),\n                                        codegenContext.runtimeConfig,\n                                    ),\n                            )\n                        }\n\n                    ServiceConfig.BuilderImpl ->\n                        writable {\n                            rustTemplate(\n                                \"\"\"\n                                ##[allow(missing_docs)]\n                                pub fn config_field(mut self, config_field: u64) -> Self {\n                                    self.config.store_put(#{T}(config_field));\n                                    self\n                                }\n                                \"\"\",\n                                \"T\" to\n                                    configParamNewtype(\n                                        \"config_field\".toPascalCase(), RuntimeType.U64.toSymbol(),\n                                        codegenContext.runtimeConfig,\n                                    ),\n                            )\n                        }\n\n                    is ServiceConfig.BuilderFromConfigBag ->\n                        writable {\n                            rustTemplate(\n                                \"\"\"\n                                ${section.builder} = ${section.builder}.config_field(${section.configBag}.load::<#{T}>().map(|u| u.0).unwrap());\n                                \"\"\",\n                                \"T\" to\n                                    configParamNewtype(\n                                        \"config_field\".toPascalCase(), RuntimeType.U64.toSymbol(),\n                                        codegenContext.runtimeConfig,\n                                    ),\n                            )\n                        }\n\n                    else -> emptySection\n                }\n            }\n        }\n\n        val serviceDecorator =\n            object : ClientCodegenDecorator {\n                override val name: String = \"Add service plugin\"\n                override val order: Byte = 0\n\n                override fun configCustomizations(\n                    codegenContext: ClientCodegenContext,\n                    baseCustomizations: List<ConfigCustomization>,\n                ): List<ConfigCustomization> {\n                    return baseCustomizations + ServiceCustomizer(codegenContext)\n                }\n            }\n\n        clientIntegrationTest(BasicTestModels.AwsJson10TestModel, additionalDecorators = listOf(serviceDecorator)) { ctx, rustCrate ->\n            rustCrate.withModule(ClientRustModule.config) {\n                unitTest(\n                    \"set_config_fields\",\n                    \"\"\"\n                    let builder = Config::builder().config_field(99);\n                    let config = builder.build();\n                    assert_eq!(config.config_field(), 99);\n                    \"\"\",\n                )\n\n                unitTest(\n                    \"set_runtime_plugin\",\n                    \"\"\"\n                    use aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugin;\n                    use aws_smithy_types::config_bag::FrozenLayer;\n\n                    #[derive(Debug)]\n                    struct TestRuntimePlugin;\n\n                    impl RuntimePlugin for TestRuntimePlugin {\n                        fn config(&self) -> Option<FrozenLayer> {\n                            todo!(\"ExampleRuntimePlugin.config\")\n                        }\n                    }\n\n                    let config = Config::builder()\n                        .runtime_plugin(TestRuntimePlugin)\n                        .build();\n                    assert_eq!(config.runtime_plugins.len(), 1);\n                    \"\"\",\n                )\n\n                unitTest(\n                    \"builder_from_config_bag\",\n                    \"\"\"\n                    use aws_smithy_runtime::client::retries::RetryPartition;\n                    use aws_smithy_types::config_bag::ConfigBag;\n                    use aws_smithy_types::config_bag::Layer;\n                    use aws_smithy_types::retry::RetryConfig;\n                    use aws_smithy_types::timeout::TimeoutConfig;\n\n                    let mut layer = Layer::new(\"test\");\n                    layer.store_put(crate::config::ConfigField(0));\n                    layer.store_put(RetryConfig::disabled());\n                    layer.store_put(crate::config::StalledStreamProtectionConfig::disabled());\n                    layer.store_put(TimeoutConfig::builder().build());\n                    layer.store_put(RetryPartition::new(\"test\"));\n\n                    let config_bag = ConfigBag::of_layers(vec![layer]);\n                    let builder = crate::config::Builder::from_config_bag(&config_bag);\n                    let config = builder.build();\n\n                    assert_eq!(config.config_field(), 0);\n                    assert!(config.retry_config().is_some());\n                    assert!(config.stalled_stream_protection().is_some());\n                    assert!(config.timeout_config().is_some());\n                    assert!(config.retry_partition().is_some());\n                    \"\"\",\n                )\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/error/ErrorGeneratorTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.generators.error\n\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\n\nclass ErrorGeneratorTest {\n    val model =\n        \"\"\"\n        namespace com.test\n        use aws.protocols#awsJson1_1\n\n        @awsJson1_1\n        service TestService {\n            operations: [TestOp]\n        }\n\n        operation TestOp {\n            errors: [MyError]\n        }\n\n        @error(\"server\")\n        @retryable\n        structure MyError {\n            message: String\n        }\n        \"\"\".asSmithyModel()\n\n    @Test\n    fun `generate error structure and builder`() {\n        clientIntegrationTest(model) { _, rustCrate ->\n            rustCrate.withFile(\"src/types/error.rs\") {\n                rust(\n                    \"\"\"\n                    ##[test]\n                    fn test_error_generator() {\n                        use aws_smithy_types::error::metadata::{ErrorMetadata, ProvideErrorMetadata};\n                        use aws_smithy_types::retry::ErrorKind;\n\n                        let err = MyError::builder()\n                            .meta(ErrorMetadata::builder().code(\"test\").message(\"testmsg\").build())\n                            .message(\"testmsg\")\n                            .build();\n                        assert_eq!(err.retryable_error_kind(), ErrorKind::ServerError);\n                        assert_eq!(\"test\", err.meta().code().unwrap());\n                        assert_eq!(\"testmsg\", err.meta().message().unwrap());\n                        assert_eq!(\"testmsg\", err.message().unwrap());\n                    }\n                    \"\"\",\n                )\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/error/OperationErrorGeneratorTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.generators.error\n\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.unitTest\nimport software.amazon.smithy.rust.codegen.core.util.lookup\n\nclass OperationErrorGeneratorTest {\n    private val model =\n        \"\"\"\n        namespace error\n\n        @aws.protocols#awsJson1_0\n        service TestService {\n            operations: [Greeting],\n        }\n\n        operation Greeting {\n            errors: [InvalidGreeting, ComplexError, FooException, Deprecated]\n        }\n\n        @error(\"client\")\n        @retryable\n        structure InvalidGreeting {\n            message: String,\n        }\n\n        @error(\"server\")\n        structure FooException { }\n\n        @error(\"server\")\n        structure ComplexError {\n            abc: String,\n            other: Integer\n        }\n\n        @error(\"server\")\n        @deprecated\n        structure Deprecated { }\n        \"\"\".asSmithyModel()\n\n    @Test\n    fun `generates combined error enums`() {\n        clientIntegrationTest(model) { _, rustCrate ->\n            rustCrate.moduleFor(model.lookup<StructureShape>(\"error#FooException\")) {\n                unitTest(\n                    name = \"generates_combined_error_enums\",\n                    test = \"\"\"\n                        use crate::operation::greeting::GreetingError;\n                        use aws_smithy_types::error::ErrorMetadata;\n\n                        let error = GreetingError::InvalidGreeting(\n                            InvalidGreeting::builder()\n                                .message(\"an error\")\n                                .meta(ErrorMetadata::builder().code(\"InvalidGreeting\").message(\"an error\").build())\n                                .build()\n                        );\n                        assert_eq!(format!(\"{}\", error), \"InvalidGreeting: an error\");\n                        assert_eq!(error.meta().message(), Some(\"an error\"));\n                        assert_eq!(error.meta().code(), Some(\"InvalidGreeting\"));\n                        use aws_smithy_types::retry::ProvideErrorKind;\n                        assert_eq!(error.retryable_error_kind(), Some(aws_smithy_types::retry::ErrorKind::ClientError));\n\n                        // Generate is_xyz methods for errors.\n                        assert_eq!(error.is_invalid_greeting(), true);\n                        assert_eq!(error.is_complex_error(), false);\n\n                        // Unhandled variants properly delegate message.\n                        let error = GreetingError::generic(ErrorMetadata::builder().message(\"hello\").build());\n                        assert_eq!(error.meta().message(), Some(\"hello\"));\n\n                        let error = GreetingError::unhandled(\"some other error\");\n                        assert_eq!(error.meta().message(), None);\n                        assert_eq!(error.meta().code(), None);\n\n                        // Indicate the original name in the display output.\n                        let error = FooError::builder().build();\n                        assert_eq!(format!(\"{}\", error), \"FooError [FooException]\");\n\n                        let error = Deprecated::builder().build();\n                        assert_eq!(error.to_string(), \"Deprecated\");\n                    \"\"\",\n                )\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/error/ServiceErrorGeneratorTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.generators.error\n\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.integrationTest\nimport software.amazon.smithy.rust.codegen.core.testutil.unitTest\nimport software.amazon.smithy.rust.codegen.core.util.lookup\n\ninternal class ServiceErrorGeneratorTest {\n    private val model =\n        \"\"\"\n        namespace com.example\n\n        use aws.protocols#restJson1\n\n        @restJson1\n        service HelloService {\n            operations: [SayHello],\n            version: \"1\"\n        }\n\n        @http(uri: \"/\", method: \"POST\")\n        operation SayHello {\n            input: EmptyStruct,\n            output: EmptyStruct,\n            errors: [SorryBusy, CanYouRepeatThat, MeDeprecated]\n        }\n\n        structure EmptyStruct { }\n\n        @error(\"server\")\n        structure SorryBusy { }\n\n        @error(\"client\")\n        structure CanYouRepeatThat { }\n\n        @error(\"client\")\n        @deprecated\n        structure MeDeprecated { }\n        \"\"\".asSmithyModel()\n\n    @Test\n    fun `top level errors are send + sync`() {\n        clientIntegrationTest(model) { codegenContext, rustCrate ->\n            rustCrate.integrationTest(\"validate_errors\") {\n                rust(\n                    \"\"\"\n                    fn check_send_sync<T: Send + Sync>() {}\n\n                    ##[test]\n                    fn service_errors_are_send_sync() {\n                        check_send_sync::<${codegenContext.moduleUseName()}::Error>()\n                    }\n                    \"\"\",\n                )\n            }\n        }\n    }\n\n    @Test\n    fun `generates combined error enums`() {\n        clientIntegrationTest(model) { _, rustCrate ->\n            rustCrate.moduleFor(model.lookup<StructureShape>(\"com.example#CanYouRepeatThat\")) {\n                unitTest(\n                    name = \"generates_combined_error_enums\",\n                    test = \"\"\"\n                        use std::error::Error as StdError;\n                        use crate::Error;\n                        use crate::operation::say_hello::SayHelloError;\n\n                        // Unhandled variants properly delegate source.\n                        let error = Error::from(SayHelloError::unhandled(\"some other error\"));\n                        let source = error.source().expect(\"source should not be None\");\n                        assert_eq!(format!(\"{}\", source), \"some other error\");\n                    \"\"\",\n                )\n            }\n        }\n    }\n\n    @Test\n    fun `provides error metadata`() {\n        clientIntegrationTest(model) { _, rustCrate ->\n            rustCrate.moduleFor(model.lookup<StructureShape>(\"com.example#CanYouRepeatThat\")) {\n                unitTest(\n                    name = \"generates_combined_error_enums\",\n                    test = \"\"\"\n                        use crate::Error;\n                        use crate::error::{ErrorMetadata, ProvideErrorMetadata};\n                        use crate::operation::say_hello::SayHelloError;\n                        use crate::types::error::*;\n\n                        // Unhandled variants properly delegate source.\n                        let error = Error::from(SayHelloError::SorryBusy(\n                            SorryBusy::builder()\n                                .meta(ErrorMetadata::builder().code(\"some code\").message(\"some message\").build())\n                                .build()\n                        ));\n                        assert_eq!(\"some code\", error.code().expect(\"code field\"));\n                        assert_eq!(\"some message\", error.message().expect(\"message field\"));\n                    \"\"\",\n                )\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/http/RequestBindingGeneratorTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.generators.http\n\nimport io.kotest.matchers.shouldBe\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.traits.HttpTrait\nimport software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest\nimport software.amazon.smithy.rust.codegen.client.testutil.testClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.testutil.testSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlock\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RustCrate\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.operationBuildError\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.RestJson\nimport software.amazon.smithy.rust.codegen.core.smithy.transformers.OperationNormalizer\nimport software.amazon.smithy.rust.codegen.core.testutil.TestRuntimeConfig\nimport software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.compileAndTest\nimport software.amazon.smithy.rust.codegen.core.testutil.integrationTest\nimport software.amazon.smithy.rust.codegen.core.testutil.renderWithModelBuilder\nimport software.amazon.smithy.rust.codegen.core.testutil.unitTest\nimport software.amazon.smithy.rust.codegen.core.util.dq\nimport software.amazon.smithy.rust.codegen.core.util.expectTrait\n\nclass RequestBindingGeneratorTest {\n    private val baseModel =\n        \"\"\"\n        namespace smithy.example\n\n        @idempotent\n        @http(method: \"PUT\", uri: \"/{bucketName}/{key}\", code: 200)\n        operation PutObject {\n            input: PutObjectRequest\n        }\n\n        list Extras {\n            member: Integer\n        }\n\n        list Dates {\n            member: Timestamp\n        }\n\n        @enum([\n            {\n                value: \"variantA\",\n                name: \"VARIANT_A\",\n            },\n            {\n                value: \"variantB\",\n                name: \"VARIANT_B\",\n            },\n        ])\n        string RequiredEnum\n\n        @mediaType(\"video/quicktime\")\n        string Video\n\n        map StringMap {\n            key: String,\n            value: String\n        }\n\n        structure PutObjectRequest {\n            // Sent in the URI label named \"key\".\n            @required\n            @httpLabel\n            key: Timestamp,\n\n            // Sent in the URI label named \"bucketName\".\n            @required\n            @httpLabel\n            bucketName: String,\n\n            // Sent in the X-Dates header\n            @httpHeader(\"X-Dates\")\n            dateHeaderList: Dates,\n\n            @httpHeader(\"X-Ints\")\n            intList: Extras,\n\n            @httpHeader(\"X-MediaType\")\n            mediaType: Video,\n\n            // Sent in the query string as paramName\n            @httpQuery(\"paramName\")\n            someValue: String,\n\n            @httpQuery(\"primitive\")\n            primitive: PrimitiveInteger,\n\n            @httpQuery(\"enabled\")\n            enabled: PrimitiveBoolean,\n\n            @httpQuery(\"hello\")\n            extras: Extras,\n\n            @required\n            @httpQuery(\"uploadId\")\n            uploadId: String,\n\n            // Sent in the body\n            data: Blob,\n\n            // Sent in the body\n            additional: String,\n\n            @httpPrefixHeaders(\"X-Prefix-\")\n            prefix: StringMap,\n\n            @httpHeader(\"stringHeader\")\n            stringHeader: SensitiveStringHeader\n        }\n\n        @sensitive\n        string SensitiveStringHeader\n        \"\"\".asSmithyModel()\n    private val model = OperationNormalizer.transform(baseModel)\n    private val symbolProvider = testSymbolProvider(model)\n    private val operationShape = model.expectShape(ShapeId.from(\"smithy.example#PutObject\"), OperationShape::class.java)\n    private val inputShape = model.expectShape(operationShape.input.get(), StructureShape::class.java)\n    private val operationModule = symbolProvider.moduleForShape(inputShape)\n\n    private fun renderOperation(rustCrate: RustCrate) {\n        inputShape.renderWithModelBuilder(model, symbolProvider, rustCrate)\n        rustCrate.withModule(operationModule) {\n            val codegenContext = testClientCodegenContext(model)\n            val bindingGen =\n                RequestBindingGenerator(\n                    codegenContext,\n                    // Any protocol is fine for this test.\n                    RestJson(codegenContext),\n                    operationShape,\n                )\n            rustBlock(\"impl PutObjectInput\") {\n                // RequestBindingGenerator's functions expect to be rendered inside a function,\n                // but the unit test needs to call some of these functions individually. This generates\n                // some wrappers that can be called directly from the tests. The functions will get duplicated,\n                // but that's not a problem.\n\n                rustBlock(\n                    \"pub fn test_uri_query(&self, mut output: &mut String) -> Result<(), #T>\",\n                    TestRuntimeConfig.operationBuildError(),\n                ) {\n                    bindingGen.renderUpdateHttpBuilder(this)\n                    rust(\"uri_query(self, output)\")\n                }\n\n                rustBlock(\n                    \"pub fn test_uri_base(&self, mut output: &mut String) -> Result<(), #T>\",\n                    TestRuntimeConfig.operationBuildError(),\n                ) {\n                    bindingGen.renderUpdateHttpBuilder(this)\n                    rust(\"uri_base(self, output)\")\n                }\n\n                rustBlock(\n                    \"pub fn test_request_builder_base(&self) -> Result<#T, #T>\",\n                    RuntimeType.HttpRequestBuilder1x,\n                    TestRuntimeConfig.operationBuildError(),\n                ) {\n                    bindingGen.renderUpdateHttpBuilder(this)\n                    rust(\"let builder = #T::new();\", RuntimeType.HttpRequestBuilder1x)\n                    rust(\"update_http_builder(self, builder)\")\n                }\n            }\n        }\n    }\n\n    @Test\n    fun `produces correct uri format strings`() {\n        val httpTrait = operationShape.expectTrait<HttpTrait>()\n        httpTrait.uriFormatString() shouldBe (\"/{bucketName}/{key}\".dq())\n    }\n\n    @Test\n    fun `generates valid request bindings`() {\n        val project = TestWorkspace.testProject(symbolProvider)\n        renderOperation(project)\n        project.withModule(operationModule) { // Currently rendering the operation renders the protocols—I want to separate that at some point.\n            unitTest(\n                name = \"generate_uris\",\n                test = \"\"\"\n                    let ts = aws_smithy_types::DateTime::from_secs(10123125);\n                    let inp = PutObjectInput::builder()\n                        .bucket_name(\"somebucket/ok\")\n                        .key(ts.clone())\n                        .upload_id(\"some-valid-id\")\n                        .set_extras(Some(vec![0,1,2,44]))\n                        .some_value(\"svq!!%&\")\n                        .build().expect(\"build should succeed\");\n                    let mut o = String::new();\n                    inp.test_uri_base(&mut o);\n                    assert_eq!(o.as_str(), \"/somebucket%2Fok/1970-04-28T03%3A58%3A45Z\");\n                    o.clear();\n                    inp.test_uri_query(&mut o);\n                    assert_eq!(o.as_str(), \"?paramName=svq%21%21%25%26&hello=0&hello=1&hello=2&hello=44&uploadId=some-valid-id\")\n                \"\"\",\n            )\n\n            unitTest(\n                name = \"serialize_non_zero_values\",\n                test = \"\"\"\n                    let ts = aws_smithy_types::DateTime::from_secs(10123125);\n                    let inp = PutObjectInput::builder()\n                        .bucket_name(\"somebucket/ok\")\n                        .key(ts.clone())\n                        .upload_id(\"some-valid-id\")\n                        .primitive(1)\n                        .enabled(true)\n                        .build().expect(\"build should succeed\");\n                    let mut o = String::new();\n                    inp.test_uri_query(&mut o);\n                    assert_eq!(o.as_str(), \"?primitive=1&enabled=true&uploadId=some-valid-id\")\n                \"\"\",\n            )\n\n            unitTest(\n                name = \"build_http_requests\",\n                test = \"\"\"\n                    use std::collections::HashMap;\n                    let ts = aws_smithy_types::DateTime::from_secs(10123125);\n                    let inp = PutObjectInput::builder()\n                        .bucket_name(\"buk\")\n                        .set_date_header_list(Some(vec![ts.clone()]))\n                        .set_int_list(Some(vec![0,1,44]))\n                        .key(ts.clone())\n                        .upload_id(\"some-valid-id\")\n                        .set_extras(Some(vec![0,1]))\n                        .some_value(\"qp\")\n                        .media_type(\"base64encodethis\")\n                        .prefix(\"k\".to_string(), \"😹\".to_string())\n                        .build().unwrap();\n                    let http_request = inp.test_request_builder_base().expect(\"valid input\").body(()).unwrap();\n                    assert_eq!(http_request.uri(), \"/buk/1970-04-28T03%3A58%3A45Z?paramName=qp&hello=0&hello=1&uploadId=some-valid-id\");\n                    assert_eq!(http_request.method(), \"PUT\");\n                    let mut date_header = http_request.headers().get_all(\"X-Dates\").iter();\n                    assert_eq!(date_header.next().unwrap(), \"Tue, 28 Apr 1970 03:58:45 GMT\");\n                    assert_eq!(date_header.next(), None);\n\n                    let int_header = http_request.headers().get_all(\"X-Ints\").iter().map(|hv|hv.to_str().unwrap()).collect::<Vec<_>>();\n                    assert_eq!(int_header, vec![\"0\", \"1\", \"44\"]);\n\n                    let base64_header = http_request.headers().get_all(\"X-MediaType\").iter().map(|hv|hv.to_str().unwrap()).collect::<Vec<_>>();\n                    assert_eq!(base64_header, vec![\"YmFzZTY0ZW5jb2RldGhpcw==\"]);\n\n                    let prefix_header = http_request.headers().get_all(\"X-Prefix-k\").iter().map(|hv|std::str::from_utf8(hv.as_ref()).unwrap()).collect::<Vec<_>>();\n                    assert_eq!(prefix_header, vec![\"😹\"])\n                \"\"\",\n            )\n\n            unitTest(\n                name = \"invalid_header_name_produces_error\",\n                test = \"\"\"\n                    use std::collections::HashMap;\n                    let ts = aws_smithy_types::DateTime::from_secs(10123125);\n                    let inp = PutObjectInput::builder()\n                        .bucket_name(\"buk\")\n                        .key(ts.clone())\n                        .upload_id(\"some-valid-id\")\n                        .prefix(\"😹\".to_string(), \"😹\".to_string())\n                        .build().unwrap();\n                    let err = inp.test_request_builder_base().expect_err(\"can't make a header out of a cat emoji\");\n                    assert_eq!(format!(\"{}\", err), \"invalid field in input: prefix (details: `😹` cannot be used as a header name: invalid HTTP header name)\");\n                \"\"\",\n            )\n\n            unitTest(\n                name = \"invalid_prefix_header_value_produces_an_error\",\n                test = \"\"\"\n                    use std::collections::HashMap;\n                    let ts = aws_smithy_types::DateTime::from_secs(10123125);\n                    let inp = PutObjectInput::builder()\n                        .bucket_name(\"buk\")\n                        .key(ts.clone())\n                        .upload_id(\"some-valid-id\")\n                        .prefix(\"valid-key\".to_string(), \"\\n can't put a newline in a header value\".to_string())\n                        .build().unwrap();\n                    let err = inp.test_request_builder_base().expect_err(\"can't make a header with a newline\");\n                    assert_eq!(format!(\"{}\", err), \"invalid field in input: prefix (details: `\\n can\\'t put a newline in a header value` cannot be used as a header value: failed to parse header value)\");\n                \"\"\",\n            )\n\n            unitTest(\n                name = \"invalid_header_value_produces_an_error\",\n                test = \"\"\"\n                    let ts = aws_smithy_types::DateTime::from_secs(10123125);\n                    let inp = PutObjectInput::builder()\n                        .bucket_name(\"buk\")\n                        .key(ts.clone())\n                        .upload_id(\"some-valid-id\")\n                        .string_header(\"\\n is not valid\")\n                        .build().unwrap();\n                    let err = inp.test_request_builder_base().expect_err(\"can't make a header with a newline\");\n                    // make sure we obey the sensitive trait\n                    assert_eq!(format!(\"{}\", err), \"invalid field in input: string_header (details: `*** Sensitive Data Redacted ***` cannot be used as a header value: failed to parse header value)\");\n                \"\"\",\n            )\n\n            unitTest(\n                name = \"missing_uri_label_produces_an_error\",\n                test = \"\"\"\n                    let ts = aws_smithy_types::DateTime::from_secs(10123125);\n                    let inp = PutObjectInput::builder()\n                        // don't set bucket\n                        // .bucket_name(\"buk\")\n                        .key(ts.clone())\n                        .upload_id(\"some-valid-id\")\n                        .build().unwrap();\n                    let err = inp.test_request_builder_base().expect_err(\"can't build request with bucket unset\");\n                    let message = err.to_string();\n                    let expected = \"bucket_name was missing: cannot be empty or unset\";\n                    assert!(message.contains(expected), \"expected '{message}' to contain '{expected}'\");\n                \"\"\",\n            )\n\n            unitTest(\n                name = \"missing_timestamp_uri_label_produces_an_error\",\n                test = \"\"\"\n                    let ts = aws_smithy_types::DateTime::from_secs(10123125);\n                    let inp = PutObjectInput::builder()\n                        .bucket_name(\"buk\")\n                        // don't set key\n                        // .key(ts.clone())\n                        .upload_id(\"some-valid-id\")\n                        .build().unwrap();\n                    let err = inp.test_request_builder_base().expect_err(\"can't build request with bucket unset\");\n                    let message = err.to_string();\n                    let expected = \"key was missing: cannot be empty or unset\";\n                    assert!(message.contains(expected), \"expected '{message}' to contain '{expected}'\");\n                \"\"\",\n            )\n\n            unitTest(\n                name = \"empty_uri_label_produces_an_error\",\n                test = \"\"\"\n                    let ts = aws_smithy_types::DateTime::from_secs(10123125);\n                    let inp = PutObjectInput::builder()\n                        .bucket_name(\"\")\n                        .key(ts.clone())\n                        .upload_id(\"some-valid-id\")\n                        .build().unwrap();\n                    let err = inp.test_request_builder_base().expect_err(\"can't build request with bucket unset\");\n                    let message = err.to_string();\n                    let expected = \"bucket_name was missing: cannot be empty or unset\";\n                    assert!(message.contains(expected), \"expected '{message}' to contain '{expected}'\");\n                \"\"\",\n            )\n\n            unitTest(\n                name = \"error_when_required_query_param_is_missing\",\n                test = \"\"\"\n                    let ts = aws_smithy_types::DateTime::from_secs(10123125);\n                    let inp = PutObjectInput::builder()\n                        .bucket_name(\"buk\")\n                        // don't set uploadId\n                        // .upload_id(\"some-id\")\n                        .key(ts.clone())\n                        .build().unwrap();\n                    let err = inp.test_request_builder_base().expect_err(\"can't build request with uploadId unset\");\n                    let message = err.to_string();\n                    let expected = \"upload_id was missing: cannot be empty or unset\";\n                    assert!(message.contains(expected), \"expected '{message}' to contain '{expected}'\");\n                \"\"\",\n            )\n\n            unitTest(\n                name = \"error_when_required_query_param_is_empty\",\n                test = \"\"\"\n                    let ts = aws_smithy_types::DateTime::from_secs(10123125);\n                    let inp = PutObjectInput::builder()\n                        .bucket_name(\"buk\")\n                        .key(ts.clone())\n                        .upload_id(\"\")\n                        .build().unwrap();\n                    let err = inp.test_request_builder_base().expect_err(\"can't build request with uploadId unset\");\n                    let message = err.to_string();\n                    let expected = \"upload_id was missing: cannot be empty or unset\";\n                    assert!(message.contains(expected), \"expected '{message}' to contain '{expected}'\");\n                \"\"\",\n            )\n        }\n\n        project.compileAndTest()\n    }\n\n    @Test\n    fun `unnamed enums in query params and labels use as_str`() {\n        val testModel =\n            \"\"\"\n            namespace smithy.example\n\n            use aws.protocols#restJson1\n\n            @restJson1\n            service TestService {\n                operations: [GetThing]\n            }\n\n            @http(method: \"GET\", uri: \"/things/{label}\", code: 200)\n            operation GetThing {\n                input: GetThingInput\n            }\n\n            @enum([\n                { value: \"a\" },\n                { value: \"b\" },\n            ])\n            string UnnamedEnum\n\n            structure GetThingInput {\n                @required\n                @httpLabel\n                label: UnnamedEnum,\n\n                @httpQuery(\"q\")\n                query: UnnamedEnum,\n            }\n            \"\"\".asSmithyModel()\n\n        clientIntegrationTest(testModel) { codegenContext, rustCrate ->\n            val moduleName = codegenContext.moduleUseName()\n            rustCrate.integrationTest(\"unnamed_enum_query_and_label\") {\n                rust(\n                    \"\"\"\n                    ##[test]\n                    fn unnamed_enum_in_query_and_label() {\n                        let conf = $moduleName::Config::builder()\n                            .endpoint_url(\"http://localhost\")\n                            .behavior_version_latest()\n                            .build();\n                        let client = $moduleName::Client::from_conf(conf);\n                        let _ = client.get_thing()\n                            .label($moduleName::types::UnnamedEnum::from(\"a\"))\n                            .query($moduleName::types::UnnamedEnum::from(\"b\"));\n                    }\n                    \"\"\",\n                )\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/http/ResponseBindingGeneratorTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.generators.http\n\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.rust.codegen.client.testutil.testClientCodegenContext\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RustCrate\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.HttpLocation\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.HttpTraitHttpBindingResolver\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.ProtocolContentTypes\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.RestJson\nimport software.amazon.smithy.rust.codegen.core.smithy.transformers.OperationNormalizer\nimport software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.compileAndTest\nimport software.amazon.smithy.rust.codegen.core.testutil.renderWithModelBuilder\nimport software.amazon.smithy.rust.codegen.core.util.lookup\nimport software.amazon.smithy.rust.codegen.core.util.outputShape\n\nclass ResponseBindingGeneratorTest {\n    private val baseModel =\n        \"\"\"\n        namespace smithy.example\n\n        @idempotent\n        @http(method: \"PUT\", uri: \"/\", code: 200)\n        operation PutObject {\n            output: PutObjectResponse\n        }\n\n        list Extras {\n            member: Integer\n        }\n\n        list Dates {\n            member: Timestamp\n        }\n\n        @mediaType(\"video/quicktime\")\n        string Video\n\n        structure PutObjectResponse {\n            // Sent in the X-Dates header\n            @httpHeader(\"X-Dates\")\n            dateHeaderList: Dates,\n\n            @httpHeader(\"X-Ints\")\n            intList: Extras,\n\n            @httpHeader(\"X-MediaType\")\n            mediaType: Video,\n\n            // Sent in the body\n            data: Blob,\n\n            // Sent in the body\n            additional: String,\n        }\n        \"\"\".asSmithyModel()\n    private val model = OperationNormalizer.transform(baseModel)\n    private val operationShape: OperationShape = model.lookup(\"smithy.example#PutObject\")\n    private val outputShape: StructureShape = operationShape.outputShape(model)\n    private val codegenContext = testClientCodegenContext(model)\n    private val symbolProvider = codegenContext.symbolProvider\n\n    private fun RustCrate.renderOperation() {\n        operationShape.outputShape(model).renderWithModelBuilder(model, symbolProvider, this)\n        withModule(symbolProvider.moduleForShape(outputShape)) {\n            rustBlock(\"impl PutObjectOutput\") {\n                val bindings =\n                    HttpTraitHttpBindingResolver(model, ProtocolContentTypes.consistent(\"dont-care\"))\n                        .responseBindings(operationShape)\n                        .filter { it.location == HttpLocation.HEADER }\n                bindings.forEach { binding ->\n                    val runtimeType =\n                        ResponseBindingGenerator(\n                            RestJson(codegenContext),\n                            codegenContext,\n                            operationShape,\n                        ).generateDeserializeHeaderFn(binding)\n                    // little hack to force these functions to be generated\n                    rust(\"// use #T;\", runtimeType)\n                }\n            }\n        }\n    }\n\n    @Test\n    fun deserializeHeadersIntoOutputShape() {\n        val testProject = TestWorkspace.testProject(symbolProvider)\n        testProject.renderOperation()\n        testProject.withModule(symbolProvider.moduleForShape(outputShape)) {\n            rustTemplate(\n                \"\"\"\n                ##[test]\n                fn http_header_deser() {\n                    use crate::protocol_serde::shape_put_object_output::*;\n                    let resp = #{Response}::try_from(\n                        #{http}::Response::builder()\n                            .header(\"X-Ints\", \"1,2,3\")\n                            .header(\"X-Ints\", \"4,5,6\")\n                            .header(\"X-MediaType\", \"c21pdGh5LXJz\")\n                            .header(\"X-Dates\", \"Mon, 16 Dec 2019 23:48:18 GMT\")\n                            .header(\"X-Dates\", \"Mon, 16 Dec 2019 23:48:18 GMT,Tue, 17 Dec 2019 23:48:18 GMT\")\n                            .body(())\n                            .expect(\"valid request\")\n                    ).unwrap();\n                    assert_eq!(de_int_list_header(resp.headers()).unwrap(), Some(vec![1,2,3,4,5,6]));\n                    assert_eq!(de_media_type_header(resp.headers()).expect(\"valid\").unwrap(), \"smithy-rs\");\n                    assert_eq!(de_date_header_list_header(resp.headers()).unwrap().unwrap().len(), 3);\n                }\n                \"\"\",\n                \"Response\" to RuntimeType.smithyRuntimeApi(codegenContext.runtimeConfig).resolve(\"http::Response\"),\n                \"http\" to RuntimeType.Http1x,\n            )\n        }\n        testProject.compileAndTest()\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolParserGeneratorTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.generators.protocol\n\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\n\nclass ProtocolParserGeneratorTest {\n    private val model =\n        \"\"\"\n        ${'$'}version: \"2.0\"\n        namespace test\n\n        use aws.protocols#restJson1\n\n        @restJson1\n        service TestService {\n            version: \"2019-12-16\",\n            operations: [SomeOperation]\n            errors: [SomeTopLevelError]\n        }\n\n        @http(uri: \"/SomeOperation\", method: \"POST\")\n        operation SomeOperation {\n            input: SomeOperationInputOutput,\n            output: SomeOperationInputOutput,\n            errors: [SomeOperationError]\n        }\n\n        structure SomeOperationInputOutput {\n            payload: String,\n            a: String,\n            b: Integer\n        }\n\n        @error(\"server\")\n        structure SomeTopLevelError {\n            @required\n            requestId: String\n\n            @required\n            message: String\n\n            code: String = \"400\"\n\n            context: String\n        }\n\n        @error(\"client\")\n        structure SomeOperationError {\n            @required\n            requestId: String\n\n            @required\n            message: String\n\n            code: String = \"400\"\n\n            context: String\n        }\n        \"\"\"\n            .asSmithyModel()\n\n    @Test\n    fun `generate an complex error structure that compiles`() {\n        clientIntegrationTest(model) { _, _ -> }\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/protocol/ProtocolTestGeneratorTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.generators.protocol\n\nimport io.kotest.matchers.string.shouldContain\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.assertThrows\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.OperationCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.OperationSection\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginCustomization\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.ServiceRuntimePluginSection\nimport software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.util.CommandError\nimport software.amazon.smithy.rust.codegen.core.util.dq\nimport java.nio.file.Path\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType as RT\n\nprivate class TestServiceRuntimePluginCustomization(\n    private val context: ClientCodegenContext,\n    private val fakeRequestBuilder: String,\n    private val fakeRequestBody: String,\n) : ServiceRuntimePluginCustomization() {\n    override fun section(section: ServiceRuntimePluginSection): Writable =\n        writable {\n            if (section is ServiceRuntimePluginSection.RegisterRuntimeComponents) {\n                val rc = context.runtimeConfig\n                section.registerInterceptor(this) {\n                    rustTemplate(\n                        \"\"\"\n                        {\n                            ##[derive(::std::fmt::Debug)]\n                            struct TestInterceptor;\n                            impl #{Intercept} for TestInterceptor {\n                                fn name(&self) -> &'static str {\n                                    \"TestInterceptor\"\n                                }\n\n                                fn modify_before_retry_loop(\n                                    &self,\n                                    context: &mut #{BeforeTransmitInterceptorContextMut}<'_>,\n                                    _rc: &#{RuntimeComponents},\n                                    _cfg: &mut #{ConfigBag},\n                                ) -> #{Result}<(), #{BoxError}> {\n                                    // Replace the serialized request\n                                    let mut fake_req = #{Http}::Request::builder()\n                                        $fakeRequestBuilder\n                                        .body(#{SdkBody}::from($fakeRequestBody))\n                                        .expect(\"valid request\").try_into().unwrap();\n                                    ::std::mem::swap(\n                                        context.request_mut(),\n                                        &mut fake_req,\n                                    );\n                                    Ok(())\n                                }\n                            }\n\n                            TestInterceptor\n                        }\n                        \"\"\",\n                        *preludeScope,\n                        \"BeforeTransmitInterceptorContextMut\" to RT.beforeTransmitInterceptorContextMut(rc),\n                        \"BoxError\" to RT.boxError(rc),\n                        \"ConfigBag\" to RT.configBag(rc),\n                        \"Intercept\" to RT.intercept(rc),\n                        \"RuntimeComponents\" to RT.runtimeComponents(rc),\n                        \"SdkBody\" to RT.sdkBody(rc),\n                        \"Http\" to RT.Http1x,\n                    )\n                }\n            }\n        }\n}\n\nprivate class TestOperationCustomization(\n    private val context: ClientCodegenContext,\n    private val fakeOutput: String,\n) : OperationCustomization() {\n    override fun section(section: OperationSection): Writable =\n        writable {\n            val rc = context.runtimeConfig\n            if (section is OperationSection.AdditionalRuntimePluginConfig) {\n                rustTemplate(\n                    \"\"\"\n                    // Override the default response deserializer with our fake output\n                    ##[derive(::std::fmt::Debug)]\n                    struct TestDeser;\n                    impl #{DeserializeResponse} for TestDeser {\n                        fn deserialize_nonstreaming(\n                            &self,\n                            _response: &#{HttpResponse},\n                        ) -> #{Result}<#{Output}, #{OrchestratorError}<#{Error}>> {\n                            let fake_out: #{Result}<\n                                crate::operation::say_hello::SayHelloOutput,\n                                crate::operation::say_hello::SayHelloError,\n                            > = $fakeOutput;\n                            fake_out\n                                .map(|o| #{Output}::erase(o))\n                                .map_err(|e| #{OrchestratorError}::operation(#{Error}::erase(e)))\n                        }\n                    }\n                    cfg.store_put(#{SharedResponseDeserializer}::new(TestDeser));\n                    \"\"\",\n                    *preludeScope,\n                    \"SharedResponseDeserializer\" to\n                        RT.smithyRuntimeApi(rc)\n                            .resolve(\"client::ser_de::SharedResponseDeserializer\"),\n                    \"Error\" to RT.smithyRuntimeApi(rc).resolve(\"client::interceptors::context::Error\"),\n                    \"HttpResponse\" to RT.smithyRuntimeApi(rc).resolve(\"client::orchestrator::HttpResponse\"),\n                    \"OrchestratorError\" to RT.smithyRuntimeApi(rc).resolve(\"client::orchestrator::OrchestratorError\"),\n                    \"Output\" to RT.smithyRuntimeApi(rc).resolve(\"client::interceptors::context::Output\"),\n                    \"DeserializeResponse\" to RT.smithyRuntimeApi(rc).resolve(\"client::ser_de::DeserializeResponse\"),\n                )\n            }\n        }\n}\n\nclass ProtocolTestGeneratorTest {\n    private val model =\n        \"\"\"\n        namespace com.example\n\n        use aws.protocols#restJson1\n        use smithy.test#httpRequestTests\n        use smithy.test#httpResponseTests\n\n        @restJson1\n        service HelloService {\n            operations: [SayHello],\n            version: \"1\"\n        }\n\n        @http(method: \"POST\", uri: \"/\")\n        @httpRequestTests([\n            {\n                id: \"say_hello\",\n                protocol: restJson1,\n                params: {\n                    \"greeting\": \"Hi\",\n                    \"name\": \"Teddy\",\n                    \"query\": \"Hello there\"\n                },\n                method: \"POST\",\n                uri: \"/\",\n                queryParams: [\n                    \"Hi=Hello%20there\"\n                ],\n                forbidQueryParams: [\n                    \"goodbye\"\n                ],\n                requireQueryParams: [\"required\"],\n                headers: {\n                    \"X-Greeting\": \"Hi\",\n                },\n                body: \"{\\\"name\\\": \\\"Teddy\\\"}\",\n                bodyMediaType: \"application/json\"\n            }\n        ])\n        @httpResponseTests([{\n            id: \"basic_response_test\",\n            protocol: restJson1,\n            documentation: \"Parses operations with empty JSON bodies\",\n            body: \"{\\\"value\\\": \\\"hey there!\\\"}\",\n            params: {\"value\": \"hey there!\"},\n            bodyMediaType: \"application/json\",\n            headers: {\"Content-Type\": \"application/x-amz-json-1.1\"},\n            code: 200,\n        }])\n        operation SayHello {\n            input: SayHelloInput,\n            output: SayHelloOutput,\n            errors: [BadRequest]\n        }\n\n        structure SayHelloOutput {\n            value: String\n        }\n\n        @error(\"client\")\n        structure BadRequest {\n            message: String\n        }\n\n        structure SayHelloInput {\n            @httpHeader(\"X-Greeting\")\n            greeting: String,\n\n            @httpQuery(\"Hi\")\n            query: String,\n\n            name: String\n        }\n        \"\"\".asSmithyModel()\n    private val correctBody = \"\"\"{\"name\": \"Teddy\"}\"\"\"\n\n    /**\n     * Creates a fake HTTP implementation for SayHello & generates the protocol test\n     *\n     * Returns the [Path] the service was generated at, suitable for running `cargo test`\n     */\n    private fun testService(\n        fakeRequestBuilder: String,\n        fakeRequestBody: String = \"${correctBody.dq()}.to_string()\",\n        fakeOutput: String = \"\"\"Ok(crate::operation::say_hello::SayHelloOutput::builder().value(\"hey there!\").build())\"\"\",\n    ): Path {\n        val codegenDecorator =\n            object : ClientCodegenDecorator {\n                override val name: String = \"mock\"\n                override val order: Byte = 0\n\n                override fun classpathDiscoverable(): Boolean = false\n\n                override fun serviceRuntimePluginCustomizations(\n                    codegenContext: ClientCodegenContext,\n                    baseCustomizations: List<ServiceRuntimePluginCustomization>,\n                ): List<ServiceRuntimePluginCustomization> =\n                    baseCustomizations +\n                        TestServiceRuntimePluginCustomization(\n                            codegenContext,\n                            fakeRequestBuilder,\n                            fakeRequestBody,\n                        )\n\n                override fun operationCustomizations(\n                    codegenContext: ClientCodegenContext,\n                    operation: OperationShape,\n                    baseCustomizations: List<OperationCustomization>,\n                ): List<OperationCustomization> =\n                    baseCustomizations + TestOperationCustomization(codegenContext, fakeOutput)\n            }\n        return clientIntegrationTest(\n            model,\n            additionalDecorators = listOf(codegenDecorator),\n        )\n    }\n\n    @Test\n    fun `passing e2e protocol request test`() {\n        testService(\n            \"\"\"\n            .uri(\"/?Hi=Hello%20there&required\")\n            .header(\"X-Greeting\", \"Hi\")\n            .method(\"POST\")\n            \"\"\",\n        )\n    }\n\n    @Test\n    fun `test incorrect response parsing`() {\n        val err =\n            assertThrows<CommandError> {\n                testService(\n                    \"\"\"\n                    .uri(\"/?Hi=Hello%20there&required\")\n                    .header(\"X-Greeting\", \"Hi\")\n                    .method(\"POST\")\n                    \"\"\",\n                    fakeOutput = \"Ok(crate::operation::say_hello::SayHelloOutput::builder().build())\",\n                )\n            }\n\n        err.message shouldContain \"basic_response_test_response ... FAILED\"\n    }\n\n    @Test\n    fun `test invalid body`() {\n        val err =\n            assertThrows<CommandError> {\n                testService(\n                    \"\"\"\n                    .uri(\"/?Hi=Hello%20there&required\")\n                    .header(\"X-Greeting\", \"Hi\")\n                    .method(\"POST\")\n                    \"\"\",\n                    \"\"\"\"{}\".to_string()\"\"\",\n                )\n            }\n\n        err.message shouldContain \"say_hello_request ... FAILED\"\n        err.message shouldContain \"body did not match\"\n    }\n\n    @Test\n    fun `test invalid url parameter`() {\n        val err =\n            assertThrows<CommandError> {\n                testService(\n                    \"\"\"\n                    .uri(\"/?Hi=INCORRECT&required\")\n                    .header(\"X-Greeting\", \"Hi\")\n                    .method(\"POST\")\n                    \"\"\",\n                )\n            }\n        // Verify the test actually ran\n        err.message shouldContain \"say_hello_request ... FAILED\"\n        err.message shouldContain \"missing query param\"\n    }\n\n    @Test\n    fun `test forbidden url parameter`() {\n        val err =\n            assertThrows<CommandError> {\n                testService(\n                    \"\"\"\n                    .uri(\"/?goodbye&Hi=Hello%20there&required\")\n                    .header(\"X-Greeting\", \"Hi\")\n                    .method(\"POST\")\n                    \"\"\",\n                )\n            }\n        // Verify the test actually ran\n        err.message shouldContain \"say_hello_request ... FAILED\"\n        err.message shouldContain \"forbidden query param\"\n    }\n\n    @Test\n    fun `test required url parameter`() {\n        // Hard coded implementation for this 1 test\n        val err =\n            assertThrows<CommandError> {\n                testService(\n                    \"\"\"\n                    .uri(\"/?Hi=Hello%20there\")\n                    .header(\"X-Greeting\", \"Hi\")\n                    .method(\"POST\")\n                    \"\"\",\n                )\n            }\n\n        // Verify the test actually ran\n        err.message shouldContain \"say_hello_request ... FAILED\"\n        err.message shouldContain \"required query param missing\"\n    }\n\n    @Test\n    fun `test invalid path`() {\n        val err =\n            assertThrows<CommandError> {\n                testService(\n                    \"\"\"\n                    .uri(\"/incorrect-path?required&Hi=Hello%20there\")\n                    .header(\"X-Greeting\", \"Hi\")\n                    .method(\"POST\")\n                    \"\"\",\n                )\n            }\n\n        // Verify the test actually ran\n        err.message shouldContain \"say_hello_request ... FAILED\"\n        err.message shouldContain \"path was incorrect\"\n    }\n\n    @Test\n    fun `invalid header`() {\n        val err =\n            assertThrows<CommandError> {\n                testService(\n                    \"\"\"\n                    .uri(\"/?Hi=Hello%20there&required\")\n                    // should be \"Hi\"\n                    .header(\"X-Greeting\", \"Hey\")\n                    .method(\"POST\")\n                    \"\"\",\n                )\n            }\n\n        err.message shouldContain \"say_hello_request ... FAILED\"\n        err.message shouldContain \"invalid header value\"\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/waiters/RustJmespathShapeTraversalGeneratorTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\npackage software.amazon.smithy.rust.codegen.client.smithy.generators.waiters\n\nimport io.kotest.matchers.string.shouldContain\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.fail\nimport software.amazon.smithy.jmespath.JmespathExpression\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientRustModule\nimport software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.replaceLifetimes\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlockTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\nimport software.amazon.smithy.rust.codegen.core.smithy.RustCrate\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.unitTest\nimport software.amazon.smithy.rust.codegen.core.util.dq\nimport software.amazon.smithy.rust.codegen.core.util.inputShape\nimport software.amazon.smithy.rust.codegen.core.util.lookup\nimport software.amazon.smithy.rust.codegen.core.util.outputShape\n\nclass RustJmespathShapeTraversalGeneratorTest {\n    private class TestCase(\n        private val codegenContext: ClientCodegenContext,\n        private val rustCrate: RustCrate,\n    ) {\n        private val model = codegenContext.model\n        private val symbolProvider = codegenContext.symbolProvider\n\n        private val inputShape =\n            model.lookup<OperationShape>(\"test#TestOperation\")\n                .inputShape(model)\n        private val outputShape =\n            model.lookup<OperationShape>(\"test#TestOperation\")\n                .outputShape(model)\n        val input = symbolProvider.toSymbol(inputShape)\n        val output = symbolProvider.toSymbol(outputShape)\n        val entityPrimitives = symbolProvider.toSymbol(model.lookup<StructureShape>(\"test#EntityPrimitives\"))\n        val entityLists = symbolProvider.toSymbol(model.lookup<StructureShape>(\"test#EntityLists\"))\n        val entityMaps = symbolProvider.toSymbol(model.lookup<StructureShape>(\"test#EntityMaps\"))\n        val enum = symbolProvider.toSymbol(model.lookup<Shape>(\"test#Enum\"))\n        val struct = symbolProvider.toSymbol(model.lookup<Shape>(\"test#Struct\"))\n        val subStruct = symbolProvider.toSymbol(model.lookup<Shape>(\"test#SubStruct\"))\n        val traversalContext = TraversalContext(retainOption = false)\n\n        val testInputDataFn: RuntimeType\n        val testOutputDataFn: RuntimeType\n\n        init {\n            testInputDataFn =\n                RuntimeType.forInlineFun(\"test_input_data\", ClientRustModule.root) {\n                    rustTemplate(\n                        \"\"\"\n                        ##[allow(dead_code)]\n                        fn test_input_data() -> #{Input} {\n                            #{Input}::builder()\n                                .name(\"foobaz\")\n                                .true_bool(true)\n                                .false_bool(false)\n                                .build()\n                                .unwrap()\n                        }\n                        \"\"\",\n                        \"Input\" to input,\n                    )\n                }\n\n            testOutputDataFn =\n                RuntimeType.forInlineFun(\"test_output_data\", ClientRustModule.root) {\n                    rustTemplate(\n                        \"\"\"\n                        ##[allow(dead_code)]\n                        fn test_output_data() -> #{Output} {\n                            let primitives = #{EntityPrimitives}::builder()\n                                .required_boolean(true)\n                                .required_string(\"required-test\")\n                                .boolean(true)\n                                .string(\"test\")\n                                .byte(1)\n                                .short(2)\n                                .integer(4)\n                                .long(8)\n                                .float(4.0)\n                                .double(8.0)\n                                .r##enum(#{Enum}::One)\n                                .int_enum(1)\n                                .build()\n                                .unwrap();\n                            #{Output}::builder()\n                                .primitives(primitives.clone())\n                                .lists(#{EntityLists}::builder()\n                                    .booleans(true)\n                                    .shorts(1).shorts(2)\n                                    .integers(3).integers(4)\n                                    .longs(5).longs(6)\n                                    .floats(7.0).floats(8.0)\n                                    .doubles(9.0).doubles(10.0)\n                                    .strings(\"one\").strings(\"two\")\n                                    .enums(#{Enum}::Two)\n                                    .int_enums(2)\n                                    .structs(#{Struct}::builder()\n                                        .required_integer(1)\n                                        .primitives(primitives.clone())\n                                        .strings(\"lists_structs1_strings1\")\n                                        .sub_structs(#{SubStruct}::builder().sub_struct_primitives(primitives.clone()).build())\n                                        .sub_structs(#{SubStruct}::builder().sub_struct_primitives(\n                                            #{EntityPrimitives}::builder()\n                                                .required_boolean(false)\n                                                .required_string(\"why\")\n                                                .build()\n                                                .unwrap())\n                                            .build())\n                                        .build()\n                                        .unwrap())\n                                    .structs(#{Struct}::builder()\n                                        .required_integer(2)\n                                        .integer(1)\n                                        .string(\"foo\")\n                                        .build()\n                                        .unwrap())\n                                    .build())\n                                .maps(#{EntityMaps}::builder()\n                                    .strings(\"foo\", \"foo_oo\")\n                                    .strings(\"bar\", \"bar_ar\")\n                                    .booleans(\"foo\", true)\n                                    .booleans(\"bar\", false)\n                                    .structs(\"foo\", #{Struct}::builder().required_integer(2).integer(5).strings(\"maps_foo_struct_strings1\").build().unwrap())\n                                    .structs(\"bar\", #{Struct}::builder().required_integer(3).primitives(primitives).integer(7).build().unwrap())\n                                    .build())\n                                .build()\n                        }\n                        \"\"\",\n                        \"Output\" to output,\n                        \"EntityPrimitives\" to entityPrimitives,\n                        \"EntityLists\" to entityLists,\n                        \"EntityMaps\" to entityMaps,\n                        \"Enum\" to enum,\n                        \"Struct\" to struct,\n                        \"SubStruct\" to subStruct,\n                    )\n                }\n        }\n\n        fun testCase(\n            testName: String,\n            expression: String,\n            assertions: RustWriter.() -> Unit,\n            inputData: RuntimeType = testInputDataFn,\n            outputData: RuntimeType = testOutputDataFn,\n            dualBinding: Boolean = false,\n        ) {\n            val generator = RustJmespathShapeTraversalGenerator(codegenContext)\n            val parsed = JmespathExpression.parse(expression)\n            val bindings =\n                when {\n                    dualBinding ->\n                        listOf(\n                            TraversalBinding.Named(\"input\", \"_input\", TraversedShape.from(model, inputShape)),\n                            TraversalBinding.Named(\"output\", \"_output\", TraversedShape.from(model, outputShape)),\n                        )\n\n                    else -> listOf(TraversalBinding.Global(\"_output\", TraversedShape.from(model, outputShape)))\n                }\n            val generated = generator.generate(parsed, bindings, traversalContext)\n            rustCrate.unitTest(testName) {\n                rust(\"// jmespath: $expression\")\n                rust(\"// jmespath parsed: $parsed\")\n                rustBlockTemplate(\n                    \"fn inner<'a>(_input: &'a #{Input}, _output: &'a #{Output}) -> #{Option}<#{Ret}>\",\n                    \"Input\" to input,\n                    \"Output\" to output,\n                    \"Ret\" to generated.outputType.replaceLifetimes(\"a\"),\n                    *preludeScope,\n                ) {\n                    generated.output(this)\n                    rustTemplate(\"#{Some}(${generated.identifier})\", *preludeScope)\n                }\n                rustTemplate(\"let (input, output) = (#{in}(), #{out}());\", \"in\" to inputData, \"out\" to outputData)\n                rust(\"\"\"println!(\"test data: {output:##?}\");\"\"\")\n                rust(\"\"\"println!(\"jmespath: {}\", ${expression.dq()});\"\"\")\n                rust(\"let result = inner(&input, &output);\")\n                rust(\"\"\"println!(\"result: {result:##?}\");\"\"\")\n                rust(\"let result = result.unwrap();\")\n                assertions()\n                // Unused variable suppression\n                rust(\"let _ = result;\")\n            }\n        }\n\n        fun invalid(\n            expression: String,\n            contains: String,\n            dualBinding: Boolean = false,\n        ) {\n            try {\n                val generator = RustJmespathShapeTraversalGenerator(codegenContext)\n                val parsed = JmespathExpression.parse(expression)\n                val bindings =\n                    when {\n                        dualBinding ->\n                            listOf(\n                                TraversalBinding.Named(\"input\", \"_input\", TraversedShape.from(model, inputShape)),\n                                TraversalBinding.Named(\"output\", \"_output\", TraversedShape.from(model, outputShape)),\n                            )\n\n                        else -> listOf(TraversalBinding.Global(\"_output\", TraversedShape.from(model, outputShape)))\n                    }\n                generator.generate(parsed, bindings, traversalContext).output(RustWriter.forModule(\"unsupported\"))\n                fail(\"expression '$expression' should have thrown InvalidJmesPathTraversalException\")\n            } catch (ex: InvalidJmesPathTraversalException) {\n                ex.message shouldContain contains\n            }\n        }\n\n        fun unsupported(\n            expression: String,\n            contains: String,\n        ) {\n            try {\n                val generator = RustJmespathShapeTraversalGenerator(codegenContext)\n                val parsed = JmespathExpression.parse(expression)\n                generator.generate(\n                    parsed,\n                    listOf(TraversalBinding.Global(\"_output\", TraversedShape.from(model, outputShape))),\n                    traversalContext,\n                ).output(RustWriter.forModule(\"unsupported\"))\n                fail(\"expression '$expression' should have thrown UnsupportedJmesPathException\")\n            } catch (ex: UnsupportedJmesPathException) {\n                ex.message shouldContain contains\n            }\n        }\n    }\n\n    private fun integrationTest(testCases: TestCase.() -> Unit) {\n        clientIntegrationTest(testModel()) { codegenContext, rustCrate ->\n            TestCase(codegenContext, rustCrate).testCases()\n        }\n    }\n\n    private fun simple(assertion: String): RustWriter.() -> Unit =\n        {\n            rust(assertion)\n        }\n\n    private val expectFalse = simple(\"assert_eq!(false, result);\")\n    private val expectTrue = simple(\"assert!(result);\")\n    private val itCompiles = simple(\"\")\n\n    @Test\n    fun all() =\n        integrationTest {\n            fieldExpressions()\n            subExpressions()\n            namedBindings()\n            flattenExpressions()\n            literalTypes()\n            functions()\n            comparisons()\n            objectProjections()\n            filterProjections()\n            booleanOperations()\n            multiSelectLists()\n            projectionFollowedByMultiSelectLists()\n            complexCombinationsOfFeatures()\n\n            unsupported(\"&('foo')\", \"Expression type expressions\")\n            unsupported(\"lists.integers[0]\", \"Index expressions\")\n            unsupported(\"\"\"{\"foo\": primitives, \"bar\": integer}\"\"\", \"Multi-select hash expressions\")\n            unsupported(\"lists.integers[0:2]\", \"Slice expressions\")\n        }\n\n    private fun TestCase.fieldExpressions() {\n        fun test(\n            expression: String,\n            assertions: RustWriter.() -> Unit,\n        ) = testCase(\"traverse_field_$expression\", expression, assertions)\n\n        test(\"primitives\") {\n            rust(\"assert!(std::ptr::eq(output.primitives.as_ref().unwrap(), result));\")\n            rust(\"\"\"assert_eq!(\"test\", result.string.as_deref().unwrap());\"\"\")\n        }\n        test(\"lists\") {\n            rust(\"assert!(std::ptr::eq(output.lists.as_ref().unwrap(), result));\")\n        }\n        test(\"maps\") {\n            rust(\"assert!(std::ptr::eq(output.maps.as_ref().unwrap(), result));\")\n        }\n\n        invalid(\"doesNotExist\", \"Member `doesNotExist` doesn't exist\")\n    }\n\n    private fun TestCase.subExpressions() {\n        fun test(\n            name: String,\n            expression: String,\n            assertions: RustWriter.() -> Unit,\n        ) = testCase(\"traverse_subexpression_$name\", expression, assertions)\n\n        test(\"boolean\", \"primitives.boolean\", expectTrue)\n        test(\"string\", \"primitives.string\", simple(\"assert_eq!(\\\"test\\\", result);\"))\n        test(\"byte\", \"primitives.byte\", simple(\"assert_eq!(1i8, *result);\"))\n        test(\"short\", \"primitives.short\", simple(\"assert_eq!(2i16, *result);\"))\n        test(\"integer\", \"primitives.integer\", simple(\"assert_eq!(4i32, *result);\"))\n        test(\"long\", \"primitives.long\", simple(\"assert_eq!(8i64, *result);\"))\n        test(\"float\", \"primitives.float\", simple(\"assert_eq!(4f32, *result);\"))\n        test(\"double\", \"primitives.double\", simple(\"assert_eq!(8f64, *result);\"))\n        test(\"enum\", \"primitives.enum\") {\n            rust(\"assert_eq!(#T::One, *result);\", enum)\n        }\n        test(\"int_enum\", \"primitives.intEnum\", simple(\"assert_eq!(1, *result);\"))\n\n        invalid(\"primitives.integer.foo\", \"Cannot look up fields in non-struct shapes\")\n\n        test(\"required_boolean\", \"primitives.requiredBoolean\", expectTrue)\n        test(\"required_string\", \"primitives.requiredString\", simple(\"assert_eq!(\\\"required-test\\\", result);\"))\n    }\n\n    private fun TestCase.namedBindings() {\n        fun test(\n            name: String,\n            expression: String,\n            assertions: RustWriter.() -> Unit,\n        ) = testCase(\"named_bindings_$name\", expression, assertions, dualBinding = true)\n\n        test(\"input_and_output_bool_true\", \"input.trueBool && output.primitives.boolean\", expectTrue)\n        test(\"input_and_output_bool_false\", \"input.falseBool && output.primitives.boolean\", expectFalse)\n\n        invalid(\n            \"input.doesNotExist && output.primitives.boolean\",\n            \"Member `doesNotExist` doesn't exist\",\n            dualBinding = true,\n        )\n    }\n\n    private fun TestCase.projectionFollowedByMultiSelectLists() {\n        fun test(\n            name: String,\n            expression: String,\n            assertions: RustWriter.() -> Unit,\n        ) = testCase(\"traverse_$name\", expression, assertions)\n\n        // Each struct in projection sets at least one of the selected fields, e.g. either `string` or `primitives.string` is `Some`.\n        test(\"wildcard_projection_followed_by_multiselectlists\", \"lists.structs[*].[string, primitives.string][]\") {\n            rust(\"\"\"assert_eq!(vec![\"test\", \"foo\"], result);\"\"\")\n        }\n\n        // The `primitives` field is `None` in structs obtained via `lists.structs[?string == 'foo']`\n        test(\"filter_projection_followed_by_multiselectlists_empty\", \"lists.structs[?string == 'foo'].[primitives.string, primitives.requiredString][]\") {\n            rust(\"assert!(result.is_empty());\")\n        }\n\n        // Unlike the previous, the `integer` field is set in a struct in the projection.\n        test(\"filter_projection_followed_by_multiselectlists\", \"lists.structs[?string == 'foo'].[integer, primitives.integer][]\") {\n            rust(\"assert_eq!(vec![&1], result);\")\n        }\n\n        test(\"object_projection_followed_by_multiselectlists\", \"maps.structs.*.[integer, primitives.integer][]\") {\n            rust(\"let mut result = result;\")\n            rust(\"result.sort();\")\n            rust(\"assert_eq!(vec![&4, &5, &7], result);\")\n        }\n    }\n\n    private fun TestCase.flattenExpressions() {\n        fun test(\n            name: String,\n            expression: String,\n            assertions: RustWriter.() -> Unit,\n        ) = testCase(\"traverse_flatten_$name\", expression, assertions)\n\n        test(\"shortcircuit\", \"lists.structs[]\") {\n            rust(\"assert!(std::ptr::eq(output.lists.as_ref().unwrap().structs.as_ref().unwrap(), result));\")\n        }\n        test(\"no_shortcircuit\", \"lists.structs[].primitives.string\") {\n            rust(\"assert_eq!(1, result.len());\")\n            rust(\"assert_eq!(\\\"test\\\", result[0]);\")\n        }\n        test(\"no_shortcircuit_continued\", \"lists.structs[].strings\") {\n            rust(\"assert_eq!(1, result.len());\")\n            rust(\"assert_eq!(\\\"lists_structs1_strings1\\\", result[0]);\")\n        }\n        test(\"nested_flattens\", \"lists.structs[].subStructs[].subStructPrimitives.string\") {\n            // it should compile\n        }\n\n        invalid(\"primitives.integer[]\", \"Left side of the flatten\")\n    }\n\n    private fun TestCase.literalTypes() {\n        fun test(\n            name: String,\n            expression: String,\n            assertions: RustWriter.() -> Unit,\n        ) = testCase(\"traverse_literal_$name\", expression, assertions)\n\n        test(\"bool\", \"`true`\", expectTrue)\n        test(\"int\", \"`0`\", simple(\"assert_eq!(0f64, *result);\"))\n        test(\"float\", \"`1.5`\", simple(\"assert_eq!(1.5f64, *result);\"))\n        test(\"string\", \"`\\\"foo\\\"`\", simple(\"assert_eq!(\\\"foo\\\", result);\"))\n\n        unsupported(\"`null`\", \"Literal nulls\")\n        unsupported(\"`{}`\", \"Literal expression '`{}`'\")\n        unsupported(\"`[]`\", \"Literal expression '`[]`'\")\n    }\n\n    private fun TestCase.functions() {\n        fun test(\n            name: String,\n            expression: String,\n            assertions: RustWriter.() -> Unit,\n        ) = testCase(\"traverse_fn_$name\", expression, assertions)\n\n        test(\"list_length\", \"length(lists.structs[])\", simple(\"assert_eq!(2, result);\"))\n        test(\"string_length\", \"length(primitives.string)\", simple(\"assert_eq!(4, result);\"))\n\n        test(\"string_contains_false\", \"contains(primitives.string, 'foo')\", expectFalse)\n        test(\"string_contains_true\", \"contains(primitives.string, 'st')\", expectTrue)\n\n        test(\"strings_contains_false\", \"contains(lists.strings, 'foo')\", expectFalse)\n        test(\"strings_contains_true\", \"contains(lists.strings, 'two')\", expectTrue)\n\n        test(\"bools_contains_false\", \"contains(lists.booleans, `false`)\", expectFalse)\n        test(\"bools_contains_true\", \"contains(lists.booleans, `true`)\", expectTrue)\n\n        test(\"i16s_contains_false\", \"contains(lists.shorts, `0`)\", expectFalse)\n        test(\"i16s_contains_true\", \"contains(lists.shorts, `1`)\", expectTrue)\n\n        test(\"i32s_contains_false\", \"contains(lists.integers, `0`)\", expectFalse)\n        test(\"i32s_contains_true\", \"contains(lists.integers, `3`)\", expectTrue)\n\n        test(\"i64s_contains_false\", \"contains(lists.longs, `0`)\", expectFalse)\n        test(\"i64s_contains_true\", \"contains(lists.longs, `5`)\", expectTrue)\n\n        test(\"f32s_contains_false\", \"contains(lists.floats, `0`)\", expectFalse)\n        test(\"f32s_contains_true\", \"contains(lists.floats, `7.0`)\", expectTrue)\n\n        test(\"f64s_contains_false\", \"contains(lists.doubles, `0`)\", expectFalse)\n        test(\"f64s_contains_true\", \"contains(lists.doubles, `9.0`)\", expectTrue)\n\n        test(\"enums_contains_false\", \"contains(lists.enums, 'one')\", expectFalse)\n        test(\"enums_contains_true\", \"contains(lists.enums, 'two')\", expectTrue)\n\n        test(\"intenums_contains_false\", \"contains(lists.intEnums, `1`)\", expectFalse)\n        test(\"intenums_contains_true\", \"contains(lists.intEnums, `2`)\", expectTrue)\n\n        test(\"stringlit_contains_stringlit_false\", \"contains('foo', 'o0')\", expectFalse)\n        test(\"stringlit_contains_stringlit_true\", \"contains('foo', 'oo')\", expectTrue)\n\n        test(\"strings_contains_string\", \"contains(lists.strings, primitives.string)\", expectFalse)\n        test(\"i32s_contains_i32\", \"contains(lists.integers, primitives.integer)\", expectTrue)\n        test(\"i32s_contains_i16\", \"contains(lists.integers, primitives.short)\", expectFalse)\n        test(\"f32s_contains_f32\", \"contains(lists.floats, primitives.float)\", expectFalse)\n\n        test(\n            \"keys_struct\", \"keys(maps)\",\n            simple(\n                \"assert_eq!(6, result.len());\" +\n                    \"assert!(result.contains(&\\\"booleans\\\".to_string()));\" +\n                    \"assert!(result.contains(&\\\"strings\\\".to_string()));\" +\n                    \"assert!(result.contains(&\\\"integers\\\".to_string()));\" +\n                    \"assert!(result.contains(&\\\"enums\\\".to_string()));\" +\n                    \"assert!(result.contains(&\\\"intEnums\\\".to_string()));\" +\n                    \"assert!(result.contains(&\\\"structs\\\".to_string()));\",\n            ),\n        )\n        test(\n            \"keys_map\", \"keys(maps.strings)\",\n            simple(\n                \"assert_eq!(2, result.len());\" +\n                    \"assert!(result.contains(&\\\"foo\\\".to_string()));\" +\n                    \"assert!(result.contains(&\\\"bar\\\".to_string()));\",\n            ),\n        )\n\n        invalid(\"length()\", \"Length function takes exactly one argument\")\n        invalid(\"length(primitives.integer)\", \"Argument to `length` function\")\n        invalid(\"contains('foo')\", \"Contains function takes exactly two arguments\")\n        invalid(\"contains(primitives.integer, 'foo')\", \"First argument to `contains`\")\n        invalid(\"keys()\", \"Keys function takes exactly one argument\")\n        invalid(\"keys(primitives.integer)\", \"Argument to `keys` function\")\n        unsupported(\"contains(lists.structs, `null`)\", \"Checking for null with `contains`\")\n        unsupported(\"contains(lists.structs, lists)\", \"Checking for anything other than\")\n        unsupported(\"abs(`-1`)\", \"The `abs` function is not supported\")\n        unsupported(\"contains(lists.floats, primitives.string)\", \"Comparison of &f32 with &::std::string::String\")\n    }\n\n    private fun TestCase.comparisons() {\n        fun test(\n            name: String,\n            expression: String,\n            assertions: RustWriter.() -> Unit,\n        ) = testCase(\"traverse_compare_$name\", expression, assertions)\n\n        test(\"eq_boollit_w_boollit\", \"`true` == `true`\", expectTrue)\n        test(\"neq_boollit_w_boollit\", \"`true` != `true`\", expectFalse)\n        test(\"boollit_w_boollit\", \"`true` != `true`\", expectFalse)\n        test(\"bool_w_boollit\", \"primitives.boolean != `true`\", expectFalse)\n        test(\"bool_w_bool\", \"primitives.boolean == primitives.boolean\", expectTrue)\n        test(\"eq_integerlit_w_integerlit\", \"`0` == `0`\", expectTrue)\n        test(\"neq_integerlit_w_integerlit\", \"`0` != `0`\", expectFalse)\n        test(\"lt_integerlit_w_integerlit_false\", \"`0` < `0`\", expectFalse)\n        test(\"lt_integerlit_w_integerlit_true\", \"`0` < `1`\", expectTrue)\n        test(\"integer_w_integerlit\", \"primitives.integer != `0`\", expectTrue)\n        test(\"integer_w_integer\", \"primitives.integer == primitives.integer\", expectTrue)\n        test(\"float_w_integer_true\", \"primitives.float == primitives.integer\", expectTrue)\n        test(\"integer_w_float_true\", \"primitives.integer == primitives.float\", expectTrue)\n        test(\"float_w_integer_false\", \"primitives.float != primitives.integer\", expectFalse)\n        test(\"integer_w_float_false\", \"primitives.integer != primitives.float\", expectFalse)\n        test(\"eq_stringlit_w_stringlit\", \"'foo' == 'foo'\", expectTrue)\n        test(\"neq_stringlit_w_stringlit\", \"'bar' != 'foo'\", expectTrue)\n        test(\"string_w_stringlit_false\", \"primitives.string == 'foo'\", expectFalse)\n        test(\"string_w_stringlit_true\", \"primitives.string == 'test'\", expectTrue)\n        test(\"string_w_string\", \"primitives.string == primitives.string\", expectTrue)\n        test(\"enum_w_stringlit_false\", \"primitives.enum == 'one'\", expectTrue)\n        test(\"enum_w_stringlit_true\", \"primitives.enum == 'two'\", expectFalse)\n        test(\"enum_w_string\", \"primitives.enum == primitives.string\", expectFalse)\n        test(\"fn_w_number\", \"length(lists.structs[]) > `0`\", expectTrue)\n\n        unsupported(\"'foo' == `1`\", \"Comparison of &str with &f64\")\n        unsupported(\"primitives.string == primitives.integer\", \"Comparison of &::std::string::String with &i32\")\n    }\n\n    private fun TestCase.objectProjections() {\n        fun test(\n            name: String,\n            expression: String,\n            assertions: RustWriter.() -> Unit,\n        ) = testCase(\"traverse_obj_projection_$name\", expression, assertions)\n\n        test(\"simple\", \"maps.booleans.*\") {\n            rust(\"assert_eq!(2, result.len());\")\n            // Order is non-deterministic because we're getting the values of a hash map\n            rust(\"assert_eq!(1, result.iter().filter(|&&&b| b == true).count());\")\n            rust(\"assert_eq!(1, result.iter().filter(|&&&b| b == false).count());\")\n        }\n        test(\"continued\", \"maps.structs.*.integer\") {\n            rust(\"let mut result = result;\")\n            rust(\"result.sort();\")\n            rust(\"assert_eq!(vec![&5, &7], result);\")\n        }\n        test(\"followed_by_optional_array\", \"maps.structs.*.strings\") {\n            rust(\"assert_eq!(vec![\\\"maps_foo_struct_strings1\\\"], result);\")\n        }\n        test(\"w_function\", \"length(maps.structs.*.strings) == `1`\", expectTrue)\n\n        // Derived from https://github.com/awslabs/aws-sdk-rust/blob/8848f51e58fead8d230a0c15f0434b2812825c38/aws-models/ses.json#L2985\n        test(\"followed_by_required_field\", \"maps.structs.*.requiredInteger\") {\n            rust(\"let mut result = result;\")\n            rust(\"result.sort();\")\n            rust(\"assert_eq!(vec![&2, &3], result);\")\n        }\n\n        unsupported(\"primitives.integer.*\", \"Object projection is only supported on map types\")\n        unsupported(\"lists.structs[?`true`].*\", \"Object projection cannot be done on computed maps\")\n    }\n\n    private fun TestCase.filterProjections() {\n        fun test(\n            name: String,\n            expression: String,\n            assertions: RustWriter.() -> Unit,\n        ) = testCase(\"traverse_filter_projection_$name\", expression, assertions)\n\n        test(\"boollit\", \"lists.structs[?`true`]\") {\n            rust(\"assert_eq!(2, result.len());\")\n        }\n        test(\"intcmp\", \"lists.structs[?primitives.integer > `0`]\") {\n            rust(\"assert_eq!(1, result.len());\")\n        }\n        test(\"boollit_continued_empty\", \"lists.structs[?`true`].integer\") {\n            rust(\"assert_eq!(1, result.len());\")\n        }\n        test(\"boollit_continued\", \"lists.structs[?`true`].primitives.integer\") {\n            rust(\"assert_eq!(1, result.len());\")\n        }\n        test(\"intcmp_continued\", \"lists.structs[?primitives.integer > `0`].primitives.integer\") {\n            rust(\"assert_eq!(1, result.len());\")\n            rust(\"assert_eq!(4, **result.get(0).unwrap());\")\n        }\n        test(\"intcmp_continued_filtered\", \"lists.structs[?primitives.integer == `0`].primitives.integer\") {\n            rust(\"assert_eq!(0, result.len());\")\n        }\n\n        unsupported(\"primitives.integer[?`true`]\", \"Filter projections can only be done on lists\")\n        invalid(\"lists.structs[?`5`]\", \"The filter expression comparison must result in a bool\")\n    }\n\n    private fun TestCase.booleanOperations() {\n        fun test(\n            name: String,\n            expression: String,\n            assertions: RustWriter.() -> Unit,\n        ) = testCase(\"traverse_boolean_ops_$name\", expression, assertions)\n\n        test(\"lit_not\", \"!`true`\", expectFalse)\n        test(\"bool_not\", \"!(primitives.boolean)\", expectFalse)\n        test(\"lit_and_lit\", \"`true` && `false`\", expectFalse)\n        test(\"lit_or_lit\", \"`true` || `false`\", expectTrue)\n        test(\"bool_and_lit\", \"primitives.boolean && `true`\", expectTrue)\n        test(\"bool_or_lit\", \"primitives.boolean || `false`\", expectTrue)\n        test(\"bool_and_bool\", \"primitives.boolean && primitives.boolean\", expectTrue)\n        test(\"bool_or_bool\", \"primitives.boolean || primitives.boolean\", expectTrue)\n        test(\"paren_expressions\", \"(`true` || `false`) && `true`\", expectTrue)\n\n        // Truthiness coercion: non-boolean types in && and ||\n        test(\"list_and_bool\", \"lists.integers && `true`\", expectTrue)\n        test(\"string_and_bool\", \"primitives.string && `true`\", expectTrue)\n        test(\"number_and_bool\", \"primitives.integer && `true`\", expectTrue)\n        test(\"number_or_bool\", \"`5` || `true`\", expectTrue)\n        test(\"number_and_bool_lit\", \"`5` && `true`\", expectTrue)\n        // ECS-like pattern: list && length(list) == N\n        test(\"list_and_length_eq\", \"lists.integers && length(lists.integers) == `2`\", expectTrue)\n\n        unsupported(\"!`5`\", \"Negation of a non-boolean type\")\n    }\n\n    private fun TestCase.multiSelectLists() {\n        fun test(\n            name: String,\n            expression: String,\n            assertions: RustWriter.() -> Unit,\n        ) = testCase(\"traverse_multiselectlists_$name\", expression, assertions)\n\n        test(\"intlist_contains\", \"contains([`1`, `2`, `3`], `1`)\", expectTrue)\n        test(\"stringlist_contains\", \"contains(['foo', 'bar'], 'foo')\", expectTrue)\n        test(\"primitive_int_list_contains\", \"contains(primitives.[integer, integer], primitives.integer)\", expectTrue)\n        test(\"primitive_bools\", \"primitives.[boolean, boolean]\") {\n            rust(\"assert_eq!(2, result.len());\")\n            rust(\"assert!(*result[0]);\")\n            rust(\"assert!(*result[1]);\")\n        }\n        test(\"primitive_strings_contain\", \"contains(primitives.[string, string], primitives.string)\", expectTrue)\n    }\n\n    private fun TestCase.complexCombinationsOfFeatures() {\n        fun test(\n            name: String,\n            expression: String,\n            assertions: RustWriter.() -> Unit,\n        ) = testCase(\"traverse_complex_combos_$name\", expression, assertions)\n\n        test(\n            \"1\",\n            \"(length(lists.structs[?!(integer < `0`) && integer >= `0` || `false`]) == `5`) == contains(lists.integers, length(maps.structs.*.strings))\",\n            itCompiles,\n        )\n\n        // Derived from https://github.com/awslabs/aws-sdk-rust/blob/8848f51e58fead8d230a0c15f0434b2812825c38/aws-models/auto-scaling.json#L4202\n        // The first argument to `contains` evaluates to `Some([true])` since `length(...)` is 1 and `requiredInteger` in that struct is 1.\n        test(\n            \"2\",\n            \"contains(lists.structs[].[length(subStructs[?subStructPrimitives.requiredString=='why']) >= requiredInteger][], `true`)\",\n            expectTrue,\n        )\n    }\n\n    private fun testModel() =\n        \"\"\"\n        ${'$'}version: \"2\"\n        namespace test\n\n        @aws.protocols#awsJson1_0\n        service TestService {\n            operations: [TestOperation],\n        }\n\n        operation TestOperation {\n            input: GetEntityRequest,\n            output: GetEntityResponse,\n            errors: [],\n        }\n\n        structure GetEntityRequest {\n            @required\n            name: String\n            trueBool: Boolean\n            falseBool: Boolean\n        }\n\n        structure GetEntityResponse {\n            primitives: EntityPrimitives,\n            lists: EntityLists,\n            maps: EntityMaps,\n        }\n\n        structure EntityPrimitives {\n            boolean: Boolean,\n            string: String,\n            byte: Byte,\n            short: Short,\n            integer: Integer,\n            long: Long,\n            float: Float,\n            double: Double,\n            enum: Enum,\n            intEnum: IntEnum,\n\n            @required requiredBoolean: Boolean,\n            @required requiredString: String,\n        }\n\n        structure EntityLists {\n            booleans: BooleanList,\n            strings: StringList,\n            shorts: ShortList\n            integers: IntegerList,\n            longs: LongList\n            floats: FloatList,\n            doubles: DoubleList,\n            enums: EnumList,\n            intEnums: IntEnumList,\n            structs: StructList,\n        }\n\n        structure EntityMaps {\n            booleans: BooleanMap,\n            strings: StringMap,\n            integers: IntegerMap,\n            enums: EnumMap,\n            intEnums: IntEnumMap,\n            structs: StructMap,\n        }\n\n        enum Enum {\n            ONE = \"one\",\n            TWO = \"two\",\n        }\n\n        intEnum IntEnum {\n            ONE = 1,\n            TWO = 2,\n        }\n\n        structure Struct {\n            @required\n            requiredInteger: Integer,\n            primitives: EntityPrimitives,\n            strings: StringList,\n            integer: Integer,\n            string: String,\n            enums: EnumList,\n            subStructs: SubStructList,\n        }\n\n        structure SubStruct {\n            subStructPrimitives: EntityPrimitives,\n        }\n\n        list BooleanList { member: Boolean }\n        list StringList { member: String }\n        list ShortList { member: Short }\n        list IntegerList { member: Integer }\n        list LongList { member: Long }\n        list FloatList { member: Float }\n        list DoubleList { member: Double }\n        list EnumList { member: Enum }\n        list IntEnumList { member: IntEnum }\n        list StructList { member: Struct }\n        list SubStructList { member: SubStruct }\n        map BooleanMap { key: String, value: Boolean }\n        map StringMap { key: String, value: String }\n        map IntegerMap { key: String, value: Integer }\n        map EnumMap { key: String, value: Enum }\n        map IntEnumMap { key: String, value: IntEnum }\n        map StructMap { key: String, value: Struct }\n        \"\"\".asSmithyModel()\n}\n"
  },
  {
    "path": "codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/generators/waiters/RustWaiterMatcherGeneratorTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\npackage software.amazon.smithy.rust.codegen.client.smithy.generators.waiters\n\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.model.node.Node\nimport software.amazon.smithy.model.shapes.EnumShape\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\nimport software.amazon.smithy.rust.codegen.core.smithy.RustCrate\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.util.dq\nimport software.amazon.smithy.rust.codegen.core.util.inputShape\nimport software.amazon.smithy.rust.codegen.core.util.lookup\nimport software.amazon.smithy.rust.codegen.core.util.outputShape\nimport software.amazon.smithy.waiters.Matcher.SuccessMember\n\nprivate typealias Scope = Array<Pair<String, Any>>\n\nclass RustWaiterMatcherGeneratorTest {\n    class TestCase(\n        codegenContext: ClientCodegenContext,\n        private val rustCrate: RustCrate,\n        matcherJson: String,\n    ) {\n        val operationShape = codegenContext.model.lookup<OperationShape>(\"test#TestOperation\")\n        val inputShape = operationShape.inputShape(codegenContext.model)\n        val outputShape = operationShape.outputShape(codegenContext.model)\n        val errorShape = codegenContext.model.lookup<StructureShape>(\"test#SomeError\")\n        val inputSymbol = codegenContext.symbolProvider.toSymbol(inputShape)\n        val outputSymbol = codegenContext.symbolProvider.toSymbol(outputShape)\n        val errorSymbol = codegenContext.symbolProvider.toSymbol(errorShape)\n\n        val matcher = SuccessMember.fromNode(Node.parse(matcherJson))\n        val matcherFn =\n            RustWaiterMatcherGenerator(codegenContext, \"TestOperation\", inputShape, outputShape)\n                .generate(errorSymbol, matcher)\n\n        val scope =\n            arrayOf(\n                *preludeScope,\n                \"Input\" to inputSymbol,\n                \"Output\" to outputSymbol,\n                \"Error\" to errorSymbol,\n                \"ErrorMetadata\" to RuntimeType.errorMetadata(codegenContext.runtimeConfig),\n                \"SomeEnum\" to codegenContext.symbolProvider.toSymbol(codegenContext.model.lookup<EnumShape>(\"test#SomeEnum\")),\n                \"matcher_fn\" to matcherFn,\n            )\n\n        fun renderTest(\n            name: String,\n            writeTest: TestCase.() -> Writable,\n        ) {\n            rustCrate.lib {\n                rustTemplate(\n                    \"\"\"\n                    /// Make the unit test public and document it so that compiler\n                    /// doesn't complain about dead code.\n                    pub fn ${name}_test_case() {\n                        #{test}\n                    }\n                    ##[cfg(test)]\n                    ##[test]\n                    fn $name() {\n                        ${name}_test_case();\n                    }\n                    \"\"\",\n                    *scope,\n                    \"test\" to writeTest(),\n                )\n            }\n        }\n    }\n\n    @Test\n    fun tests() {\n        clientIntegrationTest(testModel()) { codegenContext, rustCrate ->\n            successMatcher(codegenContext, rustCrate)\n            errorMatcher(codegenContext, rustCrate)\n            outputPathMatcher(codegenContext, rustCrate)\n            inputOutputPathMatcher(codegenContext, rustCrate)\n        }\n    }\n\n    private fun testCase(\n        codegenContext: ClientCodegenContext,\n        rustCrate: RustCrate,\n        name: String,\n        matcherJson: String,\n        writeFn: RustWriter.(Scope) -> Unit,\n    ) {\n        TestCase(codegenContext, rustCrate, matcherJson).renderTest(name) {\n            writable {\n                writeFn(scope)\n            }\n        }\n    }\n\n    private fun successMatcher(\n        codegenContext: ClientCodegenContext,\n        rustCrate: RustCrate,\n    ) = testCase(\n        codegenContext,\n        rustCrate,\n        name = \"success_matcher\",\n        matcherJson = \"\"\"{\"success\":true}\"\"\",\n    ) { scope ->\n        rustTemplate(\n            \"\"\"\n            let result = #{Ok}(#{Output}::builder().some_string(\"bar\").build());\n            assert!(#{matcher_fn}(result.as_ref()));\n\n            let result = #{Err}(#{Error}::builder().message(\"asdf\").build());\n            assert!(!#{matcher_fn}(result.as_ref()));\n            \"\"\",\n            *scope,\n        )\n    }\n\n    private fun errorMatcher(\n        codegenContext: ClientCodegenContext,\n        rustCrate: RustCrate,\n    ) = testCase(\n        codegenContext,\n        rustCrate,\n        name = \"error_matcher\",\n        matcherJson = \"\"\"{\"errorType\":\"SomeError\"}\"\"\",\n    ) { scope ->\n        rustTemplate(\n            \"\"\"\n            let result = #{Ok}(#{Output}::builder().some_string(\"bar\").build());\n            assert!(!#{matcher_fn}(result.as_ref()));\n\n            let result = #{Err}(\n                #{Error}::builder()\n                    .message(\"asdf\")\n                    .meta(#{ErrorMetadata}::builder().code(\"SomeOtherError\").build())\n                    .build()\n            );\n            assert!(!#{matcher_fn}(result.as_ref()));\n\n            let result = #{Err}(\n                #{Error}::builder()\n                    .message(\"asdf\")\n                    .meta(#{ErrorMetadata}::builder().code(\"SomeError\").build())\n                    .build()\n            );\n            assert!(#{matcher_fn}(result.as_ref()));\n            \"\"\",\n            *scope,\n        )\n    }\n\n    private fun outputPathMatcher(\n        codegenContext: ClientCodegenContext,\n        rustCrate: RustCrate,\n    ) {\n        fun test(\n            name: String,\n            matcherJson: String,\n            writeFn: RustWriter.(Scope) -> Unit,\n        ) = testCase(codegenContext, rustCrate, name, matcherJson, writeFn)\n\n        fun matcherJson(\n            path: String,\n            expected: String,\n            comparator: String,\n        ) = \"\"\"{\"output\":{\"path\":${path.dq()}, \"expected\":${expected.dq()}, \"comparator\": ${comparator.dq()}}}\"\"\"\n\n        test(\n            \"output_path_matcher_string_equals\",\n            matcherJson(\n                path = \"someString\",\n                expected = \"expected-value\",\n                comparator = \"stringEquals\",\n            ),\n        ) { scope ->\n            rustTemplate(\n                \"\"\"\n                let result = #{Ok}(#{Output}::builder().some_string(\"bar\").build());\n                assert!(!#{matcher_fn}(result.as_ref()));\n\n                let result = #{Ok}(#{Output}::builder().some_string(\"expected-value\").build());\n                assert!(#{matcher_fn}(result.as_ref()));\n                \"\"\",\n                *scope,\n            )\n        }\n\n        test(\n            \"output_path_matcher_bool_equals\",\n            matcherJson(\n                path = \"someBool\",\n                expected = \"true\",\n                comparator = \"booleanEquals\",\n            ),\n        ) { scope ->\n            rustTemplate(\n                \"\"\"\n                let result = #{Ok}(#{Output}::builder().some_bool(false).build());\n                assert!(!#{matcher_fn}(result.as_ref()));\n\n                let result = #{Ok}(#{Output}::builder().some_bool(true).build());\n                assert!(#{matcher_fn}(result.as_ref()));\n                \"\"\",\n                *scope,\n            )\n        }\n\n        test(\n            \"output_path_matcher_all_string_equals\",\n            matcherJson(\n                path = \"someList\",\n                expected = \"foo\",\n                comparator = \"allStringEquals\",\n            ),\n        ) { scope ->\n            rustTemplate(\n                \"\"\"\n                let result = #{Ok}(#{Output}::builder()\n                    .some_list(\"foo\")\n                    .some_list(\"bar\")\n                    .build());\n                assert!(!#{matcher_fn}(result.as_ref()));\n\n                let result = #{Ok}(#{Output}::builder()\n                    .some_list(\"foo\")\n                    .some_list(\"foo\")\n                    .build());\n                assert!(#{matcher_fn}(result.as_ref()));\n                \"\"\",\n                *scope,\n            )\n        }\n\n        test(\n            \"output_path_matcher_any_string_equals\",\n            matcherJson(\n                path = \"someList\",\n                expected = \"foo\",\n                comparator = \"anyStringEquals\",\n            ),\n        ) { scope ->\n            rustTemplate(\n                \"\"\"\n                let result = #{Ok}(#{Output}::builder()\n                    .some_list(\"bar\")\n                    .build());\n                assert!(!#{matcher_fn}(result.as_ref()));\n\n                let result = #{Ok}(#{Output}::builder()\n                    .some_list(\"bar\")\n                    .some_list(\"foo\")\n                    .build());\n                assert!(#{matcher_fn}(result.as_ref()));\n                \"\"\",\n                *scope,\n            )\n        }\n\n        test(\n            \"output_path_matcher_any_string_equals_enum\",\n            matcherJson(\n                path = \"someEnumList\",\n                expected = \"Foo\",\n                comparator = \"anyStringEquals\",\n            ),\n        ) { scope ->\n            rustTemplate(\n                \"\"\"\n                let result = #{Ok}(#{Output}::builder()\n                    .some_enum_list(#{SomeEnum}::Bar)\n                    .build());\n                assert!(!#{matcher_fn}(result.as_ref()));\n\n                let result = #{Ok}(#{Output}::builder()\n                    .some_enum_list(#{SomeEnum}::Bar)\n                    .some_enum_list(#{SomeEnum}::Foo)\n                    .build());\n                assert!(#{matcher_fn}(result.as_ref()));\n                \"\"\",\n                *scope,\n            )\n        }\n    }\n\n    private fun inputOutputPathMatcher(\n        codegenContext: ClientCodegenContext,\n        rustCrate: RustCrate,\n    ) {\n        fun test(\n            name: String,\n            matcherJson: String,\n            writeFn: RustWriter.(Scope) -> Unit,\n        ) = testCase(codegenContext, rustCrate, name, matcherJson, writeFn)\n\n        fun matcherJson(\n            path: String,\n            expected: String,\n            comparator: String,\n        ) = \"\"\"{\"inputOutput\":{\"path\":${path.dq()}, \"expected\":${expected.dq()}, \"comparator\": ${comparator.dq()}}}\"\"\"\n\n        test(\n            \"input_output_path_matcher_boolean_equals\",\n            matcherJson(\n                path = \"input.foo == 'foo' && output.someString == 'bar'\",\n                expected = \"true\",\n                comparator = \"booleanEquals\",\n            ),\n        ) { scope ->\n            rustTemplate(\n                \"\"\"\n                let input = #{Input}::builder().foo(\"foo\").build().unwrap();\n                let result = #{Ok}(#{Output}::builder().some_string(\"bar\").build());\n                assert!(#{matcher_fn}(&input, result.as_ref()));\n\n                let input = #{Input}::builder().foo(\"asdf\").build().unwrap();\n                assert!(!#{matcher_fn}(&input, result.as_ref()));\n                \"\"\",\n                *scope,\n            )\n        }\n    }\n\n    private fun testModel() =\n        \"\"\"\n        ${'$'}version: \"2\"\n        namespace test\n\n        @aws.protocols#awsJson1_0\n        service TestService {\n            operations: [TestOperation],\n        }\n\n        operation TestOperation {\n            input: GetEntityRequest,\n            output: GetEntityResponse,\n            errors: [SomeError],\n        }\n\n        @error(\"server\")\n        structure SomeError {\n            message: String,\n        }\n\n        structure GetEntityRequest {\n            foo: String,\n        }\n\n        structure GetEntityResponse {\n            someString: String,\n            someBool: Boolean,\n            someList: SomeList,\n            someEnumList: SomeEnumList,\n        }\n\n        list SomeList {\n            member: String\n        }\n\n        enum SomeEnum {\n            Foo,\n            Bar,\n        }\n        list SomeEnumList {\n            member: SomeEnum,\n        }\n        \"\"\".asSmithyModel()\n}\n"
  },
  {
    "path": "codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/protocols/AwsQueryCompatibleTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.protocols\n\nimport com.fasterxml.jackson.databind.ObjectMapper\nimport com.fasterxml.jackson.dataformat.cbor.CBORFactory\nimport org.junit.jupiter.api.extension.ExtensionContext\nimport org.junit.jupiter.params.ParameterizedTest\nimport org.junit.jupiter.params.provider.Arguments\nimport org.junit.jupiter.params.provider.ArgumentsProvider\nimport org.junit.jupiter.params.provider.ArgumentsSource\nimport software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.testModule\nimport software.amazon.smithy.rust.codegen.core.testutil.tokioTest\nimport software.amazon.smithy.rust.codegen.core.util.letIf\nimport java.util.stream.Stream\n\ndata class AwsQueryCompatibleTestInput(\n    val protocolAnnotation: String,\n    val payload: Writable,\n)\n\nclass AwsQueryCompatibleTestInputProvider : ArgumentsProvider {\n    private fun jsonStringToBytesArrayString(jsonString: String): String {\n        val jsonMapper = ObjectMapper()\n        val cborMapper = ObjectMapper(CBORFactory())\n        // Parse JSON string to a generic type.\n        val jsonData = jsonMapper.readValue(jsonString, Any::class.java)\n        // Convert the parsed data to CBOR.\n        val bytes = cborMapper.writeValueAsBytes(jsonData)\n        return bytes\n            .joinToString(\n                prefix = \"&[\",\n                postfix = \"]\",\n                transform = { \"0x${it.toUByte().toString(16).padStart(2, '0')}u8\" },\n            )\n    }\n\n    override fun provideArguments(context: ExtensionContext?): Stream<out Arguments> =\n        listOf(\n            AwsQueryCompatibleTestInput(\n                \"@awsJson1_0\",\n                writable {\n                    rust(\n                        \"\"\"\n                        r##\"{\n                            \"__type\": \"com.amazonaws.sqs##QueueDoesNotExist\",\n                            \"message\": \"Some user-visible message\"\n                        }\"##\n                        \"\"\",\n                    )\n                },\n            ),\n            AwsQueryCompatibleTestInput(\n                \"@rpcv2Cbor\",\n                writable {\n                    val bytesArray =\n                        jsonStringToBytesArrayString(\n                            \"\"\"\n                            {\n                                \"__type\": \"com.amazonaws.sqs#QueueDoesNotExist\",\n                                \"message\": \"Some user-visible message\"\n                            }\n                            \"\"\",\n                        )\n                    rust(\"#T::from_static($bytesArray)\", RuntimeType.Bytes)\n                },\n            ),\n        ).map { Arguments.of(it) }.stream()\n}\n\nclass AwsQueryCompatibleTest {\n    companion object {\n        const val prologue = \"\"\"\n            namespace test\n            use smithy.protocols#rpcv2Cbor\n            use aws.protocols#awsJson1_0\n            use aws.protocols#awsQueryCompatible\n            use aws.protocols#awsQueryError\n        \"\"\"\n        const val awsQueryCompatibleTrait = \"@awsQueryCompatible\"\n\n        fun testService(withAwsQueryError: Boolean = true) =\n            \"\"\"\n            service TestService {\n                version: \"2023-02-20\",\n                operations: [SomeOperation]\n            }\n\n            operation SomeOperation {\n                input: SomeOperationInputOutput,\n                output: SomeOperationInputOutput,\n                errors: [InvalidThingException],\n            }\n\n            structure SomeOperationInputOutput {\n                a: String,\n                b: Integer\n            }\n            \"\"\".letIf(withAwsQueryError) {\n                it +\n                    \"\"\"\n                    @awsQueryError(\n                        code: \"InvalidThing\",\n                        httpResponseCode: 400,\n                    )\n                    \"\"\"\n            }.let {\n                it +\n                    \"\"\"\n                    @error(\"client\")\n                    structure InvalidThingException {\n                            message: String\n                    }\n                    \"\"\"\n            }\n    }\n\n    @ParameterizedTest\n    @ArgumentsSource(AwsQueryCompatibleTestInputProvider::class)\n    fun `aws-query-compatible json with aws query error should allow for retrieving error code and type from custom header`(\n        testInput: AwsQueryCompatibleTestInput,\n    ) {\n        val model =\n            (prologue + awsQueryCompatibleTrait + testInput.protocolAnnotation + testService()).asSmithyModel(\n                smithyVersion = \"2\",\n            )\n        clientIntegrationTest(model) { context, rustCrate ->\n            rustCrate.testModule {\n                tokioTest(\"should_parse_code_and_type_fields\") {\n                    rustTemplate(\n                        \"\"\"\n                        let response = |_: #{http_1x}::Request<#{SdkBody}>| {\n                            #{http_1x}::Response::builder()\n                                .header(\n                                    \"x-amzn-query-error\",\n                                    #{http_1x}::HeaderValue::from_static(\"AWS.SimpleQueueService.NonExistentQueue;Sender\"),\n                                )\n                                .status(400)\n                                .body(\n                                    #{SdkBody}::from(#{payload:W})\n                                )\n                                .unwrap()\n                        };\n                        let client = crate::Client::from_conf(\n                            crate::Config::builder()\n                                .http_client(#{infallible_client_fn}(response))\n                                .endpoint_url(\"http://localhost:1234\")\n                                .build()\n                        );\n                        let error = dbg!(client.some_operation().send().await).err().unwrap().into_service_error();\n                        assert_eq!(\n                            #{Some}(\"AWS.SimpleQueueService.NonExistentQueue\"),\n                            error.meta().code(),\n                        );\n                        assert_eq!(#{Some}(\"Sender\"), error.meta().extra(\"type\"));\n                        \"\"\",\n                        *RuntimeType.preludeScope,\n                        \"payload\" to testInput.payload,\n                        \"SdkBody\" to RuntimeType.sdkBody(context.runtimeConfig),\n                        \"infallible_client_fn\" to\n                            CargoDependency.smithyHttpClientTestUtil(context.runtimeConfig)\n                                .toType().resolve(\"test_util::infallible_client_fn\"),\n                        \"http_1x\" to CargoDependency.Http1x.toType(),\n                    )\n                }\n            }\n        }\n    }\n\n    @ParameterizedTest\n    @ArgumentsSource(AwsQueryCompatibleTestInputProvider::class)\n    fun `aws-query-compatible json without aws query error should allow for retrieving error code from payload`(\n        testInput: AwsQueryCompatibleTestInput,\n    ) {\n        val model =\n            (prologue + awsQueryCompatibleTrait + testInput.protocolAnnotation + testService(withAwsQueryError = false)).asSmithyModel(\n                smithyVersion = \"2\",\n            )\n        clientIntegrationTest(model) { context, rustCrate ->\n            rustCrate.testModule {\n                tokioTest(\"should_parse_code_from_payload\") {\n                    rustTemplate(\n                        \"\"\"\n                        let response = |_: #{http_1x}::Request<#{SdkBody}>| {\n                            #{http_1x}::Response::builder()\n                                .status(400)\n                                .body(\n                                    #{SdkBody}::from(#{payload:W})\n                                )\n                                .unwrap()\n                        };\n                        let client = crate::Client::from_conf(\n                            crate::Config::builder()\n                                .http_client(#{infallible_client_fn}(response))\n                                .endpoint_url(\"http://localhost:1234\")\n                                .build()\n                        );\n                        let error = dbg!(client.some_operation().send().await).err().unwrap().into_service_error();\n                        assert_eq!(#{Some}(\"QueueDoesNotExist\"), error.meta().code());\n                        assert_eq!(#{None}, error.meta().extra(\"type\"));\n                        \"\"\",\n                        *RuntimeType.preludeScope,\n                        \"SdkBody\" to RuntimeType.sdkBody(context.runtimeConfig),\n                        \"payload\" to testInput.payload,\n                        \"infallible_client_fn\" to\n                            CargoDependency.smithyHttpClientTestUtil(context.runtimeConfig)\n                                .toType().resolve(\"test_util::infallible_client_fn\"),\n                        \"http_1x\" to CargoDependency.Http1x.toType(),\n                    )\n                }\n            }\n        }\n    }\n\n    @ParameterizedTest\n    @ArgumentsSource(AwsQueryCompatibleTestInputProvider::class)\n    fun `request header should include x-amzn-query-mode when the service has the awsQueryCompatible trait`(\n        testInput: AwsQueryCompatibleTestInput,\n    ) {\n        val model =\n            (prologue + awsQueryCompatibleTrait + testInput.protocolAnnotation + testService()).asSmithyModel(\n                smithyVersion = \"2\",\n            )\n        clientIntegrationTest(model) { context, rustCrate ->\n            rustCrate.testModule {\n                tokioTest(\"test_request_header_should_include_x_amzn_query_mode\") {\n                    rustTemplate(\n                        \"\"\"\n                        let (http_client, rx) = #{capture_request}(#{None});\n                        let config = crate::Config::builder()\n                            .http_client(http_client)\n                            .endpoint_url(\"http://localhost:1234/SomeOperation\")\n                            .build();\n                        let client = crate::Client::from_conf(config);\n                        let _ = dbg!(client.some_operation().send().await);\n                        let request = rx.expect_request();\n                        assert_eq!(\"true\", request.headers().get(\"x-amzn-query-mode\").unwrap());\n                        \"\"\",\n                        *RuntimeType.preludeScope,\n                        \"capture_request\" to RuntimeType.captureRequest(context.runtimeConfig),\n                    )\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/protocols/AwsQueryTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.protocols\n\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\n\nclass AwsQueryTest {\n    private val model =\n        \"\"\"\n        namespace test\n        use aws.protocols#awsQuery\n\n        @awsQuery\n        @xmlNamespace(uri: \"https://example.com/\")\n        service TestService {\n            version: \"2019-12-16\",\n            operations: [SomeOperation]\n        }\n\n        operation SomeOperation {\n            input: SomeOperationInputOutput,\n            output: SomeOperationInputOutput,\n        }\n\n        structure SomeOperationInputOutput {\n            payload: String,\n            a: String,\n            b: Integer\n        }\n        \"\"\".asSmithyModel()\n\n    private val inputUnionWithEmptyStructure =\n        \"\"\"\n        namespace test\n        use aws.protocols#awsQuery\n\n        @awsQuery\n        @xmlNamespace(uri: \"https://example.com/\")\n        service TestService {\n            version: \"2019-12-16\",\n            operations: [TestOp]\n        }\n\n        operation TestOp {\n            input: TestInput\n        }\n\n        structure TestInput {\n            testUnion: TestUnion\n        }\n\n        union TestUnion {\n            // Empty struct - should generate _inner to avoid unused variable warning\n            emptyStruct: EmptyStruct,\n\n            // Normal struct - should generate inner (without underscore)\n            normalStruct: NormalStruct\n        }\n\n        structure EmptyStruct {}\n\n        structure NormalStruct {\n            value: String\n        }\n        \"\"\".asSmithyModel()\n\n    @Test\n    fun `generate an aws query service that compiles`() {\n        clientIntegrationTest(model) { _, _ -> }\n    }\n\n    @Test\n    fun `union with empty struct generates warning-free code`() {\n        // This test will fail with unused variable warnings if the fix is not applied\n        // clientIntegrationTest enforces -D warnings via codegenIntegrationTest\n        clientIntegrationTest(inputUnionWithEmptyStructure) { _, _ -> }\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/protocols/ClientProtocolLoaderTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.protocols\n\nimport org.junit.jupiter.api.Assertions.assertEquals\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.assertThrows\nimport org.junit.jupiter.api.extension.ExtensionContext\nimport org.junit.jupiter.params.ParameterizedTest\nimport org.junit.jupiter.params.provider.Arguments\nimport org.junit.jupiter.params.provider.ArgumentsProvider\nimport org.junit.jupiter.params.provider.ArgumentsSource\nimport software.amazon.smithy.aws.traits.protocols.AwsJson1_0Trait\nimport software.amazon.smithy.aws.traits.protocols.AwsJson1_1Trait\nimport software.amazon.smithy.aws.traits.protocols.AwsQueryTrait\nimport software.amazon.smithy.aws.traits.protocols.Ec2QueryTrait\nimport software.amazon.smithy.aws.traits.protocols.RestJson1Trait\nimport software.amazon.smithy.aws.traits.protocols.RestXmlTrait\nimport software.amazon.smithy.codegen.core.CodegenException\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.ServiceShape\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.protocol.traits.Rpcv2CborTrait\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.generators.OperationGenerator\nimport software.amazon.smithy.rust.codegen.client.smithy.protocols.ClientProtocolLoader.Companion.DefaultProtocols\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.ProtocolMap\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport java.util.stream.Stream\n\ndata class TestCase(\n    val supportedProtocols: ProtocolMap<OperationGenerator, ClientCodegenContext>,\n    val model: Model,\n    val resolvedProtocol: String?,\n)\n\nclass ClientProtocolLoaderTest {\n    @Test\n    fun `test priority order of default supported protocols`() {\n        val expectedOrder =\n            listOf(\n                Rpcv2CborTrait.ID,\n                AwsJson1_0Trait.ID,\n                AwsJson1_1Trait.ID,\n                RestJson1Trait.ID,\n                RestXmlTrait.ID,\n                AwsQueryTrait.ID,\n                Ec2QueryTrait.ID,\n            )\n        assertEquals(expectedOrder, DefaultProtocols.keys.toList())\n    }\n\n    // Although the test function name appears generic, its purpose is to verify whether\n    // the RPCv2Cbor protocol is selected based on specific contexts.\n    @ParameterizedTest\n    @ArgumentsSource(ProtocolSelectionTestCaseProvider::class)\n    fun `should resolve expected protocol`(testCase: TestCase) {\n        val protocolLoader = ClientProtocolLoader(testCase.supportedProtocols)\n        val serviceShape = testCase.model.expectShape(ShapeId.from(\"test#TestService\"), ServiceShape::class.java)\n        if (testCase.resolvedProtocol.isNullOrEmpty()) {\n            assertThrows<CodegenException> {\n                protocolLoader.protocolFor(testCase.model, serviceShape)\n            }\n        } else {\n            val actual = protocolLoader.protocolFor(testCase.model, serviceShape).first.name\n            assertEquals(testCase.resolvedProtocol, actual)\n        }\n    }\n}\n\nclass ProtocolSelectionTestCaseProvider : ArgumentsProvider {\n    override fun provideArguments(p0: ExtensionContext?): Stream<out Arguments> {\n        val protocolsWithoutRpcv2Cbor = LinkedHashMap(DefaultProtocols)\n        protocolsWithoutRpcv2Cbor.remove(Rpcv2CborTrait.ID)\n\n        return arrayOf(\n            TestCase(DefaultProtocols, model(listOf(\"rpcv2Cbor\", \"awsJson1_0\")), \"rpcv2Cbor\"),\n            TestCase(DefaultProtocols, model(listOf(\"rpcv2Cbor\")), \"rpcv2Cbor\"),\n            TestCase(DefaultProtocols, model(listOf(\"rpcv2Cbor\", \"awsJson1_0\", \"awsQuery\")), \"rpcv2Cbor\"),\n            TestCase(DefaultProtocols, model(listOf(\"awsJson1_0\", \"awsQuery\")), \"awsJson1_0\"),\n            TestCase(DefaultProtocols, model(listOf(\"awsQuery\")), \"awsQuery\"),\n            TestCase(protocolsWithoutRpcv2Cbor, model(listOf(\"rpcv2Cbor\", \"awsJson1_0\")), \"awsJson1_0\"),\n            TestCase(protocolsWithoutRpcv2Cbor, model(listOf(\"rpcv2Cbor\")), null),\n            TestCase(protocolsWithoutRpcv2Cbor, model(listOf(\"rpcv2Cbor\", \"awsJson1_0\", \"awsQuery\")), \"awsJson1_0\"),\n            TestCase(protocolsWithoutRpcv2Cbor, model(listOf(\"awsJson1_0\", \"awsQuery\")), \"awsJson1_0\"),\n            TestCase(protocolsWithoutRpcv2Cbor, model(listOf(\"awsQuery\")), \"awsQuery\"),\n        ).map { Arguments.of(it) }.stream()\n    }\n\n    private fun model(protocols: List<String>) =\n        (\n            \"\"\"\n            namespace test\n            \"\"\" + renderProtocols(protocols) +\n                \"\"\"\n                @xmlNamespace(uri: \"http://test.com\") // required for @awsQuery\n                service TestService {\n                    version: \"1.0.0\"\n                }\n                \"\"\"\n        ).asSmithyModel(smithyVersion = \"2.0\")\n}\n\nprivate fun renderProtocols(protocols: List<String>): String {\n    val (rpcProtocols, awsProtocols) = protocols.partition { it == \"rpcv2Cbor\" }\n\n    val uses =\n        buildList {\n            rpcProtocols.forEach { add(\"use smithy.protocols#$it\") }\n            awsProtocols.forEach { add(\"use aws.protocols#$it\") }\n        }.joinToString(\"\\n\")\n\n    val annotations = protocols.joinToString(\"\\n\") { \"@$it\" }\n\n    return \"\"\"\n        $uses\n\n        $annotations\n    \"\"\"\n}\n"
  },
  {
    "path": "codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/protocols/Ec2QueryTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.protocols\n\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\n\nclass Ec2QueryTest {\n    private val model =\n        \"\"\"\n        namespace test\n        use aws.protocols#ec2Query\n\n        @ec2Query\n        @xmlNamespace(uri: \"https://example.com/\")\n        service TestService {\n            version: \"2019-12-16\",\n            operations: [SomeOperation]\n        }\n\n        operation SomeOperation {\n            input: SomeOperationInputOutput,\n            output: SomeOperationInputOutput,\n        }\n\n        structure SomeOperationInputOutput {\n            payload: String,\n            a: String,\n            b: Integer\n        }\n        \"\"\".asSmithyModel()\n\n    @Test\n    fun `generate an aws query service that compiles`() {\n        clientIntegrationTest(model) { _, _ -> }\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/protocols/RestJsonTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.protocols\n\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport kotlin.io.path.readText\n\ninternal class RestJsonTest {\n    val model =\n        \"\"\"\n        namespace test\n        use aws.protocols#restJson1\n        use aws.api#service\n        use smithy.test#httpRequestTests\n        use smithy.test#httpResponseTests\n\n        /// A REST JSON service that sends JSON requests and responses.\n        @service(sdkId: \"Rest Json Protocol\")\n        @restJson1\n        service RestJsonExtras {\n            version: \"2019-12-16\",\n            operations: [StringPayload]\n        }\n\n        @http(uri: \"/StringPayload\", method: \"POST\")\n        operation StringPayload {\n            input: StringPayloadInput,\n            output: StringPayloadInput\n        }\n\n        structure StringPayloadInput {\n            payload: String,\n            a: String,\n            b: Integer\n        }\n        \"\"\".asSmithyModel()\n\n    private val inputUnionWithEmptyStructure =\n        \"\"\"\n        namespace test\n        use aws.protocols#restJson1\n        use aws.api#service\n\n        @service(sdkId: \"Rest Json Empty Struct\")\n        @restJson1\n        service RestJsonEmptyStruct {\n            version: \"2019-12-16\",\n            operations: [TestOp]\n        }\n\n        @http(uri: \"/test\", method: \"POST\")\n        operation TestOp {\n            input: TestInput\n        }\n\n        structure TestInput {\n            testUnion: TestUnion\n        }\n\n        union TestUnion {\n            // Empty struct - RestJson ALWAYS uses inner variable, no warning\n            emptyStruct: EmptyStruct,\n\n            // Normal struct - RestJson uses inner variable\n            normalStruct: NormalStruct\n        }\n\n        structure EmptyStruct {}\n\n        structure NormalStruct {\n            value: String\n        }\n        \"\"\".asSmithyModel()\n\n    @Test\n    fun `generate a rest json service that compiles`() {\n        val testDir = clientIntegrationTest(model) { _, _ -> }\n\n        // test the generated metadata\n        val cargoToml = testDir.resolve(\"Cargo.toml\").readText()\n        assert(cargoToml.contains(\"codegen-version =\")) { cargoToml }\n        assert(cargoToml.contains(\"protocol = \\\"aws.protocols#restJson1\\\"\")) { cargoToml }\n    }\n\n    @Test\n    fun `union with empty struct always uses inner variable`() {\n        // This test documents that RestJson protocol is immune to unused variable issues.\n        // Unlike RestXml/AwsQuery, RestJson serializers always reference the inner variable\n        // even for empty structs, so no underscore prefix is needed.\n        // This test passes without any code changes, proving RestJson immunity.\n        clientIntegrationTest(inputUnionWithEmptyStructure) { _, _ -> }\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/protocols/RestXmlTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.protocols\n\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\n\ninternal class RestXmlTest {\n    private val model =\n        \"\"\"\n        namespace test\n        use aws.protocols#restXml\n        use aws.api#service\n\n\n        /// A REST XML service that sends XML requests and responses.\n        @service(sdkId: \"Rest XML UT\")\n        @restXml\n        service RestXmlExtras {\n            version: \"2019-12-16\",\n            operations: [Op]\n        }\n\n\n        @http(uri: \"/top\", method: \"POST\")\n        operation Op {\n            input: Top,\n            output: Top\n        }\n        union Choice {\n            @xmlFlattened\n            @xmlName(\"Hi\")\n            flatMap: MyMap,\n\n            deepMap: MyMap,\n\n            @xmlFlattened\n            flatList: SomeList,\n\n            deepList: SomeList,\n\n            s: String,\n\n            enum: FooEnum,\n\n            date: Timestamp,\n\n            number: Double,\n\n            top: Top,\n\n            blob: Blob\n        }\n\n        @enum([{name: \"FOO\", value: \"FOO\"}])\n        string FooEnum\n\n        map MyMap {\n            @xmlName(\"Name\")\n            key: String,\n\n            @xmlName(\"Setting\")\n            value: Choice,\n        }\n\n        list SomeList {\n            member: Choice\n        }\n\n        structure Top {\n            choice: Choice,\n\n            @xmlAttribute\n            extra: Long,\n\n            @xmlName(\"prefix:local\")\n            renamedWithPrefix: String\n        }\n\n        \"\"\".asSmithyModel()\n\n    private val inputUnionWithEmptyStructure =\n        \"\"\"\n        namespace test\n        use aws.protocols#restXml\n        use aws.api#service\n\n        @service(sdkId: \"Rest XML Empty Struct\")\n        @restXml\n        service RestXmlEmptyStruct {\n            version: \"2019-12-16\",\n            operations: [TestOp]\n        }\n\n        @http(uri: \"/test\", method: \"POST\")\n        operation TestOp {\n            input: TestInput\n        }\n\n        structure TestInput {\n            testUnion: TestUnion\n        }\n\n        union TestUnion {\n            // Empty struct - should generate _inner to avoid unused variable warning\n            emptyStruct: EmptyStruct,\n            // Normal struct - should generate inner (without underscore)\n            normalStruct: NormalStruct\n        }\n\n        structure EmptyStruct {}\n\n        structure NormalStruct {\n            value: String\n        }\n        \"\"\".asSmithyModel()\n\n    @Test\n    fun `generate a rest xml service that compiles`() {\n        clientIntegrationTest(model) { _, _ -> }\n    }\n\n    @Test\n    fun `union with empty struct generates warning-free code`() {\n        // This test will fail with unused variable warnings if the fix is not applied\n        // clientIntegrationTest enforces -D warnings via codegenIntegrationTest\n        clientIntegrationTest(inputUnionWithEmptyStructure) { _, _ -> }\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/protocols/eventstream/ClientEventStreamMarshallerGeneratorTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.protocols.eventstream\n\nimport org.junit.jupiter.api.extension.ExtensionContext\nimport org.junit.jupiter.params.ParameterizedTest\nimport org.junit.jupiter.params.provider.Arguments\nimport org.junit.jupiter.params.provider.ArgumentsProvider\nimport org.junit.jupiter.params.provider.ArgumentsSource\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenContext\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.testutil.EventStreamMarshallTestCases.writeMarshallTestCases\nimport software.amazon.smithy.rust.codegen.core.testutil.EventStreamTestModels\nimport software.amazon.smithy.rust.codegen.core.testutil.EventStreamUnmarshallTestCases.generateRustPayloadInitializer\nimport software.amazon.smithy.rust.codegen.core.testutil.IntegrationTestParams\nimport software.amazon.smithy.rust.codegen.core.testutil.testModule\nimport software.amazon.smithy.rust.codegen.core.testutil.tokioTest\nimport software.amazon.smithy.rust.codegen.core.util.dq\nimport software.amazon.smithy.rust.codegen.core.util.lookup\nimport java.util.stream.Stream\n\nclass ClientEventStreamMarshallerGeneratorTest {\n    @ParameterizedTest\n    @ArgumentsSource(TestCasesProvider::class)\n    fun test(testCase: EventStreamTestModels.TestCase) {\n        clientIntegrationTest(testCase.model) { codegenContext, rustCrate ->\n            rustCrate.testModule {\n                writeMarshallTestCases(codegenContext, testCase, optionalBuilderInputs = false)\n            }\n        }\n    }\n\n    @ParameterizedTest\n    @ArgumentsSource(RpcEventStreamTestCasesProvider::class)\n    fun rpcEventStreamTest(rpcEventStreamTestCase: RpcEventStreamTestCase) {\n        fun RustWriter.writeTestBody(\n            codegenContext: CodegenContext,\n            initialRequestAssertion: Writable,\n            setInput: Writable,\n        ) {\n            rustTemplate(\n                \"\"\"\n                use aws_smithy_http::event_stream::EventStreamSender;\n                use aws_smithy_types::body::SdkBody;\n                use #{futures_util}::StreamExt;\n\n                let (http_client, rx) = #{capture_request}(None);\n                let conf = crate::Config::builder()\n                    .endpoint_url(\"http://localhost:1234\")\n                    .http_client(http_client.clone())\n                    .behavior_version_latest()\n                    .build();\n                let client = crate::Client::from_conf(conf);\n\n                let event = TestStream::MessageWithString(\n                    MessageWithString::builder().data(\"hello, world!\").build(),\n                );\n                let stream = #{futures_util}::stream::iter(vec![Ok(event)]);\n                let _ = client\n                    .test_stream_op()\n                    #{set_input:W}\n                    .value(EventStreamSender::from(stream))\n                    .send()\n                    .await\n                    .unwrap();\n\n                let mut request = rx.expect_request();\n\n                #{check_headers:W}\n\n                let mut body = ::aws_smithy_types::body::SdkBody::taken();\n                std::mem::swap(&mut body, request.body_mut());\n\n                let unmarshaller = crate::event_stream_serde::TestStreamUnmarshaller::new();\n                let mut event_receiver = crate::event_receiver::EventReceiver::new(\n                    ::aws_smithy_http::event_stream::Receiver::new(unmarshaller, body)\n                );\n\n                #{assert_initial_request:W}\n\n                if let Some(event) = event_receiver.recv().await.unwrap() {\n                    match event {\n                        TestStream::MessageWithString(message_with_string) => {\n                            assert_eq!(\"hello, world!\", message_with_string.data().unwrap())\n                        }\n                        otherwise => panic!(\"matched on unexpected variant {otherwise:?}\"),\n                    }\n                } else {\n                    panic!(\"should receive at least one frame\");\n                }\n                \"\"\",\n                \"assert_initial_request\" to initialRequestAssertion,\n                \"capture_request\" to RuntimeType.captureRequest(codegenContext.runtimeConfig),\n                \"check_headers\" to checkHeaders(rpcEventStreamTestCase.headersToCheck),\n                \"futures_util\" to CargoDependency.FuturesUtil.toType(),\n                \"set_input\" to setInput,\n            )\n        }\n\n        val testCase = rpcEventStreamTestCase.inner\n        clientIntegrationTest(\n            testCase.model,\n            IntegrationTestParams(service = \"test#TestService\"),\n        ) { codegenContext, rustCrate ->\n            rustCrate.testModule {\n                rust(\"##![allow(unused_imports, dead_code)]\")\n\n                val typesModule =\n                    codegenContext.symbolProvider.moduleForShape(codegenContext.model.lookup(\"test#TestStruct\"))\n                rust(\n                    \"\"\"\n                    use aws_smithy_eventstream::frame::{UnmarshallMessage, UnmarshalledMessage};\n                    use aws_smithy_types::event_stream::{Header, HeaderValue, Message};\n                    use aws_smithy_types::{Blob, DateTime};\n                    use ${typesModule.fullyQualifiedPath()}::*;\n                    \"\"\",\n                )\n\n                if (rpcEventStreamTestCase.nonEventStreamMember == NonEventStreamMemberInOutput.NONE) {\n                    tokioTest(\"without_initial_request\") {\n                        writeTestBody(\n                            codegenContext,\n                            initialRequestAssertion =\n                                writable {\n                                    rust(\"assert!(event_receiver.try_recv_initial_request().await.unwrap().is_none());\")\n                                },\n                            setInput = writable {},\n                        )\n                    }\n                } else {\n                    tokioTest(\"with_initial_request\") {\n                        writeTestBody(\n                            codegenContext,\n                            initialRequestAssertion =\n                                writable {\n                                    rust(\n                                        \"\"\"\n                                        let msg = event_receiver\n                                            .try_recv_initial_request()\n                                            .await\n                                            .unwrap()\n                                            .expect(\"should receive initial-request\");\n                                        assert!(msg\n                                            .headers()\n                                            .iter()\n                                            .find(|p| p.value().as_string().unwrap().as_str() == \"initial-request\")\n                                            .is_some());\n                                        assert_eq!(\n                                            msg.payload(),\n                                            &bytes::Bytes::from_static(${\n                                            testCase.generateRustPayloadInitializer(\n                                                rpcEventStreamTestCase.expectedInInitialRequest,\n                                            )\n                                        })\n                                        );\n                                        \"\"\",\n                                    )\n                                },\n                            setInput =\n                                if (rpcEventStreamTestCase.nonEventStreamMember == NonEventStreamMemberInOutput.OPTIONAL_UNSET) {\n                                    writable {}\n                                } else {\n                                    writable {\n                                        rust(\"\"\".test_string(\"this is test\")\"\"\")\n                                    }\n                                },\n                        )\n                    }\n                }\n            }\n        }\n    }\n\n    @ParameterizedTest\n    @ArgumentsSource(RpcEventStreamTestCasesProvider::class)\n    fun signedInitialMessageTest(rpcEventStreamTestCase: RpcEventStreamTestCase) {\n        val testCase = rpcEventStreamTestCase.inner\n        // Filter out tests that do not have initial message\n        if (rpcEventStreamTestCase.nonEventStreamMember != NonEventStreamMemberInOutput.NONE) {\n            clientIntegrationTest(\n                testCase.model,\n                IntegrationTestParams(service = \"test#TestService\"),\n            ) { codegenContext, rustCrate ->\n                rustCrate.testModule {\n                    tokioTest(\"initial_message_and_event_are_signed\") {\n                        rustTemplate(\n                            \"\"\"\n                            use crate::types::*;\n                            use aws_smithy_eventstream::frame::{DeferredSignerSender, SignMessage, SignMessageError};\n                            use aws_smithy_http::event_stream::EventStreamSender;\n                            use aws_smithy_runtime_api::box_error::BoxError;\n                            use aws_smithy_runtime_api::client::interceptors::Intercept;\n                            use aws_smithy_runtime_api::client::interceptors::context::BeforeTransmitInterceptorContextMut;\n                            use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents;\n                            use aws_smithy_types::config_bag::ConfigBag;\n                            use aws_smithy_types::event_stream::Message;\n\n                            const FAKE_SIGNATURE: &str = \"abcdef1234567890abcdef1234567890abcdef1234567890abcdef1234567890\";\n\n                            ##[derive(Debug)]\n                            struct TestSigner;\n\n                            impl SignMessage for TestSigner {\n                                fn sign(&mut self, message: Message) -> Result<Message, SignMessageError> {\n                                    let mut new_payload = message.payload().to_vec();\n                                    new_payload.extend_from_slice(FAKE_SIGNATURE.as_bytes());\n\n                                    let mut signed_msg = Message::new(bytes::Bytes::from(new_payload));\n                                    for header in message.headers() {\n                                        signed_msg = signed_msg.add_header(header.clone());\n                                    }\n                                    Ok(signed_msg)\n                                }\n\n                                fn sign_empty(&mut self) -> Option<Result<Message, SignMessageError>> {\n                                    None\n                                }\n                            }\n\n                            ##[derive(Debug)]\n                            struct TestSignerInterceptor;\n\n                            impl Intercept for TestSignerInterceptor {\n                                fn name(&self) -> &'static str {\n                                    \"TestSignerInterceptor\"\n                                }\n\n                                fn modify_before_signing(\n                                    &self,\n                                    _context: &mut BeforeTransmitInterceptorContextMut<'_>,\n                                    _runtime_components: &RuntimeComponents,\n                                    cfg: &mut ConfigBag,\n                                ) -> Result<(), BoxError> {\n                                    if let Some(signer_sender) = cfg.load::<DeferredSignerSender>() {\n                                        signer_sender\n                                            .send(Box::new(TestSigner))\n                                            .expect(\"failed to send test signer\");\n                                    }\n                                    Ok(())\n                                }\n                            }\n\n                            let (http_client, rx) = #{capture_request}(None);\n                            let conf = crate::Config::builder()\n                                .endpoint_url(\"http://localhost:1234\")\n                                .http_client(http_client.clone())\n                                .interceptor(TestSignerInterceptor)\n                                .behavior_version_latest()\n                                .build();\n                            let client = crate::Client::from_conf(conf);\n\n                            let event = TestStream::MessageWithString(\n                                MessageWithString::builder().data(\"hello, world!\").build(),\n                            );\n                            let stream = ::futures_util::stream::iter(vec![Ok(event)]);\n                            let _ = client\n                                .test_stream_op()\n                                .test_string(\"this is test\")\n                                .value(EventStreamSender::from(stream))\n                                .send()\n                                .await\n                                .unwrap();\n\n                            let mut request = rx.expect_request();\n\n                            let mut body = ::aws_smithy_types::body::SdkBody::taken();\n                            std::mem::swap(&mut body, request.body_mut());\n\n                            let unmarshaller = crate::event_stream_serde::TestStreamUnmarshaller::new();\n                            let mut event_receiver = crate::event_receiver::EventReceiver::new(\n                                ::aws_smithy_http::event_stream::Receiver::new(unmarshaller, body),\n                            );\n\n                            // Check initial message has signature\n                            let initial_msg = event_receiver\n                                .try_recv_initial_request()\n                                .await\n                                .unwrap()\n                                .expect(\"should receive initial-request\");\n                            assert!(initial_msg.payload().ends_with(FAKE_SIGNATURE.as_bytes()));\n\n                            // Check event payload has signature\n                            if let Some(event) = event_receiver.recv().await.unwrap() {\n                                match event {\n                                    TestStream::MessageWithString(message_with_string) => {\n                                        assert!(message_with_string.data().unwrap().ends_with(FAKE_SIGNATURE));\n                                    }\n                                    otherwise => panic!(\"matched on unexpected variant {otherwise:?}\"),\n                                }\n                            } else {\n                                panic!(\"should receive at least one frame\");\n                            }\n                            \"\"\",\n                            \"capture_request\" to RuntimeType.captureRequest(codegenContext.runtimeConfig),\n                        )\n                    }\n                }\n            }\n        }\n    }\n}\n\nclass TestCasesProvider : ArgumentsProvider {\n    override fun provideArguments(context: ExtensionContext?): Stream<out Arguments> =\n        EventStreamTestModels.TEST_CASES.map { Arguments.of(it.withEnumMembers()) }.stream()\n}\n\n/**\n * Enum indicating the presence and state of a non-event stream member in [EventStreamTestModels] in `TestStreamInputOutput`.\n *\n * * `OPTIONAL_SET`: The non-stream member is optional and has a value set (input setter is called for input, or response payload is provided for output).\n * * `OPTIONAL_UNSET`: The non-stream member is optional but has no value set (no input setter is called for input, and no response payload is included for output).\n * * `REQUIRED`: The non-stream member is required and must be present.\n * * `NONE`: The non-stream member does not exist in `TestStreamInputOutput`.\n */\nenum class NonEventStreamMemberInOutput {\n    OPTIONAL_SET,\n    OPTIONAL_UNSET,\n    REQUIRED,\n    NONE,\n}\n\ndata class RpcEventStreamTestCase(\n    val inner: EventStreamTestModels.TestCase,\n    val nonEventStreamMember: NonEventStreamMemberInOutput,\n    val headersToCheck: Map<String, String>,\n    val expectedInInitialRequest: String = \"\",\n    val expectedInInitialResponse: String = \"\",\n)\n\nclass RpcEventStreamTestCasesProvider : ArgumentsProvider {\n    private val rpcBoundProtocols =\n        setOf(\n            \"awsJson1_0\",\n            \"awsJson1_1\",\n            \"awsQuery\",\n            \"ec2Query\",\n            \"rpcv2Cbor\",\n        )\n\n    private val ShapeId.isRpcBoundProtocol\n        get() = rpcBoundProtocols.contains(name)\n\n    override fun provideArguments(context: ExtensionContext?): Stream<out Arguments> =\n        EventStreamTestModels.TEST_CASES.filter { testCase: EventStreamTestModels.TestCase ->\n            ShapeId.from(testCase.protocolShapeId)?.isRpcBoundProtocol ?: false\n        }.flatMap { testCase: EventStreamTestModels.TestCase ->\n            val key = \"testString\"\n            val value = \"this is test\"\n\n            fun payload(jsonString: String): String =\n                if (testCase.protocolShapeId == \"smithy.protocols#rpcv2Cbor\") {\n                    EventStreamTestModels.base64EncodeJson(jsonString)\n                } else {\n                    jsonString\n                }\n\n            val headersToCheck: Map<String, String> =\n                if (testCase.protocolShapeId == \"smithy.protocols#rpcv2Cbor\") {\n                    mapOf(\n                        \"content-type\" to testCase.requestContentType,\n                        \"accept\" to testCase.accept,\n                    )\n                } else {\n                    emptyMap()\n                }\n\n            listOf(\n                RpcEventStreamTestCase(\n                    inner = testCase,\n                    headersToCheck = headersToCheck,\n                    nonEventStreamMember = NonEventStreamMemberInOutput.NONE,\n                ),\n                RpcEventStreamTestCase(\n                    inner =\n                        testCase.withNonEventStreamMembers(\"\"\"@httpHeader(\"X-Test-String\")$key: String,\"\"\"),\n                    headersToCheck = headersToCheck,\n                    nonEventStreamMember = NonEventStreamMemberInOutput.OPTIONAL_UNSET,\n                    expectedInInitialRequest = payload(\"{}\"),\n                ),\n                RpcEventStreamTestCase(\n                    inner =\n                        testCase.withNonEventStreamMembers(\"\"\"@httpHeader(\"X-Test-String\")$key: String,\"\"\")\n                            .copy(eventStreamInitialResponsePayload = payload(\"\"\"{\"$key\":\"$value\"}\"\"\")),\n                    headersToCheck = headersToCheck,\n                    nonEventStreamMember = NonEventStreamMemberInOutput.OPTIONAL_SET,\n                    expectedInInitialRequest = payload(\"\"\"{\"$key\":\"$value\"}\"\"\"),\n                    expectedInInitialResponse = \"Some(${value.dq()})\",\n                ),\n                RpcEventStreamTestCase(\n                    inner =\n                        testCase.withNonEventStreamMembers(\"\"\"@required@httpHeader(\"X-Test-String\")$key: String,\"\"\")\n                            .copy(eventStreamInitialResponsePayload = payload(\"\"\"{\"$key\":\"$value\"}\"\"\")),\n                    headersToCheck = headersToCheck,\n                    nonEventStreamMember = NonEventStreamMemberInOutput.REQUIRED,\n                    expectedInInitialRequest = payload(\"\"\"{\"$key\":\"$value\"}\"\"\"),\n                    expectedInInitialResponse = value.dq(),\n                ),\n            )\n        }.map { Arguments.of(it) }.stream()\n}\n\nprivate fun checkHeaders(headersToCheck: Map<String, String>) =\n    writable {\n        headersToCheck.forEach { (name, value) ->\n            rust(\n                \"\"\"\n                assert!(\n                    request\n                        .headers()\n                        .get(${name.dq()})\n                        .map(|hdr| hdr == ${value.dq()})\n                        .unwrap_or(false)\n                );\n                \"\"\",\n            )\n        }\n    }\n"
  },
  {
    "path": "codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/protocols/eventstream/ClientEventStreamUnmarshallerGeneratorTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.protocols.eventstream\n\nimport org.junit.jupiter.params.ParameterizedTest\nimport org.junit.jupiter.params.provider.ArgumentsSource\nimport software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenContext\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.testutil.EventStreamTestModels\nimport software.amazon.smithy.rust.codegen.core.testutil.EventStreamUnmarshallTestCases.generateRustPayloadInitializer\nimport software.amazon.smithy.rust.codegen.core.testutil.EventStreamUnmarshallTestCases.writeUnmarshallTestCases\nimport software.amazon.smithy.rust.codegen.core.testutil.EventStreamUnmarshallTestCases.writeUnmarshallTestUtil\nimport software.amazon.smithy.rust.codegen.core.testutil.IntegrationTestParams\nimport software.amazon.smithy.rust.codegen.core.testutil.testModule\nimport software.amazon.smithy.rust.codegen.core.testutil.tokioTest\nimport software.amazon.smithy.rust.codegen.core.testutil.unitTest\nimport software.amazon.smithy.rust.codegen.core.util.dq\n\nclass ClientEventStreamUnmarshallerGeneratorTest {\n    @ParameterizedTest\n    @ArgumentsSource(TestCasesProvider::class)\n    fun test(testCase: EventStreamTestModels.TestCase) {\n        clientIntegrationTest(\n            testCase.model,\n            IntegrationTestParams(service = \"test#TestService\"),\n        ) { codegenContext, rustCrate ->\n            val generator = \"crate::event_stream_serde::TestStreamUnmarshaller\"\n\n            rustCrate.testModule {\n                rust(\"##![allow(unused_imports, dead_code)]\")\n                writeUnmarshallTestCases(codegenContext, testCase, optionalBuilderInputs = false)\n\n                unitTest(\n                    \"unknown_message\",\n                    \"\"\"\n                    let message = msg(\"event\", \"NewUnmodeledMessageType\", \"application/octet-stream\", b\"hello, world!\");\n                    let result = $generator::new().unmarshall(&message);\n                    assert!(result.is_ok(), \"expected ok, got: {:?}\", result);\n                    assert!(expect_event(result.unwrap()).is_unknown());\n                    \"\"\",\n                )\n\n                unitTest(\n                    \"generic_error\",\n                    \"\"\"\n                    let message = msg(\n                        \"exception\",\n                        \"UnmodeledError\",\n                        \"${testCase.responseContentType}\",\n                        ${testCase.generateRustPayloadInitializer(testCase.validUnmodeledError)}\n                    );\n                    let result = $generator::new().unmarshall(&message);\n                    assert!(result.is_ok(), \"expected ok, got: {:?}\", result);\n                    match expect_error(result.unwrap()) {\n                        err @ TestStreamError::Unhandled(_) => {\n                            let message = format!(\"{}\", crate::error::DisplayErrorContext(&err));\n                            let expected = \"message: \\\"unmodeled error\\\"\";\n                            assert!(message.contains(expected), \"Expected '{message}' to contain '{expected}'\");\n                        }\n                        kind => panic!(\"expected generic error, but got {:?}\", kind),\n                    }\n                    \"\"\",\n                )\n            }\n        }\n    }\n\n    @ParameterizedTest\n    @ArgumentsSource(RpcEventStreamTestCasesProvider::class)\n    fun rpcEventStreamTest(rpcEventStreamTestCase: RpcEventStreamTestCase) {\n        val defaultEventStreamReceiver =\n            writable {\n                rust(\n                    \"\"\"\n                    if let Some(event) = response.value.recv().await.unwrap() {\n                        match event {\n                            TestStream::MessageWithString(message_with_string) => {\n                                assert_eq!(\"hello, world!\", message_with_string.data().unwrap())\n                            }\n                            otherwise => panic!(\"matched on unexpected variant {otherwise:?}\"),\n                        }\n                    } else {\n                        panic!(\"should receive at least one frame\");\n                    }\n                    \"\"\",\n                )\n            }\n\n        fun RustWriter.writeTestBody(\n            codegenContext: CodegenContext,\n            initialResponseStreamGenerator: Writable,\n            eventStreamGenerator: Writable,\n            sendResultHandler: Writable = writable { rust(\"let mut response = response.unwrap();\") },\n            initialResponseAssertion: Writable,\n            eventStreamReceiver: Writable = defaultEventStreamReceiver,\n        ) {\n            rustTemplate(\n                \"\"\"\n                use aws_smithy_eventstream::frame::{MarshallMessage, write_message_to};\n                use aws_smithy_http::event_stream::EventStreamSender;\n                use aws_smithy_types::body::SdkBody;\n                use #{futures_util}::StreamExt;\n\n                #{initial_response_stream:W}\n\n                let event = TestStream::MessageWithString(\n                    MessageWithString::builder().data(\"hello, world!\").build(),\n                );\n                let event_stream_payload = crate::event_stream_serde::TestStreamMarshaller::new()\n                    .marshall(event.clone())\n                    .unwrap();\n                let mut buffer = vec![];\n                write_message_to(&event_stream_payload, &mut buffer).unwrap();\n                // Error type here is arbitrary to satisfy the compiler\n                let chunks: Vec<Result<#{http_body_1_x}::Frame<bytes::Bytes>, std::io::Error>> = vec![Ok(#{http_body_1_x}::Frame::data(buffer.into()))];\n\n                #{event_stream:W}\n\n                let (http_client, _r) = #{capture_request}(Some(\n                    #{http_1x}::Response::builder()\n                        .status(200)\n                        .body(SdkBody::from_body_1_x(\n                           #{http_body_util}::StreamBody::new(event_stream),\n                        ))\n                        .unwrap(),\n                ));\n                let conf = crate::Config::builder()\n                    .endpoint_url(\"http://localhost:1234\")\n                    .http_client(http_client.clone())\n                    .behavior_version_latest()\n                    .build();\n                let client = crate::Client::from_conf(conf);\n\n                // This is dummy stream to satisfy input validation for the test service\n                let stream = #{futures_util}::stream::iter(vec![Ok(event)]);\n                let response = client\n                    .test_stream_op()\n                    .value(EventStreamSender::from(stream))\n                    .send()\n                    .await;\n\n                #{handle_send_result:W}\n\n                #{assert_initial_response:W}\n\n                #{receive_event_stream:W}\n                \"\"\",\n                \"assert_initial_response\" to initialResponseAssertion,\n                \"capture_request\" to RuntimeType.captureRequest(codegenContext.runtimeConfig),\n                \"event_stream\" to eventStreamGenerator,\n                \"futures_util\" to CargoDependency.FuturesUtil.toType(),\n                \"handle_send_result\" to sendResultHandler,\n                \"initial_response_stream\" to initialResponseStreamGenerator,\n                \"receive_event_stream\" to eventStreamReceiver,\n                \"http_1x\" to CargoDependency.Http1x.toType(),\n                \"http_body_1_x\" to CargoDependency.HttpBody1x.toType(),\n                \"http_body_util\" to CargoDependency.HttpBodyUtil01x.toType(),\n            )\n        }\n\n        clientIntegrationTest(\n            rpcEventStreamTestCase.inner.model,\n            IntegrationTestParams(service = \"test#TestService\"),\n        ) { codegenContext, rustCrate ->\n            rustCrate.testModule {\n                rust(\"##![allow(unused_imports, dead_code)]\")\n                writeUnmarshallTestUtil(codegenContext)\n\n                when (rpcEventStreamTestCase.nonEventStreamMember) {\n                    NonEventStreamMemberInOutput.OPTIONAL_SET, NonEventStreamMemberInOutput.REQUIRED -> {\n                        tokioTest(\"with_initial_response\") {\n                            writeTestBody(\n                                codegenContext,\n                                initialResponseStreamGenerator =\n                                    writable {\n                                        val testCase = rpcEventStreamTestCase.inner\n                                        rustTemplate(\n                                            \"\"\"\n                                            let initial_response = msg(\n                                                \"event\",\n                                                \"initial-response\",\n                                                ${testCase.eventStreamMessageContentType.dq()},\n                                                ${testCase.generateRustPayloadInitializer(testCase.eventStreamInitialResponsePayload!!)},\n                                            );\n                                            let mut buffer = vec![];\n                                            aws_smithy_eventstream::frame::write_message_to(&initial_response, &mut buffer).unwrap();\n                                            let chunks: Vec<Result<#{http_body_1_x}::Frame<bytes::Bytes>, _>> = vec![Ok(#{http_body_1_x}::Frame::data(buffer.into()))];\n                                            let initial_response_stream = futures_util::stream::iter(chunks);\n                                            \"\"\",\n                                            \"http_body_1_x\" to CargoDependency.HttpBody1x.toType(),\n                                        )\n                                    },\n                                eventStreamGenerator =\n                                    writable {\n                                        rust(\"let event_stream = initial_response_stream.chain(futures_util::stream::iter(chunks));\")\n                                    },\n                                initialResponseAssertion =\n                                    writable {\n                                        rust(\"assert_eq!(${rpcEventStreamTestCase.expectedInInitialResponse}, response.test_string());\")\n                                    },\n                            )\n                        }\n                        tokioTest(\"with_initial_response_containing_invalid_data\") {\n                            writeTestBody(\n                                codegenContext,\n                                initialResponseStreamGenerator =\n                                    writable {\n                                        val testCase = rpcEventStreamTestCase.inner\n                                        rustTemplate(\n                                            \"\"\"\n                                            let initial_response = msg(\n                                                \"event\",\n                                                \"initial-response\",\n                                                ${testCase.eventStreamMessageContentType.dq()},\n                                                // Provide a bogus string when either a JSON string or the base64 encoding of a JSON string is expected\n                                                ${testCase.generateRustPayloadInitializer(\"abc\")},\n                                            );\n                                            let mut buffer = vec![];\n                                            aws_smithy_eventstream::frame::write_message_to(&initial_response, &mut buffer).unwrap();\n                                            let chunks: Vec<Result<#{http_body_1_x}::Frame<bytes::Bytes>, _>> = vec![Ok(#{http_body_1_x}::Frame::data(buffer.into()))];\n                                            let initial_response_stream = futures_util::stream::iter(chunks);\n                                            \"\"\",\n                                            \"http_body_1_x\" to CargoDependency.HttpBody1x.toType(),\n                                        )\n                                    },\n                                eventStreamGenerator =\n                                    writable {\n                                        rust(\"let event_stream = initial_response_stream.chain(futures_util::stream::iter(chunks));\")\n                                    },\n                                sendResultHandler =\n                                    writable {\n                                        rustTemplate(\n                                            \"\"\"\n                                            match response {\n                                                Err(e) => {\n                                                    assert!(e\n                                                        .into_source()\n                                                        .unwrap()\n                                                        .downcast_ref::<#{DeserializeError}>()\n                                                        .is_some());\n                                                }\n                                                otherwise => {\n                                                    panic!(\n                                                        \"Expected ResponseError with DeserializeError being its source, got: {otherwise:?}\"\n                                                    );\n                                                }\n                                            }\n                                            \"\"\",\n                                            \"DeserializeError\" to\n                                                if (rpcEventStreamTestCase.inner.protocolShapeId == \"smithy.protocols#rpcv2Cbor\") {\n                                                    RuntimeType.smithyCbor(codegenContext.runtimeConfig)\n                                                        .resolve(\"decode::DeserializeError\")\n                                                } else {\n                                                    RuntimeType.smithyJson(codegenContext.runtimeConfig)\n                                                        .resolve(\"deserialize::error::DeserializeError\")\n                                                },\n                                        )\n                                    },\n                                initialResponseAssertion = writable {},\n                                eventStreamReceiver = writable {},\n                            )\n                        }\n                    }\n\n                    NonEventStreamMemberInOutput.OPTIONAL_UNSET -> {\n                        tokioTest(\"without_initial_response\") {\n                            writeTestBody(\n                                codegenContext,\n                                initialResponseStreamGenerator = writable {},\n                                eventStreamGenerator =\n                                    writable {\n                                        rust(\"let event_stream = futures_util::stream::iter(chunks);\")\n                                    },\n                                initialResponseAssertion =\n                                    writable {\n                                        rust(\"assert!(response.test_string().is_none());\")\n                                    },\n                            )\n                        }\n                    }\n\n                    NonEventStreamMemberInOutput.NONE -> {\n                        tokioTest(\"event_stream_member_only\") {\n                            writeTestBody(\n                                codegenContext,\n                                initialResponseStreamGenerator = writable {},\n                                eventStreamGenerator =\n                                    writable {\n                                        rust(\"let event_stream = futures_util::stream::iter(chunks);\")\n                                    },\n                                initialResponseAssertion = writable {},\n                            )\n                        }\n                    }\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/smithy/transformers/DisableStalledStreamProtectionTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.smithy.transformers\n\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.rust.codegen.client.smithy.traits.IncompatibleWithStalledStreamProtectionTrait\nimport software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.integrationTest\nimport software.amazon.smithy.rust.codegen.core.testutil.tokioTest\n\nclass DisableStalledStreamProtectionTest {\n    @Test\n    fun `it should make event stream operation incompatible with stalled stream protection`() {\n        val model =\n            DisableStalledStreamProtection.transformModel(\n                \"\"\"\n                namespace test\n\n                structure Something { stuff: Blob }\n\n                @streaming\n                union SomeStream {\n                    Something: Something,\n                }\n\n                structure TestInput { inputStream: SomeStream }\n                operation TestOperation {\n                    input: TestInput,\n                }\n                service TestService { version: \"123\", operations: [TestOperation] }\n                \"\"\".asSmithyModel(smithyVersion = \"2.0\"),\n            )\n\n        val operation = model.expectShape(ShapeId.from(\"test#TestOperation\"))\n        assert(operation.hasTrait(IncompatibleWithStalledStreamProtectionTrait.ID))\n    }\n\n    @Test\n    fun `it should make target operation incompatible with stalled stream protection`() {\n        val model =\n            \"\"\"\n            namespace test\n\n            structure Something { stuff: Blob }\n\n            structure TestInput { input: Something }\n            operation TestOperation {\n                input: TestInput,\n            }\n            service TestService { version: \"123\", operations: [TestOperation] }\n            \"\"\".asSmithyModel(smithyVersion = \"2.0\")\n\n        val transformedModel = (DisableStalledStreamProtection::transformModel)(model)\n        // operation should not have IncompatibleWithStalledStreamProtectionTrait,\n        // as it is not an event stream\n        val operation = transformedModel.expectShape(ShapeId.from(\"test#TestOperation\")) as OperationShape\n        assert(!operation.hasTrait(IncompatibleWithStalledStreamProtectionTrait.ID))\n\n        // transformed, however, should have IncompatibleWithStalledStreamProtectionTrait\n        val transformed = (DisableStalledStreamProtection::transformOperation)(operation)\n        assert(transformed.hasTrait(IncompatibleWithStalledStreamProtectionTrait.ID))\n    }\n\n    @Test\n    fun `IncompatibleWithStalledStreamProtectionTrait should not add the relevant interceptor`() {\n        val model =\n            \"\"\"\n            namespace test\n            use aws.protocols#restJson1\n\n            structure Something { stuff: Blob }\n\n            @streaming\n            union SomeStream {\n                Something: Something,\n            }\n\n            structure TestOutput { @httpPayload outputStream: SomeStream }\n\n            @http(method: \"POST\", uri: \"/test\")\n            operation TestOperation {\n                output: TestOutput,\n            }\n            @restJson1\n            service TestService { version: \"123\", operations: [TestOperation] }\n            \"\"\".asSmithyModel(smithyVersion = \"2.0\")\n\n        clientIntegrationTest(model) { ctx, crate ->\n            crate.integrationTest(\"disable_stalled_stream_protection\") {\n                tokioTest(\"stalled_stream_protection_interceptor_should_be_absent_for_operation\") {\n                    val moduleName = ctx.moduleUseName()\n                    rustTemplate(\n                        \"\"\"\n                        use aws_smithy_runtime_api::box_error::BoxError;\n                        use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents;\n                        use aws_smithy_types::body::SdkBody;\n                        use std::sync::atomic::{AtomicU32, Ordering};\n                        use std::sync::Arc;\n                        use $moduleName::{\n                            config::interceptors::BeforeSerializationInterceptorContextRef,\n                            config::Intercept,\n                            {Client, Config},\n                        };\n\n                        ##[derive(Clone, Debug, Default)]\n                        struct TestInterceptor {\n                            called: Arc<AtomicU32>,\n                        }\n                        impl Intercept for TestInterceptor {\n                            fn name(&self) -> &'static str {\n                                \"TestInterceptor\"\n                            }\n                            fn read_before_serialization(\n                                &self,\n                                _context: &BeforeSerializationInterceptorContextRef<'_>,\n                                runtime_components: &RuntimeComponents,\n                                _cfg: &mut aws_smithy_types::config_bag::ConfigBag,\n                            ) -> Result<(), BoxError> {\n                                self.called.fetch_add(1, Ordering::Relaxed);\n                                assert!(!runtime_components\n                                    .interceptors()\n                                    .any(|i| i.name() == \"StalledStreamProtectionInterceptor\"));\n                                Ok(())\n                            }\n                        }\n\n                        let http_client =\n                            #{infallible_client_fn}(|_req| http::Response::builder().body(SdkBody::empty()).unwrap());\n                        let test_interceptor = TestInterceptor::default();\n                        let client_config = Config::builder()\n                            .interceptor(test_interceptor.clone())\n                            .endpoint_url(\"http://localhost:1234\")\n                            .http_client(http_client)\n                            .build();\n\n                        let client = Client::from_conf(client_config);\n                        let _ = client.test_operation().send().await;\n\n                        assert!(\n                            test_interceptor.called.load(Ordering::Relaxed) == 1,\n                            \"the interceptor should have been called\"\n                        );\n                        \"\"\",\n                        \"infallible_client_fn\" to\n                            CargoDependency.smithyRuntimeTestUtil(ctx.runtimeConfig)\n                                .toType().resolve(\"client::http::test_util::infallible_client_fn\"),\n                    )\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/testutil/Matchers.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.testutil\n\nimport io.kotest.matchers.shouldBe\n\nfun <T> String.shouldMatchResource(\n    clazz: Class<T>,\n    resourceName: String,\n) {\n    val resource = clazz.getResource(resourceName).readText()\n    this.trim().shouldBe(resource.trim())\n}\n"
  },
  {
    "path": "codegen-client/src/test/kotlin/software/amazon/smithy/rust/codegen/client/tool/TimeTestSuiteGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.client.tool\n\nimport software.amazon.smithy.model.SourceLocation\nimport software.amazon.smithy.model.node.ArrayNode\nimport software.amazon.smithy.model.node.BooleanNode\nimport software.amazon.smithy.model.node.Node\nimport software.amazon.smithy.model.node.NumberNode\nimport software.amazon.smithy.model.node.ObjectNode\nimport java.time.ZoneId\nimport java.time.ZonedDateTime\nimport java.time.format.DateTimeFormatter\nimport java.time.format.DateTimeFormatterBuilder\nimport java.time.format.SignStyle\nimport java.time.temporal.ChronoField\nimport java.util.Locale\nimport kotlin.math.absoluteValue\n\nprivate val UTC = ZoneId.of(\"UTC\")\nprivate val YEARS =\n    listOf(\n        -9999, -100, -1,\n        // year 0 doesn't exist\n        1,\n        100, 1969, 1970, 2037, 2038, 9999,\n    )\n\nprivate val DAYS_IN_MONTH =\n    mapOf(\n        1 to 31,\n        2 to 28,\n        3 to 31,\n        4 to 30,\n        5 to 31,\n        6 to 30,\n        7 to 31,\n        8 to 31,\n        9 to 30,\n        10 to 31,\n        11 to 30,\n        12 to 31,\n    )\nprivate val MILLI_FRACTIONS = listOf(0, 1_000_000, 10_000_000, 100_000_000, 234_000_000)\nprivate val MICRO_FRACTIONS = listOf(0, 1_000, 10_000, 100_000, 234_000)\nprivate val NANO_FRACTIONS =\n    listOf(0, 1, 10, 100, 1_000, 10_000, 100_000, 1_000_000, 10_000_000, 100_000_000, 123_456_789)\n\nprivate data class TestCase(\n    val time: ZonedDateTime,\n    val formatted: String?,\n) {\n    fun toNode(): Node =\n        time.toInstant().let { instant ->\n            val map =\n                mutableMapOf<String, Node>(\n                    \"iso8601\" to Node.from(DateTimeFormatter.ISO_OFFSET_DATE_TIME.format(time)),\n                    // JSON numbers have 52 bits of precision, and canonical seconds needs 64 bits\n                    \"canonical_seconds\" to Node.from(instant.epochSecond.toString()),\n                    \"canonical_nanos\" to NumberNode(instant.nano, SourceLocation.NONE),\n                    \"error\" to BooleanNode(formatted == null, SourceLocation.NONE),\n                )\n            if (formatted != null) {\n                map[\"smithy_format_value\"] = Node.from(formatted)\n            }\n            return ObjectNode(map.mapKeys { Node.from(it.key) }, SourceLocation.NONE)\n        }\n}\n\nprivate enum class AllowedSubseconds {\n    NANOS,\n    MICROS,\n    MILLIS,\n}\n\nprivate fun generateTestTimes(allowed: AllowedSubseconds): List<ZonedDateTime> {\n    val result = ArrayList<ZonedDateTime>()\n    var i = 887 // a prime number to start\n    for (year in YEARS) {\n        for (month: Int in 1..12) {\n            val dayOfMonth = i % DAYS_IN_MONTH.getValue(month) + 1\n            val hour = i % 24\n            val minute = i % 60\n            val second = (i * 233).absoluteValue % 60\n            val nanoOfSecond =\n                when (allowed) {\n                    AllowedSubseconds.NANOS -> NANO_FRACTIONS[i % NANO_FRACTIONS.size]\n                    AllowedSubseconds.MICROS -> MICRO_FRACTIONS[i % MICRO_FRACTIONS.size]\n                    AllowedSubseconds.MILLIS -> MILLI_FRACTIONS[i % MILLI_FRACTIONS.size]\n                }\n            result.add(ZonedDateTime.of(year, month, dayOfMonth, hour, minute, second, nanoOfSecond, UTC))\n            i += 1\n        }\n    }\n\n    // Leap years\n    result.add(ZonedDateTime.of(2004, 2, 29, 23, 59, 59, 999_000_000, UTC))\n    result.add(ZonedDateTime.of(1584, 2, 29, 23, 59, 59, 999_000_000, UTC))\n\n    result.sort()\n    return result\n}\n\nprivate fun generateEpochSecondsTests(): List<TestCase> {\n    val formatter =\n        DateTimeFormatterBuilder()\n            .appendValue(ChronoField.INSTANT_SECONDS, 1, 19, SignStyle.NORMAL)\n            .optionalStart()\n            .appendFraction(ChronoField.MICRO_OF_SECOND, 0, 6, true)\n            .optionalEnd()\n            .toFormatter()\n    return generateTestTimes(AllowedSubseconds.MICROS).map { time ->\n        TestCase(time, formatter.format(time))\n    }\n}\n\nprivate fun generateHttpDateTests(parsing: Boolean): List<TestCase> {\n    val formatter =\n        DateTimeFormatterBuilder()\n            .appendPattern(\"EEE, dd MMM yyyy HH:mm:ss\")\n            .optionalStart()\n            .appendFraction(ChronoField.MILLI_OF_SECOND, 0, 3, true)\n            .optionalEnd()\n            .appendLiteral(\" GMT\")\n            .toFormatter(Locale.ENGLISH)\n    return generateTestTimes(if (parsing) AllowedSubseconds.MILLIS else AllowedSubseconds.NANOS).map { time ->\n        TestCase(\n            time,\n            when {\n                time.year < 0 -> null\n                else -> formatter.format(time)\n            },\n        )\n    }\n}\n\nprivate fun generateDateTimeTests(parsing: Boolean): List<TestCase> {\n    val formatter =\n        DateTimeFormatterBuilder()\n            .appendPattern(\"yyyy-MM-dd'T'HH:mm:ss\")\n            .optionalStart()\n            .appendFraction(ChronoField.MICRO_OF_SECOND, 0, 6, true)\n            .optionalEnd()\n            .appendLiteral(\"Z\")\n            .toFormatter(Locale.ENGLISH)\n    return generateTestTimes(if (parsing) AllowedSubseconds.MICROS else AllowedSubseconds.NANOS).map { time ->\n        TestCase(\n            time,\n            when {\n                time.year < 0 -> null\n                else -> formatter.format(time)\n            },\n        )\n    }\n}\n\nfun main() {\n    val none = SourceLocation.NONE\n    val topLevels =\n        mapOf<String, Node>(\n            \"description\" to\n                ArrayNode(\n                    \"\"\"\n                    This file holds format and parse test cases for Smithy's built-in `epoch-seconds`,\n                    `http-date`, and `date-time` timestamp formats.\n\n                    There are six top-level sections:\n                     - `format_epoch_seconds`: Test cases for formatting timestamps into `epoch-seconds`\n                     - `format_http_date`: Test cases for formatting timestamps into `http-date`\n                     - `format_date_time`: Test cases for formatting timestamps into `date-time`\n                     - `parse_epoch_seconds`: Test cases for parsing timestamps from `epoch-seconds`\n                     - `parse_http_date`: Test cases for parsing timestamps from `http-date`\n                     - `parse_date_time`: Test cases for parsing timestamps from `date-time`\n\n                    Each top-level section is an array of the same test case data structure:\n                    ```typescript\n                    type TestCase = {\n                        // Human-readable ISO-8601 representation of the canonical date-time. This should not\n                        // be used by tests, and is only present to make test failures more human readable.\n                        iso8601: string,\n\n                        // The canonical number of seconds since the Unix epoch in UTC.\n                        canonical_seconds: string,\n\n                        // The canonical nanosecond adjustment to the canonical number of seconds.\n                        // If conversion from (canonical_seconds, canonical_nanos) into a 128-bit integer is required,\n                        // DO NOT just add the two together as this will yield an incorrect value when\n                        // canonical_seconds is negative.\n                        canonical_nanos: number,\n\n                        // Will be true if this test case is expected to result in an error or exception\n                        error: boolean,\n\n                        // String value of the timestamp in the Smithy format. For the `format_epoch_seconds` top-level,\n                        // this will be in the `epoch-seconds` format, and for `parse_http_date`, it will be in the\n                        // `http-date` format (and so on).\n                        //\n                        // For parsing tests, parse this value and compare the result against canonical_seconds\n                        // and canonical_nanos.\n                        //\n                        // For formatting tests, form the canonical_seconds and canonical_nanos, and then compare\n                        // the result against this value.\n                        //\n                        // This value will not be set for formatting tests if `error` is set to `true`.\n                        smithy_format_value: string,\n                    }\n                    ```\n                    \"\"\".trimIndent().split(\"\\n\").map {\n                        Node.from(it)\n                    },\n                    none,\n                ),\n            \"format_epoch_seconds\" to ArrayNode(generateEpochSecondsTests().map(TestCase::toNode), none),\n            \"format_http_date\" to ArrayNode(generateHttpDateTests(parsing = false).map(TestCase::toNode), none),\n            \"format_date_time\" to ArrayNode(generateDateTimeTests(parsing = false).map(TestCase::toNode), none),\n            \"parse_epoch_seconds\" to\n                ArrayNode(\n                    generateEpochSecondsTests()\n                        .filter { it.formatted != null }\n                        .map(TestCase::toNode),\n                    none,\n                ),\n            \"parse_http_date\" to\n                ArrayNode(\n                    generateHttpDateTests(parsing = true)\n                        .filter { it.formatted != null }\n                        .map(TestCase::toNode),\n                    none,\n                ),\n            \"parse_date_time\" to\n                ArrayNode(\n                    generateDateTimeTests(parsing = true)\n                        .filter { it.formatted != null }\n                        .map(TestCase::toNode),\n                    none,\n                ),\n        ).mapKeys { Node.from(it.key) }\n\n    println(Node.prettyPrintJson(ObjectNode(topLevels, none)))\n}\n"
  },
  {
    "path": "codegen-client-test/.gitignore",
    "content": "smithy-build.json\n"
  },
  {
    "path": "codegen-client-test/README.md",
    "content": "# Codegen Integration Tests\n\nThis module defines integration tests of the code generation machinery.\n`./build.gradle.kts` will generate a `smithy-build.json` file as part of the\nbuild. The `rust-client-codegen` Smithy build plugin then invokes our codegen\nmachinery and generates Rust crates, one for each of the integration test\nservices defined under `model/`.\n\n## Usage\n\nThese commands are all meant to be run from the repository root.\n\nTo run all protocol tests of all the integration test services:\n\n```sh\n./gradlew codegen-client-test:build\n```\n\nTo run only a _subset_ of the integration test services (refer to\n`./build.gradle.kts` for a full list):\n\n```sh\n./gradlew codegen-client-test:build -P modules='simple,rest_json'\n```\n\nThe Gradle task will run `cargo check`, `cargo test`, `cargo docs` and `cargo\nclippy` by default on all the generated Rust crates. You can also specify a\nsubset of these commands. For instance, if you're working on documentation and\nwant to check that the crates also compile, you can run:\n\n```sh\n./gradlew codegen-client-test:build -P cargoCommands='check,docs'\n```\n\nFor fast development iteration cycles on protocol tests, we recommend you write\na codegen _unit_ test with a minimal service definition and only run that unit\ntest.  Alternatively, you can write a minimal integration test service\ndefinition in `model/simple.smithy` and run:\n\n```sh\n./gradlew codegen-client-test:build -P cargoCommands='test' -P modules='simple'\n```\n"
  },
  {
    "path": "codegen-client-test/build.gradle.kts",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nplugins {\n    java\n    alias(libs.plugins.smithy.gradle.base)\n    alias(libs.plugins.smithy.gradle.jar)\n}\n\nextra[\"displayName\"] = \"Smithy :: Rust :: Codegen :: Test\"\nextra[\"moduleName\"] = \"software.amazon.smithy.kotlin.codegen.test\"\n\ntasks.jar.configure {\n    enabled = false\n}\n\nval properties = PropertyRetriever(rootProject, project)\nfun getSmithyRuntimeMode(): String = properties.get(\"smithy.runtime.mode\") ?: \"orchestrator\"\n\nval pluginName = \"rust-client-codegen\"\nval workingDirUnderBuildDir = \"smithyprojections/codegen-client-test/\"\n\nval checkedInSmithyRuntimeLockfile = rootProject.projectDir.resolve(\"rust-runtime/Cargo.lock\")\n\ndependencies {\n    implementation(project(\":codegen-client\"))\n    implementation(libs.smithy.aws.protocol.tests)\n    implementation(libs.smithy.protocol.tests)\n    implementation(libs.smithy.protocol.test.traits)\n    implementation(libs.smithy.aws.traits)\n}\n\n// Disabled because the formatter was remove formatting from our `body` sections.\nsmithy {\n    format.set(false)\n}\n\ndata class ClientTest(\n    val serviceShapeName: String,\n    val moduleName: String,\n    val dependsOn: List<String> = emptyList(),\n    val addMessageToErrors: Boolean = true,\n    val renameErrors: Boolean = true,\n) {\n    fun toCodegenTest(): CodegenTest = CodegenTest(\n        serviceShapeName,\n        moduleName,\n        extraCodegenConfig = extraCodegenConfig(),\n        imports = imports(),\n    )\n\n    private fun extraCodegenConfig(): String = StringBuilder().apply {\n        append(\"\\\"addMessageToErrors\\\": $addMessageToErrors,\\n\")\n        append(\"\\\"renameErrors\\\": $renameErrors\\n,\")\n        append(\"\\\"enableNewSmithyRuntime\\\": \\\"${getSmithyRuntimeMode()}\\\"\")\n    }.toString()\n\n    private fun imports(): List<String> = dependsOn.map { \"../codegen-core/common-test-models/$it\" }\n}\n\nval allCodegenTests = listOf(\n    ClientTest(\"com.amazonaws.simple#SimpleService\", \"simple\", dependsOn = listOf(\"simple.smithy\")),\n    ClientTest(\"com.amazonaws.bignumbers#BigNumberService\", \"big_numbers\", dependsOn = listOf(\"big-numbers.smithy\")),\n    ClientTest(\"com.amazonaws.dynamodb#DynamoDB_20120810\", \"dynamo\"),\n    ClientTest(\"com.amazonaws.ebs#Ebs\", \"ebs\", dependsOn = listOf(\"ebs.json\")),\n    ClientTest(\"aws.protocoltests.json10#JsonRpc10\", \"json_rpc10\"),\n    ClientTest(\"aws.protocoltests.json#JsonProtocol\", \"json_rpc11\"),\n    ClientTest(\"aws.protocoltests.restjson#RestJson\", \"rest_json\"),\n    ClientTest(\n        \"aws.protocoltests.restjson#RestJsonExtras\",\n        \"rest_json_extras\",\n        dependsOn = listOf(\"rest-json-extras.smithy\"),\n    ),\n    ClientTest(\"aws.protocoltests.misc#MiscService\", \"misc\", dependsOn = listOf(\"misc.smithy\")),\n    ClientTest(\"aws.protocoltests.restxml#RestXml\", \"rest_xml\", addMessageToErrors = false),\n    ClientTest(\"aws.protocoltests.query#AwsQuery\", \"aws_query\", addMessageToErrors = false),\n    ClientTest(\"aws.protocoltests.ec2#AwsEc2\", \"ec2_query\", addMessageToErrors = false),\n    ClientTest(\"aws.protocoltests.rpcv2cbor#QueryCompatibleRpcV2Protocol\", \"rpcv2cbor_query_compatible\"),\n    ClientTest(\"aws.protocoltests.rpcv2cbor#NonQueryCompatibleRpcV2Protocol\", \"rpcv2cbor_non_query_compatible\"),\n    ClientTest(\"smithy.protocoltests.rpcv2Cbor#RpcV2Protocol\", \"rpcv2Cbor\"),\n    ClientTest(\n        \"smithy.protocoltests.rpcv2Cbor#RpcV2CborService\",\n        \"rpcv2Cbor_extras\",\n        dependsOn = listOf(\"rpcv2Cbor-extras.smithy\")\n    ),\n    ClientTest(\n        \"aws.protocoltests.restxml.xmlns#RestXmlWithNamespace\",\n        \"rest_xml_namespace\",\n        addMessageToErrors = false,\n    ),\n    ClientTest(\"aws.protocoltests.restxml#RestXmlExtras\", \"rest_xml_extras\", addMessageToErrors = false),\n    ClientTest(\n        \"aws.protocoltests.restxmlunwrapped#RestXmlExtrasUnwrappedErrors\",\n        \"rest_xml_extras_unwrapped\",\n        addMessageToErrors = false,\n    ),\n    ClientTest(\n        \"crate#Config\",\n        \"naming_test_ops\",\n        dependsOn = listOf(\"naming-obstacle-course-ops.smithy\"),\n        renameErrors = false,\n    ),\n    ClientTest(\n        \"casing#ACRONYMInside_Service\",\n        \"naming_test_casing\",\n        dependsOn = listOf(\"naming-obstacle-course-casing.smithy\"),\n    ),\n    ClientTest(\n        \"naming_obs_structs#NamingObstacleCourseStructs\",\n        \"naming_test_structs\",\n        dependsOn = listOf(\"naming-obstacle-course-structs.smithy\"),\n        renameErrors = false,\n    ),\n    ClientTest(\"aws.protocoltests.json#TestService\", \"endpoint-rules\"),\n    ClientTest(\n        \"com.aws.example#PokemonService\",\n        \"pokemon-service-client\",\n        dependsOn = listOf(\"pokemon.smithy\", \"pokemon-common.smithy\"),\n    ),\n    ClientTest(\n        \"com.aws.example#PokemonService\",\n        \"pokemon-service-awsjson-client\",\n        dependsOn = listOf(\"pokemon-awsjson.smithy\", \"pokemon-common.smithy\"),\n    ),\n    ClientTest(\"aws.protocoltests.misc#QueryCompatService\", \"query-compat-test\", dependsOn = listOf(\"aws-json-query-compat.smithy\")),\n).map(ClientTest::toCodegenTest)\n\nproject.registerGenerateSmithyBuildTask(rootProject, pluginName, allCodegenTests)\nproject.registerGenerateCargoWorkspaceTask(rootProject, pluginName, allCodegenTests, workingDirUnderBuildDir)\nproject.registerGenerateCargoConfigTomlTask(layout.buildDirectory.dir(workingDirUnderBuildDir).get().asFile)\nproject.registerCopyCheckedInCargoLockfileTask(checkedInSmithyRuntimeLockfile, layout.buildDirectory.dir(workingDirUnderBuildDir).get().asFile)\n\ntasks[\"generateSmithyBuild\"].inputs.property(\"smithy.runtime.mode\", getSmithyRuntimeMode())\n\ntasks[\"smithyBuild\"].dependsOn(\"generateSmithyBuild\")\ntasks[\"assemble\"].finalizedBy(\"generateCargoWorkspace\", \"copyCheckedInCargoLockfile\")\n\nproject.registerModifyMtimeTask()\nproject.registerCargoCommandsTasks(layout.buildDirectory.dir(workingDirUnderBuildDir).get().asFile)\n\ntasks[\"test\"].finalizedBy(cargoCommands(properties).map { it.toString })\n\ntasks[\"clean\"].doFirst { delete(\"smithy-build.json\") }\n"
  },
  {
    "path": "codegen-client-test/model/basic-enums.smithy",
    "content": "$version: \"1.0\"\n\nnamespace aws.protocoltests.json\n\nuse aws.protocols#awsJson1_1\nuse aws.protocoltests.shared#FooEnum\nuse aws.protocoltests.shared#FooEnumList\nuse aws.protocoltests.shared#FooEnumSet\nuse aws.protocoltests.shared#FooEnumMap\nuse smithy.test#httpRequestTests\nuse smithy.test#httpResponseTests\n\n// The enum protocol test is disabled because of set ordering non-determinism. Add a simpler test\napply JsonEnums @httpRequestTests([\n    {\n        id: \"AwsJson11EnumsBasic\",\n        documentation: \"Serializes simple scalar properties\",\n        protocol: awsJson1_1,\n        method: \"POST\",\n        uri: \"/\",\n        body: \"\"\"\n              {\n                  \"fooEnum1\": \"Foo\",\n                  \"fooEnum2\": \"0\",\n                  \"fooEnum3\": \"1\",\n                  \"fooEnumList\": [\n                      \"Foo\",\n                      \"0\"\n                  ],\n                  \"fooEnumMap\": {\n                      \"hi\": \"Foo\",\n                      \"zero\": \"0\"\n                  }\n              }\"\"\",\n        headers: {\"Content-Type\": \"application/x-amz-json-1.1\"},\n        bodyMediaType: \"application/json\",\n        params: {\n            fooEnum1: \"Foo\",\n            fooEnum2: \"0\",\n            fooEnum3: \"1\",\n            fooEnumList: [\"Foo\", \"0\"],\n            fooEnumMap: {\n                \"hi\": \"Foo\",\n                \"zero\": \"0\"\n            }\n        }\n    }\n])\n"
  },
  {
    "path": "codegen-client-test/model/dynamodb.json",
    "content": "{\n  \"smithy\": \"1.0\",\n  \"metadata\": {\n    \"suppressions\": [\n      {\n        \"id\": \"HttpMethodSemantics\",\n        \"namespace\": \"*\"\n      },\n      {\n        \"id\": \"HttpResponseCodeSemantics\",\n        \"namespace\": \"*\"\n      },\n      {\n        \"id\": \"PaginatedTrait\",\n        \"namespace\": \"*\"\n      },\n      {\n        \"id\": \"HttpHeaderTrait\",\n        \"namespace\": \"*\"\n      },\n      {\n        \"id\": \"HttpUriConflict\",\n        \"namespace\": \"*\"\n      },\n      {\n        \"id\": \"Service\",\n        \"namespace\": \"*\"\n      }\n    ]\n  },\n  \"shapes\": {\n    \"com.amazonaws.dynamodb#ArchivalReason\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.dynamodb#ArchivalSummary\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"ArchivalDateTime\": {\n          \"target\": \"com.amazonaws.dynamodb#Date\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The date and time when table archival was initiated by DynamoDB,\\n         in UNIX epoch time format.</p>\"\n          }\n        },\n        \"ArchivalReason\": {\n          \"target\": \"com.amazonaws.dynamodb#ArchivalReason\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The reason DynamoDB archived the table. Currently, the only\\n         possible value is:</p>\\n\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>INACCESSIBLE_ENCRYPTION_CREDENTIALS</code> - The\\n         table was archived due to the table's AWS KMS key being inaccessible\\n         for more than seven days. An On-Demand backup was created at the archival\\n         time.</p>\\n            </li>\\n         </ul>\"\n          }\n        },\n        \"ArchivalBackupArn\": {\n          \"target\": \"com.amazonaws.dynamodb#BackupArn\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the backup the table was archived\\n         to, when applicable in the archival reason. If you wish to restore this\\n         backup to the same table name, you will need to delete the original\\n         table.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Contains details of a table archival operation.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#AttributeAction\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#enum\": [\n          {\n            \"value\": \"ADD\",\n            \"name\": \"ADD\"\n          },\n          {\n            \"value\": \"PUT\",\n            \"name\": \"PUT\"\n          },\n          {\n            \"value\": \"DELETE\",\n            \"name\": \"DELETE\"\n          }\n        ]\n      }\n    },\n    \"com.amazonaws.dynamodb#AttributeDefinition\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"AttributeName\": {\n          \"target\": \"com.amazonaws.dynamodb#KeySchemaAttributeName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A name for the attribute.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"AttributeType\": {\n          \"target\": \"com.amazonaws.dynamodb#ScalarAttributeType\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The data type for the attribute, where:</p>\\n         <ul>\\n            <li> \\n               <p>\\n                  <code>S</code> - the attribute is of type String</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>N</code> - the attribute is of type Number</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>B</code> - the attribute is of type Binary</p>\\n            </li>\\n         </ul>\",\n            \"smithy.api#required\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents an attribute for describing the key schema for the table and indexes.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#AttributeDefinitions\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.dynamodb#AttributeDefinition\"\n      }\n    },\n    \"com.amazonaws.dynamodb#AttributeMap\": {\n      \"type\": \"map\",\n      \"key\": {\n        \"target\": \"com.amazonaws.dynamodb#AttributeName\"\n      },\n      \"value\": {\n        \"target\": \"com.amazonaws.dynamodb#AttributeValue\"\n      }\n    },\n    \"com.amazonaws.dynamodb#AttributeName\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#length\": {\n          \"min\": 0,\n          \"max\": 65535\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#AttributeNameList\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.dynamodb#AttributeName\"\n      },\n      \"traits\": {\n        \"smithy.api#length\": {\n          \"min\": 1\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#AttributeUpdates\": {\n      \"type\": \"map\",\n      \"key\": {\n        \"target\": \"com.amazonaws.dynamodb#AttributeName\"\n      },\n      \"value\": {\n        \"target\": \"com.amazonaws.dynamodb#AttributeValueUpdate\"\n      }\n    },\n    \"com.amazonaws.dynamodb#AttributeValue\": {\n      \"type\": \"union\",\n      \"members\": {\n        \"S\": {\n          \"target\": \"com.amazonaws.dynamodb#StringAttributeValue\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>An attribute of type  String. For example:</p>\\n         <p>\\n            <code>\\\"S\\\": \\\"Hello\\\"</code>\\n         </p>\"\n          }\n        },\n        \"N\": {\n          \"target\": \"com.amazonaws.dynamodb#NumberAttributeValue\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>An attribute of type Number.  For example:</p>\\n         <p>\\n            <code>\\\"N\\\": \\\"123.45\\\"</code>\\n         </p>\\n         <p>Numbers are sent across the network to DynamoDB as strings, to maximize compatibility across languages and libraries. However, DynamoDB treats them as number type attributes for mathematical operations.</p>\"\n          }\n        },\n        \"B\": {\n          \"target\": \"com.amazonaws.dynamodb#BinaryAttributeValue\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>An attribute of type Binary.  For example:</p>\\n         <p>\\n            <code>\\\"B\\\": \\\"dGhpcyB0ZXh0IGlzIGJhc2U2NC1lbmNvZGVk\\\"</code>\\n         </p>\"\n          }\n        },\n        \"SS\": {\n          \"target\": \"com.amazonaws.dynamodb#StringSetAttributeValue\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>An attribute of type String Set.  For example:</p>\\n         <p>\\n            <code>\\\"SS\\\": [\\\"Giraffe\\\", \\\"Hippo\\\" ,\\\"Zebra\\\"]</code>\\n         </p>\"\n          }\n        },\n        \"NS\": {\n          \"target\": \"com.amazonaws.dynamodb#NumberSetAttributeValue\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>An attribute of type Number Set.  For example:</p>\\n         <p>\\n            <code>\\\"NS\\\": [\\\"42.2\\\", \\\"-19\\\", \\\"7.5\\\", \\\"3.14\\\"]</code>\\n         </p>\\n         <p>Numbers are sent across the network to DynamoDB as strings, to maximize compatibility across languages and libraries. However, DynamoDB treats them as number type attributes for mathematical operations.</p>\"\n          }\n        },\n        \"BS\": {\n          \"target\": \"com.amazonaws.dynamodb#BinarySetAttributeValue\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>An attribute of type Binary Set.  For example:</p>\\n         <p>\\n            <code>\\\"BS\\\": [\\\"U3Vubnk=\\\", \\\"UmFpbnk=\\\", \\\"U25vd3k=\\\"]</code>\\n         </p>\"\n          }\n        },\n        \"M\": {\n          \"target\": \"com.amazonaws.dynamodb#MapAttributeValue\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>An attribute of type Map.  For example:</p>\\n         <p>\\n            <code>\\\"M\\\": {\\\"Name\\\": {\\\"S\\\": \\\"Joe\\\"}, \\\"Age\\\": {\\\"N\\\": \\\"35\\\"}}</code>\\n         </p>\"\n          }\n        },\n        \"L\": {\n          \"target\": \"com.amazonaws.dynamodb#ListAttributeValue\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>An attribute of type List.  For example:</p>\\n         <p>\\n            <code>\\\"L\\\": [ {\\\"S\\\": \\\"Cookies\\\"} , {\\\"S\\\": \\\"Coffee\\\"}, {\\\"N\\\", \\\"3.14159\\\"}]</code>\\n         </p>\"\n          }\n        },\n        \"NULL\": {\n          \"target\": \"com.amazonaws.dynamodb#NullAttributeValue\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>An attribute of type Null.  For example:</p>\\n         <p>\\n            <code>\\\"NULL\\\": true</code>\\n         </p>\"\n          }\n        },\n        \"BOOL\": {\n          \"target\": \"com.amazonaws.dynamodb#BooleanAttributeValue\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>An attribute of type Boolean.  For example:</p>\\n         <p>\\n            <code>\\\"BOOL\\\": true</code>\\n         </p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents the data for an attribute.</p>\\n         <p>Each attribute value is described as a name-value pair.  The name is the data type, and the value is the data itself.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.NamingRulesDataTypes.html#HowItWorks.DataTypes\\\">Data Types</a> in the\\n                             <i>Amazon DynamoDB Developer Guide</i>.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#AttributeValueList\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.dynamodb#AttributeValue\"\n      }\n    },\n    \"com.amazonaws.dynamodb#AttributeValueUpdate\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Value\": {\n          \"target\": \"com.amazonaws.dynamodb#AttributeValue\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Represents the data for an attribute.</p>\\n         <p>Each attribute value is described as a name-value pair. The name is the data type, and the value is the data itself.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.NamingRulesDataTypes.html#HowItWorks.DataTypes\\\">Data Types</a> in the <i>Amazon DynamoDB Developer Guide</i>.\\n      </p>\"\n          }\n        },\n        \"Action\": {\n          \"target\": \"com.amazonaws.dynamodb#AttributeAction\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies how to perform the update. Valid values are <code>PUT</code> (default), <code>DELETE</code>,\\n      and <code>ADD</code>. The behavior depends on whether the specified primary key already exists\\n      in the table.</p>\\n\\n         <p>\\n            <b>If an item with the specified <i>Key</i> is found in the table:</b>\\n         </p>\\n\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>PUT</code> - Adds the specified attribute to the item. If the attribute already\\n          exists, it is replaced by the new value. </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>DELETE</code> - If no value is specified, the attribute and its value are removed\\n          from the item. The data type of the specified value must match the existing value's data\\n          type.</p>\\n               <p>If a <i>set</i> of values is specified, then those values are subtracted from the old\\n          set. For example, if the attribute value was the set <code>[a,b,c]</code> and the\\n            <code>DELETE</code> action specified <code>[a,c]</code>, then the final attribute value would\\n          be <code>[b]</code>. Specifying an empty set is an error.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ADD</code> - If the attribute does not already exist, then the attribute and its\\n          values are added to the item. If the attribute does exist, then the behavior of\\n            <code>ADD</code> depends on the data type of the attribute:</p>\\n               <ul>\\n                  <li>\\n                     <p>If the existing attribute is a number, and if <code>Value</code> is also a number, then the\\n                <code>Value</code> is mathematically added to the existing attribute. If <code>Value</code> is a\\n              negative number, then it is subtracted from the existing attribute.</p>\\n                     <note>\\n                        <p> If you use <code>ADD</code> to increment or decrement a number value for an item\\n                that doesn't exist before the update, DynamoDB uses 0 as the initial value.</p>\\n                        <p>In addition, if you use <code>ADD</code> to update an existing item, and intend to\\n                increment or decrement an attribute value which does not yet exist, DynamoDB uses\\n                  <code>0</code> as the initial value. For example, suppose that the item you want\\n                to update does not yet have an attribute named <i>itemcount</i>, but you decide to\\n                  <code>ADD</code> the number <code>3</code> to this attribute anyway, even though\\n                it currently does not exist. DynamoDB will create the <i>itemcount</i> attribute, set\\n                its initial value to <code>0</code>, and finally add <code>3</code> to it. The\\n                result will be a new <i>itemcount</i> attribute in the item, with a value of\\n                  <code>3</code>.</p>\\n                     </note>\\n                  </li>\\n                  <li>\\n                     <p>If the existing data type is a set, and if the <code>Value</code> is also a set, then the\\n                <code>Value</code> is added to the existing set. (This is a <i>set</i> operation, not\\n              mathematical addition.) For example, if the attribute value was the set\\n                <code>[1,2]</code>, and the <code>ADD</code> action specified <code>[3]</code>, then\\n              the final attribute value would be <code>[1,2,3]</code>. An error occurs if an Add\\n              action is specified for a set attribute and the attribute type specified does not\\n              match the existing set type. </p>\\n                     <p>Both sets must have the same primitive data type. For example, if the existing data\\n              type is a set of strings, the <code>Value</code> must also be a set of strings. The same\\n              holds true for number sets and binary sets.</p>\\n                  </li>\\n               </ul>\\n               <p>This action is only valid for an existing attribute whose data type is number or is a\\n          set. Do not use <code>ADD</code> for any other data types.</p>\\n            </li>\\n         </ul>\\n\\n         <p>\\n            <b>If no item with the specified <i>Key</i> is found:</b>\\n         </p>\\n\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>PUT</code> - DynamoDB creates a new item with the specified primary key, and then adds\\n          the attribute. </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>DELETE</code> - Nothing happens; there is no attribute to delete.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ADD</code> - DynamoDB creates an item with the supplied primary key and number (or set\\n          of numbers) for the attribute value. The only data types allowed are number and number\\n          set; no other data types can be specified.</p>\\n            </li>\\n         </ul>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>For the <code>UpdateItem</code> operation, represents the attributes to be modified, the action to\\n      perform on each, and the new value for each.</p>\\n         <note>\\n            <p>You cannot use <code>UpdateItem</code> to update any primary key attributes. Instead, you will\\n        need to delete the item, and then use <code>PutItem</code> to create a new item with new\\n        attributes.</p>\\n         </note>\\n         <p>Attribute values cannot be null; string and binary type attributes must have lengths greater\\n      than zero; and set type attributes must not be empty. Requests with empty values will be\\n      rejected with a <code>ValidationException</code> exception.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#AutoScalingPolicyDescription\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"PolicyName\": {\n          \"target\": \"com.amazonaws.dynamodb#AutoScalingPolicyName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the scaling policy.</p>\"\n          }\n        },\n        \"TargetTrackingScalingPolicyConfiguration\": {\n          \"target\": \"com.amazonaws.dynamodb#AutoScalingTargetTrackingScalingPolicyConfigurationDescription\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Represents a target tracking scaling policy configuration.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents the properties of the scaling policy.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#AutoScalingPolicyDescriptionList\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.dynamodb#AutoScalingPolicyDescription\"\n      }\n    },\n    \"com.amazonaws.dynamodb#AutoScalingPolicyName\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#length\": {\n          \"min\": 1,\n          \"max\": 256\n        },\n        \"smithy.api#pattern\": \"\\\\p{Print}+\"\n      }\n    },\n    \"com.amazonaws.dynamodb#AutoScalingPolicyUpdate\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"PolicyName\": {\n          \"target\": \"com.amazonaws.dynamodb#AutoScalingPolicyName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the scaling policy.</p>\"\n          }\n        },\n        \"TargetTrackingScalingPolicyConfiguration\": {\n          \"target\": \"com.amazonaws.dynamodb#AutoScalingTargetTrackingScalingPolicyConfigurationUpdate\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Represents a target tracking scaling policy configuration.</p>\",\n            \"smithy.api#required\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents the auto scaling policy to be modified.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#AutoScalingRoleArn\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#length\": {\n          \"min\": 1,\n          \"max\": 1600\n        },\n        \"smithy.api#pattern\": \"[\\\\u0020-\\\\uD7FF\\\\uE000-\\\\uFFFD\\\\uD800\\\\uDC00-\\\\uDBFF\\\\uDFFF\\\\r\\\\n\\\\t]*\"\n      }\n    },\n    \"com.amazonaws.dynamodb#AutoScalingSettingsDescription\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"MinimumUnits\": {\n          \"target\": \"com.amazonaws.dynamodb#PositiveLongObject\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The minimum capacity units that a global table or global secondary index should be scaled down to.</p>\"\n          }\n        },\n        \"MaximumUnits\": {\n          \"target\": \"com.amazonaws.dynamodb#PositiveLongObject\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The maximum capacity units that a global table or global secondary index should be scaled up to.</p>\"\n          }\n        },\n        \"AutoScalingDisabled\": {\n          \"target\": \"com.amazonaws.dynamodb#BooleanObject\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Disabled auto scaling for this global table or global secondary index.</p>\"\n          }\n        },\n        \"AutoScalingRoleArn\": {\n          \"target\": \"com.amazonaws.dynamodb#String\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Role ARN used for configuring the auto scaling policy.</p>\"\n          }\n        },\n        \"ScalingPolicies\": {\n          \"target\": \"com.amazonaws.dynamodb#AutoScalingPolicyDescriptionList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Information about the scaling policies.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents the auto scaling settings for a global table or global secondary\\n         index.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#AutoScalingSettingsUpdate\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"MinimumUnits\": {\n          \"target\": \"com.amazonaws.dynamodb#PositiveLongObject\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The minimum capacity units that a global table or global secondary index should be scaled down to.</p>\"\n          }\n        },\n        \"MaximumUnits\": {\n          \"target\": \"com.amazonaws.dynamodb#PositiveLongObject\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The maximum capacity units that a global table or global secondary index should be scaled up to.</p>\"\n          }\n        },\n        \"AutoScalingDisabled\": {\n          \"target\": \"com.amazonaws.dynamodb#BooleanObject\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Disabled auto scaling for this global table or global secondary index.</p>\"\n          }\n        },\n        \"AutoScalingRoleArn\": {\n          \"target\": \"com.amazonaws.dynamodb#AutoScalingRoleArn\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Role ARN used for configuring auto scaling policy.</p>\"\n          }\n        },\n        \"ScalingPolicyUpdate\": {\n          \"target\": \"com.amazonaws.dynamodb#AutoScalingPolicyUpdate\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The scaling policy to apply for scaling target global table or global secondary index capacity units.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents the auto scaling settings to be modified for a global table or global\\n         secondary index.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#AutoScalingTargetTrackingScalingPolicyConfigurationDescription\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"DisableScaleIn\": {\n          \"target\": \"com.amazonaws.dynamodb#BooleanObject\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Indicates whether scale in by the target tracking policy is disabled. If the value is true,\\n      scale in is disabled and the target tracking policy won't remove capacity from the scalable resource.\\n      Otherwise, scale in is enabled and the target tracking policy can remove capacity from the scalable resource.\\n      The default value is false.</p>\"\n          }\n        },\n        \"ScaleInCooldown\": {\n          \"target\": \"com.amazonaws.dynamodb#IntegerObject\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The amount of time, in seconds, after a scale in activity completes before another scale\\n         in activity can start. The cooldown period is used to block subsequent scale in requests\\n         until it has expired. You should scale in conservatively to protect your application's\\n         availability. However, if another alarm triggers a scale out policy during the cooldown\\n         period after a scale-in, application auto scaling scales out your scalable target\\n         immediately. </p>\"\n          }\n        },\n        \"ScaleOutCooldown\": {\n          \"target\": \"com.amazonaws.dynamodb#IntegerObject\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The amount of time, in seconds, after a scale out activity completes before another scale out\\n      activity can start. While the cooldown period is in effect, the capacity that has been added\\n      by the previous scale out event that initiated the cooldown is calculated as part of the\\n      desired capacity for the next scale out. You should continuously (but not excessively)\\n      scale out.</p>\"\n          }\n        },\n        \"TargetValue\": {\n          \"target\": \"com.amazonaws.dynamodb#Double\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The target value for the metric. The range is 8.515920e-109 to 1.174271e+108 (Base 10) or 2e-360 to 2e360 (Base 2).</p>\",\n            \"smithy.api#required\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents the properties of a target tracking scaling policy.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#AutoScalingTargetTrackingScalingPolicyConfigurationUpdate\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"DisableScaleIn\": {\n          \"target\": \"com.amazonaws.dynamodb#BooleanObject\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Indicates whether scale in by the target tracking policy is disabled. If the value is true,\\n      scale in is disabled and the target tracking policy won't remove capacity from the scalable resource.\\n      Otherwise, scale in is enabled and the target tracking policy can remove capacity from the scalable resource.\\n      The default value is false.</p>\"\n          }\n        },\n        \"ScaleInCooldown\": {\n          \"target\": \"com.amazonaws.dynamodb#IntegerObject\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The amount of time, in seconds, after a scale in activity completes before another scale\\n         in activity can start. The cooldown period is used to block subsequent scale in requests\\n         until it has expired. You should scale in conservatively to protect your application's\\n         availability. However, if another alarm triggers a scale out policy during the cooldown\\n         period after a scale-in, application auto scaling scales out your scalable target\\n         immediately. </p>\"\n          }\n        },\n        \"ScaleOutCooldown\": {\n          \"target\": \"com.amazonaws.dynamodb#IntegerObject\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The amount of time, in seconds, after a scale out activity completes before another scale out\\n      activity can start. While the cooldown period is in effect, the capacity that has been added\\n      by the previous scale out event that initiated the cooldown is calculated as part of the\\n      desired capacity for the next scale out. You should continuously (but not excessively)\\n      scale out.</p>\"\n          }\n        },\n        \"TargetValue\": {\n          \"target\": \"com.amazonaws.dynamodb#Double\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The target value for the metric. The range is 8.515920e-109 to 1.174271e+108 (Base 10) or 2e-360 to 2e360 (Base 2).</p>\",\n            \"smithy.api#required\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents the settings of a target tracking scaling policy that will be modified.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#Backfilling\": {\n      \"type\": \"boolean\",\n      \"traits\": {\n        \"smithy.api#box\": {}\n      }\n    },\n    \"com.amazonaws.dynamodb#BackupArn\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#length\": {\n          \"min\": 37,\n          \"max\": 1024\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#BackupCreationDateTime\": {\n      \"type\": \"timestamp\"\n    },\n    \"com.amazonaws.dynamodb#BackupDescription\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"BackupDetails\": {\n          \"target\": \"com.amazonaws.dynamodb#BackupDetails\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Contains the details of the backup created for the table. </p>\"\n          }\n        },\n        \"SourceTableDetails\": {\n          \"target\": \"com.amazonaws.dynamodb#SourceTableDetails\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Contains the details of the table when the backup was created. </p>\"\n          }\n        },\n        \"SourceTableFeatureDetails\": {\n          \"target\": \"com.amazonaws.dynamodb#SourceTableFeatureDetails\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Contains the details of the features enabled on the table when the backup was created. For example, LSIs, GSIs, streams, TTL.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Contains the description of the backup created for the table.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#BackupDetails\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"BackupArn\": {\n          \"target\": \"com.amazonaws.dynamodb#BackupArn\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>ARN associated with the backup.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"BackupName\": {\n          \"target\": \"com.amazonaws.dynamodb#BackupName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Name of the requested backup.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"BackupSizeBytes\": {\n          \"target\": \"com.amazonaws.dynamodb#BackupSizeBytes\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Size of the backup in bytes.</p>\"\n          }\n        },\n        \"BackupStatus\": {\n          \"target\": \"com.amazonaws.dynamodb#BackupStatus\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Backup can be in one of the following states: CREATING, ACTIVE, DELETED. </p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"BackupType\": {\n          \"target\": \"com.amazonaws.dynamodb#BackupType\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>BackupType:</p>\\n          <ul>\\n            <li>\\n                <p>\\n                  <code>USER</code> - You create and manage these using the on-demand backup feature.</p>\\n            </li>\\n            <li>\\n                <p>\\n                  <code>SYSTEM</code> - If you delete a table with point-in-time recovery enabled, a <code>SYSTEM</code> backup is automatically\\n                created and is retained for 35 days (at no additional cost). System backups allow you to restore the deleted \\n\\t\\ttable to the state it was in just before the point of deletion.\\n\\t\\t</p>\\n            </li>\\n            <li>\\n                <p>\\n                  <code>AWS_BACKUP</code> - On-demand backup created by you from AWS Backup service.</p>\\n            </li>\\n         </ul>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"BackupCreationDateTime\": {\n          \"target\": \"com.amazonaws.dynamodb#BackupCreationDateTime\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Time at which the backup was created. This is the request time of the backup. </p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"BackupExpiryDateTime\": {\n          \"target\": \"com.amazonaws.dynamodb#Date\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Time at which the automatic on-demand backup created by DynamoDB will expire. This <code>SYSTEM</code>\\n      on-demand backup expires automatically 35 days after its creation.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Contains the details of the backup created for the table.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#BackupInUseException\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"message\": {\n          \"target\": \"com.amazonaws.dynamodb#ErrorMessage\"\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>There is another ongoing conflicting backup control plane operation on the table. The backup is either being created, deleted or restored to a table.</p>\",\n        \"smithy.api#error\": \"client\"\n      }\n    },\n    \"com.amazonaws.dynamodb#BackupName\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#length\": {\n          \"min\": 3,\n          \"max\": 255\n        },\n        \"smithy.api#pattern\": \"[a-zA-Z0-9_.-]+\"\n      }\n    },\n    \"com.amazonaws.dynamodb#BackupNotFoundException\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"message\": {\n          \"target\": \"com.amazonaws.dynamodb#ErrorMessage\"\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Backup not found for the given BackupARN. </p>\",\n        \"smithy.api#error\": \"client\"\n      }\n    },\n    \"com.amazonaws.dynamodb#BackupSizeBytes\": {\n      \"type\": \"long\",\n      \"traits\": {\n        \"smithy.api#box\": {},\n        \"smithy.api#range\": {\n          \"min\": 0\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#BackupStatus\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#enum\": [\n          {\n            \"value\": \"CREATING\",\n            \"name\": \"CREATING\"\n          },\n          {\n            \"value\": \"DELETED\",\n            \"name\": \"DELETED\"\n          },\n          {\n            \"value\": \"AVAILABLE\",\n            \"name\": \"AVAILABLE\"\n          }\n        ]\n      }\n    },\n    \"com.amazonaws.dynamodb#BackupSummaries\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.dynamodb#BackupSummary\"\n      }\n    },\n    \"com.amazonaws.dynamodb#BackupSummary\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"TableName\": {\n          \"target\": \"com.amazonaws.dynamodb#TableName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Name of the table.</p>\"\n          }\n        },\n        \"TableId\": {\n          \"target\": \"com.amazonaws.dynamodb#TableId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Unique identifier for the table.</p>\"\n          }\n        },\n        \"TableArn\": {\n          \"target\": \"com.amazonaws.dynamodb#TableArn\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>ARN associated with the table.</p>\"\n          }\n        },\n        \"BackupArn\": {\n          \"target\": \"com.amazonaws.dynamodb#BackupArn\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>ARN associated with the backup.</p>\"\n          }\n        },\n        \"BackupName\": {\n          \"target\": \"com.amazonaws.dynamodb#BackupName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Name of the specified backup.</p>\"\n          }\n        },\n        \"BackupCreationDateTime\": {\n          \"target\": \"com.amazonaws.dynamodb#BackupCreationDateTime\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Time at which the backup was created.</p>\"\n          }\n        },\n        \"BackupExpiryDateTime\": {\n          \"target\": \"com.amazonaws.dynamodb#Date\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Time at which the automatic on-demand backup created by DynamoDB will expire. This\\n            <code>SYSTEM</code> on-demand backup expires automatically 35 days after its\\n         creation.</p>\"\n          }\n        },\n        \"BackupStatus\": {\n          \"target\": \"com.amazonaws.dynamodb#BackupStatus\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Backup can be in one of the following states: CREATING, ACTIVE, DELETED.</p>\"\n          }\n        },\n        \"BackupType\": {\n          \"target\": \"com.amazonaws.dynamodb#BackupType\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>BackupType:</p>\\n        <ul>\\n            <li>\\n                <p>\\n                  <code>USER</code> - You create and manage these using the on-demand backup feature.</p>\\n            </li>\\n            <li>\\n                <p>\\n                  <code>SYSTEM</code> - If you delete a table with point-in-time recovery enabled, a <code>SYSTEM</code> backup is automatically\\n                created and is retained for 35 days (at no additional cost). System backups allow you to restore the deleted \\n\\t\\ttable to the state it was in just before the point of deletion.\\n\\t\\t</p>\\n            </li>\\n            <li>\\n                <p>\\n                  <code>AWS_BACKUP</code> - On-demand backup created by you from AWS Backup service.</p>\\n            </li>\\n         </ul>\"\n          }\n        },\n        \"BackupSizeBytes\": {\n          \"target\": \"com.amazonaws.dynamodb#BackupSizeBytes\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Size of the backup in bytes.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Contains details for the backup.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#BackupType\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#enum\": [\n          {\n            \"value\": \"USER\",\n            \"name\": \"USER\"\n          },\n          {\n            \"value\": \"SYSTEM\",\n            \"name\": \"SYSTEM\"\n          },\n          {\n            \"value\": \"AWS_BACKUP\",\n            \"name\": \"AWS_BACKUP\"\n          }\n        ]\n      }\n    },\n    \"com.amazonaws.dynamodb#BackupTypeFilter\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#enum\": [\n          {\n            \"value\": \"USER\",\n            \"name\": \"USER\"\n          },\n          {\n            \"value\": \"SYSTEM\",\n            \"name\": \"SYSTEM\"\n          },\n          {\n            \"value\": \"AWS_BACKUP\",\n            \"name\": \"AWS_BACKUP\"\n          },\n          {\n            \"value\": \"ALL\",\n            \"name\": \"ALL\"\n          }\n        ]\n      }\n    },\n    \"com.amazonaws.dynamodb#BackupsInputLimit\": {\n      \"type\": \"integer\",\n      \"traits\": {\n        \"smithy.api#box\": {},\n        \"smithy.api#range\": {\n          \"min\": 1,\n          \"max\": 100\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#BatchExecuteStatement\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.dynamodb#BatchExecuteStatementInput\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.dynamodb#BatchExecuteStatementOutput\"\n      },\n      \"errors\": [\n        {\n          \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#RequestLimitExceeded\"\n        }\n      ],\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>\\nThis operation allows you to perform batch reads and writes on data stored in DynamoDB, using PartiQL.\\n</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#BatchExecuteStatementInput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Statements\": {\n          \"target\": \"com.amazonaws.dynamodb#PartiQLBatchRequest\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>\\nThe list of PartiQL statements representing the batch to run.\\n</p>\",\n            \"smithy.api#required\": {}\n          }\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#BatchExecuteStatementOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Responses\": {\n          \"target\": \"com.amazonaws.dynamodb#PartiQLBatchResponse\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>\\nThe response to each PartiQL statement in the batch.\\n</p>\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#BatchGetItem\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.dynamodb#BatchGetItemInput\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.dynamodb#BatchGetItemOutput\"\n      },\n      \"errors\": [\n        {\n          \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#InvalidEndpointException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#ProvisionedThroughputExceededException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#RequestLimitExceeded\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#ResourceNotFoundException\"\n        }\n      ],\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>The <code>BatchGetItem</code> operation returns the attributes of one or more items from one or\\n      more tables. You identify requested items by primary key.</p>\\n         <p>A single operation can retrieve up to 16 MB of data, which can contain as many as 100\\n            items. <code>BatchGetItem</code> returns a partial result if the response size limit is\\n            exceeded, the table's provisioned throughput is exceeded, or an internal processing\\n            failure occurs. If a partial result is returned, the operation returns a value for\\n                <code>UnprocessedKeys</code>. You can use this value to retry the operation starting\\n            with the next item to get.</p>\\n         <important>\\n            <p>If you request more than 100 items, <code>BatchGetItem</code> returns a\\n                    <code>ValidationException</code> with the message \\\"Too many items requested for\\n                the BatchGetItem call.\\\"</p>\\n         </important>\\n         <p>For example, if you ask to retrieve 100 items, but each individual item is 300 KB in\\n            size, the system returns 52 items (so as not to exceed the 16 MB limit). It also returns\\n            an appropriate <code>UnprocessedKeys</code> value so you can get the next page of\\n            results. If desired, your application can include its own logic to assemble the pages of\\n            results into one dataset.</p>\\n         <p>If <i>none</i> of the items can be processed due to insufficient\\n            provisioned throughput on all of the tables in the request, then\\n                <code>BatchGetItem</code> returns a\\n                <code>ProvisionedThroughputExceededException</code>. If <i>at least\\n                one</i> of the items is successfully processed, then\\n                <code>BatchGetItem</code> completes successfully, while returning the keys of the\\n            unread items in <code>UnprocessedKeys</code>.</p>\\n         <important>\\n            <p>If DynamoDB returns any unprocessed items, you should retry the batch operation on those\\n        items. However, <i>we strongly recommend that you use an exponential backoff algorithm</i>.\\n        If you retry the batch operation immediately, the underlying read or write requests can\\n        still fail due to throttling on the individual tables. If you delay the batch operation\\n        using exponential backoff, the individual requests in the batch are much more likely to\\n        succeed.</p>\\n            <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ErrorHandling.html#BatchOperations\\\">Batch\\n          Operations and Error Handling</a> in the <i>Amazon DynamoDB Developer Guide</i>.</p>\\n         </important>\\n         <p>By default, <code>BatchGetItem</code> performs eventually consistent reads on every table in the\\n      request. If you want strongly consistent reads instead, you can set <code>ConsistentRead</code> to\\n        <code>true</code> for any or all tables.</p>\\n         <p>In order to minimize response latency, <code>BatchGetItem</code> retrieves items in parallel.</p>\\n         <p>When designing your application, keep in mind that DynamoDB does not return items in any\\n      particular order. To help parse the response by item, include the primary key values for the\\n      items in your request in the <code>ProjectionExpression</code> parameter.</p>\\n         <p>If a requested item does not exist, it is not returned in the result. Requests for\\n            nonexistent items consume the minimum read capacity units according to the type of read.\\n            For more information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/WorkingWithTables.html#CapacityUnitCalculations\\\">Working with Tables</a> in the <i>Amazon DynamoDB Developer\\n                Guide</i>.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#BatchGetItemInput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"RequestItems\": {\n          \"target\": \"com.amazonaws.dynamodb#BatchGetRequestMap\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A map of one or more table names and, for each table, a map that describes one or more items to retrieve from that table. Each table name can be used only once per <code>BatchGetItem</code> request.</p>\\n         <p>Each element in the map of items to retrieve consists of the following:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>ConsistentRead</code> - If <code>true</code>, a strongly consistent read is used; if\\n          <code>false</code> (the default), an eventually consistent read is used.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ExpressionAttributeNames</code> - One or more substitution tokens for attribute names in the <code>ProjectionExpression</code> parameter. The following are some use cases for using <code>ExpressionAttributeNames</code>:</p>\\n               <ul>\\n                  <li>\\n                     <p>To access an attribute whose name conflicts with a DynamoDB reserved word.</p>\\n                  </li>\\n                  <li>\\n                     <p>To create a placeholder for repeating occurrences of an attribute name in an expression.</p>\\n                  </li>\\n                  <li>\\n                     <p>To prevent special characters in an attribute name from being misinterpreted in an expression.</p>\\n                  </li>\\n               </ul>\\n               <p>Use the <b>#</b> character in an expression to dereference an attribute name. For example, consider the following attribute name:</p>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <code>Percentile</code>\\n                     </p>\\n                  </li>\\n               </ul>\\n               <p>The name of this attribute conflicts with a reserved word, so it cannot be used directly in an expression. (For the complete list of reserved words, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ReservedWords.html\\\">Reserved Words</a> in the <i>Amazon DynamoDB Developer Guide</i>). To work around this, you could specify the following for <code>ExpressionAttributeNames</code>:</p>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <code>{\\\"#P\\\":\\\"Percentile\\\"}</code>\\n                     </p>\\n                  </li>\\n               </ul>\\n               <p>You could then use this substitution in an expression, as in this example:</p>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <code>#P = :val</code>\\n                     </p>\\n                  </li>\\n               </ul>\\n               <note>\\n                  <p>Tokens that begin with the <b>:</b> character are <i>expression attribute values</i>, which are placeholders for the actual value at runtime.</p>\\n               </note>\\n               <p>For more information about expression attribute names, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.AccessingItemAttributes.html\\\">Accessing Item Attributes</a> in the <i>Amazon DynamoDB\\n                        Developer Guide</i>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>Keys</code> - An array of primary key attribute values that define specific items in the\\n          table. For each primary key, you must provide <i>all</i> of the key attributes. For\\n          example, with a simple primary key, you only need to provide the partition key value. For a\\n          composite key, you must provide <i>both</i> the partition key value and the sort key value.</p>\\n            </li>\\n            <li>\\n                <p>\\n                    <code>ProjectionExpression</code> - A string that identifies one or more\\n                    attributes to retrieve from the table. These attributes can include scalars,\\n                    sets, or elements of a JSON document. The attributes in the expression must be\\n                    separated by commas.</p>\\n                <p>If no attribute names are specified, then all attributes are returned. If any\\n                    of the requested attributes are not found, they do not appear in the\\n                    result.</p>\\n               <p>For more information, see\\n                    <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.AccessingItemAttributes.html\\\">Accessing Item Attributes</a> in the <i>Amazon DynamoDB Developer Guide</i>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>AttributesToGet</code> - This is a legacy parameter.  Use <code>ProjectionExpression</code> instead.  For more information, see\\n                    <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/LegacyConditionalParameters.AttributesToGet.html\\\">AttributesToGet</a> in the <i>Amazon DynamoDB Developer Guide</i>.\\n\\n            </p>\\n\\n            </li>\\n         </ul>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"ReturnConsumedCapacity\": {\n          \"target\": \"com.amazonaws.dynamodb#ReturnConsumedCapacity\"\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents the input of a <code>BatchGetItem</code> operation.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#BatchGetItemOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Responses\": {\n          \"target\": \"com.amazonaws.dynamodb#BatchGetResponseMap\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A map of table name to a list of items. Each object in <code>Responses</code> consists of a table\\n      name, along with a map of attribute data consisting of the data type and attribute value.</p>\"\n          }\n        },\n        \"UnprocessedKeys\": {\n          \"target\": \"com.amazonaws.dynamodb#BatchGetRequestMap\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A map of tables and their respective keys that were not processed with the current response.\\n      The <code>UnprocessedKeys</code> value is in the same form as <code>RequestItems</code>, so the value can\\n      be provided directly to a subsequent <code>BatchGetItem</code> operation. For more information, see\\n        <code>RequestItems</code> in the Request Parameters section.</p>\\n         <p>Each element consists of:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>Keys</code> - An array of primary key attribute values that define specific items in the\\n          table.</p>\\n            </li>\\n            <li>\\n               <p>\\n                    <code>ProjectionExpression</code> - One or more attributes to be\\n                    retrieved from the table or index. By default, all attributes are returned. If a\\n                    requested attribute is not found, it does not appear in the result.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ConsistentRead</code> - The consistency of a read operation. If set to <code>true</code>,\\n          then a strongly consistent read is used; otherwise, an eventually consistent read is\\n          used.</p>\\n            </li>\\n         </ul>\\n         <p>If there are no unprocessed keys remaining, the response contains an empty\\n        <code>UnprocessedKeys</code> map.</p>\"\n          }\n        },\n        \"ConsumedCapacity\": {\n          \"target\": \"com.amazonaws.dynamodb#ConsumedCapacityMultiple\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The read capacity units consumed by the entire <code>BatchGetItem</code> operation.</p>\\n         <p>Each element consists of:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>TableName</code> - The table that consumed the provisioned throughput.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>CapacityUnits</code> - The total number of capacity units consumed.</p>\\n            </li>\\n         </ul>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents the output of a <code>BatchGetItem</code> operation.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#BatchGetRequestMap\": {\n      \"type\": \"map\",\n      \"key\": {\n        \"target\": \"com.amazonaws.dynamodb#TableName\"\n      },\n      \"value\": {\n        \"target\": \"com.amazonaws.dynamodb#KeysAndAttributes\"\n      },\n      \"traits\": {\n        \"smithy.api#length\": {\n          \"min\": 1,\n          \"max\": 100\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#BatchGetResponseMap\": {\n      \"type\": \"map\",\n      \"key\": {\n        \"target\": \"com.amazonaws.dynamodb#TableName\"\n      },\n      \"value\": {\n        \"target\": \"com.amazonaws.dynamodb#ItemList\"\n      }\n    },\n    \"com.amazonaws.dynamodb#BatchStatementError\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Code\": {\n          \"target\": \"com.amazonaws.dynamodb#BatchStatementErrorCodeEnum\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>\\nThe error code associated with the failed PartiQL batch statement.\\n</p>\"\n          }\n        },\n        \"Message\": {\n          \"target\": \"com.amazonaws.dynamodb#String\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>\\nThe error message associated with the PartiQL batch resposne.\\n</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>\\nAn error associated with a statement in a PartiQL batch that was run.\\n</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#BatchStatementErrorCodeEnum\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#enum\": [\n          {\n            \"value\": \"ConditionalCheckFailed\",\n            \"name\": \"ConditionalCheckFailed\"\n          },\n          {\n            \"value\": \"ItemCollectionSizeLimitExceeded\",\n            \"name\": \"ItemCollectionSizeLimitExceeded\"\n          },\n          {\n            \"value\": \"RequestLimitExceeded\",\n            \"name\": \"RequestLimitExceeded\"\n          },\n          {\n            \"value\": \"ValidationError\",\n            \"name\": \"ValidationError\"\n          },\n          {\n            \"value\": \"ProvisionedThroughputExceeded\",\n            \"name\": \"ProvisionedThroughputExceeded\"\n          },\n          {\n            \"value\": \"TransactionConflict\",\n            \"name\": \"TransactionConflict\"\n          },\n          {\n            \"value\": \"ThrottlingError\",\n            \"name\": \"ThrottlingError\"\n          },\n          {\n            \"value\": \"InternalServerError\",\n            \"name\": \"InternalServerError\"\n          },\n          {\n            \"value\": \"ResourceNotFound\",\n            \"name\": \"ResourceNotFound\"\n          },\n          {\n            \"value\": \"AccessDenied\",\n            \"name\": \"AccessDenied\"\n          },\n          {\n            \"value\": \"DuplicateItem\",\n            \"name\": \"DuplicateItem\"\n          }\n        ]\n      }\n    },\n    \"com.amazonaws.dynamodb#BatchStatementRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Statement\": {\n          \"target\": \"com.amazonaws.dynamodb#PartiQLStatement\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>\\nA valid PartiQL statement.\\n</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"Parameters\": {\n          \"target\": \"com.amazonaws.dynamodb#PreparedStatementParameters\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>\\nThe parameters associated with a PartiQL statement in the batch request.\\n</p>\"\n          }\n        },\n        \"ConsistentRead\": {\n          \"target\": \"com.amazonaws.dynamodb#ConsistentRead\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>\\nThe read consistency of the PartiQL batch request. \\n</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>\\nA PartiQL batch statement request. \\n</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#BatchStatementResponse\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Error\": {\n          \"target\": \"com.amazonaws.dynamodb#BatchStatementError\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>\\nThe error associated with a failed PartiQL batch statement.\\n</p>\"\n          }\n        },\n        \"TableName\": {\n          \"target\": \"com.amazonaws.dynamodb#TableName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>\\nThe table name associated with a failed PartiQL batch statement.\\n</p>\"\n          }\n        },\n        \"Item\": {\n          \"target\": \"com.amazonaws.dynamodb#AttributeMap\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>\\nA DynamoDB item associated with a BatchStatementResponse\\n</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>\\nA PartiQL batch statement response..\\n</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#BatchWriteItem\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.dynamodb#BatchWriteItemInput\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.dynamodb#BatchWriteItemOutput\"\n      },\n      \"errors\": [\n        {\n          \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#InvalidEndpointException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#ItemCollectionSizeLimitExceededException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#ProvisionedThroughputExceededException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#RequestLimitExceeded\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#ResourceNotFoundException\"\n        }\n      ],\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>The <code>BatchWriteItem</code> operation puts or deletes multiple items in one or more\\n            tables. A single call to <code>BatchWriteItem</code> can write up to 16 MB of data,\\n            which can comprise as many as 25 put or delete requests. Individual items to be written\\n            can be as large as 400 KB.</p>\\n         <note>\\n            <p>\\n               <code>BatchWriteItem</code> cannot update items. To update items, use the <code>UpdateItem</code>\\n        action.</p>\\n         </note>\\n         <p>The individual <code>PutItem</code> and <code>DeleteItem</code> operations specified in\\n        <code>BatchWriteItem</code> are atomic; however <code>BatchWriteItem</code> as a whole is not. If any\\n      requested operations fail because the table's provisioned throughput is exceeded or an\\n      internal processing failure occurs, the failed operations are returned in the\\n        <code>UnprocessedItems</code> response parameter. You can investigate and optionally resend the\\n      requests. Typically, you would call <code>BatchWriteItem</code> in a loop. Each iteration would\\n      check for unprocessed items and submit a new <code>BatchWriteItem</code> request with those\\n      unprocessed items until all items have been processed.</p>\\n         <p>If <i>none</i> of the items can be processed due to insufficient\\n            provisioned throughput on all of the tables in the request, then\\n                <code>BatchWriteItem</code> returns a\\n                <code>ProvisionedThroughputExceededException</code>.</p>\\n         <important>\\n            <p>If DynamoDB returns any unprocessed items, you should retry the batch operation on those\\n        items. However, <i>we strongly recommend that you use an exponential backoff algorithm</i>.\\n        If you retry the batch operation immediately, the underlying read or write requests can\\n        still fail due to throttling on the individual tables. If you delay the batch operation\\n        using exponential backoff, the individual requests in the batch are much more likely to\\n        succeed.</p>\\n            <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ErrorHandling.html#Programming.Errors.BatchOperations\\\">Batch Operations and Error Handling</a> in the <i>Amazon DynamoDB\\n                    Developer Guide</i>.</p>\\n         </important>\\n\\n         <p>With <code>BatchWriteItem</code>, you can efficiently write or delete large amounts of\\n            data, such as from Amazon EMR, or copy data from another database into DynamoDB. In\\n            order to improve performance with these large-scale operations,\\n                <code>BatchWriteItem</code> does not behave in the same way as individual\\n                <code>PutItem</code> and <code>DeleteItem</code> calls would. For example, you\\n            cannot specify conditions on individual put and delete requests, and\\n                <code>BatchWriteItem</code> does not return deleted items in the response.</p>\\n         <p>If you use a programming language that supports concurrency, you can use\\n      threads to write items in parallel. Your application must include the necessary logic to\\n      manage the threads. With languages that don't support threading, you must update\\n      or delete the specified items one at a time. In both situations, <code>BatchWriteItem</code>\\n      performs the specified put and delete operations in\\n      parallel, giving you the power of the thread pool approach without having to introduce\\n      complexity into your application.</p>\\n         <p>Parallel processing reduces latency, but each specified put and delete request consumes the same number of write capacity units whether it is processed in parallel or not. Delete operations on nonexistent items consume one write capacity unit.</p>\\n         <p>If one or more of the following is true, DynamoDB rejects the entire batch write operation:</p>\\n         <ul>\\n            <li>\\n               <p>One or more tables specified in the <code>BatchWriteItem</code> request does not exist.</p>\\n            </li>\\n            <li>\\n               <p>Primary key attributes specified on an item in the request do not match those in the corresponding table's primary key schema.</p>\\n            </li>\\n            <li>\\n               <p>You try to perform multiple operations on the same item in the same <code>BatchWriteItem</code>\\n          request. For example, you cannot put and delete the same item in the same\\n            <code>BatchWriteItem</code> request. </p>\\n            </li>\\n            <li>\\n\\t              <p>\\n\\t\\tYour request contains at least two items with identical hash and range keys (which essentially is two put operations).\\n\\t    </p>\\n    \\t       </li>\\n            <li>\\n               <p>There are more than 25 requests in the batch.</p>\\n            </li>\\n            <li>\\n               <p>Any individual item in a batch exceeds 400 KB.</p>\\n            </li>\\n            <li>\\n               <p>The total request size exceeds 16 MB.</p>\\n            </li>\\n         </ul>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#BatchWriteItemInput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"RequestItems\": {\n          \"target\": \"com.amazonaws.dynamodb#BatchWriteItemRequestMap\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A map of one or more table names and, for each table, a list of operations to be performed\\n        (<code>DeleteRequest</code> or <code>PutRequest</code>). Each element in the map consists of the\\n      following:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>DeleteRequest</code> - Perform a <code>DeleteItem</code> operation on the specified item. The\\n          item to be deleted is identified by a <code>Key</code> subelement:</p>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <code>Key</code> - A map of primary key attribute values that uniquely identify the item.\\n                     Each entry in this map consists of an attribute name and an attribute value. For each\\n                     primary key, you must provide <i>all</i> of the key attributes. For example, with a\\n                     simple primary key, you only need to provide a value for the partition key. For a\\n                     composite primary key, you must provide values for <i>both</i> the partition key and the sort key.</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>PutRequest</code> - Perform a <code>PutItem</code> operation on the specified item. The item to\\n          be put is identified by an <code>Item</code> subelement:</p>\\n               <ul>\\n                  <li>\\n                     <p>\\n                            <code>Item</code> - A map of attributes and their values. Each entry in\\n                            this map consists of an attribute name and an attribute value. Attribute\\n                            values must not be null; string and binary type attributes must have\\n                            lengths greater than zero; and set type attributes must not be empty.\\n                            Requests that contain empty values are rejected with a\\n                                <code>ValidationException</code> exception.</p>\\n                     <p>If you specify any attributes that are part of an index key, then the data types for those attributes must match those of the schema in the table's attribute definition.</p>\\n                  </li>\\n               </ul>\\n            </li>\\n         </ul>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"ReturnConsumedCapacity\": {\n          \"target\": \"com.amazonaws.dynamodb#ReturnConsumedCapacity\"\n        },\n        \"ReturnItemCollectionMetrics\": {\n          \"target\": \"com.amazonaws.dynamodb#ReturnItemCollectionMetrics\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Determines whether item collection metrics are returned.  If set to <code>SIZE</code>, the response includes statistics about item collections, if any, that were modified during\\n      the operation are returned in the response. If set to <code>NONE</code> (the default), no statistics are returned.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents the input of a <code>BatchWriteItem</code> operation.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#BatchWriteItemOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"UnprocessedItems\": {\n          \"target\": \"com.amazonaws.dynamodb#BatchWriteItemRequestMap\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A map of tables and requests against those tables that were not processed. The\\n        <code>UnprocessedItems</code> value is in the same form as <code>RequestItems</code>, so you can provide\\n      this value directly to a subsequent <code>BatchGetItem</code> operation. For more information, see\\n        <code>RequestItems</code> in the Request Parameters section.</p>\\n         <p>Each <code>UnprocessedItems</code> entry consists of a table name and, for that table, a list of\\n      operations to perform (<code>DeleteRequest</code> or <code>PutRequest</code>).</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>DeleteRequest</code> - Perform a <code>DeleteItem</code> operation on the specified item. The\\n          item to be deleted is identified by a <code>Key</code> subelement:</p>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <code>Key</code> - A map of primary key attribute values that uniquely identify the item.\\n              Each entry in this map consists of an attribute name and an attribute value.</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>PutRequest</code> - Perform a <code>PutItem</code> operation on the specified item. The item to\\n          be put is identified by an <code>Item</code> subelement:</p>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <code>Item</code> - A map of attributes and their values. Each entry in this map consists\\n              of an attribute name and an attribute value. Attribute values must not be null; string\\n              and binary type attributes must have lengths greater than zero; and set type\\n              attributes must not be empty. Requests that contain empty values will be rejected with\\n              a <code>ValidationException</code> exception.</p>\\n                     <p>If you specify any attributes that are part of an index key, then the data types for those attributes must match those of the schema in the table's attribute definition.</p>\\n                  </li>\\n               </ul>\\n            </li>\\n         </ul>\\n         <p>If there are no unprocessed items remaining, the response contains an empty\\n        <code>UnprocessedItems</code> map.</p>\"\n          }\n        },\n        \"ItemCollectionMetrics\": {\n          \"target\": \"com.amazonaws.dynamodb#ItemCollectionMetricsPerTable\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A list of tables that were processed by <code>BatchWriteItem</code> and, for each table,\\n      information about any item collections that were affected by individual <code>DeleteItem</code> or\\n        <code>PutItem</code> operations.</p>\\n         <p>Each entry consists of the following subelements:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>ItemCollectionKey</code> - The partition key value of the item collection. This is the same as\\n          the partition key value of the item.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>SizeEstimateRangeGB</code> - An estimate of item collection size, expressed in GB. This is\\n          a two-element array containing a lower bound and an upper bound for the estimate. The\\n          estimate includes the size of all the items in the table, plus the size of all attributes\\n          projected into all of the local secondary indexes on the table. Use this estimate to measure whether a\\n          local secondary index is approaching its size limit.</p>\\n               <p>The estimate is subject to change over time; therefore, do not rely on the precision or accuracy of the estimate.</p>\\n            </li>\\n         </ul>\"\n          }\n        },\n        \"ConsumedCapacity\": {\n          \"target\": \"com.amazonaws.dynamodb#ConsumedCapacityMultiple\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The capacity units consumed by the entire <code>BatchWriteItem</code> operation.</p>\\n         <p>Each element consists of:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>TableName</code> - The table that consumed the provisioned throughput.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>CapacityUnits</code> - The total number of capacity units consumed.</p>\\n            </li>\\n         </ul>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents the output of a <code>BatchWriteItem</code> operation.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#BatchWriteItemRequestMap\": {\n      \"type\": \"map\",\n      \"key\": {\n        \"target\": \"com.amazonaws.dynamodb#TableName\"\n      },\n      \"value\": {\n        \"target\": \"com.amazonaws.dynamodb#WriteRequests\"\n      },\n      \"traits\": {\n        \"smithy.api#length\": {\n          \"min\": 1,\n          \"max\": 25\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#BilledSizeBytes\": {\n      \"type\": \"long\",\n      \"traits\": {\n        \"smithy.api#box\": {},\n        \"smithy.api#range\": {\n          \"min\": 0\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#BillingMode\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#enum\": [\n          {\n            \"value\": \"PROVISIONED\",\n            \"name\": \"PROVISIONED\"\n          },\n          {\n            \"value\": \"PAY_PER_REQUEST\",\n            \"name\": \"PAY_PER_REQUEST\"\n          }\n        ]\n      }\n    },\n    \"com.amazonaws.dynamodb#BillingModeSummary\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"BillingMode\": {\n          \"target\": \"com.amazonaws.dynamodb#BillingMode\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Controls how you are charged for read and write throughput and how you manage capacity. This setting can be changed later.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>PROVISIONED</code> - Sets the read/write capacity mode to <code>PROVISIONED</code>. We recommend using <code>PROVISIONED</code> for predictable workloads.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>PAY_PER_REQUEST</code> - Sets the read/write capacity mode to <code>PAY_PER_REQUEST</code>. We recommend using <code>PAY_PER_REQUEST</code> for unpredictable workloads.\\n            </p>\\n            </li>\\n         </ul>\"\n          }\n        },\n        \"LastUpdateToPayPerRequestDateTime\": {\n          \"target\": \"com.amazonaws.dynamodb#Date\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Represents the time when <code>PAY_PER_REQUEST</code> was last set as the read/write capacity mode.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Contains the details for the read/write capacity mode.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#BinaryAttributeValue\": {\n      \"type\": \"blob\"\n    },\n    \"com.amazonaws.dynamodb#BinarySetAttributeValue\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.dynamodb#BinaryAttributeValue\"\n      }\n    },\n    \"com.amazonaws.dynamodb#BooleanAttributeValue\": {\n      \"type\": \"boolean\",\n      \"traits\": {\n        \"smithy.api#box\": {}\n      }\n    },\n    \"com.amazonaws.dynamodb#BooleanObject\": {\n      \"type\": \"boolean\",\n      \"traits\": {\n        \"smithy.api#box\": {}\n      }\n    },\n    \"com.amazonaws.dynamodb#CancellationReason\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Item\": {\n          \"target\": \"com.amazonaws.dynamodb#AttributeMap\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Item in the request which caused the transaction to get cancelled.</p>\"\n          }\n        },\n        \"Code\": {\n          \"target\": \"com.amazonaws.dynamodb#Code\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Status code for the result of the cancelled transaction.</p>\"\n          }\n        },\n        \"Message\": {\n          \"target\": \"com.amazonaws.dynamodb#ErrorMessage\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Cancellation reason message description.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>An ordered list of errors for each item in the request which caused the transaction\\n     to get cancelled. The values of the list are ordered according to the ordering of the\\n     <code>TransactWriteItems</code> request parameter. If no error\\n     occurred for the associated item an error with a Null code and Null message will be present.\\n     </p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#CancellationReasonList\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.dynamodb#CancellationReason\"\n      },\n      \"traits\": {\n        \"smithy.api#length\": {\n          \"min\": 1,\n          \"max\": 25\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#Capacity\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"ReadCapacityUnits\": {\n          \"target\": \"com.amazonaws.dynamodb#ConsumedCapacityUnits\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The total number of read capacity units consumed on a table or an index.</p>\"\n          }\n        },\n        \"WriteCapacityUnits\": {\n          \"target\": \"com.amazonaws.dynamodb#ConsumedCapacityUnits\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The total number of write capacity units consumed on a table or an index.</p>\"\n          }\n        },\n        \"CapacityUnits\": {\n          \"target\": \"com.amazonaws.dynamodb#ConsumedCapacityUnits\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The total number of capacity units consumed on a table or an index.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents the amount of provisioned throughput capacity consumed on a table or an index.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#ClientRequestToken\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#length\": {\n          \"min\": 1,\n          \"max\": 36\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#ClientToken\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.dynamodb#Code\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.dynamodb#ComparisonOperator\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#enum\": [\n          {\n            \"value\": \"EQ\",\n            \"name\": \"EQ\"\n          },\n          {\n            \"value\": \"NE\",\n            \"name\": \"NE\"\n          },\n          {\n            \"value\": \"IN\",\n            \"name\": \"IN\"\n          },\n          {\n            \"value\": \"LE\",\n            \"name\": \"LE\"\n          },\n          {\n            \"value\": \"LT\",\n            \"name\": \"LT\"\n          },\n          {\n            \"value\": \"GE\",\n            \"name\": \"GE\"\n          },\n          {\n            \"value\": \"GT\",\n            \"name\": \"GT\"\n          },\n          {\n            \"value\": \"BETWEEN\",\n            \"name\": \"BETWEEN\"\n          },\n          {\n            \"value\": \"NOT_NULL\",\n            \"name\": \"NOT_NULL\"\n          },\n          {\n            \"value\": \"NULL\",\n            \"name\": \"NULL\"\n          },\n          {\n            \"value\": \"CONTAINS\",\n            \"name\": \"CONTAINS\"\n          },\n          {\n            \"value\": \"NOT_CONTAINS\",\n            \"name\": \"NOT_CONTAINS\"\n          },\n          {\n            \"value\": \"BEGINS_WITH\",\n            \"name\": \"BEGINS_WITH\"\n          }\n        ]\n      }\n    },\n    \"com.amazonaws.dynamodb#Condition\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"AttributeValueList\": {\n          \"target\": \"com.amazonaws.dynamodb#AttributeValueList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>One or more values to evaluate against the supplied attribute. The number of values in the\\n      list depends on the <code>ComparisonOperator</code> being used.</p>\\n         <p>For type Number, value comparisons are numeric.</p>\\n         <p>String value comparisons for greater than, equals, or less than are based on ASCII character\\n      code values. For example, <code>a</code> is greater than <code>A</code>, and <code>a</code>\\n      is greater than <code>B</code>. For a list of code values, see <a href=\\\"http://en.wikipedia.org/wiki/ASCII#ASCII_printable_characters\\\">http://en.wikipedia.org/wiki/ASCII#ASCII_printable_characters</a>.</p>\\n         <p>For Binary, DynamoDB treats each byte of the binary data as unsigned when it compares binary values.</p>\"\n          }\n        },\n        \"ComparisonOperator\": {\n          \"target\": \"com.amazonaws.dynamodb#ComparisonOperator\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A comparator for evaluating attributes. For example, equals, greater than, less than, etc.</p>\\n         <p>The following comparison operators are available:</p>\\n         <p>\\n            <code>EQ | NE | LE | LT | GE | GT | NOT_NULL | NULL | CONTAINS | NOT_CONTAINS | BEGINS_WITH | IN | BETWEEN</code>\\n         </p>\\n         <p>The following are descriptions of each comparison operator.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>EQ</code> : Equal. <code>EQ</code> is supported for all data types, including lists and maps.</p>\\n               <p>\\n                  <code>AttributeValueList</code> can contain only one <code>AttributeValue</code> element of type String,\\n          Number, Binary, String Set, Number Set, or Binary Set. If an item contains an <code>AttributeValue</code> element of a different\\n          type than the one provided in the request, the value does not match. For example,\\n            <code>{\\\"S\\\":\\\"6\\\"}</code> does not equal <code>{\\\"N\\\":\\\"6\\\"}</code>. Also,\\n            <code>{\\\"N\\\":\\\"6\\\"}</code> does not equal <code>{\\\"NS\\\":[\\\"6\\\", \\\"2\\\", \\\"1\\\"]}</code>.</p>\\n               <p></p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>NE</code> : Not equal. <code>NE</code> is supported for all data types, including lists and maps.</p>\\n               <p>\\n                  <code>AttributeValueList</code> can contain only one <code>AttributeValue</code> of type String,\\n          Number, Binary, String Set, Number Set, or Binary Set. If an item contains an <code>AttributeValue</code> of a different\\n          type than the one provided in the request, the value does not match. For example,\\n            <code>{\\\"S\\\":\\\"6\\\"}</code> does not equal <code>{\\\"N\\\":\\\"6\\\"}</code>. Also,\\n            <code>{\\\"N\\\":\\\"6\\\"}</code> does not equal <code>{\\\"NS\\\":[\\\"6\\\", \\\"2\\\", \\\"1\\\"]}</code>.</p>\\n               <p></p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>LE</code> : Less than or equal. </p>\\n               <p>\\n                  <code>AttributeValueList</code> can contain only one <code>AttributeValue</code> element of type String,\\n          Number, or Binary (not a set type). If an item contains an <code>AttributeValue</code> element of a different\\n          type than the one provided in the request, the value does not match. For example,\\n            <code>{\\\"S\\\":\\\"6\\\"}</code> does not equal <code>{\\\"N\\\":\\\"6\\\"}</code>. Also,\\n            <code>{\\\"N\\\":\\\"6\\\"}</code> does not compare to <code>{\\\"NS\\\":[\\\"6\\\", \\\"2\\\", \\\"1\\\"]}</code>.</p>\\n               <p></p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>LT</code> : Less than. </p>\\n               <p>\\n                  <code>AttributeValueList</code> can contain only one <code>AttributeValue</code> of type String,\\n          Number, or Binary (not a set type). If an item contains an <code>AttributeValue</code> element of a different\\n          type than the one provided in the request, the value does not match. For example,\\n            <code>{\\\"S\\\":\\\"6\\\"}</code> does not equal <code>{\\\"N\\\":\\\"6\\\"}</code>. Also,\\n            <code>{\\\"N\\\":\\\"6\\\"}</code> does not compare to <code>{\\\"NS\\\":[\\\"6\\\", \\\"2\\\", \\\"1\\\"]}</code>.</p>\\n               <p></p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>GE</code> : Greater than or equal. </p>\\n               <p>\\n                  <code>AttributeValueList</code> can contain only one <code>AttributeValue</code> element of type String,\\n          Number, or Binary (not a set type). If an item contains an <code>AttributeValue</code> element of a different\\n          type than the one provided in the request, the value does not match. For example,\\n            <code>{\\\"S\\\":\\\"6\\\"}</code> does not equal <code>{\\\"N\\\":\\\"6\\\"}</code>. Also,\\n            <code>{\\\"N\\\":\\\"6\\\"}</code> does not compare to <code>{\\\"NS\\\":[\\\"6\\\", \\\"2\\\", \\\"1\\\"]}</code>.</p>\\n               <p></p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>GT</code> : Greater than. </p>\\n               <p>\\n                  <code>AttributeValueList</code> can contain only one <code>AttributeValue</code> element of type String,\\n          Number, or Binary (not a set type). If an item contains an <code>AttributeValue</code> element of a different\\n          type than the one provided in the request, the value does not match. For example,\\n            <code>{\\\"S\\\":\\\"6\\\"}</code> does not equal <code>{\\\"N\\\":\\\"6\\\"}</code>. Also,\\n            <code>{\\\"N\\\":\\\"6\\\"}</code> does not compare to <code>{\\\"NS\\\":[\\\"6\\\", \\\"2\\\", \\\"1\\\"]}</code>.</p>\\n               <p></p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>NOT_NULL</code> : The attribute exists. <code>NOT_NULL</code> is supported for all data types, including lists and maps.</p>\\n               <note>\\n                  <p>This operator tests for the existence of an attribute, not its data type.  If the data type of attribute \\\"<code>a</code>\\\" is null, and you evaluate it using <code>NOT_NULL</code>, the result is a Boolean <code>true</code>. This result is because the attribute \\\"<code>a</code>\\\" exists; its data type is not relevant to the <code>NOT_NULL</code> comparison operator.</p>\\n               </note>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>NULL</code> : The attribute does not exist. <code>NULL</code> is supported for all data types, including lists and maps.</p>\\n               <note>\\n                  <p>This operator tests for the nonexistence of an attribute, not its data type.  If the data type of attribute \\\"<code>a</code>\\\" is null, and you evaluate it using <code>NULL</code>, the result is a Boolean <code>false</code>. This is because the attribute \\\"<code>a</code>\\\" exists; its data type is not relevant to the <code>NULL</code> comparison operator.</p>\\n               </note>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>CONTAINS</code> : Checks for a subsequence, or value in a set.</p>\\n               <p>\\n                  <code>AttributeValueList</code> can contain only one <code>AttributeValue</code> element of type String,\\n          Number, or Binary (not a set type). If the target attribute of the comparison is of type String, then\\n          the operator checks for a substring match. If the target attribute of the comparison is\\n          of type Binary, then the operator looks for a subsequence of the target that matches the input.\\n          If the target attribute of the comparison is a set (\\\"<code>SS</code>\\\", \\\"<code>NS</code>\\\", or \\\"<code>BS</code>\\\"), then the\\n          operator evaluates to true if it finds an exact match with any member of the set.</p>\\n               <p>CONTAINS is supported for lists: When evaluating \\\"<code>a CONTAINS b</code>\\\", \\\"<code>a</code>\\\" can be a list; however, \\\"<code>b</code>\\\" cannot be a set, a map, or a list.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>NOT_CONTAINS</code> : Checks for absence of a subsequence, or absence of a value in\\n          a set.</p>\\n               <p>\\n                  <code>AttributeValueList</code> can contain only one <code>AttributeValue</code> element of type String,\\n          Number, or Binary (not a set type). If the target attribute of the comparison is a String, then\\n          the operator checks for the absence of a substring match. If the target attribute of the\\n          comparison is Binary, then the operator checks for the absence of a subsequence of the\\n          target that matches the input. If the target attribute of the comparison is a set (\\\"<code>SS</code>\\\",\\n          \\\"<code>NS</code>\\\", or \\\"<code>BS</code>\\\"), then the operator evaluates to true if it <i>does not</i> find an exact match with any member of the set.</p>\\n               <p>NOT_CONTAINS is supported for lists: When evaluating \\\"<code>a NOT CONTAINS b</code>\\\", \\\"<code>a</code>\\\" can be a list; however, \\\"<code>b</code>\\\" cannot be a set, a map, or a list.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>BEGINS_WITH</code> : Checks for a prefix. </p>\\n               <p>\\n                  <code>AttributeValueList</code> can contain only one <code>AttributeValue</code> of type String or\\n          Binary (not a Number or a set type). The target attribute of the comparison must be of type String or\\n          Binary (not a Number or a set type).</p>\\n               <p></p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>IN</code> : Checks for matching elements in a list.</p>\\n               <p>\\n                  <code>AttributeValueList</code> can contain one or more <code>AttributeValue</code>\\n               elements of type String, Number, or Binary. These attributes are compared against an\\n               existing attribute of an item. If any elements of the input are equal to the item\\n               attribute, the expression evaluates to true.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>BETWEEN</code> : Greater than or equal to the first value, and less than or equal\\n          to the second value. </p>\\n               <p>\\n                  <code>AttributeValueList</code> must contain two <code>AttributeValue</code> elements of the same\\n          type, either String, Number, or Binary (not a set type). A target attribute matches if the\\n          target value is greater than, or equal to, the first element and less than, or equal to,\\n          the second element. If an item contains an <code>AttributeValue</code> element of a different type than\\n          the one provided in the request, the value does not match. For example,\\n            <code>{\\\"S\\\":\\\"6\\\"}</code> does not compare to <code>{\\\"N\\\":\\\"6\\\"}</code>. Also,\\n            <code>{\\\"N\\\":\\\"6\\\"}</code> does not compare to <code>{\\\"NS\\\":[\\\"6\\\", \\\"2\\\", \\\"1\\\"]}</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>For usage examples of <code>AttributeValueList</code> and <code>ComparisonOperator</code>, see\\n    <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/LegacyConditionalParameters.html\\\">Legacy Conditional Parameters</a>\\n      in the <i>Amazon DynamoDB Developer Guide</i>.</p>\",\n            \"smithy.api#required\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents the selection criteria for a <code>Query</code> or <code>Scan</code> operation:</p>\\n         <ul>\\n            <li>\\n               <p>For a <code>Query</code> operation, <code>Condition</code> is used for specifying the\\n            <code>KeyConditions</code> to use when querying a table or an index. For <code>KeyConditions</code>,\\n          only the following comparison operators are supported:</p>\\n               <p>\\n                  <code>EQ | LE | LT | GE | GT | BEGINS_WITH | BETWEEN</code>\\n               </p>\\n               <p>\\n                  <code>Condition</code> is also used in a <code>QueryFilter</code>, which evaluates the query results\\n          and returns only the desired values.</p>\\n            </li>\\n            <li>\\n               <p>For a <code>Scan</code> operation, <code>Condition</code> is used in a <code>ScanFilter</code>, which\\n          evaluates the scan results and returns only the desired values.</p>\\n            </li>\\n         </ul>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#ConditionCheck\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Key\": {\n          \"target\": \"com.amazonaws.dynamodb#Key\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The primary key of the item to be checked. Each element consists of an\\n      attribute name and a value for that attribute.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"TableName\": {\n          \"target\": \"com.amazonaws.dynamodb#TableName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Name of the table for the check item request.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"ConditionExpression\": {\n          \"target\": \"com.amazonaws.dynamodb#ConditionExpression\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A condition that must be satisfied in order for a conditional update to succeed.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"ExpressionAttributeNames\": {\n          \"target\": \"com.amazonaws.dynamodb#ExpressionAttributeNameMap\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>One or more substitution tokens for attribute names in an expression.</p>\"\n          }\n        },\n        \"ExpressionAttributeValues\": {\n          \"target\": \"com.amazonaws.dynamodb#ExpressionAttributeValueMap\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>One or more values that can be substituted in an expression.</p>\"\n          }\n        },\n        \"ReturnValuesOnConditionCheckFailure\": {\n          \"target\": \"com.amazonaws.dynamodb#ReturnValuesOnConditionCheckFailure\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Use <code>ReturnValuesOnConditionCheckFailure</code> to\\n        get the item attributes if the <code>ConditionCheck</code> condition fails.\\n        For <code>ReturnValuesOnConditionCheckFailure</code>, the valid\\n        values are: NONE and ALL_OLD.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents a request to perform a check that an item exists or to check the condition of\\n         specific attributes of the item.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#ConditionExpression\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.dynamodb#ConditionalCheckFailedException\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"message\": {\n          \"target\": \"com.amazonaws.dynamodb#ErrorMessage\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The conditional request failed.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>A condition specified in the operation could not be evaluated.</p>\",\n        \"smithy.api#error\": \"client\"\n      }\n    },\n    \"com.amazonaws.dynamodb#ConditionalOperator\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#enum\": [\n          {\n            \"value\": \"AND\",\n            \"name\": \"AND\"\n          },\n          {\n            \"value\": \"OR\",\n            \"name\": \"OR\"\n          }\n        ]\n      }\n    },\n    \"com.amazonaws.dynamodb#ConsistentRead\": {\n      \"type\": \"boolean\",\n      \"traits\": {\n        \"smithy.api#box\": {}\n      }\n    },\n    \"com.amazonaws.dynamodb#ConsumedCapacity\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"TableName\": {\n          \"target\": \"com.amazonaws.dynamodb#TableName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the table that was affected by the operation.</p>\"\n          }\n        },\n        \"CapacityUnits\": {\n          \"target\": \"com.amazonaws.dynamodb#ConsumedCapacityUnits\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The total number of capacity units consumed by the operation.</p>\"\n          }\n        },\n        \"ReadCapacityUnits\": {\n          \"target\": \"com.amazonaws.dynamodb#ConsumedCapacityUnits\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The total number of read capacity units consumed by the operation.</p>\"\n          }\n        },\n        \"WriteCapacityUnits\": {\n          \"target\": \"com.amazonaws.dynamodb#ConsumedCapacityUnits\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The total number of write capacity units consumed by the operation.</p>\"\n          }\n        },\n        \"Table\": {\n          \"target\": \"com.amazonaws.dynamodb#Capacity\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The amount of throughput consumed on the table affected by the operation.</p>\"\n          }\n        },\n        \"LocalSecondaryIndexes\": {\n          \"target\": \"com.amazonaws.dynamodb#SecondaryIndexesCapacityMap\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The amount of throughput consumed on each local index affected by the operation.</p>\"\n          }\n        },\n        \"GlobalSecondaryIndexes\": {\n          \"target\": \"com.amazonaws.dynamodb#SecondaryIndexesCapacityMap\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The amount of throughput consumed on each global index affected by the operation.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>The capacity units consumed by an operation. The data returned includes the total\\n      provisioned throughput consumed, along with statistics for the table and any indexes involved\\n      in the operation. <code>ConsumedCapacity</code> is only returned if the request asked for it.\\n      For more information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ProvisionedThroughputIntro.html\\\">Provisioned\\n        Throughput</a> in the <i>Amazon DynamoDB Developer Guide</i>.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#ConsumedCapacityMultiple\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.dynamodb#ConsumedCapacity\"\n      }\n    },\n    \"com.amazonaws.dynamodb#ConsumedCapacityUnits\": {\n      \"type\": \"double\",\n      \"traits\": {\n        \"smithy.api#box\": {}\n      }\n    },\n    \"com.amazonaws.dynamodb#ContinuousBackupsDescription\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"ContinuousBackupsStatus\": {\n          \"target\": \"com.amazonaws.dynamodb#ContinuousBackupsStatus\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>\\n            <code>ContinuousBackupsStatus</code> can be one of the following states: ENABLED,\\n         DISABLED</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"PointInTimeRecoveryDescription\": {\n          \"target\": \"com.amazonaws.dynamodb#PointInTimeRecoveryDescription\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The description of the point in time recovery settings applied to the table.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents the continuous backups and point in time recovery settings on the table.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#ContinuousBackupsStatus\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#enum\": [\n          {\n            \"value\": \"ENABLED\",\n            \"name\": \"ENABLED\"\n          },\n          {\n            \"value\": \"DISABLED\",\n            \"name\": \"DISABLED\"\n          }\n        ]\n      }\n    },\n    \"com.amazonaws.dynamodb#ContinuousBackupsUnavailableException\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"message\": {\n          \"target\": \"com.amazonaws.dynamodb#ErrorMessage\"\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Backups have not yet been enabled for this table.</p>\",\n        \"smithy.api#error\": \"client\"\n      }\n    },\n    \"com.amazonaws.dynamodb#ContributorInsightsAction\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#enum\": [\n          {\n            \"value\": \"ENABLE\",\n            \"name\": \"ENABLE\"\n          },\n          {\n            \"value\": \"DISABLE\",\n            \"name\": \"DISABLE\"\n          }\n        ]\n      }\n    },\n    \"com.amazonaws.dynamodb#ContributorInsightsRule\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#pattern\": \"[A-Za-z0-9][A-Za-z0-9\\\\-\\\\_\\\\.]{0,126}[A-Za-z0-9]\"\n      }\n    },\n    \"com.amazonaws.dynamodb#ContributorInsightsRuleList\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.dynamodb#ContributorInsightsRule\"\n      }\n    },\n    \"com.amazonaws.dynamodb#ContributorInsightsStatus\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#enum\": [\n          {\n            \"value\": \"ENABLING\",\n            \"name\": \"ENABLING\"\n          },\n          {\n            \"value\": \"ENABLED\",\n            \"name\": \"ENABLED\"\n          },\n          {\n            \"value\": \"DISABLING\",\n            \"name\": \"DISABLING\"\n          },\n          {\n            \"value\": \"DISABLED\",\n            \"name\": \"DISABLED\"\n          },\n          {\n            \"value\": \"FAILED\",\n            \"name\": \"FAILED\"\n          }\n        ]\n      }\n    },\n    \"com.amazonaws.dynamodb#ContributorInsightsSummaries\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.dynamodb#ContributorInsightsSummary\"\n      }\n    },\n    \"com.amazonaws.dynamodb#ContributorInsightsSummary\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"TableName\": {\n          \"target\": \"com.amazonaws.dynamodb#TableName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Name of the table associated with the summary.</p>\"\n          }\n        },\n        \"IndexName\": {\n          \"target\": \"com.amazonaws.dynamodb#IndexName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Name of the index associated with the summary, if any.</p>\"\n          }\n        },\n        \"ContributorInsightsStatus\": {\n          \"target\": \"com.amazonaws.dynamodb#ContributorInsightsStatus\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Describes the current status for contributor insights for the given table and index, if applicable.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents a Contributor Insights summary entry.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#CreateBackup\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.dynamodb#CreateBackupInput\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.dynamodb#CreateBackupOutput\"\n      },\n      \"errors\": [\n        {\n          \"target\": \"com.amazonaws.dynamodb#BackupInUseException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#ContinuousBackupsUnavailableException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#InvalidEndpointException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#LimitExceededException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#TableInUseException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#TableNotFoundException\"\n        }\n      ],\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Creates a backup for an existing table.</p>\\n         <p> Each time you create an on-demand backup, the entire table data is backed up. There\\n            is no limit to the number of on-demand backups that can be taken. </p>\\n         <p> When you create an on-demand backup, a time marker of the request is cataloged, and\\n            the backup is created asynchronously, by applying all changes until the time of the\\n            request to the last full table snapshot. Backup requests are processed instantaneously\\n            and become available for restore within minutes. </p>\\n         <p>You can call <code>CreateBackup</code> at a maximum rate of 50 times per second.</p>\\n         <p>All backups in DynamoDB work without consuming any provisioned throughput on the table.</p>\\n         <p> If you submit a backup request on 2018-12-14 at 14:25:00, the backup is guaranteed\\n            to contain all data committed to the table up to 14:24:00, and data committed after\\n            14:26:00 will not be. The backup might contain data modifications made between 14:24:00\\n            and 14:26:00. On-demand backup does not support causal consistency. </p>\\n         <p>\\n             Along with data, the following are also included on the backups:\\n         </p>\\n           <ul>\\n            <li>\\n                  <p>Global secondary indexes (GSIs)</p>\\n              </li>\\n            <li>\\n                  <p>Local secondary indexes (LSIs)</p>\\n              </li>\\n            <li>\\n                  <p>Streams</p>\\n              </li>\\n            <li>\\n                  <p>Provisioned read and write capacity</p>\\n              </li>\\n         </ul>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#CreateBackupInput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"TableName\": {\n          \"target\": \"com.amazonaws.dynamodb#TableName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the table.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"BackupName\": {\n          \"target\": \"com.amazonaws.dynamodb#BackupName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specified name for the backup.</p>\",\n            \"smithy.api#required\": {}\n          }\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#CreateBackupOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"BackupDetails\": {\n          \"target\": \"com.amazonaws.dynamodb#BackupDetails\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Contains the details of the backup created for the table.</p>\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#CreateGlobalSecondaryIndexAction\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"IndexName\": {\n          \"target\": \"com.amazonaws.dynamodb#IndexName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the global secondary index to be created.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"KeySchema\": {\n          \"target\": \"com.amazonaws.dynamodb#KeySchema\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The key schema for the global secondary index.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"Projection\": {\n          \"target\": \"com.amazonaws.dynamodb#Projection\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Represents attributes that are copied (projected) from the table into an index. These\\n         are in addition to the primary key attributes and index key attributes, which are\\n         automatically projected.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"ProvisionedThroughput\": {\n          \"target\": \"com.amazonaws.dynamodb#ProvisionedThroughput\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Represents the provisioned throughput settings for the specified global secondary index.</p>\\n         <p>For current minimum and maximum provisioned throughput values, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Limits.html\\\">Service, Account, and Table Quotas</a> in the <i>Amazon DynamoDB Developer Guide</i>.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents a new global secondary index to be added to an existing table.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#CreateGlobalTable\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.dynamodb#CreateGlobalTableInput\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.dynamodb#CreateGlobalTableOutput\"\n      },\n      \"errors\": [\n        {\n          \"target\": \"com.amazonaws.dynamodb#GlobalTableAlreadyExistsException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#InvalidEndpointException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#LimitExceededException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#TableNotFoundException\"\n        }\n      ],\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Creates a global table from an existing table. A global table creates a replication\\n            relationship between two or more DynamoDB tables with the same table name in the\\n            provided Regions. </p>\\n         <note>\\n            <p>This operation only applies to <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/globaltables.V1.html\\\">Version 2017.11.29</a> of global tables.</p>\\n         </note>\\n\\n         <p>If you want to add a new replica table to a global table, each of the following conditions\\n   must be true:</p>\\n         <ul>\\n            <li>\\n               <p>The table must have the same primary key as all of the other replicas.</p>\\n            </li>\\n            <li>\\n               <p>The table must have the same name as all of the other replicas.</p>\\n            </li>\\n            <li>\\n               <p>The table must have DynamoDB Streams enabled, with the stream containing both the new and the old\\n     images of the item.</p>\\n            </li>\\n            <li>\\n               <p>None of the replica tables in the global table can contain any data.</p>\\n            </li>\\n         </ul>\\n         <p>\\n     If global secondary indexes are specified, then the following conditions must also be met:\\n   </p>\\n        <ul>\\n            <li>\\n               <p>\\n               The global secondary indexes must have the same name.\\n            </p>\\n            </li>\\n            <li>\\n               <p>\\n               The global secondary indexes must have the same hash key and sort key (if present).\\n            </p>\\n            </li>\\n         </ul>\\n         <p>\\n     If local secondary indexes are specified, then the following conditions must also be met:\\n   </p>\\n        <ul>\\n            <li>\\n               <p>\\n               The local secondary indexes must have the same name.\\n            </p>\\n            </li>\\n            <li>\\n               <p>\\n               The local secondary indexes must have the same hash key and sort key (if present).\\n            </p>\\n            </li>\\n         </ul>\\n\\n         <important>\\n            <p>\\n       Write capacity settings should be set consistently across your replica tables and\\n       secondary indexes. DynamoDB strongly recommends enabling auto scaling to manage the write\\n       capacity settings for all of your global tables replicas and indexes.\\n    </p>\\n            <p>\\n       If you prefer to manage write capacity settings manually, you should provision equal\\n       replicated write capacity units to your replica tables. You should also provision\\n       equal replicated write capacity units to matching secondary indexes across\\n       your global table.\\n    </p>\\n         </important>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#CreateGlobalTableInput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"GlobalTableName\": {\n          \"target\": \"com.amazonaws.dynamodb#TableName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The global table name.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"ReplicationGroup\": {\n          \"target\": \"com.amazonaws.dynamodb#ReplicaList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Regions where the global table needs to be created.</p>\",\n            \"smithy.api#required\": {}\n          }\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#CreateGlobalTableOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"GlobalTableDescription\": {\n          \"target\": \"com.amazonaws.dynamodb#GlobalTableDescription\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Contains the details of the global table.</p>\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#CreateReplicaAction\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"RegionName\": {\n          \"target\": \"com.amazonaws.dynamodb#RegionName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Region of the replica to be added.</p>\",\n            \"smithy.api#required\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents a replica to be added.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#CreateReplicationGroupMemberAction\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"RegionName\": {\n          \"target\": \"com.amazonaws.dynamodb#RegionName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Region where the new replica will be created.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"KMSMasterKeyId\": {\n          \"target\": \"com.amazonaws.dynamodb#KMSMasterKeyId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The AWS KMS customer master key (CMK) that should be used for AWS KMS encryption\\n         in the new replica. To specify a CMK, use its key ID, Amazon Resource Name (ARN),\\n         alias name, or alias ARN. Note that you should only provide this parameter if the\\n         key is different from the default DynamoDB KMS master key alias/aws/dynamodb.</p>\"\n          }\n        },\n        \"ProvisionedThroughputOverride\": {\n          \"target\": \"com.amazonaws.dynamodb#ProvisionedThroughputOverride\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Replica-specific provisioned throughput. If not specified, uses the source table's\\n         provisioned throughput settings.</p>\"\n          }\n        },\n        \"GlobalSecondaryIndexes\": {\n          \"target\": \"com.amazonaws.dynamodb#ReplicaGlobalSecondaryIndexList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Replica-specific global secondary index settings.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents a replica to be created.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#CreateTable\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.dynamodb#CreateTableInput\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.dynamodb#CreateTableOutput\"\n      },\n      \"errors\": [\n        {\n          \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#InvalidEndpointException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#LimitExceededException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#ResourceInUseException\"\n        }\n      ],\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>The <code>CreateTable</code> operation adds a new table to your account. In an AWS\\n            account, table names must be unique within each Region. That is, you can have two tables\\n            with same name if you create the tables in different Regions.</p>\\n         <p>\\n            <code>CreateTable</code> is an asynchronous operation. Upon receiving a <code>CreateTable</code> request,\\n      DynamoDB immediately returns a response with a <code>TableStatus</code> of <code>CREATING</code>. After\\n      the table is created, DynamoDB sets the <code>TableStatus</code> to <code>ACTIVE</code>. You can\\n      perform read and write operations only on an <code>ACTIVE</code> table. </p>\\n         <p>You can optionally define secondary indexes on the new table, as part of the <code>CreateTable</code>\\n      operation. If you want to create multiple tables with secondary indexes on them, you must create the\\n      tables sequentially. Only one table with secondary indexes can be in the <code>CREATING</code> state at\\n      any given time.</p>\\n         <p>You can use the <code>DescribeTable</code> action to check the table status.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#CreateTableInput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"AttributeDefinitions\": {\n          \"target\": \"com.amazonaws.dynamodb#AttributeDefinitions\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>An array of attributes that describe the key schema for the table and indexes.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"TableName\": {\n          \"target\": \"com.amazonaws.dynamodb#TableName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the table to create.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"KeySchema\": {\n          \"target\": \"com.amazonaws.dynamodb#KeySchema\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the attributes that make up the primary key for a table or an index. The attributes\\n      in <code>KeySchema</code> must also be defined in the <code>AttributeDefinitions</code> array. For more\\n      information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DataModel.html\\\">Data Model</a> in the\\n        <i>Amazon DynamoDB Developer Guide</i>.</p>\\n         <p>Each <code>KeySchemaElement</code> in the array is composed of:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>AttributeName</code> - The name of this key attribute.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>KeyType</code> - The role that the key attribute will assume:</p>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <code>HASH</code> - partition key</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <code>RANGE</code> - sort key</p>\\n                  </li>\\n               </ul>\\n            </li>\\n         </ul>\\n         <note>\\n            <p>The partition key of an item is also known as its <i>hash\\n                attribute</i>. The term \\\"hash attribute\\\" derives from the DynamoDB usage of\\n                an internal hash function to evenly distribute data items across partitions, based\\n                on their partition key values.</p>\\n            <p>The sort key of an item is also known as its <i>range attribute</i>.\\n        The term \\\"range attribute\\\" derives from the way DynamoDB stores items with the same\\n        partition key physically close together, in sorted order by the sort key value.</p>\\n         </note>\\n\\n         <p>For a simple primary key (partition key), you must provide\\n      exactly one element with a <code>KeyType</code> of <code>HASH</code>.</p>\\n         <p>For a composite primary key (partition key and sort key), you must provide exactly two\\n      elements, in this order: The first element must have a <code>KeyType</code> of <code>HASH</code>,\\n      and the second element must have a <code>KeyType</code> of <code>RANGE</code>.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/WorkingWithTables.html#WorkingWithTables.primary.key\\\">Working with Tables</a> in the <i>Amazon DynamoDB Developer\\n                Guide</i>.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"LocalSecondaryIndexes\": {\n          \"target\": \"com.amazonaws.dynamodb#LocalSecondaryIndexList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>One or more local secondary indexes (the maximum is 5) to be created on the table. Each index is scoped to a given partition key value. There is a 10 GB size limit per partition key value; otherwise, the size of a local secondary index is unconstrained.</p>\\n         <p>Each local secondary index in the array includes the following:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>IndexName</code> - The name of the local secondary index. Must be unique only for this table.</p>\\n               <p></p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>KeySchema</code> - Specifies the key schema for the local secondary index. The key schema must begin with\\n          the same partition key as the table.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>Projection</code> - Specifies\\n          attributes that are copied (projected) from the table into the index. These are in\\n          addition to the primary key attributes and index key\\n          attributes, which are automatically projected. Each\\n          attribute specification is composed of:</p>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <code>ProjectionType</code> - One\\n              of the following:</p>\\n                     <ul>\\n                        <li>\\n                           <p>\\n                              <code>KEYS_ONLY</code> - Only the index and primary keys are projected into the\\n                  index.</p>\\n                        </li>\\n                        <li>\\n                           <p>\\n                                    <code>INCLUDE</code> - Only the specified table attributes are\\n                                    projected into the index. The list of projected attributes is in\\n                                        <code>NonKeyAttributes</code>.</p>\\n                        </li>\\n                        <li>\\n                           <p>\\n                              <code>ALL</code> - All of the table attributes are projected into the\\n                  index.</p>\\n                        </li>\\n                     </ul>\\n                  </li>\\n                  <li>\\n                        <p>\\n                            <code>NonKeyAttributes</code> - A list of one or more non-key\\n                            attribute names that are projected into the secondary index. The total\\n                            count of attributes provided in <code>NonKeyAttributes</code>,\\n                            summed across all of the secondary indexes, must not exceed 100. If you\\n                            project the same attribute into two different indexes, this counts as\\n                            two distinct attributes when determining the total.</p>\\n                  </li>\\n               </ul>\\n            </li>\\n         </ul>\"\n          }\n        },\n        \"GlobalSecondaryIndexes\": {\n          \"target\": \"com.amazonaws.dynamodb#GlobalSecondaryIndexList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>One or more global secondary indexes (the maximum is 20) to be created on the table. Each global secondary index in the array includes the following:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>IndexName</code> - The name of the global secondary index. Must be unique only for this table.</p>\\n               <p></p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>KeySchema</code> - Specifies the key schema for the global secondary index.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>Projection</code> - Specifies\\n          attributes that are copied (projected) from the table into the index. These are in\\n          addition to the primary key attributes and index key\\n          attributes, which are automatically projected. Each\\n          attribute specification is composed of:</p>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <code>ProjectionType</code> - One\\n              of the following:</p>\\n                     <ul>\\n                        <li>\\n                           <p>\\n                              <code>KEYS_ONLY</code> - Only the index and primary keys are projected into the\\n                  index.</p>\\n                        </li>\\n                        <li>\\n                           <p>\\n                                    <code>INCLUDE</code> - Only the specified table attributes are\\n                                    projected into the index. The list of projected attributes is in\\n                                        <code>NonKeyAttributes</code>.</p>\\n                        </li>\\n                        <li>\\n                           <p>\\n                              <code>ALL</code> - All of the table attributes are projected into the\\n                  index.</p>\\n                        </li>\\n                     </ul>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <code>NonKeyAttributes</code> - A list of one or more non-key attribute names that are\\n              projected into the secondary index. The total count of attributes provided in <code>NonKeyAttributes</code>, summed across all of the secondary indexes, must not exceed 100. If you project the same attribute into two different indexes, this counts as two distinct attributes when determining the total.</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ProvisionedThroughput</code> - The provisioned throughput settings for the global secondary index,\\n          consisting of read and write capacity units.</p>\\n            </li>\\n         </ul>\"\n          }\n        },\n        \"BillingMode\": {\n          \"target\": \"com.amazonaws.dynamodb#BillingMode\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Controls how you are charged for read and write throughput and how you manage capacity. This setting can be changed later.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>PROVISIONED</code> - We recommend using <code>PROVISIONED</code> for predictable workloads. <code>PROVISIONED</code> sets the billing mode to <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.ReadWriteCapacityMode.html#HowItWorks.ProvisionedThroughput.Manual\\\">Provisioned Mode</a>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>PAY_PER_REQUEST</code> - We recommend using <code>PAY_PER_REQUEST</code> for unpredictable workloads. <code>PAY_PER_REQUEST</code> sets the billing mode to <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.ReadWriteCapacityMode.html#HowItWorks.OnDemand\\\">On-Demand Mode</a>.\\n            </p>\\n            </li>\\n         </ul>\"\n          }\n        },\n        \"ProvisionedThroughput\": {\n          \"target\": \"com.amazonaws.dynamodb#ProvisionedThroughput\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Represents the provisioned throughput settings for a specified table or index. The\\n            settings can be modified using the <code>UpdateTable</code> operation.</p>\\n\\t\\t       <p> If you set BillingMode as <code>PROVISIONED</code>, you must specify this property. If you\\n            set BillingMode as <code>PAY_PER_REQUEST</code>, you cannot specify this\\n            property.</p>\\n        <p>For current minimum and maximum provisioned throughput values, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Limits.html\\\">Service,\\n                Account, and Table Quotas</a> in the <i>Amazon DynamoDB Developer\\n                Guide</i>.</p>\"\n          }\n        },\n        \"StreamSpecification\": {\n          \"target\": \"com.amazonaws.dynamodb#StreamSpecification\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The settings for DynamoDB Streams on the table. These settings consist of:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                    <code>StreamEnabled</code> - Indicates whether DynamoDB Streams is to be enabled\\n                    (true) or disabled (false).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>StreamViewType</code> - When an item in the table is modified, <code>StreamViewType</code>\\n          determines what information is written to the table's stream. Valid values for\\n            <code>StreamViewType</code> are:</p>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <code>KEYS_ONLY</code> - Only the key attributes of the modified item are written to the\\n              stream.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <code>NEW_IMAGE</code> - The entire item, as it appears after it was modified, is written\\n            to the stream.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <code>OLD_IMAGE</code> - The entire item, as it appeared before it was modified, is\\n            written to the stream.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <code>NEW_AND_OLD_IMAGES</code> - Both the new and the old item images of the item are\\n            written to the stream.</p>\\n                  </li>\\n               </ul>\\n            </li>\\n         </ul>\"\n          }\n        },\n        \"SSESpecification\": {\n          \"target\": \"com.amazonaws.dynamodb#SSESpecification\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Represents the settings used to enable server-side encryption.</p>\"\n          }\n        },\n        \"Tags\": {\n          \"target\": \"com.amazonaws.dynamodb#TagList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A list of key-value pairs to label the table. For more information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Tagging.html\\\">Tagging for DynamoDB</a>.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents the input of a <code>CreateTable</code> operation.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#CreateTableOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"TableDescription\": {\n          \"target\": \"com.amazonaws.dynamodb#TableDescription\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Represents the properties of the table.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents the output of a <code>CreateTable</code> operation.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#Date\": {\n      \"type\": \"timestamp\"\n    },\n    \"com.amazonaws.dynamodb#Delete\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Key\": {\n          \"target\": \"com.amazonaws.dynamodb#Key\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The primary key of the item to be deleted. Each element consists of an\\n      attribute name and a value for that attribute.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"TableName\": {\n          \"target\": \"com.amazonaws.dynamodb#TableName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Name of the table in which the item to be deleted resides.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"ConditionExpression\": {\n          \"target\": \"com.amazonaws.dynamodb#ConditionExpression\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A condition that must be satisfied in order for a conditional delete to succeed.</p>\"\n          }\n        },\n        \"ExpressionAttributeNames\": {\n          \"target\": \"com.amazonaws.dynamodb#ExpressionAttributeNameMap\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>One or more substitution tokens for attribute names in an expression.</p>\"\n          }\n        },\n        \"ExpressionAttributeValues\": {\n          \"target\": \"com.amazonaws.dynamodb#ExpressionAttributeValueMap\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>One or more values that can be substituted in an expression.</p>\"\n          }\n        },\n        \"ReturnValuesOnConditionCheckFailure\": {\n          \"target\": \"com.amazonaws.dynamodb#ReturnValuesOnConditionCheckFailure\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Use <code>ReturnValuesOnConditionCheckFailure</code> to\\n        get the item attributes if the <code>Delete</code> condition fails.\\n        For <code>ReturnValuesOnConditionCheckFailure</code>, the valid\\n        values are: NONE and ALL_OLD.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents a request to perform a <code>DeleteItem</code> operation.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#DeleteBackup\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.dynamodb#DeleteBackupInput\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.dynamodb#DeleteBackupOutput\"\n      },\n      \"errors\": [\n        {\n          \"target\": \"com.amazonaws.dynamodb#BackupInUseException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#BackupNotFoundException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#InvalidEndpointException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#LimitExceededException\"\n        }\n      ],\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Deletes an existing backup of a table.</p>\\n         <p>You can call <code>DeleteBackup</code> at a maximum rate of 10 times per second.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#DeleteBackupInput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"BackupArn\": {\n          \"target\": \"com.amazonaws.dynamodb#BackupArn\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The ARN associated with the backup.</p>\",\n            \"smithy.api#required\": {}\n          }\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#DeleteBackupOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"BackupDescription\": {\n          \"target\": \"com.amazonaws.dynamodb#BackupDescription\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Contains the description of the backup created for the table.</p>\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#DeleteGlobalSecondaryIndexAction\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"IndexName\": {\n          \"target\": \"com.amazonaws.dynamodb#IndexName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the global secondary index to be deleted.</p>\",\n            \"smithy.api#required\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents a global secondary index to be deleted from an existing table.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#DeleteItem\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.dynamodb#DeleteItemInput\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.dynamodb#DeleteItemOutput\"\n      },\n      \"errors\": [\n        {\n          \"target\": \"com.amazonaws.dynamodb#ConditionalCheckFailedException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#InvalidEndpointException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#ItemCollectionSizeLimitExceededException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#ProvisionedThroughputExceededException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#RequestLimitExceeded\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#ResourceNotFoundException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#TransactionConflictException\"\n        }\n      ],\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Deletes a single item in a table by primary key. You can perform a conditional delete operation that deletes the item if it exists, or if it has an expected attribute value.</p>\\n         <p>In addition to deleting an item, you can also return the item's attribute values in the same\\n      operation, using the <code>ReturnValues</code> parameter.</p>\\n         <p>Unless you specify conditions, the <code>DeleteItem</code> is an idempotent operation; running it\\n      multiple times on the same item or attribute does <i>not</i> result in an error response.</p>\\n         <p>Conditional deletes are useful for deleting items only if specific conditions are met. If those conditions are met, DynamoDB performs the delete. Otherwise, the item is not deleted.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#DeleteItemInput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"TableName\": {\n          \"target\": \"com.amazonaws.dynamodb#TableName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the table from which to delete the item.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"Key\": {\n          \"target\": \"com.amazonaws.dynamodb#Key\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A map of attribute names to <code>AttributeValue</code> objects, representing the primary key of\\n      the item to delete.</p>\\n         <p>For the primary key, you must provide all of the attributes. For example, with a simple primary key, you only need to provide a value for the partition key. For a composite primary key, you must provide values for both the partition key and the sort key.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"Expected\": {\n          \"target\": \"com.amazonaws.dynamodb#ExpectedAttributeMap\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>This is a legacy parameter.  Use <code>ConditionExpression</code> instead.  For more information, see\\n          <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/LegacyConditionalParameters.Expected.html\\\">Expected</a> in the <i>Amazon DynamoDB Developer Guide</i>.</p>\"\n          }\n        },\n        \"ConditionalOperator\": {\n          \"target\": \"com.amazonaws.dynamodb#ConditionalOperator\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>This is a legacy parameter.  Use <code>ConditionExpression</code> instead.  For more information, see\\n          <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/LegacyConditionalParameters.ConditionalOperator.html\\\">ConditionalOperator</a> in the <i>Amazon DynamoDB Developer Guide</i>.</p>\"\n          }\n        },\n        \"ReturnValues\": {\n          \"target\": \"com.amazonaws.dynamodb#ReturnValue\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Use <code>ReturnValues</code> if you want to get the item attributes as they appeared before they\\n      were deleted. For <code>DeleteItem</code>, the valid values are:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>NONE</code> - If <code>ReturnValues</code> is not specified, or if its value is\\n            <code>NONE</code>, then nothing is returned. (This setting is the default for\\n            <code>ReturnValues</code>.)</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ALL_OLD</code> - The content of the old item is returned.</p>\\n            </li>\\n         </ul>\\n         <note>\\n            <p>The <code>ReturnValues</code> parameter is used by several DynamoDB operations; however,\\n        <code>DeleteItem</code> does not recognize any values other than <code>NONE</code> or\\n        <code>ALL_OLD</code>.</p>\\n         </note>\"\n          }\n        },\n        \"ReturnConsumedCapacity\": {\n          \"target\": \"com.amazonaws.dynamodb#ReturnConsumedCapacity\"\n        },\n        \"ReturnItemCollectionMetrics\": {\n          \"target\": \"com.amazonaws.dynamodb#ReturnItemCollectionMetrics\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Determines whether item collection metrics are returned.  If set to <code>SIZE</code>, the response includes statistics about item collections, if any, that were modified during\\n      the operation are returned in the response. If set to <code>NONE</code> (the default), no statistics are returned.</p>\"\n          }\n        },\n        \"ConditionExpression\": {\n          \"target\": \"com.amazonaws.dynamodb#ConditionExpression\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A condition that must be satisfied in order for a conditional <code>DeleteItem</code> to\\n      succeed.</p>\\n         <p>An expression can contain any of the following:</p>\\n         <ul>\\n            <li>\\n               <p>Functions: <code>attribute_exists | attribute_not_exists | attribute_type | contains | begins_with | size</code>\\n               </p>\\n               <p>These function names are case-sensitive.</p>\\n            </li>\\n            <li>\\n               <p>Comparison operators: <code>= | <> |\\n            < | > | <= | >= |\\n            BETWEEN | IN </code>\\n               </p>\\n            </li>\\n            <li>\\n               <p> Logical operators: <code>AND | OR | NOT</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>For more information about condition expressions, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.SpecifyingConditions.html\\\">Condition Expressions</a> in the <i>Amazon DynamoDB Developer\\n                Guide</i>.</p>\"\n          }\n        },\n        \"ExpressionAttributeNames\": {\n          \"target\": \"com.amazonaws.dynamodb#ExpressionAttributeNameMap\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>One or more substitution tokens for attribute names in an expression. The following are some use cases for using <code>ExpressionAttributeNames</code>:</p>\\n         <ul>\\n            <li>\\n               <p>To access an attribute whose name conflicts with a DynamoDB reserved word.</p>\\n            </li>\\n            <li>\\n               <p>To create a placeholder for repeating occurrences of an attribute name in an expression.</p>\\n            </li>\\n            <li>\\n               <p>To prevent special characters in an attribute name from being misinterpreted in an expression.</p>\\n            </li>\\n         </ul>\\n         <p>Use the <b>#</b> character in an expression to dereference an attribute name. For example, consider the following attribute name:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>Percentile</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>The name of this attribute conflicts with a reserved word, so it cannot be used directly in an expression. (For the complete list of reserved words, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ReservedWords.html\\\">Reserved Words</a> in the <i>Amazon DynamoDB Developer Guide</i>). To work around this, you could specify the following for <code>ExpressionAttributeNames</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>{\\\"#P\\\":\\\"Percentile\\\"}</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>You could then use this substitution in an expression, as in this example:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>#P = :val</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <note>\\n            <p>Tokens that begin with the <b>:</b> character are <i>expression attribute values</i>, which are placeholders for the actual value at runtime.</p>\\n         </note>\\n         <p>For more information on expression attribute names, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.AccessingItemAttributes.html\\\">Specifying Item Attributes</a> in the <i>Amazon DynamoDB Developer\\n                Guide</i>.</p>\"\n          }\n        },\n        \"ExpressionAttributeValues\": {\n          \"target\": \"com.amazonaws.dynamodb#ExpressionAttributeValueMap\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>One or more values that can be substituted in an expression.</p>\\n         <p>Use the <b>:</b> (colon) character in an expression to dereference an attribute value. For example, suppose that you wanted to check whether the value of the <i>ProductStatus</i> attribute was one of the following: </p>\\n         <p>\\n            <code>Available | Backordered | Discontinued</code>\\n         </p>\\n         <p>You would first need to specify <code>ExpressionAttributeValues</code> as follows:</p>\\n         <p>\\n            <code>{ \\\":avail\\\":{\\\"S\\\":\\\"Available\\\"}, \\\":back\\\":{\\\"S\\\":\\\"Backordered\\\"}, \\\":disc\\\":{\\\"S\\\":\\\"Discontinued\\\"} }</code>\\n         </p>\\n         <p>You could then use these values in an expression, such as this:</p>\\n         <p>\\n            <code>ProductStatus IN (:avail, :back, :disc)</code>\\n         </p>\\n        <p>For more information on expression attribute values, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.SpecifyingConditions.html\\\">Condition Expressions</a> in the <i>Amazon DynamoDB Developer\\n                Guide</i>.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents the input of a <code>DeleteItem</code> operation.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#DeleteItemOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Attributes\": {\n          \"target\": \"com.amazonaws.dynamodb#AttributeMap\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A map of attribute names to <code>AttributeValue</code> objects, representing the item as it\\n      appeared before the <code>DeleteItem</code> operation. This map appears in the response only if\\n        <code>ReturnValues</code> was specified as <code>ALL_OLD</code> in the request.</p>\"\n          }\n        },\n        \"ConsumedCapacity\": {\n          \"target\": \"com.amazonaws.dynamodb#ConsumedCapacity\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The capacity units consumed by the <code>DeleteItem</code> operation. The data\\n            returned includes the total provisioned throughput consumed, along with statistics for\\n            the table and any indexes involved in the operation. <code>ConsumedCapacity</code> is\\n            only returned if the <code>ReturnConsumedCapacity</code> parameter was specified. For\\n            more information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ProvisionedThroughputIntro.html\\\">Provisioned Mode</a> in the <i>Amazon DynamoDB Developer\\n                Guide</i>.</p>\"\n          }\n        },\n        \"ItemCollectionMetrics\": {\n          \"target\": \"com.amazonaws.dynamodb#ItemCollectionMetrics\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Information about item collections, if any, that were affected by the\\n                <code>DeleteItem</code> operation.\\n                <code>ItemCollectionMetrics</code> is only returned if the\\n                <code>ReturnItemCollectionMetrics</code> parameter was specified. If the\\n            table does not have any local secondary indexes, this information is not returned in the\\n            response.</p>\\n         <p>Each <code>ItemCollectionMetrics</code>\\n        element consists of:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>ItemCollectionKey</code> - The partition key value of the item\\n          collection. This is the same as the partition key value of the item itself.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>SizeEstimateRangeGB</code> - An estimate of item collection size,\\n          in gigabytes. This value is a two-element array\\n          containing a lower bound and an upper bound for the\\n          estimate. The estimate includes the size of all the\\n          items in the table, plus the size of all attributes\\n          projected into all of the local secondary indexes on that\\n          table. Use this estimate to measure whether a local secondary index is approaching its size limit.</p>\\n               <p>The estimate is subject to change over time; therefore, do not rely on the precision or accuracy of the estimate.</p>\\n            </li>\\n         </ul>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents the output of a <code>DeleteItem</code> operation.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#DeleteReplicaAction\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"RegionName\": {\n          \"target\": \"com.amazonaws.dynamodb#RegionName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Region of the replica to be removed.</p>\",\n            \"smithy.api#required\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents a replica to be removed.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#DeleteReplicationGroupMemberAction\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"RegionName\": {\n          \"target\": \"com.amazonaws.dynamodb#RegionName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Region where the replica exists.</p>\",\n            \"smithy.api#required\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents a replica to be deleted.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#DeleteRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Key\": {\n          \"target\": \"com.amazonaws.dynamodb#Key\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A map of attribute name to attribute values, representing the primary key of the item to delete. All of the table's primary key attributes must be specified, and their data types must match those of the table's key schema.</p>\",\n            \"smithy.api#required\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents a request to perform a <code>DeleteItem</code> operation on an item.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#DeleteTable\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.dynamodb#DeleteTableInput\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.dynamodb#DeleteTableOutput\"\n      },\n      \"errors\": [\n        {\n          \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#InvalidEndpointException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#LimitExceededException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#ResourceInUseException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#ResourceNotFoundException\"\n        }\n      ],\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>The <code>DeleteTable</code> operation deletes a table and all of its items. After a\\n        <code>DeleteTable</code> request, the specified table is in the <code>DELETING</code> state until\\n      DynamoDB completes the deletion. If the table is in the <code>ACTIVE</code> state, you can delete\\n      it. If a table is in <code>CREATING</code> or <code>UPDATING</code> states, then DynamoDB returns\\n      a <code>ResourceInUseException</code>. If the specified table does not exist, DynamoDB returns a\\n        <code>ResourceNotFoundException</code>. If table is already in the <code>DELETING</code> state, no\\n      error is returned. </p>\\n         <note>\\n            <p>DynamoDB might continue to accept data read and write operations, such as <code>GetItem</code> and\\n          <code>PutItem</code>, on a table in the <code>DELETING</code> state until the table deletion is\\n        complete.</p>\\n         </note>\\n         <p>When you delete a table, any indexes on that table are also deleted.</p>\\n         <p>If you have DynamoDB Streams enabled on the table, then the corresponding stream on that table goes\\n      into the <code>DISABLED</code> state, and the stream is automatically deleted after 24 hours.</p>\\n\\n         <p>Use the <code>DescribeTable</code> action to check the status of the table. </p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#DeleteTableInput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"TableName\": {\n          \"target\": \"com.amazonaws.dynamodb#TableName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the table to delete.</p>\",\n            \"smithy.api#required\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents the input of a <code>DeleteTable</code> operation.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#DeleteTableOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"TableDescription\": {\n          \"target\": \"com.amazonaws.dynamodb#TableDescription\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Represents the properties of a table.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents the output of a <code>DeleteTable</code> operation.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#DescribeBackup\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.dynamodb#DescribeBackupInput\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.dynamodb#DescribeBackupOutput\"\n      },\n      \"errors\": [\n        {\n          \"target\": \"com.amazonaws.dynamodb#BackupNotFoundException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#InvalidEndpointException\"\n        }\n      ],\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Describes an existing backup of a table.</p>\\n         <p>You can call <code>DescribeBackup</code> at a maximum rate of 10 times per second.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#DescribeBackupInput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"BackupArn\": {\n          \"target\": \"com.amazonaws.dynamodb#BackupArn\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) associated with the backup.</p>\",\n            \"smithy.api#required\": {}\n          }\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#DescribeBackupOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"BackupDescription\": {\n          \"target\": \"com.amazonaws.dynamodb#BackupDescription\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Contains the description of the backup created for the table.</p>\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#DescribeContinuousBackups\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.dynamodb#DescribeContinuousBackupsInput\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.dynamodb#DescribeContinuousBackupsOutput\"\n      },\n      \"errors\": [\n        {\n          \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#InvalidEndpointException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#TableNotFoundException\"\n        }\n      ],\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Checks the status of continuous backups and point in time recovery on the specified table.\\n      Continuous backups are <code>ENABLED</code> on all tables at table creation.\\n      If point in time recovery is enabled, <code>PointInTimeRecoveryStatus</code> will be set to ENABLED.</p>\\n         <p> After continuous backups and point in time recovery are enabled, you can restore to any\\n            point in time within <code>EarliestRestorableDateTime</code> and\\n                <code>LatestRestorableDateTime</code>. </p>\\n         <p>\\n            <code>LatestRestorableDateTime</code> is typically 5 minutes before the current time. You can restore your table to any point\\n       in time during the last 35 days.\\n     </p>\\n         <p>You can call <code>DescribeContinuousBackups</code> at a maximum rate of 10 times per second.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#DescribeContinuousBackupsInput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"TableName\": {\n          \"target\": \"com.amazonaws.dynamodb#TableName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Name of the table for which the customer wants to check the continuous backups and point in time recovery settings.</p>\",\n            \"smithy.api#required\": {}\n          }\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#DescribeContinuousBackupsOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"ContinuousBackupsDescription\": {\n          \"target\": \"com.amazonaws.dynamodb#ContinuousBackupsDescription\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Represents the continuous backups and point in time recovery settings on the table.</p>\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#DescribeContributorInsights\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.dynamodb#DescribeContributorInsightsInput\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.dynamodb#DescribeContributorInsightsOutput\"\n      },\n      \"errors\": [\n        {\n          \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#ResourceNotFoundException\"\n        }\n      ],\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Returns information about contributor insights, for a given table or global secondary index.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#DescribeContributorInsightsInput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"TableName\": {\n          \"target\": \"com.amazonaws.dynamodb#TableName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the table to describe.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"IndexName\": {\n          \"target\": \"com.amazonaws.dynamodb#IndexName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the global secondary index to describe, if applicable.</p>\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#DescribeContributorInsightsOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"TableName\": {\n          \"target\": \"com.amazonaws.dynamodb#TableName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the table being described.</p>\"\n          }\n        },\n        \"IndexName\": {\n          \"target\": \"com.amazonaws.dynamodb#IndexName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the global secondary index being described.</p>\"\n          }\n        },\n        \"ContributorInsightsRuleList\": {\n          \"target\": \"com.amazonaws.dynamodb#ContributorInsightsRuleList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>List of names of the associated Alpine rules.</p>\"\n          }\n        },\n        \"ContributorInsightsStatus\": {\n          \"target\": \"com.amazonaws.dynamodb#ContributorInsightsStatus\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Current Status contributor insights.</p>\"\n          }\n        },\n        \"LastUpdateDateTime\": {\n          \"target\": \"com.amazonaws.dynamodb#LastUpdateDateTime\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Timestamp of the last time the status was changed.</p>\"\n          }\n        },\n        \"FailureException\": {\n          \"target\": \"com.amazonaws.dynamodb#FailureException\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Returns information about the last failure that encountered.</p>\\n         <p>The most common exceptions for a FAILED status are:</p>\\n         <ul>\\n            <li>\\n               <p>LimitExceededException - \\tPer-account Amazon CloudWatch Contributor Insights rule limit reached. Please disable Contributor Insights for\\n         other tables/indexes OR disable Contributor Insights rules before retrying.</p>\\n            </li>\\n            <li>\\n               <p>AccessDeniedException - Amazon CloudWatch Contributor Insights rules cannot be modified due to insufficient permissions.</p>\\n            </li>\\n            <li>\\n               <p>AccessDeniedException - Failed to create service-linked role for Contributor Insights due to insufficient permissions.</p>\\n            </li>\\n            <li>\\n               <p>InternalServerError - Failed to create Amazon CloudWatch Contributor Insights rules. Please retry request.</p>\\n            </li>\\n         </ul>\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#DescribeEndpoints\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.dynamodb#DescribeEndpointsRequest\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.dynamodb#DescribeEndpointsResponse\"\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Returns the regional endpoint information.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#DescribeEndpointsRequest\": {\n      \"type\": \"structure\",\n      \"members\": {}\n    },\n    \"com.amazonaws.dynamodb#DescribeEndpointsResponse\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Endpoints\": {\n          \"target\": \"com.amazonaws.dynamodb#Endpoints\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>List of endpoints.</p>\",\n            \"smithy.api#required\": {}\n          }\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#DescribeExport\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.dynamodb#DescribeExportInput\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.dynamodb#DescribeExportOutput\"\n      },\n      \"errors\": [\n        {\n          \"target\": \"com.amazonaws.dynamodb#ExportNotFoundException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#LimitExceededException\"\n        }\n      ],\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Describes an existing table export.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#DescribeExportInput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"ExportArn\": {\n          \"target\": \"com.amazonaws.dynamodb#ExportArn\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) associated with the export.</p>\",\n            \"smithy.api#required\": {}\n          }\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#DescribeExportOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"ExportDescription\": {\n          \"target\": \"com.amazonaws.dynamodb#ExportDescription\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Represents the properties of the export.</p>\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#DescribeGlobalTable\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.dynamodb#DescribeGlobalTableInput\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.dynamodb#DescribeGlobalTableOutput\"\n      },\n      \"errors\": [\n        {\n          \"target\": \"com.amazonaws.dynamodb#GlobalTableNotFoundException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#InvalidEndpointException\"\n        }\n      ],\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Returns information about the specified global table.</p>\\n          <note>\\n            <p>This operation only applies to <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/globaltables.V1.html\\\">Version 2017.11.29</a> of global tables.\\n                   If you are using global tables <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/globaltables.V2.html\\\">Version 2019.11.21</a> you can use <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_DescribeTable.html\\\">DescribeTable</a> instead.</p>\\n         </note>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#DescribeGlobalTableInput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"GlobalTableName\": {\n          \"target\": \"com.amazonaws.dynamodb#TableName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the global table.</p>\",\n            \"smithy.api#required\": {}\n          }\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#DescribeGlobalTableOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"GlobalTableDescription\": {\n          \"target\": \"com.amazonaws.dynamodb#GlobalTableDescription\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Contains the details of the global table.</p>\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#DescribeGlobalTableSettings\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.dynamodb#DescribeGlobalTableSettingsInput\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.dynamodb#DescribeGlobalTableSettingsOutput\"\n      },\n      \"errors\": [\n        {\n          \"target\": \"com.amazonaws.dynamodb#GlobalTableNotFoundException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#InvalidEndpointException\"\n        }\n      ],\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Describes Region-specific settings for a global table.</p>\\n          <note>\\n            <p>This operation only applies to <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/globaltables.V1.html\\\">Version 2017.11.29</a> of global tables.</p>\\n         </note>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#DescribeGlobalTableSettingsInput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"GlobalTableName\": {\n          \"target\": \"com.amazonaws.dynamodb#TableName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the global table to describe.</p>\",\n            \"smithy.api#required\": {}\n          }\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#DescribeGlobalTableSettingsOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"GlobalTableName\": {\n          \"target\": \"com.amazonaws.dynamodb#TableName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the global table.</p>\"\n          }\n        },\n        \"ReplicaSettings\": {\n          \"target\": \"com.amazonaws.dynamodb#ReplicaSettingsDescriptionList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Region-specific settings for the global table.</p>\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#DescribeKinesisStreamingDestination\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.dynamodb#DescribeKinesisStreamingDestinationInput\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.dynamodb#DescribeKinesisStreamingDestinationOutput\"\n      },\n      \"errors\": [\n        {\n          \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#InvalidEndpointException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#ResourceNotFoundException\"\n        }\n      ],\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Returns information about the status of Kinesis streaming.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#DescribeKinesisStreamingDestinationInput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"TableName\": {\n          \"target\": \"com.amazonaws.dynamodb#TableName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the table being described.</p>\",\n            \"smithy.api#required\": {}\n          }\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#DescribeKinesisStreamingDestinationOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"TableName\": {\n          \"target\": \"com.amazonaws.dynamodb#TableName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the table being described.</p>\"\n          }\n        },\n        \"KinesisDataStreamDestinations\": {\n          \"target\": \"com.amazonaws.dynamodb#KinesisDataStreamDestinations\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The list of replica structures for the table being described.</p>\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#DescribeLimits\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.dynamodb#DescribeLimitsInput\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.dynamodb#DescribeLimitsOutput\"\n      },\n      \"errors\": [\n        {\n          \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#InvalidEndpointException\"\n        }\n      ],\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Returns the current provisioned-capacity quotas for your AWS account in a Region, both\\n            for the Region as a whole and for any one DynamoDB table that you create there.</p>\\n         <p>When you establish an AWS account, the account has initial quotas on the maximum read\\n            capacity units and write capacity units that you can provision across all of your\\n            DynamoDB tables in a given Region. Also, there are per-table quotas that apply when you\\n            create a table there. For more information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Limits.html\\\">Service, Account, and Table\\n                Quotas</a> page in the <i>Amazon DynamoDB Developer\\n            Guide</i>.</p>\\n\\n         <p>Although you can increase these quotas by filing a case at <a href=\\\"https://console.aws.amazon.com/support/home#/\\\">AWS Support Center</a>, obtaining the increase is not\\n            instantaneous. The <code>DescribeLimits</code> action lets you write code to compare the\\n            capacity you are currently using to those quotas imposed by your account so that you\\n            have enough time to apply for an increase before you hit a quota.</p>\\n\\n         <p>For example, you could use one of the AWS SDKs to do the following:</p>\\n\\n         <ol>\\n            <li>\\n               <p>Call <code>DescribeLimits</code> for a particular Region to obtain your current\\n                    account quotas on provisioned capacity there.</p>\\n            </li>\\n            <li>\\n               <p>Create a variable to hold the aggregate read capacity units provisioned for all\\n                    your tables in that Region, and one to hold the aggregate write capacity units.\\n                    Zero them both.</p>\\n            </li>\\n            <li>\\n               <p>Call <code>ListTables</code> to obtain a list of all your DynamoDB tables.</p>\\n            </li>\\n            <li>\\n               <p>For each table name listed by <code>ListTables</code>, do the following:</p>\\n               <ul>\\n                  <li>\\n                     <p>Call <code>DescribeTable</code> with the table name.</p>\\n                  </li>\\n                  <li>\\n                     <p>Use the data returned by <code>DescribeTable</code> to add the read capacity units and write capacity\\n            units provisioned for the table itself to your variables.</p>\\n                  </li>\\n                  <li>\\n                     <p>If the table has one or more global secondary indexes (GSIs), loop over these GSIs and add their provisioned capacity values to your variables as well.</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <p>Report the account quotas for that Region returned by <code>DescribeLimits</code>, along with\\n                    the total current provisioned capacity levels you have calculated.</p>\\n            </li>\\n         </ol>\\n\\n         <p>This will let you see whether you are getting close to your account-level quotas.</p>\\n         <p>The per-table quotas apply only when you are creating a new table. They restrict the sum\\n            of the provisioned capacity of the new table itself and all its global secondary\\n            indexes.</p>\\n         <p>For existing tables and their GSIs, DynamoDB doesn't let you increase provisioned\\n            capacity extremely rapidly, but the only quota that applies is that the aggregate\\n            provisioned capacity over all your tables and GSIs cannot exceed either of the\\n            per-account quotas.</p>\\n         <note>\\n            <p>\\n               <code>DescribeLimits</code> should only be called periodically. You can expect throttling\\n        errors if you call it more than once in a minute.</p>\\n         </note>\\n         <p>The <code>DescribeLimits</code> Request element has no content.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#DescribeLimitsInput\": {\n      \"type\": \"structure\",\n      \"members\": {},\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents the input of a <code>DescribeLimits</code> operation. Has no content.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#DescribeLimitsOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"AccountMaxReadCapacityUnits\": {\n          \"target\": \"com.amazonaws.dynamodb#PositiveLongObject\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The maximum total read capacity units that your account allows you to provision across\\n            all of your tables in this Region.</p>\"\n          }\n        },\n        \"AccountMaxWriteCapacityUnits\": {\n          \"target\": \"com.amazonaws.dynamodb#PositiveLongObject\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The maximum total write capacity units that your account allows you to provision across\\n            all of your tables in this Region.</p>\"\n          }\n        },\n        \"TableMaxReadCapacityUnits\": {\n          \"target\": \"com.amazonaws.dynamodb#PositiveLongObject\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The maximum read capacity units that your account allows you to provision for a new\\n            table that you are creating in this Region, including the read capacity units\\n            provisioned for its global secondary indexes (GSIs).</p>\"\n          }\n        },\n        \"TableMaxWriteCapacityUnits\": {\n          \"target\": \"com.amazonaws.dynamodb#PositiveLongObject\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The maximum write capacity units that your account allows you to provision for a new\\n            table that you are creating in this Region, including the write capacity units\\n            provisioned for its global secondary indexes (GSIs).</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents the output of a <code>DescribeLimits</code> operation.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#DescribeTable\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.dynamodb#DescribeTableInput\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.dynamodb#DescribeTableOutput\"\n      },\n      \"errors\": [\n        {\n          \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#InvalidEndpointException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#ResourceNotFoundException\"\n        }\n      ],\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Returns information about the table, including the current status of the table, when it was created, the primary key schema, and any indexes on the table.</p>\\n         <note>\\n            <p>If you issue a <code>DescribeTable</code> request immediately after a <code>CreateTable</code> request, DynamoDB might\\n        return a <code>ResourceNotFoundException</code>. This is because <code>DescribeTable</code> uses an eventually\\n        consistent query, and the metadata for your table might not be available at that moment.\\n        Wait for a few seconds, and then try the <code>DescribeTable</code> request again.</p>\\n         </note>\",\n        \"smithy.waiters#waitable\": {\n          \"TableExists\": {\n            \"acceptors\": [\n              {\n                \"state\": \"success\",\n                \"matcher\": {\n                  \"output\": {\n                    \"path\": \"Table.TableStatus\",\n                    \"expected\": \"ACTIVE\",\n                    \"comparator\": \"stringEquals\"\n                  }\n                }\n              },\n              {\n                \"state\": \"retry\",\n                \"matcher\": {\n                  \"errorType\": \"ResourceNotFoundException\"\n                }\n              }\n            ],\n            \"minDelay\": 20\n          },\n          \"TableNotExists\": {\n            \"acceptors\": [\n              {\n                \"state\": \"success\",\n                \"matcher\": {\n                  \"errorType\": \"ResourceNotFoundException\"\n                }\n              }\n            ],\n            \"minDelay\": 20\n          }\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#DescribeTableInput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"TableName\": {\n          \"target\": \"com.amazonaws.dynamodb#TableName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the table to describe.</p>\",\n            \"smithy.api#required\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents the input of a <code>DescribeTable</code> operation.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#DescribeTableOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Table\": {\n          \"target\": \"com.amazonaws.dynamodb#TableDescription\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The properties of the table.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents the output of a <code>DescribeTable</code> operation.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#DescribeTableReplicaAutoScaling\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.dynamodb#DescribeTableReplicaAutoScalingInput\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.dynamodb#DescribeTableReplicaAutoScalingOutput\"\n      },\n      \"errors\": [\n        {\n          \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#ResourceNotFoundException\"\n        }\n      ],\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Describes auto scaling settings across replicas of the global table at once.</p>\\n         <note>\\n            <p>This operation only applies to <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/globaltables.V2.html\\\">Version 2019.11.21</a> of global tables.</p>\\n         </note>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#DescribeTableReplicaAutoScalingInput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"TableName\": {\n          \"target\": \"com.amazonaws.dynamodb#TableName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the table.</p>\",\n            \"smithy.api#required\": {}\n          }\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#DescribeTableReplicaAutoScalingOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"TableAutoScalingDescription\": {\n          \"target\": \"com.amazonaws.dynamodb#TableAutoScalingDescription\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Represents the auto scaling properties of the table.</p>\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#DescribeTimeToLive\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.dynamodb#DescribeTimeToLiveInput\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.dynamodb#DescribeTimeToLiveOutput\"\n      },\n      \"errors\": [\n        {\n          \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#InvalidEndpointException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#ResourceNotFoundException\"\n        }\n      ],\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Gives a description of the Time to Live (TTL) status on the specified table. </p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#DescribeTimeToLiveInput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"TableName\": {\n          \"target\": \"com.amazonaws.dynamodb#TableName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the table to be described.</p>\",\n            \"smithy.api#required\": {}\n          }\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#DescribeTimeToLiveOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"TimeToLiveDescription\": {\n          \"target\": \"com.amazonaws.dynamodb#TimeToLiveDescription\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p></p>\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#DestinationStatus\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#enum\": [\n          {\n            \"value\": \"ENABLING\",\n            \"name\": \"ENABLING\"\n          },\n          {\n            \"value\": \"ACTIVE\",\n            \"name\": \"ACTIVE\"\n          },\n          {\n            \"value\": \"DISABLING\",\n            \"name\": \"DISABLING\"\n          },\n          {\n            \"value\": \"DISABLED\",\n            \"name\": \"DISABLED\"\n          },\n          {\n            \"value\": \"ENABLE_FAILED\",\n            \"name\": \"ENABLE_FAILED\"\n          }\n        ]\n      }\n    },\n    \"com.amazonaws.dynamodb#DisableKinesisStreamingDestination\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.dynamodb#KinesisStreamingDestinationInput\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.dynamodb#KinesisStreamingDestinationOutput\"\n      },\n      \"errors\": [\n        {\n          \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#InvalidEndpointException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#LimitExceededException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#ResourceInUseException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#ResourceNotFoundException\"\n        }\n      ],\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Stops replication from the DynamoDB table to the Kinesis data stream. This is done\\n            without deleting either of the resources.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#Double\": {\n      \"type\": \"double\",\n      \"traits\": {\n        \"smithy.api#box\": {}\n      }\n    },\n    \"com.amazonaws.dynamodb#DuplicateItemException\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"message\": {\n          \"target\": \"com.amazonaws.dynamodb#ErrorMessage\"\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>\\nThere was an attempt to insert an item with the same primary key as an item that already exists in the DynamoDB table.\\n</p>\",\n        \"smithy.api#error\": \"client\"\n      }\n    },\n    \"com.amazonaws.dynamodb#DynamoDB_20120810\": {\n      \"type\": \"service\",\n      \"version\": \"2012-08-10\",\n      \"operations\": [\n        {\n          \"target\": \"com.amazonaws.dynamodb#BatchExecuteStatement\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#BatchGetItem\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#BatchWriteItem\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#CreateBackup\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#CreateGlobalTable\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#CreateTable\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#DeleteBackup\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#DeleteItem\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#DeleteTable\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#DescribeBackup\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#DescribeContinuousBackups\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#DescribeContributorInsights\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#DescribeEndpoints\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#DescribeExport\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#DescribeGlobalTable\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#DescribeGlobalTableSettings\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#DescribeKinesisStreamingDestination\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#DescribeLimits\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#DescribeTable\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#DescribeTableReplicaAutoScaling\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#DescribeTimeToLive\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#DisableKinesisStreamingDestination\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#EnableKinesisStreamingDestination\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#ExecuteStatement\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#ExecuteTransaction\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#ExportTableToPointInTime\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#GetItem\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#ListBackups\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#ListContributorInsights\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#ListExports\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#ListGlobalTables\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#ListTables\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#ListTagsOfResource\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#PutItem\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#Query\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#RestoreTableFromBackup\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#RestoreTableToPointInTime\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#Scan\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#TagResource\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#TransactGetItems\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#TransactWriteItems\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#UntagResource\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#UpdateContinuousBackups\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#UpdateContributorInsights\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#UpdateGlobalTable\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#UpdateGlobalTableSettings\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#UpdateItem\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#UpdateTable\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#UpdateTableReplicaAutoScaling\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#UpdateTimeToLive\"\n        }\n      ],\n      \"traits\": {\n        \"aws.api#clientEndpointDiscovery\": {\n          \"operation\": \"com.amazonaws.dynamodb#DescribeEndpoints\",\n          \"error\": \"com.amazonaws.dynamodb#InvalidEndpointException\"\n        },\n        \"aws.api#service\": {\n          \"sdkId\": \"DynamoDB\",\n          \"arnNamespace\": \"dynamodb\",\n          \"cloudFormationName\": \"DynamoDB\",\n          \"cloudTrailEventSource\": \"dynamodb.amazonaws.com\",\n          \"endpointPrefix\": \"dynamodb\"\n        },\n        \"aws.auth#sigv4\": {\n          \"name\": \"dynamodb\"\n        },\n        \"aws.protocols#awsJson1_0\": {},\n        \"smithy.api#documentation\": \"<fullname>Amazon DynamoDB</fullname>\\n\\n\\n         <p>Amazon DynamoDB is a fully managed NoSQL database service that provides fast and\\n      predictable performance with seamless scalability. DynamoDB lets you offload the\\n      administrative burdens of operating and scaling a distributed database, so that you don't have\\n      to worry about hardware provisioning, setup and configuration, replication, software patching,\\n      or cluster scaling.</p>\\n\\n         <p>With DynamoDB, you can create database tables that can store and retrieve any amount of\\n      data, and serve any level of request traffic. You can scale up or scale down your tables'\\n      throughput capacity without downtime or performance degradation, and use the AWS Management\\n      Console to monitor resource utilization and performance metrics.</p>\\n\\n         <p>DynamoDB automatically spreads the data and traffic for your tables over a sufficient\\n      number of servers to handle your throughput and storage requirements, while maintaining\\n      consistent and fast performance. All of your data is stored on solid state disks (SSDs) and\\n      automatically replicated across multiple Availability Zones in an AWS region, providing\\n      built-in high availability and data durability. </p>\",\n        \"smithy.api#title\": \"Amazon DynamoDB\",\n        \"smithy.api#xmlNamespace\": {\n          \"uri\": \"http://dynamodb.amazonaws.com/doc/2012-08-10/\"\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#EnableKinesisStreamingDestination\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.dynamodb#KinesisStreamingDestinationInput\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.dynamodb#KinesisStreamingDestinationOutput\"\n      },\n      \"errors\": [\n        {\n          \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#InvalidEndpointException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#LimitExceededException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#ResourceInUseException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#ResourceNotFoundException\"\n        }\n      ],\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Starts table data replication to the specified Kinesis data stream at a timestamp chosen\\n            during the enable workflow. If this operation doesn't return results immediately, use\\n            DescribeKinesisStreamingDestination to check if streaming to the Kinesis data stream is\\n            ACTIVE.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#Endpoint\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Address\": {\n          \"target\": \"com.amazonaws.dynamodb#String\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>IP address of the endpoint.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"CachePeriodInMinutes\": {\n          \"target\": \"com.amazonaws.dynamodb#Long\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Endpoint cache time to live (TTL) value.</p>\",\n            \"smithy.api#required\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>An endpoint information details.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#Endpoints\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.dynamodb#Endpoint\"\n      }\n    },\n    \"com.amazonaws.dynamodb#ErrorMessage\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.dynamodb#ExceptionDescription\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.dynamodb#ExceptionName\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.dynamodb#ExecuteStatement\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.dynamodb#ExecuteStatementInput\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.dynamodb#ExecuteStatementOutput\"\n      },\n      \"errors\": [\n        {\n          \"target\": \"com.amazonaws.dynamodb#ConditionalCheckFailedException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#DuplicateItemException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#ItemCollectionSizeLimitExceededException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#ProvisionedThroughputExceededException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#RequestLimitExceeded\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#ResourceNotFoundException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#TransactionConflictException\"\n        }\n      ],\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>\\nThis operation allows you to perform reads and singleton writes on data stored in DynamoDB, using PartiQL.\\n</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#ExecuteStatementInput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Statement\": {\n          \"target\": \"com.amazonaws.dynamodb#PartiQLStatement\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>\\nThe PartiQL statement representing the operation to run.\\n</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"Parameters\": {\n          \"target\": \"com.amazonaws.dynamodb#PreparedStatementParameters\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>\\nThe parameters for the PartiQL statement, if any.\\n</p>\"\n          }\n        },\n        \"ConsistentRead\": {\n          \"target\": \"com.amazonaws.dynamodb#ConsistentRead\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>\\nThe consistency of a read operation. If set to <code>true</code>, then a strongly consistent read is used; otherwise, an eventually consistent read is used.\\n</p>\"\n          }\n        },\n        \"NextToken\": {\n          \"target\": \"com.amazonaws.dynamodb#PartiQLNextToken\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>\\nSet this value to get remaining results, if <code>NextToken</code> was returned in the statement response.\\n</p>\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#ExecuteStatementOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Items\": {\n          \"target\": \"com.amazonaws.dynamodb#ItemList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>\\nIf a read operation was used, this property will contain the result of the reade operation; a map of attribute names and their values. For the write operations this value will be empty.\\n</p>\"\n          }\n        },\n        \"NextToken\": {\n          \"target\": \"com.amazonaws.dynamodb#PartiQLNextToken\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>\\nIf the response of a read request exceeds the response payload limit DynamoDB will set this value in the response. If set, you can use that this value in the subsequent request to get the remaining results.\\n</p>\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#ExecuteTransaction\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.dynamodb#ExecuteTransactionInput\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.dynamodb#ExecuteTransactionOutput\"\n      },\n      \"errors\": [\n        {\n          \"target\": \"com.amazonaws.dynamodb#IdempotentParameterMismatchException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#ProvisionedThroughputExceededException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#RequestLimitExceeded\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#ResourceNotFoundException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#TransactionCanceledException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#TransactionInProgressException\"\n        }\n      ],\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>\\nThis operation allows you to perform transactional reads or writes on data stored in DynamoDB, using PartiQL.\\n</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#ExecuteTransactionInput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"TransactStatements\": {\n          \"target\": \"com.amazonaws.dynamodb#ParameterizedStatements\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>\\nThe list of PartiQL statements representing the transaction to run.\\n</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"ClientRequestToken\": {\n          \"target\": \"com.amazonaws.dynamodb#ClientRequestToken\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>\\nSet this value to get remaining results, if <code>NextToken</code> was returned in the statement response.\\n</p>\",\n            \"smithy.api#idempotencyToken\": {}\n          }\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#ExecuteTransactionOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Responses\": {\n          \"target\": \"com.amazonaws.dynamodb#ItemResponseList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>\\nThe response to a PartiQL transaction.\\n</p>\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#ExpectedAttributeMap\": {\n      \"type\": \"map\",\n      \"key\": {\n        \"target\": \"com.amazonaws.dynamodb#AttributeName\"\n      },\n      \"value\": {\n        \"target\": \"com.amazonaws.dynamodb#ExpectedAttributeValue\"\n      }\n    },\n    \"com.amazonaws.dynamodb#ExpectedAttributeValue\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Value\": {\n          \"target\": \"com.amazonaws.dynamodb#AttributeValue\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Represents the data for the expected attribute.</p>\\n         <p>Each attribute value is described as a name-value pair.  The name is the data type, and the value is the data itself.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.NamingRulesDataTypes.html#HowItWorks.DataTypes\\\">Data Types</a> in the\\n         <i>Amazon DynamoDB Developer Guide</i>.</p>\"\n          }\n        },\n        \"Exists\": {\n          \"target\": \"com.amazonaws.dynamodb#BooleanObject\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Causes DynamoDB to evaluate the value before attempting a conditional operation:</p>\\n         <ul>\\n            <li>\\n               <p>If <code>Exists</code> is <code>true</code>, DynamoDB will check to see if that attribute value\\n          already exists in the table. If it is found, then the operation succeeds. If it is not\\n          found, the operation fails with a <code>ConditionCheckFailedException</code>.</p>\\n            </li>\\n            <li>\\n               <p>If <code>Exists</code> is <code>false</code>, DynamoDB assumes that the attribute value does\\n            not exist in the table. If in fact the value does not exist, then the assumption\\n          is valid and the operation succeeds. If the value is found, despite the assumption that it\\n          does not exist, the operation fails with a <code>ConditionCheckFailedException</code>.</p>\\n            </li>\\n         </ul>\\n         <p>The default setting for <code>Exists</code> is <code>true</code>. If you supply a <code>Value</code> all\\n      by itself, DynamoDB assumes the attribute exists: You don't have to set <code>Exists</code> to\\n        <code>true</code>, because it is implied.</p>\\n         <p>DynamoDB returns a <code>ValidationException</code> if:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>Exists</code> is <code>true</code> but there is no <code>Value</code> to check. (You expect a\\n          value to exist, but don't specify what that value is.)</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>Exists</code> is <code>false</code> but you also provide a <code>Value</code>. (You cannot\\n          expect an attribute to have a value, while also expecting it not to exist.)</p>\\n            </li>\\n         </ul>\"\n          }\n        },\n        \"ComparisonOperator\": {\n          \"target\": \"com.amazonaws.dynamodb#ComparisonOperator\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A comparator for evaluating attributes in the <code>AttributeValueList</code>. For example, equals,\\n      greater than, less than, etc.</p>\\n         <p>The following comparison operators are available:</p>\\n         <p>\\n            <code>EQ | NE | LE | LT | GE | GT | NOT_NULL | NULL | CONTAINS | NOT_CONTAINS | BEGINS_WITH | IN | BETWEEN</code>\\n         </p>\\n         <p>The following are descriptions of each comparison operator.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>EQ</code> : Equal. <code>EQ</code> is supported for all data types, including lists and maps.</p>\\n               <p>\\n                  <code>AttributeValueList</code> can contain only one <code>AttributeValue</code> element of type String,\\n          Number, Binary, String Set, Number Set, or Binary Set. If an item contains an <code>AttributeValue</code> element of a different\\n          type than the one provided in the request, the value does not match. For example,\\n            <code>{\\\"S\\\":\\\"6\\\"}</code> does not equal <code>{\\\"N\\\":\\\"6\\\"}</code>. Also,\\n            <code>{\\\"N\\\":\\\"6\\\"}</code> does not equal <code>{\\\"NS\\\":[\\\"6\\\", \\\"2\\\", \\\"1\\\"]}</code>.</p>\\n               <p></p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>NE</code> : Not equal. <code>NE</code> is supported for all data types, including lists and maps.</p>\\n               <p>\\n                  <code>AttributeValueList</code> can contain only one <code>AttributeValue</code> of type String,\\n          Number, Binary, String Set, Number Set, or Binary Set. If an item contains an <code>AttributeValue</code> of a different\\n          type than the one provided in the request, the value does not match. For example,\\n            <code>{\\\"S\\\":\\\"6\\\"}</code> does not equal <code>{\\\"N\\\":\\\"6\\\"}</code>. Also,\\n            <code>{\\\"N\\\":\\\"6\\\"}</code> does not equal <code>{\\\"NS\\\":[\\\"6\\\", \\\"2\\\", \\\"1\\\"]}</code>.</p>\\n               <p></p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>LE</code> : Less than or equal. </p>\\n               <p>\\n                  <code>AttributeValueList</code> can contain only one <code>AttributeValue</code> element of type String,\\n          Number, or Binary (not a set type). If an item contains an <code>AttributeValue</code> element of a different\\n          type than the one provided in the request, the value does not match. For example,\\n            <code>{\\\"S\\\":\\\"6\\\"}</code> does not equal <code>{\\\"N\\\":\\\"6\\\"}</code>. Also,\\n            <code>{\\\"N\\\":\\\"6\\\"}</code> does not compare to <code>{\\\"NS\\\":[\\\"6\\\", \\\"2\\\", \\\"1\\\"]}</code>.</p>\\n               <p></p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>LT</code> : Less than. </p>\\n               <p>\\n                  <code>AttributeValueList</code> can contain only one <code>AttributeValue</code> of type String,\\n          Number, or Binary (not a set type). If an item contains an <code>AttributeValue</code> element of a different\\n          type than the one provided in the request, the value does not match. For example,\\n            <code>{\\\"S\\\":\\\"6\\\"}</code> does not equal <code>{\\\"N\\\":\\\"6\\\"}</code>. Also,\\n            <code>{\\\"N\\\":\\\"6\\\"}</code> does not compare to <code>{\\\"NS\\\":[\\\"6\\\", \\\"2\\\", \\\"1\\\"]}</code>.</p>\\n               <p></p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>GE</code> : Greater than or equal. </p>\\n               <p>\\n                  <code>AttributeValueList</code> can contain only one <code>AttributeValue</code> element of type String,\\n          Number, or Binary (not a set type). If an item contains an <code>AttributeValue</code> element of a different\\n          type than the one provided in the request, the value does not match. For example,\\n            <code>{\\\"S\\\":\\\"6\\\"}</code> does not equal <code>{\\\"N\\\":\\\"6\\\"}</code>. Also,\\n            <code>{\\\"N\\\":\\\"6\\\"}</code> does not compare to <code>{\\\"NS\\\":[\\\"6\\\", \\\"2\\\", \\\"1\\\"]}</code>.</p>\\n               <p></p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>GT</code> : Greater than. </p>\\n               <p>\\n                  <code>AttributeValueList</code> can contain only one <code>AttributeValue</code> element of type String,\\n          Number, or Binary (not a set type). If an item contains an <code>AttributeValue</code> element of a different\\n          type than the one provided in the request, the value does not match. For example,\\n            <code>{\\\"S\\\":\\\"6\\\"}</code> does not equal <code>{\\\"N\\\":\\\"6\\\"}</code>. Also,\\n            <code>{\\\"N\\\":\\\"6\\\"}</code> does not compare to <code>{\\\"NS\\\":[\\\"6\\\", \\\"2\\\", \\\"1\\\"]}</code>.</p>\\n               <p></p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>NOT_NULL</code> : The attribute exists. <code>NOT_NULL</code> is supported for all data types, including lists and maps.</p>\\n               <note>\\n                  <p>This operator tests for the existence of an attribute, not its data type.  If the data type of attribute \\\"<code>a</code>\\\" is null, and you evaluate it using <code>NOT_NULL</code>, the result is a Boolean <code>true</code>. This result is because the attribute \\\"<code>a</code>\\\" exists; its data type is not relevant to the <code>NOT_NULL</code> comparison operator.</p>\\n               </note>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>NULL</code> : The attribute does not exist. <code>NULL</code> is supported for all data types, including lists and maps.</p>\\n               <note>\\n                  <p>This operator tests for the nonexistence of an attribute, not its data type.  If the data type of attribute \\\"<code>a</code>\\\" is null, and you evaluate it using <code>NULL</code>, the result is a Boolean <code>false</code>. This is because the attribute \\\"<code>a</code>\\\" exists; its data type is not relevant to the <code>NULL</code> comparison operator.</p>\\n               </note>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>CONTAINS</code> : Checks for a subsequence, or value in a set.</p>\\n               <p>\\n                  <code>AttributeValueList</code> can contain only one <code>AttributeValue</code> element of type String,\\n          Number, or Binary (not a set type). If the target attribute of the comparison is of type String, then\\n          the operator checks for a substring match. If the target attribute of the comparison is\\n          of type Binary, then the operator looks for a subsequence of the target that matches the input.\\n          If the target attribute of the comparison is a set (\\\"<code>SS</code>\\\", \\\"<code>NS</code>\\\", or \\\"<code>BS</code>\\\"), then the\\n          operator evaluates to true if it finds an exact match with any member of the set.</p>\\n               <p>CONTAINS is supported for lists: When evaluating \\\"<code>a CONTAINS b</code>\\\", \\\"<code>a</code>\\\" can be a list; however, \\\"<code>b</code>\\\" cannot be a set, a map, or a list.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>NOT_CONTAINS</code> : Checks for absence of a subsequence, or absence of a value in\\n          a set.</p>\\n               <p>\\n                  <code>AttributeValueList</code> can contain only one <code>AttributeValue</code> element of type String,\\n          Number, or Binary (not a set type). If the target attribute of the comparison is a String, then\\n          the operator checks for the absence of a substring match. If the target attribute of the\\n          comparison is Binary, then the operator checks for the absence of a subsequence of the\\n          target that matches the input. If the target attribute of the comparison is a set (\\\"<code>SS</code>\\\",\\n          \\\"<code>NS</code>\\\", or \\\"<code>BS</code>\\\"), then the operator evaluates to true if it <i>does not</i> find an exact match with any member of the set.</p>\\n               <p>NOT_CONTAINS is supported for lists: When evaluating \\\"<code>a NOT CONTAINS b</code>\\\", \\\"<code>a</code>\\\" can be a list; however, \\\"<code>b</code>\\\" cannot be a set, a map, or a list.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>BEGINS_WITH</code> : Checks for a prefix. </p>\\n               <p>\\n                  <code>AttributeValueList</code> can contain only one <code>AttributeValue</code> of type String or\\n          Binary (not a Number or a set type). The target attribute of the comparison must be of type String or\\n          Binary (not a Number or a set type).</p>\\n               <p></p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>IN</code> : Checks for matching elements in a list.</p>\\n               <p>\\n                  <code>AttributeValueList</code> can contain one or more <code>AttributeValue</code>\\n               elements of type String, Number, or Binary. These attributes are compared against an\\n               existing attribute of an item. If any elements of the input are equal to the item\\n               attribute, the expression evaluates to true.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>BETWEEN</code> : Greater than or equal to the first value, and less than or equal\\n          to the second value. </p>\\n               <p>\\n                  <code>AttributeValueList</code> must contain two <code>AttributeValue</code> elements of the same\\n          type, either String, Number, or Binary (not a set type). A target attribute matches if the\\n          target value is greater than, or equal to, the first element and less than, or equal to,\\n          the second element. If an item contains an <code>AttributeValue</code> element of a different type than\\n          the one provided in the request, the value does not match. For example,\\n            <code>{\\\"S\\\":\\\"6\\\"}</code> does not compare to <code>{\\\"N\\\":\\\"6\\\"}</code>. Also,\\n            <code>{\\\"N\\\":\\\"6\\\"}</code> does not compare to <code>{\\\"NS\\\":[\\\"6\\\", \\\"2\\\", \\\"1\\\"]}</code>\\n               </p>\\n            </li>\\n         </ul>\"\n          }\n        },\n        \"AttributeValueList\": {\n          \"target\": \"com.amazonaws.dynamodb#AttributeValueList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>One or more values to evaluate against the supplied attribute. The number of values in the\\n      list depends on the <code>ComparisonOperator</code> being used.</p>\\n         <p>For type Number, value comparisons are numeric.</p>\\n         <p>String value comparisons for greater than, equals, or less than are based on ASCII character\\n      code values. For example, <code>a</code> is greater than <code>A</code>, and <code>a</code>\\n      is greater than <code>B</code>. For a list of code values, see <a href=\\\"http://en.wikipedia.org/wiki/ASCII#ASCII_printable_characters\\\">http://en.wikipedia.org/wiki/ASCII#ASCII_printable_characters</a>.</p>\\n         <p>For Binary, DynamoDB treats each byte of the binary data as unsigned when it compares binary values.</p>\\n         <p>For information on specifying data types in JSON, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DataFormat.html\\\">JSON Data Format</a> in the <i>Amazon DynamoDB Developer Guide</i>.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents a condition to be compared with an attribute value. This condition can be\\n         used with <code>DeleteItem</code>, <code>PutItem</code>, or <code>UpdateItem</code>\\n         operations; if the comparison evaluates to true, the operation succeeds; if not, the\\n         operation fails. You can use <code>ExpectedAttributeValue</code> in one of two different\\n         ways:</p>\\n         <ul>\\n            <li>\\n               <p>Use <code>AttributeValueList</code> to specify one or more values to compare against an\\n          attribute. Use <code>ComparisonOperator</code> to specify how you want to perform the\\n          comparison. If the comparison evaluates to true, then the conditional operation\\n          succeeds.</p>\\n            </li>\\n            <li>\\n               <p>Use <code>Value</code> to specify a value that DynamoDB will compare against an attribute. If the\\n          values match, then <code>ExpectedAttributeValue</code> evaluates to true and the conditional\\n          operation succeeds. Optionally, you can also set <code>Exists</code> to false, indicating that\\n          you <i>do not</i> expect to find the attribute value in the table. In this case, the\\n          conditional operation succeeds only if the comparison evaluates to false.</p>\\n            </li>\\n         </ul>\\n         <p>\\n            <code>Value</code> and <code>Exists</code> are incompatible with <code>AttributeValueList</code> and\\n        <code>ComparisonOperator</code>. Note that if you use both sets of parameters at once, DynamoDB will\\n      return a <code>ValidationException</code> exception.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#ExportArn\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#length\": {\n          \"min\": 37,\n          \"max\": 1024\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#ExportConflictException\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"message\": {\n          \"target\": \"com.amazonaws.dynamodb#ErrorMessage\"\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>There was a conflict when writing to the specified S3 bucket.</p>\",\n        \"smithy.api#error\": \"client\"\n      }\n    },\n    \"com.amazonaws.dynamodb#ExportDescription\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"ExportArn\": {\n          \"target\": \"com.amazonaws.dynamodb#ExportArn\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the table export.</p>\"\n          }\n        },\n        \"ExportStatus\": {\n          \"target\": \"com.amazonaws.dynamodb#ExportStatus\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Export can be in one of the following states: IN_PROGRESS, COMPLETED, or FAILED.</p>\"\n          }\n        },\n        \"StartTime\": {\n          \"target\": \"com.amazonaws.dynamodb#ExportStartTime\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The time at which the export task began.</p>\"\n          }\n        },\n        \"EndTime\": {\n          \"target\": \"com.amazonaws.dynamodb#ExportEndTime\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The time at which the export task completed.</p>\"\n          }\n        },\n        \"ExportManifest\": {\n          \"target\": \"com.amazonaws.dynamodb#ExportManifest\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the manifest file for the export task.</p>\"\n          }\n        },\n        \"TableArn\": {\n          \"target\": \"com.amazonaws.dynamodb#TableArn\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the table that was exported.</p>\"\n          }\n        },\n        \"TableId\": {\n          \"target\": \"com.amazonaws.dynamodb#TableId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Unique ID of the table that was exported.</p>\"\n          }\n        },\n        \"ExportTime\": {\n          \"target\": \"com.amazonaws.dynamodb#ExportTime\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Point in time from which table data was exported.</p>\"\n          }\n        },\n        \"ClientToken\": {\n          \"target\": \"com.amazonaws.dynamodb#ClientToken\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The client token that was provided for the export task. A client token makes calls to\\n                <code>ExportTableToPointInTimeInput</code> idempotent, meaning that multiple\\n            identical calls have the same effect as one single call.</p>\"\n          }\n        },\n        \"S3Bucket\": {\n          \"target\": \"com.amazonaws.dynamodb#S3Bucket\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the Amazon S3 bucket containing the export.</p>\"\n          }\n        },\n        \"S3BucketOwner\": {\n          \"target\": \"com.amazonaws.dynamodb#S3BucketOwner\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The ID of the AWS account that owns the bucket containing the export.</p>\"\n          }\n        },\n        \"S3Prefix\": {\n          \"target\": \"com.amazonaws.dynamodb#S3Prefix\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Amazon S3 bucket prefix used as the file name and path of the exported\\n            snapshot.</p>\"\n          }\n        },\n        \"S3SseAlgorithm\": {\n          \"target\": \"com.amazonaws.dynamodb#S3SseAlgorithm\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Type of encryption used on the bucket where export data is stored. Valid values\\n            for <code>S3SseAlgorithm</code> are:</p>\\n        <ul>\\n            <li>\\n                <p>\\n                  <code>AES256</code> - server-side encryption with Amazon S3 managed keys</p>\\n            </li>\\n            <li>\\n                <p>\\n                  <code>KMS</code> - server-side encryption with AWS KMS managed keys</p>\\n            </li>\\n         </ul>\"\n          }\n        },\n        \"S3SseKmsKeyId\": {\n          \"target\": \"com.amazonaws.dynamodb#S3SseKmsKeyId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The ID of the AWS KMS managed key used to encrypt the S3 bucket where export data is\\n            stored (if applicable).</p>\"\n          }\n        },\n        \"FailureCode\": {\n          \"target\": \"com.amazonaws.dynamodb#FailureCode\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Status code for the result of the failed export.</p>\"\n          }\n        },\n        \"FailureMessage\": {\n          \"target\": \"com.amazonaws.dynamodb#FailureMessage\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Export failure reason description.</p>\"\n          }\n        },\n        \"ExportFormat\": {\n          \"target\": \"com.amazonaws.dynamodb#ExportFormat\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The format of the exported data. Valid values for <code>ExportFormat</code> are\\n            <code>DYNAMODB_JSON</code> or <code>ION</code>.</p>\"\n          }\n        },\n        \"BilledSizeBytes\": {\n          \"target\": \"com.amazonaws.dynamodb#BilledSizeBytes\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The billable size of the table export.</p>\"\n          }\n        },\n        \"ItemCount\": {\n          \"target\": \"com.amazonaws.dynamodb#ItemCount\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The number of items exported.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents the properties of the exported table.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#ExportEndTime\": {\n      \"type\": \"timestamp\"\n    },\n    \"com.amazonaws.dynamodb#ExportFormat\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#enum\": [\n          {\n            \"value\": \"DYNAMODB_JSON\",\n            \"name\": \"DYNAMODB_JSON\"\n          },\n          {\n            \"value\": \"ION\",\n            \"name\": \"ION\"\n          }\n        ]\n      }\n    },\n    \"com.amazonaws.dynamodb#ExportManifest\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.dynamodb#ExportNextToken\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.dynamodb#ExportNotFoundException\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"message\": {\n          \"target\": \"com.amazonaws.dynamodb#ErrorMessage\"\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>The specified export was not found.</p>\",\n        \"smithy.api#error\": \"client\"\n      }\n    },\n    \"com.amazonaws.dynamodb#ExportStartTime\": {\n      \"type\": \"timestamp\"\n    },\n    \"com.amazonaws.dynamodb#ExportStatus\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#enum\": [\n          {\n            \"value\": \"IN_PROGRESS\",\n            \"name\": \"IN_PROGRESS\"\n          },\n          {\n            \"value\": \"COMPLETED\",\n            \"name\": \"COMPLETED\"\n          },\n          {\n            \"value\": \"FAILED\",\n            \"name\": \"FAILED\"\n          }\n        ]\n      }\n    },\n    \"com.amazonaws.dynamodb#ExportSummaries\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.dynamodb#ExportSummary\"\n      }\n    },\n    \"com.amazonaws.dynamodb#ExportSummary\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"ExportArn\": {\n          \"target\": \"com.amazonaws.dynamodb#ExportArn\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the export.</p>\"\n          }\n        },\n        \"ExportStatus\": {\n          \"target\": \"com.amazonaws.dynamodb#ExportStatus\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Export can be in one of the following states: IN_PROGRESS, COMPLETED, or FAILED.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Summary information about an export task.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#ExportTableToPointInTime\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.dynamodb#ExportTableToPointInTimeInput\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.dynamodb#ExportTableToPointInTimeOutput\"\n      },\n      \"errors\": [\n        {\n          \"target\": \"com.amazonaws.dynamodb#ExportConflictException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#InvalidExportTimeException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#LimitExceededException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#PointInTimeRecoveryUnavailableException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#TableNotFoundException\"\n        }\n      ],\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Exports table data to an S3 bucket. The table must have point in time recovery\\n            enabled, and you can export data from any time within the point in time recovery\\n            window.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#ExportTableToPointInTimeInput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"TableArn\": {\n          \"target\": \"com.amazonaws.dynamodb#TableArn\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) associated with the table to export.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"ExportTime\": {\n          \"target\": \"com.amazonaws.dynamodb#ExportTime\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Time in the past from which to export table data. The table export will be a snapshot\\n            of the table's state at this point in time.</p>\"\n          }\n        },\n        \"ClientToken\": {\n          \"target\": \"com.amazonaws.dynamodb#ClientToken\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Providing a <code>ClientToken</code> makes the call to\\n                <code>ExportTableToPointInTimeInput</code> idempotent, meaning that multiple\\n            identical calls have the same effect as one single call.</p>\\n        <p>A client token is valid for 8 hours after the first request that uses it is\\n            completed. After 8 hours, any request with the same client token is treated as a new\\n            request. Do not resubmit the same request with the same client token for more than 8\\n            hours, or the result might not be idempotent.</p>\\n        <p>If you submit a request with the same client token but a change in other parameters\\n            within the 8-hour idempotency window, DynamoDB returns an\\n            <code>IdempotentParameterMismatch</code> exception.</p>\",\n            \"smithy.api#idempotencyToken\": {}\n          }\n        },\n        \"S3Bucket\": {\n          \"target\": \"com.amazonaws.dynamodb#S3Bucket\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the Amazon S3 bucket to export the snapshot to.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"S3BucketOwner\": {\n          \"target\": \"com.amazonaws.dynamodb#S3BucketOwner\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The ID of the AWS account that owns the bucket the export will be stored in.</p>\"\n          }\n        },\n        \"S3Prefix\": {\n          \"target\": \"com.amazonaws.dynamodb#S3Prefix\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Amazon S3 bucket prefix to use as the file name and path of the exported\\n            snapshot.</p>\"\n          }\n        },\n        \"S3SseAlgorithm\": {\n          \"target\": \"com.amazonaws.dynamodb#S3SseAlgorithm\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Type of encryption used on the bucket where export data will be stored. Valid values\\n            for <code>S3SseAlgorithm</code> are:</p>\\n        <ul>\\n            <li>\\n                <p>\\n                  <code>AES256</code> - server-side encryption with Amazon S3 managed keys</p>\\n            </li>\\n            <li>\\n                <p>\\n                  <code>KMS</code> - server-side encryption with AWS KMS managed keys</p>\\n            </li>\\n         </ul>\"\n          }\n        },\n        \"S3SseKmsKeyId\": {\n          \"target\": \"com.amazonaws.dynamodb#S3SseKmsKeyId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The ID of the AWS KMS managed key used to encrypt the S3 bucket where export data will\\n            be stored (if applicable).</p>\"\n          }\n        },\n        \"ExportFormat\": {\n          \"target\": \"com.amazonaws.dynamodb#ExportFormat\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The format for the exported data. Valid values for <code>ExportFormat</code> are\\n                <code>DYNAMODB_JSON</code> or <code>ION</code>.</p>\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#ExportTableToPointInTimeOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"ExportDescription\": {\n          \"target\": \"com.amazonaws.dynamodb#ExportDescription\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Contains a description of the table export.</p>\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#ExportTime\": {\n      \"type\": \"timestamp\"\n    },\n    \"com.amazonaws.dynamodb#ExpressionAttributeNameMap\": {\n      \"type\": \"map\",\n      \"key\": {\n        \"target\": \"com.amazonaws.dynamodb#ExpressionAttributeNameVariable\"\n      },\n      \"value\": {\n        \"target\": \"com.amazonaws.dynamodb#AttributeName\"\n      }\n    },\n    \"com.amazonaws.dynamodb#ExpressionAttributeNameVariable\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.dynamodb#ExpressionAttributeValueMap\": {\n      \"type\": \"map\",\n      \"key\": {\n        \"target\": \"com.amazonaws.dynamodb#ExpressionAttributeValueVariable\"\n      },\n      \"value\": {\n        \"target\": \"com.amazonaws.dynamodb#AttributeValue\"\n      }\n    },\n    \"com.amazonaws.dynamodb#ExpressionAttributeValueVariable\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.dynamodb#FailureCode\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.dynamodb#FailureException\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"ExceptionName\": {\n          \"target\": \"com.amazonaws.dynamodb#ExceptionName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Exception name.</p>\"\n          }\n        },\n        \"ExceptionDescription\": {\n          \"target\": \"com.amazonaws.dynamodb#ExceptionDescription\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Description of the failure.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents a failure a contributor insights operation.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#FailureMessage\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.dynamodb#FilterConditionMap\": {\n      \"type\": \"map\",\n      \"key\": {\n        \"target\": \"com.amazonaws.dynamodb#AttributeName\"\n      },\n      \"value\": {\n        \"target\": \"com.amazonaws.dynamodb#Condition\"\n      }\n    },\n    \"com.amazonaws.dynamodb#Get\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Key\": {\n          \"target\": \"com.amazonaws.dynamodb#Key\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A map of attribute names to <code>AttributeValue</code> objects that\\n        specifies the primary key of the item to retrieve.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"TableName\": {\n          \"target\": \"com.amazonaws.dynamodb#TableName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the table from which to retrieve the specified item.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"ProjectionExpression\": {\n          \"target\": \"com.amazonaws.dynamodb#ProjectionExpression\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A string that identifies one or more attributes of the specified item\\n        to retrieve from the table.  The attributes in the expression must be\\n        separated by commas. If no attribute names are specified, then all\\n        attributes of the specified item are returned. If any of the requested\\n        attributes are not found, they do not appear in the result.</p>\"\n          }\n        },\n        \"ExpressionAttributeNames\": {\n          \"target\": \"com.amazonaws.dynamodb#ExpressionAttributeNameMap\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>One or more substitution tokens for attribute names in the\\n        ProjectionExpression parameter.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Specifies an item and related attribute values to retrieve in a\\n        <code>TransactGetItem</code> object.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#GetItem\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.dynamodb#GetItemInput\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.dynamodb#GetItemOutput\"\n      },\n      \"errors\": [\n        {\n          \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#InvalidEndpointException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#ProvisionedThroughputExceededException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#RequestLimitExceeded\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#ResourceNotFoundException\"\n        }\n      ],\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>The <code>GetItem</code> operation returns a set of attributes for the item with the given primary\\n          key. If there is no matching item, <code>GetItem</code> does not return any data and there will be no <code>Item</code> element in the response.</p>\\n         <p>\\n            <code>GetItem</code> provides an eventually consistent read by default. If your application\\n      requires a strongly consistent read, set <code>ConsistentRead</code> to <code>true</code>. Although\\n      a strongly consistent read might take more time than an eventually consistent read, it always\\n      returns the last updated value.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#GetItemInput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"TableName\": {\n          \"target\": \"com.amazonaws.dynamodb#TableName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the table containing the requested item.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"Key\": {\n          \"target\": \"com.amazonaws.dynamodb#Key\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A map of attribute names to <code>AttributeValue</code> objects, representing the primary key of\\n      the item to retrieve.</p>\\n         <p>For the primary key, you must provide all of the attributes. For example, with a simple primary key, you only need to provide a value for the partition key. For a composite primary key, you must provide values for both the partition key and the sort key.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"AttributesToGet\": {\n          \"target\": \"com.amazonaws.dynamodb#AttributeNameList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>This is a legacy parameter.  Use <code>ProjectionExpression</code> instead.  For more information, see\\n          <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/LegacyConditionalParameters.AttributesToGet.html\\\">AttributesToGet</a> in the <i>Amazon DynamoDB Developer Guide</i>.</p>\"\n          }\n        },\n        \"ConsistentRead\": {\n          \"target\": \"com.amazonaws.dynamodb#ConsistentRead\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Determines the read consistency model:  If set to <code>true</code>, then the operation uses strongly consistent reads; otherwise, the operation uses eventually consistent reads.</p>\"\n          }\n        },\n        \"ReturnConsumedCapacity\": {\n          \"target\": \"com.amazonaws.dynamodb#ReturnConsumedCapacity\"\n        },\n        \"ProjectionExpression\": {\n          \"target\": \"com.amazonaws.dynamodb#ProjectionExpression\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A string that identifies one or more attributes to retrieve from the table. These attributes can include scalars, sets, or elements of a JSON document. The attributes in the expression must be separated by commas.</p>\\n         <p>If no attribute names are specified, then all attributes are returned. If any of the\\n            requested attributes are not found, they do not appear in the result.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.AccessingItemAttributes.html\\\">Specifying Item Attributes</a> in the <i>Amazon DynamoDB Developer\\n                Guide</i>.</p>\"\n          }\n        },\n        \"ExpressionAttributeNames\": {\n          \"target\": \"com.amazonaws.dynamodb#ExpressionAttributeNameMap\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>One or more substitution tokens for attribute names in an expression. The following are some use cases for using <code>ExpressionAttributeNames</code>:</p>\\n         <ul>\\n            <li>\\n               <p>To access an attribute whose name conflicts with a DynamoDB reserved word.</p>\\n            </li>\\n            <li>\\n               <p>To create a placeholder for repeating occurrences of an attribute name in an expression.</p>\\n            </li>\\n            <li>\\n               <p>To prevent special characters in an attribute name from being misinterpreted in an expression.</p>\\n            </li>\\n         </ul>\\n         <p>Use the <b>#</b> character in an expression to dereference an attribute name. For example, consider the following attribute name:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>Percentile</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>The name of this attribute conflicts with a reserved word, so it cannot be used directly in an expression. (For the complete list of reserved words, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ReservedWords.html\\\">Reserved Words</a> in the <i>Amazon DynamoDB Developer Guide</i>). To work around this, you could specify the following for <code>ExpressionAttributeNames</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>{\\\"#P\\\":\\\"Percentile\\\"}</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>You could then use this substitution in an expression, as in this example:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>#P = :val</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <note>\\n            <p>Tokens that begin with the <b>:</b> character are <i>expression attribute values</i>, which are placeholders for the actual value at runtime.</p>\\n         </note>\\n         <p>For more information on expression attribute names, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.AccessingItemAttributes.html\\\">Specifying Item Attributes</a> in the <i>Amazon DynamoDB Developer\\n                Guide</i>.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents the input of a <code>GetItem</code> operation.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#GetItemOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Item\": {\n          \"target\": \"com.amazonaws.dynamodb#AttributeMap\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A map of attribute names to <code>AttributeValue</code> objects, as specified\\n            by <code>ProjectionExpression</code>.</p>\"\n          }\n        },\n        \"ConsumedCapacity\": {\n          \"target\": \"com.amazonaws.dynamodb#ConsumedCapacity\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The capacity units consumed by the <code>GetItem</code> operation. The data returned\\n            includes the total provisioned throughput consumed, along with statistics for the table\\n            and any indexes involved in the operation. <code>ConsumedCapacity</code> is only\\n            returned if the <code>ReturnConsumedCapacity</code> parameter was specified. For more\\n            information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ProvisionedThroughputIntro.html\\\">Read/Write Capacity Mode</a> in the <i>Amazon DynamoDB Developer\\n                Guide</i>.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents the output of a <code>GetItem</code> operation.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#GlobalSecondaryIndex\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"IndexName\": {\n          \"target\": \"com.amazonaws.dynamodb#IndexName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the global secondary index. The name must be unique among all other indexes on this table.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"KeySchema\": {\n          \"target\": \"com.amazonaws.dynamodb#KeySchema\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The complete key schema for a global secondary index, which consists of one or more pairs of attribute names and key types:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>HASH</code> - partition key</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>RANGE</code> - sort key</p>\\n            </li>\\n         </ul>\\n         <note>\\n            <p>The partition key of an item is also known as its <i>hash attribute</i>.  The\\n        term \\\"hash attribute\\\" derives from DynamoDB's usage of an internal hash function to\\n        evenly distribute data items across partitions, based on their partition key values.</p>\\n            <p>The sort key of an item is also known as its <i>range attribute</i>.\\n        The term \\\"range attribute\\\" derives from the way DynamoDB stores items with the same\\n        partition key physically close together, in sorted order by the sort key value.</p>\\n         </note>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"Projection\": {\n          \"target\": \"com.amazonaws.dynamodb#Projection\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Represents attributes that are copied (projected) from the table into the global\\n         secondary index. These are in addition to the primary key attributes and index key\\n         attributes, which are automatically projected. </p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"ProvisionedThroughput\": {\n          \"target\": \"com.amazonaws.dynamodb#ProvisionedThroughput\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Represents the provisioned throughput settings for the specified global secondary index.</p>\\n         <p>For current minimum and maximum provisioned throughput values, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Limits.html\\\">Service, Account, and Table Quotas</a> in the <i>Amazon DynamoDB Developer Guide</i>.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents the properties of a global secondary index.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#GlobalSecondaryIndexAutoScalingUpdate\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"IndexName\": {\n          \"target\": \"com.amazonaws.dynamodb#IndexName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the global secondary index.</p>\"\n          }\n        },\n        \"ProvisionedWriteCapacityAutoScalingUpdate\": {\n          \"target\": \"com.amazonaws.dynamodb#AutoScalingSettingsUpdate\"\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents the auto scaling settings of a global secondary index for a global table\\n         that will be modified.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#GlobalSecondaryIndexAutoScalingUpdateList\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.dynamodb#GlobalSecondaryIndexAutoScalingUpdate\"\n      },\n      \"traits\": {\n        \"smithy.api#length\": {\n          \"min\": 1\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#GlobalSecondaryIndexDescription\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"IndexName\": {\n          \"target\": \"com.amazonaws.dynamodb#IndexName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the global secondary index.</p>\"\n          }\n        },\n        \"KeySchema\": {\n          \"target\": \"com.amazonaws.dynamodb#KeySchema\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The complete key schema for a global secondary index, which consists of one or more pairs of attribute names and key types:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>HASH</code> - partition key</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>RANGE</code> - sort key</p>\\n            </li>\\n         </ul>\\n         <note>\\n            <p>The partition key of an item is also known as its <i>hash attribute</i>.  The\\n        term \\\"hash attribute\\\" derives from DynamoDB's usage of an internal hash function to\\n        evenly distribute data items across partitions, based on their partition key values.</p>\\n            <p>The sort key of an item is also known as its <i>range attribute</i>.\\n        The term \\\"range attribute\\\" derives from the way DynamoDB stores items with the same\\n        partition key physically close together, in sorted order by the sort key value.</p>\\n         </note>\"\n          }\n        },\n        \"Projection\": {\n          \"target\": \"com.amazonaws.dynamodb#Projection\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Represents attributes that are copied (projected) from the table into the global\\n         secondary index. These are in addition to the primary key attributes and index key\\n         attributes, which are automatically projected. </p>\"\n          }\n        },\n        \"IndexStatus\": {\n          \"target\": \"com.amazonaws.dynamodb#IndexStatus\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The current state of the global secondary index:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>CREATING</code> - The index is being created.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>UPDATING</code> - The index is being updated.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>DELETING</code> - The index is being deleted.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ACTIVE</code> - The index is ready for use.</p>\\n            </li>\\n         </ul>\"\n          }\n        },\n        \"Backfilling\": {\n          \"target\": \"com.amazonaws.dynamodb#Backfilling\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Indicates whether the index is currently backfilling. <i>Backfilling</i> is the process of reading items from \\n      the table and determining whether they can be added to the index. (Not all items will qualify:  For example, a partition key \\n      cannot have any duplicate values.) If an item can be added to the index, DynamoDB will do so. After all items have been processed, \\n      the backfilling operation is complete and <code>Backfilling</code> is false.</p>\\n         <p>You can delete an index that is being created during the <code>Backfilling</code> phase\\n         when <code>IndexStatus</code> is set to CREATING and <code>Backfilling</code> is true. You\\n         can't delete the index that is being created when <code>IndexStatus</code> is set to\\n         CREATING and <code>Backfilling</code> is false. </p>\\n         <note>\\n            <p>For indexes that were created during a <code>CreateTable</code> operation, the <code>Backfilling</code> attribute does not appear in the <code>DescribeTable</code> output.</p>\\n         </note>\"\n          }\n        },\n        \"ProvisionedThroughput\": {\n          \"target\": \"com.amazonaws.dynamodb#ProvisionedThroughputDescription\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Represents the provisioned throughput settings for the specified global secondary index.</p>\\n         <p>For current minimum and maximum provisioned throughput values, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Limits.html\\\">Service, Account, and Table Quotas</a> in the <i>Amazon DynamoDB Developer Guide</i>.</p>\"\n          }\n        },\n        \"IndexSizeBytes\": {\n          \"target\": \"com.amazonaws.dynamodb#Long\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The total size of the specified index, in bytes. DynamoDB updates this value approximately every six hours. Recent changes might not be reflected in this value.</p>\"\n          }\n        },\n        \"ItemCount\": {\n          \"target\": \"com.amazonaws.dynamodb#Long\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The number of items in the specified index. DynamoDB updates this value approximately every six hours. Recent changes might not be reflected in this value.</p>\"\n          }\n        },\n        \"IndexArn\": {\n          \"target\": \"com.amazonaws.dynamodb#String\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) that uniquely identifies the index.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents the properties of a global secondary index.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#GlobalSecondaryIndexDescriptionList\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.dynamodb#GlobalSecondaryIndexDescription\"\n      }\n    },\n    \"com.amazonaws.dynamodb#GlobalSecondaryIndexInfo\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"IndexName\": {\n          \"target\": \"com.amazonaws.dynamodb#IndexName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the global secondary index.</p>\"\n          }\n        },\n        \"KeySchema\": {\n          \"target\": \"com.amazonaws.dynamodb#KeySchema\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The complete key schema for a global secondary index, which consists of one or more pairs of attribute names and key types:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>HASH</code> - partition key</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>RANGE</code> - sort key</p>\\n            </li>\\n         </ul>\\n         <note>\\n            <p>The partition key of an item is also known as its <i>hash attribute</i>.  The\\n        term \\\"hash attribute\\\" derives from DynamoDB's usage of an internal hash function to\\n        evenly distribute data items across partitions, based on their partition key values.</p>\\n            <p>The sort key of an item is also known as its <i>range attribute</i>.\\n        The term \\\"range attribute\\\" derives from the way DynamoDB stores items with the same\\n        partition key physically close together, in sorted order by the sort key value.</p>\\n         </note>\"\n          }\n        },\n        \"Projection\": {\n          \"target\": \"com.amazonaws.dynamodb#Projection\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Represents attributes that are copied (projected) from the table into\\n      the global secondary index. These are in addition to the primary\\n      key attributes and index key attributes, which are automatically\\n      projected. </p>\"\n          }\n        },\n        \"ProvisionedThroughput\": {\n          \"target\": \"com.amazonaws.dynamodb#ProvisionedThroughput\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Represents the provisioned throughput settings for the specified global secondary index. </p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents the properties of a global secondary index for the table\\n     when the backup was created.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#GlobalSecondaryIndexList\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.dynamodb#GlobalSecondaryIndex\"\n      }\n    },\n    \"com.amazonaws.dynamodb#GlobalSecondaryIndexUpdate\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Update\": {\n          \"target\": \"com.amazonaws.dynamodb#UpdateGlobalSecondaryIndexAction\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of an existing global secondary index, along with new provisioned throughput settings to be applied to that index.</p>\"\n          }\n        },\n        \"Create\": {\n          \"target\": \"com.amazonaws.dynamodb#CreateGlobalSecondaryIndexAction\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The parameters required for creating a global secondary index on an existing table:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>IndexName </code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>KeySchema </code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>AttributeDefinitions </code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>Projection </code>\\n               </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ProvisionedThroughput </code>\\n               </p>\\n            </li>\\n         </ul>\"\n          }\n        },\n        \"Delete\": {\n          \"target\": \"com.amazonaws.dynamodb#DeleteGlobalSecondaryIndexAction\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of an existing global secondary index to be removed.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents one of the following:</p>\\n         <ul>\\n            <li>\\n               <p>A new global secondary index to be added to an existing table.</p>\\n            </li>\\n            <li>\\n               <p>New provisioned throughput parameters for an existing global secondary index.</p>\\n            </li>\\n            <li>\\n               <p>An existing global secondary index to be removed from an existing table.</p>\\n            </li>\\n         </ul>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#GlobalSecondaryIndexUpdateList\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.dynamodb#GlobalSecondaryIndexUpdate\"\n      }\n    },\n    \"com.amazonaws.dynamodb#GlobalSecondaryIndexes\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.dynamodb#GlobalSecondaryIndexInfo\"\n      }\n    },\n    \"com.amazonaws.dynamodb#GlobalTable\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"GlobalTableName\": {\n          \"target\": \"com.amazonaws.dynamodb#TableName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The global table name.</p>\"\n          }\n        },\n        \"ReplicationGroup\": {\n          \"target\": \"com.amazonaws.dynamodb#ReplicaList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Regions where the global table has replicas.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents the properties of a global table.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#GlobalTableAlreadyExistsException\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"message\": {\n          \"target\": \"com.amazonaws.dynamodb#ErrorMessage\"\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>The specified global table already exists.</p>\",\n        \"smithy.api#error\": \"client\"\n      }\n    },\n    \"com.amazonaws.dynamodb#GlobalTableArnString\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.dynamodb#GlobalTableDescription\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"ReplicationGroup\": {\n          \"target\": \"com.amazonaws.dynamodb#ReplicaDescriptionList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Regions where the global table has replicas.</p>\"\n          }\n        },\n        \"GlobalTableArn\": {\n          \"target\": \"com.amazonaws.dynamodb#GlobalTableArnString\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The unique identifier of the global table.</p>\"\n          }\n        },\n        \"CreationDateTime\": {\n          \"target\": \"com.amazonaws.dynamodb#Date\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The creation time of the global table.</p>\"\n          }\n        },\n        \"GlobalTableStatus\": {\n          \"target\": \"com.amazonaws.dynamodb#GlobalTableStatus\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The current state of the global table:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>CREATING</code> - The global table is being created.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>UPDATING</code> - The global table is being updated.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>DELETING</code> - The global table is being deleted.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ACTIVE</code> - The global table is ready for use.</p>\\n            </li>\\n         </ul>\"\n          }\n        },\n        \"GlobalTableName\": {\n          \"target\": \"com.amazonaws.dynamodb#TableName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The global table name.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Contains details about the global table.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#GlobalTableGlobalSecondaryIndexSettingsUpdate\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"IndexName\": {\n          \"target\": \"com.amazonaws.dynamodb#IndexName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the global secondary index. The name must be unique among all other indexes on this table.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"ProvisionedWriteCapacityUnits\": {\n          \"target\": \"com.amazonaws.dynamodb#PositiveLongObject\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The maximum number of writes consumed per second before DynamoDB returns a <code>ThrottlingException.</code>\\n         </p>\"\n          }\n        },\n        \"ProvisionedWriteCapacityAutoScalingSettingsUpdate\": {\n          \"target\": \"com.amazonaws.dynamodb#AutoScalingSettingsUpdate\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Auto scaling settings for managing a global secondary index's write capacity\\n         units.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents the settings of a global secondary index for a global table that will be modified.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#GlobalTableGlobalSecondaryIndexSettingsUpdateList\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.dynamodb#GlobalTableGlobalSecondaryIndexSettingsUpdate\"\n      },\n      \"traits\": {\n        \"smithy.api#length\": {\n          \"min\": 1,\n          \"max\": 20\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#GlobalTableList\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.dynamodb#GlobalTable\"\n      }\n    },\n    \"com.amazonaws.dynamodb#GlobalTableNotFoundException\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"message\": {\n          \"target\": \"com.amazonaws.dynamodb#ErrorMessage\"\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>The specified global table does not exist.</p>\",\n        \"smithy.api#error\": \"client\"\n      }\n    },\n    \"com.amazonaws.dynamodb#GlobalTableStatus\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#enum\": [\n          {\n            \"value\": \"CREATING\",\n            \"name\": \"CREATING\"\n          },\n          {\n            \"value\": \"ACTIVE\",\n            \"name\": \"ACTIVE\"\n          },\n          {\n            \"value\": \"DELETING\",\n            \"name\": \"DELETING\"\n          },\n          {\n            \"value\": \"UPDATING\",\n            \"name\": \"UPDATING\"\n          }\n        ]\n      }\n    },\n    \"com.amazonaws.dynamodb#IdempotentParameterMismatchException\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Message\": {\n          \"target\": \"com.amazonaws.dynamodb#ErrorMessage\"\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>DynamoDB rejected the request because you retried a request with a different payload but\\n      with an idempotent token that was already used.</p>\",\n        \"smithy.api#error\": \"client\"\n      }\n    },\n    \"com.amazonaws.dynamodb#IndexName\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#length\": {\n          \"min\": 3,\n          \"max\": 255\n        },\n        \"smithy.api#pattern\": \"[a-zA-Z0-9_.-]+\"\n      }\n    },\n    \"com.amazonaws.dynamodb#IndexNotFoundException\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"message\": {\n          \"target\": \"com.amazonaws.dynamodb#ErrorMessage\"\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>The operation tried to access a nonexistent index.</p>\",\n        \"smithy.api#error\": \"client\"\n      }\n    },\n    \"com.amazonaws.dynamodb#IndexStatus\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#enum\": [\n          {\n            \"value\": \"CREATING\",\n            \"name\": \"CREATING\"\n          },\n          {\n            \"value\": \"UPDATING\",\n            \"name\": \"UPDATING\"\n          },\n          {\n            \"value\": \"DELETING\",\n            \"name\": \"DELETING\"\n          },\n          {\n            \"value\": \"ACTIVE\",\n            \"name\": \"ACTIVE\"\n          }\n        ]\n      }\n    },\n    \"com.amazonaws.dynamodb#Integer\": {\n      \"type\": \"integer\"\n    },\n    \"com.amazonaws.dynamodb#IntegerObject\": {\n      \"type\": \"integer\",\n      \"traits\": {\n        \"smithy.api#box\": {}\n      }\n    },\n    \"com.amazonaws.dynamodb#InternalServerError\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"message\": {\n          \"target\": \"com.amazonaws.dynamodb#ErrorMessage\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The server encountered an internal error trying to fulfill the request.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>An error occurred on the server side.</p>\",\n        \"smithy.api#error\": \"server\"\n      }\n    },\n    \"com.amazonaws.dynamodb#InvalidEndpointException\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Message\": {\n          \"target\": \"com.amazonaws.dynamodb#String\"\n        }\n      },\n      \"traits\": {\n        \"smithy.api#error\": \"client\",\n        \"smithy.api#httpError\": 421\n      }\n    },\n    \"com.amazonaws.dynamodb#InvalidExportTimeException\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"message\": {\n          \"target\": \"com.amazonaws.dynamodb#ErrorMessage\"\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>The specified <code>ExportTime</code> is outside of the point in time recovery\\n            window.</p>\",\n        \"smithy.api#error\": \"client\"\n      }\n    },\n    \"com.amazonaws.dynamodb#InvalidRestoreTimeException\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"message\": {\n          \"target\": \"com.amazonaws.dynamodb#ErrorMessage\"\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>An invalid restore time was specified. RestoreDateTime must be between EarliestRestorableDateTime and LatestRestorableDateTime.</p>\",\n        \"smithy.api#error\": \"client\"\n      }\n    },\n    \"com.amazonaws.dynamodb#ItemCollectionKeyAttributeMap\": {\n      \"type\": \"map\",\n      \"key\": {\n        \"target\": \"com.amazonaws.dynamodb#AttributeName\"\n      },\n      \"value\": {\n        \"target\": \"com.amazonaws.dynamodb#AttributeValue\"\n      }\n    },\n    \"com.amazonaws.dynamodb#ItemCollectionMetrics\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"ItemCollectionKey\": {\n          \"target\": \"com.amazonaws.dynamodb#ItemCollectionKeyAttributeMap\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The partition key value of the item collection. This value is the same as the partition key value of the item.</p>\"\n          }\n        },\n        \"SizeEstimateRangeGB\": {\n          \"target\": \"com.amazonaws.dynamodb#ItemCollectionSizeEstimateRange\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>An estimate of item collection size, in gigabytes. This value is a two-element array containing a lower bound and an upper bound for the estimate. The estimate includes the size of all the items in the table, plus the size of all attributes projected into all of the local secondary indexes on that table. Use this estimate to measure whether a local secondary index is approaching its size limit.</p>\\n         <p>The estimate is subject to change over time; therefore, do not rely on the precision or accuracy of the estimate.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Information about item collections, if any, that were affected by the operation.\\n        <code>ItemCollectionMetrics</code> is only returned if the request asked for it. If the\\n      table does not have any local secondary indexes, this information is not returned in the response.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#ItemCollectionMetricsMultiple\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.dynamodb#ItemCollectionMetrics\"\n      }\n    },\n    \"com.amazonaws.dynamodb#ItemCollectionMetricsPerTable\": {\n      \"type\": \"map\",\n      \"key\": {\n        \"target\": \"com.amazonaws.dynamodb#TableName\"\n      },\n      \"value\": {\n        \"target\": \"com.amazonaws.dynamodb#ItemCollectionMetricsMultiple\"\n      }\n    },\n    \"com.amazonaws.dynamodb#ItemCollectionSizeEstimateBound\": {\n      \"type\": \"double\",\n      \"traits\": {\n        \"smithy.api#box\": {}\n      }\n    },\n    \"com.amazonaws.dynamodb#ItemCollectionSizeEstimateRange\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.dynamodb#ItemCollectionSizeEstimateBound\"\n      }\n    },\n    \"com.amazonaws.dynamodb#ItemCollectionSizeLimitExceededException\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"message\": {\n          \"target\": \"com.amazonaws.dynamodb#ErrorMessage\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The total size of an item collection has exceeded the maximum limit of 10 gigabytes.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>An item collection is too large. This exception is only returned for tables that have one or more local secondary indexes.</p>\",\n        \"smithy.api#error\": \"client\"\n      }\n    },\n    \"com.amazonaws.dynamodb#ItemCount\": {\n      \"type\": \"long\",\n      \"traits\": {\n        \"smithy.api#box\": {},\n        \"smithy.api#range\": {\n          \"min\": 0\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#ItemList\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.dynamodb#AttributeMap\"\n      }\n    },\n    \"com.amazonaws.dynamodb#ItemResponse\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Item\": {\n          \"target\": \"com.amazonaws.dynamodb#AttributeMap\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Map of attribute data consisting of the data type and attribute value.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Details for the requested item.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#ItemResponseList\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.dynamodb#ItemResponse\"\n      },\n      \"traits\": {\n        \"smithy.api#length\": {\n          \"min\": 1,\n          \"max\": 25\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#KMSMasterKeyArn\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.dynamodb#KMSMasterKeyId\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.dynamodb#Key\": {\n      \"type\": \"map\",\n      \"key\": {\n        \"target\": \"com.amazonaws.dynamodb#AttributeName\"\n      },\n      \"value\": {\n        \"target\": \"com.amazonaws.dynamodb#AttributeValue\"\n      }\n    },\n    \"com.amazonaws.dynamodb#KeyConditions\": {\n      \"type\": \"map\",\n      \"key\": {\n        \"target\": \"com.amazonaws.dynamodb#AttributeName\"\n      },\n      \"value\": {\n        \"target\": \"com.amazonaws.dynamodb#Condition\"\n      }\n    },\n    \"com.amazonaws.dynamodb#KeyExpression\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.dynamodb#KeyList\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.dynamodb#Key\"\n      },\n      \"traits\": {\n        \"smithy.api#length\": {\n          \"min\": 1,\n          \"max\": 100\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#KeySchema\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.dynamodb#KeySchemaElement\"\n      },\n      \"traits\": {\n        \"smithy.api#length\": {\n          \"min\": 1,\n          \"max\": 2\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#KeySchemaAttributeName\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#length\": {\n          \"min\": 1,\n          \"max\": 255\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#KeySchemaElement\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"AttributeName\": {\n          \"target\": \"com.amazonaws.dynamodb#KeySchemaAttributeName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of a key attribute.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"KeyType\": {\n          \"target\": \"com.amazonaws.dynamodb#KeyType\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The role that this key attribute will assume:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>HASH</code> - partition key</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>RANGE</code> - sort key</p>\\n            </li>\\n         </ul>\\n         <note>\\n            <p>The partition key of an item is also known as its <i>hash attribute</i>.  The\\n        term \\\"hash attribute\\\" derives from DynamoDB's usage of an internal hash function to\\n        evenly distribute data items across partitions, based on their partition key values.</p>\\n            <p>The sort key of an item is also known as its <i>range attribute</i>.\\n        The term \\\"range attribute\\\" derives from the way DynamoDB stores items with the same\\n        partition key physically close together, in sorted order by the sort key value.</p>\\n         </note>\",\n            \"smithy.api#required\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents <i>a single element</i> of a key schema. A key schema specifies the attributes\\n      that make up the primary key of a table, or the key attributes of an index.</p>\\n         <p>A <code>KeySchemaElement</code> represents exactly one attribute of the primary key. For example, a\\n      simple primary key would be represented by one <code>KeySchemaElement</code> (for the partition key). A composite\\n       primary key would require one <code>KeySchemaElement</code> for the partition key, and another\\n        <code>KeySchemaElement</code> for the sort key.</p>\\n         <p>A <code>KeySchemaElement</code> must be a scalar, top-level attribute (not a nested attribute). The data type must be one of String, Number, or Binary.  The attribute cannot be nested within a List or a Map.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#KeyType\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#enum\": [\n          {\n            \"value\": \"HASH\",\n            \"name\": \"HASH\"\n          },\n          {\n            \"value\": \"RANGE\",\n            \"name\": \"RANGE\"\n          }\n        ]\n      }\n    },\n    \"com.amazonaws.dynamodb#KeysAndAttributes\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Keys\": {\n          \"target\": \"com.amazonaws.dynamodb#KeyList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The primary key attribute values that define the items and the attributes associated with the items.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"AttributesToGet\": {\n          \"target\": \"com.amazonaws.dynamodb#AttributeNameList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>This is a legacy parameter.  Use <code>ProjectionExpression</code> instead.  For more information, see\\n         <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/LegacyConditionalParameters.html\\\">Legacy Conditional Parameters</a> in the <i>Amazon DynamoDB Developer Guide</i>.</p>\"\n          }\n        },\n        \"ConsistentRead\": {\n          \"target\": \"com.amazonaws.dynamodb#ConsistentRead\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The consistency of a read operation. If set to <code>true</code>, then a strongly consistent\\n      read is used; otherwise, an eventually consistent read is used.</p>\"\n          }\n        },\n        \"ProjectionExpression\": {\n          \"target\": \"com.amazonaws.dynamodb#ProjectionExpression\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A string that identifies one or more attributes to retrieve from the table. These attributes can include scalars,\\n         sets, or elements of a JSON document. The attributes in the <code>ProjectionExpression</code> must be separated by\\n         commas.</p>\\n         <p>If no attribute names are specified, then all attributes will be returned. If any of the requested attributes are not found, they will not appear in the result.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.AccessingItemAttributes.html\\\">Accessing Item Attributes</a> in the <i>Amazon DynamoDB Developer Guide</i>.</p>\"\n          }\n        },\n        \"ExpressionAttributeNames\": {\n          \"target\": \"com.amazonaws.dynamodb#ExpressionAttributeNameMap\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>One or more substitution tokens for attribute names in an expression. The following are some use cases for using <code>ExpressionAttributeNames</code>:</p>\\n         <ul>\\n            <li>\\n               <p>To access an attribute whose name conflicts with a DynamoDB reserved word.</p>\\n            </li>\\n            <li>\\n               <p>To create a placeholder for repeating occurrences of an attribute name in an expression.</p>\\n            </li>\\n            <li>\\n               <p>To prevent special characters in an attribute name from being misinterpreted in an expression.</p>\\n            </li>\\n         </ul>\\n         <p>Use the <b>#</b> character in an expression to dereference an attribute name. For example, consider the following attribute name:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>Percentile</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>The name of this attribute conflicts with a reserved word, so it cannot be used directly in an expression. (For the complete list of reserved words, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ReservedWords.html\\\">Reserved Words</a> in the <i>Amazon DynamoDB Developer Guide</i>). To work around this, you could specify the following for <code>ExpressionAttributeNames</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>{\\\"#P\\\":\\\"Percentile\\\"}</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>You could then use this substitution in an expression, as in this example:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>#P = :val</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <note>\\n            <p>Tokens that begin with the <b>:</b> character are <i>expression attribute values</i>, which are placeholders for the actual value at runtime.</p>\\n         </note>\\n         <p>For more information on expression attribute names, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.AccessingItemAttributes.html\\\">Accessing Item Attributes</a> in the <i>Amazon DynamoDB Developer Guide</i>.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents a set of primary keys and, for each key, the attributes to retrieve from the table.</p>\\n         <p>For each primary key, you must provide <i>all</i> of the key attributes. For example, with a\\n      simple primary key, you only need to provide the partition key. For a composite\\n      primary key, you must provide <i>both</i> the partition key and the sort key.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#KinesisDataStreamDestination\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"StreamArn\": {\n          \"target\": \"com.amazonaws.dynamodb#StreamArn\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The ARN for a specific Kinesis data stream.</p>\"\n          }\n        },\n        \"DestinationStatus\": {\n          \"target\": \"com.amazonaws.dynamodb#DestinationStatus\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The current status of replication.</p>\"\n          }\n        },\n        \"DestinationStatusDescription\": {\n          \"target\": \"com.amazonaws.dynamodb#String\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The human-readable string that corresponds to the replica status.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Describes a Kinesis data stream destination.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#KinesisDataStreamDestinations\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.dynamodb#KinesisDataStreamDestination\"\n      }\n    },\n    \"com.amazonaws.dynamodb#KinesisStreamingDestinationInput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"TableName\": {\n          \"target\": \"com.amazonaws.dynamodb#TableName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the DynamoDB table.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"StreamArn\": {\n          \"target\": \"com.amazonaws.dynamodb#StreamArn\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The ARN for a Kinesis data stream.</p>\",\n            \"smithy.api#required\": {}\n          }\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#KinesisStreamingDestinationOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"TableName\": {\n          \"target\": \"com.amazonaws.dynamodb#TableName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the table being modified.</p>\"\n          }\n        },\n        \"StreamArn\": {\n          \"target\": \"com.amazonaws.dynamodb#StreamArn\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The ARN for the specific Kinesis data stream.</p>\"\n          }\n        },\n        \"DestinationStatus\": {\n          \"target\": \"com.amazonaws.dynamodb#DestinationStatus\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The current status of the replication.</p>\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#LastUpdateDateTime\": {\n      \"type\": \"timestamp\"\n    },\n    \"com.amazonaws.dynamodb#LimitExceededException\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"message\": {\n          \"target\": \"com.amazonaws.dynamodb#ErrorMessage\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Too many operations for a given subscriber.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>There is no limit to the number of daily on-demand backups that can be taken. </p>\\n        <p>Up to 50 simultaneous table operations are allowed per account. These operations\\n            include <code>CreateTable</code>, <code>UpdateTable</code>,\\n                <code>DeleteTable</code>,<code>UpdateTimeToLive</code>,\\n          <code>RestoreTableFromBackup</code>, and <code>RestoreTableToPointInTime</code>. </p>\\n          <p>The only exception is when you are creating a table with one or more secondary indexes. You can have up to \\n        25 such requests running at a time; however, if the table or index specifications are complex, DynamoDB might temporarily \\n        reduce the number of concurrent operations.</p>\\n        <p>There is a soft account quota of 256 tables.</p>\",\n        \"smithy.api#error\": \"client\"\n      }\n    },\n    \"com.amazonaws.dynamodb#ListAttributeValue\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.dynamodb#AttributeValue\"\n      }\n    },\n    \"com.amazonaws.dynamodb#ListBackups\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.dynamodb#ListBackupsInput\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.dynamodb#ListBackupsOutput\"\n      },\n      \"errors\": [\n        {\n          \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#InvalidEndpointException\"\n        }\n      ],\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>List backups associated with an AWS account. To list backups for a given table, specify\\n                <code>TableName</code>. <code>ListBackups</code> returns a paginated list of results\\n            with at most 1 MB worth of items in a page. You can also specify a maximum number of\\n            entries to be returned in a page. </p>\\n         <p>In the request, start time is inclusive, but end time is exclusive. Note that these\\n            boundaries are for the time at which the original backup was requested.</p>\\n         <p>You can call <code>ListBackups</code> a maximum of five times per second.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#ListBackupsInput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"TableName\": {\n          \"target\": \"com.amazonaws.dynamodb#TableName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The backups from the table specified by <code>TableName</code> are listed. </p>\"\n          }\n        },\n        \"Limit\": {\n          \"target\": \"com.amazonaws.dynamodb#BackupsInputLimit\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Maximum number of backups to return at once.</p>\"\n          }\n        },\n        \"TimeRangeLowerBound\": {\n          \"target\": \"com.amazonaws.dynamodb#TimeRangeLowerBound\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Only backups created after this time are listed. <code>TimeRangeLowerBound</code> is inclusive.</p>\"\n          }\n        },\n        \"TimeRangeUpperBound\": {\n          \"target\": \"com.amazonaws.dynamodb#TimeRangeUpperBound\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Only backups created before this time are listed. <code>TimeRangeUpperBound</code> is exclusive. </p>\"\n          }\n        },\n        \"ExclusiveStartBackupArn\": {\n          \"target\": \"com.amazonaws.dynamodb#BackupArn\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>\\n            <code>LastEvaluatedBackupArn</code> is the Amazon Resource Name (ARN) of the backup last\\n            evaluated when the current page of results was returned, inclusive of the current page\\n            of results. This value may be specified as the <code>ExclusiveStartBackupArn</code> of a\\n            new <code>ListBackups</code> operation in order to fetch the next page of results. </p>\"\n          }\n        },\n        \"BackupType\": {\n          \"target\": \"com.amazonaws.dynamodb#BackupTypeFilter\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The backups from the table specified by <code>BackupType</code> are listed.</p>\\n         <p>Where <code>BackupType</code> can be:</p>\\n        <ul>\\n            <li>\\n                <p>\\n                    <code>USER</code> - On-demand backup created by you.</p>\\n            </li>\\n            <li>\\n                <p>\\n                    <code>SYSTEM</code> - On-demand backup automatically created by\\n                    DynamoDB.</p>\\n            </li>\\n            <li>\\n                <p>\\n                    <code>ALL</code> - All types of on-demand backups (USER and SYSTEM).</p>\\n            </li>\\n         </ul>\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#ListBackupsOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"BackupSummaries\": {\n          \"target\": \"com.amazonaws.dynamodb#BackupSummaries\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>List of <code>BackupSummary</code> objects.</p>\"\n          }\n        },\n        \"LastEvaluatedBackupArn\": {\n          \"target\": \"com.amazonaws.dynamodb#BackupArn\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>\\n        The ARN of the backup last evaluated when the current page of results was returned,\\n        inclusive of the current page of results. This value may be specified as the\\n        <code>ExclusiveStartBackupArn</code> of a new <code>ListBackups</code> operation in order to fetch the next page of results.\\n     </p>\\n         <p>\\n        If <code>LastEvaluatedBackupArn</code> is empty, then the last page of results has been processed and there are no\\n        more results to be retrieved.\\n     </p>\\n         <p> If <code>LastEvaluatedBackupArn</code> is not empty, this may or may not indicate that\\n            there is more data to be returned. All results are guaranteed to have been returned if\\n            and only if no value for <code>LastEvaluatedBackupArn</code> is returned. </p>\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#ListContributorInsights\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.dynamodb#ListContributorInsightsInput\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.dynamodb#ListContributorInsightsOutput\"\n      },\n      \"errors\": [\n        {\n          \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#ResourceNotFoundException\"\n        }\n      ],\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Returns a list of ContributorInsightsSummary for a table and all its global secondary indexes.</p>\",\n        \"smithy.api#paginated\": {\n          \"inputToken\": \"NextToken\",\n          \"outputToken\": \"NextToken\",\n          \"pageSize\": \"MaxResults\"\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#ListContributorInsightsInput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"TableName\": {\n          \"target\": \"com.amazonaws.dynamodb#TableName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the table.</p>\"\n          }\n        },\n        \"NextToken\": {\n          \"target\": \"com.amazonaws.dynamodb#NextTokenString\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A token to for the desired page, if there is one.</p>\"\n          }\n        },\n        \"MaxResults\": {\n          \"target\": \"com.amazonaws.dynamodb#ListContributorInsightsLimit\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Maximum number of results to return per page.</p>\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#ListContributorInsightsLimit\": {\n      \"type\": \"integer\",\n      \"traits\": {\n        \"smithy.api#range\": {\n          \"max\": 100\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#ListContributorInsightsOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"ContributorInsightsSummaries\": {\n          \"target\": \"com.amazonaws.dynamodb#ContributorInsightsSummaries\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A list of ContributorInsightsSummary.</p>\"\n          }\n        },\n        \"NextToken\": {\n          \"target\": \"com.amazonaws.dynamodb#NextTokenString\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A token to go to the next page if there is one.</p>\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#ListExports\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.dynamodb#ListExportsInput\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.dynamodb#ListExportsOutput\"\n      },\n      \"errors\": [\n        {\n          \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#LimitExceededException\"\n        }\n      ],\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Lists completed exports within the past 90 days.</p>\",\n        \"smithy.api#paginated\": {\n          \"inputToken\": \"NextToken\",\n          \"outputToken\": \"NextToken\",\n          \"pageSize\": \"MaxResults\"\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#ListExportsInput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"TableArn\": {\n          \"target\": \"com.amazonaws.dynamodb#TableArn\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) associated with the exported table.</p>\"\n          }\n        },\n        \"MaxResults\": {\n          \"target\": \"com.amazonaws.dynamodb#ListExportsMaxLimit\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Maximum number of results to return per page.</p>\"\n          }\n        },\n        \"NextToken\": {\n          \"target\": \"com.amazonaws.dynamodb#ExportNextToken\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>An optional string that, if supplied, must be copied from the output of a previous\\n            call to <code>ListExports</code>. When provided in this manner, the API fetches the next\\n            page of results.</p>\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#ListExportsMaxLimit\": {\n      \"type\": \"integer\",\n      \"traits\": {\n        \"smithy.api#box\": {},\n        \"smithy.api#range\": {\n          \"min\": 1,\n          \"max\": 25\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#ListExportsOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"ExportSummaries\": {\n          \"target\": \"com.amazonaws.dynamodb#ExportSummaries\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A list of <code>ExportSummary</code> objects.</p>\"\n          }\n        },\n        \"NextToken\": {\n          \"target\": \"com.amazonaws.dynamodb#ExportNextToken\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>If this value is returned, there are additional results to be displayed. To retrieve\\n            them, call <code>ListExports</code> again, with <code>NextToken</code> set to this\\n            value.</p>\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#ListGlobalTables\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.dynamodb#ListGlobalTablesInput\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.dynamodb#ListGlobalTablesOutput\"\n      },\n      \"errors\": [\n        {\n          \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#InvalidEndpointException\"\n        }\n      ],\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Lists all global tables that have a replica in the specified Region.</p>\\n          <note>\\n            <p>This operation only applies to <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/globaltables.V1.html\\\">Version 2017.11.29</a> of global tables.</p>\\n         </note>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#ListGlobalTablesInput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"ExclusiveStartGlobalTableName\": {\n          \"target\": \"com.amazonaws.dynamodb#TableName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The first global table name that this operation will evaluate.</p>\"\n          }\n        },\n        \"Limit\": {\n          \"target\": \"com.amazonaws.dynamodb#PositiveIntegerObject\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The maximum number of table names to return, if the parameter is not specified DynamoDB defaults to 100.</p>\\n         <p>If the number of global tables DynamoDB finds reaches this limit, it stops the operation and returns the table names collected up to that point,\\n         with a table name in the <code>LastEvaluatedGlobalTableName</code> to apply in a subsequent operation to the <code>ExclusiveStartGlobalTableName</code> parameter.</p>\"\n          }\n        },\n        \"RegionName\": {\n          \"target\": \"com.amazonaws.dynamodb#RegionName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Lists the global tables in a specific Region.</p>\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#ListGlobalTablesOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"GlobalTables\": {\n          \"target\": \"com.amazonaws.dynamodb#GlobalTableList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>List of global table names.</p>\"\n          }\n        },\n        \"LastEvaluatedGlobalTableName\": {\n          \"target\": \"com.amazonaws.dynamodb#TableName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Last evaluated global table name.</p>\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#ListTables\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.dynamodb#ListTablesInput\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.dynamodb#ListTablesOutput\"\n      },\n      \"errors\": [\n        {\n          \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#InvalidEndpointException\"\n        }\n      ],\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Returns an array of table names associated with the current account and endpoint. The output\\n      from <code>ListTables</code> is paginated, with each page returning a maximum of 100 table\\n      names.</p>\",\n        \"smithy.api#paginated\": {\n          \"inputToken\": \"ExclusiveStartTableName\",\n          \"outputToken\": \"LastEvaluatedTableName\",\n          \"items\": \"TableNames\",\n          \"pageSize\": \"Limit\"\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#ListTablesInput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"ExclusiveStartTableName\": {\n          \"target\": \"com.amazonaws.dynamodb#TableName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The first table name that this operation will evaluate. Use the value that was returned for\\n        <code>LastEvaluatedTableName</code> in a previous operation, so that you can obtain the next page\\n      of results.</p>\"\n          }\n        },\n        \"Limit\": {\n          \"target\": \"com.amazonaws.dynamodb#ListTablesInputLimit\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A maximum number of table names to return. If this parameter is not specified, the limit is 100.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents the input of a <code>ListTables</code> operation.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#ListTablesInputLimit\": {\n      \"type\": \"integer\",\n      \"traits\": {\n        \"smithy.api#box\": {},\n        \"smithy.api#range\": {\n          \"min\": 1,\n          \"max\": 100\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#ListTablesOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"TableNames\": {\n          \"target\": \"com.amazonaws.dynamodb#TableNameList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The names of the tables associated with the current account at the current endpoint. The maximum size of this array is 100.</p>\\n         <p>If <code>LastEvaluatedTableName</code> also appears in the output, you can use this value as the\\n        <code>ExclusiveStartTableName</code> parameter in a subsequent <code>ListTables</code> request and\\n      obtain the next page of results.</p>\"\n          }\n        },\n        \"LastEvaluatedTableName\": {\n          \"target\": \"com.amazonaws.dynamodb#TableName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the last table in the current page of results. Use this value as the\\n        <code>ExclusiveStartTableName</code> in a new request to obtain the next page of results, until\\n      all the table names are returned.</p>\\n         <p>If you do not receive a <code>LastEvaluatedTableName</code> value in the response, this means that\\n      there are no more table names to be retrieved.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents the output of a <code>ListTables</code> operation.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#ListTagsOfResource\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.dynamodb#ListTagsOfResourceInput\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.dynamodb#ListTagsOfResourceOutput\"\n      },\n      \"errors\": [\n        {\n          \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#InvalidEndpointException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#ResourceNotFoundException\"\n        }\n      ],\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>List all tags on an Amazon DynamoDB resource. You can call ListTagsOfResource up to 10 times per second, per account.</p>\\n         <p>For an overview on tagging DynamoDB resources, see\\n      <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Tagging.html\\\">Tagging for DynamoDB</a>\\n      in the <i>Amazon DynamoDB Developer Guide</i>.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#ListTagsOfResourceInput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"ResourceArn\": {\n          \"target\": \"com.amazonaws.dynamodb#ResourceArnString\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Amazon DynamoDB resource with tags to be listed. This value is an Amazon Resource Name (ARN).</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"NextToken\": {\n          \"target\": \"com.amazonaws.dynamodb#NextTokenString\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>An optional string that, if supplied, must be copied from the output of a previous\\n      call to ListTagOfResource. When provided in this manner, this API fetches the next page of results.</p>\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#ListTagsOfResourceOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Tags\": {\n          \"target\": \"com.amazonaws.dynamodb#TagList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The tags currently associated with the Amazon DynamoDB resource.</p>\"\n          }\n        },\n        \"NextToken\": {\n          \"target\": \"com.amazonaws.dynamodb#NextTokenString\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>If this value is returned, there are additional results to be displayed. To retrieve them,\\n      call ListTagsOfResource again, with NextToken set to this value.</p>\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#LocalSecondaryIndex\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"IndexName\": {\n          \"target\": \"com.amazonaws.dynamodb#IndexName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the local secondary index. The name must be unique among all other indexes on this table.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"KeySchema\": {\n          \"target\": \"com.amazonaws.dynamodb#KeySchema\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The complete key schema for the local secondary index, consisting of one or more pairs of attribute names and key types:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>HASH</code> - partition key</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>RANGE</code> - sort key</p>\\n            </li>\\n         </ul>\\n         <note>\\n            <p>The partition key of an item is also known as its <i>hash attribute</i>.  The\\n        term \\\"hash attribute\\\" derives from DynamoDB's usage of an internal hash function to\\n        evenly distribute data items across partitions, based on their partition key values.</p>\\n            <p>The sort key of an item is also known as its <i>range attribute</i>.\\n        The term \\\"range attribute\\\" derives from the way DynamoDB stores items with the same\\n        partition key physically close together, in sorted order by the sort key value.</p>\\n         </note>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"Projection\": {\n          \"target\": \"com.amazonaws.dynamodb#Projection\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Represents attributes that are copied (projected) from the table into the local\\n         secondary index. These are in addition to the primary key attributes and index key\\n         attributes, which are automatically projected. </p>\",\n            \"smithy.api#required\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents the properties of a local secondary index.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#LocalSecondaryIndexDescription\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"IndexName\": {\n          \"target\": \"com.amazonaws.dynamodb#IndexName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Represents the name of the local secondary index.</p>\"\n          }\n        },\n        \"KeySchema\": {\n          \"target\": \"com.amazonaws.dynamodb#KeySchema\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The complete key schema for the local secondary index, consisting of one or more pairs of attribute names and key types:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>HASH</code> - partition key</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>RANGE</code> - sort key</p>\\n            </li>\\n         </ul>\\n         <note>\\n            <p>The partition key of an item is also known as its <i>hash attribute</i>.  The\\n        term \\\"hash attribute\\\" derives from DynamoDB's usage of an internal hash function to\\n        evenly distribute data items across partitions, based on their partition key values.</p>\\n            <p>The sort key of an item is also known as its <i>range attribute</i>.\\n        The term \\\"range attribute\\\" derives from the way DynamoDB stores items with the same\\n        partition key physically close together, in sorted order by the sort key value.</p>\\n         </note>\"\n          }\n        },\n        \"Projection\": {\n          \"target\": \"com.amazonaws.dynamodb#Projection\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Represents attributes that are copied (projected) from the table into the global\\n         secondary index. These are in addition to the primary key attributes and index key\\n         attributes, which are automatically projected. </p>\"\n          }\n        },\n        \"IndexSizeBytes\": {\n          \"target\": \"com.amazonaws.dynamodb#Long\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The total size of the specified index, in bytes. DynamoDB updates this value approximately every six hours. Recent changes might not be reflected in this value.</p>\"\n          }\n        },\n        \"ItemCount\": {\n          \"target\": \"com.amazonaws.dynamodb#Long\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The number of items in the specified index. DynamoDB updates this value approximately every six hours. Recent changes might not be reflected in this value.</p>\"\n          }\n        },\n        \"IndexArn\": {\n          \"target\": \"com.amazonaws.dynamodb#String\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) that uniquely identifies the index.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents the properties of a local secondary index.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#LocalSecondaryIndexDescriptionList\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.dynamodb#LocalSecondaryIndexDescription\"\n      }\n    },\n    \"com.amazonaws.dynamodb#LocalSecondaryIndexInfo\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"IndexName\": {\n          \"target\": \"com.amazonaws.dynamodb#IndexName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Represents the name of the local secondary index.</p>\"\n          }\n        },\n        \"KeySchema\": {\n          \"target\": \"com.amazonaws.dynamodb#KeySchema\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The complete key schema for a local secondary index, which consists of one or more pairs of attribute names and key types:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>HASH</code> - partition key</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>RANGE</code> - sort key</p>\\n            </li>\\n         </ul>\\n         <note>\\n            <p>The partition key of an item is also known as its <i>hash attribute</i>.  The\\n        term \\\"hash attribute\\\" derives from DynamoDB's usage of an internal hash function to\\n        evenly distribute data items across partitions, based on their partition key values.</p>\\n            <p>The sort key of an item is also known as its <i>range attribute</i>.\\n        The term \\\"range attribute\\\" derives from the way DynamoDB stores items with the same\\n        partition key physically close together, in sorted order by the sort key value.</p>\\n         </note>\"\n          }\n        },\n        \"Projection\": {\n          \"target\": \"com.amazonaws.dynamodb#Projection\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Represents attributes that are copied (projected) from the table into the global secondary index. These are in addition to the primary key attributes and index key attributes, which are automatically projected. </p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents the properties of a local secondary index for the table\\n     when the backup was created.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#LocalSecondaryIndexList\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.dynamodb#LocalSecondaryIndex\"\n      }\n    },\n    \"com.amazonaws.dynamodb#LocalSecondaryIndexes\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.dynamodb#LocalSecondaryIndexInfo\"\n      }\n    },\n    \"com.amazonaws.dynamodb#Long\": {\n      \"type\": \"long\"\n    },\n    \"com.amazonaws.dynamodb#MapAttributeValue\": {\n      \"type\": \"map\",\n      \"key\": {\n        \"target\": \"com.amazonaws.dynamodb#AttributeName\"\n      },\n      \"value\": {\n        \"target\": \"com.amazonaws.dynamodb#AttributeValue\"\n      }\n    },\n    \"com.amazonaws.dynamodb#NextTokenString\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.dynamodb#NonKeyAttributeName\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#length\": {\n          \"min\": 1,\n          \"max\": 255\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#NonKeyAttributeNameList\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.dynamodb#NonKeyAttributeName\"\n      },\n      \"traits\": {\n        \"smithy.api#length\": {\n          \"min\": 1,\n          \"max\": 20\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#NonNegativeLongObject\": {\n      \"type\": \"long\",\n      \"traits\": {\n        \"smithy.api#box\": {},\n        \"smithy.api#range\": {\n          \"min\": 0\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#NullAttributeValue\": {\n      \"type\": \"boolean\",\n      \"traits\": {\n        \"smithy.api#box\": {}\n      }\n    },\n    \"com.amazonaws.dynamodb#NumberAttributeValue\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.dynamodb#NumberSetAttributeValue\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.dynamodb#NumberAttributeValue\"\n      }\n    },\n    \"com.amazonaws.dynamodb#ParameterizedStatement\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Statement\": {\n          \"target\": \"com.amazonaws.dynamodb#PartiQLStatement\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>\\nA PartiQL statment that uses parameters.\\n</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"Parameters\": {\n          \"target\": \"com.amazonaws.dynamodb#PreparedStatementParameters\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>\\nThe parameter values.\\n</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>\\nRepresents a PartiQL statment that uses parameters.\\n</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#ParameterizedStatements\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.dynamodb#ParameterizedStatement\"\n      },\n      \"traits\": {\n        \"smithy.api#length\": {\n          \"min\": 1,\n          \"max\": 25\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#PartiQLBatchRequest\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.dynamodb#BatchStatementRequest\"\n      },\n      \"traits\": {\n        \"smithy.api#length\": {\n          \"min\": 1,\n          \"max\": 25\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#PartiQLBatchResponse\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.dynamodb#BatchStatementResponse\"\n      }\n    },\n    \"com.amazonaws.dynamodb#PartiQLNextToken\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#length\": {\n          \"min\": 1,\n          \"max\": 32768\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#PartiQLStatement\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#length\": {\n          \"min\": 1,\n          \"max\": 8192\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#PointInTimeRecoveryDescription\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"PointInTimeRecoveryStatus\": {\n          \"target\": \"com.amazonaws.dynamodb#PointInTimeRecoveryStatus\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The current state of point in time recovery:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>ENABLING</code> - Point in time recovery is being enabled.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ENABLED</code> - Point in time recovery is enabled.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>DISABLED</code> - Point in time recovery is disabled.</p>\\n            </li>\\n         </ul>\"\n          }\n        },\n        \"EarliestRestorableDateTime\": {\n          \"target\": \"com.amazonaws.dynamodb#Date\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the earliest point in time you can restore your table to. You can restore your\\n         table to any point in time during the last 35 days. </p>\"\n          }\n        },\n        \"LatestRestorableDateTime\": {\n          \"target\": \"com.amazonaws.dynamodb#Date\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>\\n            <code>LatestRestorableDateTime</code> is typically 5 minutes before the current time.\\n     </p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>The description of the point in time settings applied to the table.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#PointInTimeRecoverySpecification\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"PointInTimeRecoveryEnabled\": {\n          \"target\": \"com.amazonaws.dynamodb#BooleanObject\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Indicates whether point in time recovery is enabled (true) or disabled (false) on the table.</p>\",\n            \"smithy.api#required\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents the settings used to enable point in time recovery.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#PointInTimeRecoveryStatus\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#enum\": [\n          {\n            \"value\": \"ENABLED\",\n            \"name\": \"ENABLED\"\n          },\n          {\n            \"value\": \"DISABLED\",\n            \"name\": \"DISABLED\"\n          }\n        ]\n      }\n    },\n    \"com.amazonaws.dynamodb#PointInTimeRecoveryUnavailableException\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"message\": {\n          \"target\": \"com.amazonaws.dynamodb#ErrorMessage\"\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Point in time recovery has not yet been enabled for this source table.</p>\",\n        \"smithy.api#error\": \"client\"\n      }\n    },\n    \"com.amazonaws.dynamodb#PositiveIntegerObject\": {\n      \"type\": \"integer\",\n      \"traits\": {\n        \"smithy.api#box\": {},\n        \"smithy.api#range\": {\n          \"min\": 1\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#PositiveLongObject\": {\n      \"type\": \"long\",\n      \"traits\": {\n        \"smithy.api#box\": {},\n        \"smithy.api#range\": {\n          \"min\": 1\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#PreparedStatementParameters\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.dynamodb#AttributeValue\"\n      },\n      \"traits\": {\n        \"smithy.api#length\": {\n          \"min\": 1\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#Projection\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"ProjectionType\": {\n          \"target\": \"com.amazonaws.dynamodb#ProjectionType\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The set of attributes that are projected into the index:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>KEYS_ONLY</code> - Only the index and primary keys are projected into the\\n          index.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>INCLUDE</code> - In addition to the attributes described in <code>KEYS_ONLY</code>, the secondary index will include other non-key attributes that you specify.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ALL</code> - All of the table attributes are projected into the index.</p>\\n            </li>\\n         </ul>\"\n          }\n        },\n        \"NonKeyAttributes\": {\n          \"target\": \"com.amazonaws.dynamodb#NonKeyAttributeNameList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Represents the non-key attribute names which will be projected into the index.</p>\\n         <p>For local secondary indexes, the total count of <code>NonKeyAttributes</code> summed across all of the local secondary indexes,\\n      must not exceed 20. If you project the same attribute into two\\n      different indexes, this counts as two distinct attributes when determining the total.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents attributes that are copied (projected) from the table into an index. These are in addition to the primary key attributes and index key attributes, which are automatically projected.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#ProjectionExpression\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.dynamodb#ProjectionType\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#enum\": [\n          {\n            \"value\": \"ALL\",\n            \"name\": \"ALL\"\n          },\n          {\n            \"value\": \"KEYS_ONLY\",\n            \"name\": \"KEYS_ONLY\"\n          },\n          {\n            \"value\": \"INCLUDE\",\n            \"name\": \"INCLUDE\"\n          }\n        ]\n      }\n    },\n    \"com.amazonaws.dynamodb#ProvisionedThroughput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"ReadCapacityUnits\": {\n          \"target\": \"com.amazonaws.dynamodb#PositiveLongObject\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The maximum number of strongly consistent reads consumed per second before DynamoDB returns a\\n        <code>ThrottlingException</code>. For more information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/WorkingWithTables.html#ProvisionedThroughput\\\">Specifying Read and Write\\n        Requirements</a> in the <i>Amazon DynamoDB Developer Guide</i>.</p>\\n        <p>If read/write capacity mode is <code>PAY_PER_REQUEST</code> the value is set to 0.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"WriteCapacityUnits\": {\n          \"target\": \"com.amazonaws.dynamodb#PositiveLongObject\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The maximum number of writes consumed per second before DynamoDB returns a\\n        <code>ThrottlingException</code>. For more information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/WorkingWithTables.html#ProvisionedThroughput\\\">Specifying Read and Write\\n        Requirements</a> in the <i>Amazon DynamoDB Developer Guide</i>.</p>\\n        <p>If read/write capacity mode is <code>PAY_PER_REQUEST</code> the value is set to 0.</p>\",\n            \"smithy.api#required\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents the provisioned throughput settings for a specified table or index. The settings\\n      can be modified using the <code>UpdateTable</code> operation.</p>\\n         <p>For current minimum and maximum provisioned throughput values, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Limits.html\\\">Service, Account, and Table Quotas</a> in the <i>Amazon DynamoDB Developer Guide</i>.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#ProvisionedThroughputDescription\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"LastIncreaseDateTime\": {\n          \"target\": \"com.amazonaws.dynamodb#Date\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The date and time of the last provisioned throughput increase for this table.</p>\"\n          }\n        },\n        \"LastDecreaseDateTime\": {\n          \"target\": \"com.amazonaws.dynamodb#Date\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The date and time of the last provisioned throughput decrease for this table.</p>\"\n          }\n        },\n        \"NumberOfDecreasesToday\": {\n          \"target\": \"com.amazonaws.dynamodb#PositiveLongObject\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The number of provisioned throughput decreases for this table during this UTC calendar day.\\n         For current maximums on provisioned throughput decreases, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Limits.html\\\">Service, Account, and Table Quotas</a> in the <i>Amazon DynamoDB Developer Guide</i>.</p>\"\n          }\n        },\n        \"ReadCapacityUnits\": {\n          \"target\": \"com.amazonaws.dynamodb#NonNegativeLongObject\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The maximum number of strongly consistent reads consumed per second before DynamoDB returns a\\n        <code>ThrottlingException</code>. Eventually consistent reads require less effort than strongly\\n      consistent reads, so a setting of 50 <code>ReadCapacityUnits</code> per second provides 100\\n      eventually consistent <code>ReadCapacityUnits</code> per second.</p>\"\n          }\n        },\n        \"WriteCapacityUnits\": {\n          \"target\": \"com.amazonaws.dynamodb#NonNegativeLongObject\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The maximum number of writes consumed per second before DynamoDB returns a\\n        <code>ThrottlingException</code>.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents the provisioned throughput settings for the table, consisting of read and write capacity units, along with data about increases and decreases.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#ProvisionedThroughputExceededException\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"message\": {\n          \"target\": \"com.amazonaws.dynamodb#ErrorMessage\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>You exceeded your maximum allowed provisioned throughput.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Your request rate is too high. The AWS SDKs for DynamoDB automatically retry requests that\\n      receive this exception. Your request is eventually successful, unless your retry queue is too\\n      large to finish. Reduce the frequency of requests and use exponential backoff. For more\\n      information, go to <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Programming.Errors.html#Programming.Errors.RetryAndBackoff\\\">Error Retries and Exponential\\n        Backoff</a> in the <i>Amazon DynamoDB Developer Guide</i>.</p>\",\n        \"smithy.api#error\": \"client\"\n      }\n    },\n    \"com.amazonaws.dynamodb#ProvisionedThroughputOverride\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"ReadCapacityUnits\": {\n          \"target\": \"com.amazonaws.dynamodb#PositiveLongObject\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Replica-specific read capacity units. If not specified, uses the source table's\\n         read capacity settings.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Replica-specific provisioned throughput settings. If not specified, uses the\\n         source table's provisioned throughput settings.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#Put\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Item\": {\n          \"target\": \"com.amazonaws.dynamodb#PutItemInputAttributeMap\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A map of attribute name to attribute values, representing the primary key\\n        of the item to be written by <code>PutItem</code>. All of the table's primary key\\n        attributes must be specified, and their data types must match those of the table's\\n        key schema. If any attributes are present in the item that are part of an index\\n        key schema for the table, their types must match the index key schema. </p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"TableName\": {\n          \"target\": \"com.amazonaws.dynamodb#TableName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Name of the table in which to write the item.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"ConditionExpression\": {\n          \"target\": \"com.amazonaws.dynamodb#ConditionExpression\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A condition that must be satisfied in order for a conditional update to succeed.</p>\"\n          }\n        },\n        \"ExpressionAttributeNames\": {\n          \"target\": \"com.amazonaws.dynamodb#ExpressionAttributeNameMap\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>One or more substitution tokens for attribute names in an expression.</p>\"\n          }\n        },\n        \"ExpressionAttributeValues\": {\n          \"target\": \"com.amazonaws.dynamodb#ExpressionAttributeValueMap\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>One or more values that can be substituted in an expression.</p>\"\n          }\n        },\n        \"ReturnValuesOnConditionCheckFailure\": {\n          \"target\": \"com.amazonaws.dynamodb#ReturnValuesOnConditionCheckFailure\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Use <code>ReturnValuesOnConditionCheckFailure</code> to\\n        get the item attributes if the <code>Put</code> condition fails.\\n        For <code>ReturnValuesOnConditionCheckFailure</code>, the valid\\n        values are: NONE and ALL_OLD.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents a request to perform a <code>PutItem</code> operation.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#PutItem\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.dynamodb#PutItemInput\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.dynamodb#PutItemOutput\"\n      },\n      \"errors\": [\n        {\n          \"target\": \"com.amazonaws.dynamodb#ConditionalCheckFailedException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#InvalidEndpointException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#ItemCollectionSizeLimitExceededException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#ProvisionedThroughputExceededException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#RequestLimitExceeded\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#ResourceNotFoundException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#TransactionConflictException\"\n        }\n      ],\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Creates a new item, or replaces an old item with a new item. If an item that has the same primary key as the new item already exists in the specified table, the new item completely replaces the existing item. You can perform a conditional put operation (add a new item if one with the specified primary key doesn't exist), or replace an existing item if it has certain attribute values. You can return the item's attribute values in the same operation, using the <code>ReturnValues</code> parameter.</p>\\n         <important>\\n            <p>This topic provides general information about the <code>PutItem</code> API.</p>\\n            <p>For information on how to call the <code>PutItem</code> API using the AWS SDK in specific languages, see the following:</p>\\n            <ul>\\n               <li>\\n                  <p>\\n                        <a href=\\\"http://docs.aws.amazon.com/goto/aws-cli/dynamodb-2012-08-10/PutItem\\\"> PutItem in the AWS Command Line Interface</a>\\n                    </p>\\n               </li>\\n               <li>\\n                  <p>\\n                        <a href=\\\"http://docs.aws.amazon.com/goto/DotNetSDKV3/dynamodb-2012-08-10/PutItem\\\"> PutItem in the AWS SDK for .NET</a>\\n                    </p>\\n               </li>\\n               <li>\\n                  <p>\\n                        <a href=\\\"http://docs.aws.amazon.com/goto/SdkForCpp/dynamodb-2012-08-10/PutItem\\\"> PutItem in the AWS SDK for C++</a>\\n                    </p>\\n               </li>\\n               <li>\\n                  <p>\\n                        <a href=\\\"http://docs.aws.amazon.com/goto/SdkForGoV1/dynamodb-2012-08-10/PutItem\\\"> PutItem in the AWS SDK for Go</a>\\n                    </p>\\n               </li>\\n               <li>\\n                  <p>\\n                        <a href=\\\"http://docs.aws.amazon.com/goto/SdkForJava/dynamodb-2012-08-10/PutItem\\\"> PutItem in the AWS SDK for Java</a>\\n                    </p>\\n               </li>\\n               <li>\\n                  <p>\\n                        <a href=\\\"http://docs.aws.amazon.com/goto/AWSJavaScriptSDK/dynamodb-2012-08-10/PutItem\\\"> PutItem in the AWS SDK for JavaScript</a>\\n                    </p>\\n               </li>\\n               <li>\\n                  <p>\\n                        <a href=\\\"http://docs.aws.amazon.com/goto/SdkForPHPV3/dynamodb-2012-08-10/PutItem\\\"> PutItem in the AWS SDK for PHP V3</a>\\n                    </p>\\n               </li>\\n               <li>\\n                  <p>\\n                        <a href=\\\"http://docs.aws.amazon.com/goto/boto3/dynamodb-2012-08-10/PutItem\\\">\\n                            PutItem in the AWS SDK for Python</a>\\n                    </p>\\n               </li>\\n               <li>\\n                  <p>\\n                        <a href=\\\"http://docs.aws.amazon.com/goto/SdkForRubyV2/dynamodb-2012-08-10/PutItem\\\"> PutItem in the AWS SDK for Ruby V2</a>\\n                    </p>\\n               </li>\\n            </ul>\\n         </important>\\n\\n         <p>When you add an item, the primary key attributes are the only required attributes.\\n            Attribute values cannot be null.</p> \\n            <p>Empty String and Binary attribute values are allowed. Attribute values of type String and Binary must have a length greater than zero if the attribute is used as a key attribute for a table or index.\\n            Set type attributes cannot be empty. </p>\\n            <p>Invalid Requests with empty values will\\n            be rejected with a <code>ValidationException</code> exception.</p>\\n         <note>\\n            <p>To prevent a new item from replacing an existing item, use a conditional expression\\n         that contains the <code>attribute_not_exists</code> function with the name of the\\n         attribute being used as the partition key for the table.  Since every record must contain\\n         that attribute, the <code>attribute_not_exists</code> function will only succeed if\\n         no matching item exists.</p>\\n         </note>\\n         <p>For more information about <code>PutItem</code>, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/WorkingWithItems.html\\\">Working with Items</a> in the <i>Amazon DynamoDB Developer Guide</i>.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#PutItemInput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"TableName\": {\n          \"target\": \"com.amazonaws.dynamodb#TableName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the table to contain the item.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"Item\": {\n          \"target\": \"com.amazonaws.dynamodb#PutItemInputAttributeMap\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A map of attribute name/value pairs, one for each attribute. Only the primary key attributes are required; you can optionally provide other attribute name-value pairs for the item.</p>\\n         <p>You must provide all of the attributes for the primary key. For example, with a simple primary key, you only need to provide a value for the partition key. For a composite primary key, you must provide both values for both the partition key and the sort key.</p>\\n         <p>If you specify any attributes that are part of an index key, then the data types for those attributes must match those of the schema in the table's attribute definition.</p>\\n         <p>Empty String and Binary attribute values are allowed. Attribute values of type String and Binary must have a length greater than zero if the attribute is used as a key attribute for a table or index.</p>\\n      \\n         <p>For more information about primary keys, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.CoreComponents.html#HowItWorks.CoreComponents.PrimaryKey\\\">Primary Key</a> in the <i>Amazon DynamoDB Developer\\n            Guide</i>.</p>\\n         <p>Each element in the <code>Item</code> map is an <code>AttributeValue</code> object.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"Expected\": {\n          \"target\": \"com.amazonaws.dynamodb#ExpectedAttributeMap\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>This is a legacy parameter.  Use <code>ConditionExpression</code> instead.  For more information, see\\n          <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/LegacyConditionalParameters.Expected.html\\\">Expected</a> in the <i>Amazon DynamoDB Developer Guide</i>.</p>\"\n          }\n        },\n        \"ReturnValues\": {\n          \"target\": \"com.amazonaws.dynamodb#ReturnValue\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Use <code>ReturnValues</code> if you want to get the item attributes as they appeared before they\\n      were updated with the <code>PutItem</code> request. For <code>PutItem</code>, the valid values are:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>NONE</code> - If <code>ReturnValues</code> is not specified, or if its value is\\n            <code>NONE</code>, then nothing is returned. (This setting is the default for\\n            <code>ReturnValues</code>.)</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ALL_OLD</code> - If <code>PutItem</code> overwrote an attribute name-value pair, then the\\n          content of the old item is returned.</p>\\n            </li>\\n         </ul>\\n         <note>\\n            <p>The <code>ReturnValues</code> parameter is used by several DynamoDB operations; however,\\n          <code>PutItem</code> does not recognize any values other than <code>NONE</code> or\\n          <code>ALL_OLD</code>.</p>\\n         </note>\"\n          }\n        },\n        \"ReturnConsumedCapacity\": {\n          \"target\": \"com.amazonaws.dynamodb#ReturnConsumedCapacity\"\n        },\n        \"ReturnItemCollectionMetrics\": {\n          \"target\": \"com.amazonaws.dynamodb#ReturnItemCollectionMetrics\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Determines whether item collection metrics are returned.  If set to <code>SIZE</code>, the response includes statistics about item collections, if any, that were modified during\\n      the operation are returned in the response. If set to <code>NONE</code> (the default), no statistics are returned.</p>\"\n          }\n        },\n        \"ConditionalOperator\": {\n          \"target\": \"com.amazonaws.dynamodb#ConditionalOperator\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>This is a legacy parameter.  Use <code>ConditionExpression</code> instead.  For more information, see\\n          <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/LegacyConditionalParameters.ConditionalOperator.html\\\">ConditionalOperator</a> in the <i>Amazon DynamoDB Developer Guide</i>.</p>\"\n          }\n        },\n        \"ConditionExpression\": {\n          \"target\": \"com.amazonaws.dynamodb#ConditionExpression\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A condition that must be satisfied in order for a conditional <code>PutItem</code> operation to\\n      succeed.</p>\\n         <p>An expression can contain any of the following:</p>\\n         <ul>\\n            <li>\\n               <p>Functions: <code>attribute_exists | attribute_not_exists | attribute_type | contains | begins_with | size</code>\\n               </p>\\n               <p>These function names are case-sensitive.</p>\\n            </li>\\n            <li>\\n               <p>Comparison operators: <code>= | <> |\\n            < | > | <= | >= |\\n            BETWEEN | IN </code>\\n               </p>\\n            </li>\\n            <li>\\n               <p> Logical operators: <code>AND | OR | NOT</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>For more information on condition expressions, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.SpecifyingConditions.html\\\">Condition Expressions</a> in the <i>Amazon DynamoDB Developer\\n                Guide</i>.</p>\"\n          }\n        },\n        \"ExpressionAttributeNames\": {\n          \"target\": \"com.amazonaws.dynamodb#ExpressionAttributeNameMap\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>One or more substitution tokens for attribute names in an expression. The following are some use cases for using <code>ExpressionAttributeNames</code>:</p>\\n         <ul>\\n            <li>\\n               <p>To access an attribute whose name conflicts with a DynamoDB reserved word.</p>\\n            </li>\\n            <li>\\n               <p>To create a placeholder for repeating occurrences of an attribute name in an expression.</p>\\n            </li>\\n            <li>\\n               <p>To prevent special characters in an attribute name from being misinterpreted in an expression.</p>\\n            </li>\\n         </ul>\\n         <p>Use the <b>#</b> character in an expression to dereference an attribute name. For example, consider the following attribute name:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>Percentile</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>The name of this attribute conflicts with a reserved word, so it cannot be used directly in an expression. (For the complete list of reserved words, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ReservedWords.html\\\">Reserved Words</a> in the <i>Amazon DynamoDB Developer Guide</i>). To work around this, you could specify the following for <code>ExpressionAttributeNames</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>{\\\"#P\\\":\\\"Percentile\\\"}</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>You could then use this substitution in an expression, as in this example:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>#P = :val</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <note>\\n            <p>Tokens that begin with the <b>:</b> character are <i>expression attribute values</i>, which are placeholders for the actual value at runtime.</p>\\n         </note>\\n         <p>For more information on expression attribute names, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.AccessingItemAttributes.html\\\">Specifying Item Attributes</a> in the <i>Amazon DynamoDB Developer\\n                Guide</i>.</p>\"\n          }\n        },\n        \"ExpressionAttributeValues\": {\n          \"target\": \"com.amazonaws.dynamodb#ExpressionAttributeValueMap\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>One or more values that can be substituted in an expression.</p>\\n         <p>Use the <b>:</b> (colon) character in an expression to dereference an attribute value. For example, suppose that you wanted to check whether the value of the <i>ProductStatus</i> attribute was one of the following: </p>\\n         <p>\\n            <code>Available | Backordered | Discontinued</code>\\n         </p>\\n         <p>You would first need to specify <code>ExpressionAttributeValues</code> as follows:</p>\\n         <p>\\n            <code>{ \\\":avail\\\":{\\\"S\\\":\\\"Available\\\"}, \\\":back\\\":{\\\"S\\\":\\\"Backordered\\\"}, \\\":disc\\\":{\\\"S\\\":\\\"Discontinued\\\"} }</code>\\n         </p>\\n         <p>You could then use these values in an expression, such as this:</p>\\n         <p>\\n            <code>ProductStatus IN (:avail, :back, :disc)</code>\\n         </p>\\n        <p>For more information on expression attribute values, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.SpecifyingConditions.html\\\">Condition Expressions</a> in the <i>Amazon DynamoDB Developer\\n                Guide</i>.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents the input of a <code>PutItem</code> operation.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#PutItemInputAttributeMap\": {\n      \"type\": \"map\",\n      \"key\": {\n        \"target\": \"com.amazonaws.dynamodb#AttributeName\"\n      },\n      \"value\": {\n        \"target\": \"com.amazonaws.dynamodb#AttributeValue\"\n      }\n    },\n    \"com.amazonaws.dynamodb#PutItemOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Attributes\": {\n          \"target\": \"com.amazonaws.dynamodb#AttributeMap\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The attribute values as they appeared before the <code>PutItem</code> operation, but only if\\n        <code>ReturnValues</code> is specified as <code>ALL_OLD</code> in the request. Each element\\n      consists of an attribute name and an attribute value.</p>\"\n          }\n        },\n        \"ConsumedCapacity\": {\n          \"target\": \"com.amazonaws.dynamodb#ConsumedCapacity\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The capacity units consumed by the <code>PutItem</code> operation. The data returned\\n            includes the total provisioned throughput consumed, along with statistics for the table\\n            and any indexes involved in the operation. <code>ConsumedCapacity</code> is only\\n            returned if the <code>ReturnConsumedCapacity</code> parameter was specified. For more\\n            information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ProvisionedThroughputIntro.html\\\">Read/Write Capacity Mode</a> in the <i>Amazon DynamoDB Developer\\n                Guide</i>.</p>\"\n          }\n        },\n        \"ItemCollectionMetrics\": {\n          \"target\": \"com.amazonaws.dynamodb#ItemCollectionMetrics\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Information about item collections, if any, that were affected by the\\n                <code>PutItem</code> operation. <code>ItemCollectionMetrics</code>\\n            is only returned if the <code>ReturnItemCollectionMetrics</code> parameter was specified. If the table does not have any local\\n            secondary indexes, this information is not returned in the response.</p>\\n         <p>Each <code>ItemCollectionMetrics</code>\\n        element consists of:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>ItemCollectionKey</code> - The partition key value of the item\\n          collection. This is the same as the partition key value of the item itself.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>SizeEstimateRangeGB</code> - An estimate of item collection size,\\n          in gigabytes. This value is a two-element array\\n          containing a lower bound and an upper bound for the\\n          estimate. The estimate includes the size of all the\\n          items in the table, plus the size of all attributes\\n          projected into all of the local secondary indexes on that\\n          table. Use this estimate to measure whether a local secondary index is approaching its size limit.</p>\\n               <p>The estimate is subject to change over time; therefore, do not rely on the precision or accuracy of the estimate.</p>\\n            </li>\\n         </ul>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents the output of a <code>PutItem</code> operation.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#PutRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Item\": {\n          \"target\": \"com.amazonaws.dynamodb#PutItemInputAttributeMap\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A map of attribute name to attribute values, representing the primary key of an item to\\n         be processed by <code>PutItem</code>. All of the table's primary key attributes must be\\n         specified, and their data types must match those of the table's key schema. If any\\n         attributes are present in the item that are part of an index key schema for the table,\\n         their types must match the index key schema.</p>\",\n            \"smithy.api#required\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents a request to perform a <code>PutItem</code> operation on an item.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#Query\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.dynamodb#QueryInput\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.dynamodb#QueryOutput\"\n      },\n      \"errors\": [\n        {\n          \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#InvalidEndpointException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#ProvisionedThroughputExceededException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#RequestLimitExceeded\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#ResourceNotFoundException\"\n        }\n      ],\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>The <code>Query</code> operation finds items based on primary key values.\\n            You can query any table or secondary index that has a composite primary key (a partition\\n            key and a sort key).\\n        </p>\\n        <p>Use the <code>KeyConditionExpression</code> parameter to provide a specific value\\n            for the partition key. The <code>Query</code> operation will return all of the items\\n            from the table or index with that partition key value. You can optionally narrow the\\n            scope of the <code>Query</code> operation by specifying a sort key value and a\\n            comparison operator in <code>KeyConditionExpression</code>. To further refine the <code>Query</code> results,\\n            you can optionally provide a <code>FilterExpression</code>. A <code>FilterExpression</code> determines which items\\n            within the results should be returned to you. All of the other results are discarded.\\n        </p>\\n        <p>\\n            A <code>Query</code> operation always returns a result set. If no matching items are found,\\n            the result set will be empty. Queries that do not return results consume the minimum number of\\n            read capacity units for that type of read operation.\\n        </p>\\n        <note>\\n            <p>\\n                DynamoDB calculates the number of read capacity units consumed based on item size,\\n                not on the amount of data that is returned to an application. The number of capacity\\n                units consumed will be the same whether you request all of the attributes (the default behavior)\\n                or just some of them (using a projection expression). The number will also be the same\\n                whether or not you use a <code>FilterExpression</code>.\\n            </p>\\n        </note>\\n        <p>\\n            <code>Query</code> results are always sorted by the sort key value. If the data type of the sort key is Number,\\n            the results are returned in numeric order; otherwise, the results are returned in order of UTF-8 bytes.\\n            By default, the sort order is ascending. To reverse the order, set the <code>ScanIndexForward</code> parameter\\n            to false.\\n        </p>\\n        <p> A single <code>Query</code> operation will read up to the maximum number of items\\n            set (if using the <code>Limit</code> parameter) or a maximum of 1 MB of data and then\\n            apply any filtering to the results using <code>FilterExpression</code>. If\\n                <code>LastEvaluatedKey</code> is present in the response, you will need to paginate\\n            the result set. For more information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Query.html#Query.Pagination\\\">Paginating\\n                the Results</a> in the <i>Amazon DynamoDB Developer Guide</i>. </p>\\n        <p>\\n            <code>FilterExpression</code> is applied after a <code>Query</code> finishes, but before\\n            the results are returned.\\n            A <code>FilterExpression</code> cannot contain partition key or sort key attributes.\\n            You need to specify those attributes in the <code>KeyConditionExpression</code>.\\n        </p>\\n        <note>\\n            <p>\\n                A <code>Query</code> operation can return an empty result set and a <code>LastEvaluatedKey</code>\\n                if all the items read for the page of results are filtered out.\\n            </p>\\n        </note>\\n        <p>You can query a table, a local secondary index, or a global secondary index. For a\\n            query on a table or on a local secondary index, you can set the\\n                <code>ConsistentRead</code> parameter to <code>true</code> and obtain a\\n            strongly consistent result. Global secondary indexes support eventually consistent reads\\n            only, so do not specify <code>ConsistentRead</code> when querying a global\\n            secondary index.</p>\",\n        \"smithy.api#paginated\": {\n          \"inputToken\": \"ExclusiveStartKey\",\n          \"outputToken\": \"LastEvaluatedKey\",\n          \"items\": \"Items\",\n          \"pageSize\": \"Limit\"\n        },\n        \"smithy.api#suppress\": [\n          \"PaginatedTrait\"\n        ]\n      }\n    },\n    \"com.amazonaws.dynamodb#QueryInput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"TableName\": {\n          \"target\": \"com.amazonaws.dynamodb#TableName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the table containing the requested items.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"IndexName\": {\n          \"target\": \"com.amazonaws.dynamodb#IndexName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of an index to query. This index can be any local secondary index or global secondary index on the table. Note that\\n       if you use the <code>IndexName</code> parameter, you must also provide <code>TableName.</code>\\n         </p>\"\n          }\n        },\n        \"Select\": {\n          \"target\": \"com.amazonaws.dynamodb#Select\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The attributes to be returned in the\\n          result. You can retrieve all item attributes, specific item attributes, the count of\\n          matching items, or in the case of an index, some or all of the attributes projected into\\n          the index.</p>\\n         <ul>\\n            <li>\\n              <p>\\n                    <code>ALL_ATTRIBUTES</code> - Returns all of the item attributes from the\\n                    specified table or index. If you query a local secondary index, then for each\\n                    matching item in the index, DynamoDB fetches the entire item from the parent\\n                    table. If the index is configured to project all item attributes, then all of\\n                    the data can be obtained from the local secondary index, and no fetching is\\n                    required.</p>\\n            </li>\\n            <li>\\n              <p>\\n                  <code>ALL_PROJECTED_ATTRIBUTES</code> - Allowed only when querying an index.\\n                  Retrieves all attributes that have been projected into the index. If the\\n                  index is configured to project all attributes, this return value is\\n                  equivalent to specifying <code>ALL_ATTRIBUTES</code>.</p>\\n            </li>\\n            <li>\\n              <p>\\n                  <code>COUNT</code> - Returns the number of matching items, rather than the\\n                  matching items themselves.</p>\\n            </li>\\n            <li>\\n              <p>\\n                  <code>SPECIFIC_ATTRIBUTES</code> - Returns only the attributes listed in\\n                  <code>AttributesToGet</code>. This return value is equivalent to\\n                  specifying <code>AttributesToGet</code> without specifying any value\\n                  for <code>Select</code>.</p>\\n              <p>If you query or scan a local secondary index and request only attributes that\\n                    are projected into that index, the operation will read only the index and not\\n                    the table. If any of the requested attributes are not projected into the local\\n                    secondary index, DynamoDB fetches each of these attributes from the parent\\n                    table. This extra fetching incurs additional throughput cost and latency.</p>\\n              <p>If you query or scan a global secondary index, you can only request\\n                  attributes that are projected into the index. Global secondary index queries\\n                  cannot fetch attributes from the parent table.</p>\\n            </li>\\n         </ul>\\n         <p>If neither <code>Select</code> nor <code>AttributesToGet</code>\\n          are specified, DynamoDB defaults to <code>ALL_ATTRIBUTES</code> when accessing a\\n          table, and <code>ALL_PROJECTED_ATTRIBUTES</code> when accessing an index. You cannot\\n          use both <code>Select</code> and <code>AttributesToGet</code>\\n          together in a single request, unless the value for <code>Select</code> is\\n          <code>SPECIFIC_ATTRIBUTES</code>. (This usage is equivalent to specifying\\n          <code>AttributesToGet</code> without any value for\\n          <code>Select</code>.)</p>\\n         <note>\\n            <p>If you use the <code>ProjectionExpression</code> parameter, then\\n              the value for <code>Select</code> can only be\\n              <code>SPECIFIC_ATTRIBUTES</code>. Any other value for\\n              <code>Select</code> will return an error.</p>\\n         </note>\"\n          }\n        },\n        \"AttributesToGet\": {\n          \"target\": \"com.amazonaws.dynamodb#AttributeNameList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>This is a legacy parameter.  Use <code>ProjectionExpression</code> instead.  For more information, see\\n          <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/LegacyConditionalParameters.AttributesToGet.html\\\">AttributesToGet</a> in the <i>Amazon DynamoDB Developer Guide</i>.</p>\"\n          }\n        },\n        \"Limit\": {\n          \"target\": \"com.amazonaws.dynamodb#PositiveIntegerObject\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The maximum number of items to evaluate (not necessarily the number of matching items).\\n            If DynamoDB processes the number of items up to the limit while processing the results,\\n            it stops the operation and returns the matching values up to that point, and a key in\\n                <code>LastEvaluatedKey</code> to apply in a subsequent operation, so that you can\\n            pick up where you left off. Also, if the processed dataset size exceeds 1 MB before\\n            DynamoDB reaches this limit, it stops the operation and returns the matching values up\\n            to the limit, and a key in <code>LastEvaluatedKey</code> to apply in a subsequent\\n            operation to continue the operation. For more information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/QueryAndScan.html\\\">Query and Scan</a> in the <i>Amazon DynamoDB Developer\\n            Guide</i>.</p>\"\n          }\n        },\n        \"ConsistentRead\": {\n          \"target\": \"com.amazonaws.dynamodb#ConsistentRead\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Determines the read consistency model:  If set to <code>true</code>, then the operation uses strongly consistent reads; otherwise, the operation uses eventually consistent reads.</p>\\n         <p>Strongly consistent reads\\n      are not supported on global secondary indexes. If you query a global secondary index with <code>ConsistentRead</code> set to\\n    <code>true</code>, you will receive a <code>ValidationException</code>.</p>\"\n          }\n        },\n        \"KeyConditions\": {\n          \"target\": \"com.amazonaws.dynamodb#KeyConditions\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>This is a legacy parameter.  Use <code>KeyConditionExpression</code> instead.   For more information, see\\n          <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/LegacyConditionalParameters.KeyConditions.html\\\">KeyConditions</a> in the <i>Amazon DynamoDB Developer Guide</i>.</p>\"\n          }\n        },\n        \"QueryFilter\": {\n          \"target\": \"com.amazonaws.dynamodb#FilterConditionMap\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>This is a legacy parameter.  Use <code>FilterExpression</code> instead.   For more information, see\\n          <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/LegacyConditionalParameters.QueryFilter.html\\\">QueryFilter</a> in the <i>Amazon DynamoDB Developer Guide</i>.</p>\"\n          }\n        },\n        \"ConditionalOperator\": {\n          \"target\": \"com.amazonaws.dynamodb#ConditionalOperator\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>This is a legacy parameter.  Use <code>FilterExpression</code> instead.  For more information, see\\n          <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/LegacyConditionalParameters.ConditionalOperator.html\\\">ConditionalOperator</a> in the <i>Amazon DynamoDB Developer Guide</i>.</p>\"\n          }\n        },\n        \"ScanIndexForward\": {\n          \"target\": \"com.amazonaws.dynamodb#BooleanObject\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the order for index traversal: If <code>true</code> (default), the traversal is performed in ascending order; if <code>false</code>, the traversal is performed in descending order. </p>\\n         <p>Items with the same partition key value are stored in sorted order by sort key. If the sort key data type is Number, the results are stored in numeric order. For type String, the results are stored in order of UTF-8 bytes. For type Binary, DynamoDB treats each byte of the binary data as unsigned.</p>\\n         <p>If <code>ScanIndexForward</code> is <code>true</code>, DynamoDB returns the results in the order in which they are stored (by sort key value). This is the default behavior. If <code>ScanIndexForward</code> is <code>false</code>, DynamoDB reads the results in reverse order by sort key value, and then returns the results to the client.</p>\"\n          }\n        },\n        \"ExclusiveStartKey\": {\n          \"target\": \"com.amazonaws.dynamodb#Key\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The primary key of the first item that this operation will evaluate. Use the value that was returned for <code>LastEvaluatedKey</code> in the previous operation.</p>\\n         <p>The data type for <code>ExclusiveStartKey</code> must be String, Number, or Binary. No\\n            set data types are allowed.</p>\"\n          }\n        },\n        \"ReturnConsumedCapacity\": {\n          \"target\": \"com.amazonaws.dynamodb#ReturnConsumedCapacity\"\n        },\n        \"ProjectionExpression\": {\n          \"target\": \"com.amazonaws.dynamodb#ProjectionExpression\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A string that identifies one or more attributes to retrieve from the table. These attributes can include scalars, sets, or elements of a JSON document. The attributes in the expression must be separated by commas.</p>\\n         <p>If no attribute names are specified, then all attributes will be returned. If any of the requested attributes are not found, they will not appear in the result.</p>\\n         <p>For more information, see\\n      <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.AccessingItemAttributes.html\\\">Accessing Item Attributes</a> in the <i>Amazon DynamoDB Developer Guide</i>.</p>\"\n          }\n        },\n        \"FilterExpression\": {\n          \"target\": \"com.amazonaws.dynamodb#ConditionExpression\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A string that contains conditions that DynamoDB applies after the <code>Query</code> operation, but\\n       before the data is returned to you. Items that do not satisfy the <code>FilterExpression</code>\\n       criteria are not returned.</p>\\n         <p>A <code>FilterExpression</code> does not allow key attributes.  You cannot define a filter expression based on a partition key or a sort key.</p>\\n         <note>\\n            <p>A <code>FilterExpression</code> is applied after the items have already been read; the process of\\n         filtering does not consume any additional read capacity units.</p>\\n         </note>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/QueryAndScan.html#FilteringResults\\\">Filter\\n         Expressions</a> in the <i>Amazon DynamoDB Developer Guide</i>.</p>\"\n          }\n        },\n        \"KeyConditionExpression\": {\n          \"target\": \"com.amazonaws.dynamodb#KeyExpression\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The condition that specifies the key values for items to be retrieved by the\\n                <code>Query</code> action.</p>\\n\\n         <p>The condition must perform an equality test on a single partition key value.</p>\\n        <p>The condition can optionally perform one of several comparison tests on a single\\n            sort key value. This allows <code>Query</code> to retrieve one item with a given\\n            partition key value and sort key value, or several items that have the same partition\\n            key value but different sort key values.</p>\\n\\n         <p>The partition key equality test is required, and must be specified in the following format:</p>\\n\\n         <p>\\n            <code>partitionKeyName</code>\\n            <i>=</i>\\n            <code>:partitionkeyval</code>\\n         </p>\\n\\n         <p>If you also want to provide a condition for the sort key, it must be combined using <code>AND</code> with the condition\\n      for the sort key. Following is an example, using the <b>=</b> comparison operator for the sort key:</p>\\n\\n        <p>\\n            <code>partitionKeyName</code>\\n            <code>=</code>\\n            <code>:partitionkeyval</code>\\n            <code>AND</code>\\n            <code>sortKeyName</code>\\n            <code>=</code>\\n            <code>:sortkeyval</code>\\n        </p>\\n         <p>Valid comparisons for the sort key condition are as follows:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>sortKeyName</code>\\n                  <code>=</code>\\n                  <code>:sortkeyval</code> - true if the sort key value is equal to <code>:sortkeyval</code>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>sortKeyName</code>\\n                  <code><</code>\\n                  <code>:sortkeyval</code> - true if the sort key value is less than <code>:sortkeyval</code>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>sortKeyName</code>\\n                  <code><=</code>\\n                  <code>:sortkeyval</code> - true if the sort key value is less than or equal to\\n          <code>:sortkeyval</code>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>sortKeyName</code>\\n                  <code>></code>\\n                  <code>:sortkeyval</code> - true if the sort key value is greater than <code>:sortkeyval</code>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>sortKeyName</code>\\n                  <code>>= </code>\\n                  <code>:sortkeyval</code> - true if the sort key value is greater than\\n          or equal to <code>:sortkeyval</code>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>sortKeyName</code>\\n                  <code>BETWEEN</code>\\n                  <code>:sortkeyval1</code>\\n                  <code>AND</code>\\n                  <code>:sortkeyval2</code> - true if the sort key value is greater than or equal to\\n          <code>:sortkeyval1</code>, and less than or equal to <code>:sortkeyval2</code>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>begins_with (</code>\\n                  <code>sortKeyName</code>, <code>:sortkeyval</code>\\n                  <code>)</code> -\\n          true if the sort key value begins with a particular operand. (You cannot use this function with a sort key that is of type Number.)  Note that the function name\\n            <code>begins_with</code> is case-sensitive.</p>\\n\\n            </li>\\n         </ul>\\n\\n         <p>Use the <code>ExpressionAttributeValues</code> parameter to replace tokens such as\\n        <code>:partitionval</code> and <code>:sortval</code> with actual values at runtime.</p>\\n\\n         <p>You can optionally use the <code>ExpressionAttributeNames</code> parameter to replace the names of\\n      the partition key and sort key with placeholder tokens. This option might be necessary if an attribute\\n      name conflicts with a DynamoDB reserved word. For example, the following\\n        <code>KeyConditionExpression</code> parameter causes an error because <i>Size</i> is a reserved\\n      word:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>Size = :myval</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>To work around this, define a placeholder (such a <code>#S</code>) to represent the attribute\\n      name <i>Size</i>. <code>KeyConditionExpression</code> then is as follows:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>#S = :myval</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>For a list of reserved words, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ReservedWords.html\\\">Reserved\\n        Words</a> in the <i>Amazon DynamoDB Developer Guide</i>.</p>\\n\\n         <p>For more information on <code>ExpressionAttributeNames</code> and <code>ExpressionAttributeValues</code>,\\n      see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ExpressionPlaceholders.html\\\">Using Placeholders for Attribute\\n        Names and Values</a> in the <i>Amazon DynamoDB Developer Guide</i>.</p>\"\n          }\n        },\n        \"ExpressionAttributeNames\": {\n          \"target\": \"com.amazonaws.dynamodb#ExpressionAttributeNameMap\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>One or more substitution tokens for attribute names in an expression. The following are some use cases for using <code>ExpressionAttributeNames</code>:</p>\\n         <ul>\\n            <li>\\n               <p>To access an attribute whose name conflicts with a DynamoDB reserved word.</p>\\n            </li>\\n            <li>\\n               <p>To create a placeholder for repeating occurrences of an attribute name in an expression.</p>\\n            </li>\\n            <li>\\n               <p>To prevent special characters in an attribute name from being misinterpreted in an expression.</p>\\n            </li>\\n         </ul>\\n         <p>Use the <b>#</b> character in an expression to dereference an attribute name. For example, consider the following attribute name:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>Percentile</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>The name of this attribute conflicts with a reserved word, so it cannot be used directly in an expression. (For the complete list of reserved words, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ReservedWords.html\\\">Reserved Words</a> in the <i>Amazon DynamoDB Developer Guide</i>). To work around this, you could specify the following for\\n            <code>ExpressionAttributeNames</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>{\\\"#P\\\":\\\"Percentile\\\"}</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>You could then use this substitution in an expression, as in this example:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>#P = :val</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <note>\\n            <p>Tokens that begin with the <b>:</b> character are <i>expression attribute values</i>, which are placeholders for the actual value at runtime.</p>\\n         </note>\\n         <p>For more information on expression attribute names, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.AccessingItemAttributes.html\\\">Specifying Item Attributes</a> in the <i>Amazon DynamoDB Developer\\n                Guide</i>.</p>\"\n          }\n        },\n        \"ExpressionAttributeValues\": {\n          \"target\": \"com.amazonaws.dynamodb#ExpressionAttributeValueMap\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>One or more values that can be substituted in an expression.</p>\\n         <p>Use the <b>:</b> (colon) character in an expression to dereference an attribute value. For example, suppose that you wanted to check whether the value of the\\n            <i>ProductStatus</i> attribute was one of the following: </p>\\n         <p>\\n            <code>Available | Backordered | Discontinued</code>\\n         </p>\\n         <p>You would first need to specify <code>ExpressionAttributeValues</code> as follows:</p>\\n         <p>\\n            <code>{ \\\":avail\\\":{\\\"S\\\":\\\"Available\\\"}, \\\":back\\\":{\\\"S\\\":\\\"Backordered\\\"}, \\\":disc\\\":{\\\"S\\\":\\\"Discontinued\\\"} }</code>\\n         </p>\\n         <p>You could then use these values in an expression, such as this:</p>\\n         <p>\\n            <code>ProductStatus IN (:avail, :back, :disc)</code>\\n         </p>\\n        <p>For more information on expression attribute values, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.SpecifyingConditions.html\\\">Specifying Conditions</a> in the <i>Amazon DynamoDB Developer Guide</i>.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents the input of a <code>Query</code> operation.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#QueryOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Items\": {\n          \"target\": \"com.amazonaws.dynamodb#ItemList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>An array of item attributes that match the query criteria. Each element in this array consists of an attribute name and the value for that attribute.</p>\"\n          }\n        },\n        \"Count\": {\n          \"target\": \"com.amazonaws.dynamodb#Integer\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The number of items in the response.</p>\\n         <p>If you used a <code>QueryFilter</code> in the request, then <code>Count</code> is the number of items\\n      returned after the filter was applied, and <code>ScannedCount</code> is the number of\\n      matching items before the filter was applied.</p>\\n         <p>If you did not use a filter in the request, then <code>Count</code> and <code>ScannedCount</code> are the\\n      same.</p>\"\n          }\n        },\n        \"ScannedCount\": {\n          \"target\": \"com.amazonaws.dynamodb#Integer\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The number of items evaluated, before any <code>QueryFilter</code> is applied. A high\\n        <code>ScannedCount</code> value with few, or no, <code>Count</code> results indicates an inefficient\\n        <code>Query</code> operation. For more information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/QueryAndScan.html#Count\\\">Count and ScannedCount</a> in the\\n      <i>Amazon DynamoDB Developer Guide</i>.</p>\\n         <p>If you did not use a filter in the request, then <code>ScannedCount</code> is the same as\\n        <code>Count</code>.</p>\"\n          }\n        },\n        \"LastEvaluatedKey\": {\n          \"target\": \"com.amazonaws.dynamodb#Key\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The primary key of the item where the operation stopped, inclusive of the previous result set. Use this value to start a new operation, excluding this value in the new request.</p>\\n         <p>If <code>LastEvaluatedKey</code> is empty, then the \\\"last page\\\" of results has been processed and there is no more data to be retrieved.</p>\\n         <p>If <code>LastEvaluatedKey</code> is not empty, it does not necessarily mean that there is more data in the result set. The only way to know when you have reached the end of the result set is when <code>LastEvaluatedKey</code> is empty.</p>\"\n          }\n        },\n        \"ConsumedCapacity\": {\n          \"target\": \"com.amazonaws.dynamodb#ConsumedCapacity\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The capacity units consumed by the <code>Query</code> operation. The data returned\\n            includes the total provisioned throughput consumed, along with statistics for the table\\n            and any indexes involved in the operation. <code>ConsumedCapacity</code> is only\\n            returned if the <code>ReturnConsumedCapacity</code> parameter was specified. For more\\n            information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ProvisionedThroughputIntro.html\\\">Provisioned Throughput</a> in the <i>Amazon DynamoDB Developer\\n                Guide</i>.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents the output of a <code>Query</code> operation.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#RegionName\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.dynamodb#Replica\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"RegionName\": {\n          \"target\": \"com.amazonaws.dynamodb#RegionName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Region where the replica needs to be created.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents the properties of a replica.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#ReplicaAlreadyExistsException\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"message\": {\n          \"target\": \"com.amazonaws.dynamodb#ErrorMessage\"\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>The specified replica is already part of the global table.</p>\",\n        \"smithy.api#error\": \"client\"\n      }\n    },\n    \"com.amazonaws.dynamodb#ReplicaAutoScalingDescription\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"RegionName\": {\n          \"target\": \"com.amazonaws.dynamodb#RegionName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Region where the replica exists.</p>\"\n          }\n        },\n        \"GlobalSecondaryIndexes\": {\n          \"target\": \"com.amazonaws.dynamodb#ReplicaGlobalSecondaryIndexAutoScalingDescriptionList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Replica-specific global secondary index auto scaling settings.</p>\"\n          }\n        },\n        \"ReplicaProvisionedReadCapacityAutoScalingSettings\": {\n          \"target\": \"com.amazonaws.dynamodb#AutoScalingSettingsDescription\"\n        },\n        \"ReplicaProvisionedWriteCapacityAutoScalingSettings\": {\n          \"target\": \"com.amazonaws.dynamodb#AutoScalingSettingsDescription\"\n        },\n        \"ReplicaStatus\": {\n          \"target\": \"com.amazonaws.dynamodb#ReplicaStatus\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The current state of the replica:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>CREATING</code> - The replica is being created.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>UPDATING</code> - The replica is being updated.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>DELETING</code> - The replica is being deleted.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ACTIVE</code> - The replica is ready for use.</p>\\n            </li>\\n         </ul>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents the auto scaling settings of the replica.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#ReplicaAutoScalingDescriptionList\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.dynamodb#ReplicaAutoScalingDescription\"\n      }\n    },\n    \"com.amazonaws.dynamodb#ReplicaAutoScalingUpdate\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"RegionName\": {\n          \"target\": \"com.amazonaws.dynamodb#RegionName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Region where the replica exists.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"ReplicaGlobalSecondaryIndexUpdates\": {\n          \"target\": \"com.amazonaws.dynamodb#ReplicaGlobalSecondaryIndexAutoScalingUpdateList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Represents the auto scaling settings of global secondary indexes that will\\n         be modified.</p>\"\n          }\n        },\n        \"ReplicaProvisionedReadCapacityAutoScalingUpdate\": {\n          \"target\": \"com.amazonaws.dynamodb#AutoScalingSettingsUpdate\"\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents the auto scaling settings of a replica that will be modified.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#ReplicaAutoScalingUpdateList\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.dynamodb#ReplicaAutoScalingUpdate\"\n      },\n      \"traits\": {\n        \"smithy.api#length\": {\n          \"min\": 1\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#ReplicaDescription\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"RegionName\": {\n          \"target\": \"com.amazonaws.dynamodb#RegionName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the Region.</p>\"\n          }\n        },\n        \"ReplicaStatus\": {\n          \"target\": \"com.amazonaws.dynamodb#ReplicaStatus\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The current state of the replica:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>CREATING</code> - The replica is being created.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>UPDATING</code> - The replica is being updated.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>DELETING</code> - The replica is being deleted.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ACTIVE</code> - The replica is ready for use.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>REGION_DISABLED</code> - The replica is inaccessible because the AWS Region has been disabled.</p>\\n               <note>\\n                  <p>If the AWS Region remains inaccessible for more than 20 hours, DynamoDB will remove this replica from the replication group. The replica will not be deleted and replication will stop from and to this region.</p>\\n               </note>\\n            </li>\\n            <li>      \\n               <p>\\n                  <code>INACCESSIBLE_ENCRYPTION_CREDENTIALS </code> - The AWS KMS key used to encrypt the table is inaccessible.</p>\\n               <note>\\n                  <p>If the AWS KMS key remains inaccessible for more than 20 hours, DynamoDB will remove this replica from the replication group. The replica will not be deleted and replication will stop from and to this region.</p>\\n               </note>\\n            </li>\\n         </ul>\"\n          }\n        },\n        \"ReplicaStatusDescription\": {\n          \"target\": \"com.amazonaws.dynamodb#ReplicaStatusDescription\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Detailed information about the replica status.</p>\"\n          }\n        },\n        \"ReplicaStatusPercentProgress\": {\n          \"target\": \"com.amazonaws.dynamodb#ReplicaStatusPercentProgress\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Specifies the progress of a Create, Update, or Delete action on the replica\\n         as a percentage.</p>\"\n          }\n        },\n        \"KMSMasterKeyId\": {\n          \"target\": \"com.amazonaws.dynamodb#KMSMasterKeyId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The AWS KMS customer master key (CMK) of the replica that will be used for AWS KMS\\n         encryption.</p>\"\n          }\n        },\n        \"ProvisionedThroughputOverride\": {\n          \"target\": \"com.amazonaws.dynamodb#ProvisionedThroughputOverride\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Replica-specific provisioned throughput. If not described, uses the source table's\\n         provisioned throughput settings.</p>\"\n          }\n        },\n        \"GlobalSecondaryIndexes\": {\n          \"target\": \"com.amazonaws.dynamodb#ReplicaGlobalSecondaryIndexDescriptionList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Replica-specific global secondary index settings.</p>\"\n          }\n        },\n        \"ReplicaInaccessibleDateTime\": {\n          \"target\": \"com.amazonaws.dynamodb#Date\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The time at which the replica was first detected as inaccessible. To determine cause of inaccessibility check the <code>ReplicaStatus</code> property.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Contains the details of the replica.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#ReplicaDescriptionList\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.dynamodb#ReplicaDescription\"\n      }\n    },\n    \"com.amazonaws.dynamodb#ReplicaGlobalSecondaryIndex\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"IndexName\": {\n          \"target\": \"com.amazonaws.dynamodb#IndexName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the global secondary index.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"ProvisionedThroughputOverride\": {\n          \"target\": \"com.amazonaws.dynamodb#ProvisionedThroughputOverride\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Replica table GSI-specific provisioned throughput. If not specified, uses the\\n         source table GSI's read capacity settings.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents the properties of a replica global secondary index.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#ReplicaGlobalSecondaryIndexAutoScalingDescription\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"IndexName\": {\n          \"target\": \"com.amazonaws.dynamodb#IndexName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the global secondary index.</p>\"\n          }\n        },\n        \"IndexStatus\": {\n          \"target\": \"com.amazonaws.dynamodb#IndexStatus\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The current state of the replica global secondary index:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>CREATING</code> - The index is being created.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>UPDATING</code> - The index is being updated.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>DELETING</code> - The index is being deleted.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ACTIVE</code> - The index is ready for use.</p>\\n            </li>\\n         </ul>\"\n          }\n        },\n        \"ProvisionedReadCapacityAutoScalingSettings\": {\n          \"target\": \"com.amazonaws.dynamodb#AutoScalingSettingsDescription\"\n        },\n        \"ProvisionedWriteCapacityAutoScalingSettings\": {\n          \"target\": \"com.amazonaws.dynamodb#AutoScalingSettingsDescription\"\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents the auto scaling configuration for a replica global secondary index.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#ReplicaGlobalSecondaryIndexAutoScalingDescriptionList\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.dynamodb#ReplicaGlobalSecondaryIndexAutoScalingDescription\"\n      }\n    },\n    \"com.amazonaws.dynamodb#ReplicaGlobalSecondaryIndexAutoScalingUpdate\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"IndexName\": {\n          \"target\": \"com.amazonaws.dynamodb#IndexName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the global secondary index.</p>\"\n          }\n        },\n        \"ProvisionedReadCapacityAutoScalingUpdate\": {\n          \"target\": \"com.amazonaws.dynamodb#AutoScalingSettingsUpdate\"\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents the auto scaling settings of a global secondary index for a replica\\n         that will be modified.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#ReplicaGlobalSecondaryIndexAutoScalingUpdateList\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.dynamodb#ReplicaGlobalSecondaryIndexAutoScalingUpdate\"\n      }\n    },\n    \"com.amazonaws.dynamodb#ReplicaGlobalSecondaryIndexDescription\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"IndexName\": {\n          \"target\": \"com.amazonaws.dynamodb#IndexName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the global secondary index.</p>\"\n          }\n        },\n        \"ProvisionedThroughputOverride\": {\n          \"target\": \"com.amazonaws.dynamodb#ProvisionedThroughputOverride\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>If not described, uses the source table GSI's read capacity settings.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents the properties of a replica global secondary index.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#ReplicaGlobalSecondaryIndexDescriptionList\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.dynamodb#ReplicaGlobalSecondaryIndexDescription\"\n      }\n    },\n    \"com.amazonaws.dynamodb#ReplicaGlobalSecondaryIndexList\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.dynamodb#ReplicaGlobalSecondaryIndex\"\n      },\n      \"traits\": {\n        \"smithy.api#length\": {\n          \"min\": 1\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#ReplicaGlobalSecondaryIndexSettingsDescription\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"IndexName\": {\n          \"target\": \"com.amazonaws.dynamodb#IndexName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the global secondary index. The name must be unique among all other indexes on this table.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"IndexStatus\": {\n          \"target\": \"com.amazonaws.dynamodb#IndexStatus\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>\\n               The current status of the global secondary index:</p>\\n            <ul>\\n            <li>\\n                  <p>\\n                     <code>CREATING</code> - The global secondary index is being created.</p>\\n               </li>\\n            <li>\\n                  <p>\\n                     <code>UPDATING</code> - The global secondary index is being updated.</p>\\n               </li>\\n            <li>\\n                  <p>\\n                     <code>DELETING</code> - The global secondary index is being deleted.</p>\\n               </li>\\n            <li>\\n                  <p>\\n                     <code>ACTIVE</code> - The global secondary index is ready for use.</p>\\n               </li>\\n         </ul>\"\n          }\n        },\n        \"ProvisionedReadCapacityUnits\": {\n          \"target\": \"com.amazonaws.dynamodb#PositiveLongObject\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The maximum number of strongly consistent reads consumed per second before DynamoDB returns a <code>ThrottlingException</code>.</p>\"\n          }\n        },\n        \"ProvisionedReadCapacityAutoScalingSettings\": {\n          \"target\": \"com.amazonaws.dynamodb#AutoScalingSettingsDescription\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Auto scaling settings for a global secondary index replica's read capacity units.</p>\"\n          }\n        },\n        \"ProvisionedWriteCapacityUnits\": {\n          \"target\": \"com.amazonaws.dynamodb#PositiveLongObject\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The maximum number of writes consumed per second before DynamoDB returns a <code>ThrottlingException</code>.</p>\"\n          }\n        },\n        \"ProvisionedWriteCapacityAutoScalingSettings\": {\n          \"target\": \"com.amazonaws.dynamodb#AutoScalingSettingsDescription\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Auto scaling settings for a global secondary index replica's write capacity\\n         units.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents the properties of a global secondary index.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#ReplicaGlobalSecondaryIndexSettingsDescriptionList\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.dynamodb#ReplicaGlobalSecondaryIndexSettingsDescription\"\n      }\n    },\n    \"com.amazonaws.dynamodb#ReplicaGlobalSecondaryIndexSettingsUpdate\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"IndexName\": {\n          \"target\": \"com.amazonaws.dynamodb#IndexName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the global secondary index. The name must be unique among all other indexes on this table.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"ProvisionedReadCapacityUnits\": {\n          \"target\": \"com.amazonaws.dynamodb#PositiveLongObject\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The maximum number of strongly consistent reads consumed per second before DynamoDB returns a <code>ThrottlingException</code>.</p>\"\n          }\n        },\n        \"ProvisionedReadCapacityAutoScalingSettingsUpdate\": {\n          \"target\": \"com.amazonaws.dynamodb#AutoScalingSettingsUpdate\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Auto scaling settings for managing a global secondary index replica's read capacity\\n         units.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents the settings of a global secondary index for a global table that will be modified.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#ReplicaGlobalSecondaryIndexSettingsUpdateList\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.dynamodb#ReplicaGlobalSecondaryIndexSettingsUpdate\"\n      },\n      \"traits\": {\n        \"smithy.api#length\": {\n          \"min\": 1,\n          \"max\": 20\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#ReplicaList\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.dynamodb#Replica\"\n      }\n    },\n    \"com.amazonaws.dynamodb#ReplicaNotFoundException\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"message\": {\n          \"target\": \"com.amazonaws.dynamodb#ErrorMessage\"\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>The specified replica is no longer part of the global table.</p>\",\n        \"smithy.api#error\": \"client\"\n      }\n    },\n    \"com.amazonaws.dynamodb#ReplicaSettingsDescription\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"RegionName\": {\n          \"target\": \"com.amazonaws.dynamodb#RegionName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Region name of the replica.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"ReplicaStatus\": {\n          \"target\": \"com.amazonaws.dynamodb#ReplicaStatus\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The current state of the Region:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>CREATING</code> - The Region is being created.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>UPDATING</code> - The Region is being updated.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>DELETING</code> - The Region is being deleted.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ACTIVE</code> - The Region is ready for use.</p>\\n            </li>\\n         </ul>\"\n          }\n        },\n        \"ReplicaBillingModeSummary\": {\n          \"target\": \"com.amazonaws.dynamodb#BillingModeSummary\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The read/write capacity mode of the replica.</p>\"\n          }\n        },\n        \"ReplicaProvisionedReadCapacityUnits\": {\n          \"target\": \"com.amazonaws.dynamodb#NonNegativeLongObject\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The maximum number of strongly consistent reads consumed per second before DynamoDB returns a <code>ThrottlingException</code>.\\n        For more information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/WorkingWithTables.html#ProvisionedThroughput\\\">Specifying Read and Write\\n        Requirements</a> in the <i>Amazon DynamoDB Developer Guide</i>.\\n     </p>\"\n          }\n        },\n        \"ReplicaProvisionedReadCapacityAutoScalingSettings\": {\n          \"target\": \"com.amazonaws.dynamodb#AutoScalingSettingsDescription\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Auto scaling settings for a global table replica's read capacity units.</p>\"\n          }\n        },\n        \"ReplicaProvisionedWriteCapacityUnits\": {\n          \"target\": \"com.amazonaws.dynamodb#NonNegativeLongObject\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The maximum number of writes consumed per second before DynamoDB returns a <code>ThrottlingException</code>.\\n        For more information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/WorkingWithTables.html#ProvisionedThroughput\\\">Specifying Read and Write\\n        Requirements</a> in the <i>Amazon DynamoDB Developer Guide</i>.</p>\"\n          }\n        },\n        \"ReplicaProvisionedWriteCapacityAutoScalingSettings\": {\n          \"target\": \"com.amazonaws.dynamodb#AutoScalingSettingsDescription\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Auto scaling settings for a global table replica's write capacity units.</p>\"\n          }\n        },\n        \"ReplicaGlobalSecondaryIndexSettings\": {\n          \"target\": \"com.amazonaws.dynamodb#ReplicaGlobalSecondaryIndexSettingsDescriptionList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Replica global secondary index settings for the global table.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents the properties of a replica.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#ReplicaSettingsDescriptionList\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.dynamodb#ReplicaSettingsDescription\"\n      }\n    },\n    \"com.amazonaws.dynamodb#ReplicaSettingsUpdate\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"RegionName\": {\n          \"target\": \"com.amazonaws.dynamodb#RegionName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Region of the replica to be added.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"ReplicaProvisionedReadCapacityUnits\": {\n          \"target\": \"com.amazonaws.dynamodb#PositiveLongObject\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The maximum number of strongly consistent reads consumed per second before DynamoDB returns a <code>ThrottlingException</code>.\\n        For more information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/WorkingWithTables.html#ProvisionedThroughput\\\">Specifying Read and Write\\n        Requirements</a> in the <i>Amazon DynamoDB Developer Guide</i>.\\n     </p>\"\n          }\n        },\n        \"ReplicaProvisionedReadCapacityAutoScalingSettingsUpdate\": {\n          \"target\": \"com.amazonaws.dynamodb#AutoScalingSettingsUpdate\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Auto scaling settings for managing a global table replica's read capacity units.</p>\"\n          }\n        },\n        \"ReplicaGlobalSecondaryIndexSettingsUpdate\": {\n          \"target\": \"com.amazonaws.dynamodb#ReplicaGlobalSecondaryIndexSettingsUpdateList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Represents the settings of a global secondary index for a global table that will be modified.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents the settings for a global table in a Region that will be modified.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#ReplicaSettingsUpdateList\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.dynamodb#ReplicaSettingsUpdate\"\n      },\n      \"traits\": {\n        \"smithy.api#length\": {\n          \"min\": 1,\n          \"max\": 50\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#ReplicaStatus\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#enum\": [\n          {\n            \"value\": \"CREATING\",\n            \"name\": \"CREATING\"\n          },\n          {\n            \"value\": \"CREATION_FAILED\",\n            \"name\": \"CREATION_FAILED\"\n          },\n          {\n            \"value\": \"UPDATING\",\n            \"name\": \"UPDATING\"\n          },\n          {\n            \"value\": \"DELETING\",\n            \"name\": \"DELETING\"\n          },\n          {\n            \"value\": \"ACTIVE\",\n            \"name\": \"ACTIVE\"\n          },\n          {\n            \"value\": \"REGION_DISABLED\",\n            \"name\": \"REGION_DISABLED\"\n          },\n          {\n            \"value\": \"INACCESSIBLE_ENCRYPTION_CREDENTIALS\",\n            \"name\": \"INACCESSIBLE_ENCRYPTION_CREDENTIALS\"\n          }\n        ]\n      }\n    },\n    \"com.amazonaws.dynamodb#ReplicaStatusDescription\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.dynamodb#ReplicaStatusPercentProgress\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.dynamodb#ReplicaUpdate\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Create\": {\n          \"target\": \"com.amazonaws.dynamodb#CreateReplicaAction\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The parameters required for creating a replica on an existing global table.</p>\"\n          }\n        },\n        \"Delete\": {\n          \"target\": \"com.amazonaws.dynamodb#DeleteReplicaAction\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the existing replica to be removed.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents one of the following:</p>\\n         <ul>\\n            <li>\\n               <p>A new replica to be added to an existing global table.</p>\\n            </li>\\n            <li>\\n               <p>New parameters for an existing replica.</p>\\n            </li>\\n            <li>\\n               <p>An existing replica to be removed from an existing global table.</p>\\n            </li>\\n         </ul>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#ReplicaUpdateList\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.dynamodb#ReplicaUpdate\"\n      }\n    },\n    \"com.amazonaws.dynamodb#ReplicationGroupUpdate\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Create\": {\n          \"target\": \"com.amazonaws.dynamodb#CreateReplicationGroupMemberAction\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The parameters required for creating a replica for the table.</p>\"\n          }\n        },\n        \"Update\": {\n          \"target\": \"com.amazonaws.dynamodb#UpdateReplicationGroupMemberAction\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The parameters required for updating a replica for the table.</p>\"\n          }\n        },\n        \"Delete\": {\n          \"target\": \"com.amazonaws.dynamodb#DeleteReplicationGroupMemberAction\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The parameters required for deleting a replica for the table.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents one of the following:</p>\\n         <ul>\\n            <li>\\n               <p>A new replica to be added to an existing regional table or global table. This\\n               request invokes the <code>CreateTableReplica</code> action in the destination\\n               Region.</p>\\n            </li>\\n            <li>\\n               <p>New parameters for an existing replica. This request invokes the\\n               <code>UpdateTable</code> action in the destination Region.</p>\\n            </li>\\n            <li>\\n               <p>An existing replica to be deleted. The request invokes the \\n               <code>DeleteTableReplica</code> action in the destination Region, deleting the\\n               replica and all if its items in the destination Region.</p>\\n            </li>\\n         </ul>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#ReplicationGroupUpdateList\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.dynamodb#ReplicationGroupUpdate\"\n      },\n      \"traits\": {\n        \"smithy.api#length\": {\n          \"min\": 1\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#RequestLimitExceeded\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"message\": {\n          \"target\": \"com.amazonaws.dynamodb#ErrorMessage\"\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Throughput exceeds the current throughput quota for your account. Please contact AWS Support at <a href=\\\"https://aws.amazon.com/support\\\">AWS Support</a> to request a quota increase.</p>\",\n        \"smithy.api#error\": \"client\"\n      }\n    },\n    \"com.amazonaws.dynamodb#ResourceArnString\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#length\": {\n          \"min\": 1,\n          \"max\": 1283\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#ResourceInUseException\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"message\": {\n          \"target\": \"com.amazonaws.dynamodb#ErrorMessage\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The resource which is being attempted to be changed is in use.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>The operation conflicts with the resource's availability. For example, you attempted to\\n      recreate an existing table, or tried to delete a table currently in the <code>CREATING</code>\\n      state.</p>\",\n        \"smithy.api#error\": \"client\"\n      }\n    },\n    \"com.amazonaws.dynamodb#ResourceNotFoundException\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"message\": {\n          \"target\": \"com.amazonaws.dynamodb#ErrorMessage\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The resource which is being requested does not exist.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>The operation tried to access a nonexistent table or index. The resource might not be specified\\n      correctly, or its status might not be <code>ACTIVE</code>.</p>\",\n        \"smithy.api#error\": \"client\"\n      }\n    },\n    \"com.amazonaws.dynamodb#RestoreInProgress\": {\n      \"type\": \"boolean\",\n      \"traits\": {\n        \"smithy.api#box\": {}\n      }\n    },\n    \"com.amazonaws.dynamodb#RestoreSummary\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"SourceBackupArn\": {\n          \"target\": \"com.amazonaws.dynamodb#BackupArn\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the backup from which the table was restored.</p>\"\n          }\n        },\n        \"SourceTableArn\": {\n          \"target\": \"com.amazonaws.dynamodb#TableArn\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The ARN of the source table of the backup that is being restored.</p>\"\n          }\n        },\n        \"RestoreDateTime\": {\n          \"target\": \"com.amazonaws.dynamodb#Date\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Point in time or source backup time.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"RestoreInProgress\": {\n          \"target\": \"com.amazonaws.dynamodb#RestoreInProgress\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Indicates if a restore is in progress or not.</p>\",\n            \"smithy.api#required\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Contains details for the restore.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#RestoreTableFromBackup\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.dynamodb#RestoreTableFromBackupInput\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.dynamodb#RestoreTableFromBackupOutput\"\n      },\n      \"errors\": [\n        {\n          \"target\": \"com.amazonaws.dynamodb#BackupInUseException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#BackupNotFoundException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#InvalidEndpointException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#LimitExceededException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#TableAlreadyExistsException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#TableInUseException\"\n        }\n      ],\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Creates a new table from an existing backup. Any number of users can execute up to 4 concurrent restores\\n        (any type of restore) in a given account.\\n      </p>\\n         <p>You can call <code>RestoreTableFromBackup</code> at a maximum rate of 10 times per second.</p>\\n         <p>You must manually set up the following on the restored table:</p>\\n         <ul>\\n            <li>\\n                 <p>Auto scaling policies</p>\\n             </li>\\n            <li>\\n                 <p>IAM policies</p>\\n             </li>\\n            <li>\\n                 <p>Amazon CloudWatch metrics and alarms</p>\\n             </li>\\n            <li>\\n                 <p>Tags</p>\\n             </li>\\n            <li>\\n                 <p>Stream settings</p>\\n             </li>\\n            <li>\\n                 <p>Time to Live (TTL) settings</p>\\n             </li>\\n         </ul>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#RestoreTableFromBackupInput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"TargetTableName\": {\n          \"target\": \"com.amazonaws.dynamodb#TableName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the new table to which the backup must be restored.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"BackupArn\": {\n          \"target\": \"com.amazonaws.dynamodb#BackupArn\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) associated with the backup.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"BillingModeOverride\": {\n          \"target\": \"com.amazonaws.dynamodb#BillingMode\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The billing mode of the restored table.</p>\"\n          }\n        },\n        \"GlobalSecondaryIndexOverride\": {\n          \"target\": \"com.amazonaws.dynamodb#GlobalSecondaryIndexList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>List of global secondary indexes for the restored table. The indexes\\n        provided should match existing secondary indexes. You can choose to exclude\\n        some or all of the indexes at the time of restore.</p>\"\n          }\n        },\n        \"LocalSecondaryIndexOverride\": {\n          \"target\": \"com.amazonaws.dynamodb#LocalSecondaryIndexList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>List of local secondary indexes for the restored table. The indexes\\n        provided should match existing secondary indexes. You can choose to exclude\\n        some or all of the indexes at the time of restore.</p>\"\n          }\n        },\n        \"ProvisionedThroughputOverride\": {\n          \"target\": \"com.amazonaws.dynamodb#ProvisionedThroughput\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Provisioned throughput settings for the restored table.</p>\"\n          }\n        },\n        \"SSESpecificationOverride\": {\n          \"target\": \"com.amazonaws.dynamodb#SSESpecification\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The new server-side encryption settings for the restored table.</p>\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#RestoreTableFromBackupOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"TableDescription\": {\n          \"target\": \"com.amazonaws.dynamodb#TableDescription\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The description of the table created from an existing backup.</p>\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#RestoreTableToPointInTime\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.dynamodb#RestoreTableToPointInTimeInput\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.dynamodb#RestoreTableToPointInTimeOutput\"\n      },\n      \"errors\": [\n        {\n          \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#InvalidEndpointException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#InvalidRestoreTimeException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#LimitExceededException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#PointInTimeRecoveryUnavailableException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#TableAlreadyExistsException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#TableInUseException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#TableNotFoundException\"\n        }\n      ],\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Restores the specified table to the specified point in time within\\n        <code>EarliestRestorableDateTime</code> and <code>LatestRestorableDateTime</code>.\\n        You can restore your table to any point in time during the last 35 days.\\n        Any number of users can execute up to 4 concurrent restores (any type of restore) in a given account.\\n      </p>\\n         <p>\\n     When you restore using point in time recovery, DynamoDB restores your table data to the state based on\\n     the selected date and time (day:hour:minute:second) to a new table.\\n     </p>\\n         <p>\\n    Along with data, the following are also included on the new restored table using point in time recovery:\\n    </p>\\n        <ul>\\n            <li>\\n                 <p>Global secondary indexes (GSIs)</p>\\n             </li>\\n            <li>\\n                 <p>Local secondary indexes (LSIs)</p>\\n             </li>\\n            <li>\\n                 <p>Provisioned read and write capacity</p>\\n             </li>\\n            <li>\\n                 <p>Encryption settings</p>\\n               <important>\\n                  <p>\\n                 All these settings come from the current settings of the source table at the time of restore.\\n             </p>\\n               </important>\\n             </li>\\n         </ul>\\n\\n           <p>You must manually set up the following on the restored table:</p>\\n         <ul>\\n            <li>\\n                 <p>Auto scaling policies</p>\\n             </li>\\n            <li>\\n                 <p>IAM policies</p>\\n             </li>\\n            <li>\\n                 <p>Amazon CloudWatch metrics and alarms</p>\\n             </li>\\n            <li>\\n                 <p>Tags</p>\\n             </li>\\n            <li>\\n                 <p>Stream settings</p>\\n             </li>\\n            <li>\\n                 <p>Time to Live (TTL) settings</p>\\n             </li>\\n            <li>\\n                 <p>Point in time recovery settings</p>\\n             </li>\\n         </ul>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#RestoreTableToPointInTimeInput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"SourceTableArn\": {\n          \"target\": \"com.amazonaws.dynamodb#TableArn\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The DynamoDB table that will be restored. This value is an Amazon\\n            Resource Name (ARN).</p>\"\n          }\n        },\n        \"SourceTableName\": {\n          \"target\": \"com.amazonaws.dynamodb#TableName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Name of the source table that is being restored.</p>\"\n          }\n        },\n        \"TargetTableName\": {\n          \"target\": \"com.amazonaws.dynamodb#TableName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the new table to which it must be restored to.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"UseLatestRestorableTime\": {\n          \"target\": \"com.amazonaws.dynamodb#BooleanObject\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Restore the table to the latest possible time. <code>LatestRestorableDateTime</code>\\n        is typically 5 minutes before the current time. </p>\"\n          }\n        },\n        \"RestoreDateTime\": {\n          \"target\": \"com.amazonaws.dynamodb#Date\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Time in the past to restore the table to.</p>\"\n          }\n        },\n        \"BillingModeOverride\": {\n          \"target\": \"com.amazonaws.dynamodb#BillingMode\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The billing mode of the restored table.</p>\"\n          }\n        },\n        \"GlobalSecondaryIndexOverride\": {\n          \"target\": \"com.amazonaws.dynamodb#GlobalSecondaryIndexList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>List of global secondary indexes for the restored table. The indexes\\n        provided should match existing secondary indexes. You can choose to exclude\\n        some or all of the indexes at the time of restore.</p>\"\n          }\n        },\n        \"LocalSecondaryIndexOverride\": {\n          \"target\": \"com.amazonaws.dynamodb#LocalSecondaryIndexList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>List of local secondary indexes for the restored table. The indexes\\n        provided should match existing secondary indexes. You can choose to exclude\\n        some or all of the indexes at the time of restore.</p>\"\n          }\n        },\n        \"ProvisionedThroughputOverride\": {\n          \"target\": \"com.amazonaws.dynamodb#ProvisionedThroughput\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Provisioned throughput settings for the restored table.</p>\"\n          }\n        },\n        \"SSESpecificationOverride\": {\n          \"target\": \"com.amazonaws.dynamodb#SSESpecification\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The new server-side encryption settings for the restored table.</p>\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#RestoreTableToPointInTimeOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"TableDescription\": {\n          \"target\": \"com.amazonaws.dynamodb#TableDescription\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Represents the properties of a table.</p>\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#ReturnConsumedCapacity\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Determines the level of detail about provisioned throughput consumption that is returned in the response:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>INDEXES</code> - The response includes the aggregate <code>ConsumedCapacity</code> for the operation, together with <code>ConsumedCapacity</code> for each table and secondary index that was accessed.</p>\\n               <p>Note that some operations, such as <code>GetItem</code> and <code>BatchGetItem</code>, do not access any indexes at all.  In these cases, specifying <code>INDEXES</code> will only return <code>ConsumedCapacity</code> information for table(s).</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>TOTAL</code> - The response includes only the aggregate <code>ConsumedCapacity</code> for the operation.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>NONE</code> - No <code>ConsumedCapacity</code> details are included in the response.</p>\\n            </li>\\n         </ul>\",\n        \"smithy.api#enum\": [\n          {\n            \"value\": \"INDEXES\",\n            \"name\": \"INDEXES\"\n          },\n          {\n            \"value\": \"TOTAL\",\n            \"name\": \"TOTAL\"\n          },\n          {\n            \"value\": \"NONE\",\n            \"name\": \"NONE\"\n          }\n        ]\n      }\n    },\n    \"com.amazonaws.dynamodb#ReturnItemCollectionMetrics\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#enum\": [\n          {\n            \"value\": \"SIZE\",\n            \"name\": \"SIZE\"\n          },\n          {\n            \"value\": \"NONE\",\n            \"name\": \"NONE\"\n          }\n        ]\n      }\n    },\n    \"com.amazonaws.dynamodb#ReturnValue\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#enum\": [\n          {\n            \"value\": \"NONE\",\n            \"name\": \"NONE\"\n          },\n          {\n            \"value\": \"ALL_OLD\",\n            \"name\": \"ALL_OLD\"\n          },\n          {\n            \"value\": \"UPDATED_OLD\",\n            \"name\": \"UPDATED_OLD\"\n          },\n          {\n            \"value\": \"ALL_NEW\",\n            \"name\": \"ALL_NEW\"\n          },\n          {\n            \"value\": \"UPDATED_NEW\",\n            \"name\": \"UPDATED_NEW\"\n          }\n        ]\n      }\n    },\n    \"com.amazonaws.dynamodb#ReturnValuesOnConditionCheckFailure\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#enum\": [\n          {\n            \"value\": \"ALL_OLD\",\n            \"name\": \"ALL_OLD\"\n          },\n          {\n            \"value\": \"NONE\",\n            \"name\": \"NONE\"\n          }\n        ]\n      }\n    },\n    \"com.amazonaws.dynamodb#S3Bucket\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.dynamodb#S3BucketOwner\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.dynamodb#S3Prefix\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.dynamodb#S3SseAlgorithm\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#enum\": [\n          {\n            \"value\": \"AES256\",\n            \"name\": \"AES256\"\n          },\n          {\n            \"value\": \"KMS\",\n            \"name\": \"KMS\"\n          }\n        ]\n      }\n    },\n    \"com.amazonaws.dynamodb#S3SseKmsKeyId\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#length\": {\n          \"min\": 1,\n          \"max\": 2048\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#SSEDescription\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Status\": {\n          \"target\": \"com.amazonaws.dynamodb#SSEStatus\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Represents the current state of server-side encryption. The only supported values are:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>ENABLED</code> - Server-side encryption is enabled.</p>\\n            </li>\\n            <li>\\n              <p>\\n                  <code>UPDATING</code> - Server-side encryption is being updated.</p>\\n            </li>\\n         </ul>\"\n          }\n        },\n        \"SSEType\": {\n          \"target\": \"com.amazonaws.dynamodb#SSEType\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Server-side encryption type. The only supported value is:</p>\\n         <ul>\\n            <li>\\n              <p>\\n                  <code>KMS</code> - Server-side encryption that uses AWS Key Management Service. The\\n               key is stored in your account and is managed by AWS KMS (AWS KMS charges\\n               apply).</p>\\n            </li>\\n         </ul>\"\n          }\n        },\n        \"KMSMasterKeyArn\": {\n          \"target\": \"com.amazonaws.dynamodb#KMSMasterKeyArn\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The AWS KMS customer master key (CMK) ARN used for the AWS KMS encryption.</p>\"\n          }\n        },\n        \"InaccessibleEncryptionDateTime\": {\n          \"target\": \"com.amazonaws.dynamodb#Date\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Indicates the time, in UNIX epoch date format, when DynamoDB detected that the table's\\n         AWS KMS key was inaccessible. This attribute will automatically be cleared when DynamoDB\\n         detects that the table's AWS KMS key is accessible again. DynamoDB will initiate the table\\n         archival process when table's AWS KMS key remains inaccessible for more than seven days\\n         from this date.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>The description of the server-side encryption status on the specified table.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#SSEEnabled\": {\n      \"type\": \"boolean\",\n      \"traits\": {\n        \"smithy.api#box\": {}\n      }\n    },\n    \"com.amazonaws.dynamodb#SSESpecification\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Enabled\": {\n          \"target\": \"com.amazonaws.dynamodb#SSEEnabled\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Indicates whether server-side encryption is done using an AWS managed CMK or an AWS owned CMK. If enabled (true),\\n      server-side encryption type is set to <code>KMS</code> and an AWS managed CMK is used (AWS KMS charges apply). If disabled (false) or not specified, server-side\\nencryption is set to AWS owned CMK.</p>\"\n          }\n        },\n        \"SSEType\": {\n          \"target\": \"com.amazonaws.dynamodb#SSEType\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Server-side encryption type. The only supported value is:</p>\\n         <ul>\\n            <li>\\n              <p>\\n                  <code>KMS</code> - Server-side encryption that uses AWS Key Management Service. The\\n               key is stored in your account and is managed by AWS KMS (AWS KMS charges\\n               apply).</p>\\n            </li>\\n         </ul>\"\n          }\n        },\n        \"KMSMasterKeyId\": {\n          \"target\": \"com.amazonaws.dynamodb#KMSMasterKeyId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The AWS KMS customer master key (CMK) that should be used for the AWS KMS encryption. To\\n         specify a CMK, use its key ID, Amazon Resource Name (ARN), alias name, or alias ARN. Note\\n         that you should only provide this parameter if the key is different from the default\\n         DynamoDB customer master key alias/aws/dynamodb.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents the settings used to enable server-side encryption.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#SSEStatus\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#enum\": [\n          {\n            \"value\": \"ENABLING\",\n            \"name\": \"ENABLING\"\n          },\n          {\n            \"value\": \"ENABLED\",\n            \"name\": \"ENABLED\"\n          },\n          {\n            \"value\": \"DISABLING\",\n            \"name\": \"DISABLING\"\n          },\n          {\n            \"value\": \"DISABLED\",\n            \"name\": \"DISABLED\"\n          },\n          {\n            \"value\": \"UPDATING\",\n            \"name\": \"UPDATING\"\n          }\n        ]\n      }\n    },\n    \"com.amazonaws.dynamodb#SSEType\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#enum\": [\n          {\n            \"value\": \"AES256\",\n            \"name\": \"AES256\"\n          },\n          {\n            \"value\": \"KMS\",\n            \"name\": \"KMS\"\n          }\n        ]\n      }\n    },\n    \"com.amazonaws.dynamodb#ScalarAttributeType\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#enum\": [\n          {\n            \"value\": \"S\",\n            \"name\": \"S\"\n          },\n          {\n            \"value\": \"N\",\n            \"name\": \"N\"\n          },\n          {\n            \"value\": \"B\",\n            \"name\": \"B\"\n          }\n        ]\n      }\n    },\n    \"com.amazonaws.dynamodb#Scan\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.dynamodb#ScanInput\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.dynamodb#ScanOutput\"\n      },\n      \"errors\": [\n        {\n          \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#InvalidEndpointException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#ProvisionedThroughputExceededException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#RequestLimitExceeded\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#ResourceNotFoundException\"\n        }\n      ],\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>The <code>Scan</code> operation returns one or more items and item attributes by accessing every\\n      item in a table or a secondary index. To have DynamoDB return fewer items, you can provide a <code>FilterExpression</code> operation.</p>\\n         <p>If the total number of scanned items exceeds the maximum dataset size limit of 1 MB, the\\n            scan stops and results are returned to the user as a <code>LastEvaluatedKey</code> value\\n            to continue the scan in a subsequent operation. The results also include the number of\\n            items exceeding the limit. A scan can result in no table data meeting the filter\\n            criteria. </p>\\n         <p>A single <code>Scan</code> operation reads up to the maximum number of items set (if\\n            using the <code>Limit</code> parameter) or a maximum of 1 MB of data and then apply any\\n            filtering to the results using <code>FilterExpression</code>. If\\n                <code>LastEvaluatedKey</code> is present in the response, you need to paginate the\\n            result set. For more information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Scan.html#Scan.Pagination\\\">Paginating the\\n                Results</a> in the <i>Amazon DynamoDB Developer Guide</i>. </p>\\n         <p>\\n            <code>Scan</code> operations proceed sequentially; however, for faster performance on\\n            a large table or secondary index, applications can request a parallel <code>Scan</code>\\n            operation by providing the <code>Segment</code> and <code>TotalSegments</code>\\n            parameters. For more information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Scan.html#Scan.ParallelScan\\\">Parallel\\n                Scan</a> in the <i>Amazon DynamoDB Developer Guide</i>.</p>\\n         <p>\\n            <code>Scan</code> uses eventually consistent reads when accessing the data in a\\n            table; therefore, the result set might not include the changes to data in the table\\n            immediately before the operation began. If you need a consistent copy of the data, as of\\n            the time that the <code>Scan</code> begins, you can set the <code>ConsistentRead</code>\\n            parameter to <code>true</code>.</p>\",\n        \"smithy.api#paginated\": {\n          \"inputToken\": \"ExclusiveStartKey\",\n          \"outputToken\": \"LastEvaluatedKey\",\n          \"items\": \"Items\",\n          \"pageSize\": \"Limit\"\n        },\n        \"smithy.api#suppress\": [\n          \"PaginatedTrait\"\n        ]\n      }\n    },\n    \"com.amazonaws.dynamodb#ScanInput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"TableName\": {\n          \"target\": \"com.amazonaws.dynamodb#TableName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the table containing the requested items; or, if you provide\\n            <code>IndexName</code>, the name of the table to which that index belongs.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"IndexName\": {\n          \"target\": \"com.amazonaws.dynamodb#IndexName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of a secondary index to scan. This index can be any local secondary index or global secondary index.  Note that if you use the <code>IndexName</code> parameter, you must also provide <code>TableName</code>.</p>\"\n          }\n        },\n        \"AttributesToGet\": {\n          \"target\": \"com.amazonaws.dynamodb#AttributeNameList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>This is a legacy parameter.  Use <code>ProjectionExpression</code> instead.  For more information, see\\n          <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/LegacyConditionalParameters.AttributesToGet.html\\\">AttributesToGet</a> in the <i>Amazon DynamoDB Developer Guide</i>.</p>\"\n          }\n        },\n        \"Limit\": {\n          \"target\": \"com.amazonaws.dynamodb#PositiveIntegerObject\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The maximum number of items to evaluate (not necessarily the number of matching items).\\n            If DynamoDB processes the number of items up to the limit while processing the results,\\n            it stops the operation and returns the matching values up to that point, and a key in\\n                <code>LastEvaluatedKey</code> to apply in a subsequent operation, so that you can\\n            pick up where you left off. Also, if the processed dataset size exceeds 1 MB before\\n            DynamoDB reaches this limit, it stops the operation and returns the matching values up\\n            to the limit, and a key in <code>LastEvaluatedKey</code> to apply in a subsequent\\n            operation to continue the operation. For more information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/QueryAndScan.html\\\">Working with Queries</a> in the <i>Amazon DynamoDB Developer\\n                Guide</i>.</p>\"\n          }\n        },\n        \"Select\": {\n          \"target\": \"com.amazonaws.dynamodb#Select\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The attributes to be returned in the\\n            result. You can retrieve all item attributes, specific item attributes, the count of\\n            matching items, or in the case of an index, some or all of the attributes projected into\\n            the index.</p>\\n         <ul>\\n            <li>\\n              <p>\\n                    <code>ALL_ATTRIBUTES</code> - Returns all of the item attributes from the\\n                    specified table or index. If you query a local secondary index, then for each\\n                    matching item in the index, DynamoDB fetches the entire item from the parent\\n                    table. If the index is configured to project all item attributes, then all of\\n                    the data can be obtained from the local secondary index, and no fetching is\\n                    required.</p>\\n            </li>\\n            <li>\\n              <p>\\n                  <code>ALL_PROJECTED_ATTRIBUTES</code> - Allowed only when querying an index.\\n                  Retrieves all attributes that have been projected into the index. If the\\n                  index is configured to project all attributes, this return value is\\n                  equivalent to specifying <code>ALL_ATTRIBUTES</code>.</p>\\n            </li>\\n            <li>\\n              <p>\\n                  <code>COUNT</code> - Returns the number of matching items, rather than the\\n                  matching items themselves.</p>\\n            </li>\\n            <li>\\n              <p>\\n                  <code>SPECIFIC_ATTRIBUTES</code> - Returns only the attributes listed in\\n                  <code>AttributesToGet</code>. This return value is equivalent to\\n                  specifying <code>AttributesToGet</code> without specifying any value\\n                  for <code>Select</code>.</p>\\n              <p>If you query or scan a local secondary index and request only attributes that\\n                    are projected into that index, the operation reads only the index and not the\\n                    table. If any of the requested attributes are not projected into the local\\n                    secondary index, DynamoDB fetches each of these attributes from the parent\\n                    table. This extra fetching incurs additional throughput cost and latency.</p>\\n              <p>If you query or scan a global secondary index, you can only request\\n                  attributes that are projected into the index. Global secondary index queries\\n                  cannot fetch attributes from the parent table.</p>\\n            </li>\\n         </ul>\\n         <p>If neither <code>Select</code> nor <code>AttributesToGet</code>\\n          are specified, DynamoDB defaults to <code>ALL_ATTRIBUTES</code> when accessing a\\n          table, and <code>ALL_PROJECTED_ATTRIBUTES</code> when accessing an index. You cannot\\n          use both <code>Select</code> and <code>AttributesToGet</code>\\n          together in a single request, unless the value for <code>Select</code> is\\n          <code>SPECIFIC_ATTRIBUTES</code>. (This usage is equivalent to specifying\\n          <code>AttributesToGet</code> without any value for\\n          <code>Select</code>.)</p>\\n         <note>\\n            <p>If you use the <code>ProjectionExpression</code> parameter, then\\n              the value for <code>Select</code> can only be\\n              <code>SPECIFIC_ATTRIBUTES</code>. Any other value for\\n              <code>Select</code> will return an error.</p>\\n         </note>\"\n          }\n        },\n        \"ScanFilter\": {\n          \"target\": \"com.amazonaws.dynamodb#FilterConditionMap\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>This is a legacy parameter.  Use <code>FilterExpression</code> instead.   For more information, see\\n          <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/LegacyConditionalParameters.ScanFilter.html\\\">ScanFilter</a> in the <i>Amazon DynamoDB Developer Guide</i>.</p>\"\n          }\n        },\n        \"ConditionalOperator\": {\n          \"target\": \"com.amazonaws.dynamodb#ConditionalOperator\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>This is a legacy parameter.  Use <code>FilterExpression</code> instead.   For more information, see\\n          <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/LegacyConditionalParameters.ConditionalOperator.html\\\">ConditionalOperator</a> in the <i>Amazon DynamoDB Developer Guide</i>.</p>\"\n          }\n        },\n        \"ExclusiveStartKey\": {\n          \"target\": \"com.amazonaws.dynamodb#Key\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The primary key of the first item that this operation will evaluate. Use the value that was returned for <code>LastEvaluatedKey</code> in the previous operation.</p>\\n         <p>The data type for <code>ExclusiveStartKey</code> must be String, Number or Binary. No set data types are allowed.</p>\\n         <p>In a parallel scan, a\\n        <code>Scan</code> request that includes <code>ExclusiveStartKey</code> must specify the same segment\\n      whose previous <code>Scan</code> returned the corresponding value of <code>LastEvaluatedKey</code>.</p>\"\n          }\n        },\n        \"ReturnConsumedCapacity\": {\n          \"target\": \"com.amazonaws.dynamodb#ReturnConsumedCapacity\"\n        },\n        \"TotalSegments\": {\n          \"target\": \"com.amazonaws.dynamodb#ScanTotalSegments\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>For a parallel <code>Scan</code> request, <code>TotalSegments</code> represents the total number of\\n      segments into which the <code>Scan</code> operation will be divided. The value of\\n        <code>TotalSegments</code> corresponds to the number of application workers that will perform the\\n      parallel scan. For example, if you want to use four application threads to scan a table or an index,\\n      specify a <code>TotalSegments</code> value of 4.</p>\\n         <p>The value for <code>TotalSegments</code> must be greater than or equal to 1, and less than or equal\\n      to 1000000. If you specify a <code>TotalSegments</code> value of 1, the <code>Scan</code> operation will\\n      be sequential rather than parallel.</p>\\n         <p>If you specify <code>TotalSegments</code>, you must also specify <code>Segment</code>.</p>\"\n          }\n        },\n        \"Segment\": {\n          \"target\": \"com.amazonaws.dynamodb#ScanSegment\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>For a parallel <code>Scan</code> request, <code>Segment</code> identifies an individual segment to be\\n      scanned by an application worker.</p>\\n         <p>Segment IDs are zero-based, so the first segment is always 0. For example, if you want to\\n      use four application threads to scan a table or an index, then the first thread specifies a <code>Segment</code> value\\n      of 0, the second thread specifies 1, and so on.</p>\\n         <p>The value of <code>LastEvaluatedKey</code> returned from a parallel <code>Scan</code> request must be\\n      used as <code>ExclusiveStartKey</code> with the same segment ID in a subsequent <code>Scan</code>\\n      operation.</p>\\n         <p>The value for <code>Segment</code> must be greater than or equal to 0, and less than the value\\n      provided for <code>TotalSegments</code>.</p>\\n         <p>If you provide <code>Segment</code>, you must also provide <code>TotalSegments</code>.</p>\"\n          }\n        },\n        \"ProjectionExpression\": {\n          \"target\": \"com.amazonaws.dynamodb#ProjectionExpression\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A string that identifies one or more attributes to retrieve from the specified table or index. These attributes can include scalars, sets, or elements of a JSON document. The attributes in the expression must be separated by commas.</p>\\n         <p>If no attribute names are specified, then all attributes will be returned. If any of the requested attributes are not found, they will not appear in the result.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.AccessingItemAttributes.html\\\">Specifying Item Attributes</a> in the <i>Amazon DynamoDB Developer\\n                Guide</i>.</p>\"\n          }\n        },\n        \"FilterExpression\": {\n          \"target\": \"com.amazonaws.dynamodb#ConditionExpression\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A string that contains conditions that DynamoDB applies after the <code>Scan</code> operation, but\\n       before the data is returned to you. Items that do not satisfy the <code>FilterExpression</code>\\n       criteria are not returned.</p>\\n         <note>\\n            <p>A <code>FilterExpression</code> is applied after the items have already been read; the process of\\n         filtering does not consume any additional read capacity units.</p>\\n         </note>\\n         <p>For more information, see\\n       <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/QueryAndScan.html#FilteringResults\\\">Filter Expressions</a> in the <i>Amazon DynamoDB Developer Guide</i>.</p>\"\n          }\n        },\n        \"ExpressionAttributeNames\": {\n          \"target\": \"com.amazonaws.dynamodb#ExpressionAttributeNameMap\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>One or more substitution tokens for attribute names in an expression. The following are some use cases for using <code>ExpressionAttributeNames</code>:</p>\\n         <ul>\\n            <li>\\n               <p>To access an attribute whose name conflicts with a DynamoDB reserved word.</p>\\n            </li>\\n            <li>\\n               <p>To create a placeholder for repeating occurrences of an attribute name in an expression.</p>\\n            </li>\\n            <li>\\n               <p>To prevent special characters in an attribute name from being misinterpreted in an expression.</p>\\n            </li>\\n         </ul>\\n         <p>Use the <b>#</b> character in an expression to dereference an attribute name. For example, consider the following attribute name:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>Percentile</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>The name of this attribute conflicts with a reserved word, so it cannot be used directly in an expression. (For the complete list of reserved words, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ReservedWords.html\\\">Reserved Words</a> in the <i>Amazon DynamoDB Developer Guide</i>). To work around this, you could specify the following for <code>ExpressionAttributeNames</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>{\\\"#P\\\":\\\"Percentile\\\"}</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>You could then use this substitution in an expression, as in this example:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>#P = :val</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <note>\\n            <p>Tokens that begin with the <b>:</b> character are <i>expression attribute values</i>, which are placeholders for the actual value at runtime.</p>\\n         </note>\\n         <p>For more information on expression attribute names, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.AccessingItemAttributes.html\\\">Specifying Item Attributes</a> in the <i>Amazon DynamoDB Developer\\n                Guide</i>.</p>\"\n          }\n        },\n        \"ExpressionAttributeValues\": {\n          \"target\": \"com.amazonaws.dynamodb#ExpressionAttributeValueMap\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>One or more values that can be substituted in an expression.</p>\\n         <p>Use the <b>:</b> (colon) character in an expression to\\n            dereference an attribute value. For example, suppose that you wanted to check whether\\n            the value of the <code>ProductStatus</code> attribute was one of the following: </p>\\n         <p>\\n            <code>Available | Backordered | Discontinued</code>\\n         </p>\\n         <p>You would first need to specify <code>ExpressionAttributeValues</code> as follows:</p>\\n         <p>\\n            <code>{ \\\":avail\\\":{\\\"S\\\":\\\"Available\\\"}, \\\":back\\\":{\\\"S\\\":\\\"Backordered\\\"}, \\\":disc\\\":{\\\"S\\\":\\\"Discontinued\\\"} }</code>\\n         </p>\\n         <p>You could then use these values in an expression, such as this:</p>\\n         <p>\\n            <code>ProductStatus IN (:avail, :back, :disc)</code>\\n         </p>\\n        <p>For more information on expression attribute values, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.SpecifyingConditions.html\\\">Condition Expressions</a> in the <i>Amazon DynamoDB Developer\\n                Guide</i>.</p>\"\n          }\n        },\n        \"ConsistentRead\": {\n          \"target\": \"com.amazonaws.dynamodb#ConsistentRead\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A Boolean value that determines the read consistency model during the scan:</p>\\n         <ul>\\n            <li>\\n               <p>If <code>ConsistentRead</code> is <code>false</code>, then the data returned from\\n                        <code>Scan</code> might not contain the results from other recently\\n                    completed write operations (<code>PutItem</code>, <code>UpdateItem</code>, or\\n                        <code>DeleteItem</code>).</p>\\n            </li>\\n            <li>\\n               <p>If <code>ConsistentRead</code> is <code>true</code>, then all of the write operations that completed before the <code>Scan</code> began are guaranteed to be contained in the <code>Scan</code> response.</p>\\n            </li>\\n         </ul>\\n         <p>The default setting for <code>ConsistentRead</code> is <code>false</code>.</p>\\n         <p>The <code>ConsistentRead</code> parameter is not supported on global secondary indexes. If you scan a global secondary index with <code>ConsistentRead</code> set to true, you will receive a <code>ValidationException</code>.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents the input of a <code>Scan</code> operation.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#ScanOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Items\": {\n          \"target\": \"com.amazonaws.dynamodb#ItemList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>An array of item attributes that match the scan criteria. Each element in this array consists of an attribute name and the value for that attribute.</p>\"\n          }\n        },\n        \"Count\": {\n          \"target\": \"com.amazonaws.dynamodb#Integer\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The number of items in the response.</p>\\n         <p>If you set <code>ScanFilter</code> in the request, then <code>Count</code> is the number of items\\n      returned after the filter was applied, and <code>ScannedCount</code> is the number of matching items\\n      before the filter was applied.</p>\\n         <p>If you did not use a filter in the request, then <code>Count</code> is the same as\\n        <code>ScannedCount</code>.</p>\"\n          }\n        },\n        \"ScannedCount\": {\n          \"target\": \"com.amazonaws.dynamodb#Integer\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The number of items evaluated, before any <code>ScanFilter</code> is applied. A high\\n        <code>ScannedCount</code> value with few, or no, <code>Count</code> results indicates an inefficient\\n        <code>Scan</code> operation. For more information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/QueryAndScan.html#Count\\\">Count and ScannedCount</a> in the\\n        <i>Amazon DynamoDB Developer Guide</i>.</p>\\n         <p>If you did not use a filter in the request, then <code>ScannedCount</code> is the same as\\n        <code>Count</code>.</p>\"\n          }\n        },\n        \"LastEvaluatedKey\": {\n          \"target\": \"com.amazonaws.dynamodb#Key\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The primary key of the item where the operation stopped, inclusive of the previous\\n            result set. Use this value to start a new operation, excluding this value in the new\\n            request.</p>\\n        <p>If <code>LastEvaluatedKey</code> is empty, then the \\\"last page\\\" of results\\n            has been processed and there is no more data to be retrieved.</p>\\n        <p>If <code>LastEvaluatedKey</code> is not empty, it does not necessarily mean\\n            that there is more data in the result set. The only way to know when you have reached\\n            the end of the result set is when <code>LastEvaluatedKey</code> is\\n            empty.</p>\"\n          }\n        },\n        \"ConsumedCapacity\": {\n          \"target\": \"com.amazonaws.dynamodb#ConsumedCapacity\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The capacity units consumed by the <code>Scan</code> operation. The data returned includes the total\\n            provisioned throughput consumed, along with statistics for the table and any indexes involved\\n            in the operation. <code>ConsumedCapacity</code> is only returned if the <code>ReturnConsumedCapacity</code> parameter was specified.\\n            For more information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ProvisionedThroughputIntro.html\\\">Provisioned\\n                Throughput</a> in the <i>Amazon DynamoDB Developer Guide</i>.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents the output of a <code>Scan</code> operation.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#ScanSegment\": {\n      \"type\": \"integer\",\n      \"traits\": {\n        \"smithy.api#box\": {},\n        \"smithy.api#range\": {\n          \"min\": 0,\n          \"max\": 999999\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#ScanTotalSegments\": {\n      \"type\": \"integer\",\n      \"traits\": {\n        \"smithy.api#box\": {},\n        \"smithy.api#range\": {\n          \"min\": 1,\n          \"max\": 1000000\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#SecondaryIndexesCapacityMap\": {\n      \"type\": \"map\",\n      \"key\": {\n        \"target\": \"com.amazonaws.dynamodb#IndexName\"\n      },\n      \"value\": {\n        \"target\": \"com.amazonaws.dynamodb#Capacity\"\n      }\n    },\n    \"com.amazonaws.dynamodb#Select\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#enum\": [\n          {\n            \"value\": \"ALL_ATTRIBUTES\",\n            \"name\": \"ALL_ATTRIBUTES\"\n          },\n          {\n            \"value\": \"ALL_PROJECTED_ATTRIBUTES\",\n            \"name\": \"ALL_PROJECTED_ATTRIBUTES\"\n          },\n          {\n            \"value\": \"SPECIFIC_ATTRIBUTES\",\n            \"name\": \"SPECIFIC_ATTRIBUTES\"\n          },\n          {\n            \"value\": \"COUNT\",\n            \"name\": \"COUNT\"\n          }\n        ]\n      }\n    },\n    \"com.amazonaws.dynamodb#SourceTableDetails\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"TableName\": {\n          \"target\": \"com.amazonaws.dynamodb#TableName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the table for which the backup was created. </p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"TableId\": {\n          \"target\": \"com.amazonaws.dynamodb#TableId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Unique identifier for the table for which the backup was created. </p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"TableArn\": {\n          \"target\": \"com.amazonaws.dynamodb#TableArn\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>ARN of the table for which backup was created. </p>\"\n          }\n        },\n        \"TableSizeBytes\": {\n          \"target\": \"com.amazonaws.dynamodb#Long\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Size of the table in bytes. Note that this is an approximate value.</p>\"\n          }\n        },\n        \"KeySchema\": {\n          \"target\": \"com.amazonaws.dynamodb#KeySchema\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Schema of the table. </p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"TableCreationDateTime\": {\n          \"target\": \"com.amazonaws.dynamodb#TableCreationDateTime\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Time when the source table was created. </p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"ProvisionedThroughput\": {\n          \"target\": \"com.amazonaws.dynamodb#ProvisionedThroughput\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Read IOPs and Write IOPS on the table when the backup was created.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"ItemCount\": {\n          \"target\": \"com.amazonaws.dynamodb#ItemCount\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Number of items in the table. Note that this is an approximate value. </p>\"\n          }\n        },\n        \"BillingMode\": {\n          \"target\": \"com.amazonaws.dynamodb#BillingMode\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Controls how you are charged for read and write throughput and how you manage capacity. This setting can be changed later.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>PROVISIONED</code> - Sets the read/write capacity mode to <code>PROVISIONED</code>. We recommend using <code>PROVISIONED</code> for predictable workloads.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>PAY_PER_REQUEST</code> - Sets the read/write capacity mode to <code>PAY_PER_REQUEST</code>. We recommend using <code>PAY_PER_REQUEST</code> for unpredictable workloads.\\n            </p>\\n            </li>\\n         </ul>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Contains the details of the table when the backup was created. </p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#SourceTableFeatureDetails\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"LocalSecondaryIndexes\": {\n          \"target\": \"com.amazonaws.dynamodb#LocalSecondaryIndexes\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Represents the LSI properties for the table when the backup was created. It includes the IndexName, KeySchema and Projection for the LSIs on the table at the time of backup. </p>\"\n          }\n        },\n        \"GlobalSecondaryIndexes\": {\n          \"target\": \"com.amazonaws.dynamodb#GlobalSecondaryIndexes\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Represents the GSI properties for the table when the backup was created. It includes the\\n         IndexName, KeySchema, Projection, and ProvisionedThroughput for the GSIs on the table at\\n         the time of backup. </p>\"\n          }\n        },\n        \"StreamDescription\": {\n          \"target\": \"com.amazonaws.dynamodb#StreamSpecification\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Stream settings on the table when the backup was created.</p>\"\n          }\n        },\n        \"TimeToLiveDescription\": {\n          \"target\": \"com.amazonaws.dynamodb#TimeToLiveDescription\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Time to Live settings on the table when the backup was created.</p>\"\n          }\n        },\n        \"SSEDescription\": {\n          \"target\": \"com.amazonaws.dynamodb#SSEDescription\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The description of the server-side encryption status on the table when the backup was created.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Contains the details of the features enabled on the table when the backup was created. For example, LSIs, GSIs, streams, TTL. </p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#StreamArn\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#length\": {\n          \"min\": 37,\n          \"max\": 1024\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#StreamEnabled\": {\n      \"type\": \"boolean\",\n      \"traits\": {\n        \"smithy.api#box\": {}\n      }\n    },\n    \"com.amazonaws.dynamodb#StreamSpecification\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"StreamEnabled\": {\n          \"target\": \"com.amazonaws.dynamodb#StreamEnabled\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Indicates whether DynamoDB Streams is enabled (true) or disabled (false) on the table.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"StreamViewType\": {\n          \"target\": \"com.amazonaws.dynamodb#StreamViewType\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>\\n              When an item in the table is modified, <code>StreamViewType</code>\\n              determines what information is written to the stream for this table. Valid values for\\n            <code>StreamViewType</code> are:</p>\\n            <ul>\\n            <li>\\n                  <p>\\n                     <code>KEYS_ONLY</code> - Only the key attributes of the modified item are written to the stream.</p>\\n               </li>\\n            <li>\\n                  <p>\\n                     <code>NEW_IMAGE</code> - The entire item, as it appears after it was modified, is written\\n              to the stream.</p>\\n               </li>\\n            <li>\\n                  <p>\\n                     <code>OLD_IMAGE</code> - The entire item, as it appeared before it was modified, is\\n              written to the stream.</p>\\n               </li>\\n            <li>\\n                  <p>\\n                     <code>NEW_AND_OLD_IMAGES</code> - Both the new and the old item images of the item are\\n              written to the stream.</p>\\n               </li>\\n         </ul>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents the DynamoDB Streams configuration for a table in DynamoDB.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#StreamViewType\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#enum\": [\n          {\n            \"value\": \"NEW_IMAGE\",\n            \"name\": \"NEW_IMAGE\"\n          },\n          {\n            \"value\": \"OLD_IMAGE\",\n            \"name\": \"OLD_IMAGE\"\n          },\n          {\n            \"value\": \"NEW_AND_OLD_IMAGES\",\n            \"name\": \"NEW_AND_OLD_IMAGES\"\n          },\n          {\n            \"value\": \"KEYS_ONLY\",\n            \"name\": \"KEYS_ONLY\"\n          }\n        ]\n      }\n    },\n    \"com.amazonaws.dynamodb#String\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.dynamodb#StringAttributeValue\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.dynamodb#StringSetAttributeValue\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.dynamodb#StringAttributeValue\"\n      }\n    },\n    \"com.amazonaws.dynamodb#TableAlreadyExistsException\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"message\": {\n          \"target\": \"com.amazonaws.dynamodb#ErrorMessage\"\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>A target table with the specified name already exists. </p>\",\n        \"smithy.api#error\": \"client\"\n      }\n    },\n    \"com.amazonaws.dynamodb#TableArn\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.dynamodb#TableAutoScalingDescription\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"TableName\": {\n          \"target\": \"com.amazonaws.dynamodb#TableName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the table.</p>\"\n          }\n        },\n        \"TableStatus\": {\n          \"target\": \"com.amazonaws.dynamodb#TableStatus\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The current state of the table:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>CREATING</code> - The table is being created.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>UPDATING</code> - The table is being updated.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>DELETING</code> - The table is being deleted.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ACTIVE</code> - The table is ready for use.</p>\\n            </li>\\n         </ul>\"\n          }\n        },\n        \"Replicas\": {\n          \"target\": \"com.amazonaws.dynamodb#ReplicaAutoScalingDescriptionList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Represents replicas of the global table.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents the auto scaling configuration for a global table.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#TableCreationDateTime\": {\n      \"type\": \"timestamp\"\n    },\n    \"com.amazonaws.dynamodb#TableDescription\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"AttributeDefinitions\": {\n          \"target\": \"com.amazonaws.dynamodb#AttributeDefinitions\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>An array of <code>AttributeDefinition</code> objects. Each of these objects describes one attribute\\n      in the table and index key schema.</p>\\n         <p>Each <code>AttributeDefinition</code> object in this array is composed of:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>AttributeName</code> - The name of the attribute.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>AttributeType</code> - The data type for the attribute.</p>\\n            </li>\\n         </ul>\"\n          }\n        },\n        \"TableName\": {\n          \"target\": \"com.amazonaws.dynamodb#TableName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the table.</p>\"\n          }\n        },\n        \"KeySchema\": {\n          \"target\": \"com.amazonaws.dynamodb#KeySchema\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The primary key structure for the table. Each <code>KeySchemaElement</code> consists of:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>AttributeName</code> - The name of the attribute.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>KeyType</code> - The role of the attribute:</p>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <code>HASH</code> -  partition key</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <code>RANGE</code> - sort key</p>\\n                  </li>\\n               </ul>\\n               <note>\\n                  <p>The partition key of an item is also known as its <i>hash attribute</i>.  The\\n        term \\\"hash attribute\\\" derives from DynamoDB's usage of an internal hash function to\\n        evenly distribute data items across partitions, based on their partition key values.</p>\\n                  <p>The sort key of an item is also known as its <i>range attribute</i>.\\n        The term \\\"range attribute\\\" derives from the way DynamoDB stores items with the same\\n        partition key physically close together, in sorted order by the sort key value.</p>\\n               </note>\\n\\n            </li>\\n         </ul>\\n         <p>For more information about primary keys, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/DataModel.html#DataModelPrimaryKey\\\">Primary Key</a> in the\\n      <i>Amazon DynamoDB Developer Guide</i>.</p>\"\n          }\n        },\n        \"TableStatus\": {\n          \"target\": \"com.amazonaws.dynamodb#TableStatus\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The current state of the table:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>CREATING</code> - The table is being created.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>UPDATING</code> - The table is being updated.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>DELETING</code> - The table is being deleted.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ACTIVE</code> - The table is ready for use.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>INACCESSIBLE_ENCRYPTION_CREDENTIALS</code> - The AWS KMS\\n               key used to encrypt the table in inaccessible. Table operations\\n               may fail due to failure to use the AWS KMS key. DynamoDB will\\n               initiate the table archival process when a table's AWS KMS key\\n               remains inaccessible for more than seven days.\\n            </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ARCHIVING</code> - The table is being archived. Operations\\n               are not allowed until archival is complete.\\n            </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ARCHIVED</code> - The table has been archived. See the\\n               ArchivalReason for more information.\\n            </p>\\n            </li>\\n         </ul>\"\n          }\n        },\n        \"CreationDateTime\": {\n          \"target\": \"com.amazonaws.dynamodb#Date\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The date and time when the table was created, in <a href=\\\"http://www.epochconverter.com/\\\">UNIX epoch time</a> format.</p>\"\n          }\n        },\n        \"ProvisionedThroughput\": {\n          \"target\": \"com.amazonaws.dynamodb#ProvisionedThroughputDescription\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The provisioned throughput settings for the table, consisting of read and write capacity units, along with data about increases and decreases.</p>\"\n          }\n        },\n        \"TableSizeBytes\": {\n          \"target\": \"com.amazonaws.dynamodb#Long\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The total size of the specified table, in bytes. DynamoDB updates this value approximately every six hours. Recent changes might not be reflected in this value.</p>\"\n          }\n        },\n        \"ItemCount\": {\n          \"target\": \"com.amazonaws.dynamodb#Long\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The number of items in the specified table. DynamoDB updates this value approximately every six hours. Recent changes might not be reflected in this value.</p>\"\n          }\n        },\n        \"TableArn\": {\n          \"target\": \"com.amazonaws.dynamodb#String\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) that uniquely identifies the table.</p>\"\n          }\n        },\n        \"TableId\": {\n          \"target\": \"com.amazonaws.dynamodb#TableId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Unique identifier for the table for which the backup was created. </p>\"\n          }\n        },\n        \"BillingModeSummary\": {\n          \"target\": \"com.amazonaws.dynamodb#BillingModeSummary\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Contains the details for the read/write capacity mode.</p>\"\n          }\n        },\n        \"LocalSecondaryIndexes\": {\n          \"target\": \"com.amazonaws.dynamodb#LocalSecondaryIndexDescriptionList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Represents one or more local secondary indexes on the table. Each index is scoped to a given partition key value. Tables with one or more local secondary indexes are subject to an item collection size limit, where the amount of data within a given item collection cannot exceed 10 GB. Each element is composed of:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>IndexName</code> - The name of the local secondary index.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>KeySchema</code> - Specifies the complete index key schema. The attribute names in the\\n          key schema must be between 1 and 255 characters (inclusive). The key schema must begin\\n          with the same partition key as the table.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>Projection</code> - Specifies\\n          attributes that are copied (projected) from the table into the index. These are in\\n          addition to the primary key attributes and index key\\n          attributes, which are automatically projected. Each\\n          attribute specification is composed of:</p>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <code>ProjectionType</code> - One\\n              of the following:</p>\\n                     <ul>\\n                        <li>\\n                           <p>\\n                              <code>KEYS_ONLY</code> - Only the index and primary keys are projected into the\\n                  index.</p>\\n                        </li>\\n                        <li>\\n                           <p>\\n                              <code>INCLUDE</code> - Only the specified table attributes are projected\\n                           into the index. The list of projected attributes is in\\n                              <code>NonKeyAttributes</code>.</p>\\n                        </li>\\n                        <li>\\n                           <p>\\n                              <code>ALL</code> - All of the table attributes are projected into the\\n                  index.</p>\\n                        </li>\\n                     </ul>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <code>NonKeyAttributes</code> - A list of one or more non-key attribute names that are\\n              projected into the secondary index. The total count of attributes provided in <code>NonKeyAttributes</code>, summed across all of the secondary indexes, must not exceed 20. If you project the same attribute into two different indexes, this counts as two distinct attributes when determining the total.</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>IndexSizeBytes</code> - Represents the total size of the index, in bytes. DynamoDB updates\\n          this value approximately every six hours. Recent changes might not be reflected in this\\n          value.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ItemCount</code> - Represents the number of items in the index. DynamoDB updates this value\\n          approximately every six hours. Recent changes might not be reflected in this value.</p>\\n            </li>\\n         </ul>\\n         <p>If the table is in the <code>DELETING</code> state, no information about indexes will be\\n      returned.</p>\"\n          }\n        },\n        \"GlobalSecondaryIndexes\": {\n          \"target\": \"com.amazonaws.dynamodb#GlobalSecondaryIndexDescriptionList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The global secondary indexes, if any, on the table. Each index is scoped to a given partition key value. Each element is composed of:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>Backfilling</code> - If true, then the index is currently in the backfilling\\n               phase. Backfilling occurs only when a new global secondary index is added to the\\n               table. It is the process by which DynamoDB populates the new index with data from the\\n               table. (This attribute does not appear for indexes that were created during a\\n                  <code>CreateTable</code> operation.) </p>\\n               <p> You can delete an index that is being created during the <code>Backfilling</code>\\n               phase when <code>IndexStatus</code> is set to CREATING and <code>Backfilling</code>\\n               is true. You can't delete the index that is being created when\\n                  <code>IndexStatus</code> is set to CREATING and <code>Backfilling</code> is false.\\n               (This attribute does not appear for indexes that were created during a\\n                  <code>CreateTable</code> operation.)</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>IndexName</code> - The name of the global secondary index.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>IndexSizeBytes</code> - The total size of the global secondary index, in bytes. DynamoDB updates this value approximately every six\\n      hours. Recent changes might not be reflected in this value.\\n      </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>IndexStatus</code> - The current status of the global secondary index:</p>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <code>CREATING</code> - The index is being created.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <code>UPDATING</code> - The index is being updated.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <code>DELETING</code> - The index is being deleted.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <code>ACTIVE</code> - The index is ready for use.</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ItemCount</code> - The number of items in the global secondary index. DynamoDB updates this value approximately every six\\n      hours. Recent changes might not be reflected in this value.\\n      </p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>KeySchema</code> - Specifies the complete index key schema. The attribute names in the\\n          key schema must be between 1 and 255 characters (inclusive). The key schema must begin\\n          with the same partition key as the table.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>Projection</code> - Specifies\\n          attributes that are copied (projected) from the table into the index. These are in\\n          addition to the primary key attributes and index key\\n          attributes, which are automatically projected. Each\\n          attribute specification is composed of:</p>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <code>ProjectionType</code> - One\\n              of the following:</p>\\n                     <ul>\\n                        <li>\\n                           <p>\\n                              <code>KEYS_ONLY</code> - Only the index and primary keys are projected into the\\n                  index.</p>\\n                        </li>\\n                        <li>\\n                           <p>\\n                              <code>INCLUDE</code> - In addition to the attributes described in <code>KEYS_ONLY</code>, the secondary index will include other non-key attributes that you specify.</p>\\n                        </li>\\n                        <li>\\n                           <p>\\n                              <code>ALL</code> - All of the table attributes are projected into the\\n                  index.</p>\\n                        </li>\\n                     </ul>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <code>NonKeyAttributes</code> - A list of one or more non-key attribute names that are\\n              projected into the secondary index. The total count of attributes provided in <code>NonKeyAttributes</code>, summed across all of the secondary indexes, must not exceed 20. If you project the same attribute into two different indexes, this counts as two distinct attributes when determining the total.</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ProvisionedThroughput</code> - The provisioned throughput settings for the global secondary index,\\n          consisting of read and write capacity units, along with data about increases and\\n          decreases. </p>\\n            </li>\\n         </ul>\\n         <p>If the table is in the <code>DELETING</code> state, no information about indexes will be\\n      returned.</p>\"\n          }\n        },\n        \"StreamSpecification\": {\n          \"target\": \"com.amazonaws.dynamodb#StreamSpecification\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The current DynamoDB Streams configuration for the table.</p>\"\n          }\n        },\n        \"LatestStreamLabel\": {\n          \"target\": \"com.amazonaws.dynamodb#String\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A timestamp, in ISO 8601 format, for this stream.</p>\\n\\n         <p>Note that <code>LatestStreamLabel</code> is not a unique identifier for the stream, because it is possible that a stream from another table might have the same timestamp. However, the combination of the following three elements is guaranteed to be unique:</p>\\n         <ul>\\n            <li>\\n               <p>AWS customer ID</p>\\n            </li>\\n            <li>\\n               <p>Table name</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>StreamLabel</code>\\n               </p>\\n            </li>\\n         </ul>\"\n          }\n        },\n        \"LatestStreamArn\": {\n          \"target\": \"com.amazonaws.dynamodb#StreamArn\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) that uniquely identifies the latest stream for this table.</p>\"\n          }\n        },\n        \"GlobalTableVersion\": {\n          \"target\": \"com.amazonaws.dynamodb#String\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Represents the version of <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GlobalTables.html\\\">global tables</a> in use, if the table is replicated across AWS Regions.</p>\"\n          }\n        },\n        \"Replicas\": {\n          \"target\": \"com.amazonaws.dynamodb#ReplicaDescriptionList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Represents replicas of the table.</p>\"\n          }\n        },\n        \"RestoreSummary\": {\n          \"target\": \"com.amazonaws.dynamodb#RestoreSummary\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Contains details for the restore.</p>\"\n          }\n        },\n        \"SSEDescription\": {\n          \"target\": \"com.amazonaws.dynamodb#SSEDescription\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The description of the server-side encryption status on the specified table.</p>\"\n          }\n        },\n        \"ArchivalSummary\": {\n          \"target\": \"com.amazonaws.dynamodb#ArchivalSummary\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Contains information about the table archive.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents the properties of a table.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#TableId\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#pattern\": \"[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\"\n      }\n    },\n    \"com.amazonaws.dynamodb#TableInUseException\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"message\": {\n          \"target\": \"com.amazonaws.dynamodb#ErrorMessage\"\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>A target table with the specified name is either being created or deleted. </p>\",\n        \"smithy.api#error\": \"client\"\n      }\n    },\n    \"com.amazonaws.dynamodb#TableName\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#length\": {\n          \"min\": 3,\n          \"max\": 255\n        },\n        \"smithy.api#pattern\": \"[a-zA-Z0-9_.-]+\"\n      }\n    },\n    \"com.amazonaws.dynamodb#TableNameList\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.dynamodb#TableName\"\n      }\n    },\n    \"com.amazonaws.dynamodb#TableNotFoundException\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"message\": {\n          \"target\": \"com.amazonaws.dynamodb#ErrorMessage\"\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>A source table with the name <code>TableName</code> does not currently exist within the subscriber's account.</p>\",\n        \"smithy.api#error\": \"client\"\n      }\n    },\n    \"com.amazonaws.dynamodb#TableStatus\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#enum\": [\n          {\n            \"value\": \"CREATING\",\n            \"name\": \"CREATING\"\n          },\n          {\n            \"value\": \"UPDATING\",\n            \"name\": \"UPDATING\"\n          },\n          {\n            \"value\": \"DELETING\",\n            \"name\": \"DELETING\"\n          },\n          {\n            \"value\": \"ACTIVE\",\n            \"name\": \"ACTIVE\"\n          },\n          {\n            \"value\": \"INACCESSIBLE_ENCRYPTION_CREDENTIALS\",\n            \"name\": \"INACCESSIBLE_ENCRYPTION_CREDENTIALS\"\n          },\n          {\n            \"value\": \"ARCHIVING\",\n            \"name\": \"ARCHIVING\"\n          },\n          {\n            \"value\": \"ARCHIVED\",\n            \"name\": \"ARCHIVED\"\n          }\n        ]\n      }\n    },\n    \"com.amazonaws.dynamodb#Tag\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Key\": {\n          \"target\": \"com.amazonaws.dynamodb#TagKeyString\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The key of the tag. Tag keys are case sensitive. Each DynamoDB table can only have up to\\n            one tag with the same key. If you try to add an existing tag (same key), the existing\\n            tag value will be updated to the new value. </p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"Value\": {\n          \"target\": \"com.amazonaws.dynamodb#TagValueString\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The value of the tag. Tag values are case-sensitive and can be null.</p>\",\n            \"smithy.api#required\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Describes a tag. A tag is a key-value pair. You can add up to 50 tags to a single DynamoDB table.\\n      </p>\\n         <p> AWS-assigned tag names and values are automatically assigned the <code>aws:</code>\\n            prefix, which the user cannot assign. AWS-assigned tag names do not count towards the\\n            tag limit of 50. User-assigned tag names have the prefix <code>user:</code> in the Cost\\n            Allocation Report. You cannot backdate the application of a tag. </p>\\n         <p>For an overview on tagging DynamoDB resources, see\\n      <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Tagging.html\\\">Tagging for DynamoDB</a>\\n      in the <i>Amazon DynamoDB Developer Guide</i>.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#TagKeyList\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.dynamodb#TagKeyString\"\n      }\n    },\n    \"com.amazonaws.dynamodb#TagKeyString\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#length\": {\n          \"min\": 1,\n          \"max\": 128\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#TagList\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.dynamodb#Tag\"\n      }\n    },\n    \"com.amazonaws.dynamodb#TagResource\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.dynamodb#TagResourceInput\"\n      },\n      \"errors\": [\n        {\n          \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#InvalidEndpointException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#LimitExceededException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#ResourceInUseException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#ResourceNotFoundException\"\n        }\n      ],\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Associate a set of tags with an Amazon DynamoDB resource. You can then activate these\\n            user-defined tags so that they appear on the Billing and Cost Management console for\\n            cost allocation tracking. You can call TagResource up to five times per second, per\\n            account. </p>\\n         <p>For an overview on tagging DynamoDB resources, see\\n      <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Tagging.html\\\">Tagging for DynamoDB</a>\\n      in the <i>Amazon DynamoDB Developer Guide</i>.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#TagResourceInput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"ResourceArn\": {\n          \"target\": \"com.amazonaws.dynamodb#ResourceArnString\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Identifies the Amazon DynamoDB resource to which tags should be added. This value is an Amazon Resource Name (ARN).</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"Tags\": {\n          \"target\": \"com.amazonaws.dynamodb#TagList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The tags to be assigned to the Amazon DynamoDB resource.</p>\",\n            \"smithy.api#required\": {}\n          }\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#TagValueString\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#length\": {\n          \"min\": 0,\n          \"max\": 256\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#TimeRangeLowerBound\": {\n      \"type\": \"timestamp\"\n    },\n    \"com.amazonaws.dynamodb#TimeRangeUpperBound\": {\n      \"type\": \"timestamp\"\n    },\n    \"com.amazonaws.dynamodb#TimeToLiveAttributeName\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#length\": {\n          \"min\": 1,\n          \"max\": 255\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#TimeToLiveDescription\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"TimeToLiveStatus\": {\n          \"target\": \"com.amazonaws.dynamodb#TimeToLiveStatus\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p> The TTL status for the table.</p>\"\n          }\n        },\n        \"AttributeName\": {\n          \"target\": \"com.amazonaws.dynamodb#TimeToLiveAttributeName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p> The name of the TTL attribute for items in the table.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>The description of the Time to Live (TTL) status on the specified table. </p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#TimeToLiveEnabled\": {\n      \"type\": \"boolean\",\n      \"traits\": {\n        \"smithy.api#box\": {}\n      }\n    },\n    \"com.amazonaws.dynamodb#TimeToLiveSpecification\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Enabled\": {\n          \"target\": \"com.amazonaws.dynamodb#TimeToLiveEnabled\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Indicates whether TTL is to be enabled (true) or disabled (false) on the table.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"AttributeName\": {\n          \"target\": \"com.amazonaws.dynamodb#TimeToLiveAttributeName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the TTL attribute used to store the expiration time for items in the\\n            table.</p>\",\n            \"smithy.api#required\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents the settings used to enable or disable Time to Live (TTL) for the specified\\n            table.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#TimeToLiveStatus\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#enum\": [\n          {\n            \"value\": \"ENABLING\",\n            \"name\": \"ENABLING\"\n          },\n          {\n            \"value\": \"DISABLING\",\n            \"name\": \"DISABLING\"\n          },\n          {\n            \"value\": \"ENABLED\",\n            \"name\": \"ENABLED\"\n          },\n          {\n            \"value\": \"DISABLED\",\n            \"name\": \"DISABLED\"\n          }\n        ]\n      }\n    },\n    \"com.amazonaws.dynamodb#TransactGetItem\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Get\": {\n          \"target\": \"com.amazonaws.dynamodb#Get\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Contains the primary key that identifies the item to get, together\\n        with the name of the table that contains the item, and optionally\\n        the specific attributes of the item to retrieve.</p>\",\n            \"smithy.api#required\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Specifies an item to be retrieved as part of the transaction.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#TransactGetItemList\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.dynamodb#TransactGetItem\"\n      },\n      \"traits\": {\n        \"smithy.api#length\": {\n          \"min\": 1,\n          \"max\": 25\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#TransactGetItems\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.dynamodb#TransactGetItemsInput\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.dynamodb#TransactGetItemsOutput\"\n      },\n      \"errors\": [\n        {\n          \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#InvalidEndpointException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#ProvisionedThroughputExceededException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#RequestLimitExceeded\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#ResourceNotFoundException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#TransactionCanceledException\"\n        }\n      ],\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>\\n            <code>TransactGetItems</code> is a synchronous operation that atomically retrieves\\n            multiple items from one or more tables (but not from indexes) in a single account and\\n            Region. A <code>TransactGetItems</code> call can contain up to 25\\n                <code>TransactGetItem</code> objects, each of which contains a <code>Get</code>\\n            structure that specifies an item to retrieve from a table in the account and Region. A\\n            call to <code>TransactGetItems</code> cannot retrieve items from tables in more than one\\n            AWS account or Region. The aggregate size of the items in the transaction cannot exceed\\n            4 MB.</p>\\n         <p>DynamoDB rejects the entire <code>TransactGetItems</code> request if any of the following is true:</p>\\n         <ul>\\n            <li>\\n               <p>A conflicting operation is in the process of updating an\\n          item to be read.</p>\\n            </li>\\n            <li>\\n               <p>There is insufficient provisioned capacity for the transaction\\n          to be completed.</p>\\n            </li>\\n            <li>\\n               <p>There is a user error, such as an invalid data format.</p>\\n            </li>\\n            <li>\\n               <p>The aggregate size of the items in the transaction cannot exceed 4 MB.</p>\\n            </li>\\n         </ul>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#TransactGetItemsInput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"TransactItems\": {\n          \"target\": \"com.amazonaws.dynamodb#TransactGetItemList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>An ordered array of up to 25 <code>TransactGetItem</code> objects,\\n         each of which contains a <code>Get</code> structure.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"ReturnConsumedCapacity\": {\n          \"target\": \"com.amazonaws.dynamodb#ReturnConsumedCapacity\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A value of <code>TOTAL</code> causes consumed capacity information\\n         to be returned, and a value of <code>NONE</code> prevents that information\\n         from being returned. No other value is valid.</p>\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#TransactGetItemsOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"ConsumedCapacity\": {\n          \"target\": \"com.amazonaws.dynamodb#ConsumedCapacityMultiple\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>If the <i>ReturnConsumedCapacity</i> value was <code>TOTAL</code>,\\n         this is an array of <code>ConsumedCapacity</code> objects, one for each table\\n         addressed by <code>TransactGetItem</code> objects in the <i>TransactItems</i>\\n         parameter. These <code>ConsumedCapacity</code> objects report the read-capacity\\n         units consumed by the <code>TransactGetItems</code> call in that table.</p>\"\n          }\n        },\n        \"Responses\": {\n          \"target\": \"com.amazonaws.dynamodb#ItemResponseList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>An ordered array of up to 25 <code>ItemResponse</code> objects, each of which corresponds\\n         to the <code>TransactGetItem</code> object in the same position in the\\n         <i>TransactItems</i> array. Each <code>ItemResponse</code> object\\n         contains a Map of the name-value pairs that are the projected attributes of\\n         the requested item.</p>\\n         <p>If a requested item could not be retrieved, the corresponding <code>ItemResponse</code>\\n       object is Null, or if the requested item has no projected attributes, the corresponding\\n       <code>ItemResponse</code> object is an empty Map. </p>\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#TransactWriteItem\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"ConditionCheck\": {\n          \"target\": \"com.amazonaws.dynamodb#ConditionCheck\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A request to perform a check item operation.</p>\"\n          }\n        },\n        \"Put\": {\n          \"target\": \"com.amazonaws.dynamodb#Put\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A request to perform a <code>PutItem</code> operation.</p>\"\n          }\n        },\n        \"Delete\": {\n          \"target\": \"com.amazonaws.dynamodb#Delete\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A request to perform a <code>DeleteItem</code> operation.</p>\"\n          }\n        },\n        \"Update\": {\n          \"target\": \"com.amazonaws.dynamodb#Update\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A request to perform an <code>UpdateItem</code> operation.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>A list of requests that can perform update, put, delete, or check operations on multiple items in one or more tables atomically.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#TransactWriteItemList\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.dynamodb#TransactWriteItem\"\n      },\n      \"traits\": {\n        \"smithy.api#length\": {\n          \"min\": 1,\n          \"max\": 25\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#TransactWriteItems\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.dynamodb#TransactWriteItemsInput\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.dynamodb#TransactWriteItemsOutput\"\n      },\n      \"errors\": [\n        {\n          \"target\": \"com.amazonaws.dynamodb#IdempotentParameterMismatchException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#InvalidEndpointException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#ProvisionedThroughputExceededException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#RequestLimitExceeded\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#ResourceNotFoundException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#TransactionCanceledException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#TransactionInProgressException\"\n        }\n      ],\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>\\n            <code>TransactWriteItems</code> is a synchronous write operation that groups up to 25\\n            action requests. These actions can target items in different tables, but not in\\n            different AWS accounts or Regions, and no two actions can target the same item. For\\n            example, you cannot both <code>ConditionCheck</code> and <code>Update</code> the same\\n            item. The aggregate size of the items in the transaction cannot exceed 4 MB.</p>\\n \\n         <p>The actions are completed atomically so that either all of\\n        them succeed, or all of them fail. They are defined by the following objects:</p>\\n\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>Put</code>     Initiates a <code>PutItem</code> operation to write a new\\n                    item. This structure specifies the primary key of the item to be written, the\\n                    name of the table to write it in, an optional condition expression that must be\\n                    satisfied for the write to succeed, a list of the item's attributes, and a field\\n                    indicating whether to retrieve the item's attributes if the condition is not\\n                    met.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>Update</code>     Initiates an <code>UpdateItem</code> operation to\\n                    update an existing item. This structure specifies the primary key of the item to\\n                    be updated, the name of the table where it resides, an optional condition\\n                    expression that must be satisfied for the update to succeed, an expression that\\n                    defines one or more attributes to be updated, and a field indicating whether to\\n                    retrieve the item's attributes if the condition is not met.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>Delete</code>     Initiates a <code>DeleteItem</code> operation to\\n                    delete an existing item. This structure specifies the primary key of the item to\\n                    be deleted, the name of the table where it resides, an optional condition\\n                    expression that must be satisfied for the deletion to succeed, and a field\\n                    indicating whether to retrieve the item's attributes if the condition is not\\n                    met.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ConditionCheck</code>     Applies a condition to an item that is not\\n                    being modified by the transaction. This structure specifies the primary key of\\n                    the item to be checked, the name of the table where it resides, a condition\\n                    expression that must be satisfied for the transaction to succeed, and a field\\n                    indicating whether to retrieve the item's attributes if the condition is not\\n                    met.</p>\\n            </li>\\n         </ul>\\n\\n         <p>DynamoDB rejects the entire <code>TransactWriteItems</code> request if any of the following is true:</p>\\n         <ul>\\n            <li>\\n               <p>A condition in one of the condition expressions is not met.</p>\\n            </li>\\n            <li>\\n               <p>An ongoing operation is in the process of updating the same\\n          item.</p>\\n            </li>\\n            <li>\\n               <p>There is insufficient provisioned capacity for the transaction\\n          to be completed.</p>\\n            </li>\\n            <li>\\n               <p>An item size becomes too large (bigger than 400 KB), a local secondary index (LSI) becomes too\\n                    large, or a similar validation error occurs because of changes made by the\\n                    transaction.</p>\\n            </li>\\n            <li>\\n               <p>The aggregate size of the items in the transaction exceeds 4 MB.</p>\\n            </li>\\n            <li>\\n               <p>There  is a user error, such as an invalid data format.</p>\\n            </li>\\n         </ul>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#TransactWriteItemsInput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"TransactItems\": {\n          \"target\": \"com.amazonaws.dynamodb#TransactWriteItemList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>An ordered array of up to 25 <code>TransactWriteItem</code> objects, each of which\\n            contains a <code>ConditionCheck</code>, <code>Put</code>, <code>Update</code>, or\\n                <code>Delete</code> object. These can operate on items in different tables, but the\\n            tables must reside in the same AWS account and Region, and no two of them can operate on\\n            the same item. </p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"ReturnConsumedCapacity\": {\n          \"target\": \"com.amazonaws.dynamodb#ReturnConsumedCapacity\"\n        },\n        \"ReturnItemCollectionMetrics\": {\n          \"target\": \"com.amazonaws.dynamodb#ReturnItemCollectionMetrics\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Determines whether item collection metrics are returned. If set to\\n      <code>SIZE</code>, the response includes statistics about item collections (if any), that\\n      were modified during the operation and are returned in the response.\\n      If set to <code>NONE</code> (the default), no statistics are returned.\\n      </p>\"\n          }\n        },\n        \"ClientRequestToken\": {\n          \"target\": \"com.amazonaws.dynamodb#ClientRequestToken\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Providing a <code>ClientRequestToken</code> makes the call to <code>TransactWriteItems</code>\\n        idempotent, meaning that multiple identical calls have the same effect as one single call.</p>\\n         <p>Although multiple identical calls using the same client request token produce the same\\n            result on the server (no side effects), the responses to the calls might not be the\\n            same. If the <code>ReturnConsumedCapacity></code> parameter is set, then the initial\\n                <code>TransactWriteItems</code> call returns the amount of write capacity units\\n            consumed in making the changes. Subsequent <code>TransactWriteItems</code> calls with\\n            the same client token return the number of read capacity units consumed in reading the\\n            item.</p>\\n         <p>A client request token is valid for 10 minutes after the first request that uses it is\\n            completed. After 10 minutes, any request with the same client token is treated as a new\\n            request. Do not resubmit the same request with the same client token for more than 10\\n            minutes, or the result might not be idempotent.</p>\\n         <p>If you submit a request with the same client token but a change in other parameters\\n            within the 10-minute idempotency window, DynamoDB returns an\\n                <code>IdempotentParameterMismatch</code> exception.</p>\",\n            \"smithy.api#idempotencyToken\": {}\n          }\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#TransactWriteItemsOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"ConsumedCapacity\": {\n          \"target\": \"com.amazonaws.dynamodb#ConsumedCapacityMultiple\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The capacity units consumed by the entire <code>TransactWriteItems</code>\\n      operation. The values of the list are ordered according to\\n      the ordering of the <code>TransactItems</code> request parameter.\\n     </p>\"\n          }\n        },\n        \"ItemCollectionMetrics\": {\n          \"target\": \"com.amazonaws.dynamodb#ItemCollectionMetricsPerTable\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A list of tables that were processed by <code>TransactWriteItems</code> and, for each\\n            table, information about any item collections that were affected by individual\\n                <code>UpdateItem</code>, <code>PutItem</code>, or <code>DeleteItem</code>\\n            operations. </p>\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#TransactionCanceledException\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Message\": {\n          \"target\": \"com.amazonaws.dynamodb#ErrorMessage\"\n        },\n        \"CancellationReasons\": {\n          \"target\": \"com.amazonaws.dynamodb#CancellationReasonList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A list of cancellation reasons.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>The entire transaction request was canceled.</p>\\n         <p>DynamoDB cancels a <code>TransactWriteItems</code> request under the following circumstances:</p>\\n         <ul>\\n            <li>\\n               <p>A condition in one of the condition expressions is not met.</p>\\n            </li>\\n            <li>\\n               <p>A table in the <code>TransactWriteItems</code> request is in a different account or region.</p>\\n            </li>\\n            <li>\\n               <p>More than one action in the <code>TransactWriteItems</code> operation targets the same item.</p>\\n            </li>\\n            <li>\\n               <p>There is insufficient provisioned capacity for the transaction to be completed.</p>\\n            </li>\\n            <li>\\n               <p>An item size becomes too large (larger than 400 KB), or a local secondary index (LSI)\\n        becomes too large, or a similar validation error occurs because of changes made by the transaction.</p>\\n            </li>\\n            <li>\\n               <p>There is a user error, such as an invalid data format.</p>\\n            </li>\\n         </ul>\\n\\n         <p>DynamoDB cancels a <code>TransactGetItems</code> request under the following circumstances:</p>\\n         <ul>\\n            <li>\\n               <p>There is an ongoing <code>TransactGetItems</code> operation that conflicts with a concurrent\\n        <code>PutItem</code>, <code>UpdateItem</code>, <code>DeleteItem</code> or <code>TransactWriteItems</code> request.\\n        In this case the <code>TransactGetItems</code> operation fails with a <code>TransactionCanceledException</code>.</p>\\n            </li>\\n            <li>\\n               <p>A table in the <code>TransactGetItems</code> request is in a different account or region.</p>\\n            </li>\\n            <li>\\n               <p>There is insufficient provisioned capacity for the transaction to be completed.</p>\\n            </li>\\n            <li>\\n               <p>There is a user error, such as an invalid data format.</p>\\n            </li>\\n         </ul>\\n\\n         <note>\\n            <p>If using Java, DynamoDB lists the cancellation reasons on the <code>CancellationReasons</code> property.  This property is not set for other languages.\\n    Transaction cancellation reasons are ordered in the order of requested items, if an item has no error it will have <code>NONE</code> code and <code>Null</code> message.</p>\\n         </note>\\n         <p>Cancellation reason codes and possible error messages:</p>\\n         <ul>\\n            <li>\\n               <p>No Errors:</p>\\n               <ul>\\n                  <li>\\n                     <p>Code: <code>NONE</code> \\n                     </p>\\n                  </li>\\n                  <li>\\n                     <p>Message: <code>null</code> \\n                     </p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <p>Conditional Check Failed:</p>\\n               <ul>\\n                  <li>\\n                     <p>Code: <code>ConditionalCheckFailed</code> \\n                     </p>\\n                  </li>\\n                  <li>\\n                     <p>Message: The conditional request failed. </p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <p>Item Collection Size Limit Exceeded:</p>\\n               <ul>\\n                  <li>\\n                     <p>Code: <code>ItemCollectionSizeLimitExceeded</code> \\n                     </p>\\n                  </li>\\n                  <li>\\n                     <p>Message: Collection size exceeded.</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <p>Transaction Conflict:</p>\\n               <ul>\\n                  <li>\\n                     <p>Code: <code>TransactionConflict</code> \\n                     </p>\\n                  </li>\\n                  <li>\\n                     <p>Message: Transaction is ongoing for the item.</p>\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <p>Provisioned Throughput Exceeded:</p>\\n               <ul>\\n                  <li>\\n                     <p>Code: <code>ProvisionedThroughputExceeded</code> \\n                     </p>\\n                  </li>\\n                  <li>\\n                     <p>Messages: </p>\\n                    <ul>\\n                        <li>\\n                           <p>The level of configured provisioned throughput for the table was exceeded. Consider increasing your provisioning level with the\\n                            UpdateTable API.</p>\\n                           <note>\\n                              <p>This Message is received when provisioned throughput is exceeded is on a provisioned DynamoDB table.</p>\\n                           </note>\\n                        </li>\\n                        <li>\\n                           <p>The level of configured provisioned throughput for one or more global secondary indexes of the table was exceeded. \\n                    Consider increasing your provisioning level for the under-provisioned global secondary indexes with the UpdateTable API.</p>\\n                           <note>\\n                              <p>This message is returned when provisioned throughput is exceeded is on a provisioned GSI.</p>\\n                           </note>\\n                        </li>\\n                     </ul>\\n\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <p>Throttling Error:</p>\\n               <ul>\\n                  <li>\\n                     <p>Code: <code>ThrottlingError</code> \\n                     </p>\\n                  </li>\\n                  <li>\\n                     <p>Messages: </p>\\n                    <ul>\\n                        <li>\\n                           <p>Throughput exceeds the current capacity of your table or index.\\n                            DynamoDB is automatically scaling your table or index so please try\\n                            again shortly. If exceptions persist, check if you have a hot key:\\n                            https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/bp-partition-key-design.html.</p>\\n                           <note>\\n                              <p>This message is returned when writes get throttled on an On-Demand table as DynamoDB is automatically scaling the table.</p>\\n                           </note>\\n                        </li>\\n                        <li>\\n                           <p>Throughput exceeds the current capacity for one or more global secondary indexes. DynamoDB is automatically scaling your index so\\n                              please try again shortly.</p>\\n                           <note>\\n                              <p>This message is returned when when writes get throttled on an On-Demand GSI as DynamoDB is automatically scaling the GSI.</p>\\n                           </note>\\n                        </li>\\n                     </ul>\\n\\n                  </li>\\n               </ul>\\n            </li>\\n            <li>\\n               <p>Validation Error:</p>\\n               <ul>\\n                  <li>\\n                     <p>Code: <code>ValidationError</code> \\n                     </p>\\n                  </li>\\n                  <li>\\n                     <p>Messages: </p>\\n                    <ul>\\n                        <li>\\n                           <p>One or more parameter values were invalid.</p>\\n                        </li>\\n                        <li>\\n                           <p>The update expression attempted to update the secondary index key beyond allowed size limits.</p>\\n                        </li>\\n                        <li>\\n                           <p>The update expression attempted to update the secondary index key to unsupported type.</p>\\n                        </li>\\n                        <li>\\n                           <p>An operand in the update expression has an incorrect data type.</p>\\n                        </li>\\n                        <li>\\n                           <p>Item size to update has exceeded the maximum allowed size.</p>\\n                        </li>\\n                        <li>\\n                           <p>Number overflow. Attempting to store a number with magnitude larger than supported range.</p>\\n                        </li>\\n                        <li>\\n                           <p>Type mismatch for attribute to update.</p>\\n                        </li>\\n                        <li>\\n                           <p>Nesting Levels have exceeded supported limits.</p>\\n                        </li>\\n                        <li>\\n                           <p>The document path provided in the update expression is invalid for update.</p>\\n                        </li>\\n                        <li>\\n                           <p>The provided expression refers to an attribute that does not exist in the item.</p>\\n                        </li>\\n                     </ul>\\n\\n                  </li>\\n               </ul>\\n            </li>\\n         </ul>\",\n        \"smithy.api#error\": \"client\"\n      }\n    },\n    \"com.amazonaws.dynamodb#TransactionConflictException\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"message\": {\n          \"target\": \"com.amazonaws.dynamodb#ErrorMessage\"\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Operation was rejected because there is an ongoing transaction for the item.</p>\",\n        \"smithy.api#error\": \"client\"\n      }\n    },\n    \"com.amazonaws.dynamodb#TransactionInProgressException\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Message\": {\n          \"target\": \"com.amazonaws.dynamodb#ErrorMessage\"\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>The transaction with the given request token is already in progress.</p>\",\n        \"smithy.api#error\": \"client\"\n      }\n    },\n    \"com.amazonaws.dynamodb#UntagResource\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.dynamodb#UntagResourceInput\"\n      },\n      \"errors\": [\n        {\n          \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#InvalidEndpointException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#LimitExceededException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#ResourceInUseException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#ResourceNotFoundException\"\n        }\n      ],\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Removes the association of tags from an Amazon DynamoDB resource. You can call\\n                <code>UntagResource</code> up to five times per second, per account. </p>\\n         <p>For an overview on tagging DynamoDB resources, see\\n      <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Tagging.html\\\">Tagging for DynamoDB</a>\\n      in the <i>Amazon DynamoDB Developer Guide</i>.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#UntagResourceInput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"ResourceArn\": {\n          \"target\": \"com.amazonaws.dynamodb#ResourceArnString\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The DynamoDB resource that the tags will be removed from. This value is an Amazon\\n            Resource Name (ARN).</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"TagKeys\": {\n          \"target\": \"com.amazonaws.dynamodb#TagKeyList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A list of tag keys. Existing tags of the resource whose keys are members of this list\\n            will be removed from the DynamoDB resource.</p>\",\n            \"smithy.api#required\": {}\n          }\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#Update\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Key\": {\n          \"target\": \"com.amazonaws.dynamodb#Key\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The primary key of the item to be updated. Each element consists of\\n      an attribute name and a value for that attribute.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"UpdateExpression\": {\n          \"target\": \"com.amazonaws.dynamodb#UpdateExpression\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>An expression that defines one or more attributes to be updated,\\n      the action to be performed on them, and new value(s) for them.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"TableName\": {\n          \"target\": \"com.amazonaws.dynamodb#TableName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Name of the table for the <code>UpdateItem</code> request.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"ConditionExpression\": {\n          \"target\": \"com.amazonaws.dynamodb#ConditionExpression\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A condition that must be satisfied in order for a conditional update to\\n        succeed.</p>\"\n          }\n        },\n        \"ExpressionAttributeNames\": {\n          \"target\": \"com.amazonaws.dynamodb#ExpressionAttributeNameMap\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>One or more substitution tokens for attribute names in an expression.</p>\"\n          }\n        },\n        \"ExpressionAttributeValues\": {\n          \"target\": \"com.amazonaws.dynamodb#ExpressionAttributeValueMap\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>One or more values that can be substituted in an expression.</p>\"\n          }\n        },\n        \"ReturnValuesOnConditionCheckFailure\": {\n          \"target\": \"com.amazonaws.dynamodb#ReturnValuesOnConditionCheckFailure\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Use <code>ReturnValuesOnConditionCheckFailure</code> to\\n        get the item attributes if the <code>Update</code> condition fails.\\n        For <code>ReturnValuesOnConditionCheckFailure</code>, the valid\\n        values are: NONE, ALL_OLD, UPDATED_OLD, ALL_NEW, UPDATED_NEW.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents a request to perform an <code>UpdateItem</code> operation.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#UpdateContinuousBackups\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.dynamodb#UpdateContinuousBackupsInput\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.dynamodb#UpdateContinuousBackupsOutput\"\n      },\n      \"errors\": [\n        {\n          \"target\": \"com.amazonaws.dynamodb#ContinuousBackupsUnavailableException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#InvalidEndpointException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#TableNotFoundException\"\n        }\n      ],\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>\\n            <code>UpdateContinuousBackups</code> enables or disables point in time recovery for the specified table.\\n      A successful <code>UpdateContinuousBackups</code> call returns the current <code>ContinuousBackupsDescription</code>.\\n      Continuous backups are <code>ENABLED</code> on all tables at table creation.\\n      If point in time recovery is enabled, <code>PointInTimeRecoveryStatus</code> will be set to ENABLED.</p>\\n         <p>\\n      Once continuous backups and point in time recovery are enabled, you can restore to any point in time within\\n      <code>EarliestRestorableDateTime</code> and <code>LatestRestorableDateTime</code>.\\n     </p>\\n         <p>\\n            <code>LatestRestorableDateTime</code> is typically 5 minutes before the current time.\\n            You can restore your table to any point in time during the last 35 days. </p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#UpdateContinuousBackupsInput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"TableName\": {\n          \"target\": \"com.amazonaws.dynamodb#TableName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the table.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"PointInTimeRecoverySpecification\": {\n          \"target\": \"com.amazonaws.dynamodb#PointInTimeRecoverySpecification\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Represents the settings used to enable point in time recovery.</p>\",\n            \"smithy.api#required\": {}\n          }\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#UpdateContinuousBackupsOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"ContinuousBackupsDescription\": {\n          \"target\": \"com.amazonaws.dynamodb#ContinuousBackupsDescription\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Represents the continuous backups and point in time recovery settings on the table.</p>\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#UpdateContributorInsights\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.dynamodb#UpdateContributorInsightsInput\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.dynamodb#UpdateContributorInsightsOutput\"\n      },\n      \"errors\": [\n        {\n          \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#ResourceNotFoundException\"\n        }\n      ],\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Updates the status for contributor insights for a specific table or index.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#UpdateContributorInsightsInput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"TableName\": {\n          \"target\": \"com.amazonaws.dynamodb#TableName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the table.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"IndexName\": {\n          \"target\": \"com.amazonaws.dynamodb#IndexName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The global secondary index name, if applicable.</p>\"\n          }\n        },\n        \"ContributorInsightsAction\": {\n          \"target\": \"com.amazonaws.dynamodb#ContributorInsightsAction\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Represents the contributor insights action.</p>\",\n            \"smithy.api#required\": {}\n          }\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#UpdateContributorInsightsOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"TableName\": {\n          \"target\": \"com.amazonaws.dynamodb#TableName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the table.</p>\"\n          }\n        },\n        \"IndexName\": {\n          \"target\": \"com.amazonaws.dynamodb#IndexName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the global secondary index, if applicable.</p>\"\n          }\n        },\n        \"ContributorInsightsStatus\": {\n          \"target\": \"com.amazonaws.dynamodb#ContributorInsightsStatus\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The status of contributor insights</p>\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#UpdateExpression\": {\n      \"type\": \"string\"\n    },\n    \"com.amazonaws.dynamodb#UpdateGlobalSecondaryIndexAction\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"IndexName\": {\n          \"target\": \"com.amazonaws.dynamodb#IndexName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the global secondary index to be updated.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"ProvisionedThroughput\": {\n          \"target\": \"com.amazonaws.dynamodb#ProvisionedThroughput\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Represents the provisioned throughput settings for the specified global secondary index.</p>\\n         <p>For current minimum and maximum provisioned throughput values, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Limits.html\\\">Service, Account, and Table Quotas</a> in the <i>Amazon DynamoDB Developer Guide</i>.</p>\",\n            \"smithy.api#required\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents the new provisioned throughput settings to be applied to a global secondary index.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#UpdateGlobalTable\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.dynamodb#UpdateGlobalTableInput\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.dynamodb#UpdateGlobalTableOutput\"\n      },\n      \"errors\": [\n        {\n          \"target\": \"com.amazonaws.dynamodb#GlobalTableNotFoundException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#InvalidEndpointException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#ReplicaAlreadyExistsException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#ReplicaNotFoundException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#TableNotFoundException\"\n        }\n      ],\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Adds or removes replicas in the specified global table. The global table must already\\n            exist to be able to use this operation. Any replica to be added must be empty, have the\\n            same name as the global table, have the same key schema, have DynamoDB Streams enabled,\\n            and have the same provisioned and maximum write capacity units.</p>\\n        <note>\\n            <p>Although you can use <code>UpdateGlobalTable</code> to add replicas and remove replicas in\\n                a single request, for simplicity we recommend that you issue separate requests for\\n                adding or removing replicas.</p>\\n         </note>\\n       \\t<p>\\n        If global secondary indexes are specified, then the following conditions must also be met:\\n        </p>\\n        <ul>\\n            <li>\\n               <p>\\n               The global secondary indexes must have the same name.\\n            </p>\\n            </li>\\n            <li>\\n               <p>\\n               The global secondary indexes must have the same hash key and sort key (if present).\\n            </p>\\n            </li>\\n            <li>\\n               <p>\\n               The global secondary indexes must have the same provisioned and maximum write capacity units.\\n            </p>\\n            </li>\\n         </ul>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#UpdateGlobalTableInput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"GlobalTableName\": {\n          \"target\": \"com.amazonaws.dynamodb#TableName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The global table name.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"ReplicaUpdates\": {\n          \"target\": \"com.amazonaws.dynamodb#ReplicaUpdateList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A list of Regions that should be added or removed from the global table.</p>\",\n            \"smithy.api#required\": {}\n          }\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#UpdateGlobalTableOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"GlobalTableDescription\": {\n          \"target\": \"com.amazonaws.dynamodb#GlobalTableDescription\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Contains the details of the global table.</p>\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#UpdateGlobalTableSettings\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.dynamodb#UpdateGlobalTableSettingsInput\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.dynamodb#UpdateGlobalTableSettingsOutput\"\n      },\n      \"errors\": [\n        {\n          \"target\": \"com.amazonaws.dynamodb#GlobalTableNotFoundException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#IndexNotFoundException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#InvalidEndpointException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#LimitExceededException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#ReplicaNotFoundException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#ResourceInUseException\"\n        }\n      ],\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Updates settings for a global table.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#UpdateGlobalTableSettingsInput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"GlobalTableName\": {\n          \"target\": \"com.amazonaws.dynamodb#TableName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the global table</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"GlobalTableBillingMode\": {\n          \"target\": \"com.amazonaws.dynamodb#BillingMode\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The billing mode of the global table. If <code>GlobalTableBillingMode</code> is not specified, the global table defaults to <code>PROVISIONED</code> capacity billing mode.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>PROVISIONED</code> - We recommend using <code>PROVISIONED</code> for predictable workloads. <code>PROVISIONED</code> sets the billing mode to <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.ReadWriteCapacityMode.html#HowItWorks.ProvisionedThroughput.Manual\\\">Provisioned Mode</a>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>PAY_PER_REQUEST</code> - We recommend using <code>PAY_PER_REQUEST</code> for unpredictable workloads. <code>PAY_PER_REQUEST</code> sets the billing mode to <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.ReadWriteCapacityMode.html#HowItWorks.OnDemand\\\">On-Demand Mode</a>.\\n            </p>\\n            </li>\\n         </ul>\"\n          }\n        },\n        \"GlobalTableProvisionedWriteCapacityUnits\": {\n          \"target\": \"com.amazonaws.dynamodb#PositiveLongObject\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The maximum number of writes consumed per second before DynamoDB returns a <code>ThrottlingException.</code>\\n         </p>\"\n          }\n        },\n        \"GlobalTableProvisionedWriteCapacityAutoScalingSettingsUpdate\": {\n          \"target\": \"com.amazonaws.dynamodb#AutoScalingSettingsUpdate\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Auto scaling settings for managing provisioned write capacity for the global\\n            table.</p>\"\n          }\n        },\n        \"GlobalTableGlobalSecondaryIndexSettingsUpdate\": {\n          \"target\": \"com.amazonaws.dynamodb#GlobalTableGlobalSecondaryIndexSettingsUpdateList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Represents the settings of a global secondary index for a global table that will be modified.</p>\"\n          }\n        },\n        \"ReplicaSettingsUpdate\": {\n          \"target\": \"com.amazonaws.dynamodb#ReplicaSettingsUpdateList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Represents the settings for a global table in a Region that will be modified.</p>\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#UpdateGlobalTableSettingsOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"GlobalTableName\": {\n          \"target\": \"com.amazonaws.dynamodb#TableName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the global table.</p>\"\n          }\n        },\n        \"ReplicaSettings\": {\n          \"target\": \"com.amazonaws.dynamodb#ReplicaSettingsDescriptionList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Region-specific settings for the global table.</p>\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#UpdateItem\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.dynamodb#UpdateItemInput\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.dynamodb#UpdateItemOutput\"\n      },\n      \"errors\": [\n        {\n          \"target\": \"com.amazonaws.dynamodb#ConditionalCheckFailedException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#InvalidEndpointException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#ItemCollectionSizeLimitExceededException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#ProvisionedThroughputExceededException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#RequestLimitExceeded\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#ResourceNotFoundException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#TransactionConflictException\"\n        }\n      ],\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Edits an existing item's attributes, or adds a new item to the table if it does not already exist. You can put, delete, or add attribute values. You can also perform a conditional update on an existing item (insert a new attribute name-value pair if it doesn't exist, or replace an existing name-value pair if it has certain expected attribute values).</p>\\n         <p>You can also return the item's attribute values in the same <code>UpdateItem</code>\\n      operation using the <code>ReturnValues</code> parameter.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#UpdateItemInput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"TableName\": {\n          \"target\": \"com.amazonaws.dynamodb#TableName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the table containing the item to update.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"Key\": {\n          \"target\": \"com.amazonaws.dynamodb#Key\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The primary key of the item to be updated. Each element consists of an attribute name and a value for that attribute.</p>\\n         <p>For the primary key, you must provide all of the attributes. For example, with a simple primary key, you only need to provide a value for the partition key. For a composite primary key, you must provide values for both the partition key and the sort key.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"AttributeUpdates\": {\n          \"target\": \"com.amazonaws.dynamodb#AttributeUpdates\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>This is a legacy parameter.  Use <code>UpdateExpression</code> instead.   For more information, see\\n          <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/LegacyConditionalParameters.AttributeUpdates.html\\\">AttributeUpdates</a> in the <i>Amazon DynamoDB Developer Guide</i>.</p>\"\n          }\n        },\n        \"Expected\": {\n          \"target\": \"com.amazonaws.dynamodb#ExpectedAttributeMap\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>This is a legacy parameter.  Use <code>ConditionExpression</code> instead.   For more information, see\\n          <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/LegacyConditionalParameters.Expected.html\\\">Expected</a> in the <i>Amazon DynamoDB Developer Guide</i>.</p>\"\n          }\n        },\n        \"ConditionalOperator\": {\n          \"target\": \"com.amazonaws.dynamodb#ConditionalOperator\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>This is a legacy parameter.  Use <code>ConditionExpression</code> instead.   For more information, see\\n          <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/LegacyConditionalParameters.ConditionalOperator.html\\\">ConditionalOperator</a> in the <i>Amazon DynamoDB Developer Guide</i>.</p>\"\n          }\n        },\n        \"ReturnValues\": {\n          \"target\": \"com.amazonaws.dynamodb#ReturnValue\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Use <code>ReturnValues</code> if you want to get the item attributes as they appear\\n            before or after they are updated. For <code>UpdateItem</code>, the valid values\\n            are:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>NONE</code> - If <code>ReturnValues</code> is not specified, or if its value is\\n          <code>NONE</code>, then nothing is returned. (This setting is the default for\\n          <code>ReturnValues</code>.)</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ALL_OLD</code> - Returns all of the attributes of the item, as they appeared before the UpdateItem operation.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>UPDATED_OLD</code> - Returns only the updated attributes, as they appeared before the UpdateItem operation.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ALL_NEW</code> - Returns all of the attributes of the item, as they appear after the UpdateItem operation.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>UPDATED_NEW</code> - Returns only the updated attributes, as they appear after the UpdateItem operation.</p>\\n            </li>\\n         </ul>\\n         <p>There is no additional cost associated with requesting a return value aside from the\\n            small network and processing overhead of receiving a larger response. No read capacity\\n            units are consumed.</p>\\n         <p>The values returned are strongly consistent.</p>\"\n          }\n        },\n        \"ReturnConsumedCapacity\": {\n          \"target\": \"com.amazonaws.dynamodb#ReturnConsumedCapacity\"\n        },\n        \"ReturnItemCollectionMetrics\": {\n          \"target\": \"com.amazonaws.dynamodb#ReturnItemCollectionMetrics\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Determines whether item collection metrics are returned.  If set to <code>SIZE</code>, the response includes statistics about item collections, if any, that were modified during\\n      the operation are returned in the response. If set to <code>NONE</code> (the default), no statistics are returned.</p>\"\n          }\n        },\n        \"UpdateExpression\": {\n          \"target\": \"com.amazonaws.dynamodb#UpdateExpression\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>An expression that defines one or more attributes to be updated, the action to be\\n            performed on them, and new values for them.</p>\\n         <p>The following action values are available for <code>UpdateExpression</code>.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                    <code>SET</code> - Adds one or more attributes and values to an item. If any of\\n                    these attributes already exist, they are replaced by the new values. You can\\n                    also use <code>SET</code> to add or subtract from an attribute that is of type\\n                    Number. For example: <code>SET myNum = myNum + :val</code>\\n                </p>\\n               <p>\\n                  <code>SET</code> supports the following functions:</p>\\n               <ul>\\n                  <li>\\n                     <p>\\n                        <code>if_not_exists (path, operand)</code> - if the item does not contain an attribute at the specified path, then <code>if_not_exists</code> evaluates to operand; otherwise, it evaluates to path. You can use this function to avoid overwriting an attribute that may already be present in the item.</p>\\n                  </li>\\n                  <li>\\n                     <p>\\n                        <code>list_append (operand, operand)</code> - evaluates to a list with a new element added to it. You can append the new element to the start or the end of the list by reversing the order of the operands.</p>\\n                  </li>\\n               </ul>\\n               <p>These function names are case-sensitive.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>REMOVE</code> - Removes one or more attributes from an item.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>ADD</code> - Adds the specified value to the item, if the attribute does not already exist. If the attribute does exist, then the behavior of\\n            <code>ADD</code> depends on the data type of the attribute:</p>\\n               <ul>\\n                  <li>\\n                     <p>If the existing attribute is a number, and if <code>Value</code> is also a number, then\\n                <code>Value</code> is mathematically added to the existing attribute. If <code>Value</code> is a\\n              negative number, then it is subtracted from the existing attribute.</p>\\n                     <note>\\n                        <p>If you use <code>ADD</code> to increment or decrement a number value for an item\\n                that doesn't exist before the update, DynamoDB uses <code>0</code> as the initial\\n                value.</p>\\n                        <p>Similarly, if you use <code>ADD</code> for an existing item to increment\\n                                or decrement an attribute value that doesn't exist before the\\n                                update, DynamoDB uses <code>0</code> as the initial value. For\\n                                example, suppose that the item you want to update doesn't have an\\n                                attribute named <code>itemcount</code>, but you decide to\\n                                    <code>ADD</code> the number <code>3</code> to this attribute\\n                                anyway. DynamoDB will create the <code>itemcount</code> attribute,\\n                                set its initial value to <code>0</code>, and finally add\\n                                    <code>3</code> to it. The result will be a new\\n                                    <code>itemcount</code> attribute in the item, with a value of\\n                                    <code>3</code>.</p>\\n                     </note>\\n                  </li>\\n                  <li>\\n                     <p>If the existing data type is a set and if <code>Value</code> is also a set, then\\n                <code>Value</code> is added to the existing set. For example, if the attribute value is the set\\n                <code>[1,2]</code>, and the <code>ADD</code> action specified <code>[3]</code>, then\\n              the final attribute value is <code>[1,2,3]</code>. An error occurs if an <code>ADD</code>\\n              action is specified for a set attribute and the attribute type specified does not\\n              match the existing set type. </p>\\n                     <p>Both sets must have the same primitive data type. For example, if the existing data\\n              type is a set of strings, the <code>Value</code> must also be a set of strings.</p>\\n                  </li>\\n               </ul>\\n               <important>\\n                  <p>The <code>ADD</code> action only supports Number and set data types. In addition,\\n              <code>ADD</code> can only be used on top-level attributes, not nested attributes.</p>\\n               </important>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>DELETE</code> - Deletes an element from a set.</p>\\n               <p>If a set of values is specified, then those values are subtracted from the old\\n          set. For example, if the attribute value was the set <code>[a,b,c]</code> and the\\n          <code>DELETE</code> action specifies <code>[a,c]</code>, then the final attribute value\\n          is <code>[b]</code>. Specifying an empty set is an error.</p>\\n               <important>\\n                  <p>The <code>DELETE</code> action only supports set data types. In addition,\\n          <code>DELETE</code> can only be used on top-level attributes, not nested attributes.</p>\\n               </important>\\n\\n            </li>\\n         </ul>\\n         <p>You can have many actions in a single expression, such as the following: <code>SET a=:value1,\\n         b=:value2 DELETE :value3, :value4, :value5</code>\\n         </p>\\n         <p>For more information on update expressions, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.Modifying.html\\\">Modifying Items and Attributes</a> in the <i>Amazon DynamoDB Developer Guide</i>.</p>\"\n          }\n        },\n        \"ConditionExpression\": {\n          \"target\": \"com.amazonaws.dynamodb#ConditionExpression\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A condition that must be satisfied in order for a conditional update to succeed.</p>\\n         <p>An expression can contain any of the following:</p>\\n         <ul>\\n            <li>\\n               <p>Functions: <code>attribute_exists | attribute_not_exists | attribute_type | contains | begins_with | size</code>\\n               </p>\\n               <p>These function names are case-sensitive.</p>\\n            </li>\\n            <li>\\n               <p>Comparison operators: <code>= | <> |\\n            < | > | <= | >= |\\n            BETWEEN | IN </code>\\n               </p>\\n            </li>\\n            <li>\\n               <p> Logical operators: <code>AND | OR | NOT</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>For more information about condition expressions, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.SpecifyingConditions.html\\\">Specifying Conditions</a> in the <i>Amazon DynamoDB Developer\\n                Guide</i>.</p>\"\n          }\n        },\n        \"ExpressionAttributeNames\": {\n          \"target\": \"com.amazonaws.dynamodb#ExpressionAttributeNameMap\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>One or more substitution tokens for attribute names in an expression. The following are some use cases for using <code>ExpressionAttributeNames</code>:</p>\\n         <ul>\\n            <li>\\n               <p>To access an attribute whose name conflicts with a DynamoDB reserved word.</p>\\n            </li>\\n            <li>\\n               <p>To create a placeholder for repeating occurrences of an attribute name in an expression.</p>\\n            </li>\\n            <li>\\n               <p>To prevent special characters in an attribute name from being misinterpreted in an expression.</p>\\n            </li>\\n         </ul>\\n         <p>Use the <b>#</b> character in an expression to dereference an attribute name. For example, consider the following attribute name:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>Percentile</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>The name of this attribute conflicts with a reserved word, so it cannot be used directly\\n            in an expression. (For the complete list of reserved words, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ReservedWords.html\\\">Reserved Words</a> in the <i>Amazon DynamoDB Developer\\n            Guide</i>.) To work around this, you could specify the following for\\n                <code>ExpressionAttributeNames</code>:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>{\\\"#P\\\":\\\"Percentile\\\"}</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <p>You could then use this substitution in an expression, as in this example:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>#P = :val</code>\\n               </p>\\n            </li>\\n         </ul>\\n         <note>\\n            <p>Tokens that begin with the <b>:</b> character are <i>expression attribute values</i>, which are placeholders for the actual value at runtime.</p>\\n         </note>\\n         <p>For more information about expression attribute names, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.AccessingItemAttributes.html\\\">Specifying Item Attributes</a> in the <i>Amazon DynamoDB Developer\\n                Guide</i>.</p>\"\n          }\n        },\n        \"ExpressionAttributeValues\": {\n          \"target\": \"com.amazonaws.dynamodb#ExpressionAttributeValueMap\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>One or more values that can be substituted in an expression.</p>\\n         <p>Use the <b>:</b> (colon) character in an expression to\\n            dereference an attribute value. For example, suppose that you wanted to check whether\\n            the value of the <code>ProductStatus</code> attribute was one of the following: </p>\\n         <p>\\n            <code>Available | Backordered | Discontinued</code>\\n         </p>\\n         <p>You would first need to specify <code>ExpressionAttributeValues</code> as follows:</p>\\n         <p>\\n            <code>{ \\\":avail\\\":{\\\"S\\\":\\\"Available\\\"}, \\\":back\\\":{\\\"S\\\":\\\"Backordered\\\"}, \\\":disc\\\":{\\\"S\\\":\\\"Discontinued\\\"} }</code>\\n         </p>\\n         <p>You could then use these values in an expression, such as this:</p>\\n         <p>\\n            <code>ProductStatus IN (:avail, :back, :disc)</code>\\n         </p>\\n        <p>For more information on expression attribute values, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Expressions.SpecifyingConditions.html\\\">Condition Expressions</a> in the <i>Amazon DynamoDB Developer\\n                Guide</i>.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents the input of an <code>UpdateItem</code> operation.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#UpdateItemOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Attributes\": {\n          \"target\": \"com.amazonaws.dynamodb#AttributeMap\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A map of attribute values as they appear before or after the <code>UpdateItem</code>\\n            operation, as determined by the <code>ReturnValues</code> parameter.</p>\\n        <p>The <code>Attributes</code> map is only present if <code>ReturnValues</code> was\\n            specified as something other than <code>NONE</code> in the request. Each element\\n            represents one attribute.</p>\"\n          }\n        },\n        \"ConsumedCapacity\": {\n          \"target\": \"com.amazonaws.dynamodb#ConsumedCapacity\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The capacity units consumed by the <code>UpdateItem</code> operation. The data returned includes the total\\n            provisioned throughput consumed, along with statistics for the table and any indexes involved\\n            in the operation. <code>ConsumedCapacity</code> is only returned if the <code>ReturnConsumedCapacity</code> parameter was specified.\\n            For more information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ProvisionedThroughputIntro.html\\\">Provisioned\\n                Throughput</a> in the <i>Amazon DynamoDB Developer Guide</i>.</p>\"\n          }\n        },\n        \"ItemCollectionMetrics\": {\n          \"target\": \"com.amazonaws.dynamodb#ItemCollectionMetrics\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Information about item collections, if any, that were affected by the\\n            <code>UpdateItem</code> operation.\\n            <code>ItemCollectionMetrics</code> is only returned if the <code>ReturnItemCollectionMetrics</code> parameter was specified. If the table\\n            does not have any local secondary indexes, this information is not\\n            returned in the response.</p>\\n        <p>Each <code>ItemCollectionMetrics</code>\\n            element consists of:</p>\\n        <ul>\\n            <li>\\n                <p>\\n                    <code>ItemCollectionKey</code> - The partition key value of the item\\n                    collection. This is the same as the partition key value of the item itself.</p>\\n            </li>\\n            <li>\\n                <p>\\n                    <code>SizeEstimateRangeGB</code> - An estimate of item collection size,\\n                    in gigabytes. This value is a two-element array\\n                    containing a lower bound and an upper bound for the\\n                    estimate. The estimate includes the size of all the\\n                    items in the table, plus the size of all attributes\\n                    projected into all of the local secondary indexes on that\\n                    table. Use this estimate to measure whether a local secondary index is approaching its size limit.</p>\\n                <p>The estimate is subject to change over time; therefore, do not rely on the precision or accuracy of the estimate.</p>\\n            </li>\\n         </ul>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents the output of an <code>UpdateItem</code> operation.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#UpdateReplicationGroupMemberAction\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"RegionName\": {\n          \"target\": \"com.amazonaws.dynamodb#RegionName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Region where the replica exists.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"KMSMasterKeyId\": {\n          \"target\": \"com.amazonaws.dynamodb#KMSMasterKeyId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The AWS KMS customer master key (CMK) of the replica that should be used for AWS KMS encryption.\\n         To specify a CMK, use its key ID, Amazon Resource Name (ARN), alias name, or alias\\n         ARN. Note that you should only provide this parameter if the key is different from\\n         the default DynamoDB KMS master key alias/aws/dynamodb.</p>\"\n          }\n        },\n        \"ProvisionedThroughputOverride\": {\n          \"target\": \"com.amazonaws.dynamodb#ProvisionedThroughputOverride\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Replica-specific provisioned throughput. If not specified, uses the source table's\\n         provisioned throughput settings.</p>\"\n          }\n        },\n        \"GlobalSecondaryIndexes\": {\n          \"target\": \"com.amazonaws.dynamodb#ReplicaGlobalSecondaryIndexList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Replica-specific global secondary index settings.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents a replica to be modified.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#UpdateTable\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.dynamodb#UpdateTableInput\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.dynamodb#UpdateTableOutput\"\n      },\n      \"errors\": [\n        {\n          \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#InvalidEndpointException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#LimitExceededException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#ResourceInUseException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#ResourceNotFoundException\"\n        }\n      ],\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Modifies the provisioned throughput settings, global secondary indexes, or DynamoDB Streams settings for a given table.</p>\\n         <p>You can only perform one of the following operations at once:</p>\\n         <ul>\\n            <li>\\n               <p>Modify the provisioned throughput settings of the table.</p>\\n            </li>\\n            <li>\\n               <p>Enable or disable DynamoDB Streams on the table.</p>\\n            </li>\\n            <li>\\n               <p>Remove a global secondary index from the table.</p>\\n            </li>\\n            <li>\\n               <p>Create a new global secondary index on the table. After the index begins\\n                    backfilling, you can use <code>UpdateTable</code> to perform other\\n                    operations.</p>\\n            </li>\\n         </ul>\\n         <p>\\n            <code>UpdateTable</code> is an asynchronous operation; while it is executing, the table status\\n      changes from <code>ACTIVE</code> to <code>UPDATING</code>. While it is <code>UPDATING</code>,\\n      you cannot issue another <code>UpdateTable</code> request. When the table returns to the\\n        <code>ACTIVE</code> state, the <code>UpdateTable</code> operation is complete.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#UpdateTableInput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"AttributeDefinitions\": {\n          \"target\": \"com.amazonaws.dynamodb#AttributeDefinitions\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>An array of attributes that describe the key schema for the table and indexes. If you are adding a new global secondary index to the table, <code>AttributeDefinitions</code> must include the key element(s) of the new index.</p>\"\n          }\n        },\n        \"TableName\": {\n          \"target\": \"com.amazonaws.dynamodb#TableName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the table to be updated.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"BillingMode\": {\n          \"target\": \"com.amazonaws.dynamodb#BillingMode\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Controls how you are charged for read and write throughput and how you manage capacity. \\n      When switching from pay-per-request to provisioned capacity, initial provisioned capacity values must be set. The initial\\n      provisioned capacity values are estimated based on the consumed read and write capacity of your table and global secondary indexes \\n      over the past 30 minutes.</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>PROVISIONED</code> - We recommend using <code>PROVISIONED</code> for predictable workloads. <code>PROVISIONED</code> sets the billing mode to <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.ReadWriteCapacityMode.html#HowItWorks.ProvisionedThroughput.Manual\\\">Provisioned Mode</a>.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>PAY_PER_REQUEST</code> - We recommend using <code>PAY_PER_REQUEST</code> for unpredictable workloads. <code>PAY_PER_REQUEST</code> sets the billing mode to <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/HowItWorks.ReadWriteCapacityMode.html#HowItWorks.OnDemand\\\">On-Demand Mode</a>.\\n            </p>\\n            </li>\\n         </ul>\"\n          }\n        },\n        \"ProvisionedThroughput\": {\n          \"target\": \"com.amazonaws.dynamodb#ProvisionedThroughput\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The new provisioned throughput settings for the specified table or index.</p>\"\n          }\n        },\n        \"GlobalSecondaryIndexUpdates\": {\n          \"target\": \"com.amazonaws.dynamodb#GlobalSecondaryIndexUpdateList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>An array of one or more global secondary indexes for the table. For each index in the array, you can request one action:</p>\\n         <ul>\\n            <li>\\n               <p>\\n                  <code>Create</code> - add a new global secondary index to the table.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>Update</code> - modify the provisioned throughput settings of an existing global secondary index.</p>\\n            </li>\\n            <li>\\n               <p>\\n                  <code>Delete</code> - remove a global secondary index from the table.</p>\\n            </li>\\n         </ul>\\n         <p>You can create or delete only one global secondary index per <code>UpdateTable</code> operation.</p>\\n         <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GSI.OnlineOps.html\\\">Managing Global Secondary\\n        Indexes</a> in the <i>Amazon DynamoDB Developer Guide</i>. </p>\"\n          }\n        },\n        \"StreamSpecification\": {\n          \"target\": \"com.amazonaws.dynamodb#StreamSpecification\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Represents the DynamoDB Streams configuration for the table.</p>\\n         <note>\\n            <p>You receive a <code>ResourceInUseException</code> if you try to enable a stream on a\\n                table that already has a stream, or if you try to disable a stream on a table that\\n                doesn't have a stream.</p>\\n         </note>\"\n          }\n        },\n        \"SSESpecification\": {\n          \"target\": \"com.amazonaws.dynamodb#SSESpecification\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The new server-side encryption settings for the specified table.</p>\"\n          }\n        },\n        \"ReplicaUpdates\": {\n          \"target\": \"com.amazonaws.dynamodb#ReplicationGroupUpdateList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A list of replica update actions (create, delete, or update) for the table.</p>\\n         <note>\\n            <p>This property only applies to <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/globaltables.V2.html\\\">Version 2019.11.21</a> of global tables.</p>\\n         </note>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents the input of an <code>UpdateTable</code> operation.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#UpdateTableOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"TableDescription\": {\n          \"target\": \"com.amazonaws.dynamodb#TableDescription\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Represents the properties of the table.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents the output of an <code>UpdateTable</code> operation.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#UpdateTableReplicaAutoScaling\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.dynamodb#UpdateTableReplicaAutoScalingInput\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.dynamodb#UpdateTableReplicaAutoScalingOutput\"\n      },\n      \"errors\": [\n        {\n          \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#LimitExceededException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#ResourceInUseException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#ResourceNotFoundException\"\n        }\n      ],\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Updates auto scaling settings on your global tables at once.</p>\\n         <note>\\n            <p>This operation only applies to <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/globaltables.V2.html\\\">Version 2019.11.21</a> of global tables.</p>\\n         </note>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#UpdateTableReplicaAutoScalingInput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"GlobalSecondaryIndexUpdates\": {\n          \"target\": \"com.amazonaws.dynamodb#GlobalSecondaryIndexAutoScalingUpdateList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Represents the auto scaling settings of the global secondary indexes of the replica\\n          to be updated.</p>\"\n          }\n        },\n        \"TableName\": {\n          \"target\": \"com.amazonaws.dynamodb#TableName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the global table to be updated.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"ProvisionedWriteCapacityAutoScalingUpdate\": {\n          \"target\": \"com.amazonaws.dynamodb#AutoScalingSettingsUpdate\"\n        },\n        \"ReplicaUpdates\": {\n          \"target\": \"com.amazonaws.dynamodb#ReplicaAutoScalingUpdateList\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Represents the auto scaling settings of replicas of the table that will be\\n           modified.</p>\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#UpdateTableReplicaAutoScalingOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"TableAutoScalingDescription\": {\n          \"target\": \"com.amazonaws.dynamodb#TableAutoScalingDescription\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Returns information about the auto scaling settings of a table with replicas.</p>\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#UpdateTimeToLive\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.dynamodb#UpdateTimeToLiveInput\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.dynamodb#UpdateTimeToLiveOutput\"\n      },\n      \"errors\": [\n        {\n          \"target\": \"com.amazonaws.dynamodb#InternalServerError\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#InvalidEndpointException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#LimitExceededException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#ResourceInUseException\"\n        },\n        {\n          \"target\": \"com.amazonaws.dynamodb#ResourceNotFoundException\"\n        }\n      ],\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>The <code>UpdateTimeToLive</code> method enables or disables Time to Live (TTL) for the\\n            specified table. A successful <code>UpdateTimeToLive</code> call returns the current\\n                <code>TimeToLiveSpecification</code>. It can take up to one hour for the change to\\n            fully process. Any additional <code>UpdateTimeToLive</code> calls for the same table\\n            during this one hour duration result in a <code>ValidationException</code>. </p>\\n         <p>TTL compares the current time in epoch time format to the time stored in the TTL\\n            attribute of an item. If the epoch time value stored in the attribute is less than the\\n            current time, the item is marked as expired and subsequently deleted.</p>\\n        <note>\\n            <p> The epoch time format is the number of seconds elapsed since 12:00:00 AM January 1,\\n                1970 UTC. </p>\\n        </note>\\n        <p>DynamoDB deletes expired items on a best-effort basis to ensure availability of\\n            throughput for other data operations.\\n        </p>\\n            <important>\\n                <p>DynamoDB typically deletes expired items within two days of expiration. The exact duration\\n                within which an item gets deleted after expiration is specific to the\\n                nature of the workload. Items that have expired and not been deleted will still show up in reads,\\n                    queries, and scans.</p>\\n            </important>\\n        <p>As items are deleted, they are removed from any local secondary index and global\\n            secondary index immediately in the same eventually consistent way as a standard delete\\n            operation.</p>\\n        <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/TTL.html\\\">Time To Live</a> in the Amazon DynamoDB Developer Guide. </p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#UpdateTimeToLiveInput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"TableName\": {\n          \"target\": \"com.amazonaws.dynamodb#TableName\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The name of the table to be configured.</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"TimeToLiveSpecification\": {\n          \"target\": \"com.amazonaws.dynamodb#TimeToLiveSpecification\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Represents the settings used to enable or disable Time to Live for the specified table.</p>\",\n            \"smithy.api#required\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents the input of an <code>UpdateTimeToLive</code> operation.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#UpdateTimeToLiveOutput\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"TimeToLiveSpecification\": {\n          \"target\": \"com.amazonaws.dynamodb#TimeToLiveSpecification\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Represents the output of an <code>UpdateTimeToLive</code> operation.</p>\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.dynamodb#WriteRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"PutRequest\": {\n          \"target\": \"com.amazonaws.dynamodb#PutRequest\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A request to perform a <code>PutItem</code> operation.</p>\"\n          }\n        },\n        \"DeleteRequest\": {\n          \"target\": \"com.amazonaws.dynamodb#DeleteRequest\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A request to perform a <code>DeleteItem</code> operation.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Represents an operation to perform - either <code>DeleteItem</code> or\\n            <code>PutItem</code>. You can only request one of these operations, not both, in a\\n         single <code>WriteRequest</code>. If you do need to perform both of these operations, you\\n         need to provide two separate <code>WriteRequest</code> objects.</p>\"\n      }\n    },\n    \"com.amazonaws.dynamodb#WriteRequests\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.dynamodb#WriteRequest\"\n      },\n      \"traits\": {\n        \"smithy.api#length\": {\n          \"min\": 1,\n          \"max\": 25\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "codegen-client-test/model/endpoint-rules.smithy",
    "content": "$version: \"1.0\"\n\nnamespace aws.protocoltests.json\n\nuse smithy.rules#endpointRuleSet\nuse smithy.rules#endpointTests\n\nuse smithy.rules#clientContextParams\nuse smithy.rules#staticContextParams\nuse smithy.rules#contextParam\nuse aws.protocols#awsJson1_1\n\n@awsJson1_1\n@endpointRuleSet({\n    \"version\": \"1.0\",\n    \"rules\": [{\n                  \"type\": \"endpoint\",\n                  \"conditions\": [],\n                  \"endpoint\": { \"url\": \"https://www.example.com\" }\n              }],\n    \"parameters\": {\n        \"Bucket\": { \"required\": false, \"type\": \"String\" },\n    }\n})\nservice TestService {\n    operations: [TestOperation]\n}\n\noperation TestOperation {\n    input: TestOperationInput\n}\n\nstructure TestOperationInput {\n    @contextParam(name: \"Bucket\")\n    bucket: String\n}\n"
  },
  {
    "path": "codegen-client-test/model/error-correction-nullability-test.smithy",
    "content": "$version: \"2.0\"\n\n\nnamespace aws.protocoltests.json\n\nuse aws.protocols#awsJson1_0\nuse aws.protocols#restXml\nuse smithy.test#httpResponseTests\n\n@awsJson1_0\nservice RequiredValueJson {\n    operations: [SayHello],\n    version: \"1\"\n}\n\n\n@restXml\nservice RequiredValueXml {\n    operations: [SayHelloXml],\n    version: \"1\"\n}\n\n@error(\"client\")\nstructure Error {\n    @required\n    requestId: String\n\n    @required\n    message: String\n}\n\n@http(method: \"POST\", uri: \"/\")\noperation SayHello { output: TestOutputDocument, errors: [Error] }\n\n@http(method: \"POST\", uri: \"/\")\noperation SayHelloXml { output: TestOutput, errors: [Error] }\n\nstructure TestOutputDocument with [TestStruct] { innerField: Nested, @required document: Document }\nstructure TestOutput with [TestStruct] { innerField: Nested }\n\n@mixin\nstructure TestStruct {\n    @required\n    foo: String,\n    @required\n    byteValue: Byte,\n    @required\n    listValue: StringList,\n    @required\n    mapValue: ListMap,\n    @required\n    doubleListValue: DoubleList\n    @required\n    nested: Nested\n    @required\n    blob: Blob\n    @required\n    enum: Enum\n    @required\n    union: U\n    notRequired: String\n}\n\nenum Enum {\n    A,\n    B,\n    C\n}\nunion U {\n    A: Integer,\n    B: String,\n    C: Unit\n}\n\nstructure Nested {\n    @required\n    a: String\n}\n\nlist StringList {\n    member: String\n}\n\nlist DoubleList {\n    member: StringList\n}\n\nmap ListMap {\n    key: String,\n    value: StringList\n}\n\napply SayHello @httpResponseTests([{\n                                         id: \"error_recovery_json\",\n                                         protocol: awsJson1_0,\n                                         params: {\n                                             union: { A: 5 },\n                                             enum: \"A\",\n                                             foo: \"\",\n                                             byteValue: 0,\n                                             blob: \"\",\n                                             listValue: [],\n                                             mapValue: {},\n                                             doubleListValue: []\n                                             document: {}\n                                             nested: { a: \"\" }\n                                         },\n                                         code: 200,\n                                         body: \"{\\\"union\\\": { \\\"A\\\": 5 }, \\\"enum\\\": \\\"A\\\" }\"\n                                     }])\n\napply SayHelloXml @httpResponseTests([{\n                                       id: \"error_recovery_xml\",\n                                       protocol: restXml,\n                                       params: {\n                                           union: { A: 5 },\n                                           enum: \"A\",\n                                           foo: \"\",\n                                           byteValue: 0,\n                                           blob: \"\",\n                                           listValue: [],\n                                           mapValue: {},\n                                           doubleListValue: []\n                                           nested: { a: \"\" }\n                                       },\n                                       code: 200,\n                                       body: \"<TestOutput><union><A>5</A></union><enum>A</enum></TestOutput>\"\n                                   }])\n"
  },
  {
    "path": "codegen-client-test/model/main.smithy",
    "content": "$version: \"1.0\"\nnamespace example.weather\n\nuse smithy.test#httpRequestTests\nuse smithy.test#httpResponseTests\nuse aws.protocols#awsJson1_1\n\n\n/// Provides weather forecasts.\n@paginated(inputToken: \"nextToken\", outputToken: \"nextToken\", pageSize: \"pageSize\")\n@awsJson1_1\nservice Weather {\n    version: \"2006-03-01\",\n    resources: [City],\n    operations: [GetCurrentTime]\n}\n\nresource City {\n    identifiers: { cityId: CityId },\n    read: GetCity,\n    list: ListCities,\n    resources: [Forecast, CityImage],\n}\n\nresource Forecast {\n    identifiers: { cityId: CityId },\n    read: GetForecast,\n}\n\nresource CityImage {\n    identifiers: { cityId: CityId },\n    read: GetCityImage,\n}\n\n// \"pattern\" is a trait.\n@pattern(\"^[A-Za-z0-9 ]+$\")\nstring CityId\n\n@readonly\n@http(method: \"GET\", uri: \"/cities/{cityId}\")\noperation GetCity {\n    input: GetCityInput,\n    output: GetCityOutput,\n    errors: [NoSuchResource]\n}\n\n// Tests that HTTP protocol tests are generated.\napply GetCity @httpRequestTests([\n    {\n        id: \"WriteGetCityAssertions\",\n        documentation: \"Does something\",\n        protocol: \"aws.protocols#awsJson1_1\",\n        method: \"GET\",\n        uri: \"/cities/123\",\n        body: \"\",\n        params: {\n            cityId: \"123\"\n        }\n    }\n])\n\napply GetCity @httpResponseTests([\n    {\n        id: \"WriteGetCityResponseAssertions\",\n        documentation: \"Does something\",\n        protocol: \"aws.protocols#awsJson1_1\",\n        code: 200,\n        body: \"\"\"\n            {\n                \"name\": \"Seattle\",\n                \"coordinates\": {\n                    \"latitude\": 12.34,\n                    \"longitude\": -56.78\n                },\n                \"city\": {\n                    \"cityId\": \"123\",\n                    \"name\": \"Seattle\",\n                    \"number\": \"One\",\n                    \"case\": \"Upper\"\n                }\n            }\"\"\",\n        bodyMediaType: \"application/json\",\n        params: {\n            name: \"Seattle\",\n            coordinates: {\n                latitude: 12.34,\n                longitude: -56.78\n            },\n            city: {\n                cityId: \"123\",\n                name: \"Seattle\",\n                number: \"One\",\n                case: \"Upper\"\n            }\n        }\n    }\n])\n\n/// The input used to get a city.\nstructure GetCityInput {\n    // \"cityId\" provides the identifier for the resource and\n    // has to be marked as required.\n    @required\n    @httpLabel\n    cityId: CityId\n}\n\nstructure GetCityOutput {\n    // \"required\" is used on output to indicate if the service\n    // will always provide a value for the member.\n    @required\n    name: String,\n\n    @required\n    coordinates: CityCoordinates,\n\n    city: CitySummary,\n}\n\n// This structure is nested within GetCityOutput.\nstructure CityCoordinates {\n    @required\n    latitude: PrimitiveFloat,\n\n    @required\n    longitude: Float,\n}\n\n/// Error encountered when no resource could be found.\n@error(\"client\")\n@httpError(404)\nstructure NoSuchResource {\n    /// The type of resource that was not found.\n    @required\n    resourceType: String,\n\n    message: String,\n}\n\napply NoSuchResource @httpResponseTests([\n    {\n        id: \"WriteNoSuchResourceAssertions\",\n        documentation: \"Does something\",\n        protocol: \"aws.protocols#awsJson1_1\",\n        code: 404,\n        body: \"\"\"\n            {\n                \"resourceType\": \"City\",\n                \"message\": \"Your custom message\"\n            }\"\"\",\n        bodyMediaType: \"application/json\",\n        params: {\n            resourceType: \"City\",\n            message: \"Your custom message\"\n        }\n    }\n])\n\n// The paginated trait indicates that the operation may\n// return truncated results.\n@readonly\n@paginated(items: \"items\")\n@http(method: \"GET\", uri: \"/cities\")\noperation ListCities {\n    input: ListCitiesInput,\n    output: ListCitiesOutput\n}\n\napply ListCities @httpRequestTests([\n    {\n        id: \"WriteListCitiesAssertions\",\n        documentation: \"Does something\",\n        protocol: \"aws.protocols#awsJson1_1\",\n        method: \"GET\",\n        uri: \"/cities\",\n        body: \"\",\n        queryParams: [\"pageSize=50\"],\n        forbidQueryParams: [\"nextToken\"],\n        params: {\n            pageSize: 50\n        }\n    }\n])\n\nstructure ListCitiesInput {\n    @httpQuery(\"nextToken\")\n    nextToken: String,\n\n    @httpQuery(\"pageSize\")\n    pageSize: Integer\n}\n\nstructure ListCitiesOutput {\n    nextToken: String,\n\n    @required\n    items: CitySummaries,\n}\n\n// CitySummaries is a list of CitySummary structures.\nlist CitySummaries {\n    member: CitySummary\n}\n\n// CitySummary contains a reference to a City.\n@references([{resource: City}])\nstructure CitySummary {\n    @required\n    cityId: CityId,\n\n    @required\n    name: String,\n\n    number: String,\n    case: String,\n}\n\n@readonly\n@http(method: \"GET\", uri: \"/current-time\")\noperation GetCurrentTime {\n    output: GetCurrentTimeOutput\n}\n\nstructure GetCurrentTimeOutput {\n    @required\n    time: Timestamp\n}\n\n@readonly\n@http(method: \"GET\", uri: \"/cities/{cityId}/forecast\")\noperation GetForecast {\n    input: GetForecastInput,\n    output: GetForecastOutput\n}\n\n// \"cityId\" provides the only identifier for the resource since\n// a Forecast doesn't have its own.\nstructure GetForecastInput {\n    @required\n    @httpLabel\n    cityId: CityId,\n}\n\nstructure GetForecastOutput {\n    chanceOfRain: Float,\n    snow: SimpleYesNo,\n}\n\nunion Precipitation {\n    rain: PrimitiveBoolean,\n    sleet: PrimitiveBoolean,\n    hail: StringMap,\n    snow: SimpleYesNo,\n    mixed: TypedYesNo,\n    other: OtherStructure,\n    blob: Blob,\n    baz: example.weather.nested.more#Baz,\n}\n\nstructure OtherStructure {}\n\n@enum([{value: \"YES\"}, {value: \"NO\"}])\nstring SimpleYesNo\n\n@enum([{value: \"Yes\", name: \"YES\"}, {value: \"No\", name: \"NO\"}])\nstring TypedYesNo\n\nmap StringMap {\n    key: String,\n    value: String,\n}\n\n@readonly\n@http(method: \"GET\", uri: \"/cities/{cityId}/image\")\noperation GetCityImage {\n    input: GetCityImageInput,\n    output: GetCityImageOutput,\n    errors: [NoSuchResource]\n}\n\nstructure GetCityImageInput {\n    @required @httpLabel\n    cityId: CityId,\n}\n\nstructure GetCityImageOutput {\n    @httpPayload\n    image: CityImageData,\n}\n\n@streaming\nblob CityImageData\n"
  },
  {
    "path": "codegen-client-test/model/more-nesting.smithy",
    "content": "$version: \"1.0\"\nnamespace example.weather.nested.more\n\nstructure Baz {\n  baz: String,\n  bar: String,\n}\n"
  },
  {
    "path": "codegen-client-test/model/nested.smithy",
    "content": "$version: \"1.0\"\nnamespace example.weather.nested\n\nstructure Foo {\n  baz: String,\n  bar: String,\n}\n"
  },
  {
    "path": "codegen-client-test/model/rest-xml-extras.smithy",
    "content": "$version: \"2.0\"\nnamespace aws.protocoltests.restxml\n\nuse aws.protocols#restXml\nuse aws.api#service\nuse smithy.test#httpResponseTests\nuse smithy.test#httpRequestTests\n\n\n/// A REST XML service that sends XML requests and responses.\n@service(sdkId: \"Rest XML Protocol\")\n@restXml\nservice RestXmlExtras {\n    version: \"2019-12-16\",\n    operations: [\n        AttributeParty,\n        XmlMapsFlattenedNestedXmlNamespace,\n        EnumKeys,\n        PrimitiveIntOpXml,\n        ChecksumRequired,\n        StringHeader,\n        CreateFoo,\n        RequiredMember,\n    ]\n}\n\n/// This operation triggers a name collision between the synthetic `CreateFooInput` and `CreateFooInput`\n@http(uri: \"/reused-input\", method: \"POST\")\noperation CreateFoo {\n    input: CreateFooRequest,\n}\n\nstructure CreateFooRequest {\n    input: CreateFooInput\n}\n\nstructure CreateFooInput {}\n\n@httpRequestTests([{\n    id: \"RestXmlSerPrimitiveIntUnset\",\n    protocol: \"aws.protocols#restXml\",\n    documentation: \"Primitive ints should not be serialized when they are unset\",\n    uri: \"/primitive-document\",\n    method: \"POST\",\n   body: \"\"\"\n        <PrimitiveIntDocument>\n        </PrimitiveIntDocument>\n    \"\"\",\n    bodyMediaType: \"application/xml\",\n    params: { }\n}, {\n       id: \"RestXmlSerPrimitiveIntSetToDefault\",\n       protocol: \"aws.protocols#restXml\",\n       documentation: \"Primitive ints should not be serialized when they are unset\",\n       uri: \"/primitive-document\",\n       method: \"POST\",\n       body: \"\"\"\n       <PrimitiveIntDocument>\n            <value>1</value>\n       </PrimitiveIntDocument>\n       \"\"\",\n       bodyMediaType: \"application/xml\",\n       params: { value: 1 }\n   }])\n@http(uri: \"/primitive-document\", method: \"POST\")\noperation PrimitiveIntOpXml {\n    input: PrimitiveIntDocument,\n    output: PrimitiveIntDocument\n}\n\nstructure PrimitiveIntDocument {\n    value: PrimitiveInt\n    @default(0)\n    defaultedValue: PrimitiveInt\n}\n\ninteger PrimitiveInt\n\nstructure AttributePartyInputOutput {\n    @xmlAttribute\n    enum: StringEnum,\n\n    @xmlAttribute\n    @xmlName(\"prefix:anumber\")\n    number: PrimitiveInt,\n\n    @xmlAttribute\n    ts: Timestamp,\n\n    @xmlAttribute\n    bool: Boolean\n}\n\nstructure XmlMapEnumKeys {\n    data: EnumKeyMap\n}\n\nmap EnumKeyMap {\n    key: StringEnum,\n    value: String\n}\n\n@httpResponseTests([{\n    id: \"DeserEnumMap\",\n    code: 200,\n    body: \"<XmlMapEnumKeys><data><entry><key>enumvalue</key><value>hello</value></entry></data></XmlMapEnumKeys>\",\n    params: {\n        data: { \"enumvalue\": \"hello\" }\n    },\n    bodyMediaType: \"application/xml\",\n    protocol: \"aws.protocols#restXml\"\n}])\n@httpRequestTests([{\n    id: \"SerEnumMap\",\n    method: \"POST\",\n    body: \"<XmlMapEnumKeys><data><entry><key>enumvalue</key><value>hello</value></entry></data></XmlMapEnumKeys>\",\n    uri: \"/enumkeys\",\n    bodyMediaType: \"application/xml\",\n    params: {\n        data: { \"enumvalue\": \"hello\" }\n    },\n    protocol: \"aws.protocols#restXml\"\n}])\n@http(uri: \"/enumkeys\", method: \"POST\")\noperation EnumKeys {\n    input: XmlMapEnumKeys,\n    output: XmlMapEnumKeys\n}\n\n@httpResponseTests([{\n        id: \"DeserAttributes\",\n        code: 200,\n        body: \"<AttributePartyInputOutput enum=\\\"enumvalue\\\" prefix:anumber=\\\"5\\\" ts=\\\"1985-04-12T23:20:50.00Z\\\" bool=\\\"true\\\"/>\",\n        params: {\n            enum: \"enumvalue\",\n            number: 5,\n            ts: 482196050,\n            bool: true\n        },\n        protocol: \"aws.protocols#restXml\"\n\n}])\n@http(uri: \"/AttributeParty\", method: \"POST\")\noperation AttributeParty {\n    output: AttributePartyInputOutput\n}\n\n@httpResponseTests([{\n        id: \"DeserFlatNamespaceMaps\",\n        code: 200,\n        body: \"<XmlMapsFlattenedNestedXmlNamespaceInputOutput xmlns=\\\"http://aoo.com\\\"><myMap><yek xmlns=\\\"http://doo.com\\\">map2</yek><eulav xmlns=\\\"http://eoo.com\\\"><entry><K xmlns=\\\"http://goo.com\\\">third</K><V xmlns=\\\"http://hoo.com\\\">plz</V></entry><entry><K xmlns=\\\"http://goo.com\\\">fourth</K><V xmlns=\\\"http://hoo.com\\\">onegai</V></entry></eulav></myMap><myMap><yek xmlns=\\\"http://doo.com\\\">map1</yek><eulav xmlns=\\\"http://eoo.com\\\"><entry><K xmlns=\\\"http://goo.com\\\">second</K><V xmlns=\\\"http://hoo.com\\\">konnichiwa</V></entry><entry><K xmlns=\\\"http://goo.com\\\">first</K><V xmlns=\\\"http://hoo.com\\\">hi</V></entry></eulav></myMap></XmlMapsFlattenedNestedXmlNamespaceInput>\",\n        params: {\n            \"myMap\": {\n                \"map2\": {\"fourth\": \"onegai\", \"third\": \"plz\" },\n                \"map1\": {\"second\": \"konnichiwa\", \"first\": \"hi\" }\n            }\n        },\n        protocol: \"aws.protocols#restXml\"\n}])\n@http(uri: \"/XmlMapsFlattenedNestedXmlNamespace\", method: \"POST\")\noperation XmlMapsFlattenedNestedXmlNamespace {\n    input: XmlMapsFlattenedNestedXmlNamespaceInputOutput,\n    output: XmlMapsFlattenedNestedXmlNamespaceInputOutput\n}\n\n@xmlNamespace(uri: \"http://aoo.com\")\nstructure XmlMapsFlattenedNestedXmlNamespaceInputOutput {\n    @xmlNamespace(uri: \"http://boo.com\")\n    @xmlFlattened\n    myMap: XmlMapsNestedNamespaceInputOutputMap,\n}\n\n@xmlNamespace(uri: \"http://coo.com\")\nmap XmlMapsNestedNamespaceInputOutputMap {\n    @xmlNamespace(uri: \"http://doo.com\")\n    @xmlName(\"yek\")\n    key: String,\n\n    @xmlNamespace(uri: \"http://eoo.com\")\n    @xmlName(\"eulav\")\n    value: XmlMapsNestedNestedNamespaceInputOutputMap\n}\n\n@xmlNamespace(uri: \"http://foo.com\")\nmap XmlMapsNestedNestedNamespaceInputOutputMap {\n    @xmlNamespace(uri: \"http://goo.com\")\n    @xmlName(\"K\")\n    key: String,\n\n    @xmlNamespace(uri: \"http://hoo.com\")\n    @xmlName(\"V\")\n    value: String\n}\n\n@httpRequestTests([{\n    id: \"ChecksumRequiredHeader\",\n    method: \"POST\",\n    body: \"<ChecksumRequiredInput><field>hello</field></ChecksumRequiredInput>\",\n    uri: \"/ChecksumRequired\",\n    bodyMediaType: \"application/xml\",\n    params: {\n        field: \"hello\"\n    },\n    headers: { \"Content-Md5\": \"JAJAqYA61wMhATGeQqRcMQ==\" },\n    protocol: \"aws.protocols#restXml\"\n}])\n@httpChecksumRequired\n@http(uri: \"/ChecksumRequired\", method: \"POST\")\noperation ChecksumRequired {\n    input: ChecksumRequiredInput\n}\n\nstructure ChecksumRequiredInput {\n    field: String\n}\n\n\n@httpResponseTests([{\n    id: \"DeserHeaderStringCommas\",\n    code: 200,\n    documentation: \"\"\"\n    Regression test for https://github.com/awslabs/aws-sdk-rust/issues/122\n    where `,` was eagerly used to split fields in cases where the input was not\n    a list.\n    \"\"\",\n    body: \"\",\n    headers: { \"x-field\": \"a,b,c\" },\n    params: {\n        field: \"a,b,c\"\n    },\n    protocol: \"aws.protocols#restXml\"\n}])\n@http(uri: \"/StringHeader\", method: \"POST\")\noperation StringHeader {\n    output: StringHeaderOutput\n}\n\nstructure StringHeaderOutput {\n    @httpHeader(\"x-field\")\n    field: String,\n\n    @httpHeader(\"x-enum\")\n    enumHeader: StringEnum,\n}\n\n/// This operation tests that we can serialize `required` members.\n@http(uri: \"/required-member\", method: \"GET\")\noperation RequiredMember {\n    input: RequiredMemberInputOutput\n    output: RequiredMemberInputOutput\n}\n\nstructure RequiredMemberInputOutput {\n    @required\n    requiredString: String\n}\n"
  },
  {
    "path": "codegen-client-test/model/rest-xml-unwrapped-errors.smithy",
    "content": "// This file defines test cases that test error serialization.\n\n$version: \"1.0\"\n\nnamespace aws.protocoltests.restxmlunwrapped\n\nuse aws.protocols#restXml\nuse smithy.test#httpRequestTests\nuse smithy.test#httpResponseTests\nuse aws.api#service\n\n\n/// A REST XML service that sends XML requests and responses.\n@service(sdkId: \"Rest XML Protocol\")\n@restXml(noErrorWrapping: true)\nservice RestXmlExtrasUnwrappedErrors {\n    version: \"2019-12-16\",\n    operations: [GreetingWithUnwrappedErrors]\n}\n\n/// This operation has three possible return values:\n///\n/// 1. A successful response in the form of GreetingWithErrorsOutput\n/// 2. An InvalidGreeting error.\n/// 3. A BadRequest error.\n///\n/// Implementations must be able to successfully take a response and\n/// properly (de)serialize successful and error responses based on the\n/// the presence of the\n@idempotent\n@http(uri: \"/GreetingWithErrors\", method: \"PUT\")\noperation GreetingWithUnwrappedErrors {\n    output: GreetingWithErrorsOutput,\n    errors: [InvalidGreetingUnwrapped, ComplexErrorUnwrapped]\n}\n\napply GreetingWithUnwrappedErrors @httpResponseTests([\n    {\n        id: \"GreetingWithErrorsUnwrapped\",\n        documentation: \"Ensures that operations with errors successfully know how to deserialize the successful response\",\n        protocol: restXml,\n        code: 200,\n        body: \"\",\n        headers: {\n            \"X-Greeting\": \"Hello\"\n        },\n        params: {\n            greeting: \"Hello\"\n        }\n    }\n])\n\nstructure GreetingWithErrorsOutput {\n    @httpHeader(\"X-Greeting\")\n    greeting: String,\n}\n\n/// This error is thrown when an invalid greeting value is provided.\n@error(\"client\")\n@httpError(400)\nstructure InvalidGreetingUnwrapped {\n    Message: String,\n}\n\napply InvalidGreetingUnwrapped @httpResponseTests([\n    {\n        id: \"InvalidGreetingErrorUnwrapped\",\n        documentation: \"Parses simple XML errors\",\n        protocol: restXml,\n        params: {\n            Message: \"Hi\"\n        },\n        code: 400,\n        headers: {\n            \"Content-Type\": \"application/xml\"\n        },\n        body: \"\"\"\n                 <Error>\n                    <Type>Sender</Type>\n                    <Code>InvalidGreetingUnwrapped</Code>\n                    <Message>Hi</Message>\n                    <AnotherSetting>setting</AnotherSetting>\n                    <RequestId>foo-id</RequestId>\n                 </Error>\n              \"\"\",\n        bodyMediaType: \"application/xml\",\n    }\n])\n\n/// This error is thrown when a request is invalid.\n@error(\"client\")\n@httpError(403)\nstructure ComplexErrorUnwrapped {\n    // Errors support HTTP bindings!\n    @httpHeader(\"X-Header\")\n    Header: String,\n\n    TopLevel: String,\n\n    Nested: ComplexNestedErrorData,\n}\n\napply ComplexErrorUnwrapped @httpResponseTests([\n    {\n        id: \"ComplexErrorUnwrapped\",\n        protocol: restXml,\n        params: {\n            Header: \"Header\",\n            TopLevel: \"Top level\",\n            Nested: {\n                Foo: \"bar\"\n            }\n        },\n        code: 400,\n        headers: {\n            \"Content-Type\": \"application/xml\",\n            \"X-Header\": \"Header\",\n        },\n        body: \"\"\"\n                 <Error>\n                    <Type>Sender</Type>\n                    <Code>ComplexErrorUnwrapped</Code>\n                    <Message>Hi</Message>\n                    <TopLevel>Top level</TopLevel>\n                    <Nested>\n                        <Foo>bar</Foo>\n                    </Nested>\n                 <RequestId>foo-id</RequestId>\n                 </Error>\n              \"\"\",\n        bodyMediaType: \"application/xml\",\n    }\n])\n\nstructure ComplexNestedErrorData {\n    Foo: String,\n}\n"
  },
  {
    "path": "codegen-core/build.gradle.kts",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport java.io.ByteArrayOutputStream\nimport java.util.Properties\n\nplugins {\n    id(\"smithy-rs.kotlin-conventions\")\n    id(\"smithy-rs.publishing-conventions\")\n}\n\ndescription = \"Common code generation logic for generating Rust code from Smithy models\"\nextra[\"displayName\"] = \"Smithy :: Rust :: CodegenCore\"\nextra[\"moduleName\"] = \"software.amazon.smithy.rust.codegen.core\"\n\ndependencies {\n    implementation(kotlin(\"stdlib-jdk8\"))\n    implementation(libs.jsoup)\n    api(libs.smithy.codegen.core)\n    api(libs.toml4j)\n    implementation(libs.jackson.dataformat.cbor)\n    implementation(libs.smithy.aws.traits)\n    implementation(libs.smithy.protocol.test.traits)\n    implementation(libs.smithy.waiters)\n    implementation(libs.smithy.protocol.traits)\n\n    implementation(project(\":rust-runtime\"))\n    testImplementation(libs.junit.jupiter)\n    testImplementation(libs.kotest.assertions.core.jvm)\n}\n\nfun gitCommitHash(): String {\n    // Use commit hash from env if provided, it is helpful to override commit hash in some contexts.\n    // For example: while generating diff for generated SDKs we don't want to see version diff,\n    // so we are overriding commit hash to something fixed\n    val commitHashFromEnv = System.getenv(\"SMITHY_RS_VERSION_COMMIT_HASH_OVERRIDE\")\n    if (commitHashFromEnv != null) {\n        return commitHashFromEnv\n    }\n\n    return try {\n        val output = ByteArrayOutputStream()\n        exec {\n            commandLine = listOf(\"git\", \"rev-parse\", \"HEAD\")\n            standardOutput = output\n        }\n        output.toString().trim()\n    } catch (ex: Exception) {\n        \"unknown\"\n    }\n}\n\n// Define the directory where the generated Kotlin file will be placed\nval generatedSrcDir = layout.buildDirectory.dir(\"generated/src/main/kotlin\")\n\nsourceSets {\n    main {\n        kotlin {\n            srcDir(generatedSrcDir)\n        }\n    }\n}\n\nval generateBuildEnvironmentConstants = tasks.register(\"generateBuildEnvironmentConstants\") {\n    // Specify that the task generates sources.\n    val outputDir = generatedSrcDir.get().asFile\n    outputs.dir(outputDir)\n\n    doLast {\n        // Load properties from `gradle.properties`.\n        val properties = Properties()\n        val gradlePropertiesFile = file(\"${rootDir}/gradle.properties\")\n        properties.load(gradlePropertiesFile.inputStream())\n\n        val rustMsrv = properties.getProperty(\"rust.msrv\")\n\n        // Generate the Kotlin file.\n        val generatedFile = file(\"$outputDir/BuildEnvironment.kt\")\n        generatedFile.writeText(\"\"\"\n            // This file is automatically generated. Do not modify manually.\n            package software.amazon.smithy.rust.codegen.core.generated\n\n            object BuildEnvironment {\n                const val MSRV: String = \"$rustMsrv\"\n                const val PROJECT_DIR: String = \"${rootDir.invariantSeparatorsPath}\"\n            }\n        \"\"\".trimIndent())\n    }\n}\n\nval generateSmithyRuntimeCrateVersion by tasks.registering {\n    // Generate the version of the runtime to use as a resource.\n    // This keeps us from having to manually change version numbers in multiple places.\n    val resourcesDir = layout.buildDirectory.dir(\"resources/main/software/amazon/smithy/rust/codegen/core\")\n    val versionsFile = resourcesDir.get().file(\"runtime-crate-versions.json\")\n    outputs.file(versionsFile)\n\n    val stableCrateVersion = project.properties[\"smithy.rs.runtime.crate.stable.version\"].toString()\n    val unstableCrateVersion = project.properties[\"smithy.rs.runtime.crate.unstable.version\"].toString()\n    inputs.property(\"stableCrateVersion\", stableCrateVersion)\n    inputs.property(\"unstableCrateVersion\", stableCrateVersion)\n\n    val cargoTomls = mutableListOf<File>()\n    for (runtimePath in arrayOf(\"../rust-runtime\", \"../aws/rust-runtime\")) {\n        for (path in project.projectDir.resolve(runtimePath).listFiles()!!) {\n            val manifestPath = path.resolve(\"Cargo.toml\")\n            if (manifestPath.exists()) {\n                cargoTomls.add(manifestPath)\n                inputs.file(manifestPath)\n            }\n        }\n    }\n\n    sourceSets.main.get().output.dir(resourcesDir)\n    doLast {\n        // Version format must be kept in sync with `software.amazon.smithy.rust.codegen.core.Version`\n        versionsFile.asFile.writeText(\n            StringBuilder().append(\"{\\n\").also { json ->\n                fun StringBuilder.keyVal(key: String, value: String) = append(\"\\\"$key\\\": \\\"$value\\\"\")\n\n                json.append(\"  \").keyVal(\"gitHash\", gitCommitHash()).append(\",\\n\")\n                json.append(\"  \\\"runtimeCrates\\\": {\\n\")\n                json.append(\n                    cargoTomls.map { path ->\n                        path.parentFile.name to path.readLines()\n                    }\n                        .filter { (name, manifestLines) ->\n                            val publish = manifestLines.none { line -> line == \"publish = false\" }\n                            // HACK: The experimental/unpublished typescript runtime crate needs\n                            // to be included since it is referenced by the code generator and tested in CI.\n                            publish || name == \"aws-smithy-http-server-typescript\"\n                        }\n                        .map { (name, manifestLines) ->\n                            val stable = manifestLines.any { line -> line == \"stable = true\" }\n                            val versionLine = manifestLines.first { line -> line.startsWith(\"version = \\\"\") }\n                            val maybeVersion = versionLine.slice((\"version = \\\"\".length)..(versionLine.length - 2))\n                            val version = if (maybeVersion == \"0.0.0-smithy-rs-head\") {\n                                when (stable) {\n                                    true -> stableCrateVersion\n                                    else -> unstableCrateVersion\n                                }\n                            } else {\n                                maybeVersion\n                            }\n                            \"    \\\"$name\\\": \\\"$version\\\"\"\n                        }\n                        .joinToString(\",\\n\"),\n                )\n                json.append(\"  }\\n\")\n            }.append(\"}\").toString(),\n        )\n    }\n}\n\n\ntasks.compileKotlin {\n    dependsOn(generateSmithyRuntimeCrateVersion)\n    dependsOn(generateBuildEnvironmentConstants)\n}\n\ntasks.named(\"sourcesJar\").configure {\n    dependsOn(generateSmithyRuntimeCrateVersion)\n    dependsOn(generateBuildEnvironmentConstants)\n}\n"
  },
  {
    "path": "codegen-core/common-test-models/aws-json-query-compat.smithy",
    "content": "$version: \"1.0\"\n\nnamespace aws.protocoltests.misc\n\nuse aws.protocols#awsQueryCompatible\nuse aws.protocols#awsJson1_0\nuse aws.protocols#awsQueryError\nuse smithy.test#httpRequestTests\n@awsQueryCompatible\n@awsJson1_0\nservice QueryCompatService {\n    operations: [\n        Operation\n    ]\n}\n\n@httpRequestTests([{\n    id: \"BasicQueryCompatTest\"\n    protocol: awsJson1_0,\n    method: \"POST\",\n    uri: \"/\",\n    body: \"{\\\"message\\\":\\\"hello!\\\"}\",\n    bodyMedaType: \"application/json\",\n    params: {\n        message: \"hello!\"\n    },\n    headers: {\n        \"x-amz-target\": \"QueryCompatService.Operation\",\n        \"x-amzn-query-mode\": \"true\",\n    }\n   }\n])\noperation Operation {\n    input: OperationInputOutput\n    output: OperationInputOutput\n}\n\nstructure OperationInputOutput {\n    message: String\n}\n"
  },
  {
    "path": "codegen-core/common-test-models/big-numbers.smithy",
    "content": "$version: \"2.0\"\n\nnamespace com.amazonaws.bignumbers\n\nuse aws.protocols#restJson1\nuse smithy.test#httpRequestTests\nuse smithy.test#httpResponseTests\n\n// Protocol tests for BigInteger and BigDecimal types.\n//\n// LIMITATION: Protocol test infrastructure has two precision constraints:\n// 1. Smithy model parser converts numeric literals in `params` to Java Number (f64), losing precision\n// 2. Protocol test validator uses serde_json which also truncates to f64\n//\n// Therefore these tests use:\n// - BigInteger: 18446744073709551616 (u64::MAX + 1) - tests arbitrary precision for integers\n// - BigDecimal: Values within f64 range - cannot test true arbitrary decimal precision here\n//\n// For comprehensive arbitrary precision testing including decimals > f64::MAX and high-precision\n// decimals, see BigNumberPrecisionTest.kt integration tests which test actual serialization/\n// deserialization without protocol test infrastructure limitations.\n\n@restJson1\nservice BigNumberService {\n    version: \"2023-01-01\"\n    operations: [ProcessBigNumbers, ProcessNestedBigNumbers]\n}\n\n@http(uri: \"/process\", method: \"POST\")\n@httpRequestTests([\n    {\n        id: \"BigNumbersInJsonRequest\",\n        protocol: restJson1,\n        method: \"POST\",\n        uri: \"/process\",\n        body: \"{\\\"bigInt\\\":123456789,\\\"bigDec\\\":123.456789}\",\n        bodyMediaType: \"application/json\",\n        headers: {\"Content-Type\": \"application/json\"},\n        params: {\n            bigInt: 123456789,\n            bigDec: 123.456789\n        }\n    },\n    {\n        id: \"NegativeBigNumbersInJsonRequest\",\n        protocol: restJson1,\n        method: \"POST\",\n        uri: \"/process\",\n        body: \"{\\\"bigInt\\\":-987654321,\\\"bigDec\\\":-0.000000001}\",\n        bodyMediaType: \"application/json\",\n        headers: {\"Content-Type\": \"application/json\"},\n        params: {\n            bigInt: -987654321,\n            bigDec: -0.000000001\n        }\n    },\n    {\n        id: \"ZeroBigNumbersInJsonRequest\",\n        protocol: restJson1,\n        method: \"POST\",\n        uri: \"/process\",\n        body: \"{\\\"bigInt\\\":0,\\\"bigDec\\\":0.0}\",\n        bodyMediaType: \"application/json\",\n        headers: {\"Content-Type\": \"application/json\"},\n        params: {\n            bigInt: 0,\n            bigDec: 0.0\n        }\n    },\n    {\n        id: \"VeryLargeBigNumbersInJsonRequest\",\n        protocol: restJson1,\n        method: \"POST\",\n        uri: \"/process\",\n        body: \"{\\\"bigInt\\\":18446744073709551616,\\\"bigDec\\\":123456.789}\",\n        bodyMediaType: \"application/json\",\n        headers: {\"Content-Type\": \"application/json\"},\n        params: {\n            bigInt: 18446744073709551616,\n            bigDec: 123456.789\n        }\n    },\n    {\n        id: \"ScientificNotationBigNumbersInJsonRequest\",\n        protocol: restJson1,\n        method: \"POST\",\n        uri: \"/process\",\n        body: \"{\\\"bigInt\\\":12300000000,\\\"bigDec\\\":4.56e-5}\",\n        bodyMediaType: \"application/json\",\n        headers: {\"Content-Type\": \"application/json\"},\n        params: {\n            bigInt: 12300000000,\n            bigDec: 0.0000456\n        }\n    },\n    {\n        id: \"UppercaseScientificNotationBigNumbersInJsonRequest\",\n        protocol: restJson1,\n        method: \"POST\",\n        uri: \"/process\",\n        body: \"{\\\"bigInt\\\":9870000000000000,\\\"bigDec\\\":3.21E-10}\",\n        bodyMediaType: \"application/json\",\n        headers: {\"Content-Type\": \"application/json\"},\n        params: {\n            bigInt: 9870000000000000,\n            bigDec: 0.000000000321\n        }\n    }\n])\n@httpResponseTests([\n    {\n        id: \"BigNumbersInJsonResponse\",\n        protocol: restJson1,\n        code: 200,\n        body: \"{\\\"result\\\":999999999,\\\"ratio\\\":0.123456789}\",\n        bodyMediaType: \"application/json\",\n        headers: {\"Content-Type\": \"application/json\"},\n        params: {\n            result: 999999999,\n            ratio: 0.123456789\n        }\n    },\n    {\n        id: \"NegativeBigNumbersInJsonResponse\",\n        protocol: restJson1,\n        code: 200,\n        body: \"{\\\"result\\\":-123456789,\\\"ratio\\\":-999.999}\",\n        bodyMediaType: \"application/json\",\n        headers: {\"Content-Type\": \"application/json\"},\n        params: {\n            result: -123456789,\n            ratio: -999.999\n        }\n    },\n    {\n        id: \"VeryLargeBigNumbersInJsonResponse\",\n        protocol: restJson1,\n        code: 200,\n        body: \"{\\\"result\\\":18446744073709551616,\\\"ratio\\\":123456.789}\",\n        bodyMediaType: \"application/json\",\n        headers: {\"Content-Type\": \"application/json\"},\n        params: {\n            result: 18446744073709551616,\n            ratio: 123456.789\n        }\n    },\n    {\n        id: \"ZeroBigNumbersInJsonResponse\",\n        protocol: restJson1,\n        code: 200,\n        body: \"{\\\"result\\\":0,\\\"ratio\\\":0.0}\",\n        bodyMediaType: \"application/json\",\n        headers: {\"Content-Type\": \"application/json\"},\n        params: {\n            result: 0,\n            ratio: 0.0\n        }\n    },\n    {\n        id: \"NullBigNumbersInJsonResponse\",\n        protocol: restJson1,\n        code: 200,\n        body: \"{\\\"result\\\":null,\\\"ratio\\\":null}\",\n        bodyMediaType: \"application/json\",\n        headers: {\"Content-Type\": \"application/json\"},\n        params: {}\n    },\n    {\n        id: \"ScientificNotationBigNumbersInJsonResponse\",\n        protocol: restJson1,\n        code: 200,\n        body: \"{\\\"result\\\":1500000000000,\\\"ratio\\\":2.5E-8}\",\n        bodyMediaType: \"application/json\",\n        headers: {\"Content-Type\": \"application/json\"},\n        params: {\n            result: 1500000000000,\n            ratio: 0.000000025\n        }\n    },\n    {\n        id: \"UppercaseScientificNotationBigNumbersInJsonResponse\",\n        protocol: restJson1,\n        code: 200,\n        body: \"{\\\"result\\\":789000000000000000000,\\\"ratio\\\":1.23E-15}\",\n        bodyMediaType: \"application/json\",\n        headers: {\"Content-Type\": \"application/json\"},\n        params: {\n            result: 789000000000000000000,\n            ratio: 0.00000000000000123\n        }\n    }\n])\n\noperation ProcessBigNumbers {\n    input: BigNumberInput\n    output: BigNumberOutput\n}\n\nstructure BigNumberInput {\n    bigInt: BigInteger\n    bigDec: BigDecimal\n}\n\nstructure BigNumberOutput {\n    result: BigInteger\n    ratio: BigDecimal\n}\n\n// Collections and nested structures\nlist BigIntegerList {\n    member: BigInteger\n}\n\nlist BigDecimalList {\n    member: BigDecimal\n}\n\nmap StringToBigIntegerMap {\n    key: String\n    value: BigInteger\n}\n\nmap StringToBigDecimalMap {\n    key: String\n    value: BigDecimal\n}\n\nstructure NestedBigNumbers {\n    numbers: BigIntegerList\n    ratios: BigDecimalList\n    intMap: StringToBigIntegerMap\n    decMap: StringToBigDecimalMap\n}\n\n@http(uri: \"/nested\", method: \"POST\")\n@httpRequestTests([\n    {\n        id: \"BigNumbersInCollectionsRequest\",\n        protocol: restJson1,\n        method: \"POST\",\n        uri: \"/nested\",\n        body: \"{\\\"numbers\\\":[1,2,3],\\\"ratios\\\":[1.1,2.2,3.3],\\\"intMap\\\":{\\\"a\\\":100,\\\"b\\\":200},\\\"decMap\\\":{\\\"x\\\":0.5,\\\"y\\\":1.5}}\",\n        bodyMediaType: \"application/json\",\n        headers: {\"Content-Type\": \"application/json\"},\n        params: {\n            numbers: [1, 2, 3],\n            ratios: [1.1, 2.2, 3.3],\n            intMap: {a: 100, b: 200},\n            decMap: {x: 0.5, y: 1.5}\n        }\n    },\n    {\n        id: \"LargeBigNumbersInCollectionsRequest\",\n        protocol: restJson1,\n        method: \"POST\",\n        uri: \"/nested\",\n        body: \"{\\\"numbers\\\":[18446744073709551616],\\\"ratios\\\":[123456.789],\\\"intMap\\\":{\\\"big\\\":18446744073709551616},\\\"decMap\\\":{\\\"precise\\\":0.123456789}}\",\n        bodyMediaType: \"application/json\",\n        headers: {\"Content-Type\": \"application/json\"},\n        params: {\n            numbers: [18446744073709551616],\n            ratios: [123456.789],\n            intMap: {big: 18446744073709551616},\n            decMap: {precise: 0.123456789}\n        }\n    }\n])\n@httpResponseTests([\n    {\n        id: \"BigNumbersInCollectionsResponse\",\n        protocol: restJson1,\n        code: 200,\n        body: \"{\\\"numbers\\\":[10,20,30],\\\"ratios\\\":[0.1,0.2,0.3],\\\"intMap\\\":{\\\"x\\\":1000},\\\"decMap\\\":{\\\"y\\\":99.99}}\",\n        bodyMediaType: \"application/json\",\n        headers: {\"Content-Type\": \"application/json\"},\n        params: {\n            numbers: [10, 20, 30],\n            ratios: [0.1, 0.2, 0.3],\n            intMap: {x: 1000},\n            decMap: {y: 99.99}\n        }\n    }\n])\noperation ProcessNestedBigNumbers {\n    input: NestedBigNumbers\n    output: NestedBigNumbers\n}\n"
  },
  {
    "path": "codegen-core/common-test-models/constraints.smithy",
    "content": "$version: \"1.0\"\n\nnamespace com.amazonaws.constraints\n\nuse aws.protocols#restJson1\nuse smithy.framework#ValidationException\n\n/// A service to test aspects of code generation where shapes have constraint traits.\n@restJson1\n@title(\"ConstraintsService\")\nservice ConstraintsService {\n    operations: [\n        ConstrainedShapesOperation,\n        // See https://github.com/smithy-lang/smithy-rs/issues/2760 for why testing operations reaching\n        // constrained shapes that only lie in the output is important.\n        ConstrainedShapesOnlyInOutputOperation,\n        ConstrainedHttpBoundShapesOperation,\n        ConstrainedHttpPayloadBoundShapeOperation,\n        ConstrainedRecursiveShapesOperation,\n\n        // `httpQueryParams` and `httpPrefixHeaders` are structurually\n        // exclusive, so we need one operation per target shape type\n        // combination.\n        QueryParamsTargetingLengthMapOperation,\n        QueryParamsTargetingMapOfLengthStringOperation,\n        QueryParamsTargetingMapOfListOfLengthStringOperation,\n        QueryParamsTargetingMapOfSetOfLengthStringOperation,\n        QueryParamsTargetingMapOfLengthListOfPatternStringOperation,\n        QueryParamsTargetingMapOfListOfEnumStringOperation,\n\n        QueryParamsTargetingMapOfPatternStringOperation,\n        QueryParamsTargetingMapOfListOfPatternStringOperation,\n        QueryParamsTargetingMapOfLengthPatternStringOperation,\n        QueryParamsTargetingMapOfListOfLengthPatternStringOperation,\n\n        HttpPrefixHeadersTargetingLengthMapOperation,\n\n        QueryParamsTargetingMapOfEnumStringOperation,\n        QueryParamsTargetingMapOfListOfEnumStringOperation,\n        // TODO(https://github.com/smithy-lang/smithy-rs/issues/1431)\n        // HttpPrefixHeadersTargetingMapOfEnumStringOperation,\n\n        NonStreamingBlobOperation,\n\n        StreamingBlobOperation,\n        EventStreamsOperation,\n    ],\n}\n\n@http(uri: \"/constrained-shapes-operation\", method: \"POST\")\noperation ConstrainedShapesOperation {\n    input: ConstrainedShapesOperationInputOutput,\n    output: ConstrainedShapesOperationInputOutput,\n    errors: [ValidationException]\n}\n\n@http(uri: \"/constrained-shapes-only-in-output-operation\", method: \"POST\")\noperation ConstrainedShapesOnlyInOutputOperation {\n    output: ConstrainedShapesOnlyInOutputOperationOutput,\n}\n\n@http(\n    uri: \"/constrained-http-bound-shapes-operation/{rangeIntegerLabel}/{rangeShortLabel}/{rangeLongLabel}/{rangeByteLabel}/{lengthStringLabel}/{enumStringLabel}\",\n    method: \"POST\"\n)\noperation ConstrainedHttpBoundShapesOperation {\n    input: ConstrainedHttpBoundShapesOperationInputOutput,\n    output: ConstrainedHttpBoundShapesOperationInputOutput,\n    errors: [ValidationException]\n}\n\n@http(uri: \"/constrained-http-payload-bound-shape-operation\", method: \"POST\")\noperation ConstrainedHttpPayloadBoundShapeOperation {\n    input: ConstrainedHttpPayloadBoundShapeOperationInputOutput,\n    output: ConstrainedHttpPayloadBoundShapeOperationInputOutput,\n    errors: [ValidationException]\n}\n\n@http(uri: \"/constrained-recursive-shapes-operation\", method: \"POST\")\noperation ConstrainedRecursiveShapesOperation {\n    input: ConstrainedRecursiveShapesOperationInputOutput,\n    output: ConstrainedRecursiveShapesOperationInputOutput,\n    errors: [ValidationException]\n}\n\n@http(uri: \"/query-params-targeting-length-map\", method: \"POST\")\noperation QueryParamsTargetingLengthMapOperation {\n    input: QueryParamsTargetingLengthMapOperationInputOutput,\n    output: QueryParamsTargetingLengthMapOperationInputOutput,\n    errors: [ValidationException]\n}\n\n@http(uri: \"/query-params-targeting-map-of-length-string-operation\", method: \"POST\")\noperation QueryParamsTargetingMapOfLengthStringOperation {\n    input: QueryParamsTargetingMapOfLengthStringOperationInputOutput,\n    output: QueryParamsTargetingMapOfLengthStringOperationInputOutput,\n    errors: [ValidationException]\n}\n\n@http(uri: \"/query-params-targeting-map-of-enum-string-operation\", method: \"POST\")\noperation QueryParamsTargetingMapOfEnumStringOperation {\n    input: QueryParamsTargetingMapOfEnumStringOperationInputOutput,\n    output: QueryParamsTargetingMapOfEnumStringOperationInputOutput,\n    errors: [ValidationException]\n}\n\n@http(uri: \"/query-params-targeting-map-of-list-of-length-string-operation\", method: \"POST\")\noperation QueryParamsTargetingMapOfListOfLengthStringOperation {\n    input: QueryParamsTargetingMapOfListOfLengthStringOperationInputOutput,\n    output: QueryParamsTargetingMapOfListOfLengthStringOperationInputOutput,\n    errors: [ValidationException]\n}\n\n@http(uri: \"/query-params-targeting-map-of-set-of-length-string-operation\", method: \"POST\")\noperation QueryParamsTargetingMapOfSetOfLengthStringOperation {\n    input: QueryParamsTargetingMapOfSetOfLengthStringOperationInputOutput,\n    output: QueryParamsTargetingMapOfSetOfLengthStringOperationInputOutput,\n    errors: [ValidationException]\n}\n\n@http(uri: \"/query-params-targeting-map-of-length-list-of-pattern-string-operation\", method: \"POST\")\noperation QueryParamsTargetingMapOfLengthListOfPatternStringOperation {\n    input: QueryParamsTargetingMapOfLengthListOfPatternStringOperationInputOutput,\n    output: QueryParamsTargetingMapOfLengthListOfPatternStringOperationInputOutput,\n    errors: [ValidationException]\n}\n\n@http(uri: \"/query-params-targeting-map-of-list-of-enum-string-operation\", method: \"POST\")\noperation QueryParamsTargetingMapOfListOfEnumStringOperation {\n    input: QueryParamsTargetingMapOfListOfEnumStringOperationInputOutput,\n    output: QueryParamsTargetingMapOfListOfEnumStringOperationInputOutput,\n    errors: [ValidationException]\n}\n\n@http(uri: \"/query-params-targeting-map-of-pattern-string-operation\", method: \"POST\")\noperation QueryParamsTargetingMapOfPatternStringOperation {\n    input: QueryParamsTargetingMapOfPatternStringOperationInputOutput,\n    output: QueryParamsTargetingMapOfPatternStringOperationInputOutput,\n    errors: [ValidationException]\n}\n\n@http(uri: \"/query-params-targeting-map-of-list-of-pattern-string-operation\", method: \"POST\")\noperation QueryParamsTargetingMapOfListOfPatternStringOperation {\n    input: QueryParamsTargetingMapOfListOfPatternStringOperationInputOutput,\n    output: QueryParamsTargetingMapOfListOfPatternStringOperationInputOutput,\n    errors: [ValidationException]\n}\n\n@http(uri: \"/query-params-targeting-map-of-length-pattern-string\", method: \"POST\")\noperation QueryParamsTargetingMapOfLengthPatternStringOperation {\n    input: QueryParamsTargetingMapOfLengthPatternStringOperationInputOutput,\n    output: QueryParamsTargetingMapOfLengthPatternStringOperationInputOutput,\n    errors: [ValidationException],\n}\n\n@http(uri: \"/query-params-targeting-map-of-list-of-length-pattern-string-operation\", method: \"POST\")\noperation QueryParamsTargetingMapOfListOfLengthPatternStringOperation {\n    input: QueryParamsTargetingMapOfListOfLengthPatternStringOperationInputOutput,\n    output: QueryParamsTargetingMapOfListOfLengthPatternStringOperationInputOutput,\n    errors: [ValidationException]\n}\n\n@http(uri: \"/http-prefix-headers-targeting-length-map-operation\", method: \"POST\")\noperation HttpPrefixHeadersTargetingLengthMapOperation {\n    input: HttpPrefixHeadersTargetingLengthMapOperationInputOutput,\n    output: HttpPrefixHeadersTargetingLengthMapOperationInputOutput,\n    errors: [ValidationException],\n}\n\n@http(uri: \"/http-prefix-headers-targeting-map-of-enum-string-operation\", method: \"POST\")\noperation HttpPrefixHeadersTargetingMapOfEnumStringOperation {\n    input: HttpPrefixHeadersTargetingMapOfEnumStringOperationInputOutput,\n    output: HttpPrefixHeadersTargetingMapOfEnumStringOperationInputOutput,\n    errors: [ValidationException]\n}\n\n@http(uri: \"/non-streaming-blob-operation\", method: \"POST\")\noperation NonStreamingBlobOperation {\n    input: NonStreamingBlobOperationInputOutput,\n    output: NonStreamingBlobOperationInputOutput,\n}\n\n@http(uri: \"/streaming-blob-operation\", method: \"POST\")\noperation StreamingBlobOperation {\n    input: StreamingBlobOperationInputOutput,\n    output: StreamingBlobOperationInputOutput,\n}\n\n@http(uri: \"/event-streams-operation\", method: \"POST\")\noperation EventStreamsOperation {\n    input: EventStreamsOperationInputOutput,\n    output: EventStreamsOperationInputOutput,\n    errors: [ValidationException]\n}\n\nstructure ConstrainedShapesOperationInputOutput {\n    @required\n    conA: ConA,\n}\n\nstructure ConstrainedHttpBoundShapesOperationInputOutput {\n    @required\n    @httpLabel\n    lengthStringLabel: LengthString,\n\n    @required\n    @httpLabel\n    rangeIntegerLabel: RangeInteger,\n\n    @required\n    @httpLabel\n    rangeShortLabel: RangeShort,\n\n    @required\n    @httpLabel\n    rangeLongLabel: RangeLong,\n\n    @required\n    @httpLabel\n    rangeByteLabel: RangeByte,\n\n    @required\n    @httpLabel\n    enumStringLabel: EnumString,\n\n    @required\n    @httpPrefixHeaders(\"X-Length-String-Prefix-Headers-\")\n    lengthStringHeaderMap: MapOfLengthString,\n\n    @httpHeader(\"X-Length\")\n    lengthStringHeader: LengthString,\n\n    @httpHeader(\"X-Range-Integer\")\n    rangeIntegerHeader: RangeInteger,\n\n    @httpHeader(\"X-Range-Short\")\n    rangeShortHeader: RangeShort,\n\n    @httpHeader(\"X-Range-Long\")\n    rangeLongHeader: RangeLong,\n\n    @httpHeader(\"X-Range-Byte\")\n    rangeByteHeader: RangeByte,\n\n    // @httpHeader(\"X-Length-MediaType\")\n    // lengthStringHeaderWithMediaType: MediaTypeLengthString,\n\n    @httpHeader(\"X-Length-Set\")\n    lengthStringSetHeader: SetOfLengthString,\n\n    @httpHeader(\"X-List-Length-String\")\n    listLengthStringHeader: ListOfLengthString,\n\n    @httpHeader(\"X-Length-List-Pattern-String\")\n    lengthListPatternStringHeader: LengthListOfPatternString,\n\n    @httpHeader(\"X-Length-Set-Pattern-String\")\n    lengthSetPatternStringHeader: LengthSetOfPatternString,\n\n    @httpHeader(\"X-Range-Byte-Set\")\n    rangeByteSetHeader: SetOfRangeByte,\n    @httpHeader(\"X-Range-Short-Set\")\n    rangeShortSetHeader: SetOfRangeShort,\n    @httpHeader(\"X-Range-Integer-Set\")\n    rangeIntegerSetHeader: SetOfRangeInteger,\n    @httpHeader(\"X-Range-Long-Set\")\n    rangeLongSetHeader: SetOfRangeLong,\n\n    @httpHeader(\"X-Range-Byte-List\")\n    rangeByteListHeader: ListOfRangeByte,\n    @httpHeader(\"X-Range-Short-List\")\n    rangeShortListHeader: ListOfRangeShort,\n    @httpHeader(\"X-Range-Integer-List\")\n    rangeIntegerListHeader: ListOfRangeInteger,\n    @httpHeader(\"X-Range-Long-List\")\n    rangeLongListHeader: ListOfRangeLong,\n\n    // TODO(https://github.com/smithy-lang/smithy-rs/issues/1431)\n    // @httpHeader(\"X-Enum\")\n    //enumStringHeader: EnumString,\n\n    // @httpHeader(\"X-Enum-List\")\n    // enumStringListHeader: ListOfEnumString,\n\n    @httpQuery(\"lengthString\")\n    lengthStringQuery: LengthString,\n\n    @httpQuery(\"rangeByte\")\n    rangeByteQuery: RangeByte,\n    @httpQuery(\"rangeShort\")\n    rangeShortQuery: RangeShort,\n    @httpQuery(\"rangeInteger\")\n    rangeIntegerQuery: RangeInteger,\n    @httpQuery(\"rangeLong\")\n    rangeLongQuery: RangeLong,\n\n\n    @httpQuery(\"enumString\")\n    enumStringQuery: EnumString,\n\n    @httpQuery(\"lengthStringList\")\n    lengthStringListQuery: ListOfLengthString,\n\n    @httpQuery(\"lengthListPatternString\")\n    lengthListPatternStringQuery: LengthListOfPatternString,\n\n    @httpQuery(\"lengthStringSet\")\n    lengthStringSetQuery: SetOfLengthString,\n\n    @httpQuery(\"rangeByteList\")\n    rangeByteListQuery: ListOfRangeByte,\n    @httpQuery(\"rangeShortList\")\n    rangeShortListQuery: ListOfRangeShort,\n    @httpQuery(\"rangeIntegerList\")\n    rangeIntegerListQuery: ListOfRangeInteger,\n    @httpQuery(\"rangeLongList\")\n    rangeLongListQuery: ListOfRangeLong,\n\n    @httpQuery(\"rangeByteSet\")\n    rangeByteSetQuery: SetOfRangeByte,\n    @httpQuery(\"rangeShortSet\")\n    rangeShortSetQuery: SetOfRangeShort,\n    @httpQuery(\"rangeIntegerSet\")\n    rangeIntegerSetQuery: SetOfRangeInteger,\n    @httpQuery(\"rangeLongSet\")\n    rangeLongSetQuery: SetOfRangeLong,\n\n    @httpQuery(\"enumStringList\")\n    enumStringListQuery: ListOfEnumString,\n}\n\nstructure ConstrainedHttpPayloadBoundShapeOperationInputOutput {\n    @required\n    @httpPayload\n    httpPayloadBoundConstrainedShape: ConA\n}\n\nstructure QueryParamsTargetingMapOfPatternStringOperationInputOutput {\n    @httpQueryParams\n    mapOfPatternString: MapOfPatternString\n}\n\nstructure QueryParamsTargetingMapOfListOfPatternStringOperationInputOutput {\n    @httpQueryParams\n    mapOfListOfPatternString: MapOfListOfPatternString\n}\n\nstructure QueryParamsTargetingMapOfLengthPatternStringOperationInputOutput {\n    @httpQueryParams\n    mapOfLengthPatternString: MapOfLengthPatternString,\n}\n\nstructure QueryParamsTargetingMapOfListOfLengthPatternStringOperationInputOutput {\n    @httpQueryParams\n    mapOfLengthPatternString: MapOfListOfLengthPatternString,\n}\n\nstructure HttpPrefixHeadersTargetingLengthMapOperationInputOutput {\n    @httpPrefixHeaders(\"X-Prefix-Headers-LengthMap-\")\n    lengthMap: ConBMap,\n}\n\nstructure HttpPrefixHeadersTargetingMapOfEnumStringOperationInputOutput {\n    @httpPrefixHeaders(\"X-Prefix-Headers-MapOfEnumString-\")\n    mapOfEnumString: MapOfEnumString,\n}\n\nstructure QueryParamsTargetingLengthMapOperationInputOutput {\n    @httpQueryParams\n    lengthMap: ConBMap\n}\n\nstructure QueryParamsTargetingMapOfLengthStringOperationInputOutput {\n    @httpQueryParams\n    mapOfLengthString: MapOfLengthString\n}\n\nstructure QueryParamsTargetingMapOfEnumStringOperationInputOutput {\n    @httpQueryParams\n    mapOfEnumString: MapOfEnumString\n}\n\nstructure QueryParamsTargetingMapOfListOfLengthStringOperationInputOutput {\n    @httpQueryParams\n    mapOfListOfLengthString: MapOfListOfLengthString\n}\n\nstructure QueryParamsTargetingMapOfSetOfLengthStringOperationInputOutput {\n    @httpQueryParams\n    mapOfSetOfLengthString: MapOfSetOfLengthString\n}\n\nstructure QueryParamsTargetingMapOfLengthListOfPatternStringOperationInputOutput {\n    @httpQueryParams\n    mapOfLengthListOfPatternString: MapOfLengthListOfPatternString\n}\n\nstructure QueryParamsTargetingMapOfListOfEnumStringOperationInputOutput {\n    @httpQueryParams\n    mapOfListOfEnumString: MapOfListOfEnumString\n}\n\nstructure NonStreamingBlobOperationInputOutput {\n    @httpPayload\n    nonStreamingBlob: NonStreamingBlob,\n}\n\nstructure StreamingBlobOperationInputOutput {\n    @httpPayload\n    streamingBlob: StreamingBlob,\n}\n\nstructure EventStreamsOperationInputOutput {\n    @httpPayload\n    events: Event,\n}\n\n@streaming\nunion Event {\n    regularMessage: EventStreamRegularMessage,\n    errorMessage: EventStreamErrorMessage,\n}\n\nstructure EventStreamRegularMessage {\n    messageContent: String\n    // TODO(https://github.com/awslabs/smithy/issues/1388): Can't add a constraint trait here until the semantics are clarified.\n    // messageContent: LengthString\n}\n\n@error(\"server\")\nstructure EventStreamErrorMessage {\n    messageContent: String\n    // TODO(https://github.com/awslabs/smithy/issues/1388): Can't add a constraint trait here until the semantics are clarified.\n    // messageContent: LengthString\n}\n\n// TODO(https://github.com/awslabs/smithy/issues/1389): Can't add a constraint trait here until the semantics are clarified.\n@streaming\nblob StreamingBlob\n\nblob NonStreamingBlob\n\nstructure ConA {\n    @required\n    conB: ConB,\n\n    optConB: ConB,\n\n    lengthString: LengthString,\n    minLengthString: MinLengthString,\n    maxLengthString: MaxLengthString,\n    fixedLengthString: FixedLengthString,\n\n    lengthBlob: LengthBlob,\n    minLengthBlob: MinLengthBlob,\n    maxLengthBlob: MaxLengthBlob,\n    fixedLengthBlob: FixedLengthBlob,\n\n    rangeInteger: RangeInteger,\n    minRangeInteger: MinRangeInteger,\n    maxRangeInteger: MaxRangeInteger,\n    fixedValueInteger: FixedValueInteger,\n\n    rangeShort: RangeShort,\n    minRangeShort: MinRangeShort,\n    maxRangeShort: MaxRangeShort,\n    fixedValueShort: FixedValueShort,\n\n    rangeLong: RangeLong,\n    minRangeLong: MinRangeLong,\n    maxRangeLong: MaxRangeLong,\n    fixedValueLong: FixedValueLong,\n\n    rangeByte: RangeByte,\n    minRangeByte: MinRangeByte,\n    maxRangeByte: MaxRangeByte,\n    fixedValueByte: FixedValueByte,\n\n    conBList: ConBList,\n    lengthList: LengthList,\n    sensitiveLengthList: SensitiveLengthList,\n\n    conBSet: ConBSet,\n\n    conBMap: ConBMap,\n    lengthMap: LengthMap,\n\n    mapOfMapOfListOfListOfConB: MapOfMapOfListOfListOfConB,\n    sparseMap: SparseMap,\n    sparseList: SparseList,\n    sparseLengthMap: SparseLengthMap,\n    sparseLengthList: SparseLengthList,\n\n    constrainedUnion: ConstrainedUnion,\n    enumString: EnumString,\n\n    listOfLengthString: ListOfLengthString,\n    setOfLengthString: SetOfLengthString,\n    mapOfLengthString: MapOfLengthString,\n\n    listOfLengthBlob: ListOfLengthBlob,\n    // TODO(https://github.com/smithy-lang/smithy-rs/issues/1401): a `set` shape is\n    //  just a `list` shape with `uniqueItems`, which hasn't been implemented yet.\n    // setOfLengthBlob: SetOfLengthBlob,\n    mapOfLengthBlob: MapOfLengthBlob,\n\n    listOfRangeInteger: ListOfRangeInteger,\n    setOfRangeInteger: SetOfRangeInteger,\n    mapOfRangeInteger: MapOfRangeInteger,\n\n    listOfRangeShort: ListOfRangeShort,\n    setOfRangeShort: SetOfRangeShort,\n    mapOfRangeShort: MapOfRangeShort,\n\n    listOfRangeLong: ListOfRangeLong,\n    setOfRangeLong: SetOfRangeLong,\n    mapOfRangeLong: MapOfRangeLong,\n\n    listOfRangeByte: ListOfRangeByte,\n    setOfRangeByte: SetOfRangeByte,\n    mapOfRangeByte: MapOfRangeByte,\n\n    nonStreamingBlob: NonStreamingBlob\n\n    patternString: PatternString,\n    mapOfPatternString: MapOfPatternString,\n    listOfPatternString: ListOfPatternString,\n    setOfPatternString: SetOfPatternString,\n\n    lengthLengthPatternString: LengthPatternString,\n    mapOfLengthPatternString: MapOfLengthPatternString,\n    listOfLengthPatternString: ListOfLengthPatternString\n    setOfLengthPatternString: SetOfLengthPatternString,\n\n    lengthListOfPatternString: LengthListOfPatternString,\n    lengthSetOfPatternString: LengthSetOfPatternString,\n}\n\n@uniqueItems\nlist UniqueItemsList {\n    member: String\n}\n\n@sparse\nmap SparseMap {\n    key: String,\n    value: UniqueItemsList\n}\n\n@sparse\nlist SparseList {\n    member: LengthString\n}\n\n@sparse\n@length(min: 69)\nmap SparseLengthMap {\n    key: String,\n    value: String\n}\n\n@sparse\n@length(min: 69)\nlist SparseLengthList {\n    member: String\n}\n\nmap MapOfLengthBlob {\n    key: String,\n    value: LengthBlob,\n}\n\nmap MapOfLengthString {\n    key: LengthString,\n    value: LengthString,\n}\n\nmap MapOfRangeInteger {\n    key: String,\n    value: RangeInteger,\n}\n\nmap MapOfRangeShort {\n    key: String,\n    value: RangeShort,\n}\n\nmap MapOfRangeLong {\n    key: String,\n    value: RangeLong,\n}\n\nmap MapOfRangeByte {\n    key: String,\n    value: RangeByte,\n}\n\nmap MapOfEnumString {\n    key: EnumString,\n    value: EnumString,\n}\n\nmap MapOfListOfLengthString {\n    key: LengthString,\n    value: ListOfLengthString,\n}\n\nmap MapOfListOfEnumString {\n    key: EnumString,\n    value: ListOfEnumString,\n}\n\nmap MapOfListOfPatternString {\n    key: PatternString,\n    value: ListOfPatternString\n}\n\nmap MapOfListOfLengthPatternString {\n    key: LengthPatternString,\n    value: ListOfLengthPatternString\n}\n\nmap MapOfSetOfLengthString {\n    key: LengthString,\n    value: SetOfLengthString,\n}\n\nmap MapOfLengthListOfPatternString {\n    key: PatternString,\n    value: LengthListOfPatternString\n}\n\nmap MapOfSetOfRangeInteger {\n    key: String,\n    value: SetOfRangeInteger,\n}\n\nmap MapOfSetOfRangeShort {\n    key: String,\n    value: SetOfRangeShort,\n}\n\nmap MapOfSetOfRangeLong {\n    key: String,\n    value: SetOfRangeLong,\n}\n\nmap MapOfSetOfRangeByte {\n    key: String,\n    value: SetOfRangeByte,\n}\n\n@length(min: 2, max: 8)\nlist LengthListOfLengthString {\n    member: LengthString\n}\n\n@length(min: 2, max: 69)\nstring LengthString\n\n@length(min: 2)\nstring MinLengthString\n\n@length(max: 69)\nstring MaxLengthString\n\n@length(min: 69, max: 69)\nstring FixedLengthString\n\n@length(min: 2, max: 8)\nlist LengthListOfLengthBlob {\n    member: LengthBlob\n}\n\n@length(min: 2, max: 70)\nblob LengthBlob\n\n@length(min: 2)\nblob MinLengthBlob\n\n@length(max: 70)\nblob MaxLengthBlob\n\n@length(min: 70, max: 70)\nblob FixedLengthBlob\n\n@pattern(\"[a-d]{5}\")\nstring PatternString\n\n@pattern(\"[a-f0-5]*\")\n@length(min: 5, max: 10)\nstring LengthPatternString\n\n@mediaType(\"video/quicktime\")\n@length(min: 1, max: 69)\nstring MediaTypeLengthString\n\n@range(min: -0, max: 69)\ninteger RangeInteger\n\n@range(min: -10)\ninteger MinRangeInteger\n\n@range(max: 69)\ninteger MaxRangeInteger\n\n@range(min: 69, max: 69)\ninteger FixedValueInteger\n\n@range(min: -0, max: 10)\nshort RangeShort\n\n@range(min: -10)\nshort MinRangeShort\n\n@range(max: 11)\nshort MaxRangeShort\n\n@range(min: 10, max: 10)\nshort FixedValueShort\n\n@range(min: -0, max: 10)\nlong RangeLong\n\n@range(min: -10)\nlong MinRangeLong\n\n@range(max: 11)\nlong MaxRangeLong\n\n@range(min: 10, max: 10)\nlong FixedValueLong\n\n@range(min: -0, max: 10)\nbyte RangeByte\n\n@range(min: -10)\nbyte MinRangeByte\n\n@range(max: 11)\nbyte MaxRangeByte\n\n@range(min: 10, max: 10)\nbyte FixedValueByte\n\n/// A union with constrained members.\nunion ConstrainedUnion {\n    enumString: EnumString,\n    lengthString: LengthString,\n\n    constrainedStructure: ConB,\n    conBList: ConBList,\n    conBSet: ConBSet,\n    conBMap: ConBMap,\n}\n\n@enum([\n    {\n        value: \"t2.nano\",\n        name: \"T2_NANO\",\n    },\n    {\n        value: \"t2.micro\",\n        name: \"T2_MICRO\",\n    },\n    {\n        value: \"m256.mega\",\n        name: \"M256_MEGA\",\n    }\n])\nstring EnumString\n\nset SetOfLengthString {\n    member: LengthString\n}\n\nset SetOfLengthBlob {\n    member: LengthBlob\n}\n\nset SetOfPatternString {\n    member: PatternString\n}\n\nset SetOfLengthPatternString {\n    member: LengthPatternString\n}\n\n@length(min: 5, max: 9)\nset LengthSetOfPatternString {\n    member: PatternString\n}\n\nlist ListOfLengthString {\n    member: LengthString\n}\n\nset SetOfRangeInteger {\n    member: RangeInteger\n}\n\nlist ListOfLengthBlob {\n    member: LengthBlob\n}\n\nlist ListOfRangeInteger {\n    member: RangeInteger\n}\n\nset SetOfRangeShort {\n    member: RangeShort\n}\n\nlist ListOfRangeShort {\n    member: RangeShort\n}\n\nset SetOfRangeLong {\n    member: RangeLong\n}\n\nlist ListOfRangeLong {\n    member: RangeLong\n}\n\nset SetOfRangeByte {\n    member: RangeByte\n}\n\nlist ListOfRangeByte {\n    member: RangeByte\n}\n\nlist ListOfEnumString {\n    member: EnumString\n}\n\nlist ListOfPatternString {\n    member: PatternString\n}\n\nlist ListOfLengthPatternString {\n    member: LengthPatternString\n}\n\n@length(min: 12, max: 39)\nlist LengthListOfPatternString {\n    member: PatternString\n}\n\nstructure ConB {\n    @required\n    nice: String,\n    @required\n    int: Integer,\n\n    optNice: String,\n    optInt: Integer\n}\n\nstructure ConstrainedRecursiveShapesOperationInputOutput {\n    nested: RecursiveShapesInputOutputNested1,\n\n    @required\n    recursiveList: RecursiveList\n}\n\nstructure RecursiveShapesInputOutputNested1 {\n    @required\n    recursiveMember: RecursiveShapesInputOutputNested2\n}\n\nstructure RecursiveShapesInputOutputNested2 {\n    recursiveMember: RecursiveShapesInputOutputNested1,\n}\n\nlist RecursiveList {\n    member: RecursiveShapesInputOutputNested1\n}\n\nlist ConBList {\n    member: ConBListInner\n}\n\nlist ConBListInner {\n    member: ConB\n}\n\n@length(max: 69)\nlist LengthList {\n    member: String\n}\n\n@length(max: 69)\nlist SensitiveLengthList {\n    member: SensitiveStructure\n}\n\n@sensitive\nstructure SensitiveStructure { }\n\nset ConBSet {\n    member: ConBSetInner\n}\n\nset ConBSetInner {\n    member: String\n}\n\nmap MapOfPatternString {\n    key: PatternString,\n    value: PatternString,\n}\n\nmap MapOfLengthPatternString {\n    key: LengthPatternString,\n    value: LengthPatternString,\n}\n\n@length(min: 1, max: 69)\nmap ConBMap {\n    key: String,\n    value: LengthString\n}\n\n@length(min: 1, max: 69)\nmap LengthMap {\n    key: String,\n    value: String\n}\n\n@error(\"client\")\nstructure ErrorWithLengthStringMessage {\n    @required\n    message: LengthString\n}\n\nmap MapOfMapOfListOfListOfConB {\n    key: String,\n    value: MapOfListOfListOfConB\n}\n\nmap MapOfListOfListOfConB {\n    key: String,\n    value: ConBList\n}\n\nstructure ConstrainedShapesOnlyInOutputOperationOutput {\n    list: ConstrainedListInOutput\n    map: ConstrainedMapInOutput\n    // Unions were not affected by\n    // https://github.com/smithy-lang/smithy-rs/issues/2760, but testing anyway for\n    // good measure.\n    union: ConstrainedUnionInOutput\n}\n\n@length(min: 69)\nlist ConstrainedListInOutput {\n    member: ConstrainedUnionInOutput\n}\n\n@length(min: 69)\nmap ConstrainedMapInOutput {\n    key: String\n    value: TransitivelyConstrainedStructureInOutput\n}\n\nunion ConstrainedUnionInOutput {\n    structure: TransitivelyConstrainedStructureInOutput\n}\n\nstructure TransitivelyConstrainedStructureInOutput {\n    lengthString: LengthString\n}\n"
  },
  {
    "path": "codegen-core/common-test-models/ebs.json",
    "content": "{\n  \"smithy\": \"1.0\",\n  \"metadata\": {\n    \"suppressions\": [\n      {\n        \"id\": \"HttpMethodSemantics\",\n        \"namespace\": \"*\"\n      },\n      {\n        \"id\": \"HttpResponseCodeSemantics\",\n        \"namespace\": \"*\"\n      },\n      {\n        \"id\": \"PaginatedTrait\",\n        \"namespace\": \"*\"\n      },\n      {\n        \"id\": \"HttpHeaderTrait\",\n        \"namespace\": \"*\"\n      },\n      {\n        \"id\": \"HttpUriConflict\",\n        \"namespace\": \"*\"\n      },\n      {\n        \"id\": \"Service\",\n        \"namespace\": \"*\"\n      }\n    ]\n  },\n  \"shapes\": {\n    \"com.amazonaws.ebs#AccessDeniedException\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Message\": {\n          \"target\": \"com.amazonaws.ebs#ErrorMessage\"\n        },\n        \"Reason\": {\n          \"target\": \"com.amazonaws.ebs#AccessDeniedExceptionReason\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The reason for the exception.</p>\",\n            \"smithy.api#required\": {}\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>You do not have sufficient access to perform this action.</p>\",\n        \"smithy.api#error\": \"client\",\n        \"smithy.api#httpError\": 403\n      }\n    },\n    \"com.amazonaws.ebs#AccessDeniedExceptionReason\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#enum\": [\n          {\n            \"value\": \"UNAUTHORIZED_ACCOUNT\",\n            \"name\": \"UNAUTHORIZED_ACCOUNT\"\n          },\n          {\n            \"value\": \"DEPENDENCY_ACCESS_DENIED\",\n            \"name\": \"DEPENDENCY_ACCESS_DENIED\"\n          }\n        ]\n      }\n    },\n    \"com.amazonaws.ebs#Block\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"BlockToken\": {\n          \"target\": \"com.amazonaws.ebs#BlockToken\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The block token for the block index.</p>\"\n          }\n        },\n        \"BlockIndex\": {\n          \"target\": \"com.amazonaws.ebs#BlockIndex\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The block index.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>A block of data in an Amazon Elastic Block Store snapshot.</p>\"\n      }\n    },\n    \"com.amazonaws.ebs#BlockData\": {\n      \"type\": \"blob\",\n      \"traits\": {\n        \"smithy.api#sensitive\": {},\n        \"smithy.api#streaming\": {}\n      }\n    },\n    \"com.amazonaws.ebs#BlockIndex\": {\n      \"type\": \"integer\",\n      \"traits\": {\n        \"smithy.api#box\": {},\n        \"smithy.api#range\": {\n          \"min\": 0\n        }\n      }\n    },\n    \"com.amazonaws.ebs#BlockSize\": {\n      \"type\": \"integer\",\n      \"traits\": {\n        \"smithy.api#box\": {}\n      }\n    },\n    \"com.amazonaws.ebs#BlockToken\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#length\": {\n          \"min\": 0,\n          \"max\": 256\n        },\n        \"smithy.api#pattern\": \"^[A-Za-z0-9+/=]+$\"\n      }\n    },\n    \"com.amazonaws.ebs#Blocks\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.ebs#Block\"\n      },\n      \"traits\": {\n        \"smithy.api#sensitive\": {}\n      }\n    },\n    \"com.amazonaws.ebs#Boolean\": {\n      \"type\": \"boolean\",\n      \"traits\": {\n        \"smithy.api#box\": {}\n      }\n    },\n    \"com.amazonaws.ebs#ChangedBlock\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"FirstBlockToken\": {\n          \"target\": \"com.amazonaws.ebs#BlockToken\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The block token for the block index of the <code>FirstSnapshotId</code> specified in\\n            the <code>ListChangedBlocks</code> operation. This value is absent if the first snapshot\\n            does not have the changed block that is on the second snapshot.</p>\"\n          }\n        },\n        \"BlockIndex\": {\n          \"target\": \"com.amazonaws.ebs#BlockIndex\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The block index.</p>\"\n          }\n        },\n        \"SecondBlockToken\": {\n          \"target\": \"com.amazonaws.ebs#BlockToken\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The block token for the block index of the <code>SecondSnapshotId</code> specified in\\n            the <code>ListChangedBlocks</code> operation.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>A block of data in an Amazon Elastic Block Store snapshot that is different from another snapshot of\\n            the same volume/snapshot lineage.</p>\",\n        \"smithy.api#sensitive\": {}\n      }\n    },\n    \"com.amazonaws.ebs#ChangedBlocks\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.ebs#ChangedBlock\"\n      }\n    },\n    \"com.amazonaws.ebs#ChangedBlocksCount\": {\n      \"type\": \"integer\",\n      \"traits\": {\n        \"smithy.api#box\": {},\n        \"smithy.api#range\": {\n          \"min\": 0\n        }\n      }\n    },\n    \"com.amazonaws.ebs#Checksum\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#length\": {\n          \"min\": 0,\n          \"max\": 64\n        },\n        \"smithy.api#pattern\": \"^[A-Za-z0-9+/=]+$\"\n      }\n    },\n    \"com.amazonaws.ebs#ChecksumAggregationMethod\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#enum\": [\n          {\n            \"value\": \"LINEAR\",\n            \"name\": \"CHECKSUM_AGGREGATION_LINEAR\"\n          }\n        ],\n        \"smithy.api#length\": {\n          \"min\": 0,\n          \"max\": 32\n        },\n        \"smithy.api#pattern\": \"^[A-Za-z0-9]+$\"\n      }\n    },\n    \"com.amazonaws.ebs#ChecksumAlgorithm\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#enum\": [\n          {\n            \"value\": \"SHA256\",\n            \"name\": \"CHECKSUM_ALGORITHM_SHA256\"\n          }\n        ],\n        \"smithy.api#length\": {\n          \"min\": 0,\n          \"max\": 32\n        },\n        \"smithy.api#pattern\": \"^[A-Za-z0-9]+$\"\n      }\n    },\n    \"com.amazonaws.ebs#CompleteSnapshot\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.ebs#CompleteSnapshotRequest\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.ebs#CompleteSnapshotResponse\"\n      },\n      \"errors\": [\n        {\n          \"target\": \"com.amazonaws.ebs#AccessDeniedException\"\n        },\n        {\n          \"target\": \"com.amazonaws.ebs#InternalServerException\"\n        },\n        {\n          \"target\": \"com.amazonaws.ebs#RequestThrottledException\"\n        },\n        {\n          \"target\": \"com.amazonaws.ebs#ResourceNotFoundException\"\n        },\n        {\n          \"target\": \"com.amazonaws.ebs#ServiceQuotaExceededException\"\n        },\n        {\n          \"target\": \"com.amazonaws.ebs#ValidationException\"\n        }\n      ],\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Seals and completes the snapshot after all of the required blocks of data have been\\n            written to it. Completing the snapshot changes the status to <code>completed</code>. You\\n            cannot write new blocks to a snapshot after it has been completed.</p>\",\n        \"smithy.api#http\": {\n          \"method\": \"POST\",\n          \"uri\": \"/snapshots/completion/{SnapshotId}\",\n          \"code\": 202\n        }\n      }\n    },\n    \"com.amazonaws.ebs#CompleteSnapshotRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"ChangedBlocksCount\": {\n          \"target\": \"com.amazonaws.ebs#ChangedBlocksCount\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The number of blocks that were written to the snapshot.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-ChangedBlocksCount\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"ChecksumAggregationMethod\": {\n          \"target\": \"com.amazonaws.ebs#ChecksumAggregationMethod\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The aggregation method used to generate the checksum. Currently, the only supported\\n            aggregation method is <code>LINEAR</code>.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-Checksum-Aggregation-Method\"\n          }\n        },\n        \"ChecksumAlgorithm\": {\n          \"target\": \"com.amazonaws.ebs#ChecksumAlgorithm\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The algorithm used to generate the checksum. Currently, the only supported algorithm\\n            is <code>SHA256</code>.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-Checksum-Algorithm\"\n          }\n        },\n        \"SnapshotId\": {\n          \"target\": \"com.amazonaws.ebs#SnapshotId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The ID of the snapshot.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {}\n          }\n        },\n        \"Checksum\": {\n          \"target\": \"com.amazonaws.ebs#Checksum\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>An aggregated Base-64 SHA256 checksum based on the checksums of each written\\n            block.</p>\\n        <p>To generate the aggregated checksum using the linear aggregation method, arrange the\\n            checksums for each written block in ascending order of their block index, concatenate\\n            them to form a single string, and then generate the checksum on the entire string using\\n            the SHA256 algorithm.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-Checksum\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.ebs#CompleteSnapshotResponse\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Status\": {\n          \"target\": \"com.amazonaws.ebs#Status\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The status of the snapshot.</p>\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.ebs#ConcurrentLimitExceededException\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Message\": {\n          \"target\": \"com.amazonaws.ebs#ErrorMessage\"\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>You have reached the limit for concurrent API requests. For more information, see\\n                <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-accessing-snapshot.html#ebsapi-performance\\\">Optimizing performance of the EBS direct APIs</a> in the <i>Amazon Elastic Compute Cloud\\n                User Guide</i>.</p>\",\n        \"smithy.api#error\": \"client\",\n        \"smithy.api#httpError\": 400\n      }\n    },\n    \"com.amazonaws.ebs#ConflictException\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Message\": {\n          \"target\": \"com.amazonaws.ebs#ErrorMessage\"\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>The request uses the same client token as a previous, but non-identical\\n            request.</p>\",\n        \"smithy.api#error\": \"server\",\n        \"smithy.api#httpError\": 503\n      }\n    },\n    \"com.amazonaws.ebs#DataLength\": {\n      \"type\": \"integer\",\n      \"traits\": {\n        \"smithy.api#box\": {}\n      }\n    },\n    \"com.amazonaws.ebs#Description\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#length\": {\n          \"min\": 0,\n          \"max\": 255\n        },\n        \"smithy.api#pattern\": \"^[\\\\S\\\\s]+$\"\n      }\n    },\n    \"com.amazonaws.ebs#Ebs\": {\n      \"type\": \"service\",\n      \"version\": \"2019-11-02\",\n      \"operations\": [\n        {\n          \"target\": \"com.amazonaws.ebs#CompleteSnapshot\"\n        },\n        {\n          \"target\": \"com.amazonaws.ebs#GetSnapshotBlock\"\n        },\n        {\n          \"target\": \"com.amazonaws.ebs#ListChangedBlocks\"\n        },\n        {\n          \"target\": \"com.amazonaws.ebs#ListSnapshotBlocks\"\n        },\n        {\n          \"target\": \"com.amazonaws.ebs#PutSnapshotBlock\"\n        },\n        {\n          \"target\": \"com.amazonaws.ebs#StartSnapshot\"\n        }\n      ],\n      \"traits\": {\n        \"aws.api#service\": {\n          \"sdkId\": \"EBS\",\n          \"arnNamespace\": \"ebs\",\n          \"cloudFormationName\": \"EBS\",\n          \"cloudTrailEventSource\": \"ebs.amazonaws.com\"\n        },\n        \"aws.auth#sigv4\": {\n          \"name\": \"ebs\"\n        },\n        \"aws.protocols#restJson1\": {},\n        \"smithy.api#documentation\": \"<p>You can use the Amazon Elastic Block Store (Amazon EBS) direct APIs to create EBS snapshots, write data directly to \\n    \\t\\tyour snapshots, read data on your snapshots, and identify the differences or changes between \\n    \\t\\ttwo snapshots. If you’re an independent software vendor (ISV) who offers backup services for \\n    \\t\\tAmazon EBS, the EBS direct APIs make it more efficient and cost-effective to track incremental changes on \\n    \\t\\tyour EBS volumes through snapshots. This can be done without having to create new volumes \\n    \\t\\tfrom snapshots, and then use Amazon Elastic Compute Cloud (Amazon EC2) instances to compare the differences.</p>\\n    \\t\\t\\n    \\t    <p>You can create incremental snapshots directly from data on-premises into EBS volumes and the \\n    \\t\\tcloud to use for quick disaster recovery. With the ability to write and read snapshots, you can \\n    \\t\\twrite your on-premises data to an EBS snapshot during a disaster. Then after recovery, you can \\n    \\t\\trestore it back to AWS or on-premises from the snapshot. You no longer need to build and \\n    \\t\\tmaintain complex mechanisms to copy data to and from Amazon EBS.</p>\\n\\n\\n        <p>This API reference provides detailed information about the actions, data types,\\n            parameters, and errors of the EBS direct APIs. For more information about the elements that\\n            make up the EBS direct APIs, and examples of how to use them effectively, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-accessing-snapshot.html\\\">Accessing the Contents of an EBS Snapshot</a> in the <i>Amazon Elastic Compute Cloud User\\n                Guide</i>. For more information about the supported AWS Regions, endpoints,\\n            and service quotas for the EBS direct APIs, see <a href=\\\"https://docs.aws.amazon.com/general/latest/gr/ebs-service.html\\\">Amazon Elastic Block Store Endpoints and Quotas</a> in\\n            the <i>AWS General Reference</i>.</p>\",\n        \"smithy.api#title\": \"Amazon Elastic Block Store\"\n      }\n    },\n    \"com.amazonaws.ebs#ErrorMessage\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#length\": {\n          \"min\": 0,\n          \"max\": 256\n        }\n      }\n    },\n    \"com.amazonaws.ebs#GetSnapshotBlock\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.ebs#GetSnapshotBlockRequest\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.ebs#GetSnapshotBlockResponse\"\n      },\n      \"errors\": [\n        {\n          \"target\": \"com.amazonaws.ebs#AccessDeniedException\"\n        },\n        {\n          \"target\": \"com.amazonaws.ebs#InternalServerException\"\n        },\n        {\n          \"target\": \"com.amazonaws.ebs#RequestThrottledException\"\n        },\n        {\n          \"target\": \"com.amazonaws.ebs#ResourceNotFoundException\"\n        },\n        {\n          \"target\": \"com.amazonaws.ebs#ServiceQuotaExceededException\"\n        },\n        {\n          \"target\": \"com.amazonaws.ebs#ValidationException\"\n        }\n      ],\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Returns the data in a block in an Amazon Elastic Block Store snapshot.</p>\",\n        \"smithy.api#http\": {\n          \"method\": \"GET\",\n          \"uri\": \"/snapshots/{SnapshotId}/blocks/{BlockIndex}\",\n          \"code\": 200\n        }\n      }\n    },\n    \"com.amazonaws.ebs#GetSnapshotBlockRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"SnapshotId\": {\n          \"target\": \"com.amazonaws.ebs#SnapshotId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The ID of the snapshot containing the block from which to get data.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {}\n          }\n        },\n        \"BlockToken\": {\n          \"target\": \"com.amazonaws.ebs#BlockToken\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The block token of the block from which to get data.</p>\\n\\n\\n        <p>Obtain the <code>BlockToken</code> by running the <code>ListChangedBlocks</code> or\\n                <code>ListSnapshotBlocks</code> operations.</p>\",\n            \"smithy.api#httpQuery\": \"blockToken\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"BlockIndex\": {\n          \"target\": \"com.amazonaws.ebs#BlockIndex\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The block index of the block from which to get data.</p>\\n\\n\\n        <p>Obtain the <code>BlockIndex</code> by running the <code>ListChangedBlocks</code> or\\n                <code>ListSnapshotBlocks</code> operations.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {}\n          }\n        }\n      }\n    },\n    \"com.amazonaws.ebs#GetSnapshotBlockResponse\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"DataLength\": {\n          \"target\": \"com.amazonaws.ebs#DataLength\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The size of the data in the block.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-Data-Length\"\n          }\n        },\n        \"ChecksumAlgorithm\": {\n          \"target\": \"com.amazonaws.ebs#ChecksumAlgorithm\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The algorithm used to generate the checksum for the block, such as SHA256.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-Checksum-Algorithm\"\n          }\n        },\n        \"Checksum\": {\n          \"target\": \"com.amazonaws.ebs#Checksum\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The checksum generated for the block, which is Base64 encoded.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-Checksum\"\n          }\n        },\n        \"BlockData\": {\n          \"target\": \"com.amazonaws.ebs#BlockData\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The data content of the block.</p>\",\n            \"smithy.api#httpPayload\": {}\n          }\n        }\n      }\n    },\n    \"com.amazonaws.ebs#IdempotencyToken\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#length\": {\n          \"min\": 0,\n          \"max\": 255\n        },\n        \"smithy.api#pattern\": \"^[\\\\S]+$\"\n      }\n    },\n    \"com.amazonaws.ebs#InternalServerException\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Message\": {\n          \"target\": \"com.amazonaws.ebs#ErrorMessage\"\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>An internal error has occurred.</p>\",\n        \"smithy.api#error\": \"server\",\n        \"smithy.api#httpError\": 500\n      }\n    },\n    \"com.amazonaws.ebs#KmsKeyArn\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#length\": {\n          \"min\": 1,\n          \"max\": 2048\n        },\n        \"smithy.api#pattern\": \"arn:aws[a-z\\\\-]*:kms:.*:[0-9]{12}:key/.*\",\n        \"smithy.api#sensitive\": {}\n      }\n    },\n    \"com.amazonaws.ebs#ListChangedBlocks\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.ebs#ListChangedBlocksRequest\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.ebs#ListChangedBlocksResponse\"\n      },\n      \"errors\": [\n        {\n          \"target\": \"com.amazonaws.ebs#AccessDeniedException\"\n        },\n        {\n          \"target\": \"com.amazonaws.ebs#InternalServerException\"\n        },\n        {\n          \"target\": \"com.amazonaws.ebs#RequestThrottledException\"\n        },\n        {\n          \"target\": \"com.amazonaws.ebs#ResourceNotFoundException\"\n        },\n        {\n          \"target\": \"com.amazonaws.ebs#ServiceQuotaExceededException\"\n        },\n        {\n          \"target\": \"com.amazonaws.ebs#ValidationException\"\n        }\n      ],\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Returns information about the blocks that are different between two\\n            Amazon Elastic Block Store snapshots of the same volume/snapshot lineage.</p>\",\n        \"smithy.api#http\": {\n          \"method\": \"GET\",\n          \"uri\": \"/snapshots/{SecondSnapshotId}/changedblocks\",\n          \"code\": 200\n        },\n        \"smithy.api#paginated\": {\n          \"inputToken\": \"NextToken\",\n          \"outputToken\": \"NextToken\",\n          \"pageSize\": \"MaxResults\"\n        }\n      }\n    },\n    \"com.amazonaws.ebs#ListChangedBlocksRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"SecondSnapshotId\": {\n          \"target\": \"com.amazonaws.ebs#SnapshotId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The ID of the second snapshot to use for the comparison.</p>\\n        <important>\\n            <p>The <code>SecondSnapshotId</code> parameter must be specified with a\\n                    <code>FirstSnapshotID</code> parameter; otherwise, an error occurs.</p>\\n        </important>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {}\n          }\n        },\n        \"FirstSnapshotId\": {\n          \"target\": \"com.amazonaws.ebs#SnapshotId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The ID of the first snapshot to use for the comparison.</p>\\n        <important>\\n            <p>The <code>FirstSnapshotID</code> parameter must be specified with a\\n                    <code>SecondSnapshotId</code> parameter; otherwise, an error occurs.</p>\\n        </important>\",\n            \"smithy.api#httpQuery\": \"firstSnapshotId\"\n          }\n        },\n        \"NextToken\": {\n          \"target\": \"com.amazonaws.ebs#PageToken\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The token to request the next page of results.</p>\",\n            \"smithy.api#httpQuery\": \"pageToken\"\n          }\n        },\n        \"MaxResults\": {\n          \"target\": \"com.amazonaws.ebs#MaxResults\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The number of results to return.</p>\",\n            \"smithy.api#httpQuery\": \"maxResults\"\n          }\n        },\n        \"StartingBlockIndex\": {\n          \"target\": \"com.amazonaws.ebs#BlockIndex\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The block index from which the comparison should start.</p>\\n        <p>The list in the response will start from this block index or the next valid block\\n            index in the snapshots.</p>\",\n            \"smithy.api#httpQuery\": \"startingBlockIndex\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.ebs#ListChangedBlocksResponse\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"BlockSize\": {\n          \"target\": \"com.amazonaws.ebs#BlockSize\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The size of the block.</p>\"\n          }\n        },\n        \"ExpiryTime\": {\n          \"target\": \"com.amazonaws.ebs#TimeStamp\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The time when the <code>BlockToken</code> expires.</p>\"\n          }\n        },\n        \"VolumeSize\": {\n          \"target\": \"com.amazonaws.ebs#VolumeSize\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The size of the volume in GB.</p>\"\n          }\n        },\n        \"NextToken\": {\n          \"target\": \"com.amazonaws.ebs#PageToken\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is null when there\\n            are no more results to return.</p>\"\n          }\n        },\n        \"ChangedBlocks\": {\n          \"target\": \"com.amazonaws.ebs#ChangedBlocks\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>An array of objects containing information about the changed blocks.</p>\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.ebs#ListSnapshotBlocks\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.ebs#ListSnapshotBlocksRequest\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.ebs#ListSnapshotBlocksResponse\"\n      },\n      \"errors\": [\n        {\n          \"target\": \"com.amazonaws.ebs#AccessDeniedException\"\n        },\n        {\n          \"target\": \"com.amazonaws.ebs#InternalServerException\"\n        },\n        {\n          \"target\": \"com.amazonaws.ebs#RequestThrottledException\"\n        },\n        {\n          \"target\": \"com.amazonaws.ebs#ResourceNotFoundException\"\n        },\n        {\n          \"target\": \"com.amazonaws.ebs#ServiceQuotaExceededException\"\n        },\n        {\n          \"target\": \"com.amazonaws.ebs#ValidationException\"\n        }\n      ],\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Returns information about the blocks in an Amazon Elastic Block Store snapshot.</p>\",\n        \"smithy.api#http\": {\n          \"method\": \"GET\",\n          \"uri\": \"/snapshots/{SnapshotId}/blocks\",\n          \"code\": 200\n        },\n        \"smithy.api#paginated\": {\n          \"inputToken\": \"NextToken\",\n          \"outputToken\": \"NextToken\",\n          \"pageSize\": \"MaxResults\"\n        }\n      }\n    },\n    \"com.amazonaws.ebs#ListSnapshotBlocksRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"MaxResults\": {\n          \"target\": \"com.amazonaws.ebs#MaxResults\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The number of results to return.</p>\",\n            \"smithy.api#httpQuery\": \"maxResults\"\n          }\n        },\n        \"StartingBlockIndex\": {\n          \"target\": \"com.amazonaws.ebs#BlockIndex\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The block index from which the list should start. The list in the response will start\\n            from this block index or the next valid block index in the snapshot.</p>\",\n            \"smithy.api#httpQuery\": \"startingBlockIndex\"\n          }\n        },\n        \"NextToken\": {\n          \"target\": \"com.amazonaws.ebs#PageToken\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The token to request the next page of results.</p>\",\n            \"smithy.api#httpQuery\": \"pageToken\"\n          }\n        },\n        \"SnapshotId\": {\n          \"target\": \"com.amazonaws.ebs#SnapshotId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The ID of the snapshot from which to get block indexes and block tokens.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {}\n          }\n        }\n      }\n    },\n    \"com.amazonaws.ebs#ListSnapshotBlocksResponse\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"VolumeSize\": {\n          \"target\": \"com.amazonaws.ebs#VolumeSize\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The size of the volume in GB.</p>\"\n          }\n        },\n        \"NextToken\": {\n          \"target\": \"com.amazonaws.ebs#PageToken\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The token to use to retrieve the next page of results. This value is null when there\\n            are no more results to return.</p>\"\n          }\n        },\n        \"ExpiryTime\": {\n          \"target\": \"com.amazonaws.ebs#TimeStamp\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The time when the <code>BlockToken</code> expires.</p>\"\n          }\n        },\n        \"Blocks\": {\n          \"target\": \"com.amazonaws.ebs#Blocks\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>An array of objects containing information about the blocks.</p>\"\n          }\n        },\n        \"BlockSize\": {\n          \"target\": \"com.amazonaws.ebs#BlockSize\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The size of the block.</p>\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.ebs#MaxResults\": {\n      \"type\": \"integer\",\n      \"traits\": {\n        \"smithy.api#box\": {},\n        \"smithy.api#range\": {\n          \"min\": 100,\n          \"max\": 10000\n        }\n      }\n    },\n    \"com.amazonaws.ebs#OwnerId\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#length\": {\n          \"min\": 1,\n          \"max\": 24\n        },\n        \"smithy.api#pattern\": \"\\\\S+\"\n      }\n    },\n    \"com.amazonaws.ebs#PageToken\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#length\": {\n          \"min\": 0,\n          \"max\": 256\n        },\n        \"smithy.api#pattern\": \"^[A-Za-z0-9+/=]+$\"\n      }\n    },\n    \"com.amazonaws.ebs#Progress\": {\n      \"type\": \"integer\",\n      \"traits\": {\n        \"smithy.api#box\": {},\n        \"smithy.api#range\": {\n          \"min\": 0,\n          \"max\": 100\n        }\n      }\n    },\n    \"com.amazonaws.ebs#PutSnapshotBlock\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.ebs#PutSnapshotBlockRequest\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.ebs#PutSnapshotBlockResponse\"\n      },\n      \"errors\": [\n        {\n          \"target\": \"com.amazonaws.ebs#AccessDeniedException\"\n        },\n        {\n          \"target\": \"com.amazonaws.ebs#InternalServerException\"\n        },\n        {\n          \"target\": \"com.amazonaws.ebs#RequestThrottledException\"\n        },\n        {\n          \"target\": \"com.amazonaws.ebs#ResourceNotFoundException\"\n        },\n        {\n          \"target\": \"com.amazonaws.ebs#ServiceQuotaExceededException\"\n        },\n        {\n          \"target\": \"com.amazonaws.ebs#ValidationException\"\n        }\n      ],\n      \"traits\": {\n        \"aws.auth#unsignedPayload\": {},\n        \"smithy.api#auth\": [\"aws.auth#sigv4\"],\n        \"smithy.api#documentation\": \"<p>Writes a block of data to a snapshot. If the specified block contains\\n            data, the existing data is overwritten. The target snapshot must be in the\\n                <code>pending</code> state.</p>  \\t\\n    \\t    <p>Data written to a snapshot must be aligned with 512-byte sectors.</p>\",\n        \"smithy.api#http\": {\n          \"method\": \"PUT\",\n          \"uri\": \"/snapshots/{SnapshotId}/blocks/{BlockIndex}\",\n          \"code\": 201\n        }\n      }\n    },\n    \"com.amazonaws.ebs#PutSnapshotBlockRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"SnapshotId\": {\n          \"target\": \"com.amazonaws.ebs#SnapshotId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The ID of the snapshot.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {}\n          }\n        },\n        \"BlockIndex\": {\n          \"target\": \"com.amazonaws.ebs#BlockIndex\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The block index of the block in which to write the data. A block index is a logical \\n    \\tindex in units of <code>512</code> KiB blocks. To identify the block index, divide \\n        \\tthe logical offset of the data in the logical volume by the block size (logical offset of \\n        \\tdata/<code>524288</code>). The logical offset of the data must be <code>512</code> \\n        \\tKiB aligned.</p>\",\n            \"smithy.api#httpLabel\": {},\n            \"smithy.api#required\": {}\n          }\n        },\n        \"Checksum\": {\n          \"target\": \"com.amazonaws.ebs#Checksum\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A Base64-encoded SHA256 checksum of the data. Only SHA256 checksums are\\n            supported.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-Checksum\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"Progress\": {\n          \"target\": \"com.amazonaws.ebs#Progress\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The progress of the write process, as a percentage.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-Progress\"\n          }\n        },\n        \"BlockData\": {\n          \"target\": \"com.amazonaws.ebs#BlockData\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The data to write to the block.</p>\\n        <p>The block data is not signed as part of the Signature Version 4 signing process. As a\\n            result, you must generate and provide a Base64-encoded SHA256 checksum for the block\\n            data using the <b>x-amz-Checksum</b> header. Also, you \\n        \\tmust specify the checksum algorithm using the <b>x-amz-Checksum-Algorithm</b> \\n        \\theader. The checksum that you provide is part of the Signature Version 4 signing process. \\n        \\tIt is validated against a checksum generated by Amazon EBS to ensure the validity and authenticity \\n        \\tof the data. If the checksums do not correspond, the request fails. For more information, \\n        \\tsee <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-accessing-snapshot.html#ebsapis-using-checksums\\\">\\n                Using checksums with the EBS direct APIs</a> in the <i>Amazon Elastic Compute Cloud User\\n                Guide</i>.</p>\",\n            \"smithy.api#httpPayload\": {},\n            \"smithy.api#required\": {}\n          }\n        },\n        \"DataLength\": {\n          \"target\": \"com.amazonaws.ebs#DataLength\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The size of the data to write to the block, in bytes. Currently, the only supported\\n            size is <code>524288</code>.</p>\\n        <p>Valid values: <code>524288</code>\\n         </p>\",\n            \"smithy.api#httpHeader\": \"x-amz-Data-Length\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"ChecksumAlgorithm\": {\n          \"target\": \"com.amazonaws.ebs#ChecksumAlgorithm\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The algorithm used to generate the checksum. Currently, the only supported algorithm\\n            is <code>SHA256</code>.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-Checksum-Algorithm\",\n            \"smithy.api#required\": {}\n          }\n        }\n      }\n    },\n    \"com.amazonaws.ebs#PutSnapshotBlockResponse\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"ChecksumAlgorithm\": {\n          \"target\": \"com.amazonaws.ebs#ChecksumAlgorithm\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The algorithm used by Amazon EBS to generate the checksum.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-Checksum-Algorithm\"\n          }\n        },\n        \"Checksum\": {\n          \"target\": \"com.amazonaws.ebs#Checksum\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The SHA256 checksum generated for the block data by Amazon EBS.</p>\",\n            \"smithy.api#httpHeader\": \"x-amz-Checksum\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.ebs#RequestThrottledException\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Message\": {\n          \"target\": \"com.amazonaws.ebs#ErrorMessage\"\n        },\n        \"Reason\": {\n          \"target\": \"com.amazonaws.ebs#RequestThrottledExceptionReason\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The reason for the exception.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>The number of API requests has exceed the maximum allowed API request throttling\\n            limit.</p>\",\n        \"smithy.api#error\": \"client\",\n        \"smithy.api#httpError\": 400\n      }\n    },\n    \"com.amazonaws.ebs#RequestThrottledExceptionReason\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#enum\": [\n          {\n            \"value\": \"ACCOUNT_THROTTLED\",\n            \"name\": \"ACCOUNT_THROTTLED\"\n          },\n          {\n            \"value\": \"DEPENDENCY_REQUEST_THROTTLED\",\n            \"name\": \"DEPENDENCY_REQUEST_THROTTLED\"\n          }\n        ]\n      }\n    },\n    \"com.amazonaws.ebs#ResourceNotFoundException\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Message\": {\n          \"target\": \"com.amazonaws.ebs#ErrorMessage\"\n        },\n        \"Reason\": {\n          \"target\": \"com.amazonaws.ebs#ResourceNotFoundExceptionReason\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The reason for the exception.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>The specified resource does not exist.</p>\",\n        \"smithy.api#error\": \"client\",\n        \"smithy.api#httpError\": 404\n      }\n    },\n    \"com.amazonaws.ebs#ResourceNotFoundExceptionReason\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#enum\": [\n          {\n            \"value\": \"SNAPSHOT_NOT_FOUND\",\n            \"name\": \"SNAPSHOT_NOT_FOUND\"\n          },\n          {\n            \"value\": \"DEPENDENCY_RESOURCE_NOT_FOUND\",\n            \"name\": \"DEPENDENCY_RESOURCE_NOT_FOUND\"\n          }\n        ]\n      }\n    },\n    \"com.amazonaws.ebs#ServiceQuotaExceededException\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Reason\": {\n          \"target\": \"com.amazonaws.ebs#ServiceQuotaExceededExceptionReason\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The reason for the exception.</p>\"\n          }\n        },\n        \"Message\": {\n          \"target\": \"com.amazonaws.ebs#ErrorMessage\"\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Your current service quotas do not allow you to perform this action.</p>\",\n        \"smithy.api#error\": \"client\",\n        \"smithy.api#httpError\": 402\n      }\n    },\n    \"com.amazonaws.ebs#ServiceQuotaExceededExceptionReason\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#enum\": [\n          {\n            \"value\": \"DEPENDENCY_SERVICE_QUOTA_EXCEEDED\",\n            \"name\": \"DEPENDENCY_SERVICE_QUOTA_EXCEEDED\"\n          }\n        ]\n      }\n    },\n    \"com.amazonaws.ebs#SnapshotId\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#length\": {\n          \"min\": 1,\n          \"max\": 64\n        },\n        \"smithy.api#pattern\": \"^snap-[0-9a-f]+$\"\n      }\n    },\n    \"com.amazonaws.ebs#StartSnapshot\": {\n      \"type\": \"operation\",\n      \"input\": {\n        \"target\": \"com.amazonaws.ebs#StartSnapshotRequest\"\n      },\n      \"output\": {\n        \"target\": \"com.amazonaws.ebs#StartSnapshotResponse\"\n      },\n      \"errors\": [\n        {\n          \"target\": \"com.amazonaws.ebs#AccessDeniedException\"\n        },\n        {\n          \"target\": \"com.amazonaws.ebs#ConcurrentLimitExceededException\"\n        },\n        {\n          \"target\": \"com.amazonaws.ebs#ConflictException\"\n        },\n        {\n          \"target\": \"com.amazonaws.ebs#InternalServerException\"\n        },\n        {\n          \"target\": \"com.amazonaws.ebs#RequestThrottledException\"\n        },\n        {\n          \"target\": \"com.amazonaws.ebs#ResourceNotFoundException\"\n        },\n        {\n          \"target\": \"com.amazonaws.ebs#ServiceQuotaExceededException\"\n        },\n        {\n          \"target\": \"com.amazonaws.ebs#ValidationException\"\n        }\n      ],\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Creates a new Amazon EBS snapshot. The new snapshot enters the <code>pending</code> state\\n            after the request completes. </p>\\n        <p>After creating the snapshot, use <a href=\\\"https://docs.aws.amazon.com/ebs/latest/APIReference/API_PutSnapshotBlock.html\\\"> PutSnapshotBlock</a> to\\n            write blocks of data to the snapshot.</p>\",\n        \"smithy.api#http\": {\n          \"method\": \"POST\",\n          \"uri\": \"/snapshots\",\n          \"code\": 201\n        }\n      }\n    },\n    \"com.amazonaws.ebs#StartSnapshotRequest\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Timeout\": {\n          \"target\": \"com.amazonaws.ebs#Timeout\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The amount of time (in minutes) after which the snapshot is automatically cancelled\\n            if:</p>\\n        <ul>\\n            <li>\\n                <p>No blocks are written to the snapshot.</p>\\n            </li>\\n            <li>\\n                <p>The snapshot is not completed after writing the last block of data.</p>\\n            </li>\\n         </ul>\\n        <p>If no value is specified, the timeout defaults to <code>60</code> minutes.</p>\"\n          }\n        },\n        \"ClientToken\": {\n          \"target\": \"com.amazonaws.ebs#IdempotencyToken\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A unique, case-sensitive identifier that you provide to ensure the idempotency of the\\n            request. Idempotency ensures that an API request completes only once. With an idempotent \\n            request, if the original request completes successfully. The subsequent retries with the same \\n            client token return the result from the original successful request and they have no additional \\n            effect.</p>\\n        <p>If you do not specify a client token, one is automatically generated by the AWS SDK.</p>\\n        <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-direct-api-idempotency.html\\\">\\n    \\t\\tIdempotency for StartSnapshot API</a> in the <i>Amazon Elastic Compute Cloud User Guide</i>.</p>\",\n            \"smithy.api#idempotencyToken\": {}\n          }\n        },\n        \"VolumeSize\": {\n          \"target\": \"com.amazonaws.ebs#VolumeSize\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The size of the volume, in GiB. The maximum size is <code>16384</code> GiB (16\\n            TiB).</p>\",\n            \"smithy.api#required\": {}\n          }\n        },\n        \"Tags\": {\n          \"target\": \"com.amazonaws.ebs#Tags\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The tags to apply to the snapshot.</p>\"\n          }\n        },\n        \"Encrypted\": {\n          \"target\": \"com.amazonaws.ebs#Boolean\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>Indicates whether to encrypt the snapshot. To create an encrypted snapshot, specify\\n                <code>true</code>. To create an unencrypted snapshot, omit this parameter.</p>\\n        <p>If you specify a value for <b>ParentSnapshotId</b>, omit\\n            this parameter.</p>\\n        <p>If you specify <code>true</code>, the snapshot is encrypted using the CMK specified\\n            using the <b>KmsKeyArn</b> parameter. If no value is specified\\n            for <b>KmsKeyArn</b>, the default CMK for your account is \\n        \\tused. If no default CMK has been specified for your account, the AWS managed CMK is used. \\n        \\tTo set a default CMK for your account, use <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_ModifyEbsDefaultKmsKeyId.html\\\">\\n        \\t\\tModifyEbsDefaultKmsKeyId</a>.</p>\\n        <p>If your account is enabled for encryption by default, you cannot set this parameter to\\n                <code>false</code>. In this case, you can omit this parameter.</p>\\n\\n        <p>For more information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-accessing-snapshot.html#ebsapis-using-encryption\\\">\\n                Using encryption</a> in the <i>Amazon Elastic Compute Cloud User Guide</i>.</p>\"\n          }\n        },\n        \"KmsKeyArn\": {\n          \"target\": \"com.amazonaws.ebs#KmsKeyArn\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the AWS Key Management Service (AWS KMS) \\n        \\tcustomer master key (CMK) to be used to encrypt the snapshot. If you do not specify a \\n        \\tCMK, the default AWS managed CMK is used.</p>\\n        <p>If you specify a <b>ParentSnapshotId</b>, omit this\\n            parameter; the snapshot will be encrypted using the same CMK that was used to encrypt\\n            the parent snapshot.</p>\\n        <p>If <b>Encrypted</b> is set to <code>true</code>, \\n        \\tyou must specify a CMK ARN. </p>\"\n          }\n        },\n        \"ParentSnapshotId\": {\n          \"target\": \"com.amazonaws.ebs#SnapshotId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The ID of the parent snapshot. If there is no parent snapshot, or if you are creating\\n            the first snapshot for an on-premises volume, omit this parameter.</p>\\n        <p>If your account is enabled for encryption by default, you cannot use an unencrypted\\n            snapshot as a parent snapshot. You must first create an encrypted copy of the parent\\n            snapshot using <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CopySnapshot.html\\\">CopySnapshot</a>.</p>\"\n          }\n        },\n        \"Description\": {\n          \"target\": \"com.amazonaws.ebs#Description\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>A description for the snapshot.</p>\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.ebs#StartSnapshotResponse\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Tags\": {\n          \"target\": \"com.amazonaws.ebs#Tags\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The tags applied to the snapshot. You can specify up to 50 tags per snapshot. For more\\n            information, see <a href=\\\"https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Tags.html\\\"> Tagging your Amazon EC2\\n                resources</a> in the <i>Amazon Elastic Compute Cloud User Guide</i>.</p>\"\n          }\n        },\n        \"KmsKeyArn\": {\n          \"target\": \"com.amazonaws.ebs#KmsKeyArn\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The Amazon Resource Name (ARN) of the AWS Key Management Service (AWS KMS) customer\\n            master key (CMK) used to encrypt the snapshot.</p>\"\n          }\n        },\n        \"OwnerId\": {\n          \"target\": \"com.amazonaws.ebs#OwnerId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The AWS account ID of the snapshot owner.</p>\"\n          }\n        },\n        \"VolumeSize\": {\n          \"target\": \"com.amazonaws.ebs#VolumeSize\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The size of the volume, in GiB.</p>\"\n          }\n        },\n        \"ParentSnapshotId\": {\n          \"target\": \"com.amazonaws.ebs#SnapshotId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The ID of the parent snapshot.</p>\"\n          }\n        },\n        \"Description\": {\n          \"target\": \"com.amazonaws.ebs#Description\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The description of the snapshot.</p>\"\n          }\n        },\n        \"SnapshotId\": {\n          \"target\": \"com.amazonaws.ebs#SnapshotId\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The ID of the snapshot.</p>\"\n          }\n        },\n        \"BlockSize\": {\n          \"target\": \"com.amazonaws.ebs#BlockSize\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The size of the blocks in the snapshot, in bytes.</p>\"\n          }\n        },\n        \"StartTime\": {\n          \"target\": \"com.amazonaws.ebs#TimeStamp\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The timestamp when the snapshot was created.</p>\"\n          }\n        },\n        \"Status\": {\n          \"target\": \"com.amazonaws.ebs#Status\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The status of the snapshot.</p>\"\n          }\n        }\n      }\n    },\n    \"com.amazonaws.ebs#Status\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#enum\": [\n          {\n            \"value\": \"completed\",\n            \"name\": \"COMPLETED\"\n          },\n          {\n            \"value\": \"pending\",\n            \"name\": \"PENDING\"\n          },\n          {\n            \"value\": \"error\",\n            \"name\": \"ERROR\"\n          }\n        ],\n        \"smithy.api#length\": {\n          \"min\": 0,\n          \"max\": 32\n        }\n      }\n    },\n    \"com.amazonaws.ebs#Tag\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Key\": {\n          \"target\": \"com.amazonaws.ebs#TagKey\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The key of the tag.</p>\"\n          }\n        },\n        \"Value\": {\n          \"target\": \"com.amazonaws.ebs#TagValue\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The value of the tag.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>Describes a tag.</p>\"\n      }\n    },\n    \"com.amazonaws.ebs#TagKey\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#length\": {\n          \"min\": 0,\n          \"max\": 127\n        },\n        \"smithy.api#pattern\": \"^[\\\\S\\\\s]+$\"\n      }\n    },\n    \"com.amazonaws.ebs#TagValue\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#length\": {\n          \"min\": 0,\n          \"max\": 255\n        },\n        \"smithy.api#pattern\": \"^[\\\\S\\\\s]+$\"\n      }\n    },\n    \"com.amazonaws.ebs#Tags\": {\n      \"type\": \"list\",\n      \"member\": {\n        \"target\": \"com.amazonaws.ebs#Tag\"\n      }\n    },\n    \"com.amazonaws.ebs#TimeStamp\": {\n      \"type\": \"timestamp\"\n    },\n    \"com.amazonaws.ebs#Timeout\": {\n      \"type\": \"integer\",\n      \"traits\": {\n        \"smithy.api#box\": {},\n        \"smithy.api#range\": {\n          \"min\": 10,\n          \"max\": 60\n        }\n      }\n    },\n    \"com.amazonaws.ebs#ValidationException\": {\n      \"type\": \"structure\",\n      \"members\": {\n        \"Message\": {\n          \"target\": \"com.amazonaws.ebs#ErrorMessage\"\n        },\n        \"Reason\": {\n          \"target\": \"com.amazonaws.ebs#ValidationExceptionReason\",\n          \"traits\": {\n            \"smithy.api#documentation\": \"<p>The reason for the validation exception.</p>\"\n          }\n        }\n      },\n      \"traits\": {\n        \"smithy.api#documentation\": \"<p>The input fails to satisfy the constraints of the EBS direct APIs.</p>\",\n        \"smithy.api#error\": \"client\",\n        \"smithy.api#httpError\": 400\n      }\n    },\n    \"com.amazonaws.ebs#ValidationExceptionReason\": {\n      \"type\": \"string\",\n      \"traits\": {\n        \"smithy.api#enum\": [\n          {\n            \"value\": \"INVALID_CUSTOMER_KEY\",\n            \"name\": \"INVALID_CUSTOMER_KEY\"\n          },\n          {\n            \"value\": \"INVALID_PAGE_TOKEN\",\n            \"name\": \"INVALID_PAGE_TOKEN\"\n          },\n          {\n            \"value\": \"INVALID_BLOCK_TOKEN\",\n            \"name\": \"INVALID_BLOCK_TOKEN\"\n          },\n          {\n            \"value\": \"INVALID_SNAPSHOT_ID\",\n            \"name\": \"INVALID_SNAPSHOT_ID\"\n          },\n          {\n            \"value\": \"UNRELATED_SNAPSHOTS\",\n            \"name\": \"UNRELATED_SNAPSHOTS\"\n          },\n          {\n            \"value\": \"INVALID_BLOCK\",\n            \"name\": \"INVALID_BLOCK\"\n          },\n          {\n            \"value\": \"INVALID_CONTENT_ENCODING\",\n            \"name\": \"INVALID_CONTENT_ENCODING\"\n          },\n          {\n            \"value\": \"INVALID_TAG\",\n            \"name\": \"INVALID_TAG\"\n          },\n          {\n            \"value\": \"INVALID_DEPENDENCY_REQUEST\",\n            \"name\": \"INVALID_DEPENDENCY_REQUEST\"\n          },\n          {\n            \"value\": \"INVALID_PARAMETER_VALUE\",\n            \"name\": \"INVALID_PARAMETER_VALUE\"\n          },\n          {\n            \"value\": \"INVALID_VOLUME_SIZE\",\n            \"name\": \"INVALID_VOLUME_SIZE\"\n          }\n        ]\n      }\n    },\n    \"com.amazonaws.ebs#VolumeSize\": {\n      \"type\": \"long\",\n      \"traits\": {\n        \"smithy.api#box\": {},\n        \"smithy.api#range\": {\n          \"min\": 1\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "codegen-core/common-test-models/misc.smithy",
    "content": "$version: \"1.0\"\n\nnamespace aws.protocoltests.misc\n\nuse aws.protocols#restJson1\nuse smithy.test#httpRequestTests\nuse smithy.test#httpResponseTests\nuse smithy.framework#ValidationException\n\n/// A service to test miscellaneous aspects of code generation where protocol\n/// selection is not relevant. If you want to test something protocol-specific,\n/// add it to a separate `[protocol]-extras.smithy`.\n@restJson1\n@title(\"MiscService\")\nservice MiscService {\n    operations: [\n        TypeComplexityOperation,\n        RequiredInnerShapeOperation,\n        RequiredHeaderCollectionOperation,\n        ResponseCodeRequiredOperation,\n        ResponseCodeHttpFallbackOperation,\n        ResponseCodeDefaultOperation,\n    ],\n}\n\n/// An operation whose shapes generate complex Rust types.\n/// See https://rust-lang.github.io/rust-clippy/master/index.html#type_complexity.\n@http(uri: \"/typeComplexityOperation\", method: \"POST\")\noperation TypeComplexityOperation {\n    input: TypeComplexityOperationInputOutput,\n    output: TypeComplexityOperationInputOutput,\n}\n\nstructure TypeComplexityOperationInputOutput {\n    list: ListA\n}\n\nlist ListA {\n    member: ListB\n}\n\nlist ListB {\n    member: ListC\n}\n\nlist ListC {\n    member: MapA\n}\n\nmap MapA {\n    key: String,\n    value: EmptyStructure\n}\n\n/// This operation tests that (de)serializing required values from a nested\n/// shape works correctly.\n@http(uri: \"/requiredInnerShapeOperation\", method: \"POST\")\noperation RequiredInnerShapeOperation {\n    input: RequiredInnerShapeOperationInputOutput,\n    output: RequiredInnerShapeOperationInputOutput,\n    errors: [ValidationException],\n}\n\nstructure RequiredInnerShapeOperationInputOutput {\n    inner: InnerShape\n}\n\nstructure InnerShape {\n    @required\n    requiredInnerMostShape: InnermostShape\n}\n\nstructure InnermostShape {\n    @required\n    aString: String,\n\n    @required\n    aBoolean: Boolean,\n\n    @required\n    aByte: Byte,\n\n    @required\n    aShort: Short,\n\n    @required\n    anInt: Integer,\n\n    @required\n    aLong: Long,\n\n    @required\n    aFloat: Float,\n\n    @required\n    aDouble: Double,\n\n     @required\n     aBigInteger: BigInteger,\n\n     @required\n     aBigDecimal: BigDecimal,\n\n    @required\n    aTimestamp: Timestamp,\n\n    @required\n    aDocument: Timestamp,\n\n    @required\n    aStringList: AStringList,\n\n    @required\n    aStringMap: AMap,\n\n    @required\n    aStringSet: AStringSet,\n\n    @required\n    aBlob: Blob,\n\n    @required\n    aUnion: AUnion\n}\n\nlist AStringList {\n    member: String\n}\n\nlist AStringSet {\n    member: String\n}\n\nmap AMap {\n    key: String,\n    value: Timestamp\n}\n\nunion AUnion {\n    i32: Integer,\n    string: String,\n    time: Timestamp,\n}\n\n/// This operation tests that the response code defaults to 200 when no other\n/// code is set.\n@httpResponseTests([\n    {\n        id: \"ResponseCodeDefaultOperation\",\n        protocol: \"aws.protocols#restJson1\",\n        code: 200,\n    }\n])\n@http(method: \"GET\", uri: \"/responseCodeDefaultOperation\")\noperation ResponseCodeDefaultOperation {\n    input: EmptyStructure,\n    output: EmptyStructure,\n}\n\n/// This operation tests that the response code defaults to `@http`'s code.\n@httpResponseTests([\n    {\n        id: \"ResponseCodeHttpFallbackOperation\",\n        protocol: \"aws.protocols#restJson1\",\n        code: 201,\n        headers: {\n            \"Content-Length\": \"2\"\n        }\n    }\n])\n@http(method: \"GET\", uri: \"/responseCodeHttpFallbackOperation\", code: 201)\noperation ResponseCodeHttpFallbackOperation {\n    input: EmptyStructure,\n    output: EmptyStructure,\n}\n\nstructure EmptyStructure {}\n\n/// This operation tests that `@httpResponseCode` is `@required`\n/// and is used over `@http's` code.\n@httpResponseTests([\n    {\n        id: \"ResponseCodeRequiredOperation\",\n        protocol: \"aws.protocols#restJson1\",\n        code: 201,\n        params: {\"responseCode\": 201},\n        headers: {\n            \"Content-Length\": \"2\"\n        }\n    }\n])\n@http(method: \"GET\", uri: \"/responseCodeRequiredOperation\", code: 200)\noperation ResponseCodeRequiredOperation {\n    input: EmptyStructure,\n    output: ResponseCodeRequiredOutput,\n}\n\n@output\nstructure ResponseCodeRequiredOutput {\n    @required\n    @httpResponseCode\n    responseCode: Integer,\n}\n\n@http(uri: \"/required-header-collection-operation\", method: \"GET\")\noperation RequiredHeaderCollectionOperation {\n    input: RequiredHeaderCollectionOperationInputOutput,\n    output: RequiredHeaderCollectionOperationInputOutput,\n    errors: [ValidationException]\n}\n\nstructure RequiredHeaderCollectionOperationInputOutput {\n    @required\n    @httpHeader(\"X-Required-List\")\n    requiredHeaderList: HeaderList,\n\n    @required\n    @httpHeader(\"X-Required-Set\")\n    requiredHeaderSet: HeaderSet,\n}\n\nlist HeaderList {\n    member: String\n}\n\n@uniqueItems\nlist HeaderSet {\n    member: String\n}\n"
  },
  {
    "path": "codegen-core/common-test-models/naming-obstacle-course-casing.smithy",
    "content": "$version: \"1.0\"\nnamespace casing\n\nuse aws.protocols#awsJson1_1\n\n// TODO(https://github.com/smithy-lang/smithy-rs/issues/2340): The commented part of the model breaks the generator in a\n// miriad of ways. Any solution to the linked issue must address this.\n\n/// Confounds model generation machinery with lots of problematic casing\n@awsJson1_1\nservice ACRONYMInside_Service {\n    operations: [\n        DoNothing,\n    //    ACRONYMInside_Op\n    //    ACRONYM_InsideOp\n    ]\n}\n\noperation DoNothing {}\n\n// operation ACRONYMInside_Op {\n//     input: Input,\n//     output: Output,\n//     errors: [Error],\n// }\n\n// operation ACRONYM_InsideOp {\n//     input: Input,\n//     output: Output,\n//     errors: [Error],\n// }\n\n// structure Input {\n//     ACRONYMInside_Member: ACRONYMInside_Struct,\n//     ACRONYM_Inside_Member: ACRONYM_InsideStruct,\n//     ACRONYM_InsideMember: ACRONYMInsideStruct\n// }\n\n// structure Output {\n//     ACRONYMInside_Member: ACRONYMInside_Struct,\n//     ACRONYM_Inside_Member: ACRONYM_InsideStruct,\n//     ACRONYM_InsideMember: ACRONYMInsideStruct\n// }\n\n// @error(\"client\")\n// structure Error {\n//     ACRONYMInside_Member: ACRONYMInside_Struct,\n//     ACRONYM_Inside_Member: ACRONYM_InsideStruct,\n//     ACRONYM_InsideMember: ACRONYMInsideStruct\n// }\n\n// structure ACRONYMInside_Struct {\n//     ACRONYMInside_Member: ACRONYM_InsideStruct,\n//     ACRONYM_Inside_Member: Integer,\n// }\n\n// structure ACRONYM_InsideStruct {\n//     ACRONYMInside_Member: Integer,\n// }\n\n// structure ACRONYMInsideStruct {\n//     ACRONYMInside_Member: Integer,\n// }\n"
  },
  {
    "path": "codegen-core/common-test-models/naming-obstacle-course-ops.smithy",
    "content": "$version: \"1.0\"\nnamespace crate\n\nuse smithy.test#httpRequestTests\nuse smithy.test#httpResponseTests\nuse aws.protocols#awsJson1_1\nuse aws.api#service\nuse smithy.framework#ValidationException\n\n/// Confounds model generation machinery with lots of problematic names\n@awsJson1_1\n@service(sdkId: \"Config\")\nservice Config {\n    version: \"2006-03-01\",\n    operations: [\n       ReservedWordsAsMembers,\n       StructureNamePunning,\n       ErrCollisions,\n       Result,\n       Option,\n       Match,\n       RPCEcho\n    ]\n}\n\n@httpRequestTests([\n    {\n        id: \"reserved_words\",\n        protocol: awsJson1_1,\n        params: {\n            \"as\": 5,\n            \"async\": true,\n        },\n        method: \"POST\",\n        uri: \"/\",\n        body: \"{\\\"as\\\": 5, \\\"async\\\": true}\",\n        bodyMediaType: \"application/json\",\n        headers: {\n            \"Content-Type\": \"application/x-amz-json-1.1\",\n            \"X-Amz-Target\": \"Config.ReservedWordsAsMembers\",\n        },\n    }\n])\noperation ReservedWordsAsMembers {\n    input: ReservedWords,\n    errors: [ValidationException],\n}\n\n// tests that module names are properly escaped\noperation Match {\n    input: ReservedWords\n    errors: [ValidationException],\n}\n\n// Should generate a PascalCased `RpcEchoInput` struct.\noperation RPCEcho {\n    input: ReservedWords\n    errors: [ValidationException],\n}\n\nstructure ReservedWords {\n    as: Integer,\n    async: Boolean,\n    enum: UnknownVariantCollidingEnum,\n    self: Boolean,\n    crate: Boolean,\n    super: Boolean,\n    build: String,\n    default: String,\n    send: String,\n    specialCharEnum: SpecialCharacterEnum,\n    unnamedEnum: UnnamedEnum\n}\n\nstructure Type {\n    field: String\n}\n\n@httpRequestTests([\n    {\n        id: \"structure_punning\",\n        protocol: awsJson1_1,\n        params: {\n            \"regular_string\": \"hello!\",\n        },\n        method: \"POST\",\n        uri: \"/\",\n        body: \"{\\\"regular_string\\\": \\\"hello!\\\"}\",\n        bodyMediaType: \"application/json\",\n        headers: {\n            \"Content-Type\": \"application/x-amz-json-1.1\",\n            \"X-Amz-Target\": \"Config.StructureNamePunning\",\n        },\n    }\n])\noperation StructureNamePunning {\n    input: StructureNamePunningInput\n}\n\nstructure StructureNamePunningInput {\n    regular_string: smithy.api#String,\n    punned_vec: Vec\n}\n\nstructure Vec {\n    pv_member: Boolean\n}\n\nstructure Some {\n    pv_member: Boolean\n}\n\nstructure None {\n}\n\n\noperation ErrCollisions {\n    errors: [\n        CollidingError,\n        CollidingException\n        // , ErrCollisionsException\n    ]\n}\n\noperation Result {\n    input: Vec,\n    output: Some\n}\n\noperation Option {\n    input: Vec,\n    output: None\n}\n\n@error(\"client\")\nstructure CollidingError {\n\n}\n\n/// This will be renamed to CollidingError\n@error(\"client\")\nstructure CollidingException {\n\n}\n\n// This will conflict with the name of the top-level error declaration\n// Fixing this is more refactoring than I want to get into right now\n// @error(\"client\")\n// structure ErrCollisionsException { }\n\n// The \"Unknown\" value on this enum collides with the code generated \"Unknown\" variant used for backwards compatibility\n@enum([\n    { name: \"Known\", value: \"Known\" },\n    { name: \"Unknown\", value: \"Unknown\" },\n    { name: \"Self\", value: \"Self\" },\n    { name: \"UnknownValue\", value: \"UnknownValue\" },\n    { name: \"SelfValue\", value: \"SelfValue\" }\n])\nstring UnknownVariantCollidingEnum\n\n// Enum values containing special characters that conflict with Rust/codegen syntax\n// The \"#\" character is the formatting character in rustTemplate, so it must be escaped\n// See https://github.com/smithy-lang/smithy-rs/pull/4476\n@enum([\n    { name: \"HashTag\", value: \"#hashtag\" },\n    { name: \"DoubleHash\", value: \"##double\" },\n    { name: \"HashInMiddle\", value: \"foo#bar\" },\n    { name: \"Plain\", value: \"plain\" }\n])\nstring SpecialCharacterEnum\n\n// Unnamed enum (no names, only values) - tests AsRef<str> implementation\n// See https://github.com/smithy-lang/smithy-rs/issues/3886\n// See https://github.com/smithy-lang/smithy-rs/pull/4478\n@enum([\n    { value: \"Foo\" },\n    { value: \"Bar\" },\n    { value: \"Baz\" }\n])\nstring UnnamedEnum\n"
  },
  {
    "path": "codegen-core/common-test-models/naming-obstacle-course-structs.smithy",
    "content": "$version: \"1.0\"\nnamespace naming_obs_structs\n\nuse aws.protocols#awsJson1_1\nuse aws.api#service\n\n/// Confounds model generation machinery with lots of problematic names\n@awsJson1_1\n@service(sdkId: \"NamingObstacleCourseStructs\")\nservice NamingObstacleCourseStructs {\n    version: \"2006-03-01\",\n    operations: [\n       Structs,\n    ]\n}\n\nstructure SomethingElse {\n    result: Result,\n    resultList: ResultList,\n    option: Option,\n    optionList: OptionList,\n    someUnion: SomeUnion,\n}\n\nunion SomeUnion {\n    Result: Result,\n    Option: Option,\n}\n\nstructure Result {\n    value: String,\n}\nlist ResultList {\n    member: Result,\n}\nstructure Option {\n    value: String,\n}\nlist OptionList {\n    member: Result,\n}\n\nstructure StructsInputOutput {\n    result: Result,\n    resultList: ResultList,\n    option: Option,\n    optionList: OptionList,\n    somethingElse: SomethingElse,\n}\noperation Structs {\n    input: StructsInputOutput,\n    output: StructsInputOutput\n}\n"
  },
  {
    "path": "codegen-core/common-test-models/pokemon-awsjson.smithy",
    "content": "$version: \"2\"\n\n// TODO(https://github.com/smithy-lang/smithy-rs/issues/2215)\n// This is a temporary model to test AwsJson 1.0 with @streaming.\n// This model will be removed when protocol tests support @streaming.\n\nnamespace com.aws.example\n\nuse aws.protocols#awsJson1_0\nuse smithy.framework#ValidationException\nuse com.aws.example#PokemonSpecies\nuse com.aws.example#GetServerStatistics\nuse com.aws.example#DoNothing\nuse com.aws.example#CheckHealth\n\n/// The Pokémon Service allows you to retrieve information about Pokémon species.\n@title(\"Pokémon Service\")\n@awsJson1_0\nservice PokemonService {\n    version: \"2024-03-18\"\n    operations: [\n        GetServerStatistics\n        DoNothing\n        CapturePokemon\n        CheckHealth\n    ]\n}\n\n/// Capture Pokémons via event streams.\noperation CapturePokemon {\n    input := {\n        events: AttemptCapturingPokemonEvent\n    }\n    output := {\n        events: CapturePokemonEvents\n    }\n    errors: [\n        UnsupportedRegionError\n        ThrottlingError\n        ValidationException\n    ]\n}\n\n@streaming\nunion AttemptCapturingPokemonEvent {\n    event: CapturingEvent\n    masterball_unsuccessful: MasterBallUnsuccessful\n}\n\nstructure CapturingEvent {\n    @eventPayload\n    payload: CapturingPayload\n}\n\nstructure CapturingPayload {\n    name: String\n    pokeball: String\n}\n\n@streaming\nunion CapturePokemonEvents {\n    event: CaptureEvent\n    invalid_pokeball: InvalidPokeballError\n    throttlingError: ThrottlingError\n}\n\nstructure CaptureEvent {\n    @eventHeader\n    name: String\n    @eventHeader\n    captured: Boolean\n    @eventHeader\n    shiny: Boolean\n    @eventPayload\n    pokedex_update: Blob\n}\n\n@error(\"server\")\nstructure UnsupportedRegionError {\n    @required\n    region: String\n}\n\n@error(\"client\")\nstructure InvalidPokeballError {\n    @required\n    pokeball: String\n}\n@error(\"server\")\nstructure MasterBallUnsuccessful {\n    message: String\n}\n\n@error(\"client\")\nstructure ThrottlingError {}\n"
  },
  {
    "path": "codegen-core/common-test-models/pokemon-common.smithy",
    "content": "$version: \"2\"\n\nnamespace com.aws.example\n\nuse smithy.framework#ValidationException\n\n/// A Pokémon species forms the basis for at least one Pokémon.\n@title(\"Pokémon Species\")\nresource PokemonSpecies {\n    identifiers: {\n        name: String\n    }\n    read: GetPokemonSpecies\n}\n\n/// Retrieve information about a Pokémon species.\n@readonly\n@http(uri: \"/pokemon-species/{name}\", method: \"GET\")\noperation GetPokemonSpecies {\n    input := {\n        @required\n        @httpLabel\n        name: String\n    }\n    output := {\n        /// The name for this resource.\n        @required\n        name: String\n\n        /// A list of flavor text entries for this Pokémon species.\n        @required\n        flavorTextEntries: FlavorTextEntries\n    }\n    errors: [\n        ResourceNotFoundException\n        ValidationException\n    ]\n}\n\n/// Retrieve HTTP server statistiscs, such as calls count.\n@readonly\n@http(uri: \"/stats\", method: \"GET\")\noperation GetServerStatistics {\n    input := {}\n    output := {\n        /// The number of calls executed by the server.\n        @required\n        calls_count: Long\n    }\n}\n\nlist FlavorTextEntries {\n    member: FlavorText\n}\n\nstructure FlavorText {\n    /// The localized flavor text for an API resource in a specific language.\n    @required\n    flavorText: String\n\n    /// The language this name is in.\n    @required\n    language: Language\n}\n\n/// Supported languages for FlavorText entries.\nenum Language {\n    /// American English.\n    ENGLISH = \"en\"\n    /// Español.\n    SPANISH = \"es\"\n    /// Italiano.\n    ITALIAN = \"it\"\n    /// 日本語。\n    JAPANESE = \"jp\"\n}\n\n/// DoNothing operation, used to stress test the framework.\n@readonly\n@http(uri: \"/do-nothing\", method: \"GET\")\noperation DoNothing {\n    input := {}\n    output := {}\n}\n\n/// Health check operation, to check the service is up\n/// Not yet a deep check\n@readonly\n@http(uri: \"/ping\", method: \"GET\")\noperation CheckHealth {\n}\n\n@error(\"client\")\n@httpError(404)\nstructure ResourceNotFoundException {\n    @required\n    message: String\n}\n"
  },
  {
    "path": "codegen-core/common-test-models/pokemon.smithy",
    "content": "$version: \"2\"\n\nnamespace com.aws.example\n\nuse aws.protocols#restJson1\nuse smithy.framework#ValidationException\nuse com.aws.example#PokemonSpecies\nuse com.aws.example#GetServerStatistics\nuse com.aws.example#DoNothing\nuse com.aws.example#CheckHealth\nuse com.aws.example#ResourceNotFoundException\n\n/// The Pokémon Service allows you to retrieve information about Pokémon species.\n@title(\"Pokémon Service\")\n@restJson1\nservice PokemonService {\n    version: \"2024-03-18\"\n    resources: [\n        PokemonSpecies\n        Storage\n    ]\n    operations: [\n        GetServerStatistics\n        DoNothing\n        CapturePokemon\n        CheckHealth\n        StreamPokemonRadio\n    ]\n}\n\n/// A users current Pokémon storage.\nresource Storage {\n    identifiers: {\n        user: String\n    }\n    read: GetStorage\n}\n\n/// Retrieve information about your Pokédex.\n@readonly\n@http(uri: \"/pokedex/{user}\", method: \"GET\")\noperation GetStorage {\n    input := @sensitive @documentation(\"A request to access Pokémon storage.\") {\n        @required\n        @httpLabel\n        user: String\n        @required\n        @httpHeader(\"passcode\")\n        passcode: String\n    }\n    output := @documentation(\"Contents of the Pokémon storage.\") {\n        @required\n        collection: SpeciesCollection\n    }\n    errors: [\n        ResourceNotFoundException\n        StorageAccessNotAuthorized\n        ValidationException\n    ]\n}\n\n/// Not authorized to access Pokémon storage.\n@error(\"client\")\n@httpError(401)\nstructure StorageAccessNotAuthorized {}\n\n/// A list of Pokémon species.\nlist SpeciesCollection {\n    member: String\n}\n\n/// Capture Pokémons via event streams.\n@http(uri: \"/capture-pokemon-event/{region}\", method: \"POST\")\noperation CapturePokemon {\n    input := {\n        @httpPayload\n        events: AttemptCapturingPokemonEvent\n\n        @httpLabel\n        @required\n        region: String\n    }\n    output := {\n        @httpPayload\n        events: CapturePokemonEvents\n    }\n    errors: [\n        UnsupportedRegionError\n        ThrottlingError\n        ValidationException\n    ]\n}\n\n@streaming\nunion AttemptCapturingPokemonEvent {\n    event: CapturingEvent\n    masterball_unsuccessful: MasterBallUnsuccessful\n}\n\nstructure CapturingEvent {\n    @eventPayload\n    payload: CapturingPayload\n}\n\nstructure CapturingPayload for PokemonSpecies {\n    $name\n    pokeball: String\n}\n\n@streaming\nunion CapturePokemonEvents {\n    event: CaptureEvent\n    invalid_pokeball: InvalidPokeballError\n    throttlingError: ThrottlingError\n}\n\nstructure CaptureEvent {\n    @eventHeader\n    name: String\n    @eventHeader\n    captured: Boolean\n    @eventHeader\n    shiny: Boolean\n    @eventPayload\n    pokedex_update: Blob\n}\n\n@error(\"server\")\nstructure UnsupportedRegionError {\n    @required\n    region: String\n}\n\n@error(\"client\")\nstructure InvalidPokeballError {\n    @required\n    pokeball: String\n}\n@error(\"server\")\nstructure MasterBallUnsuccessful {\n    message: String\n}\n\n@error(\"client\")\nstructure ThrottlingError {}\n\n/// Fetch a radio song from the database and stream it back as a playable audio.\n@readonly\n@http(uri: \"/radio\", method: \"GET\")\noperation StreamPokemonRadio {\n    output := {\n        @httpPayload\n        data: StreamingBlob = \"\"\n    }\n}\n\n@streaming\nblob StreamingBlob\n"
  },
  {
    "path": "codegen-core/common-test-models/rest-json-extras.smithy",
    "content": "$version: \"1.0\"\n\nnamespace aws.protocoltests.restjson\n\nuse aws.protocols#restJson1\nuse aws.api#service\nuse smithy.test#httpRequestTests\nuse smithy.test#httpResponseTests\nuse smithy.framework#ValidationException\n\napply QueryPrecedence @httpRequestTests([\n    {\n        id: \"UrlParamsKeyEncoding\",\n        documentation: \"Keys and values must be url encoded\",\n        protocol: restJson1,\n        method: \"POST\",\n        uri: \"/Precedence\",\n        body: \"\",\n        queryParams: [\"bar=%26%F0%9F%90%B1\", \"hello%20there=how%27s%20your%20encoding%3F\", \"a%20%26%20b%20%26%20c=better%20encode%20%3D%20this\"],\n        params: {\n            foo: \"&🐱\",\n            baz: {\n                \"hello there\": \"how's your encoding?\",\n                \"a & b & c\": \"better encode = this\"\n            }\n        },\n        appliesTo: \"client\",\n    },\n    {\n        id: \"RestJsonQueryPrecedenceForbid\",\n        documentation: \"Prefer named query parameters when serializing\",\n        protocol: restJson1,\n        method: \"POST\",\n        uri: \"/Precedence\",\n        body: \"\",\n        queryParams: [\n            \"bar=named\",\n            \"qux=alsoFromMap\"\n        ],\n        forbidQueryParams: [\"bar=fromMap\"],\n        params: {\n            foo: \"named\",\n            baz: {\n                bar: \"fromMap\",\n                qux: \"alsoFromMap\"\n            }\n        },\n        appliesTo: \"client\",\n    }]\n)\n\n/// A REST JSON service that sends JSON requests and responses.\n@service(sdkId: \"Rest Json Protocol\")\n@restJson1\nservice RestJsonExtras {\n    version: \"2019-12-16\",\n    operations: [\n        StringPayload,\n        PrimitiveIntHeader,\n        EnumQuery,\n        StatusResponse,\n        MapWithEnumKeyOp,\n        PrimitiveIntOp,\n        EscapedStringValues,\n        NullInNonSparse,\n        CaseInsensitiveErrorOperation,\n        EmptyStructWithContentOnWireOp,\n        QueryPrecedence,\n    ],\n    errors: [ExtraError]\n}\n\n@httpResponseTests([\n    {\n        documentation: \"Upper case error modeled lower case\",\n        id: \"ServiceLevelErrorClient\",\n        protocol: \"aws.protocols#restJson1\",\n        code: 500,\n        body: \"\",\n        headers: { \"X-Amzn-Errortype\": \"ExtraError\" },\n        params: {},\n        appliesTo: \"client\",\n    },\n    {\n        documentation: \"Upper case error modeled lower case.\",\n        id: \"ServiceLevelErrorServer\",\n        protocol: \"aws.protocols#restJson1\",\n        code: 500,\n        body: \"{}\",\n        headers: { \"X-Amzn-Errortype\": \"ExtraError\" },\n        params: {},\n        appliesTo: \"server\",\n    }\n])\n@error(\"server\")\nstructure ExtraError {}\n\n@http(uri: \"/StringPayload\", method: \"POST\")\n@httpRequestTests([\n    {\n        id: \"StringPayload\",\n        uri: \"/StringPayload\",\n        body: \"rawstring\",\n        headers: { \"Content-Type\": \"text/plain\" },\n        params: { payload: \"rawstring\" },\n        method: \"POST\",\n        protocol: \"aws.protocols#restJson1\"\n    }\n])\noperation StringPayload {\n    input: StringPayloadInput,\n    output: StringPayloadInput\n}\n\nstructure StringPayloadInput {\n    @httpPayload\n    payload: String\n}\n\n@httpRequestTests([{\n    id: \"SerPrimitiveInt\",\n    protocol: \"aws.protocols#restJson1\",\n    documentation: \"Primitive ints should not be serialized when they are unset\",\n    uri: \"/primitive-document\",\n    method: \"POST\",\n    appliesTo: \"client\",\n    body: \"{}\",\n    headers: { \"Content-Type\": \"application/json\" },\n    params: {},\n}])\n@http(uri: \"/primitive-document\", method: \"POST\")\noperation PrimitiveIntOp {\n    input: PrimitiveIntDocument,\n    output: PrimitiveIntDocument\n}\n\nstructure PrimitiveIntDocument {\n    value: PrimitiveInt\n}\n\n@httpResponseTests([\n    {\n        id: \"DeserPrimitiveHeader\",\n        protocol: \"aws.protocols#restJson1\",\n        code: 200,\n        headers: { \"x-field\": \"123\" },\n        params: { field: 123 },\n    },\n    {\n        id: \"DeserPrimitiveHeaderMissing\",\n        protocol: \"aws.protocols#restJson1\",\n        code: 200,\n        headers: { },\n        params: { field: 0 },\n    }\n])\n@http(uri: \"/primitive\", method: \"POST\")\noperation PrimitiveIntHeader {\n    output: PrimitiveIntHeaderInput,\n    errors: [ValidationException],\n}\n\ninteger PrimitiveInt\n\nstructure PrimitiveIntHeaderInput {\n    @httpHeader(\"x-field\")\n    @required\n    field: PrimitiveInt\n}\n\n@http(uri: \"/foo/{enum}\", method: \"GET\")\n@httpRequestTests([\n    {\n        id: \"EnumQueryRequest\",\n        uri: \"/foo/enumvalue\",\n        params: { enum: \"enumvalue\" },\n        method: \"GET\",\n        protocol: \"aws.protocols#restJson1\"\n    }\n])\noperation EnumQuery {\n    input: EnumQueryInput,\n    errors: [ValidationException],\n}\n\nstructure EnumQueryInput {\n    @httpLabel\n    @required\n    enum: StringEnum\n}\n\n@http(uri: \"/\", method: \"POST\")\noperation StatusResponse {\n    output: StatusOutput\n}\n\nstructure StatusOutput {\n    @httpResponseCode\n    field: PrimitiveInt\n}\n\nmap MapWithEnumKey {\n    key: StringEnum,\n    value: String,\n}\n\nstructure MapWithEnumKeyInputOutput {\n    map: MapWithEnumKey,\n}\n\n@http(uri: \"/map-with-enum-key\", method: \"POST\")\n@httpRequestTests([\n    {\n        id: \"MapWithEnumKeyRequest\",\n        uri: \"/map-with-enum-key\",\n        method: \"POST\",\n        protocol: \"aws.protocols#restJson1\",\n        body: \"{\\\"map\\\":{\\\"enumvalue\\\":\\\"something\\\"}}\",\n        headers: { \"Content-Type\": \"application/json\" },\n        params: { map: { \"enumvalue\": \"something\" } },\n    },\n])\n@httpResponseTests([\n    {\n        id: \"MapWithEnumKeyResponse\",\n        protocol: \"aws.protocols#restJson1\",\n        code: 200,\n        body: \"{\\\"map\\\":{\\\"enumvalue\\\":\\\"something\\\"}}\",\n        params: { map: { \"enumvalue\": \"something\" } },\n    },\n])\noperation MapWithEnumKeyOp {\n    input: MapWithEnumKeyInputOutput,\n    output: MapWithEnumKeyInputOutput,\n    errors: [ValidationException],\n}\n\n\n@enum([\n    { value: \"has\\\"quotes\", name: \"HAS_QUOTES\", documentation: \"this needs#tobe escaped\" },\n    { value: \"normal\", name: \"NORMAL\" },\n])\nstring EnumWithEscapedChars\n\nstructure EscapedStringValuesInputOutput {\n    enum: EnumWithEscapedChars,\n    @jsonName(\"also\\\"has\\\"quotes\")\n    someString: String,\n}\n\n@http(uri: \"/escaped-string-values\", method: \"POST\")\n@httpRequestTests([\n    {\n        id: \"EscapedStringValuesRequest\",\n        uri: \"/escaped-string-values\",\n        method: \"POST\",\n        protocol: \"aws.protocols#restJson1\",\n        body: \"{\\\"enum\\\":\\\"has\\\\\\\"quotes\\\",\\\"also\\\\\\\"has\\\\\\\"quotes\\\":\\\"test\\\"}\",\n        headers: { \"Content-Type\": \"application/json\" },\n        params: { enum: \"has\\\"quotes\", someString: \"test\" },\n    }\n])\n@httpResponseTests([\n    {\n        id: \"EscapedStringValuesResponse\",\n        protocol: \"aws.protocols#restJson1\",\n        code: 200,\n        body: \"{\\\"enum\\\":\\\"has\\\\\\\"quotes\\\",\\\"also\\\\\\\"has\\\\\\\"quotes\\\":\\\"test\\\"}\",\n        params: { enum: \"has\\\"quotes\", someString: \"test\" },\n    }\n])\noperation EscapedStringValues {\n    input: EscapedStringValuesInputOutput,\n    output: EscapedStringValuesInputOutput,\n    errors: [ValidationException],\n}\n\nlist NonSparseList {\n    member: String,\n}\n\nmap NonSparseMap {\n    key: String,\n    value: String,\n}\n\nunion SingleElementUnion {\n    a: String\n}\n\nstructure NullInNonSparseOutput {\n    list: NonSparseList,\n    map: NonSparseMap,\n    union: SingleElementUnion\n}\n\n@http(uri: \"/null-in-non-sparse\", method: \"POST\")\n@httpResponseTests([\n    {\n        id: \"NullInNonSparse\",\n        protocol: \"aws.protocols#restJson1\",\n        code: 200,\n        body: \"{\\\"list\\\":[null,\\\"one\\\",null,\\\"two\\\",null],\\\"map\\\":{\\\"zero\\\":null,\\\"one\\\":\\\"1\\\"}}\",\n        params: { list: [\"one\", \"two\"], map: { \"one\": \"1\" } },\n        appliesTo: \"client\",\n    }\n])\noperation NullInNonSparse {\n    output: NullInNonSparseOutput,\n}\n\n@http(uri: \"/error-sensitive\", method: \"POST\")\noperation CaseInsensitiveErrorOperation {\n    errors: [CaseInsensitiveError]\n}\n\n@httpResponseTests([\n    {\n        documentation: \"Upper case error modeled lower case. See: https://github.com/smithy-lang/smithy-rs/blob/6c21fb0eb377c7120a8179f4537ba99a4b50ba96/rust-runtime/inlineable/src/json_errors.rs#L51-L51\",\n        id: \"UpperErrorModeledLower\",\n        protocol: \"aws.protocols#restJson1\",\n        code: 500,\n        body: \"{\\\"Message\\\": \\\"hello\\\"}\",\n        headers: { \"X-Amzn-Errortype\": \"CaseInsensitiveError\" },\n        params: { message: \"hello\" },\n        appliesTo: \"client\",\n    }\n])\n@error(\"server\")\nstructure CaseInsensitiveError {\n    message: String\n}\n\nstructure EmptyStruct {}\nstructure EmptyStructWithContentOnWireOpOutput {\n    empty: EmptyStruct,\n}\n\n@http(uri: \"/empty-struct-with-content-on-wire-op\", method: \"GET\")\n@httpResponseTests([\n    {\n        id: \"EmptyStructWithContentOnWire\",\n        protocol: \"aws.protocols#restJson1\",\n        code: 200,\n        body: \"{\\\"empty\\\": {\\\"value\\\":\\\"not actually empty\\\"}}\",\n        params: { empty: {} },\n        appliesTo: \"client\",\n    }\n])\noperation EmptyStructWithContentOnWireOp {\n    output: EmptyStructWithContentOnWireOpOutput,\n}\n"
  },
  {
    "path": "codegen-core/common-test-models/rpcv2Cbor-extras.smithy",
    "content": "$version: \"2.0\"\n\nnamespace smithy.protocoltests.rpcv2Cbor\n\nuse smithy.framework#ValidationException\nuse smithy.protocols#rpcv2Cbor\nuse smithy.test#httpResponseTests\nuse smithy.test#httpMalformedRequestTests\nuse aws.auth#sigv4\n\n@rpcv2Cbor\n@sigv4(name: \"rpcv2-cbor\")\nservice RpcV2CborService {\n    operations: [\n        SimpleStructOperation\n        ErrorSerializationOperation\n        ComplexStructOperation\n        EmptyStructOperation\n        SingleMemberStructOperation\n        RecursiveUnionOperation,\n        StreamingOperation\n        StreamingOperationWithInitialData\n        StreamingOperationWithInitialResponse\n        StreamingOperationWithOptionalData\n    ]\n}\n\noperation StreamingOperation {\n    input: StreamingOperationInput,\n    output: StreamingOperationOutput,\n    errors: [ValidationException]\n}\n\nstructure StreamingOperationOutput {\n    events: Events\n}\n\nstructure StreamingOperationInput {\n    events: Events\n}\n\noperation StreamingOperationWithInitialData {\n    input: StreamingOperationWithInitialDataInput,\n    output: StreamingOperationWithInitialDataOutput,\n    errors: [ValidationException]\n}\n\nstructure StreamingOperationWithInitialDataInput {\n    @required\n    initialData: String\n    events: Events\n}\n\nstructure StreamingOperationWithInitialDataOutput {\n    events: Events\n}\n\noperation StreamingOperationWithInitialResponse {\n    input: StreamingOperationWithInitialResponseInput,\n    output: StreamingOperationWithInitialResponseOutput,\n    errors: [ValidationException]\n}\n\nstructure StreamingOperationWithInitialResponseInput {\n    events: Events\n}\n\nstructure StreamingOperationWithInitialResponseOutput {\n    @required\n    responseData: String\n    events: Events\n}\n\noperation StreamingOperationWithOptionalData {\n    input: StreamingOperationWithOptionalDataInput,\n    output: StreamingOperationWithOptionalDataOutput,\n    errors: [ValidationException]\n}\n\nstructure StreamingOperationWithOptionalDataInput {\n    optionalData: String\n    events: Events\n}\n\nstructure StreamingOperationWithOptionalDataOutput {\n    optionalResponseData: String\n    events: Events\n}\n\n\n@streaming\nunion Events {\n    A: Event,\n    B: Event,\n    C: Event,\n}\n\nstructure Event {\n}\n\n\n// TODO(https://github.com/smithy-lang/smithy/issues/2326): Smithy should not\n// allow HTTP binding traits in this protocol.\n@http(uri: \"/simple-struct-operation\", method: \"POST\")\noperation SimpleStructOperation {\n    input: SimpleStruct\n    output: SimpleStruct\n    errors: [ValidationException]\n}\n\noperation ErrorSerializationOperation {\n    input: SimpleStruct\n    output: ErrorSerializationOperationOutput\n    errors: [ValidationException]\n}\n\noperation ComplexStructOperation {\n    input: ComplexStruct\n    output: ComplexStruct\n    errors: [ValidationException]\n}\n\noperation EmptyStructOperation {\n    input: EmptyStruct\n    output: EmptyStruct\n}\n\noperation SingleMemberStructOperation {\n    input: SingleMemberStruct\n    output: SingleMemberStruct\n}\n\noperation RecursiveUnionOperation {\n    input: RecursiveOperationInputOutput\n    output: RecursiveOperationInputOutput\n}\n\napply EmptyStructOperation @httpMalformedRequestTests([\n    {\n        id: \"AdditionalTokensEmptyStruct\",\n        documentation: \"\"\"\n        When additional tokens are found past where we expect the end of the body,\n        the request should be rejected with a serialization exception.\"\"\",\n        protocol: rpcv2Cbor,\n        request: {\n            method: \"POST\",\n            uri: \"/service/RpcV2CborService/operation/EmptyStructOperation\",\n            headers: {\n                \"smithy-protocol\": \"rpc-v2-cbor\",\n                \"Accept\": \"application/cbor\",\n                \"Content-Type\": \"application/cbor\"\n            }\n            // Two empty variable-length encoded CBOR maps back to back.\n            body: \"v/+//w==\"\n        },\n        response: {\n            code: 400,\n            body: {\n                mediaType: \"application/cbor\",\n                assertion: {\n                    // An empty CBOR map.\n                    // TODO(https://github.com/smithy-lang/smithy-rs/issues/3716): we're not serializing `__type` because `SerializationException` is not modeled.\n                    contents: \"oA==\"\n                }\n            }\n        }\n    }\n])\n\napply SingleMemberStructOperation @httpMalformedRequestTests([\n    {\n        id: \"AdditionalTokensSingleMemberStruct\",\n        documentation: \"\"\"\n        When additional tokens are found past where we expect the end of the body,\n        the request should be rejected with a serialization exception.\"\"\",\n        protocol: rpcv2Cbor,\n        request: {\n            method: \"POST\",\n            uri: \"/service/RpcV2CborService/operation/SingleMemberStructOperation\",\n            headers: {\n                \"smithy-protocol\": \"rpc-v2-cbor\",\n                \"Accept\": \"application/cbor\",\n                \"Content-Type\": \"application/cbor\"\n            }\n            // Two empty variable-length encoded CBOR maps back to back.\n            body: \"v/+//w==\"\n        },\n        response: {\n            code: 400,\n            body: {\n                mediaType: \"application/cbor\",\n                assertion: {\n                    // An empty CBOR map.\n                    // TODO(https://github.com/smithy-lang/smithy-rs/issues/3716): we're not serializing `__type` because `SerializationException` is not modeled.\n                    contents: \"oA==\"\n                }\n            }\n        }\n    }\n])\n\napply ErrorSerializationOperation @httpMalformedRequestTests([\n    {\n        id: \"ErrorSerializationIncludesTypeField\",\n        documentation: \"\"\"\n        When invalid input is provided the request should be rejected with\n        a validation exception, and a `__type` field should be included\"\"\",\n        protocol: rpcv2Cbor,\n        request: {\n            method: \"POST\",\n            uri: \"/service/RpcV2CborService/operation/ErrorSerializationOperation\",\n            headers: {\n                \"smithy-protocol\": \"rpc-v2-cbor\",\n                \"Accept\": \"application/cbor\",\n                \"Content-Type\": \"application/cbor\"\n            }\n            // An empty CBOR map. We're missing a lot of `@required` members!\n            body: \"oA==\",\n            bodyMediaType: \"application/cbor\"\n        },\n        response: {\n            code: 400,\n            body: {\n                mediaType: \"application/cbor\",\n                assertion: {\n                    contents: \"v2ZfX3R5cGV4JHNtaXRoeS5mcmFtZXdvcmsjVmFsaWRhdGlvbkV4Y2VwdGlvbmdtZXNzYWdleGsxIHZhbGlkYXRpb24gZXJyb3IgZGV0ZWN0ZWQuIFZhbHVlIGF0ICcvcmVxdWlyZWRCbG9iJyBmYWlsZWQgdG8gc2F0aXNmeSBjb25zdHJhaW50OiBNZW1iZXIgbXVzdCBub3QgYmUgbnVsbGlmaWVsZExpc3SBv2RwYXRobS9yZXF1aXJlZEJsb2JnbWVzc2FnZXhOVmFsdWUgYXQgJy9yZXF1aXJlZEJsb2InIGZhaWxlZCB0byBzYXRpc2Z5IGNvbnN0cmFpbnQ6IE1lbWJlciBtdXN0IG5vdCBiZSBudWxs//8=\"\n                }\n            }\n        }\n    }\n])\n\napply ErrorSerializationOperation @httpResponseTests([\n    {\n        id: \"OperationOutputSerializationQuestionablyIncludesTypeField\",\n        documentation: \"\"\"\n        Despite the operation output being a structure shape with the `@error` trait,\n        `__type` field should, in a strict interpretation of the spec, not be included,\n        because we're not serializing a server error response. However, we do, because\n        there shouldn't™️ be any harm in doing so, and it greatly simplifies the\n        code generator. This test just pins this behavior in case we ever modify it.\"\"\",\n        protocol: rpcv2Cbor,\n        code: 200,\n        params: {\n            errorShape: {\n                message: \"ValidationException message field\"\n            }\n        }\n        bodyMediaType: \"application/cbor\"\n        body: \"v2plcnJvclNoYXBlv2ZfX3R5cGV4JHNtaXRoeS5mcmFtZXdvcmsjVmFsaWRhdGlvbkV4Y2VwdGlvbmdtZXNzYWdleCFWYWxpZGF0aW9uRXhjZXB0aW9uIG1lc3NhZ2UgZmllbGT//w==\"\n    }\n])\n\napply SimpleStructOperation @httpResponseTests([\n    {\n        id: \"SimpleStruct\",\n        protocol: rpcv2Cbor,\n        code: 200, // Not used.\n        body: \"v2RibG9iS2Jsb2JieSBibG9iZ2Jvb2xlYW70ZnN0cmluZ3hwVGhlcmUgYXJlIHRocmVlIHRoaW5ncyBhbGwgd2lzZSBtZW4gZmVhcjogdGhlIHNlYSBpbiBzdG9ybSwgYSBuaWdodCB3aXRoIG5vIG1vb24sIGFuZCB0aGUgYW5nZXIgb2YgYSBnZW50bGUgbWFuLmRieXRlGEVlc2hvcnQYRmdpbnRlZ2VyGEdkbG9uZxhIZWZsb2F0+j8wo9dmZG91Ymxl+z/mTQE6kqMFaXRpbWVzdGFtcMH7QdcKq2AAAABkZW51bWdESUFNT05EbHJlcXVpcmVkQmxvYktibG9iYnkgYmxvYm9yZXF1aXJlZEJvb2xlYW70bnJlcXVpcmVkU3RyaW5neHBUaGVyZSBhcmUgdGhyZWUgdGhpbmdzIGFsbCB3aXNlIG1lbiBmZWFyOiB0aGUgc2VhIGluIHN0b3JtLCBhIG5pZ2h0IHdpdGggbm8gbW9vbiwgYW5kIHRoZSBhbmdlciBvZiBhIGdlbnRsZSBtYW4ubHJlcXVpcmVkQnl0ZRhFbXJlcXVpcmVkU2hvcnQYRm9yZXF1aXJlZEludGVnZXIYR2xyZXF1aXJlZExvbmcYSG1yZXF1aXJlZEZsb2F0+j8wo9ducmVxdWlyZWREb3VibGX7P+ZNATqSowVxcmVxdWlyZWRUaW1lc3RhbXDB+0HXCqtgAAAAbHJlcXVpcmVkRW51bWdESUFNT05E/w==\",\n        bodyMediaType: \"application/cbor\",\n        headers: {\n            \"smithy-protocol\": \"rpc-v2-cbor\",\n            \"Content-Type\": \"application/cbor\"\n        },\n        params: {\n            blob: \"blobby blob\",\n            boolean: false,\n\n            string: \"There are three things all wise men fear: the sea in storm, a night with no moon, and the anger of a gentle man.\",\n\n            byte: 69,\n            short: 70,\n            integer: 71,\n            long: 72,\n\n            float: 0.69,\n            double: 0.6969,\n\n            timestamp: 1546300800,\n            enum: \"DIAMOND\"\n\n            // With `@required`.\n\n            requiredBlob: \"blobby blob\",\n            requiredBoolean: false,\n\n            requiredString: \"There are three things all wise men fear: the sea in storm, a night with no moon, and the anger of a gentle man.\",\n\n            requiredByte: 69,\n            requiredShort: 70,\n            requiredInteger: 71,\n            requiredLong: 72,\n\n            requiredFloat: 0.69,\n            requiredDouble: 0.6969,\n\n            requiredTimestamp: 1546300800,\n            requiredEnum: \"DIAMOND\"\n        }\n    },\n    // Same test, but leave optional types empty\n    {\n        id: \"SimpleStructWithOptionsSetToNone\",\n        protocol: rpcv2Cbor,\n        code: 200, // Not used.\n        body: \"v2xyZXF1aXJlZEJsb2JLYmxvYmJ5IGJsb2JvcmVxdWlyZWRCb29sZWFu9G5yZXF1aXJlZFN0cmluZ3hwVGhlcmUgYXJlIHRocmVlIHRoaW5ncyBhbGwgd2lzZSBtZW4gZmVhcjogdGhlIHNlYSBpbiBzdG9ybSwgYSBuaWdodCB3aXRoIG5vIG1vb24sIGFuZCB0aGUgYW5nZXIgb2YgYSBnZW50bGUgbWFuLmxyZXF1aXJlZEJ5dGUYRW1yZXF1aXJlZFNob3J0GEZvcmVxdWlyZWRJbnRlZ2VyGEdscmVxdWlyZWRMb25nGEhtcmVxdWlyZWRGbG9hdPo/MKPXbnJlcXVpcmVkRG91Ymxl+z/mTQE6kqMFcXJlcXVpcmVkVGltZXN0YW1wwftB1wqrYAAAAGxyZXF1aXJlZEVudW1nRElBTU9ORP8=\",\n        bodyMediaType: \"application/cbor\",\n        headers: {\n            \"smithy-protocol\": \"rpc-v2-cbor\",\n            \"Content-Type\": \"application/cbor\"\n        },\n        params: {\n            requiredBlob: \"blobby blob\",\n            requiredBoolean: false,\n\n            requiredString: \"There are three things all wise men fear: the sea in storm, a night with no moon, and the anger of a gentle man.\",\n\n            requiredByte: 69,\n            requiredShort: 70,\n            requiredInteger: 71,\n            requiredLong: 72,\n\n            requiredFloat: 0.69,\n            requiredDouble: 0.6969,\n\n            requiredTimestamp: 1546300800,\n            requiredEnum: \"DIAMOND\"\n        }\n    }\n])\n\napply RecursiveUnionOperation @httpResponseTests([\n    {\n        id: \"RpcV2CborRecursiveShapesWithUnion\",\n        documentation: \"Serializes recursive structures with union\",\n        protocol: rpcv2Cbor,\n        code: 200,\n        body: \"v2ZuZXN0ZWS/Y2Zvb2RGb28xZ3ZhcmlhbnS/Z2Nob2ljZTFrT3V0ZXJDaG9pY2X/Zm5lc3RlZL9jYmFyZEJhcjFvcmVjdXJzaXZlTWVtYmVyv2Nmb29kRm9vMmd2YXJpYW50v2djaG9pY2Uyv2Nmb29kRm9vM2ZuZXN0ZWS/Y2JhcmRCYXIzb3JlY3Vyc2l2ZU1lbWJlcr9jZm9vZEZvbzRndmFyaWFudL9nY2hvaWNlMWtJbm5lckNob2ljZf//////Zm5lc3RlZL9jYmFyZEJhcjL//////w==\",\n        bodyMediaType: \"application/cbor\",\n        headers: {\n            \"smithy-protocol\": \"rpc-v2-cbor\",\n            \"Content-Type\": \"application/cbor\"\n        },\n        params: {\n            nested: {\n                foo: \"Foo1\",\n                variant: {\n                    choice1: \"OuterChoice\"\n                },\n                nested: {\n                    bar: \"Bar1\",\n                    recursiveMember: {\n                        foo: \"Foo2\",\n                        variant: {\n                            choice2: {\n                                foo: \"Foo3\",\n                                nested: {\n                                    bar: \"Bar3\",\n                                    recursiveMember: {\n                                        foo: \"Foo4\",\n                                        variant: {\n                                            choice1: \"InnerChoice\"\n                                        }\n                                    }\n                                }\n                            }\n                        },\n                        nested: {\n                            bar: \"Bar2\"\n                        }\n                    }\n                }\n            }\n        }\n    }\n])\n\nstructure ErrorSerializationOperationOutput {\n    errorShape: ValidationException\n}\n\nstructure SimpleStruct {\n    blob: Blob\n    boolean: Boolean\n    string: String\n    byte: Byte\n    short: Short\n    integer: Integer\n    long: Long\n    float: Float\n    double: Double\n    timestamp: Timestamp\n    enum: Suit\n    // With `@required`.\n\n    @required requiredBlob: Blob\n    @required requiredBoolean: Boolean\n    @required requiredString: String\n    @required requiredByte: Byte\n    @required requiredShort: Short\n    @required requiredInteger: Integer\n    @required requiredLong: Long\n    @required requiredFloat: Float\n    @required requiredDouble: Double\n    @required requiredTimestamp: Timestamp\n    // @required requiredDocument: MyDocument\n    @required requiredEnum: Suit\n}\n\nstructure ComplexStruct {\n    structure: SimpleStruct\n    emptyStructure: EmptyStruct\n    list: SimpleList\n    map: SimpleMap\n    union: SimpleUnion\n    unitUnion: UnitUnion\n    structureList: StructList\n    // `@required` for good measure here.\n    @required complexList: ComplexList\n    @required complexMap: ComplexMap\n    @required complexUnion: ComplexUnion\n}\n\nstructure EmptyStruct {}\n\nstructure SingleMemberStruct {\n    message: String\n}\n\nlist StructList {\n    member: SimpleStruct\n}\n\nlist SimpleList {\n    member: String\n}\n\nmap SimpleMap {\n    key: String\n    value: Integer\n}\n\n// TODO(https://github.com/smithy-lang/smithy/issues/2325): Upstream protocol\n// test suite doesn't cover unions. While the generated SDK compiles, we're not\n// exercising the (de)serializers with actual values.\nunion SimpleUnion {\n    blob: Blob\n    boolean: Boolean\n    string: String\n    unit: Unit\n}\n\nunion UnitUnion {\n    unitA: Unit\n    unitB: Unit\n}\n\nlist ComplexList {\n    member: ComplexMap\n}\n\nmap ComplexMap {\n    key: String\n    value: ComplexUnion\n}\n\nunion ComplexUnion {\n    // Recursive path here.\n    complexStruct: ComplexStruct\n    structure: SimpleStruct\n    list: SimpleList\n    map: SimpleMap\n    union: SimpleUnion\n}\n\nenum Suit {\n    DIAMOND\n    CLUB\n    HEART\n    SPADE\n}\n\nstructure RecursiveOperationInputOutput {\n    nested: RecursiveOperationInputOutputNested1\n}\n\nstructure RecursiveOperationInputOutputNested1 {\n    foo: String,\n    nested: RecursiveOperationInputOutputNested2,\n    variant: FooChoice,\n}\n\nstructure RecursiveOperationInputOutputNested2 {\n    bar: String,\n    recursiveMember: RecursiveOperationInputOutputNested1,\n}\n\nunion FooChoice {\n    choice1: String\n    choice2: RecursiveOperationInputOutputNested1\n}\n"
  },
  {
    "path": "codegen-core/common-test-models/simple.smithy",
    "content": "$version: \"2.0\"\n\nnamespace com.amazonaws.simple\n\nuse aws.protocols#restJson1\n\n@restJson1\nservice SimpleService {\n    operations: [\n        Operation\n    ]\n}\n\n@http(uri: \"/operation\", method: \"POST\")\noperation Operation {\n    input: OperationInputOutput\n    output: OperationInputOutput\n}\n\nstructure OperationInputOutput {\n    message: String\n}\n"
  },
  {
    "path": "codegen-core/common-test-models/unique-items.smithy",
    "content": "// TODO(https://github.com/awslabs/smithy/issues/1541): This file is\n// temporary; these tests should really be in awslabs/smithy, but they were removed.\n// They have been written starting off from the commit that removed them:\n// https://github.com/awslabs/smithy/commit/1b5737a873033a101066b3d92b9e11d4ed3587c7\n\n$version: \"1.0\"\n\nnamespace com.amazonaws.constraints\n\nuse aws.protocols#restJson1\nuse smithy.framework#ValidationException\nuse smithy.test#httpMalformedRequestTests\n\n@restJson1\nservice UniqueItemsService {\n    operations: [\n        MalformedUniqueItems\n    ]\n}\n\n@http(uri: \"/MalformedUniqueItems\", method: \"POST\")\noperation MalformedUniqueItems {\n    input: MalformedUniqueItemsInput,\n    errors: [ValidationException]\n}\n\napply MalformedUniqueItems @httpMalformedRequestTests([\n    {\n        id: \"RestJsonMalformedUniqueItemsDuplicateItems\",\n        documentation: \"\"\"\n        When the list has duplicated items, the response should be a 400\n        ValidationException.\"\"\",\n        protocol: restJson1,\n        request: {\n            method: \"POST\",\n            uri: \"/MalformedUniqueItems\",\n            body: \"\"\"\n            { \"set\" : [\"a\", \"a\", \"b\", \"c\"] }\"\"\",\n            headers: {\n                \"content-type\": \"application/json\"\n            }\n        },\n        response: {\n            code: 400,\n            headers: {\n                \"x-amzn-errortype\": \"ValidationException\"\n            },\n            body: {\n                mediaType: \"application/json\",\n                assertion: {\n                    contents: \"\"\"\n                    { \"message\" : \"1 validation error detected. Value with repeated values at indices [0, 1] at '/set' failed to satisfy constraint: Member must have unique values\",\n                      \"fieldList\" : [{\"message\": \"Value with repeated values at indices [0, 1] at '/set' failed to satisfy constraint: Member must have unique values\", \"path\": \"/set\"}]}\"\"\"\n                }\n            }\n        }\n    },\n    {\n        id: \"RestJsonMalformedUniqueItemsDuplicateBlobs\",\n        documentation: \"\"\"\n        When the list has duplicated blobs, the response should be a 400\n        ValidationException.\"\"\",\n        protocol: restJson1,\n        request: {\n            method: \"POST\",\n            uri: \"/MalformedUniqueItems\",\n            body: \"\"\"\n            { \"complexSet\" : [{\"foo\": true, \"blob\": \"YmxvYg==\"}, {\"foo\": true, \"blob\": \"b3RoZXJibG9i\"}, {\"foo\": true, \"blob\": \"YmxvYg==\"}] }\"\"\",\n            headers: {\n                \"content-type\": \"application/json\"\n            }\n        },\n        response: {\n            code: 400,\n            headers: {\n                \"x-amzn-errortype\": \"ValidationException\"\n            },\n            body: {\n                mediaType: \"application/json\",\n                assertion: {\n                    contents: \"\"\"\n                    { \"message\" : \"1 validation error detected. Value with repeated values at indices [0, 2] at '/complexSet' failed to satisfy constraint: Member must have unique values\",\n                      \"fieldList\" : [{\"message\": \"Value with repeated values at indices [0, 2] at '/complexSet' failed to satisfy constraint: Member must have unique values\", \"path\": \"/complexSet\"}]}\"\"\"\n                }\n            }\n        }\n    },\n    // Note that the previously existing `RestJsonMalformedUniqueItemsNullItem` test is already covered by `RestJsonMalformedUniqueItemsNullItem`.\n    // See https://github.com/awslabs/smithy/issues/1577#issuecomment-1397069720.\n])\n\nstructure MalformedUniqueItemsInput {\n    set: SimpleSet,\n    complexSet: ComplexSet\n}\n\n@uniqueItems\nlist SimpleSet {\n    member: String\n}\n\n@uniqueItems\nlist ComplexSet {\n    member: ComplexSetStruct\n}\n\nstructure ComplexSetStruct {\n    foo: Boolean,\n    blob: Blob\n}\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/Version.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core\n\nimport software.amazon.smithy.codegen.core.CodegenException\nimport software.amazon.smithy.model.node.Node\n\n// generated as part of the build, see codegen-core/build.gradle.kts\nprivate const val VERSION_FILENAME = \"runtime-crate-versions.json\"\n\ndata class Version(\n    val gitHash: String,\n    val crates: Map<String, String>,\n) {\n    companion object {\n        // Version must be in the \"{smithy_rs_version}\\n{git_commit_hash}\" format\n        fun parse(content: String): Version {\n            val node = Node.parse(content).expectObjectNode()\n            return Version(\n                node.expectStringMember(\"gitHash\").value,\n                node.expectObjectMember(\"runtimeCrates\").members.map {\n                    it.key.value to it.value.expectStringNode().value\n                }.toMap(),\n            )\n        }\n\n        fun crateVersion(crate: String): String {\n            val version = fromDefaultResource()\n            return version.crates[crate] ?: throw CodegenException(\"unknown version number for runtime crate $crate\")\n        }\n\n        fun fromDefaultResource(): Version =\n            parse(\n                Version::class.java.getResource(VERSION_FILENAME)?.readText()\n                    ?: throw CodegenException(\"$VERSION_FILENAME does not exist\"),\n            )\n    }\n}\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/CargoDependency.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.rustlang\n\nimport software.amazon.smithy.codegen.core.SymbolDependency\nimport software.amazon.smithy.codegen.core.SymbolDependencyContainer\nimport software.amazon.smithy.rust.codegen.core.smithy.ConstrainedModule\nimport software.amazon.smithy.rust.codegen.core.smithy.HttpVersion\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.util.PANIC\nimport software.amazon.smithy.rust.codegen.core.util.dq\nimport java.nio.file.Path\n\nenum class DependencyScope {\n    Build,\n    CfgUnstable,\n    Compile,\n    Dev,\n}\n\nsealed class DependencyLocation\n\ndata class CratesIo(val version: String) : DependencyLocation()\n\ndata class Local(val basePath: String, val version: String? = null) : DependencyLocation()\n\nsealed class RustDependency(open val name: String) : SymbolDependencyContainer {\n    abstract fun version(): String\n\n    open fun dependencies(): List<RustDependency> = listOf()\n\n    override fun getDependencies(): List<SymbolDependency> {\n        return listOf(\n            SymbolDependency.builder()\n                .packageName(name)\n                .version(version())\n                // We rely on retrieving the structured dependency from the symbol later\n                .putProperty(PROPERTY_KEY, this)\n                .build(),\n        ) + dependencies().flatMap { it.dependencies }\n    }\n\n    open fun toDevDependency(): RustDependency =\n        when (this) {\n            is CargoDependency -> this.toDevDependency()\n            is InlineDependency -> PANIC(\"it does not make sense for an inline dependency to be a dev-dependency\")\n        }\n\n    companion object {\n        private const val PROPERTY_KEY = \"rustdep\"\n\n        fun fromSymbolDependency(symbolDependency: SymbolDependency) =\n            symbolDependency.getProperty(PROPERTY_KEY, RustDependency::class.java).get()\n    }\n}\n\n/**\n * A dependency on a snippet of code\n *\n * InlineDependency should not be instantiated directly, rather, it should be constructed with\n * [software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.forInlineFun]\n *\n * InlineDependencies are created as private modules within the main crate. This is useful for any code that\n * doesn't need to exist in a shared crate, but must still be generated exactly once during codegen.\n *\n * CodegenVisitor de-duplicates inline dependencies by (module, name) during code generation.\n */\nclass InlineDependency(\n    name: String,\n    val module: RustModule,\n    private val extraDependencies: List<RustDependency> = listOf(),\n    val renderer: Writable,\n) : RustDependency(name) {\n    override fun version(): String {\n        // just need a version that won't crash\n        return renderer.hashCode().toString()\n    }\n\n    override fun dependencies(): List<RustDependency> = extraDependencies\n\n    fun key() = \"${module.fullyQualifiedPath()}::$name\"\n\n    companion object {\n        fun forRustFile(\n            module: RustModule.LeafModule,\n            resourcePath: String,\n            vararg additionalDependencies: RustDependency,\n        ): InlineDependency {\n            // The inline crate is loaded as a dependency on the runtime classpath\n            val rustFile = this::class.java.getResource(resourcePath)\n            check(rustFile != null) {\n                \"Rust file $resourcePath was missing from the resource bundle!\"\n            }\n            return InlineDependency(module.name, module, additionalDependencies.toList()) {\n                raw(rustFile.readText())\n            }\n        }\n\n        private fun forInlineableRustFile(\n            name: String,\n            vararg additionalDependencies: RustDependency,\n        ) = forRustFile(RustModule.private(name), \"/inlineable/src/$name.rs\", *additionalDependencies)\n\n        fun eventReceiver(runtimeConfig: RuntimeConfig) =\n            forInlineableRustFile(\n                \"event_receiver\",\n                CargoDependency.smithyHttp(runtimeConfig),\n                CargoDependency.smithyRuntimeApi(runtimeConfig),\n                CargoDependency.smithyTypes(runtimeConfig),\n            )\n\n        fun jsonErrors(runtimeConfig: RuntimeConfig) =\n            forInlineableRustFile(\n                \"json_errors\",\n                CargoDependency.smithyJson(runtimeConfig),\n                CargoDependency.Bytes,\n                CargoDependency.Http1x,\n            )\n\n        fun awsQueryCompatibleErrors(runtimeConfig: RuntimeConfig) =\n            forInlineableRustFile(\n                \"aws_query_compatible_errors\",\n                CargoDependency.smithyJson(runtimeConfig),\n                CargoDependency.Http1x,\n            )\n\n        fun clientRequestCompression(runtimeConfig: RuntimeConfig) =\n            forInlineableRustFile(\n                \"client_request_compression\",\n                CargoDependency.Http1x,\n                CargoDependency.HttpBody1x,\n                CargoDependency.HttpBodyUtil01x,\n                CargoDependency.Tracing,\n                CargoDependency.Flate2,\n                CargoDependency.Tokio.toDevDependency(),\n                CargoDependency.smithyCompression(runtimeConfig),\n                CargoDependency.smithyRuntimeApiClient(runtimeConfig),\n                CargoDependency.smithyTypes(runtimeConfig)\n                    .withFeature(\"http-body-0-4-x\")\n                    .withFeature(\"http-body-1-x\"),\n            )\n\n        fun idempotencyToken(runtimeConfig: RuntimeConfig) =\n            forInlineableRustFile(\n                \"idempotency_token\",\n                CargoDependency.FastRand,\n                CargoDependency.smithyTypes(runtimeConfig),\n            )\n\n        fun cborErrors(runtimeConfig: RuntimeConfig): InlineDependency =\n            forInlineableRustFile(\n                \"cbor_errors\",\n                CargoDependency.smithyCbor(runtimeConfig),\n                CargoDependency.smithyRuntimeApi(runtimeConfig),\n                CargoDependency.smithyTypes(runtimeConfig),\n            )\n\n        fun ec2QueryErrors(runtimeConfig: RuntimeConfig): InlineDependency =\n            forInlineableRustFile(\"ec2_query_errors\", CargoDependency.smithyXml(runtimeConfig))\n\n        fun wrappedXmlErrors(runtimeConfig: RuntimeConfig): InlineDependency =\n            forInlineableRustFile(\"rest_xml_wrapped_errors\", CargoDependency.smithyXml(runtimeConfig))\n\n        fun unwrappedXmlErrors(runtimeConfig: RuntimeConfig): InlineDependency =\n            forInlineableRustFile(\"rest_xml_unwrapped_errors\", CargoDependency.smithyXml(runtimeConfig))\n\n        fun serializationSettings(runtimeConfig: RuntimeConfig): InlineDependency =\n            forInlineableRustFile(\n                \"serialization_settings\",\n                CargoDependency.Http1x,\n                CargoDependency.smithyHttp(runtimeConfig),\n                CargoDependency.smithyTypes(runtimeConfig),\n            )\n\n        fun constrained(): InlineDependency = forRustFile(ConstrainedModule, \"/inlineable/src/constrained.rs\")\n\n        fun sdkFeatureTracker(runtimeConfig: RuntimeConfig): InlineDependency =\n            forInlineableRustFile(\n                \"sdk_feature_tracker\",\n                CargoDependency.smithyRuntime(runtimeConfig),\n            )\n    }\n}\n\nfun InlineDependency.toType() = RuntimeType(module.fullyQualifiedPath(), this)\n\ndata class Feature(val name: String, val default: Boolean, val deps: List<String>)\n\nval DEV_ONLY_FEATURES = setOf(\"test-util\", \"legacy-test-util\")\n\n/**\n * A dependency on an internal or external Cargo crate\n */\ndata class CargoDependency(\n    override val name: String,\n    private val location: DependencyLocation,\n    val scope: DependencyScope = DependencyScope.Compile,\n    val optional: Boolean = false,\n    val features: Set<String> = emptySet(),\n    val defaultFeatures: Boolean = true,\n    val rustName: String = name.replace(\"-\", \"_\"),\n    val `package`: String? = null,\n) : RustDependency(name) {\n    val key: Triple<String, DependencyLocation, DependencyScope>\n        get() = Triple(name, location, scope)\n\n    init {\n        if (scope != DependencyScope.Dev && DEV_ONLY_FEATURES.any { features.contains(it) }) {\n            throw IllegalArgumentException(\"The `test-util` feature cannot be used outside of DependencyScope.Dev\")\n        }\n    }\n\n    fun withFeature(feature: String): CargoDependency {\n        return copy(features = features.toMutableSet().apply { add(feature) })\n    }\n\n    override fun toDevDependency() = copy(scope = DependencyScope.Dev)\n\n    override fun version(): String =\n        when (location) {\n            is CratesIo -> location.version\n            is Local -> \"local\"\n        }\n\n    fun toMap(): Map<String, Any> {\n        val attribs = mutableMapOf<String, Any>()\n        with(location) {\n            when (this) {\n                is CratesIo -> attribs[\"version\"] = version\n                is Local -> {\n                    val fullPath = Path.of(\"$basePath/$name\")\n                    attribs[\"path\"] = fullPath.normalize().toString()\n                    version?.also { attribs[\"version\"] = version }\n                }\n            }\n        }\n        with(features) {\n            if (isNotEmpty()) {\n                attribs[\"features\"] = this\n            }\n        }\n        if (optional) {\n            attribs[\"optional\"] = true\n        }\n        if (!defaultFeatures) {\n            attribs[\"default-features\"] = false\n        }\n        if (`package`.isNotNullOrEmpty()) {\n            attribs[\"package\"] = `package`.toString()\n        }\n        return attribs\n    }\n\n    override fun toString(): String {\n        val attribs = mutableListOf<String>()\n        with(location) {\n            attribs.add(\n                when (this) {\n                    is CratesIo -> \"\"\"version = ${version.dq()}\"\"\"\n                    is Local -> {\n                        val fullPath = \"$basePath/$name\"\n                        \"\"\"path = ${fullPath.dq()}\"\"\"\n                    }\n                },\n            )\n        }\n        with(features) {\n            if (isNotEmpty()) {\n                attribs.add(\"features = [${joinToString(\",\") { it.dq() }}]\")\n            }\n        }\n        attribs.add(\"scope = $scope\")\n        return \"$name = { ${attribs.joinToString(\", \")} }\"\n    }\n\n    fun toType() = RuntimeType(\"::$rustName\", this)\n\n    companion object {\n        val Bytes: CargoDependency = CargoDependency(\"bytes\", CratesIo(\"1.4.0\"))\n        val BytesUtils: CargoDependency = CargoDependency(\"bytes-utils\", CratesIo(\"0.1.0\"))\n        val FastRand: CargoDependency = CargoDependency(\"fastrand\", CratesIo(\"2.0.0\"))\n        val Flate2: CargoDependency = CargoDependency(\"flate2\", CratesIo(\"1.0.30\"))\n        val FuturesUtil: CargoDependency =\n            CargoDependency(\"futures-util\", CratesIo(\"0.3.25\"), defaultFeatures = false, features = setOf(\"alloc\"))\n        val Hex: CargoDependency = CargoDependency(\"hex\", CratesIo(\"0.4.3\"))\n        val Hmac: CargoDependency = CargoDependency(\"hmac\", CratesIo(\"0.13\"))\n        val LazyStatic: CargoDependency = CargoDependency(\"lazy_static\", CratesIo(\"1.4.0\"))\n        val Lru: CargoDependency = CargoDependency(\"lru\", CratesIo(\"0.16.3\"))\n        val Md5: CargoDependency = CargoDependency(\"md-5\", CratesIo(\"0.11.0\"), rustName = \"md5\")\n        val PercentEncoding: CargoDependency =\n            CargoDependency(\"percent-encoding\", CratesIo(\"2.0.0\"))\n        val PinProjectLite: CargoDependency = CargoDependency(\"pin-project-lite\", CratesIo(\"0.2.14\"))\n        val Regex: CargoDependency = CargoDependency(\"regex\", CratesIo(\"1.5.5\"))\n        val RegexLite: CargoDependency = CargoDependency(\"regex-lite\", CratesIo(\"0.1.5\"))\n        val Ring: CargoDependency = CargoDependency(\"ring\", CratesIo(\"0.17.5\"))\n        val Sha2: CargoDependency = CargoDependency(\"sha2\", CratesIo(\"0.11\"))\n        val TokioStream: CargoDependency = CargoDependency(\"tokio-stream\", CratesIo(\"0.1.7\"))\n        val Tower: CargoDependency = CargoDependency(\"tower\", CratesIo(\"0.4\"))\n        val Tracing: CargoDependency = CargoDependency(\"tracing\", CratesIo(\"0.1\"))\n        val Url: CargoDependency = CargoDependency(\"url\", CratesIo(\"2.3.1\"))\n\n        // Test-only dependencies\n        val Approx: CargoDependency =\n            CargoDependency(\"approx\", CratesIo(\"0.5.1\"), DependencyScope.Dev)\n        val AsyncStd: CargoDependency =\n            CargoDependency(\"async-std\", CratesIo(\"1.12.0\"), DependencyScope.Dev)\n        val AsyncStream: CargoDependency =\n            CargoDependency(\"async-stream\", CratesIo(\"0.3.0\"), DependencyScope.Dev)\n        val Ciborium: CargoDependency =\n            CargoDependency(\"ciborium\", CratesIo(\"0.2\"), DependencyScope.Dev)\n        val Criterion: CargoDependency =\n            CargoDependency(\"criterion\", CratesIo(\"0.5.0\"), DependencyScope.Dev)\n        val FuturesCore: CargoDependency =\n            CargoDependency(\"futures-core\", CratesIo(\"0.3.25\"), DependencyScope.Dev)\n        val GetRandom: CargoDependency =\n            CargoDependency(\"getrandom\", CratesIo(\"0.3.3\"), DependencyScope.Dev)\n        val HdrHistogram: CargoDependency =\n            CargoDependency(\"hdrhistogram\", CratesIo(\"7.5.2\"), DependencyScope.Dev)\n        val Hound: CargoDependency =\n            CargoDependency(\"hound\", CratesIo(\"3.4.0\"), DependencyScope.Dev)\n        val PrettyAssertions: CargoDependency =\n            CargoDependency(\"pretty_assertions\", CratesIo(\"1.3.0\"), DependencyScope.Dev)\n        val Proptest: CargoDependency =\n            CargoDependency(\"proptest\", CratesIo(\"1\"), DependencyScope.Dev)\n        val SerdeJson: CargoDependency =\n            CargoDependency(\"serde_json\", CratesIo(\"1.0.0\"), DependencyScope.Dev)\n        val Smol: CargoDependency = CargoDependency(\"smol\", CratesIo(\"1.2.0\"), DependencyScope.Dev)\n        val TempFile: CargoDependency =\n            CargoDependency(\"tempfile\", CratesIo(\"3.2.0\"), DependencyScope.Dev)\n        val Tokio: CargoDependency =\n            CargoDependency(\n                \"tokio\",\n                CratesIo(\"1.23.1\"),\n                DependencyScope.Dev,\n                features = setOf(\"macros\", \"test-util\", \"rt-multi-thread\"),\n            )\n        val TracingAppender: CargoDependency =\n            CargoDependency(\n                \"tracing-appender\",\n                CratesIo(\"0.2.2\"),\n                DependencyScope.Dev,\n            )\n        val TracingSubscriber: CargoDependency =\n            CargoDependency(\n                \"tracing-subscriber\",\n                CratesIo(\"0.3.16\"),\n                DependencyScope.Dev,\n                features = setOf(\"env-filter\", \"json\"),\n            )\n        val TracingTest: CargoDependency =\n            CargoDependency(\n                \"tracing-test\",\n                CratesIo(\"0.2.5\"),\n                DependencyScope.Dev,\n                features = setOf(\"no-env-filter\"),\n            )\n\n        // Hyper 0.x types\n        val Http0x: CargoDependency = CargoDependency(\"http\", CratesIo(\"0.2.9\"))\n        val HttpBody0x: CargoDependency = CargoDependency(\"http-body\", CratesIo(\"0.4.4\"))\n        val Hyper0x: CargoDependency = CargoDependency(\"hyper\", CratesIo(\"0.14.26\"))\n        val HyperWithStream0x: CargoDependency = Hyper0x.withFeature(\"stream\")\n\n        // Hyper 1.x types\n        val Http1x: CargoDependency = CargoDependency(\"http-1x\", CratesIo(\"1\"), `package` = \"http\")\n        val HttpBody1x: CargoDependency =\n            CargoDependency(\"http-body-1x\", CratesIo(\"1\"), `package` = \"http-body\")\n        val HttpBodyUtil01x: CargoDependency =\n            CargoDependency(\"http-body-util\", CratesIo(\"0.1.3\"))\n\n        fun hyper(runtimeConfig: RuntimeConfig) =\n            when (runtimeConfig.httpVersion) {\n                HttpVersion.Http1x -> CargoDependency(\"hyper\", CratesIo(\"1\"))\n                HttpVersion.Http0x -> CargoDependency(\"hyper\", CratesIo(\"0.14.26\"))\n            }\n\n        fun smithyAsync(runtimeConfig: RuntimeConfig) = runtimeConfig.smithyRuntimeCrate(\"smithy-async\")\n\n        fun smithyCbor(runtimeConfig: RuntimeConfig) = runtimeConfig.smithyRuntimeCrate(\"smithy-cbor\")\n\n        fun smithyChecksums(runtimeConfig: RuntimeConfig) = runtimeConfig.smithyRuntimeCrate(\"smithy-checksums\")\n\n        fun smithyCompression(runtimeConfig: RuntimeConfig) = runtimeConfig.smithyRuntimeCrate(\"smithy-compression\")\n\n        fun smithyEventStream(runtimeConfig: RuntimeConfig) = runtimeConfig.smithyRuntimeCrate(\"smithy-eventstream\")\n\n        /**\n         * Returns the appropriate smithy-http dependency based on HTTP version.\n         *\n         * For HTTP 1.x: returns `aws-smithy-http` (latest version)\n         * For HTTP 0.x: returns `aws-smithy-legacy-http` (forked version supporting http@0.2)\n         */\n        fun smithyHttp(runtimeConfig: RuntimeConfig): CargoDependency =\n            when (runtimeConfig.httpVersion) {\n                HttpVersion.Http1x -> runtimeConfig.smithyRuntimeCrate(\"smithy-http\")\n                HttpVersion.Http0x -> runtimeConfig.smithyRuntimeCrate(\"smithy-legacy-http\")\n            }\n\n        fun smithyHttpClient(runtimeConfig: RuntimeConfig) = runtimeConfig.smithyRuntimeCrate(\"smithy-http-client\")\n\n        fun smithyHttpClientTestUtil(runtimeConfig: RuntimeConfig) =\n            smithyHttpClient(runtimeConfig).toDevDependency().withFeature(\"test-util\")\n\n        fun smithyJson(runtimeConfig: RuntimeConfig) = runtimeConfig.smithyRuntimeCrate(\"smithy-json\")\n\n        fun smithyProtocolTestHelpers(runtimeConfig: RuntimeConfig) =\n            runtimeConfig.smithyRuntimeCrate(\"smithy-protocol-test\", scope = DependencyScope.Dev)\n\n        fun smithyQuery(runtimeConfig: RuntimeConfig) = runtimeConfig.smithyRuntimeCrate(\"smithy-query\")\n\n        fun smithyRuntime(runtimeConfig: RuntimeConfig) =\n            runtimeConfig.smithyRuntimeCrate(\"smithy-runtime\").withFeature(\"client\")\n\n        fun smithyRuntimeTestUtil(runtimeConfig: RuntimeConfig) =\n            smithyRuntime(runtimeConfig).toDevDependency().withFeature(\"test-util\")\n\n        fun smithyRuntimeApi(runtimeConfig: RuntimeConfig) = runtimeConfig.smithyRuntimeCrate(\"smithy-runtime-api\")\n\n        fun smithyRuntimeApiClient(runtimeConfig: RuntimeConfig) =\n            smithyRuntimeApi(runtimeConfig).withFeature(\"client\").withFeature(\"http-1x\")\n\n        fun smithyRuntimeApiTestUtil(runtimeConfig: RuntimeConfig) =\n            smithyRuntimeApi(runtimeConfig).toDevDependency().withFeature(\"test-util\")\n\n        /**\n         * Returns smithy-types with the appropriate http-body feature.\n         *\n         * For HTTP 1.x: adds \"http-body-1-x\" feature\n         * For HTTP 0.x: adds \"http-body-0-4-x\" feature\n         */\n        fun smithyTypes(runtimeConfig: RuntimeConfig): CargoDependency =\n            when (runtimeConfig.httpVersion) {\n                HttpVersion.Http1x -> runtimeConfig.smithyRuntimeCrate(\"smithy-types\").withFeature(\"http-body-1-x\")\n                HttpVersion.Http0x -> runtimeConfig.smithyRuntimeCrate(\"smithy-types\").withFeature(\"http-body-0-4-x\")\n            }\n\n        fun smithyXml(runtimeConfig: RuntimeConfig) = runtimeConfig.smithyRuntimeCrate(\"smithy-xml\")\n\n        fun smithyMocks(runtimeConfig: RuntimeConfig) =\n            runtimeConfig.smithyRuntimeCrate(\"smithy-mocks\", scope = DependencyScope.Dev)\n\n        fun smithyObservability(runtimeConfig: RuntimeConfig) = runtimeConfig.smithyRuntimeCrate(\"smithy-observability\")\n\n        fun smithyObservabilityOtel(runtimeConfig: RuntimeConfig) =\n            runtimeConfig.smithyRuntimeCrate(\"smithy-observability-otel\")\n\n        // behind feature-gate\n        val Serde =\n            CargoDependency(\"serde\", CratesIo(\"1.0\"), features = setOf(\"derive\"), scope = DependencyScope.CfgUnstable)\n    }\n}\n\nprivate fun String?.isNotNullOrEmpty(): Boolean = !this.isNullOrEmpty()\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustGenerics.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.rustlang\n\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\n\ndata class GenericTypeArg(\n    val typeArg: String,\n    val bound: RuntimeType? = null,\n)\n\n/**\n * A \"writable\" collection of Rust generic type args and their bounds.\n *\n * e.g.\n * ```\n * val generics = GenericsGenerator(\n *     GenericTypeArg(\"P\", testRT(\"Pineapple\")),\n *     GenericTypeArg(\"C\", testRT(\"fruits::melon::Cantaloupe™\")),\n *     GenericTypeArg(\"T\"),\n * )\n *\n * rustTemplate(\"fn eat_fruit_salad#{decl}()\", \"decl\" to generics.declaration())\n * // Writes \"fn eat_fruit_salad<P, C, T>()\"\n *\n * rustTemplate(\"fn eat_fruit_salad<#{decl}>()\", \"decl\" to generics.declaration(withAngleBrackets = false))\n * // Writes \"fn eat_fruit_salad<P, C, T>()\"\n *\n * rustTemplate(\"\"\"\n *     pub struct FruitSalad;\n *\n *     impl<#{decl}> FruitSalad\n *     where:\n *     #{bounds}\n *     {\n *         pub fn new#{decl}() { todo!() }\n *     }\n * \"\"\", \"decl\" to generics.declaration(), \"bounds\" to generics.bounds())\n * // Writes:\n * //     pub struct FruitSalad;\n * //\n * //     impl<P, C, T> FruitSalad\n * //     where:\n * //        P: Pineapple,\n * //        C: fruits::melon::Cantaloupe,\n * //     {\n * //         pub fn new<P, C, T>() { todo!() }\n * //     }\n * ```\n */\nclass RustGenerics(vararg genericTypeArgs: GenericTypeArg) {\n    private val typeArgs: List<GenericTypeArg>\n\n    init {\n        typeArgs = genericTypeArgs.toList()\n    }\n\n    /**\n     * Returns the generics type args formatted for use in declarations.\n     *\n     * e.g.\n     *\n     * ```\n     * rustTemplate(\"fn eat_fruit_salad#{decl}()\", \"decl\" to generics.declaration())\n     * // Writes \"fn eat_fruit_salad<P, C, T>()\"\n     *\n     * rustTemplate(\"fn eat_fruit_salad<#{decl}>()\", \"decl\" to generics.declaration(withAngleBrackets = false))\n     * // Writes \"fn eat_fruit_salad<P, C, T>()\"\n     * ```\n     */\n    fun declaration(withAngleBrackets: Boolean = true) =\n        writable {\n            // Write nothing if this generator is empty\n            if (typeArgs.isNotEmpty()) {\n                val typeArgs = typeArgs.joinToString(\", \") { it.typeArg }\n\n                if (withAngleBrackets) {\n                    rustInlineTemplate(\"<\")\n                }\n\n                rustInlineTemplate(typeArgs)\n\n                if (withAngleBrackets) {\n                    rustInlineTemplate(\">\")\n                }\n            }\n        }\n\n    /**\n     * Returns bounded generic type args formatted for use in a \"where\" clause.\n     * Type args with no bound will not be written.\n     *\n     * e.g.\n     *\n     * ```\n     *  * rustTemplate(\"\"\"\n     *     pub struct FruitSalad;\n     *\n     *     impl<#{decl}> FruitSalad\n     *     where:\n     *     #{bounds}\n     *     {\n     *         pub fn new#{decl}() { todo!() }\n     *     }\n     * \"\"\", \"decl\" to generics.declaration(), \"bounds\" to generics.bounds())\n     * // Writes:\n     * //     pub struct FruitSalad;\n     * //\n     * //     impl<P, C, T> FruitSalad\n     * //     where:\n     * //        P: Pineapple,\n     * //        C: fruits::melon::Cantaloupe,\n     * //     {\n     * //         pub fn new<P, C, T>() { todo!() }\n     * //     }\n     * ```\n     */\n    fun bounds() =\n        writable {\n            // Only write bounds for generic type params with a bound\n            for ((typeArg, bound) in typeArgs) {\n                if (bound != null) {\n                    rustTemplate(\"$typeArg: #{bound},\\n\", \"bound\" to bound)\n                }\n            }\n        }\n\n    /**\n     * Combine two `GenericsGenerator`s into one. Type args for the first `GenericsGenerator` will appear before\n     * type args from the second `GenericsGenerator`.\n     *\n     * e.g.\n     *\n     * ```\n     * val ggA = GenericsGenerator(\n     *     GenericTypeArg(\"A\", testRT(\"Apple\")),\n     * )\n     * val ggB = GenericsGenerator(\n     *     GenericTypeArg(\"B\", testRT(\"Banana\")),\n     * )\n     *\n     * rustTemplate(\"fn eat_fruit#{decl}()\", \"decl\" to (ggA + ggB).declaration())\n     * // Writes \"fn eat_fruit<A, B>()\"\n     *\n     */\n    operator fun plus(operationGenerics: RustGenerics): RustGenerics {\n        return RustGenerics(*(typeArgs + operationGenerics.typeArgs).toTypedArray())\n    }\n}\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustModule.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.rustlang\n\nimport software.amazon.smithy.rust.codegen.core.smithy.ModuleDocProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.util.PANIC\n\n/**\n * RustModule system.\n *\n * RustModules are idempotent, BUT, you must take care to always use the same module (matching docs, visibility, etc.):\n * - There is no guarantee _which_ module will be rendered.\n */\nsealed class RustModule {\n    /** lib.rs */\n    object LibRs : RustModule()\n\n    /**\n     * LeafModule\n     *\n     * A LeafModule is _all_ modules that are not `lib.rs`. To create a nested leaf module, set `parent` to a module\n     * _other_ than `LibRs`.\n     *\n     * To avoid infinite loops, avoid setting parent to itself ;-)\n     */\n    data class LeafModule(\n        val name: String,\n        val rustMetadata: RustMetadata,\n        val parent: RustModule = LibRs,\n        val inline: Boolean = false,\n        // module is a cfg(test) module\n        val tests: Boolean = false,\n        val documentationOverride: String? = null,\n    ) : RustModule() {\n        init {\n            check(!name.contains(\"::\")) {\n                \"Module names CANNOT contain `::`—modules must be nested with parent (name was: `$name`)\"\n            }\n            check(name != \"\") {\n                \"Module name cannot be empty\"\n            }\n\n            check(!RustReservedWords.isReserved(name)) {\n                \"Module `$name` cannot be a module name—it is a reserved word.\"\n            }\n        }\n\n        /** Convert a module into a module gated with `#[cfg(test)]` */\n        fun cfgTest(): LeafModule =\n            this.copy(\n                rustMetadata = rustMetadata.copy(additionalAttributes = rustMetadata.additionalAttributes + Attribute.CfgTest),\n                tests = true,\n            )\n    }\n\n    companion object {\n        /** Creates a new module with the specified visibility */\n        fun new(\n            name: String,\n            visibility: Visibility,\n            inline: Boolean = false,\n            parent: RustModule = LibRs,\n            additionalAttributes: List<Attribute> = listOf(),\n            documentationOverride: String? = null,\n        ): LeafModule {\n            return LeafModule(\n                RustReservedWords.escapeIfNeeded(name),\n                RustMetadata(visibility = visibility, additionalAttributes = additionalAttributes),\n                inline = inline,\n                parent = parent,\n                documentationOverride = documentationOverride,\n            )\n        }\n\n        /** Creates a new public module */\n        fun public(\n            name: String,\n            parent: RustModule = LibRs,\n            documentationOverride: String? = null,\n            additionalAttributes: List<Attribute> = emptyList(),\n            inline: Boolean = false,\n        ): LeafModule =\n            new(\n                name,\n                visibility = Visibility.PUBLIC,\n                inline = inline,\n                parent = parent,\n                documentationOverride = documentationOverride,\n                additionalAttributes = additionalAttributes,\n            )\n\n        /** Creates a new private module */\n        fun private(\n            name: String,\n            parent: RustModule = LibRs,\n        ): LeafModule = new(name, visibility = Visibility.PRIVATE, inline = false, parent = parent)\n\n        fun pubCrate(\n            name: String,\n            parent: RustModule = LibRs,\n            additionalAttributes: List<Attribute> = emptyList(),\n        ): LeafModule =\n            new(\n                name, visibility = Visibility.PUBCRATE,\n                inline = false,\n                parent = parent,\n                additionalAttributes = additionalAttributes,\n            )\n\n        fun inlineTests(\n            name: String = \"test\",\n            parent: RustModule = LibRs,\n            additionalAttributes: List<Attribute> = listOf(),\n        ) = new(\n            name,\n            Visibility.PRIVATE,\n            inline = true,\n            additionalAttributes = additionalAttributes,\n            parent = parent,\n        ).cfgTest()\n    }\n\n    fun isInline(): Boolean =\n        when (this) {\n            is LibRs -> false\n            is LeafModule -> this.inline\n        }\n\n    /**\n     * Fully qualified path to this module, e.g. `crate::grandparent::parent::child`\n     */\n    fun fullyQualifiedPath(): String =\n        when (this) {\n            is LibRs -> \"crate\"\n            is LeafModule -> parent.fullyQualifiedPath() + \"::\" + name\n        }\n\n    /**\n     * The file this module is homed in, e.g. `src/grandparent/parent/child.rs`\n     */\n    fun definitionFile(): String =\n        when (this) {\n            is LibRs -> \"src/lib.rs\"\n            is LeafModule -> {\n                val path = fullyQualifiedPath().split(\"::\").drop(1).joinToString(\"/\")\n                \"src/$path.rs\"\n            }\n        }\n\n    /**\n     * Renders the usage statement, approximately:\n     * ```rust\n     * /// My docs\n     * pub mod my_module_name\n     * ```\n     */\n    fun renderModStatement(\n        writer: RustWriter,\n        moduleDocProvider: ModuleDocProvider,\n    ) {\n        when (this) {\n            is LeafModule -> {\n                if (name.startsWith(\"r#\")) {\n                    PANIC(\"Something went wrong with module name escaping (module named '$name'). This is a bug.\")\n                }\n                ModuleDocProvider.writeDocs(moduleDocProvider, this, writer)\n                rustMetadata.render(writer)\n                writer.write(\"mod $name;\")\n            }\n\n            else -> {}\n        }\n    }\n\n    /** Converts this [RustModule] into a [RuntimeType] */\n    fun toType(): RuntimeType = RuntimeType(fullyQualifiedPath())\n}\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustReservedWords.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.rustlang\n\nimport software.amazon.smithy.codegen.core.ReservedWordSymbolProvider\nimport software.amazon.smithy.codegen.core.ReservedWords\nimport software.amazon.smithy.codegen.core.Symbol\nimport software.amazon.smithy.model.shapes.EnumShape\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.shapes.UnionShape\nimport software.amazon.smithy.model.traits.EnumTrait\nimport software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.WrappingSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.renamedFrom\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\nimport software.amazon.smithy.rust.codegen.core.util.letIf\n\ndata class RustReservedWordConfig(\n    /** Map of struct member names that should get renamed */\n    val structureMemberMap: Map<String, String>,\n    /** Map of union member names that should get renamed */\n    val unionMemberMap: Map<String, String>,\n    /** Map of enum member names that should get renamed */\n    val enumMemberMap: Map<String, String>,\n)\n\nclass RustReservedWordSymbolProvider(\n    private val base: RustSymbolProvider,\n    private val reservedWordConfig: RustReservedWordConfig,\n) : WrappingSymbolProvider(base) {\n    private val internal =\n        ReservedWordSymbolProvider.builder().symbolProvider(base)\n            .nameReservedWords(RustReservedWords)\n            .memberReservedWords(RustReservedWords)\n            .build()\n\n    override fun toMemberName(shape: MemberShape): String {\n        val baseName = super.toMemberName(shape)\n        val reservedWordReplacedName = internal.toMemberName(shape)\n        val container = model.expectShape(shape.container)\n        return when {\n            container is StructureShape ->\n                reservedWordConfig.structureMemberMap.getOrDefault(baseName, reservedWordReplacedName)\n\n            container is UnionShape ->\n                reservedWordConfig.unionMemberMap.getOrDefault(baseName, reservedWordReplacedName)\n\n            container is EnumShape || container.hasTrait<EnumTrait>() ->\n                reservedWordConfig.enumMemberMap.getOrDefault(baseName, reservedWordReplacedName)\n\n            else -> error(\"unexpected container: $container\")\n        }\n    }\n\n    /**\n     * Convert shape to a Symbol\n     *\n     * If this symbol provider renamed the symbol, a `renamedFrom` field will be set on the symbol, enabling\n     * code generators to generate special docs.\n     */\n    override fun toSymbol(shape: Shape): Symbol {\n        // Sanity check that the symbol provider stack is set up correctly\n        check(super.toSymbol(shape).renamedFrom() == null) {\n            \"RustReservedWordSymbolProvider should only run once\"\n        }\n\n        val renamedSymbol = internal.toSymbol(shape)\n        return when (shape) {\n            is MemberShape -> {\n                val container = model.expectShape(shape.container)\n                val containerIsEnum = container is EnumShape || container.hasTrait<EnumTrait>()\n                if (container !is StructureShape && container !is UnionShape && !containerIsEnum) {\n                    return base.toSymbol(shape)\n                }\n                val previousName = base.toMemberName(shape)\n                val escapedName = this.toMemberName(shape)\n                // if the names don't match and it isn't a simple escaping with `r#`, record a rename\n                renamedSymbol.toBuilder().name(escapedName)\n                    .letIf(escapedName != previousName && !escapedName.contains(\"r#\")) {\n                        it.renamedFrom(previousName)\n                    }.build()\n            }\n\n            else -> renamedSymbol\n        }\n    }\n}\n\nenum class EscapeFor {\n    TypeName,\n    ModuleName,\n}\n\nobject RustReservedWords : ReservedWords {\n    // This is the same list defined in `CodegenTestCommon` from the `buildSrc` Gradle subproject.\n    private val RustKeywords =\n        setOf(\n            \"as\",\n            \"break\",\n            \"const\",\n            \"continue\",\n            \"crate\",\n            \"else\",\n            \"enum\",\n            \"extern\",\n            \"false\",\n            \"fn\",\n            \"for\",\n            \"if\",\n            \"impl\",\n            \"in\",\n            \"let\",\n            \"loop\",\n            \"match\",\n            \"mod\",\n            \"move\",\n            \"mut\",\n            \"pub\",\n            \"ref\",\n            \"return\",\n            \"self\",\n            \"Self\",\n            \"static\",\n            \"struct\",\n            \"super\",\n            \"trait\",\n            \"true\",\n            \"type\",\n            \"unsafe\",\n            \"use\",\n            \"where\",\n            \"while\",\n            \"async\",\n            \"await\",\n            \"dyn\",\n            \"abstract\",\n            \"become\",\n            \"box\",\n            \"do\",\n            \"final\",\n            \"macro\",\n            \"override\",\n            \"priv\",\n            \"typeof\",\n            \"unsized\",\n            \"virtual\",\n            \"yield\",\n            \"try\",\n        )\n\n    // Some things can't be used as a raw identifier, so we can't use the normal escaping strategy\n    // https://internals.rust-lang.org/t/raw-identifiers-dont-work-for-all-identifiers/9094/4\n    private val keywordEscapingMap =\n        mapOf(\n            \"crate\" to \"crate_\",\n            \"super\" to \"super_\",\n            \"self\" to \"self_\",\n            \"Self\" to \"SelfValue\",\n            // Real models won't end in `_` so it's safe to stop here\n            \"SelfValue\" to \"SelfValue_\",\n        )\n\n    override fun escape(word: String): String = doEscape(word, EscapeFor.TypeName)\n\n    private fun doEscape(\n        word: String,\n        escapeFor: EscapeFor = EscapeFor.TypeName,\n    ): String =\n        when (val mapped = keywordEscapingMap[word]) {\n            null ->\n                when (escapeFor) {\n                    EscapeFor.TypeName -> \"r##$word\"\n                    EscapeFor.ModuleName -> \"${word}_\"\n                }\n            else -> mapped\n        }\n\n    fun escapeIfNeeded(\n        word: String,\n        escapeFor: EscapeFor = EscapeFor.TypeName,\n    ): String =\n        when (isReserved(word)) {\n            true -> doEscape(word, escapeFor)\n            else -> word\n        }\n\n    override fun isReserved(word: String): Boolean = RustKeywords.contains(word) || keywordEscapingMap.contains(word)\n}\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustType.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.rustlang\n\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute.Companion.deprecated\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute.Companion.derive\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute.Companion.serde\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.util.dq\n\n/**\n * Dereference [input]\n *\n * Clippy is upset about `*&`, so if [input] is already referenced, simply strip the leading '&'\n */\nfun autoDeref(input: String) =\n    if (input.startsWith(\"&\")) {\n        input.removePrefix(\"&\")\n    } else {\n        \"*$input\"\n    }\n\n/**\n * A hierarchy of types handled by Smithy codegen\n */\nsealed class RustType {\n    /**\n     * A Rust type that contains [member], another RustType. Used to generically operate over\n     * shapes that contain other shapes, e.g. [stripOuter] and [contains].\n     */\n    sealed interface Container {\n        val member: RustType\n        val namespace: kotlin.String?\n        val name: kotlin.String\n    }\n\n    /*\n     * Name refers to the top-level type for import purposes\n     */\n    abstract val name: kotlin.String\n\n    open val namespace: kotlin.String? = null\n\n    /**\n     * Get a writable for this `RustType`\n     *\n     * ```kotlin\n     * // Declare a RustType\n     * val t = RustType.Unit.writable\n     * // Then, invoke the writable directly\n     * t.invoke(writer)\n     * // OR template it out\n     *rustInlineTemplate(\"#{t:W}\", \"t\" to t)\n     * ```\n     *\n     * When formatted, the converted type will appear as such:\n     *\n     * | Type                                               | Formatted                                                            |\n     * | -------------------------------------------------- | -------------------------------------------------------------------  |\n     * | RustType.Unit                                      | ()                                                                   |\n     * | RustType.Bool                                      | bool                                                                 |\n     * | RustType.Float(32)                                 | f32                                                                  |\n     * | RustType.Float(64)                                 | f64                                                                  |\n     * | RustType.Integer(8)                                | i8                                                                   |\n     * | RustType.Integer(16)                               | i16                                                                  |\n     * | RustType.Integer(32)                               | i32                                                                  |\n     * | RustType.Integer(64)                               | i64                                                                  |\n     * | RustType.String                                    | std::string::String                                                  |\n     * | RustType.Vec(RustType.String)                      | std::vec::Vec::<std::string::String>                                 |\n     * | RustType.Slice(RustType.String)                    | [std::string::String]                                                |\n     * | RustType.HashMap(RustType.String, RustType.String) | std::collections::HashMap::<std::string::String, std::string::String>|\n     * | RustType.HashSet(RustType.String)                  | std::vec::Vec::<std::string::String>                                 |\n     * | RustType.Reference(\"&\", RustType.String)           | &std::string::String                                                 |\n     * | RustType.Reference(\"&mut\", RustType.String)        | &mut std::string::String                                             |\n     * | RustType.Reference(\"&'static\", RustType.String)    | &'static std::string::String                                         |\n     * | RustType.Option(RustType.String)                   | std::option::Option<std::string::String>                             |\n     * | RustType.Box(RustType.String)                      | std::boxed::Box<std::string::String>                                 |\n     * | RustType.Opaque(\"SoCool\", \"zelda_is\")              | zelda_is::SoCool                                                     |\n     * | RustType.Opaque(\"SoCool\")                          | SoCool                                                               |\n     * | RustType.Dyn(RustType.Opaque(\"Foo\", \"foo\"))        | dyn foo::Foo                                                         |\n     */\n    val writable = writable { rustInlineTemplate(\"#{this}\", \"this\" to this@RustType) }\n\n    object Unit : RustType() {\n        override val name: kotlin.String = \"()\"\n    }\n\n    object Bool : RustType() {\n        override val name: kotlin.String = \"bool\"\n    }\n\n    object String : RustType() {\n        private val runtimeType = RuntimeType.String\n        override val name = runtimeType.name\n        override val namespace = runtimeType.namespace\n    }\n\n    data class Float(val precision: Int) : RustType() {\n        override val name: kotlin.String = \"f$precision\"\n    }\n\n    data class Integer(val precision: Int) : RustType() {\n        override val name: kotlin.String = \"i$precision\"\n    }\n\n    data class Slice(override val member: RustType) : RustType(), Container {\n        override val name: kotlin.String = \"\"\n    }\n\n    data class HashMap(val key: RustType, override val member: RustType) : RustType(), Container {\n        // validating that `key` is a string occurs in the constructor in SymbolVisitor\n        override val name = RuntimeType.HashMap.name\n        override val namespace = RuntimeType.HashMap.namespace\n\n        companion object {\n            val Type = RuntimeType.HashMap.name\n            val Namespace = RuntimeType.HashMap.namespace\n        }\n    }\n\n    data class HashSet(override val member: RustType) : RustType(), Container {\n        override val name = RuntimeType.Vec.name\n        override val namespace = RuntimeType.Vec.namespace\n\n        companion object {\n            // This is Vec intentionally. Note the following passage from the Smithy spec:\n            //    Sets MUST be insertion ordered. Not all programming languages that support sets\n            //    support ordered sets, requiring them may be overly burdensome for users, or conflict with language\n            //    idioms. Such languages SHOULD store the values of sets in a list and rely on validation to ensure uniqueness.\n            // It's possible that we could provide our own wrapper type in the future.\n            val Type = RuntimeType.Vec.name\n            val Namespace = RuntimeType.Vec.namespace\n        }\n    }\n\n    data class Reference(val lifetime: kotlin.String?, override val member: RustType) : RustType(), Container {\n        override val name = member.name\n    }\n\n    data class Option(override val member: RustType) : RustType(), Container {\n        private val runtimeType = RuntimeType.Option\n        override val name = runtimeType.name\n        override val namespace = runtimeType.namespace\n\n        /** Convert `Option<T>` to `Option<&T>` **/\n        fun referenced(lifetime: kotlin.String?): Option {\n            return Option(Reference(lifetime, this.member))\n        }\n    }\n\n    data class MaybeConstrained(override val member: RustType) : RustType(), Container {\n        private val runtimeType = RuntimeType.MaybeConstrained\n        override val name = runtimeType.name\n        override val namespace = runtimeType.namespace\n    }\n\n    data class Box(override val member: RustType) : RustType(), Container {\n        private val runtimeType = RuntimeType.Box\n        override val name = runtimeType.name\n        override val namespace = runtimeType.namespace\n    }\n\n    data class Dyn(override val member: RustType) : RustType(), Container {\n        override val name = \"dyn\"\n        override val namespace: kotlin.String? = null\n    }\n\n    data class Vec(override val member: RustType) : RustType(), Container {\n        private val runtimeType: RuntimeType = RuntimeType.Vec\n        override val name = runtimeType.name\n        override val namespace = runtimeType.namespace\n    }\n\n    data class Opaque(override val name: kotlin.String, override val namespace: kotlin.String? = null) : RustType()\n\n    /**\n     * Represents application of a Rust type with the given arguments.\n     *\n     * For example, we can represent `HashMap<String, i64>` as\n     * `RustType.Application(RustType.Opaque(\"HashMap\"), listOf(RustType.String, RustType.Integer(64)))`.\n     * This helps us to separate the type and the arguments which is useful in methods like [qualifiedName].\n     */\n    data class Application(val type: RustType, val args: List<RustType>) : RustType() {\n        override val name = type.name\n        override val namespace = type.namespace\n    }\n}\n\n/**\n * Return the fully qualified name of this type NOT including generic type parameters, references, etc.\n *\n * - To generate something like `std::collections::HashMap`, use this function.\n * - To generate something like `std::collections::HashMap<String, String>`, use [render]\n */\nfun RustType.qualifiedName(): String {\n    val namespace = this.namespace?.let { \"$it::\" } ?: \"\"\n    return \"$namespace$name\"\n}\n\n/** Format this Rust type as an `impl Into<T>` */\nfun RustType.implInto(fullyQualified: Boolean = true): String {\n    return \"impl ${RuntimeType.Into.render(fullyQualified)}<${this.render(fullyQualified)}>\"\n}\n\n/** Format this Rust type so that it may be used as an argument type in a function definition */\nfun RustType.asArgumentType(fullyQualified: Boolean = true): String {\n    return when (this) {\n        is RustType.String, is RustType.Box -> this.implInto(fullyQualified)\n        else -> this.render(fullyQualified)\n    }\n}\n\n/** Format this Rust type so that it may be used as an argument type in a function definition */\nfun RustType.asArgumentValue(name: String) =\n    when (this) {\n        is RustType.String, is RustType.Box -> \"$name.into()\"\n        else -> name\n    }\n\n/**\n * For a given name, generate an `Argument` data class containing pre-formatted strings for using this type when\n * writing a Rust function.\n */\nfun RustType.asArgument(name: String) =\n    Argument(\n        \"$name: ${this.asArgumentType()}\",\n        this.asArgumentValue(name),\n        this.render(),\n    )\n\n/**\n * Render this type, including references and generic parameters.\n * - To generate something like `std::collections::HashMap<String, String>`, use this function\n * - To generate something like `std::collections::HashMap`, use [qualifiedName]\n */\nfun RustType.render(fullyQualified: Boolean = true): String {\n    val namespace =\n        if (fullyQualified) {\n            this.namespace?.let { \"$it::\" } ?: \"\"\n        } else {\n            \"\"\n        }\n    val base =\n        when (this) {\n            is RustType.Unit -> this.name\n            is RustType.Bool -> this.name\n            is RustType.Float -> this.name\n            is RustType.Integer -> this.name\n            is RustType.String -> this.name\n            is RustType.Vec -> \"${this.name}::<${this.member.render(fullyQualified)}>\"\n            is RustType.Slice -> \"[${this.member.render(fullyQualified)}]\"\n            is RustType.HashMap -> \"${this.name}::<${this.key.render(fullyQualified)}, ${\n                this.member.render(\n                    fullyQualified,\n                )\n            }>\"\n\n            is RustType.HashSet -> \"${this.name}::<${this.member.render(fullyQualified)}>\"\n            is RustType.Reference -> {\n                if (this.lifetime == \"&\") {\n                    \"&${this.member.render(fullyQualified)}\"\n                } else {\n                    \"&${this.lifetime?.let { \"'$it \" } ?: \"\"}${this.member.render(fullyQualified)}\"\n                }\n            }\n\n            is RustType.Application -> {\n                val args = this.args.joinToString(\", \") { it.render(fullyQualified) }\n                \"${this.name}<$args>\"\n            }\n\n            is RustType.Option -> \"${this.name}<${this.member.render(fullyQualified)}>\"\n            is RustType.Box -> \"${this.name}<${this.member.render(fullyQualified)}>\"\n            is RustType.Dyn -> \"${this.name} ${this.member.render(fullyQualified)}\"\n            is RustType.Opaque -> this.name\n            is RustType.MaybeConstrained -> \"${this.name}<${this.member.render(fullyQualified)}>\"\n        }\n    return \"$namespace$base\"\n}\n\n/**\n * Returns true if [this] contains [t] anywhere within its tree. For example,\n * Option<DateTime>.contains(DateTime) would return true.\n * Option<DateTime>.contains(Blob) would return false.\n */\nfun <T : RustType> RustType.contains(t: T): Boolean =\n    when (this) {\n        t -> true\n        is RustType.Container -> this.member.contains(t)\n        else -> false\n    }\n\ninline fun <reified T : RustType.Container> RustType.stripOuter(): RustType =\n    when (this) {\n        is T -> this.member\n        else -> this\n    }\n\n/** Extracts the inner Reference type */\nfun RustType.innerReference(): RustType? =\n    when (this) {\n        is RustType.Reference -> this\n        is RustType.Container -> this.member.innerReference()\n        else -> null\n    }\n\n/** Wraps a type in Option if it isn't already */\nfun RustType.asOptional(): RustType =\n    when (this) {\n        is RustType.Option -> this\n        else -> RustType.Option(this)\n    }\n\n/**\n * Converts type to a reference\n *\n * For example:\n * - `String` -> `&String`\n * - `Option<T>` -> `Option<&T>`\n */\nfun RustType.asRef(): RustType =\n    when (this) {\n        is RustType.Reference -> this\n        is RustType.Option -> RustType.Option(member.asRef())\n        else -> RustType.Reference(null, this)\n    }\n\n/**\n * Converts type to its Deref target\n *\n * For example:\n * - `String` -> `str`\n * - `Option<String>` -> `Option<&str>`\n * - `Box<Something>` -> `&Something`\n */\nfun RustType.asDeref(): RustType =\n    when (this) {\n        is RustType.Option ->\n            if (member.isDeref()) {\n                RustType.Option(member.asDeref().asRef())\n            } else {\n                this\n            }\n\n        is RustType.Box -> RustType.Reference(null, member)\n        is RustType.String -> RustType.Opaque(\"str\")\n        is RustType.Vec -> RustType.Slice(member)\n        else -> this\n    }\n\n/** Returns true if the type implements Deref */\nfun RustType.isDeref(): Boolean =\n    when (this) {\n        is RustType.Box -> true\n        is RustType.String -> true\n        is RustType.Vec -> true\n        else -> false\n    }\n\n/** Returns true if the type implements Copy */\nfun RustType.isCopy(): Boolean =\n    when (this) {\n        is RustType.Float -> true\n        is RustType.Integer -> true\n        is RustType.Reference -> true\n        is RustType.Bool -> true\n        is RustType.Slice -> true\n        is RustType.Option -> this.member.isCopy()\n        else -> false\n    }\n\n/** Returns true if the type implements Eq */\nfun RustType.isEq(): Boolean =\n    when (this) {\n        is RustType.Integer -> true\n        is RustType.Bool -> true\n        is RustType.String -> true\n        is RustType.Unit -> true\n        is RustType.Container -> this.member.isEq()\n        else -> false\n    }\n\n/** Recursively replaces lifetimes with the new lifetime */\nfun RustType.replaceLifetimes(newLifetime: String?): RustType =\n    when (this) {\n        is RustType.Option -> copy(member = member.replaceLifetimes(newLifetime))\n        is RustType.Vec -> copy(member = member.replaceLifetimes(newLifetime))\n        is RustType.HashSet -> copy(member = member.replaceLifetimes(newLifetime))\n        is RustType.HashMap ->\n            copy(\n                key = key.replaceLifetimes(newLifetime),\n                member = member.replaceLifetimes(newLifetime),\n            )\n\n        is RustType.Reference -> copy(lifetime = newLifetime)\n        else -> this\n    }\n\nenum class Visibility {\n    PRIVATE,\n    PUBCRATE,\n    PUBLIC,\n    ;\n\n    companion object {\n        fun publicIf(\n            condition: Boolean,\n            ifNot: Visibility,\n        ): Visibility =\n            if (condition) {\n                PUBLIC\n            } else {\n                ifNot\n            }\n    }\n\n    fun toRustQualifier(): String =\n        when (this) {\n            PRIVATE -> \"\"\n            PUBCRATE -> \"pub(crate)\"\n            PUBLIC -> \"pub\"\n        }\n}\n\n/**\n * Meta information about a Rust construction (field, struct, or enum).\n */\ndata class RustMetadata(\n    val derives: Set<RuntimeType> = setOf(),\n    val additionalAttributes: List<Attribute> = listOf(),\n    val visibility: Visibility = Visibility.PRIVATE,\n) {\n    fun withDerives(vararg newDerives: RuntimeType): RustMetadata = this.copy(derives = derives + newDerives)\n\n    fun withoutDerives(vararg withoutDerives: RuntimeType) = this.copy(derives = derives - withoutDerives.toSet())\n\n    fun renderAttributes(writer: RustWriter): RustMetadata {\n        val (deriveHelperAttrs, otherAttrs) = additionalAttributes.partition { it.isDeriveHelper }\n        otherAttrs.forEach {\n            it.render(writer)\n        }\n\n        Attribute(derive(derives)).render(writer)\n\n        // Derive helper attributes must come after derive, see https://github.com/rust-lang/rust/issues/79202\n        deriveHelperAttrs.forEach {\n            it.render(writer)\n        }\n        return this\n    }\n\n    private fun renderVisibility(writer: RustWriter): RustMetadata {\n        writer.writeInline(\n            when (visibility) {\n                Visibility.PRIVATE -> \"\"\n                Visibility.PUBCRATE -> \"pub(crate) \"\n                Visibility.PUBLIC -> \"pub \"\n            },\n        )\n        return this\n    }\n\n    fun render(writer: RustWriter) {\n        renderAttributes(writer)\n        renderVisibility(writer)\n    }\n\n    /**\n     * If `true`, the Rust symbol that this metadata references derives a `Debug` implementation.\n     * If `false`, then it doesn't.\n     */\n    fun hasDebugDerive(): Boolean {\n        return derives.contains(RuntimeType.Debug)\n    }\n}\n\ndata class Argument(val argument: String, val value: String, val type: String)\n\n/**\n * AttributeKind differentiates between the two kinds of attribute macros: inner and outer.\n * See the variant docs for more info, and the official Rust [Attribute Macro](https://doc.rust-lang.org/reference/attributes.html)\n * for even MORE info.\n */\nenum class AttributeKind {\n    /**\n     * Inner attributes, written with a bang (!) after the hash (#), apply to the item that the attribute is declared within.\n     */\n    Inner,\n\n    /**\n     * Outer attributes, written without the bang after the hash, apply to the thing that follows the attribute.\n     */\n    Outer,\n}\n\n/**\n * [Attributes](https://doc.rust-lang.org/reference/attributes.html) are general free form metadata\n * that are interpreted by the compiler.\n *\n * If the attribute is a \"derive helper\", such as  `#[serde]`, set `isDeriveHelper` to `true` so it is sorted correctly after\n * the derive attribute is rendered. (See https://github.com/rust-lang/rust/issues/79202 for why sorting matters.)\n *\n * For example:\n * ```rust\n * #[allow(missing_docs)] // <-- this is an attribute, and it is not a derive helper\n * #[derive(Clone, PartialEq, Serialize)] // <-- this is an attribute\n * #[serde(serialize_with = \"abc\")] // <-- this attribute is a derive helper because the `Serialize` derive uses it\n * struct Abc {\n *   a: i64\n * }\n * ```\n */\nclass Attribute(val inner: Writable, val isDeriveHelper: Boolean = false) {\n    constructor(str: String) : this(writable(str))\n    constructor(str: String, isDeriveHelper: Boolean) : this(writable(str), isDeriveHelper)\n    constructor(runtimeType: RuntimeType) : this(runtimeType.writable)\n\n    fun writable(attributeKind: AttributeKind = AttributeKind.Outer) =\n        writable {\n            render(this, attributeKind)\n        }\n\n    fun render(\n        writer: RustWriter,\n        attributeKind: AttributeKind = AttributeKind.Outer,\n    ) {\n        // Writing \"#[]\" with nothing inside it is meaningless\n        if (inner.isNotEmpty()) {\n            when (attributeKind) {\n                AttributeKind.Inner -> writer.rust(\"##![#W]\", inner)\n                AttributeKind.Outer -> writer.rust(\"##[#W]\", inner)\n            }\n        }\n    }\n\n    // These were supposed to be a part of companion object but we decided to move it out to here to avoid NPE\n    // You can find the discussion here.\n    // https://github.com/smithy-lang/smithy-rs/discussions/2248\n    fun serdeSerialize(): Attribute {\n        return Attribute(\n            cfgAttr(\n                all(writable(\"aws_sdk_unstable\"), feature(\"serde-serialize\")),\n                derive(RuntimeType.SerdeSerialize),\n            ),\n        )\n    }\n\n    fun serdeDeserialize(): Attribute {\n        return Attribute(\n            cfgAttr(\n                all(writable(\"aws_sdk_unstable\"), feature(\"serde-deserialize\")),\n                derive(RuntimeType.SerdeDeserialize),\n            ),\n        )\n    }\n\n    fun serdeSkip(): Attribute {\n        return Attribute(\n            cfgAttr(\n                all(\n                    writable(\"aws_sdk_unstable\"),\n                    any(feature(\"serde-serialize\"), feature(\"serde-deserialize\")),\n                ),\n                serde(\"skip\"),\n            ),\n        )\n    }\n\n    fun serdeSerializeOrDeserialize(): Attribute {\n        return Attribute(\n            cfg(\n                all(\n                    writable(\"aws_sdk_unstable\"),\n                    any(feature(\"serde-serialize\"), feature(\"serde-deserialize\")),\n                ),\n            ),\n        )\n    }\n\n    companion object {\n        val AllowNeedlessQuestionMark = Attribute(allow(\"clippy::needless_question_mark\"))\n        val AllowClippyBoxedLocal = Attribute(allow(\"clippy::boxed_local\"))\n        val AllowClippyEmptyLineAfterDocComments = Attribute(allow(\"clippy::empty_line_after_doc_comments\"))\n        val AllowClippyLetAndReturn = Attribute(allow(\"clippy::let_and_return\"))\n        val AllowClippyNeedlessBorrow = Attribute(allow(\"clippy::needless_borrow\"))\n        val AllowClippyNeedlessLifetimes = Attribute(allow(\"clippy::needless_lifetimes\"))\n        val AllowClippyNewWithoutDefault = Attribute(allow(\"clippy::new_without_default\"))\n        val AllowClippyNonLocalDefinitions = Attribute(allow(\"clippy::non_local_definitions\"))\n        val AllowClippyUnnecessaryWraps = Attribute(allow(\"clippy::unnecessary_wraps\"))\n        val AllowClippyUselessConversion = Attribute(allow(\"clippy::useless_conversion\"))\n        val AllowClippyUnnecessaryLazyEvaluations = Attribute(allow(\"clippy::unnecessary_lazy_evaluations\"))\n        val AllowClippyTooManyArguments = Attribute(allow(\"clippy::too_many_arguments\"))\n        val AllowDeadCode = Attribute(allow(\"dead_code\"))\n        val AllowDeprecated = Attribute(allow(\"deprecated\"))\n        val AllowIrrefutableLetPatterns = Attribute(allow(\"irrefutable_let_patterns\"))\n        val AllowMissingDocs = Attribute(allow(\"missing_docs\"))\n        val AllowNonSnakeCase = Attribute(allow(\"non_snake_case\"))\n        val AllowUninlinedFormatArgs = Attribute(allow(\"clippy::uninlined_format_args\"))\n        val AllowUnreachableCode = Attribute(allow(\"unreachable_code\"))\n        val AllowUnreachablePatterns = Attribute(allow(\"unreachable_patterns\"))\n        val AllowUnused = Attribute(allow(\"unused\"))\n        val AllowUnusedImports = Attribute(allow(\"unused_imports\"))\n        val AllowUnusedMut = Attribute(allow(\"unused_mut\"))\n        val AllowUnusedVariables = Attribute(allow(\"unused_variables\"))\n        val CfgTest = Attribute(cfg(\"test\"))\n        val DenyDeprecated = Attribute(deny(\"deprecated\"))\n        val DenyMissingDocs = Attribute(deny(\"missing_docs\"))\n        val DocHidden = Attribute(doc(\"hidden\"))\n        val DocInline = Attribute(doc(\"inline\"))\n        val NoImplicitPrelude = Attribute(\"no_implicit_prelude\")\n\n        fun shouldPanic(expectedMessage: String? = null): Attribute =\n            if (expectedMessage != null) {\n                Attribute(macroWithArgs(\"should_panic\", \"expected = ${expectedMessage.dq()}\"))\n            } else {\n                Attribute(\"should_panic\")\n            }\n\n        val Test = Attribute(\"test\")\n        val TokioTest = Attribute(RuntimeType.Tokio.resolve(\"test\").writable)\n        val TracedTest = Attribute(RuntimeType.TracingTest.resolve(\"traced_test\").writable)\n        val AwsSdkUnstableAttribute = Attribute(cfg(\"aws_sdk_unstable\"))\n\n        /**\n         * [non_exhaustive](https://doc.rust-lang.org/reference/attributes/type_system.html#the-non_exhaustive-attribute)\n         * indicates that more fields may be added in the future\n         */\n        val NonExhaustive = Attribute(\"non_exhaustive\")\n\n        /**\n         * Mark the following type as deprecated. If you know why and in what version something was deprecated, then\n         * using [deprecated] is preferred.\n         */\n        val Deprecated = Attribute(\"deprecated\")\n\n        private fun macroWithArgs(\n            name: String,\n            vararg args: RustWriter.() -> Unit,\n        ): Writable =\n            {\n                // Macros that require args can't be empty\n                if (args.isNotEmpty()) {\n                    rustInline(\"$name(#W)\", args.toList().join(\", \"))\n                }\n            }\n\n        private fun macroWithArgs(\n            name: String,\n            vararg args: String,\n        ): Writable =\n            {\n                // Macros that require args can't be empty\n                if (args.isNotEmpty()) {\n                    rustInline(\"$name(${args.joinToString(\", \")})\")\n                }\n            }\n\n        fun all(vararg attrMacros: Writable): Writable = macroWithArgs(\"all\", *attrMacros)\n\n        fun cfgAttr(vararg attrMacros: Writable): Writable = macroWithArgs(\"cfg_attr\", *attrMacros)\n\n        fun allow(lints: Collection<String>): Writable = macroWithArgs(\"allow\", *lints.toTypedArray())\n\n        fun allow(vararg lints: String): Writable = macroWithArgs(\"allow\", *lints)\n\n        fun deny(vararg lints: String): Writable = macroWithArgs(\"deny\", *lints)\n\n        fun serde(vararg lints: String): Writable = macroWithArgs(\"serde\", *lints)\n\n        fun any(vararg attrMacros: Writable): Writable = macroWithArgs(\"any\", *attrMacros)\n\n        fun cfg(vararg attrMacros: Writable): Writable = macroWithArgs(\"cfg\", *attrMacros)\n\n        fun cfg(vararg attrMacros: String): Writable = macroWithArgs(\"cfg\", *attrMacros)\n\n        fun doc(vararg attrMacros: Writable): Writable = macroWithArgs(\"doc\", *attrMacros)\n\n        fun doc(str: String): Writable = macroWithArgs(\"doc\", writable(str))\n\n        fun not(vararg attrMacros: Writable): Writable = macroWithArgs(\"not\", *attrMacros)\n\n        fun feature(feature: String) = writable(\"feature = ${feature.dq()}\")\n\n        fun featureGate(featureName: String): Attribute {\n            return Attribute(cfg(feature(featureName)))\n        }\n\n        fun deprecated(\n            since: String? = null,\n            note: String? = null,\n        ): Writable {\n            val optionalFields = mutableListOf<Writable>()\n            if (!note.isNullOrEmpty()) {\n                optionalFields.add(pair(\"note\" to note.dq()))\n            }\n\n            if (!since.isNullOrEmpty()) {\n                optionalFields.add(pair(\"since\" to since.dq()))\n            }\n\n            return {\n                rustInline(\"deprecated\")\n                if (optionalFields.isNotEmpty()) {\n                    rustInline(\"(#W)\", optionalFields.join(\", \"))\n                }\n            }\n        }\n\n        fun derive(vararg runtimeTypes: RuntimeType): Writable =\n            {\n                // Empty derives are meaningless\n                if (runtimeTypes.isNotEmpty()) {\n                    // Sorted derives look nicer than unsorted, and it makes test output easier to predict\n                    val writables = runtimeTypes.sortedBy { it.path }.map { it.writable }.join(\", \")\n                    rustInline(\"derive(#W)\", writables)\n                }\n            }\n\n        fun derive(runtimeTypes: Collection<RuntimeType>): Writable = derive(*runtimeTypes.toTypedArray())\n\n        fun pair(pair: Pair<String, String>): Writable =\n            {\n                val (key, value) = pair\n                rustInline(\"$key = $value\")\n            }\n    }\n}\n\n/** Render all attributes in this list, one after another */\nfun Collection<Attribute>.render(writer: RustWriter) {\n    for (attr in this) {\n        attr.render(writer)\n    }\n}\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustWriter.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.rustlang\n\nimport org.intellij.lang.annotations.Language\nimport org.jsoup.Jsoup\nimport org.jsoup.nodes.Element\nimport org.jsoup.select.Elements\nimport software.amazon.smithy.codegen.core.CodegenException\nimport software.amazon.smithy.codegen.core.Symbol\nimport software.amazon.smithy.codegen.core.SymbolDependencyContainer\nimport software.amazon.smithy.codegen.core.SymbolWriter\nimport software.amazon.smithy.codegen.core.SymbolWriter.Factory\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.node.Node\nimport software.amazon.smithy.model.shapes.BooleanShape\nimport software.amazon.smithy.model.shapes.CollectionShape\nimport software.amazon.smithy.model.shapes.DoubleShape\nimport software.amazon.smithy.model.shapes.FloatShape\nimport software.amazon.smithy.model.shapes.NumberShape\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.model.traits.DeprecatedTrait\nimport software.amazon.smithy.model.traits.DocumentationTrait\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute.Companion.deprecated\nimport software.amazon.smithy.rust.codegen.core.smithy.Default\nimport software.amazon.smithy.rust.codegen.core.smithy.ModuleDocProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\nimport software.amazon.smithy.rust.codegen.core.smithy.defaultValue\nimport software.amazon.smithy.rust.codegen.core.smithy.isOptional\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.serialize.ValueExpression\nimport software.amazon.smithy.rust.codegen.core.smithy.rustType\nimport software.amazon.smithy.rust.codegen.core.util.PANIC\nimport software.amazon.smithy.rust.codegen.core.util.dq\nimport software.amazon.smithy.rust.codegen.core.util.getTrait\nimport software.amazon.smithy.rust.codegen.core.util.letIf\nimport software.amazon.smithy.rust.codegen.core.util.orNull\nimport software.amazon.smithy.utils.AbstractCodeWriter\nimport java.io.File\nimport java.util.function.BiFunction\n\n/**\n * # RustWriter (and Friends)\n *\n * RustWriter contains a set of features to make generating Rust code much more ergonomic ontop of the Smithy CodeWriter\n * interface.\n *\n * ## Recommended Patterns\n * For templating large blocks of Rust code, the preferred method is [rustTemplate]. This enables sharing a set of template\n * variables by creating a \"codegenScope.\"\n *\n * ```kotlin\n * fun requestHeaders(): Writeable { ... }\n * let codegenScope = arrayOf(\"http\" to CargoDependency.http)\n * let writer = RustWriter() // in normal code, you would normally get a RustWriter passed to you\n * writer.rustTemplate(\"\"\"\n *  // regular types can be rendered directly\n *  let request = #{http}::Request::builder().uri(\"http://example.com\");\n *  // writeables can be rendered with `:W`\n *  let request_headers = #{request_headers:W};\n * \"\"\", *codegenScope, \"request_headers\" to requestHeaders())\n * ```\n *\n * For short snippets of code [rust] can be used. This is equivalent but only positional arguments can be used.\n *\n * For formatting blocks where the block content generation requires looping, [rustBlock] and the equivalent [rustBlockTemplate]\n * are the recommended approach.\n */\n\nfun <T : AbstractCodeWriter<T>> T.withBlock(\n    textBeforeNewLine: String,\n    textAfterNewLine: String,\n    vararg args: Any,\n    block: T.() -> Unit,\n): T {\n    return conditionalBlock(textBeforeNewLine, textAfterNewLine, conditional = true, block = block, args = args)\n}\n\nfun <T : AbstractCodeWriter<T>> T.assignment(\n    variableName: String,\n    vararg ctx: Pair<String, Any>,\n    block: T.() -> Unit,\n) {\n    withBlockTemplate(\"let $variableName =\", \";\", *ctx) {\n        block()\n    }\n}\n\nfun <T : AbstractCodeWriter<T>> T.withBlockTemplate(\n    textBeforeNewLine: String,\n    textAfterNewLine: String,\n    vararg ctx: Pair<String, Any>,\n    block: T.() -> Unit,\n): T {\n    return withTemplate(textBeforeNewLine, ctx) { header ->\n        withTemplate(textAfterNewLine, ctx) { tail ->\n            conditionalBlock(header, tail, conditional = true, block = block)\n        }\n    }\n}\n\nprivate fun <T : AbstractCodeWriter<T>, U> T.withTemplate(\n    template: String,\n    scope: Array<out Pair<String, Any>>,\n    trim: Boolean = true,\n    f: T.(String) -> U,\n): U {\n    scope.forEach { (k, v) ->\n        when (v) {\n            is Unit -> PANIC(\"provided `kotlin.Unit` for $k. This is a bug.\")\n        }\n    }\n    val contents = transformTemplate(template, scope, trim)\n    pushState()\n    this.putContext(scope.toMap().mapKeys { (k, _) -> k.lowercase() })\n    val out = f(contents)\n    this.popState()\n    return out\n}\n\n/**\n * Write a block to the writer.\n * If [conditional] is true, the [textBeforeNewLine], followed by [block], followed by [textAfterNewLine]\n * If [conditional] is false, only [block] is written.\n * This enables conditionally wrapping a block in a prefix/suffix, e.g.\n *\n * ```\n * writer.conditionalBlock(\"Some(\", \")\", conditional = symbol.isOptional()) {\n *      write(\"symbolValue\")\n * }\n * ```\n */\nfun <T : AbstractCodeWriter<T>> T.conditionalBlock(\n    textBeforeNewLine: String,\n    textAfterNewLine: String,\n    conditional: Boolean = true,\n    vararg args: Any,\n    block: T.() -> Unit,\n): T {\n    if (conditional) {\n        openBlock(textBeforeNewLine.trim(), *args)\n    }\n\n    block(this)\n    if (conditional) {\n        closeBlock(textAfterNewLine.trim())\n    }\n    return this\n}\n\nfun RustWriter.conditionalBlockTemplate(\n    textBeforeNewLine: String,\n    textAfterNewLine: String,\n    conditional: Boolean = true,\n    vararg args: Pair<String, Any>,\n    block: RustWriter.() -> Unit,\n): RustWriter {\n    withTemplate(textBeforeNewLine.trim(), args) { beforeNewLine ->\n        withTemplate(textAfterNewLine.trim(), args) { afterNewLine ->\n            conditionalBlock(beforeNewLine, afterNewLine, conditional = conditional, block = block)\n        }\n    }\n    return this\n}\n\n/**\n * Convenience wrapper that tells Intellij that the contents of this block are Rust\n */\nfun <T : AbstractCodeWriter<T>> T.rust(\n    @Language(\"Rust\", prefix = \"macro_rules! foo { () =>  {{\\n\", suffix = \"\\n}}}\") contents: String,\n    vararg args: Any,\n) {\n    this.write(contents.trim(), *args)\n}\n\nfun <T : AbstractCodeWriter<T>> T.rawRust(\n    @Language(\"Rust\", prefix = \"macro_rules! foo { () =>  {{\\n\", suffix = \"\\n}}}\") contents: String,\n) {\n    this.write(escape(contents.trim()))\n}\n\n/**\n * Convenience wrapper that tells Intellij that the contents of this block are Rust\n */\nfun RustWriter.rustInline(\n    @Language(\"Rust\", prefix = \"macro_rules! foo { () =>  {{ \", suffix = \"}}}\") contents: String,\n    vararg args: Any,\n) {\n    this.writeInline(contents, *args)\n}\n\n// rewrite #{foo} to #{foo:T} (the smithy template format)\nprivate fun transformTemplate(\n    template: String,\n    scope: Array<out Pair<String, Any>>,\n    trim: Boolean = true,\n): String {\n    check(\n        scope.distinctBy {\n            it.first.lowercase()\n        }.size == scope.distinctBy { it.first }.size,\n    ) { \"Duplicate cased keys not supported\" }\n    val output =\n        template.replace(Regex(\"\"\"#\\{([a-zA-Z_0-9]+)(:\\w)?\\}\"\"\")) { matchResult ->\n            val keyName = matchResult.groupValues[1]\n            val templateType = matchResult.groupValues[2].ifEmpty { \":T\" }\n            if (!scope.toMap().keys.contains(keyName)) {\n                throw CodegenException(\n                    \"\"\"\n                    Rust block template expected `$keyName` but was not present in template.\n                    Hint: Template contains: ${scope.map { \"`${it.first}`\" }}\n                    \"\"\".trimIndent(),\n                )\n            }\n            \"#{${keyName.lowercase()}$templateType}\"\n        }\n\n    return output.letIf(trim) { output.trim() }\n}\n\n/**\n * Sibling method to [rustBlock] that enables `#{variablename}` style templating\n */\nfun <T : AbstractCodeWriter<T>> T.rustBlockTemplate(\n    @Language(\"Rust\", prefix = \"macro_rules! foo { () =>  {{ \", suffix = \"}}}\") contents: String,\n    vararg ctx: Pair<String, Any>,\n    block: T.() -> Unit,\n) {\n    withTemplate(contents, ctx) { header ->\n        this.openBlock(\"$header {\")\n        block(this)\n        closeBlock(\"}\")\n    }\n}\n\n/**\n * API for templating long blocks of Rust\n *\n * This enables writing code like:\n *\n * ```kotlin\n * writer.rustTemplate(\"\"\"\n * let some_val = #{operation}::from_response(response);\n * let serialized = #{serde_json}::to_json(some_val);\n * \"\"\", \"operation\" to operationSymbol, \"serde_json\" to RuntimeType.SerdeJson)\n * ```\n *\n * Before being passed to the underlying code writer, this syntax is rewritten to match the slightly more verbose\n * `CodeWriter` formatting: `#{name:T}`\n *\n * Variables are lower cased so that they become valid identifiers for named Smithy parameters.\n */\nfun RustWriter.rustTemplate(\n    @Language(\"Rust\", prefix = \"macro_rules! foo { () =>  {{ \", suffix = \"}}}\") contents: String,\n    vararg ctx: Pair<String, Any>,\n) {\n    withTemplate(contents, ctx) { template ->\n        write(template)\n    }\n}\n\n/**\n * An API for templating inline Rust code.\n *\n * Works just like [RustWriter.rustTemplate] but won't write a newline at the end and won't trim the input\n */\nfun RustWriter.rustInlineTemplate(\n    @Language(\"Rust\", prefix = \"macro_rules! foo { () =>  {{ \", suffix = \"}}}\") contents: String,\n    vararg ctx: Pair<String, Any>,\n) {\n    withTemplate(contents, ctx, trim = false) { template ->\n        writeInline(template)\n    }\n}\n\n/*\n * Writes a Rust-style block, demarcated by curly braces\n */\nfun <T : AbstractCodeWriter<T>> T.rustBlock(\n    @Language(\"Rust\", prefix = \"macro_rules! foo { () =>  {{ \", suffix = \"}}}\")\n    header: String,\n    vararg args: Any,\n    block: T.() -> Unit,\n): T {\n    openBlock(\"$header {\", *args)\n    block(this)\n    closeBlock(\"}\")\n    return this\n}\n\n/**\n * Generate a RustDoc comment for [shape]\n */\nfun <T : AbstractCodeWriter<T>> T.documentShape(\n    shape: Shape,\n    model: Model,\n    autoSuppressMissingDocs: Boolean = true,\n    note: String? = null,\n): T {\n    val docTrait = shape.getMemberTrait(model, DocumentationTrait::class.java).orNull()\n\n    return docsOrFallback(docTrait?.value, autoSuppressMissingDocs, note)\n}\n\nfun <T : AbstractCodeWriter<T>> T.docsOrFallback(\n    docString: String? = null,\n    autoSuppressMissingDocs: Boolean = true,\n    note: String? = null,\n): T {\n    val htmlDocs: (T.() -> Unit)? =\n        when (docString?.isNotBlank()) {\n            true -> {\n                { docs(normalizeHtml(escape(docString))) }\n            }\n\n            else -> null\n        }\n    return docsOrFallback(htmlDocs, autoSuppressMissingDocs, note)\n}\n\nfun <T : AbstractCodeWriter<T>> T.docsOrFallback(\n    docsWritable: (T.() -> Unit)? = null,\n    autoSuppressMissingDocs: Boolean = true,\n    note: String? = null,\n): T {\n    if (docsWritable != null) {\n        // If docs are modeled, then place them on the code generated shape\n\n        docsWritable(this)\n        note?.also {\n            // Add a blank line between the docs and the note to visually differentiate\n            write(\"///\")\n            docs(\"_Note: ${it}_\")\n        }\n    } else if (autoSuppressMissingDocs) {\n        // Otherwise, suppress the missing docs lint for this shape since\n        // the lack of documentation is a modeling issue rather than a codegen issue.\n        rust(\"##[allow(missing_docs)] // documentation missing in model\")\n    }\n    return this\n}\n\n/**\n * Document the containing entity (e.g. module, crate, etc.)\n * Instead of prefixing lines with `///` lines are prefixed with `//!`\n */\nfun RustWriter.containerDocs(\n    text: String,\n    vararg args: Any,\n    trimStart: Boolean = true,\n): RustWriter {\n    return docs(text, newlinePrefix = \"//! \", args = args, trimStart = trimStart)\n}\n\n/**\n * Equivalent of [rustTemplate] for container docs.\n */\nfun RustWriter.containerDocsTemplate(\n    text: String,\n    vararg args: Pair<String, Any>,\n    trimStart: Boolean = false,\n): RustWriter = docsTemplate(text, newlinePrefix = \"//! \", args = args, trimStart = trimStart)\n\n/**\n * Write RustDoc-style docs into the writer\n *\n * Several modifications are made to provide consistent RustDoc formatting:\n *    - All lines will be prefixed by `///`\n *    - Tabs are replaced with spaces\n *    - Empty newlines are removed\n */\nfun <T : AbstractCodeWriter<T>> T.docs(\n    text: String,\n    vararg args: Any,\n    newlinePrefix: String = \"/// \",\n    trimStart: Boolean = true,\n    /** If `false`, will disable templating in `args` into `#{T}` spans */\n    templating: Boolean = true,\n): T {\n    if (!templating && args.isNotEmpty()) {\n        PANIC(\"Templating was disabled yet the following arguments were passed in: $args\")\n    }\n\n    // Because writing docs relies on the newline prefix, ensure that there was a new line written\n    // before we write the docs\n    this.ensureNewline()\n    pushState()\n    setNewlinePrefix(newlinePrefix)\n    val cleaned =\n        text.lines()\n            .joinToString(\"\\n\") {\n                when (trimStart) {\n                    true -> it.trimStart()\n                    else -> it\n                }.replace(\"\\t\", \"  \") // Rustdoc warns on tabs in documentation\n            }\n\n    if (templating) {\n        write(cleaned, *args)\n    } else {\n        writeWithNoFormatting(cleaned)\n    }\n\n    popState()\n    return this\n}\n\n/**\n * [rustTemplate] equivalent for doc comments.\n */\nfun <T : AbstractCodeWriter<T>> T.docsTemplate(\n    text: String,\n    vararg args: Pair<String, Any>,\n    newlinePrefix: String = \"/// \",\n    trimStart: Boolean = false,\n): T =\n    withTemplate(text, args, trim = false) { template ->\n        docs(template, newlinePrefix = newlinePrefix, trimStart = trimStart)\n    }\n\n/**\n * Writes a comment into the code\n *\n * Equivalent to [docs] but lines are preceded with `// ` instead of `///`\n */\nfun <T : AbstractCodeWriter<T>> T.comment(\n    text: String,\n    vararg args: Any,\n): T {\n    return docs(text, *args, newlinePrefix = \"// \")\n}\n\n/**\n * Generates a `#[deprecated]` attribute for [shape].\n */\nfun RustWriter.deprecatedShape(shape: Shape): RustWriter {\n    val deprecatedTrait = shape.getTrait<DeprecatedTrait>() ?: return this\n\n    val note = deprecatedTrait.message.orNull()\n    val since = deprecatedTrait.since.orNull()\n\n    Attribute(deprecated(since, note)).render(this)\n\n    return this\n}\n\n/** Escape the [expressionStart] character to avoid problems during formatting */\nfun <T : AbstractCodeWriter<T>> T.escape(text: String): String =\n    text.replace(\"$expressionStart\", \"$expressionStart$expressionStart\")\n\n/** Parse input as HTML and normalize it, for suitable use within Rust docs. */\nfun normalizeHtml(input: String): String {\n    val doc = Jsoup.parse(input)\n    doc.body().apply {\n        normalizeAnchors()\n        escapeBracketsInText()\n    }\n\n    return doc.body().html()\n}\n\n/**\n * Escape brackets in elements' inner text.\n *\n * For example:\n *\n * ```html\n * <body>\n *     <p>Text without brackets</p>\n *     <div>Some text with [brackets]</div>\n *     <span>Another [example, 1]</span>\n * </body>\n * ```\n *\n * gets converted to:\n *\n * ```html\n * <body>\n *     <p>Text without brackets</p>\n *     <div>Some text with \\[brackets\\]</div>\n *     <span>Another \\[example, 1\\]</span>\n * </body>\n * ```\n *\n * This is useful when rendering Rust docs, since text within brackets might get misinterpreted as broken Markdown doc\n * links (`[link text](https://example.com)`).\n **/\nprivate fun Element.escapeBracketsInText() {\n    // Select all elements that directly contain text with opening or closing brackets.\n    val elements: Elements = select(\"*:containsOwn([), *:containsOwn(])\")\n\n    // Loop through each element and escape the brackets in the text.\n    for (element: Element in elements) {\n        val originalText = element.text()\n        val escapedText = originalText.replace(\"[\", \"\\\\[\").replace(\"]\", \"\\\\]\")\n        element.text(escapedText)\n    }\n}\n\n/** Convert anchor tags missing `href` attribute into `code` tags. **/\nprivate fun Element.normalizeAnchors() {\n    getElementsByTag(\"a\").forEach {\n        val link = it.attr(\"href\")\n        if (link.isBlank()) {\n            it.changeInto(\"code\")\n        }\n    }\n}\n\nprivate fun Element.changeInto(tagName: String) {\n    replaceWith(Element(tagName).also { elem -> elem.appendChildren(childNodesCopy()) })\n}\n\n/** Write an `impl` block for the given symbol */\nfun RustWriter.implBlock(\n    symbol: Symbol,\n    block: Writable,\n) {\n    rustBlock(\"impl ${symbol.name}\") {\n        block()\n    }\n}\n\n/** Write a `#[cfg(feature = \"...\")]` block for the given feature */\nfun RustWriter.featureGateBlock(\n    feature: String,\n    block: Writable,\n) {\n    featureGatedBlock(feature, block)(this)\n}\n\n/** Write a `#[cfg(feature = \"...\")]` block for the given feature */\nfun featureGatedBlock(\n    feature: String,\n    block: Writable,\n): Writable {\n    return writable {\n        rustBlock(\"##[cfg(feature = ${feature.dq()})]\") {\n            block()\n        }\n    }\n}\n\nfun featureGatedBlock(\n    feature: Feature,\n    block: Writable,\n): Writable {\n    return writable {\n        rustBlock(\"##[cfg(feature = ${feature.name.dq()})]\") {\n            block()\n        }\n    }\n}\n\n/**\n * Write _exactly_ the text as written into the code writer without newlines or formatting\n */\nfun RustWriter.raw(text: String) = writeInline(escape(text))\n\n/**\n * [rustTemplate] equivalent for `raw()`. Note: This function won't automatically escape formatter symbols.\n */\nfun RustWriter.rawTemplate(\n    text: String,\n    vararg args: Pair<String, Any>,\n) = withTemplate(text, args, trim = false) { templated ->\n    writeInline(templated)\n}\n\n/**\n * Rustdoc doesn't support `r#` for raw identifiers.\n * This function adjusts doc links to refer to raw identifiers directly.\n */\nfun docLink(docLink: String): String = docLink.replace(\"::r##\", \"::\").replace(\"::r#\", \"::\")\n\nclass SafeNamer {\n    private var n = 0\n\n    fun safeName(prefix: String = \"var\"): String {\n        n += 1\n        return \"${prefix}_$n\"\n    }\n}\n\nclass RustWriter private constructor(\n    private val filename: String,\n    val namespace: String,\n    private val commentCharacter: String = \"//\",\n    private val printWarning: Boolean = true,\n    /** Insert comments indicating where code was generated */\n    val debugMode: Boolean = false,\n    /** When true, automatically change all dependencies to be in the test scope */\n    val devDependenciesOnly: Boolean = false,\n) :\n    SymbolWriter<RustWriter, UseDeclarations>(UseDeclarations(namespace)) {\n        companion object {\n            fun root() = forModule(null)\n\n            fun forModule(module: String?): RustWriter =\n                if (module == null) {\n                    RustWriter(\"lib.rs\", \"crate\")\n                } else {\n                    RustWriter(\"$module.rs\", \"crate::$module\")\n                }\n\n            fun factory(debugMode: Boolean): Factory<RustWriter> =\n                Factory { fileName: String, namespace: String ->\n                    when {\n                        fileName.endsWith(\".toml\") -> RustWriter(fileName, namespace, \"#\", debugMode = debugMode)\n                        fileName.endsWith(\".py\") -> RustWriter(fileName, namespace, \"#\", debugMode = debugMode)\n                        fileName.endsWith(\".md\") -> rawWriter(fileName, debugMode = debugMode)\n                        fileName == \"LICENSE\" -> rawWriter(fileName, debugMode = debugMode)\n                        fileName.startsWith(\"tests/\") ->\n                            RustWriter(\n                                fileName,\n                                namespace,\n                                debugMode = debugMode,\n                                devDependenciesOnly = true,\n                            )\n\n                        fileName == \"package.json\" -> rawWriter(fileName, debugMode = debugMode)\n                        fileName == \"stubgen.sh\" -> rawWriter(fileName, debugMode = debugMode)\n                        else -> RustWriter(fileName, namespace, debugMode = debugMode)\n                    }\n                }\n\n            fun toml(\n                fileName: String,\n                debugMode: Boolean = false,\n            ): RustWriter =\n                RustWriter(\n                    fileName,\n                    namespace = \"ignore\",\n                    commentCharacter = \"#\",\n                    printWarning = false,\n                    debugMode = debugMode,\n                )\n\n            private fun rawWriter(\n                fileName: String,\n                debugMode: Boolean,\n            ): RustWriter =\n                RustWriter(\n                    fileName,\n                    namespace = \"ignore\",\n                    commentCharacter = \"ignore\",\n                    printWarning = false,\n                    debugMode = debugMode,\n                )\n        }\n\n        override fun write(\n            content: Any?,\n            vararg args: Any?,\n        ): RustWriter {\n            // TODO(https://github.com/rust-lang/rustfmt/issues/5425): The second condition introduced here is to prevent\n            //     this rustfmt bug\n            val contentIsNotJustAComma = (content as? String?)?.let { it.trim() != \",\" } ?: false\n            if (debugMode && contentIsNotJustAComma) {\n                val location = Thread.currentThread().stackTrace\n                location.first { it.isRelevant() }?.let { \"/* ${it.fileName}:${it.lineNumber} */\" }\n                    ?.also { super.writeInline(it) }\n            }\n\n            return super.write(content, *args)\n        }\n\n        fun dirty() = super.toString().isNotBlank() || preamble.isNotEmpty()\n\n        /** Helper function to determine if a stack frame is relevant for debug purposes */\n        private fun StackTraceElement.isRelevant(): Boolean {\n            if (this.className.contains(\"AbstractCodeWriter\") || this.className.startsWith(\"java.lang\")) {\n                return false\n            }\n            return this.fileName != \"RustWriter.kt\"\n        }\n\n        private val preamble = mutableListOf<Writable>()\n        private val formatter = RustSymbolFormatter()\n        private val safeNamer = SafeNamer()\n\n        init {\n            expressionStart = '#'\n            if (filename.endsWith(\".rs\")) {\n                require(\n                    namespace.startsWith(\"crate\") ||\n                        filename.startsWith(\"tests${File.separator}\") ||\n                        filename == \"build.rs\",\n                ) {\n                    \"We can only write into files in the crate (got $namespace)\"\n                }\n            }\n            putFormatter('T', formatter)\n            putFormatter('D', RustDocLinker())\n            putFormatter('W', RustWriteableInjector())\n        }\n\n        fun module(): String? =\n            if (filename.startsWith(\"src\") && filename.endsWith(\".rs\")) {\n                filename.removeSuffix(\".rs\").substringAfterLast(File.separatorChar)\n            } else {\n                null\n            }\n\n        fun safeName(prefix: String = \"var\"): String = safeNamer.safeName(prefix)\n\n        fun first(preWriter: Writable) {\n            preamble.add(preWriter)\n        }\n\n        private fun addDependencyTestAware(dependencyContainer: SymbolDependencyContainer): RustWriter {\n            if (!devDependenciesOnly) {\n                super.addDependency(dependencyContainer)\n            } else {\n                dependencyContainer.dependencies.forEach { dependency ->\n                    super.addDependency(\n                        when (val dep = RustDependency.fromSymbolDependency(dependency)) {\n                            is CargoDependency -> dep.toDevDependency()\n                            else -> dependencyContainer\n                        },\n                    )\n                }\n            }\n            return this\n        }\n\n        /**\n         * Create an inline module. Instead of being in a new file, inline modules are written as a `mod { ... }` block\n         * directly into the parent.\n         *\n         * Callers must take care to use [this] when writing to ensure code is written to the right place:\n         * ```kotlin\n         * val writer = RustWriter.forModule(\"model\")\n         * writer.withInlineModule(RustModule.public(\"nested\")) {\n         *   Generator(...).render(this) // GOOD\n         *   Generator(...).render(writer) // WRONG!\n         * }\n         * ```\n         *\n         * The returned writer will inject any local imports into the module as needed.\n         */\n        fun withInlineModule(\n            module: RustModule.LeafModule,\n            moduleDocProvider: ModuleDocProvider?,\n            moduleWriter: Writable,\n        ): RustWriter {\n            check(module.isInline()) {\n                \"Only inline modules may be used with `withInlineModule`: $module\"\n            }\n\n            // In Rust, modules must specify their own imports—they don't have access to the parent scope.\n            // To easily handle this, create a new inner writer to collect imports, then dump it\n            // into an inline module.\n            val innerWriter =\n                RustWriter(\n                    this.filename,\n                    \"${this.namespace}::${module.name}\",\n                    printWarning = false,\n                    devDependenciesOnly = devDependenciesOnly || module.tests,\n                )\n            moduleWriter(innerWriter)\n            ModuleDocProvider.writeDocs(moduleDocProvider, module, this)\n            module.rustMetadata.render(this)\n            rustBlock(\"mod ${module.name}\") {\n                writeWithNoFormatting(innerWriter.toString())\n            }\n            innerWriter.dependencies.forEach { addDependencyTestAware(it) }\n            return this\n        }\n\n        /**\n         * Generate a wrapping if statement around a nullable value.\n         * The provided code block will only be called if the value is not `None`.\n         */\n        fun ifSome(\n            member: Symbol,\n            value: ValueExpression,\n            block: RustWriter.(value: ValueExpression) -> Unit,\n        ) {\n            when {\n                member.isOptional() -> {\n                    val innerValue = ValueExpression.Reference(safeName(\"inner\"))\n                    rustBlockTemplate(\"if let #{Some}(${innerValue.name}) = ${value.asRef()}\", *preludeScope) {\n                        block(innerValue)\n                    }\n                }\n\n                else -> this.block(value)\n            }\n        }\n\n        /**\n         * Generate a wrapping if statement around a primitive field.\n         * If the field is a number or boolean, the specified block is only called if the field is not equal to the\n         * member's default value.\n         */\n        fun ifNotNumberOrBoolDefault(\n            shape: Shape,\n            memberSymbol: Symbol,\n            variable: ValueExpression,\n            block: RustWriter.(field: ValueExpression) -> Unit,\n        ) {\n            when (shape) {\n                is NumberShape, is BooleanShape -> {\n                    if (memberSymbol.defaultValue() is Default.RustDefault) {\n                        when (shape) {\n                            is FloatShape, is DoubleShape ->\n                                rustBlock(\"if ${variable.asValue()} != 0.0\") {\n                                    block(variable)\n                                }\n\n                            is NumberShape ->\n                                rustBlock(\"if ${variable.asValue()} != 0\") {\n                                    block(variable)\n                                }\n\n                            is BooleanShape ->\n                                rustBlock(\"if ${variable.asValue()}\") {\n                                    block(variable)\n                                }\n                        }\n                    } else if (memberSymbol.defaultValue() is Default.NonZeroDefault) {\n                        val default = Node.printJson((memberSymbol.defaultValue() as Default.NonZeroDefault).value)\n                        when (shape) {\n                            // We know that the default is 'true' since it's the only possible non-zero default\n                            // for a boolean. Don't explicitly check against `true` to avoid a clippy lint.\n                            is BooleanShape ->\n                                rustBlock(\"if !${variable.asValue()}\") {\n                                    block(variable)\n                                }\n\n                            else ->\n                                rustBlock(\"if ${variable.asValue()} != $default\") {\n                                    block(variable)\n                                }\n                        }\n                    } else {\n                        rustBlock(\"\") {\n                            block(variable)\n                        }\n                    }\n                }\n                else ->\n                    rustBlock(\"\") {\n                        block(variable)\n                    }\n            }\n        }\n\n        /**\n         * Generate a wrapping if statement around a field.\n         *\n         * - If the field is optional, it will only be called if the field is present\n         * - If the field is an unboxed primitive, it will only be called if the field is non-zero\n         *\n         * # Example\n         *\n         * For a nullable structure shape (e.g. `Option<MyStruct>`), the following code will be generated:\n         *\n         * ```\n         * if let Some(v) = my_nullable_struct {\n         *   /* {block(variable)} */\n         * }\n         * ```\n         *\n         * # Example\n         *\n         * For a non-nullable integer shape, the following code will be generated:\n         *\n         * ```\n         * if my_int != 0 {\n         *   /* {block(variable)} */\n         * }\n         * ```\n         */\n        fun ifSet(\n            shape: Shape,\n            member: Symbol,\n            variable: ValueExpression,\n            block: RustWriter.(field: ValueExpression) -> Unit,\n        ) {\n            ifSome(member, variable) { inner -> ifNotNumberOrBoolDefault(shape, member, inner, block) }\n        }\n\n        fun listForEach(\n            target: Shape,\n            outerField: String,\n            block: RustWriter.(field: String, target: ShapeId) -> Unit,\n        ) {\n            if (target is CollectionShape) {\n                val derefName = safeName(\"inner\")\n                rustBlock(\"for $derefName in $outerField\") {\n                    block(derefName, target.member.target)\n                }\n            } else {\n                this.block(outerField, target.toShapeId())\n            }\n        }\n\n        override fun toString(): String {\n            val contents = super.toString()\n            val preheader =\n                if (preamble.isNotEmpty()) {\n                    val prewriter =\n                        RustWriter(filename, namespace, printWarning = false, devDependenciesOnly = devDependenciesOnly)\n                    preamble.forEach { it(prewriter) }\n                    prewriter.toString()\n                } else {\n                    null\n                }\n\n            // Hack to support TOML: the [commentCharacter] is overridden to support writing TOML.\n            val header =\n                if (printWarning) {\n                    \"$commentCharacter Code generated by software.amazon.smithy.rust.codegen.smithy-rs. DO NOT EDIT.\"\n                } else {\n                    null\n                }\n            val useDecls =\n                importContainer.toString().ifEmpty {\n                    null\n                }\n            return listOfNotNull(preheader, header, useDecls, contents).joinToString(separator = \"\\n\", postfix = \"\\n\")\n        }\n\n        fun format(r: Any) = formatter.apply(r, \"\")\n\n        fun addDepsRecursively(symbol: Symbol) {\n            addDependencyTestAware(symbol)\n            symbol.references.forEach { addDepsRecursively(it.symbol) }\n        }\n\n        /**\n         * Generate RustDoc links, e.g. [`Abc`](crate::module::Abc)\n         */\n        inner class RustDocLinker : BiFunction<Any, String, String> {\n            override fun apply(\n                t: Any,\n                u: String,\n            ): String {\n                return when (t) {\n                    is Symbol -> \"[`${t.name}`](${docLink(t.rustType().qualifiedName())})\"\n                    else -> throw CodegenException(\"Invalid type provided to RustDocLinker ($t) expected Symbol\")\n                }\n            }\n        }\n\n        /**\n         * Formatter to enable formatting any [writable] with the #W formatter.\n         */\n        inner class RustWriteableInjector : BiFunction<Any, String, String> {\n            override fun apply(\n                t: Any,\n                u: String,\n            ): String {\n                @Suppress(\"UNCHECKED_CAST\")\n                val func =\n                    t as? Writable ?: throw CodegenException(\"RustWriteableInjector.apply choked on non-function t ($t)\")\n                val innerWriter =\n                    RustWriter(filename, namespace, printWarning = false, devDependenciesOnly = devDependenciesOnly)\n                func(innerWriter)\n                innerWriter.dependencies.forEach { addDependencyTestAware(it) }\n                return innerWriter.toString().trimEnd()\n            }\n        }\n\n        inner class RustSymbolFormatter : BiFunction<Any, String, String> {\n            override fun apply(\n                t: Any,\n                u: String,\n            ): String {\n                return when (t) {\n                    is RuntimeType -> {\n                        t.dependency?.also { addDependencyTestAware(it) }\n                        // for now, use the fully qualified type name\n                        t.fullyQualifiedName()\n                    }\n\n                    is RustModule -> {\n                        t.fullyQualifiedPath()\n                    }\n\n                    is Symbol -> {\n                        addDepsRecursively(t)\n                        t.rustType().render(fullyQualified = true)\n                    }\n\n                    is RustType -> {\n                        t.render(fullyQualified = true)\n                    }\n\n                    is Function<*> -> {\n                        @Suppress(\"UNCHECKED_CAST\")\n                        val func =\n                            t as? Writable ?: throw CodegenException(\"Invalid function type (expected writable) ($t)\")\n                        val innerWriter =\n                            RustWriter(filename, namespace, printWarning = false, devDependenciesOnly = devDependenciesOnly)\n                        func(innerWriter)\n                        innerWriter.dependencies.forEach { addDependencyTestAware(it) }\n                        return innerWriter.toString().trimEnd()\n                    }\n\n                    else -> throw CodegenException(\"Invalid type provided to RustSymbolFormatter: $t\")\n                    // escaping generates `##` sequences for all the common cases where\n                    // it will be run through templating, but in this context, we won't be escaped\n                }.replace(\"##\", \"#\")\n            }\n        }\n    }\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/UseDeclarations.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.rustlang\n\nimport software.amazon.smithy.codegen.core.ImportContainer\nimport software.amazon.smithy.codegen.core.Symbol\n\nclass UseDeclarations(private val namespace: String) : ImportContainer {\n    private val imports: MutableSet<UseStatement> = mutableSetOf()\n\n    fun addImport(\n        moduleName: String,\n        symbolName: String,\n        alias: String = symbolName,\n    ) {\n        imports.add(UseStatement(moduleName, symbolName, alias))\n    }\n\n    override fun toString(): String {\n        return imports.map { it.toString() }.sorted().joinToString(separator = \"\\n\")\n    }\n\n    override fun importSymbol(\n        symbol: Symbol,\n        alias: String?,\n    ) {\n        if (symbol.namespace.isNotEmpty() && symbol.namespace != namespace) {\n            addImport(symbol.namespace, symbol.name, alias ?: symbol.name)\n        }\n    }\n}\n\nprivate data class UseStatement(val moduleName: String, val symbolName: String, val alias: String) {\n    val rendered: String\n        get() {\n            val alias = alias.let { if (it == symbolName) \"\" else \" as $it\" }\n            return \"use $moduleName::$symbolName$alias;\"\n        }\n\n    override fun toString(): String = rendered\n}\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/Writable.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.rustlang\n\nimport software.amazon.smithy.codegen.core.CodegenException\nimport software.amazon.smithy.codegen.core.Symbol\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\n\ntypealias Writable = RustWriter.() -> Unit\n\n/**\n * Helper to allow coercing the Writeable signature\n * writable { rust(\"fn foo() { }\")\n */\nfun writable(w: Writable): Writable = w\n\nfun writable(w: String): Writable = writable { writeInline(w) }\n\nfun Writable.isEmpty(): Boolean {\n    val writer = RustWriter.root()\n    this(writer)\n    return writer.toString() == RustWriter.root().toString()\n}\n\nfun Writable.map(f: RustWriter.(Writable) -> Unit): Writable {\n    val self = this\n    return writable { f(self) }\n}\n\n/** Returns Some(..arg) */\nfun Writable.some(): Writable {\n    return this.map { rust(\"Some(#T)\", it) }\n}\n\nfun Writable.isNotEmpty(): Boolean = !this.isEmpty()\n\noperator fun Writable.plus(other: Writable): Writable =\n    writable {\n        this@plus(this)\n        other(this)\n    }\n\n/**\n * Helper allowing a `Iterable<Writable>` to be joined together using a `String` separator.\n * @param separator The string to use as a separator between elements\n * @param prefix An optional string to prepend to the entire joined sequence (defaults to null)\n * @return A Writable containing the optionally prefixed, joined elements\n */\nfun Iterable<Writable>.join(\n    separator: String,\n    prefix: String? = null,\n) = join(writable(separator), prefix?.let { writable(it) })\n\n/**\n * Helper allowing a `Iterable<Writable>` to be joined together using a `Writable` separator.\n * @param separator The Writable to use as a separator between elements\n * @param prefix An optional Writable to prepend to the entire joined sequence (defaults to null)\n * @return A Writable containing the optionally prefixed, joined elements\n */\nfun Iterable<Writable>.join(\n    separator: Writable,\n    prefix: Writable? = null,\n): Writable {\n    val iter = this.iterator()\n    return writable {\n        if (iter.hasNext() && prefix != null) {\n            prefix()\n        }\n        iter.forEach { value ->\n            value()\n            if (iter.hasNext()) {\n                separator()\n            }\n        }\n    }\n}\n\n/**\n * Helper allowing a `Sequence<Writable>` to be joined together using a `String` separator.\n */\nfun Sequence<Writable>.join(separator: String) = asIterable().join(separator)\n\n/**\n * Helper allowing a `Sequence<Writable>` to be joined together using a `Writable` separator.\n */\nfun Sequence<Writable>.join(separator: Writable) = asIterable().join(separator)\n\n/**\n * Helper allowing a `Array<Writable>` to be joined together using a `String` separator.\n */\nfun Array<Writable>.join(separator: String) = asIterable().join(separator)\n\n/**\n * Helper allowing a `Array<Writable>` to be joined together using a `Writable` separator.\n */\nfun Array<Writable>.join(separator: Writable) = asIterable().join(separator)\n\n/**\n * Combine multiple writable types into a Rust generic type parameter list\n *\n * e.g.\n *\n * ```kotlin\n * rustTemplate(\n *     \"some_fn::<#{type_params:W}>();\",\n *     \"type_params\" to rustTypeParameters(\n *         symbolProvider.toSymbol(operation),\n *         RustType.Unit,\n *         runtimeConfig.smithyTypes().resolve(\"body::SdkBody\"),\n *         GenericsGenerator(GenericTypeArg(\"A\"), GenericTypeArg(\"B\")),\n *     )\n * )\n * ```\n * would write out something like:\n * ```rust\n * some_fn::<crate::operation::SomeOperation, (), aws_smithy_types::body::SdkBody, A, B>();\n * ```\n */\nfun rustTypeParameters(vararg typeParameters: Any): Writable =\n    writable {\n        if (typeParameters.isNotEmpty()) {\n            val items =\n                typeParameters.map { typeParameter ->\n                    writable {\n                        when (typeParameter) {\n                            is Symbol, is RuntimeType, is RustType -> rustInlineTemplate(\"#{it}\", \"it\" to typeParameter)\n                            is String -> rustInlineTemplate(typeParameter)\n                            is RustGenerics ->\n                                rustInlineTemplate(\n                                    \"#{gg:W}\",\n                                    \"gg\" to typeParameter.declaration(withAngleBrackets = false),\n                                )\n\n                            else -> {\n                                // Check if it's a writer. If it is, invoke it; Else, throw a codegen error.\n                                @Suppress(\"UNCHECKED_CAST\")\n                                val func =\n                                    typeParameter as? Writable\n                                        ?: throw CodegenException(\"Unhandled type '$typeParameter' encountered by rustTypeParameters writer\")\n                                func.invoke(this)\n                            }\n                        }\n                    }\n                }\n\n            rustInlineTemplate(\"<#{Items:W}>\", \"Items\" to items.join(\", \"))\n        }\n    }\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/CodegenContext.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy\n\nimport software.amazon.smithy.codegen.core.Symbol\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.ServiceShape\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.BuilderInstantiator\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.StructSettings\n\n/**\n * [CodegenContext] contains code-generation context that is _common to all_  smithy-rs plugins.\n *\n * Code-generation context is pervasive read-only global data that gets passed around to the generators.\n *\n * If your data is specific to the `rust-client-codegen` client plugin, put it in [ClientCodegenContext] instead.\n * If your data is specific to the `rust-server-codegen` server plugin, put it in [ServerCodegenContext] instead.\n */\nabstract class CodegenContext(\n    /**\n     * The smithy model.\n     *\n     * Note: This model may or not be pruned to the given service closure, so ensure that `serviceShape` is used as\n     * an entry point.\n     */\n    open val model: Model,\n    /**\n     * The \"canonical\" symbol provider to convert Smithy [Shape]s into [Symbol]s, which have an associated [RustType].\n     */\n    open val symbolProvider: RustSymbolProvider,\n    /**\n     * Provider of documentation for generated Rust modules.\n     */\n    open val moduleDocProvider: ModuleDocProvider?,\n    /**\n     * Entrypoint service shape for code generation.\n     */\n    open val serviceShape: ServiceShape,\n    /**\n     * Shape indicating the protocol to generate, e.g. RestJson1.\n     */\n    open val protocol: ShapeId,\n    /**\n     * Settings loaded from `smithy-build.json`.\n     */\n    open val settings: CoreRustSettings,\n    /**\n     * Are we generating code for a smithy-rs client or server?\n     *\n     * Several code generators are reused by both the client and server plugins, but only deviate in small and contained\n     * parts (e.g. changing a return type or adding an attribute).\n     * Instead of splitting the generator in two or setting up an inheritance relationship, sometimes it's best\n     * to just look up this flag.\n     */\n    open val target: CodegenTarget,\n) {\n    /**\n     * Configuration of the runtime package:\n     * - Where are the runtime crates (smithy-*) located on the file system? Or are they versioned?\n     * - What are they called?\n     *\n     * This is just a convenience. To avoid typing `context.settings.runtimeConfig`, you can simply write\n     * `context.runtimeConfig`.\n     */\n    val runtimeConfig: RuntimeConfig by lazy { settings.runtimeConfig }\n\n    /**\n     * The name of the cargo crate to generate e.g. `aws-sdk-s3`\n     * This is loaded from the smithy-build.json during codegen.\n     *\n     * This is just a convenience. To avoid typing `context.settings.moduleName`, you can simply write\n     * `context.moduleName`.\n     */\n    val moduleName: String by lazy { settings.moduleName }\n\n    /**\n     * A moduleName for a crate uses kebab-case. When you want to `use` a crate in Rust code,\n     * it must be in snake-case. Call this method to get this crate's name in snake-case.\n     */\n    fun moduleUseName() = moduleName.replace(\"-\", \"_\")\n\n    /** Return a ModuleDocProvider or panic if one wasn't configured */\n    fun expectModuleDocProvider(): ModuleDocProvider =\n        checkNotNull(moduleDocProvider) {\n            \"A ModuleDocProvider must be set on the CodegenContext\"\n        }\n\n    fun structSettings() = StructSettings(settings.codegenConfig.flattenCollectionAccessors)\n\n    abstract fun builderInstantiator(): BuilderInstantiator\n}\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/CodegenDelegator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy\n\nimport software.amazon.smithy.build.FileManifest\nimport software.amazon.smithy.codegen.core.Symbol\nimport software.amazon.smithy.codegen.core.SymbolProvider\nimport software.amazon.smithy.codegen.core.WriterDelegator\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.DEV_ONLY_FEATURES\nimport software.amazon.smithy.rust.codegen.core.rustlang.DependencyScope\nimport software.amazon.smithy.rust.codegen.core.rustlang.Feature\nimport software.amazon.smithy.rust.codegen.core.rustlang.InlineDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustModule\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.Visibility\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.docs\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.CargoTomlGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.LibRsCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.LibRsGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.ManifestCustomizations\n\n/** Provider of documentation for generated Rust modules */\ninterface ModuleDocProvider {\n    companion object {\n        fun writeDocs(\n            provider: ModuleDocProvider?,\n            module: RustModule.LeafModule,\n            writer: RustWriter,\n        ) {\n            check(\n                provider != null ||\n                    module.documentationOverride != null ||\n                    module.rustMetadata.visibility != Visibility.PUBLIC,\n            ) {\n                \"Documentation must be provided for public modules, either via ModuleDocumentationProvider, or \" +\n                    \"by the module documentationOverride. Module: $module\"\n            }\n            try {\n                when {\n                    module.documentationOverride != null -> {\n                        if (module.documentationOverride.isNotEmpty()) {\n                            writer.docs(module.documentationOverride)\n                        }\n                    }\n                    else -> provider?.docsWriter(module)?.also { writeTo -> writeTo(writer) }\n                }\n            } catch (e: NotImplementedError) {\n                // Catch `TODO()` and rethrow only if its a public module\n                if (module.rustMetadata.visibility == Visibility.PUBLIC) {\n                    throw e\n                }\n            }\n        }\n    }\n\n    /** Returns documentation for the given module */\n    fun docsWriter(module: RustModule.LeafModule): Writable?\n}\n\n/**\n * RustCrate abstraction.\n *\n * **Note**: This is the only implementation, `open` only for test purposes.\n *\n * All code-generation at some point goes through this class. `RustCrate` maintains a `CodegenWriterDelegator` internally\n * which tracks a set of file-writer pairs and allows them to be loaded and cached (see: [useShapeWriter])\n *\n * On top of this, it adds Rust specific features:\n * - Generation of a `lib.rs` which adds `mod` statements automatically for every module that was used\n * - Tracking dependencies and crate features used during code generation, enabling generation of `Cargo.toml`\n *\n * Users will generally want to use two main entry points:\n * 1. [useShapeWriter]: Find or create a writer that will contain a given shape. See [locatedIn] for context about how\n *    shape locations are determined.\n * 2. [finalize]: Write the crate out to the file system, generating a lib.rs and Cargo.toml\n */\nopen class RustCrate(\n    fileManifest: FileManifest,\n    private val symbolProvider: SymbolProvider,\n    coreCodegenConfig: CoreCodegenConfig,\n    val moduleDocProvider: ModuleDocProvider,\n) {\n    private val inner = WriterDelegator(fileManifest, symbolProvider, RustWriter.factory(coreCodegenConfig.debugMode))\n    private val features: MutableSet<Feature> = mutableSetOf()\n\n    // used to ensure we never create accidentally discard docs / incorrectly create modules with incorrect visibility\n    private var duplicateModuleWarningSystem: MutableMap<String, RustModule.LeafModule> = mutableMapOf()\n\n    /**\n     * Write into the module that this shape is [locatedIn]\n     */\n    fun useShapeWriter(\n        shape: Shape,\n        f: Writable,\n    ) {\n        val module = symbolProvider.toSymbol(shape).module()\n        check(!module.isInline()) {\n            \"Cannot use useShapeWriter with inline modules—use [RustWriter.withInlineModule] instead\"\n        }\n        withModule(symbolProvider.toSymbol(shape).module(), f)\n    }\n\n    /**\n     * Write directly into lib.rs\n     */\n    fun lib(moduleWriter: Writable) {\n        inner.useFileWriter(\"src/lib.rs\", \"crate\", moduleWriter)\n    }\n\n    fun mergeFeature(feature: Feature) {\n        when (val existing = features.firstOrNull { it.name == feature.name }) {\n            null -> features.add(feature)\n            else -> {\n                features.remove(existing)\n                features.add(\n                    existing.copy(\n                        deps = (existing.deps + feature.deps).toSortedSet().toList(),\n                    ),\n                )\n            }\n        }\n    }\n\n    /**\n     * Finalize Cargo.toml and lib.rs and flush the writers to the file system.\n     *\n     * This is also where inline dependencies are actually reified and written, potentially recursively.\n     */\n    fun finalize(\n        settings: CoreRustSettings,\n        model: Model,\n        manifestCustomizations: ManifestCustomizations,\n        libRsCustomizations: List<LibRsCustomization>,\n        requireDocs: Boolean = true,\n        protocolId: ShapeId? = null,\n    ) {\n        injectInlineDependencies()\n        inner.finalize(\n            settings,\n            model,\n            manifestCustomizations,\n            libRsCustomizations,\n            this.features.toList(),\n            requireDocs,\n            protocolId,\n        )\n    }\n\n    private fun injectInlineDependencies() {\n        val writtenDependencies = mutableSetOf<String>()\n        val unloadedDependencies = {\n            this\n                .inner.dependencies\n                .map { dep -> RustDependency.fromSymbolDependency(dep) }\n                .filterIsInstance<InlineDependency>().distinctBy { it.key() }\n                .filter { !writtenDependencies.contains(it.key()) }\n        }\n        while (unloadedDependencies().isNotEmpty()) {\n            unloadedDependencies().forEach { dep ->\n                writtenDependencies.add(dep.key())\n                this.withModule(dep.module) {\n                    dep.renderer(this)\n                }\n            }\n        }\n    }\n\n    private fun checkDups(module: RustModule.LeafModule) {\n        duplicateModuleWarningSystem[module.fullyQualifiedPath()]?.also { preexistingModule ->\n            check(module == preexistingModule) {\n                \"Duplicate modules with differing properties were created! This will lead to non-deterministic behavior.\" +\n                    \"\\n Previous module: $preexistingModule.\" +\n                    \"\\n      New module: $module\"\n            }\n        }\n        duplicateModuleWarningSystem[module.fullyQualifiedPath()] = module\n    }\n\n    /**\n     * Create a new module directly. The resulting module will be placed in `src/<modulename>.rs`\n     */\n    fun withModule(\n        module: RustModule,\n        moduleWriter: Writable,\n    ): RustCrate {\n        when (module) {\n            is RustModule.LibRs -> lib { moduleWriter(this) }\n            is RustModule.LeafModule -> {\n                checkDups(module)\n\n                if (module.isInline()) {\n                    withModule(module.parent) {\n                        withInlineModule(module, moduleDocProvider, moduleWriter)\n                    }\n                } else {\n                    // Create a dependency which adds the mod statement for this module. This will be added to the writer\n                    // so that _usage_ of this module will generate _exactly one_ `mod <name>` with the correct modifiers.\n                    val modStatement =\n                        RuntimeType.forInlineFun(\"mod_\" + module.fullyQualifiedPath(), module.parent) {\n                            module.renderModStatement(this, moduleDocProvider)\n                        }\n                    val path = module.fullyQualifiedPath().split(\"::\").drop(1).joinToString(\"/\")\n                    inner.useFileWriter(\"src/$path.rs\", module.fullyQualifiedPath()) { writer ->\n                        moduleWriter(writer)\n                        writer.addDependency(modStatement.dependency)\n                    }\n                }\n            }\n        }\n        return this\n    }\n\n    /**\n     * Returns the module for a given Shape.\n     */\n    fun moduleFor(\n        shape: Shape,\n        moduleWriter: Writable,\n    ): RustCrate = withModule((symbolProvider as RustSymbolProvider).moduleForShape(shape), moduleWriter)\n\n    /**\n     * Create a new file directly\n     */\n    fun withFile(\n        filename: String,\n        fileWriter: Writable,\n    ) {\n        inner.useFileWriter(filename) {\n            fileWriter(it)\n        }\n    }\n\n    /**\n     * Render something in a private module and re-export it into the given symbol.\n     *\n     * @param privateModule: Private module to render into\n     * @param symbol: The symbol of the thing being rendered, which will be re-exported. This symbol\n     * should be the public-facing symbol rather than the private symbol.\n     */\n    fun inPrivateModuleWithReexport(\n        privateModule: RustModule.LeafModule,\n        symbol: Symbol,\n        writer: Writable,\n    ) {\n        withModule(privateModule, writer)\n        privateModule.toType().resolve(symbol.name).toSymbol().also { privateSymbol ->\n            withModule(symbol.module()) {\n                rust(\"pub use #T;\", privateSymbol)\n            }\n        }\n    }\n}\n\n// TODO(https://github.com/smithy-lang/smithy-rs/issues/2341): Remove unconstrained/constrained from codegen-core\nval UnconstrainedModule = RustModule.private(\"unconstrained\")\nval ConstrainedModule = RustModule.private(\"constrained\")\n\n/**\n * Finalize all the writers by:\n * - inlining inline dependencies that have been used\n * - generating (and writing) a Cargo.toml based on the settings & the required dependencies\n */\nfun WriterDelegator<RustWriter>.finalize(\n    settings: CoreRustSettings,\n    model: Model,\n    manifestCustomizations: ManifestCustomizations,\n    libRsCustomizations: List<LibRsCustomization>,\n    features: List<Feature>,\n    requireDocs: Boolean,\n    protocolId: ShapeId? = null,\n) {\n    this.useFileWriter(\"src/lib.rs\", \"crate::lib\") {\n        LibRsGenerator(settings, model, libRsCustomizations, requireDocs).render(it)\n    }\n    val cargoDependencies =\n\n        this.dependencies.map { RustDependency.fromSymbolDependency(it) }\n            .filterIsInstance<CargoDependency>().distinct()\n            .mergeDependencyFeatures()\n            .mergeIdenticalTestDependencies()\n    this.useFileWriter(\"Cargo.toml\") {\n        val cargoToml =\n            CargoTomlGenerator(\n                settings,\n                protocolId.toString(),\n                it,\n                manifestCustomizations,\n                cargoDependencies,\n                features,\n            )\n        cargoToml.render()\n    }\n    flushWriters()\n}\n\nprivate fun CargoDependency.mergeWith(other: CargoDependency): CargoDependency {\n    check(key == other.key)\n    return copy(\n        features = features + other.features,\n        defaultFeatures = defaultFeatures || other.defaultFeatures,\n        optional = optional && other.optional,\n    )\n}\n\ninternal fun List<CargoDependency>.mergeDependencyFeatures(): List<CargoDependency> =\n    this.groupBy { it.key }\n        .mapValues { group -> group.value.reduce { acc, next -> acc.mergeWith(next) } }\n        .values\n        .toList()\n        .sortedBy { it.name }\n\n/**\n * If the same dependency exists both in prod and test scope, remove it from the test scope.\n */\ninternal fun List<CargoDependency>.mergeIdenticalTestDependencies(): List<CargoDependency> {\n    val compileDeps =\n        this.filter { it.scope == DependencyScope.Compile }.toSet()\n\n    return this.filterNot { dep ->\n        dep.scope == DependencyScope.Dev &&\n            DEV_ONLY_FEATURES.none { devOnly -> dep.features.contains(devOnly) } &&\n            compileDeps.contains(dep.copy(scope = DependencyScope.Compile))\n    }\n}\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/CodegenTarget.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy\n\n/**\n * Code generation mode: In some situations, codegen has different behavior for client vs. server (eg. required fields)\n */\nenum class CodegenTarget {\n    CLIENT,\n    SERVER,\n    ;\n\n    /**\n     * Convenience method to execute thunk if the target is for CLIENT\n     */\n    fun <B> ifClient(thunk: () -> B): B? =\n        if (this == CLIENT) {\n            thunk()\n        } else {\n            null\n        }\n\n    /**\n     * Convenience method to execute thunk if the target is for SERVER\n     */\n    fun <B> ifServer(thunk: () -> B): B? =\n        if (this == SERVER) {\n            thunk()\n        } else {\n            null\n        }\n}\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/CoreRustSettings.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy\n\nimport software.amazon.smithy.codegen.core.CodegenException\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.node.ObjectNode\nimport software.amazon.smithy.model.node.StringNode\nimport software.amazon.smithy.model.shapes.ServiceShape\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.rust.codegen.core.util.orNull\nimport java.util.Optional\nimport java.util.logging.Logger\nimport kotlin.streams.toList\n\nprivate const val SERVICE = \"service\"\nprivate const val MODULE_NAME = \"module\"\nprivate const val MODULE_DESCRIPTION = \"moduleDescription\"\nprivate const val MODULE_VERSION = \"moduleVersion\"\nprivate const val MODULE_AUTHORS = \"moduleAuthors\"\nprivate const val MODULE_REPOSITORY = \"moduleRepository\"\nprivate const val RUNTIME_CONFIG = \"runtimeConfig\"\nprivate const val LICENSE = \"license\"\nprivate const val EXAMPLES = \"examples\"\nprivate const val MINIMUM_SUPPORTED_RUST_VERSION = \"minimumSupportedRustVersion\"\nprivate const val CUSTOMIZATION_CONFIG = \"customizationConfig\"\nconst val CODEGEN_SETTINGS = \"codegen\"\n\n/**\n * [CoreCodegenConfig] contains code-generation configuration that is _common to all_  smithy-rs plugins.\n *\n * If your configuration is specific to the `rust-client-codegen` client plugin, put it in [ClientCodegenContext] instead.\n * If your configuration is specific to the `rust-server-codegen` server plugin, put it in [ServerCodegenContext] instead.\n *\n * [formatTimeoutSeconds]: Timeout for running cargo fmt at the end of code generation\n * [debugMode]: Generate comments in the generated code indicating where code was generated from\n */\nopen class CoreCodegenConfig(\n    open val formatTimeoutSeconds: Int = DEFAULT_FORMAT_TIMEOUT_SECONDS,\n    open val debugMode: Boolean = DEFAULT_DEBUG_MODE,\n    open val flattenCollectionAccessors: Boolean = DEFAULT_FLATTEN_MODE,\n) {\n    companion object {\n        const val DEFAULT_FORMAT_TIMEOUT_SECONDS = 20\n        const val DEFAULT_DEBUG_MODE = false\n        const val DEFAULT_FLATTEN_MODE = false\n\n        fun fromNode(node: Optional<ObjectNode>): CoreCodegenConfig =\n            if (node.isPresent) {\n                CoreCodegenConfig(\n                    formatTimeoutSeconds =\n                        node.get()\n                            .getNumberMemberOrDefault(\"formatTimeoutSeconds\", DEFAULT_FORMAT_TIMEOUT_SECONDS).toInt(),\n                    debugMode = node.get().getBooleanMemberOrDefault(\"debugMode\", DEFAULT_DEBUG_MODE),\n                    flattenCollectionAccessors =\n                        node.get()\n                            .getBooleanMemberOrDefault(\"flattenCollectionAccessors\", DEFAULT_FLATTEN_MODE),\n                )\n            } else {\n                CoreCodegenConfig(\n                    formatTimeoutSeconds = DEFAULT_FORMAT_TIMEOUT_SECONDS,\n                    debugMode = DEFAULT_DEBUG_MODE,\n                )\n            }\n    }\n}\n\n/**\n * [CoreRustSettings] contains crate settings that are _common to all_  smithy-rs plugins.\n *\n * If your setting is specific to the crate that the `rust-client-codegen` client plugin generates, put it in\n * [ClientCodegenContext] instead.\n * If your setting is specific to the crate that the `rust-server-codegen` server plugin generates, put it in\n * [ServerCodegenContext] instead.\n */\nopen class CoreRustSettings(\n    open val service: ShapeId,\n    open val moduleName: String,\n    open val moduleVersion: String,\n    open val moduleAuthors: List<String>,\n    open val moduleDescription: String?,\n    open val moduleRepository: String?,\n    /**\n     * Configuration of the runtime package:\n     * - Where are the runtime crates (smithy-*) located on the file system? Or are they versioned?\n     * - What are they called?\n     */\n    open val runtimeConfig: RuntimeConfig,\n    open val codegenConfig: CoreCodegenConfig,\n    open val license: String?,\n    open val examplesUri: String? = null,\n    open val minimumSupportedRustVersion: String? = null,\n    open val customizationConfig: ObjectNode? = null,\n) {\n    /**\n     * Get the corresponding [ServiceShape] from a model.\n     * @return Returns the found `Service`\n     * @throws CodegenException if the service is invalid or not found\n     */\n    fun getService(model: Model): ServiceShape =\n        model\n            .getShape(service)\n            .orElseThrow { CodegenException(\"Service shape not found: $service\") }\n            .asServiceShape()\n            .orElseThrow { CodegenException(\"Shape is not a service: $service\") }\n\n    companion object {\n        private val LOGGER: Logger = Logger.getLogger(CoreRustSettings::class.java.name)\n\n        // Infer the service to generate from a model.\n        @JvmStatic\n        protected fun inferService(model: Model): ShapeId {\n            val services =\n                model.shapes(ServiceShape::class.java)\n                    .map(Shape::getId)\n                    .sorted()\n                    .toList()\n\n            when {\n                services.isEmpty() -> {\n                    throw CodegenException(\n                        \"Cannot infer a service to generate because the model does not \" +\n                            \"contain any service shapes\",\n                    )\n                }\n\n                services.size > 1 -> {\n                    throw CodegenException(\n                        \"Cannot infer service to generate because the model contains \" +\n                            \"multiple service shapes: \" + services,\n                    )\n                }\n\n                else -> {\n                    val service = services[0]\n                    LOGGER.info(\"Inferring service to generate as: $service\")\n                    return service\n                }\n            }\n        }\n\n        /**\n         * Create settings from a configuration object node.\n         *\n         * @param model Model to infer the service from (if not explicitly set in config)\n         * @param config Config object to load\n         * @return Returns the extracted settings\n         */\n        fun from(\n            model: Model,\n            config: ObjectNode,\n        ): CoreRustSettings {\n            val codegenSettings = config.getObjectMember(CODEGEN_SETTINGS)\n            val coreCodegenConfig = CoreCodegenConfig.fromNode(codegenSettings)\n            return fromCodegenConfig(model, config, coreCodegenConfig)\n        }\n\n        /**\n         * Create settings from a configuration object node and CodegenConfig.\n         *\n         * @param model Model to infer the service from (if not explicitly set in config)\n         * @param config Config object to load\n         * @param coreCodegenConfig CodegenConfig object to use\n         * @return Returns the extracted settings\n         */\n        private fun fromCodegenConfig(\n            model: Model,\n            config: ObjectNode,\n            coreCodegenConfig: CoreCodegenConfig,\n        ): CoreRustSettings {\n            config.warnIfAdditionalProperties(\n                arrayListOf(\n                    SERVICE,\n                    MODULE_NAME,\n                    MODULE_DESCRIPTION,\n                    MODULE_AUTHORS,\n                    MODULE_VERSION,\n                    MODULE_REPOSITORY,\n                    RUNTIME_CONFIG,\n                    CODEGEN_SETTINGS,\n                    EXAMPLES,\n                    LICENSE,\n                    MINIMUM_SUPPORTED_RUST_VERSION,\n                    CUSTOMIZATION_CONFIG,\n                ),\n            )\n\n            val service =\n                config.getStringMember(SERVICE)\n                    .map(StringNode::expectShapeId)\n                    .orElseGet { inferService(model) }\n\n            val runtimeConfig = config.getObjectMember(RUNTIME_CONFIG)\n            return CoreRustSettings(\n                service,\n                moduleName = config.expectStringMember(MODULE_NAME).value,\n                moduleVersion = config.expectStringMember(MODULE_VERSION).value,\n                moduleAuthors = config.expectArrayMember(MODULE_AUTHORS).map { it.expectStringNode().value },\n                moduleDescription = config.getStringMember(MODULE_DESCRIPTION).orNull()?.value,\n                moduleRepository = config.getStringMember(MODULE_REPOSITORY).orNull()?.value,\n                runtimeConfig = RuntimeConfig.fromNode(runtimeConfig),\n                codegenConfig = coreCodegenConfig,\n                license = config.getStringMember(LICENSE).orNull()?.value,\n                examplesUri = config.getStringMember(EXAMPLES).orNull()?.value,\n                minimumSupportedRustVersion = config.getStringMember(MINIMUM_SUPPORTED_RUST_VERSION).orNull()?.value,\n                customizationConfig = config.getObjectMember(CUSTOMIZATION_CONFIG).orNull(),\n            )\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/DirectedWalker.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy\n\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.neighbor.Relationship\nimport software.amazon.smithy.model.neighbor.RelationshipDirection\nimport software.amazon.smithy.model.neighbor.Walker\nimport software.amazon.smithy.model.shapes.Shape\nimport java.util.function.Predicate\n\n/**\n * A walker which traverses down the Shape graph. This is in contrast to `Walker` which can traverse up the shape\n * graph.\n */\nclass DirectedWalker(model: Model) {\n    private val inner = Walker(model)\n\n    fun walkShapes(shape: Shape): Set<Shape> = walkShapes(shape) { true }\n\n    fun walkShapes(\n        shape: Shape,\n        predicate: Predicate<Relationship>,\n    ): Set<Shape> =\n        inner.walkShapes(shape) { rel -> predicate.test(rel) && rel.direction == RelationshipDirection.DIRECTED }\n}\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/EventStreamSymbolProvider.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy\n\nimport software.amazon.smithy.codegen.core.Symbol\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustType\nimport software.amazon.smithy.rust.codegen.core.rustlang.stripOuter\nimport software.amazon.smithy.rust.codegen.core.smithy.traits.SyntheticInputTrait\nimport software.amazon.smithy.rust.codegen.core.smithy.traits.SyntheticOutputTrait\nimport software.amazon.smithy.rust.codegen.core.smithy.transformers.eventStreamErrors\nimport software.amazon.smithy.rust.codegen.core.util.getTrait\nimport software.amazon.smithy.rust.codegen.core.util.isEventStream\nimport software.amazon.smithy.rust.codegen.core.util.isInputEventStream\nimport software.amazon.smithy.rust.codegen.core.util.isOutputEventStream\n\n/**\n * Wrapping symbol provider to wrap modeled types with the aws-smithy-http Event Stream send/receive types.\n */\nclass EventStreamSymbolProvider(\n    private val runtimeConfig: RuntimeConfig,\n    base: RustSymbolProvider,\n    private val target: CodegenTarget,\n) : WrappingSymbolProvider(base) {\n    override fun toSymbol(shape: Shape): Symbol {\n        val initial = super.toSymbol(shape)\n\n        // We only want to wrap with Event Stream types when dealing with member shapes\n        if (shape is MemberShape && shape.isEventStream(model)) {\n            // Determine if the member has a container that is a synthetic input or output\n            val operationShape =\n                model.expectShape(shape.container).let { maybeInputOutput ->\n                    val operationId =\n                        maybeInputOutput.getTrait<SyntheticInputTrait>()?.operation\n                            ?: maybeInputOutput.getTrait<SyntheticOutputTrait>()?.operation\n                    operationId?.let { model.expectShape(it, OperationShape::class.java) }\n                }\n            // If we find an operation shape, then we can wrap the type\n            if (operationShape != null) {\n                val unionShape = model.expectShape(shape.target).asUnionShape().get()\n                val error =\n                    if (target == CodegenTarget.SERVER && unionShape.eventStreamErrors().isEmpty()) {\n                        RuntimeType.smithyHttp(runtimeConfig).resolve(\"event_stream::MessageStreamError\").toSymbol()\n                    } else {\n                        symbolForEventStreamError(unionShape)\n                    }\n                val errorT = error.rustType()\n                val innerT = initial.rustType().stripOuter<RustType.Option>()\n                val isSender =\n                    (shape.isInputEventStream(model) && target == CodegenTarget.CLIENT) ||\n                        (shape.isOutputEventStream(model) && target == CodegenTarget.SERVER)\n                val outer =\n                    when (isSender) {\n                        true -> RuntimeType.eventStreamSender(runtimeConfig).toSymbol().rustType()\n                        else -> {\n                            if (target == CodegenTarget.SERVER) {\n                                RuntimeType.eventStreamReceiver(runtimeConfig).toSymbol().rustType()\n                            } else {\n                                RuntimeType.eventReceiver(runtimeConfig).toSymbol().rustType()\n                            }\n                        }\n                    }\n                val rustType = RustType.Application(outer, listOf(innerT, errorT))\n                return initial.toBuilder()\n                    .name(rustType.name)\n                    .rustType(rustType)\n                    .addReference(initial)\n                    .addDependency(CargoDependency.smithyHttp(runtimeConfig).withFeature(\"event-stream\"))\n                    .addReference(error)\n                    .build()\n            }\n        }\n\n        return initial\n    }\n}\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/PublicImportSymbolProvider.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy\n\nimport software.amazon.smithy.codegen.core.Symbol\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustType\n\n/**\n * Rewrite crate::* with `<moduleusename>::*`\n *\n * This enables generating code into `tests` and other public locations.\n */\nclass PublicImportSymbolProvider(private val base: RustSymbolProvider, private val publicUseName: String) :\n    WrappingSymbolProvider(base) {\n    override fun toSymbol(shape: Shape): Symbol {\n        val baseSymbol = base.toSymbol(shape)\n\n        val currentRustType = baseSymbol.rustType()\n        val currentNamespace = currentRustType.namespace\n        val newRustType =\n            if (currentRustType is RustType.Opaque && currentNamespace != null && currentNamespace.startsWith(\"crate::\")) {\n                currentRustType.copy(namespace = currentNamespace.replace(\"crate::\", \"$publicUseName::\"))\n            } else {\n                currentRustType\n            }\n        return baseSymbol.toBuilder().rustType(newRustType).build()\n    }\n}\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeType.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy\n\nimport software.amazon.smithy.codegen.core.Symbol\nimport software.amazon.smithy.model.node.Node\nimport software.amazon.smithy.model.node.ObjectNode\nimport software.amazon.smithy.model.traits.TimestampFormatTrait\nimport software.amazon.smithy.rust.codegen.core.Version\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.CratesIo\nimport software.amazon.smithy.rust.codegen.core.rustlang.DependencyLocation\nimport software.amazon.smithy.rust.codegen.core.rustlang.DependencyScope\nimport software.amazon.smithy.rust.codegen.core.rustlang.InlineDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.Local\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustModule\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustType\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustInlineTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.util.orNull\nimport java.util.Optional\n\n/**\n * Location of the runtime crates (aws-smithy-http, aws-smithy-types etc.)\n *\n * This can be configured via the `runtimeConfig.versions` field in smithy-build.json\n */\ndata class RuntimeCrateLocation(val path: String?, val versions: CrateVersionMap) {\n    companion object {\n        fun path(path: String) = RuntimeCrateLocation(path, CrateVersionMap(emptyMap()))\n    }\n}\n\nfun RuntimeCrateLocation.crateLocation(crateName: String): DependencyLocation {\n    val version = crateName.let { versions.map[crateName] } ?: Version.crateVersion(crateName)\n    return when (this.path) {\n        // CratesIo needs an exact version. However, for local runtime crates we do not\n        // provide a detected version unless the user explicitly sets one via the `versions` map.\n        null -> CratesIo(version)\n        else -> Local(this.path)\n    }\n}\n\n/**\n * A mapping from crate name to a user-specified version.\n */\n@JvmInline\nvalue class CrateVersionMap(\n    val map: Map<String, String>,\n)\n\n/**\n * HTTP version to use for code generation.\n *\n * This determines which versions of http/http-body/hyper crates to use,\n * as well as which smithy-http-server crate to use (legacy vs current).\n */\nenum class HttpVersion {\n    /** HTTP 0.x: http@0.2, http-body@0.4, hyper@0.14, aws-smithy-legacy-http-server */\n    Http0x,\n\n    /** HTTP 1.x: http@1, http-body@1, hyper@1, aws-smithy-http-server@1 */\n    Http1x,\n}\n\n/**\n * Prefix & crate location for the runtime crates.\n */\ndata class RuntimeConfig(\n    val cratePrefix: String = \"aws\",\n    val runtimeCrateLocation: RuntimeCrateLocation = RuntimeCrateLocation.path(\"../\"),\n    /**\n     * HTTP version to use for code generation. Defaults to Http1x as that is the default for Clients.\n     */\n    val httpVersion: HttpVersion = HttpVersion.Http1x,\n) {\n    companion object {\n        /**\n         * Load a `RuntimeConfig` from an [ObjectNode] (JSON)\n         */\n        fun fromNode(maybeNode: Optional<ObjectNode>): RuntimeConfig {\n            val node = maybeNode.orElse(Node.objectNode())\n            val crateVersionMap =\n                node.getObjectMember(\"versions\")\n                    .orElse(Node.objectNode())\n                    .members\n                    .entries\n                    .let { members ->\n                        val map =\n                            members.associate {\n                                it.key.toString() to it.value.expectStringNode().value\n                            }\n                        CrateVersionMap(map)\n                    }\n            val path = node.getStringMember(\"relativePath\").orNull()?.value\n            val runtimeCrateLocation = RuntimeCrateLocation(path = path, versions = crateVersionMap)\n            return RuntimeConfig(\n                node.getStringMemberOrDefault(\"cratePrefix\", \"aws\"),\n                runtimeCrateLocation = runtimeCrateLocation,\n            )\n        }\n    }\n\n    fun smithyRuntimeCrate(\n        runtimeCrateName: String,\n        optional: Boolean = false,\n        scope: DependencyScope = DependencyScope.Compile,\n    ): CargoDependency {\n        val crateName = \"$cratePrefix-$runtimeCrateName\"\n        return CargoDependency(\n            crateName,\n            runtimeCrateLocation.crateLocation(crateName),\n            optional = optional,\n            scope = scope,\n        )\n    }\n}\n\n/**\n * `RuntimeType` captures all necessary information to render a type into a Rust file:\n * - [fullyQualifiedName]: What type is this?\n * - [namespace]: Where can we find this type.\n * - [dependency]: What other crates, if any, are required to use this type?\n *\n * For example:\n *\n *  * `RuntimeType(\"header::HeaderName\", CargoDependency.Http)`, when passed to a [RustWriter] would appear as such:\n *\n * `http::header::HeaderName`\n *  ------------  ----------\n *       |            |\n * `[namespace]` `[fullyQualifiedName]`\n *\n *  This type would have a [CargoDependency] pointing to the `http` crate. Writing it multiple times would still only\n *  add the dependency once.\n */\ndata class RuntimeType(val path: String, val dependency: RustDependency? = null) {\n    val name: String\n    val namespace: String\n\n    init {\n        val splitPath = path.split(\"::\").toMutableList()\n        // get the name at the end\n        this.name = splitPath.removeLast()\n        // get all parts that aren't the name at the end\n        this.namespace = splitPath.joinToString(\"::\")\n    }\n\n    /**\n     * Get a writable for this `RuntimeType`\n     */\n    val writable =\n        writable {\n            rustInlineTemplate(\n                \"#{this:T}\",\n                \"this\" to this@RuntimeType,\n            )\n        }\n\n    fun toDevDependencyType(): RuntimeType = copy(dependency = dependency?.toDevDependency())\n\n    /**\n     * Convert this [RuntimeType] into a [Symbol].\n     *\n     * This is not commonly required, but is occasionally useful when you want to force an import without referencing a type\n     * (e.g. when bringing a trait into scope). See [CodegenWriter.addUseImports].\n     */\n    fun toSymbol(): Symbol {\n        val builder =\n            Symbol.builder()\n                .name(name)\n                .namespace(namespace, \"::\")\n                .rustType(RustType.Opaque(name, namespace))\n\n        dependency?.run { builder.addDependency(this) }\n        return builder.build()\n    }\n\n    /**\n     * Create a new [RuntimeType] with a nested path.\n     *\n     * # Example\n     * ```kotlin\n     * val http = CargoDependency.http.resolve(\"Request\")\n     * ```\n     */\n    fun resolve(subPath: String): RuntimeType = copy(path = \"$path::$subPath\")\n\n    /**\n     * Returns the fully qualified name for this type\n     */\n    fun fullyQualifiedName(): String = path\n\n    fun render(fullyQualified: Boolean = true): String {\n        return if (fullyQualified) {\n            fullyQualifiedName()\n        } else {\n            name\n        }\n    }\n\n    /**\n     * The companion object contains commonly used RuntimeTypes\n     */\n    companion object {\n        /**\n         * Scope that contains all Rust prelude types, but not macros or functions.\n         *\n         * Prelude docs: https://doc.rust-lang.org/std/prelude/index.html#prelude-contents\n         */\n        val preludeScope by lazy {\n            arrayOf(\n                // Rust 1.0\n                \"Copy\" to std.resolve(\"marker::Copy\"),\n                \"Send\" to Send,\n                \"Sized\" to std.resolve(\"marker::Sized\"),\n                \"Sync\" to Sync,\n                \"Unpin\" to std.resolve(\"marker::Unpin\"),\n                \"Drop\" to std.resolve(\"ops::Drop\"),\n                \"Fn\" to std.resolve(\"ops::Fn\"),\n                \"FnMut\" to std.resolve(\"ops::FnMut\"),\n                \"FnOnce\" to std.resolve(\"ops::FnOnce\"),\n                \"Box\" to Box,\n                \"ToOwned\" to std.resolve(\"borrow::ToOwned\"),\n                \"Clone\" to Clone,\n                \"PartialEq\" to std.resolve(\"cmp::PartialEq\"),\n                \"PartialOrd\" to std.resolve(\"cmp::PartialOrd\"),\n                \"Eq\" to Eq,\n                \"Ord\" to Ord,\n                \"AsRef\" to AsRef,\n                \"AsMut\" to std.resolve(\"convert::AsMut\"),\n                \"Into\" to Into,\n                \"From\" to From,\n                \"Default\" to Default,\n                \"Iterator\" to std.resolve(\"iter::Iterator\"),\n                \"Extend\" to std.resolve(\"iter::Extend\"),\n                \"IntoIterator\" to std.resolve(\"iter::IntoIterator\"),\n                \"DoubleEndedIterator\" to std.resolve(\"iter::DoubleEndedIterator\"),\n                \"ExactSizeIterator\" to std.resolve(\"iter::ExactSizeIterator\"),\n                \"Option\" to Option,\n                \"Some\" to Option.resolve(\"Some\"),\n                \"None\" to Option.resolve(\"None\"),\n                \"Result\" to std.resolve(\"result::Result\"),\n                \"Ok\" to std.resolve(\"result::Result::Ok\"),\n                \"Err\" to std.resolve(\"result::Result::Err\"),\n                \"String\" to String,\n                \"ToString\" to std.resolve(\"string::ToString\"),\n                \"Vec\" to Vec,\n                // 2021 Edition\n                \"TryFrom\" to std.resolve(\"convert::TryFrom\"),\n                \"TryInto\" to std.resolve(\"convert::TryInto\"),\n                \"FromIterator\" to std.resolve(\"iter::FromIterator\"),\n            )\n        }\n\n        // stdlib types\n        val std = RuntimeType(\"::std\")\n        val stdCmp = std.resolve(\"cmp\")\n        val stdFmt = std.resolve(\"fmt\")\n        val stdConvert = std.resolve(\"convert\")\n        val Arc = std.resolve(\"sync::Arc\")\n        val AsRef = stdConvert.resolve(\"AsRef\")\n        val Box = std.resolve(\"boxed::Box\")\n        val ByteSlab = std.resolve(\"vec::Vec<u8>\")\n        val Clone = std.resolve(\"clone::Clone\")\n        val Cow = std.resolve(\"borrow::Cow\")\n\n        fun lifetimeCow(lifetimeName: String = \"a\") = std.resolve(\"borrow::Cow<'$lifetimeName>\")\n\n        val Debug = stdFmt.resolve(\"Debug\")\n        val Default = std.resolve(\"default::Default\")\n        val Display = stdFmt.resolve(\"Display\")\n        val Duration = std.resolve(\"time::Duration\")\n        val Eq = stdCmp.resolve(\"Eq\")\n        val From = stdConvert.resolve(\"From\")\n        val Hash = std.resolve(\"hash::Hash\")\n        val HashMap = std.resolve(\"collections::HashMap\")\n        val Into = stdConvert.resolve(\"Into\")\n        val Option = std.resolve(\"option::Option\")\n        val Ord = stdCmp.resolve(\"Ord\")\n        val PartialEq = stdCmp.resolve(\"PartialEq\")\n        val PartialOrd = stdCmp.resolve(\"PartialOrd\")\n        val Phantom = std.resolve(\"marker::PhantomData\")\n        val Send = std.resolve(\"marker::Send\")\n        val StdError = std.resolve(\"error::Error\")\n        val String = std.resolve(\"string::String\")\n        val Sync = std.resolve(\"marker::Sync\")\n        val TryFrom = stdConvert.resolve(\"TryFrom\")\n        val U64 = std.resolve(\"primitive::u64\")\n        val Vec = std.resolve(\"vec::Vec\")\n\n        fun typedVec(inner: RuntimeType) = std.resolve(\"vec::Vec<${inner.render()}>\")\n\n        fun typedOption(inner: RuntimeType) = std.resolve(\"option::Option<${inner.render()}>\")\n\n        // primitive types\n        val Bool = std.resolve(\"primitive::bool\")\n\n        fun lifetimeStr(lifetimeName: String = \"a\") = RuntimeType(\"&'$lifetimeName str\")\n\n        val StaticStr = RuntimeType(\"&'static str\")\n\n        // Http0x types\n        val Http0x = CargoDependency.Http0x.toType()\n        val HttpBody0x = CargoDependency.HttpBody0x.toType()\n        val HttpRequest0x = Http0x.resolve(\"Request\")\n        val HttpRequestBuilder0x = Http0x.resolve(\"request::Builder\")\n        val HttpResponse0x = Http0x.resolve(\"Response\")\n        val HttpResponseBuilder0x = Http0x.resolve(\"response::Builder\")\n\n        // Http1x types\n        val Http1x = CargoDependency.Http1x.toType()\n        val HttpBody1x = CargoDependency.HttpBody1x.toType()\n        val HttpRequest1x = Http1x.resolve(\"Request\")\n        val HttpRequestBuilder1x = Http1x.resolve(\"request::Builder\")\n        val HttpResponse1x = Http1x.resolve(\"Response\")\n        val HttpResponseBuilder1x = Http1x.resolve(\"response::Builder\")\n\n        /**\n         * Returns the appropriate http crate based on HTTP version.\n         *\n         * For HTTP 1.x: returns http@1.x crate\n         * For HTTP 0.x: returns http@0.2.x crate\n         */\n        fun http(runtimeConfig: RuntimeConfig): RuntimeType =\n            when (runtimeConfig.httpVersion) {\n                HttpVersion.Http1x -> Http1x\n                HttpVersion.Http0x -> Http0x\n            }\n\n        /**\n         * Returns the appropriate http::request::Builder based on HTTP version.\n         *\n         * For HTTP 1.x: returns http@1.x request::Builder\n         * For HTTP 0.x: returns http@0.2.x request::Builder\n         */\n        fun httpRequestBuilder(runtimeConfig: RuntimeConfig): RuntimeType =\n            http(runtimeConfig).resolve(\"request::Builder\")\n\n        /**\n         * Returns the appropriate http::response::Builder based on HTTP version.\n         *\n         * For HTTP 1.x: returns http@1.x response::Builder\n         * For HTTP 0.x: returns http@0.2.x response::Builder\n         */\n        fun httpResponseBuilder(runtimeConfig: RuntimeConfig): RuntimeType =\n            http(runtimeConfig).resolve(\"response::Builder\")\n\n        /**\n         * Returns the appropriate http-body crate module based on HTTP version.\n         *\n         * For HTTP 1.x: returns http-body@1.x crate\n         * For HTTP 0.x: returns http-body@0.4.x crate\n         */\n        fun httpBody(runtimeConfig: RuntimeConfig): RuntimeType =\n            when (runtimeConfig.httpVersion) {\n                HttpVersion.Http1x -> HttpBody1x\n                HttpVersion.Http0x -> HttpBody0x\n            }\n\n        fun hyper(runtimeConfig: RuntimeConfig) = CargoDependency.hyper(runtimeConfig).toType()\n\n        // external cargo dependency types\n        val Bytes = CargoDependency.Bytes.toType().resolve(\"Bytes\")\n        val FastRand = CargoDependency.FastRand.toType()\n        val Hyper0x = CargoDependency.Hyper0x.toType()\n        val LazyStatic = CargoDependency.LazyStatic.toType()\n        val PercentEncoding = CargoDependency.PercentEncoding.toType()\n        val PrettyAssertions = CargoDependency.PrettyAssertions.toType()\n        val Regex = CargoDependency.Regex.toType()\n        val Serde = CargoDependency.Serde.toType()\n        val SerdeDeserialize = Serde.resolve(\"Deserialize\")\n        val SerdeSerialize = Serde.resolve(\"Serialize\")\n        val Tokio = CargoDependency.Tokio.toType()\n        val TokioStream = CargoDependency.TokioStream.toType()\n        val Tower = CargoDependency.Tower.toType()\n        val Tracing = CargoDependency.Tracing.toType()\n        val TracingTest = CargoDependency.TracingTest.toType()\n        val TracingSubscriber = CargoDependency.TracingSubscriber.toType()\n\n        // codegen types\n        val ConstrainedTrait =\n            RuntimeType(\"crate::constrained::Constrained\", InlineDependency.constrained())\n        val MaybeConstrained =\n            RuntimeType(\"crate::constrained::MaybeConstrained\", InlineDependency.constrained())\n\n        // smithy runtime types\n        fun smithyAsync(runtimeConfig: RuntimeConfig) = CargoDependency.smithyAsync(runtimeConfig).toType()\n\n        fun smithyCbor(runtimeConfig: RuntimeConfig) = CargoDependency.smithyCbor(runtimeConfig).toType()\n\n        fun smithyChecksums(runtimeConfig: RuntimeConfig) = CargoDependency.smithyChecksums(runtimeConfig).toType()\n\n        fun smithyEventStream(runtimeConfig: RuntimeConfig) = CargoDependency.smithyEventStream(runtimeConfig).toType()\n\n        fun smithyHttp(runtimeConfig: RuntimeConfig) = CargoDependency.smithyHttp(runtimeConfig).toType()\n\n        fun smithyHttpClientTestUtil(runtimeConfig: RuntimeConfig) =\n            CargoDependency.smithyHttpClientTestUtil(runtimeConfig).toType()\n\n        fun smithyJson(runtimeConfig: RuntimeConfig) = CargoDependency.smithyJson(runtimeConfig).toType()\n\n        fun smithyQuery(runtimeConfig: RuntimeConfig) = CargoDependency.smithyQuery(runtimeConfig).toType()\n\n        fun smithyRuntime(runtimeConfig: RuntimeConfig) = CargoDependency.smithyRuntime(runtimeConfig).toType()\n\n        fun smithyRuntimeApi(runtimeConfig: RuntimeConfig) = CargoDependency.smithyRuntimeApi(runtimeConfig).toType()\n\n        /**\n         * Returns smithy-runtime-api with the appropriate HTTP version feature enabled.\n         *\n         * This is needed when accessing HTTP types from smithy-runtime-api like http::Request.\n         * For HTTP 1.x: adds \"http-1x\" feature\n         * For HTTP 0.x: adds \"http-02x\" feature\n         *\n         * Use this instead of smithyRuntimeApi() when you need HTTP type re-exports.\n         */\n        fun smithyRuntimeApiWithHttpFeature(runtimeConfig: RuntimeConfig): RuntimeType =\n            when (runtimeConfig.httpVersion) {\n                HttpVersion.Http1x -> CargoDependency.smithyRuntimeApi(runtimeConfig).withFeature(\"http-1x\").toType()\n                HttpVersion.Http0x -> CargoDependency.smithyRuntimeApi(runtimeConfig).withFeature(\"http-02x\").toType()\n            }\n\n        fun smithyRuntimeApiClient(runtimeConfig: RuntimeConfig) =\n            CargoDependency.smithyRuntimeApiClient(runtimeConfig).toType()\n\n        fun smithyTypes(runtimeConfig: RuntimeConfig) = CargoDependency.smithyTypes(runtimeConfig).toType()\n\n        fun smithyXml(runtimeConfig: RuntimeConfig) = CargoDependency.smithyXml(runtimeConfig).toType()\n\n        private fun smithyProtocolTest(runtimeConfig: RuntimeConfig) =\n            CargoDependency.smithyProtocolTestHelpers(runtimeConfig).toType()\n\n        // smithy runtime type members\n        fun base64Decode(runtimeConfig: RuntimeConfig): RuntimeType =\n            smithyTypes(runtimeConfig).resolve(\"base64::decode\")\n\n        fun base64Encode(runtimeConfig: RuntimeConfig): RuntimeType =\n            smithyTypes(runtimeConfig).resolve(\"base64::encode\")\n\n        fun configBag(runtimeConfig: RuntimeConfig): RuntimeType =\n            smithyTypes(runtimeConfig).resolve(\"config_bag::ConfigBag\")\n\n        fun runtimeComponents(runtimeConfig: RuntimeConfig) =\n            smithyRuntimeApiClient(runtimeConfig)\n                .resolve(\"client::runtime_components::RuntimeComponents\")\n\n        fun runtimeComponentsBuilder(runtimeConfig: RuntimeConfig) =\n            smithyRuntimeApiClient(runtimeConfig)\n                .resolve(\"client::runtime_components::RuntimeComponentsBuilder\")\n\n        fun runtimePlugins(runtimeConfig: RuntimeConfig): RuntimeType =\n            smithyRuntimeApiClient(runtimeConfig)\n                .resolve(\"client::runtime_plugin::RuntimePlugins\")\n\n        fun runtimePlugin(runtimeConfig: RuntimeConfig) =\n            smithyRuntimeApiClient(runtimeConfig)\n                .resolve(\"client::runtime_plugin::RuntimePlugin\")\n\n        fun sharedRuntimePlugin(runtimeConfig: RuntimeConfig) =\n            smithyRuntimeApiClient(runtimeConfig)\n                .resolve(\"client::runtime_plugin::SharedRuntimePlugin\")\n\n        fun boxError(runtimeConfig: RuntimeConfig): RuntimeType =\n            smithyRuntimeApi(runtimeConfig).resolve(\"box_error::BoxError\")\n\n        fun sdkError(runtimeConfig: RuntimeConfig): RuntimeType =\n            smithyRuntimeApiClient(runtimeConfig).resolve(\"client::result::SdkError\")\n\n        fun intercept(runtimeConfig: RuntimeConfig): RuntimeType =\n            smithyRuntimeApiClient(runtimeConfig).resolve(\"client::interceptors::Intercept\")\n\n        fun dynDispatchHint(runtimeConfig: RuntimeConfig): RuntimeType =\n            smithyRuntimeApiClient(runtimeConfig).resolve(\"client::interceptors::dyn_dispatch_hint\")\n\n        fun interceptorContext(runtimeConfig: RuntimeConfig): RuntimeType =\n            smithyRuntimeApiClient(runtimeConfig)\n                .resolve(\"client::interceptors::context::InterceptorContext\")\n\n        fun sharedInterceptor(runtimeConfig: RuntimeConfig): RuntimeType =\n            smithyRuntimeApiClient(runtimeConfig)\n                .resolve(\"client::interceptors::SharedInterceptor\")\n\n        fun afterDeserializationInterceptorContextRef(runtimeConfig: RuntimeConfig): RuntimeType =\n            smithyRuntimeApiClient(runtimeConfig).resolve(\"client::interceptors::context::AfterDeserializationInterceptorContextRef\")\n\n        fun beforeSerializationInterceptorContextRef(runtimeConfig: RuntimeConfig): RuntimeType =\n            smithyRuntimeApiClient(runtimeConfig).resolve(\"client::interceptors::context::BeforeSerializationInterceptorContextRef\")\n\n        fun beforeSerializationInterceptorContextMut(runtimeConfig: RuntimeConfig): RuntimeType =\n            smithyRuntimeApiClient(runtimeConfig).resolve(\"client::interceptors::context::BeforeSerializationInterceptorContextMut\")\n\n        fun beforeDeserializationInterceptorContextRef(runtimeConfig: RuntimeConfig): RuntimeType =\n            smithyRuntimeApiClient(runtimeConfig).resolve(\"client::interceptors::context::BeforeDeserializationInterceptorContextRef\")\n\n        fun beforeDeserializationInterceptorContextMut(runtimeConfig: RuntimeConfig): RuntimeType =\n            smithyRuntimeApiClient(runtimeConfig).resolve(\"client::interceptors::context::BeforeDeserializationInterceptorContextMut\")\n\n        fun beforeTransmitInterceptorContextRef(runtimeConfig: RuntimeConfig): RuntimeType =\n            smithyRuntimeApiClient(runtimeConfig).resolve(\"client::interceptors::context::BeforeTransmitInterceptorContextRef\")\n\n        fun beforeTransmitInterceptorContextMut(runtimeConfig: RuntimeConfig): RuntimeType =\n            smithyRuntimeApiClient(runtimeConfig).resolve(\"client::interceptors::context::BeforeTransmitInterceptorContextMut\")\n\n        fun finalizerInterceptorContextRef(runtimeConfig: RuntimeConfig): RuntimeType =\n            smithyRuntimeApiClient(runtimeConfig)\n                .resolve(\"client::interceptors::context::FinalizerInterceptorContextRef\")\n\n        fun finalizerInterceptorContextMut(runtimeConfig: RuntimeConfig): RuntimeType =\n            smithyRuntimeApiClient(runtimeConfig)\n                .resolve(\"client::interceptors::context::FinalizerInterceptorContextMut\")\n\n        fun headers(runtimeConfig: RuntimeConfig): RuntimeType =\n            smithyRuntimeApi(runtimeConfig).resolve(\"http::Headers\")\n\n        fun blob(runtimeConfig: RuntimeConfig) = smithyTypes(runtimeConfig).resolve(\"Blob\")\n\n        fun byteStream(runtimeConfig: RuntimeConfig) = smithyTypes(runtimeConfig).resolve(\"byte_stream::ByteStream\")\n\n        fun dateTime(runtimeConfig: RuntimeConfig) = smithyTypes(runtimeConfig).resolve(\"DateTime\")\n\n        fun bigInteger(runtimeConfig: RuntimeConfig) = smithyTypes(runtimeConfig).resolve(\"BigInteger\")\n\n        fun bigDecimal(runtimeConfig: RuntimeConfig) = smithyTypes(runtimeConfig).resolve(\"BigDecimal\")\n\n        fun document(runtimeConfig: RuntimeConfig): RuntimeType = smithyTypes(runtimeConfig).resolve(\"Document\")\n\n        fun format(runtimeConfig: RuntimeConfig) = smithyTypes(runtimeConfig).resolve(\"date_time::Format\")\n\n        fun retryErrorKind(runtimeConfig: RuntimeConfig) = smithyTypes(runtimeConfig).resolve(\"retry::ErrorKind\")\n\n        fun eventStreamReceiver(runtimeConfig: RuntimeConfig): RuntimeType =\n            smithyHttp(runtimeConfig).resolve(\"event_stream::Receiver\")\n\n        fun eventReceiver(runtimeConfig: RuntimeConfig) =\n            forInlineDependency(InlineDependency.eventReceiver(runtimeConfig))\n                .resolve(\"EventReceiver\")\n\n        fun eventStreamSender(runtimeConfig: RuntimeConfig): RuntimeType =\n            smithyHttp(runtimeConfig).resolve(\"event_stream::EventStreamSender\")\n\n        fun futuresStreamCompatByteStream(runtimeConfig: RuntimeConfig): RuntimeType =\n            smithyHttp(runtimeConfig)\n                .resolve(\"futures_stream_adapter::FuturesStreamCompatByteStream\")\n\n        fun errorMetadata(runtimeConfig: RuntimeConfig) = smithyTypes(runtimeConfig).resolve(\"error::ErrorMetadata\")\n\n        fun errorMetadataBuilder(runtimeConfig: RuntimeConfig) =\n            smithyTypes(runtimeConfig).resolve(\"error::metadata::Builder\")\n\n        fun provideErrorMetadataTrait(runtimeConfig: RuntimeConfig) =\n            smithyTypes(runtimeConfig).resolve(\"error::metadata::ProvideErrorMetadata\")\n\n        fun jsonErrors(runtimeConfig: RuntimeConfig) = forInlineDependency(InlineDependency.jsonErrors(runtimeConfig))\n\n        fun awsQueryCompatibleErrors(runtimeConfig: RuntimeConfig) =\n            forInlineDependency(InlineDependency.awsQueryCompatibleErrors(runtimeConfig))\n\n        fun labelFormat(\n            runtimeConfig: RuntimeConfig,\n            func: String,\n        ) = smithyHttp(runtimeConfig).resolve(\"label::$func\")\n\n        fun operation(runtimeConfig: RuntimeConfig) = smithyHttp(runtimeConfig).resolve(\"operation::Operation\")\n\n        fun protocolTest(\n            runtimeConfig: RuntimeConfig,\n            func: String,\n        ): RuntimeType = smithyProtocolTest(runtimeConfig).resolve(func)\n\n        fun provideErrorKind(runtimeConfig: RuntimeConfig) =\n            smithyTypes(runtimeConfig).resolve(\"retry::ProvideErrorKind\")\n\n        fun queryFormat(\n            runtimeConfig: RuntimeConfig,\n            func: String,\n        ) = smithyHttp(runtimeConfig).resolve(\"query::$func\")\n\n        fun sdkBody(runtimeConfig: RuntimeConfig): RuntimeType = smithyTypes(runtimeConfig).resolve(\"body::SdkBody\")\n\n        fun parseTimestampFormat(\n            codegenTarget: CodegenTarget,\n            runtimeConfig: RuntimeConfig,\n            format: TimestampFormatTrait.Format,\n        ): RuntimeType {\n            val timestampFormat =\n                when (format) {\n                    TimestampFormatTrait.Format.EPOCH_SECONDS -> \"EpochSeconds\"\n                    // clients allow offsets, servers do nt\n                    TimestampFormatTrait.Format.DATE_TIME ->\n                        codegenTarget.ifClient { \"DateTimeWithOffset\" } ?: \"DateTime\"\n\n                    TimestampFormatTrait.Format.HTTP_DATE -> \"HttpDate\"\n                    TimestampFormatTrait.Format.UNKNOWN -> TODO()\n                }\n\n            return smithyTypes(runtimeConfig).resolve(\"date_time::Format::$timestampFormat\")\n        }\n\n        fun serializeTimestampFormat(\n            runtimeConfig: RuntimeConfig,\n            format: TimestampFormatTrait.Format,\n        ): RuntimeType {\n            val timestampFormat =\n                when (format) {\n                    TimestampFormatTrait.Format.EPOCH_SECONDS -> \"EpochSeconds\"\n                    // clients allow offsets, servers do not\n                    TimestampFormatTrait.Format.DATE_TIME -> \"DateTime\"\n                    TimestampFormatTrait.Format.HTTP_DATE -> \"HttpDate\"\n                    TimestampFormatTrait.Format.UNKNOWN -> TODO()\n                }\n\n            return smithyTypes(runtimeConfig).resolve(\"date_time::Format::$timestampFormat\")\n        }\n\n        fun captureRequest(runtimeConfig: RuntimeConfig) =\n            CargoDependency.smithyHttpClientTestUtil(runtimeConfig)\n                .toType()\n                .resolve(\"test_util::capture_request\")\n\n        fun forInlineDependency(inlineDependency: InlineDependency) =\n            RuntimeType(\"crate::${inlineDependency.name}\", inlineDependency)\n\n        fun forInlineFun(\n            name: String,\n            module: RustModule,\n            func: Writable,\n        ) = RuntimeType(\n            \"${module.fullyQualifiedPath()}::$name\",\n            dependency = InlineDependency(name, module, listOf(), func),\n        )\n\n        // inlinable types\n        fun cborErrors(runtimeConfig: RuntimeConfig) = forInlineDependency(InlineDependency.cborErrors(runtimeConfig))\n\n        fun ec2QueryErrors(runtimeConfig: RuntimeConfig) =\n            forInlineDependency(InlineDependency.ec2QueryErrors(runtimeConfig))\n\n        fun wrappedXmlErrors(runtimeConfig: RuntimeConfig) =\n            forInlineDependency(InlineDependency.wrappedXmlErrors(runtimeConfig))\n\n        fun unwrappedXmlErrors(runtimeConfig: RuntimeConfig) =\n            forInlineDependency(InlineDependency.unwrappedXmlErrors(runtimeConfig))\n\n        fun idempotencyToken(runtimeConfig: RuntimeConfig) =\n            forInlineDependency(InlineDependency.idempotencyToken(runtimeConfig))\n\n        fun clientRequestCompression(runtimeConfig: RuntimeConfig) =\n            forInlineDependency(InlineDependency.clientRequestCompression(runtimeConfig))\n    }\n}\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RustSymbolProvider.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy\n\nimport software.amazon.smithy.codegen.core.Symbol\nimport software.amazon.smithy.codegen.core.SymbolProvider\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.knowledge.NullableIndex\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.ServiceShape\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.shapes.UnionShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustModule\n\n/**\n * SymbolProvider interface that carries additional configuration and module/symbol resolution.\n */\ninterface RustSymbolProvider : SymbolProvider {\n    val model: Model\n    val moduleProviderContext: ModuleProviderContext\n    val config: RustSymbolProviderConfig\n\n    fun moduleForShape(shape: Shape): RustModule.LeafModule =\n        config.moduleProvider.moduleForShape(moduleProviderContext, shape)\n\n    fun moduleForOperationError(operation: OperationShape): RustModule.LeafModule =\n        config.moduleProvider.moduleForOperationError(moduleProviderContext, operation)\n\n    fun moduleForEventStreamError(eventStream: UnionShape): RustModule.LeafModule =\n        config.moduleProvider.moduleForEventStreamError(moduleProviderContext, eventStream)\n\n    fun moduleForBuilder(shape: Shape): RustModule.LeafModule =\n        config.moduleProvider.moduleForBuilder(moduleProviderContext, shape, toSymbol(shape))\n\n    /** Returns the symbol for an operation error */\n    fun symbolForOperationError(operation: OperationShape): Symbol\n\n    /** Returns the symbol for an event stream error */\n    fun symbolForEventStreamError(eventStream: UnionShape): Symbol\n\n    /** Returns the symbol for a builder */\n    fun symbolForBuilder(shape: Shape): Symbol\n}\n\n/**\n * Module providers can't use the full CodegenContext since they're invoked from\n * inside the SymbolVisitor, which is created before CodegenContext is created.\n */\ndata class ModuleProviderContext(\n    val settings: CoreRustSettings,\n    val model: Model,\n    val serviceShape: ServiceShape?,\n)\n\nfun CodegenContext.toModuleProviderContext(): ModuleProviderContext =\n    ModuleProviderContext(settings, model, serviceShape)\n\n/**\n * Provider for RustModules so that the symbol provider knows where to organize things.\n */\ninterface ModuleProvider {\n    /** Returns the module for a shape */\n    fun moduleForShape(\n        context: ModuleProviderContext,\n        shape: Shape,\n    ): RustModule.LeafModule\n\n    /** Returns the module for an operation error */\n    fun moduleForOperationError(\n        context: ModuleProviderContext,\n        operation: OperationShape,\n    ): RustModule.LeafModule\n\n    /** Returns the module for an event stream error */\n    fun moduleForEventStreamError(\n        context: ModuleProviderContext,\n        eventStream: UnionShape,\n    ): RustModule.LeafModule\n\n    /** Returns the module for a builder */\n    fun moduleForBuilder(\n        context: ModuleProviderContext,\n        shape: Shape,\n        symbol: Symbol,\n    ): RustModule.LeafModule\n}\n\n/**\n * Configuration for symbol providers.\n */\ndata class RustSymbolProviderConfig(\n    val runtimeConfig: RuntimeConfig,\n    val renameExceptions: Boolean,\n    val nullabilityCheckMode: NullableIndex.CheckMode,\n    val moduleProvider: ModuleProvider,\n    val nameBuilderFor: (Symbol) -> String = { _ -> \"Builder\" },\n)\n\n/**\n * Default delegator to enable easily decorating another symbol provider.\n */\nopen class WrappingSymbolProvider(private val base: RustSymbolProvider) : RustSymbolProvider {\n    override val model: Model get() = base.model\n    override val moduleProviderContext: ModuleProviderContext get() = base.moduleProviderContext\n    override val config: RustSymbolProviderConfig get() = base.config\n\n    override fun toSymbol(shape: Shape): Symbol = base.toSymbol(shape)\n\n    override fun toMemberName(shape: MemberShape): String = base.toMemberName(shape)\n\n    override fun symbolForOperationError(operation: OperationShape): Symbol = base.symbolForOperationError(operation)\n\n    override fun symbolForEventStreamError(eventStream: UnionShape): Symbol =\n        base.symbolForEventStreamError(eventStream)\n\n    override fun symbolForBuilder(shape: Shape): Symbol = base.symbolForBuilder(shape)\n}\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/StreamingTraitSymbolProvider.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy\n\nimport software.amazon.smithy.codegen.core.Symbol\nimport software.amazon.smithy.model.shapes.BlobShape\nimport software.amazon.smithy.model.shapes.ListShape\nimport software.amazon.smithy.model.shapes.MapShape\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.NumberShape\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.shapes.StringShape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.shapes.UnionShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustMetadata\nimport software.amazon.smithy.rust.codegen.core.smithy.traits.SyntheticInputTrait\nimport software.amazon.smithy.rust.codegen.core.smithy.traits.SyntheticOutputTrait\nimport software.amazon.smithy.rust.codegen.core.util.hasStreamingMember\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\nimport software.amazon.smithy.rust.codegen.core.util.isStreaming\n\n/**\n * Wrapping symbol provider to change `Blob` to `ByteStream` when it targets a streaming member\n */\nclass StreamingShapeSymbolProvider(private val base: RustSymbolProvider) : WrappingSymbolProvider(base) {\n    override fun toSymbol(shape: Shape): Symbol {\n        val initial = base.toSymbol(shape)\n        // We are only targeting member shapes\n        if (shape !is MemberShape) {\n            return initial\n        }\n        val target = model.expectShape(shape.target)\n        val container = model.expectShape(shape.container)\n\n        // We are only targeting output shapes\n        if (!(container.hasTrait<SyntheticOutputTrait>() || container.hasTrait<SyntheticInputTrait>())) {\n            return initial\n        }\n\n        // We are only targeting streaming blobs\n        return if (target is BlobShape && shape.isStreaming(model)) {\n            RuntimeType.byteStream(config.runtimeConfig).toSymbol().toBuilder().setDefault(Default.RustDefault).build()\n        } else {\n            base.toSymbol(shape)\n        }\n    }\n}\n\n/**\n * SymbolProvider to drop the `Clone` and `PartialEq` bounds in streaming shapes.\n *\n * Streaming shapes cannot be cloned and equality cannot be checked without reading the body. Because of this, these shapes\n * do not implement `Clone` or `PartialEq`.\n *\n * Note that since streaming members can only be used on the root shape, this can only impact input and output shapes.\n */\nclass StreamingShapeMetadataProvider(private val base: RustSymbolProvider) : SymbolMetadataProvider(base) {\n    override fun structureMeta(structureShape: StructureShape): RustMetadata {\n        val baseMetadata = base.toSymbol(structureShape).expectRustMetadata()\n        return if (structureShape.hasStreamingMember(model)) {\n            baseMetadata.withoutDerives(RuntimeType.Clone, RuntimeType.PartialEq)\n        } else {\n            baseMetadata\n        }\n    }\n\n    override fun unionMeta(unionShape: UnionShape): RustMetadata {\n        val baseMetadata = base.toSymbol(unionShape).expectRustMetadata()\n        return if (unionShape.hasStreamingMember(model)) {\n            baseMetadata.withoutDerives(RuntimeType.Clone, RuntimeType.PartialEq)\n        } else {\n            baseMetadata\n        }\n    }\n\n    override fun memberMeta(memberShape: MemberShape) = base.toSymbol(memberShape).expectRustMetadata()\n\n    override fun enumMeta(stringShape: StringShape) = base.toSymbol(stringShape).expectRustMetadata()\n\n    override fun listMeta(listShape: ListShape) = base.toSymbol(listShape).expectRustMetadata()\n\n    override fun mapMeta(mapShape: MapShape) = base.toSymbol(mapShape).expectRustMetadata()\n\n    override fun stringMeta(stringShape: StringShape) = base.toSymbol(stringShape).expectRustMetadata()\n\n    override fun numberMeta(numberShape: NumberShape) = base.toSymbol(numberShape).expectRustMetadata()\n\n    override fun blobMeta(blobShape: BlobShape) = base.toSymbol(blobShape).expectRustMetadata()\n}\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/SymbolExt.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy\n\nimport software.amazon.smithy.codegen.core.Symbol\nimport software.amazon.smithy.model.node.Node\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustModule\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustType\nimport software.amazon.smithy.rust.codegen.core.rustlang.stripOuter\nimport software.amazon.smithy.rust.codegen.core.util.orNull\n\n/** Set the symbolLocation for this symbol builder */\nfun Symbol.Builder.locatedIn(rustModule: RustModule.LeafModule): Symbol.Builder {\n    val currentRustType = this.build().rustType()\n    check(currentRustType is RustType.Opaque) {\n        \"Only `RustType.Opaque` can have its namespace updated. Received $currentRustType.\"\n    }\n    val newRustType = currentRustType.copy(namespace = rustModule.fullyQualifiedPath())\n    return this.definitionFile(rustModule.definitionFile())\n        .namespace(rustModule.fullyQualifiedPath(), \"::\")\n        .rustType(newRustType)\n        .module(rustModule)\n}\n\n/**\n * Make the Rust type of a symbol optional (hold `Option<T>`)\n *\n * This is idempotent and will have no change if the type is already optional.\n */\nfun Symbol.makeOptional(): Symbol =\n    if (isOptional()) {\n        this\n    } else {\n        val rustType = RustType.Option(this.rustType())\n        Symbol.builder()\n            .rustType(rustType)\n            .addReference(this)\n            .name(rustType.name)\n            .build()\n    }\n\n/**\n * Make the Rust type of a symbol boxed (hold `Box<T>`).\n *\n * This is idempotent and will have no change if the type is already boxed.\n */\nfun Symbol.makeRustBoxed(): Symbol =\n    if (isRustBoxed()) {\n        this\n    } else {\n        val rustType = RustType.Box(this.rustType())\n        Symbol.builder()\n            .rustType(rustType)\n            .addReference(this)\n            .name(rustType.name)\n            .build()\n    }\n\n/**\n * Make the Rust type of a symbol wrapped in `MaybeConstrained`. (hold `MaybeConstrained<T>`).\n *\n * This is idempotent and will have no change if the type is already `MaybeConstrained<T>`.\n */\nfun Symbol.makeMaybeConstrained(): Symbol =\n    if (this.rustType() is RustType.MaybeConstrained) {\n        this\n    } else {\n        val rustType = RustType.MaybeConstrained(this.rustType())\n        Symbol.builder()\n            .rustType(rustType)\n            .addReference(this)\n            .name(rustType.name)\n            .build()\n    }\n\n/**\n * Map the [RustType] of a symbol with [f].\n *\n * WARNING: This function does not update any symbol references (e.g., `symbol.addReference()`) on the\n * returned symbol. You will have to add those yourself if your logic relies on them.\n **/\nfun Symbol.mapRustType(\n    vararg dependencies: RuntimeType,\n    f: (RustType) -> RustType,\n): Symbol {\n    val newType = f(this.rustType())\n    val builder = this.toBuilder()\n    dependencies.forEach { builder.addReference(it.toSymbol()) }\n    return builder.rustType(newType)\n        .name(newType.name)\n        .build()\n}\n\n/**\n * Type representing the default value for a given type (e.g. for Strings, this is `\"\"`).\n */\nsealed class Default {\n    /**\n     * This symbol has no default value. If the symbol is not optional, this will error during builder construction\n     */\n    object NoDefault : Default()\n\n    /**\n     * This symbol should use the Rust `std::default::Default` when unset\n     */\n    object RustDefault : Default()\n\n    /**\n     * This symbol has a custom default value different from `Default::default`\n     */\n    data class NonZeroDefault(val value: Node) : Default()\n}\n\n/**\n * Returns true when it's valid to use the default/0 value for [this] symbol during construction.\n */\nfun Symbol.canUseDefault(): Boolean = this.defaultValue() != Default.NoDefault\n\n/**\n * True when [this] is will be represented by Option<T> in Rust\n */\nfun Symbol.isOptional(): Boolean =\n    when (this.rustType()) {\n        is RustType.Option -> true\n        else -> false\n    }\n\nfun Symbol.isRustBoxed(): Boolean = rustType().stripOuter<RustType.Option>() is RustType.Box\n\nprivate const val RUST_TYPE_KEY = \"rusttype\"\nprivate const val SHAPE_KEY = \"shape\"\nprivate const val RUST_MODULE_KEY = \"rustmodule\"\nprivate const val RENAMED_FROM_KEY = \"renamedfrom\"\nprivate const val SYMBOL_DEFAULT = \"symboldefault\"\n\n// Symbols should _always_ be created with a Rust type & shape attached\nfun Symbol.rustType(): RustType = this.expectProperty(RUST_TYPE_KEY, RustType::class.java)\n\nfun Symbol.Builder.rustType(rustType: RustType): Symbol.Builder = this.putProperty(RUST_TYPE_KEY, rustType)\n\nfun Symbol.shape(): Shape = this.expectProperty(SHAPE_KEY, Shape::class.java)\n\nfun Symbol.Builder.shape(shape: Shape?): Symbol.Builder = this.putProperty(SHAPE_KEY, shape)\n\nfun Symbol.module(): RustModule.LeafModule = this.expectProperty(RUST_MODULE_KEY, RustModule.LeafModule::class.java)\n\nfun Symbol.Builder.module(module: RustModule.LeafModule): Symbol.Builder = this.putProperty(RUST_MODULE_KEY, module)\n\nfun Symbol.renamedFrom(): String? = this.getProperty(RENAMED_FROM_KEY, String::class.java).orNull()\n\nfun Symbol.Builder.renamedFrom(name: String): Symbol.Builder = this.putProperty(RENAMED_FROM_KEY, name)\n\nfun Symbol.defaultValue(): Default = this.getProperty(SYMBOL_DEFAULT, Default::class.java).orElse(Default.NoDefault)\n\nfun Symbol.Builder.setDefault(default: Default): Symbol.Builder = this.putProperty(SYMBOL_DEFAULT, default)\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/SymbolMetadataProvider.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy\n\nimport software.amazon.smithy.codegen.core.CodegenException\nimport software.amazon.smithy.codegen.core.Symbol\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.BlobShape\nimport software.amazon.smithy.model.shapes.CollectionShape\nimport software.amazon.smithy.model.shapes.IntEnumShape\nimport software.amazon.smithy.model.shapes.ListShape\nimport software.amazon.smithy.model.shapes.MapShape\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.NumberShape\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.shapes.StringShape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.shapes.UnionShape\nimport software.amazon.smithy.model.traits.EnumTrait\nimport software.amazon.smithy.model.traits.SensitiveTrait\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustMetadata\nimport software.amazon.smithy.rust.codegen.core.rustlang.Visibility\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\n\n/**\n * Attach `meta` to symbols. `meta` is used by the generators (e.g. StructureGenerator) to configure the generated models.\n *\n * Protocols may inherit from this class and override the `xyzMeta` methods to modify structure generation.\n */\nabstract class SymbolMetadataProvider(private val base: RustSymbolProvider) : WrappingSymbolProvider(base) {\n    override fun toSymbol(shape: Shape): Symbol {\n        val baseSymbol = base.toSymbol(shape)\n        val meta =\n            when (shape) {\n                is MemberShape -> memberMeta(shape)\n                is StructureShape -> structureMeta(shape)\n                is UnionShape -> unionMeta(shape)\n                is ListShape -> listMeta(shape)\n                is MapShape -> mapMeta(shape)\n                is NumberShape -> numberMeta(shape)\n                is BlobShape -> blobMeta(shape)\n                is StringShape ->\n                    if (shape.hasTrait<EnumTrait>()) {\n                        enumMeta(shape)\n                    } else {\n                        stringMeta(shape)\n                    }\n\n                else -> null\n            }\n        return baseSymbol.toBuilder().meta(meta).build()\n    }\n\n    abstract fun memberMeta(memberShape: MemberShape): RustMetadata\n\n    abstract fun structureMeta(structureShape: StructureShape): RustMetadata\n\n    abstract fun unionMeta(unionShape: UnionShape): RustMetadata\n\n    abstract fun enumMeta(stringShape: StringShape): RustMetadata\n\n    abstract fun listMeta(listShape: ListShape): RustMetadata\n\n    abstract fun mapMeta(mapShape: MapShape): RustMetadata\n\n    abstract fun stringMeta(stringShape: StringShape): RustMetadata\n\n    abstract fun numberMeta(numberShape: NumberShape): RustMetadata\n\n    abstract fun blobMeta(blobShape: BlobShape): RustMetadata\n}\n\nfun containerDefaultMetadata(\n    shape: Shape,\n    model: Model,\n    additionalAttributes: List<Attribute> = emptyList(),\n): RustMetadata {\n    val derives = mutableSetOf(RuntimeType.Debug, RuntimeType.PartialEq, RuntimeType.Clone)\n\n    val isSensitive =\n        shape.hasTrait<SensitiveTrait>() ||\n            // Checking the shape's direct members for the sensitive trait should suffice.\n            // Whether their descendants, i.e. a member's member, is sensitive does not\n            // affect the inclusion/exclusion of the derived `Debug` trait of _this_ container\n            // shape; any sensitive descendant should still be printed as redacted.\n            shape.members().any { it.getMemberTrait(model, SensitiveTrait::class.java).isPresent }\n\n    if (isSensitive) {\n        derives.remove(RuntimeType.Debug)\n    }\n\n    return RustMetadata(derives, additionalAttributes, Visibility.PUBLIC)\n}\n\n/**\n * The base metadata supports a set of attributes that are used by generators to decorate code.\n *\n * By default, we apply `#[non_exhaustive]` in [additionalAttributes] only to client structures since breaking model\n * changes are fine when generating server code.\n */\nclass BaseSymbolMetadataProvider(\n    base: RustSymbolProvider,\n    private val additionalAttributes: List<Attribute>,\n) : SymbolMetadataProvider(base) {\n    override fun memberMeta(memberShape: MemberShape): RustMetadata =\n        when (val container = model.expectShape(memberShape.container)) {\n            is StructureShape -> RustMetadata(visibility = Visibility.PUBLIC)\n\n            is UnionShape, is CollectionShape, is MapShape -> RustMetadata(visibility = Visibility.PUBLIC)\n\n            // This covers strings with the enum trait for now, and can be removed once we're fully on EnumShape\n            // TODO(https://github.com/smithy-lang/smithy-rs/issues/1700): Remove this `is StringShape` match arm\n            is StringShape -> RustMetadata(visibility = Visibility.PUBLIC)\n            is IntEnumShape -> RustMetadata(visibility = Visibility.PUBLIC)\n\n            else -> TODO(\"Unrecognized container type: $container\")\n        }\n\n    override fun structureMeta(structureShape: StructureShape) =\n        containerDefaultMetadata(structureShape, model, additionalAttributes)\n\n    override fun unionMeta(unionShape: UnionShape) = containerDefaultMetadata(unionShape, model, additionalAttributes)\n\n    override fun enumMeta(stringShape: StringShape): RustMetadata =\n        containerDefaultMetadata(stringShape, model, additionalAttributes).withDerives(\n            // Smithy's `enum` shapes can additionally be `Eq`, `PartialOrd`, `Ord`, and `Hash` because they can\n            // only contain strings.\n            RuntimeType.Eq,\n            RuntimeType.PartialOrd,\n            RuntimeType.Ord,\n            RuntimeType.Hash,\n        )\n\n    // Only the server subproject uses these, so we provide a sane and conservative default implementation here so that\n    // the rest of symbol metadata providers can just delegate to it.\n    private fun defaultRustMetadata() = RustMetadata(visibility = Visibility.PRIVATE)\n\n    override fun listMeta(listShape: ListShape) = defaultRustMetadata()\n\n    override fun mapMeta(mapShape: MapShape) = defaultRustMetadata()\n\n    override fun stringMeta(stringShape: StringShape) = defaultRustMetadata()\n\n    override fun numberMeta(numberShape: NumberShape) = defaultRustMetadata()\n\n    override fun blobMeta(blobShape: BlobShape) = defaultRustMetadata()\n}\n\nprivate const val META_KEY = \"meta\"\n\nfun Symbol.Builder.meta(rustMetadata: RustMetadata?): Symbol.Builder = this.putProperty(META_KEY, rustMetadata)\n\nfun Symbol.expectRustMetadata(): RustMetadata =\n    this.getProperty(META_KEY, RustMetadata::class.java).orElseThrow {\n        CodegenException(\n            \"Expected `$this` to have metadata attached but it did not.\",\n        )\n    }\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/SymbolVisitor.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy\n\nimport software.amazon.smithy.codegen.core.Symbol\nimport software.amazon.smithy.codegen.core.SymbolProvider\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.knowledge.NullableIndex\nimport software.amazon.smithy.model.knowledge.NullableIndex.CheckMode\nimport software.amazon.smithy.model.node.Node\nimport software.amazon.smithy.model.shapes.BigDecimalShape\nimport software.amazon.smithy.model.shapes.BigIntegerShape\nimport software.amazon.smithy.model.shapes.BlobShape\nimport software.amazon.smithy.model.shapes.BooleanShape\nimport software.amazon.smithy.model.shapes.ByteShape\nimport software.amazon.smithy.model.shapes.DocumentShape\nimport software.amazon.smithy.model.shapes.DoubleShape\nimport software.amazon.smithy.model.shapes.EnumShape\nimport software.amazon.smithy.model.shapes.FloatShape\nimport software.amazon.smithy.model.shapes.IntEnumShape\nimport software.amazon.smithy.model.shapes.IntegerShape\nimport software.amazon.smithy.model.shapes.ListShape\nimport software.amazon.smithy.model.shapes.LongShape\nimport software.amazon.smithy.model.shapes.MapShape\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.ResourceShape\nimport software.amazon.smithy.model.shapes.ServiceShape\nimport software.amazon.smithy.model.shapes.SetShape\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.shapes.ShapeVisitor\nimport software.amazon.smithy.model.shapes.ShortShape\nimport software.amazon.smithy.model.shapes.SimpleShape\nimport software.amazon.smithy.model.shapes.StringShape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.shapes.TimestampShape\nimport software.amazon.smithy.model.shapes.UnionShape\nimport software.amazon.smithy.model.traits.DefaultTrait\nimport software.amazon.smithy.model.traits.EnumTrait\nimport software.amazon.smithy.model.traits.ErrorTrait\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustModule\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustReservedWords\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustType\nimport software.amazon.smithy.rust.codegen.core.rustlang.Visibility\nimport software.amazon.smithy.rust.codegen.core.smithy.traits.RustBoxTrait\nimport software.amazon.smithy.rust.codegen.core.util.PANIC\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\nimport software.amazon.smithy.rust.codegen.core.util.letIf\nimport software.amazon.smithy.rust.codegen.core.util.orNull\nimport software.amazon.smithy.rust.codegen.core.util.toPascalCase\nimport software.amazon.smithy.rust.codegen.core.util.toSnakeCase\nimport kotlin.reflect.KClass\n\n/** Map from Smithy Shapes to Rust Types */\nval SimpleShapes: Map<KClass<out Shape>, RustType> =\n    mapOf(\n        BooleanShape::class to RustType.Bool,\n        FloatShape::class to RustType.Float(32),\n        DoubleShape::class to RustType.Float(64),\n        ByteShape::class to RustType.Integer(8),\n        ShortShape::class to RustType.Integer(16),\n        IntegerShape::class to RustType.Integer(32),\n        IntEnumShape::class to RustType.Integer(32),\n        LongShape::class to RustType.Integer(64),\n        StringShape::class to RustType.String,\n    )\n\n/**\n * Track both the past and current name of a symbol\n *\n * When a symbol name conflicts with another name, we need to rename it. This tracks both names enabling us to generate helpful\n * docs that cover both cases.\n *\n * Note that this is only used for enum shapes an enum variant does not have its own symbol. For structures, the [Symbol.renamedFrom]\n * field will be set.\n */\ndata class MaybeRenamed(val name: String, val renamedFrom: String?)\n\n/**\n * Make the return [value] optional if the [member] symbol is as well optional.\n */\nfun SymbolProvider.wrapOptional(\n    member: MemberShape,\n    value: String,\n): String =\n    value.letIf(toSymbol(member).isOptional()) {\n        \"Some($value)\"\n    }\n\n/**\n * Make the return [value] optional if the [member] symbol is not optional.\n */\nfun SymbolProvider.toOptional(\n    member: MemberShape,\n    value: String,\n): String =\n    value.letIf(!toSymbol(member).isOptional()) {\n        \"Some($value)\"\n    }\n\n/**\n * Services can rename their contained shapes. See https://smithy.io/2.0/spec/service-types.html\n * specifically, `rename`\n */\nfun Shape.contextName(serviceShape: ServiceShape?): String {\n    return if (serviceShape != null) {\n        id.getName(serviceShape)\n    } else {\n        id.name\n    }\n}\n\n/**\n * Base converter from `Shape` to `Symbol`. Shapes are the direct contents of the `Smithy` model. `Symbols` carry information\n * about Rust types, namespaces, dependencies, metadata as well as other information required to render a symbol.\n *\n * This is composed with other symbol visitors to handle behavior like Streaming shapes and determining the correct\n * derives for a given shape.\n */\nopen class SymbolVisitor(\n    settings: CoreRustSettings,\n    final override val model: Model,\n    private val serviceShape: ServiceShape?,\n    override val config: RustSymbolProviderConfig,\n) : RustSymbolProvider, ShapeVisitor<Symbol> {\n    override val moduleProviderContext = ModuleProviderContext(settings, model, serviceShape)\n    private val nullableIndex = NullableIndex.of(model)\n\n    override fun toSymbol(shape: Shape): Symbol {\n        return shape.accept(this)\n    }\n\n    override fun symbolForOperationError(operation: OperationShape): Symbol =\n        toSymbol(operation).let { symbol ->\n            val module = moduleForOperationError(operation)\n            module.toType().resolve(\"${symbol.name}Error\").toSymbol().toBuilder().locatedIn(module).build()\n        }\n\n    override fun symbolForEventStreamError(eventStream: UnionShape): Symbol =\n        toSymbol(eventStream).let { symbol ->\n            val module = moduleForEventStreamError(eventStream)\n            module.toType().resolve(\"${symbol.name}Error\").toSymbol().toBuilder().locatedIn(module).build()\n        }\n\n    override fun symbolForBuilder(shape: Shape): Symbol =\n        toSymbol(shape).let { symbol ->\n            val module = moduleForBuilder(shape)\n            module.toType().resolve(config.nameBuilderFor(symbol)).toSymbol().toBuilder().locatedIn(module).build()\n        }\n\n    override fun toMemberName(shape: MemberShape): String {\n        val container = model.expectShape(shape.container)\n        return when {\n            container is StructureShape -> shape.memberName.toSnakeCase()\n            container is UnionShape || container is EnumShape || container.hasTrait<EnumTrait>() -> shape.memberName.toPascalCase()\n            else -> error(\"unexpected container shape: $container\")\n        }\n    }\n\n    override fun blobShape(shape: BlobShape?): Symbol {\n        return RuntimeType.blob(config.runtimeConfig).toSymbol()\n    }\n\n    /**\n     * Produce `Box<T>` when the shape has the `RustBoxTrait`\n     */\n    private fun handleRustBoxing(\n        symbol: Symbol,\n        shape: Shape,\n    ): Symbol {\n        return if (shape.hasTrait<RustBoxTrait>()) {\n            val rustType = RustType.Box(symbol.rustType())\n            with(Symbol.builder()) {\n                rustType(rustType)\n                addReference(symbol)\n                name(rustType.name)\n                build()\n            }\n        } else {\n            symbol\n        }\n    }\n\n    private fun simpleShape(shape: SimpleShape): Symbol {\n        return symbolBuilder(shape, SimpleShapes.getValue(shape::class)).build()\n    }\n\n    override fun booleanShape(shape: BooleanShape): Symbol = simpleShape(shape)\n\n    override fun byteShape(shape: ByteShape): Symbol = simpleShape(shape)\n\n    override fun shortShape(shape: ShortShape): Symbol = simpleShape(shape)\n\n    override fun integerShape(shape: IntegerShape): Symbol = simpleShape(shape)\n\n    override fun longShape(shape: LongShape): Symbol = simpleShape(shape)\n\n    override fun floatShape(shape: FloatShape): Symbol = simpleShape(shape)\n\n    override fun doubleShape(shape: DoubleShape): Symbol = simpleShape(shape)\n\n    override fun intEnumShape(shape: IntEnumShape): Symbol = simpleShape(shape)\n\n    override fun stringShape(shape: StringShape): Symbol {\n        return if (shape.hasTrait<EnumTrait>()) {\n            val rustType = RustType.Opaque(shape.contextName(serviceShape).toPascalCase())\n            symbolBuilder(shape, rustType).locatedIn(moduleForShape(shape)).build()\n        } else {\n            symbolBuilder(shape, RustType.String).build()\n        }\n    }\n\n    override fun listShape(shape: ListShape): Symbol {\n        val inner = this.toSymbol(shape.member)\n        return symbolBuilder(shape, RustType.Vec(inner.rustType())).addReference(inner).build()\n    }\n\n    override fun setShape(shape: SetShape): Symbol {\n        val inner = this.toSymbol(shape.member)\n        val builder =\n            if (model.expectShape(shape.member.target).isStringShape) {\n                symbolBuilder(shape, RustType.HashSet(inner.rustType()))\n            } else {\n                // only strings get put into actual sets because floats are unhashable\n                symbolBuilder(shape, RustType.Vec(inner.rustType()))\n            }\n        return builder.addReference(inner).build()\n    }\n\n    override fun mapShape(shape: MapShape): Symbol {\n        val target = model.expectShape(shape.key.target)\n        require(target.isStringShape) { \"unexpected key shape: ${shape.key}: $target [keys must be strings]\" }\n        val key = this.toSymbol(shape.key)\n        val value = this.toSymbol(shape.value)\n        return symbolBuilder(shape, RustType.HashMap(key.rustType(), value.rustType())).addReference(key)\n            .addReference(value).build()\n    }\n\n    override fun documentShape(shape: DocumentShape?): Symbol {\n        return RuntimeType.document(config.runtimeConfig).toSymbol()\n    }\n\n    override fun bigIntegerShape(shape: BigIntegerShape?): Symbol {\n        return RuntimeType.bigInteger(config.runtimeConfig).toSymbol()\n    }\n\n    override fun bigDecimalShape(shape: BigDecimalShape?): Symbol {\n        return RuntimeType.bigDecimal(config.runtimeConfig).toSymbol()\n    }\n\n    override fun operationShape(shape: OperationShape): Symbol {\n        return symbolBuilder(\n            shape,\n            RustType.Opaque(\n                shape.contextName(serviceShape)\n                    .replaceFirstChar { it.uppercase() },\n            ),\n        )\n            .locatedIn(moduleForShape(shape))\n            .build()\n    }\n\n    override fun resourceShape(shape: ResourceShape?): Symbol {\n        TODO(\"Not yet implemented: resources are not supported\")\n    }\n\n    override fun serviceShape(shape: ServiceShape?): Symbol {\n        PANIC(\"symbol visitor should not be invoked in service shapes\")\n    }\n\n    override fun structureShape(shape: StructureShape): Symbol {\n        val isError = shape.hasTrait<ErrorTrait>()\n        val name =\n            shape.contextName(serviceShape).toPascalCase().letIf(isError && config.renameExceptions) {\n                it.replace(\"Exception\", \"Error\")\n            }\n        return symbolBuilder(shape, RustType.Opaque(name)).locatedIn(moduleForShape(shape)).build()\n    }\n\n    override fun unionShape(shape: UnionShape): Symbol {\n        val name = shape.contextName(serviceShape).toPascalCase()\n        return symbolBuilder(shape, RustType.Opaque(name)).locatedIn(moduleForShape(shape)).build()\n    }\n\n    override fun memberShape(shape: MemberShape): Symbol {\n        val target = model.expectShape(shape.target)\n        val defaultValue =\n            shape.getMemberTrait(model, DefaultTrait::class.java).orNull()?.let { trait ->\n                if (target.isDocumentShape || target.isTimestampShape) {\n                    Default.NonZeroDefault(trait.toNode())\n                } else {\n                    when (val value = trait.toNode()) {\n                        Node.from(\"\"), Node.from(0), Node.from(false), Node.arrayNode(), Node.objectNode() -> Default.RustDefault\n                        Node.nullNode() -> Default.NoDefault\n                        else -> Default.NonZeroDefault(value)\n                    }\n                }\n            } ?: Default.NoDefault\n        // Handle boxing first, so we end up with Option<Box<_>>, not Box<Option<_>>.\n        return handleOptionality(\n            handleRustBoxing(toSymbol(target), shape),\n            shape,\n            nullableIndex,\n            config.nullabilityCheckMode,\n        ).toBuilder().setDefault(defaultValue).build()\n    }\n\n    override fun timestampShape(shape: TimestampShape?): Symbol {\n        return RuntimeType.dateTime(config.runtimeConfig).toSymbol()\n    }\n}\n\n/**\n * Boxes and returns [symbol], the symbol for the target of the member shape [shape], if [shape] is annotated with\n * [RustBoxTrait]; otherwise returns [symbol] unchanged.\n *\n * See `RecursiveShapeBoxer.kt` for the model transformation pass that annotates model shapes with [RustBoxTrait].\n */\nfun handleRustBoxing(\n    symbol: Symbol,\n    shape: MemberShape,\n): Symbol =\n    if (shape.hasTrait<RustBoxTrait>()) {\n        symbol.makeRustBoxed()\n    } else {\n        symbol\n    }\n\nfun symbolBuilder(\n    shape: Shape?,\n    rustType: RustType,\n): Symbol.Builder =\n    Symbol.builder().shape(shape).rustType(rustType)\n        .name(rustType.name)\n        // Every symbol that actually gets defined somewhere should set a definition file\n        // If we ever generate a `thisisabug.rs`, there is a bug in our symbol generation\n        .definitionFile(\"thisisabug.rs\")\n\nfun handleOptionality(\n    symbol: Symbol,\n    member: MemberShape,\n    nullableIndex: NullableIndex,\n    nullabilityCheckMode: CheckMode,\n): Symbol = symbol.letIf(nullableIndex.isMemberNullable(member, nullabilityCheckMode)) { symbol.makeOptional() }\n\n/**\n * Creates a test module for this symbol.\n * For example if the symbol represents the name for the struct `struct MyStruct { ... }`,\n * this function will create the following inline module:\n * ```rust\n *  #[cfg(test)]\n *  mod test_my_struct { ... }\n * ```\n */\nfun SymbolProvider.testModuleForShape(shape: Shape): RustModule.LeafModule {\n    val symbol = toSymbol(shape)\n    val rustName = symbol.name.unsafeToRustName()\n\n    return RustModule.new(\n        name = \"test_$rustName\",\n        visibility = Visibility.PRIVATE,\n        inline = true,\n        parent = symbol.module(),\n        additionalAttributes = listOf(Attribute.CfgTest),\n    )\n}\n\n/**\n *  You should rarely need this function, rust names in general should be symbol-aware,\n *  this is \"automatic\" if you use things like [software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate].\n */\nfun String.unsafeToRustName(): String = RustReservedWords.escapeIfNeeded(this.toSnakeCase())\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/customizations/AllowLintsCustomization.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy.customizations\n\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute.Companion.allow\nimport software.amazon.smithy.rust.codegen.core.rustlang.AttributeKind\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.LibRsCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.LibRsSection\n\nprivate val allowedRustcLints =\n    listOf(\n        // Deprecated items should be safe to compile, so don't block the compilation.\n        \"deprecated\",\n        // Unknown lints need to be allowed since we use both nightly and our MSRV, and sometimes we need\n        // to disable lints that are in nightly but don't exist in the MSRV.\n        \"unknown_lints\",\n    )\n\nprivate val allowedClippyLints =\n    listOf(\n        // Sometimes operations are named the same as our module e.g. output leading to `output::output`.\n        \"module_inception\",\n        // Currently, we don't re-case acronyms in models, e.g. `SSEVersion`.\n        \"upper_case_acronyms\",\n        // Large errors trigger this warning, we are unlikely to optimize this case currently.\n        \"large_enum_variant\",\n        // Some models have members with `is` in the name, which leads to builder functions with the wrong self convention.\n        \"wrong_self_convention\",\n        // Models like ecs use method names like `add()` which confuses Clippy.\n        \"should_implement_trait\",\n        // Protocol tests use silly names like `baz`, don't flag that.\n        \"disallowed_names\",\n        // Forcing use of `vec![]` can make codegen harder in some cases.\n        \"vec_init_then_push\",\n        // Some models have shapes that generate complex Rust types (e.g. nested collection and map shapes).\n        \"type_complexity\",\n        // Determining if the expression is the last one (to remove return) can make codegen harder in some cases.\n        \"needless_return\",\n        // For backwards compatibility, we often don't derive Eq\n        \"derive_partial_eq_without_eq\",\n        // Keeping errors small in a backwards compatible way is challenging\n        \"result_large_err\",\n        // Difficult to avoid in generated code\n        \"unnecessary_map_on_constructor\",\n        // Introduced by Python server codegen but needs to be suppressed for regular codegen (https://github.com/smithy-lang/smithy-rs/pull/4537)\n        \"useless_conversion\",\n        // Service models can specify a date, such as 2024-01-08, as the \"since\" date for deprecation.\n        \"deprecated_semver\",\n    )\n\nprivate val allowedRustdocLints =\n    listOf(\n        // Rust >=1.53.0 requires links to be wrapped in `<link>`. This is extremely hard to enforce for\n        // docs that come from the modeled documentation, so we need to disable this lint\n        \"bare_urls\",\n        // Rustdoc warns about redundant explicit links in doc comments. This is fine for handwritten\n        // crates, but is impractical to manage for code generated crates. Thus, allow it.\n        \"redundant_explicit_links\",\n        // Model documentation may contain broken intra-doc links like `[here]` that are not valid Rust\n        // doc links. Since we can't control upstream model documentation, we need to allow this lint.\n        \"broken_intra_doc_links\",\n        // The documentation directly from the model may contain invalid HTML tags. For instance,\n        // <p><code><bucketloggingstatus xmlns=\"http://doc.s3.amazonaws.com/2006-03-01\" /></code></p>\n        // is considered an invalid self-closing HTML tag `bucketloggingstatus`\n        \"invalid_html_tags\",\n    )\n\nclass AllowLintsCustomization(\n    private val rustcLints: List<String> = allowedRustcLints,\n    private val clippyLints: List<String> = allowedClippyLints,\n    private val rustdocLints: List<String> = allowedRustdocLints,\n    // TODO(https://github.com/smithy-lang/smithy-rs/issues/4366) Remove additionalClippyLints once the issue is resolved\n    private val additionalClippyLints: List<String> = emptyList(),\n) : LibRsCustomization() {\n    override fun section(section: LibRsSection) =\n        when (section) {\n            is LibRsSection.Attributes ->\n                writable {\n                    rustcLints.forEach {\n                        Attribute(allow(it)).render(this, AttributeKind.Inner)\n                    }\n                    (clippyLints + additionalClippyLints).forEach {\n                        Attribute(allow(\"clippy::$it\")).render(this, AttributeKind.Inner)\n                    }\n                    rustdocLints.forEach {\n                        Attribute(allow(\"rustdoc::$it\")).render(this, AttributeKind.Inner)\n                    }\n                    // add a newline at the end\n                    this.write(\"\")\n                }\n            else -> emptySection\n        }\n}\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/customizations/CrateVersionCustomization.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy.customizations\n\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustModule\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RustCrate\n\n/**\n * Add `PGK_VERSION` const in lib.rs to enable knowing the version of the current module\n */\nobject CrateVersionCustomization {\n    fun pkgVersion(module: RustModule): RuntimeType = RuntimeType(module.fullyQualifiedPath() + \"::PKG_VERSION\")\n\n    fun extras(\n        rustCrate: RustCrate,\n        module: RustModule,\n    ) = rustCrate.withModule(module) {\n        rust(\n            \"\"\"\n            /// Crate version number.\n            pub static PKG_VERSION: &str = env!(\"CARGO_PKG_VERSION\");\n            \"\"\",\n        )\n    }\n}\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/customizations/SmithyTypesPubUseExtra.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy.customizations\n\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.knowledge.TopDownIndex\nimport software.amazon.smithy.model.shapes.ServiceShape\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.Feature\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenContext\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.eventReceiver\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.eventStreamSender\nimport software.amazon.smithy.rust.codegen.core.smithy.RustCrate\nimport software.amazon.smithy.rust.codegen.core.util.hasEventStreamMember\nimport software.amazon.smithy.rust.codegen.core.util.hasEventStreamOperations\nimport software.amazon.smithy.rust.codegen.core.util.hasStreamingMember\n\n/** Returns true if the model has normal streaming operations (excluding event streams) */\nprivate fun hasStreamingOperations(\n    model: Model,\n    serviceShape: ServiceShape,\n): Boolean {\n    val operations = TopDownIndex.of(model).getContainedOperations(serviceShape)\n    return operations.any { operation ->\n        val input = model.expectShape(operation.inputShape, StructureShape::class.java)\n        val output = model.expectShape(operation.outputShape, StructureShape::class.java)\n        (input.hasStreamingMember(model) && !input.hasEventStreamMember(model)) ||\n            (output.hasStreamingMember(model) && !output.hasEventStreamMember(model))\n    }\n}\n\n// TODO(https://github.com/smithy-lang/smithy-rs/issues/2111): Fix this logic to consider collection/map shapes\nprivate fun structUnionMembersMatchPredicate(\n    model: Model,\n    predicate: (Shape) -> Boolean,\n): Boolean =\n    model.structureShapes.any { structure ->\n        structure.members().any { member -> predicate(model.expectShape(member.target)) }\n    } ||\n        model.unionShapes.any { union ->\n            union.members().any { member -> predicate(model.expectShape(member.target)) }\n        }\n\n/** Returns true if the model uses any blob shapes */\nprivate fun hasBlobs(model: Model): Boolean = structUnionMembersMatchPredicate(model, Shape::isBlobShape)\n\n/** Returns true if the model uses any timestamp shapes */\nprivate fun hasDateTimes(model: Model): Boolean = structUnionMembersMatchPredicate(model, Shape::isTimestampShape)\n\n/** Adds re-export statements for Smithy primitives */\nfun pubUseSmithyPrimitives(\n    codegenContext: CodegenContext,\n    model: Model,\n    rustCrate: RustCrate,\n): Writable =\n    writable {\n        val rc = codegenContext.runtimeConfig\n        if (hasBlobs(model)) {\n            rustTemplate(\"pub use #{Blob};\", \"Blob\" to RuntimeType.blob(rc))\n        }\n        if (hasDateTimes(model)) {\n            rustTemplate(\n                \"\"\"\n                pub use #{DateTime};\n                pub use #{Format} as DateTimeFormat;\n                \"\"\",\n                \"DateTime\" to RuntimeType.dateTime(rc),\n                \"Format\" to RuntimeType.format(rc),\n            )\n        }\n        if (hasStreamingOperations(model, codegenContext.serviceShape)) {\n            rustCrate.mergeFeature(\n                Feature(\n                    \"rt-tokio\",\n                    true,\n                    listOf(\"aws-smithy-types/rt-tokio\", \"aws-smithy-types/http-body-1-x\"),\n                ),\n            )\n            rustTemplate(\n                \"\"\"\n                pub use #{ByteStream};\n                pub use #{AggregatedBytes};\n                pub use #{Error} as ByteStreamError;\n                ##[cfg(feature = \"rt-tokio\")]\n                pub use #{FsBuilder};\n                ##[cfg(feature = \"rt-tokio\")]\n                pub use #{Length};\n                pub use #{SdkBody};\n                \"\"\",\n                \"ByteStream\" to RuntimeType.smithyTypes(rc).resolve(\"byte_stream::ByteStream\"),\n                \"AggregatedBytes\" to RuntimeType.smithyTypes(rc).resolve(\"byte_stream::AggregatedBytes\"),\n                \"Error\" to RuntimeType.smithyTypes(rc).resolve(\"byte_stream::error::Error\"),\n                \"FsBuilder\" to RuntimeType.smithyTypes(rc).resolve(\"byte_stream::FsBuilder\"),\n                \"Length\" to RuntimeType.smithyTypes(rc).resolve(\"byte_stream::Length\"),\n                \"SdkBody\" to RuntimeType.smithyTypes(rc).resolve(\"body::SdkBody\"),\n            )\n        }\n    }\n\n/** Adds re-export statements for event-stream-related Smithy primitives */\nfun pubUseSmithyPrimitivesEventStream(\n    codegenContext: CodegenContext,\n    model: Model,\n): Writable =\n    writable {\n        val rc = codegenContext.runtimeConfig\n        if (codegenContext.serviceShape.hasEventStreamOperations(model)) {\n            rustTemplate(\n                \"\"\"\n                pub use #{EventReceiver};\n                pub use #{EventStreamSender};\n                pub use #{Header};\n                pub use #{HeaderValue};\n                pub use #{Message};\n                pub use #{StrBytes};\n                \"\"\",\n                \"EventReceiver\" to eventReceiver(rc),\n                \"EventStreamSender\" to eventStreamSender(rc),\n                \"Header\" to RuntimeType.smithyTypes(rc).resolve(\"event_stream::Header\"),\n                \"HeaderValue\" to RuntimeType.smithyTypes(rc).resolve(\"event_stream::HeaderValue\"),\n                \"Message\" to RuntimeType.smithyTypes(rc).resolve(\"event_stream::Message\"),\n                \"StrBytes\" to RuntimeType.smithyTypes(rc).resolve(\"str_bytes::StrBytes\"),\n            )\n        }\n    }\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/customize/CoreCodegenDecorator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy.customize\n\nimport software.amazon.smithy.build.PluginContext\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.ServiceShape\nimport software.amazon.smithy.rust.codegen.core.smithy.ModuleDocProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.RustCrate\nimport software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.BuilderCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.EnumCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.LibRsCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.ManifestCustomizations\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.StructureCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.error.ErrorImplCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.protocol.ProtocolTestGenerator\nimport software.amazon.smithy.rust.codegen.core.util.deepMergeWith\nimport java.util.ServiceLoader\nimport java.util.logging.Logger\n\n/**\n * Represents the bare minimum for codegen plugin customization.\n */\ninterface CoreCodegenDecorator<CodegenContext, CodegenSettings> {\n    /**\n     * The name of this decorator, used for logging and debug information\n     */\n    val name: String\n\n    /**\n     * Enable a deterministic ordering to be applied\n     *\n     * Lowest numbered integrations are applied last since they are applied in reverse order of their positions\n     * in the list of decorators.\n     */\n    val order: Byte\n\n    /**\n     * Whether this decorator can be discovered on the classpath (defaults to true).\n     * This is intended to only be overridden for decorators written specifically for tests.\n     */\n    fun classpathDiscoverable(): Boolean = true\n\n    /**\n     * Hook to transform the Smithy model before codegen takes place.\n     */\n    fun transformModel(\n        service: ServiceShape,\n        model: Model,\n        settings: CodegenSettings,\n    ): Model = model\n\n    /**\n     * Hook to add additional modules to the generated crate.\n     */\n    fun extras(\n        codegenContext: CodegenContext,\n        rustCrate: RustCrate,\n    ) {\n    }\n\n    /**\n     * Customize the documentation provider for module documentation.\n     */\n    fun moduleDocumentationCustomization(\n        codegenContext: CodegenContext,\n        baseModuleDocProvider: ModuleDocProvider,\n    ): ModuleDocProvider = baseModuleDocProvider\n\n    /**\n     * Hook to customize the generated `Cargo.toml` file.\n     *\n     * Returns a map of Cargo.toml properties to change. For example, if a `homepage` needs to be\n     * added to the Cargo.toml `[package]` section, a `mapOf(\"package\" to mapOf(\"homepage\", \"https://example.com\"))`\n     * could be returned. Properties here overwrite the default properties.\n     */\n    fun crateManifestCustomizations(codegenContext: CodegenContext): ManifestCustomizations = emptyMap()\n\n    /**\n     * Hook to customize the generated `lib.rs` file.\n     */\n    fun libRsCustomizations(\n        codegenContext: CodegenContext,\n        baseCustomizations: List<LibRsCustomization>,\n    ): List<LibRsCustomization> = baseCustomizations\n\n    /**\n     * Hook to customize structures generated by `StructureGenerator`.\n     */\n    fun structureCustomizations(\n        codegenContext: CodegenContext,\n        baseCustomizations: List<StructureCustomization>,\n    ): List<StructureCustomization> = baseCustomizations\n\n    /**\n     * Hook to customize enums generated by `EnumGenerator`.\n     */\n    fun enumCustomizations(\n        codegenContext: CodegenContext,\n        baseCustomizations: List<EnumCustomization>,\n    ): List<EnumCustomization> = baseCustomizations\n\n    // TODO(https://github.com/smithy-lang/smithy-rs/issues/1401): Move builder customizations into `ClientCodegenDecorator`\n\n    /**\n     * Hook to customize generated builders.\n     */\n    fun builderCustomizations(\n        codegenContext: CodegenContext,\n        baseCustomizations: List<BuilderCustomization>,\n    ): List<BuilderCustomization> = baseCustomizations\n\n    /**\n     * Hook to customize error struct `impl` blocks.\n     */\n    fun errorImplCustomizations(\n        codegenContext: CodegenContext,\n        baseCustomizations: List<ErrorImplCustomization>,\n    ): List<ErrorImplCustomization> = baseCustomizations\n\n    /**\n     * Extra sections allow one decorator to influence another. This is intended to be used by querying the `rootDecorator`\n     */\n    fun extraSections(codegenContext: CodegenContext): List<AdHocCustomization> = listOf()\n\n    /**\n     * Hook for customizing symbols by inserting an additional symbol provider.\n     */\n    fun symbolProvider(base: RustSymbolProvider): RustSymbolProvider = base\n\n    /**\n     * Hook to override the protocol test generator.\n     */\n    fun protocolTestGenerator(\n        codegenContext: CodegenContext,\n        baseGenerator: ProtocolTestGenerator,\n    ): ProtocolTestGenerator = baseGenerator\n}\n\n/**\n * Implementations for combining decorators for the core customizations.\n */\nabstract class CombinedCoreCodegenDecorator<CodegenContext, CodegenSettings, Decorator : CoreCodegenDecorator<CodegenContext, CodegenSettings>>(\n    decorators: List<Decorator>,\n) : CoreCodegenDecorator<CodegenContext, CodegenSettings> {\n    private val orderedDecorators = decorators.sortedBy { it.order }\n\n    final override fun crateManifestCustomizations(codegenContext: CodegenContext): ManifestCustomizations =\n        combineCustomizations(emptyMap()) { decorator, customizations ->\n            customizations.deepMergeWith(decorator.crateManifestCustomizations(codegenContext))\n        }\n\n    final override fun extras(\n        codegenContext: CodegenContext,\n        rustCrate: RustCrate,\n    ) {\n        return orderedDecorators.forEach { it.extras(codegenContext, rustCrate) }\n    }\n\n    final override fun transformModel(\n        service: ServiceShape,\n        model: Model,\n        settings: CodegenSettings,\n    ): Model =\n        combineCustomizations(model) { decorator, otherModel ->\n            decorator.transformModel(otherModel.expectShape(service.id, ServiceShape::class.java), otherModel, settings)\n        }\n\n    final override fun moduleDocumentationCustomization(\n        codegenContext: CodegenContext,\n        baseModuleDocProvider: ModuleDocProvider,\n    ): ModuleDocProvider =\n        combineCustomizations(baseModuleDocProvider) { decorator, base ->\n            decorator.moduleDocumentationCustomization(codegenContext, base)\n        }\n\n    final override fun libRsCustomizations(\n        codegenContext: CodegenContext,\n        baseCustomizations: List<LibRsCustomization>,\n    ): List<LibRsCustomization> =\n        combineCustomizations(baseCustomizations) { decorator, customizations ->\n            decorator.libRsCustomizations(codegenContext, customizations)\n        }\n\n    override fun structureCustomizations(\n        codegenContext: CodegenContext,\n        baseCustomizations: List<StructureCustomization>,\n    ): List<StructureCustomization> =\n        combineCustomizations(baseCustomizations) { decorator, customizations ->\n            decorator.structureCustomizations(codegenContext, customizations)\n        }\n\n    override fun builderCustomizations(\n        codegenContext: CodegenContext,\n        baseCustomizations: List<BuilderCustomization>,\n    ): List<BuilderCustomization> =\n        combineCustomizations(baseCustomizations) { decorator, customizations ->\n            decorator.builderCustomizations(codegenContext, customizations)\n        }\n\n    override fun errorImplCustomizations(\n        codegenContext: CodegenContext,\n        baseCustomizations: List<ErrorImplCustomization>,\n    ): List<ErrorImplCustomization> =\n        combineCustomizations(baseCustomizations) { decorator, customizations ->\n            decorator.errorImplCustomizations(codegenContext, customizations)\n        }\n\n    final override fun extraSections(codegenContext: CodegenContext): List<AdHocCustomization> =\n        addCustomizations { decorator -> decorator.extraSections(codegenContext) }\n\n    final override fun symbolProvider(base: RustSymbolProvider): RustSymbolProvider =\n        combineCustomizations(base) { decorator, otherProvider ->\n            decorator.symbolProvider(otherProvider)\n        }\n\n    final override fun protocolTestGenerator(\n        codegenContext: CodegenContext,\n        baseGenerator: ProtocolTestGenerator,\n    ): ProtocolTestGenerator =\n        combineCustomizations(baseGenerator) { decorator, gen ->\n            decorator.protocolTestGenerator(codegenContext, gen)\n        }\n\n    /**\n     * Combines customizations from multiple ordered codegen decorators.\n     *\n     * Using this combinator allows for customizations to remove other customizations since the `mergeCustomizations`\n     * function can mutate the entire returned customization list.\n     */\n    protected fun <CombinedCustomizations> combineCustomizations(\n        /** Initial customizations. These will remain at the front of the list unless `mergeCustomizations` changes order. */\n        baseCustomizations: CombinedCustomizations,\n        /** A function that retrieves customizations from a decorator and combines them with the given customizations. */\n        mergeCustomizations: (Decorator, CombinedCustomizations) -> CombinedCustomizations,\n    ): CombinedCustomizations =\n        orderedDecorators.foldRight(baseCustomizations) { decorator, customizations ->\n            mergeCustomizations(decorator, customizations)\n        }\n\n    /**\n     * Combines customizations from multiple ordered codegen decorators in a purely additive way.\n     *\n     * Unlike `combineCustomizations`, customizations combined in this way cannot remove other customizations.\n     */\n    protected fun <Customization> addCustomizations(\n        /** Returns customizations from a decorator. */\n        getCustomizations: (Decorator) -> List<Customization>,\n    ): List<Customization> = orderedDecorators.flatMap(getCustomizations)\n\n    companion object {\n        /**\n         * Loads decorators of the given class from the classpath and filters them by the `classpathDiscoverable`\n         * method on `CoreCodegenDecorator`.\n         */\n        @JvmStatic\n        protected fun <CodegenContext, CodegenSettings, Decorator : CoreCodegenDecorator<CodegenContext, CodegenSettings>> decoratorsFromClasspath(\n            context: PluginContext,\n            decoratorClass: Class<Decorator>,\n            logger: Logger,\n            vararg extras: Decorator,\n        ): List<Decorator> {\n            val decorators =\n                ServiceLoader.load(\n                    decoratorClass,\n                    context.pluginClassLoader.orElse(decoratorClass.classLoader),\n                )\n\n            val filteredDecorators =\n                decorators.asSequence()\n                    .onEach { logger.info(\"Discovered Codegen Decorator: ${it!!::class.java.name}\") }\n                    .filter { it!!.classpathDiscoverable() }\n                    .onEach { logger.info(\"Adding Codegen Decorator: ${it!!::class.java.name}\") }\n                    .toList()\n            return filteredDecorators + extras\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/customize/Customization.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy.customize\n\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\n\n/**\n * An overrideable section for code generation. Usage:\n * ```kotlin\n * sealed class OperationCustomization(name: String) : Section(name) {\n *      // Sections can be state-carrying to allow implementations to make different choices based on\n *      // different operations\n *      data class RequestCreation(protocolConfig: ProtocolConfig, operation: OperationShape) : Section(\"RequestCreation\")\n *      // Sections can be stateless, e.g. this section that could write code into the\n *      // top level operation module\n *      object OperationModule : ServiceConfig(\"OperationTopLevel\")\n * }\n */\nabstract class Section(val name: String)\n\n/** Customization type returned by [adhocCustomization] */\ntypealias AdHocCustomization = NamedCustomization<AdHocSection>\n\n/** Adhoc section for code generation. Similar to [Section], but for use with [adhocCustomization]. */\nabstract class AdHocSection(name: String) : Section(name)\n\n/**\n * Allows for one-off customizations such that a `when` statement switching on\n * the section type is not necessary.\n */\ninline fun <reified T : AdHocSection> adhocCustomization(\n    crossinline customization: RustWriter.(T) -> Unit,\n): AdHocCustomization =\n    object : AdHocCustomization() {\n        override fun section(section: AdHocSection): Writable =\n            writable {\n                if (section is T) {\n                    customization(section)\n                }\n            }\n    }\n\n/**\n * A named section generator that allows customization via a predefined set of named sections.\n *\n * Implementors MUST override section and use a `when` clause to handle each section individually\n */\nabstract class NamedCustomization<T : Section> {\n    abstract fun section(section: T): Writable\n\n    protected val emptySection = writable { }\n}\n\n/** Convenience for rendering a list of customizations for a given section */\nfun <T : Section> RustWriter.writeCustomizations(\n    customizations: List<NamedCustomization<T>>,\n    section: T,\n) {\n    for (customization in customizations) {\n        customization.section(section)(this)\n    }\n}\n\n/** Convenience for rendering a list of customizations for a given section */\nfun <T : Section> RustWriter.writeCustomizationsOrElse(\n    customizations: List<NamedCustomization<T>>,\n    section: T,\n    orElse: Writable,\n) {\n    val test = RustWriter.root()\n    test.writeCustomizations(customizations, section)\n    if (test.dirty()) {\n        writeCustomizations(customizations, section)\n    } else {\n        orElse(this)\n    }\n}\n\nfun <T : Section> allCustomizationsAreEmpty(\n    customizations: List<NamedCustomization<T>>,\n    section: T,\n): Boolean {\n    val test = RustWriter.root()\n    test.writeCustomizations(customizations, section)\n    // If they're not dirty, then they're empty.\n    return !test.dirty()\n}\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/BuilderGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy.generators\n\nimport software.amazon.smithy.codegen.core.Symbol\nimport software.amazon.smithy.codegen.core.SymbolProvider\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.StringShape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute.Companion.derive\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustType\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.asArgument\nimport software.amazon.smithy.rust.codegen.core.rustlang.asOptional\nimport software.amazon.smithy.rust.codegen.core.rustlang.conditionalBlockTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.deprecatedShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.docs\nimport software.amazon.smithy.rust.codegen.core.rustlang.docsTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.documentShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.map\nimport software.amazon.smithy.rust.codegen.core.rustlang.render\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlockTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.stripOuter\nimport software.amazon.smithy.rust.codegen.core.rustlang.withBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenContext\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\nimport software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.canUseDefault\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.NamedCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.Section\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.writeCustomizations\nimport software.amazon.smithy.rust.codegen.core.smithy.expectRustMetadata\nimport software.amazon.smithy.rust.codegen.core.smithy.isOptional\nimport software.amazon.smithy.rust.codegen.core.smithy.makeOptional\nimport software.amazon.smithy.rust.codegen.core.smithy.rustType\nimport software.amazon.smithy.rust.codegen.core.smithy.traits.SyntheticInputTrait\nimport software.amazon.smithy.rust.codegen.core.util.REDACTION\nimport software.amazon.smithy.rust.codegen.core.util.dq\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\nimport software.amazon.smithy.rust.codegen.core.util.letIf\nimport software.amazon.smithy.rust.codegen.core.util.redactIfNecessary\nimport software.amazon.smithy.rust.codegen.core.util.shouldRedact\nimport software.amazon.smithy.rust.codegen.core.util.toSnakeCase\n\n// TODO(https://github.com/smithy-lang/smithy-rs/issues/1401) This builder generator is only used by the client.\n//  Move this entire file, and its tests, to `codegen-client`.\n\n/** BuilderGenerator customization sections */\nsealed class BuilderSection(name: String) : Section(name) {\n    abstract val shape: StructureShape\n\n    /** Hook to add additional fields to the builder */\n    data class AdditionalFields(override val shape: StructureShape) : BuilderSection(\"AdditionalFields\")\n\n    /** Hook to add additional methods to the builder */\n    data class AdditionalMethods(override val shape: StructureShape) : BuilderSection(\"AdditionalMethods\")\n\n    /** Hook to add additional fields to the `build()` method */\n    data class AdditionalFieldsInBuild(override val shape: StructureShape) : BuilderSection(\"AdditionalFieldsInBuild\")\n\n    /** Hook to add additional fields to the `Debug` impl */\n    data class AdditionalDebugFields(override val shape: StructureShape, val formatterName: String) :\n        BuilderSection(\"AdditionalDebugFields\")\n}\n\n/** Customizations for BuilderGenerator */\nabstract class BuilderCustomization : NamedCustomization<BuilderSection>()\n\nfun RuntimeConfig.operationBuildError() = RuntimeType.smithyTypes(this).resolve(\"error::operation::BuildError\")\n\nfun RuntimeConfig.serializationError() = RuntimeType.smithyTypes(this).resolve(\"error::operation::SerializationError\")\n\nfun MemberShape.enforceRequired(\n    field: Writable,\n    codegenContext: CodegenContext,\n    produceOption: Boolean = true,\n): Writable {\n    if (!this.isRequired) {\n        return field\n    }\n    val shape = this\n    val isOptional = codegenContext.symbolProvider.toSymbol(shape).isOptional()\n    val field = field.letIf(!isOptional) { it.map { t -> rust(\"Some(#T)\", t) } }\n    val error =\n        OperationBuildError(codegenContext.runtimeConfig).missingField(\n            codegenContext.symbolProvider.toMemberName(shape), \"A required field was not set\",\n        )\n    val unwrapped =\n        when (codegenContext.model.expectShape(this.target)) {\n            is StringShape ->\n                writable {\n                    rust(\"#T.filter(|f|!AsRef::<str>::as_ref(f).trim().is_empty())\", field)\n                }\n\n            else -> field\n        }.map { base -> rustTemplate(\"#{base}.ok_or_else(||#{error})?\", \"base\" to base, \"error\" to error) }\n    return unwrapped.letIf(produceOption) { w -> w.map { rust(\"Some(#T)\", it) } }\n}\n\nclass OperationBuildError(private val runtimeConfig: RuntimeConfig) {\n    fun missingField(\n        field: String,\n        details: String,\n    ) = writable {\n        rust(\"#T::missing_field(${field.dq()}, ${details.dq()})\", runtimeConfig.operationBuildError())\n    }\n\n    fun invalidField(\n        field: String,\n        details: String,\n    ) = invalidField(field) { rust(details.dq()) }\n\n    fun invalidField(\n        field: String,\n        details: Writable,\n    ) = writable {\n        rustTemplate(\n            \"#{error}::invalid_field(${field.dq()}, #{details:W})\",\n            \"error\" to runtimeConfig.operationBuildError(),\n            \"details\" to details,\n        )\n    }\n}\n\n// Setter names will never hit a reserved word and therefore never need escaping.\nfun MemberShape.setterName() = \"set_${this.memberName.toSnakeCase()}\"\n\n// Getter names will never hit a reserved word and therefore never need escaping.\nfun MemberShape.getterName() = \"get_${this.memberName.toSnakeCase()}\"\n\nclass BuilderGenerator(\n    private val model: Model,\n    private val symbolProvider: RustSymbolProvider,\n    private val shape: StructureShape,\n    private val customizations: List<BuilderCustomization>,\n) {\n    companion object {\n        /**\n         * Returns whether a structure shape, whose builder has been generated with [BuilderGenerator], requires a\n         * fallible builder to be constructed.\n         */\n        fun hasFallibleBuilder(\n            structureShape: StructureShape,\n            symbolProvider: SymbolProvider,\n        ): Boolean =\n            // All operation inputs should have fallible builders in case a new required field is added in the future.\n            structureShape.hasTrait<SyntheticInputTrait>() ||\n                structureShape\n                    .members()\n                    .map { symbolProvider.toSymbol(it) }.any {\n                        // If any members are not optional && we can't use a default, we need to\n                        // generate a fallible builder.\n                        !it.isOptional() && !it.canUseDefault()\n                    }\n\n        fun renderConvenienceMethod(\n            implBlock: RustWriter,\n            symbolProvider: RustSymbolProvider,\n            shape: StructureShape,\n        ) {\n            implBlock.docs(\"Creates a new builder-style object to manufacture #D.\", symbolProvider.toSymbol(shape))\n            symbolProvider.symbolForBuilder(shape).also { builderSymbol ->\n                implBlock.rustBlock(\"pub fn builder() -> #T\", builderSymbol) {\n                    write(\"#T::default()\", builderSymbol)\n                }\n            }\n        }\n\n        fun renderIntoBuilderMethod(\n            implBlock: RustWriter,\n            symbolProvider: RustSymbolProvider,\n            shape: StructureShape,\n        ) {\n            val members: List<MemberShape> = shape.allMembers.values.toList()\n            symbolProvider.symbolForBuilder(shape).also { builderSymbol ->\n                Attribute.AllowUnused.render(implBlock)\n                implBlock.rustBlock(\"pub(crate) fn into_builder(self) -> #T\", builderSymbol) {\n                    write(\"Self::builder()\")\n                    for (member in members) {\n                        val memberName = member.memberName.toSnakeCase()\n                        val setter =\n                            if (symbolProvider.toSymbol(member).isOptional()) {\n                                member.setterName()\n                            } else {\n                                memberName\n                            }\n                        write(\".$setter(self.$memberName)\")\n                    }\n                }\n            }\n        }\n    }\n\n    private val runtimeConfig = symbolProvider.config.runtimeConfig\n    private val members: List<MemberShape> = shape.allMembers.values.toList()\n    private val structureSymbol = symbolProvider.toSymbol(shape)\n    private val metadata = structureSymbol.expectRustMetadata()\n\n    // Filter out any derive that isn't Debug, PartialEq, or Clone. Then add a Default derive\n    private val builderDerives =\n        metadata.derives.filter {\n            it == RuntimeType.Debug || it == RuntimeType.PartialEq || it == RuntimeType.Clone\n        } + RuntimeType.Default\n\n    // Filter out attributes\n    private val builderAttributes =\n        metadata.additionalAttributes.filter {\n            it == Attribute.NonExhaustive\n        }\n    private val builderName = symbolProvider.symbolForBuilder(shape).name\n\n    fun render(writer: RustWriter) {\n        // Matching derives to the main structure + `Default` since we are a builder and everything is optional.\n        renderBuilder(writer)\n        if (!structureSymbol.expectRustMetadata().hasDebugDerive()) {\n            renderDebugImpl(writer)\n        }\n    }\n\n    private fun renderBuildFn(implBlockWriter: RustWriter) {\n        val fallibleBuilder = hasFallibleBuilder(shape, symbolProvider)\n        val outputSymbol = symbolProvider.toSymbol(shape)\n        val returnType =\n            when (fallibleBuilder) {\n                true -> \"#{Result}<${implBlockWriter.format(outputSymbol)}, ${implBlockWriter.format(runtimeConfig.operationBuildError())}>\"\n                false -> implBlockWriter.format(outputSymbol)\n            }\n        implBlockWriter.docs(\"Consumes the builder and constructs a #D.\", outputSymbol)\n        val trulyRequiredMembers = members.filter { trulyRequired(it) }\n        if (trulyRequiredMembers.isNotEmpty()) {\n            implBlockWriter.docs(\"This method will fail if any of the following fields are not set:\")\n            trulyRequiredMembers.forEach {\n                val memberName = symbolProvider.toMemberName(it)\n                implBlockWriter.docsTemplate(\n                    // We have to remove the `r##` prefix in the path b/c Rustdoc doesn't support it.\n                    \"- [`$memberName`](#{struct}::${memberName.removePrefix(\"r##\")})\",\n                    \"struct\" to symbolProvider.symbolForBuilder(shape),\n                )\n            }\n        }\n        implBlockWriter.rustBlockTemplate(\"pub fn build(self) -> $returnType\", *preludeScope) {\n            conditionalBlockTemplate(\"#{Ok}(\", \")\", conditional = fallibleBuilder, *preludeScope) {\n                // If a wrapper is specified, use the `::new` associated function to construct the wrapper\n                coreBuilder(this)\n            }\n        }\n    }\n\n    private fun RustWriter.missingRequiredField(field: String) {\n        val detailedMessage =\n            \"$field was not specified but it is required when building ${symbolProvider.toSymbol(shape).name}\"\n        OperationBuildError(runtimeConfig).missingField(field, detailedMessage)(this)\n    }\n\n    // TODO(EventStream): [DX] Consider updating builders to take EventInputStream as Into<EventInputStream>\n    private fun renderBuilderMember(\n        writer: RustWriter,\n        memberName: String,\n        memberSymbol: Symbol,\n    ) {\n        // Builder members are crate-public to enable using them directly in serializers/deserializers.\n        // During XML deserialization, `builder.<field>.take` is used to append to lists and maps.\n        writer.write(\"pub(crate) $memberName: #T,\", memberSymbol)\n    }\n\n    private fun renderBuilderMemberFn(\n        writer: RustWriter,\n        coreType: RustType,\n        member: MemberShape,\n        memberName: String,\n    ) {\n        val input = coreType.asArgument(\"input\")\n\n        writer.documentShape(member, model)\n        if (member.isRequired) {\n            writer.docs(\"This field is required.\")\n        }\n        writer.deprecatedShape(member)\n        writer.rustBlock(\"pub fn $memberName(mut self, ${input.argument}) -> Self\") {\n            rustTemplate(\"self.$memberName = #{Some}(${input.value});\", *preludeScope)\n            write(\"self\")\n        }\n    }\n\n    /**\n     * Render a `set_foo` method. This is useful as a target for code generation, because the argument type\n     * is the same as the resulting member type, and is always optional.\n     */\n    private fun renderBuilderMemberSetterFn(\n        writer: RustWriter,\n        outerType: RustType,\n        member: MemberShape,\n        memberName: String,\n    ) {\n        // TODO(https://github.com/smithy-lang/smithy-rs/issues/1302): This `asOptional()` call is superfluous except in\n        //  the case where the shape is a `@streaming` blob, because [StreamingTraitSymbolProvider] always generates\n        //  a non `Option`al target type: in all other cases the client generates `Option`al types.\n        val inputType = outerType.asOptional()\n\n        writer.documentShape(member, model)\n        writer.deprecatedShape(member)\n        writer.rustBlock(\"pub fn ${member.setterName()}(mut self, input: ${inputType.render(true)}) -> Self\") {\n            rust(\"self.$memberName = input; self\")\n        }\n    }\n\n    /**\n     * Render a `get_foo` method. This is useful as a target for code generation, because the argument type\n     * is the same as the resulting member type, and is always optional.\n     */\n    private fun renderBuilderMemberGetterFn(\n        writer: RustWriter,\n        outerType: RustType,\n        member: MemberShape,\n        memberName: String,\n    ) {\n        // TODO(https://github.com/smithy-lang/smithy-rs/issues/1302): This `asOptional()` call is superfluous except in\n        //  the case where the shape is a `@streaming` blob, because [StreamingTraitSymbolProvider] always generates\n        //  a non `Option`al target type: in all other cases the client generates `Option`al types.\n        val inputType = outerType.asOptional()\n\n        writer.documentShape(member, model)\n        writer.deprecatedShape(member)\n        writer.rustBlock(\"pub fn ${member.getterName()}(&self) -> &${inputType.render(true)}\") {\n            rust(\"&self.$memberName\")\n        }\n    }\n\n    private fun renderBuilder(writer: RustWriter) {\n        writer.docs(\"A builder for #D.\", structureSymbol)\n        Attribute(derive(builderDerives)).render(writer)\n        this.builderAttributes.render(writer)\n        writer.rustBlock(\"pub struct $builderName\") {\n            for (member in members) {\n                val memberName = symbolProvider.toMemberName(member)\n                // All fields in the builder are optional.\n                val memberSymbol = symbolProvider.toSymbol(member).makeOptional()\n                renderBuilderMember(this, memberName, memberSymbol)\n            }\n            writeCustomizations(customizations, BuilderSection.AdditionalFields(shape))\n        }\n\n        writer.rustBlock(\"impl $builderName\") {\n            for (member in members) {\n                // All fields in the builder are optional.\n                val memberSymbol = symbolProvider.toSymbol(member)\n                val outerType = memberSymbol.rustType()\n                val coreType = outerType.stripOuter<RustType.Option>()\n                val memberName = symbolProvider.toMemberName(member)\n                // Render a context-aware builder method for certain types, e.g. a method for vectors that automatically\n                // appends.\n                when (coreType) {\n                    is RustType.Vec -> renderVecHelper(member, memberName, coreType)\n                    is RustType.HashMap -> renderMapHelper(member, memberName, coreType)\n                    else -> renderBuilderMemberFn(this, coreType, member, memberName)\n                }\n\n                renderBuilderMemberSetterFn(this, outerType, member, memberName)\n                renderBuilderMemberGetterFn(this, outerType, member, memberName)\n            }\n            writeCustomizations(customizations, BuilderSection.AdditionalMethods(shape))\n            renderBuildFn(this)\n        }\n    }\n\n    private fun renderDebugImpl(writer: RustWriter) {\n        writer.rustBlock(\"impl #T for $builderName\", RuntimeType.Debug) {\n            writer.rustBlock(\"fn fmt(&self, f: &mut #1T::Formatter<'_>) -> #1T::Result\", RuntimeType.stdFmt) {\n                rust(\"\"\"let mut formatter = f.debug_struct(${builderName.dq()});\"\"\")\n                members.forEach { member ->\n                    val memberName = symbolProvider.toMemberName(member)\n                    // If the struct is marked sensitive all fields get redacted, otherwise each field is determined on its own\n                    val fieldValue =\n                        if (shape.shouldRedact(model)) {\n                            REDACTION\n                        } else {\n                            member.redactIfNecessary(\n                                model,\n                                \"self.$memberName\",\n                            )\n                        }\n\n                    rust(\n                        \"formatter.field(${memberName.dq()}, &$fieldValue);\",\n                    )\n                }\n                writeCustomizations(customizations, BuilderSection.AdditionalDebugFields(shape, \"formatter\"))\n                rust(\"formatter.finish()\")\n            }\n        }\n    }\n\n    private fun RustWriter.renderVecHelper(\n        member: MemberShape,\n        memberName: String,\n        coreType: RustType.Vec,\n    ) {\n        docs(\"Appends an item to `$memberName`.\")\n        rust(\"///\")\n        docs(\"To override the contents of this collection use [`${member.setterName()}`](Self::${member.setterName()}).\")\n        rust(\"///\")\n        documentShape(member, model, autoSuppressMissingDocs = false)\n        deprecatedShape(member)\n        val input = coreType.member.asArgument(\"input\")\n\n        rustBlock(\"pub fn $memberName(mut self, ${input.argument}) -> Self\") {\n            rustTemplate(\n                \"\"\"\n                let mut v = self.$memberName.unwrap_or_default();\n                v.push(${input.value});\n                self.$memberName = #{Some}(v);\n                self\n                \"\"\",\n                *preludeScope,\n            )\n        }\n    }\n\n    private fun RustWriter.renderMapHelper(\n        member: MemberShape,\n        memberName: String,\n        coreType: RustType.HashMap,\n    ) {\n        docs(\"Adds a key-value pair to `$memberName`.\")\n        rust(\"///\")\n        docs(\"To override the contents of this collection use [`${member.setterName()}`](Self::${member.setterName()}).\")\n        rust(\"///\")\n        documentShape(member, model, autoSuppressMissingDocs = false)\n        deprecatedShape(member)\n        val k = coreType.key.asArgument(\"k\")\n        val v = coreType.member.asArgument(\"v\")\n\n        rustBlock(\n            \"pub fn $memberName(mut self, ${k.argument}, ${v.argument}) -> Self\",\n        ) {\n            rustTemplate(\n                \"\"\"\n                let mut hash_map = self.$memberName.unwrap_or_default();\n                hash_map.insert(${k.value}, ${v.value});\n                self.$memberName = #{Some}(hash_map);\n                self\n                \"\"\",\n                *preludeScope,\n            )\n        }\n    }\n\n    private fun trulyRequired(member: MemberShape) =\n        symbolProvider.toSymbol(member).let {\n            !it.isOptional() && !it.canUseDefault()\n        }\n\n    /**\n     * The core builder of the inner type. If the structure requires a fallible builder, this may use `?` to return\n     * errors.\n     * ```rust\n     * SomeStruct {\n     *    field1: builder.field1,\n     *    field2: builder.field2.unwrap_or_default()\n     *    field3: builder.field3.ok_or(\"field3 is required when building SomeStruct\")?\n     * }\n     * ```\n     */\n    private fun coreBuilder(writer: RustWriter) {\n        writer.rustBlock(\"#T\", structureSymbol) {\n            members.forEach { member ->\n                val memberName = symbolProvider.toMemberName(member)\n                val memberSymbol = symbolProvider.toSymbol(member)\n                withBlock(\"$memberName: self.$memberName\", \",\") {\n                    val generator = DefaultValueGenerator(runtimeConfig, symbolProvider, model)\n                    val default = generator.defaultValue(member)\n                    if (!memberSymbol.isOptional()) {\n                        if (default != null) {\n                            if (default.isRustDefault) {\n                                rust(\".unwrap_or_default()\")\n                            } else if (default.complexType) {\n                                rust(\".unwrap_or_else(|| #T)\", default.expr)\n                            } else {\n                                rust(\".unwrap_or(#T)\", default.expr)\n                            }\n                        } else {\n                            withBlock(\n                                \".ok_or_else(||\",\n                                \")?\",\n                            ) { missingRequiredField(memberName) }\n                        }\n                    }\n                }\n            }\n            writeCustomizations(customizations, BuilderSection.AdditionalFieldsInBuild(shape))\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/BuilderInstantiator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy.generators\n\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\n\n/** Abstraction for instantiating builders.\n *\n * Builder abstractions vary—clients MAY use `build_with_error_correction`, e.g., and builders can vary in fallibility.\n * */\ninterface BuilderInstantiator {\n    /** Set a field on a builder. */\n    fun setField(\n        builder: String,\n        value: Writable,\n        field: MemberShape,\n    ): Writable\n\n    /** Finalize a builder, turning it into a built object\n     *  - In the case of builders-of-builders, the value should be returned directly\n     *  - If an error is returned, you MUST use `mapErr` to convert the error type\n     */\n    fun finalizeBuilder(\n        builder: String,\n        shape: StructureShape,\n        mapErr: Writable? = null,\n    ): Writable\n\n    /** Set a field on a builder using the `$setterName` method. $value will be passed directly. */\n    fun setFieldWithSetter(\n        builder: String,\n        value: Writable,\n        field: MemberShape,\n    ) = writable {\n        rustTemplate(\"$builder = $builder.${field.setterName()}(#{value})\", \"value\" to value)\n    }\n}\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/CargoTomlGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy.generators\n\nimport com.moandjiezana.toml.TomlWriter\nimport software.amazon.smithy.rust.codegen.core.Version\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.DependencyScope\nimport software.amazon.smithy.rust.codegen.core.rustlang.Feature\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.smithy.CoreRustSettings\nimport software.amazon.smithy.rust.codegen.core.util.deepMergeWith\n\n/**\n * Customizations to apply to the generated Cargo.toml file.\n *\n * This is a nested map of key/value that represents the properties in a crate manifest.\n * For example, the following\n *\n * ```kotlin\n * mapOf(\n *     \"package\" to mapOf(\n *         \"name\" to \"foo\",\n *         \"version\" to \"1.0.0\",\n *     )\n * )\n * ```\n *\n * is equivalent to\n *\n * ```toml\n * [package]\n * name = \"foo\"\n * version = \"1.0.0\"\n * ```\n */\ntypealias ManifestCustomizations = Map<String, Any?>\n\n/**\n * Generates the crate manifest Cargo.toml file.\n */\nclass CargoTomlGenerator(\n    private val moduleName: String,\n    private val moduleVersion: String,\n    private val moduleAuthors: List<String>,\n    private val moduleDescription: String?,\n    private val moduleLicense: String?,\n    private val moduleRepository: String?,\n    private val minimumSupportedRustVersion: String?,\n    private val protocolId: String?,\n    private val writer: RustWriter,\n    private val manifestCustomizations: ManifestCustomizations = emptyMap(),\n    private val dependencies: List<CargoDependency> = emptyList(),\n    private val features: List<Feature> = emptyList(),\n) {\n    constructor(\n        settings: CoreRustSettings,\n        protocolId: String?,\n        writer: RustWriter,\n        manifestCustomizations: ManifestCustomizations,\n        dependencies: List<CargoDependency>,\n        features: List<Feature>,\n    ) : this(\n        settings.moduleName,\n        settings.moduleVersion,\n        settings.moduleAuthors,\n        settings.moduleDescription,\n        settings.license,\n        settings.moduleRepository,\n        settings.minimumSupportedRustVersion,\n        protocolId,\n        writer,\n        manifestCustomizations,\n        dependencies,\n        features,\n    )\n\n    fun render() {\n        val cargoFeatures = features.map { it.name to it.deps }.toMutableList()\n        if (features.isNotEmpty()) {\n            cargoFeatures.add(\"default\" to features.filter { it.default }.map { it.name })\n        }\n\n        val cargoToml =\n            mapOf(\n                \"package\" to\n                    listOfNotNull(\n                        \"name\" to moduleName,\n                        \"version\" to moduleVersion,\n                        \"authors\" to moduleAuthors,\n                        moduleDescription?.let { \"description\" to it },\n                        \"edition\" to \"2021\",\n                        \"license\" to moduleLicense,\n                        \"repository\" to moduleRepository,\n                        minimumSupportedRustVersion?.let { \"rust-version\" to it },\n                        \"metadata\" to\n                            listOfNotNull(\n                                \"smithy\" to\n                                    listOfNotNull(\n                                        \"codegen-version\" to Version.fromDefaultResource().gitHash,\n                                        \"protocol\" to protocolId,\n                                    ).toMap(),\n                            ).toMap(),\n                    ).toMap(),\n                \"dependencies\" to\n                    dependencies.filter { it.scope == DependencyScope.Compile }\n                        .associate { it.name to it.toMap() },\n                \"build-dependencies\" to\n                    dependencies.filter { it.scope == DependencyScope.Build }\n                        .associate { it.name to it.toMap() },\n                \"dev-dependencies\" to\n                    dependencies.filter { it.scope == DependencyScope.Dev }\n                        .associate { it.name to it.toMap() },\n                \"features\" to cargoFeatures.toMap(),\n            ).deepMergeWith(manifestCustomizations)\n\n        writer.writeWithNoFormatting(TomlWriter().write(cargoToml))\n    }\n}\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/DefaultValueGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy.generators\n\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.BooleanShape\nimport software.amazon.smithy.model.shapes.EnumShape\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.NumberShape\nimport software.amazon.smithy.model.shapes.SimpleShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.Default\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig\nimport software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.defaultValue\n\nclass DefaultValueGenerator(\n    runtimeConfig: RuntimeConfig,\n    private val symbolProvider: RustSymbolProvider,\n    private val model: Model,\n) {\n    private val instantiator = PrimitiveInstantiator(runtimeConfig, symbolProvider)\n\n    data class DefaultValue(val isRustDefault: Boolean, val expr: Writable, val complexType: Boolean)\n\n    /** Returns the default value as set by the defaultValue trait */\n    fun defaultValue(member: MemberShape): DefaultValue? {\n        val target = model.expectShape(member.target)\n        val complexType =\n            when (target) {\n                is NumberShape, is EnumShape, is BooleanShape -> false\n                else -> true\n            }\n        return when (val default = symbolProvider.toSymbol(member).defaultValue()) {\n            is Default.NoDefault -> null\n            is Default.RustDefault -> DefaultValue(isRustDefault = true, writable(\"Default::default\"), complexType)\n            is Default.NonZeroDefault -> {\n                val instantiation = instantiator.instantiate(target as SimpleShape, default.value)\n                DefaultValue(isRustDefault = false, writable { rust(\"#T\", instantiation) }, complexType)\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/EnumGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy.generators\n\nimport software.amazon.smithy.codegen.core.Symbol\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.shapes.StringShape\nimport software.amazon.smithy.model.traits.DocumentationTrait\nimport software.amazon.smithy.model.traits.EnumDefinition\nimport software.amazon.smithy.model.traits.EnumTrait\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustMetadata\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.deprecatedShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.docs\nimport software.amazon.smithy.rust.codegen.core.rustlang.documentShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.escape\nimport software.amazon.smithy.rust.codegen.core.rustlang.rawRust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.MaybeRenamed\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\nimport software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.NamedCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.Section\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.writeCustomizations\nimport software.amazon.smithy.rust.codegen.core.smithy.expectRustMetadata\nimport software.amazon.smithy.rust.codegen.core.smithy.renamedFrom\nimport software.amazon.smithy.rust.codegen.core.util.REDACTION\nimport software.amazon.smithy.rust.codegen.core.util.dq\nimport software.amazon.smithy.rust.codegen.core.util.expectTrait\nimport software.amazon.smithy.rust.codegen.core.util.getTrait\nimport software.amazon.smithy.rust.codegen.core.util.orNull\nimport software.amazon.smithy.rust.codegen.core.util.shouldRedact\nimport software.amazon.smithy.rust.codegen.core.util.toPascalCase\n\n/** EnumGenerator customization sections */\nsealed class EnumSection(name: String) : Section(name) {\n    abstract val shape: Shape\n\n    /** Hook to add additional attributes to an enum member */\n    data class AdditionalMemberAttributes(override val shape: Shape, val definition: EnumDefinition) :\n        EnumSection(\"AdditionalMemberAttributes\")\n\n    /** Hook to add additional trait implementations */\n    data class AdditionalTraitImpls(override val shape: Shape) : EnumSection(\"AdditionalTraitImpls\")\n\n    /** Hook to add additional enum members */\n    data class AdditionalEnumMembers(override val shape: Shape) :\n        EnumSection(\"AdditionalEnumMembers\")\n}\n\n/** Customizations for EnumGenerator */\nabstract class EnumCustomization : NamedCustomization<EnumSection>()\n\ndata class EnumGeneratorContext(\n    val enumName: String,\n    val enumMeta: RustMetadata,\n    val enumTrait: EnumTrait,\n    val sortedMembers: List<EnumMemberModel>,\n)\n\n/**\n * Type of enum to generate\n *\n * In codegen-core, there are only `Infallible` enums. Server adds additional enum types, which\n * is why this class is abstract rather than sealed.\n */\nabstract class EnumType {\n    /** Returns a writable that implements `From<&str>` and/or `TryFrom<&str>` for the enum */\n    abstract fun implFromForStr(context: EnumGeneratorContext): Writable\n\n    /** Returns a writable that implements `FromStr` for the enum */\n    abstract fun implFromStr(context: EnumGeneratorContext): Writable\n\n    /** Returns a writable that implements `From<&str>` and/or `TryFrom<&str>` for the unnamed enum */\n    abstract fun implFromForStrForUnnamedEnum(context: EnumGeneratorContext): Writable\n\n    /** Returns a writable that implements `FromStr` for the unnamed enum */\n    abstract fun implFromStrForUnnamedEnum(context: EnumGeneratorContext): Writable\n\n    /** Optionally adds additional documentation to the `enum` docs */\n    open fun additionalDocs(context: EnumGeneratorContext): Writable = writable {}\n\n    /** Optionally adds additional enum members */\n    open fun additionalEnumMembers(context: EnumGeneratorContext): Writable = writable {}\n\n    /** Optionally adds match arms to the `as_str` match implementation for named enums */\n    open fun additionalAsStrMatchArms(context: EnumGeneratorContext): Writable = writable {}\n\n    /** Optionally add more attributes to the enum */\n    open fun additionalEnumAttributes(context: EnumGeneratorContext): List<Attribute> = emptyList()\n\n    /** Optionally add more impls to the enum */\n    open fun additionalEnumImpls(context: EnumGeneratorContext): Writable = writable {}\n}\n\n/** Model that wraps [EnumDefinition] to calculate and cache values required to generate the Rust enum source. */\nclass EnumMemberModel(\n    private val parentShape: Shape,\n    private val definition: EnumDefinition,\n    private val symbolProvider: RustSymbolProvider,\n    private val customizations: List<EnumCustomization>,\n) {\n    companion object {\n        /**\n         * Return the name of a given `enum` variant. Note that this refers to `enum` in the Smithy context\n         * where enum is a trait that can be applied to [StringShape] and not in the Rust context of an algebraic data type.\n         *\n         * Ordinarily, the symbol provider would determine this name, but the enum trait doesn't allow for this.\n         *\n         * TODO(https://github.com/smithy-lang/smithy-rs/issues/1700): Remove this function when refactoring to EnumShape.\n         */\n        @Deprecated(\"This function will go away when we handle EnumShape instead of EnumTrait\")\n        fun toEnumVariantName(\n            symbolProvider: RustSymbolProvider,\n            parentShape: Shape,\n            definition: EnumDefinition,\n        ): MaybeRenamed? {\n            val name = definition.name.orNull()?.toPascalCase() ?: return null\n            // Create a fake member shape for symbol look up until we refactor to use EnumShape\n            val fakeMemberShape =\n                MemberShape.builder().id(parentShape.id.withMember(name)).target(\"smithy.api#String\").build()\n            val symbol = symbolProvider.toSymbol(fakeMemberShape)\n            return MaybeRenamed(symbol.name, symbol.renamedFrom())\n        }\n    }\n    // Because enum variants always start with an upper case letter, they will never\n    // conflict with reserved words (which are always lower case), therefore, we never need\n    // to fall back to raw identifiers\n\n    val value: String get() = definition.value\n\n    fun name(): MaybeRenamed? = toEnumVariantName(symbolProvider, parentShape, definition)\n\n    private fun renderDocumentation(writer: RustWriter) {\n        val name =\n            checkNotNull(name()) { \"cannot generate docs for unnamed enum variants\" }\n        writer.docWithNote(\n            definition.documentation.orNull(),\n            name.renamedFrom?.let { renamedFrom ->\n                \"`::$renamedFrom` has been renamed to `::${name.name}`.\"\n            },\n        )\n    }\n\n    private fun renderDeprecated(writer: RustWriter) {\n        if (definition.isDeprecated) {\n            Attribute.Deprecated.render(writer)\n        }\n    }\n\n    fun derivedName() = checkNotNull(toEnumVariantName(symbolProvider, parentShape, definition)).name\n\n    fun render(writer: RustWriter) {\n        renderDocumentation(writer)\n        renderDeprecated(writer)\n        writer.writeCustomizations(\n            customizations,\n            EnumSection.AdditionalMemberAttributes(parentShape, definition),\n        )\n        writer.write(\"${derivedName()},\")\n    }\n}\n\nprivate fun RustWriter.docWithNote(\n    doc: String?,\n    note: String?,\n) {\n    if (doc.isNullOrBlank() && note.isNullOrBlank()) {\n        // If the model doesn't have any documentation for the shape, then suppress the missing docs lint\n        // since the lack of documentation is a modeling issue rather than a codegen issue.\n        rust(\"##[allow(missing_docs)] // documentation missing in model\")\n    } else {\n        doc?.also { docs(escape(it)) }\n        note?.also {\n            // Add a blank line between the docs and the note to visually differentiate\n            write(\"///\")\n            docs(\"_Note: ${it}_\")\n        }\n    }\n}\n\nopen class EnumGenerator(\n    private val model: Model,\n    private val symbolProvider: RustSymbolProvider,\n    private val shape: StringShape,\n    private val enumType: EnumType,\n    private val customizations: List<EnumCustomization>,\n) {\n    companion object {\n        /** Name of the function on the enum impl to get a vec of value names */\n        const val VALUES = \"values\"\n    }\n\n    private val enumTrait: EnumTrait = shape.expectTrait()\n    private val symbol: Symbol = symbolProvider.toSymbol(shape)\n    private val context =\n        EnumGeneratorContext(\n            enumName = symbol.name,\n            enumMeta = symbol.expectRustMetadata(),\n            enumTrait = enumTrait,\n            sortedMembers =\n                enumTrait.values.sortedBy { it.value }\n                    .map { EnumMemberModel(shape, it, symbolProvider, customizations) },\n        )\n\n    fun render(writer: RustWriter) {\n        enumType.additionalEnumAttributes(context).forEach { attribute ->\n            attribute.render(writer)\n        }\n        if (enumTrait.hasNames()) {\n            writer.renderNamedEnum()\n        } else {\n            writer.renderUnnamedEnum()\n        }\n        enumType.additionalEnumImpls(context)(writer)\n        writer.writeCustomizations(customizations, EnumSection.AdditionalTraitImpls(shape))\n\n        if (shape.shouldRedact(model)) {\n            writer.renderDebugImplForSensitiveEnum()\n        }\n    }\n\n    private fun RustWriter.renderNamedEnum() {\n        // pub enum Blah { V1, V2, .. }\n        renderEnum()\n        insertTrailingNewline()\n        // impl From<str> for Blah { ... }\n        enumType.implFromForStr(context)(this)\n        // impl FromStr for Blah { ... }\n        enumType.implFromStr(context)(this)\n        insertTrailingNewline()\n        // impl Blah { pub fn as_str(&self) -> &str\n        implBlock(\n            asStrImpl =\n                writable {\n                    rustBlock(\"match self\") {\n                        context.sortedMembers.forEach { member ->\n                            rawRust(\n                                \"\"\"${context.enumName}::${member.derivedName()} => ${member.value.dq()},\n                                \"\"\",\n                            )\n                        }\n                        enumType.additionalAsStrMatchArms(context)(this)\n                    }\n                },\n        )\n        rustTemplate(\n            \"\"\"\n            impl #{AsRef}<str> for ${context.enumName} {\n                fn as_ref(&self) -> &str {\n                    self.as_str()\n                }\n            }\n            \"\"\",\n            *preludeScope,\n        )\n    }\n\n    private fun RustWriter.renderUnnamedEnum() {\n        documentShape(shape, model)\n        deprecatedShape(shape)\n        context.enumMeta.render(this)\n        rust(\"struct ${context.enumName}(String);\")\n        implBlock(\n            asStrImpl =\n                writable {\n                    rust(\"&self.0\")\n                },\n        )\n        // impl From<str> for Blah { ... }\n        enumType.implFromForStrForUnnamedEnum(context)(this)\n        // impl FromStr for Blah { ... }\n        enumType.implFromStrForUnnamedEnum(context)(this)\n    }\n\n    private fun RustWriter.renderEnum() {\n        enumType.additionalDocs(context)(this)\n\n        val renamedWarning =\n            context.sortedMembers.mapNotNull { it.name() }.filter { it.renamedFrom != null }.joinToString(\"\\n\") {\n                val previousName = it.renamedFrom!!\n                \"`${context.enumName}::$previousName` has been renamed to `::${it.name}`.\"\n            }\n        docWithNote(\n            shape.getTrait<DocumentationTrait>()?.value,\n            renamedWarning.ifBlank { null },\n        )\n        deprecatedShape(shape)\n\n        context.enumMeta.render(this)\n        rustBlock(\"enum ${context.enumName}\") {\n            context.sortedMembers.forEach { member -> member.render(this) }\n            writeCustomizations(\n                customizations,\n                EnumSection.AdditionalEnumMembers(shape),\n            )\n            enumType.additionalEnumMembers(context)(this)\n        }\n    }\n\n    private fun RustWriter.implBlock(asStrImpl: Writable) {\n        rustTemplate(\n            \"\"\"\n            impl ${context.enumName} {\n                /// Returns the `&str` value of the enum member.\n                pub fn as_str(&self) -> &str {\n                    #{asStrImpl:W}\n                }\n                /// Returns all the `&str` representations of the enum members.\n                pub const fn $VALUES() -> &'static [&'static str] {\n                    &[#{Values:W}]\n                }\n            }\n            \"\"\",\n            \"asStrImpl\" to asStrImpl,\n            \"Values\" to\n                writable {\n                    rawRust(context.sortedMembers.joinToString(\", \") { it.value.dq() })\n                },\n        )\n    }\n\n    /**\n     * Manually implement the `Debug` trait for the enum if marked as sensitive.\n     *\n     * It prints the redacted text regardless of the variant it is asked to print.\n     */\n    private fun RustWriter.renderDebugImplForSensitiveEnum() {\n        rustTemplate(\n            \"\"\"\n            impl #{Debug} for ${context.enumName} {\n                fn fmt(&self, f: &mut #{StdFmt}::Formatter<'_>) -> #{StdFmt}::Result {\n                    ::std::write!(f, $REDACTION)\n                }\n            }\n            \"\"\",\n            \"Debug\" to RuntimeType.Debug,\n            \"StdFmt\" to RuntimeType.stdFmt,\n        )\n    }\n}\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/Instantiator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy.generators\n\nimport software.amazon.smithy.codegen.core.CodegenException\nimport software.amazon.smithy.codegen.core.SymbolProvider\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.node.ArrayNode\nimport software.amazon.smithy.model.node.Node\nimport software.amazon.smithy.model.node.NullNode\nimport software.amazon.smithy.model.node.NumberNode\nimport software.amazon.smithy.model.node.ObjectNode\nimport software.amazon.smithy.model.node.StringNode\nimport software.amazon.smithy.model.shapes.BigDecimalShape\nimport software.amazon.smithy.model.shapes.BigIntegerShape\nimport software.amazon.smithy.model.shapes.BlobShape\nimport software.amazon.smithy.model.shapes.BooleanShape\nimport software.amazon.smithy.model.shapes.CollectionShape\nimport software.amazon.smithy.model.shapes.DocumentShape\nimport software.amazon.smithy.model.shapes.DoubleShape\nimport software.amazon.smithy.model.shapes.EnumShape\nimport software.amazon.smithy.model.shapes.FloatShape\nimport software.amazon.smithy.model.shapes.ListShape\nimport software.amazon.smithy.model.shapes.MapShape\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.NumberShape\nimport software.amazon.smithy.model.shapes.SetShape\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.shapes.SimpleShape\nimport software.amazon.smithy.model.shapes.StringShape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.shapes.TimestampShape\nimport software.amazon.smithy.model.shapes.UnionShape\nimport software.amazon.smithy.model.traits.EnumTrait\nimport software.amazon.smithy.model.traits.HttpHeaderTrait\nimport software.amazon.smithy.model.traits.HttpPayloadTrait\nimport software.amazon.smithy.model.traits.HttpPrefixHeadersTrait\nimport software.amazon.smithy.model.traits.StreamingTrait\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustType\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.conditionalBlockTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.escape\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.stripOuter\nimport software.amazon.smithy.rust.codegen.core.rustlang.withBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.withBlockTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\nimport software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.NamedCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.Section\nimport software.amazon.smithy.rust.codegen.core.smithy.isOptional\nimport software.amazon.smithy.rust.codegen.core.smithy.rustType\nimport software.amazon.smithy.rust.codegen.core.util.dq\nimport software.amazon.smithy.rust.codegen.core.util.expectMember\nimport software.amazon.smithy.rust.codegen.core.util.expectTrait\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\nimport software.amazon.smithy.rust.codegen.core.util.isTargetUnit\nimport software.amazon.smithy.rust.codegen.core.util.letIf\nimport java.math.BigDecimal\nimport kotlin.jvm.optionals.getOrNull\n\n/**\n * Class describing an instantiator section that can be used in a customization.\n */\nsealed class InstantiatorSection(name: String) : Section(name) {\n    data class AfterInstantiatingValue(val shape: Shape) : InstantiatorSection(\"AfterInstantiatingValue\")\n}\n\n/**\n * Customization for the instantiator.\n */\ntypealias InstantiatorCustomization = NamedCustomization<InstantiatorSection>\n\n/**\n * Instantiator generates code to instantiate a given shape given a `Node` representing the value.\n *\n * This is only used during protocol test generation.\n */\nopen class Instantiator(\n    private val symbolProvider: RustSymbolProvider,\n    private val model: Model,\n    private val runtimeConfig: RuntimeConfig,\n    /** Behavior of the builder type used for structure shapes. */\n    private val builderKindBehavior: BuilderKindBehavior,\n    /** Fill out required fields with a default value. **/\n    private val defaultsForRequiredFields: Boolean = false,\n    private val customizations: List<InstantiatorCustomization> = listOf(),\n    private val constructPattern: InstantiatorConstructPattern = InstantiatorConstructPattern.BUILDER,\n    private val customWritable: CustomWritable = NoCustomWritable(),\n    /**\n     * A protocol test may provide data for missing members (because we transformed the model).\n     * This flag makes it so that it is simply ignored, and code generation continues.\n     **/\n    private val ignoreMissingMembers: Boolean = false,\n    /** Whether we're rendering within a test, in which case we should use dev-dependencies. */\n    private val withinTest: Boolean = false,\n) {\n    data class Ctx(\n        // The `http` crate requires that headers be lowercase, but Smithy protocol tests\n        // contain headers with uppercase keys.\n        val lowercaseMapKeys: Boolean = false,\n    )\n\n    /**\n     * A struct can be built by:\n     * * direct instantiation: A { field_1: value_1, field_2: value_2 }\n     * * its associated builder: A::builder().field_1(value_1).field_2(value_2).build()\n     */\n    enum class InstantiatorConstructPattern {\n        DIRECT,\n        BUILDER,\n    }\n\n    /**\n     * Client and server structures have different builder types. `Instantiator` needs to know how the builder\n     * type behaves to generate code for it.\n     */\n    interface BuilderKindBehavior {\n        fun hasFallibleBuilder(shape: StructureShape): Boolean\n\n        // Client structure builders have two kinds of setters: one that always takes in `Option<T>`, and one that takes\n        // in the structure field's type. The latter's method name is the field's name, whereas the former is prefixed\n        // with `set_`. Client instantiators call the `set_*` builder setters.\n        fun setterName(memberShape: MemberShape): String\n\n        fun doesSetterTakeInOption(memberShape: MemberShape): Boolean\n    }\n\n    /**\n     * Customize how each shape is rendered, instead of relying on static `Node` data.\n     */\n    interface CustomWritable {\n        // Return `null` to rely on the default behavior, which uses the static `Node` data.\n        fun generate(shape: Shape): Writable?\n    }\n\n    class NoCustomWritable : CustomWritable {\n        override fun generate(shape: Shape): Writable? = null\n    }\n\n    fun generate(\n        shape: Shape,\n        data: Node,\n        headers: Map<String, String> = mapOf(),\n        ctx: Ctx = Ctx(),\n    ) = writable {\n        render(this, shape, data, headers, ctx)\n    }\n\n    open fun render(\n        writer: RustWriter,\n        shape: Shape,\n        data: Node,\n        headers: Map<String, String> = mapOf(),\n        ctx: Ctx = Ctx(),\n    ) {\n        customWritable.generate(shape)\n            ?.let { it(writer) }\n            ?: run {\n                when (shape) {\n                    // Compound Shapes\n                    is StructureShape -> renderStructure(writer, shape, data as ObjectNode, headers, ctx)\n                    is UnionShape -> renderUnion(writer, shape, data as ObjectNode, ctx)\n\n                    // Collections\n                    is ListShape -> renderList(writer, shape, data as ArrayNode, ctx)\n                    is MapShape -> renderMap(writer, shape, data as ObjectNode, ctx)\n                    is SetShape -> renderSet(writer, shape, data as ArrayNode, ctx)\n\n                    // Members, supporting potentially optional members\n                    is MemberShape -> renderMember(writer, shape, data, ctx)\n\n                    is SimpleShape ->\n                        PrimitiveInstantiator(runtimeConfig, symbolProvider, withinTest).instantiate(\n                            shape,\n                            data,\n                            customWritable,\n                        )(writer)\n\n                    else -> writer.writeWithNoFormatting(\"todo!() /* $shape $data */\")\n                }\n            }\n    }\n\n    /**\n     * If the shape is optional: `Some(inner)` or `None`.\n     * Otherwise: `inner`.\n     */\n    private fun renderMember(\n        writer: RustWriter,\n        memberShape: MemberShape,\n        data: Node,\n        ctx: Ctx,\n    ) {\n        val targetShape = model.expectShape(memberShape.target)\n        val symbol = symbolProvider.toSymbol(memberShape)\n        customWritable.generate(memberShape)\n            ?.let { it(writer) }\n            ?: run {\n                if (data is NullNode && !targetShape.isDocumentShape) {\n                    check(symbol.isOptional()) {\n                        \"A null node was provided for $memberShape but the symbol was not optional. This is invalid input data.\"\n                    }\n                    writer.rustTemplate(\"#{None}\", *preludeScope)\n                } else {\n                    // Structure builder setters for structure shape members _always_ take in `Option<T>`.\n                    // Other aggregate shapes' members are optional only when their symbol is.\n                    writer.conditionalBlockTemplate(\n                        \"#{Some}(\",\n                        \")\",\n                        // The conditions are not commutative: note client builders always take in `Option<T>`.\n                        conditional =\n                            symbol.isOptional() ||\n                                (\n                                    model.expectShape(memberShape.container) is StructureShape &&\n                                        builderKindBehavior.doesSetterTakeInOption(\n                                            memberShape,\n                                        )\n                                ),\n                        *preludeScope,\n                    ) {\n                        writer.conditionalBlockTemplate(\n                            \"#{Box}::new(\",\n                            \")\",\n                            conditional = symbol.rustType().stripOuter<RustType.Option>() is RustType.Box,\n                            *preludeScope,\n                        ) {\n                            render(\n                                this,\n                                targetShape,\n                                data,\n                                mapOf(),\n                                ctx.copy()\n                                    .letIf(memberShape.hasTrait<HttpPrefixHeadersTrait>()) {\n                                        it.copy(lowercaseMapKeys = true)\n                                    },\n                            )\n                        }\n                    }\n                }\n            }\n    }\n\n    private fun renderSet(\n        writer: RustWriter,\n        shape: SetShape,\n        data: ArrayNode,\n        ctx: Ctx,\n    ) = renderList(writer, shape, data, ctx)\n\n    /**\n     * ```rust\n     * {\n     *      let mut ret = HashMap::new();\n     *      ret.insert(\"k\", ...);\n     *      ret.insert(\"k2\", ...);\n     *      ret\n     * }\n     * ```\n     */\n    private fun renderMap(\n        writer: RustWriter,\n        shape: MapShape,\n        data: ObjectNode,\n        ctx: Ctx,\n    ) {\n        if (data.members.isEmpty()) {\n            writer.rust(\"#T::new()\", RuntimeType.HashMap)\n        } else {\n            writer.rustBlock(\"\") {\n                rust(\"let mut ret = #T::new();\", RuntimeType.HashMap)\n                for ((key, value) in data.members) {\n                    withBlock(\"ret.insert(\", \");\") {\n                        renderMember(this, shape.key, key, ctx)\n                        when (ctx.lowercaseMapKeys) {\n                            true -> rust(\".to_ascii_lowercase(), \")\n                            else -> rust(\", \")\n                        }\n                        renderMember(this, shape.value, value, ctx)\n                    }\n                }\n                rust(\"ret\")\n            }\n        }\n    }\n\n    /**\n     * ```rust\n     * MyUnion::Variant(...)\n     * ```\n     */\n    private fun renderUnion(\n        writer: RustWriter,\n        shape: UnionShape,\n        data: ObjectNode,\n        ctx: Ctx,\n    ) {\n        val unionSymbol = symbolProvider.toSymbol(shape)\n\n        val variant =\n            if (defaultsForRequiredFields && data.members.isEmpty()) {\n                val (name, memberShape) = shape.allMembers.entries.first()\n                val targetShape = model.expectShape(memberShape.target)\n                Node.from(name) to fillDefaultValue(targetShape)\n            } else {\n                check(data.members.size == 1)\n                val entry = data.members.iterator().next()\n                entry.key to entry.value\n            }\n\n        val memberName = variant.first.value\n        val member = shape.expectMember(memberName)\n        writer.rust(\"#T::${symbolProvider.toMemberName(member)}\", unionSymbol)\n        // Unions should specify exactly one member.\n        if (!member.isTargetUnit()) {\n            writer.withBlock(\"(\", \")\") {\n                renderMember(this, member, variant.second, ctx)\n            }\n        }\n    }\n\n    /**\n     * ```rust\n     * vec![..., ..., ...]\n     * ```\n     */\n    private fun renderList(\n        writer: RustWriter,\n        shape: CollectionShape,\n        data: ArrayNode,\n        ctx: Ctx,\n    ) {\n        writer.withBlock(\"vec![\", \"]\") {\n            data.elements.forEach { v ->\n                renderMember(this, shape.member, v, ctx)\n                rust(\",\")\n            }\n        }\n        for (customization in customizations) {\n            customization.section(InstantiatorSection.AfterInstantiatingValue(shape))(writer)\n        }\n    }\n\n    /**\n     * ```rust\n     * MyStruct::builder().field_1(\"hello\").field_2(5).build()\n     * ```\n     */\n    private fun renderStructure(\n        writer: RustWriter,\n        shape: StructureShape,\n        data: ObjectNode,\n        headers: Map<String, String>,\n        ctx: Ctx,\n    ) {\n        when (constructPattern) {\n            InstantiatorConstructPattern.DIRECT ->\n                writer.withBlockTemplate(\"#{T} {\", \"}\", \"T\" to symbolProvider.toSymbol(shape)) {\n                    renderStructureMembers(writer, shape, data, headers, ctx)\n                }\n\n            InstantiatorConstructPattern.BUILDER -> {\n                writer.rust(\"#T::builder()\", symbolProvider.toSymbol(shape))\n\n                renderStructureMembers(writer, shape, data, headers, ctx)\n\n                writer.rust(\".build()\")\n                if (builderKindBehavior.hasFallibleBuilder(shape)) {\n                    writer.rust(\".unwrap()\")\n                }\n            }\n        }\n    }\n\n    protected fun renderStructureMembers(\n        writer: RustWriter,\n        shape: StructureShape,\n        data: ObjectNode,\n        headers: Map<String, String>,\n        ctx: Ctx,\n    ) {\n        val renderedMembers = mutableSetOf<MemberShape>()\n\n        fun renderMemberHelper(\n            memberShape: MemberShape,\n            value: Node,\n        ) {\n            renderedMembers.add(memberShape)\n            when (constructPattern) {\n                InstantiatorConstructPattern.DIRECT -> {\n                    val fieldName = symbolProvider.toMemberName(memberShape)\n                    writer.withBlock(\"$fieldName:\", \",\") {\n                        renderMember(this, memberShape, value, ctx)\n                    }\n                }\n\n                InstantiatorConstructPattern.BUILDER -> {\n                    val setterName = builderKindBehavior.setterName(memberShape)\n                    writer.withBlock(\".$setterName(\", \")\") {\n                        renderMember(this, memberShape, value, ctx)\n                    }\n                }\n            }\n        }\n\n        if (defaultsForRequiredFields) {\n            shape.allMembers.entries\n                .filter { (name, memberShape) ->\n                    !symbolProvider.toSymbol(memberShape).isOptional() && !data.members.containsKey(Node.from(name))\n                }\n                .forEach { (_, memberShape) ->\n                    renderMemberHelper(memberShape, fillDefaultValue(memberShape))\n                }\n        }\n\n        if (data.isEmpty) {\n            shape.allMembers.entries\n                .filter { it.value.hasTrait<HttpHeaderTrait>() }\n                .forEach { (_, value) ->\n                    val trait = value.expectTrait<HttpHeaderTrait>().value\n                    headers[trait]?.let { renderMemberHelper(value, Node.from(it)) }\n                }\n        }\n\n        for ((key, value) in data.members) {\n            val memberShape =\n                shape.getMember(key.value).getOrNull()\n                    ?: if (ignoreMissingMembers) {\n                        continue\n                    } else {\n                        throw CodegenException(\"Protocol test defines data for member shape `${key.value}`, but member shape was not found on structure shape ${shape.id}\")\n                    }\n            renderMemberHelper(memberShape, value)\n        }\n\n        shape.allMembers.entries\n            .firstOrNull {\n                it.value.hasTrait<HttpPayloadTrait>() &&\n                    !data.members.containsKey(Node.from(it.key)) &&\n                    model.expectShape(it.value.target) is StructureShape\n            }\n            ?.let {\n                renderMemberHelper(it.value, fillDefaultValue(model.expectShape(it.value.target)))\n            }\n\n        if (constructPattern == InstantiatorConstructPattern.DIRECT) {\n            val membersToRender = shape.allMembers.values.minus(renderedMembers)\n            check(membersToRender.all { it.isOptional })\n            membersToRender\n                .forEach { renderMemberHelper(it, Node.nullNode()) }\n        }\n    }\n\n    /**\n     * Returns a default value for a shape.\n     *\n     * Warning: this method does not take into account any constraint traits attached to the shape.\n     */\n    private fun fillDefaultValue(shape: Shape): Node =\n        when (shape) {\n            is MemberShape -> fillDefaultValue(model.expectShape(shape.target))\n\n            // Aggregate shapes.\n            is StructureShape -> Node.objectNode()\n            is UnionShape -> Node.objectNode()\n            is CollectionShape -> Node.arrayNode()\n            is MapShape -> Node.objectNode()\n\n            // Simple Shapes\n            is TimestampShape -> Node.from(0) // Number node for timestamp\n            is BlobShape -> Node.from(\"\") // String node for bytes\n            is StringShape -> Node.from(\"\")\n            is NumberShape -> Node.from(0)\n            is BooleanShape -> Node.from(false)\n            is DocumentShape -> Node.objectNode()\n            else -> throw CodegenException(\"Unrecognized shape `$shape`\")\n        }\n}\n\nclass PrimitiveInstantiator(\n    private val runtimeConfig: RuntimeConfig,\n    private val symbolProvider: SymbolProvider,\n    withinTest: Boolean = false,\n) {\n    val codegenScope =\n        listOf(\n            \"DateTime\" to RuntimeType.dateTime(runtimeConfig),\n            \"Bytestream\" to RuntimeType.byteStream(runtimeConfig),\n            \"Blob\" to RuntimeType.blob(runtimeConfig),\n            \"SmithyJson\" to RuntimeType.smithyJson(runtimeConfig),\n            \"SmithyTypes\" to RuntimeType.smithyTypes(runtimeConfig),\n        ).map {\n            it.first to\n                if (withinTest) {\n                    it.second.toDevDependencyType()\n                } else {\n                    it.second\n                }\n        }.toTypedArray()\n\n    fun instantiate(\n        shape: SimpleShape,\n        data: Node,\n        customWritable: Instantiator.CustomWritable = Instantiator.NoCustomWritable(),\n    ): Writable =\n        customWritable.generate(shape) ?: writable {\n            when (shape) {\n                // Simple Shapes\n                is TimestampShape -> {\n                    val node = (data as NumberNode)\n                    val num = BigDecimal(node.toString())\n                    val wholePart = num.toInt()\n                    val fractionalPart = num.remainder(BigDecimal.ONE)\n                    rustTemplate(\n                        \"#{DateTime}::from_fractional_secs($wholePart, ${fractionalPart}_f64)\",\n                        *codegenScope,\n                    )\n                }\n\n                /**\n                 * ```rust\n                 * Blob::new(\"arg\")\n                 * ```\n                 */\n                is BlobShape ->\n                    if (shape.hasTrait<StreamingTrait>()) {\n                        rustTemplate(\n                            \"#{Bytestream}::from_static(b${(data as StringNode).value.dq()})\",\n                            *codegenScope,\n                        )\n                    } else {\n                        rustTemplate(\n                            \"#{Blob}::new(${(data as StringNode).value.dq()})\",\n                            *codegenScope,\n                        )\n                    }\n\n                is StringShape -> renderString(shape, data as StringNode)(this)\n                is BigIntegerShape -> {\n                    val value = data.toString()\n                    rustTemplate(\n                        \"<#{BigInteger} as ::std::str::FromStr>::from_str(${value.dq()}).expect(\\\"Invalid string for BigInteger\\\")\",\n                        \"BigInteger\" to RuntimeType.bigInteger(runtimeConfig),\n                    )\n                }\n                is BigDecimalShape -> {\n                    val value = data.toString()\n                    rustTemplate(\n                        \"<#{BigDecimal} as ::std::str::FromStr>::from_str(${value.dq()}).expect(\\\"invalid string for BigDecimal\\\")\",\n                        \"BigDecimal\" to RuntimeType.bigDecimal(runtimeConfig),\n                    )\n                }\n                is NumberShape ->\n                    when (data) {\n                        is StringNode -> {\n                            val numberSymbol = symbolProvider.toSymbol(shape)\n                            // support Smithy custom values, such as Infinity\n                            rustTemplate(\n                                \"\"\"<#{NumberSymbol} as #{SmithyTypes}::primitive::Parse>::parse_smithy_primitive(${data.value.dq()}).expect(\"invalid string for number\")\"\"\",\n                                \"NumberSymbol\" to numberSymbol,\n                                *codegenScope,\n                            )\n                        }\n\n                        is NumberNode ->\n                            when (shape) {\n                                is FloatShape -> rust(\"${data.value}_f32\")\n                                is DoubleShape -> rust(\"${data.value}_f64\")\n                                else -> rust(data.value.toString())\n                            }\n                    }\n\n                is BooleanShape -> rust(data.asBooleanNode().get().toString())\n                is DocumentShape ->\n                    rustBlock(\"\") {\n                        val smithyJson = CargoDependency.smithyJson(runtimeConfig).toDevDependency().toType()\n                        rustTemplate(\n                            \"\"\"\n                            let json_bytes = br##\"${Node.prettyPrintJson(data)}\"##;\n                            let mut tokens = #{SmithyJson}::deserialize::json_token_iter(json_bytes).peekable();\n                            #{SmithyJson}::deserialize::token::expect_document(&mut tokens).expect(\"well formed json\")\n                            \"\"\",\n                            *codegenScope,\n                        )\n                    }\n            }\n        }\n\n    private fun renderString(\n        shape: StringShape,\n        arg: StringNode,\n    ): Writable =\n        {\n            val data = escape(arg.value).dq()\n            if (shape.hasTrait<EnumTrait>() || shape is EnumShape) {\n                val enumSymbol = symbolProvider.toSymbol(shape)\n                rust(\"\"\"$data.parse::<#T>().expect(\"static value validated to member\")\"\"\", enumSymbol)\n            } else {\n                rust(\"$data.to_owned()\")\n            }\n        }\n}\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/LibRsGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy.generators\n\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.traits.DocumentationTrait\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.containerDocs\nimport software.amazon.smithy.rust.codegen.core.rustlang.escape\nimport software.amazon.smithy.rust.codegen.core.rustlang.isNotEmpty\nimport software.amazon.smithy.rust.codegen.core.rustlang.rawRust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.smithy.CoreRustSettings\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.NamedCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.Section\nimport software.amazon.smithy.rust.codegen.core.util.getTrait\n\nsealed class ModuleDocSection {\n    data class ServiceDocs(val documentationTraitValue: String?) : ModuleDocSection()\n\n    object CrateOrganization : ModuleDocSection()\n\n    object Examples : ModuleDocSection()\n}\n\nsealed class LibRsSection(name: String) : Section(name) {\n    object Attributes : LibRsSection(\"Attributes\")\n\n    data class ModuleDoc(val subsection: ModuleDocSection) : LibRsSection(\"ModuleDoc\")\n\n    data class Body(val model: Model) : LibRsSection(\"Body\")\n}\n\ntypealias LibRsCustomization = NamedCustomization<LibRsSection>\n\nclass LibRsGenerator(\n    private val settings: CoreRustSettings,\n    private val model: Model,\n    private val customizations: List<LibRsCustomization>,\n    private val requireDocs: Boolean,\n) {\n    private fun docSection(section: ModuleDocSection): List<Writable> =\n        customizations\n            .map { customization -> customization.section(LibRsSection.ModuleDoc(section)) }\n            .filter { it.isNotEmpty() }\n\n    fun render(writer: RustWriter) {\n        writer.first {\n            customizations.forEach { it.section(LibRsSection.Attributes)(this) }\n            rust(\"##![forbid(unsafe_code)]\")\n            if (requireDocs) {\n                rust(\"##![warn(missing_docs)]\")\n            }\n            rawRust(\"#![cfg_attr(docsrs, feature(doc_cfg))]\")\n\n            // Allow for overriding the default service docs via customization\n            val defaultServiceDocs = settings.getService(model).getTrait<DocumentationTrait>()?.value\n            val serviceDocs = docSection(ModuleDocSection.ServiceDocs(defaultServiceDocs))\n            if (serviceDocs.isNotEmpty()) {\n                serviceDocs.forEach { writeTo ->\n                    writeTo(this)\n                }\n            } else {\n                containerDocs(escape(defaultServiceDocs ?: settings.moduleName))\n            }\n\n            // Crate Organization\n            docSection(ModuleDocSection.CrateOrganization).also { docs ->\n                if (docs.isNotEmpty()) {\n                    containerDocs(\"\\n## Crate Organization\")\n                    docs.forEach { writeTo ->\n                        writeTo(this)\n                    }\n                }\n            }\n\n            // Examples\n            docSection(ModuleDocSection.Examples).also { docs ->\n                if (docs.isNotEmpty() || settings.examplesUri != null) {\n                    containerDocs(\"\\n## Examples\")\n                    docs.forEach { writeTo ->\n                        writeTo(this)\n                    }\n\n                    // TODO(https://github.com/smithy-lang/smithy-rs/issues/69): Generate a basic example for all crates (eg. select first operation and render an example of usage)\n                    settings.examplesUri?.also { uri ->\n                        containerDocs(\"Examples can be found [here]($uri).\")\n                    }\n                }\n            }\n\n            // TODO(docs): Automated feature documentation\n        }\n        customizations.forEach { it.section(LibRsSection.Body(model))(writer) }\n    }\n}\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/StructureGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy.generators\n\nimport software.amazon.smithy.codegen.core.Symbol\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.traits.ErrorTrait\nimport software.amazon.smithy.model.traits.SensitiveTrait\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustType\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.asDeref\nimport software.amazon.smithy.rust.codegen.core.rustlang.asRef\nimport software.amazon.smithy.rust.codegen.core.rustlang.deprecatedShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.docs\nimport software.amazon.smithy.rust.codegen.core.rustlang.documentShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.innerReference\nimport software.amazon.smithy.rust.codegen.core.rustlang.isCopy\nimport software.amazon.smithy.rust.codegen.core.rustlang.isDeref\nimport software.amazon.smithy.rust.codegen.core.rustlang.render\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.stripOuter\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.NamedCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.Section\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.writeCustomizations\nimport software.amazon.smithy.rust.codegen.core.smithy.expectRustMetadata\nimport software.amazon.smithy.rust.codegen.core.smithy.renamedFrom\nimport software.amazon.smithy.rust.codegen.core.smithy.rustType\nimport software.amazon.smithy.rust.codegen.core.util.REDACTION\nimport software.amazon.smithy.rust.codegen.core.util.dq\nimport software.amazon.smithy.rust.codegen.core.util.getTrait\nimport software.amazon.smithy.rust.codegen.core.util.redactIfNecessary\nimport software.amazon.smithy.rust.codegen.core.util.shouldRedact\n\n/** StructureGenerator customization sections */\nsealed class StructureSection(name: String) : Section(name) {\n    abstract val shape: StructureShape\n\n    /** Hook to add additional fields to the structure */\n    data class AdditionalFields(override val shape: StructureShape) : StructureSection(\"AdditionalFields\")\n\n    /** Hook to add additional fields to the `Debug` impl */\n    data class AdditionalDebugFields(override val shape: StructureShape, val formatterName: String) :\n        StructureSection(\"AdditionalDebugFields\")\n\n    /** Hook to add additional trait impls to the structure */\n    data class AdditionalTraitImpls(override val shape: StructureShape, val structName: String) :\n        StructureSection(\"AdditionalTraitImpls\")\n}\n\n/** Customizations for StructureGenerator */\nabstract class StructureCustomization : NamedCustomization<StructureSection>()\n\ndata class StructSettings(val flattenVecAccessors: Boolean)\n\nopen class StructureGenerator(\n    val model: Model,\n    private val symbolProvider: RustSymbolProvider,\n    private val writer: RustWriter,\n    private val shape: StructureShape,\n    private val customizations: List<StructureCustomization>,\n    private val structSettings: StructSettings,\n) {\n    companion object {\n        /** Reserved struct member names */\n        val structureMemberNameMap: Map<String, String> =\n            mapOf(\n                \"build\" to \"build_value\",\n                \"builder\" to \"builder_value\",\n                \"default\" to \"default_value\",\n            )\n    }\n\n    private val errorTrait = shape.getTrait<ErrorTrait>()\n    protected val members: List<MemberShape> = shape.allMembers.values.toList()\n    private val accessorMembers: List<MemberShape> =\n        when (errorTrait) {\n            null -> members\n            // Let the ErrorGenerator render the error message accessor if this is an error struct\n            else -> members.filter { \"message\" != symbolProvider.toMemberName(it) }\n        }\n    protected val name: String = symbolProvider.toSymbol(shape).name\n\n    fun render() {\n        renderStructure()\n    }\n\n    /**\n     * Render a custom debug implementation\n     * When [SensitiveTrait] support is required, render a custom debug implementation to redact sensitive data\n     */\n    private fun renderDebugImpl() {\n        val lifetime = shape.lifetimeDeclaration(symbolProvider)\n        writer.rustBlock(\n            \"impl ${shape.lifetimeDeclaration(symbolProvider)} #T for $name $lifetime\",\n            RuntimeType.Debug,\n        ) {\n            writer.rustBlock(\"fn fmt(&self, f: &mut #1T::Formatter<'_>) -> #1T::Result\", RuntimeType.stdFmt) {\n                rust(\"\"\"let mut formatter = f.debug_struct(${name.dq()});\"\"\")\n\n                members.forEach { member ->\n                    val memberName = symbolProvider.toMemberName(member)\n                    // If the struct is marked sensitive all fields get redacted, otherwise each field is determined on its own\n                    val fieldValue =\n                        if (shape.shouldRedact(model)) {\n                            REDACTION\n                        } else {\n                            member.redactIfNecessary(\n                                model,\n                                \"self.$memberName\",\n                            )\n                        }\n\n                    rust(\n                        \"formatter.field(${memberName.dq()}, &$fieldValue);\",\n                    )\n                }\n                writeCustomizations(customizations, StructureSection.AdditionalDebugFields(shape, \"formatter\"))\n                rust(\"formatter.finish()\")\n            }\n        }\n    }\n\n    private fun renderStructureImpl() {\n        if (accessorMembers.isEmpty()) {\n            return\n        }\n        writer.rustBlock(\n            \"impl ${shape.lifetimeDeclaration(symbolProvider)} $name ${\n                shape.lifetimeDeclaration(\n                    symbolProvider,\n                )\n            }\",\n        ) {\n            // Render field accessor methods\n            forEachMember(accessorMembers) { member, memberName, memberSymbol ->\n                val memberType = memberSymbol.rustType()\n                var unwrapOrDefault = false\n                val returnType =\n                    when {\n                        // Automatically flatten vecs\n                        structSettings.flattenVecAccessors && memberType is RustType.Option && memberType.stripOuter<RustType.Option>() is RustType.Vec -> {\n                            unwrapOrDefault = true\n                            memberType.stripOuter<RustType.Option>().asDeref().asRef()\n                        }\n\n                        memberType.isCopy() -> memberType\n                        memberType is RustType.Option && memberType.member.isDeref() -> memberType.asDeref()\n                        memberType.isDeref() -> memberType.asDeref().asRef()\n                        else -> memberType.asRef()\n                    }\n                writer.renderMemberDoc(member, memberSymbol)\n                if (unwrapOrDefault) {\n                    // Add a newline\n                    writer.docs(\"\")\n                    writer.docs(\"If no value was sent for this field, a default will be set. If you want to determine if no value was sent, use `.$memberName.is_none()`.\")\n                }\n                writer.deprecatedShape(member)\n                writer.rustBlock(\"pub fn $memberName(&self) -> ${returnType.render()}\") {\n                    when {\n                        memberType.isCopy() -> rust(\"self.$memberName\")\n                        memberType is RustType.Option && memberType.member.isDeref() -> rust(\"self.$memberName.as_deref()\")\n                        memberType is RustType.Option -> rust(\"self.$memberName.as_ref()\")\n                        memberType.isDeref() -> rust(\"use std::ops::Deref; self.$memberName.deref()\")\n                        else -> rust(\"&self.$memberName\")\n                    }\n                    if (unwrapOrDefault) {\n                        rust(\".unwrap_or_default()\")\n                    }\n                }\n            }\n        }\n    }\n\n    open fun renderStructureMember(\n        writer: RustWriter,\n        member: MemberShape,\n        memberName: String,\n        memberSymbol: Symbol,\n    ) {\n        writer.renderMemberDoc(member, memberSymbol)\n        writer.deprecatedShape(member)\n        memberSymbol.expectRustMetadata().render(writer)\n        writer.write(\"$memberName: #T,\", memberSymbol)\n    }\n\n    open fun renderStructure() {\n        val symbol = symbolProvider.toSymbol(shape)\n        val containerMeta = symbol.expectRustMetadata()\n        writer.documentShape(shape, model)\n        writer.deprecatedShape(shape)\n        containerMeta.render(writer)\n\n        writer.rustBlock(\"struct $name ${shape.lifetimeDeclaration(symbolProvider)}\") {\n            writer.forEachMember(members) { member, memberName, memberSymbol ->\n                renderStructureMember(writer, member, memberName, memberSymbol)\n            }\n            writeCustomizations(customizations, StructureSection.AdditionalFields(shape))\n        }\n\n        renderStructureImpl()\n        if (!containerMeta.hasDebugDerive()) {\n            renderDebugImpl()\n        }\n\n        writer.writeCustomizations(customizations, StructureSection.AdditionalTraitImpls(shape, name))\n    }\n\n    protected fun RustWriter.forEachMember(\n        toIterate: List<MemberShape>,\n        block: RustWriter.(MemberShape, String, Symbol) -> Unit,\n    ) {\n        toIterate.forEach { member ->\n            val memberName = symbolProvider.toMemberName(member)\n            val memberSymbol = symbolProvider.toSymbol(member)\n            block(member, memberName, memberSymbol)\n        }\n    }\n\n    private fun RustWriter.renderMemberDoc(\n        member: MemberShape,\n        memberSymbol: Symbol,\n    ) {\n        documentShape(\n            member,\n            model,\n            note =\n                memberSymbol.renamedFrom()\n                    ?.let { oldName -> \"This member has been renamed from `$oldName`.\" },\n        )\n    }\n}\n\n/**\n * Search for lifetimes used by the members of the struct and generate a declaration.\n * e.g. `<'a, 'b>`\n */\nfun StructureShape.lifetimeDeclaration(symbolProvider: RustSymbolProvider): String {\n    val lifetimes =\n        this.members()\n            .mapNotNull { symbolProvider.toSymbol(it).rustType().innerReference()?.let { it as RustType.Reference } }\n            .mapNotNull { it.lifetime }\n            .toSet().sorted()\n    return if (lifetimes.isNotEmpty()) {\n        \"<${lifetimes.joinToString { \"'$it\" }}>\"\n    } else {\n        \"\"\n    }\n}\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/UnionGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy.generators\n\nimport software.amazon.smithy.codegen.core.Symbol\nimport software.amazon.smithy.codegen.core.SymbolProvider\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.UnionShape\nimport software.amazon.smithy.model.traits.SensitiveTrait\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.deprecatedShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.docs\nimport software.amazon.smithy.rust.codegen.core.rustlang.documentShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.render\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlockTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenTarget\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\nimport software.amazon.smithy.rust.codegen.core.smithy.expectRustMetadata\nimport software.amazon.smithy.rust.codegen.core.smithy.renamedFrom\nimport software.amazon.smithy.rust.codegen.core.smithy.rustType\nimport software.amazon.smithy.rust.codegen.core.util.REDACTION\nimport software.amazon.smithy.rust.codegen.core.util.dq\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\nimport software.amazon.smithy.rust.codegen.core.util.isTargetUnit\nimport software.amazon.smithy.rust.codegen.core.util.shouldRedact\nimport software.amazon.smithy.rust.codegen.core.util.toSnakeCase\n\nfun CodegenTarget.renderUnknownVariant() =\n    when (this) {\n        CodegenTarget.SERVER -> false\n        CodegenTarget.CLIENT -> true\n    }\n\n/**\n * Generate an `enum` for a Smithy Union Shape\n *\n * This generator will render a Rust enum representing [shape] when [render] is called. It will also render convenience\n * methods:\n * - `is_<variant>()`\n * - `as_<variant>()`\n *\n * for each variant.\n *\n * Finally, if `[renderUnknownVariant]` is true (the default), it will render an `Unknown` variant. This is used by\n * clients to allow response parsing to succeed, even if the server has added a new variant since the client was generated.\n */\nopen class UnionGenerator(\n    val model: Model,\n    private val symbolProvider: SymbolProvider,\n    private val writer: RustWriter,\n    private val shape: UnionShape,\n    private val renderUnknownVariant: Boolean = true,\n) {\n    private val sortedMembers: List<MemberShape> = shape.allMembers.values.sortedBy { symbolProvider.toMemberName(it) }\n    private val unionSymbol = symbolProvider.toSymbol(shape)\n\n    open fun render() {\n        writer.documentShape(shape, model)\n        writer.deprecatedShape(shape)\n\n        val containerMeta = unionSymbol.expectRustMetadata()\n        containerMeta.render(writer)\n\n        renderUnion(unionSymbol)\n        renderImplBlock(unionSymbol)\n        if (!containerMeta.hasDebugDerive()) {\n            if (shape.hasTrait<SensitiveTrait>()) {\n                renderFullyRedactedDebugImpl()\n            } else {\n                renderDebugImpl()\n            }\n        }\n    }\n\n    private fun renderUnion(unionSymbol: Symbol) {\n        writer.rustBlock(\"enum ${unionSymbol.name}\") {\n            sortedMembers.forEach { member ->\n                val memberSymbol = symbolProvider.toSymbol(member)\n                val note =\n                    memberSymbol.renamedFrom()?.let { oldName -> \"This variant has been renamed from `$oldName`.\" }\n                documentShape(member, model, note = note)\n                deprecatedShape(member)\n                memberSymbol.expectRustMetadata().renderAttributes(this)\n                writer.renderVariant(symbolProvider, member, memberSymbol)\n            }\n            if (renderUnknownVariant) {\n                docs(\"\"\"The `Unknown` variant represents cases where new union variant was received. Consider upgrading the SDK to the latest available version.\"\"\")\n                rust(\"/// An unknown enum variant\")\n                rust(\"///\")\n                rust(\"/// _Note: If you encounter this error, consider upgrading your SDK to the latest version._\")\n                rust(\"/// The `Unknown` variant represents cases where the server sent a value that wasn't recognized\")\n                rust(\"/// by the client. This can happen when the server adds new functionality, but the client has not been updated.\")\n                rust(\"/// To investigate this, consider turning on debug logging to print the raw HTTP response.\")\n                // at some point in the future, we may start actually putting things like the raw data in here.\n                Attribute.NonExhaustive.render(this)\n                rust(\"Unknown,\")\n            }\n        }\n    }\n\n    private fun renderImplBlock(unionSymbol: Symbol) {\n        writer.rustBlock(\"impl ${unionSymbol.name}\") {\n            sortedMembers.forEach { member ->\n                // We need to get the symbol first because the member can be renamed\n                val funcNamePart = symbolProvider.toSymbol(member).name.toSnakeCase()\n                val variantName = symbolProvider.toMemberName(member)\n\n                if (sortedMembers.size == 1) {\n                    Attribute.AllowIrrefutableLetPatterns.render(this)\n                }\n                writer.renderAsVariant(model, symbolProvider, member, variantName, funcNamePart, unionSymbol)\n                rust(\"/// Returns true if this is a [`$variantName`](#T::$variantName).\", unionSymbol)\n                rustBlock(\"pub fn is_$funcNamePart(&self) -> bool\") {\n                    rust(\"self.as_$funcNamePart().is_ok()\")\n                }\n            }\n            if (renderUnknownVariant) {\n                rust(\"/// Returns true if the enum instance is the `Unknown` variant.\")\n                rustBlock(\"pub fn is_unknown(&self) -> bool\") {\n                    rust(\"matches!(self, Self::Unknown)\")\n                }\n            }\n        }\n    }\n\n    private fun renderFullyRedactedDebugImpl() {\n        writer.rustTemplate(\n            \"\"\"\n            impl #{Debug} for ${unionSymbol.name} {\n                fn fmt(&self, f: &mut #{StdFmt}::Formatter<'_>) -> #{StdFmt}::Result {\n                    ::std::write!(f, $REDACTION)\n                }\n            }\n            \"\"\",\n            \"Debug\" to RuntimeType.Debug,\n            \"StdFmt\" to RuntimeType.stdFmt,\n        )\n    }\n\n    private fun renderDebugImpl() {\n        writer.rustBlock(\"impl #T for ${unionSymbol.name}\", RuntimeType.Debug) {\n            writer.rustBlock(\"fn fmt(&self, f: &mut #1T::Formatter<'_>) -> #1T::Result\", RuntimeType.stdFmt) {\n                rustBlock(\"match self\") {\n                    sortedMembers.forEach { member ->\n                        val memberName = symbolProvider.toMemberName(member)\n                        val shouldRedact = member.shouldRedact(model)\n                        val isTargetUnit = member.isTargetUnit()\n                        when {\n                            !shouldRedact && isTargetUnit -> rust(\"${unionSymbol.name}::$memberName => f.debug_tuple(${memberName.dq()}).finish(),\")\n                            !shouldRedact && !isTargetUnit -> rust(\"${unionSymbol.name}::$memberName(val) => f.debug_tuple(${memberName.dq()}).field(&val).finish(),\")\n                            // We can always render (_) because the Unit target in a Union cannot be marked as sensitive separately.\n                            else -> rust(\"${unionSymbol.name}::$memberName(_) => f.debug_tuple($REDACTION).finish(),\")\n                        }\n                    }\n                    if (renderUnknownVariant) {\n                        rust(\"${unionSymbol.name}::$UNKNOWN_VARIANT_NAME => f.debug_tuple(${UNKNOWN_VARIANT_NAME.dq()}).finish(),\")\n                    }\n                }\n            }\n        }\n    }\n\n    companion object {\n        const val UNKNOWN_VARIANT_NAME = \"Unknown\"\n    }\n}\n\nfun unknownVariantError(union: String) =\n    \"Cannot serialize `$union::${UnionGenerator.UNKNOWN_VARIANT_NAME}` for the request. \" +\n        \"The `Unknown` variant is intended for responses only. \" +\n        \"It occurs when an outdated client is used after a new enum variant was added on the server side.\"\n\nprivate fun RustWriter.renderVariant(\n    symbolProvider: SymbolProvider,\n    member: MemberShape,\n    memberSymbol: Symbol,\n) {\n    if (member.isTargetUnit()) {\n        write(\"${symbolProvider.toMemberName(member)},\")\n    } else {\n        write(\"${symbolProvider.toMemberName(member)}(#T),\", memberSymbol)\n    }\n}\n\nprivate fun RustWriter.renderAsVariant(\n    model: Model,\n    symbolProvider: SymbolProvider,\n    member: MemberShape,\n    variantName: String,\n    funcNamePart: String,\n    unionSymbol: Symbol,\n) {\n    if (member.isTargetUnit()) {\n        rust(\n            \"/// Tries to convert the enum instance into [`$variantName`](#T::$variantName), extracting the inner `()`.\",\n            unionSymbol,\n        )\n        rust(\"/// Returns `Err(&Self)` if it can't be converted.\")\n        rustBlockTemplate(\"pub fn as_$funcNamePart(&self) -> #{Result}<(), &Self>\", *preludeScope) {\n            rustTemplate(\n                \"if let ${unionSymbol.name}::$variantName = &self { #{Ok}(()) } else { #{Err}(self) }\",\n                *preludeScope,\n            )\n        }\n    } else {\n        val memberSymbol = symbolProvider.toSymbol(member)\n        val targetSymbol = symbolProvider.toSymbol(model.expectShape(member.target))\n        rust(\n            \"/// Tries to convert the enum instance into [`$variantName`](#T::$variantName), extracting the inner #D.\",\n            unionSymbol,\n            targetSymbol,\n        )\n        rust(\"/// Returns `Err(&Self)` if it can't be converted.\")\n        rustBlockTemplate(\n            \"pub fn as_$funcNamePart(&self) -> #{Result}<&${memberSymbol.rustType().render()}, &Self>\",\n            *preludeScope,\n        ) {\n            rustTemplate(\n                \"if let ${unionSymbol.name}::$variantName(val) = &self { #{Ok}(val) } else { #{Err}(self) }\",\n                *preludeScope,\n            )\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/error/ErrorImplGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy.generators.error\n\nimport software.amazon.smithy.codegen.core.Symbol\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.traits.ErrorTrait\nimport software.amazon.smithy.model.traits.RetryableTrait\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustType\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.asDeref\nimport software.amazon.smithy.rust.codegen.core.rustlang.render\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.stripOuter\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenTarget\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.StdError\nimport software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.NamedCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.Section\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.writeCustomizations\nimport software.amazon.smithy.rust.codegen.core.smithy.isOptional\nimport software.amazon.smithy.rust.codegen.core.smithy.mapRustType\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.serialize.ValueExpression\nimport software.amazon.smithy.rust.codegen.core.smithy.rustType\nimport software.amazon.smithy.rust.codegen.core.util.REDACTION\nimport software.amazon.smithy.rust.codegen.core.util.dq\nimport software.amazon.smithy.rust.codegen.core.util.errorMessageMember\nimport software.amazon.smithy.rust.codegen.core.util.getTrait\nimport software.amazon.smithy.rust.codegen.core.util.letIf\nimport software.amazon.smithy.rust.codegen.core.util.shouldRedact\n\n/** Error customization sections */\nsealed class ErrorImplSection(name: String) : Section(name) {\n    /** Use this section to add additional trait implementations to the generated error structures */\n    class ErrorAdditionalTraitImpls(val errorType: Symbol) : ErrorImplSection(\"ErrorAdditionalTraitImpls\")\n}\n\n/** Customizations for generated errors */\nabstract class ErrorImplCustomization : NamedCustomization<ErrorImplSection>()\n\nsealed class ErrorKind {\n    abstract fun writable(runtimeConfig: RuntimeConfig): Writable\n\n    object Throttling : ErrorKind() {\n        override fun writable(runtimeConfig: RuntimeConfig) =\n            writable { rust(\"#T::ThrottlingError\", RuntimeType.retryErrorKind(runtimeConfig)) }\n    }\n\n    object Client : ErrorKind() {\n        override fun writable(runtimeConfig: RuntimeConfig) =\n            writable { rust(\"#T::ClientError\", RuntimeType.retryErrorKind(runtimeConfig)) }\n    }\n\n    object Server : ErrorKind() {\n        override fun writable(runtimeConfig: RuntimeConfig) =\n            writable { rust(\"#T::ServerError\", RuntimeType.retryErrorKind(runtimeConfig)) }\n    }\n}\n\n/**\n * Returns the modeled retryKind for this shape\n *\n * This is _only_ non-null in cases where the @retryable trait has been applied.\n */\nfun StructureShape.modeledRetryKind(errorTrait: ErrorTrait): ErrorKind? {\n    val retryableTrait = this.getTrait<RetryableTrait>() ?: return null\n    return when {\n        retryableTrait.throttling -> ErrorKind.Throttling\n        errorTrait.isClientError -> ErrorKind.Client\n        errorTrait.isServerError -> ErrorKind.Server\n        // The error _must_ be either a client or server error\n        else -> TODO()\n    }\n}\n\nclass ErrorImplGenerator(\n    private val model: Model,\n    private val symbolProvider: RustSymbolProvider,\n    private val writer: RustWriter,\n    private val shape: StructureShape,\n    private val error: ErrorTrait,\n    private val customizations: List<ErrorImplCustomization>,\n) {\n    private val runtimeConfig = symbolProvider.config.runtimeConfig\n\n    fun render(forWhom: CodegenTarget = CodegenTarget.CLIENT) {\n        val symbol = symbolProvider.toSymbol(shape)\n        val messageShape = shape.errorMessageMember()\n        val errorKindT = RuntimeType.retryErrorKind(runtimeConfig)\n        writer.rustBlock(\"impl ${symbol.name}\") {\n            val retryKindWriteable = shape.modeledRetryKind(error)?.writable(runtimeConfig)\n            if (retryKindWriteable != null) {\n                rust(\"/// Returns `Some(${errorKindT.name})` if the error is retryable. Otherwise, returns `None`.\")\n                rustBlock(\"pub fn retryable_error_kind(&self) -> #T\", errorKindT) {\n                    retryKindWriteable(this)\n                }\n            }\n            if (messageShape != null) {\n                val messageSymbol = symbolProvider.toSymbol(messageShape).mapRustType { t -> t.asDeref() }\n                val messageType = messageSymbol.rustType()\n                val memberName = symbolProvider.toMemberName(messageShape)\n                val (returnType, message) =\n                    if (messageType.stripOuter<RustType.Option>() is RustType.Opaque) {\n                        // The string shape has a constraint trait that makes its symbol be a wrapper tuple struct.\n                        if (messageSymbol.isOptional()) {\n                            \"Option<&${messageType.stripOuter<RustType.Option>().render()}>\" to\n                                \"self.$memberName.as_ref()\"\n                        } else {\n                            \"&${messageType.render()}\" to \"&self.$memberName\"\n                        }\n                    } else {\n                        if (messageSymbol.isOptional()) {\n                            messageType.render() to \"self.$memberName.as_deref()\"\n                        } else {\n                            messageType.render() to \"self.$memberName.as_ref()\"\n                        }\n                    }\n\n                rust(\n                    \"\"\"\n                    /// Returns the error message.\n                    pub fn message(&self) -> $returnType { $message }\n                    \"\"\",\n                )\n            }\n\n            /*\n             * If we're generating for a server, the `name` method is added to enable\n             * recording encountered error types inside `http::Extensions`s.\n             */\n            if (forWhom == CodegenTarget.SERVER) {\n                rust(\n                    \"\"\"\n                    ##[doc(hidden)]\n                    /// Returns the error name.\n                    pub fn name(&self) -> &'static str {\n                        ${shape.id.name.dq()}\n                    }\n                    \"\"\",\n                )\n            }\n        }\n\n        writer.rustBlock(\"impl #T for ${symbol.name}\", RuntimeType.Display) {\n            rustBlock(\"fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result\") {\n                // If the error id and the Rust name don't match, print the actual error id for easy debugging\n                // Note: Exceptions cannot be renamed so it is OK to not call `getName(service)` here\n                val errorDesc =\n                    symbol.name.letIf(symbol.name != shape.id.name) { symbolName ->\n                        \"$symbolName [${shape.id.name}]\"\n                    }\n                write(\"::std::write!(f, ${errorDesc.dq()})?;\")\n                messageShape?.let {\n                    if (it.shouldRedact(model)) {\n                        write(\"\"\"::std::write!(f, \": {}\", $REDACTION)?;\"\"\")\n                    } else {\n                        ifSet(it, symbolProvider.toSymbol(it), ValueExpression.Reference(\"&self.message\")) { field ->\n                            val referenced = field.asRef()\n                            if (referenced.startsWith(\"&\")) {\n                                write(\"\"\"::std::write!(f, \": {}\", $referenced)?;\"\"\")\n                            } else {\n                                write(\"\"\"::std::write!(f, \": {$referenced}\")?;\"\"\")\n                            }\n                        }\n                    }\n                }\n                write(\"Ok(())\")\n            }\n        }\n\n        writer.write(\"impl #T for ${symbol.name} {}\", StdError)\n\n        writer.writeCustomizations(customizations, ErrorImplSection.ErrorAdditionalTraitImpls(symbol))\n    }\n}\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/http/HttpBindingGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy.generators.http\n\nimport software.amazon.smithy.codegen.core.CodegenException\nimport software.amazon.smithy.codegen.core.Symbol\nimport software.amazon.smithy.codegen.core.SymbolProvider\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.knowledge.HttpBinding\nimport software.amazon.smithy.model.knowledge.HttpBindingIndex\nimport software.amazon.smithy.model.shapes.BlobShape\nimport software.amazon.smithy.model.shapes.CollectionShape\nimport software.amazon.smithy.model.shapes.DocumentShape\nimport software.amazon.smithy.model.shapes.ListShape\nimport software.amazon.smithy.model.shapes.MapShape\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.shapes.SimpleShape\nimport software.amazon.smithy.model.shapes.StringShape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.shapes.UnionShape\nimport software.amazon.smithy.model.traits.EnumTrait\nimport software.amazon.smithy.model.traits.MediaTypeTrait\nimport software.amazon.smithy.model.traits.TimestampFormatTrait\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustType\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.asOptional\nimport software.amazon.smithy.rust.codegen.core.rustlang.conditionalBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.qualifiedName\nimport software.amazon.smithy.rust.codegen.core.rustlang.render\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlockTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.stripOuter\nimport software.amazon.smithy.rust.codegen.core.rustlang.withBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenContext\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenTarget\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.NamedCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.Section\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.OperationBuildError\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.operationBuildError\nimport software.amazon.smithy.rust.codegen.core.smithy.isOptional\nimport software.amazon.smithy.rust.codegen.core.smithy.makeOptional\nimport software.amazon.smithy.rust.codegen.core.smithy.mapRustType\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.HttpBindingDescriptor\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.HttpLocation\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.Protocol\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.ProtocolFunctions\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.parse.EventStreamUnmarshallerGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.serialize.SerializerUtil\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.serialize.ValueExpression\nimport software.amazon.smithy.rust.codegen.core.smithy.rustType\nimport software.amazon.smithy.rust.codegen.core.util.UNREACHABLE\nimport software.amazon.smithy.rust.codegen.core.util.dq\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\nimport software.amazon.smithy.rust.codegen.core.util.inputShape\nimport software.amazon.smithy.rust.codegen.core.util.isPrimitive\nimport software.amazon.smithy.rust.codegen.core.util.isStreaming\nimport software.amazon.smithy.rust.codegen.core.util.outputShape\nimport software.amazon.smithy.rust.codegen.core.util.redactIfNecessary\n\n/**\n * The type of HTTP message from which we are (de)serializing the HTTP-bound data.\n * We are either:\n *     - deserializing data from an HTTP request (we are a server),\n *     - deserializing data from an HTTP response (we are a client),\n *     - serializing data to an HTTP request (we are a client),\n *     - serializing data to an HTTP response (we are a server),\n */\nenum class HttpMessageType {\n    REQUEST,\n    RESPONSE,\n}\n\n/**\n * Class describing an HTTP binding (de)serialization section that can be used in a customization.\n */\nsealed class HttpBindingSection(name: String) : Section(name) {\n    data class BeforeIteratingOverMapShapeBoundWithHttpPrefixHeaders(val variableName: String, val shape: MapShape) :\n        HttpBindingSection(\"BeforeIteratingOverMapShapeBoundWithHttpPrefixHeaders\")\n\n    data class BeforeRenderingHeaderValue(var context: HttpBindingGenerator.HeaderValueSerializationContext) :\n        HttpBindingSection(\"BeforeRenderingHeaderValue\")\n\n    data class AfterDeserializingIntoAHashMapOfHttpPrefixHeaders(val memberShape: MemberShape) :\n        HttpBindingSection(\"AfterDeserializingIntoAHashMapOfHttpPrefixHeaders\")\n\n    data class AfterDeserializingIntoADateTimeOfHttpHeaders(val memberShape: MemberShape) :\n        HttpBindingSection(\"AfterDeserializingIntoADateTimeOfHttpHeaders\")\n\n    data class BeforeCreatingEventStreamReceiver(\n        val operationShape: OperationShape,\n        val unionShape: UnionShape,\n        val unmarshallerVariableName: String,\n    ) : HttpBindingSection(\"BeforeCreatingEventStreamReceiver\")\n}\n\ntypealias HttpBindingCustomization = NamedCustomization<HttpBindingSection>\n\n/**\n * This class generates Rust functions that (de)serialize data from/to an HTTP message.\n * They are useful for *both*:\n *     - servers (that deserialize HTTP requests and serialize HTTP responses); and\n *     - clients (that deserialize HTTP responses and serialize HTTP requests)\n * because the (de)serialization logic is entirely similar. In the cases where they _slightly_ differ,\n * the [HttpMessageType] enum is used to distinguish.\n *\n * For deserialization logic that is wholly different among clients and servers, use the classes:\n *     - [ServerRequestBindingGenerator] from the `codegen-server` project for servers; and\n *     - [ResponseBindingGenerator] from this project for clients\n * instead.\n *\n * For serialization logic that is wholly different among clients and servers, use the classes:\n *     - [ServerResponseBindingGenerator] from the `codegen-server` project for servers; and\n *     - [RequestBindingGenerator] from this project for clients\n * instead.\n */\nclass HttpBindingGenerator(\n    private val protocol: Protocol,\n    private val codegenContext: CodegenContext,\n    private val symbolProvider: SymbolProvider,\n    private val operationShape: OperationShape,\n    private val customizations: List<HttpBindingCustomization> = listOf(),\n) {\n    private val runtimeConfig = codegenContext.runtimeConfig\n    private val codegenTarget = codegenContext.target\n    private val model = codegenContext.model\n    private val index = HttpBindingIndex.of(model)\n    private val headerUtil = RuntimeType.smithyHttp(runtimeConfig).resolve(\"header\")\n    private val defaultTimestampFormat = TimestampFormatTrait.Format.EPOCH_SECONDS\n    private val protocolFunctions = ProtocolFunctions(codegenContext)\n    private val serializerUtil = SerializerUtil(model, symbolProvider)\n\n    /**\n     * Generate a function to deserialize [binding] from HTTP headers.\n     *\n     * The name of the resulting function is returned as a String.\n     *\n     * Generates a function like:\n     * ```rust\n     * fn parse_foo(headers: &http::HeaderMap) -> Result<Option<String>, ParseError> {\n     *   ...\n     * }\n     * ```\n     */\n    fun generateDeserializeHeaderFn(binding: HttpBindingDescriptor): RuntimeType {\n        check(binding.location == HttpLocation.HEADER)\n        val outputT = symbolProvider.toSymbol(binding.member).makeOptional()\n        return protocolFunctions.deserializeFn(binding.member, fnNameSuffix = \"header\") { fnName ->\n            rustBlockTemplate(\n                \"pub(crate) fn $fnName(header_map: &#{Headers}) -> #{Result}<#{Output}, #{header_util}::ParseError>\",\n                *preludeScope,\n                \"Headers\" to RuntimeType.smithyRuntimeApi(runtimeConfig).resolve(\"http::Headers\"),\n                \"Output\" to outputT,\n                \"header_util\" to headerUtil,\n            ) {\n                rust(\"let headers = header_map.get_all(${binding.locationName.dq()});\")\n                deserializeFromHeader(model.expectShape(binding.member.target), binding.member)\n            }\n        }\n    }\n\n    fun generateDeserializePrefixHeaderFn(binding: HttpBindingDescriptor): RuntimeType {\n        check(binding.location == HttpBinding.Location.PREFIX_HEADERS)\n        val outputSymbol = symbolProvider.toSymbol(binding.member)\n        val target = model.expectShape(binding.member.target)\n        check(target is MapShape)\n        val inner =\n            protocolFunctions.deserializeFn(binding.member, fnNameSuffix = \"inner\") { fnName ->\n                rustBlockTemplate(\n                    \"pub fn $fnName<'a>(headers: impl #{Iterator}<Item = &'a str>) -> std::result::Result<Option<#{Value}>, #{header_util}::ParseError>\",\n                    *preludeScope,\n                    \"Value\" to symbolProvider.toSymbol(model.expectShape(target.value.target)),\n                    \"header_util\" to headerUtil,\n                ) {\n                    deserializeFromHeader(model.expectShape(target.value.target), binding.member)\n                }\n            }\n        val returnTypeSymbol = outputSymbol.mapRustType { it.asOptional() }\n        return protocolFunctions.deserializeFn(binding.member, fnNameSuffix = \"prefix_header\") { fnName ->\n            rustBlockTemplate(\n                \"pub(crate) fn $fnName(header_map: &#{Headers}) -> std::result::Result<#{Value}, #{header_util}::ParseError>\",\n                \"Headers\" to RuntimeType.headers(runtimeConfig),\n                \"Value\" to returnTypeSymbol,\n                \"header_util\" to headerUtil,\n            ) {\n                rust(\n                    \"\"\"\n                    let headers = #T::headers_for_prefix(\n                        header_map.iter().map(|(k, _)| k),\n                        ${binding.locationName.dq()}\n                    );\n                    let out: std::result::Result<_, _> = headers.map(|(key, header_name)| {\n                        let values = header_map.get_all(header_name);\n                        #T(values).map(|v| (key.to_string(), v.expect(\n                            \"we have checked there is at least one value for this header name; please file a bug report under https://github.com/smithy-lang/smithy-rs/issues\"\n                        )))\n                    }).collect();\n                    \"\"\",\n                    headerUtil, inner,\n                )\n\n                for (customization in customizations) {\n                    customization.section(\n                        HttpBindingSection.AfterDeserializingIntoAHashMapOfHttpPrefixHeaders(binding.member),\n                    )(this)\n                }\n                rust(\"out.map(Some)\")\n            }\n        }\n    }\n\n    /**\n     * Generate a function to deserialize `[binding]` from the request / response payload.\n     */\n    fun generateDeserializePayloadFn(\n        binding: HttpBindingDescriptor,\n        errorSymbol: Symbol,\n        // Deserialize a single structure, union or document member marked as a payload\n        payloadParser: RustWriter.(String) -> Unit,\n        httpMessageType: HttpMessageType = HttpMessageType.RESPONSE,\n    ): RuntimeType {\n        check(binding.location == HttpBinding.Location.PAYLOAD)\n        return protocolFunctions.deserializeFn(binding.member, fnNameSuffix = \"payload\") { fnName ->\n            if (binding.member.isStreaming(model)) {\n                val outputT = symbolProvider.toSymbol(binding.member)\n                rustBlock(\n                    \"pub fn $fnName(body: &mut #T) -> std::result::Result<#T, #T>\",\n                    RuntimeType.sdkBody(runtimeConfig),\n                    outputT,\n                    errorSymbol,\n                ) {\n                    // Streaming unions are Event Streams and should be handled separately\n                    val target = model.expectShape(binding.member.target)\n                    if (target is UnionShape) {\n                        bindEventStreamOutput(operationShape, outputT, target)\n                    } else {\n                        deserializeStreamingBody(binding)\n                    }\n                }\n            } else {\n                // The output needs to be Optional when deserializing the payload body or the caller signature\n                // will not match.\n                val outputT = symbolProvider.toSymbol(binding.member).makeOptional()\n                rustBlock(\"pub(crate) fn $fnName(body: &[u8]) -> std::result::Result<#T, #T>\", outputT, errorSymbol) {\n                    deserializePayloadBody(\n                        binding,\n                        errorSymbol,\n                        structuredHandler = payloadParser,\n                        httpMessageType,\n                    )\n                }\n            }\n        }\n    }\n\n    private fun RustWriter.bindEventStreamOutput(\n        operationShape: OperationShape,\n        outputT: Symbol,\n        targetShape: UnionShape,\n    ) {\n        val unmarshallerConstructorFn =\n            EventStreamUnmarshallerGenerator(\n                protocol,\n                codegenContext,\n                operationShape,\n                targetShape,\n            ).render()\n        rustTemplate(\n            \"\"\"\n            let unmarshaller = #{unmarshallerConstructorFn}();\n            \"\"\",\n            \"unmarshallerConstructorFn\" to unmarshallerConstructorFn,\n        )\n\n        // Allow customizations to wrap the unmarshaller\n        for (customization in customizations) {\n            customization.section(\n                HttpBindingSection.BeforeCreatingEventStreamReceiver(\n                    operationShape,\n                    targetShape,\n                    \"unmarshaller\",\n                ),\n            )(this)\n        }\n\n        rustTemplate(\n            \"\"\"\n            let body = std::mem::replace(body, #{SdkBody}::taken());\n            let receiver = #{receiver:W};\n            Ok(receiver)\n            \"\"\",\n            \"SdkBody\" to RuntimeType.sdkBody(runtimeConfig),\n            \"receiver\" to\n                writable {\n                    if (codegenTarget == CodegenTarget.SERVER) {\n                        rust(\"${outputT.rustType().qualifiedName()}::new(unmarshaller, body)\")\n                    } else {\n                        rustTemplate(\n                            \"#{EventReceiver}::new(#{Receiver}::new(unmarshaller, body))\",\n                            \"EventReceiver\" to RuntimeType.eventReceiver(runtimeConfig),\n                            \"Receiver\" to RuntimeType.eventStreamReceiver(runtimeConfig),\n                        )\n                    }\n                },\n        )\n    }\n\n    private fun RustWriter.deserializeStreamingBody(binding: HttpBindingDescriptor) {\n        val member = binding.member\n        val targetShape = model.expectShape(member.target)\n        check(targetShape is BlobShape)\n        rustTemplate(\n            \"\"\"\n            // replace the body with an empty body\n            let body = std::mem::replace(body, #{SdkBody}::taken());\n            Ok(#{ByteStream}::new(body))\n            \"\"\",\n            \"ByteStream\" to symbolProvider.toSymbol(member), \"SdkBody\" to RuntimeType.sdkBody(runtimeConfig),\n        )\n    }\n\n    private fun RustWriter.deserializePayloadBody(\n        binding: HttpBindingDescriptor,\n        errorSymbol: Symbol,\n        structuredHandler: RustWriter.(String) -> Unit,\n        httpMessageType: HttpMessageType = HttpMessageType.RESPONSE,\n    ) {\n        val member = binding.member\n        val targetShape = model.expectShape(member.target)\n        // There is an unfortunate bit of dual behavior caused by an empty body causing the output to be `None` instead\n        // of an empty instance of the response type.\n        withBlock(\"(!body.is_empty()).then(||{\", \"}).transpose()\") {\n            when (targetShape) {\n                is StructureShape, is UnionShape, is DocumentShape -> this.structuredHandler(\"body\")\n                is StringShape -> {\n                    when (httpMessageType) {\n                        HttpMessageType.RESPONSE -> {\n                            rustTemplate(\n                                \"let body_str = std::str::from_utf8(body).map_err(#{error_symbol}::unhandled)?;\",\n                                \"error_symbol\" to errorSymbol,\n                            )\n                        }\n\n                        HttpMessageType.REQUEST -> {\n                            rust(\"let body_str = std::str::from_utf8(body)?;\")\n                        }\n                    }\n                    if (targetShape.hasTrait<EnumTrait>()) {\n                        // - In servers, `T` is an unconstrained `String` that will be constrained when building the\n                        //   builder.\n                        // - In clients, `T` will directly be the target generated enum type.\n                        rust(\n                            \"Ok(#T::from(body_str))\",\n                            symbolProvider.toSymbol(targetShape),\n                        )\n                    } else {\n                        rust(\"Ok(body_str.to_string())\")\n                    }\n                }\n\n                is BlobShape ->\n                    rust(\n                        \"Ok(#T::new(body))\",\n                        symbolProvider.toSymbol(targetShape),\n                    )\n                // `httpPayload` can be applied to set/map/list shapes.\n                // However, none of the AWS protocols support it.\n                // Smithy CLI will refuse to build the model if you apply the trait to these shapes, so this branch\n                // remains unreachable.\n                else -> UNREACHABLE(\"unexpected shape: $targetShape\")\n            }\n        }\n    }\n\n    /**\n     * Parse a value from a header.\n     * This function produces an expression which produces the precise type required by the target shape.\n     */\n    private fun RustWriter.deserializeFromHeader(\n        targetShape: Shape,\n        memberShape: MemberShape,\n    ) {\n        val rustType = symbolProvider.toSymbol(targetShape).rustType().stripOuter<RustType.Option>()\n        // Normally, we go through a flow that looks for `,`s but that's wrong if the output\n        // is just a single string (which might include `,`s.).\n        // MediaType doesn't include `,` since it's base64, send that through the normal path\n        if (targetShape is StringShape && !targetShape.hasTrait<MediaTypeTrait>()) {\n            rust(\"#T::one_or_none(headers)\", headerUtil)\n            return\n        }\n        val (coreType, coreShape) =\n            if (targetShape is CollectionShape) {\n                val coreShape = model.expectShape(targetShape.member.target)\n                symbolProvider.toSymbol(coreShape).rustType() to coreShape\n            } else {\n                rustType to targetShape\n            }\n        val parsedValue = safeName()\n        if (coreShape.isTimestampShape()) {\n            val timestampFormat =\n                index.determineTimestampFormat(\n                    memberShape,\n                    HttpBinding.Location.HEADER,\n                    defaultTimestampFormat,\n                )\n            val timestampFormatType = RuntimeType.parseTimestampFormat(codegenTarget, runtimeConfig, timestampFormat)\n            rust(\n                \"let $parsedValue: Vec<${coreType.render()}> = #T::many_dates(headers, #T)?\",\n                headerUtil,\n                timestampFormatType,\n            )\n            for (customization in customizations) {\n                customization.section(HttpBindingSection.AfterDeserializingIntoADateTimeOfHttpHeaders(memberShape))(this)\n            }\n            rust(\";\")\n        } else if (coreShape.isPrimitive()) {\n            rust(\n                \"let $parsedValue = #T::read_many_primitive::<${coreType.render()}>(headers)?;\",\n                headerUtil,\n            )\n        } else {\n            rust(\n                \"let $parsedValue: Vec<${coreType.render()}> = #T::read_many_from_str(headers)?;\",\n                headerUtil,\n            )\n            if (coreShape.hasTrait<MediaTypeTrait>()) {\n                rustTemplate(\n                    \"\"\"\n                    let $parsedValue: std::result::Result<Vec<_>, _> = $parsedValue\n                        .iter().map(|s|\n                            #{base_64_decode}(s).map_err(|_|#{header}::ParseError::new(\"failed to decode base64\"))\n                            .and_then(|bytes|String::from_utf8(bytes).map_err(|_|#{header}::ParseError::new(\"base64 encoded data was not valid utf-8\")))\n                        ).collect();\n                    \"\"\",\n                    \"base_64_decode\" to RuntimeType.base64Decode(runtimeConfig),\n                    \"header\" to headerUtil,\n                )\n                rust(\"let $parsedValue = $parsedValue?;\")\n            }\n        }\n        when (rustType) {\n            is RustType.Vec ->\n                rust(\n                    \"\"\"\n                    Ok(if !$parsedValue.is_empty() {\n                        Some($parsedValue)\n                    } else {\n                        None\n                    })\n                    \"\"\",\n                )\n\n            is RustType.HashSet ->\n                rust(\n                    \"\"\"\n                    Ok(if !$parsedValue.is_empty() {\n                        Some($parsedValue.into_iter().collect())\n                    } else {\n                        None\n                    })\n                    \"\"\",\n                )\n\n            else -> {\n                if (targetShape is ListShape) {\n                    // This is a constrained list shape and we must therefore be generating a server SDK.\n                    check(codegenTarget == CodegenTarget.SERVER)\n                    check(rustType is RustType.Opaque)\n                    rust(\n                        \"\"\"\n                        Ok(if !$parsedValue.is_empty() {\n                            Some(#T($parsedValue))\n                        } else {\n                            None\n                        })\n                        \"\"\",\n                        symbolProvider.toSymbol(targetShape),\n                    )\n                } else {\n                    check(targetShape is SimpleShape)\n                    rustTemplate(\n                        \"\"\"\n                        if $parsedValue.len() > 1 {\n                            Err(#{header_util}::ParseError::new(format!(\"expected one item but found {}\", $parsedValue.len())))\n                        } else {\n                            let mut $parsedValue = $parsedValue;\n                            Ok($parsedValue.pop())\n                        }\n                        \"\"\",\n                        \"header_util\" to headerUtil,\n                    )\n                }\n            }\n        }\n    }\n\n    /**\n     * Returns a function to set headers on an HTTP message for the given [shape].\n     * Returns null if no headers need to be set.\n     *\n     * [shape] can either be:\n     *     - an [OperationShape], in which case the header-bound data is in its input or output shape; or\n     *     - an error shape (i.e. a [StructureShape] with the `error` trait), in which case the header-bound data is in the shape itself.\n     */\n    fun generateAddHeadersFn(\n        shape: Shape,\n        httpMessageType: HttpMessageType = HttpMessageType.REQUEST,\n        serializeEmptyHeaders: Boolean = false,\n    ): RuntimeType? {\n        val (headerBindings, prefixHeaderBinding) =\n            when (httpMessageType) {\n                // Only a single structure member can be bound by `httpPrefixHeaders`, hence the `getOrNull(0)`.\n                HttpMessageType.REQUEST ->\n                    index.getRequestBindings(shape, HttpLocation.HEADER) to\n                        index.getRequestBindings(shape, HttpLocation.PREFIX_HEADERS).getOrNull(0)\n\n                HttpMessageType.RESPONSE ->\n                    index.getResponseBindings(shape, HttpLocation.HEADER) to\n                        index.getResponseBindings(shape, HttpLocation.PREFIX_HEADERS).getOrNull(0)\n            }\n\n        if (headerBindings.isEmpty() && prefixHeaderBinding == null) {\n            return null\n        }\n\n        // Skip if we need to serialize operation input's members in an initial message of event stream\n        // See https://smithy.io/2.0/spec/streaming.html#initial-request\n        if (shape is OperationShape &&\n            protocol.httpBindingResolver.handlesEventStreamInitialRequest(shape)\n        ) {\n            return null\n        }\n\n        return protocolFunctions.serializeFn(shape, fnNameSuffix = \"headers\") { fnName ->\n            // If the shape is an operation shape, the input symbol of the generated function is the input or output\n            // shape, which is the shape holding the header-bound data.\n            val shapeSymbol =\n                symbolProvider.toSymbol(\n                    if (shape is OperationShape) {\n                        when (httpMessageType) {\n                            HttpMessageType.REQUEST -> shape.inputShape(model)\n                            HttpMessageType.RESPONSE -> shape.outputShape(model)\n                        }\n                    } else {\n                        shape\n                    },\n                )\n            val codegenScope =\n                arrayOf(\n                    \"BuildError\" to runtimeConfig.operationBuildError(),\n                    HttpMessageType.REQUEST.name to RuntimeType.httpRequestBuilder(runtimeConfig),\n                    HttpMessageType.RESPONSE.name to RuntimeType.httpResponseBuilder(runtimeConfig),\n                    \"Shape\" to shapeSymbol,\n                )\n            rustBlockTemplate(\n                \"\"\"\n                pub fn $fnName(\n                    input: &#{Shape},\n                    mut builder: #{${httpMessageType.name}}\n                ) -> std::result::Result<#{${httpMessageType.name}}, #{BuildError}>\n                \"\"\",\n                *codegenScope,\n            ) {\n                headerBindings.forEach { httpBinding -> renderHeaders(httpBinding, serializeEmptyHeaders) }\n                if (prefixHeaderBinding != null) {\n                    renderPrefixHeader(prefixHeaderBinding)\n                }\n                rust(\"Ok(builder)\")\n            }\n        }\n    }\n\n    private fun RustWriter.renderHeaders(\n        httpBinding: HttpBinding,\n        serializeEmptyHeaders: Boolean,\n    ) {\n        check(httpBinding.location == HttpLocation.HEADER)\n        val memberShape = httpBinding.member\n        val targetShape = model.expectShape(memberShape.target)\n        val memberName = symbolProvider.toMemberName(memberShape)\n        val headerName = httpBinding.locationName\n        val timestampFormat =\n            index.determineTimestampFormat(memberShape, HttpBinding.Location.HEADER, defaultTimestampFormat)\n        val renderErrorMessage = { headerValueVariableName: String ->\n            OperationBuildError(runtimeConfig).invalidField(memberName) {\n                rust(\n                    \"\"\"\n                    format!(\n                        \"`{}` cannot be used as a header value: {}\",\n                        &${memberShape.redactIfNecessary(model, headerValueVariableName)},\n                        err\n                    )\n                    \"\"\",\n                )\n            }\n        }\n\n        val memberSymbol = symbolProvider.toSymbol(memberShape)\n        // If a header is of a primitive type and required (e.g. `bool`), we do not serialize it on the\n        // wire if it's set to the default value for that primitive type (e.g. `false` for `bool`).\n        // If the header is optional, instead, we want to serialize it if it has been set by the user to the\n        // default value for that primitive type (e.g. `Some(false)` for an `Option<bool>` header).\n        // If a header is multivalued, we always want to serialize its primitive members, regardless of their\n        // values.\n        ifSome(memberSymbol, ValueExpression.Reference(\"&input.$memberName\")) { variableName ->\n            if (targetShape is CollectionShape) {\n                renderMultiValuedHeader(\n                    model,\n                    headerName,\n                    variableName,\n                    targetShape,\n                    timestampFormat,\n                    renderErrorMessage,\n                    serializeEmptyHeaders,\n                )\n            } else {\n                renderHeaderValue(\n                    headerName,\n                    variableName,\n                    targetShape,\n                    false,\n                    timestampFormat,\n                    renderErrorMessage,\n                    serializeIfDefault = memberSymbol.isOptional(),\n                    memberShape,\n                    serializeEmptyHeaders,\n                )\n            }\n        }\n    }\n\n    private fun RustWriter.renderMultiValuedHeader(\n        model: Model,\n        headerName: String,\n        value: ValueExpression,\n        shape: CollectionShape,\n        timestampFormat: TimestampFormatTrait.Format,\n        renderErrorMessage: (String) -> Writable,\n        serializeEmptyHeaders: Boolean,\n    ) {\n        val loopVariable = ValueExpression.Reference(safeName(\"inner\"))\n        val context = HeaderValueSerializationContext(value, shape)\n        for (customization in customizations) {\n            customization.section(\n                HttpBindingSection.BeforeRenderingHeaderValue(context),\n            )(this)\n        }\n\n        // Conditionally wrap the header generation in a block that handles empty header values if\n        // `serializeEmptyHeaders` is true\n        conditionalBlock(\n            \"\"\"\n            // Empty vec in header is serialized as an empty string\n            if ${context.valueExpression.name}.is_empty() {\n                builder = builder.header(\"$headerName\", \"\");\n            } else {\"\"\",\n            \"}\", conditional = serializeEmptyHeaders,\n        ) {\n            rustBlock(\"for ${loopVariable.name} in ${context.valueExpression.asRef()}\") {\n                this.renderHeaderValue(\n                    headerName,\n                    loopVariable,\n                    model.expectShape(shape.member.target),\n                    isMultiValuedHeader = true,\n                    timestampFormat,\n                    renderErrorMessage,\n                    serializeIfDefault = true,\n                    shape.member,\n                    serializeEmptyHeaders,\n                )\n            }\n        }\n    }\n\n    data class HeaderValueSerializationContext(\n        /** Expression representing the value to write to the JsonValueWriter */\n        var valueExpression: ValueExpression,\n        /** Path in the JSON to get here, used for errors */\n        val shape: Shape,\n    )\n\n    private fun RustWriter.renderHeaderValue(\n        headerName: String,\n        value: ValueExpression,\n        shape: Shape,\n        isMultiValuedHeader: Boolean,\n        timestampFormat: TimestampFormatTrait.Format,\n        renderErrorMessage: (String) -> Writable,\n        serializeIfDefault: Boolean,\n        memberShape: MemberShape,\n        serializeEmptyHeaders: Boolean,\n    ) {\n        val context = HeaderValueSerializationContext(value, shape)\n        for (customization in customizations) {\n            customization.section(\n                HttpBindingSection.BeforeRenderingHeaderValue(context),\n            )(this)\n        }\n\n        val block: RustWriter.(value: ValueExpression) -> Unit = { variableName ->\n            if (shape.isPrimitive()) {\n                val encoder = RuntimeType.smithyTypes(runtimeConfig).resolve(\"primitive::Encoder\")\n                rust(\"let mut encoder = #T::from(${variableName.asValue()});\", encoder)\n            }\n            val formatted =\n                headerFmtFun(\n                    this,\n                    shape,\n                    timestampFormat,\n                    context.valueExpression.name,\n                    isMultiValuedHeader = isMultiValuedHeader,\n                )\n            val safeName = safeName(\"formatted\")\n\n            // If `serializeEmptyHeaders` is false we wrap header serialization in a `!foo.is_empty()` check and skip\n            // serialization if the header value is empty\n            rust(\"let $safeName = $formatted;\")\n            conditionalBlock(\"if !$safeName.is_empty() {\", \"}\", conditional = !serializeEmptyHeaders) {\n                rustTemplate(\n                    \"\"\"\n                    let header_value = $safeName;\n                    let header_value: #{HeaderValue} = header_value.parse().map_err(|err| {\n                        #{invalid_field_error:W}\n                    })?;\n                    builder = builder.header(\"$headerName\", header_value);\n\n                    \"\"\",\n                    \"HeaderValue\" to RuntimeType.http(runtimeConfig).resolve(\"HeaderValue\"),\n                    \"invalid_field_error\" to renderErrorMessage(\"header_value\"),\n                )\n            }\n        }\n        if (serializeIfDefault) {\n            block(context.valueExpression)\n        } else {\n            with(serializerUtil) {\n                ignoreDefaultsForNumbersAndBools(memberShape, context.valueExpression) {\n                    block(context.valueExpression)\n                }\n            }\n        }\n    }\n\n    private fun RustWriter.renderPrefixHeader(httpBinding: HttpBinding) {\n        check(httpBinding.location == HttpLocation.PREFIX_HEADERS)\n        val memberShape = httpBinding.member\n        val targetShape = model.expectShape(memberShape.target, MapShape::class.java)\n        val memberSymbol = symbolProvider.toSymbol(memberShape)\n        val memberName = symbolProvider.toMemberName(memberShape)\n        val valueTargetShape = model.expectShape(targetShape.value.target)\n        val timestampFormat =\n            index.determineTimestampFormat(memberShape, HttpBinding.Location.HEADER, defaultTimestampFormat)\n\n        ifSet(targetShape, memberSymbol, ValueExpression.Reference(\"&input.$memberName\")) { local ->\n            for (customization in customizations) {\n                customization.section(\n                    HttpBindingSection.BeforeIteratingOverMapShapeBoundWithHttpPrefixHeaders(local.name, targetShape),\n                )(this)\n            }\n            rustTemplate(\n                \"\"\"\n                for (k, v) in ${local.asRef()} {\n                    use std::str::FromStr;\n                    let header_name = #{HeaderName}::from_str(&format!(\"{}{}\", \"${httpBinding.locationName}\", &k)).map_err(|err| {\n                        #{invalid_header_name:W}\n                    })?;\n                    let header_value = ${\n                    headerFmtFun(\n                        this,\n                        valueTargetShape,\n                        timestampFormat,\n                        \"v\",\n                        isMultiValuedHeader = false,\n                    )\n                };\n                    let header_value: #{HeaderValue} = header_value.parse().map_err(|err| {\n                        #{invalid_header_value:W}\n                    })?;\n                    builder = builder.header(header_name, header_value);\n                }\n\n                \"\"\",\n                \"HeaderValue\" to RuntimeType.http(runtimeConfig).resolve(\"HeaderValue\"),\n                \"HeaderName\" to RuntimeType.http(runtimeConfig).resolve(\"HeaderName\"),\n                \"invalid_header_name\" to\n                    OperationBuildError(runtimeConfig).invalidField(memberName) {\n                        rust(\"\"\"format!(\"`{k}` cannot be used as a header name: {err}\")\"\"\")\n                    },\n                \"invalid_header_value\" to\n                    OperationBuildError(runtimeConfig).invalidField(memberName) {\n                        val maybeRedactedValue = memberShape.redactIfNecessary(model, \"v\")\n                        rust(\n                            \"\"\"\n                            format!(\n                                \"`{$maybeRedactedValue}` cannot be used as a header value: {err}\"\n                            )\n                            \"\"\",\n                        )\n                    },\n            )\n        }\n    }\n\n    /**\n     * Format [member] when used as an HTTP header.\n     */\n    private fun headerFmtFun(\n        writer: RustWriter,\n        target: Shape,\n        timestampFormat: TimestampFormatTrait.Format,\n        targetName: String,\n        isMultiValuedHeader: Boolean,\n    ): String {\n        fun quoteValue(value: String): String {\n            // Timestamp shapes are not quoted in header lists\n            return if (isMultiValuedHeader && !target.isTimestampShape) {\n                val quoteFn = writer.format(headerUtil.resolve(\"quote_header_value\"))\n                \"$quoteFn($value)\"\n            } else {\n                value\n            }\n        }\n        return when {\n            target.isStringShape -> {\n                if (target.hasTrait<MediaTypeTrait>()) {\n                    val func = writer.format(RuntimeType.base64Encode(runtimeConfig))\n                    \"$func($targetName)\"\n                } else {\n                    quoteValue(\"$targetName.as_str()\")\n                }\n            }\n\n            target.isTimestampShape -> {\n                val timestampFormatType = RuntimeType.serializeTimestampFormat(runtimeConfig, timestampFormat)\n                quoteValue(\"$targetName.fmt(${writer.format(timestampFormatType)})?\")\n            }\n\n            target.isListShape || target.isMemberShape -> {\n                throw IllegalArgumentException(\"lists should be handled at a higher level\")\n            }\n\n            target.isPrimitive() -> {\n                \"encoder.encode()\"\n            }\n\n            else -> throw CodegenException(\"unexpected shape: $target\")\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/protocol/ProtocolGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy.generators.protocol\n\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\n\n/** Allows for additional context to be given to the payload generator from where it is being called */\ninterface AdditionalPayloadContext\n\n/**\n * Payload Body Generator.\n *\n * Used to generate payloads that will go into HTTP bodies for HTTP requests (used by clients)\n * and responses (used by servers).\n *\n * **Note:** There is only one real implementation of this interface. The other implementation is test-only.\n * All protocols use the same class.\n *\n * Different protocols (e.g. JSON vs. XML) need to use different functionality to generate payload bodies.\n */\ninterface ProtocolPayloadGenerator {\n    data class PayloadMetadata(val takesOwnership: Boolean)\n\n    /**\n     * Code generation needs to handle whether [generatePayload] takes ownership of the input or output\n     * for a given operation shape.\n     *\n     * Most operations will use the HTTP payload as a reference, but for operations that will consume the entire stream\n     * later,they will need to take ownership and different code needs to be generated.\n     */\n    fun payloadMetadata(\n        operationShape: OperationShape,\n        additionalPayloadContext: AdditionalPayloadContext = object : AdditionalPayloadContext {},\n    ): PayloadMetadata\n\n    /**\n     * Write the payload into [writer].\n     *\n     * [shapeName] is the name of the variable binding for the Rust struct that is to be serialized into the payload.\n     *\n     * This should be an expression that returns bytes:\n     *     - a `Vec<u8>` for non-streaming operations; or\n     *     - a `ByteStream` for streaming operations.\n     */\n    fun generatePayload(\n        writer: RustWriter,\n        shapeName: String,\n        operationShape: OperationShape,\n        additionalPayloadContext: AdditionalPayloadContext = object : AdditionalPayloadContext {},\n    )\n}\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/protocol/ProtocolSupport.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy.generators.protocol\n\ndata class ProtocolSupport(\n    // Client support\n    val requestSerialization: Boolean,\n    val requestBodySerialization: Boolean,\n    val responseDeserialization: Boolean,\n    val errorDeserialization: Boolean,\n    // Server support\n    val requestDeserialization: Boolean,\n    val requestBodyDeserialization: Boolean,\n    val responseSerialization: Boolean,\n    val errorSerialization: Boolean,\n)\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/protocol/ProtocolTestGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy.generators.protocol\n\nimport software.amazon.smithy.model.knowledge.OperationIndex\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.protocoltests.traits.AppliesTo\nimport software.amazon.smithy.protocoltests.traits.HttpMalformedRequestTestCase\nimport software.amazon.smithy.protocoltests.traits.HttpMalformedRequestTestsTrait\nimport software.amazon.smithy.protocoltests.traits.HttpRequestTestCase\nimport software.amazon.smithy.protocoltests.traits.HttpRequestTestsTrait\nimport software.amazon.smithy.protocoltests.traits.HttpResponseTestCase\nimport software.amazon.smithy.protocoltests.traits.HttpResponseTestsTrait\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute.Companion.allow\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute.Companion.shouldPanic\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustModule\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.docs\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustInlineTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.withBlock\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenContext\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.testutil.testDependenciesOnly\nimport software.amazon.smithy.rust.codegen.core.util.PANIC\nimport software.amazon.smithy.rust.codegen.core.util.dq\nimport software.amazon.smithy.rust.codegen.core.util.getTrait\nimport software.amazon.smithy.rust.codegen.core.util.orNull\nimport software.amazon.smithy.rust.codegen.core.util.outputShape\nimport software.amazon.smithy.rust.codegen.core.util.toSnakeCase\nimport java.util.logging.Logger\n\n/**\n * Common interface to generate protocol tests for a given [operationShape].\n */\nabstract class ProtocolTestGenerator {\n    abstract val codegenContext: CodegenContext\n    abstract val protocolSupport: ProtocolSupport\n    abstract val operationShape: OperationShape\n    abstract val appliesTo: AppliesTo\n    abstract val logger: Logger\n\n    /**\n     * We expect these tests to fail due to shortcomings in our implementation.\n     * They will _fail_ if they pass, so we will discover and remove them if we fix them by accident.\n     */\n    abstract val expectFail: Set<FailingTest>\n\n    /**\n     * We expect these tests to fail because their definitions are broken.\n     * We map from a failing test to a \"hotfix\" function that can mutate the test in-memory and return a fixed version of it.\n     * The tests will _fail_ if they pass, so we will discover and remove the hotfix if we're updating to a newer\n     * version of Smithy where the test was fixed upstream.\n     */\n    abstract val brokenTests: Set<BrokenTest>\n\n    /** Only generate these tests; useful to temporarily set and shorten development cycles */\n    abstract val generateOnly: Set<String>\n\n    /**\n     * These tests are not even attempted to be generated, either because they will not compile\n     * or because they are flaky.\n     */\n    abstract val disabledTests: Set<String>\n\n    private val serviceShapeId: ShapeId\n        get() = codegenContext.serviceShape.id\n\n    /** The Rust module in which we should generate the protocol tests for [operationShape]. */\n    private fun protocolTestsModule(): RustModule.LeafModule {\n        val operationName = codegenContext.symbolProvider.toSymbol(operationShape).name\n        val testModuleName = \"${operationName.toSnakeCase()}_test\"\n        val additionalAttributes = listOf(Attribute(allow(\"unreachable_code\", \"unused_variables\")))\n        return RustModule.inlineTests(testModuleName, additionalAttributes = additionalAttributes)\n    }\n\n    /** The entry point to render the protocol tests, invoked by the code generators. */\n    fun render(writer: RustWriter) {\n        val allTests =\n            allMatchingTestCases().flatMap {\n                fixBrokenTestCase(it)\n            }\n                // Filter afterward in case a fixed broken test is disabled.\n                .filterMatching()\n        if (allTests.isEmpty()) {\n            return\n        }\n\n        writer.withInlineModule(protocolTestsModule(), null) {\n            renderAllTestCases(allTests)\n        }\n    }\n\n    /**\n     * This function applies a \"hotfix function\" to a broken test case before we synthesize it.\n     * Broken tests are those whose definitions in the `smithy-lang/smithy` repository are wrong.\n     * We try to contribute fixes upstream to pare down the list of broken tests.\n     * If the test is broken, we synthesize it in two versions: the original broken test with a `#[should_panic]`\n     * attribute, so get alerted if the test now passes, and the fixed version, which should pass.\n     */\n    private fun fixBrokenTestCase(it: TestCase): List<TestCase> =\n        if (!it.isBroken()) {\n            listOf(it)\n        } else {\n            logger.info(\"Fixing ${it.kind} test case ${it.id}\")\n\n            assert(it.expectFail())\n\n            val brokenTest = it.findInBroken()!!\n            var fixed = brokenTest.fixIt(it)\n\n            val intro = \"The hotfix function for broken test case ${it.kind} ${it.id}\"\n            val moreInfo =\n                \"\"\"This test case was identified to be broken in at least these Smithy versions: [${brokenTest.inAtLeast.joinToString()}].\n                |We are tracking things here: [${brokenTest.trackedIn.joinToString()}].\n                \"\"\".trimMargin()\n\n            // Something must change...\n            if (it == fixed) {\n                PANIC(\n                    \"\"\"$intro did not make any modifications. It is likely that the test case was\n                    |fixed upstream, and you're now updating the Smithy version; in this case, remove the hotfix\n                    |function, as the test is no longer broken.\n                    |$moreInfo\n                    \"\"\".trimMargin(),\n                )\n            }\n\n            // ... but the hotfix function is not allowed to change the test case kind...\n            if (it.kind != fixed.kind) {\n                PANIC(\n                    \"\"\"$intro changed the test case kind. This is not allowed.\n                    |$moreInfo\n                    \"\"\".trimMargin(),\n                )\n            }\n\n            // ... nor its id.\n            if (it.id != fixed.id) {\n                PANIC(\n                    \"\"\"$intro changed the test case id. This is not allowed.\n                    |$moreInfo\n                    \"\"\".trimMargin(),\n                )\n            }\n\n            // The latter is because we're going to generate the fixed version with an identifiable suffix.\n            fixed = fixed.suffixIdWith(\"_hotfixed\")\n\n            listOf(it, fixed)\n        }\n\n    /** Implementors should describe how to render the test cases. **/\n    abstract fun RustWriter.renderAllTestCases(allTests: List<TestCase>)\n\n    /** Filter out test cases that are disabled or don't match the service protocol. */\n    private fun List<TestCase>.filterMatching(): List<TestCase> =\n        if (generateOnly.isEmpty()) {\n            this.filter { testCase -> testCase.protocol == codegenContext.protocol && !disabledTests.contains(testCase.id) }\n        } else {\n            logger.warning(\"Generating only specified tests\")\n            this.filter { testCase -> generateOnly.contains(testCase.id) }\n        }\n\n    private fun TestCase.toFailingTest(): FailingTest =\n        when (this) {\n            is TestCase.MalformedRequestTest -> FailingTest.MalformedRequestTest(serviceShapeId.toString(), this.id)\n            is TestCase.RequestTest -> FailingTest.RequestTest(serviceShapeId.toString(), this.id)\n            is TestCase.ResponseTest -> FailingTest.ResponseTest(serviceShapeId.toString(), this.id)\n        }\n\n    /** Do we expect this test case to fail? */\n    private fun TestCase.expectFail(): Boolean = this.isBroken() || expectFail.contains(this.toFailingTest())\n\n    /** Is this test case broken? */\n    private fun TestCase.isBroken(): Boolean = this.findInBroken() != null\n\n    private fun TestCase.findInBroken(): BrokenTest? =\n        brokenTests.find { brokenTest ->\n            (this is TestCase.RequestTest && brokenTest is BrokenTest.RequestTest && this.id == brokenTest.id) ||\n                (this is TestCase.ResponseTest && brokenTest is BrokenTest.ResponseTest && this.id == brokenTest.id) ||\n                (this is TestCase.MalformedRequestTest && brokenTest is BrokenTest.MalformedRequestTest && this.id == brokenTest.id)\n        }\n\n    fun requestTestCases(): List<TestCase> {\n        val requestTests =\n            operationShape.getTrait<HttpRequestTestsTrait>()?.getTestCasesFor(appliesTo).orEmpty()\n                .map { TestCase.RequestTest(it) }\n        return requestTests\n    }\n\n    fun responseTestCases(): List<TestCase> {\n        val operationIndex = OperationIndex.of(codegenContext.model)\n        val outputShape = operationShape.outputShape(codegenContext.model)\n\n        // `@httpResponseTests` trait can apply to operation shapes and structure shapes with the `@error` trait.\n        // Find both kinds for the operation for which we're generating protocol tests.\n        val responseTestsOnOperations =\n            operationShape.getTrait<HttpResponseTestsTrait>()\n                ?.getTestCasesFor(appliesTo).orEmpty().map { TestCase.ResponseTest(it, outputShape) }\n        val responseTestsOnErrors =\n            operationIndex.getErrors(operationShape).flatMap { error ->\n                error.getTrait<HttpResponseTestsTrait>()\n                    ?.getTestCasesFor(appliesTo).orEmpty().map { TestCase.ResponseTest(it, error) }\n            }\n\n        return (responseTestsOnOperations + responseTestsOnErrors)\n    }\n\n    fun malformedRequestTestCases(): List<TestCase> {\n        // `@httpMalformedRequestTests` only make sense for servers.\n        val malformedRequestTests =\n            if (appliesTo == AppliesTo.SERVER) {\n                operationShape.getTrait<HttpMalformedRequestTestsTrait>()\n                    ?.testCases.orEmpty().map { TestCase.MalformedRequestTest(it) }\n            } else {\n                emptyList()\n            }\n        return malformedRequestTests\n    }\n\n    /**\n     * Parses from the model and returns all test cases for [operationShape] applying to the [appliesTo] artifact type\n     * that should be rendered by implementors.\n     **/\n    fun allMatchingTestCases(): List<TestCase> =\n        // Note there's no `@httpMalformedResponseTests`: https://github.com/smithy-lang/smithy/issues/2334\n        requestTestCases() + responseTestCases() + malformedRequestTestCases()\n\n    fun renderTestCaseBlock(\n        testCase: TestCase,\n        testModuleWriter: RustWriter,\n        block: Writable,\n    ) {\n        if (testCase.documentation != null) {\n            testModuleWriter.rust(\"\")\n            testModuleWriter.docs(testCase.documentation!!, templating = false)\n        }\n        testModuleWriter.docs(\"Test ID: ${testCase.id}\")\n\n        // The `#[traced_test]` macro desugars to using `tracing`, so we need to depend on the latter explicitly in\n        // case the code rendered by the test does not make use of `tracing` at all.\n        val tracingDevDependency = testDependenciesOnly { addDependency(CargoDependency.Tracing.toDevDependency()) }\n        testModuleWriter.rustInlineTemplate(\"#{TracingDevDependency:W}\", \"TracingDevDependency\" to tracingDevDependency)\n        Attribute.TokioTest.render(testModuleWriter)\n        Attribute.TracedTest.render(testModuleWriter)\n\n        if (testCase.expectFail()) {\n            shouldPanic().render(testModuleWriter)\n        }\n        val fnNameSuffix =\n            when (testCase) {\n                is TestCase.ResponseTest -> \"_response\"\n                is TestCase.RequestTest -> \"_request\"\n                is TestCase.MalformedRequestTest -> \"_malformed_request\"\n            }\n        testModuleWriter.rustBlock(\"async fn ${testCase.id.toSnakeCase()}$fnNameSuffix()\") {\n            block(this)\n        }\n    }\n\n    fun checkRequiredHeaders(\n        rustWriter: RustWriter,\n        actualExpression: String,\n        requireHeaders: List<String>,\n    ) {\n        basicCheck(\n            requireHeaders,\n            rustWriter,\n            \"required_headers\",\n            actualExpression,\n            \"require_headers\",\n        )\n    }\n\n    fun checkForbidHeaders(\n        rustWriter: RustWriter,\n        actualExpression: String,\n        forbidHeaders: List<String>,\n    ) {\n        basicCheck(\n            forbidHeaders,\n            rustWriter,\n            \"forbidden_headers\",\n            actualExpression,\n            \"forbid_headers\",\n        )\n    }\n\n    fun checkHeaders(\n        rustWriter: RustWriter,\n        actualExpression: String,\n        headers: Map<String, String>,\n    ) {\n        if (headers.isEmpty()) {\n            return\n        }\n        val variableName = \"expected_headers\"\n        rustWriter.withBlock(\"let $variableName = [\", \"];\") {\n            writeWithNoFormatting(\n                headers.entries.joinToString(\",\") {\n                    \"(${it.key.dq()}, ${it.value.dq()})\"\n                },\n            )\n        }\n        assertOk(rustWriter) {\n            write(\n                \"#T($actualExpression, $variableName)\",\n                RuntimeType.protocolTest(codegenContext.runtimeConfig, \"validate_headers\"),\n            )\n        }\n    }\n\n    fun basicCheck(\n        params: List<String>,\n        rustWriter: RustWriter,\n        expectedVariableName: String,\n        actualExpression: String,\n        checkFunction: String,\n    ) {\n        if (params.isEmpty()) {\n            return\n        }\n        rustWriter.withBlock(\"let $expectedVariableName = \", \";\") {\n            strSlice(this, params)\n        }\n        assertOk(rustWriter) {\n            rustWriter.rust(\n                \"#T($actualExpression, $expectedVariableName)\",\n                RuntimeType.protocolTest(codegenContext.runtimeConfig, checkFunction),\n            )\n        }\n    }\n\n    /**\n     * Wraps `inner` in a call to `aws_smithy_protocol_test::assert_ok`, a convenience wrapper\n     * for pretty printing protocol test helper results.\n     */\n    fun assertOk(\n        rustWriter: RustWriter,\n        inner: Writable,\n    ) {\n        rustWriter.rust(\"#T(\", RuntimeType.protocolTest(codegenContext.runtimeConfig, \"assert_ok\"))\n        inner(rustWriter)\n        rustWriter.write(\");\")\n    }\n\n    private fun strSlice(\n        writer: RustWriter,\n        args: List<String>,\n    ) {\n        writer.withBlock(\"&[\", \"]\") {\n            rust(args.joinToString(\",\") { it.dq() })\n        }\n    }\n}\n\nsealed class BrokenTest(\n    open val serviceShapeId: String,\n    open val id: String,\n    /** A non-exhaustive set of Smithy versions where the test was found to be broken. */\n    open val inAtLeast: Set<String>,\n    /**\n     * GitHub URLs related to the test brokenness, like a GitHub issue in Smithy where we reported the test was broken,\n     * or a PR where we fixed it.\n     **/\n    open val trackedIn: Set<String>,\n) {\n    data class RequestTest(\n        override val serviceShapeId: String,\n        override val id: String,\n        override val inAtLeast: Set<String>,\n        override val trackedIn: Set<String>,\n        val howToFixItFn: (TestCase.RequestTest) -> TestCase.RequestTest,\n    ) : BrokenTest(serviceShapeId, id, inAtLeast, trackedIn)\n\n    data class ResponseTest(\n        override val serviceShapeId: String,\n        override val id: String,\n        override val inAtLeast: Set<String>,\n        override val trackedIn: Set<String>,\n        val howToFixItFn: (TestCase.ResponseTest) -> TestCase.ResponseTest,\n    ) : BrokenTest(serviceShapeId, id, inAtLeast, trackedIn)\n\n    data class MalformedRequestTest(\n        override val serviceShapeId: String,\n        override val id: String,\n        override val inAtLeast: Set<String>,\n        override val trackedIn: Set<String>,\n        val howToFixItFn: (TestCase.MalformedRequestTest) -> TestCase.MalformedRequestTest,\n    ) : BrokenTest(serviceShapeId, id, inAtLeast, trackedIn)\n\n    fun fixIt(testToFix: TestCase): TestCase {\n        check(testToFix.id == this.id)\n        return when (this) {\n            is MalformedRequestTest -> howToFixItFn(testToFix as TestCase.MalformedRequestTest)\n            is RequestTest -> howToFixItFn(testToFix as TestCase.RequestTest)\n            is ResponseTest -> howToFixItFn(testToFix as TestCase.ResponseTest)\n        }\n    }\n}\n\n/**\n * Service shape IDs in common protocol test suites defined upstream.\n */\nobject ServiceShapeId {\n    const val AWS_JSON_10 = \"aws.protocoltests.json10#JsonRpc10\"\n    const val AWS_JSON_11 = \"aws.protocoltests.json#JsonProtocol\"\n    const val REST_JSON = \"aws.protocoltests.restjson#RestJson\"\n    const val RPC_V2_CBOR = \"smithy.protocoltests.rpcv2Cbor#RpcV2Protocol\"\n    const val RPC_V2_CBOR_EXTRAS = \"smithy.protocoltests.rpcv2Cbor#RpcV2CborService\"\n    const val REST_XML = \"aws.protocoltests.restxml#RestXml\"\n    const val AWS_QUERY = \"aws.protocoltests.query#AwsQuery\"\n    const val EC2_QUERY = \"aws.protocoltests.ec2#AwsEc2\"\n    const val REST_JSON_VALIDATION = \"aws.protocoltests.restjson.validation#RestJsonValidation\"\n}\n\nsealed class FailingTest(open val serviceShapeId: String, open val id: String) {\n    data class RequestTest(override val serviceShapeId: String, override val id: String) :\n        FailingTest(serviceShapeId, id)\n\n    data class ResponseTest(override val serviceShapeId: String, override val id: String) :\n        FailingTest(serviceShapeId, id)\n\n    data class MalformedRequestTest(override val serviceShapeId: String, override val id: String) :\n        FailingTest(serviceShapeId, id)\n}\n\nsealed class TestCaseKind {\n    data object Request : TestCaseKind()\n\n    data object Response : TestCaseKind()\n\n    data object MalformedRequest : TestCaseKind()\n}\n\nsealed class TestCase {\n    /*\n     * The properties of these data classes don't implement `equals()` usefully in Smithy, so we delegate to `equals()`\n     * of their `Node` representations.\n     */\n\n    data class RequestTest(val testCase: HttpRequestTestCase) : TestCase() {\n        override fun equals(other: Any?): Boolean {\n            if (this === other) return true\n            if (other !is RequestTest) return false\n            return testCase.toNode().equals(other.testCase.toNode())\n        }\n\n        override fun hashCode(): Int = testCase.hashCode()\n    }\n\n    data class ResponseTest(val testCase: HttpResponseTestCase, val targetShape: StructureShape) : TestCase() {\n        override fun equals(other: Any?): Boolean {\n            if (this === other) return true\n            if (other !is ResponseTest) return false\n            return testCase.toNode().equals(other.testCase.toNode())\n        }\n\n        override fun hashCode(): Int = testCase.hashCode()\n    }\n\n    data class MalformedRequestTest(val testCase: HttpMalformedRequestTestCase) : TestCase() {\n        override fun equals(other: Any?): Boolean {\n            if (this === other) return true\n            if (other !is MalformedRequestTest) return false\n            return this.protocol == other.protocol && this.id == other.id && this.documentation == other.documentation &&\n                this.testCase.request.toNode()\n                    .equals(other.testCase.request.toNode()) &&\n                this.testCase.response.toNode()\n                    .equals(other.testCase.response.toNode())\n        }\n\n        override fun hashCode(): Int = testCase.hashCode()\n    }\n\n    fun suffixIdWith(suffix: String): TestCase =\n        when (this) {\n            is RequestTest -> RequestTest(this.testCase.suffixIdWith(suffix))\n            is MalformedRequestTest -> MalformedRequestTest(this.testCase.suffixIdWith(suffix))\n            is ResponseTest -> ResponseTest(this.testCase.suffixIdWith(suffix), this.targetShape)\n        }\n\n    private fun HttpRequestTestCase.suffixIdWith(suffix: String): HttpRequestTestCase =\n        this.toBuilder().id(this.id + suffix).build()\n\n    private fun HttpResponseTestCase.suffixIdWith(suffix: String): HttpResponseTestCase =\n        this.toBuilder().id(this.id + suffix).build()\n\n    private fun HttpMalformedRequestTestCase.suffixIdWith(suffix: String): HttpMalformedRequestTestCase =\n        this.toBuilder().id(this.id + suffix).build()\n\n    /*\n     * `HttpRequestTestCase` and `HttpResponseTestCase` both implement `HttpMessageTestCase`, but\n     * `HttpMalformedRequestTestCase` doesn't, so we have to define the following trivial delegators to provide a nice\n     *  common accessor API.\n     */\n\n    val id: String\n        get() =\n            when (this) {\n                is RequestTest -> this.testCase.id\n                is MalformedRequestTest -> this.testCase.id\n                is ResponseTest -> this.testCase.id\n            }\n\n    val protocol: ShapeId\n        get() =\n            when (this) {\n                is RequestTest -> this.testCase.protocol\n                is MalformedRequestTest -> this.testCase.protocol\n                is ResponseTest -> this.testCase.protocol\n            }\n\n    val kind: TestCaseKind\n        get() =\n            when (this) {\n                is RequestTest -> TestCaseKind.Request\n                is ResponseTest -> TestCaseKind.Response\n                is MalformedRequestTest -> TestCaseKind.MalformedRequest\n            }\n\n    val documentation: String?\n        get() =\n            when (this) {\n                is RequestTest -> this.testCase.documentation.orNull()\n                is ResponseTest -> this.testCase.documentation.orNull()\n                is MalformedRequestTest -> this.testCase.documentation.orNull()\n            }\n\n    val tags: List<String>\n        get() =\n            when (this) {\n                is RequestTest -> this.testCase.tags\n                is ResponseTest -> this.testCase.tags\n                is MalformedRequestTest -> this.testCase.tags\n            }\n}\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/AwsJson.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy.protocols\n\nimport software.amazon.smithy.codegen.core.CodegenException\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.pattern.UriPattern\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.shapes.ToShapeId\nimport software.amazon.smithy.model.traits.HttpTrait\nimport software.amazon.smithy.model.traits.TimestampFormatTrait\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlockTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenContext\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenTarget\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.serializationError\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.parse.JsonParserGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.parse.StructuredDataParserGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.serialize.JsonSerializerGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.serialize.StructuredDataSerializerGenerator\nimport software.amazon.smithy.rust.codegen.core.util.hasEventStreamMember\nimport software.amazon.smithy.rust.codegen.core.util.inputShape\nimport software.amazon.smithy.rust.codegen.core.util.isInputEventStream\nimport software.amazon.smithy.rust.codegen.core.util.isOutputEventStream\nimport software.amazon.smithy.rust.codegen.core.util.isStreaming\n\nsealed class AwsJsonVersion {\n    abstract val value: String\n\n    object Json10 : AwsJsonVersion() {\n        override val value = \"1.0\"\n    }\n\n    object Json11 : AwsJsonVersion() {\n        override val value = \"1.1\"\n    }\n}\n\nclass AwsJsonHttpBindingResolver(\n    private val model: Model,\n    private val awsJsonVersion: AwsJsonVersion,\n    // TODO(https://github.com/smithy-lang/smithy-rs/issues/2237): Remove todoHandlingInitialMessages once the server supports non-streaming members\n    private val todoHandlingInitialMessages: Boolean,\n) : HttpBindingResolver {\n    private val httpTrait =\n        HttpTrait.builder()\n            .code(200)\n            .method(\"POST\")\n            .uri(UriPattern.parse(\"/\"))\n            .build()\n\n    private fun bindings(shape: ToShapeId): List<HttpBindingDescriptor> {\n        val members = shape.let { model.expectShape(it.toShapeId()) }.members()\n        // TODO(https://github.com/smithy-lang/smithy-rs/issues/2237): Remove the exception once the server supports non-streaming members\n        if (todoHandlingInitialMessages && members.size > 1 && members.any { it.isStreaming(model) }) {\n            throw CodegenException(\n                \"We only support one payload member if that payload contains a streaming member.\" +\n                    \"Tracking issue to relax this constraint: https://github.com/smithy-lang/smithy-rs/issues/2237\",\n            )\n        }\n\n        return members.map {\n            if (it.isStreaming(model)) {\n                HttpBindingDescriptor(it, HttpLocation.PAYLOAD, \"document\")\n            } else {\n                HttpBindingDescriptor(it, HttpLocation.DOCUMENT, \"document\")\n            }\n        }\n            .toList()\n    }\n\n    override fun httpTrait(operationShape: OperationShape): HttpTrait = httpTrait\n\n    override fun requestBindings(operationShape: OperationShape): List<HttpBindingDescriptor> =\n        bindings(operationShape.inputShape)\n\n    override fun responseBindings(operationShape: OperationShape): List<HttpBindingDescriptor> =\n        bindings(operationShape.outputShape)\n\n    override fun errorResponseBindings(errorShape: ToShapeId): List<HttpBindingDescriptor> = bindings(errorShape)\n\n    override fun requestContentType(operationShape: OperationShape): String =\n        \"application/x-amz-json-${awsJsonVersion.value}\"\n\n    override fun responseContentType(operationShape: OperationShape): String = requestContentType(operationShape)\n\n    override fun eventStreamMessageContentType(memberShape: MemberShape): String? =\n        ProtocolContentTypes.eventStreamMemberContentType(model, memberShape, \"application/json\")\n\n    override fun handlesEventStreamInitialRequest(shape: Shape): Boolean {\n        // True if the operation input contains an event stream member as well as non-event stream member.\n        return when (shape) {\n            is OperationShape -> {\n                shape.isInputEventStream(model) && requestBindings(shape).any { it.location == HttpLocation.DOCUMENT }\n            }\n\n            is StructureShape -> {\n                shape.hasEventStreamMember(model) && bindings(shape).any { it.location == HttpLocation.DOCUMENT }\n            }\n\n            else -> false\n        }\n    }\n\n    override fun handlesEventStreamInitialResponse(shape: Shape): Boolean {\n        // True if the operation output contains an event stream member.\n        // Note that this check is asymmetrical compared to `handlesEventStreamInitialRequest`, as it does not verify\n        // the presence of a non-event stream member to determine if the shape should handle the initial response.\n        // This is because the server may still send the initial response even when the operation output includes\n        // only the event stream member, so we need to defensively handle the initial response in all cases.\n        return when (shape) {\n            is OperationShape -> shape.isOutputEventStream(model)\n            is StructureShape -> shape.hasEventStreamMember(model)\n            else -> false\n        }\n    }\n}\n\n/**\n * AwsJson requires all empty inputs to be sent across as `{}`. This class\n * customizes wraps [JsonSerializerGenerator] to add this functionality.\n */\nclass AwsJsonSerializerGenerator(\n    private val codegenContext: CodegenContext,\n    httpBindingResolver: HttpBindingResolver,\n    private val jsonSerializerGenerator: JsonSerializerGenerator =\n        JsonSerializerGenerator(codegenContext, httpBindingResolver, ::awsJsonFieldName),\n) : StructuredDataSerializerGenerator by jsonSerializerGenerator {\n    private val runtimeConfig = codegenContext.runtimeConfig\n    private val codegenScope =\n        arrayOf(\n            \"Error\" to runtimeConfig.serializationError(),\n            \"SdkBody\" to RuntimeType.sdkBody(runtimeConfig),\n            *RuntimeType.preludeScope,\n        )\n    private val protocolFunctions = ProtocolFunctions(codegenContext)\n\n    override fun operationInputSerializer(operationShape: OperationShape): RuntimeType {\n        var serializer = jsonSerializerGenerator.operationInputSerializer(operationShape)\n        if (serializer == null) {\n            val inputShape = operationShape.inputShape(codegenContext.model)\n            serializer =\n                protocolFunctions.serializeFn(operationShape, fnNameSuffix = \"input\") { fnName ->\n                    rustBlockTemplate(\n                        \"pub fn $fnName(_input: &#{target}) -> #{Result}<#{SdkBody}, #{Error}>\",\n                        *codegenScope, \"target\" to codegenContext.symbolProvider.toSymbol(inputShape),\n                    ) {\n                        rustTemplate(\"\"\"Ok(#{SdkBody}::from(\"{}\"))\"\"\", *codegenScope)\n                    }\n                }\n        }\n        return serializer\n    }\n}\n\nopen class AwsJson(\n    val codegenContext: CodegenContext,\n    val awsJsonVersion: AwsJsonVersion,\n) : Protocol {\n    private val runtimeConfig = codegenContext.runtimeConfig\n    private val errorScope =\n        arrayOf(\n            \"Bytes\" to RuntimeType.Bytes,\n            \"ErrorMetadataBuilder\" to RuntimeType.errorMetadataBuilder(runtimeConfig),\n            \"Headers\" to RuntimeType.headers(runtimeConfig),\n            \"JsonError\" to\n                CargoDependency.smithyJson(runtimeConfig).toType()\n                    .resolve(\"deserialize::error::DeserializeError\"),\n            \"json_errors\" to RuntimeType.jsonErrors(runtimeConfig),\n            *RuntimeType.preludeScope,\n        )\n\n    val version: AwsJsonVersion get() = awsJsonVersion\n\n    override val httpBindingResolver: HttpBindingResolver =\n        AwsJsonHttpBindingResolver(codegenContext.model, awsJsonVersion, codegenContext.target == CodegenTarget.SERVER)\n\n    override val defaultTimestampFormat: TimestampFormatTrait.Format = TimestampFormatTrait.Format.EPOCH_SECONDS\n\n    override fun additionalRequestHeaders(operationShape: OperationShape): List<Pair<String, String>> =\n        listOf(\"x-amz-target\" to \"${codegenContext.serviceShape.id.name}.${operationShape.id.name}\")\n\n    override fun structuredDataParser(): StructuredDataParserGenerator =\n        JsonParserGenerator(\n            codegenContext,\n            httpBindingResolver,\n            ::awsJsonFieldName,\n        )\n\n    override fun structuredDataSerializer(): StructuredDataSerializerGenerator =\n        AwsJsonSerializerGenerator(codegenContext, httpBindingResolver)\n\n    override fun parseHttpErrorMetadata(operationShape: OperationShape): RuntimeType =\n        ProtocolFunctions.crossOperationFn(\"parse_http_error_metadata\") { fnName ->\n            rustTemplate(\n                \"\"\"\n                pub fn $fnName(_response_status: u16, response_headers: &#{Headers}, response_body: &[u8]) -> #{Result}<#{ErrorMetadataBuilder}, #{JsonError}> {\n                    #{json_errors}::parse_error_metadata(response_body, response_headers)\n                }\n                \"\"\",\n                *errorScope,\n            )\n        }\n\n    override fun parseEventStreamErrorMetadata(operationShape: OperationShape): RuntimeType =\n        ProtocolFunctions.crossOperationFn(\"parse_event_stream_error_metadata\") { fnName ->\n            // `HeaderMap::new()` doesn't allocate.\n            rustTemplate(\n                \"\"\"\n                pub fn $fnName(payload: &#{Bytes}) -> #{Result}<#{ErrorMetadataBuilder}, #{JsonError}> {\n                    #{json_errors}::parse_error_metadata(payload, &#{Headers}::new())\n                }\n                \"\"\",\n                *errorScope,\n            )\n        }\n}\n\nfun awsJsonFieldName(member: MemberShape): String = member.memberName\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/AwsQuery.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy.protocols\n\nimport software.amazon.smithy.aws.traits.protocols.AwsQueryErrorTrait\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.pattern.UriPattern\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.ToShapeId\nimport software.amazon.smithy.model.traits.HttpTrait\nimport software.amazon.smithy.model.traits.TimestampFormatTrait\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlockTemplate\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenContext\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.parse.AwsQueryParserGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.parse.StructuredDataParserGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.serialize.AwsQuerySerializerGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.serialize.StructuredDataSerializerGenerator\nimport software.amazon.smithy.rust.codegen.core.util.getTrait\n\nprivate val awsQueryHttpTrait =\n    HttpTrait.builder()\n        .code(200)\n        .method(\"POST\")\n        .uri(UriPattern.parse(\"/\"))\n        .build()\n\nclass AwsQueryBindingResolver(private val model: Model) :\n    StaticHttpBindingResolver(model, awsQueryHttpTrait, \"application/x-www-form-urlencoded\", \"text/xml\") {\n    override fun errorCode(errorShape: ToShapeId): String {\n        val error = model.expectShape(errorShape.toShapeId())\n        return error.getTrait<AwsQueryErrorTrait>()?.code ?: errorShape.toShapeId().name\n    }\n}\n\nclass AwsQueryProtocol(private val codegenContext: CodegenContext) : Protocol {\n    private val runtimeConfig = codegenContext.runtimeConfig\n    private val awsQueryErrors: RuntimeType = RuntimeType.wrappedXmlErrors(runtimeConfig)\n    private val errorScope =\n        arrayOf(\n            \"Bytes\" to RuntimeType.Bytes,\n            \"ErrorMetadataBuilder\" to RuntimeType.errorMetadataBuilder(runtimeConfig),\n            \"Headers\" to RuntimeType.headers(runtimeConfig),\n            \"XmlDecodeError\" to RuntimeType.smithyXml(runtimeConfig).resolve(\"decode::XmlDecodeError\"),\n            *RuntimeType.preludeScope,\n        )\n\n    override val httpBindingResolver: HttpBindingResolver = AwsQueryBindingResolver(codegenContext.model)\n\n    override val defaultTimestampFormat: TimestampFormatTrait.Format = TimestampFormatTrait.Format.DATE_TIME\n\n    override fun structuredDataParser(): StructuredDataParserGenerator =\n        AwsQueryParserGenerator(codegenContext, awsQueryErrors)\n\n    override fun structuredDataSerializer(): StructuredDataSerializerGenerator =\n        AwsQuerySerializerGenerator(codegenContext)\n\n    override fun parseHttpErrorMetadata(operationShape: OperationShape): RuntimeType =\n        ProtocolFunctions.crossOperationFn(\"parse_http_error_metadata\") { fnName ->\n            rustBlockTemplate(\n                \"pub fn $fnName(_response_status: u16, _response_headers: &#{Headers}, response_body: &[u8]) -> #{Result}<#{ErrorMetadataBuilder}, #{XmlDecodeError}>\",\n                *errorScope,\n            ) {\n                rust(\"#T::parse_error_metadata(response_body)\", awsQueryErrors)\n            }\n        }\n\n    override fun parseEventStreamErrorMetadata(operationShape: OperationShape): RuntimeType =\n        ProtocolFunctions.crossOperationFn(\"parse_event_stream_error_metadata\") { fnName ->\n            rustBlockTemplate(\n                \"pub fn $fnName(payload: &#{Bytes}) -> #{Result}<#{ErrorMetadataBuilder}, #{XmlDecodeError}>\",\n                *errorScope,\n            ) {\n                rust(\"#T::parse_error_metadata(payload.as_ref())\", awsQueryErrors)\n            }\n        }\n}\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/AwsQueryCompatible.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy.protocols\n\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.shapes.ToShapeId\nimport software.amazon.smithy.model.traits.HttpTrait\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenContext\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.parse.StructuredDataParserGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.serialize.StructuredDataSerializerGenerator\n\nclass AwsQueryCompatibleHttpBindingResolver(\n    private val awsQueryBindingResolver: AwsQueryBindingResolver,\n    private val targetProtocolHttpBinding: HttpBindingResolver,\n) : HttpBindingResolver {\n    override fun httpTrait(operationShape: OperationShape): HttpTrait =\n        targetProtocolHttpBinding.httpTrait(operationShape)\n\n    override fun requestBindings(operationShape: OperationShape): List<HttpBindingDescriptor> =\n        targetProtocolHttpBinding.requestBindings(operationShape)\n\n    override fun responseBindings(operationShape: OperationShape): List<HttpBindingDescriptor> =\n        targetProtocolHttpBinding.responseBindings(operationShape)\n\n    override fun errorResponseBindings(errorShape: ToShapeId): List<HttpBindingDescriptor> =\n        targetProtocolHttpBinding.errorResponseBindings(errorShape)\n\n    override fun errorCode(errorShape: ToShapeId): String = awsQueryBindingResolver.errorCode(errorShape)\n\n    override fun requestContentType(operationShape: OperationShape): String? =\n        targetProtocolHttpBinding.requestContentType(operationShape)\n\n    override fun responseContentType(operationShape: OperationShape): String? =\n        targetProtocolHttpBinding.requestContentType(operationShape)\n\n    override fun eventStreamMessageContentType(memberShape: MemberShape): String? =\n        targetProtocolHttpBinding.eventStreamMessageContentType(memberShape)\n\n    override fun handlesEventStreamInitialRequest(shape: Shape): Boolean =\n        targetProtocolHttpBinding.handlesEventStreamInitialRequest(shape)\n\n    override fun handlesEventStreamInitialResponse(shape: Shape): Boolean =\n        targetProtocolHttpBinding.handlesEventStreamInitialResponse(shape)\n}\n\ndata class ParseErrorMetadataParams(\n    val deserializeErrorType: RuntimeType,\n    val innerParseErrorMetadata: Writable,\n)\n\nclass AwsQueryCompatible(\n    val codegenContext: CodegenContext,\n    private val targetProtocol: Protocol,\n    private val params: ParseErrorMetadataParams,\n) : Protocol {\n    private val runtimeConfig = codegenContext.runtimeConfig\n    private val errorScope =\n        arrayOf(\n            \"Bytes\" to RuntimeType.Bytes,\n            \"ErrorMetadataBuilder\" to RuntimeType.errorMetadataBuilder(runtimeConfig),\n            \"Headers\" to RuntimeType.headers(runtimeConfig),\n            \"aws_query_compatible_errors\" to RuntimeType.awsQueryCompatibleErrors(runtimeConfig),\n            *RuntimeType.preludeScope,\n        )\n\n    override val httpBindingResolver: HttpBindingResolver =\n        AwsQueryCompatibleHttpBindingResolver(\n            AwsQueryBindingResolver(codegenContext.model),\n            targetProtocol.httpBindingResolver,\n        )\n\n    override val defaultTimestampFormat = targetProtocol.defaultTimestampFormat\n\n    override fun structuredDataParser(): StructuredDataParserGenerator = targetProtocol.structuredDataParser()\n\n    override fun structuredDataSerializer(): StructuredDataSerializerGenerator =\n        targetProtocol.structuredDataSerializer()\n\n    override fun parseHttpErrorMetadata(operationShape: OperationShape): RuntimeType =\n        ProtocolFunctions.crossOperationFn(\"parse_http_error_metadata\") { fnName ->\n            rustTemplate(\n                \"\"\"\n                pub fn $fnName(_response_status: u16, response_headers: &#{Headers}, response_body: &[u8]) -> #{Result}<#{ErrorMetadataBuilder}, #{DeserializeError}> {\n                    let mut builder = #{parse_error_metadata};\n                    if let Some((error_code, error_type)) =\n                        #{aws_query_compatible_errors}::parse_aws_query_compatible_error(response_headers)\n                    {\n                        builder = builder.code(error_code);\n                        builder = builder.custom(\"type\", error_type);\n                    }\n                    Ok(builder)\n                }\n                \"\"\",\n                *errorScope,\n                \"DeserializeError\" to params.deserializeErrorType,\n                \"parse_error_metadata\" to params.innerParseErrorMetadata,\n            )\n        }\n\n    override fun parseEventStreamErrorMetadata(operationShape: OperationShape): RuntimeType =\n        targetProtocol.parseEventStreamErrorMetadata(operationShape)\n\n    override fun additionalRequestHeaders(operationShape: OperationShape): List<Pair<String, String>> =\n        targetProtocol.additionalRequestHeaders(operationShape) +\n            listOf(\n                \"x-amzn-query-mode\" to \"true\",\n            )\n}\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/Ec2Query.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy.protocols\n\nimport software.amazon.smithy.model.pattern.UriPattern\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.traits.HttpTrait\nimport software.amazon.smithy.model.traits.TimestampFormatTrait\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlockTemplate\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenContext\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.parse.Ec2QueryParserGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.parse.StructuredDataParserGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.serialize.Ec2QuerySerializerGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.serialize.StructuredDataSerializerGenerator\n\nclass Ec2QueryProtocol(private val codegenContext: CodegenContext) : Protocol {\n    private val runtimeConfig = codegenContext.runtimeConfig\n    private val ec2QueryErrors: RuntimeType = RuntimeType.ec2QueryErrors(runtimeConfig)\n    private val errorScope =\n        arrayOf(\n            \"Bytes\" to RuntimeType.Bytes,\n            \"ErrorMetadataBuilder\" to RuntimeType.errorMetadataBuilder(runtimeConfig),\n            \"Headers\" to RuntimeType.headers(runtimeConfig),\n            \"XmlDecodeError\" to RuntimeType.smithyXml(runtimeConfig).resolve(\"decode::XmlDecodeError\"),\n            *RuntimeType.preludeScope,\n        )\n\n    override val httpBindingResolver: HttpBindingResolver =\n        StaticHttpBindingResolver(\n            codegenContext.model,\n            HttpTrait.builder()\n                .code(200)\n                .method(\"POST\")\n                .uri(UriPattern.parse(\"/\"))\n                .build(),\n            \"application/x-www-form-urlencoded\",\n            \"text/xml\",\n        )\n\n    override val defaultTimestampFormat: TimestampFormatTrait.Format = TimestampFormatTrait.Format.DATE_TIME\n\n    override fun structuredDataParser(): StructuredDataParserGenerator =\n        Ec2QueryParserGenerator(codegenContext, ec2QueryErrors)\n\n    override fun structuredDataSerializer(): StructuredDataSerializerGenerator =\n        Ec2QuerySerializerGenerator(codegenContext)\n\n    override fun parseHttpErrorMetadata(operationShape: OperationShape): RuntimeType =\n        ProtocolFunctions.crossOperationFn(\"parse_http_error_metadata\") { fnName ->\n            rustBlockTemplate(\n                \"pub fn $fnName(_response_status: u16, _response_headers: &#{Headers}, response_body: &[u8]) -> #{Result}<#{ErrorMetadataBuilder}, #{XmlDecodeError}>\",\n                *errorScope,\n            ) {\n                rust(\"#T::parse_error_metadata(response_body)\", ec2QueryErrors)\n            }\n        }\n\n    override fun parseEventStreamErrorMetadata(operationShape: OperationShape): RuntimeType =\n        ProtocolFunctions.crossOperationFn(\"parse_event_stream_error_metadata\") {\n            rustBlockTemplate(\n                \"pub fn parse_event_stream_error_metadata(payload: &#{Bytes}) -> #{Result}<#{ErrorMetadataBuilder}, #{XmlDecodeError}>\",\n                *errorScope,\n            ) {\n                rust(\"#T::parse_error_metadata(payload.as_ref())\", ec2QueryErrors)\n            }\n        }\n}\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/HttpBindingResolver.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy.protocols\n\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.knowledge.HttpBinding\nimport software.amazon.smithy.model.knowledge.HttpBindingIndex\nimport software.amazon.smithy.model.shapes.BlobShape\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.shapes.StringShape\nimport software.amazon.smithy.model.shapes.ToShapeId\nimport software.amazon.smithy.model.traits.HttpTrait\nimport software.amazon.smithy.model.traits.TimestampFormatTrait\nimport software.amazon.smithy.rust.codegen.core.util.expectTrait\nimport software.amazon.smithy.rust.codegen.core.util.orNull\n\ntypealias HttpLocation = HttpBinding.Location\n\n/**\n * A generic subset of [HttpBinding] that is not specific to any protocol implementation.\n */\ndata class HttpBindingDescriptor(\n    val member: MemberShape,\n    val location: HttpLocation,\n    val locationName: String,\n) {\n    constructor(httpBinding: HttpBinding) : this(httpBinding.member, httpBinding.location, httpBinding.locationName)\n\n    val memberName: String get() = member.memberName\n}\n\n/**\n * Represents a protocol-specific implementation that resolves HTTP binding data.\n */\ninterface HttpBindingResolver {\n    /**\n     * Returns an [HttpTrait] for the given operation. Even if the protocol doesn't\n     * support the HTTP traits, this should always return an [HttpTrait] value representing\n     * what the protocol desires for request/response binding.\n     */\n    fun httpTrait(operationShape: OperationShape): HttpTrait\n\n    /**\n     * Returns a list of request HTTP bindings for a given [operationShape].\n     */\n    fun requestBindings(operationShape: OperationShape): List<HttpBindingDescriptor>\n\n    /**\n     * Returns a list of response HTTP bindings for a given [operationShape].\n     */\n    fun responseBindings(operationShape: OperationShape): List<HttpBindingDescriptor>\n\n    /**\n     * Returns a list of response HTTP bindings for an [errorShape].\n     */\n    fun errorResponseBindings(errorShape: ToShapeId): List<HttpBindingDescriptor>\n\n    fun errorCode(errorShape: ToShapeId): String = errorShape.toShapeId().name\n\n    /**\n     * Returns a list of member shapes bound to a given request [location] for a given [operationShape]\n     */\n    fun requestMembers(\n        operationShape: OperationShape,\n        location: HttpLocation,\n    ): List<MemberShape> = requestBindings(operationShape).filter { it.location == location }.map { it.member }\n\n    /**\n     * Returns a list of member shapes bound to a given response [location] for a given [operationShape]\n     */\n    fun responseMembers(\n        operationShape: OperationShape,\n        location: HttpLocation,\n    ): List<MemberShape> = responseBindings(operationShape).filter { it.location == location }.map { it.member }\n\n    /**\n     * Determine the timestamp format based on the input parameters.\n     *\n     * By default, this uses the timestamp trait, either on the member or on the target.\n     */\n    fun timestampFormat(\n        memberShape: MemberShape,\n        location: HttpLocation,\n        defaultTimestampFormat: TimestampFormatTrait.Format,\n        model: Model,\n    ): TimestampFormatTrait.Format =\n        memberShape.getMemberTrait(model, TimestampFormatTrait::class.java).map { it.format }\n            .orElse(defaultTimestampFormat)\n\n    /**\n     * Determines the request content type for given [operationShape].\n     */\n    fun requestContentType(operationShape: OperationShape): String?\n\n    /**\n     * Determines the response content type for given [operationShape].\n     */\n    fun responseContentType(operationShape: OperationShape): String?\n\n    /**\n     * Due to an initial implementation bug, were accepting `application/cbor` when we should have been accepting\n     * an event stream header. This allows configuring an optional fallback header to support backwards compatibility\n     * in these cases.\n     */\n    fun legacyBackwardsCompatContentType(operationShape: OperationShape): String? = null\n\n    /**\n     * Determines the value of the event stream `:content-type` header based on union member\n     */\n    fun eventStreamMessageContentType(memberShape: MemberShape): String?\n\n    /**\n     * Determines whether event stream initial-request needs to be handled for given [shape]\n     */\n    fun handlesEventStreamInitialRequest(shape: Shape): Boolean\n\n    /**\n     * Determines whether event stream initial-response needs to be handled for given [shape]\n     */\n    fun handlesEventStreamInitialResponse(shape: Shape): Boolean\n}\n\n/**\n * Content types a protocol uses.\n */\ndata class ProtocolContentTypes(\n    /** Request content type override for when the shape is a Document */\n    val requestDocument: String? = null,\n    /** Response content type override for when the shape is a Document */\n    val responseDocument: String? = null,\n    /** EventStream content type initial request/response content-type */\n    val eventStreamContentType: String? = null,\n    /** EventStream content type for struct message shapes (for `:content-type`) */\n    val eventStreamMessageContentType: String? = null,\n) {\n    companion object {\n        /** Create an instance of [ProtocolContentTypes] where all content types are the same */\n        fun consistent(type: String) = ProtocolContentTypes(type, type, type, type)\n\n        /**\n         * Returns the event stream message `:content-type` for the given event stream union member shape.\n         *\n         * The `protocolContentType` is the content-type to use for non-string/non-blob shapes.\n         */\n        fun eventStreamMemberContentType(\n            model: Model,\n            memberShape: MemberShape,\n            protocolContentType: String?,\n        ): String? =\n            when (model.expectShape(memberShape.target)) {\n                is StringShape -> \"text/plain\"\n                is BlobShape -> \"application/octet-stream\"\n                else -> protocolContentType\n            }\n    }\n}\n\n/**\n * An [HttpBindingResolver] that relies on the HttpTrait data in the Smithy models.\n */\nopen class HttpTraitHttpBindingResolver(\n    private val model: Model,\n    private val contentTypes: ProtocolContentTypes,\n) : HttpBindingResolver {\n    private val httpIndex: HttpBindingIndex = HttpBindingIndex.of(model)\n\n    override fun httpTrait(operationShape: OperationShape): HttpTrait = operationShape.expectTrait()\n\n    override fun requestBindings(operationShape: OperationShape): List<HttpBindingDescriptor> =\n        mappedBindings(httpIndex.getRequestBindings(operationShape))\n\n    override fun responseBindings(operationShape: OperationShape): List<HttpBindingDescriptor> =\n        mappedBindings(httpIndex.getResponseBindings(operationShape))\n\n    override fun errorResponseBindings(errorShape: ToShapeId): List<HttpBindingDescriptor> =\n        mappedBindings(httpIndex.getResponseBindings(errorShape))\n\n    override fun timestampFormat(\n        memberShape: MemberShape,\n        location: HttpLocation,\n        defaultTimestampFormat: TimestampFormatTrait.Format,\n        model: Model,\n    ): TimestampFormatTrait.Format = httpIndex.determineTimestampFormat(memberShape, location, defaultTimestampFormat)\n\n    /**\n     * Note that `null` will be returned and hence `Content-Type` will not be set when operation input has no members.\n     * This is in line with what protocol tests assert.\n     */\n    override fun requestContentType(operationShape: OperationShape): String? =\n        httpIndex.determineRequestContentType(\n            operationShape,\n            contentTypes.requestDocument,\n            contentTypes.eventStreamContentType,\n        ).orNull()\n\n    /**\n     * Note that `null` will be returned and hence `Content-Type` will not be set when operation output has no members.\n     * This is in line with what protocol tests assert.\n     */\n    override fun responseContentType(operationShape: OperationShape): String? =\n        httpIndex.determineResponseContentType(\n            operationShape,\n            contentTypes.responseDocument,\n            contentTypes.eventStreamContentType,\n        ).orNull()\n\n    override fun eventStreamMessageContentType(memberShape: MemberShape): String? =\n        ProtocolContentTypes.eventStreamMemberContentType(\n            model,\n            memberShape,\n            contentTypes.eventStreamMessageContentType,\n        )\n\n    // Sort the members after extracting them from the map to have a consistent order\n    private fun mappedBindings(bindings: Map<String, HttpBinding>): List<HttpBindingDescriptor> =\n        bindings.values.map(::HttpBindingDescriptor).sortedBy { it.memberName }\n\n    override fun handlesEventStreamInitialRequest(shape: Shape) = false\n\n    override fun handlesEventStreamInitialResponse(shape: Shape) = false\n}\n\n/**\n * Takes an [HttpTrait] value and content type, and provides bindings based on those.\n * All members will end up being document members.\n */\nopen class StaticHttpBindingResolver(\n    private val model: Model,\n    private val httpTrait: HttpTrait,\n    private val requestContentType: String,\n    private val responseContentType: String,\n    private val eventStreamMessageContentType: String? = null,\n) : HttpBindingResolver {\n    private fun bindings(shape: ToShapeId?) =\n        shape?.let { model.expectShape(it.toShapeId()) }?.members()\n            ?.map { HttpBindingDescriptor(it, HttpLocation.DOCUMENT, \"document\") }\n            ?.toList()\n            ?: emptyList()\n\n    override fun httpTrait(operationShape: OperationShape): HttpTrait = httpTrait\n\n    override fun requestBindings(operationShape: OperationShape): List<HttpBindingDescriptor> =\n        bindings(operationShape.input.orNull())\n\n    override fun responseBindings(operationShape: OperationShape): List<HttpBindingDescriptor> =\n        bindings(operationShape.output.orNull())\n\n    override fun errorResponseBindings(errorShape: ToShapeId): List<HttpBindingDescriptor> = bindings(errorShape)\n\n    override fun requestContentType(operationShape: OperationShape): String = requestContentType\n\n    override fun responseContentType(operationShape: OperationShape): String = responseContentType\n\n    override fun eventStreamMessageContentType(memberShape: MemberShape): String? =\n        ProtocolContentTypes.eventStreamMemberContentType(model, memberShape, eventStreamMessageContentType)\n\n    override fun handlesEventStreamInitialRequest(shape: Shape) = false\n\n    override fun handlesEventStreamInitialResponse(shape: Shape) = false\n}\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/HttpBoundProtocolPayloadGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy.protocols\n\nimport software.amazon.smithy.codegen.core.CodegenException\nimport software.amazon.smithy.model.shapes.BlobShape\nimport software.amazon.smithy.model.shapes.DocumentShape\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.StringShape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.shapes.UnionShape\nimport software.amazon.smithy.model.traits.EnumTrait\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlockTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.withBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.withBlockTemplate\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenContext\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenTarget\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.http.HttpMessageType\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.operationBuildError\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.protocol.AdditionalPayloadContext\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.protocol.ProtocolPayloadGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.isOptional\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.serialize.EventStreamErrorMarshallerGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.serialize.EventStreamMarshallerGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.serialize.StructuredDataSerializerGenerator\nimport software.amazon.smithy.rust.codegen.core.util.PANIC\nimport software.amazon.smithy.rust.codegen.core.util.UNREACHABLE\nimport software.amazon.smithy.rust.codegen.core.util.expectMember\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\nimport software.amazon.smithy.rust.codegen.core.util.inputShape\nimport software.amazon.smithy.rust.codegen.core.util.isEventStream\nimport software.amazon.smithy.rust.codegen.core.util.isInputEventStream\nimport software.amazon.smithy.rust.codegen.core.util.isOutputEventStream\nimport software.amazon.smithy.rust.codegen.core.util.isStreaming\nimport software.amazon.smithy.rust.codegen.core.util.outputShape\n\ndata class EventStreamBodyParams(\n    val outerName: String,\n    val memberName: String,\n    val operationShape: OperationShape,\n    val eventStreamMarshallerGenerator: EventStreamMarshallerGenerator,\n    val errorMarshallerConstructorFn: RuntimeType,\n    val payloadContentType: String,\n    val additionalPayloadContext: AdditionalPayloadContext,\n)\n\nclass HttpBoundProtocolPayloadGenerator(\n    codegenContext: CodegenContext,\n    private val protocol: Protocol,\n    private val httpMessageType: HttpMessageType = HttpMessageType.REQUEST,\n    private val renderEventStreamBody: (RustWriter, EventStreamBodyParams) -> Unit,\n) : ProtocolPayloadGenerator {\n    private val symbolProvider = codegenContext.symbolProvider\n    private val model = codegenContext.model\n    private val runtimeConfig = codegenContext.runtimeConfig\n    private val target = codegenContext.target\n    private val httpBindingResolver = protocol.httpBindingResolver\n    private val smithyEventStream = RuntimeType.smithyEventStream(runtimeConfig)\n    private val codegenScope =\n        arrayOf(\n            \"SdkBody\" to RuntimeType.sdkBody(runtimeConfig),\n            \"BuildError\" to runtimeConfig.operationBuildError(),\n            \"SmithyHttp\" to RuntimeType.smithyHttp(runtimeConfig),\n            \"NoOpSigner\" to smithyEventStream.resolve(\"frame::NoOpSigner\"),\n            *RuntimeType.preludeScope,\n        )\n    private val protocolFunctions = ProtocolFunctions(codegenContext)\n\n    override fun payloadMetadata(\n        operationShape: OperationShape,\n        additionalPayloadContext: AdditionalPayloadContext,\n    ): ProtocolPayloadGenerator.PayloadMetadata {\n        val (shape, payloadMemberName) =\n            when (httpMessageType) {\n                HttpMessageType.RESPONSE ->\n                    operationShape.outputShape(model) to\n                        httpBindingResolver.responseMembers(operationShape, HttpLocation.PAYLOAD).firstOrNull()?.memberName\n\n                HttpMessageType.REQUEST ->\n                    operationShape.inputShape(model) to\n                        httpBindingResolver.requestMembers(operationShape, HttpLocation.PAYLOAD).firstOrNull()?.memberName\n            }\n\n        // Only:\n        //     - streaming operations (blob streaming and event streams),\n        //     - *blob non-streaming* operations; and\n        //     - string payloads\n        // need to take ownership.\n        return if (payloadMemberName == null) {\n            ProtocolPayloadGenerator.PayloadMetadata(takesOwnership = false)\n        } else if (\n            when (httpMessageType) {\n                HttpMessageType.REQUEST -> operationShape.isInputEventStream(model)\n                HttpMessageType.RESPONSE -> operationShape.isOutputEventStream(model)\n            }\n        ) {\n            ProtocolPayloadGenerator.PayloadMetadata(takesOwnership = true)\n        } else {\n            val member = shape.expectMember(payloadMemberName)\n            when (val type = model.expectShape(member.target)) {\n                is DocumentShape, is StructureShape, is UnionShape ->\n                    ProtocolPayloadGenerator.PayloadMetadata(\n                        takesOwnership = false,\n                    )\n\n                is StringShape, is BlobShape -> ProtocolPayloadGenerator.PayloadMetadata(takesOwnership = true)\n                else -> UNREACHABLE(\"Unexpected payload target type: $type\")\n            }\n        }\n    }\n\n    override fun generatePayload(\n        writer: RustWriter,\n        shapeName: String,\n        operationShape: OperationShape,\n        additionalPayloadContext: AdditionalPayloadContext,\n    ) {\n        when (httpMessageType) {\n            HttpMessageType.RESPONSE ->\n                generateResponsePayload(\n                    writer,\n                    shapeName,\n                    operationShape,\n                    additionalPayloadContext,\n                )\n\n            HttpMessageType.REQUEST ->\n                generateRequestPayload(\n                    writer,\n                    shapeName,\n                    operationShape,\n                    additionalPayloadContext,\n                )\n        }\n    }\n\n    private fun generateRequestPayload(\n        writer: RustWriter,\n        shapeName: String,\n        operationShape: OperationShape,\n        additionalPayloadContext: AdditionalPayloadContext,\n    ) {\n        val payloadMemberName =\n            httpBindingResolver.requestMembers(operationShape, HttpLocation.PAYLOAD).firstOrNull()?.memberName\n\n        if (payloadMemberName == null) {\n            val serializerGenerator = protocol.structuredDataSerializer()\n            generateStructureSerializer(writer, shapeName, serializerGenerator.operationInputSerializer(operationShape))\n        } else {\n            generatePayloadMemberSerializer(\n                writer,\n                shapeName,\n                operationShape,\n                payloadMemberName,\n                additionalPayloadContext,\n            )\n        }\n    }\n\n    private fun generateResponsePayload(\n        writer: RustWriter,\n        shapeName: String,\n        operationShape: OperationShape,\n        additionalPayloadContext: AdditionalPayloadContext,\n    ) {\n        val payloadMemberName =\n            httpBindingResolver.responseMembers(operationShape, HttpLocation.PAYLOAD).firstOrNull()?.memberName\n\n        if (payloadMemberName == null) {\n            val serializerGenerator = protocol.structuredDataSerializer()\n            generateStructureSerializer(\n                writer,\n                shapeName,\n                serializerGenerator.operationOutputSerializer(operationShape),\n            )\n        } else {\n            generatePayloadMemberSerializer(\n                writer,\n                shapeName,\n                operationShape,\n                payloadMemberName,\n                additionalPayloadContext,\n            )\n        }\n    }\n\n    private fun generatePayloadMemberSerializer(\n        writer: RustWriter,\n        shapeName: String,\n        operationShape: OperationShape,\n        payloadMemberName: String,\n        additionalPayloadContext: AdditionalPayloadContext,\n    ) {\n        val serializerGenerator = protocol.structuredDataSerializer()\n\n        if (operationShape.isInputEventStream(model) && target == CodegenTarget.CLIENT) {\n            val payloadMember = operationShape.inputShape(model).expectMember(payloadMemberName)\n            writer.serializeViaEventStream(\n                payloadMember,\n                operationShape,\n                serializerGenerator,\n                shapeName,\n                additionalPayloadContext,\n            )\n        } else if (operationShape.isOutputEventStream(model) && target == CodegenTarget.SERVER) {\n            val payloadMember = operationShape.outputShape(model).expectMember(payloadMemberName)\n            writer.serializeViaEventStream(\n                payloadMember,\n                operationShape,\n                serializerGenerator,\n                \"output\",\n                additionalPayloadContext,\n            )\n        } else {\n            val bodyMetadata = payloadMetadata(operationShape)\n            val payloadMember =\n                when (httpMessageType) {\n                    HttpMessageType.RESPONSE -> operationShape.outputShape(model).expectMember(payloadMemberName)\n                    HttpMessageType.REQUEST -> operationShape.inputShape(model).expectMember(payloadMemberName)\n                }\n            writer.serializeViaPayload(bodyMetadata, shapeName, payloadMember, serializerGenerator)\n        }\n    }\n\n    private fun generateStructureSerializer(\n        writer: RustWriter,\n        shapeName: String,\n        serializer: RuntimeType?,\n    ) {\n        if (serializer == null) {\n            writer.rust(\"\\\"\\\"\")\n        } else {\n            writer.rust(\n                \"#T(&$shapeName)?\",\n                serializer,\n            )\n        }\n    }\n\n    private fun RustWriter.serializeViaEventStream(\n        memberShape: MemberShape,\n        operationShape: OperationShape,\n        serializerGenerator: StructuredDataSerializerGenerator,\n        outerName: String,\n        additionalPayloadContext: AdditionalPayloadContext,\n    ) {\n        val memberName = symbolProvider.toMemberName(memberShape)\n        val unionShape = model.expectShape(memberShape.target, UnionShape::class.java)\n\n        val payloadContentType =\n            httpBindingResolver.eventStreamMessageContentType(memberShape)\n                ?: throw CodegenException(\"event streams must set a content type\")\n\n        val errorMarshallerConstructorFn =\n            EventStreamErrorMarshallerGenerator(\n                model,\n                target,\n                runtimeConfig,\n                symbolProvider,\n                unionShape,\n                serializerGenerator,\n                payloadContentType,\n            ).render()\n\n        val eventStreamMarshallerGenerator =\n            EventStreamMarshallerGenerator(\n                model,\n                target,\n                runtimeConfig,\n                symbolProvider,\n                unionShape,\n                serializerGenerator,\n                payloadContentType,\n            )\n\n        // TODO(EventStream): [RPC] For server, RPC protocols need to send an initial message with the\n        //  parameters that are not `@eventHeader` or `@eventPayload`.\n        renderEventStreamBody(\n            this,\n            EventStreamBodyParams(\n                outerName,\n                memberName,\n                operationShape,\n                eventStreamMarshallerGenerator,\n                errorMarshallerConstructorFn,\n                payloadContentType,\n                additionalPayloadContext,\n            ),\n        )\n    }\n\n    private fun RustWriter.serializeViaPayload(\n        payloadMetadata: ProtocolPayloadGenerator.PayloadMetadata,\n        shapeName: String,\n        member: MemberShape,\n        serializerGenerator: StructuredDataSerializerGenerator,\n    ) {\n        val ref = if (payloadMetadata.takesOwnership) \"\" else \"&\"\n        val serializer =\n            protocolFunctions.serializeFn(member, fnNameSuffix = \"http_payload\") { fnName ->\n                val outputT =\n                    if (member.isStreaming(model)) {\n                        symbolProvider.toSymbol(member)\n                    } else {\n                        RuntimeType.ByteSlab.toSymbol()\n                    }\n                rustBlockTemplate(\n                    \"pub fn $fnName(payload: $ref#{Member}) -> #{Result}<#{outputT}, #{BuildError}>\",\n                    \"Member\" to symbolProvider.toSymbol(member),\n                    \"outputT\" to outputT,\n                    *codegenScope,\n                ) {\n                    val asRef = if (payloadMetadata.takesOwnership) \"\" else \".as_ref()\"\n\n                    if (symbolProvider.toSymbol(member).isOptional()) {\n                        withBlockTemplate(\n                            \"\"\"\n                            let payload = match payload$asRef {\n                                Some(t) => t,\n                                None => return Ok(\n                            \"\"\",\n                            \")};\",\n                            *codegenScope,\n                        ) {\n                            when (val targetShape = model.expectShape(member.target)) {\n                                // Return an empty `Vec<u8>`.\n                                is StringShape, is BlobShape, is DocumentShape ->\n                                    rust(\n                                        \"\"\"\n                                        Vec::new()\n                                        \"\"\",\n                                    )\n\n                                is StructureShape -> rust(\"#T()\", serializerGenerator.unsetStructure(targetShape))\n                                is UnionShape -> rust(\"#T()\", serializerGenerator.unsetUnion(targetShape))\n                                else -> throw CodegenException(\"`httpPayload` on member shapes targeting shapes of type ${targetShape.type} is unsupported\")\n                            }\n                        }\n                    }\n\n                    withBlock(\"Ok(\", \")\") {\n                        renderPayload(member, \"payload\", serializerGenerator)\n                    }\n                }\n            }\n        rust(\"#T($ref $shapeName.${symbolProvider.toMemberName(member)})?\", serializer)\n    }\n\n    private fun RustWriter.renderPayload(\n        member: MemberShape,\n        payloadName: String,\n        serializer: StructuredDataSerializerGenerator,\n    ) {\n        when (val targetShape = model.expectShape(member.target)) {\n            is StringShape -> {\n                // Write the raw string to the payload.\n                if (targetShape.hasTrait<EnumTrait>()) {\n                    // Convert an enum to `&str` then to `&[u8]` then to `Vec<u8>`.\n                    rust(\"$payloadName.as_str().as_bytes().to_vec()\")\n                } else {\n                    // Convert a `String` to `Vec<u8>`.\n                    rust(\"$payloadName.into_bytes()\")\n                }\n            }\n\n            is BlobShape -> {\n                // Write the raw blob to the payload.\n                if (member.isStreaming(model)) {\n                    // Return the `ByteStream`.\n                    rust(payloadName)\n                } else {\n                    // Convert the `Blob` into a `Vec<u8>` and return it.\n                    rust(\"$payloadName.into_inner()\")\n                }\n            }\n\n            is StructureShape, is UnionShape -> {\n                check(\n                    !((targetShape as? UnionShape)?.isEventStream() ?: false),\n                ) { \"Event Streams should be handled further up\" }\n\n                rust(\n                    \"#T($payloadName)?\",\n                    serializer.payloadSerializer(member),\n                )\n            }\n\n            is DocumentShape -> {\n                rust(\n                    \"#T($payloadName)\",\n                    serializer.documentSerializer(),\n                )\n            }\n\n            else -> PANIC(\"Unexpected payload target type: $targetShape\")\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/Protocol.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy.protocols\n\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.traits.TimestampFormatTrait\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenContext\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.protocol.ProtocolSupport\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.parse.StructuredDataParserGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.serialize.StructuredDataSerializerGenerator\n\n/**\n * Describes a protocol to the [HttpBoundProtocolGenerator].\n *\n * Each protocol (e.g. RestXml, RestJson, etc.) will provide its own implementation of the [Protocol] interface.\n */\ninterface Protocol {\n    /** Resolves HTTP bindings (which part of a request fields are mapped to) */\n    val httpBindingResolver: HttpBindingResolver\n\n    /** The timestamp format that should be used if no override is specified in the model */\n    val defaultTimestampFormat: TimestampFormatTrait.Format\n\n    /**\n     * Returns additional HTTP headers that should be included in HTTP requests for the given operation for this protocol.\n     *\n     * These MUST all be lowercase, or the application will panic, as per\n     * https://docs.rs/http/latest/http/header/struct.HeaderName.html#method.from_static\n     */\n    fun additionalRequestHeaders(operationShape: OperationShape): List<Pair<String, String>> = emptyList()\n\n    /**\n     * Returns additional HTTP headers that should be included in HTTP responses for the given operation for this protocol.\n     *\n     * These MUST all be lowercase, or the application will panic, as per\n     * https://docs.rs/http/latest/http/header/struct.HeaderName.html#method.from_static\n     */\n    fun additionalResponseHeaders(operationShape: OperationShape): List<Pair<String, String>> = emptyList()\n\n    /**\n     * Returns additional HTTP headers that should be included in HTTP responses for the given error shape.\n     * These headers are added to responses _in addition_ to those returned by `additionalResponseHeaders`; if a header\n     * added by this function has the same header name as one added by `additionalResponseHeaders`, the one added by\n     * `additionalResponseHeaders` takes precedence.\n     *\n     * These MUST all be lowercase, or the application will panic, as per\n     * https://docs.rs/http/latest/http/header/struct.HeaderName.html#method.from_static\n     */\n    fun additionalErrorResponseHeaders(errorShape: StructureShape): List<Pair<String, String>> = emptyList()\n\n    /** Returns a deserialization code generator for this protocol */\n    fun structuredDataParser(): StructuredDataParserGenerator\n\n    /** Returns a serialization code generator for this protocol */\n    fun structuredDataSerializer(): StructuredDataSerializerGenerator\n\n    /**\n     * Generates a function signature like the following:\n     * ```rust\n     * fn parse_http_error_metadata(response_status: u16, response_headers: HeaderMap, response_body: &[u8]) -> aws_smithy_types::error::Builder\n     * ```\n     */\n    fun parseHttpErrorMetadata(operationShape: OperationShape): RuntimeType\n\n    /**\n     * Generates a function signature like the following:\n     * ```rust\n     * fn parse_event_stream_error_metadata(payload: &Bytes) -> aws_smithy_types::error::Error\n     * ```\n     *\n     * Event Stream generic errors are almost identical to HTTP generic errors, except that\n     * there are no response headers or statuses available to further inform the error parsing.\n     */\n    fun parseEventStreamErrorMetadata(operationShape: OperationShape): RuntimeType\n\n    /**\n     * Determines whether the `Content-Length` header should be set in an HTTP request.\n     */\n    fun needsRequestContentLength(operationShape: OperationShape): Boolean =\n        httpBindingResolver.requestBindings(operationShape)\n            .any { it.location == HttpLocation.DOCUMENT || it.location == HttpLocation.PAYLOAD }\n}\n\ntypealias ProtocolMap<T, C> = Map<ShapeId, ProtocolGeneratorFactory<T, C>>\n\ninterface ProtocolGeneratorFactory<out T, C : CodegenContext> {\n    fun protocol(codegenContext: C): Protocol\n\n    fun buildProtocolGenerator(codegenContext: C): T\n\n    fun support(): ProtocolSupport\n}\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/ProtocolFunctions.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy.protocols\n\nimport software.amazon.smithy.model.shapes.DocumentShape\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.ServiceShape\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute\nimport software.amazon.smithy.rust.codegen.core.rustlang.EscapeFor\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustModule\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustReservedWords\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenContext\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.contextName\nimport software.amazon.smithy.rust.codegen.core.smithy.traits.SyntheticInputTrait\nimport software.amazon.smithy.rust.codegen.core.smithy.traits.SyntheticOutputTrait\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\nimport software.amazon.smithy.rust.codegen.core.util.letIf\nimport software.amazon.smithy.rust.codegen.core.util.toSnakeCase\n\n/**\n * Similar to [Writable], but provides the function name that is being generated as an argument.\n */\ntypealias ProtocolFnWritable = RustWriter.(String) -> Unit\n\n/**\n * Utilities for generating protocol serialization/deserialization functions, and common support functions.\n *\n * This class should be used for generating all inline functions from a protocol code generator, as it is\n * responsible for correctly organizing and code splitting those functions into smaller modules.\n */\nclass ProtocolFunctions(\n    private val codegenContext: CodegenContext,\n) {\n    companion object {\n        val serDeModule = RustModule.pubCrate(\"protocol_serde\")\n\n        fun crossOperationFn(\n            fnName: String,\n            block: ProtocolFnWritable,\n        ): RuntimeType =\n            RuntimeType.forInlineFun(fnName, serDeModule) {\n                block(fnName)\n            }\n    }\n\n    private enum class FnType {\n        Serialize,\n        Deserialize,\n    }\n\n    /**\n     * Generate a serialize function for a protocol, and return a runtime type that references it\n     *\n     * Example:\n     * ```\n     * // Generate the function\n     * val serializeFn = ProtocolFunctions(codegenContext).serializeFn(myStruct) { fnName ->\n     *     rust(\"fn $fnName(...) { ... }\")\n     * }\n     * // Call the generated function\n     * rust(\"#T(...)\", serializeFn)\n     * ```\n     */\n    fun serializeFn(\n        shape: Shape,\n        fnNameSuffix: String? = null,\n        block: ProtocolFnWritable,\n    ): RuntimeType = serDeFn(FnType.Serialize, shape, serDeModule, block, fnNameSuffix)\n\n    /**\n     * Generate a deserialize function for a protocol, and return a runtime type that references it\n     *\n     * Example:\n     * ```\n     * // Generate the function\n     * val deserializeFn = ProtocolFunctions(codegenContext).deserializeFn(myStruct) { fnName ->\n     *     rust(\"fn $fnName(...) { ... }\")\n     * }\n     * // Call the generated function\n     * rust(\"#T(...)\", deserializeFn)\n     * ```\n     */\n    fun deserializeFn(\n        shape: Shape,\n        fnNameSuffix: String? = null,\n        block: ProtocolFnWritable,\n    ): RuntimeType = serDeFn(FnType.Deserialize, shape, serDeModule, block, fnNameSuffix)\n\n    private fun serDeFn(\n        fnType: FnType,\n        shape: Shape,\n        parentModule: RustModule.LeafModule,\n        block: ProtocolFnWritable,\n        fnNameSuffix: String? = null,\n    ): RuntimeType {\n        val moduleName = codegenContext.symbolProvider.shapeModuleName(codegenContext.serviceShape, shape)\n        val fnBaseName = codegenContext.symbolProvider.shapeFunctionName(codegenContext.serviceShape, shape)\n        val suffix = fnNameSuffix?.let { \"_$it\" } ?: \"\"\n        val fnName =\n            RustReservedWords.escapeIfNeeded(\n                when (fnType) {\n                    FnType.Deserialize -> \"de_$fnBaseName$suffix\"\n                    FnType.Serialize -> \"ser_$fnBaseName$suffix\"\n                },\n            )\n        return serDeFn(moduleName, fnName, parentModule, block)\n    }\n\n    private fun serDeFn(\n        moduleName: String,\n        fnName: String,\n        parentModule: RustModule.LeafModule,\n        block: ProtocolFnWritable,\n    ): RuntimeType {\n        val additionalAttributes =\n            when {\n                // Some SDK models have maps with names prefixed with `__mapOf__`, which become `__map_of__`,\n                // and the Rust compiler warning doesn't like multiple adjacent underscores.\n                moduleName.contains(\"__\") || fnName.contains(\"__\") -> listOf(Attribute.AllowNonSnakeCase)\n                else -> emptyList()\n            }\n        return RuntimeType.forInlineFun(\n            fnName,\n            RustModule.pubCrate(moduleName, parent = parentModule, additionalAttributes = additionalAttributes),\n        ) {\n            block(fnName)\n        }\n    }\n}\n\n/** Creates a module name for a ser/de function. */\nfun RustSymbolProvider.shapeModuleName(\n    serviceShape: ServiceShape?,\n    shape: Shape,\n): String =\n    RustReservedWords.escapeIfNeeded(\n        \"shape_\" +\n            when (shape) {\n                is MemberShape -> model.expectShape(shape.container)\n                else -> shape\n            }.contextName(serviceShape).toSnakeCase(),\n        EscapeFor.ModuleName,\n    )\n\n/** Creates a unique name for a ser/de function. */\nfun RustSymbolProvider.shapeFunctionName(\n    serviceShape: ServiceShape?,\n    shape: Shape,\n): String {\n    val extras =\n        \"\".letIf(shape.hasTrait<SyntheticOutputTrait>()) {\n            it + \"_output\"\n        }.letIf(shape.hasTrait<SyntheticInputTrait>()) { it + \"_input\" }\n    val containerName =\n        when (shape) {\n            is MemberShape -> model.expectShape(shape.container).contextName(serviceShape).toSnakeCase()\n            else -> shape.contextName(serviceShape).toSnakeCase()\n        } + extras\n    return when (shape) {\n        is MemberShape -> shape.memberName.toSnakeCase()\n        is DocumentShape -> \"document\"\n        else -> containerName\n    }\n}\n\nfun RustSymbolProvider.nestedAccessorName(\n    serviceShape: ServiceShape?,\n    prefix: String,\n    root: Shape,\n    path: List<MemberShape>,\n): String {\n    val base = shapeFunctionName(serviceShape, root)\n    val rest = path.joinToString(\"_\") { toMemberName(it) }\n    return \"${prefix}lens_${base}_$rest\"\n}\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/ProtocolLoader.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy.protocols\n\nimport software.amazon.smithy.codegen.core.CodegenException\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.knowledge.ServiceIndex\nimport software.amazon.smithy.model.shapes.ServiceShape\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.model.traits.Trait\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenContext\n\nopen class ProtocolLoader<T, C : CodegenContext>(private val supportedProtocols: ProtocolMap<T, C>) {\n    fun protocolFor(\n        model: Model,\n        serviceShape: ServiceShape,\n    ): Pair<ShapeId, ProtocolGeneratorFactory<T, C>> {\n        val serviceProtocols: MutableMap<ShapeId, Trait> = ServiceIndex.of(model).getProtocols(serviceShape)\n        val matchingProtocols =\n            supportedProtocols.mapNotNull { (protocolId, factory) ->\n                serviceProtocols[protocolId]?.let { protocolId to factory }\n            }\n        if (matchingProtocols.isEmpty()) {\n            throw CodegenException(\"No matching protocol — service offers: ${serviceProtocols.keys}. We offer: ${supportedProtocols.keys}\")\n        }\n        return matchingProtocols.first()\n    }\n}\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/RestJson.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy.protocols\n\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.traits.HttpPayloadTrait\nimport software.amazon.smithy.model.traits.JsonNameTrait\nimport software.amazon.smithy.model.traits.MediaTypeTrait\nimport software.amazon.smithy.model.traits.StreamingTrait\nimport software.amazon.smithy.model.traits.TimestampFormatTrait\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenContext\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.parse.JsonParserGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.parse.StructuredDataParserGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.serialize.JsonSerializerGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.serialize.StructuredDataSerializerGenerator\nimport software.amazon.smithy.rust.codegen.core.util.getTrait\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\nimport software.amazon.smithy.rust.codegen.core.util.outputShape\n\n/**\n * This [HttpBindingResolver] implementation mostly delegates to the [HttpTraitHttpBindingResolver] class, since the\n * RestJson1 protocol can be almost entirely described by Smithy's HTTP binding traits\n * (https://smithy.io/2.0/spec/http-bindings.html).\n * The only protocol-specific behavior that is truly custom is the response `Content-Type` header, which defaults to\n * `application/json` if not overridden.\n */\nclass RestJsonHttpBindingResolver(\n    private val model: Model,\n    contentTypes: ProtocolContentTypes,\n) : HttpTraitHttpBindingResolver(model, contentTypes) {\n    /**\n     * In the RestJson1 protocol, HTTP responses have a default `Content-Type: application/json` header if it is not\n     * overridden by a specific mechanism e.g. an output shape member is targeted with `httpPayload` or `mediaType` traits.\n     */\n    override fun responseContentType(operationShape: OperationShape): String? {\n        val members =\n            operationShape\n                .outputShape(model)\n                .members()\n        // TODO(https://github.com/awslabs/smithy/issues/1259)\n        //  Temporary fix for https://github.com/awslabs/smithy/blob/df456a514f72f4e35f0fb07c7e26006ff03b2071/smithy-model/src/main/java/software/amazon/smithy/model/knowledge/HttpBindingIndex.java#L352\n        for (member in members) {\n            if (member.hasTrait<HttpPayloadTrait>()) {\n                val target = model.expectShape(member.target)\n                if (!target.hasTrait<StreamingTrait>() && !target.hasTrait<MediaTypeTrait>() && target.isBlobShape) {\n                    return null\n                }\n            }\n        }\n\n        // The spec does not mention whether we should set the `Content-Type` header when there is no modeled output.\n        // The protocol tests indicate it's optional:\n        // <https://github.com/smithy-lang/smithy/blob/ad8aac3c9ce18ce2170443c0296ef38be46a7320/smithy-aws-protocol-tests/model/restJson1/empty-input-output.smithy#L52-L54>\n        //\n        // In our implementation, we opt to always set it to `application/json`.\n        return super.responseContentType(operationShape) ?: \"application/json\"\n    }\n}\n\nopen class RestJson(val codegenContext: CodegenContext) : Protocol {\n    private val runtimeConfig = codegenContext.runtimeConfig\n    private val errorScope =\n        arrayOf(\n            \"Bytes\" to RuntimeType.Bytes,\n            \"ErrorMetadataBuilder\" to RuntimeType.errorMetadataBuilder(runtimeConfig),\n            \"Headers\" to RuntimeType.headers(runtimeConfig),\n            \"JsonError\" to\n                CargoDependency.smithyJson(runtimeConfig).toType()\n                    .resolve(\"deserialize::error::DeserializeError\"),\n            \"json_errors\" to RuntimeType.jsonErrors(runtimeConfig),\n            *RuntimeType.preludeScope,\n        )\n\n    override val httpBindingResolver: HttpBindingResolver =\n        RestJsonHttpBindingResolver(\n            codegenContext.model,\n            ProtocolContentTypes(\n                requestDocument = \"application/json\",\n                responseDocument = \"application/json\",\n                eventStreamContentType = \"application/vnd.amazon.eventstream\",\n                eventStreamMessageContentType = \"application/json\",\n            ),\n        )\n\n    override val defaultTimestampFormat: TimestampFormatTrait.Format = TimestampFormatTrait.Format.EPOCH_SECONDS\n\n    /**\n     * RestJson1 implementations can denote errors in responses in several ways.\n     * New server-side protocol implementations MUST use a header field named `X-Amzn-Errortype`.\n     *\n     * Note that the spec says that implementations SHOULD strip the error shape ID's namespace\n     * (see https://smithy.io/2.0/aws/protocols/aws-restjson1-protocol.html#operation-error-serialization):\n     *\n     * > The value of this component SHOULD contain only the shape name of the error's Shape ID.\n     *\n     * But it's a SHOULD; we could strip the namespace if we wanted to. In fact, we did so in smithy-rs versions\n     * 0.52.0 to 0.55.4; see:\n     * - https://github.com/smithy-lang/smithy-rs/pull/1982\n     * - https://github.com/awslabs/smithy/pull/1493\n     * - https://github.com/awslabs/smithy/issues/1494\n     */\n    override fun additionalErrorResponseHeaders(errorShape: StructureShape): List<Pair<String, String>> =\n        listOf(\"x-amzn-errortype\" to errorShape.id.name)\n\n    override fun structuredDataParser(): StructuredDataParserGenerator =\n        JsonParserGenerator(codegenContext, httpBindingResolver, ::restJsonFieldName)\n\n    override fun structuredDataSerializer(): StructuredDataSerializerGenerator =\n        JsonSerializerGenerator(codegenContext, httpBindingResolver, ::restJsonFieldName)\n\n    override fun parseHttpErrorMetadata(operationShape: OperationShape): RuntimeType =\n        ProtocolFunctions.crossOperationFn(\"parse_http_error_metadata\") { fnName ->\n            rustTemplate(\n                \"\"\"\n                pub fn $fnName(_response_status: u16, response_headers: &#{Headers}, response_body: &[u8]) -> #{Result}<#{ErrorMetadataBuilder}, #{JsonError}> {\n                    #{json_errors}::parse_error_metadata(response_body, response_headers)\n                }\n                \"\"\",\n                *errorScope,\n            )\n        }\n\n    override fun parseEventStreamErrorMetadata(operationShape: OperationShape): RuntimeType =\n        ProtocolFunctions.crossOperationFn(\"parse_event_stream_error_metadata\") { fnName ->\n            // `HeaderMap::new()` doesn't allocate.\n            rustTemplate(\n                \"\"\"\n                pub fn $fnName(payload: &#{Bytes}) -> #{Result}<#{ErrorMetadataBuilder}, #{JsonError}> {\n                    #{json_errors}::parse_error_metadata(payload, &#{Headers}::new())\n                }\n                \"\"\",\n                *errorScope,\n            )\n        }\n}\n\nfun restJsonFieldName(member: MemberShape): String {\n    return member.getTrait<JsonNameTrait>()?.value ?: member.memberName\n}\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/RestXml.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy.protocols\n\nimport software.amazon.smithy.aws.traits.protocols.RestXmlTrait\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.traits.TimestampFormatTrait\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlockTemplate\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenContext\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.parse.RestXmlParserGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.parse.StructuredDataParserGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.serialize.StructuredDataSerializerGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.serialize.XmlBindingTraitSerializerGenerator\nimport software.amazon.smithy.rust.codegen.core.util.expectTrait\n\nopen class RestXml(val codegenContext: CodegenContext) : Protocol {\n    private val restXml = codegenContext.serviceShape.expectTrait<RestXmlTrait>()\n    private val runtimeConfig = codegenContext.runtimeConfig\n    private val errorScope =\n        arrayOf(\n            \"Bytes\" to RuntimeType.Bytes,\n            \"ErrorMetadataBuilder\" to RuntimeType.errorMetadataBuilder(runtimeConfig),\n            \"Headers\" to RuntimeType.headers(runtimeConfig),\n            \"XmlDecodeError\" to RuntimeType.smithyXml(runtimeConfig).resolve(\"decode::XmlDecodeError\"),\n            *RuntimeType.preludeScope,\n        )\n\n    protected val restXmlErrors: RuntimeType =\n        when (restXml.isNoErrorWrapping) {\n            true -> RuntimeType.unwrappedXmlErrors(runtimeConfig)\n            false -> RuntimeType.wrappedXmlErrors(runtimeConfig)\n        }\n\n    override val httpBindingResolver: HttpBindingResolver =\n        HttpTraitHttpBindingResolver(\n            codegenContext.model,\n            ProtocolContentTypes(\n                requestDocument = \"application/xml\",\n                responseDocument = \"application/xml\",\n                eventStreamContentType = \"application/vnd.amazon.eventstream\",\n                eventStreamMessageContentType = \"application/xml\",\n            ),\n        )\n\n    override val defaultTimestampFormat: TimestampFormatTrait.Format =\n        TimestampFormatTrait.Format.DATE_TIME\n\n    override fun structuredDataParser(): StructuredDataParserGenerator =\n        RestXmlParserGenerator(codegenContext, restXmlErrors)\n\n    override fun structuredDataSerializer(): StructuredDataSerializerGenerator =\n        XmlBindingTraitSerializerGenerator(codegenContext, httpBindingResolver)\n\n    override fun parseHttpErrorMetadata(operationShape: OperationShape): RuntimeType =\n        ProtocolFunctions.crossOperationFn(\"parse_http_error_metadata\") { fnName ->\n            rustBlockTemplate(\n                \"pub fn $fnName(_response_status: u16, _response_headers: &#{Headers}, response_body: &[u8]) -> #{Result}<#{ErrorMetadataBuilder}, #{XmlDecodeError}>\",\n                *errorScope,\n            ) {\n                rust(\"#T::parse_error_metadata(response_body)\", restXmlErrors)\n            }\n        }\n\n    override fun parseEventStreamErrorMetadata(operationShape: OperationShape): RuntimeType =\n        ProtocolFunctions.crossOperationFn(\"parse_event_stream_error_metadata\") { fnName ->\n            rustBlockTemplate(\n                \"pub fn $fnName(payload: &#{Bytes}) -> #{Result}<#{ErrorMetadataBuilder}, #{XmlDecodeError}>\",\n                *errorScope,\n            ) {\n                rust(\"#T::parse_error_metadata(payload.as_ref())\", restXmlErrors)\n            }\n        }\n}\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/RpcV2Cbor.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy.protocols\n\nimport software.amazon.smithy.codegen.core.CodegenException\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.pattern.UriPattern\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.ServiceShape\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.shapes.ToShapeId\nimport software.amazon.smithy.model.traits.HttpTrait\nimport software.amazon.smithy.model.traits.TimestampFormatTrait\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenContext\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.parse.CborParserCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.parse.CborParserGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.parse.StructuredDataParserGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.serialize.CborSerializerCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.serialize.CborSerializerGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.serialize.StructuredDataSerializerGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.transformers.OperationNormalizer\nimport software.amazon.smithy.rust.codegen.core.util.hasEventStreamMember\nimport software.amazon.smithy.rust.codegen.core.util.isInputEventStream\nimport software.amazon.smithy.rust.codegen.core.util.isOutputEventStream\nimport software.amazon.smithy.rust.codegen.core.util.isStreaming\n\nclass RpcV2CborHttpBindingResolver(\n    private val model: Model,\n    private val contentTypes: ProtocolContentTypes,\n    private val serviceShape: ServiceShape,\n    private val todoHandlingInitialMessages: Boolean,\n) : HttpBindingResolver {\n    private fun bindings(shape: ToShapeId): List<HttpBindingDescriptor> {\n        val members = shape.let { model.expectShape(it.toShapeId()) }.members()\n        // TODO(https://github.com/smithy-lang/smithy-rs/issues/2237): Remove the exception once the server supports non-streaming members\n        if (todoHandlingInitialMessages && members.size > 1 && members.any { it.isStreaming(model) }) {\n            throw CodegenException(\n                \"We only support one payload member if that payload contains a streaming member.\" +\n                    \"Tracking issue to relax this constraint: https://github.com/smithy-lang/smithy-rs/issues/4325\",\n            )\n        }\n\n        return members.map {\n            if (it.isStreaming(model)) {\n                HttpBindingDescriptor(it, HttpLocation.PAYLOAD, \"document\")\n            } else {\n                HttpBindingDescriptor(it, HttpLocation.DOCUMENT, \"document\")\n            }\n        }\n            .toList()\n    }\n\n    override fun httpTrait(operationShape: OperationShape): HttpTrait =\n        HttpTrait.builder()\n            .code(200)\n            .method(\"POST\")\n            .uri(UriPattern.parse(\"/service/${serviceShape.id.name}/operation/${operationShape.id.name}\"))\n            .build()\n\n    override fun requestBindings(operationShape: OperationShape) = bindings(operationShape.inputShape)\n\n    override fun responseBindings(operationShape: OperationShape) = bindings(operationShape.outputShape)\n\n    override fun errorResponseBindings(errorShape: ToShapeId) = bindings(errorShape)\n\n    /**\n     * https://smithy.io/2.0/additional-specs/protocols/smithy-rpc-v2.html#requests\n     * > Requests for operations with no defined input type MUST NOT contain bodies in their HTTP requests.\n     * > The `Content-Type` for the serialization format MUST NOT be set.\n     */\n    override fun requestContentType(operationShape: OperationShape): String? =\n        if (OperationNormalizer.hadUserModeledOperationInput(operationShape, model)) {\n            if (operationShape.isInputEventStream(model)) {\n                contentTypes.eventStreamContentType\n            } else {\n                contentTypes.requestDocument\n            }\n        } else {\n            null\n        }\n\n    /**\n     * https://smithy.io/2.0/additional-specs/protocols/smithy-rpc-v2.html#responses\n     * > Responses for operations with no defined output type MUST NOT contain bodies in their HTTP responses.\n     * > The `Content-Type` for the serialization format MUST NOT be set.\n     */\n    override fun responseContentType(operationShape: OperationShape): String? =\n        if (OperationNormalizer.hadUserModeledOperationOutput(operationShape, model)) {\n            if (operationShape.isOutputEventStream(model)) {\n                contentTypes.eventStreamContentType\n            } else {\n                contentTypes.responseDocument\n            }\n        } else {\n            null\n        }\n\n    override fun legacyBackwardsCompatContentType(operationShape: OperationShape): String? =\n        if (operationShape.isOutputEventStream(model)) {\n            // Return \"application/cbor\" for backwards compatibility\n            contentTypes.responseDocument\n        } else {\n            null\n        }\n\n    override fun eventStreamMessageContentType(memberShape: MemberShape): String? =\n        ProtocolContentTypes.eventStreamMemberContentType(model, memberShape, \"application/cbor\")\n\n    override fun handlesEventStreamInitialRequest(shape: Shape): Boolean {\n        // True if the operation input contains an event stream member as well as non-event stream member.\n        return when (shape) {\n            is OperationShape -> {\n                shape.isInputEventStream(model) && requestBindings(shape).any { it.location == HttpLocation.DOCUMENT }\n            }\n\n            is StructureShape -> {\n                shape.hasEventStreamMember(model) && bindings(shape).any { it.location == HttpLocation.DOCUMENT }\n            }\n\n            else -> false\n        }\n    }\n\n    override fun handlesEventStreamInitialResponse(shape: Shape): Boolean {\n        // True if the operation output contains an event stream member.\n        // See the comment in `AwsJsonHttpBindingResolver` explaining why this is asymmetrical compared to\n        // `handlesEventStreamInitialRequest`.\n        return when (shape) {\n            is OperationShape -> shape.isOutputEventStream(model)\n            is StructureShape -> shape.hasEventStreamMember(model)\n            else -> false\n        }\n    }\n}\n\nopen class RpcV2Cbor(\n    val codegenContext: CodegenContext,\n    private val serializeCustomization: List<CborSerializerCustomization> = listOf(),\n    private val parserCustomization: List<CborParserCustomization> = listOf(),\n) : Protocol {\n    private val runtimeConfig = codegenContext.runtimeConfig\n\n    override val httpBindingResolver: HttpBindingResolver =\n        RpcV2CborHttpBindingResolver(\n            codegenContext.model,\n            ProtocolContentTypes(\n                requestDocument = \"application/cbor\",\n                responseDocument = \"application/cbor\",\n                eventStreamContentType = \"application/vnd.amazon.eventstream\",\n                eventStreamMessageContentType = \"application/cbor\",\n            ),\n            codegenContext.serviceShape,\n            false,\n        )\n\n    // Note that [CborParserGenerator] and [CborSerializerGenerator] automatically (de)serialize timestamps\n    // using floating point seconds from the epoch.\n    override val defaultTimestampFormat: TimestampFormatTrait.Format = TimestampFormatTrait.Format.EPOCH_SECONDS\n\n    // The accept header is required by the spec (and by all of the protocol tests)\n    override fun additionalRequestHeaders(operationShape: OperationShape): List<Pair<String, String>> =\n        listOf(\n            \"smithy-protocol\" to \"rpc-v2-cbor\",\n            // Empty input/output still requires the \"Accept\" header to be set to \"application/cbor\"\n            // https://github.com/smithy-lang/smithy/blob/085ad738ef2acf7a8a7f13db5aecd5a8bb8b58dc/smithy-protocol-tests/model/rpcv2Cbor/empty-input-output.smithy#L17\n            \"accept\" to (\n                httpBindingResolver.responseContentType(operationShape)?.let {\n                    // Append application/cbor for backward compatibility with servers that only handle application/cbor\n                    if (it == \"application/vnd.amazon.eventstream\") \"$it, application/cbor\" else it\n                } ?: \"application/cbor\"\n            ),\n        )\n\n    override fun additionalResponseHeaders(operationShape: OperationShape): List<Pair<String, String>> =\n        listOf(\"smithy-protocol\" to \"rpc-v2-cbor\")\n\n    override fun structuredDataParser(): StructuredDataParserGenerator =\n        CborParserGenerator(\n            codegenContext, httpBindingResolver,\n            handleNullForNonSparseCollection = { collectionName: String ->\n                writable {\n                    rustTemplate(\n                        \"\"\"\n                        return #{Err}(#{Error}::custom(\"dense $collectionName cannot contain null values\", decoder.position()))\n                        \"\"\",\n                        \"Error\" to RuntimeType.smithyCbor(runtimeConfig).resolve(\"decode::DeserializeError\"),\n                        *RuntimeType.preludeScope,\n                    )\n                }\n            },\n            customizations = parserCustomization,\n        )\n\n    override fun structuredDataSerializer(): StructuredDataSerializerGenerator =\n        CborSerializerGenerator(codegenContext, httpBindingResolver, customizations = serializeCustomization)\n\n    override fun parseHttpErrorMetadata(operationShape: OperationShape): RuntimeType =\n        RuntimeType.cborErrors(runtimeConfig).resolve(\"parse_error_metadata\")\n\n    override fun parseEventStreamErrorMetadata(operationShape: OperationShape): RuntimeType =\n        ProtocolFunctions.crossOperationFn(\"parse_event_stream_error_metadata\") { fnName ->\n            rustTemplate(\n                \"\"\"\n                pub fn $fnName(payload: &#{Bytes}) -> #{Result}<#{ErrorMetadataBuilder}, #{DeserializeError}> {\n                    #{cbor_errors}::parse_error_metadata(0, &#{Headers}::new(), payload)\n                }\n                \"\"\",\n                \"cbor_errors\" to RuntimeType.cborErrors(runtimeConfig),\n                \"Bytes\" to RuntimeType.Bytes,\n                \"ErrorMetadataBuilder\" to RuntimeType.errorMetadataBuilder(runtimeConfig),\n                \"DeserializeError\" to\n                    CargoDependency.smithyCbor(runtimeConfig).toType()\n                        .resolve(\"decode::DeserializeError\"),\n                \"Headers\" to RuntimeType.headers(runtimeConfig),\n                *RuntimeType.preludeScope,\n            )\n        }\n\n    // Unlike other protocols, the `rpcv2Cbor` protocol requires that `Content-Length` is always set\n    // unless there is no input or if the operation is an event stream, see\n    // https://github.com/smithy-lang/smithy/blob/6466fe77c65b8a17b219f0b0a60c767915205f95/smithy-protocol-tests/model/rpcv2Cbor/empty-input-output.smithy#L106\n    // TODO(https://github.com/smithy-lang/smithy-rs/issues/3772): Do not set `Content-Length` for event stream operations\n    override fun needsRequestContentLength(operationShape: OperationShape) = operationShape.input.isPresent\n}\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/XmlNameIndex.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy.protocols\n\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.knowledge.KnowledgeIndex\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.traits.XmlAttributeTrait\nimport software.amazon.smithy.model.traits.XmlNameTrait\nimport software.amazon.smithy.rust.codegen.core.smithy.traits.SyntheticInputTrait\nimport software.amazon.smithy.rust.codegen.core.smithy.traits.SyntheticOutputTrait\nimport software.amazon.smithy.rust.codegen.core.util.expectTrait\nimport software.amazon.smithy.rust.codegen.core.util.getTrait\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\nimport software.amazon.smithy.rust.codegen.core.util.inputShape\nimport software.amazon.smithy.rust.codegen.core.util.outputShape\n\n/**\n * KnowledgeIndex to determine the name for a given shape based on the XmlName trait and the shape's id.\n */\nclass XmlNameIndex(private val model: Model) : KnowledgeIndex {\n    companion object {\n        fun of(model: Model): XmlNameIndex {\n            return model.getKnowledge(XmlNameIndex::class.java, ::XmlNameIndex)\n        }\n    }\n\n    fun payloadShapeName(member: MemberShape): String {\n        val payloadShape = model.expectShape(member.target)\n        val xmlRename: XmlNameTrait? = member.getTrait() ?: payloadShape.getTrait()\n        return xmlRename?.value ?: payloadShape.id.name\n    }\n\n    /**\n     * XmlName for an operation output\n     *\n     * When an operation has no output body, null is returned\n     */\n    fun operationOutputShapeName(operationShape: OperationShape): String? {\n        val outputShape = operationShape.outputShape(model)\n        val rename = outputShape.getTrait<XmlNameTrait>()?.value\n        return rename ?: outputShape.expectTrait<SyntheticOutputTrait>().originalId?.name\n    }\n\n    fun operationInputShapeName(operationShape: OperationShape): String? {\n        val inputShape = operationShape.inputShape(model)\n        val rename = inputShape.getTrait<XmlNameTrait>()?.value\n        return rename ?: inputShape.expectTrait<SyntheticInputTrait>().originalId?.name\n    }\n\n    fun memberName(member: MemberShape): String {\n        val override = member.getTrait<XmlNameTrait>()?.value\n        return override ?: member.memberName\n    }\n}\n\ndata class XmlMemberIndex(val dataMembers: List<MemberShape>, val attributeMembers: List<MemberShape>) {\n    companion object {\n        fun fromMembers(members: List<MemberShape>): XmlMemberIndex {\n            val (attribute, data) = members.partition { it.hasTrait<XmlAttributeTrait>() }\n            return XmlMemberIndex(data, attribute)\n        }\n    }\n\n    fun isEmpty() = dataMembers.isEmpty() && attributeMembers.isEmpty()\n\n    fun isNotEmpty() = !isEmpty()\n}\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/parse/AwsQueryParserGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy.protocols.parse\n\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenContext\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\n\n/**\n * The AWS query protocol's responses are identical to REST XML's, except that they are wrapped\n * in a Response/Result tag pair:\n *\n * ```\n * <SomeOperationResponse>\n *     <SomeOperationResult>\n *         <ActualData /> <!-- This part is the same as REST XML -->\n *     </SomeOperationResult>\n * </SomeOperationResponse>\n * ```\n *\n * This class wraps [XmlBindingTraitParserGenerator] and uses it to render the vast majority\n * of the response parsing, but it overrides [operationParser] to add the protocol differences.\n */\nclass AwsQueryParserGenerator(\n    codegenContext: CodegenContext,\n    xmlErrors: RuntimeType,\n    private val xmlBindingTraitParserGenerator: XmlBindingTraitParserGenerator =\n        XmlBindingTraitParserGenerator(\n            codegenContext,\n            xmlErrors,\n        ) { context, inner ->\n            val operationName = codegenContext.symbolProvider.toSymbol(context.shape).name\n            val responseWrapperName = operationName + \"Response\"\n            val resultWrapperName = operationName + \"Result\"\n            rustTemplate(\n                \"\"\"\n                if !(${XmlBindingTraitParserGenerator.XmlName(responseWrapperName).matchExpression(\"start_el\")}) {\n                    return Err(#{XmlDecodeError}::custom(format!(\"invalid root, expected $responseWrapperName got {start_el:?}\")))\n                }\n                if let Some(mut result_tag) = decoder.next_tag() {\n                    let start_el = result_tag.start_el();\n                    if !(${XmlBindingTraitParserGenerator.XmlName(resultWrapperName).matchExpression(\"start_el\")}) {\n                        return Err(#{XmlDecodeError}::custom(format!(\"invalid result, expected $resultWrapperName got {start_el:?}\")))\n                    }\n                \"\"\",\n                \"XmlDecodeError\" to context.xmlDecodeErrorType,\n            )\n            inner(\"result_tag\")\n            rustTemplate(\n                \"\"\"\n                } else {\n                    return Err(#{XmlDecodeError}::custom(\"expected $resultWrapperName tag\"))\n                };\n                \"\"\",\n                \"XmlDecodeError\" to context.xmlDecodeErrorType,\n            )\n        },\n) : StructuredDataParserGenerator by xmlBindingTraitParserGenerator\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/parse/CborParserGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy.protocols.parse\n\nimport software.amazon.smithy.codegen.core.CodegenException\nimport software.amazon.smithy.codegen.core.Symbol\nimport software.amazon.smithy.model.shapes.BigDecimalShape\nimport software.amazon.smithy.model.shapes.BigIntegerShape\nimport software.amazon.smithy.model.shapes.BlobShape\nimport software.amazon.smithy.model.shapes.BooleanShape\nimport software.amazon.smithy.model.shapes.ByteShape\nimport software.amazon.smithy.model.shapes.CollectionShape\nimport software.amazon.smithy.model.shapes.DoubleShape\nimport software.amazon.smithy.model.shapes.FloatShape\nimport software.amazon.smithy.model.shapes.IntegerShape\nimport software.amazon.smithy.model.shapes.LongShape\nimport software.amazon.smithy.model.shapes.MapShape\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.shapes.ShortShape\nimport software.amazon.smithy.model.shapes.StringShape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.shapes.TimestampShape\nimport software.amazon.smithy.model.shapes.UnionShape\nimport software.amazon.smithy.model.traits.EnumTrait\nimport software.amazon.smithy.model.traits.SparseTrait\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.conditionalBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.join\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlockTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.withBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenContext\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.NamedCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.Section\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.UnionGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.renderUnknownVariant\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.setterName\nimport software.amazon.smithy.rust.codegen.core.smithy.isRustBoxed\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.HttpBindingResolver\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.HttpLocation\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.ProtocolFunctions\nimport software.amazon.smithy.rust.codegen.core.util.PANIC\nimport software.amazon.smithy.rust.codegen.core.util.dq\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\nimport software.amazon.smithy.rust.codegen.core.util.inputShape\nimport software.amazon.smithy.rust.codegen.core.util.isTargetUnit\nimport software.amazon.smithy.rust.codegen.core.util.outputShape\n\n/** Class describing a CBOR parser section that can be used in a customization. */\nsealed class CborParserSection(name: String) : Section(name) {\n    data class BeforeBoxingDeserializedMember(val shape: MemberShape) : CborParserSection(\"BeforeBoxingDeserializedMember\")\n\n    /**\n     * Represents a customization point in union deserialization that occurs before decoding the map structure.\n     * This allows for custom handling of union variants before the standard map decoding logic is applied.\n     * @property shape The union shape being deserialized.\n     */\n    data class UnionParserBeforeDecodingMap(val shape: UnionShape) : CborParserSection(\"UnionParserBeforeDecodingMap\")\n}\n\n/**\n * Customization class for CBOR parser generation that allows modification of union type deserialization behavior.\n * Previously, union variant discrimination was hardcoded to use `decoder.str()`. This has been made more flexible\n * to support different decoder implementations and discrimination methods.\n */\nabstract class CborParserCustomization : NamedCustomization<CborParserSection>() {\n    /**\n     * Allows customization of how union variants are discriminated during deserialization.\n     * @param defaultContext The default discrimination context containing decoder symbol and discriminator method.\n     * @return UnionVariantDiscriminatorContext that defines how to discriminate union variants.\n     */\n    open fun getUnionVariantDiscriminator(\n        unionShape: UnionShape,\n        defaultContext: CborParserGenerator.UnionVariantDiscriminatorContext,\n    ) = defaultContext\n}\n\nclass CborParserGenerator(\n    private val codegenContext: CodegenContext,\n    private val httpBindingResolver: HttpBindingResolver,\n    /** See docs for this parameter in [JsonParserGenerator]. */\n    private val returnSymbolToParse: (Shape) -> ReturnSymbolToParse = { shape ->\n        ReturnSymbolToParse(codegenContext.symbolProvider.toSymbol(shape), false)\n    },\n    /** Lambda that controls what to do when seeing a NULL value while parsing an element for a non-sparse collection */\n    private val handleNullForNonSparseCollection: (String) -> Writable,\n    /** Lambda that determines whether the input to a builder setter needs to be wrapped in `Some` */\n    private val shouldWrapBuilderMemberSetterInputWithOption: (MemberShape) -> Boolean = { _ -> true },\n    private val customizations: List<CborParserCustomization> = emptyList(),\n) : StructuredDataParserGenerator {\n    /**\n     * Context class that encapsulates the information needed to discriminate union variants during deserialization.\n     * @property decoderSymbol The symbol representing the decoder type.\n     * @property variantDiscriminatorExpression The method call expression to determine the union variant.\n     */\n    data class UnionVariantDiscriminatorContext(\n        val decoderSymbol: Symbol,\n        val variantDiscriminatorExpression: Writable,\n    )\n\n    private val model = codegenContext.model\n    private val symbolProvider = codegenContext.symbolProvider\n    private val runtimeConfig = codegenContext.runtimeConfig\n    private val codegenTarget = codegenContext.target\n    private val smithyCbor = CargoDependency.smithyCbor(runtimeConfig).toType()\n    private val protocolFunctions = ProtocolFunctions(codegenContext)\n    private val builderInstantiator = codegenContext.builderInstantiator()\n    private val codegenScope =\n        arrayOf(\n            *preludeScope,\n            \"SmithyCbor\" to smithyCbor,\n            \"Decoder\" to smithyCbor.resolve(\"Decoder\"),\n            \"Error\" to smithyCbor.resolve(\"decode::DeserializeError\"),\n            \"HashMap\" to RuntimeType.HashMap,\n            *preludeScope,\n        )\n\n    private fun handleNullForCollection(\n        collectionName: String,\n        isSparse: Boolean,\n    ) = writable {\n        if (isSparse) {\n            rustTemplate(\n                \"\"\"\n                decoder.null()?;\n                #{None}\n                \"\"\",\n                *codegenScope,\n            )\n        } else {\n            rustTemplate(\n                \"#{handle_null_for_non_sparse_collection:W}\",\n                \"handle_null_for_non_sparse_collection\" to\n                    handleNullForNonSparseCollection(\n                        collectionName,\n                    ),\n            )\n        }\n    }\n\n    private fun listMemberParserFn(\n        listSymbol: Symbol,\n        isSparseList: Boolean,\n        memberShape: MemberShape,\n        returnUnconstrainedType: Boolean,\n    ) = writable {\n        rustBlockTemplate(\n            \"\"\"\n            fn member(\n                mut list: #{ListSymbol},\n                decoder: &mut #{Decoder},\n            ) -> #{Result}<#{ListSymbol}, #{Error}>\n            \"\"\",\n            *codegenScope,\n            \"ListSymbol\" to listSymbol,\n        ) {\n            rustTemplate(\n                \"\"\"\n                let value = match decoder.datatype()? {\n                    #{SmithyCbor}::data::Type::Null => {\n                        #{handleNullForCollection:W}\n                    }\n                    _ => #{DeserializeMember:W}\n                };\n                \"\"\",\n                *codegenScope,\n                \"handleNullForCollection\" to handleNullForCollection(CollectionKind.List.decoderMethodName(), isSparseList),\n                \"DeserializeMember\" to\n                    writable {\n                        conditionalBlock(\n                            \"Some(\", \")\", isSparseList,\n                        ) {\n                            rust(\"#T?\", deserializeMember(memberShape))\n                        }\n                    },\n            )\n\n            if (returnUnconstrainedType) {\n                rust(\"list.0.push(value);\")\n            } else {\n                rust(\"list.push(value);\")\n            }\n\n            rust(\"Ok(list)\")\n        }\n    }\n\n    private fun mapPairParserFnWritable(\n        keyTarget: StringShape,\n        valueShape: MemberShape,\n        isSparseMap: Boolean,\n        mapSymbol: Symbol,\n        returnUnconstrainedType: Boolean,\n    ) = writable {\n        rustBlockTemplate(\n            \"\"\"\n            fn pair(\n                mut map: #{MapSymbol},\n                decoder: &mut #{Decoder},\n            ) -> #{Result}<#{MapSymbol}, #{Error}>\n            \"\"\",\n            *codegenScope,\n            \"MapSymbol\" to mapSymbol,\n        ) {\n            val deserializeKeyWritable = deserializeString(keyTarget)\n            rustTemplate(\n                \"\"\"\n                let key = #{DeserializeKey:W}?;\n                \"\"\",\n                \"DeserializeKey\" to deserializeKeyWritable,\n            )\n            rustTemplate(\n                \"\"\"\n                let value = match decoder.datatype()? {\n                    #{SmithyCbor}::data::Type::Null => {\n                        #{handleNullForCollection:W}\n                    }\n                    _ => #{DeserializeMember:W}\n                };\n                \"\"\",\n                *codegenScope,\n                \"handleNullForCollection\" to handleNullForCollection(CollectionKind.Map.decoderMethodName(), isSparseMap),\n                \"DeserializeMember\" to\n                    writable {\n                        conditionalBlock(\n                            \"Some(\", \")\", isSparseMap,\n                        ) {\n                            rust(\"#T?\", deserializeMember(valueShape))\n                        }\n                    },\n            )\n            if (returnUnconstrainedType) {\n                rust(\"map.0.insert(key, value);\")\n            } else {\n                rust(\"map.insert(key, value);\")\n            }\n\n            rust(\"Ok(map)\")\n        }\n    }\n\n    private fun structurePairParserFnWritable(\n        builderSymbol: Symbol,\n        includedMembers: Collection<MemberShape>,\n    ) = writable {\n        rustBlockTemplate(\n            \"\"\"\n            ##[allow(clippy::match_single_binding)]\n            fn pair(\n                mut builder: #{Builder},\n                decoder: &mut #{Decoder}\n            ) -> #{Result}<#{Builder}, #{Error}>\n            \"\"\",\n            *codegenScope,\n            \"Builder\" to builderSymbol,\n        ) {\n            withBlock(\"builder = match decoder.str()?.as_ref() {\", \"};\") {\n                for (member in includedMembers) {\n                    rustBlock(\"${member.memberName.dq()} =>\") {\n                        val callBuilderSetMemberFieldWritable =\n                            writable {\n                                withBlock(\"builder.${member.setterName()}(\", \")\") {\n                                    conditionalBlock(\"Some(\", \")\", shouldWrapBuilderMemberSetterInputWithOption(member)) {\n                                        val symbol = symbolProvider.toSymbol(member)\n                                        if (symbol.isRustBoxed()) {\n                                            rustBlock(\"\") {\n                                                rustTemplate(\n                                                    \"let v = #{DeserializeMember:W}?;\",\n                                                    \"DeserializeMember\" to deserializeMember(member),\n                                                )\n\n                                                for (customization in customizations) {\n                                                    customization.section(\n                                                        CborParserSection.BeforeBoxingDeserializedMember(\n                                                            member,\n                                                        ),\n                                                    )(this)\n                                                }\n                                                rust(\"Box::new(v)\")\n                                            }\n                                        } else {\n                                            rustTemplate(\n                                                \"#{DeserializeMember:W}?\",\n                                                \"DeserializeMember\" to deserializeMember(member),\n                                            )\n                                        }\n                                    }\n                                }\n                            }\n\n                        if (member.isOptional) {\n                            // Call `builder.set_member()` only if the value for the field on the wire is not null.\n                            rustTemplate(\n                                \"\"\"\n                                #{SmithyCbor}::decode::set_optional(builder, decoder, |builder, decoder| {\n                                    Ok(#{MemberSettingWritable:W})\n                                })?\n                                \"\"\",\n                                *codegenScope,\n                                \"MemberSettingWritable\" to callBuilderSetMemberFieldWritable,\n                            )\n                        } else {\n                            callBuilderSetMemberFieldWritable.invoke(this)\n                        }\n                    }\n                }\n\n                rust(\n                    \"\"\"\n                    _ => {\n                        decoder.skip()?;\n                        builder\n                    }\n                    \"\"\",\n                )\n            }\n            rust(\"Ok(builder)\")\n        }\n    }\n\n    private fun unionPairParserFnWritable(shape: UnionShape) =\n        writable {\n            val returnSymbolToParse = returnSymbolToParse(shape)\n            // Get actual decoder type to use and the discriminating function to call to extract\n            // the variant of the union that has been encoded in the data.\n            val discriminatorContext = getUnionDiscriminatorContext(shape, \"Decoder\", \"decoder.str()?.as_ref()\")\n\n            rustBlockTemplate(\n                \"\"\"\n                fn pair(\n                    decoder: &mut #{DecoderSymbol}\n                ) -> #{Result}<#{UnionSymbol}, #{Error}>\n                \"\"\",\n                *codegenScope,\n                \"DecoderSymbol\" to discriminatorContext.decoderSymbol,\n                \"UnionSymbol\" to returnSymbolToParse.symbol,\n            ) {\n                rustTemplate(\n                    \"\"\"\n                    Ok(match #{VariableDiscriminatingExpression} {\n                    \"\"\",\n                    \"VariableDiscriminatingExpression\" to discriminatorContext.variantDiscriminatorExpression,\n                ).run {\n                    for (member in shape.members()) {\n                        val variantName = symbolProvider.toMemberName(member)\n\n                        if (member.isTargetUnit()) {\n                            rust(\n                                \"\"\"\n                                ${member.memberName.dq()} => {\n                                    decoder.skip()?;\n                                    #T::$variantName\n                                }\n                                \"\"\",\n                                returnSymbolToParse.symbol,\n                            )\n                        } else {\n                            withBlock(\"${member.memberName.dq()} => #T::$variantName(\", \"?),\", returnSymbolToParse.symbol) {\n                                deserializeMember(member).invoke(this)\n\n                                val symbol = symbolProvider.toSymbol(member)\n                                if (symbol.isRustBoxed()) {\n                                    rust(\".map(Box::new)\")\n                                }\n                            }\n                        }\n                    }\n                    when (codegenTarget.renderUnknownVariant()) {\n                        // In client mode, resolve an unknown union variant to the unknown variant.\n                        true ->\n                            rustTemplate(\n                                \"\"\"\n                                _ => {\n                                  decoder.skip()?;\n                                  #{Union}::${UnionGenerator.UNKNOWN_VARIANT_NAME}\n                                }\n                                \"\"\",\n                                \"Union\" to returnSymbolToParse.symbol,\n                                *codegenScope,\n                            )\n                        // In server mode, use strict parsing.\n                        // Consultation: https://github.com/awslabs/smithy/issues/1222\n                        false ->\n                            rustTemplate(\n                                \"variant => return Err(#{Error}::unknown_union_variant(variant, decoder.position()))\",\n                                *codegenScope,\n                            )\n                    }\n                }\n                rust(\"})\")\n            }\n        }\n\n    private fun getUnionDiscriminatorContext(\n        unionShape: UnionShape,\n        decoderType: String,\n        callMethod: String,\n    ): UnionVariantDiscriminatorContext {\n        val defaultUnionPairContext =\n            UnionVariantDiscriminatorContext(\n                smithyCbor.resolve(decoderType).toSymbol(),\n                writable { rustTemplate(callMethod) },\n            )\n        return customizations.fold(defaultUnionPairContext) { context, customization ->\n            customization.getUnionVariantDiscriminator(unionShape, context)\n        }\n    }\n\n    enum class CollectionKind {\n        Map,\n        List,\n        ;\n\n        /** Method to invoke on the decoder to decode this collection kind. **/\n        fun decoderMethodName() =\n            when (this) {\n                Map -> \"map\"\n                List -> \"list\"\n            }\n    }\n\n    /**\n     * Decode a collection of homogeneous CBOR data items: a map or an array.\n     * The first branch of the `match` corresponds to when the collection is encoded using variable-length encoding;\n     * the second branch corresponds to fixed-length encoding.\n     *\n     * https://www.rfc-editor.org/rfc/rfc8949.html#name-indefinite-length-arrays-an\n     */\n    private fun decodeCollectionLoopWritable(\n        collectionKind: CollectionKind,\n        variableBindingName: String,\n        decodeItemFnName: String,\n    ) = writable {\n        rustTemplate(\n            \"\"\"\n            match decoder.${collectionKind.decoderMethodName()}()? {\n                None => loop {\n                    match decoder.datatype()? {\n                        #{SmithyCbor}::data::Type::Break => {\n                            decoder.skip()?;\n                            break;\n                        }\n                        _ => {\n                            $variableBindingName = $decodeItemFnName($variableBindingName, decoder)?;\n                        }\n                    };\n                },\n                Some(n) => {\n                    for _ in 0..n {\n                        $variableBindingName = $decodeItemFnName($variableBindingName, decoder)?;\n                    }\n                }\n            };\n            \"\"\",\n            *codegenScope,\n        )\n    }\n\n    private fun decodeStructureMapLoopWritable() = decodeCollectionLoopWritable(CollectionKind.Map, \"builder\", \"pair\")\n\n    private fun decodeMapLoopWritable() = decodeCollectionLoopWritable(CollectionKind.Map, \"map\", \"pair\")\n\n    private fun decodeListLoopWritable() = decodeCollectionLoopWritable(CollectionKind.List, \"list\", \"member\")\n\n    /**\n     * Reusable structure parser implementation that can be used to generate parsing code for\n     * operation, error and structure shapes.\n     * We still generate the parser symbol even if there are no included members because the server\n     * generation requires parsers for all input structures.\n     */\n    private fun structureParser(\n        shape: Shape,\n        builderSymbol: Symbol,\n        includedMembers: List<MemberShape>,\n        fnNameSuffix: String? = null,\n    ): RuntimeType {\n        return protocolFunctions.deserializeFn(shape, fnNameSuffix) { fnName ->\n            rustTemplate(\n                \"\"\"\n                pub(crate) fn $fnName(value: &[u8], mut builder: #{Builder}) -> #{Result}<#{Builder}, #{Error}> {\n                    #{StructurePairParserFn:W}\n\n                    let decoder = &mut #{Decoder}::new(value);\n\n                    #{DecodeStructureMapLoop:W}\n\n                    if decoder.position() != value.len() {\n                        return Err(#{Error}::expected_end_of_stream(decoder.position()));\n                    }\n\n                    Ok(builder)\n                }\n                \"\"\",\n                \"Builder\" to builderSymbol,\n                \"StructurePairParserFn\" to structurePairParserFnWritable(builderSymbol, includedMembers),\n                \"DecodeStructureMapLoop\" to decodeStructureMapLoopWritable(),\n                *codegenScope,\n            )\n        }\n    }\n\n    override fun payloadParser(member: MemberShape): RuntimeType {\n        val shape = model.expectShape(member.target)\n        val returnSymbol = returnSymbolToParse(shape)\n        check(shape is UnionShape || shape is StructureShape) {\n            \"Payload parser should only be used on structure and union shapes.\"\n        }\n        return protocolFunctions.deserializeFn(shape, fnNameSuffix = \"payload\") { fnName ->\n            rustTemplate(\n                \"\"\"\n                pub(crate) fn $fnName(value: &[u8]) -> #{Result}<#{ReturnType}, #{Error}> {\n                    let decoder = &mut #{Decoder}::new(value);\n                    #{DeserializeMember}\n                }\n                \"\"\",\n                \"ReturnType\" to returnSymbol.symbol,\n                \"DeserializeMember\" to deserializeMember(member),\n                *codegenScope,\n            )\n        }\n    }\n\n    override fun operationParser(operationShape: OperationShape): RuntimeType? {\n        // Don't generate an operation CBOR deserializer if there is nothing bound to the HTTP body.\n        val httpDocumentMembers = httpBindingResolver.responseMembers(operationShape, HttpLocation.DOCUMENT)\n        if (httpDocumentMembers.isEmpty()) {\n            return null\n        }\n        val outputShape = operationShape.outputShape(model)\n        return structureParser(operationShape, symbolProvider.symbolForBuilder(outputShape), httpDocumentMembers)\n    }\n\n    override fun errorParser(errorShape: StructureShape): RuntimeType? {\n        if (errorShape.members().isEmpty()) {\n            return null\n        }\n        return structureParser(\n            errorShape,\n            symbolProvider.symbolForBuilder(errorShape),\n            errorShape.members().toList(),\n            fnNameSuffix = \"cbor_err\",\n        )\n    }\n\n    override fun serverInputParser(operationShape: OperationShape): RuntimeType? {\n        val includedMembers = httpBindingResolver.requestMembers(operationShape, HttpLocation.DOCUMENT)\n        if (includedMembers.isEmpty()) {\n            return null\n        }\n        val inputShape = operationShape.inputShape(model)\n        return structureParser(operationShape, symbolProvider.symbolForBuilder(inputShape), includedMembers)\n    }\n\n    private fun deserializeMember(memberShape: MemberShape) =\n        writable {\n            when (val target = model.expectShape(memberShape.target)) {\n                // Simple shapes: https://smithy.io/2.0/spec/simple-types.html\n                is BlobShape -> rust(\"decoder.blob()\")\n                is BooleanShape -> rust(\"decoder.boolean()\")\n\n                is StringShape -> deserializeString(target).invoke(this)\n\n                is ByteShape -> rust(\"decoder.byte()\")\n                is ShortShape -> rust(\"decoder.short()\")\n                is IntegerShape -> rust(\"decoder.integer()\")\n                is LongShape -> rust(\"decoder.long()\")\n\n                is FloatShape -> rust(\"decoder.float()\")\n                is DoubleShape -> rust(\"decoder.double()\")\n\n                is TimestampShape -> rust(\"decoder.timestamp()\")\n\n                // BigInteger/BigDecimal are not supported with CBOR.\n                // The Smithy RPC v2 CBOR spec requires these to be encoded using CBOR tags 2/3/4\n                // (binary bignum representation), but aws-smithy-cbor doesn't implement these tags yet.\n                is BigIntegerShape ->\n                    throw CodegenException(\n                        \"BigInteger is not supported with Concise Binary Object Representation (CBOR) protocol. \" +\n                            \"See https://github.com/smithy-lang/smithy-rs/issues/4473\",\n                    )\n                is BigDecimalShape ->\n                    throw CodegenException(\n                        \"BigDecimal is not supported with Concise Binary Object Representation (CBOR) protocol. \" +\n                            \"See https://github.com/smithy-lang/smithy-rs/issues/4473\",\n                    )\n\n                // Aggregate shapes: https://smithy.io/2.0/spec/aggregate-types.html\n                is StructureShape -> deserializeStruct(target)\n                is CollectionShape -> deserializeCollection(target)\n                is MapShape -> deserializeMap(target)\n                is UnionShape -> deserializeUnion(target)\n\n                // Note that no protocol using CBOR serialization supports `document` shapes.\n                else -> PANIC(\"unexpected shape: $target\")\n            }\n        }\n\n    private fun deserializeString(target: StringShape) =\n        writable {\n            when (target.hasTrait<EnumTrait>()) {\n                true -> {\n                    if (this@CborParserGenerator.returnSymbolToParse(target).isUnconstrained) {\n                        rust(\"decoder.string()\")\n                    } else {\n                        rust(\"decoder.string().map(|s| #T::from(s.as_ref()))\", symbolProvider.toSymbol(target))\n                    }\n                }\n                false -> rust(\"decoder.string()\")\n            }\n        }\n\n    private fun RustWriter.deserializeCollection(shape: CollectionShape) {\n        val (returnSymbol, returnUnconstrainedType) = returnSymbolToParse(shape)\n\n        val parser =\n            protocolFunctions.deserializeFn(shape) { fnName ->\n                val initContainerWritable =\n                    writable {\n                        withBlock(\"let mut list = \", \";\") {\n                            conditionalBlock(\"#{T}(\", \")\", conditional = returnUnconstrainedType, returnSymbol) {\n                                rustTemplate(\"#{Vec}::new()\", *codegenScope)\n                            }\n                        }\n                    }\n\n                rustTemplate(\n                    \"\"\"\n                    pub(crate) fn $fnName(decoder: &mut #{Decoder}) -> #{Result}<#{ReturnType}, #{Error}> {\n                        #{ListMemberParserFn:W}\n\n                        #{InitContainerWritable:W}\n\n                        #{DecodeListLoop:W}\n\n                        Ok(list)\n                    }\n                    \"\"\",\n                    \"ReturnType\" to returnSymbol,\n                    \"ListMemberParserFn\" to\n                        listMemberParserFn(\n                            returnSymbol,\n                            isSparseList = shape.hasTrait<SparseTrait>(),\n                            shape.member,\n                            returnUnconstrainedType = returnUnconstrainedType,\n                        ),\n                    \"InitContainerWritable\" to initContainerWritable,\n                    \"DecodeListLoop\" to decodeListLoopWritable(),\n                    *codegenScope,\n                )\n            }\n        rust(\"#T(decoder)\", parser)\n    }\n\n    private fun RustWriter.deserializeMap(shape: MapShape) {\n        val keyTarget = model.expectShape(shape.key.target, StringShape::class.java)\n        val (returnSymbol, returnUnconstrainedType) = returnSymbolToParse(shape)\n\n        val parser =\n            protocolFunctions.deserializeFn(shape) { fnName ->\n                val initContainerWritable =\n                    writable {\n                        withBlock(\"let mut map = \", \";\") {\n                            conditionalBlock(\"#{T}(\", \")\", conditional = returnUnconstrainedType, returnSymbol) {\n                                rustTemplate(\"#{HashMap}::new()\", *codegenScope)\n                            }\n                        }\n                    }\n\n                rustTemplate(\n                    \"\"\"\n                    pub(crate) fn $fnName(decoder: &mut #{Decoder}) -> #{Result}<#{ReturnType}, #{Error}> {\n                        #{MapPairParserFn:W}\n\n                        #{InitContainerWritable:W}\n\n                        #{DecodeMapLoop:W}\n\n                        Ok(map)\n                    }\n                    \"\"\",\n                    \"ReturnType\" to returnSymbol,\n                    \"MapPairParserFn\" to\n                        mapPairParserFnWritable(\n                            keyTarget,\n                            shape.value,\n                            isSparseMap = shape.hasTrait<SparseTrait>(),\n                            returnSymbol,\n                            returnUnconstrainedType = returnUnconstrainedType,\n                        ),\n                    \"InitContainerWritable\" to initContainerWritable,\n                    \"DecodeMapLoop\" to decodeMapLoopWritable(),\n                    *codegenScope,\n                )\n            }\n        rust(\"#T(decoder)\", parser)\n    }\n\n    private fun RustWriter.deserializeStruct(shape: StructureShape) {\n        val returnSymbolToParse = returnSymbolToParse(shape)\n        val parser =\n            protocolFunctions.deserializeFn(shape) { fnName ->\n                rustBlockTemplate(\n                    \"pub(crate) fn $fnName(decoder: &mut #{Decoder}) -> #{Result}<#{ReturnType}, #{Error}>\",\n                    \"ReturnType\" to returnSymbolToParse.symbol,\n                    *codegenScope,\n                ) {\n                    val builderSymbol = symbolProvider.symbolForBuilder(shape)\n                    val includedMembers = shape.members()\n\n                    rustTemplate(\n                        \"\"\"\n                        #{StructurePairParserFn:W}\n\n                        let mut builder = #{Builder}::default();\n\n                        #{DecodeStructureMapLoop:W}\n                        \"\"\",\n                        *codegenScope,\n                        \"StructurePairParserFn\" to structurePairParserFnWritable(builderSymbol, includedMembers),\n                        \"Builder\" to builderSymbol,\n                        \"DecodeStructureMapLoop\" to decodeStructureMapLoopWritable(),\n                    )\n\n                    // Only call `build()` if the builder is not fallible. Otherwise, return the builder.\n                    if (returnSymbolToParse.isUnconstrained) {\n                        rust(\"Ok(builder)\")\n                    } else {\n                        val builder =\n                            builderInstantiator.finalizeBuilder(\n                                \"builder\", shape,\n                            ) {\n                                rustTemplate(\n                                    \"\"\"|err| #{Error}::custom(err.to_string(), decoder.position())\"\"\", *codegenScope,\n                                )\n                            }\n                        rust(\"##[allow(clippy::needless_question_mark)]\")\n                        rustBlock(\"\") {\n                            rust(\"return Ok(#T);\", builder)\n                        }\n                    }\n                }\n            }\n        rust(\"#T(decoder)\", parser)\n    }\n\n    private fun RustWriter.deserializeUnion(shape: UnionShape) {\n        val returnSymbolToParse = returnSymbolToParse(shape)\n        val beforeDecoderMapCustomization =\n            customizations.map { customization ->\n                customization.section(\n                    CborParserSection.UnionParserBeforeDecodingMap(\n                        shape,\n                    ),\n                )\n            }.join(\"\")\n\n        val parser =\n            protocolFunctions.deserializeFn(shape) { fnName ->\n                rustTemplate(\n                    \"\"\"\n                    pub(crate) fn $fnName(decoder: &mut #{Decoder}) -> #{Result}<#{UnionSymbol}, #{Error}> {\n                        #{UnionPairParserFnWritable}\n                        #{BeforeDecoderMapCustomization:W}\n\n                        match decoder.map()? {\n                            None => {\n                                let variant = pair(decoder)?;\n                                match decoder.datatype()? {\n                                    #{SmithyCbor}::data::Type::Break => {\n                                        decoder.skip()?;\n                                        Ok(variant)\n                                    }\n                                    ty => Err(\n                                        #{Error}::unexpected_union_variant(\n                                            ty,\n                                            decoder.position(),\n                                        ),\n                                    ),\n                                }\n                            }\n                            Some(1) => pair(decoder),\n                            Some(_) => Err(#{Error}::mixed_union_variants(decoder.position()))\n                        }\n                    }\n                    \"\"\",\n                    \"UnionSymbol\" to returnSymbolToParse.symbol,\n                    \"UnionPairParserFnWritable\" to unionPairParserFnWritable(shape),\n                    \"BeforeDecoderMapCustomization\" to beforeDecoderMapCustomization,\n                    *codegenScope,\n                )\n            }\n        rust(\"#T(decoder)\", parser)\n    }\n}\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/parse/Ec2QueryParserGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy.protocols.parse\n\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenContext\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\n\n/**\n * The EC2 query protocol's responses are identical to REST XML's, except that they are wrapped\n * in a Response tag:\n *\n * ```\n * <SomeOperationResponse>\n *    <ActualData /> <!-- This part is the same as REST XML -->\n * </SomeOperationResponse>\n * ```\n *\n * This class wraps [XmlBindingTraitParserGenerator] and uses it to render the vast majority\n * of the response parsing, but it overrides [operationParser] to add the protocol differences.\n */\nclass Ec2QueryParserGenerator(\n    codegenContext: CodegenContext,\n    xmlErrors: RuntimeType,\n    private val xmlBindingTraitParserGenerator: XmlBindingTraitParserGenerator =\n        XmlBindingTraitParserGenerator(\n            codegenContext,\n            xmlErrors,\n        ) { context, inner ->\n            val operationName = codegenContext.symbolProvider.toSymbol(context.shape).name\n            val responseWrapperName = operationName + \"Response\"\n            rustTemplate(\n                \"\"\"\n                if !(${XmlBindingTraitParserGenerator.XmlName(responseWrapperName).matchExpression(\"start_el\")}) {\n                    return Err(#{XmlDecodeError}::custom(format!(\"invalid root, expected $responseWrapperName got {start_el:?}\")))\n                }\n                \"\"\",\n                \"XmlDecodeError\" to context.xmlDecodeErrorType,\n            )\n            inner(\"decoder\")\n        },\n) : StructuredDataParserGenerator by xmlBindingTraitParserGenerator\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/parse/EventStreamUnmarshallerGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy.protocols.parse\n\nimport software.amazon.smithy.codegen.core.Symbol\nimport software.amazon.smithy.model.shapes.BlobShape\nimport software.amazon.smithy.model.shapes.BooleanShape\nimport software.amazon.smithy.model.shapes.ByteShape\nimport software.amazon.smithy.model.shapes.EnumShape\nimport software.amazon.smithy.model.shapes.IntegerShape\nimport software.amazon.smithy.model.shapes.LongShape\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.shapes.ShortShape\nimport software.amazon.smithy.model.shapes.StringShape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.shapes.TimestampShape\nimport software.amazon.smithy.model.shapes.UnionShape\nimport software.amazon.smithy.model.traits.EventHeaderTrait\nimport software.amazon.smithy.model.traits.EventPayloadTrait\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustModule\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.conditionalBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlockTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.withBlock\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenContext\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenTarget\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.UnionGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.renderUnknownVariant\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.setterName\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.Protocol\nimport software.amazon.smithy.rust.codegen.core.smithy.traits.SyntheticEventStreamUnionTrait\nimport software.amazon.smithy.rust.codegen.core.smithy.transformers.eventStreamErrors\nimport software.amazon.smithy.rust.codegen.core.util.dq\nimport software.amazon.smithy.rust.codegen.core.util.expectTrait\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\nimport software.amazon.smithy.rust.codegen.core.util.isTargetUnit\nimport software.amazon.smithy.rust.codegen.core.util.toPascalCase\n\nfun RustModule.Companion.eventStreamSerdeModule(): RustModule.LeafModule = private(\"event_stream_serde\")\n\nclass EventStreamUnmarshallerGenerator(\n    private val protocol: Protocol,\n    codegenContext: CodegenContext,\n    private val operationShape: OperationShape,\n    private val unionShape: UnionShape,\n) {\n    private val model = codegenContext.model\n    private val builderInstantiator = codegenContext.builderInstantiator()\n    private val symbolProvider = codegenContext.symbolProvider\n    private val codegenTarget = codegenContext.target\n    private val runtimeConfig = codegenContext.runtimeConfig\n    private val unionSymbol = symbolProvider.toSymbol(unionShape)\n    private val errorSymbol =\n        if (codegenTarget == CodegenTarget.SERVER && unionShape.eventStreamErrors().isEmpty()) {\n            RuntimeType.smithyHttp(runtimeConfig).resolve(\"event_stream::MessageStreamError\").toSymbol()\n        } else {\n            symbolProvider.symbolForEventStreamError(unionShape)\n        }\n    private val smithyEventStream = RuntimeType.smithyEventStream(runtimeConfig)\n    private val smithyTypes = RuntimeType.smithyTypes(runtimeConfig)\n    private val eventStreamSerdeModule = RustModule.eventStreamSerdeModule()\n    private val codegenScope =\n        arrayOf(\n            \"Blob\" to RuntimeType.blob(runtimeConfig),\n            \"expect_fns\" to smithyEventStream.resolve(\"smithy\"),\n            \"MarshallMessage\" to smithyEventStream.resolve(\"frame::MarshallMessage\"),\n            \"Message\" to smithyTypes.resolve(\"event_stream::Message\"),\n            \"Header\" to smithyTypes.resolve(\"event_stream::Header\"),\n            \"HeaderValue\" to smithyTypes.resolve(\"event_stream::HeaderValue\"),\n            \"Error\" to smithyEventStream.resolve(\"error::Error\"),\n            \"OpError\" to errorSymbol,\n            \"SmithyError\" to RuntimeType.smithyTypes(runtimeConfig).resolve(\"Error\"),\n            \"tracing\" to RuntimeType.Tracing,\n            \"UnmarshalledMessage\" to smithyEventStream.resolve(\"frame::UnmarshalledMessage\"),\n            \"UnmarshallMessage\" to smithyEventStream.resolve(\"frame::UnmarshallMessage\"),\n        )\n\n    fun render(): RuntimeType {\n        val unmarshallerType = unionShape.eventStreamUnmarshallerType()\n        return RuntimeType.forInlineFun(\"${unmarshallerType.name}::new\", eventStreamSerdeModule) {\n            renderUnmarshaller(unmarshallerType, unionSymbol)\n        }\n    }\n\n    private fun RustWriter.renderUnmarshaller(\n        unmarshallerType: RuntimeType,\n        unionSymbol: Symbol,\n    ) {\n        val unmarshallerTypeName = unmarshallerType.name\n        rust(\n            \"\"\"\n            ##[non_exhaustive]\n            ##[derive(Debug)]\n            pub struct $unmarshallerTypeName;\n\n            impl $unmarshallerTypeName {\n                pub fn new() -> Self {\n                    $unmarshallerTypeName\n                }\n            }\n            \"\"\",\n        )\n\n        rustBlockTemplate(\n            \"impl #{UnmarshallMessage} for ${unmarshallerType.name}\",\n            *codegenScope,\n        ) {\n            rust(\"type Output = #T;\", unionSymbol)\n            rust(\"type Error = #T;\", errorSymbol)\n\n            rustBlockTemplate(\n                \"\"\"\n                fn unmarshall(\n                    &self,\n                    message: &#{Message}\n                ) -> std::result::Result<#{UnmarshalledMessage}<Self::Output, Self::Error>, #{Error}>\n                \"\"\",\n                *codegenScope,\n            ) {\n                rustTemplate(\"let response_headers = #{expect_fns}::parse_response_headers(message)?;\", *codegenScope)\n                rustBlock(\"match response_headers.message_type.as_str()\") {\n                    rustBlock(\"\\\"event\\\" => \") {\n                        renderUnmarshallEvent()\n                    }\n                    rustBlock(\"\\\"exception\\\" => \") {\n                        renderUnmarshallError()\n                    }\n                    rustBlock(\"value => \") {\n                        rustTemplate(\n                            \"return Err(#{Error}::unmarshalling(format!(\\\"unrecognized :message-type: {value}\\\")));\",\n                            *codegenScope,\n                        )\n                    }\n                }\n            }\n        }\n    }\n\n    private fun expectedContentType(payloadTarget: Shape): String? =\n        when (payloadTarget) {\n            is BlobShape -> \"application/octet-stream\"\n            is StringShape -> \"text/plain\"\n            else -> null\n        }\n\n    private fun RustWriter.renderUnmarshallEvent() {\n        rustBlock(\"match response_headers.smithy_type.as_str()\") {\n            for (member in unionShape.members()) {\n                val target = model.expectShape(member.target, StructureShape::class.java)\n                rustBlock(\"${member.memberName.dq()} => \") {\n                    renderUnmarshallUnionMember(member, target)\n                }\n            }\n            rustBlock(\"_unknown_variant => \") {\n                when (codegenTarget.renderUnknownVariant()) {\n                    true ->\n                        rustTemplate(\n                            \"Ok(#{UnmarshalledMessage}::Event(#{Output}::${UnionGenerator.UNKNOWN_VARIANT_NAME}))\",\n                            \"Output\" to unionSymbol,\n                            *codegenScope,\n                        )\n\n                    false ->\n                        rustTemplate(\n                            \"return Err(#{Error}::unmarshalling(format!(\\\"unrecognized :event-type: {_unknown_variant}\\\")));\",\n                            *codegenScope,\n                        )\n                }\n            }\n        }\n    }\n\n    private fun RustWriter.renderUnmarshallUnionMember(\n        unionMember: MemberShape,\n        unionStruct: StructureShape,\n    ) {\n        val unionMemberName = symbolProvider.toMemberName(unionMember)\n        val empty = unionStruct.members().isEmpty()\n        val payloadOnly =\n            unionStruct.members().none { it.hasTrait<EventPayloadTrait>() || it.hasTrait<EventHeaderTrait>() }\n        when {\n            // Don't attempt to parse the payload for an empty struct. The payload can be empty, or if the model was\n            // updated since the code was generated, it can have content that would not be understood.\n            empty -> {\n                if (unionMember.isTargetUnit()) {\n                    rustTemplate(\n                        \"Ok(#{UnmarshalledMessage}::Event(#{Output}::$unionMemberName))\",\n                        \"Output\" to unionSymbol,\n                        *codegenScope,\n                    )\n                } else {\n                    rustTemplate(\n                        \"Ok(#{UnmarshalledMessage}::Event(#{Output}::$unionMemberName(#{UnionStruct}::builder().build())))\",\n                        \"Output\" to unionSymbol,\n                        \"UnionStruct\" to symbolProvider.toSymbol(unionStruct),\n                        *codegenScope,\n                    )\n                }\n            }\n\n            payloadOnly -> {\n                withBlock(\"let parsed = \", \";\") {\n                    renderParseProtocolPayload(unionMember)\n                }\n                rustTemplate(\n                    \"Ok(#{UnmarshalledMessage}::Event(#{Output}::$unionMemberName(parsed)))\",\n                    \"Output\" to unionSymbol,\n                    *codegenScope,\n                )\n            }\n\n            else -> {\n                rust(\"let mut builder = #T::default();\", symbolProvider.symbolForBuilder(unionStruct))\n                val payloadMember = unionStruct.members().firstOrNull { it.hasTrait<EventPayloadTrait>() }\n                if (payloadMember != null) {\n                    renderUnmarshallEventPayload(payloadMember)\n                }\n                val headerMembers = unionStruct.members().filter { it.hasTrait<EventHeaderTrait>() }\n                if (headerMembers.isNotEmpty()) {\n                    rustBlock(\"for header in message.headers()\") {\n                        rustBlock(\"match header.name().as_str()\") {\n                            for (member in headerMembers) {\n                                rustBlock(\"${member.memberName.dq()} => \") {\n                                    renderUnmarshallEventHeader(member)\n                                }\n                            }\n                            rust(\"// Event stream protocol headers start with ':'\")\n                            rustBlock(\"name => if !name.starts_with(':')\") {\n                                rustTemplate(\n                                    \"#{tracing}::trace!(\\\"Unrecognized event stream message header: {}\\\", name);\",\n                                    *codegenScope,\n                                )\n                            }\n                        }\n                    }\n                }\n                // Handle implicit payload members: members with neither @eventPayload nor @eventHeader.\n                // Per the Smithy spec, these are collectively serialized as a protocol-specific document\n                // in the message body.\n                val implicitMembers =\n                    unionStruct.members().filter {\n                        !it.hasTrait<EventPayloadTrait>() && !it.hasTrait<EventHeaderTrait>()\n                    }\n                if (implicitMembers.isNotEmpty() && payloadMember == null) {\n                    val parser = protocol.structuredDataParser().errorParser(unionStruct)\n                    if (parser != null) {\n                        rustTemplate(\n                            \"\"\"\n                            builder = #{parser}(&message.payload()[..], builder)\n                                .map_err(|err| #{Error}::unmarshalling(format!(\"failed to unmarshall: {err}\")))?;\n                            \"\"\",\n                            \"parser\" to parser,\n                            *codegenScope,\n                        )\n                    }\n                }\n                rustTemplate(\n                    \"Ok(#{UnmarshalledMessage}::Event(#{Output}::$unionMemberName(builder.build())))\",\n                    \"Output\" to unionSymbol,\n                    *codegenScope,\n                )\n            }\n        }\n    }\n\n    private fun RustWriter.renderUnmarshallEventHeader(member: MemberShape) {\n        withBlock(\"builder = builder.${member.setterName()}(\", \");\") {\n            conditionalBlock(\"Some(\", \")\", member.isOptional) {\n                when (val target = model.expectShape(member.target)) {\n                    is BooleanShape -> rustTemplate(\"#{expect_fns}::expect_bool(header)?\", *codegenScope)\n                    is ByteShape -> rustTemplate(\"#{expect_fns}::expect_byte(header)?\", *codegenScope)\n                    is ShortShape -> rustTemplate(\"#{expect_fns}::expect_int16(header)?\", *codegenScope)\n                    is IntegerShape -> rustTemplate(\"#{expect_fns}::expect_int32(header)?\", *codegenScope)\n                    is LongShape -> rustTemplate(\"#{expect_fns}::expect_int64(header)?\", *codegenScope)\n                    is BlobShape -> rustTemplate(\"#{expect_fns}::expect_byte_array(header)?\", *codegenScope)\n                    is EnumShape -> rustTemplate(\"#{expect_fns}::expect_string(header)?.as_str().into()\", *codegenScope)\n                    is StringShape -> rustTemplate(\"#{expect_fns}::expect_string(header)?\", *codegenScope)\n                    is TimestampShape -> rustTemplate(\"#{expect_fns}::expect_timestamp(header)?\", *codegenScope)\n                    else -> throw IllegalStateException(\"unsupported event stream header shape type: $target\")\n                }\n            }\n        }\n    }\n\n    private fun RustWriter.renderUnmarshallEventPayload(member: MemberShape) {\n        val target = model.expectShape(member.target)\n        expectedContentType(target)?.also { contentType ->\n            rustTemplate(\n                \"\"\"\n                let content_type = response_headers.content_type().unwrap_or_default();\n                if content_type != ${contentType.dq()} {\n                    return Err(#{Error}::unmarshalling(format!(\n                        \"expected :content-type to be '$contentType', but was '{content_type}'\"\n                    )))\n                }\n                \"\"\",\n                *codegenScope,\n            )\n        }\n        withBlock(\"builder = builder.${member.setterName()}(\", \");\") {\n            conditionalBlock(\"Some(\", \")\", member.isOptional) {\n                when (target) {\n                    is BlobShape -> {\n                        rustTemplate(\"#{Blob}::new(message.payload().as_ref())\", *codegenScope)\n                    }\n\n                    is StringShape -> {\n                        rustTemplate(\n                            \"\"\"\n                            ::std::str::from_utf8(message.payload())\n                                .map_err(|_| #{Error}::unmarshalling(\"message payload is not valid UTF-8\"))?\n                                .to_owned()\n                            \"\"\",\n                            *codegenScope,\n                        )\n                    }\n\n                    is UnionShape, is StructureShape -> {\n                        renderParseProtocolPayload(member)\n                    }\n                }\n            }\n        }\n    }\n\n    private fun RustWriter.renderParseProtocolPayload(member: MemberShape) {\n        val memberName = symbolProvider.toMemberName(member)\n        val parser = protocol.structuredDataParser().payloadParser(member)\n        rustTemplate(\n            \"\"\"\n            #{parser}(&message.payload()[..])\n                .map_err(|err| {\n                    #{Error}::unmarshalling(format!(\"failed to unmarshall $memberName: {err}\"))\n                })?\n            \"\"\",\n            \"parser\" to parser,\n            *codegenScope,\n        )\n    }\n\n    private fun RustWriter.renderUnmarshallError() {\n        when (codegenTarget) {\n            CodegenTarget.CLIENT -> {\n                rustTemplate(\n                    \"\"\"\n                    let generic = match #{parse_error_metadata}(message.payload()) {\n                        Ok(builder) => builder.build(),\n                        Err(err) => return Ok(#{UnmarshalledMessage}::Error(#{OpError}::unhandled(err))),\n                    };\n                    \"\"\",\n                    \"parse_error_metadata\" to protocol.parseEventStreamErrorMetadata(operationShape),\n                    *codegenScope,\n                )\n            }\n\n            CodegenTarget.SERVER -> {}\n        }\n\n        val syntheticUnion = unionShape.expectTrait<SyntheticEventStreamUnionTrait>()\n        if (syntheticUnion.errorMembers.isNotEmpty()) {\n            // clippy::single-match implied, using if when there's only one error\n            val (header, matchOperator) =\n                if (syntheticUnion.errorMembers.size > 1) {\n                    listOf(\"match response_headers.smithy_type.as_str() {\", \"=>\")\n                } else {\n                    listOf(\"if response_headers.smithy_type.as_str() == \", \"\")\n                }\n            rust(header)\n            for (member in syntheticUnion.errorMembers) {\n                rustBlock(\"${member.memberName.dq()} $matchOperator \") {\n                    // TODO(EventStream): Errors on the operation can be disjoint with errors in the union,\n                    //  so we need to generate a new top-level Error type for each event stream union.\n                    when (codegenTarget) {\n                        // TODO(https://github.com/smithy-lang/smithy-rs/issues/1970) It should be possible to unify these branches now\n                        CodegenTarget.CLIENT -> {\n                            val target = model.expectShape(member.target, StructureShape::class.java)\n                            val parser = protocol.structuredDataParser().errorParser(target)\n                            if (parser != null) {\n                                rust(\"let mut builder = #T::default();\", symbolProvider.symbolForBuilder(target))\n                                rustTemplate(\n                                    \"\"\"\n                                    builder = #{parser}(&message.payload()[..], builder)\n                                        .map_err(|err| {\n                                            #{Error}::unmarshalling(format!(\"failed to unmarshall ${member.memberName}: {err}\"))\n                                        })?;\n                                    builder.set_meta(Some(generic));\n                                    return Ok(#{UnmarshalledMessage}::Error(\n                                        #{OpError}::${member.target.name.toPascalCase()}(\n                                            #{build}\n                                        )\n                                    ))\n                                    \"\"\",\n                                    \"build\" to\n                                        builderInstantiator.finalizeBuilder(\n                                            \"builder\", target,\n                                            mapErr = {\n                                                rustTemplate(\n                                                    \"\"\"|err|#{Error}::unmarshalling(format!(\"{err}\"))\"\"\",\n                                                    *codegenScope,\n                                                )\n                                            },\n                                        ),\n                                    \"parser\" to parser,\n                                    *codegenScope,\n                                )\n                            }\n                        }\n\n                        CodegenTarget.SERVER -> {\n                            val target = model.expectShape(member.target, StructureShape::class.java)\n                            val parser = protocol.structuredDataParser().errorParser(target)\n                            val mut =\n                                if (parser != null) {\n                                    \" mut\"\n                                } else {\n                                    \"\"\n                                }\n                            rust(\"let$mut builder = #T::default();\", symbolProvider.symbolForBuilder(target))\n                            if (parser != null) {\n                                rustTemplate(\n                                    \"\"\"\n                                    builder = #{parser}(&message.payload()[..], builder)\n                                        .map_err(|err| {\n                                            #{Error}::unmarshalling(format!(\"failed to unmarshall ${member.memberName}: {err}\"))\n                                        })?;\n                                    \"\"\",\n                                    \"parser\" to parser,\n                                    *codegenScope,\n                                )\n                            }\n                            rustTemplate(\n                                \"\"\"\n                                return Ok(#{UnmarshalledMessage}::Error(\n                                    #{OpError}::${member.target.name}(\n                                        builder.build()\n                                    )\n                                ))\n                                \"\"\",\n                                *codegenScope,\n                            )\n                        }\n                    }\n                }\n            }\n            if (syntheticUnion.errorMembers.size > 1) {\n                // it's: match ... {\n                rust(\"_ => {}\")\n                rust(\"}\")\n            }\n        }\n        when (codegenTarget) {\n            CodegenTarget.CLIENT -> {\n                rustTemplate(\"Ok(#{UnmarshalledMessage}::Error(#{OpError}::generic(generic)))\", *codegenScope)\n            }\n\n            CodegenTarget.SERVER -> {\n                rustTemplate(\n                    \"\"\"\n                    return Err(aws_smithy_eventstream::error::Error::unmarshalling(\n                    format!(\"unrecognized exception: {}\", response_headers.smithy_type.as_str()),\n                    ));\n                    \"\"\",\n                    *codegenScope,\n                )\n            }\n        }\n    }\n\n    private fun UnionShape.eventStreamUnmarshallerType(): RuntimeType {\n        val symbol = symbolProvider.toSymbol(this)\n        return RuntimeType(\"crate::event_stream_serde::${symbol.name.toPascalCase()}Unmarshaller\")\n    }\n}\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/parse/JsonParserGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy.protocols.parse\n\nimport software.amazon.smithy.codegen.core.Symbol\nimport software.amazon.smithy.model.shapes.BigDecimalShape\nimport software.amazon.smithy.model.shapes.BigIntegerShape\nimport software.amazon.smithy.model.shapes.BlobShape\nimport software.amazon.smithy.model.shapes.BooleanShape\nimport software.amazon.smithy.model.shapes.CollectionShape\nimport software.amazon.smithy.model.shapes.DocumentShape\nimport software.amazon.smithy.model.shapes.MapShape\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.NumberShape\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.shapes.StringShape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.shapes.TimestampShape\nimport software.amazon.smithy.model.shapes.UnionShape\nimport software.amazon.smithy.model.traits.EnumTrait\nimport software.amazon.smithy.model.traits.SparseTrait\nimport software.amazon.smithy.model.traits.TimestampFormatTrait\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.escape\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlockTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.withBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.withBlockTemplate\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenContext\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenTarget\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.std\nimport software.amazon.smithy.rust.codegen.core.smithy.canUseDefault\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.NamedCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.Section\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.UnionGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.renderUnknownVariant\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.setterName\nimport software.amazon.smithy.rust.codegen.core.smithy.isOptional\nimport software.amazon.smithy.rust.codegen.core.smithy.isRustBoxed\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.HttpBindingResolver\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.HttpLocation\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.ProtocolFunctions\nimport software.amazon.smithy.rust.codegen.core.util.PANIC\nimport software.amazon.smithy.rust.codegen.core.util.dq\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\nimport software.amazon.smithy.rust.codegen.core.util.inputShape\nimport software.amazon.smithy.rust.codegen.core.util.isTargetUnit\nimport software.amazon.smithy.rust.codegen.core.util.outputShape\nimport software.amazon.smithy.utils.StringUtils\n\n/**\n * Class describing a JSON parser section that can be used in a customization.\n */\nsealed class JsonParserSection(name: String) : Section(name) {\n    data class BeforeBoxingDeserializedMember(val shape: MemberShape) :\n        JsonParserSection(\"BeforeBoxingDeserializedMember\")\n\n    data class AfterTimestampDeserializedMember(val shape: MemberShape) :\n        JsonParserSection(\"AfterTimestampDeserializedMember\")\n\n    data class AfterBlobDeserializedMember(val shape: MemberShape) : JsonParserSection(\"AfterBlobDeserializedMember\")\n\n    data class AfterDocumentDeserializedMember(val shape: MemberShape) :\n        JsonParserSection(\"AfterDocumentDeserializedMember\")\n\n    /**\n     * Represents a customization point at the beginning of union deserialization, before any token\n     * processing occurs.\n     */\n    data class BeforeUnionDeserialize(val shape: UnionShape) :\n        JsonParserSection(\"BeforeUnionDeserialize\")\n}\n\n/**\n * Customization for the JSON parser.\n */\ntypealias JsonParserCustomization = NamedCustomization<JsonParserSection>\n\nclass JsonParserGenerator(\n    private val codegenContext: CodegenContext,\n    private val httpBindingResolver: HttpBindingResolver,\n    /** Function that maps a MemberShape into a JSON field name */\n    private val jsonName: (MemberShape) -> String,\n    /**\n     * Whether we should parse a value for a shape into its associated unconstrained type. For example, when the shape\n     * is a `StructureShape`, we should construct and return a builder instead of building into the final `struct` the\n     * user gets. This is only relevant for the server, that parses the incoming request and only after enforces\n     * constraint traits.\n     *\n     * The function returns a data class that signals the return symbol that should be parsed, and whether it's\n     * unconstrained or not.\n     */\n    private val returnSymbolToParse: (Shape) -> ReturnSymbolToParse = { shape ->\n        ReturnSymbolToParse(codegenContext.symbolProvider.toSymbol(shape), false)\n    },\n    private val customizations: List<JsonParserCustomization> = listOf(),\n) : StructuredDataParserGenerator {\n    private val model = codegenContext.model\n    private val symbolProvider = codegenContext.symbolProvider\n    private val runtimeConfig = codegenContext.runtimeConfig\n    private val codegenTarget = codegenContext.target\n    private val smithyJson = CargoDependency.smithyJson(runtimeConfig).toType()\n    private val protocolFunctions = ProtocolFunctions(codegenContext)\n    private val builderInstantiator = codegenContext.builderInstantiator()\n    private val codegenScope =\n        arrayOf(\n            \"Error\" to smithyJson.resolve(\"deserialize::error::DeserializeError\"),\n            \"expect_blob_or_null\" to smithyJson.resolve(\"deserialize::token::expect_blob_or_null\"),\n            \"expect_bool_or_null\" to smithyJson.resolve(\"deserialize::token::expect_bool_or_null\"),\n            \"expect_document\" to smithyJson.resolve(\"deserialize::token::expect_document\"),\n            \"expect_number_or_null\" to smithyJson.resolve(\"deserialize::token::expect_number_or_null\"),\n            \"expect_number_as_string_or_null\" to smithyJson.resolve(\"deserialize::token::expect_number_as_string_or_null\"),\n            \"expect_start_array\" to smithyJson.resolve(\"deserialize::token::expect_start_array\"),\n            \"expect_start_object\" to smithyJson.resolve(\"deserialize::token::expect_start_object\"),\n            \"expect_string_or_null\" to smithyJson.resolve(\"deserialize::token::expect_string_or_null\"),\n            \"expect_timestamp_or_null\" to smithyJson.resolve(\"deserialize::token::expect_timestamp_or_null\"),\n            \"json_token_iter\" to smithyJson.resolve(\"deserialize::json_token_iter\"),\n            \"Peekable\" to RuntimeType.std.resolve(\"iter::Peekable\"),\n            \"skip_value\" to smithyJson.resolve(\"deserialize::token::skip_value\"),\n            \"skip_to_end\" to smithyJson.resolve(\"deserialize::token::skip_to_end\"),\n            \"Token\" to smithyJson.resolve(\"deserialize::Token\"),\n            \"or_empty\" to orEmptyJson(),\n            *preludeScope,\n        )\n\n    /**\n     * Reusable structure parser implementation that can be used to generate parsing code for\n     * operation, error and structure shapes.\n     * We still generate the parser symbol even if there are no included members because the server\n     * generation requires parsers for all input structures.\n     */\n    private fun structureParser(\n        shape: Shape,\n        builderSymbol: Symbol,\n        includedMembers: List<MemberShape>,\n        fnNameSuffix: String? = null,\n    ): RuntimeType {\n        return protocolFunctions.deserializeFn(shape, fnNameSuffix) { fnName ->\n            val unusedMut = if (includedMembers.isEmpty()) \"##[allow(unused_mut)] \" else \"\"\n            rustBlockTemplate(\n                \"\"\"\n                pub(crate) fn $fnName(_value: &[u8], ${unusedMut}mut builder: #{Builder}) -> #{Result}<#{Builder}, #{Error}>\n                \"\"\",\n                \"Builder\" to builderSymbol,\n                *codegenScope,\n            ) {\n                rustTemplate(\n                    \"\"\"\n                    let mut tokens_owned = #{json_token_iter}(#{or_empty}(_value)).peekable();\n                    let tokens = &mut tokens_owned;\n                    #{expect_start_object}(tokens.next())?;\n                    \"\"\",\n                    *codegenScope,\n                )\n                deserializeStructInner(includedMembers)\n                expectEndOfTokenStream()\n                rust(\"Ok(builder)\")\n            }\n        }\n    }\n\n    override fun payloadParser(member: MemberShape): RuntimeType {\n        val shape = model.expectShape(member.target)\n        val returnSymbolToParse = returnSymbolToParse(shape)\n        check(shape is UnionShape || shape is StructureShape || shape is DocumentShape) {\n            \"Payload parser should only be used on structure shapes, union shapes, and document shapes.\"\n        }\n        return protocolFunctions.deserializeFn(shape, fnNameSuffix = \"payload\") { fnName ->\n            rustBlockTemplate(\n                \"pub(crate) fn $fnName(_value: &[u8]) -> #{Result}<#{ReturnType}, #{Error}>\",\n                *codegenScope,\n                \"ReturnType\" to returnSymbolToParse.symbol,\n            ) {\n                val input =\n                    if (shape is DocumentShape) {\n                        \"_value\"\n                    } else {\n                        \"#{or_empty}(_value)\"\n                    }\n\n                rustTemplate(\n                    \"\"\"\n                    let mut tokens_owned = #{json_token_iter}($input).peekable();\n                    let tokens = &mut tokens_owned;\n                    \"\"\",\n                    *codegenScope,\n                )\n                rust(\"let result =\")\n                deserializeMember(member)\n                rustTemplate(\".ok_or_else(|| #{Error}::custom(\\\"expected payload member value\\\"));\", *codegenScope)\n                expectEndOfTokenStream()\n                rust(\"result\")\n            }\n        }\n    }\n\n    override fun operationParser(operationShape: OperationShape): RuntimeType? {\n        // Don't generate an operation JSON deserializer if there is no JSON body\n        val httpDocumentMembers = httpBindingResolver.responseMembers(operationShape, HttpLocation.DOCUMENT)\n        if (httpDocumentMembers.isEmpty()) {\n            return null\n        }\n        val outputShape = operationShape.outputShape(model)\n        return structureParser(operationShape, symbolProvider.symbolForBuilder(outputShape), httpDocumentMembers)\n    }\n\n    override fun errorParser(errorShape: StructureShape): RuntimeType? {\n        if (errorShape.members().isEmpty()) {\n            return null\n        }\n        return structureParser(\n            errorShape,\n            symbolProvider.symbolForBuilder(errorShape),\n            errorShape.members().toList(),\n            fnNameSuffix = \"json_err\",\n        )\n    }\n\n    private fun orEmptyJson(): RuntimeType =\n        ProtocolFunctions.crossOperationFn(\"or_empty_doc\") {\n            rust(\n                \"\"\"\n                pub(crate) fn or_empty_doc(data: &[u8]) -> &[u8] {\n                    if data.is_empty() {\n                        b\"{}\"\n                    } else {\n                        data\n                    }\n                }\n                \"\"\",\n            )\n        }\n\n    override fun serverInputParser(operationShape: OperationShape): RuntimeType? {\n        val includedMembers = httpBindingResolver.requestMembers(operationShape, HttpLocation.DOCUMENT)\n        if (includedMembers.isEmpty()) {\n            return null\n        }\n        val inputShape = operationShape.inputShape(model)\n        return structureParser(operationShape, symbolProvider.symbolForBuilder(inputShape), includedMembers)\n    }\n\n    private fun RustWriter.expectEndOfTokenStream() {\n        rustBlock(\"if tokens.next().is_some()\") {\n            rustTemplate(\n                \"return Err(#{Error}::custom(\\\"found more JSON tokens after completing parsing\\\"));\",\n                *codegenScope,\n            )\n        }\n    }\n\n    private fun RustWriter.deserializeStructInner(members: Collection<MemberShape>) {\n        objectKeyLoop(hasMembers = members.isNotEmpty()) {\n            rustBlock(\"match key.to_unescaped()?.as_ref()\") {\n                for (member in members) {\n                    rustBlock(\"${jsonName(member).dq()} =>\") {\n                        when (codegenTarget) {\n                            CodegenTarget.CLIENT -> {\n                                withBlock(\"builder = builder.${member.setterName()}(\", \");\") {\n                                    deserializeMember(member)\n                                }\n                            }\n\n                            CodegenTarget.SERVER -> {\n                                if (symbolProvider.toSymbol(member).isOptional()) {\n                                    withBlock(\"builder = builder.${member.setterName()}(\", \");\") {\n                                        deserializeMember(member)\n                                    }\n                                } else {\n                                    rust(\"if let Some(v) = \")\n                                    deserializeMember(member)\n                                    rust(\n                                        \"\"\"\n                                        {\n                                            builder = builder.${member.setterName()}(v);\n                                        }\n                                        \"\"\",\n                                    )\n                                }\n                            }\n                        }\n                    }\n                }\n                rustTemplate(\"_ => #{skip_value}(tokens)?\", *codegenScope)\n            }\n        }\n    }\n\n    private fun RustWriter.deserializeMember(memberShape: MemberShape) {\n        when (val target = model.expectShape(memberShape.target)) {\n            is StringShape -> deserializeString(target)\n            is BooleanShape -> rustTemplate(\"#{expect_bool_or_null}(tokens.next())?\", *codegenScope)\n            is BigIntegerShape -> deserializeBigInteger()\n            is BigDecimalShape -> deserializeBigDecimal()\n            is NumberShape -> deserializeNumber(target)\n            is BlobShape -> deserializeBlob(memberShape)\n            is TimestampShape -> deserializeTimestamp(memberShape)\n            is CollectionShape -> deserializeCollection(target)\n            is MapShape -> deserializeMap(target)\n            is StructureShape -> deserializeStruct(target)\n            is UnionShape -> deserializeUnion(target)\n            is DocumentShape -> deserializeDocument(memberShape)\n            else -> PANIC(\"unexpected shape: $target\")\n        }\n        val symbol = symbolProvider.toSymbol(memberShape)\n        if (symbol.isRustBoxed()) {\n            for (customization in customizations) {\n                customization.section(JsonParserSection.BeforeBoxingDeserializedMember(memberShape))(this)\n            }\n            rust(\".map(Box::new)\")\n        }\n    }\n\n    private fun RustWriter.deserializeDocument(member: MemberShape) {\n        rustTemplate(\"Some(#{expect_document}(tokens)?)\", *codegenScope)\n        for (customization in customizations) {\n            customization.section(JsonParserSection.AfterDocumentDeserializedMember(member))(this)\n        }\n    }\n\n    private fun RustWriter.deserializeBlob(member: MemberShape) {\n        rustTemplate(\n            \"#{expect_blob_or_null}(tokens.next())?\",\n            *codegenScope,\n        )\n        for (customization in customizations) {\n            customization.section(JsonParserSection.AfterBlobDeserializedMember(member))(this)\n        }\n    }\n\n    private fun RustWriter.deserializeStringInner(\n        target: StringShape,\n        escapedStrName: String,\n    ) {\n        withBlock(\"$escapedStrName.to_unescaped().map(|u|\", \")\") {\n            when (target.hasTrait<EnumTrait>()) {\n                true -> {\n                    if (returnSymbolToParse(target).isUnconstrained) {\n                        rust(\"u.into_owned()\")\n                    } else {\n                        rust(\"#T::from(u.as_ref())\", symbolProvider.toSymbol(target))\n                    }\n                }\n                false -> rust(\"u.into_owned()\")\n            }\n        }\n    }\n\n    private fun RustWriter.deserializeString(target: StringShape) {\n        withBlockTemplate(\"#{expect_string_or_null}(tokens.next())?.map(|s|\", \").transpose()?\", *codegenScope) {\n            deserializeStringInner(target, \"s\")\n        }\n    }\n\n    private fun RustWriter.deserializeNumber(target: NumberShape) {\n        if (target.isFloatShape) {\n            rustTemplate(\"#{expect_number_or_null}(tokens.next())?.map(|v| v.to_f32_lossy())\", *codegenScope)\n        } else if (target.isDoubleShape) {\n            rustTemplate(\"#{expect_number_or_null}(tokens.next())?.map(|v| v.to_f64_lossy())\", *codegenScope)\n        } else {\n            rustTemplate(\n                \"\"\"\n                #{expect_number_or_null}(tokens.next())?\n                    .map(#{NumberType}::try_from)\n                    .transpose()?\n                \"\"\",\n                \"NumberType\" to returnSymbolToParse(target).symbol,\n                *codegenScope,\n            )\n        }\n    }\n\n    private fun RustWriter.deserializeBigInteger() {\n        // Use expect_number_as_string_or_null to preserve arbitrary precision\n        // by extracting the raw JSON number string without converting to u64/i64/f64\n        rustTemplate(\n            \"\"\"\n            #{expect_number_as_string_or_null}(tokens.next(), _value)?\n                .map(<#{BigInteger} as ::std::str::FromStr>::from_str)\n                .transpose()\n                .map_err(|e| #{Error}::custom(format!(\"invalid BigInteger: {e}\")))?\n            \"\"\",\n            \"BigInteger\" to RuntimeType.bigInteger(codegenContext.runtimeConfig),\n            *codegenScope,\n        )\n    }\n\n    private fun RustWriter.deserializeBigDecimal() {\n        // Use expect_number_as_string_or_null to preserve arbitrary precision\n        // by extracting the raw JSON number string without converting to u64/i64/f64\n        rustTemplate(\n            \"\"\"\n            #{expect_number_as_string_or_null}(tokens.next(), _value)?\n                .map(<#{BigDecimal} as ::std::str::FromStr>::from_str)\n                .transpose()\n                .map_err(|e| #{Error}::custom(format!(\"invalid BigDecimal: {e}\")))?\n            \"\"\",\n            \"BigDecimal\" to RuntimeType.bigDecimal(codegenContext.runtimeConfig),\n            *codegenScope,\n        )\n    }\n\n    private fun RustWriter.deserializeTimestamp(member: MemberShape) {\n        val timestampFormat =\n            httpBindingResolver.timestampFormat(\n                member, HttpLocation.DOCUMENT,\n                TimestampFormatTrait.Format.EPOCH_SECONDS, model,\n            )\n        val timestampFormatType = RuntimeType.parseTimestampFormat(codegenTarget, runtimeConfig, timestampFormat)\n        rustTemplate(\n            \"#{expect_timestamp_or_null}(tokens.next(), #{T})?\",\n            \"T\" to timestampFormatType, *codegenScope,\n        )\n        for (customization in customizations) {\n            customization.section(JsonParserSection.AfterTimestampDeserializedMember(member))(this)\n        }\n    }\n\n    private fun RustWriter.deserializeCollection(shape: CollectionShape) {\n        val isSparse = shape.hasTrait<SparseTrait>()\n        val (returnSymbol, returnUnconstrainedType) = returnSymbolToParse(shape)\n        val parser =\n            protocolFunctions.deserializeFn(shape) { fnName ->\n                rustBlockTemplate(\n                    \"\"\"\n                    pub(crate) fn $fnName<'a, I>(tokens: &mut #{Peekable}<I>, _value: &'a [u8]) -> #{Result}<Option<#{ReturnType}>, #{Error}>\n                        where I: Iterator<Item = Result<#{Token}<'a>, #{Error}>>\n                    \"\"\",\n                    \"ReturnType\" to returnSymbol,\n                    *codegenScope,\n                ) {\n                    startArrayOrNull {\n                        rust(\"let mut items = Vec::new();\")\n                        rustBlock(\"loop\") {\n                            rustBlock(\"match tokens.peek()\") {\n                                rustBlockTemplate(\"Some(Ok(#{Token}::EndArray { .. })) =>\", *codegenScope) {\n                                    rust(\"tokens.next().transpose().unwrap(); break;\")\n                                }\n                                rustBlock(\"_ => \") {\n                                    if (isSparse) {\n                                        withBlock(\"items.push(\", \");\") {\n                                            deserializeMember(shape.member)\n                                        }\n                                    } else {\n                                        withBlock(\"let value =\", \";\") {\n                                            deserializeMember(shape.member)\n                                        }\n                                        rustTemplate(\n                                            \"\"\"\n                                            if let Some(value) = value {\n                                                items.push(value);\n                                            } else {\n                                                return Err(#{Error}::custom(\"dense list cannot contain null values\"));\n                                            }\n                                            \"\"\",\n                                            *codegenScope,\n                                        )\n                                    }\n                                }\n                            }\n                        }\n                        if (returnUnconstrainedType) {\n                            rust(\"Ok(Some(#{T}(items)))\", returnSymbol)\n                        } else {\n                            rust(\"Ok(Some(items))\")\n                        }\n                    }\n                }\n            }\n        rust(\"#T(tokens, _value)?\", parser)\n    }\n\n    private fun RustWriter.deserializeMap(shape: MapShape) {\n        val keyTarget = model.expectShape(shape.key.target, StringShape::class.java)\n        val isSparse = shape.hasTrait<SparseTrait>()\n        val returnSymbolToParse = returnSymbolToParse(shape)\n        val parser =\n            protocolFunctions.deserializeFn(shape) { fnName ->\n                rustBlockTemplate(\n                    \"\"\"\n                    pub(crate) fn $fnName<'a, I>(tokens: &mut #{Peekable}<I>, _value: &'a [u8]) -> #{Result}<Option<#{ReturnType}>, #{Error}>\n                        where I: Iterator<Item = Result<#{Token}<'a>, #{Error}>>\n                    \"\"\",\n                    \"ReturnType\" to returnSymbolToParse.symbol,\n                    *codegenScope,\n                ) {\n                    startObjectOrNull {\n                        rust(\"let mut map = #T::new();\", RuntimeType.HashMap)\n                        objectKeyLoop(hasMembers = true) {\n                            withBlock(\"let key =\", \"?;\") {\n                                deserializeStringInner(keyTarget, \"key\")\n                            }\n                            withBlock(\"let value =\", \";\") {\n                                deserializeMember(shape.value)\n                            }\n                            if (isSparse) {\n                                rust(\"map.insert(key, value);\")\n                            } else {\n                                rustTemplate(\n                                    \"\"\"\n                                    match value {\n                                        Some(value) => { map.insert(key, value); }\n                                        None => return Err(#{Error}::custom(\"dense map cannot contain null values\"))\n                                    }\"\"\",\n                                    *codegenScope,\n                                )\n                            }\n                        }\n                        if (returnSymbolToParse.isUnconstrained) {\n                            rust(\"Ok(Some(#{T}(map)))\", returnSymbolToParse.symbol)\n                        } else {\n                            rust(\"Ok(Some(map))\")\n                        }\n                    }\n                }\n            }\n        rust(\"#T(tokens, _value)?\", parser)\n    }\n\n    private fun RustWriter.deserializeStruct(shape: StructureShape) {\n        val returnSymbolToParse = returnSymbolToParse(shape)\n        val nestedParser =\n            protocolFunctions.deserializeFn(shape) { fnName ->\n                rustBlockTemplate(\n                    \"\"\"\n                    pub(crate) fn $fnName<'a, I>(tokens: &mut #{Peekable}<I>, _value: &'a [u8]) -> #{Result}<Option<#{ReturnType}>, #{Error}>\n                        where I: Iterator<Item = Result<#{Token}<'a>, #{Error}>>\n                    \"\"\",\n                    \"ReturnType\" to returnSymbolToParse.symbol,\n                    *codegenScope,\n                ) {\n                    startObjectOrNull {\n                        Attribute.AllowUnusedMut.render(this)\n                        rustTemplate(\n                            \"let mut builder = #{Builder}::default();\",\n                            *codegenScope,\n                            \"Builder\" to symbolProvider.symbolForBuilder(shape),\n                        )\n                        deserializeStructInner(shape.members())\n                        val builder =\n                            builderInstantiator.finalizeBuilder(\n                                \"builder\", shape,\n                            ) {\n                                rustTemplate(\n                                    \"\"\"|err|#{Error}::custom_source(\"Response was invalid\", err)\"\"\", *codegenScope,\n                                )\n                            }\n                        rust(\"Ok(Some(#T))\", builder)\n                    }\n                }\n            }\n        rust(\"#T(tokens, _value)?\", nestedParser)\n    }\n\n    private fun RustWriter.deserializeUnion(shape: UnionShape) {\n        val returnSymbolToParse = returnSymbolToParse(shape)\n        val nestedParser =\n            protocolFunctions.deserializeFn(shape) { fnName ->\n                rustBlockTemplate(\n                    \"\"\"\n                    pub(crate) fn $fnName<'a, I>(tokens: &mut #{Peekable}<I>, _value: &'a [u8]) -> #{Result}<Option<#{Shape}>, #{Error}>\n                        where I: Iterator<Item = Result<#{Token}<'a>, #{Error}>>\n                    \"\"\",\n                    *codegenScope,\n                    \"Shape\" to returnSymbolToParse.symbol,\n                ) {\n                    // Apply any custom union deserialization logic before processing tokens.\n                    // This allows for customization of how union variants are handled,\n                    // particularly their discrimination mechanism.\n                    for (customization in customizations) {\n                        customization.section(JsonParserSection.BeforeUnionDeserialize(shape))(this)\n                    }\n                    rust(\"let mut variant = None;\")\n                    val checkValueSet = !shape.members().all { it.isTargetUnit() } && !codegenTarget.renderUnknownVariant()\n                    rustBlock(\"match tokens.next().transpose()?\") {\n                        rustBlockTemplate(\n                            \"\"\"\n                            Some(#{Token}::ValueNull { .. }) => return Ok(None),\n                            Some(#{Token}::StartObject { .. }) =>\n                            \"\"\",\n                            *codegenScope,\n                        ) {\n                            objectKeyLoop(hasMembers = shape.members().isNotEmpty()) {\n                                rustTemplate(\n                                    \"\"\"\n                                    if let #{Some}(#{Ok}(#{Token}::ValueNull { .. })) = tokens.peek() {\n                                        let _ = tokens.next().expect(\"peek returned a token\")?;\n                                        continue;\n                                    }\n                                    \"\"\",\n                                    *codegenScope,\n                                )\n                                rustTemplate(\n                                    \"\"\"\n                                    let key = key.to_unescaped()?;\n                                    if key == \"__type\" {\n                                        #{skip_value}(tokens)?;\n                                        continue\n                                    }\n                                    if variant.is_some() {\n                                        return Err(#{Error}::custom(\"encountered mixed variants in union\"));\n                                    }\n                                    \"\"\",\n                                    *codegenScope,\n                                )\n                                withBlock(\"variant = match key.as_ref() {\", \"};\") {\n                                    for (member in shape.members()) {\n                                        val variantName = symbolProvider.toMemberName(member)\n                                        rustBlock(\"${jsonName(member).dq()} =>\") {\n                                            if (member.isTargetUnit()) {\n                                                rustTemplate(\n                                                    \"\"\"\n                                                    #{skip_value}(tokens)?;\n                                                    Some(#{Union}::$variantName)\n                                                    \"\"\",\n                                                    \"Union\" to returnSymbolToParse.symbol, *codegenScope,\n                                                )\n                                            } else {\n                                                withBlock(\"Some(#T::$variantName(\", \"))\", returnSymbolToParse.symbol) {\n                                                    deserializeMember(member)\n                                                    unwrapOrDefaultOrError(member, checkValueSet)\n                                                }\n                                            }\n                                        }\n                                    }\n                                    when (codegenTarget.renderUnknownVariant()) {\n                                        // In client mode, resolve an unknown union variant to the unknown variant.\n                                        true ->\n                                            rustTemplate(\n                                                \"\"\"\n                                                _ => {\n                                                  #{skip_value}(tokens)?;\n                                                  Some(#{Union}::${UnionGenerator.UNKNOWN_VARIANT_NAME})\n                                                }\n                                                \"\"\",\n                                                \"Union\" to returnSymbolToParse.symbol,\n                                                *codegenScope,\n                                            )\n                                        // In server mode, use strict parsing.\n                                        // Consultation: https://github.com/awslabs/smithy/issues/1222\n                                        false ->\n                                            rustTemplate(\n                                                \"\"\"variant => return Err(#{Error}::custom(format!(\"unexpected union variant: {variant}\")))\"\"\",\n                                                *codegenScope,\n                                            )\n                                    }\n                                }\n                            }\n                        }\n                        rustTemplate(\n                            \"\"\"_ => return Err(#{Error}::custom(\"expected start object or null\"))\"\"\",\n                            *codegenScope,\n                        )\n                    }\n                    // If we've gotten to the point where the union had a `{ ... }` section, we can't return None\n                    // anymore. If we didn't parse a union at this point, this is an error.\n                    rustTemplate(\n                        \"\"\"\n                        if variant.is_none() {\n                            return Err(#{Error}::custom(\"Union did not contain a valid variant.\"))\n                        }\n                        \"\"\",\n                        *codegenScope,\n                    )\n                    rust(\"Ok(variant)\")\n                }\n            }\n        rust(\"#T(tokens, _value)?\", nestedParser)\n    }\n\n    private fun RustWriter.unwrapOrDefaultOrError(\n        member: MemberShape,\n        checkValueSet: Boolean,\n    ) {\n        if (symbolProvider.toSymbol(member).canUseDefault() && !checkValueSet) {\n            rust(\".unwrap_or_default()\")\n        } else {\n            rustTemplate(\n                \".ok_or_else(|| #{Error}::custom(\\\"value for '${escape(member.memberName)}' cannot be null\\\"))?\",\n                *codegenScope,\n            )\n        }\n    }\n\n    private fun RustWriter.objectKeyLoop(\n        hasMembers: Boolean,\n        inner: Writable,\n    ) {\n        if (!hasMembers) {\n            rustTemplate(\"#{skip_to_end}(tokens)?;\", *codegenScope)\n        } else {\n            rustBlock(\"loop\") {\n                rustBlock(\"match tokens.next().transpose()?\") {\n                    rustBlockTemplate(\n                        \"\"\"\n                        Some(#{Token}::EndObject { .. }) => break,\n                        Some(#{Token}::ObjectKey { key, .. }) =>\n                        \"\"\",\n                        *codegenScope,\n                    ) {\n                        inner()\n                    }\n                    rustTemplate(\n                        \"\"\"other => return Err(#{Error}::custom(format!(\"expected object key or end object, found: {other:?}\")))\"\"\",\n                        *codegenScope,\n                    )\n                }\n            }\n        }\n    }\n\n    private fun RustWriter.startArrayOrNull(inner: Writable) = startOrNull(\"array\", inner)\n\n    private fun RustWriter.startObjectOrNull(inner: Writable) = startOrNull(\"object\", inner)\n\n    private fun RustWriter.startOrNull(\n        objectOrArray: String,\n        inner: Writable,\n    ) {\n        rustBlockTemplate(\"match tokens.next().transpose()?\", *codegenScope) {\n            rustBlockTemplate(\n                \"\"\"\n                Some(#{Token}::ValueNull { .. }) => Ok(None),\n                Some(#{Token}::Start${StringUtils.capitalize(objectOrArray)} { .. }) =>\n                \"\"\",\n                *codegenScope,\n            ) {\n                inner()\n            }\n            rustBlockTemplate(\"_ =>\") {\n                rustTemplate(\n                    \"Err(#{Error}::custom(\\\"expected start $objectOrArray or null\\\"))\",\n                    *codegenScope,\n                )\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/parse/RestXmlParserGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy.protocols.parse\n\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenContext\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.traits.AllowInvalidXmlRoot\nimport software.amazon.smithy.rust.codegen.core.smithy.traits.SyntheticOutputTrait\nimport software.amazon.smithy.rust.codegen.core.util.getTrait\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\nimport software.amazon.smithy.rust.codegen.core.util.orNull\n\nclass RestXmlParserGenerator(\n    codegenContext: CodegenContext,\n    xmlErrors: RuntimeType,\n    private val xmlBindingTraitParserGenerator: XmlBindingTraitParserGenerator =\n        XmlBindingTraitParserGenerator(\n            codegenContext,\n            xmlErrors,\n        ) { context, inner ->\n            val shapeName = context.outputShapeName\n            // Get the non-synthetic version of the outputShape and check to see if it has the `AllowInvalidXmlRoot` trait\n            val allowInvalidRoot =\n                context.model.getShape(context.shape.outputShape).orNull().let { shape ->\n                    shape?.getTrait<SyntheticOutputTrait>()?.originalId.let { shapeId ->\n                        context.model.getShape(shapeId).orNull()?.hasTrait<AllowInvalidXmlRoot>() ?: false\n                    }\n                }\n\n            // If we DON'T allow the XML root to be invalid, insert code to check for and report a mismatch\n            if (!allowInvalidRoot) {\n                rustTemplate(\n                    \"\"\"\n                    if !${XmlBindingTraitParserGenerator.XmlName(shapeName).matchExpression(\"start_el\")} {\n                        return Err(\n                            #{XmlDecodeError}::custom(\n                                format!(\"encountered invalid XML root: expected $shapeName but got {start_el:?}. This is likely a bug in the SDK.\")\n                            )\n                        )\n                    }\n                    \"\"\",\n                    \"XmlDecodeError\" to context.xmlDecodeErrorType,\n                )\n            }\n\n            inner(\"decoder\")\n        },\n) : StructuredDataParserGenerator by xmlBindingTraitParserGenerator\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/parse/ReturnSymbolToParse.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy.protocols.parse\n\nimport software.amazon.smithy.codegen.core.Symbol\n\n/**\n * Parsers need to know what symbol to parse and return, and whether it's unconstrained or not.\n * This data class holds this information that the parsers fill out from a shape.\n */\ndata class ReturnSymbolToParse(val symbol: Symbol, val isUnconstrained: Boolean)\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/parse/StructuredDataParserGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy.protocols.parse\n\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\n\ninterface StructuredDataParserGenerator {\n    /**\n     * Generate a parse function for a given shape targeted with `@httpPayload`.\n     * Entry point for payload-based parsing.\n     *\n     * Roughly:\n     * ```rust\n     * fn parse_my_struct(input: &[u8]) -> Result<MyStruct, XmlDecodeError> {\n     *      ...\n     * }\n     * ```\n     */\n    fun payloadParser(member: MemberShape): RuntimeType\n\n    /**\n     * Generate a parser for operation input\n     * Because only a subset of fields of the operation may be impacted by the document, a builder is passed\n     * through:\n     *\n     * ```rust\n     * fn parse_some_operation(inp: &[u8], builder: my_operation::Builder) -> Result<my_operation::Builder, XmlDecodeError> {\n     *   ...\n     * }\n     * ```\n     */\n    fun operationParser(operationShape: OperationShape): RuntimeType?\n\n    /**\n     * Because only a subset of fields of the operation may be impacted by the document, a builder is passed\n     * through:\n     *\n     * ```rust\n     * fn parse_some_error(inp: &[u8], builder: my_operation::Builder) -> Result<my_operation::Builder, XmlDecodeError> {\n     *   ...\n     * }\n     */\n    fun errorParser(errorShape: StructureShape): RuntimeType?\n\n    /**\n     * Generate a parser for a server operation input structure\n     *\n     * ```rust\n     * fn deser_operation_crate_operation_my_operation_input(\n     *    value: &[u8], builder: my_operation_input::Builder\n     * ) -> Result<my_operation_input::Builder, Error> {\n     *    ..\n     * }\n     * ```\n     */\n    fun serverInputParser(operationShape: OperationShape): RuntimeType?\n}\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/parse/XmlBindingTraitParserGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy.protocols.parse\n\nimport software.amazon.smithy.aws.traits.customizations.S3UnwrappedXmlOutputTrait\nimport software.amazon.smithy.codegen.core.CodegenException\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.knowledge.HttpBinding\nimport software.amazon.smithy.model.knowledge.HttpBindingIndex\nimport software.amazon.smithy.model.shapes.BigDecimalShape\nimport software.amazon.smithy.model.shapes.BigIntegerShape\nimport software.amazon.smithy.model.shapes.BlobShape\nimport software.amazon.smithy.model.shapes.BooleanShape\nimport software.amazon.smithy.model.shapes.CollectionShape\nimport software.amazon.smithy.model.shapes.MapShape\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.NumberShape\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.StringShape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.shapes.TimestampShape\nimport software.amazon.smithy.model.shapes.UnionShape\nimport software.amazon.smithy.model.traits.EnumTrait\nimport software.amazon.smithy.model.traits.TimestampFormatTrait\nimport software.amazon.smithy.model.traits.XmlFlattenedTrait\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.conditionalBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.escape\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlockTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.withBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.withBlockTemplate\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenContext\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenTarget\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.UnionGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.renderUnknownVariant\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.setterName\nimport software.amazon.smithy.rust.codegen.core.smithy.isOptional\nimport software.amazon.smithy.rust.codegen.core.smithy.isRustBoxed\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.ProtocolFunctions\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.XmlMemberIndex\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.XmlNameIndex\nimport software.amazon.smithy.rust.codegen.core.util.PANIC\nimport software.amazon.smithy.rust.codegen.core.util.dq\nimport software.amazon.smithy.rust.codegen.core.util.expectMember\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\nimport software.amazon.smithy.rust.codegen.core.util.inputShape\nimport software.amazon.smithy.rust.codegen.core.util.isTargetUnit\nimport software.amazon.smithy.rust.codegen.core.util.outputShape\n\n// The string argument is the name of the XML ScopedDecoder to continue parsing from\ntypealias OperationInnerWriteable = RustWriter.(String) -> Unit\n\ndata class OperationWrapperContext(\n    val shape: OperationShape,\n    val outputShapeName: String,\n    val xmlDecodeErrorType: RuntimeType,\n    val model: Model,\n)\n\nclass XmlBindingTraitParserGenerator(\n    codegenContext: CodegenContext,\n    private val xmlErrors: RuntimeType,\n    private val writeOperationWrapper: RustWriter.(OperationWrapperContext, OperationInnerWriteable) -> Unit,\n) : StructuredDataParserGenerator {\n    /** Abstraction to represent an XML element name */\n    data class XmlName(val name: String) {\n        /** Generates an expression to match a given element against this XML tag name */\n        fun matchExpression(start_el: String) = \"$start_el.matches(${this.toString().dq()})\"\n\n        override fun toString(): String {\n            return name\n        }\n    }\n\n    /**\n     * Codegeneration Context\n     *\n     * [tag]: The symbol name of the current tag\n     * [accum]: Flattened lists and maps need to be written into an accumulator. When a flattened list / map\n     * is possible, `[accum]` contains an expression to mutably access the accumulator. Specifically, this is an\n     * option to the collection st. the caller can evaluate `accum.unwrap_or_default()` to get a collection to write\n     * data into.\n     */\n    data class Ctx(val tag: String, val accum: String?)\n\n    private val symbolProvider = codegenContext.symbolProvider\n    private val smithyXml = CargoDependency.smithyXml(codegenContext.runtimeConfig).toType()\n    private val xmlDecodeError = smithyXml.resolve(\"decode::XmlDecodeError\")\n\n    private val scopedDecoder = smithyXml.resolve(\"decode::ScopedDecoder\")\n    private val runtimeConfig = codegenContext.runtimeConfig\n    private val protocolFunctions = ProtocolFunctions(codegenContext)\n    private val codegenTarget = codegenContext.target\n    private val builderInstantiator = codegenContext.builderInstantiator()\n\n    // The symbols we want all the time\n    private val codegenScope =\n        arrayOf(\n            \"Blob\" to RuntimeType.blob(runtimeConfig),\n            \"Document\" to smithyXml.resolve(\"decode::Document\"),\n            \"XmlDecodeError\" to xmlDecodeError,\n            \"next_start_element\" to smithyXml.resolve(\"decode::next_start_element\"),\n            \"try_data\" to smithyXml.resolve(\"decode::try_data\"),\n            \"ScopedDecoder\" to scopedDecoder,\n            \"aws_smithy_types\" to CargoDependency.smithyTypes(runtimeConfig).toType(),\n            *RuntimeType.preludeScope,\n        )\n    private val model = codegenContext.model\n    private val index = HttpBindingIndex.of(model)\n    private val xmlIndex = XmlNameIndex.of(model)\n    private val target = codegenContext.target\n\n    /**\n     * Generate a parse function for a given targeted as a payload.\n     * Entry point for payload-based parsing.\n     * Roughly:\n     * ```rust\n     * fn parse_my_struct(input: &[u8]) -> Result<MyStruct, XmlDecodeError> {\n     *      ...\n     * }\n     * ```\n     */\n    override fun payloadParser(member: MemberShape): RuntimeType {\n        val shape = model.expectShape(member.target)\n        check(shape is UnionShape || shape is StructureShape) {\n            \"payload parser should only be used on structures & unions\"\n        }\n        return protocolFunctions.deserializeFn(member) { fnName ->\n            rustBlock(\n                \"pub fn $fnName(inp: &[u8]) -> std::result::Result<#1T, #2T>\",\n                symbolProvider.toSymbol(shape),\n                xmlDecodeError,\n            ) {\n                // for payloads, first look at the member trait\n                // next, look to see if this structure was renamed\n\n                val shapeName = XmlName(xmlIndex.payloadShapeName(member))\n                rustTemplate(\n                    \"\"\"\n                    let mut doc = #{Document}::try_from(inp)?;\n                    ##[allow(unused_mut)]\n                    let mut decoder = doc.root_element()?;\n                    let start_el = decoder.start_el();\n                    if !(${shapeName.matchExpression(\"start_el\")}) {\n                        return Err(#{XmlDecodeError}::custom(format!(\"invalid root, expected $shapeName got {start_el:?}\")))\n                    }\n                    \"\"\",\n                    *codegenScope,\n                )\n                val ctx = Ctx(\"decoder\", accum = null)\n                when (shape) {\n                    is StructureShape -> {\n                        parseStructure(shape, ctx)\n                    }\n\n                    is UnionShape -> parseUnion(shape, ctx)\n                }\n            }\n        }\n    }\n\n    /** Generate a parser for operation input\n     * Because only a subset of fields of the operation may be impacted by the document, a builder is passed\n     * through:\n     *\n     * ```rust\n     * fn parse_some_operation(inp: &[u8], builder: my_operation::Builder) -> Result<my_operation::Builder, XmlDecodeError> {\n     *   ...\n     * }\n     * ```\n     */\n    override fun operationParser(operationShape: OperationShape): RuntimeType? {\n        val outputShape = operationShape.outputShape(model)\n        val shapeName = xmlIndex.operationOutputShapeName(operationShape)\n        val members = operationShape.operationXmlMembers()\n        if (shapeName == null || !members.isNotEmpty()) {\n            return null\n        }\n        return protocolFunctions.deserializeFn(operationShape) { fnName ->\n            Attribute.AllowUnusedMut.render(this)\n            rustBlock(\n                \"pub fn $fnName(inp: &[u8], mut builder: #1T) -> std::result::Result<#1T, #2T>\",\n                symbolProvider.symbolForBuilder(outputShape),\n                xmlDecodeError,\n            ) {\n                rustTemplate(\n                    \"\"\"\n                    let mut doc = #{Document}::try_from(inp)?;\n\n                    ##[allow(unused_mut)]\n                    let mut decoder = doc.root_element()?;\n                    ##[allow(unused_variables)]\n                    let start_el = decoder.start_el();\n                    \"\"\",\n                    *codegenScope,\n                )\n                val context = OperationWrapperContext(operationShape, shapeName, xmlDecodeError, model)\n                if (operationShape.hasTrait<S3UnwrappedXmlOutputTrait>()) {\n                    unwrappedResponseParser(\"builder\", \"decoder\", \"start_el\", outputShape.members())\n                } else {\n                    writeOperationWrapper(context) { tagName ->\n                        parseStructureInner(members, builder = \"builder\", Ctx(tag = tagName, accum = null))\n                    }\n                }\n                rust(\"Ok(builder)\")\n            }\n        }\n    }\n\n    override fun errorParser(errorShape: StructureShape): RuntimeType {\n        return protocolFunctions.deserializeFn(errorShape, fnNameSuffix = \"xml_err\") { fnName ->\n            Attribute.AllowUnusedMut.render(this)\n            rustBlock(\n                \"pub fn $fnName(inp: &[u8], mut builder: #1T) -> std::result::Result<#1T, #2T>\",\n                symbolProvider.symbolForBuilder(errorShape),\n                xmlDecodeError,\n            ) {\n                val members = errorShape.errorXmlMembers()\n                rust(\"if inp.is_empty() { return Ok(builder) }\")\n                if (members.isNotEmpty()) {\n                    rustTemplate(\n                        \"\"\"\n                        let mut document = #{Document}::try_from(inp)?;\n                        ##[allow(unused_mut)]\n                        let mut error_decoder = #{xml_errors}::error_scope(&mut document)?;\n                        \"\"\",\n                        *codegenScope,\n                        \"xml_errors\" to xmlErrors,\n                    )\n                    parseStructureInner(members, builder = \"builder\", Ctx(tag = \"error_decoder\", accum = null))\n                }\n                rust(\"Ok(builder)\")\n            }\n        }\n    }\n\n    override fun serverInputParser(operationShape: OperationShape): RuntimeType? {\n        val inputShape = operationShape.inputShape(model)\n        val shapeName = xmlIndex.operationInputShapeName(operationShape)\n        val members = operationShape.serverInputXmlMembers()\n        if (shapeName == null || !members.isNotEmpty()) {\n            return null\n        }\n        return protocolFunctions.deserializeFn(operationShape) { fnName ->\n            Attribute.AllowUnusedMut.render(this)\n            rustBlock(\n                \"pub fn $fnName(inp: &[u8], mut builder: #1T) -> std::result::Result<#1T, #2T>\",\n                symbolProvider.symbolForBuilder(inputShape),\n                xmlDecodeError,\n            ) {\n                rustTemplate(\n                    \"\"\"\n                    let mut doc = #{Document}::try_from(inp)?;\n\n                    ##[allow(unused_mut)]\n                    let mut decoder = doc.root_element()?;\n                    let start_el = decoder.start_el();\n                    \"\"\",\n                    *codegenScope,\n                )\n                val context = OperationWrapperContext(operationShape, shapeName, xmlDecodeError, model)\n                writeOperationWrapper(context) { tagName ->\n                    parseStructureInner(members, builder = \"builder\", Ctx(tag = tagName, accum = null))\n                }\n                rust(\"Ok(builder)\")\n            }\n        }\n    }\n\n    private fun RustWriter.unwrappedResponseParser(\n        builder: String,\n        decoder: String,\n        element: String,\n        members: Collection<MemberShape>,\n    ) {\n        check(members.size == 1) {\n            \"The S3UnwrappedXmlOutputTrait is only allowed on structs with exactly one member\"\n        }\n        val member = members.first()\n        rustBlock(\"match $element\") {\n            case(member) {\n                val temp = safeName()\n                withBlock(\"let $temp =\", \";\") {\n                    parseMember(\n                        member,\n                        Ctx(tag = decoder, accum = \"$builder.${symbolProvider.toMemberName(member)}.take()\"),\n                    )\n                }\n                rust(\"$builder = $builder.${member.setterName()}($temp);\")\n            }\n            rustTemplate(\n                \"_ => return Err(#{XmlDecodeError}::custom(\\\"expected ${member.xmlName()} tag\\\"))\",\n                *codegenScope,\n            )\n        }\n    }\n\n    /**\n     * Update a structure builder based on the [members], specifying where to find each member (document vs. attributes)\n     */\n    private fun RustWriter.parseStructureInner(\n        members: XmlMemberIndex,\n        builder: String,\n        outerCtx: Ctx,\n    ) {\n        members.attributeMembers.forEach { member ->\n            val temp = safeName(\"attrib\")\n            withBlock(\"let $temp =\", \";\") {\n                parseAttributeMember(member, outerCtx)\n            }\n            rust(\"$builder.${symbolProvider.toMemberName(member)} = $temp;\")\n        }\n        // No need to generate a parse loop if there are no non-attribute members\n        if (members.dataMembers.isEmpty()) {\n            return\n        }\n        parseLoop(outerCtx) { ctx ->\n            members.dataMembers.forEach { member ->\n                case(member) {\n                    val temp = safeName()\n                    withBlock(\"let $temp =\", \";\") {\n                        parseMember(\n                            member,\n                            ctx.copy(accum = \"$builder.${symbolProvider.toMemberName(member)}.take()\"),\n                            forceOptional = true,\n                        )\n                    }\n                    rust(\"$builder = $builder.${member.setterName()}($temp);\")\n                }\n            }\n        }\n    }\n\n    /**\n     * The core XML parsing abstraction: A loop that reads through the top level tags at the current scope &\n     * generates a match expression\n     * When [ignoreUnexpected] is true, unexpected tags are ignored\n     */\n    private fun RustWriter.parseLoop(\n        ctx: Ctx,\n        ignoreUnexpected: Boolean = true,\n        inner: RustWriter.(Ctx) -> Unit,\n    ) {\n        rustBlock(\"while let Some(mut tag) = ${ctx.tag}.next_tag()\") {\n            rustBlock(\"match tag.start_el()\") {\n                inner(ctx.copy(tag = \"tag\"))\n                if (ignoreUnexpected) {\n                    rust(\"_ => {}\")\n                }\n            }\n        }\n    }\n\n    /**\n     * Generate an XML parser for a given member\n     */\n    private fun RustWriter.parseMember(\n        memberShape: MemberShape,\n        ctx: Ctx,\n        forceOptional: Boolean = false,\n    ) {\n        val target = model.expectShape(memberShape.target)\n        val symbol = symbolProvider.toSymbol(memberShape)\n        conditionalBlock(\"Some(\", \")\", forceOptional || symbol.isOptional()) {\n            conditionalBlock(\"Box::new(\", \")\", symbol.isRustBoxed()) {\n                when (target) {\n                    is BigIntegerShape, is BigDecimalShape -> {\n                        parsePrimitiveInner(memberShape) {\n                            rustTemplate(\"#{try_data}(&mut ${ctx.tag})?.as_ref()\", *codegenScope)\n                        }\n                    }\n\n                    is StringShape, is BooleanShape, is NumberShape, is TimestampShape, is BlobShape ->\n                        parsePrimitiveInner(memberShape) {\n                            rustTemplate(\"#{try_data}(&mut ${ctx.tag})?.as_ref()\", *codegenScope)\n                        }\n\n                    is MapShape ->\n                        if (memberShape.isFlattened()) {\n                            parseFlatMap(target, ctx)\n                        } else {\n                            parseMap(target, ctx)\n                        }\n\n                    is CollectionShape ->\n                        if (memberShape.isFlattened()) {\n                            parseFlatList(target, ctx)\n                        } else {\n                            parseList(target, ctx)\n                        }\n\n                    is StructureShape -> {\n                        parseStructure(target, ctx)\n                    }\n\n                    is UnionShape -> parseUnion(target, ctx)\n\n                    else -> PANIC(\"Unhandled: $target\")\n                }\n                // each internal `parseT` function writes an `Result<T, E>` expression, unwrap those:\n                rust(\"?\")\n            }\n        }\n    }\n\n    private fun RustWriter.parseAttributeMember(\n        memberShape: MemberShape,\n        ctx: Ctx,\n    ) {\n        rustBlock(\"\") {\n            rustTemplate(\n                \"\"\"\n                let s = ${ctx.tag}\n                    .start_el()\n                    .attr(${memberShape.xmlName().toString().dq()});\n                \"\"\",\n                *codegenScope,\n            )\n            rustBlock(\"match s\") {\n                rust(\"None => None,\")\n                withBlock(\"Some(s) => Some(\", \")\") {\n                    parsePrimitiveInner(memberShape) {\n                        rust(\"s\")\n                    }\n                    rust(\"?\")\n                }\n            }\n        }\n    }\n\n    private fun RustWriter.parseUnion(\n        shape: UnionShape,\n        ctx: Ctx,\n    ) {\n        val symbol = symbolProvider.toSymbol(shape)\n        val nestedParser =\n            protocolFunctions.deserializeFn(shape) { fnName ->\n                rustBlockTemplate(\n                    \"pub fn $fnName(decoder: &mut #{ScopedDecoder}) -> #{Result}<#{Shape}, #{XmlDecodeError}>\",\n                    *codegenScope, \"Shape\" to symbol,\n                ) {\n                    val members = shape.members()\n                    rustTemplate(\"let mut base: Option<#{Shape}> = None;\", *codegenScope, \"Shape\" to symbol)\n                    parseLoop(Ctx(tag = \"decoder\", accum = null), ignoreUnexpected = false) { ctx ->\n                        members.forEach { member ->\n                            val variantName = symbolProvider.toMemberName(member)\n                            case(member) {\n                                if (member.isTargetUnit()) {\n                                    rust(\"base = Some(#T::$variantName);\", symbol)\n                                } else {\n                                    val current =\n                                        \"\"\"\n                                        (match base.take() {\n                                            None => None,\n                                            Some(${format(symbol)}::$variantName(inner)) => Some(inner),\n                                            Some(_) => return Err(#{XmlDecodeError}::custom(\"mixed variants\"))\n                                        })\n                                        \"\"\"\n                                    withBlock(\"let tmp =\", \";\") {\n                                        parseMember(member, ctx.copy(accum = current.trim()))\n                                    }\n                                    rust(\"base = Some(#T::$variantName(tmp));\", symbol)\n                                }\n                            }\n                        }\n                        when (target.renderUnknownVariant()) {\n                            true -> rust(\"_unknown => base = Some(#T::${UnionGenerator.UNKNOWN_VARIANT_NAME}),\", symbol)\n                            false ->\n                                rustTemplate(\n                                    \"\"\"variant => return Err(#{XmlDecodeError}::custom(format!(\"unexpected union variant: {variant:?}\")))\"\"\",\n                                    *codegenScope,\n                                )\n                        }\n                    }\n                    rustTemplate(\n                        \"\"\"base.ok_or_else(||#{XmlDecodeError}::custom(\"expected union, got nothing\"))\"\"\",\n                        *codegenScope,\n                    )\n                }\n            }\n        rust(\"#T(&mut ${ctx.tag})\", nestedParser)\n    }\n\n    /**\n     * The match clause to check if the tag matches a given member\n     */\n    private fun RustWriter.case(\n        member: MemberShape,\n        inner: Writable,\n    ) {\n        rustBlock(\n            \"s if ${\n                member.xmlName().matchExpression(\"s\")\n            } /* ${member.memberName} ${escape(member.id.toString())} */ => \",\n        ) {\n            inner()\n        }\n        rust(\",\")\n    }\n\n    private fun RustWriter.parseStructure(\n        shape: StructureShape,\n        ctx: Ctx,\n    ) {\n        val symbol = symbolProvider.toSymbol(shape)\n        val nestedParser =\n            protocolFunctions.deserializeFn(shape) { fnName ->\n                Attribute.AllowNeedlessQuestionMark.render(this)\n                rustBlockTemplate(\n                    \"pub fn $fnName(decoder: &mut #{ScopedDecoder}) -> #{Result}<#{Shape}, #{XmlDecodeError}>\",\n                    *codegenScope, \"Shape\" to symbol,\n                ) {\n                    Attribute.AllowUnusedMut.render(this)\n                    rustTemplate(\"let mut builder = #{Shape}::builder();\", *codegenScope, \"Shape\" to symbol)\n                    val members = shape.xmlMembers()\n                    if (members.isNotEmpty()) {\n                        parseStructureInner(members, \"builder\", Ctx(tag = \"decoder\", accum = null))\n                    } else {\n                        rust(\"let _ = decoder;\")\n                    }\n                    val builder =\n                        builderInstantiator.finalizeBuilder(\n                            \"builder\",\n                            shape,\n                            mapErr = {\n                                rustTemplate(\n                                    \"\"\"|_|#{XmlDecodeError}::custom(\"missing field\")\"\"\",\n                                    *codegenScope,\n                                )\n                            },\n                        )\n                    rust(\"Ok(#T)\", builder)\n                }\n            }\n        rust(\"#T(&mut ${ctx.tag})\", nestedParser)\n    }\n\n    private fun RustWriter.parseList(\n        target: CollectionShape,\n        ctx: Ctx,\n    ) {\n        val member = target.member\n        val listParser =\n            protocolFunctions.deserializeFn(target) { fnName ->\n                rustBlockTemplate(\n                    \"pub fn $fnName(decoder: &mut #{ScopedDecoder}) -> #{Result}<#{List}, #{XmlDecodeError}>\",\n                    *codegenScope,\n                    \"List\" to symbolProvider.toSymbol(target),\n                ) {\n                    rust(\"let mut out = std::vec::Vec::new();\")\n                    parseLoop(Ctx(tag = \"decoder\", accum = null)) { ctx ->\n                        case(member) {\n                            withBlock(\"out.push(\", \");\") {\n                                parseMember(member, ctx)\n                            }\n                        }\n                    }\n                    rust(\"Ok(out)\")\n                }\n            }\n        rust(\"#T(&mut ${ctx.tag})\", listParser)\n    }\n\n    private fun RustWriter.parseFlatList(\n        target: CollectionShape,\n        ctx: Ctx,\n    ) {\n        val list = safeName(\"list\")\n        withBlock(\"Result::<#T, #T>::Ok({\", \"})\", symbolProvider.toSymbol(target), xmlDecodeError) {\n            val accum = ctx.accum ?: throw CodegenException(\"Need accum to parse flat list\")\n            rustTemplate(\"\"\"let mut $list = $accum.unwrap_or_default();\"\"\", *codegenScope)\n            withBlock(\"$list.push(\", \");\") {\n                parseMember(target.member, ctx)\n            }\n            rust(list)\n        }\n    }\n\n    private fun RustWriter.parseMap(\n        target: MapShape,\n        ctx: Ctx,\n    ) {\n        val mapParser =\n            protocolFunctions.deserializeFn(target) { fnName ->\n                rustBlockTemplate(\n                    \"pub fn $fnName(decoder: &mut #{ScopedDecoder}) -> #{Result}<#{Map}, #{XmlDecodeError}>\",\n                    *codegenScope,\n                    \"Map\" to symbolProvider.toSymbol(target),\n                ) {\n                    rust(\"let mut out = #T::new();\", RuntimeType.HashMap)\n                    parseLoop(Ctx(tag = \"decoder\", accum = null)) { ctx ->\n                        rustBlock(\"s if ${XmlName(\"entry\").matchExpression(\"s\")} => \") {\n                            rust(\"#T(&mut ${ctx.tag}, &mut out)?;\", mapEntryParser(target, ctx))\n                        }\n                    }\n                    rust(\"Ok(out)\")\n                }\n            }\n        rust(\"#T(&mut ${ctx.tag})\", mapParser)\n    }\n\n    private fun RustWriter.parseFlatMap(\n        target: MapShape,\n        ctx: Ctx,\n    ) {\n        val map = safeName(\"map\")\n        val entryDecoder = mapEntryParser(target, ctx)\n        withBlock(\"Result::<#T, #T>::Ok({\", \"})\", symbolProvider.toSymbol(target), xmlDecodeError) {\n            val accum = ctx.accum ?: throw CodegenException(\"need accum to parse flat map\")\n            rustTemplate(\n                \"\"\"\n                let mut $map = $accum.unwrap_or_default();\n                #{decoder}(&mut tag, &mut $map)?;\n                $map\n                \"\"\",\n                *codegenScope,\n                \"decoder\" to entryDecoder,\n            )\n        }\n    }\n\n    private fun mapEntryParser(\n        target: MapShape,\n        ctx: Ctx,\n    ): RuntimeType {\n        return protocolFunctions.deserializeFn(target, \"entry\") { fnName ->\n            rustBlockTemplate(\n                \"pub fn $fnName(decoder: &mut #{ScopedDecoder}, out: &mut #{Map}) -> #{Result}<(), #{XmlDecodeError}>\",\n                *codegenScope,\n                \"Map\" to symbolProvider.toSymbol(target),\n            ) {\n                val keySymbol = symbolProvider.toSymbol(target.key)\n                rust(\"let mut k: Option<#T> = None;\", keySymbol)\n                rust(\n                    \"let mut v: Option<#T> = None;\",\n                    symbolProvider.toSymbol(model.expectShape(target.value.target)),\n                )\n                parseLoop(Ctx(\"decoder\", accum = null)) {\n                    case(target.key) {\n                        withBlock(\"k = Some(\", \")\") {\n                            parseMember(target.key, ctx = ctx.copy(accum = null))\n                        }\n                    }\n                    case(target.value) {\n                        withBlock(\"v = Some(\", \")\") {\n                            parseMember(target.value, ctx = ctx.copy(accum = \"v\"))\n                        }\n                    }\n                }\n\n                rustTemplate(\n                    \"\"\"\n                    let k = k.ok_or_else(||#{XmlDecodeError}::custom(\"missing key map entry\"))?;\n                    let v = v.ok_or_else(||#{XmlDecodeError}::custom(\"missing value map entry\"))?;\n                    out.insert(k, v);\n                    Ok(())\n                    \"\"\",\n                    *codegenScope,\n                )\n            }\n        }\n    }\n\n    /**\n     * Parse a simple member from a data field\n     * [provider] generates code for the inner data field\n     */\n    private fun RustWriter.parsePrimitiveInner(\n        member: MemberShape,\n        provider: Writable,\n    ) {\n        when (val shape = model.expectShape(member.target)) {\n            is StringShape -> parseStringInner(shape, provider)\n\n            is BigIntegerShape -> {\n                rustBlock(\"\") {\n                    rustTemplate(\n                        \"<#{BigInteger} as ::std::str::FromStr>::from_str(\",\n                        \"BigInteger\" to RuntimeType.bigInteger(runtimeConfig),\n                        *codegenScope,\n                    )\n                    provider()\n                    rustTemplate(\n                        \").map_err(|e| #{XmlDecodeError}::custom(format!(\\\"invalid BigInteger: {}\\\", e)))\",\n                        *codegenScope,\n                    )\n                }\n            }\n\n            is BigDecimalShape -> {\n                rustBlock(\"\") {\n                    rustTemplate(\n                        \"<#{BigDecimal} as ::std::str::FromStr>::from_str(\",\n                        \"BigDecimal\" to RuntimeType.bigDecimal(runtimeConfig),\n                        *codegenScope,\n                    )\n                    provider()\n                    rustTemplate(\n                        \").map_err(|e| #{XmlDecodeError}::custom(format!(\\\"invalid BigDecimal: {}\\\", e)))\",\n                        *codegenScope,\n                    )\n                }\n            }\n\n            is NumberShape, is BooleanShape -> {\n                rustBlock(\"\") {\n                    withBlockTemplate(\n                        \"<#{shape} as #{aws_smithy_types}::primitive::Parse>::parse_smithy_primitive(\",\n                        \")\",\n                        *codegenScope,\n                        \"shape\" to symbolProvider.toSymbol(shape),\n                    ) {\n                        provider()\n                    }\n                    rustTemplate(\n                        \"\"\".map_err(|_|#{XmlDecodeError}::custom(\"expected ${escape(shape.toString())}\"))\"\"\",\n                        *codegenScope,\n                    )\n                }\n            }\n\n            is TimestampShape -> {\n                val timestampFormat =\n                    index.determineTimestampFormat(\n                        member,\n                        HttpBinding.Location.DOCUMENT,\n                        TimestampFormatTrait.Format.DATE_TIME,\n                    )\n                val timestampFormatType =\n                    RuntimeType.parseTimestampFormat(codegenTarget, runtimeConfig, timestampFormat)\n                withBlock(\"#T::from_str(\", \")\", RuntimeType.dateTime(runtimeConfig)) {\n                    provider()\n                    rust(\", #T\", timestampFormatType)\n                }\n                rustTemplate(\n                    \"\"\".map_err(|_|#{XmlDecodeError}::custom(\"expected ${escape(shape.toString())}\"))\"\"\",\n                    *codegenScope,\n                )\n            }\n\n            is BlobShape -> {\n                withBlock(\"#T(\", \")\", RuntimeType.base64Decode(runtimeConfig)) {\n                    provider()\n                }\n                rustTemplate(\n                    \"\"\".map_err(|err|#{XmlDecodeError}::custom(format!(\"invalid base64: {err:?}\"))).map(#{Blob}::new)\"\"\",\n                    *codegenScope,\n                )\n            }\n\n            else -> PANIC(\"unexpected shape: $shape\")\n        }\n    }\n\n    private fun RustWriter.parseStringInner(\n        shape: StringShape,\n        provider: Writable,\n    ) {\n        withBlock(\"Result::<#T, #T>::Ok(\", \")\", symbolProvider.toSymbol(shape), xmlDecodeError) {\n            if (shape.hasTrait<EnumTrait>()) {\n                val enumSymbol = symbolProvider.toSymbol(shape)\n                if (convertsToEnumInServer(shape)) {\n                    withBlock(\"#T::try_from(\", \")\", enumSymbol) {\n                        provider()\n                    }\n                    rustTemplate(\n                        \"\"\".map_err(|e| #{XmlDecodeError}::custom(format!(\"unknown variant {e}\")))?\"\"\",\n                        *codegenScope,\n                    )\n                } else {\n                    withBlock(\"#T::from(\", \")\", enumSymbol) {\n                        provider()\n                    }\n                }\n            } else {\n                provider()\n                // If it's already `Cow::Owned` then `.into()` is free (as opposed to using `to_string()`).\n                rust(\".into()\")\n            }\n        }\n    }\n\n    private fun convertsToEnumInServer(shape: StringShape) =\n        target == CodegenTarget.SERVER && shape.hasTrait<EnumTrait>()\n\n    private fun MemberShape.xmlName(): XmlName {\n        return XmlName(xmlIndex.memberName(this))\n    }\n\n    private fun MemberShape.isFlattened(): Boolean {\n        return getMemberTrait(model, XmlFlattenedTrait::class.java).isPresent\n    }\n\n    private fun OperationShape.operationXmlMembers(): XmlMemberIndex {\n        val outputShape = this.outputShape(model)\n\n        // HTTP trait bound protocols, such as RestXml, need to restrict the members to DOCUMENT members,\n        // while protocols like AwsQuery do not support HTTP traits, and thus, all members are used.\n        val responseBindings = index.getResponseBindings(this)\n        return when (responseBindings.isEmpty()) {\n            true -> XmlMemberIndex.fromMembers(outputShape.members().toList())\n            else -> {\n                val documentMembers =\n                    responseBindings.filter { it.value.location == HttpBinding.Location.DOCUMENT }\n                        .keys.map { outputShape.expectMember(it) }\n                return XmlMemberIndex.fromMembers(documentMembers)\n            }\n        }\n    }\n\n    private fun OperationShape.serverInputXmlMembers(): XmlMemberIndex {\n        val inputShape = this.inputShape(model)\n\n        // HTTP trait bound protocols, such as RestXml, need to restrict the members to DOCUMENT members,\n        // while protocols like AwsQuery do not support HTTP traits, and thus, all members are used.\n        val requestBindings = index.getRequestBindings(this)\n        return when (requestBindings.isEmpty()) {\n            true -> XmlMemberIndex.fromMembers(inputShape.members().toList())\n            else -> {\n                val documentMembers =\n                    requestBindings.filter { it.value.location == HttpBinding.Location.DOCUMENT }\n                        .keys.map { inputShape.expectMember(it) }\n                return XmlMemberIndex.fromMembers(documentMembers)\n            }\n        }\n    }\n\n    private fun StructureShape.errorXmlMembers(): XmlMemberIndex {\n        val responseBindings = index.getResponseBindings(this)\n\n        // HTTP trait bound protocols, such as RestXml, need to restrict the members to DOCUMENT members,\n        // while protocols like AwsQuery do not support HTTP traits, and thus, all members are used.\n        return when (responseBindings.isEmpty()) {\n            true -> XmlMemberIndex.fromMembers(members().toList())\n            else -> {\n                val documentMembers =\n                    responseBindings.filter { it.value.location == HttpBinding.Location.DOCUMENT }\n                        .keys.map { this.expectMember(it) }\n                return XmlMemberIndex.fromMembers(documentMembers)\n            }\n        }\n    }\n\n    private fun StructureShape.xmlMembers(): XmlMemberIndex {\n        return XmlMemberIndex.fromMembers(this.members().toList())\n    }\n}\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/AwsQuerySerializerGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy.protocols.serialize\n\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.model.traits.XmlFlattenedTrait\nimport software.amazon.smithy.model.traits.XmlNameTrait\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenContext\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.util.getTrait\n\nclass AwsQuerySerializerGenerator(codegenContext: CodegenContext) : QuerySerializerGenerator(codegenContext) {\n    override val protocolName: String get() = \"AWS Query\"\n\n    override fun MemberShape.queryKeyName(prioritizedFallback: String?): String =\n        getTrait<XmlNameTrait>()?.value ?: memberName\n\n    override fun MemberShape.isFlattened(): Boolean = getTrait<XmlFlattenedTrait>() != null\n\n    override fun operationOutputSerializer(operationShape: OperationShape): RuntimeType? {\n        TODO(\"Not yet implemented\")\n    }\n\n    override fun serverErrorSerializer(shape: ShapeId): RuntimeType {\n        TODO(\"Not yet implemented\")\n    }\n}\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/CborSerializerGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy.protocols.serialize\n\nimport software.amazon.smithy.codegen.core.CodegenException\nimport software.amazon.smithy.model.shapes.BigDecimalShape\nimport software.amazon.smithy.model.shapes.BigIntegerShape\nimport software.amazon.smithy.model.shapes.BlobShape\nimport software.amazon.smithy.model.shapes.BooleanShape\nimport software.amazon.smithy.model.shapes.ByteShape\nimport software.amazon.smithy.model.shapes.CollectionShape\nimport software.amazon.smithy.model.shapes.DocumentShape\nimport software.amazon.smithy.model.shapes.DoubleShape\nimport software.amazon.smithy.model.shapes.FloatShape\nimport software.amazon.smithy.model.shapes.IntegerShape\nimport software.amazon.smithy.model.shapes.LongShape\nimport software.amazon.smithy.model.shapes.MapShape\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.model.shapes.ShortShape\nimport software.amazon.smithy.model.shapes.StringShape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.shapes.TimestampShape\nimport software.amazon.smithy.model.shapes.UnionShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.isNotEmpty\nimport software.amazon.smithy.rust.codegen.core.rustlang.join\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlockTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenContext\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\nimport software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.NamedCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.Section\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.UnionGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.renderUnknownVariant\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.serializationError\nimport software.amazon.smithy.rust.codegen.core.smithy.isOptional\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.HttpBindingResolver\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.HttpLocation\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.ProtocolFunctions\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.serialize.CborSerializerGenerator.Context\nimport software.amazon.smithy.rust.codegen.core.smithy.transformers.OperationNormalizer\nimport software.amazon.smithy.rust.codegen.core.util.UNREACHABLE\nimport software.amazon.smithy.rust.codegen.core.util.dq\nimport software.amazon.smithy.rust.codegen.core.util.inputShape\nimport software.amazon.smithy.rust.codegen.core.util.isTargetUnit\nimport software.amazon.smithy.rust.codegen.core.util.isUnit\nimport software.amazon.smithy.rust.codegen.core.util.outputShape\n\n/**\n * Class describing a CBOR serializer section that can be used in a customization.\n */\nsealed class CborSerializerSection(name: String) : Section(name) {\n    /**\n     * Mutate the serializer prior to serializing any structure members. Eg: this can be used to inject `__type`\n     * to record the error type in the case of an error structure.\n     */\n    data class BeforeSerializingStructureMembers(\n        val structContext: CborSerializerGenerator.StructContext,\n        val encoderBindingName: String,\n        val codegenContext: CodegenContext,\n    ) : CborSerializerSection(\"BeforeSerializingStructureMembers\")\n\n    /** Manipulate the serializer context for a map prior to it being serialized. **/\n    data class BeforeIteratingOverMapOrCollection(\n        val shape: Shape,\n        val context: CborSerializerGenerator.Context<Shape>,\n    ) :\n        CborSerializerSection(\"BeforeIteratingOverMapOrCollection\")\n\n    /** Manipulate the serializer context for a non-null member prior to it being serialized. **/\n    data class BeforeSerializingNonNullMember(val shape: Shape, val context: CborSerializerGenerator.MemberContext) :\n        CborSerializerSection(\"BeforeSerializingNonNullMember\")\n\n    /**\n     * Allows specification of additional parameters in the function signature of the serializer.\n     * This customization point enables extending the serializer's interface with supplementary parameters\n     * needed for specialized serialization behaviors.\n     */\n    data class AdditionalSerializingParameters(\n        val structContext: CborSerializerGenerator.StructContext,\n        val codegenContext: CodegenContext,\n    ) :\n        CborSerializerSection(\"AdditionalSerializingParameters\")\n\n    /**\n     * Provides a way to specify additional arguments that should be passed when invoking the serializer.\n     * This customization point allows for passing through context-specific information needed during\n     * the serialization process.\n     */\n    data class AdditionalSerializingArguments(\n        val structContext: CborSerializerGenerator.StructContext,\n        val codegenContext: CodegenContext,\n    ) :\n        CborSerializerSection(\"AdditionalSerializingArguments\")\n\n    /**\n     * Customizes how a union variant's shape ID is encoded in the CBOR format.\n     * This section allows for specialized handling of union variant identification\n     * during serialization.\n     */\n    data class CustomizeUnionMemberKeyEncode(\n        val context: CborSerializerGenerator.MemberContext,\n        val encoderBindingName: String,\n        val codegenContext: CodegenContext,\n    ) :\n        CborSerializerSection(\"CustomizeUnionMemberKeyEncode\")\n\n    /**\n     * Allows customization of the CBOR map length calculation for union types.\n     * This section provides control over how the size of the encoded union\n     * representation is determined, which may vary based on the serialization requirements.\n     */\n    data class CustomizeUnionEncoderMapLength(val context: Context<UnionShape>, val codegenContext: CodegenContext) :\n        CborSerializerSection(\"CustomizeUnionEncoderMapLength\")\n}\n\n/**\n * Customization for the CBOR serializer.\n */\ntypealias CborSerializerCustomization = NamedCustomization<CborSerializerSection>\n\nclass CborSerializerGenerator(\n    private val codegenContext: CodegenContext,\n    private val httpBindingResolver: HttpBindingResolver,\n    private val customizations: List<CborSerializerCustomization> = listOf(),\n) : StructuredDataSerializerGenerator {\n    data class Context<out T : Shape>(\n        /** Expression representing the value to write to the encoder */\n        var valueExpression: ValueExpression,\n        /** Shape to serialize */\n        val shape: T,\n    )\n\n    data class MemberContext(\n        /** Name for the variable bound to the encoder object **/\n        val encoderBindingName: String,\n        /** Expression representing the value to write to the `Encoder` */\n        var valueExpression: ValueExpression,\n        val shape: MemberShape,\n        /** Whether to serialize null values if the type is optional */\n        val writeNulls: Boolean = false,\n    ) {\n        companion object {\n            fun collectionMember(\n                context: Context<CollectionShape>,\n                itemName: String,\n            ): MemberContext =\n                MemberContext(\n                    \"encoder\",\n                    ValueExpression.Reference(itemName),\n                    context.shape.member,\n                    writeNulls = true,\n                )\n\n            fun mapMember(\n                context: Context<MapShape>,\n                key: String,\n                value: String,\n            ): MemberContext =\n                MemberContext(\n                    \"encoder.str($key)\",\n                    ValueExpression.Reference(value),\n                    context.shape.value,\n                    writeNulls = true,\n                )\n\n            fun structMember(\n                context: StructContext,\n                member: MemberShape,\n                symProvider: RustSymbolProvider,\n            ): MemberContext =\n                MemberContext(\n                    encodeKeyExpression(member.memberName),\n                    ValueExpression.Value(\"${context.localName}.${symProvider.toMemberName(member)}\"),\n                    member,\n                )\n\n            fun unionMember(\n                variantReference: String,\n                member: MemberShape,\n                encodeKeyExpression: String = encodeKeyExpression(member.memberName),\n            ): MemberContext =\n                MemberContext(\n                    encodeKeyExpression,\n                    ValueExpression.Reference(variantReference),\n                    member,\n                )\n\n            /** Returns an expression to encode a key member **/\n            private fun encodeKeyExpression(name: String): String = \"encoder.str(${name.dq()})\"\n        }\n    }\n\n    data class StructContext(\n        /** Name of the variable that holds the struct */\n        val localName: String,\n        val shape: StructureShape,\n        val memberContext: MemberContext? = null,\n    )\n\n    private val model = codegenContext.model\n    private val symbolProvider = codegenContext.symbolProvider\n    private val codegenTarget = codegenContext.target\n    private val runtimeConfig = codegenContext.runtimeConfig\n    private val protocolFunctions = ProtocolFunctions(codegenContext)\n\n    private val codegenScope =\n        arrayOf(\n            *preludeScope,\n            \"Error\" to runtimeConfig.serializationError(),\n            \"Encoder\" to RuntimeType.smithyCbor(runtimeConfig).resolve(\"Encoder\"),\n            \"SdkBody\" to RuntimeType.sdkBody(runtimeConfig),\n        )\n    private val serializerUtil = SerializerUtil(model, symbolProvider)\n\n    /**\n     * Reusable structure serializer implementation that can be used to generate serializing code for\n     * operation outputs or errors.\n     * This function is only used by the server, the client uses directly [serializeStructure].\n     */\n    private fun serverSerializer(\n        structureShape: StructureShape,\n        includedMembers: List<MemberShape>,\n        error: Boolean,\n    ): RuntimeType {\n        val suffix =\n            when (error) {\n                true -> \"error\"\n                else -> \"output\"\n            }\n        return protocolFunctions.serializeFn(structureShape, fnNameSuffix = suffix) { fnName ->\n            rustBlockTemplate(\n                \"pub fn $fnName(value: &#{target}) -> #{Result}<#{Vec}<u8>, #{Error}>\",\n                *codegenScope,\n                \"target\" to symbolProvider.toSymbol(structureShape),\n            ) {\n                rustTemplate(\"let mut encoder = #{Encoder}::new(#{Vec}::new());\", *codegenScope)\n                // Open a scope in which we can safely shadow the `encoder` variable to bind it to a mutable reference.\n                rustBlock(\"\") {\n                    rust(\"let encoder = &mut encoder;\")\n                    serializeStructure(\n                        StructContext(\"value\", structureShape),\n                        includedMembers,\n                    )\n                }\n                rustTemplate(\"#{Ok}(encoder.into_writer())\", *codegenScope)\n            }\n        }\n    }\n\n    override fun payloadSerializer(member: MemberShape): RuntimeType {\n        val target = model.expectShape(member.target)\n        return protocolFunctions.serializeFn(member, fnNameSuffix = \"payload\") { fnName ->\n            rustBlockTemplate(\n                \"pub fn $fnName(input: &#{target}) -> std::result::Result<#{Vec}<u8>, #{Error}>\",\n                *codegenScope,\n                \"target\" to symbolProvider.toSymbol(target),\n            ) {\n                rustTemplate(\"let mut encoder = #{Encoder}::new(#{Vec}::new());\", *codegenScope)\n                rustBlock(\"\") {\n                    rust(\"let encoder = &mut encoder;\")\n                    when (target) {\n                        is StructureShape -> serializeStructure(StructContext(\"input\", target))\n                        is UnionShape -> serializeUnion(Context(ValueExpression.Reference(\"input\"), target))\n                        else -> throw IllegalStateException(\"CBOR payloadSerializer only supports structs and unions\")\n                    }\n                }\n                rustTemplate(\"#{Ok}(encoder.into_writer())\", *codegenScope)\n            }\n        }\n    }\n\n    override fun unsetStructure(structure: StructureShape): RuntimeType =\n        ProtocolFunctions.crossOperationFn(\"cbor_json_unset_struct_payload\") { fnName ->\n            rustTemplate(\n                \"\"\"\n                pub fn $fnName() -> #{ByteSlab} {\n                    #{ByteSlab}::from(vec![0xbf, 0xff]) // Empty CBOR map\n                }\n                \"\"\",\n                *codegenScope,\n            )\n        }\n\n    override fun unsetUnion(union: UnionShape): RuntimeType =\n        UNREACHABLE(\"Only clients use this method when serializing an `@httpPayload`. No protocol using CBOR supports this trait, so we don't need to implement this\")\n\n    override fun operationInputSerializer(operationShape: OperationShape): RuntimeType? {\n        // Don't generate an operation CBOR serializer if there was no operation input shape in the\n        // original (untransformed) model.\n        if (!OperationNormalizer.hadUserModeledOperationInput(operationShape, model)) {\n            return null\n        }\n\n        val httpDocumentMembers = httpBindingResolver.requestMembers(operationShape, HttpLocation.DOCUMENT)\n        val inputShape = operationShape.inputShape(model)\n        return protocolFunctions.serializeFn(operationShape, fnNameSuffix = \"input\") { fnName ->\n            rustBlockTemplate(\n                \"pub fn $fnName(input: &#{target}) -> #{Result}<#{SdkBody}, #{Error}>\",\n                *codegenScope, \"target\" to symbolProvider.toSymbol(inputShape),\n            ) {\n                rustTemplate(\"let mut encoder = #{Encoder}::new(Vec::new());\", *codegenScope)\n                // Open a scope in which we can safely shadow the `encoder` variable to bind it to a mutable reference\n                // which doesn't require us to pass `&mut encoder` where requested.\n                rustBlock(\"\") {\n                    rust(\"let encoder = &mut encoder;\")\n                    serializeStructure(StructContext(\"input\", inputShape), httpDocumentMembers)\n                }\n                rustTemplate(\"Ok(#{SdkBody}::from(encoder.into_writer()))\", *codegenScope)\n            }\n        }\n    }\n\n    override fun documentSerializer(): RuntimeType =\n        UNREACHABLE(\"No protocol using CBOR supports `document` shapes, so we don't need to implement this\")\n\n    override fun operationOutputSerializer(operationShape: OperationShape): RuntimeType? {\n        // Don't generate an operation CBOR serializer if there was no operation output shape in the\n        // original (untransformed) model.\n        if (!OperationNormalizer.hadUserModeledOperationOutput(operationShape, model)) {\n            return null\n        }\n\n        val httpDocumentMembers = httpBindingResolver.responseMembers(operationShape, HttpLocation.DOCUMENT)\n        val outputShape = operationShape.outputShape(model)\n        return serverSerializer(outputShape, httpDocumentMembers, error = false)\n    }\n\n    override fun serverErrorSerializer(shape: ShapeId): RuntimeType {\n        val errorShape = model.expectShape(shape, StructureShape::class.java)\n        val includedMembers =\n            httpBindingResolver.errorResponseBindings(shape).filter { it.location == HttpLocation.DOCUMENT }\n                .map { it.member }\n        return serverSerializer(errorShape, includedMembers, error = true)\n    }\n\n    /**\n     * Retrieves customized parameters and arguments for struct serialization based on the provided context and section type.\n     *\n     * @param structContext The context containing information about the structure being serialized\n     * @param sectionType A function that takes a StructContext and CodegenContext and returns a CborSerializerSection.\n     *                   This determines which section of the serializer to customize (e.g., AdditionalSerializingArguments)\n     * @return A Writable containing the joined customized parameters/arguments as a comma-separated string with a leading comma,\n     *         or an empty Writable if no customizations are present\n     */\n    private fun getCustomizedParamsAndArgsForStructSerializer(\n        structContext: StructContext,\n        sectionType: (StructContext, CodegenContext) -> CborSerializerSection,\n    ) = customizations\n        .map { it.section(sectionType(structContext, codegenContext)) }\n        .filter { it.isNotEmpty() } // Remove any empty customizations.\n        .takeIf { it.isNotEmpty() } // Proceed only if there are remaining customizations.\n        ?.join(\", \", prefix = \", \") // Join with commas and add leading comma.\n        ?: writable {} // Return empty writable if no customizations exist.\n\n    private fun RustWriter.serializeStructure(\n        context: StructContext,\n        includedMembers: List<MemberShape>? = null,\n    ) {\n        if (context.shape.isUnit()) {\n            rust(\"encoder.begin_map();\")\n            for (customization in customizations) {\n                customization.section(\n                    CborSerializerSection.BeforeSerializingStructureMembers(\n                        context,\n                        \"encoder\",\n                        codegenContext,\n                    ),\n                )(this)\n            }\n            rust(\"encoder.end();\")\n            return\n        }\n\n        val structureSerializer =\n            protocolFunctions.serializeFn(context.shape) { fnName ->\n                val paramsWritable =\n                    getCustomizedParamsAndArgsForStructSerializer(\n                        context,\n                        CborSerializerSection::AdditionalSerializingParameters,\n                    )\n                rustBlockTemplate(\n                    \"pub fn $fnName(encoder: &mut #{Encoder}, ##[allow(unused)] input: &#{StructureSymbol} #{Params}) -> #{Result}<(), #{Error}>\",\n                    \"StructureSymbol\" to symbolProvider.toSymbol(context.shape),\n                    \"Params\" to paramsWritable,\n                    *codegenScope,\n                ) {\n                    // TODO(https://github.com/smithy-lang/smithy-rs/issues/3745) If all members are non-`Option`-al,\n                    //  we know AOT the map's size and can use `.map()` instead of `.begin_map()` for efficiency.\n                    rust(\"encoder.begin_map();\")\n                    for (customization in customizations) {\n                        customization.section(\n                            CborSerializerSection.BeforeSerializingStructureMembers(\n                                context,\n                                \"encoder\",\n                                codegenContext,\n                            ),\n                        )(this)\n                    }\n                    context.copy(localName = \"input\").also { inner ->\n                        val members = includedMembers ?: inner.shape.members()\n                        for (member in members) {\n                            serializeMember(MemberContext.structMember(inner, member, symbolProvider))\n                        }\n                    }\n                    rust(\"encoder.end();\")\n                    rust(\"Ok(())\")\n                }\n            }\n\n        val argsWritable =\n            getCustomizedParamsAndArgsForStructSerializer(\n                context,\n                CborSerializerSection::AdditionalSerializingArguments,\n            )\n        rustTemplate(\n            \"#{SerializingFunction}(encoder, ${context.localName} #{Args})?;\",\n            \"SerializingFunction\" to structureSerializer,\n            \"Args\" to argsWritable,\n        )\n    }\n\n    private fun RustWriter.serializeMember(context: MemberContext) {\n        val targetShape = model.expectShape(context.shape.target)\n        if (symbolProvider.toSymbol(context.shape).isOptional()) {\n            safeName().also { local ->\n                rustBlock(\"if let Some($local) = ${context.valueExpression.asRef()}\") {\n                    context.valueExpression = ValueExpression.Reference(local)\n                    resolveValueExpressionForConstrainedType(targetShape, context)\n                    serializeMemberValue(context, targetShape)\n                }\n                if (context.writeNulls) {\n                    rustBlock(\"else\") {\n                        rust(\"${context.encoderBindingName}.null();\")\n                    }\n                }\n            }\n        } else {\n            resolveValueExpressionForConstrainedType(targetShape, context)\n            with(serializerUtil) {\n                ignoreDefaultsForNumbersAndBools(context.shape, context.valueExpression) {\n                    serializeMemberValue(context, targetShape)\n                }\n            }\n        }\n    }\n\n    private fun RustWriter.resolveValueExpressionForConstrainedType(\n        targetShape: Shape,\n        context: MemberContext,\n    ) {\n        for (customization in customizations) {\n            customization.section(\n                CborSerializerSection.BeforeSerializingNonNullMember(\n                    targetShape,\n                    context,\n                ),\n            )(this)\n        }\n    }\n\n    private fun RustWriter.serializeMemberValue(\n        context: MemberContext,\n        target: Shape,\n    ) {\n        val encoder = context.encoderBindingName\n        val value = context.valueExpression\n        val containerShape = model.expectShape(context.shape.container)\n\n        when (target) {\n            // Simple shapes: https://smithy.io/2.0/spec/simple-types.html\n            is BlobShape -> rust(\"$encoder.blob(${value.asRef()});\")\n            is BooleanShape -> rust(\"$encoder.boolean(${value.asValue()});\")\n\n            is StringShape -> rust(\"$encoder.str(${value.name}.as_str());\")\n\n            is ByteShape -> rust(\"$encoder.byte(${value.asValue()});\")\n            is ShortShape -> rust(\"$encoder.short(${value.asValue()});\")\n            is IntegerShape -> rust(\"$encoder.integer(${value.asValue()});\")\n            is LongShape -> rust(\"$encoder.long(${value.asValue()});\")\n\n            is FloatShape -> rust(\"$encoder.float(${value.asValue()});\")\n            is DoubleShape -> rust(\"$encoder.double(${value.asValue()});\")\n\n            is TimestampShape -> rust(\"$encoder.timestamp(${value.asRef()});\")\n\n            // BigInteger/BigDecimal are not supported with CBOR.\n            // The Smithy RPC v2 CBOR spec requires these to be encoded using CBOR tags 2/3/4\n            // (binary bignum representation), but aws-smithy-cbor doesn't implement these tags yet.\n            is BigIntegerShape ->\n                throw CodegenException(\n                    \"BigInteger is not supported with Concise Binary Object Representation (CBOR) protocol\",\n                )\n            is BigDecimalShape ->\n                throw CodegenException(\n                    \"BigDecimal is not supported with Concise Binary Object Representation (CBOR) protocol\",\n                )\n\n            is DocumentShape -> UNREACHABLE(\"Smithy RPC v2 CBOR does not support `document` shapes\")\n\n            // Aggregate shapes: https://smithy.io/2.0/spec/aggregate-types.html\n            else -> {\n                // This condition is equivalent to `containerShape !is CollectionShape`.\n                if (containerShape is StructureShape || containerShape is UnionShape || containerShape is MapShape) {\n                    val customizedMemberKeyWritable =\n                        validateAndGetUniqueUnionVariantKeyCustomizedEncodingOrEmpty(context, encoder)\n\n                    if (customizedMemberKeyWritable.isNotEmpty()) {\n                        customizedMemberKeyWritable(this)\n                    } else {\n                        rust(\"$encoder;\") // Encode the member key.\n                    }\n                }\n                when (target) {\n                    is StructureShape -> serializeStructure(StructContext(value.asRef(), target, context))\n                    is CollectionShape -> serializeCollection(Context(value, target))\n                    is MapShape -> serializeMap(Context(value, target))\n                    is UnionShape -> serializeUnion(Context(value, target))\n                    else -> UNREACHABLE(\"Smithy added a new aggregate shape: $target\")\n                }\n            }\n        }\n    }\n\n    private fun RustWriter.serializeCollection(context: Context<CollectionShape>) {\n        for (customization in customizations) {\n            customization.section(\n                CborSerializerSection.BeforeIteratingOverMapOrCollection(\n                    context.shape,\n                    context,\n                ),\n            )(this)\n        }\n        rust(\"encoder.array((${context.valueExpression.asValue()}).len());\")\n        val itemName = safeName(\"item\")\n        rustBlock(\"for $itemName in ${context.valueExpression.asRef()}\") {\n            serializeMember(MemberContext.collectionMember(context, itemName))\n        }\n    }\n\n    private fun RustWriter.serializeMap(context: Context<MapShape>) {\n        val keyName = safeName(\"key\")\n        val valueName = safeName(\"value\")\n        for (customization in customizations) {\n            customization.section(\n                CborSerializerSection.BeforeIteratingOverMapOrCollection(\n                    context.shape,\n                    context,\n                ),\n            )(this)\n        }\n        rust(\"encoder.map((${context.valueExpression.asValue()}).len());\")\n        rustBlock(\"for ($keyName, $valueName) in ${context.valueExpression.asRef()}\") {\n            val keyExpression = \"$keyName.as_str()\"\n            serializeMember(MemberContext.mapMember(context, keyExpression, valueName))\n        }\n    }\n\n    private fun RustWriter.serializeUnion(context: Context<UnionShape>) {\n        val unionSymbol = symbolProvider.toSymbol(context.shape)\n        val unionSerializer =\n            protocolFunctions.serializeFn(context.shape) { fnName ->\n                rustBlockTemplate(\n                    \"pub fn $fnName(encoder: &mut #{Encoder}, input: &#{UnionSymbol}) -> #{Result}<(), #{Error}>\",\n                    \"UnionSymbol\" to unionSymbol,\n                    *codegenScope,\n                ) {\n                    // Processes customizations for encoding union variants. This determines how the variant\n                    // type information is serialized in the generated code.\n                    val customUnionEncoderLength =\n                        validateAndGetUniqueUnionVariantEncoderLengthCustomizedEncodingOrEmpty(context)\n\n                    // Apply any custom variant encoding logic if customizations exist\n                    // Otherwise fall back to default union variant serialization\n                    if (customUnionEncoderLength.isNotEmpty()) {\n                        customUnionEncoderLength(this)\n                    } else {\n                        // A union is serialized identically as a `structure` shape, but only a single member can be set to a\n                        // non-null value.\n                        rust(\"encoder.map(1);\")\n                    }\n\n                    rustBlock(\"match input\") {\n                        for (member in context.shape.members()) {\n                            val variantName =\n                                if (member.isTargetUnit()) {\n                                    symbolProvider.toMemberName(member)\n                                } else {\n                                    \"${symbolProvider.toMemberName(member)}(inner)\"\n                                }\n                            rustBlock(\"#T::$variantName =>\", unionSymbol) {\n                                serializeMember(MemberContext.unionMember(\"inner\", member))\n                            }\n                        }\n                        if (codegenTarget.renderUnknownVariant()) {\n                            rustTemplate(\n                                \"#{Union}::${UnionGenerator.UNKNOWN_VARIANT_NAME} => return #{Err}(#{Error}::unknown_variant(${unionSymbol.name.dq()}))\",\n                                \"Union\" to unionSymbol,\n                                *codegenScope,\n                            )\n                        }\n                    }\n                    rustTemplate(\"#{Ok}(())\", *codegenScope)\n                }\n            }\n        rust(\"#T(encoder, ${context.valueExpression.asRef()})?;\", unionSerializer)\n    }\n\n    /**\n     * Process and validate customizations for a CborSerializerSection.\n     *\n     * @param section The CborSerializerSection to validate\n     * @param customizationName A descriptive name for the customization type (used in error messages)\n     * @return A [Writable] containing the single valid customization, or an empty writable if none exist\n     * @throws IllegalArgumentException if multiple customizations are found\n     */\n    private fun validateAndGetUniqueCustomizationOrEmpty(\n        section: CborSerializerSection,\n        customizationName: String,\n    ): Writable =\n        customizations.map { customization ->\n            customization.section(section)\n        }\n            .filter { it.isNotEmpty() }\n            .also { filteredCustomizations ->\n                if (filteredCustomizations.size > 1) {\n                    throw IllegalArgumentException(\n                        \"Found ${filteredCustomizations.size} $customizationName customizations, but only one is allowed.\",\n                    )\n                }\n            }\n            .firstOrNull() ?: writable {}\n\n    /**\n     * Process customizations for union variant encoding, ensuring only one customization exists.\n     *\n     * This function processes all customizations to find those that modify how a union variant's\n     * map length is encoded. It enforces that at most one such customization exists to prevent\n     * conflicting encoding strategies.\n     *\n     * @throws IllegalArgumentException if multiple customizations are found.\n     * @return A [Writable] containing the custom encoding logic, or an empty writable if no\n     *         customizations exist, in which case the default encoding should be used.\n     */\n    private fun validateAndGetUniqueUnionVariantEncoderLengthCustomizedEncodingOrEmpty(\n        context: Context<UnionShape>,\n    ): Writable =\n        validateAndGetUniqueCustomizationOrEmpty(\n            CborSerializerSection.CustomizeUnionEncoderMapLength(\n                context,\n                codegenContext,\n            ),\n            \"union encoder map length\",\n        )\n\n    /**\n     * Validates and retrieves a single customization for encoding a union variant's key.\n     *\n     * This function processes all customizations to find those that modify how a union variant's\n     * key is encoded. It enforces that at most one such customization exists to prevent\n     * conflicting encoding strategies.\n     *\n     * @throws IllegalArgumentException if multiple customizations are found.\n     * @return A [Writable] containing the custom encoding logic, or an empty writable if no\n     *         customizations exist, in which case the default encoding should be used.\n     */\n    private fun validateAndGetUniqueUnionVariantKeyCustomizedEncodingOrEmpty(\n        context: MemberContext,\n        encoder: String,\n    ): Writable =\n        validateAndGetUniqueCustomizationOrEmpty(\n            CborSerializerSection.CustomizeUnionMemberKeyEncode(\n                context,\n                encoder,\n                codegenContext,\n            ),\n            \"union variant key\",\n        )\n}\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/Ec2QuerySerializerGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy.protocols.serialize\n\nimport software.amazon.smithy.aws.traits.protocols.Ec2QueryNameTrait\nimport software.amazon.smithy.model.shapes.CollectionShape\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.model.traits.XmlNameTrait\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlock\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenContext\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.util.getTrait\nimport software.amazon.smithy.utils.StringUtils\n\nclass Ec2QuerySerializerGenerator(codegenContext: CodegenContext) : QuerySerializerGenerator(codegenContext) {\n    override val protocolName: String get() = \"EC2 Query\"\n\n    override fun MemberShape.queryKeyName(prioritizedFallback: String?): String =\n        getTrait<Ec2QueryNameTrait>()?.value\n            ?: getTrait<XmlNameTrait>()?.value?.let { StringUtils.capitalize(it) }\n            ?: StringUtils.capitalize(memberName)\n\n    override fun MemberShape.isFlattened(): Boolean = true\n\n    override fun operationOutputSerializer(operationShape: OperationShape): RuntimeType? {\n        TODO(\"Not yet implemented\")\n    }\n\n    override fun serverErrorSerializer(shape: ShapeId): RuntimeType {\n        TODO(\"Not yet implemented\")\n    }\n\n    override fun RustWriter.serializeCollection(\n        memberContext: MemberContext,\n        context: Context<CollectionShape>,\n    ) {\n        rustBlock(\"if !${context.valueExpression.asRef()}.is_empty()\") {\n            super.serializeCollectionInner(memberContext, context, this)\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/EventStreamErrorMarshallerGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy.protocols.serialize\n\nimport software.amazon.smithy.codegen.core.Symbol\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.shapes.UnionShape\nimport software.amazon.smithy.model.traits.EventHeaderTrait\nimport software.amazon.smithy.model.traits.EventPayloadTrait\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustModule\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.render\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlockTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenTarget\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.renderUnknownVariant\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.unknownVariantError\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.parse.eventStreamSerdeModule\nimport software.amazon.smithy.rust.codegen.core.smithy.rustType\nimport software.amazon.smithy.rust.codegen.core.smithy.traits.SyntheticEventStreamUnionTrait\nimport software.amazon.smithy.rust.codegen.core.smithy.transformers.eventStreamErrors\nimport software.amazon.smithy.rust.codegen.core.util.dq\nimport software.amazon.smithy.rust.codegen.core.util.expectTrait\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\nimport software.amazon.smithy.rust.codegen.core.util.toPascalCase\n\nclass EventStreamErrorMarshallerGenerator(\n    private val model: Model,\n    private val target: CodegenTarget,\n    runtimeConfig: RuntimeConfig,\n    private val symbolProvider: RustSymbolProvider,\n    private val unionShape: UnionShape,\n    private val serializerGenerator: StructuredDataSerializerGenerator,\n    payloadContentType: String,\n) : EventStreamMarshallerGenerator(model, target, runtimeConfig, symbolProvider, unionShape, serializerGenerator, payloadContentType) {\n    private val smithyEventStream = RuntimeType.smithyEventStream(runtimeConfig)\n    private val smithyTypes = RuntimeType.smithyTypes(runtimeConfig)\n\n    private val operationErrorSymbol =\n        if (target == CodegenTarget.SERVER && unionShape.eventStreamErrors().isEmpty()) {\n            RuntimeType.smithyHttp(runtimeConfig).resolve(\"event_stream::MessageStreamError\").toSymbol()\n        } else {\n            symbolProvider.symbolForEventStreamError(unionShape)\n        }\n    private val eventStreamSerdeModule = RustModule.eventStreamSerdeModule()\n    private val errorsShape = unionShape.expectTrait<SyntheticEventStreamUnionTrait>()\n    private val codegenScope =\n        arrayOf(\n            \"MarshallMessage\" to smithyEventStream.resolve(\"frame::MarshallMessage\"),\n            \"Message\" to smithyTypes.resolve(\"event_stream::Message\"),\n            \"Header\" to smithyTypes.resolve(\"event_stream::Header\"),\n            \"HeaderValue\" to smithyTypes.resolve(\"event_stream::HeaderValue\"),\n            \"Error\" to smithyEventStream.resolve(\"error::Error\"),\n        )\n\n    override fun render(): RuntimeType {\n        val marshallerType = unionShape.eventStreamMarshallerType()\n        val unionSymbol = symbolProvider.toSymbol(unionShape)\n\n        return RuntimeType.forInlineFun(\"${marshallerType.name}::new\", eventStreamSerdeModule) {\n            renderMarshaller(marshallerType, unionSymbol)\n        }\n    }\n\n    private fun RustWriter.renderMarshaller(\n        marshallerType: RuntimeType,\n        unionSymbol: Symbol,\n    ) {\n        rust(\n            \"\"\"\n            ##[non_exhaustive]\n            ##[derive(Debug)]\n            pub struct ${marshallerType.name};\n\n            impl ${marshallerType.name} {\n                pub fn new() -> Self {\n                    ${marshallerType.name}\n                }\n            }\n            \"\"\",\n        )\n\n        rustBlockTemplate(\n            \"impl #{MarshallMessage} for ${marshallerType.name}\",\n            *codegenScope,\n        ) {\n            rust(\"type Input = ${operationErrorSymbol.rustType().render(fullyQualified = true)};\")\n\n            rustBlockTemplate(\n                \"fn marshall(&self, _input: Self::Input) -> std::result::Result<#{Message}, #{Error}>\",\n                *codegenScope,\n            ) {\n                rust(\"let mut headers = Vec::new();\")\n                addStringHeader(\":message-type\", \"\"\"\"exception\".into()\"\"\")\n                if (errorsShape.errorMembers.isEmpty()) {\n                    rust(\"let payload = Vec::new();\")\n                } else {\n                    rustBlock(\"let payload = match _input\") {\n                        errorsShape.errorMembers.forEach { error ->\n                            val errorString = error.memberName\n                            val target = model.expectShape(error.target, StructureShape::class.java)\n                            val targetSymbol = symbolProvider.toSymbol(target)\n                            rustBlock(\"#T::${targetSymbol.name}(inner) => \", operationErrorSymbol) {\n                                addStringHeader(\":exception-type\", \"${errorString.dq()}.into()\")\n                                renderMarshallEvent(error, target)\n                            }\n                        }\n                        if (target.renderUnknownVariant()) {\n                            rustTemplate(\n                                \"\"\"\n                                #{OperationError}::Unhandled(_inner) => return Err(\n                                    #{Error}::marshalling(${unknownVariantError(unionSymbol.rustType().name).dq()}.to_owned())\n                                ),\n                                \"\"\",\n                                *codegenScope,\n                                \"OperationError\" to operationErrorSymbol,\n                            )\n                        }\n                    }\n                }\n                rustTemplate(\"; Ok(#{Message}::new_from_parts(headers, payload))\", *codegenScope)\n            }\n        }\n    }\n\n    private fun RustWriter.renderMarshallEvent(\n        unionMember: MemberShape,\n        eventStruct: StructureShape,\n    ) {\n        val headerMembers = eventStruct.members().filter { it.hasTrait<EventHeaderTrait>() }\n        val payloadMember = eventStruct.members().firstOrNull { it.hasTrait<EventPayloadTrait>() }\n        for (member in headerMembers) {\n            val memberName = symbolProvider.toMemberName(member)\n            val target = model.expectShape(member.target)\n            renderMarshallEventHeader(memberName, member, target)\n        }\n        if (payloadMember != null) {\n            val memberName = symbolProvider.toMemberName(payloadMember)\n            val target = model.expectShape(payloadMember.target)\n            val serializerFn = serializerGenerator.serverErrorSerializer(payloadMember.toShapeId())\n            renderMarshallEventPayload(\"inner.$memberName\", payloadMember, target, serializerFn)\n        } else if (headerMembers.isEmpty()) {\n            val serializerFn = serializerGenerator.serverErrorSerializer(unionMember.target.toShapeId())\n            renderMarshallEventPayload(\"inner\", unionMember, eventStruct, serializerFn)\n        } else {\n            rust(\"Vec::new()\")\n        }\n    }\n\n    private fun UnionShape.eventStreamMarshallerType(): RuntimeType {\n        val symbol = symbolProvider.toSymbol(this)\n        return RuntimeType(\"crate::event_stream_serde::${symbol.name.toPascalCase()}ErrorMarshaller\")\n    }\n}\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/EventStreamMarshallerGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy.protocols.serialize\n\nimport software.amazon.smithy.codegen.core.Symbol\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.BlobShape\nimport software.amazon.smithy.model.shapes.BooleanShape\nimport software.amazon.smithy.model.shapes.ByteShape\nimport software.amazon.smithy.model.shapes.EnumShape\nimport software.amazon.smithy.model.shapes.IntegerShape\nimport software.amazon.smithy.model.shapes.LongShape\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.shapes.ShortShape\nimport software.amazon.smithy.model.shapes.StringShape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.shapes.TimestampShape\nimport software.amazon.smithy.model.shapes.UnionShape\nimport software.amazon.smithy.model.traits.EventHeaderTrait\nimport software.amazon.smithy.model.traits.EventPayloadTrait\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustModule\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.render\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlockTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.withBlock\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenTarget\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\nimport software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.UnionGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.renderUnknownVariant\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.unknownVariantError\nimport software.amazon.smithy.rust.codegen.core.smithy.isOptional\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.parse.eventStreamSerdeModule\nimport software.amazon.smithy.rust.codegen.core.smithy.rustType\nimport software.amazon.smithy.rust.codegen.core.util.dq\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\nimport software.amazon.smithy.rust.codegen.core.util.isTargetUnit\nimport software.amazon.smithy.rust.codegen.core.util.toPascalCase\n\nopen class EventStreamMarshallerGenerator(\n    private val model: Model,\n    private val target: CodegenTarget,\n    runtimeConfig: RuntimeConfig,\n    private val symbolProvider: RustSymbolProvider,\n    private val unionShape: UnionShape,\n    private val serializerGenerator: StructuredDataSerializerGenerator,\n    private val payloadContentType: String,\n) {\n    private val smithyEventStream = RuntimeType.smithyEventStream(runtimeConfig)\n    private val smithyTypes = RuntimeType.smithyTypes(runtimeConfig)\n    private val eventStreamSerdeModule = RustModule.eventStreamSerdeModule()\n    private val codegenScope =\n        arrayOf(\n            *preludeScope,\n            \"Bytes\" to RuntimeType.Bytes,\n            \"MarshallMessage\" to smithyEventStream.resolve(\"frame::MarshallMessage\"),\n            \"Message\" to smithyTypes.resolve(\"event_stream::Message\"),\n            \"Header\" to smithyTypes.resolve(\"event_stream::Header\"),\n            \"HeaderValue\" to smithyTypes.resolve(\"event_stream::HeaderValue\"),\n            \"Error\" to smithyEventStream.resolve(\"error::Error\"),\n            \"SdkBody\" to RuntimeType.sdkBody(runtimeConfig),\n        )\n\n    open fun render(): RuntimeType {\n        val marshallerType = unionShape.eventStreamMarshallerType()\n        val unionSymbol = symbolProvider.toSymbol(unionShape)\n\n        return RuntimeType.forInlineFun(\"${marshallerType.name}::new\", eventStreamSerdeModule) {\n            renderMarshaller(marshallerType, unionSymbol)\n        }\n    }\n\n    fun renderInitialRequestGenerator(contentType: String): RuntimeType {\n        return RuntimeType.forInlineFun(\"initial_message_from_body\", eventStreamSerdeModule) {\n            rustBlockTemplate(\n                \"\"\"\n                pub(crate) fn initial_message_from_body(\n                    body: #{SdkBody}\n                ) -> #{Message}\n                \"\"\",\n                *codegenScope,\n            ) {\n                rustTemplate(\"let mut headers = #{Vec}::with_capacity(3);\", *codegenScope)\n                addStringHeader(\":message-type\", \"\\\"event\\\".into()\")\n                addStringHeader(\":event-type\", \"\\\"initial-request\\\".into()\")\n                addStringHeader(\":content-type\", \"${contentType.dq()}.into()\")\n                rustTemplate(\n                    \"\"\"\n                    let body = #{Bytes}::from(\n                        body.bytes()\n                            .expect(\"body should've been created from non-streaming payload for initial message\")\n                            .to_vec(),\n                    );\n                    #{Message}::new_from_parts(headers, body)\n                    \"\"\",\n                    *codegenScope,\n                )\n            }\n        }\n    }\n\n    fun renderInitialResponseGenerator(contentType: String): RuntimeType {\n        return RuntimeType.forInlineFun(\"initial_response_from_payload\", eventStreamSerdeModule) {\n            rustBlockTemplate(\n                \"\"\"\n                pub(crate) fn initial_response_from_payload(\n                    payload: #{Bytes}\n                ) -> #{Message}\n                \"\"\",\n                *codegenScope,\n            ) {\n                rustTemplate(\"let mut headers = #{Vec}::with_capacity(3);\", *codegenScope)\n                addStringHeader(\":message-type\", \"\\\"event\\\".into()\")\n                addStringHeader(\":event-type\", \"\\\"initial-response\\\".into()\")\n                addStringHeader(\":content-type\", \"${contentType.dq()}.into()\")\n                rustTemplate(\"#{Message}::new_from_parts(headers, payload)\", *codegenScope)\n            }\n        }\n    }\n\n    private fun RustWriter.renderMarshaller(\n        marshallerType: RuntimeType,\n        unionSymbol: Symbol,\n    ) {\n        rust(\n            \"\"\"\n            ##[non_exhaustive]\n            ##[derive(Debug)]\n            pub struct ${marshallerType.name};\n\n            impl ${marshallerType.name} {\n                pub fn new() -> Self {\n                    ${marshallerType.name}\n                }\n            }\n            \"\"\",\n        )\n\n        rustBlockTemplate(\n            \"impl #{MarshallMessage} for ${marshallerType.name}\",\n            *codegenScope,\n        ) {\n            rust(\"type Input = ${unionSymbol.rustType().render(fullyQualified = true)};\")\n\n            rustBlockTemplate(\n                \"fn marshall(&self, input: Self::Input) -> std::result::Result<#{Message}, #{Error}>\",\n                *codegenScope,\n            ) {\n                rust(\"let mut headers = Vec::new();\")\n                addStringHeader(\":message-type\", \"\\\"event\\\".into()\")\n                rustBlock(\"let payload = match input\") {\n                    for (member in unionShape.members()) {\n                        val eventType = member.memberName // must be the original name, not the Rust-safe name\n                        // Union members targeting the Smithy `Unit` type do not have associated data in the\n                        // Rust enum generated for the type.\n                        val mayHaveInner =\n                            if (!member.isTargetUnit()) {\n                                \"(inner)\"\n                            } else {\n                                \"\"\n                            }\n                        rustBlock(\"Self::Input::${symbolProvider.toMemberName(member)}$mayHaveInner => \") {\n                            addStringHeader(\":event-type\", \"${eventType.dq()}.into()\")\n                            val target = model.expectShape(member.target, StructureShape::class.java)\n                            renderMarshallEvent(member, target)\n                        }\n                    }\n                    if (target.renderUnknownVariant()) {\n                        rustTemplate(\n                            \"\"\"\n                            Self::Input::${UnionGenerator.UNKNOWN_VARIANT_NAME} => return Err(\n                                #{Error}::marshalling(${unknownVariantError(unionSymbol.rustType().name).dq()}.to_owned())\n                            )\n                            \"\"\",\n                            *codegenScope,\n                        )\n                    }\n                }\n                rustTemplate(\"; Ok(#{Message}::new_from_parts(headers, payload))\", *codegenScope)\n            }\n        }\n    }\n\n    private fun RustWriter.renderMarshallEvent(\n        unionMember: MemberShape,\n        eventStruct: StructureShape,\n    ) {\n        val headerMembers = eventStruct.members().filter { it.hasTrait<EventHeaderTrait>() }\n        val payloadMember = eventStruct.members().firstOrNull { it.hasTrait<EventPayloadTrait>() }\n        for (member in headerMembers) {\n            val memberName = symbolProvider.toMemberName(member)\n            val target = model.expectShape(member.target)\n            renderMarshallEventHeader(memberName, member, target)\n        }\n        if (payloadMember != null) {\n            val memberName = symbolProvider.toMemberName(payloadMember)\n            val target = model.expectShape(payloadMember.target)\n            val serializerFn = serializerGenerator.payloadSerializer(payloadMember)\n            renderMarshallEventPayload(\"inner.$memberName\", payloadMember, target, serializerFn)\n        } else if (headerMembers.isEmpty()) {\n            val serializerFn = serializerGenerator.payloadSerializer(unionMember)\n            // Union members targeting the Smithy `Unit` type do not have associated data in the\n            // Rust enum generated for the type. For these, we need to pass the `crate::model::Unit` data type.\n            val inner =\n                if (unionMember.isTargetUnit()) {\n                    \"crate::model::Unit::builder().build()\"\n                } else {\n                    \"inner\"\n                }\n            renderMarshallEventPayload(inner, unionMember, eventStruct, serializerFn)\n        } else {\n            rust(\"Vec::new()\")\n        }\n    }\n\n    protected fun RustWriter.renderMarshallEventHeader(\n        memberName: String,\n        member: MemberShape,\n        target: Shape,\n    ) {\n        val headerName = member.memberName\n        handleOptional(\n            symbolProvider.toSymbol(member).isOptional(),\n            \"inner.$memberName\",\n            \"value\",\n            { input -> renderAddHeader(headerName, input, target) },\n        )\n    }\n\n    private fun RustWriter.renderAddHeader(\n        headerName: String,\n        inputName: String,\n        target: Shape,\n    ) {\n        withBlock(\"headers.push(\", \");\") {\n            rustTemplate(\n                \"#{Header}::new(${headerName.dq()}, #{HeaderValue}::${headerValue(inputName, target)})\",\n                *codegenScope,\n            )\n        }\n    }\n\n    // Event stream header types: https://smithy.io/2.0/spec/streaming.html#eventheader-trait\n    // Note: there are no floating point header types for Event Stream.\n    private fun headerValue(\n        inputName: String,\n        target: Shape,\n    ): String =\n        when (target) {\n            is BooleanShape -> \"Bool($inputName)\"\n            is ByteShape -> \"Byte($inputName)\"\n            is ShortShape -> \"Int16($inputName)\"\n            is IntegerShape -> \"Int32($inputName)\"\n            is LongShape -> \"Int64($inputName)\"\n            is BlobShape -> \"ByteArray($inputName.into_inner().into())\"\n            is EnumShape -> \"String($inputName.to_string().into())\"\n            is StringShape -> \"String($inputName.into())\"\n            is TimestampShape -> \"Timestamp($inputName.into())\"\n            else -> throw IllegalStateException(\"unsupported event stream header shape type: $target\")\n        }\n\n    protected fun RustWriter.renderMarshallEventPayload(\n        inputExpr: String,\n        member: Shape,\n        target: Shape,\n        serializerFn: RuntimeType,\n    ) {\n        val optional = symbolProvider.toSymbol(member).isOptional()\n        if (target is BlobShape || target is StringShape) {\n            data class PayloadContext(val conversionFn: String, val contentType: String)\n\n            val ctx =\n                when (target) {\n                    is BlobShape -> PayloadContext(\"into_inner\", \"application/octet-stream\")\n                    is StringShape -> PayloadContext(\"into_bytes\", \"text/plain\")\n                    else -> throw IllegalStateException(\"unreachable\")\n                }\n            addStringHeader(\":content-type\", \"${ctx.contentType.dq()}.into()\")\n            handleOptional(\n                optional,\n                inputExpr,\n                \"inner_payload\",\n                { input -> rust(\"$input.${ctx.conversionFn}()\") },\n                { rust(\"Vec::new()\") },\n            )\n        } else {\n            addStringHeader(\":content-type\", \"${payloadContentType.dq()}.into()\")\n\n            handleOptional(\n                optional,\n                inputExpr,\n                \"inner_payload\",\n                { input ->\n                    rustTemplate(\n                        \"\"\"\n                        #{serializerFn}(&$input)\n                            .map_err(|err| #{Error}::marshalling(format!(\"{err}\")))?\n                        \"\"\",\n                        \"serializerFn\" to serializerFn,\n                        *codegenScope,\n                    )\n                },\n                { rust(\"unimplemented!(\\\"TODO(EventStream): Figure out what to do when there's no payload\\\")\") },\n            )\n        }\n    }\n\n    private fun RustWriter.handleOptional(\n        optional: Boolean,\n        inputExpr: String,\n        someName: String,\n        writeSomeCase: RustWriter.(String) -> Unit,\n        writeNoneCase: (Writable)? = null,\n    ) {\n        if (optional) {\n            rustBlock(\"if let Some($someName) = $inputExpr\") {\n                writeSomeCase(someName)\n            }\n            if (writeNoneCase != null) {\n                rustBlock(\" else \") {\n                    writeNoneCase()\n                }\n            }\n        } else {\n            writeSomeCase(inputExpr)\n        }\n    }\n\n    protected fun RustWriter.addStringHeader(\n        name: String,\n        valueExpr: String,\n    ) {\n        rustTemplate(\"headers.push(#{Header}::new(${name.dq()}, #{HeaderValue}::String($valueExpr)));\", *codegenScope)\n    }\n\n    private fun UnionShape.eventStreamMarshallerType(): RuntimeType {\n        val symbol = symbolProvider.toSymbol(this)\n        return RuntimeType(\"crate::event_stream_serde::${symbol.name.toPascalCase()}Marshaller\")\n    }\n}\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/JsonSerializerGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy.protocols.serialize\n\nimport software.amazon.smithy.model.shapes.BigDecimalShape\nimport software.amazon.smithy.model.shapes.BigIntegerShape\nimport software.amazon.smithy.model.shapes.BlobShape\nimport software.amazon.smithy.model.shapes.BooleanShape\nimport software.amazon.smithy.model.shapes.ByteShape\nimport software.amazon.smithy.model.shapes.CollectionShape\nimport software.amazon.smithy.model.shapes.DocumentShape\nimport software.amazon.smithy.model.shapes.DoubleShape\nimport software.amazon.smithy.model.shapes.FloatShape\nimport software.amazon.smithy.model.shapes.IntegerShape\nimport software.amazon.smithy.model.shapes.LongShape\nimport software.amazon.smithy.model.shapes.MapShape\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.NumberShape\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.model.shapes.ShortShape\nimport software.amazon.smithy.model.shapes.StringShape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.shapes.TimestampShape\nimport software.amazon.smithy.model.shapes.UnionShape\nimport software.amazon.smithy.model.traits.TimestampFormatTrait.Format.EPOCH_SECONDS\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlockTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.withBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenContext\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\nimport software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.NamedCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.Section\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.UnionGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.renderUnknownVariant\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.serializationError\nimport software.amazon.smithy.rust.codegen.core.smithy.isOptional\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.HttpBindingResolver\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.HttpLocation\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.ProtocolFunctions\nimport software.amazon.smithy.rust.codegen.core.smithy.transformers.OperationNormalizer\nimport software.amazon.smithy.rust.codegen.core.util.dq\nimport software.amazon.smithy.rust.codegen.core.util.inputShape\nimport software.amazon.smithy.rust.codegen.core.util.isTargetUnit\nimport software.amazon.smithy.rust.codegen.core.util.outputShape\n\n/**\n * Class describing a JSON serializer section that can be used in a customization.\n */\nsealed class JsonSerializerSection(name: String) : Section(name) {\n    /** Mutate the server error object prior to finalization. Eg: this can be used to inject `__type` to record the error type. */\n    data class ServerError(val structureShape: StructureShape, val jsonObject: String) :\n        JsonSerializerSection(\"ServerError\")\n\n    /** Manipulate the serializer context for a map prior to it being serialized. **/\n    data class BeforeIteratingOverMapOrCollection(val shape: Shape, val context: JsonSerializerGenerator.Context<Shape>) :\n        JsonSerializerSection(\"BeforeIteratingOverMapOrCollection\")\n\n    /** Manipulate the serializer context for a non-null member prior to it being serialized. **/\n    data class BeforeSerializingNonNullMember(val shape: Shape, val context: JsonSerializerGenerator.MemberContext) :\n        JsonSerializerSection(\"BeforeSerializingNonNullMember\")\n\n    /** Mutate the input object prior to finalization. */\n    data class InputStruct(val structureShape: StructureShape, val jsonObject: String) :\n        JsonSerializerSection(\"InputStruct\")\n\n    /** Mutate the output object prior to finalization. */\n    data class OutputStruct(val structureShape: StructureShape, val jsonObject: String) :\n        JsonSerializerSection(\"OutputStruct\")\n\n    /** Allow customizers to perform pre-serialization operations before handling union variants. */\n    data class BeforeSerializeUnion(val shape: UnionShape, val jsonObject: String) :\n        JsonSerializerSection(\"BeforeSerializeUnion\")\n}\n\n/**\n * Customization for the JSON serializer.\n */\ntypealias JsonSerializerCustomization = NamedCustomization<JsonSerializerSection>\n\nclass JsonSerializerGenerator(\n    codegenContext: CodegenContext,\n    private val httpBindingResolver: HttpBindingResolver,\n    /** Function that maps a MemberShape into a JSON field name */\n    private val jsonName: (MemberShape) -> String,\n    private val customizations: List<JsonSerializerCustomization> = listOf(),\n) : StructuredDataSerializerGenerator {\n    data class Context<out T : Shape>(\n        /** Expression that retrieves a JsonValueWriter from either a JsonObjectWriter or JsonArrayWriter */\n        val writerExpression: String,\n        /** Expression representing the value to write to the JsonValueWriter */\n        var valueExpression: ValueExpression,\n        /** Path in the JSON to get here, used for errors */\n        val shape: T,\n    )\n\n    data class MemberContext(\n        /** Expression that retrieves a JsonValueWriter from either a JsonObjectWriter or JsonArrayWriter */\n        val writerExpression: String,\n        /** Expression representing the value to write to the JsonValueWriter */\n        var valueExpression: ValueExpression,\n        val shape: MemberShape,\n        /** Whether to serialize null values if the type is optional */\n        val writeNulls: Boolean = false,\n    ) {\n        companion object {\n            fun collectionMember(\n                context: Context<CollectionShape>,\n                itemName: String,\n            ): MemberContext =\n                MemberContext(\n                    \"${context.writerExpression}.value()\",\n                    ValueExpression.Reference(itemName),\n                    context.shape.member,\n                    writeNulls = true,\n                )\n\n            fun mapMember(\n                context: Context<MapShape>,\n                key: String,\n                value: String,\n            ): MemberContext =\n                MemberContext(\n                    \"${context.writerExpression}.key($key)\",\n                    ValueExpression.Reference(value),\n                    context.shape.value,\n                    writeNulls = true,\n                )\n\n            fun structMember(\n                context: StructContext,\n                member: MemberShape,\n                symProvider: RustSymbolProvider,\n                jsonName: (MemberShape) -> String,\n            ): MemberContext =\n                MemberContext(\n                    objectValueWriterExpression(context.objectName, jsonName(member)),\n                    ValueExpression.Value(\"${context.localName}.${symProvider.toMemberName(member)}\"),\n                    member,\n                )\n\n            fun unionMember(\n                context: Context<UnionShape>,\n                variantReference: String,\n                member: MemberShape,\n                jsonName: (MemberShape) -> String,\n            ): MemberContext =\n                MemberContext(\n                    objectValueWriterExpression(context.writerExpression, jsonName(member)),\n                    ValueExpression.Reference(variantReference),\n                    member,\n                )\n\n            /** Returns an expression to get a JsonValueWriter from a JsonObjectWriter */\n            private fun objectValueWriterExpression(\n                objectWriterName: String,\n                jsonName: String,\n            ): String = \"$objectWriterName.key(${jsonName.dq()})\"\n        }\n    }\n\n    // Specialized since it holds a JsonObjectWriter expression rather than a JsonValueWriter\n    data class StructContext(\n        /** Name of the JsonObjectWriter */\n        val objectName: String,\n        /** Name of the variable that holds the struct */\n        val localName: String,\n        val shape: StructureShape,\n    )\n\n    private val model = codegenContext.model\n    private val symbolProvider = codegenContext.symbolProvider\n    private val codegenTarget = codegenContext.target\n    private val runtimeConfig = codegenContext.runtimeConfig\n    private val protocolFunctions = ProtocolFunctions(codegenContext)\n    private val codegenScope =\n        arrayOf(\n            *preludeScope,\n            \"Error\" to runtimeConfig.serializationError(),\n            \"SdkBody\" to RuntimeType.sdkBody(runtimeConfig),\n            \"JsonObjectWriter\" to RuntimeType.smithyJson(runtimeConfig).resolve(\"serialize::JsonObjectWriter\"),\n            \"JsonValueWriter\" to RuntimeType.smithyJson(runtimeConfig).resolve(\"serialize::JsonValueWriter\"),\n            \"ByteSlab\" to RuntimeType.ByteSlab,\n        )\n    private val serializerUtil = SerializerUtil(model, symbolProvider)\n\n    /**\n     * Reusable structure serializer implementation that can be used to generate serializing code for\n     * operation outputs or errors.\n     * This function is only used by the server, the client uses directly [serializeStructure].\n     */\n    private fun serverSerializer(\n        structureShape: StructureShape,\n        includedMembers: List<MemberShape>,\n        makeSection: (StructureShape, String) -> JsonSerializerSection,\n        error: Boolean,\n    ): RuntimeType {\n        val suffix =\n            when (error) {\n                true -> \"error\"\n                else -> \"output\"\n            }\n        return protocolFunctions.serializeFn(structureShape, fnNameSuffix = suffix) { fnName ->\n            rustBlockTemplate(\n                \"pub fn $fnName(value: &#{target}) -> #{Result}<String, #{Error}>\",\n                *codegenScope,\n                \"target\" to symbolProvider.toSymbol(structureShape),\n            ) {\n                rustTemplate(\n                    \"\"\"\n                    let mut out = #{String}::new();\n                    let mut object = #{JsonObjectWriter}::new(&mut out);\n                    \"\"\",\n                    *codegenScope,\n                )\n                serializeStructure(StructContext(\"object\", \"value\", structureShape), includedMembers)\n                customizations.forEach { it.section(makeSection(structureShape, \"object\"))(this) }\n                rust(\n                    \"\"\"\n                    object.finish();\n                    Ok(out)\n                    \"\"\",\n                )\n            }\n        }\n    }\n\n    override fun payloadSerializer(member: MemberShape): RuntimeType {\n        val target = model.expectShape(member.target)\n        return protocolFunctions.serializeFn(member, fnNameSuffix = \"payload\") { fnName ->\n            rustBlockTemplate(\n                \"pub fn $fnName(input: &#{target}) -> std::result::Result<#{ByteSlab}, #{Error}>\",\n                *codegenScope,\n                \"target\" to symbolProvider.toSymbol(target),\n            ) {\n                rust(\"let mut out = String::new();\")\n                rustTemplate(\"let mut object = #{JsonObjectWriter}::new(&mut out);\", *codegenScope)\n                when (target) {\n                    is StructureShape -> serializeStructure(StructContext(\"object\", \"input\", target))\n                    is UnionShape -> serializeUnion(Context(\"object\", ValueExpression.Reference(\"input\"), target))\n                    else -> throw IllegalStateException(\"json payloadSerializer only supports structs and unions\")\n                }\n                rust(\"object.finish();\")\n                rustTemplate(\"Ok(out.into_bytes())\", *codegenScope)\n            }\n        }\n    }\n\n    override fun unsetStructure(structure: StructureShape): RuntimeType =\n        ProtocolFunctions.crossOperationFn(\"rest_json_unset_struct_payload\") { fnName ->\n            rustTemplate(\n                \"\"\"\n                pub fn $fnName() -> #{ByteSlab} {\n                    b\"{}\"[..].into()\n                }\n                \"\"\",\n                *codegenScope,\n            )\n        }\n\n    override fun unsetUnion(union: UnionShape): RuntimeType =\n        ProtocolFunctions.crossOperationFn(\"rest_json_unset_union_payload\") { fnName ->\n            rustTemplate(\n                \"pub fn $fnName() -> #{ByteSlab} { #{Vec}::new() }\",\n                *codegenScope,\n            )\n        }\n\n    override fun operationInputSerializer(operationShape: OperationShape): RuntimeType? {\n        // Don't generate an operation JSON serializer if there is no JSON body.\n        val httpDocumentMembers = httpBindingResolver.requestMembers(operationShape, HttpLocation.DOCUMENT)\n        if (httpDocumentMembers.isEmpty()) {\n            return null\n        }\n\n        val inputShape = operationShape.inputShape(model)\n        return protocolFunctions.serializeFn(operationShape, fnNameSuffix = \"input\") { fnName ->\n            rustBlockTemplate(\n                \"pub fn $fnName(input: &#{target}) -> #{Result}<#{SdkBody}, #{Error}>\",\n                *codegenScope, \"target\" to symbolProvider.toSymbol(inputShape),\n            ) {\n                rust(\"let mut out = String::new();\")\n                rustTemplate(\"let mut object = #{JsonObjectWriter}::new(&mut out);\", *codegenScope)\n                serializeStructure(StructContext(\"object\", \"input\", inputShape), httpDocumentMembers)\n                customizations.forEach { it.section(JsonSerializerSection.InputStruct(inputShape, \"object\"))(this) }\n                rust(\"object.finish();\")\n                rustTemplate(\"Ok(#{SdkBody}::from(out))\", *codegenScope)\n            }\n        }\n    }\n\n    override fun documentSerializer(): RuntimeType {\n        return ProtocolFunctions.crossOperationFn(\"serialize_document\") { fnName ->\n            rustTemplate(\n                \"\"\"\n                pub fn $fnName(input: &#{Document}) -> #{ByteSlab} {\n                    let mut out = String::new();\n                    #{JsonValueWriter}::new(&mut out).document(input);\n                    out.into_bytes()\n                }\n                \"\"\",\n                \"Document\" to RuntimeType.document(runtimeConfig), *codegenScope,\n            )\n        }\n    }\n\n    override fun operationOutputSerializer(operationShape: OperationShape): RuntimeType? {\n        // Don't generate an operation JSON serializer if there was no operation output shape in the\n        // original (untransformed) model.\n        if (!OperationNormalizer.hadUserModeledOperationOutput(operationShape, model)) {\n            return null\n        }\n\n        // Note that, unlike the client, we serialize an empty JSON document `\"{}\"` if the operation output shape is\n        // empty (has no members).\n        // The client instead serializes an empty payload `\"\"` in _both_ these scenarios:\n        //     1. there is no operation input shape; and\n        //     2. the operation input shape is empty (has no members).\n        // The first case gets reduced to the second, because all operations get a synthetic input shape with\n        // the [OperationNormalizer] transformation.\n        val httpDocumentMembers = httpBindingResolver.responseMembers(operationShape, HttpLocation.DOCUMENT)\n\n        val outputShape = operationShape.outputShape(model)\n        return serverSerializer(outputShape, httpDocumentMembers, JsonSerializerSection::OutputStruct, error = false)\n    }\n\n    override fun serverErrorSerializer(shape: ShapeId): RuntimeType {\n        val errorShape = model.expectShape(shape, StructureShape::class.java)\n        val includedMembers =\n            httpBindingResolver.errorResponseBindings(shape).filter { it.location == HttpLocation.DOCUMENT }\n                .map { it.member }\n        return serverSerializer(errorShape, includedMembers, JsonSerializerSection::ServerError, error = true)\n    }\n\n    private fun RustWriter.serializeStructure(\n        context: StructContext,\n        includedMembers: List<MemberShape>? = null,\n    ) {\n        val structureSerializer =\n            protocolFunctions.serializeFn(context.shape) { fnName ->\n                val inner = context.copy(objectName = \"object\", localName = \"input\")\n                val members = includedMembers ?: inner.shape.members()\n                val allowUnusedVariables =\n                    writable {\n                        if (members.isEmpty()) {\n                            Attribute.AllowUnusedVariables.render(this)\n                        }\n                    }\n                rustBlockTemplate(\n                    \"\"\"\n                    pub fn $fnName(\n                        #{AllowUnusedVariables:W} object: &mut #{JsonObjectWriter},\n                        #{AllowUnusedVariables:W} input: &#{StructureSymbol},\n                    ) -> #{Result}<(), #{Error}>\n                    \"\"\",\n                    \"StructureSymbol\" to symbolProvider.toSymbol(context.shape),\n                    \"AllowUnusedVariables\" to allowUnusedVariables,\n                    *codegenScope,\n                ) {\n                    for (member in members) {\n                        serializeMember(MemberContext.structMember(inner, member, symbolProvider, jsonName))\n                    }\n                    rust(\"Ok(())\")\n                }\n            }\n        rust(\"#T(&mut ${context.objectName}, ${context.localName})?;\", structureSerializer)\n    }\n\n    private fun RustWriter.serializeMember(context: MemberContext) {\n        val targetShape = model.expectShape(context.shape.target)\n        if (symbolProvider.toSymbol(context.shape).isOptional()) {\n            safeName().also { local ->\n                rustBlock(\"if let Some($local) = ${context.valueExpression.asRef()}\") {\n                    context.valueExpression = ValueExpression.Reference(local)\n                    for (customization in customizations) {\n                        customization.section(\n                            JsonSerializerSection.BeforeSerializingNonNullMember(\n                                targetShape,\n                                context,\n                            ),\n                        )(this)\n                    }\n                    serializeMemberValue(context, targetShape)\n                }\n                if (context.writeNulls) {\n                    rustBlock(\"else\") {\n                        rust(\"${context.writerExpression}.null();\")\n                    }\n                }\n            }\n        } else {\n            for (customization in customizations) {\n                customization.section(JsonSerializerSection.BeforeSerializingNonNullMember(targetShape, context))(\n                    this,\n                )\n            }\n\n            with(serializerUtil) {\n                ignoreDefaultsForNumbersAndBools(context.shape, context.valueExpression) {\n                    serializeMemberValue(context, targetShape)\n                }\n            }\n        }\n    }\n\n    private fun RustWriter.serializeMemberValue(\n        context: MemberContext,\n        target: Shape,\n    ) {\n        val writer = context.writerExpression\n        val value = context.valueExpression\n\n        when (target) {\n            is StringShape -> rust(\"$writer.string(${value.name}.as_str());\")\n            is BooleanShape -> rust(\"$writer.boolean(${value.asValue()});\")\n            is BigIntegerShape ->\n                rustTemplate(\n                    \"$writer.write_raw_value(${value.name}.as_ref());\",\n                    *codegenScope,\n                )\n            is BigDecimalShape ->\n                rustTemplate(\n                    \"$writer.write_raw_value(${value.name}.as_ref());\",\n                    *codegenScope,\n                )\n            is NumberShape -> {\n                val numberType =\n                    when (target) {\n                        is IntegerShape, is ByteShape, is LongShape, is ShortShape -> \"NegInt\"\n                        is DoubleShape, is FloatShape -> \"Float\"\n                        else -> throw IllegalStateException(\"unreachable\")\n                    }\n                rust(\n                    \"$writer.number(##[allow(clippy::useless_conversion)]#T::$numberType((${value.asValue()}).into()));\",\n                    RuntimeType.smithyTypes(runtimeConfig).resolve(\"Number\"),\n                )\n            }\n\n            is BlobShape ->\n                rust(\n                    \"$writer.string_unchecked(&#T(${value.asRef()}));\",\n                    RuntimeType.base64Encode(runtimeConfig),\n                )\n\n            is TimestampShape -> {\n                val timestampFormat =\n                    httpBindingResolver.timestampFormat(context.shape, HttpLocation.DOCUMENT, EPOCH_SECONDS, model)\n                val timestampFormatType = RuntimeType.serializeTimestampFormat(runtimeConfig, timestampFormat)\n                rustTemplate(\n                    \"$writer.date_time(${value.asRef()}, #{FormatType})?;\",\n                    \"FormatType\" to timestampFormatType,\n                )\n            }\n\n            is CollectionShape ->\n                jsonArrayWriter(context) { arrayName ->\n                    serializeCollection(Context(arrayName, value, target))\n                }\n\n            is MapShape ->\n                jsonObjectWriter(context) { objectName ->\n                    serializeMap(Context(objectName, value, target))\n                }\n\n            is StructureShape ->\n                jsonObjectWriter(context) { objectName ->\n                    serializeStructure(StructContext(objectName, value.asRef(), target))\n                }\n\n            is UnionShape ->\n                jsonObjectWriter(context) { objectName ->\n                    serializeUnion(Context(objectName, value, target))\n                }\n\n            is DocumentShape -> rust(\"$writer.document(${value.asRef()});\")\n            else -> TODO(target.toString())\n        }\n    }\n\n    private fun RustWriter.jsonArrayWriter(\n        context: MemberContext,\n        inner: RustWriter.(String) -> Unit,\n    ) {\n        safeName(\"array\").also { arrayName ->\n            rust(\"let mut $arrayName = ${context.writerExpression}.start_array();\")\n            inner(arrayName)\n            rust(\"$arrayName.finish();\")\n        }\n    }\n\n    private fun RustWriter.jsonObjectWriter(\n        context: MemberContext,\n        inner: RustWriter.(String) -> Unit,\n    ) {\n        safeName(\"object\").also { objectName ->\n            rust(\"##[allow(unused_mut)]\")\n            rust(\"let mut $objectName = ${context.writerExpression}.start_object();\")\n            // We call inner only when context's shape is not the Unit type.\n            // If it were, calling inner would generate the following function:\n            //\n            // ```rust\n            // pub fn serialize_structure_crate_model_unit(\n            //     object: &mut aws_smithy_json::serialize::JsonObjectWriter,\n            //     input: &crate::model::Unit,\n            // ) -> Result<(), aws_smithy_http::operation::error::SerializationError> {\n            //     let (_, _) = (object, input);\n            //     Ok(())\n            // }\n            // ```\n            //\n            // However, this would cause a compilation error at a call site because it cannot\n            // extract data out of the Unit type that corresponds to the variable \"input\" above.\n            if (!context.shape.isTargetUnit()) {\n                inner(objectName)\n            }\n            rust(\"$objectName.finish();\")\n        }\n    }\n\n    private fun RustWriter.serializeCollection(context: Context<CollectionShape>) {\n        val itemName = safeName(\"item\")\n        for (customization in customizations) {\n            customization.section(JsonSerializerSection.BeforeIteratingOverMapOrCollection(context.shape, context))(this)\n        }\n        rustBlock(\"for $itemName in ${context.valueExpression.asRef()}\") {\n            serializeMember(MemberContext.collectionMember(context, itemName))\n        }\n    }\n\n    private fun RustWriter.serializeMap(context: Context<MapShape>) {\n        val keyName = safeName(\"key\")\n        val valueName = safeName(\"value\")\n        for (customization in customizations) {\n            customization.section(JsonSerializerSection.BeforeIteratingOverMapOrCollection(context.shape, context))(\n                this,\n            )\n        }\n        rustBlock(\"for ($keyName, $valueName) in ${context.valueExpression.asRef()}\") {\n            val keyExpression = \"$keyName.as_str()\"\n            serializeMember(MemberContext.mapMember(context, keyExpression, valueName))\n        }\n    }\n\n    private fun RustWriter.serializeUnion(context: Context<UnionShape>) {\n        val unionSymbol = symbolProvider.toSymbol(context.shape)\n        val unionSerializer =\n            protocolFunctions.serializeFn(context.shape) { fnName ->\n                rustBlockTemplate(\n                    \"pub fn $fnName(${context.writerExpression}: &mut #{JsonObjectWriter}, input: &#{Input}) -> #{Result}<(), #{Error}>\",\n                    \"Input\" to unionSymbol,\n                    *codegenScope,\n                ) {\n                    // Allow customizers to perform pre-serialization operations before handling union variants.\n                    customizations.forEach {\n                        it.section(JsonSerializerSection.BeforeSerializeUnion(context.shape, context.writerExpression))(this)\n                    }\n                    rustBlock(\"match input\") {\n                        for (member in context.shape.members()) {\n                            val variantName =\n                                if (member.isTargetUnit()) {\n                                    \"${symbolProvider.toMemberName(member)}\"\n                                } else {\n                                    \"${symbolProvider.toMemberName(member)}(inner)\"\n                                }\n                            withBlock(\"#T::$variantName => {\", \"},\", unionSymbol) {\n                                serializeMember(MemberContext.unionMember(context, \"inner\", member, jsonName))\n                            }\n                        }\n                        if (codegenTarget.renderUnknownVariant()) {\n                            rustTemplate(\n                                \"#{Union}::${UnionGenerator.UNKNOWN_VARIANT_NAME} => return Err(#{Error}::unknown_variant(${unionSymbol.name.dq()}))\",\n                                \"Union\" to unionSymbol,\n                                *codegenScope,\n                            )\n                        }\n                    }\n                    rust(\"Ok(())\")\n                }\n            }\n        rust(\"#T(&mut ${context.writerExpression}, ${context.valueExpression.asRef()})?;\", unionSerializer)\n    }\n}\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/QuerySerializerGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy.protocols.serialize\n\nimport software.amazon.smithy.model.shapes.BigDecimalShape\nimport software.amazon.smithy.model.shapes.BigIntegerShape\nimport software.amazon.smithy.model.shapes.BlobShape\nimport software.amazon.smithy.model.shapes.BooleanShape\nimport software.amazon.smithy.model.shapes.CollectionShape\nimport software.amazon.smithy.model.shapes.MapShape\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.NumberShape\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.shapes.StringShape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.shapes.TimestampShape\nimport software.amazon.smithy.model.shapes.UnionShape\nimport software.amazon.smithy.model.traits.EnumTrait\nimport software.amazon.smithy.model.traits.TimestampFormatTrait\nimport software.amazon.smithy.model.traits.XmlNameTrait\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustType\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlockTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.withBlock\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenContext\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.UnionGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.renderUnknownVariant\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.serializationError\nimport software.amazon.smithy.rust.codegen.core.smithy.isOptional\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.ProtocolFunctions\nimport software.amazon.smithy.rust.codegen.core.smithy.rustType\nimport software.amazon.smithy.rust.codegen.core.util.dq\nimport software.amazon.smithy.rust.codegen.core.util.getTrait\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\nimport software.amazon.smithy.rust.codegen.core.util.inputShape\nimport software.amazon.smithy.rust.codegen.core.util.isTargetUnit\nimport software.amazon.smithy.rust.codegen.core.util.orNull\n\nabstract class QuerySerializerGenerator(private val codegenContext: CodegenContext) : StructuredDataSerializerGenerator {\n    protected data class Context<T : Shape>(\n        /** Expression that yields a QueryValueWriter */\n        val writerExpression: String,\n        /** Expression representing the value to write to the QueryValueWriter */\n        val valueExpression: ValueExpression,\n        val shape: T,\n        val isOptional: Boolean = false,\n    )\n\n    protected data class MemberContext(\n        /** Expression that yields a QueryValueWriter */\n        val writerExpression: String,\n        /** Expression representing the value to write to the QueryValueWriter */\n        val valueExpression: ValueExpression,\n        val shape: MemberShape,\n    ) {\n        companion object {\n            fun structMember(\n                context: Context<StructureShape>,\n                member: MemberShape,\n                symProvider: RustSymbolProvider,\n            ): MemberContext =\n                MemberContext(\n                    context.writerExpression,\n                    ValueExpression.Value(\"${context.valueExpression.name}.${symProvider.toMemberName(member)}\"),\n                    member,\n                )\n\n            fun unionMember(\n                context: Context<UnionShape>,\n                variantReference: String,\n                member: MemberShape,\n            ): MemberContext =\n                MemberContext(\n                    context.writerExpression,\n                    ValueExpression.Reference(variantReference),\n                    member,\n                )\n        }\n    }\n\n    protected val model = codegenContext.model\n    protected val symbolProvider = codegenContext.symbolProvider\n    protected val runtimeConfig = codegenContext.runtimeConfig\n    private val target = codegenContext.target\n    private val serviceShape = codegenContext.serviceShape\n    private val serializerError = runtimeConfig.serializationError()\n    private val smithyTypes = RuntimeType.smithyTypes(runtimeConfig)\n    private val smithyQuery = RuntimeType.smithyQuery(runtimeConfig)\n    private val serdeUtil = SerializerUtil(model, symbolProvider)\n    private val protocolFunctions = ProtocolFunctions(codegenContext)\n    private val codegenScope =\n        arrayOf(\n            \"String\" to RuntimeType.String,\n            \"Error\" to serializerError,\n            \"SdkBody\" to RuntimeType.sdkBody(runtimeConfig),\n            \"QueryWriter\" to smithyQuery.resolve(\"QueryWriter\"),\n            \"QueryValueWriter\" to smithyQuery.resolve(\"QueryValueWriter\"),\n            *RuntimeType.preludeScope,\n        )\n\n    abstract val protocolName: String\n\n    abstract fun MemberShape.queryKeyName(prioritizedFallback: String? = null): String\n\n    abstract fun MemberShape.isFlattened(): Boolean\n\n    override fun documentSerializer(): RuntimeType {\n        TODO(\"$protocolName doesn't support document types\")\n    }\n\n    override fun payloadSerializer(member: MemberShape): RuntimeType {\n        TODO(\"$protocolName doesn't support payload serialization yet\")\n    }\n\n    override fun unsetStructure(structure: StructureShape): RuntimeType {\n        TODO(\"$protocolName doesn't support payload serialization\")\n    }\n\n    override fun unsetUnion(union: UnionShape): RuntimeType {\n        TODO(\"$protocolName doesn't support payload serialization\")\n    }\n\n    override fun operationInputSerializer(operationShape: OperationShape): RuntimeType? {\n        val inputShape = operationShape.inputShape(model)\n        return protocolFunctions.serializeFn(inputShape, fnNameSuffix = \"input\") { fnName ->\n            rustBlockTemplate(\n                \"pub fn $fnName(input: &#{target}) -> #{Result}<#{SdkBody}, #{Error}>\",\n                *codegenScope, \"target\" to symbolProvider.toSymbol(inputShape),\n            ) {\n                val action = operationShape.id.name\n                val version = serviceShape.version\n\n                if (inputShape.members().isEmpty()) {\n                    rust(\"let _ = input;\")\n                }\n                rust(\"let mut out = String::new();\")\n                Attribute.AllowUnusedMut.render(this)\n                rustTemplate(\n                    \"let mut writer = #{QueryWriter}::new(&mut out, ${action.dq()}, ${version.dq()});\",\n                    *codegenScope,\n                )\n                serializeStructureInner(Context(\"writer\", ValueExpression.Reference(\"input\"), inputShape))\n                rust(\"writer.finish();\")\n                rustTemplate(\"Ok(#{SdkBody}::from(out))\", *codegenScope)\n            }\n        }\n    }\n\n    private fun RustWriter.serializeStructure(context: Context<StructureShape>) {\n        // We proceed with the rest of the method only when context.shape.members() is nonempty.\n        // If it were empty, the method would generate the following code:\n        //   #[allow(unused_mut)]\n        //   pub fn serialize_structure_crate_model_unit(\n        //       mut writer: aws_smithy_query::QueryValueWriter,\n        //       input: &crate::model::Unit,\n        //   ) -> Result<(), aws_smithy_http::operation::error::SerializationError> {\n        //       let (_, _) = (writer, input);\n        //       Ok(())\n        //   }\n        // However, this would cause a compilation error at a call site because it cannot\n        // extract data out of the Unit type that corresponds to the variable \"input\" above.\n        if (context.shape.members().isEmpty()) {\n            return\n        }\n        val structureSymbol = symbolProvider.toSymbol(context.shape)\n        val structureSerializer =\n            protocolFunctions.serializeFn(context.shape) { fnName ->\n                Attribute.AllowUnusedMut.render(this)\n                rustBlockTemplate(\n                    \"pub fn $fnName(mut writer: #{QueryValueWriter}, input: &#{Input}) -> #{Result}<(), #{Error}>\",\n                    \"Input\" to structureSymbol,\n                    *codegenScope,\n                ) {\n                    serializeStructureInner(context)\n                    rust(\"Ok(())\")\n                }\n            }\n\n        rust(\"#T(${context.writerExpression}, ${context.valueExpression.asRef()})?;\", structureSerializer)\n    }\n\n    private fun RustWriter.serializeStructureInner(context: Context<StructureShape>) {\n        context.copy(writerExpression = \"writer\", valueExpression = ValueExpression.Reference(\"input\"))\n            .also { inner ->\n                for (member in inner.shape.members()) {\n                    val memberContext = MemberContext.structMember(inner, member, symbolProvider)\n                    structWriter(memberContext) { writerExpression ->\n                        serializeMember(memberContext.copy(writerExpression = writerExpression))\n                    }\n                }\n            }\n    }\n\n    private fun RustWriter.serializeMember(context: MemberContext) {\n        val targetShape = model.expectShape(context.shape.target)\n        if (symbolProvider.toSymbol(context.shape).isOptional()) {\n            safeName().also { local ->\n                rustBlock(\"if let Some($local) = ${context.valueExpression.asRef()}\") {\n                    val innerContext = context.copy(valueExpression = ValueExpression.Reference(local))\n                    serializeMemberValue(innerContext, targetShape)\n                }\n            }\n        } else {\n            with(serdeUtil) {\n                ignoreDefaultsForNumbersAndBools(context.shape, context.valueExpression) {\n                    serializeMemberValue(context, targetShape)\n                }\n            }\n        }\n    }\n\n    private fun RustWriter.serializeMemberValue(\n        context: MemberContext,\n        target: Shape,\n    ) {\n        val writer = context.writerExpression\n        val value = context.valueExpression\n        when (target) {\n            is StringShape -> {\n                when (target.hasTrait<EnumTrait>()) {\n                    true -> rust(\"$writer.string(${value.name}.as_str());\")\n                    false -> rust(\"$writer.string(${value.asRef()});\")\n                }\n            }\n            is BooleanShape -> rust(\"$writer.boolean(${value.asValue()});\")\n            is BigIntegerShape, is BigDecimalShape -> rust(\"$writer.string(${value.asRef()}.as_ref());\")\n            is NumberShape -> {\n                val numberType =\n                    when (symbolProvider.toSymbol(target).rustType()) {\n                        is RustType.Float -> \"Float\"\n                        // NegInt takes an i64 while PosInt takes u64. We need this to be signed here\n                        is RustType.Integer -> \"NegInt\"\n                        else -> throw IllegalStateException(\"unreachable\")\n                    }\n                rust(\n                    \"$writer.number(##[allow(clippy::useless_conversion)]#T::$numberType((${value.asValue()}).into()));\",\n                    smithyTypes.resolve(\"Number\"),\n                )\n            }\n            is BlobShape ->\n                rust(\n                    \"$writer.string(&#T(${value.asRef()}));\",\n                    RuntimeType.base64Encode(runtimeConfig),\n                )\n            is TimestampShape -> {\n                val timestampFormat = determineTimestampFormat(context.shape)\n                val timestampFormatType = RuntimeType.serializeTimestampFormat(runtimeConfig, timestampFormat)\n                rust(\"$writer.date_time(${value.asRef()}, #T)?;\", timestampFormatType)\n            }\n            is CollectionShape -> serializeCollection(context, Context(writer, context.valueExpression, target))\n            is MapShape -> serializeMap(context, Context(writer, context.valueExpression, target))\n            is StructureShape -> serializeStructure(Context(writer, context.valueExpression, target))\n            is UnionShape ->\n                structWriter(context) { writerExpression ->\n                    serializeUnion(Context(writerExpression, context.valueExpression, target))\n                }\n            else -> TODO(target.toString())\n        }\n    }\n\n    private fun determineTimestampFormat(shape: MemberShape): TimestampFormatTrait.Format =\n        shape.getMemberTrait(model, TimestampFormatTrait::class.java).orNull()?.format\n            ?: TimestampFormatTrait.Format.DATE_TIME\n\n    private fun RustWriter.structWriter(\n        context: MemberContext,\n        inner: RustWriter.(String) -> Unit,\n    ) {\n        val prefix = context.shape.queryKeyName()\n        safeName(\"scope\").also { scopeName ->\n            Attribute.AllowUnusedMut.render(this)\n            rust(\"let mut $scopeName = ${context.writerExpression}.prefix(${prefix.dq()});\")\n            inner(scopeName)\n        }\n    }\n\n    protected open fun RustWriter.serializeCollection(\n        memberContext: MemberContext,\n        context: Context<CollectionShape>,\n    ) {\n        serializeCollectionInner(memberContext, context, this)\n    }\n\n    protected fun serializeCollectionInner(\n        memberContext: MemberContext,\n        context: Context<CollectionShape>,\n        writer: RustWriter,\n    ) {\n        writer.apply {\n            val flat = memberContext.shape.isFlattened()\n            val memberOverride =\n                when (val override = context.shape.member.getTrait<XmlNameTrait>()?.value) {\n                    null -> \"None\"\n                    else -> \"Some(${override.dq()})\"\n                }\n            val itemName = safeName(\"item\")\n            safeName(\"list\").also { listName ->\n                rust(\"let mut $listName = ${context.writerExpression}.start_list($flat, $memberOverride);\")\n                rustBlock(\"for $itemName in ${context.valueExpression.asRef()}\") {\n                    val entryName = safeName(\"entry\")\n                    Attribute.AllowUnusedMut.render(this)\n                    rust(\"let mut $entryName = $listName.entry();\")\n                    val targetShape = model.expectShape(context.shape.member.target)\n                    serializeMemberValue(\n                        MemberContext(entryName, ValueExpression.Reference(itemName), context.shape.member),\n                        targetShape,\n                    )\n                }\n                rust(\"$listName.finish();\")\n            }\n        }\n    }\n\n    private fun RustWriter.serializeMap(\n        memberContext: MemberContext,\n        context: Context<MapShape>,\n    ) {\n        val flat = memberContext.shape.isFlattened()\n        val entryKeyName = context.shape.key.queryKeyName(\"key\").dq()\n        val entryValueName = context.shape.value.queryKeyName(\"value\").dq()\n        safeName(\"map\").also { mapName ->\n            val keyName = safeName(\"key\")\n            val valueName = safeName(\"value\")\n            rust(\"let mut $mapName = ${context.writerExpression}.start_map($flat, $entryKeyName, $entryValueName);\")\n            rustBlock(\"for ($keyName, $valueName) in ${context.valueExpression.asRef()}\") {\n                val keyTarget = model.expectShape(context.shape.key.target)\n                val keyExpression =\n                    when (keyTarget.hasTrait<EnumTrait>()) {\n                        true -> \"$keyName.as_str()\"\n                        else -> keyName\n                    }\n                val entryName = safeName(\"entry\")\n                Attribute.AllowUnusedMut.render(this)\n                rust(\"let mut $entryName = $mapName.entry($keyExpression);\")\n                serializeMember(MemberContext(entryName, ValueExpression.Reference(valueName), context.shape.value))\n            }\n            rust(\"$mapName.finish();\")\n        }\n    }\n\n    /**\n     * Determines if a struct shape is empty (has no members).\n     * Empty structs result in unused variables in union match arms since the inner value is never referenced.\n     */\n    private fun isEmptyStruct(shape: Shape): Boolean =\n        when (shape) {\n            is StructureShape -> shape.members().isEmpty()\n            else -> false\n        }\n\n    private fun RustWriter.serializeUnion(context: Context<UnionShape>) {\n        val unionSymbol = symbolProvider.toSymbol(context.shape)\n\n        // Check if any union member uses the writer (non-empty structs)\n        val hasNonEmptyMember =\n            context.shape.members().any { member ->\n                !member.isTargetUnit() && !isEmptyStruct(model.expectShape(member.target))\n            }\n        val writerVarName = if (hasNonEmptyMember) \"writer\" else \"_writer\"\n\n        val unionSerializer =\n            protocolFunctions.serializeFn(context.shape) { fnName ->\n                Attribute.AllowUnusedMut.render(this)\n                rustBlockTemplate(\n                    \"pub fn $fnName(mut $writerVarName: #{QueryValueWriter}, input: &#{Input}) -> #{Result}<(), #{Error}>\",\n                    \"Input\" to unionSymbol,\n                    *codegenScope,\n                ) {\n                    rustBlock(\"match input\") {\n                        for (member in context.shape.members()) {\n                            val targetShape = model.expectShape(member.target)\n                            // Use underscore prefix for empty structs to avoid unused variable warnings\n                            val innerVarName = if (isEmptyStruct(targetShape)) \"_inner\" else \"inner\"\n\n                            val variantName =\n                                if (member.isTargetUnit()) {\n                                    \"${symbolProvider.toMemberName(member)}\"\n                                } else {\n                                    \"${symbolProvider.toMemberName(member)}($innerVarName)\"\n                                }\n                            withBlock(\"#T::$variantName => {\", \"},\", unionSymbol) {\n                                serializeMember(\n                                    MemberContext.unionMember(\n                                        context.copy(writerExpression = writerVarName),\n                                        innerVarName,\n                                        member,\n                                    ),\n                                )\n                            }\n                        }\n                        if (target.renderUnknownVariant()) {\n                            rustTemplate(\n                                \"#{Union}::${UnionGenerator.UNKNOWN_VARIANT_NAME} => return Err(#{Error}::unknown_variant(${unionSymbol.name.dq()}))\",\n                                \"Union\" to unionSymbol,\n                                *codegenScope,\n                            )\n                        }\n                    }\n                    rust(\"Ok(())\")\n                }\n            }\n        rust(\"#T(${context.writerExpression}, ${context.valueExpression.asRef()})?;\", unionSerializer)\n    }\n}\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/SerializerUtil.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy.protocols.serialize\n\nimport software.amazon.smithy.codegen.core.SymbolProvider\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.traits.AddedDefaultTrait\nimport software.amazon.smithy.model.traits.ClientOptionalTrait\nimport software.amazon.smithy.model.traits.InputTrait\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlock\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\n\nclass SerializerUtil(private val model: Model, private val symbolProvider: SymbolProvider) {\n    fun RustWriter.ignoreDefaultsForNumbersAndBools(\n        shape: MemberShape,\n        value: ValueExpression,\n        inner: Writable,\n    ) {\n        // @required shapes should always be serialized, and members with @clientOptional or part of @input structures\n        // should ignore default values. If we have an Option<T>, it won't have a default anyway, so we don't need to\n        // ignore it.\n        // See https://github.com/smithy-lang/smithy-rs/issues/230 and https://github.com/aws/aws-sdk-go-v2/pull/1129\n        val container = model.expectShape(shape.container)\n        if (\n            shape.isRequired ||\n            shape.hasTrait<ClientOptionalTrait>() ||\n            // Treating `addedDefault` as `default` could break existing serializers.\n            // Fields that were previously marked as `required` but later replaced with `addedDefault`\n            // may no longer be serialized. This could occur when an explicitly set value matches the default.\n            shape.hasTrait<AddedDefaultTrait>() ||\n            // Zero values are always serialized in lists and collections, this only applies to structures\n            container !is StructureShape ||\n            container.hasTrait<InputTrait>()\n        ) {\n            rustBlock(\"\") {\n                inner(this)\n            }\n        } else {\n            this.ifNotNumberOrBoolDefault(model.expectShape(shape.target), symbolProvider.toSymbol(shape), value) {\n                inner(this)\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/StructuredDataSerializerGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy.protocols.serialize\n\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.shapes.UnionShape\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\n\ninterface StructuredDataSerializerGenerator {\n    /**\n     * Generate a serializer for a request payload.\n     *\n     * ```rust\n     * fn serialize_some_payload(input: &PayloadSmithyType) -> Result<Vec<u8>, Error> {\n     *     ...\n     * }\n     * ```\n     */\n    fun payloadSerializer(member: MemberShape): RuntimeType\n\n    /**\n     * Generate the correct data when attempting to serialize a structure that is unset.\n     *\n     * ```rust\n     * fn rest_json_unset_struct_payload() -> Vec<u8> {\n     *     ...\n     * }\n     * ```\n     */\n    fun unsetStructure(structure: StructureShape): RuntimeType\n\n    /**\n     * Generate the correct data when attempting to serialize a union that is unset\n     *\n     * ```rust\n     * fn rest_json_unset_union_payload() -> Vec<u8> {\n     *     ...\n     * }\n     * ```\n     *\n     * This method is only invoked when serializing an `@httpPayload`.\n     */\n    fun unsetUnion(union: UnionShape): RuntimeType\n\n    /**\n     * Generate a serializer for an operation input structure.\n     * This serializer is only used by clients.\n     * The serialized data is returned in an `SdkBody` that is used in HTTP requests.\n     * Returns `null` if there's nothing to serialize.\n     *\n     * ```rust\n     * fn serialize_some_operation(input: &SomeSmithyType) -> Result<SdkBody, Error> {\n     *     ...\n     * }\n     * ```\n     */\n    fun operationInputSerializer(operationShape: OperationShape): RuntimeType?\n\n    /**\n     * Generate a serializer for a document.\n     *\n     * ```rust\n     * fn serialize_document(input: &Document) -> Vec<u8> {\n     *     ...\n     * }\n     * ```\n     */\n    fun documentSerializer(): RuntimeType\n\n    /**\n     * Generate a serializer for an operation output structure.\n     * This serializer is only used by servers.\n     * The serialized data is returned in a `String` that is used in HTTP response bodies.\n     * Returns `null` if there's nothing to serialize.\n     *\n     * ```rust\n     * fn serialize_structure_crate_output_my_output_structure(value: &SomeSmithyType) -> Result<String, Error> {\n     *     ...\n     * }\n     * ```\n     */\n    fun operationOutputSerializer(operationShape: OperationShape): RuntimeType?\n\n    /**\n     * Generate a serializer for a server operation error structure.\n     *\n     * ```rust\n     * fn serialize_structure_crate_output_my_error_structure(value: &SomeSmithyType) -> Result<String, Error> {\n     *     ...\n     * }\n     * ```\n     */\n    fun serverErrorSerializer(shape: ShapeId): RuntimeType\n}\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/ValueExpression.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy.protocols.serialize\n\nimport software.amazon.smithy.rust.codegen.core.rustlang.autoDeref\n\nsealed class ValueExpression {\n    abstract val name: String\n\n    data class Reference(override val name: String) : ValueExpression()\n\n    data class Value(override val name: String) : ValueExpression()\n\n    fun asValue(): String =\n        when (this) {\n            is Reference -> autoDeref(name)\n            is Value -> name\n        }\n\n    fun asRef(): String =\n        when (this) {\n            is Reference -> name\n            is Value -> \"&$name\"\n        }\n\n    override fun toString(): String = this.name\n}\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/XmlBindingTraitSerializerGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy.protocols.serialize\n\nimport software.amazon.smithy.codegen.core.CodegenException\nimport software.amazon.smithy.model.shapes.BigDecimalShape\nimport software.amazon.smithy.model.shapes.BigIntegerShape\nimport software.amazon.smithy.model.shapes.BlobShape\nimport software.amazon.smithy.model.shapes.BooleanShape\nimport software.amazon.smithy.model.shapes.CollectionShape\nimport software.amazon.smithy.model.shapes.MapShape\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.NumberShape\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.model.shapes.StringShape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.shapes.TimestampShape\nimport software.amazon.smithy.model.shapes.UnionShape\nimport software.amazon.smithy.model.traits.TimestampFormatTrait\nimport software.amazon.smithy.model.traits.XmlFlattenedTrait\nimport software.amazon.smithy.model.traits.XmlNamespaceTrait\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustType\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.autoDeref\nimport software.amazon.smithy.rust.codegen.core.rustlang.render\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlockTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.stripOuter\nimport software.amazon.smithy.rust.codegen.core.rustlang.withBlock\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenContext\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.UnionGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.renderUnknownVariant\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.serializationError\nimport software.amazon.smithy.rust.codegen.core.smithy.isOptional\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.HttpBindingResolver\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.HttpLocation\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.ProtocolFunctions\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.XmlMemberIndex\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.XmlNameIndex\nimport software.amazon.smithy.rust.codegen.core.smithy.rustType\nimport software.amazon.smithy.rust.codegen.core.util.dq\nimport software.amazon.smithy.rust.codegen.core.util.getTrait\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\nimport software.amazon.smithy.rust.codegen.core.util.inputShape\nimport software.amazon.smithy.rust.codegen.core.util.isTargetUnit\nimport software.amazon.smithy.rust.codegen.core.util.letIf\nimport software.amazon.smithy.rust.codegen.core.util.outputShape\n\nclass XmlBindingTraitSerializerGenerator(\n    codegenContext: CodegenContext,\n    private val httpBindingResolver: HttpBindingResolver,\n) : StructuredDataSerializerGenerator {\n    private val symbolProvider = codegenContext.symbolProvider\n    private val runtimeConfig = codegenContext.runtimeConfig\n    private val model = codegenContext.model\n    private val codegenTarget = codegenContext.target\n    private val protocolFunctions = ProtocolFunctions(codegenContext)\n    private val codegenScope =\n        arrayOf(\n            \"XmlWriter\" to\n                RuntimeType.smithyXml(runtimeConfig).resolve(\"encode::XmlWriter\"),\n            \"ElementWriter\" to\n                RuntimeType.smithyXml(runtimeConfig).resolve(\"encode::ElWriter\"),\n            \"SdkBody\" to RuntimeType.sdkBody(runtimeConfig),\n            \"Error\" to runtimeConfig.serializationError(),\n            *RuntimeType.preludeScope,\n        )\n\n    private val xmlIndex = XmlNameIndex.of(model)\n    private val rootNamespace = codegenContext.serviceShape.getTrait<XmlNamespaceTrait>()\n    private val util = SerializerUtil(model, symbolProvider)\n\n    sealed class Ctx {\n        abstract val input: String\n\n        data class Element(val elementWriter: String, override val input: String) : Ctx()\n\n        data class Scope(val scopeWriter: String, override val input: String) : Ctx()\n\n        companion object {\n            // Kotlin doesn't have a \"This\" type\n            @Suppress(\"UNCHECKED_CAST\")\n            fun <T : Ctx> updateInput(\n                input: T,\n                newInput: String,\n            ): T =\n                when (input) {\n                    is Element -> input.copy(input = newInput) as T\n                    is Scope -> input.copy(input = newInput) as T\n                    else -> TODO()\n                }\n        }\n    }\n\n    private fun Ctx.Element.scopedTo(member: MemberShape) =\n        this.copy(input = \"$input.${symbolProvider.toMemberName(member)}\")\n\n    private fun Ctx.Scope.scopedTo(member: MemberShape) =\n        this.copy(input = \"$input.${symbolProvider.toMemberName(member)}\")\n\n    override fun operationInputSerializer(operationShape: OperationShape): RuntimeType? {\n        val inputShape = operationShape.inputShape(model)\n        val xmlMembers = operationShape.requestBodyMembers()\n        if (xmlMembers.isEmpty()) {\n            return null\n        }\n        val operationXmlName =\n            xmlIndex.operationInputShapeName(operationShape)\n                ?: throw CodegenException(\"operation must have a name if it has members\")\n        return protocolFunctions.serializeFn(operationShape, fnNameSuffix = \"op_input\") { fnName ->\n            rustBlockTemplate(\n                \"pub fn $fnName(input: &#{target}) -> #{Result}<#{SdkBody}, #{Error}>\",\n                *codegenScope,\n                \"target\" to symbolProvider.toSymbol(inputShape),\n            ) {\n                rust(\"let mut out = String::new();\")\n                // Create a scope for writer. This ensures that:\n                // - The writer is dropped before returning the string\n                // - All closing tags get written\n                rustBlock(\"\") {\n                    rustTemplate(\n                        \"\"\"\n                        let mut writer = #{XmlWriter}::new(&mut out);\n                        ##[allow(unused_mut)]\n                        let mut root = writer.start_el(${operationXmlName.dq()})${\n                            inputShape.xmlNamespace(root = true).apply()\n                        };\n                        \"\"\",\n                        *codegenScope,\n                    )\n                    serializeStructure(\n                        inputShape,\n                        xmlMembers,\n                        Ctx.Element(\"root\", \"input\"),\n                        fnNameSuffix = \"input\",\n                    )\n                }\n                rustTemplate(\"Ok(#{SdkBody}::from(out))\", *codegenScope)\n            }\n        }\n    }\n\n    override fun documentSerializer(): RuntimeType {\n        TODO(\"RestXML does not support document types\")\n    }\n\n    override fun payloadSerializer(member: MemberShape): RuntimeType {\n        val target = model.expectShape(member.target)\n        return protocolFunctions.serializeFn(member, fnNameSuffix = \"payload\") { fnName ->\n            val t =\n                symbolProvider\n                    .toSymbol(member)\n                    .rustType()\n                    .stripOuter<RustType.Option>()\n                    .render(true)\n            rustBlockTemplate(\n                \"pub fn $fnName(input: &$t) -> std::result::Result<std::vec::Vec<u8>, #{Error}>\",\n                *codegenScope,\n            ) {\n                rust(\"let mut out = String::new();\")\n                // Create a scope for writer. This ensures that:\n                // - The writer is dropped before returning the string\n                // - All closing tags get written\n                rustBlock(\"\") {\n                    rustTemplate(\n                        \"\"\"\n                        let mut writer = #{XmlWriter}::new(&mut out);\n                        ##[allow(unused_mut)]\n                        let mut root = writer.start_el(${xmlIndex.payloadShapeName(member).dq()})${\n                            target.xmlNamespace(root = true).apply()\n                        };\n                        \"\"\",\n                        *codegenScope,\n                    )\n                    when (target) {\n                        is StructureShape ->\n                            serializeStructure(\n                                target,\n                                XmlMemberIndex.fromMembers(target.members().toList()),\n                                Ctx.Element(\"root\", \"input\"),\n                            )\n                        is UnionShape -> serializeUnion(target, Ctx.Element(\"root\", \"input\"))\n                        else ->\n                            throw IllegalStateException(\n                                \"xml payloadSerializer only supports structs and unions\",\n                            )\n                    }\n                }\n                rustTemplate(\"Ok(out.into_bytes())\", *codegenScope)\n            }\n        }\n    }\n\n    override fun unsetStructure(structure: StructureShape): RuntimeType =\n        ProtocolFunctions.crossOperationFn(\"rest_xml_unset_struct_payload\") { fnName ->\n            rustTemplate(\n                \"\"\"\n                pub fn $fnName() -> #{ByteSlab} {\n                    Vec::new()\n                }\n                \"\"\",\n                \"ByteSlab\" to RuntimeType.ByteSlab,\n            )\n        }\n\n    override fun unsetUnion(union: UnionShape): RuntimeType =\n        ProtocolFunctions.crossOperationFn(\"rest_xml_unset_union_payload\") { fnName ->\n            rustTemplate(\n                \"pub fn $fnName() -> #{ByteSlab} { #{Vec}::new() }\",\n                *codegenScope,\n                \"ByteSlab\" to RuntimeType.ByteSlab,\n            )\n        }\n\n    override fun operationOutputSerializer(operationShape: OperationShape): RuntimeType? {\n        val outputShape = operationShape.outputShape(model)\n        val xmlMembers = operationShape.responseBodyMembers()\n        if (xmlMembers.isEmpty()) {\n            return null\n        }\n        val operationXmlName =\n            xmlIndex.operationOutputShapeName(operationShape)\n                ?: throw CodegenException(\"operation must have a name if it has members\")\n        return protocolFunctions.serializeFn(operationShape, fnNameSuffix = \"output\") { fnName ->\n            rustBlockTemplate(\n                \"pub fn $fnName(output: &#{target}) -> #{Result}<String, #{Error}>\",\n                *codegenScope,\n                \"target\" to symbolProvider.toSymbol(outputShape),\n            ) {\n                rust(\"let mut out = String::new();\")\n                // Create a scope for writer. This ensures that:\n                // - The writer is dropped before returning the string\n                // - All closing tags get written\n                rustBlock(\"\") {\n                    rustTemplate(\n                        \"\"\"\n                        let mut writer = #{XmlWriter}::new(&mut out);\n                        ##[allow(unused_mut)]\n                        let mut root = writer.start_el(${operationXmlName.dq()})${\n                            outputShape.xmlNamespace(root = true).apply()\n                        };\n                        \"\"\",\n                        *codegenScope,\n                    )\n                    serializeStructure(outputShape, xmlMembers, Ctx.Element(\"root\", \"output\"))\n                }\n                rustTemplate(\"Ok(out)\", *codegenScope)\n            }\n        }\n    }\n\n    override fun serverErrorSerializer(shape: ShapeId): RuntimeType {\n        val errorShape = model.expectShape(shape, StructureShape::class.java)\n        val xmlMembers =\n            httpBindingResolver\n                .errorResponseBindings(shape)\n                .filter { it.location == HttpLocation.DOCUMENT }\n                .map { it.member }\n        return protocolFunctions.serializeFn(errorShape, fnNameSuffix = \"error\") { fnName ->\n            rustBlockTemplate(\n                \"pub fn $fnName(error: &#{target}) -> #{Result}<String, #{Error}>\",\n                *codegenScope,\n                \"target\" to symbolProvider.toSymbol(errorShape),\n            ) {\n                rust(\"let mut out = String::new();\")\n                // Create a scope for writer. This ensures that:\n                // - The writer is dropped before returning the string\n                // - All closing tags get written\n                rustBlock(\"\") {\n                    rustTemplate(\n                        \"\"\"\n                        let mut writer = #{XmlWriter}::new(&mut out);\n                        ##[allow(unused_mut)]\n                        let mut root = writer.start_el(\"Error\")${errorShape.xmlNamespace(root = true).apply()};\n                        \"\"\",\n                        *codegenScope,\n                    )\n                    serializeStructure(\n                        errorShape,\n                        XmlMemberIndex.fromMembers(xmlMembers),\n                        Ctx.Element(\"root\", \"error\"),\n                    )\n                }\n                rustTemplate(\"Ok(out)\", *codegenScope)\n            }\n        }\n    }\n\n    private fun XmlNamespaceTrait?.apply(): String {\n        this ?: return \"\"\n        val prefix = prefix.map { prefix -> \"Some(${prefix.dq()})\" }.orElse(\"None\")\n        return \".write_ns(${uri.dq()}, $prefix)\"\n    }\n\n    private fun RustWriter.structureInner(\n        members: XmlMemberIndex,\n        ctx: Ctx.Element,\n    ) {\n        if (members.attributeMembers.isNotEmpty()) {\n            rust(\"let mut ${ctx.elementWriter} = ${ctx.elementWriter};\")\n        }\n        members.attributeMembers.forEach { member ->\n            handleOptional(member, ctx.scopedTo(member)) { ctx ->\n                withBlock(\n                    \"${ctx.elementWriter}.write_attribute(${xmlIndex.memberName(member).dq()},\",\n                    \");\",\n                ) { serializeRawMember(member, ctx.input) }\n            }\n        }\n        Attribute.AllowUnusedMut.render(this)\n        rust(\"let mut scope = ${ctx.elementWriter}.finish();\")\n        val scopeCtx = Ctx.Scope(\"scope\", ctx.input)\n        members.dataMembers.forEach { member ->\n            serializeMember(member, scopeCtx.scopedTo(member), null)\n        }\n        rust(\"scope.finish();\")\n    }\n\n    private fun RustWriter.serializeRawMember(\n        member: MemberShape,\n        input: String,\n    ) {\n        when (model.expectShape(member.target)) {\n            is StringShape -> {\n                // The `input` expression always evaluates to a reference type at this point, but if\n                // it does so because\n                // it's preceded by the `&` operator, calling `as_str()` on it will upset Clippy.\n                val dereferenced =\n                    if (input.startsWith(\"&\")) {\n                        autoDeref(input)\n                    } else {\n                        input\n                    }\n                rust(\"$dereferenced.as_str()\")\n            }\n            is BigIntegerShape, is BigDecimalShape -> {\n                rust(\"$input.as_ref()\")\n            }\n            is BooleanShape, is NumberShape -> {\n                rust(\n                    \"#T::from(${autoDeref(input)}).encode()\",\n                    RuntimeType.smithyTypes(runtimeConfig).resolve(\"primitive::Encoder\"),\n                )\n            }\n            is BlobShape ->\n                rust(\"#T($input.as_ref()).as_ref()\", RuntimeType.base64Encode(runtimeConfig))\n            is TimestampShape -> {\n                val timestampFormat =\n                    httpBindingResolver.timestampFormat(\n                        member,\n                        HttpLocation.DOCUMENT,\n                        TimestampFormatTrait.Format.DATE_TIME,\n                        model,\n                    )\n                val timestampFormatType =\n                    RuntimeType.parseTimestampFormat(\n                        codegenTarget,\n                        runtimeConfig,\n                        timestampFormat,\n                    )\n                rust(\"$input.fmt(#T)?.as_ref()\", timestampFormatType)\n            }\n            else -> TODO(member.toString())\n        }\n    }\n\n    @Suppress(\"NAME_SHADOWING\")\n    private fun RustWriter.serializeMember(\n        memberShape: MemberShape,\n        ctx: Ctx.Scope,\n        rootNameOverride: String? = null,\n    ) {\n        val target = model.expectShape(memberShape.target)\n        val xmlName = rootNameOverride ?: xmlIndex.memberName(memberShape)\n        val ns = memberShape.xmlNamespace(root = false).apply()\n        handleOptional(memberShape, ctx) { ctx ->\n            when (target) {\n                is StringShape,\n                is BooleanShape,\n                is NumberShape,\n                is TimestampShape,\n                is BlobShape,\n                is BigIntegerShape,\n                is BigDecimalShape,\n                -> {\n                    rust(\n                        \"let mut inner_writer = ${ctx.scopeWriter}.start_el(${xmlName.dq()})$ns.finish();\",\n                    )\n                    withBlock(\"inner_writer.data(\", \");\") {\n                        serializeRawMember(memberShape, ctx.input)\n                    }\n                }\n                is CollectionShape ->\n                    if (memberShape.hasTrait<XmlFlattenedTrait>()) {\n                        serializeFlatList(memberShape, target, ctx)\n                    } else {\n                        rust(\n                            \"let mut inner_writer = ${ctx.scopeWriter}.start_el(${xmlName.dq()})$ns.finish();\",\n                        )\n                        serializeList(target, Ctx.Scope(\"inner_writer\", ctx.input))\n                    }\n                is MapShape ->\n                    if (memberShape.hasTrait<XmlFlattenedTrait>()) {\n                        serializeMap(target, xmlIndex.memberName(memberShape), ctx)\n                    } else {\n                        rust(\n                            \"let mut inner_writer = ${ctx.scopeWriter}.start_el(${xmlName.dq()})$ns.finish();\",\n                        )\n                        serializeMap(target, \"entry\", Ctx.Scope(\"inner_writer\", ctx.input))\n                    }\n                is StructureShape -> {\n                    // We call serializeStructure only when target.members() is nonempty.\n                    // If it were empty, serializeStructure would generate the following code:\n                    //   pub fn serialize_structure_crate_model_unit(\n                    //       input: &crate::model::Unit,\n                    //       writer: aws_smithy_xml::encode::ElWriter,\n                    //   ) -> Result<(), aws_smithy_http::operation::error::SerializationError> {\n                    //       let _ = input;\n                    //       #[allow(unused_mut)]\n                    //       let mut scope = writer.finish();\n                    //       scope.finish();\n                    //       Ok(())\n                    //   }\n                    // However, this would cause a compilation error at a call site because it\n                    // cannot\n                    // extract data out of the Unit type that corresponds to the variable \"input\"\n                    // above.\n                    if (target.members().isEmpty()) {\n                        rust(\"${ctx.scopeWriter}.start_el(${xmlName.dq()})$ns.finish();\")\n                    } else {\n                        rust(\"let inner_writer = ${ctx.scopeWriter}.start_el(${xmlName.dq()})$ns;\")\n                        serializeStructure(\n                            target,\n                            XmlMemberIndex.fromMembers(target.members().toList()),\n                            Ctx.Element(\"inner_writer\", ctx.input),\n                        )\n                    }\n                }\n                is UnionShape -> {\n                    rust(\"let inner_writer = ${ctx.scopeWriter}.start_el(${xmlName.dq()})$ns;\")\n                    serializeUnion(target, Ctx.Element(\"inner_writer\", ctx.input))\n                }\n                else -> TODO(target.toString())\n            }\n        }\n    }\n\n    private fun RustWriter.serializeStructure(\n        structureShape: StructureShape,\n        members: XmlMemberIndex,\n        ctx: Ctx.Element,\n        fnNameSuffix: String? = null,\n    ) {\n        val structureSymbol = symbolProvider.toSymbol(structureShape)\n        val structureSerializer =\n            protocolFunctions.serializeFn(structureShape, fnNameSuffix = fnNameSuffix) { fnName,\n                ->\n                rustBlockTemplate(\n                    \"pub fn $fnName(input: &#{Input}, writer: #{ElementWriter}) -> #{Result}<(), #{Error}>\",\n                    \"Input\" to structureSymbol,\n                    *codegenScope,\n                ) {\n                    if (!members.isNotEmpty()) {\n                        // removed unused warning if there are no fields we're going to read\n                        rust(\"let _ = input;\")\n                    }\n                    structureInner(members, Ctx.Element(\"writer\", \"&input\"))\n                    rust(\"Ok(())\")\n                }\n            }\n        rust(\"#T(${ctx.input}, ${ctx.elementWriter})?\", structureSerializer)\n    }\n\n    private fun RustWriter.serializeUnion(\n        unionShape: UnionShape,\n        ctx: Ctx.Element,\n    ) {\n        val unionSymbol = symbolProvider.toSymbol(unionShape)\n        val structureSerializer =\n            protocolFunctions.serializeFn(unionShape) { fnName ->\n                rustBlockTemplate(\n                    \"pub fn $fnName(input: &#{Input}, writer: #{ElementWriter}) -> #{Result}<(), #{Error}>\",\n                    \"Input\" to unionSymbol,\n                    *codegenScope,\n                ) {\n                    rust(\"let mut scope_writer = writer.finish();\")\n                    rustBlock(\"match input\") {\n                        val members = unionShape.members()\n\n                        members.forEach { member ->\n                            val memberShape = model.expectShape(member.target)\n                            val memberName = symbolProvider.toMemberName(member)\n                            val isEmptyStruct =\n                                memberShape.isStructureShape &&\n                                    memberShape\n                                        .asStructureShape()\n                                        .get()\n                                        .allMembers\n                                        .isEmpty()\n                            val variantName =\n                                if (member.isTargetUnit()) {\n                                    \"$memberName\"\n                                } else if (isEmptyStruct) {\n                                    // Unit structs don't serialize inner, so it is never\n                                    // accessed\n                                    \"$memberName(_inner)\"\n                                } else {\n                                    \"$memberName(inner)\"\n                                }\n                            val innerVarName = if (isEmptyStruct) \"_inner\" else \"inner\"\n                            withBlock(\"#T::$variantName =>\", \",\", unionSymbol) {\n                                serializeMember(member, Ctx.Scope(\"scope_writer\", innerVarName))\n                            }\n                        }\n\n                        if (codegenTarget.renderUnknownVariant()) {\n                            rustTemplate(\n                                \"#{Union}::${UnionGenerator.UNKNOWN_VARIANT_NAME} => return Err(#{Error}::unknown_variant(${unionSymbol.name.dq()}))\",\n                                \"Union\" to unionSymbol,\n                                *codegenScope,\n                            )\n                        }\n                    }\n                    rust(\"Ok(())\")\n                }\n            }\n        rust(\"#T(${ctx.input}, ${ctx.elementWriter})?\", structureSerializer)\n    }\n\n    private fun RustWriter.serializeList(\n        listShape: CollectionShape,\n        ctx: Ctx.Scope,\n    ) {\n        val itemName = safeName(\"list_item\")\n        rustBlock(\"for $itemName in ${ctx.input}\") {\n            serializeMember(listShape.member, ctx.copy(input = itemName))\n        }\n    }\n\n    private fun RustWriter.serializeFlatList(\n        member: MemberShape,\n        listShape: CollectionShape,\n        ctx: Ctx.Scope,\n    ) {\n        val itemName = safeName(\"list_item\")\n        rustBlock(\"for $itemName in ${ctx.input}\") {\n            serializeMember(\n                listShape.member,\n                ctx.copy(input = itemName),\n                xmlIndex.memberName(member),\n            )\n        }\n    }\n\n    private fun RustWriter.serializeMap(\n        mapShape: MapShape,\n        entryName: String,\n        ctx: Ctx.Scope,\n    ) {\n        val key = safeName(\"key\")\n        val value = safeName(\"value\")\n        rustBlock(\"for ($key, $value) in ${ctx.input}\") {\n            rust(\"\"\"let mut entry = ${ctx.scopeWriter}.start_el(${entryName.dq()}).finish();\"\"\")\n            serializeMember(mapShape.key, ctx.copy(scopeWriter = \"entry\", input = key))\n            serializeMember(mapShape.value, ctx.copy(scopeWriter = \"entry\", input = value))\n        }\n    }\n\n    /**\n     * If [member] is an optional shape, generate code like:\n     * ```rust\n     * if let Some(inner) = member {\n     *   // .. BLOCK\n     * }\n     * ```\n     *\n     * If [member] is not an optional shape, generate code like: `{ .. BLOCK }`\n     *\n     * [inner] is passed a new `ctx` object to use for code generation which handles the potentially\n     * new name of the input.\n     */\n    private fun <T : Ctx> RustWriter.handleOptional(\n        member: MemberShape,\n        ctx: T,\n        inner: RustWriter.(T) -> Unit,\n    ) {\n        val memberSymbol = symbolProvider.toSymbol(member)\n        if (memberSymbol.isOptional()) {\n            val tmp = safeName()\n            val target = model.expectShape(member.target)\n            val pattern =\n                if (target.isStructureShape && target.members().isEmpty()) {\n                    // In this case, we mark a variable captured in the if-let\n                    // expression as unused to prevent the warning coming\n                    // from the following code generated by handleOptional:\n                    //   if let Some(var_2) = &input.input {\n                    //       scope.start_el(\"input\").finish();\n                    //   }\n                    // where var_2 above is unused.\n                    \"Some(_$tmp)\"\n                } else {\n                    \"Some($tmp)\"\n                }\n            rustBlock(\"if let $pattern = ${ctx.input}\") { inner(Ctx.updateInput(ctx, tmp)) }\n        } else {\n            with(util) {\n                val valueExpression =\n                    if (ctx.input.startsWith(\"&\")) {\n                        ValueExpression.Reference(ctx.input)\n                    } else {\n                        ValueExpression.Value(ctx.input)\n                    }\n                ignoreDefaultsForNumbersAndBools(member, valueExpression) { inner(ctx) }\n            }\n        }\n    }\n\n    private fun OperationShape.requestBodyMembers(): XmlMemberIndex =\n        XmlMemberIndex.fromMembers(\n            httpBindingResolver.requestMembers(this, HttpLocation.DOCUMENT),\n        )\n\n    private fun OperationShape.responseBodyMembers(): XmlMemberIndex =\n        XmlMemberIndex.fromMembers(\n            httpBindingResolver.responseMembers(this, HttpLocation.DOCUMENT),\n        )\n\n    private fun Shape.xmlNamespace(root: Boolean): XmlNamespaceTrait? {\n        return this.getTrait<XmlNamespaceTrait>().letIf(root) { it ?: rootNamespace }\n    }\n}\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/traits/AllowInvalidXmlRoot.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy.traits\n\nimport software.amazon.smithy.model.node.Node\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.model.traits.AnnotationTrait\n\n/**\n * Indicates that a service is expected to send XML where the root element name does not match the modeled member name.\n */\nclass AllowInvalidXmlRoot : AnnotationTrait(ID, Node.objectNode()) {\n    companion object {\n        val ID: ShapeId = ShapeId.from(\"smithy.api.internal#allowInvalidXmlRoot\")\n    }\n}\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/traits/RustBoxTrait.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy.traits\n\nimport software.amazon.smithy.model.node.Node\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.model.traits.Trait\n\n/**\n * Trait indicating that this shape should be represented with `Box<T>` when converted into Rust\n *\n * This is used to handle recursive shapes.\n * See [software.amazon.smithy.rust.codegen.core.smithy.transformers.RecursiveShapeBoxer].\n *\n * This trait is synthetic, applied during code generation, and never used in actual models.\n */\nclass RustBoxTrait : Trait {\n    val ID = ShapeId.from(\"software.amazon.smithy.rust.codegen.smithy.rust.synthetic#box\")\n\n    override fun toNode(): Node = Node.objectNode()\n\n    override fun toShapeId(): ShapeId = ID\n}\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/traits/SyntheticEventStreamUnionTrait.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy.traits\n\nimport software.amazon.smithy.model.node.Node\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.model.traits.AnnotationTrait\n\nclass SyntheticEventStreamUnionTrait(\n    val errorMembers: List<MemberShape>,\n) : AnnotationTrait(ID, Node.objectNode()) {\n    companion object {\n        val ID = ShapeId.from(\"smithy.api.internal#syntheticEventStreamUnion\")\n    }\n}\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/traits/SyntheticInputTrait.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy.traits\n\nimport software.amazon.smithy.model.node.Node\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.model.traits.AnnotationTrait\n\n/**\n * Indicates that a shape is a synthetic input (see `OperationNormalizer.kt`)\n *\n * All operations are normalized to have an input, even when they are defined without one.\n * This is NOT done for backwards-compatibility, as adding an operation input is a breaking change\n * (see <https://github.com/smithy-lang/smithy/issues/2253#issuecomment-2069943344>).\n *\n * It is only done to produce a consistent API.\n * TODO(https://github.com/smithy-lang/smithy-rs/issues/3577): In the server, we'd like to stop adding\n *  these synthetic inputs.\n */\nclass SyntheticInputTrait(\n    val operation: ShapeId,\n    val originalId: ShapeId?,\n) : AnnotationTrait(ID, Node.objectNode()) {\n    companion object {\n        val ID: ShapeId = ShapeId.from(\"smithy.api.internal#syntheticInput\")\n    }\n}\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/traits/SyntheticOutputTrait.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy.traits\n\nimport software.amazon.smithy.model.node.Node\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.model.traits.AnnotationTrait\n\n/**\n * Indicates that a shape is a synthetic output (see `OperationNormalizer.kt`)\n *\n * All operations are normalized to have an output, even when they are defined without one.\n *\n * This is NOT done for backwards-compatibility, as adding an operation output is a breaking change\n * (see <https://github.com/smithy-lang/smithy/issues/2253#issuecomment-2069943344>).\n *\n * It is only done to produce a consistent API.\n * TODO(https://github.com/smithy-lang/smithy-rs/issues/3577): In the server, we'd like to stop adding\n *  these synthetic outputs.\n */\nclass SyntheticOutputTrait constructor(val operation: ShapeId, val originalId: ShapeId?) :\n    AnnotationTrait(ID, Node.objectNode()) {\n        companion object {\n            val ID: ShapeId = ShapeId.from(\"smithy.api.internal#syntheticOutput\")\n        }\n    }\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/transformers/EventStreamNormalizer.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy.transformers\n\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.knowledge.OperationIndex\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.shapes.UnionShape\nimport software.amazon.smithy.model.traits.ErrorTrait\nimport software.amazon.smithy.model.transform.ModelTransformer\nimport software.amazon.smithy.rust.codegen.core.smithy.DirectedWalker\nimport software.amazon.smithy.rust.codegen.core.smithy.traits.SyntheticEventStreamUnionTrait\nimport software.amazon.smithy.rust.codegen.core.util.expectTrait\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\nimport software.amazon.smithy.rust.codegen.core.util.inputShape\nimport software.amazon.smithy.rust.codegen.core.util.isEventStream\nimport software.amazon.smithy.rust.codegen.core.util.outputShape\n\n/**\n * Generates synthetic unions to replace the modeled unions for Event Stream types.\n * This allows us to strip out all the error union members once up-front, instead of in each\n * place that does codegen with the unions.\n */\nobject EventStreamNormalizer {\n    fun transform(model: Model): Model =\n        ModelTransformer.create().mapShapes(model) { shape ->\n            if (shape is OperationShape && shape.isEventStream(model)) {\n                addStreamErrorsToOperationErrors(model, shape)\n            } else if (shape is UnionShape && shape.isEventStream()) {\n                syntheticEquivalentEventStreamUnion(model, shape)\n            } else {\n                shape\n            }\n        }\n\n    private fun addStreamErrorsToOperationErrors(\n        model: Model,\n        operation: OperationShape,\n    ): OperationShape {\n        if (!operation.isEventStream(model)) {\n            return operation\n        }\n        val getStreamErrors = { shape: ShapeId ->\n            model.expectShape(shape).members()\n                .filter { it.isEventStream(model) }\n                .map { model.expectShape(it.target) }.flatMap { it.members() }\n                .filter { model.expectShape(it.target).hasTrait<ErrorTrait>() }\n                .map { model.expectShape(it.target).id }\n        }\n        val inputs = operation.input.map { getStreamErrors(it) }\n        val outputs = operation.output.map { getStreamErrors(it) }\n        val streamErrors = inputs.orElse(listOf()) + outputs.orElse(listOf())\n        return operation.toBuilder()\n            .addErrors(streamErrors.map { it.toShapeId() })\n            .build()\n    }\n\n    private fun syntheticEquivalentEventStreamUnion(\n        model: Model,\n        union: UnionShape,\n    ): UnionShape {\n        val (errorMembers, eventMembers) =\n            union.members().partition { member ->\n                model.expectShape(member.target).hasTrait<ErrorTrait>()\n            }\n        return union.toBuilder()\n            .members(eventMembers)\n            .addTrait(SyntheticEventStreamUnionTrait(errorMembers))\n            .build()\n    }\n}\n\nfun OperationShape.operationErrors(model: Model): List<Shape> {\n    val operationIndex = OperationIndex.of(model)\n    return operationIndex.getErrors(this)\n}\n\nfun eventStreamErrors(\n    model: Model,\n    shape: Shape,\n): Map<UnionShape, List<StructureShape>> {\n    return DirectedWalker(model)\n        .walkShapes(shape)\n        .filter { it is UnionShape && it.isEventStream() }\n        .map { it.asUnionShape().get() }\n        .associateWith { unionShape ->\n            unionShape.expectTrait<SyntheticEventStreamUnionTrait>().errorMembers\n                .map { model.expectShape(it.target).asStructureShape().get() }\n        }\n}\n\nfun UnionShape.eventStreamErrors(): List<Shape> {\n    if (!this.isEventStream()) {\n        return listOf()\n    }\n    return this.expectTrait<SyntheticEventStreamUnionTrait>().errorMembers\n}\n\nfun OperationShape.eventStreamErrors(model: Model): Map<UnionShape, List<StructureShape>> {\n    return eventStreamErrors(model, inputShape(model)) + eventStreamErrors(model, outputShape(model))\n}\n\nfun OperationShape.allErrors(model: Model): List<Shape> {\n    return this.eventStreamErrors(model).values.flatten() + this.operationErrors(model)\n}\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/transformers/OperationNormalizer.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy.transformers\n\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.traits.InputTrait\nimport software.amazon.smithy.model.transform.ModelTransformer\nimport software.amazon.smithy.rust.codegen.core.smithy.traits.SyntheticInputTrait\nimport software.amazon.smithy.rust.codegen.core.smithy.traits.SyntheticOutputTrait\nimport software.amazon.smithy.rust.codegen.core.util.expectTrait\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\nimport software.amazon.smithy.rust.codegen.core.util.inputShape\nimport software.amazon.smithy.rust.codegen.core.util.orNull\nimport software.amazon.smithy.rust.codegen.core.util.outputShape\nimport software.amazon.smithy.rust.codegen.core.util.rename\nimport java.util.Optional\nimport kotlin.streams.toList\n\n/**\n * Generate synthetic Input and Output structures for operations.\n *\n * This works by **adding** new shapes to the model for operation inputs & outputs. These new shapes have `SyntheticInputTrait`\n * and `SyntheticOutputTrait` attached to them as needed. This enables downstream code generators to determine if a shape is\n * \"real\" vs. a shape created as a synthetic input/output.\n *\n * The trait also tracks the original shape id for certain serialization tasks that require it to exist.\n *\n * Note that adding/removing operation input/output [is a breaking change]; the only reason why we synthetically add them\n * is to produce a consistent API.\n *\n * [is a breaking change]: <https://github.com/smithy-lang/smithy/issues/2253#issuecomment-2069943344>\n */\nobject OperationNormalizer {\n    // Functions to construct synthetic shape IDs—Don't rely on these in external code.\n    // Rename safety: Operations cannot be renamed\n    // In order to ensure that the fully qualified smithy id of a synthetic shape can never conflict with an existing shape,\n    // the `synthetic` namespace is appended.\n    private fun OperationShape.syntheticInputId() =\n        ShapeId.fromParts(this.id.namespace + \".synthetic\", \"${this.id.name}Input\")\n\n    private fun OperationShape.syntheticOutputId() =\n        ShapeId.fromParts(this.id.namespace + \".synthetic\", \"${this.id.name}Output\")\n\n    /**\n     * Returns `true` if the user had originally modeled an operation input shape on the given [operation];\n     * `false` if the transform added a synthetic one.\n     */\n    fun hadUserModeledOperationInput(\n        operation: OperationShape,\n        model: Model,\n    ): Boolean {\n        val syntheticInputTrait = operation.inputShape(model).expectTrait<SyntheticInputTrait>()\n        return syntheticInputTrait.originalId != null\n    }\n\n    /**\n     * Returns `true` if the user had originally modeled an operation output shape on the given [operation];\n     * `false` if the transform added a synthetic one.\n     */\n    fun hadUserModeledOperationOutput(\n        operation: OperationShape,\n        model: Model,\n    ): Boolean {\n        val syntheticOutputTrait = operation.outputShape(model).expectTrait<SyntheticOutputTrait>()\n        return syntheticOutputTrait.originalId != null\n    }\n\n    /**\n     * Add synthetic input & output shapes to every Operation in model. The generated shapes will be marked with\n     * [SyntheticInputTrait] and [SyntheticOutputTrait] respectively. Shapes will be added _even_ if the operation does\n     * not specify an input or an output.\n     *\n     * The shapes are generated and added to the model, and the operation shapes are rebuilt to have their input and output ids\n     * set accordingly.\n     */\n    fun transform(model: Model): Model {\n        val transformer = ModelTransformer.create()\n        val operations = model.shapes(OperationShape::class.java).toList()\n        val newShapes =\n            operations.flatMap { operation ->\n                // Generate or modify the input and output of the given `Operation` to be a unique shape\n                listOf(syntheticInputShape(model, operation), syntheticOutputShape(model, operation))\n            }\n        val shapeConflict = newShapes.firstOrNull { shape -> model.getShape(shape.id).isPresent }\n        check(\n            shapeConflict == null,\n        ) {\n            \"shape $shapeConflict conflicted with an existing shape in the model (${model.expectShape(shapeConflict!!.id)}). This is a bug.\"\n        }\n        val modelWithOperationInputs = model.toBuilder().addShapes(newShapes).build()\n        return transformer.mapShapes(modelWithOperationInputs) {\n            // Update all operations to point to their new input/output shapes\n            val transformed: Optional<Shape> =\n                it.asOperationShape().map { operation ->\n                    modelWithOperationInputs.expectShape(operation.syntheticInputId())\n                    operation.toBuilder()\n                        .input(operation.syntheticInputId())\n                        .output(operation.syntheticOutputId())\n                        .build()\n                }\n            transformed.orElse(it)\n        }\n    }\n\n    /**\n     * Synthetic output shape for `operation`\n     * e.g. `<SomeOperation>Output`\n     *\n     * If the operation does not have an output, an empty shape is generated\n     */\n    private fun syntheticOutputShape(\n        model: Model,\n        operation: OperationShape,\n    ): StructureShape {\n        val outputId = operation.syntheticOutputId()\n        val outputShapeBuilder =\n            operation.output.map { shapeId ->\n                model.expectShape(shapeId, StructureShape::class.java).toBuilder().rename(outputId)\n            }.orElse(empty(outputId))\n        return outputShapeBuilder.addTrait(\n            SyntheticOutputTrait(\n                operation = operation.id,\n                originalId = operation.output.orNull(),\n            ),\n        ).build()\n    }\n\n    /**\n     * Synthetic input shape for `operation`\n     * e.g. `<SomeOperation>Input`\n     *\n     * If the input operation does not have an input, an empty shape is generated\n     */\n    private fun syntheticInputShape(\n        model: Model,\n        operation: OperationShape,\n    ): StructureShape {\n        val inputId = operation.syntheticInputId()\n        val inputShapeBuilder =\n            operation.input.map { shapeId ->\n                model.expectShape(shapeId, StructureShape::class.java).toBuilder().rename(inputId)\n            }.orElse(empty(inputId))\n        // There are still shapes missing the input trait. If we don't apply this, we'll get bad results from the\n        // nullability index\n        if (!inputShapeBuilder.build().hasTrait<InputTrait>()) {\n            inputShapeBuilder.addTrait(InputTrait())\n        }\n        return inputShapeBuilder.addTrait(\n            SyntheticInputTrait(\n                operation = operation.id,\n                originalId = operation.input.orNull(),\n            ),\n        ).build()\n    }\n\n    private fun empty(id: ShapeId) = StructureShape.builder().id(id)\n}\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/transformers/RecursiveShapeBoxer.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy.transformers\n\nimport software.amazon.smithy.codegen.core.TopologicalIndex\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.CollectionShape\nimport software.amazon.smithy.model.shapes.MapShape\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.transform.ModelTransformer\nimport software.amazon.smithy.rust.codegen.core.smithy.traits.RustBoxTrait\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\n\nclass RecursiveShapeBoxer(\n    /**\n     * A predicate that determines when a cycle in the shape graph contains \"indirection\". If a cycle contains\n     * indirection, no shape needs to be tagged. What constitutes indirection is up to the caller to decide.\n     */\n    private val containsIndirectionPredicate: (Collection<Shape>) -> Boolean = ::containsIndirection,\n    /**\n     * A closure that gets called on one member shape of a cycle that does not contain indirection for \"fixing\". For\n     * example, the [RustBoxTrait] trait can be used to tag the member shape.\n     */\n    private val boxShapeFn: (MemberShape) -> MemberShape = ::addRustBoxTrait,\n) {\n    /**\n     * Transform a model which may contain recursive shapes.\n     *\n     * For example, when recursive shapes do NOT go through a `CollectionShape` or a `MapShape` shape, they must be\n     * boxed in Rust. This function will iteratively find cycles and call [boxShapeFn] on a member shape in the\n     * cycle to act on it. This is done in a deterministic way until it reaches a fixed point.\n     *\n     * This function MUST be deterministic (always choose the same shapes to fix). If it is not, that is a bug. Even so\n     * this function may cause backward compatibility issues in certain pathological cases where a changes to recursive\n     * structures cause different members to be boxed. We may need to address these via customizations.\n     *\n     * For example, given the following model,\n     *\n     * ```smithy\n     * namespace com.example\n     *\n     * structure Recursive {\n     *     recursiveStruct: Recursive\n     *     anotherField: Boolean\n     * }\n     * ```\n     *\n     * The `com.example#Recursive$recursiveStruct` member shape is part of a cycle, but the\n     * `com.example#Recursive$anotherField` member shape is not.\n     */\n    fun transform(model: Model): Model {\n        val next = transformInner(model)\n        return if (next == null) {\n            model\n        } else {\n            transform(next)\n        }\n    }\n\n    /**\n     * If [model] contains a recursive loop that must be boxed, return the transformed model resulting form a call to\n     * [boxShapeFn].\n     * If [model] contains no loops, return `null`.\n     */\n    private fun transformInner(model: Model): Model? {\n        // Execute 1 step of the boxing algorithm in the path to reaching a fixed point:\n        // 1. Find all the shapes that are part of a cycle.\n        // 2. Find all the loops that those shapes are part of.\n        // 3. Filter out the loops that go through a layer of indirection.\n        // 3. Pick _just one_ of the remaining loops to fix.\n        // 4. Select the member shape in that loop with the earliest shape id.\n        // 5. Box it.\n        // (External to this function) Go back to 1.\n        val index = TopologicalIndex.of(model)\n        val recursiveShapes = index.recursiveShapes\n        val loops =\n            recursiveShapes.map { shapeId ->\n                // Get all the shapes in the closure (represented as `Path`s).\n                index.getRecursiveClosure(shapeId)\n            }.flatMap { loops ->\n                // Flatten the connections into shapes.\n                loops.map { it.shapes }\n            }\n        val loopToFix = loops.firstOrNull { !containsIndirectionPredicate(it) }\n\n        return loopToFix?.let { loop: List<Shape> ->\n            check(loop.isNotEmpty())\n            // Pick the shape to box in a deterministic way.\n            val shapeToBox = loop.filterIsInstance<MemberShape>().minByOrNull { it.id }!!\n            ModelTransformer.create().mapShapes(model) { shape ->\n                if (shape == shapeToBox) {\n                    boxShapeFn(shape.asMemberShape().get())\n                } else {\n                    shape\n                }\n            }\n        }\n    }\n}\n\n/**\n * Check if a `List<Shape>` contains a shape which will use a pointer when represented in Rust, avoiding the\n * need to add more `Box`es.\n *\n * Why `CollectionShape`s and `MapShape`s? Note that `CollectionShape`s get rendered in Rust as `Vec<T>`, and\n * `MapShape`s as `HashMap<String, T>`; they're the only Smithy shapes that \"organically\" introduce indirection\n * (via a pointer to the heap) in the recursive path. For other recursive paths, we thus have to introduce the\n * indirection artificially ourselves using `Box`.\n *\n */\nprivate fun containsIndirection(loop: Collection<Shape>): Boolean =\n    loop.find {\n        when (it) {\n            is CollectionShape, is MapShape -> true\n            else -> it.hasTrait<RustBoxTrait>()\n        }\n    } != null\n\nprivate fun addRustBoxTrait(shape: MemberShape): MemberShape = shape.toBuilder().addTrait(RustBoxTrait()).build()\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/BasicTestModels.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.testutil\n\nobject BasicTestModels {\n    val AwsJson10TestModel =\n        \"\"\"\n        namespace com.example\n        use aws.protocols#awsJson1_0\n        @awsJson1_0\n        service HelloService {\n            operations: [SayHello],\n            version: \"1\"\n        }\n        @optionalAuth\n        operation SayHello { input: TestInput }\n        structure TestInput {\n           foo: String,\n        }\n        \"\"\".asSmithyModel()\n}\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/CodegenIntegrationTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.testutil\n\nimport software.amazon.smithy.build.PluginContext\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.node.ObjectNode\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig\nimport software.amazon.smithy.rust.codegen.core.util.runCommand\nimport java.io.File\nimport java.nio.file.Path\nimport java.util.logging.Logger\n\n/**\n * A helper class holding common data with defaults that is threaded through several functions, to make their\n * signatures shorter.\n */\ndata class IntegrationTestParams(\n    val service: String? = null,\n    val moduleVersion: String = \"1.0.0\",\n    val runtimeConfig: RuntimeConfig? = null,\n    val additionalSettings: ObjectNode = ObjectNode.builder().build(),\n    val overrideTestDir: File? = null,\n    val command: ((Path) -> Unit)? = null,\n    val cargoCommand: String? = null,\n)\n\n/**\n * A helper class to allow setting `codegen` object keys to be passed to the `additionalSettings`\n * field of `IntegrationTestParams`.\n *\n * Usage:\n *\n * ```kotlin\n * serverIntegrationTest(\n *     model,\n *     IntegrationTestParams(\n *         additionalSettings =\n *             ServerAdditionalSettings.builder()\n *                 .generateCodegenComments()\n *                 .publicConstrainedTypes()\n *                 .toObjectNode()\n * )),\n * ```\n */\nsealed class AdditionalSettings {\n    abstract fun toObjectNode(): ObjectNode\n\n    abstract class CoreAdditionalSettings protected constructor(val settings: List<AdditionalSettings>) :\n        AdditionalSettings() {\n            override fun toObjectNode(): ObjectNode {\n                val merged =\n                    settings.map { it.toObjectNode() }\n                        .reduce { acc, next -> acc.merge(next) }\n\n                return ObjectNode.builder()\n                    .withMember(\"codegen\", merged)\n                    .build()\n            }\n\n            abstract class Builder<T : CoreAdditionalSettings> : AdditionalSettings() {\n                protected val settings = mutableListOf<AdditionalSettings>()\n\n                fun generateCodegenComments(debugMode: Boolean = true): Builder<T> {\n                    settings.add(GenerateCodegenComments(debugMode))\n                    return this\n                }\n\n                abstract fun build(): T\n\n                override fun toObjectNode(): ObjectNode = build().toObjectNode()\n            }\n\n            // Core settings that are common to both Servers and Clients should be defined here.\n            data class GenerateCodegenComments(val debugMode: Boolean) : AdditionalSettings() {\n                override fun toObjectNode(): ObjectNode =\n                    ObjectNode.builder()\n                        .withMember(\"debugMode\", debugMode)\n                        .build()\n            }\n        }\n}\n\nclass ClientAdditionalSettings private constructor(settings: List<AdditionalSettings>) :\n    AdditionalSettings.CoreAdditionalSettings(settings) {\n        class Builder : CoreAdditionalSettings.Builder<ClientAdditionalSettings>() {\n            override fun build(): ClientAdditionalSettings = ClientAdditionalSettings(settings)\n        }\n\n        // Additional settings that are specific to client generation should be defined here.\n\n        companion object {\n            fun builder() = Builder()\n        }\n    }\n\nclass ServerAdditionalSettings private constructor(settings: List<AdditionalSettings>) :\n    AdditionalSettings.CoreAdditionalSettings(settings) {\n        class Builder : CoreAdditionalSettings.Builder<ServerAdditionalSettings>() {\n            fun publicConstrainedTypes(enabled: Boolean = true): Builder {\n                settings.add(PublicConstrainedTypes(enabled))\n                return this\n            }\n\n            fun addValidationExceptionToConstrainedOperations(enabled: Boolean = true): Builder {\n                settings.add(AddValidationExceptionToConstrainedOperations(enabled))\n                return this\n            }\n\n            fun alwaysSendEventStreamInitialResponse(enabled: Boolean = true): Builder {\n                settings.add(AlwaysSendEventStreamInitialResponse(enabled))\n                return this\n            }\n\n            fun withHttp1x(enabled: Boolean = true): Builder {\n                settings.add(Http1x(enabled))\n                return this\n            }\n\n            override fun build(): ServerAdditionalSettings = ServerAdditionalSettings(settings)\n        }\n\n        private data class PublicConstrainedTypes(val enabled: Boolean) : AdditionalSettings() {\n            override fun toObjectNode(): ObjectNode =\n                ObjectNode.builder()\n                    .withMember(\"publicConstrainedTypes\", enabled)\n                    .build()\n        }\n\n        private data class AddValidationExceptionToConstrainedOperations(val enabled: Boolean) : AdditionalSettings() {\n            override fun toObjectNode(): ObjectNode =\n                ObjectNode.builder()\n                    .withMember(\"addValidationExceptionToConstrainedOperations\", enabled)\n                    .build()\n        }\n\n        private data class AlwaysSendEventStreamInitialResponse(val enabled: Boolean) : AdditionalSettings() {\n            override fun toObjectNode(): ObjectNode =\n                ObjectNode.builder()\n                    .withMember(\"alwaysSendEventStreamInitialResponse\", enabled)\n                    .build()\n        }\n\n        private data class Http1x(val enabled: Boolean) : AdditionalSettings() {\n            override fun toObjectNode(): ObjectNode =\n                ObjectNode.builder()\n                    .withMember(\"http-1x\", enabled)\n                    .build()\n        }\n\n        companion object {\n            fun builder() = Builder()\n        }\n    }\n\n/**\n * Run cargo test on a true, end-to-end, codegen product of a given model.\n */\nfun codegenIntegrationTest(\n    model: Model,\n    params: IntegrationTestParams,\n    invokePlugin: (PluginContext) -> Unit,\n    environment: Map<String, String> = mapOf(),\n): Path {\n    val (ctx, testDir) =\n        generatePluginContext(\n            model,\n            params.additionalSettings,\n            params.moduleVersion,\n            params.service,\n            params.runtimeConfig,\n            params.overrideTestDir,\n        )\n\n    testDir.writeDotCargoConfigToml(listOf(\"--deny\", \"warnings\"))\n\n    invokePlugin(ctx)\n    ctx.fileManifest.printGeneratedFiles()\n    val logger = Logger.getLogger(\"CodegenIntegrationTest\")\n    val out =\n        params.command?.invoke(testDir) ?: (params.cargoCommand ?: \"cargo test --lib --tests\").runCommand(\n            testDir,\n            environment = environment,\n        )\n    logger.fine(out.toString())\n    return testDir\n}\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/DefaultBuilderInstantiator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.testutil\n\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.BuilderGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.BuilderInstantiator\n\n/**\n * A Default instantiator that uses `builder.build()` in all cases. This exists to support tests in codegen-core\n * and to serve as the base behavior for client and server instantiators.\n */\nclass DefaultBuilderInstantiator(private val checkFallibleBuilder: Boolean, private val symbolProvider: RustSymbolProvider) : BuilderInstantiator {\n    override fun setField(\n        builder: String,\n        value: Writable,\n        field: MemberShape,\n    ): Writable {\n        return setFieldWithSetter(builder, value, field)\n    }\n\n    override fun finalizeBuilder(\n        builder: String,\n        shape: StructureShape,\n        mapErr: Writable?,\n    ): Writable {\n        return writable {\n            rust(\"builder.build()\")\n            if (checkFallibleBuilder && BuilderGenerator.hasFallibleBuilder(shape, symbolProvider)) {\n                if (mapErr != null) {\n                    rust(\".map_err(#T)\", mapErr)\n                }\n                rust(\"?\")\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/EventStreamMarshallTestCases.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.testutil\n\nimport org.intellij.lang.annotations.Language\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.DependencyScope\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenContext\nimport software.amazon.smithy.rust.codegen.core.util.dq\nimport software.amazon.smithy.rust.codegen.core.util.lookup\n\nobject EventStreamMarshallTestCases {\n    fun RustWriter.writeMarshallTestCases(\n        codegenContext: CodegenContext,\n        testCase: EventStreamTestModels.TestCase,\n        optionalBuilderInputs: Boolean,\n    ) {\n        val generator = \"crate::event_stream_serde::TestStreamMarshaller\"\n\n        val protocolTestHelpers =\n            CargoDependency.smithyProtocolTestHelpers(TestRuntimeConfig)\n                .copy(scope = DependencyScope.Compile)\n\n        fun builderInput(\n            @Language(\"Rust\", prefix = \"macro_rules! foo { () =>  {{\\n\", suffix = \"\\n}}}\")\n            input: String,\n            vararg ctx: Pair<String, Any>,\n        ): Writable = conditionalBuilderInput(input, conditional = optionalBuilderInputs, ctx = ctx)\n\n        val typesModule = codegenContext.symbolProvider.moduleForShape(codegenContext.model.lookup(\"test#TestStruct\"))\n        rustTemplate(\n            \"\"\"\n            use aws_smithy_eventstream::frame::MarshallMessage;\n            use aws_smithy_types::event_stream::{Message, Header, HeaderValue};\n            use std::collections::HashMap;\n            use aws_smithy_types::{Blob, DateTime};\n            use ${typesModule.fullyQualifiedPath()}::*;\n\n            use #{validate_body};\n            use #{MediaType};\n\n            fn headers_to_map<'a>(headers: &'a [Header]) -> HashMap<String, &'a HeaderValue> {\n                let mut map = HashMap::new();\n                for header in headers {\n                    map.insert(header.name().as_str().to_string(), header.value());\n                }\n                map\n            }\n\n            fn str_header(value: &'static str) -> HeaderValue {\n                HeaderValue::String(value.into())\n            }\n            \"\"\",\n            \"validate_body\" to protocolTestHelpers.toType().resolve(\"validate_body\"),\n            \"MediaType\" to protocolTestHelpers.toType().resolve(\"MediaType\"),\n        )\n\n        unitTest(\"message_with_blob\") {\n            rustTemplate(\n                \"\"\"\n                let event = TestStream::MessageWithBlob(\n                    MessageWithBlob::builder().data(#{BlobInput:W}).build()\n                );\n                let result = $generator::new().marshall(event);\n                assert!(result.is_ok(), \"expected ok, got: {:?}\", result);\n                let message = result.unwrap();\n                let headers = headers_to_map(message.headers());\n                assert_eq!(&str_header(\"event\"), *headers.get(\":message-type\").unwrap());\n                assert_eq!(&str_header(\"MessageWithBlob\"), *headers.get(\":event-type\").unwrap());\n                assert_eq!(&str_header(\"application/octet-stream\"), *headers.get(\":content-type\").unwrap());\n                assert_eq!(&b\"hello, world!\"[..], message.payload());\n                \"\"\",\n                \"BlobInput\" to builderInput(\"Blob::new(&b\\\"hello, world!\\\"[..])\"),\n            )\n        }\n\n        unitTest(\"message_with_string\") {\n            rustTemplate(\n                \"\"\"\n                let event = TestStream::MessageWithString(\n                    MessageWithString::builder().data(#{StringInput}).build()\n                );\n                let result = $generator::new().marshall(event);\n                assert!(result.is_ok(), \"expected ok, got: {:?}\", result);\n                let message = result.unwrap();\n                let headers = headers_to_map(message.headers());\n                assert_eq!(&str_header(\"event\"), *headers.get(\":message-type\").unwrap());\n                assert_eq!(&str_header(\"MessageWithString\"), *headers.get(\":event-type\").unwrap());\n                assert_eq!(&str_header(\"text/plain\"), *headers.get(\":content-type\").unwrap());\n                assert_eq!(&b\"hello, world!\"[..], message.payload());\n                \"\"\",\n                \"StringInput\" to builderInput(\"\\\"hello, world!\\\"\"),\n            )\n        }\n\n        unitTest(\"message_with_struct\") {\n            rustTemplate(\n                \"\"\"\n                let event = TestStream::MessageWithStruct(\n                    MessageWithStruct::builder().some_struct(#{StructInput}).build()\n                );\n                let result = $generator::new().marshall(event);\n                assert!(result.is_ok(), \"expected ok, got: {:?}\", result);\n                let message = result.unwrap();\n                let headers = headers_to_map(message.headers());\n                assert_eq!(&str_header(\"event\"), *headers.get(\":message-type\").unwrap());\n                assert_eq!(&str_header(\"MessageWithStruct\"), *headers.get(\":event-type\").unwrap());\n                assert_eq!(&str_header(${testCase.eventStreamMessageContentType.dq()}), *headers.get(\":content-type\").unwrap());\n\n                validate_body(\n                    message.payload(),\n                    ${testCase.validTestStruct.dq()},\n                    MediaType::from(${testCase.mediaType.dq()})\n                ).unwrap();\n                \"\"\",\n                \"StructInput\" to\n                    builderInput(\n                        \"\"\"\n                        TestStruct::builder()\n                            .some_string(#{StringInput})\n                            .some_int(#{IntInput})\n                            .build()\n                        \"\"\",\n                        \"IntInput\" to builderInput(\"5\"),\n                        \"StringInput\" to builderInput(\"\\\"hello\\\"\"),\n                    ),\n            )\n        }\n\n        unitTest(\"message_with_union\") {\n            rustTemplate(\n                \"\"\"\n                let event = TestStream::MessageWithUnion(MessageWithUnion::builder()\n                    .some_union(#{UnionInput})\n                    .build()\n                );\n                let result = $generator::new().marshall(event);\n                assert!(result.is_ok(), \"expected ok, got: {:?}\", result);\n                let message = result.unwrap();\n                let headers = headers_to_map(message.headers());\n                assert_eq!(&str_header(\"event\"), *headers.get(\":message-type\").unwrap());\n                assert_eq!(&str_header(\"MessageWithUnion\"), *headers.get(\":event-type\").unwrap());\n                assert_eq!(&str_header(${testCase.eventStreamMessageContentType.dq()}), *headers.get(\":content-type\").unwrap());\n\n                validate_body(\n                    message.payload(),\n                    ${testCase.validTestUnion.dq()},\n                    MediaType::from(${testCase.mediaType.dq()})\n                ).unwrap();\n                \"\"\",\n                \"UnionInput\" to builderInput(\"TestUnion::Foo(\\\"hello\\\".into())\"),\n            )\n        }\n\n        unitTest(\"message_with_headers\") {\n            rustTemplate(\n                \"\"\"\n                let event = TestStream::MessageWithHeaders(MessageWithHeaders::builder()\n                    .blob(#{BlobInput})\n                    .boolean(#{BooleanInput})\n                    .byte(#{ByteInput})\n                    .int(#{IntInput})\n                    .long(#{LongInput})\n                    .short(#{ShortInput})\n                    .string(#{StringInput})\n                    .timestamp(#{TimestampInput})\n                    .build()\n                );\n                let result = $generator::new().marshall(event);\n                assert!(result.is_ok(), \"expected ok, got: {:?}\", result);\n                let actual_message = result.unwrap();\n                let expected_message = Message::new(&b\"\"[..])\n                    .add_header(Header::new(\":message-type\", HeaderValue::String(\"event\".into())))\n                    .add_header(Header::new(\":event-type\", HeaderValue::String(\"MessageWithHeaders\".into())))\n                    .add_header(Header::new(\"blob\", HeaderValue::ByteArray((&b\"test\"[..]).into())))\n                    .add_header(Header::new(\"boolean\", HeaderValue::Bool(true)))\n                    .add_header(Header::new(\"byte\", HeaderValue::Byte(55i8)))\n                    .add_header(Header::new(\"int\", HeaderValue::Int32(100_000i32)))\n                    .add_header(Header::new(\"long\", HeaderValue::Int64(9_000_000_000i64)))\n                    .add_header(Header::new(\"short\", HeaderValue::Int16(16_000i16)))\n                    .add_header(Header::new(\"string\", HeaderValue::String(\"test\".into())))\n                    .add_header(Header::new(\"timestamp\", HeaderValue::Timestamp(DateTime::from_secs(5))));\n                assert_eq!(expected_message, actual_message);\n                \"\"\",\n                \"BlobInput\" to builderInput(\"Blob::new(&b\\\"test\\\"[..])\"),\n                \"BooleanInput\" to builderInput(\"true\"),\n                \"ByteInput\" to builderInput(\"55i8\"),\n                \"IntInput\" to builderInput(\"100_000i32\"),\n                \"LongInput\" to builderInput(\"9_000_000_000i64\"),\n                \"ShortInput\" to builderInput(\"16_000i16\"),\n                \"StringInput\" to builderInput(\"\\\"test\\\"\"),\n                \"TimestampInput\" to builderInput(\"DateTime::from_secs(5)\"),\n            )\n        }\n\n        unitTest(\"message_with_header_and_payload\") {\n            rustTemplate(\n                \"\"\"\n                let event = TestStream::MessageWithHeaderAndPayload(MessageWithHeaderAndPayload::builder()\n                    .header(#{HeaderInput})\n                    .payload(#{PayloadInput})\n                    .build()\n                );\n                let result = $generator::new().marshall(event);\n                assert!(result.is_ok(), \"expected ok, got: {:?}\", result);\n                let actual_message = result.unwrap();\n                let expected_message = Message::new(&b\"payload\"[..])\n                    .add_header(Header::new(\":message-type\", HeaderValue::String(\"event\".into())))\n                    .add_header(Header::new(\":event-type\", HeaderValue::String(\"MessageWithHeaderAndPayload\".into())))\n                    .add_header(Header::new(\"header\", HeaderValue::String(\"header\".into())))\n                    .add_header(Header::new(\":content-type\", HeaderValue::String(\"application/octet-stream\".into())));\n                assert_eq!(expected_message, actual_message);\n                \"\"\",\n                \"HeaderInput\" to builderInput(\"\\\"header\\\"\"),\n                \"PayloadInput\" to builderInput(\"Blob::new(&b\\\"payload\\\"[..])\"),\n            )\n        }\n\n        unitTest(\"message_with_no_header_payload_traits\") {\n            rustTemplate(\n                \"\"\"\n                let event = TestStream::MessageWithNoHeaderPayloadTraits(MessageWithNoHeaderPayloadTraits::builder()\n                    .some_int(#{IntInput})\n                    .some_string(#{StringInput})\n                    .build()\n                );\n                let result = $generator::new().marshall(event);\n                assert!(result.is_ok(), \"expected ok, got: {:?}\", result);\n                let message = result.unwrap();\n                let headers = headers_to_map(message.headers());\n                assert_eq!(&str_header(\"event\"), *headers.get(\":message-type\").unwrap());\n                assert_eq!(&str_header(\"MessageWithNoHeaderPayloadTraits\"), *headers.get(\":event-type\").unwrap());\n                assert_eq!(&str_header(${testCase.eventStreamMessageContentType.dq()}), *headers.get(\":content-type\").unwrap());\n\n                validate_body(\n                    message.payload(),\n                    ${testCase.validMessageWithNoHeaderPayloadTraits.dq()},\n                    MediaType::from(${testCase.mediaType.dq()})\n                ).unwrap();\n                \"\"\",\n                \"IntInput\" to builderInput(\"5\"),\n                \"StringInput\" to builderInput(\"\\\"hello\\\"\"),\n            )\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/EventStreamTestModels.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.testutil\n\nimport com.fasterxml.jackson.databind.ObjectMapper\nimport com.fasterxml.jackson.dataformat.cbor.CBORFactory\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenContext\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.AwsJson\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.AwsJsonVersion\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.Protocol\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.RestJson\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.RestXml\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.RpcV2Cbor\nimport java.util.Base64\n\nprivate fun fillInBaseModel(\n    namespacedProtocolName: String,\n    extraServiceAnnotations: String = \"\",\n    nonEventStreamMembers: String = \"\",\n    extraEventHeaderMembers: String = \"\",\n    extraShapes: String = \"\",\n): String =\n    \"\"\"\n    ${\"\\$version: \\\"2\\\"\"}\n    namespace test\n\n    use smithy.framework#ValidationException\n    use $namespacedProtocolName\n\n    union TestUnion {\n        Foo: String,\n        Bar: Integer,\n    }\n    structure TestStruct {\n        someString: String,\n        someInt: Integer,\n    }\n\n    @error(\"client\")\n    structure SomeError {\n        Message: String,\n    }\n\n    $extraShapes\n\n    structure MessageWithBlob { @eventPayload data: Blob }\n    structure MessageWithString { @eventPayload data: String }\n    structure MessageWithStruct { @eventPayload someStruct: TestStruct }\n    structure MessageWithUnion { @eventPayload someUnion: TestUnion }\n    structure MessageWithHeaders {\n        @eventHeader blob: Blob,\n        @eventHeader boolean: Boolean,\n        @eventHeader byte: Byte,\n        @eventHeader int: Integer,\n        @eventHeader long: Long,\n        @eventHeader short: Short,\n        @eventHeader string: String,\n        @eventHeader timestamp: Timestamp,\n        $extraEventHeaderMembers\n    }\n    structure MessageWithHeaderAndPayload {\n        @eventHeader header: String,\n        @eventPayload payload: Blob,\n    }\n    structure MessageWithNoHeaderPayloadTraits {\n        someInt: Integer,\n        someString: String,\n    }\n\n    @streaming\n    union TestStream {\n        MessageWithBlob: MessageWithBlob,\n        MessageWithString: MessageWithString,\n        MessageWithStruct: MessageWithStruct,\n        MessageWithUnion: MessageWithUnion,\n        MessageWithHeaders: MessageWithHeaders,\n        MessageWithHeaderAndPayload: MessageWithHeaderAndPayload,\n        MessageWithNoHeaderPayloadTraits: MessageWithNoHeaderPayloadTraits,\n        SomeError: SomeError,\n    }\n\n    structure TestStreamInputOutput {\n        $nonEventStreamMembers\n\n        @required\n        @httpPayload\n        value: TestStream\n    }\n\n    @http(method: \"POST\", uri: \"/test\")\n    operation TestStreamOp {\n        input: TestStreamInputOutput,\n        output: TestStreamInputOutput,\n        errors: [SomeError, ValidationException],\n    }\n\n    $extraServiceAnnotations\n    @${namespacedProtocolName.substringAfter(\"#\")}\n    service TestService { version: \"123\", operations: [TestStreamOp] }\n    \"\"\"\n\nobject EventStreamTestModels {\n    private fun restJson1(): Model = fillInBaseModel(\"aws.protocols#restJson1\").asSmithyModel()\n\n    private fun restXml(): Model = fillInBaseModel(\"aws.protocols#restXml\").asSmithyModel()\n\n    private fun awsJson11(): Model = fillInBaseModel(\"aws.protocols#awsJson1_1\").asSmithyModel()\n\n    private fun rpcv2Cbor(): Model = fillInBaseModel(\"smithy.protocols#rpcv2Cbor\").asSmithyModel()\n\n    // Event streams are not supported in AWS query or EC2 query\n    // See Important in https://smithy.io/2.0/aws/protocols/aws-query-protocol.html where it states\n    // \"This protocol does not support any kind of streaming requests or responses, including event streams.\"\n\n    data class TestCase(\n        val protocolShapeId: String,\n        val model: Model,\n        val mediaType: String,\n        val accept: String,\n        val requestContentType: String,\n        val responseContentType: String,\n        val eventStreamMessageContentType: String,\n        val eventStreamInitialResponsePayload: String? = null,\n        val validTestStruct: String,\n        val validMessageWithNoHeaderPayloadTraits: String,\n        val validTestUnion: String,\n        val validSomeError: String,\n        val validUnmodeledError: String,\n        val protocolBuilder: (CodegenContext) -> Protocol,\n    ) {\n        override fun toString(): String = protocolShapeId\n\n        fun withNonEventStreamMembers(nonEventStreamMembers: String): TestCase =\n            this.copy(model = fillInBaseModel(this.protocolShapeId, \"\", nonEventStreamMembers).asSmithyModel())\n\n        // Server doesn't support enum members in event streams, so this util allows Clients to test with those shapes\n        fun withEnumMembers(): TestCase =\n            this.copy(\n                model =\n                    fillInBaseModel(\n                        this.protocolShapeId,\n                        extraEventHeaderMembers = \"@eventHeader enum: TheEnum,\\n@eventHeader intEnum: FaceCard,\",\n                        extraShapes = \"\"\"    enum TheEnum {\n                            FOO\n                            BAR\n                            }\n\n                            intEnum FaceCard {\n                            JACK = 1\n                            QUEEN = 2\n                            KING = 3\n                                            }\"\"\",\n                    ).asSmithyModel(),\n            )\n    }\n\n    private fun base64Encode(input: ByteArray): String {\n        val encodedBytes = Base64.getEncoder().encode(input)\n        return String(encodedBytes)\n    }\n\n    private fun createCborFromJson(jsonString: String): ByteArray {\n        val jsonMapper = ObjectMapper()\n        val cborMapper = ObjectMapper(CBORFactory())\n        // Parse JSON string to a generic type.\n        val jsonData = jsonMapper.readValue(jsonString, Any::class.java)\n        // Convert the parsed data to CBOR.\n        return cborMapper.writeValueAsBytes(jsonData)\n    }\n\n    fun base64EncodeJson(jsonString: String) = base64Encode(createCborFromJson(jsonString))\n\n    private val restJsonTestCase =\n        TestCase(\n            protocolShapeId = \"aws.protocols#restJson1\",\n            model = restJson1(),\n            accept = \"application/json\",\n            mediaType = \"application/json\",\n            requestContentType = \"application/vnd.amazon.eventstream\",\n            responseContentType = \"application/json\",\n            eventStreamMessageContentType = \"application/json\",\n            validTestStruct = \"\"\"{\"someString\":\"hello\",\"someInt\":5}\"\"\",\n            validMessageWithNoHeaderPayloadTraits = \"\"\"{\"someString\":\"hello\",\"someInt\":5}\"\"\",\n            validTestUnion = \"\"\"{\"Foo\":\"hello\"}\"\"\",\n            validSomeError = \"\"\"{\"Message\":\"some error\"}\"\"\",\n            validUnmodeledError = \"\"\"{\"Message\":\"unmodeled error\"}\"\"\",\n        ) { RestJson(it) }\n\n    val TEST_CASES =\n        listOf(\n            //\n            // restJson1\n            //\n            restJsonTestCase,\n            //\n            // rpcV2Cbor\n            //\n            restJsonTestCase.copy(\n                protocolShapeId = \"smithy.protocols#rpcv2Cbor\",\n                model = rpcv2Cbor(),\n                // application/cbor is appended for backward compatibility with servers that only handle application/cbor\n                // https://github.com/smithy-lang/smithy-rs/pull/4427#issuecomment-3602558313\n                accept = \"application/vnd.amazon.eventstream, application/cbor\",\n                mediaType = \"application/cbor\",\n                requestContentType = \"application/vnd.amazon.eventstream\",\n                responseContentType = \"application/cbor\",\n                eventStreamMessageContentType = \"application/cbor\",\n                validTestStruct = base64EncodeJson(restJsonTestCase.validTestStruct),\n                validMessageWithNoHeaderPayloadTraits = base64EncodeJson(restJsonTestCase.validMessageWithNoHeaderPayloadTraits),\n                validTestUnion = base64EncodeJson(restJsonTestCase.validTestUnion),\n                validSomeError = base64EncodeJson(restJsonTestCase.validSomeError),\n                validUnmodeledError = base64EncodeJson(restJsonTestCase.validUnmodeledError),\n                protocolBuilder = { RpcV2Cbor(it) },\n            ),\n            //\n            // awsJson1_1\n            //\n            restJsonTestCase.copy(\n                protocolShapeId = \"aws.protocols#awsJson1_1\",\n                model = awsJson11(),\n                mediaType = \"application/x-amz-json-1.1\",\n                requestContentType = \"application/x-amz-json-1.1\",\n                responseContentType = \"application/x-amz-json-1.1\",\n                eventStreamMessageContentType = \"application/json\",\n            ) { AwsJson(it, AwsJsonVersion.Json11) },\n            //\n            // restXml\n            //\n            TestCase(\n                protocolShapeId = \"aws.protocols#restXml\",\n                model = restXml(),\n                accept = \"application/xml\",\n                mediaType = \"application/xml\",\n                requestContentType = \"application/vnd.amazon.eventstream\",\n                responseContentType = \"application/xml\",\n                eventStreamMessageContentType = \"application/xml\",\n                validTestStruct =\n                    \"\"\"\n                    <TestStruct>\n                        <someString>hello</someString>\n                        <someInt>5</someInt>\n                    </TestStruct>\n                    \"\"\".trimIndent(),\n                validMessageWithNoHeaderPayloadTraits =\n                    \"\"\"\n                    <MessageWithNoHeaderPayloadTraits>\n                        <someString>hello</someString>\n                        <someInt>5</someInt>\n                    </MessageWithNoHeaderPayloadTraits>\n                    \"\"\".trimIndent(),\n                validTestUnion = \"<TestUnion><Foo>hello</Foo></TestUnion>\",\n                validSomeError =\n                    \"\"\"\n                    <ErrorResponse>\n                        <Error>\n                            <Type>SomeError</Type>\n                            <Code>SomeError</Code>\n                            <Message>some error</Message>\n                        </Error>\n                    </ErrorResponse>\n                    \"\"\".trimIndent(),\n                validUnmodeledError =\n                    \"\"\"\n                    <ErrorResponse>\n                        <Error>\n                            <Type>UnmodeledError</Type>\n                            <Code>UnmodeledError</Code>\n                            <Message>unmodeled error</Message>\n                        </Error>\n                    </ErrorResponse>\n                    \"\"\".trimIndent(),\n            ) { RestXml(it) },\n        )\n}\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/EventStreamUnmarshallTestCases.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.testutil\n\nimport org.intellij.lang.annotations.Language\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.conditionalBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenContext\nimport software.amazon.smithy.rust.codegen.core.util.lookup\nimport java.util.Base64\n\nobject EventStreamUnmarshallTestCases {\n    fun RustWriter.writeUnmarshallTestUtil(codegenContext: CodegenContext) {\n        val testStreamError =\n            codegenContext.symbolProvider.symbolForEventStreamError(codegenContext.model.lookup(\"test#TestStream\"))\n        val typesModule = codegenContext.symbolProvider.moduleForShape(codegenContext.model.lookup(\"test#TestStruct\"))\n\n        rust(\n            \"\"\"\n            use aws_smithy_eventstream::frame::{UnmarshallMessage, UnmarshalledMessage};\n            use aws_smithy_types::event_stream::{Header, HeaderValue, Message};\n            use aws_smithy_types::{Blob, DateTime};\n            use $testStreamError;\n            use ${typesModule.fullyQualifiedPath()}::*;\n\n            fn msg(\n                message_type: &'static str,\n                event_type: &'static str,\n                content_type: &'static str,\n                payload: &'static [u8],\n            ) -> Message {\n                let message = Message::new(payload)\n                    .add_header(Header::new(\":message-type\", HeaderValue::String(message_type.into())))\n                    .add_header(Header::new(\":content-type\", HeaderValue::String(content_type.into())));\n                if message_type == \"event\" {\n                    message.add_header(Header::new(\":event-type\", HeaderValue::String(event_type.into())))\n                } else {\n                    message.add_header(Header::new(\":exception-type\", HeaderValue::String(event_type.into())))\n                }\n            }\n            fn expect_event<T: std::fmt::Debug, E: std::fmt::Debug>(unmarshalled: UnmarshalledMessage<T, E>) -> T {\n                match unmarshalled {\n                    UnmarshalledMessage::Event(event) => event,\n                    _ => panic!(\"expected event, got: {:?}\", unmarshalled),\n                }\n            }\n            fn expect_error<T: std::fmt::Debug, E: std::fmt::Debug>(unmarshalled: UnmarshalledMessage<T, E>) -> E {\n                match unmarshalled {\n                    UnmarshalledMessage::Error(error) => error,\n                    _ => panic!(\"expected error, got: {:?}\", unmarshalled),\n                }\n            }\n            \"\"\",\n        )\n    }\n\n    fun RustWriter.writeUnmarshallTestCases(\n        codegenContext: CodegenContext,\n        testCase: EventStreamTestModels.TestCase,\n        optionalBuilderInputs: Boolean = false,\n    ) {\n        val generator = \"crate::event_stream_serde::TestStreamUnmarshaller\"\n        writeUnmarshallTestUtil(codegenContext)\n\n        unitTest(\"message_with_blob\") {\n            rustTemplate(\n                \"\"\"\n                let message = msg(\"event\", \"MessageWithBlob\", \"application/octet-stream\", b\"hello, world!\");\n                let result = $generator::new().unmarshall(&message);\n                assert!(result.is_ok(), \"expected ok, got: {:?}\", result);\n                assert_eq!(\n                    TestStream::MessageWithBlob(\n                        MessageWithBlob::builder().data(#{DataInput:W}).build()\n                    ),\n                    expect_event(result.unwrap())\n                );\n                \"\"\",\n                \"DataInput\" to\n                    conditionalBuilderInput(\n                        \"\"\"\n                        Blob::new(&b\"hello, world!\"[..])\n                        \"\"\",\n                        conditional = optionalBuilderInputs,\n                    ),\n            )\n        }\n\n        unitTest(\"message_with_string\") {\n            rustTemplate(\n                \"\"\"\n                let message = msg(\"event\", \"MessageWithString\", \"text/plain\", b\"hello, world!\");\n                let result = $generator::new().unmarshall(&message);\n                assert!(result.is_ok(), \"expected ok, got: {:?}\", result);\n                assert_eq!(\n                    TestStream::MessageWithString(MessageWithString::builder().data(#{DataInput}).build()),\n                    expect_event(result.unwrap())\n                );\n                \"\"\",\n                \"DataInput\" to conditionalBuilderInput(\"\\\"hello, world!\\\"\", conditional = optionalBuilderInputs),\n            )\n        }\n\n        unitTest(\"message_with_struct\") {\n            rustTemplate(\n                \"\"\"\n                let message = msg(\n                    \"event\",\n                    \"MessageWithStruct\",\n                    \"${testCase.responseContentType}\",\n                    ${testCase.generateRustPayloadInitializer(testCase.validTestStruct)}\n                );\n                let result = $generator::new().unmarshall(&message);\n                assert!(result.is_ok(), \"expected ok, got: {:?}\", result);\n                assert_eq!(\n                    TestStream::MessageWithStruct(MessageWithStruct::builder().some_struct(#{StructInput}).build()),\n                    expect_event(result.unwrap())\n                );\n                \"\"\",\n                \"StructInput\" to\n                    conditionalBuilderInput(\n                        \"\"\"\n                        TestStruct::builder()\n                            .some_string(#{StringInput})\n                            .some_int(#{IntInput})\n                            .build()\n                        \"\"\",\n                        conditional = optionalBuilderInputs,\n                        \"StringInput\" to conditionalBuilderInput(\"\\\"hello\\\"\", conditional = optionalBuilderInputs),\n                        \"IntInput\" to conditionalBuilderInput(\"5\", conditional = optionalBuilderInputs),\n                    ),\n            )\n        }\n\n        unitTest(\"message_with_union\") {\n            rustTemplate(\n                \"\"\"\n                let message = msg(\n                    \"event\",\n                    \"MessageWithUnion\",\n                    \"${testCase.responseContentType}\",\n                    ${testCase.generateRustPayloadInitializer(testCase.validTestUnion)}\n                );\n                let result = $generator::new().unmarshall(&message);\n                assert!(result.is_ok(), \"expected ok, got: {:?}\", result);\n                assert_eq!(\n                    TestStream::MessageWithUnion(MessageWithUnion::builder().some_union(#{UnionInput}).build()),\n                    expect_event(result.unwrap())\n                );\n                \"\"\",\n                \"UnionInput\" to conditionalBuilderInput(\"TestUnion::Foo(\\\"hello\\\".into())\", conditional = optionalBuilderInputs),\n            )\n        }\n\n        unitTest(\"message_with_headers\") {\n            rustTemplate(\n                \"\"\"\n                let message = msg(\"event\", \"MessageWithHeaders\", \"application/octet-stream\", b\"\")\n                    .add_header(Header::new(\"blob\", HeaderValue::ByteArray((&b\"test\"[..]).into())))\n                    .add_header(Header::new(\"boolean\", HeaderValue::Bool(true)))\n                    .add_header(Header::new(\"byte\", HeaderValue::Byte(55i8)))\n                    .add_header(Header::new(\"int\", HeaderValue::Int32(100_000i32)))\n                    .add_header(Header::new(\"long\", HeaderValue::Int64(9_000_000_000i64)))\n                    .add_header(Header::new(\"short\", HeaderValue::Int16(16_000i16)))\n                    .add_header(Header::new(\"string\", HeaderValue::String(\"test\".into())))\n                    .add_header(Header::new(\"timestamp\", HeaderValue::Timestamp(DateTime::from_secs(5))));\n                let result = $generator::new().unmarshall(&message);\n                assert!(result.is_ok(), \"expected ok, got: {:?}\", result);\n                assert_eq!(\n                    TestStream::MessageWithHeaders(MessageWithHeaders::builder()\n                        .blob(#{BlobInput})\n                        .boolean(#{BoolInput})\n                        .byte(#{ByteInput})\n                        .int(#{IntInput})\n                        .long(#{LongInput})\n                        .short(#{ShortInput})\n                        .string(#{StringInput})\n                        .timestamp(#{TimestampInput})\n                        .build()\n                    ),\n                    expect_event(result.unwrap())\n                );\n                \"\"\",\n                \"BlobInput\" to conditionalBuilderInput(\"Blob::new(&b\\\"test\\\"[..])\", conditional = optionalBuilderInputs),\n                \"BoolInput\" to conditionalBuilderInput(\"true\", conditional = optionalBuilderInputs),\n                \"ByteInput\" to conditionalBuilderInput(\"55i8\", conditional = optionalBuilderInputs),\n                \"IntInput\" to conditionalBuilderInput(\"100_000i32\", conditional = optionalBuilderInputs),\n                \"LongInput\" to conditionalBuilderInput(\"9_000_000_000i64\", conditional = optionalBuilderInputs),\n                \"ShortInput\" to conditionalBuilderInput(\"16_000i16\", conditional = optionalBuilderInputs),\n                \"StringInput\" to conditionalBuilderInput(\"\\\"test\\\"\", conditional = optionalBuilderInputs),\n                \"TimestampInput\" to conditionalBuilderInput(\"DateTime::from_secs(5)\", conditional = optionalBuilderInputs),\n            )\n        }\n\n        unitTest(\"message_with_header_and_payload\") {\n            rustTemplate(\n                \"\"\"\n                let message = msg(\"event\", \"MessageWithHeaderAndPayload\", \"application/octet-stream\", b\"payload\")\n                    .add_header(Header::new(\"header\", HeaderValue::String(\"header\".into())));\n                let result = $generator::new().unmarshall(&message);\n                assert!(result.is_ok(), \"expected ok, got: {:?}\", result);\n                assert_eq!(\n                    TestStream::MessageWithHeaderAndPayload(MessageWithHeaderAndPayload::builder()\n                        .header(#{HeaderInput})\n                        .payload(#{PayloadInput})\n                        .build()\n                    ),\n                    expect_event(result.unwrap())\n                );\n                \"\"\",\n                \"HeaderInput\" to conditionalBuilderInput(\"\\\"header\\\"\", conditional = optionalBuilderInputs),\n                \"PayloadInput\" to conditionalBuilderInput(\"Blob::new(&b\\\"payload\\\"[..])\", conditional = optionalBuilderInputs),\n            )\n        }\n\n        unitTest(\"message_with_no_header_payload_traits\") {\n            rustTemplate(\n                \"\"\"\n                let message = msg(\n                    \"event\",\n                    \"MessageWithNoHeaderPayloadTraits\",\n                    \"${testCase.responseContentType}\",\n                    ${testCase.generateRustPayloadInitializer(testCase.validMessageWithNoHeaderPayloadTraits)}\n                );\n                let result = $generator::new().unmarshall(&message);\n                assert!(result.is_ok(), \"expected ok, got: {:?}\", result);\n                assert_eq!(\n                    TestStream::MessageWithNoHeaderPayloadTraits(MessageWithNoHeaderPayloadTraits::builder()\n                        .some_int(#{IntInput})\n                        .some_string(#{StringInput})\n                        .build()\n                    ),\n                    expect_event(result.unwrap())\n                );\n                \"\"\",\n                \"IntInput\" to conditionalBuilderInput(\"5\", conditional = optionalBuilderInputs),\n                \"StringInput\" to conditionalBuilderInput(\"\\\"hello\\\"\", conditional = optionalBuilderInputs),\n            )\n        }\n\n        unitTest(\"some_error\") {\n            rustTemplate(\n                \"\"\"\n                let message = msg(\n                    \"exception\",\n                    \"SomeError\",\n                    \"${testCase.responseContentType}\",\n                    ${testCase.generateRustPayloadInitializer(testCase.validSomeError)}\n                );\n                let result = $generator::new().unmarshall(&message);\n                assert!(result.is_ok(), \"expected ok, got: {:?}\", result);\n                match expect_error(result.unwrap()) {\n                    TestStreamError::SomeError(err) => assert_eq!(Some(\"some error\"), err.message()),\n                    #{AllowUnreachablePatterns:W}\n                    kind => panic!(\"expected SomeError, but got {:?}\", kind),\n                }\n                \"\"\",\n                \"AllowUnreachablePatterns\" to writable { Attribute.AllowUnreachablePatterns.render(this) },\n            )\n        }\n\n        unitTest(\n            \"bad_content_type\",\n            \"\"\"\n            let message = msg(\n                \"event\",\n                \"MessageWithBlob\",\n                \"wrong-content-type\",\n                ${testCase.generateRustPayloadInitializer(testCase.validTestStruct)}\n            );\n            let result = $generator::new().unmarshall(&message);\n            assert!(result.is_err(), \"expected error, got: {:?}\", result);\n            assert!(format!(\"{}\", result.err().unwrap()).contains(\"expected :content-type to be\"));\n            \"\"\",\n        )\n    }\n\n    /**\n     * Generates a Rust-compatible initializer string for a given payload.\n     *\n     * This function handles two different scenarios based on the event stream message content type:\n     *\n     * 1. For CBOR payloads (content type \"application/cbor\"):\n     *    - The input payload is expected to be a base64 encoded CBOR value.\n     *    - It decodes the base64 string and generates a Rust byte array initializer.\n     *    - The output format is: &[0xFFu8, 0xFFu8, ...] where FF are hexadecimal values.\n     *\n     * 2. For all other content types:\n     *    - It returns a Rust raw string literal initializer.\n     *    - The output format is: br##\"original_payload\"##\n     */\n    fun EventStreamTestModels.TestCase.generateRustPayloadInitializer(payload: String): String {\n        return if (this.eventStreamMessageContentType == \"application/cbor\") {\n            Base64.getDecoder().decode(payload)\n                .joinToString(\n                    prefix = \"&[\",\n                    postfix = \"]\",\n                    transform = { \"0x${it.toUByte().toString(16).padStart(2, '0')}u8\" },\n                )\n        } else {\n            \"\"\"\n            br##\"$payload\"##\n            \"\"\"\n        }\n    }\n}\n\ninternal fun conditionalBuilderInput(\n    @Language(\"Rust\", prefix = \"macro_rules! foo { () =>  {{\\n\", suffix = \"\\n}}}\") contents: String,\n    conditional: Boolean,\n    vararg ctx: Pair<String, Any>,\n): Writable =\n    writable {\n        conditionalBlock(\"Some(\", \".into())\", conditional = conditional) {\n            rustTemplate(contents, *ctx)\n        }\n    }\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/NamingObstacleCourseTestModels.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.testutil\n\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.traits.Trait\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\n\nobject NamingObstacleCourseTestModels {\n    private val rustPrelude = preludeScope.map { pair -> pair.first }\n\n    /**\n     * Test model that confounds the generation machinery by using operations named after every item\n     * in the Rust prelude.\n     */\n    fun rustPreludeOperationsModel(): Model =\n        StringBuilder().apply {\n            append(\n                \"\"\"\n                ${\"$\"}version: \"2.0\"\n                namespace crate\n\n                use smithy.test#httpRequestTests\n                use smithy.test#httpResponseTests\n                use aws.protocols#awsJson1_1\n                use aws.api#service\n                use smithy.framework#ValidationException\n\n                structure InputAndOutput {}\n\n                @awsJson1_1\n                @service(sdkId: \"Config\")\n                service Config {\n                    version: \"2006-03-01\",\n                    rename: { \"smithy.api#String\": \"PreludeString\" },\n                    operations: [\n                \"\"\",\n            )\n            for (item in rustPrelude) {\n                append(\"$item,\\n\")\n            }\n            append(\n                \"\"\"\n                ]\n                }\n                \"\"\",\n            )\n            for (item in rustPrelude) {\n                append(\"operation $item { input: InputAndOutput, output: InputAndOutput, errors: [ValidationException] }\\n\")\n            }\n        }.toString().asSmithyModel()\n\n    fun rustPreludeStructsModel(): Model =\n        StringBuilder().apply {\n            append(\n                \"\"\"\n                ${\"$\"}version: \"2.0\"\n                namespace crate\n\n                use smithy.test#httpRequestTests\n                use smithy.test#httpResponseTests\n                use aws.protocols#awsJson1_1\n                use aws.api#service\n                use smithy.framework#ValidationException\n\n                structure InputAndOutput {}\n\n                @awsJson1_1\n                @service(sdkId: \"Config\")\n                service Config {\n                    version: \"2006-03-01\",\n                    rename: { \"smithy.api#String\": \"PreludeString\" },\n                    operations: [\n                \"\"\",\n            )\n            for (item in rustPrelude) {\n                append(\"Use$item,\\n\")\n            }\n            append(\n                \"\"\"\n                ]\n                }\n                \"\"\",\n            )\n            for (item in rustPrelude) {\n                append(\"structure $item { $item: smithy.api#String }\\n\")\n                append(\"operation Use$item { input: $item, output: $item, errors: [ValidationException] }\\n\")\n            }\n            println(toString())\n        }.toString().asSmithyModel()\n\n    fun rustPreludeEnumsModel(): Model =\n        StringBuilder().apply {\n            append(\n                \"\"\"\n                ${\"$\"}version: \"2.0\"\n                namespace crate\n\n                use smithy.test#httpRequestTests\n                use smithy.test#httpResponseTests\n                use aws.protocols#awsJson1_1\n                use aws.api#service\n                use smithy.framework#ValidationException\n\n                structure InputAndOutput {}\n\n                @awsJson1_1\n                @service(sdkId: \"Config\")\n                service Config {\n                    version: \"2006-03-01\",\n                    rename: { \"smithy.api#String\": \"PreludeString\" },\n                    operations: [\n                \"\"\",\n            )\n            for (item in rustPrelude) {\n                append(\"Use$item,\\n\")\n            }\n            append(\n                \"\"\"\n                ]\n                }\n                \"\"\",\n            )\n            for (item in rustPrelude) {\n                append(\"enum $item { $item }\\n\")\n                append(\"structure Struct$item { $item: $item }\\n\")\n                append(\"operation Use$item { input: Struct$item, output: Struct$item, errors: [ValidationException] }\\n\")\n            }\n        }.toString().asSmithyModel()\n\n    fun rustPreludeEnumVariantsModel(): Model =\n        StringBuilder().apply {\n            append(\n                \"\"\"\n                ${\"$\"}version: \"2.0\"\n                namespace crate\n\n                use smithy.test#httpRequestTests\n                use smithy.test#httpResponseTests\n                use aws.protocols#awsJson1_1\n                use aws.api#service\n                use smithy.framework#ValidationException\n\n                @awsJson1_1\n                @service(sdkId: \"Config\")\n                service Config {\n                    version: \"2006-03-01\",\n                    rename: { \"smithy.api#String\": \"PreludeString\" },\n                    operations: [EnumOp]\n                }\n\n                operation EnumOp {\n                    input: InputAndOutput,\n                    output: InputAndOutput,\n                    errors: [ValidationException],\n                }\n\n                structure InputAndOutput {\n                    the_enum: TheEnum,\n                }\n\n                enum TheEnum {\n                \"\"\",\n            )\n            for (item in rustPrelude) {\n                append(\"$item,\\n\")\n            }\n            append(\n                \"\"\"\n                }\n                \"\"\",\n            )\n        }.toString().asSmithyModel()\n\n    /**\n     * This targets two bug classes:\n     * - operation inputs used as nested outputs\n     * - operation outputs used as nested inputs\n     */\n    fun reusedInputOutputShapesModel(protocol: Trait) =\n        \"\"\"\n        namespace test\n        use ${protocol.toShapeId()}\n        use aws.api#service\n        @${protocol.toShapeId().name}\n        @service(sdkId: \"test\")\n        service Service {\n            version: \"2006-03-01\",\n            operations: [GetThing, ReuseGetThingIO]\n        }\n\n        // re-use get thing output in a list & in an operation\n        @http(uri: \"/SomeOperation2\", method: \"POST\")\n        operation GetThing {\n            output: GetThingOutput\n            input: GetThingInput\n        }\n\n        // an operation that re-uses the input and output shapes from `GetThing` above. this has caused issues in the\n        // past with operation/input shape confusion during function signature generation\n        @http(uri: \"/SomeOperation3\", method: \"POST\")\n        operation ReuseGetThingIO {\n            input: GetThingNested\n            output: GetThingNested\n        }\n\n        structure GetThingOutput {\n            @required\n            meta: String\n        }\n\n        structure GetThingInput {\n            @required\n            meta: String\n        }\n\n        // nested structure which reuses input and output shapes internally\n        structure GetThingNested {\n            thingsOut: GetThingOutputList,\n            thingsIn: GetThingInputList,\n            thingOut: GetThingOutput,\n            thingIn: GetThingInput\n        }\n\n        list GetThingOutputList {\n            member: GetThingOutput\n        }\n        list GetThingInputList {\n            member: GetThingInput\n        }\n        \"\"\".asSmithyModel()\n}\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/Rust.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.testutil\n\nimport com.moandjiezana.toml.TomlWriter\nimport org.intellij.lang.annotations.Language\nimport software.amazon.smithy.build.FileManifest\nimport software.amazon.smithy.build.PluginContext\nimport software.amazon.smithy.codegen.core.CodegenException\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.loader.ModelAssembler\nimport software.amazon.smithy.model.node.Node\nimport software.amazon.smithy.model.node.ObjectNode\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.rust.codegen.core.generated.BuildEnvironment\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.DependencyScope\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustModule\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.docs\nimport software.amazon.smithy.rust.codegen.core.rustlang.raw\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.CoreCodegenConfig\nimport software.amazon.smithy.rust.codegen.core.smithy.ModuleDocProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig\nimport software.amazon.smithy.rust.codegen.core.smithy.RustCrate\nimport software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.CargoTomlGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.mergeDependencyFeatures\nimport software.amazon.smithy.rust.codegen.core.smithy.mergeIdenticalTestDependencies\nimport software.amazon.smithy.rust.codegen.core.util.CommandError\nimport software.amazon.smithy.rust.codegen.core.util.letIf\nimport software.amazon.smithy.rust.codegen.core.util.orNullIfEmpty\nimport software.amazon.smithy.rust.codegen.core.util.runCommand\nimport java.io.File\nimport java.nio.file.Files\nimport java.nio.file.Files.createTempDirectory\nimport java.nio.file.Path\nimport kotlin.io.path.Path\nimport kotlin.io.path.absolutePathString\nimport kotlin.io.path.writeText\n\nval TestModuleDocProvider =\n    object : ModuleDocProvider {\n        override fun docsWriter(module: RustModule.LeafModule): Writable =\n            writable {\n                docs(\"Some test documentation\\n\\nSome more details...\")\n            }\n    }\n\n/**\n * Waiting for Kotlin to stabilize their temp directory functionality\n */\nprivate fun tempDir(directory: File? = null): File {\n    return if (directory != null) {\n        createTempDirectory(directory.toPath(), \"smithy-test\").toFile()\n    } else {\n        createTempDirectory(\"smithy-test\").toFile()\n    }\n}\n\n/**\n * This function returns the minimum supported Rust version, as specified in the `gradle.properties` file\n * located at the root of the project.\n */\nfun msrv(): String = BuildEnvironment.MSRV\n\n/**\n * Generates the `rust-toolchain.toml` file in the specified directory.\n *\n * The compiler version is set in `gradle.properties` under the `rust.msrv` property.\n * The Gradle task `generateRustMsrvFile` generates the Kotlin class\n * `software.amazon.smithy.rust.codegen.core.generated.RustMsrv.kt` and writes the value of `rust.msrv` into it.\n */\nprivate fun File.generateRustToolchainToml() {\n    resolve(\"rust-toolchain.toml\").writeText(\n        // Help rust select the right version when we run cargo test.\n        \"\"\"\n        [toolchain]\n        channel = \"${msrv()}\"\n        \"\"\".trimIndent(),\n    )\n}\n\n/**\n * Creates a Cargo workspace shared among all tests\n *\n * This workspace significantly improves test performance by sharing dependencies between different tests.\n */\nobject TestWorkspace {\n    private val baseDir by lazy {\n        val appDataDir =\n            System.getProperty(\"APPDATA\")\n                ?: System.getenv(\"XDG_DATA_HOME\")\n                ?: System.getProperty(\"user.home\")\n                    ?.let { Path.of(it, \".local\", \"share\").absolutePathString() }\n                    ?.also { File(it).mkdirs() }\n        if (appDataDir != null) {\n            File(Path.of(appDataDir, \"smithy-test-workspace\").absolutePathString())\n        } else {\n            System.getenv(\"SMITHY_TEST_WORKSPACE\")?.let { File(it) } ?: tempDir()\n        }\n    }\n    private val subprojects = mutableListOf<String>()\n\n    private val cargoLock: File by lazy {\n        File(BuildEnvironment.PROJECT_DIR).resolve(\"aws/sdk/Cargo.lock\")\n    }\n\n    init {\n        baseDir.mkdirs()\n    }\n\n    private fun generate() {\n        val cargoToml = baseDir.resolve(\"Cargo.toml\")\n        val workspaceToml =\n            TomlWriter().write(\n                mapOf(\n                    \"workspace\" to\n                        mapOf(\n                            \"resolver\" to \"2\",\n                            \"members\" to subprojects,\n                        ),\n                ),\n            )\n        cargoToml.writeText(workspaceToml)\n        cargoLock.copyTo(baseDir.resolve(\"Cargo.lock\"), true)\n    }\n\n    fun subproject(): File {\n        synchronized(subprojects) {\n            val newProject = tempDir(directory = baseDir)\n            newProject.resolve(\"Cargo.toml\").writeText(\n                \"\"\"\n                [package]\n                name = \"stub-${newProject.name}\"\n                version = \"0.0.1\"\n                \"\"\".trimIndent(),\n            )\n            newProject.generateRustToolchainToml()\n            // ensure there at least an empty lib.rs file to avoid broken crates\n            newProject.resolve(\"src\").mkdirs()\n            newProject.resolve(\"src/lib.rs\").writeText(\"\")\n            subprojects.add(newProject.name)\n            generate()\n            return newProject\n        }\n    }\n\n    fun testProject(\n        model: Model = ModelAssembler().assemble().unwrap(),\n        codegenConfig: CoreCodegenConfig = CoreCodegenConfig(),\n    ): TestWriterDelegator = testProject(testSymbolProvider(model), codegenConfig)\n\n    fun testProject(\n        symbolProvider: RustSymbolProvider,\n        codegenConfig: CoreCodegenConfig = CoreCodegenConfig(),\n    ): TestWriterDelegator {\n        val subprojectDir = subproject()\n        return TestWriterDelegator(\n            FileManifest.create(subprojectDir.toPath()),\n            symbolProvider,\n            codegenConfig,\n        ).apply {\n            lib {\n                // If the test fails before the crate is finalized, we'll end up with a broken crate.\n                // Since all tests are generated into the same workspace (to avoid re-compilation) a broken crate\n                // breaks the workspace and all subsequent unit tests. By putting this comment in, we prevent\n                // that state from occurring.\n                rust(\"// touch lib.rs\")\n            }\n        }\n    }\n}\n\n/**\n * Generates a test plugin context for [model] and returns the plugin context and the path it is rooted it.\n *\n * Example:\n * ```kotlin\n * val (pluginContext, path) = generatePluginContext(model)\n * CodegenVisitor(pluginContext).execute()\n * \"cargo test\".runCommand(path)\n * ```\n */\nfun generatePluginContext(\n    model: Model,\n    additionalSettings: ObjectNode = ObjectNode.builder().build(),\n    moduleVersion: String = \"1.0.0\",\n    service: String? = null,\n    runtimeConfig: RuntimeConfig? = null,\n    overrideTestDir: File? = null,\n): Pair<PluginContext, Path> {\n    val testDir =\n        overrideTestDir?.apply {\n            mkdirs()\n            generateRustToolchainToml()\n        } ?: TestWorkspace.subproject()\n    val moduleName = \"test_${testDir.nameWithoutExtension}\"\n    val testPath = testDir.toPath()\n    val manifest = FileManifest.create(testPath)\n    var settingsBuilder =\n        Node.objectNodeBuilder()\n            .withMember(\"module\", Node.from(moduleName))\n            .withMember(\"moduleVersion\", Node.from(moduleVersion))\n            .withMember(\"moduleDescription\", Node.from(\"test\"))\n            .withMember(\"moduleAuthors\", Node.fromStrings(\"testgenerator@smithy.com\"))\n            .letIf(service != null) { it.withMember(\"service\", service) }\n            .withMember(\n                \"runtimeConfig\",\n                Node.objectNodeBuilder().withMember(\n                    \"relativePath\",\n                    Node.from(((runtimeConfig ?: TestRuntimeConfig).runtimeCrateLocation).path),\n                ).build(),\n            )\n\n    val settings = settingsBuilder.merge(additionalSettings).build()\n    val pluginContext = PluginContext.builder().model(model).fileManifest(manifest).settings(settings).build()\n    return pluginContext to testPath\n}\n\nfun RustWriter.unitTest(\n    name: String? = null,\n    @Language(\"Rust\", prefix = \"fn test() {\", suffix = \"}\") test: String,\n) {\n    val testName = name ?: safeName(\"test\")\n    raw(\"#[test]\")\n    rustBlock(\"fn $testName()\") {\n        writeWithNoFormatting(test)\n    }\n}\n\n/*\n * Writes a Rust-style unit test\n */\nfun RustWriter.unitTest(\n    name: String,\n    vararg args: Any,\n    attribute: Attribute = Attribute.Test,\n    additionalAttributes: List<Attribute> = emptyList(),\n    async: Boolean = false,\n    block: Writable,\n): RustWriter {\n    attribute.render(this)\n    additionalAttributes.forEach { it.render(this) }\n    if (async) {\n        rust(\"async\")\n    }\n    return testDependenciesOnly { rustBlock(\"fn $name()\", *args, block = block) }\n}\n\nfun RustWriter.cargoDependencies() =\n    dependencies.map { RustDependency.fromSymbolDependency(it) }\n        .filterIsInstance<CargoDependency>().distinct()\n\nfun RustWriter.assertNoNewDependencies(\n    block: Writable,\n    dependencyFilter: (CargoDependency) -> String?,\n): RustWriter {\n    val startingDependencies = cargoDependencies().toSet()\n    block(this)\n    val endingDependencies = cargoDependencies().toSet()\n    val newDeps = (endingDependencies - startingDependencies)\n    val invalidDeps =\n        newDeps.mapNotNull { dep -> dependencyFilter(dep)?.let { message -> message to dep } }.orNullIfEmpty()\n    if (invalidDeps != null) {\n        val badDeps = invalidDeps.map { it.second.rustName }\n        val writtenOut = this.toString()\n        val badLines = writtenOut.lines().filter { line -> badDeps.any { line.contains(it) } }\n        throw CodegenException(\n            \"found invalid dependencies. ${\n                invalidDeps.map {\n                    it.first\n                }\n            }\\nHint: the following lines may be the problem.\\n${\n                badLines.joinToString(\n                    separator = \"\\n\",\n                    prefix = \"   \",\n                )\n            }\",\n        )\n    }\n    return this\n}\n\nfun RustWriter.testDependenciesOnly(block: Writable) =\n    assertNoNewDependencies(block) { dep ->\n        if (dep.scope != DependencyScope.Dev) {\n            \"Cannot add $dep — this writer should only add test dependencies.\"\n        } else {\n            null\n        }\n    }\n\nfun testDependenciesOnly(block: Writable): Writable =\n    {\n        testDependenciesOnly(block)\n    }\n\nfun RustWriter.tokioTest(\n    name: String,\n    vararg args: Any,\n    block: Writable,\n) {\n    unitTest(name, attribute = Attribute.TokioTest, async = true, block = block, args = args)\n}\n\n/**\n * WriterDelegator used for test purposes\n *\n * This exposes both the base directory and a list of [generatedFiles] for test purposes\n */\nclass TestWriterDelegator(\n    private val fileManifest: FileManifest,\n    symbolProvider: RustSymbolProvider,\n    val codegenConfig: CoreCodegenConfig,\n    moduleDocProvider: ModuleDocProvider = TestModuleDocProvider,\n) : RustCrate(fileManifest, symbolProvider, codegenConfig, moduleDocProvider) {\n    val baseDir: Path = fileManifest.baseDir\n\n    fun printGeneratedFiles() {\n        fileManifest.printGeneratedFiles()\n    }\n\n    fun generatedFiles() = fileManifest.files.map { baseDir.relativize(it) }\n}\n\n/**\n * Generate a new test module\n *\n * This should only be used in test code—the generated module name will be something like `tests_123`\n */\nfun RustCrate.testModule(block: Writable) =\n    lib {\n        withInlineModule(\n            RustModule.inlineTests(safeName(\"tests\")),\n            TestModuleDocProvider,\n            block,\n        )\n    }\n\nfun FileManifest.printGeneratedFiles() {\n    println(\"Generated files:\")\n    this.files.forEach { path ->\n        println(\"file:///$path\")\n    }\n}\n\n/**\n * Setting `runClippy` to true can be helpful when debugging clippy failures, but\n * should generally be set to `false` to avoid invalidating the Cargo cache between\n * every unit test run.\n */\nfun TestWriterDelegator.compileAndTest(\n    runClippy: Boolean = false,\n    expectFailure: Boolean = false,\n): String {\n    val stubModel =\n        \"\"\"\n        namespace fake\n        service Fake {\n            version: \"123\"\n        }\n        \"\"\".asSmithyModel()\n    this.finalize(\n        rustSettings(),\n        stubModel,\n        manifestCustomizations = emptyMap(),\n        libRsCustomizations = listOf(),\n    )\n    println(\"Generated files:\")\n    printGeneratedFiles()\n    try {\n        \"cargo fmt\".runCommand(baseDir)\n    } catch (e: Exception) {\n        // cargo fmt errors are useless, ignore\n    }\n\n    // Clean `RUSTFLAGS` because in CI we pass in `--deny warnings` and\n    // we still generate test code with warnings.\n    // TODO(https://github.com/smithy-lang/smithy-rs/issues/3194)\n    val env = mapOf(\"RUSTFLAGS\" to \"\")\n    baseDir.writeDotCargoConfigToml(listOf(\"--allow\", \"dead_code\"))\n\n    val testOutput = \"cargo test\".runCommand(baseDir, env)\n    if (runClippy) {\n        \"cargo clippy --all-features\".runCommand(baseDir, env)\n    }\n    return testOutput\n}\n\nfun Path.writeDotCargoConfigToml(rustFlags: List<String>) {\n    val dotCargoDir = this.resolve(\".cargo\")\n    Files.createDirectory(dotCargoDir)\n\n    dotCargoDir.resolve(\"config.toml\")\n        .writeText(\n            \"\"\"\n            [build]\n            rustflags = [${rustFlags.joinToString(\",\") { \"\\\"$it\\\"\" }}]\n            \"\"\".trimIndent(),\n        )\n}\n\nfun TestWriterDelegator.rustSettings() =\n    testRustSettings(\n        service = ShapeId.from(\"fake#Fake\"),\n        moduleName = \"test_${baseDir.toFile().nameWithoutExtension}\",\n        codegenConfig = this.codegenConfig,\n    )\n\nfun String.shouldParseAsRust() {\n    // quick hack via rustfmt\n    val tempFile = File.createTempFile(\"rust_test\", \".rs\")\n    tempFile.writeText(this)\n    \"rustfmt ${tempFile.absolutePath}\".runCommand()\n}\n\n/**\n * Compiles the contents of the given writer (including dependencies) and runs the tests\n */\nfun RustWriter.compileAndTest(\n    @Language(\"Rust\", prefix = \"fn test() {\", suffix = \"}\")\n    main: String = \"\",\n    clippy: Boolean = false,\n    expectFailure: Boolean = false,\n): String {\n    val deps =\n        this.dependencies\n            .map { RustDependency.fromSymbolDependency(it) }\n            .filterIsInstance<CargoDependency>()\n            .distinct()\n            .mergeDependencyFeatures()\n            .mergeIdenticalTestDependencies()\n    val module =\n        if (this.namespace.contains(\"::\")) {\n            this.namespace.split(\"::\")[1]\n        } else {\n            \"lib\"\n        }\n    val tempDir =\n        this.toString()\n            .intoCrate(deps, module = module, main = main, strict = clippy)\n    val mainRs = tempDir.resolve(\"src/main.rs\")\n    val testModule = tempDir.resolve(\"src/$module.rs\")\n    try {\n        val testOutput =\n            if ((mainRs.readText() + testModule.readText()).contains(\"#[test]\")) {\n                \"cargo test\".runCommand(tempDir.toPath())\n            } else {\n                \"cargo check\".runCommand(tempDir.toPath())\n            }\n        if (expectFailure) {\n            println(\"Test sources for debugging: file://${testModule.absolutePath}\")\n        }\n        return testOutput\n    } catch (e: CommandError) {\n        if (!expectFailure) {\n            println(\"Test sources for debugging: file://${testModule.absolutePath}\")\n        }\n        throw e\n    }\n}\n\nprivate fun String.intoCrate(\n    deps: List<CargoDependency>,\n    module: String? = null,\n    main: String = \"\",\n    strict: Boolean = false,\n): File {\n    this.shouldParseAsRust()\n    val tempDir = TestWorkspace.subproject()\n    val cargoToml =\n        RustWriter.toml(\"Cargo.toml\").apply {\n            CargoTomlGenerator(\n                moduleName = tempDir.nameWithoutExtension,\n                moduleVersion = \"0.0.1\",\n                moduleAuthors = listOf(\"Testy McTesterson\"),\n                moduleDescription = null,\n                moduleLicense = null,\n                moduleRepository = null,\n                minimumSupportedRustVersion = null,\n                protocolId = null,\n                writer = this,\n                dependencies = deps,\n            ).render()\n        }.toString()\n    tempDir.resolve(\"Cargo.toml\").writeText(cargoToml)\n    tempDir.resolve(\"src\").mkdirs()\n    val mainRs = tempDir.resolve(\"src/main.rs\")\n    val testModule = tempDir.resolve(\"src/$module.rs\")\n    testModule.writeText(this)\n    if (main.isNotBlank()) {\n        testModule.appendText(\n            \"\"\"\n            #[test]\n            fn test() {\n                $main\n            }\n            \"\"\".trimIndent(),\n        )\n    }\n\n    if (strict) {\n        mainRs.appendText(\n            \"\"\"\n            #![deny(clippy::all)]\n            \"\"\".trimIndent(),\n        )\n    }\n\n    mainRs.appendText(\n        \"\"\"\n        pub mod $module;\n        pub use crate::$module::*;\n        pub fn main() {}\n        \"\"\".trimIndent(),\n    )\n    return tempDir\n}\n\nfun String.shouldCompile(): File {\n    this.shouldParseAsRust()\n    val tempFile = File.createTempFile(\"rust_test\", \".rs\")\n    val tempDir = tempDir()\n    tempFile.writeText(this)\n    if (!this.contains(\"fn main\")) {\n        tempFile.appendText(\"\\nfn main() {}\\n\")\n    }\n    \"rustc ${tempFile.absolutePath} -o ${tempDir.absolutePath}/output\".runCommand()\n    return tempDir.resolve(\"output\")\n}\n\n/**\n * Inserts the provided strings as a main function and executes the result. This is intended to be used to validate\n * that generated code compiles and has some basic properties.\n *\n * Example usage:\n * ```\n * \"struct A { a: u32 }\".quickTest(\"let a = A { a: 5 }; assert_eq!(a.a, 5);\")\n * ```\n */\nfun String.compileAndRun(vararg strings: String) {\n    val contents = this + \"\\nfn main() { \\n ${strings.joinToString(\"\\n\")} }\"\n    val binary = contents.shouldCompile()\n    binary.absolutePath.runCommand()\n}\n\nfun RustCrate.integrationTest(\n    name: String,\n    writable: Writable,\n) = this.withFile(\"tests/$name.rs\", writable)\n\nfun TestWriterDelegator.unitTest(\n    additionalAttributes: List<Attribute> = emptyList(),\n    test: Writable,\n): TestWriterDelegator {\n    lib {\n        val name = safeName(\"test\")\n        withInlineModule(RustModule.inlineTests(name), TestModuleDocProvider) {\n            unitTest(name, additionalAttributes = additionalAttributes) {\n                test(this)\n            }\n        }\n    }\n    return this\n}\n\nfun String.runWithWarnings(crate: Path) = this.runCommand(crate, mapOf(\"RUSTFLAGS\" to \"-D warnings\"))\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/testutil/TestHelpers.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.testutil\n\nimport software.amazon.smithy.codegen.core.Symbol\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.knowledge.NullableIndex\nimport software.amazon.smithy.model.loader.ModelDiscovery\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.ServiceShape\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.shapes.UnionShape\nimport software.amazon.smithy.model.traits.ErrorTrait\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustModule\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustReservedWordConfig\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustReservedWordSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustReservedWords\nimport software.amazon.smithy.rust.codegen.core.rustlang.Visibility\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.implBlock\nimport software.amazon.smithy.rust.codegen.core.smithy.BaseSymbolMetadataProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenContext\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenTarget\nimport software.amazon.smithy.rust.codegen.core.smithy.CoreCodegenConfig\nimport software.amazon.smithy.rust.codegen.core.smithy.CoreRustSettings\nimport software.amazon.smithy.rust.codegen.core.smithy.ModuleProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.ModuleProviderContext\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeCrateLocation\nimport software.amazon.smithy.rust.codegen.core.smithy.RustCrate\nimport software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProviderConfig\nimport software.amazon.smithy.rust.codegen.core.smithy.SymbolVisitor\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.BuilderGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.BuilderInstantiator\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.StructSettings\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.StructureGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.module\nimport software.amazon.smithy.rust.codegen.core.smithy.traits.SyntheticInputTrait\nimport software.amazon.smithy.rust.codegen.core.smithy.traits.SyntheticOutputTrait\nimport software.amazon.smithy.rust.codegen.core.util.dq\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\nimport software.amazon.smithy.rust.codegen.core.util.letIf\nimport software.amazon.smithy.rust.codegen.core.util.toSnakeCase\nimport java.io.File\n\nval TestRuntimeConfig =\n    RuntimeConfig(runtimeCrateLocation = RuntimeCrateLocation.path(File(\"../rust-runtime/\").absolutePath))\n\n/**\n * IMPORTANT: You shouldn't need to refer to these directly in code or tests. They are private for a reason.\n *\n * In general, the RustSymbolProvider's `config()` has a `moduleFor` function that should be used\n * to find the destination module for a given shape.\n */\nprivate object CodegenCoreTestModules {\n    // Use module paths that don't align with either server or client to make sure\n    // the codegen is resilient to differences in module path.\n    val ModelsTestModule = RustModule.public(\"test_model\")\n    val ErrorsTestModule = RustModule.public(\"test_error\")\n    val InputsTestModule = RustModule.public(\"test_input\")\n    val OutputsTestModule = RustModule.public(\"test_output\")\n    val OperationsTestModule = RustModule.public(\"test_operation\")\n\n    object TestModuleProvider : ModuleProvider {\n        override fun moduleForShape(\n            context: ModuleProviderContext,\n            shape: Shape,\n        ): RustModule.LeafModule =\n            when (shape) {\n                is OperationShape -> OperationsTestModule\n                is StructureShape ->\n                    when {\n                        shape.hasTrait<ErrorTrait>() -> ErrorsTestModule\n                        shape.hasTrait<SyntheticInputTrait>() -> InputsTestModule\n                        shape.hasTrait<SyntheticOutputTrait>() -> OutputsTestModule\n                        else -> ModelsTestModule\n                    }\n\n                else -> ModelsTestModule\n            }\n\n        override fun moduleForOperationError(\n            context: ModuleProviderContext,\n            operation: OperationShape,\n        ): RustModule.LeafModule = ErrorsTestModule\n\n        override fun moduleForEventStreamError(\n            context: ModuleProviderContext,\n            eventStream: UnionShape,\n        ): RustModule.LeafModule = ErrorsTestModule\n\n        override fun moduleForBuilder(\n            context: ModuleProviderContext,\n            shape: Shape,\n            symbol: Symbol,\n        ): RustModule.LeafModule {\n            val builderNamespace = RustReservedWords.escapeIfNeeded(\"test_\" + symbol.name.toSnakeCase())\n            return RustModule.new(\n                builderNamespace,\n                visibility = Visibility.PUBLIC,\n                parent = symbol.module(),\n                inline = true,\n            )\n        }\n    }\n}\n\nfun testRustSymbolProviderConfig(nullabilityCheckMode: NullableIndex.CheckMode) =\n    RustSymbolProviderConfig(\n        runtimeConfig = TestRuntimeConfig,\n        renameExceptions = true,\n        nullabilityCheckMode = nullabilityCheckMode,\n        moduleProvider = CodegenCoreTestModules.TestModuleProvider,\n    )\n\nfun testRustSettings(\n    service: ShapeId = ShapeId.from(\"notrelevant#notrelevant\"),\n    moduleName: String = \"test-module\",\n    moduleVersion: String = \"0.0.1\",\n    moduleAuthors: List<String> = listOf(\"notrelevant\"),\n    moduleDescription: String = \"not relevant\",\n    moduleRepository: String? = null,\n    runtimeConfig: RuntimeConfig = TestRuntimeConfig,\n    codegenConfig: CoreCodegenConfig = CoreCodegenConfig(),\n    license: String? = null,\n    examplesUri: String? = null,\n) = CoreRustSettings(\n    service,\n    moduleName,\n    moduleVersion,\n    moduleAuthors,\n    moduleDescription,\n    moduleRepository,\n    runtimeConfig,\n    codegenConfig,\n    license,\n    examplesUri,\n)\n\nprivate const val SMITHY_VERSION = \"1.0\"\n\nfun String.asSmithyModel(\n    sourceLocation: String? = null,\n    smithyVersion: String = SMITHY_VERSION,\n    disableValidation: Boolean = false,\n    additionalDeniedModels: Array<String> = emptyArray(),\n): Model {\n    val processed = letIf(!this.trimStart().startsWith(\"\\$version\")) { \"\\$version: ${smithyVersion.dq()}\\n$it\" }\n    val denyModelsContaining =\n        arrayOf(\n            // If Smithy protocol test models are in our classpath, don't load them, since they are fairly large and we\n            // almost never need them.\n            \"smithy-protocol-tests\",\n            \"smithy-rules-engine-tests\",\n        ) + additionalDeniedModels\n    val urls =\n        ModelDiscovery.findModels().filter { modelUrl ->\n            denyModelsContaining.none {\n                modelUrl.toString().contains(it)\n            }\n        }\n    val assembler = Model.assembler()\n    for (url in urls) {\n        assembler.addImport(url)\n    }\n    assembler.addUnparsedModel(sourceLocation ?: \"test.smithy\", processed)\n    if (disableValidation) {\n        assembler.disableValidation()\n    }\n    return assembler.assemble()\n        .unwrap()\n}\n\n// Intentionally only visible to codegen-core since the other modules have their own symbol providers\ninternal fun testSymbolProvider(\n    model: Model,\n    rustReservedWordConfig: RustReservedWordConfig? = null,\n    nullabilityCheckMode: NullableIndex.CheckMode = NullableIndex.CheckMode.CLIENT,\n): RustSymbolProvider =\n    SymbolVisitor(\n        testRustSettings(),\n        model,\n        ServiceShape.builder().version(\"test\").id(\"test#Service\").build(),\n        testRustSymbolProviderConfig(nullabilityCheckMode),\n    ).let { BaseSymbolMetadataProvider(it, additionalAttributes = listOf(Attribute.NonExhaustive)) }\n        .let {\n            RustReservedWordSymbolProvider(\n                it,\n                rustReservedWordConfig ?: RustReservedWordConfig(emptyMap(), emptyMap(), emptyMap()),\n            )\n        }\n\n// Intentionally only visible to codegen-core since the other modules have their own contexts\ninternal fun testCodegenContext(\n    model: Model,\n    serviceShape: ServiceShape? = null,\n    settings: CoreRustSettings = testRustSettings(),\n    codegenTarget: CodegenTarget = CodegenTarget.CLIENT,\n    nullabilityCheckMode: NullableIndex.CheckMode = NullableIndex.CheckMode.CLIENT,\n): CodegenContext =\n    object : CodegenContext(\n        model,\n        testSymbolProvider(model, nullabilityCheckMode = nullabilityCheckMode),\n        TestModuleDocProvider,\n        serviceShape\n            ?: model.serviceShapes.firstOrNull()\n            ?: ServiceShape.builder().version(\"test\").id(\"test#Service\").build(),\n        ShapeId.from(\"test#Protocol\"),\n        settings,\n        codegenTarget,\n    ) {\n        override fun builderInstantiator(): BuilderInstantiator {\n            return DefaultBuilderInstantiator(codegenTarget == CodegenTarget.CLIENT, symbolProvider)\n        }\n    }\n\n/**\n * In tests, we frequently need to generate a struct, a builder, and an impl block to access said builder.\n */\nfun StructureShape.renderWithModelBuilder(\n    model: Model,\n    symbolProvider: RustSymbolProvider,\n    rustCrate: RustCrate,\n) {\n    val struct = this\n    rustCrate.withModule(symbolProvider.moduleForShape(struct)) {\n        StructureGenerator(model, symbolProvider, this, struct, emptyList(), StructSettings(true)).render()\n        implBlock(symbolProvider.toSymbol(struct)) {\n            BuilderGenerator.renderConvenienceMethod(this, symbolProvider, struct)\n        }\n    }\n    rustCrate.withModule(symbolProvider.moduleForBuilder(struct)) {\n        BuilderGenerator(model, symbolProvider, struct, emptyList()).render(this)\n    }\n}\n\nfun RustCrate.unitTest(\n    name: String? = null,\n    test: Writable,\n) {\n    lib {\n        val testName = name ?: safeName(\"test\")\n        unitTest(testName, block = test)\n    }\n}\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/util/Exec.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.util\n\nimport java.io.IOException\nimport java.nio.file.Path\nimport java.util.concurrent.TimeUnit\nimport java.util.logging.Logger\n\ndata class CommandError(val output: String) : Exception(\"Command Error\\n$output\")\n\nfun String.runCommand(\n    workdir: Path? = null,\n    environment: Map<String, String> = mapOf(),\n    timeout: Long = 3600,\n    redirect: ProcessBuilder.Redirect = ProcessBuilder.Redirect.PIPE,\n): String {\n    val logger = Logger.getLogger(\"RunCommand\")\n    logger.fine(\"Invoking comment $this in `$workdir` with env $environment\")\n    val start = System.currentTimeMillis()\n    val parts = this.split(\"\\\\s\".toRegex())\n    val builder =\n        ProcessBuilder(*parts.toTypedArray())\n            .redirectOutput(redirect)\n            .redirectError(redirect)\n            .letIf(workdir != null) {\n                it.directory(workdir?.toFile())\n            }\n\n    val env = builder.environment()\n    environment.forEach { (k, v) -> env[k] = v }\n    try {\n        val proc = builder.start()\n        proc.waitFor(timeout, TimeUnit.SECONDS)\n        val stdErr = proc.errorStream.bufferedReader().readText()\n        val stdOut = proc.inputStream.bufferedReader().readText()\n        val output = \"$stdErr\\n$stdOut\"\n        return when (proc.exitValue()) {\n            0 -> output\n            else -> throw CommandError(\"Command Error\\n$output\")\n        }\n    } catch (_: IllegalThreadStateException) {\n        throw CommandError(\"Timeout\")\n    } catch (err: IOException) {\n        throw CommandError(\"$this was not a valid command.\\n  Hint: is everything installed?\\n$err\")\n    } catch (other: Exception) {\n        throw CommandError(\"Unexpected exception thrown when executing subprocess:\\n$other\")\n    } finally {\n        val end = System.currentTimeMillis()\n        logger.fine(\"command duration: ${end - start}ms\")\n    }\n}\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/util/LetIf.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\npackage software.amazon.smithy.rust.codegen.core.util\n\n/**\n * Utility function similar to `let` that conditionally applies [f] only if [cond] is true.\n */\nfun <T> T.letIf(\n    cond: Boolean,\n    f: (T) -> T,\n): T {\n    return if (cond) {\n        f(this)\n    } else {\n        this\n    }\n}\n\nfun <T> List<T>.extendIf(\n    condition: Boolean,\n    f: () -> T,\n) = if (condition) {\n    this + listOf(f())\n} else {\n    this\n}\n\nfun <T> Boolean.thenSingletonListOf(f: () -> T): List<T> =\n    if (this) {\n        listOf(f())\n    } else {\n        listOf()\n    }\n\n/**\n * Returns this list if it is non-empty otherwise, it returns null\n */\nfun <T> List<T>.orNullIfEmpty(): List<T>? = this.ifEmpty { null }\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/util/Map.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.util\n\n/**\n * Deep merges two maps, with the properties of `other` taking priority over the properties of `this`.\n */\nfun Map<String, Any?>.deepMergeWith(other: Map<String, Any?>): Map<String, Any?> = deepMergeMaps(this, other)\n\n@Suppress(\"UNCHECKED_CAST\")\nprivate fun deepMergeMaps(\n    left: Map<String, Any?>,\n    right: Map<String, Any?>,\n): Map<String, Any?> {\n    val result = mutableMapOf<String, Any?>()\n    for (leftEntry in left.entries) {\n        val rightValue = right[leftEntry.key]\n        if (leftEntry.value is Map<*, *> && rightValue is Map<*, *>) {\n            result[leftEntry.key] =\n                deepMergeMaps(leftEntry.value as Map<String, Any?>, rightValue as Map<String, Any?>)\n        } else if (rightValue != null) {\n            result[leftEntry.key] = rightValue\n        } else {\n            result[leftEntry.key] = leftEntry.value\n        }\n    }\n    for (rightEntry in right.entries) {\n        if (!left.containsKey(rightEntry.key)) {\n            result[rightEntry.key] = rightEntry.value\n        }\n    }\n    return result\n}\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/util/Option.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.util\n\nimport java.util.Optional\n\nfun <T> Optional<T>.orNull(): T? = this.orElse(null)\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/util/Panic.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.util\n\n/** Something has gone horribly wrong due to a coding error */\n@Suppress(\"ktlint:standard:function-naming\")\nfun PANIC(reason: String = \"\"): Nothing = throw RuntimeException(reason)\n\n/** This code should never be executed (but Kotlin cannot prove that) */\n@Suppress(\"ktlint:standard:function-naming\")\nfun UNREACHABLE(reason: String): Nothing = throw IllegalStateException(\"This should be unreachable: $reason\")\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/util/Smithy.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.util\n\nimport software.amazon.smithy.aws.traits.ServiceTrait\nimport software.amazon.smithy.codegen.core.CodegenException\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.knowledge.TopDownIndex\nimport software.amazon.smithy.model.shapes.BooleanShape\nimport software.amazon.smithy.model.shapes.ListShape\nimport software.amazon.smithy.model.shapes.MapShape\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.NumberShape\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.ServiceShape\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.shapes.UnionShape\nimport software.amazon.smithy.model.traits.SensitiveTrait\nimport software.amazon.smithy.model.traits.StreamingTrait\nimport software.amazon.smithy.model.traits.TitleTrait\nimport software.amazon.smithy.model.traits.Trait\nimport software.amazon.smithy.rust.codegen.core.smithy.traits.SyntheticInputTrait\nimport software.amazon.smithy.rust.codegen.core.smithy.traits.SyntheticOutputTrait\n\ninline fun <reified T : Shape> Model.lookup(shapeId: String): T = this.expectShape(ShapeId.from(shapeId), T::class.java)\n\nfun OperationShape.inputShape(model: Model): StructureShape =\n    // The Rust Smithy generator adds an input to all shapes automatically\n    model.expectShape(this.input.get(), StructureShape::class.java)\n\nfun OperationShape.outputShape(model: Model): StructureShape =\n    // The Rust Smithy generator adds an output to all shapes automatically\n    model.expectShape(this.output.get(), StructureShape::class.java)\n\nfun StructureShape.expectMember(member: String): MemberShape =\n    this.getMember(member).orElseThrow { CodegenException(\"$member did not exist on $this\") }\n\nfun UnionShape.expectMember(member: String): MemberShape =\n    this.getMember(member).orElseThrow { CodegenException(\"$member did not exist on $this\") }\n\nfun StructureShape.errorMessageMember(): MemberShape? =\n    this.getMember(\"message\").or {\n        this.getMember(\"Message\")\n    }.orNull()\n\nfun StructureShape.hasStreamingMember(model: Model) = this.findStreamingMember(model) != null\n\nfun UnionShape.hasStreamingMember(model: Model) = this.findMemberWithTrait<StreamingTrait>(model) != null\n\nfun MemberShape.isStreaming(model: Model) = this.getMemberTrait(model, StreamingTrait::class.java).isPresent\n\nfun UnionShape.isEventStream(): Boolean = hasTrait(StreamingTrait::class.java)\n\nfun MemberShape.isEventStream(model: Model): Boolean =\n    (model.expectShape(target) as? UnionShape)?.isEventStream() ?: false\n\nfun MemberShape.isInputEventStream(model: Model): Boolean =\n    isEventStream(model) && model.expectShape(container).hasTrait<SyntheticInputTrait>()\n\nfun MemberShape.isOutputEventStream(model: Model): Boolean =\n    isEventStream(model) && model.expectShape(container).hasTrait<SyntheticOutputTrait>()\n\nprivate val unitShapeId = ShapeId.from(\"smithy.api#Unit\")\n\nfun Shape.isUnit(): Boolean = this.id == unitShapeId\n\nfun MemberShape.isTargetUnit(): Boolean = this.target == unitShapeId\n\nfun Shape.hasEventStreamMember(model: Model): Boolean = members().any { it.isEventStream(model) }\n\nfun OperationShape.isInputEventStream(model: Model): Boolean =\n    input.map { id -> model.expectShape(id).hasEventStreamMember(model) }.orElse(false)\n\nfun OperationShape.isOutputEventStream(model: Model): Boolean =\n    output.map { id -> model.expectShape(id).hasEventStreamMember(model) }.orElse(false)\n\nfun OperationShape.isEventStream(model: Model): Boolean = isInputEventStream(model) || isOutputEventStream(model)\n\nfun ServiceShape.hasEventStreamOperations(model: Model): Boolean =\n    TopDownIndex.of(model)\n        .getContainedOperations(this)\n        .any { op ->\n            op.isEventStream(model)\n        }\n\nfun Shape.shouldRedact(model: Model): Boolean =\n    when {\n        hasTrait<SensitiveTrait>() -> true\n        this is MemberShape -> model.expectShape(target).shouldRedact(model)\n        this is ListShape -> member.shouldRedact(model)\n        this is MapShape -> key.shouldRedact(model) || value.shouldRedact(model)\n        else -> false\n    }\n\nconst val REDACTION = \"\\\"*** Sensitive Data Redacted ***\\\"\"\n\nfun Shape.redactIfNecessary(\n    model: Model,\n    safeToPrint: String,\n): String =\n    if (this.shouldRedact(model)) {\n        REDACTION\n    } else {\n        safeToPrint\n    }\n\n/*\n * Returns the member of this structure targeted with streaming trait (if it exists).\n *\n * A structure must have at most one streaming member.\n */\nfun StructureShape.findStreamingMember(model: Model): MemberShape? = this.findMemberWithTrait<StreamingTrait>(model)\n\ninline fun <reified T : Trait> StructureShape.findMemberWithTrait(model: Model): MemberShape? =\n    this.members().find { it.getMemberTrait(model, T::class.java).isPresent }\n\ninline fun <reified T : Trait> UnionShape.findMemberWithTrait(model: Model): MemberShape? =\n    this.members().find { it.getMemberTrait(model, T::class.java).isPresent }\n\n/**\n * If is member shape returns target, otherwise returns self.\n * @param model for loading the target shape\n */\nfun Shape.targetOrSelf(model: Model): Shape =\n    when (this) {\n        is MemberShape -> model.expectShape(this.target)\n        else -> this\n    }\n\nfun MemberShape.targetShape(model: Model): Shape = model.expectShape(this.target)\n\n/** Kotlin sugar for hasTrait() check. e.g. shape.hasTrait<EnumTrait>() instead of shape.hasTrait(EnumTrait::class.java) */\ninline fun <reified T : Trait> Shape.hasTrait(): Boolean = hasTrait(T::class.java)\n\n/** Kotlin sugar for expectTrait() check. e.g. shape.expectTrait<EnumTrait>() instead of shape.expectTrait(EnumTrait::class.java) */\ninline fun <reified T : Trait> Shape.expectTrait(): T = expectTrait(T::class.java)\n\n/** Kotlin sugar for getTrait() check. e.g. shape.getTrait<EnumTrait>() instead of shape.getTrait(EnumTrait::class.java) */\ninline fun <reified T : Trait> Shape.getTrait(): T? = getTrait(T::class.java).orNull()\n\nfun Shape.isPrimitive(): Boolean =\n    when (this) {\n        is NumberShape, is BooleanShape -> true\n        else -> false\n    }\n\n/** Convert a string to a ShapeId */\nfun String.shapeId() = ShapeId.from(this)\n\n/** Returns the service name, or a default value if the service doesn't have a title trait */\nfun ServiceShape.serviceNameOrDefault(default: String) = getTrait<TitleTrait>()?.value ?: default\n\n/** Returns the SDK ID of the given service shape */\nfun ServiceShape.sdkId(): String = getTrait<ServiceTrait>()?.sdkId ?: id.getName(this)\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/util/Strings.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.util\n\nimport software.amazon.smithy.utils.CaseUtils\nimport software.amazon.smithy.utils.StringUtils\n\nfun String.doubleQuote(): String =\n    StringUtils.escapeJavaString(this, \"\").replace(Regex(\"\"\"\\\\u([0-9a-f]{4})\"\"\")) { matchResult: MatchResult ->\n        \"\\\\u{\" + matchResult.groupValues[1] + \"}\" as CharSequence\n    }\n\n/**\n * Double quote a string, e.g. \"abc\" -> \"\\\"abc\\\"\"\n */\nfun String.dq(): String = this.doubleQuote()\n\nprivate val completeWords: List<String> = listOf(\"ipv4\", \"ipv6\", \"sigv4\", \"mib\", \"gib\", \"kib\", \"ttl\")\n\nprivate fun String.splitOnWordBoundaries(): List<String> {\n    val out = mutableListOf<String>()\n    // These are whole words but cased differently, e.g. `IPv4`, `MiB`, `GiB`, `TtL`\n    var currentWord = \"\"\n\n    var completeWordInProgress = true\n    // emit the current word and update from the next character\n    val emit = { next: Char ->\n        completeWordInProgress = true\n        if (currentWord.isNotEmpty()) {\n            out += currentWord.lowercase()\n        }\n        currentWord =\n            if (next.isLetterOrDigit()) {\n                next.toString()\n            } else {\n                \"\"\n            }\n    }\n    val allLowerCase = this.lowercase() == this\n    this.forEachIndexed { index, nextCharacter ->\n        val computeWordInProgress = {\n            val result =\n                completeWordInProgress && currentWord.isNotEmpty() &&\n                    completeWords.any {\n                        it.startsWith(currentWord, ignoreCase = true) &&\n                            (currentWord + this.substring(index)).startsWith(\n                                it,\n                                ignoreCase = true,\n                            ) && !it.equals(currentWord, ignoreCase = true)\n                    }\n\n            completeWordInProgress = result\n            result\n        }\n        when {\n            // [C] in these docs indicates the value of nextCharacter\n            // A[_]B\n            !nextCharacter.isLetterOrDigit() -> emit(nextCharacter)\n\n            // If we have no letters so far, push the next letter (we already know it's a letter or digit)\n            currentWord.isEmpty() -> currentWord += nextCharacter.toString()\n\n            // Abc[D]ef or Ab2[D]ef\n            !computeWordInProgress() && loweredFollowedByUpper(currentWord, nextCharacter) -> emit(nextCharacter)\n\n            // s3[k]ey\n            !computeWordInProgress() && allLowerCase && digitFollowedByLower(currentWord, nextCharacter) ->\n                emit(\n                    nextCharacter,\n                )\n\n            // DB[P]roxy, or `IAM[U]ser` but not AC[L]s\n            endOfAcronym(currentWord, nextCharacter, this.getOrNull(index + 1), this.getOrNull(index + 2)) -> emit(nextCharacter)\n\n            // If we haven't found a word boundary, push it and keep going\n            else -> currentWord += nextCharacter.toString()\n        }\n    }\n    if (currentWord.isNotEmpty()) {\n        out += currentWord\n    }\n    return out\n}\n\n/**\n * Handle cases like `DB[P]roxy`, `ARN[S]upport`, `AC[L]s`\n */\nprivate fun endOfAcronym(\n    current: String,\n    nextChar: Char,\n    peek: Char?,\n    doublePeek: Char?,\n): Boolean {\n    if (!current.last().isUpperCase()) {\n        // Not an acronym in progress\n        return false\n    }\n    if (!nextChar.isUpperCase()) {\n        // We aren't at the next word yet\n        return false\n    }\n\n    if (peek?.isLowerCase() != true) {\n        return false\n    }\n\n    // Skip cases like `AR[N]s`, `AC[L]s` but not `IAM[U]ser`\n    if (peek == 's' && (doublePeek == null || !doublePeek.isLowerCase())) {\n        return false\n    }\n\n    // Skip cases like `DynamoD[B]v2`\n    if (peek == 'v' && doublePeek?.isDigit() == true) {\n        return false\n    }\n    return true\n}\n\nprivate fun loweredFollowedByUpper(\n    current: String,\n    nextChar: Char,\n): Boolean {\n    if (!nextChar.isUpperCase()) {\n        return false\n    }\n    return current.last().isLowerCase() || current.last().isDigit()\n}\n\nprivate fun digitFollowedByLower(\n    current: String,\n    nextChar: Char,\n): Boolean {\n    return (current.last().isDigit() && nextChar.isLowerCase())\n}\n\nfun String.toSnakeCase(): String {\n    return this.splitOnWordBoundaries().joinToString(\"_\") { it.lowercase() }\n}\n\nfun String.toPascalCase(): String {\n    // TODO(https://github.com/smithy-lang/smithy-rs/issues/3047): consider using our updated toSnakeCase (but need to audit diff)\n    return CaseUtils.toSnakeCase(this).let { CaseUtils.toPascalCase(it) }\n}\n"
  },
  {
    "path": "codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/util/Synthetics.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.util\n\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.shapes.ToShapeId\n\n/**\n * Clones an entire operation and its input/output shapes under a new name.\n */\nfun Model.Builder.cloneOperation(\n    model: Model,\n    oldOperation: ToShapeId,\n    idTransform: (ShapeId) -> ShapeId,\n): Model.Builder {\n    val operationShape = model.expectShape(oldOperation.toShapeId(), OperationShape::class.java)\n    val inputShape =\n        model.expectShape(\n            checkNotNull(operationShape.input.orNull()) {\n                \"cloneOperation expects OperationNormalizer to be run first to add input shapes to all operations\"\n            },\n            StructureShape::class.java,\n        )\n    val outputShape =\n        model.expectShape(\n            checkNotNull(operationShape.output.orNull()) {\n                \"cloneOperation expects OperationNormalizer to be run first to add output shapes to all operations\"\n            },\n            StructureShape::class.java,\n        )\n\n    val inputId = idTransform(inputShape.id)\n    addShape(inputShape.toBuilder().rename(inputId).build())\n    val outputId = idTransform(outputShape.id)\n    if (outputId != inputId) {\n        addShape(outputShape.toBuilder().rename(outputId).build())\n    }\n    val operationId = idTransform(operationShape.id)\n    addShape(\n        operationShape.toBuilder()\n            .id(operationId)\n            .input(inputId)\n            .output(outputId)\n            .build(),\n    )\n    return this\n}\n\n/**\n * Renames a StructureShape builder and automatically fixes all the members.\n */\nfun StructureShape.Builder.rename(newId: ShapeId): StructureShape.Builder {\n    val renamedMembers =\n        this.build().members().map {\n            it.toBuilder().id(newId.withMember(it.memberName)).build()\n        }\n    return this.id(newId).members(renamedMembers)\n}\n"
  },
  {
    "path": "codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/VersionTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core\n\nimport io.kotest.matchers.shouldBe\nimport org.junit.jupiter.api.Test\n\nclass VersionTest {\n    @Test\n    fun `parse versions json`() {\n        val version =\n            Version.parse(\n                \"\"\"\n                {\n                  \"gitHash\": \"30205973b951256c4c37b998e7a6e94fee2f6ecc\",\n                  \"runtimeCrates\": {\n                    \"aws-smithy-http-server\": \"0.60.1\",\n                    \"aws-smithy-runtime-api\": \"1.1.1\",\n                    \"aws-smithy-protocol-test\": \"0.60.1\",\n                    \"aws-smithy-eventstream\": \"0.60.1\",\n                    \"aws-smithy-async\": \"1.1.1\",\n                    \"aws-smithy-http-server-python\": \"0.60.1\",\n                    \"aws-smithy-types\": \"1.1.1\",\n                    \"aws-smithy-types-convert\": \"0.60.1\",\n                    \"aws-smithy-http-auth\": \"0.60.1\",\n                    \"aws-smithy-checksums\": \"0.60.1\",\n                    \"aws-smithy-runtime\": \"1.1.1\",\n                    \"aws-smithy-query\": \"0.60.1\",\n                    \"aws-smithy-xml\": \"0.60.1\",\n                    \"aws-smithy-json\": \"0.60.1\",\n                    \"aws-smithy-http-tower\": \"0.60.1\",\n                    \"aws-smithy-http\": \"0.60.1\",\n                    \"aws-smithy-client\": \"0.60.1\",\n                    \"aws-sig-auth\": \"0.60.1\",\n                    \"aws-credential-types\": \"1.1.1\",\n                    \"aws-runtime-api\": \"1.1.1\",\n                    \"aws-types\": \"1.1.1\",\n                    \"aws-sigv4\": \"1.1.1\",\n                    \"aws-runtime\": \"1.1.1\",\n                    \"aws-http\": \"0.60.1\",\n                    \"aws-endpoint\": \"0.60.1\",\n                    \"aws-config\": \"1.1.1\",\n                    \"aws-hyper\": \"0.60.1\"  }\n                }\n                \"\"\",\n            )\n        version.gitHash shouldBe \"30205973b951256c4c37b998e7a6e94fee2f6ecc\"\n        version.crates[\"aws-smithy-http-server\"] shouldBe \"0.60.1\"\n        version.crates[\"aws-config\"] shouldBe \"1.1.1\"\n    }\n}\n"
  },
  {
    "path": "codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/CargoDependencyTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.rustlang\n\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.assertThrows\n\nclass CargoDependencyTest {\n    @Test\n    fun `it should not allow a dependency with test-util in non-dev scopes`() {\n        // OK\n        CargoDependency(\n            name = \"test\",\n            location = CratesIo(\"1.0\"),\n            features = setOf(\"foo\", \"test-util\", \"bar\"),\n            scope = DependencyScope.Dev,\n        )\n\n        // OK\n        CargoDependency(\n            name = \"test\",\n            location = CratesIo(\"1.0\"),\n            features = setOf(\"foo\", \"bar\"),\n            scope = DependencyScope.Dev,\n        ).toDevDependency().withFeature(\"test-util\")\n\n        assertThrows<IllegalArgumentException> {\n            CargoDependency(\n                name = \"test\",\n                location = CratesIo(\"1.0\"),\n                features = setOf(\"foo\", \"test-util\", \"bar\"),\n                scope = DependencyScope.Compile,\n            )\n        }\n\n        assertThrows<IllegalArgumentException> {\n            CargoDependency(\n                name = \"test\",\n                location = CratesIo(\"1.0\"),\n                features = setOf(\"foo\", \"bar\"),\n                scope = DependencyScope.Compile,\n            ).withFeature(\"test-util\")\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/InlineDependencyTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.rustlang\n\nimport io.kotest.assertions.throwables.shouldThrow\nimport io.kotest.matchers.shouldBe\nimport io.kotest.matchers.shouldNotBe\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.testutil.TestRuntimeConfig\nimport software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace\nimport software.amazon.smithy.rust.codegen.core.testutil.compileAndTest\nimport software.amazon.smithy.rust.codegen.core.testutil.unitTest\nimport kotlin.io.path.pathString\n\ninternal class InlineDependencyTest {\n    private fun makeDep(name: String) =\n        InlineDependency(name, RustModule.private(\"module\")) {\n            rustBlock(\"fn foo()\") {}\n        }\n\n    @Test\n    fun `equal dependencies should be equal`() {\n        val depA = makeDep(\"func\")\n        val depB = makeDep(\"func\")\n        depA.renderer shouldBe depB.renderer\n        depA.key() shouldBe depB.key()\n\n        depA.key() shouldNotBe makeDep(\"func2\").key()\n    }\n\n    @Test\n    fun `locate dependencies from the inlineable module`() {\n        val runtimeConfig = TestRuntimeConfig\n        val dep = InlineDependency.serializationSettings(runtimeConfig)\n        val testProject = TestWorkspace.testProject()\n        testProject.lib {\n            rustTemplate(\n                \"\"\"\n\n                ##[test]\n                fn header_serialization_settings_can_be_constructed() {\n                    use #{serialization_settings}::HeaderSerializationSettings;\n                    use #{aws_smithy_http}::header::set_request_header_if_absent;\n                    let _settings = HeaderSerializationSettings::default();\n                }\n\n                \"\"\",\n                \"serialization_settings\" to dep.toType(),\n                \"aws_smithy_http\" to RuntimeType.smithyHttp(runtimeConfig),\n            )\n        }\n        testProject.compileAndTest()\n    }\n\n    @Test\n    fun `nested dependency modules`() {\n        val a = RustModule.public(\"a\")\n        val b = RustModule.public(\"b\", parent = a)\n        val c = RustModule.public(\"c\", parent = b)\n        val type =\n            RuntimeType.forInlineFun(\"forty2\", c) {\n                rust(\n                    \"\"\"\n                    pub fn forty2() -> usize { 42 }\n                    \"\"\",\n                )\n            }\n        val crate = TestWorkspace.testProject()\n        crate.lib {\n            unitTest(\"use_nested_module\") {\n                rustTemplate(\"assert_eq!(42, #{forty2}())\", \"forty2\" to type)\n            }\n        }\n        crate.compileAndTest()\n        val generatedFiles = crate.generatedFiles().map { it.pathString }\n        assert(generatedFiles.contains(\"src/a.rs\")) { generatedFiles }\n        assert(generatedFiles.contains(\"src/a/b.rs\")) { generatedFiles }\n        assert(generatedFiles.contains(\"src/a/b/c.rs\")) { generatedFiles }\n    }\n\n    @Test\n    fun `prevent the creation of duplicate modules`() {\n        val root = RustModule.private(\"parent\")\n        // create a child module with no docs\n        val child1 = RustModule.public(\"child\", parent = root)\n        val child2 = RustModule.private(\"child\", parent = root)\n        val crate = TestWorkspace.testProject()\n        crate.withModule(child1) { }\n        shouldThrow<IllegalStateException> {\n            crate.withModule(child2) {}\n        }\n\n        shouldThrow<IllegalStateException> {\n            // can't make one with docs when the old one had no docs\n            crate.withModule(child1.copy(documentationOverride = \"docs\")) {}\n        }\n\n        // but making an identical module is fine\n        val identicalChild = RustModule.public(\"child\", parent = root)\n        crate.withModule(identicalChild) {}\n        identicalChild.fullyQualifiedPath() shouldBe \"crate::parent::child\"\n    }\n}\n"
  },
  {
    "path": "codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustGenericsTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.rustlang\n\nimport io.kotest.matchers.string.shouldContain\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\n\nclass RustGenericsTest {\n    @Test\n    fun `declaration is correct for no args`() {\n        val gg = RustGenerics()\n        val writer = RustWriter.forModule(\"model\")\n        writer.rustTemplate(\"A#{decl:W}B\", \"decl\" to gg.declaration())\n\n        writer.toString() shouldContain \"AB\"\n    }\n\n    @Test\n    fun `declaration is correct for 1 arg`() {\n        val gg = RustGenerics(GenericTypeArg(\"T\"))\n        val writer = RustWriter.forModule(\"model\")\n        writer.rustTemplate(\"#{decl:W}\", \"decl\" to gg.declaration())\n\n        writer.toString() shouldContain \"<T>\"\n    }\n\n    @Test\n    fun `declaration is correct for several args`() {\n        val gg = RustGenerics(GenericTypeArg(\"T\"), GenericTypeArg(\"U\"), GenericTypeArg(\"V\"))\n        val writer = RustWriter.forModule(\"model\")\n        writer.rustTemplate(\"#{decl:W}\", \"decl\" to gg.declaration())\n\n        writer.toString() shouldContain \"<T, U, V>\"\n    }\n\n    @Test\n    fun `bounds is correct for no args`() {\n        val gg = RustGenerics()\n        val writer = RustWriter.forModule(\"model\")\n        writer.rustTemplate(\"A#{bounds:W}B\", \"bounds\" to gg.bounds())\n\n        writer.toString() shouldContain \"AB\"\n    }\n\n    @Test\n    fun `bounds is correct for 1 arg`() {\n        val gg = RustGenerics(GenericTypeArg(\"T\", testRT(\"Test\")))\n        val writer = RustWriter.forModule(\"model\")\n        writer.rustTemplate(\"#{bounds:W}\", \"bounds\" to gg.bounds())\n\n        writer.toString() shouldContain \"T: test::Test,\"\n    }\n\n    @Test\n    fun `bounds is correct for several args`() {\n        val gg =\n            RustGenerics(\n                GenericTypeArg(\"A\", testRT(\"Apple\")),\n                GenericTypeArg(\"PL\", testRT(\"Plum\")),\n                GenericTypeArg(\"PE\", testRT(\"Pear\")),\n            )\n        val writer = RustWriter.forModule(\"model\")\n        writer.rustTemplate(\"#{bounds:W}\", \"bounds\" to gg.bounds())\n\n        writer.toString() shouldContain\n            \"\"\"\n            A: test::Apple,\n            PL: test::Plum,\n            PE: test::Pear,\n            \"\"\".trimIndent()\n    }\n\n    @Test\n    fun `bounds skips arg with no bounds`() {\n        val gg =\n            RustGenerics(\n                GenericTypeArg(\"A\", testRT(\"Apple\")),\n                GenericTypeArg(\"PL\"),\n                GenericTypeArg(\"PE\", testRT(\"Pear\")),\n            )\n        val writer = RustWriter.forModule(\"model\")\n        writer.rustTemplate(\"#{bounds:W}\", \"bounds\" to gg.bounds())\n\n        writer.toString() shouldContain\n            \"\"\"\n            A: test::Apple,\n            PE: test::Pear,\n            \"\"\".trimIndent()\n    }\n\n    @Test\n    fun `bounds generates nothing if all args are skipped`() {\n        val gg =\n            RustGenerics(\n                GenericTypeArg(\"A\"),\n                GenericTypeArg(\"PL\"),\n                GenericTypeArg(\"PE\"),\n            )\n        val writer = RustWriter.forModule(\"model\")\n        writer.rustTemplate(\"A#{bounds:W}B\", \"bounds\" to gg.bounds())\n\n        writer.toString() shouldContain \"AB\"\n    }\n\n    @Test\n    fun `Adding GenericGenerators works`() {\n        val ggA =\n            RustGenerics(\n                GenericTypeArg(\"A\", testRT(\"Apple\")),\n            )\n        val ggB =\n            RustGenerics(\n                GenericTypeArg(\"B\", testRT(\"Banana\")),\n            )\n        RustWriter.forModule(\"model\").let {\n            it.rustTemplate(\"#{bounds:W}\", \"bounds\" to (ggA + ggB).bounds())\n\n            it.toString() shouldContain\n                \"\"\"\n                A: test::Apple,\n                B: test::Banana,\n                \"\"\".trimIndent()\n        }\n\n        RustWriter.forModule(\"model\").let {\n            it.rustTemplate(\"#{decl:W}\", \"decl\" to (ggA + ggB).declaration())\n\n            it.toString() shouldContain \"<A, B>\"\n        }\n    }\n\n    private fun testRT(name: String): RuntimeType = RuntimeType(\"test::$name\")\n}\n"
  },
  {
    "path": "codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustReservedWordsTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.rustlang\n\nimport io.kotest.matchers.shouldBe\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.knowledge.NullableIndex\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.rust.codegen.core.smithy.MaybeRenamed\nimport software.amazon.smithy.rust.codegen.core.smithy.SymbolVisitor\nimport software.amazon.smithy.rust.codegen.core.smithy.WrappingSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.renamedFrom\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.testRustSettings\nimport software.amazon.smithy.rust.codegen.core.testutil.testRustSymbolProviderConfig\nimport software.amazon.smithy.rust.codegen.core.util.lookup\n\ninternal class RustReservedWordSymbolProviderTest {\n    private class TestSymbolProvider(model: Model, nullabilityCheckMode: NullableIndex.CheckMode) :\n        WrappingSymbolProvider(SymbolVisitor(testRustSettings(), model, null, testRustSymbolProviderConfig(nullabilityCheckMode)))\n\n    private val emptyConfig = RustReservedWordConfig(emptyMap(), emptyMap(), emptyMap())\n\n    @Test\n    fun `structs are escaped`() {\n        val model =\n            \"\"\"\n            namespace test\n            structure Self {}\n            \"\"\".asSmithyModel()\n        val provider =\n            RustReservedWordSymbolProvider(TestSymbolProvider(model, NullableIndex.CheckMode.CLIENT), emptyConfig)\n        val symbol = provider.toSymbol(model.lookup(\"test#Self\"))\n        symbol.name shouldBe \"SelfValue\"\n    }\n\n    private fun mappingTest(\n        config: RustReservedWordConfig,\n        model: Model,\n        id: String,\n        test: (String) -> Unit,\n    ) {\n        val provider = RustReservedWordSymbolProvider(TestSymbolProvider(model, NullableIndex.CheckMode.CLIENT), config)\n        val symbol = provider.toMemberName(model.lookup(\"test#Container\\$$id\"))\n        test(symbol)\n    }\n\n    @Test\n    fun `structs member names are mapped via config`() {\n        val config =\n            emptyConfig.copy(\n                structureMemberMap =\n                    mapOf(\n                        \"name_to_map\" to \"mapped_name\",\n                        \"NameToMap\" to \"MappedName\",\n                    ),\n            )\n        var model =\n            \"\"\"\n            namespace test\n            structure Container {\n                name_to_map: String\n            }\n            \"\"\".asSmithyModel()\n        mappingTest(config, model, \"name_to_map\") { memberName ->\n            memberName shouldBe \"mapped_name\"\n        }\n\n        model =\n            \"\"\"\n            namespace test\n            enum Container {\n                NameToMap = \"NameToMap\"\n            }\n            \"\"\".asSmithyModel(smithyVersion = \"2.0\")\n        mappingTest(config, model, \"NameToMap\") { memberName ->\n            // Container was not a struct, so the field keeps its old name\n            memberName shouldBe \"NameToMap\"\n        }\n\n        model =\n            \"\"\"\n            namespace test\n            union Container {\n                NameToMap: String\n            }\n            \"\"\".asSmithyModel()\n        mappingTest(config, model, \"NameToMap\") { memberName ->\n            // Container was not a struct, so the field keeps its old name\n            memberName shouldBe \"NameToMap\"\n        }\n    }\n\n    @Test\n    fun `union member names are mapped via config`() {\n        val config =\n            emptyConfig.copy(\n                unionMemberMap =\n                    mapOf(\n                        \"name_to_map\" to \"mapped_name\",\n                        \"NameToMap\" to \"MappedName\",\n                    ),\n            )\n\n        var model =\n            \"\"\"\n            namespace test\n            union Container {\n                NameToMap: String\n            }\n            \"\"\".asSmithyModel()\n        mappingTest(config, model, \"NameToMap\") { memberName ->\n            memberName shouldBe \"MappedName\"\n        }\n\n        model =\n            \"\"\"\n            namespace test\n            structure Container {\n                name_to_map: String\n            }\n            \"\"\".asSmithyModel()\n        mappingTest(config, model, \"name_to_map\") { memberName ->\n            // Container was not a union, so the field keeps its old name\n            memberName shouldBe \"name_to_map\"\n        }\n\n        model =\n            \"\"\"\n            namespace test\n            enum Container {\n                NameToMap = \"NameToMap\"\n            }\n            \"\"\".asSmithyModel(smithyVersion = \"2.0\")\n        mappingTest(config, model, \"NameToMap\") { memberName ->\n            // Container was not a union, so the field keeps its old name\n            memberName shouldBe \"NameToMap\"\n        }\n    }\n\n    @Test\n    fun `member names are escaped`() {\n        val model =\n            \"\"\"\n            namespace namespace\n            structure container {\n                async: String\n            }\n            \"\"\".asSmithyModel()\n        val provider =\n            RustReservedWordSymbolProvider(TestSymbolProvider(model, NullableIndex.CheckMode.CLIENT), emptyConfig)\n        provider.toMemberName(\n            MemberShape.builder().id(\"namespace#container\\$async\").target(\"namespace#Integer\").build(),\n        ) shouldBe \"r##async\"\n\n        provider.toMemberName(\n            MemberShape.builder().id(\"namespace#container\\$self\").target(\"namespace#Integer\").build(),\n        ) shouldBe \"self_\"\n    }\n\n    @Test\n    fun `enum variant names are updated to avoid conflicts`() {\n        val model =\n            \"\"\"\n            namespace foo\n            @enum([{ name: \"dontcare\", value: \"dontcare\" }]) string Container\n            \"\"\".asSmithyModel()\n        val provider =\n            RustReservedWordSymbolProvider(\n                TestSymbolProvider(model, NullableIndex.CheckMode.CLIENT),\n                reservedWordConfig =\n                    emptyConfig.copy(\n                        enumMemberMap =\n                            mapOf(\n                                \"Unknown\" to \"UnknownValue\",\n                                \"UnknownValue\" to \"UnknownValue_\",\n                            ),\n                    ),\n            )\n\n        fun expectEnumRename(\n            original: String,\n            expected: MaybeRenamed,\n        ) {\n            val symbol =\n                provider.toSymbol(\n                    MemberShape.builder()\n                        .id(ShapeId.fromParts(\"foo\", \"Container\").withMember(original))\n                        .target(\"smithy.api#String\")\n                        .build(),\n                )\n            symbol.name shouldBe expected.name\n            symbol.renamedFrom() shouldBe expected.renamedFrom\n        }\n\n        expectEnumRename(\"Unknown\", MaybeRenamed(\"UnknownValue\", \"Unknown\"))\n        expectEnumRename(\"UnknownValue\", MaybeRenamed(\"UnknownValue_\", \"UnknownValue\"))\n        expectEnumRename(\"UnknownOther\", MaybeRenamed(\"UnknownOther\", null))\n\n        expectEnumRename(\"Self\", MaybeRenamed(\"SelfValue\", \"Self\"))\n        expectEnumRename(\"SelfValue\", MaybeRenamed(\"SelfValue_\", \"SelfValue\"))\n        expectEnumRename(\"SelfOther\", MaybeRenamed(\"SelfOther\", null))\n        expectEnumRename(\"SELF\", MaybeRenamed(\"SelfValue\", \"Self\"))\n    }\n}\n"
  },
  {
    "path": "codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustTypeTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.rustlang\n\nimport io.kotest.matchers.shouldBe\nimport io.kotest.matchers.string.shouldContain\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute.Companion.all\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute.Companion.any\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute.Companion.cfg\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute.Companion.deny\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute.Companion.derive\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute.Companion.doc\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute.Companion.not\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.util.dq\n\ninternal class RustTypesTest {\n    private fun forInputExpectOutput(\n        t: Writable,\n        expectedOutput: String,\n    ) {\n        val writer = RustWriter.forModule(\"rust_types\")\n        writer.rustInlineTemplate(\"'\")\n        t.invoke(writer)\n        writer.rustInlineTemplate(\"'\")\n\n        writer.toString() shouldContain expectedOutput\n    }\n\n    @Test\n    fun `RustType_Unit_writable produces a template-compatible RuntimeType`() {\n        forInputExpectOutput(RustType.Unit.writable, \"'()'\")\n    }\n\n    @Test\n    fun `RustType_Bool_writable produces a template-compatible RuntimeType`() {\n        forInputExpectOutput(RustType.Bool.writable, \"'bool'\")\n    }\n\n    @Test\n    fun `RustType_Float_writable produces a template-compatible RuntimeType`() {\n        forInputExpectOutput(RustType.Float(32).writable, \"'f32'\")\n        forInputExpectOutput(RustType.Float(64).writable, \"'f64'\")\n    }\n\n    @Test\n    fun `RustType_Integer_writable produces a template-compatible RuntimeType`() {\n        forInputExpectOutput(RustType.Integer(8).writable, \"'i8'\")\n        forInputExpectOutput(RustType.Integer(16).writable, \"'i16'\")\n        forInputExpectOutput(RustType.Integer(32).writable, \"'i32'\")\n        forInputExpectOutput(RustType.Integer(64).writable, \"'i64'\")\n    }\n\n    @Test\n    fun `RustType_String_writable produces a template-compatible RuntimeType`() {\n        forInputExpectOutput(RustType.String.writable, \"'::std::string::String'\")\n    }\n\n    @Test\n    fun `RustType_Vec_writable produces a template-compatible RuntimeType`() {\n        forInputExpectOutput(\n            RustType.Vec(RustType.String).writable,\n            \"'::std::vec::Vec::<::std::string::String>'\",\n        )\n    }\n\n    @Test\n    fun `RustType_Slice_writable produces a template-compatible RuntimeType`() {\n        forInputExpectOutput(\n            RustType.Slice(RustType.String).writable,\n            \"'[::std::string::String]'\",\n        )\n    }\n\n    @Test\n    fun `RustType_HashMap_writable produces a template-compatible RuntimeType`() {\n        forInputExpectOutput(\n            RustType.HashMap(RustType.String, RustType.String).writable,\n            \"'::std::collections::HashMap::<::std::string::String, ::std::string::String>'\",\n        )\n    }\n\n    @Test\n    fun `RustType_HashSet_writable produces a template-compatible RuntimeType`() {\n        forInputExpectOutput(\n            RustType.HashSet(RustType.String).writable,\n            // Rust doesn't guarantee that `HashSet`s are insertion ordered, so we use a `Vec` instead.\n            // This is called out in a comment in the RustType.HashSet declaration\n            \"'::std::vec::Vec::<::std::string::String>'\",\n        )\n    }\n\n    @Test\n    fun `RustType_Reference_writable produces a template-compatible RuntimeType`() {\n        forInputExpectOutput(\n            RustType.Reference(\"&\", RustType.String).writable,\n            \"'&::std::string::String'\",\n        )\n        forInputExpectOutput(\n            RustType.Reference(\"&mut\", RustType.String).writable,\n            \"'&mut ::std::string::String'\",\n        )\n        forInputExpectOutput(\n            RustType.Reference(\"&'static\", RustType.String).writable,\n            \"&'static ::std::string::String'\",\n        )\n    }\n\n    @Test\n    fun `RustType_Option_writable produces a template-compatible RuntimeType`() {\n        forInputExpectOutput(\n            RustType.Option(RustType.String).writable,\n            \"'::std::option::Option<::std::string::String>'\",\n        )\n    }\n\n    @Test\n    fun `RustType_Box_writable produces a template-compatible RuntimeType`() {\n        forInputExpectOutput(\n            RustType.Box(RustType.String).writable,\n            \"'::std::boxed::Box<::std::string::String>'\",\n        )\n    }\n\n    @Test\n    fun `RustType_Opaque_writable produces a template-compatible RuntimeType`() {\n        forInputExpectOutput(\n            RustType.Opaque(\"SoCool\", \"zelda_is\").writable,\n            \"'zelda_is::SoCool'\",\n        )\n        forInputExpectOutput(\n            RustType.Opaque(\"SoCool\").writable,\n            \"'SoCool'\",\n        )\n    }\n\n    @Test\n    fun `RustType_Dyn_writable produces a template-compatible RuntimeType`() {\n        forInputExpectOutput(\n            RustType.Dyn(RustType.Opaque(\"Foo\", \"foo\")).writable,\n            \"'dyn foo::Foo'\",\n        )\n    }\n\n    @Test\n    fun `types render properly`() {\n        val type = RustType.Box(RustType.Option(RustType.Reference(\"a\", RustType.Vec(RustType.String))))\n        type.render(false) shouldBe \"Box<Option<&'a Vec::<String>>>\"\n        type.render(true) shouldBe \"::std::boxed::Box<::std::option::Option<&'a ::std::vec::Vec::<::std::string::String>>>\"\n    }\n\n    @Test\n    fun `attribute macros from strings render properly`() {\n        val attributeMacro =\n            Attribute(\n                Attribute.cfg(\n                    Attribute.all(\n                        Attribute.pair(\"feature\" to \"unstable\".dq()),\n                        Attribute.any(\n                            Attribute.pair(\"feature\" to \"serialize\".dq()),\n                            Attribute.pair(\"feature\" to \"deserialize\".dq()),\n                        ),\n                    ),\n                ),\n            )\n        forInputExpectOutput(\n            writable {\n                attributeMacro.render(this)\n            },\n            \"#[cfg(all(feature = \\\"unstable\\\", any(feature = \\\"serialize\\\", feature = \\\"deserialize\\\")))]\\n\",\n        )\n    }\n\n    @Test\n    fun `attribute macros render writers properly`() {\n        val attributeMacro =\n            Attribute(\n                cfg(\n                    all(\n                        // Normally we'd use the `pair` fn to define these but this is a test\n                        writable { rustInline(\"\"\"feature = \"unstable\"\"\"\") },\n                        writable { rustInline(\"\"\"feature = \"serialize\"\"\"\") },\n                        writable { rustInline(\"\"\"feature = \"deserialize\"\"\"\") },\n                    ),\n                ),\n            )\n        forInputExpectOutput(\n            writable {\n                attributeMacro.render(this)\n            },\n            \"#[cfg(all(feature = \\\"unstable\\\", feature = \\\"serialize\\\", feature = \\\"deserialize\\\"))]\\n\",\n        )\n    }\n\n    @Test\n    fun `attribute macros render nothing when empty`() {\n        // All of these attributes require arguments. If none are supplied, then they shouldn't render at all\n        val attributeMacro = Attribute(cfg(all(any(doc(not(deny()))))))\n        forInputExpectOutput(writable { attributeMacro.render(this) }, \"\")\n    }\n\n    @Test\n    fun `derive attribute macros render properly`() {\n        val attributeMacro =\n            Attribute(\n                derive(\n                    RuntimeType.Clone,\n                    RuntimeType.Debug,\n                    RuntimeType.StdError,\n                ),\n            )\n        forInputExpectOutput(\n            writable {\n                attributeMacro.render(this)\n            },\n            \"#[derive(::std::clone::Clone, ::std::error::Error, ::std::fmt::Debug)]\\n\",\n        )\n    }\n\n    @Test\n    fun `derive attribute macros don't render when empty`() {\n        val attributeMacro = Attribute(derive())\n        forInputExpectOutput(writable { attributeMacro.render(this) }, \"\")\n    }\n\n    @Test\n    fun `finds inner reference type`() {\n        val innerReference = RustType.Reference(\"a\", RustType.Bool)\n        val type = RustType.Box(RustType.Option(innerReference))\n\n        type.innerReference() shouldBe innerReference\n        RustType.Bool.innerReference() shouldBe null\n    }\n}\n"
  },
  {
    "path": "codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/RustWriterTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.rustlang\n\nimport io.kotest.matchers.collections.shouldContain\nimport io.kotest.matchers.shouldBe\nimport io.kotest.matchers.string.shouldContain\nimport io.kotest.matchers.string.shouldContainOnlyOnce\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.assertThrows\nimport software.amazon.smithy.codegen.core.CodegenException\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.SetShape\nimport software.amazon.smithy.model.shapes.StringShape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute.Companion.deprecated\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.testutil.TestModuleDocProvider\nimport software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.compileAndTest\nimport software.amazon.smithy.rust.codegen.core.testutil.testSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.testutil.unitTest\nimport software.amazon.smithy.rust.codegen.core.util.lookup\n\nclass RustWriterTest {\n    @Test\n    fun `inner modules correctly handle dependencies`() {\n        val sut = RustWriter.forModule(\"parent\")\n        val requestBuilder = RuntimeType.HttpRequestBuilder0x\n        sut.withInlineModule(\n            RustModule.new(\"inner\", visibility = Visibility.PUBLIC, inline = true),\n            TestModuleDocProvider,\n        ) {\n            rustBlock(\"fn build(builder: #T)\", requestBuilder) {\n            }\n        }\n        val httpDep = CargoDependency.Http0x.dependencies[0]\n        sut.dependencies shouldContain httpDep\n        sut.toString() shouldContainOnlyOnce \"DO NOT EDIT\"\n    }\n\n    @Test\n    fun `manually created struct`() {\n        val stringShape = StringShape.builder().id(\"test#Hello\").build()\n        val set =\n            SetShape.builder()\n                .id(\"foo.bar#Records\")\n                .member(stringShape.id)\n                .build()\n        val model =\n            Model.assembler()\n                .addShapes(set, stringShape)\n                .assemble()\n                .unwrap()\n\n        val provider = testSymbolProvider(model)\n        val setSymbol = provider.toSymbol(set)\n        val stringSymbol = provider.toSymbol(stringShape)\n\n        TestWorkspace.testProject(provider)\n            .unitTest {\n                rustBlock(\"struct Test\") {\n                    write(\"member: #T,\", setSymbol)\n                    write(\"other_member: #T,\", stringSymbol)\n                }\n\n                unitTest(\"test_manually_created_struct\") {\n                    rust(\n                        \"\"\"\n                        let test = Test { member: ${RustType.HashSet.Namespace}::${RustType.HashSet.Type}::default(), other_member: \"hello\".to_string() };\n                        assert_eq!(test.other_member, \"hello\");\n                        assert_eq!(test.member.is_empty(), true);\n\n                        // If this compiles, then we know the symbol provider resolved the correct type for a set\n                        let _isVec: Vec<_> = test.member;\n                        \"\"\",\n                    )\n                }\n            }.compileAndTest(runClippy = true)\n    }\n\n    @Test\n    fun `generate docs`() {\n        val writer = RustWriter.root()\n        writer.docs(\n            \"\"\"Top level module documentation\n            |More docs\n            |/* handle weird characters */\n            |`a backtick`\n            |[a link](some_url)\n            \"\"\",\n        )\n        writer.rustBlock(\"pub fn foo()\") { }\n        val output = writer.toString()\n        output shouldContain \"/// Top level module\"\n    }\n\n    @Test\n    fun `normalize HTML`() {\n        val output =\n            normalizeHtml(\n                \"\"\"\n                <a>Link without href attribute</a>\n                <div>Some text with [brackets]</div>\n                <span>] mismatched [ is escaped too</span>\n                \"\"\",\n            )\n        output shouldContain \"<code>Link without href attribute</code>\"\n        output shouldContain \"Some text with \\\\[brackets\\\\]\"\n        output shouldContain \"\\\\] mismatched \\\\[ is escaped too\"\n    }\n\n    @Test\n    fun `generate doc links`() {\n        val model =\n            \"\"\"\n            namespace test\n            structure Foo {}\n            \"\"\".asSmithyModel()\n        val shape = model.lookup<StructureShape>(\"test#Foo\")\n        val symbol = testSymbolProvider(model).toSymbol(shape)\n        val writer = RustWriter.root()\n        writer.docs(\"A link! #D\", symbol)\n        val output = writer.toString()\n        output shouldContain \"/// A link! [`Foo`](crate::test_model::Foo)\"\n    }\n\n    @Test\n    fun `empty writable`() {\n        val w = writable {}\n        w.isEmpty() shouldBe true\n    }\n\n    @Test\n    fun `attributes with comments when using rust`() {\n        val sut = RustWriter.root()\n        Attribute(\"foo\").render(sut)\n        sut.rust(\" // here's an attribute\")\n        sut.toString().shouldContain(\"#[foo]\\n// here's an attribute\")\n    }\n\n    @Test\n    fun `attributes with comments when using docs`() {\n        val sut = RustWriter.root()\n        Attribute(\"foo\").render(sut)\n        sut.docs(\"here's an attribute\")\n        sut.toString().shouldContain(\"#[foo]\\n/// here's an attribute\")\n    }\n\n    @Test\n    fun `attributes with derive helpers must come after derives`() {\n        val attr = Attribute(\"foo\", isDeriveHelper = true)\n        val metadata =\n            RustMetadata(\n                derives = setOf(RuntimeType.Debug),\n                additionalAttributes = listOf(Attribute.AllowDeprecated, attr),\n                visibility = Visibility.PUBLIC,\n            )\n        val sut = RustWriter.root()\n        metadata.render(sut)\n        sut.toString().shouldContain(\"#[allow(deprecated)]\\n#[derive(::std::fmt::Debug)]\\n#[foo]\")\n    }\n\n    @Test\n    fun `deprecated attribute without any field`() {\n        val sut = RustWriter.root()\n        Attribute.Deprecated.render(sut)\n        sut.toString() shouldContain \"#[deprecated]\"\n    }\n\n    @Test\n    fun `deprecated attribute with a note`() {\n        val sut = RustWriter.root()\n        Attribute(deprecated(note = \"custom\")).render(sut)\n        sut.toString() shouldContain \"#[deprecated(note = \\\"custom\\\")]\"\n    }\n\n    @Test\n    fun `deprecated attribute with a since`() {\n        val sut = RustWriter.root()\n        Attribute(deprecated(since = \"1.2.3\")).render(sut)\n        sut.toString() shouldContain \"#[deprecated(since = \\\"1.2.3\\\")]\"\n    }\n\n    @Test\n    fun `deprecated attribute with a note and a since`() {\n        val sut = RustWriter.root()\n        Attribute(deprecated(\"1.2.3\", \"custom\")).render(sut)\n        sut.toString() shouldContain \"#[deprecated(note = \\\"custom\\\", since = \\\"1.2.3\\\")]\"\n    }\n\n    @Test\n    fun `template writables with upper case names`() {\n        val inner = writable { rust(\"hello\") }\n        val sut = RustWriter.root()\n        sut.rustTemplate(\n            \"inner: #{Inner:W}, regular: #{http}\",\n            \"Inner\" to inner,\n            \"http\" to RuntimeType.Http0x.resolve(\"foo\"),\n        )\n        sut.toString().shouldContain(\"inner: hello, regular: ::http::foo\")\n    }\n\n    @Test\n    fun `missing template parameters are enclosed in backticks in the exception message`() {\n        val sut = RustWriter.root()\n        val exception =\n            assertThrows<CodegenException> {\n                sut.rustTemplate(\n                    \"#{Foo} #{Bar}\",\n                    \"Foo Bar\" to CargoDependency.Http0x.toType().resolve(\"foo\"),\n                    \"Baz\" to CargoDependency.Http0x.toType().resolve(\"foo\"),\n                )\n            }\n        exception.message shouldBe\n            \"\"\"\n            Rust block template expected `Foo` but was not present in template.\n            Hint: Template contains: [`Foo Bar`, `Baz`]\n            \"\"\".trimIndent()\n    }\n\n    @Test\n    fun `can handle file paths properly when determining module`() {\n        val sut = RustWriter.forModule(\"src/module_name\")\n        sut.module().shouldBe(\"module_name\")\n    }\n}\n"
  },
  {
    "path": "codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/UseDeclarationsTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.rustlang\n\nimport io.kotest.matchers.shouldBe\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.rust.codegen.core.testutil.shouldCompile\n\nclass UseDeclarationsTest {\n    private fun useDecl() = UseDeclarations(\"test\")\n\n    @Test\n    fun `it produces valid use decls`() {\n        val sut = useDecl()\n        sut.addImport(\"std::collections\", \"HashSet\")\n        sut.addImport(\"std::borrow\", \"Cow\")\n        sut.toString() shouldBe \"use std::borrow::Cow;\\nuse std::collections::HashSet;\"\n        sut.toString().shouldCompile()\n    }\n\n    @Test\n    fun `it deduplicates use decls`() {\n        val sut = useDecl()\n        sut.addImport(\"std::collections\", \"HashSet\")\n        sut.addImport(\"std::collections\", \"HashSet\")\n        sut.addImport(\"std::collections\", \"HashSet\")\n        sut.toString() shouldBe \"use std::collections::HashSet;\"\n        sut.toString().shouldCompile()\n    }\n\n    @Test\n    fun `it supports aliasing`() {\n        val sut = useDecl()\n        sut.addImport(\"std::collections\", \"HashSet\", \"HSet\")\n        sut.addImport(\"std::collections\", \"HashSet\")\n        sut.toString() shouldBe \"use std::collections::HashSet as HSet;\\nuse std::collections::HashSet;\"\n        sut.toString().shouldCompile()\n    }\n}\n"
  },
  {
    "path": "codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/WritableTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.rustlang\n\nimport io.kotest.matchers.string.shouldContain\nimport io.kotest.matchers.string.shouldEndWith\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\n\ninternal class RustTypeParametersTest {\n    private fun forInputExpectOutput(\n        input: Any,\n        expectedOutput: String,\n    ) {\n        val writer = RustWriter.forModule(\"model\")\n        writer.rustInlineTemplate(\"'\")\n        writer.rustInlineTemplate(\"#{typeParameters:W}\", \"typeParameters\" to rustTypeParameters(input))\n        writer.rustInlineTemplate(\"'\")\n\n        writer.toString() shouldContain expectedOutput\n    }\n\n    @Test\n    fun `rustTypeParameters accepts RustType Unit`() {\n        forInputExpectOutput(RustType.Unit, \"()\")\n    }\n\n    @Test\n    fun `rustTypeParameters accepts Symbol`() {\n        val symbol = RuntimeType(\"crate::operation::Operation\").toSymbol()\n        forInputExpectOutput(symbol, \"'<crate::operation::Operation>'\")\n    }\n\n    @Test\n    fun `rustTypeParameters accepts RuntimeType`() {\n        val runtimeType = RuntimeType.String\n        forInputExpectOutput(runtimeType, \"'<::std::string::String>'\")\n    }\n\n    @Test\n    fun `rustTypeParameters accepts String`() {\n        forInputExpectOutput(\"Option<Vec<String>>\", \"'<Option<Vec<String>>>'\")\n    }\n\n    @Test\n    fun `rustTypeParameters accepts RustGenerics`() {\n        forInputExpectOutput(RustGenerics(GenericTypeArg(\"A\"), GenericTypeArg(\"B\")), \"'<A, B>'\")\n    }\n\n    @Test\n    fun `rustTypeParameters accepts heterogeneous inputs`() {\n        val writer = RustWriter.forModule(\"model\")\n        val tps =\n            rustTypeParameters(\n                RuntimeType(\"crate::operation::Operation\").toSymbol(),\n                RustType.Unit,\n                RuntimeType.String,\n                \"T\",\n                RustGenerics(GenericTypeArg(\"A\"), GenericTypeArg(\"B\")),\n            )\n        writer.rustInlineTemplate(\"'\")\n        writer.rustInlineTemplate(\"#{tps:W}\", \"tps\" to tps)\n        writer.rustInlineTemplate(\"'\")\n\n        writer.toString() shouldContain \"'<crate::operation::Operation, (), ::std::string::String, T, A, B>'\"\n    }\n\n    @Test\n    fun `rustTypeParameters accepts writables`() {\n        val writer = RustWriter.forModule(\"model\")\n        val tp = rustTypeParameters(RustType.Unit.writable)\n        writer.rustInlineTemplate(\"'\")\n        writer.rustInlineTemplate(\"#{tp:W}\", \"tp\" to tp)\n        writer.rustInlineTemplate(\"'\")\n\n        writer.toString() shouldContain \"'<()>'\"\n    }\n\n    @Test\n    fun `join iterable`() {\n        val writer = RustWriter.forModule(\"model\")\n        val itemsA = listOf(writable(\"a\"), writable(\"b\"), writable(\"c\")).join(\", \")\n        val itemsB = listOf(writable(\"d\"), writable(\"e\"), writable(\"f\")).join(writable(\", \"))\n        writer.rustTemplate(\"vec![#{ItemsA:W}, #{ItemsB:W}]\", \"ItemsA\" to itemsA, \"ItemsB\" to itemsB)\n        writer.toString() shouldContain \"vec![a, b, c, d, e, f]\"\n    }\n\n    @Test\n    fun `join array`() {\n        val writer = RustWriter.forModule(\"model\")\n        arrayOf(writable(\"A\"), writable(\"B\"), writable(\"C\")).join(\"-\")(writer)\n        arrayOf(writable(\"D\"), writable(\"E\"), writable(\"F\")).join(writable(\"+\"))(writer)\n        writer.toString() shouldContain \"A-B-CD+E+F\"\n    }\n\n    @Test\n    fun `join sequence`() {\n        val writer = RustWriter.forModule(\"model\")\n        sequence {\n            yield(writable(\"A\"))\n            yield(writable(\"B\"))\n            yield(writable(\"C\"))\n        }.join(\"-\")(writer)\n        sequence {\n            yield(writable(\"D\"))\n            yield(writable(\"E\"))\n            yield(writable(\"F\"))\n        }.join(writable(\"+\"))(writer)\n        writer.toString() shouldContain \"A-B-CD+E+F\"\n    }\n\n    @Test\n    fun `test map`() {\n        val writer = RustWriter.forModule(\"model\")\n        val a = writable { rust(\"a\") }\n        val b = a.map { rust(\"b(#T)\", it) }\n        b(writer)\n        writer.toString().trim() shouldEndWith \"b(a)\"\n    }\n}\n"
  },
  {
    "path": "codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/CodegenDelegatorTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy\n\nimport io.kotest.matchers.shouldBe\nimport org.junit.jupiter.api.RepeatedTest\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.CratesIo\nimport software.amazon.smithy.rust.codegen.core.rustlang.DependencyScope.Compile\nimport software.amazon.smithy.rust.codegen.core.rustlang.DependencyScope.Dev\n\nclass CodegenDelegatorTest {\n    @RepeatedTest(10) // Test it several times since the shuffle adds in some randomness\n    fun testMergeDependencyFeatures() {\n        val merged =\n            listOf(\n                CargoDependency(\"A\", CratesIo(\"1\"), Compile, optional = false, features = setOf()),\n                CargoDependency(\"A\", CratesIo(\"1\"), Compile, optional = false, features = setOf(\"f1\")),\n                CargoDependency(\"A\", CratesIo(\"1\"), Compile, optional = false, features = setOf(\"f2\")),\n                CargoDependency(\"A\", CratesIo(\"1\"), Compile, optional = false, features = setOf(\"f1\", \"f2\")),\n                CargoDependency(\"B\", CratesIo(\"2\"), Compile, optional = false, features = setOf()),\n                CargoDependency(\"B\", CratesIo(\"2\"), Compile, optional = true, features = setOf()),\n                CargoDependency(\"C\", CratesIo(\"3\"), Compile, optional = true, features = setOf()),\n                CargoDependency(\"C\", CratesIo(\"3\"), Compile, optional = true, features = setOf()),\n            ).shuffled().mergeDependencyFeatures()\n\n        merged shouldBe\n            setOf(\n                CargoDependency(\"A\", CratesIo(\"1\"), Compile, optional = false, features = setOf(\"f1\", \"f2\")),\n                CargoDependency(\"B\", CratesIo(\"2\"), Compile, optional = false, features = setOf()),\n                CargoDependency(\"C\", CratesIo(\"3\"), Compile, optional = true, features = setOf()),\n            )\n    }\n\n    @RepeatedTest(10) // Test it several times since the shuffle adds in some randomness\n    fun testMergeDependencyFeaturesDontMergeDevOnlyFeatures() {\n        val merged =\n            listOf(\n                CargoDependency(\"A\", CratesIo(\"1\"), Compile, features = setOf(\"a\")),\n                CargoDependency(\"A\", CratesIo(\"1\"), Compile, features = setOf(\"b\")),\n                CargoDependency(\"A\", CratesIo(\"1\"), Dev, features = setOf(\"c\")),\n                CargoDependency(\"A\", CratesIo(\"1\"), Dev, features = setOf(\"test-util\")),\n            ).shuffled().mergeDependencyFeatures()\n                .sortedBy { it.scope }\n\n        merged shouldBe\n            setOf(\n                CargoDependency(\"A\", CratesIo(\"1\"), Compile, features = setOf(\"a\", \"b\")),\n                CargoDependency(\"A\", CratesIo(\"1\"), Dev, features = setOf(\"c\", \"test-util\")),\n            )\n    }\n\n    @Test\n    fun testMergeIdenticalFeatures() {\n        val merged =\n            listOf(\n                CargoDependency(\"A\", CratesIo(\"1\"), Compile),\n                CargoDependency(\"A\", CratesIo(\"1\"), Dev),\n                CargoDependency(\"B\", CratesIo(\"1\"), Compile),\n                CargoDependency(\"B\", CratesIo(\"1\"), Dev, features = setOf(\"a\", \"b\")),\n                CargoDependency(\"C\", CratesIo(\"1\"), Compile),\n                CargoDependency(\"C\", CratesIo(\"1\"), Dev, features = setOf(\"test-util\")),\n            ).mergeIdenticalTestDependencies()\n        merged shouldBe\n            setOf(\n                CargoDependency(\"A\", CratesIo(\"1\"), Compile),\n                CargoDependency(\"B\", CratesIo(\"1\"), Compile),\n                CargoDependency(\"B\", CratesIo(\"1\"), Dev, features = setOf(\"a\", \"b\")),\n                CargoDependency(\"C\", CratesIo(\"1\"), Compile),\n                CargoDependency(\"C\", CratesIo(\"1\"), Dev, features = setOf(\"test-util\")),\n            )\n    }\n}\n"
  },
  {
    "path": "codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/RuntimeTypeTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy\n\nimport io.kotest.matchers.shouldBe\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.params.ParameterizedTest\nimport org.junit.jupiter.params.provider.Arguments\nimport org.junit.jupiter.params.provider.MethodSource\nimport software.amazon.smithy.model.node.Node\nimport software.amazon.smithy.rust.codegen.core.Version\nimport software.amazon.smithy.rust.codegen.core.rustlang.CratesIo\nimport software.amazon.smithy.rust.codegen.core.rustlang.Local\nimport java.util.Optional\n\nclass RuntimeTypesTest {\n    @ParameterizedTest\n    @MethodSource(\"runtimeConfigProvider\")\n    fun `succeeded to parse runtime config`(\n        runtimeConfig: String,\n        expectedCrateLocation: RuntimeCrateLocation,\n    ) {\n        val node = Node.parse(runtimeConfig)\n        val cfg = RuntimeConfig.fromNode(node.asObjectNode())\n        cfg.runtimeCrateLocation shouldBe expectedCrateLocation\n    }\n\n    @Test\n    fun `succeeded to provide a default runtime config if missing`() {\n        // This default config should share the same behaviour with `{}` empty object.\n        val cfg = RuntimeConfig.fromNode(Optional.empty())\n        cfg.runtimeCrateLocation shouldBe RuntimeCrateLocation(null, CrateVersionMap(mapOf()))\n    }\n\n    @Test\n    fun `runtimeCrateLocation provides dependency location`() {\n        val crateLoc = RuntimeCrateLocation(\"/foo\", CrateVersionMap(mapOf(\"aws-smithy-runtime-api\" to \"999.999\")))\n        crateLoc.crateLocation(\"aws-smithy-runtime\") shouldBe Local(\"/foo\", null)\n        crateLoc.crateLocation(\"aws-smithy-runtime-api\") shouldBe Local(\"/foo\", null)\n        crateLoc.crateLocation(\"aws-smithy-http\") shouldBe Local(\"/foo\", null)\n\n        val crateLocVersioned =\n            RuntimeCrateLocation(null, CrateVersionMap(mapOf(\"aws-smithy-runtime-api\" to \"999.999\")))\n        crateLocVersioned.crateLocation(\"aws-smithy-runtime\") shouldBe CratesIo(Version.crateVersion(\"aws-smithy-runtime\"))\n        crateLocVersioned.crateLocation(\"aws-smithy-runtime-api\") shouldBe CratesIo(\"999.999\")\n        crateLocVersioned.crateLocation(\"aws-smithy-http\") shouldBe CratesIo(Version.crateVersion(\"aws-smithy-http\"))\n    }\n\n    companion object {\n        @JvmStatic\n        fun runtimeConfigProvider() =\n            listOf(\n                Arguments.of(\n                    \"{}\",\n                    RuntimeCrateLocation(null, CrateVersionMap(mapOf())),\n                ),\n                Arguments.of(\n                    \"\"\"\n                    {\n                        \"relativePath\": \"/path\"\n                    }\n                    \"\"\",\n                    RuntimeCrateLocation(\"/path\", CrateVersionMap(mapOf())),\n                ),\n                Arguments.of(\n                    \"\"\"\n                    {\n                        \"versions\": {\n                            \"a\": \"1.0\",\n                            \"b\": \"2.0\"\n                        }\n                    }\n                    \"\"\",\n                    RuntimeCrateLocation(null, CrateVersionMap(mapOf(\"a\" to \"1.0\", \"b\" to \"2.0\"))),\n                ),\n                Arguments.of(\n                    \"\"\"\n                    {\n                        \"relativePath\": \"/path\",\n                        \"versions\": {\n                            \"a\": \"1.0\",\n                            \"b\": \"2.0\"\n                        }\n                    }\n                    \"\"\",\n                    RuntimeCrateLocation(\"/path\", CrateVersionMap(mapOf(\"a\" to \"1.0\", \"b\" to \"2.0\"))),\n                ),\n            )\n    }\n}\n"
  },
  {
    "path": "codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/SymbolVisitorTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy\n\nimport io.kotest.matchers.collections.shouldContain\nimport io.kotest.matchers.collections.shouldNotBeEmpty\nimport io.kotest.matchers.shouldBe\nimport org.junit.jupiter.api.Assertions\nimport org.junit.jupiter.api.DisplayName\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.params.ParameterizedTest\nimport org.junit.jupiter.params.provider.CsvSource\nimport software.amazon.smithy.codegen.core.Symbol\nimport software.amazon.smithy.codegen.core.SymbolProvider\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.loader.ModelAssembler\nimport software.amazon.smithy.model.shapes.ListShape\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.SetShape\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.model.shapes.StringShape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.traits.ErrorTrait\nimport software.amazon.smithy.model.traits.SparseTrait\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustType\nimport software.amazon.smithy.rust.codegen.core.rustlang.render\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.testSymbolProvider\n\nclass SymbolVisitorTest {\n    private fun Symbol.referenceClosure(): List<Symbol> {\n        val referencedSymbols = this.references.map { it.symbol }\n        return listOf(this) + referencedSymbols.flatMap { it.referenceClosure() }\n    }\n\n    @Test\n    fun `creates structures`() {\n        val memberBuilder = MemberShape.builder().id(\"foo.bar#MyStruct\\$someField\").target(\"smithy.api#String\")\n        val member = memberBuilder.build()\n        val struct =\n            StructureShape.builder()\n                .id(\"foo.bar#MyStruct\")\n                .addMember(member)\n                .build()\n        val model =\n            Model.assembler()\n                .addShapes(struct, member)\n                .assemble()\n                .unwrap()\n        val provider: SymbolProvider = testSymbolProvider(model)\n        val sym = provider.toSymbol(struct)\n        sym.rustType().render(false) shouldBe \"MyStruct\"\n        sym.definitionFile shouldBe \"src/test_model.rs\"\n        sym.namespace shouldBe \"crate::test_model\"\n    }\n\n    @Test\n    fun `renames errors`() {\n        val memberBuilder = MemberShape.builder().id(\"foo.bar#TerribleException\\$someField\").target(\"smithy.api#String\")\n        val member = memberBuilder.build()\n        val struct =\n            StructureShape.builder()\n                .id(\"foo.bar#TerribleException\")\n                .addMember(member)\n                .addTrait(ErrorTrait(\"server\"))\n                .build()\n        val model =\n            Model.assembler()\n                .addShapes(struct, member)\n                .assemble()\n                .unwrap()\n        val provider: SymbolProvider = testSymbolProvider(model)\n        val sym = provider.toSymbol(struct)\n        sym.rustType().render(false) shouldBe \"TerribleError\"\n        sym.definitionFile shouldBe \"src/test_error.rs\"\n    }\n\n    @Test\n    fun `creates enums`() {\n        val model =\n            \"\"\"\n            namespace test\n\n            @enum([\n                {\n                    value: \"Count\",\n                    name: \"COUNT\",\n                },\n                {\n                    value: \"None\",\n                    name: \"NONE\",\n                }\n            ])\n            string StandardUnit\n            \"\"\".asSmithyModel()\n        val shape = model.expectShape(ShapeId.from(\"test#StandardUnit\"))\n        val provider: SymbolProvider = testSymbolProvider(model)\n        val sym = provider.toSymbol(shape)\n        sym.rustType().render(false) shouldBe \"StandardUnit\"\n        sym.definitionFile shouldBe \"src/test_model.rs\"\n        sym.namespace shouldBe \"crate::test_model\"\n    }\n\n    @DisplayName(\"Creates primitives\")\n    @ParameterizedTest(name = \"{index} ==> ''{0}''\")\n    @CsvSource(\n        \"String, true, String\",\n        \"Integer, true, i32\",\n        \"PrimitiveInteger, false, i32\",\n        \"Short, true, i16\",\n        \"PrimitiveShort, false, i16\",\n        \"Long, true, i64\",\n        \"PrimitiveLong, false, i64\",\n        \"Byte, true, i8\",\n        \"PrimitiveByte, false, i8\",\n        \"Float, true, f32\",\n        \"PrimitiveFloat, false, f32\",\n        \"Double, true, f64\",\n        \"PrimitiveDouble, false, f64\",\n        \"Boolean, true, bool\",\n        \"PrimitiveBoolean, false, bool\",\n    )\n    fun `creates primitives`(\n        primitiveType: String,\n        optional: Boolean,\n        rustName: String,\n    ) {\n        val model =\n            \"\"\"\n            namespace foo.bar\n            structure MyStruct {\n                quux: $primitiveType\n            }\n            \"\"\".asSmithyModel()\n        val member = model.expectShape(ShapeId.from(\"foo.bar#MyStruct\\$quux\"))\n        val provider: SymbolProvider = testSymbolProvider(model)\n        val memberSymbol = provider.toSymbol(member)\n        // builtins should not have a namespace set\n        Assertions.assertEquals(\"\", memberSymbol.namespace)\n        Assertions.assertEquals(optional, memberSymbol.isOptional())\n\n        if (!memberSymbol.isOptional()) {\n            Assertions.assertEquals(rustName, memberSymbol.rustType().render(false))\n        } else {\n            Assertions.assertEquals(\"Option<$rustName>\", memberSymbol.rustType().render(false))\n        }\n    }\n\n    @Test\n    fun `creates sets of strings`() {\n        val stringShape = StringShape.builder().id(\"test#Hello\").build()\n        val set =\n            SetShape.builder()\n                .id(\"foo.bar#Records\")\n                .member(stringShape.id)\n                .build()\n        val model =\n            Model.assembler()\n                .addShapes(set, stringShape)\n                .assemble()\n                .unwrap()\n\n        val provider: SymbolProvider = testSymbolProvider(model)\n        val setSymbol = provider.toSymbol(set)\n        setSymbol.rustType().render(false) shouldBe \"${RustType.HashSet.Type}::<String>\"\n        setSymbol.referenceClosure().map { it.name } shouldBe listOf(RustType.HashSet.Type, \"String\")\n    }\n\n    @Test\n    fun `create vec instead for non-strings`() {\n        val struct = StructureShape.builder().id(\"foo.bar#Record\").build()\n        val setMember = MemberShape.builder().id(\"foo.bar#Records\\$member\").target(struct).build()\n        val set =\n            SetShape.builder()\n                .id(\"foo.bar#Records\")\n                .member(setMember)\n                .build()\n        val model =\n            Model.assembler()\n                .addShapes(set, setMember, struct)\n                .assemble()\n                .unwrap()\n\n        val provider: SymbolProvider = testSymbolProvider(model)\n        val setSymbol = provider.toSymbol(set)\n        setSymbol.rustType().render(false) shouldBe \"Vec::<Record>\"\n        setSymbol.referenceClosure().map { it.name } shouldBe listOf(\"Vec\", \"Record\")\n    }\n\n    @Test\n    fun `create sparse collections`() {\n        val struct = StructureShape.builder().id(\"foo.bar#Record\").build()\n        val setMember = MemberShape.builder().id(\"foo.bar#Records\\$member\").target(struct).build()\n        val set =\n            ListShape.builder()\n                .id(\"foo.bar#Records\")\n                .member(setMember)\n                .addTrait(SparseTrait())\n                .build()\n        val model =\n            Model.assembler()\n                .putProperty(ModelAssembler.ALLOW_UNKNOWN_TRAITS, true)\n                .addShapes(set, setMember, struct)\n                .assemble()\n                .unwrap()\n\n        val provider: SymbolProvider = testSymbolProvider(model)\n        val setSymbol = provider.toSymbol(set)\n        setSymbol.rustType().render(false) shouldBe \"Vec::<Option<Record>>\"\n        setSymbol.referenceClosure().map { it.name } shouldBe listOf(\"Vec\", \"Option\", \"Record\")\n    }\n\n    @Test\n    fun `create timestamps`() {\n        val memberBuilder = MemberShape.builder().id(\"foo.bar#MyStruct\\$someField\").target(\"smithy.api#Timestamp\")\n        val member = memberBuilder.build()\n        val struct =\n            StructureShape.builder()\n                .id(\"foo.bar#MyStruct\")\n                .addMember(member)\n                .build()\n        val model =\n            Model.assembler()\n                .addShapes(struct, member)\n                .assemble()\n                .unwrap()\n        val provider: SymbolProvider = testSymbolProvider(model)\n        val sym = provider.toSymbol(member)\n        sym.rustType().render(false) shouldBe \"Option<DateTime>\"\n        sym.referenceClosure().map { it.name } shouldContain \"DateTime\"\n        sym.references[0].dependencies.shouldNotBeEmpty()\n    }\n\n    @Test\n    fun `creates operations`() {\n        val model =\n            \"\"\"\n            namespace smithy.example\n\n            @idempotent\n            @http(method: \"PUT\", uri: \"/{bucketName}/{key}\", code: 200)\n            operation PutObject {\n                input: PutObjectInput\n            }\n\n            structure PutObjectInput {\n                // Sent in the URI label named \"key\".\n                @required\n                @httpLabel\n                key: String,\n\n                // Sent in the URI label named \"bucketName\".\n                @required\n                @httpLabel\n                bucketName: String,\n\n                // Sent in the X-Foo header\n                @httpHeader(\"X-Foo\")\n                foo: String,\n\n                // Sent in the query string as paramName\n                @httpQuery(\"paramName\")\n                someValue: String,\n\n                // Sent in the body\n                data: Blob,\n\n                // Sent in the body\n                additional: String,\n            }\n            \"\"\".asSmithyModel()\n        val symbol = testSymbolProvider(model).toSymbol(model.expectShape(ShapeId.from(\"smithy.example#PutObject\")))\n        symbol.definitionFile shouldBe \"src/test_operation.rs\"\n        symbol.name shouldBe \"PutObject\"\n    }\n\n    @Test\n    fun `handles bigInteger shapes`() {\n        val model =\n            \"\"\"\n            namespace test\n\n            bigInteger MyBigInt\n            \"\"\".asSmithyModel()\n        val provider = testSymbolProvider(model)\n        val sym = provider.toSymbol(model.expectShape(ShapeId.from(\"test#MyBigInt\")))\n        sym.rustType().render(false) shouldBe \"BigInteger\"\n        sym.namespace shouldBe \"::aws_smithy_types\"\n    }\n\n    @Test\n    fun `handles bigDecimal shapes`() {\n        val model =\n            \"\"\"\n            namespace test\n\n            bigDecimal MyBigDecimal\n            \"\"\".asSmithyModel()\n        val provider = testSymbolProvider(model)\n        val sym = provider.toSymbol(model.expectShape(ShapeId.from(\"test#MyBigDecimal\")))\n        sym.rustType().render(false) shouldBe \"BigDecimal\"\n        sym.namespace shouldBe \"::aws_smithy_types\"\n    }\n}\n"
  },
  {
    "path": "codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/customizations/SmithyTypesPubUseExtraTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy.customizations\n\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenContext\nimport software.amazon.smithy.rust.codegen.core.smithy.RustCrate\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.generatePluginContext\nimport software.amazon.smithy.rust.codegen.core.testutil.testCodegenContext\n\nclass SmithyTypesPubUseExtraTest {\n    private fun modelWithMember(\n        inputMember: String = \"\",\n        outputMember: String = \"\",\n        unionMember: String = \"\",\n        additionalShape: String = \"\",\n    ): Model {\n        return \"\"\"\n            namespace test\n\n            service TestService {\n                version: \"123\"\n                operations: [SomeOperation]\n            }\n\n            $additionalShape\n            structure SomeStruct {\n            }\n            union SomeUnion {\n                someStruct: SomeStruct,\n                $unionMember\n            }\n            structure SomeInput {\n                $inputMember\n            }\n            structure SomeOutput {\n                $outputMember\n            }\n\n            operation SomeOperation {\n                input: SomeInput,\n                output: SomeOutput\n            }\n        \"\"\".asSmithyModel(\n            // Filters out models containing `smithy.test#EventHeaderValue` to avoid pulling in\n            // blob and timestamp types, which would defeat the purpose of this test.\n            additionalDeniedModels = arrayOf(\"smithy-protocol-test-traits\"),\n        )\n    }\n\n    private fun initialize(model: Model): Pair<CodegenContext, RustCrate> {\n        val codegenContext = testCodegenContext(model)\n\n        val (context, _) =\n            generatePluginContext(\n                model,\n                runtimeConfig = codegenContext.runtimeConfig,\n            )\n        val rustCrate =\n            RustCrate(\n                context.fileManifest,\n                codegenContext.symbolProvider,\n                codegenContext.settings.codegenConfig,\n                codegenContext.expectModuleDocProvider(),\n            )\n\n        return Pair(codegenContext, rustCrate)\n    }\n\n    private fun reexportsWithEmptyModel() = reexportsWithMember()\n\n    private fun reexportsWithMember(\n        inputMember: String = \"\",\n        outputMember: String = \"\",\n        unionMember: String = \"\",\n        additionalShape: String = \"\",\n    ) = RustWriter.root().let { writer ->\n        val model = modelWithMember(inputMember, outputMember, unionMember, additionalShape)\n        val props = initialize(model)\n        val context = props.first\n        val rustCrate = props.second\n        pubUseSmithyPrimitives(context, model, rustCrate)(writer)\n        pubUseSmithyPrimitivesEventStream(context, model)(writer)\n        writer.toString()\n    }\n\n    private fun assertDoesntHaveReexports(\n        reexports: String,\n        expectedTypes: List<String>,\n    ) = expectedTypes.forEach { assertDoesntHaveReexports(reexports, it) }\n\n    private fun assertDoesntHaveReexports(\n        reexports: String,\n        type: String,\n    ) {\n        if (reexports.contains(type)) {\n            throw AssertionError(\"Expected $type to NOT be re-exported, but it was.\")\n        }\n    }\n\n    private fun assertHasReexports(\n        reexports: String,\n        expectedTypes: List<String>,\n    ) = expectedTypes.forEach { assertHasReexport(reexports, it) }\n\n    private fun assertHasReexport(\n        reexports: String,\n        type: String,\n    ) {\n        if (!reexports.contains(type)) {\n            throw AssertionError(\"Expected $type to be re-exported. Re-exported types:\\n$reexports\")\n        }\n    }\n\n    @Test\n    fun `it re-exports Blob when a model uses blobs`() {\n        this.assertDoesntHaveReexports(reexportsWithEmptyModel(), \"::aws_smithy_types::Blob\")\n        assertHasReexport(reexportsWithMember(inputMember = \"foo: Blob\"), \"::aws_smithy_types::Blob\")\n        assertHasReexport(reexportsWithMember(outputMember = \"foo: Blob\"), \"::aws_smithy_types::Blob\")\n        assertHasReexport(\n            reexportsWithMember(inputMember = \"foo: SomeUnion\", unionMember = \"foo: Blob\"),\n            \"::aws_smithy_types::Blob\",\n        )\n        assertHasReexport(\n            reexportsWithMember(outputMember = \"foo: SomeUnion\", unionMember = \"foo: Blob\"),\n            \"::aws_smithy_types::Blob\",\n        )\n    }\n\n    @Test\n    fun `it re-exports DateTime when a model uses timestamps`() {\n        this.assertDoesntHaveReexports(reexportsWithEmptyModel(), \"aws_smithy_types::DateTime\")\n        assertHasReexport(reexportsWithMember(inputMember = \"foo: Timestamp\"), \"::aws_smithy_types::DateTime\")\n        assertHasReexport(reexportsWithMember(outputMember = \"foo: Timestamp\"), \"::aws_smithy_types::DateTime\")\n        assertHasReexport(\n            reexportsWithMember(inputMember = \"foo: SomeUnion\", unionMember = \"foo: Timestamp\"),\n            \"::aws_smithy_types::DateTime\",\n        )\n        assertHasReexport(\n            reexportsWithMember(outputMember = \"foo: SomeUnion\", unionMember = \"foo: Timestamp\"),\n            \"::aws_smithy_types::DateTime\",\n        )\n    }\n\n    @Test\n    fun `it re-exports ByteStream and AggregatedBytes when a model has streaming`() {\n        val streamingTypes =\n            listOf(\n                \"::aws_smithy_types::byte_stream::ByteStream\",\n                \"::aws_smithy_types::byte_stream::AggregatedBytes\",\n                \"::aws_smithy_types::byte_stream::FsBuilder\",\n                \"::aws_smithy_types::byte_stream::Length\",\n            )\n        val streamingShape = \"@streaming blob Streaming\"\n\n        this.assertDoesntHaveReexports(reexportsWithEmptyModel(), streamingTypes)\n        assertHasReexports(reexportsWithMember(additionalShape = streamingShape, inputMember = \"m: Streaming\"), streamingTypes)\n        assertHasReexports(reexportsWithMember(additionalShape = streamingShape, outputMember = \"m: Streaming\"), streamingTypes)\n\n        // Event streams don't re-export the normal streaming types\n        this.assertDoesntHaveReexports(\n            reexportsWithMember(\n                additionalShape = \"@streaming union EventStream { foo: SomeStruct }\",\n                inputMember = \"m: EventStream\",\n            ),\n            streamingTypes,\n        )\n        this.assertDoesntHaveReexports(\n            reexportsWithMember(\n                additionalShape = \"@streaming union EventStream { foo: SomeStruct }\",\n                outputMember = \"m: EventStream\",\n            ),\n            streamingTypes,\n        )\n    }\n\n    @Test\n    fun `it re-exports when a model has event stream`() {\n        val eventStreamTypes =\n            listOf(\n                \"crate::event_receiver::EventReceiver\",\n                \"::aws_smithy_http::event_stream::EventStreamSender\",\n                \"::aws_smithy_types::event_stream::Header\",\n                \"::aws_smithy_types::event_stream::HeaderValue\",\n                \"::aws_smithy_types::event_stream::Message\",\n                \"::aws_smithy_types::str_bytes::StrBytes\",\n            )\n        val eventStreamShape = \"@streaming union EventStream { foo: SomeStruct }\"\n\n        assertHasReexports(\n            reexportsWithMember(additionalShape = eventStreamShape, inputMember = \"m: EventStream\"),\n            eventStreamTypes,\n        )\n        assertHasReexports(\n            reexportsWithMember(additionalShape = eventStreamShape, outputMember = \"m: EventStream\"),\n            eventStreamTypes,\n        )\n    }\n}\n"
  },
  {
    "path": "codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/BuilderGeneratorTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy.generators\n\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.codegen.core.Symbol\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.knowledge.NullableIndex\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute.Companion.AllowDeprecated\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.implBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.smithy.Default\nimport software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.WrappingSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.expectRustMetadata\nimport software.amazon.smithy.rust.codegen.core.smithy.meta\nimport software.amazon.smithy.rust.codegen.core.smithy.setDefault\nimport software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.compileAndTest\nimport software.amazon.smithy.rust.codegen.core.testutil.testSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.testutil.unitTest\nimport software.amazon.smithy.rust.codegen.core.util.lookup\n\ninternal class BuilderGeneratorTest {\n    private val model = StructureGeneratorTest.model\n    private val inner = StructureGeneratorTest.inner\n    private val struct = StructureGeneratorTest.struct\n    private val credentials = StructureGeneratorTest.credentials\n    private val secretStructure = StructureGeneratorTest.secretStructure\n\n    @Test\n    fun `generate builders`() {\n        val provider = testSymbolProvider(model)\n        val project = TestWorkspace.testProject(provider)\n        project.moduleFor(inner) {\n            rust(\"##![allow(deprecated)]\")\n            generator(model, provider, this, inner).render()\n            generator(model, provider, this, struct).render()\n            implBlock(provider.toSymbol(struct)) {\n                BuilderGenerator.renderConvenienceMethod(this, provider, struct)\n            }\n            unitTest(\"generate_builders\") {\n                rust(\n                    \"\"\"\n                    let my_struct_builder = MyStruct::builder().byte_value(4).foo(\"hello!\");\n                    assert_eq!(*my_struct_builder.get_byte_value(), Some(4));\n\n                    let my_struct = my_struct_builder.build();\n                    assert_eq!(my_struct.foo.unwrap(), \"hello!\");\n                    assert_eq!(my_struct.bar, 0);\n                    \"\"\",\n                )\n            }\n        }\n        project.withModule(provider.moduleForBuilder(struct)) {\n            BuilderGenerator(model, provider, struct, emptyList()).render(this)\n        }\n        project.compileAndTest()\n    }\n\n    @Test\n    fun `generate fallible builders`() {\n        val baseProvider = testSymbolProvider(StructureGeneratorTest.model)\n        val provider =\n            object : WrappingSymbolProvider(baseProvider) {\n                override fun toSymbol(shape: Shape): Symbol {\n                    return baseProvider.toSymbol(shape).toBuilder().setDefault(Default.NoDefault).build()\n                }\n            }\n        val project = TestWorkspace.testProject(provider)\n\n        project.moduleFor(StructureGeneratorTest.struct) {\n            AllowDeprecated.render(this)\n            generator(model, provider, this, inner).render()\n            generator(model, provider, this, struct).render()\n            implBlock(provider.toSymbol(struct)) {\n                BuilderGenerator.renderConvenienceMethod(this, provider, struct)\n            }\n            unitTest(\"generate_fallible_builders\") {\n                rust(\n                    \"\"\"\n                    let my_struct = MyStruct::builder().byte_value(4).foo(\"hello!\").bar(0).build().expect(\"required field was not provided\");\n                    assert_eq!(my_struct.foo.unwrap(), \"hello!\");\n                    assert_eq!(my_struct.bar, 0);\n                    \"\"\",\n                )\n            }\n        }\n        project.withModule(provider.moduleForBuilder(struct)) {\n            BuilderGenerator(model, provider, struct, emptyList()).render(this)\n        }\n        project.compileAndTest()\n    }\n\n    private fun generator(\n        model: Model,\n        provider: RustSymbolProvider,\n        writer: RustWriter,\n        shape: StructureShape,\n    ) = StructureGenerator(model, provider, writer, shape, emptyList(), StructSettings(flattenVecAccessors = true))\n\n    @Test\n    fun `builder for a struct with sensitive fields should implement the debug trait as such`() {\n        val provider = testSymbolProvider(model)\n        val project = TestWorkspace.testProject(provider)\n        project.moduleFor(credentials) {\n            generator(model, provider, this, credentials).render()\n            implBlock(provider.toSymbol(credentials)) {\n                BuilderGenerator.renderConvenienceMethod(this, provider, credentials)\n            }\n            unitTest(\"sensitive_fields\") {\n                rust(\n                    \"\"\"\n                    let builder = Credentials::builder()\n                        .username(\"admin\")\n                        .password(\"pswd\")\n                        .secret_key(\"12345\");\n                         assert_eq!(format!(\"{:?}\", builder),\n                         \"Builder { username: Some(\\\"admin\\\"), password: \\\"*** Sensitive Data Redacted ***\\\", secret_key: \\\"*** Sensitive Data Redacted ***\\\", secret_value_map: \\\"*** Sensitive Data Redacted ***\\\", secret_key_map: \\\"*** Sensitive Data Redacted ***\\\", secret_list: \\\"*** Sensitive Data Redacted ***\\\" }\");\n                    \"\"\",\n                )\n            }\n        }\n        project.withModule(provider.moduleForBuilder(credentials)) {\n            BuilderGenerator(model, provider, credentials, emptyList()).render(this)\n        }\n        project.compileAndTest()\n    }\n\n    @Test\n    fun `builder for a sensitive struct should implement the debug trait as such`() {\n        val provider = testSymbolProvider(model)\n        val project = TestWorkspace.testProject(provider)\n        project.moduleFor(secretStructure) {\n            generator(model, provider, this, secretStructure).render()\n            implBlock(provider.toSymbol(secretStructure)) {\n                BuilderGenerator.renderConvenienceMethod(this, provider, secretStructure)\n            }\n            unitTest(\"sensitive_struct\") {\n                rust(\n                    \"\"\"\n                    let builder = SecretStructure::builder()\n                        .secret_field(\"secret\");\n                    assert_eq!(format!(\"{:?}\", builder), \"Builder { secret_field: \\\"*** Sensitive Data Redacted ***\\\" }\");\n                    \"\"\",\n                )\n            }\n        }\n        project.withModule(provider.moduleForBuilder(secretStructure)) {\n            BuilderGenerator(model, provider, secretStructure, emptyList()).render(this)\n        }\n        project.compileAndTest()\n    }\n\n    @Test\n    fun `it supports nonzero defaults`() {\n        val model =\n            \"\"\"\n            namespace com.test\n            structure MyStruct {\n              @default(0)\n              @required\n              zeroDefault: Integer\n              @required\n              @default(1)\n              oneDefault: OneDefault\n              @required\n              @default(\"\")\n              defaultEmpty: String\n              @required\n              @default(\"some-value\")\n              defaultValue: String\n              @required\n              anActuallyRequiredField: Integer\n              @required\n              @default([])\n              emptyList: StringList\n              noDefault: String\n              @default(true)\n              @required\n              defaultDocument: Document\n\n              @default([])\n              @required\n              listDocument: Document\n\n              @default(0)\n              zero_timestamp: Timestamp\n\n              @default(1)\n              one_timestamp: Timestamp\n\n              @default(\"abc\")\n              blob_abc: Blob\n            }\n            list StringList {\n                member: String\n            }\n            @default(1)\n            integer OneDefault\n\n            \"\"\".asSmithyModel(smithyVersion = \"2.0\")\n\n        val provider =\n            testSymbolProvider(\n                model,\n                rustReservedWordConfig = StructureGeneratorTest.rustReservedWordConfig,\n                nullabilityCheckMode = NullableIndex.CheckMode.CLIENT_CAREFUL,\n            )\n        val project = TestWorkspace.testProject(provider)\n        val shape: StructureShape = model.lookup(\"com.test#MyStruct\")\n        project.useShapeWriter(shape) {\n            generator(model, provider, this, shape).render()\n            BuilderGenerator(model, provider, shape, listOf()).render(this)\n            unitTest(\"test_defaults\") {\n                rustTemplate(\n                    \"\"\"\n                    let s = Builder::default().an_actually_required_field(5).build().unwrap();\n                    assert_eq!(s.zero_default(), 0);\n                    assert_eq!(s.default_empty(), \"\");\n                    assert_eq!(s.default_value(), \"some-value\");\n                    assert_eq!(s.one_default(), 1);\n                    assert!(s.empty_list().is_empty());\n                    assert_eq!(s.an_actually_required_field(), 5);\n                    assert_eq!(s.no_default(), None);\n                    assert_eq!(s.default_document().as_bool().unwrap(), true);\n                    assert_eq!(s.list_document().as_array().expect(\"empty list\"), &[]);\n                    assert_eq!(std::str::from_utf8(s.blob_abc().as_ref()).expect(\"invalid blob\"), \"abc\");\n                    assert_eq!(s.zero_timestamp().secs(), 0);\n                    assert_eq!(s.one_timestamp().secs(), 1);\n                    \"\"\",\n                    \"Struct\" to provider.toSymbol(shape),\n                )\n            }\n        }\n        project.compileAndTest()\n    }\n\n    @Test\n    fun `builder doesn't inherit attributes from struct`() {\n        /**\n         * This test checks if the generated Builder doesn't inherit the macro attributes added to the main struct.\n         *\n         * The strategy is to:\n         * 1) mark the `Inner` struct with `#[deprecated]`\n         * 2) deny use of deprecated in the test\n         * 3) allow use of deprecated by the Builder\n         * 4) Ensure that the builder can be instantiated\n         */\n        class SymbolProviderWithExtraAnnotation(val base: RustSymbolProvider) : RustSymbolProvider by base {\n            override fun toSymbol(shape: Shape): Symbol {\n                val baseSymbol = base.toSymbol(shape)\n                val name = baseSymbol.name\n                if (name == \"Inner\") {\n                    var metadata = baseSymbol.expectRustMetadata()\n                    val attribute = Attribute.Deprecated\n                    metadata = metadata.copy(additionalAttributes = metadata.additionalAttributes + listOf(attribute))\n                    return baseSymbol.toBuilder().meta(metadata).build()\n                } else {\n                    return baseSymbol\n                }\n            }\n        }\n\n        val provider = SymbolProviderWithExtraAnnotation(testSymbolProvider(model))\n        val project = TestWorkspace.testProject(provider)\n        project.moduleFor(inner) {\n            rust(\"##![allow(deprecated)]\")\n            generator(model, provider, this, inner).render()\n            implBlock(provider.toSymbol(inner)) {\n                BuilderGenerator.renderConvenienceMethod(this, provider, inner)\n            }\n            unitTest(\n                \"test\", additionalAttributes = listOf(Attribute.DenyDeprecated),\n                block = {\n                    rust(\n                        // Notice that the builder is instantiated directly, and not through the Inner::builder() method.\n                        // This is because Inner is marked with `deprecated`, so any usage of `Inner` inside the test will\n                        // fail the compilation.\n                        //\n                        // This piece of code would fail though if the Builder inherits the attributes from Inner.\n                        \"\"\"\n                        let _ = test_inner::Builder::default();\n                        \"\"\",\n                    )\n                },\n            )\n        }\n        project.withModule(provider.moduleForBuilder(inner)) {\n            BuilderGenerator(model, provider, inner, emptyList()).render(this)\n        }\n        project.compileAndTest()\n    }\n}\n"
  },
  {
    "path": "codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/CargoTomlGeneratorTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy.generators\n\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.rust.codegen.core.Version\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.CratesIo\nimport software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace\nimport software.amazon.smithy.rust.codegen.core.testutil.compileAndTest\nimport software.amazon.smithy.rust.codegen.core.testutil.unitTest\n\nclass CargoTomlGeneratorTest {\n    private val CargoMetadata: CargoDependency = CargoDependency(\"cargo_metadata\", CratesIo(\"0.15.0\"))\n\n    @Test\n    fun `adds codegen version to package metadata`() {\n        val project = TestWorkspace.testProject()\n        project.lib {\n            addDependency(CargoMetadata)\n            unitTest(\n                \"smithy_codegen_version_in_package_metadata\",\n                \"\"\"\n                let metadata = cargo_metadata::MetadataCommand::new()\n                    .exec()\n                    .expect(\"could not run `cargo metadata`\");\n\n                let pgk_metadata = &metadata.root_package().expect(\"missing root package\").metadata;\n\n                let codegen_version = pgk_metadata\n                    .get(\"smithy\")\n                    .and_then(|s| s.get(\"codegen-version\"))\n                    .expect(\"missing `smithy.codegen-version` field\")\n                    .as_str()\n                    .expect(\"`smithy.codegen-version` is not str\");\n                assert_eq!(codegen_version, \"${Version.fromDefaultResource().gitHash}\");\n                \"\"\",\n            )\n        }\n        project.compileAndTest()\n    }\n}\n"
  },
  {
    "path": "codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/EnumGeneratorTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy.generators\n\nimport io.kotest.matchers.shouldBe\nimport io.kotest.matchers.string.shouldContain\nimport io.kotest.matchers.string.shouldNotContain\nimport org.junit.jupiter.api.Nested\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.StringShape\nimport software.amazon.smithy.model.traits.EnumTrait\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute.Companion.AllowDeprecated\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustReservedWordConfig\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.compileAndTest\nimport software.amazon.smithy.rust.codegen.core.testutil.testSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.testutil.unitTest\nimport software.amazon.smithy.rust.codegen.core.util.REDACTION\nimport software.amazon.smithy.rust.codegen.core.util.expectTrait\nimport software.amazon.smithy.rust.codegen.core.util.lookup\nimport software.amazon.smithy.rust.codegen.core.util.orNull\n\nclass EnumGeneratorTest {\n    private val rustReservedWordConfig =\n        RustReservedWordConfig(\n            enumMemberMap = mapOf(\"Unknown\" to \"UnknownValue\"),\n            structureMemberMap = emptyMap(),\n            unionMemberMap = emptyMap(),\n        )\n\n    @Nested\n    inner class EnumMemberModelTests {\n        private val testModel =\n            \"\"\"\n            namespace test\n            @enum([\n                { value: \"some-value-1\",\n                  name: \"some_name_1\",\n                  documentation: \"Some documentation.\" },\n                { value: \"some-value-2\",\n                  name: \"someName2\",\n                  documentation: \"More documentation #escape\" },\n                { value: \"unknown\",\n                  name: \"unknown\",\n                  documentation: \"It has some docs that #need to be escaped\" }\n            ])\n            string EnumWithUnknown\n            \"\"\".asSmithyModel()\n        private val symbolProvider = testSymbolProvider(testModel, rustReservedWordConfig = rustReservedWordConfig)\n\n        private val enumTrait = testModel.lookup<StringShape>(\"test#EnumWithUnknown\").expectTrait<EnumTrait>()\n\n        private fun model(name: String): EnumMemberModel =\n            EnumMemberModel(\n                testModel.lookup(\"test#EnumWithUnknown\"),\n                enumTrait.values.first { it.name.orNull() == name },\n                symbolProvider,\n                emptyList(),\n            )\n\n        @Test\n        fun `it converts enum names to PascalCase and renames any named Unknown to UnknownValue`() {\n            model(\"some_name_1\").derivedName() shouldBe \"SomeName1\"\n            model(\"someName2\").also { someName2 ->\n                someName2.derivedName() shouldBe \"SomeName2\"\n                someName2.name()!!.renamedFrom shouldBe null\n            }\n            model(\"unknown\").also { unknown ->\n                unknown.derivedName() shouldBe \"UnknownValue\"\n                unknown.name()!!.renamedFrom shouldBe \"Unknown\"\n            }\n        }\n\n        @Test\n        fun `it should render documentation`() {\n            val rendered = RustWriter.forModule(\"model\").also { model(\"some_name_1\").render(it) }.toString()\n            rendered shouldContain\n                \"\"\"\n                /// Some documentation.\n                SomeName1,\n                \"\"\".trimIndent()\n        }\n\n        @Test\n        fun `it adds a documentation note when renaming an enum named Unknown`() {\n            val rendered = RustWriter.forModule(\"model\").also { model(\"unknown\").render(it) }.toString()\n            println(rendered.lines())\n            rendered shouldContain\n                \"\"\"\n                /// It has some docs that #need to be escaped\n                ///\n                /// _Note: `::Unknown` has been renamed to `::UnknownValue`._\n                UnknownValue,\n                \"\"\".trimIndent()\n        }\n    }\n\n    @Nested\n    inner class EnumGeneratorTests {\n        fun RustWriter.renderEnum(\n            model: Model,\n            provider: RustSymbolProvider,\n            shape: StringShape,\n            enumType: EnumType = TestEnumType,\n        ) {\n            EnumGenerator(model, provider, shape, enumType, emptyList()).render(this)\n        }\n\n        @Test\n        fun `it generates named enums`() {\n            val model =\n                \"\"\"\n                namespace test\n                @enum([\n                    {\n                        value: \"t2.nano\",\n                        name: \"T2_NANO\",\n                        documentation: \"T2 instances are Burstable Performance Instances.\",\n                        tags: [\"ebsOnly\"]\n                    },\n                    {\n                        value: \"t2.micro\",\n                        name: \"T2_MICRO\",\n                        documentation: \"T2 instances are Burstable Performance Instances.\",\n                        deprecated: true,\n                        tags: [\"ebsOnly\"]\n                    },\n                ])\n                @deprecated(since: \"1.2.3\")\n                string InstanceType\n                \"\"\".asSmithyModel()\n\n            val shape = model.lookup<StringShape>(\"test#InstanceType\")\n            val provider = testSymbolProvider(model)\n            val project = TestWorkspace.testProject(provider)\n            project.moduleFor(shape) {\n                rust(\"##![allow(deprecated)]\")\n                renderEnum(model, provider, shape)\n                unitTest(\n                    \"it_generates_named_enums\",\n                    \"\"\"\n                    let instance = InstanceType::T2Micro;\n                    assert_eq!(instance.as_str(), \"t2.micro\");\n                    assert_eq!(InstanceType::from(\"t2.nano\"), InstanceType::T2Nano);\n                    \"\"\",\n                )\n                toString().also { output ->\n                    output.shouldContain(\"#[non_exhaustive]\")\n                    // on enum variant `T2Micro`\n                    output.shouldContain(\"#[deprecated]\")\n                    // on enum itself\n                    output.shouldContain(\"#[deprecated(since = \\\"1.2.3\\\")]\")\n                }\n            }\n            project.compileAndTest()\n        }\n\n        @Test\n        fun `named enums implement eq and hash`() {\n            val model =\n                \"\"\"\n                namespace test\n                @enum([\n                {\n                    value: \"Foo\",\n                    name: \"Foo\",\n                },\n                {\n                    value: \"Bar\",\n                    name: \"Bar\"\n                }])\n                string FooEnum\n                \"\"\".asSmithyModel()\n\n            val shape = model.lookup<StringShape>(\"test#FooEnum\")\n            val provider = testSymbolProvider(model)\n            val project = TestWorkspace.testProject(provider)\n            project.moduleFor(shape) {\n                renderEnum(model, provider, shape)\n                unitTest(\n                    \"named_enums_implement_eq_and_hash\",\n                    \"\"\"\n                    assert_eq!(FooEnum::Foo, FooEnum::Foo);\n                    assert_ne!(FooEnum::Bar, FooEnum::Foo);\n                    let mut hash_of_enums = std::collections::HashSet::new();\n                    hash_of_enums.insert(FooEnum::Foo);\n                    \"\"\".trimIndent(),\n                )\n            }\n            project.compileAndTest()\n        }\n\n        @Test\n        fun `unnamed enums implement eq and hash`() {\n            val model =\n                \"\"\"\n                namespace test\n                @enum([\n                {\n                    value: \"Foo\",\n                },\n                {\n                    value: \"Bar\",\n                }])\n                @deprecated\n                string FooEnum\n                \"\"\".asSmithyModel()\n\n            val shape = model.lookup<StringShape>(\"test#FooEnum\")\n            val provider = testSymbolProvider(model)\n            val project = TestWorkspace.testProject(provider)\n            project.moduleFor(shape) {\n                AllowDeprecated.render(this)\n                renderEnum(model, provider, shape)\n                unitTest(\n                    \"unnamed_enums_implement_eq_and_hash\",\n                    \"\"\"\n                    assert_eq!(FooEnum::from(\"Foo\"), FooEnum::from(\"Foo\"));\n                    assert_ne!(FooEnum::from(\"Bar\"), FooEnum::from(\"Foo\"));\n                    let mut hash_of_enums = std::collections::HashSet::new();\n                    hash_of_enums.insert(FooEnum::from(\"Foo\"));\n                    \"\"\".trimIndent(),\n                )\n            }\n            project.compileAndTest()\n        }\n\n        @Test\n        fun `it generates unnamed enums`() {\n            val model =\n                \"\"\"\n                namespace test\n                @enum([\n                    {\n                        value: \"Foo\",\n                    },\n                    {\n                        value: \"Baz\",\n                    },\n                    {\n                        value: \"Bar\",\n                    },\n                    {\n                        value: \"1\",\n                    },\n                    {\n                        value: \"0\",\n                    },\n                ])\n                string FooEnum\n                \"\"\".asSmithyModel()\n\n            val shape = model.lookup<StringShape>(\"test#FooEnum\")\n            val provider = testSymbolProvider(model)\n            val project = TestWorkspace.testProject(provider)\n            project.moduleFor(shape) {\n                AllowDeprecated.render(this)\n                renderEnum(model, provider, shape)\n                unitTest(\n                    \"it_generates_unnamed_enums\",\n                    \"\"\"\n                    // Values should be sorted\n                    assert_eq!(FooEnum::${EnumGenerator.VALUES}(), [\"0\", \"1\", \"Bar\", \"Baz\", \"Foo\"]);\n                    \"\"\".trimIndent(),\n                )\n            }\n            project.compileAndTest()\n        }\n\n        @Test\n        fun `it should generate documentation for enums`() {\n            val model =\n                \"\"\"\n                namespace test\n\n                /// Some top-level documentation.\n                @enum([\n                    { name: \"Known\", value: \"Known\" },\n                    { name: \"Unknown\", value: \"Unknown\" },\n                ])\n                string SomeEnum\n                \"\"\".asSmithyModel()\n\n            val shape = model.lookup<StringShape>(\"test#SomeEnum\")\n            val provider = testSymbolProvider(model, rustReservedWordConfig = rustReservedWordConfig)\n            val project = TestWorkspace.testProject(provider)\n            project.moduleFor(shape) {\n                renderEnum(model, provider, shape)\n                val rendered = toString()\n                rendered shouldContain\n                    \"\"\"\n                    /// Some top-level documentation.\n                    ///\n                    /// _Note: `SomeEnum::Unknown` has been renamed to `::UnknownValue`._\n                    \"\"\".trimIndent()\n            }\n            project.compileAndTest()\n        }\n\n        @Test\n        fun `it should generate documentation for unnamed enums`() {\n            val model =\n                \"\"\"\n                namespace test\n\n                /// Some top-level documentation.\n                @enum([\n                    { value: \"One\" },\n                    { value: \"Two\" },\n                ])\n                string SomeEnum\n                \"\"\".asSmithyModel()\n\n            val shape = model.lookup<StringShape>(\"test#SomeEnum\")\n            val provider = testSymbolProvider(model)\n            val project = TestWorkspace.testProject(provider)\n            project.moduleFor(shape) {\n                renderEnum(model, provider, shape)\n                val rendered = toString()\n                rendered shouldContain\n                    \"\"\"\n                    /// Some top-level documentation.\n                    \"\"\".trimIndent()\n            }\n            project.compileAndTest()\n        }\n\n        @Test\n        fun `it handles variants that clash with Rust reserved words`() {\n            val model =\n                \"\"\"\n                namespace test\n                @enum([\n                    { name: \"Known\", value: \"Known\" },\n                    { name: \"Self\", value: \"other\" },\n                ])\n                string SomeEnum\n                \"\"\".asSmithyModel()\n\n            val shape = model.lookup<StringShape>(\"test#SomeEnum\")\n            val provider = testSymbolProvider(model)\n            val project = TestWorkspace.testProject(provider)\n            project.moduleFor(shape) {\n                renderEnum(model, provider, shape)\n                unitTest(\n                    \"it_handles_variants_that_clash_with_rust_reserved_words\",\n                    \"\"\"assert_eq!(SomeEnum::from(\"other\"), SomeEnum::SelfValue);\"\"\",\n                )\n            }\n            project.compileAndTest()\n        }\n\n        @Test\n        fun `impl debug for non-sensitive enum should implement the derived debug trait`() {\n            val model =\n                \"\"\"\n                namespace test\n                @enum([\n                    { name: \"Foo\", value: \"Foo\" },\n                    { name: \"Bar\", value: \"Bar\" },\n                ])\n                string SomeEnum\n                \"\"\".asSmithyModel()\n\n            val shape = model.lookup<StringShape>(\"test#SomeEnum\")\n            val provider = testSymbolProvider(model)\n            val project = TestWorkspace.testProject(provider)\n            project.moduleFor(shape) {\n                renderEnum(model, provider, shape)\n                unitTest(\n                    \"impl_debug_for_non_sensitive_enum_should_implement_the_derived_debug_trait\",\n                    \"\"\"\n                    assert_eq!(format!(\"{:?}\", SomeEnum::Foo), \"Foo\");\n                    assert_eq!(format!(\"{:?}\", SomeEnum::Bar), \"Bar\");\n                    \"\"\",\n                )\n            }\n            project.compileAndTest()\n        }\n\n        @Test\n        fun `impl debug for sensitive enum should redact text`() {\n            val model =\n                \"\"\"\n                namespace test\n                @sensitive\n                @enum([\n                    { name: \"Foo\", value: \"Foo\" },\n                    { name: \"Bar\", value: \"Bar\" },\n                ])\n                string SomeEnum\n                \"\"\".asSmithyModel()\n\n            val shape = model.lookup<StringShape>(\"test#SomeEnum\")\n            val provider = testSymbolProvider(model)\n            val project = TestWorkspace.testProject(provider)\n            project.moduleFor(shape) {\n                renderEnum(model, provider, shape)\n                unitTest(\n                    \"impl_debug_for_sensitive_enum_should_redact_text\",\n                    \"\"\"\n                    assert_eq!(format!(\"{:?}\", SomeEnum::Foo), $REDACTION);\n                    assert_eq!(format!(\"{:?}\", SomeEnum::Bar), $REDACTION);\n                    \"\"\",\n                )\n            }\n            project.compileAndTest()\n        }\n\n        @Test\n        fun `impl debug for non-sensitive unnamed enum should implement the derived debug trait`() {\n            val model =\n                \"\"\"\n                namespace test\n                @enum([\n                    { value: \"Foo\" },\n                    { value: \"Bar\" },\n                ])\n                string SomeEnum\n                \"\"\".asSmithyModel()\n\n            val shape = model.lookup<StringShape>(\"test#SomeEnum\")\n            val provider = testSymbolProvider(model)\n            val project = TestWorkspace.testProject(provider)\n            project.moduleFor(shape) {\n                renderEnum(model, provider, shape)\n                unitTest(\n                    \"impl_debug_for_non_sensitive_unnamed_enum_should_implement_the_derived_debug_trait\",\n                    \"\"\"\n                    for variant in SomeEnum::values() {\n                        assert_eq!(\n                            format!(\"{:?}\", SomeEnum(variant.to_string())),\n                            format!(\"SomeEnum(\\\"{}\\\")\", variant.to_owned())\n                        );\n                    }\n                    \"\"\",\n                )\n            }\n            project.compileAndTest()\n        }\n\n        @Test\n        fun `impl debug for sensitive unnamed enum should redact text`() {\n            val model =\n                \"\"\"\n                namespace test\n                @sensitive\n                @enum([\n                    { value: \"Foo\" },\n                    { value: \"Bar\" },\n                ])\n                string SomeEnum\n                \"\"\".asSmithyModel()\n\n            val shape = model.lookup<StringShape>(\"test#SomeEnum\")\n            val provider = testSymbolProvider(model)\n            val project = TestWorkspace.testProject(provider)\n            project.moduleFor(shape) {\n                renderEnum(model, provider, shape)\n                unitTest(\n                    \"impl_debug_for_sensitive_unnamed_enum_should_redact_text\",\n                    \"\"\"\n                    for variant in SomeEnum::values() {\n                        assert_eq!(\n                            format!(\"{:?}\", SomeEnum(variant.to_string())),\n                            $REDACTION\n                        );\n                    }\n                    \"\"\",\n                )\n            }\n            project.compileAndTest()\n        }\n\n        @Test\n        fun `it supports other enum types`() {\n            class CustomizingEnumType : EnumType() {\n                override fun implFromForStr(context: EnumGeneratorContext): Writable =\n                    writable {\n                        // intentional no-op\n                    }\n\n                override fun implFromStr(context: EnumGeneratorContext): Writable =\n                    writable {\n                        // intentional no-op\n                    }\n\n                override fun implFromForStrForUnnamedEnum(context: EnumGeneratorContext): Writable =\n                    writable {\n                        // intentional no-op\n                    }\n\n                override fun implFromStrForUnnamedEnum(context: EnumGeneratorContext): Writable =\n                    writable {\n                        // intentional no-op\n                    }\n\n                override fun additionalEnumMembers(context: EnumGeneratorContext): Writable =\n                    writable {\n                        rust(\"// additional enum members\")\n                    }\n\n                override fun additionalAsStrMatchArms(context: EnumGeneratorContext): Writable =\n                    writable {\n                        rust(\"// additional as_str match arm\")\n                    }\n\n                override fun additionalDocs(context: EnumGeneratorContext): Writable =\n                    writable {\n                        rust(\"// additional docs\")\n                    }\n            }\n\n            val model =\n                \"\"\"\n                namespace test\n                @enum([\n                    { name: \"Known\", value: \"Known\" },\n                    { name: \"Self\", value: \"other\" },\n                ])\n                string SomeEnum\n                \"\"\".asSmithyModel()\n            val shape = model.lookup<StringShape>(\"test#SomeEnum\")\n\n            val provider = testSymbolProvider(model)\n            val output =\n                RustWriter.root().apply {\n                    renderEnum(model, provider, shape, CustomizingEnumType())\n                }.toString()\n\n            // Since we didn't use the Infallible EnumType, there should be no Unknown variant\n            output shouldNotContain \"Unknown\"\n            output shouldNotContain \"unknown\"\n            output shouldNotContain \"impl From\"\n            output shouldNotContain \"impl FromStr\"\n            output shouldContain \"// additional enum members\"\n            output shouldContain \"// additional as_str match arm\"\n            output shouldContain \"// additional docs\"\n\n            val project = TestWorkspace.testProject(provider)\n            project.moduleFor(shape) {\n                renderEnum(model, provider, shape, CustomizingEnumType())\n            }\n            project.compileAndTest()\n        }\n\n        @Test\n        fun `it handles named enum values containing hash characters`() {\n            val model =\n                \"\"\"\n                namespace test\n                @enum([\n                    { value: \"Fruits#Apple\", name: \"FRUITS_APPLE\" },\n                    { value: \"Veggies#Carrot\", name: \"VEGGIES_CARROT\" },\n                    { value: \"Dairy#Milk#Whole\", name: \"DAIRY_MILK_WHOLE\" },\n                ])\n                string FoodCategory\n                \"\"\".asSmithyModel()\n\n            val shape = model.lookup<StringShape>(\"test#FoodCategory\")\n            val provider = testSymbolProvider(model)\n            val project = TestWorkspace.testProject(provider)\n            project.moduleFor(shape) {\n                renderEnum(model, provider, shape)\n                unitTest(\n                    \"named_enum_values_with_hash_characters\",\n                    \"\"\"\n                    assert_eq!(FoodCategory::FruitsApple.as_str(), \"Fruits#Apple\");\n                    assert_eq!(FoodCategory::VeggiesCarrot.as_str(), \"Veggies#Carrot\");\n                    assert_eq!(FoodCategory::DairyMilkWhole.as_str(), \"Dairy#Milk#Whole\");\n                    assert_eq!(FoodCategory::from(\"Fruits#Apple\"), FoodCategory::FruitsApple);\n                    assert_eq!(FoodCategory::values(), &[\"Dairy#Milk#Whole\", \"Fruits#Apple\", \"Veggies#Carrot\"]);\n                    \"\"\",\n                )\n            }\n            project.compileAndTest()\n        }\n\n        @Test\n        fun `it handles unnamed enum values containing hash characters`() {\n            val model =\n                \"\"\"\n                namespace test\n                @enum([\n                    { value: \"Fruits#Apple\" },\n                    { value: \"Veggies#Carrot\" },\n                ])\n                string FoodCategory\n                \"\"\".asSmithyModel()\n\n            val shape = model.lookup<StringShape>(\"test#FoodCategory\")\n            val provider = testSymbolProvider(model)\n            val project = TestWorkspace.testProject(provider)\n            project.moduleFor(shape) {\n                renderEnum(model, provider, shape)\n                unitTest(\n                    \"unnamed_enum_values_with_hash_characters\",\n                    \"\"\"\n                    assert_eq!(FoodCategory::from(\"Fruits#Apple\").as_str(), \"Fruits#Apple\");\n                    assert_eq!(FoodCategory::from(\"Veggies#Carrot\").as_str(), \"Veggies#Carrot\");\n                    assert_eq!(FoodCategory::values(), &[\"Fruits#Apple\", \"Veggies#Carrot\"]);\n                    \"\"\",\n                )\n            }\n            project.compileAndTest()\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/InstantiatorTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy.generators\n\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.model.node.Node\nimport software.amazon.smithy.model.node.NumberNode\nimport software.amazon.smithy.model.node.StringNode\nimport software.amazon.smithy.model.shapes.BlobShape\nimport software.amazon.smithy.model.shapes.DoubleShape\nimport software.amazon.smithy.model.shapes.FloatShape\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.shapes.TimestampShape\nimport software.amazon.smithy.model.shapes.UnionShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.withBlock\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenContext\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.transformers.RecursiveShapeBoxer\nimport software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.compileAndTest\nimport software.amazon.smithy.rust.codegen.core.testutil.renderWithModelBuilder\nimport software.amazon.smithy.rust.codegen.core.testutil.testCodegenContext\nimport software.amazon.smithy.rust.codegen.core.testutil.testModule\nimport software.amazon.smithy.rust.codegen.core.testutil.unitTest\nimport software.amazon.smithy.rust.codegen.core.util.dq\nimport software.amazon.smithy.rust.codegen.core.util.lookup\n\nclass InstantiatorTest {\n    private val model =\n        \"\"\"\n        namespace com.test\n\n        @documentation(\"this documents the shape\")\n        structure MyStruct {\n           foo: String,\n           @documentation(\"This *is* documentation about the member.\")\n           bar: PrimitiveInteger,\n           baz: Integer,\n           ts: Timestamp,\n           byteValue: Byte\n        }\n\n        list MyList {\n            member: String\n        }\n\n        @sparse\n        list MySparseList {\n            member: String\n        }\n\n        union MyUnion {\n            stringVariant: String,\n            numVariant: Integer\n        }\n\n        structure Inner {\n            map: NestedMap\n        }\n\n        map NestedMap {\n            key: String,\n            value: Inner\n        }\n\n        structure WithBox {\n            member: WithBox,\n            value: Integer\n        }\n\n        union NestedUnion {\n            struct: NestedStruct,\n            int: Integer\n        }\n\n        structure NestedStruct {\n            @required\n            str: String,\n            @required\n            num: Integer\n        }\n        \"\"\".asSmithyModel().let {\n            RecursiveShapeBoxer().transform(it)\n        }\n\n    private val codegenContext = testCodegenContext(model)\n    private val symbolProvider = codegenContext.symbolProvider\n    private val runtimeConfig = codegenContext.runtimeConfig\n\n    // This is the exact same behavior of the client.\n    private class BuilderKindBehavior(val codegenContext: CodegenContext) : Instantiator.BuilderKindBehavior {\n        override fun hasFallibleBuilder(shape: StructureShape) =\n            BuilderGenerator.hasFallibleBuilder(shape, codegenContext.symbolProvider)\n\n        override fun setterName(memberShape: MemberShape) = memberShape.setterName()\n\n        override fun doesSetterTakeInOption(memberShape: MemberShape) = true\n    }\n\n    @Test\n    fun `generate unions`() {\n        val union = model.lookup<UnionShape>(\"com.test#MyUnion\")\n        val sut =\n            Instantiator(symbolProvider, model, runtimeConfig, BuilderKindBehavior(codegenContext))\n        val data = Node.parse(\"\"\"{ \"stringVariant\": \"ok!\" }\"\"\")\n\n        val project = TestWorkspace.testProject(model)\n        project.moduleFor(union) {\n            UnionGenerator(model, symbolProvider, this, union).render()\n            unitTest(\"generate_unions\") {\n                withBlock(\"let result = \", \";\") {\n                    sut.render(this, union, data)\n                }\n                rust(\"assert_eq!(result, MyUnion::StringVariant(\\\"ok!\\\".to_owned()));\")\n            }\n        }\n        project.compileAndTest()\n    }\n\n    @Test\n    fun `generate struct builders`() {\n        val structure = model.lookup<StructureShape>(\"com.test#MyStruct\")\n        val sut =\n            Instantiator(symbolProvider, model, runtimeConfig, BuilderKindBehavior(codegenContext))\n        val data = Node.parse(\"\"\"{ \"bar\": 10, \"foo\": \"hello\" }\"\"\")\n\n        val project = TestWorkspace.testProject(model)\n        structure.renderWithModelBuilder(model, symbolProvider, project)\n        project.moduleFor(structure) {\n            unitTest(\"generate_struct_builders\") {\n                withBlock(\"let result = \", \";\") {\n                    sut.render(this, structure, data)\n                }\n                rust(\n                    \"\"\"\n                    assert_eq!(result.bar, 10);\n                    assert_eq!(result.foo.unwrap(), \"hello\");\n                    \"\"\",\n                )\n            }\n        }\n        project.compileAndTest()\n    }\n\n    @Test\n    fun `generate builders for boxed structs`() {\n        val structure = model.lookup<StructureShape>(\"com.test#WithBox\")\n        val sut =\n            Instantiator(symbolProvider, model, runtimeConfig, BuilderKindBehavior(codegenContext))\n        val data =\n            Node.parse(\n                \"\"\"\n                {\n                    \"member\": {\n                        \"member\": { }\n                    },\n                    \"value\": 10\n                }\n                \"\"\",\n            )\n\n        val project = TestWorkspace.testProject(model)\n        structure.renderWithModelBuilder(model, symbolProvider, project)\n        project.moduleFor(structure) {\n            unitTest(\"generate_builders_for_boxed_structs\") {\n                withBlock(\"let result = \", \";\") {\n                    sut.render(this, structure, data)\n                }\n                rust(\n                    \"\"\"\n                    assert_eq!(result, WithBox {\n                        value: Some(10),\n                        member: Some(Box::new(WithBox {\n                            value: None,\n                            member: Some(Box::new(WithBox { value: None, member: None })),\n                        }))\n                    });\n                    \"\"\",\n                )\n            }\n        }\n        project.compileAndTest()\n    }\n\n    @Test\n    fun `generate lists`() {\n        val data = Node.parse(\"\"\"[\"bar\", \"foo\"]\"\"\")\n        val sut =\n            Instantiator(symbolProvider, model, runtimeConfig, BuilderKindBehavior(codegenContext))\n\n        val project = TestWorkspace.testProject()\n        project.lib {\n            unitTest(\"generate_lists\") {\n                withBlock(\"let result = \", \";\") {\n                    sut.render(this, model.lookup(\"com.test#MyList\"), data)\n                }\n            }\n            project.compileAndTest()\n        }\n    }\n\n    @Test\n    fun `generate sparse lists`() {\n        val data = Node.parse(\"\"\" [ \"bar\", \"foo\", null ] \"\"\")\n        val sut =\n            Instantiator(\n                symbolProvider,\n                model,\n                runtimeConfig,\n                BuilderKindBehavior(codegenContext),\n            )\n\n        val project = TestWorkspace.testProject(model)\n        project.lib {\n            unitTest(\"generate_sparse_lists\") {\n                withBlock(\"let result = \", \";\") {\n                    sut.render(this, model.lookup(\"com.test#MySparseList\"), data)\n                }\n                rust(\"\"\"assert_eq!(result, vec![Some(\"bar\".to_owned()), Some(\"foo\".to_owned()), None]);\"\"\")\n            }\n        }\n        project.compileAndTest()\n    }\n\n    @Test\n    fun `generate maps of maps`() {\n        val data =\n            Node.parse(\n                \"\"\"\n                {\n                    \"k1\": { \"map\": {} },\n                    \"k2\": { \"map\": { \"k3\": {} } },\n                    \"k3\": { }\n                }\n                \"\"\",\n            )\n        val sut =\n            Instantiator(\n                symbolProvider,\n                model,\n                runtimeConfig,\n                BuilderKindBehavior(codegenContext),\n            )\n        val inner = model.lookup<StructureShape>(\"com.test#Inner\")\n\n        val project = TestWorkspace.testProject(model)\n        inner.renderWithModelBuilder(model, symbolProvider, project)\n        project.moduleFor(inner) {\n            unitTest(\"generate_maps_of_maps\") {\n                withBlock(\"let result = \", \";\") {\n                    sut.render(this, model.lookup(\"com.test#NestedMap\"), data)\n                }\n                rust(\n                    \"\"\"\n                    assert_eq!(result.len(), 3);\n                    assert_eq!(result.get(\"k1\").unwrap().map.as_ref().unwrap().len(), 0);\n                    assert_eq!(result.get(\"k2\").unwrap().map.as_ref().unwrap().len(), 1);\n                    assert_eq!(result.get(\"k3\").unwrap().map, None);\n                    \"\"\",\n                )\n            }\n        }\n        project.compileAndTest(runClippy = true)\n    }\n\n    @Test\n    fun `blob inputs are binary data`() {\n        // \"Parameter values that contain binary data MUST be defined using values\n        // that can be represented in plain text (for example, use \"foo\" and not \"Zm9vCg==\").\"\n        val sut =\n            Instantiator(\n                symbolProvider,\n                model,\n                runtimeConfig,\n                BuilderKindBehavior(codegenContext),\n            )\n\n        val project = TestWorkspace.testProject(model)\n        project.testModule {\n            unitTest(\"blob_inputs_are_binary_data\") {\n                withBlock(\"let blob = \", \";\") {\n                    sut.render(\n                        this,\n                        BlobShape.builder().id(ShapeId.from(\"com.example#Blob\")).build(),\n                        StringNode.parse(\"foo\".dq()),\n                    )\n                }\n                rust(\"assert_eq!(std::str::from_utf8(blob.as_ref()).unwrap(), \\\"foo\\\");\")\n            }\n        }\n        project.compileAndTest()\n    }\n\n    @Test\n    fun `integer and fractional timestamps`() {\n        // \"Parameter values that contain binary data MUST be defined using values\n        // that can be represented in plain text (for example, use \"foo\" and not \"Zm9vCg==\").\"\n        val sut =\n            Instantiator(\n                symbolProvider,\n                model,\n                runtimeConfig,\n                BuilderKindBehavior(codegenContext),\n            )\n        val project = TestWorkspace.testProject(model)\n        project.testModule {\n            unitTest(\"timestamps\") {\n                withBlock(\"let ts_frac = \", \";\") {\n                    sut.render(\n                        this,\n                        TimestampShape.builder().id(ShapeId.from(\"com.example#Timestamp\")).build(),\n                        NumberNode.from(946845296.123),\n                    )\n                }\n                withBlock(\"let ts_int = \", \";\") {\n                    sut.render(\n                        this,\n                        TimestampShape.builder().id(ShapeId.from(\"com.example#Timestamp\")).build(),\n                        NumberNode.from(123),\n                    )\n                }\n                rustTemplate(\n                    \"assert_eq!(ts_frac, #{Timestamp}::from_millis(946845296*1000 + 123));\",\n                    \"Timestamp\" to RuntimeType.dateTime(runtimeConfig),\n                )\n                rustTemplate(\n                    \"assert_eq!(ts_int, #{Timestamp}::from_secs(123));\",\n                    \"Timestamp\" to RuntimeType.dateTime(runtimeConfig),\n                )\n            }\n        }\n        project.compileAndTest()\n    }\n\n    @Test\n    fun `floating-point number instantiation`() {\n        val sut =\n            Instantiator(\n                symbolProvider,\n                model,\n                runtimeConfig,\n                BuilderKindBehavior(codegenContext),\n            )\n        val project = TestWorkspace.testProject(model)\n        project.testModule {\n            unitTest(\"default_number_instantiation\") {\n                for ((value, node) in arrayOf(\n                    \"1.0\" to NumberNode.from(1),\n                    \"1.5\" to NumberNode.from(1.5),\n                    \"1.0\" to StringNode.from(\"1\"),\n                    \"1.5\" to StringNode.from(\"1.5\"),\n                )) {\n                    withBlock(\"let value: f32 = \", \";\") {\n                        sut.render(\n                            this,\n                            FloatShape.builder().id(ShapeId.from(\"com.example#FloatShape\")).build(),\n                            node,\n                        )\n                    }\n                    rustTemplate(\"assert_eq!($value, value);\")\n\n                    withBlock(\"let value: f64 = \", \";\") {\n                        sut.render(\n                            this,\n                            DoubleShape.builder().id(ShapeId.from(\"com.example#DoubleShape\")).build(),\n                            node,\n                        )\n                    }\n                    rustTemplate(\"assert_eq!($value, value);\")\n                }\n            }\n        }\n        project.compileAndTest()\n    }\n}\n"
  },
  {
    "path": "codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/StructureGeneratorTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy.generators\n\nimport io.kotest.matchers.string.shouldContainInOrder\nimport io.kotest.matchers.string.shouldNotContain\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustModule\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustReservedWordConfig\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlock\nimport software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.transformers.RecursiveShapeBoxer\nimport software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.compileAndTest\nimport software.amazon.smithy.rust.codegen.core.testutil.testSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.testutil.unitTest\nimport software.amazon.smithy.rust.codegen.core.util.lookup\n\nclass StructureGeneratorTest {\n    companion object {\n        val model =\n            \"\"\"\n            namespace com.test\n            @documentation(\"this documents the shape\")\n            structure MyStruct {\n               foo: String,\n               @documentation(\"This *is* documentation about the member.\")\n               bar: PrimitiveInteger,\n               // Intentionally deprecated.\n               @deprecated\n               baz: Integer,\n               ts: Timestamp,\n               inner: Inner,\n               byteValue: Byte,\n            }\n\n            // Intentionally empty\n            structure Inner {\n            }\n\n            @error(\"server\")\n            @retryable\n            structure MyError {\n                message: String\n            }\n\n            @sensitive\n            string SecretKey\n\n            @sensitive\n            string Password\n\n            structure Credentials {\n                username: String,\n                password: Password,\n                secretKey: SecretKey,\n                secretValueMap: MapThatContainsSecretValues,\n                secretKeyMap: MapThatContainsSecretKeys,\n                secretList: ListThatContainsSecrets\n            }\n\n            structure StructWithDoc {\n                doc: Document\n            }\n\n            @sensitive\n            structure SecretStructure {\n                secretField: String\n            }\n\n            structure StructWithInnerSecretStructure {\n                public: String,\n                private: SecretStructure,\n            }\n\n            map MapThatContainsSecretKeys {\n                key: SecretKey\n                value: String\n            }\n\n            map MapThatContainsSecretValues {\n                key: String\n                value: SecretKey\n            }\n\n            list ListThatContainsSecrets {\n                member: Password\n            }\n            \"\"\".asSmithyModel()\n        val struct = model.lookup<StructureShape>(\"com.test#MyStruct\")\n        val structWithDoc = model.lookup<StructureShape>(\"com.test#StructWithDoc\")\n        val inner = model.lookup<StructureShape>(\"com.test#Inner\")\n        val credentials = model.lookup<StructureShape>(\"com.test#Credentials\")\n        val secretStructure = model.lookup<StructureShape>(\"com.test#SecretStructure\")\n        val structWithInnerSecretStructure = model.lookup<StructureShape>(\"com.test#StructWithInnerSecretStructure\")\n\n        val rustReservedWordConfig: RustReservedWordConfig =\n            RustReservedWordConfig(\n                structureMemberMap = StructureGenerator.structureMemberNameMap,\n                enumMemberMap = emptyMap(),\n                unionMemberMap = emptyMap(),\n            )\n    }\n\n    private fun structureGenerator(\n        model: Model,\n        provider: RustSymbolProvider,\n        writer: RustWriter,\n        shape: StructureShape,\n    ) = StructureGenerator(model, provider, writer, shape, emptyList(), StructSettings(flattenVecAccessors = true))\n\n    @Test\n    fun `generate basic structures`() {\n        val provider = testSymbolProvider(model, rustReservedWordConfig = rustReservedWordConfig)\n        val project = TestWorkspace.testProject(provider)\n        project.useShapeWriter(inner) {\n            structureGenerator(model, provider, this, inner).render()\n            structureGenerator(model, provider, this, struct).render()\n            unitTest(\n                \"struct_fields_optional\",\n                \"\"\"\n                let s: Option<MyStruct> = None;\n                s.map(|i|println!(\"{:?}, {:?}\", i.ts, i.byte_value));\n                \"\"\",\n            )\n            toString().shouldContainInOrder(\n                \"this documents the shape\", \"#[non_exhaustive]\", \"pub\", \"struct MyStruct\",\n            )\n        }\n        project.compileAndTest()\n    }\n\n    @Test\n    fun `generate structures with public fields`() {\n        val provider = testSymbolProvider(model, rustReservedWordConfig = rustReservedWordConfig)\n        val project = TestWorkspace.testProject(provider)\n\n        project.lib { Attribute.AllowDeprecated.render(this) }\n        project.moduleFor(inner) {\n            val innerGenerator = structureGenerator(model, provider, this, inner)\n            innerGenerator.render()\n        }\n        project.withModule(RustModule.public(\"structs\")) {\n            val generator = structureGenerator(model, provider, this, struct)\n            generator.render()\n        }\n        // By putting the test in another module, it can't access the struct\n        // fields if they are private\n        project.unitTest {\n            Attribute.Test.render(this)\n            rustBlock(\"fn test_public_fields()\") {\n                write(\n                    \"\"\"\n                    let s: Option<crate::structs::MyStruct> = None;\n                    s.map(|i|println!(\"{:?}, {:?}\", i.ts, i.byte_value));\n                    \"\"\",\n                )\n            }\n        }\n        project.compileAndTest()\n    }\n\n    @Test\n    fun `generate a custom debug implementation when the sensitive trait is applied to some members`() {\n        val provider = testSymbolProvider(model, rustReservedWordConfig = rustReservedWordConfig)\n        TestWorkspace.testProject().unitTest {\n            structureGenerator(model, provider, this, credentials).render()\n\n            rust(\n                \"\"\"\n                use std::collections::HashMap;\n\n                let mut secret_map = HashMap::new();\n                secret_map.insert(\"FirstSecret\".to_string(), \"don't leak me\".to_string());\n                secret_map.insert(\"SecondSecret\".to_string(), \"don't leak me\".to_string());\n\n                let secret_list = vec![\"don't leak me\".to_string()];\n\n                let creds = Credentials {\n                    username: Some(\"not_redacted\".to_owned()),\n                    password: Some(\"don't leak me\".to_owned()),\n                    secret_key: Some(\"don't leak me\".to_owned()),\n                    secret_key_map: Some(secret_map.clone()),\n                    secret_value_map: Some(secret_map),\n                    secret_list: Some(secret_list),\n                };\n\n                assert_eq!(format!(\"{:?}\", creds),\n                \"Credentials { username: Some(\\\"not_redacted\\\"), password: \\\"*** Sensitive Data Redacted ***\\\", secret_key: \\\"*** Sensitive Data Redacted ***\\\", secret_value_map: \\\"*** Sensitive Data Redacted ***\\\", secret_key_map: \\\"*** Sensitive Data Redacted ***\\\", secret_list: \\\"*** Sensitive Data Redacted ***\\\" }\");\n                \"\"\",\n            )\n        }.compileAndTest()\n    }\n\n    @Test\n    fun `generate a custom debug implementation when the sensitive trait is applied to the struct`() {\n        val provider = testSymbolProvider(model, rustReservedWordConfig = rustReservedWordConfig)\n        TestWorkspace.testProject().unitTest {\n            structureGenerator(model, provider, this, secretStructure).render()\n\n            rust(\n                \"\"\"\n                let secret_structure = SecretStructure {\n                    secret_field: Some(\"secret\".to_owned()),\n                };\n                assert_eq!(format!(\"{:?}\", secret_structure), \"SecretStructure { secret_field: \\\"*** Sensitive Data Redacted ***\\\" }\");\n                \"\"\",\n            )\n        }.compileAndTest()\n    }\n\n    @Test\n    fun `generate a custom debug implementation when the sensitive trait is applied to an inner struct`() {\n        val provider = testSymbolProvider(model, rustReservedWordConfig = rustReservedWordConfig)\n        val project = TestWorkspace.testProject(provider)\n        project.useShapeWriter(inner) {\n            val secretGenerator = structureGenerator(model, provider, this, secretStructure)\n            val generator = structureGenerator(model, provider, this, structWithInnerSecretStructure)\n            secretGenerator.render()\n            generator.render()\n            unitTest(\n                \"sensitive_inner_structure_redacted\",\n                \"\"\"\n                let secret_structure = SecretStructure {\n                    secret_field: Some(\"secret\".to_owned()),\n                };\n                let struct_with_inner_secret_structure = StructWithInnerSecretStructure {\n                    public: Some(\"Public\".to_owned()),\n                    private: Some(secret_structure),\n                };\n                assert_eq!(format!(\"{:?}\", struct_with_inner_secret_structure), \"StructWithInnerSecretStructure { public: Some(\\\"Public\\\"), private: \\\"*** Sensitive Data Redacted ***\\\" }\");\n                \"\"\",\n            )\n        }\n        project.compileAndTest()\n    }\n\n    @Test\n    fun `attach docs to everything`() {\n        val model =\n            \"\"\"\n            namespace com.test\n            @documentation(\"inner doc\")\n            structure Inner { }\n\n            @documentation(\"shape doc\")\n            structure MyStruct {\n               @documentation(\"member doc\")\n               member: String,\n\n               @documentation(\"specific docs\")\n               nested: Inner,\n\n               nested2: Inner\n        }\"\"\".asSmithyModel()\n        val provider = testSymbolProvider(model, rustReservedWordConfig = rustReservedWordConfig)\n        val project = TestWorkspace.testProject(provider)\n        project.lib {\n            Attribute.DenyMissingDocs.render(this)\n        }\n        project.moduleFor(model.lookup(\"com.test#Inner\")) {\n            structureGenerator(model, provider, this, model.lookup(\"com.test#Inner\")).render()\n            structureGenerator(model, provider, this, model.lookup(\"com.test#MyStruct\")).render()\n        }\n\n        project.compileAndTest()\n    }\n\n    @Test\n    fun `documents are optional in structs`() {\n        val provider = testSymbolProvider(model, rustReservedWordConfig = rustReservedWordConfig)\n        TestWorkspace.testProject().unitTest {\n            structureGenerator(model, provider, this, structWithDoc).render()\n            rust(\n                \"\"\"\n                let _struct = StructWithDoc {\n                    // This will only compile if the document is optional\n                    doc: None\n                };\n                \"\"\".trimIndent(),\n            )\n        }.compileAndTest()\n    }\n\n    @Test\n    fun `deprecated trait with message and since`() {\n        val model =\n            \"\"\"\n            namespace test\n\n            @deprecated\n            structure Foo {}\n\n            @deprecated(message: \"Fly, you fools!\")\n            structure Bar {}\n\n            @deprecated(since: \"1.2.3\")\n            structure Baz {}\n\n            @deprecated(message: \"Fly, you fools!\", since: \"1.2.3\")\n            structure Qux {}\n            \"\"\".asSmithyModel()\n        val provider = testSymbolProvider(model, rustReservedWordConfig = rustReservedWordConfig)\n        val project = TestWorkspace.testProject(provider)\n        project.lib { rust(\"##![allow(deprecated)]\") }\n        project.moduleFor(model.lookup(\"test#Foo\")) {\n            structureGenerator(model, provider, this, model.lookup(\"test#Foo\")).render()\n            structureGenerator(model, provider, this, model.lookup(\"test#Bar\")).render()\n            structureGenerator(model, provider, this, model.lookup(\"test#Baz\")).render()\n            structureGenerator(model, provider, this, model.lookup(\"test#Qux\")).render()\n        }\n\n        // turn on clippy to check the semver-compliant version of `since`.\n        project.compileAndTest(runClippy = true)\n    }\n\n    @Test\n    fun `nested deprecated trait`() {\n        val model =\n            \"\"\"\n            namespace test\n\n            structure Nested {\n                foo: Foo,\n                @deprecated\n                foo2: Foo,\n            }\n\n            @deprecated\n            structure Foo {\n                bar: Bar,\n            }\n\n            @deprecated\n            structure Bar {}\n            \"\"\".asSmithyModel()\n        val provider = testSymbolProvider(model, rustReservedWordConfig = rustReservedWordConfig)\n        val project = TestWorkspace.testProject(provider)\n        project.lib { rust(\"##![allow(deprecated)]\") }\n        project.moduleFor(model.lookup(\"test#Nested\")) {\n            structureGenerator(model, provider, this, model.lookup(\"test#Nested\")).render()\n            structureGenerator(model, provider, this, model.lookup(\"test#Foo\")).render()\n            structureGenerator(model, provider, this, model.lookup(\"test#Bar\")).render()\n        }\n\n        project.compileAndTest()\n    }\n\n    @Test\n    fun `it generates accessor methods`() {\n        val testModel =\n            RecursiveShapeBoxer().transform(\n                \"\"\"\n                namespace test\n\n                structure One {\n                    fieldString: String,\n                    fieldBlob: Blob,\n                    fieldTimestamp: Timestamp,\n                    fieldDocument: Document,\n                    fieldBoolean: Boolean,\n                    fieldPrimitiveBoolean: PrimitiveBoolean,\n                    fieldByte: Byte,\n                    fieldPrimitiveByte: PrimitiveByte,\n                    fieldShort: Short,\n                    fieldPrimitiveShort: PrimitiveShort,\n                    fieldInteger: Integer,\n                    fieldPrimitiveInteger: PrimitiveInteger,\n                    fieldLong: Long,\n                    fieldPrimitiveLong: PrimitiveLong,\n                    fieldFloat: Float,\n                    fieldPrimitiveFloat: PrimitiveFloat,\n                    fieldDouble: Double,\n                    fieldPrimitiveDouble: PrimitiveDouble,\n                    two: Two,\n                    build: Integer,\n                    builder: Integer,\n                    default: Integer,\n                }\n\n                structure Two {\n                    one: One,\n                }\n                \"\"\".asSmithyModel(),\n            )\n        val provider = testSymbolProvider(testModel, rustReservedWordConfig = rustReservedWordConfig)\n        val project = TestWorkspace.testProject(provider)\n\n        project.useShapeWriter(inner) {\n            structureGenerator(testModel, provider, this, testModel.lookup(\"test#One\")).render()\n            structureGenerator(testModel, provider, this, testModel.lookup(\"test#Two\")).render()\n\n            rustBlock(\"fn compile_test_one(one: &crate::test_model::One)\") {\n                rust(\n                    \"\"\"\n                    let _: Option<&str> = one.field_string();\n                    let _: Option<&aws_smithy_types::Blob> = one.field_blob();\n                    let _: Option<&aws_smithy_types::DateTime> = one.field_timestamp();\n                    let _: Option<&aws_smithy_types::Document> = one.field_document();\n                    let _: Option<bool> = one.field_boolean();\n                    let _: bool = one.field_primitive_boolean();\n                    let _: Option<i8> = one.field_byte();\n                    let _: i8 = one.field_primitive_byte();\n                    let _: Option<i16> = one.field_short();\n                    let _: i16 = one.field_primitive_short();\n                    let _: Option<i32> = one.field_integer();\n                    let _: i32 = one.field_primitive_integer();\n                    let _: Option<i64> = one.field_long();\n                    let _: i64 = one.field_primitive_long();\n                    let _: Option<f32> = one.field_float();\n                    let _: f32 = one.field_primitive_float();\n                    let _: Option<f64> = one.field_double();\n                    let _: f64 = one.field_primitive_double();\n                    let _: Option<&crate::test_model::Two> = one.two();\n                    let _: Option<i32> = one.build_value();\n                    let _: Option<i32> = one.builder_value();\n                    let _: Option<i32> = one.default_value();\n                    \"\"\",\n                )\n            }\n            rustBlock(\"fn compile_test_two(two: &crate::test_model::Two)\") {\n                rust(\n                    \"\"\"\n                    let _: Option<&crate::test_model::One> = two.one();\n                    \"\"\",\n                )\n            }\n        }\n        project.compileAndTest()\n    }\n\n    @Test\n    fun `fields are NOT doc-hidden`() {\n        val model =\n            \"\"\"\n            namespace com.test\n            structure MyStruct {\n               foo: String,\n               bar: PrimitiveInteger,\n               baz: Integer,\n               ts: Timestamp,\n               byteValue: Byte,\n            }\n            \"\"\".asSmithyModel()\n        val struct = model.lookup<StructureShape>(\"com.test#MyStruct\")\n\n        val provider = testSymbolProvider(model, rustReservedWordConfig = rustReservedWordConfig)\n        RustWriter.forModule(\"test\").let { writer ->\n            structureGenerator(model, provider, writer, struct).render()\n            writer.toString().shouldNotContain(\"#[doc(hidden)]\")\n        }\n    }\n\n    @Test\n    fun `streaming fields are NOT doc-hidden`() {\n        val model =\n            \"\"\"\n            namespace com.test\n            @streaming blob SomeStreamingThing\n            structure MyStruct { foo: SomeStreamingThing }\n            \"\"\".asSmithyModel()\n        val struct = model.lookup<StructureShape>(\"com.test#MyStruct\")\n\n        val provider = testSymbolProvider(model, rustReservedWordConfig = rustReservedWordConfig)\n        RustWriter.forModule(\"test\").let { writer ->\n            structureGenerator(model, provider, writer, struct).render()\n            writer.toString().shouldNotContain(\"#[doc(hidden)]\")\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/TestEnumType.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy.generators\n\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.rawRust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\nimport software.amazon.smithy.rust.codegen.core.util.dq\n\nobject TestEnumType : EnumType() {\n    override fun implFromForStr(context: EnumGeneratorContext): Writable =\n        writable {\n            rustTemplate(\n                \"\"\"\n                impl #{From}<&str> for ${context.enumName} {\n                    fn from(s: &str) -> Self {\n                        match s {\n                            #{matchArms}\n                        }\n                    }\n                }\n                \"\"\",\n                \"From\" to RuntimeType.From,\n                \"matchArms\" to\n                    writable {\n                        context.sortedMembers.forEach { member ->\n                            rawRust(\"${member.value.dq()} => ${context.enumName}::${member.derivedName()},\\n\")\n                        }\n                        rawRust(\"_ => panic!()\")\n                    },\n            )\n        }\n\n    override fun implFromStr(context: EnumGeneratorContext): Writable =\n        writable {\n            rust(\n                \"\"\"\n                impl std::str::FromStr for ${context.enumName} {\n                    type Err = std::convert::Infallible;\n                    fn from_str(s: &str) -> std::result::Result<Self, Self::Err> {\n                        Ok(${context.enumName}::from(s))\n                    }\n                }\n                \"\"\",\n            )\n        }\n\n    override fun implFromForStrForUnnamedEnum(context: EnumGeneratorContext): Writable =\n        writable {\n            rustTemplate(\n                \"\"\"\n                impl<T> #{From}<T> for ${context.enumName} where T: #{AsRef}<str> {\n                    fn from(s: T) -> Self {\n                        ${context.enumName}(s.as_ref().to_owned())\n                    }\n                }\n                \"\"\",\n                *preludeScope,\n            )\n        }\n\n    override fun implFromStrForUnnamedEnum(context: EnumGeneratorContext): Writable =\n        writable {\n            // Add an infallible FromStr implementation for uniformity\n            rustTemplate(\n                \"\"\"\n                impl ::std::str::FromStr for ${context.enumName} {\n                    type Err = ::std::convert::Infallible;\n    \n                    fn from_str(s: &str) -> #{Result}<Self, <Self as ::std::str::FromStr>::Err> {\n                        #{Ok}(${context.enumName}::from(s))\n                    }\n                }\n                \"\"\",\n                *preludeScope,\n            )\n        }\n}\n"
  },
  {
    "path": "codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/UnionGeneratorTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy.generators\n\nimport io.kotest.matchers.string.shouldContain\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustReservedWordConfig\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustReservedWordSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.compileAndTest\nimport software.amazon.smithy.rust.codegen.core.testutil.testSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.util.REDACTION\nimport software.amazon.smithy.rust.codegen.core.util.lookup\n\nclass UnionGeneratorTest {\n    @Test\n    fun `generate basic unions`() {\n        val writer =\n            generateUnion(\n                \"\"\"\n                union MyUnion {\n                    stringConfig: String,\n                    @documentation(\"This *is* documentation about the member\")\n                    intConfig: PrimitiveInteger\n                }\n                \"\"\",\n            )\n\n        writer.compileAndTest(\n            \"\"\"\n            let var_a = MyUnion::StringConfig(\"abc\".to_string());\n            let var_b = MyUnion::IntConfig(10);\n            assert_ne!(var_a, var_b);\n            assert_eq!(var_a, var_a);\n            \"\"\",\n        )\n        writer.toString() shouldContain \"#[non_exhaustive]\"\n    }\n\n    @Test\n    fun `generate basic union with member names Unknown`() {\n        val writer =\n            generateUnion(\n                \"\"\"\n                union MyUnion {\n                    unknown: String\n                }\n                \"\"\",\n            )\n\n        writer.compileAndTest(\n            \"\"\"\n            let var_a = MyUnion::UnknownValue(\"abc\".to_string());\n            let var_b = MyUnion::Unknown;\n            assert_ne!(var_a, var_b);\n            assert_eq!(var_a, var_a);\n            \"\"\",\n        )\n        writer.toString() shouldContain \"#[non_exhaustive]\"\n    }\n\n    @Test\n    fun `generate conversion helper methods`() {\n        val writer =\n            generateUnion(\n                \"\"\"\n                union MyUnion {\n                    stringValue: String,\n                    intValue: PrimitiveInteger\n                }\n                \"\"\",\n            )\n\n        writer.compileAndTest(\n            \"\"\"\n            let foo = MyUnion::StringValue(\"foo\".to_string());\n            let bar = MyUnion::IntValue(10);\n            assert_eq!(foo.is_string_value(), true);\n            assert_eq!(foo.is_int_value(), false);\n            assert_eq!(foo.as_string_value(), Ok(&\"foo\".to_string()));\n            assert_eq!(foo.as_int_value(), Err(&foo));\n            assert_eq!(bar.is_string_value(), false);\n            assert_eq!(bar.is_int_value(), true);\n            assert_eq!(bar.as_string_value(), Err(&bar));\n            assert_eq!(bar.as_int_value(), Ok(&10));\n            \"\"\",\n        )\n    }\n\n    @Test\n    fun `documents are not optional in unions`() {\n        val writer = generateUnion(\"union MyUnion { doc: Document, other: String }\")\n        writer.compileAndTest(\n            \"\"\"\n            // If the document isn't optional, this will compile\n            MyUnion::Doc(aws_smithy_types::Document::Null);\n            \"\"\",\n        )\n    }\n\n    @Test\n    fun `render a union without an unknown variant`() {\n        val writer = generateUnion(\"union MyUnion { a: String, b: String }\", unknownVariant = false)\n        writer.compileAndTest()\n    }\n\n    @Test\n    fun `render an unknown variant`() {\n        val writer = generateUnion(\"union MyUnion { a: String, b: String }\", unknownVariant = true)\n        writer.compileAndTest(\n            \"\"\"\n            let union = MyUnion::Unknown;\n            assert!(union.is_unknown());\n\n            \"\"\",\n        )\n    }\n\n    @Test\n    fun `generate deprecated unions`() {\n        val model =\n            \"\"\"namespace test\n            union Nested {\n                foo: Foo,\n                @deprecated\n                foo2: Foo,\n            }\n            @deprecated\n            union Foo {\n                bar: Bar,\n            }\n\n            @deprecated\n            union Bar { x: Integer }\n            \"\"\".asSmithyModel()\n        val provider = testSymbolProvider(model)\n        val project = TestWorkspace.testProject(provider)\n        project.lib { rust(\"##![allow(deprecated)]\") }\n        project.moduleFor(model.lookup(\"test#Nested\")) {\n            UnionGenerator(model, provider, this, model.lookup(\"test#Nested\")).render()\n            UnionGenerator(model, provider, this, model.lookup(\"test#Foo\")).render()\n            UnionGenerator(model, provider, this, model.lookup(\"test#Bar\")).render()\n        }\n\n        project.compileAndTest()\n    }\n\n    @Test\n    fun `impl debug for non-sensitive union should implement the derived debug trait`() {\n        val writer =\n            generateUnion(\n                \"\"\"\n                union MyUnion {\n                    foo: PrimitiveInteger\n                    bar: String,\n                }\n                \"\"\",\n            )\n\n        writer.compileAndTest(\n            \"\"\"\n            assert_eq!(format!(\"{:?}\", MyUnion::Foo(3)), \"Foo(3)\");\n            assert_eq!(format!(\"{:?}\", MyUnion::Bar(\"bar\".to_owned())), \"Bar(\\\"bar\\\")\");\n            \"\"\",\n        )\n    }\n\n    @Test\n    fun `impl debug for sensitive union should redact text`() {\n        val writer =\n            generateUnion(\n                \"\"\"\n                @sensitive\n                union MyUnion {\n                    foo: PrimitiveInteger,\n                    bar: String,\n                }\n                \"\"\",\n            )\n\n        writer.compileAndTest(\n            \"\"\"\n            assert_eq!(format!(\"{:?}\", MyUnion::Foo(3)), $REDACTION);\n            assert_eq!(format!(\"{:?}\", MyUnion::Bar(\"bar\".to_owned())), $REDACTION);\n            \"\"\",\n        )\n    }\n\n    @Test\n    fun `impl debug for union should redact text for sensitive member target`() {\n        val writer =\n            generateUnion(\n                \"\"\"\n                @sensitive\n                string Bar\n\n                union MyUnion {\n                    foo: PrimitiveInteger,\n                    bar: Bar,\n                }\n                \"\"\",\n            )\n\n        writer.compileAndTest(\n            \"\"\"\n            assert_eq!(format!(\"{:?}\", MyUnion::Foo(3)), \"Foo(3)\");\n            assert_eq!(format!(\"{:?}\", MyUnion::Bar(\"bar\".to_owned())), $REDACTION);\n            \"\"\",\n        )\n    }\n\n    @Test\n    fun `impl debug for union with unit target should redact text for sensitive member target`() {\n        val writer =\n            generateUnion(\n                \"\"\"\n                @sensitive\n                string Bar\n\n                union MyUnion {\n                    foo: Unit,\n                    bar: Bar,\n                }\n                \"\"\",\n            )\n\n        writer.compileAndTest(\n            \"\"\"\n            assert_eq!(format!(\"{:?}\", MyUnion::Foo), \"Foo\");\n            assert_eq!(format!(\"{:?}\", MyUnion::Bar(\"bar\".to_owned())), $REDACTION);\n            \"\"\",\n        )\n    }\n\n    @Test\n    fun `unit types should not appear in generated enum`() {\n        val writer = generateUnion(\"union MyUnion { a: Unit, b: String }\", unknownVariant = true)\n        writer.compileAndTest(\n            \"\"\"\n            let a = MyUnion::A;\n            assert_eq!(Ok(()), a.as_a());\n            \"\"\",\n        )\n    }\n\n    private fun generateUnion(\n        modelSmithy: String,\n        unionName: String = \"MyUnion\",\n        unknownVariant: Boolean = true,\n    ): RustWriter {\n        val model = \"namespace test\\n$modelSmithy\".asSmithyModel()\n        // Reserved words to test generation of renamed members\n        val reservedWords =\n            RustReservedWordConfig(\n                structureMemberMap =\n                    StructureGenerator.structureMemberNameMap,\n                unionMemberMap =\n                    mapOf(\n                        // Unions contain an `Unknown` variant. This exists to support parsing data returned from the server\n                        // that represent union variants that have been added since this SDK was generated.\n                        UnionGenerator.UNKNOWN_VARIANT_NAME to \"${UnionGenerator.UNKNOWN_VARIANT_NAME}Value\",\n                        \"${UnionGenerator.UNKNOWN_VARIANT_NAME}Value\" to \"${UnionGenerator.UNKNOWN_VARIANT_NAME}Value_\",\n                    ),\n                enumMemberMap =\n                    mapOf(),\n            )\n        val provider: RustSymbolProvider = testSymbolProvider(model)\n        val reservedWordsProvider = RustReservedWordSymbolProvider(provider, reservedWords)\n        val writer = RustWriter.forModule(\"model\")\n        UnionGenerator(\n            model,\n            reservedWordsProvider,\n            writer,\n            model.lookup(\"test#$unionName\"),\n            renderUnknownVariant = unknownVariant,\n        ).render()\n        return writer\n    }\n}\n"
  },
  {
    "path": "codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/error/ErrorImplGeneratorTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy.generators.error\n\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.traits.ErrorTrait\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenTarget\nimport software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.compileAndTest\nimport software.amazon.smithy.rust.codegen.core.testutil.renderWithModelBuilder\nimport software.amazon.smithy.rust.codegen.core.testutil.testSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.util.getTrait\n\nclass ErrorImplGeneratorTest {\n    val model =\n        \"\"\"\n        namespace com.test\n\n        @error(\"server\")\n        @retryable\n        structure MyError {\n            message: String\n        }\n        \"\"\".asSmithyModel()\n\n    @Test\n    fun `generate error structures`() {\n        val provider = testSymbolProvider(model)\n        val project = TestWorkspace.testProject(provider)\n        val errorShape = model.expectShape(ShapeId.from(\"com.test#MyError\")) as StructureShape\n        errorShape.renderWithModelBuilder(model, provider, project)\n        project.moduleFor(errorShape) {\n            val errorTrait = errorShape.getTrait<ErrorTrait>()!!\n            ErrorImplGenerator(model, provider, this, errorShape, errorTrait, emptyList()).render(CodegenTarget.CLIENT)\n            compileAndTest(\n                \"\"\"\n                let err = MyError::builder().build();\n                assert_eq!(err.retryable_error_kind(), aws_smithy_types::retry::ErrorKind::ServerError);\n                \"\"\",\n            )\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/ProtocolFunctionsTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy.protocols\n\nimport io.kotest.matchers.shouldBe\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.testSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.util.lookup\n\nclass ProtocolFunctionsTest {\n    private val testModel =\n        \"\"\"\n        namespace test\n\n        structure SomeStruct1 {\n            some_string: String,\n            some_int: Integer,\n        }\n\n        union SomeUnion1 {\n            int: Integer,\n            long: Long,\n        }\n\n        map SomeMap1 {\n            key: String,\n            value: SomeStruct1,\n        }\n\n        list SomeList1 {\n            member: Integer,\n        }\n\n        set SomeSet1 {\n            member: Integer,\n        }\n\n        structure Op1Input {\n            some_struct: SomeStruct1,\n            some_list: SomeList1,\n            some_set: SomeSet1,\n            some_union: SomeUnion1,\n            some_map: SomeMap1,\n        }\n\n        operation Op1 {\n            input: Op1Input,\n        }\n\n        structure SomeStruct2 {\n            some_string: String,\n            some_int: Integer,\n        }\n\n        union SomeUnion2 {\n            int: Integer,\n            long: Long,\n        }\n\n        map SomeMap2 {\n            key: String,\n            value: SomeStruct2,\n        }\n\n        list SomeList2 {\n            member: Integer,\n        }\n\n        structure Op2Input {\n            some_struct: SomeStruct2,\n            some_list: SomeList2,\n            some_union: SomeUnion2,\n            some_map: SomeMap2,\n        }\n\n        operation Op2 {\n            input: Op1Input,\n        }\n        \"\"\".asSmithyModel()\n\n    @Test\n    fun `generates function names for shapes`() {\n        val symbolProvider = testSymbolProvider(testModel)\n\n        fun test(\n            shapeId: String,\n            expected: String,\n        ) {\n            symbolProvider.shapeFunctionName(null, testModel.lookup(shapeId)) shouldBe expected\n        }\n\n        test(\"test#Op1\", \"op1\")\n        test(\"test#SomeList1\", \"some_list1\")\n        test(\"test#SomeMap1\", \"some_map1\")\n        test(\"test#SomeSet1\", \"some_set1\")\n        test(\"test#SomeStruct1\", \"some_struct1\")\n        test(\"test#SomeUnion1\", \"some_union1\")\n        test(\"test#SomeStruct1\\$some_string\", \"some_string\")\n    }\n}\n"
  },
  {
    "path": "codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/parse/AwsQueryParserGeneratorTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy.protocols.parse\n\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.transformers.OperationNormalizer\nimport software.amazon.smithy.rust.codegen.core.smithy.transformers.RecursiveShapeBoxer\nimport software.amazon.smithy.rust.codegen.core.testutil.TestRuntimeConfig\nimport software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.compileAndTest\nimport software.amazon.smithy.rust.codegen.core.testutil.renderWithModelBuilder\nimport software.amazon.smithy.rust.codegen.core.testutil.testCodegenContext\nimport software.amazon.smithy.rust.codegen.core.testutil.testSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.testutil.unitTest\nimport software.amazon.smithy.rust.codegen.core.util.lookup\nimport software.amazon.smithy.rust.codegen.core.util.outputShape\n\nclass AwsQueryParserGeneratorTest {\n    private val baseModel =\n        \"\"\"\n        namespace test\n        use aws.protocols#awsQuery\n\n        structure SomeOutput {\n            @xmlAttribute\n            someAttribute: Long,\n\n            someVal: String\n        }\n\n        operation SomeOperation {\n            output: SomeOutput\n        }\n        \"\"\".asSmithyModel()\n\n    @Test\n    fun `it modifies operation parsing to include Response and Result tags`() {\n        val model = RecursiveShapeBoxer().transform(OperationNormalizer.transform(baseModel))\n        val codegenContext = testCodegenContext(model)\n        val symbolProvider = codegenContext.symbolProvider\n        val parserGenerator =\n            AwsQueryParserGenerator(\n                codegenContext,\n                RuntimeType.wrappedXmlErrors(TestRuntimeConfig),\n            )\n        val operationParser = parserGenerator.operationParser(model.lookup(\"test#SomeOperation\"))!!\n        val project = TestWorkspace.testProject(testSymbolProvider(model))\n\n        project.lib {\n            unitTest(\n                name = \"valid_input\",\n                test = \"\"\"\n                    let xml = br#\"\n                    <SomeOperationResponse>\n                        <SomeOperationResult someAttribute=\"5\">\n                            <someVal>Some value</someVal>\n                        </SomeOperationResult>\n                    </someOperationResponse>\n                    \"#;\n                    let output = ${format(operationParser)}(xml, test_output::SomeOperationOutput::builder()).unwrap().build();\n                    assert_eq!(output.some_attribute, Some(5));\n                    assert_eq!(output.some_val, Some(\"Some value\".to_string()));\n                \"\"\",\n            )\n        }\n        model.lookup<StructureShape>(\"test#SomeOutput\").also { struct ->\n            struct.renderWithModelBuilder(model, symbolProvider, project)\n        }\n        model.lookup<OperationShape>(\"test#SomeOperation\").outputShape(model).also { output ->\n            output.renderWithModelBuilder(model, symbolProvider, project)\n        }\n        project.compileAndTest()\n    }\n}\n"
  },
  {
    "path": "codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/parse/CborParserGeneratorTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy.protocols.parse\n\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.assertThrows\nimport software.amazon.smithy.codegen.core.CodegenException\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.HttpTraitHttpBindingResolver\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.ProtocolContentTypes\nimport software.amazon.smithy.rust.codegen.core.smithy.transformers.OperationNormalizer\nimport software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.compileAndTest\nimport software.amazon.smithy.rust.codegen.core.testutil.renderWithModelBuilder\nimport software.amazon.smithy.rust.codegen.core.testutil.testCodegenContext\nimport software.amazon.smithy.rust.codegen.core.testutil.unitTest\nimport software.amazon.smithy.rust.codegen.core.util.lookup\nimport software.amazon.smithy.rust.codegen.core.util.outputShape\n\nclass CborParserGeneratorTest {\n    private val modelWithBigInteger =\n        \"\"\"\n        namespace test\n        use smithy.protocols#rpcv2Cbor\n\n        @rpcv2Cbor\n        service TestService {\n            version: \"test\",\n            operations: [TestOp]\n        }\n\n        structure TestOutput {\n            bigInt: BigInteger\n        }\n\n        @http(uri: \"/test\", method: \"POST\")\n        operation TestOp {\n            output: TestOutput\n        }\n        \"\"\".asSmithyModel()\n\n    private val modelWithBigDecimal =\n        \"\"\"\n        namespace test\n        use smithy.protocols#rpcv2Cbor\n\n        @rpcv2Cbor\n        service TestService {\n            version: \"test\",\n            operations: [TestOp]\n        }\n\n        structure TestOutput {\n            bigDec: BigDecimal\n        }\n\n        @http(uri: \"/test\", method: \"POST\")\n        operation TestOp {\n            output: TestOutput\n        }\n        \"\"\".asSmithyModel()\n\n    @Test\n    fun `throws CodegenException when deserializing BigInteger with CBOR`() {\n        val model = OperationNormalizer.transform(modelWithBigInteger)\n        val codegenContext = testCodegenContext(model)\n        val symbolProvider = codegenContext.symbolProvider\n        val parserGenerator =\n            CborParserGenerator(\n                codegenContext,\n                HttpTraitHttpBindingResolver(model, ProtocolContentTypes.consistent(\"application/cbor\")),\n                handleNullForNonSparseCollection = { _ -> writable { } },\n            )\n        val operationParser = parserGenerator.operationParser(model.lookup(\"test#TestOp\"))\n\n        val project = TestWorkspace.testProject(symbolProvider)\n\n        val exception =\n            assertThrows<CodegenException> {\n                project.lib {\n                    unitTest(\n                        \"cbor_parser\",\n                        \"\"\"\n                        let bytes = &[];\n                        let _output = ${format(operationParser!!)};\n                        \"\"\",\n                    )\n                }\n\n                model.lookup<OperationShape>(\"test#TestOp\").outputShape(model).also { output ->\n                    output.renderWithModelBuilder(model, symbolProvider, project)\n                }\n                project.compileAndTest()\n            }\n\n        assert(exception.message!!.contains(\"BigInteger is not supported with Concise Binary Object Representation (CBOR)\"))\n    }\n\n    @Test\n    fun `throws CodegenException when deserializing BigDecimal with CBOR`() {\n        val model = OperationNormalizer.transform(modelWithBigDecimal)\n        val codegenContext = testCodegenContext(model)\n        val symbolProvider = codegenContext.symbolProvider\n        val parserGenerator =\n            CborParserGenerator(\n                codegenContext,\n                HttpTraitHttpBindingResolver(model, ProtocolContentTypes.consistent(\"application/cbor\")),\n                handleNullForNonSparseCollection = { _ -> writable { } },\n            )\n        val operationParser = parserGenerator.operationParser(model.lookup(\"test#TestOp\"))\n\n        val project = TestWorkspace.testProject(symbolProvider)\n\n        val exception =\n            assertThrows<CodegenException> {\n                project.lib {\n                    unitTest(\n                        \"cbor_parser\",\n                        \"\"\"\n                        let bytes = &[];\n                        let _output = ${format(operationParser!!)};\n                        \"\"\",\n                    )\n                }\n\n                model.lookup<OperationShape>(\"test#TestOp\").outputShape(model).also { output ->\n                    output.renderWithModelBuilder(model, symbolProvider, project)\n                }\n                project.compileAndTest()\n            }\n\n        assert(exception.message!!.contains(\"BigDecimal is not supported with Concise Binary Object Representation (CBOR)\"))\n    }\n}\n"
  },
  {
    "path": "codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/parse/Ec2QueryParserGeneratorTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy.protocols.parse\n\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.transformers.OperationNormalizer\nimport software.amazon.smithy.rust.codegen.core.smithy.transformers.RecursiveShapeBoxer\nimport software.amazon.smithy.rust.codegen.core.testutil.TestRuntimeConfig\nimport software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.compileAndTest\nimport software.amazon.smithy.rust.codegen.core.testutil.renderWithModelBuilder\nimport software.amazon.smithy.rust.codegen.core.testutil.testCodegenContext\nimport software.amazon.smithy.rust.codegen.core.testutil.testSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.testutil.unitTest\nimport software.amazon.smithy.rust.codegen.core.util.lookup\nimport software.amazon.smithy.rust.codegen.core.util.outputShape\n\nclass Ec2QueryParserGeneratorTest {\n    private val baseModel =\n        \"\"\"\n        namespace test\n        use aws.protocols#awsQuery\n\n        structure SomeOutput {\n            @xmlAttribute\n            someAttribute: Long,\n\n            someVal: String\n        }\n\n        operation SomeOperation {\n            output: SomeOutput\n        }\n        \"\"\".asSmithyModel()\n\n    @Test\n    fun `it modifies operation parsing to include Response and Result tags`() {\n        val model = RecursiveShapeBoxer().transform(OperationNormalizer.transform(baseModel))\n        val codegenContext = testCodegenContext(model)\n        val symbolProvider = codegenContext.symbolProvider\n        val parserGenerator =\n            Ec2QueryParserGenerator(\n                codegenContext,\n                RuntimeType.wrappedXmlErrors(TestRuntimeConfig),\n            )\n        val operationParser = parserGenerator.operationParser(model.lookup(\"test#SomeOperation\"))!!\n        val project = TestWorkspace.testProject(testSymbolProvider(model))\n\n        project.lib {\n            unitTest(\n                \"valid_input\",\n                \"\"\"\n                let xml = br#\"\n                <SomeOperationResponse someAttribute=\"5\">\n                    <someVal>Some value</someVal>\n                </someOperationResponse>\n                \"#;\n                let output = ${format(operationParser)}(xml, test_output::SomeOperationOutput::builder()).unwrap().build();\n                assert_eq!(output.some_attribute, Some(5));\n                assert_eq!(output.some_val, Some(\"Some value\".to_string()));\n                \"\"\",\n            )\n        }\n\n        model.lookup<StructureShape>(\"test#SomeOutput\").also { struct ->\n            struct.renderWithModelBuilder(model, symbolProvider, project)\n        }\n\n        model.lookup<OperationShape>(\"test#SomeOperation\").outputShape(model).also { output ->\n            output.renderWithModelBuilder(model, symbolProvider, project)\n        }\n        project.compileAndTest()\n    }\n}\n"
  },
  {
    "path": "codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/parse/JsonParserGeneratorTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy.protocols.parse\n\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.StringShape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.EnumGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.TestEnumType\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.UnionGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.HttpTraitHttpBindingResolver\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.ProtocolContentTypes\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.restJsonFieldName\nimport software.amazon.smithy.rust.codegen.core.smithy.transformers.OperationNormalizer\nimport software.amazon.smithy.rust.codegen.core.smithy.transformers.RecursiveShapeBoxer\nimport software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.compileAndTest\nimport software.amazon.smithy.rust.codegen.core.testutil.renderWithModelBuilder\nimport software.amazon.smithy.rust.codegen.core.testutil.testCodegenContext\nimport software.amazon.smithy.rust.codegen.core.testutil.testSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.testutil.unitTest\nimport software.amazon.smithy.rust.codegen.core.util.lookup\nimport software.amazon.smithy.rust.codegen.core.util.outputShape\n\nclass JsonParserGeneratorTest {\n    private val baseModel =\n        \"\"\"\n        namespace test\n        use aws.protocols#restJson1\n\n        union Choice {\n            blob: Blob,\n            boolean: Boolean,\n            date: Timestamp,\n            document: Document,\n            enum: FooEnum,\n            int: Integer,\n            list: SomeList,\n            listSparse: SomeSparseList,\n            long: Long,\n            map: MyMap,\n            mapSparse: MySparseMap,\n            number: Double,\n            s: String,\n            top: Top,\n            unit: Unit,\n        }\n\n        @enum([{name: \"FOO\", value: \"FOO\"}])\n        string FooEnum\n\n        map MyMap {\n            key: String,\n            value: Choice,\n        }\n\n        @sparse\n        map MySparseMap {\n            key: String,\n            value: Choice,\n        }\n\n        list SomeList {\n            member: Choice\n        }\n\n        @sparse\n        list SomeSparseList {\n            member: Choice\n        }\n\n        structure EmptyStruct {\n        }\n\n        structure Top {\n            @required\n            choice: Choice,\n            field: String,\n            extra: Integer,\n            @jsonName(\"rec\")\n            recursive: TopList,\n            empty: EmptyStruct,\n        }\n\n        list TopList {\n            member: Top\n        }\n\n        structure OpOutput {\n            @httpHeader(\"x-test\")\n            someHeader: String,\n\n            top: Top\n        }\n\n        @error(\"client\")\n        structure Error {\n            message: String,\n            reason: String\n        }\n\n        @http(uri: \"/top\", method: \"POST\")\n        operation Op {\n            output: OpOutput,\n            errors: [Error]\n        }\n        \"\"\".asSmithyModel()\n\n    @Test\n    fun `generates valid deserializers`() {\n        val model = RecursiveShapeBoxer().transform(OperationNormalizer.transform(baseModel))\n        val codegenContext = testCodegenContext(model)\n        val symbolProvider = codegenContext.symbolProvider\n\n        val parserGenerator =\n            JsonParserGenerator(\n                codegenContext,\n                HttpTraitHttpBindingResolver(model, ProtocolContentTypes.consistent(\"application/json\")),\n                ::restJsonFieldName,\n            )\n        val operationGenerator = parserGenerator.operationParser(model.lookup(\"test#Op\"))\n        val payloadGenerator = parserGenerator.payloadParser(model.lookup(\"test#OpOutput\\$top\"))\n        val errorParser = parserGenerator.errorParser(model.lookup(\"test#Error\"))\n\n        val project = TestWorkspace.testProject(testSymbolProvider(model))\n        project.lib {\n            unitTest(\n                \"json_parser\",\n                \"\"\"\n                use test_model::Choice;\n\n                // Generate the document serializer even though it's not tested directly\n                // ${format(payloadGenerator)}\n\n                let json = br#\"\n                    { \"top\":\n                        { \"extra\": 45,\n                          \"field\": \"something\",\n                          \"choice\": { \"int\": 5 },\n                          \"empty\": { \"not_empty\": true }\n                        }\n                    }\n                \"#;\n\n                let output = ${format(operationGenerator!!)}(json, test_output::OpOutput::builder()).unwrap().build();\n                let top = output.top.expect(\"top\");\n                assert_eq!(Some(45), top.extra);\n                assert_eq!(Some(\"something\".to_string()), top.field);\n                assert_eq!(Choice::Int(5), top.choice);\n                \"\"\",\n            )\n            unitTest(\n                \"empty_body\",\n                \"\"\"\n                // empty body\n                let output = ${format(operationGenerator)}(b\"\", test_output::OpOutput::builder()).unwrap().build();\n                assert_eq!(output.top, None);\n                \"\"\",\n            )\n            unitTest(\n                \"unknown_variant\",\n                \"\"\"\n                // unknown variant\n                let input = br#\"{ \"top\": { \"choice\": { \"somenewvariant\": \"data\" } } }\"#;\n                let output = ${format(operationGenerator)}(input, test_output::OpOutput::builder()).unwrap().build();\n                assert!(output.top.unwrap().choice.is_unknown());\n                \"\"\",\n            )\n\n            unitTest(\n                \"dunder_type_should_be_ignored\",\n                \"\"\"\n                // __type field should be ignored during deserialization\n                let input = br#\"{ \"top\": { \"choice\": { \"int\": 5, \"__type\": \"value-should-be-ignored-anyway\" } } }\"#;\n                let output = ${format(operationGenerator)}(input, test_output::OpOutput::builder()).unwrap().build();\n                use test_model::Choice;\n                assert_eq!(Choice::Int(5), output.top.unwrap().choice);\n                \"\"\",\n            )\n\n            unitTest(\n                \"allow_null_for_variants\",\n                \"\"\"\n                // __type field should be ignored during deserialization\n                let input = br#\"{ \"top\": { \"choice\": { \"blob\": null, \"boolean\": null, \"int\": 5, \"long\": null, \"__type\": \"value-should-be-ignored-anyway\" } } }\"#;\n                let output = ${format(operationGenerator)}(input, test_output::OpOutput::builder()).unwrap().build();\n                use test_model::Choice;\n                assert_eq!(Choice::Int(5), output.top.unwrap().choice);\n                \"\"\",\n            )\n\n            unitTest(\n                \"all_variants_null\",\n                \"\"\"\n                // __type field should be ignored during deserialization\n                let input = br#\"{ \"top\": { \"choice\": { \"blob\": null, \"boolean\": null, \"int\": null, \"long\": null, \"__type\": \"value-should-be-ignored-anyway\" } } }\"#;\n                let _err = ${format(operationGenerator)}(input, test_output::OpOutput::builder()).expect_err(\"invalid union\");\n                \"\"\",\n            )\n\n            unitTest(\n                \"empty_error\",\n                \"\"\"\n                // empty error\n                let error_output = ${format(errorParser!!)}(b\"\", test_error::Error::builder()).unwrap().build();\n                assert_eq!(error_output.message, None);\n                \"\"\",\n            )\n\n            unitTest(\n                \"error_with_message\",\n                \"\"\"\n                // error with message\n                let error_output = ${format(errorParser)}(br#\"{\"message\": \"hello\"}\"#, test_error::Error::builder()).unwrap().build();\n                assert_eq!(error_output.message.expect(\"message should be set\"), \"hello\");\n                \"\"\",\n            )\n\n            unitTest(\n                \"dense_list_rejects_null\",\n                \"\"\"\n                // dense list should reject null values\n                let input = br#\"{ \"top\": { \"choice\": { \"list\": [{ \"int\": 5 }, null, { \"int\": 6 }] } } }\"#;\n                let err = ${format(operationGenerator)}(input, test_output::OpOutput::builder()).expect_err(\"dense list cannot contain null\");\n                assert!(err.to_string().contains(\"dense list cannot contain null values\"));\n                \"\"\",\n            )\n\n            unitTest(\n                \"dense_map_rejects_null\",\n                \"\"\"\n                // dense map should reject null values\n                let input = br#\"{ \"top\": { \"choice\": { \"map\": { \"a\": { \"int\": 5 }, \"b\": null } } } }\"#;\n                let err = ${format(operationGenerator)}(input, test_output::OpOutput::builder()).expect_err(\"dense map cannot contain null\");\n                assert!(err.to_string().contains(\"dense map cannot contain null values\"));\n                \"\"\",\n            )\n\n            unitTest(\n                \"sparse_list_allows_null\",\n                \"\"\"\n                // sparse list should allow null values\n                let input = br#\"{ \"top\": { \"choice\": { \"listSparse\": [{ \"int\": 5 }, null, { \"int\": 6 }] } } }\"#;\n                let output = ${format(operationGenerator)}(input, test_output::OpOutput::builder()).unwrap().build();\n                use test_model::Choice;\n                match output.top.unwrap().choice {\n                    Choice::ListSparse(list) => {\n                        assert_eq!(list.len(), 3);\n                        assert_eq!(list[0], Some(Choice::Int(5)));\n                        assert_eq!(list[1], None);\n                        assert_eq!(list[2], Some(Choice::Int(6)));\n                    }\n                    _ => panic!(\"expected ListSparse variant\"),\n                }\n                \"\"\",\n            )\n\n            unitTest(\n                \"sparse_map_allows_null\",\n                \"\"\"\n                // sparse map should allow null values\n                let input = br#\"{ \"top\": { \"choice\": { \"mapSparse\": { \"a\": { \"int\": 5 }, \"b\": null } } } }\"#;\n                let output = ${format(operationGenerator)}(input, test_output::OpOutput::builder()).unwrap().build();\n                use test_model::Choice;\n                match output.top.unwrap().choice {\n                    Choice::MapSparse(map) => {\n                        assert_eq!(map.len(), 2);\n                        assert_eq!(map.get(\"a\"), Some(&Some(Choice::Int(5))));\n                        assert_eq!(map.get(\"b\"), Some(&None));\n                    }\n                    _ => panic!(\"expected MapSparse variant\"),\n                }\n                \"\"\",\n            )\n        }\n        model.lookup<StructureShape>(\"test#Top\").also { top ->\n            top.renderWithModelBuilder(model, symbolProvider, project)\n            model.lookup<StructureShape>(\"test#EmptyStruct\").renderWithModelBuilder(model, symbolProvider, project)\n            project.moduleFor(top) {\n                UnionGenerator(model, symbolProvider, this, model.lookup(\"test#Choice\")).render()\n                val enum = model.lookup<StringShape>(\"test#FooEnum\")\n                EnumGenerator(model, symbolProvider, enum, TestEnumType, emptyList()).render(this)\n            }\n        }\n        model.lookup<OperationShape>(\"test#Op\").outputShape(model).also { output ->\n            output.renderWithModelBuilder(model, symbolProvider, project)\n        }\n        model.lookup<StructureShape>(\"test#Error\").also { error ->\n            error.renderWithModelBuilder(model, symbolProvider, project)\n        }\n        project.compileAndTest()\n    }\n}\n"
  },
  {
    "path": "codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/parse/XmlBindingTraitParserGeneratorTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy.protocols.parse\n\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.StringShape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.shapes.UnionShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.EnumGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.TestEnumType\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.UnionGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.transformers.OperationNormalizer\nimport software.amazon.smithy.rust.codegen.core.smithy.transformers.RecursiveShapeBoxer\nimport software.amazon.smithy.rust.codegen.core.testutil.TestRuntimeConfig\nimport software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.compileAndTest\nimport software.amazon.smithy.rust.codegen.core.testutil.renderWithModelBuilder\nimport software.amazon.smithy.rust.codegen.core.testutil.testCodegenContext\nimport software.amazon.smithy.rust.codegen.core.testutil.testSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.testutil.unitTest\nimport software.amazon.smithy.rust.codegen.core.util.lookup\nimport software.amazon.smithy.rust.codegen.core.util.outputShape\n\ninternal class XmlBindingTraitParserGeneratorTest {\n    private val baseModel =\n        \"\"\"\n        namespace test\n        use aws.protocols#restXml\n        union Choice {\n            @xmlFlattened\n            @xmlName(\"Hi\")\n            flatMap: MyMap,\n\n            deepMap: MyMap,\n\n            @xmlFlattened\n            flatList: SomeList,\n\n            deepList: SomeList,\n\n            s: String,\n\n            enum: FooEnum,\n\n            date: Timestamp,\n\n            number: Double,\n\n            top: Top,\n\n            blob: Blob,\n\n            unit: Unit,\n        }\n\n        @enum([{name: \"FOO\", value: \"FOO\"}])\n        string FooEnum\n\n        map MyMap {\n            @xmlName(\"Name\")\n            key: String,\n\n            @xmlName(\"Setting\")\n            value: Choice,\n        }\n\n        list SomeList {\n            member: Choice\n        }\n\n        structure Top {\n            choice: Choice,\n\n            @xmlAttribute\n            extra: Long,\n\n            @xmlName(\"prefix:local\")\n            renamedWithPrefix: String,\n        }\n\n        @http(uri: \"/top\", method: \"POST\")\n        operation Op {\n            input: Top,\n            output: Top\n        }\n        \"\"\".asSmithyModel()\n\n    private val bigNumberModel =\n        \"\"\"\n        namespace test\n        use aws.protocols#restXml\n\n        structure BigNumberData {\n            bigInt: BigInteger,\n            bigDec: BigDecimal,\n        }\n\n        @http(uri: \"/bignumber\", method: \"POST\")\n        operation BigNumberOp {\n            input: BigNumberData,\n            output: BigNumberData\n        }\n        \"\"\".asSmithyModel()\n\n    @Test\n    fun `generates valid parsers`() {\n        val model = RecursiveShapeBoxer().transform(OperationNormalizer.transform(baseModel))\n        val codegenContext = testCodegenContext(model)\n        val symbolProvider = codegenContext.symbolProvider\n        val parserGenerator =\n            XmlBindingTraitParserGenerator(\n                codegenContext,\n                RuntimeType.wrappedXmlErrors(TestRuntimeConfig),\n            ) { _, inner -> inner(\"decoder\") }\n        val operationParser = parserGenerator.operationParser(model.lookup(\"test#Op\"))!!\n\n        val choiceShape = model.lookup<UnionShape>(\"test#Choice\")\n        val project = TestWorkspace.testProject(testSymbolProvider(model))\n        project.lib {\n            unitTest(name = \"valid_input\") {\n                rustTemplate(\n                    \"\"\"\n                    let xml = br##\"<Top>\n                        <choice>\n                            <Hi>\n                                <Name>some key</Name>\n                                <Setting>\n                                    <s>hello</s>\n                                </Setting>\n                            </Hi>\n                        </choice>\n                        <prefix:local>hey</prefix:local>\n                    </Top>\n                    \"##;\n                    let output = ${format(operationParser)}(xml, test_output::OpOutput::builder()).unwrap().build();\n                    let mut map = std::collections::HashMap::new();\n                    map.insert(\"some key\".to_string(), #{Choice}::S(\"hello\".to_string()));\n                    assert_eq!(output.choice, Some(#{Choice}::FlatMap(map)));\n                    assert_eq!(output.renamed_with_prefix.as_deref(), Some(\"hey\"));\n                    \"\"\",\n                    \"Choice\" to symbolProvider.toSymbol(choiceShape),\n                )\n            }\n\n            unitTest(name = \"ignore_extras\") {\n                rustTemplate(\n                    \"\"\"\n                    let xml = br##\"<Top>\n                        <notchoice>\n                            <extra/>\n                            <stuff/>\n                            <noone/>\n                            <needs>5</needs>\n                        </notchoice>\n                        <choice>\n                            <Hi>\n                                <Name>some key</Name>\n                                <Setting>\n                                    <s>hello</s>\n                                </Setting>\n                            </Hi>\n                        </choice>\n                    </Top>\n                    \"##;\n                    let output = ${format(operationParser)}(xml, test_output::OpOutput::builder()).unwrap().build();\n                    let mut map = std::collections::HashMap::new();\n                    map.insert(\"some key\".to_string(), #{Choice}::S(\"hello\".to_string()));\n                    assert_eq!(output.choice, Some(#{Choice}::FlatMap(map)));\n                    \"\"\",\n                    \"Choice\" to symbolProvider.toSymbol(choiceShape),\n                )\n            }\n\n            unitTest(\n                name = \"nopanics_on_invalid\",\n                test = \"\"\"\n                    let xml = br#\"<Top>\n                        <notchoice>\n                            <extra/>\n                            <stuff/>\n                            <noone/>\n                            <needs>5</needs>\n                        </notchoice>\n                        <choice>\n                            <Hey>\n                                <Name>some key</Name>\n                                <Setting>\n                                    <s>hello</s>\n                                </Setting>\n                            </Hey>\n                        </choice>\n                    </Top>\n                    \"#;\n                    ${format(operationParser)}(xml, test_output::OpOutput::builder()).expect(\"unknown union variant does not cause failure\");\n                \"\"\",\n            )\n            unitTest(\n                name = \"unknown_union_variant\",\n                test = \"\"\"\n                    let xml = br#\"<Top>\n                        <choice>\n                            <NewVariantName>\n                                <Name>some key</Name>\n                                <Setting>\n                                    <s>hello</s>\n                                </Setting>\n                            </NewVariantName>\n                        </choice>\n                    </Top>\n                    \"#;\n                    let output = ${format(operationParser)}(xml, test_output::OpOutput::builder()).unwrap().build();\n                    assert!(output.choice.unwrap().is_unknown());\n                \"\"\",\n            )\n        }\n        model.lookup<StructureShape>(\"test#Top\").also { top ->\n            top.renderWithModelBuilder(model, symbolProvider, project)\n            project.moduleFor(top) {\n                UnionGenerator(model, symbolProvider, this, choiceShape).render()\n                model.lookup<StringShape>(\"test#FooEnum\").also { enum ->\n                    EnumGenerator(model, symbolProvider, enum, TestEnumType, emptyList()).render(this)\n                }\n            }\n        }\n\n        model.lookup<OperationShape>(\"test#Op\").outputShape(model).also { out ->\n            out.renderWithModelBuilder(model, symbolProvider, project)\n        }\n        project.compileAndTest()\n    }\n\n    @Test\n    fun `parses BigInteger and BigDecimal from XML`() {\n        val model = RecursiveShapeBoxer().transform(OperationNormalizer.transform(bigNumberModel))\n        val codegenContext = testCodegenContext(model)\n        val symbolProvider = codegenContext.symbolProvider\n        val parserGenerator =\n            XmlBindingTraitParserGenerator(\n                codegenContext,\n                RuntimeType.wrappedXmlErrors(TestRuntimeConfig),\n            ) { _, inner -> inner(\"decoder\") }\n        val operationParser = parserGenerator.operationParser(model.lookup(\"test#BigNumberOp\"))!!\n\n        val project = TestWorkspace.testProject(testSymbolProvider(model))\n        project.lib {\n            unitTest(name = \"parse_big_numbers\") {\n                rustTemplate(\n                    \"\"\"\n                    let xml = br##\"<BigNumberData>\n                        <bigInt>99999999999999999999999999</bigInt>\n                        <bigDec>3.141592653589793238462643383279502884197</bigDec>\n                    </BigNumberData>\n                    \"##;\n                    let output = ${format(operationParser)}(xml, test_output::BigNumberOpOutput::builder()).unwrap().build();\n                    assert_eq!(output.big_int.as_ref().map(|v| v.as_ref()), Some(\"99999999999999999999999999\"));\n                    assert_eq!(output.big_dec.as_ref().map(|v| v.as_ref()), Some(\"3.141592653589793238462643383279502884197\"));\n                    \"\"\",\n                )\n            }\n            unitTest(name = \"parse_big_numbers_exceeding_f64_max\") {\n                rustTemplate(\n                    \"\"\"\n                    let xml = br##\"<BigNumberData>\n                        <bigInt>99999999999999999999999999</bigInt>\n                        <bigDec>1.8e308</bigDec>\n                    </BigNumberData>\n                    \"##;\n                    let output = ${format(operationParser)}(xml, test_output::BigNumberOpOutput::builder()).unwrap().build();\n                    assert_eq!(output.big_int.as_ref().map(|v| v.as_ref()), Some(\"99999999999999999999999999\"));\n                    assert_eq!(output.big_dec.as_ref().map(|v| v.as_ref()), Some(\"1.8e308\"));\n                    \"\"\",\n                )\n            }\n        }\n\n        model.lookup<OperationShape>(\"test#BigNumberOp\").outputShape(model).also { out ->\n            out.renderWithModelBuilder(model, symbolProvider, project)\n        }\n        project.compileAndTest()\n    }\n}\n"
  },
  {
    "path": "codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/AwsQuerySerializerGeneratorTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy.protocols.serialize\n\nimport org.junit.jupiter.params.ParameterizedTest\nimport org.junit.jupiter.params.provider.CsvSource\nimport software.amazon.smithy.model.knowledge.NullableIndex\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.StringShape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenTarget\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.BuilderGenerator.Companion.hasFallibleBuilder\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.EnumGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.TestEnumType\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.UnionGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.transformers.OperationNormalizer\nimport software.amazon.smithy.rust.codegen.core.smithy.transformers.RecursiveShapeBoxer\nimport software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.compileAndTest\nimport software.amazon.smithy.rust.codegen.core.testutil.renderWithModelBuilder\nimport software.amazon.smithy.rust.codegen.core.testutil.testCodegenContext\nimport software.amazon.smithy.rust.codegen.core.testutil.unitTest\nimport software.amazon.smithy.rust.codegen.core.util.inputShape\nimport software.amazon.smithy.rust.codegen.core.util.lookup\n\nclass AwsQuerySerializerGeneratorTest {\n    private val baseModel =\n        \"\"\"\n        namespace test\n        use aws.protocols#restJson1\n\n        union Choice {\n            bigInt: BigInteger,\n            bigDec: BigDecimal,\n            blob: Blob,\n            boolean: Boolean,\n            date: Timestamp,\n            enum: FooEnum,\n            int: Integer,\n            @xmlFlattened\n            list: SomeList,\n            long: Long,\n            map: MyMap,\n            number: Double,\n            s: String,\n            top: Top,\n            unit: Unit,\n        }\n\n        @enum([{name: \"FOO\", value: \"FOO\"}])\n        string FooEnum\n\n        map MyMap {\n            key: String,\n            value: Choice,\n        }\n\n        list SomeList {\n            member: Choice\n        }\n\n        structure Top {\n            choice: Choice,\n            field: String,\n            extra: Long,\n            @xmlName(\"rec\")\n            recursive: TopList\n        }\n\n        list TopList {\n            @xmlName(\"item\")\n            member: Top\n        }\n\n        structure OpInput {\n            @xmlName(\"some_bool\")\n            boolean: Boolean,\n            list: SomeList,\n            map: MyMap,\n            top: Top,\n        }\n\n        @http(uri: \"/top\", method: \"POST\")\n        operation Op {\n            input: OpInput,\n        }\n        \"\"\".asSmithyModel()\n\n    @ParameterizedTest\n    @CsvSource(\"true\", \"false\")\n    fun `generates valid serializers`(generateUnknownVariant: Boolean) {\n        val codegenTarget =\n            when (generateUnknownVariant) {\n                true -> CodegenTarget.CLIENT\n                false -> CodegenTarget.SERVER\n            }\n        val model = RecursiveShapeBoxer().transform(OperationNormalizer.transform(baseModel))\n        val codegenContext = testCodegenContext(model, codegenTarget = codegenTarget)\n        val symbolProvider = codegenContext.symbolProvider\n        val parserGenerator = AwsQuerySerializerGenerator(codegenContext)\n        val operationGenerator = parserGenerator.operationInputSerializer(model.lookup(\"test#Op\"))\n\n        val project = TestWorkspace.testProject(symbolProvider)\n        project.lib {\n            unitTest(\n                \"query_serializer\",\n                \"\"\"\n                use test_model::Top;\n\n                let input = crate::test_input::OpInput::builder()\n                    .top(\n                        Top::builder()\n                            .field(\"hello!\")\n                            .extra(45)\n                            .recursive(Top::builder().extra(55).build())\n                            .build()\n                    )\n                    .boolean(true)\n                    .build()\n                    .unwrap();\n                let serialized = ${format(operationGenerator!!)}(&input).unwrap();\n                let output = std::str::from_utf8(serialized.bytes().unwrap()).unwrap();\n                assert_eq!(\n                    output,\n                    \"\\\n                    Action=Op\\\n                    &Version=test\\\n                    &some_bool=true\\\n                    &top.field=hello%21\\\n                    &top.extra=45\\\n                    &top.rec.item.1.extra=55\\\n                    \"\n                );\n                \"\"\",\n            )\n        }\n        model.lookup<StructureShape>(\"test#Top\").also { top ->\n            top.renderWithModelBuilder(model, symbolProvider, project)\n            project.moduleFor(top) {\n                UnionGenerator(\n                    model,\n                    symbolProvider,\n                    this,\n                    model.lookup(\"test#Choice\"),\n                    renderUnknownVariant = generateUnknownVariant,\n                ).render()\n                val enum = model.lookup<StringShape>(\"test#FooEnum\")\n                EnumGenerator(model, symbolProvider, enum, TestEnumType, emptyList()).render(this)\n            }\n        }\n\n        model.lookup<OperationShape>(\"test#Op\").inputShape(model).also { input ->\n            input.renderWithModelBuilder(model, symbolProvider, project)\n        }\n        project.compileAndTest()\n    }\n\n    private val baseModelWithRequiredTypes =\n        \"\"\"\n        namespace test\n        use aws.protocols#restJson1\n\n        union Choice {\n            bigInt: BigInteger,\n            bigDec: BigDecimal,\n            blob: Blob,\n            boolean: Boolean,\n            date: Timestamp,\n            enum: FooEnum,\n            int: Integer,\n            @xmlFlattened\n            list: SomeList,\n            long: Long,\n            map: MyMap,\n            number: Double,\n            s: String,\n            top: Top,\n            unit: Unit,\n        }\n\n        @enum([{name: \"FOO\", value: \"FOO\"}])\n        string FooEnum\n\n        map MyMap {\n            key: String,\n            value: Choice,\n        }\n\n        list SomeList {\n            member: Choice\n        }\n\n        structure Top {\n            @required\n            choice: Choice,\n            @required\n            field: String,\n            @required\n            extra: Long,\n            @xmlName(\"rec\")\n            recursive: TopList\n        }\n\n        list TopList {\n            @xmlName(\"item\")\n            member: Top\n        }\n\n        structure OpInput {\n            @required\n            @xmlName(\"some_bool\")\n            boolean: Boolean,\n            list: SomeList,\n            map: MyMap,\n            @required\n            top: Top,\n            @required\n            blob: Blob\n        }\n\n        @http(uri: \"/top\", method: \"POST\")\n        operation Op {\n            input: OpInput,\n        }\n        \"\"\".asSmithyModel()\n\n    @ParameterizedTest\n    @CsvSource(\n        \"true, CLIENT\",\n        \"true, CLIENT_CAREFUL\",\n        \"true, CLIENT_ZERO_VALUE_V1\",\n        \"true, CLIENT_ZERO_VALUE_V1_NO_INPUT\",\n        \"false, SERVER\",\n    )\n    fun `generates valid serializers for required types`(\n        generateUnknownVariant: Boolean,\n        nullabilityCheckMode: NullableIndex.CheckMode,\n    ) {\n        val codegenTarget =\n            when (generateUnknownVariant) {\n                true -> CodegenTarget.CLIENT\n                false -> CodegenTarget.SERVER\n            }\n        val model = RecursiveShapeBoxer().transform(OperationNormalizer.transform(baseModelWithRequiredTypes))\n        val codegenContext =\n            testCodegenContext(model, codegenTarget = codegenTarget, nullabilityCheckMode = nullabilityCheckMode)\n        val symbolProvider = codegenContext.symbolProvider\n        val parserGenerator = AwsQuerySerializerGenerator(codegenContext)\n        val operationGenerator = parserGenerator.operationInputSerializer(model.lookup(\"test#Op\"))\n\n        val project = TestWorkspace.testProject(symbolProvider)\n\n        // Depending on the nullability check mode, the builder can be fallible or not. When it's fallible, we need to\n        // add unwrap calls.\n        val builderIsFallible = hasFallibleBuilder(model.lookup<StructureShape>(\"test#Top\"), symbolProvider)\n        val maybeUnwrap =\n            if (builderIsFallible) {\n                \".unwrap()\"\n            } else {\n                \"\"\n            }\n        project.lib {\n            unitTest(\n                \"query_serializer\",\n                \"\"\"\n                use test_model::{Choice, Top};\n\n                let input = crate::test_input::OpInput::builder()\n                    .top(\n                        Top::builder()\n                            .field(\"Hello\")\n                            .choice(Choice::Boolean(true))\n                            .extra(45)\n                            .recursive(\n                                Top::builder()\n                                    .field(\"World!\")\n                                    .choice(Choice::Boolean(true))\n                                    .extra(55)\n                                    .build()\n                                    $maybeUnwrap\n                            )\n                            .build()\n                            $maybeUnwrap\n                    )\n                    .boolean(true)\n                    .blob(aws_smithy_types::Blob::new(&b\"test\"[..]))\n                    .build()\n                    .unwrap();\n                let serialized = ${format(operationGenerator!!)}(&input).unwrap();\n                let output = std::str::from_utf8(serialized.bytes().unwrap()).unwrap();\n                assert_eq!(\n                    output,\n                    \"\\\n                    Action=Op\\\n                    &Version=test\\\n                    &some_bool=true\\\n                    &top.choice.choice=true\\\n                    &top.field=Hello\\\n                    &top.extra=45\\\n                    &top.rec.item.1.choice.choice=true\\\n                    &top.rec.item.1.field=World%21\\\n                    &top.rec.item.1.extra=55\\\n                    &blob=dGVzdA%3D%3D\"\n                );\n                \"\"\",\n            )\n        }\n        model.lookup<StructureShape>(\"test#Top\").also { top ->\n            top.renderWithModelBuilder(model, symbolProvider, project)\n            project.moduleFor(top) {\n                UnionGenerator(\n                    model,\n                    symbolProvider,\n                    this,\n                    model.lookup(\"test#Choice\"),\n                    renderUnknownVariant = generateUnknownVariant,\n                ).render()\n                val enum = model.lookup<StringShape>(\"test#FooEnum\")\n                EnumGenerator(model, symbolProvider, enum, TestEnumType, emptyList()).render(this)\n            }\n        }\n\n        model.lookup<OperationShape>(\"test#Op\").inputShape(model).also { input ->\n            input.renderWithModelBuilder(model, symbolProvider, project)\n        }\n        project.compileAndTest()\n    }\n\n    @ParameterizedTest\n    @CsvSource(\"true\", \"false\")\n    fun `serializes big numbers correctly`(generateUnknownVariant: Boolean) {\n        val model =\n            \"\"\"\n            namespace test\n            use aws.protocols#awsQuery\n\n            @awsQuery\n            @xmlNamespace(uri: \"https://example.com\")\n            service TestService {\n                version: \"test\",\n                operations: [Op]\n            }\n\n            structure OpInput {\n                bigInt: BigInteger,\n                bigDec: BigDecimal,\n            }\n\n            @http(uri: \"/\", method: \"POST\")\n            operation Op {\n                input: OpInput,\n            }\n            \"\"\".asSmithyModel()\n\n        val codegenTarget =\n            when (generateUnknownVariant) {\n                true -> CodegenTarget.CLIENT\n                false -> CodegenTarget.SERVER\n            }\n        val codegenContext = testCodegenContext(model, codegenTarget = codegenTarget)\n        val symbolProvider = codegenContext.symbolProvider\n        val serializerGenerator = AwsQuerySerializerGenerator(codegenContext)\n        val operationGenerator = serializerGenerator.operationInputSerializer(model.lookup(\"test#Op\"))\n\n        val project = TestWorkspace.testProject(symbolProvider)\n        project.lib {\n            unitTest(\n                \"big_number_serializer\",\n                \"\"\"\n                use aws_smithy_types::{BigInteger, BigDecimal};\n                use std::str::FromStr;\n\n                let input = crate::test_model::OpInput::builder()\n                    .big_int(BigInteger::from_str(\"12345678901234567890\").unwrap())\n                    .big_dec(BigDecimal::from_str(\"123.456\").unwrap())\n                    .build();\n                let serialized = ${format(operationGenerator!!)}(&input).unwrap();\n                let output = std::str::from_utf8(serialized.bytes().unwrap()).unwrap();\n                assert_eq!(\n                    output,\n                    \"Action=Op&Version=test&bigInt=12345678901234567890&bigDec=123.456\"\n                );\n                \"\"\",\n            )\n        }\n\n        model.lookup<OperationShape>(\"test#Op\").inputShape(model).also { input ->\n            input.renderWithModelBuilder(model, symbolProvider, project)\n        }\n        project.compileAndTest()\n    }\n}\n"
  },
  {
    "path": "codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/CborSerializerGeneratorTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy.protocols.serialize\n\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.assertThrows\nimport software.amazon.smithy.codegen.core.CodegenException\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.HttpTraitHttpBindingResolver\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.ProtocolContentTypes\nimport software.amazon.smithy.rust.codegen.core.smithy.transformers.OperationNormalizer\nimport software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.compileAndTest\nimport software.amazon.smithy.rust.codegen.core.testutil.renderWithModelBuilder\nimport software.amazon.smithy.rust.codegen.core.testutil.testCodegenContext\nimport software.amazon.smithy.rust.codegen.core.testutil.unitTest\nimport software.amazon.smithy.rust.codegen.core.util.inputShape\nimport software.amazon.smithy.rust.codegen.core.util.lookup\n\nclass CborSerializerGeneratorTest {\n    private val modelWithBigInteger =\n        \"\"\"\n        namespace test\n        use smithy.protocols#rpcv2Cbor\n\n        @rpcv2Cbor\n        service TestService {\n            version: \"test\",\n            operations: [TestOp]\n        }\n\n        structure TestInput {\n            bigInt: BigInteger\n        }\n\n        @http(uri: \"/test\", method: \"POST\")\n        operation TestOp {\n            input: TestInput\n        }\n        \"\"\".asSmithyModel()\n\n    private val modelWithBigDecimal =\n        \"\"\"\n        namespace test\n        use smithy.protocols#rpcv2Cbor\n\n        @rpcv2Cbor\n        service TestService {\n            version: \"test\",\n            operations: [TestOp]\n        }\n\n        structure TestInput {\n            bigDec: BigDecimal\n        }\n\n        @http(uri: \"/test\", method: \"POST\")\n        operation TestOp {\n            input: TestInput\n        }\n        \"\"\".asSmithyModel()\n\n    @Test\n    fun `throws CodegenException when serializing BigInteger with CBOR`() {\n        val model = OperationNormalizer.transform(modelWithBigInteger)\n        val codegenContext = testCodegenContext(model)\n        val symbolProvider = codegenContext.symbolProvider\n        val serializerGenerator =\n            CborSerializerGenerator(\n                codegenContext,\n                HttpTraitHttpBindingResolver(model, ProtocolContentTypes.consistent(\"application/cbor\")),\n            )\n        val operationGenerator = serializerGenerator.operationInputSerializer(model.lookup(\"test#TestOp\"))\n\n        val project = TestWorkspace.testProject(symbolProvider)\n\n        val exception =\n            assertThrows<CodegenException> {\n                project.lib {\n                    unitTest(\n                        \"cbor_serializer\",\n                        \"\"\"\n                        let input = crate::test_input::TestOpInput::builder().build();\n                        let _serialized = ${format(operationGenerator!!)}(&input);\n                        \"\"\",\n                    )\n                }\n\n                model.lookup<OperationShape>(\"test#TestOp\").inputShape(model).also { input ->\n                    input.renderWithModelBuilder(model, symbolProvider, project)\n                }\n                project.compileAndTest()\n            }\n\n        assert(exception.message!!.contains(\"BigInteger is not supported with Concise Binary Object Representation (CBOR)\"))\n    }\n\n    @Test\n    fun `throws CodegenException when serializing BigDecimal with CBOR`() {\n        val model = OperationNormalizer.transform(modelWithBigDecimal)\n        val codegenContext = testCodegenContext(model)\n        val symbolProvider = codegenContext.symbolProvider\n        val serializerGenerator =\n            CborSerializerGenerator(\n                codegenContext,\n                HttpTraitHttpBindingResolver(model, ProtocolContentTypes.consistent(\"application/cbor\")),\n            )\n        val operationGenerator = serializerGenerator.operationInputSerializer(model.lookup(\"test#TestOp\"))\n\n        val project = TestWorkspace.testProject(symbolProvider)\n\n        val exception =\n            assertThrows<CodegenException> {\n                project.lib {\n                    unitTest(\n                        \"cbor_serializer\",\n                        \"\"\"\n                        let input = crate::test_input::TestOpInput::builder().build();\n                        let _serialized = ${format(operationGenerator!!)}(&input);\n                        \"\"\",\n                    )\n                }\n\n                model.lookup<OperationShape>(\"test#TestOp\").inputShape(model).also { input ->\n                    input.renderWithModelBuilder(model, symbolProvider, project)\n                }\n                project.compileAndTest()\n            }\n\n        assert(exception.message!!.contains(\"BigDecimal is not supported with Concise Binary Object Representation (CBOR)\"))\n    }\n}\n"
  },
  {
    "path": "codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/Ec2QuerySerializerGeneratorTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy.protocols.serialize\n\nimport org.junit.jupiter.params.ParameterizedTest\nimport org.junit.jupiter.params.provider.CsvSource\nimport software.amazon.smithy.model.knowledge.NullableIndex\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.StringShape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.BuilderGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.EnumGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.TestEnumType\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.UnionGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.transformers.OperationNormalizer\nimport software.amazon.smithy.rust.codegen.core.smithy.transformers.RecursiveShapeBoxer\nimport software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.compileAndTest\nimport software.amazon.smithy.rust.codegen.core.testutil.renderWithModelBuilder\nimport software.amazon.smithy.rust.codegen.core.testutil.testCodegenContext\nimport software.amazon.smithy.rust.codegen.core.testutil.testRustSettings\nimport software.amazon.smithy.rust.codegen.core.testutil.testSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.testutil.unitTest\nimport software.amazon.smithy.rust.codegen.core.util.inputShape\nimport software.amazon.smithy.rust.codegen.core.util.lookup\n\nclass Ec2QuerySerializerGeneratorTest {\n    private val baseModel =\n        \"\"\"\n        namespace test\n\n        union Choice {\n            bigInt: BigInteger,\n            bigDec: BigDecimal,\n            blob: Blob,\n            boolean: Boolean,\n            date: Timestamp,\n            enum: FooEnum,\n            int: Integer,\n            @xmlFlattened\n            list: SomeList,\n            long: Long,\n            map: MyMap,\n            number: Double,\n            s: String,\n            top: Top,\n            unit: Unit,\n        }\n\n        @enum([{name: \"FOO\", value: \"FOO\"}])\n        string FooEnum\n\n        map MyMap {\n            key: String,\n            value: Choice,\n        }\n\n        list SomeList {\n            member: Choice\n        }\n\n        structure Top {\n            choice: Choice,\n            field: String,\n            extra: Long,\n            @xmlName(\"rec\")\n            recursive: TopList\n        }\n\n        list TopList {\n            @xmlName(\"item\")\n            member: Top\n        }\n\n        structure OpInput {\n            @xmlName(\"some_bool\")\n            boolean: Boolean,\n            list: SomeList,\n            map: MyMap,\n            top: Top,\n        }\n\n        @http(uri: \"/top\", method: \"POST\")\n        operation Op {\n            input: OpInput,\n        }\n        \"\"\".asSmithyModel()\n\n    @ParameterizedTest\n    @CsvSource(\n        \"CLIENT\",\n        \"CLIENT_CAREFUL\",\n        \"CLIENT_ZERO_VALUE_V1\",\n        \"CLIENT_ZERO_VALUE_V1_NO_INPUT\",\n        \"SERVER\",\n    )\n    fun `generates valid serializers`(nullabilityCheckMode: NullableIndex.CheckMode) {\n        val model = RecursiveShapeBoxer().transform(OperationNormalizer.transform(baseModel))\n        val settings = testRustSettings()\n        val codegenContext = testCodegenContext(model, settings = settings, nullabilityCheckMode = nullabilityCheckMode)\n        val symbolProvider = codegenContext.symbolProvider\n        val parserGenerator = Ec2QuerySerializerGenerator(codegenContext)\n        val operationGenerator = parserGenerator.operationInputSerializer(model.lookup(\"test#Op\"))\n\n        val project = TestWorkspace.testProject(testSymbolProvider(model))\n        project.lib {\n            unitTest(\n                \"ec2query_serializer\",\n                \"\"\"\n                use test_model::Top;\n\n                let input = crate::test_input::OpInput::builder()\n                    .top(\n                        Top::builder()\n                            .field(\"hello!\")\n                            .extra(45)\n                            .recursive(Top::builder().extra(55).build())\n                            .build()\n                    )\n                    .boolean(true)\n                    .build()\n                    .unwrap();\n                let serialized = ${format(operationGenerator!!)}(&input).unwrap();\n                let output = std::str::from_utf8(serialized.bytes().unwrap()).unwrap();\n                assert_eq!(\n                    output,\n                    \"\\\n                    Action=Op\\\n                    &Version=test\\\n                    &Some_bool=true\\\n                    &Top.Field=hello%21\\\n                    &Top.Extra=45\\\n                    &Top.Rec.1.Extra=55\\\n                    \"\n                );\n                \"\"\",\n            )\n        }\n        model.lookup<StructureShape>(\"test#Top\").also { top ->\n            top.renderWithModelBuilder(model, symbolProvider, project)\n            project.moduleFor(top) {\n                UnionGenerator(model, symbolProvider, this, model.lookup(\"test#Choice\")).render()\n                val enum = model.lookup<StringShape>(\"test#FooEnum\")\n                EnumGenerator(model, symbolProvider, enum, TestEnumType, emptyList()).render(this)\n            }\n        }\n\n        model.lookup<OperationShape>(\"test#Op\").inputShape(model).also { input ->\n            input.renderWithModelBuilder(model, symbolProvider, project)\n        }\n        project.compileAndTest()\n    }\n\n    private val baseModelWithRequiredTypes =\n        \"\"\"\n        namespace test\n\n        union Choice {\n            blob: Blob,\n            boolean: Boolean,\n            date: Timestamp,\n            enum: FooEnum,\n            int: Integer,\n            @xmlFlattened\n            list: SomeList,\n            long: Long,\n            map: MyMap,\n            number: Double,\n            s: String,\n            top: Top,\n            unit: Unit,\n        }\n\n        @enum([{name: \"FOO\", value: \"FOO\"}])\n        string FooEnum\n\n        map MyMap {\n            key: String,\n            value: Choice,\n        }\n\n        list SomeList {\n            member: Choice\n        }\n\n        structure Top {\n            @required\n            choice: Choice,\n            @required\n            field: String,\n            @required\n            extra: Long,\n            @xmlName(\"rec\")\n            recursive: TopList\n        }\n\n        list TopList {\n            @xmlName(\"item\")\n            member: Top\n        }\n\n        structure OpInput {\n            @required\n            @xmlName(\"some_bool\")\n            boolean: Boolean,\n            list: SomeList,\n            map: MyMap,\n            @required\n            top: Top,\n            @required\n            blob: Blob\n        }\n\n        @http(uri: \"/top\", method: \"POST\")\n        operation Op {\n            input: OpInput,\n        }\n        \"\"\".asSmithyModel()\n\n    @ParameterizedTest\n    @CsvSource(\n        \"CLIENT\",\n        \"CLIENT_CAREFUL\",\n        \"CLIENT_ZERO_VALUE_V1\",\n        \"CLIENT_ZERO_VALUE_V1_NO_INPUT\",\n        \"SERVER\",\n    )\n    fun `generates valid serializers for required types`(nullabilityCheckMode: NullableIndex.CheckMode) {\n        val model = RecursiveShapeBoxer().transform(OperationNormalizer.transform(baseModelWithRequiredTypes))\n        val settings = testRustSettings()\n        val codegenContext = testCodegenContext(model, settings = settings, nullabilityCheckMode = nullabilityCheckMode)\n        val symbolProvider = codegenContext.symbolProvider\n        val parserGenerator = Ec2QuerySerializerGenerator(codegenContext)\n        val operationGenerator = parserGenerator.operationInputSerializer(model.lookup(\"test#Op\"))\n\n        val project = TestWorkspace.testProject(testSymbolProvider(model))\n\n        // Depending on the nullability check mode, the builder can be fallible or not. When it's fallible, we need to\n        // add unwrap calls.\n        val builderIsFallible =\n            BuilderGenerator.hasFallibleBuilder(model.lookup<StructureShape>(\"test#Top\"), symbolProvider)\n        val maybeUnwrap =\n            if (builderIsFallible) {\n                \".unwrap()\"\n            } else {\n                \"\"\n            }\n        project.lib {\n            unitTest(\n                \"ec2query_serializer\",\n                \"\"\"\n                use test_model::{Choice, Top};\n\n                let input = crate::test_input::OpInput::builder()\n                    .top(\n                        Top::builder()\n                            .field(\"Hello\")\n                            .choice(Choice::Boolean(true))\n                            .extra(45)\n                            .recursive(\n                                Top::builder()\n                                    .field(\"World!\")\n                                    .choice(Choice::Boolean(true))\n                                    .extra(55)\n                                    .build()\n                                    $maybeUnwrap\n                            )\n                            .build()\n                            $maybeUnwrap\n                    )\n                    .boolean(true)\n                    .blob(aws_smithy_types::Blob::new(&b\"test\"[..]))\n                    .build()\n                    .unwrap();\n                let serialized = ${format(operationGenerator!!)}(&input).unwrap();\n                let output = std::str::from_utf8(serialized.bytes().unwrap()).unwrap();\n                assert_eq!(\n                    output,\n                    \"\\\n                    Action=Op\\\n                    &Version=test\\\n                    &Some_bool=true\\\n                    &Top.Choice.Choice=true\\\n                    &Top.Field=Hello\\\n                    &Top.Extra=45\\\n                    &Top.Rec.1.Choice.Choice=true\\\n                    &Top.Rec.1.Field=World%21\\\n                    &Top.Rec.1.Extra=55\\\n                    &Blob=dGVzdA%3D%3D\"\n                );\n                \"\"\",\n            )\n        }\n        model.lookup<StructureShape>(\"test#Top\").also { top ->\n            top.renderWithModelBuilder(model, symbolProvider, project)\n            project.moduleFor(top) {\n                UnionGenerator(model, symbolProvider, this, model.lookup(\"test#Choice\")).render()\n                val enum = model.lookup<StringShape>(\"test#FooEnum\")\n                EnumGenerator(model, symbolProvider, enum, TestEnumType, emptyList()).render(this)\n            }\n        }\n\n        model.lookup<OperationShape>(\"test#Op\").inputShape(model).also { input ->\n            input.renderWithModelBuilder(model, symbolProvider, project)\n        }\n        project.compileAndTest()\n    }\n\n    @ParameterizedTest\n    @CsvSource(\"true\", \"false\")\n    fun `serializes big numbers correctly`(generateUnknownVariant: Boolean) {\n        val model =\n            \"\"\"\n            namespace test\n            use aws.protocols#ec2Query\n\n            @ec2Query\n            @xmlNamespace(uri: \"https://example.com\")\n            service TestService {\n                version: \"test\",\n                operations: [Op]\n            }\n\n            structure OpInput {\n                bigInt: BigInteger,\n                bigDec: BigDecimal,\n            }\n\n            @http(uri: \"/\", method: \"POST\")\n            operation Op {\n                input: OpInput,\n            }\n            \"\"\".asSmithyModel()\n\n        val codegenContext = testCodegenContext(model)\n        val symbolProvider = codegenContext.symbolProvider\n        val serializerGenerator = Ec2QuerySerializerGenerator(codegenContext)\n        val operationGenerator = serializerGenerator.operationInputSerializer(model.lookup(\"test#Op\"))\n\n        val project = TestWorkspace.testProject(symbolProvider)\n        project.lib {\n            unitTest(\n                \"big_number_serializer\",\n                \"\"\"\n                use aws_smithy_types::{BigInteger, BigDecimal};\n                use std::str::FromStr;\n\n                let input = crate::test_model::OpInput::builder()\n                    .big_int(BigInteger::from_str(\"12345678901234567890\").unwrap())\n                    .big_dec(BigDecimal::from_str(\"123.456\").unwrap())\n                    .build();\n                let serialized = ${format(operationGenerator!!)}(&input).unwrap();\n                let output = std::str::from_utf8(serialized.bytes().unwrap()).unwrap();\n                assert_eq!(\n                    output,\n                    \"Action=Op&Version=test&BigInt=12345678901234567890&BigDec=123.456\"\n                );\n                \"\"\",\n            )\n        }\n\n        model.lookup<OperationShape>(\"test#Op\").inputShape(model).also { input ->\n            input.renderWithModelBuilder(model, symbolProvider, project)\n        }\n        project.compileAndTest()\n    }\n}\n"
  },
  {
    "path": "codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/JsonSerializerGeneratorTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy.protocols.serialize\n\nimport org.junit.jupiter.params.ParameterizedTest\nimport org.junit.jupiter.params.provider.CsvSource\nimport software.amazon.smithy.model.knowledge.NullableIndex\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.StringShape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.BuilderGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.EnumGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.TestEnumType\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.UnionGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.HttpTraitHttpBindingResolver\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.ProtocolContentTypes\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.restJsonFieldName\nimport software.amazon.smithy.rust.codegen.core.smithy.transformers.OperationNormalizer\nimport software.amazon.smithy.rust.codegen.core.smithy.transformers.RecursiveShapeBoxer\nimport software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.compileAndTest\nimport software.amazon.smithy.rust.codegen.core.testutil.renderWithModelBuilder\nimport software.amazon.smithy.rust.codegen.core.testutil.testCodegenContext\nimport software.amazon.smithy.rust.codegen.core.testutil.testSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.testutil.unitTest\nimport software.amazon.smithy.rust.codegen.core.util.inputShape\nimport software.amazon.smithy.rust.codegen.core.util.lookup\n\nclass JsonSerializerGeneratorTest {\n    private val baseModel =\n        \"\"\"\n        namespace test\n        use aws.protocols#restJson1\n\n        union Choice {\n            blob: Blob,\n            boolean: Boolean,\n            date: Timestamp,\n            document: Document,\n            enum: FooEnum,\n            int: Integer,\n            list: SomeList,\n            listSparse: SomeSparseList,\n            long: Long,\n            map: MyMap,\n            mapSparse: MySparseMap,\n            number: Double,\n            s: String,\n            top: Top,\n            unit: Unit,\n        }\n\n        @enum([{name: \"FOO\", value: \"FOO\"}])\n        string FooEnum\n\n        map MyMap {\n            key: String,\n            value: Choice,\n        }\n\n        @sparse\n        map MySparseMap {\n            key: String,\n            value: Choice,\n        }\n\n        list SomeList {\n            member: Choice\n        }\n\n        @sparse\n        list SomeSparseList {\n            member: Choice\n        }\n\n        structure Top {\n            choice: Choice,\n            field: String,\n            extra: Long,\n            @jsonName(\"rec\")\n            recursive: TopList\n        }\n\n        list TopList {\n            member: Top\n        }\n\n        @input\n        structure OpInput {\n            @httpHeader(\"x-test\")\n            someHeader: String,\n\n            top: Top\n        }\n\n        @http(uri: \"/top\", method: \"POST\")\n        operation Op {\n            input: OpInput,\n        }\n        \"\"\".asSmithyModel()\n\n    @ParameterizedTest\n    @CsvSource(\n        \"CLIENT\",\n        \"CLIENT_CAREFUL\",\n        \"CLIENT_ZERO_VALUE_V1\",\n        \"CLIENT_ZERO_VALUE_V1_NO_INPUT\",\n        \"SERVER\",\n    )\n    fun `generates valid serializers`(nullabilityCheckMode: NullableIndex.CheckMode) {\n        val model = RecursiveShapeBoxer().transform(OperationNormalizer.transform(baseModel))\n        val codegenContext = testCodegenContext(model, nullabilityCheckMode = nullabilityCheckMode)\n        val symbolProvider = codegenContext.symbolProvider\n        val parserSerializer =\n            JsonSerializerGenerator(\n                codegenContext,\n                HttpTraitHttpBindingResolver(model, ProtocolContentTypes.consistent(\"application/json\")),\n                ::restJsonFieldName,\n            )\n        val operationGenerator = parserSerializer.operationInputSerializer(model.lookup(\"test#Op\"))\n        val documentGenerator = parserSerializer.documentSerializer()\n\n        val project = TestWorkspace.testProject(symbolProvider)\n        project.lib {\n            unitTest(\n                \"json_serializers\",\n                \"\"\"\n                use test_model::{Top, Choice};\n\n                // Generate the document serializer even though it's not tested directly\n                // ${format(documentGenerator)}\n\n                let input = crate::test_input::OpInput::builder().top(\n                    Top::builder()\n                        .field(\"hello!\")\n                        .extra(45)\n                        .recursive(Top::builder().extra(55).build())\n                        .build()\n                ).build().unwrap();\n                let serialized = ${format(operationGenerator!!)}(&input).unwrap();\n                let output = std::str::from_utf8(serialized.bytes().unwrap()).unwrap();\n                assert_eq!(output, r#\"{\"top\":{\"field\":\"hello!\",\"extra\":45,\"rec\":[{\"extra\":55}]}}\"#);\n\n                let input = crate::test_input::OpInput::builder().top(\n                    Top::builder()\n                        .choice(Choice::Unknown)\n                        .build()\n                ).build().unwrap();\n                ${format(operationGenerator)}(&input).expect_err(\"cannot serialize unknown variant\");\n                \"\"\",\n            )\n        }\n        model.lookup<StructureShape>(\"test#Top\").also { top ->\n            top.renderWithModelBuilder(model, symbolProvider, project)\n            project.moduleFor(top) {\n                UnionGenerator(model, symbolProvider, this, model.lookup(\"test#Choice\")).render()\n                val enum = model.lookup<StringShape>(\"test#FooEnum\")\n                EnumGenerator(model, symbolProvider, enum, TestEnumType, emptyList()).render(this)\n            }\n        }\n\n        model.lookup<OperationShape>(\"test#Op\").inputShape(model).also { input ->\n            input.renderWithModelBuilder(model, symbolProvider, project)\n        }\n        project.compileAndTest()\n    }\n\n    private val baseModelWithRequiredTypes =\n        \"\"\"\n        namespace test\n        use aws.protocols#restJson1\n\n        union Choice {\n            blob: Blob,\n            boolean: Boolean,\n            date: Timestamp,\n            document: Document,\n            enum: FooEnum,\n            int: Integer,\n            list: SomeList,\n            listSparse: SomeSparseList,\n            long: Long,\n            map: MyMap,\n            mapSparse: MySparseMap,\n            number: Double,\n            s: String,\n            top: Top,\n            unit: Unit,\n        }\n\n        @enum([{name: \"FOO\", value: \"FOO\"}])\n        string FooEnum\n\n        map MyMap {\n            key: String,\n            value: Choice,\n        }\n\n        @sparse\n        map MySparseMap {\n            key: String,\n            value: Choice,\n        }\n\n        list SomeList {\n            member: Choice\n        }\n\n        @sparse\n        list SomeSparseList {\n            member: Choice\n        }\n\n        structure Top {\n            @required\n            choice: Choice,\n            @required\n            field: String,\n            @required\n            extra: Long,\n            @jsonName(\"rec\")\n            recursive: TopList\n        }\n\n        list TopList {\n            member: Top\n        }\n\n        @input\n        structure OpInput {\n            @httpHeader(\"x-test\")\n            someHeader: String,\n\n            @required\n            boolean: Boolean,\n            list: SomeList,\n            map: MyMap,\n\n            @required\n            top: Top\n        }\n\n        @http(uri: \"/top\", method: \"POST\")\n        operation Op {\n            input: OpInput,\n        }\n        \"\"\".asSmithyModel()\n\n    @ParameterizedTest\n    @CsvSource(\n        \"CLIENT\",\n        \"CLIENT_CAREFUL\",\n        \"CLIENT_ZERO_VALUE_V1\",\n        \"CLIENT_ZERO_VALUE_V1_NO_INPUT\",\n        \"SERVER\",\n    )\n    fun `generates valid serializers for required types`(nullabilityCheckMode: NullableIndex.CheckMode) {\n        val model = RecursiveShapeBoxer().transform(OperationNormalizer.transform(baseModelWithRequiredTypes))\n        val codegenContext = testCodegenContext(model, nullabilityCheckMode = nullabilityCheckMode)\n        val symbolProvider = codegenContext.symbolProvider\n        val parserSerializer =\n            JsonSerializerGenerator(\n                codegenContext,\n                HttpTraitHttpBindingResolver(model, ProtocolContentTypes.consistent(\"application/json\")),\n                ::restJsonFieldName,\n            )\n        val operationGenerator = parserSerializer.operationInputSerializer(model.lookup(\"test#Op\"))\n        val documentGenerator = parserSerializer.documentSerializer()\n\n        val project = TestWorkspace.testProject(testSymbolProvider(model))\n\n        // Depending on the nullability check mode, the builder can be fallible or not. When it's fallible, we need to\n        // add unwrap calls.\n        val builderIsFallible =\n            BuilderGenerator.hasFallibleBuilder(model.lookup<StructureShape>(\"test#Top\"), symbolProvider)\n        val maybeUnwrap =\n            if (builderIsFallible) {\n                \".unwrap()\"\n            } else {\n                \"\"\n            }\n        project.lib {\n            unitTest(\n                \"json_serializers\",\n                \"\"\"\n                use test_model::{Choice, Top};\n\n                // Generate the document serializer even though it's not tested directly\n                // ${format(documentGenerator)}\n\n                let input = crate::test_input::OpInput::builder()\n                    .top(\n                        Top::builder()\n                            .field(\"Hello\")\n                            .choice(Choice::Boolean(true))\n                            .extra(45)\n                            .recursive(\n                                Top::builder()\n                                    .field(\"World!\")\n                                    .choice(Choice::Boolean(true))\n                                    .extra(55)\n                                    .build()\n                                    $maybeUnwrap\n                            )\n                            .build()\n                            $maybeUnwrap\n                    )\n                    .boolean(true)\n                    .build()\n                    .unwrap();\n                let serialized = ${format(operationGenerator!!)}(&input).unwrap();\n                let output = std::str::from_utf8(serialized.bytes().unwrap()).unwrap();\n                assert_eq!(output, r#\"{\"boolean\":true,\"top\":{\"choice\":{\"boolean\":true},\"field\":\"Hello\",\"extra\":45,\"rec\":[{\"choice\":{\"boolean\":true},\"field\":\"World!\",\"extra\":55}]}}\"#);\n\n                let input = crate::test_input::OpInput::builder().top(\n                    Top::builder()\n                        .field(\"Hello\")\n                        .choice(Choice::Unknown)\n                        .extra(45)\n                        .build()\n                        $maybeUnwrap\n                ).boolean(false).build().unwrap();\n                ${format(operationGenerator)}(&input).expect_err(\"cannot serialize unknown variant\");\n                \"\"\",\n            )\n        }\n        model.lookup<StructureShape>(\"test#Top\").also { top ->\n            top.renderWithModelBuilder(model, symbolProvider, project)\n            project.moduleFor(top) {\n                UnionGenerator(model, symbolProvider, this, model.lookup(\"test#Choice\")).render()\n                val enum = model.lookup<StringShape>(\"test#FooEnum\")\n                EnumGenerator(model, symbolProvider, enum, TestEnumType, emptyList()).render(this)\n            }\n        }\n\n        model.lookup<OperationShape>(\"test#Op\").inputShape(model).also { input ->\n            input.renderWithModelBuilder(model, symbolProvider, project)\n        }\n        project.compileAndTest()\n    }\n}\n"
  },
  {
    "path": "codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/protocols/serialize/XmlBindingTraitSerializerGeneratorTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy.protocols.serialize\n\nimport org.junit.jupiter.params.ParameterizedTest\nimport org.junit.jupiter.params.provider.CsvSource\nimport software.amazon.smithy.model.knowledge.NullableIndex\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.StringShape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.BuilderGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.EnumGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.TestEnumType\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.UnionGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.isOptional\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.HttpTraitHttpBindingResolver\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.ProtocolContentTypes\nimport software.amazon.smithy.rust.codegen.core.smithy.transformers.OperationNormalizer\nimport software.amazon.smithy.rust.codegen.core.smithy.transformers.RecursiveShapeBoxer\nimport software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.compileAndTest\nimport software.amazon.smithy.rust.codegen.core.testutil.renderWithModelBuilder\nimport software.amazon.smithy.rust.codegen.core.testutil.testCodegenContext\nimport software.amazon.smithy.rust.codegen.core.testutil.testSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.testutil.unitTest\nimport software.amazon.smithy.rust.codegen.core.util.inputShape\nimport software.amazon.smithy.rust.codegen.core.util.lookup\n\ninternal class XmlBindingTraitSerializerGeneratorTest {\n    private val baseModel =\n        \"\"\"\n        namespace test\n        use aws.protocols#restXml\n        union Choice {\n            @xmlFlattened\n            @xmlName(\"Hi\")\n            flatMap: MyMap,\n\n            deepMap: MyMap,\n\n            @xmlFlattened\n            flatList: SomeList,\n\n            deepList: SomeList,\n\n            s: String,\n\n            enum: FooEnum,\n\n            date: Timestamp,\n\n            number: Double,\n\n            top: Top,\n\n            blob: Blob,\n\n            unit: Unit,\n        }\n\n        @enum([{name: \"FOO\", value: \"FOO\"}])\n        string FooEnum\n\n        map MyMap {\n            @xmlName(\"Name\")\n            key: String,\n\n            @xmlName(\"Setting\")\n            value: Choice,\n        }\n\n        list SomeList {\n            member: Choice\n        }\n\n\n        structure Top {\n            choice: Choice,\n\n            field: String,\n\n            @xmlAttribute\n            extra: Long,\n\n            @xmlName(\"prefix:local\")\n            renamedWithPrefix: String,\n\n            @xmlFlattened\n            recursive: TopList\n        }\n\n        list TopList {\n            member: Top\n        }\n\n        structure OpInput {\n            @httpPayload\n            payload: Top\n        }\n\n        @http(uri: \"/top\", method: \"POST\")\n        operation Op {\n            input: OpInput,\n        }\n        \"\"\".asSmithyModel()\n\n    private val bigNumberModel =\n        \"\"\"\n        namespace test\n        use aws.protocols#restXml\n\n        structure BigNumberData {\n            bigInt: BigInteger,\n            bigDec: BigDecimal,\n        }\n\n        structure BigNumberInput {\n            @httpPayload\n            payload: BigNumberData\n        }\n\n        @http(uri: \"/bignumber\", method: \"POST\")\n        operation BigNumberOp {\n            input: BigNumberInput,\n        }\n        \"\"\".asSmithyModel()\n\n    @ParameterizedTest\n    @CsvSource(\n        \"CLIENT\",\n        \"CLIENT_CAREFUL\",\n        \"CLIENT_ZERO_VALUE_V1\",\n        \"CLIENT_ZERO_VALUE_V1_NO_INPUT\",\n        \"SERVER\",\n    )\n    fun `generates valid serializers`(nullabilityCheckMode: NullableIndex.CheckMode) {\n        val model = RecursiveShapeBoxer().transform(OperationNormalizer.transform(baseModel))\n        val codegenContext = testCodegenContext(model, nullabilityCheckMode = nullabilityCheckMode)\n        val symbolProvider = codegenContext.symbolProvider\n        val parserGenerator =\n            XmlBindingTraitSerializerGenerator(\n                codegenContext,\n                HttpTraitHttpBindingResolver(model, ProtocolContentTypes.consistent(\"application/xml\")),\n            )\n        val operationSerializer = parserGenerator.payloadSerializer(model.lookup(\"test#OpInput\\$payload\"))\n\n        val project = TestWorkspace.testProject(testSymbolProvider(model))\n        project.lib {\n            unitTest(\n                \"serialize_xml\",\n                \"\"\"\n                use test_model::Top;\n                let input = crate::test_input::OpInput::builder().payload(\n                   Top::builder()\n                       .field(\"hello!\")\n                       .extra(45)\n                       .recursive(Top::builder().extra(55).build())\n                       .build()\n                ).build().unwrap();\n                let serialized = ${format(operationSerializer)}(&input.payload.unwrap()).unwrap();\n                let output = std::str::from_utf8(&serialized).unwrap();\n                assert_eq!(output, \"<Top extra=\\\"45\\\"><field>hello!</field><recursive extra=\\\"55\\\"></recursive></Top>\");\n                \"\"\",\n            )\n            unitTest(\n                \"unknown_variants\",\n                \"\"\"\n                use test_model::{Top, Choice};\n                let input = crate::test_input::OpInput::builder().payload(\n                    Top::builder()\n                        .choice(Choice::Unknown)\n                        .build()\n                ).build().unwrap();\n                ${format(operationSerializer)}(&input.payload.unwrap()).expect_err(\"cannot serialize unknown variant\");\n                \"\"\",\n            )\n        }\n        model.lookup<StructureShape>(\"test#Top\").also { top ->\n            top.renderWithModelBuilder(model, symbolProvider, project)\n            project.moduleFor(top) {\n                UnionGenerator(model, symbolProvider, this, model.lookup(\"test#Choice\")).render()\n                val enum = model.lookup<StringShape>(\"test#FooEnum\")\n                EnumGenerator(model, symbolProvider, enum, TestEnumType, emptyList()).render(this)\n            }\n        }\n        model.lookup<OperationShape>(\"test#Op\").inputShape(model).also { input ->\n            input.renderWithModelBuilder(model, symbolProvider, project)\n        }\n        project.compileAndTest()\n    }\n\n    private val baseModelWithRequiredTypes =\n        \"\"\"\n        namespace test\n        use aws.protocols#restXml\n        union Choice {\n            boolean: Boolean,\n            @xmlFlattened\n            @xmlName(\"Hi\")\n            flatMap: MyMap,\n            deepMap: MyMap,\n            @xmlFlattened\n            flatList: SomeList,\n            deepList: SomeList,\n            s: String,\n            enum: FooEnum,\n            date: Timestamp,\n            number: Double,\n            top: Top,\n            blob: Blob,\n            unit: Unit,\n        }\n\n        @enum([{name: \"FOO\", value: \"FOO\"}])\n        string FooEnum\n\n        map MyMap {\n            @xmlName(\"Name\")\n            key: String,\n            @xmlName(\"Setting\")\n            value: Choice,\n        }\n\n        list SomeList {\n            member: Choice\n        }\n\n\n        structure Top {\n            @required\n            choice: Choice,\n            @required\n            field: String,\n            @required\n            @xmlAttribute\n            extra: Long,\n            @xmlName(\"prefix:local\")\n            renamedWithPrefix: String,\n            @xmlName(\"rec\")\n            @xmlFlattened\n            recursive: TopList\n        }\n\n        list TopList {\n            member: Top\n        }\n\n        @input\n        structure OpInput {\n            @required\n            @httpPayload\n            payload: Top\n        }\n\n        @http(uri: \"/top\", method: \"POST\")\n        operation Op {\n            input: OpInput,\n        }\n        \"\"\".asSmithyModel()\n\n    @ParameterizedTest\n    @CsvSource(\n        \"CLIENT\",\n        \"CLIENT_CAREFUL\",\n        \"CLIENT_ZERO_VALUE_V1\",\n        \"CLIENT_ZERO_VALUE_V1_NO_INPUT\",\n        \"SERVER\",\n    )\n    fun `generates valid serializers for required types`(nullabilityCheckMode: NullableIndex.CheckMode) {\n        val model = RecursiveShapeBoxer().transform(OperationNormalizer.transform(baseModelWithRequiredTypes))\n        val codegenContext = testCodegenContext(model, nullabilityCheckMode = nullabilityCheckMode)\n        val symbolProvider = codegenContext.symbolProvider\n        val parserGenerator =\n            XmlBindingTraitSerializerGenerator(\n                codegenContext,\n                HttpTraitHttpBindingResolver(model, ProtocolContentTypes.consistent(\"application/xml\")),\n            )\n        val operationSerializer = parserGenerator.payloadSerializer(model.lookup(\"test#OpInput\\$payload\"))\n\n        val project = TestWorkspace.testProject(symbolProvider)\n\n        // Depending on the nullability check mode, the builder can be fallible or not. When it's fallible, we need to\n        // add unwrap calls.\n        val builderIsFallible =\n            BuilderGenerator.hasFallibleBuilder(model.lookup<StructureShape>(\"test#Top\"), symbolProvider)\n        val maybeUnwrap =\n            if (builderIsFallible) {\n                \".unwrap()\"\n            } else {\n                \"\"\n            }\n        val payloadIsOptional =\n            model.lookup<MemberShape>(\"test#OpInput\\$payload\").let {\n                symbolProvider.toSymbol(it).isOptional()\n            }\n        val maybeUnwrapPayload =\n            if (payloadIsOptional) {\n                \".unwrap()\"\n            } else {\n                \"\"\n            }\n        project.lib {\n            unitTest(\n                \"serialize_xml\",\n                \"\"\"\n                use test_model::{Choice, Top};\n\n                let input = crate::test_input::OpInput::builder()\n                    .payload(\n                        Top::builder()\n                            .field(\"Hello\")\n                            .choice(Choice::Boolean(true))\n                            .extra(45)\n                            .recursive(\n                                Top::builder()\n                                    .field(\"World!\")\n                                    .choice(Choice::Boolean(true))\n                                    .extra(55)\n                                    .build()\n                                    $maybeUnwrap\n                            )\n                            .build()\n                            $maybeUnwrap\n                    )\n                    .build()\n                    .unwrap();\n                let serialized = ${format(operationSerializer)}(&input.payload$maybeUnwrapPayload).unwrap();\n                let output = std::str::from_utf8(&serialized).unwrap();\n                assert_eq!(output, \"<Top extra=\\\"45\\\"><choice><boolean>true</boolean></choice><field>Hello</field><rec extra=\\\"55\\\"><choice><boolean>true</boolean></choice><field>World!</field></rec></Top>\");\n                \"\"\",\n            )\n            unitTest(\n                \"unknown_variants\",\n                \"\"\"\n                use test_model::{Choice, Top};\n                let input = crate::test_input::OpInput::builder().payload(\n                    Top::builder()\n                        .field(\"Hello\")\n                        .choice(Choice::Unknown)\n                        .extra(45)\n                        .build()\n                        $maybeUnwrap\n                ).build().unwrap();\n                ${format(operationSerializer)}(&input.payload$maybeUnwrapPayload).expect_err(\"cannot serialize unknown variant\");\n                \"\"\",\n            )\n        }\n        model.lookup<StructureShape>(\"test#Top\").also { top ->\n            top.renderWithModelBuilder(model, symbolProvider, project)\n            project.moduleFor(top) {\n                UnionGenerator(model, symbolProvider, this, model.lookup(\"test#Choice\")).render()\n                val enum = model.lookup<StringShape>(\"test#FooEnum\")\n                EnumGenerator(model, symbolProvider, enum, TestEnumType, emptyList()).render(this)\n            }\n        }\n        model.lookup<OperationShape>(\"test#Op\").inputShape(model).also { input ->\n            input.renderWithModelBuilder(model, symbolProvider, project)\n        }\n        project.compileAndTest()\n    }\n\n    @org.junit.jupiter.api.Test\n    fun `serializes BigInteger and BigDecimal to XML`() {\n        val model = RecursiveShapeBoxer().transform(OperationNormalizer.transform(bigNumberModel))\n        val codegenContext = testCodegenContext(model)\n        val symbolProvider = codegenContext.symbolProvider\n        val serializerGenerator =\n            XmlBindingTraitSerializerGenerator(\n                codegenContext,\n                HttpTraitHttpBindingResolver(model, ProtocolContentTypes.consistent(\"application/xml\")),\n            )\n        val operationSerializer = serializerGenerator.payloadSerializer(model.lookup(\"test#BigNumberInput\\$payload\"))\n\n        val project = TestWorkspace.testProject(testSymbolProvider(model))\n        project.lib {\n            unitTest(\n                \"serialize_big_numbers\",\n                \"\"\"\n                use aws_smithy_types::{BigInteger, BigDecimal};\n                let input = crate::test_input::BigNumberOpInput::builder().payload(\n                    crate::test_model::BigNumberData::builder()\n                        .big_int(\"12345678901234567890\".parse().unwrap())\n                        .big_dec(\"3.141592653589793238\".parse().unwrap())\n                        .build()\n                ).build().unwrap();\n                let serialized = ${format(operationSerializer)}(&input.payload.unwrap()).unwrap();\n                let output = std::str::from_utf8(&serialized).unwrap();\n                assert!(output.contains(\"<bigInt>12345678901234567890</bigInt>\"));\n                assert!(output.contains(\"<bigDec>3.141592653589793238</bigDec>\"));\n                \"\"\",\n            )\n        }\n\n        model.lookup<StructureShape>(\"test#BigNumberData\").also { struct ->\n            struct.renderWithModelBuilder(model, symbolProvider, project)\n        }\n        model.lookup<OperationShape>(\"test#BigNumberOp\").inputShape(model).also { input ->\n            input.renderWithModelBuilder(model, symbolProvider, project)\n        }\n        project.compileAndTest()\n    }\n}\n"
  },
  {
    "path": "codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/transformers/EventStreamNormalizerTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy.transformers\n\nimport io.kotest.matchers.shouldBe\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.model.shapes.UnionShape\nimport software.amazon.smithy.rust.codegen.core.smithy.traits.SyntheticEventStreamUnionTrait\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.util.expectTrait\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\n\nclass EventStreamNormalizerTest {\n    @Test\n    fun `it should leave normal unions alone`() {\n        val transformed =\n            EventStreamNormalizer.transform(\n                \"\"\"\n                namespace test\n                union SomeNormalUnion {\n                    Foo: String,\n                    Bar: Long,\n                }\n                \"\"\".asSmithyModel(),\n            )\n\n        val shape = transformed.expectShape(ShapeId.from(\"test#SomeNormalUnion\"), UnionShape::class.java)\n        shape.hasTrait<SyntheticEventStreamUnionTrait>() shouldBe false\n        shape.memberNames shouldBe listOf(\"Foo\", \"Bar\")\n    }\n\n    @Test\n    fun `it should transform event stream unions`() {\n        val transformed =\n            EventStreamNormalizer.transform(\n                \"\"\"\n                namespace test\n\n                structure SomeMember {\n                }\n\n                @error(\"client\")\n                structure SomeError {\n                }\n\n                @streaming\n                union SomeEventStream {\n                    SomeMember: SomeMember,\n                    SomeError: SomeError,\n                }\n                \"\"\".asSmithyModel(),\n            )\n\n        val shape = transformed.expectShape(ShapeId.from(\"test#SomeEventStream\"), UnionShape::class.java)\n        shape.hasTrait<SyntheticEventStreamUnionTrait>() shouldBe true\n        shape.memberNames shouldBe listOf(\"SomeMember\")\n\n        val trait = shape.expectTrait<SyntheticEventStreamUnionTrait>()\n        trait.errorMembers.map { it.memberName } shouldBe listOf(\"SomeError\")\n    }\n}\n"
  },
  {
    "path": "codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/transformers/OperationNormalizerTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy.transformers\n\nimport io.kotest.matchers.shouldBe\nimport io.kotest.matchers.shouldNotBe\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.rust.codegen.core.smithy.traits.SyntheticInputTrait\nimport software.amazon.smithy.rust.codegen.core.smithy.traits.SyntheticOutputTrait\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.testSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.util.orNull\n\ninternal class OperationNormalizerTest {\n    @Test\n    fun `add inputs and outputs to empty operations`() {\n        val model =\n            \"\"\"\n            namespace smithy.test\n            operation Empty {}\n            \"\"\".asSmithyModel()\n        val operationId = ShapeId.from(\"smithy.test#Empty\")\n        model.expectShape(operationId, OperationShape::class.java).input.isPresent shouldBe false\n        val modified = OperationNormalizer.transform(model)\n        val operation = modified.expectShape(operationId, OperationShape::class.java)\n        operation.input.isPresent shouldBe true\n        operation.input.get().name shouldBe \"EmptyInput\"\n\n        val inputShape = modified.expectShape(operation.input.get(), StructureShape::class.java)\n        inputShape.expectTrait(SyntheticInputTrait::class.java)\n\n        operation.output.orNull() shouldNotBe null\n        operation.output.get().name shouldBe \"EmptyOutput\"\n\n        val outputShape = modified.expectShape(operation.output.get(), StructureShape::class.java)\n        outputShape.expectTrait(SyntheticOutputTrait::class.java)\n    }\n\n    @Test\n    fun `create cloned inputs for operations`() {\n        val model =\n            \"\"\"\n            namespace smithy.test\n            structure RenameMe {\n                v: String\n            }\n            operation MyOp {\n                input: RenameMe\n            }\n            \"\"\".asSmithyModel()\n        val operationId = ShapeId.from(\"smithy.test#MyOp\")\n        model.expectShape(operationId, OperationShape::class.java).input.isPresent shouldBe true\n        val modified = OperationNormalizer.transform(model)\n        val operation = modified.expectShape(operationId, OperationShape::class.java)\n        operation.input.isPresent shouldBe true\n        val inputId = operation.input.get()\n        inputId.name shouldBe \"MyOpInput\"\n        val inputShape = modified.expectShape(inputId, StructureShape::class.java)\n        testSymbolProvider(modified).toSymbol(inputShape).name shouldBe \"MyOpInput\"\n        inputShape.memberNames shouldBe listOf(\"v\")\n    }\n\n    @Test\n    fun `create cloned outputs for operations`() {\n        val model =\n            \"\"\"\n            namespace smithy.test\n            structure RenameMe {\n                v: String\n            }\n            operation MyOp {\n                output: RenameMe\n            }\n            \"\"\".asSmithyModel()\n        val operationId = ShapeId.from(\"smithy.test#MyOp\")\n        model.expectShape(operationId, OperationShape::class.java).output.isPresent shouldBe true\n        val modified = OperationNormalizer.transform(model)\n        val operation = modified.expectShape(operationId, OperationShape::class.java)\n        operation.output.isPresent shouldBe true\n        val outputId = operation.output.get()\n        outputId.name shouldBe \"MyOpOutput\"\n        val outputShape = modified.expectShape(outputId, StructureShape::class.java)\n        testSymbolProvider(modified).toSymbol(outputShape).name shouldBe \"MyOpOutput\"\n        outputShape.memberNames shouldBe listOf(\"v\")\n    }\n\n    @Test\n    fun `synthetics should not collide with other operations`() {\n        val model =\n            \"\"\"\n            namespace test\n\n            structure DeleteApplicationRequest {}\n            structure DeleteApplicationResponse {}\n\n            operation DeleteApplication {\n                input: DeleteApplicationRequest,\n                output: DeleteApplicationResponse,\n            }\n\n            structure DeleteApplicationOutputRequest {}\n            structure DeleteApplicationOutputResponse {}\n\n            operation DeleteApplicationOutput {\n                input: DeleteApplicationOutputRequest,\n                output: DeleteApplicationOutputResponse,\n            }\n            \"\"\".asSmithyModel()\n\n        (model.expectShape(ShapeId.from(\"test#DeleteApplicationOutput\")) is OperationShape) shouldBe true\n\n        val modified = OperationNormalizer.transform(model)\n        (modified.expectShape(ShapeId.from(\"test#DeleteApplicationOutput\")) is OperationShape) shouldBe true\n    }\n}\n"
  },
  {
    "path": "codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/transformers/RecursiveShapeBoxerTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy.transformers\n\nimport io.kotest.matchers.shouldBe\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.rust.codegen.core.smithy.traits.RustBoxTrait\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.util.expectTrait\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\nimport software.amazon.smithy.rust.codegen.core.util.lookup\nimport kotlin.streams.toList\n\ninternal class RecursiveShapeBoxerTest {\n    @Test\n    fun `leave non-recursive models unchanged`() {\n        val model =\n            \"\"\"\n            namespace com.example\n            list BarList {\n                member: Bar\n            }\n            structure Hello {\n                bars: BarList\n            }\n\n            structure Bar {\n                hello: Hello\n            }\n            \"\"\".asSmithyModel()\n        RecursiveShapeBoxer().transform(model) shouldBe model\n    }\n\n    @Test\n    fun `add the box trait to simple recursive shapes`() {\n        val model =\n            \"\"\"\n            namespace com.example\n            structure Recursive {\n                RecursiveStruct: Recursive,\n                anotherField: Boolean\n            }\n            \"\"\".asSmithyModel()\n        val transformed = RecursiveShapeBoxer().transform(model)\n        val member: MemberShape = transformed.lookup(\"com.example#Recursive\\$RecursiveStruct\")\n        member.expectTrait<RustBoxTrait>()\n    }\n\n    @Test\n    fun `add the box trait to complex structures`() {\n        val model =\n            \"\"\"\n            namespace com.example\n            structure Expr {\n                 left: Atom,\n                 right: Atom\n            }\n\n            union Atom {\n                 add: Expr,\n                 sub: Expr,\n                 literal: Integer,\n                 more: SecondTree\n            }\n\n            structure SecondTree {\n                 member: Expr,\n                 otherMember: Atom,\n                 third: SecondTree\n            }\n            \"\"\".asSmithyModel()\n        val transformed = RecursiveShapeBoxer().transform(model)\n        val boxed = transformed.shapes().filter { it.hasTrait<RustBoxTrait>() }.toList()\n        boxed.map { it.id.toString().removePrefix(\"com.example#\") }.toSet() shouldBe\n            setOf(\n                \"Atom\\$add\",\n                \"Atom\\$sub\",\n                \"SecondTree\\$third\",\n                \"Atom\\$more\",\n            )\n    }\n}\n"
  },
  {
    "path": "codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/smithy/transformers/RecursiveShapesIntegrationTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.smithy.transformers\n\nimport io.kotest.matchers.string.shouldContain\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.assertThrows\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.shapes.UnionShape\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.StructSettings\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.StructureGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.UnionGenerator\nimport software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.compileAndTest\nimport software.amazon.smithy.rust.codegen.core.testutil.testSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.util.CommandError\nimport software.amazon.smithy.rust.codegen.core.util.lookup\n\nclass RecursiveShapesIntegrationTest {\n    @Test\n    fun `recursive shapes are properly boxed`() {\n        val model =\n            \"\"\"\n            namespace com.example\n            structure Expr {\n                 left: Atom,\n                 right: Atom\n            }\n\n            union Atom {\n                 add: Expr,\n                 sub: Expr,\n                 literal: Integer,\n                 more: SecondTree\n            }\n\n            structure SecondTree {\n                 member: Expr,\n                 otherMember: Atom,\n                 third: SecondTree\n            }\n            \"\"\".asSmithyModel()\n\n        val check = { input: Model ->\n            val symbolProvider = testSymbolProvider(model)\n            val project = TestWorkspace.testProject(symbolProvider)\n            val structures = listOf(\"Expr\", \"SecondTree\").map { input.lookup<StructureShape>(\"com.example#$it\") }\n            structures.forEach { struct ->\n                project.moduleFor(struct) {\n                    StructureGenerator(input, symbolProvider, this, struct, emptyList(), StructSettings(true)).render()\n                }\n            }\n            input.lookup<UnionShape>(\"com.example#Atom\").also { atom ->\n                project.moduleFor(atom) {\n                    UnionGenerator(input, symbolProvider, this, atom).render()\n                }\n            }\n            project\n        }\n        val unmodifiedProject = check(model)\n        val output =\n            assertThrows<CommandError> {\n                unmodifiedProject.compileAndTest(expectFailure = true)\n            }\n        // THIS IS A LOAD-BEARING shouldContain! If the compiler error changes then this will break!\n        output.message shouldContain \"have infinite size\"\n\n        val fixedProject = check(RecursiveShapeBoxer().transform(model))\n        fixedProject.compileAndTest()\n    }\n}\n"
  },
  {
    "path": "codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/util/ExecKtTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.util\n\nimport io.kotest.assertions.throwables.shouldThrow\nimport org.junit.jupiter.api.Test\n\ninternal class ExecKtTest {\n    @Test\n    fun `missing command throws CommandFailed`() {\n        shouldThrow<CommandError> {\n            \"notaprogram run\".runCommand()\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/util/ExtensionsTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\npackage software.amazon.smithy.rust.codegen.core.util\n\nimport io.kotest.matchers.shouldBe\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.model.shapes.ServiceShape\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\n\nclass ExtensionsTest {\n    @Test\n    fun `it should find event streams on normal operations`() {\n        val model =\n            \"\"\"\n            namespace test\n            service TestService {\n                operations: [ EventStreamOp ]\n            }\n\n            operation EventStreamOp {\n                input := {\n                    events: Events\n                }\n            }\n\n            @streaming\n            union Events {\n                foo: Foo\n                bar: Bar,\n            }\n\n            structure Foo {\n                foo: String\n            }\n\n            structure Bar {\n                bar: Long\n            }\n            \"\"\".asSmithyModel(smithyVersion = \"2.0\")\n\n        val service = model.expectShape(ShapeId.from(\"test#TestService\"), ServiceShape::class.java)\n        service.hasEventStreamOperations(model) shouldBe true\n    }\n\n    @Test\n    fun `it should find event streams on resource operations`() {\n        val model =\n            \"\"\"\n            namespace test\n            service TestService {\n                resources: [ TestResource ]\n            }\n\n            resource TestResource {\n                operations: [ EventStreamOp ]\n            }\n\n            operation EventStreamOp {\n                input := {\n                    events: Events\n                }\n            }\n\n            @streaming\n            union Events {\n                foo: Foo\n                bar: Bar,\n            }\n\n            structure Foo {\n                foo: String\n            }\n\n            structure Bar {\n                bar: Long\n            }\n            \"\"\".asSmithyModel(smithyVersion = \"2.0\")\n\n        val service = model.expectShape(ShapeId.from(\"test#TestService\"), ServiceShape::class.java)\n        service.hasEventStreamOperations(model) shouldBe true\n    }\n}\n"
  },
  {
    "path": "codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/util/MapTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.util\n\nimport io.kotest.matchers.shouldBe\nimport org.junit.jupiter.api.Test\n\nclass MapTest {\n    @Test\n    fun `it should deep merge maps`() {\n        mapOf<String, Any?>().deepMergeWith(mapOf()) shouldBe emptyMap()\n\n        mapOf<String, Any?>(\"foo\" to 1, \"bar\" to \"baz\").deepMergeWith(mapOf()) shouldBe\n            mapOf(\n                \"foo\" to 1,\n                \"bar\" to \"baz\",\n            )\n\n        mapOf<String, Any?>().deepMergeWith(mapOf(\"foo\" to 1, \"bar\" to \"baz\")) shouldBe\n            mapOf(\n                \"foo\" to 1,\n                \"bar\" to \"baz\",\n            )\n\n        mapOf<String, Any?>(\n            \"package\" to\n                mapOf<String, Any?>(\n                    \"name\" to \"foo\",\n                    \"version\" to \"1.0.0\",\n                ),\n        ).deepMergeWith(\n            mapOf<String, Any?>(\n                \"package\" to\n                    mapOf<String, Any?>(\n                        \"readme\" to \"README.md\",\n                    ),\n            ),\n        ) shouldBe\n            mapOf(\n                \"package\" to\n                    mapOf<String, Any?>(\n                        \"name\" to \"foo\",\n                        \"version\" to \"1.0.0\",\n                        \"readme\" to \"README.md\",\n                    ),\n            )\n\n        mapOf<String, Any?>(\n            \"package\" to\n                mapOf<String, Any?>(\n                    \"name\" to \"foo\",\n                    \"version\" to \"1.0.0\",\n                    \"overwrite-me\" to \"wrong\",\n                ),\n            \"make-me-not-a-map\" to mapOf(\"foo\" to \"bar\"),\n        ).deepMergeWith(\n            mapOf<String, Any?>(\n                \"package\" to\n                    mapOf<String, Any?>(\n                        \"readme\" to \"README.md\",\n                        \"overwrite-me\" to \"correct\",\n                    ),\n                \"make-me-not-a-map\" to 5,\n            ),\n        ) shouldBe\n            mapOf(\n                \"package\" to\n                    mapOf<String, Any?>(\n                        \"name\" to \"foo\",\n                        \"version\" to \"1.0.0\",\n                        \"readme\" to \"README.md\",\n                        \"overwrite-me\" to \"correct\",\n                    ),\n                \"make-me-not-a-map\" to 5,\n            )\n    }\n}\n"
  },
  {
    "path": "codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/util/RustToolChainTomlTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.util\n\nimport io.kotest.matchers.booleans.shouldBeTrue\nimport io.kotest.matchers.paths.shouldExist\nimport io.kotest.matchers.shouldNotBe\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.rust.codegen.core.generated.BuildEnvironment\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.generatePluginContext\nimport java.io.File\nimport java.nio.file.Files.createTempDirectory\nimport java.util.regex.Pattern\n\ninternal class RustToolChainTomlTest {\n    val model =\n        \"\"\"\n        namespace test\n\n        service TestService {\n            version: \"123\",\n            operations: [TestOperation]\n        }\n\n        operation TestOperation {\n            input:= {}\n            output:= {}\n        }\n        \"\"\".asSmithyModel(smithyVersion = \"2\")\n\n    @Test\n    fun `override test directory in integration test has a rust-toolchain toml file`() {\n        val dir = createTempDirectory(\"smithy-test\").toFile()\n        val (_, path) = generatePluginContext(model, overrideTestDir = dir)\n        path.shouldExist()\n        val rustToolchainTomlPath = path.resolve(\"rust-toolchain.toml\")\n        rustToolchainTomlPath.shouldExist()\n    }\n\n    @Test\n    fun `rust-toolchain toml file has correct value from gradle properties for rust-msrv`() {\n        val (_, path) = generatePluginContext(model)\n        val rustToolchainTomlPath = path.resolve(\"rust-toolchain.toml\")\n        rustToolchainTomlPath.shouldExist()\n\n        // Read the MSRV written in `gradle.properties` file.\n        val msrvPattern = Pattern.compile(\"rust\\\\.msrv=(.+)\")\n        val gradlePropertiesPath = File(BuildEnvironment.PROJECT_DIR).resolve(\"gradle.properties\")\n        val msrv =\n            gradlePropertiesPath.useLines { lines ->\n                lines.firstNotNullOfOrNull { line ->\n                    msrvPattern.matcher(line).let { matcher ->\n                        if (matcher.find()) matcher.group(1) else null\n                    }\n                }\n            }\n        msrv shouldNotBe null\n\n        // Read `channel = (\\d+)` from `rust-toolchain.toml` file, and\n        // ensure it matches the one in `gradle.properties`.\n        val toolchainPattern = Pattern.compile(\"\\\\[toolchain]\")\n        val channelPattern = Pattern.compile(\"channel\\\\s*=\\\\s*\\\"(.+)\\\"\")\n\n        val channelMatches =\n            rustToolchainTomlPath.toFile().useLines { lines ->\n                // Skip lines until the [toolchain] table is found, then take all lines until the next table.\n                val toolchainSection =\n                    lines\n                        .dropWhile { !toolchainPattern.matcher(it).find() }\n                        .drop(1)\n                        .takeWhile { !it.trim().startsWith(\"[\") }\n\n                // There should be a [toolchain] table, and it must have a key called 'channel' whose value must\n                // match the `rust.msrv` specified in gradle.properties.\n                toolchainSection.any { line ->\n                    channelPattern.matcher(line).let { matcher ->\n                        matcher.find() && matcher.group(1) == msrv\n                    }\n                }\n            }\n\n        channelMatches.shouldBeTrue()\n    }\n}\n"
  },
  {
    "path": "codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/util/StringsTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.util\n\nimport io.kotest.matchers.shouldBe\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.extension.ExtensionContext\nimport org.junit.jupiter.api.fail\nimport org.junit.jupiter.params.ParameterizedTest\nimport org.junit.jupiter.params.provider.Arguments\nimport org.junit.jupiter.params.provider.ArgumentsProvider\nimport org.junit.jupiter.params.provider.ArgumentsSource\nimport java.io.File\nimport java.util.stream.Stream\n\ninternal class StringsTest {\n    @Test\n    fun doubleQuote() {\n        \"abc\".doubleQuote() shouldBe \"\\\"abc\\\"\"\n        \"\"\"{\"some\": \"json\"}\"\"\".doubleQuote() shouldBe \"\"\"\"{\\\"some\\\": \\\"json\\\"}\"\"\"\"\n        \"\"\"{\"nested\": \"{\\\"nested\\\": 5}\"}\"}\"\"\".doubleQuote() shouldBe\n            \"\"\"\n            \"{\\\"nested\\\": \\\"{\\\\\\\"nested\\\\\\\": 5}\\\"}\\\"}\"\n            \"\"\".trimIndent().trim()\n    }\n\n    @Test\n    fun correctlyConvertToSnakeCase() {\n        \"NotificationARNs\".toSnakeCase() shouldBe \"notification_arns\"\n    }\n\n    @Test\n    fun handleDashes() {\n        \"application/x-amzn-json-1.1\".toSnakeCase() shouldBe \"application_x_amzn_json_1_1\"\n    }\n\n    @Test\n    fun testAllNames() {\n        // Set this to true to write a new test expectation file\n        val publishUpdate = false\n        val allNames = this::class.java.getResource(\"/testOutput.txt\")?.readText()!!\n        val errors = mutableListOf<String>()\n        val output = StringBuilder()\n        allNames.lines().filter { it.isNotBlank() }.forEach {\n            val split = it.split(',')\n            val input = split[0]\n            val expectation = split[1]\n            val actual = input.toSnakeCase()\n            if (input.toSnakeCase() != expectation) {\n                errors += \"$it => $actual (expected $expectation)\"\n            }\n            output.appendLine(\"$input,$actual\")\n        }\n        if (publishUpdate) {\n            File(\"testOutput.txt\").writeText(output.toString())\n        }\n        if (errors.isNotEmpty()) {\n            fail(errors.joinToString(\"\\n\"))\n        }\n    }\n\n    @ParameterizedTest\n    @ArgumentsSource(TestCasesProvider::class)\n    fun testSnakeCase(\n        input: String,\n        output: String,\n    ) {\n        input.toSnakeCase() shouldBe output\n    }\n}\n\nclass TestCasesProvider : ArgumentsProvider {\n    override fun provideArguments(context: ExtensionContext?): Stream<out Arguments> =\n        listOf(\n            \"ACLs\" to \"acls\",\n            \"ACLsUpdateStatus\" to \"acls_update_status\",\n            \"AllowedAllVPCs\" to \"allowed_all_vpcs\",\n            \"BluePrimaryX\" to \"blue_primary_x\",\n            \"CIDRs\" to \"cidrs\",\n            \"AuthTtL\" to \"auth_ttl\",\n            \"CNAMEPrefix\" to \"cname_prefix\",\n            \"S3Location\" to \"s3_location\",\n            \"signatureS\" to \"signature_s\",\n            \"signatureR\" to \"signature_r\",\n            \"M3u8Settings\" to \"m3u8_settings\",\n            \"IAMUser\" to \"iam_user\",\n            \"OtaaV1_0_x\" to \"otaa_v1_0_x\",\n            \"DynamoDBv2Action\" to \"dynamo_dbv2_action\",\n            \"SessionKeyEmv2000\" to \"session_key_emv2000\",\n            \"SupportsClassB\" to \"supports_class_b\",\n            \"UnassignIpv6AddressesRequest\" to \"unassign_ipv6_addresses_request\",\n            \"TotalGpuMemoryInMiB\" to \"total_gpu_memory_in_mib\",\n            \"WriteIOs\" to \"write_ios\",\n            \"dynamoDBv2\" to \"dynamo_dbv2\",\n            \"ipv4Address\" to \"ipv4_address\",\n            \"sigv4\" to \"sigv4\",\n            \"s3key\" to \"s3_key\",\n            \"sha256sum\" to \"sha256_sum\",\n            \"Av1QvbrSettings\" to \"av1_qvbr_settings\",\n            \"Av1Settings\" to \"av1_settings\",\n            \"AwsElbv2LoadBalancer\" to \"aws_elbv2_load_balancer\",\n            \"SigV4Authorization\" to \"sigv4_authorization\",\n            \"IpV6Address\" to \"ipv6_address\",\n            \"IpV6Cidr\" to \"ipv6_cidr\",\n            \"IpV4Addresses\" to \"ipv4_addresses\",\n        ).map { Arguments.of(it.first, it.second) }.stream()\n}\n"
  },
  {
    "path": "codegen-core/src/test/kotlin/software/amazon/smithy/rust/codegen/core/util/SyntheticsTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.core.util\n\nimport io.kotest.matchers.shouldBe\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\n\nclass SyntheticsTest {\n    @Test\n    fun `it should clone operations`() {\n        val model =\n            \"\"\"\n            namespace test\n\n            service TestService {\n                version: \"2019-12-16\",\n                operations: [\"SomeOperation\"],\n            }\n\n            structure TestInput {\n                one: String,\n                two: String,\n            }\n            structure TestOutput {\n                three: String,\n                four: String,\n            }\n\n            operation SomeOperation { input: TestInput, output: TestOutput }\n            \"\"\".asSmithyModel()\n\n        val transformed =\n            model.toBuilder().cloneOperation(model, ShapeId.from(\"test#SomeOperation\")) { shapeId ->\n                ShapeId.fromParts(shapeId.namespace + \".cloned\", shapeId.name + \"Foo\")\n            }.build()\n\n        val newOp = transformed.expectShape(ShapeId.from(\"test.cloned#SomeOperationFoo\"), OperationShape::class.java)\n        newOp.input.orNull() shouldBe ShapeId.from(\"test.cloned#TestInputFoo\")\n        newOp.output.orNull() shouldBe ShapeId.from(\"test.cloned#TestOutputFoo\")\n\n        val newIn = transformed.expectShape(ShapeId.from(\"test.cloned#TestInputFoo\"), StructureShape::class.java)\n        for (member in newIn.members()) {\n            member.id shouldBe ShapeId.fromParts(\"test.cloned\", \"TestInputFoo\", member.memberName)\n        }\n\n        val newOut = transformed.expectShape(ShapeId.from(\"test.cloned#TestOutputFoo\"), StructureShape::class.java)\n        for (member in newOut.members()) {\n            member.id shouldBe ShapeId.fromParts(\"test.cloned\", \"TestOutputFoo\", member.memberName)\n        }\n    }\n\n    @Test\n    fun `it should rename structs`() {\n        val model =\n            \"\"\"\n            namespace test\n\n            structure SomeInput {\n                one: String,\n                two: String,\n            }\n            \"\"\".asSmithyModel()\n\n        val original = model.expectShape(ShapeId.from(\"test#SomeInput\"), StructureShape::class.java)\n        val new = original.toBuilder().rename(ShapeId.from(\"new#SomeOtherInput\")).build()\n        new.id shouldBe ShapeId.from(\"new#SomeOtherInput\")\n        for (member in new.members()) {\n            member.id shouldBe ShapeId.fromParts(\"new\", \"SomeOtherInput\", member.memberName)\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-core/src/test/resources/allNames.txt",
    "content": "ACL\nACLAlreadyExistsFault\nACLName\nACLNames\nACLNotFoundFault\nACLPendingChanges\nACLQuotaExceededFault\nACLToApply\nACLs\nACLsUpdateStatus\nACMCertificateArn\nACTIVE\nADDomainJoinPassword\nADDomainJoinUser\nADM\nADMChannelRequest\nADMChannelResponse\nADMMessage\nALPNPolicyNotSupportedException\nAPICallRateForCustomerExceededFault\nAPIKey\nAPIKeySummaries\nAPIKeySummary\nAPIName\nAPNS\nAPNSChannelRequest\nAPNSChannelResponse\nAPNSMessage\nAPNSPushNotificationTemplate\nAPNSPushType\nAPNSSandboxChannelRequest\nAPNSSandboxChannelResponse\nAPNSVoipChannelRequest\nAPNSVoipChannelResponse\nAPNSVoipSandboxChannelRequest\nAPNSVoipSandboxChannelResponse\nARN\nASN1Subject\nASName\nASNumber\nASSERTION\nATIMetricDataPoint\nATIModelPerformance\nATITrainingMetricsValue\nAWSAccessKeyId\nAWSAccount\nAWSAccountId\nAWSAccountIds\nAWSCost\nAWSDomainInformation\nAWSKMSKeyARN\nAWSLocation\nAWSManagedRulesACFPRuleSet\nAWSManagedRulesATPRuleSet\nAWSManagedRulesBotControlRuleSet\nAWSOrganizationsNotInUseException\nAWSService\nAWSServiceAccessNotEnabledException\nAWSServiceName\nAWSSessionCredentials\nAZList\nAZMode\nAacSettings\nAbortConfig\nAbortCriteria\nAbortDate\nAbortDocumentVersionUploadRequest\nAbortEnvironmentUpdateMessage\nAbortIncompleteMultipartUpload\nAbortMultipartReadSetUploadRequest\nAbortMultipartUploadInput\nAbortMultipartUploadOutput\nAbortMultipartUploadRequest\nAbortRuleId\nAbortTransaction\nAbortTransactionResult\nAbortVaultLockInput\nAbortableOperationInProgress\nAbpV1_0_x\nAbpV1_1\nAbrSettings\nAbsentInputAudioBehavior\nAbsoluteTime\nAbsoluteTimeRange\nAbuseContactEmail\nAbuseContactPhone\nAc3Settings\nAccelerateConfiguration\nAccelerationSettings\nAccelerationStatus\nAccelerator\nAcceleratorArn\nAcceleratorAttributes\nAcceleratorCount\nAcceleratorCountRequest\nAcceleratorEvent\nAcceleratorManufacturers\nAcceleratorNames\nAcceleratorNotDisabledException\nAcceleratorNotFoundException\nAcceleratorPort\nAcceleratorSocketAddresses\nAcceleratorTotalMemoryMiB\nAcceleratorTotalMemoryMiBRequest\nAcceleratorType\nAcceleratorTypeOffering\nAcceleratorTypes\nAccelerators\nAccent\nAccentForeground\nAccept\nAcceptAddressTransferRequest\nAcceptAddressTransferResult\nAcceptAdministratorInvitationRequest\nAcceptAnyDate\nAcceptAttachmentRequest\nAcceptAttachmentResponse\nAcceptCertificateTransferRequest\nAcceptCode\nAcceptCodeValidation\nAcceptDirectConnectGatewayAssociationProposalRequest\nAcceptDirectConnectGatewayAssociationProposalResult\nAcceptDomainTransferFromAnotherAwsAccountRequest\nAcceptDomainTransferFromAnotherAwsAccountResponse\nAcceptEnvironmentAccountConnectionInput\nAcceptEnvironmentAccountConnectionOutput\nAcceptEulasRequest\nAcceptEulasResponse\nAcceptGrantRequest\nAcceptGrantResponse\nAcceptHandshakeRequest\nAcceptHandshakeResponse\nAcceptInboundConnectionRequest\nAcceptInboundConnectionResponse\nAcceptInboundCrossClusterSearchConnectionRequest\nAcceptInboundCrossClusterSearchConnectionResponse\nAcceptInputDeviceTransferRequest\nAcceptInvitationRequest\nAcceptLanguage\nAcceptMatchInput\nAcceptPageRequest\nAcceptPortfolioShareInput\nAcceptQualificationRequestRequest\nAcceptRanges\nAcceptReservedInstancesExchangeQuoteRequest\nAcceptReservedInstancesExchangeQuoteResult\nAcceptReservedNodeExchangeInputMessage\nAcceptReservedNodeExchangeOutputMessage\nAcceptResourceShareInvitationRequest\nAcceptResourceShareInvitationResponse\nAcceptShareRequest\nAcceptShareResponse\nAcceptSharedDirectoryRequest\nAcceptSharedDirectoryResult\nAcceptTermsAndConditions\nAcceptTime\nAcceptTransitGatewayMulticastDomainAssociationsRequest\nAcceptTransitGatewayMulticastDomainAssociationsResult\nAcceptTransitGatewayPeeringAttachmentRequest\nAcceptTransitGatewayPeeringAttachmentResult\nAcceptTransitGatewayVpcAttachmentRequest\nAcceptTransitGatewayVpcAttachmentResult\nAcceptType\nAcceptVpcEndpointConnectionsRequest\nAcceptVpcEndpointConnectionsResult\nAcceptVpcPeeringConnectionRequest\nAcceptVpcPeeringConnectionResult\nAcceptanceRequired\nAcceptanceThreshold\nAcceptanceTimeoutSeconds\nAcceptanceType\nAccepted\nAcceptedRouteCount\nAccepterPeeringConnectionOptions\nAccepterTgwInfo\nAccepterTransitGatewayAttachmentId\nAccepterVpcInfo\nAccess\nAccessAll\nAccessAlternateDirectly\nAccessBasedEnumeration\nAccessConfiguration\nAccessControl\nAccessControlAllowCredentials\nAccessControlAllowHeaders\nAccessControlAllowMethods\nAccessControlAllowOrigins\nAccessControlAttribute\nAccessControlAttributeValue\nAccessControlAttributes\nAccessControlConfigurationId\nAccessControlConfigurationSummary\nAccessControlConfigurations\nAccessControlEntries\nAccessControlEntry\nAccessControlEntrySummary\nAccessControlExposeHeaders\nAccessControlGrants\nAccessControlList\nAccessControlListConfiguration\nAccessControlMaxAgeSec\nAccessControlPolicy\nAccessControlRule\nAccessControlTranslation\nAccessDenied\nAccessDeniedException\nAccessDeniedFault\nAccessDeniedForDependencyException\nAccessDescription\nAccessDetail\nAccessDetails\nAccessEndpoint\nAccessEndpoints\nAccessForbidden\nAccessGroupId\nAccessKey\nAccessKeyDetails\nAccessKeyId\nAccessKeyLastUsed\nAccessKeyMetadata\nAccessLevelFilter\nAccessLocation\nAccessLog\nAccessLogSettings\nAccessLogSubscriptionSummary\nAccessLoggingEnabled\nAccessLogs\nAccessMethod\nAccessMethodType\nAccessPoint\nAccessPointAlreadyExists\nAccessPointArn\nAccessPointDescription\nAccessPointId\nAccessPointLimitExceeded\nAccessPointList\nAccessPointNotFound\nAccessPointNotFoundException\nAccessPoints\nAccessPolicies\nAccessPoliciesStatus\nAccessPolicy\nAccessPolicyDetail\nAccessPolicyStats\nAccessPolicySummary\nAccessPreview\nAccessPreviewFinding\nAccessPreviewStatusReason\nAccessPreviewSummary\nAccessRights\nAccessRole\nAccessRoleArn\nAccessRules\nAccessScopeAnalysisFinding\nAccessScopePath\nAccessScopePathRequest\nAccessStatus\nAccessString\nAccessSysfs\nAccessTier\nAccessToClusterDeniedFault\nAccessToSnapshotDeniedFault\nAccessToken\nAccessTokenExpiration\nAccessTokenSummary\nAccessTokenValidity\nAccessType\nAccessUrl\nAccesses\nAccessibility\nAccessibilityCaptionHints\nAccessor\nAccessorId\nAccessorSummary\nAccessorType\nAccessors\nAccount\nAccountActionRequiredException\nAccountAggregation\nAccountAggregationResponse\nAccountAggregationSource\nAccountAggregationSources\nAccountAlias\nAccountAliases\nAccountAlreadyClosedException\nAccountAlreadyRegisteredException\nAccountAssignment\nAccountAssignmentCreationRequestId\nAccountAssignmentCreationStatus\nAccountAssignmentDeletionRequestId\nAccountAssignmentDeletionStatus\nAccountAssignmentOperationStatus\nAccountAssignmentOperationStatusMetadata\nAccountAssignments\nAccountAssignmentsCreationStatus\nAccountAssignmentsDeletionStatus\nAccountAssociationsListElement\nAccountAttribute\nAccountAttributeList\nAccountAttributeValue\nAccountAttributes\nAccountAttributesMessage\nAccountChannelLimitExceededException\nAccountConfiguration\nAccountCustomization\nAccountDetail\nAccountDetails\nAccountEmail\nAccountEnrollmentStatus\nAccountEntityAggregate\nAccountFilterType\nAccountFindingsMetric\nAccountFreeTrialInfo\nAccountGateResult\nAccountGrouping\nAccountHasOngoingImportException\nAccountHealth\nAccountID\nAccountId\nAccountIds\nAccountIdsToAdd\nAccountIdsToRemove\nAccountInfo\nAccountInsightHealth\nAccountLevel\nAccountLevelBpaSync\nAccountLevelPermissions\nAccountLimit\nAccountLimitExceededException\nAccountLimits\nAccountLinked\nAccountMaxReadCapacityUnits\nAccountMaxWriteCapacityUnits\nAccountModification\nAccountModifications\nAccountName\nAccountNotFoundException\nAccountNotRegisteredException\nAccountNumber\nAccountOwnerNotVerifiedException\nAccountPassword\nAccountPolicy\nAccountQuota\nAccountQuotaName\nAccountQuotas\nAccountRecoverySetting\nAccountRecoverySettingType\nAccountRegisteredException\nAccountScope\nAccountSendingPausedException\nAccountSettings\nAccountSettingsDetail\nAccountSetupInProgressException\nAccountSharingInfo\nAccountSharingInfoList\nAccountState\nAccountStatus\nAccountStatusList\nAccountStreamLimitExceededException\nAccountSubscriptionStatus\nAccountSummary\nAccountSuspendedException\nAccountTakeoverActionType\nAccountTakeoverActionsType\nAccountTakeoverRiskConfiguration\nAccountTakeoverRiskConfigurationType\nAccountType\nAccountUsage\nAccountWithRestoreAccess\nAccounts\nAccountsUrl\nAccountsWithRestoreAccess\nAccumulatedInferenceDataEndTime\nAccumulatedInferenceDataStartTime\nAccuracy\nAccuracyCostTradeoff\nAckModeRetryDurationSecs\nAcknowledgeActionConfiguration\nAcknowledgeAlarmActionRequest\nAcknowledgeFlow\nAcknowledgeJobInput\nAcknowledgeJobOutput\nAcknowledgeOrderReceiptRequest\nAcknowledgeOrderReceiptResponse\nAcknowledgeThirdPartyJobInput\nAcknowledgeThirdPartyJobOutput\nAcknowledgedAt\nAcl\nAclConfiguration\nAclRule\nAcmCertificateArn\nAcquisitionPointId\nAction\nActionAfterCompletion\nActionArn\nActionCondition\nActionConfiguration\nActionConfigurationProperty\nActionContext\nActionDeclaration\nActionDefinition\nActionDescription\nActionExecution\nActionExecutionDetail\nActionExecutionFilter\nActionExecutionInput\nActionExecutionOutput\nActionExecutionResult\nActionHistories\nActionHistory\nActionHistoryDetails\nActionID\nActionId\nActionIdentifier\nActionInvocation\nActionInvocations\nActionLocalIpDetails\nActionLocalPortDetails\nActionName\nActionNames\nActionNotFoundException\nActionOnFailure\nActionOperations\nActionParameter\nActionParameters\nActionPrefix\nActionRemoteIpDetails\nActionRemotePortDetails\nActionRequired\nActionRequiredCode\nActionRequiredInfo\nActionRevision\nActionSource\nActionState\nActionSubType\nActionSummaries\nActionSummary\nActionTarget\nActionTargetArn\nActionTargetArns\nActionTargets\nActionThreshold\nActionThresholdType\nActionThresholdValue\nActionToUse\nActionType\nActionTypeArtifactDetails\nActionTypeDeclaration\nActionTypeExecutor\nActionTypeId\nActionTypeIdentifier\nActionTypeNotFoundException\nActionTypePermissions\nActionTypeProperty\nActionTypeSettings\nActionTypeUrls\nActions\nActionsEnabled\nActionsGuarded\nActionsRequired\nActionsSuppressedBy\nActionsSuppressedReason\nActionsSuppressor\nActionsSuppressorExtensionPeriod\nActionsSuppressorWaitPeriod\nActivate\nActivateAnomalyDetectorRequest\nActivateContactChannelRequest\nActivateDeviceIdentifierRequest\nActivateDeviceIdentifierResponse\nActivateEvaluationFormRequest\nActivateEvaluationFormResponse\nActivateEventSourceRequest\nActivateGatewayInput\nActivateGatewayOutput\nActivateKeySigningKeyRequest\nActivateKeySigningKeyResponse\nActivateNetworkSiteRequest\nActivateNetworkSiteResponse\nActivatePipelineInput\nActivateReadSetFilter\nActivateReadSetJobItem\nActivateReadSetSourceItem\nActivateTypeInput\nActivateTypeOutput\nActivateUserRequest\nActivateUserResponse\nActivated\nActivatedRule\nActivatedRules\nActivation\nActivationCode\nActivationId\nActivationKey\nActivationList\nActivationOverrideBehavior\nActivationState\nActivationStatus\nActivationUrl\nActive\nActiveAssignments\nActiveAvailabilityZoneCount\nActiveChannelPipeline\nActiveContext\nActiveContextTimeToLive\nActiveDate\nActiveDeviceCount\nActiveDirectory\nActiveDirectoryBackupAttributes\nActiveDirectoryComputerAttribute\nActiveDirectoryConfiguration\nActiveDirectoryError\nActiveDirectoryId\nActiveDirectoryIdentityProvider\nActiveDirectoryName\nActiveDirectoryStatus\nActiveGameSessionCount\nActiveIAMPolicyAssignment\nActiveInput\nActiveInputAttachmentName\nActiveInputSwitchActionName\nActiveInstance\nActiveInstanceRefreshNotFoundFault\nActiveInstances\nActiveMQBrokerParameters\nActiveModelArn\nActiveModelVersion\nActiveModelVersionArn\nActiveMotionGraphicsActionName\nActiveMotionGraphicsUri\nActiveNodes\nActiveOperationArn\nActiveServerProcessCount\nActiveServicesCount\nActiveSlotsByChannel\nActiveSpeakerOnlyConfiguration\nActiveSpeakerPosition\nActiveStatementsExceededException\nActiveSubscribedDomains\nActiveTracing\nActiveTrustedKeyGroups\nActiveTrustedSigners\nActiveVersion\nActiveViolation\nActiveWatermarkProcess\nActivities\nActivitiesResponse\nActivitiesType\nActivity\nActivityDoesNotExist\nActivityFailedEventDetails\nActivityId\nActivityIds\nActivityLimitExceeded\nActivityListItem\nActivityMetrics\nActivityResponse\nActivityScheduleFailedEventDetails\nActivityScheduledEventDetails\nActivityStartedEventDetails\nActivityStatus\nActivityStreamEngineNativeAuditFieldsIncluded\nActivityStreamKinesisStreamName\nActivityStreamKmsKeyId\nActivityStreamMode\nActivityStreamPolicyStatus\nActivityStreamStatus\nActivitySucceededEventDetails\nActivityTask\nActivityTaskCancelRequestedEventAttributes\nActivityTaskCanceledEventAttributes\nActivityTaskCompletedEventAttributes\nActivityTaskFailedEventAttributes\nActivityTaskScheduledEventAttributes\nActivityTaskStartedEventAttributes\nActivityTaskStatus\nActivityTaskTimedOutEventAttributes\nActivityTimedOutEventDetails\nActivityType\nActivityTypeConfiguration\nActivityTypeDetail\nActivityTypeInfo\nActivityTypeInfos\nActivityTypes\nActivityWorkerLimitExceeded\nActorDoesNotExistException\nActual\nActualAmount\nActualBlockHourlyPrice\nActualEndTime\nActualFirewallEndpoint\nActualFirewallSubnetId\nActualFirewallSubnetRoutes\nActualIncrementalBackupSizeInMegaBytes\nActualInternetGatewayRoutes\nActualProperties\nActualSpend\nActualStartTime\nActualValue\nActuator\nAdAvailOffset\nAdBreak\nAdBreakMetadata\nAdBreaks\nAdDecisionServerUrl\nAdHocFilteringOption\nAdMarkerHls\nAdMarkerPassthrough\nAdMarkers\nAdMarkupType\nAdSegmentUrlPrefix\nAdTriggers\nAdaptiveQuantization\nAdd\nAddAllocationResourceTags\nAddAllowedPrincipals\nAddApplicationCloudWatchLoggingOptionRequest\nAddApplicationCloudWatchLoggingOptionResponse\nAddApplicationInputProcessingConfigurationRequest\nAddApplicationInputProcessingConfigurationResponse\nAddApplicationInputRequest\nAddApplicationInputResponse\nAddApplicationOutputRequest\nAddApplicationOutputResponse\nAddApplicationReferenceDataSourceRequest\nAddApplicationReferenceDataSourceResponse\nAddApplicationVpcConfigurationRequest\nAddApplicationVpcConfigurationResponse\nAddArguments\nAddAssociationRequest\nAddAssociationResponse\nAddAttachmentsToSetRequest\nAddAttachmentsToSetResponse\nAddAttributesActivity\nAddAttributesToFindingsRequest\nAddAttributesToFindingsResponse\nAddAvailabilityZonesInput\nAddAvailabilityZonesOutput\nAddBridgeFlowSourceRequest\nAddBridgeNetworkOutputRequest\nAddBridgeNetworkSourceRequest\nAddBridgeOutputRequest\nAddBridgeOutputsRequest\nAddBridgeOutputsResponse\nAddBridgeSourceRequest\nAddBridgeSourcesRequest\nAddBridgeSourcesResponse\nAddCacheInput\nAddCacheOutput\nAddClientIDToOpenIDConnectProviderRequest\nAddColumnName\nAddCommunicationToCaseRequest\nAddCommunicationToCaseResponse\nAddCustomAttributesRequest\nAddCustomRoutingEndpointsRequest\nAddCustomRoutingEndpointsResponse\nAddDraftAppVersionResourceMappingsRequest\nAddDraftAppVersionResourceMappingsResponse\nAddEgressGatewayBridgeRequest\nAddEndpointsRequest\nAddEndpointsResponse\nAddEntries\nAddFacetToObject\nAddFacetToObjectRequest\nAddFlowMediaStreamsRequest\nAddFlowMediaStreamsResponse\nAddFlowOutputs420Exception\nAddFlowOutputsRequest\nAddFlowOutputsResponse\nAddFlowSourcesRequest\nAddFlowSourcesResponse\nAddFlowVpcInterfacesRequest\nAddFlowVpcInterfacesResponse\nAddGatewayLoadBalancerArns\nAddGwMetadata\nAddHeaderAction\nAddIamRoles\nAddIdleTimeBetweenReads\nAddInId\nAddIngressGatewayBridgeRequest\nAddIns\nAddInstanceFleetInput\nAddInstanceFleetOutput\nAddInstanceGroupsInput\nAddInstanceGroupsOutput\nAddIpRoutesRequest\nAddIpamOperatingRegion\nAddJobFlowStepsInput\nAddJobFlowStepsOutput\nAddLFTagsToResourceRequest\nAddLFTagsToResourceResponse\nAddLayerVersionPermissionRequest\nAddLayerVersionPermissionResponse\nAddLicenseSpecifications\nAddListenerCertificatesInput\nAddListenerCertificatesOutput\nAddMaintenance\nAddMediaStreamRequest\nAddNetworkLoadBalancerArns\nAddNetworkServices\nAddNotificationChannelRequest\nAddNotificationChannelResponse\nAddNotificationChannelsRequest\nAddNotificationChannelsResponse\nAddObject\nAddObjectInput\nAddOn\nAddOnRequest\nAddOperatingRegions\nAddOutputRequest\nAddPermissionInput\nAddPermissionRequest\nAddPermissionResponse\nAddPrefixListEntry\nAddProfileKeyRequest\nAddProfileKeyResponse\nAddProfilePermissionRequest\nAddProfilePermissionResponse\nAddPublicKeys\nAddRecordTimestamp\nAddRegionAction\nAddRegionRequest\nAddReplicaRegions\nAddResourcePermissionsRequest\nAddResourcePermissionsResponse\nAddRoleToDBClusterMessage\nAddRoleToDBInstanceMessage\nAddRoleToInstanceProfileRequest\nAddRouteTableIds\nAddSecurityGroupIds\nAddSourceIdentifierToSubscriptionMessage\nAddSourceIdentifierToSubscriptionResult\nAddStorageSystemRequest\nAddStorageSystemResponse\nAddSubnetArns\nAddSubnetIds\nAddSubnets\nAddSupplementalLogging\nAddSupportedIpAddressTypes\nAddTags\nAddTagsInput\nAddTagsOutput\nAddTagsRequest\nAddTagsToCertificateRequest\nAddTagsToOnPremisesInstancesInput\nAddTagsToResourceInput\nAddTagsToResourceMessage\nAddTagsToResourceOutput\nAddTagsToResourceRequest\nAddTagsToResourceResponse\nAddTagsToStreamInput\nAddTagsToVaultInput\nAddTexture\nAddThingToBillingGroupRequest\nAddThingToThingGroupRequest\nAddThingsToThingGroupParams\nAddTrailingPaddingCharacter\nAddTransitGatewayCidrBlocks\nAddUploadBufferInput\nAddUploadBufferOutput\nAddUserToGroupRequest\nAddWorkingStorageInput\nAddWorkingStorageOutput\nAddWorkloadRequest\nAddWorkloadResponse\nAddedDateTime\nAddedPrincipal\nAddedPrincipals\nAddedToClusterTime\nAdditionalAccounts\nAdditionalArchivedLogDestId\nAdditionalArtifacts\nAdditionalAttribute\nAdditionalAttributes\nAdditionalAuditContext\nAdditionalAuthTypes\nAdditionalAuthenticationProvider\nAdditionalAuthenticationProviders\nAdditionalBootstrapServers\nAdditionalCodeRepositories\nAdditionalCodeRepositoryEquals\nAdditionalConfigs\nAdditionalConfiguration\nAdditionalConstraints\nAdditionalContactEmailAddresses\nAdditionalDashboardIds\nAdditionalDataPending\nAdditionalDataSources\nAdditionalDataset\nAdditionalDatasets\nAdditionalDeltaOptions\nAdditionalDetail\nAdditionalDetailType\nAdditionalDetails\nAdditionalHudiOptions\nAdditionalInferenceSpecificationDefinition\nAdditionalInferenceSpecifications\nAdditionalInferenceSpecificationsToAdd\nAdditionalInfo\nAdditionalInformation\nAdditionalInstanceConfiguration\nAdditionalLanguageCodes\nAdditionalLimit\nAdditionalLimits\nAdditionalLocations\nAdditionalManifests\nAdditionalMasterSecurityGroups\nAdditionalMetadata\nAdditionalMetrics\nAdditionalOccurrences\nAdditionalOptions\nAdditionalPlanOptionsMap\nAdditionalPlayerCount\nAdditionalRegions\nAdditionalResources\nAdditionalResponseAttributes\nAdditionalResponseFields\nAdditionalResultAttribute\nAdditionalResultAttributeValue\nAdditionalRoutesAvailable\nAdditionalRunOptions\nAdditionalSchemaElements\nAdditionalSearchKey\nAdditionalSearchKeys\nAdditionalSlaveSecurityGroups\nAdditionalStagingLabelsToDownload\nAdditionalStatistics\nAdditionalTreatments\nAdditionalVersionWeights\nAddon\nAddonDetails\nAddonHealth\nAddonInfo\nAddonIssue\nAddonStatus\nAddonVersion\nAddonVersionInfo\nAddress\nAddress1\nAddress2\nAddress3\nAddress4\nAddressAllocationIds\nAddressAttribute\nAddressBook\nAddressBookArn\nAddressBookData\nAddressBooks\nAddressConfiguration\nAddressCount\nAddressDefinition\nAddressExternalId\nAddressFamily\nAddressField\nAddressFields\nAddressId\nAddressLine1\nAddressLine2\nAddressLine3\nAddressNumber\nAddressTransfer\nAddressTransferStatus\nAddressTransfers\nAddressType\nAddresses\nAddressingType\nAdiFilename\nAdjacentParentShardId\nAdjacentShardToMerge\nAdjustable\nAdjustment\nAdjustmentType\nAdjustmentTypes\nAdjustments\nAdmin\nAdminAccount\nAdminAccountId\nAdminAccountSummary\nAdminAccounts\nAdminAddUserToGroupRequest\nAdminConfirmSignUpRequest\nAdminContact\nAdminCreateUserConfig\nAdminCreateUserConfigType\nAdminCreateUserRequest\nAdminCreateUserResponse\nAdminDeleteUserAttributesRequest\nAdminDeleteUserRequest\nAdminDetectorId\nAdminDisableProviderForUserRequest\nAdminDisableUserRequest\nAdminEnableUserRequest\nAdminForgetDeviceRequest\nAdminGetDeviceRequest\nAdminGetDeviceResponse\nAdminGetUserRequest\nAdminGetUserResponse\nAdminGroup\nAdminInitiateAuthRequest\nAdminInitiateAuthResponse\nAdminLinkProviderForUserRequest\nAdminListDevicesRequest\nAdminListDevicesResponse\nAdminListGroupsForUserRequest\nAdminListGroupsForUserResponse\nAdminListUserAuthEventsRequest\nAdminListUserAuthEventsResponse\nAdminPassword\nAdminPrivacy\nAdminRemoveUserFromGroupRequest\nAdminResetUserPasswordRequest\nAdminRespondToAuthChallengeRequest\nAdminRespondToAuthChallengeResponse\nAdminScope\nAdminSetUserMFAPreferenceRequest\nAdminSetUserPasswordRequest\nAdminSetUserSettingsRequest\nAdminStatus\nAdminUpdateAuthEventFeedbackRequest\nAdminUpdateDeviceStatusRequest\nAdminUpdateUserAttributesRequest\nAdminUserGlobalSignOutRequest\nAdminUserList\nAdminUsername\nAdministrationRoleARN\nAdministrativeAction\nAdministrativeActionFailureDetails\nAdministrativeActionType\nAdministrativeActions\nAdministrator\nAdministratorId\nAdministrators\nAdsOnDeliveryRestrictions\nAdvancedBackupSetting\nAdvancedBackupSettings\nAdvancedCostOptimizationMetrics\nAdvancedDataProtectionMetrics\nAdvancedEventSelector\nAdvancedEventSelectors\nAdvancedFieldSelector\nAdvancedInputFilter\nAdvancedInputFilterSettings\nAdvancedOptions\nAdvancedOptionsStatus\nAdvancedRecognitionSetting\nAdvancedSecurityEnabled\nAdvancedSecurityMode\nAdvancedSecurityOptions\nAdvancedSecurityOptionsInput\nAdvancedSecurityOptionsStatus\nAdvertiseByoipCidrRequest\nAdvertiseByoipCidrResponse\nAdvertiseByoipCidrResult\nAdvisoryIds\nAfdSignaling\nAffectedEntity\nAffectedResource\nAffectedResources\nAffectedSensorCount\nAffectedSubnets\nAffiliated\nAffinity\nAfter\nAfterConnectScript\nAfterContactWorkTimeLimit\nAfterCreationDate\nAfterFragmentNumber\nAgeRange\nAgentAlreadyRunningAssessment\nAgentArn\nAgentArns\nAgentAvailabilityTimer\nAgentConfig\nAgentConfiguration\nAgentConfigurationStatus\nAgentContactReference\nAgentContactState\nAgentCount\nAgentDetails\nAgentFilter\nAgentInfo\nAgentInstallerUrl\nAgentListEntry\nAgentMetrics\nAgentName\nAgentNetworkInfo\nAgentOrchestrationConfig\nAgentPreview\nAgentStatus\nAgentStatusARN\nAgentStatusId\nAgentStatusReference\nAgentStatusSummary\nAgentStatusSummaryList\nAgentStatusTypes\nAgentTurnResult\nAgentTurnSpecification\nAgentVersion\nAgentVersions\nAgentlessDialerConfig\nAgents\nAgentsAlreadyRunningAssessmentException\nAggFunc\nAggregate\nAggregateBy\nAggregateColumn\nAggregateComplianceByConfigRule\nAggregateComplianceByConfigRules\nAggregateComplianceByConformancePack\nAggregateComplianceByConformancePacks\nAggregateComplianceCount\nAggregateComplianceCounts\nAggregateConformancePackCompliance\nAggregateConformancePackComplianceCount\nAggregateConformancePackComplianceFilters\nAggregateConformancePackComplianceSummaries\nAggregateConformancePackComplianceSummary\nAggregateConformancePackComplianceSummaryFilters\nAggregateEvaluationResult\nAggregateEvaluationResults\nAggregateKeyType\nAggregateOperation\nAggregateResourceIdentifier\nAggregateStatus\nAggregateValue\nAggregatedLogOddsMetric\nAggregatedProfileTime\nAggregatedSourceStatus\nAggregatedSourceStatusList\nAggregatedUtterancesFilter\nAggregatedUtterancesSortBy\nAggregatedUtterancesSummary\nAggregatedValue\nAggregatedVariablesImpactExplanation\nAggregatedVariablesImportanceMetrics\nAggregates\nAggregation\nAggregationAuthorization\nAggregationAuthorizationArn\nAggregationAuthorizations\nAggregationConfig\nAggregationConstraint\nAggregationEnabled\nAggregationFunction\nAggregationFunctionParameters\nAggregationSortConfiguration\nAggregationSortConfigurations\nAggregationStatistic\nAggregationType\nAggregationVisibility\nAggregations\nAggregator\nAggregatorType\nAggregators\nAggressiveMode\nAggs\nAgreement\nAgreementId\nAgreements\nAiffSettings\nAirflowConfigurationOptions\nAirflowVersion\nAlarm\nAlarmARN\nAlarmAction\nAlarmActions\nAlarmArn\nAlarmCapabilities\nAlarmConfiguration\nAlarmConfigurationUpdatedTimestamp\nAlarmDescription\nAlarmEventActions\nAlarmHistoryItem\nAlarmHistoryItems\nAlarmIdentifier\nAlarmModelSummary\nAlarmModelVersionSummary\nAlarmName\nAlarmNamePrefix\nAlarmNames\nAlarmNotification\nAlarmRecommendation\nAlarmRoleArn\nAlarmRule\nAlarmSpecification\nAlarmState\nAlarmStateInformation\nAlarmSummary\nAlarmType\nAlarmTypes\nAlarms\nAlarmsLimitExceededException\nAlbumArt\nAlbumArtFormat\nAlert\nAlertArn\nAlertCode\nAlertDescription\nAlertFilters\nAlertManagerDefinitionDescription\nAlertManagerDefinitionStatus\nAlertMessage\nAlertName\nAlertSensitivityThreshold\nAlertStatus\nAlertSummary\nAlertSummaryList\nAlertTarget\nAlertType\nAlexaForBusinessMetadata\nAlexaForBusinessRoomArn\nAlexaSkillIds\nAlexaSkillStatus\nAlfrescoConfiguration\nAlgorithm\nAlgorithmArn\nAlgorithmControl\nAlgorithmDescription\nAlgorithmImage\nAlgorithmName\nAlgorithmSpecification\nAlgorithmStatus\nAlgorithmStatusDetails\nAlgorithmStatusItem\nAlgorithmSummary\nAlgorithmSummaryList\nAlgorithmValidationProfile\nAlgorithmValidationSpecification\nAlgorithmicStemming\nAlgorithmsConfig\nAlias\nAliasArn\nAliasAttributes\nAliasConfiguration\nAliasExistsException\nAliasICPRecordal\nAliasICPRecordals\nAliasId\nAliasIds\nAliasListEntry\nAliasName\nAliasPrefix\nAliasRoutingConfiguration\nAliasTarget\nAliased\nAliases\nAliasesToAdd\nAliasesToDelete\nAlignedEndTime\nAlignedStartTime\nAlignment\nAll\nAllAccountsEnabled\nAllAvailabilityZones\nAllAwsRegions\nAllColumnsRequested\nAllDataPointsVisibility\nAllOrganizationalUnitsEnabled\nAllParameters\nAllPolicyTypesEnabled\nAllQueryArguments\nAllRegions\nAllRegionsEnabled\nAllRowsWildcard\nAllSheets\nAllocateAddressRequest\nAllocateAddressResult\nAllocateConnectionOnInterconnectRequest\nAllocateHostedConnectionRequest\nAllocateHostsRequest\nAllocateHostsResult\nAllocateIpamPoolCidrRequest\nAllocateIpamPoolCidrResult\nAllocatePrivateVirtualInterfaceRequest\nAllocatePublicVirtualInterfaceRequest\nAllocateStaticIpRequest\nAllocateStaticIpResult\nAllocateTransitVirtualInterfaceRequest\nAllocateTransitVirtualInterfaceResult\nAllocatedCapacity\nAllocatedDpus\nAllocatedProvisionedConcurrentExecutions\nAllocatedStorage\nAllocatedUsageQuantity\nAllocationDefaultNetmaskLength\nAllocationId\nAllocationIdNotFoundException\nAllocationIds\nAllocationMaxNetmaskLength\nAllocationMinNetmaskLength\nAllocationResourceTags\nAllocationStrategy\nAllocationTime\nAllocationType\nAllow\nAllowAction\nAllowActions\nAllowAdminCreateUserOnly\nAllowAllTrafficToEndpoint\nAllowAssociation\nAllowCancelResize\nAllowCheckIn\nAllowClassicFlow\nAllowCookies\nAllowCopyImage\nAllowCredentials\nAllowCustomRoutingTrafficRequest\nAllowDataLoss\nAllowDeferredExecution\nAllowDenyList\nAllowDnsResolutionFromRemoteVpc\nAllowEarlyCheckIn\nAllowEgressFromLocalClassicLinkToRemoteVpc\nAllowEgressFromLocalVpcToRemoteClassicLink\nAllowEngineModeChange\nAllowExternalDataFiltering\nAllowForceDelete\nAllowFullTableExternalDataAccess\nAllowHeaders\nAllowListCriteria\nAllowListStatus\nAllowListSummary\nAllowMajorVersionUpdate\nAllowMajorVersionUpgrade\nAllowMessages\nAllowMethods\nAllowNonRestoredState\nAllowNotifications\nAllowOrigins\nAllowProfileCreation\nAllowPubliclyAccessibleConsumers\nAllowQuotedRecordDelimiter\nAllowReassignment\nAllowReassociation\nAllowReferers\nAllowResources\nAllowSelectNestedTables\nAllowSelfManagement\nAllowSingleColumn\nAllowSsh\nAllowSudo\nAllowUnassociatedTargets\nAllowUnauthenticatedIdentities\nAllowUpdate\nAllowUsersToChangePassword\nAllowVersionUpgrade\nAllowed\nAllowedAccessControlTags\nAllowedAggregations\nAllowedAllVPCs\nAllowedAttempts\nAllowedByOrganizations\nAllowedByPermissionsBoundary\nAllowedDomains\nAllowedFeatures\nAllowedGroupsColumnName\nAllowedHeaders\nAllowedIPRange\nAllowedInputTypes\nAllowedInstanceTypes\nAllowedIps\nAllowedLocations\nAllowedMethods\nAllowedMonitorCapabilities\nAllowedNodeTypeModificationsMessage\nAllowedOAuthFlows\nAllowedOAuthFlowsUserPoolClient\nAllowedOAuthScopes\nAllowedOperations\nAllowedOrigins\nAllowedPattern\nAllowedPrincipal\nAllowedPrincipals\nAllowedPublishers\nAllowedRenditionSize\nAllowedRenditions\nAllowedStatistics\nAllowedTargets\nAllowedVPCs\nAllowedValue\nAllowedValues\nAllowsMultipleInstanceTypes\nAllowsPublicReadAccess\nAllowsPublicWriteAccess\nAllowsVpcAndNonVpcInstanceMemberships\nAlphaBehavior\nAlphabet\nAlpnPolicy\nAlreadyExistsException\nAlreadyExistsFault\nAlreadyInOrganizationException\nAlreadyStreamedException\nAlternateBandColorsVisibility\nAlternateBandEvenColor\nAlternateBandOddColor\nAlternateContact\nAlternateContactType\nAlternateDataSourceParameters\nAlternateIdentifier\nAlternateKey\nAlternatePathHint\nAlternatePathHints\nAlternateSoftwareMetadata\nAlternateSoftwares\nAlternateTransferFunctionSei\nAlternative\nAlternativeTransferFunction\nAlternatives\nAmazonCodeGuruProfiler\nAmazonCodeGuruProfilerIntegration\nAmazonElasticsearchParameters\nAmazonForecastRoleArn\nAmazonId\nAmazonIdEventTopic\nAmazonManagedKafkaEventSourceConfig\nAmazonOpenSearchParameters\nAmazonOpenSearchServerlessBufferingHints\nAmazonOpenSearchServerlessDestinationConfiguration\nAmazonOpenSearchServerlessDestinationDescription\nAmazonOpenSearchServerlessDestinationUpdate\nAmazonOpenSearchServerlessRetryOptions\nAmazonProvidedIpv6CidrBlock\nAmazonRedshiftAdvancedOption\nAmazonRedshiftNodeData\nAmazonRedshiftSource\nAmazonRedshiftTarget\nAmazonSideAsn\nAmazonTranscribeCallAnalyticsProcessorConfiguration\nAmazonTranscribeProcessorConfiguration\nAmazonopensearchserviceBufferingHints\nAmazonopensearchserviceDestinationConfiguration\nAmazonopensearchserviceDestinationDescription\nAmazonopensearchserviceDestinationUpdate\nAmazonopensearchserviceRetryOptions\nAmbiguousRoleResolution\nAmdSevSnp\nAmexCardSecurityCodeVersion1\nAmexCardSecurityCodeVersion2\nAmi\nAmiAggregation\nAmiAggregationResponse\nAmiAssociationScope\nAmiDistributionConfiguration\nAmiId\nAmiLaunchIndex\nAmiVersion\nAmortizedCommitment\nAmortizedRecurringCommitment\nAmortizedRecurringFee\nAmortizedUpfrontCommitment\nAmortizedUpfrontFee\nAmount\nAmountInUsd\nAmplifyFeatureFlags\nAmplifyMetaConfig\nAmplitude\nAmplitudeConnectorProfileCredentials\nAmplitudeSourceProperties\nAmznClientToken\nAnalyses\nAnalysis\nAnalysisAclRule\nAnalysisArn\nAnalysisComponent\nAnalysisDefaults\nAnalysisDefinition\nAnalysisEndTime\nAnalysisError\nAnalysisFindings\nAnalysisId\nAnalysisLoadBalancerListener\nAnalysisLoadBalancerTarget\nAnalysisOptions\nAnalysisPacketHeader\nAnalysisParameter\nAnalysisReport\nAnalysisReportId\nAnalysisReportSummary\nAnalysisReports\nAnalysisResult\nAnalysisResultLocation\nAnalysisRouteTableRoute\nAnalysisRule\nAnalysisRuleAggregation\nAnalysisRuleCustom\nAnalysisRuleList\nAnalysisSchema\nAnalysisScheme\nAnalysisSchemeLanguage\nAnalysisSchemeName\nAnalysisSchemeNames\nAnalysisSchemeStatus\nAnalysisSchemes\nAnalysisSearchFilter\nAnalysisSecurityGroupRule\nAnalysisSourceEntity\nAnalysisSourceTemplate\nAnalysisStartTime\nAnalysisStartTimeBegin\nAnalysisStartTimeEnd\nAnalysisStatus\nAnalysisSummary\nAnalysisSummaryList\nAnalysisTemplate\nAnalysisTemplateSummary\nAnalysisTypes\nAnalytics\nAnalyticsAndOperator\nAnalyticsBinBySpecification\nAnalyticsBinKey\nAnalyticsConfiguration\nAnalyticsConfigurationList\nAnalyticsConfigurationType\nAnalyticsEndpointId\nAnalyticsExportDestination\nAnalyticsIntentFilter\nAnalyticsIntentGroupByKey\nAnalyticsIntentGroupBySpecification\nAnalyticsIntentMetric\nAnalyticsIntentMetricResult\nAnalyticsIntentNodeSummary\nAnalyticsIntentResult\nAnalyticsIntentStageFilter\nAnalyticsIntentStageGroupByKey\nAnalyticsIntentStageGroupBySpecification\nAnalyticsIntentStageMetric\nAnalyticsIntentStageMetricResult\nAnalyticsIntentStageResult\nAnalyticsMetadata\nAnalyticsMetadataType\nAnalyticsPathFilter\nAnalyticsS3BucketDestination\nAnalyticsSessionFilter\nAnalyticsSessionGroupByKey\nAnalyticsSessionGroupBySpecification\nAnalyticsSessionMetric\nAnalyticsSessionMetricResult\nAnalyticsSessionResult\nAnalyticsUtteranceAttribute\nAnalyticsUtteranceAttributeResult\nAnalyticsUtteranceFilter\nAnalyticsUtteranceGroupByKey\nAnalyticsUtteranceGroupBySpecification\nAnalyticsUtteranceMetric\nAnalyticsUtteranceMetricResult\nAnalyticsUtteranceResult\nAnalyzeDocumentModelVersion\nAnalyzeDocumentRequest\nAnalyzeDocumentResponse\nAnalyzeExpenseModelVersion\nAnalyzeExpenseRequest\nAnalyzeExpenseResponse\nAnalyzeIDDetections\nAnalyzeIDModelVersion\nAnalyzeIDRequest\nAnalyzeIDResponse\nAnalyzeLendingModelVersion\nAnalyzedEniCount\nAnalyzedResource\nAnalyzedResourceCount\nAnalyzedResourceSummary\nAnalyzedTime\nAnalyzerSummary\nAncestorIds\nAnchor\nAnchorDateConfiguration\nAnchorOption\nAncillarySourceSettings\nAnd\nAndAllFilters\nAndConditions\nAndStatement\nAndroid\nAndroidPushNotificationTemplate\nAnnotation\nAnnotationConsolidationConfig\nAnnotationConsolidationLambdaArn\nAnnotationDataS3Uri\nAnnotationImportItemDetail\nAnnotationImportItemSource\nAnnotationImportJobItem\nAnnotationStoreItem\nAnnotationStoreVersionItem\nAnnotationValue\nAnnotations\nAnnouncementArn\nAnnouncementDirection\nAnomalies\nAnomalousLogGroup\nAnomalousLogGroups\nAnomalousService\nAnomaly\nAnomalyClass\nAnomalyDateInterval\nAnomalyDetector\nAnomalyDetectorArn\nAnomalyDetectorConfig\nAnomalyDetectorConfigSummary\nAnomalyDetectorConfiguration\nAnomalyDetectorDataQualityMetric\nAnomalyDetectorDataQualityMetricList\nAnomalyDetectorDescription\nAnomalyDetectorFrequency\nAnomalyDetectorName\nAnomalyDetectorSummary\nAnomalyDetectorSummaryList\nAnomalyDetectorTypes\nAnomalyDetectors\nAnomalyEndDate\nAnomalyGroup\nAnomalyGroupId\nAnomalyGroupScore\nAnomalyGroupStatistics\nAnomalyGroupSummary\nAnomalyGroupSummaryList\nAnomalyGroupTimeSeries\nAnomalyGroupTimeSeriesFeedback\nAnomalyId\nAnomalyInstance\nAnomalyMask\nAnomalyMonitor\nAnomalyMonitors\nAnomalyReportedTimeRange\nAnomalyResource\nAnomalyResources\nAnomalyScore\nAnomalySourceDetails\nAnomalySourceMetadata\nAnomalyStartDate\nAnomalySubscription\nAnomalySubscriptions\nAnomalyTimeRange\nAnonymousAuthDisableDate\nAnonymousAuthEnabled\nAnonymousUserArn\nAnonymousUserDashboardEmbeddingConfiguration\nAnonymousUserDashboardVisualEmbeddingConfiguration\nAnonymousUserEmbeddingExperienceConfiguration\nAnonymousUserQSearchBarEmbeddingConfiguration\nAnonymousUserSnapshotJobResult\nAnonymousUsers\nAnswer\nAnswerKey\nAnswerMachineDetectionConfig\nAnswerSummaries\nAnswerSummary\nAnswers\nAntennaDemodDecodeDetails\nAntennaDownlinkConfig\nAntennaDownlinkDemodDecodeConfig\nAntennaUplinkConfig\nAntiAlias\nAntipatternReportResult\nAntipatternSeveritySummary\nAny\nAnywhereConfiguration\nApId\nApacheKafkaCluster\nApacheKafkaClusterDescription\nApi\nApiAssociation\nApiCache\nApiCallDetails\nApiDescription\nApiDestination\nApiDestinationArn\nApiDestinationState\nApiDestinations\nApiEndpoint\nApiGatewayApiAsset\nApiGatewayDomainName\nApiGatewayId\nApiGatewayManaged\nApiGatewayProxy\nApiGatewayProxyConfig\nApiGatewayProxyInput\nApiGatewayProxySummary\nApiId\nApiKey\nApiKeyAuthParameters\nApiKeyCredential\nApiKeyCredentials\nApiKeyFilter\nApiKeyIds\nApiKeyLimitExceededException\nApiKeyName\nApiKeyRequired\nApiKeyRestrictions\nApiKeySelectionExpression\nApiKeySource\nApiKeyValidityOutOfBoundsException\nApiKeyValue\nApiKeys\nApiLimitExceededException\nApiMapping\nApiMappingId\nApiMappingKey\nApiMappingSelectionExpression\nApiName\nApiPassthrough\nApiSpecificationDownloadUrl\nApiSpecificationDownloadUrlExpiresAt\nApiSpecificationMd5Hash\nApiSpecificationUploadUrl\nApiSpecificationUploadUrlExpiresAt\nApiStage\nApp\nAppArn\nAppAssessment\nAppAssessmentSummary\nAppAuthorization\nAppAuthorizationSummary\nAppBlock\nAppBlockArn\nAppBlockBuilder\nAppBlockBuilderAppBlockAssociation\nAppBlockBuilderAppBlockAssociations\nAppBlockBuilderErrors\nAppBlockBuilderName\nAppBlockBuilderStateChangeReason\nAppBlockBuilders\nAppBlockErrors\nAppBlocks\nAppBoundaryKey\nAppBundle\nAppBundleSummary\nAppComponent\nAppComponentCompliance\nAppCookieStickinessPolicies\nAppCookieStickinessPolicy\nAppDetails\nAppEui\nAppFlowConfig\nAppId\nAppIdClientRegex\nAppIds\nAppImageConfigArn\nAppImageConfigDetails\nAppImageConfigName\nAppImageConfigs\nAppInputSource\nAppInstance\nAppInstanceAdmin\nAppInstanceAdminArn\nAppInstanceAdminSummary\nAppInstanceAdmins\nAppInstanceArn\nAppInstanceBot\nAppInstanceBotArn\nAppInstanceBotSummary\nAppInstanceBots\nAppInstanceDataType\nAppInstanceRetentionSettings\nAppInstanceStreamingConfiguration\nAppInstanceStreamingConfigurations\nAppInstanceSummary\nAppInstanceUser\nAppInstanceUserArn\nAppInstanceUserEndpoint\nAppInstanceUserEndpointSummary\nAppInstanceUserEndpoints\nAppInstanceUserId\nAppInstanceUserMembershipSummary\nAppInstanceUserSummary\nAppInstanceUsers\nAppInstances\nAppIntegrationsConfiguration\nAppKey\nAppLogsEnabled\nAppManaged\nAppMonitor\nAppMonitorConfiguration\nAppMonitorDetails\nAppMonitorName\nAppMonitorSummaries\nAppMonitorSummary\nAppName\nAppNetworkAccessType\nAppPackageName\nAppRegistryArn\nAppRegistryConfiguration\nAppSKey\nAppSecurityGroupManagement\nAppServerPrivateKey\nAppSource\nAppSpecContent\nAppSpecification\nAppSummary\nAppSyncRuntime\nAppTitle\nAppType\nAppTypeEquals\nAppUnitError\nAppValidationConfiguration\nAppValidationOutput\nAppVersion\nAppVersionCode\nAppVersionSummary\nAppVisibility\nAppendAccessString\nAppendSourcePath\nAppflowIntegration\nAppflowIntegrationWorkflowAttributes\nAppflowIntegrationWorkflowMetrics\nAppflowIntegrationWorkflowStep\nApplianceModeSupport\nApplicability\nApplication\nApplicationARN\nApplicationAggregatedStatus\nApplicationAlreadyExistsException\nApplicationArn\nApplicationArns\nApplicationCode\nApplicationCodeConfiguration\nApplicationCodeConfigurationDescription\nApplicationCodeConfigurationUpdate\nApplicationCodeUpdate\nApplicationComponent\nApplicationComponentDetail\nApplicationComponentList\nApplicationComponentStatusSummary\nApplicationComponentStrategy\nApplicationComponentSummary\nApplicationConfig\nApplicationConfiguration\nApplicationConfigurationDescription\nApplicationConfigurationUpdate\nApplicationCredential\nApplicationDPUSizes\nApplicationDateRangeKpiResponse\nApplicationDependencySummary\nApplicationDescription\nApplicationDescriptionMessage\nApplicationDescriptionsMessage\nApplicationDetail\nApplicationDoesNotExistException\nApplicationDomain\nApplicationFleetAssociation\nApplicationFleetAssociations\nApplicationId\nApplicationIdentifier\nApplicationIds\nApplicationInfo\nApplicationInfoList\nApplicationInstance\nApplicationInstanceId\nApplicationInstanceIdToReplace\nApplicationInstances\nApplicationIntegrationURL\nApplicationLayerAutomaticResponseConfiguration\nApplicationLimitExceededException\nApplicationMaintenanceConfigurationDescription\nApplicationMaintenanceConfigurationUpdate\nApplicationMaintenanceWindowEndTime\nApplicationMaintenanceWindowStartTime\nApplicationMaintenanceWindowStartTimeUpdate\nApplicationMetrics\nApplicationMode\nApplicationName\nApplicationNameRequiredException\nApplicationNames\nApplicationPermissions\nApplicationPolicies\nApplicationPolicyStatement\nApplicationPreferences\nApplicationQuota\nApplicationResourceLifecycleConfig\nApplicationResourceLifecycleDescriptionMessage\nApplicationResponse\nApplicationRestoreConfiguration\nApplicationRestoreConfigurationDescription\nApplicationRestoreType\nApplicationRuntimeId\nApplicationServerPublicKey\nApplicationSettings\nApplicationSettingsJourneyLimits\nApplicationSettingsResource\nApplicationSettingsResponse\nApplicationSnapshotConfiguration\nApplicationSnapshotConfigurationDescription\nApplicationSnapshotConfigurationUpdate\nApplicationSource\nApplicationSourceConfig\nApplicationSources\nApplicationState\nApplicationStateList\nApplicationStatus\nApplicationSuccessFeedbackRoleArn\nApplicationSummaries\nApplicationSummary\nApplicationSummaryList\nApplicationTransactionCounter\nApplicationType\nApplicationUpdate\nApplicationVersion\nApplicationVersionArn\nApplicationVersionDescription\nApplicationVersionDescriptionMessage\nApplicationVersionDescriptionsMessage\nApplicationVersionDetail\nApplicationVersionId\nApplicationVersionLifecycleConfig\nApplicationVersionQuota\nApplicationVersionRolledBackFrom\nApplicationVersionRolledBackTo\nApplicationVersionSummaries\nApplicationVersionSummary\nApplicationVersionUpdatedFrom\nApplicationVersions\nApplications\nApplicationsResponse\nAppliedColorSpaceConversion\nAppliedDdls\nAppliedDeletes\nAppliedExtension\nAppliedExtensions\nAppliedInserts\nAppliedSchemaArn\nAppliedSettings\nAppliedTerminologies\nAppliedTerminology\nAppliedUpdates\nAppliedValue\nApplyAction\nApplyArchiveRuleRequest\nApplyEnvironmentManagedActionRequest\nApplyEnvironmentManagedActionResult\nApplyFontColor\nApplyImmediately\nApplyMapping\nApplyMethod\nApplyOn\nApplyOnlyAtCronInterval\nApplyPendingMaintenance\nApplyPendingMaintenanceActionMessage\nApplyPendingMaintenanceActionResponse\nApplyPendingMaintenanceActionResult\nApplySchemaRequest\nApplySchemaResponse\nApplySecurityGroupsToClientVpnTargetNetworkRequest\nApplySecurityGroupsToClientVpnTargetNetworkResult\nApplySecurityGroupsToLoadBalancerInput\nApplySecurityGroupsToLoadBalancerOutput\nApplyServerSideEncryptionByDefault\nApplyStatus\nApplyTo\nApplyToAllRegions\nApplyType\nApproval\nApprovalAlreadyCompletedException\nApprovalDate\nApprovalDescription\nApprovalModel\nApprovalResult\nApprovalRule\nApprovalRuleContentRequiredException\nApprovalRuleDoesNotExistException\nApprovalRuleEventMetadata\nApprovalRuleNameAlreadyExistsException\nApprovalRuleNameRequiredException\nApprovalRuleOverriddenEventMetadata\nApprovalRuleTemplate\nApprovalRuleTemplateContentRequiredException\nApprovalRuleTemplateDoesNotExistException\nApprovalRuleTemplateInUseException\nApprovalRuleTemplateNameAlreadyExistsException\nApprovalRuleTemplateNameRequiredException\nApprovalRules\nApprovalStateChangedEventMetadata\nApprovalStateRequiredException\nApprovalThresholdPolicy\nApprovalTime\nApproveAfterDays\nApproveAssignmentRequest\nApproveSkillRequest\nApproveUntilDate\nApprovedOrigins\nApprovedPatches\nApprovedPatchesComplianceLevel\nApprovedPatchesEnableNonSecurity\nApprovedVersion\nApproximateAggregateValue\nApproximateArrivalTimestamp\nApproximateAssetCount\nApproximateCount\nApproximateCreationDateTime\nApproximateDurationSeconds\nApproximateNumberOfMessagesMoved\nApproximateNumberOfMessagesToMove\nApproximateResultCount\nApproximateStartTime\nApproximateTime\nApproximateTotalCount\nApproximateUniqueCount\nApproximateValue\nApps\nAppsCount\nAppsList\nAppsListArn\nAppsListData\nAppsListDataSummary\nAppsLists\nAppstreamAgentVersion\nAquaConfiguration\nAquaConfigurationStatus\nAquaStatus\nArbitraryPatternLimits\nArc\nArcAngle\nArcAxis\nArcAxisConfiguration\nArcAxisDisplayRange\nArcConfiguration\nArcOptions\nArcThickness\nArch\nArchitecturalDesign\nArchitecture\nArchitectureTypes\nArchitectures\nArchivalBackupArn\nArchivalCompleteTime\nArchivalDateTime\nArchivalReason\nArchivalSummary\nArchive\nArchiveAllowedFlag\nArchiveApplicationRequest\nArchiveArn\nArchiveCdnSettings\nArchiveContainerSettings\nArchiveCreationOutput\nArchiveDescription\nArchiveFindingsRequest\nArchiveGroupSettings\nArchiveId\nArchiveName\nArchiveOutputSettings\nArchiveRetainRule\nArchiveRule\nArchiveRuleSummary\nArchiveS3Settings\nArchiveSHA256TreeHash\nArchiveSizeInBytes\nArchiveStatus\nArchiveWaveRequest\nArchived\nArchivedLogDestId\nArchivedLogsOnly\nArchives\nAreaCode\nAreaOfInterest\nAreaStyleSettings\nAreaUnderPRCurve\nArgs\nArgumentException\nArguments\nArgumentsMap\nArib\nAribCaptionsPid\nAribCaptionsPidControl\nAribDestinationSettings\nAribSourceSettings\nArn\nArnNotSupportedException\nArns\nArrayColumnInfo\nArrayProperties\nArrayPropertiesDetail\nArrayPropertiesSummary\nArrayValue\nArrivalDate\nArtifact\nArtifactArn\nArtifactConfig\nArtifactConfigInput\nArtifactConfigOutput\nArtifactDetail\nArtifactDetails\nArtifactDigest\nArtifactId\nArtifactIdentifier\nArtifactLocation\nArtifactName\nArtifactPath\nArtifactRevision\nArtifactS3Location\nArtifactSource\nArtifactSourceType\nArtifactStore\nArtifactSummaries\nArtifactSummary\nArtifactType\nArtifacts\nArtifactsConcatenationConfiguration\nArtifactsConfiguration\nArtwork\nAs2Config\nAs2ConnectorConfig\nAs2Id\nAs2Transports\nAsPath\nAscending\nAsmPassword\nAsmServer\nAsmUser\nAsn\nAsnOrg\nAspectRatio\nAssembleWith\nAssertedControls\nAssertionAttributes\nAssertionRule\nAssertionRuleUpdate\nAssessment\nAssessmentControl\nAssessmentControlSet\nAssessmentEvidenceFolder\nAssessmentFramework\nAssessmentFrameworkMetadata\nAssessmentFrameworkShareRequest\nAssessmentMetadata\nAssessmentMetadataItem\nAssessmentProgress\nAssessmentReport\nAssessmentReportEvidenceError\nAssessmentReportMetadata\nAssessmentReportTypes\nAssessmentReportsDestination\nAssessmentResults\nAssessmentResultsFile\nAssessmentRun\nAssessmentRunAgent\nAssessmentRunFilter\nAssessmentRunInProgressException\nAssessmentRunName\nAssessmentRunNotification\nAssessmentRunStateChange\nAssessmentStatus\nAssessmentSummary\nAssessmentTarget\nAssessmentTargetFilter\nAssessmentTemplate\nAssessmentTemplateFilter\nAsset\nAssetAttributes\nAssetBundleCloudFormationOverridePropertyConfiguration\nAssetBundleExportJobAnalysisOverrideProperties\nAssetBundleExportJobDashboardOverrideProperties\nAssetBundleExportJobDataSetOverrideProperties\nAssetBundleExportJobDataSourceOverrideProperties\nAssetBundleExportJobError\nAssetBundleExportJobId\nAssetBundleExportJobRefreshScheduleOverrideProperties\nAssetBundleExportJobResourceIdOverrideConfiguration\nAssetBundleExportJobSummary\nAssetBundleExportJobSummaryList\nAssetBundleExportJobThemeOverrideProperties\nAssetBundleExportJobVPCConnectionOverrideProperties\nAssetBundleImportJobAnalysisOverrideParameters\nAssetBundleImportJobDashboardOverrideParameters\nAssetBundleImportJobDataSetOverrideParameters\nAssetBundleImportJobDataSourceCredentialPair\nAssetBundleImportJobDataSourceCredentials\nAssetBundleImportJobDataSourceOverrideParameters\nAssetBundleImportJobError\nAssetBundleImportJobId\nAssetBundleImportJobOverrideParameters\nAssetBundleImportJobRefreshScheduleOverrideParameters\nAssetBundleImportJobResourceIdOverrideConfiguration\nAssetBundleImportJobSummary\nAssetBundleImportJobSummaryList\nAssetBundleImportJobThemeOverrideParameters\nAssetBundleImportJobVPCConnectionOverrideParameters\nAssetBundleImportSource\nAssetBundleImportSourceDescription\nAssetCompositeModel\nAssetDestinationEntry\nAssetDestinations\nAssetDetails\nAssetEntry\nAssetErrorDetails\nAssetHierarchy\nAssetHierarchyInfo\nAssetId\nAssetIds\nAssetInfo\nAssetInformationList\nAssetLocation\nAssetModelCompositeModel\nAssetModelCompositeModelDefinition\nAssetModelHierarchy\nAssetModelHierarchyDefinition\nAssetModelProperty\nAssetModelPropertyDefinition\nAssetModelPropertySummary\nAssetModelStatus\nAssetModelSummary\nAssetName\nAssetProperty\nAssetPropertySummary\nAssetPropertyTimestamp\nAssetPropertyValue\nAssetPropertyVariant\nAssetRelationshipSummary\nAssetShallow\nAssetSource\nAssetSourceEntry\nAssetSources\nAssetStatus\nAssetSummary\nAssetType\nAssetValue\nAssets\nAssign\nAssignContactCategoryAction\nAssignInstanceRequest\nAssignIpv6AddressOnCreation\nAssignIpv6AddressesRequest\nAssignIpv6AddressesResult\nAssignPrivateIpAddressesRequest\nAssignPrivateIpAddressesResult\nAssignPrivateNatGatewayAddressRequest\nAssignPrivateNatGatewayAddressResult\nAssignPublicIp\nAssignTapePoolInput\nAssignTapePoolOutput\nAssignVolumeRequest\nAssignedIpv4Prefixes\nAssignedIpv6Addresses\nAssignedIpv6Prefixes\nAssignedPrivateIpAddress\nAssignedPrivateIpAddresses\nAssigning\nAssignment\nAssignmentDurationInSeconds\nAssignmentId\nAssignmentName\nAssignmentReviewPolicy\nAssignmentReviewReport\nAssignmentStatus\nAssignmentStatuses\nAssignments\nAssistAltitude\nAssistPosition\nAssistantAssociationData\nAssistantAssociationSummary\nAssistantData\nAssistantIntegrationConfiguration\nAssistantSummary\nAssociateAccountsInput\nAssociateAccountsOutput\nAssociateAddressRequest\nAssociateAddressResult\nAssociateAdminAccountRequest\nAssociateAliasRequest\nAssociateApiRequest\nAssociateApiResponse\nAssociateAppBlockBuilderAppBlockRequest\nAssociateAppBlockBuilderAppBlockResult\nAssociateApplicationFleetRequest\nAssociateApplicationFleetResult\nAssociateApplicationToEntitlementRequest\nAssociateApplicationsRequest\nAssociateApprovalRuleTemplateWithRepositoryInput\nAssociateApprovedOriginRequest\nAssociateAssessmentReportEvidenceFolderRequest\nAssociateAssetsRequest\nAssociateAttributeGroupRequest\nAssociateAttributeGroupResponse\nAssociateAwsAccountWithPartnerAccountRequest\nAssociateAwsAccountWithPartnerAccountResponse\nAssociateBotRequest\nAssociateBrowserSettingsRequest\nAssociateBrowserSettingsResponse\nAssociateBudgetWithResourceInput\nAssociateCarrierIpAddress\nAssociateCertificateRequest\nAssociateChannelFlowRequest\nAssociateClientDeviceWithCoreDeviceEntry\nAssociateClientDeviceWithCoreDeviceErrorEntry\nAssociateClientVpnTargetNetworkRequest\nAssociateClientVpnTargetNetworkResult\nAssociateConfigurationItemsToApplicationRequest\nAssociateConnectPeerRequest\nAssociateConnectPeerResponse\nAssociateConnectionAliasRequest\nAssociateConnectionAliasResult\nAssociateConnectionWithLagRequest\nAssociateContactWithAddressBookRequest\nAssociateCreatedArtifactRequest\nAssociateCustomDomainRequest\nAssociateCustomDomainResponse\nAssociateCustomerGatewayRequest\nAssociateCustomerGatewayResponse\nAssociateDRTLogBucketRequest\nAssociateDRTRoleRequest\nAssociateDataShareConsumerMessage\nAssociateDefaultViewInput\nAssociateDefaultViewOutput\nAssociateDefaultVocabularyRequest\nAssociateDelegateToResourceRequest\nAssociateDelegationSignerToDomainRequest\nAssociateDelegationSignerToDomainResponse\nAssociateDeviceWithNetworkProfileRequest\nAssociateDeviceWithPlacementRequest\nAssociateDeviceWithRoomRequest\nAssociateDhcpOptionsRequest\nAssociateDiscoveredResourceRequest\nAssociateDomainRequest\nAssociateElasticIpRequest\nAssociateEnclaveCertificateIamRoleRequest\nAssociateEnclaveCertificateIamRoleResult\nAssociateEncryptionConfigRequest\nAssociateEncryptionConfigResponse\nAssociateEntireAccount\nAssociateEntitiesToExperienceRequest\nAssociateEntitiesToExperienceResponse\nAssociateEntityToThingRequest\nAssociateEnvironmentOperationsRoleMessage\nAssociateExternalConnectionRequest\nAssociateExternalConnectionResult\nAssociateFacesRequest\nAssociateFacesResponse\nAssociateFileSystemAliasesRequest\nAssociateFileSystemAliasesResponse\nAssociateFileSystemInput\nAssociateFileSystemOutput\nAssociateFirewallPolicyRequest\nAssociateFirewallPolicyResponse\nAssociateFirewallRuleGroupRequest\nAssociateFirewallRuleGroupResponse\nAssociateFleetRequest\nAssociateFraudsterRequest\nAssociateFraudsterResponse\nAssociateGatewayToServerInput\nAssociateGatewayToServerOutput\nAssociateHealthCheckRequest\nAssociateHostedConnectionRequest\nAssociateIamInstanceProfileRequest\nAssociateIamInstanceProfileResult\nAssociateIdentityProviderConfigRequest\nAssociateIdentityProviderConfigResponse\nAssociateInstanceEventWindowRequest\nAssociateInstanceEventWindowResult\nAssociateInstanceStorageConfigRequest\nAssociateInstanceStorageConfigResponse\nAssociateIpAccessSettingsRequest\nAssociateIpAccessSettingsResponse\nAssociateIpGroupsRequest\nAssociateIpamResourceDiscoveryRequest\nAssociateIpamResourceDiscoveryResult\nAssociateKmsKeyRequest\nAssociateLambdaFunctionRequest\nAssociateLensesInput\nAssociateLexBotRequest\nAssociateLicenseRequest\nAssociateLicenseResponse\nAssociateLinkRequest\nAssociateLinkResponse\nAssociateMacSecKeyRequest\nAssociateMacSecKeyResponse\nAssociateMemberAccountRequest\nAssociateMemberRequest\nAssociateMemberResponse\nAssociateMemberToGroupRequest\nAssociateMergedGraphqlApiRequest\nAssociateMergedGraphqlApiResponse\nAssociateMulticastGroupWithFuotaTaskRequest\nAssociateNatGatewayAddressRequest\nAssociateNatGatewayAddressResult\nAssociateNetworkSettingsRequest\nAssociateNetworkSettingsResponse\nAssociateNodeRequest\nAssociateNodeResponse\nAssociateOpsItemRelatedItemRequest\nAssociateOpsItemRelatedItemResponse\nAssociateOriginationIdentityRequest\nAssociateOriginationIdentityResult\nAssociatePackageRequest\nAssociatePackageResponse\nAssociatePersonasToEntitiesRequest\nAssociatePersonasToEntitiesResponse\nAssociatePhoneNumberContactFlowRequest\nAssociatePhoneNumberWithUserRequest\nAssociatePhoneNumbersWithVoiceConnectorGroupRequest\nAssociatePhoneNumbersWithVoiceConnectorGroupResponse\nAssociatePhoneNumbersWithVoiceConnectorRequest\nAssociatePhoneNumbersWithVoiceConnectorResponse\nAssociatePricingRulesInput\nAssociatePricingRulesOutput\nAssociatePrincipalWithPortfolioInput\nAssociateProactiveEngagementDetailsRequest\nAssociateProductWithPortfolioInput\nAssociateProfilesInput\nAssociatePublicIpAddress\nAssociateQualificationWithWorkerRequest\nAssociateQueueQuickConnectsRequest\nAssociateRepositoryRequest\nAssociateRepositoryResponse\nAssociateResolverEndpointIpAddressRequest\nAssociateResolverEndpointIpAddressResponse\nAssociateResolverQueryLogConfigRequest\nAssociateResolverQueryLogConfigResponse\nAssociateResolverRuleRequest\nAssociateResolverRuleResponse\nAssociateResourceError\nAssociateResourceRequest\nAssociateResourceResponse\nAssociateResourceResponseElement\nAssociateResourceSharePermissionRequest\nAssociateResourceSharePermissionResponse\nAssociateResourceShareRequest\nAssociateResourceShareResponse\nAssociateRoleToGroupRequest\nAssociateRoleToGroupResponse\nAssociateRouteTableRequest\nAssociateRouteTableResult\nAssociateRoutingProfileQueuesRequest\nAssociateS3ResourcesRequest\nAssociateS3ResourcesResult\nAssociateSecurityKeyRequest\nAssociateSecurityKeyResponse\nAssociateServiceActionWithProvisioningArtifactInput\nAssociateServiceRoleToAccountRequest\nAssociateServiceRoleToAccountResponse\nAssociateSigninDelegateGroupsWithAccountRequest\nAssociateSkillGroupWithRoomRequest\nAssociateSkillWithSkillGroupRequest\nAssociateSkillWithUsersRequest\nAssociateSoftwareTokenRequest\nAssociateSoftwareTokenResponse\nAssociateSourceGraphqlApiRequest\nAssociateSourceGraphqlApiResponse\nAssociateSourceNetworkStackRequest\nAssociateSourceNetworkStackResponse\nAssociateSourceServersRequest\nAssociateSubnetCidrBlockRequest\nAssociateSubnetCidrBlockResult\nAssociateSubnetsRequest\nAssociateSubnetsResponse\nAssociateTagOptionWithResourceInput\nAssociateTargetsWithJobRequest\nAssociateTargetsWithJobResponse\nAssociateTeamMemberRequest\nAssociateTeamMemberResult\nAssociateThirdPartyFirewallRequest\nAssociateThirdPartyFirewallResponse\nAssociateTimeSeriesToAssetPropertyRequest\nAssociateTrackerConsumerRequest\nAssociateTrafficDistributionGroupUserRequest\nAssociateTransitGatewayConnectPeerRequest\nAssociateTransitGatewayConnectPeerResponse\nAssociateTransitGatewayMulticastDomainRequest\nAssociateTransitGatewayMulticastDomainResult\nAssociateTransitGatewayPolicyTableRequest\nAssociateTransitGatewayPolicyTableResult\nAssociateTransitGatewayRouteTableRequest\nAssociateTransitGatewayRouteTableResult\nAssociateTrialComponentRequest\nAssociateTrialComponentResponse\nAssociateTrunkInterfaceRequest\nAssociateTrunkInterfaceResult\nAssociateTrustStoreRequest\nAssociateTrustStoreResponse\nAssociateUserAccessLoggingSettingsRequest\nAssociateUserAccessLoggingSettingsResponse\nAssociateUserRequest\nAssociateUserResponse\nAssociateUserSettingsRequest\nAssociateUserSettingsResponse\nAssociateUserToPermissionGroupRequest\nAssociateUserToPermissionGroupResponse\nAssociateVPCWithHostedZoneRequest\nAssociateVPCWithHostedZoneResponse\nAssociateVehicleFleetRequest\nAssociateVirtualInterfaceRequest\nAssociateVpcCidrBlockRequest\nAssociateVpcCidrBlockResult\nAssociateWebACLRequest\nAssociateWebsiteAuthorizationProviderRequest\nAssociateWebsiteAuthorizationProviderResponse\nAssociateWebsiteCertificateAuthorityRequest\nAssociateWebsiteCertificateAuthorityResponse\nAssociateWirelessDeviceWithFuotaTaskRequest\nAssociateWirelessDeviceWithMulticastGroupRequest\nAssociateWirelessDeviceWithThingRequest\nAssociateWirelessGatewayWithCertificateRequest\nAssociateWirelessGatewayWithCertificateResponse\nAssociateWirelessGatewayWithThingRequest\nAssociatedAccountId\nAssociatedApplication\nAssociatedAssetsSummary\nAssociatedAt\nAssociatedClientDevice\nAssociatedClusterCount\nAssociatedClusters\nAssociatedEndpointGroupFoundException\nAssociatedFace\nAssociatedFaces\nAssociatedGateway\nAssociatedGlueResource\nAssociatedHost\nAssociatedInsightId\nAssociatedListenerFoundException\nAssociatedPermission\nAssociatedPricingPlanCount\nAssociatedResource\nAssociatedResourceArns\nAssociatedResources\nAssociatedRole\nAssociatedRoleArn\nAssociatedRoles\nAssociatedRuleGroupArn\nAssociatedStandard\nAssociatedStandards\nAssociatedTargetNetwork\nAssociatedTargetNetworks\nAssociatedTimestamp\nAssociatedTranscript\nAssociatedTranscriptFilter\nAssociatedValues\nAssociation\nAssociationArn\nAssociationConfig\nAssociationCount\nAssociationDate\nAssociationDefaultRouteTableId\nAssociationDescription\nAssociationDoesNotExist\nAssociationExecution\nAssociationExecutionDoesNotExist\nAssociationExecutionFilter\nAssociationExecutionTarget\nAssociationExecutionTargets\nAssociationExecutionTargetsFilter\nAssociationExecutions\nAssociationFilter\nAssociationFilterList\nAssociationId\nAssociationIds\nAssociationName\nAssociationOverview\nAssociationSet\nAssociationSetDetails\nAssociationSize\nAssociationState\nAssociationStateDetails\nAssociationStatus\nAssociationStatusAggregatedCount\nAssociationSummaries\nAssociationSummary\nAssociationTarget\nAssociationTime\nAssociationType\nAssociationVersion\nAssociationVersionInfo\nAssociationVersionLimitExceeded\nAssociationVersions\nAssociations\nAssumeControl\nAssumeDecoratedRoleWithSAMLRequest\nAssumeDecoratedRoleWithSAMLResponse\nAssumeImpersonationRoleRequest\nAssumeImpersonationRoleResponse\nAssumeRolePolicyDocument\nAssumeRoleRequest\nAssumeRoleResponse\nAssumeRoleWithSAMLRequest\nAssumeRoleWithSAMLResponse\nAssumeRoleWithWebIdentityRequest\nAssumeRoleWithWebIdentityResponse\nAssumedRole\nAssumedRoleId\nAssumedRoleUser\nAsymmetricEncryptionAttributes\nAsyncErrorDetails\nAsyncInferenceClientConfig\nAsyncInferenceConfig\nAsyncInferenceNotificationConfig\nAsyncInferenceOutputConfig\nAsyncOperation\nAsyncRequestParameters\nAsyncResponseDetails\nAtRestEncryptionEnabled\nAtTime\nAthenaConnectorSource\nAthenaDatasetDefinition\nAthenaError\nAthenaErrorCode\nAthenaIntegration\nAthenaIntegrations\nAthenaParameters\nAthenaSourceConfig\nAtigData\nAtime\nAttachCertificateToDistributionRequest\nAttachCertificateToDistributionResult\nAttachClassicLinkVpcRequest\nAttachClassicLinkVpcResult\nAttachCustomerManagedPolicyReferenceToPermissionSetRequest\nAttachDiskRequest\nAttachDiskResult\nAttachElasticLoadBalancerRequest\nAttachGroupPolicyRequest\nAttachInstancesQuery\nAttachInstancesToLoadBalancerRequest\nAttachInstancesToLoadBalancerResult\nAttachInternetGatewayRequest\nAttachLoadBalancerTargetGroupsType\nAttachLoadBalancerTlsCertificateRequest\nAttachLoadBalancerTlsCertificateResult\nAttachLoadBalancerToSubnetsInput\nAttachLoadBalancerToSubnetsOutput\nAttachLoadBalancersType\nAttachManagedPolicyToPermissionSetRequest\nAttachNetworkInterfaceRequest\nAttachNetworkInterfaceResult\nAttachObject\nAttachObjectRequest\nAttachObjectResponse\nAttachPolicy\nAttachPolicyRequest\nAttachPrincipalPolicyRequest\nAttachRolePolicyRequest\nAttachSecurityProfileRequest\nAttachStaticIpRequest\nAttachStaticIpResult\nAttachThingPrincipalRequest\nAttachTime\nAttachToIndex\nAttachToIndexRequest\nAttachToIndexResponse\nAttachTrafficSourcesType\nAttachTypedLink\nAttachTypedLinkRequest\nAttachTypedLinkResponse\nAttachUserPolicyRequest\nAttachVerifiedAccessTrustProviderRequest\nAttachVerifiedAccessTrustProviderResult\nAttachVolumeInput\nAttachVolumeOutput\nAttachVolumeRequest\nAttachVpnGatewayRequest\nAttachVpnGatewayResult\nAttachedChannels\nAttachedDisk\nAttachedENIId\nAttachedManagedPolicies\nAttachedManagedPolicy\nAttachedObjectIdentifier\nAttachedPermissionsBoundary\nAttachedPolicies\nAttachedPolicy\nAttachedPolicyIds\nAttachedTo\nAttachedVolumes\nAttachment\nAttachmentConfiguration\nAttachmentContent\nAttachmentCount\nAttachmentDetails\nAttachmentEnaSrdSpecification\nAttachmentEnaSrdUdpSpecification\nAttachmentFieldMappings\nAttachmentId\nAttachmentIdNotFound\nAttachmentIds\nAttachmentInformation\nAttachmentItem\nAttachmentLimitExceeded\nAttachmentName\nAttachmentPolicyRuleNumber\nAttachmentReference\nAttachmentSetExpired\nAttachmentSetIdNotFound\nAttachmentSetSizeLimitExceeded\nAttachmentSizeInBytes\nAttachmentStateChange\nAttachmentStatuses\nAttachmentType\nAttachments\nAttachmentsContent\nAttachmentsInformation\nAttachmentsSource\nAttack\nAttackCount\nAttackCounters\nAttackDetail\nAttackId\nAttackLayer\nAttackProperties\nAttackProperty\nAttackPropertyIdentifier\nAttackStatisticsDataItem\nAttackSummaries\nAttackSummary\nAttackVectorDescription\nAttackVectors\nAttackVolume\nAttackVolumeStatistics\nAttempt\nAttemptContainerDetail\nAttemptCount\nAttemptDetail\nAttempts\nAttendee\nAttendeeCapabilities\nAttendeeId\nAttendeeIdItem\nAttendeeIds\nAttendees\nAttenuationControl\nAttestationDocument\nAttribute\nAttributeAction\nAttributeActionType\nAttributeAggregationFunction\nAttributeBooleanValue\nAttributeConfig\nAttributeConfigs\nAttributeDataType\nAttributeDefinition\nAttributeDefinitions\nAttributeDetails\nAttributeDimension\nAttributeFilter\nAttributeGroup\nAttributeGroupDetails\nAttributeGroupSummary\nAttributeItem\nAttributeKey\nAttributeKeyAndValue\nAttributeLimitExceededException\nAttributeMapping\nAttributeMatchingModel\nAttributeName\nAttributeNameAndValue\nAttributeNames\nAttributeOperation\nAttributePath\nAttributePayload\nAttributeReference\nAttributeSuggestionsConfig\nAttributeSuggestionsDescribeConfig\nAttributeSuggestionsGetConfig\nAttributeSuggestionsMode\nAttributeSuggestionsUpdateConfig\nAttributeType\nAttributeTypesSelector\nAttributeUpdateValue\nAttributeUpdates\nAttributeValue\nAttributeValueList\nAttributeValueTarget\nAttributeValueUpdate\nAttributeValues\nAttributes\nAttributesData\nAttributesRequireVerificationBeforeUpdate\nAttributesResource\nAttributesToDelete\nAttributesToGet\nAudience\nAudio\nAudioAggregationEndedAt\nAudioAggregationStartedAt\nAudioAndDTMFInputSpecification\nAudioArtifactsConfiguration\nAudioBufferModel\nAudioChannelConfigSchemeIdUri\nAudioChannelMapping\nAudioChannelTaggingSettings\nAudioChannels\nAudioChunk\nAudioCodecOptions\nAudioCodecSettings\nAudioConcatenationConfiguration\nAudioConfiguration\nAudioDeduplication\nAudioDescription\nAudioDescriptionBroadcasterMix\nAudioDescriptionNames\nAudioDescriptions\nAudioDolbyEDecode\nAudioDuration\nAudioDurationCorrection\nAudioEvent\nAudioFallbackUrl\nAudioFeatures\nAudioFramesPerPes\nAudioGroupId\nAudioHlsRenditionSelection\nAudioHostUrl\nAudioInputEvent\nAudioLanguageSelection\nAudioList\nAudioLogDestination\nAudioLogSetting\nAudioMetadata\nAudioNormalizationSettings\nAudioOnlyContainer\nAudioOnlyHeader\nAudioOnlyHlsSettings\nAudioOnlyImage\nAudioOnlyTimecodeControl\nAudioPackingMode\nAudioParameters\nAudioPidSelection\nAudioPids\nAudioRenditionSets\nAudioResponseEvent\nAudioSampleRate\nAudioSelector\nAudioSelectorGroup\nAudioSelectorGroups\nAudioSelectorName\nAudioSelectorNames\nAudioSelectorSettings\nAudioSelectors\nAudioSilenceFailoverSettings\nAudioSilenceSettings\nAudioSilenceThresholdMsec\nAudioSourceName\nAudioSpecification\nAudioStream\nAudioStreamType\nAudioTrack\nAudioTrackSelection\nAudioTrackType\nAudioType\nAudioTypeControl\nAudioWatermarkSettings\nAudioWatermarkingSettings\nAudit\nAuditCheckConfiguration\nAuditCheckDetails\nAuditContext\nAuditDestinationARN\nAuditEvent\nAuditEventResultEntry\nAuditFinding\nAuditImage\nAuditImages\nAuditImagesLimit\nAuditLogConfiguration\nAuditLogDestination\nAuditLogDestinationConfiguration\nAuditLogGroup\nAuditLogProcessingConfiguration\nAuditLogVolume\nAuditLogs\nAuditMitigationActionExecutionMetadata\nAuditMitigationActionsTaskMetadata\nAuditMitigationActionsTaskTarget\nAuditNotificationTarget\nAuditPolicyState\nAuditReportId\nAuditReportResponseFormat\nAuditReportStatus\nAuditStreamArn\nAuditSuppression\nAuditTaskMetadata\nAugmentedManifests\nAugmentedManifestsListItem\nAuroraParameters\nAuroraPostgreSqlParameters\nAuth\nAuthCode\nAuthEventType\nAuthEvents\nAuthException\nAuthFlow\nAuthInfo\nAuthMechanism\nAuthMethod\nAuthMode\nAuthParameter\nAuthParameters\nAuthPassword\nAuthRequest\nAuthRequestCryptogram\nAuthResources\nAuthResponseAttributes\nAuthResponseCode\nAuthResponseValue\nAuthResult\nAuthScheme\nAuthSecretArn\nAuthSessionValidity\nAuthSource\nAuthStrategy\nAuthToken\nAuthTokenEnabled\nAuthTokenExpirationTime\nAuthTokenLastModifiedDate\nAuthTokenStatus\nAuthTokenUpdateStrategy\nAuthTtL\nAuthType\nAuthUserName\nAuthenticateCognitoActionConfig\nAuthenticateCognitoConfig\nAuthenticateOidcActionConfig\nAuthenticateOidcConfig\nAuthenticateOnUnsubscribe\nAuthenticated\nAuthentication\nAuthenticationCode1\nAuthenticationCode2\nAuthenticationConfig\nAuthenticationConfiguration\nAuthenticationDescription\nAuthenticationFailedException\nAuthenticationMethod\nAuthenticationMode\nAuthenticationOptions\nAuthenticationProfile\nAuthenticationProfileAlreadyExistsFault\nAuthenticationProfileContent\nAuthenticationProfileName\nAuthenticationProfileNotFoundFault\nAuthenticationProfileQuotaExceededFault\nAuthenticationProfiles\nAuthenticationProtocol\nAuthenticationRequestExtraParams\nAuthenticationResult\nAuthenticationResultId\nAuthenticationResultType\nAuthenticationScheme\nAuthenticationStrategy\nAuthenticationSummary\nAuthenticationToken\nAuthenticationType\nAuthor\nAuthorDoesNotExistException\nAuthorGroup\nAuthorization\nAuthorizationAlreadyExistsFault\nAuthorizationConfig\nAuthorizationData\nAuthorizationEndpoint\nAuthorizationErrorException\nAuthorizationException\nAuthorizationNotFoundFault\nAuthorizationPendingException\nAuthorizationProviderId\nAuthorizationProviderType\nAuthorizationQuotaExceededFault\nAuthorizationResult\nAuthorizationRule\nAuthorizationRules\nAuthorizationScopes\nAuthorizationStrategy\nAuthorizationType\nAuthorizeAllGroups\nAuthorizeCacheSecurityGroupIngressMessage\nAuthorizeCacheSecurityGroupIngressResult\nAuthorizeClientVpnIngressRequest\nAuthorizeClientVpnIngressResult\nAuthorizeClusterSecurityGroupIngressMessage\nAuthorizeClusterSecurityGroupIngressResult\nAuthorizeDBSecurityGroupIngressMessage\nAuthorizeDBSecurityGroupIngressResult\nAuthorizeDataShareMessage\nAuthorizeEndpointAccessMessage\nAuthorizeIpRulesRequest\nAuthorizeSecurityGroupEgressRequest\nAuthorizeSecurityGroupEgressResult\nAuthorizeSecurityGroupIngressRequest\nAuthorizeSecurityGroupIngressResult\nAuthorizeSnapshotAccessMessage\nAuthorizeSnapshotAccessResult\nAuthorizeTime\nAuthorizeVpcEndpointAccessRequest\nAuthorizeVpcEndpointAccessResponse\nAuthorizedAccountId\nAuthorizedAwsRegion\nAuthorizedColumns\nAuthorizedPrincipal\nAuthorizedPrincipalList\nAuthorizedResourceArns\nAuthorizedSessionTagValueList\nAuthorizedUrl\nAuthorizer\nAuthorizerConfig\nAuthorizerCredentialsArn\nAuthorizerDescription\nAuthorizerId\nAuthorizerPayloadFormatVersion\nAuthorizerResultTtlInSeconds\nAuthorizerSummary\nAuthorizerType\nAuthorizerUri\nAuthorizers\nAutoAccept\nAutoAcceptRequests\nAutoAcceptSharedAssociations\nAutoAcceptSharedAttachments\nAutoAddGroupOwner\nAutoAdjustData\nAutoAdjustType\nAutoAppliedAfterDate\nAutoApprovalDelayInSeconds\nAutoApprovalTime\nAutoApprove\nAutoAssignElasticIps\nAutoAssignPublicIps\nAutoAssociate\nAutoBranchCreationConfig\nAutoConfigEnabled\nAutoCreate\nAutoCreateApplication\nAutoCreateTasks\nAutoDeclineConflictingRequests\nAutoDeclineRecurringRequests\nAutoDeploy\nAutoDeployed\nAutoDeployment\nAutoDeploymentsEnabled\nAutoDetectionMetricSource\nAutoDetectionS3SourceConfig\nAutoEnable\nAutoEnableControls\nAutoEnableIO\nAutoEnableOrganizationMembers\nAutoEnableStandards\nAutoEnroll\nAutoEnrollment\nAutoExportPolicy\nAutoExportRevisionDestinationEntry\nAutoExportRevisionToS3RequestDetails\nAutoGenerateEndpointName\nAutoGranted\nAutoGrantedValue\nAutoImport\nAutoImportPolicy\nAutoMLAlgorithmArns\nAutoMLAlgorithmConfig\nAutoMLAlgorithms\nAutoMLCandidate\nAutoMLCandidateGenerationConfig\nAutoMLCandidateStep\nAutoMLChannel\nAutoMLConfig\nAutoMLContainerDefinition\nAutoMLDataSource\nAutoMLDataSplitConfig\nAutoMLJob\nAutoMLJobArn\nAutoMLJobArtifacts\nAutoMLJobChannel\nAutoMLJobCompletionCriteria\nAutoMLJobConfig\nAutoMLJobInputDataConfig\nAutoMLJobName\nAutoMLJobObjective\nAutoMLJobSecondaryStatus\nAutoMLJobStatus\nAutoMLJobStepMetadata\nAutoMLJobSummaries\nAutoMLJobSummary\nAutoMLOutputDataConfig\nAutoMLOverrideStrategy\nAutoMLPartialFailureReason\nAutoMLProblemTypeConfig\nAutoMLProblemTypeConfigName\nAutoMLProblemTypeResolvedAttributes\nAutoMLResolvedAttributes\nAutoMLResult\nAutoMLS3DataSource\nAutoMLSecurityConfig\nAutoMerging\nAutoMinorVersionUpgrade\nAutoParameter\nAutoParameters\nAutoPause\nAutoPlacement\nAutoPromotionResult\nAutoPromotionResultReason\nAutoPushdown\nAutoRecovery\nAutoRecoverySupported\nAutoRenew\nAutoRollback\nAutoRollbackConfig\nAutoRollbackConfiguration\nAutoScaling\nAutoScalingConfiguration\nAutoScalingConfigurationArn\nAutoScalingConfigurationName\nAutoScalingConfigurationRevision\nAutoScalingConfigurationSummary\nAutoScalingConfigurationSummaryList\nAutoScalingDescription\nAutoScalingDisabled\nAutoScalingEnabled\nAutoScalingEnabledUpdate\nAutoScalingGroup\nAutoScalingGroupARN\nAutoScalingGroupArn\nAutoScalingGroupConfiguration\nAutoScalingGroupName\nAutoScalingGroupNames\nAutoScalingGroupNamesType\nAutoScalingGroupProvider\nAutoScalingGroupProviderUpdate\nAutoScalingGroupRecommendation\nAutoScalingGroupRecommendationOption\nAutoScalingGroupState\nAutoScalingGroups\nAutoScalingGroupsType\nAutoScalingInstanceDetails\nAutoScalingInstances\nAutoScalingInstancesType\nAutoScalingNotificationTypes\nAutoScalingPolicy\nAutoScalingPolicyDescription\nAutoScalingPolicyStateChangeReason\nAutoScalingPolicyStatus\nAutoScalingPolicyUpdate\nAutoScalingRole\nAutoScalingRoleArn\nAutoScalingSchedule\nAutoScalingSettingsDescription\nAutoScalingSettingsUpdate\nAutoScalingTargetTrackingScalingPolicyConfigurationDescription\nAutoScalingTargetTrackingScalingPolicyConfigurationUpdate\nAutoScalingThresholds\nAutoScalingType\nAutoScalingUpdate\nAutoSnapshotAddOnRequest\nAutoSnapshotDetails\nAutoSoftwareUpdateEnabled\nAutoStartConfig\nAutoStopConfig\nAutoTerminate\nAutoTerminationPolicy\nAutoTune\nAutoTuneDetails\nAutoTuneMaintenanceSchedule\nAutoTuneOptions\nAutoTuneOptionsInput\nAutoTuneOptionsOutput\nAutoTuneOptionsStatus\nAutoTuneStatus\nAutoTuneType\nAutoTunes\nAutoUpdate\nAutoUpdateAfterRecommendedApplyByDate\nAutoUpdateStartDate\nAutoUpgrade\nAutoUpgradeDate\nAutoVerifiedAttributes\nAutoWarmupEnabled\nAutocommitPeriod\nAutodefinedReverse\nAutodefinedReverseFlag\nAutomatedAbrRule\nAutomatedAbrSettings\nAutomatedDiscoveryInformation\nAutomatedEncodingSettings\nAutomatedSnapshotRetentionPeriod\nAutomatedSnapshotStartHour\nAutomatedUpdateDate\nAutomatic\nAutomaticBackupRetentionDays\nAutomaticFail\nAutomaticFailover\nAutomaticFailoverEnabled\nAutomaticFailoverStatus\nAutomaticInputFailoverSettings\nAutomaticRenewal\nAutomaticRestartTime\nAutomaticTapeCreationPolicyInfo\nAutomaticTapeCreationPolicyInfos\nAutomaticTapeCreationRule\nAutomaticTapeCreationRules\nAutomaticallyAfterDays\nAutomation\nAutomationDefinitionNotApprovedException\nAutomationDefinitionNotFoundException\nAutomationDefinitionVersionNotFoundException\nAutomationExecution\nAutomationExecutionException\nAutomationExecutionFilter\nAutomationExecutionId\nAutomationExecutionLimitExceededException\nAutomationExecutionMetadata\nAutomationExecutionMetadataList\nAutomationExecutionNotFoundException\nAutomationExecutionStatus\nAutomationExecutionTimeoutException\nAutomationMode\nAutomationRulesAction\nAutomationRulesArns\nAutomationRulesConfig\nAutomationRulesFindingFieldsUpdate\nAutomationRulesFindingFilters\nAutomationRulesMetadata\nAutomationStepNotFoundException\nAutomationSubtype\nAutomationTargetParameterName\nAutomationType\nAutoprovision\nAutotune\nAuxiliaryDataLocation\nAv1QvbrSettings\nAv1Settings\nAvailBlanking\nAvailBlankingImage\nAvailConfiguration\nAvailMatchingCriteria\nAvailNum\nAvailSettings\nAvailSuppression\nAvailability\nAvailabilityConfiguration\nAvailabilityConfigurations\nAvailabilityLocalHealthEventsConfig\nAvailabilityMeasurement\nAvailabilityMode\nAvailabilityOptions\nAvailabilityOptionsStatus\nAvailabilityScoreThreshold\nAvailabilityStatus\nAvailabilityZone\nAvailabilityZoneCount\nAvailabilityZoneDetail\nAvailabilityZoneFilter\nAvailabilityZoneGroup\nAvailabilityZoneId\nAvailabilityZoneIdFilter\nAvailabilityZoneInfo\nAvailabilityZoneInformation\nAvailabilityZoneMessage\nAvailabilityZoneName\nAvailabilityZoneNotSupportedException\nAvailabilityZoneRelocation\nAvailabilityZoneRelocationStatus\nAvailabilityZones\nAvailabilityZonesMismatch\nAvailable\nAvailableAddressCount\nAvailableBalance\nAvailableCIDRCount\nAvailableCapacity\nAvailableDataNodeCount\nAvailableInstanceCapacity\nAvailableInstanceCount\nAvailableIpAddressCount\nAvailableLabels\nAvailableNumberSummary\nAvailableNumbersList\nAvailableOSReleases\nAvailablePackageVersion\nAvailablePolicyTypes\nAvailableProcessorFeature\nAvailableProcessorFeatures\nAvailableProvisionedConcurrentExecutions\nAvailableSlotsByChannel\nAvailableUpgrades\nAvailableVCpus\nAvailsExpected\nAvcIntraClass\nAvcIntraSettings\nAvcIntraUhdSettings\nAverage\nAverageAccuracy\nAverageDownloadRateLimitInBitsPerSec\nAverageExecutionTimeMillis\nAverageF1Score\nAverageLength\nAverageNormalizedUnitsUsedPerHour\nAverageNumberOfInstancesUsedPerHour\nAveragePrecision\nAverageRecall\nAverageUploadRateLimitInBitsPerSec\nAverageUtilization\nAverageWeightedQuantileLoss\nAvg\nAvgResizeRateInMegaBytesPerSecond\nAvoidEmptyBatches\nAvoidFerries\nAvoidTolls\nAwaitAnswerMachinePrompt\nAwsAccount\nAwsAccountId\nAwsAccountNumber\nAwsAmazonMqBroker\nAwsAmazonMqBrokerDetails\nAwsAmazonMqBrokerEncryptionOptionsDetails\nAwsAmazonMqBrokerLdapServerMetadataDetails\nAwsAmazonMqBrokerLogsDetails\nAwsAmazonMqBrokerLogsPendingDetails\nAwsAmazonMqBrokerMaintenanceWindowStartTimeDetails\nAwsAmazonMqBrokerUsersDetails\nAwsApiCallAction\nAwsApiCallActionDomainDetails\nAwsApiGatewayAccessLogSettings\nAwsApiGatewayCanarySettings\nAwsApiGatewayEndpointConfiguration\nAwsApiGatewayMethodSettings\nAwsApiGatewayRestApi\nAwsApiGatewayRestApiDetails\nAwsApiGatewayStage\nAwsApiGatewayStageDetails\nAwsApiGatewayV2Api\nAwsApiGatewayV2ApiDetails\nAwsApiGatewayV2RouteSettings\nAwsApiGatewayV2Stage\nAwsApiGatewayV2StageDetails\nAwsAppSyncGraphQlApi\nAwsAppSyncGraphQlApiAdditionalAuthenticationProvidersDetails\nAwsAppSyncGraphQlApiDetails\nAwsAppSyncGraphQlApiLambdaAuthorizerConfigDetails\nAwsAppSyncGraphQlApiLogConfigDetails\nAwsAppSyncGraphQlApiOpenIdConnectConfigDetails\nAwsAppSyncGraphQlApiUserPoolConfigDetails\nAwsAthenaWorkGroup\nAwsAthenaWorkGroupConfigurationDetails\nAwsAthenaWorkGroupConfigurationResultConfigurationDetails\nAwsAthenaWorkGroupConfigurationResultConfigurationEncryptionConfigurationDetails\nAwsAthenaWorkGroupDetails\nAwsAutoScalingAutoScalingGroup\nAwsAutoScalingAutoScalingGroupAvailabilityZonesListDetails\nAwsAutoScalingAutoScalingGroupDetails\nAwsAutoScalingAutoScalingGroupLaunchTemplateLaunchTemplateSpecification\nAwsAutoScalingAutoScalingGroupMixedInstancesPolicyDetails\nAwsAutoScalingAutoScalingGroupMixedInstancesPolicyInstancesDistributionDetails\nAwsAutoScalingAutoScalingGroupMixedInstancesPolicyLaunchTemplateDetails\nAwsAutoScalingAutoScalingGroupMixedInstancesPolicyLaunchTemplateLaunchTemplateSpecification\nAwsAutoScalingAutoScalingGroupMixedInstancesPolicyLaunchTemplateOverridesListDetails\nAwsAutoScalingLaunchConfiguration\nAwsAutoScalingLaunchConfigurationBlockDeviceMappingsDetails\nAwsAutoScalingLaunchConfigurationBlockDeviceMappingsEbsDetails\nAwsAutoScalingLaunchConfigurationDetails\nAwsAutoScalingLaunchConfigurationInstanceMonitoringDetails\nAwsAutoScalingLaunchConfigurationMetadataOptions\nAwsBackupBackupPlan\nAwsBackupBackupPlanAdvancedBackupSettingsDetails\nAwsBackupBackupPlanBackupPlanDetails\nAwsBackupBackupPlanDetails\nAwsBackupBackupPlanLifecycleDetails\nAwsBackupBackupPlanRuleCopyActionsDetails\nAwsBackupBackupPlanRuleDetails\nAwsBackupBackupVault\nAwsBackupBackupVaultDetails\nAwsBackupBackupVaultNotificationsDetails\nAwsBackupRecoveryPoint\nAwsBackupRecoveryPointArn\nAwsBackupRecoveryPointCalculatedLifecycleDetails\nAwsBackupRecoveryPointCreatedByDetails\nAwsBackupRecoveryPointDetails\nAwsBackupRecoveryPointLifecycleDetails\nAwsCertificateManagerCertificate\nAwsCertificateManagerCertificateDetails\nAwsCertificateManagerCertificateDomainValidationOption\nAwsCertificateManagerCertificateExtendedKeyUsage\nAwsCertificateManagerCertificateKeyUsage\nAwsCertificateManagerCertificateOptions\nAwsCertificateManagerCertificateRenewalSummary\nAwsCertificateManagerCertificateResourceRecord\nAwsCloudFormationStack\nAwsCloudFormationStackDetails\nAwsCloudFormationStackDriftInformationDetails\nAwsCloudFormationStackOutputsDetails\nAwsCloudFrontDistribution\nAwsCloudFrontDistributionCacheBehavior\nAwsCloudFrontDistributionCacheBehaviors\nAwsCloudFrontDistributionDefaultCacheBehavior\nAwsCloudFrontDistributionDetails\nAwsCloudFrontDistributionLogging\nAwsCloudFrontDistributionOriginCustomOriginConfig\nAwsCloudFrontDistributionOriginGroup\nAwsCloudFrontDistributionOriginGroupFailover\nAwsCloudFrontDistributionOriginGroupFailoverStatusCodes\nAwsCloudFrontDistributionOriginGroups\nAwsCloudFrontDistributionOriginItem\nAwsCloudFrontDistributionOriginS3OriginConfig\nAwsCloudFrontDistributionOriginSslProtocols\nAwsCloudFrontDistributionOrigins\nAwsCloudFrontDistributionViewerCertificate\nAwsCloudMapInstanceAttribute\nAwsCloudMapServiceDiscovery\nAwsCloudTrailTrail\nAwsCloudTrailTrailDetails\nAwsCloudWatchAlarm\nAwsCloudWatchAlarmDetails\nAwsCloudWatchAlarmDimensionsDetails\nAwsCodeBuildProject\nAwsCodeBuildProjectArtifactsDetails\nAwsCodeBuildProjectDetails\nAwsCodeBuildProjectEnvironment\nAwsCodeBuildProjectEnvironmentEnvironmentVariablesDetails\nAwsCodeBuildProjectEnvironmentRegistryCredential\nAwsCodeBuildProjectLogsConfigCloudWatchLogsDetails\nAwsCodeBuildProjectLogsConfigDetails\nAwsCodeBuildProjectLogsConfigS3LogsDetails\nAwsCodeBuildProjectSource\nAwsCodeBuildProjectVpcConfig\nAwsCognitoIdentityPoolId\nAwsCognitoRegion\nAwsCorsConfiguration\nAwsCredentials\nAwsDynamoDbTable\nAwsDynamoDbTableAttributeDefinition\nAwsDynamoDbTableBillingModeSummary\nAwsDynamoDbTableDetails\nAwsDynamoDbTableGlobalSecondaryIndex\nAwsDynamoDbTableKeySchema\nAwsDynamoDbTableLocalSecondaryIndex\nAwsDynamoDbTableProjection\nAwsDynamoDbTableProvisionedThroughput\nAwsDynamoDbTableProvisionedThroughputOverride\nAwsDynamoDbTableReplica\nAwsDynamoDbTableReplicaGlobalSecondaryIndex\nAwsDynamoDbTableRestoreSummary\nAwsDynamoDbTableSseDescription\nAwsDynamoDbTableStreamSpecification\nAwsEc2Eip\nAwsEc2EipDetails\nAwsEc2Instance\nAwsEc2InstanceDetails\nAwsEc2InstanceMetadataOptions\nAwsEc2InstanceMonitoringDetails\nAwsEc2InstanceNetworkInterfacesDetails\nAwsEc2InstanceViolation\nAwsEc2LaunchTemplate\nAwsEc2LaunchTemplateDataBlockDeviceMappingSetDetails\nAwsEc2LaunchTemplateDataBlockDeviceMappingSetEbsDetails\nAwsEc2LaunchTemplateDataCapacityReservationSpecificationCapacityReservationTargetDetails\nAwsEc2LaunchTemplateDataCapacityReservationSpecificationDetails\nAwsEc2LaunchTemplateDataCpuOptionsDetails\nAwsEc2LaunchTemplateDataCreditSpecificationDetails\nAwsEc2LaunchTemplateDataDetails\nAwsEc2LaunchTemplateDataElasticGpuSpecificationSetDetails\nAwsEc2LaunchTemplateDataElasticInferenceAcceleratorSetDetails\nAwsEc2LaunchTemplateDataEnclaveOptionsDetails\nAwsEc2LaunchTemplateDataHibernationOptionsDetails\nAwsEc2LaunchTemplateDataIamInstanceProfileDetails\nAwsEc2LaunchTemplateDataInstanceMarketOptionsDetails\nAwsEc2LaunchTemplateDataInstanceMarketOptionsSpotOptionsDetails\nAwsEc2LaunchTemplateDataInstanceRequirementsAcceleratorCountDetails\nAwsEc2LaunchTemplateDataInstanceRequirementsAcceleratorTotalMemoryMiBDetails\nAwsEc2LaunchTemplateDataInstanceRequirementsBaselineEbsBandwidthMbpsDetails\nAwsEc2LaunchTemplateDataInstanceRequirementsDetails\nAwsEc2LaunchTemplateDataInstanceRequirementsMemoryGiBPerVCpuDetails\nAwsEc2LaunchTemplateDataInstanceRequirementsMemoryMiBDetails\nAwsEc2LaunchTemplateDataInstanceRequirementsNetworkInterfaceCountDetails\nAwsEc2LaunchTemplateDataInstanceRequirementsTotalLocalStorageGBDetails\nAwsEc2LaunchTemplateDataInstanceRequirementsVCpuCountDetails\nAwsEc2LaunchTemplateDataLicenseSetDetails\nAwsEc2LaunchTemplateDataMaintenanceOptionsDetails\nAwsEc2LaunchTemplateDataMetadataOptionsDetails\nAwsEc2LaunchTemplateDataMonitoringDetails\nAwsEc2LaunchTemplateDataNetworkInterfaceSetDetails\nAwsEc2LaunchTemplateDataNetworkInterfaceSetIpv4PrefixesDetails\nAwsEc2LaunchTemplateDataNetworkInterfaceSetIpv6AddressesDetails\nAwsEc2LaunchTemplateDataNetworkInterfaceSetIpv6PrefixesDetails\nAwsEc2LaunchTemplateDataNetworkInterfaceSetPrivateIpAddressesDetails\nAwsEc2LaunchTemplateDataPlacementDetails\nAwsEc2LaunchTemplateDataPrivateDnsNameOptionsDetails\nAwsEc2LaunchTemplateDetails\nAwsEc2NetworkAcl\nAwsEc2NetworkAclAssociation\nAwsEc2NetworkAclDetails\nAwsEc2NetworkAclEntry\nAwsEc2NetworkInterface\nAwsEc2NetworkInterfaceAttachment\nAwsEc2NetworkInterfaceDetails\nAwsEc2NetworkInterfaceIpV6AddressDetail\nAwsEc2NetworkInterfacePrivateIpAddressDetail\nAwsEc2NetworkInterfaceSecurityGroup\nAwsEc2NetworkInterfaceViolation\nAwsEc2NetworkInterfaceViolations\nAwsEc2RouteTable\nAwsEc2RouteTableDetails\nAwsEc2SecurityGroup\nAwsEc2SecurityGroupDetails\nAwsEc2SecurityGroupIpPermission\nAwsEc2SecurityGroupIpRange\nAwsEc2SecurityGroupIpv6Range\nAwsEc2SecurityGroupPrefixListId\nAwsEc2SecurityGroupUserIdGroupPair\nAwsEc2Subnet\nAwsEc2SubnetDetails\nAwsEc2TransitGateway\nAwsEc2TransitGatewayDetails\nAwsEc2Volume\nAwsEc2VolumeAttachment\nAwsEc2VolumeDetails\nAwsEc2Vpc\nAwsEc2VpcDetails\nAwsEc2VpcEndpointService\nAwsEc2VpcEndpointServiceDetails\nAwsEc2VpcEndpointServiceServiceTypeDetails\nAwsEc2VpcPeeringConnection\nAwsEc2VpcPeeringConnectionDetails\nAwsEc2VpcPeeringConnectionStatusDetails\nAwsEc2VpcPeeringConnectionVpcInfoDetails\nAwsEc2VpnConnection\nAwsEc2VpnConnectionDetails\nAwsEc2VpnConnectionOptionsDetails\nAwsEc2VpnConnectionOptionsTunnelOptionsDetails\nAwsEc2VpnConnectionRoutesDetails\nAwsEc2VpnConnectionVgwTelemetryDetails\nAwsEcrContainerAggregation\nAwsEcrContainerAggregationResponse\nAwsEcrContainerImage\nAwsEcrContainerImageDetails\nAwsEcrRepository\nAwsEcrRepositoryDetails\nAwsEcrRepositoryImageScanningConfigurationDetails\nAwsEcrRepositoryLifecyclePolicyDetails\nAwsEcsCluster\nAwsEcsClusterClusterSettingsDetails\nAwsEcsClusterConfigurationDetails\nAwsEcsClusterConfigurationExecuteCommandConfigurationDetails\nAwsEcsClusterConfigurationExecuteCommandConfigurationLogConfigurationDetails\nAwsEcsClusterDefaultCapacityProviderStrategyDetails\nAwsEcsClusterDetails\nAwsEcsContainer\nAwsEcsContainerDetails\nAwsEcsService\nAwsEcsServiceCapacityProviderStrategyDetails\nAwsEcsServiceDeploymentConfigurationDeploymentCircuitBreakerDetails\nAwsEcsServiceDeploymentConfigurationDetails\nAwsEcsServiceDeploymentControllerDetails\nAwsEcsServiceDetails\nAwsEcsServiceLoadBalancersDetails\nAwsEcsServiceNetworkConfigurationAwsVpcConfigurationDetails\nAwsEcsServiceNetworkConfigurationDetails\nAwsEcsServicePlacementConstraintsDetails\nAwsEcsServicePlacementStrategiesDetails\nAwsEcsServiceServiceRegistriesDetails\nAwsEcsTask\nAwsEcsTaskDefinition\nAwsEcsTaskDefinitionContainerDefinitionsDependsOnDetails\nAwsEcsTaskDefinitionContainerDefinitionsDetails\nAwsEcsTaskDefinitionContainerDefinitionsEnvironmentDetails\nAwsEcsTaskDefinitionContainerDefinitionsEnvironmentFilesDetails\nAwsEcsTaskDefinitionContainerDefinitionsExtraHostsDetails\nAwsEcsTaskDefinitionContainerDefinitionsFirelensConfigurationDetails\nAwsEcsTaskDefinitionContainerDefinitionsHealthCheckDetails\nAwsEcsTaskDefinitionContainerDefinitionsLinuxParametersCapabilitiesDetails\nAwsEcsTaskDefinitionContainerDefinitionsLinuxParametersDetails\nAwsEcsTaskDefinitionContainerDefinitionsLinuxParametersDevicesDetails\nAwsEcsTaskDefinitionContainerDefinitionsLinuxParametersTmpfsDetails\nAwsEcsTaskDefinitionContainerDefinitionsLogConfigurationDetails\nAwsEcsTaskDefinitionContainerDefinitionsLogConfigurationSecretOptionsDetails\nAwsEcsTaskDefinitionContainerDefinitionsMountPointsDetails\nAwsEcsTaskDefinitionContainerDefinitionsPortMappingsDetails\nAwsEcsTaskDefinitionContainerDefinitionsRepositoryCredentialsDetails\nAwsEcsTaskDefinitionContainerDefinitionsResourceRequirementsDetails\nAwsEcsTaskDefinitionContainerDefinitionsSecretsDetails\nAwsEcsTaskDefinitionContainerDefinitionsSystemControlsDetails\nAwsEcsTaskDefinitionContainerDefinitionsUlimitsDetails\nAwsEcsTaskDefinitionContainerDefinitionsVolumesFromDetails\nAwsEcsTaskDefinitionDetails\nAwsEcsTaskDefinitionInferenceAcceleratorsDetails\nAwsEcsTaskDefinitionPlacementConstraintsDetails\nAwsEcsTaskDefinitionProxyConfigurationDetails\nAwsEcsTaskDefinitionProxyConfigurationProxyConfigurationPropertiesDetails\nAwsEcsTaskDefinitionVolumesDetails\nAwsEcsTaskDefinitionVolumesDockerVolumeConfigurationDetails\nAwsEcsTaskDefinitionVolumesEfsVolumeConfigurationAuthorizationConfigDetails\nAwsEcsTaskDefinitionVolumesEfsVolumeConfigurationDetails\nAwsEcsTaskDefinitionVolumesHostDetails\nAwsEcsTaskDetails\nAwsEcsTaskVolumeDetails\nAwsEcsTaskVolumeHostDetails\nAwsEfsAccessPoint\nAwsEfsAccessPointDetails\nAwsEfsAccessPointPosixUserDetails\nAwsEfsAccessPointRootDirectoryCreationInfoDetails\nAwsEfsAccessPointRootDirectoryDetails\nAwsEksCluster\nAwsEksClusterDetails\nAwsEksClusterLoggingClusterLoggingDetails\nAwsEksClusterLoggingDetails\nAwsEksClusterResourcesVpcConfigDetails\nAwsElasticBeanstalkEnvironment\nAwsElasticBeanstalkEnvironmentDetails\nAwsElasticBeanstalkEnvironmentEnvironmentLink\nAwsElasticBeanstalkEnvironmentOptionSetting\nAwsElasticBeanstalkEnvironmentTier\nAwsElasticsearchDomain\nAwsElasticsearchDomainDetails\nAwsElasticsearchDomainDomainEndpointOptions\nAwsElasticsearchDomainElasticsearchClusterConfigDetails\nAwsElasticsearchDomainElasticsearchClusterConfigZoneAwarenessConfigDetails\nAwsElasticsearchDomainEncryptionAtRestOptions\nAwsElasticsearchDomainLogPublishingOptions\nAwsElasticsearchDomainLogPublishingOptionsLogConfig\nAwsElasticsearchDomainNodeToNodeEncryptionOptions\nAwsElasticsearchDomainServiceSoftwareOptions\nAwsElasticsearchDomainVPCOptions\nAwsElbAppCookieStickinessPolicy\nAwsElbLbCookieStickinessPolicy\nAwsElbLoadBalancer\nAwsElbLoadBalancerAccessLog\nAwsElbLoadBalancerAdditionalAttribute\nAwsElbLoadBalancerAttributes\nAwsElbLoadBalancerBackendServerDescription\nAwsElbLoadBalancerConnectionDraining\nAwsElbLoadBalancerConnectionSettings\nAwsElbLoadBalancerCrossZoneLoadBalancing\nAwsElbLoadBalancerDetails\nAwsElbLoadBalancerHealthCheck\nAwsElbLoadBalancerInstance\nAwsElbLoadBalancerListener\nAwsElbLoadBalancerListenerDescription\nAwsElbLoadBalancerPolicies\nAwsElbLoadBalancerSourceSecurityGroup\nAwsElbv2LoadBalancer\nAwsElbv2LoadBalancerAttribute\nAwsElbv2LoadBalancerDetails\nAwsEventSchemasRegistry\nAwsEventSchemasRegistryDetails\nAwsGroundStationAgentEndpoint\nAwsGuardDutyDetector\nAwsGuardDutyDetectorDataSourcesCloudTrailDetails\nAwsGuardDutyDetectorDataSourcesDetails\nAwsGuardDutyDetectorDataSourcesDnsLogsDetails\nAwsGuardDutyDetectorDataSourcesFlowLogsDetails\nAwsGuardDutyDetectorDataSourcesKubernetesAuditLogsDetails\nAwsGuardDutyDetectorDataSourcesKubernetesDetails\nAwsGuardDutyDetectorDataSourcesMalwareProtectionDetails\nAwsGuardDutyDetectorDataSourcesMalwareProtectionScanEc2InstanceWithFindingsDetails\nAwsGuardDutyDetectorDataSourcesMalwareProtectionScanEc2InstanceWithFindingsEbsVolumesDetails\nAwsGuardDutyDetectorDataSourcesS3LogsDetails\nAwsGuardDutyDetectorDetails\nAwsGuardDutyDetectorFeaturesDetails\nAwsHardwareCertificate\nAwsIamAccessKey\nAwsIamAccessKeyDetails\nAwsIamAccessKeySessionContext\nAwsIamAccessKeySessionContextAttributes\nAwsIamAccessKeySessionContextSessionIssuer\nAwsIamAttachedManagedPolicy\nAwsIamConfig\nAwsIamGroup\nAwsIamGroupDetails\nAwsIamGroupPolicy\nAwsIamInstanceProfile\nAwsIamInstanceProfileRole\nAwsIamPermissionsBoundary\nAwsIamPolicy\nAwsIamPolicyDetails\nAwsIamPolicyVersion\nAwsIamRole\nAwsIamRoleDetails\nAwsIamRolePolicy\nAwsIamUser\nAwsIamUserDetails\nAwsIamUserPolicy\nAwsIdentity\nAwsIotAnalyticsParameters\nAwsJobAbortConfig\nAwsJobAbortCriteria\nAwsJobExecutionsRolloutConfig\nAwsJobExponentialRolloutRate\nAwsJobPresignedUrlConfig\nAwsJobRateIncreaseCriteria\nAwsJobTimeoutConfig\nAwsKinesisStream\nAwsKinesisStreamDetails\nAwsKinesisStreamStreamEncryptionDetails\nAwsKmsKey\nAwsKmsKeyArn\nAwsKmsKeyDetails\nAwsKmsKeyId\nAwsLambdaFunction\nAwsLambdaFunctionCode\nAwsLambdaFunctionDeadLetterConfig\nAwsLambdaFunctionDetails\nAwsLambdaFunctionEnvironment\nAwsLambdaFunctionEnvironmentError\nAwsLambdaFunctionLayer\nAwsLambdaFunctionTracingConfig\nAwsLambdaFunctionVpcConfig\nAwsLambdaLayerVersion\nAwsLambdaLayerVersionDetails\nAwsLambdaTransformation\nAwsLogSourceConfiguration\nAwsLogSourceResource\nAwsManaged\nAwsManagedHumanLoopRequestSource\nAwsManagedResources\nAwsMountPoint\nAwsNetworkFirewallFirewall\nAwsNetworkFirewallFirewallDetails\nAwsNetworkFirewallFirewallPolicy\nAwsNetworkFirewallFirewallPolicyDetails\nAwsNetworkFirewallFirewallSubnetMappingsDetails\nAwsNetworkFirewallRuleGroup\nAwsNetworkFirewallRuleGroupDetails\nAwsOpenSearchServiceDomain\nAwsOpenSearchServiceDomainAdvancedSecurityOptionsDetails\nAwsOpenSearchServiceDomainClusterConfigDetails\nAwsOpenSearchServiceDomainClusterConfigZoneAwarenessConfigDetails\nAwsOpenSearchServiceDomainDetails\nAwsOpenSearchServiceDomainDomainEndpointOptionsDetails\nAwsOpenSearchServiceDomainEncryptionAtRestOptionsDetails\nAwsOpenSearchServiceDomainLogPublishingOption\nAwsOpenSearchServiceDomainLogPublishingOptionsDetails\nAwsOpenSearchServiceDomainMasterUserOptionsDetails\nAwsOpenSearchServiceDomainNodeToNodeEncryptionOptionsDetails\nAwsOpenSearchServiceDomainServiceSoftwareOptionsDetails\nAwsOpenSearchServiceDomainVpcOptionsDetails\nAwsOrg\nAwsOrganizationsSource\nAwsRdsDbCluster\nAwsRdsDbClusterAssociatedRole\nAwsRdsDbClusterDetails\nAwsRdsDbClusterMember\nAwsRdsDbClusterOptionGroupMembership\nAwsRdsDbClusterSnapshot\nAwsRdsDbClusterSnapshotDbClusterSnapshotAttribute\nAwsRdsDbClusterSnapshotDetails\nAwsRdsDbDomainMembership\nAwsRdsDbInstance\nAwsRdsDbInstanceAssociatedRole\nAwsRdsDbInstanceDetails\nAwsRdsDbInstanceEndpoint\nAwsRdsDbInstanceVpcSecurityGroup\nAwsRdsDbOptionGroupMembership\nAwsRdsDbParameterGroup\nAwsRdsDbPendingModifiedValues\nAwsRdsDbProcessorFeature\nAwsRdsDbSecurityGroup\nAwsRdsDbSecurityGroupDetails\nAwsRdsDbSecurityGroupEc2SecurityGroup\nAwsRdsDbSecurityGroupIpRange\nAwsRdsDbSnapshot\nAwsRdsDbSnapshotDetails\nAwsRdsDbStatusInfo\nAwsRdsDbSubnetGroup\nAwsRdsDbSubnetGroupSubnet\nAwsRdsDbSubnetGroupSubnetAvailabilityZone\nAwsRdsEventSubscription\nAwsRdsEventSubscriptionDetails\nAwsRdsPendingCloudWatchLogsExports\nAwsRedshiftCluster\nAwsRedshiftClusterClusterNode\nAwsRedshiftClusterClusterParameterGroup\nAwsRedshiftClusterClusterParameterStatus\nAwsRedshiftClusterClusterSecurityGroup\nAwsRedshiftClusterClusterSnapshotCopyStatus\nAwsRedshiftClusterDeferredMaintenanceWindow\nAwsRedshiftClusterDetails\nAwsRedshiftClusterElasticIpStatus\nAwsRedshiftClusterEndpoint\nAwsRedshiftClusterHsmStatus\nAwsRedshiftClusterIamRole\nAwsRedshiftClusterLoggingStatus\nAwsRedshiftClusterPendingModifiedValues\nAwsRedshiftClusterResizeInfo\nAwsRedshiftClusterRestoreStatus\nAwsRedshiftClusterVpcSecurityGroup\nAwsRegion\nAwsRegions\nAwsS3AccountPublicAccessBlock\nAwsS3AccountPublicAccessBlockDetails\nAwsS3Bucket\nAwsS3BucketBucketLifecycleConfigurationDetails\nAwsS3BucketBucketLifecycleConfigurationRulesAbortIncompleteMultipartUploadDetails\nAwsS3BucketBucketLifecycleConfigurationRulesDetails\nAwsS3BucketBucketLifecycleConfigurationRulesFilterDetails\nAwsS3BucketBucketLifecycleConfigurationRulesFilterPredicateDetails\nAwsS3BucketBucketLifecycleConfigurationRulesFilterPredicateOperandsDetails\nAwsS3BucketBucketLifecycleConfigurationRulesFilterPredicateOperandsTagDetails\nAwsS3BucketBucketLifecycleConfigurationRulesFilterPredicateTagDetails\nAwsS3BucketBucketLifecycleConfigurationRulesNoncurrentVersionTransitionsDetails\nAwsS3BucketBucketLifecycleConfigurationRulesTransitionsDetails\nAwsS3BucketBucketVersioningConfiguration\nAwsS3BucketDetails\nAwsS3BucketLoggingConfiguration\nAwsS3BucketNotificationConfiguration\nAwsS3BucketNotificationConfigurationDetail\nAwsS3BucketNotificationConfigurationFilter\nAwsS3BucketNotificationConfigurationS3KeyFilter\nAwsS3BucketNotificationConfigurationS3KeyFilterRule\nAwsS3BucketObjectLockConfiguration\nAwsS3BucketObjectLockConfigurationRuleDefaultRetentionDetails\nAwsS3BucketObjectLockConfigurationRuleDetails\nAwsS3BucketServerSideEncryptionByDefault\nAwsS3BucketServerSideEncryptionConfiguration\nAwsS3BucketServerSideEncryptionRule\nAwsS3BucketWebsiteConfiguration\nAwsS3BucketWebsiteConfigurationRedirectTo\nAwsS3BucketWebsiteConfigurationRoutingRule\nAwsS3BucketWebsiteConfigurationRoutingRuleCondition\nAwsS3BucketWebsiteConfigurationRoutingRuleRedirect\nAwsS3Object\nAwsS3ObjectDetails\nAwsSageMakerNotebookInstance\nAwsSageMakerNotebookInstanceDetails\nAwsSageMakerNotebookInstanceMetadataServiceConfigurationDetails\nAwsSecretsManagerSecret\nAwsSecretsManagerSecretDetails\nAwsSecretsManagerSecretRotationRules\nAwsSecurityFinding\nAwsSecurityFindingFilters\nAwsSecurityFindingIdentifier\nAwsService\nAwsSnsTopic\nAwsSnsTopicDetails\nAwsSnsTopicSubscription\nAwsSqsQueue\nAwsSqsQueueDetails\nAwsSsmComplianceSummary\nAwsSsmPatch\nAwsSsmPatchCompliance\nAwsSsmPatchComplianceDetails\nAwsSsoAuthentication\nAwsStepFunctionStateMachine\nAwsStepFunctionStateMachineDetails\nAwsStepFunctionStateMachineLoggingConfigurationDestinationsCloudWatchLogsLogGroupDetails\nAwsStepFunctionStateMachineLoggingConfigurationDestinationsDetails\nAwsStepFunctionStateMachineLoggingConfigurationDetails\nAwsStepFunctionStateMachineTracingConfigurationDetails\nAwsTagKey\nAwsTagValue\nAwsUserPoolsId\nAwsUserPoolsWebClientId\nAwsVPCSecurityGroupViolation\nAwsVpcConfiguration\nAwsWafRateBasedRule\nAwsWafRateBasedRuleDetails\nAwsWafRateBasedRuleMatchPredicate\nAwsWafRegionalRateBasedRule\nAwsWafRegionalRateBasedRuleDetails\nAwsWafRegionalRateBasedRuleMatchPredicate\nAwsWafRegionalRule\nAwsWafRegionalRuleDetails\nAwsWafRegionalRuleGroup\nAwsWafRegionalRuleGroupDetails\nAwsWafRegionalRuleGroupRulesActionDetails\nAwsWafRegionalRuleGroupRulesDetails\nAwsWafRegionalRulePredicateListDetails\nAwsWafRegionalWebAcl\nAwsWafRegionalWebAclDetails\nAwsWafRegionalWebAclRulesListActionDetails\nAwsWafRegionalWebAclRulesListDetails\nAwsWafRegionalWebAclRulesListOverrideActionDetails\nAwsWafRule\nAwsWafRuleDetails\nAwsWafRuleGroup\nAwsWafRuleGroupDetails\nAwsWafRuleGroupRulesActionDetails\nAwsWafRuleGroupRulesDetails\nAwsWafRulePredicateListDetails\nAwsWafWebAcl\nAwsWafWebAclDetails\nAwsWafWebAclRule\nAwsWafv2ActionAllowDetails\nAwsWafv2ActionBlockDetails\nAwsWafv2CustomHttpHeader\nAwsWafv2CustomRequestHandlingDetails\nAwsWafv2CustomResponseDetails\nAwsWafv2RuleGroup\nAwsWafv2RuleGroupDetails\nAwsWafv2RulesActionCaptchaDetails\nAwsWafv2RulesActionCountDetails\nAwsWafv2RulesActionDetails\nAwsWafv2RulesDetails\nAwsWafv2VisibilityConfigDetails\nAwsWafv2WebAcl\nAwsWafv2WebAclActionDetails\nAwsWafv2WebAclCaptchaConfigDetails\nAwsWafv2WebAclCaptchaConfigImmunityTimePropertyDetails\nAwsWafv2WebAclDetails\nAwsXrayEncryptionConfig\nAwsXrayEncryptionConfigDetails\nAxesRangeScale\nAxisBinding\nAxisDataOptions\nAxisDisplayMinMaxRange\nAxisDisplayOptions\nAxisDisplayRange\nAxisLabelOptions\nAxisLabelReferenceOptions\nAxisLineVisibility\nAxisLinearScale\nAxisLogarithmicScale\nAxisOffset\nAxisOptions\nAxisScale\nAxisTickLabelOptions\nAzureBlobSasConfiguration\nB\nBGPPeer\nBS\nBabelfishDatabaseName\nBackTestAnomalyDetectorRequest\nBackTestConfiguration\nBackTestWindowOffset\nBackendAPIAppSyncAuthSettings\nBackendAPIAuthType\nBackendAPIConflictResolution\nBackendAPIResourceConfig\nBackendAuthAppleProviderConfig\nBackendAuthSocialProviderConfig\nBackendConnectionErrors\nBackendDefaults\nBackendEnvironment\nBackendEnvironmentList\nBackendEnvironmentName\nBackendJobRespObj\nBackendManagerAppId\nBackendServerDescription\nBackendServerDescriptions\nBackendStoragePermissions\nBackfillError\nBackfillErrors\nBackfillMode\nBackfilling\nBackground\nBackgroundColor\nBackgroundOpacity\nBackgroundStyle\nBackgroundVisibility\nBackint\nBackintConfig\nBackintMode\nBacktestResults\nBacktrackConsumedChangeRecords\nBacktrackDBClusterMessage\nBacktrackIdentifier\nBacktrackRequestCreationTime\nBacktrackTo\nBacktrackWindow\nBacktrackedFrom\nBackup\nBackupArn\nBackupBeingCopied\nBackupCreationDateTime\nBackupDescription\nBackupDetails\nBackupExpiryDateTime\nBackupFailureDetails\nBackupId\nBackupIds\nBackupInProgress\nBackupInUseException\nBackupJob\nBackupJobId\nBackupJobs\nBackupName\nBackupNotFound\nBackupNotFoundException\nBackupObject\nBackupOptions\nBackupPlan\nBackupPlanArn\nBackupPlanDocument\nBackupPlanId\nBackupPlanInput\nBackupPlanName\nBackupPlanRule\nBackupPlanTags\nBackupPlanTemplateId\nBackupPlanTemplateJson\nBackupPlanTemplateName\nBackupPlanTemplatesList\nBackupPlanTemplatesListMember\nBackupPlanVersion\nBackupPlanVersionsList\nBackupPlansList\nBackupPlansListMember\nBackupPolicy\nBackupPolicyDescription\nBackupPolicyNotFoundFault\nBackupProgressInMegaBytes\nBackupRestoring\nBackupRetentionCount\nBackupRetentionPeriod\nBackupRetentionPolicy\nBackupRule\nBackupRuleId\nBackupRuleInput\nBackupSelection\nBackupSelectionsList\nBackupSelectionsListMember\nBackupSizeBytes\nBackupSizeInBytes\nBackupState\nBackupStatus\nBackupSummaries\nBackupSummary\nBackupTarget\nBackupType\nBackupVaultAccountId\nBackupVaultArn\nBackupVaultEvents\nBackupVaultList\nBackupVaultListMember\nBackupVaultName\nBackupVaultTags\nBackups\nBadDocumentException\nBadGatewayException\nBadRequest\nBadRequestDetail\nBadRequestException\nBadge\nBaidu\nBaiduChannelRequest\nBaiduChannelResponse\nBaiduMessage\nBalancingStrategy\nBandFilter\nBandMathConfigInput\nBandName\nBandwidth\nBandwidthRateLimitInterval\nBandwidthRateLimitIntervals\nBandwidthReductionFilter\nBandwidthType\nBannerText\nBarChartAggregatedFieldWells\nBarChartConfiguration\nBarChartFieldWells\nBarChartSortConfiguration\nBarChartVisual\nBarDataLabels\nBarValues\nBareMetal\nBarsArrangement\nBase\nBase32StringSeed\nBase64String\nBaseCanaryRunId\nBaseConfigurationItem\nBaseConfigurationItems\nBaseDirectory\nBaseEndpointDnsNames\nBaseException\nBaseImage\nBaseImageArn\nBaseKpiResult\nBaseLat\nBaseLensVersion\nBaseLng\nBaseMapStyle\nBaseModelName\nBasePath\nBasePathMapping\nBasePathMappings\nBasePathUpdate\nBaseScore\nBaseScreenshot\nBaseScreenshots\nBaseSeriesSettings\nBaseStationId\nBaseThemeId\nBaseUrl\nBaseUrlContent\nBaseUrlContent1\nBaseUrlManifest\nBaseUrlManifest1\nBaseVector\nBasedOnSpiceSchedule\nBaseline\nBaselineBandwidthInGbps\nBaselineBandwidthInMbps\nBaselineConfig\nBaselineData\nBaselineDescription\nBaselineEbsBandwidthMbps\nBaselineEbsBandwidthMbpsRequest\nBaselineId\nBaselineIdentities\nBaselineIdentity\nBaselineIops\nBaselineMetric\nBaselineMetrics\nBaselineName\nBaselineOverride\nBaselineThroughputInMBps\nBaselineUsedForDriftCheckConstraints\nBaselineUsedForDriftCheckStatistics\nBaseliningJobName\nBasepath\nBasicAuthCredentials\nBasicAuthParameters\nBasicAuthSecretId\nBasicAuthentication\nBasicAuthenticationConfiguration\nBasicCatalogTarget\nBasicLayout\nBatch\nBatchAcknowledgeAlarmRequest\nBatchAcknowledgeAlarmResponse\nBatchAddFacetToObject\nBatchAlarmActionErrorEntry\nBatchApplyUpdateActionMessage\nBatchArrayProperties\nBatchAssociateApprovalRuleTemplateWithRepositoriesError\nBatchAssociateApprovalRuleTemplateWithRepositoriesInput\nBatchAssociateApprovalRuleTemplateWithRepositoriesOutput\nBatchAssociateAssessmentReportEvidenceRequest\nBatchAssociateAssessmentReportEvidenceResponse\nBatchAssociateClientDeviceWithCoreDeviceRequest\nBatchAssociateClientDeviceWithCoreDeviceResponse\nBatchAssociateProjectAssetsRequest\nBatchAssociateProjectAssetsResponse\nBatchAssociateResourceRequest\nBatchAssociateResourceResponse\nBatchAssociateResourcesToCustomLineItemInput\nBatchAssociateResourcesToCustomLineItemOutput\nBatchAssociateScramSecretRequest\nBatchAssociateScramSecretResponse\nBatchAssociateServiceActionWithProvisioningArtifactInput\nBatchAssociateServiceActionWithProvisioningArtifactOutput\nBatchAssociateUserStackRequest\nBatchAssociateUserStackResult\nBatchAttachObject\nBatchAttachObjectResponse\nBatchAttachPolicy\nBatchAttachToIndex\nBatchAttachToIndexResponse\nBatchAttachTypedLink\nBatchAttachTypedLinkResponse\nBatchChannelMemberships\nBatchCheckLayerAvailabilityRequest\nBatchCheckLayerAvailabilityResponse\nBatchContainerOverrides\nBatchCount\nBatchCreateAttendeeRequest\nBatchCreateAttendeeResponse\nBatchCreateChannelMembershipError\nBatchCreateChannelMembershipRequest\nBatchCreateChannelMembershipResponse\nBatchCreateCustomVocabularyItemRequest\nBatchCreateCustomVocabularyItemResponse\nBatchCreateDelegationByAssessmentError\nBatchCreateDelegationByAssessmentRequest\nBatchCreateDelegationByAssessmentResponse\nBatchCreateIndex\nBatchCreateIndexResponse\nBatchCreateObject\nBatchCreateObjectResponse\nBatchCreatePartitionRequest\nBatchCreatePartitionResponse\nBatchCreateRoomMembershipRequest\nBatchCreateRoomMembershipResponse\nBatchCreateRumMetricDefinitionsError\nBatchCreateRumMetricDefinitionsRequest\nBatchCreateRumMetricDefinitionsResponse\nBatchCreateTableRowsRequest\nBatchCreateTableRowsResult\nBatchCreateVariableError\nBatchCreateVariableRequest\nBatchCreateVariableResult\nBatchCreateVehicleRequest\nBatchCreateVehicleResponse\nBatchDataCaptureConfig\nBatchDeleteAutomationRulesRequest\nBatchDeleteAutomationRulesResponse\nBatchDeleteBuildsInput\nBatchDeleteBuildsOutput\nBatchDeleteClusterSnapshotsRequest\nBatchDeleteClusterSnapshotsResult\nBatchDeleteConnectionRequest\nBatchDeleteConnectionResponse\nBatchDeleteCustomVocabularyItemRequest\nBatchDeleteCustomVocabularyItemResponse\nBatchDeleteDelegationByAssessmentError\nBatchDeleteDelegationByAssessmentRequest\nBatchDeleteDelegationByAssessmentResponse\nBatchDeleteDetectorErrorEntry\nBatchDeleteDetectorRequest\nBatchDeleteDetectorResponse\nBatchDeleteDevicePositionHistoryError\nBatchDeleteDevicePositionHistoryRequest\nBatchDeleteDevicePositionHistoryResponse\nBatchDeleteDocumentRequest\nBatchDeleteDocumentResponse\nBatchDeleteDocumentResponseFailedDocument\nBatchDeleteFeaturedResultsSetError\nBatchDeleteFeaturedResultsSetRequest\nBatchDeleteFeaturedResultsSetResponse\nBatchDeleteGeofenceError\nBatchDeleteGeofenceRequest\nBatchDeleteGeofenceResponse\nBatchDeleteImageRequest\nBatchDeleteImageResponse\nBatchDeleteImportDataError\nBatchDeleteImportDataRequest\nBatchDeleteImportDataResponse\nBatchDeleteObject\nBatchDeletePartitionRequest\nBatchDeletePartitionResponse\nBatchDeletePhoneNumberRequest\nBatchDeletePhoneNumberResponse\nBatchDeleteReadSetRequest\nBatchDeleteReadSetResponse\nBatchDeleteRecipeVersionRequest\nBatchDeleteRecipeVersionResponse\nBatchDeleteRequest\nBatchDeleteRequestSizeExceededFault\nBatchDeleteResponse\nBatchDeleteRumMetricDefinitionsError\nBatchDeleteRumMetricDefinitionsRequest\nBatchDeleteRumMetricDefinitionsResponse\nBatchDeleteScheduledActionAnswer\nBatchDeleteScheduledActionType\nBatchDeleteTableRequest\nBatchDeleteTableResponse\nBatchDeleteTableRowsRequest\nBatchDeleteTableRowsResult\nBatchDeleteTableVersionRequest\nBatchDeleteTableVersionResponse\nBatchDeleteWorldsRequest\nBatchDeleteWorldsResponse\nBatchDescribeMergeConflictsError\nBatchDescribeMergeConflictsInput\nBatchDescribeMergeConflictsOutput\nBatchDescribeModelPackageError\nBatchDescribeModelPackageErrorMap\nBatchDescribeModelPackageInput\nBatchDescribeModelPackageOutput\nBatchDescribeModelPackageSummary\nBatchDescribeSimulationJobRequest\nBatchDescribeSimulationJobResponse\nBatchDescribeTypeConfigurationsError\nBatchDescribeTypeConfigurationsInput\nBatchDescribeTypeConfigurationsOutput\nBatchDetachFromIndex\nBatchDetachFromIndexResponse\nBatchDetachObject\nBatchDetachObjectResponse\nBatchDetachPolicy\nBatchDetachTypedLink\nBatchDetectDominantLanguageItemResult\nBatchDetectDominantLanguageRequest\nBatchDetectDominantLanguageResponse\nBatchDetectEntitiesItemResult\nBatchDetectEntitiesRequest\nBatchDetectEntitiesResponse\nBatchDetectKeyPhrasesItemResult\nBatchDetectKeyPhrasesRequest\nBatchDetectKeyPhrasesResponse\nBatchDetectSentimentItemResult\nBatchDetectSentimentRequest\nBatchDetectSentimentResponse\nBatchDetectSyntaxItemResult\nBatchDetectSyntaxRequest\nBatchDetectSyntaxResponse\nBatchDetectTargetedSentimentItemResult\nBatchDetectTargetedSentimentRequest\nBatchDetectTargetedSentimentResponse\nBatchDisableAlarmRequest\nBatchDisableAlarmResponse\nBatchDisableStandardsRequest\nBatchDisableStandardsResponse\nBatchDisassociateApprovalRuleTemplateFromRepositoriesError\nBatchDisassociateApprovalRuleTemplateFromRepositoriesInput\nBatchDisassociateApprovalRuleTemplateFromRepositoriesOutput\nBatchDisassociateAssessmentReportEvidenceRequest\nBatchDisassociateAssessmentReportEvidenceResponse\nBatchDisassociateClientDeviceFromCoreDeviceRequest\nBatchDisassociateClientDeviceFromCoreDeviceResponse\nBatchDisassociateProjectAssetsRequest\nBatchDisassociateProjectAssetsResponse\nBatchDisassociateResourceRequest\nBatchDisassociateResourceResponse\nBatchDisassociateResourcesFromCustomLineItemInput\nBatchDisassociateResourcesFromCustomLineItemOutput\nBatchDisassociateScramSecretRequest\nBatchDisassociateScramSecretResponse\nBatchDisassociateServiceActionFromProvisioningArtifactInput\nBatchDisassociateServiceActionFromProvisioningArtifactOutput\nBatchDisassociateUserStackRequest\nBatchDisassociateUserStackResult\nBatchEnableAlarmRequest\nBatchEnableAlarmResponse\nBatchEnableStandardsRequest\nBatchEnableStandardsResponse\nBatchEntryIdsNotDistinctException\nBatchEnvironmentVariable\nBatchError\nBatchEvaluateFeatureRequest\nBatchEvaluateFeatureResponse\nBatchEvaluateGeofencesError\nBatchEvaluateGeofencesRequest\nBatchEvaluateGeofencesResponse\nBatchExecuteStatementException\nBatchExecuteStatementInput\nBatchExecuteStatementOutput\nBatchExecuteStatementRequest\nBatchExecuteStatementResponse\nBatchFailedResultModel\nBatchGetAccountStatusRequest\nBatchGetAccountStatusResponse\nBatchGetAggregateResourceConfigRequest\nBatchGetAggregateResourceConfigResponse\nBatchGetApplicationRevisionsInput\nBatchGetApplicationRevisionsOutput\nBatchGetApplicationsInput\nBatchGetApplicationsOutput\nBatchGetAssetPropertyAggregatesEntry\nBatchGetAssetPropertyAggregatesErrorEntry\nBatchGetAssetPropertyAggregatesErrorInfo\nBatchGetAssetPropertyAggregatesRequest\nBatchGetAssetPropertyAggregatesResponse\nBatchGetAssetPropertyAggregatesSkippedEntry\nBatchGetAssetPropertyAggregatesSuccessEntry\nBatchGetAssetPropertyValueEntry\nBatchGetAssetPropertyValueErrorEntry\nBatchGetAssetPropertyValueErrorInfo\nBatchGetAssetPropertyValueHistoryEntry\nBatchGetAssetPropertyValueHistoryErrorEntry\nBatchGetAssetPropertyValueHistoryErrorInfo\nBatchGetAssetPropertyValueHistoryRequest\nBatchGetAssetPropertyValueHistoryResponse\nBatchGetAssetPropertyValueHistorySkippedEntry\nBatchGetAssetPropertyValueHistorySuccessEntry\nBatchGetAssetPropertyValueRequest\nBatchGetAssetPropertyValueResponse\nBatchGetAssetPropertyValueSkippedEntry\nBatchGetAssetPropertyValueSuccessEntry\nBatchGetAutomationRulesRequest\nBatchGetAutomationRulesResponse\nBatchGetBlueprintsRequest\nBatchGetBlueprintsResponse\nBatchGetBuildBatchesInput\nBatchGetBuildBatchesOutput\nBatchGetBuildsInput\nBatchGetBuildsOutput\nBatchGetChannelRequest\nBatchGetChannelResponse\nBatchGetCodeSnippetRequest\nBatchGetCodeSnippetResponse\nBatchGetCollaborationAnalysisTemplateError\nBatchGetCollaborationAnalysisTemplateInput\nBatchGetCollaborationAnalysisTemplateOutput\nBatchGetCollectionRequest\nBatchGetCollectionResponse\nBatchGetCommitsError\nBatchGetCommitsInput\nBatchGetCommitsOutput\nBatchGetCrawlersRequest\nBatchGetCrawlersResponse\nBatchGetCustomDataIdentifierSummary\nBatchGetCustomDataIdentifiersRequest\nBatchGetCustomDataIdentifiersResponse\nBatchGetCustomEntityTypesRequest\nBatchGetCustomEntityTypesResponse\nBatchGetDataQualityResultRequest\nBatchGetDataQualityResultResponse\nBatchGetDeploymentGroupsInput\nBatchGetDeploymentGroupsOutput\nBatchGetDeploymentInstancesInput\nBatchGetDeploymentInstancesOutput\nBatchGetDeploymentTargetsInput\nBatchGetDeploymentTargetsOutput\nBatchGetDeploymentsInput\nBatchGetDeploymentsOutput\nBatchGetDevEndpointsRequest\nBatchGetDevEndpointsResponse\nBatchGetDevicePositionError\nBatchGetDevicePositionRequest\nBatchGetDevicePositionResponse\nBatchGetDocumentStatusRequest\nBatchGetDocumentStatusResponse\nBatchGetDocumentStatusResponseError\nBatchGetFieldRequest\nBatchGetFieldResponse\nBatchGetFindingDetailsRequest\nBatchGetFindingDetailsResponse\nBatchGetFindingsError\nBatchGetFindingsRequest\nBatchGetFindingsResponse\nBatchGetFrameMetricDataRequest\nBatchGetFrameMetricDataResponse\nBatchGetFreeTrialInfoRequest\nBatchGetFreeTrialInfoResponse\nBatchGetGraphMemberDatasourcesRequest\nBatchGetGraphMemberDatasourcesResponse\nBatchGetImageRequest\nBatchGetImageResponse\nBatchGetItemInput\nBatchGetItemOutput\nBatchGetJobsRequest\nBatchGetJobsResponse\nBatchGetLinkAttributes\nBatchGetLinkAttributesResponse\nBatchGetMemberEc2DeepInspectionStatusRequest\nBatchGetMemberEc2DeepInspectionStatusResponse\nBatchGetMembershipDatasourcesRequest\nBatchGetMembershipDatasourcesResponse\nBatchGetMetricDataQuery\nBatchGetMetricDataRequest\nBatchGetMetricDataResponse\nBatchGetNamedQueryInput\nBatchGetNamedQueryOutput\nBatchGetObjectAttributes\nBatchGetObjectAttributesResponse\nBatchGetObjectInformation\nBatchGetObjectInformationResponse\nBatchGetOnPremisesInstancesInput\nBatchGetOnPremisesInstancesOutput\nBatchGetPartitionRequest\nBatchGetPartitionResponse\nBatchGetPreparedStatementInput\nBatchGetPreparedStatementOutput\nBatchGetProjectsInput\nBatchGetProjectsOutput\nBatchGetQueryExecutionInput\nBatchGetQueryExecutionOutput\nBatchGetRecordError\nBatchGetRecordIdentifier\nBatchGetRecordRequest\nBatchGetRecordResponse\nBatchGetRecordResultDetail\nBatchGetReportGroupsInput\nBatchGetReportGroupsOutput\nBatchGetReportsInput\nBatchGetReportsOutput\nBatchGetRepositoriesInput\nBatchGetRepositoriesOutput\nBatchGetRepositoryScanningConfigurationRequest\nBatchGetRepositoryScanningConfigurationResponse\nBatchGetResourceConfigRequest\nBatchGetResourceConfigResponse\nBatchGetRumMetricDefinitionsRequest\nBatchGetRumMetricDefinitionsResponse\nBatchGetSchemaError\nBatchGetSchemaInput\nBatchGetSchemaOutput\nBatchGetSecurityControlsRequest\nBatchGetSecurityControlsResponse\nBatchGetStandardsControlAssociationsRequest\nBatchGetStandardsControlAssociationsResponse\nBatchGetStreamKeyRequest\nBatchGetStreamKeyResponse\nBatchGetTokenBalanceErrorItem\nBatchGetTokenBalanceInput\nBatchGetTokenBalanceInputItem\nBatchGetTokenBalanceOutput\nBatchGetTokenBalanceOutputItem\nBatchGetTracesRequest\nBatchGetTracesResult\nBatchGetTriggersRequest\nBatchGetTriggersResponse\nBatchGetUserAccessTasksRequest\nBatchGetUserAccessTasksResponse\nBatchGetVariableError\nBatchGetVariableRequest\nBatchGetVariableResult\nBatchGetViewError\nBatchGetViewInput\nBatchGetViewOutput\nBatchGetVpcEndpointRequest\nBatchGetVpcEndpointResponse\nBatchGetWorkflowsRequest\nBatchGetWorkflowsResponse\nBatchGrantPermissionsRequest\nBatchGrantPermissionsResponse\nBatchId\nBatchImport\nBatchImportEvidenceToAssessmentControlError\nBatchImportEvidenceToAssessmentControlRequest\nBatchImportEvidenceToAssessmentControlResponse\nBatchImportFindingsRequest\nBatchImportFindingsResponse\nBatchImportMetaDataOnCreate\nBatchInferenceJob\nBatchInferenceJobConfig\nBatchInferenceJobInput\nBatchInferenceJobOutput\nBatchInferenceJobSummary\nBatchItem\nBatchItemError\nBatchJobDependency\nBatchJobExecutionSummary\nBatchJobParameters\nBatchLimitExceededException\nBatchListAttachedIndices\nBatchListAttachedIndicesResponse\nBatchListIncomingTypedLinks\nBatchListIncomingTypedLinksResponse\nBatchListIndex\nBatchListIndexResponse\nBatchListObjectAttributes\nBatchListObjectAttributesResponse\nBatchListObjectChildren\nBatchListObjectChildrenResponse\nBatchListObjectParentPaths\nBatchListObjectParentPathsResponse\nBatchListObjectParents\nBatchListObjectParentsResponse\nBatchListObjectPolicies\nBatchListObjectPoliciesResponse\nBatchListOutgoingTypedLinks\nBatchListOutgoingTypedLinksResponse\nBatchListPolicyAttachments\nBatchListPolicyAttachmentsResponse\nBatchLoadProgressReport\nBatchLoadTask\nBatchLoadTaskDescription\nBatchLoadTasks\nBatchLookupPolicy\nBatchLookupPolicyResponse\nBatchMeterUsageRequest\nBatchMeterUsageResult\nBatchModifyClusterSnapshotsLimitExceededFault\nBatchModifyClusterSnapshotsMessage\nBatchModifyClusterSnapshotsOutputMessage\nBatchParameters\nBatchPermissionsFailureEntry\nBatchPermissionsRequestEntry\nBatchPolicy\nBatchPrediction\nBatchPredictionDataSourceId\nBatchPredictionId\nBatchPredictionName\nBatchPutAssetPropertyError\nBatchPutAssetPropertyErrorEntry\nBatchPutAssetPropertyValueRequest\nBatchPutAssetPropertyValueResponse\nBatchPutDocumentRequest\nBatchPutDocumentResponse\nBatchPutDocumentResponseFailedDocument\nBatchPutFieldOptionsRequest\nBatchPutFieldOptionsResponse\nBatchPutGeofenceError\nBatchPutGeofenceRequest\nBatchPutGeofenceRequestEntry\nBatchPutGeofenceResponse\nBatchPutGeofenceSuccess\nBatchPutMessageErrorEntries\nBatchPutMessageErrorEntry\nBatchPutMessageRequest\nBatchPutMessageResponse\nBatchPutMetricsError\nBatchPutMetricsRequest\nBatchPutMetricsResponse\nBatchPutPropertyError\nBatchPutPropertyErrorEntry\nBatchPutPropertyValuesRequest\nBatchPutPropertyValuesResponse\nBatchPutScheduledUpdateGroupActionAnswer\nBatchPutScheduledUpdateGroupActionType\nBatchReadException\nBatchReadOperation\nBatchReadOperationResponse\nBatchReadRequest\nBatchReadResponse\nBatchReadSuccessfulResponse\nBatchRecordsEndTime\nBatchRecordsStartTime\nBatchReferenceName\nBatchRemoveFacetFromObject\nBatchRequestTooLongException\nBatchResetAlarmRequest\nBatchResetAlarmResponse\nBatchResourceRequirement\nBatchRestrictions\nBatchResultErrorEntry\nBatchRetryStrategy\nBatchRevokePermissionsRequest\nBatchRevokePermissionsResponse\nBatchScheduleActionCreateRequest\nBatchScheduleActionCreateResult\nBatchScheduleActionDeleteRequest\nBatchScheduleActionDeleteResult\nBatchSegmentJob\nBatchSegmentJobInput\nBatchSegmentJobOutput\nBatchSegmentJobSummary\nBatchSize\nBatchSizeLimitExceededException\nBatchSnoozeAlarmRequest\nBatchSnoozeAlarmResponse\nBatchStartRecommendationsErrorEntry\nBatchStartRecommendationsRequest\nBatchStartRecommendationsResponse\nBatchStartRequest\nBatchStartResponse\nBatchStartViewerSessionRevocationError\nBatchStartViewerSessionRevocationRequest\nBatchStartViewerSessionRevocationResponse\nBatchStartViewerSessionRevocationViewerSession\nBatchStatementError\nBatchStatementRequest\nBatchStatementResponse\nBatchStopJobRunError\nBatchStopJobRunRequest\nBatchStopJobRunResponse\nBatchStopJobRunSuccessfulSubmission\nBatchStopRequest\nBatchStopResponse\nBatchStopUpdateActionMessage\nBatchStrategy\nBatchSuccessfulResultModel\nBatchSuspendUserRequest\nBatchSuspendUserResponse\nBatchTooLarge\nBatchTransformInput\nBatchUnsuspendUserRequest\nBatchUnsuspendUserResponse\nBatchUpdateAttendeeCapabilitiesExceptRequest\nBatchUpdateAutomationRulesRequest\nBatchUpdateAutomationRulesResponse\nBatchUpdateClusterRequest\nBatchUpdateClusterResponse\nBatchUpdateCustomVocabularyItemRequest\nBatchUpdateCustomVocabularyItemResponse\nBatchUpdateDetectorErrorEntry\nBatchUpdateDetectorRequest\nBatchUpdateDetectorResponse\nBatchUpdateDevicePositionError\nBatchUpdateDevicePositionRequest\nBatchUpdateDevicePositionResponse\nBatchUpdateFindingsRequest\nBatchUpdateFindingsResponse\nBatchUpdateFindingsUnprocessedFinding\nBatchUpdateLinkAttributes\nBatchUpdateMemberEc2DeepInspectionStatusRequest\nBatchUpdateMemberEc2DeepInspectionStatusResponse\nBatchUpdateObjectAttributes\nBatchUpdateObjectAttributesResponse\nBatchUpdatePartitionFailureEntry\nBatchUpdatePartitionRequest\nBatchUpdatePartitionRequestEntry\nBatchUpdatePartitionResponse\nBatchUpdatePhoneNumberRequest\nBatchUpdatePhoneNumberResponse\nBatchUpdateRecommendationStatusFailedEntry\nBatchUpdateRecommendationStatusRequest\nBatchUpdateRecommendationStatusResponse\nBatchUpdateRecommendationStatusSuccessfulEntry\nBatchUpdateRuleRequest\nBatchUpdateRuleResponse\nBatchUpdateScheduleRequest\nBatchUpdateScheduleResponse\nBatchUpdateStandardsControlAssociationsRequest\nBatchUpdateStandardsControlAssociationsResponse\nBatchUpdateTableRowsRequest\nBatchUpdateTableRowsResult\nBatchUpdateUserRequest\nBatchUpdateUserResponse\nBatchUpdateVehicleRequest\nBatchUpdateVehicleResponse\nBatchUpsertTableRowsRequest\nBatchUpsertTableRowsResult\nBatchWindow\nBatchWriteException\nBatchWriteItemInput\nBatchWriteItemOutput\nBatchWriteOperation\nBatchWriteOperationResponse\nBatchWriteRequest\nBatchWriteResponse\nBatches\nBatteryLevel\nBccAddresses\nBcch\nBcpPacketSize\nBeaconing\nBeard\nBearerToken\nBefore\nBeforeCommitIdAndAfterCommitIdAreSameException\nBeforeCreationDate\nBegin\nBeginMarker\nBeginOffset\nBeginOffsetChar\nBeginOffsetMillis\nBeginTransactionRequest\nBeginTransactionResponse\nBehavior\nBehaviorCriteria\nBehaviorModelTrainingSummary\nBehaviorOnMXFailure\nBehaviorOnMxFailure\nBehaviorType\nBeneficiary\nBenefitsConsidered\nBerkshelfVersion\nBestCandidate\nBestObjectiveNotImproving\nBestPractice\nBestPractices\nBestTrainingJob\nBgpAsn\nBgpConfigurations\nBgpOptions\nBgpStatus\nBias\nBiasPosition\nBidPrice\nBidPriceAsPercentageOfOnDemandPrice\nBillDate\nBillExpirationException\nBillableTimeInSeconds\nBillableTrainingTimeInSeconds\nBilledSizeBytes\nBillingAddress\nBillingDetails\nBillingEntity\nBillingGroupArn\nBillingGroupArns\nBillingGroupCostReportElement\nBillingGroupCostReports\nBillingGroupListElement\nBillingGroupMetadata\nBillingGroupProperties\nBillingGroups\nBillingMode\nBillingModeOverride\nBillingModeSummary\nBillingPeriod\nBillingPeriodRange\nBillingProducts\nBillingRecord\nBillingRecords\nBillingSubscriptionId\nBillingTagsSource\nBillingToken\nBillingViewArn\nBinCount\nBinCountLimit\nBinCountOptions\nBinOptions\nBinWidth\nBinWidthOptions\nBinaryColumnStatisticsData\nBinaryFile\nBinaryListValues\nBinaryMediaTypes\nBinaryPrefixLocation\nBinaryValue\nBirthDate\nBisectBatchOnFunctionError\nBitDepth\nBitOrder\nBitRate\nBitbucket\nBitrate\nBitrateClass\nBitsPerSecond\nBitstreamMode\nBlackDetectThreshold\nBlackFrame\nBlackFrameMsec\nBlackhole\nBlacklist\nBlacklistEntry\nBlacklistItemNames\nBlacklistReport\nBlackoutSlate\nBlackoutSlateImage\nBlankCellFormat\nBlob\nBlobAttributeValue\nBlobIdDoesNotExistException\nBlobIdRequiredException\nBlobMetadata\nBlobType\nBlock\nBlockAction\nBlockAddress\nBlockData\nBlockDeviceMapping\nBlockDeviceMappingSet\nBlockDeviceMappings\nBlockDurationMinutes\nBlockEmail\nBlockId\nBlockIndex\nBlockListSummaryItems\nBlockOverrideDnsType\nBlockOverrideDomain\nBlockOverrideTtl\nBlockPublicAccess\nBlockPublicAccessConfiguration\nBlockPublicAccessConfigurationMetadata\nBlockPublicAcls\nBlockPublicPolicy\nBlockPublicSecurityGroupRules\nBlockReference\nBlockReferences\nBlockResponse\nBlockSize\nBlockSizeBytes\nBlockToken\nBlockType\nBlockchainInstant\nBlocked\nBlockedException\nBlockedIPRangeList\nBlockedReason\nBlockerDeclaration\nBlocks\nBlogConfiguration\nBlogFieldMappings\nBloomFilterColumns\nBloomFilterFalsePositiveProbability\nBlue\nBlueGreenDeployment\nBlueGreenDeploymentAlreadyExistsFault\nBlueGreenDeploymentConfiguration\nBlueGreenDeploymentIdentifier\nBlueGreenDeploymentName\nBlueGreenDeploymentNotFoundFault\nBlueGreenDeploymentTask\nBlueGreenDeployments\nBlueGreenUpdatePolicy\nBlueInstanceTerminationOption\nBluePrimaryX\nBluePrimaryY\nBlueprint\nBlueprintDetails\nBlueprintLocation\nBlueprintName\nBlueprintRun\nBlueprintRuns\nBlueprintServiceLocation\nBlueprints\nBody\nBodyConfig\nBodyContains\nBodyOverride\nBodyParameters\nBodyParts\nBodySectionConfiguration\nBodySectionContent\nBodySections\nBonusAmount\nBonusPayment\nBonusPayments\nBookingOptions\nBookmarks\nBookmarksConfigurations\nBooleanColumnStatisticsData\nBooleanFilter\nBooleanValue\nBootMode\nBooting\nBootstrapActionConfig\nBootstrapActionDetail\nBootstrapActions\nBootstrapBrokerString\nBootstrapBrokerStringPublicSaslIam\nBootstrapBrokerStringPublicSaslScram\nBootstrapBrokerStringPublicTls\nBootstrapBrokerStringSaslIam\nBootstrapBrokerStringSaslScram\nBootstrapBrokerStringTls\nBootstrapBrokerStringVpcConnectivitySaslIam\nBootstrapBrokerStringVpcConnectivitySaslScram\nBootstrapBrokerStringVpcConnectivityTls\nBootstrapServers\nBorder\nBorderColor\nBorderRadius\nBorderStyle\nBorderThickness\nBorderVisibility\nBorrowConfiguration\nBorrowCount\nBot\nBotAliasHistoryEvent\nBotAliasLocaleSettings\nBotAliasMetadata\nBotAliasSummary\nBotAliasTestExecutionTarget\nBotAliases\nBotChannelAssociation\nBotEmail\nBotExportSpecification\nBotFilter\nBotId\nBotImportSpecification\nBotLocaleExportSpecification\nBotLocaleFilter\nBotLocaleHistoryEvent\nBotLocaleImportSpecification\nBotLocaleSortBy\nBotLocaleSummary\nBotMember\nBotMetadata\nBotName\nBotRecommendationResultStatistics\nBotRecommendationResults\nBotRecommendationSummary\nBotSortBy\nBotSummary\nBotType\nBotVersionLocaleDetails\nBotVersionSortBy\nBotVersionSummary\nBots\nBottom\nBounce\nBounceAction\nBounceSender\nBounceSenderArn\nBounceSubType\nBounceTopic\nBounceType\nBouncedRecipientInfo\nBouncedRecipientInfoList\nBounces\nBoundedFiles\nBoundedSize\nBoundingBox\nBoundingBoxCount\nBounds\nBoxConfiguration\nBoxPlotAggregatedFieldWells\nBoxPlotChartConfiguration\nBoxPlotFieldWells\nBoxPlotOptions\nBoxPlotSortConfiguration\nBoxPlotStyleOptions\nBoxPlotVisual\nBranch\nBranchDiff\nBranchDiffSourceCodeType\nBranchDoesNotExistException\nBranchInfo\nBranchInterfaceId\nBranchName\nBranchNameExistsException\nBranchNameIsTagNameException\nBranchNameRequiredException\nBranchOrder\nBranches\nBrand\nBrandName\nBreachAction\nBreachThreshold\nBreakdownItemsLimit\nBreakdowns\nBreakoutCode\nBridge\nBridgeArn\nBridgeFlowOutput\nBridgeFlowSource\nBridgeMessages\nBridgeNetworkOutput\nBridgeNetworkSource\nBridgeOutput\nBridgePlacement\nBridgePorts\nBridgeSource\nBridgeState\nBridgeType\nBridges\nBrightness\nBroker\nBrokerAZDistribution\nBrokerArn\nBrokerEBSVolumeInfo\nBrokerEngineType\nBrokerEngineTypes\nBrokerId\nBrokerIds\nBrokerInstance\nBrokerInstanceOption\nBrokerInstanceOptions\nBrokerInstances\nBrokerLogs\nBrokerName\nBrokerNodeGroupInfo\nBrokerNodeInfo\nBrokerSoftwareInfo\nBrokerState\nBrokerSummaries\nBrokerSummary\nBrowserSettings\nBrowserSettingsSummary\nBsic\nBucket\nBucketARN\nBucketARNUpdate\nBucketAccessLogConfig\nBucketAccessRoleArn\nBucketAccountId\nBucketArn\nBucketBundle\nBucketColumns\nBucketConfiguration\nBucketCountByEffectivePermission\nBucketCountByEncryptionType\nBucketCountBySharedAccessType\nBucketCountPolicyAllowsUnencryptedObjectUploads\nBucketCriteriaAdditionalProperties\nBucketFolder\nBucketInfo\nBucketKeyEnabled\nBucketLevel\nBucketLevelPermissions\nBucketLifecycleConfiguration\nBucketLoggingConfiguration\nBucketLoggingStatus\nBucketMetadata\nBucketName\nBucketNameFilterRequiredException\nBucketNotFoundFault\nBucketNotificationConfiguration\nBucketOwner\nBucketPermissionConfiguration\nBucketPolicy\nBucketPrefix\nBucketPublicAccess\nBucketRegion\nBucketServerSideEncryption\nBucketSortCriteria\nBucketState\nBucketStatisticsBySensitivity\nBucketVersioningConfiguration\nBucketWebsiteConfiguration\nBuckets\nBucketsAggregationType\nBudget\nBudgetAdjustmentPeriod\nBudgetDetail\nBudgetLimit\nBudgetName\nBudgetNotificationsForAccount\nBudgetPerformanceHistory\nBudgetType\nBudgetedAmount\nBudgetedAndActualAmounts\nBudgetedAndActualAmountsList\nBudgets\nBufFillPct\nBufSize\nBufferDuration\nBufferModel\nBufferMsec\nBufferSegments\nBufferingHints\nBugzillaIds\nBuild\nBuildArn\nBuildArtifacts\nBuildArtifactsObjectKey\nBuildBatch\nBuildBatchFilter\nBuildBatchPhase\nBuildBotLocaleRequest\nBuildBotLocaleResponse\nBuildCommand\nBuildConfiguration\nBuildGroup\nBuildId\nBuildNotDeleted\nBuildPhase\nBuildStatusConfig\nBuildSuggestersRequest\nBuildSuggestersResponse\nBuildSummary\nBuilder\nBuilds\nBuiltInIntentSortBy\nBuiltInIntentSummary\nBuiltInSlotTypeSortBy\nBuiltInSlotTypeSummary\nBuiltinIntentMetadata\nBuiltinIntentSlot\nBuiltinSlotTypeMetadata\nBulkDeployment\nBulkDeploymentArn\nBulkDeploymentId\nBulkDeploymentMetrics\nBulkDeploymentResult\nBulkDeploymentStatus\nBulkDeployments\nBulkEmailContent\nBulkEmailDestination\nBulkEmailDestinationStatus\nBulkEmailEntries\nBulkEmailEntry\nBulkEmailEntryResult\nBulkEmailEntryResults\nBulkLoadIdNotFoundException\nBulkPublishCompleteTime\nBulkPublishRequest\nBulkPublishResponse\nBulkPublishStartTime\nBulkPublishStatus\nBulletPoints\nBumper\nBundle\nBundleDescription\nBundleDetails\nBundleId\nBundleIds\nBundleInformation\nBundleInstanceRequest\nBundleInstanceResult\nBundleName\nBundleTask\nBundleTaskError\nBundleTasks\nBundleType\nBundles\nBurnInDestinationSettings\nBurninDestinationSettings\nBurstablePerformance\nBurstablePerformanceSupported\nBusinessCalling\nBusinessCallingSettings\nBusinessEmailAddress\nBusinessGoals\nBusinessName\nBusinessPhoneNumber\nBusinessReport\nBusinessReportContentRange\nBusinessReportRecurrence\nBusinessReportS3Location\nBusinessReportSchedule\nBusinessReportSchedules\nButton\nButtonAction\nByAccountId\nByBackupPlanId\nByBackupVaultName\nByCompleteAfter\nByCompleteBefore\nByCreatedAfter\nByCreatedBefore\nByCreationAfter\nByCreationBefore\nByDestinationVaultArn\nByParentJobId\nByParentRecoveryPointArn\nByReportPlanName\nByResourceArn\nByResourceType\nByShared\nByState\nByStatus\nByVaultType\nByoipCidr\nByoipCidrEvent\nByoipCidrNotFoundException\nByoipCidrs\nBypassGovernanceRetention\nBypassPolicyLockoutCheck\nBypassPolicyLockoutSafetyCheck\nBypassSnaplockEnterpriseRetention\nByteMatchSet\nByteMatchSetId\nByteMatchSetSummary\nByteMatchSetUpdate\nByteMatchSets\nByteMatchStatement\nByteMatchTuple\nByteMatchTuples\nBytes\nBytesCompressed\nBytesConverted\nBytesMetered\nBytesPerHour\nBytesPerSecond\nBytesProcessed\nBytesReturned\nBytesScanned\nBytesScannedCutoffPerQuery\nBytesTransferred\nBytesWritten\nCACertificate\nCACertificateDescription\nCACertificateIdentifier\nCAIdentifier\nCFNRegistryException\nCIDRIP\nCIDRSummary\nCIDRs\nCNAME\nCNAMEAlreadyExists\nCNAMEPrefix\nCORSConfiguration\nCORSRule\nCORSRules\nCPU\nCPUUtilization\nCRLSign\nCSS\nCSSColor\nCSSVersion\nCSV\nCSVHeader\nCSVInput\nCSVMappingParameters\nCSVOutput\nCUSTOM\nCVEIds\nCWEMonitorEnabled\nCaCertificateIdentifier\nCaEndpoint\nCaLogs\nCacheAllocatedInBytes\nCacheAttributes\nCacheBehavior\nCacheBehaviorPerPath\nCacheBehaviors\nCacheCluster\nCacheClusterAlreadyExistsFault\nCacheClusterCreateTime\nCacheClusterEnabled\nCacheClusterId\nCacheClusterIds\nCacheClusterMessage\nCacheClusterNotFoundFault\nCacheClusterSize\nCacheClusterStatus\nCacheClusters\nCacheControl\nCacheDataEncrypted\nCacheDirtyPercentage\nCacheEngineDescription\nCacheEngineVersion\nCacheEngineVersionDescription\nCacheEngineVersionMessage\nCacheEngineVersions\nCacheFullBehavior\nCacheHitPercentage\nCacheHitResult\nCacheLength\nCacheMissPercentage\nCacheNode\nCacheNodeCount\nCacheNodeCreateTime\nCacheNodeId\nCacheNodeIdsToReboot\nCacheNodeIdsToRemove\nCacheNodeStatus\nCacheNodeType\nCacheNodeTypeSpecificParameter\nCacheNodeTypeSpecificParameters\nCacheNodeTypeSpecificValue\nCacheNodeTypeSpecificValues\nCacheNodeUpdateStatus\nCacheNodes\nCacheParameterGroup\nCacheParameterGroupAlreadyExistsFault\nCacheParameterGroupDetails\nCacheParameterGroupFamily\nCacheParameterGroupName\nCacheParameterGroupNameMessage\nCacheParameterGroupNotFoundFault\nCacheParameterGroupQuotaExceededFault\nCacheParameterGroupStatus\nCacheParameterGroups\nCacheParameterGroupsMessage\nCachePeriodInMinutes\nCachePolicy\nCachePolicyAlreadyExists\nCachePolicyConfig\nCachePolicyCookiesConfig\nCachePolicyHeadersConfig\nCachePolicyId\nCachePolicyInUse\nCachePolicyList\nCachePolicyQueryStringsConfig\nCachePolicySummary\nCacheSecurityGroup\nCacheSecurityGroupAlreadyExistsFault\nCacheSecurityGroupMembership\nCacheSecurityGroupMessage\nCacheSecurityGroupName\nCacheSecurityGroupNames\nCacheSecurityGroupNotFoundFault\nCacheSecurityGroupQuotaExceededFault\nCacheSecurityGroups\nCacheSettings\nCacheSize\nCacheStaleTimeoutInSeconds\nCacheSubnetGroup\nCacheSubnetGroupAlreadyExistsFault\nCacheSubnetGroupDescription\nCacheSubnetGroupInUse\nCacheSubnetGroupMessage\nCacheSubnetGroupName\nCacheSubnetGroupNotFoundFault\nCacheSubnetGroupQuotaExceededFault\nCacheSubnetGroups\nCacheSubnetQuotaExceededFault\nCacheTTL\nCacheTtlInSeconds\nCacheUsedPercentage\nCachedMethods\nCachediSCSIVolume\nCachediSCSIVolumes\nCachingConfig\nCachingEnabled\nCalculateRouteCarModeOptions\nCalculateRouteMatrixRequest\nCalculateRouteMatrixResponse\nCalculateRouteMatrixSummary\nCalculateRouteRequest\nCalculateRouteResponse\nCalculateRouteSummary\nCalculateRouteTruckModeOptions\nCalculatedAttributeName\nCalculatedBaselineConstraints\nCalculatedBaselineStatistics\nCalculatedColumn\nCalculatedField\nCalculatedFieldDescription\nCalculatedFieldName\nCalculatedFieldSynonyms\nCalculatedFields\nCalculatedLifecycle\nCalculatedMeasureField\nCalculatedSpend\nCalculation\nCalculationConfiguration\nCalculationExecutionId\nCalculationResult\nCalculationStatistics\nCalculationStatus\nCalculationSummary\nCalculations\nCalculatorArn\nCalculatorName\nCalendarNames\nCallAnalyticsEntity\nCallAnalyticsItem\nCallAnalyticsJob\nCallAnalyticsJobName\nCallAnalyticsJobSettings\nCallAnalyticsJobStatus\nCallAnalyticsJobSummaries\nCallAnalyticsJobSummary\nCallAnalyticsStreamCategories\nCallAnalyticsTranscriptResultStream\nCallAs\nCallDetails\nCallInstructionsMessage\nCallInstructionsMessageType\nCallLeg\nCallRateLimitExceededException\nCallback\nCallbackId\nCallbackStepMetadata\nCallbackToken\nCallbackURLs\nCallerArn\nCallerId\nCallerReference\nCallerType\nCallingCountry\nCallingName\nCallingNameStatus\nCallingNameUpdatedTimestamp\nCallingRegions\nCampaign\nCampaignConfig\nCampaignCustomMessage\nCampaignDateRangeKpiResponse\nCampaignEmailMessage\nCampaignEventFilter\nCampaignFilters\nCampaignHook\nCampaignId\nCampaignInAppMessage\nCampaignLimits\nCampaignResponse\nCampaignSmsMessage\nCampaignState\nCampaignStatus\nCampaignSummary\nCampaignUpdateSummary\nCampaignsResponse\nCanDbcDefinition\nCanInterface\nCanSignal\nCanaries\nCanariesLastRun\nCanary\nCanaryCodeInput\nCanaryCodeOutput\nCanaryLastRun\nCanaryName\nCanaryRun\nCanaryRunConfigInput\nCanaryRunConfigOutput\nCanaryRunStatus\nCanaryRunTimeline\nCanaryRuns\nCanaryScheduleInput\nCanaryScheduleOutput\nCanarySettings\nCanarySize\nCanaryStatus\nCanaryTimeline\nCancelAnnotationImportRequest\nCancelArchivalInput\nCancelArchivalOutput\nCancelAuditMitigationActionsTaskRequest\nCancelAuditTaskRequest\nCancelBatchImportJobRequest\nCancelBatchJobExecutionRequest\nCancelBatchPredictionJobRequest\nCancelBundleTaskRequest\nCancelBundleTaskResult\nCancelCapacityReservationFleetError\nCancelCapacityReservationFleetsRequest\nCancelCapacityReservationFleetsResult\nCancelCapacityReservationInput\nCancelCapacityReservationRequest\nCancelCapacityReservationResult\nCancelCertificateTransferRequest\nCancelChangeSetRequest\nCancelChangeSetResponse\nCancelClusterRequest\nCancelCommandRequest\nCancelComponentDeploymentInput\nCancelComponentDeploymentOutput\nCancelContactRequest\nCancelConversionRequest\nCancelDataQualityRuleRecommendationRunRequest\nCancelDataQualityRulesetEvaluationRunRequest\nCancelDataRepositoryTaskRequest\nCancelDataRepositoryTaskResponse\nCancelDeploymentJobRequest\nCancelDeploymentRequest\nCancelDeploymentResponse\nCancelDescription\nCancelDetectMitigationActionsTaskRequest\nCancelDomainTransferToAnotherAwsAccountRequest\nCancelDomainTransferToAnotherAwsAccountResponse\nCancelElasticsearchServiceSoftwareUpdateRequest\nCancelElasticsearchServiceSoftwareUpdateResponse\nCancelEnvironmentDeploymentInput\nCancelEnvironmentDeploymentOutput\nCancelExportJobRequest\nCancelExportTaskMessage\nCancelExportTaskRequest\nCancelFindingsReportRequest\nCancelFindingsReportResponse\nCancelFlowExecutionsRequest\nCancelFlowExecutionsResponse\nCancelGremlinQueryInput\nCancelGremlinQueryOutput\nCancelHandshakeRequest\nCancelHandshakeResponse\nCancelImageCreationRequest\nCancelImageCreationResponse\nCancelImageLaunchPermissionRequest\nCancelImageLaunchPermissionResult\nCancelImportTaskRequest\nCancelImportTaskResult\nCancelIngestionRequest\nCancelIngestionResponse\nCancelInputDeviceTransferRequest\nCancelInstanceRefreshAnswer\nCancelInstanceRefreshType\nCancelJobExecutionRequest\nCancelJobRequest\nCancelJobResponse\nCancelJobRunRequest\nCancelJobRunResponse\nCancelJournalKinesisStreamRequest\nCancelJournalKinesisStreamResponse\nCancelKeyDeletionRequest\nCancelKeyDeletionResponse\nCancelLegalHoldInput\nCancelLoaderJobInput\nCancelLoaderJobOutput\nCancelMLDataProcessingJobInput\nCancelMLDataProcessingJobOutput\nCancelMLModelTrainingJobInput\nCancelMLModelTrainingJobOutput\nCancelMLModelTransformJobInput\nCancelMLModelTransformJobOutput\nCancelMLTaskRunRequest\nCancelMLTaskRunResponse\nCancelMailboxExportJobRequest\nCancelMaintenanceWindowExecutionRequest\nCancelMaintenanceWindowExecutionResult\nCancelMessageMoveTaskRequest\nCancelMessageMoveTaskResult\nCancelMulticastGroupSessionRequest\nCancelOpenCypherQueryInput\nCancelOpenCypherQueryOutput\nCancelOrderInput\nCancelPipelineReprocessingRequest\nCancelPolicyGenerationRequest\nCancelQuantumTaskRequest\nCancelQuantumTaskResponse\nCancelQueryRequest\nCancelQueryResponse\nCancelReason\nCancelReplayRequest\nCancelReplayResponse\nCancelReplicationTaskAssessmentRunMessage\nCancelReplicationTaskAssessmentRunResponse\nCancelReservedInstancesListingRequest\nCancelReservedInstancesListingResult\nCancelResizeMessage\nCancelResourceRequestInput\nCancelResourceRequestOutput\nCancelRetrievalInput\nCancelRetrievalOutput\nCancelRotateSecretRequest\nCancelRotateSecretResponse\nCancelRunRequest\nCancelSbomExportRequest\nCancelSbomExportResponse\nCancelSchemaExtensionRequest\nCancelServiceInstanceDeploymentInput\nCancelServiceInstanceDeploymentOutput\nCancelServicePipelineDeploymentInput\nCancelServicePipelineDeploymentOutput\nCancelServiceSoftwareUpdateRequest\nCancelServiceSoftwareUpdateResponse\nCancelSigningProfileRequest\nCancelSimulationJobBatchRequest\nCancelSimulationJobRequest\nCancelSolNetworkOperationInput\nCancelSpotFleetRequestsError\nCancelSpotFleetRequestsErrorItem\nCancelSpotFleetRequestsRequest\nCancelSpotFleetRequestsResponse\nCancelSpotFleetRequestsSuccessItem\nCancelSpotInstanceRequestsRequest\nCancelSpotInstanceRequestsResult\nCancelStatementRequest\nCancelStatementResponse\nCancelStepsInfo\nCancelStepsInfoList\nCancelStepsInput\nCancelStepsOutput\nCancelTaskExecutionRequest\nCancelTaskInput\nCancelTaskOutput\nCancelTimerDecisionAttributes\nCancelTimerFailedEventAttributes\nCancelTransactionRequest\nCancelUpdateStackInput\nCancelVariantImportRequest\nCancelWorkflowExecutionDecisionAttributes\nCancelWorkflowExecutionFailedEventAttributes\nCancelWorldExportJobRequest\nCancelWorldGenerationJobRequest\nCancelZonalShiftRequest\nCancellable\nCancellationDate\nCancellationMessage\nCancellationReason\nCancellationReasons\nCancelledByUserException\nCancelledSpotInstanceRequest\nCancelledSpotInstanceRequests\nCancelledSteps\nCandidateAddress\nCandidateAddressList\nCandidateArtifactLocations\nCandidateDefinitionNotebookLocation\nCandidateGenerationConfig\nCandidateMetrics\nCandidateName\nCandidateNameEquals\nCandidateProperties\nCandidateStatus\nCandidateStepArn\nCandidateStepName\nCandidateStepType\nCandidateSteps\nCandidates\nCannedACL\nCannedAccessControlList\nCannedAcl\nCannedAclForObjects\nCannotChangeImmutablePublicKeyFields\nCannotDelegateManagementAccountException\nCannotDeleteApprovalRuleFromTemplateException\nCannotDeleteException\nCannotListParentOfRootException\nCannotModifyApprovalRuleFromTemplateException\nCanonicalHostedZoneId\nCanonicalHostedZoneName\nCanonicalHostedZoneNameID\nCanvasAppSettings\nCanvasOrientation\nCanvasSizeOptions\nCap\nCapExceeded\nCapabilities\nCapabilitiesReason\nCapacity\nCapacityAllocation\nCapacityAllocations\nCapacityAssignment\nCapacityAssignmentConfiguration\nCapacityAssignments\nCapacityConfiguration\nCapacityDescription\nCapacityExceededException\nCapacityForecast\nCapacityId\nCapacityInBytes\nCapacityLimits\nCapacityProvider\nCapacityProviderStrategy\nCapacityProviderStrategyItem\nCapacityProviders\nCapacityProvisioned\nCapacityRebalance\nCapacityRegion\nCapacityReservation\nCapacityReservationArn\nCapacityReservationFleet\nCapacityReservationFleetArn\nCapacityReservationFleetCancellationState\nCapacityReservationFleetId\nCapacityReservationFleetIds\nCapacityReservationFleets\nCapacityReservationGroup\nCapacityReservationGroups\nCapacityReservationId\nCapacityReservationIds\nCapacityReservationName\nCapacityReservationOptions\nCapacityReservationOptionsRequest\nCapacityReservationPreference\nCapacityReservationResourceGroupArn\nCapacityReservationSpecification\nCapacityReservationSpecificationResponse\nCapacityReservationTarget\nCapacityReservationTargetResponse\nCapacityReservations\nCapacitySize\nCapacitySpecification\nCapacitySpecificationSummary\nCapacityToRelease\nCapacityUnits\nCapacityUnitsConfiguration\nCapacityUpdate\nCapacityUsageSummary\nCapacityUsed\nCappedCount\nCaptcha\nCaptchaAction\nCaptchaConfig\nCaptchaResponse\nCaptionChannel\nCaptionContainerType\nCaptionData\nCaptionDescription\nCaptionDescriptionNames\nCaptionDescriptionPreset\nCaptionDescriptions\nCaptionDestinationSettings\nCaptionFormat\nCaptionFormats\nCaptionLanguageMapping\nCaptionLanguageMappings\nCaptionLanguageSetting\nCaptionRectangle\nCaptionSegmentLengthControl\nCaptionSelector\nCaptionSelectorName\nCaptionSelectorSettings\nCaptionSelectors\nCaptionSource\nCaptionSourceFramerate\nCaptionSourceSettings\nCaptionSources\nCaptions\nCaptureContentTypeHeader\nCaptureDdls\nCaptureInterval\nCaptureIntervalUnits\nCaptureMode\nCaptureOption\nCaptureOptions\nCaptureStatus\nCaptureTime\nCaptureTimeAccuracy\nCarModeOptions\nCardExpiryDate\nCardHolderVerificationValue\nCardStatusUpdate\nCardVerificationValue1\nCardVerificationValue2\nCardinality\nCarrier\nCarrierGateway\nCarrierGatewayId\nCarrierGatewayIds\nCarrierGateways\nCarrierIp\nCartesianCoordinates\nCascade\nCascadingControlConfiguration\nCascadingControlSource\nCaseCreationLimitExceeded\nCaseDetails\nCaseEventIncludedData\nCaseId\nCaseIdNotFound\nCaseInsensitive\nCaseSensitive\nCaseSensitiveNames\nCaseSensitivity\nCaseSummary\nCastColumnTypeOperation\nCatalog\nCatalogConfiguration\nCatalogConfigurationDescription\nCatalogConfigurationUpdate\nCatalogDatabase\nCatalogDeltaSource\nCatalogEncryptionMode\nCatalogEntry\nCatalogHudiSource\nCatalogId\nCatalogImportStatus\nCatalogItem\nCatalogItemId\nCatalogItems\nCatalogKafkaSource\nCatalogKinesisSource\nCatalogName\nCatalogRedshiftSchema\nCatalogRedshiftTable\nCatalogSchemaChangePolicy\nCatalogSource\nCatalogTable\nCatalogTarget\nCatalogTargets\nCategoricalAggregationFunction\nCategoricalDimensionField\nCategoricalHyperParameterRange\nCategoricalMeasureField\nCategoricalParameter\nCategoricalParameterRange\nCategoricalParameterRangeSpecification\nCategoricalParameterRanges\nCategoricalValues\nCategories\nCategory\nCategoryAxis\nCategoryAxisDisplayOptions\nCategoryAxisLabelOptions\nCategoryDetails\nCategoryDrillDownFilter\nCategoryEnum\nCategoryEvent\nCategoryFilter\nCategoryFilterConfiguration\nCategoryFilterFunction\nCategoryFilterType\nCategoryId\nCategoryItemsLimit\nCategoryItemsLimitConfiguration\nCategoryLabelOptions\nCategoryLabelVisibility\nCategoryList\nCategoryName\nCategoryProperties\nCategorySort\nCategoryValue\nCategoryValues\nCategoryWithFindingNum\nCausalAnomalyId\nCause\nCausedBy\nCauses\nCausingEntity\nCbetCheckDigitString\nCbetSourceId\nCbetStepaside\nCcAddresses\nCcDescriptor\nCdcInsertsAndUpdates\nCdcInsertsOnly\nCdcMaxBatchInterval\nCdcMinFileSize\nCdcPath\nCdcStartPosition\nCdcStartTime\nCdcStopPosition\nCdiInputSpecification\nCdma\nCdmaChannel\nCdmaLocalId\nCdmaNmr\nCdmaNmrObj\nCdmaObj\nCdnConfiguration\nCdnIdentifierSecret\nCdrBucket\nCelebrities\nCelebrity\nCelebrityDetail\nCelebrityFaces\nCelebrityRecognition\nCell\nCellArn\nCellFilters\nCellInput\nCellName\nCellOutput\nCellParams\nCellReference\nCellStyle\nCellTowers\nCellType\nCellValue\nCellValueSynonym\nCellValueSynonyms\nCells\nCenter\nCents\nCertPolicyId\nCertificate\nCertificateAlreadyExistsException\nCertificateArn\nCertificateAssociation\nCertificateAssociations\nCertificateAuthentication\nCertificateAuthenticationRequest\nCertificateAuthorities\nCertificateAuthority\nCertificateAuthorityArn\nCertificateAuthorityArnList\nCertificateAuthorityConfiguration\nCertificateAuthorityData\nCertificateAuthorityExpiryInMilliseconds\nCertificateAuthorityId\nCertificateAuthorityPublicKeyIdentifier\nCertificateAuthorityType\nCertificateBasedAuthProperties\nCertificateBody\nCertificateChain\nCertificateConfiguration\nCertificateConflictException\nCertificateCreationDate\nCertificateData\nCertificateDescription\nCertificateDetail\nCertificateDetails\nCertificateDoesNotExistException\nCertificateEnrollmentPolicyServerEndpoint\nCertificateExpirationTime\nCertificateExpiryInMilliseconds\nCertificateFingerprint\nCertificateId\nCertificateIdentifier\nCertificateIds\nCertificateInUseException\nCertificateInfo\nCertificateLimitExceededException\nCertificateList\nCertificateMessage\nCertificateMismatchException\nCertificateMode\nCertificateName\nCertificateNotFoundException\nCertificateNotFoundFault\nCertificateOptions\nCertificateOwner\nCertificatePath\nCertificatePem\nCertificatePolicies\nCertificateRevocationList\nCertificateRotationRestart\nCertificateS3BucketName\nCertificateS3ObjectKey\nCertificateSerial\nCertificateSource\nCertificateStateException\nCertificateStatuses\nCertificateSummary\nCertificateSummaryList\nCertificateTransparencyLoggingPreference\nCertificateType\nCertificateUploadDate\nCertificateValidationException\nCertificateValidationRecord\nCertificateValidationRecords\nCertificateValidity\nCertificateWallet\nCertificates\nCertificatesInfo\nCertifications\nCertifyForMarketplace\nChain\nChainId\nChaincodeLogs\nChallenge\nChallengeAction\nChallengeCode\nChallengeConfig\nChallengeName\nChallengeParameters\nChallengeRequiredOnNewDevice\nChallengeResponse\nChallengeResponseType\nChallengeResponses\nChange\nChangeBatch\nChangeCidrCollectionRequest\nChangeCidrCollectionResponse\nChangeComputeType\nChangeDetails\nChangeDetectingColumns\nChangeId\nChangeInfo\nChangeLog\nChangeMessageVisibilityBatchRequest\nChangeMessageVisibilityBatchRequestEntry\nChangeMessageVisibilityBatchResult\nChangeMessageVisibilityBatchResultEntry\nChangeMessageVisibilityRequest\nChangeName\nChangeOwnershipPrice\nChangePasswordRequest\nChangeProgressDetails\nChangeProgressStage\nChangeProgressStages\nChangeProgressStatus\nChangeProgressStatusDetails\nChangeProgressStatuses\nChangeRequest\nChangeRequestName\nChangeResourceRecordSetsRequest\nChangeResourceRecordSetsResponse\nChangeServerLifeCycleStateRequest\nChangeServerLifeCycleStateSourceServerLifecycle\nChangeSet\nChangeSetArn\nChangeSetHook\nChangeSetHookResourceTargetDetails\nChangeSetHookTargetDetails\nChangeSetId\nChangeSetName\nChangeSetNotFoundException\nChangeSetState\nChangeSetSummary\nChangeSetSummaryList\nChangeSetSummaryListItem\nChangeSetTags\nChangeSetType\nChangeSeverity\nChangeSource\nChangeSummary\nChangeTagsForResourceRequest\nChangeToken\nChangeTokenStatus\nChangeType\nChangeableForDays\nChangedBlock\nChangedBlocks\nChangedBlocksCount\nChanges\nChangesetErrorInfo\nChangesetSummary\nChannel\nChannelARN\nChannelARNInvalidException\nChannelActivity\nChannelAlreadyExistsException\nChannelArn\nChannelAssociatedWithFlowSummary\nChannelBan\nChannelBanSummary\nChannelBans\nChannelClass\nChannelConfiguration\nChannelCounts\nChannelDefinition\nChannelDefinitions\nChannelEgressEndpoint\nChannelExistsForEDSException\nChannelFlow\nChannelFlowArn\nChannelFlowCallbackRequest\nChannelFlowCallbackResponse\nChannelFlowSummary\nChannelFlows\nChannelGroupListConfiguration\nChannelGroupName\nChannelId\nChannelIdentification\nChannelIds\nChannelInfo\nChannelInfoList\nChannelInsufficientPermission\nChannelListConfiguration\nChannelMapping\nChannelMappings\nChannelMask\nChannelMaxLimitExceededException\nChannelMembership\nChannelMembershipForAppInstanceUserSummary\nChannelMembershipPreferences\nChannelMembershipSummary\nChannelMemberships\nChannelMessage\nChannelMessageCallback\nChannelMessageStatusStructure\nChannelMessageSummary\nChannelMessages\nChannelModeratedByAppInstanceUserSummary\nChannelModerator\nChannelModeratorArn\nChannelModeratorSummary\nChannelModerators\nChannelName\nChannelNameCondition\nChannelNotBroadcasting\nChannelNotFound\nChannelNotFoundException\nChannelOrder\nChannelResponse\nChannelRetentionSettings\nChannelSpecification\nChannelState\nChannelStatistics\nChannelStatus\nChannelStorage\nChannelStorageSummary\nChannelSummary\nChannelTag\nChannelTargetInfo\nChannelType\nChannelUnsupportedSchema\nChannels\nChannelsIn\nChannelsOut\nChannelsResponse\nChapCredentials\nChapEnabled\nChapInfo\nCharLengthSemantics\nCharacterOffsets\nCharacterSet\nCharacterSetDescription\nCharacterSetName\nCharacters\nChargeDetails\nChargeValue\nCharset\nChartAxisLabelOptions\nChartColor\nChartConfiguration\nChatDurationInMinutes\nChatMessage\nChatParticipantRoleConfig\nChatStreamingConfiguration\nChatterFeedConfiguration\nCheckCapacityRequest\nCheckCapacityResponse\nCheckDNSAvailabilityMessage\nCheckDNSAvailabilityResultMessage\nCheckDetail\nCheckDetails\nCheckDigitString\nCheckDomainAvailabilityRequest\nCheckDomainAvailabilityResponse\nCheckDomainTransferabilityRequest\nCheckDomainTransferabilityResponse\nCheckExpression\nCheckIfPhoneNumberIsOptedOutInput\nCheckIfPhoneNumberIsOptedOutResponse\nCheckInLicenseRequest\nCheckJobArn\nCheckName\nCheckSchemaVersionValidityInput\nCheckSchemaVersionValidityResponse\nCheckSummaries\nCheckSummary\nCheckType\nCheckedTime\nCheckerIpRanges\nCheckoutBorrowLicenseRequest\nCheckoutBorrowLicenseResponse\nCheckoutLicenseRequest\nCheckoutLicenseResponse\nCheckoutMetadata\nCheckoutType\nCheckpointConfig\nCheckpointConfiguration\nCheckpointConfigurationDescription\nCheckpointConfigurationUpdate\nCheckpointDelay\nCheckpointInterval\nCheckpointIntervalUpdate\nCheckpointPercentages\nCheckpointingEnabled\nCheckpointingEnabledUpdate\nChecksum\nChecksumAggregationMethod\nChecksumAlgorithm\nChecksumCRC32\nChecksumCRC32C\nChecksumMode\nChecksumSHA1\nChecksumSHA256\nChefConfiguration\nChild\nChildBlock\nChildBlockId\nChildBlocks\nChildComponents\nChildHealthChecks\nChildId\nChildJobsInState\nChildManifestName\nChildNotFoundException\nChildReference\nChildShard\nChildShards\nChildType\nChildWorkflowExecutionCanceledEventAttributes\nChildWorkflowExecutionCompletedEventAttributes\nChildWorkflowExecutionFailedEventAttributes\nChildWorkflowExecutionStartedEventAttributes\nChildWorkflowExecutionTerminatedEventAttributes\nChildWorkflowExecutionTimedOutEventAttributes\nChildren\nChildrenOfAlarmName\nChimeBearer\nChimeSdkMeetingConcatenationConfiguration\nChimeSdkMeetingConfiguration\nChimeSdkMeetingLiveConnectorConfiguration\nChoice\nChoiceAnswer\nChoiceAnswerSummaries\nChoiceAnswerSummary\nChoiceAnswers\nChoiceContent\nChoiceDescription\nChoiceId\nChoiceImprovementPlan\nChoiceTitle\nChoiceUpdate\nChoiceUpdates\nChoices\nChromaSampling\nChunk\nChunkChecksum\nChunkChecksumAlgorithm\nChunkIndex\nChunkList\nChunkToken\nChunksCount\nCidr\nCidrAllowList\nCidrAllowedList\nCidrAuthorizationContext\nCidrBlock\nCidrBlockAssociation\nCidrBlockAssociationSet\nCidrBlockInUseException\nCidrBlockSet\nCidrBlockState\nCidrBlockSummary\nCidrBlocks\nCidrCollection\nCidrCollectionAlreadyExistsException\nCidrCollectionChange\nCidrCollectionInUseException\nCidrCollectionVersionMismatchException\nCidrCollections\nCidrIp\nCidrIps\nCidrIpv4\nCidrIpv6\nCidrList\nCidrLocations\nCidrRoutingConfig\nCidrs\nCifsShareCount\nCipher\nCipherText\nCiphers\nCiphertextBlob\nCiphertextForRecipient\nCircle\nCisaData\nCity\nCityName\nClaim\nClaimCode\nClaimDeviceRequest\nClaimDevicesByClaimCodeRequest\nClaimDevicesByClaimCodeResponse\nClaimFilterOption\nClaimGameServerInput\nClaimGameServerOutput\nClaimPhoneNumberRequest\nClaimPhoneNumberResponse\nClaimRegex\nClaimStatus\nClaimedPhoneNumberSummary\nClapAtom\nClarifyCheck\nClarifyCheckStepMetadata\nClarifyExplainerConfig\nClarifyInferenceConfig\nClarifyShapBaselineConfig\nClarifyShapConfig\nClarifyTextConfig\nClassBTimeout\nClassCTimeout\nClassName\nClasses\nClassic\nClassicLinkDnsSupport\nClassicLinkDnsSupported\nClassicLinkEnabled\nClassicLinkInstance\nClassicLinkVPCId\nClassicLinkVPCSecurityGroups\nClassicLinkVpcId\nClassicLinkVpcSecurityGroups\nClassicLoadBalancer\nClassicLoadBalancerListener\nClassicLoadBalancers\nClassicLoadBalancersConfig\nClassification\nClassificationDetails\nClassificationExportConfiguration\nClassificationResult\nClassificationResultStatus\nClassificationScopeSummary\nClassificationStatus\nClassificationType\nClassificationTypeUpdate\nClassifier\nClassifierEvaluationMetrics\nClassifierMetadata\nClassifiers\nClassifyDocumentRequest\nClassifyDocumentResponse\nCleanAmplifyApp\nCleanSourceMetadataOnMismatch\nCleansedPhoneNumberE164\nCleansedPhoneNumberNational\nClearAllocationDefaultNetmaskLength\nClearQuerySuggestionsRequest\nClearTimerAction\nCliToken\nClickFeedback\nClickFeedbackItems\nClickTime\nClientAffinity\nClientArn\nClientAssociationMetadata\nClientAuthentication\nClientAuthenticationSettingInfo\nClientAuthenticationSettingsInfo\nClientBroker\nClientCache\nClientCertAuthSettings\nClientCertificate\nClientCertificateId\nClientCertificateRevocationListStatus\nClientCertificates\nClientCidrBlock\nClientConfig\nClientConfiguration\nClientConfigurationVersion\nClientConfigurations\nClientConnectOptions\nClientConnectResponseOptions\nClientContext\nClientData\nClientDownloadLandingPage\nClientException\nClientID\nClientIDList\nClientIP\nClientIPPreservationEnabled\nClientId\nClientImpacting\nClientIp\nClientLimitExceededException\nClientList\nClientLoginBannerOptions\nClientLoginBannerResponseOptions\nClientMetadata\nClientName\nClientParameters\nClientPasswordAuthType\nClientPolicy\nClientPolicyTls\nClientProperties\nClientPropertiesList\nClientPropertiesResult\nClientPublicKey\nClientRequestId\nClientRequestImpactStatistics\nClientRequestToken\nClientRequestTokenRequiredException\nClientRootCertificateChain\nClientRootCertificateChainArn\nClientSdkVersion\nClientSecret\nClientSessionId\nClientSideTimestamps\nClientSubnet\nClientSubnets\nClientTimeoutException\nClientToken\nClientTokenConflictException\nClientTokenId\nClientTunnelAddress\nClientVersion\nClientVpcConnection\nClientVpcConnections\nClientVpcIpAddress\nClientVpnAuthentication\nClientVpnAuthenticationRequest\nClientVpnAuthorizationRuleStatus\nClientVpnConnection\nClientVpnConnectionStatus\nClientVpnEndpoint\nClientVpnEndpointAttributeStatus\nClientVpnEndpointId\nClientVpnEndpointIds\nClientVpnEndpointStatus\nClientVpnEndpoints\nClientVpnRoute\nClientVpnRouteStatus\nClientVpnTargetNetworks\nClients\nClip\nClipFragmentSelector\nClipLimits\nClipRange\nClipTimestampRange\nClockRate\nClockSync\nClocks\nCloneAppIds\nCloneBackendRequest\nCloneBackendResponse\nCloneGroupId\nClonePermissions\nCloneReceiptRuleSetRequest\nCloneStackRequest\nCloneStackResult\nCloseAccountRequest\nCloseInstancePublicPortsRequest\nCloseInstancePublicPortsResult\nCloseStatusFilter\nCloseTime\nCloseTunnelRequest\nClosed\nClosedDays\nClosedDaysRule\nCloudComponentStatus\nCloudFormation\nCloudFormationCollection\nCloudFormationCollectionFilter\nCloudFormationCostEstimationResourceCollectionFilter\nCloudFormationHealth\nCloudFormationOverridePropertyConfiguration\nCloudFormationStackARN\nCloudFormationStackArn\nCloudFormationStackRecord\nCloudFormationStackRecordSourceInfo\nCloudFormationTarget\nCloudFrontDefaultCertificate\nCloudFrontDistribution\nCloudFrontDomain\nCloudFrontOriginAccessIdentity\nCloudFrontOriginAccessIdentityAlreadyExists\nCloudFrontOriginAccessIdentityConfig\nCloudFrontOriginAccessIdentityInUse\nCloudFrontOriginAccessIdentityList\nCloudFrontOriginAccessIdentitySummary\nCloudHsmAccessDeniedException\nCloudHsmClusterId\nCloudHsmClusterInUseException\nCloudHsmClusterInvalidConfigurationException\nCloudHsmClusterNotActiveException\nCloudHsmClusterNotFoundException\nCloudHsmClusterNotRelatedException\nCloudHsmInternalException\nCloudHsmInternalFailureException\nCloudHsmInvalidRequestException\nCloudHsmResourceNotFoundException\nCloudHsmServiceException\nCloudHsmTagException\nCloudLayout\nCloudOnlyDirectoriesCurrentCount\nCloudOnlyDirectoriesLimit\nCloudOnlyDirectoriesLimitReached\nCloudOnlyMicrosoftADCurrentCount\nCloudOnlyMicrosoftADLimit\nCloudOnlyMicrosoftADLimitReached\nCloudRemovalConfigInput\nCloudTrail\nCloudTrailARNInvalidException\nCloudTrailAccessNotEnabledException\nCloudTrailConfigurationResult\nCloudTrailDetails\nCloudTrailEvent\nCloudTrailInvalidClientTokenIdException\nCloudTrailProperties\nCloudWatchAlarmConfiguration\nCloudWatchAlarmDefinition\nCloudWatchConfig\nCloudWatchDashboard\nCloudWatchDashboards\nCloudWatchDestination\nCloudWatchDimensionConfiguration\nCloudWatchEncryption\nCloudWatchEncryptionEnabled\nCloudWatchEncryptionMode\nCloudWatchEventDetailType\nCloudWatchEventId\nCloudWatchEventSource\nCloudWatchEventsExecutionDataDetails\nCloudWatchLogDeliveryOptions\nCloudWatchLogDestination\nCloudWatchLogGroupARN\nCloudWatchLogGroupArn\nCloudWatchLogGroupLogDestination\nCloudWatchLogGroupName\nCloudWatchLogOptions\nCloudWatchLogOptionsSpecification\nCloudWatchLoggingConfiguration\nCloudWatchLoggingOption\nCloudWatchLoggingOptionDescription\nCloudWatchLoggingOptionDescriptions\nCloudWatchLoggingOptionId\nCloudWatchLoggingOptionUpdate\nCloudWatchLoggingOptionUpdates\nCloudWatchLoggingOptions\nCloudWatchLogs\nCloudWatchLogsConfig\nCloudWatchLogsConfiguration\nCloudWatchLogsConfigurationType\nCloudWatchLogsDeliveryUnavailableException\nCloudWatchLogsDestination\nCloudWatchLogsDestinationConfig\nCloudWatchLogsDestinationConfiguration\nCloudWatchLogsDestinationDetails\nCloudWatchLogsDetails\nCloudWatchLogsLogDelivery\nCloudWatchLogsLogDeliveryDescription\nCloudWatchLogsLogGroup\nCloudWatchLogsLogGroupArn\nCloudWatchLogsLogStream\nCloudWatchLogsParameters\nCloudWatchLogsRoleArn\nCloudWatchMetrics\nCloudWatchMetricsDataSummary\nCloudWatchMetricsDetail\nCloudWatchMetricsDimension\nCloudWatchMetricsEnabled\nCloudWatchMonitoringConfiguration\nCloudWatchOutputConfig\nCloudWatchOutputEnabled\nCloudWatchOutputUrl\nCloudwatch\nCloudwatchAlarmAction\nCloudwatchLogGroup\nCloudwatchLogStream\nCloudwatchLogsAction\nCloudwatchLogsExportConfiguration\nCloudwatchMetricAction\nCluster\nClusterAlreadyExistsFault\nClusterArn\nClusterAssociatedToSchedule\nClusterAvailabilityStatus\nClusterBlockStorageLogicalUsed\nClusterBlockStorageSize\nClusterBlockStorageUsed\nClusterCertificate\nClusterCloudStorageUsed\nClusterConfig\nClusterConfigStatus\nClusterConfiguration\nClusterContainsContainerInstancesException\nClusterContainsServicesException\nClusterContainsTasksException\nClusterCreateTime\nClusterCredentials\nClusterCsr\nClusterDbRevision\nClusterDbRevisions\nClusterDbRevisionsMessage\nClusterDiscoveryEndpoint\nClusterEnabled\nClusterEndpoint\nClusterEndpointEncryptionType\nClusterEndpoints\nClusterExists\nClusterExtendedCredentials\nClusterHealth\nClusterIamRole\nClusterId\nClusterIdentifier\nClusterInList\nClusterInfo\nClusterInfoList\nClusterIssue\nClusterJDBCURL\nClusterLimitExceededException\nClusterListEntries\nClusterListEntry\nClusterLogging\nClusterMarker\nClusterMarkerConfiguration\nClusterMetadata\nClusterMode\nClusterName\nClusterNameFilter\nClusterNames\nClusterNamespaceArn\nClusterNode\nClusterNodes\nClusterNotFoundException\nClusterNotFoundFault\nClusterOnLatestRevisionFault\nClusterOperationArn\nClusterOperationInfo\nClusterOperationInfoList\nClusterOperationStep\nClusterOperationStepInfo\nClusterOperationV2\nClusterOperationV2Provisioned\nClusterOperationV2Serverless\nClusterOperationV2Summary\nClusterParameterGroup\nClusterParameterGroupAlreadyExistsFault\nClusterParameterGroupDetails\nClusterParameterGroupFamily\nClusterParameterGroupName\nClusterParameterGroupNameMessage\nClusterParameterGroupNotFoundFault\nClusterParameterGroupQuotaExceededFault\nClusterParameterGroupStatus\nClusterParameterGroups\nClusterParameterGroupsMessage\nClusterParameterStatus\nClusterParameterStatusList\nClusterPendingModifiedValues\nClusterPendingUpdates\nClusterPublicKey\nClusterQuotaExceededFault\nClusterQuotaForCustomerExceededFault\nClusterRevisionNumber\nClusterRoleArn\nClusterSecurityGroup\nClusterSecurityGroupAlreadyExistsFault\nClusterSecurityGroupMembership\nClusterSecurityGroupMessage\nClusterSecurityGroupName\nClusterSecurityGroupNotFoundFault\nClusterSecurityGroupQuotaExceededFault\nClusterSecurityGroups\nClusterServiceConnectDefaults\nClusterServiceConnectDefaultsRequest\nClusterSetting\nClusterSettings\nClusterSnapshot\nClusterSnapshotAlreadyExistsFault\nClusterSnapshotCopyStatus\nClusterSnapshotInList\nClusterSnapshotNotFoundFault\nClusterSnapshotQuotaExceededFault\nClusterState\nClusterStateChangeReason\nClusterStates\nClusterStatus\nClusterSubnetGroup\nClusterSubnetGroupAlreadyExistsFault\nClusterSubnetGroupMessage\nClusterSubnetGroupName\nClusterSubnetGroupNotFoundFault\nClusterSubnetGroupQuotaExceededFault\nClusterSubnetGroups\nClusterSubnetQuotaExceededFault\nClusterSummary\nClusterTimeline\nClusterType\nClusterTypeFilter\nClusterUuid\nClusterVersion\nClusterVersions\nClusterVersionsMessage\nClusteringKey\nClusters\nClustersMessage\nCmafAdditionalManifest\nCmafEncryption\nCmafEncryptionMethod\nCmafEncryptionSettings\nCmafGroupSettings\nCmafImageBasedTrickPlaySettings\nCmafPackage\nCmafPackageCreateOrUpdateParameters\nCmfcSettings\nCmkArn\nCmkType\nCname\nCoIp\nCode\nCodeArtifacts\nCodeBlock\nCodeBuildNotInServiceRegionException\nCodeBuildServiceRole\nCodeCommit\nCodeCommitCodeDestination\nCodeCommitRepository\nCodeConfiguration\nCodeConfigurationValues\nCodeContent\nCodeContentDescription\nCodeContentType\nCodeContentTypeUpdate\nCodeContentUpdate\nCodeCoverage\nCodeCoverageReportSummary\nCodeDeliveryDetails\nCodeDeliveryDetailsList\nCodeDeliveryDetailsType\nCodeDeliveryFailureException\nCodeDeployApplication\nCodeDeployDeploymentGroup\nCodeDeployDeploymentId\nCodeDeployInstanceGroupId\nCodeDeployState\nCodeDestination\nCodeError\nCodeErrorLocation\nCodeFilePath\nCodeGenConfigurationNode\nCodeGenConfigurationNodes\nCodeGenEdge\nCodeGenNode\nCodeGenNodeArg\nCodeHook\nCodeHookSpecification\nCodeLength\nCodeLine\nCodeLineCount\nCodeMD5\nCodeMismatchException\nCodeRepositories\nCodeRepository\nCodeRepositoryArn\nCodeRepositoryName\nCodeRepositorySummary\nCodeRepositorySummaryList\nCodeReview\nCodeReviewArn\nCodeReviewSummaries\nCodeReviewSummary\nCodeReviewType\nCodeSha256\nCodeSigning\nCodeSigningCertificateChain\nCodeSigningConfig\nCodeSigningConfigArn\nCodeSigningConfigId\nCodeSigningConfigNotFoundException\nCodeSigningConfigs\nCodeSigningPolicies\nCodeSigningSignature\nCodeSize\nCodeSizeUnzipped\nCodeSizeZipped\nCodeSnippetError\nCodeSnippetResult\nCodeSource\nCodeStar\nCodeStarParameters\nCodeStorageExceededException\nCodeValidationException\nCodeVerificationFailedException\nCodeVulnerabilities\nCodeVulnerabilitiesFilePath\nCodeVulnerabilityDetails\nCodec\nCodecLevel\nCodecOptions\nCodecProfile\nCodecSettings\nCodecSpecification\nCodegenDependency\nCodegenFeatureFlags\nCodegenGenericDataEnum\nCodegenGenericDataField\nCodegenGenericDataModel\nCodegenGenericDataNonModel\nCodegenGenericDataRelationshipType\nCodegenJob\nCodegenJobAsset\nCodegenJobGenericDataSchema\nCodegenJobSummary\nCodingMode\nCognitoConfig\nCognitoEnabled\nCognitoIdentityProvider\nCognitoIdentityProviders\nCognitoMemberDefinition\nCognitoOptions\nCognitoOptionsStatus\nCognitoStreams\nCognitoUserPoolConfig\nCognitoUserPoolConfiguration\nCognitoUserPoolId\nCohortId\nCoipAddressUsage\nCoipAddressUsages\nCoipCidr\nCoipPool\nCoipPoolId\nCoipPools\nColdStorageOptions\nCollaboration\nCollaborationAnalysisTemplate\nCollaborationAnalysisTemplateSummary\nCollaborationSummary\nCollapseId\nCollapseKey\nCollapseStateOptions\nCollapsedRowDimensionsVisibility\nCollection\nCollectionARN\nCollectionArn\nCollectionConfig\nCollectionConfiguration\nCollectionConfigurations\nCollectionDetail\nCollectionDurationMinutes\nCollectionEndpoint\nCollectionErrorDetail\nCollectionFilters\nCollectionId\nCollectionIds\nCollectionName\nCollectionParameters\nCollectionSummary\nCollectionType\nCollectionVersion\nCollections\nCollectiveConstant\nCollector\nCollectorHealthCheck\nCollectorName\nCollectorNotFoundFault\nCollectorReferencedId\nCollectorResponse\nCollectorShortInfoResponse\nCollectorStatus\nCollectorVersion\nCollectors\nColor\nColorAxis\nColorCorrector\nColorFillType\nColorItemsLimit\nColorItemsLimitConfiguration\nColorLabelOptions\nColorMap\nColorMetadata\nColorRange\nColorScale\nColorSort\nColorSpace\nColorSpaceConversion\nColorSpacePassthroughSettings\nColorSpaceSettings\nColorSpaceUsage\nColorimetry\nColors\nColorsConfiguration\nColumn\nColumnConfiguration\nColumnConfigurations\nColumnDataRole\nColumnDefinition\nColumnDepth\nColumnDescription\nColumnError\nColumnFormat\nColumnFriendlyName\nColumnGeographicRole\nColumnGroup\nColumnGroupColumnSchema\nColumnGroupColumnSchemaList\nColumnGroupSchema\nColumnGroupSchemaList\nColumnGroups\nColumnHeaderStyle\nColumnHierarchies\nColumnHierarchy\nColumnId\nColumnIdentifier\nColumnImportance\nColumnImportances\nColumnIndex\nColumnInfo\nColumnLFTag\nColumnLabelOptions\nColumnLevelPermissionRule\nColumnLevelPermissionRules\nColumnLevelPermissionRulesApplied\nColumnList\nColumnMetadata\nColumnName\nColumnNames\nColumnNamesVisibility\nColumnRange\nColumnRowFilter\nColumnSchema\nColumnSchemaList\nColumnSelector\nColumnSelectors\nColumnSeparator\nColumnSort\nColumnSpan\nColumnStatistics\nColumnStatisticsConfiguration\nColumnStatisticsConfigurations\nColumnStatisticsData\nColumnStatisticsError\nColumnStatisticsList\nColumnSubtotalOptions\nColumnSynonyms\nColumnTag\nColumnToJsonKeyMappings\nColumnToMatch\nColumnTooltipItem\nColumnTotalOptions\nColumnType\nColumnWildcard\nColumns\nComboChartAggregatedFieldWells\nComboChartConfiguration\nComboChartFieldWells\nComboChartSortConfiguration\nComboChartVisual\nCommand\nCommandFilter\nCommandId\nCommandIds\nCommandInvocation\nCommandInvocations\nCommandPlugin\nCommandPlugins\nCommands\nComment\nCommentContent\nCommentContentRequiredException\nCommentContentSizeLimitExceededException\nCommentDeletedException\nCommentDoesNotExistException\nCommentFieldMappings\nCommentId\nCommentIdRequiredException\nCommentMetadata\nCommentNotCreatedByCallerException\nCommentStatus\nComments\nCommentsForComparedCommit\nCommentsForPullRequest\nCommit\nCommitDiff\nCommitDiffSourceCodeType\nCommitDigest\nCommitDoesNotExistException\nCommitId\nCommitIdDoesNotExistException\nCommitIdRequiredException\nCommitIdsLimitExceededException\nCommitIdsListRequiredException\nCommitMessage\nCommitMessageLengthExceededException\nCommitRequiredException\nCommitTransaction\nCommitTransactionRequest\nCommitTransactionResponse\nCommitTransactionResult\nCommitment\nCommitmentConfiguration\nCommitmentInformation\nCommonAttributes\nCommonName\nCommonPrefix\nCommonPrefixes\nCommsProtocol\nCommunication\nCommunicationTypeOptions\nCompUpdate\nCompany\nCompanyCode\nCompanyName\nComparativeOrder\nComparator\nCompareFacesMatch\nCompareFacesRequest\nCompareFacesResponse\nComparedFace\nComparedSourceImageFace\nComparison\nComparisonConfiguration\nComparisonFormat\nComparisonFormatConfiguration\nComparisonMethod\nComparisonOperator\nComparisonType\nComparisonValue\nComparisonValues\nCompatibility\nCompatibleArchitecture\nCompatibleArchitectures\nCompatibleElasticsearchVersions\nCompatibleEnvironmentTemplate\nCompatibleEnvironmentTemplateInput\nCompatibleImage\nCompatibleImages\nCompatibleKafkaVersion\nCompatibleKafkaVersions\nCompatibleNodes\nCompatibleRuntime\nCompatibleRuntimes\nCompatibleVersions\nCompatibleVersionsMap\nCompilationEndTime\nCompilationJobArn\nCompilationJobName\nCompilationJobStatus\nCompilationJobSummaries\nCompilationJobSummary\nCompilationStartTime\nCompilationTargetDevice\nCompilationTargetPlatformAccelerator\nCompilationTargetPlatformArch\nCompilationTargetPlatformOs\nCompiledOutputConfig\nCompilerOptions\nComplaint\nComplaintFeedbackType\nComplaintSubType\nComplaintTopic\nComplaints\nComplete\nCompleteAttachmentUploadRequest\nCompleteLayerUploadRequest\nCompleteLayerUploadResponse\nCompleteLifecycleActionType\nCompleteMigrationMessage\nCompleteMigrationResponse\nCompleteMultipartReadSetUploadRequest\nCompleteMultipartReadSetUploadResponse\nCompleteMultipartUploadInput\nCompleteMultipartUploadOutput\nCompleteMultipartUploadRequest\nCompleteOnConvergence\nCompleteReadSetUploadPartListItem\nCompleteSnapshotRequest\nCompleteSnapshotResponse\nCompleteTime\nCompleteVaultLockInput\nCompleteWindowMinutes\nCompleteWorkflowExecutionDecisionAttributes\nCompleteWorkflowExecutionFailedEventAttributes\nCompleted\nCompletedAt\nCompletedCount\nCompletedDate\nCompletedMultipartUpload\nCompletedOn\nCompletedPart\nCompletedPieces\nCompletedProperties\nCompletedTimestamp\nCompletionCriteria\nCompletionDate\nCompletionDateTime\nCompletionMessage\nCompletionReport\nCompletionStatus\nCompletionTime\nCompletionWindowMinutes\nComplexity\nCompliance\nComplianceAssociatedStandardsId\nComplianceByConfigRule\nComplianceByConfigRules\nComplianceByResource\nComplianceByResources\nComplianceContributorCount\nComplianceDetails\nComplianceDrift\nComplianceExecutionSummary\nComplianceItem\nComplianceItemEntry\nComplianceItems\nComplianceLevel\nComplianceResourceId\nComplianceResourceIds\nComplianceResourceType\nComplianceResourceTypes\nComplianceSecurityControlId\nComplianceSeverity\nComplianceStatus\nComplianceStringFilter\nComplianceSummariesByResourceType\nComplianceSummary\nComplianceSummaryByResourceType\nComplianceSummaryItem\nComplianceSummaryItems\nComplianceSummaryTimestamp\nComplianceType\nComplianceTypeCountLimitExceededException\nComplianceTypes\nComplianceViolator\nCompliantConformancePackCount\nCompliantCount\nCompliantCriticalCount\nCompliantHighCount\nCompliantInformationalCount\nCompliantLowCount\nCompliantMediumCount\nCompliantResourceCount\nCompliantRuleCount\nCompliantSummary\nCompliantUnspecifiedCount\nComponent\nComponentAccount\nComponentArn\nComponentBindingPropertiesValue\nComponentBindingPropertiesValueProperties\nComponentCandidate\nComponentChild\nComponentConditionProperty\nComponentConfiguration\nComponentConfigurationUpdate\nComponentDataConfiguration\nComponentDependencyRequirement\nComponentDeploymentSpecification\nComponentDescription\nComponentEvent\nComponentId\nComponentLatestVersion\nComponentName\nComponentParameter\nComponentParameterDetail\nComponentPlatform\nComponentProperty\nComponentPropertyBindingProperties\nComponentPropertyGroupRequest\nComponentPropertyGroupResponse\nComponentRecommendation\nComponentRegion\nComponentRemarks\nComponentRequest\nComponentResponse\nComponentRunWith\nComponentState\nComponentStatusData\nComponentSummary\nComponentTimestampDelimiter\nComponentType\nComponentTypeSummary\nComponentUpdateRequest\nComponentVariant\nComponentVersion\nComponentVersionArn\nComponentVersionListItem\nComponents\nComposeEnvironmentsMessage\nCompositeAlarm\nCompositeAlarms\nCompositeMemberIdentifier\nCompositeModelProperty\nCompositePartitionKey\nCompositeSlotTypeSetting\nCompositedVideo\nCompositedVideoArtifactsConfiguration\nCompositedVideoConcatenationConfiguration\nComposition\nComprehendMedicalAsyncJobFilter\nComprehendMedicalAsyncJobProperties\nComprehendMedicalAsyncJobPropertiesList\nCompress\nCompressed\nCompression\nCompressionFactor\nCompressionFormat\nCompressionType\nCompromisedCredentialsActionsType\nCompromisedCredentialsDetected\nCompromisedCredentialsRiskConfiguration\nCompromisedCredentialsRiskConfigurationType\nComputation\nComputationId\nComputationPreference\nComputations\nCompute\nComputeArn\nComputeAttributes\nComputeCapacity\nComputeCapacityStatus\nComputeConfig\nComputeEnvironmentDetail\nComputeEnvironmentOrder\nComputeFarmConfiguration\nComputeLimits\nComputeList\nComputeName\nComputeResource\nComputeResourceUpdate\nComputeResponse\nComputeStatistics\nComputeStatus\nComputeTime\nComputeType\nComputeTypeName\nComputeUtilization\nComputer\nComputerAttributes\nComputerId\nComputerName\nConcatenationSink\nConcatenationSource\nConcurrency\nConcurrentAccessException\nConcurrentDeploymentException\nConcurrentExecutionRatePercentage\nConcurrentExecutions\nConcurrentLimitExceededException\nConcurrentModification\nConcurrentModificationException\nConcurrentOperationException\nConcurrentReferenceUpdateException\nConcurrentRunsExceededException\nConcurrentUpdateException\nConcurrentUpdatingException\nCondition\nConditionBasedCollectionScheme\nConditionCheck\nConditionCheckFailureException\nConditionDocumentAttributeKey\nConditionExpression\nConditionExpressions\nConditionKey\nConditionOnValue\nConditionParameter\nConditionStepMetadata\nConditionType\nConditionValue\nConditionalBranch\nConditionalCheckFailedException\nConditionalFormatting\nConditionalFormattingColor\nConditionalFormattingCustomIconCondition\nConditionalFormattingCustomIconOptions\nConditionalFormattingGradientColor\nConditionalFormattingIcon\nConditionalFormattingIconDisplayConfiguration\nConditionalFormattingIconSet\nConditionalFormattingOptions\nConditionalFormattingSolidColor\nConditionalForwarder\nConditionalForwarderIpAddrs\nConditionalForwarders\nConditionalOperator\nConditionalSpecification\nConditionalSplit\nConditionalSplitActivity\nConditionalToken\nConditions\nConferencePreference\nConferenceProvider\nConferenceProviderArn\nConferenceProviderName\nConferenceProviderType\nConferenceProviders\nConfidence\nConfidenceScore\nConfig\nConfigCred\nConfigDeliveryS3DestinationArn\nConfigExportDeliveryInfo\nConfigFile\nConfigFileState\nConfigId\nConfigIdResponse\nConfigListItem\nConfigParameter\nConfigRecommendation\nConfigRule\nConfigRuleArn\nConfigRuleComplianceFilters\nConfigRuleComplianceSummaryFilters\nConfigRuleEvaluationStatus\nConfigRuleId\nConfigRuleInvokedTime\nConfigRuleName\nConfigRuleNames\nConfigRuleState\nConfigRules\nConfigRulesEvaluationStatus\nConfigSnapshotDeliveryProperties\nConfigStreamDeliveryInfo\nConfigType\nConfigUri\nConfiguration\nConfigurationAggregator\nConfigurationAggregatorArn\nConfigurationAggregatorName\nConfigurationAggregatorNames\nConfigurationAggregators\nConfigurationAlias\nConfigurationAliases\nConfigurationArn\nConfigurationEndpoint\nConfigurationErrorDetails\nConfigurationEvent\nConfigurationException\nConfigurationId\nConfigurationInfo\nConfigurationItem\nConfigurationLocationUri\nConfigurationManager\nConfigurationManagers\nConfigurationName\nConfigurationOptionDescription\nConfigurationOptionSetting\nConfigurationOptionsDescription\nConfigurationOverrides\nConfigurationProfile\nConfigurationProfileId\nConfigurationProfileIdentifier\nConfigurationProfileSummary\nConfigurationProfiles\nConfigurationRecorder\nConfigurationRecorderName\nConfigurationRecorderNames\nConfigurationRecorderStatus\nConfigurationRecorders\nConfigurationRecordersStatus\nConfigurationRevision\nConfigurationSchema\nConfigurationSet\nConfigurationSetAlreadyExistsException\nConfigurationSetArn\nConfigurationSetAttributeNames\nConfigurationSetDoesNotExistException\nConfigurationSetFilter\nConfigurationSetInformation\nConfigurationSetName\nConfigurationSetNames\nConfigurationSetSendingPausedException\nConfigurationSets\nConfigurationSettings\nConfigurationSettingsDescription\nConfigurationSettingsDescriptions\nConfigurationSettingsValidationMessages\nConfigurationSource\nConfigurationStatus\nConfigurationSummary\nConfigurationSyncStateSummary\nConfigurationSyncStatus\nConfigurationTag\nConfigurationTemplateQuota\nConfigurationTemplates\nConfigurationToken\nConfigurationType\nConfigurationTypeUpdate\nConfigurationUpdate\nConfigurationUpdates\nConfigurationVersion\nConfigurations\nConfigurationsVersion\nConfigure\nConfigureAccessPointRequest\nConfigureAccessPointResponse\nConfigureAgentRequest\nConfigureAgentResponse\nConfigureHealthCheckInput\nConfigureHealthCheckOutput\nConfigureLogsForChannelRequest\nConfigureLogsForChannelResponse\nConfigureLogsForPlaybackConfigurationRequest\nConfigureLogsForPlaybackConfigurationResponse\nConfigureLogsRequest\nConfigureLogsResponse\nConfigureShard\nConfigured\nConfiguredDataNodeCount\nConfiguredInput\nConfiguredTable\nConfiguredTableAnalysisRule\nConfiguredTableAssociation\nConfiguredTableAssociationSummary\nConfiguredTableSummary\nConfirmConnectionRequest\nConfirmConnectionResponse\nConfirmCustomerAgreementRequest\nConfirmCustomerAgreementResponse\nConfirmDeviceRequest\nConfirmDeviceResponse\nConfirmForgotPasswordRequest\nConfirmPrivateVirtualInterfaceRequest\nConfirmPrivateVirtualInterfaceResponse\nConfirmProductInstanceRequest\nConfirmProductInstanceResult\nConfirmPublicVirtualInterfaceRequest\nConfirmPublicVirtualInterfaceResponse\nConfirmRemoveSelfBucketAccess\nConfirmSignUpRequest\nConfirmSubscriptionInput\nConfirmSubscriptionResponse\nConfirmTopicRuleDestinationRequest\nConfirmTransitVirtualInterfaceRequest\nConfirmTransitVirtualInterfaceResponse\nConfirmationCode\nConfirmationRequired\nConflict\nConflictErrorException\nConflictException\nConflictExceptionErrorArgument\nConflictExceptionType\nConflictMetadata\nConflictResolution\nConflictResolvingModel\nConflictResource\nConflictType\nConflictingAlias\nConflictingAliasesList\nConflictingDomainExists\nConflictingItem\nConflictingItems\nConflictingOperationException\nConflictingPolicyId\nConflictingPriority\nConflictingResourceUpdateException\nConflictingTypes\nConfluenceAttachmentConfiguration\nConfluenceAttachmentToIndexFieldMapping\nConfluenceBlogConfiguration\nConfluenceBlogToIndexFieldMapping\nConfluenceConfiguration\nConfluencePageConfiguration\nConfluencePageToIndexFieldMapping\nConfluenceSpaceConfiguration\nConfluenceSpaceToIndexFieldMapping\nConformancePackArn\nConformancePackComplianceFilters\nConformancePackComplianceScore\nConformancePackComplianceScores\nConformancePackComplianceScoresFilters\nConformancePackComplianceStatus\nConformancePackComplianceSummary\nConformancePackComplianceSummaryList\nConformancePackDetail\nConformancePackDetails\nConformancePackEvaluationFilters\nConformancePackEvaluationResult\nConformancePackId\nConformancePackInputParameter\nConformancePackInputParameters\nConformancePackName\nConformancePackNames\nConformancePackRuleCompliance\nConformancePackRuleComplianceList\nConformancePackRuleEvaluationResults\nConformancePackState\nConformancePackStatusDetail\nConformancePackStatusDetails\nConformancePackStatusReason\nConformancePackTemplateValidationException\nConfusionMatrix\nConnectAppAuthorizationRequest\nConnectAppAuthorizationResponse\nConnectAttachment\nConnectAttachmentId\nConnectAttachmentOptions\nConnectCampaignArn\nConnectCampaignExecutionRoleArn\nConnectClientAddIn\nConnectCustomKeyStoreRequest\nConnectDirectoryRequest\nConnectDirectoryResult\nConnectIps\nConnectParticipant\nConnectPeer\nConnectPeerAssociation\nConnectPeerAssociations\nConnectPeerBgpConfiguration\nConnectPeerConfiguration\nConnectPeerId\nConnectPeerIds\nConnectPeerState\nConnectPeerSummary\nConnectPeers\nConnectSettings\nConnectedAt\nConnectedDatabase\nConnectedDeviceCount\nConnectedDeviceId\nConnectedDirectoriesCurrentCount\nConnectedDirectoriesLimit\nConnectedDirectoriesLimitReached\nConnectedHome\nConnectedHomeForUpdate\nConnectedHomeSettings\nConnectedHomeSettingsForUpdate\nConnectedLinkId\nConnectedToAgentTimestamp\nConnection\nConnectionAlias\nConnectionAliasAssociation\nConnectionAliasPermission\nConnectionAliasPermissions\nConnectionAliases\nConnectionApiKeyAuthResponseParameters\nConnectionArn\nConnectionAttempts\nConnectionAuthResponseParameters\nConnectionBasicAuthResponseParameters\nConnectionBodyParameter\nConnectionBorrowTimeout\nConnectionConfiguration\nConnectionCredentials\nConnectionDetails\nConnectionDirection\nConnectionDraining\nConnectionEndTime\nConnectionErrorCode\nConnectionEstablishedTime\nConnectionEvents\nConnectionExpiry\nConnectionHeaderParameter\nConnectionHealth\nConnectionHttpParameters\nConnectionId\nConnectionIdentifier\nConnectionIds\nConnectionInfo\nConnectionInput\nConnectionLimitExceededException\nConnectionList\nConnectionLogOptions\nConnectionLogResponseOptions\nConnectionLost\nConnectionMode\nConnectionName\nConnectionNameList\nConnectionNotification\nConnectionNotificationArn\nConnectionNotificationId\nConnectionNotificationIds\nConnectionNotificationSet\nConnectionNotificationState\nConnectionNotificationType\nConnectionOAuthClientResponseParameters\nConnectionOAuthResponseParameters\nConnectionParameters\nConnectionPasswordEncryption\nConnectionPoolConfig\nConnectionPoolConfiguration\nConnectionPoolConfigurationInfo\nConnectionProperties\nConnectionQueryStringParameter\nConnectionRefusedCount\nConnectionRetryInterval\nConnectionSettings\nConnectionState\nConnectionStateCheckTimestamp\nConnectionStatus\nConnectionStatusEventConfiguration\nConnectionStatusResourceTypeEventConfiguration\nConnectionStatusUpdatedTime\nConnectionStatuses\nConnectionString\nConnectionSummary\nConnectionSummaryList\nConnectionTable\nConnectionTimeout\nConnectionToken\nConnectionType\nConnections\nConnectionsList\nConnectivity\nConnectivityInfo\nConnectivityStatus\nConnectivityType\nConnector\nConnectorArn\nConnectorAuthenticationException\nConnectorConfigRequest\nConnectorConfigResponse\nConnectorConfiguration\nConnectorDefinitionId\nConnectorDefinitionVersion\nConnectorDefinitionVersionArn\nConnectorDefinitionVersionId\nConnectorDetail\nConnectorEntity\nConnectorEntityField\nConnectorFailureException\nConnectorId\nConnectorMetadata\nConnectorName\nConnectorOAuthRequest\nConnectorOperator\nConnectorProfile\nConnectorProfileConfig\nConnectorProfileCredentials\nConnectorProfileName\nConnectorProfileProperties\nConnectorProvisioningConfig\nConnectorRuntimeSetting\nConnectorServerException\nConnectorSummary\nConnectorTimeoutException\nConnectorType\nConnectors\nConsent\nConsistencyLevel\nConsistentRead\nConsoleAccess\nConsoleURL\nConsolidatedReportMetric\nConsolidation\nConsolidationKey\nConstant\nConstantBitrate\nConstantInitializationVector\nConstantIv\nConstantType\nConstraint\nConstraintDescription\nConstraintDetail\nConstraintDetails\nConstraintId\nConstraintParameters\nConstraintSummaries\nConstraintSummary\nConstraintViolationException\nConstraints\nConstraintsResource\nConsumedCapacity\nConsumedIOs\nConsumedLabels\nConsumedLicenseSummary\nConsumedLicenseSummaryList\nConsumedLicenses\nConsumedResources\nConsumedSpiceCapacityInBytes\nConsumedStatefulRuleCapacity\nConsumedStatelessRuleCapacity\nConsumedValue\nConsumer\nConsumerARN\nConsumerArn\nConsumerArns\nConsumerCount\nConsumerCreationTimestamp\nConsumerDescription\nConsumerGroupID\nConsumerGroupId\nConsumerIdentifier\nConsumerName\nConsumerRegion\nConsumerStatus\nConsumers\nConsumption\nConsumptionConfiguration\nContact\nContactAgentId\nContactArn\nContactCenter\nContactCenterActivity\nContactChannel\nContactChannelAddress\nContactChannelArn\nContactChannelId\nContactChannels\nContactContent\nContactData\nContactDetail\nContactEmail\nContactFilter\nContactFlow\nContactFlowArn\nContactFlowId\nContactFlowModule\nContactFlowModuleId\nContactFlowModuleState\nContactFlowModuleSummary\nContactFlowModulesSummaryList\nContactFlowNotPublishedException\nContactFlowState\nContactFlowSummary\nContactFlowSummaryList\nContactFlowType\nContactFlowTypes\nContactId\nContactIdResponse\nContactIds\nContactInformation\nContactLanguage\nContactList\nContactListDestination\nContactListImportAction\nContactListName\nContactLists\nContactMethod\nContactName\nContactNotFoundException\nContactNotes\nContactNumber\nContactPhoneNumber\nContactStates\nContactTargetInfo\nContactType\nContacts\nContainer\nContainerArguments\nContainerConfig\nContainerConfiguration\nContainerDatasetAction\nContainerDefinition\nContainerDefinitions\nContainerDependency\nContainerDetail\nContainerDetails\nContainerDistributionConfiguration\nContainerEntrypoint\nContainerFormat\nContainerHostname\nContainerImage\nContainerInUseException\nContainerInstance\nContainerInstanceHealthStatus\nContainerLevelMetrics\nContainerLogRotationConfiguration\nContainerName\nContainerNotFoundException\nContainerOverride\nContainerOverrides\nContainerPath\nContainerPort\nContainerProperties\nContainerProvider\nContainerRecipe\nContainerRecipeSummary\nContainerRecommendation\nContainerRuntime\nContainerService\nContainerServiceDeployment\nContainerServiceDeploymentRequest\nContainerServiceECRImagePullerRole\nContainerServiceECRImagePullerRoleRequest\nContainerServiceEndpoint\nContainerServiceHealthCheckConfig\nContainerServiceLogEvent\nContainerServicePower\nContainerServiceRegistryLogin\nContainerServiceStateDetail\nContainerServicesListResult\nContainerSettings\nContainerStartupHealthCheckTimeoutInSeconds\nContainerStateChange\nContainerSummary\nContainerType\nContainerUrl\nContainers\nContainsAll\nContainsAny\nContainsHeader\nContainsLabels\nContainsOldGroupVersions\nContainsPiiEntitiesRequest\nContainsPiiEntitiesResponse\nContent\nContentArtifactsConfiguration\nContentCategories\nContentClassifiers\nContentColumn\nContentConcatenationConfiguration\nContentConfig\nContentCreatedTimestamp\nContentData\nContentDigest\nContentDisposition\nContentEncoding\nContentHandlingStrategy\nContentHash\nContentIdentificationType\nContentLanguage\nContentLength\nContentMD5\nContentModerationDetection\nContentModifiedTimestamp\nContentRange\nContentRedaction\nContentRedactionOutput\nContentRedactionType\nContentReference\nContentSHA256\nContentSecurityPolicy\nContentSegmentUrlPrefix\nContentSha256\nContentShareLayout\nContentSourceConfiguration\nContentSummary\nContentTemplate\nContentTransformation\nContentType\nContentTypeOptions\nContentTypeProfile\nContentTypeProfileConfig\nContentTypeProfiles\nContentUrl\nContents\nContext\nContextArn\nContextAssertion\nContextData\nContextDataType\nContextEntries\nContextEntry\nContextId\nContextKeyName\nContextKeyNames\nContextKeyType\nContextKeyValues\nContextName\nContextScope\nContextScopeType\nContextSource\nContextSummaries\nContextSummary\nContextType\nContextWords\nContinentCode\nContinentName\nContinuationSequenceNumber\nContinuationToken\nContinueAsNewWorkflowExecutionDecisionAttributes\nContinueAsNewWorkflowExecutionFailedEventAttributes\nContinueDeploymentInput\nContinueUpdateRollbackInput\nContinuedFromContactId\nContinuousBackupsDescription\nContinuousBackupsStatus\nContinuousBackupsUnavailableException\nContinuousDeploymentPolicy\nContinuousDeploymentPolicyAlreadyExists\nContinuousDeploymentPolicyConfig\nContinuousDeploymentPolicyId\nContinuousDeploymentPolicyInUse\nContinuousDeploymentPolicyList\nContinuousDeploymentPolicySummary\nContinuousDeploymentSingleHeaderConfig\nContinuousDeploymentSingleWeightConfig\nContinuousExportDescription\nContinuousHyperParameterRange\nContinuousParameterRange\nContinuousParameterRangeSpecification\nContinuousParameterRanges\nContrast\nContributingSubnets\nContributionAnalysisDefault\nContributionAnalysisDefaults\nContributionMatrix\nContributionPercentage\nContributionScore\nContributor\nContributorDimensions\nContributorId\nContributorInsightsAction\nContributorInsightsRuleList\nContributorInsightsStatus\nContributorInsightsSummaries\nContributorInsightsSummary\nContributors\nControl\nControlComment\nControlDomainInsights\nControlFindingGenerator\nControlId\nControlInputParameter\nControlInputParameters\nControlInsightsMetadataByAssessmentItem\nControlInsightsMetadataItem\nControlMappingSource\nControlMetadata\nControlName\nControlOperation\nControlPanel\nControlPanelArn\nControlPanelName\nControlPanels\nControlPlanePlacementRequest\nControlPlanePlacementResponse\nControlPlaneTagFilter\nControlScope\nControlSet\nControlStatus\nControlStatusUpdatedAt\nControlTablesFileGroup\nControls\nConvergenceDetected\nConvergenceDetectedTime\nConversationId\nConversationLevelIntentClassificationResultItem\nConversationLevelResultDetail\nConversationLevelSlotResolutionResultItem\nConversationLevelTestResultItem\nConversationLevelTestResults\nConversationLevelTestResultsFilterBy\nConversationLogSettings\nConversationLogsDataSource\nConversationLogsDataSourceFilterBy\nConversationLogsRequest\nConversationLogsResponse\nConversationRetentionSettings\nConversionConfiguration\nConversionProperties\nConversionTask\nConversionTaskId\nConversionTaskIds\nConversionTasks\nConvert608To708\nConvertDotsInJsonKeysToUnderscores\nConvertPaintToPop\nConvertRecoveryPointToSnapshotRequest\nConvertRecoveryPointToSnapshotResponse\nConvertTimestampWithZoneToUTC\nCookie\nCookieBehavior\nCookieExpirationPeriod\nCookieMatchPattern\nCookieName\nCookieNames\nCookieObject\nCookiePreference\nCookieSpecification\nCookieSynchronizationConfiguration\nCookies\nCookiesConfig\nCoolDown\nCooldown\nCoolingPeriod\nCoordinates\nCoordinatorDpuSize\nCopyAction\nCopyActions\nCopyBackupRequest\nCopyBackupResponse\nCopyBackupToRegionRequest\nCopyBackupToRegionResponse\nCopyClusterSnapshotMessage\nCopyClusterSnapshotResult\nCopyCommand\nCopyDBClusterParameterGroupMessage\nCopyDBClusterParameterGroupResult\nCopyDBClusterSnapshotMessage\nCopyDBClusterSnapshotResult\nCopyDBParameterGroupMessage\nCopyDBParameterGroupResult\nCopyDBSnapshotMessage\nCopyDBSnapshotResult\nCopyDestinationImageSet\nCopyDestinationImageSetProperties\nCopyDistributionRequest\nCopyDistributionResult\nCopyFpgaImageRequest\nCopyFpgaImageResult\nCopyImageRequest\nCopyImageResponse\nCopyImageResult\nCopyImageSetInformation\nCopyImageSetRequest\nCopyImageSetResponse\nCopyImageTags\nCopyJob\nCopyJobId\nCopyJobs\nCopyObjectOutput\nCopyObjectRequest\nCopyObjectResult\nCopyOptionGroup\nCopyOptionGroupMessage\nCopyOptionGroupResult\nCopyOptions\nCopyPackageVersionsRequest\nCopyPackageVersionsResult\nCopyPartResult\nCopyProductInput\nCopyProductOutput\nCopyProductStatus\nCopyProductToken\nCopyProjectVersionRequest\nCopyProjectVersionResponse\nCopyProtectionAction\nCopySnapshotMessage\nCopySnapshotRequest\nCopySnapshotResponse\nCopySnapshotResult\nCopySource\nCopySourceArn\nCopySourceIfMatch\nCopySourceIfModifiedSince\nCopySourceIfNoneMatch\nCopySourceIfUnmodifiedSince\nCopySourceImageSetInformation\nCopySourceImageSetProperties\nCopySourceRange\nCopySourceSSECustomerAlgorithm\nCopySourceSSECustomerKey\nCopySourceSSECustomerKeyMD5\nCopySourceTagsToRestoredResource\nCopySourceVersionId\nCopyStepDetails\nCopyStrategy\nCopyTags\nCopyTagsFromSource\nCopyTagsToBackups\nCopyTagsToDataRepositoryAssociations\nCopyTagsToSnapshot\nCopyTagsToSnapshots\nCopyTagsToVolumes\nCopyTimestamp\nCopyToRegionDisabledFault\nCopyWorkspaceImageRequest\nCopyWorkspaceImageResult\nCopyableCrossAccount\nCopyrightHolder\nCore\nCoreCount\nCoreDefinitionId\nCoreDefinitionVersion\nCoreDefinitionVersionArn\nCoreDefinitionVersionId\nCoreDevice\nCoreDumpConfig\nCoreNetwork\nCoreNetworkAddress\nCoreNetworkArn\nCoreNetworkAsn\nCoreNetworkAttachmentArn\nCoreNetworkAttachmentId\nCoreNetworkChange\nCoreNetworkChangeEvent\nCoreNetworkChangeEventValues\nCoreNetworkChangeEvents\nCoreNetworkChangeValues\nCoreNetworkChanges\nCoreNetworkEdge\nCoreNetworkId\nCoreNetworkPolicy\nCoreNetworkPolicyError\nCoreNetworkPolicyException\nCoreNetworkPolicyVersion\nCoreNetworkPolicyVersions\nCoreNetworkSegment\nCoreNetworkSegmentEdge\nCoreNetworkSegmentEdgeIdentifier\nCoreNetworkSummary\nCoreNetworks\nCores\nCornerRadius\nCorrectedTerm\nCorrection\nCorrectionGateLevel\nCorrections\nCors\nCorsConfig\nCorsConfiguration\nCorsPolicy\nCorsPolicyNotFoundException\nCorsRule\nCost\nCostAllocationTag\nCostAllocationTagStatusEntry\nCostAllocationTags\nCostAllocationTagsStatus\nCostCategories\nCostCategory\nCostCategoryArn\nCostCategoryInheritedValueDimension\nCostCategoryName\nCostCategoryNames\nCostCategoryProcessingStatus\nCostCategoryReference\nCostCategoryReferences\nCostCategoryRule\nCostCategorySplitChargeRule\nCostCategorySplitChargeRuleParameter\nCostCategoryValues\nCostEstimate\nCostEstimationResourceCollectionFilter\nCostEstimationTimeRange\nCostFilters\nCostPerHour\nCostPerInference\nCostTypes\nCosts\nCount\nCountAction\nCountByCoverageStatus\nCountByResourceType\nCountBySeverity\nCountClosedWorkflowExecutionsInput\nCountDistinct\nCountDistinctLong\nCountLong\nCountNan\nCountNanLong\nCountNull\nCountNullLong\nCountOpenWorkflowExecutionsInput\nCountPendingActivityTasksInput\nCountPendingDecisionTasksInput\nCountPercent\nCountUpdate\nCounters\nCountry\nCountryCode\nCountryCodeIso2\nCountryCodeNumeric\nCountryCodes\nCountryName\nCounts\nCountsSummary\nCounty\nCoverage\nCoverageByTime\nCoverageCost\nCoverageDateFilter\nCoverageEksClusterDetails\nCoverageFilterCondition\nCoverageFilterCriteria\nCoverageFilterCriterion\nCoverageHours\nCoverageHoursPercentage\nCoverageMapFilter\nCoverageNormalizedUnits\nCoverageNormalizedUnitsPercentage\nCoveragePercentage\nCoverageResource\nCoverageResourceDetails\nCoverageSortCriteria\nCoverageStatistics\nCoverageStatus\nCoverageStringFilter\nCoverageTime\nCoveragesByTime\nCoveredNodes\nCoveredResource\nCoversBodyPart\nCpsLimit\nCpsUri\nCpu\nCpuCredits\nCpuManufacturers\nCpuOptions\nCpuOptionsRequest\nCpuThreshold\nCpuUtilization\nCrawl\nCrawlArchivedSpaces\nCrawlAttachments\nCrawlBotMessage\nCrawlChatRooms\nCrawlComments\nCrawlDepth\nCrawlElapsedTime\nCrawlFileComments\nCrawlId\nCrawlIssue\nCrawlIssueComment\nCrawlIssueCommentAttachment\nCrawlPersonalSpaces\nCrawlPullRequest\nCrawlPullRequestComment\nCrawlPullRequestCommentAttachment\nCrawlRepositoryDocuments\nCrawlState\nCrawlSystemFolders\nCrawlTasks\nCrawlWebLinks\nCrawler\nCrawlerConnection\nCrawlerDetails\nCrawlerHistory\nCrawlerLineageSettings\nCrawlerMetrics\nCrawlerMetricsList\nCrawlerName\nCrawlerNameList\nCrawlerNames\nCrawlerNodeDetails\nCrawlerNotRunningException\nCrawlerRunningException\nCrawlerSecurityConfiguration\nCrawlerStoppingException\nCrawlerTargets\nCrawlers\nCrawlersNotFound\nCrawls\nCrawlsFilter\nCreate\nCreateACLRequest\nCreateACLResponse\nCreateAPIKeyRequest\nCreateAPIKeyResponse\nCreateAcceleratorRequest\nCreateAcceleratorResponse\nCreateAccessControlConfigurationRequest\nCreateAccessControlConfigurationResponse\nCreateAccessKeyRequest\nCreateAccessKeyResponse\nCreateAccessLogSubscriptionRequest\nCreateAccessLogSubscriptionResponse\nCreateAccessPointForObjectLambdaRequest\nCreateAccessPointForObjectLambdaResult\nCreateAccessPointInput\nCreateAccessPointOutput\nCreateAccessPointRequest\nCreateAccessPointResult\nCreateAccessPolicyRequest\nCreateAccessPolicyResponse\nCreateAccessPreviewRequest\nCreateAccessPreviewResponse\nCreateAccessRequest\nCreateAccessResponse\nCreateAccessTokenRequest\nCreateAccessTokenResponse\nCreateAccessorInput\nCreateAccessorOutput\nCreateAccountAliasRequest\nCreateAccountAssignmentRequest\nCreateAccountAssignmentResponse\nCreateAccountCustomizationRequest\nCreateAccountCustomizationResponse\nCreateAccountRequest\nCreateAccountRequestId\nCreateAccountResponse\nCreateAccountStatus\nCreateAccountStatusNotFoundException\nCreateAccountStatuses\nCreateAccountSubscriptionRequest\nCreateAccountSubscriptionResponse\nCreateActionRequest\nCreateActionResponse\nCreateActionTargetRequest\nCreateActionTargetResponse\nCreateActivationRequest\nCreateActivationResult\nCreateActivityInput\nCreateActivityOutput\nCreateAdditionalAssignmentsForHITRequest\nCreateAddonRequest\nCreateAddonResponse\nCreateAddressBookRequest\nCreateAddressBookResponse\nCreateAddressRequest\nCreateAddressResult\nCreateAgentRequest\nCreateAgentResponse\nCreateAgentStatusRequest\nCreateAgentStatusResponse\nCreateAgreementRequest\nCreateAgreementResponse\nCreateAlarmModelRequest\nCreateAlarmModelResponse\nCreateAlertManagerDefinitionRequest\nCreateAlertManagerDefinitionResponse\nCreateAlertRequest\nCreateAlertResponse\nCreateAlgorithmInput\nCreateAlgorithmOutput\nCreateAliasInput\nCreateAliasOutput\nCreateAliasRequest\nCreateAliasResult\nCreateAllowListRequest\nCreateAllowListResponse\nCreateAnalysisRequest\nCreateAnalysisResponse\nCreateAnalysisTemplateInput\nCreateAnalysisTemplateOutput\nCreateAnalyzerRequest\nCreateAnalyzerResponse\nCreateAnnotationStoreRequest\nCreateAnnotationStoreResponse\nCreateAnnotationStoreVersionRequest\nCreateAnnotationStoreVersionResponse\nCreateAnomalyDetectorRequest\nCreateAnomalyDetectorResponse\nCreateAnomalyMonitorRequest\nCreateAnomalyMonitorResponse\nCreateAnomalySubscriptionRequest\nCreateAnomalySubscriptionResponse\nCreateApiCacheRequest\nCreateApiCacheResponse\nCreateApiDestinationRequest\nCreateApiDestinationResponse\nCreateApiKeyRequest\nCreateApiKeyResponse\nCreateApiMappingRequest\nCreateApiMappingResponse\nCreateApiRequest\nCreateApiResponse\nCreateAppAuthorizationRequest\nCreateAppAuthorizationResponse\nCreateAppBlockBuilderRequest\nCreateAppBlockBuilderResult\nCreateAppBlockBuilderStreamingURLRequest\nCreateAppBlockBuilderStreamingURLResult\nCreateAppBlockRequest\nCreateAppBlockResult\nCreateAppBundleRequest\nCreateAppBundleResponse\nCreateAppCookieStickinessPolicyInput\nCreateAppImageConfigRequest\nCreateAppImageConfigResponse\nCreateAppInstanceAdminRequest\nCreateAppInstanceAdminResponse\nCreateAppInstanceBotRequest\nCreateAppInstanceBotResponse\nCreateAppInstanceRequest\nCreateAppInstanceResponse\nCreateAppInstanceUserRequest\nCreateAppInstanceUserResponse\nCreateAppMonitorRequest\nCreateAppMonitorResponse\nCreateAppRequest\nCreateAppResponse\nCreateAppResult\nCreateAppVersionAppComponentRequest\nCreateAppVersionAppComponentResponse\nCreateAppVersionResourceRequest\nCreateAppVersionResourceResponse\nCreateApplicationInput\nCreateApplicationInstanceRequest\nCreateApplicationInstanceResponse\nCreateApplicationMessage\nCreateApplicationOutput\nCreateApplicationPresignedUrlRequest\nCreateApplicationPresignedUrlResponse\nCreateApplicationRequest\nCreateApplicationResponse\nCreateApplicationResult\nCreateApplicationSnapshotRequest\nCreateApplicationVersionMessage\nCreateApplicationVersionRequest\nCreateApplicationVersionResponse\nCreateApprovalRuleTemplateInput\nCreateApprovalRuleTemplateOutput\nCreateArchiveRequest\nCreateArchiveResponse\nCreateArchiveRuleRequest\nCreateArtifactRequest\nCreateArtifactResponse\nCreateAssessmentFrameworkControl\nCreateAssessmentFrameworkControlSet\nCreateAssessmentFrameworkRequest\nCreateAssessmentFrameworkResponse\nCreateAssessmentReportRequest\nCreateAssessmentReportResponse\nCreateAssessmentRequest\nCreateAssessmentResponse\nCreateAssessmentTargetRequest\nCreateAssessmentTargetResponse\nCreateAssessmentTemplateRequest\nCreateAssessmentTemplateResponse\nCreateAssetModelRequest\nCreateAssetModelResponse\nCreateAssetRequest\nCreateAssetResponse\nCreateAssistantAssociationRequest\nCreateAssistantAssociationResponse\nCreateAssistantRequest\nCreateAssistantResponse\nCreateAssociationBatchRequest\nCreateAssociationBatchRequestEntry\nCreateAssociationBatchResult\nCreateAssociationRequest\nCreateAssociationResult\nCreateAttendeeError\nCreateAttendeeRequest\nCreateAttendeeRequestItem\nCreateAttendeeResponse\nCreateAttributeGroupRequest\nCreateAttributeGroupResponse\nCreateAuditSuppressionRequest\nCreateAuthChallenge\nCreateAuthenticationProfileMessage\nCreateAuthenticationProfileResult\nCreateAuthorizerRequest\nCreateAuthorizerResponse\nCreateAutoMLJobRequest\nCreateAutoMLJobResponse\nCreateAutoMLJobV2Request\nCreateAutoMLJobV2Response\nCreateAutoPredictorRequest\nCreateAutoPredictorResponse\nCreateAutoScalingConfigurationRequest\nCreateAutoScalingConfigurationResponse\nCreateAutoScalingGroupType\nCreateAutomationRuleRequest\nCreateAutomationRuleResponse\nCreateAvailabilityConfigurationRequest\nCreateAwsLogSourceRequest\nCreateAwsLogSourceResponse\nCreateBGPPeerRequest\nCreateBGPPeerResponse\nCreateBackendAPIRequest\nCreateBackendAPIResponse\nCreateBackendAuthForgotPasswordConfig\nCreateBackendAuthIdentityPoolConfig\nCreateBackendAuthMFAConfig\nCreateBackendAuthOAuthConfig\nCreateBackendAuthPasswordPolicyConfig\nCreateBackendAuthRequest\nCreateBackendAuthResourceConfig\nCreateBackendAuthResponse\nCreateBackendAuthUserPoolConfig\nCreateBackendAuthVerificationMessageConfig\nCreateBackendConfigRequest\nCreateBackendConfigResponse\nCreateBackendEnvironmentRequest\nCreateBackendEnvironmentResult\nCreateBackendRequest\nCreateBackendResponse\nCreateBackendStorageRequest\nCreateBackendStorageResourceConfig\nCreateBackendStorageResponse\nCreateBackupInput\nCreateBackupOutput\nCreateBackupPlanInput\nCreateBackupPlanOutput\nCreateBackupRequest\nCreateBackupResponse\nCreateBackupSelectionInput\nCreateBackupSelectionOutput\nCreateBackupVaultInput\nCreateBackupVaultOutput\nCreateBasePathMappingRequest\nCreateBatchImportJobRequest\nCreateBatchInferenceJobRequest\nCreateBatchInferenceJobResponse\nCreateBatchLoadTaskRequest\nCreateBatchLoadTaskResponse\nCreateBatchPredictionInput\nCreateBatchPredictionJobRequest\nCreateBatchPredictionOutput\nCreateBatchSegmentJobRequest\nCreateBatchSegmentJobResponse\nCreateBillingGroupInput\nCreateBillingGroupOutput\nCreateBillingGroupRequest\nCreateBillingGroupResponse\nCreateBlueGreenDeploymentRequest\nCreateBlueGreenDeploymentResponse\nCreateBlueprintRequest\nCreateBlueprintResponse\nCreateBotAliasRequest\nCreateBotAliasResponse\nCreateBotLocaleRequest\nCreateBotLocaleResponse\nCreateBotRequest\nCreateBotResponse\nCreateBotVersionRequest\nCreateBotVersionResponse\nCreateBranchInput\nCreateBranchRequest\nCreateBranchResult\nCreateBridge420Exception\nCreateBridgeRequest\nCreateBridgeResponse\nCreateBrokerRequest\nCreateBrokerResponse\nCreateBrowserSettingsRequest\nCreateBrowserSettingsResponse\nCreateBucketAccessKeyRequest\nCreateBucketAccessKeyResult\nCreateBucketConfiguration\nCreateBucketOutput\nCreateBucketRequest\nCreateBucketResult\nCreateBudgetActionRequest\nCreateBudgetActionResponse\nCreateBudgetRequest\nCreateBuildInput\nCreateBuildOutput\nCreateBulkImportJobRequest\nCreateBulkImportJobResponse\nCreateBusinessReportScheduleRequest\nCreateBusinessReportScheduleResponse\nCreateByteMatchSetRequest\nCreateByteMatchSetResponse\nCreateCacheClusterMessage\nCreateCacheClusterResult\nCreateCacheParameterGroupMessage\nCreateCacheParameterGroupResult\nCreateCachePolicyRequest\nCreateCachePolicyResult\nCreateCacheSecurityGroupMessage\nCreateCacheSecurityGroupResult\nCreateCacheSubnetGroupMessage\nCreateCacheSubnetGroupResult\nCreateCachediSCSIVolumeInput\nCreateCachediSCSIVolumeOutput\nCreateCalculatedAttributeDefinitionRequest\nCreateCalculatedAttributeDefinitionResponse\nCreateCallAnalyticsCategoryRequest\nCreateCallAnalyticsCategoryResponse\nCreateCampaignRequest\nCreateCampaignResponse\nCreateCanaryRequest\nCreateCanaryResponse\nCreateCapacityProviderRequest\nCreateCapacityProviderResponse\nCreateCapacityReservationFleetRequest\nCreateCapacityReservationFleetResult\nCreateCapacityReservationInput\nCreateCapacityReservationRequest\nCreateCapacityReservationResult\nCreateCarrierGatewayRequest\nCreateCarrierGatewayResult\nCreateCaseRequest\nCreateCaseResponse\nCreateCellRequest\nCreateCellResponse\nCreateCertificateAuthorityAuditReportRequest\nCreateCertificateAuthorityAuditReportResponse\nCreateCertificateAuthorityRequest\nCreateCertificateAuthorityResponse\nCreateCertificateFromCsrRequest\nCreateCertificateFromCsrResponse\nCreateCertificateRequest\nCreateCertificateResult\nCreateChangeSetInput\nCreateChangeSetOutput\nCreateChangesetRequest\nCreateChangesetResponse\nCreateChannelBanRequest\nCreateChannelBanResponse\nCreateChannelFlowRequest\nCreateChannelFlowResponse\nCreateChannelGroupRequest\nCreateChannelGroupResponse\nCreateChannelMembershipRequest\nCreateChannelMembershipResponse\nCreateChannelModeratorRequest\nCreateChannelModeratorResponse\nCreateChannelRequest\nCreateChannelResponse\nCreateChatTokenRequest\nCreateChatTokenResponse\nCreateCidrCollectionRequest\nCreateCidrCollectionResponse\nCreateClassificationJobRequest\nCreateClassificationJobResponse\nCreateClassifierRequest\nCreateCliTokenRequest\nCreateCliTokenResponse\nCreateClientVpnEndpointRequest\nCreateClientVpnEndpointResult\nCreateClientVpnRouteRequest\nCreateClientVpnRouteResult\nCreateCloudFormationChangeSetRequest\nCreateCloudFormationChangeSetResponse\nCreateCloudFormationStackRequest\nCreateCloudFormationStackResult\nCreateCloudFormationTemplateRequest\nCreateCloudFormationTemplateResponse\nCreateCloudFrontOriginAccessIdentityRequest\nCreateCloudFrontOriginAccessIdentityResult\nCreateClusterInput\nCreateClusterMessage\nCreateClusterOutput\nCreateClusterParameterGroupMessage\nCreateClusterParameterGroupResult\nCreateClusterRequest\nCreateClusterResponse\nCreateClusterResult\nCreateClusterSecurityGroupMessage\nCreateClusterSecurityGroupResult\nCreateClusterSnapshotInput\nCreateClusterSnapshotMessage\nCreateClusterSnapshotOutput\nCreateClusterSnapshotResult\nCreateClusterSubnetGroupMessage\nCreateClusterSubnetGroupResult\nCreateClusterV2Request\nCreateClusterV2Response\nCreateCodeRepositoryInput\nCreateCodeRepositoryOutput\nCreateCodeReviewRequest\nCreateCodeReviewResponse\nCreateCodeSigningConfigRequest\nCreateCodeSigningConfigResponse\nCreateCoipCidrRequest\nCreateCoipCidrResult\nCreateCoipPoolRequest\nCreateCoipPoolResult\nCreateCollaborationInput\nCreateCollaborationOutput\nCreateCollectionDetail\nCreateCollectionRequest\nCreateCollectionResponse\nCreateColumn\nCreateColumnsOperation\nCreateCommentRequest\nCreateCommentResponse\nCreateCommitInput\nCreateCommitOutput\nCreateCompilationJobRequest\nCreateCompilationJobResponse\nCreateComponentData\nCreateComponentInput\nCreateComponentOutput\nCreateComponentRequest\nCreateComponentResponse\nCreateComponentTypeRequest\nCreateComponentTypeResponse\nCreateComponentVersionRequest\nCreateComponentVersionResponse\nCreateComputeEnvironmentRequest\nCreateComputeEnvironmentResponse\nCreateComputerRequest\nCreateComputerResult\nCreateConditionalForwarderRequest\nCreateConferenceProviderRequest\nCreateConferenceProviderResponse\nCreateConfigRequest\nCreateConfigurationProfileRequest\nCreateConfigurationRequest\nCreateConfigurationResponse\nCreateConfigurationSetEventDestinationRequest\nCreateConfigurationSetRequest\nCreateConfigurationSetResult\nCreateConfigurationSetTrackingOptionsRequest\nCreateConfigurationTemplateMessage\nCreateConfiguredTableAnalysisRuleInput\nCreateConfiguredTableAnalysisRuleOutput\nCreateConfiguredTableAssociationInput\nCreateConfiguredTableAssociationOutput\nCreateConfiguredTableInput\nCreateConfiguredTableOutput\nCreateConnectAttachmentRequest\nCreateConnectAttachmentResponse\nCreateConnectClientAddInRequest\nCreateConnectClientAddInResult\nCreateConnectPeerRequest\nCreateConnectPeerResponse\nCreateConnectionAliasRequest\nCreateConnectionAliasResult\nCreateConnectionApiKeyAuthRequestParameters\nCreateConnectionAuthRequestParameters\nCreateConnectionBasicAuthRequestParameters\nCreateConnectionInput\nCreateConnectionOAuthClientRequestParameters\nCreateConnectionOAuthRequestParameters\nCreateConnectionOutput\nCreateConnectionRequest\nCreateConnectionResponse\nCreateConnectorDefinitionRequest\nCreateConnectorDefinitionResponse\nCreateConnectorDefinitionVersionRequest\nCreateConnectorDefinitionVersionResponse\nCreateConnectorProfileRequest\nCreateConnectorProfileResponse\nCreateConnectorRequest\nCreateConnectorResponse\nCreateConstraintInput\nCreateConstraintOutput\nCreateContactChannelRequest\nCreateContactChannelResult\nCreateContactFlowModuleRequest\nCreateContactFlowModuleResponse\nCreateContactFlowRequest\nCreateContactFlowResponse\nCreateContactListRequest\nCreateContactMethodRequest\nCreateContactMethodResult\nCreateContactRequest\nCreateContactResponse\nCreateContactResult\nCreateContainerInput\nCreateContainerOutput\nCreateContainerRecipeRequest\nCreateContainerRecipeResponse\nCreateContainerServiceDeploymentRequest\nCreateContainerServiceDeploymentResult\nCreateContainerServiceRegistryLoginResult\nCreateContainerServiceRequest\nCreateContainerServiceResult\nCreateContentRequest\nCreateContentResponse\nCreateContextRequest\nCreateContextResponse\nCreateContinuousDeploymentPolicyRequest\nCreateContinuousDeploymentPolicyResult\nCreateControlMappingSource\nCreateControlPanelRequest\nCreateControlPanelResponse\nCreateControlRequest\nCreateControlResponse\nCreateCoreDefinitionRequest\nCreateCoreDefinitionResponse\nCreateCoreDefinitionVersionRequest\nCreateCoreDefinitionVersionResponse\nCreateCoreNetworkRequest\nCreateCoreNetworkResponse\nCreateCostCategoryDefinitionRequest\nCreateCostCategoryDefinitionResponse\nCreateCrawlerRequest\nCreateCrossAccountAuthorizationRequest\nCreateCrossAccountAuthorizationResponse\nCreateCsvClassifierRequest\nCreateCustomActionTypeInput\nCreateCustomActionTypeOutput\nCreateCustomDBEngineVersionFault\nCreateCustomDBEngineVersionMessage\nCreateCustomDataIdentifierRequest\nCreateCustomDataIdentifierResponse\nCreateCustomDomainAssociationMessage\nCreateCustomDomainAssociationResult\nCreateCustomEntityTypeRequest\nCreateCustomEntityTypeResponse\nCreateCustomKeyStoreRequest\nCreateCustomKeyStoreResponse\nCreateCustomLineItemInput\nCreateCustomLineItemOutput\nCreateCustomLogSourceRequest\nCreateCustomLogSourceResponse\nCreateCustomMetadataRequest\nCreateCustomMetricRequest\nCreateCustomMetricResponse\nCreateCustomPluginRequest\nCreateCustomPluginResponse\nCreateCustomRoutingAcceleratorRequest\nCreateCustomRoutingAcceleratorResponse\nCreateCustomRoutingEndpointGroupRequest\nCreateCustomRoutingEndpointGroupResponse\nCreateCustomRoutingListenerRequest\nCreateCustomRoutingListenerResponse\nCreateCustomVerificationEmailTemplateRequest\nCreateCustomerGatewayRequest\nCreateCustomerGatewayResult\nCreateDBClusterEndpointMessage\nCreateDBClusterEndpointOutput\nCreateDBClusterMessage\nCreateDBClusterParameterGroupMessage\nCreateDBClusterParameterGroupResult\nCreateDBClusterResult\nCreateDBClusterSnapshotMessage\nCreateDBClusterSnapshotResult\nCreateDBInstanceMessage\nCreateDBInstanceReadReplicaMessage\nCreateDBInstanceReadReplicaResult\nCreateDBInstanceResult\nCreateDBParameterGroupMessage\nCreateDBParameterGroupResult\nCreateDBProxyEndpointRequest\nCreateDBProxyEndpointResponse\nCreateDBProxyRequest\nCreateDBProxyResponse\nCreateDBSecurityGroupMessage\nCreateDBSecurityGroupResult\nCreateDBSnapshotMessage\nCreateDBSnapshotResult\nCreateDBSubnetGroupMessage\nCreateDBSubnetGroupResult\nCreateDashboardRequest\nCreateDashboardResponse\nCreateDataCatalogInput\nCreateDataCellsFilterRequest\nCreateDataIntegrationRequest\nCreateDataIntegrationResponse\nCreateDataLakeExceptionSubscriptionRequest\nCreateDataLakeOrganizationConfigurationRequest\nCreateDataLakeRequest\nCreateDataLakeResponse\nCreateDataProviderMessage\nCreateDataProviderResponse\nCreateDataQualityJobDefinitionRequest\nCreateDataQualityJobDefinitionResponse\nCreateDataQualityRulesetRequest\nCreateDataQualityRulesetResponse\nCreateDataRepositoryAssociationRequest\nCreateDataRepositoryAssociationResponse\nCreateDataRepositoryTaskRequest\nCreateDataRepositoryTaskResponse\nCreateDataSetImportTaskRequest\nCreateDataSetImportTaskResponse\nCreateDataSetRequest\nCreateDataSetResponse\nCreateDataSourceFromRDSInput\nCreateDataSourceFromRDSOutput\nCreateDataSourceFromRedshiftInput\nCreateDataSourceFromRedshiftOutput\nCreateDataSourceFromS3Input\nCreateDataSourceFromS3Output\nCreateDataSourceRequest\nCreateDataSourceResponse\nCreateDataViewRequest\nCreateDataViewResponse\nCreateDatabaseDefaultPermissions\nCreateDatabaseRequest\nCreateDatabaseResponse\nCreateDataflowEndpointGroupRequest\nCreateDatasetContentRequest\nCreateDatasetContentResponse\nCreateDatasetExportJobRequest\nCreateDatasetExportJobResponse\nCreateDatasetGroupRequest\nCreateDatasetGroupResponse\nCreateDatasetImportJobRequest\nCreateDatasetImportJobResponse\nCreateDatasetRequest\nCreateDatasetResponse\nCreateDatastoreRequest\nCreateDatastoreResponse\nCreateDate\nCreateDecoderManifestRequest\nCreateDecoderManifestResponse\nCreateDedicatedIpPoolRequest\nCreateDefaultSubnetRequest\nCreateDefaultSubnetResult\nCreateDefaultVpcRequest\nCreateDefaultVpcResult\nCreateDelegationRequest\nCreateDeliverabilityTestReportRequest\nCreateDeliverabilityTestReportResponse\nCreateDeliveryStreamInput\nCreateDeliveryStreamOutput\nCreateDeploymentConfigInput\nCreateDeploymentConfigOutput\nCreateDeploymentGroupInput\nCreateDeploymentGroupOutput\nCreateDeploymentInput\nCreateDeploymentJobRequest\nCreateDeploymentJobResponse\nCreateDeploymentOutput\nCreateDeploymentRequest\nCreateDeploymentResponse\nCreateDeploymentResult\nCreateDeploymentStrategyRequest\nCreateDestinationRequest\nCreateDestinationResponse\nCreateDetectorModelRequest\nCreateDetectorModelResponse\nCreateDetectorRequest\nCreateDetectorResponse\nCreateDetectorVersionRequest\nCreateDetectorVersionResult\nCreateDevEndpointRequest\nCreateDevEndpointResponse\nCreateDevEnvironmentRequest\nCreateDevEnvironmentResponse\nCreateDeviceDefinitionRequest\nCreateDeviceDefinitionResponse\nCreateDeviceDefinitionVersionRequest\nCreateDeviceDefinitionVersionResponse\nCreateDeviceFleetRequest\nCreateDevicePoolRequest\nCreateDevicePoolResult\nCreateDeviceProfileRequest\nCreateDeviceProfileResponse\nCreateDeviceRequest\nCreateDeviceResponse\nCreateDhcpOptionsRequest\nCreateDhcpOptionsResult\nCreateDimensionRequest\nCreateDimensionResponse\nCreateDirectConnectGatewayAssociationProposalRequest\nCreateDirectConnectGatewayAssociationProposalResult\nCreateDirectConnectGatewayAssociationRequest\nCreateDirectConnectGatewayAssociationResult\nCreateDirectConnectGatewayRequest\nCreateDirectConnectGatewayResult\nCreateDirectoryConfigRequest\nCreateDirectoryConfigResult\nCreateDirectoryRegistrationRequest\nCreateDirectoryRegistrationResponse\nCreateDirectoryRequest\nCreateDirectoryResponse\nCreateDirectoryResult\nCreateDiscovererRequest\nCreateDiscovererResponse\nCreateDiskFromSnapshotRequest\nCreateDiskFromSnapshotResult\nCreateDiskRequest\nCreateDiskResult\nCreateDiskSnapshotRequest\nCreateDiskSnapshotResult\nCreateDistributionConfigurationRequest\nCreateDistributionConfigurationResponse\nCreateDistributionRequest\nCreateDistributionResult\nCreateDistributionWithTagsRequest\nCreateDistributionWithTagsResult\nCreateDocumentClassifierRequest\nCreateDocumentClassifierResponse\nCreateDocumentRequest\nCreateDocumentResult\nCreateDocumentationPartRequest\nCreateDocumentationVersionRequest\nCreateDomainAssociationRequest\nCreateDomainAssociationResult\nCreateDomainConfigurationRequest\nCreateDomainConfigurationResponse\nCreateDomainEntryRequest\nCreateDomainEntryResult\nCreateDomainNameRequest\nCreateDomainNameResponse\nCreateDomainRequest\nCreateDomainResponse\nCreateDomainResult\nCreateDynamicThingGroupRequest\nCreateDynamicThingGroupResponse\nCreateEdgeDeploymentPlanRequest\nCreateEdgeDeploymentPlanResponse\nCreateEdgeDeploymentStageRequest\nCreateEdgePackagingJobRequest\nCreateEgressOnlyInternetGatewayRequest\nCreateEgressOnlyInternetGatewayResult\nCreateElasticsearchDomainRequest\nCreateElasticsearchDomainResponse\nCreateEmailIdentityPolicyRequest\nCreateEmailIdentityRequest\nCreateEmailIdentityResponse\nCreateEmailTemplateRequest\nCreateEmailTemplateResponse\nCreateEndOfMeetingReminder\nCreateEndpointAccessMessage\nCreateEndpointAccessRequest\nCreateEndpointAccessResponse\nCreateEndpointConfigInput\nCreateEndpointConfigOutput\nCreateEndpointGroupRequest\nCreateEndpointGroupResponse\nCreateEndpointInput\nCreateEndpointMessage\nCreateEndpointOutput\nCreateEndpointRequest\nCreateEndpointResponse\nCreateEndpointResult\nCreateEntitlementRequest\nCreateEntitlementResult\nCreateEntityRecognizerRequest\nCreateEntityRecognizerResponse\nCreateEntityRequest\nCreateEntityResponse\nCreateEnvironmentAccountConnectionInput\nCreateEnvironmentAccountConnectionOutput\nCreateEnvironmentEC2Request\nCreateEnvironmentEC2Result\nCreateEnvironmentInput\nCreateEnvironmentMembershipRequest\nCreateEnvironmentMembershipResult\nCreateEnvironmentMessage\nCreateEnvironmentOutput\nCreateEnvironmentRequest\nCreateEnvironmentResponse\nCreateEnvironmentTemplateInput\nCreateEnvironmentTemplateOutput\nCreateEnvironmentTemplateVersionInput\nCreateEnvironmentTemplateVersionOutput\nCreateEphemerisRequest\nCreateEvaluationFormRequest\nCreateEvaluationFormResponse\nCreateEvaluationInput\nCreateEvaluationOutput\nCreateEventActionRequest\nCreateEventActionResponse\nCreateEventBusRequest\nCreateEventBusResponse\nCreateEventDataStoreRequest\nCreateEventDataStoreResponse\nCreateEventDestinationRequest\nCreateEventDestinationResult\nCreateEventIntegrationRequest\nCreateEventIntegrationResponse\nCreateEventSourceMappingRequest\nCreateEventStreamRequest\nCreateEventStreamResponse\nCreateEventSubscriptionMessage\nCreateEventSubscriptionResponse\nCreateEventSubscriptionResult\nCreateEventTrackerRequest\nCreateEventTrackerResponse\nCreateExclusionsPreviewRequest\nCreateExclusionsPreviewResponse\nCreateExperienceRequest\nCreateExperienceResponse\nCreateExperimentRequest\nCreateExperimentResponse\nCreateExperimentTemplateActionInput\nCreateExperimentTemplateLogConfigurationInput\nCreateExperimentTemplateRequest\nCreateExperimentTemplateResponse\nCreateExperimentTemplateStopConditionInput\nCreateExperimentTemplateTargetInput\nCreateExplainabilityExportRequest\nCreateExplainabilityExportResponse\nCreateExplainabilityRequest\nCreateExplainabilityResponse\nCreateExportJobRequest\nCreateExportJobResponse\nCreateExportRequest\nCreateExportResponse\nCreateExportTaskRequest\nCreateExportTaskResponse\nCreateExtendedSourceServerRequest\nCreateExtendedSourceServerResponse\nCreateExtensionAssociationRequest\nCreateExtensionRequest\nCreateFHIRDatastoreRequest\nCreateFHIRDatastoreResponse\nCreateFaceLivenessSessionRequest\nCreateFaceLivenessSessionRequestSettings\nCreateFaceLivenessSessionResponse\nCreateFacetRequest\nCreateFaqRequest\nCreateFaqResponse\nCreateFargateProfileRequest\nCreateFargateProfileResponse\nCreateFeatureGroupRequest\nCreateFeatureGroupResponse\nCreateFeatureRequest\nCreateFeatureResponse\nCreateFeaturedResultsSetRequest\nCreateFeaturedResultsSetResponse\nCreateFieldLevelEncryptionConfigRequest\nCreateFieldLevelEncryptionConfigResult\nCreateFieldLevelEncryptionProfileRequest\nCreateFieldLevelEncryptionProfileResult\nCreateFieldRequest\nCreateFieldResponse\nCreateFileCacheLustreConfiguration\nCreateFileCacheRequest\nCreateFileCacheResponse\nCreateFileSystemFromBackupRequest\nCreateFileSystemFromBackupResponse\nCreateFileSystemLustreConfiguration\nCreateFileSystemOntapConfiguration\nCreateFileSystemOpenZFSConfiguration\nCreateFileSystemRequest\nCreateFileSystemResponse\nCreateFileSystemWindowsConfiguration\nCreateFilterRequest\nCreateFilterResponse\nCreateFindingAggregatorRequest\nCreateFindingAggregatorResponse\nCreateFindingsFilterRequest\nCreateFindingsFilterResponse\nCreateFindingsReportRequest\nCreateFindingsReportResponse\nCreateFirewallDomainListRequest\nCreateFirewallDomainListResponse\nCreateFirewallPolicyRequest\nCreateFirewallPolicyResponse\nCreateFirewallRequest\nCreateFirewallResponse\nCreateFirewallRuleGroupRequest\nCreateFirewallRuleGroupResponse\nCreateFirewallRuleRequest\nCreateFirewallRuleResponse\nCreateFleetAdvisorCollectorRequest\nCreateFleetAdvisorCollectorResponse\nCreateFleetError\nCreateFleetInput\nCreateFleetInstance\nCreateFleetLocationsInput\nCreateFleetLocationsOutput\nCreateFleetMetricRequest\nCreateFleetMetricResponse\nCreateFleetOutput\nCreateFleetRequest\nCreateFleetResponse\nCreateFleetResult\nCreateFlow420Exception\nCreateFlowDefinitionRequest\nCreateFlowDefinitionResponse\nCreateFlowLogsRequest\nCreateFlowLogsResult\nCreateFlowRequest\nCreateFlowResponse\nCreateFlowTemplateRequest\nCreateFlowTemplateResponse\nCreateFlywheelRequest\nCreateFlywheelResponse\nCreateFolderMembershipRequest\nCreateFolderMembershipResponse\nCreateFolderRequest\nCreateFolderResponse\nCreateForecastExportJobRequest\nCreateForecastExportJobResponse\nCreateForecastRequest\nCreateForecastResponse\nCreateFormData\nCreateFormRequest\nCreateFormResponse\nCreateFpgaImageRequest\nCreateFpgaImageResult\nCreateFrameworkInput\nCreateFrameworkOutput\nCreateFreeTierConfig\nCreateFunctionDefinitionRequest\nCreateFunctionDefinitionResponse\nCreateFunctionDefinitionVersionRequest\nCreateFunctionDefinitionVersionResponse\nCreateFunctionRequest\nCreateFunctionResponse\nCreateFunctionResult\nCreateFunctionUrlConfigRequest\nCreateFunctionUrlConfigResponse\nCreateFuotaTaskRequest\nCreateFuotaTaskResponse\nCreateGUISessionAccessDetailsRequest\nCreateGUISessionAccessDetailsResult\nCreateGameRequest\nCreateGameResult\nCreateGameServerGroupInput\nCreateGameServerGroupOutput\nCreateGameSessionInput\nCreateGameSessionOutput\nCreateGameSessionQueueInput\nCreateGameSessionQueueOutput\nCreateGateway420Exception\nCreateGatewayGroupRequest\nCreateGatewayGroupResponse\nCreateGatewayInput\nCreateGatewayOutput\nCreateGatewayRequest\nCreateGatewayResponse\nCreateGatewayRouteInput\nCreateGatewayRouteOutput\nCreateGeoMatchSetRequest\nCreateGeoMatchSetResponse\nCreateGeofenceCollectionRequest\nCreateGeofenceCollectionResponse\nCreateGlobalClusterMessage\nCreateGlobalClusterResult\nCreateGlobalNetworkRequest\nCreateGlobalNetworkResponse\nCreateGlobalReplicationGroupMessage\nCreateGlobalReplicationGroupResult\nCreateGlobalSecondaryIndexAction\nCreateGlobalTableInput\nCreateGlobalTableOutput\nCreateGovCloudAccountRequest\nCreateGovCloudAccountResponse\nCreateGrantRequest\nCreateGrantResponse\nCreateGrantVersionRequest\nCreateGrantVersionResponse\nCreateGraphRequest\nCreateGraphResponse\nCreateGraphqlApiRequest\nCreateGraphqlApiResponse\nCreateGrokClassifierRequest\nCreateGroupCertificateAuthorityRequest\nCreateGroupCertificateAuthorityResponse\nCreateGroupInput\nCreateGroupMembershipRequest\nCreateGroupMembershipResponse\nCreateGroupOutput\nCreateGroupRequest\nCreateGroupResponse\nCreateGroupResult\nCreateGroupVersionRequest\nCreateGroupVersionResponse\nCreateHITRequest\nCreateHITResponse\nCreateHITTypeRequest\nCreateHITTypeResponse\nCreateHITWithHITTypeRequest\nCreateHITWithHITTypeResponse\nCreateHapgRequest\nCreateHapgResponse\nCreateHarvestJobRequest\nCreateHarvestJobResponse\nCreateHealthCheckRequest\nCreateHealthCheckResponse\nCreateHlsManifestConfiguration\nCreateHomeRegionControlRequest\nCreateHomeRegionControlResult\nCreateHostInput\nCreateHostOutput\nCreateHostedConfigurationVersionRequest\nCreateHostedZoneRequest\nCreateHostedZoneResponse\nCreateHoursOfOperationRequest\nCreateHoursOfOperationResponse\nCreateHsmClientCertificateMessage\nCreateHsmClientCertificateResult\nCreateHsmConfigurationMessage\nCreateHsmConfigurationResult\nCreateHsmRequest\nCreateHsmResponse\nCreateHttpNamespaceRequest\nCreateHttpNamespaceResponse\nCreateHubRequest\nCreateHubResponse\nCreateHumanTaskUiRequest\nCreateHumanTaskUiResponse\nCreateHyperParameterTuningJobRequest\nCreateHyperParameterTuningJobResponse\nCreateIAMPolicyAssignmentRequest\nCreateIAMPolicyAssignmentResponse\nCreateIPSetRequest\nCreateIPSetResponse\nCreateIdentityPoolInput\nCreateIdentityProviderRequest\nCreateIdentityProviderResponse\nCreateIdentitySourceInput\nCreateIdentitySourceOutput\nCreateImageBuilderRequest\nCreateImageBuilderResult\nCreateImageBuilderStreamingURLRequest\nCreateImageBuilderStreamingURLResult\nCreateImagePipelineRequest\nCreateImagePipelineResponse\nCreateImageRecipeRequest\nCreateImageRecipeResponse\nCreateImageRequest\nCreateImageResponse\nCreateImageResult\nCreateImageVersionRequest\nCreateImageVersionResponse\nCreateImpersonationRoleRequest\nCreateImpersonationRoleResponse\nCreateImportJobRequest\nCreateImportJobResponse\nCreateInAppTemplateRequest\nCreateInAppTemplateResponse\nCreateIndex\nCreateIndexInput\nCreateIndexOutput\nCreateIndexRequest\nCreateIndexResponse\nCreateInferenceExperimentRequest\nCreateInferenceExperimentResponse\nCreateInferenceRecommendationsJobRequest\nCreateInferenceRecommendationsJobResponse\nCreateInferenceSchedulerRequest\nCreateInferenceSchedulerResponse\nCreateInfrastructureConfigurationRequest\nCreateInfrastructureConfigurationResponse\nCreateIngestionDestinationRequest\nCreateIngestionDestinationResponse\nCreateIngestionRequest\nCreateIngestionResponse\nCreateInputRequest\nCreateInputResponse\nCreateInputSecurityGroupRequest\nCreateInputSecurityGroupResponse\nCreateInsightRequest\nCreateInsightResponse\nCreateInstanceAccessControlAttributeConfigurationRequest\nCreateInstanceConnectEndpointRequest\nCreateInstanceConnectEndpointResult\nCreateInstanceEventWindowRequest\nCreateInstanceEventWindowResult\nCreateInstanceExportTaskRequest\nCreateInstanceExportTaskResult\nCreateInstanceProfileMessage\nCreateInstanceProfileRequest\nCreateInstanceProfileResponse\nCreateInstanceProfileResult\nCreateInstanceRequest\nCreateInstanceResponse\nCreateInstanceResult\nCreateInstanceSnapshotRequest\nCreateInstanceSnapshotResult\nCreateInstancesFromSnapshotRequest\nCreateInstancesFromSnapshotResult\nCreateInstancesRequest\nCreateInstancesResult\nCreateInstantBooking\nCreateIntegrationAssociationRequest\nCreateIntegrationAssociationResponse\nCreateIntegrationRequest\nCreateIntegrationResponseRequest\nCreateIntegrationResponseResponse\nCreateIntegrationResult\nCreateIntegrationWorkflowRequest\nCreateIntegrationWorkflowResponse\nCreateIntentRequest\nCreateIntentResponse\nCreateIntentVersionRequest\nCreateIntentVersionResponse\nCreateInterconnectRequest\nCreateInternetGatewayRequest\nCreateInternetGatewayResult\nCreateInvalidationRequest\nCreateInvalidationResult\nCreateInvitationsRequest\nCreateInvitationsResponse\nCreateIpAccessSettingsRequest\nCreateIpAccessSettingsResponse\nCreateIpGroupRequest\nCreateIpGroupResult\nCreateIpamPoolRequest\nCreateIpamPoolResult\nCreateIpamRequest\nCreateIpamResourceDiscoveryRequest\nCreateIpamResourceDiscoveryResult\nCreateIpamResult\nCreateIpamScopeRequest\nCreateIpamScopeResult\nCreateJobForDevicesRequest\nCreateJobForDevicesResponse\nCreateJobOutput\nCreateJobPlaylist\nCreateJobQueueRequest\nCreateJobQueueResponse\nCreateJobRequest\nCreateJobResponse\nCreateJobResult\nCreateJobTemplateRequest\nCreateJobTemplateResponse\nCreateJourneyRequest\nCreateJourneyResponse\nCreateJsonClassifierRequest\nCreateKeyGroupRequest\nCreateKeyGroupResult\nCreateKeyInput\nCreateKeyOutput\nCreateKeyPairRequest\nCreateKeyPairResult\nCreateKeyRequest\nCreateKeyResponse\nCreateKeySigningKeyRequest\nCreateKeySigningKeyResponse\nCreateKeysAndCertificateRequest\nCreateKeysAndCertificateResponse\nCreateKeyspaceRequest\nCreateKeyspaceResponse\nCreateKnowledgeBaseRequest\nCreateKnowledgeBaseResponse\nCreateKxChangesetRequest\nCreateKxChangesetResponse\nCreateKxClusterRequest\nCreateKxClusterResponse\nCreateKxDatabaseRequest\nCreateKxDatabaseResponse\nCreateKxEnvironmentRequest\nCreateKxEnvironmentResponse\nCreateKxUserRequest\nCreateKxUserResponse\nCreateLBCookieStickinessPolicyInput\nCreateLFTagRequest\nCreateLabelGroupRequest\nCreateLabelGroupResponse\nCreateLabelRequest\nCreateLabelResponse\nCreateLabelingJobRequest\nCreateLabelingJobResponse\nCreateLabelsRequest\nCreateLagRequest\nCreateLakeFormationOptInRequest\nCreateLanguageModelRequest\nCreateLanguageModelResponse\nCreateLaunchConfigurationTemplateRequest\nCreateLaunchConfigurationTemplateResponse\nCreateLaunchConfigurationType\nCreateLaunchProfileRequest\nCreateLaunchProfileResponse\nCreateLaunchRequest\nCreateLaunchResponse\nCreateLaunchTemplateRequest\nCreateLaunchTemplateResult\nCreateLaunchTemplateVersionRequest\nCreateLaunchTemplateVersionResult\nCreateLayerRequest\nCreateLayerResult\nCreateLayoutRequest\nCreateLayoutResponse\nCreateLedgerRequest\nCreateLedgerResponse\nCreateLegalHoldInput\nCreateLegalHoldOutput\nCreateLensShareInput\nCreateLensShareOutput\nCreateLensVersionInput\nCreateLensVersionOutput\nCreateLicenseConfigurationRequest\nCreateLicenseConfigurationResponse\nCreateLicenseConversionTaskForResourceRequest\nCreateLicenseConversionTaskForResourceResponse\nCreateLicenseManagerReportGeneratorRequest\nCreateLicenseManagerReportGeneratorResponse\nCreateLicenseRequest\nCreateLicenseResponse\nCreateLicenseVersionRequest\nCreateLicenseVersionResponse\nCreateLifecyclePolicyRequest\nCreateLifecyclePolicyResponse\nCreateLinkInput\nCreateLinkOutput\nCreateLinkRequest\nCreateLinkResponse\nCreateListRequest\nCreateListenerInput\nCreateListenerOutput\nCreateListenerRequest\nCreateListenerResponse\nCreateLiveSourceRequest\nCreateLiveSourceResponse\nCreateLoadBalancerInput\nCreateLoadBalancerListenerInput\nCreateLoadBalancerOutput\nCreateLoadBalancerPolicyInput\nCreateLoadBalancerRequest\nCreateLoadBalancerResult\nCreateLoadBalancerTlsCertificateRequest\nCreateLoadBalancerTlsCertificateResult\nCreateLocalGatewayRouteRequest\nCreateLocalGatewayRouteResult\nCreateLocalGatewayRouteTableRequest\nCreateLocalGatewayRouteTableResult\nCreateLocalGatewayRouteTableVirtualInterfaceGroupAssociationRequest\nCreateLocalGatewayRouteTableVirtualInterfaceGroupAssociationResult\nCreateLocalGatewayRouteTableVpcAssociationRequest\nCreateLocalGatewayRouteTableVpcAssociationResult\nCreateLocationAzureBlobRequest\nCreateLocationAzureBlobResponse\nCreateLocationEfsRequest\nCreateLocationEfsResponse\nCreateLocationFsxLustreRequest\nCreateLocationFsxLustreResponse\nCreateLocationFsxOntapRequest\nCreateLocationFsxOntapResponse\nCreateLocationFsxOpenZfsRequest\nCreateLocationFsxOpenZfsResponse\nCreateLocationFsxWindowsRequest\nCreateLocationFsxWindowsResponse\nCreateLocationHdfsRequest\nCreateLocationHdfsResponse\nCreateLocationInput\nCreateLocationNfsRequest\nCreateLocationNfsResponse\nCreateLocationObjectStorageRequest\nCreateLocationObjectStorageResponse\nCreateLocationOutput\nCreateLocationS3Request\nCreateLocationS3Response\nCreateLocationSmbRequest\nCreateLocationSmbResponse\nCreateLogGroupRequest\nCreateLogPatternRequest\nCreateLogPatternResponse\nCreateLogStreamRequest\nCreateLogSubscriptionRequest\nCreateLoggerDefinitionRequest\nCreateLoggerDefinitionResponse\nCreateLoggerDefinitionVersionRequest\nCreateLoggerDefinitionVersionResponse\nCreateLoggingConfigurationRequest\nCreateLoggingConfigurationResponse\nCreateLogicallyAirGappedBackupVaultInput\nCreateLogicallyAirGappedBackupVaultOutput\nCreateLoginProfileRequest\nCreateLoginProfileResponse\nCreateLongTermPricingRequest\nCreateLongTermPricingResult\nCreateLowLatencyHlsManifestConfiguration\nCreateLunaClientRequest\nCreateLunaClientResponse\nCreateMLEndpointInput\nCreateMLEndpointOutput\nCreateMLModelInput\nCreateMLModelOutput\nCreateMLTransformRequest\nCreateMLTransformResponse\nCreateMaintenanceWindowRequest\nCreateMaintenanceWindowResult\nCreateManagedEndpointRequest\nCreateManagedEndpointResponse\nCreateManagedPrefixListRequest\nCreateManagedPrefixListResult\nCreateMapRequest\nCreateMapResponse\nCreateMatchingWorkflowInput\nCreateMatchingWorkflowOutput\nCreateMatchmakingConfigurationInput\nCreateMatchmakingConfigurationOutput\nCreateMatchmakingRuleSetInput\nCreateMatchmakingRuleSetOutput\nCreateMediaCapturePipelineRequest\nCreateMediaCapturePipelineResponse\nCreateMediaConcatenationPipelineRequest\nCreateMediaConcatenationPipelineResponse\nCreateMediaInsightsPipelineConfigurationRequest\nCreateMediaInsightsPipelineConfigurationResponse\nCreateMediaInsightsPipelineRequest\nCreateMediaInsightsPipelineResponse\nCreateMediaLiveConnectorPipelineRequest\nCreateMediaLiveConnectorPipelineResponse\nCreateMediaPipelineKinesisVideoStreamPoolRequest\nCreateMediaPipelineKinesisVideoStreamPoolResponse\nCreateMediaStreamPipelineRequest\nCreateMediaStreamPipelineResponse\nCreateMedicalVocabularyRequest\nCreateMedicalVocabularyResponse\nCreateMeetingDialOutRequest\nCreateMeetingDialOutResponse\nCreateMeetingRequest\nCreateMeetingResponse\nCreateMeetingRoomConfiguration\nCreateMeetingWithAttendeesRequest\nCreateMeetingWithAttendeesResponse\nCreateMemberInput\nCreateMemberOutput\nCreateMemberRequest\nCreateMemberResponse\nCreateMembersRequest\nCreateMembersResponse\nCreateMembershipInput\nCreateMembershipOutput\nCreateMeshInput\nCreateMeshOutput\nCreateMetricAttributionRequest\nCreateMetricAttributionResponse\nCreateMetricSetRequest\nCreateMetricSetResponse\nCreateMicrosoftADRequest\nCreateMicrosoftADResult\nCreateMigrationProjectMessage\nCreateMigrationProjectResponse\nCreateMigrationWorkflowRequest\nCreateMigrationWorkflowResponse\nCreateMilestoneInput\nCreateMilestoneOutput\nCreateMissionProfileRequest\nCreateMitigationActionRequest\nCreateMitigationActionResponse\nCreateMobileDeviceAccessRuleRequest\nCreateMobileDeviceAccessRuleResponse\nCreateModelBiasJobDefinitionRequest\nCreateModelBiasJobDefinitionResponse\nCreateModelCardExportJobRequest\nCreateModelCardExportJobResponse\nCreateModelCardRequest\nCreateModelCardResponse\nCreateModelCustomizationJobRequest\nCreateModelCustomizationJobResponse\nCreateModelExplainabilityJobDefinitionRequest\nCreateModelExplainabilityJobDefinitionResponse\nCreateModelInput\nCreateModelManifestRequest\nCreateModelManifestResponse\nCreateModelOutput\nCreateModelPackageGroupInput\nCreateModelPackageGroupOutput\nCreateModelPackageInput\nCreateModelPackageOutput\nCreateModelQualityJobDefinitionRequest\nCreateModelQualityJobDefinitionResponse\nCreateModelRequest\nCreateModelResponse\nCreateModelVersionRequest\nCreateModelVersionResult\nCreateMonitorInput\nCreateMonitorOutput\nCreateMonitorRequest\nCreateMonitorResponse\nCreateMonitoringScheduleRequest\nCreateMonitoringScheduleResponse\nCreateMonitoringSubscriptionRequest\nCreateMonitoringSubscriptionResult\nCreateMountTargetRequest\nCreateMultiRegionAccessPointInput\nCreateMultiRegionAccessPointRequest\nCreateMultiRegionAccessPointResult\nCreateMulticastGroupRequest\nCreateMulticastGroupResponse\nCreateMultipartReadSetUploadRequest\nCreateMultipartReadSetUploadResponse\nCreateMultipartUploadOutput\nCreateMultipartUploadRequest\nCreateMultiplexProgramRequest\nCreateMultiplexProgramResponse\nCreateMultiplexRequest\nCreateMultiplexResponse\nCreateNFSFileShareInput\nCreateNFSFileShareOutput\nCreateNamedQueryInput\nCreateNamedQueryOutput\nCreateNamespaceRequest\nCreateNamespaceResponse\nCreateNatGatewayRequest\nCreateNatGatewayResult\nCreateNativeDeltaTable\nCreateNetworkAclEntryRequest\nCreateNetworkAclRequest\nCreateNetworkAclResult\nCreateNetworkAnalyzerConfigurationRequest\nCreateNetworkAnalyzerConfigurationResponse\nCreateNetworkInput\nCreateNetworkInsightsAccessScopeRequest\nCreateNetworkInsightsAccessScopeResult\nCreateNetworkInsightsPathRequest\nCreateNetworkInsightsPathResult\nCreateNetworkInterfacePermissionRequest\nCreateNetworkInterfacePermissionResult\nCreateNetworkInterfaceRequest\nCreateNetworkInterfaceResult\nCreateNetworkOutput\nCreateNetworkProfileRequest\nCreateNetworkProfileResponse\nCreateNetworkProfileResult\nCreateNetworkRequest\nCreateNetworkResponse\nCreateNetworkSettingsRequest\nCreateNetworkSettingsResponse\nCreateNetworkSiteRequest\nCreateNetworkSiteResponse\nCreateNewVersion\nCreateNodeFromTemplateJobRequest\nCreateNodeFromTemplateJobResponse\nCreateNodeInput\nCreateNodeOutput\nCreateNodegroupRequest\nCreateNodegroupResponse\nCreateNotebookInput\nCreateNotebookInstanceInput\nCreateNotebookInstanceLifecycleConfigInput\nCreateNotebookInstanceLifecycleConfigOutput\nCreateNotebookInstanceOutput\nCreateNotebookOutput\nCreateNotificationRequest\nCreateNotificationRuleRequest\nCreateNotificationRuleResult\nCreateNotificationSubscriptionRequest\nCreateNotificationSubscriptionResponse\nCreateOTAUpdateRequest\nCreateOTAUpdateResponse\nCreateObject\nCreateObjectRequest\nCreateObjectResponse\nCreateObservabilityConfigurationRequest\nCreateObservabilityConfigurationResponse\nCreateOntapVolumeConfiguration\nCreateOpenIDConnectProviderRequest\nCreateOpenIDConnectProviderResponse\nCreateOpenZFSOriginSnapshotConfiguration\nCreateOpenZFSVolumeConfiguration\nCreateOpsItemRequest\nCreateOpsItemResponse\nCreateOpsMetadataRequest\nCreateOpsMetadataResult\nCreateOptOutListRequest\nCreateOptOutListResult\nCreateOptionGroupMessage\nCreateOptionGroupResult\nCreateOrUpdateTagsType\nCreateOrderInput\nCreateOrderOutput\nCreateOrganizationRequest\nCreateOrganizationResponse\nCreateOrganizationalUnitRequest\nCreateOrganizationalUnitResponse\nCreateOriginAccessControlRequest\nCreateOriginAccessControlResult\nCreateOriginEndpointRequest\nCreateOriginEndpointResponse\nCreateOriginRequestPolicyRequest\nCreateOriginRequestPolicyResult\nCreateOutboundConnectionRequest\nCreateOutboundConnectionResponse\nCreateOutboundCrossClusterSearchConnectionRequest\nCreateOutboundCrossClusterSearchConnectionResponse\nCreateOutpostInput\nCreateOutpostOutput\nCreateOutpostResolverRequest\nCreateOutpostResolverResponse\nCreatePackageImportJobRequest\nCreatePackageImportJobResponse\nCreatePackageRequest\nCreatePackageResponse\nCreatePackageVersionRequest\nCreatePackageVersionResponse\nCreatePackagingConfigurationRequest\nCreatePackagingConfigurationResponse\nCreatePackagingGroupRequest\nCreatePackagingGroupResponse\nCreateParallelDataRequest\nCreateParallelDataResponse\nCreateParameterGroupRequest\nCreateParameterGroupResponse\nCreateParticipantConnectionRequest\nCreateParticipantConnectionResponse\nCreateParticipantRequest\nCreateParticipantResponse\nCreateParticipantTokenRequest\nCreateParticipantTokenResponse\nCreatePartitionIndexRequest\nCreatePartitionRequest\nCreatePartnerEventSourceRequest\nCreatePartnerEventSourceResponse\nCreatePartnerInputRequest\nCreatePartnerInputResponse\nCreatePatchBaselineRequest\nCreatePatchBaselineResult\nCreatePerformanceAnalysisReportRequest\nCreatePerformanceAnalysisReportResponse\nCreatePermissionGroupRequest\nCreatePermissionGroupResponse\nCreatePermissionRequest\nCreatePermissionResponse\nCreatePermissionSetRequest\nCreatePermissionSetResponse\nCreatePermissionVersionRequest\nCreatePermissionVersionResponse\nCreatePhoneNumberOrderRequest\nCreatePhoneNumberOrderResponse\nCreatePipeRequest\nCreatePipeResponse\nCreatePipelineInput\nCreatePipelineOutput\nCreatePipelineRequest\nCreatePipelineResponse\nCreatePlaceIndexRequest\nCreatePlaceIndexResponse\nCreatePlacementGroupRequest\nCreatePlacementGroupResult\nCreatePlacementRequest\nCreatePlatformApplicationInput\nCreatePlatformApplicationResponse\nCreatePlatformEndpointInput\nCreatePlatformVersionRequest\nCreatePlatformVersionResult\nCreatePlayerSessionInput\nCreatePlayerSessionOutput\nCreatePlayerSessionsInput\nCreatePlayerSessionsOutput\nCreatePolicyInput\nCreatePolicyOutput\nCreatePolicyRequest\nCreatePolicyResponse\nCreatePolicyStoreInput\nCreatePolicyStoreOutput\nCreatePolicyTemplateInput\nCreatePolicyTemplateOutput\nCreatePolicyVersionRequest\nCreatePolicyVersionResponse\nCreatePoolRequest\nCreatePoolResult\nCreatePortalRequest\nCreatePortalResponse\nCreatePortfolioInput\nCreatePortfolioOutput\nCreatePortfolioShareInput\nCreatePortfolioShareOutput\nCreatePredictorBacktestExportJobRequest\nCreatePredictorBacktestExportJobResponse\nCreatePredictorRequest\nCreatePredictorResponse\nCreatePrefetchScheduleRequest\nCreatePrefetchScheduleResponse\nCreatePreparedStatementInput\nCreatePresetRequest\nCreatePresetResponse\nCreatePresignedDomainUrlRequest\nCreatePresignedDomainUrlResponse\nCreatePresignedNotebookInstanceUrlInput\nCreatePresignedNotebookInstanceUrlOutput\nCreatePresignedNotebookUrlRequest\nCreatePresignedNotebookUrlResponse\nCreatePricingPlanInput\nCreatePricingPlanOutput\nCreatePricingRuleInput\nCreatePricingRuleOutput\nCreatePrivateDnsNamespaceRequest\nCreatePrivateDnsNamespaceResponse\nCreatePrivateVirtualInterfaceRequest\nCreateProactiveJoin\nCreateProcessingJobRequest\nCreateProcessingJobResponse\nCreateProductInput\nCreateProductOutput\nCreateProfileInput\nCreateProfileJobRequest\nCreateProfileJobResponse\nCreateProfileOutput\nCreateProfileRequest\nCreateProfileResponse\nCreateProfileShareInput\nCreateProfileShareOutput\nCreateProfilingGroupRequest\nCreateProfilingGroupResponse\nCreateProgramRequest\nCreateProgramResponse\nCreateProgressUpdateStreamRequest\nCreateProjectInput\nCreateProjectOutput\nCreateProjectRequest\nCreateProjectResponse\nCreateProjectResult\nCreateProjectVersionRequest\nCreateProjectVersionResponse\nCreatePromptRequest\nCreatePromptResponse\nCreateProposalInput\nCreateProposalOutput\nCreateProtectionGroupRequest\nCreateProtectionRequest\nCreateProtectionResponse\nCreateProvisionedModelThroughputRequest\nCreateProvisionedModelThroughputResponse\nCreateProvisionedProductPlanInput\nCreateProvisionedProductPlanOutput\nCreateProvisioningArtifactInput\nCreateProvisioningArtifactOutput\nCreateProvisioningClaimRequest\nCreateProvisioningClaimResponse\nCreateProvisioningTemplateRequest\nCreateProvisioningTemplateResponse\nCreateProvisioningTemplateVersionRequest\nCreateProvisioningTemplateVersionResponse\nCreateProxySessionRequest\nCreateProxySessionResponse\nCreatePublicDnsNamespaceRequest\nCreatePublicDnsNamespaceResponse\nCreatePublicIpv4PoolRequest\nCreatePublicIpv4PoolResult\nCreatePublicKeyRequest\nCreatePublicKeyResult\nCreatePublicVirtualInterfaceRequest\nCreatePublishingDestinationRequest\nCreatePublishingDestinationResponse\nCreatePullRequestApprovalRuleInput\nCreatePullRequestApprovalRuleOutput\nCreatePullRequestInput\nCreatePullRequestOutput\nCreatePullThroughCacheRuleRequest\nCreatePullThroughCacheRuleResponse\nCreatePushTemplateRequest\nCreatePushTemplateResponse\nCreateQualificationTypeRequest\nCreateQualificationTypeResponse\nCreateQuantumTaskRequest\nCreateQuantumTaskResponse\nCreateQueryLoggingConfigRequest\nCreateQueryLoggingConfigResponse\nCreateQuerySuggestionsBlockListRequest\nCreateQuerySuggestionsBlockListResponse\nCreateQueueRequest\nCreateQueueResponse\nCreateQueueResult\nCreateQuickConnectRequest\nCreateQuickConnectResponse\nCreateRateBasedRuleRequest\nCreateRateBasedRuleResponse\nCreateReadinessCheckRequest\nCreateReadinessCheckResponse\nCreateRealtimeEndpointInput\nCreateRealtimeEndpointOutput\nCreateRealtimeLogConfigRequest\nCreateRealtimeLogConfigResult\nCreateReceiptFilterRequest\nCreateReceiptRuleRequest\nCreateReceiptRuleSetRequest\nCreateRecipeJobRequest\nCreateRecipeJobResponse\nCreateRecipeRequest\nCreateRecipeResponse\nCreateRecommendationTemplateRequest\nCreateRecommendationTemplateResponse\nCreateRecommenderConfiguration\nCreateRecommenderConfigurationRequest\nCreateRecommenderConfigurationResponse\nCreateRecommenderConfigurationShape\nCreateRecommenderRequest\nCreateRecommenderResponse\nCreateRecordingConfigurationRequest\nCreateRecordingConfigurationResponse\nCreateRecoveryGroupRequest\nCreateRecoveryGroupResponse\nCreateReferenceStoreRequest\nCreateReferenceStoreResponse\nCreateRefreshScheduleRequest\nCreateRefreshScheduleResponse\nCreateRegexMatchSetRequest\nCreateRegexMatchSetResponse\nCreateRegexPatternSetRequest\nCreateRegexPatternSetResponse\nCreateRegistryInput\nCreateRegistryRequest\nCreateRegistryResponse\nCreateRelatedItemRequest\nCreateRelatedItemResponse\nCreateRelationalDatabaseFromSnapshotRequest\nCreateRelationalDatabaseFromSnapshotResult\nCreateRelationalDatabaseRequest\nCreateRelationalDatabaseResult\nCreateRelationalDatabaseSnapshotRequest\nCreateRelationalDatabaseSnapshotResult\nCreateRemoteAccessSessionConfiguration\nCreateRemoteAccessSessionRequest\nCreateRemoteAccessSessionResult\nCreateReplaceRootVolumeTaskRequest\nCreateReplaceRootVolumeTaskResult\nCreateReplicaAction\nCreateReplicationConfigMessage\nCreateReplicationConfigResponse\nCreateReplicationConfigurationRequest\nCreateReplicationConfigurationTemplateRequest\nCreateReplicationGroupMemberAction\nCreateReplicationGroupMessage\nCreateReplicationGroupResult\nCreateReplicationInstanceMessage\nCreateReplicationInstanceResponse\nCreateReplicationJobRequest\nCreateReplicationJobResponse\nCreateReplicationSetInput\nCreateReplicationSetOutput\nCreateReplicationSubnetGroupMessage\nCreateReplicationSubnetGroupResponse\nCreateReplicationTaskMessage\nCreateReplicationTaskResponse\nCreateReportGroupInput\nCreateReportGroupOutput\nCreateReportPlanInput\nCreateReportPlanOutput\nCreateRepositoryInput\nCreateRepositoryOutput\nCreateRepositoryRequest\nCreateRepositoryResponse\nCreateRepositoryResult\nCreateRequestValidatorRequest\nCreateRequireCheckIn\nCreateRescoreExecutionPlanRequest\nCreateRescoreExecutionPlanResponse\nCreateReservedInstancesListingRequest\nCreateReservedInstancesListingResult\nCreateResiliencyPolicyRequest\nCreateResiliencyPolicyResponse\nCreateResolverEndpointRequest\nCreateResolverEndpointResponse\nCreateResolverQueryLogConfigRequest\nCreateResolverQueryLogConfigResponse\nCreateResolverRequest\nCreateResolverResponse\nCreateResolverRuleRequest\nCreateResolverRuleResponse\nCreateResourceDataSyncRequest\nCreateResourceDefinitionRequest\nCreateResourceDefinitionResponse\nCreateResourceDefinitionVersionRequest\nCreateResourceDefinitionVersionResponse\nCreateResourceGroupRequest\nCreateResourceGroupResponse\nCreateResourceInput\nCreateResourceOutput\nCreateResourcePolicyRequest\nCreateResourcePolicyResponse\nCreateResourcePolicyStatementRequest\nCreateResourcePolicyStatementResponse\nCreateResourceRequest\nCreateResourceResponse\nCreateResourceServerRequest\nCreateResourceServerResponse\nCreateResourceSetRequest\nCreateResourceSetResponse\nCreateResourceShareRequest\nCreateResourceShareResponse\nCreateResponseHeadersPolicyRequest\nCreateResponseHeadersPolicyResult\nCreateResponsePlanInput\nCreateResponsePlanOutput\nCreateRestApiRequest\nCreateRestoreImageTaskRequest\nCreateRestoreImageTaskResult\nCreateRetrainingSchedulerRequest\nCreateRetrainingSchedulerResponse\nCreateReturnShippingLabelRequest\nCreateReturnShippingLabelResult\nCreateReusableDelegationSetRequest\nCreateReusableDelegationSetResponse\nCreateRevisionRequest\nCreateRevisionResponse\nCreateRobotApplicationRequest\nCreateRobotApplicationResponse\nCreateRobotApplicationVersionRequest\nCreateRobotApplicationVersionResponse\nCreateRobotRequest\nCreateRobotResponse\nCreateRoleAliasRequest\nCreateRoleAliasResponse\nCreateRoleRequest\nCreateRoleResponse\nCreateRoomMembershipRequest\nCreateRoomMembershipResponse\nCreateRoomRequest\nCreateRoomResponse\nCreateRotationOverrideRequest\nCreateRotationOverrideResult\nCreateRotationRequest\nCreateRotationResult\nCreateRouteCalculatorRequest\nCreateRouteCalculatorResponse\nCreateRouteInput\nCreateRouteOutput\nCreateRouteRequest\nCreateRouteResponse\nCreateRouteResponseRequest\nCreateRouteResponseResponse\nCreateRouteResult\nCreateRouteTableRequest\nCreateRouteTableResult\nCreateRoutingControlRequest\nCreateRoutingControlResponse\nCreateRoutingProfileRequest\nCreateRoutingProfileResponse\nCreateRowData\nCreateRule\nCreateRuleGroupRequest\nCreateRuleGroupResponse\nCreateRuleGroupsNamespaceRequest\nCreateRuleGroupsNamespaceResponse\nCreateRuleInput\nCreateRuleOutput\nCreateRuleRequest\nCreateRuleResponse\nCreateRuleResult\nCreateRulesetRequest\nCreateRulesetResponse\nCreateRunGroupRequest\nCreateRunGroupResponse\nCreateS3DataAccessFromS3Bucket\nCreateS3DataAccessFromS3BucketRequestDetails\nCreateS3DataAccessFromS3BucketResponseDetails\nCreateSAMLProviderRequest\nCreateSAMLProviderResponse\nCreateSMBFileShareInput\nCreateSMBFileShareOutput\nCreateSMSSandboxPhoneNumberInput\nCreateSafetyRuleRequest\nCreateSafetyRuleResponse\nCreateSampleFindingsRequest\nCreateSamplingRuleRequest\nCreateSamplingRuleResult\nCreateSavingsPlanRequest\nCreateSavingsPlanResponse\nCreateSbomExportRequest\nCreateSbomExportResponse\nCreateScalingPlanRequest\nCreateScalingPlanResponse\nCreateScanRequest\nCreateScanResponse\nCreateSceneRequest\nCreateSceneResponse\nCreateScheduleGroupInput\nCreateScheduleGroupOutput\nCreateScheduleInput\nCreateScheduleOutput\nCreateScheduleRequest\nCreateScheduleResponse\nCreateScheduledActionMessage\nCreateScheduledAuditRequest\nCreateScheduledAuditResponse\nCreateScheduledQueryRequest\nCreateScheduledQueryResponse\nCreateSchedulingPolicyRequest\nCreateSchedulingPolicyResponse\nCreateSchemaInput\nCreateSchemaMappingInput\nCreateSchemaMappingOutput\nCreateSchemaRequest\nCreateSchemaResponse\nCreateScriptInput\nCreateScriptOutput\nCreateScriptRequest\nCreateScriptResponse\nCreateSecretRequest\nCreateSecretResponse\nCreateSecurityConfigRequest\nCreateSecurityConfigResponse\nCreateSecurityConfigurationInput\nCreateSecurityConfigurationOutput\nCreateSecurityConfigurationRequest\nCreateSecurityConfigurationResponse\nCreateSecurityGroupRequest\nCreateSecurityGroupResult\nCreateSecurityPolicyRequest\nCreateSecurityPolicyResponse\nCreateSecurityProfileRequest\nCreateSecurityProfileResponse\nCreateSegmentRequest\nCreateSegmentResponse\nCreateSequenceStoreRequest\nCreateSequenceStoreResponse\nCreateServerRequest\nCreateServerResponse\nCreateServiceActionInput\nCreateServiceActionOutput\nCreateServiceInput\nCreateServiceInstanceInput\nCreateServiceInstanceOutput\nCreateServiceLinkedRoleRequest\nCreateServiceLinkedRoleResponse\nCreateServiceNetworkRequest\nCreateServiceNetworkResponse\nCreateServiceNetworkServiceAssociationRequest\nCreateServiceNetworkServiceAssociationResponse\nCreateServiceNetworkVpcAssociationRequest\nCreateServiceNetworkVpcAssociationResponse\nCreateServiceOutput\nCreateServicePrincipalNameRequest\nCreateServiceProfileRequest\nCreateServiceProfileResponse\nCreateServiceRequest\nCreateServiceResponse\nCreateServiceSpecificCredentialRequest\nCreateServiceSpecificCredentialResponse\nCreateServiceSyncConfigInput\nCreateServiceSyncConfigOutput\nCreateServiceTemplateInput\nCreateServiceTemplateOutput\nCreateServiceTemplateVersionInput\nCreateServiceTemplateVersionOutput\nCreateSessionRequest\nCreateSessionResponse\nCreateShareRequest\nCreateShareResponse\nCreateSignalCatalogRequest\nCreateSignalCatalogResponse\nCreateSignalingChannelInput\nCreateSignalingChannelOutput\nCreateSimulationApplicationRequest\nCreateSimulationApplicationResponse\nCreateSimulationApplicationVersionRequest\nCreateSimulationApplicationVersionResponse\nCreateSimulationJobRequest\nCreateSimulationJobResponse\nCreateSinkInput\nCreateSinkOutput\nCreateSipMediaApplicationCallRequest\nCreateSipMediaApplicationCallResponse\nCreateSipMediaApplicationRequest\nCreateSipMediaApplicationResponse\nCreateSipRuleRequest\nCreateSipRuleResponse\nCreateSiteInput\nCreateSiteOutput\nCreateSiteRequest\nCreateSiteResponse\nCreateSiteToSiteVpnAttachmentRequest\nCreateSiteToSiteVpnAttachmentResponse\nCreateSizeConstraintSetRequest\nCreateSizeConstraintSetResponse\nCreateSkillGroupRequest\nCreateSkillGroupResponse\nCreateSlackChannelConfigurationRequest\nCreateSlotRequest\nCreateSlotResponse\nCreateSlotTypeRequest\nCreateSlotTypeResponse\nCreateSlotTypeVersionRequest\nCreateSlotTypeVersionResponse\nCreateSmsTemplateRequest\nCreateSmsTemplateResponse\nCreateSnaplockConfiguration\nCreateSnapshotBeforeSchemaExtension\nCreateSnapshotBeforeUpdate\nCreateSnapshotCopyGrantMessage\nCreateSnapshotCopyGrantResult\nCreateSnapshotFromVolumeRecoveryPointInput\nCreateSnapshotFromVolumeRecoveryPointOutput\nCreateSnapshotInput\nCreateSnapshotMessage\nCreateSnapshotOutput\nCreateSnapshotRequest\nCreateSnapshotResponse\nCreateSnapshotResult\nCreateSnapshotScheduleMessage\nCreateSnapshotsRequest\nCreateSnapshotsResult\nCreateSoftwareUpdateJobRequest\nCreateSoftwareUpdateJobResponse\nCreateSolFunctionPackageInput\nCreateSolFunctionPackageOutput\nCreateSolNetworkInstanceInput\nCreateSolNetworkInstanceOutput\nCreateSolNetworkPackageInput\nCreateSolNetworkPackageOutput\nCreateSolutionRequest\nCreateSolutionResponse\nCreateSolutionVersionRequest\nCreateSolutionVersionResponse\nCreateSourceLocationRequest\nCreateSourceLocationResponse\nCreateSourceNetworkRequest\nCreateSourceNetworkResponse\nCreateSourceRepositoryBranchRequest\nCreateSourceRepositoryBranchResponse\nCreateSourceRepositoryRequest\nCreateSourceRepositoryResponse\nCreateSpaceRequest\nCreateSpaceResponse\nCreateSpotDatafeedSubscriptionRequest\nCreateSpotDatafeedSubscriptionResult\nCreateSqlInjectionMatchSetRequest\nCreateSqlInjectionMatchSetResponse\nCreateStackInput\nCreateStackInstancesInput\nCreateStackInstancesOutput\nCreateStackOutput\nCreateStackRequest\nCreateStackResult\nCreateStackSetInput\nCreateStackSetOutput\nCreateStageRequest\nCreateStageResponse\nCreateStageResult\nCreateStandbyWorkspacesRequest\nCreateStandbyWorkspacesResult\nCreateStateMachineAliasInput\nCreateStateMachineAliasOutput\nCreateStateMachineInput\nCreateStateMachineOutput\nCreateStorageLocationResultMessage\nCreateStorageVirtualMachineRequest\nCreateStorageVirtualMachineResponse\nCreateStoreImageTaskRequest\nCreateStoreImageTaskResult\nCreateStorediSCSIVolumeInput\nCreateStorediSCSIVolumeOutput\nCreateStreamInput\nCreateStreamKeyRequest\nCreateStreamKeyResponse\nCreateStreamOutput\nCreateStreamProcessorRequest\nCreateStreamProcessorResponse\nCreateStreamRequest\nCreateStreamResponse\nCreateStreamingDistributionRequest\nCreateStreamingDistributionResult\nCreateStreamingDistributionWithTagsRequest\nCreateStreamingDistributionWithTagsResult\nCreateStreamingImageRequest\nCreateStreamingImageResponse\nCreateStreamingSessionRequest\nCreateStreamingSessionResponse\nCreateStreamingSessionStreamRequest\nCreateStreamingSessionStreamResponse\nCreateStreamingURLRequest\nCreateStreamingURLResult\nCreateStudioComponentRequest\nCreateStudioComponentResponse\nCreateStudioInput\nCreateStudioLifecycleConfigRequest\nCreateStudioLifecycleConfigResponse\nCreateStudioOutput\nCreateStudioRequest\nCreateStudioResponse\nCreateStudioSessionMappingInput\nCreateSubnetCidrReservationRequest\nCreateSubnetCidrReservationResult\nCreateSubnetGroupRequest\nCreateSubnetGroupResponse\nCreateSubnetRequest\nCreateSubnetResult\nCreateSubscriberNotificationRequest\nCreateSubscriberNotificationResponse\nCreateSubscriberRequest\nCreateSubscriberResponse\nCreateSubscriptionDefinitionRequest\nCreateSubscriptionDefinitionResponse\nCreateSubscriptionDefinitionVersionRequest\nCreateSubscriptionDefinitionVersionResponse\nCreateSuiteDefinitionRequest\nCreateSuiteDefinitionResponse\nCreateSvmActiveDirectoryConfiguration\nCreateSyncJobRequest\nCreateSyncJobResponse\nCreateSystemInstanceRequest\nCreateSystemInstanceResponse\nCreateSystemTemplateRequest\nCreateSystemTemplateResponse\nCreateTLSInspectionConfigurationRequest\nCreateTLSInspectionConfigurationResponse\nCreateTableDefaultPermissions\nCreateTableInput\nCreateTableOutput\nCreateTableRequest\nCreateTableResponse\nCreateTagOptionInput\nCreateTagOptionOutput\nCreateTagsMessage\nCreateTagsRequest\nCreateTapePoolInput\nCreateTapePoolOutput\nCreateTapeWithBarcodeInput\nCreateTapeWithBarcodeOutput\nCreateTapesInput\nCreateTapesOutput\nCreateTargetGroupInput\nCreateTargetGroupOutput\nCreateTargetGroupRequest\nCreateTargetGroupResponse\nCreateTaskInput\nCreateTaskOutput\nCreateTaskRequest\nCreateTaskResponse\nCreateTaskSetRequest\nCreateTaskSetResponse\nCreateTaskTemplateRequest\nCreateTaskTemplateResponse\nCreateTemplateAliasRequest\nCreateTemplateAliasResponse\nCreateTemplateGroupAccessControlEntryRequest\nCreateTemplateMessageBody\nCreateTemplateRequest\nCreateTemplateResponse\nCreateTemplateSyncConfigInput\nCreateTemplateSyncConfigOutput\nCreateTestGridProjectRequest\nCreateTestGridProjectResult\nCreateTestGridUrlRequest\nCreateTestGridUrlResult\nCreateTestSetDiscrepancyReportRequest\nCreateTestSetDiscrepancyReportResponse\nCreateThemeAliasRequest\nCreateThemeAliasResponse\nCreateThemeData\nCreateThemeRequest\nCreateThemeResponse\nCreateThesaurusRequest\nCreateThesaurusResponse\nCreateThingGroupRequest\nCreateThingGroupResponse\nCreateThingRequest\nCreateThingResponse\nCreateThingTypeRequest\nCreateThingTypeResponse\nCreateThreatIntelSetRequest\nCreateThreatIntelSetResponse\nCreateTieringInput\nCreateTime\nCreateTimelineEventInput\nCreateTimelineEventOutput\nCreateTimestamp\nCreateTokenRequest\nCreateTokenResponse\nCreateTopicInput\nCreateTopicRefreshScheduleRequest\nCreateTopicRefreshScheduleResponse\nCreateTopicRequest\nCreateTopicResponse\nCreateTopicRuleDestinationRequest\nCreateTopicRuleDestinationResponse\nCreateTopicRuleRequest\nCreateTrackerRequest\nCreateTrackerResponse\nCreateTrafficDistributionGroupRequest\nCreateTrafficDistributionGroupResponse\nCreateTrafficMirrorFilterRequest\nCreateTrafficMirrorFilterResult\nCreateTrafficMirrorFilterRuleRequest\nCreateTrafficMirrorFilterRuleResult\nCreateTrafficMirrorSessionRequest\nCreateTrafficMirrorSessionResult\nCreateTrafficMirrorTargetRequest\nCreateTrafficMirrorTargetResult\nCreateTrafficPolicyInstanceRequest\nCreateTrafficPolicyInstanceResponse\nCreateTrafficPolicyRequest\nCreateTrafficPolicyResponse\nCreateTrafficPolicyVersionRequest\nCreateTrafficPolicyVersionResponse\nCreateTrailRequest\nCreateTrailResponse\nCreateTrainingJobRequest\nCreateTrainingJobResponse\nCreateTransformJobRequest\nCreateTransformJobResponse\nCreateTransitGatewayConnectPeerRequest\nCreateTransitGatewayConnectPeerResult\nCreateTransitGatewayConnectRequest\nCreateTransitGatewayConnectRequestOptions\nCreateTransitGatewayConnectResult\nCreateTransitGatewayMulticastDomainRequest\nCreateTransitGatewayMulticastDomainRequestOptions\nCreateTransitGatewayMulticastDomainResult\nCreateTransitGatewayPeeringAttachmentRequest\nCreateTransitGatewayPeeringAttachmentRequestOptions\nCreateTransitGatewayPeeringAttachmentResult\nCreateTransitGatewayPeeringRequest\nCreateTransitGatewayPeeringResponse\nCreateTransitGatewayPolicyTableRequest\nCreateTransitGatewayPolicyTableResult\nCreateTransitGatewayPrefixListReferenceRequest\nCreateTransitGatewayPrefixListReferenceResult\nCreateTransitGatewayRequest\nCreateTransitGatewayResult\nCreateTransitGatewayRouteRequest\nCreateTransitGatewayRouteResult\nCreateTransitGatewayRouteTableAnnouncementRequest\nCreateTransitGatewayRouteTableAnnouncementResult\nCreateTransitGatewayRouteTableAttachmentRequest\nCreateTransitGatewayRouteTableAttachmentResponse\nCreateTransitGatewayRouteTableRequest\nCreateTransitGatewayRouteTableResult\nCreateTransitGatewayVpcAttachmentRequest\nCreateTransitGatewayVpcAttachmentRequestOptions\nCreateTransitGatewayVpcAttachmentResult\nCreateTransitVirtualInterfaceRequest\nCreateTransitVirtualInterfaceResult\nCreateTrialComponentRequest\nCreateTrialComponentResponse\nCreateTrialRequest\nCreateTrialResponse\nCreateTriggerRequest\nCreateTriggerResponse\nCreateTrustAnchorRequest\nCreateTrustRequest\nCreateTrustResult\nCreateTrustStoreRequest\nCreateTrustStoreResponse\nCreateTypeRequest\nCreateTypeResponse\nCreateTypedLinkFacetRequest\nCreateUnreferencedMergeCommitInput\nCreateUnreferencedMergeCommitOutput\nCreateUpdatedImageRequest\nCreateUpdatedImageResult\nCreateUpdatedWorkspaceImageRequest\nCreateUpdatedWorkspaceImageResult\nCreateUploadRequest\nCreateUploadResult\nCreateUploadUrlRequest\nCreateUploadUrlResponse\nCreateUsageLimitMessage\nCreateUsageLimitRequest\nCreateUsageLimitResponse\nCreateUsagePlanKeyRequest\nCreateUsagePlanRequest\nCreateUsageReportSubscriptionResult\nCreateUseCaseRequest\nCreateUseCaseResponse\nCreateUserAccessLoggingSettingsRequest\nCreateUserAccessLoggingSettingsResponse\nCreateUserDefinedFunctionRequest\nCreateUserGroupMessage\nCreateUserHierarchyGroupRequest\nCreateUserHierarchyGroupResponse\nCreateUserImportJobRequest\nCreateUserImportJobResponse\nCreateUserMessage\nCreateUserPoolClientRequest\nCreateUserPoolClientResponse\nCreateUserPoolDomainRequest\nCreateUserPoolDomainResponse\nCreateUserPoolRequest\nCreateUserPoolResponse\nCreateUserProfileRequest\nCreateUserProfileResponse\nCreateUserProfileResult\nCreateUserRequest\nCreateUserResponse\nCreateUserSettingsRequest\nCreateUserSettingsResponse\nCreateVPCAssociationAuthorizationRequest\nCreateVPCAssociationAuthorizationResponse\nCreateVPCConnectionRequest\nCreateVPCConnectionResponse\nCreateVPCEConfigurationRequest\nCreateVPCEConfigurationResult\nCreateVariableRequest\nCreateVariantStoreRequest\nCreateVariantStoreResponse\nCreateVaultInput\nCreateVaultOutput\nCreateVehicleError\nCreateVehicleRequest\nCreateVehicleRequestItem\nCreateVehicleResponse\nCreateVehicleResponseItem\nCreateVerifiedAccessEndpointEniOptions\nCreateVerifiedAccessEndpointLoadBalancerOptions\nCreateVerifiedAccessEndpointRequest\nCreateVerifiedAccessEndpointResult\nCreateVerifiedAccessGroupRequest\nCreateVerifiedAccessGroupResult\nCreateVerifiedAccessInstanceRequest\nCreateVerifiedAccessInstanceResult\nCreateVerifiedAccessTrustProviderDeviceOptions\nCreateVerifiedAccessTrustProviderOidcOptions\nCreateVerifiedAccessTrustProviderRequest\nCreateVerifiedAccessTrustProviderResult\nCreateViewInput\nCreateViewOutput\nCreateViewRequest\nCreateViewResponse\nCreateViewVersionRequest\nCreateViewVersionResponse\nCreateVirtualClusterRequest\nCreateVirtualClusterResponse\nCreateVirtualGatewayInput\nCreateVirtualGatewayOutput\nCreateVirtualMFADeviceRequest\nCreateVirtualMFADeviceResponse\nCreateVirtualNodeInput\nCreateVirtualNodeOutput\nCreateVirtualRouterInput\nCreateVirtualRouterOutput\nCreateVirtualServiceInput\nCreateVirtualServiceOutput\nCreateVocabularyFilterRequest\nCreateVocabularyFilterResponse\nCreateVocabularyRequest\nCreateVocabularyResponse\nCreateVodSourceRequest\nCreateVodSourceResponse\nCreateVoiceConnectorGroupRequest\nCreateVoiceConnectorGroupResponse\nCreateVoiceConnectorRequest\nCreateVoiceConnectorResponse\nCreateVoiceProfileDomainRequest\nCreateVoiceProfileDomainResponse\nCreateVoiceProfileRequest\nCreateVoiceProfileResponse\nCreateVoiceTemplateRequest\nCreateVoiceTemplateResponse\nCreateVolumeFromBackupRequest\nCreateVolumeFromBackupResponse\nCreateVolumePermission\nCreateVolumePermissionModifications\nCreateVolumePermissions\nCreateVolumeRequest\nCreateVolumeResponse\nCreateVpcAttachmentRequest\nCreateVpcAttachmentResponse\nCreateVpcConnectionRequest\nCreateVpcConnectionResponse\nCreateVpcConnectorRequest\nCreateVpcConnectorResponse\nCreateVpcEndpointConnectionNotificationRequest\nCreateVpcEndpointConnectionNotificationResult\nCreateVpcEndpointDetail\nCreateVpcEndpointRequest\nCreateVpcEndpointResponse\nCreateVpcEndpointResult\nCreateVpcEndpointServiceConfigurationRequest\nCreateVpcEndpointServiceConfigurationResult\nCreateVpcIngressConnectionRequest\nCreateVpcIngressConnectionResponse\nCreateVpcLinkRequest\nCreateVpcLinkResponse\nCreateVpcPeeringAuthorizationInput\nCreateVpcPeeringAuthorizationOutput\nCreateVpcPeeringConnectionInput\nCreateVpcPeeringConnectionRequest\nCreateVpcPeeringConnectionResult\nCreateVpcRequest\nCreateVpcResult\nCreateVpnConnectionRequest\nCreateVpnConnectionResult\nCreateVpnConnectionRouteRequest\nCreateVpnGatewayRequest\nCreateVpnGatewayResult\nCreateWatchlistRequest\nCreateWatchlistResponse\nCreateWaveRequest\nCreateWebACLMigrationStackRequest\nCreateWebACLMigrationStackResponse\nCreateWebACLRequest\nCreateWebACLResponse\nCreateWebLoginTokenRequest\nCreateWebLoginTokenResponse\nCreateWebhookInput\nCreateWebhookOutput\nCreateWebhookRequest\nCreateWebhookResult\nCreateWhatIfAnalysisRequest\nCreateWhatIfAnalysisResponse\nCreateWhatIfForecastExportRequest\nCreateWhatIfForecastExportResponse\nCreateWhatIfForecastRequest\nCreateWhatIfForecastResponse\nCreateWirelessDeviceRequest\nCreateWirelessDeviceResponse\nCreateWirelessGatewayRequest\nCreateWirelessGatewayResponse\nCreateWirelessGatewayTaskDefinitionRequest\nCreateWirelessGatewayTaskDefinitionResponse\nCreateWirelessGatewayTaskRequest\nCreateWirelessGatewayTaskResponse\nCreateWorkGroupInput\nCreateWorkerBlockRequest\nCreateWorkerConfigurationRequest\nCreateWorkerConfigurationResponse\nCreateWorkerFleetRequest\nCreateWorkerFleetResponse\nCreateWorkerRequest\nCreateWorkerResponse\nCreateWorkflowRequest\nCreateWorkflowResponse\nCreateWorkflowStepGroupRequest\nCreateWorkflowStepGroupResponse\nCreateWorkflowStepRequest\nCreateWorkflowStepResponse\nCreateWorkforceRequest\nCreateWorkforceResponse\nCreateWorkgroupRequest\nCreateWorkgroupResponse\nCreateWorkloadInput\nCreateWorkloadOutput\nCreateWorkloadShareInput\nCreateWorkloadShareOutput\nCreateWorkspaceApiKeyRequest\nCreateWorkspaceApiKeyResponse\nCreateWorkspaceBundleRequest\nCreateWorkspaceBundleResult\nCreateWorkspaceImageRequest\nCreateWorkspaceImageResult\nCreateWorkspaceRequest\nCreateWorkspaceResponse\nCreateWorkspacesRequest\nCreateWorkspacesResult\nCreateWorkteamRequest\nCreateWorkteamResponse\nCreateWorldExportJobRequest\nCreateWorldExportJobResponse\nCreateWorldGenerationJobRequest\nCreateWorldGenerationJobResponse\nCreateWorldTemplateRequest\nCreateWorldTemplateResponse\nCreateXMLClassifierRequest\nCreateXssMatchSetRequest\nCreateXssMatchSetResponse\nCreated\nCreatedAfter\nCreatedArtifact\nCreatedArtifactList\nCreatedArtifactName\nCreatedAt\nCreatedAtEndTime\nCreatedAtStartTime\nCreatedBefore\nCreatedButModifiedException\nCreatedBy\nCreatedByAccountId\nCreatedByArn\nCreatedByIamUser\nCreatedByService\nCreatedDate\nCreatedDateTime\nCreatedOn\nCreatedRange\nCreatedResourceArn\nCreatedRulesetName\nCreatedTime\nCreatedTimeStamp\nCreatedTimestamp\nCreatedUsingAutoPredictor\nCreates\nCreationDate\nCreationDateTime\nCreationInfo\nCreationLimitExceededException\nCreationPath\nCreationRequestDateTime\nCreationStatus\nCreationTime\nCreationTimeAfter\nCreationTimeBefore\nCreationTimestamp\nCreationToken\nCreatorId\nCreatorRequestId\nCredential\nCredentialPair\nCredentialProvider\nCredentialReportExpiredException\nCredentialReportNotPresentException\nCredentialReportNotReadyException\nCredentialSummary\nCredentialType\nCredentials\nCredentialsArn\nCredentialsParameter\nCredentialsSecretName\nCredentialsToAddOrUpdate\nCredentialsToRemove\nCreditSpecification\nCreditSpecificationRequest\nCriteria\nCriteriaBlockForJob\nCriteriaForJob\nCriterion\nCriterionAdditionalProperties\nCriterionKey\nCritical\nCriticalCount\nCriticalNonCompliantCount\nCriticality\nCrlConfiguration\nCrlDetail\nCrlDetailResponse\nCronExpression\nCronExpressionForRecurrence\nCrop\nCrossAccount\nCrossAccountAuthorization\nCrossAccountAuthorizations\nCrossAccountClone\nCrossAccountFilterOption\nCrossAccountModelRegisterRoleArn\nCrossChannelBehavior\nCrossClusterSearch\nCrossClusterSearchConnection\nCrossClusterSearchConnectionId\nCrossClusterSearchConnectionProperties\nCrossClusterSearchConnections\nCrossDataset\nCrossRealmTrustPrincipalPassword\nCrossRegionCopy\nCrossRegionCopyAction\nCrossRegionCopyDeprecateRule\nCrossRegionCopyRetainRule\nCrossRegionCopyRule\nCrossRegionCopyRules\nCrossZoneLoadBalancing\nCryptoProviders\nCryptogramVerificationArpcMethod1\nCryptogramVerificationArpcMethod2\nCsid\nCslgAtom\nCsr\nCsrExtensions\nCsv\nCsvClassifier\nCsvConfiguration\nCsvContentTypes\nCsvDelimiter\nCsvFormatDescriptor\nCsvNoSupValue\nCsvNullValue\nCsvOptions\nCsvOutputOptions\nCsvReport\nCsvRowDelimiter\nCttsVersion\nCumulativeBytesMetered\nCumulativeBytesScanned\nCurrency\nCurrencyCode\nCurrencyDisplayFormatConfiguration\nCurrencySymbol\nCurrent\nCurrentAction\nCurrentActiveJob\nCurrentActiveVersion\nCurrentActiveVersionArn\nCurrentApplicationVersionId\nCurrentApplyDate\nCurrentAverageCoverage\nCurrentAverageHourlyOnDemandSpend\nCurrentBackupRateInMegaBytesPerSecond\nCurrentBrokerSoftwareInfo\nCurrentCapacity\nCurrentCoverage\nCurrentDatabaseRevision\nCurrentDefaultVersion\nCurrentDeliveryStreamVersionId\nCurrentExpiryYear\nCurrentFirewallSubnetRouteTable\nCurrentFleetState\nCurrentGeneration\nCurrentInferenceUnits\nCurrentInstance\nCurrentInstanceBootMode\nCurrentInstanceCount\nCurrentInstances\nCurrentInternetGatewayRouteTable\nCurrentIpamScopeId\nCurrentLensVersion\nCurrentLsn\nCurrentMaximumHourlyOnDemandSpend\nCurrentMetric\nCurrentMetricData\nCurrentMetricResult\nCurrentMetricSortCriteria\nCurrentMetrics\nCurrentMinimumHourlyOnDemandSpend\nCurrentNetworkingStatus\nCurrentOnDemandSpend\nCurrentOperationStatus\nCurrentParallelism\nCurrentPassword\nCurrentPerformanceRiskRatings\nCurrentPhase\nCurrentPlayerSessionCount\nCurrentPolicyDescription\nCurrentProfileVersion\nCurrentRateInMegaBytesPerSecond\nCurrentRegionAvailability\nCurrentRestoreRateInMegaBytesPerSecond\nCurrentRevision\nCurrentRole\nCurrentRouteTable\nCurrentSamplingPercentage\nCurrentScore\nCurrentServerlessConfig\nCurrentShardCount\nCurrentShardLevelMetrics\nCurrentSigningKeyLength\nCurrentSoftware\nCurrentSpotFleetRequestState\nCurrentState\nCurrentStatus\nCurrentStepName\nCurrentTaskExecutionArn\nCurrentVersion\nCurrentWeight\nCustSubscriptionId\nCustomAction\nCustomActionFilterOperation\nCustomActionId\nCustomActionNavigationOperation\nCustomActionSetParametersOperation\nCustomActionURLOperation\nCustomActions\nCustomAmi\nCustomAmiId\nCustomAmiList\nCustomArtifactConfiguration\nCustomArtifactConfigurationDescription\nCustomArtifactsConfiguration\nCustomArtifactsConfigurationDescription\nCustomArtifactsConfigurationUpdate\nCustomAttribute\nCustomAttributes\nCustomAuthConfig\nCustomAuthCredentials\nCustomAvailabilityZoneNotFoundFault\nCustomCertificate\nCustomCname\nCustomCnameAssociationFault\nCustomCode\nCustomCodeSigning\nCustomColor\nCustomColors\nCustomCondition\nCustomConfig\nCustomConnector\nCustomConnectorDestinationProperties\nCustomConnectorProfileCredentials\nCustomConnectorProfileProperties\nCustomConnectorSourceProperties\nCustomContentConfiguration\nCustomContentVisual\nCustomCookbooksSource\nCustomDBEngineVersionAMI\nCustomDBEngineVersionAlreadyExistsFault\nCustomDBEngineVersionManifest\nCustomDBEngineVersionNotFoundFault\nCustomDBEngineVersionQuotaExceededFault\nCustomDNSServer\nCustomDataIdentifierSummary\nCustomDataIdentifiers\nCustomDataIdentifiersDetections\nCustomDataIdentifiersResult\nCustomDatatypeConfigured\nCustomDatatypes\nCustomDeliveryConfiguration\nCustomDetection\nCustomDnsServers\nCustomDocumentEnrichmentConfiguration\nCustomDomain\nCustomDomainAssociationNotFoundFault\nCustomDomainAssociationsMessage\nCustomDomainCertExpiryTime\nCustomDomainCertificateArn\nCustomDomainCertificateExpiryDate\nCustomDomainConfig\nCustomDomainConfigType\nCustomDomainName\nCustomDomains\nCustomEmailLambdaVersionConfigType\nCustomEmailSender\nCustomEndpoint\nCustomEndpointCertificateArn\nCustomEndpointEnabled\nCustomEndpointType\nCustomEndpoints\nCustomEntityType\nCustomEntityTypes\nCustomEntityTypesNotFound\nCustomEpoch\nCustomErrorResponse\nCustomErrorResponses\nCustomEventData\nCustomEvents\nCustomExtension\nCustomExtensions\nCustomFederationProviderUrl\nCustomFilterConfiguration\nCustomFilterListConfiguration\nCustomHTTPHeader\nCustomHeaders\nCustomHeadersConfig\nCustomHealthNotFound\nCustomIamInstanceProfile\nCustomIconContent\nCustomImage\nCustomImages\nCustomIndices\nCustomIndicesInput\nCustomInstanceProfileArn\nCustomJson\nCustomKeyStoreHasCMKsException\nCustomKeyStoreId\nCustomKeyStoreInvalidStateException\nCustomKeyStoreName\nCustomKeyStoreNameInUseException\nCustomKeyStoreNotFoundException\nCustomKeyStoreType\nCustomKeyStores\nCustomKeyStoresListEntry\nCustomKeys\nCustomKnowledgeArticleTypeConfigurations\nCustomLabel\nCustomLabelConfiguration\nCustomLabels\nCustomLanguageCode\nCustomLibraries\nCustomLineItemBillingPeriodRange\nCustomLineItemChargeDetails\nCustomLineItemFlatChargeDetails\nCustomLineItemListElement\nCustomLineItemPercentageChargeDetails\nCustomLineItemVersionListElement\nCustomLineItemVersions\nCustomLineItems\nCustomLogSourceAttributes\nCustomLogSourceConfiguration\nCustomLogSourceCrawlerConfiguration\nCustomLogSourceProvider\nCustomLogSourceResource\nCustomMessage\nCustomMessageActivity\nCustomMetadata\nCustomMetadataLimitExceededException\nCustomModelSummary\nCustomModelTrainingParameters\nCustomModelTransformParameters\nCustomName\nCustomNarrative\nCustomNarrativeOptions\nCustomObjectIdentifier\nCustomOriginConfig\nCustomParameterValues\nCustomPatterns\nCustomPayload\nCustomPermissionsName\nCustomPlatformQuota\nCustomPlugin\nCustomPluginDescription\nCustomPluginFileDescription\nCustomPluginLocation\nCustomPluginLocationDescription\nCustomPluginRevisionSummary\nCustomPluginSummary\nCustomPolicyDetails\nCustomPrivateKey\nCustomRecipes\nCustomRedirectDomain\nCustomRequestHandling\nCustomResponse\nCustomResponseBodies\nCustomResponseBody\nCustomResponseBodyKey\nCustomRoleArn\nCustomRoutingAccelerator\nCustomRoutingAcceleratorAttributes\nCustomRoutingDestinationConfiguration\nCustomRoutingDestinationDescription\nCustomRoutingEndpointConfiguration\nCustomRoutingEndpointDescription\nCustomRoutingEndpointGroup\nCustomRoutingListener\nCustomRule\nCustomSMSLambdaVersionConfigType\nCustomSMSSender\nCustomSchemaCountLimitExceededException\nCustomSeasonalityValue\nCustomSecurityGroupId\nCustomSecurityGroupIds\nCustomSql\nCustomStepDetails\nCustomSuffix\nCustomTextContent\nCustomUserData\nCustomValue\nCustomValues\nCustomValuesConfiguration\nCustomVerificationEmailInvalidContentException\nCustomVerificationEmailTemplate\nCustomVerificationEmailTemplateAlreadyExistsException\nCustomVerificationEmailTemplateDoesNotExistException\nCustomVerificationEmailTemplateMetadata\nCustomVerificationEmailTemplateName\nCustomVerificationEmailTemplates\nCustomVocabularyEntryId\nCustomVocabularyExportSpecification\nCustomVocabularyImportSpecification\nCustomVocabularyItem\nCustomerAWSAccountId\nCustomerAction\nCustomerAgentInfo\nCustomerAgentlessCollectorInfo\nCustomerAgreement\nCustomerArtifactPaths\nCustomerAvailabilityZone\nCustomerAwsId\nCustomerConnectorInfo\nCustomerContentEncryptionConfiguration\nCustomerDnsIps\nCustomerGateway\nCustomerGatewayArn\nCustomerGatewayArns\nCustomerGatewayAssociation\nCustomerGatewayAssociations\nCustomerGatewayConfiguration\nCustomerGatewayId\nCustomerGatewayIds\nCustomerGateways\nCustomerIdentifier\nCustomerManagedChannelS3Storage\nCustomerManagedChannelS3StorageSummary\nCustomerManagedDatastoreS3Storage\nCustomerManagedDatastoreS3StorageSummary\nCustomerManagedKeyEnabled\nCustomerManagedPolicyReference\nCustomerManagedPolicyReferences\nCustomerManagedS3Storage\nCustomerMasterKeySpec\nCustomerMeCollectorInfo\nCustomerMetadataProperties\nCustomerMetadataPropertiesToRemove\nCustomerNodeEndpoint\nCustomerNodeEndpointList\nCustomerNotEntitledException\nCustomerOutpostArn\nCustomerOverride\nCustomerOverrideValidTill\nCustomerOwnedIp\nCustomerOwnedIpEnabled\nCustomerOwnedIpv4Pool\nCustomerProfiles\nCustomerProfilesDestinationProperties\nCustomerResultObject\nCustomerSpeakerId\nCustomerStorageMessage\nCustomerUserName\nCustomizedCapacityMetricSpecification\nCustomizedLoadMetricSpecification\nCustomizedMetricSpecification\nCustomizedScalingMetricSpecification\nCutoff\nCutoffBehavior\nCvss\nCvss2\nCvss3\nCvssScore\nCvssScoreAdjustment\nCvssScoreDetails\nCwLog\nCwLogEnabled\nCwLogGroup\nCwes\nDASHFragmentSelector\nDASHStreamingSessionURL\nDASHTimestampRange\nDBCluster\nDBClusterAlreadyExistsFault\nDBClusterArn\nDBClusterAutomatedBackup\nDBClusterAutomatedBackupMessage\nDBClusterAutomatedBackupNotFoundFault\nDBClusterAutomatedBackupQuotaExceededFault\nDBClusterAutomatedBackups\nDBClusterAutomatedBackupsArn\nDBClusterBacktrack\nDBClusterBacktrackMessage\nDBClusterBacktrackNotFoundFault\nDBClusterBacktracks\nDBClusterCapacityInfo\nDBClusterEndpoint\nDBClusterEndpointAlreadyExistsFault\nDBClusterEndpointArn\nDBClusterEndpointIdentifier\nDBClusterEndpointMessage\nDBClusterEndpointNotFoundFault\nDBClusterEndpointQuotaExceededFault\nDBClusterEndpointResourceIdentifier\nDBClusterEndpoints\nDBClusterIdentifier\nDBClusterIdentifiers\nDBClusterInstanceClass\nDBClusterMember\nDBClusterMembers\nDBClusterMessage\nDBClusterNotFoundFault\nDBClusterOptionGroupMemberships\nDBClusterOptionGroupName\nDBClusterOptionGroupStatus\nDBClusterParameterGroup\nDBClusterParameterGroupArn\nDBClusterParameterGroupDetails\nDBClusterParameterGroupName\nDBClusterParameterGroupNameMessage\nDBClusterParameterGroupNotFoundFault\nDBClusterParameterGroupStatus\nDBClusterParameterGroups\nDBClusterParameterGroupsMessage\nDBClusterQuotaExceededFault\nDBClusterRole\nDBClusterRoleAlreadyExistsFault\nDBClusterRoleNotFoundFault\nDBClusterRoleQuotaExceededFault\nDBClusterSnapshot\nDBClusterSnapshotAlreadyExistsFault\nDBClusterSnapshotArn\nDBClusterSnapshotAttribute\nDBClusterSnapshotAttributes\nDBClusterSnapshotAttributesResult\nDBClusterSnapshotIdentifier\nDBClusterSnapshotMessage\nDBClusterSnapshotNotFoundFault\nDBClusterSnapshots\nDBClusters\nDBEngineDescription\nDBEngineMediaType\nDBEngineVersion\nDBEngineVersionArn\nDBEngineVersionDescription\nDBEngineVersionMessage\nDBEngineVersions\nDBInstance\nDBInstanceAlreadyExistsFault\nDBInstanceArn\nDBInstanceAutomatedBackup\nDBInstanceAutomatedBackupMessage\nDBInstanceAutomatedBackupNotFoundFault\nDBInstanceAutomatedBackupQuotaExceededFault\nDBInstanceAutomatedBackups\nDBInstanceAutomatedBackupsArn\nDBInstanceAutomatedBackupsReplication\nDBInstanceAutomatedBackupsReplications\nDBInstanceClass\nDBInstanceCount\nDBInstanceIdentifier\nDBInstanceIdentifiers\nDBInstanceMessage\nDBInstanceNotFoundFault\nDBInstanceParameterGroupName\nDBInstanceRole\nDBInstanceRoleAlreadyExistsFault\nDBInstanceRoleNotFoundFault\nDBInstanceRoleQuotaExceededFault\nDBInstanceStatus\nDBInstanceStatusInfo\nDBInstances\nDBLogFileNotFoundFault\nDBName\nDBParameterGroup\nDBParameterGroupAlreadyExistsFault\nDBParameterGroupArn\nDBParameterGroupDetails\nDBParameterGroupFamily\nDBParameterGroupName\nDBParameterGroupNameMessage\nDBParameterGroupNotFoundFault\nDBParameterGroupQuotaExceededFault\nDBParameterGroupStatus\nDBParameterGroups\nDBParameterGroupsMessage\nDBPortNumber\nDBProxies\nDBProxy\nDBProxyAlreadyExistsFault\nDBProxyArn\nDBProxyEndpoint\nDBProxyEndpointAlreadyExistsFault\nDBProxyEndpointArn\nDBProxyEndpointName\nDBProxyEndpointNotFoundFault\nDBProxyEndpointQuotaExceededFault\nDBProxyEndpoints\nDBProxyName\nDBProxyNotFoundFault\nDBProxyQuotaExceededFault\nDBProxyTarget\nDBProxyTargetAlreadyRegisteredFault\nDBProxyTargetGroup\nDBProxyTargetGroupNotFoundFault\nDBProxyTargetNotFoundFault\nDBProxyTargets\nDBSecurityGroup\nDBSecurityGroupAlreadyExistsFault\nDBSecurityGroupArn\nDBSecurityGroupDescription\nDBSecurityGroupMembership\nDBSecurityGroupMemberships\nDBSecurityGroupMessage\nDBSecurityGroupName\nDBSecurityGroupNotFoundFault\nDBSecurityGroupNotSupportedFault\nDBSecurityGroupQuotaExceededFault\nDBSecurityGroups\nDBSnapshot\nDBSnapshotAlreadyExistsFault\nDBSnapshotArn\nDBSnapshotAttribute\nDBSnapshotAttributes\nDBSnapshotAttributesResult\nDBSnapshotIdentifier\nDBSnapshotMessage\nDBSnapshotNotFoundFault\nDBSnapshots\nDBSubnetGroup\nDBSubnetGroupAlreadyExistsFault\nDBSubnetGroupArn\nDBSubnetGroupDescription\nDBSubnetGroupDoesNotCoverEnoughAZs\nDBSubnetGroupMessage\nDBSubnetGroupName\nDBSubnetGroupNotAllowedFault\nDBSubnetGroupNotFoundFault\nDBSubnetGroupQuotaExceededFault\nDBSubnetGroups\nDBSubnetQuotaExceededFault\nDBSystemId\nDBUpgradeDependencyFailureFault\nDESIRED\nDICOMAccessionNumber\nDICOMImportJobProperties\nDICOMImportJobSummary\nDICOMNumberOfStudyRelatedInstances\nDICOMNumberOfStudyRelatedSeries\nDICOMPatientBirthDate\nDICOMPatientId\nDICOMPatientName\nDICOMPatientSex\nDICOMStudyDate\nDICOMStudyDateAndTime\nDICOMStudyDescription\nDICOMStudyId\nDICOMStudyInstanceUID\nDICOMStudyTime\nDICOMTags\nDICOMUpdates\nDNIS\nDNISEmergencyCallingConfiguration\nDNSKEYRecord\nDNSLogs\nDNSLogsConfigurationResult\nDNSName\nDNSSECNotFound\nDNSSECStatus\nDNSTarget\nDNSTargetResource\nDPDTimeoutAction\nDPDTimeoutSeconds\nDPUHour\nDPUSeconds\nDQResultsPublishingOptions\nDQStopJobOnFailureOptions\nDSRecord\nDTMFInputEvent\nDTMFSpecification\nDagEdges\nDagNodes\nDagProcessingLogs\nDagS3Path\nDaily\nDailyAutomaticBackupStartTime\nDailyCap\nDailyCommitmentToPurchase\nDailySettings\nDailyVolume\nDailyVolumes\nDakCertificateMetadata\nDanger\nDangerForeground\nDashAdditionalManifest\nDashConfiguration\nDashConfigurationForPut\nDashEncryption\nDashIsoEncryptionSettings\nDashIsoGroupSettings\nDashIsoImageBasedTrickPlaySettings\nDashManifest\nDashManifestStyle\nDashManifests\nDashPackage\nDashPlaylistSettings\nDashSignaledSystemIds\nDashboard\nDashboardArn\nDashboardAttributes\nDashboardBody\nDashboardEnabled\nDashboardEntries\nDashboardEntry\nDashboardError\nDashboardId\nDashboardInvalidInputError\nDashboardName\nDashboardNamePrefix\nDashboardNames\nDashboardNotFoundError\nDashboardOptions\nDashboardPublishOptions\nDashboardSearchFilter\nDashboardSourceEntity\nDashboardSourceTemplate\nDashboardSummary\nDashboardSummaryList\nDashboardValidationMessage\nDashboardValidationMessages\nDashboardVersion\nDashboardVersionDefinition\nDashboardVersionSummary\nDashboardVersionSummaryList\nDashboardVisual\nDashboardVisualId\nDashboardVisualPublishOptions\nDashboards\nData\nDataAccessRoleArn\nDataAggregation\nDataAlreadyAcceptedException\nDataAlreadyExistsException\nDataAnalysisEndTime\nDataAnalysisStartTime\nDataAttributes\nDataBars\nDataBarsOptions\nDataCaptureConfig\nDataCaptureConfigSummary\nDataCapturedDestinationS3Uri\nDataCatalog\nDataCatalogConfig\nDataCatalogEncryptionSettings\nDataCatalogInputDefinition\nDataCatalogOutput\nDataCatalogOutputs\nDataCatalogSummary\nDataCatalogsSummary\nDataCellsFilter\nDataCellsFilterResource\nDataCellsFilters\nDataChannel\nDataChannelConcatenationConfiguration\nDataClassification\nDataClassificationDetails\nDataCollectionDetails\nDataColor\nDataColorPalette\nDataCompressionType\nDataConfig\nDataConfiguration\nDataConnector\nDataDelayOffsetInMinutes\nDataDestination\nDataDistributionType\nDataDriven\nDataEncipherment\nDataEncryptionException\nDataEncryptionKeyId\nDataEncryptionMetadata\nDataEndTime\nDataEndTimeBefore\nDataEndpoint\nDataExists\nDataExplorationNotebookLocation\nDataExport\nDataFieldSeriesItem\nDataFormat\nDataFormatConversionConfiguration\nDataFrequency\nDataId\nDataIngestionJobSummaries\nDataIngestionJobSummary\nDataInputConfig\nDataInputConfiguration\nDataIntegrationArn\nDataIntegrationAssociationArn\nDataIntegrationAssociationSummary\nDataIntegrationAssociations\nDataIntegrationIdentifier\nDataIntegrationSummary\nDataIntegrations\nDataItem\nDataItems\nDataLabelOptions\nDataLabelType\nDataLabelTypes\nDataLabels\nDataLakeAdmins\nDataLakeAutoEnableNewAccountConfiguration\nDataLakeConfiguration\nDataLakeEncryptionConfiguration\nDataLakeException\nDataLakeKmsKeyId\nDataLakeLifecycleConfiguration\nDataLakeLifecycleExpiration\nDataLakeLifecycleTransition\nDataLakePrincipal\nDataLakePrincipalIdentifier\nDataLakeReplicationConfiguration\nDataLakeResource\nDataLakeS3Uri\nDataLakeSettings\nDataLakeSource\nDataLakeSourceStatus\nDataLakeUpdateException\nDataLakeUpdateStatus\nDataLength\nDataLocation\nDataLocationResource\nDataLocationS3\nDataManifestLocation\nDataModel\nDataModelConfiguration\nDataModelS3Configuration\nDataNodeCount\nDataOptions\nDataOutputConfiguration\nDataPTSControl\nDataPageSize\nDataPath\nDataPathColor\nDataPathLabelType\nDataPathList\nDataPathOptions\nDataPathSort\nDataPathValue\nDataPipelineId\nDataPoint\nDataPointDrillUpDownOption\nDataPointMenuLabelOption\nDataPointTooltipOption\nDataPoints\nDataPolicyCount\nDataPreProcessingConfiguration\nDataPreviewOptions\nDataPrivacy\nDataProcessing\nDataProtectionPolicy\nDataProvider\nDataProviderArn\nDataProviderCreationTime\nDataProviderDescriptor\nDataProviderDescriptorDefinition\nDataProviderIdentifier\nDataProviderName\nDataProviders\nDataPullMode\nDataQualityAppSpecification\nDataQualityBaselineConfig\nDataQualityEvaluationRunAdditionalRunOptions\nDataQualityJobInput\nDataQualityJobOutputConfig\nDataQualityMetric\nDataQualityMetricList\nDataQualityResult\nDataQualityResultDescription\nDataQualityResultFilterCriteria\nDataQualityRuleRecommendationRunDescription\nDataQualityRuleRecommendationRunFilter\nDataQualityRuleResult\nDataQualityRulesetEvaluationRunDescription\nDataQualityRulesetEvaluationRunFilter\nDataQualityRulesetFilterCriteria\nDataQualityRulesetListDetails\nDataQualitySummary\nDataQualityTargetTable\nDataQueries\nDataQuery\nDataRate\nDataRearrangement\nDataReplicationCounterpart\nDataReplicationError\nDataReplicationInfo\nDataReplicationInfoReplicatedDisk\nDataReplicationInitiation\nDataReplicationInitiationStep\nDataReplicationMetadata\nDataReplicationMetadataOutput\nDataReplicationMode\nDataReplicationPrimaryBrokerArn\nDataReplicationRole\nDataRepositoryAssociation\nDataRepositoryAssociationIds\nDataRepositoryAssociationNotFound\nDataRepositoryAssociations\nDataRepositoryConfiguration\nDataRepositoryFailureDetails\nDataRepositoryPath\nDataRepositorySubdirectories\nDataRepositoryTask\nDataRepositoryTaskEnded\nDataRepositoryTaskExecuting\nDataRepositoryTaskFailureDetails\nDataRepositoryTaskFilter\nDataRepositoryTaskNotFound\nDataRepositoryTaskStatus\nDataRepositoryTasks\nDataResource\nDataResources\nDataResponse\nDataResponses\nDataRetentionChangeInHours\nDataRetentionInHours\nDataRetentionOptIn\nDataRetentionSupport\nDataRetrievalPolicy\nDataRetrievalRule\nDataScannedBytes\nDataScannedInBytes\nDataSchema\nDataSchemaLocationS3\nDataSchemaUri\nDataSecurityConfig\nDataSet\nDataSetArn\nDataSetArns\nDataSetConfiguration\nDataSetConfigurations\nDataSetEntry\nDataSetId\nDataSetIdentifier\nDataSetIdentifierDeclaration\nDataSetIdentifierDeclarations\nDataSetImportItem\nDataSetImportSummary\nDataSetImportTask\nDataSetName\nDataSetParameterName\nDataSetPlaceholder\nDataSetReference\nDataSetReferences\nDataSetRefreshProperties\nDataSetSchema\nDataSetSearchFilter\nDataSetSummaries\nDataSetSummary\nDataSetUsageConfiguration\nDataSets\nDataShare\nDataShareArn\nDataShareAssociation\nDataShareAssociations\nDataShares\nDataSharingPreference\nDataSharingPreferenceForUpdate\nDataSize\nDataSizeInBytes\nDataSnapshotTime\nDataSource\nDataSourceArn\nDataSourceConfig\nDataSourceConfiguration\nDataSourceConfigurations\nDataSourceConfigurationsResult\nDataSourceCredentials\nDataSourceErrorCode\nDataSourceErrorInfo\nDataSourceFieldName\nDataSourceFreeTrial\nDataSourceGroup\nDataSourceGroups\nDataSourceId\nDataSourceIds\nDataSourceName\nDataSourceParameters\nDataSourceS3Configuration\nDataSourceSchema\nDataSourceSearchFilter\nDataSourceSummaries\nDataSourceSummary\nDataSourceSyncJob\nDataSourceSyncJobId\nDataSourceSyncJobMetricTarget\nDataSourceSyncJobMetrics\nDataSourceToIndexFieldMapping\nDataSourceVpcConfiguration\nDataSources\nDataSourcesFreeTrial\nDataSpec\nDataSplitConfig\nDataStartTime\nDataStartTimeAfter\nDataStorage\nDataStorageConfig\nDataTableColumns\nDataTableName\nDataTiering\nDataTieringEnabled\nDataTraceEnabled\nDataTransfer\nDataTransferApi\nDataTransferProgress\nDataTransferProgressPercent\nDataTransferProtection\nDataTransferSubscriberFeePercent\nDataTransferredInMegaBytes\nDataTransforms\nDataType\nDataTypeMapping\nDataUnavailableException\nDataUploadFrequency\nDataValidationMetrics\nDataValue\nDataViewDestinationTypeParams\nDataViewErrorInfo\nDataViewSummary\nDataVolumeKMSKeyId\nDataWrites\nDatabase\nDatabaseARN\nDatabaseARNUpdate\nDatabaseArn\nDatabaseConfigDetail\nDatabaseConfiguration\nDatabaseConnectionException\nDatabaseCredentials\nDatabaseEdition\nDatabaseEngine\nDatabaseEngineType\nDatabaseHost\nDatabaseId\nDatabaseIdentifier\nDatabaseIds\nDatabaseInformation\nDatabaseInput\nDatabaseInputDefinition\nDatabaseInstallationFilesS3BucketName\nDatabaseInstallationFilesS3Prefix\nDatabaseInstance\nDatabaseInstanceSoftwareDetailsResponse\nDatabaseIpAddress\nDatabaseLFTagPolicy\nDatabaseLFTagPolicyAndPermissions\nDatabaseList\nDatabaseMode\nDatabaseName\nDatabaseOptions\nDatabaseOutput\nDatabaseOutputMode\nDatabaseOutputs\nDatabasePort\nDatabasePreferences\nDatabaseResource\nDatabaseResponse\nDatabaseRevision\nDatabaseRevisionReleaseDate\nDatabaseShortInfoResponse\nDatabaseSummary\nDatabaseTableName\nDatabaseTableOutputOptions\nDatabaseType\nDatabaseUserName\nDatabaseVersion\nDatabases\nDatabricksParameters\nDatadog\nDatadogConnectorProfileCredentials\nDatadogConnectorProfileProperties\nDatadogSourceProperties\nDataflowDetail\nDataflowEndpoint\nDataflowEndpointConfig\nDataflowEndpointGroupIdResponse\nDataflowEndpointListItem\nDatapoint\nDatapoints\nDatapointsToAlarm\nDatapointsToAlert\nDataset\nDatasetAction\nDatasetActionSummary\nDatasetArn\nDatasetArns\nDatasetAugmentedManifestsListItem\nDatasetChanges\nDatasetContentDeliveryDestination\nDatasetContentDeliveryRule\nDatasetContentStatus\nDatasetContentSummary\nDatasetContentVersionValue\nDatasetCount\nDatasetDefinition\nDatasetDeletedAfterRequestedSyncCount\nDatasetDescription\nDatasetDocumentClassifierInputDataConfig\nDatasetEntityRecognizerAnnotations\nDatasetEntityRecognizerDocuments\nDatasetEntityRecognizerEntityList\nDatasetEntityRecognizerInputDataConfig\nDatasetEntries\nDatasetEntry\nDatasetExists\nDatasetExportJob\nDatasetExportJobOutput\nDatasetExportJobSummary\nDatasetFilter\nDatasetFormat\nDatasetGroundTruthManifest\nDatasetGroup\nDatasetGroupArn\nDatasetGroupName\nDatasetGroupSummary\nDatasetGroups\nDatasetId\nDatasetImageStats\nDatasetImportJob\nDatasetImportJobArn\nDatasetImportJobArns\nDatasetImportJobName\nDatasetImportJobSummary\nDatasetImportJobs\nDatasetInputDataConfig\nDatasetLabelDescription\nDatasetLabelDescriptions\nDatasetLabelStats\nDatasetMetadata\nDatasetName\nDatasetNameBeginsWith\nDatasetOwnerInfo\nDatasetParameter\nDatasetParameters\nDatasetProperties\nDatasetPropertiesList\nDatasetRowDateGranularity\nDatasetS3Uri\nDatasetSchema\nDatasetSchemaSummary\nDatasetSource\nDatasetStatisticsConfiguration\nDatasetStats\nDatasetSummaries\nDatasetSummary\nDatasetSyncCount\nDatasetTrigger\nDatasetType\nDatasetUpdateSummary\nDatasets\nDatasourcePackageIngestDetail\nDatasourcePackageIngestHistory\nDatasourcePackageIngestState\nDatasourcePackageIngestStates\nDatasourcePackageUsageInfo\nDatasourcePackages\nDatastore\nDatastoreActivity\nDatastoreArn\nDatastoreEndpoint\nDatastoreFilter\nDatastoreId\nDatastoreIotSiteWiseMultiLayerStorage\nDatastoreIotSiteWiseMultiLayerStorageSummary\nDatastoreName\nDatastorePartition\nDatastorePartitions\nDatastoreProperties\nDatastorePropertiesList\nDatastoreStatistics\nDatastoreStatus\nDatastoreStorageSummary\nDatastoreSummary\nDatastoreTypeVersion\nDatatype\nDate\nDateAggregationFunction\nDateArrayOptions\nDateAxisOptions\nDateColumnStatisticsData\nDateCreated\nDateDimensionField\nDateEnabled\nDateFieldFormat\nDateFilter\nDateFormat\nDateGranularity\nDateImported\nDateInterval\nDateMeasureField\nDateModified\nDateNewProvisioningDataAvailable\nDateOptions\nDatePartitionDelimiter\nDatePartitionEnabled\nDatePartitionSequence\nDatePartitionTimezone\nDateProvisioned\nDateRange\nDateRangeFilter\nDateRangeType\nDateReference\nDateTime\nDateTimeDatasetParameter\nDateTimeDatasetParameterDefaultValues\nDateTimeDefaultValues\nDateTimeFormat\nDateTimeFormatConfiguration\nDateTimeHierarchy\nDateTimeParameter\nDateTimeParameterDeclaration\nDateTimeParameters\nDateTimePicker\nDateTimePickerControlDisplayOptions\nDateTimeRange\nDateTimeStaticValues\nDateTimeValueWhenUnsetConfiguration\nDateTimeValues\nDateUpdated\nDateValue\nDatetime\nDatetimeFormat\nDatetimeOptions\nDatetimeRange\nDatetimeTypeFieldName\nDatum\nDay\nDayOfMonth\nDayOfTheWeek\nDayOfWeek\nDays\nDaysAfterInitiation\nDaysBeforeExpiry\nDaysOfWeek\nDbClusterIdentifier\nDbClusterMembers\nDbClusterOptionGroupMemberships\nDbClusterOptionGroupName\nDbClusterParameterGroup\nDbClusterParameterGroupStatus\nDbClusterResourceId\nDbClusterSnapshotAttributes\nDbClusterSnapshotIdentifier\nDbGroups\nDbInstanceArn\nDbInstanceClass\nDbInstanceIdentifier\nDbInstancePort\nDbInstanceStatus\nDbName\nDbParameterGroupName\nDbParameterGroups\nDbPassword\nDbSecurityGroupArn\nDbSecurityGroupDescription\nDbSecurityGroupName\nDbSecurityGroups\nDbSnapshotIdentifier\nDbSubnetGroup\nDbSubnetGroupArn\nDbSubnetGroupDescription\nDbSubnetGroupName\nDbUser\nDbiResourceId\nDcFilter\nDdlArtifactsSchema\nDdls\nDdsHandling\nDdsXCoordinate\nDdsYCoordinate\nDeactivateAnomalyDetectorRequest\nDeactivateContactChannelRequest\nDeactivateDeviceIdentifierRequest\nDeactivateDeviceIdentifierResponse\nDeactivateEvaluationFormRequest\nDeactivateEvaluationFormResponse\nDeactivateEventSourceRequest\nDeactivateKeySigningKeyRequest\nDeactivateKeySigningKeyResponse\nDeactivateMFADeviceRequest\nDeactivatePipelineInput\nDeactivateTypeInput\nDeactivateUserRequest\nDeactivatingLastSystemUserException\nDeadLetterConfig\nDeadLetterQueueUrl\nDeadLetterTargetArn\nDeadline\nDeauthorizeConnectionRequest\nDeauthorizeConnectionResponse\nDeauthorizeDataShareMessage\nDeblockFilter\nDebugHookConfig\nDebugLogDeliveryAccounts\nDebugLogging\nDebugRuleConfiguration\nDebugRuleConfigurations\nDebugRuleEvaluationStatus\nDebugRuleEvaluationStatuses\nDebugSession\nDecimalColumnStatisticsData\nDecimalDatasetParameter\nDecimalDatasetParameterDefaultValues\nDecimalDefaultValues\nDecimalNumber\nDecimalParameter\nDecimalParameterDeclaration\nDecimalParameters\nDecimalPlaces\nDecimalPlacesConfiguration\nDecimalSeparator\nDecimalStaticValues\nDecimalValueWhenUnsetConfiguration\nDecimalValues\nDecimalizationTable\nDecipherOnly\nDecision\nDecisionTask\nDecisionTaskCompletedEventAttributes\nDecisionTaskScheduledEventAttributes\nDecisionTaskStartedEventAttributes\nDecisionTaskTimedOutEventAttributes\nDeclared\nDeclaredTransforms\nDeclineHandshakeRequest\nDeclineHandshakeResponse\nDeclineInvitationsRequest\nDeclineInvitationsResponse\nDecodeAuthorizationMessageRequest\nDecodeAuthorizationMessageResponse\nDecodeConfig\nDecodedMessage\nDecoderManifestSummary\nDecoderManifestValidationException\nDecommissionTimeout\nDecreaseNodeGroupsInGlobalReplicationGroupMessage\nDecreaseNodeGroupsInGlobalReplicationGroupResult\nDecreaseReplicaCountMessage\nDecreaseReplicaCountResult\nDecreaseReplicationFactorRequest\nDecreaseReplicationFactorResponse\nDecreaseStreamRetentionPeriodInput\nDecrypt\nDecryptDataInput\nDecryptDataOutput\nDecryptRequest\nDecryptResponse\nDecryptStepDetails\nDecryption\nDecryptionAttributes\nDecryptionFailure\nDecryptionMode\nDecryptionSettings\nDedicatedHostIds\nDedicatedHostsSupported\nDedicatedIp\nDedicatedIpAutoWarmupEnabled\nDedicatedIpPool\nDedicatedIpPools\nDedicatedIps\nDedicatedMaster\nDedicatedMasterCount\nDedicatedMasterEnabled\nDedicatedMasterType\nDedicatedTenancyManagementCidrRange\nDedicatedTenancySupport\nDefault\nDefaultAction\nDefaultActions\nDefaultActivity\nDefaultAdmin\nDefaultAllocatedStorage\nDefaultArguments\nDefaultAssociationRouteTable\nDefaultAuthType\nDefaultAuthenticationMethod\nDefaultAvailabilityZone\nDefaultBaseline\nDefaultBehavior\nDefaultBranchCannotBeDeletedException\nDefaultButtonConfiguration\nDefaultCacheBehavior\nDefaultCapacityProviderStrategy\nDefaultCategoricalHyperParameterRange\nDefaultCellWidth\nDefaultCertificateForNewLaunches\nDefaultCharacterSet\nDefaultClientBrandingAttributes\nDefaultClusterParameters\nDefaultCodeRepository\nDefaultCodeRepositoryContains\nDefaultConditionalBranch\nDefaultConferenceProviderArn\nDefaultConfig\nDefaultContent\nDefaultContinuousHyperParameterRange\nDefaultControlPanel\nDefaultCooldown\nDefaultCores\nDefaultDateColumnName\nDefaultDetection\nDefaultDimensionValue\nDefaultDocumentIdFormat\nDefaultDomain\nDefaultEmailCustomizationTemplate\nDefaultEmailOption\nDefaultEmailTags\nDefaultEncryptionKey\nDefaultErrorDetails\nDefaultExecutorDpuSize\nDefaultExpirationDays\nDefaultExportDestination\nDefaultFieldValues\nDefaultForAz\nDefaultFormatting\nDefaultFreeFormLayoutConfiguration\nDefaultGateway\nDefaultGid\nDefaultGridLayoutConfiguration\nDefaultHyperParameterRanges\nDefaultIamRoleArn\nDefaultImportClientBrandingAttributes\nDefaultInstanceName\nDefaultInstanceProfileArn\nDefaultInstanceWarmup\nDefaultIntegerHyperParameterRange\nDefaultInteractiveLayoutConfiguration\nDefaultLicense\nDefaultList\nDefaultLists\nDefaultLogLevel\nDefaultMailDomain\nDefaultMessage\nDefaultMessageType\nDefaultNamespace\nDefaultNetworkCardIndex\nDefaultNewSheetConfiguration\nDefaultOnly\nDefaultOptionRefId\nDefaultOs\nDefaultOu\nDefaultOutboundQueueId\nDefaultPaginatedLayoutConfiguration\nDefaultPhoneNumber\nDefaultPort\nDefaultPropagationRouteTable\nDefaultPushNotificationMessage\nDefaultPushNotificationTemplate\nDefaultRecipes\nDefaultRedirectURI\nDefaultResourceDiscoveryAssociationId\nDefaultResourceDiscoveryId\nDefaultResourceSpec\nDefaultResult\nDefaultRetention\nDefaultRootDeviceType\nDefaultRootObject\nDefaultRoute\nDefaultRouteInput\nDefaultRouteSettings\nDefaultRouteTableAssociation\nDefaultRouteTablePropagation\nDefaultRunProperties\nDefaultRuntimeContextDevice\nDefaultRuntimeContextDeviceName\nDefaultS3Location\nDefaultSectionBasedLayoutConfiguration\nDefaultSecurityGroupNames\nDefaultSegmentDeliveryConfiguration\nDefaultSelection\nDefaultSenderId\nDefaultSeriesSettings\nDefaultServerSideEncryption\nDefaultSessionExpiryMinutes\nDefaultSizeInspectionLimit\nDefaultSpaceSettings\nDefaultSshKeyName\nDefaultState\nDefaultStorageClass\nDefaultSubnetId\nDefaultSubscriptionStatus\nDefaultSubstitutions\nDefaultTTL\nDefaultTags\nDefaultTargetCapacityType\nDefaultTargetInstance\nDefaultTemplateData\nDefaultTheme\nDefaultThreadsPerCore\nDefaultUid\nDefaultUndefinedFault\nDefaultUserAssociatedToUserGroupFault\nDefaultUserRequired\nDefaultUserSettings\nDefaultVCpus\nDefaultValue\nDefaultValueColumn\nDefaultValues\nDefaultVersion\nDefaultVersionId\nDefaultVersionName\nDefaultVersionNumber\nDefaultVocabulary\nDefaultVocabularyList\nDefaultWatchlist\nDefaultWatchlistId\nDefaultWorkspaceCreationProperties\nDefaults\nDeferActivation\nDeferMaintenance\nDeferMaintenanceDuration\nDeferMaintenanceEndTime\nDeferMaintenanceIdentifier\nDeferMaintenanceStartTime\nDeferredMaintenanceWindow\nDeferredMaintenanceWindows\nDefineAnalysisSchemeRequest\nDefineAnalysisSchemeResponse\nDefineAuthChallenge\nDefineExpressionRequest\nDefineExpressionResponse\nDefineIndexFieldRequest\nDefineIndexFieldResponse\nDefineSegment\nDefineSuggesterRequest\nDefineSuggesterResponse\nDefinition\nDefinitionArn\nDefinitionDocument\nDefinitionInformation\nDefinitionName\nDefinitionTimestamp\nDefinitionType\nDefinitions\nDegraded\nDeinterlacer\nDelay\nDelaySeconds\nDelayUntilElbConnectionsDrained\nDelegate\nDelegatedAdmin\nDelegatedAdminAccount\nDelegatedAdminAccountId\nDelegatedAdminAccountLimitExceededException\nDelegatedAdministrator\nDelegatedAdministrators\nDelegatedService\nDelegatedServices\nDelegates\nDelegation\nDelegationEnabledDate\nDelegationMetadata\nDelegationSet\nDelegationSetAlreadyCreated\nDelegationSetAlreadyReusable\nDelegationSetId\nDelegationSetInUse\nDelegationSetNotAvailable\nDelegationSetNotReusable\nDelegationSets\nDelegationTime\nDelete\nDeleteACLRequest\nDeleteACLResponse\nDeleteAcceleratorRequest\nDeleteAccessControlConfigurationRequest\nDeleteAccessControlRuleRequest\nDeleteAccessKeyRequest\nDeleteAccessLogSettingsRequest\nDeleteAccessLogSubscriptionRequest\nDeleteAccessPointForObjectLambdaRequest\nDeleteAccessPointInput\nDeleteAccessPointPolicyForObjectLambdaRequest\nDeleteAccessPointPolicyRequest\nDeleteAccessPointRequest\nDeleteAccessPolicyRequest\nDeleteAccessRequest\nDeleteAccessTokenRequest\nDeleteAccessorInput\nDeleteAccountAliasRequest\nDeleteAccountAssignmentRequest\nDeleteAccountAssignmentResponse\nDeleteAccountAuditConfigurationRequest\nDeleteAccountCustomizationRequest\nDeleteAccountCustomizationResponse\nDeleteAccountPolicyRequest\nDeleteAccountRequest\nDeleteAccountSettingRequest\nDeleteAccountSettingResponse\nDeleteAccountSubscriptionRequest\nDeleteAccountSubscriptionResponse\nDeleteActionRequest\nDeleteActionResponse\nDeleteActionTargetRequest\nDeleteActionTargetResponse\nDeleteActivationRequest\nDeleteActivityInput\nDeleteAddonRequest\nDeleteAddonResponse\nDeleteAddressBookRequest\nDeleteAdmChannelRequest\nDeleteAdmChannelResponse\nDeleteAfterDays\nDeleteAfterUpload\nDeleteAgentRequest\nDeleteAggregationAuthorizationRequest\nDeleteAgreementRequest\nDeleteAlarmModelRequest\nDeleteAlarmRequest\nDeleteAlarmResult\nDeleteAlarmsInput\nDeleteAlertManagerDefinitionRequest\nDeleteAlertRequest\nDeleteAlgorithmInput\nDeleteAliasInput\nDeleteAliasRequest\nDeleteAll\nDeleteAllPolicyResources\nDeleteAllRevisions\nDeleteAllowListRequest\nDeleteAlternateContactRequest\nDeleteAnalysisRequest\nDeleteAnalysisResponse\nDeleteAnalysisSchemeRequest\nDeleteAnalysisSchemeResponse\nDeleteAnalysisTemplateInput\nDeleteAnalyzerRequest\nDeleteAnnotationStoreRequest\nDeleteAnnotationStoreResponse\nDeleteAnnotationStoreVersionsRequest\nDeleteAnnotationStoreVersionsResponse\nDeleteAnomalyDetectorInput\nDeleteAnomalyDetectorRequest\nDeleteAnomalyMonitorRequest\nDeleteAnomalySubscriptionRequest\nDeleteApiCacheRequest\nDeleteApiDestinationRequest\nDeleteApiKeyRequest\nDeleteApiMappingRequest\nDeleteApiRequest\nDeleteApnsChannelRequest\nDeleteApnsChannelResponse\nDeleteApnsSandboxChannelRequest\nDeleteApnsSandboxChannelResponse\nDeleteApnsVoipChannelRequest\nDeleteApnsVoipChannelResponse\nDeleteApnsVoipSandboxChannelRequest\nDeleteApnsVoipSandboxChannelResponse\nDeleteAppAssessmentRequest\nDeleteAppAssessmentResponse\nDeleteAppAuthorizationRequest\nDeleteAppBlockBuilderRequest\nDeleteAppBlockRequest\nDeleteAppBundleRequest\nDeleteAppImageConfigRequest\nDeleteAppInput\nDeleteAppInputSourceRequest\nDeleteAppInputSourceResponse\nDeleteAppInstanceAdminRequest\nDeleteAppInstanceBotRequest\nDeleteAppInstanceRequest\nDeleteAppInstanceStreamingConfigurationsRequest\nDeleteAppInstanceUserRequest\nDeleteAppLaunchConfigurationRequest\nDeleteAppMonitorRequest\nDeleteAppReplicationConfigurationRequest\nDeleteAppRequest\nDeleteAppResponse\nDeleteAppResult\nDeleteAppValidationConfigurationRequest\nDeleteAppVersionAppComponentRequest\nDeleteAppVersionAppComponentResponse\nDeleteAppVersionResourceRequest\nDeleteAppVersionResourceResponse\nDeleteApplicationCloudWatchLoggingOptionRequest\nDeleteApplicationCloudWatchLoggingOptionResponse\nDeleteApplicationFromEnvironmentRequest\nDeleteApplicationInput\nDeleteApplicationInputProcessingConfigurationRequest\nDeleteApplicationInputProcessingConfigurationResponse\nDeleteApplicationMessage\nDeleteApplicationOutputRequest\nDeleteApplicationOutputResponse\nDeleteApplicationReferenceDataSourceRequest\nDeleteApplicationReferenceDataSourceResponse\nDeleteApplicationRequest\nDeleteApplicationResponse\nDeleteApplicationSnapshotRequest\nDeleteApplicationVersionMessage\nDeleteApplicationVpcConfigurationRequest\nDeleteApplicationVpcConfigurationResponse\nDeleteApplicationsRequest\nDeleteApprovalRuleTemplateInput\nDeleteApprovalRuleTemplateOutput\nDeleteAppsListRequest\nDeleteArchiveInput\nDeleteArchiveRequest\nDeleteArchiveRuleRequest\nDeleteArguments\nDeleteArtifactRequest\nDeleteArtifactResponse\nDeleteAssessmentFrameworkRequest\nDeleteAssessmentFrameworkShareRequest\nDeleteAssessmentReportRequest\nDeleteAssessmentRequest\nDeleteAssessmentRunRequest\nDeleteAssessmentTargetRequest\nDeleteAssessmentTemplateRequest\nDeleteAssetModelRequest\nDeleteAssetModelResponse\nDeleteAssetRequest\nDeleteAssetResponse\nDeleteAssistantAssociationRequest\nDeleteAssistantRequest\nDeleteAssociatedConditionalForwarder\nDeleteAssociationRequest\nDeleteAssociationResponse\nDeleteAt\nDeleteAttachmentRequest\nDeleteAttachmentResponse\nDeleteAttendeeRequest\nDeleteAttributeGroupRequest\nDeleteAttributeGroupResponse\nDeleteAttributesRequest\nDeleteAttributesResponse\nDeleteAuditSuppressionRequest\nDeleteAuthPolicyRequest\nDeleteAuthenticationProfileMessage\nDeleteAuthenticationProfileResult\nDeleteAuthorizerRequest\nDeleteAutoScalingConfigurationRequest\nDeleteAutoScalingConfigurationResponse\nDeleteAutoScalingGroupType\nDeleteAutoSnapshotRequest\nDeleteAutoSnapshotResult\nDeleteAutomatedBackups\nDeleteAutomaticTapeCreationPolicyInput\nDeleteAutomaticTapeCreationPolicyOutput\nDeleteAvailabilityConfigurationRequest\nDeleteAwsLogSourceRequest\nDeleteAwsLogSourceResponse\nDeleteBGPPeerRequest\nDeleteBGPPeerResponse\nDeleteBackendAPIRequest\nDeleteBackendAPIResponse\nDeleteBackendAuthRequest\nDeleteBackendAuthResponse\nDeleteBackendEnvironmentRequest\nDeleteBackendEnvironmentResult\nDeleteBackendRequest\nDeleteBackendResponse\nDeleteBackendStorageRequest\nDeleteBackendStorageResponse\nDeleteBackupInput\nDeleteBackupOutput\nDeleteBackupPlanInput\nDeleteBackupPlanOutput\nDeleteBackupRequest\nDeleteBackupResponse\nDeleteBackupSelectionInput\nDeleteBackupVaultAccessPolicyInput\nDeleteBackupVaultInput\nDeleteBackupVaultLockConfigurationInput\nDeleteBackupVaultNotificationsInput\nDeleteBaiduChannelRequest\nDeleteBaiduChannelResponse\nDeleteBandwidthRateLimitInput\nDeleteBandwidthRateLimitOutput\nDeleteBasePathMappingRequest\nDeleteBatchImportJobRequest\nDeleteBatchPredictionInput\nDeleteBatchPredictionJobRequest\nDeleteBatchPredictionOutput\nDeleteBehavior\nDeleteBillingGroupInput\nDeleteBillingGroupOutput\nDeleteBillingGroupRequest\nDeleteBlueGreenDeploymentRequest\nDeleteBlueGreenDeploymentResponse\nDeleteBlueprintRequest\nDeleteBlueprintResponse\nDeleteBotAliasRequest\nDeleteBotAliasResponse\nDeleteBotChannelAssociationRequest\nDeleteBotLocaleRequest\nDeleteBotLocaleResponse\nDeleteBotRequest\nDeleteBotResponse\nDeleteBotVersionRequest\nDeleteBotVersionResponse\nDeleteBranchInput\nDeleteBranchOutput\nDeleteBranchRequest\nDeleteBranchResult\nDeleteBridgeRequest\nDeleteBridgeResponse\nDeleteBrokerRequest\nDeleteBrokerResponse\nDeleteBrowserSettingsRequest\nDeleteBucketAccessKeyRequest\nDeleteBucketAccessKeyResult\nDeleteBucketAnalyticsConfigurationRequest\nDeleteBucketCorsRequest\nDeleteBucketEncryptionRequest\nDeleteBucketIntelligentTieringConfigurationRequest\nDeleteBucketInventoryConfigurationRequest\nDeleteBucketLifecycleConfigurationRequest\nDeleteBucketLifecycleRequest\nDeleteBucketMetricsConfigurationRequest\nDeleteBucketOwnershipControlsRequest\nDeleteBucketPolicyRequest\nDeleteBucketReplicationRequest\nDeleteBucketRequest\nDeleteBucketResult\nDeleteBucketTaggingRequest\nDeleteBucketWebsiteRequest\nDeleteBudgetActionRequest\nDeleteBudgetActionResponse\nDeleteBudgetRequest\nDeleteBuildBatchInput\nDeleteBuildBatchOutput\nDeleteBuildInput\nDeleteBusinessReportScheduleRequest\nDeleteByteMatchSetRequest\nDeleteByteMatchSetResponse\nDeleteCACertificateRequest\nDeleteCacheClusterMessage\nDeleteCacheClusterResult\nDeleteCacheParameterGroupMessage\nDeleteCachePolicyRequest\nDeleteCacheSecurityGroupMessage\nDeleteCacheSubnetGroupMessage\nDeleteCalculatedAttributeDefinitionRequest\nDeleteCallAnalyticsCategoryRequest\nDeleteCallAnalyticsJobRequest\nDeleteCampaignRequest\nDeleteCampaignResponse\nDeleteCanaryRequest\nDeleteCapacityProviderRequest\nDeleteCapacityProviderResponse\nDeleteCapacityReservationInput\nDeleteCarrierGatewayRequest\nDeleteCarrierGatewayResult\nDeleteCellRequest\nDeleteCertificateAuthorityRequest\nDeleteCertificateMessage\nDeleteCertificateRequest\nDeleteCertificateResponse\nDeleteCertificateResult\nDeleteChangeSetInput\nDeleteChannelBanRequest\nDeleteChannelFlowRequest\nDeleteChannelGroupRequest\nDeleteChannelMembershipRequest\nDeleteChannelMessageRequest\nDeleteChannelModeratorRequest\nDeleteChannelPolicyRequest\nDeleteChannelRequest\nDeleteChannelResponse\nDeleteChapCredentialsInput\nDeleteChapCredentialsOutput\nDeleteCidrCollectionRequest\nDeleteClassifierRequest\nDeleteClientBrandingRequest\nDeleteClientCertificateRequest\nDeleteClientVpnEndpointRequest\nDeleteClientVpnEndpointResult\nDeleteClientVpnRouteRequest\nDeleteClientVpnRouteResult\nDeleteClonedVolumes\nDeleteCloudFrontOriginAccessIdentityRequest\nDeleteClusterInput\nDeleteClusterMessage\nDeleteClusterOutput\nDeleteClusterParameterGroupMessage\nDeleteClusterPolicyRequest\nDeleteClusterRequest\nDeleteClusterResponse\nDeleteClusterResult\nDeleteClusterSecurityGroupMessage\nDeleteClusterSnapshotInput\nDeleteClusterSnapshotMessage\nDeleteClusterSnapshotOutput\nDeleteClusterSnapshotResult\nDeleteClusterSubnetGroupMessage\nDeleteCodeRepositoryInput\nDeleteCodeSigningConfigRequest\nDeleteCoipCidrRequest\nDeleteCoipCidrResult\nDeleteCoipPoolRequest\nDeleteCoipPoolResult\nDeleteCollaborationInput\nDeleteCollectionDetail\nDeleteCollectionRequest\nDeleteCollectionResponse\nDeleteCollectorRequest\nDeleteColumnStatisticsForPartitionRequest\nDeleteColumnStatisticsForTableRequest\nDeleteCommentContentInput\nDeleteCommentContentOutput\nDeleteCommentRequest\nDeleteComponentInput\nDeleteComponentOutput\nDeleteComponentRequest\nDeleteComponentResponse\nDeleteComponentTypeRequest\nDeleteComponentTypeResponse\nDeleteComputeEnvironmentRequest\nDeleteConditionalForwarderRequest\nDeleteConferenceProviderRequest\nDeleteConfigRequest\nDeleteConfigRuleRequest\nDeleteConfigurationAggregatorRequest\nDeleteConfigurationProfileRequest\nDeleteConfigurationRecorderRequest\nDeleteConfigurationRequest\nDeleteConfigurationResponse\nDeleteConfigurationSetEventDestinationRequest\nDeleteConfigurationSetRequest\nDeleteConfigurationSetResult\nDeleteConfigurationSetTrackingOptionsRequest\nDeleteConfigurationTemplateMessage\nDeleteConfiguredTableAnalysisRuleInput\nDeleteConfiguredTableAssociationInput\nDeleteConfiguredTableInput\nDeleteConflictException\nDeleteConformancePackRequest\nDeleteConnectClientAddInRequest\nDeleteConnectInstanceConfigRequest\nDeleteConnectPeerRequest\nDeleteConnectPeerResponse\nDeleteConnectionAliasRequest\nDeleteConnectionInput\nDeleteConnectionMessage\nDeleteConnectionRequest\nDeleteConnectionResponse\nDeleteConnectorDefinitionRequest\nDeleteConnectorProfileRequest\nDeleteConnectorRequest\nDeleteConnectorResponse\nDeleteConstraintInput\nDeleteContactChannelRequest\nDeleteContactEvaluationRequest\nDeleteContactFlowModuleRequest\nDeleteContactFlowRequest\nDeleteContactListRequest\nDeleteContactMethodRequest\nDeleteContactMethodResult\nDeleteContactRequest\nDeleteContainerImageRequest\nDeleteContainerInput\nDeleteContainerPolicyInput\nDeleteContainerRecipeRequest\nDeleteContainerRecipeResponse\nDeleteContainerServiceRequest\nDeleteContentRequest\nDeleteContextRequest\nDeleteContextResponse\nDeleteContinuousDeploymentPolicyRequest\nDeleteControlPanelRequest\nDeleteControlRequest\nDeleteCoreDefinitionRequest\nDeleteCoreDeviceRequest\nDeleteCoreNetworkPolicyVersionRequest\nDeleteCoreNetworkPolicyVersionResponse\nDeleteCoreNetworkRequest\nDeleteCoreNetworkResponse\nDeleteCorsConfigurationRequest\nDeleteCorsPolicyInput\nDeleteCostCategoryDefinitionRequest\nDeleteCostCategoryDefinitionResponse\nDeleteCrawlerRequest\nDeleteCrossAccountAuthorizationRequest\nDeleteCustomActionTypeInput\nDeleteCustomDBEngineVersionMessage\nDeleteCustomDataIdentifierRequest\nDeleteCustomDomainAssociationMessage\nDeleteCustomEntityTypeRequest\nDeleteCustomEntityTypeResponse\nDeleteCustomKeyStoreRequest\nDeleteCustomLineItemInput\nDeleteCustomLineItemOutput\nDeleteCustomLogSourceRequest\nDeleteCustomMetadataRequest\nDeleteCustomMetricRequest\nDeleteCustomModelRequest\nDeleteCustomPluginRequest\nDeleteCustomPluginResponse\nDeleteCustomRoutingAcceleratorRequest\nDeleteCustomRoutingEndpointGroupRequest\nDeleteCustomRoutingListenerRequest\nDeleteCustomVerificationEmailTemplateRequest\nDeleteCustomVocabularyRequest\nDeleteCustomVocabularyResponse\nDeleteCustomerGatewayRequest\nDeleteDBClusterAutomatedBackupMessage\nDeleteDBClusterAutomatedBackupResult\nDeleteDBClusterEndpointMessage\nDeleteDBClusterEndpointOutput\nDeleteDBClusterMessage\nDeleteDBClusterParameterGroupMessage\nDeleteDBClusterResult\nDeleteDBClusterSnapshotMessage\nDeleteDBClusterSnapshotResult\nDeleteDBInstanceAutomatedBackupMessage\nDeleteDBInstanceAutomatedBackupResult\nDeleteDBInstanceMessage\nDeleteDBInstanceResult\nDeleteDBParameterGroupMessage\nDeleteDBProxyEndpointRequest\nDeleteDBProxyEndpointResponse\nDeleteDBProxyRequest\nDeleteDBProxyResponse\nDeleteDBSecurityGroupMessage\nDeleteDBSnapshotMessage\nDeleteDBSnapshotResult\nDeleteDBSubnetGroupMessage\nDeleteDashboardRequest\nDeleteDashboardResponse\nDeleteDashboardsInput\nDeleteDataCatalogInput\nDeleteDataCellsFilterRequest\nDeleteDataInFileSystem\nDeleteDataIntegrationRequest\nDeleteDataLakeOrganizationConfigurationRequest\nDeleteDataLakeRequest\nDeleteDataProtectionPolicyRequest\nDeleteDataProviderMessage\nDeleteDataProviderResponse\nDeleteDataQualityJobDefinitionRequest\nDeleteDataQualityRulesetRequest\nDeleteDataRepositoryAssociationRequest\nDeleteDataRepositoryAssociationResponse\nDeleteDataSetRefreshPropertiesRequest\nDeleteDataSetRefreshPropertiesResponse\nDeleteDataSetRequest\nDeleteDataSetResponse\nDeleteDataSourceInput\nDeleteDataSourceOutput\nDeleteDataSourceRequest\nDeleteDataSourceResponse\nDeleteDatabaseRequest\nDeleteDataflowEndpointGroupRequest\nDeleteDatasetContentRequest\nDeleteDatasetGroupRequest\nDeleteDatasetImportJobRequest\nDeleteDatasetRequest\nDeleteDatasetResponse\nDeleteDatastoreRequest\nDeleteDatastoreResponse\nDeleteDecoderManifestRequest\nDeleteDecoderManifestResponse\nDeleteDedicatedIpPoolRequest\nDeleteDefaultMessageTypeRequest\nDeleteDefaultMessageTypeResult\nDeleteDefaultSenderIdRequest\nDeleteDefaultSenderIdResult\nDeleteDeliveryChannelRequest\nDeleteDeliveryStreamInput\nDeleteDeploymentConfigInput\nDeleteDeploymentGroupInput\nDeleteDeploymentGroupOutput\nDeleteDeploymentInput\nDeleteDeploymentOutput\nDeleteDeploymentRequest\nDeleteDeploymentStrategyRequest\nDeleteDestinationRequest\nDeleteDetectorModelRequest\nDeleteDetectorRequest\nDeleteDetectorVersionRequest\nDeleteDevEndpointRequest\nDeleteDevEnvironmentRequest\nDeleteDevEnvironmentResponse\nDeleteDeviceDefinitionRequest\nDeleteDeviceFleetRequest\nDeleteDevicePoolRequest\nDeleteDeviceProfileRequest\nDeleteDeviceRequest\nDeleteDeviceResponse\nDeleteDeviceUsageDataRequest\nDeleteDhcpOptionsRequest\nDeleteDimensionRequest\nDeleteDirectConnectGatewayAssociationProposalRequest\nDeleteDirectConnectGatewayAssociationProposalResult\nDeleteDirectConnectGatewayAssociationRequest\nDeleteDirectConnectGatewayAssociationResult\nDeleteDirectConnectGatewayRequest\nDeleteDirectConnectGatewayResult\nDeleteDirectory\nDeleteDirectoryConfigRequest\nDeleteDirectoryRegistrationRequest\nDeleteDirectoryRequest\nDeleteDirectoryResponse\nDeleteDirectoryResult\nDeleteDiscovererRequest\nDeleteDiskRequest\nDeleteDiskResult\nDeleteDiskSnapshotRequest\nDeleteDiskSnapshotResult\nDeleteDistributionConfigurationRequest\nDeleteDistributionConfigurationResponse\nDeleteDistributionRequest\nDeleteDistributionResult\nDeleteDocumentClassifierRequest\nDeleteDocumentRequest\nDeleteDocumentVersionRequest\nDeleteDocumentationPartRequest\nDeleteDocumentationVersionRequest\nDeleteDomainAssociationRequest\nDeleteDomainAssociationResult\nDeleteDomainConfigurationRequest\nDeleteDomainEntryRequest\nDeleteDomainEntryResult\nDeleteDomainNameRequest\nDeleteDomainPermissionsPolicyRequest\nDeleteDomainPermissionsPolicyResult\nDeleteDomainRequest\nDeleteDomainResponse\nDeleteDomainResult\nDeleteDynamicThingGroupRequest\nDeleteEarthObservationJobInput\nDeleteEdgeConfigurationInput\nDeleteEdgeDeploymentPlanRequest\nDeleteEdgeDeploymentStageRequest\nDeleteEgressOnlyInternetGatewayRequest\nDeleteEgressOnlyInternetGatewayResult\nDeleteElasticIp\nDeleteElasticsearchDomainRequest\nDeleteElasticsearchDomainResponse\nDeleteEmailChannelRequest\nDeleteEmailChannelResponse\nDeleteEmailIdentityPolicyRequest\nDeleteEmailIdentityRequest\nDeleteEmailMonitoringConfigurationRequest\nDeleteEmailTemplateRequest\nDeleteEmailTemplateResponse\nDeleteEndpointAccessMessage\nDeleteEndpointAccessRequest\nDeleteEndpointAccessResponse\nDeleteEndpointConfigInput\nDeleteEndpointGroupRequest\nDeleteEndpointInput\nDeleteEndpointMessage\nDeleteEndpointRequest\nDeleteEndpointResponse\nDeleteEntitlementRequest\nDeleteEntityRecognizerRequest\nDeleteEntityRequest\nDeleteEntityResponse\nDeleteEntityTypeRequest\nDeleteEnvironmentAccountConnectionInput\nDeleteEnvironmentAccountConnectionOutput\nDeleteEnvironmentConfigurationMessage\nDeleteEnvironmentInput\nDeleteEnvironmentMembershipRequest\nDeleteEnvironmentOutput\nDeleteEnvironmentRequest\nDeleteEnvironmentResponse\nDeleteEnvironmentTemplateInput\nDeleteEnvironmentTemplateOutput\nDeleteEnvironmentTemplateVersionInput\nDeleteEnvironmentTemplateVersionOutput\nDeleteEphemerisRequest\nDeleteEvaluationFormRequest\nDeleteEvaluationInput\nDeleteEvaluationOutput\nDeleteEvaluationResultsRequest\nDeleteEventActionRequest\nDeleteEventBusRequest\nDeleteEventDataStoreRequest\nDeleteEventDestinationRequest\nDeleteEventDestinationResult\nDeleteEventIntegrationRequest\nDeleteEventRequest\nDeleteEventSourceMappingRequest\nDeleteEventStreamRequest\nDeleteEventStreamResponse\nDeleteEventSubscriptionMessage\nDeleteEventSubscriptionResponse\nDeleteEventSubscriptionResult\nDeleteEventTrackerRequest\nDeleteEventTypeRequest\nDeleteEventsByEventTypeRequest\nDeleteEventsByEventTypeResult\nDeleteEventsConfigurationRequest\nDeleteExperienceRequest\nDeleteExperimentRequest\nDeleteExperimentResponse\nDeleteExperimentTemplateRequest\nDeleteExperimentTemplateResponse\nDeleteExplainabilityExportRequest\nDeleteExplainabilityRequest\nDeleteExportRequest\nDeleteExportResponse\nDeleteExpressionRequest\nDeleteExpressionResponse\nDeleteExtensionAssociationRequest\nDeleteExtensionRequest\nDeleteExternalModelRequest\nDeleteFHIRDatastoreRequest\nDeleteFHIRDatastoreResponse\nDeleteFacesRequest\nDeleteFacesResponse\nDeleteFacetRequest\nDeleteFaqRequest\nDeleteFargateProfileRequest\nDeleteFargateProfileResponse\nDeleteFeatureGroupRequest\nDeleteFeatureRequest\nDeleteFieldLevelEncryptionConfigRequest\nDeleteFieldLevelEncryptionProfileRequest\nDeleteFileCacheRequest\nDeleteFileCacheResponse\nDeleteFileEntry\nDeleteFileInput\nDeleteFileOutput\nDeleteFileShareInput\nDeleteFileShareOutput\nDeleteFileSystemLustreConfiguration\nDeleteFileSystemLustreResponse\nDeleteFileSystemOpenZFSConfiguration\nDeleteFileSystemOpenZFSResponse\nDeleteFileSystemPolicyRequest\nDeleteFileSystemRequest\nDeleteFileSystemResponse\nDeleteFileSystemWindowsConfiguration\nDeleteFileSystemWindowsResponse\nDeleteFilterRequest\nDeleteFilterResponse\nDeleteFindingAggregatorRequest\nDeleteFindingsFilterRequest\nDeleteFirewallDomainListRequest\nDeleteFirewallDomainListResponse\nDeleteFirewallManagerRuleGroupsRequest\nDeleteFirewallManagerRuleGroupsResponse\nDeleteFirewallPolicyRequest\nDeleteFirewallPolicyResponse\nDeleteFirewallRequest\nDeleteFirewallResponse\nDeleteFirewallRuleGroupRequest\nDeleteFirewallRuleGroupResponse\nDeleteFirewallRuleRequest\nDeleteFirewallRuleResponse\nDeleteFleetAdvisorDatabasesRequest\nDeleteFleetAdvisorDatabasesResponse\nDeleteFleetError\nDeleteFleetErrorItem\nDeleteFleetInput\nDeleteFleetLocationsInput\nDeleteFleetLocationsOutput\nDeleteFleetMetricRequest\nDeleteFleetRequest\nDeleteFleetResponse\nDeleteFleetSuccessItem\nDeleteFleetsRequest\nDeleteFleetsResult\nDeleteFlowDefinitionRequest\nDeleteFlowLogsRequest\nDeleteFlowLogsResult\nDeleteFlowRequest\nDeleteFlowResponse\nDeleteFlowTemplateRequest\nDeleteFlywheelRequest\nDeleteFolderContentsRequest\nDeleteFolderMembershipRequest\nDeleteFolderMembershipResponse\nDeleteFolderRequest\nDeleteFolderResponse\nDeleteForecastExportJobRequest\nDeleteForecastRequest\nDeleteFormRequest\nDeleteFpgaImageRequest\nDeleteFpgaImageResult\nDeleteFrameworkInput\nDeleteFraudsterRequest\nDeleteFunctionCodeSigningConfigRequest\nDeleteFunctionConcurrencyRequest\nDeleteFunctionDefinitionRequest\nDeleteFunctionEventInvokeConfigRequest\nDeleteFunctionRequest\nDeleteFunctionUrlConfigRequest\nDeleteFuotaTaskRequest\nDeleteGameRequest\nDeleteGameServerGroupInput\nDeleteGameServerGroupOutput\nDeleteGameSessionQueueInput\nDeleteGatewayGroupRequest\nDeleteGatewayInput\nDeleteGatewayOutput\nDeleteGatewayRequest\nDeleteGatewayResponse\nDeleteGatewayResponseRequest\nDeleteGatewayRouteInput\nDeleteGatewayRouteOutput\nDeleteGcmChannelRequest\nDeleteGcmChannelResponse\nDeleteGeoMatchSetRequest\nDeleteGeoMatchSetResponse\nDeleteGeofenceCollectionRequest\nDeleteGitHubAccountTokenInput\nDeleteGitHubAccountTokenOutput\nDeleteGlobalClusterMessage\nDeleteGlobalClusterResult\nDeleteGlobalNetworkRequest\nDeleteGlobalNetworkResponse\nDeleteGlobalReplicationGroupMessage\nDeleteGlobalReplicationGroupResult\nDeleteGlobalSecondaryIndexAction\nDeleteGrantRequest\nDeleteGrantResponse\nDeleteGraphRequest\nDeleteGraphqlApiRequest\nDeleteGroupInput\nDeleteGroupMembershipRequest\nDeleteGroupMembershipResponse\nDeleteGroupOutput\nDeleteGroupPolicyRequest\nDeleteGroupRequest\nDeleteGroupResponse\nDeleteHITRequest\nDeleteHapgRequest\nDeleteHapgResponse\nDeleteHealthCheckRequest\nDeleteHostInput\nDeleteHostKeyRequest\nDeleteHostedConfigurationVersionRequest\nDeleteHostedZoneRequest\nDeleteHostedZoneResponse\nDeleteHoursOfOperationRequest\nDeleteHsmClientCertificateMessage\nDeleteHsmConfigurationMessage\nDeleteHsmRequest\nDeleteHsmResponse\nDeleteHubContentRequest\nDeleteHubRequest\nDeleteHumanLoopRequest\nDeleteHumanTaskUiRequest\nDeleteHypervisorInput\nDeleteHypervisorOutput\nDeleteIAMPolicyAssignmentRequest\nDeleteIAMPolicyAssignmentResponse\nDeleteIPSetRequest\nDeleteIPSetResponse\nDeleteIdentitiesInput\nDeleteIdentitiesResponse\nDeleteIdentityPolicyRequest\nDeleteIdentityPoolInput\nDeleteIdentityProviderRequest\nDeleteIdentityRequest\nDeleteIdentitySourceInput\nDeleteImageBuilderRequest\nDeleteImageBuilderResult\nDeleteImagePermissionsRequest\nDeleteImagePipelineRequest\nDeleteImagePipelineResponse\nDeleteImageRecipeRequest\nDeleteImageRecipeResponse\nDeleteImageRequest\nDeleteImageResponse\nDeleteImageResult\nDeleteImageSetRequest\nDeleteImageSetResponse\nDeleteImageVersionRequest\nDeleteImpersonationRoleRequest\nDeleteImportRequest\nDeleteImportResponse\nDeleteImportedKeyMaterialRequest\nDeleteInAppTemplateRequest\nDeleteInAppTemplateResponse\nDeleteInboundConnectionRequest\nDeleteInboundConnectionResponse\nDeleteInboundCrossClusterSearchConnectionRequest\nDeleteInboundCrossClusterSearchConnectionResponse\nDeleteIncidentRecordInput\nDeleteIndexFieldRequest\nDeleteIndexFieldResponse\nDeleteIndexInput\nDeleteIndexOutput\nDeleteIndexRequest\nDeleteInferenceExperimentRequest\nDeleteInferenceExperimentResponse\nDeleteInferenceSchedulerRequest\nDeleteInfrastructureConfigurationRequest\nDeleteInfrastructureConfigurationResponse\nDeleteIngestionDestinationRequest\nDeleteIngestionRequest\nDeleteInlinePolicyFromPermissionSetRequest\nDeleteInputRequest\nDeleteInputSecurityGroupRequest\nDeleteInsightRequest\nDeleteInsightResponse\nDeleteInsightRulesInput\nDeleteInsightRulesOutput\nDeleteInstanceAccessControlAttributeConfigurationRequest\nDeleteInstanceConnectEndpointRequest\nDeleteInstanceConnectEndpointResult\nDeleteInstanceEventWindowRequest\nDeleteInstanceEventWindowResult\nDeleteInstanceOnboardingJobRequest\nDeleteInstanceProfileMessage\nDeleteInstanceProfileRequest\nDeleteInstanceProfileResponse\nDeleteInstanceRequest\nDeleteInstanceResult\nDeleteInstanceSnapshotRequest\nDeleteInstanceSnapshotResult\nDeleteIntegrationAssociationRequest\nDeleteIntegrationRequest\nDeleteIntegrationResponse\nDeleteIntegrationResponseRequest\nDeleteIntentRequest\nDeleteIntentVersionRequest\nDeleteInterconnectRequest\nDeleteInterconnectResponse\nDeleteIntermediateSnaphots\nDeleteInternetGatewayRequest\nDeleteInventoryRequest\nDeleteInventoryResult\nDeleteInvitationsRequest\nDeleteInvitationsResponse\nDeleteIpAccessSettingsRequest\nDeleteIpGroupRequest\nDeleteIpamPoolRequest\nDeleteIpamPoolResult\nDeleteIpamRequest\nDeleteIpamResourceDiscoveryRequest\nDeleteIpamResourceDiscoveryResult\nDeleteIpamResult\nDeleteIpamScopeRequest\nDeleteIpamScopeResult\nDeleteItemInput\nDeleteItemOutput\nDeleteJobExecutionRequest\nDeleteJobQueueRequest\nDeleteJobRequest\nDeleteJobResponse\nDeleteJobResult\nDeleteJobTaggingRequest\nDeleteJobTemplateRequest\nDeleteJobTemplateResponse\nDeleteJourneyRequest\nDeleteJourneyResponse\nDeleteKeyGroupRequest\nDeleteKeyInDays\nDeleteKeyInput\nDeleteKeyOutput\nDeleteKeyPairRequest\nDeleteKeyPairResult\nDeleteKeyRequest\nDeleteKeySigningKeyRequest\nDeleteKeySigningKeyResponse\nDeleteKeyspaceRequest\nDeleteKeywordRequest\nDeleteKeywordResult\nDeleteKnowledgeBaseRequest\nDeleteKnownHostKeysRequest\nDeleteKnownHostKeysResult\nDeleteKxClusterRequest\nDeleteKxDatabaseRequest\nDeleteKxEnvironmentRequest\nDeleteKxUserRequest\nDeleteLFTagRequest\nDeleteLabelGroupRequest\nDeleteLabelRequest\nDeleteLabelsRequest\nDeleteLagRequest\nDeleteLakeFormationOptInRequest\nDeleteLambda\nDeleteLanguageModelRequest\nDeleteLaunchActionRequest\nDeleteLaunchConfigurationTemplateRequest\nDeleteLaunchProfileMemberRequest\nDeleteLaunchProfileRequest\nDeleteLaunchProfileResponse\nDeleteLaunchRequest\nDeleteLaunchTemplateRequest\nDeleteLaunchTemplateResult\nDeleteLaunchTemplateVersionsRequest\nDeleteLaunchTemplateVersionsResponseErrorItem\nDeleteLaunchTemplateVersionsResponseSuccessItem\nDeleteLaunchTemplateVersionsResult\nDeleteLayerRequest\nDeleteLayerVersionRequest\nDeleteLedgerRequest\nDeleteLensInput\nDeleteLensShareInput\nDeleteLexiconInput\nDeleteLicenseConfigurationRequest\nDeleteLicenseManagerReportGeneratorRequest\nDeleteLicenseRequest\nDeleteLicenseResponse\nDeleteLifecycleHookType\nDeleteLifecyclePolicyInput\nDeleteLifecyclePolicyRequest\nDeleteLifecyclePolicyResponse\nDeleteLinkInput\nDeleteLinkRequest\nDeleteLinkResponse\nDeleteListRequest\nDeleteListenerInput\nDeleteListenerRequest\nDeleteLiveSourceRequest\nDeleteLoadBalancerInput\nDeleteLoadBalancerListenerInput\nDeleteLoadBalancerPolicyInput\nDeleteLoadBalancerRequest\nDeleteLoadBalancerResult\nDeleteLoadBalancerTlsCertificateRequest\nDeleteLoadBalancerTlsCertificateResult\nDeleteLocalGatewayRouteRequest\nDeleteLocalGatewayRouteResult\nDeleteLocalGatewayRouteTableRequest\nDeleteLocalGatewayRouteTableResult\nDeleteLocalGatewayRouteTableVirtualInterfaceGroupAssociationRequest\nDeleteLocalGatewayRouteTableVirtualInterfaceGroupAssociationResult\nDeleteLocalGatewayRouteTableVpcAssociationRequest\nDeleteLocalGatewayRouteTableVpcAssociationResult\nDeleteLocationInput\nDeleteLocationRequest\nDeleteLogGroupRequest\nDeleteLogPatternRequest\nDeleteLogStreamRequest\nDeleteLogSubscriptionRequest\nDeleteLoggerDefinitionRequest\nDeleteLoggingConfigurationRequest\nDeleteLoginProfileRequest\nDeleteLunaClientRequest\nDeleteLunaClientResponse\nDeleteMLEndpointInput\nDeleteMLEndpointOutput\nDeleteMLModelInput\nDeleteMLModelOutput\nDeleteMLTransformRequest\nDeleteMLTransformResponse\nDeleteMailboxPermissionsRequest\nDeleteMaintenanceWindowRequest\nDeleteMaintenanceWindowResult\nDeleteManagedEndpointRequest\nDeleteManagedEndpointResponse\nDeleteManagedPrefixListRequest\nDeleteManagedPrefixListResult\nDeleteMapRequest\nDeleteMarker\nDeleteMarkerEntry\nDeleteMarkerReplication\nDeleteMarkerVersionId\nDeleteMarkers\nDeleteMatchingWorkflowInput\nDeleteMatchingWorkflowOutput\nDeleteMatchmakingConfigurationInput\nDeleteMatchmakingRuleSetInput\nDeleteMediaCapturePipelineRequest\nDeleteMediaInsightsPipelineConfigurationRequest\nDeleteMediaPipelineKinesisVideoStreamPoolRequest\nDeleteMediaPipelineRequest\nDeleteMedicalTranscriptionJobRequest\nDeleteMedicalVocabularyRequest\nDeleteMeetingRequest\nDeleteMemberInput\nDeleteMemberRequest\nDeleteMembersRequest\nDeleteMembersResponse\nDeleteMembershipInput\nDeleteMeshInput\nDeleteMeshOutput\nDeleteMessageBatchRequest\nDeleteMessageBatchRequestEntry\nDeleteMessageBatchResult\nDeleteMessageBatchResultEntry\nDeleteMessageRequest\nDeleteMessageResponse\nDeleteMessagingStreamingConfigurationsRequest\nDeleteMethodRequest\nDeleteMethodResponseRequest\nDeleteMetricAttributionRequest\nDeleteMetricFilterRequest\nDeleteMetricPolicyInput\nDeleteMetricStreamInput\nDeleteMigrationProjectMessage\nDeleteMigrationProjectResponse\nDeleteMigrationWorkflowRequest\nDeleteMigrationWorkflowResponse\nDeleteMissionProfileRequest\nDeleteMitigationActionRequest\nDeleteMobileDeviceAccessOverrideRequest\nDeleteMobileDeviceAccessRuleRequest\nDeleteModelBiasJobDefinitionRequest\nDeleteModelCardRequest\nDeleteModelExplainabilityJobDefinitionRequest\nDeleteModelInput\nDeleteModelManifestRequest\nDeleteModelManifestResponse\nDeleteModelPackageGroupInput\nDeleteModelPackageGroupPolicyInput\nDeleteModelPackageInput\nDeleteModelQualityJobDefinitionRequest\nDeleteModelRequest\nDeleteModelResponse\nDeleteModelVersionRequest\nDeleteMonitorInput\nDeleteMonitorRequest\nDeleteMonitoringScheduleRequest\nDeleteMonitoringSubscriptionRequest\nDeleteMountTargetRequest\nDeleteMultiRegionAccessPointInput\nDeleteMultiRegionAccessPointRequest\nDeleteMultiRegionAccessPointResult\nDeleteMulticastGroupRequest\nDeleteMultiplexProgramRequest\nDeleteMultiplexProgramResponse\nDeleteMultiplexRequest\nDeleteMultiplexResponse\nDeleteNamedQueryInput\nDeleteNamespaceRequest\nDeleteNamespaceResponse\nDeleteNatGatewayRequest\nDeleteNatGatewayResult\nDeleteNetworkAclEntryRequest\nDeleteNetworkAclRequest\nDeleteNetworkAnalyzerConfigurationRequest\nDeleteNetworkInsightsAccessScopeAnalysisRequest\nDeleteNetworkInsightsAccessScopeAnalysisResult\nDeleteNetworkInsightsAccessScopeRequest\nDeleteNetworkInsightsAccessScopeResult\nDeleteNetworkInsightsAnalysisRequest\nDeleteNetworkInsightsAnalysisResult\nDeleteNetworkInsightsPathRequest\nDeleteNetworkInsightsPathResult\nDeleteNetworkInterfacePermissionRequest\nDeleteNetworkInterfacePermissionResult\nDeleteNetworkInterfaceRequest\nDeleteNetworkProfileRequest\nDeleteNetworkRequest\nDeleteNetworkResponse\nDeleteNetworkSettingsRequest\nDeleteNetworkSiteRequest\nDeleteNetworkSiteResponse\nDeleteNodeInput\nDeleteNodegroupRequest\nDeleteNodegroupResponse\nDeleteNotebookInput\nDeleteNotebookInstanceInput\nDeleteNotebookInstanceLifecycleConfigInput\nDeleteNotificationConfigurationType\nDeleteNotificationRequest\nDeleteNotificationRuleRequest\nDeleteNotificationRuleResult\nDeleteNotificationSubscriptionRequest\nDeleteOTAUpdateRequest\nDeleteObject\nDeleteObjectInput\nDeleteObjectOutput\nDeleteObjectRequest\nDeleteObjectTaggingOutput\nDeleteObjectTaggingRequest\nDeleteObjectsOnCancelRequest\nDeleteObjectsOutput\nDeleteObjectsRequest\nDeleteObservabilityConfigurationRequest\nDeleteObservabilityConfigurationResponse\nDeleteOnTermination\nDeleteOpenIDConnectProviderRequest\nDeleteOpsMetadataRequest\nDeleteOptOutListRequest\nDeleteOptOutListResult\nDeleteOptedOutNumberRequest\nDeleteOptedOutNumberResult\nDeleteOption\nDeleteOptionGroupMessage\nDeleteOrganizationConfigRuleRequest\nDeleteOrganizationConformancePackRequest\nDeleteOrganizationRequest\nDeleteOrganizationResponse\nDeleteOrganizationalUnitRequest\nDeleteOriginAccessControlRequest\nDeleteOriginEndpointPolicyRequest\nDeleteOriginEndpointRequest\nDeleteOriginRequestPolicyRequest\nDeleteOutboundConnectionRequest\nDeleteOutboundConnectionResponse\nDeleteOutboundCrossClusterSearchConnectionRequest\nDeleteOutboundCrossClusterSearchConnectionResponse\nDeleteOutcomeRequest\nDeleteOutpostInput\nDeleteOutpostResolverRequest\nDeleteOutpostResolverResponse\nDeletePackageRequest\nDeletePackageResponse\nDeletePackageResult\nDeletePackageVersionRequest\nDeletePackageVersionsRequest\nDeletePackageVersionsResult\nDeletePackagingConfigurationRequest\nDeletePackagingGroupRequest\nDeleteParallelDataRequest\nDeleteParallelDataResponse\nDeleteParameterGroupRequest\nDeleteParameterGroupResponse\nDeleteParameterRequest\nDeleteParametersRequest\nDeleteParametersResult\nDeletePartitionIndexRequest\nDeletePartitionRequest\nDeletePartnerEventSourceRequest\nDeletePatchBaselineRequest\nDeletePatchBaselineResult\nDeletePeeringRequest\nDeletePeeringResponse\nDeletePendingAggregationRequestRequest\nDeletePendingTimestamp\nDeletePerformanceAnalysisReportRequest\nDeletePermissionGroupRequest\nDeletePermissionGroupResponse\nDeletePermissionPolicyRequest\nDeletePermissionRequest\nDeletePermissionResponse\nDeletePermissionSetRequest\nDeletePermissionVersionRequest\nDeletePermissionVersionResponse\nDeletePermissionsBoundaryFromPermissionSetRequest\nDeletePhoneNumberRequest\nDeletePipeRequest\nDeletePipeResponse\nDeletePipelineInput\nDeletePipelineRequest\nDeletePipelineResponse\nDeletePlaceIndexRequest\nDeletePlacementGroupRequest\nDeletePlacementRequest\nDeletePlatformApplicationInput\nDeletePlatformVersionRequest\nDeletePlatformVersionResult\nDeletePlaybackConfigurationRequest\nDeletePlaybackKeyPairRequest\nDeletePolicyInput\nDeletePolicyRequest\nDeletePolicyStoreInput\nDeletePolicyTemplateInput\nDeletePolicyType\nDeletePolicyVersionRequest\nDeletePoolRequest\nDeletePoolResult\nDeletePortalRequest\nDeletePortalResponse\nDeletePortfolioInput\nDeletePortfolioShareInput\nDeletePortfolioShareOutput\nDeletePredictorBacktestExportJobRequest\nDeletePredictorRequest\nDeletePrefetchScheduleRequest\nDeletePreparedStatementInput\nDeletePresetRequest\nDeletePricingPlanInput\nDeletePricingPlanOutput\nDeletePricingRuleInput\nDeletePricingRuleOutput\nDeletePrincipalMappingRequest\nDeletePriorVersions\nDeleteProductInput\nDeleteProfileInput\nDeleteProfileKeyRequest\nDeleteProfileKeyResponse\nDeleteProfileObjectRequest\nDeleteProfileObjectResponse\nDeleteProfileObjectTypeRequest\nDeleteProfileObjectTypeResponse\nDeleteProfileRequest\nDeleteProfileResponse\nDeleteProfileShareInput\nDeleteProfilingGroupRequest\nDeleteProgramRequest\nDeleteProgressUpdateStreamRequest\nDeleteProjectInput\nDeleteProjectPolicyRequest\nDeleteProjectRequest\nDeleteProjectResponse\nDeleteProjectResult\nDeleteProjectVersionRequest\nDeleteProjectVersionResponse\nDeletePromptRequest\nDeleteProperties\nDeletePropertygraphStatisticsOutput\nDeleteProtection\nDeleteProtectionGroupRequest\nDeleteProtectionRequest\nDeleteProtocolsListRequest\nDeleteProvisionedConcurrencyConfigRequest\nDeleteProvisionedModelThroughputRequest\nDeleteProvisionedProductPlanInput\nDeleteProvisioningArtifactInput\nDeleteProvisioningTemplateRequest\nDeleteProvisioningTemplateVersionRequest\nDeleteProxySessionRequest\nDeletePublicAccessBlockRequest\nDeletePublicIpv4PoolRequest\nDeletePublicIpv4PoolResult\nDeletePublicKeyRequest\nDeletePublicKeys\nDeletePublishingDestinationRequest\nDeletePullRequestApprovalRuleInput\nDeletePullRequestApprovalRuleOutput\nDeletePullThroughCacheRuleRequest\nDeletePullThroughCacheRuleResponse\nDeletePushTemplateRequest\nDeletePushTemplateResponse\nDeleteQualificationTypeRequest\nDeleteQueryDefinitionRequest\nDeleteQueryDefinitionResponse\nDeleteQueryLoggingConfigRequest\nDeleteQuerySuggestionsBlockListRequest\nDeleteQueueRequest\nDeleteQueuedMessagesRequest\nDeleteQueuedReservedInstancesError\nDeleteQueuedReservedInstancesRequest\nDeleteQueuedReservedInstancesResult\nDeleteQueuedSavingsPlanRequest\nDeleteQuickConnectRequest\nDeleteRate\nDeleteRateBasedRuleRequest\nDeleteRateBasedRuleResponse\nDeleteReadinessCheckRequest\nDeleteRealtimeEndpointInput\nDeleteRealtimeEndpointOutput\nDeleteRealtimeLogConfigRequest\nDeleteReceiptFilterRequest\nDeleteReceiptRuleRequest\nDeleteReceiptRuleSetRequest\nDeleteRecipeVersionRequest\nDeleteRecipeVersionResponse\nDeleteRecommendationPreferencesRequest\nDeleteRecommendationTemplateRequest\nDeleteRecommendationTemplateResponse\nDeleteRecommenderConfigurationRequest\nDeleteRecommenderConfigurationResponse\nDeleteRecommenderRequest\nDeleteRecordRequest\nDeleteRecordingConfigurationRequest\nDeleteRecoveryGroupRequest\nDeleteRecoveryInstanceRequest\nDeleteRecoveryPointInput\nDeleteReferenceRequest\nDeleteReferenceStoreRequest\nDeleteRefreshScheduleRequest\nDeleteRefreshScheduleResponse\nDeleteRegexMatchSetRequest\nDeleteRegexMatchSetResponse\nDeleteRegexPatternSetRequest\nDeleteRegexPatternSetResponse\nDeleteRegionAction\nDeleteRegistryInput\nDeleteRegistryPolicyResponse\nDeleteRegistryRequest\nDeleteRegistryResponse\nDeleteRelationalDatabaseRequest\nDeleteRelationalDatabaseResult\nDeleteRelationalDatabaseSnapshotRequest\nDeleteRelationalDatabaseSnapshotResult\nDeleteRemediationConfigurationRequest\nDeleteRemediationExceptionsRequest\nDeleteRemediationExceptionsResponse\nDeleteRemoteAccessSessionRequest\nDeleteReplacedRootVolume\nDeleteReplicaAction\nDeleteReplicationConfigMessage\nDeleteReplicationConfigResponse\nDeleteReplicationConfigurationRequest\nDeleteReplicationConfigurationTemplateRequest\nDeleteReplicationGroupMemberAction\nDeleteReplicationGroupMessage\nDeleteReplicationGroupResult\nDeleteReplicationInstanceMessage\nDeleteReplicationInstanceResponse\nDeleteReplicationJobRequest\nDeleteReplicationSetInput\nDeleteReplicationSubnetGroupMessage\nDeleteReplicationTaskAssessmentRunMessage\nDeleteReplicationTaskAssessmentRunResponse\nDeleteReplicationTaskMessage\nDeleteReplicationTaskResponse\nDeleteReportDefinitionRequest\nDeleteReportDefinitionResponse\nDeleteReportDefinitionResult\nDeleteReportGroupInput\nDeleteReportInput\nDeleteReportPlanInput\nDeleteRepositoryInput\nDeleteRepositoryOutput\nDeleteRepositoryPermissionsPolicyRequest\nDeleteRepositoryPermissionsPolicyResult\nDeleteRepositoryPolicyRequest\nDeleteRepositoryPolicyResponse\nDeleteRepositoryRequest\nDeleteRepositoryResponse\nDeleteRepositoryResult\nDeleteRequest\nDeleteRequestValidatorRequest\nDeleteRescoreExecutionPlanRequest\nDeleteReservationRequest\nDeleteReservationResponse\nDeleteResiliencyPolicyRequest\nDeleteResiliencyPolicyResponse\nDeleteResolverEndpointRequest\nDeleteResolverEndpointResponse\nDeleteResolverQueryLogConfigRequest\nDeleteResolverQueryLogConfigResponse\nDeleteResolverRequest\nDeleteResolverRuleRequest\nDeleteResolverRuleResponse\nDeleteResource\nDeleteResourceConfigRequest\nDeleteResourceDataSyncRequest\nDeleteResourceDefinitionRequest\nDeleteResourceInput\nDeleteResourceOutput\nDeleteResourcePermissionInput\nDeleteResourcePermissionOutput\nDeleteResourcePolicyInput\nDeleteResourcePolicyRequest\nDeleteResourcePolicyResponse\nDeleteResourcePolicyStatementRequest\nDeleteResourcePolicyStatementResponse\nDeleteResourceRequest\nDeleteResourceServerRequest\nDeleteResourceSetRequest\nDeleteResourceShareRequest\nDeleteResourceShareResponse\nDeleteResourceTreeRequest\nDeleteResourcesByExternalIdInput\nDeleteResponseHeadersPolicyRequest\nDeleteResponsePlanInput\nDeleteRestApiRequest\nDeleteRetentionConfigurationRequest\nDeleteRetentionPolicyRequest\nDeleteRetrainingSchedulerRequest\nDeleteReusableDelegationSetRequest\nDeleteRevisionRequest\nDeleteRobotApplicationRequest\nDeleteRobotRequest\nDeleteRoleAliasRequest\nDeleteRolePermissionsBoundaryRequest\nDeleteRolePolicyRequest\nDeleteRoleRequest\nDeleteRoomMembershipRequest\nDeleteRoomRequest\nDeleteRoomSkillParameterRequest\nDeleteRotationOverrideRequest\nDeleteRotationRequest\nDeleteRouteCalculatorRequest\nDeleteRouteInput\nDeleteRouteOutput\nDeleteRouteRequest\nDeleteRouteRequestParameterRequest\nDeleteRouteResponse\nDeleteRouteResponseRequest\nDeleteRouteSettingsRequest\nDeleteRouteTableRequest\nDeleteRoutingControlRequest\nDeleteRoutingProfileRequest\nDeleteRuleGroupRequest\nDeleteRuleGroupResponse\nDeleteRuleGroupsNamespaceRequest\nDeleteRuleInput\nDeleteRuleRequest\nDeleteRuleResponse\nDeleteRulesetRequest\nDeleteRulesetResponse\nDeleteRumMetricsDestinationRequest\nDeleteRunGroupRequest\nDeleteRunRequest\nDeleteSAMLProviderRequest\nDeleteSMSSandboxPhoneNumberInput\nDeleteSSHPublicKeyRequest\nDeleteSafetyRuleRequest\nDeleteSamplingRuleRequest\nDeleteSamplingRuleResult\nDeleteScalingPlanRequest\nDeleteScalingPolicyInput\nDeleteScalingPolicyRequest\nDeleteSceneRequest\nDeleteScheduleGroupInput\nDeleteScheduleInput\nDeleteScheduleRequest\nDeleteScheduleResponse\nDeleteScheduledActionMessage\nDeleteScheduledActionRequest\nDeleteScheduledActionType\nDeleteScheduledAuditRequest\nDeleteScheduledQueryRequest\nDeleteSchedulingPolicyRequest\nDeleteSchemaInput\nDeleteSchemaMappingInput\nDeleteSchemaMappingOutput\nDeleteSchemaRequest\nDeleteSchemaResponse\nDeleteSchemaVersionRequest\nDeleteSchemaVersionsInput\nDeleteSchemaVersionsResponse\nDeleteScriptInput\nDeleteSecretRequest\nDeleteSecretResponse\nDeleteSecurityConfigRequest\nDeleteSecurityConfigurationInput\nDeleteSecurityConfigurationRequest\nDeleteSecurityGroupRequest\nDeleteSecurityPolicyRequest\nDeleteSecurityProfileRequest\nDeleteSegmentRequest\nDeleteSegmentResponse\nDeleteSequenceStoreRequest\nDeleteServerCertificateRequest\nDeleteServerRequest\nDeleteServiceActionInput\nDeleteServiceInput\nDeleteServiceLinkedRoleRequest\nDeleteServiceLinkedRoleResponse\nDeleteServiceNetworkRequest\nDeleteServiceNetworkServiceAssociationRequest\nDeleteServiceNetworkServiceAssociationResponse\nDeleteServiceNetworkVpcAssociationRequest\nDeleteServiceNetworkVpcAssociationResponse\nDeleteServiceOutput\nDeleteServicePrincipalNameRequest\nDeleteServiceProfileRequest\nDeleteServiceQuotaIncreaseRequestFromTemplateRequest\nDeleteServiceRequest\nDeleteServiceResponse\nDeleteServiceSpecificCredentialRequest\nDeleteServiceSyncConfigInput\nDeleteServiceSyncConfigOutput\nDeleteServiceTemplateInput\nDeleteServiceTemplateOutput\nDeleteServiceTemplateVersionInput\nDeleteServiceTemplateVersionOutput\nDeleteSessionRequest\nDeleteSessionResponse\nDeleteShareRequest\nDeleteShareResponse\nDeleteSignalCatalogRequest\nDeleteSignalCatalogResponse\nDeleteSignalingChannelInput\nDeleteSigningCertificateRequest\nDeleteSimulationApplicationRequest\nDeleteSimulationInput\nDeleteSinkInput\nDeleteSipMediaApplicationRequest\nDeleteSipRuleRequest\nDeleteSiteInput\nDeleteSiteRequest\nDeleteSiteResponse\nDeleteSizeConstraintSetRequest\nDeleteSizeConstraintSetResponse\nDeleteSkillAuthorizationRequest\nDeleteSkillGroupRequest\nDeleteSlackChannelConfigurationRequest\nDeleteSlackWorkspaceConfigurationRequest\nDeleteSlotRequest\nDeleteSlotTypeRequest\nDeleteSlotTypeVersionRequest\nDeleteSmsChannelRequest\nDeleteSmsChannelResponse\nDeleteSmsTemplateRequest\nDeleteSmsTemplateResponse\nDeleteSnapshotCopyGrantMessage\nDeleteSnapshotMessage\nDeleteSnapshotRequest\nDeleteSnapshotResponse\nDeleteSnapshotResult\nDeleteSnapshotScheduleInput\nDeleteSnapshotScheduleMessage\nDeleteSnapshotScheduleOutput\nDeleteSolFunctionPackageInput\nDeleteSolNetworkInstanceInput\nDeleteSolNetworkPackageInput\nDeleteSolutionRequest\nDeleteSourceBundle\nDeleteSourceCredentialsInput\nDeleteSourceCredentialsOutput\nDeleteSourceFromS3\nDeleteSourceLocationRequest\nDeleteSourceNetworkRequest\nDeleteSourceRepositoryRequest\nDeleteSourceRepositoryResponse\nDeleteSourceServerRequest\nDeleteSpaceRequest\nDeleteSpaceResponse\nDeleteSparqlStatisticsOutput\nDeleteSpeakerRequest\nDeleteSpotDatafeedSubscriptionRequest\nDeleteSqlInjectionMatchSetRequest\nDeleteSqlInjectionMatchSetResponse\nDeleteSshPublicKeyRequest\nDeleteStackInput\nDeleteStackInstancesInput\nDeleteStackInstancesOutput\nDeleteStackRequest\nDeleteStackSetInput\nDeleteStageRequest\nDeleteStateMachineAliasInput\nDeleteStateMachineInput\nDeleteStateMachineVersionInput\nDeleteStatisticsValueMap\nDeleteStepDetails\nDeleteStorageConnectors\nDeleteStorageLensConfigurationRequest\nDeleteStorageLensConfigurationTaggingRequest\nDeleteStorageVirtualMachineRequest\nDeleteStorageVirtualMachineResponse\nDeleteStoredQueryRequest\nDeleteStreamInput\nDeleteStreamKeyRequest\nDeleteStreamProcessorRequest\nDeleteStreamRequest\nDeleteStreamingDistributionRequest\nDeleteStreamingImageRequest\nDeleteStreamingImageResponse\nDeleteStreamingSessionRequest\nDeleteStreamingSessionResponse\nDeleteStudioComponentRequest\nDeleteStudioComponentResponse\nDeleteStudioInput\nDeleteStudioLifecycleConfigRequest\nDeleteStudioMemberRequest\nDeleteStudioRequest\nDeleteStudioResponse\nDeleteStudioSessionMappingInput\nDeleteSubnetCidrReservationRequest\nDeleteSubnetCidrReservationResult\nDeleteSubnetGroupRequest\nDeleteSubnetGroupResponse\nDeleteSubnetRequest\nDeleteSubscriberNotificationRequest\nDeleteSubscriberRequest\nDeleteSubscriptionDefinitionRequest\nDeleteSubscriptionFilterRequest\nDeleteSuggesterRequest\nDeleteSuggesterResponse\nDeleteSuiteDefinitionRequest\nDeleteSuppressedDestinationRequest\nDeleteSyncJobRequest\nDeleteSyncJobResponse\nDeleteSystemInstanceRequest\nDeleteSystemTemplateRequest\nDeleteTLSInspectionConfigurationRequest\nDeleteTLSInspectionConfigurationResponse\nDeleteTableInput\nDeleteTableOutput\nDeleteTableRequest\nDeleteTableVersionRequest\nDeleteTagOptionInput\nDeleteTagsForDomainRequest\nDeleteTagsInput\nDeleteTagsMessage\nDeleteTagsOutput\nDeleteTagsRequest\nDeleteTagsType\nDeleteTapeArchiveInput\nDeleteTapeArchiveOutput\nDeleteTapeInput\nDeleteTapeOutput\nDeleteTapePoolInput\nDeleteTapePoolOutput\nDeleteTarget\nDeleteTargetGroupInput\nDeleteTargetGroupRequest\nDeleteTargetGroupResponse\nDeleteTargetRequest\nDeleteTaskDefinitionsRequest\nDeleteTaskDefinitionsResponse\nDeleteTaskRequest\nDeleteTaskSetRequest\nDeleteTaskSetResponse\nDeleteTaskTemplateRequest\nDeleteTemplateAliasRequest\nDeleteTemplateAliasResponse\nDeleteTemplateGroupAccessControlEntryRequest\nDeleteTemplateRequest\nDeleteTemplateResponse\nDeleteTemplateSyncConfigInput\nDeleteTemplateSyncConfigOutput\nDeleteTerminologyRequest\nDeleteTestGridProjectRequest\nDeleteTestSetRequest\nDeleteTextMessageSpendLimitOverrideResult\nDeleteThemeAliasRequest\nDeleteThemeAliasResponse\nDeleteThemeRequest\nDeleteThemeResponse\nDeleteThesaurusRequest\nDeleteThingGroupRequest\nDeleteThingRequest\nDeleteThingShadowRequest\nDeleteThingShadowResponse\nDeleteThingTypeRequest\nDeleteThreatIntelSetRequest\nDeleteTime\nDeleteTimeSeriesRequest\nDeleteTimelineEventInput\nDeleteTimestamp\nDeleteTokenRequest\nDeleteTokenResponse\nDeleteTopicInput\nDeleteTopicRefreshScheduleRequest\nDeleteTopicRefreshScheduleResponse\nDeleteTopicRequest\nDeleteTopicResponse\nDeleteTopicRuleDestinationRequest\nDeleteTopicRuleRequest\nDeleteTrackerRequest\nDeleteTrafficDistributionGroupRequest\nDeleteTrafficMirrorFilterRequest\nDeleteTrafficMirrorFilterResult\nDeleteTrafficMirrorFilterRuleRequest\nDeleteTrafficMirrorFilterRuleResult\nDeleteTrafficMirrorSessionRequest\nDeleteTrafficMirrorSessionResult\nDeleteTrafficMirrorTargetRequest\nDeleteTrafficMirrorTargetResult\nDeleteTrafficPolicyInstanceRequest\nDeleteTrafficPolicyRequest\nDeleteTrailRequest\nDeleteTranscriptionJobRequest\nDeleteTransitGatewayConnectPeerRequest\nDeleteTransitGatewayConnectPeerResult\nDeleteTransitGatewayConnectRequest\nDeleteTransitGatewayConnectResult\nDeleteTransitGatewayMulticastDomainRequest\nDeleteTransitGatewayMulticastDomainResult\nDeleteTransitGatewayPeeringAttachmentRequest\nDeleteTransitGatewayPeeringAttachmentResult\nDeleteTransitGatewayPolicyTableRequest\nDeleteTransitGatewayPolicyTableResult\nDeleteTransitGatewayPrefixListReferenceRequest\nDeleteTransitGatewayPrefixListReferenceResult\nDeleteTransitGatewayRequest\nDeleteTransitGatewayResult\nDeleteTransitGatewayRouteRequest\nDeleteTransitGatewayRouteResult\nDeleteTransitGatewayRouteTableAnnouncementRequest\nDeleteTransitGatewayRouteTableAnnouncementResult\nDeleteTransitGatewayRouteTableRequest\nDeleteTransitGatewayRouteTableResult\nDeleteTransitGatewayVpcAttachmentRequest\nDeleteTransitGatewayVpcAttachmentResult\nDeleteTrialComponentRequest\nDeleteTrialComponentResponse\nDeleteTrialRequest\nDeleteTrialResponse\nDeleteTriggerRequest\nDeleteTriggerResponse\nDeleteTrustRequest\nDeleteTrustResult\nDeleteTrustStoreRequest\nDeleteTypeRequest\nDeleteTypedLinkFacetRequest\nDeleteUnusedFMManagedResources\nDeleteUploadRequest\nDeleteUsageLimitMessage\nDeleteUsageLimitRequest\nDeleteUsageLimitResponse\nDeleteUsagePlanKeyRequest\nDeleteUsagePlanRequest\nDeleteUseCaseRequest\nDeleteUserAccessLoggingSettingsRequest\nDeleteUserAttributesRequest\nDeleteUserByPrincipalIdRequest\nDeleteUserByPrincipalIdResponse\nDeleteUserDefinedFunctionRequest\nDeleteUserEndpointsRequest\nDeleteUserEndpointsResponse\nDeleteUserGroupMessage\nDeleteUserHierarchyGroupRequest\nDeleteUserMessage\nDeleteUserPermissionsBoundaryRequest\nDeleteUserPolicyRequest\nDeleteUserPoolClientRequest\nDeleteUserPoolDomainRequest\nDeleteUserPoolRequest\nDeleteUserProfileRequest\nDeleteUserProfileResult\nDeleteUserRequest\nDeleteUserResponse\nDeleteUserSettingsRequest\nDeleteUtterancesRequest\nDeleteV2LoggingLevelRequest\nDeleteVPCAssociationAuthorizationRequest\nDeleteVPCConnectionRequest\nDeleteVPCConnectionResponse\nDeleteVPCEConfigurationRequest\nDeleteVariableRequest\nDeleteVariantStoreRequest\nDeleteVariantStoreResponse\nDeleteVaultAccessPolicyInput\nDeleteVaultInput\nDeleteVaultNotificationsInput\nDeleteVcenterClientRequest\nDeleteVectorEnrichmentJobInput\nDeleteVehicleRequest\nDeleteVehicleResponse\nDeleteVerifiedAccessEndpointRequest\nDeleteVerifiedAccessEndpointResult\nDeleteVerifiedAccessGroupRequest\nDeleteVerifiedAccessGroupResult\nDeleteVerifiedAccessInstanceRequest\nDeleteVerifiedAccessInstanceResult\nDeleteVerifiedAccessTrustProviderRequest\nDeleteVerifiedAccessTrustProviderResult\nDeleteVerifiedEmailAddressRequest\nDeleteViewInput\nDeleteViewOutput\nDeleteViewRequest\nDeleteViewVersionRequest\nDeleteVirtualClusterRequest\nDeleteVirtualClusterResponse\nDeleteVirtualGatewayInput\nDeleteVirtualGatewayOutput\nDeleteVirtualInterfaceRequest\nDeleteVirtualInterfaceResponse\nDeleteVirtualMFADeviceRequest\nDeleteVirtualNodeInput\nDeleteVirtualNodeOutput\nDeleteVirtualRouterInput\nDeleteVirtualRouterOutput\nDeleteVirtualServiceInput\nDeleteVirtualServiceOutput\nDeleteVocabularyFilterRequest\nDeleteVocabularyRequest\nDeleteVocabularyResponse\nDeleteVodSourceRequest\nDeleteVoiceChannelRequest\nDeleteVoiceChannelResponse\nDeleteVoiceConnectorEmergencyCallingConfigurationRequest\nDeleteVoiceConnectorGroupRequest\nDeleteVoiceConnectorOriginationRequest\nDeleteVoiceConnectorProxyRequest\nDeleteVoiceConnectorRequest\nDeleteVoiceConnectorStreamingConfigurationRequest\nDeleteVoiceConnectorTerminationCredentialsRequest\nDeleteVoiceConnectorTerminationRequest\nDeleteVoiceMessageSpendLimitOverrideResult\nDeleteVoiceProfileDomainRequest\nDeleteVoiceProfileRequest\nDeleteVoiceTemplateRequest\nDeleteVoiceTemplateResponse\nDeleteVolumeInput\nDeleteVolumeOntapConfiguration\nDeleteVolumeOntapResponse\nDeleteVolumeOpenZFSConfiguration\nDeleteVolumeOutput\nDeleteVolumeRequest\nDeleteVolumeResponse\nDeleteVolumes\nDeleteVpcConfig\nDeleteVpcConnectionRequest\nDeleteVpcConnectionResponse\nDeleteVpcConnectorRequest\nDeleteVpcConnectorResponse\nDeleteVpcEndpointConnectionNotificationsRequest\nDeleteVpcEndpointConnectionNotificationsResult\nDeleteVpcEndpointDetail\nDeleteVpcEndpointRequest\nDeleteVpcEndpointResponse\nDeleteVpcEndpointServiceConfigurationsRequest\nDeleteVpcEndpointServiceConfigurationsResult\nDeleteVpcEndpointsRequest\nDeleteVpcEndpointsResult\nDeleteVpcIngressConnectionRequest\nDeleteVpcIngressConnectionResponse\nDeleteVpcLinkRequest\nDeleteVpcPeeringAuthorizationInput\nDeleteVpcPeeringConnectionInput\nDeleteVpcPeeringConnectionRequest\nDeleteVpcPeeringConnectionResult\nDeleteVpcRequest\nDeleteVpnConnectionRequest\nDeleteVpnConnectionRouteRequest\nDeleteVpnGatewayRequest\nDeleteWarmPoolType\nDeleteWatchlistRequest\nDeleteWaveRequest\nDeleteWebACLRequest\nDeleteWebACLResponse\nDeleteWebhookInput\nDeleteWebhookRequest\nDeleteWebhookResult\nDeleteWhatIfAnalysisRequest\nDeleteWhatIfForecastExportRequest\nDeleteWhatIfForecastRequest\nDeleteWirelessDeviceImportTaskRequest\nDeleteWirelessDeviceRequest\nDeleteWirelessGatewayRequest\nDeleteWirelessGatewayTaskDefinitionRequest\nDeleteWirelessGatewayTaskRequest\nDeleteWorkGroupInput\nDeleteWorkerBlockRequest\nDeleteWorkerFleetRequest\nDeleteWorkerRequest\nDeleteWorkflowRequest\nDeleteWorkflowResponse\nDeleteWorkflowStepGroupRequest\nDeleteWorkflowStepRequest\nDeleteWorkforceRequest\nDeleteWorkgroupRequest\nDeleteWorkgroupResponse\nDeleteWorkloadInput\nDeleteWorkloadShareInput\nDeleteWorkspaceApiKeyRequest\nDeleteWorkspaceApiKeyResponse\nDeleteWorkspaceBundleRequest\nDeleteWorkspaceImageRequest\nDeleteWorkspaceRequest\nDeleteWorkspaceResponse\nDeleteWorkteamRequest\nDeleteWorkteamResponse\nDeleteWorldTemplateRequest\nDeleteXssMatchSetRequest\nDeleteXssMatchSetResponse\nDeleted\nDeletedAt\nDeletedDate\nDeletedFaces\nDeletedObject\nDeletedParameters\nDeletedSubnetCidrReservation\nDeletes\nDeletionConfig\nDeletionDate\nDeletionId\nDeletionMessage\nDeletionMode\nDeletionProtection\nDeletionProtectionEnabled\nDeletionStartTime\nDeletionStatus\nDeletionSummary\nDeletionTaskFailureReasonType\nDeletionTaskId\nDeletionTime\nDeletionTimestamp\nDelimitedTextImportOptions\nDelimiter\nDeliverConfigSnapshotRequest\nDeliverConfigSnapshotResponse\nDeliverCrossAccountRole\nDeliverLogsErrorMessage\nDeliverLogsPermissionArn\nDeliverLogsStatus\nDeliverabilityTestReport\nDeliverabilityTestReports\nDeliverabilityTestStatus\nDeliveredTimestamp\nDeliveryAddress\nDeliveryAttempts\nDeliveryChannel\nDeliveryChannelName\nDeliveryChannelNames\nDeliveryChannelStatus\nDeliveryChannels\nDeliveryChannelsStatus\nDeliveryMedium\nDeliveryMethod\nDeliveryOptions\nDeliveryRestrictions\nDeliveryS3Bucket\nDeliveryS3KeyPrefix\nDeliveryS3Uri\nDeliveryStartTimestamp\nDeliveryStatus\nDeliveryStream\nDeliveryStreamARN\nDeliveryStreamArn\nDeliveryStreamDescription\nDeliveryStreamEncryptionConfiguration\nDeliveryStreamEncryptionConfigurationInput\nDeliveryStreamName\nDeliveryStreamNames\nDeliveryStreamStatus\nDeliveryStreamType\nDeliveryTime\nDeliveryTimedOutCount\nDeliveryTopic\nDeliveryUri\nDeltaSyncConfig\nDeltaTables\nDeltaTarget\nDeltaTargets\nDeltaTime\nDeltaTimeSessionWindowConfiguration\nDemodulationConfig\nDemographic\nDenied\nDenoiseFilter\nDenyAllIgwTraffic\nDenyAllTrafficToEndpoint\nDenyCustomRoutingTrafficRequest\nDepartNow\nDepartment\nDeparturePosition\nDeparturePositions\nDepartureTime\nDependencies\nDependencyAccessDeniedException\nDependencyCopyPath\nDependencyException\nDependencyFailedException\nDependencyFailureException\nDependencyOriginPath\nDependencyRevision\nDependencyThrottleException\nDependencyTimeout\nDependencyTimeoutException\nDependentEntities\nDependentEntity\nDependentJobName\nDependentResourceIds\nDependentService\nDependentServiceFailureException\nDependentServiceRequestThrottlingFault\nDependentServiceUnavailableFault\nDependentServices\nDependsOn\nDeploy\nDeployAsApplicationConfiguration\nDeployAsApplicationConfigurationDescription\nDeployAsApplicationConfigurationUpdate\nDeploySystemInstanceRequest\nDeploySystemInstanceResponse\nDeployed\nDeployedImage\nDeployedImages\nDeployedStageName\nDeployedVersionSummary\nDeployment\nDeploymentAction\nDeploymentAlarms\nDeploymentAlreadyCompletedException\nDeploymentApplicationConfig\nDeploymentArn\nDeploymentCanarySettings\nDeploymentCircuitBreaker\nDeploymentCommand\nDeploymentComponentUpdatePolicy\nDeploymentConfig\nDeploymentConfigAlreadyExistsException\nDeploymentConfigDoesNotExistException\nDeploymentConfigInUseException\nDeploymentConfigInfo\nDeploymentConfigLimitExceededException\nDeploymentConfigNameRequiredException\nDeploymentConfiguration\nDeploymentConfigurationValidationPolicy\nDeploymentController\nDeploymentDoesNotExistException\nDeploymentDurationInMinutes\nDeploymentEndTime\nDeploymentEvent\nDeploymentGroupAlreadyExistsException\nDeploymentGroupDoesNotExistException\nDeploymentGroupInfo\nDeploymentGroupLimitExceededException\nDeploymentGroupNameRequiredException\nDeploymentId\nDeploymentIdRequiredException\nDeploymentIds\nDeploymentInfo\nDeploymentIoTJobConfiguration\nDeploymentIsNotInReadyStateException\nDeploymentJob\nDeploymentLaunchConfig\nDeploymentLimitExceededException\nDeploymentMode\nDeploymentModel\nDeploymentModels\nDeploymentName\nDeploymentNotStartedException\nDeploymentNumber\nDeploymentOption\nDeploymentOverview\nDeploymentPolicies\nDeploymentReadyOption\nDeploymentRecommendation\nDeploymentResult\nDeploymentStage\nDeploymentStageStatusSummary\nDeploymentStartTime\nDeploymentState\nDeploymentStatus\nDeploymentStatusMessage\nDeploymentStrategies\nDeploymentStrategy\nDeploymentStrategyId\nDeploymentStyle\nDeploymentSummary\nDeploymentTarget\nDeploymentTargetDoesNotExistException\nDeploymentTargetIdRequiredException\nDeploymentTargetListSizeExceededException\nDeploymentTargets\nDeploymentTime\nDeploymentType\nDeployments\nDeprecateActivityTypeInput\nDeprecateAt\nDeprecateDomainInput\nDeprecateFlowTemplateRequest\nDeprecateRule\nDeprecateSystemTemplateRequest\nDeprecateThingTypeRequest\nDeprecateWorkflowTypeInput\nDeprecatedStatus\nDeprecationDate\nDeprecationTime\nDeprovisionByoipCidrRequest\nDeprovisionByoipCidrResponse\nDeprovisionByoipCidrResult\nDeprovisionIpamPoolCidrRequest\nDeprovisionIpamPoolCidrResult\nDeprovisionPublicIpv4PoolCidrRequest\nDeprovisionPublicIpv4PoolCidrResult\nDeprovisionedAddresses\nDeregisterAccountResponse\nDeregisterAppInstanceUserEndpointRequest\nDeregisterApplicationInput\nDeregisterCertificateRequest\nDeregisterClusterRequest\nDeregisterClusterResponse\nDeregisterComputeInput\nDeregisterContainerInstanceRequest\nDeregisterContainerInstanceResponse\nDeregisterDBProxyTargetsRequest\nDeregisterDelegatedAdministratorRequest\nDeregisterDevicesRequest\nDeregisterEcsClusterRequest\nDeregisterElasticIpRequest\nDeregisterEndPointsInput\nDeregisterEndPointsOutput\nDeregisterEventTopicRequest\nDeregisterFromWorkMailRequest\nDeregisterGameServerInput\nDeregisterGatewayInstanceRequest\nDeregisterGatewayInstanceResponse\nDeregisterIdentityProviderRequest\nDeregisterIdentityProviderResponse\nDeregisterImageRequest\nDeregisterInstanceEventNotificationAttributesRequest\nDeregisterInstanceEventNotificationAttributesResult\nDeregisterInstanceRequest\nDeregisterInstanceResponse\nDeregisterInstanceTagAttributeRequest\nDeregisterJobDefinitionRequest\nDeregisterMailDomainRequest\nDeregisterManagedInstanceRequest\nDeregisterOnPremisesInstanceInput\nDeregisterOrganizationAdminAccountRequest\nDeregisterOrganizationDelegatedAdminRequest\nDeregisterPackageVersionRequest\nDeregisterPatchBaselineForPatchGroupRequest\nDeregisterPatchBaselineForPatchGroupResult\nDeregisterRdsDbInstanceRequest\nDeregisterResourceRequest\nDeregisterRobotRequest\nDeregisterRobotResponse\nDeregisterScalableTargetRequest\nDeregisterStreamConsumerInput\nDeregisterTargetFromMaintenanceWindowRequest\nDeregisterTargetFromMaintenanceWindowResult\nDeregisterTargetsInput\nDeregisterTargetsRequest\nDeregisterTargetsResponse\nDeregisterTaskDefinitionRequest\nDeregisterTaskDefinitionResponse\nDeregisterTaskFromMaintenanceWindowRequest\nDeregisterTaskFromMaintenanceWindowResult\nDeregisterTransitGatewayMulticastGroupMembersRequest\nDeregisterTransitGatewayMulticastGroupMembersResult\nDeregisterTransitGatewayMulticastGroupSourcesRequest\nDeregisterTransitGatewayMulticastGroupSourcesResult\nDeregisterTransitGatewayRequest\nDeregisterTransitGatewayResponse\nDeregisterTypeInput\nDeregisterVolumeRequest\nDeregisterWebhookWithThirdPartyInput\nDeregisterWirelessDeviceRequest\nDeregisterWorkspaceDirectoryRequest\nDeregisteredMulticastGroupMembers\nDeregisteredMulticastGroupSources\nDeregisteredNetworkInterfaceIds\nDeregistering\nDeregistrationPolicy\nDeriveKey\nDerivedDataInputConfig\nDerivedInformation\nDescribeACLsRequest\nDescribeACLsResponse\nDescribeAcceleratorAttributesRequest\nDescribeAcceleratorAttributesResponse\nDescribeAcceleratorOfferingsRequest\nDescribeAcceleratorOfferingsResponse\nDescribeAcceleratorRequest\nDescribeAcceleratorResponse\nDescribeAcceleratorTypesResponse\nDescribeAcceleratorsRequest\nDescribeAcceleratorsResponse\nDescribeAccessControlConfigurationRequest\nDescribeAccessControlConfigurationResponse\nDescribeAccessPointsInput\nDescribeAccessPointsOutput\nDescribeAccessPointsRequest\nDescribeAccessPointsResponse\nDescribeAccessPolicyRequest\nDescribeAccessPolicyResponse\nDescribeAccessRequest\nDescribeAccessResponse\nDescribeAccountAssignmentCreationStatusRequest\nDescribeAccountAssignmentCreationStatusResponse\nDescribeAccountAssignmentDeletionStatusRequest\nDescribeAccountAssignmentDeletionStatusResponse\nDescribeAccountAttributesMessage\nDescribeAccountAttributesRequest\nDescribeAccountAttributesResponse\nDescribeAccountAttributesResult\nDescribeAccountAuditConfigurationResponse\nDescribeAccountConfigurationResponse\nDescribeAccountCustomizationRequest\nDescribeAccountCustomizationResponse\nDescribeAccountHealthResponse\nDescribeAccountLimitsAnswer\nDescribeAccountLimitsInput\nDescribeAccountLimitsOutput\nDescribeAccountLimitsRequest\nDescribeAccountLimitsResult\nDescribeAccountModificationsRequest\nDescribeAccountModificationsResult\nDescribeAccountOverviewRequest\nDescribeAccountOverviewResponse\nDescribeAccountPoliciesRequest\nDescribeAccountPoliciesResponse\nDescribeAccountPreferencesRequest\nDescribeAccountPreferencesResponse\nDescribeAccountRequest\nDescribeAccountResponse\nDescribeAccountResult\nDescribeAccountSettingsRequest\nDescribeAccountSettingsResponse\nDescribeAccountSubscriptionRequest\nDescribeAccountSubscriptionResponse\nDescribeActionRequest\nDescribeActionResponse\nDescribeActionTargetsRequest\nDescribeActionTargetsResponse\nDescribeActivationsFilter\nDescribeActivationsRequest\nDescribeActivationsResult\nDescribeActiveReceiptRuleSetResponse\nDescribeActivitiesRequest\nDescribeActivitiesResponse\nDescribeActivityInput\nDescribeActivityOutput\nDescribeActivityTypeInput\nDescribeAddonConfigurationRequest\nDescribeAddonConfigurationResponse\nDescribeAddonRequest\nDescribeAddonResponse\nDescribeAddonVersionsRequest\nDescribeAddonVersionsResponse\nDescribeAddressRequest\nDescribeAddressResult\nDescribeAddressTransfersRequest\nDescribeAddressTransfersResult\nDescribeAddressesAttributeRequest\nDescribeAddressesAttributeResult\nDescribeAddressesRequest\nDescribeAddressesResult\nDescribeAdjustmentTypesAnswer\nDescribeAffectedAccountsForOrganizationRequest\nDescribeAffectedAccountsForOrganizationResponse\nDescribeAffectedEntitiesForOrganizationRequest\nDescribeAffectedEntitiesForOrganizationResponse\nDescribeAffectedEntitiesRequest\nDescribeAffectedEntitiesResponse\nDescribeAgentRequest\nDescribeAgentResponse\nDescribeAgentStatusRequest\nDescribeAgentStatusResponse\nDescribeAgentVersionsRequest\nDescribeAgentVersionsResult\nDescribeAgentsRequest\nDescribeAgentsResponse\nDescribeAggregateComplianceByConfigRulesRequest\nDescribeAggregateComplianceByConfigRulesResponse\nDescribeAggregateComplianceByConformancePacksRequest\nDescribeAggregateComplianceByConformancePacksResponse\nDescribeAggregateIdFormatRequest\nDescribeAggregateIdFormatResult\nDescribeAggregationAuthorizationsRequest\nDescribeAggregationAuthorizationsResponse\nDescribeAgreementRequest\nDescribeAgreementResponse\nDescribeAlarmHistoryInput\nDescribeAlarmHistoryOutput\nDescribeAlarmModelRequest\nDescribeAlarmModelResponse\nDescribeAlarmRequest\nDescribeAlarmResponse\nDescribeAlarmsForMetricInput\nDescribeAlarmsForMetricOutput\nDescribeAlarmsInput\nDescribeAlarmsOutput\nDescribeAlertManagerDefinitionRequest\nDescribeAlertManagerDefinitionResponse\nDescribeAlertRequest\nDescribeAlertResponse\nDescribeAlgorithmInput\nDescribeAlgorithmOutput\nDescribeAlgorithmRequest\nDescribeAlgorithmResponse\nDescribeAliasInput\nDescribeAliasOutput\nDescribeAllManagedProductsRequest\nDescribeAllManagedProductsResponse\nDescribeAnalysisDefinitionRequest\nDescribeAnalysisDefinitionResponse\nDescribeAnalysisPermissionsRequest\nDescribeAnalysisPermissionsResponse\nDescribeAnalysisRequest\nDescribeAnalysisResponse\nDescribeAnalysisSchemesRequest\nDescribeAnalysisSchemesResponse\nDescribeAnomalyDetectionExecutionsRequest\nDescribeAnomalyDetectionExecutionsResponse\nDescribeAnomalyDetectorRequest\nDescribeAnomalyDetectorResponse\nDescribeAnomalyDetectorsInput\nDescribeAnomalyDetectorsOutput\nDescribeAnomalyRequest\nDescribeAnomalyResponse\nDescribeApiDestinationRequest\nDescribeApiDestinationResponse\nDescribeAppAssessmentRequest\nDescribeAppAssessmentResponse\nDescribeAppBlockBuilderAppBlockAssociationsRequest\nDescribeAppBlockBuilderAppBlockAssociationsResult\nDescribeAppBlockBuildersRequest\nDescribeAppBlockBuildersResult\nDescribeAppBlocksRequest\nDescribeAppBlocksResult\nDescribeAppImageConfigRequest\nDescribeAppImageConfigResponse\nDescribeAppInput\nDescribeAppInstanceAdminRequest\nDescribeAppInstanceAdminResponse\nDescribeAppInstanceBotRequest\nDescribeAppInstanceBotResponse\nDescribeAppInstanceRequest\nDescribeAppInstanceResponse\nDescribeAppInstanceUserEndpointRequest\nDescribeAppInstanceUserEndpointResponse\nDescribeAppInstanceUserRequest\nDescribeAppInstanceUserResponse\nDescribeAppOutput\nDescribeAppRequest\nDescribeAppResponse\nDescribeAppVersionAppComponentRequest\nDescribeAppVersionAppComponentResponse\nDescribeAppVersionRequest\nDescribeAppVersionResourceRequest\nDescribeAppVersionResourceResponse\nDescribeAppVersionResourcesResolutionStatusRequest\nDescribeAppVersionResourcesResolutionStatusResponse\nDescribeAppVersionResponse\nDescribeAppVersionTemplateRequest\nDescribeAppVersionTemplateResponse\nDescribeApplicableIndividualAssessmentsMessage\nDescribeApplicableIndividualAssessmentsResponse\nDescribeApplicationFleetAssociationsRequest\nDescribeApplicationFleetAssociationsResult\nDescribeApplicationInstanceDetailsRequest\nDescribeApplicationInstanceDetailsResponse\nDescribeApplicationInstanceRequest\nDescribeApplicationInstanceResponse\nDescribeApplicationRequest\nDescribeApplicationResponse\nDescribeApplicationSnapshotRequest\nDescribeApplicationSnapshotResponse\nDescribeApplicationStateRequest\nDescribeApplicationStateResult\nDescribeApplicationVersionRequest\nDescribeApplicationVersionResponse\nDescribeApplicationVersionsMessage\nDescribeApplicationsMessage\nDescribeApplicationsRequest\nDescribeApplicationsResult\nDescribeAppsRequest\nDescribeAppsResult\nDescribeArchiveRequest\nDescribeArchiveResponse\nDescribeArtifactRequest\nDescribeArtifactResponse\nDescribeAssessmentRunsRequest\nDescribeAssessmentRunsResponse\nDescribeAssessmentTargetsRequest\nDescribeAssessmentTargetsResponse\nDescribeAssessmentTemplatesRequest\nDescribeAssessmentTemplatesResponse\nDescribeAssetBundleExportJobRequest\nDescribeAssetBundleExportJobResponse\nDescribeAssetBundleImportJobRequest\nDescribeAssetBundleImportJobResponse\nDescribeAssetModelRequest\nDescribeAssetModelResponse\nDescribeAssetPropertyRequest\nDescribeAssetPropertyResponse\nDescribeAssetRequest\nDescribeAssetResponse\nDescribeAssociationExecutionTargetsRequest\nDescribeAssociationExecutionTargetsResult\nDescribeAssociationExecutionsRequest\nDescribeAssociationExecutionsResult\nDescribeAssociationRequest\nDescribeAssociationResult\nDescribeAttachmentLimitExceeded\nDescribeAttachmentRequest\nDescribeAttachmentResponse\nDescribeAttackRequest\nDescribeAttackResponse\nDescribeAttackStatisticsResponse\nDescribeAuditFindingRequest\nDescribeAuditFindingResponse\nDescribeAuditMitigationActionsTaskRequest\nDescribeAuditMitigationActionsTaskResponse\nDescribeAuditStreamConfigurationRequest\nDescribeAuditStreamConfigurationResponse\nDescribeAuditSuppressionRequest\nDescribeAuditSuppressionResponse\nDescribeAuditTaskRequest\nDescribeAuditTaskResponse\nDescribeAuthenticationProfilesMessage\nDescribeAuthenticationProfilesResult\nDescribeAuthorizerRequest\nDescribeAuthorizerResponse\nDescribeAutoMLJobRequest\nDescribeAutoMLJobResponse\nDescribeAutoMLJobV2Request\nDescribeAutoMLJobV2Response\nDescribeAutoPredictorRequest\nDescribeAutoPredictorResponse\nDescribeAutoScalingConfigurationRequest\nDescribeAutoScalingConfigurationResponse\nDescribeAutoScalingInstancesType\nDescribeAutoScalingNotificationTypesAnswer\nDescribeAutomationExecutionsRequest\nDescribeAutomationExecutionsResult\nDescribeAutomationStepExecutionsRequest\nDescribeAutomationStepExecutionsResult\nDescribeAvailabilityMonitorTestInput\nDescribeAvailabilityMonitorTestOutput\nDescribeAvailabilityOptionsRequest\nDescribeAvailabilityOptionsResponse\nDescribeAvailabilityZonesRequest\nDescribeAvailabilityZonesResult\nDescribeAvailablePatchesRequest\nDescribeAvailablePatchesResult\nDescribeAwsNetworkPerformanceMetricSubscriptionsRequest\nDescribeAwsNetworkPerformanceMetricSubscriptionsResult\nDescribeBackupInput\nDescribeBackupJobInput\nDescribeBackupJobOutput\nDescribeBackupOutput\nDescribeBackupPolicyRequest\nDescribeBackupVaultInput\nDescribeBackupVaultOutput\nDescribeBackupsRequest\nDescribeBackupsResponse\nDescribeBandwidthRateLimitInput\nDescribeBandwidthRateLimitOutput\nDescribeBandwidthRateLimitScheduleInput\nDescribeBandwidthRateLimitScheduleOutput\nDescribeBatchInferenceJobRequest\nDescribeBatchInferenceJobResponse\nDescribeBatchLoadTaskRequest\nDescribeBatchLoadTaskResponse\nDescribeBatchPredictionsInput\nDescribeBatchPredictionsOutput\nDescribeBatchSegmentJobRequest\nDescribeBatchSegmentJobResponse\nDescribeBillingGroupRequest\nDescribeBillingGroupResponse\nDescribeBlueGreenDeploymentsRequest\nDescribeBlueGreenDeploymentsResponse\nDescribeBotAliasRequest\nDescribeBotAliasResponse\nDescribeBotLocaleRequest\nDescribeBotLocaleResponse\nDescribeBotRecommendationRequest\nDescribeBotRecommendationResponse\nDescribeBotRequest\nDescribeBotResponse\nDescribeBotVersionRequest\nDescribeBotVersionResponse\nDescribeBridgeRequest\nDescribeBridgeResponse\nDescribeBrokerEngineTypesRequest\nDescribeBrokerEngineTypesResponse\nDescribeBrokerInstanceOptionsRequest\nDescribeBrokerInstanceOptionsResponse\nDescribeBrokerRequest\nDescribeBrokerResponse\nDescribeBucketsRequest\nDescribeBucketsResponse\nDescribeBudgetActionHistoriesRequest\nDescribeBudgetActionHistoriesResponse\nDescribeBudgetActionRequest\nDescribeBudgetActionResponse\nDescribeBudgetActionsForAccountRequest\nDescribeBudgetActionsForAccountResponse\nDescribeBudgetActionsForBudgetRequest\nDescribeBudgetActionsForBudgetResponse\nDescribeBudgetNotificationsForAccountRequest\nDescribeBudgetNotificationsForAccountResponse\nDescribeBudgetPerformanceHistoryRequest\nDescribeBudgetPerformanceHistoryResponse\nDescribeBudgetRequest\nDescribeBudgetResponse\nDescribeBudgetsRequest\nDescribeBudgetsResponse\nDescribeBuildInput\nDescribeBuildOutput\nDescribeBulkImportJobRequest\nDescribeBulkImportJobResponse\nDescribeBundleRequest\nDescribeBundleResult\nDescribeBundleTasksRequest\nDescribeBundleTasksResult\nDescribeByoipCidrsRequest\nDescribeByoipCidrsResult\nDescribeCACertificateRequest\nDescribeCACertificateResponse\nDescribeCacheClustersMessage\nDescribeCacheEngineVersionsMessage\nDescribeCacheInput\nDescribeCacheOutput\nDescribeCacheParameterGroupsMessage\nDescribeCacheParametersMessage\nDescribeCacheSecurityGroupsMessage\nDescribeCacheSubnetGroupsMessage\nDescribeCachediSCSIVolumesInput\nDescribeCachediSCSIVolumesOutput\nDescribeCampaignRequest\nDescribeCampaignResponse\nDescribeCanariesLastRunRequest\nDescribeCanariesLastRunResponse\nDescribeCanariesRequest\nDescribeCanariesResponse\nDescribeCapacityProvidersRequest\nDescribeCapacityProvidersResponse\nDescribeCapacityReservationFleetsRequest\nDescribeCapacityReservationFleetsResult\nDescribeCapacityReservationsRequest\nDescribeCapacityReservationsResult\nDescribeCarrierGatewaysRequest\nDescribeCarrierGatewaysResult\nDescribeCasesRequest\nDescribeCasesResponse\nDescribeCertificateAuthorityAuditReportRequest\nDescribeCertificateAuthorityAuditReportResponse\nDescribeCertificateAuthorityRequest\nDescribeCertificateAuthorityResponse\nDescribeCertificateRequest\nDescribeCertificateResponse\nDescribeCertificateResult\nDescribeCertificatesMessage\nDescribeCertificatesResponse\nDescribeChangeSetHooksInput\nDescribeChangeSetHooksOutput\nDescribeChangeSetInput\nDescribeChangeSetOutput\nDescribeChangeSetRequest\nDescribeChangeSetResponse\nDescribeChannelBanRequest\nDescribeChannelBanResponse\nDescribeChannelFlowRequest\nDescribeChannelFlowResponse\nDescribeChannelMembershipForAppInstanceUserRequest\nDescribeChannelMembershipForAppInstanceUserResponse\nDescribeChannelMembershipRequest\nDescribeChannelMembershipResponse\nDescribeChannelModeratedByAppInstanceUserRequest\nDescribeChannelModeratedByAppInstanceUserResponse\nDescribeChannelModeratorRequest\nDescribeChannelModeratorResponse\nDescribeChannelRequest\nDescribeChannelResponse\nDescribeChapCredentialsInput\nDescribeChapCredentialsOutput\nDescribeClassicLinkInstancesRequest\nDescribeClassicLinkInstancesResult\nDescribeClassificationJobRequest\nDescribeClassificationJobResponse\nDescribeClientAuthenticationSettingsRequest\nDescribeClientAuthenticationSettingsResult\nDescribeClientBrandingRequest\nDescribeClientBrandingResult\nDescribeClientPropertiesRequest\nDescribeClientPropertiesResult\nDescribeClientVpnAuthorizationRulesRequest\nDescribeClientVpnAuthorizationRulesResult\nDescribeClientVpnConnectionsRequest\nDescribeClientVpnConnectionsResult\nDescribeClientVpnEndpointsRequest\nDescribeClientVpnEndpointsResult\nDescribeClientVpnRoutesRequest\nDescribeClientVpnRoutesResult\nDescribeClientVpnTargetNetworksRequest\nDescribeClientVpnTargetNetworksResult\nDescribeClusterDbRevisionsMessage\nDescribeClusterInput\nDescribeClusterOperationRequest\nDescribeClusterOperationResponse\nDescribeClusterOperationV2Request\nDescribeClusterOperationV2Response\nDescribeClusterOutput\nDescribeClusterParameterGroupsMessage\nDescribeClusterParametersMessage\nDescribeClusterRequest\nDescribeClusterResponse\nDescribeClusterResult\nDescribeClusterSecurityGroupsMessage\nDescribeClusterSnapshotsMessage\nDescribeClusterSubnetGroupsMessage\nDescribeClusterTracksMessage\nDescribeClusterV2Request\nDescribeClusterV2Response\nDescribeClusterVersionsMessage\nDescribeClustersMessage\nDescribeClustersRequest\nDescribeClustersResponse\nDescribeCodeBindingRequest\nDescribeCodeBindingResponse\nDescribeCodeCoveragesInput\nDescribeCodeCoveragesOutput\nDescribeCodeRepositoryInput\nDescribeCodeRepositoryOutput\nDescribeCodeReviewRequest\nDescribeCodeReviewResponse\nDescribeCoipPoolsRequest\nDescribeCoipPoolsResult\nDescribeCollectionRequest\nDescribeCollectionResponse\nDescribeCommandsRequest\nDescribeCommandsResult\nDescribeCommentsRequest\nDescribeCommentsResponse\nDescribeCommunicationsRequest\nDescribeCommunicationsResponse\nDescribeCompanyNetworkConfigurationRequest\nDescribeCompanyNetworkConfigurationResponse\nDescribeCompilationJobRequest\nDescribeCompilationJobResponse\nDescribeComplianceByConfigRuleRequest\nDescribeComplianceByConfigRuleResponse\nDescribeComplianceByResourceRequest\nDescribeComplianceByResourceResponse\nDescribeComponentConfigurationRecommendationRequest\nDescribeComponentConfigurationRecommendationResponse\nDescribeComponentConfigurationRequest\nDescribeComponentConfigurationResponse\nDescribeComponentRequest\nDescribeComponentResponse\nDescribeComputeEnvironmentsRequest\nDescribeComputeEnvironmentsResponse\nDescribeComputeInput\nDescribeComputeOutput\nDescribeConditionalForwardersRequest\nDescribeConditionalForwardersResult\nDescribeConfigRuleEvaluationStatusRequest\nDescribeConfigRuleEvaluationStatusResponse\nDescribeConfigRulesFilters\nDescribeConfigRulesRequest\nDescribeConfigRulesResponse\nDescribeConfigurationAggregatorSourcesStatusRequest\nDescribeConfigurationAggregatorSourcesStatusResponse\nDescribeConfigurationAggregatorsRequest\nDescribeConfigurationAggregatorsResponse\nDescribeConfigurationOptionsMessage\nDescribeConfigurationRecorderStatusRequest\nDescribeConfigurationRecorderStatusResponse\nDescribeConfigurationRecordersRequest\nDescribeConfigurationRecordersResponse\nDescribeConfigurationRequest\nDescribeConfigurationResponse\nDescribeConfigurationRevisionRequest\nDescribeConfigurationRevisionResponse\nDescribeConfigurationSetRequest\nDescribeConfigurationSetResponse\nDescribeConfigurationSetsRequest\nDescribeConfigurationSetsResult\nDescribeConfigurationSettingsMessage\nDescribeConfigurationsRequest\nDescribeConfigurationsResponse\nDescribeConformancePackComplianceRequest\nDescribeConformancePackComplianceResponse\nDescribeConformancePackStatusRequest\nDescribeConformancePackStatusResponse\nDescribeConformancePacksRequest\nDescribeConformancePacksResponse\nDescribeConnectClientAddInsRequest\nDescribeConnectClientAddInsResult\nDescribeConnectionAliasPermissionsRequest\nDescribeConnectionAliasPermissionsResult\nDescribeConnectionAliasesRequest\nDescribeConnectionAliasesResult\nDescribeConnectionLoaRequest\nDescribeConnectionLoaResponse\nDescribeConnectionRequest\nDescribeConnectionResponse\nDescribeConnectionsMessage\nDescribeConnectionsOnInterconnectRequest\nDescribeConnectionsRequest\nDescribeConnectionsResponse\nDescribeConnectorEntityRequest\nDescribeConnectorEntityResponse\nDescribeConnectorProfilesRequest\nDescribeConnectorProfilesResponse\nDescribeConnectorRequest\nDescribeConnectorResponse\nDescribeConnectorsRequest\nDescribeConnectorsResponse\nDescribeConstraintInput\nDescribeConstraintOutput\nDescribeContactEvaluationRequest\nDescribeContactEvaluationResponse\nDescribeContactFlowModuleRequest\nDescribeContactFlowModuleResponse\nDescribeContactFlowRequest\nDescribeContactFlowResponse\nDescribeContactRequest\nDescribeContactResponse\nDescribeContainerInput\nDescribeContainerInstancesRequest\nDescribeContainerInstancesResponse\nDescribeContainerOutput\nDescribeContextRequest\nDescribeContextResponse\nDescribeContinuousBackupsInput\nDescribeContinuousBackupsOutput\nDescribeContinuousExportsRequest\nDescribeContinuousExportsResponse\nDescribeContributorInsightsInput\nDescribeContributorInsightsOutput\nDescribeControlPanelRequest\nDescribeControlPanelResponse\nDescribeConversionConfigurationMessage\nDescribeConversionConfigurationResponse\nDescribeConversionTasksRequest\nDescribeConversionTasksResult\nDescribeCopyJobInput\nDescribeCopyJobOutput\nDescribeCopyProductStatusInput\nDescribeCopyProductStatusOutput\nDescribeCostCategoryDefinitionRequest\nDescribeCostCategoryDefinitionResponse\nDescribeCreateAccountStatusRequest\nDescribeCreateAccountStatusResponse\nDescribeCreateCaseOptionsRequest\nDescribeCreateCaseOptionsResponse\nDescribeCrossAccountAccessRoleResponse\nDescribeCustomDomainAssociationsMessage\nDescribeCustomDomainsRequest\nDescribeCustomDomainsResponse\nDescribeCustomKeyStoresRequest\nDescribeCustomKeyStoresResponse\nDescribeCustomMetricRequest\nDescribeCustomMetricResponse\nDescribeCustomPluginRequest\nDescribeCustomPluginResponse\nDescribeCustomRoutingAcceleratorAttributesRequest\nDescribeCustomRoutingAcceleratorAttributesResponse\nDescribeCustomRoutingAcceleratorRequest\nDescribeCustomRoutingAcceleratorResponse\nDescribeCustomRoutingEndpointGroupRequest\nDescribeCustomRoutingEndpointGroupResponse\nDescribeCustomRoutingListenerRequest\nDescribeCustomRoutingListenerResponse\nDescribeCustomVocabularyMetadataRequest\nDescribeCustomVocabularyMetadataResponse\nDescribeCustomerGatewaysRequest\nDescribeCustomerGatewaysResult\nDescribeCustomerMetadataResponse\nDescribeDBClusterAutomatedBackupsMessage\nDescribeDBClusterBacktracksMessage\nDescribeDBClusterEndpointsMessage\nDescribeDBClusterParameterGroupsMessage\nDescribeDBClusterParametersMessage\nDescribeDBClusterSnapshotAttributesMessage\nDescribeDBClusterSnapshotAttributesResult\nDescribeDBClusterSnapshotsMessage\nDescribeDBClustersMessage\nDescribeDBEngineVersionsMessage\nDescribeDBInstanceAutomatedBackupsMessage\nDescribeDBInstancesMessage\nDescribeDBLogFiles\nDescribeDBLogFilesDetails\nDescribeDBLogFilesMessage\nDescribeDBLogFilesResponse\nDescribeDBParameterGroupsMessage\nDescribeDBParametersMessage\nDescribeDBProxiesRequest\nDescribeDBProxiesResponse\nDescribeDBProxyEndpointsRequest\nDescribeDBProxyEndpointsResponse\nDescribeDBProxyTargetGroupsRequest\nDescribeDBProxyTargetGroupsResponse\nDescribeDBProxyTargetsRequest\nDescribeDBProxyTargetsResponse\nDescribeDBSecurityGroupsMessage\nDescribeDBSnapshotAttributesMessage\nDescribeDBSnapshotAttributesResult\nDescribeDBSnapshotsMessage\nDescribeDBSubnetGroupsMessage\nDescribeDRTAccessResponse\nDescribeDashboardDefinitionRequest\nDescribeDashboardDefinitionResponse\nDescribeDashboardPermissionsRequest\nDescribeDashboardPermissionsResponse\nDescribeDashboardRequest\nDescribeDashboardResponse\nDescribeDashboardSnapshotJobRequest\nDescribeDashboardSnapshotJobResponse\nDescribeDashboardSnapshotJobResultRequest\nDescribeDashboardSnapshotJobResultResponse\nDescribeDataIngestionJobRequest\nDescribeDataIngestionJobResponse\nDescribeDataProvidersMessage\nDescribeDataProvidersResponse\nDescribeDataQualityJobDefinitionRequest\nDescribeDataQualityJobDefinitionResponse\nDescribeDataRepositoryAssociationsRequest\nDescribeDataRepositoryAssociationsResponse\nDescribeDataRepositoryTasksRequest\nDescribeDataRepositoryTasksResponse\nDescribeDataSetPermissionsRequest\nDescribeDataSetPermissionsResponse\nDescribeDataSetRefreshPropertiesRequest\nDescribeDataSetRefreshPropertiesResponse\nDescribeDataSetRequest\nDescribeDataSetResponse\nDescribeDataSharesForConsumerMessage\nDescribeDataSharesForConsumerResult\nDescribeDataSharesForProducerMessage\nDescribeDataSharesForProducerResult\nDescribeDataSharesMessage\nDescribeDataSharesResult\nDescribeDataSourcePermissionsRequest\nDescribeDataSourcePermissionsResponse\nDescribeDataSourceRequest\nDescribeDataSourceResponse\nDescribeDataSourcesInput\nDescribeDataSourcesOutput\nDescribeDatabaseRequest\nDescribeDatabaseResponse\nDescribeDatasetExportJobRequest\nDescribeDatasetExportJobResponse\nDescribeDatasetGroupRequest\nDescribeDatasetGroupResponse\nDescribeDatasetImportJobRequest\nDescribeDatasetImportJobResponse\nDescribeDatasetRequest\nDescribeDatasetResponse\nDescribeDatastoreRequest\nDescribeDatastoreResponse\nDescribeDefaultAuthorizerResponse\nDescribeDefaultClusterParametersMessage\nDescribeDefaultClusterParametersResult\nDescribeDefaultEncryptionConfigurationResponse\nDescribeDefaultParametersRequest\nDescribeDefaultParametersResponse\nDescribeDeliveryChannelStatusRequest\nDescribeDeliveryChannelStatusResponse\nDescribeDeliveryChannelsRequest\nDescribeDeliveryChannelsResponse\nDescribeDeliveryStreamInput\nDescribeDeliveryStreamOutput\nDescribeDeploymentJobRequest\nDescribeDeploymentJobResponse\nDescribeDeploymentsRequest\nDescribeDeploymentsResult\nDescribeDestinationsRequest\nDescribeDestinationsResponse\nDescribeDetectMitigationActionsTaskRequest\nDescribeDetectMitigationActionsTaskResponse\nDescribeDetectorModelAnalysisRequest\nDescribeDetectorModelAnalysisResponse\nDescribeDetectorModelRequest\nDescribeDetectorModelResponse\nDescribeDetectorRequest\nDescribeDetectorResponse\nDescribeDetectorResult\nDescribeDeviceEc2Input\nDescribeDeviceEc2Output\nDescribeDeviceFleetRequest\nDescribeDeviceFleetResponse\nDescribeDeviceInput\nDescribeDeviceJobRequest\nDescribeDeviceJobResponse\nDescribeDeviceOutput\nDescribeDevicePolicyConfigurationRequest\nDescribeDevicePolicyConfigurationResponse\nDescribeDeviceRequest\nDescribeDeviceResponse\nDescribeDhcpOptionsRequest\nDescribeDhcpOptionsResult\nDescribeDimensionKeysRequest\nDescribeDimensionKeysResponse\nDescribeDimensionRequest\nDescribeDimensionResponse\nDescribeDirectConnectGatewayAssociationProposalsRequest\nDescribeDirectConnectGatewayAssociationProposalsResult\nDescribeDirectConnectGatewayAssociationsRequest\nDescribeDirectConnectGatewayAssociationsResult\nDescribeDirectConnectGatewayAttachmentsRequest\nDescribeDirectConnectGatewayAttachmentsResult\nDescribeDirectConnectGatewaysRequest\nDescribeDirectConnectGatewaysResult\nDescribeDirectoriesRequest\nDescribeDirectoriesResult\nDescribeDirectoryConfigsRequest\nDescribeDirectoryConfigsResult\nDescribeDiscovererRequest\nDescribeDiscovererResponse\nDescribeDiscoveryJobRequest\nDescribeDiscoveryJobResponse\nDescribeDocumentClassificationJobRequest\nDescribeDocumentClassificationJobResponse\nDescribeDocumentClassifierRequest\nDescribeDocumentClassifierResponse\nDescribeDocumentPermissionRequest\nDescribeDocumentPermissionResponse\nDescribeDocumentRequest\nDescribeDocumentResult\nDescribeDocumentVersionsRequest\nDescribeDocumentVersionsResponse\nDescribeDomainAutoTunesRequest\nDescribeDomainAutoTunesResponse\nDescribeDomainChangeProgressRequest\nDescribeDomainChangeProgressResponse\nDescribeDomainConfigRequest\nDescribeDomainConfigResponse\nDescribeDomainConfigurationRequest\nDescribeDomainConfigurationResponse\nDescribeDomainControllersRequest\nDescribeDomainControllersResult\nDescribeDomainEndpointOptionsRequest\nDescribeDomainEndpointOptionsResponse\nDescribeDomainHealthRequest\nDescribeDomainHealthResponse\nDescribeDomainInput\nDescribeDomainNodesRequest\nDescribeDomainNodesResponse\nDescribeDomainRequest\nDescribeDomainResponse\nDescribeDomainResult\nDescribeDomainsRequest\nDescribeDomainsResponse\nDescribeDominantLanguageDetectionJobRequest\nDescribeDominantLanguageDetectionJobResponse\nDescribeDraftAppVersionResourcesImportStatusRequest\nDescribeDraftAppVersionResourcesImportStatusResponse\nDescribeDryRunProgressRequest\nDescribeDryRunProgressResponse\nDescribeEC2InstanceLimitsInput\nDescribeEC2InstanceLimitsOutput\nDescribeEcsClustersRequest\nDescribeEcsClustersResult\nDescribeEdgeConfigurationInput\nDescribeEdgeConfigurationOutput\nDescribeEdgeDeploymentPlanRequest\nDescribeEdgeDeploymentPlanResponse\nDescribeEdgePackagingJobRequest\nDescribeEdgePackagingJobResponse\nDescribeEffectiveInstanceAssociationsRequest\nDescribeEffectiveInstanceAssociationsResult\nDescribeEffectivePatchesForPatchBaselineRequest\nDescribeEffectivePatchesForPatchBaselineResult\nDescribeEffectivePolicyRequest\nDescribeEffectivePolicyResponse\nDescribeEgressOnlyInternetGatewaysRequest\nDescribeEgressOnlyInternetGatewaysResult\nDescribeElasticGpusRequest\nDescribeElasticGpusResult\nDescribeElasticIpsRequest\nDescribeElasticIpsResult\nDescribeElasticLoadBalancersRequest\nDescribeElasticLoadBalancersResult\nDescribeElasticsearchDomainConfigRequest\nDescribeElasticsearchDomainConfigResponse\nDescribeElasticsearchDomainRequest\nDescribeElasticsearchDomainResponse\nDescribeElasticsearchDomainsRequest\nDescribeElasticsearchDomainsResponse\nDescribeElasticsearchInstanceTypeLimitsRequest\nDescribeElasticsearchInstanceTypeLimitsResponse\nDescribeEmailMonitoringConfigurationRequest\nDescribeEmailMonitoringConfigurationResponse\nDescribeEmergencyContactSettingsResponse\nDescribeEndPointStateInput\nDescribeEndPointStateOutput\nDescribeEndpointAccessMessage\nDescribeEndpointAuthorizationMessage\nDescribeEndpointConfigInput\nDescribeEndpointConfigOutput\nDescribeEndpointGroupRequest\nDescribeEndpointGroupResponse\nDescribeEndpointInput\nDescribeEndpointOutput\nDescribeEndpointRequest\nDescribeEndpointResponse\nDescribeEndpointSettingsMessage\nDescribeEndpointSettingsResponse\nDescribeEndpointTypesMessage\nDescribeEndpointTypesResponse\nDescribeEndpointsMessage\nDescribeEndpointsRequest\nDescribeEndpointsResponse\nDescribeEngagementRequest\nDescribeEngagementResult\nDescribeEngineDefaultClusterParametersMessage\nDescribeEngineDefaultClusterParametersResult\nDescribeEngineDefaultParametersMessage\nDescribeEngineDefaultParametersResult\nDescribeEngineVersionsMessage\nDescribeEngineVersionsRequest\nDescribeEngineVersionsResponse\nDescribeEntitiesDetectionJobRequest\nDescribeEntitiesDetectionJobResponse\nDescribeEntitiesDetectionV2JobRequest\nDescribeEntitiesDetectionV2JobResponse\nDescribeEntitlementsRequest\nDescribeEntitlementsResult\nDescribeEntityAggregatesForOrganizationRequest\nDescribeEntityAggregatesForOrganizationResponse\nDescribeEntityAggregatesRequest\nDescribeEntityAggregatesResponse\nDescribeEntityRecognizerRequest\nDescribeEntityRecognizerResponse\nDescribeEntityRequest\nDescribeEntityResponse\nDescribeEnvironmentHealthRequest\nDescribeEnvironmentHealthResult\nDescribeEnvironmentManagedActionHistoryRequest\nDescribeEnvironmentManagedActionHistoryResult\nDescribeEnvironmentManagedActionsRequest\nDescribeEnvironmentManagedActionsResult\nDescribeEnvironmentMembershipsRequest\nDescribeEnvironmentMembershipsResult\nDescribeEnvironmentResourcesMessage\nDescribeEnvironmentStatusRequest\nDescribeEnvironmentStatusResult\nDescribeEnvironmentsMessage\nDescribeEnvironmentsRequest\nDescribeEnvironmentsResult\nDescribeEphemerisRequest\nDescribeEphemerisResponse\nDescribeEvaluationFormRequest\nDescribeEvaluationFormResponse\nDescribeEvaluationsInput\nDescribeEvaluationsOutput\nDescribeEventAggregatesRequest\nDescribeEventAggregatesResponse\nDescribeEventBusRequest\nDescribeEventBusResponse\nDescribeEventCategoriesMessage\nDescribeEventCategoriesResponse\nDescribeEventConfigurationsResponse\nDescribeEventDetailsForOrganizationRequest\nDescribeEventDetailsForOrganizationResponse\nDescribeEventDetailsRequest\nDescribeEventDetailsResponse\nDescribeEventSourceRequest\nDescribeEventSourceResponse\nDescribeEventSourcesConfigResponse\nDescribeEventSubscriptionsMessage\nDescribeEventSubscriptionsResponse\nDescribeEventTopicsRequest\nDescribeEventTopicsResult\nDescribeEventTrackerRequest\nDescribeEventTrackerResponse\nDescribeEventTypesRequest\nDescribeEventTypesResponse\nDescribeEventsDetectionJobRequest\nDescribeEventsDetectionJobResponse\nDescribeEventsForOrganizationRequest\nDescribeEventsForOrganizationResponse\nDescribeEventsMessage\nDescribeEventsRequest\nDescribeEventsResponse\nDescribeExclusionsRequest\nDescribeExclusionsResponse\nDescribeExecutionInput\nDescribeExecutionOutput\nDescribeExecutionRequest\nDescribeExecutionResponse\nDescribeExperienceRequest\nDescribeExperienceResponse\nDescribeExperimentRequest\nDescribeExperimentResponse\nDescribeExplainabilityExportRequest\nDescribeExplainabilityExportResponse\nDescribeExplainabilityRequest\nDescribeExplainabilityResponse\nDescribeExportConfigurationsRequest\nDescribeExportConfigurationsResponse\nDescribeExportImageTasksRequest\nDescribeExportImageTasksResult\nDescribeExportInput\nDescribeExportOutput\nDescribeExportRequest\nDescribeExportResponse\nDescribeExportTasksMessage\nDescribeExportTasksRequest\nDescribeExportTasksResponse\nDescribeExportTasksResult\nDescribeExpressionsRequest\nDescribeExpressionsResponse\nDescribeExtensionPackAssociationsMessage\nDescribeExtensionPackAssociationsResponse\nDescribeFHIRDatastoreRequest\nDescribeFHIRDatastoreResponse\nDescribeFHIRExportJobRequest\nDescribeFHIRExportJobResponse\nDescribeFHIRImportJobRequest\nDescribeFHIRImportJobResponse\nDescribeFaqRequest\nDescribeFaqResponse\nDescribeFargateProfileRequest\nDescribeFargateProfileResponse\nDescribeFastLaunchImagesRequest\nDescribeFastLaunchImagesResult\nDescribeFastLaunchImagesSuccessItem\nDescribeFastSnapshotRestoreSuccessItem\nDescribeFastSnapshotRestoresRequest\nDescribeFastSnapshotRestoresResult\nDescribeFeatureGroupRequest\nDescribeFeatureGroupResponse\nDescribeFeatureMetadataRequest\nDescribeFeatureMetadataResponse\nDescribeFeatureTransformationRequest\nDescribeFeatureTransformationResponse\nDescribeFeaturedResultsSetRequest\nDescribeFeaturedResultsSetResponse\nDescribeFeedbackRequest\nDescribeFeedbackResponse\nDescribeFileCachesRequest\nDescribeFileCachesResponse\nDescribeFileSystemAliasesRequest\nDescribeFileSystemAliasesResponse\nDescribeFileSystemAssociationsInput\nDescribeFileSystemAssociationsOutput\nDescribeFileSystemPolicyRequest\nDescribeFileSystemsRequest\nDescribeFileSystemsResponse\nDescribeFilterRequest\nDescribeFilterResponse\nDescribeFindingsRequest\nDescribeFindingsResponse\nDescribeFirewallPolicyRequest\nDescribeFirewallPolicyResponse\nDescribeFirewallRequest\nDescribeFirewallResponse\nDescribeFleetAdvisorCollectorsRequest\nDescribeFleetAdvisorCollectorsResponse\nDescribeFleetAdvisorDatabasesRequest\nDescribeFleetAdvisorDatabasesResponse\nDescribeFleetAdvisorLsaAnalysisRequest\nDescribeFleetAdvisorLsaAnalysisResponse\nDescribeFleetAdvisorSchemaObjectSummaryRequest\nDescribeFleetAdvisorSchemaObjectSummaryResponse\nDescribeFleetAdvisorSchemasRequest\nDescribeFleetAdvisorSchemasResponse\nDescribeFleetAttributesInput\nDescribeFleetAttributesOutput\nDescribeFleetCapacityInput\nDescribeFleetCapacityOutput\nDescribeFleetError\nDescribeFleetEventsInput\nDescribeFleetEventsOutput\nDescribeFleetHistoryRequest\nDescribeFleetHistoryResult\nDescribeFleetInstancesRequest\nDescribeFleetInstancesResult\nDescribeFleetLocationAttributesInput\nDescribeFleetLocationAttributesOutput\nDescribeFleetLocationCapacityInput\nDescribeFleetLocationCapacityOutput\nDescribeFleetLocationUtilizationInput\nDescribeFleetLocationUtilizationOutput\nDescribeFleetMetadataRequest\nDescribeFleetMetadataResponse\nDescribeFleetMetricRequest\nDescribeFleetMetricResponse\nDescribeFleetPortSettingsInput\nDescribeFleetPortSettingsOutput\nDescribeFleetRequest\nDescribeFleetResponse\nDescribeFleetUtilizationInput\nDescribeFleetUtilizationOutput\nDescribeFleetsInstances\nDescribeFleetsRequest\nDescribeFleetsResult\nDescribeFlowDefinitionRequest\nDescribeFlowDefinitionResponse\nDescribeFlowExecutionRecordsRequest\nDescribeFlowExecutionRecordsResponse\nDescribeFlowLogsRequest\nDescribeFlowLogsResult\nDescribeFlowRequest\nDescribeFlowResponse\nDescribeFlywheelIterationRequest\nDescribeFlywheelIterationResponse\nDescribeFlywheelRequest\nDescribeFlywheelResponse\nDescribeFolderContentsRequest\nDescribeFolderContentsResponse\nDescribeFolderPermissionsRequest\nDescribeFolderPermissionsResponse\nDescribeFolderRequest\nDescribeFolderResolvedPermissionsRequest\nDescribeFolderResolvedPermissionsResponse\nDescribeFolderResponse\nDescribeForecastExportJobRequest\nDescribeForecastExportJobResponse\nDescribeForecastRequest\nDescribeForecastResponse\nDescribeFpgaImageAttributeRequest\nDescribeFpgaImageAttributeResult\nDescribeFpgaImagesRequest\nDescribeFpgaImagesResult\nDescribeFrameworkInput\nDescribeFrameworkOutput\nDescribeFraudsterRegistrationJobRequest\nDescribeFraudsterRegistrationJobResponse\nDescribeFraudsterRequest\nDescribeFraudsterResponse\nDescribeFunctionRequest\nDescribeFunctionResult\nDescribeGameServerGroupInput\nDescribeGameServerGroupOutput\nDescribeGameServerInput\nDescribeGameServerInstancesInput\nDescribeGameServerInstancesOutput\nDescribeGameServerOutput\nDescribeGameSessionDetailsInput\nDescribeGameSessionDetailsOutput\nDescribeGameSessionPlacementInput\nDescribeGameSessionPlacementOutput\nDescribeGameSessionQueuesInput\nDescribeGameSessionQueuesOutput\nDescribeGameSessionsInput\nDescribeGameSessionsOutput\nDescribeGatewayCapabilityConfigurationRequest\nDescribeGatewayCapabilityConfigurationResponse\nDescribeGatewayInformationInput\nDescribeGatewayInformationOutput\nDescribeGatewayInstanceRequest\nDescribeGatewayInstanceResponse\nDescribeGatewayRequest\nDescribeGatewayResponse\nDescribeGatewayRouteInput\nDescribeGatewayRouteOutput\nDescribeGeofenceCollectionRequest\nDescribeGeofenceCollectionResponse\nDescribeGlobalClustersMessage\nDescribeGlobalNetworksRequest\nDescribeGlobalNetworksResponse\nDescribeGlobalReplicationGroupsMessage\nDescribeGlobalReplicationGroupsResult\nDescribeGlobalSettingsOutput\nDescribeGlobalTableInput\nDescribeGlobalTableOutput\nDescribeGlobalTableSettingsInput\nDescribeGlobalTableSettingsOutput\nDescribeGroupMembershipRequest\nDescribeGroupMembershipResponse\nDescribeGroupRequest\nDescribeGroupResponse\nDescribeGroupsRequest\nDescribeGroupsResponse\nDescribeHandshakeRequest\nDescribeHandshakeResponse\nDescribeHapgRequest\nDescribeHapgResponse\nDescribeHarvestJobRequest\nDescribeHarvestJobResponse\nDescribeHealthServiceStatusForOrganizationResponse\nDescribeHomeRegionControlsRequest\nDescribeHomeRegionControlsResult\nDescribeHostKeyRequest\nDescribeHostKeyResponse\nDescribeHostReservationOfferingsRequest\nDescribeHostReservationOfferingsResult\nDescribeHostReservationsRequest\nDescribeHostReservationsResult\nDescribeHostedConnectionsRequest\nDescribeHostsRequest\nDescribeHostsResult\nDescribeHoursOfOperationRequest\nDescribeHoursOfOperationResponse\nDescribeHsmClientCertificatesMessage\nDescribeHsmConfigurationsMessage\nDescribeHsmRequest\nDescribeHsmResponse\nDescribeHubContentRequest\nDescribeHubContentResponse\nDescribeHubRequest\nDescribeHubResponse\nDescribeHumanLoopRequest\nDescribeHumanLoopResponse\nDescribeHumanTaskUiRequest\nDescribeHumanTaskUiResponse\nDescribeHyperParameterTuningJobRequest\nDescribeHyperParameterTuningJobResponse\nDescribeIAMPolicyAssignmentRequest\nDescribeIAMPolicyAssignmentResponse\nDescribeICD10CMInferenceJobRequest\nDescribeICD10CMInferenceJobResponse\nDescribeIamInstanceProfileAssociationsRequest\nDescribeIamInstanceProfileAssociationsResult\nDescribeIdFormatRequest\nDescribeIdFormatResult\nDescribeIdentityIdFormatRequest\nDescribeIdentityIdFormatResult\nDescribeIdentityInput\nDescribeIdentityPoolInput\nDescribeIdentityPoolUsageRequest\nDescribeIdentityPoolUsageResponse\nDescribeIdentityProviderConfigRequest\nDescribeIdentityProviderConfigResponse\nDescribeIdentityProviderConfigurationRequest\nDescribeIdentityProviderConfigurationResponse\nDescribeIdentityProviderRequest\nDescribeIdentityProviderResponse\nDescribeIdentityUsageRequest\nDescribeIdentityUsageResponse\nDescribeImageAttributeRequest\nDescribeImageBuildersRequest\nDescribeImageBuildersResult\nDescribeImageGenerationConfigurationInput\nDescribeImageGenerationConfigurationOutput\nDescribeImagePermissionsRequest\nDescribeImagePermissionsResult\nDescribeImageReplicationStatusRequest\nDescribeImageReplicationStatusResponse\nDescribeImageRequest\nDescribeImageResponse\nDescribeImageScanFindingsRequest\nDescribeImageScanFindingsResponse\nDescribeImageTagsRequest\nDescribeImageTagsResponse\nDescribeImageVersionRequest\nDescribeImageVersionResponse\nDescribeImagesFilter\nDescribeImagesRequest\nDescribeImagesResponse\nDescribeImagesResult\nDescribeImportImageTasksRequest\nDescribeImportImageTasksResult\nDescribeImportInput\nDescribeImportOutput\nDescribeImportRequest\nDescribeImportResponse\nDescribeImportSnapshotTasksRequest\nDescribeImportSnapshotTasksResult\nDescribeImportTasksRequest\nDescribeImportTasksResponse\nDescribeInboundConnectionsRequest\nDescribeInboundConnectionsResponse\nDescribeInboundCrossClusterSearchConnectionsRequest\nDescribeInboundCrossClusterSearchConnectionsResponse\nDescribeInboundDmarcSettingsRequest\nDescribeInboundDmarcSettingsResponse\nDescribeIndexFieldsRequest\nDescribeIndexFieldsResponse\nDescribeIndexRequest\nDescribeIndexResponse\nDescribeInferenceExperimentRequest\nDescribeInferenceExperimentResponse\nDescribeInferenceRecommendationsJobRequest\nDescribeInferenceRecommendationsJobResponse\nDescribeInferenceSchedulerRequest\nDescribeInferenceSchedulerResponse\nDescribeIngestionRequest\nDescribeIngestionResponse\nDescribeInputDeviceRequest\nDescribeInputDeviceResponse\nDescribeInputDeviceThumbnailRequest\nDescribeInputDeviceThumbnailResponse\nDescribeInputRequest\nDescribeInputResponse\nDescribeInputSecurityGroupRequest\nDescribeInputSecurityGroupResponse\nDescribeInsightRequest\nDescribeInsightResponse\nDescribeInsightRulesInput\nDescribeInsightRulesOutput\nDescribeInstanceAccessControlAttributeConfigurationRequest\nDescribeInstanceAccessControlAttributeConfigurationResponse\nDescribeInstanceAssociationsStatusRequest\nDescribeInstanceAssociationsStatusResult\nDescribeInstanceAttributeRequest\nDescribeInstanceAttributeResponse\nDescribeInstanceConnectEndpointsRequest\nDescribeInstanceConnectEndpointsResult\nDescribeInstanceCreditSpecificationsRequest\nDescribeInstanceCreditSpecificationsResult\nDescribeInstanceEventNotificationAttributesRequest\nDescribeInstanceEventNotificationAttributesResult\nDescribeInstanceEventWindowsRequest\nDescribeInstanceEventWindowsResult\nDescribeInstanceInformationRequest\nDescribeInstanceInformationResult\nDescribeInstancePatchStatesForPatchGroupRequest\nDescribeInstancePatchStatesForPatchGroupResult\nDescribeInstancePatchStatesRequest\nDescribeInstancePatchStatesResult\nDescribeInstancePatchesRequest\nDescribeInstancePatchesResult\nDescribeInstanceProfilesMessage\nDescribeInstanceProfilesResponse\nDescribeInstanceRefreshesAnswer\nDescribeInstanceRefreshesType\nDescribeInstanceRequest\nDescribeInstanceResponse\nDescribeInstanceStatusRequest\nDescribeInstanceStatusResult\nDescribeInstanceStorageConfigRequest\nDescribeInstanceStorageConfigResponse\nDescribeInstanceTypeLimitsRequest\nDescribeInstanceTypeLimitsResponse\nDescribeInstanceTypeOfferingsRequest\nDescribeInstanceTypeOfferingsResult\nDescribeInstanceTypesRequest\nDescribeInstanceTypesResult\nDescribeInstancesHealthRequest\nDescribeInstancesHealthResult\nDescribeInstancesInput\nDescribeInstancesOutput\nDescribeInstancesRequest\nDescribeInstancesResult\nDescribeIntentRequest\nDescribeIntentResponse\nDescribeInterconnectLoaRequest\nDescribeInterconnectLoaResponse\nDescribeInterconnectsRequest\nDescribeInternetGatewaysRequest\nDescribeInternetGatewaysResult\nDescribeInventoryDeletionsRequest\nDescribeInventoryDeletionsResult\nDescribeIpGroupsRequest\nDescribeIpGroupsResult\nDescribeIpRestrictionRequest\nDescribeIpRestrictionResponse\nDescribeIpamPoolsRequest\nDescribeIpamPoolsResult\nDescribeIpamResourceDiscoveriesRequest\nDescribeIpamResourceDiscoveriesResult\nDescribeIpamResourceDiscoveryAssociationsRequest\nDescribeIpamResourceDiscoveryAssociationsResult\nDescribeIpamScopesRequest\nDescribeIpamScopesResult\nDescribeIpamsRequest\nDescribeIpamsResult\nDescribeIpv6PoolsRequest\nDescribeIpv6PoolsResult\nDescribeJobDefinitionsRequest\nDescribeJobDefinitionsResponse\nDescribeJobExecutionRequest\nDescribeJobExecutionResponse\nDescribeJobFlowsInput\nDescribeJobFlowsOutput\nDescribeJobInput\nDescribeJobLogItemsRequest\nDescribeJobLogItemsResponse\nDescribeJobQueuesRequest\nDescribeJobQueuesResponse\nDescribeJobRequest\nDescribeJobResponse\nDescribeJobResult\nDescribeJobRunRequest\nDescribeJobRunResponse\nDescribeJobTemplateRequest\nDescribeJobTemplateResponse\nDescribeJobsRequest\nDescribeJobsRequestFilters\nDescribeJobsResponse\nDescribeJournalKinesisStreamRequest\nDescribeJournalKinesisStreamResponse\nDescribeJournalS3ExportRequest\nDescribeJournalS3ExportResponse\nDescribeKeyPairsRequest\nDescribeKeyPairsResult\nDescribeKeyPhrasesDetectionJobRequest\nDescribeKeyPhrasesDetectionJobResponse\nDescribeKeyRequest\nDescribeKeyResponse\nDescribeKeywordsRequest\nDescribeKeywordsResult\nDescribeKinesisStreamingDestinationInput\nDescribeKinesisStreamingDestinationOutput\nDescribeLDAPSSettingsRequest\nDescribeLDAPSSettingsResult\nDescribeLabelGroupRequest\nDescribeLabelGroupResponse\nDescribeLabelRequest\nDescribeLabelResponse\nDescribeLabelingJobRequest\nDescribeLabelingJobResponse\nDescribeLagsRequest\nDescribeLanguageModelRequest\nDescribeLanguageModelResponse\nDescribeLaunchConfigurationTemplatesRequest\nDescribeLaunchConfigurationTemplatesResponse\nDescribeLaunchTemplateVersionsRequest\nDescribeLaunchTemplateVersionsResult\nDescribeLaunchTemplatesRequest\nDescribeLaunchTemplatesResult\nDescribeLayersRequest\nDescribeLayersResult\nDescribeLedgerRequest\nDescribeLedgerResponse\nDescribeLifecycleConfigurationRequest\nDescribeLifecycleHookTypesAnswer\nDescribeLifecycleHooksAnswer\nDescribeLifecycleHooksType\nDescribeLimitsOutput\nDescribeLineageGroupRequest\nDescribeLineageGroupResponse\nDescribeListenerCertificatesInput\nDescribeListenerCertificatesOutput\nDescribeListenerRequest\nDescribeListenerResponse\nDescribeListenersInput\nDescribeListenersOutput\nDescribeLiveSourceRequest\nDescribeLiveSourceResponse\nDescribeLoaRequest\nDescribeLoadBalancerAttributesInput\nDescribeLoadBalancerAttributesOutput\nDescribeLoadBalancerPoliciesInput\nDescribeLoadBalancerPoliciesOutput\nDescribeLoadBalancerPolicyTypesInput\nDescribeLoadBalancerPolicyTypesOutput\nDescribeLoadBalancerTargetGroupsRequest\nDescribeLoadBalancerTargetGroupsResponse\nDescribeLoadBalancersInput\nDescribeLoadBalancersOutput\nDescribeLoadBalancersRequest\nDescribeLoadBalancersResponse\nDescribeLoadBasedAutoScalingRequest\nDescribeLoadBasedAutoScalingResult\nDescribeLocalGatewayRouteTableVirtualInterfaceGroupAssociationsRequest\nDescribeLocalGatewayRouteTableVirtualInterfaceGroupAssociationsResult\nDescribeLocalGatewayRouteTableVpcAssociationsRequest\nDescribeLocalGatewayRouteTableVpcAssociationsResult\nDescribeLocalGatewayRouteTablesRequest\nDescribeLocalGatewayRouteTablesResult\nDescribeLocalGatewayVirtualInterfaceGroupsRequest\nDescribeLocalGatewayVirtualInterfaceGroupsResult\nDescribeLocalGatewayVirtualInterfacesRequest\nDescribeLocalGatewayVirtualInterfacesResult\nDescribeLocalGatewaysRequest\nDescribeLocalGatewaysResult\nDescribeLocationAzureBlobRequest\nDescribeLocationAzureBlobResponse\nDescribeLocationEfsRequest\nDescribeLocationEfsResponse\nDescribeLocationFsxLustreRequest\nDescribeLocationFsxLustreResponse\nDescribeLocationFsxOntapRequest\nDescribeLocationFsxOntapResponse\nDescribeLocationFsxOpenZfsRequest\nDescribeLocationFsxOpenZfsResponse\nDescribeLocationFsxWindowsRequest\nDescribeLocationFsxWindowsResponse\nDescribeLocationHdfsRequest\nDescribeLocationHdfsResponse\nDescribeLocationNfsRequest\nDescribeLocationNfsResponse\nDescribeLocationObjectStorageRequest\nDescribeLocationObjectStorageResponse\nDescribeLocationS3Request\nDescribeLocationS3Response\nDescribeLocationSmbRequest\nDescribeLocationSmbResponse\nDescribeLogGroupsRequest\nDescribeLogGroupsResponse\nDescribeLogPatternRequest\nDescribeLogPatternResponse\nDescribeLogStreamsRequest\nDescribeLogStreamsResponse\nDescribeLoggingConfigurationRequest\nDescribeLoggingConfigurationResponse\nDescribeLoggingOptionsResponse\nDescribeLoggingStatusMessage\nDescribeLunaClientRequest\nDescribeLunaClientResponse\nDescribeMLModelsInput\nDescribeMLModelsOutput\nDescribeMailboxExportJobRequest\nDescribeMailboxExportJobResponse\nDescribeMaintenanceStartTimeInput\nDescribeMaintenanceStartTimeOutput\nDescribeMaintenanceWindowExecutionTaskInvocationsRequest\nDescribeMaintenanceWindowExecutionTaskInvocationsResult\nDescribeMaintenanceWindowExecutionTasksRequest\nDescribeMaintenanceWindowExecutionTasksResult\nDescribeMaintenanceWindowExecutionsRequest\nDescribeMaintenanceWindowExecutionsResult\nDescribeMaintenanceWindowScheduleRequest\nDescribeMaintenanceWindowScheduleResult\nDescribeMaintenanceWindowTargetsRequest\nDescribeMaintenanceWindowTargetsResult\nDescribeMaintenanceWindowTasksRequest\nDescribeMaintenanceWindowTasksResult\nDescribeMaintenanceWindowsForTargetRequest\nDescribeMaintenanceWindowsForTargetResult\nDescribeMaintenanceWindowsRequest\nDescribeMaintenanceWindowsResult\nDescribeMalwareScansRequest\nDescribeMalwareScansResponse\nDescribeManagedEndpointRequest\nDescribeManagedEndpointResponse\nDescribeManagedJobTemplateRequest\nDescribeManagedJobTemplateResponse\nDescribeManagedPrefixListsRequest\nDescribeManagedPrefixListsResult\nDescribeManagedProductsByVendorRequest\nDescribeManagedProductsByVendorResponse\nDescribeManagedRuleGroupRequest\nDescribeManagedRuleGroupResponse\nDescribeMapRequest\nDescribeMapResponse\nDescribeMapRunInput\nDescribeMapRunOutput\nDescribeMappedResourceConfigurationInput\nDescribeMappedResourceConfigurationOutput\nDescribeMatchmakingConfigurationsInput\nDescribeMatchmakingConfigurationsOutput\nDescribeMatchmakingInput\nDescribeMatchmakingOutput\nDescribeMatchmakingRuleSetsInput\nDescribeMatchmakingRuleSetsOutput\nDescribeMediaStorageConfigurationInput\nDescribeMediaStorageConfigurationOutput\nDescribeMergeConflictsInput\nDescribeMergeConflictsOutput\nDescribeMeshInput\nDescribeMeshOutput\nDescribeMetadataModelAssessmentsMessage\nDescribeMetadataModelAssessmentsResponse\nDescribeMetadataModelConversionsMessage\nDescribeMetadataModelConversionsResponse\nDescribeMetadataModelExportsAsScriptMessage\nDescribeMetadataModelExportsAsScriptResponse\nDescribeMetadataModelExportsToTargetMessage\nDescribeMetadataModelExportsToTargetResponse\nDescribeMetadataModelImportsMessage\nDescribeMetadataModelImportsResponse\nDescribeMetricAttributionRequest\nDescribeMetricAttributionResponse\nDescribeMetricCollectionTypesAnswer\nDescribeMetricFiltersRequest\nDescribeMetricFiltersResponse\nDescribeMetricSetRequest\nDescribeMetricSetResponse\nDescribeMigrationProjectsMessage\nDescribeMigrationProjectsResponse\nDescribeMigrationTaskRequest\nDescribeMigrationTaskResult\nDescribeMitigationActionRequest\nDescribeMitigationActionResponse\nDescribeModelBiasJobDefinitionRequest\nDescribeModelBiasJobDefinitionResponse\nDescribeModelCardExportJobRequest\nDescribeModelCardExportJobResponse\nDescribeModelCardRequest\nDescribeModelCardResponse\nDescribeModelExplainabilityJobDefinitionRequest\nDescribeModelExplainabilityJobDefinitionResponse\nDescribeModelInput\nDescribeModelOutput\nDescribeModelPackageGroupInput\nDescribeModelPackageGroupOutput\nDescribeModelPackageInput\nDescribeModelPackageOutput\nDescribeModelPackagingJobRequest\nDescribeModelPackagingJobResponse\nDescribeModelQualityJobDefinitionRequest\nDescribeModelQualityJobDefinitionResponse\nDescribeModelRequest\nDescribeModelResponse\nDescribeModelVersionRequest\nDescribeModelVersionResponse\nDescribeModelVersionsRequest\nDescribeModelVersionsResult\nDescribeMonitorRequest\nDescribeMonitorResponse\nDescribeMonitoringScheduleRequest\nDescribeMonitoringScheduleResponse\nDescribeMountTargetSecurityGroupsRequest\nDescribeMountTargetSecurityGroupsResponse\nDescribeMountTargetsRequest\nDescribeMountTargetsResponse\nDescribeMovingAddressesRequest\nDescribeMovingAddressesResult\nDescribeMultiRegionAccessPointOperationRequest\nDescribeMultiRegionAccessPointOperationResult\nDescribeMultiplexProgramRequest\nDescribeMultiplexProgramResponse\nDescribeMultiplexRequest\nDescribeMultiplexResponse\nDescribeMyUserProfileResult\nDescribeNFSFileSharesInput\nDescribeNFSFileSharesOutput\nDescribeNamespaceRequest\nDescribeNamespaceResponse\nDescribeNatGatewaysRequest\nDescribeNatGatewaysResult\nDescribeNetworkAclsRequest\nDescribeNetworkAclsResult\nDescribeNetworkInsightsAccessScopeAnalysesRequest\nDescribeNetworkInsightsAccessScopeAnalysesResult\nDescribeNetworkInsightsAccessScopesRequest\nDescribeNetworkInsightsAccessScopesResult\nDescribeNetworkInsightsAnalysesRequest\nDescribeNetworkInsightsAnalysesResult\nDescribeNetworkInsightsPathsRequest\nDescribeNetworkInsightsPathsResult\nDescribeNetworkInterfaceAttributeRequest\nDescribeNetworkInterfaceAttributeResult\nDescribeNetworkInterfacePermissionsRequest\nDescribeNetworkInterfacePermissionsResult\nDescribeNetworkInterfacesRequest\nDescribeNetworkInterfacesResult\nDescribeNodeAssociationStatusRequest\nDescribeNodeAssociationStatusResponse\nDescribeNodeConfigurationOptionsMessage\nDescribeNodeFromTemplateJobRequest\nDescribeNodeFromTemplateJobResponse\nDescribeNodeRequest\nDescribeNodeResponse\nDescribeNodegroupRequest\nDescribeNodegroupResponse\nDescribeNotebookExecutionInput\nDescribeNotebookExecutionOutput\nDescribeNotebookInstanceInput\nDescribeNotebookInstanceLifecycleConfigInput\nDescribeNotebookInstanceLifecycleConfigOutput\nDescribeNotebookInstanceOutput\nDescribeNotificationConfigurationInput\nDescribeNotificationConfigurationOutput\nDescribeNotificationConfigurationsAnswer\nDescribeNotificationConfigurationsType\nDescribeNotificationRuleRequest\nDescribeNotificationRuleResult\nDescribeNotificationSubscriptionsRequest\nDescribeNotificationSubscriptionsResponse\nDescribeNotificationsForBudgetRequest\nDescribeNotificationsForBudgetResponse\nDescribeObjectRequest\nDescribeObjectResponse\nDescribeObjectsInput\nDescribeObjectsOutput\nDescribeObservabilityConfigurationRequest\nDescribeObservabilityConfigurationResponse\nDescribeObservationRequest\nDescribeObservationResponse\nDescribeOfferingRequest\nDescribeOfferingResponse\nDescribeOperatingSystemsResponse\nDescribeOpsItemsRequest\nDescribeOpsItemsResponse\nDescribeOptOutListsRequest\nDescribeOptOutListsResult\nDescribeOptedOutNumbersRequest\nDescribeOptedOutNumbersResult\nDescribeOptionGroupOptionsMessage\nDescribeOptionGroupsMessage\nDescribeOrderableClusterOptionsMessage\nDescribeOrderableDBInstanceOptionsMessage\nDescribeOrderableReplicationInstancesMessage\nDescribeOrderableReplicationInstancesResponse\nDescribeOrganizationConfigRuleStatusesRequest\nDescribeOrganizationConfigRuleStatusesResponse\nDescribeOrganizationConfigRulesRequest\nDescribeOrganizationConfigRulesResponse\nDescribeOrganizationConfigurationRequest\nDescribeOrganizationConfigurationResponse\nDescribeOrganizationConformancePackStatusesRequest\nDescribeOrganizationConformancePackStatusesResponse\nDescribeOrganizationConformancePacksRequest\nDescribeOrganizationConformancePacksResponse\nDescribeOrganizationHealthRequest\nDescribeOrganizationHealthResponse\nDescribeOrganizationOverviewRequest\nDescribeOrganizationOverviewResponse\nDescribeOrganizationRequest\nDescribeOrganizationResourceCollectionHealthRequest\nDescribeOrganizationResourceCollectionHealthResponse\nDescribeOrganizationResponse\nDescribeOrganizationalUnitRequest\nDescribeOrganizationalUnitResponse\nDescribeOrganizationsAccessInput\nDescribeOrganizationsAccessOutput\nDescribeOriginEndpointRequest\nDescribeOriginEndpointResponse\nDescribeOutboundConnectionsRequest\nDescribeOutboundConnectionsResponse\nDescribeOutboundCrossClusterSearchConnectionsRequest\nDescribeOutboundCrossClusterSearchConnectionsResponse\nDescribePHIDetectionJobRequest\nDescribePHIDetectionJobResponse\nDescribePackageImportJobRequest\nDescribePackageImportJobResponse\nDescribePackageRequest\nDescribePackageResponse\nDescribePackageResult\nDescribePackageVersionRequest\nDescribePackageVersionResponse\nDescribePackageVersionResult\nDescribePackagesFilter\nDescribePackagesRequest\nDescribePackagesResponse\nDescribePackagingConfigurationRequest\nDescribePackagingConfigurationResponse\nDescribePackagingGroupRequest\nDescribePackagingGroupResponse\nDescribePageRequest\nDescribePageResult\nDescribeParameterGroupsRequest\nDescribeParameterGroupsResponse\nDescribeParametersRequest\nDescribeParametersResponse\nDescribeParametersResult\nDescribePartnerEventSourceRequest\nDescribePartnerEventSourceResponse\nDescribePartnersInputMessage\nDescribePartnersOutputMessage\nDescribePatchBaselinesRequest\nDescribePatchBaselinesResult\nDescribePatchGroupStateRequest\nDescribePatchGroupStateResult\nDescribePatchGroupsRequest\nDescribePatchGroupsResult\nDescribePatchPropertiesRequest\nDescribePatchPropertiesResult\nDescribePendingAggregationRequestsRequest\nDescribePendingAggregationRequestsResponse\nDescribePendingMaintenanceActionsMessage\nDescribePendingMaintenanceActionsResponse\nDescribePermissionSetProvisioningStatusRequest\nDescribePermissionSetProvisioningStatusResponse\nDescribePermissionSetRequest\nDescribePermissionSetResponse\nDescribePermissionsRequest\nDescribePermissionsResult\nDescribePhoneNumberRequest\nDescribePhoneNumberResponse\nDescribePhoneNumbersRequest\nDescribePhoneNumbersResult\nDescribePiiEntitiesDetectionJobRequest\nDescribePiiEntitiesDetectionJobResponse\nDescribePipeRequest\nDescribePipeResponse\nDescribePipelineDefinitionForExecutionRequest\nDescribePipelineDefinitionForExecutionResponse\nDescribePipelineExecutionRequest\nDescribePipelineExecutionResponse\nDescribePipelineRequest\nDescribePipelineResponse\nDescribePipelinesInput\nDescribePipelinesOutput\nDescribePlaceIndexRequest\nDescribePlaceIndexResponse\nDescribePlacementGroupsRequest\nDescribePlacementGroupsResult\nDescribePlacementRequest\nDescribePlacementResponse\nDescribePlatformVersionRequest\nDescribePlatformVersionResult\nDescribePlayerSessionsInput\nDescribePlayerSessionsOutput\nDescribePoliciesType\nDescribePolicyRequest\nDescribePolicyResponse\nDescribePoolsRequest\nDescribePoolsResult\nDescribePortalRequest\nDescribePortalResponse\nDescribePortfolioInput\nDescribePortfolioOutput\nDescribePortfolioShareStatusInput\nDescribePortfolioShareStatusOutput\nDescribePortfolioSharesInput\nDescribePortfolioSharesOutput\nDescribePredictorBacktestExportJobRequest\nDescribePredictorBacktestExportJobResponse\nDescribePredictorRequest\nDescribePredictorResponse\nDescribePrefixListsRequest\nDescribePrefixListsResult\nDescribePrincipalIdFormatRequest\nDescribePrincipalIdFormatResult\nDescribePrincipalMappingRequest\nDescribePrincipalMappingResponse\nDescribeProblemObservationsRequest\nDescribeProblemObservationsResponse\nDescribeProblemRequest\nDescribeProblemResponse\nDescribeProcessingJobRequest\nDescribeProcessingJobResponse\nDescribeProductAsAdminInput\nDescribeProductAsAdminOutput\nDescribeProductInput\nDescribeProductOutput\nDescribeProductViewInput\nDescribeProductViewOutput\nDescribeProductsRequest\nDescribeProductsResponse\nDescribeProfileRequest\nDescribeProfileResponse\nDescribeProfilingGroupRequest\nDescribeProfilingGroupResponse\nDescribeProgramRequest\nDescribeProgramResponse\nDescribeProjectInput\nDescribeProjectOutput\nDescribeProjectRequest\nDescribeProjectResponse\nDescribeProjectResult\nDescribeProjectVersionsRequest\nDescribeProjectVersionsResponse\nDescribeProjectsRequest\nDescribeProjectsResponse\nDescribePromptRequest\nDescribePromptResponse\nDescribeProtectedResourceInput\nDescribeProtectedResourceOutput\nDescribeProtectionGroupRequest\nDescribeProtectionGroupResponse\nDescribeProtectionRequest\nDescribeProtectionResponse\nDescribeProvisionedProductInput\nDescribeProvisionedProductOutput\nDescribeProvisionedProductPlanInput\nDescribeProvisionedProductPlanOutput\nDescribeProvisioningArtifactInput\nDescribeProvisioningArtifactOutput\nDescribeProvisioningParametersInput\nDescribeProvisioningParametersOutput\nDescribeProvisioningTemplateRequest\nDescribeProvisioningTemplateResponse\nDescribeProvisioningTemplateVersionRequest\nDescribeProvisioningTemplateVersionResponse\nDescribePublicIpv4PoolsRequest\nDescribePublicIpv4PoolsResult\nDescribePublisherInput\nDescribePublisherOutput\nDescribePublishingDestinationRequest\nDescribePublishingDestinationResponse\nDescribePullRequestEventsInput\nDescribePullRequestEventsOutput\nDescribePullThroughCacheRulesRequest\nDescribePullThroughCacheRulesResponse\nDescribeQueriesRequest\nDescribeQueriesResponse\nDescribeQueryDefinitionsRequest\nDescribeQueryDefinitionsResponse\nDescribeQueryRequest\nDescribeQueryResponse\nDescribeQuerySuggestionsBlockListRequest\nDescribeQuerySuggestionsBlockListResponse\nDescribeQuerySuggestionsConfigRequest\nDescribeQuerySuggestionsConfigResponse\nDescribeQueueRequest\nDescribeQueueResponse\nDescribeQuickConnectRequest\nDescribeQuickConnectResponse\nDescribeRaidArraysRequest\nDescribeRaidArraysResult\nDescribeRdsDbInstancesRequest\nDescribeRdsDbInstancesResult\nDescribeReceiptRuleRequest\nDescribeReceiptRuleResponse\nDescribeReceiptRuleSetRequest\nDescribeReceiptRuleSetResponse\nDescribeRecipeRequest\nDescribeRecipeResponse\nDescribeRecommendationExportJobsRequest\nDescribeRecommendationExportJobsResponse\nDescribeRecommendationFeedbackRequest\nDescribeRecommendationFeedbackResponse\nDescribeRecommendationLimitationsRequest\nDescribeRecommendationLimitationsResponse\nDescribeRecommendationsRequest\nDescribeRecommendationsResponse\nDescribeRecommenderRequest\nDescribeRecommenderResponse\nDescribeRecordInput\nDescribeRecordOutput\nDescribeRecoveryInstancesRequest\nDescribeRecoveryInstancesRequestFilters\nDescribeRecoveryInstancesResponse\nDescribeRecoveryPointInput\nDescribeRecoveryPointOutput\nDescribeRecoverySnapshotsRequest\nDescribeRecoverySnapshotsRequestFilters\nDescribeRecoverySnapshotsResponse\nDescribeRefreshScheduleRequest\nDescribeRefreshScheduleResponse\nDescribeRefreshSchemasStatusMessage\nDescribeRefreshSchemasStatusResponse\nDescribeRegionSettingsOutput\nDescribeRegionsRequest\nDescribeRegionsResult\nDescribeRegistriesRequest\nDescribeRegistriesResponse\nDescribeRegistryRequest\nDescribeRegistryResponse\nDescribeReleaseLabelInput\nDescribeReleaseLabelOutput\nDescribeRemediationConfigurationsRequest\nDescribeRemediationConfigurationsResponse\nDescribeRemediationExceptionsRequest\nDescribeRemediationExceptionsResponse\nDescribeRemediationExecutionStatusRequest\nDescribeRemediationExecutionStatusResponse\nDescribeReplaceRootVolumeTasksRequest\nDescribeReplaceRootVolumeTasksResult\nDescribeReplayRequest\nDescribeReplayResponse\nDescribeReplicationConfigsMessage\nDescribeReplicationConfigsResponse\nDescribeReplicationConfigurationTemplatesRequest\nDescribeReplicationConfigurationTemplatesResponse\nDescribeReplicationConfigurationsRequest\nDescribeReplicationConfigurationsResponse\nDescribeReplicationGroupsMessage\nDescribeReplicationInstanceTaskLogsMessage\nDescribeReplicationInstanceTaskLogsResponse\nDescribeReplicationInstancesMessage\nDescribeReplicationInstancesResponse\nDescribeReplicationSubnetGroupsMessage\nDescribeReplicationSubnetGroupsResponse\nDescribeReplicationTableStatisticsMessage\nDescribeReplicationTableStatisticsResponse\nDescribeReplicationTaskAssessmentResultsMessage\nDescribeReplicationTaskAssessmentResultsResponse\nDescribeReplicationTaskAssessmentRunsMessage\nDescribeReplicationTaskAssessmentRunsResponse\nDescribeReplicationTaskIndividualAssessmentsMessage\nDescribeReplicationTaskIndividualAssessmentsResponse\nDescribeReplicationTasksMessage\nDescribeReplicationTasksResponse\nDescribeReplicationsMessage\nDescribeReplicationsResponse\nDescribeReportCreationOutput\nDescribeReportDefinitionsRequest\nDescribeReportDefinitionsResponse\nDescribeReportJobInput\nDescribeReportJobOutput\nDescribeReportPlanInput\nDescribeReportPlanOutput\nDescribeRepositoriesRequest\nDescribeRepositoriesResponse\nDescribeRepositoryAssociationRequest\nDescribeRepositoryAssociationResponse\nDescribeRepositoryRequest\nDescribeRepositoryResult\nDescribeRescoreExecutionPlanRequest\nDescribeRescoreExecutionPlanResponse\nDescribeReservationRequest\nDescribeReservationResponse\nDescribeReservedCacheNodesMessage\nDescribeReservedCacheNodesOfferingsMessage\nDescribeReservedDBInstancesMessage\nDescribeReservedDBInstancesOfferingsMessage\nDescribeReservedElasticsearchInstanceOfferingsRequest\nDescribeReservedElasticsearchInstanceOfferingsResponse\nDescribeReservedElasticsearchInstancesRequest\nDescribeReservedElasticsearchInstancesResponse\nDescribeReservedInstanceOfferingsRequest\nDescribeReservedInstanceOfferingsResponse\nDescribeReservedInstancesListingsRequest\nDescribeReservedInstancesListingsResult\nDescribeReservedInstancesModificationsRequest\nDescribeReservedInstancesModificationsResult\nDescribeReservedInstancesOfferingsRequest\nDescribeReservedInstancesOfferingsResult\nDescribeReservedInstancesRequest\nDescribeReservedInstancesResponse\nDescribeReservedInstancesResult\nDescribeReservedNodeExchangeStatusInputMessage\nDescribeReservedNodeExchangeStatusOutputMessage\nDescribeReservedNodeOfferingsMessage\nDescribeReservedNodesMessage\nDescribeReservedNodesOfferingsRequest\nDescribeReservedNodesOfferingsResponse\nDescribeReservedNodesRequest\nDescribeReservedNodesResponse\nDescribeResiliencyPolicyRequest\nDescribeResiliencyPolicyResponse\nDescribeResizeMessage\nDescribeResourceCollectionHealthRequest\nDescribeResourceCollectionHealthResponse\nDescribeResourceGroupsRequest\nDescribeResourceGroupsResponse\nDescribeResourcePermissionsRequest\nDescribeResourcePermissionsResponse\nDescribeResourcePoliciesRequest\nDescribeResourcePoliciesResponse\nDescribeResourcePolicyRequest\nDescribeResourcePolicyResponse\nDescribeResourceRequest\nDescribeResourceResponse\nDescribeResourceServerRequest\nDescribeResourceServerResponse\nDescribeRestoreJobInput\nDescribeRestoreJobOutput\nDescribeRetentionConfigurationsRequest\nDescribeRetentionConfigurationsResponse\nDescribeRetrainingSchedulerRequest\nDescribeRetrainingSchedulerResponse\nDescribeReturnShippingLabelRequest\nDescribeReturnShippingLabelResult\nDescribeRiskConfigurationRequest\nDescribeRiskConfigurationResponse\nDescribeRobotApplicationRequest\nDescribeRobotApplicationResponse\nDescribeRobotRequest\nDescribeRobotResponse\nDescribeRoleAliasRequest\nDescribeRoleAliasResponse\nDescribeRootFoldersRequest\nDescribeRootFoldersResponse\nDescribeRouteCalculatorRequest\nDescribeRouteCalculatorResponse\nDescribeRouteInput\nDescribeRouteOutput\nDescribeRouteTablesRequest\nDescribeRouteTablesResult\nDescribeRouterConfigurationRequest\nDescribeRouterConfigurationResponse\nDescribeRoutingControlRequest\nDescribeRoutingControlResponse\nDescribeRoutingProfileRequest\nDescribeRoutingProfileResponse\nDescribeRuleGroupMetadataRequest\nDescribeRuleGroupMetadataResponse\nDescribeRuleGroupRequest\nDescribeRuleGroupResponse\nDescribeRuleGroupsNamespaceRequest\nDescribeRuleGroupsNamespaceResponse\nDescribeRuleRequest\nDescribeRuleResponse\nDescribeRulesInput\nDescribeRulesOutput\nDescribeRulesPackagesRequest\nDescribeRulesPackagesResponse\nDescribeRulesetRequest\nDescribeRulesetResponse\nDescribeRuntimeConfigurationInput\nDescribeRuntimeConfigurationOutput\nDescribeRuntimeVersionsRequest\nDescribeRuntimeVersionsResponse\nDescribeRxNormInferenceJobRequest\nDescribeRxNormInferenceJobResponse\nDescribeSMBFileSharesInput\nDescribeSMBFileSharesOutput\nDescribeSMBSettingsInput\nDescribeSMBSettingsOutput\nDescribeSNOMEDCTInferenceJobRequest\nDescribeSNOMEDCTInferenceJobResponse\nDescribeSSLPoliciesInput\nDescribeSSLPoliciesOutput\nDescribeSafetyRuleRequest\nDescribeSafetyRuleResponse\nDescribeSavingsPlanRatesRequest\nDescribeSavingsPlanRatesResponse\nDescribeSavingsPlansOfferingRatesRequest\nDescribeSavingsPlansOfferingRatesResponse\nDescribeSavingsPlansOfferingsRequest\nDescribeSavingsPlansOfferingsResponse\nDescribeSavingsPlansRequest\nDescribeSavingsPlansResponse\nDescribeScalableTargetsRequest\nDescribeScalableTargetsResponse\nDescribeScalingActivitiesRequest\nDescribeScalingActivitiesResponse\nDescribeScalingActivitiesType\nDescribeScalingParametersRequest\nDescribeScalingParametersResponse\nDescribeScalingPlanResourcesRequest\nDescribeScalingPlanResourcesResponse\nDescribeScalingPlansRequest\nDescribeScalingPlansResponse\nDescribeScalingPoliciesInput\nDescribeScalingPoliciesOutput\nDescribeScalingPoliciesRequest\nDescribeScalingPoliciesResponse\nDescribeScheduleRequest\nDescribeScheduleResponse\nDescribeScheduledActionsMessage\nDescribeScheduledActionsRequest\nDescribeScheduledActionsResponse\nDescribeScheduledActionsType\nDescribeScheduledAuditRequest\nDescribeScheduledAuditResponse\nDescribeScheduledInstanceAvailabilityRequest\nDescribeScheduledInstanceAvailabilityResult\nDescribeScheduledInstancesRequest\nDescribeScheduledInstancesResult\nDescribeScheduledQueryRequest\nDescribeScheduledQueryResponse\nDescribeSchedulingPoliciesRequest\nDescribeSchedulingPoliciesResponse\nDescribeSchemaRequest\nDescribeSchemaResponse\nDescribeSchemasMessage\nDescribeSchemasResponse\nDescribeScriptInput\nDescribeScriptOutput\nDescribeSecretRequest\nDescribeSecretResponse\nDescribeSecurityConfigurationInput\nDescribeSecurityConfigurationOutput\nDescribeSecurityGroupReferencesRequest\nDescribeSecurityGroupReferencesResult\nDescribeSecurityGroupRulesRequest\nDescribeSecurityGroupRulesResult\nDescribeSecurityGroupsRequest\nDescribeSecurityGroupsResult\nDescribeSecurityPolicyRequest\nDescribeSecurityPolicyResponse\nDescribeSecurityProfileRequest\nDescribeSecurityProfileResponse\nDescribeSenderIdsRequest\nDescribeSenderIdsResult\nDescribeSentimentDetectionJobRequest\nDescribeSentimentDetectionJobResponse\nDescribeServerRequest\nDescribeServerResponse\nDescribeServersRequest\nDescribeServersResponse\nDescribeServiceAccessPoliciesRequest\nDescribeServiceAccessPoliciesResponse\nDescribeServiceActionExecutionParametersInput\nDescribeServiceActionExecutionParametersOutput\nDescribeServiceActionInput\nDescribeServiceActionOutput\nDescribeServiceErrorsRequest\nDescribeServiceErrorsResult\nDescribeServiceIntegrationResponse\nDescribeServiceRequest\nDescribeServiceResponse\nDescribeServiceUpdatesMessage\nDescribeServiceUpdatesRequest\nDescribeServiceUpdatesResponse\nDescribeServicesRequest\nDescribeServicesResponse\nDescribeSessionsRequest\nDescribeSessionsResponse\nDescribeSessionsResult\nDescribeSettingsRequest\nDescribeSettingsResult\nDescribeSeverityLevelsRequest\nDescribeSeverityLevelsResponse\nDescribeShardInterval\nDescribeSharedDirectoriesRequest\nDescribeSharedDirectoriesResult\nDescribeSignalingChannelInput\nDescribeSignalingChannelOutput\nDescribeSigningJobRequest\nDescribeSigningJobResponse\nDescribeSimulationApplicationRequest\nDescribeSimulationApplicationResponse\nDescribeSimulationInput\nDescribeSimulationJobBatchRequest\nDescribeSimulationJobBatchResponse\nDescribeSimulationJobRequest\nDescribeSimulationJobResponse\nDescribeSimulationOutput\nDescribeSlotRequest\nDescribeSlotResponse\nDescribeSlotTypeRequest\nDescribeSlotTypeResponse\nDescribeSnapshotAttributeRequest\nDescribeSnapshotAttributeResult\nDescribeSnapshotCopyGrantsMessage\nDescribeSnapshotScheduleInput\nDescribeSnapshotScheduleOutput\nDescribeSnapshotSchedulesMessage\nDescribeSnapshotSchedulesOutputMessage\nDescribeSnapshotTierStatusRequest\nDescribeSnapshotTierStatusResult\nDescribeSnapshotsListMessage\nDescribeSnapshotsMessage\nDescribeSnapshotsRequest\nDescribeSnapshotsResponse\nDescribeSnapshotsResult\nDescribeSolutionRequest\nDescribeSolutionResponse\nDescribeSolutionVersionRequest\nDescribeSolutionVersionResponse\nDescribeSourceLocationRequest\nDescribeSourceLocationResponse\nDescribeSourceNetworksRequest\nDescribeSourceNetworksRequestFilters\nDescribeSourceNetworksResponse\nDescribeSourceRegionsMessage\nDescribeSourceServersRequest\nDescribeSourceServersRequestFilters\nDescribeSourceServersResponse\nDescribeSpaceRequest\nDescribeSpaceResponse\nDescribeSpeakerEnrollmentJobRequest\nDescribeSpeakerEnrollmentJobResponse\nDescribeSpeakerRequest\nDescribeSpeakerResponse\nDescribeSpendLimitsRequest\nDescribeSpendLimitsResult\nDescribeSpotDatafeedSubscriptionRequest\nDescribeSpotDatafeedSubscriptionResult\nDescribeSpotFleetInstancesRequest\nDescribeSpotFleetInstancesResponse\nDescribeSpotFleetRequestHistoryRequest\nDescribeSpotFleetRequestHistoryResponse\nDescribeSpotFleetRequestsRequest\nDescribeSpotFleetRequestsResponse\nDescribeSpotInstanceRequestsRequest\nDescribeSpotInstanceRequestsResult\nDescribeSpotPriceHistoryRequest\nDescribeSpotPriceHistoryResult\nDescribeStackDriftDetectionStatusInput\nDescribeStackDriftDetectionStatusOutput\nDescribeStackEventsInput\nDescribeStackEventsOutput\nDescribeStackInstanceInput\nDescribeStackInstanceOutput\nDescribeStackProvisioningParametersRequest\nDescribeStackProvisioningParametersResult\nDescribeStackResourceDriftsInput\nDescribeStackResourceDriftsOutput\nDescribeStackResourceInput\nDescribeStackResourceOutput\nDescribeStackResourcesInput\nDescribeStackResourcesOutput\nDescribeStackSetInput\nDescribeStackSetOperationInput\nDescribeStackSetOperationOutput\nDescribeStackSetOutput\nDescribeStackSummaryRequest\nDescribeStackSummaryResult\nDescribeStacksInput\nDescribeStacksOutput\nDescribeStacksRequest\nDescribeStacksResult\nDescribeStaleSecurityGroupsRequest\nDescribeStaleSecurityGroupsResult\nDescribeStandardsControlsRequest\nDescribeStandardsControlsResponse\nDescribeStandardsRequest\nDescribeStandardsResponse\nDescribeStateMachineAliasInput\nDescribeStateMachineAliasOutput\nDescribeStateMachineForExecutionInput\nDescribeStateMachineForExecutionOutput\nDescribeStateMachineInput\nDescribeStateMachineOutput\nDescribeStatementRequest\nDescribeStatementResponse\nDescribeStepInput\nDescribeStepOutput\nDescribeStorageConfigurationResponse\nDescribeStorageSystemRequest\nDescribeStorageSystemResourceMetricsRequest\nDescribeStorageSystemResourceMetricsResponse\nDescribeStorageSystemResourcesRequest\nDescribeStorageSystemResourcesResponse\nDescribeStorageSystemResponse\nDescribeStorageVirtualMachinesRequest\nDescribeStorageVirtualMachinesResponse\nDescribeStoreImageTasksRequest\nDescribeStoreImageTasksResult\nDescribeStorediSCSIVolumesInput\nDescribeStorediSCSIVolumesOutput\nDescribeStreamConsumerInput\nDescribeStreamConsumerOutput\nDescribeStreamInput\nDescribeStreamOutput\nDescribeStreamProcessorRequest\nDescribeStreamProcessorResponse\nDescribeStreamRequest\nDescribeStreamResponse\nDescribeStreamSummaryInput\nDescribeStreamSummaryOutput\nDescribeStudioInput\nDescribeStudioLifecycleConfigRequest\nDescribeStudioLifecycleConfigResponse\nDescribeStudioOutput\nDescribeSubnetGroupsRequest\nDescribeSubnetGroupsResponse\nDescribeSubnetsRequest\nDescribeSubnetsResult\nDescribeSubscribedWorkteamRequest\nDescribeSubscribedWorkteamResponse\nDescribeSubscribersForNotificationRequest\nDescribeSubscribersForNotificationResponse\nDescribeSubscriptionFiltersRequest\nDescribeSubscriptionFiltersResponse\nDescribeSubscriptionResponse\nDescribeSuggestersRequest\nDescribeSuggestersResponse\nDescribeSupportedLanguagesRequest\nDescribeSupportedLanguagesResponse\nDescribeTLSInspectionConfigurationRequest\nDescribeTLSInspectionConfigurationResponse\nDescribeTableDataImportJobRequest\nDescribeTableDataImportJobResult\nDescribeTableInput\nDescribeTableOutput\nDescribeTableReplicaAutoScalingInput\nDescribeTableReplicaAutoScalingOutput\nDescribeTableRequest\nDescribeTableResponse\nDescribeTableRestoreStatusMessage\nDescribeTableStatisticsMessage\nDescribeTableStatisticsResponse\nDescribeTagOptionInput\nDescribeTagOptionOutput\nDescribeTagsInput\nDescribeTagsMessage\nDescribeTagsOutput\nDescribeTagsRequest\nDescribeTagsResponse\nDescribeTagsResult\nDescribeTagsType\nDescribeTapeArchivesInput\nDescribeTapeArchivesOutput\nDescribeTapeRecoveryPointsInput\nDescribeTapeRecoveryPointsOutput\nDescribeTapesInput\nDescribeTapesOutput\nDescribeTargetGroupAttributesInput\nDescribeTargetGroupAttributesOutput\nDescribeTargetGroupsInput\nDescribeTargetGroupsOutput\nDescribeTargetHealthInput\nDescribeTargetHealthOutput\nDescribeTargetedSentimentDetectionJobRequest\nDescribeTargetedSentimentDetectionJobResponse\nDescribeTaskDefinitionRequest\nDescribeTaskDefinitionResponse\nDescribeTaskExecutionRequest\nDescribeTaskExecutionResponse\nDescribeTaskInput\nDescribeTaskOutput\nDescribeTaskRequest\nDescribeTaskResponse\nDescribeTaskSetsRequest\nDescribeTaskSetsResponse\nDescribeTasksRequest\nDescribeTasksResponse\nDescribeTemplateAliasRequest\nDescribeTemplateAliasResponse\nDescribeTemplateDefinitionRequest\nDescribeTemplateDefinitionResponse\nDescribeTemplatePermissionsRequest\nDescribeTemplatePermissionsResponse\nDescribeTemplateRequest\nDescribeTemplateResponse\nDescribeTerminationPolicyTypesAnswer\nDescribeTestCasesInput\nDescribeTestCasesOutput\nDescribeTestExecutionRequest\nDescribeTestExecutionResponse\nDescribeTestSetDiscrepancyReportRequest\nDescribeTestSetDiscrepancyReportResponse\nDescribeTestSetGenerationRequest\nDescribeTestSetGenerationResponse\nDescribeTestSetRequest\nDescribeTestSetResponse\nDescribeTextTranslationJobRequest\nDescribeTextTranslationJobResponse\nDescribeThemeAliasRequest\nDescribeThemeAliasResponse\nDescribeThemePermissionsRequest\nDescribeThemePermissionsResponse\nDescribeThemeRequest\nDescribeThemeResponse\nDescribeThesaurusRequest\nDescribeThesaurusResponse\nDescribeThingGroupRequest\nDescribeThingGroupResponse\nDescribeThingRegistrationTaskRequest\nDescribeThingRegistrationTaskResponse\nDescribeThingRequest\nDescribeThingResponse\nDescribeThingTypeRequest\nDescribeThingTypeResponse\nDescribeThumbnailsRequest\nDescribeThumbnailsResponse\nDescribeTimeBasedAutoScalingRequest\nDescribeTimeBasedAutoScalingResult\nDescribeTimeSeriesRequest\nDescribeTimeSeriesResponse\nDescribeTimeToLiveInput\nDescribeTimeToLiveOutput\nDescribeTopicPermissionsRequest\nDescribeTopicPermissionsResponse\nDescribeTopicRefreshRequest\nDescribeTopicRefreshResponse\nDescribeTopicRefreshScheduleRequest\nDescribeTopicRefreshScheduleResponse\nDescribeTopicRequest\nDescribeTopicResponse\nDescribeTopicsDetectionJobRequest\nDescribeTopicsDetectionJobResponse\nDescribeTrackerRequest\nDescribeTrackerResponse\nDescribeTrafficDistributionGroupRequest\nDescribeTrafficDistributionGroupResponse\nDescribeTrafficMirrorFiltersRequest\nDescribeTrafficMirrorFiltersResult\nDescribeTrafficMirrorSessionsRequest\nDescribeTrafficMirrorSessionsResult\nDescribeTrafficMirrorTargetsRequest\nDescribeTrafficMirrorTargetsResult\nDescribeTrafficSourcesRequest\nDescribeTrafficSourcesResponse\nDescribeTrailsRequest\nDescribeTrailsResponse\nDescribeTrainingJobRequest\nDescribeTrainingJobResponse\nDescribeTransactionRequest\nDescribeTransactionResponse\nDescribeTransformJobRequest\nDescribeTransformJobResponse\nDescribeTransitGatewayAttachmentsRequest\nDescribeTransitGatewayAttachmentsResult\nDescribeTransitGatewayConnectPeersRequest\nDescribeTransitGatewayConnectPeersResult\nDescribeTransitGatewayConnectsRequest\nDescribeTransitGatewayConnectsResult\nDescribeTransitGatewayMulticastDomainsRequest\nDescribeTransitGatewayMulticastDomainsResult\nDescribeTransitGatewayPeeringAttachmentsRequest\nDescribeTransitGatewayPeeringAttachmentsResult\nDescribeTransitGatewayPolicyTablesRequest\nDescribeTransitGatewayPolicyTablesResult\nDescribeTransitGatewayRouteTableAnnouncementsRequest\nDescribeTransitGatewayRouteTableAnnouncementsResult\nDescribeTransitGatewayRouteTablesRequest\nDescribeTransitGatewayRouteTablesResult\nDescribeTransitGatewayVpcAttachmentsRequest\nDescribeTransitGatewayVpcAttachmentsResult\nDescribeTransitGatewaysRequest\nDescribeTransitGatewaysResult\nDescribeTrialComponentRequest\nDescribeTrialComponentResponse\nDescribeTrialRequest\nDescribeTrialResponse\nDescribeTrunkInterfaceAssociationsRequest\nDescribeTrunkInterfaceAssociationsResult\nDescribeTrustedAdvisorCheckRefreshStatusesRequest\nDescribeTrustedAdvisorCheckRefreshStatusesResponse\nDescribeTrustedAdvisorCheckResultRequest\nDescribeTrustedAdvisorCheckResultResponse\nDescribeTrustedAdvisorCheckSummariesRequest\nDescribeTrustedAdvisorCheckSummariesResponse\nDescribeTrustedAdvisorChecksRequest\nDescribeTrustedAdvisorChecksResponse\nDescribeTrustsRequest\nDescribeTrustsResult\nDescribeTunnelRequest\nDescribeTunnelResponse\nDescribeTypeInput\nDescribeTypeOutput\nDescribeTypeRegistrationInput\nDescribeTypeRegistrationOutput\nDescribeUpdateActionsMessage\nDescribeUpdateDirectoryRequest\nDescribeUpdateDirectoryResult\nDescribeUpdateRequest\nDescribeUpdateResponse\nDescribeUploadBufferInput\nDescribeUploadBufferOutput\nDescribeUsageLimitsMessage\nDescribeUsageReportSubscriptionsRequest\nDescribeUsageReportSubscriptionsResult\nDescribeUserGroupsMessage\nDescribeUserGroupsResult\nDescribeUserHierarchyGroupRequest\nDescribeUserHierarchyGroupResponse\nDescribeUserHierarchyStructureRequest\nDescribeUserHierarchyStructureResponse\nDescribeUserImportJobRequest\nDescribeUserImportJobResponse\nDescribeUserPoolClientRequest\nDescribeUserPoolClientResponse\nDescribeUserPoolDomainRequest\nDescribeUserPoolDomainResponse\nDescribeUserPoolRequest\nDescribeUserPoolResponse\nDescribeUserProfileRequest\nDescribeUserProfileResponse\nDescribeUserProfileResult\nDescribeUserProfilesRequest\nDescribeUserProfilesResult\nDescribeUserRequest\nDescribeUserResponse\nDescribeUserStackAssociationsRequest\nDescribeUserStackAssociationsResult\nDescribeUsersMessage\nDescribeUsersRequest\nDescribeUsersResponse\nDescribeUsersResult\nDescribeVPCConnectionRequest\nDescribeVPCConnectionResponse\nDescribeVTLDevicesInput\nDescribeVTLDevicesOutput\nDescribeValidDBInstanceModificationsMessage\nDescribeValidDBInstanceModificationsResult\nDescribeVaultInput\nDescribeVaultOutput\nDescribeVcenterClientsRequest\nDescribeVcenterClientsResponse\nDescribeVerifiedAccessEndpointsRequest\nDescribeVerifiedAccessEndpointsResult\nDescribeVerifiedAccessGroupsRequest\nDescribeVerifiedAccessGroupsResult\nDescribeVerifiedAccessInstanceLoggingConfigurationsRequest\nDescribeVerifiedAccessInstanceLoggingConfigurationsResult\nDescribeVerifiedAccessInstancesRequest\nDescribeVerifiedAccessInstancesResult\nDescribeVerifiedAccessTrustProvidersRequest\nDescribeVerifiedAccessTrustProvidersResult\nDescribeViewRequest\nDescribeViewResponse\nDescribeVirtualClusterRequest\nDescribeVirtualClusterResponse\nDescribeVirtualGatewayInput\nDescribeVirtualGatewayOutput\nDescribeVirtualInterfacesRequest\nDescribeVirtualNodeInput\nDescribeVirtualNodeOutput\nDescribeVirtualRouterInput\nDescribeVirtualRouterOutput\nDescribeVirtualServiceInput\nDescribeVirtualServiceOutput\nDescribeVocabularyRequest\nDescribeVocabularyResponse\nDescribeVodSourceRequest\nDescribeVodSourceResponse\nDescribeVoicesInput\nDescribeVoicesOutput\nDescribeVolumeAttributeRequest\nDescribeVolumeAttributeResult\nDescribeVolumeStatusRequest\nDescribeVolumeStatusResult\nDescribeVolumesModificationsRequest\nDescribeVolumesModificationsResult\nDescribeVolumesRequest\nDescribeVolumesResponse\nDescribeVolumesResult\nDescribeVpcAttributeRequest\nDescribeVpcAttributeResult\nDescribeVpcClassicLinkDnsSupportRequest\nDescribeVpcClassicLinkDnsSupportResult\nDescribeVpcClassicLinkRequest\nDescribeVpcClassicLinkResult\nDescribeVpcConnectionRequest\nDescribeVpcConnectionResponse\nDescribeVpcConnectorRequest\nDescribeVpcConnectorResponse\nDescribeVpcEndpointConnectionNotificationsRequest\nDescribeVpcEndpointConnectionNotificationsResult\nDescribeVpcEndpointConnectionsRequest\nDescribeVpcEndpointConnectionsResult\nDescribeVpcEndpointServiceConfigurationsRequest\nDescribeVpcEndpointServiceConfigurationsResult\nDescribeVpcEndpointServicePermissionsRequest\nDescribeVpcEndpointServicePermissionsResult\nDescribeVpcEndpointServicesRequest\nDescribeVpcEndpointServicesResult\nDescribeVpcEndpointsRequest\nDescribeVpcEndpointsResponse\nDescribeVpcEndpointsResult\nDescribeVpcIngressConnectionRequest\nDescribeVpcIngressConnectionResponse\nDescribeVpcPeeringAuthorizationsOutput\nDescribeVpcPeeringConnectionsInput\nDescribeVpcPeeringConnectionsOutput\nDescribeVpcPeeringConnectionsRequest\nDescribeVpcPeeringConnectionsResult\nDescribeVpcsRequest\nDescribeVpcsResult\nDescribeVpnConnectionsRequest\nDescribeVpnConnectionsResult\nDescribeVpnGatewaysRequest\nDescribeVpnGatewaysResult\nDescribeWarmPoolAnswer\nDescribeWarmPoolType\nDescribeWatchlistRequest\nDescribeWatchlistResponse\nDescribeWebsiteCertificateAuthorityRequest\nDescribeWebsiteCertificateAuthorityResponse\nDescribeWhatIfAnalysisRequest\nDescribeWhatIfAnalysisResponse\nDescribeWhatIfForecastExportRequest\nDescribeWhatIfForecastExportResponse\nDescribeWhatIfForecastRequest\nDescribeWhatIfForecastResponse\nDescribeWorkerConfigurationRequest\nDescribeWorkerConfigurationResponse\nDescribeWorkflowExecutionInput\nDescribeWorkflowRequest\nDescribeWorkflowResponse\nDescribeWorkflowTypeInput\nDescribeWorkforceRequest\nDescribeWorkforceResponse\nDescribeWorkingStorageInput\nDescribeWorkingStorageOutput\nDescribeWorkloadRequest\nDescribeWorkloadResponse\nDescribeWorkspaceAuthenticationRequest\nDescribeWorkspaceAuthenticationResponse\nDescribeWorkspaceBundlesRequest\nDescribeWorkspaceBundlesResult\nDescribeWorkspaceConfigurationRequest\nDescribeWorkspaceConfigurationResponse\nDescribeWorkspaceDirectoriesRequest\nDescribeWorkspaceDirectoriesResult\nDescribeWorkspaceImagePermissionsRequest\nDescribeWorkspaceImagePermissionsResult\nDescribeWorkspaceImagesRequest\nDescribeWorkspaceImagesResult\nDescribeWorkspaceRequest\nDescribeWorkspaceResponse\nDescribeWorkspaceSnapshotsRequest\nDescribeWorkspaceSnapshotsResult\nDescribeWorkspacesConnectionStatusRequest\nDescribeWorkspacesConnectionStatusResult\nDescribeWorkspacesRequest\nDescribeWorkspacesResult\nDescribeWorkteamRequest\nDescribeWorkteamResponse\nDescribeWorldExportJobRequest\nDescribeWorldExportJobResponse\nDescribeWorldGenerationJobRequest\nDescribeWorldGenerationJobResponse\nDescribeWorldRequest\nDescribeWorldResponse\nDescribeWorldTemplateRequest\nDescribeWorldTemplateResponse\nDescribedAccess\nDescribedAgreement\nDescribedCertificate\nDescribedConnector\nDescribedExecution\nDescribedHostKey\nDescribedProfile\nDescribedSecurityPolicy\nDescribedServer\nDescribedUser\nDescribedWorkflow\nDescription\nDescriptionPageUrl\nDescriptionRegex\nDescriptionTooLongException\nDescriptiveMentionIndex\nDescriptiveVideoServiceFlag\nDeserializer\nDesired\nDesiredCapacity\nDesiredCapacityType\nDesiredConfiguration\nDesiredCount\nDesiredDataAccessRoleArn\nDesiredDeliveryMediums\nDesiredInferenceUnits\nDesiredInstanceCount\nDesiredInstanceType\nDesiredInstances\nDesiredModelArn\nDesiredModelVariants\nDesiredNumber\nDesiredNumberOfDomainControllers\nDesiredPartitionCount\nDesiredPlayerSession\nDesiredPlayerSessions\nDesiredReplicationCount\nDesiredServerlessConfig\nDesiredShardLevelMetrics\nDesiredStartTime\nDesiredState\nDesiredValue\nDesiredWeight\nDesiredWeightAndCapacity\nDesiredWeightsAndCapacities\nDeskPhoneNumber\nDestination\nDestination608ChannelNumber\nDestination708ServiceNumber\nDestinationAddress\nDestinationAddresses\nDestinationArn\nDestinationBackup\nDestinationBackupVaultArn\nDestinationBranchName\nDestinationBucketName\nDestinationCidr\nDestinationCidrBlock\nDestinationColumn\nDestinationCommit\nDestinationConfig\nDestinationConfiguration\nDestinationConfigurationRequest\nDestinationConfigurations\nDestinationConnectorProperties\nDestinationCountryParameters\nDestinationDataSharing\nDestinationDataSharingType\nDestinationDescription\nDestinationDescriptions\nDestinationDetails\nDestinationDomain\nDestinationDomainInfo\nDestinationEncryptionAlgorithm\nDestinationEncryptionContext\nDestinationEnvironmentId\nDestinationEnvironmentName\nDestinationField\nDestinationFieldProperties\nDestinationFileLocation\nDestinationFilters\nDestinationFlowConfig\nDestinationId\nDestinationIdentifier\nDestinationIdentity\nDestinationImageDescription\nDestinationImageName\nDestinationInfo\nDestinationIp\nDestinationIpV4\nDestinationIpV6\nDestinationIpamScopeId\nDestinationIpv6CidrBlock\nDestinationItemsLimit\nDestinationKeyId\nDestinationLicenseContext\nDestinationList\nDestinationLocationArn\nDestinationName\nDestinationNamePrefix\nDestinationNetworkInterfaceArns\nDestinationNotAllowedException\nDestinationOptions\nDestinationOptionsRequest\nDestinationOptionsResponse\nDestinationOutpostArn\nDestinationParameterName\nDestinationParameterValueConfiguration\nDestinationParentId\nDestinationParentNotFoundException\nDestinationPath\nDestinationPhoneNumber\nDestinationPoolName\nDestinationPort\nDestinationPortMapping\nDestinationPortMappings\nDestinationPortRange\nDestinationPortRanges\nDestinationPorts\nDestinationPosition\nDestinationPositions\nDestinationPrefixListId\nDestinationPrefixLists\nDestinationProjectArn\nDestinationProperties\nDestinationQueue\nDestinationRecoveryPointArn\nDestinationRefId\nDestinationRegion\nDestinationS3Uri\nDestinationSchema\nDestinationSchemaUpdate\nDestinationSettings\nDestinationSocketAddress\nDestinationStatus\nDestinationStatusDescription\nDestinationStreamArn\nDestinationSummary\nDestinationToCreate\nDestinationTrafficState\nDestinationType\nDestinationUser\nDestinationUserIdentifier\nDestinationVpc\nDestinations\nDetachCertificateFromDistributionRequest\nDetachCertificateFromDistributionResult\nDetachClassicLinkVpcRequest\nDetachClassicLinkVpcResult\nDetachCustomerManagedPolicyReferenceFromPermissionSetRequest\nDetachDiskRequest\nDetachDiskResult\nDetachElasticLoadBalancerRequest\nDetachFromIndex\nDetachFromIndexRequest\nDetachFromIndexResponse\nDetachGroupPolicyRequest\nDetachInstancesAnswer\nDetachInstancesFromLoadBalancerRequest\nDetachInstancesFromLoadBalancerResult\nDetachInstancesQuery\nDetachInternetGatewayRequest\nDetachLoadBalancerFromSubnetsInput\nDetachLoadBalancerFromSubnetsOutput\nDetachLoadBalancerTargetGroupsType\nDetachLoadBalancersType\nDetachManagedPolicyFromPermissionSetRequest\nDetachNetworkInterfaceRequest\nDetachObject\nDetachObjectRequest\nDetachObjectResponse\nDetachPolicy\nDetachPolicyRequest\nDetachPrincipalPolicyRequest\nDetachRolePolicyRequest\nDetachSecurityProfileRequest\nDetachStaticIpRequest\nDetachStaticIpResult\nDetachThingPrincipalRequest\nDetachTrafficSourcesType\nDetachTypedLink\nDetachTypedLinkRequest\nDetachUserPolicyRequest\nDetachVerifiedAccessTrustProviderRequest\nDetachVerifiedAccessTrustProviderResult\nDetachVolumeInput\nDetachVolumeOutput\nDetachVolumeRequest\nDetachVpnGatewayRequest\nDetachedObjectIdentifier\nDetail\nDetailType\nDetailedError\nDetailedErrorCode\nDetailedErrorMessage\nDetailedMetricsEnabled\nDetailedResultsLocation\nDetailedStatus\nDetailedStatusCodesMetrics\nDetails\nDetailsMap\nDetectAnomaliesRequest\nDetectAnomaliesResponse\nDetectAnomalyResult\nDetectCustomLabelsRequest\nDetectCustomLabelsResponse\nDetectDocumentTextModelVersion\nDetectDocumentTextRequest\nDetectDocumentTextResponse\nDetectDominantLanguageRequest\nDetectDominantLanguageResponse\nDetectEntitiesRequest\nDetectEntitiesResponse\nDetectEntitiesV2Request\nDetectEntitiesV2Response\nDetectFacesRequest\nDetectFacesResponse\nDetectKeyPhrasesRequest\nDetectKeyPhrasesResponse\nDetectLabelsImageBackground\nDetectLabelsImageForeground\nDetectLabelsImageProperties\nDetectLabelsImagePropertiesSettings\nDetectLabelsImageQuality\nDetectLabelsRequest\nDetectLabelsResponse\nDetectLabelsSettings\nDetectMetricSetConfigRequest\nDetectMetricSetConfigResponse\nDetectMitigationActionExecution\nDetectMitigationActionsTaskStatistics\nDetectMitigationActionsTaskSummary\nDetectMitigationActionsTaskTarget\nDetectModerationLabelsRequest\nDetectModerationLabelsResponse\nDetectPHIRequest\nDetectPHIResponse\nDetectPiiEntitiesRequest\nDetectPiiEntitiesResponse\nDetectProtectiveEquipmentRequest\nDetectProtectiveEquipmentResponse\nDetectSchema\nDetectSentimentRequest\nDetectSentimentResponse\nDetectStackDriftInput\nDetectStackDriftOutput\nDetectStackResourceDriftInput\nDetectStackResourceDriftOutput\nDetectStackSetDriftInput\nDetectStackSetDriftOutput\nDetectSyntaxRequest\nDetectSyntaxResponse\nDetectTargetedSentimentRequest\nDetectTargetedSentimentResponse\nDetectTextFilters\nDetectTextRequest\nDetectTextResponse\nDetectedCsvFormatDescriptor\nDetectedDataDetails\nDetectedField\nDetectedFileFormatDescriptor\nDetectedJsonFormatDescriptor\nDetectedLanguageCode\nDetectedLanguageLowConfidenceException\nDetectedMetricSetConfig\nDetectedMetricSource\nDetectedProperties\nDetectedS3SourceConfig\nDetectedSignature\nDetectedSignatures\nDetectedText\nDetectedWorkload\nDetection\nDetectionAttributes\nDetectionFilter\nDetectionStatus\nDetectionStatusReason\nDetections\nDetector\nDetectorAdditionalConfiguration\nDetectorAdditionalConfigurationResult\nDetectorDebugOption\nDetectorFeatureConfiguration\nDetectorFeatureConfigurationResult\nDetectorId\nDetectorIds\nDetectorModel\nDetectorModelConfiguration\nDetectorModelDefinition\nDetectorModelSummary\nDetectorModelVersionSummary\nDetectorState\nDetectorStateDefinition\nDetectorStateSummary\nDetectorSummary\nDetectorVersionSummary\nDeterminingPolicyItem\nDevAddr\nDevEndpoint\nDevEndpointCustomLibraries\nDevEndpointNames\nDevEndpoints\nDevEndpointsNotFound\nDevEnvironmentAccessDetails\nDevEnvironmentRepositorySummary\nDevEnvironmentSessionConfiguration\nDevEnvironmentSessionSummary\nDevEnvironmentSummary\nDevEui\nDevEuiEventTopic\nDevStatusReqFreq\nDeveloperInfo\nDeveloperName\nDeveloperOnlyAttribute\nDeveloperProviderName\nDeveloperUserAlreadyRegisteredException\nDeveloperUserIdentifier\nDeveloperUserIdentifierList\nDevelopmentSchemaArn\nDevice\nDeviceAggregatedStatus\nDeviceAggregatedStatusFilter\nDeviceArn\nDeviceAttributes\nDeviceCaCertificate\nDeviceCertificates\nDeviceConfig\nDeviceConfiguration\nDeviceConfigurationType\nDeviceConnectionStatus\nDeviceCreateDate\nDeviceCreationFile\nDeviceCreationFileList\nDeviceData\nDeviceDefinitionId\nDeviceDefinitionVersion\nDeviceDefinitionVersionArn\nDeviceDefinitionVersionId\nDeviceDeploymentStatus\nDeviceDeploymentStatusMessage\nDeviceDeploymentSummaries\nDeviceDeploymentSummary\nDeviceDescription\nDeviceEvent\nDeviceEvents\nDeviceFilter\nDeviceFleetArn\nDeviceFleetName\nDeviceFleetNameContains\nDeviceFleetSummaries\nDeviceFleetSummary\nDeviceGroupKey\nDeviceId\nDeviceIdentifier\nDeviceIds\nDeviceIndex\nDeviceInstance\nDeviceJob\nDeviceJobConfig\nDeviceJobs\nDeviceKey\nDeviceLastAuthenticatedDate\nDeviceLastModifiedDate\nDeviceMethod\nDeviceMethodParameters\nDeviceMethodResponse\nDeviceMethods\nDeviceMinutes\nDeviceModel\nDeviceModels\nDeviceName\nDeviceNameContains\nDeviceNames\nDeviceNetworkProfileInfo\nDeviceNotRegisteredException\nDeviceOfflineException\nDeviceOnlyRememberedOnUserPrompt\nDeviceOperatingSystem\nDeviceOperatingSystems\nDeviceOptions\nDevicePickupId\nDevicePickupSnsTopicARN\nDevicePool\nDevicePoolCompatibilityResult\nDevicePosition\nDevicePositionUpdate\nDevicePositionUpdates\nDevicePositions\nDeviceProfile\nDeviceProfileId\nDeviceProfileList\nDeviceProfileType\nDeviceQueueInfo\nDeviceRegistration\nDeviceRegistrationState\nDeviceRegistrationStateEventConfiguration\nDeviceRegistrationStateResourceTypeEventConfiguration\nDeviceRegistryEnrichActivity\nDeviceRememberedStatus\nDeviceReportedStatus\nDeviceReportedTime\nDeviceRestrictions\nDeviceRetiredException\nDeviceSecretVerifierConfig\nDeviceSecretVerifierConfigType\nDeviceSelectionConfig\nDeviceSelectionConfiguration\nDeviceSelectionResult\nDeviceSerialNumber\nDeviceSettingsSyncState\nDeviceShadowEnrichActivity\nDeviceState\nDeviceStats\nDeviceStatus\nDeviceStatusDetail\nDeviceStatusDetails\nDeviceStatusInfo\nDeviceStreamLimitExceededException\nDeviceSubsetType\nDeviceSummaries\nDeviceSummary\nDeviceTemplate\nDeviceToken\nDeviceTrustProviderType\nDeviceType\nDeviceTypeAndroid\nDeviceTypeChromeOs\nDeviceTypeId\nDeviceTypeIos\nDeviceTypeLinux\nDeviceTypeOsx\nDeviceTypeWeb\nDeviceTypeWindows\nDeviceTypeZeroClient\nDeviceTypes\nDeviceUnderTest\nDeviceUpdateStatus\nDeviceUsageType\nDeviceUserAgent\nDeviceUserAgents\nDeviceValidationDomain\nDeviceiSCSIAttributes\nDevices\nDhcpConfiguration\nDhcpConfigurations\nDhcpOptions\nDhcpOptionsId\nDhcpOptionsIds\nDiagnosticCode\nDiagnostics\nDialRequest\nDialnorm\nDialogAction\nDialogCodeHookInvocationSetting\nDialogCodeHookSettings\nDialogState\nDialogueIntelligence\nDictPageSizeLimit\nDictionaryKeyThreshold\nDiff\nDifference\nDifferenceStatus\nDifferenceType\nDigest\nDigestAlgorithmMnemonic\nDigestAlgorithmType\nDigestTipAddress\nDigestType\nDigestValue\nDigitalSignature\nDigitalSignatureMethod\nDimension\nDimensionConfigurations\nDimensionContribution\nDimensionContributionList\nDimensionDetail\nDimensionField\nDimensionFilter\nDimensionFilterList\nDimensionForeground\nDimensionGroup\nDimensionGroupDetail\nDimensionKey\nDimensionKeyDescription\nDimensionKeyDetail\nDimensionKeys\nDimensionList\nDimensionMapping\nDimensionMappings\nDimensionName\nDimensionNameValue\nDimensionType\nDimensionValue\nDimensionValueAttributes\nDimensionValueContribution\nDimensionValueContributionList\nDimensionValueList\nDimensionValueSource\nDimensionValueType\nDimensionValues\nDimensionValuesWithAttributes\nDimensionalValueCount\nDimensions\nDirectConnectClientException\nDirectConnectGateway\nDirectConnectGatewayAssociation\nDirectConnectGatewayAssociationProposal\nDirectConnectGatewayAttachment\nDirectConnectServerException\nDirectInternetAccess\nDirectJDBCSource\nDirectKafkaSource\nDirectKinesisSource\nDirectMessageConfiguration\nDirectPathNoLog\nDirectPathParallelLoad\nDirectPutContent\nDirectSchemaChangePolicy\nDirection\nDirectionality\nDirectories\nDirectory\nDirectoryAlreadyExistsException\nDirectoryAlreadyInRegionException\nDirectoryAlreadySharedException\nDirectoryArn\nDirectoryConfig\nDirectoryConfigs\nDirectoryConnectSettings\nDirectoryConnectSettingsDescription\nDirectoryDeletedException\nDirectoryDescription\nDirectoryDescriptions\nDirectoryDoesNotExistException\nDirectoryId\nDirectoryIds\nDirectoryInDesiredStateException\nDirectoryInUseException\nDirectoryInformation\nDirectoryLimitExceededException\nDirectoryLimits\nDirectoryMode\nDirectoryName\nDirectoryNameConflictsWithFileNameException\nDirectoryNames\nDirectoryNotDisabledException\nDirectoryNotEnabledException\nDirectoryNotSharedException\nDirectoryPath\nDirectoryRegistration\nDirectoryRegistrationArn\nDirectoryRegistrationSummary\nDirectoryRegistrations\nDirectoryServiceAuthentication\nDirectoryServiceAuthenticationFailedException\nDirectoryServiceAuthenticationRequest\nDirectoryStructure\nDirectoryType\nDirectoryUnavailableException\nDirectoryUserId\nDirectoryVpcSettings\nDirectoryVpcSettingsDescription\nDisableAWSServiceAccessRequest\nDisableActionConfiguration\nDisableAddOnRequest\nDisableAddOnResult\nDisableAddressTransferRequest\nDisableAddressTransferResult\nDisableAlarmActionRequest\nDisableAlarmActionsInput\nDisableApiStop\nDisableApiTermination\nDisableApplicationLayerAutomaticResponseRequest\nDisableAutomatedBackup\nDisableAwsNetworkPerformanceMetricSubscriptionRequest\nDisableAwsNetworkPerformanceMetricSubscriptionResult\nDisableClientAuthenticationRequest\nDisableControlInput\nDisableControlOutput\nDisableDelegatedAdminAccountRequest\nDisableDelegatedAdminAccountResponse\nDisableDirectoryRequest\nDisableDirectoryResponse\nDisableDomain\nDisableDomainAutoRenewRequest\nDisableDomainTransferLockRequest\nDisableDomainTransferLockResponse\nDisableDynamicScaling\nDisableEbsEncryptionByDefaultRequest\nDisableEbsEncryptionByDefaultResult\nDisableEmailNotification\nDisableEnhancedMonitoringInput\nDisableExecuteApiEndpoint\nDisableFastLaunchRequest\nDisableFastLaunchResult\nDisableFastSnapshotRestoreErrorItem\nDisableFastSnapshotRestoreStateError\nDisableFastSnapshotRestoreStateErrorItem\nDisableFastSnapshotRestoreSuccessItem\nDisableFastSnapshotRestoresRequest\nDisableFastSnapshotRestoresResult\nDisableGatewayInput\nDisableGatewayOutput\nDisableGlueTableCreation\nDisableHostedZoneDNSSECRequest\nDisableHostedZoneDNSSECResponse\nDisableImageBlockPublicAccessRequest\nDisableImageBlockPublicAccessResult\nDisableImageDeprecationRequest\nDisableImageDeprecationResult\nDisableImportFindingsForProductRequest\nDisableIndexing\nDisableInsightRulesInput\nDisableInsightRulesOutput\nDisableIpamOrganizationAdminAccountRequest\nDisableIpamOrganizationAdminAccountResult\nDisableKeyRequest\nDisableKeyRotationRequest\nDisableLDAPSRequest\nDisableLniAtDeviceIndex\nDisableLocalGroups\nDisableLogTypes\nDisableLoggingMessage\nDisableMetricsCollectionQuery\nDisableNetworking\nDisableOrganizationAdminAccountRequest\nDisablePolicyTypeRequest\nDisablePolicyTypeResponse\nDisableProfiler\nDisableRadiusRequest\nDisableRegionRequest\nDisableRemoteControl\nDisableRequest\nDisableResponse\nDisableRollback\nDisableRuleRequest\nDisableScaleIn\nDisableSchemaValidation\nDisableSerialConsoleAccessRequest\nDisableSerialConsoleAccessResult\nDisableSnapshotCopyMessage\nDisableSnapshotCopyResult\nDisableSsl\nDisableSsoRequest\nDisableStageTransitionInput\nDisableTemplateValidation\nDisableTopicRuleRequest\nDisableTransitGatewayRouteTablePropagationRequest\nDisableTransitGatewayRouteTablePropagationResult\nDisableUseAsDirectQuerySource\nDisableUseAsImportedSource\nDisableUserRequest\nDisableUserResponse\nDisableValueTrimming\nDisableVgwRoutePropagationRequest\nDisableVpcClassicLinkDnsSupportRequest\nDisableVpcClassicLinkDnsSupportResult\nDisableVpcClassicLinkRequest\nDisableVpcClassicLinkResult\nDisabled\nDisabledApiException\nDisabledDate\nDisabledException\nDisabledOperationException\nDisabledReason\nDisabledTime\nDisablingTime\nDisallowedCidrs\nDisassociateAcceleratorTypes\nDisassociateAccountsInput\nDisassociateAccountsOutput\nDisassociateAdditionalCodeRepositories\nDisassociateAddressRequest\nDisassociateApiRequest\nDisassociateAppBlockBuilderAppBlockRequest\nDisassociateApplicationFleetRequest\nDisassociateApplicationFromEntitlementRequest\nDisassociateApplicationsRequest\nDisassociateApprovalRuleTemplateFromRepositoryInput\nDisassociateApprovedOriginRequest\nDisassociateAssessmentReportEvidenceFolderRequest\nDisassociateAssetsRequest\nDisassociateAttributeGroupRequest\nDisassociateAttributeGroupResponse\nDisassociateAwsAccountFromPartnerAccountRequest\nDisassociateBotRequest\nDisassociateBrowserSettingsRequest\nDisassociateBudgetFromResourceInput\nDisassociateCertificateRequest\nDisassociateChannelFlowRequest\nDisassociateClientDeviceFromCoreDeviceEntry\nDisassociateClientDeviceFromCoreDeviceErrorEntry\nDisassociateClientVpnTargetNetworkRequest\nDisassociateClientVpnTargetNetworkResult\nDisassociateConfigurationItemsFromApplicationRequest\nDisassociateConnectPeerRequest\nDisassociateConnectPeerResponse\nDisassociateConnectionAliasRequest\nDisassociateConnectionFromLagRequest\nDisassociateConnectorRequest\nDisassociateContactFromAddressBookRequest\nDisassociateCreatedArtifactRequest\nDisassociateCustomDomainRequest\nDisassociateCustomDomainResponse\nDisassociateCustomerGatewayRequest\nDisassociateCustomerGatewayResponse\nDisassociateDRTLogBucketRequest\nDisassociateDataShareConsumerMessage\nDisassociateDefaultCodeRepository\nDisassociateDelegateFromResourceRequest\nDisassociateDelegationSignerFromDomainRequest\nDisassociateDelegationSignerFromDomainResponse\nDisassociateDeviceFromPlacementRequest\nDisassociateDeviceFromRoomRequest\nDisassociateDiscoveredResourceRequest\nDisassociateDomainRequest\nDisassociateElasticIpRequest\nDisassociateEnclaveCertificateIamRoleRequest\nDisassociateEnclaveCertificateIamRoleResult\nDisassociateEntireAccount\nDisassociateEntitiesFromExperienceRequest\nDisassociateEntitiesFromExperienceResponse\nDisassociateEnvironmentOperationsRoleMessage\nDisassociateExternalConnectionRequest\nDisassociateExternalConnectionResult\nDisassociateFacesRequest\nDisassociateFacesResponse\nDisassociateFileSystemAliasesRequest\nDisassociateFileSystemAliasesResponse\nDisassociateFileSystemInput\nDisassociateFileSystemOutput\nDisassociateFirewallRuleGroupRequest\nDisassociateFirewallRuleGroupResponse\nDisassociateFleetRequest\nDisassociateFraudsterRequest\nDisassociateFraudsterResponse\nDisassociateFromAdministratorAccountRequest\nDisassociateFromMasterAccountRequest\nDisassociateGatewayFromServerInput\nDisassociateGatewayFromServerOutput\nDisassociateGlobalReplicationGroupMessage\nDisassociateGlobalReplicationGroupResult\nDisassociateHealthCheckRequest\nDisassociateIamInstanceProfileRequest\nDisassociateIamInstanceProfileResult\nDisassociateIdentityProviderConfigRequest\nDisassociateIdentityProviderConfigResponse\nDisassociateInstanceEventWindowRequest\nDisassociateInstanceEventWindowResult\nDisassociateInstanceStorageConfigRequest\nDisassociateIpAccessSettingsRequest\nDisassociateIpGroupsRequest\nDisassociateIpamResourceDiscoveryRequest\nDisassociateIpamResourceDiscoveryResult\nDisassociateKmsKeyRequest\nDisassociateLambdaFunctionRequest\nDisassociateLensesInput\nDisassociateLexBotRequest\nDisassociateLicenseRequest\nDisassociateLicenseResponse\nDisassociateLifecycleConfig\nDisassociateLinkRequest\nDisassociateLinkResponse\nDisassociateMacSecKeyRequest\nDisassociateMacSecKeyResponse\nDisassociateMemberAccountRequest\nDisassociateMemberFromGroupRequest\nDisassociateMemberRequest\nDisassociateMemberResponse\nDisassociateMembersRequest\nDisassociateMembersResponse\nDisassociateMembershipRequest\nDisassociateMergedGraphqlApiRequest\nDisassociateMergedGraphqlApiResponse\nDisassociateMulticastGroupFromFuotaTaskRequest\nDisassociateNatGatewayAddressRequest\nDisassociateNatGatewayAddressResult\nDisassociateNetworkSettingsRequest\nDisassociateNodeRequest\nDisassociateNodeResponse\nDisassociateOpsItemRelatedItemRequest\nDisassociateOriginationIdentityRequest\nDisassociateOriginationIdentityResult\nDisassociatePersonasFromEntitiesRequest\nDisassociatePersonasFromEntitiesResponse\nDisassociatePhoneNumberContactFlowRequest\nDisassociatePhoneNumberFromUserRequest\nDisassociatePhoneNumbersFromVoiceConnectorGroupRequest\nDisassociatePhoneNumbersFromVoiceConnectorGroupResponse\nDisassociatePhoneNumbersFromVoiceConnectorRequest\nDisassociatePhoneNumbersFromVoiceConnectorResponse\nDisassociatePricingRulesInput\nDisassociatePricingRulesOutput\nDisassociatePrincipalFromPortfolioInput\nDisassociateProductFromPortfolioInput\nDisassociateProfilesInput\nDisassociateQualificationFromWorkerRequest\nDisassociateQueueQuickConnectsRequest\nDisassociateRecoveryPointFromParentInput\nDisassociateRecoveryPointInput\nDisassociateRepositoryRequest\nDisassociateRepositoryResponse\nDisassociateResolverEndpointIpAddressRequest\nDisassociateResolverEndpointIpAddressResponse\nDisassociateResolverQueryLogConfigRequest\nDisassociateResolverQueryLogConfigResponse\nDisassociateResolverRuleRequest\nDisassociateResolverRuleResponse\nDisassociateResourceRequest\nDisassociateResourceResponse\nDisassociateResourceResponseElement\nDisassociateResourceSharePermissionRequest\nDisassociateResourceSharePermissionResponse\nDisassociateResourceShareRequest\nDisassociateResourceShareResponse\nDisassociateRoleFromGroupRequest\nDisassociateRoleFromGroupResponse\nDisassociateRouteTableRequest\nDisassociateRoutingProfileQueuesRequest\nDisassociateS3ResourcesRequest\nDisassociateS3ResourcesResult\nDisassociateSchedule\nDisassociateSecurityKeyRequest\nDisassociateServiceActionFromProvisioningArtifactInput\nDisassociateServiceRoleFromAccountResponse\nDisassociateSigninDelegateGroupsFromAccountRequest\nDisassociateSkillFromSkillGroupRequest\nDisassociateSkillFromUsersRequest\nDisassociateSkillGroupFromRoomRequest\nDisassociateSourceGraphqlApiRequest\nDisassociateSourceGraphqlApiResponse\nDisassociateSourceServersRequest\nDisassociateSubnetCidrBlockRequest\nDisassociateSubnetCidrBlockResult\nDisassociateSubnetsRequest\nDisassociateSubnetsResponse\nDisassociateTagOptionFromResourceInput\nDisassociateTeamMemberRequest\nDisassociateThirdPartyFirewallRequest\nDisassociateThirdPartyFirewallResponse\nDisassociateTimeSeriesFromAssetPropertyRequest\nDisassociateTrackerConsumerRequest\nDisassociateTrafficDistributionGroupUserRequest\nDisassociateTransitGatewayConnectPeerRequest\nDisassociateTransitGatewayConnectPeerResponse\nDisassociateTransitGatewayMulticastDomainRequest\nDisassociateTransitGatewayMulticastDomainResult\nDisassociateTransitGatewayPolicyTableRequest\nDisassociateTransitGatewayPolicyTableResult\nDisassociateTransitGatewayRouteTableRequest\nDisassociateTransitGatewayRouteTableResult\nDisassociateTrialComponentRequest\nDisassociateTrialComponentResponse\nDisassociateTrunkInterfaceRequest\nDisassociateTrunkInterfaceResult\nDisassociateTrustStoreRequest\nDisassociateUserAccessLoggingSettingsRequest\nDisassociateUserFromPermissionGroupRequest\nDisassociateUserFromPermissionGroupResponse\nDisassociateUserRequest\nDisassociateUserResponse\nDisassociateUserSettingsRequest\nDisassociateVPCFromHostedZoneRequest\nDisassociateVPCFromHostedZoneResponse\nDisassociateVehicleFleetRequest\nDisassociateVpcCidrBlockRequest\nDisassociateVpcCidrBlockResult\nDisassociateWebACLRequest\nDisassociateWebsiteAuthorizationProviderRequest\nDisassociateWebsiteCertificateAuthorityRequest\nDisassociateWhenNotFound\nDisassociateWirelessDeviceFromFuotaTaskRequest\nDisassociateWirelessDeviceFromMulticastGroupRequest\nDisassociateWirelessDeviceFromThingRequest\nDisassociateWirelessGatewayFromCertificateRequest\nDisassociateWirelessGatewayFromThingRequest\nDisassociatedAt\nDisassociatedFace\nDisassociatedFaces\nDisassociationDate\nDiscardedFiles\nDisconnectCustomKeyStoreRequest\nDisconnectFailures\nDisconnectFromServiceRequest\nDisconnectParticipantRequest\nDisconnectPlayerRequest\nDisconnectPlayerResult\nDisconnectRecoveryInstanceRequest\nDisconnectSourceServerRequest\nDisconnectSuccesses\nDisconnectTimeoutInSeconds\nDisconnectTimestamp\nDisconnectUserRequest\nDisconnectionEvent\nDiscontinuityMode\nDiscontinuityTags\nDiscoverDynamicCardVerificationCode\nDiscoverInputSchemaRequest\nDiscoverInputSchemaResponse\nDiscoverInstancesRequest\nDiscoverInstancesResponse\nDiscoverInstancesRevisionRequest\nDiscoverInstancesRevisionResponse\nDiscoverPollEndpointRequest\nDiscoverPollEndpointResponse\nDiscoveredResource\nDiscoveredResourceList\nDiscovererArn\nDiscovererId\nDiscovererIdPrefix\nDiscovererSummary\nDiscoverers\nDiscoveryConfig\nDiscoveryData\nDiscoveryIntegrationStatus\nDiscoveryJobArn\nDiscoveryJobListEntry\nDiscoveryJobs\nDiscoveryRegion\nDiscoveryServerConfiguration\nDiscoveryStatus\nDiscoveryType\nDisk\nDiskAllocationResource\nDiskAllocationType\nDiskAttributeList\nDiskContainer\nDiskContainers\nDiskId\nDiskIds\nDiskImage\nDiskImageDescription\nDiskImageDetail\nDiskImageFormat\nDiskImageSize\nDiskImageVolumeDescription\nDiskImages\nDiskInfo\nDiskIopsConfiguration\nDiskMap\nDiskNode\nDiskPath\nDiskReadBytesPerSecond\nDiskReadOpsPerSecond\nDiskResourceUtilization\nDiskSizeInBytes\nDiskSnapshot\nDiskSnapshotInfo\nDiskStatus\nDiskWriteBytesPerSecond\nDiskWriteOpsPerSecond\nDisks\nDismissUserContactRequest\nDisplayAs\nDisplayAspectRatio\nDisplayConfiguration\nDisplayData\nDisplayFormat\nDisplayFormatOptions\nDisplayFragmentNumber\nDisplayFragmentTimestamp\nDisplayLabel\nDisplayLanguageCode\nDisplayMode\nDisplayName\nDisplayNamePrefix\nDisplayOptions\nDisplayOrder\nDisplayText\nDisplayable\nDisposePackageVersionsRequest\nDisposePackageVersionsResult\nDisruptionCompliance\nDissociateEntityFromThingRequest\nDissociatePackageRequest\nDissociatePackageResponse\nDistance\nDistanceUnit\nDistinguishedNameQualifier\nDistributeDataset\nDistributeDatasetEntriesRequest\nDistribution\nDistributionAlreadyExists\nDistributionBundle\nDistributionConfig\nDistributionConfigWithTags\nDistributionConfiguration\nDistributionConfigurationSummary\nDistributionId\nDistributionIdList\nDistributionList\nDistributionNotDisabled\nDistributionSummary\nDistributions\nDistributor\nDistributorId\nDistrictOrCounty\nDkimAttributes\nDkimEnabled\nDkimPercentage\nDkimSigningAttributes\nDkimStatus\nDkimTokens\nDkimVerificationStatus\nDlBucketSize\nDlClass\nDlDr\nDlFreq\nDlRate\nDlRatePolicy\nDlqEventQueueArn\nDmsTransferSettings\nDns\nDnsAddresses\nDnsConfig\nDnsConfigChange\nDnsDuplicateRuleGroupViolation\nDnsEntries\nDnsEntry\nDnsIpAddr\nDnsIpAddresses\nDnsIpAddrs\nDnsIps\nDnsLogs\nDnsName\nDnsNameServers\nDnsOptions\nDnsOptionsSpecification\nDnsProperties\nDnsRecord\nDnsRecordCreationState\nDnsRecordIpType\nDnsRecords\nDnsRequestAction\nDnsResolvers\nDnsRuleGroupLimitExceededViolation\nDnsRuleGroupPriorityConflictViolation\nDnsSearchDomains\nDnsSec\nDnsServers\nDnsServersOptionsModifyStructure\nDnsServiceDiscovery\nDnsSupport\nDnsTargetResource\nDnssecKey\nDnssecKeys\nDnssecLimitExceeded\nDnssecSigningAttributes\nDocDbDataProviderSettings\nDocDbSettings\nDocService\nDockerLabels\nDockerSecurityOptions\nDockerVolumeConfiguration\nDocsToInvestigate\nDocument\nDocumentAlreadyExists\nDocumentAttribute\nDocumentAttributeCondition\nDocumentAttributeKey\nDocumentAttributeTarget\nDocumentAttributeValue\nDocumentAttributeValueCountPair\nDocumentAttributeValueCountPairs\nDocumentAttributeValueType\nDocumentAttributes\nDocumentClass\nDocumentClassificationConfig\nDocumentClassificationJobFilter\nDocumentClassificationJobProperties\nDocumentClassificationJobPropertiesList\nDocumentClassifierArn\nDocumentClassifierDocuments\nDocumentClassifierFilter\nDocumentClassifierInputDataConfig\nDocumentClassifierName\nDocumentClassifierOutputDataConfig\nDocumentClassifierProperties\nDocumentClassifierPropertiesList\nDocumentClassifierSummariesList\nDocumentClassifierSummary\nDocumentContentDeletion\nDocumentDBEventSourceConfig\nDocumentDataColumnName\nDocumentDataFieldName\nDocumentDefaultVersionDescription\nDocumentDescription\nDocumentExcerpt\nDocumentFilter\nDocumentFilterList\nDocumentFormat\nDocumentGroup\nDocumentGroups\nDocumentHash\nDocumentHashType\nDocumentId\nDocumentIdColumnName\nDocumentIdList\nDocumentIdOptions\nDocumentIdentifier\nDocumentIdentifiers\nDocumentIndex\nDocumentInfo\nDocumentInfoList\nDocumentKeyValuesFilter\nDocumentLabel\nDocumentLibraryFieldMappings\nDocumentLimitExceeded\nDocumentLocation\nDocumentLockedForCommentsException\nDocumentMetadata\nDocumentMetadataConfiguration\nDocumentMetadataConfigurationUpdates\nDocumentMetadataConfigurations\nDocumentMetadataResponseInfo\nDocumentName\nDocumentPages\nDocumentParameter\nDocumentPermissionLimit\nDocumentReadAction\nDocumentReadMode\nDocumentReaderConfig\nDocumentRelevanceConfiguration\nDocumentRelevanceOverrideConfigurations\nDocumentRequires\nDocumentReviewCommentSource\nDocumentReviewerResponseSource\nDocumentReviews\nDocumentSchemaVersion\nDocumentServiceException\nDocumentServiceWarning\nDocumentSizeInBytes\nDocumentStatus\nDocumentStatusList\nDocumentSuggesterOptions\nDocumentText\nDocumentTitle\nDocumentTitleColumnName\nDocumentTitleFieldName\nDocumentTooLargeException\nDocumentType\nDocumentTypeListItem\nDocumentURI\nDocumentVersion\nDocumentVersionInfo\nDocumentVersionLimitExceeded\nDocumentVersionMetadata\nDocumentVersions\nDocumentationPart\nDocumentationPartIds\nDocumentationPartLocation\nDocumentationParts\nDocumentationUrl\nDocumentationVersion\nDocumentationVersions\nDocuments\nDocumentsAdded\nDocumentsDeleted\nDocumentsFailed\nDocumentsMetadataConfiguration\nDocumentsModified\nDocumentsScanned\nDocumentsWithErrorsCount\nDoesNotExistException\nDolbyEDecode\nDolbyVision\nDolbyVision81Settings\nDolbyVisionLevel6Metadata\nDolbyVisionMetadataXml\nDollars\nDomain\nDomainARN\nDomainAlreadyExistsFault\nDomainArn\nDomainAssociation\nDomainAuthSecretArn\nDomainCertificateArn\nDomainConfig\nDomainConfiguration\nDomainConfigurationSummary\nDomainController\nDomainControllerId\nDomainControllerIds\nDomainControllerLimitExceededException\nDomainControllers\nDomainCount\nDomainDeliverabilityCampaign\nDomainDeliverabilityCampaigns\nDomainDeliverabilityTrackingOption\nDomainDeprecatedFault\nDomainDescription\nDomainDescriptionType\nDomainDetail\nDomainDetails\nDomainDnsIps\nDomainEndpoint\nDomainEndpointOptions\nDomainEndpointOptionsStatus\nDomainEndpoints\nDomainEntry\nDomainEntryPoint\nDomainExecutionRoleArn\nDomainFileUrl\nDomainFqdn\nDomainIAMRoleName\nDomainId\nDomainIdEquals\nDomainInfo\nDomainInformation\nDomainInformationContainer\nDomainInfos\nDomainIspPlacement\nDomainIspPlacements\nDomainJoinInfo\nDomainLimitExceeded\nDomainMembership\nDomainMemberships\nDomainName\nDomainNameConfig\nDomainNameConfiguration\nDomainNameConfigurations\nDomainNameStatus\nDomainNameStatusMessage\nDomainNames\nDomainNodesStatus\nDomainNodesStatusList\nDomainNotFoundFault\nDomainNotWhitelistedException\nDomainOu\nDomainPackageDetails\nDomainPackageDetailsList\nDomainPackageStatus\nDomainPrefix\nDomainPrice\nDomainSettings\nDomainSettingsForUpdate\nDomainSigningPrivateKey\nDomainSigningSelector\nDomainState\nDomainStats\nDomainStatus\nDomainStatusList\nDomainSuggestion\nDomainSummaries\nDomainSummary\nDomainTransferability\nDomainValidation\nDomainValidationOption\nDomainValidationOptions\nDomainValidationRecord\nDomains\nDominantColor\nDominantColors\nDominantLanguage\nDominantLanguageDetectionJobFilter\nDominantLanguageDetectionJobProperties\nDominantLanguageDetectionJobPropertiesList\nDonutCenterOptions\nDonutOptions\nDoubleArrayOptions\nDoubleColumnStatisticsData\nDoubleOptions\nDoubleRange\nDoubleValue\nDownScaling\nDownlinkFrequency\nDownlinkMode\nDownlinkQueueMessage\nDownlinkQueueMessagesList\nDownloadDBLogFilePortionDetails\nDownloadDBLogFilePortionMessage\nDownloadDefaultKeyPairResult\nDownloadSpeed\nDownloadUri\nDownloadUrl\nDownmixControl\nDpdTimeoutAction\nDpdTimeoutSeconds\nDpuExecutionInMillis\nDrMax\nDrMin\nDraftUploadOutOfSyncException\nDrcLine\nDrcProfile\nDrcRf\nDriftCheckBaselines\nDriftCheckBias\nDriftCheckExplainability\nDriftCheckModelDataQuality\nDriftCheckModelQuality\nDriftDetectionStatus\nDriftInformation\nDriftStatus\nDriftedStackInstancesCount\nDriftedStackResourceCount\nDrillDownFilter\nDrillDownFilters\nDriveCacheType\nDriver\nDriverOpts\nDrmSystems\nDrop\nDropDownControlDisplayOptions\nDropDuplicates\nDropFields\nDropFrameTimecode\nDropNullFields\nDropdown\nDropped\nDryRun\nDryRunConfig\nDryRunId\nDryRunMode\nDryRunOperation\nDryRunOperationException\nDryRunProgressStatus\nDryRunResults\nDryRunStatus\nDualStackDnsName\nDukptAttributes\nDukptDerivationAttributes\nDukptDerivationType\nDukptEncryptionAttributes\nDukptKeyDerivationType\nDukptKeyVariant\nDuplicateAccessPointNameException\nDuplicateAccountException\nDuplicateCertificateException\nDuplicateDocumentContent\nDuplicateDocumentVersionName\nDuplicateHandshakeException\nDuplicateItemException\nDuplicateListenerException\nDuplicateLoadBalancerNameException\nDuplicateOperationId\nDuplicateOrganizationalUnitException\nDuplicatePolicyAttachmentException\nDuplicatePolicyException\nDuplicatePolicyNameException\nDuplicateProviderException\nDuplicateRecordException\nDuplicateRegistrationAction\nDuplicateReportNameException\nDuplicateRequest\nDuplicateRequestException\nDuplicateResourceException\nDuplicateSSHPublicKeyException\nDuplicateTagKeysException\nDuplicateTargetGroupNameException\nDuplicateTimestamps\nDuplicateUserNameFault\nDuplicatedAuditEventId\nDuplicatedStopRequestException\nDuration\nDurationFrames\nDurationHistogram\nDurationInMinutes\nDurationInMs\nDurationInSeconds\nDurationInYears\nDurationMillis\nDurationMinutes\nDurationMode\nDurationRange\nDurationSMPTE\nDurationSeconds\nDurationSinceLastAccess\nDurationUnits\nDvbNitSettings\nDvbSdtSettings\nDvbSubDestinationSettings\nDvbSubPids\nDvbSubSourceSettings\nDvbTdtSettings\nDvbTeletextPid\nDynamicCardVerificationCode\nDynamicCardVerificationValue\nDynamicConfiguration\nDynamicDefaultValue\nDynamicPartitioningConfiguration\nDynamicRangeCompressionLine\nDynamicRangeCompressionProfile\nDynamicRangeCompressionRf\nDynamicRangeControl\nDynamicRouting\nDynamicScalingConfiguration\nDynamicScalingInSuspended\nDynamicScalingOutSuspended\nDynamicSubGop\nDynamicTransform\nDynamicValue\nDynamicVariable\nDynamicVariables\nDynamoDB\nDynamoDBAction\nDynamoDBCatalogSource\nDynamoDBStreamParameters\nDynamoDBTarget\nDynamoDBTargets\nDynamoDBv2Action\nDynamoDbSettings\nDynamodbDataSourceConfig\nDynatrace\nDynatraceConnectorProfileCredentials\nDynatraceConnectorProfileProperties\nDynatraceSourceProperties\nE164PhoneNumber\nE164PhoneNumbers\nEBSEnabled\nEBSFilter\nEBSOptions\nEBSOptionsStatus\nEBSResourceUtilization\nEBSStorageInfo\nEBSUtilizationMetric\nEC2AccessDeniedException\nEC2AssociateRouteTableAction\nEC2Capacities\nEC2Capacity\nEC2CopyRouteTableAction\nEC2CreateRouteAction\nEC2CreateRouteTableAction\nEC2DeleteRouteAction\nEC2ErrorCode\nEC2FamilyFilter\nEC2InboundPermissions\nEC2InstanceCounts\nEC2InstanceDetails\nEC2InstanceId\nEC2InstanceIdsToTerminate\nEC2InstanceLimit\nEC2InstanceLimits\nEC2InstanceNotFoundException\nEC2InstanceStateInvalidException\nEC2InstanceType\nEC2InstanceTypeInvalidException\nEC2InstanceUnavailableException\nEC2ReplaceRouteAction\nEC2ReplaceRouteTableAssociationAction\nEC2ResourceDetails\nEC2ResourceUtilization\nEC2SecurityGroup\nEC2SecurityGroupId\nEC2SecurityGroupName\nEC2SecurityGroupOwnerId\nEC2SecurityGroups\nEC2Specification\nEC2TagFilter\nEC2TagSet\nEC2ThrottledException\nEC2UnexpectedException\nECSService\nECSServiceMappingLimitExceededException\nECSServiceProjectedMetric\nECSServiceProjectedUtilizationMetric\nECSServiceRecommendation\nECSServiceRecommendationFilter\nECSServiceRecommendationOption\nECSServiceRecommendedOptionProjectedMetric\nECSServiceUtilizationMetric\nECSTarget\nECSTaskSet\nEDNS0ClientSubnetIP\nEDNS0ClientSubnetMask\nEFSAuthorizationConfig\nEFSIOException\nEFSMountConnectivityException\nEFSMountFailureException\nEFSMountTimeoutException\nEFSVolumeConfiguration\nEKSAnywhereVersion\nEKSOnDeviceService\nEKSOnDeviceServiceConfiguration\nELBInfo\nEMAIL\nEMR\nEMRStepMetadata\nENILimitReachedException\nEQ\nESInstanceDetails\nETag\nEac3AtmosSettings\nEac3Settings\nEapMethod\nEarfcn\nEarliestBacktrackTime\nEarliestRestorableDateTime\nEarliestRestorableTime\nEarliestTime\nEarthObservationJobErrorDetails\nEarthObservationJobSummaries\nEast\nEbif\nEbpAudioInterval\nEbpLookaheadMs\nEbpPlacement\nEbs\nEbsBlockDevice\nEbsBlockDeviceConfig\nEbsBlockDeviceConfigs\nEbsBlockDevices\nEbsCause\nEbsConfiguration\nEbsEncryptionByDefault\nEbsEvent\nEbsInfo\nEbsInstanceBlockDevice\nEbsInstanceBlockDeviceSpecification\nEbsOptimized\nEbsOptimizedAvailable\nEbsOptimizedByDefault\nEbsOptimizedInfo\nEbsOptimizedSupport\nEbsReadBytesPerSecond\nEbsReadOpsPerSecond\nEbsRequestId\nEbsResult\nEbsRootVolumeSize\nEbsSnapshotConfiguration\nEbsSnapshotPreservation\nEbsStorageInfo\nEbsStorageOnly\nEbsVolume\nEbsVolumeDetails\nEbsVolumeScanDetails\nEbsVolumes\nEbsVolumesResult\nEbsWriteBytesPerSecond\nEbsWriteOpsPerSecond\nEbuTtDDestinationSettings\nEc2AmiResource\nEc2AmiResources\nEc2AvailabilityZone\nEc2Config\nEc2Configuration\nEc2ImageId\nEc2ImagePropertiesNotSupportedFault\nEc2InstanceAggregation\nEc2InstanceAggregationResponse\nEc2InstanceAttributes\nEc2InstanceConnectEndpoint\nEc2InstanceId\nEc2InstanceIds\nEc2InstanceRegion\nEc2KeyName\nEc2Metadata\nEc2RecommendationsExportPreferences\nEc2RequestFailedException\nEc2SecurityGroupId\nEc2SecurityGroupName\nEc2SecurityGroupOwnerId\nEc2SecurityGroups\nEc2State\nEc2SubnetId\nEc2SubnetIds\nEc2VolumeId\nEchoReduction\nEcmPid\nEcrConfiguration\nEcrConfigurationState\nEcrContainerImageMetadata\nEcrRepositoryConfiguration\nEcrRepositoryMetadata\nEcrRescanDurationState\nEcsCluster\nEcsClusterArn\nEcsClusterArns\nEcsClusterDetails\nEcsClusterName\nEcsClusters\nEcsContainerInstanceArn\nEcsContainerOverride\nEcsEnvironmentFile\nEcsEnvironmentVariable\nEcsEphemeralStorage\nEcsInferenceAcceleratorOverride\nEcsParameters\nEcsResourceRequirement\nEcsTaskDetails\nEcsTaskOverride\nEcsTaskParameters\nEdge\nEdgeAgentStatus\nEdgeConfig\nEdgeConfigs\nEdgeDeployment\nEdgeDeploymentConfig\nEdgeDeploymentFailed\nEdgeDeploymentFailedInStage\nEdgeDeploymentModelConfig\nEdgeDeploymentPending\nEdgeDeploymentPendingInStage\nEdgeDeploymentPlanArn\nEdgeDeploymentPlanName\nEdgeDeploymentPlanSummaries\nEdgeDeploymentPlanSummary\nEdgeDeploymentStageStartTime\nEdgeDeploymentStatus\nEdgeDeploymentStatusMessage\nEdgeDeploymentSuccess\nEdgeDeploymentSuccessInStage\nEdgeLocation\nEdgeLocations\nEdgeMetric\nEdgeModel\nEdgeModelStat\nEdgeModelSummary\nEdgeOutputConfig\nEdgePackagingJobArn\nEdgePackagingJobName\nEdgePackagingJobStatus\nEdgePackagingJobStatusMessage\nEdgePackagingJobSummaries\nEdgePackagingJobSummary\nEdgePresetDeploymentOutput\nEdgeRetentionInHours\nEdgeStatistics\nEdgeStructure\nEdgeSummaryStatistics\nEdgeType\nEdges\nEdiPartyName\nEdition\nEditorId\nEfaInfo\nEfaSupported\nEffect\nEffectiveDate\nEffectiveDeployment\nEffectiveDeploymentStatusDetails\nEffectiveEnd\nEffectiveEngineVersion\nEffectiveOn\nEffectivePatch\nEffectivePatches\nEffectivePermission\nEffectivePolicy\nEffectivePolicyNotFoundException\nEffectiveRecommendationPreferences\nEffectiveStart\nEfsFileLocation\nEfsFileSystemConfiguration\nEfsFilesystemArn\nEfsStorageConfiguration\nEfsVolumeConfiguration\nEgress\nEgressAccessLogs\nEgressBytes\nEgressCidrBlocks\nEgressConfiguration\nEgressDomain\nEgressEndpoint\nEgressEndpoints\nEgressFilter\nEgressFilterRules\nEgressGatewayBridge\nEgressIp\nEgressOnlyInternetGateway\nEgressOnlyInternetGatewayId\nEgressOnlyInternetGatewayIds\nEgressOnlyInternetGateways\nEgressPackets\nEgressType\nEirp\nEksAttemptContainerDetail\nEksAttemptDetail\nEksClusterDetails\nEksConfiguration\nEksContainer\nEksContainerDetail\nEksContainerEnvironmentVariable\nEksContainerOverride\nEksContainerResourceRequirements\nEksContainerSecurityContext\nEksContainerVolumeMount\nEksEmptyDir\nEksHostPath\nEksInfo\nEksMetadata\nEksPodProperties\nEksPodPropertiesDetail\nEksPodPropertiesOverride\nEksProperties\nEksPropertiesDetail\nEksPropertiesOverride\nEksSecret\nEksSource\nEksSourceClusterNamespace\nEksVolume\nElapsedTimeInActiveSeconds\nElapsedTimeInSeconds\nElapsedTimeMillis\nElastiCacheInstanceDetails\nElasticBeanstalkServiceException\nElasticChannelConfiguration\nElasticGpuAssociation\nElasticGpuAssociationId\nElasticGpuAssociationState\nElasticGpuAssociationTime\nElasticGpuAssociations\nElasticGpuHealth\nElasticGpuId\nElasticGpuIds\nElasticGpuSet\nElasticGpuSpecification\nElasticGpuSpecificationResponse\nElasticGpuSpecificationSet\nElasticGpuSpecifications\nElasticGpuState\nElasticGpuType\nElasticGpus\nElasticInferenceAccelerator\nElasticInferenceAcceleratorArn\nElasticInferenceAcceleratorAssociation\nElasticInferenceAcceleratorAssociationId\nElasticInferenceAcceleratorAssociationState\nElasticInferenceAcceleratorAssociationTime\nElasticInferenceAcceleratorAssociations\nElasticInferenceAcceleratorHealth\nElasticInferenceAcceleratorSet\nElasticInferenceAccelerators\nElasticIp\nElasticIpStatus\nElasticIps\nElasticLoadBalancer\nElasticLoadBalancerListener\nElasticLoadBalancerName\nElasticLoadBalancers\nElasticResizeNumberOfNodeOptions\nElasticsearchAction\nElasticsearchBufferingHints\nElasticsearchClusterConfig\nElasticsearchClusterConfigStatus\nElasticsearchDataSourceConfig\nElasticsearchDestinationConfiguration\nElasticsearchDestinationDescription\nElasticsearchDestinationUpdate\nElasticsearchDomainConfig\nElasticsearchDomainStatus\nElasticsearchInstanceCount\nElasticsearchInstanceType\nElasticsearchInstanceTypes\nElasticsearchRetryOptions\nElasticsearchSettings\nElasticsearchVersion\nElasticsearchVersionStatus\nElasticsearchVersions\nElement\nElementId\nElementName\nElementPath\nElementStatuses\nElementType\nElements\nElevation\nElicitSubSlot\nElicitationCodeHookInvocationSetting\nEligibleForReplication\nEmail\nEmailAddress\nEmailAddressInUseException\nEmailChannelRequest\nEmailChannelResponse\nEmailConfiguration\nEmailConfigurationFailure\nEmailConfigurationType\nEmailContent\nEmailField\nEmailForwardingEnabled\nEmailIdentities\nEmailIdentity\nEmailInsights\nEmailMessage\nEmailMessageActivity\nEmailMessageByLink\nEmailRecipients\nEmailReference\nEmailSendingAccount\nEmailSettings\nEmailStatus\nEmailSubject\nEmailSubjectByLink\nEmailTags\nEmailTemplate\nEmailTemplateContent\nEmailTemplateMetadata\nEmailTemplateRequest\nEmailTemplateResponse\nEmailVerificationMessage\nEmailVerificationSubject\nEmails\nEmbedHostDomains\nEmbedUrl\nEmbeddedDestinationSettings\nEmbeddedPlusScte20DestinationSettings\nEmbeddedSourceSettings\nEmbeddedTimecodeOverride\nEmergencyCallingConfiguration\nEmergencyContact\nEmergencyContactList\nEmergencyPhoneNumber\nEmitConsumerLagMetrics\nEmitInterval\nEmotion\nEmotions\nEmptyAsNull\nEmptyBatchRequestException\nEmptyFillColor\nEmptyUploadException\nEmptyVisual\nEmrManagedMasterSecurityGroup\nEmrManagedSlaveSecurityGroup\nEnaSrdEnabled\nEnaSrdSpecification\nEnaSrdSupported\nEnaSrdUdpEnabled\nEnaSrdUdpSpecification\nEnaSupport\nEnable\nEnableAWSServiceAccessRequest\nEnableAcceleration\nEnableAcceptEncodingBrotli\nEnableAcceptEncodingGzip\nEnableActionConfiguration\nEnableAddOnRequest\nEnableAddOnResult\nEnableAdditionalMetadata\nEnableAddressTransferRequest\nEnableAddressTransferResult\nEnableAlarmActionRequest\nEnableAlarmActionsInput\nEnableAllFeaturesResponse\nEnableAllOpsDataSources\nEnableAnswerMachineDetection\nEnableApplicationLayerAutomaticResponseRequest\nEnableAutoHealing\nEnableAwsNetworkPerformanceMetricSubscriptionRequest\nEnableAwsNetworkPerformanceMetricSubscriptionResult\nEnableCapture\nEnableCaseSensitiveIdentifier\nEnableChannelIdentification\nEnableClientAuthenticationRequest\nEnableCloudwatchLogsExports\nEnableContinuousBackup\nEnableControlInput\nEnableControlOutput\nEnableCrossAccountsDiscovery\nEnableCustomerOwnedIp\nEnableDate\nEnableDebugLogDelivery\nEnableDefaultInternetAccess\nEnableDefaultStandards\nEnableDelegatedAdminAccountRequest\nEnableDelegatedAdminAccountResponse\nEnableDialOut\nEnableDictionaryCompression\nEnableDirectoryRequest\nEnableDirectoryResponse\nEnableDns64\nEnableDnsHostnames\nEnableDnsSupport\nEnableDomainAutoRenewRequest\nEnableDomainTransferLockRequest\nEnableDomainTransferLockResponse\nEnableDynamicFieldUpdate\nEnableECSManagedTags\nEnableEbsEncryptionByDefaultRequest\nEnableEbsEncryptionByDefaultResult\nEnableEcsManagedTags\nEnableEnhancedMonitoringInput\nEnableExecuteCommand\nEnableExplanations\nEnableFastLaunchRequest\nEnableFastLaunchResult\nEnableFastSnapshotRestoreErrorItem\nEnableFastSnapshotRestoreStateError\nEnableFastSnapshotRestoreStateErrorItem\nEnableFastSnapshotRestoreSuccessItem\nEnableFastSnapshotRestoresRequest\nEnableFastSnapshotRestoresResult\nEnableGlobalWriteForwarding\nEnableHomogenousTablespace\nEnableHostedZoneDNSSECRequest\nEnableHostedZoneDNSSECResponse\nEnableHttpEndpoint\nEnableHybrid\nEnableIAMDatabaseAuthentication\nEnableImageBlockPublicAccessRequest\nEnableImageBlockPublicAccessResult\nEnableImageDeprecationRequest\nEnableImageDeprecationResult\nEnableImportFindingsForProductRequest\nEnableImportFindingsForProductResponse\nEnableInsightRulesInput\nEnableInsightRulesOutput\nEnableIntegration\nEnableInterContainerTrafficEncryption\nEnableInternetAccess\nEnableInteroperability\nEnableIoTLoggingParams\nEnableIotRoleAlias\nEnableIpamOrganizationAdminAccountRequest\nEnableIpamOrganizationAdminAccountResult\nEnableKeyRequest\nEnableKeyReuseOnNtTokenKeysetStorageFull\nEnableKeyRotationRequest\nEnableLDAPSRequest\nEnableLniAtDeviceIndex\nEnableLocalWriteForwarding\nEnableLogFileValidation\nEnableLogTypes\nEnableLoggingMessage\nEnableMFADeviceRequest\nEnableMachineLearning\nEnableMacieRequest\nEnableMagneticStoreWrites\nEnableMaintenanceMode\nEnableManagedSpotTraining\nEnableManifestOutput\nEnableMediaMetricLogs\nEnableMetricsCollectionQuery\nEnableMinimumEncryptionConfiguration\nEnableNetworkAddressUsageMetrics\nEnableNetworkIsolation\nEnableNonSecurity\nEnableOnlineStore\nEnableOrganizationAdminAccountRequest\nEnablePadding\nEnablePartialResultsStabilization\nEnablePerformanceInsights\nEnablePolicyTypeRequest\nEnablePolicyTypeResponse\nEnablePrimaryIpv6\nEnablePropagateAdditionalUserContextData\nEnableRadiusRequest\nEnableReachabilityAnalyzerOrganizationSharingRequest\nEnableReachabilityAnalyzerOrganizationSharingResult\nEnableRegexInPath\nEnableRegionRequest\nEnableRequest\nEnableResourceNameDnsAAAARecord\nEnableResourceNameDnsAAAARecordOnLaunch\nEnableResourceNameDnsARecord\nEnableResourceNameDnsARecordOnLaunch\nEnableResponse\nEnableRuleRequest\nEnableSIPLogs\nEnableSNI\nEnableSSMAccess\nEnableSageMakerMetricsTimeSeries\nEnableSamplePath\nEnableSecurityHubRequest\nEnableSelfService\nEnableSerialConsoleAccessRequest\nEnableSerialConsoleAccessResult\nEnableSharingWithAwsOrganizationResponse\nEnableSimpleResponses\nEnableSipMediaApplicationMessageLogs\nEnableSnapshotCopyMessage\nEnableSnapshotCopyResult\nEnableSoftwareTokenMFAException\nEnableSsl\nEnableSsoRequest\nEnableStageTransitionInput\nEnableStatistics\nEnableTerminationProtection\nEnableTokenRevocation\nEnableTopicRuleRequest\nEnableTransitGatewayRouteTablePropagationRequest\nEnableTransitGatewayRouteTablePropagationResult\nEnableTunnelLifecycleControl\nEnableUpdateCatalog\nEnableUserRequest\nEnableUserResponse\nEnableVgwRoutePropagationRequest\nEnableVisualization\nEnableVolumeIORequest\nEnableVpcClassicLinkDnsSupportRequest\nEnableVpcClassicLinkDnsSupportResult\nEnableVpcClassicLinkRequest\nEnableVpcClassicLinkResult\nEnableWWWSubdomain\nEnableWorkDocs\nEnableXRay\nEnabled\nEnabledByDefault\nEnabledByMotion\nEnabledCloudWatchLogsExports\nEnabledCloudwatchLogsExports\nEnabledControlSummary\nEnabledDate\nEnabledInBroker\nEnabledMetric\nEnabledMetrics\nEnabledProtocols\nEnabledServicePrincipal\nEnabledServicePrincipals\nEnabledTime\nEnablementType\nEnablingTime\nEncipherOnly\nEnclaveOptions\nEnclaveOptionsRequest\nEncodedData\nEncodedKey\nEncodedMessage\nEncoderProfile\nEncoderSettings\nEncoding\nEncodingName\nEncodingParameters\nEncodingParametersRequest\nEncodingType\nEncrypt\nEncryptDataInput\nEncryptDataOutput\nEncryptRequest\nEncryptResponse\nEncrypted\nEncryptedDecryptionKey\nEncryptedKeyMaterial\nEncryptedPinBlock\nEncryptedWithHSM\nEncryption\nEncryptionAlgorithm\nEncryptionAlgorithmOptions\nEncryptionAlgorithms\nEncryptionAtRest\nEncryptionAtRestOptions\nEncryptionAtRestOptionsStatus\nEncryptionAttributes\nEncryptionConfig\nEncryptionConfiguration\nEncryptionContext\nEncryptionContextEquals\nEncryptionContextSubset\nEncryptionContractConfiguration\nEncryptionDescription\nEncryptionDisabled\nEncryptionEnabled\nEncryptionEntities\nEncryptionEntity\nEncryptionFailure\nEncryptionInTransit\nEncryptionInTransitSupported\nEncryptionInfo\nEncryptionIntegrityChecksFailedException\nEncryptionKey\nEncryptionKeyAccessDeniedException\nEncryptionKeyArn\nEncryptionKeyCheckValue\nEncryptionKeyDisabledException\nEncryptionKeyIdentifier\nEncryptionKeyNotFoundException\nEncryptionKeyUnavailableException\nEncryptionKmsKeyId\nEncryptionMethod\nEncryptionMode\nEncryptionOption\nEncryptionOptions\nEncryptionPolicyCount\nEncryptionSetting\nEncryptionSpecification\nEncryptionStatus\nEncryptionSupport\nEncryptionType\nEnd\nEndBillingPeriod\nEndDate\nEndDateTime\nEndDateType\nEndEventTime\nEndFrameNumber\nEndHour\nEndHourOfDay\nEndLine\nEndMarker\nEndMinuteOfHour\nEndMode\nEndOfMeetingReminder\nEndOffset\nEndOffsetChar\nEndOffsetMillis\nEndPercentage\nEndPoint\nEndPoints\nEndPosition\nEndSession\nEndSessionResult\nEndTime\nEndTimeExclusive\nEndTimeOffset\nEndTimeRange\nEndTimecode\nEndTimecodeSMPTE\nEndTimestamp\nEndTimestampMillis\nEndUrl\nEndUserLicenseAgreement\nEndUserOptedOut\nEndValue\nEndWeekDay\nEndedAt\nEndedTimestamp\nEndingHashKey\nEndingOffsets\nEndingSequenceNumber\nEndpoint\nEndpointAccess\nEndpointAccessList\nEndpointAlreadyExistsException\nEndpointAlreadyExistsFault\nEndpointArn\nEndpointAttributes\nEndpointAuthorization\nEndpointAuthorizationAlreadyExistsFault\nEndpointAuthorizationList\nEndpointAuthorizationNotFoundFault\nEndpointAuthorizationsPerClusterLimitExceededFault\nEndpointBatchItem\nEndpointBatchRequest\nEndpointConfigArn\nEndpointConfigName\nEndpointConfigSummary\nEndpointConfigs\nEndpointConfiguration\nEndpointConfigurations\nEndpointCount\nEndpointCreateTime\nEndpointDemographic\nEndpointDescription\nEndpointDescriptions\nEndpointDetails\nEndpointDisabledException\nEndpointDomain\nEndpointDomainPrefix\nEndpointEventBus\nEndpointFilter\nEndpointGroup\nEndpointGroupAlreadyExistsException\nEndpointGroupArn\nEndpointGroupNotFoundException\nEndpointGroupRegion\nEndpointGroups\nEndpointId\nEndpointIdentifier\nEndpointIdentifiers\nEndpointIds\nEndpointInfo\nEndpointInput\nEndpointInputConfiguration\nEndpointIpAddress\nEndpointIpAddressRange\nEndpointItemResponse\nEndpointLocation\nEndpointMessageResult\nEndpointMetadata\nEndpointMetrics\nEndpointName\nEndpointNetworkConfiguration\nEndpointNotFoundException\nEndpointNotFoundFault\nEndpointOutputConfiguration\nEndpointPerformance\nEndpointPerformances\nEndpointPort\nEndpointProperties\nEndpointPropertiesList\nEndpointPublicAccess\nEndpointReentryCap\nEndpointReentryInterval\nEndpointRequest\nEndpointResponse\nEndpointResult\nEndpointSendConfiguration\nEndpointSetting\nEndpointSettings\nEndpointState\nEndpointStatus\nEndpointSummary\nEndpointTemporarilyUnavailableException\nEndpointType\nEndpointTypes\nEndpointURL\nEndpointUri\nEndpointUrl\nEndpointUser\nEndpoints\nEndpointsPerAuthorizationLimitExceededFault\nEndpointsPerClusterLimitExceededFault\nEndpointsResponse\nEndsWith\nEnforceConsumerDeletion\nEnforceHTTPS\nEnforceProvidedLabels\nEnforceSecurityGroupInboundRulesOnPrivateLinkTraffic\nEnforceWorkGroupConfiguration\nEnforced\nEnforcedLimit\nEnforcementInRecord\nEnforcementStatus\nEngagement\nEngagementArn\nEngagementId\nEngagementMetrics\nEngagements\nEngine\nEngineArn\nEngineAttribute\nEngineAttributes\nEngineConfiguration\nEngineDefaults\nEngineDisplayName\nEngineEdition\nEngineExecutionTimeInMillis\nEngineFamily\nEngineFullVersion\nEngineMode\nEngineModel\nEngineName\nEngineNativeAuditFieldsIncluded\nEngineNotSupportedException\nEnginePatchVersion\nEngineSecurityGroupId\nEngineTranscribeMedicalSettings\nEngineTranscribeSettings\nEngineType\nEngineVersion\nEngineVersionInfo\nEngineVersions\nEngineVersionsSummary\nEngineWorkflowResourceIdentifier\nEnhancedImageScanFinding\nEnhancedMetrics\nEnhancedMonitoring\nEnhancedMonitoringOutput\nEnhancedMonitoringResourceArn\nEnhancedVpcRouting\nEniId\nEniIp\nEniPrivateIpAddress\nEnqueueTimestamp\nEnrichment\nEnrichmentParameters\nEnroll\nEnrollmentConfig\nEnrollmentFilter\nEnrollmentFlags\nEnrollmentFlagsV2\nEnrollmentFlagsV3\nEnrollmentFlagsV4\nEnrollmentId\nEnrollmentJobFraudDetectionConfig\nEnrollmentStatus\nEnsureNoBackupInProcess\nEnterStandbyAnswer\nEnterStandbyQuery\nEnterpriseId\nEntities\nEntitiesDetectionJobFilter\nEntitiesDetectionJobProperties\nEntitiesDetectionJobPropertiesList\nEntitledApplication\nEntitledApplications\nEntitlement\nEntitlementAlreadyExistsException\nEntitlementArn\nEntitlementAttribute\nEntitlementData\nEntitlementName\nEntitlementNotAllowedException\nEntitlementNotFoundException\nEntitlementStatus\nEntitlementUsage\nEntitlementUsages\nEntitlementValue\nEntitlements\nEntitlementsAllowed\nEntity\nEntityAccountFilter\nEntityAggregate\nEntityAlreadyExistsException\nEntityAlreadyRegisteredException\nEntityArn\nEntityConfiguration\nEntityDescription\nEntityDetails\nEntityDetailsList\nEntityDetectorConfiguration\nEntityDisplayData\nEntityDoesNotExistException\nEntityFilter\nEntityId\nEntityIdList\nEntityIdentifier\nEntityIds\nEntityInfo\nEntityItem\nEntityLabel\nEntityList\nEntityName\nEntityNotExistsException\nEntityNotFoundException\nEntityPath\nEntityPersonaConfiguration\nEntityPropertyReference\nEntityRecognitionConfig\nEntityRecognizerAnnotations\nEntityRecognizerArn\nEntityRecognizerDocuments\nEntityRecognizerEntityList\nEntityRecognizerEvaluationMetrics\nEntityRecognizerFilter\nEntityRecognizerInputDataConfig\nEntityRecognizerMetadata\nEntityRecognizerMetadataEntityTypesListItem\nEntityRecognizerOutputDataConfig\nEntityRecognizerProperties\nEntityRecognizerPropertiesList\nEntityRecognizerSummariesList\nEntityRecognizerSummary\nEntitySelectorExpression\nEntityStateException\nEntitySummary\nEntitySummaryList\nEntitySynonyms\nEntityTags\nEntityTemporarilyUnmodifiableException\nEntityType\nEntityTypes\nEntityTypesEvaluationMetrics\nEntityTypesListItem\nEntityTypesToDetect\nEntries\nEntropyEncoding\nEntry\nEntryCount\nEntryPoint\nEnumDefinition\nEnumValues\nEnumerationValue\nEnvironment\nEnvironmentAccountConnection\nEnvironmentAccountConnectionSummary\nEnvironmentArn\nEnvironmentClass\nEnvironmentDescription\nEnvironmentDescriptionsMessage\nEnvironmentError\nEnvironmentFile\nEnvironmentFiles\nEnvironmentId\nEnvironmentIdentifier\nEnvironmentIds\nEnvironmentImage\nEnvironmentInfo\nEnvironmentInfoDescription\nEnvironmentInformation\nEnvironmentLanguage\nEnvironmentLifecycle\nEnvironmentLink\nEnvironmentLinks\nEnvironmentMember\nEnvironmentName\nEnvironmentNames\nEnvironmentParameter\nEnvironmentParameterRanges\nEnvironmentParameters\nEnvironmentPlatform\nEnvironmentProperties\nEnvironmentPropertyDescriptions\nEnvironmentPropertyUpdates\nEnvironmentQuota\nEnvironmentResourceDescription\nEnvironmentResourceDescriptionsMessage\nEnvironmentResources\nEnvironmentResourcesDescription\nEnvironmentResponse\nEnvironmentState\nEnvironmentSummary\nEnvironmentSummaryList\nEnvironmentTemplate\nEnvironmentTemplateFilter\nEnvironmentTemplateSummary\nEnvironmentTemplateVersion\nEnvironmentTemplateVersionSummary\nEnvironmentTier\nEnvironmentVariable\nEnvironmentVariables\nEnvironmentVpc\nEnvironmentVpcList\nEnvironments\nEoCloudCover\nEoCloudCoverInput\nEphemeralStorage\nEphemerisDescription\nEphemerisIdResponse\nEphemerisItem\nEphemerisMetaData\nEpisodeId\nEpoch\nEpochLockingSettings\nEpss\nEpssDetails\nEpssScore\nEq\nEquals\nEqualsTo\nEqualsValue\nEquation\nEquipment\nEquipmentDetection\nEquipmentDetections\nError\nErrorArguments\nErrorAttribute\nErrorCachingMinTTL\nErrorCategory\nErrorCause\nErrorClearTimeMsec\nErrorCode\nErrorCodeReason\nErrorCount\nErrorData\nErrorDescription\nErrorDetail\nErrorDetailList\nErrorDetails\nErrorDocument\nErrorEntries\nErrorHandlingConfig\nErrorId\nErrorInfo\nErrorInformation\nErrorList\nErrorMessage\nErrorMetric\nErrorMetrics\nErrorName\nErrorOutputPrefix\nErrorPercentage\nErrorReason\nErrorReportConfiguration\nErrorReportLocation\nErrorResponse\nErrorRetryDuration\nErrorRootCause\nErrorRootCauseEntity\nErrorRootCauseService\nErrorRootCauses\nErrorStatistics\nErrorString\nErrorTimestamp\nErrorTopic\nErrorType\nErrorValue\nErroredActions\nErrors\nErrorsListItem\nEsRateInPes\nEsam\nEsamManifestConfirmConditionNotification\nEsamSettings\nEsamSignalProcessingNotification\nEscapeChar\nEscaper\nEsps\nEssential\nEstablished\nEstablishedMultiRegionAccessPointPolicy\nEstimateByTime\nEstimateTemplateCostInput\nEstimateTemplateCostOutput\nEstimated\nEstimatedAverageCoverage\nEstimatedAverageUtilization\nEstimatedBreakEvenInMonths\nEstimatedBytesToTransfer\nEstimatedCompletionTime\nEstimatedCoverage\nEstimatedDataToScanBytes\nEstimatedDiskUtilizationPercent\nEstimatedEvaluationTimeRemainingInMinutes\nEstimatedFilesToDelete\nEstimatedFilesToTransfer\nEstimatedInstanceWarmup\nEstimatedMonthlyCost\nEstimatedMonthlyOnDemandCost\nEstimatedMonthlySavings\nEstimatedMonthlySavingsAmount\nEstimatedMonthlySavingsPercentage\nEstimatedMonthlyStorageCost\nEstimatedNewCommitmentUtilization\nEstimatedNumberOfUsers\nEstimatedOnDemandCost\nEstimatedOnDemandCostWithCurrentCommitment\nEstimatedProgress\nEstimatedROI\nEstimatedReservationCostForLookbackPeriod\nEstimatedResourceSize\nEstimatedSPCost\nEstimatedSavingsAmount\nEstimatedSavingsPercentage\nEstimatedSecondsToCompletion\nEstimatedTimeRemainingInMinutes\nEstimatedTimeToCompletionInSeconds\nEstimatedTotalCost\nEstimatedTotalMonthlySavingsAmount\nEstimatedUpdateTime\nEstimatedWaitTime\nEtag\nEthereum\nEthernet0\nEthernet0Status\nEthernet1\nEthernet1Status\nEthernetPayload\nEthernetStatus\nEtvPlatformPid\nEtvSignalPid\nEuid\nEula\nEulaAcceptance\nEutranCid\nEvalActionName\nEvalDecision\nEvalDecisionDetails\nEvalResourceDecision\nEvalResourceName\nEvaluateCodeErrorDetail\nEvaluateCodeRequest\nEvaluateCodeResponse\nEvaluateDataQuality\nEvaluateDataQualityMultiFrame\nEvaluateExpressionInput\nEvaluateExpressionOutput\nEvaluateFeatureRequest\nEvaluateFeatureResponse\nEvaluateLowSampleCountPercentile\nEvaluateMappingTemplateRequest\nEvaluateMappingTemplateResponse\nEvaluateOnExit\nEvaluatePullRequestApprovalRulesInput\nEvaluatePullRequestApprovalRulesOutput\nEvaluateSessionRequest\nEvaluateSessionResponse\nEvaluateTargetHealth\nEvaluatedExternalModel\nEvaluatedMetrics\nEvaluatedModelArn\nEvaluatedModelMetrics\nEvaluatedModelVersion\nEvaluatedRule\nEvaluation\nEvaluationAnswerInput\nEvaluationAnswerOutput\nEvaluationArn\nEvaluationContext\nEvaluationContextIdentifier\nEvaluationDataEndTime\nEvaluationDataSourceId\nEvaluationDataStartTime\nEvaluationEndTimestamp\nEvaluationErrorItem\nEvaluationForm\nEvaluationFormArn\nEvaluationFormContent\nEvaluationFormId\nEvaluationFormNumericQuestionOption\nEvaluationFormNumericQuestionProperties\nEvaluationFormQuestion\nEvaluationFormScoringStrategy\nEvaluationFormSection\nEvaluationFormSingleSelectQuestionAutomation\nEvaluationFormSingleSelectQuestionOption\nEvaluationFormSingleSelectQuestionProperties\nEvaluationFormSummary\nEvaluationFormSummaryList\nEvaluationFormTitle\nEvaluationFormVersion\nEvaluationFormVersionSummary\nEvaluationFormVersionSummaryList\nEvaluationId\nEvaluationLimitExceeded\nEvaluationManifest\nEvaluationManifestS3Prefix\nEvaluationMessage\nEvaluationMetadata\nEvaluationMetrics\nEvaluationMode\nEvaluationModeConfiguration\nEvaluationModes\nEvaluationName\nEvaluationNote\nEvaluationParameters\nEvaluationPeriod\nEvaluationPeriods\nEvaluationRequest\nEvaluationResult\nEvaluationResultIdentifier\nEvaluationResultQualifier\nEvaluationResults\nEvaluationRule\nEvaluationScore\nEvaluationStartDate\nEvaluationStartTimestamp\nEvaluationState\nEvaluationStatus\nEvaluationSummary\nEvaluationSummaryList\nEvaluationTime\nEvaluationTimeout\nEvaluationType\nEvaluationWaitTime\nEvaluations\nEvaluatorArn\nEvent\nEventAccountFilter\nEventAction\nEventActionArn\nEventActionEntry\nEventActionId\nEventActions\nEventAggregate\nEventArn\nEventBatchingCondition\nEventBridge\nEventBridgeAction\nEventBridgeActionDefinition\nEventBridgeBus\nEventBridgeConfiguration\nEventBridgeDataSourceConfig\nEventBridgeDestinationProperties\nEventBridgeEnabled\nEventBridgeEventBusParameters\nEventBridgeParameters\nEventBridgeRuleName\nEventBus\nEventBusArn\nEventBusName\nEventBuses\nEventCategories\nEventCategoriesList\nEventCategoriesMap\nEventCategoriesMapList\nEventCategoriesMessage\nEventCategory\nEventCategoryGroup\nEventCategoryGroupList\nEventClass\nEventCode\nEventCondition\nEventConfigurationItem\nEventConfigurationsList\nEventContextData\nEventContextDataType\nEventCount\nEventDataStore\nEventDataStoreARNInvalidException\nEventDataStoreAlreadyExistsException\nEventDataStoreArn\nEventDataStoreHasOngoingImportException\nEventDataStoreMaxLimitExceededException\nEventDataStoreNotFoundException\nEventDataStoreTerminationProtectedException\nEventDataStores\nEventDate\nEventDescription\nEventDescriptionsMessage\nEventDestination\nEventDestinationAlreadyExistsException\nEventDestinationDefinition\nEventDestinationDoesNotExistException\nEventDestinationName\nEventDestinations\nEventDetail\nEventDetails\nEventDetailsErrorItem\nEventDimensions\nEventDurationInSeconds\nEventEndTime\nEventFeedback\nEventFeedbackType\nEventFilter\nEventFirstSeen\nEventId\nEventIdMode\nEventIncludedData\nEventInfo\nEventInfoMap\nEventInformation\nEventIngestionUrl\nEventIntegration\nEventIntegrationArn\nEventIntegrationAssociation\nEventIntegrationAssociationArn\nEventIntegrationAssociationId\nEventIntegrationAssociations\nEventIntegrationName\nEventIntegrations\nEventItemResponse\nEventLastReplayedTime\nEventLastSeen\nEventList\nEventLog\nEventLogEntry\nEventName\nEventNotificationItemConfigurations\nEventObject\nEventOrchestration\nEventParameters\nEventPattern\nEventPayload\nEventPredictionSummary\nEventQueueArn\nEventResource\nEventResourceARN\nEventResourceName\nEventResourceType\nEventResponse\nEventRisk\nEventRiskType\nEventSelector\nEventSelectors\nEventSource\nEventSourceArn\nEventSourceId\nEventSourceMappingConfiguration\nEventSourceMappings\nEventSourceName\nEventSourceToken\nEventSources\nEventSourcesConfig\nEventStartCondition\nEventStartTime\nEventStatus\nEventStopBehavior\nEventStream\nEventStreamArn\nEventStreamDestinationDetails\nEventStreamName\nEventStreamSummary\nEventSubType\nEventSubscription\nEventSubscriptionArn\nEventSubscriptionQuotaExceededFault\nEventSubscriptionsList\nEventSubscriptionsMessage\nEventSummary\nEventTaggingEnabled\nEventThreshold\nEventTime\nEventTimeFeatureName\nEventTimeRange\nEventTopic\nEventTopics\nEventTracker\nEventTrackerSummary\nEventTriggerDefinition\nEventTriggers\nEventType\nEventTypeFilter\nEventTypeId\nEventTypeIds\nEventTypeName\nEventTypeSummary\nEventTypes\nEventVariableSummary\nEvents\nEventsBatch\nEventsCompleted\nEventsConfiguration\nEventsDetectionJobFilter\nEventsDetectionJobProperties\nEventsDetectionJobPropertiesList\nEventsItemResponse\nEventsMatched\nEventsMessage\nEventsPollInterval\nEventsRequest\nEventsResponse\nEventsScanned\nEvidence\nEvidenceFinderEnablement\nEvidenceInsights\nEwsAvailabilityProvider\nEwsEndpoint\nEwsPassword\nEwsProvider\nEwsUsername\nExactCidrMatches\nExactFramerate\nExactSettings\nExample\nExampleError\nExasolParameters\nExceedsLimitException\nExcel\nExcelOptions\nExceptionCause\nExceptionDescription\nExceptionName\nExceptionResponse\nExceptionType\nExceptions\nExcessCapacityTerminationPolicy\nExchangeCodeForTokenRequest\nExchangeCodeForTokenRequestBody\nExchangeCodeForTokenResponse\nExchangeId\nExchangedReservedNode\nExclude\nExcludeArchived\nExcludeAttachmentFilePatterns\nExcludeBootVolume\nExcludeCharacters\nExcludeColumnSchema\nExcludeCompliantResources\nExcludeDataVolumeIds\nExcludeDataVolumeTags\nExcludeDevicesDeployedInOtherStage\nExcludeFeaturesAttribute\nExcludeFilters\nExcludeLowercase\nExcludeManagementEventSources\nExcludeMap\nExcludeMimeTypes\nExcludeNumbers\nExcludePaths\nExcludePeriodConfiguration\nExcludePunctuation\nExcludeResourceTags\nExcludeRetainedVariantProperties\nExcludeSharedDrives\nExcludeSpaces\nExcludeSpecifiedAccounts\nExcludeSpecifiedOrganizationalUnits\nExcludeUppercase\nExcludeUserAccounts\nExcludeVerboseContent\nExcludedAccounts\nExcludedAttendeeIds\nExcludedColumnNames\nExcludedCookies\nExcludedHeaders\nExcludedInstanceTypes\nExcludedMembers\nExcludedPages\nExcludedRule\nExcludedRules\nExcludedTimeRanges\nExcludes\nExclusion\nExclusionByResourceTypes\nExclusionFileNamePatterns\nExclusionFileTypePatterns\nExclusionFolderNamePatterns\nExclusionPatterns\nExclusionPreview\nExclusions\nExclusiveEndBillingPeriod\nExclusiveEndTime\nExclusiveStartApplicationName\nExclusiveStartBackupArn\nExclusiveStartDeliveryStreamName\nExclusiveStartDestinationId\nExclusiveStartGlobalTableName\nExclusiveStartKey\nExclusiveStartShardId\nExclusiveStartStreamArn\nExclusiveStartStreamName\nExclusiveStartTableName\nExclusiveStartTagKey\nExecArgs\nExecutable\nExecutableParameters\nExecutablePath\nExecutableSha256\nExecutableUsers\nExecuteBudgetActionRequest\nExecuteBudgetActionResponse\nExecuteChangeSetInput\nExecuteCommandConfiguration\nExecuteCommandLogConfiguration\nExecuteCommandRequest\nExecuteCommandResponse\nExecuteCommandSessionConfiguration\nExecuteCoreNetworkChangeSetRequest\nExecuteFastResetInput\nExecuteFastResetOutput\nExecuteGremlinExplainQueryInput\nExecuteGremlinExplainQueryOutput\nExecuteGremlinProfileQueryInput\nExecuteGremlinProfileQueryOutput\nExecuteGremlinQueryInput\nExecuteGremlinQueryOutput\nExecuteOpenCypherExplainQueryInput\nExecuteOpenCypherExplainQueryOutput\nExecuteOpenCypherQueryInput\nExecuteOpenCypherQueryOutput\nExecutePolicyType\nExecuteProvisionedProductPlanInput\nExecuteProvisionedProductPlanOutput\nExecuteProvisionedProductServiceActionInput\nExecuteProvisionedProductServiceActionOutput\nExecuteQueryRequest\nExecuteQueryResponse\nExecuteScheduledQueryRequest\nExecuteSqlRequest\nExecuteSqlResponse\nExecuteStatement\nExecuteStatementException\nExecuteStatementInput\nExecuteStatementOutput\nExecuteStatementRequest\nExecuteStatementResponse\nExecuteStatementResult\nExecuteTimeout\nExecuteToken\nExecuteTransactionInput\nExecuteTransactionOutput\nExecutedBy\nExecutedTime\nExecutedVersion\nExecution\nExecutionAbortedEventDetails\nExecutionAlreadyExists\nExecutionClass\nExecutionConfiguration\nExecutionControls\nExecutionCount\nExecutionDate\nExecutionDetails\nExecutionDoesNotExist\nExecutionElapsedTime\nExecutionEndDateTime\nExecutionEndTime\nExecutionEngine\nExecutionEngineConfig\nExecutionEngineId\nExecutionError\nExecutionErrorDetails\nExecutionFailedEventDetails\nExecutionId\nExecutionLimitExceeded\nExecutionList\nExecutionListItem\nExecutionMessage\nExecutionMetrics\nExecutionOrder\nExecutionParameter\nExecutionParameters\nExecutionProperty\nExecutionRecord\nExecutionResult\nExecutionResults\nExecutionRole\nExecutionRoleArn\nExecutionRoleIdentityConfig\nExecutionRoleName\nExecutionStartDateTime\nExecutionStartTime\nExecutionStartedEventDetails\nExecutionStatistics\nExecutionStats\nExecutionStatus\nExecutionStatusDetail\nExecutionStepResult\nExecutionSucceededEventDetails\nExecutionSummary\nExecutionTime\nExecutionTimeFilter\nExecutionTimeInMillis\nExecutionTimedOutEventDetails\nExecutionTimeout\nExecutionTrigger\nExecutionType\nExecutions\nExecutorConfiguration\nExecutorId\nExecutorSize\nExecutorState\nExecutorStateFilter\nExecutorType\nExecutorsSummary\nExistingEnrollmentAction\nExistingHourlyCommitment\nExistingObjectReplication\nExistingVersion\nExists\nExitCode\nExitMessage\nExitStandbyAnswer\nExitStandbyQuery\nExpected\nExpectedAttributeValue\nExpectedBucketOwner\nExpectedCompletionDate\nExpectedCompletionTimeMinutes\nExpectedFirewallEndpoint\nExpectedFirewallSubnetId\nExpectedFirewallSubnetRoutes\nExpectedInternetGatewayRoutes\nExpectedManifestBucketOwner\nExpectedNextSnapshotScheduleTime\nExpectedNextSnapshotScheduleTimeStatus\nExpectedPolicyDescription\nExpectedProperties\nExpectedResourceUtilization\nExpectedRoute\nExpectedRouteTable\nExpectedRoutes\nExpectedSourceBucketOwner\nExpectedValue\nExpenseCurrency\nExpenseDetection\nExpenseDocument\nExpenseDocuments\nExpenseField\nExpenseGroupProperty\nExpenseIndex\nExpenseType\nExperienceConfiguration\nExperienceEndpoint\nExperienceEntitiesSummary\nExperienceScore\nExperiencesSummary\nExperiment\nExperimentAction\nExperimentActionState\nExperimentArn\nExperimentCloudWatchLogsLogConfiguration\nExperimentConfig\nExperimentExecution\nExperimentLogConfiguration\nExperimentName\nExperimentReport\nExperimentResultsData\nExperimentS3LogConfiguration\nExperimentSchedule\nExperimentSource\nExperimentState\nExperimentStopCondition\nExperimentSummaries\nExperimentSummary\nExperimentTarget\nExperimentTargetFilter\nExperimentTemplate\nExperimentTemplateAction\nExperimentTemplateCloudWatchLogsLogConfiguration\nExperimentTemplateCloudWatchLogsLogConfigurationInput\nExperimentTemplateLogConfiguration\nExperimentTemplateS3LogConfiguration\nExperimentTemplateS3LogConfigurationInput\nExperimentTemplateStopCondition\nExperimentTemplateSummary\nExperimentTemplateTarget\nExperimentTemplateTargetFilter\nExperimentTemplateTargetInputFilter\nExpiration\nExpirationCriterion\nExpirationDate\nExpirationDays\nExpirationInDays\nExpirationModel\nExpirationSettings\nExpirationTime\nExpirationTimeResponse\nExpirationTimestamp\nExpireAt\nExpirePasswords\nExpireSessionRequest\nExpireTime\nExpired\nExpiredAt\nExpiredCodeException\nExpiredException\nExpiredImportTokenException\nExpiredIteratorException\nExpiredNextTokenException\nExpiredObjectDeleteMarker\nExpiredStreamException\nExpiredTokenException\nExpires\nExpiresAfter\nExpiresAt\nExpiresIn\nExpiresInSeconds\nExpiringVersion\nExpiry\nExpiryDateTime\nExpiryEvents\nExpiryEventsConfiguration\nExpiryMinutes\nExpiryTime\nExpiryTimestamp\nExplainPredictor\nExplainabilities\nExplainability\nExplainabilityArn\nExplainabilityConfig\nExplainabilityExportArn\nExplainabilityExportName\nExplainabilityExportSummary\nExplainabilityExports\nExplainabilityInfo\nExplainabilityName\nExplainabilitySummary\nExplainerConfig\nExplanation\nExplanationCode\nExplanations\nExplicitAuthFlows\nExplicitDeny\nExplicitHashKey\nExplicitHierarchy\nExplicitIds\nExploitAvailable\nExploitObserved\nExploitabilityDetails\nExponentialRolloutRate\nExport\nExportApiRequest\nExportApiResponse\nExportArn\nExportArtifacts\nExportAssetToSignedUrl\nExportAssetToSignedUrlRequestDetails\nExportAssetToSignedUrlResponseDetails\nExportAssetsToS3\nExportAssetsToS3RequestDetails\nExportAssetsToS3ResponseDetails\nExportAttributeName\nExportAutoScalingGroupRecommendationsRequest\nExportAutoScalingGroupRecommendationsResponse\nExportBackupPlanTemplateInput\nExportBackupPlanTemplateOutput\nExportBundleRequest\nExportBundleResult\nExportCertificateRequest\nExportCertificateResponse\nExportClientVpnClientCertificateRevocationListRequest\nExportClientVpnClientCertificateRevocationListResult\nExportClientVpnClientConfigurationRequest\nExportClientVpnClientConfigurationResult\nExportComponentsRequest\nExportComponentsResponse\nExportConfigurationsResponse\nExportConflictException\nExportCreationTime\nExportDataSource\nExportDescription\nExportDestination\nExportEBSVolumeRecommendationsRequest\nExportEBSVolumeRecommendationsResponse\nExportEC2InstanceRecommendationsRequest\nExportEC2InstanceRecommendationsResponse\nExportECSServiceRecommendationsRequest\nExportECSServiceRecommendationsResponse\nExportEarthObservationJobInput\nExportEarthObservationJobOutput\nExportErrorData\nExportErrorDetails\nExportErrorDetailsOutput\nExportFilter\nExportFormat\nExportFormsRequest\nExportFormsResponse\nExportFromTime\nExportHiddenFieldsOption\nExportId\nExportImageRequest\nExportImageResult\nExportImageTask\nExportImageTaskId\nExportImageTaskIds\nExportImageTasks\nExportInfo\nExportJobProperties\nExportJobPropertiesList\nExportJobRequest\nExportJobResource\nExportJobResponse\nExportJobSummary\nExportJobs\nExportJobsResponse\nExportJournalToS3Request\nExportJournalToS3Response\nExportKeyIdentifier\nExportKeyInput\nExportKeyOutput\nExportLabelsTaskRunProperties\nExportLambdaFunctionRecommendationsRequest\nExportLambdaFunctionRecommendationsResponse\nExportLensInput\nExportLensOutput\nExportLicenseRecommendationsRequest\nExportLicenseRecommendationsResponse\nExportManifest\nExportMetadataModelAssessmentMessage\nExportMetadataModelAssessmentResponse\nExportMetadataModelAssessmentResultEntry\nExportMetric\nExportName\nExportNotFoundException\nExportNotebookInput\nExportNotebookOutput\nExportOnly\nExportPath\nExportProjectRequest\nExportProjectResult\nExportReadSet\nExportReadSetDetail\nExportReadSetFilter\nExportReadSetJobDetail\nExportResourceSpecification\nExportResponse\nExportResults\nExportRevisionToS3\nExportRevisionsToS3\nExportRevisionsToS3RequestDetails\nExportRevisionsToS3ResponseDetails\nExportS3DataInput\nExportSchemaRequest\nExportSchemaResponse\nExportServerEngineAttributeRequest\nExportServerEngineAttributeResponse\nExportServerSideEncryption\nExportSnapshotRecord\nExportSnapshotRecordSourceInfo\nExportSnapshotRequest\nExportSnapshotResult\nExportSortBy\nExportSourceImages\nExportSourceNetworkCfnTemplateRequest\nExportSourceNetworkCfnTemplateResponse\nExportSourceType\nExportSqlDetails\nExportStatistics\nExportStatus\nExportSummaries\nExportSummary\nExportTableToPointInTimeInput\nExportTableToPointInTimeOutput\nExportTask\nExportTaskAlreadyExistsFault\nExportTaskError\nExportTaskExecutionInfo\nExportTaskId\nExportTaskIdentifier\nExportTaskIds\nExportTaskNotFoundFault\nExportTaskS3Location\nExportTaskS3LocationRequest\nExportTaskStatus\nExportTaskSummary\nExportTasks\nExportTasksMessage\nExportThemesRequest\nExportThemesResponse\nExportTime\nExportToCSVOption\nExportToS3Task\nExportToS3TaskSpecification\nExportToTime\nExportToken\nExportTr31KeyBlock\nExportTr34KeyBlock\nExportTransitGatewayRoutesRequest\nExportTransitGatewayRoutesResult\nExportType\nExportVectorEnrichmentJobInput\nExportVectorEnrichmentJobOutput\nExportVectorEnrichmentJobOutputConfig\nExportVersion\nExportViewType\nExportWithHiddenFieldsOption\nExportable\nExportableKey\nExportableLogTypes\nExported\nExportedEnvironmentVariable\nExportedRecordsCount\nExportingConfig\nExportingLocation\nExportingStackId\nExports\nExposeHeaders\nExpression\nExpressionAttributeNames\nExpressionAttributeValues\nExpressionName\nExpressionNames\nExpressionStatus\nExpressionType\nExpressionValue\nExpressionVariable\nExpressions\nExtendLicenseConsumptionRequest\nExtendLicenseConsumptionResponse\nExtendTransactionRequest\nExtendedDataServices\nExtendedKeyUsage\nExtendedKeyUsageObjectIdentifier\nExtendedKeyUsageType\nExtendedKeyUsages\nExtendedS3DestinationConfiguration\nExtendedS3DestinationDescription\nExtendedS3DestinationUpdate\nExtendedStatistic\nExtendedStatistics\nExtension\nExtensionArn\nExtensionAssociation\nExtensionAssociationId\nExtensionAssociationSummary\nExtensionAssociations\nExtensionDetails\nExtensionField\nExtensionFields\nExtensionId\nExtensionIdentifier\nExtensionSummary\nExtensionVersion\nExtensionVersionDetails\nExtensionVersionNumber\nExtensionVersions\nExtensions\nExtensionsV2\nExtensionsV3\nExtensionsV4\nExternalAudioFileInput\nExternalDataFilteringAllowList\nExternalEvaluation\nExternalEventsDetail\nExternalId\nExternalIds\nExternalImageId\nExternalLoginFederationProviderType\nExternalLoginFederationProviderUrl\nExternalLoginId\nExternalMeetingId\nExternalMetricStatus\nExternalMetricsPreference\nExternalModel\nExternalModelOutputs\nExternalModelSummary\nExternalServiceException\nExternalSourceSetting\nExternalTableDefinition\nExternalUrlConfig\nExternalUserId\nExternalUserIds\nExternalWorkflowExecutionCancelRequestedEventAttributes\nExternalWorkflowExecutionSignaledEventAttributes\nExtraArchivedLogDestIds\nExtraConnectionAttributes\nExtraHosts\nExtraJarsS3Path\nExtraParam\nExtraParams\nExtraPythonLibsS3Path\nExtractDocId\nExtractedCharacters\nExtractedCharactersListItem\nExtraction\nExtractions\nEyeDirection\nEyeOpen\nEyeglasses\nEyesOpen\nF1\nF1Score\nF4vSettings\nFCntStart\nFIAuthKey\nFIPSEnabled\nFMSPolicyUpdateFirewallCreationConfigAction\nFNwkSIntKey\nFPort\nFPorts\nFQDN\nFSxWindowsFileServerAuthorizationConfig\nFSxWindowsFileServerVolumeConfiguration\nFabric\nFace\nFaceAttributes\nFaceCount\nFaceDetail\nFaceDetails\nFaceDetection\nFaceId\nFaceIds\nFaceMatch\nFaceMatchThreshold\nFaceMatches\nFaceModelVersion\nFaceModelVersions\nFaceOccluded\nFaceRecord\nFaceRecords\nFaceSearch\nFaceSearchSettings\nFacebook\nFaces\nFacet\nFacetAlreadyExistsException\nFacetAttribute\nFacetAttributeDefinition\nFacetAttributeReference\nFacetAttributeUpdate\nFacetEnabled\nFacetFilter\nFacetInUseException\nFacetName\nFacetNames\nFacetNotFoundException\nFacetResult\nFacetResults\nFacetStyle\nFacetValidationException\nFacetable\nFacets\nFactoryPresetFreqsList\nFactorySupport\nFadeIn\nFadeOut\nFail\nFailOnWarnings\nFailStepMetadata\nFailTasksOnLobTruncation\nFailWorkflowExecutionDecisionAttributes\nFailWorkflowExecutionFailedEventAttributes\nFailed\nFailedAccount\nFailedActions\nFailedAssociatedResources\nFailedBatchItem\nFailedBatches\nFailedCampaignStateResponse\nFailedCapacityReservationFleetCancellationResult\nFailedCount\nFailedCreateAssociation\nFailedCreateSimulationJobRequest\nFailedCreateStandbyWorkspacesRequest\nFailedCreateWorkspaceRequest\nFailedCustomVocabularyItem\nFailedDeleteRemediationExceptionsBatch\nFailedDependencyException\nFailedDisassociatedResources\nFailedDocuments\nFailedEntity\nFailedEntityList\nFailedEntries\nFailedEntryCount\nFailedEvaluations\nFailedFindings\nFailedFleetCancellations\nFailedImportedDeviceCount\nFailedItem\nFailedItemDetails\nFailedItems\nFailedLoginAttempts\nFailedMemberAccountEc2DeepInspectionStatusState\nFailedNonRetryableError\nFailedPieces\nFailedPutCount\nFailedQueuedPurchaseDeletion\nFailedQueuedPurchaseDeletions\nFailedReason\nFailedRecordCount\nFailedRecordsCount\nFailedRecordsS3Url\nFailedRemediationBatch\nFailedRemediationExceptionBatch\nFailedRequest\nFailedRequests\nFailedResource\nFailedResourceAccessException\nFailedResourcesMap\nFailedS3Resource\nFailedScheduledActions\nFailedScheduledUpdateGroupActionRequest\nFailedScheduledUpdateGroupActions\nFailedServiceActionAssociation\nFailedServiceActionAssociations\nFailedStackInstancesCount\nFailedStandbyRequests\nFailedStatusDetails\nFailedSteps\nFailedUsers\nFailedWorkspaceChangeRequest\nFailover\nFailoverCondition\nFailoverConditionSettings\nFailoverConditions\nFailoverConfig\nFailoverCriteria\nFailoverDBClusterMessage\nFailoverDBClusterResult\nFailoverGlobalClusterMessage\nFailoverGlobalClusterResult\nFailoverGlobalReplicationGroupMessage\nFailoverGlobalReplicationGroupResult\nFailoverMode\nFailoverShardRequest\nFailoverShardResponse\nFailoverState\nFailure\nFailureAction\nFailureByQueryException\nFailureCause\nFailureCode\nFailureCodes\nFailureDescription\nFailureDetails\nFailureException\nFailureHandlingPolicy\nFailureInfo\nFailureLocation\nFailureMessage\nFailureMessages\nFailureMode\nFailurePolicy\nFailureReason\nFailureReasons\nFailureRedirectionURL\nFailureResource\nFailureRetentionPeriodInDays\nFailureStage\nFailureStrings\nFailureSummary\nFailureThreshold\nFailureTime\nFailureToleranceCount\nFailureTolerancePercentage\nFailureType\nFailureValues\nFailures\nFairsharePolicy\nFallBackPhoneNumber\nFallbackAction\nFallbackBehavior\nFallbackFont\nFalseActivity\nFalseyCellValue\nFalseyCellValueSynonyms\nFamily\nFamilyName\nFaqIds\nFaqStatistics\nFaqSummary\nFaqSummaryItems\nFargatePlatformConfiguration\nFargateProfile\nFargateProfileSelector\nFastLaunchConfiguration\nFastLaunchImages\nFastLaunchLaunchTemplateSpecification\nFastLaunchLaunchTemplateSpecificationRequest\nFastLaunchLaunchTemplateSpecificationResponse\nFastLaunchSnapshotConfiguration\nFastLaunchSnapshotConfigurationRequest\nFastLaunchSnapshotConfigurationResponse\nFastResetToken\nFastRestoreRule\nFastRestored\nFastSnapshotRestoreStateErrors\nFastSnapshotRestores\nFault\nFaultCode\nFaultCodes\nFaultCount\nFaultCountHigh\nFaultCountLow\nFaultRootCause\nFaultRootCauseEntity\nFaultRootCauseService\nFaultRootCauses\nFaultStatistics\nFaultTolerance\nFavoritePages\nFax\nFeature\nFeatureActivations\nFeatureAdditions\nFeatureConfigurations\nFeatureDefinition\nFeatureDefinitions\nFeatureGroup\nFeatureGroupArn\nFeatureGroupName\nFeatureGroupStatus\nFeatureGroupStatusEquals\nFeatureGroupSummaries\nFeatureGroupSummary\nFeatureHeaders\nFeatureMetadata\nFeatureName\nFeatureNames\nFeatureNotAvailableException\nFeatureParameter\nFeatureSet\nFeatureSpecificationS3Uri\nFeatureStoreOutput\nFeatureSummary\nFeatureTransformation\nFeatureType\nFeatureTypes\nFeatureValue\nFeaturedDocument\nFeaturedDocumentMissing\nFeaturedDocumentWithMetadata\nFeaturedDocuments\nFeaturedDocumentsMissing\nFeaturedDocumentsWithMetadata\nFeaturedResultsConflictException\nFeaturedResultsItem\nFeaturedResultsItems\nFeaturedResultsSet\nFeaturedResultsSetId\nFeaturedResultsSetIds\nFeaturedResultsSetName\nFeaturedResultsSetSummary\nFeaturedResultsSetSummaryItems\nFeatures\nFeaturesAttribute\nFeaturization\nFeaturizationConfig\nFeaturizationMethod\nFeaturizationMethodName\nFeaturizationMethodParameters\nFeaturizationPipeline\nFeaturizations\nFec\nFecOutputSettings\nFederatedAuthentication\nFederatedAuthenticationRequest\nFederatedDatabase\nFederatedResourceAlreadyExistsException\nFederatedTable\nFederatedUser\nFederatedUserId\nFederationParameters\nFederationSourceErrorCode\nFederationSourceException\nFederationSourceRetryableException\nFeedback\nFeedbackDate\nFeedbackForwardingAddress\nFeedbackForwardingEmailAddress\nFeedbackForwardingEmailAddressIdentityArn\nFeedbackForwardingStatus\nFeedbackId\nFeedbackToken\nFeedbackURL\nFeedbackValue\nFetchOwner\nFetchPage\nFetchPageRequest\nFetchPageResult\nFiberOpticCableType\nField\nFieldBasedTooltip\nFieldConfig\nFieldDataPathValues\nFieldDelimiter\nFieldEncoding\nFieldError\nFieldFolder\nFieldFolders\nFieldGroup\nFieldId\nFieldIdentifier\nFieldInfo\nFieldInputConfig\nFieldItem\nFieldLabelType\nFieldLevel\nFieldLevelEncryption\nFieldLevelEncryptionConfig\nFieldLevelEncryptionConfigAlreadyExists\nFieldLevelEncryptionConfigInUse\nFieldLevelEncryptionId\nFieldLevelEncryptionList\nFieldLevelEncryptionProfile\nFieldLevelEncryptionProfileAlreadyExists\nFieldLevelEncryptionProfileConfig\nFieldLevelEncryptionProfileInUse\nFieldLevelEncryptionProfileList\nFieldLevelEncryptionProfileSizeExceeded\nFieldLevelEncryptionProfileSummary\nFieldLevelEncryptionSummary\nFieldLevelOptions\nFieldList\nFieldLogLevel\nFieldMappings\nFieldName\nFieldNames\nFieldOption\nFieldOptionError\nFieldOptions\nFieldPatterns\nFieldSelectors\nFieldSeriesItem\nFieldSort\nFieldSortOptions\nFieldSourceProfileIds\nFieldStatistics\nFieldStats\nFieldSummary\nFieldToMatch\nFieldTooltipItem\nFieldTypeDetails\nFieldValidationConfiguration\nFieldValidationMessage\nFieldValue\nFieldWells\nFields\nFile\nFileAccessAuditLogLevel\nFileAccessLog\nFileBatchJobDefinition\nFileBatchJobIdentifier\nFileCache\nFileCacheCreating\nFileCacheDataRepositoryAssociation\nFileCacheFailureDetails\nFileCacheId\nFileCacheIds\nFileCacheLustreConfiguration\nFileCacheLustreMetadataConfiguration\nFileCacheNFSConfiguration\nFileCacheNotFound\nFileCachePath\nFileCacheType\nFileCacheTypeVersion\nFileCaches\nFileCompression\nFileConfiguration\nFileContentAndSourceFileSpecifiedException\nFileContentRequiredException\nFileContentSizeLimitExceededException\nFileCount\nFileDoesNotExistException\nFileEntryRequiredException\nFileFailures\nFileFieldMappings\nFileFingerprintLines\nFileFormat\nFileFormatConfiguration\nFileFormatDescriptor\nFileFormats\nFileGroupSettings\nFileGroups\nFileHeaderInfo\nFileInformation\nFileInput\nFileKey\nFileKeyUpdate\nFileLastWritten\nFileLocation\nFileMetadata\nFileMode\nFileModeRequiredException\nFileModes\nFileName\nFileNameConflictsWithDirectoryNameException\nFileOffset\nFilePath\nFilePathConflictsWithSubmodulePathException\nFilePaths\nFileShareARN\nFileShareARNList\nFileShareAccessAuditLogLevel\nFileShareId\nFileShareInfo\nFileShareInfoList\nFileShareName\nFileShareStatus\nFileShareType\nFileSharesVisible\nFileSize\nFileSizeBytes\nFileSizes\nFileSource\nFileSourceSettings\nFileSystem\nFileSystemAccessMode\nFileSystemAccessRoleArn\nFileSystemAdministratorsGroup\nFileSystemAlreadyExists\nFileSystemArn\nFileSystemAssociationARN\nFileSystemAssociationARNList\nFileSystemAssociationId\nFileSystemAssociationInfo\nFileSystemAssociationInfoList\nFileSystemAssociationStatus\nFileSystemAssociationStatusDetail\nFileSystemAssociationStatusDetails\nFileSystemAssociationSummary\nFileSystemAssociationSummaryList\nFileSystemConfig\nFileSystemConfigs\nFileSystemDataSource\nFileSystemDescription\nFileSystemEndpoint\nFileSystemEndpoints\nFileSystemFailureDetails\nFileSystemId\nFileSystemIds\nFileSystemInUse\nFileSystemLimitExceeded\nFileSystemNotFound\nFileSystemPath\nFileSystemPolicyDescription\nFileSystemSize\nFileSystemType\nFileSystemTypeVersion\nFileSystems\nFileTooLargeException\nFileTransferUploadStreams\nFileUploadURL\nFileUploaderFieldConfig\nFileValidationMessage\nFileVersion\nFilecacheDuration\nFilenameContains\nFiles\nFilesCompleted\nFilesDeleted\nFilesLimit\nFilesSkipped\nFilesTransferred\nFilesVerified\nFilesystemId\nFillLineGap\nFillMissingValues\nFillPolicy\nFillStyle\nFilledMapAggregatedFieldWells\nFilledMapConditionalFormatting\nFilledMapConditionalFormattingOption\nFilledMapConfiguration\nFilledMapFieldWells\nFilledMapShapeConditionalFormatting\nFilledMapSortConfiguration\nFilledMapVisual\nFilledPath\nFillerSlate\nFilling\nFilmGrainSynthesis\nFilter\nFilterActivity\nFilterArn\nFilterArns\nFilterAtDestination\nFilterAtSource\nFilterAttributeRanges\nFilterBBox\nFilterCategories\nFilterClass\nFilterCondition\nFilterConditionList\nFilterConditions\nFilterConfiguration\nFilterControl\nFilterControlId\nFilterControls\nFilterCountries\nFilterCriteria\nFilterCriterion\nFilterDateTimePickerControl\nFilterDefinition\nFilterDescription\nFilterDropDownControl\nFilterEnable\nFilterExpression\nFilterGroup\nFilterGroupId\nFilterGroups\nFilterId\nFilterInArns\nFilterKey\nFilterLimitExceededException\nFilterList\nFilterListConfiguration\nFilterListControl\nFilterLogEventsRequest\nFilterLogEventsResponse\nFilterName\nFilterNames\nFilterOperation\nFilterOperationSelectedFieldsConfiguration\nFilterOperationTargetVisualsConfiguration\nFilterOperator\nFilterOption\nFilterPartialResults\nFilterPolicyLimitExceededException\nFilterPortRange\nFilterPredicate\nFilterQuery\nFilterRelativeDateTimeControl\nFilterRule\nFilterRules\nFilterScopeConfiguration\nFilterSelectableValues\nFilterSettings\nFilterSliderControl\nFilterStrength\nFilterString\nFilterSummary\nFilterSynonyms\nFilterTextAreaControl\nFilterTextFieldControl\nFilterType\nFilterTypedLink\nFilterV2\nFilterValue\nFilterValues\nFilterVariable\nFilteredLogEvent\nFilteredStatus\nFilters\nFinalActiveLearningModelArn\nFinalAutoMLJobObjectiveMetric\nFinalBackupId\nFinalBackupTags\nFinalBakeTimeInMinutes\nFinalClusterSnapshotIdentifier\nFinalClusterSnapshotRetentionPeriod\nFinalDBSnapshotIdentifier\nFinalHyperParameterTuningJobObjectiveMetric\nFinalMetricDataList\nFinalRecipient\nFinalSnapshotIdentifier\nFinalSnapshotName\nFinalizeCutoverRequest\nFinalizeDeviceClaimRequest\nFinalizeDeviceClaimResponse\nFinalized\nFinalizingOrganizationException\nFindMatchesMetrics\nFindMatchesParameters\nFindMatchesTaskRunProperties\nFinding\nFindingAction\nFindingActor\nFindingAggregationRegion\nFindingAggregator\nFindingAggregatorArn\nFindingAggregators\nFindingComponents\nFindingCreated\nFindingCriteria\nFindingDetail\nFindingDetailsError\nFindingFieldsUpdate\nFindingFilter\nFindingHistoryRecord\nFindingHistoryUpdate\nFindingHistoryUpdateSource\nFindingId\nFindingIdentifier\nFindingIdentifiers\nFindingIds\nFindingMetricsValuePerSeverity\nFindingProviderFields\nFindingProviderFieldsConfidence\nFindingProviderFieldsCriticality\nFindingProviderFieldsRelatedFindingsId\nFindingProviderFieldsRelatedFindingsProductArn\nFindingProviderFieldsSeverityLabel\nFindingProviderFieldsSeverityOriginal\nFindingProviderFieldsTypes\nFindingProviderSeverity\nFindingPublishingFrequency\nFindingReasonCodes\nFindingSource\nFindingSourceDetail\nFindingStatisticTypes\nFindingStatistics\nFindingStatisticsSortCriteria\nFindingSummary\nFindingTypeAggregation\nFindingTypeAggregationResponse\nFindingTypes\nFindings\nFindingsCount\nFindingsFilterListItem\nFindingsFound\nFindingsReportSummary\nFineGrainedAuthorizationEnabled\nFingerprint\nFinishTime\nFinishTimeMillis\nFinishedAt\nFinishedTime\nFinishedWorldsSummary\nFips\nFipsDnsName\nFipsEnabled\nFirehose\nFirehoseAction\nFirehoseArn\nFirehoseDestinationConfiguration\nFirehoseFailureFeedbackRoleArn\nFirehoseLogDelivery\nFirehoseLogDeliveryDescription\nFirehoseStream\nFirehoseSuccessFeedbackRoleArn\nFirelensConfiguration\nFirewall\nFirewallArn\nFirewallConfig\nFirewallConfigs\nFirewallCreationConfig\nFirewallDeploymentModel\nFirewallDomainList\nFirewallDomainListId\nFirewallDomainListMetadata\nFirewallDomainLists\nFirewallEndpoint\nFirewallFailOpen\nFirewallId\nFirewallManagerRuleGroup\nFirewallManagerStatement\nFirewallMetadata\nFirewallName\nFirewallPolicies\nFirewallPolicy\nFirewallPolicyArn\nFirewallPolicyChangeProtection\nFirewallPolicyDetails\nFirewallPolicyId\nFirewallPolicyMetadata\nFirewallPolicyName\nFirewallPolicyResponse\nFirewallPolicyStatefulRuleGroupReferencesDetails\nFirewallPolicyStatelessCustomActionsDetails\nFirewallPolicyStatelessRuleGroupReferencesDetails\nFirewallPolicyStatus\nFirewallRule\nFirewallRuleGroup\nFirewallRuleGroupAssociation\nFirewallRuleGroupAssociationId\nFirewallRuleGroupAssociations\nFirewallRuleGroupId\nFirewallRuleGroupMetadata\nFirewallRuleGroupPolicy\nFirewallRuleGroups\nFirewallRules\nFirewallStatefulRule\nFirewallStatelessRule\nFirewallStatus\nFirewallSubnetId\nFirewallSubnetIsOutOfScopeViolation\nFirewallSubnetMissingVPCEndpointViolation\nFirewallSubnetRoutes\nFirewalls\nFirmwareUpdateImage\nFirmwareUpdateRole\nFirst\nFirstAccessedTime\nFirstActivatedTime\nFirstAddress\nFirstBlockToken\nFirstEvaluationStarted\nFirstExecutionFrom\nFirstName\nFirstObservedAt\nFirstPage\nFirstSchemaVersionNumber\nFirstSeen\nFirstSeenDateTime\nFirstSlotStartTime\nFirstSlotStartTimeRange\nFirstSnapshotId\nFixAvailable\nFixedAfd\nFixedGOP\nFixedInVersion\nFixedModeScheduleActionStartSettings\nFixedPrice\nFixedRate\nFixedResponseAction\nFixedResponseActionConfig\nFixedResponseConfig\nFlacSettings\nFlag\nFlaggedResources\nFlags\nFlat\nFlatInvocations\nFleet\nFleetAdvisorLsaAnalysisResponse\nFleetAdvisorSchemaObjectResponse\nFleetAdvisorSchemaObjects\nFleetAdvisorSchemas\nFleetArn\nFleetAttributes\nFleetCapacity\nFleetCapacityExceededException\nFleetCapacityReservation\nFleetCapacityReservations\nFleetData\nFleetError\nFleetErrors\nFleetId\nFleetIds\nFleetLaunchTemplateConfig\nFleetLaunchTemplateConfigRequest\nFleetLaunchTemplateOverrides\nFleetLaunchTemplateOverridesRequest\nFleetLaunchTemplateSpecification\nFleetLaunchTemplateSpecificationRequest\nFleetMetricNameAndArn\nFleetName\nFleetSpotCapacityRebalance\nFleetSpotCapacityRebalanceRequest\nFleetSpotMaintenanceStrategies\nFleetSpotMaintenanceStrategiesRequest\nFleetState\nFleetStatus\nFleetSummary\nFleetSummaryList\nFleetType\nFleetUtilization\nFleets\nFlexCacheEndpointType\nFlexMatchMode\nFlexibleTimeWindow\nFlickerAdaptiveQuantization\nFlickerAq\nFlinkApplicationConfiguration\nFlinkApplicationConfigurationDescription\nFlinkApplicationConfigurationUpdate\nFlinkRunConfiguration\nFlinkRunConfigurationDescription\nFlow\nFlowArn\nFlowDefinition\nFlowDefinitionArn\nFlowDefinitionName\nFlowDefinitionOutputConfig\nFlowDefinitionStatus\nFlowDefinitionSummaries\nFlowDefinitionSummary\nFlowExecutionMessage\nFlowExecutionSummary\nFlowLog\nFlowLogId\nFlowLogIds\nFlowLogStatus\nFlowLogs\nFlowLogsConfigurationResult\nFlowLogsEnabled\nFlowLogsS3Bucket\nFlowLogsS3Prefix\nFlowName\nFlowOutput\nFlowSource\nFlowSourceArn\nFlowTemplateDescription\nFlowTemplateFilter\nFlowTemplateSummary\nFlowVpcInterfaceAttachment\nFlows\nFlushApiCacheRequest\nFlushStageAuthorizersCacheRequest\nFlushStageCacheRequest\nFlywheelArn\nFlywheelFilter\nFlywheelIterationFilter\nFlywheelIterationId\nFlywheelIterationProperties\nFlywheelIterationPropertiesList\nFlywheelModelEvaluationMetrics\nFlywheelName\nFlywheelProperties\nFlywheelStatsS3Prefix\nFlywheelSummary\nFlywheelSummaryList\nFmp4HlsSettings\nFmt\nFmtp\nFmtpRequest\nFolder\nFolderConfiguration\nFolderConfigurations\nFolderContentSizeLimitExceededException\nFolderDoesNotExistException\nFolderId\nFolderIds\nFolderList\nFolderMember\nFolderMemberList\nFolderMetadata\nFolderPath\nFolderSearchFilter\nFolderSummary\nFolderSummaryList\nFolderType\nFolders\nFollowInputIndex\nFollowModeScheduleActionStartSettings\nFollowPoint\nFollowUpPrompt\nFont\nFontColor\nFontConfiguration\nFontDecoration\nFontFamilies\nFontFamily\nFontOpacity\nFontResolution\nFontScript\nFontSize\nFontStack\nFontStyle\nFontUnicodeRange\nFontWeight\nFooterSections\nForbiddenException\nForce\nForceAliasCreation\nForceAssociate\nForceCreateJobs\nForceDelete\nForceDeleteWithoutRecovery\nForceDetach\nForceFailover\nForceFieldPictures\nForceIncludeRenditionSize\nForceIncludeRenditions\nForceLobLookup\nForceMove\nForceOverwriteReplicaSecret\nForcePlannedFailover\nForceTerminate\nForceTsVideoEbpOrder\nForceUnsubscribeAll\nForceUpdate\nForceUpgradeDate\nForcedApplyDate\nForecast\nForecastArn\nForecastComputation\nForecastConfiguration\nForecastConfigurations\nForecastDataType\nForecastDimensions\nForecastExportJobArn\nForecastExportJobName\nForecastExportJobSummary\nForecastExportJobs\nForecastFrequency\nForecastHorizon\nForecastName\nForecastProperties\nForecastQuantiles\nForecastResult\nForecastResultsByTime\nForecastScenario\nForecastStatistics\nForecastSummary\nForecastType\nForecastTypes\nForecastedLifetime\nForecastedSpend\nForecasts\nForeground\nForegroundColor\nForgetDeviceRequest\nForgetSmartHomeAppliancesRequest\nForgotPassword\nForgotPasswordLink\nForgotPasswordRequest\nForgotPasswordResponse\nForm\nFormBindingElement\nFormButton\nFormCTA\nFormDataTypeConfig\nFormInputBindingPropertiesValue\nFormInputBindingPropertiesValueProperties\nFormInputValueProperty\nFormInputValuePropertyBindingProperties\nFormStyle\nFormSummary\nFormality\nFormat\nFormatConfig\nFormatConfiguration\nFormatOptions\nFormatText\nFormatType\nFormatVersion\nFormats\nFormatted\nForward\nForwardAction\nForwardActionConfig\nForwardConfig\nForwardPath\nForwardPathComponents\nForwardWhenContentTypeIsUnknown\nForwardWhenQueryArgProfileIsUnknown\nForwardedIP\nForwardedIPConfig\nForwardedValues\nForwardingAddressId\nForwardingConfig\nForwardingEnabled\nFoundByItems\nFoundByKeyValue\nFoundationModelDetails\nFoundationModelSummary\nFpgaDeviceInfo\nFpgaDeviceMemoryInfo\nFpgaImage\nFpgaImageAttribute\nFpgaImageGlobalId\nFpgaImageId\nFpgaImageIds\nFpgaImageState\nFpgaImages\nFpgaInfo\nFpgas\nFqdn\nFractionDigits\nFragment\nFragmentIntervalMS\nFragmentLength\nFragmentLengthControl\nFragmentLengthInMilliseconds\nFragmentNumber\nFragmentSelector\nFragmentSelectorType\nFragmentSizeBytes\nFragmentSizeInBytes\nFragmentTime\nFragments\nFrameCaptureCdnSettings\nFrameCaptureGroupSettings\nFrameCaptureHlsSettings\nFrameCaptureOutputSettings\nFrameCaptureS3Settings\nFrameCaptureSettings\nFrameHeight\nFrameMetric\nFrameMetricDatum\nFrameOption\nFrameOptions\nFrameRate\nFrameWidth\nFramerate\nFramerateControl\nFramerateConversionAlgorithm\nFramerateDenominator\nFramerateNumerator\nFramework\nFrameworkArn\nFrameworkArns\nFrameworkAttributes\nFrameworkConfiguration\nFrameworkControl\nFrameworkControls\nFrameworkDescription\nFrameworkMetadata\nFrameworkName\nFrameworkStatus\nFrameworkTags\nFrameworkVersion\nFrameworks\nFraudDetectionAction\nFraudDetectionConfig\nFraudDetectionConfiguration\nFraudDetectionResult\nFraudDetectionResultId\nFraudRiskDetails\nFraudster\nFraudsterId\nFraudsterRegistrationJob\nFraudsterRegistrationJobSummary\nFraudsterSimilarityThreshold\nFraudsterSummaries\nFraudsterSummary\nFreeForm\nFreeFormLayout\nFreeFormLayoutCanvasSizeOptions\nFreeFormLayoutConfiguration\nFreeFormLayoutElement\nFreeFormLayoutElementBackgroundStyle\nFreeFormLayoutElementBorderStyle\nFreeFormLayoutScreenCanvasSizeOptions\nFreeFormSectionLayoutConfiguration\nFreeSpaceBox\nFreeTier\nFreeTierConfig\nFreeTierEligible\nFreeTrialAccountInfo\nFreeTrialDaysRemaining\nFreeTrialFeatureConfigurationResult\nFreeTrialInfo\nFreeTrialInfoError\nFreeUntil\nFrequencies\nFrequency\nFrequencyBandwidth\nFreshStartDate\nFreshness\nFriday\nFriendlyDeviceName\nFriendlyName\nFrom\nFromAddress\nFromArn\nFromDate\nFromDbClusterArn\nFromEmailAddress\nFromEmailAddressIdentityArn\nFromEmailAddressNotVerifiedException\nFromFederationSource\nFromInclusive\nFromPath\nFromPhoneNumber\nFromPort\nFromTime\nFromTimeStamp\nFromType\nFromValue\nFsxAdminPassword\nFsxConfiguration\nFsxFilesystemArn\nFsxProtocol\nFsxProtocolNfs\nFsxProtocolSmb\nFsxStorageConfiguration\nFulfilledCapacity\nFulfilledOnDemandCapacity\nFulfillmentActivity\nFulfillmentCodeHookSettings\nFulfillmentStartResponseSpecification\nFulfillmentUpdateResponseSpecification\nFulfillmentUpdatesSpecification\nFullDocument\nFullLoadCondtnlChkFailedRows\nFullLoadEndTime\nFullLoadErrorPercentage\nFullLoadErrorRows\nFullLoadFinishDate\nFullLoadProgressPercent\nFullLoadReloaded\nFullLoadRows\nFullLoadStartDate\nFullLoadStartTime\nFullName\nFullyQualifiedCNAME\nFullyQualifiedDomainName\nFunction\nFunctionARN\nFunctionAlreadyExists\nFunctionArn\nFunctionArns\nFunctionArtifactMeta\nFunctionAssociation\nFunctionAssociations\nFunctionCode\nFunctionCodeLocation\nFunctionConfig\nFunctionConfiguration\nFunctionConfigurationEnvironment\nFunctionCount\nFunctionDefaultConfig\nFunctionDefaultExecutionConfig\nFunctionDefinitionId\nFunctionDefinitionVersion\nFunctionDefinitionVersionArn\nFunctionDefinitionVersionId\nFunctionError\nFunctionErrorMessage\nFunctionEventInvokeConfig\nFunctionEventInvokeConfigs\nFunctionExecutionConfig\nFunctionExecutionLogs\nFunctionInUse\nFunctionInput\nFunctionList\nFunctionMetadata\nFunctionName\nFunctionOutput\nFunctionPayload\nFunctionRequest\nFunctionResponse\nFunctionResponseTypes\nFunctionRunAsConfig\nFunctionRuntimeOverride\nFunctionSizeLimitExceeded\nFunctionSummary\nFunctionUrl\nFunctionUrlAuthType\nFunctionUrlConfig\nFunctionUrlConfigs\nFunctionVersion\nFunctions\nFunnelChartAggregatedFieldWells\nFunnelChartConfiguration\nFunnelChartDataLabelOptions\nFunnelChartFieldWells\nFunnelChartSortConfiguration\nFunnelChartVisual\nFuota\nFuotaDeviceStatus\nFuotaTask\nFuotaTaskId\nFuotaTaskList\nFuzzyMatching\nGATING\nGCM\nGCMChannelRequest\nGCMChannelResponse\nGCMMessage\nGE\nGPSCoordinates\nGPSPoint\nGPSPointDimension\nGSTIN\nGT\nGain\nGame\nGameConfiguration\nGameConfigurationDetails\nGameDetails\nGameKey\nGameLiftAwsAccountId\nGameLiftServiceSdkEndpoint\nGameLiftVpcId\nGameName\nGameProperties\nGameProperty\nGameSdkVersion\nGameServer\nGameServerData\nGameServerGroup\nGameServerGroupArn\nGameServerGroupAutoScalingPolicy\nGameServerGroupName\nGameServerGroups\nGameServerId\nGameServerInstance\nGameServerInstances\nGameServerProtectionPolicy\nGameServers\nGameSession\nGameSessionActivationTimeoutSeconds\nGameSessionArn\nGameSessionConnectionInfo\nGameSessionData\nGameSessionDetail\nGameSessionDetails\nGameSessionFullException\nGameSessionId\nGameSessionName\nGameSessionPlacement\nGameSessionQueue\nGameSessionQueueArn\nGameSessionQueueArns\nGameSessionQueueDestination\nGameSessionQueueName\nGameSessionQueues\nGameSessionRegion\nGameSessions\nGameSummary\nGames\nGateway\nGatewayARN\nGatewayAdmins\nGatewayArn\nGatewayAssociationState\nGatewayBridgeSource\nGatewayCapabilitySummary\nGatewayCapacity\nGatewayDetails\nGatewayDisplayName\nGatewayEui\nGatewayEuiEventTopic\nGatewayGroup\nGatewayGroupArn\nGatewayGroupSummary\nGatewayGroups\nGatewayId\nGatewayInfo\nGatewayInstance\nGatewayInstanceArn\nGatewayList\nGatewayListItem\nGatewayLoadBalancerArns\nGatewayLoadBalancerEndpointId\nGatewayMessages\nGatewayName\nGatewayNetwork\nGatewayNetworkInterfaces\nGatewayOperationalState\nGatewayPlatform\nGatewayRegion\nGatewayResponse\nGatewayResponses\nGatewayRouteData\nGatewayRouteHostnameMatch\nGatewayRouteHostnameRewrite\nGatewayRouteRef\nGatewayRouteSpec\nGatewayRouteStatus\nGatewayRouteTarget\nGatewayRouteVirtualService\nGatewayState\nGatewaySummary\nGatewayTimeoutException\nGatewayTimezone\nGatewayType\nGateways\nGatingControls\nGatingRule\nGatingRuleUpdate\nGaugeChartArcConditionalFormatting\nGaugeChartConditionalFormatting\nGaugeChartConditionalFormattingOption\nGaugeChartConfiguration\nGaugeChartFieldWells\nGaugeChartOptions\nGaugeChartPrimaryValueConditionalFormatting\nGaugeChartVisual\nGcpMySQLSettings\nGdgAttributes\nGdgDetailAttributes\nGenAppKey\nGender\nGenderString\nGeneral\nGeneralFlags\nGeneralFlagsV2\nGeneralFlagsV3\nGeneralFlagsV4\nGeneralLabels\nGeneralLabelsSettings\nGeneralLogGroup\nGeneralName\nGeneralServiceException\nGenerate\nGenerateAccessLogsRequest\nGenerateAccessLogsResult\nGenerateBackendAPIModelsRequest\nGenerateBackendAPIModelsResponse\nGenerateCandidateDefinitionsOnly\nGenerateCardValidationDataInput\nGenerateCardValidationDataOutput\nGenerateChangeSetRequest\nGenerateChangeSetResponse\nGenerateClientCertificateRequest\nGenerateCredentialReportResponse\nGenerateDataKeyPairRequest\nGenerateDataKeyPairResponse\nGenerateDataKeyPairWithoutPlaintextRequest\nGenerateDataKeyPairWithoutPlaintextResponse\nGenerateDataKeyRequest\nGenerateDataKeyResponse\nGenerateDataKeyWithoutPlaintextRequest\nGenerateDataKeyWithoutPlaintextResponse\nGenerateDataSetRequest\nGenerateDataSetResult\nGenerateEmbedUrlForAnonymousUserRequest\nGenerateEmbedUrlForAnonymousUserResponse\nGenerateEmbedUrlForRegisteredUserRequest\nGenerateEmbedUrlForRegisteredUserResponse\nGenerateInferenceId\nGenerateMacInput\nGenerateMacOutput\nGenerateMacRequest\nGenerateMacResponse\nGenerateMobileSdkReleaseUrlRequest\nGenerateMobileSdkReleaseUrlResponse\nGenerateOrganizationsAccessReportRequest\nGenerateOrganizationsAccessReportResponse\nGeneratePinDataInput\nGeneratePinDataOutput\nGenerateRandomRequest\nGenerateRandomResponse\nGenerateRecommendationsRequest\nGenerateSecret\nGenerateServiceLastAccessedDetailsRequest\nGenerateServiceLastAccessedDetailsResponse\nGenerateTemplateRequest\nGenerateTemplateResponse\nGeneratedBy\nGeneratedCodeJob\nGeneratedCodeJobDetails\nGeneratedCodeJobId\nGeneratedCodeJobs\nGeneratedFraudsterId\nGeneratedManifestDescriptor\nGeneratedManifestEncryption\nGeneratedPolicy\nGeneratedPolicyProperties\nGeneratedPolicyResult\nGeneratedPrefixLocation\nGeneratedRulesType\nGeneratedSpeakerId\nGeneratedTime\nGenerationAttributes\nGenerationCompletionTime\nGenerationExistsException\nGenerationKeyArn\nGenerationKeyCheckValue\nGenerationKeyIdentifier\nGenerationQualifier\nGenerationStartedTime\nGenerationStatus\nGenerationSummary\nGenerationSummaryList\nGenerationTimestamp\nGenerator\nGeneratorDetails\nGeneratorId\nGenericAttachment\nGenericKeywords\nGenericRevisionInfo\nGeoJsonPayload\nGeoLocation\nGeoLocationDetails\nGeoLocationDetailsList\nGeoMatchConstraint\nGeoMatchConstraints\nGeoMatchLevel\nGeoMatchParams\nGeoMatchSet\nGeoMatchSetId\nGeoMatchSetSummary\nGeoMatchSetUpdate\nGeoMatchSets\nGeoMatchStatement\nGeoMosaicConfigInput\nGeoRestriction\nGeoSpatialColumnGroup\nGeofenceGeometry\nGeofenceId\nGeofenceIds\nGeofenceProperties\nGeographicRole\nGeolocationFormat\nGeometry\nGeometryOffset\nGeospatial\nGeospatialCoordinateBounds\nGeospatialHeatmapColorScale\nGeospatialHeatmapConfiguration\nGeospatialHeatmapDataColor\nGeospatialMapAggregatedFieldWells\nGeospatialMapConfiguration\nGeospatialMapFieldWells\nGeospatialMapStyleOptions\nGeospatialMapVisual\nGeospatialPointStyleOptions\nGeospatialWindowOptions\nGeranCid\nGet\nGetAWSDefaultServiceQuotaRequest\nGetAWSDefaultServiceQuotaResponse\nGetAWSOrganizationsAccessStatusOutput\nGetAccessControlEffectRequest\nGetAccessControlEffectResponse\nGetAccessKeyInfoRequest\nGetAccessKeyInfoResponse\nGetAccessKeyLastUsedRequest\nGetAccessKeyLastUsedResponse\nGetAccessLogSubscriptionRequest\nGetAccessLogSubscriptionResponse\nGetAccessPointConfigurationForObjectLambdaRequest\nGetAccessPointConfigurationForObjectLambdaResult\nGetAccessPointForObjectLambdaRequest\nGetAccessPointForObjectLambdaResult\nGetAccessPointPolicyForObjectLambdaRequest\nGetAccessPointPolicyForObjectLambdaResult\nGetAccessPointPolicyRequest\nGetAccessPointPolicyResult\nGetAccessPointPolicyStatusForObjectLambdaRequest\nGetAccessPointPolicyStatusForObjectLambdaResult\nGetAccessPointPolicyStatusRequest\nGetAccessPointPolicyStatusResult\nGetAccessPointRequest\nGetAccessPointResult\nGetAccessPolicyRequest\nGetAccessPolicyResponse\nGetAccessPreviewRequest\nGetAccessPreviewResponse\nGetAccessTokenRequest\nGetAccessTokenResponse\nGetAccessorInput\nGetAccessorOutput\nGetAccountAliasResult\nGetAccountAuthorizationDetailsRequest\nGetAccountAuthorizationDetailsResponse\nGetAccountBalanceResponse\nGetAccountConfigurationResponse\nGetAccountLimitRequest\nGetAccountLimitResponse\nGetAccountPasswordPolicyResponse\nGetAccountRequest\nGetAccountResponse\nGetAccountSendingEnabledResponse\nGetAccountSettingsOutput\nGetAccountSettingsRequest\nGetAccountSettingsResponse\nGetAccountSettingsResult\nGetAccountStatusResponse\nGetAccountSummaryResponse\nGetAccuracyMetricsRequest\nGetAccuracyMetricsResponse\nGetActionRequest\nGetActionResponse\nGetActionTypeInput\nGetActionTypeOutput\nGetActiveNamesRequest\nGetActiveNamesResult\nGetActivityTaskInput\nGetActivityTaskOutput\nGetAddressBookRequest\nGetAddressBookResponse\nGetAdmChannelRequest\nGetAdmChannelResponse\nGetAdminAccountResponse\nGetAdminScopeRequest\nGetAdminScopeResponse\nGetAdministratorAccountRequest\nGetAdministratorAccountResponse\nGetAgentConfigurationRequest\nGetAgentConfigurationResponse\nGetAggregateComplianceDetailsByConfigRuleRequest\nGetAggregateComplianceDetailsByConfigRuleResponse\nGetAggregateConfigRuleComplianceSummaryRequest\nGetAggregateConfigRuleComplianceSummaryResponse\nGetAggregateConformancePackComplianceSummaryRequest\nGetAggregateConformancePackComplianceSummaryResponse\nGetAggregateDiscoveredResourceCountsRequest\nGetAggregateDiscoveredResourceCountsResponse\nGetAggregateResourceConfigRequest\nGetAggregateResourceConfigResponse\nGetAlarmsRequest\nGetAlarmsResult\nGetAliasInput\nGetAliasOutput\nGetAliasRequest\nGetAllowListRequest\nGetAllowListResponse\nGetAlternateContactRequest\nGetAlternateContactResponse\nGetAnalysisTemplateInput\nGetAnalysisTemplateOutput\nGetAnalyzedResourceRequest\nGetAnalyzedResourceResponse\nGetAnalyzerRequest\nGetAnalyzerResponse\nGetAnnotationImportRequest\nGetAnnotationImportResponse\nGetAnnotationStoreRequest\nGetAnnotationStoreResponse\nGetAnnotationStoreVersionRequest\nGetAnnotationStoreVersionResponse\nGetAnomaliesRequest\nGetAnomaliesResponse\nGetAnomalyGroupRequest\nGetAnomalyGroupResponse\nGetAnomalyMonitorsRequest\nGetAnomalyMonitorsResponse\nGetAnomalySubscriptionsRequest\nGetAnomalySubscriptionsResponse\nGetAnswerInput\nGetAnswerOutput\nGetApiAssociationRequest\nGetApiAssociationResponse\nGetApiCacheRequest\nGetApiCacheResponse\nGetApiKeyRequest\nGetApiKeysRequest\nGetApiMappingRequest\nGetApiMappingResponse\nGetApiMappingsRequest\nGetApiMappingsResponse\nGetApiRequest\nGetApiResponse\nGetApisRequest\nGetApisResponse\nGetApnsChannelRequest\nGetApnsChannelResponse\nGetApnsSandboxChannelRequest\nGetApnsSandboxChannelResponse\nGetApnsVoipChannelRequest\nGetApnsVoipChannelResponse\nGetApnsVoipSandboxChannelRequest\nGetApnsVoipSandboxChannelResponse\nGetAppAuthorizationRequest\nGetAppAuthorizationResponse\nGetAppBundleRequest\nGetAppBundleResponse\nGetAppInstanceRetentionSettingsRequest\nGetAppInstanceRetentionSettingsResponse\nGetAppInstanceStreamingConfigurationsRequest\nGetAppInstanceStreamingConfigurationsResponse\nGetAppLaunchConfigurationRequest\nGetAppLaunchConfigurationResponse\nGetAppMonitorDataRequest\nGetAppMonitorDataResponse\nGetAppMonitorRequest\nGetAppMonitorResponse\nGetAppReplicationConfigurationRequest\nGetAppReplicationConfigurationResponse\nGetAppRequest\nGetAppResponse\nGetAppResult\nGetAppValidationConfigurationRequest\nGetAppValidationConfigurationResponse\nGetAppValidationOutputRequest\nGetAppValidationOutputResponse\nGetApplicationComponentDetailsRequest\nGetApplicationComponentDetailsResponse\nGetApplicationComponentStrategiesRequest\nGetApplicationComponentStrategiesResponse\nGetApplicationDateRangeKpiRequest\nGetApplicationDateRangeKpiResponse\nGetApplicationInput\nGetApplicationOutput\nGetApplicationPolicyRequest\nGetApplicationPolicyResponse\nGetApplicationRequest\nGetApplicationResponse\nGetApplicationRevisionInput\nGetApplicationRevisionOutput\nGetApplicationSettingsRequest\nGetApplicationSettingsResponse\nGetApplicationVersionRequest\nGetApplicationVersionResponse\nGetAppliedSchemaVersionRequest\nGetAppliedSchemaVersionResponse\nGetApprovalRuleTemplateInput\nGetApprovalRuleTemplateOutput\nGetAppsListRequest\nGetAppsListResponse\nGetAppsRequest\nGetAppsResponse\nGetArchitectureRecommendationsRequest\nGetArchitectureRecommendationsResponse\nGetArchiveRuleRequest\nGetArchiveRuleResponse\nGetArtifactUrlRequest\nGetArtifactUrlResult\nGetAssessmentFrameworkRequest\nGetAssessmentFrameworkResponse\nGetAssessmentReportRequest\nGetAssessmentReportResponse\nGetAssessmentReportUrlRequest\nGetAssessmentReportUrlResponse\nGetAssessmentRequest\nGetAssessmentResponse\nGetAssetPropertyAggregatesRequest\nGetAssetPropertyAggregatesResponse\nGetAssetPropertyValueHistoryRequest\nGetAssetPropertyValueHistoryResponse\nGetAssetPropertyValueRequest\nGetAssetPropertyValueResponse\nGetAssetRequest\nGetAssetResponse\nGetAssignmentRequest\nGetAssignmentResponse\nGetAssistantAssociationRequest\nGetAssistantAssociationResponse\nGetAssistantRequest\nGetAssistantResponse\nGetAssociatedEnclaveCertificateIamRolesRequest\nGetAssociatedEnclaveCertificateIamRolesResult\nGetAssociatedIpv6PoolCidrsRequest\nGetAssociatedIpv6PoolCidrsResult\nGetAssociatedResourceRequest\nGetAssociatedResourceResponse\nGetAssociatedRoleRequest\nGetAssociatedRoleResponse\nGetAssociationForServiceQuotaTemplateResponse\nGetAttachmentRequest\nGetAttachmentResponse\nGetAttendeeRequest\nGetAttendeeResponse\nGetAttributeGroupRequest\nGetAttributeGroupResponse\nGetAttributeValuesRequest\nGetAttributeValuesResponse\nGetAuthPolicyRequest\nGetAuthPolicyResponse\nGetAuthorizationTokenRequest\nGetAuthorizationTokenResponse\nGetAuthorizationTokenResult\nGetAuthorizerRequest\nGetAuthorizerResponse\nGetAuthorizersRequest\nGetAuthorizersResponse\nGetAutoMergingPreviewRequest\nGetAutoMergingPreviewResponse\nGetAutoScalingGroupRecommendationsRequest\nGetAutoScalingGroupRecommendationsResponse\nGetAutoSnapshotsRequest\nGetAutoSnapshotsResult\nGetAutoTerminationPolicyInput\nGetAutoTerminationPolicyOutput\nGetAutomatedDiscoveryConfigurationResponse\nGetAutomationExecutionRequest\nGetAutomationExecutionResult\nGetAwsNetworkPerformanceDataRequest\nGetAwsNetworkPerformanceDataResult\nGetBackendAPIModelsRequest\nGetBackendAPIModelsResponse\nGetBackendAPIRequest\nGetBackendAPIResponse\nGetBackendAuthRequest\nGetBackendAuthResponse\nGetBackendEnvironmentRequest\nGetBackendEnvironmentResult\nGetBackendJobRequest\nGetBackendJobResponse\nGetBackendRequest\nGetBackendResponse\nGetBackendStorageRequest\nGetBackendStorageResourceConfig\nGetBackendStorageResponse\nGetBackupPlanFromJSONInput\nGetBackupPlanFromJSONOutput\nGetBackupPlanFromTemplateInput\nGetBackupPlanFromTemplateOutput\nGetBackupPlanInput\nGetBackupPlanOutput\nGetBackupSelectionInput\nGetBackupSelectionOutput\nGetBackupVaultAccessPolicyInput\nGetBackupVaultAccessPolicyOutput\nGetBackupVaultNotificationsInput\nGetBackupVaultNotificationsOutput\nGetBaiduChannelRequest\nGetBaiduChannelResponse\nGetBandwidthRateLimitScheduleInput\nGetBandwidthRateLimitScheduleOutput\nGetBasePathMappingRequest\nGetBasePathMappingsRequest\nGetBatchImportJobsRequest\nGetBatchImportJobsResult\nGetBatchJobExecutionRequest\nGetBatchJobExecutionResponse\nGetBatchPredictionInput\nGetBatchPredictionJobsRequest\nGetBatchPredictionJobsResult\nGetBatchPredictionOutput\nGetBehaviorModelTrainingSummariesRequest\nGetBehaviorModelTrainingSummariesResponse\nGetBlacklistReportsRequest\nGetBlacklistReportsResponse\nGetBlobInput\nGetBlobOutput\nGetBlockPublicAccessConfigurationOutput\nGetBlockRequest\nGetBlockResponse\nGetBlueprintRequest\nGetBlueprintResponse\nGetBlueprintRunRequest\nGetBlueprintRunResponse\nGetBlueprintRunsRequest\nGetBlueprintRunsResponse\nGetBlueprintsRequest\nGetBlueprintsResult\nGetBootstrapBrokersRequest\nGetBootstrapBrokersResponse\nGetBotAliasRequest\nGetBotAliasResponse\nGetBotAliasesRequest\nGetBotAliasesResponse\nGetBotChannelAssociationRequest\nGetBotChannelAssociationResponse\nGetBotChannelAssociationsRequest\nGetBotChannelAssociationsResponse\nGetBotRequest\nGetBotResponse\nGetBotVersionsRequest\nGetBotVersionsResponse\nGetBotsRequest\nGetBotsResponse\nGetBranchInput\nGetBranchOutput\nGetBranchRequest\nGetBranchResult\nGetBrowserSettingsRequest\nGetBrowserSettingsResponse\nGetBucketAccelerateConfigurationOutput\nGetBucketAccelerateConfigurationRequest\nGetBucketAccessKeysRequest\nGetBucketAccessKeysResult\nGetBucketAclOutput\nGetBucketAclRequest\nGetBucketAnalyticsConfigurationOutput\nGetBucketAnalyticsConfigurationRequest\nGetBucketBundlesRequest\nGetBucketBundlesResult\nGetBucketCorsOutput\nGetBucketCorsRequest\nGetBucketEncryptionOutput\nGetBucketEncryptionRequest\nGetBucketIntelligentTieringConfigurationOutput\nGetBucketIntelligentTieringConfigurationRequest\nGetBucketInventoryConfigurationOutput\nGetBucketInventoryConfigurationRequest\nGetBucketLifecycleConfigurationOutput\nGetBucketLifecycleConfigurationRequest\nGetBucketLifecycleConfigurationResult\nGetBucketLocationOutput\nGetBucketLocationRequest\nGetBucketLoggingOutput\nGetBucketLoggingRequest\nGetBucketMetricDataRequest\nGetBucketMetricDataResult\nGetBucketMetricsConfigurationOutput\nGetBucketMetricsConfigurationRequest\nGetBucketNotificationConfigurationRequest\nGetBucketOwnershipControlsOutput\nGetBucketOwnershipControlsRequest\nGetBucketPolicyOutput\nGetBucketPolicyRequest\nGetBucketPolicyResult\nGetBucketPolicyStatusOutput\nGetBucketPolicyStatusRequest\nGetBucketReplicationOutput\nGetBucketReplicationRequest\nGetBucketReplicationResult\nGetBucketRequest\nGetBucketRequestPaymentOutput\nGetBucketRequestPaymentRequest\nGetBucketResult\nGetBucketStatisticsRequest\nGetBucketStatisticsResponse\nGetBucketTaggingOutput\nGetBucketTaggingRequest\nGetBucketTaggingResult\nGetBucketVersioningOutput\nGetBucketVersioningRequest\nGetBucketVersioningResult\nGetBucketWebsiteOutput\nGetBucketWebsiteRequest\nGetBucketsAggregationRequest\nGetBucketsAggregationResponse\nGetBucketsRequest\nGetBucketsResult\nGetBuiltinIntentRequest\nGetBuiltinIntentResponse\nGetBuiltinIntentsRequest\nGetBuiltinIntentsResponse\nGetBuiltinSlotTypesRequest\nGetBuiltinSlotTypesResponse\nGetBulkDeploymentStatusRequest\nGetBulkDeploymentStatusResponse\nGetBulkPublishDetailsRequest\nGetBulkPublishDetailsResponse\nGetBundlesRequest\nGetBundlesResult\nGetByteMatchSetRequest\nGetByteMatchSetResponse\nGetCSVHeaderRequest\nGetCSVHeaderResponse\nGetCachePolicyConfigRequest\nGetCachePolicyConfigResult\nGetCachePolicyRequest\nGetCachePolicyResult\nGetCalculatedAttributeDefinitionRequest\nGetCalculatedAttributeDefinitionResponse\nGetCalculatedAttributeForProfileRequest\nGetCalculatedAttributeForProfileResponse\nGetCalculationExecutionCodeRequest\nGetCalculationExecutionCodeResponse\nGetCalculationExecutionRequest\nGetCalculationExecutionResponse\nGetCalculationExecutionStatusRequest\nGetCalculationExecutionStatusResponse\nGetCalendarStateRequest\nGetCalendarStateResponse\nGetCallAnalyticsCategoryRequest\nGetCallAnalyticsCategoryResponse\nGetCallAnalyticsJobRequest\nGetCallAnalyticsJobResponse\nGetCallerIdentityResponse\nGetCampaignActivitiesRequest\nGetCampaignActivitiesResponse\nGetCampaignDateRangeKpiRequest\nGetCampaignDateRangeKpiResponse\nGetCampaignRequest\nGetCampaignResponse\nGetCampaignStateBatchRequest\nGetCampaignStateBatchResponse\nGetCampaignStateRequest\nGetCampaignStateResponse\nGetCampaignVersionRequest\nGetCampaignVersionResponse\nGetCampaignVersionsRequest\nGetCampaignVersionsResponse\nGetCampaignsRequest\nGetCampaignsResponse\nGetCanaryRequest\nGetCanaryResponse\nGetCanaryRunsRequest\nGetCanaryRunsResponse\nGetCapacityAssignmentConfigurationInput\nGetCapacityAssignmentConfigurationOutput\nGetCapacityReservationInput\nGetCapacityReservationOutput\nGetCapacityReservationUsageRequest\nGetCapacityReservationUsageResult\nGetCardinalityRequest\nGetCardinalityResponse\nGetCaseEventConfigurationRequest\nGetCaseEventConfigurationResponse\nGetCaseRequest\nGetCaseResponse\nGetCatalogImportStatusRequest\nGetCatalogImportStatusResponse\nGetCatalogItemInput\nGetCatalogItemOutput\nGetCelebrityInfoRequest\nGetCelebrityInfoResponse\nGetCelebrityRecognitionRequest\nGetCelebrityRecognitionResponse\nGetCellReadinessSummaryRequest\nGetCellReadinessSummaryResponse\nGetCellRequest\nGetCellResponse\nGetCertificateAuthorityCertificateRequest\nGetCertificateAuthorityCertificateResponse\nGetCertificateAuthorityCsrRequest\nGetCertificateAuthorityCsrResponse\nGetCertificateRequest\nGetCertificateResponse\nGetCertificatesRequest\nGetCertificatesResult\nGetChangeLogsRequest\nGetChangeLogsResponse\nGetChangeRequest\nGetChangeResponse\nGetChangeTokenResponse\nGetChangeTokenStatusRequest\nGetChangeTokenStatusResponse\nGetChangesetRequest\nGetChangesetResponse\nGetChannelGroupRequest\nGetChannelGroupResponse\nGetChannelMembershipPreferencesRequest\nGetChannelMembershipPreferencesResponse\nGetChannelMessageRequest\nGetChannelMessageResponse\nGetChannelMessageStatusRequest\nGetChannelMessageStatusResponse\nGetChannelPolicyRequest\nGetChannelPolicyResponse\nGetChannelRequest\nGetChannelResponse\nGetChannelScheduleRequest\nGetChannelScheduleResponse\nGetChannelsRequest\nGetChannelsResponse\nGetCheckerIpRangesResponse\nGetChunkInput\nGetChunkOutput\nGetClassificationExportConfigurationResponse\nGetClassificationScopeRequest\nGetClassificationScopeResponse\nGetClassifierRequest\nGetClassifierResponse\nGetClassifiersRequest\nGetClassifiersResponse\nGetClientCertificateRequest\nGetClientCertificatesRequest\nGetClipInput\nGetClipOutput\nGetCloudFormationStackRecordsRequest\nGetCloudFormationStackRecordsResult\nGetCloudFormationTemplateRequest\nGetCloudFormationTemplateResponse\nGetCloudFrontOriginAccessIdentityConfigRequest\nGetCloudFrontOriginAccessIdentityConfigResult\nGetCloudFrontOriginAccessIdentityRequest\nGetCloudFrontOriginAccessIdentityResult\nGetClusterCredentialsMessage\nGetClusterCredentialsWithIAMMessage\nGetClusterInput\nGetClusterOutput\nGetClusterPolicyRequest\nGetClusterPolicyResponse\nGetClusterSessionCredentialsInput\nGetClusterSessionCredentialsOutput\nGetClusterSnapshotInput\nGetClusterSnapshotOutput\nGetCodeBindingSourceRequest\nGetCodeBindingSourceResponse\nGetCodeSigningConfigRequest\nGetCodeSigningConfigResponse\nGetCodegenJobRequest\nGetCodegenJobResponse\nGetCognitoEventsRequest\nGetCognitoEventsResponse\nGetCoipPoolUsageRequest\nGetCoipPoolUsageResult\nGetCollaborationAnalysisTemplateInput\nGetCollaborationAnalysisTemplateOutput\nGetCollaborationInput\nGetCollaborationOutput\nGetColumnStatisticsForPartitionRequest\nGetColumnStatisticsForPartitionResponse\nGetColumnStatisticsForTableRequest\nGetColumnStatisticsForTableResponse\nGetCommandInvocationRequest\nGetCommandInvocationResult\nGetCommentInput\nGetCommentOutput\nGetCommentReactionsInput\nGetCommentReactionsOutput\nGetCommentsForComparedCommitInput\nGetCommentsForComparedCommitOutput\nGetCommentsForPullRequestInput\nGetCommentsForPullRequestOutput\nGetCommitInput\nGetCommitOutput\nGetCompatibleElasticsearchVersionsRequest\nGetCompatibleElasticsearchVersionsResponse\nGetCompatibleKafkaVersionsRequest\nGetCompatibleKafkaVersionsResponse\nGetCompatibleVersionsRequest\nGetCompatibleVersionsResponse\nGetComplianceDetailRequest\nGetComplianceDetailResponse\nGetComplianceDetailsByConfigRuleRequest\nGetComplianceDetailsByConfigRuleResponse\nGetComplianceDetailsByResourceRequest\nGetComplianceDetailsByResourceResponse\nGetComplianceSummaryByConfigRuleResponse\nGetComplianceSummaryByResourceTypeRequest\nGetComplianceSummaryByResourceTypeResponse\nGetComplianceSummaryInput\nGetComplianceSummaryOutput\nGetComponentInput\nGetComponentOutput\nGetComponentPolicyRequest\nGetComponentPolicyResponse\nGetComponentRequest\nGetComponentResponse\nGetComponentTypeRequest\nGetComponentTypeResponse\nGetComponentVersionArtifactRequest\nGetComponentVersionArtifactResponse\nGetComputeAccessInput\nGetComputeAccessOutput\nGetComputeAuthTokenInput\nGetComputeAuthTokenOutput\nGetConferencePreferenceResponse\nGetConferenceProviderRequest\nGetConferenceProviderResponse\nGetConfigRequest\nGetConfigResponse\nGetConfigurationProfileRequest\nGetConfigurationRequest\nGetConfigurationResponse\nGetConfigurationSetEventDestinationsRequest\nGetConfigurationSetEventDestinationsResponse\nGetConfigurationSetRequest\nGetConfigurationSetResponse\nGetConfiguredTableAnalysisRuleInput\nGetConfiguredTableAnalysisRuleOutput\nGetConfiguredTableAssociationInput\nGetConfiguredTableAssociationOutput\nGetConfiguredTableInput\nGetConfiguredTableOutput\nGetConformancePackComplianceDetailsRequest\nGetConformancePackComplianceDetailsResponse\nGetConformancePackComplianceSummaryRequest\nGetConformancePackComplianceSummaryResponse\nGetConnectAttachmentRequest\nGetConnectAttachmentResponse\nGetConnectInstanceConfigRequest\nGetConnectInstanceConfigResponse\nGetConnectPeerAssociationsRequest\nGetConnectPeerAssociationsResponse\nGetConnectPeerRequest\nGetConnectPeerResponse\nGetConnectionInput\nGetConnectionOutput\nGetConnectionRequest\nGetConnectionResponse\nGetConnectionStatusRequest\nGetConnectionStatusResponse\nGetConnectionsFilter\nGetConnectionsRequest\nGetConnectionsResponse\nGetConnectivityInfoRequest\nGetConnectivityInfoResponse\nGetConnectorDefinitionRequest\nGetConnectorDefinitionResponse\nGetConnectorDefinitionVersionRequest\nGetConnectorDefinitionVersionResponse\nGetConnectorRequest\nGetConnectorResponse\nGetConnectorsRequest\nGetConnectorsResponse\nGetConsoleOutputRequest\nGetConsoleOutputResult\nGetConsoleScreenshotRequest\nGetConsoleScreenshotResult\nGetConsolidatedReportInput\nGetConsolidatedReportOutput\nGetContactAttributesRequest\nGetContactAttributesResponse\nGetContactChannelRequest\nGetContactChannelResult\nGetContactInformationRequest\nGetContactInformationResponse\nGetContactListRequest\nGetContactListResponse\nGetContactMethodsRequest\nGetContactMethodsResult\nGetContactPolicyRequest\nGetContactPolicyResult\nGetContactReachabilityStatusRequest\nGetContactReachabilityStatusResponse\nGetContactRequest\nGetContactResponse\nGetContactResult\nGetContainerAPIMetadataResult\nGetContainerImagesRequest\nGetContainerImagesResult\nGetContainerLogRequest\nGetContainerLogResult\nGetContainerPolicyInput\nGetContainerPolicyOutput\nGetContainerRecipePolicyRequest\nGetContainerRecipePolicyResponse\nGetContainerRecipeRequest\nGetContainerRecipeResponse\nGetContainerServiceDeploymentsRequest\nGetContainerServiceDeploymentsResult\nGetContainerServiceMetricDataRequest\nGetContainerServiceMetricDataResult\nGetContainerServicePowersResult\nGetContainerServicesRequest\nGetContentModerationRequest\nGetContentModerationRequestMetadata\nGetContentModerationResponse\nGetContentRequest\nGetContentResponse\nGetContentSummaryRequest\nGetContentSummaryResponse\nGetContextKeysForCustomPolicyRequest\nGetContextKeysForPolicyResponse\nGetContextKeysForPrincipalPolicyRequest\nGetContinuousDeploymentPolicyConfigRequest\nGetContinuousDeploymentPolicyConfigResult\nGetContinuousDeploymentPolicyRequest\nGetContinuousDeploymentPolicyResult\nGetControlOperationInput\nGetControlOperationOutput\nGetControlRequest\nGetControlResponse\nGetCoreDefinitionRequest\nGetCoreDefinitionResponse\nGetCoreDefinitionVersionRequest\nGetCoreDefinitionVersionResponse\nGetCoreDeviceRequest\nGetCoreDeviceResponse\nGetCoreNetworkChangeEventsRequest\nGetCoreNetworkChangeEventsResponse\nGetCoreNetworkChangeSetRequest\nGetCoreNetworkChangeSetResponse\nGetCoreNetworkPolicyRequest\nGetCoreNetworkPolicyResponse\nGetCoreNetworkRequest\nGetCoreNetworkResponse\nGetCorsPolicyInput\nGetCorsPolicyOutput\nGetCostAndUsageRequest\nGetCostAndUsageResponse\nGetCostAndUsageWithResourcesRequest\nGetCostAndUsageWithResourcesResponse\nGetCostCategoriesRequest\nGetCostCategoriesResponse\nGetCostEstimateRequest\nGetCostEstimateResult\nGetCostEstimationRequest\nGetCostEstimationResponse\nGetCostForecastRequest\nGetCostForecastResponse\nGetCoverageStatisticsRequest\nGetCoverageStatisticsResponse\nGetCrawlerMetricsRequest\nGetCrawlerMetricsResponse\nGetCrawlerRequest\nGetCrawlerResponse\nGetCrawlersRequest\nGetCrawlersResponse\nGetCredentialReportResponse\nGetCredentialsForIdentityInput\nGetCredentialsForIdentityResponse\nGetCredentialsRequest\nGetCredentialsResponse\nGetCurrentMetricDataRequest\nGetCurrentMetricDataResponse\nGetCurrentUserDataRequest\nGetCurrentUserDataResponse\nGetCurrentUserRequest\nGetCurrentUserResponse\nGetCustomDataIdentifierRequest\nGetCustomDataIdentifierResponse\nGetCustomEntityTypeRequest\nGetCustomEntityTypeResponse\nGetCustomModelRequest\nGetCustomModelResponse\nGetCustomRulePolicyRequest\nGetCustomRulePolicyResponse\nGetCustomVerificationEmailTemplateRequest\nGetCustomVerificationEmailTemplateResponse\nGetCustomerGatewayAssociationsRequest\nGetCustomerGatewayAssociationsResponse\nGetDASHStreamingSessionURLInput\nGetDASHStreamingSessionURLOutput\nGetDICOMImportJobRequest\nGetDICOMImportJobResponse\nGetDNSSECRequest\nGetDNSSECResponse\nGetDashboardEmbedUrlRequest\nGetDashboardEmbedUrlResponse\nGetDashboardForJobRunRequest\nGetDashboardForJobRunResponse\nGetDashboardInput\nGetDashboardOutput\nGetDataCatalogEncryptionSettingsRequest\nGetDataCatalogEncryptionSettingsResponse\nGetDataCatalogInput\nGetDataCatalogOutput\nGetDataCellsFilterRequest\nGetDataCellsFilterResponse\nGetDataEndpointInput\nGetDataEndpointOutput\nGetDataIntegrationRequest\nGetDataIntegrationResponse\nGetDataLakeExceptionSubscriptionResponse\nGetDataLakeOrganizationConfigurationResponse\nGetDataLakeSettingsRequest\nGetDataLakeSettingsResponse\nGetDataLakeSourcesRequest\nGetDataLakeSourcesResponse\nGetDataProtectionPolicyInput\nGetDataProtectionPolicyRequest\nGetDataProtectionPolicyResponse\nGetDataQualityMetricsRequest\nGetDataQualityMetricsResponse\nGetDataQualityResultRequest\nGetDataQualityResultResponse\nGetDataQualityRuleRecommendationRunRequest\nGetDataQualityRuleRecommendationRunResponse\nGetDataQualityRulesetEvaluationRunRequest\nGetDataQualityRulesetEvaluationRunResponse\nGetDataQualityRulesetRequest\nGetDataQualityRulesetResponse\nGetDataRetrievalPolicyInput\nGetDataRetrievalPolicyOutput\nGetDataSetDetailsRequest\nGetDataSetDetailsResponse\nGetDataSetImportTaskRequest\nGetDataSetImportTaskResponse\nGetDataSetRequest\nGetDataSetResponse\nGetDataSourceInput\nGetDataSourceOutput\nGetDataSourceRequest\nGetDataSourceResponse\nGetDataViewRequest\nGetDataViewResponse\nGetDatabaseInput\nGetDatabaseOutput\nGetDatabaseRequest\nGetDatabaseResponse\nGetDatabasesRequest\nGetDatabasesResponse\nGetDataflowEndpointGroupRequest\nGetDataflowEndpointGroupResponse\nGetDataflowGraphRequest\nGetDataflowGraphResponse\nGetDatasetContentRequest\nGetDatasetContentResponse\nGetDatasetRequest\nGetDatasetResponse\nGetDatastoreRequest\nGetDatastoreResponse\nGetDecoderManifestRequest\nGetDecoderManifestResponse\nGetDecryptedAPIKeyRequest\nGetDecryptedAPIKeyResponse\nGetDedicatedIpPoolRequest\nGetDedicatedIpPoolResponse\nGetDedicatedIpRequest\nGetDedicatedIpResponse\nGetDedicatedIpsRequest\nGetDedicatedIpsResponse\nGetDefaultCreditSpecificationRequest\nGetDefaultCreditSpecificationResult\nGetDefaultPatchBaselineRequest\nGetDefaultPatchBaselineResult\nGetDefaultRetentionPolicyRequest\nGetDefaultRetentionPolicyResponse\nGetDefaultViewOutput\nGetDelegatedAdminAccountResponse\nGetDelegationsRequest\nGetDelegationsResponse\nGetDeleteEventsByEventTypeStatusRequest\nGetDeleteEventsByEventTypeStatusResult\nGetDeliverabilityDashboardOptionsResponse\nGetDeliverabilityTestReportRequest\nGetDeliverabilityTestReportResponse\nGetDeployablePatchSnapshotForInstanceRequest\nGetDeployablePatchSnapshotForInstanceResult\nGetDeploymentConfigInput\nGetDeploymentConfigOutput\nGetDeploymentGroupInput\nGetDeploymentGroupOutput\nGetDeploymentInput\nGetDeploymentInstanceInput\nGetDeploymentInstanceOutput\nGetDeploymentOutput\nGetDeploymentRequest\nGetDeploymentResponse\nGetDeploymentStatusRequest\nGetDeploymentStatusResponse\nGetDeploymentStrategyRequest\nGetDeploymentTargetInput\nGetDeploymentTargetOutput\nGetDeploymentsRequest\nGetDeploymentsResponse\nGetDeploymentsResult\nGetDestinationRequest\nGetDestinationResponse\nGetDetectorModelAnalysisResultsRequest\nGetDetectorModelAnalysisResultsResponse\nGetDetectorRequest\nGetDetectorResponse\nGetDetectorVersionRequest\nGetDetectorVersionResult\nGetDetectorsRequest\nGetDetectorsResult\nGetDevEndpointRequest\nGetDevEndpointResponse\nGetDevEndpointsRequest\nGetDevEndpointsResponse\nGetDevEnvironmentRequest\nGetDevEnvironmentResponse\nGetDeviceDefinitionRequest\nGetDeviceDefinitionResponse\nGetDeviceDefinitionVersionRequest\nGetDeviceDefinitionVersionResponse\nGetDeviceFleetReportRequest\nGetDeviceFleetReportResponse\nGetDeviceIdentifierRequest\nGetDeviceIdentifierResponse\nGetDeviceInstanceRequest\nGetDeviceInstanceResult\nGetDeviceMethodsRequest\nGetDeviceMethodsResponse\nGetDevicePoolCompatibilityRequest\nGetDevicePoolCompatibilityResult\nGetDevicePoolRequest\nGetDevicePoolResult\nGetDevicePositionHistoryRequest\nGetDevicePositionHistoryResponse\nGetDevicePositionRequest\nGetDevicePositionResponse\nGetDeviceProfileRequest\nGetDeviceProfileResponse\nGetDeviceRegistrationRequest\nGetDeviceRegistrationResult\nGetDeviceRequest\nGetDeviceResponse\nGetDeviceResult\nGetDevicesInPlacementRequest\nGetDevicesInPlacementResponse\nGetDevicesRequest\nGetDevicesResponse\nGetDifferencesInput\nGetDifferencesOutput\nGetDigestRequest\nGetDigestResponse\nGetDimensionKeyDetailsRequest\nGetDimensionKeyDetailsResponse\nGetDimensionValuesRequest\nGetDimensionValuesResponse\nGetDirectoryLimitsResult\nGetDirectoryRegistrationRequest\nGetDirectoryRegistrationResponse\nGetDirectoryRequest\nGetDirectoryResponse\nGetDiscoveredResourceCountsRequest\nGetDiscoveredResourceCountsResponse\nGetDiscoveredSchemaRequest\nGetDiscoveredSchemaResponse\nGetDiscoverySummaryResponse\nGetDiskRequest\nGetDiskResult\nGetDiskSnapshotRequest\nGetDiskSnapshotResult\nGetDiskSnapshotsRequest\nGetDiskSnapshotsResult\nGetDisksRequest\nGetDisksResult\nGetDistributionBundlesResult\nGetDistributionConfigRequest\nGetDistributionConfigResult\nGetDistributionConfigurationRequest\nGetDistributionConfigurationResponse\nGetDistributionLatestCacheResetRequest\nGetDistributionLatestCacheResetResult\nGetDistributionMetricDataRequest\nGetDistributionMetricDataResult\nGetDistributionRequest\nGetDistributionResult\nGetDistributionsRequest\nGetDistributionsResult\nGetDocumentAnalysisRequest\nGetDocumentAnalysisResponse\nGetDocumentPathRequest\nGetDocumentPathResponse\nGetDocumentRequest\nGetDocumentResponse\nGetDocumentResult\nGetDocumentTextDetectionRequest\nGetDocumentTextDetectionResponse\nGetDocumentVersionRequest\nGetDocumentVersionResponse\nGetDocumentationPartRequest\nGetDocumentationPartsRequest\nGetDocumentationVersionRequest\nGetDocumentationVersionsRequest\nGetDomainAssociationRequest\nGetDomainAssociationResult\nGetDomainDeliverabilityCampaignRequest\nGetDomainDeliverabilityCampaignResponse\nGetDomainDetailRequest\nGetDomainDetailResponse\nGetDomainNameRequest\nGetDomainNameResponse\nGetDomainNamesRequest\nGetDomainNamesResponse\nGetDomainPermissionsPolicyRequest\nGetDomainPermissionsPolicyResult\nGetDomainRequest\nGetDomainResponse\nGetDomainResult\nGetDomainStatisticsReportRequest\nGetDomainStatisticsReportResponse\nGetDomainSuggestionsRequest\nGetDomainSuggestionsResponse\nGetDomainsRequest\nGetDomainsResult\nGetDownloadUrlForLayerRequest\nGetDownloadUrlForLayerResponse\nGetEBSVolumeRecommendationsRequest\nGetEBSVolumeRecommendationsResponse\nGetEC2InstanceRecommendationsRequest\nGetEC2InstanceRecommendationsResponse\nGetEC2RecommendationProjectedMetricsRequest\nGetEC2RecommendationProjectedMetricsResponse\nGetECSServiceRecommendationProjectedMetricsRequest\nGetECSServiceRecommendationProjectedMetricsResponse\nGetECSServiceRecommendationsRequest\nGetECSServiceRecommendationsResponse\nGetEarthObservationJobInput\nGetEarthObservationJobOutput\nGetEbsDefaultKmsKeyIdRequest\nGetEbsDefaultKmsKeyIdResult\nGetEbsEncryptionByDefaultRequest\nGetEbsEncryptionByDefaultResult\nGetEc2DeepInspectionConfigurationResponse\nGetEffectivePermissionsForPathRequest\nGetEffectivePermissionsForPathResponse\nGetEffectivePoliciesRequest\nGetEffectivePoliciesResponse\nGetEffectiveRecommendationPreferencesRequest\nGetEffectiveRecommendationPreferencesResponse\nGetEmailChannelRequest\nGetEmailChannelResponse\nGetEmailIdentityPoliciesRequest\nGetEmailIdentityPoliciesResponse\nGetEmailIdentityRequest\nGetEmailIdentityResponse\nGetEmailTemplateRequest\nGetEmailTemplateResponse\nGetEnabledStandardsRequest\nGetEnabledStandardsResponse\nGetEncryptionConfigResult\nGetEncryptionConfigurationResponse\nGetEncryptionKeyRequest\nGetEncryptionKeyResponse\nGetEndpointAccessRequest\nGetEndpointAccessResponse\nGetEndpointAttributesInput\nGetEndpointAttributesResponse\nGetEndpointRequest\nGetEndpointResponse\nGetEngineStatusOutput\nGetEnrollmentStatusResponse\nGetEnrollmentStatusesForOrganizationRequest\nGetEnrollmentStatusesForOrganizationResponse\nGetEntitiesRequest\nGetEntitiesResponse\nGetEntitlementsRequest\nGetEntitlementsResult\nGetEntityRequest\nGetEntityResponse\nGetEntityTypesRequest\nGetEntityTypesResult\nGetEnvironmentAccountConnectionInput\nGetEnvironmentAccountConnectionOutput\nGetEnvironmentInput\nGetEnvironmentOutput\nGetEnvironmentRequest\nGetEnvironmentResponse\nGetEnvironmentTemplateInput\nGetEnvironmentTemplateOutput\nGetEnvironmentTemplateVersionInput\nGetEnvironmentTemplateVersionOutput\nGetEulaRequest\nGetEulaResponse\nGetEvaluationInput\nGetEvaluationOutput\nGetEventActionRequest\nGetEventActionResponse\nGetEventConfigurationByResourceTypesResponse\nGetEventDataStoreRequest\nGetEventDataStoreResponse\nGetEventIntegrationRequest\nGetEventIntegrationResponse\nGetEventPredictionMetadataRequest\nGetEventPredictionMetadataResult\nGetEventPredictionRequest\nGetEventPredictionResult\nGetEventRequest\nGetEventResult\nGetEventSelectorsRequest\nGetEventSelectorsResponse\nGetEventSourceMappingRequest\nGetEventStreamRequest\nGetEventStreamResponse\nGetEventTypesRequest\nGetEventTypesResult\nGetEventsConfigurationRequest\nGetEventsConfigurationResponse\nGetEvidenceByEvidenceFolderRequest\nGetEvidenceByEvidenceFolderResponse\nGetEvidenceFileUploadUrlRequest\nGetEvidenceFileUploadUrlResponse\nGetEvidenceFolderRequest\nGetEvidenceFolderResponse\nGetEvidenceFoldersByAssessmentControlRequest\nGetEvidenceFoldersByAssessmentControlResponse\nGetEvidenceFoldersByAssessmentRequest\nGetEvidenceFoldersByAssessmentResponse\nGetEvidenceRequest\nGetEvidenceResponse\nGetExclusionsPreviewRequest\nGetExclusionsPreviewResponse\nGetExecutionHistoryInput\nGetExecutionHistoryOutput\nGetExpenseAnalysisRequest\nGetExpenseAnalysisResponse\nGetExperimentRequest\nGetExperimentResponse\nGetExperimentResultsRequest\nGetExperimentResultsResponse\nGetExperimentTemplateRequest\nGetExperimentTemplateResponse\nGetExportJobRequest\nGetExportJobResponse\nGetExportJobsRequest\nGetExportJobsResponse\nGetExportRequest\nGetExportResponse\nGetExportSnapshotRecordsRequest\nGetExportSnapshotRecordsResult\nGetExtensionAssociationRequest\nGetExtensionRequest\nGetExtensionResult\nGetExtensionVersionRequest\nGetExtensionVersionResult\nGetExternalDataViewAccessDetailsRequest\nGetExternalDataViewAccessDetailsResponse\nGetExternalModelsRequest\nGetExternalModelsResult\nGetFaceDetectionRequest\nGetFaceDetectionResponse\nGetFaceLivenessSessionResultsRequest\nGetFaceLivenessSessionResultsResponse\nGetFaceSearchRequest\nGetFaceSearchResponse\nGetFacetRequest\nGetFacetResponse\nGetFailbackReplicationConfigurationRequest\nGetFailbackReplicationConfigurationResponse\nGetFeatureRequest\nGetFeatureResponse\nGetFederationTokenRequest\nGetFederationTokenResponse\nGetFeedbackRequest\nGetFeedbackResponse\nGetFieldLevelEncryptionConfigRequest\nGetFieldLevelEncryptionConfigResult\nGetFieldLevelEncryptionProfileConfigRequest\nGetFieldLevelEncryptionProfileConfigResult\nGetFieldLevelEncryptionProfileRequest\nGetFieldLevelEncryptionProfileResult\nGetFieldLevelEncryptionRequest\nGetFieldLevelEncryptionResult\nGetFieldResponse\nGetFileInput\nGetFileOutput\nGetFileUploadURLRequest\nGetFileUploadURLResponse\nGetFilterRequest\nGetFilterResponse\nGetFindingAggregatorRequest\nGetFindingAggregatorResponse\nGetFindingHistoryRequest\nGetFindingHistoryResponse\nGetFindingRequest\nGetFindingResponse\nGetFindingStatisticsRequest\nGetFindingStatisticsResponse\nGetFindingsFilterRequest\nGetFindingsFilterResponse\nGetFindingsPublicationConfigurationResponse\nGetFindingsReportAccountSummaryRequest\nGetFindingsReportAccountSummaryResponse\nGetFindingsReportStatusRequest\nGetFindingsReportStatusResponse\nGetFindingsRequest\nGetFindingsResponse\nGetFindingsStatisticsRequest\nGetFindingsStatisticsResponse\nGetFirewallConfigRequest\nGetFirewallConfigResponse\nGetFirewallDomainListRequest\nGetFirewallDomainListResponse\nGetFirewallRuleGroupAssociationRequest\nGetFirewallRuleGroupAssociationResponse\nGetFirewallRuleGroupPolicyRequest\nGetFirewallRuleGroupPolicyResponse\nGetFirewallRuleGroupRequest\nGetFirewallRuleGroupResponse\nGetFleetRequest\nGetFleetResponse\nGetFlowLogsIntegrationTemplateRequest\nGetFlowLogsIntegrationTemplateResult\nGetFlowTemplateRequest\nGetFlowTemplateResponse\nGetFlowTemplateRevisionsRequest\nGetFlowTemplateRevisionsResponse\nGetFolderInput\nGetFolderOutput\nGetFolderPathRequest\nGetFolderPathResponse\nGetFolderRequest\nGetFolderResponse\nGetFormRequest\nGetFormResponse\nGetFoundationModelRequest\nGetFoundationModelResponse\nGetFunctionCodeSigningConfigRequest\nGetFunctionCodeSigningConfigResponse\nGetFunctionConcurrencyRequest\nGetFunctionConcurrencyResponse\nGetFunctionConfigurationRequest\nGetFunctionDefinitionRequest\nGetFunctionDefinitionResponse\nGetFunctionDefinitionVersionRequest\nGetFunctionDefinitionVersionResponse\nGetFunctionEventInvokeConfigRequest\nGetFunctionRequest\nGetFunctionResponse\nGetFunctionResult\nGetFunctionUrlConfigRequest\nGetFunctionUrlConfigResponse\nGetFuotaTaskRequest\nGetFuotaTaskResponse\nGetGameConfigurationRequest\nGetGameConfigurationResult\nGetGameRequest\nGetGameResult\nGetGameSessionLogUrlInput\nGetGameSessionLogUrlOutput\nGetGatewayGroupRequest\nGetGatewayGroupResponse\nGetGatewayInput\nGetGatewayOutput\nGetGatewayRequest\nGetGatewayResponse\nGetGatewayResponseRequest\nGetGatewayResponsesRequest\nGetGcmChannelRequest\nGetGcmChannelResponse\nGetGeneratedCodeJobRequest\nGetGeneratedCodeJobResult\nGetGeneratedPolicyRequest\nGetGeneratedPolicyResponse\nGetGeoLocationRequest\nGetGeoLocationResponse\nGetGeoMatchSetRequest\nGetGeoMatchSetResponse\nGetGeofenceRequest\nGetGeofenceResponse\nGetGlobalSettingsResponse\nGetGrantRequest\nGetGrantResponse\nGetGraphqlApiRequest\nGetGraphqlApiResponse\nGetGremlinQueryStatusInput\nGetGremlinQueryStatusOutput\nGetGroupCertificateAuthorityRequest\nGetGroupCertificateAuthorityResponse\nGetGroupCertificateConfigurationRequest\nGetGroupCertificateConfigurationResponse\nGetGroupConfigurationInput\nGetGroupConfigurationOutput\nGetGroupIdRequest\nGetGroupIdResponse\nGetGroupInput\nGetGroupMembershipIdRequest\nGetGroupMembershipIdResponse\nGetGroupOutput\nGetGroupPolicyRequest\nGetGroupPolicyResponse\nGetGroupQueryInput\nGetGroupQueryOutput\nGetGroupRequest\nGetGroupResponse\nGetGroupResult\nGetGroupVersionRequest\nGetGroupVersionResponse\nGetGroupsForCapacityReservationRequest\nGetGroupsForCapacityReservationResult\nGetGroupsRequest\nGetGroupsResult\nGetHITRequest\nGetHITResponse\nGetHLSStreamingSessionURLInput\nGetHLSStreamingSessionURLOutput\nGetHealthCheckCountResponse\nGetHealthCheckLastFailureReasonRequest\nGetHealthCheckLastFailureReasonResponse\nGetHealthCheckRequest\nGetHealthCheckResponse\nGetHealthCheckStatusRequest\nGetHealthCheckStatusResponse\nGetHealthEventInput\nGetHealthEventOutput\nGetHlsManifestConfiguration\nGetHomeRegionResult\nGetHostInput\nGetHostOutput\nGetHostReservationPurchasePreviewRequest\nGetHostReservationPurchasePreviewResult\nGetHostedConfigurationVersionRequest\nGetHostedZoneCountResponse\nGetHostedZoneLimitRequest\nGetHostedZoneLimitResponse\nGetHostedZoneRequest\nGetHostedZoneResponse\nGetHostnameSuggestionRequest\nGetHostnameSuggestionResult\nGetHypervisorInput\nGetHypervisorOutput\nGetHypervisorPropertyMappingsInput\nGetHypervisorPropertyMappingsOutput\nGetIPSetRequest\nGetIPSetResponse\nGetIceServerConfigRequest\nGetIceServerConfigResponse\nGetIdInput\nGetIdResponse\nGetIdentityDkimAttributesRequest\nGetIdentityDkimAttributesResponse\nGetIdentityMailFromDomainAttributesRequest\nGetIdentityMailFromDomainAttributesResponse\nGetIdentityNotificationAttributesRequest\nGetIdentityNotificationAttributesResponse\nGetIdentityPoliciesRequest\nGetIdentityPoliciesResponse\nGetIdentityPoolConfigurationRequest\nGetIdentityPoolConfigurationResponse\nGetIdentityPoolRolesInput\nGetIdentityPoolRolesResponse\nGetIdentityProviderByIdentifierRequest\nGetIdentityProviderByIdentifierResponse\nGetIdentityProviderRequest\nGetIdentityProviderResponse\nGetIdentityResolutionJobRequest\nGetIdentityResolutionJobResponse\nGetIdentitySourceInput\nGetIdentitySourceOutput\nGetIdentityVerificationAttributesRequest\nGetIdentityVerificationAttributesResponse\nGetImageBlockPublicAccessStateRequest\nGetImageBlockPublicAccessStateResult\nGetImageFrameRequest\nGetImageFrameResponse\nGetImagePipelineRequest\nGetImagePipelineResponse\nGetImagePolicyRequest\nGetImagePolicyResponse\nGetImageRecipePolicyRequest\nGetImageRecipePolicyResponse\nGetImageRecipeRequest\nGetImageRecipeResponse\nGetImageRequest\nGetImageResponse\nGetImageSetMetadataRequest\nGetImageSetMetadataResponse\nGetImageSetRequest\nGetImageSetResponse\nGetImagesInput\nGetImagesOutput\nGetImpersonationRoleEffectRequest\nGetImpersonationRoleEffectResponse\nGetImpersonationRoleRequest\nGetImpersonationRoleResponse\nGetImportFileTaskRequest\nGetImportFileTaskResponse\nGetImportJobRequest\nGetImportJobResponse\nGetImportJobsRequest\nGetImportJobsResponse\nGetImportRequest\nGetImportResponse\nGetInAppMessagesRequest\nGetInAppMessagesResponse\nGetInAppTemplateRequest\nGetInAppTemplateResponse\nGetIncidentRecordInput\nGetIncidentRecordOutput\nGetIndexOutput\nGetIndexingConfigurationResponse\nGetInfrastructureConfigurationRequest\nGetInfrastructureConfigurationResponse\nGetIngestionDestinationRequest\nGetIngestionDestinationResponse\nGetIngestionRequest\nGetIngestionResponse\nGetInlinePolicyForPermissionSetRequest\nGetInlinePolicyForPermissionSetResponse\nGetInsightEventsRequest\nGetInsightEventsResult\nGetInsightImpactGraphRequest\nGetInsightImpactGraphResult\nGetInsightRequest\nGetInsightResult\nGetInsightResultsRequest\nGetInsightResultsResponse\nGetInsightRuleReportInput\nGetInsightRuleReportOutput\nGetInsightSelectorsRequest\nGetInsightSelectorsResponse\nGetInsightSummariesRequest\nGetInsightSummariesResult\nGetInsightsByAssessmentRequest\nGetInsightsByAssessmentResponse\nGetInsightsRequest\nGetInsightsResponse\nGetInstanceAccessDetailsRequest\nGetInstanceAccessDetailsResult\nGetInstanceAccessInput\nGetInstanceAccessOutput\nGetInstanceMetricDataRequest\nGetInstanceMetricDataResult\nGetInstanceOnboardingJobStatusRequest\nGetInstanceOnboardingJobStatusResponse\nGetInstancePortStatesRequest\nGetInstancePortStatesResult\nGetInstanceProfileRequest\nGetInstanceProfileResponse\nGetInstanceProfileResult\nGetInstanceRequest\nGetInstanceResponse\nGetInstanceResult\nGetInstanceSnapshotRequest\nGetInstanceSnapshotResult\nGetInstanceSnapshotsRequest\nGetInstanceSnapshotsResult\nGetInstanceStateRequest\nGetInstanceStateResult\nGetInstanceTypesFromInstanceRequirementsRequest\nGetInstanceTypesFromInstanceRequirementsResult\nGetInstanceUefiDataRequest\nGetInstanceUefiDataResult\nGetInstancesHealthStatusRequest\nGetInstancesHealthStatusResponse\nGetInstancesRequest\nGetInstancesResult\nGetIntegrationRequest\nGetIntegrationResponse\nGetIntegrationResponseRequest\nGetIntegrationResponseResponse\nGetIntegrationResponsesRequest\nGetIntegrationResponsesResponse\nGetIntegrationResult\nGetIntegrationsRequest\nGetIntegrationsResponse\nGetIntentRequest\nGetIntentResponse\nGetIntentVersionsRequest\nGetIntentVersionsResponse\nGetIntentsRequest\nGetIntentsResponse\nGetInterpolatedAssetPropertyValuesRequest\nGetInterpolatedAssetPropertyValuesResponse\nGetIntrospectionSchemaRequest\nGetIntrospectionSchemaResponse\nGetInvalidationRequest\nGetInvalidationResult\nGetInventoryRequest\nGetInventoryResult\nGetInventorySchemaRequest\nGetInventorySchemaResult\nGetInvitationConfigurationResponse\nGetInvitationsCountResponse\nGetIpAccessSettingsRequest\nGetIpAccessSettingsResponse\nGetIpamAddressHistoryRequest\nGetIpamAddressHistoryResult\nGetIpamDiscoveredAccountsRequest\nGetIpamDiscoveredAccountsResult\nGetIpamDiscoveredResourceCidrsRequest\nGetIpamDiscoveredResourceCidrsResult\nGetIpamPoolAllocationsRequest\nGetIpamPoolAllocationsResult\nGetIpamPoolCidrsRequest\nGetIpamPoolCidrsResult\nGetIpamResourceCidrsRequest\nGetIpamResourceCidrsResult\nGetItemInput\nGetItemOutput\nGetJobBookmarkRequest\nGetJobBookmarkResponse\nGetJobDetailsInput\nGetJobDetailsOutput\nGetJobDocumentRequest\nGetJobDocumentResponse\nGetJobManifestRequest\nGetJobManifestResult\nGetJobOutputInput\nGetJobOutputOutput\nGetJobRequest\nGetJobResponse\nGetJobResult\nGetJobRunRequest\nGetJobRunResponse\nGetJobRunsRequest\nGetJobRunsResponse\nGetJobTaggingRequest\nGetJobTaggingResult\nGetJobTemplateRequest\nGetJobTemplateResponse\nGetJobUnlockCodeRequest\nGetJobUnlockCodeResult\nGetJobsRequest\nGetJobsResponse\nGetJourneyDateRangeKpiRequest\nGetJourneyDateRangeKpiResponse\nGetJourneyExecutionActivityMetricsRequest\nGetJourneyExecutionActivityMetricsResponse\nGetJourneyExecutionMetricsRequest\nGetJourneyExecutionMetricsResponse\nGetJourneyRequest\nGetJourneyResponse\nGetJourneyRunExecutionActivityMetricsRequest\nGetJourneyRunExecutionActivityMetricsResponse\nGetJourneyRunExecutionMetricsRequest\nGetJourneyRunExecutionMetricsResponse\nGetJourneyRunsRequest\nGetJourneyRunsResponse\nGetKMSEncryptionKeyResult\nGetKeyGroupConfigRequest\nGetKeyGroupConfigResult\nGetKeyGroupRequest\nGetKeyGroupResult\nGetKeyInput\nGetKeyOutput\nGetKeyPairRequest\nGetKeyPairResult\nGetKeyPairsRequest\nGetKeyPairsResult\nGetKeyPolicyRequest\nGetKeyPolicyResponse\nGetKeyRotationStatusRequest\nGetKeyRotationStatusResponse\nGetKeyspaceRequest\nGetKeyspaceResponse\nGetKnowledgeBaseRequest\nGetKnowledgeBaseResponse\nGetKxChangesetRequest\nGetKxChangesetResponse\nGetKxClusterRequest\nGetKxClusterResponse\nGetKxConnectionStringRequest\nGetKxConnectionStringResponse\nGetKxDatabaseRequest\nGetKxDatabaseResponse\nGetKxEnvironmentRequest\nGetKxEnvironmentResponse\nGetKxUserRequest\nGetKxUserResponse\nGetLFTagRequest\nGetLFTagResponse\nGetLabelDetectionRequest\nGetLabelDetectionRequestMetadata\nGetLabelDetectionResponse\nGetLabelsRequest\nGetLabelsResult\nGetLambdaFunctionRecommendationsRequest\nGetLambdaFunctionRecommendationsResponse\nGetLatestAssessmentIdResponse\nGetLatestConfigurationRequest\nGetLatestConfigurationResponse\nGetLaunchConfigurationRequest\nGetLaunchProfileDetailsRequest\nGetLaunchProfileDetailsResponse\nGetLaunchProfileInitializationRequest\nGetLaunchProfileInitializationResponse\nGetLaunchProfileMemberRequest\nGetLaunchProfileMemberResponse\nGetLaunchProfileRequest\nGetLaunchProfileResponse\nGetLaunchRequest\nGetLaunchResponse\nGetLaunchTemplateDataRequest\nGetLaunchTemplateDataResult\nGetLayerVersionByArnRequest\nGetLayerVersionPolicyRequest\nGetLayerVersionPolicyResponse\nGetLayerVersionRequest\nGetLayerVersionResponse\nGetLayoutRequest\nGetLayoutResponse\nGetLegalHoldInput\nGetLegalHoldOutput\nGetLendingAnalysisRequest\nGetLendingAnalysisResponse\nGetLendingAnalysisSummaryRequest\nGetLendingAnalysisSummaryResponse\nGetLensInput\nGetLensOutput\nGetLensReviewInput\nGetLensReviewOutput\nGetLensReviewReportInput\nGetLensReviewReportOutput\nGetLensVersionDifferenceInput\nGetLensVersionDifferenceOutput\nGetLexiconInput\nGetLexiconOutput\nGetLicenseConfigurationRequest\nGetLicenseConfigurationResponse\nGetLicenseConversionTaskRequest\nGetLicenseConversionTaskResponse\nGetLicenseManagerReportGeneratorRequest\nGetLicenseManagerReportGeneratorResponse\nGetLicenseRecommendationsRequest\nGetLicenseRecommendationsResponse\nGetLicenseRequest\nGetLicenseResponse\nGetLicenseUsageRequest\nGetLicenseUsageResponse\nGetLifecyclePoliciesRequest\nGetLifecyclePoliciesResponse\nGetLifecyclePolicyInput\nGetLifecyclePolicyOutput\nGetLifecyclePolicyPreviewRequest\nGetLifecyclePolicyPreviewResponse\nGetLifecyclePolicyRequest\nGetLifecyclePolicyResponse\nGetLineageGroupPolicyRequest\nGetLineageGroupPolicyResponse\nGetLinkAssociationsRequest\nGetLinkAssociationsResponse\nGetLinkAttributes\nGetLinkAttributesRequest\nGetLinkAttributesResponse\nGetLinkInput\nGetLinkOutput\nGetLinksRequest\nGetLinksResponse\nGetListElementsRequest\nGetListElementsResult\nGetListenerRequest\nGetListenerResponse\nGetListsMetadataRequest\nGetListsMetadataResult\nGetLoadBalancerMetricDataRequest\nGetLoadBalancerMetricDataResult\nGetLoadBalancerRequest\nGetLoadBalancerResult\nGetLoadBalancerTlsCertificatesRequest\nGetLoadBalancerTlsCertificatesResult\nGetLoadBalancerTlsPoliciesRequest\nGetLoadBalancerTlsPoliciesResult\nGetLoadBalancersRequest\nGetLoadBalancersResult\nGetLoaderJobStatusInput\nGetLoaderJobStatusOutput\nGetLogDeliveryConfigurationRequest\nGetLogDeliveryConfigurationResponse\nGetLogEventsRequest\nGetLogEventsResponse\nGetLogGroupFieldsRequest\nGetLogGroupFieldsResponse\nGetLogLevelsByResourceTypesResponse\nGetLogRecordRequest\nGetLogRecordResponse\nGetLoggerDefinitionRequest\nGetLoggerDefinitionResponse\nGetLoggerDefinitionVersionRequest\nGetLoggerDefinitionVersionResponse\nGetLoggingConfigurationRequest\nGetLoggingConfigurationResponse\nGetLoggingOptionsResponse\nGetLoginProfileRequest\nGetLoginProfileResponse\nGetLowLatencyHlsManifestConfiguration\nGetMFADeviceRequest\nGetMFADeviceResponse\nGetMLDataProcessingJobInput\nGetMLDataProcessingJobOutput\nGetMLEndpointInput\nGetMLEndpointOutput\nGetMLModelInput\nGetMLModelOutput\nGetMLModelTrainingJobInput\nGetMLModelTrainingJobOutput\nGetMLModelTransformJobInput\nGetMLModelTransformJobOutput\nGetMLTaskRunRequest\nGetMLTaskRunResponse\nGetMLTaskRunsRequest\nGetMLTaskRunsResponse\nGetMLTransformRequest\nGetMLTransformResponse\nGetMLTransformsRequest\nGetMLTransformsResponse\nGetMacieSessionResponse\nGetMailDomainRequest\nGetMailDomainResponse\nGetMailboxDetailsRequest\nGetMailboxDetailsResponse\nGetMaintenanceWindowExecutionRequest\nGetMaintenanceWindowExecutionResult\nGetMaintenanceWindowExecutionTaskInvocationRequest\nGetMaintenanceWindowExecutionTaskInvocationResult\nGetMaintenanceWindowExecutionTaskRequest\nGetMaintenanceWindowExecutionTaskResult\nGetMaintenanceWindowRequest\nGetMaintenanceWindowResult\nGetMaintenanceWindowTaskRequest\nGetMaintenanceWindowTaskResult\nGetMalwareScanSettingsRequest\nGetMalwareScanSettingsResponse\nGetManagedEndpointSessionCredentialsRequest\nGetManagedEndpointSessionCredentialsResponse\nGetManagedPrefixListAssociationsRequest\nGetManagedPrefixListAssociationsResult\nGetManagedPrefixListEntriesRequest\nGetManagedPrefixListEntriesResult\nGetManagedResourceRequest\nGetManagedResourceResponse\nGetManagedRuleSetRequest\nGetManagedRuleSetResponse\nGetManagedScalingPolicyInput\nGetManagedScalingPolicyOutput\nGetMapGlyphsRequest\nGetMapGlyphsResponse\nGetMapSpritesRequest\nGetMapSpritesResponse\nGetMapStyleDescriptorRequest\nGetMapStyleDescriptorResponse\nGetMapTileRequest\nGetMapTileResponse\nGetMappingRequest\nGetMappingResponse\nGetMasterAccountRequest\nGetMasterAccountResponse\nGetMatchIdInput\nGetMatchIdOutput\nGetMatchesRequest\nGetMatchesResponse\nGetMatchingJobInput\nGetMatchingJobOutput\nGetMatchingWorkflowInput\nGetMatchingWorkflowOutput\nGetMediaCapturePipelineRequest\nGetMediaCapturePipelineResponse\nGetMediaForFragmentListInput\nGetMediaForFragmentListOutput\nGetMediaInput\nGetMediaInsightsPipelineConfigurationRequest\nGetMediaInsightsPipelineConfigurationResponse\nGetMediaOutput\nGetMediaPipelineKinesisVideoStreamPoolRequest\nGetMediaPipelineKinesisVideoStreamPoolResponse\nGetMediaPipelineRequest\nGetMediaPipelineResponse\nGetMedicalTranscriptionJobRequest\nGetMedicalTranscriptionJobResponse\nGetMedicalVocabularyRequest\nGetMedicalVocabularyResponse\nGetMeetingRequest\nGetMeetingResponse\nGetMemberDetectorsRequest\nGetMemberDetectorsResponse\nGetMemberInput\nGetMemberOutput\nGetMemberRequest\nGetMemberResponse\nGetMembersRequest\nGetMembersResponse\nGetMembershipInput\nGetMembershipOutput\nGetMergeCommitInput\nGetMergeCommitOutput\nGetMergeConflictsInput\nGetMergeConflictsOutput\nGetMergeOptionsInput\nGetMergeOptionsOutput\nGetMessageInsightsRequest\nGetMessageInsightsResponse\nGetMessagingSessionEndpointResponse\nGetMessagingStreamingConfigurationsRequest\nGetMessagingStreamingConfigurationsResponse\nGetMetadataRequest\nGetMetadataResponse\nGetMethodRequest\nGetMethodResponseRequest\nGetMetricDataInput\nGetMetricDataOutput\nGetMetricDataRequest\nGetMetricDataResponse\nGetMetricDataV2Request\nGetMetricDataV2Response\nGetMetricPolicyInput\nGetMetricPolicyOutput\nGetMetricStatisticsInput\nGetMetricStatisticsOutput\nGetMetricStreamInput\nGetMetricStreamOutput\nGetMetricWidgetImageInput\nGetMetricWidgetImageOutput\nGetMetricsSummaryRequest\nGetMetricsSummaryResponse\nGetMigrationRequest\nGetMigrationResponse\nGetMigrationWorkflowRequest\nGetMigrationWorkflowResponse\nGetMigrationWorkflowTemplateRequest\nGetMigrationWorkflowTemplateResponse\nGetMigrationsRequest\nGetMigrationsResponse\nGetMilestoneInput\nGetMilestoneOutput\nGetMinuteUsageRequest\nGetMinuteUsageResponse\nGetMissionProfileRequest\nGetMissionProfileResponse\nGetMobileDeviceAccessEffectRequest\nGetMobileDeviceAccessEffectResponse\nGetMobileDeviceAccessOverrideRequest\nGetMobileDeviceAccessOverrideResponse\nGetMobileSdkReleaseRequest\nGetMobileSdkReleaseResponse\nGetModelCustomizationJobRequest\nGetModelCustomizationJobResponse\nGetModelInvocationLoggingConfigurationResponse\nGetModelManifestRequest\nGetModelManifestResponse\nGetModelPackageGroupPolicyInput\nGetModelPackageGroupPolicyOutput\nGetModelRequest\nGetModelResponse\nGetModelTemplateRequest\nGetModelTemplateResponse\nGetModelVersionRequest\nGetModelVersionResult\nGetModelsRequest\nGetModelsResponse\nGetModelsResult\nGetMonitorInput\nGetMonitorOutput\nGetMonitoringSubscriptionRequest\nGetMonitoringSubscriptionResult\nGetMultiRegionAccessPointPolicyRequest\nGetMultiRegionAccessPointPolicyResult\nGetMultiRegionAccessPointPolicyStatusRequest\nGetMultiRegionAccessPointPolicyStatusResult\nGetMultiRegionAccessPointRequest\nGetMultiRegionAccessPointResult\nGetMultiRegionAccessPointRoutesRequest\nGetMultiRegionAccessPointRoutesResult\nGetMulticastGroupRequest\nGetMulticastGroupResponse\nGetMulticastGroupSessionRequest\nGetMulticastGroupSessionResponse\nGetNamedQueryInput\nGetNamedQueryOutput\nGetNamespaceDeletionStatusResponse\nGetNamespaceRequest\nGetNamespaceResponse\nGetNetworkAnalyzerConfigurationRequest\nGetNetworkAnalyzerConfigurationResponse\nGetNetworkInput\nGetNetworkInsightsAccessScopeAnalysisFindingsRequest\nGetNetworkInsightsAccessScopeAnalysisFindingsResult\nGetNetworkInsightsAccessScopeContentRequest\nGetNetworkInsightsAccessScopeContentResult\nGetNetworkOutput\nGetNetworkProfileRequest\nGetNetworkProfileResponse\nGetNetworkProfileResult\nGetNetworkRequest\nGetNetworkResourceCountsRequest\nGetNetworkResourceCountsResponse\nGetNetworkResourceRelationshipsRequest\nGetNetworkResourceRelationshipsResponse\nGetNetworkResourceRequest\nGetNetworkResourceResponse\nGetNetworkResourcesRequest\nGetNetworkResourcesResponse\nGetNetworkResponse\nGetNetworkRoutesRequest\nGetNetworkRoutesResponse\nGetNetworkSettingsRequest\nGetNetworkSettingsResponse\nGetNetworkSiteRequest\nGetNetworkSiteResponse\nGetNetworkTelemetryRequest\nGetNetworkTelemetryResponse\nGetNodeInput\nGetNodeOutput\nGetNotebookMetadataInput\nGetNotebookMetadataOutput\nGetNotificationChannelResponse\nGetNotificationConfigurationRequest\nGetNotificationConfigurationResponse\nGetOTAUpdateRequest\nGetOTAUpdateResponse\nGetObjectAclOutput\nGetObjectAclRequest\nGetObjectAttributes\nGetObjectAttributesOutput\nGetObjectAttributesParts\nGetObjectAttributesRequest\nGetObjectAttributesResponse\nGetObjectInformation\nGetObjectInformationRequest\nGetObjectInformationResponse\nGetObjectLegalHoldOutput\nGetObjectLegalHoldRequest\nGetObjectLockConfigurationOutput\nGetObjectLockConfigurationRequest\nGetObjectMetadataInput\nGetObjectMetadataOutput\nGetObjectOutput\nGetObjectRequest\nGetObjectResponse\nGetObjectRetentionOutput\nGetObjectRetentionRequest\nGetObjectTaggingOutput\nGetObjectTaggingRequest\nGetObjectTorrentOutput\nGetObjectTorrentRequest\nGetOfferingStatusRequest\nGetOfferingStatusResult\nGetOnPremisesInstanceInput\nGetOnPremisesInstanceOutput\nGetOpenCypherQueryStatusInput\nGetOpenCypherQueryStatusOutput\nGetOpenIDConnectProviderRequest\nGetOpenIDConnectProviderResponse\nGetOpenIdTokenForDeveloperIdentityInput\nGetOpenIdTokenForDeveloperIdentityResponse\nGetOpenIdTokenInput\nGetOpenIdTokenResponse\nGetOperationDetailRequest\nGetOperationDetailResponse\nGetOperationInput\nGetOperationOutput\nGetOperationRequest\nGetOperationResponse\nGetOperationResult\nGetOperationsForResourceRequest\nGetOperationsForResourceResult\nGetOperationsRequest\nGetOperationsResult\nGetOpsItemRequest\nGetOpsItemResponse\nGetOpsMetadataRequest\nGetOpsMetadataResult\nGetOpsSummaryRequest\nGetOpsSummaryResult\nGetOrderInput\nGetOrderOutput\nGetOrderRequest\nGetOrderResponse\nGetOrganizationAdminAccountResponse\nGetOrganizationConfigRuleDetailedStatusRequest\nGetOrganizationConfigRuleDetailedStatusResponse\nGetOrganizationConformancePackDetailedStatusRequest\nGetOrganizationConformancePackDetailedStatusResponse\nGetOrganizationCustomRulePolicyRequest\nGetOrganizationCustomRulePolicyResponse\nGetOrganizationsAccessReportRequest\nGetOrganizationsAccessReportResponse\nGetOriginAccessControlConfigRequest\nGetOriginAccessControlConfigResult\nGetOriginAccessControlRequest\nGetOriginAccessControlResult\nGetOriginEndpointPolicyRequest\nGetOriginEndpointPolicyResponse\nGetOriginEndpointRequest\nGetOriginEndpointResponse\nGetOriginRequestPolicyConfigRequest\nGetOriginRequestPolicyConfigResult\nGetOriginRequestPolicyRequest\nGetOriginRequestPolicyResult\nGetOutcomesRequest\nGetOutcomesResult\nGetOutpostInput\nGetOutpostInstanceTypesInput\nGetOutpostInstanceTypesOutput\nGetOutpostOutput\nGetOutpostResolverRequest\nGetOutpostResolverResponse\nGetPackageConfigurationResponse\nGetPackageRequest\nGetPackageResponse\nGetPackageVersionAssetRequest\nGetPackageVersionAssetResult\nGetPackageVersionHistoryRequest\nGetPackageVersionHistoryResponse\nGetPackageVersionReadmeRequest\nGetPackageVersionReadmeResult\nGetPackageVersionRequest\nGetPackageVersionResponse\nGetParallelDataRequest\nGetParallelDataResponse\nGetParameterHistoryRequest\nGetParameterHistoryResult\nGetParameterRequest\nGetParameterResult\nGetParametersByPathRequest\nGetParametersByPathResult\nGetParametersForExportInput\nGetParametersForExportOutput\nGetParametersForImportInput\nGetParametersForImportOutput\nGetParametersForImportRequest\nGetParametersForImportResponse\nGetParametersRequest\nGetParametersResult\nGetParticipantRequest\nGetParticipantResponse\nGetPartitionIndexesRequest\nGetPartitionIndexesResponse\nGetPartitionRequest\nGetPartitionResponse\nGetPartitionsRequest\nGetPartitionsResponse\nGetPartnerAccountRequest\nGetPartnerAccountResponse\nGetPasswordDataRequest\nGetPasswordDataResult\nGetPatchBaselineForPatchGroupRequest\nGetPatchBaselineForPatchGroupResult\nGetPatchBaselineRequest\nGetPatchBaselineResult\nGetPendingJobExecutionsRequest\nGetPendingJobExecutionsResponse\nGetPercentilesRequest\nGetPercentilesResponse\nGetPerformanceAnalysisReportRequest\nGetPerformanceAnalysisReportResponse\nGetPermissionGroupRequest\nGetPermissionGroupResponse\nGetPermissionPolicyRequest\nGetPermissionPolicyResponse\nGetPermissionRequest\nGetPermissionResponse\nGetPermissionsBoundaryForPermissionSetRequest\nGetPermissionsBoundaryForPermissionSetResponse\nGetPersonTrackingRequest\nGetPersonTrackingResponse\nGetPersonalizedRankingRequest\nGetPersonalizedRankingResponse\nGetPhoneNumberOrderRequest\nGetPhoneNumberOrderResponse\nGetPhoneNumberRequest\nGetPhoneNumberResponse\nGetPhoneNumberSettingsResponse\nGetPipelineBlueprintRequest\nGetPipelineBlueprintResponse\nGetPipelineChangeProgressRequest\nGetPipelineChangeProgressResponse\nGetPipelineDefinitionInput\nGetPipelineDefinitionOutput\nGetPipelineExecutionInput\nGetPipelineExecutionOutput\nGetPipelineInput\nGetPipelineOutput\nGetPipelineRequest\nGetPipelineResponse\nGetPipelineStateInput\nGetPipelineStateOutput\nGetPlaceRequest\nGetPlaceResponse\nGetPlanRequest\nGetPlanResponse\nGetPlatformApplicationAttributesInput\nGetPlatformApplicationAttributesResponse\nGetPlaybackConfigurationRequest\nGetPlaybackConfigurationResponse\nGetPlaybackKeyPairRequest\nGetPlaybackKeyPairResponse\nGetPlayerConnectionStatusRequest\nGetPlayerConnectionStatusResult\nGetPoliciesStatsResponse\nGetPolicyInput\nGetPolicyOutput\nGetPolicyRequest\nGetPolicyResponse\nGetPolicyStoreInput\nGetPolicyStoreOutput\nGetPolicyTemplateInput\nGetPolicyTemplateOutput\nGetPolicyVersionRequest\nGetPolicyVersionResponse\nGetPortalRequest\nGetPortalResponse\nGetPortalServiceProviderMetadataRequest\nGetPortalServiceProviderMetadataResponse\nGetPortfolioPreferencesResponse\nGetPortfolioSummaryResponse\nGetPositionConfigurationRequest\nGetPositionConfigurationResponse\nGetPositionEstimateRequest\nGetPositionEstimateResponse\nGetPositionRequest\nGetPositionResponse\nGetPredictiveScalingForecastAnswer\nGetPredictiveScalingForecastType\nGetPrefetchScheduleRequest\nGetPrefetchScheduleResponse\nGetPreparedStatementInput\nGetPreparedStatementOutput\nGetPresetRequest\nGetPresetResponse\nGetPriceListFileUrlRequest\nGetPriceListFileUrlResponse\nGetPricingPlanResponse\nGetPrincipalTagAttributeMapInput\nGetPrincipalTagAttributeMapResponse\nGetProductsRequest\nGetProductsResponse\nGetProfileInput\nGetProfileObjectTypeRequest\nGetProfileObjectTypeResponse\nGetProfileObjectTypeTemplateRequest\nGetProfileObjectTypeTemplateResponse\nGetProfileOutput\nGetProfileRequest\nGetProfileResponse\nGetProfileTemplateOutput\nGetProgrammaticAccessCredentialsRequest\nGetProgrammaticAccessCredentialsResponse\nGetProjectRequest\nGetProjectResponse\nGetProjectResult\nGetPromptFileRequest\nGetPromptFileResponse\nGetPropertyValueHistoryRequest\nGetPropertyValueHistoryResponse\nGetPropertyValueRequest\nGetPropertyValueResponse\nGetPropertygraphStatisticsOutput\nGetPropertygraphStreamInput\nGetPropertygraphStreamOutput\nGetPropertygraphSummaryInput\nGetPropertygraphSummaryOutput\nGetProposalInput\nGetProposalOutput\nGetProtectedQueryInput\nGetProtectedQueryOutput\nGetProtectionStatusRequest\nGetProtectionStatusResponse\nGetProtocolsListRequest\nGetProtocolsListResponse\nGetProvisionedConcurrencyConfigRequest\nGetProvisionedConcurrencyConfigResponse\nGetProvisionedModelThroughputRequest\nGetProvisionedModelThroughputResponse\nGetProvisionedProductOutputsInput\nGetProvisionedProductOutputsOutput\nGetProxySessionRequest\nGetProxySessionResponse\nGetPublicAccessBlockOutput\nGetPublicAccessBlockRequest\nGetPublicKeyCertificateInput\nGetPublicKeyCertificateOutput\nGetPublicKeyConfigRequest\nGetPublicKeyConfigResult\nGetPublicKeyRequest\nGetPublicKeyResponse\nGetPublicKeyResult\nGetPullRequestApprovalStatesInput\nGetPullRequestApprovalStatesOutput\nGetPullRequestInput\nGetPullRequestOutput\nGetPullRequestOverrideStateInput\nGetPullRequestOverrideStateOutput\nGetPushTemplateRequest\nGetPushTemplateResponse\nGetQualificationScoreRequest\nGetQualificationScoreResponse\nGetQualificationTypeRequest\nGetQualificationTypeResponse\nGetQuantumTaskRequest\nGetQuantumTaskResponse\nGetQueryExecutionInput\nGetQueryExecutionOutput\nGetQueryLoggingConfigRequest\nGetQueryLoggingConfigResponse\nGetQueryResultsInput\nGetQueryResultsOutput\nGetQueryResultsRequest\nGetQueryResultsResponse\nGetQueryRuntimeStatisticsInput\nGetQueryRuntimeStatisticsOutput\nGetQueryStateRequest\nGetQueryStateResponse\nGetQueryStatisticsRequest\nGetQueryStatisticsResponse\nGetQuerySuggestionsRequest\nGetQuerySuggestionsResponse\nGetQueueAttributesRequest\nGetQueueAttributesResult\nGetQueueRequest\nGetQueueResponse\nGetQueueUrlRequest\nGetQueueUrlResult\nGetRDFGraphSummaryInput\nGetRDFGraphSummaryOutput\nGetRandomPasswordRequest\nGetRandomPasswordResponse\nGetRasterDataCollectionInput\nGetRasterDataCollectionOutput\nGetRateBasedRuleManagedKeysRequest\nGetRateBasedRuleManagedKeysResponse\nGetRateBasedRuleRequest\nGetRateBasedRuleResponse\nGetRateBasedStatementManagedKeysRequest\nGetRateBasedStatementManagedKeysResponse\nGetRawMessageContentRequest\nGetRawMessageContentResponse\nGetReadSetActivationJobRequest\nGetReadSetActivationJobResponse\nGetReadSetExportJobRequest\nGetReadSetExportJobResponse\nGetReadSetImportJobRequest\nGetReadSetImportJobResponse\nGetReadSetMetadataRequest\nGetReadSetMetadataResponse\nGetReadSetRequest\nGetReadSetResponse\nGetReadinessCheckRequest\nGetReadinessCheckResourceStatusRequest\nGetReadinessCheckResourceStatusResponse\nGetReadinessCheckResponse\nGetReadinessCheckStatusRequest\nGetReadinessCheckStatusResponse\nGetRealtimeLogConfigRequest\nGetRealtimeLogConfigResult\nGetRecommendationError\nGetRecommendationPreferencesRequest\nGetRecommendationPreferencesResponse\nGetRecommendationReportDetailsRequest\nGetRecommendationReportDetailsResponse\nGetRecommendationSummariesRequest\nGetRecommendationSummariesResponse\nGetRecommendationsRequest\nGetRecommendationsResponse\nGetRecommenderConfigurationRequest\nGetRecommenderConfigurationResponse\nGetRecommenderConfigurationsRequest\nGetRecommenderConfigurationsResponse\nGetRecordRequest\nGetRecordResponse\nGetRecordingConfigurationRequest\nGetRecordingConfigurationResponse\nGetRecordsInput\nGetRecordsOutput\nGetRecoveryGroupReadinessSummaryRequest\nGetRecoveryGroupReadinessSummaryResponse\nGetRecoveryGroupRequest\nGetRecoveryGroupResponse\nGetRecoveryPointRequest\nGetRecoveryPointResponse\nGetRecoveryPointRestoreMetadataInput\nGetRecoveryPointRestoreMetadataOutput\nGetReferenceImportJobRequest\nGetReferenceImportJobResponse\nGetReferenceMetadataRequest\nGetReferenceMetadataResponse\nGetReferenceRequest\nGetReferenceResponse\nGetReferenceStoreRequest\nGetReferenceStoreResponse\nGetRegexMatchSetRequest\nGetRegexMatchSetResponse\nGetRegexPatternSetRequest\nGetRegexPatternSetResponse\nGetRegionOptStatusRequest\nGetRegionOptStatusResponse\nGetRegionsRequest\nGetRegionsResult\nGetRegisterAccountStatusResponse\nGetRegistrationCodeResponse\nGetRegistryCatalogDataResponse\nGetRegistryInput\nGetRegistryPolicyResponse\nGetRegistryResponse\nGetRegistryScanningConfigurationResponse\nGetRelationalDatabaseBlueprintsRequest\nGetRelationalDatabaseBlueprintsResult\nGetRelationalDatabaseBundlesRequest\nGetRelationalDatabaseBundlesResult\nGetRelationalDatabaseEventsRequest\nGetRelationalDatabaseEventsResult\nGetRelationalDatabaseLogEventsRequest\nGetRelationalDatabaseLogEventsResult\nGetRelationalDatabaseLogStreamsRequest\nGetRelationalDatabaseLogStreamsResult\nGetRelationalDatabaseMasterUserPasswordRequest\nGetRelationalDatabaseMasterUserPasswordResult\nGetRelationalDatabaseMetricDataRequest\nGetRelationalDatabaseMetricDataResult\nGetRelationalDatabaseParametersRequest\nGetRelationalDatabaseParametersResult\nGetRelationalDatabaseRequest\nGetRelationalDatabaseResult\nGetRelationalDatabaseSnapshotRequest\nGetRelationalDatabaseSnapshotResult\nGetRelationalDatabaseSnapshotsRequest\nGetRelationalDatabaseSnapshotsResult\nGetRelationalDatabasesRequest\nGetRelationalDatabasesResult\nGetRemainingFreeTrialDaysRequest\nGetRemainingFreeTrialDaysResponse\nGetRemoteAccessSessionRequest\nGetRemoteAccessSessionResult\nGetReplicationConfigurationRequest\nGetReplicationJobsRequest\nGetReplicationJobsResponse\nGetReplicationRunsRequest\nGetReplicationRunsResponse\nGetReplicationSetInput\nGetReplicationSetOutput\nGetReportDefinitionRequest\nGetReportDefinitionResult\nGetReportGroupTrendInput\nGetReportGroupTrendOutput\nGetRepositoryCatalogDataRequest\nGetRepositoryCatalogDataResponse\nGetRepositoryEndpointRequest\nGetRepositoryEndpointResult\nGetRepositoryInput\nGetRepositoryOutput\nGetRepositoryPermissionsPolicyRequest\nGetRepositoryPermissionsPolicyResult\nGetRepositoryPolicyRequest\nGetRepositoryPolicyResponse\nGetRepositorySyncStatusInput\nGetRepositorySyncStatusOutput\nGetRepositoryTriggersInput\nGetRepositoryTriggersOutput\nGetRequestMetadata\nGetRequestValidatorRequest\nGetRequestValidatorsRequest\nGetRequestedServiceQuotaChangeRequest\nGetRequestedServiceQuotaChangeResponse\nGetReservationCoverageRequest\nGetReservationCoverageResponse\nGetReservationPurchaseRecommendationRequest\nGetReservationPurchaseRecommendationResponse\nGetReservationUtilizationRequest\nGetReservationUtilizationResponse\nGetReservedInstancesExchangeQuoteRequest\nGetReservedInstancesExchangeQuoteResult\nGetReservedNodeExchangeConfigurationOptionsInputMessage\nGetReservedNodeExchangeConfigurationOptionsOutputMessage\nGetReservedNodeExchangeOfferingsInputMessage\nGetReservedNodeExchangeOfferingsOutputMessage\nGetResolverConfigRequest\nGetResolverConfigResponse\nGetResolverDnssecConfigRequest\nGetResolverDnssecConfigResponse\nGetResolverEndpointRequest\nGetResolverEndpointResponse\nGetResolverQueryLogConfigAssociationRequest\nGetResolverQueryLogConfigAssociationResponse\nGetResolverQueryLogConfigPolicyRequest\nGetResolverQueryLogConfigPolicyResponse\nGetResolverQueryLogConfigRequest\nGetResolverQueryLogConfigResponse\nGetResolverRequest\nGetResolverResponse\nGetResolverRuleAssociationRequest\nGetResolverRuleAssociationResponse\nGetResolverRulePolicyRequest\nGetResolverRulePolicyResponse\nGetResolverRuleRequest\nGetResolverRuleResponse\nGetResourceCollectionRequest\nGetResourceCollectionResponse\nGetResourceConfigHistoryRequest\nGetResourceConfigHistoryResponse\nGetResourceDefinitionRequest\nGetResourceDefinitionResponse\nGetResourceDefinitionVersionRequest\nGetResourceDefinitionVersionResponse\nGetResourceEvaluationSummaryRequest\nGetResourceEvaluationSummaryResponse\nGetResourceEventConfigurationRequest\nGetResourceEventConfigurationResponse\nGetResourceInput\nGetResourceLFTagsRequest\nGetResourceLFTagsResponse\nGetResourceLogLevelRequest\nGetResourceLogLevelResponse\nGetResourceMetadataRequest\nGetResourceMetadataResponse\nGetResourceMetricsRequest\nGetResourceMetricsResponse\nGetResourceOutput\nGetResourcePermissionInput\nGetResourcePermissionOutput\nGetResourcePoliciesInput\nGetResourcePoliciesOutput\nGetResourcePoliciesRequest\nGetResourcePoliciesResponse\nGetResourcePoliciesResponseEntry\nGetResourcePoliciesResponseList\nGetResourcePolicyInput\nGetResourcePolicyOutput\nGetResourcePolicyRequest\nGetResourcePolicyResponse\nGetResourcePositionRequest\nGetResourcePositionResponse\nGetResourceProfileRequest\nGetResourceProfileResponse\nGetResourceRequest\nGetResourceRequestStatusInput\nGetResourceRequestStatusOutput\nGetResourceSetRequest\nGetResourceSetResponse\nGetResourceShareAssociationsRequest\nGetResourceShareAssociationsResponse\nGetResourceShareInvitationsRequest\nGetResourceShareInvitationsResponse\nGetResourceSharesRequest\nGetResourceSharesResponse\nGetResourcesInput\nGetResourcesOutput\nGetResourcesRequest\nGetResourcesResponse\nGetResourcesSummaryOutput\nGetResponseHeadersPolicyConfigRequest\nGetResponseHeadersPolicyConfigResult\nGetResponseHeadersPolicyRequest\nGetResponseHeadersPolicyResult\nGetResponsePlanInput\nGetResponsePlanOutput\nGetRestApiRequest\nGetRestApisRequest\nGetRetainedMessageRequest\nGetRetainedMessageResponse\nGetRetentionSettingsRequest\nGetRetentionSettingsResponse\nGetReusableDelegationSetLimitRequest\nGetReusableDelegationSetLimitResponse\nGetReusableDelegationSetRequest\nGetReusableDelegationSetResponse\nGetRevealConfigurationResponse\nGetRevisionRequest\nGetRevisionResponse\nGetRevocationStatusRequest\nGetRevocationStatusResponse\nGetRightsizingRecommendationRequest\nGetRightsizingRecommendationResponse\nGetRoleCredentialsRequest\nGetRoleCredentialsResponse\nGetRolePolicyRequest\nGetRolePolicyResponse\nGetRoleRequest\nGetRoleResponse\nGetRoomRequest\nGetRoomResponse\nGetRoomSkillParameterRequest\nGetRoomSkillParameterResponse\nGetRotationOverrideRequest\nGetRotationOverrideResult\nGetRotationRequest\nGetRotationResult\nGetRouteAnalysisRequest\nGetRouteAnalysisResponse\nGetRouteRequest\nGetRouteResponse\nGetRouteResponseRequest\nGetRouteResponseResponse\nGetRouteResponsesRequest\nGetRouteResponsesResponse\nGetRouteResult\nGetRoutesRequest\nGetRoutesResponse\nGetRoutingControlStateRequest\nGetRoutingControlStateResponse\nGetRuleGroupRequest\nGetRuleGroupResponse\nGetRuleRequest\nGetRuleResponse\nGetRulesRequest\nGetRulesResult\nGetRunGroupRequest\nGetRunGroupResponse\nGetRunRequest\nGetRunResponse\nGetRunResult\nGetRunTaskRequest\nGetRunTaskResponse\nGetRuntimeManagementConfigRequest\nGetRuntimeManagementConfigResponse\nGetSAMLProviderRequest\nGetSAMLProviderResponse\nGetSMSAttributesInput\nGetSMSAttributesResponse\nGetSMSSandboxAccountStatusResult\nGetSSHPublicKeyRequest\nGetSSHPublicKeyResponse\nGetSagemakerServicecatalogPortfolioStatusOutput\nGetSampleDataRequest\nGetSampleDataResponse\nGetSampledRequestsRequest\nGetSampledRequestsResponse\nGetSamplingRulesRequest\nGetSamplingRulesResult\nGetSamplingStatisticSummariesRequest\nGetSamplingStatisticSummariesResult\nGetSamplingTargetsRequest\nGetSamplingTargetsResult\nGetSatelliteRequest\nGetSatelliteResponse\nGetSavingsPlanPurchaseRecommendationDetailsRequest\nGetSavingsPlanPurchaseRecommendationDetailsResponse\nGetSavingsPlansCoverageRequest\nGetSavingsPlansCoverageResponse\nGetSavingsPlansPurchaseRecommendationRequest\nGetSavingsPlansPurchaseRecommendationResponse\nGetSavingsPlansUtilizationDetailsRequest\nGetSavingsPlansUtilizationDetailsResponse\nGetSavingsPlansUtilizationRequest\nGetSavingsPlansUtilizationResponse\nGetSbomExportRequest\nGetSbomExportResponse\nGetScalingConfigurationRecommendationRequest\nGetScalingConfigurationRecommendationResponse\nGetScalingPlanResourceForecastDataRequest\nGetScalingPlanResourceForecastDataResponse\nGetScanRequest\nGetScanResponse\nGetSceneRequest\nGetSceneResponse\nGetScheduleGroupInput\nGetScheduleGroupOutput\nGetScheduleInput\nGetScheduleOutput\nGetSchemaAnalysisRuleInput\nGetSchemaAnalysisRuleOutput\nGetSchemaAsJsonRequest\nGetSchemaAsJsonResponse\nGetSchemaByDefinitionInput\nGetSchemaByDefinitionResponse\nGetSchemaCreationStatusRequest\nGetSchemaCreationStatusResponse\nGetSchemaInput\nGetSchemaMappingInput\nGetSchemaMappingOutput\nGetSchemaOutput\nGetSchemaResponse\nGetSchemaVersionInput\nGetSchemaVersionResponse\nGetSchemaVersionsDiffInput\nGetSchemaVersionsDiffResponse\nGetScreenDataRequest\nGetScreenDataResult\nGetSdkRequest\nGetSdkTypeRequest\nGetSdkTypesRequest\nGetSearchSuggestionsRequest\nGetSearchSuggestionsResponse\nGetSecretValueRequest\nGetSecretValueResponse\nGetSecurityConfigRequest\nGetSecurityConfigResponse\nGetSecurityConfigurationRequest\nGetSecurityConfigurationResponse\nGetSecurityConfigurationsRequest\nGetSecurityConfigurationsResponse\nGetSecurityPolicyRequest\nGetSecurityPolicyResponse\nGetSegmentDetectionRequest\nGetSegmentDetectionResponse\nGetSegmentExportJobsRequest\nGetSegmentExportJobsResponse\nGetSegmentImportJobsRequest\nGetSegmentImportJobsResponse\nGetSegmentRequest\nGetSegmentResponse\nGetSegmentVersionRequest\nGetSegmentVersionResponse\nGetSegmentVersionsRequest\nGetSegmentVersionsResponse\nGetSegmentsRequest\nGetSegmentsResponse\nGetSendQuotaResponse\nGetSendStatisticsResponse\nGetSensitiveDataOccurrencesAvailabilityRequest\nGetSensitiveDataOccurrencesAvailabilityResponse\nGetSensitiveDataOccurrencesRequest\nGetSensitiveDataOccurrencesResponse\nGetSensitivityInspectionTemplateRequest\nGetSensitivityInspectionTemplateResponse\nGetSequenceStoreRequest\nGetSequenceStoreResponse\nGetSerialConsoleAccessStatusRequest\nGetSerialConsoleAccessStatusResult\nGetServerCertificateRequest\nGetServerCertificateResponse\nGetServerDetailsRequest\nGetServerDetailsResponse\nGetServerStrategiesRequest\nGetServerStrategiesResponse\nGetServersRequest\nGetServersResponse\nGetServiceEndpointRequest\nGetServiceEndpointResponse\nGetServiceGraphRequest\nGetServiceGraphResult\nGetServiceInput\nGetServiceInstanceInput\nGetServiceInstanceOutput\nGetServiceInstanceSyncStatusInput\nGetServiceInstanceSyncStatusOutput\nGetServiceLastAccessedDetailsRequest\nGetServiceLastAccessedDetailsResponse\nGetServiceLastAccessedDetailsWithEntitiesRequest\nGetServiceLastAccessedDetailsWithEntitiesResponse\nGetServiceLinkedRoleDeletionStatusRequest\nGetServiceLinkedRoleDeletionStatusResponse\nGetServiceNetworkRequest\nGetServiceNetworkResponse\nGetServiceNetworkServiceAssociationRequest\nGetServiceNetworkServiceAssociationResponse\nGetServiceNetworkVpcAssociationRequest\nGetServiceNetworkVpcAssociationResponse\nGetServiceOutput\nGetServicePrincipalNameRequest\nGetServicePrincipalNameResponse\nGetServiceProfileRequest\nGetServiceProfileResponse\nGetServiceQuotaIncreaseRequestFromTemplateRequest\nGetServiceQuotaIncreaseRequestFromTemplateResponse\nGetServiceQuotaRequest\nGetServiceQuotaResponse\nGetServiceRequest\nGetServiceResponse\nGetServiceRoleForAccountResponse\nGetServiceSettingRequest\nGetServiceSettingResult\nGetServiceSettingsResponse\nGetServiceSyncBlockerSummaryInput\nGetServiceSyncBlockerSummaryOutput\nGetServiceSyncConfigInput\nGetServiceSyncConfigOutput\nGetServiceTemplateInput\nGetServiceTemplateOutput\nGetServiceTemplateVersionInput\nGetServiceTemplateVersionOutput\nGetServicesInScopeResponse\nGetSessionEmbedUrlRequest\nGetSessionEmbedUrlResponse\nGetSessionRequest\nGetSessionResponse\nGetSessionStatusRequest\nGetSessionStatusResponse\nGetSessionTokenRequest\nGetSessionTokenResponse\nGetSettingsRequest\nGetSettingsResponse\nGetShardIteratorInput\nGetShardIteratorOutput\nGetShareRequest\nGetShareResponse\nGetSignalCatalogRequest\nGetSignalCatalogResponse\nGetSignalingChannelEndpointInput\nGetSignalingChannelEndpointOutput\nGetSignedBluinsightsUrlResponse\nGetSigningCertificateRequest\nGetSigningCertificateResponse\nGetSigningPlatformRequest\nGetSigningPlatformResponse\nGetSigningProfileRequest\nGetSigningProfileResponse\nGetSimilarProfilesRequest\nGetSimilarProfilesResponse\nGetSinkInput\nGetSinkOutput\nGetSinkPolicyInput\nGetSinkPolicyOutput\nGetSipMediaApplicationAlexaSkillConfigurationRequest\nGetSipMediaApplicationAlexaSkillConfigurationResponse\nGetSipMediaApplicationLoggingConfigurationRequest\nGetSipMediaApplicationLoggingConfigurationResponse\nGetSipMediaApplicationRequest\nGetSipMediaApplicationResponse\nGetSipRuleRequest\nGetSipRuleResponse\nGetSiteAddressInput\nGetSiteAddressOutput\nGetSiteInput\nGetSiteOutput\nGetSiteRequest\nGetSiteResponse\nGetSiteToSiteVpnAttachmentRequest\nGetSiteToSiteVpnAttachmentResponse\nGetSitesRequest\nGetSitesResponse\nGetSizeConstraintSetRequest\nGetSizeConstraintSetResponse\nGetSkillGroupRequest\nGetSkillGroupResponse\nGetSlotTypeRequest\nGetSlotTypeResponse\nGetSlotTypeVersionsRequest\nGetSlotTypeVersionsResponse\nGetSlotTypesRequest\nGetSlotTypesResponse\nGetSmsChannelRequest\nGetSmsChannelResponse\nGetSmsTemplateRequest\nGetSmsTemplateResponse\nGetSnapshotBlockRequest\nGetSnapshotBlockResponse\nGetSnapshotLimitsRequest\nGetSnapshotLimitsResult\nGetSnapshotRequest\nGetSnapshotResponse\nGetSnapshotResult\nGetSnapshotsRequest\nGetSnapshotsResponse\nGetSnowballUsageResult\nGetSoftwareUpdatesRequest\nGetSoftwareUpdatesResult\nGetSolFunctionInstanceInput\nGetSolFunctionInstanceMetadata\nGetSolFunctionInstanceOutput\nGetSolFunctionPackageContentInput\nGetSolFunctionPackageContentOutput\nGetSolFunctionPackageDescriptorInput\nGetSolFunctionPackageDescriptorOutput\nGetSolFunctionPackageInput\nGetSolFunctionPackageMetadata\nGetSolFunctionPackageOutput\nGetSolInstantiatedVnfInfo\nGetSolNetworkInstanceInput\nGetSolNetworkInstanceMetadata\nGetSolNetworkInstanceOutput\nGetSolNetworkOperationInput\nGetSolNetworkOperationMetadata\nGetSolNetworkOperationOutput\nGetSolNetworkOperationTaskDetails\nGetSolNetworkPackageContentInput\nGetSolNetworkPackageContentOutput\nGetSolNetworkPackageDescriptorInput\nGetSolNetworkPackageDescriptorOutput\nGetSolNetworkPackageInput\nGetSolNetworkPackageMetadata\nGetSolNetworkPackageOutput\nGetSolVnfInfo\nGetSolVnfcResourceInfo\nGetSolVnfcResourceInfoMetadata\nGetSolutionMetricsRequest\nGetSolutionMetricsResponse\nGetSourceApiAssociationRequest\nGetSourceApiAssociationResponse\nGetSourceRepositoryCloneUrlsRequest\nGetSourceRepositoryCloneUrlsResponse\nGetSourceRepositoryRequest\nGetSourceRepositoryResponse\nGetSpaceRequest\nGetSpaceResponse\nGetSparqlStatisticsOutput\nGetSparqlStreamInput\nGetSparqlStreamOutput\nGetSpeakerSearchTaskRequest\nGetSpeakerSearchTaskResponse\nGetSpeechSynthesisTaskInput\nGetSpeechSynthesisTaskOutput\nGetSpotPlacementScoresRequest\nGetSpotPlacementScoresResult\nGetSqlInjectionMatchSetRequest\nGetSqlInjectionMatchSetResponse\nGetStackPolicyInput\nGetStackPolicyOutput\nGetStageDeploymentRequest\nGetStageDeploymentResult\nGetStageRequest\nGetStageResponse\nGetStageResult\nGetStageSessionRequest\nGetStageSessionResponse\nGetStagesRequest\nGetStagesResponse\nGetStatementRequest\nGetStatementResponse\nGetStatementResultRequest\nGetStatementResultResponse\nGetStaticIpRequest\nGetStaticIpResult\nGetStaticIpsRequest\nGetStaticIpsResult\nGetStatisticsRequest\nGetStatisticsResponse\nGetStorageLensConfigurationRequest\nGetStorageLensConfigurationResult\nGetStorageLensConfigurationTaggingRequest\nGetStorageLensConfigurationTaggingResult\nGetStoredQueryRequest\nGetStoredQueryResponse\nGetStreamKeyRequest\nGetStreamKeyResponse\nGetStreamRequest\nGetStreamResponse\nGetStreamSessionRequest\nGetStreamSessionResponse\nGetStreamingDistributionConfigRequest\nGetStreamingDistributionConfigResult\nGetStreamingDistributionRequest\nGetStreamingDistributionResult\nGetStreamingImageRequest\nGetStreamingImageResponse\nGetStreamingSessionBackupRequest\nGetStreamingSessionBackupResponse\nGetStreamingSessionRequest\nGetStreamingSessionResponse\nGetStreamingSessionStreamRequest\nGetStreamingSessionStreamResponse\nGetStudioComponentRequest\nGetStudioComponentResponse\nGetStudioMemberRequest\nGetStudioMemberResponse\nGetStudioRequest\nGetStudioResponse\nGetStudioSessionMappingInput\nGetStudioSessionMappingOutput\nGetSubnetCidrReservationsRequest\nGetSubnetCidrReservationsResult\nGetSubscriberRequest\nGetSubscriberResponse\nGetSubscriptionAttributesInput\nGetSubscriptionAttributesResponse\nGetSubscriptionDefinitionRequest\nGetSubscriptionDefinitionResponse\nGetSubscriptionDefinitionVersionRequest\nGetSubscriptionDefinitionVersionResponse\nGetSubscriptionRequest\nGetSubscriptionResponse\nGetSubscriptionStateResponse\nGetSuiteDefinitionRequest\nGetSuiteDefinitionResponse\nGetSuiteRequest\nGetSuiteResult\nGetSuiteRunReportRequest\nGetSuiteRunReportResponse\nGetSuiteRunRequest\nGetSuiteRunResponse\nGetSupportedResourceTypesOutput\nGetSuppressedDestinationRequest\nGetSuppressedDestinationResponse\nGetSyncJobRequest\nGetSyncJobResponse\nGetSystemInstanceRequest\nGetSystemInstanceResponse\nGetSystemTemplateRequest\nGetSystemTemplateResponse\nGetSystemTemplateRevisionsRequest\nGetSystemTemplateRevisionsResponse\nGetTableMetadataInput\nGetTableMetadataOutput\nGetTableObjectsRequest\nGetTableObjectsResponse\nGetTableRequest\nGetTableResponse\nGetTableRestoreStatusRequest\nGetTableRestoreStatusResponse\nGetTableVersionRequest\nGetTableVersionResponse\nGetTableVersionsRequest\nGetTableVersionsResponse\nGetTablesRequest\nGetTablesResponse\nGetTagKeysInput\nGetTagKeysOutput\nGetTagValuesInput\nGetTagValuesOutput\nGetTagsInput\nGetTagsOutput\nGetTagsRequest\nGetTagsResponse\nGetTargetGroupRequest\nGetTargetGroupResponse\nGetTargetResourceTypeRequest\nGetTargetResourceTypeResponse\nGetTaskProtectionRequest\nGetTaskProtectionResponse\nGetTaskTemplateRequest\nGetTaskTemplateResponse\nGetTelemetryMetadataRequest\nGetTelemetryMetadataResponse\nGetTemplateGroupAccessControlEntryRequest\nGetTemplateGroupAccessControlEntryResponse\nGetTemplateInput\nGetTemplateOutput\nGetTemplateRequest\nGetTemplateResponse\nGetTemplateStepGroupRequest\nGetTemplateStepGroupResponse\nGetTemplateStepRequest\nGetTemplateStepResponse\nGetTemplateSummaryInput\nGetTemplateSummaryOutput\nGetTemplateSyncConfigInput\nGetTemplateSyncConfigOutput\nGetTemplateSyncStatusInput\nGetTemplateSyncStatusOutput\nGetTemporaryGluePartitionCredentialsRequest\nGetTemporaryGluePartitionCredentialsResponse\nGetTemporaryGlueTableCredentialsRequest\nGetTemporaryGlueTableCredentialsResponse\nGetTerminologyRequest\nGetTerminologyResponse\nGetTestExecutionArtifactsUrlRequest\nGetTestExecutionArtifactsUrlResponse\nGetTestGridProjectRequest\nGetTestGridProjectResult\nGetTestGridSessionRequest\nGetTestGridSessionResult\nGetTestRequest\nGetTestResult\nGetTextDetectionRequest\nGetTextDetectionResponse\nGetThemeRequest\nGetThemeResponse\nGetThingRuntimeConfigurationRequest\nGetThingRuntimeConfigurationResponse\nGetThingShadowRequest\nGetThingShadowResponse\nGetThirdPartyFirewallAssociationStatusRequest\nGetThirdPartyFirewallAssociationStatusResponse\nGetThirdPartyJobDetailsInput\nGetThirdPartyJobDetailsOutput\nGetThreatIntelSetRequest\nGetThreatIntelSetResponse\nGetTileInput\nGetTileOutput\nGetTimeSeriesServiceStatisticsRequest\nGetTimeSeriesServiceStatisticsResult\nGetTimelineEventInput\nGetTimelineEventOutput\nGetTokenBalanceInput\nGetTokenBalanceOutput\nGetTokenRequest\nGetTokenResponse\nGetTopicAttributesInput\nGetTopicAttributesResponse\nGetTopicRuleDestinationRequest\nGetTopicRuleDestinationResponse\nGetTopicRuleRequest\nGetTopicRuleResponse\nGetTraceGraphRequest\nGetTraceGraphResult\nGetTraceSummariesRequest\nGetTraceSummariesResult\nGetTrafficDistributionRequest\nGetTrafficDistributionResponse\nGetTrafficPolicyInstanceCountResponse\nGetTrafficPolicyInstanceRequest\nGetTrafficPolicyInstanceResponse\nGetTrafficPolicyRequest\nGetTrafficPolicyResponse\nGetTrailRequest\nGetTrailResponse\nGetTrailStatusRequest\nGetTrailStatusResponse\nGetTransactionInput\nGetTransactionOutput\nGetTranscriptRequest\nGetTranscriptResponse\nGetTranscriptionJobRequest\nGetTranscriptionJobResponse\nGetTransitGatewayAttachmentPropagationsRequest\nGetTransitGatewayAttachmentPropagationsResult\nGetTransitGatewayConnectPeerAssociationsRequest\nGetTransitGatewayConnectPeerAssociationsResponse\nGetTransitGatewayMulticastDomainAssociationsRequest\nGetTransitGatewayMulticastDomainAssociationsResult\nGetTransitGatewayPeeringRequest\nGetTransitGatewayPeeringResponse\nGetTransitGatewayPolicyTableAssociationsRequest\nGetTransitGatewayPolicyTableAssociationsResult\nGetTransitGatewayPolicyTableEntriesRequest\nGetTransitGatewayPolicyTableEntriesResult\nGetTransitGatewayPrefixListReferencesRequest\nGetTransitGatewayPrefixListReferencesResult\nGetTransitGatewayRegistrationsRequest\nGetTransitGatewayRegistrationsResponse\nGetTransitGatewayRouteTableAssociationsRequest\nGetTransitGatewayRouteTableAssociationsResult\nGetTransitGatewayRouteTableAttachmentRequest\nGetTransitGatewayRouteTableAttachmentResponse\nGetTransitGatewayRouteTablePropagationsRequest\nGetTransitGatewayRouteTablePropagationsResult\nGetTriggerRequest\nGetTriggerResponse\nGetTriggersRequest\nGetTriggersResponse\nGetTrustStoreCertificateRequest\nGetTrustStoreCertificateResponse\nGetTrustStoreRequest\nGetTrustStoreResponse\nGetTypeRequest\nGetTypeResponse\nGetTypedLinkFacetInformationRequest\nGetTypedLinkFacetInformationResponse\nGetUICustomizationRequest\nGetUICustomizationResponse\nGetUnfilteredPartitionMetadataRequest\nGetUnfilteredPartitionMetadataResponse\nGetUnfilteredPartitionsMetadataRequest\nGetUnfilteredPartitionsMetadataResponse\nGetUnfilteredTableMetadataRequest\nGetUnfilteredTableMetadataResponse\nGetUpgradeHistoryRequest\nGetUpgradeHistoryResponse\nGetUpgradeStatusRequest\nGetUpgradeStatusResponse\nGetUploadRequest\nGetUploadResult\nGetUploadStatusRequest\nGetUploadStatusResponse\nGetUsageForecastRequest\nGetUsageForecastResponse\nGetUsageLimitRequest\nGetUsageLimitResponse\nGetUsagePlanKeyRequest\nGetUsagePlanKeysRequest\nGetUsagePlanRequest\nGetUsagePlansRequest\nGetUsageRequest\nGetUsageStatisticsRequest\nGetUsageStatisticsResponse\nGetUsageTotalsRequest\nGetUsageTotalsResponse\nGetUserAccessLoggingSettingsRequest\nGetUserAccessLoggingSettingsResponse\nGetUserAttributeVerificationCodeRequest\nGetUserAttributeVerificationCodeResponse\nGetUserDefinedFunctionRequest\nGetUserDefinedFunctionResponse\nGetUserDefinedFunctionsRequest\nGetUserDefinedFunctionsResponse\nGetUserDetailsRequest\nGetUserDetailsResponse\nGetUserEndpointsRequest\nGetUserEndpointsResponse\nGetUserIdRequest\nGetUserIdResponse\nGetUserPolicyRequest\nGetUserPolicyResponse\nGetUserPoolMfaConfigRequest\nGetUserPoolMfaConfigResponse\nGetUserRequest\nGetUserResponse\nGetUserSettingsRequest\nGetUserSettingsResponse\nGetUtterancesViewRequest\nGetUtterancesViewResponse\nGetV2LoggingOptionsResponse\nGetVPCEConfigurationRequest\nGetVPCEConfigurationResult\nGetVariablesRequest\nGetVariablesResult\nGetVariantImportRequest\nGetVariantImportResponse\nGetVariantStoreRequest\nGetVariantStoreResponse\nGetVaultAccessPolicyInput\nGetVaultAccessPolicyOutput\nGetVaultLockInput\nGetVaultLockOutput\nGetVaultNotificationsInput\nGetVaultNotificationsOutput\nGetVectorEnrichmentJobInput\nGetVectorEnrichmentJobOutput\nGetVehicleRequest\nGetVehicleResponse\nGetVehicleStatusRequest\nGetVehicleStatusResponse\nGetVerifiedAccessEndpointPolicyRequest\nGetVerifiedAccessEndpointPolicyResult\nGetVerifiedAccessGroupPolicyRequest\nGetVerifiedAccessGroupPolicyResult\nGetViewInput\nGetViewOutput\nGetViolationDetailsRequest\nGetViolationDetailsResponse\nGetVirtualMachineInput\nGetVirtualMachineOutput\nGetVocabularyFilterRequest\nGetVocabularyFilterResponse\nGetVocabularyRequest\nGetVocabularyResponse\nGetVoiceChannelRequest\nGetVoiceChannelResponse\nGetVoiceConnectorEmergencyCallingConfigurationRequest\nGetVoiceConnectorEmergencyCallingConfigurationResponse\nGetVoiceConnectorGroupRequest\nGetVoiceConnectorGroupResponse\nGetVoiceConnectorLoggingConfigurationRequest\nGetVoiceConnectorLoggingConfigurationResponse\nGetVoiceConnectorOriginationRequest\nGetVoiceConnectorOriginationResponse\nGetVoiceConnectorProxyRequest\nGetVoiceConnectorProxyResponse\nGetVoiceConnectorRequest\nGetVoiceConnectorResponse\nGetVoiceConnectorStreamingConfigurationRequest\nGetVoiceConnectorStreamingConfigurationResponse\nGetVoiceConnectorTerminationHealthRequest\nGetVoiceConnectorTerminationHealthResponse\nGetVoiceConnectorTerminationRequest\nGetVoiceConnectorTerminationResponse\nGetVoiceProfileDomainRequest\nGetVoiceProfileDomainResponse\nGetVoiceProfileRequest\nGetVoiceProfileResponse\nGetVoiceTemplateRequest\nGetVoiceTemplateResponse\nGetVoiceToneAnalysisTaskRequest\nGetVoiceToneAnalysisTaskResponse\nGetVpcAttachmentRequest\nGetVpcAttachmentResponse\nGetVpcLinkRequest\nGetVpcLinkResponse\nGetVpcLinksRequest\nGetVpcLinksResponse\nGetVpnConnectionDeviceSampleConfigurationRequest\nGetVpnConnectionDeviceSampleConfigurationResult\nGetVpnConnectionDeviceTypesRequest\nGetVpnConnectionDeviceTypesResult\nGetVpnTunnelReplacementStatusRequest\nGetVpnTunnelReplacementStatusResult\nGetWebACLForResourceRequest\nGetWebACLForResourceResponse\nGetWebACLRequest\nGetWebACLResponse\nGetWebhookRequest\nGetWebhookResult\nGetWirelessDeviceImportTaskRequest\nGetWirelessDeviceImportTaskResponse\nGetWirelessDeviceRequest\nGetWirelessDeviceResponse\nGetWirelessDeviceStatisticsRequest\nGetWirelessDeviceStatisticsResponse\nGetWirelessGatewayCertificateRequest\nGetWirelessGatewayCertificateResponse\nGetWirelessGatewayFirmwareInformationRequest\nGetWirelessGatewayFirmwareInformationResponse\nGetWirelessGatewayRequest\nGetWirelessGatewayResponse\nGetWirelessGatewayStatisticsRequest\nGetWirelessGatewayStatisticsResponse\nGetWirelessGatewayTaskDefinitionRequest\nGetWirelessGatewayTaskDefinitionResponse\nGetWirelessGatewayTaskRequest\nGetWirelessGatewayTaskResponse\nGetWorkGroupInput\nGetWorkGroupOutput\nGetWorkUnitResultsRequest\nGetWorkUnitResultsResponse\nGetWorkUnitsRequest\nGetWorkUnitsResponse\nGetWorkerFleetRequest\nGetWorkerFleetResponse\nGetWorkerRequest\nGetWorkerResponse\nGetWorkflowExecutionHistoryInput\nGetWorkflowExecutionRequest\nGetWorkflowExecutionResponse\nGetWorkflowRequest\nGetWorkflowResponse\nGetWorkflowRunPropertiesRequest\nGetWorkflowRunPropertiesResponse\nGetWorkflowRunRequest\nGetWorkflowRunResponse\nGetWorkflowRunsRequest\nGetWorkflowRunsResponse\nGetWorkflowStepExecutionRequest\nGetWorkflowStepExecutionResponse\nGetWorkflowStepGroupRequest\nGetWorkflowStepGroupResponse\nGetWorkflowStepRequest\nGetWorkflowStepResponse\nGetWorkflowStepsRequest\nGetWorkflowStepsResponse\nGetWorkgroupRequest\nGetWorkgroupResponse\nGetWorkingLocationRequest\nGetWorkingLocationResponse\nGetWorkloadInput\nGetWorkloadOutput\nGetWorkspaceRequest\nGetWorkspaceResponse\nGetWorldTemplateBodyRequest\nGetWorldTemplateBodyResponse\nGetXssMatchSetRequest\nGetXssMatchSetResponse\nGid\nGitCloneDepth\nGitConfig\nGitConfigForUpdate\nGitHubAccountTokenDoesNotExistException\nGitHubAccountTokenNameRequiredException\nGitHubCodeDestination\nGitHubCommitConfigurationFieldMappings\nGitHubConfiguration\nGitHubDocumentCrawlProperties\nGitHubEnterpriseServer\nGitHubIssueAttachmentConfigurationFieldMappings\nGitHubIssueCommentConfigurationFieldMappings\nGitHubIssueDocumentConfigurationFieldMappings\nGitHubLocation\nGitHubPullRequestCommentConfigurationFieldMappings\nGitHubPullRequestDocumentAttachmentConfigurationFieldMappings\nGitHubPullRequestDocumentConfigurationFieldMappings\nGitHubRepositoryConfigurationFieldMappings\nGitSubmodulesConfig\nGivenName\nGlacierJobDescription\nGlacierJobParameters\nGlacierJobTier\nGlobal\nGlobalCluster\nGlobalClusterAlreadyExistsFault\nGlobalClusterArn\nGlobalClusterIdentifier\nGlobalClusterMember\nGlobalClusterMembers\nGlobalClusterNotFoundFault\nGlobalClusterQuotaExceededFault\nGlobalClusterResourceId\nGlobalClusters\nGlobalClustersMessage\nGlobalConfiguration\nGlobalEndpointTokenVersion\nGlobalFilters\nGlobalIdentity\nGlobalNetwork\nGlobalNetworkArn\nGlobalNetworkId\nGlobalNetworkIds\nGlobalNetworks\nGlobalNodeGroup\nGlobalNodeGroupId\nGlobalNodeGroups\nGlobalNodeGroupsToRemove\nGlobalNodeGroupsToRetain\nGlobalQuota\nGlobalReplicationGroup\nGlobalReplicationGroupAlreadyExistsFault\nGlobalReplicationGroupDescription\nGlobalReplicationGroupId\nGlobalReplicationGroupIdSuffix\nGlobalReplicationGroupInfo\nGlobalReplicationGroupMember\nGlobalReplicationGroupMemberRole\nGlobalReplicationGroupNotFoundFault\nGlobalReplicationGroups\nGlobalSecondaryIndex\nGlobalSecondaryIndexAutoScalingUpdate\nGlobalSecondaryIndexDescription\nGlobalSecondaryIndexInfo\nGlobalSecondaryIndexOverride\nGlobalSecondaryIndexUpdate\nGlobalSecondaryIndexUpdates\nGlobalSecondaryIndexes\nGlobalSettings\nGlobalSignOutRequest\nGlobalTable\nGlobalTableAlreadyExistsException\nGlobalTableArn\nGlobalTableBillingMode\nGlobalTableBorderOptions\nGlobalTableDescription\nGlobalTableGlobalSecondaryIndexSettingsUpdate\nGlobalTableName\nGlobalTableNotFoundException\nGlobalTableProvisionedWriteCapacityAutoScalingSettingsUpdate\nGlobalTableProvisionedWriteCapacityUnits\nGlobalTableStatus\nGlobalTableVersion\nGlobalTables\nGlobalTimeout\nGlobalWriteForwardingRequested\nGlobalWriteForwardingStatus\nGlueCatalogGeneration\nGlueConfiguration\nGlueConnectionName\nGlueDataCatalogConfig\nGlueDataCatalogConfiguration\nGlueDataCatalogConfigurationDescription\nGlueDataCatalogConfigurationUpdate\nGlueEncryptionException\nGlueIps\nGluePolicy\nGlueSchema\nGlueStudioSchemaColumn\nGlueTable\nGlueTableReference\nGlueVersion\nGnss\nGoneException\nGoogle\nGoogleAnalytics\nGoogleAnalyticsConnectorProfileCredentials\nGoogleAnalyticsMetadata\nGoogleAnalyticsSourceProperties\nGoogleDriveConfiguration\nGopBReference\nGopClosedCadence\nGopNumBFrames\nGopSize\nGopSizeUnits\nGovCloudAccountId\nGovernedCatalogSource\nGovernedCatalogTarget\nGpu\nGpuDeviceInfo\nGpuDeviceMemoryInfo\nGpuInfo\nGpus\nGradient\nGradientColor\nGradientOffset\nGradientStop\nGrammarSlotTypeSetting\nGrammarSlotTypeSource\nGrant\nGrantAccessRequest\nGrantAccessResult\nGrantArn\nGrantArns\nGrantConstraints\nGrantEntitlementRequest\nGrantFlowEntitlements420Exception\nGrantFlowEntitlementsRequest\nGrantFlowEntitlementsResponse\nGrantFullControl\nGrantId\nGrantLinkPermissions\nGrantListEntry\nGrantName\nGrantPermissions\nGrantPermissionsRequest\nGrantPoweruserPrivileges\nGrantRead\nGrantReadACP\nGrantStatus\nGrantTime\nGrantToken\nGrantTokens\nGrantWrite\nGrantWriteACP\nGrantedLicense\nGrantedOperations\nGrantee\nGranteeId\nGranteePrincipal\nGranteePrincipalArn\nGranteeType\nGrantor\nGrants\nGranularities\nGranularity\nGraph\nGraphArn\nGraphArns\nGraphList\nGraphQLRenderConfig\nGraphQLSchemaException\nGraphqlApi\nGreKey\nGreaterThan\nGreaterThanOrEqual\nGreaterThanOrEquals\nGreen\nGreenFleetProvisioningOption\nGreenPrimaryX\nGreenPrimaryY\nGreengrass\nGreengrassConfiguration\nGreengrassOutputDetails\nGreengrassV2\nGremlinQueryStatus\nGremlinQueryStatusAttributes\nGrid\nGridLayout\nGridLayoutCanvasSizeOptions\nGridLayoutConfiguration\nGridLayoutElement\nGridLayoutScreenCanvasSizeOptions\nGridLineVisibility\nGridViewConfiguration\nGrokClassifier\nGrokPattern\nGroundStationData\nGroundTruth\nGroundTruthManifest\nGroundTruthS3Input\nGroup\nGroupARN\nGroupArn\nGroupAttributeField\nGroupBy\nGroupByAttribute\nGroupByAttributeValue\nGroupByKey\nGroupCertificateAuthorities\nGroupCertificateAuthorityArn\nGroupCertificateAuthorityId\nGroupCertificateAuthorityProperties\nGroupConfiguration\nGroupConfigurationItem\nGroupConfigurationParameter\nGroupCount\nGroupDefinition\nGroupDefinitions\nGroupDesc\nGroupDetail\nGroupDetailList\nGroupDisplayName\nGroupExistsException\nGroupFiles\nGroupFilter\nGroupId\nGroupIdentifier\nGroupIdentifiers\nGroupIdentity\nGroupIds\nGroupInformation\nGroupIpAddress\nGroupLabelOptions\nGroupLifecycleEventsDesiredStatus\nGroupLifecycleEventsStatus\nGroupLifecycleEventsStatusMessage\nGroupList\nGroupMember\nGroupMemberList\nGroupMembers\nGroupMembership\nGroupMembershipExistenceResult\nGroupMemberships\nGroupMetadata\nGroupName\nGroupNameAndArn\nGroupNameColumn\nGroupNamePrefix\nGroupNames\nGroupOrderingIdSummaries\nGroupOrderingIdSummary\nGroupOwner\nGroupOwnerId\nGroupOwnerSetting\nGroupPermission\nGroupPolicyList\nGroupProperties\nGroupQuery\nGroupResourcesInput\nGroupResourcesOutput\nGroupResult\nGroupScore\nGroupSearchFilter\nGroupSecurityIdentifier\nGroupSize\nGroupSource\nGroupSummary\nGroupType\nGroupVersion\nGroupVersionId\nGroupedBys\nGroupedResourceCount\nGroupedResourceCounts\nGroupingAttributeNames\nGroupingSeparator\nGroupingType\nGroupings\nGroups\nGroupsSummaries\nGrowthFactor\nGrowthRate\nGrowthRateComputation\nGrowthType\nGrpcCode\nGrpcGatewayRoute\nGrpcGatewayRouteAction\nGrpcGatewayRouteMatch\nGrpcGatewayRouteMetadata\nGrpcGatewayRouteRewrite\nGrpcRetryPolicy\nGrpcRoute\nGrpcRouteAction\nGrpcRouteMatch\nGrpcRouteMetadata\nGrpcTimeout\nGsm\nGsmLocalId\nGsmNmr\nGsmNmrObj\nGsmObj\nGsmTimingAdvance\nGt\nGte\nGuardDutyFindingId\nGuardianAttributes\nGuardianOptions\nGuessMIMETypeEnabled\nGuestRoleArn\nGuidance\nGutter\nGutterSpacing\nGutterStyle\nGutterVisibility\nH264ColorSpaceSettings\nH264FilterSettings\nH264QvbrSettings\nH264Settings\nH265ColorSpaceSettings\nH265FilterSettings\nH265PackagingType\nH265QvbrSettings\nH265Settings\nHECAcknowledgmentTimeoutInSeconds\nHECEndpoint\nHECEndpointType\nHECToken\nHIT\nHITGroupId\nHITId\nHITLayoutId\nHITLayoutParameter\nHITLayoutParameters\nHITReviewPolicy\nHITReviewReport\nHITReviewStatus\nHITStatus\nHITTypeId\nHITs\nHLSFragmentSelector\nHLSStreamingSessionURL\nHLSTimestampRange\nHPOConfig\nHPOObjective\nHPOResourceConfig\nHTTPCode4XXCount\nHTTPCode5XXCount\nHTTPHeader\nHTTPMethod\nHTTPPort\nHTTPRequest\nHTTPSPort\nHTTPVersion\nHadoopJarStep\nHadoopJarStepConfig\nHadoopStepConfig\nHadoopVersion\nHammingLoss\nHandOffTime\nHandler\nHandlerFailureException\nHandlerInternalFailureException\nHandshake\nHandshakeAlreadyInStateException\nHandshakeConstraintViolationException\nHandshakeFilter\nHandshakeId\nHandshakeNotFoundException\nHandshakeParty\nHandshakeResource\nHandshakes\nHapgArn\nHapgList\nHapgSerial\nHardExpiry\nHardLimit\nHarvestJob\nHarvestJobs\nHasAdditionalSubjectAlternativeNames\nHasAssociatedService\nHasCredential\nHasCustomEventSelectors\nHasDefaultPath\nHasError\nHasErrors\nHasFault\nHasFcmServiceCredentials\nHasInsightSelectors\nHasMoreApplications\nHasMoreDeliveryStreams\nHasMoreDestinations\nHasMoreShards\nHasMoreStreams\nHasMoreTags\nHasResultSet\nHasThrottle\nHasTokenKey\nHash\nHashAlgorithm\nHashAlgorithmOptions\nHashKeyRange\nHashType\nHbbtvCompliance\nHdDeviceSettings\nHdbVersion\nHdfsNameNode\nHdr10Metadata\nHdr10Plus\nHdr10Settings\nHdrToSdrToneMapper\nHeadBucketRequest\nHeadObjectOutput\nHeadObjectRequest\nHeader\nHeaderBehavior\nHeaderConfig\nHeaderFooterSectionConfiguration\nHeaderList\nHeaderMatch\nHeaderMatchPattern\nHeaderName\nHeaderObject\nHeaderOrder\nHeaderParameters\nHeaderRow\nHeaderSections\nHeaderStyle\nHeaderValue\nHeaderValues\nHeaders\nHeadersConfig\nHeadersInBounceNotificationsEnabled\nHeadersInComplaintNotificationsEnabled\nHeadersInDeliveryNotificationsEnabled\nHeadersToInclude\nHealth\nHealthCheck\nHealthCheckAlreadyExists\nHealthCheckArn\nHealthCheckConfig\nHealthCheckConfiguration\nHealthCheckCount\nHealthCheckCustomConfig\nHealthCheckEnabled\nHealthCheckGracePeriod\nHealthCheckGracePeriodSeconds\nHealthCheckId\nHealthCheckIds\nHealthCheckInUse\nHealthCheckIntervalSeconds\nHealthCheckObservation\nHealthCheckObservations\nHealthCheckPath\nHealthCheckPolicy\nHealthCheckPort\nHealthCheckProtocol\nHealthCheckTimeoutSeconds\nHealthCheckType\nHealthCheckVersion\nHealthCheckVersionMismatch\nHealthChecks\nHealthEvent\nHealthEventArn\nHealthEventDescription\nHealthEventTypeCategory\nHealthEventTypeCode\nHealthEvents\nHealthEventsConfig\nHealthReason\nHealthScoreThreshold\nHealthService\nHealthState\nHealthStatus\nHealthThreshold\nHealthUnavailableException\nHealthUrl\nHealthyThreshold\nHealthyThresholdCount\nHeartbeatEnable\nHeartbeatEvent\nHeartbeatFrequency\nHeartbeatSchema\nHeartbeatTimeout\nHeatMapAggregatedFieldWells\nHeatMapColumnItemsLimitConfiguration\nHeatMapColumnSort\nHeatMapConfiguration\nHeatMapFieldWells\nHeatMapRowItemsLimitConfiguration\nHeatMapRowSort\nHeatMapSortConfiguration\nHeatMapVisual\nHeatmapColor\nHeatmapConfiguration\nHeight\nHeightInPx\nHeightPixels\nHeightTrim\nHelpfulResource\nHelpfulResourceDisplayText\nHelpfulResourceUrl\nHeterogeneous\nHexCode\nHexFontColor\nHibernate\nHibernationOptions\nHibernationOptionsRequest\nHibernationSupported\nHiddenColumns\nHiddenFromGlobalAddressList\nHideDisabled\nHidePassword\nHierarchicalAccessControlList\nHierarchicalPrincipal\nHierarchyGroup\nHierarchyGroupArn\nHierarchyGroupCondition\nHierarchyGroupId\nHierarchyGroupMatchType\nHierarchyGroupSummary\nHierarchyGroupSummaryReference\nHierarchyId\nHierarchyLevel\nHierarchyLevelLimitExceededException\nHierarchyLevelUpdate\nHierarchyPath\nHierarchyPathReference\nHierarchyStructure\nHierarchyStructureUpdate\nHierarchyTypeMismatchException\nHigh\nHighAction\nHighAvailabilityConfig\nHighCount\nHighestSeverityThreatDetails\nHighlight\nHighlightColor\nHighlightEnabled\nHighlighted\nHighlights\nHistogramAggregatedFieldWells\nHistogramBinOptions\nHistogramConfiguration\nHistogramEntry\nHistogramFieldWells\nHistogramVisual\nHistoricalDataPathList\nHistoricalMetric\nHistoricalMetricData\nHistoricalMetricResult\nHistoricalMetrics\nHistoricalOptions\nHistory\nHistoryData\nHistoryEvent\nHistoryEventExecutionDataDetails\nHistoryItemType\nHistoryRecord\nHistoryRecordEntry\nHistoryRecords\nHistorySummary\nHit\nHits\nHive\nHiveCompatiblePartitions\nHiveJsonSerDe\nHlsAdditionalManifest\nHlsAkamaiSettings\nHlsBasicPutSettings\nHlsCaptionLanguageMapping\nHlsCdnSettings\nHlsConfiguration\nHlsContentProtection\nHlsEncryption\nHlsEncryptionSettings\nHlsGroupSettings\nHlsId3SegmentTagging\nHlsId3SegmentTaggingScheduleActionSettings\nHlsId3SegmentTaggingSettings\nHlsImageBasedTrickPlaySettings\nHlsIngest\nHlsInputSettings\nHlsManifest\nHlsManifestCreateOrUpdateParameters\nHlsManifests\nHlsMediaStoreSettings\nHlsOutputSettings\nHlsPackage\nHlsPlaylistSettings\nHlsRenditionGroupSettings\nHlsS3Settings\nHlsSettings\nHlsSignaledSystemIds\nHlsTimedMetadataScheduleActionSettings\nHlsTimedMetadataSettings\nHlsWebdavSettings\nHoldout\nHoldoutActivity\nHoldoutPercent\nHolidayConfig\nHolidayConfigAttributes\nHomeDirectory\nHomeDirectoryMapEntry\nHomeDirectoryMappings\nHomeDirectoryType\nHomeEfsFileSystem\nHomeEfsFileSystemId\nHomeEfsFileSystemKmsKeyId\nHomeEfsFileSystemUid\nHomePageUrl\nHomePhoneNumber\nHomeRegion\nHomeRegionControl\nHomeRegionControls\nHomeRegionNotSetException\nHomeRegions\nHomogeneous\nHoneycode\nHoneycodeConnectorProfileCredentials\nHoneycodeDestinationProperties\nHoneycodeMetadata\nHonorCooldown\nHonorificPrefix\nHonorificSuffix\nHook\nHookConfiguration\nHookFailureMode\nHookInvocationCount\nHookInvocationPoint\nHookParameters\nHookStatus\nHookStatusReason\nHookType\nHooks\nHopDestination\nHopDestinations\nHorizontal\nHorizontalAccuracy\nHorizontalAlign\nHorizontalLayoutConfiguration\nHorizontalOffset\nHorizontalPosition\nHorizontalTextAlignment\nHorovod\nHost\nHostAddress\nHostArn\nHostArnFilter\nHostEntry\nHostEnvironment\nHostEnvironmentId\nHostHeaderConditionConfig\nHostHeaderConfig\nHostId\nHostIdFilter\nHostIdSet\nHostIds\nHostInstance\nHostInstanceType\nHostIp\nHostKey\nHostKeyAttributes\nHostKeyBody\nHostKeyFingerprint\nHostKeyId\nHostKeys\nHostMaintenance\nHostName\nHostNetwork\nHostOffering\nHostPath\nHostPort\nHostProperties\nHostRecovery\nHostReservation\nHostReservationId\nHostReservationIdSet\nHostReservationSet\nHostResourceGroupArn\nHostRole\nHostUrl\nHostVPCId\nHostVolumeProperties\nHostedConfigurationVersion\nHostedConfigurationVersionSummary\nHostedConfigurationVersions\nHostedZone\nHostedZoneAlreadyExists\nHostedZoneArn\nHostedZoneConfig\nHostedZoneCount\nHostedZoneId\nHostedZoneIdMarker\nHostedZoneLimit\nHostedZoneNotEmpty\nHostedZoneNotFound\nHostedZoneNotPrivate\nHostedZoneOwner\nHostedZonePartiallyDelegated\nHostedZoneSummaries\nHostedZoneSummary\nHostedZones\nHostname\nHostnameTheme\nHostnameType\nHosts\nHour\nHourOfDay\nHourlyCommitmentToPurchase\nHourlyOnDemandRate\nHourlyPrice\nHours\nHoursOfOperation\nHoursOfOperationArn\nHoursOfOperationConfig\nHoursOfOperationId\nHoursOfOperationSearchCriteria\nHoursOfOperationSearchFilter\nHoursOfOperationSummary\nHoursOfOperationSummaryList\nHoursOfOperationTimeSlice\nHoursOfOperations\nHrAllowed\nHrdBufferFinalFillPercentage\nHrdBufferInitialFillPercentage\nHrdBufferSize\nHref\nHsm\nHsmArn\nHsmCertificate\nHsmClientCertificate\nHsmClientCertificateAlreadyExistsFault\nHsmClientCertificateIdentifier\nHsmClientCertificateMessage\nHsmClientCertificateNotFoundFault\nHsmClientCertificatePublicKey\nHsmClientCertificateQuotaExceededFault\nHsmClientCertificates\nHsmConfiguration\nHsmConfigurationAlreadyExistsFault\nHsmConfigurationIdentifier\nHsmConfigurationMessage\nHsmConfigurationNotFoundFault\nHsmConfigurationQuotaExceededFault\nHsmConfigurations\nHsmId\nHsmIpAddress\nHsmList\nHsmPartitionName\nHsmPartitionPassword\nHsmSerialNumber\nHsmServerPublicCertificate\nHsmStatus\nHsmType\nHsms\nHsmsLastActionFailed\nHsmsPendingDeletion\nHsmsPendingRegistration\nHsrOperationMode\nHsrReplicationMode\nHsrTier\nHtml\nHtmlBody\nHtmlMotionGraphicsSettings\nHtmlPart\nHttp\nHttpAction\nHttpActionHeader\nHttpAuthorization\nHttpCode\nHttpConfiguration\nHttpContext\nHttpDataSourceConfig\nHttpEndpoint\nHttpEndpointBufferingHints\nHttpEndpointCommonAttribute\nHttpEndpointConfiguration\nHttpEndpointDescription\nHttpEndpointDestinationConfiguration\nHttpEndpointDestinationDescription\nHttpEndpointDestinationUpdate\nHttpEndpointEnabled\nHttpEndpointRequestConfiguration\nHttpEndpointRetryOptions\nHttpErrorCodeReturnedEquals\nHttpExpiresDate\nHttpFailureFeedbackRoleArn\nHttpGatewayRoute\nHttpGatewayRouteAction\nHttpGatewayRouteHeader\nHttpGatewayRouteMatch\nHttpGatewayRoutePathRewrite\nHttpGatewayRoutePrefixRewrite\nHttpGatewayRouteRewrite\nHttpHeader\nHttpHeaderConditionConfig\nHttpHeaderConfig\nHttpHeaderName\nHttpHeaders\nHttpInputs\nHttpInstanceSummary\nHttpMatch\nHttpMethod\nHttpName\nHttpNamespaceChange\nHttpPackageConfiguration\nHttpPackageConfigurations\nHttpParameters\nHttpPathMatch\nHttpPort\nHttpProperties\nHttpProtocolIpv6\nHttpPutResponseHopLimit\nHttpQueryParameter\nHttpRedirectCode\nHttpRequestMethodConditionConfig\nHttpRequestMethodConfig\nHttpRetryPolicy\nHttpRoute\nHttpRouteAction\nHttpRouteHeader\nHttpRouteMatch\nHttpStatus\nHttpSuccessFeedbackRoleArn\nHttpTimeout\nHttpTokens\nHttpTransferMode\nHttpURL\nHttpUrlDestinationConfiguration\nHttpUrlDestinationProperties\nHttpUrlDestinationSummary\nHttpVersion\nHttpsInputs\nHttpsNotificationConfiguration\nHttpsPort\nHubArn\nHubContentArn\nHubContentDependencies\nHubContentDependency\nHubContentDescription\nHubContentDisplayName\nHubContentDocument\nHubContentInfo\nHubContentMarkdown\nHubContentName\nHubContentSearchKeywords\nHubContentStatus\nHubContentSummaries\nHubContentType\nHubContentVersion\nHubDescription\nHubDeviceArn\nHubDisplayName\nHubInfo\nHubName\nHubS3StorageConfig\nHubSearchKeywords\nHubStatus\nHubSummaries\nHudiTarget\nHudiTargets\nHue\nHumanLabeled\nHumanLoopActivationConditions\nHumanLoopActivationConditionsConfig\nHumanLoopActivationConditionsEvaluationResults\nHumanLoopActivationConfig\nHumanLoopActivationOutput\nHumanLoopActivationReasons\nHumanLoopArn\nHumanLoopConfig\nHumanLoopDataAttributes\nHumanLoopInput\nHumanLoopName\nHumanLoopOutput\nHumanLoopQuotaExceededException\nHumanLoopRequestSource\nHumanLoopStatus\nHumanLoopSummaries\nHumanLoopSummary\nHumanTaskConfig\nHumanTaskUiArn\nHumanTaskUiName\nHumanTaskUiStatus\nHumanTaskUiSummaries\nHumanTaskUiSummary\nHwAddress\nHybridAccessEnabled\nHybridJobQueueInfo\nHyperParameterAlgorithmSpecification\nHyperParameterRanges\nHyperParameterSpecification\nHyperParameterTrainingJobDefinition\nHyperParameterTrainingJobSummary\nHyperParameterTuningEndTime\nHyperParameterTuningInstanceConfig\nHyperParameterTuningJob\nHyperParameterTuningJobArn\nHyperParameterTuningJobCompletionDetails\nHyperParameterTuningJobConfig\nHyperParameterTuningJobConsumedResources\nHyperParameterTuningJobName\nHyperParameterTuningJobObjective\nHyperParameterTuningJobSearchEntity\nHyperParameterTuningJobStatus\nHyperParameterTuningJobStrategyConfig\nHyperParameterTuningJobSummaries\nHyperParameterTuningJobSummary\nHyperParameterTuningJobWarmStartConfig\nHyperParameterTuningResourceConfig\nHyperParameters\nHyperbandStrategyConfig\nHypervisor\nHypervisorArn\nHypervisorDetails\nHypervisorId\nHypervisors\nIAMAuth\nIAMCertificateId\nIAMDatabaseAuthenticationEnabled\nIAMIdentityCenterInstanceArn\nIAMPolicyAssignment\nIAMPolicyAssignmentSummary\nIAMPolicyAssignments\nIAMRoleARN\nIAMRoleIdentity\nIAMRoleName\nIAMUser\nIAMUserIdentity\nIBMDb2Settings\nICD10CMAttribute\nICD10CMConcept\nICD10CMConcepts\nICD10CMEntity\nICD10CMTrait\nICPRecordalStatus\nID\nIDLE\nIDPCommunicationErrorException\nIDPRejectedClaimException\nIFrameOnlyManifest\nIFrameOnlyPlaylists\nIKEVersions\nIKEVersionsListValue\nIKEVersionsRequestListValue\nIND\nINDTaxDocuments\nIOOptimizedNextAllowedModificationTime\nIOPS\nIOS\nIOUsage\nIOWait\nIP\nIPAddress\nIPAddressBasedRemoteInfo\nIPAddressType\nIPAddressVersion\nIPDialIn\nIPRange\nIPRanges\nIPSet\nIPSetDescriptor\nIPSetDescriptors\nIPSetForwardedIPConfig\nIPSetId\nIPSetMetadata\nIPSetReference\nIPSetReferenceStatement\nIPSetReferences\nIPSetSummary\nIPSetUpdate\nIPSets\nIPV4Range\nIPV6Range\nIPv6Address\nIRQ\nIam\nIamActionDefinition\nIamArn\nIamArnRequiredException\nIamAuthEnabled\nIamCertificateId\nIamDatabaseAuthenticationEnabled\nIamFleetRole\nIamIdentity\nIamInstanceProfile\nIamInstanceProfileArn\nIamInstanceProfileAssociation\nIamInstanceProfileAssociations\nIamInstanceProfileSpecification\nIamRegistrationResponse\nIamResources\nIamRole\nIamRoleArn\nIamRoleConfiguration\nIamRoleId\nIamRoleMissingPermissionsFault\nIamRoleName\nIamRoleNotFoundFault\nIamRoles\nIamSessionArnAlreadyRegisteredException\nIamUser\nIamUserAccessToBilling\nIamUserArn\nIamUserArnAlreadyRegisteredException\nIamUserArnRequiredException\nIamUserArns\nIanaProtocolNumber\nIatTtL\nIbm3624NaturalPin\nIbm3624PinFromOffset\nIbm3624PinOffset\nIbm3624PinVerification\nIbm3624RandomPin\nIceServer\nIceServerList\nIcebergInput\nIcebergTarget\nIcebergTargets\nIcmpTypeCode\nIcon\nIconDisplayOption\nIconOptions\nIconReference\nIconS3Location\nIconSet\nIconSetType\nIconURL\nIconUrl\nId\nId3\nId3Insertion\nId3Insertions\nIdAttributeName\nIdFormat\nIdToken\nIdTokenValidity\nIde\nIdeConfiguration\nIdempotencyException\nIdempotencyParameterMismatchException\nIdempotencyToken\nIdempotentParameterMismatch\nIdempotentParameterMismatchException\nIdentificationExpirationDate\nIdentificationHints\nIdentificationIssuingOrg\nIdentificationNumber\nIdentifiedLanguageScore\nIdentifiedUserName\nIdentifier\nIdentifierPath\nIdentifierType\nIdentifiers\nIdentifyLanguage\nIdentifyMultipleLanguages\nIdentities\nIdentity\nIdentityAttributeName\nIdentityAttributeOrder\nIdentityAttributeValues\nIdentityDescription\nIdentityDkimAttributes\nIdentityDocument\nIdentityDocumentField\nIdentityDocumentFields\nIdentityDocuments\nIdentityId\nIdentityIdsToDelete\nIdentityInfo\nIdentityMailFromDomainAttributes\nIdentityManagementType\nIdentityName\nIdentityNotificationAttributes\nIdentityPool\nIdentityPoolConfigs\nIdentityPoolId\nIdentityPoolName\nIdentityPoolShortDescription\nIdentityPoolTags\nIdentityPoolUsage\nIdentityPoolUsages\nIdentityPools\nIdentityProvider\nIdentityProviderConfig\nIdentityProviderConfigResponse\nIdentityProviderConfiguration\nIdentityProviderDetails\nIdentityProviderName\nIdentityProviderOAuthSetting\nIdentityProviderOAuthSettings\nIdentityProviderSamlMetadata\nIdentityProviderSummaries\nIdentityProviderSummary\nIdentityProviderType\nIdentityResolutionJob\nIdentityResolutionJobsList\nIdentitySource\nIdentitySourceDetails\nIdentitySourceFilter\nIdentitySourceItem\nIdentitySourceItemDetails\nIdentityStore\nIdentityStoreId\nIdentityType\nIdentityTypeNotSupportedException\nIdentityUsage\nIdentityValidationExpression\nIdentityVerificationAttributes\nIdle\nIdleClientTimeout\nIdleDisconnectTimeoutInSeconds\nIdleSinceDateTime\nIdleTTL\nIdleTimeBetweenReadsInMs\nIdleTimeout\nIdleTimeoutSeconds\nIdnLangCode\nIdp\nIdpAuthUrl\nIdpIdentifier\nIdpIdentifiers\nIdpLambdaArn\nIdpRelayStateParameterName\nIds\nIfMatch\nIfModifiedSince\nIfNoneMatch\nIfUnmodifiedSince\nIgmpv2Support\nIgnoreCoordinates\nIgnoreErrors\nIgnoreHeaderRows\nIgnoreMetricsTime\nIgnorePollAlarmFailure\nIgnorePublicAcls\nIgnoreUnsupportedType\nIkeVersions\nIllegalActionException\nIllegalArgumentException\nIllegalBlueprintStateException\nIllegalDelete\nIllegalFieldLevelEncryptionConfigAssociationWithCacheBehavior\nIllegalOriginAccessConfiguration\nIllegalSessionStateException\nIllegalStatusException\nIllegalUpdate\nIllegalUserStateException\nIllegalWorkflowStateException\nImage\nImageAggregation\nImageAlreadyExistsException\nImageArn\nImageAssets\nImageAttribute\nImageBasedTrickPlay\nImageBasedTrickPlaySettings\nImageBlockPublicAccessState\nImageBuilder\nImageBuilderErrors\nImageBuilderName\nImageBuilderStateChangeReason\nImageBuilderSupported\nImageBuilders\nImageClassificationJobConfig\nImageConfig\nImageConfigError\nImageConfigResponse\nImageConfiguration\nImageConfigurationInput\nImageContent\nImageData\nImageDescription\nImageDetail\nImageDigest\nImageDigestDoesNotMatchException\nImageDiskContainer\nImageErrors\nImageFailure\nImageFile\nImageFrameInformation\nImageGenerationConfiguration\nImageGenerationDestinationConfig\nImageIconUrl\nImageId\nImageIdentifier\nImageIds\nImageInserter\nImageInserterInput\nImageLayerAggregation\nImageLayerAggregationResponse\nImageLocation\nImageMask\nImageName\nImageNotFoundException\nImageOwnerAlias\nImagePackage\nImagePermission\nImagePermissions\nImagePipeline\nImagePipelineAggregation\nImagePrefix\nImageProperties\nImagePublishedAt\nImagePullCredentialsType\nImageQuality\nImageRecipe\nImageRecipeSummary\nImageRecycleBinInfo\nImageReplicationStatus\nImageRepository\nImageRepositoryType\nImageResponseCard\nImageScaling\nImageScanFinding\nImageScanFindingAggregation\nImageScanFindings\nImageScanFindingsFilter\nImageScanFindingsSummary\nImageScanState\nImageScanStatus\nImageScanStatuses\nImageScanningConfiguration\nImageSelectorType\nImageSetProperties\nImageSetWorkflowStatus\nImageSetsMetadataSummary\nImageSmallIconUrl\nImageSource\nImageSourceBands\nImageState\nImageStateChangeReason\nImageStats\nImageStatus\nImageSummary\nImageTagAlreadyExistsException\nImageTagDetail\nImageTagMutability\nImageTags\nImageTestsConfiguration\nImageTooLargeException\nImageType\nImageUri\nImageUrl\nImageVersion\nImageVersionArn\nImageVersionNumber\nImageVersionStatus\nImageVersions\nImageX\nImageY\nImages\nImdsSupport\nImmediateModeScheduleActionStartSettings\nImmunityTime\nImmunityTimeProperty\nImpact\nImpactEndTime\nImpactLevel\nImpactStartTime\nImpactType\nImpactedLocation\nImpactedLocations\nImpairedSince\nImpersonationMatchedRule\nImpersonationRole\nImpersonationRoleId\nImpersonationRoleIds\nImpersonationRule\nImpersonationRuleId\nImplicitDeny\nImportApiKeysRequest\nImportApiRequest\nImportApiResponse\nImportAppCatalogRequest\nImportApplicationUsageRequest\nImportApplicationUsageResult\nImportArn\nImportAsProvisionedProductInput\nImportAsProvisionedProductOutput\nImportAssetFromApiGatewayApi\nImportAssetFromApiGatewayApiRequestDetails\nImportAssetFromApiGatewayApiResponseDetails\nImportAssetFromSignedUrl\nImportAssetFromSignedUrlJobErrorDetails\nImportAssetFromSignedUrlRequestDetails\nImportAssetFromSignedUrlResponseDetails\nImportAssetsFromLakeFormationTagPolicy\nImportAssetsFromLakeFormationTagPolicyRequestDetails\nImportAssetsFromLakeFormationTagPolicyResponseDetails\nImportAssetsFromRedshiftDataShares\nImportAssetsFromRedshiftDataSharesRequestDetails\nImportAssetsFromRedshiftDataSharesResponseDetails\nImportAssetsFromS3\nImportAssetsFromS3JobErrorDetails\nImportAssetsFromS3RequestDetails\nImportAssetsFromS3ResponseDetails\nImportBackendAuthRequest\nImportBackendAuthResponse\nImportBackendStorageRequest\nImportBackendStorageResponse\nImportCatalogToGlueRequest\nImportCertificateAuthorityCertificateRequest\nImportCertificateMessage\nImportCertificateRequest\nImportCertificateResponse\nImportClientBrandingRequest\nImportClientBrandingResult\nImportClientVpnClientCertificateRevocationListRequest\nImportClientVpnClientCertificateRevocationListResult\nImportCompleted\nImportComponentRequest\nImportComponentResponse\nImportConflictException\nImportCrlRequest\nImportDataSource\nImportDataSourceConfig\nImportDatasetRequest\nImportDatasetResponse\nImportDecoderManifestRequest\nImportDecoderManifestResponse\nImportDefinition\nImportDestination\nImportDestinationType\nImportDocumentationPartsRequest\nImportErrorData\nImportFailureListItem\nImportFileTaskInformation\nImportFilter\nImportFindingsError\nImportFirewallDomainsRequest\nImportFirewallDomainsResponse\nImportGameConfigurationRequest\nImportGameConfigurationResult\nImportGameConfigurationSource\nImportHostKeyRequest\nImportHostKeyResponse\nImportHubContentRequest\nImportHubContentResponse\nImportHypervisorConfigurationInput\nImportHypervisorConfigurationOutput\nImportId\nImportImageLicenseConfigurationRequest\nImportImageLicenseConfigurationResponse\nImportImageRequest\nImportImageResult\nImportImageTask\nImportImageTasks\nImportInfo\nImportInstance\nImportInstanceLaunchSpecification\nImportInstanceRequest\nImportInstanceResult\nImportInstanceTaskDetails\nImportInstanceVolumeDetailItem\nImportJobEndTime\nImportJobProperties\nImportJobPropertiesList\nImportJobRequest\nImportJobResource\nImportJobResponse\nImportJobStartTime\nImportJobSubmitter\nImportJobSummary\nImportJobs\nImportJobsResponse\nImportKeyInput\nImportKeyMaterialRequest\nImportKeyOutput\nImportKeyPairRequest\nImportKeyPairResult\nImportLabelsTaskRunProperties\nImportLensInput\nImportLensOutput\nImportManifestUrl\nImportMigrationTaskRequest\nImportMode\nImportModelRequest\nImportModelResponse\nImportModelVersionRequest\nImportModelVersionResponse\nImportNotFoundException\nImportNotebookInput\nImportNotebookOutput\nImportOptions\nImportPath\nImportPlaybackKeyPairRequest\nImportPlaybackKeyPairResponse\nImportReadSetFilter\nImportReadSetJobItem\nImportReadSetSourceItem\nImportReferenceFilter\nImportReferenceJobItem\nImportReferenceSourceItem\nImportResourceSpecification\nImportResourcesToDraftAppVersionRequest\nImportResourcesToDraftAppVersionResponse\nImportRestApiRequest\nImportSignalCatalogRequest\nImportSignalCatalogResponse\nImportSnapshotRequest\nImportSnapshotResult\nImportSnapshotTask\nImportSnapshotTasks\nImportSortBy\nImportSource\nImportSourceCredentialsInput\nImportSourceCredentialsOutput\nImportSshPublicKeyRequest\nImportSshPublicKeyResponse\nImportStacksToStackSetInput\nImportStacksToStackSetOutput\nImportStatistics\nImportStatus\nImportSummary\nImportSummaryList\nImportTableDescription\nImportTableInput\nImportTableOutput\nImportTablesCompleted\nImportTablesInProgress\nImportTablesNotStarted\nImportTask\nImportTaskError\nImportTaskFilter\nImportTaskId\nImportTaskIds\nImportTaskSummary\nImportTaskSummaryApplications\nImportTaskSummaryServers\nImportTaskSummaryWaves\nImportTerminologyRequest\nImportTerminologyResponse\nImportTime\nImportToken\nImportTr31KeyBlock\nImportTr34KeyBlock\nImportVmImageRequest\nImportVmImageResponse\nImportVolume\nImportVolumeRequest\nImportVolumeResult\nImportVolumeTaskDetails\nImportWorkspaceImageRequest\nImportWorkspaceImageResult\nImportance\nImported\nImportedAt\nImportedBy\nImportedDataSize\nImportedDataSizeInBytes\nImportedFileChunkSize\nImportedItemCount\nImportedRecordCount\nImportedSidewalkDevice\nImportedUsers\nImportedWirelessDevice\nImportedWirelessDeviceList\nImports\nImportsListItem\nImprovementPlan\nImprovementPlanUrl\nImprovementPlans\nImprovementStatus\nImprovementSummaries\nImprovementSummary\nImputedPath\nImscDestinationSettings\nInAppCampaignSchedule\nInAppMessage\nInAppMessageBodyConfig\nInAppMessageButton\nInAppMessageCampaign\nInAppMessageCampaigns\nInAppMessageContent\nInAppMessageHeaderConfig\nInAppMessagesResponse\nInAppStreamNames\nInAppTemplate\nInAppTemplateRequest\nInAppTemplateResponse\nInCluster\nInProgress\nInProgressInvalidationBatches\nInProgressStackInstancesCount\nInProgressTableRestoreQuotaExceededFault\nInSyncStackInstancesCount\nInTransitEncryption\nInUse\nInUseBy\nInaccessibleEncryptionDateTime\nInaccessibleKmsKeyDateTime\nInactiveDate\nInactiveEventDataStoreException\nInactiveQueryException\nInboundCall\nInboundCalling\nInboundCallsEnabled\nInboundConnection\nInboundConnectionStatus\nInboundCrossClusterSearchConnection\nInboundCrossClusterSearchConnectionStatus\nInboundHeader\nInboundMMS\nInboundPermissionAuthorizations\nInboundPermissionRevocations\nInboundPermissions\nInboundSMS\nInboundShipment\nInboxCount\nInboxPercentage\nInboxPlacementTrackingOption\nInboxRawCount\nIncidentId\nIncidentRecord\nIncidentRecordSource\nIncidentRecordSummary\nIncidentTemplate\nInclude\nIncludeAdditionalDetails\nIncludeAdditionalLanguageCodes\nIncludeAll\nIncludeAllDependencies\nIncludeAllInstances\nIncludeAllLinksToEachParent\nIncludeAllTagsOfInstance\nIncludeAttachmentFilePatterns\nIncludeBlueprint\nIncludeBody\nIncludeChannelId\nIncludeChildPaths\nIncludeComplianceDetails\nIncludeControlDetails\nIncludeCookies\nIncludeCredit\nIncludeCustomMetadata\nIncludeDeleted\nIncludeDeletedGroups\nIncludeDeletedRecords\nIncludeDeprecated\nIncludeDiscount\nIncludeDvbSubtitles\nIncludeEdges\nIncludeEncoderConfigurationInSegments\nIncludeExecutionData\nIncludeExtensions\nIncludeFec\nIncludeFillerNalUnits\nIncludeFilterTypes\nIncludeFilters\nIncludeFutureRegions\nIncludeGlobalServiceEvents\nIncludeGraph\nIncludeHeaders\nIncludeHidden\nIncludeIframeOnlyStream\nIncludeIframeOnlyStreams\nIncludeIndirectActivities\nIncludeInferenceResponseIn\nIncludeLegGeometry\nIncludeLinkedAccounts\nIncludeLinkedAccountsMetrics\nIncludeManagementEvents\nIncludeMap\nIncludeMarketplace\nIncludeMaximum\nIncludeMetrics\nIncludeMinimum\nIncludeNestedStacks\nIncludeNotScaledActivities\nIncludeNullAndEmpty\nIncludeNullValue\nIncludeOnly\nIncludeOpForFullLoad\nIncludeOtherSubscription\nIncludeParameterSpec\nIncludePartitionValue\nIncludePlannedDeletion\nIncludeProvisioningArtifactParameters\nIncludePublic\nIncludePublicKey\nIncludeQueriesWithoutUserInformation\nIncludeQuerySpellCheckSuggestions\nIncludeRecurring\nIncludeRefund\nIncludeRelated\nIncludeReturnPath\nIncludeShared\nIncludeSharedResources\nIncludeSpace\nIncludeSpaces\nIncludeStatus\nIncludeSubdomains\nIncludeSubscription\nIncludeSupport\nIncludeSymmetricAlgorithms\nIncludeTableAlterOperations\nIncludeTax\nIncludeTransactionDetails\nIncludeTrustContext\nIncludeUpfront\nIncludedAllocatedStorage\nIncludedCookies\nIncludedDeletedBackTo\nIncludedHeaders\nIncludedObjectVersions\nIncludedPages\nIncludedPaths\nIncludedProperties\nIncludedProperty\nIncludedStates\nIncludedStatistics\nIncludes\nInclusionFileNamePatterns\nInclusionFileTypePatterns\nInclusionFilters\nInclusionFolderNamePatterns\nInclusionPatterns\nInclusionPrefixes\nInclusionProtectionFilters\nInclusionProtectionGroupFilters\nInclusive\nInclusiveStartBillingPeriod\nInclusiveStartTime\nIncomingDukptAttributes\nIncomingEncryptionAttributes\nIncomingKeyIdentifier\nIncomingTranslationAttributes\nIncompatibilityMessage\nIncompatibleImageException\nIncompatibleOrderableOptions\nIncompatibleParameterError\nIncompatiblePolicyException\nIncompatibleProtocolsException\nIncompatibleRegionForMultiAZ\nIncompatibleSchemaException\nIncompatibleSettingsException\nIncompatibleVersion\nIncompatibleVersionException\nIncompleteSegmentBehavior\nInconsistentQuantities\nIncorrectCidrStateException\nIncorrectFileSystemLifeCycleState\nIncorrectKeyException\nIncorrectKeyMaterialException\nIncorrectMountTargetState\nIncorrectTrustAnchorException\nIncreaseNodeGroupsInGlobalReplicationGroupMessage\nIncreaseNodeGroupsInGlobalReplicationGroupResult\nIncreaseReplicaCountMessage\nIncreaseReplicaCountResult\nIncreaseReplicationFactorRequest\nIncreaseReplicationFactorResponse\nIncreaseStreamRetentionPeriodInput\nIncreaseVolumeSize\nIncrementalExportSpecification\nIncrementalPullConfig\nIncrementalRefresh\nIncrementalRunConfig\nIndex\nIndexArn\nIndexAttachment\nIndexAttachments\nIndexConfigurationSummary\nIndexConfigurationSummaryItems\nIndexDocument\nIndexDocumentSuffix\nIndexDocumentsRequest\nIndexDocumentsResponse\nIndexFacesModelVersion\nIndexFacesRequest\nIndexFacesResponse\nIndexField\nIndexFieldName\nIndexFieldStatus\nIndexFieldType\nIndexFields\nIndexId\nIndexNSegments\nIndexName\nIndexNotFoundException\nIndexNotReadyException\nIndexReference\nIndexRotationPeriod\nIndexSizeBytes\nIndexSlowLogs\nIndexStatistics\nIndexStatus\nIndexedAttributeMissingException\nIndexedAttributes\nIndexedQuestionAnswersCount\nIndexedTextBytes\nIndexedTextDocumentsCount\nIndexes\nIndexingFilter\nIndividualAssessmentCompletedCount\nIndividualAssessmentCount\nIndividualAssessmentName\nIndividualAssessmentNames\nIndustry\nIndustryType\nInferICD10CMRequest\nInferICD10CMResponse\nInferRxNormRequest\nInferRxNormResponse\nInferSNOMEDCTRequest\nInferSNOMEDCTResponse\nInferenceAccelerator\nInferenceAcceleratorInfo\nInferenceAcceleratorOverride\nInferenceAcceleratorOverrides\nInferenceAccelerators\nInferenceAttribute\nInferenceBenchmark\nInferenceConfig\nInferenceContainerDefinitions\nInferenceContainers\nInferenceDataImportStrategy\nInferenceDeviceInfo\nInferenceDeviceMemoryInfo\nInferenceEventSummaries\nInferenceEventSummary\nInferenceExecutionConfig\nInferenceExecutionSummaries\nInferenceExecutionSummary\nInferenceExperimentArn\nInferenceExperimentDataStorageConfig\nInferenceExperimentSchedule\nInferenceExperimentSummary\nInferenceExperiments\nInferenceId\nInferenceImage\nInferenceInputConfiguration\nInferenceInputNameConfiguration\nInferenceMetrics\nInferenceOutputConfiguration\nInferenceRecommendation\nInferenceRecommendations\nInferenceRecommendationsJob\nInferenceRecommendationsJobName\nInferenceRecommendationsJobStep\nInferenceRecommendationsJobs\nInferenceS3InputConfiguration\nInferenceS3OutputConfiguration\nInferenceSchedulerArn\nInferenceSchedulerName\nInferenceSchedulerNameBeginsWith\nInferenceSchedulerSummaries\nInferenceSchedulerSummary\nInferenceSpecification\nInferenceSpecificationName\nInferred\nInferredWorkloadSaving\nInfo\nInfoIconLabelOptions\nInfoIconText\nInfoType\nInforNexus\nInforNexusConnectorProfileCredentials\nInforNexusConnectorProfileProperties\nInforNexusSourceProperties\nInformationalCount\nInfrastructureClass\nInfrastructureConfig\nInfrastructureConfiguration\nInfrastructureConfigurationSummary\nInfrastructureType\nIngestConfiguration\nIngestEndpoint\nIngestEndpointId\nIngestEndpointUrls\nIngestEndpoints\nIngestIp\nIngestPort\nIngestedDataSize\nIngestedEventStatistics\nIngestedEventsDetail\nIngestedEventsTimeWindow\nIngestedFilesSummary\nIngestedNumberOfFiles\nIngestion\nIngestionArn\nIngestionDestination\nIngestionDestinationSummary\nIngestionId\nIngestionInputConfiguration\nIngestionJobId\nIngestionProcess\nIngestionS3InputConfiguration\nIngestionSizeInBytes\nIngestionStatus\nIngestionSummary\nIngestionTimeInSeconds\nIngestionType\nIngestions\nIngress\nIngressAccessLogs\nIngressBytes\nIngressConfiguration\nIngressFilterRules\nIngressGatewayBridge\nIngressPackets\nIngressPortMappings\nIngressRouteTable\nIngressVpcConfiguration\nInheritedValue\nInitProcessEnabled\nInitQuery\nInitialActiveLearningModelArn\nInitialAudioGain\nInitialCapacityConfig\nInitialClusterSize\nInitialConfigurationToken\nInitialContactId\nInitialDashboardId\nInitialDashboardVisualId\nInitialFileLocation\nInitialInstanceCount\nInitialMessage\nInitialNumberOfUsers\nInitialPath\nInitialPosition\nInitialResponseSetting\nInitialSamplingPercentage\nInitialTopicId\nInitialVariantWeight\nInitialVersion\nInitializationConfiguration\nInitializationVector\nInitializationVectorInManifest\nInitializeClusterRequest\nInitializeClusterResponse\nInitializedImportedDeviceCount\nInitials\nInitiateAuthRequest\nInitiateAuthResponse\nInitiateDeletionTimestamp\nInitiateDeviceClaimRequest\nInitiateDeviceClaimResponse\nInitiateDocumentVersionUploadRequest\nInitiateDocumentVersionUploadResponse\nInitiateJobInput\nInitiateJobOutput\nInitiateLayerUploadRequest\nInitiateLayerUploadResponse\nInitiateMultipartUploadInput\nInitiateMultipartUploadOutput\nInitiateVaultLockInput\nInitiateVaultLockOutput\nInitiated\nInitiatedBy\nInitiationMethod\nInitiationTimestamp\nInitiator\nInitiatorName\nInitiators\nInlineArchiveRule\nInlineChunk\nInlineChunkChecksum\nInlineChunkChecksumAlgorithm\nInlineChunkLength\nInlineConfigurations\nInlineCustomDocumentEnrichmentConfiguration\nInlineDataSchema\nInlinePolicy\nInnerHorizontal\nInnerVertical\nInput\nInputArtifact\nInputArtifacts\nInputArtifactsToRemove\nInputAttachment\nInputAttachmentName\nInputAttachmentNameReference\nInputAttachments\nInputAttributes\nInputBucket\nInputBytes\nInputCaptions\nInputChannel\nInputChannelLevel\nInputChannelLevels\nInputChannels\nInputChannelsFineTune\nInputClass\nInputClipping\nInputClippingSettings\nInputClippings\nInputColumn\nInputColumns\nInputCompressionType\nInputConfig\nInputConfigInput\nInputConfigOutput\nInputConfiguration\nInputConfigurationRequest\nInputConfigurations\nInputContent\nInputContext\nInputDataConfig\nInputDataLocationS3\nInputDecryptionSettings\nInputDefinition\nInputDescription\nInputDescriptions\nInputDestination\nInputDestinationRequest\nInputDestinationVpc\nInputDeviceConfigurableSettings\nInputDeviceHdSettings\nInputDeviceId\nInputDeviceMediaConnectConfigurableSettings\nInputDeviceMediaConnectSettings\nInputDeviceNetworkSettings\nInputDeviceRequest\nInputDeviceSettings\nInputDeviceSummary\nInputDeviceTransfers\nInputDeviceUhdSettings\nInputDevices\nInputDocumentsCount\nInputEndAction\nInputFileConfig\nInputFileLocation\nInputFileUri\nInputFilter\nInputFormat\nInputFormatConfiguration\nInputFormatOptions\nInputId\nInputIdentifier\nInputIds\nInputIp\nInputKey\nInputLambdaProcessor\nInputLambdaProcessorDescription\nInputLambdaProcessorUpdate\nInputLocation\nInputLogEvent\nInputLossAction\nInputLossBehavior\nInputLossFailoverSettings\nInputLossImageColor\nInputLossImageSlate\nInputLossImageType\nInputLossSettings\nInputLossThresholdMsec\nInputMode\nInputName\nInputOrigin\nInputParallelism\nInputParallelismUpdate\nInputParameters\nInputPartnerIds\nInputPath\nInputPathsMap\nInputPort\nInputPreference\nInputPrepareScheduleActionSettings\nInputPrepareScheduleActions\nInputPrepareSettings\nInputProcessingConfiguration\nInputProcessingConfigurationDescription\nInputProcessingConfigurationUpdate\nInputRecordTables\nInputRows\nInputS3Object\nInputS3Path\nInputScanType\nInputSchema\nInputSchemaUpdate\nInputSecurityGroup\nInputSecurityGroupId\nInputSecurityGroupIds\nInputSecurityGroups\nInputSerialization\nInputSessionStateSpecification\nInputSettings\nInputSource\nInputSourceRequest\nInputSourceType\nInputSpecification\nInputStartingPosition\nInputStartingPositionConfiguration\nInputStorageLocation\nInputSummary\nInputSwitchScheduleActionSettings\nInputSwitchSettings\nInputTemplate\nInputTimeZoneOffset\nInputTimecodeSource\nInputTransformer\nInputType\nInputUpdate\nInputUpdates\nInputVideoGenerator\nInputVpcRequest\nInputWhitelistRule\nInputWhitelistRuleCidr\nInputs\nInsecureSsl\nInsertHeaders\nInsertableImage\nInsertableImages\nInsertionMode\nInserts\nInsideCidrBlocks\nInsight\nInsightArn\nInsightArns\nInsightConfiguration\nInsightData\nInsightEvent\nInsightEvents\nInsightFeedback\nInsightHealth\nInsightId\nInsightImpactGraphEdge\nInsightImpactGraphService\nInsightNotEnabledException\nInsightResultValue\nInsightResults\nInsightRule\nInsightRuleContributor\nInsightRuleContributorDatapoint\nInsightRuleMetricDatapoint\nInsightRules\nInsightSelector\nInsightSelectors\nInsightSummaries\nInsightSummary\nInsightTimeRange\nInsightType\nInsightVisual\nInsights\nInsightsByAssessment\nInsightsConfiguration\nInsightsEnabled\nInsightsEvent\nInsightsTarget\nInspectionLevel\nInspectorScoreDetails\nInspectorServiceAttributes\nInstallOverrideList\nInstallToRemoteAccessSessionRequest\nInstallToRemoteAccessSessionResult\nInstallUpdatesOnBoot\nInstalledComponent\nInstalledCount\nInstalledOtherCount\nInstalledPendingReboot\nInstalledPendingRebootCount\nInstalledRejectedCount\nInstalledTime\nInstance\nInstanceAccess\nInstanceAccessControlAttributeConfiguration\nInstanceAccessDetails\nInstanceAccessUrl\nInstanceAggregatedAssociationOverview\nInstanceAlias\nInstanceArn\nInstanceAssociation\nInstanceAssociationOutputLocation\nInstanceAssociationOutputUrl\nInstanceAssociationStatusAggregatedCount\nInstanceAssociationStatusInfo\nInstanceAssociationStatusInfos\nInstanceAttribute\nInstanceBlockDeviceMapping\nInstanceBlockDeviceMappingSpecification\nInstanceCapacity\nInstanceClass\nInstanceCollectionType\nInstanceConfig\nInstanceConfigs\nInstanceConfiguration\nInstanceConnectEndpoint\nInstanceConnectEndpointArn\nInstanceConnectEndpointId\nInstanceConnectEndpointIds\nInstanceConnectEndpoints\nInstanceCount\nInstanceCountLimits\nInstanceCounts\nInstanceCreateTime\nInstanceCredentials\nInstanceCreditSpecification\nInstanceCreditSpecificationRequest\nInstanceCreditSpecifications\nInstanceDefinition\nInstanceDefinitions\nInstanceDetails\nInstanceDoesNotExistException\nInstanceEntry\nInstanceEventId\nInstanceEventWindow\nInstanceEventWindowAssociationRequest\nInstanceEventWindowAssociationTarget\nInstanceEventWindowDisassociationRequest\nInstanceEventWindowId\nInstanceEventWindowIds\nInstanceEventWindowState\nInstanceEventWindowStateChange\nInstanceEventWindowTimeRange\nInstanceEventWindowTimeRangeRequest\nInstanceEventWindows\nInstanceExportDetails\nInstanceFamilies\nInstanceFamily\nInstanceFamilyCreditSpecification\nInstanceFamilyId\nInstanceFleet\nInstanceFleetConfig\nInstanceFleetId\nInstanceFleetModifyConfig\nInstanceFleetProvisioningSpecifications\nInstanceFleetResizingSpecifications\nInstanceFleetStateChangeReason\nInstanceFleetStatus\nInstanceFleetTimeline\nInstanceFleetType\nInstanceFleets\nInstanceGenerations\nInstanceGroup\nInstanceGroupConfig\nInstanceGroupDetail\nInstanceGroupId\nInstanceGroupIds\nInstanceGroupModifyConfig\nInstanceGroupName\nInstanceGroupNames\nInstanceGroupStateChangeReason\nInstanceGroupStatus\nInstanceGroupTimeline\nInstanceGroupType\nInstanceGroupTypes\nInstanceGroups\nInstanceHardware\nInstanceHealth\nInstanceHealthCheckResult\nInstanceHealthList\nInstanceHealthSummary\nInstanceID\nInstanceId\nInstanceIdDetail\nInstanceIdFilter\nInstanceIdRequiredException\nInstanceIdSet\nInstanceIdentifier\nInstanceIdentity\nInstanceIds\nInstanceInfo\nInstanceInformation\nInstanceInformationFilter\nInstanceInformationFilterList\nInstanceInformationList\nInstanceInformationStringFilter\nInstanceInitiatedShutdownBehavior\nInstanceInterruptionBehavior\nInstanceIpv4Prefix\nInstanceIpv6Address\nInstanceIpv6AddressRequest\nInstanceIpv6Prefix\nInstanceLifecycle\nInstanceLimit\nInstanceLimitExceededException\nInstanceLimits\nInstanceMaintenanceOptions\nInstanceMaintenanceOptionsRequest\nInstanceMarketOptions\nInstanceMarketOptionsRequest\nInstanceMatchCriteria\nInstanceMemory\nInstanceMessages\nInstanceMetadata\nInstanceMetadataOptions\nInstanceMetadataOptionsRequest\nInstanceMetadataOptionsResponse\nInstanceMetadataServiceConfiguration\nInstanceMetadataTags\nInstanceMonitoring\nInstanceMonitorings\nInstanceName\nInstanceNameAlreadyRegisteredException\nInstanceNameRequiredException\nInstanceNetworkInterface\nInstanceNetworkInterfaceAssociation\nInstanceNetworkInterfaceAttachment\nInstanceNetworkInterfaceSpecification\nInstanceNetworking\nInstanceNotFound\nInstanceNotRegisteredException\nInstanceOSUser\nInstanceOnboardingJobStatus\nInstanceOwnerId\nInstancePatchState\nInstancePatchStateFilter\nInstancePatchStates\nInstancePlatform\nInstancePoolsToUseCount\nInstancePort\nInstancePortInfo\nInstancePortState\nInstancePrivateIpAddress\nInstanceProfile\nInstanceProfileArn\nInstanceProfileCreationTime\nInstanceProfileId\nInstanceProfileIdentifier\nInstanceProfileList\nInstanceProfileName\nInstanceProfiles\nInstanceProperty\nInstanceProtocol\nInstanceQuotaExceededFault\nInstanceRecommendation\nInstanceRecommendationOption\nInstanceRefresh\nInstanceRefreshId\nInstanceRefreshIds\nInstanceRefreshInProgressFault\nInstanceRefreshLivePoolProgress\nInstanceRefreshProgressDetails\nInstanceRefreshWarmPoolProgress\nInstanceRefreshes\nInstanceRequestCount\nInstanceRequirements\nInstanceRequirementsRequest\nInstanceRequirementsWithMetadata\nInstanceRequirementsWithMetadataRequest\nInstanceResizePolicy\nInstanceReusePolicy\nInstanceRole\nInstanceRoleArn\nInstanceRunningCount\nInstanceSize\nInstanceSizingType\nInstanceSnapshot\nInstanceSnapshotInfo\nInstanceSpecification\nInstanceState\nInstanceStateChange\nInstanceStateChangeReason\nInstanceStates\nInstanceStatus\nInstanceStatusDetails\nInstanceStatusEvent\nInstanceStatusReason\nInstanceStatusSummary\nInstanceStatuses\nInstanceStorageConfig\nInstanceStorageInfo\nInstanceStorageSupported\nInstanceSummaries\nInstanceSummary\nInstanceSummaryList\nInstanceTagAttribute\nInstanceTagKeys\nInstanceTagNotificationAttribute\nInstanceTags\nInstanceTarget\nInstanceTenancy\nInstanceTerminationTimeout\nInstanceTimeline\nInstanceType\nInstanceTypeConfig\nInstanceTypeConfigs\nInstanceTypeDetails\nInstanceTypeInfo\nInstanceTypeInfoFromInstanceRequirements\nInstanceTypeItem\nInstanceTypeOffering\nInstanceTypeOfferings\nInstanceTypeSpecification\nInstanceTypeSpecifications\nInstanceTypes\nInstanceUsage\nInstanceUsages\nInstanceUserSummaries\nInstanceUserSummary\nInstanceVcpu\nInstanceWarmup\nInstances\nInstancesCount\nInstancesDistribution\nInstancesHealth\nInstancesRevision\nInstancesToProtect\nInstancesToTerminate\nInstancesToUpdate\nInstancesToUpdateOnRollback\nInstancesWithCriticalNonCompliantPatches\nInstancesWithFailedPatches\nInstancesWithInstalledOtherPatches\nInstancesWithInstalledPatches\nInstancesWithInstalledPendingRebootPatches\nInstancesWithInstalledRejectedPatches\nInstancesWithMissingPatches\nInstancesWithNotApplicablePatches\nInstancesWithOtherNonCompliantPatches\nInstancesWithSecurityNonCompliantPatches\nInstancesWithUnreportedNotApplicablePatches\nInstantBooking\nInstantiateSolNetworkInstanceInput\nInstantiateSolNetworkInstanceOutput\nInstructions\nInsufficientAvailableIPsInSubnetFault\nInsufficientCacheClusterCapacityFault\nInsufficientCapabilitiesException\nInsufficientCapacityException\nInsufficientCloudWatchLogsResourcePolicy\nInsufficientClusterCapacityFault\nInsufficientDBClusterCapacityFault\nInsufficientDBInstanceCapacityFault\nInsufficientDataActions\nInsufficientDataHealthStatus\nInsufficientDeliveryPolicyException\nInsufficientDependencyServiceAccessPermissionException\nInsufficientEncryptionPolicyException\nInsufficientPermissionsException\nInsufficientPrivilegesException\nInsufficientResourceCapacityFault\nInsufficientS3BucketPolicyException\nInsufficientS3BucketPolicyFault\nInsufficientSensorData\nInsufficientSnsTopicPolicyException\nInsufficientStorageClusterCapacityFault\nInsufficientThroughputCapacity\nIntArrayOptions\nIntOptions\nIntValueMax\nIntValueMin\nIntegerDatasetParameter\nIntegerDatasetParameterDefaultValues\nIntegerDefaultValues\nIntegerHyperParameterRange\nIntegerParameter\nIntegerParameterDeclaration\nIntegerParameterRange\nIntegerParameterRangeSpecification\nIntegerParameterRanges\nIntegerParameters\nIntegerRange\nIntegerStaticValues\nIntegerValue\nIntegerValueWhenUnsetConfiguration\nIntegerValues\nIntegrateServices\nIntegration\nIntegrationArn\nIntegrationAssociationArn\nIntegrationAssociationId\nIntegrationAssociationSummary\nIntegrationAssociationSummaryList\nIntegrationConfig\nIntegrationId\nIntegrationMethod\nIntegrationResponse\nIntegrationResponseId\nIntegrationResponseKey\nIntegrationResponseSelectionExpression\nIntegrationResultS3DestinationArn\nIntegrationSubtype\nIntegrationType\nIntegrationTypes\nIntegrationUri\nIntegrations\nIntelligentTieringAndOperator\nIntelligentTieringConfiguration\nIntelligentTieringConfigurationList\nIntelligentTieringFilter\nIntendedUse\nIntent\nIntentClassificationTestResultItem\nIntentClassificationTestResultItemCounts\nIntentClassificationTestResults\nIntentClosingSetting\nIntentConfidence\nIntentConfirmationSetting\nIntentFilter\nIntentLevelSlotResolutionTestResultItem\nIntentLevelSlotResolutionTestResults\nIntentMetadata\nIntentOverride\nIntentResultEvent\nIntentSortBy\nIntentStatistics\nIntentSummary\nInterMetricImpactDetails\nInterMetricImpactList\nInteractive\nInteractiveLayoutConfiguration\nIntercluster\nInterconnect\nInterconnects\nInterface\nInterfaceAssociation\nInterfaceAssociations\nInterfacePermission\nInterfaceProtocol\nInterfaceRequest\nInterfaceType\nInterlaceMode\nInterlaced\nInternalDependencyException\nInternalError\nInternalErrorException\nInternalException\nInternalFailure\nInternalFailureException\nInternalServerError\nInternalServerErrorException\nInternalServerException\nInternalServiceError\nInternalServiceErrorException\nInternalServiceException\nInternalServiceFault\nInternalStreamFailure\nInternalUserDatabaseEnabled\nInternetGateway\nInternetGatewayAttachment\nInternetGatewayId\nInternetGatewayIds\nInternetGatewayRoutes\nInternetGateways\nInternetHealth\nInternetKeyExchangeVersion\nInternetMeasurementsLogDelivery\nInteroperabilityEnabled\nInterpolated\nInterpolatedAssetPropertyValue\nInterpolationParameters\nInterpolationValue\nInterpretation\nInterruptionFilter\nInterval\nIntervalCadence\nIntervalEndTime\nIntervalInSeconds\nIntervalStartTime\nIntervalUnit\nIntraDcPrecision\nInvalidACLStateFault\nInvalidARNFault\nInvalidAccessException\nInvalidAccountStatusException\nInvalidActionDeclarationException\nInvalidActivation\nInvalidActivationId\nInvalidActorArnException\nInvalidAddressException\nInvalidAggregationException\nInvalidAggregatorException\nInvalidAlarmConfigException\nInvalidAliasNameException\nInvalidAllowedPatternException\nInvalidApplicationConfigurationException\nInvalidApplicationNameException\nInvalidApprovalRuleContentException\nInvalidApprovalRuleNameException\nInvalidApprovalRuleTemplateContentException\nInvalidApprovalRuleTemplateDescriptionException\nInvalidApprovalRuleTemplateNameException\nInvalidApprovalStateException\nInvalidApprovalTokenException\nInvalidArgsException\nInvalidArgument\nInvalidArgumentException\nInvalidArn\nInvalidArnException\nInvalidAssociation\nInvalidAssociationVersion\nInvalidAttachmentException\nInvalidAuthenticationCodeException\nInvalidAuthenticationProfileRequestFault\nInvalidAuthorArnException\nInvalidAuthorizationMessageException\nInvalidAuthorizationStateFault\nInvalidAutoRollbackConfigException\nInvalidAutoScalingGroupException\nInvalidAutomationExecutionParametersException\nInvalidAutomationSignalException\nInvalidAutomationStatusUpdateException\nInvalidBatchEntryIdException\nInvalidBlobIdException\nInvalidBlockerDeclarationException\nInvalidBlueGreenDeploymentConfigurationException\nInvalidBlueGreenDeploymentStateFault\nInvalidBranchNameException\nInvalidBucketNameFilterException\nInvalidCacheClusterStateFault\nInvalidCacheParameterGroupStateFault\nInvalidCacheSecurityGroupStateFault\nInvalidCampaignStateException\nInvalidCertificateAuthorityException\nInvalidCertificateException\nInvalidCertificateFault\nInvalidChangeBatch\nInvalidChangeSetStatusException\nInvalidChannelARN\nInvalidCiphertextException\nInvalidClientAuthStatusException\nInvalidClientException\nInvalidClientMetadataException\nInvalidClientRequestTokenException\nInvalidClientTokenException\nInvalidCloudWatchDestinationException\nInvalidCloudWatchLogsLogGroupArnException\nInvalidCloudWatchLogsRoleArnException\nInvalidClusterParameterGroupStateFault\nInvalidClusterSecurityGroupStateFault\nInvalidClusterSnapshotScheduleStateFault\nInvalidClusterSnapshotStateFault\nInvalidClusterStateFault\nInvalidClusterSubnetGroupStateFault\nInvalidClusterSubnetStateFault\nInvalidClusterTrackFault\nInvalidCodeSignatureException\nInvalidCodecPrivateDataException\nInvalidCommentIdException\nInvalidCommentOperationException\nInvalidCommitException\nInvalidCommitIdException\nInvalidComputePlatformException\nInvalidConfigurationDetail\nInvalidConfigurationException\nInvalidConfigurationRecorderNameException\nInvalidConfigurationRequestException\nInvalidConfigurationSetException\nInvalidConflictDetailLevelException\nInvalidConflictResolutionException\nInvalidConflictResolutionStrategyException\nInvalidContactFlowException\nInvalidContactFlowModuleException\nInvalidContentLocation\nInvalidContinuationTokenException\nInvalidCredentialsException\nInvalidCrossAccountRoleException\nInvalidCustomDBEngineVersionStateFault\nInvalidCustomSesConfigurationException\nInvalidCustomerIdentifierException\nInvalidDBClusterAutomatedBackupStateFault\nInvalidDBClusterCapacityFault\nInvalidDBClusterEndpointStateFault\nInvalidDBClusterSnapshotStateFault\nInvalidDBClusterStateFault\nInvalidDBInstanceAutomatedBackupStateFault\nInvalidDBInstanceStateFault\nInvalidDBParameterGroupStateFault\nInvalidDBProxyEndpointStateFault\nInvalidDBProxyStateFault\nInvalidDBSecurityGroupStateFault\nInvalidDBSnapshotStateFault\nInvalidDBSubnetGroupFault\nInvalidDBSubnetGroupStateFault\nInvalidDBSubnetStateFault\nInvalidDataRepositoryType\nInvalidDataShareFault\nInvalidDateEntries\nInvalidDateRangeException\nInvalidDefaultRootObject\nInvalidDefinition\nInvalidDeleteInventoryParametersException\nInvalidDeletionIdException\nInvalidDeletionParameterException\nInvalidDeliveryChannelNameException\nInvalidDeliveryOptionsException\nInvalidDeployedStateFilterException\nInvalidDeploymentConfigNameException\nInvalidDeploymentGroupNameException\nInvalidDeploymentIdException\nInvalidDeploymentInstanceTypeException\nInvalidDeploymentStatusException\nInvalidDeploymentStyleException\nInvalidDeploymentTargetIdException\nInvalidDeploymentWaitTypeException\nInvalidDescriptionException\nInvalidDestinationCommitSpecifierException\nInvalidDestinationKmsKey\nInvalidDeviceException\nInvalidDocument\nInvalidDocumentContent\nInvalidDocumentOperation\nInvalidDocumentSchemaVersion\nInvalidDocumentType\nInvalidDocumentVersion\nInvalidDomainName\nInvalidDomainNameForOriginAccessControl\nInvalidDomainValidationOptionsException\nInvalidEC2TagCombinationException\nInvalidEC2TagException\nInvalidECSServiceException\nInvalidElasticIpFault\nInvalidEmailException\nInvalidEmailRoleAccessPolicyException\nInvalidEncodingException\nInvalidEndPointException\nInvalidEndpointException\nInvalidEndpointRegionException\nInvalidEndpointStateFault\nInvalidErrorCode\nInvalidEventCategoryException\nInvalidEventDataStoreCategoryException\nInvalidEventDataStoreStatusException\nInvalidEventPatternException\nInvalidEventSelectorsException\nInvalidEventSubscriptionStateFault\nInvalidExecutionInput\nInvalidExportOnlyFault\nInvalidExportPath\nInvalidExportSourceStateFault\nInvalidExportTaskStateFault\nInvalidExportTimeException\nInvalidExpressionException\nInvalidExternalIdException\nInvalidFacetUpdateException\nInvalidFallbackBehavior\nInvalidFileExistsBehaviorException\nInvalidFileLocationException\nInvalidFileModeException\nInvalidFilePositionException\nInvalidFilter\nInvalidFilterException\nInvalidFilterOption\nInvalidFilterValue\nInvalidFirehoseDestinationException\nInvalidFleetStatusException\nInvalidFormatFault\nInvalidForwardCookies\nInvalidFunctionAssociation\nInvalidGameSessionStatusException\nInvalidGatewayRequestException\nInvalidGeoRestrictionParameter\nInvalidGitHubAccountTokenException\nInvalidGitHubAccountTokenNameException\nInvalidGlobalClusterStateFault\nInvalidGlobalReplicationGroupStateFault\nInvalidGrantException\nInvalidGrantIdException\nInvalidGrantTokenException\nInvalidHandshakeTransitionException\nInvalidHeadersForS3Origin\nInvalidHomeRegionException\nInvalidHsmClientCertificateStateFault\nInvalidHsmConfigurationStateFault\nInvalidIamSessionArnException\nInvalidIamUserArnException\nInvalidIdentityPoolConfigurationException\nInvalidIdentityTokenException\nInvalidIfMatchVersion\nInvalidIgnoreApplicationStopFailuresValueException\nInvalidImageFormatException\nInvalidImportPath\nInvalidImportSourceException\nInvalidImportTokenException\nInvalidInput\nInvalidInputCombinationException\nInvalidInputException\nInvalidInputRecords\nInvalidInsightSelectorsException\nInvalidInstanceId\nInvalidInstanceInformationFilterValue\nInvalidInstanceNameException\nInvalidInstanceStatusException\nInvalidInstanceTypeException\nInvalidInventoryGroupException\nInvalidInventoryItemContextException\nInvalidInventoryRequestException\nInvalidItemContentException\nInvalidJobException\nInvalidJobIdException\nInvalidJobStateException\nInvalidKMSArn\nInvalidKMSKeyException\nInvalidKMSKeyFault\nInvalidKMSResourceException\nInvalidKeyId\nInvalidKeyPrefixFilterException\nInvalidKeySigningKeyName\nInvalidKeySigningKeyStatus\nInvalidKeyUsageException\nInvalidKmsKeyIdException\nInvalidLDAPSStatusException\nInvalidLabels\nInvalidLambdaFunctionAssociation\nInvalidLambdaFunctionException\nInvalidLambdaFunctionOutputException\nInvalidLambdaResponseException\nInvalidLayerException\nInvalidLayerPartException\nInvalidLexiconException\nInvalidLifecycleEventHookExecutionIdException\nInvalidLifecycleEventHookExecutionStatusException\nInvalidLimitException\nInvalidLoadBalancerActionException\nInvalidLoadBalancerInfoException\nInvalidLocationCode\nInvalidLoggingConfiguration\nInvalidLookupAttributesException\nInvalidMarkerException\nInvalidMaxConflictFilesException\nInvalidMaxMergeHunksException\nInvalidMaxResultsException\nInvalidMediaFrameException\nInvalidMergeOptionException\nInvalidMinimumHealthyHostValueException\nInvalidMinimumProtocolVersion\nInvalidName\nInvalidNamespaceFault\nInvalidNetworkInterface\nInvalidNetworkSettings\nInvalidNextToken\nInvalidNextTokenException\nInvalidNodeException\nInvalidNodeStateFault\nInvalidNonceException\nInvalidNotificationConfig\nInvalidNumericDataException\nInvalidOAuthFlowException\nInvalidObjectState\nInvalidOnPremisesTagCombinationException\nInvalidOperationException\nInvalidOperationFault\nInvalidOptionException\nInvalidOptionGroupStateFault\nInvalidOrderException\nInvalidOrigin\nInvalidOriginAccessControl\nInvalidOriginAccessIdentity\nInvalidOriginKeepaliveTimeout\nInvalidOriginReadTimeout\nInvalidOutput\nInvalidOverrideStatusException\nInvalidPaginationException\nInvalidPaginationToken\nInvalidPaginationTokenException\nInvalidParameter\nInvalidParameterCombinationException\nInvalidParameterDetail\nInvalidParameterException\nInvalidParameterGroupStateFault\nInvalidParameterValueException\nInvalidParameterValuesException\nInvalidParameters\nInvalidParametersException\nInvalidParentCommitIdException\nInvalidPasswordException\nInvalidPathException\nInvalidPerUnitStorageThroughput\nInvalidPermissionType\nInvalidPolicyAttributeException\nInvalidPolicyDocument\nInvalidPolicyException\nInvalidPolicyRevisionIdException\nInvalidPolicyTypeException\nInvalidPortRangeException\nInvalidProductCodeException\nInvalidProtocolSettings\nInvalidPublicKeyException\nInvalidPublicKeyVersionException\nInvalidPullRequestEventTypeException\nInvalidPullRequestIdException\nInvalidPullRequestStatusException\nInvalidPullRequestStatusUpdateException\nInvalidQueryException\nInvalidQueryStatementException\nInvalidQueryStatusException\nInvalidQueryStringParameters\nInvalidReactionUserArnException\nInvalidReactionValueException\nInvalidRecordCount\nInvalidRecordingGroupException\nInvalidReferenceNameException\nInvalidRegion\nInvalidRegionException\nInvalidRegistrationStatusException\nInvalidRelativeFileVersionEnumException\nInvalidRelativePath\nInvalidRenderingParameterException\nInvalidReplacementContentException\nInvalidReplacementTypeException\nInvalidReplicationGroupStateFault\nInvalidRepositoryDescriptionException\nInvalidRepositoryNameException\nInvalidRepositoryTriggerBranchNameException\nInvalidRepositoryTriggerCustomDataException\nInvalidRepositoryTriggerDestinationArnException\nInvalidRepositoryTriggerEventsException\nInvalidRepositoryTriggerNameException\nInvalidRepositoryTriggerRegionException\nInvalidRequestContentException\nInvalidRequestDetail\nInvalidRequestException\nInvalidRequiredProtocol\nInvalidReservedNodeStateFault\nInvalidResourceArnException\nInvalidResourceException\nInvalidResourceFormatException\nInvalidResourcePolicyException\nInvalidResourceStateException\nInvalidResourceStateFault\nInvalidResourceTypeException\nInvalidResponseCode\nInvalidResponseException\nInvalidRestoreFault\nInvalidRestoreTimeException\nInvalidResultAttributeException\nInvalidResultTokenException\nInvalidRetentionPeriodFault\nInvalidRevisionException\nInvalidRevisionIdException\nInvalidRole\nInvalidRoleException\nInvalidRouteTableId\nInvalidRuleContentSha256Exception\nInvalidRuleException\nInvalidRuntimeException\nInvalidS3BucketException\nInvalidS3BucketFault\nInvalidS3BucketNameException\nInvalidS3BucketNameFault\nInvalidS3ConfigurationException\nInvalidS3KeyException\nInvalidS3KeyPrefixException\nInvalidS3KeyPrefixFault\nInvalidS3KmsKeyArnException\nInvalidS3ObjectException\nInvalidS3PrefixException\nInvalidSNSDestinationException\nInvalidSNSTopicARNException\nInvalidSampleRateException\nInvalidSchedule\nInvalidScheduleFault\nInvalidScheduledActionFault\nInvalidSchemaDocException\nInvalidSchemeException\nInvalidScopeException\nInvalidSecretsManagerResourceException\nInvalidSecurityException\nInvalidSecurityGroupException\nInvalidSecurityGroupIDException\nInvalidSecurityGroupId\nInvalidSensorData\nInvalidSequenceTokenException\nInvalidServiceLinkedRoleStateException\nInvalidServiceRoleException\nInvalidSessionException\nInvalidSignal\nInvalidSignalDecoder\nInvalidSignalsException\nInvalidSigningStatus\nInvalidSmsRoleAccessPolicyException\nInvalidSmsRoleTrustRelationshipException\nInvalidSnapshotCopyGrantStateFault\nInvalidSnapshotStateFault\nInvalidSnsTopicArnException\nInvalidSnsTopicException\nInvalidSnsTopicNameException\nInvalidSortByException\nInvalidSortOrderException\nInvalidSourceCommitSpecifierException\nInvalidSourceException\nInvalidSourceKmsKey\nInvalidSsmlException\nInvalidStageDeclarationException\nInvalidStateException\nInvalidStateTransitionException\nInvalidStructureException\nInvalidSubnet\nInvalidSubnetException\nInvalidSubnetIDException\nInvalidSubnetId\nInvalidSubscriptionStateFault\nInvalidSystemTagUsageException\nInvalidTTLOrder\nInvalidTableRestoreArgumentFault\nInvalidTag\nInvalidTagException\nInvalidTagFault\nInvalidTagFilterException\nInvalidTagKeysListException\nInvalidTagParameterException\nInvalidTagging\nInvalidTaggingRequestException\nInvalidTagsException\nInvalidTagsMapException\nInvalidTagsToAddException\nInvalidTarget\nInvalidTargetBranchException\nInvalidTargetException\nInvalidTargetFilterNameException\nInvalidTargetGroupPairException\nInvalidTargetInstancesException\nInvalidTargetMaps\nInvalidTargetsException\nInvalidTaskIdException\nInvalidTemplateException\nInvalidTimeRangeException\nInvalidTitleException\nInvalidToken\nInvalidTokenException\nInvalidTracingConfiguration\nInvalidTrackingOptionsException\nInvalidTrafficPolicyDocument\nInvalidTrafficRoutingConfigurationException\nInvalidTrailNameException\nInvalidTriggerConfigException\nInvalidTypeException\nInvalidTypeNameException\nInvalidUpdate\nInvalidUpdateOutdatedInstancesOnlyValueException\nInvalidUsageAllocationsException\nInvalidUsageDimensionException\nInvalidUsageLimitFault\nInvalidUserGroupStateFault\nInvalidUserList\nInvalidUserPoolConfigurationException\nInvalidUserStateFault\nInvalidUserStatusException\nInvalidUserTypeException\nInvalidVPCId\nInvalidVPCNetworkStateFault\nInvalidValues\nInvalidVersionNumberException\nInvalidViewerCertificate\nInvalidWebACLId\nInvalidWebhookAuthenticationParametersException\nInvalidWebhookFilterPatternException\nInvalidZipFileException\nInvalidateProjectCacheInput\nInvalidation\nInvalidationBatch\nInvalidationList\nInvalidationSummary\nInventoryAggregator\nInventoryConfiguration\nInventoryConfigurationList\nInventoryData\nInventoryDeletionStatusItem\nInventoryDeletionSummary\nInventoryDeletionSummaryItem\nInventoryDeletions\nInventoryDestination\nInventoryEncryption\nInventoryFilter\nInventoryGroup\nInventoryItem\nInventoryItemAttribute\nInventoryItemSchema\nInventoryResultEntity\nInventoryResultItem\nInventoryRetrievalJobDescription\nInventoryRetrievalJobInput\nInventoryRetrievalParameters\nInventoryS3BucketDestination\nInventorySchedule\nInventorySizeInBytes\nInverse\nInverted\nInvisibleFieldInfo\nInvisibleFields\nInvitation\nInvitationId\nInvitationType\nInvitations\nInvitationsCount\nInvite\nInviteAccountToOrganizationRequest\nInviteAccountToOrganizationResponse\nInviteAction\nInviteId\nInviteMembersRequest\nInviteMembersResponse\nInviteMessageTemplate\nInviteUsersRequest\nInviteUsersResponse\nInvitedAt\nInvitedBy\nInvitedOn\nInvitedTime\nInviteePrincipalId\nInvites\nInvocationCondition\nInvocationEndTime\nInvocationEndpoint\nInvocationHttpParameters\nInvocationId\nInvocationPhrase\nInvocationPoint\nInvocationRateLimitPerSecond\nInvocationRequest\nInvocationResponse\nInvocationRole\nInvocationStartTime\nInvocationTime\nInvocationTimeoutSeconds\nInvocationType\nInvocationsMaxRetries\nInvocationsPerInstance\nInvocationsTimeoutInSeconds\nInvoiceId\nInvokeArgs\nInvokeAsyncRequest\nInvokeAsyncResponse\nInvokeDeviceMethodRequest\nInvokeDeviceMethodResponse\nInvokeEndpointAsyncInput\nInvokeEndpointAsyncOutput\nInvokeEndpointInput\nInvokeEndpointOutput\nInvokeEndpointWithResponseStreamInput\nInvokeEndpointWithResponseStreamOutput\nInvokeMode\nInvokeModelRequest\nInvokeModelResponse\nInvokeModelWithResponseStreamRequest\nInvokeModelWithResponseStreamResponse\nInvokeResponseStreamUpdate\nInvokeScreenAutomationRequest\nInvokeScreenAutomationResult\nInvokeWithResponseStreamCompleteEvent\nInvokeWithResponseStreamRequest\nInvokeWithResponseStreamResponse\nInvokedBy\nInvokedIntentSample\nInvokedProductionVariant\nIoPerformance\nIoTJobAbortConfig\nIoTJobAbortCriteria\nIoTJobExecutionsRolloutConfig\nIoTJobExponentialRolloutRate\nIoTJobRateIncreaseCriteria\nIoTJobTimeoutConfig\nIonBinary\nIonText\nIops\nIopsOther\nIopsRead\nIopsToStorageRatio\nIopsTotal\nIopsWrite\nIosClientBrandingAttributes\nIosImportClientBrandingAttributes\nIotAnalyticsAction\nIotCertificateId\nIotEventsAction\nIotEventsDestinationConfiguration\nIotEventsInputIdentifier\nIotJobArn\nIotJobId\nIotRoleAlias\nIotSiteWiseAction\nIotSiteWiseAssetModelPropertyIdentifier\nIotSiteWiseCustomerManagedDatastoreS3Storage\nIotSiteWiseCustomerManagedDatastoreS3StorageSummary\nIotSiteWiseInputIdentifier\nIotThingName\nIotTopicPublishAction\nIp\nIpAccessSettings\nIpAccessSettingsSummary\nIpAddress\nIpAddressCount\nIpAddressDetails\nIpAddressFamily\nIpAddressInUse\nIpAddressRequest\nIpAddressResponse\nIpAddressType\nIpAddressUpdate\nIpAddressV4\nIpAddresses\nIpCity\nIpCountry\nIpDiscovery\nIpFamily\nIpFilter\nIpGeoLocation\nIpId\nIpOrganizationDetails\nIpOwner\nIpOwnerId\nIpPermission\nIpPermissions\nIpPermissionsEgress\nIpProtocol\nIpRange\nIpRanges\nIpRestrictionRuleMap\nIpRoute\nIpRouteInfo\nIpRouteLimitExceededException\nIpRouteStatusMsg\nIpRouteStatusReason\nIpRoutes\nIpRoutesInfo\nIpRule\nIpRuleItem\nIpScheme\nIpSet\nIpSetId\nIpSetIds\nIpSets\nIpUsage\nIpV4Addresses\nIpV4Cidr\nIpV4CidrBlock\nIpV6Address\nIpV6Addresses\nIpV6Cidr\nIpam\nIpamAddressHistoryRecord\nIpamArn\nIpamCidrAuthorizationContext\nIpamDiscoveredAccount\nIpamDiscoveredAccounts\nIpamDiscoveredResourceCidr\nIpamDiscoveredResourceCidrs\nIpamDiscoveryFailureReason\nIpamId\nIpamIds\nIpamOperatingRegion\nIpamPool\nIpamPoolAllocation\nIpamPoolAllocationId\nIpamPoolAllocations\nIpamPoolArn\nIpamPoolCidr\nIpamPoolCidrFailureReason\nIpamPoolCidrId\nIpamPoolCidrs\nIpamPoolId\nIpamPoolIds\nIpamPoolOwner\nIpamPools\nIpamRegion\nIpamResourceCidr\nIpamResourceCidrs\nIpamResourceDiscoveries\nIpamResourceDiscovery\nIpamResourceDiscoveryArn\nIpamResourceDiscoveryAssociation\nIpamResourceDiscoveryAssociationArn\nIpamResourceDiscoveryAssociationId\nIpamResourceDiscoveryAssociationIds\nIpamResourceDiscoveryAssociations\nIpamResourceDiscoveryId\nIpamResourceDiscoveryIds\nIpamResourceDiscoveryRegion\nIpamResourceTag\nIpamScope\nIpamScopeArn\nIpamScopeId\nIpamScopeIds\nIpamScopeType\nIpamScopes\nIpams\nIpcMode\nIps\nIpv4\nIpv4Address\nIpv4AddressesPerInterface\nIpv4IpamPoolId\nIpv4NetmaskLength\nIpv4Prefix\nIpv4PrefixCount\nIpv4PrefixSpecification\nIpv4PrefixSpecificationRequest\nIpv4PrefixSpecificationResponse\nIpv4Prefixes\nIpv6\nIpv6Address\nIpv6AddressCount\nIpv6Addresses\nIpv6AddressesPerInterface\nIpv6Cidr\nIpv6CidrAssociation\nIpv6CidrAssociations\nIpv6CidrBlock\nIpv6CidrBlockAssociation\nIpv6CidrBlockAssociationSet\nIpv6CidrBlockNetworkBorderGroup\nIpv6CidrBlockSet\nIpv6CidrBlockState\nIpv6IpamPoolId\nIpv6Native\nIpv6NetmaskLength\nIpv6Pool\nIpv6Pools\nIpv6Prefix\nIpv6PrefixCount\nIpv6PrefixSpecification\nIpv6PrefixSpecificationRequest\nIpv6PrefixSpecificationResponse\nIpv6Prefixes\nIpv6Range\nIpv6Ranges\nIpv6Support\nIpv6Supported\nIrreversibleInstanceRefreshFault\nIs64BitsOnly\nIsActivated\nIsAdvancedManagedRuleSet\nIsAlexaForBusinessEnabled\nIsAnomalous\nIsAnomaly\nIsApplicable\nIsArchived\nIsAttachable\nIsAuthorizedInput\nIsAuthorizedOutput\nIsAuthorizedWithTokenInput\nIsAuthorizedWithTokenOutput\nIsAutoPredictor\nIsBatchStatement\nIsBinaryFile\nIsCaller\nIsClusterWriter\nIsCollection\nIsCritical\nIsDataLossAllowed\nIsDataPartial\nIsDefault\nIsDefaultAction\nIsDefaultConfiguration\nIsDefaultVersion\nIsEgress\nIsEmpty\nIsEnabled\nIsEncrypted\nIsEnd\nIsEssential\nIsGlobal\nIsIPV6Enabled\nIsImmutable\nIsInSandbox\nIsIncludedInTopic\nIsIndirectActivity\nIsLatest\nIsLatestPatch\nIsLatestVersion\nIsLocalTime\nIsLogging\nIsLoggingEnabled\nIsLongTermPricingAutoRenew\nIsMajorVersion\nIsMajorVersionUpgrade\nIsMaster\nIsMemberInGroupsRequest\nIsMemberInGroupsResponse\nIsMfaDeleteEnabled\nIsMiddlebox\nIsModifiable\nIsMultiRegionTrail\nIsNegOne\nIsNewProvisioningAvailable\nIsNoEcho\nIsNullString\nIsOptional\nIsOrganizationTrail\nIsOwned\nIsParent\nIsPartial\nIsPaused\nIsPermanentRestore\nIsPrimary\nIsPrimaryIpv6\nIsPublic\nIsPubliclyAccessible\nIsRegisteredWithLakeFormation\nIsRequestable\nIsRequired\nIsRestoreInProgress\nIsRestricted\nIsReviewOwnerUpdateAcknowledged\nIsRouteTableUsedInDifferentAZ\nIsSuccess\nIsTerminal\nIsTestDomain\nIsTruncated\nIsTunable\nIsUnique\nIsUnstructured\nIsValidExchange\nIsValueSecret\nIsVerifiedAuthor\nIsVersioningSupported\nIsVpcPeeredResult\nIsWifiEnabled\nIsWriter\nIscsi\nIso2CountryCode\nIsoCountryCode\nIsolationMode\nIsp\nIspName\nIspPlacement\nIspPlacements\nIssue\nIssueCertificateRequest\nIssueCertificateResponse\nIssueDetected\nIssueDetectionConfiguration\nIssueFieldMappings\nIssueInfoMap\nIssueSubEntityFilter\nIssueType\nIssuedAt\nIssuer\nIssuerCertificateIdentifier\nIssuerDetails\nIssues\nIssuesDetected\nIssuingAccount\nItem\nItemClassFilter\nItemCollectionKey\nItemCollectionMetrics\nItemCollectionSizeLimitExceededException\nItemContentHash\nItemContentMismatchException\nItemCount\nItemIdentifier\nItemIdentifierAttributeName\nItemResponse\nItemSizeLimitExceededException\nItemSource\nItemStatus\nItemizedMetricStats\nItemizedMetricStatsList\nItems\nItemsLimit\nItemsLimitConfiguration\nIvInManifest\nIvSource\nJA3Fingerprint\nJDBCConnectorOptions\nJDBCConnectorSource\nJDBCConnectorTarget\nJSON\nJSONInput\nJSONMappingParameters\nJSONOutput\nJSONString\nJWTConfiguration\nJamSyncTime\nJapaneseTokenizationDictionary\nJar\nJdbc\nJdbcTarget\nJdbcTargets\nJiraAccountUrl\nJiraConfiguration\nJiraParameters\nJmxExporter\nJmxExporterInfo\nJob\nJobAlbumArt\nJobArn\nJobBookmark\nJobBookmarkEntry\nJobBookmarkKeys\nJobBookmarkKeysSortOrder\nJobBookmarksEncryption\nJobBookmarksEncryptionMode\nJobCheckpointConfig\nJobCommand\nJobCompletionDate\nJobCompletionReportURI\nJobConfig\nJobConfiguration\nJobCreationDate\nJobData\nJobDefinition\nJobDefinitionArn\nJobDefinitionName\nJobDefinitionSummaries\nJobDependency\nJobDescription\nJobDescriptor\nJobDetail\nJobDetails\nJobDriver\nJobDurationInSeconds\nJobEndTime\nJobEntry\nJobError\nJobEventDetails\nJobExecution\nJobExecutionSettings\nJobExecutionState\nJobExecutionStatusDetails\nJobExecutionSummary\nJobExecutionSummaryForJob\nJobExecutionSummaryForThing\nJobExecutionsRetryConfig\nJobExecutionsRolloutConfig\nJobExpirationTime\nJobFailure\nJobFailureLogURI\nJobFilter\nJobFlowDetail\nJobFlowExecutionStatusDetail\nJobFlowId\nJobFlowIds\nJobFlowInstancesConfig\nJobFlowInstancesDetail\nJobFlowRole\nJobFlowStates\nJobFlows\nJobId\nJobIds\nJobInput\nJobList\nJobListDescriptor\nJobListEntries\nJobListEntry\nJobLog\nJobLogEventData\nJobLogInfo\nJobLogs\nJobManifest\nJobManifestGeneratorFilter\nJobManifestLocation\nJobManifestSpec\nJobMessages\nJobMetadata\nJobMetrics\nJobName\nJobNameContains\nJobNames\nJobNodeDetails\nJobNotFoundException\nJobOperation\nJobOutput\nJobOutputDataConfig\nJobOutputPath\nJobParameters\nJobPercentComplete\nJobPlanDescription\nJobPostLaunchActionsLaunchStatus\nJobProcessDetails\nJobProgress\nJobProgressSummary\nJobQueueDetail\nJobReferenceCode\nJobReferenceCodeContains\nJobReport\nJobResource\nJobResourceTags\nJobResources\nJobRun\nJobRunId\nJobRunIds\nJobRunState\nJobRunSummary\nJobRuns\nJobSample\nJobSchedule\nJobScheduleFrequency\nJobScopeTerm\nJobScopingBlock\nJobSettings\nJobStartTime\nJobState\nJobStatesToNotify\nJobStats\nJobStatus\nJobStatusDetails\nJobStatusException\nJobStatuses\nJobStoppingCondition\nJobSuccessLogURI\nJobSummaries\nJobSummary\nJobTag\nJobTags\nJobTemplate\nJobTemplateData\nJobTemplateSettings\nJobTemplateSummary\nJobTemplates\nJobTimeout\nJobTimers\nJobTitle\nJobType\nJobUpdate\nJobWatermark\nJobWorkerExecutorConfiguration\nJobs\nJobsNotFound\nJoin\nJoinColumn\nJoinDomainInput\nJoinDomainOutput\nJoinEui\nJoinEuiFilters\nJoinEventConfiguration\nJoinInstruction\nJoinKeyProperties\nJoinResourceTypeEventConfiguration\nJoinSource\nJoinStorageSessionInput\nJoinToken\nJoinType\nJoinedMethod\nJoinedTimestamp\nJournalKinesisStreamDescription\nJournalS3ExportDescription\nJournalS3Exports\nJourneyActivityId\nJourneyChannelSettings\nJourneyCustomMessage\nJourneyDateRangeKpiResponse\nJourneyEmailMessage\nJourneyExecutionActivityMetricsResponse\nJourneyExecutionMetricsResponse\nJourneyId\nJourneyLimits\nJourneyPushMessage\nJourneyResponse\nJourneyRunExecutionActivityMetricsResponse\nJourneyRunExecutionMetricsResponse\nJourneyRunResponse\nJourneyRunsResponse\nJourneySMSMessage\nJourneySchedule\nJourneyStateRequest\nJourneyTimeframeCap\nJourneysResponse\nJson\nJsonBody\nJsonClassifier\nJsonContentTypes\nJsonFormatDescriptor\nJsonFormatRef\nJsonMatchPattern\nJsonOptions\nJsonPath\nJsonTokenTypeConfiguration\nJunctionPath\nJupyterServerAppSettings\nJwksUri\nJwtConfiguration\nJwtTokenTypeConfiguration\nKBId\nKGKeyPairIds\nKMSAccessDeniedException\nKMSAccessDeniedFault\nKMSArn\nKMSContext\nKMSDisabledException\nKMSDisabledFault\nKMSEncrypted\nKMSEncryptionConfig\nKMSEncryptionContext\nKMSFault\nKMSInternalException\nKMSInvalidKeyUsageException\nKMSInvalidMacException\nKMSInvalidSignatureException\nKMSInvalidStateException\nKMSInvalidStateFault\nKMSKey\nKMSKeyArn\nKMSKeyDetails\nKMSKeyID\nKMSKeyId\nKMSKeyNotAccessibleFault\nKMSMasterKeyArn\nKMSMasterKeyID\nKMSMasterKeyId\nKMSNotFoundException\nKMSNotFoundFault\nKMSOptInRequired\nKMSRequestFailedException\nKMSServerSideEncryption\nKMSServerSideEncryptionIntegration\nKMSServerSideEncryptionIntegrationConfig\nKMSThrottlingException\nKMSThrottlingFault\nKPIActualValueConditionalFormatting\nKPIComparisonValueConditionalFormatting\nKPIConditionalFormatting\nKPIConditionalFormattingOption\nKPIConfiguration\nKPIFieldWells\nKPIOptions\nKPIPrimaryValueConditionalFormatting\nKPIProgressBarConditionalFormatting\nKPISortConfiguration\nKPISparklineOptions\nKPIVisual\nKPIVisualLayoutOptions\nKPIVisualStandardLayout\nKVSStreamStartSelector\nKafkaAction\nKafkaActionHeader\nKafkaBrokerNodeId\nKafkaCluster\nKafkaClusterClientAuthentication\nKafkaClusterClientAuthenticationDescription\nKafkaClusterDescription\nKafkaClusterEncryptionInTransit\nKafkaClusterEncryptionInTransitDescription\nKafkaSettings\nKafkaStreamingSourceOptions\nKafkaVersion\nKafkaVersions\nKantarLicenseId\nKantarServerUrl\nKantarWatermark\nKantarWatermarkSettings\nKbNumber\nKdcAdminPassword\nKeepAlivePeriodInSeconds\nKeepJobFlowAliveWhenNoSteps\nKeepSegments\nKendraConfiguration\nKerberosAttributes\nKerberosKeytab\nKerberosKrb5Conf\nKerberosPrincipal\nKernel\nKernelCapabilities\nKernelGatewayAppSettings\nKernelGatewayImageConfig\nKernelId\nKernelSpec\nKernelSpecs\nKey\nKeyARN\nKeyAgreement\nKeyAlgorithm\nKeyArn\nKeyAttributes\nKeyBlockFormat\nKeyCertSign\nKeyCertificate\nKeyCertificateChain\nKeyCheckValue\nKeyCheckValueAlgorithm\nKeyClass\nKeyConditionExpression\nKeyConditions\nKeyCount\nKeyDetection\nKeyEncipherment\nKeyEncryptionAlgorithm\nKeyFingerprint\nKeyFormat\nKeyFormatVersions\nKeyGroup\nKeyGroupAlreadyExists\nKeyGroupConfig\nKeyGroupId\nKeyGroupList\nKeyGroupSummary\nKeyId\nKeyIdentifier\nKeyLabels\nKeyLength\nKeyListEntry\nKeyLocation\nKeyManagementServiceArn\nKeyManager\nKeyMarker\nKeyMaterial\nKeyMaterialType\nKeyMd5\nKeyMetadata\nKeyModesOfUse\nKeyName\nKeyNames\nKeyOrigin\nKeyPair\nKeyPairId\nKeyPairIds\nKeyPairInfo\nKeyPairMismatchException\nKeyPairSpec\nKeyPairs\nKeyPath\nKeyPattern\nKeyPhrase\nKeyPhrases\nKeyPhrasesDetectionJobFilter\nKeyPhrasesDetectionJobProperties\nKeyPhrasesDetectionJobPropertiesList\nKeyPrefix\nKeyPrefixEquals\nKeyPrefixes\nKeyProviderServer\nKeyProviderSettings\nKeyRange\nKeyRotationEnabled\nKeyRotationIntervalSeconds\nKeyRotationStatus\nKeySchema\nKeySchemaElement\nKeySerialNumber\nKeySigningKey\nKeySigningKeyAlreadyExists\nKeySigningKeyInParentDSRecord\nKeySigningKeyInUse\nKeySigningKeyWithActiveStatusNotFound\nKeySigningKeys\nKeySpec\nKeyState\nKeyStatus\nKeyStoragePolicy\nKeyStorageSecurityStandard\nKeyStorePassword\nKeySummary\nKeyTag\nKeyType\nKeyUnavailableException\nKeyUsage\nKeyUsageFlags\nKeyUsageProperty\nKeyUsagePropertyFlags\nKeyUsages\nKeyValue\nKeyValuePair\nKeyValuesPair\nKeyframesMaxDist\nKeys\nKeysAndAttributes\nKeysToDelete\nKeysWithNoncompliantValues\nKeyspaceSummary\nKeyword\nKeywordAction\nKeywordFilter\nKeywordInformation\nKeywordMatchConfiguration\nKeywordMessage\nKeywords\nKinesisAction\nKinesisConfiguration\nKinesisDataFirehose\nKinesisDataStream\nKinesisDataStreamDestination\nKinesisDataStreamDestinations\nKinesisDataStreamSinkConfiguration\nKinesisFirehoseConfig\nKinesisFirehoseDestination\nKinesisFirehoseDestinationDetails\nKinesisFirehoseDetails\nKinesisFirehoseInput\nKinesisFirehoseInputDescription\nKinesisFirehoseInputUpdate\nKinesisFirehoseOutput\nKinesisFirehoseOutputDescription\nKinesisFirehoseOutputUpdate\nKinesisParameters\nKinesisSettings\nKinesisStreamARN\nKinesisStreamConfig\nKinesisStreamName\nKinesisStreamParameters\nKinesisStreamSourceConfiguration\nKinesisStreamSourceDescription\nKinesisStreamingDestinationInput\nKinesisStreamingDestinationOutput\nKinesisStreamingSourceOptions\nKinesisStreamsInput\nKinesisStreamsInputDescription\nKinesisStreamsInputUpdate\nKinesisStreamsOutput\nKinesisStreamsOutputDescription\nKinesisStreamsOutputUpdate\nKinesisVideoStream\nKinesisVideoStreamConfig\nKinesisVideoStreamConfiguration\nKinesisVideoStreamConfigurationUpdate\nKinesisVideoStreamPoolConfiguration\nKinesisVideoStreamPoolSummary\nKinesisVideoStreamPools\nKinesisVideoStreamRecordingSourceRuntimeConfiguration\nKinesisVideoStreamSourceRuntimeConfiguration\nKinesisVideoStreamSourceTaskConfiguration\nKinesisVideoStreamStartSelector\nKlv\nKlvBehavior\nKlvDataPids\nKlvMetadata\nKmsArn\nKmsDataKeyReusePeriodSeconds\nKmsEncryptionConfig\nKmsEncryptionContext\nKmsException\nKmsGrantConfiguration\nKmsGrantConstraints\nKmsKey\nKmsKeyARN\nKmsKeyArn\nKmsKeyConfiguration\nKmsKeyDisabledException\nKmsKeyId\nKmsKeyIdentifier\nKmsKeyIds\nKmsKeyNotFoundException\nKmsKeyProviderUri\nKmsKeyRegion\nKmsKeyToGrant\nKmsKeyValidationException\nKmsKeysToGrant\nKmsMasterKeyArn\nKmsMasterKeyId\nKnowledgeArticleConfiguration\nKnowledgeBaseAssociationData\nKnowledgeBaseData\nKnowledgeBaseSummary\nKnownFraudsterRisk\nKnownGender\nKpiName\nKpiResult\nKubernetes\nKubernetesApiCallAction\nKubernetesAuditLogsConfiguration\nKubernetesAuditLogsConfigurationResult\nKubernetesConfiguration\nKubernetesConfigurationResult\nKubernetesDataSourceFreeTrial\nKubernetesDetails\nKubernetesNetworkConfigRequest\nKubernetesNetworkConfigResponse\nKubernetesUserDetails\nKubernetesVersion\nKubernetesWorkloadDetails\nKxCacheStorageConfiguration\nKxChangesetListEntry\nKxCluster\nKxCommandLineArgument\nKxDatabaseCacheConfiguration\nKxDatabaseConfiguration\nKxDatabaseListEntry\nKxDeploymentConfiguration\nKxEnvironment\nKxNode\nKxSavedownStorageConfiguration\nKxUser\nL6Metadata\nL6Mode\nLBCookieStickinessPolicies\nLBCookieStickinessPolicy\nLDAPSSettingInfo\nLDAPSSettingsInfo\nLDAPSStatus\nLDAPSStatusReason\nLE\nLFResourceDetails\nLFTag\nLFTagError\nLFTagKeyResource\nLFTagOnDatabase\nLFTagPair\nLFTagPolicy\nLFTagPolicyDetails\nLFTagPolicyResource\nLFTags\nLFTagsOnColumns\nLFTagsOnTable\nLT\nLabel\nLabelAlias\nLabelAttribute\nLabelAttributeName\nLabelCategory\nLabelCategoryConfigS3Uri\nLabelCategoryExclusionFilters\nLabelCategoryInclusionFilters\nLabelColor\nLabelConfiguration\nLabelContent\nLabelCount\nLabelCounters\nLabelCountersForWorkteam\nLabelDelimiter\nLabelDetection\nLabelDetectionSettings\nLabelExclusionFilters\nLabelFontConfiguration\nLabelGroupArn\nLabelGroupName\nLabelGroupNameBeginsWith\nLabelGroupSummaries\nLabelGroupSummary\nLabelHeaders\nLabelId\nLabelInclusionFilters\nLabelIndex\nLabelMatchStatement\nLabelModelVersion\nLabelName\nLabelNameCondition\nLabelNamespace\nLabelOptions\nLabelParameterVersionRequest\nLabelParameterVersionResult\nLabelSchema\nLabelStats\nLabelSummaries\nLabelSummary\nLabelTemplate\nLabelVisibility\nLabeled\nLabeledEntries\nLabelingJobAlgorithmSpecificationArn\nLabelingJobAlgorithmsConfig\nLabelingJobArn\nLabelingJobDataAttributes\nLabelingJobDataSource\nLabelingJobForWorkteamSummary\nLabelingJobInputConfig\nLabelingJobName\nLabelingJobOutput\nLabelingJobOutputConfig\nLabelingJobResourceConfig\nLabelingJobS3DataSource\nLabelingJobSnsDataSource\nLabelingJobStatus\nLabelingJobStoppingConditions\nLabelingJobSummary\nLabelingJobSummaryList\nLabelingSetGenerationTaskRunProperties\nLabels\nLabelsInputConfiguration\nLabelsS3InputConfiguration\nLac\nLag\nLags\nLakeFormationConfiguration\nLakeFormationDataPermissionAsset\nLakeFormationDataPermissionDetails\nLakeFormationDataPermissionType\nLakeFormationOptInsInfo\nLakeFormationOptInsInfoList\nLambda\nLambdaAction\nLambdaActivity\nLambdaArn\nLambdaAuthorizerConfig\nLambdaAvailabilityProvider\nLambdaCodeHook\nLambdaConfig\nLambdaConfigType\nLambdaConfiguration\nLambdaConflictHandlerConfig\nLambdaConnectorProvisioningConfig\nLambdaContainerParams\nLambdaDataSourceConfig\nLambdaDetails\nLambdaDeviceMount\nLambdaEndpoint\nLambdaEndpointConfig\nLambdaEndpointInput\nLambdaEndpointSummary\nLambdaEventSource\nLambdaExecutionParameters\nLambdaExecutorConfiguration\nLambdaFunction\nLambdaFunctionARN\nLambdaFunctionAggregation\nLambdaFunctionAggregationResponse\nLambdaFunctionArn\nLambdaFunctionAssociation\nLambdaFunctionAssociations\nLambdaFunctionCompletedEventAttributes\nLambdaFunctionConfiguration\nLambdaFunctionConfigurations\nLambdaFunctionFailedEventAttributes\nLambdaFunctionFailedEventDetails\nLambdaFunctionInfo\nLambdaFunctionMemoryProjectedMetric\nLambdaFunctionMemoryRecommendationOption\nLambdaFunctionMetadata\nLambdaFunctionName\nLambdaFunctionParameters\nLambdaFunctionRecipeSource\nLambdaFunctionRecommendation\nLambdaFunctionRecommendationFilter\nLambdaFunctionScheduleFailedEventDetails\nLambdaFunctionScheduledEventAttributes\nLambdaFunctionScheduledEventDetails\nLambdaFunctionSinkConfiguration\nLambdaFunctionStartFailedEventDetails\nLambdaFunctionStartedEventAttributes\nLambdaFunctionSucceededEventDetails\nLambdaFunctionTimedOutEventAttributes\nLambdaFunctionTimedOutEventDetails\nLambdaFunctionUtilizationMetric\nLambdaFunctions\nLambdaInvoke\nLambdaInvokeOperation\nLambdaLayerAggregation\nLambdaLayerAggregationResponse\nLambdaLinuxProcessParams\nLambdaOutput\nLambdaOutputDescription\nLambdaOutputUpdate\nLambdaProvider\nLambdaResource\nLambdaResources\nLambdaStepMetadata\nLambdaTarget\nLambdaThrottledException\nLambdaVersion\nLambdaVolumeMount\nLambdaVpcConfig\nLandmark\nLandmarks\nLandsatCloudCoverLand\nLandsatCloudCoverLandInput\nLang\nLanguage\nLanguageCode\nLanguageCodeControl\nLanguageCodeItem\nLanguageCodes\nLanguageDescription\nLanguageIdSettings\nLanguageIdentification\nLanguageModel\nLanguageModelName\nLanguageName\nLanguageNotSupportedException\nLanguageOptions\nLanguageSelectionPolicy\nLanguageWithScore\nLanguages\nLargeTimestampGaps\nLast\nLastAccessTime\nLastAccessedAt\nLastAccessedDate\nLastAccessedEntity\nLastAccessedRegion\nLastAccessedTime\nLastActivatedBy\nLastActivatedTime\nLastActiveAt\nLastActiveDefinition\nLastAddress\nLastAllocation\nLastAnalyzedTime\nLastAssociationExecutionDate\nLastAttemptDate\nLastAttemptedDiscoveryTime\nLastAttemptedExecutionTime\nLastAuditTimestamp\nLastAuthenticated\nLastAuthenticatedEntity\nLastAuthenticatedRegion\nLastAuthenticatedTime\nLastAuthorizedTime\nLastAutoAdjustTime\nLastBackupDate\nLastBackupTime\nLastBatchTransformJob\nLastBusinessReport\nLastChangedDate\nLastCheckTimestamp\nLastCheckedTimestamp\nLastClaimTime\nLastClearTime\nLastCollectedTime\nLastCommitId\nLastConnectionTime\nLastCrawl\nLastCrawlInfo\nLastDataReceived\nLastDeactivatedTime\nLastDebugLogDeliveryStatus\nLastDebugLogDeliveryStatusReason\nLastDebugLogDeliveryTime\nLastDecreaseDateTime\nLastDeliveryChannelDeleteFailedException\nLastDeliveryEvent\nLastDeploymentConfig\nLastDeploymentInfo\nLastDeploymentStatusMessage\nLastDriftCheckTimestamp\nLastEditedTimestamp\nLastEngagementEvent\nLastError\nLastErrorCode\nLastErrorMessage\nLastEvaluatedBackupArn\nLastEvaluatedDate\nLastEvaluatedGlobalTableName\nLastEvaluatedKey\nLastEvaluatedShardId\nLastEvaluatedStreamArn\nLastEvaluatedTableName\nLastEvaluatedTime\nLastEvaluationState\nLastEvaluationTime\nLastExecutionDate\nLastExecutionTime\nLastFailedEvaluationTime\nLastFailedInvocationTime\nLastFailureMessage\nLastFailureTime\nLastFrameClippingBehavior\nLastFreshStart\nLastGeneratedReportDate\nLastHealthCheckTime\nLastHealthCheckTimestamp\nLastIncreaseDateTime\nLastIngestStateChange\nLastInventoryDate\nLastKeyGenerationTimestamp\nLastKnownUserConnectionTimestamp\nLastLaunchedTime\nLastMaintenanceApplied\nLastMessageTimestamp\nLastModificationDate\nLastModificationTime\nLastModified\nLastModifiedAfter\nLastModifiedAt\nLastModifiedBefore\nLastModifiedBy\nLastModifiedDate\nLastModifiedDateCondition\nLastModifiedDateTime\nLastModifiedOn\nLastModifiedTime\nLastModifiedTimeAfter\nLastModifiedTimeBefore\nLastModifiedTimestamp\nLastModifiedUser\nLastMonitoringExecutionSummary\nLastName\nLastNoRebootInstallOperationTime\nLastObservedAt\nLastOperationId\nLastPingDateTime\nLastProcessingResult\nLastProvisioningRecordId\nLastPublishedTime\nLastRecordId\nLastRecorderStatus\nLastRecurrenceTime\nLastRefreshDate\nLastReplicatedTimestamp\nLastReportGenerationExecutionError\nLastReportGenerationTime\nLastReportedAt\nLastRequestedDateTime\nLastRestoreTime\nLastRotatedDate\nLastRuleModification\nLastRun\nLastRunDetails\nLastRunErrorStatus\nLastRunFailureReason\nLastRunStatus\nLastRunSummary\nLastRunTime\nLastRuntimeSeconds\nLastSeen\nLastSeenDateTime\nLastSeenTime\nLastServiceErrorId\nLastSoftwareUpdate\nLastStarted\nLastStateChangeAt\nLastStateChangeReason\nLastStatus\nLastStatusChange\nLastStatusCheckDate\nLastStatusMessage\nLastStatusUpdateTime\nLastStopped\nLastSuccessfulAllocationTime\nLastSuccessfulAssociationExecutionDate\nLastSuccessfulDeliveryTime\nLastSuccessfulDiscoveryTime\nLastSuccessfulEvaluationTime\nLastSuccessfulExecutionDate\nLastSuccessfulExecutionTime\nLastSuccessfulInvocationTime\nLastSuccessfulMetadataSyncTime\nLastSuccessfulProvisioningRecordId\nLastSuccessfulSyncProvisioningArtifactId\nLastSuccessfulSyncTime\nLastSuccessfullyAppliedConfigurations\nLastSuccessfullyAppliedConfigurationsVersion\nLastSuggestionsBuildTime\nLastSync\nLastSyncCount\nLastSyncStatus\nLastSyncStatusMessage\nLastSyncTime\nLastTieringOperationStatus\nLastTieringOperationStatusDetail\nLastTieringProgress\nLastTieringStartTime\nLastUpdate\nLastUpdateAssociationDate\nLastUpdateCompletedTime\nLastUpdateDate\nLastUpdateDateTime\nLastUpdateRequestedTime\nLastUpdateStatus\nLastUpdateStatusReason\nLastUpdateStatusReasonCode\nLastUpdateTime\nLastUpdateTimestamp\nLastUpdateToPayPerRequestDateTime\nLastUpdated\nLastUpdatedAt\nLastUpdatedBy\nLastUpdatedDate\nLastUpdatedDateTime\nLastUpdatedTime\nLastUpdatedTimeStamp\nLastUpdatedTimestamp\nLastUplinkReceivedAt\nLastUploaderStatus\nLastUsedDate\nLastUserActivityTimestamp\nLastVPCAssociation\nLastWritten\nLat\nLatLonOptions\nLateDataRule\nLateDataRuleConfiguration\nLatency\nLatencyInMilliseconds\nLatencyInMs\nLatencyMs\nLatencyOther\nLatencyRead\nLatencyWrite\nLatest\nLatestAlternateSoftware\nLatestCloudWatchLogsDeliveryError\nLatestCloudWatchLogsDeliveryTime\nLatestDeliveryAttemptSucceeded\nLatestDeliveryAttemptTime\nLatestDeliveryError\nLatestDeliveryTime\nLatestDeviceJob\nLatestDigestDeliveryError\nLatestDigestDeliveryTime\nLatestFlywheelIteration\nLatestHeartbeat\nLatestHeartbeatAfter\nLatestInference\nLatestInferenceResult\nLatestIngestionAttemptEventID\nLatestIngestionAttemptTime\nLatestIngestionErrorCode\nLatestIngestionSuccessEventID\nLatestIngestionSuccessTime\nLatestLensVersion\nLatestMatchingVersion\nLatestMetadataSyncStatus\nLatestMetadataSyncStatusMessage\nLatestNotificationAttemptSucceeded\nLatestNotificationAttemptTime\nLatestNotificationError\nLatestNotificationTime\nLatestOnly\nLatestProfileVersion\nLatestPublicVersion\nLatestRestorableDateTime\nLatestRestorableTime\nLatestRevision\nLatestSampleTime\nLatestScheduledRetrainingAvailableDataInDays\nLatestScheduledRetrainingFailedReason\nLatestScheduledRetrainingModelVersion\nLatestScheduledRetrainingStartTime\nLatestScheduledRetrainingStatus\nLatestSchemaVersion\nLatestSoftware\nLatestStreamArn\nLatestStreamLabel\nLatestTime\nLatestUpdateAttemptAt\nLatestUpdateAttemptAuxiliaryDataLocation\nLatestUpdateAttemptStatus\nLatestUsageTimestamp\nLatestVersion\nLatestVersionArn\nLatestVersionCreatedAt\nLatestVersionId\nLatestVersionMetadata\nLatestVersionName\nLatestVersionNumber\nLatestVersionSize\nLatestVersionStatus\nLatitude\nLaunch\nLaunchAction\nLaunchActionParameter\nLaunchActionRun\nLaunchActionsRequestFilters\nLaunchActionsStatus\nLaunchAppRequest\nLaunchCommands\nLaunchConfig\nLaunchConfiguration\nLaunchConfigurationARN\nLaunchConfigurationName\nLaunchConfigurationNameType\nLaunchConfigurationNames\nLaunchConfigurationNamesType\nLaunchConfigurationTemplate\nLaunchConfigurations\nLaunchConfigurationsType\nLaunchDate\nLaunchDetails\nLaunchExecution\nLaunchGroup\nLaunchGroupConfig\nLaunchOverrides\nLaunchParameters\nLaunchPath\nLaunchPathSummaries\nLaunchPathSummary\nLaunchPaths\nLaunchPermission\nLaunchPermissionConfiguration\nLaunchPermissionModifications\nLaunchPermissions\nLaunchProfile\nLaunchProfileInitialization\nLaunchProfileInitializationActiveDirectory\nLaunchProfileInitializationScript\nLaunchProfileMembership\nLaunchRoleArn\nLaunchSpecification\nLaunchSpecifications\nLaunchTemplate\nLaunchTemplateAndOverrides\nLaunchTemplateAndOverridesResponse\nLaunchTemplateBlockDeviceMapping\nLaunchTemplateBlockDeviceMappingRequest\nLaunchTemplateCapacityReservationSpecificationRequest\nLaunchTemplateCapacityReservationSpecificationResponse\nLaunchTemplateConfig\nLaunchTemplateConfigs\nLaunchTemplateConfiguration\nLaunchTemplateCpuOptions\nLaunchTemplateCpuOptionsRequest\nLaunchTemplateData\nLaunchTemplateDiskConf\nLaunchTemplateEbsBlockDevice\nLaunchTemplateEbsBlockDeviceRequest\nLaunchTemplateElasticInferenceAccelerator\nLaunchTemplateElasticInferenceAcceleratorResponse\nLaunchTemplateEnclaveOptions\nLaunchTemplateEnclaveOptionsRequest\nLaunchTemplateHibernationOptions\nLaunchTemplateHibernationOptionsRequest\nLaunchTemplateIamInstanceProfileSpecification\nLaunchTemplateIamInstanceProfileSpecificationRequest\nLaunchTemplateId\nLaunchTemplateIds\nLaunchTemplateInstanceMaintenanceOptions\nLaunchTemplateInstanceMaintenanceOptionsRequest\nLaunchTemplateInstanceMarketOptions\nLaunchTemplateInstanceMarketOptionsRequest\nLaunchTemplateInstanceMetadataOptions\nLaunchTemplateInstanceMetadataOptionsRequest\nLaunchTemplateInstanceNetworkInterfaceSpecification\nLaunchTemplateInstanceNetworkInterfaceSpecificationRequest\nLaunchTemplateLicenseConfiguration\nLaunchTemplateLicenseConfigurationRequest\nLaunchTemplateName\nLaunchTemplateNames\nLaunchTemplateOverrides\nLaunchTemplatePlacement\nLaunchTemplatePlacementRequest\nLaunchTemplatePrivateDnsNameOptions\nLaunchTemplatePrivateDnsNameOptionsRequest\nLaunchTemplateSpecification\nLaunchTemplateSpotMarketOptions\nLaunchTemplateSpotMarketOptionsRequest\nLaunchTemplateTagSpecification\nLaunchTemplateTagSpecificationRequest\nLaunchTemplateVersion\nLaunchTemplateVersions\nLaunchTemplates\nLaunchTemplatesMonitoring\nLaunchTemplatesMonitoringRequest\nLaunchTime\nLaunchType\nLaunchedAt\nLaunchedAvailabilityZone\nLaunchedInstance\nLayer\nLayerAlreadyExistsException\nLayerArn\nLayerFailure\nLayerId\nLayerIds\nLayerInaccessibleException\nLayerName\nLayerPartTooSmallException\nLayerVersionArn\nLayerVersionContentInput\nLayerVersionContentOutput\nLayerVersions\nLayerVersionsListItem\nLayers\nLayersCount\nLayersListItem\nLayersNotFoundException\nLayout\nLayoutConfiguration\nLayoutSections\nLayoutSummary\nLayouts\nLbCookieStickinessPolicies\nLcmOperationInfo\nLdPreloadValue\nLdapServerMetadata\nLdapServerMetadataInput\nLdapServerMetadataOutput\nLdifContent\nLeaseExpirationTime\nLeaseId\nLedgerEncryptionDescription\nLedgerName\nLedgerSummary\nLedgers\nLeft\nLeftJoinKeyProperties\nLeftOffset\nLeftOperand\nLeg\nLegGeometry\nLegalHold\nLegalHoldArn\nLegalHoldId\nLegalHolds\nLegend\nLegendOptions\nLegs\nLendingDetection\nLendingDocument\nLendingField\nLendingFields\nLendingResult\nLendingSummary\nLength\nLens\nLensAlias\nLensAliases\nLensArn\nLensJSON\nLensMetric\nLensName\nLensNamePrefix\nLensNotes\nLensReview\nLensReviewReport\nLensReviewSummaries\nLensReviewSummary\nLensShareSummaries\nLensShareSummary\nLensStatus\nLensSummaries\nLensSummary\nLensType\nLensUpgradeSummary\nLensVersion\nLenses\nLensesAppliedCount\nLessThan\nLessThanOrEqual\nLessThanOrEquals\nLevel\nLevelFive\nLevelFour\nLevelId\nLevelOne\nLevelThree\nLevelTwo\nLex\nLexBot\nLexBotAliasArn\nLexBotConfig\nLexBots\nLexConfiguration\nLexRegion\nLexTranscriptFilter\nLexV2Bot\nLexVersion\nLexemesCount\nLexicon\nLexiconArn\nLexiconAttributes\nLexiconDescription\nLexiconNames\nLexiconNotFoundException\nLexiconSizeExceededException\nLexicons\nLfeControl\nLfeFilter\nLibraryPath\nLicense\nLicenseAcquisitionUrl\nLicenseArn\nLicenseArns\nLicenseBody\nLicenseConfiguration\nLicenseConfigurationArn\nLicenseConfigurationArns\nLicenseConfigurationAssociation\nLicenseConfigurationAssociations\nLicenseConfigurationId\nLicenseConfigurationRequest\nLicenseConfigurationStatus\nLicenseConfigurationUsage\nLicenseConfigurationUsageList\nLicenseConfigurations\nLicenseConsumptionToken\nLicenseConversionContext\nLicenseConversionTask\nLicenseConversionTaskId\nLicenseConversionTasks\nLicenseConversionTime\nLicenseCount\nLicenseCountHardLimit\nLicenseCountingType\nLicenseInfo\nLicenseManagerReportGeneratorArn\nLicenseManagerResourceShareArn\nLicenseMetadata\nLicenseModel\nLicenseName\nLicenseOperationFailure\nLicenseOperationFailureList\nLicenseRecommendation\nLicenseRecommendationFilter\nLicenseRecommendationOption\nLicenseRules\nLicenseServiceConfiguration\nLicenseSet\nLicenseSpecification\nLicenseSpecifications\nLicenseType\nLicenseUrl\nLicenseUsage\nLicenseUsageException\nLicenses\nLicensing\nLifeCycle\nLifeCycleLastCutover\nLifeCycleLastCutoverFinalized\nLifeCycleLastCutoverInitiated\nLifeCycleLastCutoverReverted\nLifeCycleLastLaunch\nLifeCycleLastLaunchInitiated\nLifeCycleLastTest\nLifeCycleLastTestFinalized\nLifeCycleLastTestInitiated\nLifeCycleLastTestReverted\nLifeCycleState\nLifeCycleStatus\nLifeCycleStatusFilter\nLifecycle\nLifecycleActionResult\nLifecycleActionToken\nLifecycleConfigArn\nLifecycleConfigArns\nLifecycleConfigName\nLifecycleConfiguration\nLifecycleConfigurationDescription\nLifecycleEvent\nLifecycleEventAlreadyCompletedException\nLifecycleEventConfiguration\nLifecycleExpiration\nLifecycleHook\nLifecycleHookLimitExceededException\nLifecycleHookName\nLifecycleHookNames\nLifecycleHookSpecification\nLifecycleHookSpecificationList\nLifecycleHookTypes\nLifecycleHooks\nLifecyclePolicies\nLifecyclePolicy\nLifecyclePolicyNotFoundException\nLifecyclePolicyPreviewFilter\nLifecyclePolicyPreviewInProgressException\nLifecyclePolicyPreviewNotFoundException\nLifecyclePolicyPreviewResult\nLifecyclePolicyPreviewSummary\nLifecyclePolicyRuleAction\nLifecyclePolicySummary\nLifecyclePolicyText\nLifecycleRule\nLifecycleRuleAndOperator\nLifecycleRuleFilter\nLifecycleState\nLifecycleTransition\nLifecycleTransitionReason\nLifetimeInSeconds\nLightsailDistribution\nLimit\nLimitCode\nLimitExceeded\nLimitExceededException\nLimitExceededFault\nLimitName\nLimitPrice\nLimitType\nLimitValue\nLimitValues\nLimitation\nLimitations\nLimits\nLimitsByRole\nLimitsExceeded\nLimitsExceededException\nLine\nLineChartAggregatedFieldWells\nLineChartConfiguration\nLineChartDefaultSeriesSettings\nLineChartFieldWells\nLineChartLineStyleSettings\nLineChartMarkerStyleSettings\nLineChartSeriesSettings\nLineChartSortConfiguration\nLineChartVisual\nLineDataLabels\nLineInterpolation\nLineItem\nLineItemAssetInformation\nLineItemCountsByStatus\nLineItemExpenseFields\nLineItemFields\nLineItemFilter\nLineItemFilters\nLineItemGroup\nLineItemGroupIndex\nLineItemGroups\nLineItemId\nLineItemRequest\nLineItems\nLineNumber\nLineRange\nLineRanges\nLineSeriesAxisDisplayOptions\nLineString\nLineStyle\nLineStyleSettings\nLineTime\nLineValues\nLineVisibility\nLineWidth\nLineage\nLineageConfiguration\nLineageGroupArn\nLineageGroupName\nLineageGroupSummaries\nLineageGroupSummary\nLineageObject\nLineageType\nLineageTypes\nLinear\nLinearStepSize\nLink\nLinkArn\nLinkAssociation\nLinkAssociationState\nLinkAssociations\nLinkAttributeAction\nLinkAttributeUpdate\nLinkConfiguration\nLinkId\nLinkIds\nLinkName\nLinkNameAlreadyInUseException\nLinkSharingConfiguration\nLinkSpecifiers\nLinkToDataSetColumn\nLinkedAccount\nLinkedAccountIds\nLinkedAccountName\nLinkedAccounts\nLinkedService\nLinks\nLinuxParameters\nLinuxSubscriptionsDiscovery\nLinuxSubscriptionsDiscoverySettings\nList\nListAPIKeysRequest\nListAPIKeysResponse\nListAWSDefaultServiceQuotasRequest\nListAWSDefaultServiceQuotasResponse\nListAWSServiceAccessForOrganizationRequest\nListAWSServiceAccessForOrganizationResponse\nListAcceleratorsRequest\nListAcceleratorsResponse\nListAcceptedPortfolioSharesInput\nListAcceptedPortfolioSharesOutput\nListAccessControlConfigurationsRequest\nListAccessControlConfigurationsResponse\nListAccessControlRulesRequest\nListAccessControlRulesResponse\nListAccessKeysRequest\nListAccessKeysResponse\nListAccessLogSubscriptionsRequest\nListAccessLogSubscriptionsResponse\nListAccessPointsForObjectLambdaRequest\nListAccessPointsForObjectLambdaResult\nListAccessPointsRequest\nListAccessPointsResult\nListAccessPoliciesRequest\nListAccessPoliciesResponse\nListAccessPreviewFindingsRequest\nListAccessPreviewFindingsResponse\nListAccessPreviewsRequest\nListAccessPreviewsResponse\nListAccessTokensRequest\nListAccessTokensResponse\nListAccessesRequest\nListAccessesResponse\nListAccessorsInput\nListAccessorsOutput\nListAccountAliasesRequest\nListAccountAliasesResponse\nListAccountAssignmentCreationStatusRequest\nListAccountAssignmentCreationStatusResponse\nListAccountAssignmentDeletionStatusRequest\nListAccountAssignmentDeletionStatusResponse\nListAccountAssignmentsRequest\nListAccountAssignmentsResponse\nListAccountAssociationsFilter\nListAccountAssociationsInput\nListAccountAssociationsOutput\nListAccountIntegrationsRequest\nListAccountIntegrationsResponse\nListAccountPermissionsRequest\nListAccountPermissionsResponse\nListAccountRolesRequest\nListAccountRolesResponse\nListAccountSettingsRequest\nListAccountSettingsResponse\nListAccountsForParentRequest\nListAccountsForParentResponse\nListAccountsForProvisionedPermissionSetRequest\nListAccountsForProvisionedPermissionSetResponse\nListAccountsRequest\nListAccountsResponse\nListActionExecutionsInput\nListActionExecutionsOutput\nListActionTypesInput\nListActionTypesOutput\nListActionsRequest\nListActionsResponse\nListActivatedRulesInRuleGroupRequest\nListActivatedRulesInRuleGroupResponse\nListActiveViolationsRequest\nListActiveViolationsResponse\nListActivitiesInput\nListActivitiesOutput\nListActivityTypesInput\nListAddonsRequest\nListAddonsResponse\nListAdminAccountsForOrganizationRequest\nListAdminAccountsForOrganizationResponse\nListAdminsManagingAccountRequest\nListAdminsManagingAccountResponse\nListAgentStatusRequest\nListAgentStatusResponse\nListAgentsRequest\nListAgentsResponse\nListAggregateDiscoveredResourcesRequest\nListAggregateDiscoveredResourcesResponse\nListAggregatedUtterancesRequest\nListAggregatedUtterancesResponse\nListAgreementsRequest\nListAgreementsResponse\nListAlarmModelVersionsRequest\nListAlarmModelVersionsResponse\nListAlarmModelsRequest\nListAlarmModelsResponse\nListAlarmRecommendationsRequest\nListAlarmRecommendationsResponse\nListAlarmsRequest\nListAlarmsResponse\nListAlertsRequest\nListAlertsResponse\nListAlgorithmsInput\nListAlgorithmsOutput\nListAliasesInput\nListAliasesOutput\nListAliasesRequest\nListAliasesResponse\nListAllowListsRequest\nListAllowListsResponse\nListAllowedNodeTypeModificationsMessage\nListAllowedNodeTypeUpdatesRequest\nListAllowedNodeTypeUpdatesResponse\nListAnalysesRequest\nListAnalysesResponse\nListAnalysisTemplatesInput\nListAnalysisTemplatesOutput\nListAnalyzedResourcesRequest\nListAnalyzedResourcesResponse\nListAnalyzersRequest\nListAnalyzersResponse\nListAnnotationImportJobsFilter\nListAnnotationImportJobsRequest\nListAnnotationImportJobsResponse\nListAnnotationStoreVersionsFilter\nListAnnotationStoreVersionsRequest\nListAnnotationStoreVersionsResponse\nListAnnotationStoresFilter\nListAnnotationStoresRequest\nListAnnotationStoresResponse\nListAnomaliesForInsightFilters\nListAnomaliesForInsightRequest\nListAnomaliesForInsightResponse\nListAnomalousLogGroupsRequest\nListAnomalousLogGroupsResponse\nListAnomalyDetectorsRequest\nListAnomalyDetectorsResponse\nListAnomalyGroupRelatedMetricsRequest\nListAnomalyGroupRelatedMetricsResponse\nListAnomalyGroupSummariesRequest\nListAnomalyGroupSummariesResponse\nListAnomalyGroupTimeSeriesRequest\nListAnomalyGroupTimeSeriesResponse\nListAnswersInput\nListAnswersOutput\nListApiDestinationsRequest\nListApiDestinationsResponse\nListApiKeysRequest\nListApiKeysResponse\nListAppAssessmentComplianceDriftsRequest\nListAppAssessmentComplianceDriftsResponse\nListAppAssessmentsRequest\nListAppAssessmentsResponse\nListAppAuthorizationsRequest\nListAppAuthorizationsResponse\nListAppBundlesRequest\nListAppBundlesResponse\nListAppComponentCompliancesRequest\nListAppComponentCompliancesResponse\nListAppComponentRecommendationsRequest\nListAppComponentRecommendationsResponse\nListAppImageConfigsRequest\nListAppImageConfigsResponse\nListAppInputSourcesRequest\nListAppInputSourcesResponse\nListAppInstanceAdminsRequest\nListAppInstanceAdminsResponse\nListAppInstanceBotsRequest\nListAppInstanceBotsResponse\nListAppInstanceUserEndpointsRequest\nListAppInstanceUserEndpointsResponse\nListAppInstanceUsersRequest\nListAppInstanceUsersResponse\nListAppInstancesRequest\nListAppInstancesResponse\nListAppMonitorsRequest\nListAppMonitorsResponse\nListAppVersionAppComponentsRequest\nListAppVersionAppComponentsResponse\nListAppVersionResourceMappingsRequest\nListAppVersionResourceMappingsResponse\nListAppVersionResourcesRequest\nListAppVersionResourcesResponse\nListAppVersionsRequest\nListAppVersionsResponse\nListApplicationComponentsRequest\nListApplicationComponentsResponse\nListApplicationDPUSizesInput\nListApplicationDPUSizesOutput\nListApplicationDependenciesRequest\nListApplicationDependenciesResponse\nListApplicationInstanceDependenciesRequest\nListApplicationInstanceDependenciesResponse\nListApplicationInstanceNodeInstancesRequest\nListApplicationInstanceNodeInstancesResponse\nListApplicationInstancesRequest\nListApplicationInstancesResponse\nListApplicationRevisionsInput\nListApplicationRevisionsOutput\nListApplicationSnapshotsRequest\nListApplicationSnapshotsResponse\nListApplicationStatesRequest\nListApplicationStatesResult\nListApplicationVersionsRequest\nListApplicationVersionsResponse\nListApplicationsInput\nListApplicationsOutput\nListApplicationsRequest\nListApplicationsRequestFilters\nListApplicationsResponse\nListAppliedSchemaArnsRequest\nListAppliedSchemaArnsResponse\nListApprovalRuleTemplatesInput\nListApprovalRuleTemplatesOutput\nListApprovedOriginsRequest\nListApprovedOriginsResponse\nListAppsInput\nListAppsListsRequest\nListAppsListsResponse\nListAppsOutput\nListAppsRequest\nListAppsResponse\nListAppsResult\nListArchiveRulesRequest\nListArchiveRulesResponse\nListArchivesRequest\nListArchivesResponse\nListArn\nListArtifactsRequest\nListArtifactsResponse\nListArtifactsResult\nListAssessmentControlInsightsByControlDomainRequest\nListAssessmentControlInsightsByControlDomainResponse\nListAssessmentFrameworkShareRequestsRequest\nListAssessmentFrameworkShareRequestsResponse\nListAssessmentFrameworksRequest\nListAssessmentFrameworksResponse\nListAssessmentReportsRequest\nListAssessmentReportsResponse\nListAssessmentRunAgentsRequest\nListAssessmentRunAgentsResponse\nListAssessmentRunsRequest\nListAssessmentRunsResponse\nListAssessmentTargetsRequest\nListAssessmentTargetsResponse\nListAssessmentTemplatesRequest\nListAssessmentTemplatesResponse\nListAssessmentsRequest\nListAssessmentsResponse\nListAssetBundleExportJobsRequest\nListAssetBundleExportJobsResponse\nListAssetBundleImportJobsRequest\nListAssetBundleImportJobsResponse\nListAssetModelPropertiesRequest\nListAssetModelPropertiesResponse\nListAssetModelsRequest\nListAssetModelsResponse\nListAssetPropertiesRequest\nListAssetPropertiesResponse\nListAssetRelationshipsRequest\nListAssetRelationshipsResponse\nListAssetsInput\nListAssetsOutput\nListAssetsRequest\nListAssetsResponse\nListAssignmentsForHITRequest\nListAssignmentsForHITResponse\nListAssistantAssociationsRequest\nListAssistantAssociationsResponse\nListAssistantsRequest\nListAssistantsResponse\nListAssociatedApprovalRuleTemplatesForRepositoryInput\nListAssociatedApprovalRuleTemplatesForRepositoryOutput\nListAssociatedAssetsRequest\nListAssociatedAssetsResponse\nListAssociatedAttributeGroupsRequest\nListAssociatedAttributeGroupsResponse\nListAssociatedFleetsRequest\nListAssociatedFleetsResult\nListAssociatedGroupsRequest\nListAssociatedGroupsResponse\nListAssociatedResourcesRequest\nListAssociatedResourcesResponse\nListAssociatedRoute53HealthChecksRequest\nListAssociatedRoute53HealthChecksResponse\nListAssociatedStacksRequest\nListAssociatedStacksResult\nListAssociationVersionsRequest\nListAssociationVersionsResult\nListAssociationsForLicenseConfigurationRequest\nListAssociationsForLicenseConfigurationResponse\nListAssociationsRequest\nListAssociationsResponse\nListAssociationsResult\nListAttachedGroupPoliciesRequest\nListAttachedGroupPoliciesResponse\nListAttachedIndices\nListAttachedIndicesRequest\nListAttachedIndicesResponse\nListAttachedLinksInput\nListAttachedLinksItem\nListAttachedLinksOutput\nListAttachedPoliciesRequest\nListAttachedPoliciesResponse\nListAttachedRolePoliciesRequest\nListAttachedRolePoliciesResponse\nListAttachedUserPoliciesRequest\nListAttachedUserPoliciesResponse\nListAttachmentsRequest\nListAttachmentsResponse\nListAttacksRequest\nListAttacksResponse\nListAttendeeTagsRequest\nListAttendeeTagsResponse\nListAttendeesRequest\nListAttendeesResponse\nListAttributeGroupsForApplicationRequest\nListAttributeGroupsForApplicationResponse\nListAttributeGroupsRequest\nListAttributeGroupsResponse\nListAttributesRequest\nListAttributesResponse\nListAuditFindingsRequest\nListAuditFindingsResponse\nListAuditMitigationActionsExecutionsRequest\nListAuditMitigationActionsExecutionsResponse\nListAuditMitigationActionsTasksRequest\nListAuditMitigationActionsTasksResponse\nListAuditSuppressionsRequest\nListAuditSuppressionsResponse\nListAuditTasksRequest\nListAuditTasksResponse\nListAuthorizersRequest\nListAuthorizersResponse\nListAutoMLJobsRequest\nListAutoMLJobsResponse\nListAutoScalingConfigurationsRequest\nListAutoScalingConfigurationsResponse\nListAutomaticTapeCreationPoliciesInput\nListAutomaticTapeCreationPoliciesOutput\nListAutomationRulesRequest\nListAutomationRulesResponse\nListAvailabilityConfigurationsRequest\nListAvailabilityConfigurationsResponse\nListAvailableManagedRuleGroupVersionsRequest\nListAvailableManagedRuleGroupVersionsResponse\nListAvailableManagedRuleGroupsRequest\nListAvailableManagedRuleGroupsResponse\nListAvailableManagementCidrRangesRequest\nListAvailableManagementCidrRangesResult\nListAvailableResourceDimensionsRequest\nListAvailableResourceDimensionsResponse\nListAvailableResourceMetricsRequest\nListAvailableResourceMetricsResponse\nListAvailableSolutionStacksResultMessage\nListAvailableVoiceConnectorRegionsResponse\nListAvailableZonesResponse\nListBackendEnvironmentsRequest\nListBackendEnvironmentsResult\nListBackendJobsRequest\nListBackendJobsResponse\nListBackupJobsInput\nListBackupJobsOutput\nListBackupPlanTemplatesInput\nListBackupPlanTemplatesOutput\nListBackupPlanVersionsInput\nListBackupPlanVersionsOutput\nListBackupPlansInput\nListBackupPlansOutput\nListBackupSelectionsInput\nListBackupSelectionsOutput\nListBackupVaultsInput\nListBackupVaultsOutput\nListBackupsInput\nListBackupsOutput\nListBatchInferenceJobsRequest\nListBatchInferenceJobsResponse\nListBatchJobDefinitionsRequest\nListBatchJobDefinitionsResponse\nListBatchJobExecutionsRequest\nListBatchJobExecutionsResponse\nListBatchLoadTasksRequest\nListBatchLoadTasksResponse\nListBatchSegmentJobsRequest\nListBatchSegmentJobsResponse\nListBillingGroupAccountGrouping\nListBillingGroupCostReportsFilter\nListBillingGroupCostReportsInput\nListBillingGroupCostReportsOutput\nListBillingGroupsFilter\nListBillingGroupsInput\nListBillingGroupsOutput\nListBillingGroupsRequest\nListBillingGroupsResponse\nListBlueprintsRequest\nListBlueprintsResponse\nListBonusPaymentsRequest\nListBonusPaymentsResponse\nListBootstrapActionsInput\nListBootstrapActionsOutput\nListBotAliasesRequest\nListBotAliasesResponse\nListBotLocalesRequest\nListBotLocalesResponse\nListBotRecommendationsRequest\nListBotRecommendationsResponse\nListBotVersionsRequest\nListBotVersionsResponse\nListBotsRequest\nListBotsResponse\nListBranchesInput\nListBranchesOutput\nListBranchesRequest\nListBranchesResult\nListBridgesRequest\nListBridgesResponse\nListBrokersRequest\nListBrokersResponse\nListBrowserSettingsRequest\nListBrowserSettingsResponse\nListBucketAnalyticsConfigurationsOutput\nListBucketAnalyticsConfigurationsRequest\nListBucketIntelligentTieringConfigurationsOutput\nListBucketIntelligentTieringConfigurationsRequest\nListBucketInventoryConfigurationsOutput\nListBucketInventoryConfigurationsRequest\nListBucketMetricsConfigurationsOutput\nListBucketMetricsConfigurationsRequest\nListBucketsOutput\nListBudgetsForResourceInput\nListBudgetsForResourceOutput\nListBuildBatchesForProjectInput\nListBuildBatchesForProjectOutput\nListBuildBatchesInput\nListBuildBatchesOutput\nListBuildsForProjectInput\nListBuildsForProjectOutput\nListBuildsInput\nListBuildsOutput\nListBuiltInIntentsRequest\nListBuiltInIntentsResponse\nListBuiltInSlotTypesRequest\nListBuiltInSlotTypesResponse\nListBulkDeploymentDetailedReportsRequest\nListBulkDeploymentDetailedReportsResponse\nListBulkDeploymentsRequest\nListBulkDeploymentsResponse\nListBulkImportJobsRequest\nListBulkImportJobsResponse\nListBundlesRequest\nListBundlesResult\nListBusinessReportSchedulesRequest\nListBusinessReportSchedulesResponse\nListBy\nListByoipCidrsRequest\nListByoipCidrsResponse\nListByteMatchSetsRequest\nListByteMatchSetsResponse\nListCACertificatesRequest\nListCACertificatesResponse\nListCachePoliciesRequest\nListCachePoliciesResult\nListCalculatedAttributeDefinitionItem\nListCalculatedAttributeDefinitionsRequest\nListCalculatedAttributeDefinitionsResponse\nListCalculatedAttributeForProfileItem\nListCalculatedAttributesForProfileRequest\nListCalculatedAttributesForProfileResponse\nListCalculationExecutionsRequest\nListCalculationExecutionsResponse\nListCallAnalyticsCategoriesRequest\nListCallAnalyticsCategoriesResponse\nListCallAnalyticsJobsRequest\nListCallAnalyticsJobsResponse\nListCampaignsRequest\nListCampaignsResponse\nListCandidatesForAutoMLJobRequest\nListCandidatesForAutoMLJobResponse\nListCapacityReservationsInput\nListCapacityReservationsOutput\nListCasesForContactRequest\nListCasesForContactResponse\nListCatalogItemsInput\nListCatalogItemsOutput\nListCellsRequest\nListCellsResponse\nListCertificateAuthoritiesRequest\nListCertificateAuthoritiesResponse\nListCertificatesByCARequest\nListCertificatesByCAResponse\nListCertificatesRequest\nListCertificatesResponse\nListCertificatesResult\nListChangeSetsInput\nListChangeSetsOutput\nListChangeSetsRequest\nListChangeSetsResponse\nListChangedBlocksRequest\nListChangedBlocksResponse\nListChangesetsRequest\nListChangesetsResponse\nListChannelBansRequest\nListChannelBansResponse\nListChannelFlowsRequest\nListChannelFlowsResponse\nListChannelGroupsRequest\nListChannelGroupsResponse\nListChannelMembershipsForAppInstanceUserRequest\nListChannelMembershipsForAppInstanceUserResponse\nListChannelMembershipsRequest\nListChannelMembershipsResponse\nListChannelMessagesRequest\nListChannelMessagesResponse\nListChannelModeratorsRequest\nListChannelModeratorsResponse\nListChannelsAssociatedWithChannelFlowRequest\nListChannelsAssociatedWithChannelFlowResponse\nListChannelsModeratedByAppInstanceUserRequest\nListChannelsModeratedByAppInstanceUserResponse\nListChannelsRequest\nListChannelsResponse\nListCheckDetailsInput\nListCheckDetailsOutput\nListCheckSummariesInput\nListCheckSummariesOutput\nListChildrenRequest\nListChildrenResponse\nListChunksInput\nListChunksOutput\nListCidrBlocksRequest\nListCidrBlocksResponse\nListCidrCollectionsRequest\nListCidrCollectionsResponse\nListCidrLocationsRequest\nListCidrLocationsResponse\nListClassificationJobsRequest\nListClassificationJobsResponse\nListClassificationScopesRequest\nListClassificationScopesResponse\nListClientDevicesAssociatedWithCoreDeviceRequest\nListClientDevicesAssociatedWithCoreDeviceResponse\nListClientVpcConnectionsRequest\nListClientVpcConnectionsResponse\nListClosedWorkflowExecutionsInput\nListCloudFrontOriginAccessIdentitiesRequest\nListCloudFrontOriginAccessIdentitiesResult\nListClusterJobsRequest\nListClusterJobsResult\nListClusterOperationsRequest\nListClusterOperationsResponse\nListClusterOperationsV2Request\nListClusterOperationsV2Response\nListClusterSnapshotsInput\nListClusterSnapshotsOutput\nListClustersInput\nListClustersOutput\nListClustersRequest\nListClustersResponse\nListClustersResult\nListClustersV2Request\nListClustersV2Response\nListCodeRepositoriesInput\nListCodeRepositoriesOutput\nListCodeReviewsRequest\nListCodeReviewsResponse\nListCodeSigningConfigsRequest\nListCodeSigningConfigsResponse\nListCodegenJobsRequest\nListCodegenJobsResponse\nListCollaborationAnalysisTemplatesInput\nListCollaborationAnalysisTemplatesOutput\nListCollaborationsInput\nListCollaborationsOutput\nListCollectionsRequest\nListCollectionsResponse\nListCollectorsRequest\nListCollectorsResponse\nListCommandInvocationsRequest\nListCommandInvocationsResult\nListCommandsRequest\nListCommandsResult\nListCompatibleImagesRequest\nListCompatibleImagesResult\nListCompilationJobsRequest\nListCompilationJobsResponse\nListComplianceItemsRequest\nListComplianceItemsResult\nListComplianceStatusRequest\nListComplianceStatusResponse\nListComplianceSummariesRequest\nListComplianceSummariesResult\nListComponentBuildVersionsRequest\nListComponentBuildVersionsResponse\nListComponentOutputsInput\nListComponentOutputsOutput\nListComponentProvisionedResourcesInput\nListComponentProvisionedResourcesOutput\nListComponentTypesRequest\nListComponentTypesResponse\nListComponentVersionsRequest\nListComponentVersionsResponse\nListComponentsInput\nListComponentsOutput\nListComponentsRequest\nListComponentsResponse\nListComputeInput\nListComputeOutput\nListConferenceProvidersRequest\nListConferenceProvidersResponse\nListConfigsRequest\nListConfigsResponse\nListConfigurationHistoryRequest\nListConfigurationHistoryResponse\nListConfigurationProfilesRequest\nListConfigurationRevisionsRequest\nListConfigurationRevisionsResponse\nListConfigurationSetsRequest\nListConfigurationSetsResponse\nListConfigurationsRequest\nListConfigurationsResponse\nListConfiguredTableAssociationsInput\nListConfiguredTableAssociationsOutput\nListConfiguredTablesInput\nListConfiguredTablesOutput\nListConflictingAliasesRequest\nListConflictingAliasesResult\nListConformancePackComplianceScoresRequest\nListConformancePackComplianceScoresResponse\nListConnectPeersRequest\nListConnectPeersResponse\nListConnectionsInput\nListConnectionsOutput\nListConnectionsRequest\nListConnectionsResponse\nListConnectorDefinitionVersionsRequest\nListConnectorDefinitionVersionsResponse\nListConnectorDefinitionsRequest\nListConnectorDefinitionsResponse\nListConnectorEntitiesRequest\nListConnectorEntitiesResponse\nListConnectorsRequest\nListConnectorsResponse\nListConstraintsForPortfolioInput\nListConstraintsForPortfolioOutput\nListContactChannelsRequest\nListContactChannelsResult\nListContactEvaluationsRequest\nListContactEvaluationsResponse\nListContactFlowModulesRequest\nListContactFlowModulesResponse\nListContactFlowsRequest\nListContactFlowsResponse\nListContactListsRequest\nListContactListsResponse\nListContactReferencesRequest\nListContactReferencesResponse\nListContactsFilter\nListContactsRequest\nListContactsResponse\nListContactsResult\nListContainerInstancesRequest\nListContainerInstancesResponse\nListContainerRecipesRequest\nListContainerRecipesResponse\nListContainersInput\nListContainersOutput\nListContentsRequest\nListContentsResponse\nListContextsRequest\nListContextsResponse\nListContinuousDeploymentPoliciesRequest\nListContinuousDeploymentPoliciesResult\nListContributorInsightsInput\nListContributorInsightsOutput\nListControlDisplayOptions\nListControlDomainInsightsByAssessmentRequest\nListControlDomainInsightsByAssessmentResponse\nListControlDomainInsightsRequest\nListControlDomainInsightsResponse\nListControlInsightsByControlDomainRequest\nListControlInsightsByControlDomainResponse\nListControlPanelsRequest\nListControlPanelsResponse\nListControlSearchOptions\nListControlSelectAllOptions\nListControlsRequest\nListControlsResponse\nListCopyJobsInput\nListCopyJobsOutput\nListCoreDefinitionVersionsRequest\nListCoreDefinitionVersionsResponse\nListCoreDefinitionsRequest\nListCoreDefinitionsResponse\nListCoreDevicesRequest\nListCoreDevicesResponse\nListCoreNetworkPolicyVersionsRequest\nListCoreNetworkPolicyVersionsResponse\nListCoreNetworksRequest\nListCoreNetworksResponse\nListCostAllocationTagsRequest\nListCostAllocationTagsResponse\nListCostCategoryDefinitionsRequest\nListCostCategoryDefinitionsResponse\nListCoverageRequest\nListCoverageResponse\nListCoverageStatisticsRequest\nListCoverageStatisticsResponse\nListCrawlersRequest\nListCrawlersResponse\nListCrawlsRequest\nListCrawlsResponse\nListCreateAccountStatusRequest\nListCreateAccountStatusResponse\nListCreatedArtifactsRequest\nListCreatedArtifactsResult\nListCrlsResponse\nListCrossAccountAuthorizationsRequest\nListCrossAccountAuthorizationsResponse\nListCuratedEnvironmentImagesOutput\nListCustomDataIdentifiersRequest\nListCustomDataIdentifiersResponse\nListCustomEntityTypesRequest\nListCustomEntityTypesResponse\nListCustomLineItemChargeDetails\nListCustomLineItemFlatChargeDetails\nListCustomLineItemPercentageChargeDetails\nListCustomLineItemVersionsBillingPeriodRangeFilter\nListCustomLineItemVersionsFilter\nListCustomLineItemVersionsInput\nListCustomLineItemVersionsOutput\nListCustomLineItemsFilter\nListCustomLineItemsInput\nListCustomLineItemsOutput\nListCustomMetricsRequest\nListCustomMetricsResponse\nListCustomModelsRequest\nListCustomModelsResponse\nListCustomPluginsRequest\nListCustomPluginsResponse\nListCustomRoutingAcceleratorsRequest\nListCustomRoutingAcceleratorsResponse\nListCustomRoutingEndpointGroupsRequest\nListCustomRoutingEndpointGroupsResponse\nListCustomRoutingListenersRequest\nListCustomRoutingListenersResponse\nListCustomRoutingPortMappingsByDestinationRequest\nListCustomRoutingPortMappingsByDestinationResponse\nListCustomRoutingPortMappingsRequest\nListCustomRoutingPortMappingsResponse\nListCustomVerificationEmailTemplatesRequest\nListCustomVerificationEmailTemplatesResponse\nListCustomVocabularyItemsRequest\nListCustomVocabularyItemsResponse\nListCustomerManagedPolicyReferencesInPermissionSetRequest\nListCustomerManagedPolicyReferencesInPermissionSetResponse\nListDICOMImportJobsRequest\nListDICOMImportJobsResponse\nListDashboardVersionsRequest\nListDashboardVersionsResponse\nListDashboardsInput\nListDashboardsOutput\nListDashboardsRequest\nListDashboardsResponse\nListDataCatalogsInput\nListDataCatalogsOutput\nListDataCellsFilterRequest\nListDataCellsFilterResponse\nListDataIngestionJobsRequest\nListDataIngestionJobsResponse\nListDataIntegrationAssociationsRequest\nListDataIntegrationAssociationsResponse\nListDataIntegrationsRequest\nListDataIntegrationsResponse\nListDataLakeExceptionsRequest\nListDataLakeExceptionsResponse\nListDataLakesRequest\nListDataLakesResponse\nListDataQualityJobDefinitionsRequest\nListDataQualityJobDefinitionsResponse\nListDataQualityResultsRequest\nListDataQualityResultsResponse\nListDataQualityRuleRecommendationRunsRequest\nListDataQualityRuleRecommendationRunsResponse\nListDataQualityRulesetEvaluationRunsRequest\nListDataQualityRulesetEvaluationRunsResponse\nListDataQualityRulesetsRequest\nListDataQualityRulesetsResponse\nListDataSetImportHistoryRequest\nListDataSetImportHistoryResponse\nListDataSetRevisionsRequest\nListDataSetRevisionsResponse\nListDataSetsRequest\nListDataSetsResponse\nListDataSourceSyncJobsRequest\nListDataSourceSyncJobsResponse\nListDataSourcesRequest\nListDataSourcesResponse\nListDataViewsRequest\nListDataViewsResponse\nListDatabasesInput\nListDatabasesOutput\nListDatabasesRequest\nListDatabasesResponse\nListDataflowEndpointGroupsRequest\nListDataflowEndpointGroupsResponse\nListDatasetContentsRequest\nListDatasetContentsResponse\nListDatasetEntriesRequest\nListDatasetEntriesResponse\nListDatasetExportJobsRequest\nListDatasetExportJobsResponse\nListDatasetGroupsRequest\nListDatasetGroupsResponse\nListDatasetImportJobsRequest\nListDatasetImportJobsResponse\nListDatasetLabelsRequest\nListDatasetLabelsResponse\nListDatasetsRequest\nListDatasetsResponse\nListDatasourcePackagesRequest\nListDatasourcePackagesResponse\nListDatastoresRequest\nListDatastoresResponse\nListDeadLetterSourceQueuesRequest\nListDeadLetterSourceQueuesResult\nListDecoderManifestNetworkInterfacesRequest\nListDecoderManifestNetworkInterfacesResponse\nListDecoderManifestSignalsRequest\nListDecoderManifestSignalsResponse\nListDecoderManifestsRequest\nListDecoderManifestsResponse\nListDedicatedIpPoolsRequest\nListDedicatedIpPoolsResponse\nListDefaultVocabulariesRequest\nListDefaultVocabulariesResponse\nListDelegatedAdminAccountsRequest\nListDelegatedAdminAccountsResponse\nListDelegatedAdministratorsRequest\nListDelegatedAdministratorsResponse\nListDelegatedServicesForAccountRequest\nListDelegatedServicesForAccountResponse\nListDeliverabilityTestReportsRequest\nListDeliverabilityTestReportsResponse\nListDeliveryStreamsInput\nListDeliveryStreamsOutput\nListDeploymentConfigsInput\nListDeploymentConfigsOutput\nListDeploymentGroupsInput\nListDeploymentGroupsOutput\nListDeploymentInstancesInput\nListDeploymentInstancesOutput\nListDeploymentJobsRequest\nListDeploymentJobsResponse\nListDeploymentStrategiesRequest\nListDeploymentTargetsInput\nListDeploymentTargetsOutput\nListDeploymentsInput\nListDeploymentsOutput\nListDeploymentsRequest\nListDeploymentsResponse\nListDestinationsRequest\nListDestinationsResponse\nListDetectMitigationActionsExecutionsRequest\nListDetectMitigationActionsExecutionsResponse\nListDetectMitigationActionsTasksRequest\nListDetectMitigationActionsTasksResponse\nListDetectorModelVersionsRequest\nListDetectorModelVersionsResponse\nListDetectorModelsRequest\nListDetectorModelsResponse\nListDetectorsRequest\nListDetectorsResponse\nListDevEndpointsRequest\nListDevEndpointsResponse\nListDevEnvironmentSessionsRequest\nListDevEnvironmentSessionsResponse\nListDevEnvironmentsRequest\nListDevEnvironmentsResponse\nListDevelopmentSchemaArnsRequest\nListDevelopmentSchemaArnsResponse\nListDeviceDefinitionVersionsRequest\nListDeviceDefinitionVersionsResponse\nListDeviceDefinitionsRequest\nListDeviceDefinitionsResponse\nListDeviceEventsRequest\nListDeviceEventsResponse\nListDeviceFleetsRequest\nListDeviceFleetsResponse\nListDeviceIdentifiersRequest\nListDeviceIdentifiersResponse\nListDeviceInstancesRequest\nListDeviceInstancesResult\nListDevicePoolsRequest\nListDevicePoolsResult\nListDevicePositionsRequest\nListDevicePositionsResponse\nListDevicePositionsResponseEntry\nListDeviceProfilesRequest\nListDeviceProfilesResponse\nListDeviceResourcesInput\nListDeviceResourcesOutput\nListDevicesForWirelessDeviceImportTaskRequest\nListDevicesForWirelessDeviceImportTaskResponse\nListDevicesInput\nListDevicesJobsRequest\nListDevicesJobsResponse\nListDevicesOutput\nListDevicesRequest\nListDevicesResponse\nListDevicesResult\nListDimensionsRequest\nListDimensionsResponse\nListDirectoriesRequest\nListDirectoriesResponse\nListDirectoryRegistrationsRequest\nListDirectoryRegistrationsResponse\nListDiscoveredResourcesRequest\nListDiscoveredResourcesResponse\nListDiscoveredResourcesResult\nListDiscoverersRequest\nListDiscoverersResponse\nListDiscoveryJobsRequest\nListDiscoveryJobsResponse\nListDistributedGrantsRequest\nListDistributedGrantsResponse\nListDistributionConfigurationsRequest\nListDistributionConfigurationsResponse\nListDistributionsByCachePolicyIdRequest\nListDistributionsByCachePolicyIdResult\nListDistributionsByKeyGroupRequest\nListDistributionsByKeyGroupResult\nListDistributionsByOriginRequestPolicyIdRequest\nListDistributionsByOriginRequestPolicyIdResult\nListDistributionsByRealtimeLogConfigRequest\nListDistributionsByRealtimeLogConfigResult\nListDistributionsByResponseHeadersPolicyIdRequest\nListDistributionsByResponseHeadersPolicyIdResult\nListDistributionsByWebACLIdRequest\nListDistributionsByWebACLIdResult\nListDistributionsRequest\nListDistributionsResult\nListDocumentClassificationJobsRequest\nListDocumentClassificationJobsResponse\nListDocumentClassifierSummariesRequest\nListDocumentClassifierSummariesResponse\nListDocumentClassifiersRequest\nListDocumentClassifiersResponse\nListDocumentMetadataHistoryRequest\nListDocumentMetadataHistoryResponse\nListDocumentVersionsRequest\nListDocumentVersionsResult\nListDocumentsRequest\nListDocumentsResult\nListDomainAssociationsRequest\nListDomainAssociationsResult\nListDomainConfigurationsRequest\nListDomainConfigurationsResponse\nListDomainDeliverabilityCampaignsRequest\nListDomainDeliverabilityCampaignsResponse\nListDomainItem\nListDomainNamesRequest\nListDomainNamesResponse\nListDomainsForPackageRequest\nListDomainsForPackageResponse\nListDomainsInput\nListDomainsRequest\nListDomainsResponse\nListDomainsResult\nListDominantLanguageDetectionJobsRequest\nListDominantLanguageDetectionJobsResponse\nListEarthObservationJobInput\nListEarthObservationJobOutput\nListEarthObservationJobOutputConfig\nListEdgeAgentConfigurationsEdgeConfig\nListEdgeAgentConfigurationsInput\nListEdgeAgentConfigurationsOutput\nListEdgeDeploymentPlansRequest\nListEdgeDeploymentPlansResponse\nListEdgePackagingJobsRequest\nListEdgePackagingJobsResponse\nListEffectiveDeploymentsRequest\nListEffectiveDeploymentsResponse\nListElasticsearchInstanceTypesRequest\nListElasticsearchInstanceTypesResponse\nListElasticsearchVersionsRequest\nListElasticsearchVersionsResponse\nListEmailIdentitiesRequest\nListEmailIdentitiesResponse\nListEmailTemplatesRequest\nListEmailTemplatesResponse\nListEnabledControlsInput\nListEnabledControlsOutput\nListEnabledProductsForImportRequest\nListEnabledProductsForImportResponse\nListEndpointAccessRequest\nListEndpointAccessResponse\nListEndpointConfigsInput\nListEndpointConfigsOutput\nListEndpointGroupsRequest\nListEndpointGroupsResponse\nListEndpointsByPlatformApplicationInput\nListEndpointsByPlatformApplicationResponse\nListEndpointsInput\nListEndpointsOutput\nListEndpointsRequest\nListEndpointsResponse\nListEndpointsResult\nListEngagementsRequest\nListEngagementsResult\nListEngineVersionsInput\nListEngineVersionsOutput\nListEngineVersionsRequest\nListEngineVersionsResponse\nListEntitiesDetectionJobsRequest\nListEntitiesDetectionJobsResponse\nListEntitiesDetectionV2JobsRequest\nListEntitiesDetectionV2JobsResponse\nListEntitiesForPolicyRequest\nListEntitiesForPolicyResponse\nListEntitiesRequest\nListEntitiesResponse\nListEntitledApplicationsRequest\nListEntitledApplicationsResult\nListEntitlementsRequest\nListEntitlementsResponse\nListEntityPersonasRequest\nListEntityPersonasResponse\nListEntityRecognizerSummariesRequest\nListEntityRecognizerSummariesResponse\nListEntityRecognizersRequest\nListEntityRecognizersResponse\nListEnvironmentAccountConnectionsInput\nListEnvironmentAccountConnectionsOutput\nListEnvironmentOutputsInput\nListEnvironmentOutputsOutput\nListEnvironmentProvisionedResourcesInput\nListEnvironmentProvisionedResourcesOutput\nListEnvironmentTemplateVersionsInput\nListEnvironmentTemplateVersionsOutput\nListEnvironmentTemplatesInput\nListEnvironmentTemplatesOutput\nListEnvironmentVpcsRequest\nListEnvironmentVpcsResponse\nListEnvironmentsInput\nListEnvironmentsOutput\nListEnvironmentsRequest\nListEnvironmentsResponse\nListEnvironmentsResult\nListEphemeridesRequest\nListEphemeridesResponse\nListEulaAcceptancesRequest\nListEulaAcceptancesResponse\nListEulasRequest\nListEulasResponse\nListEvaluationFormVersionsRequest\nListEvaluationFormVersionsResponse\nListEvaluationFormsRequest\nListEvaluationFormsResponse\nListEventActionsRequest\nListEventActionsResponse\nListEventBusesRequest\nListEventBusesResponse\nListEventConfigurationsRequest\nListEventConfigurationsResponse\nListEventDataStoresRequest\nListEventDataStoresResponse\nListEventIntegrationAssociationsRequest\nListEventIntegrationAssociationsResponse\nListEventIntegrationsRequest\nListEventIntegrationsResponse\nListEventLogsRequest\nListEventLogsResponse\nListEventPredictionsRequest\nListEventPredictionsResult\nListEventSourceMappingsRequest\nListEventSourceMappingsResponse\nListEventSourcesRequest\nListEventSourcesResponse\nListEventStreamsRequest\nListEventStreamsResponse\nListEventSubscriptionsRequest\nListEventSubscriptionsResponse\nListEventTrackersRequest\nListEventTrackersResponse\nListEventTypesFilter\nListEventTypesRequest\nListEventTypesResult\nListEventsDetectionJobsRequest\nListEventsDetectionJobsResponse\nListEventsFilters\nListEventsRequest\nListEventsResponse\nListExclusionsRequest\nListExclusionsResponse\nListExecutionsInput\nListExecutionsOutput\nListExecutionsRequest\nListExecutionsResponse\nListExecutorsRequest\nListExecutorsResponse\nListExperienceEntitiesRequest\nListExperienceEntitiesResponse\nListExperiencesRequest\nListExperiencesResponse\nListExperimentTemplatesRequest\nListExperimentTemplatesResponse\nListExperimentsRequest\nListExperimentsResponse\nListExplainabilitiesRequest\nListExplainabilitiesResponse\nListExplainabilityExportsRequest\nListExplainabilityExportsResponse\nListExportErrorsRequest\nListExportErrorsResponse\nListExportJobsRequest\nListExportJobsResponse\nListExportsInput\nListExportsOutput\nListExportsRequest\nListExportsRequestFilters\nListExportsResponse\nListExtensibleSourceServersRequest\nListExtensibleSourceServersResponse\nListExtensionAssociationsRequest\nListExtensionVersionsRequest\nListExtensionVersionsResult\nListExtensionsRequest\nListExtensionsResult\nListFHIRDatastoresRequest\nListFHIRDatastoresResponse\nListFHIRExportJobsRequest\nListFHIRExportJobsResponse\nListFHIRImportJobsRequest\nListFHIRImportJobsResponse\nListFacesRequest\nListFacesResponse\nListFacetAttributesRequest\nListFacetAttributesResponse\nListFacetNamesRequest\nListFacetNamesResponse\nListFailuresForLicenseConfigurationOperationsRequest\nListFailuresForLicenseConfigurationOperationsResponse\nListFaqsRequest\nListFaqsResponse\nListFargateProfilesRequest\nListFargateProfilesResponse\nListFeatureGroupsRequest\nListFeatureGroupsResponse\nListFeaturedResultsSetsRequest\nListFeaturedResultsSetsResponse\nListFeaturesRequest\nListFeaturesResponse\nListFieldLevelEncryptionConfigsRequest\nListFieldLevelEncryptionConfigsResult\nListFieldLevelEncryptionProfilesRequest\nListFieldLevelEncryptionProfilesResult\nListFieldOptionsRequest\nListFieldOptionsResponse\nListFieldsRequest\nListFieldsResponse\nListFileCommitHistoryRequest\nListFileCommitHistoryResponse\nListFileSharesInput\nListFileSharesOutput\nListFileSystemAssociationsInput\nListFileSystemAssociationsOutput\nListFiltersRequest\nListFiltersResponse\nListFindingAggregationsRequest\nListFindingAggregationsResponse\nListFindingAggregatorsRequest\nListFindingAggregatorsResponse\nListFindingsFiltersRequest\nListFindingsFiltersResponse\nListFindingsMetricsRequest\nListFindingsMetricsResponse\nListFindingsReportsRequest\nListFindingsReportsResponse\nListFindingsRequest\nListFindingsResponse\nListFirewallConfigsRequest\nListFirewallConfigsResponse\nListFirewallDomainListsRequest\nListFirewallDomainListsResponse\nListFirewallDomainsRequest\nListFirewallDomainsResponse\nListFirewallPoliciesRequest\nListFirewallPoliciesResponse\nListFirewallRuleGroupAssociationsRequest\nListFirewallRuleGroupAssociationsResponse\nListFirewallRuleGroupsRequest\nListFirewallRuleGroupsResponse\nListFirewallRulesRequest\nListFirewallRulesResponse\nListFirewallsRequest\nListFirewallsResponse\nListFleetMetricsRequest\nListFleetMetricsResponse\nListFleetsForVehicleRequest\nListFleetsForVehicleResponse\nListFleetsInput\nListFleetsOutput\nListFleetsRequest\nListFleetsResponse\nListFlowDefinitionsRequest\nListFlowDefinitionsResponse\nListFlowExecutionMessagesRequest\nListFlowExecutionMessagesResponse\nListFlowsRequest\nListFlowsResponse\nListFlywheelIterationHistoryRequest\nListFlywheelIterationHistoryResponse\nListFlywheelsRequest\nListFlywheelsResponse\nListFolderMembersRequest\nListFolderMembersResponse\nListFoldersRequest\nListFoldersResponse\nListForecastExportJobsRequest\nListForecastExportJobsResponse\nListForecastsRequest\nListForecastsResponse\nListFormsRequest\nListFormsResponse\nListFoundationModelsRequest\nListFoundationModelsResponse\nListFragmentsInput\nListFragmentsOutput\nListFrameworksInput\nListFrameworksOutput\nListFraudsterRegistrationJobsRequest\nListFraudsterRegistrationJobsResponse\nListFraudstersRequest\nListFraudstersResponse\nListFunctionDefinitionVersionsRequest\nListFunctionDefinitionVersionsResponse\nListFunctionDefinitionsRequest\nListFunctionDefinitionsResponse\nListFunctionEventInvokeConfigsRequest\nListFunctionEventInvokeConfigsResponse\nListFunctionUrlConfigsRequest\nListFunctionUrlConfigsResponse\nListFunctionsByCodeSigningConfigRequest\nListFunctionsByCodeSigningConfigResponse\nListFunctionsRequest\nListFunctionsResponse\nListFunctionsResult\nListFuotaTasksRequest\nListFuotaTasksResponse\nListGameServerGroupsInput\nListGameServerGroupsOutput\nListGameServersInput\nListGameServersOutput\nListGamesRequest\nListGamesResult\nListGatewayGroupsRequest\nListGatewayGroupsResponse\nListGatewayInstancesRequest\nListGatewayInstancesResponse\nListGatewayRoutesInput\nListGatewayRoutesOutput\nListGatewaysInput\nListGatewaysOutput\nListGatewaysRequest\nListGatewaysResponse\nListGeneratedCodeJobsRequest\nListGeneratedCodeJobsResult\nListGeoLocationsRequest\nListGeoLocationsResponse\nListGeoMatchSetsRequest\nListGeoMatchSetsResponse\nListGeofenceCollectionsRequest\nListGeofenceCollectionsResponse\nListGeofenceCollectionsResponseEntry\nListGeofenceResponseEntry\nListGeofencesRequest\nListGeofencesResponse\nListGitHubAccountTokenNamesInput\nListGitHubAccountTokenNamesOutput\nListGlobalTablesInput\nListGlobalTablesOutput\nListGrantsRequest\nListGrantsResponse\nListGraphqlApisRequest\nListGraphqlApisResponse\nListGraphsRequest\nListGraphsResponse\nListGremlinQueriesInput\nListGremlinQueriesOutput\nListGroundStationsRequest\nListGroundStationsResponse\nListGroupCertificateAuthoritiesRequest\nListGroupCertificateAuthoritiesResponse\nListGroupMembersRequest\nListGroupMembersResponse\nListGroupMembershipsForMemberRequest\nListGroupMembershipsForMemberResponse\nListGroupMembershipsRequest\nListGroupMembershipsResponse\nListGroupPoliciesRequest\nListGroupPoliciesResponse\nListGroupResourcesInput\nListGroupResourcesItem\nListGroupResourcesOutput\nListGroupResourcesRequest\nListGroupResourcesResponse\nListGroupVersionsRequest\nListGroupVersionsResponse\nListGroupsFilters\nListGroupsForEntityFilters\nListGroupsForEntityRequest\nListGroupsForEntityResponse\nListGroupsForUserRequest\nListGroupsForUserResponse\nListGroupsInput\nListGroupsOlderThanOrderingIdRequest\nListGroupsOlderThanOrderingIdResponse\nListGroupsOutput\nListGroupsRequest\nListGroupsResponse\nListHITsForQualificationTypeRequest\nListHITsForQualificationTypeResponse\nListHITsRequest\nListHITsResponse\nListHandshakesForAccountRequest\nListHandshakesForAccountResponse\nListHandshakesForOrganizationRequest\nListHandshakesForOrganizationResponse\nListHapgsRequest\nListHapgsResponse\nListHarvestJobsRequest\nListHarvestJobsResponse\nListHealthChecksRequest\nListHealthChecksResponse\nListHealthEventsInput\nListHealthEventsOutput\nListHlsManifestConfiguration\nListHostKeysRequest\nListHostKeysResponse\nListHostedConfigurationVersionsRequest\nListHostedZonesByNameRequest\nListHostedZonesByNameResponse\nListHostedZonesByVPCRequest\nListHostedZonesByVPCResponse\nListHostedZonesRequest\nListHostedZonesResponse\nListHostsInput\nListHostsOutput\nListHoursOfOperationsRequest\nListHoursOfOperationsResponse\nListHsmsRequest\nListHsmsResponse\nListHubContentVersionsRequest\nListHubContentVersionsResponse\nListHubContentsRequest\nListHubContentsResponse\nListHubsRequest\nListHubsResponse\nListHumanLoopsRequest\nListHumanLoopsResponse\nListHumanTaskUisRequest\nListHumanTaskUisResponse\nListHyperParameterTuningJobsRequest\nListHyperParameterTuningJobsResponse\nListHypervisorsInput\nListHypervisorsOutput\nListIAMPolicyAssignmentsForUserRequest\nListIAMPolicyAssignmentsForUserResponse\nListIAMPolicyAssignmentsRequest\nListIAMPolicyAssignmentsResponse\nListICD10CMInferenceJobsRequest\nListICD10CMInferenceJobsResponse\nListIPSetsRequest\nListIPSetsResponse\nListId\nListIdentitiesInput\nListIdentitiesRequest\nListIdentitiesResponse\nListIdentityPoliciesRequest\nListIdentityPoliciesResponse\nListIdentityPoolUsageRequest\nListIdentityPoolUsageResponse\nListIdentityPoolsInput\nListIdentityPoolsResponse\nListIdentityProviderConfigsRequest\nListIdentityProviderConfigsResponse\nListIdentityProvidersRequest\nListIdentityProvidersResponse\nListIdentityResolutionJobsRequest\nListIdentityResolutionJobsResponse\nListIdentitySourcesInput\nListIdentitySourcesOutput\nListImageBuildVersionsRequest\nListImageBuildVersionsResponse\nListImagePackagesRequest\nListImagePackagesResponse\nListImagePipelineImagesRequest\nListImagePipelineImagesResponse\nListImagePipelinesRequest\nListImagePipelinesResponse\nListImageRecipesRequest\nListImageRecipesResponse\nListImageScanFindingAggregationsRequest\nListImageScanFindingAggregationsResponse\nListImageScanFindingsRequest\nListImageScanFindingsResponse\nListImageSetVersionsRequest\nListImageSetVersionsResponse\nListImageVersionsRequest\nListImageVersionsResponse\nListImagesFilter\nListImagesInRecycleBinRequest\nListImagesInRecycleBinResult\nListImagesRequest\nListImagesResponse\nListImpersonationRolesRequest\nListImpersonationRolesResponse\nListImportErrorsRequest\nListImportErrorsResponse\nListImportFailuresRequest\nListImportFailuresResponse\nListImportFileTaskRequest\nListImportFileTaskResponse\nListImportJobsRequest\nListImportJobsResponse\nListImportsInput\nListImportsOutput\nListImportsRequest\nListImportsRequestFilters\nListImportsResponse\nListIncidentRecordsInput\nListIncidentRecordsOutput\nListIncomingTypedLinks\nListIncomingTypedLinksRequest\nListIncomingTypedLinksResponse\nListIndex\nListIndexRequest\nListIndexResponse\nListIndexesInput\nListIndexesOutput\nListIndicesRequest\nListIndicesResponse\nListInferenceEventsRequest\nListInferenceEventsResponse\nListInferenceExecutionsRequest\nListInferenceExecutionsResponse\nListInferenceExperimentsRequest\nListInferenceExperimentsResponse\nListInferenceRecommendationsJobStepsRequest\nListInferenceRecommendationsJobStepsResponse\nListInferenceRecommendationsJobsRequest\nListInferenceRecommendationsJobsResponse\nListInferenceSchedulersRequest\nListInferenceSchedulersResponse\nListInfrastructureConfigurationsRequest\nListInfrastructureConfigurationsResponse\nListIngestionDestinationsRequest\nListIngestionDestinationsResponse\nListIngestionsRequest\nListIngestionsResponse\nListInputDeviceTransfersRequest\nListInputDeviceTransfersResponse\nListInputDevicesRequest\nListInputDevicesResponse\nListInputRoutingsRequest\nListInputRoutingsResponse\nListInputSecurityGroupsRequest\nListInputSecurityGroupsResponse\nListInputsRequest\nListInputsResponse\nListInsightsAnyStatusFilter\nListInsightsClosedStatusFilter\nListInsightsOngoingStatusFilter\nListInsightsRequest\nListInsightsResponse\nListInsightsStatusFilter\nListInstalledComponentsRequest\nListInstalledComponentsResponse\nListInstanceAttributesRequest\nListInstanceAttributesResponse\nListInstanceFleetsInput\nListInstanceFleetsOutput\nListInstanceGroupsInput\nListInstanceGroupsOutput\nListInstanceProfileTagsRequest\nListInstanceProfileTagsResponse\nListInstanceProfilesForRoleRequest\nListInstanceProfilesForRoleResponse\nListInstanceProfilesRequest\nListInstanceProfilesResponse\nListInstanceProfilesResult\nListInstanceStorageConfigsRequest\nListInstanceStorageConfigsResponse\nListInstanceTypeDetailsRequest\nListInstanceTypeDetailsResponse\nListInstancesInput\nListInstancesOutput\nListInstancesRequest\nListInstancesResponse\nListIntegrationAssociationsRequest\nListIntegrationAssociationsResponse\nListIntegrationItem\nListIntegrationsRequest\nListIntegrationsResponse\nListIntentMetricsRequest\nListIntentMetricsResponse\nListIntentPathsRequest\nListIntentPathsResponse\nListIntentStageMetricsRequest\nListIntentStageMetricsResponse\nListIntentsRequest\nListIntentsResponse\nListInvalidationsRequest\nListInvalidationsResult\nListInventoryEntriesRequest\nListInventoryEntriesResult\nListInvitationsInput\nListInvitationsOutput\nListInvitationsRequest\nListInvitationsResponse\nListIpAccessSettingsRequest\nListIpAccessSettingsResponse\nListIpRoutesRequest\nListIpRoutesResult\nListItemsRequest\nListItemsResponse\nListJobExecutionsForJobRequest\nListJobExecutionsForJobResponse\nListJobExecutionsForThingRequest\nListJobExecutionsForThingResponse\nListJobRunsRequest\nListJobRunsResponse\nListJobTemplatesRequest\nListJobTemplatesResponse\nListJobsByPipelineRequest\nListJobsByPipelineResponse\nListJobsByStatusRequest\nListJobsByStatusResponse\nListJobsFilterCriteria\nListJobsFilterTerm\nListJobsInput\nListJobsOutput\nListJobsRequest\nListJobsResponse\nListJobsResult\nListJobsSortCriteria\nListJournalKinesisStreamsForLedgerRequest\nListJournalKinesisStreamsForLedgerResponse\nListJournalS3ExportsForLedgerRequest\nListJournalS3ExportsForLedgerResponse\nListJournalS3ExportsRequest\nListJournalS3ExportsResponse\nListJourneysRequest\nListJourneysResponse\nListKafkaVersionsRequest\nListKafkaVersionsResponse\nListKeyGroupsRequest\nListKeyGroupsResult\nListKeyPhrasesDetectionJobsRequest\nListKeyPhrasesDetectionJobsResponse\nListKeyPoliciesRequest\nListKeyPoliciesResponse\nListKeysInput\nListKeysOutput\nListKeysRequest\nListKeysResponse\nListKeysResponseEntry\nListKeyspacesRequest\nListKeyspacesResponse\nListKeywordsForDataSourceRequest\nListKeywordsForDataSourceResponse\nListKnowledgeBasesRequest\nListKnowledgeBasesResponse\nListKxChangesetsRequest\nListKxChangesetsResponse\nListKxClusterNodesRequest\nListKxClusterNodesResponse\nListKxClustersRequest\nListKxClustersResponse\nListKxDatabasesRequest\nListKxDatabasesResponse\nListKxEnvironmentsRequest\nListKxEnvironmentsResponse\nListKxUsersRequest\nListKxUsersResponse\nListLFTagsRequest\nListLFTagsResponse\nListLabelGroupsRequest\nListLabelGroupsResponse\nListLabelingJobsForWorkteamRequest\nListLabelingJobsForWorkteamResponse\nListLabelingJobsRequest\nListLabelingJobsResponse\nListLabelsRequest\nListLabelsResponse\nListLakeFormationOptInsRequest\nListLakeFormationOptInsResponse\nListLambdaFunctionsRequest\nListLambdaFunctionsResponse\nListLanguageModelsRequest\nListLanguageModelsResponse\nListLanguagesRequest\nListLanguagesResponse\nListLaunchActionsRequest\nListLaunchActionsResponse\nListLaunchPathsInput\nListLaunchPathsOutput\nListLaunchProfileMembersRequest\nListLaunchProfileMembersResponse\nListLaunchProfilesRequest\nListLaunchProfilesResponse\nListLaunchesRequest\nListLaunchesResponse\nListLayerVersionsRequest\nListLayerVersionsResponse\nListLayersRequest\nListLayersResponse\nListLayoutsRequest\nListLayoutsResponse\nListLedgersRequest\nListLedgersResponse\nListLegalHoldsInput\nListLegalHoldsOutput\nListLensReviewImprovementsInput\nListLensReviewImprovementsOutput\nListLensReviewsInput\nListLensReviewsOutput\nListLensSharesInput\nListLensSharesOutput\nListLensesInput\nListLensesOutput\nListLexBotsRequest\nListLexBotsResponse\nListLexiconsInput\nListLexiconsOutput\nListLicenseConfigurationsRequest\nListLicenseConfigurationsResponse\nListLicenseConversionTasksRequest\nListLicenseConversionTasksResponse\nListLicenseManagerReportGeneratorsRequest\nListLicenseManagerReportGeneratorsResponse\nListLicenseSpecificationsForResourceRequest\nListLicenseSpecificationsForResourceResponse\nListLicenseVersionsRequest\nListLicenseVersionsResponse\nListLicensesRequest\nListLicensesResponse\nListLineageGroupsRequest\nListLineageGroupsResponse\nListLinksInput\nListLinksItem\nListLinksOutput\nListLinuxSubscriptionInstancesRequest\nListLinuxSubscriptionInstancesResponse\nListLinuxSubscriptionsRequest\nListLinuxSubscriptionsResponse\nListListenersRequest\nListListenersResponse\nListLiveSourcesRequest\nListLiveSourcesResponse\nListLoaderJobsInput\nListLoaderJobsOutput\nListLocalDisksInput\nListLocalDisksOutput\nListLocationsInput\nListLocationsOutput\nListLocationsRequest\nListLocationsResponse\nListLogPatternSetsRequest\nListLogPatternSetsResponse\nListLogPatternsRequest\nListLogPatternsResponse\nListLogSourcesRequest\nListLogSourcesResponse\nListLogSubscriptionsRequest\nListLogSubscriptionsResult\nListLoggerDefinitionVersionsRequest\nListLoggerDefinitionVersionsResponse\nListLoggerDefinitionsRequest\nListLoggerDefinitionsResponse\nListLoggingConfigurationsRequest\nListLoggingConfigurationsResponse\nListLongTermPricingRequest\nListLongTermPricingResult\nListLowLatencyHlsManifestConfiguration\nListLunaClientsRequest\nListLunaClientsResponse\nListMFADeviceTagsRequest\nListMFADeviceTagsResponse\nListMFADevicesRequest\nListMFADevicesResponse\nListMLDataProcessingJobsInput\nListMLDataProcessingJobsOutput\nListMLEndpointsInput\nListMLEndpointsOutput\nListMLModelTrainingJobsInput\nListMLModelTrainingJobsOutput\nListMLModelTransformJobsInput\nListMLModelTransformJobsOutput\nListMLTransformsRequest\nListMLTransformsResponse\nListMailDomainsRequest\nListMailDomainsResponse\nListMailboxExportJobsRequest\nListMailboxExportJobsResponse\nListMailboxPermissionsRequest\nListMailboxPermissionsResponse\nListManagedAccountsRequest\nListManagedAccountsResponse\nListManagedDataIdentifiersRequest\nListManagedDataIdentifiersResponse\nListManagedEndpointsRequest\nListManagedEndpointsResponse\nListManagedInsightRulesInput\nListManagedInsightRulesOutput\nListManagedJobTemplatesRequest\nListManagedJobTemplatesResponse\nListManagedPoliciesInPermissionSetRequest\nListManagedPoliciesInPermissionSetResponse\nListManagedResourcesRequest\nListManagedResourcesResponse\nListManagedRuleSetsRequest\nListManagedRuleSetsResponse\nListManagedSchemaArnsRequest\nListManagedSchemaArnsResponse\nListManagementOptions\nListMapRunsInput\nListMapRunsOutput\nListMapsRequest\nListMapsResponse\nListMapsResponseEntry\nListMatchingJobsInput\nListMatchingJobsOutput\nListMatchingWorkflowsInput\nListMatchingWorkflowsOutput\nListMediaCapturePipelinesRequest\nListMediaCapturePipelinesResponse\nListMediaInsightsPipelineConfigurationsRequest\nListMediaInsightsPipelineConfigurationsResponse\nListMediaPipelineKinesisVideoStreamPoolsRequest\nListMediaPipelineKinesisVideoStreamPoolsResponse\nListMediaPipelinesRequest\nListMediaPipelinesResponse\nListMedicalTranscriptionJobsRequest\nListMedicalTranscriptionJobsResponse\nListMedicalVocabulariesRequest\nListMedicalVocabulariesResponse\nListMeetingTagsRequest\nListMeetingTagsResponse\nListMeetingsRequest\nListMeetingsResponse\nListMemberAccountsRequest\nListMemberAccountsResponse\nListMemberAccountsResult\nListMembersInput\nListMembersOutput\nListMembersRequest\nListMembersResponse\nListMembershipsInput\nListMembershipsOutput\nListMeshesInput\nListMeshesOutput\nListMessageMoveTasksRequest\nListMessageMoveTasksResult\nListMessageMoveTasksResultEntry\nListMetricAttributionMetricsRequest\nListMetricAttributionMetricsResponse\nListMetricAttributionsRequest\nListMetricAttributionsResponse\nListMetricSetsRequest\nListMetricSetsResponse\nListMetricStreamsInput\nListMetricStreamsOutput\nListMetricValuesRequest\nListMetricValuesResponse\nListMetricsInput\nListMetricsOutput\nListMigrationTasksRequest\nListMigrationTasksResult\nListMigrationWorkflowTemplatesRequest\nListMigrationWorkflowTemplatesResponse\nListMigrationWorkflowsRequest\nListMigrationWorkflowsResponse\nListMilestonesInput\nListMilestonesOutput\nListMissionProfilesRequest\nListMissionProfilesResponse\nListMitigationActionsRequest\nListMitigationActionsResponse\nListMobileDeviceAccessOverridesRequest\nListMobileDeviceAccessOverridesResponse\nListMobileDeviceAccessRulesRequest\nListMobileDeviceAccessRulesResponse\nListMobileSdkReleasesRequest\nListMobileSdkReleasesResponse\nListModelBiasJobDefinitionsRequest\nListModelBiasJobDefinitionsResponse\nListModelCardExportJobsRequest\nListModelCardExportJobsResponse\nListModelCardVersionsRequest\nListModelCardVersionsResponse\nListModelCardsRequest\nListModelCardsResponse\nListModelCustomizationJobsRequest\nListModelCustomizationJobsResponse\nListModelExplainabilityJobDefinitionsRequest\nListModelExplainabilityJobDefinitionsResponse\nListModelManifestNodesRequest\nListModelManifestNodesResponse\nListModelManifestsRequest\nListModelManifestsResponse\nListModelMetadataRequest\nListModelMetadataResponse\nListModelPackageGroupsInput\nListModelPackageGroupsOutput\nListModelPackagesInput\nListModelPackagesOutput\nListModelPackagingJobsRequest\nListModelPackagingJobsResponse\nListModelQualityJobDefinitionsRequest\nListModelQualityJobDefinitionsResponse\nListModelVersionsRequest\nListModelVersionsResponse\nListModelsInput\nListModelsOutput\nListModelsRequest\nListModelsResponse\nListMonitorEvaluationsRequest\nListMonitorEvaluationsResponse\nListMonitoredResourcesFilters\nListMonitoredResourcesRequest\nListMonitoredResourcesResponse\nListMonitoringAlertHistoryRequest\nListMonitoringAlertHistoryResponse\nListMonitoringAlertsRequest\nListMonitoringAlertsResponse\nListMonitoringExecutionsRequest\nListMonitoringExecutionsResponse\nListMonitoringSchedulesRequest\nListMonitoringSchedulesResponse\nListMonitorsInput\nListMonitorsOutput\nListMonitorsRequest\nListMonitorsResponse\nListMultiRegionAccessPointsRequest\nListMultiRegionAccessPointsResult\nListMulticastGroupsByFuotaTaskRequest\nListMulticastGroupsByFuotaTaskResponse\nListMulticastGroupsRequest\nListMulticastGroupsResponse\nListMultipartReadSetUploadsRequest\nListMultipartReadSetUploadsResponse\nListMultipartUploadsInput\nListMultipartUploadsOutput\nListMultipartUploadsRequest\nListMultiplexProgramsRequest\nListMultiplexProgramsResponse\nListMultiplexesRequest\nListMultiplexesResponse\nListName\nListNamedQueriesInput\nListNamedQueriesOutput\nListNamedShadowsForThingRequest\nListNamedShadowsForThingResponse\nListNamespacesRequest\nListNamespacesResponse\nListNetworkAnalyzerConfigurationsRequest\nListNetworkAnalyzerConfigurationsResponse\nListNetworkProfilesRequest\nListNetworkProfilesResult\nListNetworkResourcesRequest\nListNetworkResourcesResponse\nListNetworkSettingsRequest\nListNetworkSettingsResponse\nListNetworkSitesRequest\nListNetworkSitesResponse\nListNetworksInput\nListNetworksOutput\nListNetworksRequest\nListNetworksResponse\nListNodeFromTemplateJobsRequest\nListNodeFromTemplateJobsResponse\nListNodegroupsRequest\nListNodegroupsResponse\nListNodesInput\nListNodesOutput\nListNodesRequest\nListNodesResponse\nListNotebookExecutionsInput\nListNotebookExecutionsOutput\nListNotebookInstanceLifecycleConfigsInput\nListNotebookInstanceLifecycleConfigsOutput\nListNotebookInstancesInput\nListNotebookInstancesOutput\nListNotebookMetadataInput\nListNotebookMetadataOutput\nListNotebookSessionsRequest\nListNotebookSessionsResponse\nListNotificationChannelsRequest\nListNotificationChannelsResponse\nListNotificationRulesFilter\nListNotificationRulesRequest\nListNotificationRulesResult\nListNotificationsInput\nListNotificationsOutput\nListNotificationsRequest\nListNotificationsResponse\nListOTAUpdatesRequest\nListOTAUpdatesResponse\nListObjectAttributes\nListObjectAttributesRequest\nListObjectAttributesResponse\nListObjectChildren\nListObjectChildrenRequest\nListObjectChildrenResponse\nListObjectParentPaths\nListObjectParentPathsRequest\nListObjectParentPathsResponse\nListObjectParents\nListObjectParentsRequest\nListObjectParentsResponse\nListObjectPolicies\nListObjectPoliciesRequest\nListObjectPoliciesResponse\nListObjectVersionsOutput\nListObjectVersionsRequest\nListObjectsInput\nListObjectsOutput\nListObjectsRequest\nListObjectsV2Output\nListObjectsV2Request\nListObservabilityConfigurationsRequest\nListObservabilityConfigurationsResponse\nListOfTags\nListOfferingPromotionsRequest\nListOfferingPromotionsResult\nListOfferingTransactionsRequest\nListOfferingTransactionsResult\nListOfferingsRequest\nListOfferingsResponse\nListOfferingsResult\nListOnPremisesInstancesInput\nListOnPremisesInstancesOutput\nListOpenCypherQueriesInput\nListOpenCypherQueriesOutput\nListOpenIDConnectProviderTagsRequest\nListOpenIDConnectProviderTagsResponse\nListOpenIDConnectProvidersResponse\nListOpenWorkflowExecutionsInput\nListOperationsInput\nListOperationsOutput\nListOperationsRequest\nListOperationsResponse\nListOpsItemEventsRequest\nListOpsItemEventsResponse\nListOpsItemRelatedItemsRequest\nListOpsItemRelatedItemsResponse\nListOpsMetadataRequest\nListOpsMetadataResult\nListOrdersInput\nListOrdersOutput\nListOrdersRequest\nListOrdersResponse\nListOrganizationAdminAccountsRequest\nListOrganizationAdminAccountsResponse\nListOrganizationInsightsRequest\nListOrganizationInsightsResponse\nListOrganizationPortfolioAccessInput\nListOrganizationPortfolioAccessOutput\nListOrganizationServiceAccessStatusRequest\nListOrganizationServiceAccessStatusResponse\nListOrganizationalUnitsForParentRequest\nListOrganizationalUnitsForParentResponse\nListOrganizationsRequest\nListOrganizationsResponse\nListOriginAccessControlsRequest\nListOriginAccessControlsResult\nListOriginEndpointsRequest\nListOriginEndpointsResponse\nListOriginRequestPoliciesRequest\nListOriginRequestPoliciesResult\nListOriginationNumbersRequest\nListOriginationNumbersResult\nListOutgoingCertificatesRequest\nListOutgoingCertificatesResponse\nListOutgoingTypedLinks\nListOutgoingTypedLinksRequest\nListOutgoingTypedLinksResponse\nListOutpostResolversRequest\nListOutpostResolversResponse\nListOutpostsInput\nListOutpostsOutput\nListOutpostsWithS3Request\nListOutpostsWithS3Result\nListPHIDetectionJobsRequest\nListPHIDetectionJobsResponse\nListPackageImportJobsRequest\nListPackageImportJobsResponse\nListPackageVersionAssetsRequest\nListPackageVersionAssetsResult\nListPackageVersionDependenciesRequest\nListPackageVersionDependenciesResult\nListPackageVersionsRequest\nListPackageVersionsResponse\nListPackageVersionsResult\nListPackagesForDomainRequest\nListPackagesForDomainResponse\nListPackagesRequest\nListPackagesResponse\nListPackagesResult\nListPackagingConfigurationsRequest\nListPackagingConfigurationsResponse\nListPackagingGroupsRequest\nListPackagingGroupsResponse\nListPageReceiptsRequest\nListPageReceiptsResult\nListPageResolutionsRequest\nListPageResolutionsResult\nListPagesByContactRequest\nListPagesByContactResult\nListPagesByEngagementRequest\nListPagesByEngagementResult\nListParallelDataRequest\nListParallelDataResponse\nListParentsRequest\nListParentsResponse\nListParticipantEventsRequest\nListParticipantEventsResponse\nListParticipantsRequest\nListParticipantsResponse\nListPartnerAccountsRequest\nListPartnerAccountsResponse\nListPartnerEventSourceAccountsRequest\nListPartnerEventSourceAccountsResponse\nListPartnerEventSourcesRequest\nListPartnerEventSourcesResponse\nListPartsInput\nListPartsOutput\nListPartsRequest\nListPeeringsRequest\nListPeeringsResponse\nListPendingInvitationResourcesRequest\nListPendingInvitationResourcesResponse\nListPerformanceAnalysisReportsRequest\nListPerformanceAnalysisReportsResponse\nListPermissionAssociationsRequest\nListPermissionAssociationsResponse\nListPermissionGroupsByUserRequest\nListPermissionGroupsByUserResponse\nListPermissionGroupsRequest\nListPermissionGroupsResponse\nListPermissionSetProvisioningStatusRequest\nListPermissionSetProvisioningStatusResponse\nListPermissionSetsProvisionedToAccountRequest\nListPermissionSetsProvisionedToAccountResponse\nListPermissionSetsRequest\nListPermissionSetsResponse\nListPermissionVersionsRequest\nListPermissionVersionsResponse\nListPermissionsRequest\nListPermissionsResponse\nListPhoneNumberOrdersRequest\nListPhoneNumberOrdersResponse\nListPhoneNumbersOptedOutInput\nListPhoneNumbersOptedOutResponse\nListPhoneNumbersRequest\nListPhoneNumbersResponse\nListPhoneNumbersSummary\nListPhoneNumbersSummaryList\nListPhoneNumbersV2Request\nListPhoneNumbersV2Response\nListPickupLocationsRequest\nListPickupLocationsResult\nListPiiEntitiesDetectionJobsRequest\nListPiiEntitiesDetectionJobsResponse\nListPipelineBlueprintsResponse\nListPipelineExecutionStepsRequest\nListPipelineExecutionStepsResponse\nListPipelineExecutionsInput\nListPipelineExecutionsOutput\nListPipelineExecutionsRequest\nListPipelineExecutionsResponse\nListPipelineParametersForExecutionRequest\nListPipelineParametersForExecutionResponse\nListPipelinesInput\nListPipelinesOutput\nListPipelinesRequest\nListPipelinesResponse\nListPipesRequest\nListPipesResponse\nListPlaceIndexesRequest\nListPlaceIndexesResponse\nListPlaceIndexesResponseEntry\nListPlacementsRequest\nListPlacementsResponse\nListPlatformApplicationsInput\nListPlatformApplicationsResponse\nListPlatformBranchesRequest\nListPlatformBranchesResult\nListPlatformVersionsRequest\nListPlatformVersionsResult\nListPlaybackConfigurationsRequest\nListPlaybackConfigurationsResponse\nListPlaybackKeyPairsRequest\nListPlaybackKeyPairsResponse\nListPluginsRequest\nListPluginsResponse\nListPoliciesForTargetRequest\nListPoliciesForTargetResponse\nListPoliciesGrantingServiceAccessEntry\nListPoliciesGrantingServiceAccessRequest\nListPoliciesGrantingServiceAccessResponse\nListPoliciesInput\nListPoliciesOutput\nListPoliciesRequest\nListPoliciesResponse\nListPolicyAttachments\nListPolicyAttachmentsRequest\nListPolicyAttachmentsResponse\nListPolicyGenerationsRequest\nListPolicyGenerationsResponse\nListPolicyPrincipalsRequest\nListPolicyPrincipalsResponse\nListPolicyStoresInput\nListPolicyStoresOutput\nListPolicyTagsRequest\nListPolicyTagsResponse\nListPolicyTemplatesInput\nListPolicyTemplatesOutput\nListPolicyVersionsRequest\nListPolicyVersionsResponse\nListPoolOriginationIdentitiesRequest\nListPoolOriginationIdentitiesResult\nListPortalsRequest\nListPortalsResponse\nListPortfolioAccessInput\nListPortfolioAccessOutput\nListPortfoliosForProductInput\nListPortfoliosForProductOutput\nListPortfoliosInput\nListPortfoliosOutput\nListPositionConfigurationsRequest\nListPositionConfigurationsResponse\nListPredictorBacktestExportJobsRequest\nListPredictorBacktestExportJobsResponse\nListPredictorsRequest\nListPredictorsResponse\nListPrefetchSchedulesRequest\nListPrefetchSchedulesResponse\nListPreparedStatementsInput\nListPreparedStatementsOutput\nListPresetsRequest\nListPresetsResponse\nListPreviewRotationShiftsRequest\nListPreviewRotationShiftsResult\nListPriceListsRequest\nListPriceListsResponse\nListPricesRequest\nListPricesResponse\nListPricingPlansAssociatedWithPricingRuleInput\nListPricingPlansAssociatedWithPricingRuleOutput\nListPricingPlansFilter\nListPricingPlansInput\nListPricingPlansOutput\nListPricingRulesAssociatedToPricingPlanInput\nListPricingRulesAssociatedToPricingPlanOutput\nListPricingRulesFilter\nListPricingRulesInput\nListPricingRulesOutput\nListPrincipalPoliciesRequest\nListPrincipalPoliciesResponse\nListPrincipalThingsRequest\nListPrincipalThingsResponse\nListPrincipalsForPortfolioInput\nListPrincipalsForPortfolioOutput\nListPrincipalsRequest\nListPrincipalsResponse\nListProblemsRequest\nListProblemsResponse\nListProcessingJobsRequest\nListProcessingJobsResponse\nListProductSubscriptionsRequest\nListProductSubscriptionsResponse\nListProfileNotificationsInput\nListProfileNotificationsOutput\nListProfileObjectTypeItem\nListProfileObjectTypeTemplateItem\nListProfileObjectTypeTemplatesRequest\nListProfileObjectTypeTemplatesResponse\nListProfileObjectTypesRequest\nListProfileObjectTypesResponse\nListProfileObjectsItem\nListProfileObjectsRequest\nListProfileObjectsResponse\nListProfilePermissionsRequest\nListProfilePermissionsResponse\nListProfileSharesInput\nListProfileSharesOutput\nListProfileTimesRequest\nListProfileTimesResponse\nListProfilesInput\nListProfilesOutput\nListProfilesRequest\nListProfilesResponse\nListProfilingGroupsRequest\nListProfilingGroupsResponse\nListProgressUpdateStreamsRequest\nListProgressUpdateStreamsResult\nListProjectAssetsRequest\nListProjectAssetsResponse\nListProjectPoliciesRequest\nListProjectPoliciesResponse\nListProjectsInput\nListProjectsOutput\nListProjectsRequest\nListProjectsResponse\nListProjectsResult\nListPromptsRequest\nListPromptsResponse\nListProposalVotesInput\nListProposalVotesOutput\nListProposalsInput\nListProposalsOutput\nListProtectedQueriesInput\nListProtectedQueriesOutput\nListProtectedResourcesByBackupVaultInput\nListProtectedResourcesByBackupVaultOutput\nListProtectedResourcesInput\nListProtectedResourcesOutput\nListProtectionGroupsRequest\nListProtectionGroupsResponse\nListProtectionsRequest\nListProtectionsResponse\nListProtocolsListsRequest\nListProtocolsListsResponse\nListProvisionedCapacityInput\nListProvisionedCapacityOutput\nListProvisionedConcurrencyConfigsRequest\nListProvisionedConcurrencyConfigsResponse\nListProvisionedModelThroughputsRequest\nListProvisionedModelThroughputsResponse\nListProvisionedProductPlansInput\nListProvisionedProductPlansOutput\nListProvisioningArtifactsForServiceActionInput\nListProvisioningArtifactsForServiceActionOutput\nListProvisioningArtifactsInput\nListProvisioningArtifactsOutput\nListProvisioningTemplateVersionsRequest\nListProvisioningTemplateVersionsResponse\nListProvisioningTemplatesRequest\nListProvisioningTemplatesResponse\nListProxySessionsRequest\nListProxySessionsResponse\nListPublicKeysRequest\nListPublicKeysResponse\nListPublicKeysResult\nListPublishedSchemaArnsRequest\nListPublishedSchemaArnsResponse\nListPublishingDestinationsRequest\nListPublishingDestinationsResponse\nListPullRequestsInput\nListPullRequestsOutput\nListQualificationRequestsRequest\nListQualificationRequestsResponse\nListQualificationTypesRequest\nListQualificationTypesResponse\nListQueriesRequest\nListQueriesResponse\nListQueryExecutionsInput\nListQueryExecutionsOutput\nListQueryLoggingConfigsRequest\nListQueryLoggingConfigsResponse\nListQuerySuggestionsBlockListsRequest\nListQuerySuggestionsBlockListsResponse\nListQueueQuickConnectsRequest\nListQueueQuickConnectsResponse\nListQueueTagsRequest\nListQueueTagsResult\nListQueuedMessagesRequest\nListQueuedMessagesResponse\nListQueuesRequest\nListQueuesResponse\nListQueuesResult\nListQuickConnectsRequest\nListQuickConnectsResponse\nListRasterDataCollectionsInput\nListRasterDataCollectionsOutput\nListRateBasedRulesRequest\nListRateBasedRulesResponse\nListReadSetActivationJobsRequest\nListReadSetActivationJobsResponse\nListReadSetExportJobsRequest\nListReadSetExportJobsResponse\nListReadSetImportJobsRequest\nListReadSetImportJobsResponse\nListReadSetUploadPartsRequest\nListReadSetUploadPartsResponse\nListReadSetsRequest\nListReadSetsResponse\nListReadinessChecksRequest\nListReadinessChecksResponse\nListRealtimeContactAnalysisSegmentsRequest\nListRealtimeContactAnalysisSegmentsResponse\nListRealtimeLogConfigsRequest\nListRealtimeLogConfigsResult\nListReceiptFiltersResponse\nListReceiptRuleSetsRequest\nListReceiptRuleSetsResponse\nListReceivedGrantsForOrganizationRequest\nListReceivedGrantsForOrganizationResponse\nListReceivedGrantsRequest\nListReceivedGrantsResponse\nListReceivedLicensesForOrganizationRequest\nListReceivedLicensesForOrganizationResponse\nListReceivedLicensesRequest\nListReceivedLicensesResponse\nListRecipeVersionsRequest\nListRecipeVersionsResponse\nListRecipesRequest\nListRecipesResponse\nListRecommendationFeedbackRequest\nListRecommendationFeedbackResponse\nListRecommendationTemplatesRequest\nListRecommendationTemplatesResponse\nListRecommendationsRequest\nListRecommendationsResponse\nListRecommendedIntentsRequest\nListRecommendedIntentsResponse\nListRecommenderConfigurationsResponse\nListRecommendersRequest\nListRecommendersResponse\nListRecordHistoryInput\nListRecordHistoryOutput\nListRecordHistorySearchFilter\nListRecordingConfigurationsRequest\nListRecordingConfigurationsResponse\nListRecordsRequest\nListRecordsResponse\nListRecoveryGroupsRequest\nListRecoveryGroupsResponse\nListRecoveryPointsByBackupVaultInput\nListRecoveryPointsByBackupVaultOutput\nListRecoveryPointsByLegalHoldInput\nListRecoveryPointsByLegalHoldOutput\nListRecoveryPointsByResourceInput\nListRecoveryPointsByResourceOutput\nListRecoveryPointsRequest\nListRecoveryPointsResponse\nListReferenceImportJobsRequest\nListReferenceImportJobsResponse\nListReferenceStoresRequest\nListReferenceStoresResponse\nListReferencesRequest\nListReferencesResponse\nListRefreshSchedulesRequest\nListRefreshSchedulesResponse\nListRegexMatchSetsRequest\nListRegexMatchSetsResponse\nListRegexPatternSetsRequest\nListRegexPatternSetsResponse\nListRegionalBucketsRequest\nListRegionalBucketsResult\nListRegionsRequest\nListRegionsResponse\nListRegistriesInput\nListRegistriesRequest\nListRegistriesResponse\nListRelatedItemsInput\nListRelatedItemsOutput\nListRelatedResourcesForAuditFindingRequest\nListRelatedResourcesForAuditFindingResponse\nListReleaseLabelsInput\nListReleaseLabelsOutput\nListRemoteAccessSessionsRequest\nListRemoteAccessSessionsResult\nListReplacePermissionAssociationsWorkRequest\nListReplacePermissionAssociationsWorkResponse\nListReplaysRequest\nListReplaysResponse\nListReplicationSetsInput\nListReplicationSetsOutput\nListReportDefinitionsRequest\nListReportDefinitionsResult\nListReportGroupsInput\nListReportGroupsOutput\nListReportJobsInput\nListReportJobsOutput\nListReportPlansInput\nListReportPlansOutput\nListReportsForReportGroupInput\nListReportsForReportGroupOutput\nListReportsInput\nListReportsOutput\nListRepositoriesForApprovalRuleTemplateInput\nListRepositoriesForApprovalRuleTemplateOutput\nListRepositoriesInDomainRequest\nListRepositoriesInDomainResult\nListRepositoriesInput\nListRepositoriesOutput\nListRepositoriesRequest\nListRepositoriesResult\nListRepositoryAssociationsRequest\nListRepositoryAssociationsResponse\nListRepositorySyncDefinitionsInput\nListRepositorySyncDefinitionsOutput\nListRequest\nListRequestedServiceQuotaChangeHistoryByQuotaRequest\nListRequestedServiceQuotaChangeHistoryByQuotaResponse\nListRequestedServiceQuotaChangeHistoryRequest\nListRequestedServiceQuotaChangeHistoryResponse\nListRescoreExecutionPlansRequest\nListRescoreExecutionPlansResponse\nListReservationsRequest\nListReservationsResponse\nListResiliencyPoliciesRequest\nListResiliencyPoliciesResponse\nListResolverConfigsRequest\nListResolverConfigsResponse\nListResolverDnssecConfigsRequest\nListResolverDnssecConfigsResponse\nListResolverEndpointIpAddressesRequest\nListResolverEndpointIpAddressesResponse\nListResolverEndpointsRequest\nListResolverEndpointsResponse\nListResolverQueryLogConfigAssociationsRequest\nListResolverQueryLogConfigAssociationsResponse\nListResolverQueryLogConfigsRequest\nListResolverQueryLogConfigsResponse\nListResolverRuleAssociationsRequest\nListResolverRuleAssociationsResponse\nListResolverRulesRequest\nListResolverRulesResponse\nListResolversByFunctionRequest\nListResolversByFunctionResponse\nListResolversRequest\nListResolversResponse\nListResourceCatalogsRequest\nListResourceCatalogsResponse\nListResourceComplianceSummariesRequest\nListResourceComplianceSummariesResult\nListResourceDataSyncRequest\nListResourceDataSyncResult\nListResourceDefinitionVersionsRequest\nListResourceDefinitionVersionsResponse\nListResourceDefinitionsRequest\nListResourceDefinitionsResponse\nListResourceDelegatesRequest\nListResourceDelegatesResponse\nListResourceEvaluationsRequest\nListResourceEvaluationsResponse\nListResourceInventoryRequest\nListResourceInventoryResponse\nListResourcePoliciesRequest\nListResourcePoliciesResult\nListResourceProfileArtifactsRequest\nListResourceProfileArtifactsResponse\nListResourceProfileDetectionsRequest\nListResourceProfileDetectionsResponse\nListResourceRecordSetsRequest\nListResourceRecordSetsResponse\nListResourceRequestsInput\nListResourceRequestsOutput\nListResourceServersRequest\nListResourceServersResponse\nListResourceSetResourcesRequest\nListResourceSetResourcesResponse\nListResourceSetsRequest\nListResourceSetsResponse\nListResourceSharePermissionsRequest\nListResourceSharePermissionsResponse\nListResourceTagsRequest\nListResourceTagsResponse\nListResourceTypesRequest\nListResourceTypesResponse\nListResourcesAssociatedToCustomLineItemFilter\nListResourcesAssociatedToCustomLineItemInput\nListResourcesAssociatedToCustomLineItemOutput\nListResourcesAssociatedToCustomLineItemResponseElement\nListResourcesFilters\nListResourcesForTagOptionInput\nListResourcesForTagOptionOutput\nListResourcesForWebACLRequest\nListResourcesForWebACLResponse\nListResourcesInProtectionGroupRequest\nListResourcesInProtectionGroupResponse\nListResourcesInput\nListResourcesOutput\nListResourcesRequest\nListResourcesResponse\nListResourcesResult\nListResponseHeadersPoliciesRequest\nListResponseHeadersPoliciesResult\nListResponsePlansInput\nListResponsePlansOutput\nListRestoreJobsInput\nListRestoreJobsOutput\nListRetainedMessagesRequest\nListRetainedMessagesResponse\nListRetirableGrantsRequest\nListRetrainingSchedulersRequest\nListRetrainingSchedulersResponse\nListReusableDelegationSetsRequest\nListReusableDelegationSetsResponse\nListReviewPolicyResultsForHITRequest\nListReviewPolicyResultsForHITResponse\nListReviewableHITsRequest\nListReviewableHITsResponse\nListRevisionAssetsRequest\nListRevisionAssetsResponse\nListRobotApplicationsRequest\nListRobotApplicationsResponse\nListRobotsRequest\nListRobotsResponse\nListRoleAliasesRequest\nListRoleAliasesResponse\nListRolePoliciesRequest\nListRolePoliciesResponse\nListRoleTagsRequest\nListRoleTagsResponse\nListRolesRequest\nListRolesResponse\nListRoomMembershipsRequest\nListRoomMembershipsResponse\nListRoomsRequest\nListRoomsResponse\nListRootsRequest\nListRootsResponse\nListRotationOverridesRequest\nListRotationOverridesResult\nListRotationShiftsRequest\nListRotationShiftsResult\nListRotationsRequest\nListRotationsResult\nListRouteCalculatorsRequest\nListRouteCalculatorsResponse\nListRouteCalculatorsResponseEntry\nListRoutesInput\nListRoutesOutput\nListRoutesRequest\nListRoutesResponse\nListRoutingControlsRequest\nListRoutingControlsResponse\nListRoutingProfileQueuesRequest\nListRoutingProfileQueuesResponse\nListRoutingProfilesRequest\nListRoutingProfilesResponse\nListRuleBasedMatchesRequest\nListRuleBasedMatchesResponse\nListRuleGroupsNamespacesRequest\nListRuleGroupsNamespacesResponse\nListRuleGroupsRequest\nListRuleGroupsResponse\nListRuleNamesByTargetRequest\nListRuleNamesByTargetResponse\nListRulesOutput\nListRulesPackagesRequest\nListRulesPackagesResponse\nListRulesRequest\nListRulesResponse\nListRulesetsRequest\nListRulesetsResponse\nListRumMetricsDestinationsRequest\nListRumMetricsDestinationsResponse\nListRunGroupsRequest\nListRunGroupsResponse\nListRunTasksRequest\nListRunTasksResponse\nListRunsRequest\nListRunsResponse\nListRunsResult\nListRxNormInferenceJobsRequest\nListRxNormInferenceJobsResponse\nListS3BucketsRequest\nListS3BucketsResponse\nListS3ResourcesRequest\nListS3ResourcesResult\nListSAMLProviderTagsRequest\nListSAMLProviderTagsResponse\nListSAMLProvidersResponse\nListSMSSandboxPhoneNumbersInput\nListSMSSandboxPhoneNumbersResult\nListSNOMEDCTInferenceJobsRequest\nListSNOMEDCTInferenceJobsResponse\nListSSHPublicKeysRequest\nListSSHPublicKeysResponse\nListSafetyRulesRequest\nListSafetyRulesResponse\nListSamplesRequest\nListSamplesResult\nListSatellitesRequest\nListSatellitesResponse\nListSavingsPlansPurchaseRecommendationGenerationRequest\nListSavingsPlansPurchaseRecommendationGenerationResponse\nListScansRequest\nListScansResponse\nListScenesRequest\nListScenesResponse\nListScheduleGroupsInput\nListScheduleGroupsOutput\nListScheduledActionsRequest\nListScheduledActionsResponse\nListScheduledAuditsRequest\nListScheduledAuditsResponse\nListScheduledQueriesRequest\nListScheduledQueriesResponse\nListSchedulesInput\nListSchedulesOutput\nListSchedulesRequest\nListSchedulesResponse\nListSchedulingPoliciesRequest\nListSchedulingPoliciesResponse\nListSchemaExtensionsRequest\nListSchemaExtensionsResult\nListSchemaMappingsInput\nListSchemaMappingsOutput\nListSchemaVersionsInput\nListSchemaVersionsRequest\nListSchemaVersionsResponse\nListSchemasInput\nListSchemasOutput\nListSchemasRequest\nListSchemasResponse\nListScramSecretsRequest\nListScramSecretsResponse\nListScriptsInput\nListScriptsOutput\nListSecretVersionIdsRequest\nListSecretVersionIdsResponse\nListSecretsRequest\nListSecretsResponse\nListSecurityConfigsRequest\nListSecurityConfigsResponse\nListSecurityConfigurationsInput\nListSecurityConfigurationsOutput\nListSecurityControlDefinitionsRequest\nListSecurityControlDefinitionsResponse\nListSecurityKeysRequest\nListSecurityKeysResponse\nListSecurityPoliciesRequest\nListSecurityPoliciesResponse\nListSecurityProfileApplicationsRequest\nListSecurityProfileApplicationsResponse\nListSecurityProfilePermissionsRequest\nListSecurityProfilePermissionsResponse\nListSecurityProfilesForTargetRequest\nListSecurityProfilesForTargetResponse\nListSecurityProfilesRequest\nListSecurityProfilesResponse\nListSegmentReferencesRequest\nListSegmentReferencesResponse\nListSegmentsRequest\nListSegmentsResponse\nListSensitivityInspectionTemplatesRequest\nListSensitivityInspectionTemplatesResponse\nListSensorStatisticsRequest\nListSensorStatisticsResponse\nListSentimentDetectionJobsRequest\nListSentimentDetectionJobsResponse\nListSequenceStoresRequest\nListSequenceStoresResponse\nListServerCertificateTagsRequest\nListServerCertificateTagsResponse\nListServerCertificatesRequest\nListServerCertificatesResponse\nListServerNeighborsRequest\nListServerNeighborsResponse\nListServersRequest\nListServersResponse\nListServiceActionsForProvisioningArtifactInput\nListServiceActionsForProvisioningArtifactOutput\nListServiceActionsInput\nListServiceActionsOutput\nListServiceInstanceOutputsInput\nListServiceInstanceOutputsOutput\nListServiceInstanceProvisionedResourcesInput\nListServiceInstanceProvisionedResourcesOutput\nListServiceInstancesFilter\nListServiceInstancesInput\nListServiceInstancesOutput\nListServiceNetworkServiceAssociationsRequest\nListServiceNetworkServiceAssociationsResponse\nListServiceNetworkVpcAssociationsRequest\nListServiceNetworkVpcAssociationsResponse\nListServiceNetworksRequest\nListServiceNetworksResponse\nListServicePipelineOutputsInput\nListServicePipelineOutputsOutput\nListServicePipelineProvisionedResourcesInput\nListServicePipelineProvisionedResourcesOutput\nListServicePrincipalNamesRequest\nListServicePrincipalNamesResponse\nListServiceProfilesRequest\nListServiceProfilesResponse\nListServiceQuotaIncreaseRequestsInTemplateRequest\nListServiceQuotaIncreaseRequestsInTemplateResponse\nListServiceQuotasRequest\nListServiceQuotasResponse\nListServiceSpecificCredentialsRequest\nListServiceSpecificCredentialsResponse\nListServiceTemplateVersionsInput\nListServiceTemplateVersionsOutput\nListServiceTemplatesInput\nListServiceTemplatesOutput\nListServiceVersionsRequest\nListServiceVersionsResult\nListServicesByNamespaceRequest\nListServicesByNamespaceResponse\nListServicesForAutoScalingConfigurationRequest\nListServicesForAutoScalingConfigurationResponse\nListServicesInput\nListServicesOutput\nListServicesRequest\nListServicesResponse\nListSessionAnalyticsDataRequest\nListSessionAnalyticsDataResponse\nListSessionMetricsRequest\nListSessionMetricsResponse\nListSessionsRequest\nListSessionsResponse\nListShardsInput\nListShardsOutput\nListShareInvitationsInput\nListShareInvitationsOutput\nListSharedEndpointsRequest\nListSharedEndpointsResult\nListSharedProjectsInput\nListSharedProjectsOutput\nListSharedReportGroupsInput\nListSharedReportGroupsOutput\nListSharesRequest\nListSharesResponse\nListSignalCatalogNodesRequest\nListSignalCatalogNodesResponse\nListSignalCatalogsRequest\nListSignalCatalogsResponse\nListSignalingChannelsInput\nListSignalingChannelsOutput\nListSigningCertificatesRequest\nListSigningCertificatesResponse\nListSigningJobsRequest\nListSigningJobsResponse\nListSigningPlatformsRequest\nListSigningPlatformsResponse\nListSigningProfilesRequest\nListSigningProfilesResponse\nListSimulationApplicationsRequest\nListSimulationApplicationsResponse\nListSimulationJobBatchesRequest\nListSimulationJobBatchesResponse\nListSimulationJobsRequest\nListSimulationJobsResponse\nListSimulationsInput\nListSimulationsOutput\nListSinksInput\nListSinksItem\nListSinksOutput\nListSipMediaApplicationsRequest\nListSipMediaApplicationsResponse\nListSipRulesRequest\nListSipRulesResponse\nListSitesInput\nListSitesOutput\nListSitesRequest\nListSitesResponse\nListSizeConstraintSetsRequest\nListSizeConstraintSetsResponse\nListSkillsRequest\nListSkillsResponse\nListSkillsStoreCategoriesRequest\nListSkillsStoreCategoriesResponse\nListSkillsStoreSkillsByCategoryRequest\nListSkillsStoreSkillsByCategoryResponse\nListSlackChannelConfigurationsRequest\nListSlackChannelConfigurationsResult\nListSlackWorkspaceConfigurationsRequest\nListSlackWorkspaceConfigurationsResult\nListSlotTypesRequest\nListSlotTypesResponse\nListSlotsRequest\nListSlotsResponse\nListSmartHomeAppliancesRequest\nListSmartHomeAppliancesResponse\nListSnapshotBlocksRequest\nListSnapshotBlocksResponse\nListSnapshotsInRecycleBinRequest\nListSnapshotsInRecycleBinResult\nListSnapshotsRequest\nListSnapshotsResponse\nListSnapshotsResult\nListSolFunctionInstanceInfo\nListSolFunctionInstanceMetadata\nListSolFunctionInstancesInput\nListSolFunctionInstancesOutput\nListSolFunctionPackageInfo\nListSolFunctionPackageMetadata\nListSolFunctionPackagesInput\nListSolFunctionPackagesOutput\nListSolNetworkInstanceInfo\nListSolNetworkInstanceMetadata\nListSolNetworkInstancesInput\nListSolNetworkInstancesOutput\nListSolNetworkOperationsInfo\nListSolNetworkOperationsInput\nListSolNetworkOperationsMetadata\nListSolNetworkOperationsOutput\nListSolNetworkPackageInfo\nListSolNetworkPackageMetadata\nListSolNetworkPackagesInput\nListSolNetworkPackagesOutput\nListSolutionVersionsRequest\nListSolutionVersionsResponse\nListSolutionsRequest\nListSolutionsResponse\nListSopRecommendationsRequest\nListSopRecommendationsResponse\nListSourceApiAssociationsRequest\nListSourceApiAssociationsResponse\nListSourceCredentialsOutput\nListSourceLocationsRequest\nListSourceLocationsResponse\nListSourceRepositoriesItem\nListSourceRepositoriesRequest\nListSourceRepositoriesResponse\nListSourceRepositoryBranchesItem\nListSourceRepositoryBranchesRequest\nListSourceRepositoryBranchesResponse\nListSourceServerActionsRequest\nListSourceServerActionsResponse\nListSpacesRequest\nListSpacesResponse\nListSpeakerEnrollmentJobsRequest\nListSpeakerEnrollmentJobsResponse\nListSpeakersRequest\nListSpeakersResponse\nListSpeechSynthesisTasksInput\nListSpeechSynthesisTasksOutput\nListSqlInjectionMatchSetsRequest\nListSqlInjectionMatchSetsResponse\nListStackInstanceResourceDriftsInput\nListStackInstanceResourceDriftsOutput\nListStackInstancesForProvisionedProductInput\nListStackInstancesForProvisionedProductOutput\nListStackInstancesInput\nListStackInstancesOutput\nListStackResourcesInput\nListStackResourcesOutput\nListStackSetOperationResultsInput\nListStackSetOperationResultsOutput\nListStackSetOperationsInput\nListStackSetOperationsOutput\nListStackSetsInput\nListStackSetsOutput\nListStacksInput\nListStacksOutput\nListStageDeploymentsRequest\nListStageDeploymentsResult\nListStageDevicesRequest\nListStageDevicesResponse\nListStageSessionsRequest\nListStageSessionsResponse\nListStagesRequest\nListStagesResponse\nListStagesResult\nListStagingAccountsRequest\nListStagingAccountsResponse\nListStandardsControlAssociationsRequest\nListStandardsControlAssociationsResponse\nListStateMachineAliasesInput\nListStateMachineAliasesOutput\nListStateMachineVersionsInput\nListStateMachineVersionsOutput\nListStateMachinesInput\nListStateMachinesOutput\nListStatementsRequest\nListStatementsResponse\nListStepsInput\nListStepsOutput\nListStorageLensConfigurationEntry\nListStorageLensConfigurationsRequest\nListStorageLensConfigurationsResult\nListStorageSystemsRequest\nListStorageSystemsResponse\nListStoredQueriesRequest\nListStoredQueriesResponse\nListStreamConsumersInput\nListStreamConsumersOutput\nListStreamKeysRequest\nListStreamKeysResponse\nListStreamProcessorsRequest\nListStreamProcessorsResponse\nListStreamSessionsRequest\nListStreamSessionsResponse\nListStreamingDistributionsRequest\nListStreamingDistributionsResult\nListStreamingImagesRequest\nListStreamingImagesResponse\nListStreamingSessionBackupsRequest\nListStreamingSessionBackupsResponse\nListStreamingSessionsRequest\nListStreamingSessionsResponse\nListStreamsInput\nListStreamsOutput\nListStreamsRequest\nListStreamsResponse\nListStudioComponentsRequest\nListStudioComponentsResponse\nListStudioLifecycleConfigsRequest\nListStudioLifecycleConfigsResponse\nListStudioMembersRequest\nListStudioMembersResponse\nListStudioSessionMappingsInput\nListStudioSessionMappingsOutput\nListStudiosInput\nListStudiosOutput\nListStudiosRequest\nListStudiosResponse\nListSubChannelsRequest\nListSubChannelsResponse\nListSubjectsResponse\nListSubscribedRuleGroupsRequest\nListSubscribedRuleGroupsResponse\nListSubscribedWorkteamsRequest\nListSubscribedWorkteamsResponse\nListSubscribersRequest\nListSubscribersResponse\nListSubscriptionDefinitionVersionsRequest\nListSubscriptionDefinitionVersionsResponse\nListSubscriptionDefinitionsRequest\nListSubscriptionDefinitionsResponse\nListSubscriptionsByTopicInput\nListSubscriptionsByTopicResponse\nListSubscriptionsInput\nListSubscriptionsResponse\nListSuggestedResiliencyPoliciesRequest\nListSuggestedResiliencyPoliciesResponse\nListSuiteDefinitionsRequest\nListSuiteDefinitionsResponse\nListSuiteRunsRequest\nListSuiteRunsResponse\nListSuitesRequest\nListSuitesResult\nListSupportedCharacterSets\nListSupportedInstanceTypesInput\nListSupportedInstanceTypesOutput\nListSupportedPhoneNumberCountriesRequest\nListSupportedPhoneNumberCountriesResponse\nListSupportedResourceTypesInput\nListSupportedResourceTypesOutput\nListSupportedTimezones\nListSuppressedDestinationsRequest\nListSuppressedDestinationsResponse\nListSyncJobsRequest\nListSyncJobsResponse\nListSyncResourcesRequest\nListSyncResourcesResponse\nListTLSInspectionConfigurationsRequest\nListTLSInspectionConfigurationsResponse\nListTableColumnsRequest\nListTableColumnsResult\nListTableMetadataInput\nListTableMetadataOutput\nListTableRestoreStatusRequest\nListTableRestoreStatusResponse\nListTableRowsRequest\nListTableRowsResult\nListTableStorageOptimizersRequest\nListTableStorageOptimizersResponse\nListTablesInput\nListTablesOutput\nListTablesRequest\nListTablesResponse\nListTablesResult\nListTagOptionsFilters\nListTagOptionsInput\nListTagOptionsOutput\nListTags\nListTagsForCertificateRequest\nListTagsForCertificateResponse\nListTagsForDeliveryStreamInput\nListTagsForDeliveryStreamOutput\nListTagsForDomainRequest\nListTagsForDomainResponse\nListTagsForProjectRequest\nListTagsForProjectResult\nListTagsForResourceInput\nListTagsForResourceMessage\nListTagsForResourceOutput\nListTagsForResourceRequest\nListTagsForResourceResponse\nListTagsForResourceResult\nListTagsForResourcesRequest\nListTagsForResourcesResponse\nListTagsForStreamInput\nListTagsForStreamOutput\nListTagsForVaultInput\nListTagsForVaultOutput\nListTagsInput\nListTagsLogGroupRequest\nListTagsLogGroupResponse\nListTagsOfResourceInput\nListTagsOfResourceOutput\nListTagsOutput\nListTagsRequest\nListTagsResponse\nListTagsResult\nListTapePoolsInput\nListTapePoolsOutput\nListTapesInput\nListTapesOutput\nListTargetGroupsRequest\nListTargetGroupsResponse\nListTargetResourceTypesRequest\nListTargetResourceTypesResponse\nListTargetedSentimentDetectionJobsRequest\nListTargetedSentimentDetectionJobsResponse\nListTargetsByRuleRequest\nListTargetsByRuleResponse\nListTargetsFilter\nListTargetsForPolicyRequest\nListTargetsForPolicyResponse\nListTargetsForSecurityProfileRequest\nListTargetsForSecurityProfileResponse\nListTargetsRequest\nListTargetsResponse\nListTargetsResult\nListTaskDefinitionFamiliesRequest\nListTaskDefinitionFamiliesResponse\nListTaskDefinitionsRequest\nListTaskDefinitionsResponse\nListTaskExecutionsRequest\nListTaskExecutionsResponse\nListTaskTemplatesRequest\nListTaskTemplatesResponse\nListTasksInput\nListTasksOutput\nListTasksRequest\nListTasksResponse\nListTeamMembersRequest\nListTeamMembersResult\nListTemplateActionsRequest\nListTemplateActionsResponse\nListTemplateAliasesRequest\nListTemplateAliasesResponse\nListTemplateGroupAccessControlEntriesRequest\nListTemplateGroupAccessControlEntriesResponse\nListTemplateStepGroupsRequest\nListTemplateStepGroupsResponse\nListTemplateStepsRequest\nListTemplateStepsResponse\nListTemplateVersionsRequest\nListTemplateVersionsResponse\nListTemplatesRequest\nListTemplatesResponse\nListTerminologiesRequest\nListTerminologiesResponse\nListTestExecutionResultItemsRequest\nListTestExecutionResultItemsResponse\nListTestExecutionsRequest\nListTestExecutionsResponse\nListTestGridProjectsRequest\nListTestGridProjectsResult\nListTestGridSessionActionsRequest\nListTestGridSessionActionsResult\nListTestGridSessionArtifactsRequest\nListTestGridSessionArtifactsResult\nListTestGridSessionsRequest\nListTestGridSessionsResult\nListTestRecommendationsRequest\nListTestRecommendationsResponse\nListTestSetRecordsRequest\nListTestSetRecordsResponse\nListTestSetsRequest\nListTestSetsResponse\nListTestsRequest\nListTestsResult\nListTextTranslationJobsRequest\nListTextTranslationJobsResponse\nListThemeAliasesRequest\nListThemeAliasesResponse\nListThemeVersionsRequest\nListThemeVersionsResponse\nListThemesRequest\nListThemesResponse\nListThesauriRequest\nListThesauriResponse\nListThingGroupsForThingRequest\nListThingGroupsForThingResponse\nListThingGroupsRequest\nListThingGroupsResponse\nListThingPrincipalsRequest\nListThingPrincipalsResponse\nListThingRegistrationTaskReportsRequest\nListThingRegistrationTaskReportsResponse\nListThingRegistrationTasksRequest\nListThingRegistrationTasksResponse\nListThingTypesRequest\nListThingTypesResponse\nListThingsInBillingGroupRequest\nListThingsInBillingGroupResponse\nListThingsInThingGroupRequest\nListThingsInThingGroupResponse\nListThingsRequest\nListThingsResponse\nListThirdPartyFirewallFirewallPoliciesRequest\nListThirdPartyFirewallFirewallPoliciesResponse\nListThreatIntelSetsRequest\nListThreatIntelSetsResponse\nListTimeSeriesRequest\nListTimeSeriesResponse\nListTimelineEventsInput\nListTimelineEventsOutput\nListTokenBalancesInput\nListTokenBalancesOutput\nListTokensRequest\nListTokensResponse\nListTopicRefreshSchedulesRequest\nListTopicRefreshSchedulesResponse\nListTopicRuleDestinationsRequest\nListTopicRuleDestinationsResponse\nListTopicRulesRequest\nListTopicRulesResponse\nListTopicsDetectionJobsRequest\nListTopicsDetectionJobsResponse\nListTopicsInput\nListTopicsRequest\nListTopicsResponse\nListTrackerConsumersRequest\nListTrackerConsumersResponse\nListTrackersRequest\nListTrackersResponse\nListTrackersResponseEntry\nListTrafficDistributionGroupUsersRequest\nListTrafficDistributionGroupUsersResponse\nListTrafficDistributionGroupsRequest\nListTrafficDistributionGroupsResponse\nListTrafficPoliciesRequest\nListTrafficPoliciesResponse\nListTrafficPolicyInstancesByHostedZoneRequest\nListTrafficPolicyInstancesByHostedZoneResponse\nListTrafficPolicyInstancesByPolicyRequest\nListTrafficPolicyInstancesByPolicyResponse\nListTrafficPolicyInstancesRequest\nListTrafficPolicyInstancesResponse\nListTrafficPolicyVersionsRequest\nListTrafficPolicyVersionsResponse\nListTrailsRequest\nListTrailsResponse\nListTrainingJobsForHyperParameterTuningJobRequest\nListTrainingJobsForHyperParameterTuningJobResponse\nListTrainingJobsRequest\nListTrainingJobsResponse\nListTransactionEventsInput\nListTransactionEventsOutput\nListTransactionsInput\nListTransactionsOutput\nListTransactionsRequest\nListTransactionsResponse\nListTransactionsSort\nListTranscriptionJobsRequest\nListTranscriptionJobsResponse\nListTransformJobsRequest\nListTransformJobsResponse\nListTrialComponentsRequest\nListTrialComponentsResponse\nListTrialsRequest\nListTrialsResponse\nListTriggersRequest\nListTriggersResponse\nListTrustAnchorsResponse\nListTrustStoreCertificatesRequest\nListTrustStoreCertificatesResponse\nListTrustStoresRequest\nListTrustStoresResponse\nListTunnelsRequest\nListTunnelsResponse\nListType\nListTypeRegistrationsInput\nListTypeRegistrationsOutput\nListTypeVersionsInput\nListTypeVersionsOutput\nListTypedLinkFacetAttributesRequest\nListTypedLinkFacetAttributesResponse\nListTypedLinkFacetNamesRequest\nListTypedLinkFacetNamesResponse\nListTypesByAssociationRequest\nListTypesByAssociationResponse\nListTypesInput\nListTypesOutput\nListTypesRequest\nListTypesResponse\nListUniqueProblemsRequest\nListUniqueProblemsResult\nListUnsupportedAppVersionResourcesRequest\nListUnsupportedAppVersionResourcesResponse\nListUpdateToken\nListUpdatesRequest\nListUpdatesResponse\nListUploadsRequest\nListUploadsResult\nListUsageForLicenseConfigurationRequest\nListUsageForLicenseConfigurationResponse\nListUsageLimitsRequest\nListUsageLimitsResponse\nListUsageTotalsRequest\nListUsageTotalsResponse\nListUseCasesRequest\nListUseCasesResponse\nListUserAccessLoggingSettingsRequest\nListUserAccessLoggingSettingsResponse\nListUserAssociationsRequest\nListUserAssociationsResponse\nListUserGroupsRequest\nListUserGroupsResponse\nListUserHierarchyGroupsRequest\nListUserHierarchyGroupsResponse\nListUserImportJobsRequest\nListUserImportJobsResponse\nListUserPoliciesRequest\nListUserPoliciesResponse\nListUserPoolClientsRequest\nListUserPoolClientsResponse\nListUserPoolsRequest\nListUserPoolsResponse\nListUserProfilesRequest\nListUserProfilesResponse\nListUserProfilesResult\nListUserSettingsRequest\nListUserSettingsResponse\nListUserTagsRequest\nListUserTagsResponse\nListUsersByPermissionGroupRequest\nListUsersByPermissionGroupResponse\nListUsersFilters\nListUsersInGroupRequest\nListUsersInGroupResponse\nListUsersRequest\nListUsersResponse\nListUtteranceAnalyticsDataRequest\nListUtteranceAnalyticsDataResponse\nListUtteranceMetricsRequest\nListUtteranceMetricsResponse\nListV2LoggingLevelsRequest\nListV2LoggingLevelsResponse\nListVPCAssociationAuthorizationsRequest\nListVPCAssociationAuthorizationsResponse\nListVPCConnectionsRequest\nListVPCConnectionsResponse\nListVPCEConfigurationsRequest\nListVPCEConfigurationsResult\nListVariantImportJobsFilter\nListVariantImportJobsRequest\nListVariantImportJobsResponse\nListVariantStoresFilter\nListVariantStoresRequest\nListVariantStoresResponse\nListVaultsInput\nListVaultsOutput\nListVectorEnrichmentJobInput\nListVectorEnrichmentJobOutput\nListVectorEnrichmentJobOutputConfig\nListVehiclesInFleetRequest\nListVehiclesInFleetResponse\nListVehiclesRequest\nListVehiclesResponse\nListVerifiedEmailAddressesResponse\nListVersionsByFunctionRequest\nListVersionsByFunctionResponse\nListVersionsRequest\nListVersionsResponse\nListViewVersionsRequest\nListViewVersionsResponse\nListViewsInput\nListViewsOutput\nListViewsRequest\nListViewsResponse\nListViolationEventsRequest\nListViolationEventsResponse\nListVirtualClustersRequest\nListVirtualClustersResponse\nListVirtualGatewaysInput\nListVirtualGatewaysOutput\nListVirtualInterfaceTestHistoryRequest\nListVirtualInterfaceTestHistoryResponse\nListVirtualMFADevicesRequest\nListVirtualMFADevicesResponse\nListVirtualMachinesInput\nListVirtualMachinesOutput\nListVirtualNodesInput\nListVirtualNodesOutput\nListVirtualRoutersInput\nListVirtualRoutersOutput\nListVirtualServicesInput\nListVirtualServicesOutput\nListVocabulariesRequest\nListVocabulariesResponse\nListVocabularyFiltersRequest\nListVocabularyFiltersResponse\nListVodSourcesRequest\nListVodSourcesResponse\nListVoiceConnectorGroupsRequest\nListVoiceConnectorGroupsResponse\nListVoiceConnectorTerminationCredentialsRequest\nListVoiceConnectorTerminationCredentialsResponse\nListVoiceConnectorsRequest\nListVoiceConnectorsResponse\nListVoiceProfileDomainsRequest\nListVoiceProfileDomainsResponse\nListVoiceProfilesRequest\nListVoiceProfilesResponse\nListVolumeInitiatorsInput\nListVolumeInitiatorsOutput\nListVolumeRecoveryPointsInput\nListVolumeRecoveryPointsOutput\nListVolumesInput\nListVolumesOutput\nListVpcConnectionsRequest\nListVpcConnectionsResponse\nListVpcConnectorsRequest\nListVpcConnectorsResponse\nListVpcEndpointAccessRequest\nListVpcEndpointAccessResponse\nListVpcEndpointsForDomainRequest\nListVpcEndpointsForDomainResponse\nListVpcEndpointsRequest\nListVpcEndpointsResponse\nListVpcIngressConnectionsFilter\nListVpcIngressConnectionsRequest\nListVpcIngressConnectionsResponse\nListWatchlistsRequest\nListWatchlistsResponse\nListWavesRequest\nListWavesRequestFilters\nListWavesResponse\nListWebACLsRequest\nListWebACLsResponse\nListWebhookItem\nListWebhooksInput\nListWebhooksOutput\nListWebhooksRequest\nListWebhooksResult\nListWebsiteAuthorizationProvidersRequest\nListWebsiteAuthorizationProvidersResponse\nListWebsiteCertificateAuthoritiesRequest\nListWebsiteCertificateAuthoritiesResponse\nListWhatIfAnalysesRequest\nListWhatIfAnalysesResponse\nListWhatIfForecastExportsRequest\nListWhatIfForecastExportsResponse\nListWhatIfForecastsRequest\nListWhatIfForecastsResponse\nListWirelessDeviceImportTasksRequest\nListWirelessDeviceImportTasksResponse\nListWirelessDevicesRequest\nListWirelessDevicesResponse\nListWirelessGatewayTaskDefinitionsRequest\nListWirelessGatewayTaskDefinitionsResponse\nListWirelessGatewaysRequest\nListWirelessGatewaysResponse\nListWorkGroupsInput\nListWorkGroupsOutput\nListWorkerBlocksRequest\nListWorkerBlocksResponse\nListWorkerConfigurationsRequest\nListWorkerConfigurationsResponse\nListWorkerFleetsRequest\nListWorkerFleetsResponse\nListWorkersRequest\nListWorkersResponse\nListWorkersWithQualificationTypeRequest\nListWorkersWithQualificationTypeResponse\nListWorkflowExecutionsRequest\nListWorkflowExecutionsResponse\nListWorkflowStepExecutionsRequest\nListWorkflowStepExecutionsResponse\nListWorkflowStepGroupsRequest\nListWorkflowStepGroupsResponse\nListWorkflowStepsRequest\nListWorkflowStepsResponse\nListWorkflowTypesInput\nListWorkflowsItem\nListWorkflowsRequest\nListWorkflowsResponse\nListWorkforcesRequest\nListWorkforcesResponse\nListWorkgroupsRequest\nListWorkgroupsResponse\nListWorkloadSharesInput\nListWorkloadSharesOutput\nListWorkloadsInput\nListWorkloadsOutput\nListWorkloadsRequest\nListWorkloadsResponse\nListWorkspacesRequest\nListWorkspacesResponse\nListWorkteamsRequest\nListWorkteamsResponse\nListWorldExportJobsRequest\nListWorldExportJobsResponse\nListWorldGenerationJobsRequest\nListWorldGenerationJobsResponse\nListWorldTemplatesRequest\nListWorldTemplatesResponse\nListWorldsRequest\nListWorldsResponse\nListXssMatchSetsRequest\nListXssMatchSetsResponse\nListZonalShiftsRequest\nListZonalShiftsResponse\nListedAccess\nListedAgreement\nListedBridge\nListedCertificate\nListedConnector\nListedEntitlement\nListedExecution\nListedFlow\nListedGateway\nListedGatewayInstance\nListedHostKey\nListedProfile\nListedServer\nListedUser\nListedWorkflow\nListener\nListenerAddress\nListenerArn\nListenerArns\nListenerDescription\nListenerDescriptions\nListenerEndpoint\nListenerNotFoundException\nListenerPort\nListenerSummary\nListenerTls\nListenerTlsAcmCertificate\nListenerTlsFileCertificate\nListenerTlsSdsCertificate\nListenerTlsValidationContext\nListeners\nListingId\nListingTime\nLiteralArrayOptions\nLiteralOptions\nLiveConnectorRTMPConfiguration\nLiveConnectorSinkConfiguration\nLiveConnectorSourceConfiguration\nLivePoolProgress\nLivePreRollConfiguration\nLiveSimulationState\nLiveSource\nLiveSourceName\nLivenessOutputConfig\nLoRaWAN\nLoRaWANConnectionStatusEventNotificationConfigurations\nLoRaWANConnectionStatusResourceTypeEventConfiguration\nLoRaWANDevice\nLoRaWANDeviceMetadata\nLoRaWANDeviceProfile\nLoRaWANFuotaTask\nLoRaWANFuotaTaskGetInfo\nLoRaWANGateway\nLoRaWANGatewayCurrentVersion\nLoRaWANGatewayMetadata\nLoRaWANGatewayVersion\nLoRaWANGetServiceProfileInfo\nLoRaWANJoinEventNotificationConfigurations\nLoRaWANJoinResourceTypeEventConfiguration\nLoRaWANListDevice\nLoRaWANMulticast\nLoRaWANMulticastGet\nLoRaWANMulticastMetadata\nLoRaWANMulticastSession\nLoRaWANNetworkServerCertificateId\nLoRaWANSendDataToDevice\nLoRaWANServiceProfile\nLoRaWANStartFuotaTask\nLoRaWANUpdateDevice\nLoRaWANUpdateGatewayTaskCreate\nLoRaWANUpdateGatewayTaskEntry\nLoRoCenterMixLevel\nLoRoSurroundMixLevel\nLoa\nLoadAverage\nLoadBalancer\nLoadBalancerAddress\nLoadBalancerAddresses\nLoadBalancerArn\nLoadBalancerArns\nLoadBalancerAttribute\nLoadBalancerAttributeNotFoundException\nLoadBalancerAttributes\nLoadBalancerDescription\nLoadBalancerDescriptions\nLoadBalancerInfo\nLoadBalancerListenerPort\nLoadBalancerName\nLoadBalancerNames\nLoadBalancerNotFoundException\nLoadBalancerOptions\nLoadBalancerPort\nLoadBalancerPorts\nLoadBalancerState\nLoadBalancerTarget\nLoadBalancerTargetGroup\nLoadBalancerTargetGroupARN\nLoadBalancerTargetGroupState\nLoadBalancerTargetGroups\nLoadBalancerTargetPort\nLoadBalancerTlsCertificate\nLoadBalancerTlsCertificateDnsRecordCreationState\nLoadBalancerTlsCertificateDomainValidationOption\nLoadBalancerTlsCertificateDomainValidationRecord\nLoadBalancerTlsCertificateRenewalSummary\nLoadBalancerTlsCertificateSummary\nLoadBalancerTlsPolicy\nLoadBalancerType\nLoadBalancers\nLoadBalancersConfig\nLoadBasedAutoScalingConfiguration\nLoadBasedAutoScalingConfigurations\nLoadDryRunConfig\nLoadForecast\nLoadPermission\nLoadPermissionModifications\nLoadPermissionRequest\nLoadPermissions\nLoadSampleData\nLoadThreshold\nLoadTimeout\nLoadUrlAccessDeniedException\nLoaderIdResult\nLoadingAnimation\nLocalAddress\nLocalBgpAsn\nLocalCollectorS3Access\nLocalConsolePassword\nLocalDeviceResourceData\nLocalDirectoryPath\nLocalDomainInfo\nLocalGateway\nLocalGatewayId\nLocalGatewayIds\nLocalGatewayRoute\nLocalGatewayRouteTable\nLocalGatewayRouteTableArn\nLocalGatewayRouteTableId\nLocalGatewayRouteTableIds\nLocalGatewayRouteTableVirtualInterfaceGroupAssociation\nLocalGatewayRouteTableVirtualInterfaceGroupAssociationId\nLocalGatewayRouteTableVirtualInterfaceGroupAssociationIds\nLocalGatewayRouteTableVirtualInterfaceGroupAssociations\nLocalGatewayRouteTableVpcAssociation\nLocalGatewayRouteTableVpcAssociationId\nLocalGatewayRouteTableVpcAssociationIds\nLocalGatewayRouteTableVpcAssociations\nLocalGatewayRouteTables\nLocalGatewayVirtualInterface\nLocalGatewayVirtualInterfaceGroup\nLocalGatewayVirtualInterfaceGroupId\nLocalGatewayVirtualInterfaceGroupIds\nLocalGatewayVirtualInterfaceGroups\nLocalGatewayVirtualInterfaceId\nLocalGatewayVirtualInterfaceIds\nLocalGatewayVirtualInterfaces\nLocalGateways\nLocalHealthEventsConfig\nLocalIpDetails\nLocalIpv4NetworkCidr\nLocalIpv6NetworkCidr\nLocalMountPath\nLocalNavigationConfiguration\nLocalPath\nLocalPortDetails\nLocalProfileId\nLocalSecondaryIndex\nLocalSecondaryIndexDescription\nLocalSecondaryIndexInfo\nLocalSecondaryIndexOverride\nLocalSecondaryIndexes\nLocalSizeConfig\nLocalStorage\nLocalStorageTypes\nLocalTarget\nLocalTime\nLocalVolumeResourceData\nLocalWriteForwardingStatus\nLocale\nLocaleCode\nLocaleId\nLocaleValue\nLocaleValues\nLocality\nLocation\nLocationARN\nLocationAction\nLocationArn\nLocationAttributes\nLocationConfiguration\nLocationConstraint\nLocationFilter\nLocationListEntry\nLocationModel\nLocationName\nLocationOrder\nLocationState\nLocationStates\nLocationSummary\nLocationTimestamp\nLocationType\nLocationUri\nLocations\nLockConfiguration\nLockDate\nLockEndTime\nLockRuleRequest\nLockRuleResponse\nLockState\nLockToken\nLocked\nLockedSubscriptionException\nLockoutPreventedException\nLockoutPreventionException\nLogAnomalyClass\nLogAnomalyClasses\nLogAnomalyShowcase\nLogAnomalyShowcases\nLogAnomalyToken\nLogAnomalyType\nLogBucket\nLogBucketList\nLogConfig\nLogConfiguration\nLogConfigurationForChannel\nLogConfigurationType\nLogConfigurations\nLogDelivery\nLogDeliveryBucket\nLogDeliveryConfiguration\nLogDeliveryConfigurationRequest\nLogDeliveryConfigurationType\nLogDeliveryConfigurations\nLogDeliveryDescription\nLogDeliveryStatus\nLogDestination\nLogDestinationConfig\nLogDestinationConfigs\nLogDestinationPermissionException\nLogDestinationType\nLogDriver\nLogEnabled\nLogEncryptionKmsKeyId\nLogEvent\nLogEventId\nLogEventTimestamp\nLogExports\nLogFile\nLogFileData\nLogFileName\nLogFilePath\nLogFilePrefix\nLogFileValidationEnabled\nLogFilter\nLogFormat\nLogGroup\nLogGroupArn\nLogGroupField\nLogGroupName\nLogGroupSummary\nLogLevel\nLogLevelUpdate\nLogOddsMetric\nLogOptions\nLogOutputFormat\nLogPaths\nLogPattern\nLogPatternSets\nLogPatterns\nLogPublishingConfiguration\nLogPublishingOption\nLogPublishingOptions\nLogPublishingOptionsStatus\nLogResult\nLogRoleArn\nLogSettingsRequest\nLogSettingsResponse\nLogSetup\nLogSource\nLogStream\nLogStreamARN\nLogStreamARNUpdate\nLogStreamArn\nLogStreamName\nLogStreams\nLogSubscription\nLogSubscriptions\nLogTarget\nLogTargetConfiguration\nLogText\nLogType\nLogTypes\nLogTypesToDisable\nLogTypesToEnable\nLogUploadEnabled\nLogUri\nLogUrl\nLogVersion\nLogarithmic\nLogger\nLoggerDefinitionId\nLoggerDefinitionVersion\nLoggerDefinitionVersionArn\nLoggerDefinitionVersionId\nLoggers\nLogging\nLoggingConfig\nLoggingConfiguration\nLoggingConfigurationInput\nLoggingConfigurationMetadata\nLoggingConfigurationStatus\nLoggingConfigurationSummary\nLoggingConfigurations\nLoggingEnabled\nLoggingFilter\nLoggingInfo\nLoggingLevel\nLoggingOptions\nLoggingOptionsPayload\nLoggingRole\nLoggingStatus\nLogical\nLogicalCapacityUsed\nLogicalIdHierarchy\nLogicalOperator\nLogicalResourceId\nLogicalResourceIds\nLogicalTable\nLogicalTableMap\nLogicalTableSource\nLogicalUsed\nLoginAttribute\nLoginAttributes\nLoginAuthConfig\nLoginAuthConfigReqObj\nLoginMessage\nLoginPath\nLoginProfile\nLoginWithAmazon\nLogins\nLoginsToRemove\nLogo\nLogo2x\nLogo2xUrl\nLogo3x\nLogo3xUrl\nLogoUrl\nLogoutEndpoint\nLogoutRequest\nLogoutURLs\nLogoutUserRequest\nLogref\nLogs\nLogsAnomalyDetection\nLogsAnomalyDetectionIntegration\nLogsAnomalyDetectionIntegrationConfig\nLogsConfig\nLogsLocation\nLogsStorageLocation\nLogsSummary\nLon\nLongColumnStatisticsData\nLongDescription\nLongFormatText\nLongRangeType\nLongTermPricingEndDate\nLongTermPricingEntries\nLongTermPricingId\nLongTermPricingIds\nLongTermPricingListEntry\nLongTermPricingStartDate\nLongTermPricingStatus\nLongTermPricingType\nLongValue\nLongestPrefixMatches\nLongitude\nLookAheadRateControl\nLookBackAvailablePeriods\nLookBackPeriod\nLookbackPeriodInDays\nLookbackWindow\nLookoutMetrics\nLookupAttribute\nLookupAttributes\nLookupDeveloperIdentityInput\nLookupDeveloperIdentityResponse\nLookupEventsRequest\nLookupEventsResponse\nLookupPolicy\nLookupPolicyRequest\nLookupPolicyResponse\nLoopDetectedException\nLossValue\nLoudnessLogging\nLow\nLowAction\nLowCount\nLowLatencyHlsManifests\nLowerBound\nLowerBoundary\nLsaAnalysisId\nLt\nLtRtCenterMixLevel\nLtRtSurroundMixLevel\nLte\nLteLocalId\nLteNmr\nLteNmrObj\nLteObj\nLteTimingAdvance\nLunCount\nLunNumber\nLustreConfiguration\nLustreFileSystemConfiguration\nLustreLogConfiguration\nLustreLogCreateConfiguration\nLustreResponse\nLustreRootSquashConfiguration\nM2tsScte35Esam\nM2tsSettings\nM3u8Settings\nMAPE\nMASE\nMAXIMUM\nMD5\nMD5OfBody\nMD5OfMessageAttributes\nMD5OfMessageBody\nMD5OfMessageSystemAttributes\nMFA\nMFADelete\nMFADevice\nMFADevices\nMFAMethodNotFoundException\nMFAMode\nMFAOptionType\nMFAOptions\nMINIMUM\nMLFramework\nMLModel\nMLModelId\nMLModelName\nMLModelType\nMLResourceNotFoundException\nMLTransform\nMLTransformNotReadyException\nMLUserDataEncryption\nMSKClusterARN\nMSKSourceConfiguration\nMSKSourceDescription\nMac\nMacAddress\nMacAddressList\nMacAlgorithm\nMacAlgorithmDukpt\nMacAlgorithmEmv\nMacAlgorithms\nMacLength\nMacSecKey\nMacValid\nMacVersion\nMachineLabeled\nMachineLearningDetectionConfig\nMachineType\nMagneticDuration\nMagneticStore\nMagneticStoreRejectedDataLocation\nMagneticStoreRetentionPeriodInDays\nMagneticStoreWriteProperties\nMailDomainInUseException\nMailDomainNotFoundException\nMailDomainStateException\nMailDomainSummary\nMailDomains\nMailFromAttributes\nMailFromDomain\nMailFromDomainAttributes\nMailFromDomainNotVerifiedException\nMailFromDomainStatus\nMailType\nMailboxDeprovisionedDate\nMailboxExportJob\nMailboxProvisionedDate\nMailboxQuota\nMailboxSize\nMailingAddress\nMain\nMainClass\nMainProfileId\nMaintainer\nMaintenance\nMaintenanceAutoAppliedAfter\nMaintenanceCreateSettings\nMaintenanceDay\nMaintenanceDeadline\nMaintenanceDetails\nMaintenanceOperationsInProgress\nMaintenanceOptions\nMaintenanceSchedule\nMaintenanceScheduledDate\nMaintenanceSchedules\nMaintenanceStartHour\nMaintenanceStartTime\nMaintenanceStatus\nMaintenanceStrategies\nMaintenanceTrack\nMaintenanceTrackName\nMaintenanceTracks\nMaintenanceUpdateSettings\nMaintenanceWindow\nMaintenanceWindowAutomationParameters\nMaintenanceWindowExecution\nMaintenanceWindowExecutionTaskIdentity\nMaintenanceWindowExecutionTaskInvocationIdentity\nMaintenanceWindowFilter\nMaintenanceWindowIdentity\nMaintenanceWindowIdentityForTarget\nMaintenanceWindowLambdaParameters\nMaintenanceWindowRunCommandParameters\nMaintenanceWindowStartTime\nMaintenanceWindowStepFunctionsParameters\nMaintenanceWindowTarget\nMaintenanceWindowTask\nMaintenanceWindowTaskInvocationParameters\nMaintenanceWindowTaskParameterValueExpression\nMajorEngineVersion\nMajorKeyDerivationMode\nMajorRevision\nMajorVersion\nMake\nMalformedArnException\nMalformedCSRException\nMalformedCertificateException\nMalformedPolicyDocumentException\nMalformedPolicyException\nMalformedPolicyTemplateException\nMalformedQueryException\nMalware\nMalwareName\nMalwarePath\nMalwareProtection\nMalwareProtectionConfiguration\nMalwareProtectionConfigurationResult\nMalwareProtectionDataSourceFreeTrial\nMalwareState\nMalwareType\nManageBerkshelf\nManageMasterUserPassword\nManagePropertygraphStatisticsInput\nManagePropertygraphStatisticsOutput\nManageSparqlStatisticsInput\nManageSparqlStatisticsOutput\nManagedAccount\nManagedAction\nManagedActionHistoryItem\nManagedActionHistoryItems\nManagedActionInvalidStateException\nManagedActions\nManagedAgent\nManagedAgentStateChange\nManagedBy\nManagedByFirewallManager\nManagedDataIdentifierSummary\nManagedExecution\nManagedJobTemplateSummary\nManagedKeys\nManagedKeysIPV4\nManagedKeysIPV6\nManagedOwnerName\nManagedPersistenceMonitoringConfiguration\nManagedPolicyArn\nManagedPolicyDetail\nManagedPrefixList\nManagedProductDescriptor\nManagedProducts\nManagedResourceSummary\nManagedResourceSummaryList\nManagedRule\nManagedRuleDescription\nManagedRuleException\nManagedRuleGroupConfig\nManagedRuleGroupConfigs\nManagedRuleGroupStatement\nManagedRuleGroupSummary\nManagedRuleGroupVersion\nManagedRuleGroups\nManagedRuleSet\nManagedRuleSetName\nManagedRuleSetSummary\nManagedRuleSetVersion\nManagedRuleSets\nManagedRuleState\nManagedRules\nManagedScaling\nManagedScalingPolicy\nManagedServiceData\nManagedStreamingKafkaParameters\nManagedType\nManagedbyFirewallManager\nManagement\nManagementCidrRangeConstraint\nManagementCidrRanges\nManagementState\nManagementType\nManagesVpcEndpoints\nMandatory\nManifest\nManifestCompression\nManifestConfirmConditionNotification\nManifestDurationFormat\nManifestEncoding\nManifestEncryption\nManifestEndpointPrefix\nManifestFileLocation\nManifestFilePath\nManifestFormat\nManifestGenerator\nManifestKey\nManifestLayout\nManifestMetadataSignaling\nManifestName\nManifestNameModifier\nManifestOutputLocation\nManifestOverridesPayload\nManifestPayload\nManifestPrefix\nManifestPrefixLocation\nManifestProcessingRules\nManifestS3Uri\nManifestSummary\nManifestURI\nManifestWindowSeconds\nManual\nManualEvidence\nManualMergeRequiredException\nManualSnapshotRemainingDays\nManualSnapshotRetentionPeriod\nManualSnapshotsCurrentCount\nManualSnapshotsLimit\nManualSnapshotsLimitReached\nManufacturer\nManufacturerHardwareCertificate\nManufacturerName\nMapArn\nMapBooleanAsBoolean\nMapConfiguration\nMapConfigurationUpdate\nMapCustomerOwnedIpOnLaunch\nMapEntries\nMapEquals\nMapFilter\nMapIterationEventDetails\nMapJsonbAsClob\nMapLongVarcharAs\nMapMatchingConfig\nMapName\nMapPublicIpOnLaunch\nMapRunExecutionCounts\nMapRunFailedEventDetails\nMapRunItemCounts\nMapRunListItem\nMapRunStartedEventDetails\nMapStateStartedEventDetails\nMapStyleOptions\nMapZoomMode\nMappedDataSetParameter\nMappedDataSetParameters\nMappedResourceConfigurationList\nMappedResourceConfigurationListItem\nMapping\nMappingEntry\nMappingParameters\nMappingRule\nMappings\nMargin\nMarginPercentage\nMarginStyle\nMariaDbDataProviderSettings\nMariaDbParameters\nMarkAsArchivedRequest\nMarkLatest\nMarker\nMarkerColor\nMarkerRecordedEventAttributes\nMarkerShape\nMarkerSize\nMarkerStyleSettings\nMarkerVisibility\nMarket\nMarketType\nMarketo\nMarketoConnectorProfileCredentials\nMarketoConnectorProfileProperties\nMarketoDestinationProperties\nMarketoSourceProperties\nMarketplace\nMarketplaceCommerceAnalyticsException\nMarketplaceDescription\nMarketplaceInformation\nMarketplaceOnboardingStatus\nMarketplaceTitle\nMarketplaceUrl\nMarksNotSupportedForFormatException\nMask\nMaskCharacter\nMaskMode\nMaskValue\nMasks\nMaster\nMasterAccountArn\nMasterAccountEmail\nMasterAccountId\nMasterArn\nMasterBackendRole\nMasterCannotLeaveOrganizationException\nMasterEligibleNodeCount\nMasterId\nMasterInstanceId\nMasterInstanceSecurityGroupId\nMasterInstanceType\nMasterNode\nMasterPublicDnsName\nMasterRegion\nMasterUserARN\nMasterUserArn\nMasterUserName\nMasterUserOptions\nMasterUserPassword\nMasterUserSecret\nMasterUserSecretKmsKeyId\nMasterUsername\nMasteringMonitorNits\nMatch\nMatchAllValue\nMatchAttributes\nMatchConfidence\nMatchCriteria\nMatchGenerationDate\nMatchId\nMatchIds\nMatchItem\nMatchOperator\nMatchOption\nMatchOptions\nMatchPaths\nMatchPattern\nMatchPredicates\nMatchRange\nMatchScope\nMatchType\nMatchedCategories\nMatchedDetails\nMatchedEventTime\nMatchedPlayerSession\nMatchedPlayerSessions\nMatchedRules\nMatchedStatements\nMatchedUser\nMatcher\nMatches\nMatching\nMatchingAttributesList\nMatchingBucket\nMatchingEventTypes\nMatchingRequest\nMatchingResource\nMatchingResponse\nMatchingRule\nMatchingRules\nMatchingWorkflowSummary\nMatchmakerData\nMatchmakingConfiguration\nMatchmakingRuleSet\nMatchmakingTicket\nMathActivity\nMavenReference\nMavenReferenceDescription\nMax\nMax24HourSend\nMaxAbrBitrate\nMaxActiveResourcesExceededException\nMaxAge\nMaxAgeInDays\nMaxAgeInMinutes\nMaxAgeRule\nMaxAgeSeconds\nMaxAggregationInterval\nMaxAllocatedStorage\nMaxAllowedRuleLevelForMatching\nMaxAllowedRuleLevelForMerging\nMaxAllowedSignature\nMaxAlternatives\nMaxAncDataSize\nMaxAssignments\nMaxAttempts\nMaxAutoMLJobRuntimeInSeconds\nMaxAverageBitrate\nMaxBand\nMaxBitrate\nMaxCandidates\nMaxCapacity\nMaxCapacityBreachBehavior\nMaxCapacityBuffer\nMaxCapacityUnits\nMaxCaptures\nMaxCityNetworksToMonitor\nMaxCll\nMaxConcurrency\nMaxConcurrentCount\nMaxConcurrentDpus\nMaxConcurrentGameSessionActivations\nMaxConcurrentInvocationsPerInstance\nMaxConcurrentPercentage\nMaxConcurrentQueriesException\nMaxConcurrentRuns\nMaxConcurrentSessions\nMaxConcurrentTaskCount\nMaxConcurrentTransforms\nMaxConnections\nMaxConnectionsPercent\nMaxContacts\nMaxContentLightLevel\nMaxContentSizePerPageInMegaBytes\nMaxContributorCount\nMaxContributorValue\nMaxCount\nMaxCountRule\nMaxCpuUtilizationPercentage\nMaxDatapoints\nMaxDepth\nMaxDocumentSizeExceeded\nMaxDominantColors\nMaxDrainDurationSeconds\nMaxDuration\nMaxDurationInSeconds\nMaxDurationSeconds\nMaxDutyCycle\nMaxEirp\nMaxEntries\nMaxErrors\nMaxExpirationTime\nMaxFaces\nMaxFall\nMaxFetchRecordsPerShard\nMaxFetchTimeInMs\nMaxFileSize\nMaxFiles\nMaxFilesInBand\nMaxFrameAverageLightLevel\nMaxFrameRate\nMaxGroupPreparedCapacity\nMaxHeight\nMaxHumanLabeledObjectCount\nMaxIdleConnectionsPercent\nMaxImpact\nMaxInferenceUnits\nMaxInstanceCount\nMaxInstanceLifetime\nMaxInvocations\nMaxInvocationsPerMinute\nMaxIopsPerDbInstance\nMaxIopsPerGib\nMaxItems\nMaxKBytesPerRead\nMaxKeys\nMaxLabels\nMaxLatency\nMaxLength\nMaxLexemeLengthExceededException\nMaxLexiconsNumberExceededException\nMaxLimit\nMaxLinksPerPage\nMaxLocalMediaSizeInMB\nMaxLuminance\nMaxManifestFragmentResults\nMaxMediaPlaylistFragmentResults\nMaxMembers\nMaxMemoryUtilizationPercentage\nMaxModelVersion\nMaxModels\nMaxNumberOfAutoScalingGroups\nMaxNumberOfConfigRulesExceededException\nMaxNumberOfConfigurationRecordersExceededException\nMaxNumberOfConformancePacksExceededException\nMaxNumberOfDeliveryChannelsExceededException\nMaxNumberOfLaunchConfigurations\nMaxNumberOfMessages\nMaxNumberOfMessagesPerSecond\nMaxNumberOfOrganizationConfigRulesExceededException\nMaxNumberOfOrganizationConformancePacksExceededException\nMaxNumberOfRetentionConfigurationsExceededException\nMaxNumberOfTests\nMaxNumberOfTrainingJobs\nMaxNumberOfTrainingJobsNotImproving\nMaxOffsetsPerTrigger\nMaxOutputFiles\nMaxOutputs\nMaxP95Performance\nMaxPaddingBytes\nMaxParallelExecutionSteps\nMaxParallelLaunches\nMaxParallelOfTests\nMaxParallelTrainingJobs\nMaxParts\nMaxPasswordAge\nMaxPayloadInMB\nMaxPcrInterval\nMaxPercentageOfInputDatasetLabeled\nMaxPixelThreshold\nMaxPrice\nMaxPricePerMinute\nMaxProtectionGroups\nMaxQueryResults\nMaxRange\nMaxRecordCount\nMaxRecordPerRead\nMaxRecords\nMaxRenditions\nMaxResource\nMaxResults\nMaxRetentionDays\nMaxRetries\nMaxRetryCount\nMaxRetryIntervalMs\nMaxRows\nMaxRuntimeInSeconds\nMaxRuntimePerTrainingJobInSeconds\nMaxSchemaVersion\nMaxScore\nMaxSelectedChoices\nMaxSendRate\nMaxSessionDuration\nMaxSize\nMaxSlotDurationInHours\nMaxSlotsByChannel\nMaxSpeakerLabels\nMaxStorageSize\nMaxStorageThroughputPerDbInstance\nMaxStorageThroughputPerIops\nMaxStorageUtilizationPercentage\nMaxSuggestionsCount\nMaxSwap\nMaxSyncBuffer\nMaxTTL\nMaxTermDurationInDays\nMaxTimeToLiveInMinutes\nMaxTimestampGapInDays\nMaxTotalPrice\nMaxUnits\nMaxUploads\nMaxUrlsPerMinuteCrawlRate\nMaxUserDurationInSeconds\nMaxUsers\nMaxValue\nMaxVersion\nMaxVideoBitsPerSecond\nMaxVisibleColumns\nMaxVisibleRows\nMaxVolumeLimit\nMaxWaitTimeInSeconds\nMaxWidth\nMaxWorkers\nMaximum\nMaximumAllowedResources\nMaximumAutomaticAttempts\nMaximumBandwidthInMbps\nMaximumBatchSize\nMaximumBatchingWindowInSeconds\nMaximumBitrate\nMaximumBranchesExceededException\nMaximumCapacityUnits\nMaximumConcurrency\nMaximumConflictResolutionEntriesExceededException\nMaximumCoreCapacityUnits\nMaximumDuration\nMaximumEfaInterfaces\nMaximumEventAgeInSeconds\nMaximumExecutionFrequency\nMaximumExecutionTimeoutInSeconds\nMaximumFileContentToLoadExceededException\nMaximumFileEntriesExceededException\nMaximumFramerate\nMaximumIndividualPlayerLatencyMilliseconds\nMaximumInstanceCount\nMaximumIops\nMaximumItemsToCompareExceededException\nMaximumLabelType\nMaximumLength\nMaximumMinimum\nMaximumMinimumComputation\nMaximumNetworkCards\nMaximumNetworkInterfaces\nMaximumNormalizedUnitsUsedPerHour\nMaximumNumberOfApprovalsExceededException\nMaximumNumberOfInstancesUsedPerHour\nMaximumNumberOfTrailsExceededException\nMaximumOnDemandCapacityUnits\nMaximumOpenPullRequestsExceededException\nMaximumPartitionCount\nMaximumPercent\nMaximumPlayerSessionCount\nMaximumRGBTolerance\nMaximumRecordAgeInSeconds\nMaximumReplicationCount\nMaximumRepositoryNamesExceededException\nMaximumRepositoryTriggersExceededException\nMaximumResultReturnedException\nMaximumRetention\nMaximumRetryAttempts\nMaximumRuleTemplatesAssociatedWithRepositoryException\nMaximumStringLength\nMaximumSubChannels\nMaximumSupportedWeightLbs\nMaximumTTL\nMaximumThroughputInMBps\nMaximumTraversalDepth\nMaximumUnits\nMaximumValue\nMaximumVideoBufferDelayMilliseconds\nMaximumWindowInMinutes\nMaximumYUV\nMcGroupId\nMcc\nMccXml\nMd5Hash\nMdnResponse\nMdnSigningAlgorithm\nMeanTimeToRecoverInMilliseconds\nMeanValue\nMeasure\nMeasureAggregationFunction\nMeasureDataLabelStyle\nMeasureField\nMeasureFieldId\nMeasureForeground\nMeasureLabelVisibility\nMeasureLatency\nMeasureName\nMeasureNameColumn\nMeasureValue\nMeasureValueType\nMeasureValues\nMeasurement\nMeasurementProcessingConfig\nMedia\nMediaCapturePipeline\nMediaCapturePipelineSourceConfiguration\nMediaCapturePipelineSummary\nMediaCapturePipelines\nMediaConcatenationPipeline\nMediaConcurrencies\nMediaConcurrency\nMediaConnectFlow\nMediaConnectFlowRequest\nMediaConnectFlows\nMediaConnectSettings\nMediaEncoding\nMediaFileUri\nMediaFormat\nMediaInsightsConfiguration\nMediaInsightsPipeline\nMediaInsightsPipelineConfiguration\nMediaInsightsPipelineConfigurationArn\nMediaInsightsPipelineConfigurationElement\nMediaInsightsPipelineConfigurationId\nMediaInsightsPipelineConfigurationName\nMediaInsightsPipelineConfigurationSummary\nMediaInsightsPipelineConfigurations\nMediaInsightsPipelineElementStatus\nMediaInsightsRuntimeMetadata\nMediaLiveConnectorPipeline\nMediaLiveInputArn\nMediaPackageGroupSettings\nMediaPackageOutputDestinationSettings\nMediaPackageOutputSettings\nMediaPackageSettings\nMediaPipeline\nMediaPipelineArn\nMediaPipelineId\nMediaPipelineSummary\nMediaPipelines\nMediaPlacement\nMediaRegion\nMediaSampleRate\nMediaSampleRateHertz\nMediaSourceConfig\nMediaStorageConfiguration\nMediaStoreStorageClass\nMediaStream\nMediaStreamAttributes\nMediaStreamAttributesRequest\nMediaStreamId\nMediaStreamName\nMediaStreamOutputConfiguration\nMediaStreamOutputConfigurationRequest\nMediaStreamOutputConfigurations\nMediaStreamPipeline\nMediaStreamSink\nMediaStreamSource\nMediaStreamSourceConfiguration\nMediaStreamSourceConfigurationRequest\nMediaStreamSourceConfigurations\nMediaStreamType\nMediaStreams\nMediaType\nMediaUriSecretArn\nMediaUriType\nMediaUrl\nMediaconnectSettings\nMedialiveInputArns\nMedianRuntimeSeconds\nMedicalAlternative\nMedicalEntity\nMedicalItem\nMedicalResult\nMedicalTranscript\nMedicalTranscriptEvent\nMedicalTranscriptionJob\nMedicalTranscriptionJobName\nMedicalTranscriptionJobSummaries\nMedicalTranscriptionJobSummary\nMedicalTranscriptionSetting\nMediumAction\nMediumChangerType\nMediumCount\nMeeting\nMeetingArn\nMeetingEvents\nMeetingEventsConcatenationConfiguration\nMeetingFeatures\nMeetingFeaturesConfiguration\nMeetingHostId\nMeetingId\nMeetingNotificationConfiguration\nMeetingRoomConfiguration\nMeetingSetting\nMeetings\nMember\nMemberAccount\nMemberAccountEc2DeepInspectionStatus\nMemberAccountEc2DeepInspectionStatusState\nMemberAccountId\nMemberAccountIds\nMemberAccountLimitReached\nMemberAccountRuleStatus\nMemberAccountStatus\nMemberAccounts\nMemberAdditionalConfiguration\nMemberAdditionalConfigurationResult\nMemberArn\nMemberArns\nMemberClusters\nMemberClustersOutpostArns\nMemberConfiguration\nMemberDataSourceConfiguration\nMemberDataSourceConfigurations\nMemberDatasources\nMemberDefinition\nMemberDefinitions\nMemberDetail\nMemberDetails\nMemberError\nMemberFabricAttributes\nMemberFabricConfiguration\nMemberFabricLogPublishingConfiguration\nMemberFeaturesConfiguration\nMemberFeaturesConfigurationResult\nMemberFrameworkAttributes\nMemberFrameworkConfiguration\nMemberGroup\nMemberGroups\nMemberId\nMemberIdArnPair\nMemberLogPublishingConfiguration\nMemberName\nMemberOfServiceLinkedResourceGroup\nMemberSpecification\nMemberStatus\nMemberSummary\nMemberType\nMemberUser\nMemberUsers\nMembers\nMembership\nMembershipCount\nMembershipDatasources\nMembershipExists\nMembershipId\nMembershipItem\nMembershipItemList\nMembershipProtectedQueryResultConfiguration\nMembershipSummary\nMemory\nMemoryDuration\nMemoryGB\nMemoryGiBPerVCpu\nMemoryGiBPerVCpuRequest\nMemoryInMB\nMemoryInfo\nMemoryLimitExceededException\nMemoryMiB\nMemoryMiBRequest\nMemoryRegions\nMemoryReservation\nMemorySize\nMemorySizeConfiguration\nMemorySizeInMB\nMemoryStore\nMemoryStoreRetentionPeriodInHours\nMemoryThreshold\nMemoryUtilization\nMentionSentiment\nMentions\nMerge\nMergeAction\nMergeBaseCommit\nMergeBranchesByFastForwardInput\nMergeBranchesByFastForwardOutput\nMergeBranchesBySquashInput\nMergeBranchesBySquashOutput\nMergeBranchesByThreeWayInput\nMergeBranchesByThreeWayOutput\nMergeClause\nMergeDeveloperIdentitiesInput\nMergeDeveloperIdentitiesResponse\nMergeHunk\nMergeHunkDetail\nMergeMetadata\nMergeOperations\nMergeOptionRequiredException\nMergePolicy\nMergeProfilesRequest\nMergeProfilesResponse\nMergePullRequestByFastForwardInput\nMergePullRequestByFastForwardOutput\nMergePullRequestBySquashInput\nMergePullRequestBySquashOutput\nMergePullRequestByThreeWayInput\nMergePullRequestByThreeWayOutput\nMergeShardsInput\nMergeStrategy\nMergeWhenMatched\nMergeWhenNotMatched\nMergedDatasetNames\nMeshData\nMeshRef\nMeshServiceDiscovery\nMeshSpec\nMeshStatus\nMessage\nMessageAction\nMessageActivity\nMessageAttributeNames\nMessageAttributeValue\nMessageAttributes\nMessageBody\nMessageBodyTextType\nMessageConfig\nMessageConfiguration\nMessageData\nMessageDeduplicationId\nMessageDeliveryStatus\nMessageDeliveryStatusEventConfiguration\nMessageDeliveryStatusResourceTypeEventConfiguration\nMessageDetail\nMessageDsn\nMessageFieldMappings\nMessageFormat\nMessageFrozen\nMessageGroup\nMessageGroupId\nMessageId\nMessageInsightsDataSource\nMessageInsightsFilters\nMessageMaxBytes\nMessageMetadata\nMessagePayload\nMessagePrefix\nMessageRejected\nMessageRequest\nMessageResponse\nMessageResult\nMessageReviewHandler\nMessageStructure\nMessageSubject\nMessageSystemAttributeValue\nMessageSystemAttributes\nMessageTag\nMessageTemplateType\nMessageText\nMessageTtlSeconds\nMessageType\nMessageTypes\nMessages\nMessagesPerSecond\nMessagingSessionEndpoint\nMetaData\nMetaDataKey\nMetaDataValue\nMetadata\nMetadata3\nMetadata4\nMetadata5\nMetadata6\nMetadata7\nMetadata8\nMetadataBlob\nMetadataBlobChecksum\nMetadataBlobChecksumAlgorithm\nMetadataBlobLength\nMetadataCatalogConfig\nMetadataCatalogDetail\nMetadataConfiguration\nMetadataContent\nMetadataControl\nMetadataDestination\nMetadataDirective\nMetadataEntry\nMetadataException\nMetadataInfo\nMetadataInfoMap\nMetadataKey\nMetadataKeyValue\nMetadataKeyValuePair\nMetadataList\nMetadataOperation\nMetadataOptions\nMetadataProperties\nMetadataString\nMetadataToUpdate\nMetadataValue\nMeterUsageRequest\nMeterUsageResult\nMeteredLinesOfCodeCount\nMeteringMode\nMeteringProfileCount\nMeteringRecordId\nMethod\nMethodName\nMethodNotAllowedException\nMethodResponse\nMethodSetting\nMethodSettings\nMethodSnapshot\nMethods\nMetric\nMetricAggregationType\nMetricAlarm\nMetricAlarms\nMetricAttribute\nMetricAttribution\nMetricAttributionOutput\nMetricAttributionSummary\nMetricCollectionType\nMetricComparison\nMetricComparisonComputation\nMetricData\nMetricDataError\nMetricDataPoint\nMetricDataQueries\nMetricDataQuery\nMetricDataResult\nMetricDataResults\nMetricDataSummary\nMetricDataV2\nMetricDatapoint\nMetricDatapoints\nMetricDatum\nMetricDefinition\nMetricDefinitionConfig\nMetricDefinitionId\nMetricDefinitionIds\nMetricDefinitionRequest\nMetricDefinitions\nMetricDescription\nMetricDestinationSummary\nMetricDimension\nMetricDimensionGroups\nMetricDimensions\nMetricDisplayName\nMetricFilter\nMetricFilterKey\nMetricFilterMatchRecord\nMetricFilterV2\nMetricFilterValues\nMetricFilters\nMetricGoal\nMetricGoalConfig\nMetricGranularityType\nMetricGroups\nMetricHeaderCellStyle\nMetricIndex\nMetricInfo\nMetricIntervalLowerBound\nMetricIntervalUpperBound\nMetricKeyDataPoints\nMetricLevelImpact\nMetricLevelImpactList\nMetricList\nMetricMathAnomalyDetector\nMetricMonitor\nMetricMonitorConfig\nMetricName\nMetricNames\nMetricNamespace\nMetricPlacement\nMetricPoint\nMetricPoints\nMetricPolicy\nMetricPolicyRule\nMetricPolicyRules\nMetricProcessingConfig\nMetricQueries\nMetricQuery\nMetricResult\nMetricResultV2\nMetricResults\nMetricSetArn\nMetricSetDataQualityMetric\nMetricSetDataQualityMetricList\nMetricSetDescription\nMetricSetDimensionFilter\nMetricSetFrequency\nMetricSetName\nMetricSetSummary\nMetricSetSummaryList\nMetricSource\nMetricSpecification\nMetricSpecifications\nMetricStat\nMetricStatisticRecommendation\nMetricStreamEntry\nMetricStreamFilter\nMetricStreamStatisticsConfiguration\nMetricStreamStatisticsMetric\nMetricTimezone\nMetricToRetain\nMetricTransformation\nMetricType\nMetricTypes\nMetricV2\nMetricValue\nMetricValueList\nMetricWidget\nMetricWidgetImage\nMetricWindow\nMetrics\nMetricsAnalyzed\nMetricsAndOperator\nMetricsConfiguration\nMetricsConfigurationList\nMetricsDataSource\nMetricsEnabled\nMetricsLevel\nMetricsLevelUpdate\nMetricsOverLookbackPeriod\nMetricsSource\nMetricsSummary\nMetro\nMfa\nMfaAuthenticated\nMfaConfiguration\nMfaEmail\nMfaTypes\nMicroF1Score\nMicroPrecision\nMicroRecall\nMicrosoftSQLServerCatalogSource\nMicrosoftSQLServerCatalogTarget\nMicrosoftSQLServerSettings\nMicrosoftSqlServerDataProviderSettings\nMiddleName\nMigrateWorkspaceRequest\nMigrateWorkspaceResult\nMigrationAdmin\nMigrationAlert\nMigrationErrorReason\nMigrationErrorType\nMigrationProject\nMigrationProjectArn\nMigrationProjectCreationTime\nMigrationProjectIdentifier\nMigrationProjectName\nMigrationProjects\nMigrationSummary\nMigrationTask\nMigrationTaskName\nMigrationTaskSummary\nMigrationTaskSummaryList\nMigrationType\nMigrationWorkflowSummary\nMilestone\nMilestoneName\nMilestoneNumber\nMilestoneSummaries\nMilestoneSummary\nMillisBehindLatest\nMimeType\nMin\nMinAbrBitrate\nMinAdjustmentMagnitude\nMinAdjustmentStep\nMinAllocatedStorage\nMinAllowedConfidenceScoreForMerging\nMinBottomRenditionSize\nMinBoundingBoxHeight\nMinBoundingBoxWidth\nMinBufferTime\nMinBufferTimeSeconds\nMinCapacity\nMinCapacityUnits\nMinConfidence\nMinCount\nMinCoveragePercentage\nMinDuration\nMinEbpInterval\nMinFinalSegmentLength\nMinGwDiversity\nMinHealthyPercentage\nMinIInterval\nMinInferenceUnits\nMinInvocationsPerMinute\nMinIopsPerDbInstance\nMinIopsPerGib\nMinLatency\nMinLength\nMinLuminance\nMinMax\nMinMaxGradient\nMinModelVersion\nMinPartitions\nMinPauseBetweenCheckpoints\nMinPauseBetweenCheckpointsUpdate\nMinRange\nMinResource\nMinRetentionDays\nMinSegmentConfidence\nMinSegmentLength\nMinSelectedChoices\nMinSize\nMinSlotDurationInHours\nMinStorageBytesPercentage\nMinStorageSize\nMinStorageThroughputPerDbInstance\nMinStorageThroughputPerIops\nMinTTL\nMinTargetCapacity\nMinTermDurationInDays\nMinTopRenditionSize\nMinTrafficImpact\nMinUnits\nMinUpdatePeriodSeconds\nMinValue\nMinVersion\nMinVideoBitsPerSecond\nMinWorkers\nMinimalKeyLength\nMinimum\nMinimumBitrate\nMinimumCapacityUnits\nMinimumCompressionSize\nMinimumEngineVersion\nMinimumEngineVersionPerAllowedValue\nMinimumGranularity\nMinimumHealthyHosts\nMinimumHealthyPercent\nMinimumInstanceCount\nMinimumInstanceMetadataServiceVersion\nMinimumLabelType\nMinimumLength\nMinimumMembershipPercentage\nMinimumNormalizedUnitsUsedPerHour\nMinimumNumTapes\nMinimumNumberOfInstancesUsedPerHour\nMinimumNumberOfQueryingUsers\nMinimumPasswordLength\nMinimumProtocolVersion\nMinimumQueryCount\nMinimumRGBTolerance\nMinimumRequiredMinorEngineVersion\nMinimumRetention\nMinimumUnits\nMinimumValue\nMinimumYUV\nMinorRevision\nMinorVersion\nMinuteOfHour\nMinutes\nMissingAuthenticationToken\nMissingBlueprints\nMissingBody\nMissingCodecPrivateDataException\nMissingCompleteSensorData\nMissingComponent\nMissingContextValues\nMissingCount\nMissingDataConfiguration\nMissingDataConfigurations\nMissingDateVisibility\nMissingFileCacheConfiguration\nMissingFileSystemConfiguration\nMissingMeta\nMissingOnRds\nMissingParameterException\nMissingParameterValueException\nMissingPercentage\nMissingRenderingAttributeException\nMissingRequiredParameter\nMissingRequiredParameterException\nMissingSensorData\nMissingValues\nMissingVersionException\nMissingVolumeConfiguration\nMissingWorkflows\nMissionProfileIdResponse\nMissionProfileListItem\nMitigation\nMitigationAction\nMitigationActionIdentifier\nMitigationActionParams\nMitigationName\nMitigations\nMixed\nMixedInstancesPolicy\nMixedMeasureMapping\nMixedMeasureMappings\nMlConfigDefinition\nMlResourceDefinition\nMlUserDataEncryption\nMlUserDataEncryptionMode\nMnc\nMobile\nMobileDeviceAccessMatchedRule\nMobileDeviceAccessOverride\nMobileDeviceAccessRule\nMobileDeviceAccessRuleId\nMobilePhoneNumber\nMobileSdkRelease\nMode\nModeBlock\nModel\nModelApprovalStatus\nModelArn\nModelArtifact\nModelArtifacts\nModelBiasAppSpecification\nModelBiasBaselineConfig\nModelBiasJobInput\nModelBiasJobOutputConfig\nModelCacheSetting\nModelCard\nModelCardArn\nModelCardExportArtifacts\nModelCardExportJobArn\nModelCardExportJobName\nModelCardExportJobNameContains\nModelCardExportJobSummaries\nModelCardExportJobSummary\nModelCardExportOutputConfig\nModelCardName\nModelCardProcessingStatus\nModelCardSecurityConfig\nModelCardStatus\nModelCardSummaries\nModelCardSummary\nModelCardVersion\nModelCardVersionSummary\nModelCardVersionSummaryList\nModelClientConfig\nModelConfigs\nModelConfiguration\nModelCustomizationJobSummary\nModelDashboardEndpoint\nModelDashboardIndicator\nModelDashboardIndicatorAction\nModelDashboardModel\nModelDashboardModelCard\nModelDashboardMonitoringSchedule\nModelDataDownloadTimeoutInSeconds\nModelDataQuality\nModelDataSource\nModelDataUrl\nModelDeployConfig\nModelDeployResult\nModelDescription\nModelDigests\nModelEndpointDataBlob\nModelError\nModelErrorException\nModelExplainabilityAppSpecification\nModelExplainabilityBaselineConfig\nModelExplainabilityJobInput\nModelExplainabilityJobOutputConfig\nModelHandle\nModelId\nModelInfrastructureConfig\nModelInput\nModelInputConfiguration\nModelInsights\nModelIntrospectionSchema\nModelKmsKeyId\nModelLatency\nModelLatencyThreshold\nModelLatencyThresholds\nModelManifestSummary\nModelMetadata\nModelMetadataFilter\nModelMetadataSearchExpression\nModelMetadataSummaries\nModelMetadataSummary\nModelMetrics\nModelName\nModelNameBeginsWith\nModelNameContains\nModelNameEquals\nModelNotReadyException\nModelOutputConfiguration\nModelPackage\nModelPackageArn\nModelPackageArnList\nModelPackageContainerDefinition\nModelPackageDescription\nModelPackageGroup\nModelPackageGroupArn\nModelPackageGroupDescription\nModelPackageGroupName\nModelPackageGroupStatus\nModelPackageGroupSummary\nModelPackageGroupSummaryList\nModelPackageName\nModelPackageStatus\nModelPackageStatusDetails\nModelPackageStatusItem\nModelPackageSummaries\nModelPackageSummary\nModelPackageSummaryList\nModelPackageType\nModelPackageValidationProfile\nModelPackageValidationSpecification\nModelPackageVersion\nModelPackageVersionArn\nModelPackageVersionArnEquals\nModelPackagingConfiguration\nModelPackagingDescription\nModelPackagingJobDescription\nModelPackagingJobMetadata\nModelPackagingJobs\nModelPackagingMethod\nModelPackagingOutputDetails\nModelPerformance\nModelPolicy\nModelQuality\nModelQualityAppSpecification\nModelQualityBaselineConfig\nModelQualityJobInput\nModelQualityJobOutputConfig\nModelRegisterSettings\nModelScores\nModelSelectionExpression\nModelSettings\nModelSetupTime\nModelSignature\nModelStats\nModelStatus\nModelStepMetadata\nModelStreamError\nModelStreamErrorException\nModelSummaries\nModelSummary\nModelTimeoutException\nModelType\nModelVariantActions\nModelVariantConfig\nModelVariantConfigSummary\nModelVariants\nModelVersion\nModelVersionActivatedAt\nModelVersionArn\nModelVersionDetail\nModelVersionEvaluation\nModelVersionSummaries\nModelVersionSummary\nModels\nModerationLabel\nModerationLabels\nModerationModelVersion\nModerator\nModeratorArns\nModificationResults\nModificationState\nModificationStates\nModificationTime\nModifications\nModifiedAfter\nModifiedAt\nModifiedBefore\nModifiedDate\nModifiedRange\nModifiedSinceConstraint\nModifiedTimeAfter\nModifiedTimeBefore\nModifiedTimestamp\nModifierPercentage\nModifyAccountRequest\nModifyActivityStreamRequest\nModifyActivityStreamResponse\nModifyAddressAttributeRequest\nModifyAddressAttributeResult\nModifyAquaInputMessage\nModifyAquaOutputMessage\nModifyAuthenticationProfileMessage\nModifyAuthenticationProfileResult\nModifyAvailabilityZoneGroupRequest\nModifyAvailabilityZoneGroupResult\nModifyBackupAttributesRequest\nModifyBackupAttributesResponse\nModifyCacheClusterMessage\nModifyCacheClusterResult\nModifyCacheParameterGroupMessage\nModifyCacheSubnetGroupMessage\nModifyCacheSubnetGroupResult\nModifyCapacityReservationFleetRequest\nModifyCapacityReservationFleetResult\nModifyCapacityReservationRequest\nModifyCapacityReservationResult\nModifyCertificateBasedAuthPropertiesRequest\nModifyCertificatesMessage\nModifyCertificatesResult\nModifyClientPropertiesRequest\nModifyClientVpnEndpointRequest\nModifyClientVpnEndpointResult\nModifyClusterDbRevisionMessage\nModifyClusterDbRevisionResult\nModifyClusterIamRolesMessage\nModifyClusterIamRolesResult\nModifyClusterInput\nModifyClusterMaintenanceMessage\nModifyClusterMaintenanceResult\nModifyClusterMessage\nModifyClusterOutput\nModifyClusterParameterGroupMessage\nModifyClusterRequest\nModifyClusterResponse\nModifyClusterResult\nModifyClusterSnapshotMessage\nModifyClusterSnapshotResult\nModifyClusterSnapshotScheduleMessage\nModifyClusterSubnetGroupMessage\nModifyClusterSubnetGroupResult\nModifyConversionConfigurationMessage\nModifyConversionConfigurationResponse\nModifyCurrentDBClusterCapacityMessage\nModifyCustomDBEngineVersionMessage\nModifyCustomDomainAssociationMessage\nModifyCustomDomainAssociationResult\nModifyDBClusterEndpointMessage\nModifyDBClusterEndpointOutput\nModifyDBClusterMessage\nModifyDBClusterParameterGroupMessage\nModifyDBClusterResult\nModifyDBClusterSnapshotAttributeMessage\nModifyDBClusterSnapshotAttributeResult\nModifyDBInstanceMessage\nModifyDBInstanceResult\nModifyDBParameterGroupMessage\nModifyDBProxyEndpointRequest\nModifyDBProxyEndpointResponse\nModifyDBProxyRequest\nModifyDBProxyResponse\nModifyDBProxyTargetGroupRequest\nModifyDBProxyTargetGroupResponse\nModifyDBSnapshotAttributeMessage\nModifyDBSnapshotAttributeResult\nModifyDBSnapshotMessage\nModifyDBSnapshotResult\nModifyDBSubnetGroupMessage\nModifyDBSubnetGroupResult\nModifyDataProviderMessage\nModifyDataProviderResponse\nModifyDefaultCreditSpecificationRequest\nModifyDefaultCreditSpecificationResult\nModifyDocumentPermissionRequest\nModifyEbsDefaultKmsKeyIdRequest\nModifyEbsDefaultKmsKeyIdResult\nModifyEndpointAccessMessage\nModifyEndpointMessage\nModifyEndpointResponse\nModifyEventSubscriptionMessage\nModifyEventSubscriptionResponse\nModifyEventSubscriptionResult\nModifyFleetRequest\nModifyFleetResult\nModifyFpgaImageAttributeRequest\nModifyFpgaImageAttributeResult\nModifyGlobalClusterMessage\nModifyGlobalClusterResult\nModifyGlobalReplicationGroupMessage\nModifyGlobalReplicationGroupResult\nModifyHapgRequest\nModifyHapgResponse\nModifyHostsRequest\nModifyHostsResult\nModifyHsmRequest\nModifyHsmResponse\nModifyIdFormatRequest\nModifyIdentityIdFormatRequest\nModifyImageAttributeRequest\nModifyInstanceAttributeRequest\nModifyInstanceCapacityReservationAttributesRequest\nModifyInstanceCapacityReservationAttributesResult\nModifyInstanceCreditSpecificationRequest\nModifyInstanceCreditSpecificationResult\nModifyInstanceEventStartTimeRequest\nModifyInstanceEventStartTimeResult\nModifyInstanceEventWindowRequest\nModifyInstanceEventWindowResult\nModifyInstanceFleetInput\nModifyInstanceGroupsInput\nModifyInstanceMaintenanceOptionsRequest\nModifyInstanceMaintenanceOptionsResult\nModifyInstanceMetadataOptionsRequest\nModifyInstanceMetadataOptionsResult\nModifyInstancePlacementRequest\nModifyInstancePlacementResult\nModifyInstanceProfileMessage\nModifyInstanceProfileResponse\nModifyIpamPoolRequest\nModifyIpamPoolResult\nModifyIpamRequest\nModifyIpamResourceCidrRequest\nModifyIpamResourceCidrResult\nModifyIpamResourceDiscoveryRequest\nModifyIpamResourceDiscoveryResult\nModifyIpamResult\nModifyIpamScopeRequest\nModifyIpamScopeResult\nModifyLaunchTemplateRequest\nModifyLaunchTemplateResult\nModifyListenerInput\nModifyListenerOutput\nModifyLoadBalancerAttributesInput\nModifyLoadBalancerAttributesOutput\nModifyLocalGatewayRouteRequest\nModifyLocalGatewayRouteResult\nModifyLunaClientRequest\nModifyLunaClientResponse\nModifyManagedPrefixListRequest\nModifyManagedPrefixListResult\nModifyMigrationProjectMessage\nModifyMigrationProjectResponse\nModifyMountTargetSecurityGroupsRequest\nModifyNetworkInterfaceAttributeRequest\nModifyOptionGroupMessage\nModifyOptionGroupResult\nModifyPrivateDnsNameOptionsRequest\nModifyPrivateDnsNameOptionsResult\nModifyRecommendationDetail\nModifyReplicationConfigMessage\nModifyReplicationConfigResponse\nModifyReplicationGroupMessage\nModifyReplicationGroupResult\nModifyReplicationGroupShardConfigurationMessage\nModifyReplicationGroupShardConfigurationResult\nModifyReplicationInstanceMessage\nModifyReplicationInstanceResponse\nModifyReplicationSubnetGroupMessage\nModifyReplicationSubnetGroupResponse\nModifyReplicationTaskMessage\nModifyReplicationTaskResponse\nModifyReportDefinitionRequest\nModifyReservedInstancesRequest\nModifyReservedInstancesResult\nModifyRuleInput\nModifyRuleOutput\nModifySamlPropertiesRequest\nModifyScheduledActionMessage\nModifySecurityGroupRulesRequest\nModifySecurityGroupRulesResult\nModifySelfservicePermissionsRequest\nModifySnapshotAttributeRequest\nModifySnapshotCopyRetentionPeriodMessage\nModifySnapshotCopyRetentionPeriodResult\nModifySnapshotScheduleMessage\nModifySnapshotTierRequest\nModifySnapshotTierResult\nModifySpotFleetRequestRequest\nModifySpotFleetRequestResponse\nModifyStatus\nModifySubnetAttributeRequest\nModifyTargetGroupAttributesInput\nModifyTargetGroupAttributesOutput\nModifyTargetGroupInput\nModifyTargetGroupOutput\nModifyTrafficMirrorFilterNetworkServicesRequest\nModifyTrafficMirrorFilterNetworkServicesResult\nModifyTrafficMirrorFilterRuleRequest\nModifyTrafficMirrorFilterRuleResult\nModifyTrafficMirrorSessionRequest\nModifyTrafficMirrorSessionResult\nModifyTransitGatewayOptions\nModifyTransitGatewayPrefixListReferenceRequest\nModifyTransitGatewayPrefixListReferenceResult\nModifyTransitGatewayRequest\nModifyTransitGatewayResult\nModifyTransitGatewayVpcAttachmentRequest\nModifyTransitGatewayVpcAttachmentRequestOptions\nModifyTransitGatewayVpcAttachmentResult\nModifyUsageLimitMessage\nModifyUserGroupMessage\nModifyUserMessage\nModifyVerifiedAccessEndpointEniOptions\nModifyVerifiedAccessEndpointLoadBalancerOptions\nModifyVerifiedAccessEndpointPolicyRequest\nModifyVerifiedAccessEndpointPolicyResult\nModifyVerifiedAccessEndpointRequest\nModifyVerifiedAccessEndpointResult\nModifyVerifiedAccessGroupPolicyRequest\nModifyVerifiedAccessGroupPolicyResult\nModifyVerifiedAccessGroupRequest\nModifyVerifiedAccessGroupResult\nModifyVerifiedAccessInstanceLoggingConfigurationRequest\nModifyVerifiedAccessInstanceLoggingConfigurationResult\nModifyVerifiedAccessInstanceRequest\nModifyVerifiedAccessInstanceResult\nModifyVerifiedAccessTrustProviderOidcOptions\nModifyVerifiedAccessTrustProviderRequest\nModifyVerifiedAccessTrustProviderResult\nModifyVolumeAttributeRequest\nModifyVolumeRequest\nModifyVolumeResult\nModifyVpcAttributeRequest\nModifyVpcEndpointConnectionNotificationRequest\nModifyVpcEndpointConnectionNotificationResult\nModifyVpcEndpointRequest\nModifyVpcEndpointResult\nModifyVpcEndpointServiceConfigurationRequest\nModifyVpcEndpointServiceConfigurationResult\nModifyVpcEndpointServicePayerResponsibilityRequest\nModifyVpcEndpointServicePayerResponsibilityResult\nModifyVpcEndpointServicePermissionsRequest\nModifyVpcEndpointServicePermissionsResult\nModifyVpcPeeringConnectionOptionsRequest\nModifyVpcPeeringConnectionOptionsResult\nModifyVpcTenancyRequest\nModifyVpcTenancyResult\nModifyVpnConnectionOptionsRequest\nModifyVpnConnectionOptionsResult\nModifyVpnConnectionRequest\nModifyVpnConnectionResult\nModifyVpnTunnelCertificateRequest\nModifyVpnTunnelCertificateResult\nModifyVpnTunnelOptionsRequest\nModifyVpnTunnelOptionsResult\nModifyVpnTunnelOptionsSpecification\nModifyWorkspaceAccessPropertiesRequest\nModifyWorkspaceCreationPropertiesRequest\nModifyWorkspacePropertiesRequest\nModifyWorkspaceStateRequest\nModifyingProcess\nModuleFilePath\nModuleInfo\nModuleLoggingConfiguration\nModuleLoggingConfigurationInput\nModuleName\nModuleSha256\nMonday\nMonetaryAmount\nMongoDBTarget\nMongoDBTargets\nMongoDbDataProviderSettings\nMongoDbSettings\nMonitor\nMonitorArn\nMonitorArnList\nMonitorConfig\nMonitorContactRequest\nMonitorContactResponse\nMonitorDataSource\nMonitorDimension\nMonitorErrorDetails\nMonitorInfo\nMonitorInstancesRequest\nMonitorInstancesResult\nMonitorName\nMonitorSpecification\nMonitorStatus\nMonitorSummary\nMonitorType\nMonitored\nMonitoredResourceARN\nMonitoredResourceIdentifier\nMonitoredResourceIdentifiers\nMonitoredResourceInfo\nMonitoredResourceName\nMonitoring\nMonitoringAlertActions\nMonitoringAlertHistory\nMonitoringAlertHistorySummary\nMonitoringAlertName\nMonitoringAlertSummaries\nMonitoringAlertSummary\nMonitoringAppSpecification\nMonitoringBaselineConfig\nMonitoringClusterConfig\nMonitoringConfiguration\nMonitoringConfigurationDescription\nMonitoringConfigurationUpdate\nMonitoringConstraintsResource\nMonitoringCsvDatasetFormat\nMonitoringDatasetFormat\nMonitoringExecutionStatus\nMonitoringExecutionSummaries\nMonitoringExecutionSummary\nMonitoringGroundTruthS3Input\nMonitoringInput\nMonitoringInputs\nMonitoringInterval\nMonitoringJobDefinition\nMonitoringJobDefinitionArn\nMonitoringJobDefinitionName\nMonitoringJobDefinitionSummary\nMonitoringJsonDatasetFormat\nMonitoringNetworkConfig\nMonitoringOutput\nMonitoringOutputConfig\nMonitoringOutputs\nMonitoringResources\nMonitoringRoleArn\nMonitoringS3Output\nMonitoringSchedule\nMonitoringScheduleArn\nMonitoringScheduleConfig\nMonitoringScheduleName\nMonitoringScheduleStatus\nMonitoringScheduleSummaries\nMonitoringScheduleSummary\nMonitoringSchedules\nMonitoringStatisticsResource\nMonitoringStoppingCondition\nMonitoringSubscription\nMonitoringSubscriptionAlreadyExists\nMonitoringTimeInMinutes\nMonitoringType\nMonitoringTypeEquals\nMonitors\nMonotonicValues\nMonotonicity\nMonth\nMonthlyCost\nMonthlyLeasingPrice\nMonthlyLimit\nMonthlySchedule\nMonthlySetting\nMonthlySettings\nMonthlyTransfer\nMoovPlacement\nMostRecent\nMotionGraphicsActivateScheduleActionSettings\nMotionGraphicsConfiguration\nMotionGraphicsImageActivateSettings\nMotionGraphicsImageDeactivateSettings\nMotionGraphicsInsertion\nMotionGraphicsSettings\nMotionImageInserter\nMotionImageInsertionFramerate\nMotionImageInsertionOffset\nMountName\nMountOptions\nMountPath\nMountPoint\nMountPoints\nMountSource\nMountTarget\nMountTargetConflict\nMountTargetDescription\nMountTargetId\nMountTargetNotFound\nMountTargets\nMouthOpen\nMovSettings\nMoveAccountRequest\nMoveAddressToVpcRequest\nMoveAddressToVpcResult\nMoveByoipCidrToIpamRequest\nMoveByoipCidrToIpamResult\nMoveReplicationTaskMessage\nMoveReplicationTaskResponse\nMoveStatus\nMoveToColdStorageAfterDays\nMoveToColdStorageAt\nMoveToVersionId\nMoverSize\nMovingAddressStatus\nMovingAddressStatuses\nMp2Settings\nMp3Settings\nMp4MajorBrand\nMp4Settings\nMpdLocation\nMpdManifestBandwidthType\nMpdProfile\nMpdSettings\nMpeg2FilterSettings\nMpeg2FourCCControl\nMpeg2Settings\nMqttContext\nMqttHeaders\nMrap\nMsSmoothAdditionalManifest\nMsSmoothEncryptionSettings\nMsSmoothGroupSettings\nMsSmoothOutputSettings\nMsrcNumber\nMsrcSeverity\nMssEncryption\nMssManifest\nMssManifests\nMssPackage\nMtime\nMultiAZ\nMultiAZCapable\nMultiAZEnabled\nMultiAZWithStandbyEnabled\nMultiAttachEnabled\nMultiAz\nMultiCondition\nMultiConditionalBranch\nMultiConditionalSplitActivity\nMultiLayerStorage\nMultiLine\nMultiLineStartPattern\nMultiMeasureAttributeMapping\nMultiMeasureAttributeMappings\nMultiMeasureMappings\nMultiModelConfig\nMultiPolygonGeometryInput\nMultiRegion\nMultiRegionAccessPointDetails\nMultiRegionAccessPointPolicyDocument\nMultiRegionAccessPointRegionalResponse\nMultiRegionAccessPointReport\nMultiRegionAccessPointRoute\nMultiRegionAccessPointsAsyncResponse\nMultiRegionConfiguration\nMultiRegionEnabled\nMultiRegionKey\nMultiRegionKeyType\nMultiValueAnswer\nMulticast\nMulticastDeviceStatus\nMulticastDomainAssociations\nMulticastFrameInfo\nMulticastGroup\nMulticastGroupByFuotaTask\nMulticastGroupId\nMulticastGroupList\nMulticastGroups\nMulticastGroupsToAdd\nMulticastGroupsToRemove\nMulticastIp\nMulticastSupport\nMulticastWirelessMetadata\nMultiline\nMultipartReadSetUploadListItem\nMultipartUpload\nMultipartUploadId\nMultipleConflictResolutionEntriesException\nMultipleIamArnsProvidedException\nMultipleOperatingModes\nMultipleRepositoriesInPullRequestException\nMultipleValuesSetting\nMultiplex\nMultiplexGroupSettings\nMultiplexId\nMultiplexIds\nMultiplexMediaConnectOutputDestinationSettings\nMultiplexOutputDestination\nMultiplexOutputSettings\nMultiplexProgram\nMultiplexProgramChannelDestinationSettings\nMultiplexProgramPacketIdentifiersMap\nMultiplexProgramPipelineDetail\nMultiplexProgramServiceDescriptor\nMultiplexProgramSettings\nMultiplexProgramSummary\nMultiplexPrograms\nMultiplexSettings\nMultiplexSettingsSummary\nMultiplexStatmuxVideoSettings\nMultiplexSummary\nMultiplexVideoSettings\nMultiplexes\nMunicipality\nMustBeOwnedByCaller\nMustBeRequestable\nMustache\nMutable\nMutableClusterInfo\nMutationActionSetStateParameter\nMutationProtection\nMutualAuthentication\nMutualTlsAuthentication\nMutualTlsAuthenticationInput\nMutuallyExclusiveParameters\nMuxType\nMxfSettings\nMxfXavcProfileSettings\nMySQLCatalogSource\nMySQLCatalogTarget\nMySQLSettings\nMySqlDataProviderSettings\nMySqlParameters\nN\nNE\nNFS\nNFSDataRepositoryConfiguration\nNFSFileShareDefaults\nNFSFileShareInfo\nNFSFileShareInfoList\nNFSOnDeviceService\nNFSOnDeviceServiceConfiguration\nNLBResource\nNS\nName\nNameAlreadyExistsException\nNameAssigner\nNameAvailabilityException\nNameContains\nNameFilter\nNameInUseException\nNameLengthExceededException\nNameModifier\nNameNodes\nNamePrefix\nNamePrefixUpdate\nNameQualifier\nNameServers\nNameServersUpdateState\nNameStartsWith\nNameTag\nNameUpdate\nNameValuePair\nNamedEntities\nNamedEntityDefinition\nNamedEntityDefinitionMetric\nNamedQueries\nNamedQuery\nNamedQueryId\nNamedQueryIds\nNames\nNameserver\nNameservers\nNamespace\nNamespaceAlreadyExists\nNamespaceError\nNamespaceFilter\nNamespaceId\nNamespaceInfoV2\nNamespaceName\nNamespaceNotFound\nNamespaceNotFoundException\nNamespacePid\nNamespaceProperties\nNamespaceSummary\nNamespaceType\nNamespaces\nNarrative\nNatGateway\nNatGatewayAddress\nNatGatewayAddresses\nNatGatewayId\nNatGatewayIds\nNatGateways\nNativeClientId\nNavigationOperation\nNcharCharacterSetName\nNearestModelName\nNegate\nNegated\nNegative\nNegativeColor\nNegativeFormat\nNegativeValueConfiguration\nNeighborConnectionDetail\nNeighborhood\nNeoVpcConfig\nNeptuneSettings\nNeq\nNestedFilters\nNestedPropertyName\nNestingLevel\nNetAppONTAPCluster\nNetAppONTAPClusters\nNetAppONTAPSVM\nNetAppONTAPSVMs\nNetAppONTAPVolume\nNetAppONTAPVolumes\nNetBiosName\nNetIdFilters\nNetRISavings\nNetSavings\nNetmaskLength\nNetwork\nNetworkACLEntry\nNetworkAccessConfiguration\nNetworkAcl\nNetworkAclAssociation\nNetworkAclAssociationId\nNetworkAclEntry\nNetworkAclId\nNetworkAclIds\nNetworkAcls\nNetworkAnalyzerConfigurationList\nNetworkAnalyzerConfigurations\nNetworkArtifactMeta\nNetworkBandwidthGbps\nNetworkBandwidthGbpsRequest\nNetworkBinding\nNetworkBorderGroup\nNetworkCardIndex\nNetworkCardInfo\nNetworkCards\nNetworkConfig\nNetworkConfiguration\nNetworkConnectionAction\nNetworkDestinationDomain\nNetworkDestinationIpV4\nNetworkDestinationIpV6\nNetworkDestinationPort\nNetworkDirection\nNetworkEndBlackout\nNetworkEndBlackoutImage\nNetworkEthereumAttributes\nNetworkEventType\nNetworkFabricAttributes\nNetworkFabricConfiguration\nNetworkFabricType\nNetworkFailureException\nNetworkFirewallBlackHoleRouteDetectedViolation\nNetworkFirewallInternetTrafficNotInspectedViolation\nNetworkFirewallInvalidRouteConfigurationViolation\nNetworkFirewallMissingExpectedRTViolation\nNetworkFirewallMissingExpectedRoutesViolation\nNetworkFirewallMissingFirewallViolation\nNetworkFirewallMissingSubnetViolation\nNetworkFirewallPolicy\nNetworkFirewallPolicyDescription\nNetworkFirewallPolicyModifiedViolation\nNetworkFirewallStatefulRuleGroupOverride\nNetworkFirewallUnexpectedFirewallRoutesViolation\nNetworkFirewallUnexpectedGatewayRoutesViolation\nNetworkFrameworkAttributes\nNetworkFrameworkConfiguration\nNetworkHeader\nNetworkId\nNetworkImpairment\nNetworkInBytesPerSecond\nNetworkInfo\nNetworkInputSettings\nNetworkInsightsAccessScope\nNetworkInsightsAccessScopeAnalyses\nNetworkInsightsAccessScopeAnalysis\nNetworkInsightsAccessScopeAnalysisArn\nNetworkInsightsAccessScopeAnalysisId\nNetworkInsightsAccessScopeAnalysisIds\nNetworkInsightsAccessScopeArn\nNetworkInsightsAccessScopeContent\nNetworkInsightsAccessScopeId\nNetworkInsightsAccessScopeIds\nNetworkInsightsAccessScopes\nNetworkInsightsAnalyses\nNetworkInsightsAnalysis\nNetworkInsightsAnalysisArn\nNetworkInsightsAnalysisId\nNetworkInsightsAnalysisIds\nNetworkInsightsPath\nNetworkInsightsPathArn\nNetworkInsightsPathId\nNetworkInsightsPathIds\nNetworkInsightsPaths\nNetworkInterface\nNetworkInterfaceAssociation\nNetworkInterfaceAttachment\nNetworkInterfaceAttachmentChanges\nNetworkInterfaceCount\nNetworkInterfaceCountRequest\nNetworkInterfaceDeviceIndex\nNetworkInterfaceId\nNetworkInterfaceIds\nNetworkInterfaceIpv6Address\nNetworkInterfaceLimitExceeded\nNetworkInterfaceOptions\nNetworkInterfaceOwnerId\nNetworkInterfacePermission\nNetworkInterfacePermissionId\nNetworkInterfacePermissionIds\nNetworkInterfacePermissionState\nNetworkInterfacePermissions\nNetworkInterfacePort\nNetworkInterfacePrivateIpAddress\nNetworkInterfaceSet\nNetworkInterfaceType\nNetworkInterfaces\nNetworkLoadBalancerArn\nNetworkLoadBalancerArns\nNetworkMode\nNetworkName\nNetworkOrigin\nNetworkOutBytesPerSecond\nNetworkOutput\nNetworkPacketsInPerSecond\nNetworkPacketsOutPerSecond\nNetworkPath\nNetworkPathComponent\nNetworkPathComponentDetails\nNetworkPathFound\nNetworkPayload\nNetworkPerformance\nNetworkPlatform\nNetworkPolicyCount\nNetworkProfile\nNetworkProfileArn\nNetworkProfileData\nNetworkProfileInfo\nNetworkProfileName\nNetworkProfiles\nNetworkProtocol\nNetworkReachabilityDetails\nNetworkResource\nNetworkResourceCount\nNetworkResourceCounts\nNetworkResourceDefinition\nNetworkResourceSummary\nNetworkResourceUtilization\nNetworkResources\nNetworkRoute\nNetworkRouteDestination\nNetworkRoutes\nNetworkServices\nNetworkSettings\nNetworkSettingsSummary\nNetworkSite\nNetworkSource\nNetworkSourceDomain\nNetworkSourceIpV4\nNetworkSourceIpV6\nNetworkSourceMac\nNetworkSourcePort\nNetworkStatus\nNetworkSummary\nNetworkTelemetry\nNetworkType\nNetworkTypeNotSupported\nNetworkingConfiguration\nNetworks\nNeutral\nNeverAggregateInFilter\nNeverExpires\nNewAction\nNewAssertionRule\nNewAssociationId\nNewAvailabilityZones\nNewBGPPeer\nNewBudget\nNewClusterIdentifier\nNewColumnName\nNewColumnType\nNewComponentName\nNewContactIds\nNewCustomKeyStoreName\nNewCustomVocabularyItem\nNewDBClusterIdentifier\nNewDBInstanceIdentifier\nNewDBProxyEndpointName\nNewDBProxyName\nNewDefaultValues\nNewDeviceMetadata\nNewDeviceMetadataType\nNewDhcpConfiguration\nNewGameSessionProtectionPolicy\nNewGameSessionsPerCreator\nNewGatingRule\nNewGlobalClusterIdentifier\nNewGroupName\nNewImage\nNewInThisVersionBulletPoints\nNewInstancesProtectedFromScaleIn\nNewLaunchProfileMember\nNewMembers\nNewName\nNewNotification\nNewObjectMetadata\nNewObjectTagging\nNewParameterName\nNewPassword\nNewPath\nNewPrivateVirtualInterface\nNewPrivateVirtualInterfaceAllocation\nNewPublicVirtualInterface\nNewPublicVirtualInterfaceAllocation\nNewReplicaCount\nNewReplicationFactor\nNewServerCertificateName\nNewStartingHashKey\nNewStudioMember\nNewSubscriber\nNewSupportedProducts\nNewTableName\nNewTransitVirtualInterface\nNewTransitVirtualInterfaceAllocation\nNewUserName\nNewValue\nNewValues\nNewVersion\nNewerNoncurrentVersions\nNexGuardFileMarkerSettings\nNexguardFileMarkerSettings\nNextActivity\nNextContinentCode\nNextContinuationToken\nNextCountryCode\nNextDNSName\nNextExecutionTime\nNextHostedZoneId\nNextInvocationTime\nNextInvocations\nNextKeyMarker\nNextLockToken\nNextMaintenanceWindowStartTime\nNextMarker\nNextPageMarker\nNextPageToken\nNextPartNumberMarker\nNextPassword\nNextPollConfigurationToken\nNextPollIntervalInSeconds\nNextRecordIdentifier\nNextRecordName\nNextRecordType\nNextRefreshTime\nNextRotationDate\nNextScheduledRetrainingStartDate\nNextSchemaVersion\nNextShardIterator\nNextSigningKeyLength\nNextSlotStartTime\nNextStatus\nNextStep\nNextSubdivisionCode\nNextToken\nNextTransitionTime\nNextUpdateAvailabilityDate\nNextUpdateAvailabilityTime\nNextUpdateSeconds\nNextUploadIdMarker\nNextVersionIdMarker\nNextWebACLLockToken\nNfs\nNfsExported\nNfsExportedVolumes\nNfsExports\nNfsMountOptions\nNice\nNickName\nNielsenCBET\nNielsenCbetSettings\nNielsenConfiguration\nNielsenDistributionType\nNielsenId3\nNielsenId3Behavior\nNielsenNaesIiNw\nNielsenNaesIiNwSettings\nNielsenNonLinearWatermark\nNielsenNonLinearWatermarkSettings\nNielsenPcmToId3Tagging\nNielsenWatermarksSettings\nNitInterval\nNitroEnclavesSupport\nNitroTpmInfo\nNitroTpmSupport\nNlbArn\nNlbName\nNoActionEmail\nNoAssociatedRoleException\nNoAvailableCertificateException\nNoAvailableConfigurationRecorderException\nNoAvailableDeliveryChannelException\nNoAvailableOrganizationException\nNoChangeException\nNoConnectorsAvailableException\nNoData\nNoDataRetentionException\nNoDatabaseMigrationPreference\nNoDevice\nNoEcho\nNoEncryptionConfig\nNoEntitlementsAllowedException\nNoExpiry\nNoFreeAddressesInSubnet\nNoHexPrefix\nNoManagementAccountSLRExistsException\nNoManagementPreference\nNoOperationFault\nNoPasswordRequired\nNoReboot\nNoRegionalBlackoutFlag\nNoRestrictions\nNoRunningConfigurationRecorderException\nNoScheduleException\nNoSecurityExtension\nNoSquashNids\nNoSuchBucketException\nNoSuchCachePolicy\nNoSuchChange\nNoSuchCidrCollectionException\nNoSuchCidrLocationException\nNoSuchCloudFrontOriginAccessIdentity\nNoSuchCloudWatchLogsLogGroup\nNoSuchConfigRuleException\nNoSuchConfigRuleInConformancePackException\nNoSuchConfigurationAggregatorException\nNoSuchConfigurationRecorderException\nNoSuchConformancePackException\nNoSuchContinuousDeploymentPolicy\nNoSuchDelegationSet\nNoSuchDeliveryChannelException\nNoSuchDistribution\nNoSuchEntityException\nNoSuchFieldLevelEncryptionConfig\nNoSuchFieldLevelEncryptionProfile\nNoSuchFunctionExists\nNoSuchGeoLocation\nNoSuchHealthCheck\nNoSuchHostedZone\nNoSuchInvalidation\nNoSuchKeySigningKey\nNoSuchMonitoringSubscription\nNoSuchOrganizationConfigRuleException\nNoSuchOrganizationConformancePackException\nNoSuchOrigin\nNoSuchOriginAccessControl\nNoSuchOriginRequestPolicy\nNoSuchPublicAccessBlockConfiguration\nNoSuchPublicKey\nNoSuchQueryLoggingConfig\nNoSuchRealtimeLogConfig\nNoSuchRemediationConfigurationException\nNoSuchRemediationExceptionException\nNoSuchResource\nNoSuchResourceException\nNoSuchResponseHeadersPolicy\nNoSuchRetentionConfigurationException\nNoSuchStreamingDistribution\nNoSuchTrafficPolicy\nNoSuchTrafficPolicyInstance\nNoUpdateAvailableException\nNoVoteCount\nNode\nNodeARN\nNodeAssociationStatus\nNodeAssociationStatusToken\nNodeConfiguration\nNodeConfigurationOption\nNodeConfigurationOptionList\nNodeConfigurationOptionsFilter\nNodeConfigurationOptionsMessage\nNodeCount\nNodeCounts\nNodeCreateTime\nNodeDeletionDate\nNodeDescription\nNodeDetails\nNodeEthereumAttributes\nNodeExporter\nNodeExporterInfo\nNodeFabricAttributes\nNodeFabricLogPublishingConfiguration\nNodeFrameworkAttributes\nNodeFromTemplateJob\nNodeFromTemplateJobs\nNodeGroup\nNodeGroupConfiguration\nNodeGroupCount\nNodeGroupId\nNodeGroupMember\nNodeGroupMemberUpdateStatus\nNodeGroupMembers\nNodeGroupNotFoundFault\nNodeGroupUpdateStatus\nNodeGroups\nNodeGroupsPerReplicationGroupQuotaExceededFault\nNodeGroupsToRemove\nNodeGroupsToRetain\nNodeId\nNodeIds\nNodeIdsToReboot\nNodeIdsToRemove\nNodeInfo\nNodeInfoList\nNodeInputPort\nNodeInstance\nNodeInstanceId\nNodeInstances\nNodeInterface\nNodeLogPublishingConfiguration\nNodeName\nNodeNotFoundFault\nNodeOutputPort\nNodeOverrides\nNodeProperties\nNodePropertiesSummary\nNodePropertyOverride\nNodeQuotaForClusterExceededFault\nNodeQuotaForCustomerExceededFault\nNodeRangeProperty\nNodeRole\nNodeSignal\nNodeSignals\nNodeSnapshot\nNodeSnapshots\nNodeStatus\nNodeStructure\nNodeSummary\nNodeToNodeEncryptionOptions\nNodeToNodeEncryptionOptionsStatus\nNodeType\nNodeTypeSpecificValue\nNodeTypeSpecificValues\nNodeUpdateEndDate\nNodeUpdateInitiatedBy\nNodeUpdateInitiatedDate\nNodeUpdateStartDate\nNodeUpdateStatus\nNodeUpdateStatusModifiedDate\nNodegroup\nNodegroupHealth\nNodegroupResources\nNodegroupScalingConfig\nNodegroupUpdateConfig\nNodes\nNodesUpdated\nNoiseReducer\nNoiseReducerFilterSettings\nNoiseReducerSpatialFilterSettings\nNoiseReducerTemporalFilterSettings\nNonAdditive\nNonAwsRegions\nNonCompliantConformancePackCount\nNonCompliantCount\nNonCompliantCriticalCount\nNonCompliantHighCount\nNonCompliantInformationalCount\nNonCompliantLowCount\nNonCompliantMediumCount\nNonCompliantResource\nNonCompliantResourceCount\nNonCompliantResources\nNonCompliantRuleCount\nNonCompliantSummary\nNonCompliantUnspecifiedCount\nNonDeletedNetworkInterfaceIds\nNonKeyAttributes\nNonOverridableArguments\nNonRepudiation\nNonRetryableError\nNonTalkTimeFilter\nNonce\nNoncompliantKeys\nNoncurrentDays\nNoncurrentVersionExpiration\nNoncurrentVersionExpirationInDays\nNoncurrentVersionTransition\nNoncurrentVersionTransitions\nNone\nNormal\nNormalized\nNormalizedInstanceHours\nNormalizedValue\nNorth\nNot\nNotAcceptableException\nNotActions\nNotAfter\nNotAfterDate\nNotAllowedAggregations\nNotApplicable\nNotApplicableCount\nNotApplicableEnabled\nNotAuthorizedException\nNotBefore\nNotBeforeDate\nNotBeforeDeadline\nNotConfiguredException\nNotDeviceModels\nNotDeviceOperatingSystems\nNotDeviceTypes\nNotDeviceUserAgents\nNotEligibleException\nNotEndsWith\nNotEquals\nNotFilter\nNotFoundException\nNotImpersonationRoleIds\nNotIndexException\nNotIpRanges\nNotLatestPipelineExecutionException\nNotNodeException\nNotOrganizationManagementAccountException\nNotOrganizationMasterAccountException\nNotPolicyException\nNotReadableInputStreamException\nNotResources\nNotScaledReason\nNotScaledReasons\nNotServiceResourceError\nNotStabilizedException\nNotStartsWith\nNotStatement\nNotSupportedOperationException\nNotTargetUsers\nNotUpdatableException\nNotUserIds\nNote\nNoteText\nNoteUpdate\nNoteUpdatedAt\nNoteUpdatedBy\nNotebookExecution\nNotebookExecutionId\nNotebookExecutionName\nNotebookExecutionSummary\nNotebookExecutions\nNotebookId\nNotebookInstanceArn\nNotebookInstanceLifecycleConfigArn\nNotebookInstanceLifecycleConfigName\nNotebookInstanceLifecycleConfigNameContains\nNotebookInstanceLifecycleConfigSummary\nNotebookInstanceLifecycleConfigs\nNotebookInstanceLifecycleHook\nNotebookInstanceName\nNotebookInstanceSecurityGroupId\nNotebookInstanceStatus\nNotebookInstanceSummary\nNotebookInstances\nNotebookMetadata\nNotebookMetadataList\nNotebookOutputOption\nNotebookParams\nNotebookS3Location\nNotebookS3LocationForOutput\nNotebookS3LocationFromInput\nNotebookSessionSummary\nNotebookSessionsList\nNotebookUrl\nNotebookVersion\nNotes\nNotification\nNotificationARNs\nNotificationAction\nNotificationArn\nNotificationArns\nNotificationAttributes\nNotificationChannel\nNotificationChannelConfig\nNotificationConfig\nNotificationConfiguration\nNotificationConfigurationFilter\nNotificationConfigurations\nNotificationContext\nNotificationDestinationConfig\nNotificationEmail\nNotificationEvents\nNotificationFilterConfig\nNotificationId\nNotificationMetadata\nNotificationOptions\nNotificationPolicy\nNotificationProperty\nNotificationRecipientType\nNotificationRuleSummary\nNotificationRules\nNotificationSetting\nNotificationSettingDetail\nNotificationSettingKey\nNotificationSpecification\nNotificationState\nNotificationSummaries\nNotificationSummary\nNotificationTarget\nNotificationTargetARN\nNotificationTargetActions\nNotificationTopicArn\nNotificationTopicStatus\nNotificationType\nNotificationTypes\nNotificationWithSubscribers\nNotifications\nNotificationsConfiguration\nNotificationsEnabled\nNotificationsWithSubscribers\nNotify\nNotifyAll\nNotifyAppValidationOutputRequest\nNotifyApplicationStateRequest\nNotifyCollaborators\nNotifyConfiguration\nNotifyConfigurationType\nNotifyDelayAfter\nNotifyEmailType\nNotifyMigrationTaskStateRequest\nNotifyObjectCompleteInput\nNotifyObjectCompleteOutput\nNotifyProvisionProductEngineWorkflowResultInput\nNotifyRecommendationsReceivedError\nNotifyRecommendationsReceivedRequest\nNotifyRecommendationsReceivedResponse\nNotifyResourceDeploymentStatusChangeInput\nNotifyTerminateProvisionedProductEngineWorkflowResultInput\nNotifyUpdateProvisionedProductEngineWorkflowResultInput\nNotifyWhenUploadedInput\nNotifyWhenUploadedOutput\nNotifyWorkersFailureCode\nNotifyWorkersFailureMessage\nNotifyWorkersFailureStatus\nNotifyWorkersFailureStatuses\nNotifyWorkersRequest\nNotifyWorkersResponse\nNrCapable\nNtp\nNtpPayload\nNtpServerName\nNtpServers\nNtpStatus\nNullCheckBoxList\nNullOption\nNullPacketBitrate\nNullString\nNullTextList\nNullValue\nNullValueColor\nNullValueField\nNullValueFormatConfiguration\nNullable\nNumCacheClusters\nNumCacheNodes\nNumFalseNegatives\nNumFalsePositives\nNumItemsEvaluated\nNumNodeGroups\nNumPartitions\nNumRecords\nNumRefFrames\nNumReplicasPerShard\nNumResults\nNumRetries\nNumShards\nNumTapesToCreate\nNumTimeSeries\nNumTrueNegatives\nNumTruePositives\nNumber\nNumberAttributeConstraints\nNumberAttributeConstraintsType\nNumberBFramesBetweenReferenceFrames\nNumberCapabilities\nNumberDatatypeScale\nNumberDisplayFormatConfiguration\nNumberFilter\nNumberFormatConfiguration\nNumberOfAdditionalAssignments\nNumberOfArchives\nNumberOfAssignmentsAvailable\nNumberOfAssignmentsCompleted\nNumberOfAssignmentsPending\nNumberOfAssociatedQueues\nNumberOfAssociatedUsers\nNumberOfAssociations\nNumberOfAutoScalingGroups\nNumberOfBacktestWindows\nNumberOfBrokerNodes\nNumberOfBuckets\nNumberOfBytes\nNumberOfCategory\nNumberOfChannels\nNumberOfChildJobs\nNumberOfControls\nNumberOfDatabases\nNumberOfDecreasesToday\nNumberOfDevicesInGroup\nNumberOfDevicesRequested\nNumberOfDisks\nNumberOfDistinctValues\nNumberOfDocuments\nNumberOfFalses\nNumberOfFiles\nNumberOfFrameworks\nNumberOfHumanWorkersPerDataObject\nNumberOfLabels\nNumberOfLargeTimestampGaps\nNumberOfLaunchConfigurations\nNumberOfLines\nNumberOfLogLinesOccurrences\nNumberOfLogLinesScanned\nNumberOfMatchesFound\nNumberOfMatchesInSample\nNumberOfMergesDone\nNumberOfMountTargets\nNumberOfNodes\nNumberOfNodesPerClusterLimitExceededFault\nNumberOfNodesQuotaExceededFault\nNumberOfNulls\nNumberOfObjects\nNumberOfOnCalls\nNumberOfProfilesInSample\nNumberOfProfilesReviewed\nNumberOfProfilesWillBeMerged\nNumberOfRecoveryPoints\nNumberOfRuleGroupsAlreadyAssociated\nNumberOfRuleTemplatesExceededException\nNumberOfRules\nNumberOfRulesExceededException\nNumberOfSamples\nNumberOfSchemas\nNumberOfServicesAccessible\nNumberOfServicesNotAccessed\nNumberOfShards\nNumberOfSteps\nNumberOfTasksFailed\nNumberOfTasksSucceeded\nNumberOfTestDocuments\nNumberOfTopics\nNumberOfTrainMentions\nNumberOfTrainedDocuments\nNumberOfTrainingJobsObjectiveNotImproving\nNumberOfTrues\nNumberOfVersions\nNumberOfWorkers\nNumberReference\nNumberReferenceFrames\nNumberScale\nNumberSelectionBehavior\nNumberType\nNumberValidateRequest\nNumberValidateResponse\nNumericAxisOptions\nNumericEqualityDrillDownFilter\nNumericEqualityFilter\nNumericFormatConfiguration\nNumericOperator\nNumericQuestionPropertyValueAutomation\nNumericRangeFilter\nNumericRangeFilterValue\nNumericSeparatorConfiguration\nNumericalAggregationFunction\nNumericalDimensionField\nNumericalMeasureField\nNvmeSupport\nNwkGeoLoc\nNwkKey\nNwkSEncKey\nNwkSKey\nOAuth\nOAuth2Credentials\nOAuth2CustomParameter\nOAuth2Defaults\nOAuth2Properties\nOAuthCredentials\nOAuthGrantType\nOAuthHttpParameters\nOAuthParameters\nOAuthProperties\nOAuthProviderException\nOAuthScopes\nOCSPUrl\nOEMEphemeris\nOFIMetricDataPoint\nOFIModelPerformance\nOFITrainingMetricsValue\nOID\nOIDC\nOId\nOKActions\nOS\nOSInfo\nOSRelease\nOSReleaseLabel\nOSUpdateSettings\nOSVersion\nOTAJobConfig\nOTAUpdateFile\nOTAUpdateInfo\nOTAUpdateSummary\nOU\nOauth2Credential\nObdInterface\nObdSignal\nObfuscationSetting\nObject\nObjectACL\nObjectAlreadyDetachedException\nObjectArn\nObjectAttributeAction\nObjectAttributeActionType\nObjectAttributeKey\nObjectAttributeList\nObjectAttributeRange\nObjectAttributeUpdate\nObjectAttributeUpdateValue\nObjectAttributes\nObjectChecksum\nObjectChecksumAlgorithm\nObjectConfiguration\nObjectCount\nObjectCountByEncryptionType\nObjectEncryptionType\nObjectFilter\nObjectGroup\nObjectGroupName\nObjectIdentifier\nObjectIdentifierAndLinkNameTuple\nObjectIdentifiers\nObjectKey\nObjectKeyPrefix\nObjectLambdaAccessPoint\nObjectLambdaAccessPointAlias\nObjectLambdaAccessPointArn\nObjectLambdaAccessPointList\nObjectLambdaConfiguration\nObjectLambdaTransformationConfiguration\nObjectLevelStatistics\nObjectList\nObjectLockConfiguration\nObjectLockEnabled\nObjectLockEnabledForBucket\nObjectLockLegalHold\nObjectLockLegalHoldStatus\nObjectLockMode\nObjectLockRetainUntilDate\nObjectLockRetention\nObjectLockRule\nObjectName\nObjectNotDetachedException\nObjectNotFoundException\nObjectOwnership\nObjectPart\nObjectParts\nObjectReference\nObjectReplicationStatuses\nObjectSize\nObjectSizeGreaterThan\nObjectSizeLessThan\nObjectTags\nObjectToken\nObjectType\nObjectTypeField\nObjectTypeKey\nObjectTypeName\nObjectTypeNames\nObjectTypes\nObjectURL\nObjectVersion\nObjectVersionId\nObjectVersionIds\nObjectVersionUpdate\nObjectiveStatus\nObjectiveStatusCounters\nObjects\nObjectsTransferred\nObservabilityConfiguration\nObservabilityConfigurationArn\nObservabilityConfigurationName\nObservabilityConfigurationRevision\nObservabilityConfigurationSummary\nObservabilityConfigurationSummaryList\nObservabilityEnabled\nObservation\nObservationId\nObservationList\nOccConflictException\nOccurredAt\nOccurrenceCount\nOccurrenceDaySet\nOccurrenceDays\nOccurrenceRelativeToEnd\nOccurrenceUnit\nOccurrences\nOcrLanguage\nOcspConfiguration\nOcspCustomCname\nOcuLimitExceededException\nOffCondition\nOffPeakWindow\nOffPeakWindowOptions\nOffPeakWindowOptionsStatus\nOffering\nOfferingArn\nOfferingClass\nOfferingDescription\nOfferingId\nOfferingPromotion\nOfferingSet\nOfferingStatus\nOfferingTransaction\nOfferingType\nOfferings\nOffice\nOfflineDeviceCount\nOfflineEncrypted\nOfflineStoreConfig\nOfflineStoreStatus\nOfflineStoreStatusEquals\nOffset\nOffsetMillis\nOffsetRange\nOffsetRanges\nOidcConfig\nOidcConfigForResponse\nOidcIdentityProviderConfig\nOidcIdentityProviderConfigRequest\nOidcMemberDefinition\nOidcOptions\nOk\nOkActions\nOkCount\nOldAction\nOldImage\nOldKmsKeyId\nOldNotification\nOldPassword\nOldSubscriber\nOldValue\nOnClause\nOnCreate\nOnDemandAllocationStrategy\nOnDemandBaseCapacity\nOnDemandCapacityReservationOptions\nOnDemandCost\nOnDemandCostEquivalent\nOnDemandCostOfRIHoursUsed\nOnDemandFulfilledCapacity\nOnDemandHours\nOnDemandHoursInLookbackPeriod\nOnDemandMaxPricePercentageOverLowestPrice\nOnDemandMaxTotalPrice\nOnDemandNormalizedUnits\nOnDemandOptions\nOnDemandOptionsRequest\nOnDemandPercentageAboveBaseCapacity\nOnDemandProvisioningSpecification\nOnDemandResizeSpecification\nOnDemandResizingSpecification\nOnDemandSpecification\nOnDemandStreamCount\nOnDemandStreamCountLimit\nOnDemandTargetCapacity\nOnDeviceServiceConfiguration\nOnEnterLifecycle\nOnExceptionSteps\nOnExitLifecycle\nOnFailure\nOnHoldBalance\nOnInputLifecycle\nOnPartialBatchItemFailure\nOnPartialUpload\nOnPremConfig\nOnPremiseConfiguration\nOnPremisesTagSet\nOnStackFailure\nOnStart\nOnSuccess\nOnUnauthenticatedRequest\nOnUpload\nOnboardedImportedDeviceCount\nOnboardingStatus\nOnboardingStatusReason\nOneClickIdDelay\nOneClickPinDelay\nOneDriveConfiguration\nOneDriveUserList\nOneDriveUserS3Path\nOneDriveUsers\nOneTimePassword\nOngoing\nOnline\nOnlineAbConfig\nOnlineAbDefinition\nOnlineStoreConfig\nOnlineStoreConfigUpdate\nOnlineStoreSecurityConfig\nOnlineStoreTotalSizeBytes\nOnlyAssociated\nOnlyAttached\nOnlyAvailable\nOntapConfiguration\nOntapFileSystemConfiguration\nOntapResponse\nOntapVolumeConfiguration\nOntapVolumeType\nOp\nOpacity\nOpenDate\nOpenHours\nOpenHoursRule\nOpenIDAuthTTL\nOpenIDClientId\nOpenIDConnectConfig\nOpenIDConnectProviderArn\nOpenIDConnectProviderList\nOpenIDConnectProviderListEntry\nOpenIDIatTTL\nOpenIDIssueURL\nOpenIDProviderName\nOpenIdConnectConfig\nOpenIdConnectProviderARNs\nOpenInstancePublicPortsRequest\nOpenInstancePublicPortsResult\nOpenMonitoring\nOpenMonitoringInfo\nOpenPortRange\nOpenProactiveInsights\nOpenReactiveInsights\nOpenSearchAction\nOpenSearchServiceDataSourceConfig\nOpenShardCount\nOpenTableFormatInput\nOpenTime\nOpenTransactionWindow\nOpenTunnelRequest\nOpenTunnelResponse\nOpenXJsonSerDe\nOpenZFSClientConfiguration\nOpenZFSConfiguration\nOpenZFSCreateRootVolumeConfiguration\nOpenZFSFileSystemConfiguration\nOpenZFSNfsExport\nOpenZFSOriginSnapshotConfiguration\nOpenZFSResponse\nOpenZFSUserOrGroupQuota\nOpenZFSVolumeConfiguration\nOpenedBy\nOperandFieldName\nOperands\nOperatingAddress\nOperatingAddressCity\nOperatingAddressCityFilter\nOperatingAddressCountryCode\nOperatingAddressCountryCodeFilter\nOperatingAddressStateOrRegion\nOperatingAddressStateOrRegionFilter\nOperatingRegions\nOperatingSystem\nOperatingSystemConfigurationManager\nOperatingSystemName\nOperatingSystemVersion\nOperatingSystems\nOperation\nOperationAbortedException\nOperationArn\nOperationDisabledException\nOperationEndTime\nOperationFailureException\nOperationFilter\nOperationId\nOperationIdAlreadyExistsException\nOperationIds\nOperationInProgressException\nOperationLimitExceeded\nOperationName\nOperationNotFound\nOperationNotFoundException\nOperationNotPermittedException\nOperationNotPermittedFault\nOperationNotSupportedException\nOperationPreferences\nOperationRequestedBy\nOperationResultFilter\nOperationStartTime\nOperationState\nOperationStatus\nOperationStatusCheckFailedException\nOperationStatusFilter\nOperationStatuses\nOperationSteps\nOperationSummary\nOperationSummaryList\nOperationTimeoutException\nOperationType\nOperationalData\nOperationalDataToDelete\nOperations\nOperationsRole\nOperator\nOplocksEnabled\nOpsAggregator\nOpsCenter\nOpsCenterEnabled\nOpsCenterIntegration\nOpsCenterIntegrationConfig\nOpsEntity\nOpsEntityItem\nOpsFilter\nOpsItem\nOpsItemAccessDeniedException\nOpsItemAlreadyExistsException\nOpsItemArn\nOpsItemDataValue\nOpsItemEventFilter\nOpsItemEventSummary\nOpsItemFilter\nOpsItemFilters\nOpsItemId\nOpsItemIdentity\nOpsItemInvalidParameterException\nOpsItemLimitExceededException\nOpsItemNotFoundException\nOpsItemNotification\nOpsItemRelatedItemAlreadyExistsException\nOpsItemRelatedItemAssociationNotFoundException\nOpsItemRelatedItemSummary\nOpsItemRelatedItemsFilter\nOpsItemSNSTopicArn\nOpsItemSummaries\nOpsItemSummary\nOpsItemType\nOpsMetadata\nOpsMetadataAlreadyExistsException\nOpsMetadataArn\nOpsMetadataFilter\nOpsMetadataInvalidArgumentException\nOpsMetadataKeyLimitExceededException\nOpsMetadataLimitExceededException\nOpsMetadataList\nOpsMetadataNotFoundException\nOpsMetadataTooManyUpdatesException\nOpsResultAttribute\nOptIn\nOptInPhoneNumberInput\nOptInRequiredException\nOptInStatus\nOptInType\nOptOut\nOptOutListArn\nOptOutListInformation\nOptOutListName\nOptOutListNames\nOptOutLists\nOptOutSpeakerRequest\nOptOutSpeakerResponse\nOptedOutException\nOptedOutFilter\nOptedOutNumber\nOptedOutNumberInformation\nOptedOutNumbers\nOptedOutTimestamp\nOpticalStandard\nOptimisticLockException\nOptimizationMetric\nOptimizationObjective\nOptimizationStatus\nOptimizeForEndUserLocation\nOptimizePerformance\nOptimizedSharedDelivery\nOptimizedViewPortWidth\nOptimizingTime\nOption\nOptionConfiguration\nOptionDescription\nOptionGroup\nOptionGroupAlreadyExistsFault\nOptionGroupArn\nOptionGroupDescription\nOptionGroupMembership\nOptionGroupMemberships\nOptionGroupName\nOptionGroupNotFoundFault\nOptionGroupOption\nOptionGroupOptionSetting\nOptionGroupOptionSettings\nOptionGroupOptionVersions\nOptionGroupOptions\nOptionGroupOptionsMessage\nOptionGroupQuotaExceededFault\nOptionGroups\nOptionGroupsList\nOptionName\nOptionRefId\nOptionRestrictionRegex\nOptionSetting\nOptionSettings\nOptionSpecification\nOptionStatus\nOptionVersion\nOptionalDeployment\nOptionalFields\nOptionalObjectAttributes\nOptionalParameters\nOptions\nOptionsConflictsWith\nOptionsDependedOn\nOptionsToInclude\nOptionsToRemove\nOpusSettings\nOr\nOrAllFilters\nOrConditions\nOrStatement\nOracleDataProviderSettings\nOracleParameters\nOraclePathPrefix\nOracleSQLCatalogSource\nOracleSQLCatalogTarget\nOracleSettings\nOrcSerDe\nOrder\nOrderBy\nOrderByElement\nOrderFulfilledDate\nOrderId\nOrderSubmissionDate\nOrderSummary\nOrderType\nOrderableClusterOption\nOrderableClusterOptions\nOrderableClusterOptionsMessage\nOrderableDBInstanceOption\nOrderableDBInstanceOptions\nOrderableDBInstanceOptionsMessage\nOrderableReplicationInstance\nOrderableReplicationInstances\nOrderedBy\nOrderedIndexedAttributeList\nOrderedPhoneNumber\nOrderedPhoneNumbers\nOrderedRemediationActions\nOrderedResourceDefinition\nOrderingId\nOrderingServiceEndpoint\nOrderingTimestamp\nOrders\nOrg\nOrganization\nOrganizationAccessDeniedException\nOrganizationAdditionalConfiguration\nOrganizationAdditionalConfigurationResult\nOrganizationAffectedEntitiesErrorItem\nOrganizationAggregationSource\nOrganizationAllFeaturesNotEnabledException\nOrganizationArn\nOrganizationArns\nOrganizationAwsServiceAccessStatus\nOrganizationConfigRule\nOrganizationConfigRuleArn\nOrganizationConfigRuleDetailedStatus\nOrganizationConfigRuleName\nOrganizationConfigRuleNames\nOrganizationConfigRuleStatus\nOrganizationConfigRuleStatuses\nOrganizationConfigRuleTriggerTypes\nOrganizationConfigRules\nOrganizationConfiguration\nOrganizationConformancePack\nOrganizationConformancePackArn\nOrganizationConformancePackDetailedStatus\nOrganizationConformancePackDetailedStatuses\nOrganizationConformancePackName\nOrganizationConformancePackNames\nOrganizationConformancePackStatus\nOrganizationConformancePackStatuses\nOrganizationConformancePackTemplateValidationException\nOrganizationConformancePacks\nOrganizationCustomPolicyRuleMetadata\nOrganizationCustomPolicyRuleMetadataNoPolicy\nOrganizationCustomRuleMetadata\nOrganizationDataSourceConfigurations\nOrganizationDataSourceConfigurationsResult\nOrganizationEbsVolumes\nOrganizationEbsVolumesResult\nOrganizationEnabled\nOrganizationEntityAggregate\nOrganizationEvent\nOrganizationEventDetails\nOrganizationEventDetailsErrorItem\nOrganizationEventFilter\nOrganizationFeatureConfiguration\nOrganizationFeatureConfigurationResult\nOrganizationId\nOrganizationIntegration\nOrganizationKubernetesAuditLogsConfiguration\nOrganizationKubernetesAuditLogsConfigurationResult\nOrganizationKubernetesConfiguration\nOrganizationKubernetesConfigurationResult\nOrganizationMalwareProtectionConfiguration\nOrganizationMalwareProtectionConfigurationResult\nOrganizationManagedRuleMetadata\nOrganizationName\nOrganizationNode\nOrganizationNodeType\nOrganizationNodeValue\nOrganizationNodes\nOrganizationNotEmptyException\nOrganizationNotFoundException\nOrganizationNotInAllFeaturesModeException\nOrganizationParentId\nOrganizationResourceCollectionType\nOrganizationResourceDetailedStatusFilters\nOrganizationResourceId\nOrganizationRuleStatus\nOrganizationS3LogsConfiguration\nOrganizationS3LogsConfigurationResult\nOrganizationScanEc2InstanceWithFindings\nOrganizationScanEc2InstanceWithFindingsResult\nOrganizationSharingStatus\nOrganizationSourceType\nOrganizationStateException\nOrganizationStatus\nOrganizationSummaries\nOrganizationSummary\nOrganizationUnits\nOrganizationalUnit\nOrganizationalUnitArn\nOrganizationalUnitArns\nOrganizationalUnitDistinguishedName\nOrganizationalUnitDistinguishedNames\nOrganizationalUnitId\nOrganizationalUnitIds\nOrganizationalUnitNotEmptyException\nOrganizationalUnitNotFoundException\nOrganizationalUnitScope\nOrganizationalUnits\nOrganizationsDecisionDetail\nOrganizationsException\nOrganizationsNotInUseException\nOrganizationsPolicyId\nOrientation\nOrientationCorrection\nOrigin\nOriginAccessControl\nOriginAccessControlAlreadyExists\nOriginAccessControlConfig\nOriginAccessControlId\nOriginAccessControlInUse\nOriginAccessControlList\nOriginAccessControlOriginType\nOriginAccessControlSummary\nOriginAccessIdentity\nOriginApprovalRuleTemplate\nOriginCustomHeader\nOriginDetails\nOriginEndpoint\nOriginEndpointId\nOriginEndpointListConfiguration\nOriginEndpointName\nOriginEndpoints\nOriginGroup\nOriginGroupFailoverCriteria\nOriginGroupMember\nOriginGroupMembers\nOriginGroups\nOriginId\nOriginKeepaliveTimeout\nOriginManifestType\nOriginOverride\nOriginPath\nOriginProtocolPolicy\nOriginReadTimeout\nOriginRequestPolicy\nOriginRequestPolicyAlreadyExists\nOriginRequestPolicyConfig\nOriginRequestPolicyCookiesConfig\nOriginRequestPolicyHeadersConfig\nOriginRequestPolicyId\nOriginRequestPolicyInUse\nOriginRequestPolicyList\nOriginRequestPolicyQueryStringsConfig\nOriginRequestPolicySummary\nOriginShield\nOriginShieldRegion\nOriginSnapshot\nOriginSslProtocols\nOriginal\nOriginalCountryCodeIso2\nOriginalIops\nOriginalMessage\nOriginalMessageId\nOriginalMultiAttachEnabled\nOriginalName\nOriginalParent\nOriginalPhoneNumber\nOriginalRuleSetName\nOriginalSchema\nOriginalScore\nOriginalSize\nOriginalSnapshotCreateTime\nOriginalSourceFileSystemArn\nOriginalStatusCode\nOriginalTextCharacters\nOriginalThroughput\nOriginalTypeArn\nOriginalTypeName\nOriginalVolumeType\nOrigination\nOriginationIdentities\nOriginationIdentity\nOriginationIdentityArn\nOriginationIdentityMetadata\nOriginationNumber\nOriginationPhoneNumber\nOriginationRoute\nOrigins\nOs\nOsArchitecture\nOsType\nOsVersion\nOtaaV1_0_x\nOtaaV1_1\nOther\nOtherCategories\nOtherCount\nOtherMetadataValueList\nOtherMetadataValueListItem\nOtherName\nOtherNonCompliantCount\nOtherPolicies\nOtp\nOutOfCapacityException\nOutPutS3Location\nOutboundCall\nOutboundCallConfig\nOutboundCallerConfig\nOutboundCallerIdName\nOutboundCallerIdNumberId\nOutboundCalling\nOutboundCallsEnabled\nOutboundConnection\nOutboundConnectionStatus\nOutboundContactNotPermittedException\nOutboundCrossClusterSearchConnection\nOutboundCrossClusterSearchConnectionStatus\nOutboundEventsHTTPSEndpoint\nOutboundFlowId\nOutboundHeader\nOutboundHostName\nOutboundIp\nOutboundMMS\nOutboundSMS\nOutboundShipment\nOutcome\nOutgoingCertificate\nOutgoingDukptAttributes\nOutgoingEncryptionAttributes\nOutgoingKeyIdentifier\nOutgoingTranslationAttributes\nOutlierDetection\nOutlierVisibility\nOutlineColor\nOutlineSize\nOutpost\nOutpostArn\nOutpostCapable\nOutpostConfigRequest\nOutpostConfigResponse\nOutpostId\nOutpostIdentifier\nOutpostIdentifierFilter\nOutpostMode\nOutpostOfflineException\nOutpostResolver\nOutpostResolvers\nOutposts\nOutpostsId\nOutput\nOutputArn\nOutputArtifact\nOutputArtifacts\nOutputArtifactsToRemove\nOutputAttribute\nOutputBand\nOutputBands\nOutputBucket\nOutputBucketName\nOutputBytes\nOutputChannel\nOutputChannelMapping\nOutputChannels\nOutputColumn\nOutputColumnName\nOutputColumns\nOutputCompression\nOutputConfig\nOutputConfigInput\nOutputContext\nOutputDataConfig\nOutputDataType\nOutputDatasetS3Uri\nOutputDescription\nOutputDescriptions\nOutputDestination\nOutputDestinationSettings\nOutputDetail\nOutputDetails\nOutputEncryptionKMSKeyId\nOutputFileUriValue\nOutputFilter\nOutputFormat\nOutputFormatConfiguration\nOutputFormatOptions\nOutputGroup\nOutputGroupDetail\nOutputGroupDetails\nOutputGroupSettings\nOutputGroups\nOutputId\nOutputKey\nOutputKeyPrefix\nOutputKeys\nOutputLocation\nOutputLocationRef\nOutputLocationType\nOutputLockingMode\nOutputLockingSettings\nOutputLogEvent\nOutputName\nOutputNotebookFormat\nOutputNotebookS3Location\nOutputNotebookS3LocationForOutput\nOutputNotebookS3LocationFromInput\nOutputNotebookURI\nOutputPackageName\nOutputPackageVersion\nOutputParameter\nOutputParameters\nOutputRectangle\nOutputReservedInstancesWillExpireAt\nOutputResolution\nOutputResolutionResamplingInput\nOutputResolutionStackInput\nOutputResources\nOutputRows\nOutputS3BucketName\nOutputS3KeyPrefix\nOutputS3Location\nOutputS3Object\nOutputS3Path\nOutputS3Region\nOutputS3Uri\nOutputSchemaVersion\nOutputSchemas\nOutputSdt\nOutputSelection\nOutputSerialization\nOutputSettings\nOutputSource\nOutputSourceId\nOutputSourceType\nOutputStage\nOutputStartIndex\nOutputTimingSource\nOutputType\nOutputUpdate\nOutputUpdates\nOutputUri\nOutputUrl\nOutputValue\nOutputVariablesSizeExceededException\nOutputs\nOutsideIpAddress\nOutsideIpAddressType\nOutstandingVoteCount\nOverage\nOverallBestTrainingJob\nOverallPlacement\nOverallSeverity\nOverallTestResultItem\nOverallTestResults\nOverallVolume\nOverflowColumnHeaderVisibility\nOverlap\nOverlapStatus\nOverridden\nOverriddenAction\nOverriddenContactIds\nOverriddenParameters\nOverride\nOverrideAction\nOverrideAlreadySetException\nOverrideArtifactName\nOverrideButtonConfiguration\nOverrideDatasetParameterOperation\nOverrideOptions\nOverrideParameters\nOverridePullRequestApprovalRulesInput\nOverrideRejection\nOverrideStatusRequiredException\nOverrides\nOversizeHandling\nOversizedConfigurationItemException\nOverview\nOverwrite\nOverwriteExisting\nOverwriteExtensionPack\nOverwriteMode\nOwner\nOwnerAccount\nOwnerAccountId\nOwnerAlias\nOwnerDirectoryDescription\nOwnerDirectoryId\nOwnerFilter\nOwnerGid\nOwnerId\nOwnerIdentifier\nOwnerIds\nOwnerInformation\nOwnerName\nOwnerSetting\nOwnerType\nOwnerUid\nOwners\nOwnershipControls\nOwnershipControlsRule\nOwnershipType\nOwnershipVerificationCertificateArn\nOwnershipVerificationStatus\nOwningAccount\nOwningAccountId\nOwningAccounts\nOwningService\nP10\nP50\nP75\nP85\nP90\nP95\nP95Metrics\nP99\nP999\nPENDING\nPIIDetection\nPITPolicyRule\nPSTNDialIn\nPSTNEnabled\nPUSH\nPackageAggregation\nPackageAggregationResponse\nPackageArn\nPackageDependency\nPackageDescription\nPackageDetails\nPackageDetailsList\nPackageFilter\nPackageID\nPackageId\nPackageImportJob\nPackageImportJobInputConfig\nPackageImportJobOutput\nPackageImportJobOutputConfig\nPackageImportJobs\nPackageListItem\nPackageManager\nPackageName\nPackageObject\nPackageObjects\nPackageOriginConfiguration\nPackageOriginRestrictions\nPackagePatchVersion\nPackageSource\nPackageStatus\nPackageSummary\nPackageType\nPackageVersion\nPackageVersionDescription\nPackageVersionError\nPackageVersionHistory\nPackageVersionHistoryList\nPackageVersionInputConfig\nPackageVersionOrigin\nPackageVersionOutputConfig\nPackageVersionSummary\nPackageVulnerabilityDetails\nPackages\nPackaging\nPackagingConfiguration\nPackagingConfigurationId\nPackagingConfigurations\nPackagingGroup\nPackagingGroupId\nPackagingGroups\nPackagingType\nPackedPolicySize\nPackedPolicyTooLargeException\nPacketField\nPacketHeaderStatement\nPacketHeaderStatementRequest\nPacketIdentifiersMap\nPacketLength\nPacketsPerSecond\nPadVideo\nPadding\nPaddingControl\nPaddingPolicy\nPaddingTolerance\nPaddingType\nPage\nPageArn\nPageBreakConfiguration\nPageClassification\nPageConfiguration\nPageFieldMappings\nPageId\nPageNumber\nPageResolutions\nPageSize\nPageSizeBytes\nPageToken\nPageType\nPageTypes\nPagerDutyConfiguration\nPagerDutyIncidentConfiguration\nPagerDutyIncidentDetail\nPages\nPaginatedLayoutConfiguration\nPaginatedReportOptions\nPaginationConfiguration\nPaginationToken\nPaginationTokenExpiredException\nPanSequenceNumber\nPanelConfiguration\nPanelTitleOptions\nPaperCanvasSizeOptions\nPaperMargin\nPaperOrientation\nPaperSize\nPar\nParControl\nParDenominator\nParNumerator\nParallelAsmReadThreads\nParallelDataConfig\nParallelDataDataLocation\nParallelDataNames\nParallelDataProperties\nParallelDataPropertiesList\nParallelLoadThreads\nParallelism\nParallelismConfiguration\nParallelismConfigurationDescription\nParallelismConfigurationUpdate\nParallelismPerKPU\nParallelismPerKPUUpdate\nParallelismUpdate\nParallelizationFactor\nParam\nParameter\nParameterAdditions\nParameterAlreadyExists\nParameterApplyErrorDescription\nParameterApplyStatus\nParameterAttribute\nParameterConstraints\nParameterControl\nParameterControlId\nParameterControls\nParameterDateTimePickerControl\nParameterDeclaration\nParameterDeclarations\nParameterDefinition\nParameterDefinitions\nParameterDropDownControl\nParameterFilters\nParameterGroup\nParameterGroupAlreadyExistsFault\nParameterGroupFamily\nParameterGroupName\nParameterGroupNames\nParameterGroupNotFoundFault\nParameterGroupQuotaExceededFault\nParameterGroupStatus\nParameterGroups\nParameterHistory\nParameterInlinePolicy\nParameterKey\nParameterLimitExceeded\nParameterListControl\nParameterMapEntry\nParameterMapping\nParameterMaxVersionLimitExceeded\nParameterMetadata\nParameterName\nParameterNameValue\nParameterNameValues\nParameterNames\nParameterNotFound\nParameterObject\nParameterOverrides\nParameterPatternMismatchException\nParameterRange\nParameterRanges\nParameterRemovals\nParameterSelectableValues\nParameterSliderControl\nParameterSpec\nParameterStringFilter\nParameterTextAreaControl\nParameterTextFieldControl\nParameterType\nParameterValue\nParameterValueConfigurations\nParameterValueType\nParameterValues\nParameterVersion\nParameterVersionLabelLimitExceeded\nParameterVersionNotFound\nParameterizedStatement\nParameters\nParametersFilter\nParametersInCacheKeyAndForwardedToOrigin\nParametersToDelete\nParametersToRemove\nParametersValidTo\nParametersValidUntilTimestamp\nParametricCloudWatchMonitoringConfiguration\nParametricConfigurationOverrides\nParametricMonitoringConfiguration\nParametricS3MonitoringConfiguration\nPardot\nPardotConnectorProfileCredentials\nPardotConnectorProfileProperties\nPardotSourceProperties\nParent\nParentArn\nParentAutomationExecutionId\nParentBotNetwork\nParentChangeSetId\nParentCommitDoesNotExistException\nParentCommitIdOutdatedException\nParentCommitIdRequiredException\nParentComponent\nParentEntityUpdateRequest\nParentFolderArn\nParentFolderId\nParentGroupId\nParentHandshakeId\nParentHyperParameterTuningJob\nParentHyperParameterTuningJobs\nParentId\nParentJobId\nParentLinks\nParentName\nParentNotFoundException\nParentPid\nParentReadinessScopes\nParentRecoveryPointArn\nParentReference\nParentSavingsPlanOffering\nParentShardId\nParentShards\nParentSnapshotId\nParentUuid\nParentVolumeId\nParentZoneId\nParentZoneName\nParents\nParentsOfAlarmName\nParquet\nParquetConfiguration\nParquetSerDe\nParquetTimestampInMillisecond\nParquetVersion\nParseFailures\nParsedInputRecords\nParsingException\nPart\nPartListElement\nPartNumber\nPartNumberMarker\nPartOfSpeech\nPartOfSpeechTag\nPartSizeInBytes\nPartialFailure\nPartialFailureMessage\nPartialFailureReasons\nPartialMatch\nPartialMatches\nPartialResultsStability\nParticipant\nParticipantCredentials\nParticipantDetails\nParticipantDetailsToAdd\nParticipantId\nParticipantPhoneNumbers\nParticipantRole\nParticipantSummary\nParticipantTimerConfigList\nParticipantTimerConfiguration\nParticipantToken\nParticipantTokenConfiguration\nParticipantTokenCredentials\nParticipants\nParticipatingGateways\nParticipatingResource\nParticipatingServer\nParties\nPartition\nPartitionBy\nPartitionColumn\nPartitionColumns\nPartitionCount\nPartitionEndDate\nPartitionError\nPartitionIncludeSchemaTable\nPartitionIndex\nPartitionIndexDescriptor\nPartitionIndexDescriptorList\nPartitionIndexes\nPartitionInput\nPartitionInputList\nPartitionKey\nPartitionKeyPath\nPartitionKeys\nPartitionLoadFrequency\nPartitionNumber\nPartitionObjects\nPartitionPredicate\nPartitionSerialList\nPartitionStartDate\nPartitionValueList\nPartitionValues\nPartitions\nPartitionsToDelete\nPartitionsToGet\nPartnerAccountId\nPartnerEventSource\nPartnerEventSourceAccount\nPartnerEventSourceAccounts\nPartnerEventSources\nPartnerIntegrationInfo\nPartnerIntegrationInfoList\nPartnerIntegrationInputMessage\nPartnerIntegrationOutputMessage\nPartnerName\nPartnerNotFoundFault\nPartnerProfileId\nPartnerType\nPartnerWatermarking\nParts\nPartsCount\nPartyName\nPartyType\nPartyTypeString\nPassThroughSettings\nPassiveIp\nPassphrase\nPassthroughBehavior\nPassthroughControl\nPassword\nPasswordCount\nPasswordData\nPasswordField\nPasswordLastUsed\nPasswordLength\nPasswordParam\nPasswordPolicy\nPasswordPolicyType\nPasswordPolicyViolationException\nPasswordResetRequired\nPasswordResetRequiredException\nPasswordReusePrevention\nPasswordVerifier\nPasswords\nPatInterval\nPatch\nPatchBaselineId\nPatchBaselineIdentity\nPatchComplianceData\nPatchDocument\nPatchFilter\nPatchFilterGroup\nPatchFilters\nPatchGroup\nPatchGroupPatchBaselineMapping\nPatchGroups\nPatchLevel\nPatchOperation\nPatchOrchestratorFilter\nPatchRule\nPatchRuleGroup\nPatchRules\nPatchSet\nPatchSource\nPatchStatus\nPatchSummary\nPatchVersion\nPatches\nPath\nPathComponent\nPathDoesNotExistException\nPathFilter\nPathFormat\nPathId\nPathLoss\nPathMatch\nPathName\nPathOptions\nPathParameterValues\nPathPattern\nPathPatternConditionConfig\nPathPatternConfig\nPathPrefix\nPathRequestFilter\nPathRequiredException\nPathResourceToId\nPathStatement\nPathStatementRequest\nPathToObjectIdentifiers\nPathToObjectIdentifiersList\nPaths\nPattern\nPatternName\nPatternSetName\nPatternTypeLimits\nPatterns\nPauseCampaignRequest\nPauseCluster\nPauseClusterMessage\nPauseClusterResult\nPauseReplicationRequest\nPauseServiceRequest\nPauseServiceResponse\nPauseStateScheduleActionSettings\nPauseStateSettings\nPayer\nPayerResponsibility\nPayload\nPayloadConfig\nPayloadData\nPayloadFormatVersion\nPayloadPart\nPayloadTooLargeException\nPayloadType\nPaymentDue\nPaymentOption\nPaymentTerm\nPci\nPciId\nPcrControl\nPcrPeriod\nPcrPid\nPdfReport\nPeakBandwidthInGbps\nPeakCalculation\nPeakRequestsPerSecond\nPeerAccountId\nPeerAddress\nPeerAsn\nPeerBgpAsn\nPeerCoreNetworkId\nPeerEndpoint\nPeerEventEndpoint\nPeerLogs\nPeerOwnerId\nPeerRegion\nPeerTransitGatewayId\nPeerVpcAwsAccountId\nPeerVpcId\nPeerVpcResult\nPeering\nPeeringAttachmentId\nPeeringAttachmentStatus\nPeeringConnectionOptions\nPeeringConnectionOptionsRequest\nPeeringId\nPeeringOptions\nPeeringStatus\nPeeringTgwInfo\nPeeringType\nPeerings\nPemEncodedCertificate\nPending\nPendingActions\nPendingAggregationRequest\nPendingAggregationRequests\nPendingAuthenticationStrategy\nPendingCapacity\nPendingChange\nPendingChanges\nPendingCloudWatchLogsExports\nPendingCloudwatchLogsExports\nPendingCreateStandbyWorkspacesRequest\nPendingDataReplicationMetadata\nPendingDataReplicationMode\nPendingDeletion\nPendingDeletionWindowInDays\nPendingDeploymentSummary\nPendingEngineVersion\nPendingExpirationSubscribedDomains\nPendingHostInstanceType\nPendingHuman\nPendingImportedDeviceCount\nPendingLdapServerMetadata\nPendingLogDeliveryConfiguration\nPendingLogs\nPendingMaintenance\nPendingMaintenanceAction\nPendingMaintenanceActionDetails\nPendingMaintenanceActions\nPendingMaintenanceActionsMessage\nPendingModifiedRelationalDatabaseValues\nPendingModifiedServiceUpdate\nPendingModifiedValues\nPendingProductionVariantSummary\nPendingProperties\nPendingRequests\nPendingResource\nPendingReviewVersion\nPendingSecurityGroups\nPendingStandbyRequests\nPendingTaskCount\nPendingUpdates\nPendingVerification\nPendingWindowInDays\nPerHourPartition\nPerObjectStatus\nPerUnitStorageThroughput\nPercentComplete\nPercentDone\nPercentEnabled\nPercentOfClientLocationImpacted\nPercentOfGraphUtilization\nPercentOfGraphUtilizationUpdatedTime\nPercentOfTotalTrafficImpacted\nPercentPair\nPercentProgress\nPercentRange\nPercentTraffic\nPercentVisibleRange\nPercentage\nPercentageComplete\nPercentageCompleteOnRollback\nPercentageDisplayFormatConfiguration\nPercentageValue\nPercentile\nPercentileAggregation\nPercentileValue\nPerformAutoML\nPerformCheckOnly\nPerformHPO\nPerformance\nPerformanceInsightsEnabled\nPerformanceInsightsKMSKeyId\nPerformanceInsightsKmsKeyId\nPerformanceInsightsMetric\nPerformanceInsightsMetricDimensionGroup\nPerformanceInsightsMetricQuery\nPerformanceInsightsMetrics\nPerformanceInsightsMetricsDetail\nPerformanceInsightsReferenceComparisonValues\nPerformanceInsightsReferenceData\nPerformanceInsightsReferenceMetric\nPerformanceInsightsReferenceScalar\nPerformanceInsightsRetentionPeriod\nPerformanceInsightsStat\nPerformanceLocalHealthEventsConfig\nPerformanceMeasurement\nPerformanceMetrics\nPerformanceMode\nPerformanceScoreThreshold\nPeriod\nPeriodAlignment\nPeriodInSeconds\nPeriodOverPeriod\nPeriodOverPeriodComputation\nPeriodSize\nPeriodTimeGranularity\nPeriodToDate\nPeriodToDateComputation\nPeriodTriggers\nPeriodType\nPeriodUnit\nPeriodValue\nPeriodsBackward\nPeriodsForward\nPermanent\nPermanentDeletionTimeInDays\nPermanentRestore\nPermission\nPermissionAlreadyExistsException\nPermissionConfiguration\nPermissionEntry\nPermissionGroup\nPermissionGroupByUser\nPermissionGroupParams\nPermissionInfo\nPermissionLimitExceededException\nPermissionModel\nPermissionPolicy\nPermissionSet\nPermissionSetArn\nPermissionSetProvisioningStatus\nPermissionSetProvisioningStatusMetadata\nPermissionSets\nPermissionSetsProvisioningStatus\nPermissionState\nPermissionType\nPermissionTypeMismatchException\nPermissionValues\nPermissionVersionsLimitExceededException\nPermissions\nPermissionsBoundary\nPermissionsBoundaryArn\nPermissionsBoundaryDecisionDetail\nPermissionsBoundaryPolicyInputList\nPermissionsBoundaryType\nPermissionsBoundaryUsageCount\nPermissionsMode\nPermissionsWithGrantOption\nPermittedFileTypes\nPermittedPublicSecurityGroupRuleRanges\nPersistence\nPersistent\nPersistentChat\nPersistentStorage\nPersistentStorageConfiguration\nPerson\nPersonDetail\nPersonDetection\nPersonMatch\nPersona\nPersonalEmailAddress\nPersonalPIN\nPersonalizationThresholdSeconds\nPersonas\nPersonasSummary\nPersons\nPersonsIndeterminate\nPersonsWithRequiredEquipment\nPersonsWithoutRequiredEquipment\nPhase\nPhase1DHGroupNumbers\nPhase1DHGroupNumbersListValue\nPhase1DHGroupNumbersRequestListValue\nPhase1DhGroupNumbers\nPhase1EncryptionAlgorithms\nPhase1EncryptionAlgorithmsListValue\nPhase1EncryptionAlgorithmsRequestListValue\nPhase1IntegrityAlgorithms\nPhase1IntegrityAlgorithmsListValue\nPhase1IntegrityAlgorithmsRequestListValue\nPhase1LifetimeSeconds\nPhase2DHGroupNumbers\nPhase2DHGroupNumbersListValue\nPhase2DHGroupNumbersRequestListValue\nPhase2DhGroupNumbers\nPhase2EncryptionAlgorithms\nPhase2EncryptionAlgorithmsListValue\nPhase2EncryptionAlgorithmsRequestListValue\nPhase2IntegrityAlgorithms\nPhase2IntegrityAlgorithmsListValue\nPhase2IntegrityAlgorithmsRequestListValue\nPhase2LifetimeSeconds\nPhaseContext\nPhaseControl\nPhases\nPhoneConfig\nPhoneNumber\nPhoneNumberArn\nPhoneNumberAssociation\nPhoneNumberCapabilities\nPhoneNumberCountries\nPhoneNumberCountry\nPhoneNumberCountryCode\nPhoneNumberCountryCodes\nPhoneNumberDescription\nPhoneNumberError\nPhoneNumberErrors\nPhoneNumberField\nPhoneNumberFields\nPhoneNumberFilter\nPhoneNumberId\nPhoneNumberIds\nPhoneNumberInformation\nPhoneNumberOrder\nPhoneNumberOrderId\nPhoneNumberOrders\nPhoneNumberPoolCountries\nPhoneNumberPrefix\nPhoneNumberQuickConnectConfig\nPhoneNumberStatus\nPhoneNumberSummary\nPhoneNumberSummaryList\nPhoneNumberType\nPhoneNumberTypes\nPhoneNumberValidateRequest\nPhoneNumberValidateResponse\nPhoneNumbers\nPhoneType\nPhoneTypeCode\nPhrases\nPhysicalConnectionRequirements\nPhysicalId\nPhysicalNetworkInterface\nPhysicalResource\nPhysicalResourceId\nPhysicalResourceIdContext\nPhysicalResourceIdContextKeyValuePair\nPhysicalTableId\nPhysicalTableMap\nPickupDetails\nPid\nPidMode\nPids\nPieChartAggregatedFieldWells\nPieChartConfiguration\nPieChartFieldWells\nPieChartSortConfiguration\nPieChartVisual\nPiiEntitiesDetectionJobFilter\nPiiEntitiesDetectionJobProperties\nPiiEntitiesDetectionJobPropertiesList\nPiiEntity\nPiiEntityTypes\nPiiOutputDataConfig\nPiiType\nPillarDifference\nPillarDifferences\nPillarId\nPillarMetric\nPillarName\nPillarNotes\nPillarPriorities\nPillarReviewSummaries\nPillarReviewSummary\nPillars\nPilotPower\nPinBlock\nPinBlockFormat\nPinData\nPinDataLength\nPinOffset\nPinValidationData\nPinValidationDataPadCharacter\nPinVerificationKeyIndex\nPingResponse\nPingSlotDr\nPingSlotFreq\nPingSlotPeriod\nPingStatus\nPinned\nPinnedFieldOptions\nPinnedLeftFields\nPinpointDestination\nPipe\nPipeEnrichmentHttpParameters\nPipeEnrichmentParameters\nPipeSourceActiveMQBrokerParameters\nPipeSourceDynamoDBStreamParameters\nPipeSourceKinesisStreamParameters\nPipeSourceManagedStreamingKafkaParameters\nPipeSourceParameters\nPipeSourceRabbitMQBrokerParameters\nPipeSourceSelfManagedKafkaParameters\nPipeSourceSqsQueueParameters\nPipeTargetBatchJobParameters\nPipeTargetCloudWatchLogsParameters\nPipeTargetEcsTaskParameters\nPipeTargetEventBridgeEventBusParameters\nPipeTargetHttpParameters\nPipeTargetKinesisStreamParameters\nPipeTargetLambdaFunctionParameters\nPipeTargetParameters\nPipeTargetRedshiftDataParameters\nPipeTargetSageMakerPipelineParameters\nPipeTargetSqsQueueParameters\nPipeTargetStateMachineParameters\nPipeline\nPipelineActivity\nPipelineArn\nPipelineBlueprint\nPipelineBlueprintSummary\nPipelineConfig\nPipelineConfigurationBody\nPipelineContext\nPipelineDeclaration\nPipelineDefinition\nPipelineDefinitionS3Location\nPipelineDeletedException\nPipelineDescription\nPipelineDetail\nPipelineDetails\nPipelineDisplayName\nPipelineExecution\nPipelineExecutionArn\nPipelineExecutionDescription\nPipelineExecutionDisplayName\nPipelineExecutionFailureReason\nPipelineExecutionNotFoundException\nPipelineExecutionNotStoppableException\nPipelineExecutionStatus\nPipelineExecutionStep\nPipelineExecutionStepMetadata\nPipelineExecutionSteps\nPipelineExecutionSummaries\nPipelineExecutionSummary\nPipelineExperimentConfig\nPipelineId\nPipelineIdName\nPipelineInfo\nPipelineLockingSettings\nPipelineMetadata\nPipelineName\nPipelineNameInUseException\nPipelineNamePrefix\nPipelineNotFoundException\nPipelineObject\nPipelineOutputConfig\nPipelineParameterList\nPipelineParameters\nPipelinePauseStateSettings\nPipelineStatus\nPipelineStatusReason\nPipelineSummaries\nPipelineSummary\nPipelineVersionNotFoundException\nPipelines\nPipelinesRunningCount\nPipes\nPitch\nPivotFieldSortOptions\nPivotTableAggregatedFieldWells\nPivotTableCellConditionalFormatting\nPivotTableConditionalFormatting\nPivotTableConditionalFormattingOption\nPivotTableConditionalFormattingScope\nPivotTableConfiguration\nPivotTableDataPathOption\nPivotTableFieldCollapseStateOption\nPivotTableFieldCollapseStateTarget\nPivotTableFieldOption\nPivotTableFieldOptions\nPivotTableFieldSubtotalOptions\nPivotTableFieldWells\nPivotTableOptions\nPivotTablePaginatedReportOptions\nPivotTableRowsLabelOptions\nPivotTableSortBy\nPivotTableSortConfiguration\nPivotTableTotalOptions\nPivotTableVisual\nPivotTotalOptions\nPixelAnomaly\nPixelPercent\nPlace\nPlaceGeometry\nPlaceId\nPlacedPlayerSession\nPlacedPlayerSessions\nPlaceholder\nPlaceholderOptions\nPlacement\nPlacementArn\nPlacementConstraint\nPlacementConstraints\nPlacementDescription\nPlacementGroup\nPlacementGroupArn\nPlacementGroupConfig\nPlacementGroupConfigs\nPlacementGroupInfo\nPlacementGroups\nPlacementId\nPlacementResponse\nPlacementStatistics\nPlacementStrategies\nPlacementStrategy\nPlacementSummary\nPlacementTemplate\nPlacementTenancy\nPlacementType\nPlainText\nPlainTextMessage\nPlainTextMessageType\nPlaintext\nPlan\nPlanId\nPlanName\nPlanType\nPlannedBudgetLimits\nPlannedEndTime\nPlannedStartTime\nPlanningStatistics\nPlanningTimeMillis\nPlatform\nPlatformApplication\nPlatformApplicationArn\nPlatformApplicationDisabledException\nPlatformApplications\nPlatformArn\nPlatformBranchLifecycleState\nPlatformBranchName\nPlatformBranchSummary\nPlatformBranchSummaryList\nPlatformCategory\nPlatformCommand\nPlatformDefinitionBundle\nPlatformDescription\nPlatformDetails\nPlatformDevice\nPlatformDifferences\nPlatformFilter\nPlatformFramework\nPlatformIdentifier\nPlatformInput\nPlatformLifecycleState\nPlatformName\nPlatformNotSupportedException\nPlatformOwner\nPlatformProgrammingLanguage\nPlatformScriptKey\nPlatformSoftwareVersion\nPlatformStatus\nPlatformSummary\nPlatformSummaryList\nPlatformTaskDefinitionIncompatibilityException\nPlatformType\nPlatformTypes\nPlatformUnknownException\nPlatformVersion\nPlatformVersionStillReferencedException\nPlatforms\nPlayReadyDrm\nPlayback\nPlaybackCompletionEvent\nPlaybackConfiguration\nPlaybackConfigurationArn\nPlaybackConfigurationName\nPlaybackDeviceCompatibility\nPlaybackEndpointPrefix\nPlaybackInterruptionEvent\nPlaybackKeyPair\nPlaybackKeyPairSummary\nPlaybackMode\nPlaybackUrl\nPlayer\nPlayerAttributes\nPlayerData\nPlayerDataMap\nPlayerId\nPlayerIds\nPlayerLatencies\nPlayerLatency\nPlayerLatencyPolicies\nPlayerLatencyPolicy\nPlayerSession\nPlayerSessionCreationPolicy\nPlayerSessionId\nPlayerSessionStatusFilter\nPlayerSessions\nPlayers\nPlaylist\nPlaylistType\nPlaylistWindowSeconds\nPlaylists\nPlugin\nPluginDescription\nPluginName\nPluginSummary\nPluginsS3ObjectVersion\nPluginsS3Path\nPmtInterval\nPmtPid\nPnOffset\nPoAttributes\nPoDetailAttributes\nPoint\nPointInTimeRecovery\nPointInTimeRecoveryDescription\nPointInTimeRecoveryEnabled\nPointInTimeRecoverySpecification\nPointInTimeRecoveryStatus\nPointInTimeRecoverySummary\nPointInTimeRecoveryUnavailableException\nPointInTimeRestoreNotEnabledFault\nPointOfInterest\nPointStyleOptions\nPointsOfInterest\nPoisEndpoint\nPolicies\nPoliciesGrantingServiceAccess\nPoliciesLimitExceededException\nPoliciesType\nPolicy\nPolicyARN\nPolicyARNType\nPolicyArn\nPolicyArns\nPolicyAttachment\nPolicyAttribute\nPolicyAttributeDescription\nPolicyAttributeDescriptions\nPolicyAttributeTypeDescription\nPolicyAttributeTypeDescriptions\nPolicyAttributes\nPolicyChangesInProgressException\nPolicyComplianceDetail\nPolicyComplianceStatus\nPolicyComplianceStatusList\nPolicyContent\nPolicyCountLimitExceededException\nPolicyDescription\nPolicyDescriptions\nPolicyDescriptorType\nPolicyDetail\nPolicyDetails\nPolicyDocument\nPolicyDurationSeconds\nPolicyEnabled\nPolicyEnforcedException\nPolicyErrorException\nPolicyErrors\nPolicyEvaluationException\nPolicyExistsCondition\nPolicyFilter\nPolicyGeneration\nPolicyGenerationDetails\nPolicyGrantingServiceAccess\nPolicyGroup\nPolicyGroups\nPolicyHash\nPolicyHashCondition\nPolicyId\nPolicyIds\nPolicyInJson\nPolicyInUseException\nPolicyInformation\nPolicyInputList\nPolicyItem\nPolicyLengthExceededException\nPolicyLevels\nPolicyList\nPolicyName\nPolicyNames\nPolicyNotAttachableException\nPolicyNotAttachedException\nPolicyNotFound\nPolicyNotFoundException\nPolicyOption\nPolicyOwner\nPolicyParameter\nPolicyPeriodInMinutes\nPolicyQualifierId\nPolicyQualifierInfo\nPolicyQualifiers\nPolicyReference\nPolicyReferenceName\nPolicyRevisionId\nPolicyRole\nPolicyRoles\nPolicyRule\nPolicyRuleNumber\nPolicyRuntime\nPolicySchema\nPolicySizeLimitExceededException\nPolicySourceArn\nPolicyStatus\nPolicyStoreItem\nPolicySummary\nPolicyTargetSummary\nPolicyTemplateItem\nPolicyText\nPolicyToPath\nPolicyToPathList\nPolicyType\nPolicyTypeAlreadyEnabledException\nPolicyTypeDescription\nPolicyTypeDescriptions\nPolicyTypeName\nPolicyTypeNames\nPolicyTypeNotAvailableForOrganizationException\nPolicyTypeNotEnabledException\nPolicyTypeNotFoundException\nPolicyTypeScope\nPolicyTypeSummary\nPolicyTypes\nPolicyUpdateToken\nPolicyUsageFilter\nPolicyUser\nPolicyUsers\nPolicyValidationPassed\nPolicyVariables\nPolicyVersion\nPolicyVersionId\nPolicyVersionIdentifier\nPolicyVersionList\nPoliticalView\nPollForActivityTaskInput\nPollForDecisionTaskInput\nPollForJobsInput\nPollForJobsOutput\nPollForTaskInput\nPollForTaskOutput\nPollForThirdPartyJobsInput\nPollForThirdPartyJobsOutput\nPollTimeoutMs\nPollingTime\nPolygon\nPolygonGeometryInput\nPoolARN\nPoolARNs\nPoolAddressRange\nPoolAddressRanges\nPoolArn\nPoolCidrBlock\nPoolCidrBlocks\nPoolCidrs\nPoolCount\nPoolDepth\nPoolEntryDate\nPoolFilter\nPoolId\nPoolIds\nPoolInfo\nPoolInformation\nPoolInfos\nPoolName\nPoolOriginationIdentitiesFilter\nPoolSize\nPoolState\nPoolStatus\nPoolTagSpecifications\nPools\nPopulationSize\nPort\nPortForwardingConfig\nPortInfo\nPortMapping\nPortMappings\nPortName\nPortNumber\nPortOverride\nPortOverrides\nPortProbeAction\nPortProbeDetail\nPortProbeDetails\nPortRange\nPortRangeFilter\nPortRangeFromTo\nPortRanges\nPortRequired\nPortSet\nPortSets\nPortal\nPortalResource\nPortalStatus\nPortalSummary\nPortfolioDetail\nPortfolioDetails\nPortfolioId\nPortfolioShareDetail\nPortfolioShareDetails\nPortfolioShareToken\nPortfolioShareType\nPose\nPosition\nPositionConfigurationItem\nPositionConfigurationList\nPositionFiltering\nPositionProperties\nPositionSolverConfigurations\nPositionSolverDetails\nPositionalAccuracy\nPositionalConstraint\nPositioning\nPositive\nPositiveColor\nPosixPermissions\nPosixProfile\nPosixUser\nPossibleRemediationAction\nPossibleRemediationActions\nPossibleSecurityGroupRemediationActions\nPostAction\nPostAgentProfileRequest\nPostAnalyticsProcessorSourceUri\nPostAuthentication\nPostAuthenticationLoginBanner\nPostCallAnalyticsSettings\nPostCommentForComparedCommitInput\nPostCommentForComparedCommitOutput\nPostCommentForPullRequestInput\nPostCommentForPullRequestOutput\nPostCommentReplyInput\nPostCommentReplyOutput\nPostConfirmation\nPostContentRequest\nPostContentResponse\nPostDialogCodeHookInvocationSpecification\nPostExtractionHookConfiguration\nPostFilterSharpenStrength\nPostFilterSharpening\nPostFulfillmentStatusSpecification\nPostLaunchActions\nPostLaunchActionsStatus\nPostProcessFirewallManagerRuleGroups\nPostSetupScriptDetails\nPostTemporalSharpening\nPostTemporalSharpeningStrength\nPostTextRequest\nPostTextResponse\nPostToConnectionRequest\nPostTrainingConstraints\nPostTrainingReport\nPostalCode\nPostgreSQLCatalogSource\nPostgreSQLCatalogTarget\nPostgreSQLSettings\nPostgreSqlDataProviderSettings\nPostgreSqlParameters\nPostureComplianceStatuses\nPotentialMatches\nPowerConnector\nPowerDrawKva\nPowerFeedDrop\nPowerKva\nPowerPhase\nPrAllowed\nPreAction\nPreAuthentication\nPreAuthenticationLoginBanner\nPreCoPassword\nPreExtractionHookConfiguration\nPreHumanTaskLambdaArn\nPreProcessFirewallManagerRuleGroups\nPreSharedKey\nPreSignUp\nPreSignedLogUrl\nPreSignedUrl\nPreTokenGeneration\nPreTrainingConstraints\nPreTrainingReport\nPrecedence\nPrecision\nPrecisionRecallTradeoff\nPreconditionFailed\nPreconditionFailedException\nPreconditionNotMetException\nPreconditionsFailedException\nPredecessor\nPredecessorRuns\nPredecessorsIncluded\nPredefined\nPredefinedHierarchy\nPredefinedIndices\nPredefinedLoadMetricSpecification\nPredefinedLoadMetricType\nPredefinedMetricPairSpecification\nPredefinedMetricSpecification\nPredefinedMetricType\nPredefinedScalingMetricSpecification\nPredefinedScalingMetricType\nPredicate\nPredicateList\nPredicates\nPredictEndpoint\nPredictInput\nPredictOutput\nPredictedCapacity\nPredictedIntent\nPredictedItem\nPrediction\nPredictionExplanations\nPredictionInterval\nPredictionIntervalLevel\nPredictionIntervalLowerBound\nPredictionIntervalUpperBound\nPredictionTimeRange\nPredictions\nPredictiveDialerConfig\nPredictiveScalingConfiguration\nPredictiveScalingCustomizedCapacityMetric\nPredictiveScalingCustomizedLoadMetric\nPredictiveScalingCustomizedScalingMetric\nPredictiveScalingMaxCapacityBehavior\nPredictiveScalingMaxCapacityBuffer\nPredictiveScalingMetricSpecification\nPredictiveScalingMode\nPredictiveScalingPredefinedLoadMetric\nPredictiveScalingPredefinedMetricPair\nPredictiveScalingPredefinedScalingMetric\nPredictorArn\nPredictorBacktestExportJobArn\nPredictorBacktestExportJobName\nPredictorBacktestExportJobSummary\nPredictorBacktestExportJobs\nPredictorBaseline\nPredictorEvaluationResults\nPredictorEvent\nPredictorExecution\nPredictorExecutionDetails\nPredictorExecutions\nPredictorMonitorEvaluation\nPredictorMonitorEvaluations\nPredictorName\nPredictorNotMountedException\nPredictorSummary\nPredictors\nPrefectureOrDistrict\nPreference\nPreferences\nPreferred\nPreferredAuthenticationMethod\nPreferredAvailabilityZone\nPreferredAvailabilityZones\nPreferredBackupWindow\nPreferredCacheClusterAZs\nPreferredChannelPipeline\nPreferredFileServerIp\nPreferredInstanceType\nPreferredLanguage\nPreferredMaintenanceWindow\nPreferredMfa\nPreferredMfaSetting\nPreferredOutpostArn\nPreferredOutpostArns\nPreferredProtocol\nPreferredSubnetId\nPrefetchConsumption\nPrefetchRetrieval\nPrefetchSchedule\nPrefix\nPrefixConfig\nPrefixForAllResources\nPrefixLevel\nPrefixLevelStorageMetrics\nPrefixList\nPrefixListArn\nPrefixListAssociation\nPrefixListAssociations\nPrefixListEntry\nPrefixListId\nPrefixListIds\nPrefixListName\nPrefixListOwnerId\nPrefixLists\nPrefixesCompleted\nPrefixesFound\nPreload\nPreloadDataConfig\nPreloadDataType\nPrepareDuration\nPrepareQueryRequest\nPrepareQueryResponse\nPrepareStatus\nPreparedStatement\nPreparedStatementNames\nPreparedStatementSummary\nPreparedStatements\nPresenterOnlyConfiguration\nPresenterPosition\nPreserveClientIp\nPreserveDeletedFiles\nPreserveDevices\nPreserveExistingData\nPreserveTransactions\nPreservedExistingData\nPreset\nPresetDeploymentConfig\nPresetDeploymentOutput\nPresetDeploymentType\nPresetId\nPresetSettings\nPresetSpeke20Audio\nPresetSpeke20Video\nPresetWatermark\nPresetWatermarkId\nPresets\nPresignedUrl\nPresignedUrlConfig\nPrestoParameters\nPreventUserExistenceErrors\nPreview\nPreviewAgentsRequest\nPreviewAgentsResponse\nPreviewGenerationInProgressException\nPreviewNextCidr\nPreviewOverride\nPreviousActiveModelVersion\nPreviousActiveModelVersionArn\nPreviousActiveVersion\nPreviousActiveVersionArn\nPreviousAppsList\nPreviousContactId\nPreviousEarthObservationJobArn\nPreviousFleetState\nPreviousInvocationTime\nPreviousLineItemId\nPreviousModelVersionActivatedAt\nPreviousOrderId\nPreviousPassword\nPreviousProtocolsList\nPreviousRunId\nPreviousSlotEndTime\nPreviousSpotFleetRequestState\nPreviousState\nPreviousStatus\nPreviousValue\nPreviousValues\nPreviousVersion\nPrice\nPriceClass\nPriceList\nPriceListArn\nPriceLists\nPricePerUnit\nPriceSchedule\nPriceScheduleSpecification\nPriceSchedules\nPriceUnits\nPriceWithCurrency\nPrices\nPricingDetail\nPricingDetails\nPricingPlan\nPricingPlanArn\nPricingPlanArns\nPricingPlanDataSource\nPricingPlanListElement\nPricingPlans\nPricingRuleArn\nPricingRuleArns\nPricingRuleListElement\nPricingRules\nPrimary\nPrimaryAccountId\nPrimaryAccountNumber\nPrimaryAvailabilityZone\nPrimaryBackground\nPrimaryBtn\nPrimaryClusterId\nPrimaryContainer\nPrimaryDistributionId\nPrimaryEmail\nPrimaryEmailPrefix\nPrimaryEndpoint\nPrimaryForeground\nPrimaryHost\nPrimaryIpv6\nPrimaryKey\nPrimaryKeyColumnName\nPrimaryKeys\nPrimaryMeetingId\nPrimaryMetricName\nPrimaryOutpostArn\nPrimaryProvisionedNumber\nPrimaryRegion\nPrimaryReplicationGroupId\nPrimarySource\nPrimaryStatus\nPrimaryValue\nPrimaryValueDisplayType\nPrimaryValueFontConfiguration\nPrimaryWorkspaceId\nPrimaryYAxisDisplayOptions\nPrimaryYAxisLabelOptions\nPrincipal\nPrincipalARN\nPrincipalArn\nPrincipalId\nPrincipalIdFormat\nPrincipalList\nPrincipalName\nPrincipalOrgID\nPrincipalOrgIDs\nPrincipalPermissions\nPrincipalResourcePermissions\nPrincipalTags\nPrincipalType\nPrincipals\nPriorModelMetrics\nPriorRequestNotComplete\nPrioritizeBusinessGoals\nPrioritizedRiskCounts\nPriority\nPriorityConfiguration\nPriorityInUseException\nPriorityOrder\nPrivacy\nPrivacyPolicy\nPrivacyProtectAdminContact\nPrivacyProtectRegistrantContact\nPrivacyProtectTechContact\nPrivateAddress\nPrivateChannelFilter\nPrivateConnectionProvisioningState\nPrivateDefaultScopeId\nPrivateDns\nPrivateDnsDetails\nPrivateDnsEnabled\nPrivateDnsHostnameType\nPrivateDnsHostnameTypeOnLaunch\nPrivateDnsName\nPrivateDnsNameConfiguration\nPrivateDnsNameOptions\nPrivateDnsNameOptionsOnLaunch\nPrivateDnsNameOptionsRequest\nPrivateDnsNameOptionsResponse\nPrivateDnsNameVerificationState\nPrivateDnsNames\nPrivateDnsNamespaceChange\nPrivateDnsNamespaceProperties\nPrivateDnsNamespacePropertiesChange\nPrivateDnsOnlyForInboundResolverEndpoint\nPrivateDnsPropertiesMutable\nPrivateDnsPropertiesMutableChange\nPrivateIPAddress\nPrivateIPv4Address\nPrivateIp\nPrivateIpAddress\nPrivateIpAddressConfigs\nPrivateIpAddressCount\nPrivateIpAddressDetails\nPrivateIpAddressSpecification\nPrivateIpAddresses\nPrivateKey\nPrivateKeyAttributes\nPrivateKeyAttributesV2\nPrivateKeyAttributesV3\nPrivateKeyAttributesV4\nPrivateKeyCiphertextBlob\nPrivateKeyFlags\nPrivateKeyFlagsV2\nPrivateKeyFlagsV3\nPrivateKeyFlagsV4\nPrivateKeyPlaintext\nPrivateKeys\nPrivateLinkConfig\nPrivateLinkEndpoint\nPrivateMetadataPid\nPrivateRegistryAccess\nPrivateRegistryAccessRequest\nPrivateSkillIds\nPrivateTypeException\nPrivateZone\nPrivileged\nPrivilegedDelete\nPrivilegedMode\nProactiveAnomalies\nProactiveAnomaly\nProactiveAnomalySummary\nProactiveEngagementStatus\nProactiveInsight\nProactiveInsightSummary\nProactiveInsights\nProactiveJoin\nProactiveOrganizationInsightSummary\nProb\nProbabilityAttribute\nProbabilityIndex\nProbabilityThresholdAttribute\nProblem\nProblemDetail\nProblemDetails\nProblemId\nProblemList\nProblemType\nProblems\nProcess\nProcessDetails\nProcessLaunchedAt\nProcessName\nProcessParentPid\nProcessPath\nProcessPid\nProcessTerminatedAt\nProcessType\nProcessedAutomationRules\nProcessedClusters\nProcessedFindings\nProcessedInputRecords\nProcessedItemCount\nProcessedRecordsCount\nProcessedSizeBytes\nProcessedUpdateAction\nProcessedUpdateActions\nProcesses\nProcessesType\nProcessing\nProcessingClusterConfig\nProcessingConfiguration\nProcessingEndTime\nProcessingFeatureStoreOutput\nProcessingInput\nProcessingInputs\nProcessingJob\nProcessingJobArn\nProcessingJobName\nProcessingJobStatus\nProcessingJobStepMetadata\nProcessingJobSummaries\nProcessingJobSummary\nProcessingOutput\nProcessingOutputConfig\nProcessingResources\nProcessingResult\nProcessingS3Input\nProcessingS3Output\nProcessingStartTime\nProcessingStatus\nProcessingStatusInfo\nProcessingStoppingCondition\nProcessingTimeMilliseconds\nProcessor\nProcessorConfiguration\nProcessorFeature\nProcessorFeatures\nProcessorInfo\nProcessorParameter\nProcessors\nProducerArn\nProducerTimestamp\nProduct\nProductARN\nProductArn\nProductCode\nProductCodeId\nProductCodeType\nProductCodes\nProductDescription\nProductDescriptions\nProductFamily\nProductFields\nProductId\nProductInformation\nProductInformationFilter\nProductInformationFilterComparator\nProductInformationFilterList\nProductInformationFilterName\nProductInformationFilterValue\nProductInformationList\nProductLink\nProductListingIds\nProductName\nProductSKU\nProductSource\nProductSubscriptionArn\nProductSubscriptionResourcePolicy\nProductSubscriptions\nProductTitle\nProductType\nProductUserSummaries\nProductUserSummary\nProductViewAggregationValue\nProductViewAggregations\nProductViewDetail\nProductViewDetails\nProductViewSummaries\nProductViewSummary\nProductionAccessEnabled\nProductionAccessNotGrantedException\nProductionBranch\nProductionVariant\nProductionVariantCoreDumpConfig\nProductionVariantServerlessConfig\nProductionVariantServerlessUpdateConfig\nProductionVariantStatus\nProductionVariantSummary\nProductionVariants\nProducts\nProfanity\nProfile\nProfileArn\nProfileArns\nProfileChoice\nProfileColumns\nProfileConfiguration\nProfileCount\nProfileData\nProfileDescription\nProfileDetail\nProfileDetailResponse\nProfileId\nProfileIds\nProfileIdsToBeMerged\nProfileName\nProfileNamePrefix\nProfileNotificationSummary\nProfileObjectUniqueKey\nProfileOwnerType\nProfileQuestion\nProfileQuestionUpdate\nProfileQuestions\nProfileShareSummaries\nProfileShareSummary\nProfileSummaries\nProfileSummary\nProfileTemplate\nProfileTemplateChoice\nProfileTemplateQuestion\nProfileTime\nProfileType\nProfileUrl\nProfileVersion\nProfilerConfig\nProfilerConfigForUpdate\nProfilerRuleConfiguration\nProfilerRuleConfigurations\nProfilerRuleEvaluationStatus\nProfilerRuleEvaluationStatuses\nProfiles\nProfilingGroupDescription\nProfilingIntervalInMilliseconds\nProfilingParameters\nProfilingStatus\nProformaCost\nProgramCount\nProgramDateTime\nProgramDateTimeClock\nProgramDateTimeIntervalSeconds\nProgramDateTimePeriod\nProgramId\nProgramName\nProgramNum\nProgramNumber\nProgramSelection\nProgrammingLang\nProgrammingLanguages\nProgress\nProgressBar\nProgressBarOptions\nProgressCounters\nProgressDetail\nProgressDetails\nProgressDetailsOnRollback\nProgressEvent\nProgressInMegaBytes\nProgressPercent\nProgressPercentage\nProgressReport\nProgressStatus\nProgressSummary\nProgressUpdateStream\nProgressUpdateStreamName\nProgressUpdateStreamSummary\nProgressUpdateStreamSummaryList\nProgressing\nProgressingJobsCount\nProgressiveDialerConfig\nProgressiveWriteHlsManifest\nProhibitedStateException\nProject\nProjectAlreadyExistsException\nProjectAppConfigResource\nProjectAppConfigResourceConfig\nProjectArn\nProjectArtifacts\nProjectBadge\nProjectBuildBatchConfig\nProjectCache\nProjectConfigurationException\nProjectCreationFailedException\nProjectDataDelivery\nProjectDataDeliveryConfig\nProjectDescription\nProjectDescriptions\nProjectDetails\nProjectEnvironment\nProjectFieldMappings\nProjectFileSystemLocation\nProjectId\nProjectInformation\nProjectListFilter\nProjectMetadata\nProjectName\nProjectNames\nProjectNotFoundException\nProjectOperation\nProjectPolicies\nProjectPolicy\nProjectResource\nProjectSource\nProjectSourceVersion\nProjectStatus\nProjectSummary\nProjectSummaryList\nProjectVersionArn\nProjectVersionDescription\nProjectVersionDescriptions\nProjectedColumns\nProjectedInbox\nProjectedMetric\nProjectedSpam\nProjectedVolume\nProjection\nProjectionExpression\nProjectionType\nProjects\nPrometheus\nPrometheusInfo\nPromoteMode\nPromotePermissionCreatedFromPolicyRequest\nPromotePermissionCreatedFromPolicyResponse\nPromoteReadReplicaDBClusterMessage\nPromoteReadReplicaDBClusterResult\nPromoteReadReplicaMessage\nPromoteReadReplicaResult\nPromoteRequest\nPromoteResourceShareCreatedFromPolicyRequest\nPromoteResourceShareCreatedFromPolicyResponse\nPromoteResponse\nPromotion\nPromotionTier\nPromotionalMessagesPerSecond\nPrompt\nPromptARN\nPromptAttemptSpecification\nPromptId\nPromptPresignedUrl\nPromptSearchCriteria\nPromptSearchFilter\nPromptSpecification\nPromptSummary\nPromptSummaryList\nPrompts\nProof\nPropagateAtLaunch\nPropagateTags\nPropagatingVgw\nPropagatingVgwSet\nPropagatingVgwSetDetails\nPropagatingVgws\nPropagation\nPropagationDefaultRouteTableId\nProperties\nPropertiesToDelete\nPropertiesToRemove\nProperty\nPropertyDefinitionRequest\nPropertyDefinitionResponse\nPropertyDifference\nPropertyDifferences\nPropertyFilter\nPropertyFilters\nPropertyGroup\nPropertyGroupDescriptions\nPropertyGroupId\nPropertyGroupRequest\nPropertyGroupResponse\nPropertyGroups\nPropertyLatestValue\nPropertyList\nPropertyMap\nPropertyName\nPropertyNameHint\nPropertyNameQuery\nPropertyNameSuggestion\nPropertyNameSuggestions\nPropertyNotification\nPropertyPath\nPropertyPredicate\nPropertyRequest\nPropertyResponse\nPropertyRole\nPropertyType\nPropertyUsage\nPropertyValidationException\nPropertyValidationExceptionProperty\nPropertyValue\nPropertyValueEntry\nPropertyValueHistory\nPropertygraphData\nPropertygraphRecord\nPropertygraphSummary\nPropertygraphSummaryValueMap\nProposal\nProposalActions\nProposalDurationInHours\nProposalId\nProposalSummary\nProposalVotes\nProposals\nProposed\nProposedByMemberId\nProposedByMemberName\nProposedConfiguration\nProposedMultiRegionAccessPointPolicy\nProposedPassword\nProposedSegmentChange\nProprietaryAuthenticationData\nProresSettings\nProtectedFromScaleIn\nProtectedQuery\nProtectedQueryError\nProtectedQueryResult\nProtectedQueryResultConfiguration\nProtectedQueryS3Output\nProtectedQueryS3OutputConfiguration\nProtectedQuerySQLParameters\nProtectedQuerySingleMemberOutput\nProtectedQueryStatistics\nProtectedQuerySummary\nProtectedResource\nProtectedResourceTypeLimits\nProtectedTask\nProtection\nProtectionArn\nProtectionGroup\nProtectionGroupArbitraryPatternLimits\nProtectionGroupArn\nProtectionGroupId\nProtectionGroupIds\nProtectionGroupLimits\nProtectionGroupPatternTypeLimits\nProtectionGroups\nProtectionId\nProtectionLimits\nProtectionNames\nProtectionPolicy\nProtections\nProtectiveEquipmentBodyPart\nProtectiveEquipmentModelVersion\nProtectiveEquipmentPerson\nProtectiveEquipmentSummarizationAttributes\nProtectiveEquipmentSummary\nProtocol\nProtocolDetails\nProtocolType\nProtocolVersion\nProtocols\nProtocolsList\nProtocolsListArn\nProtocolsListData\nProtocolsListDataSummary\nProtocolsLists\nProvideAnomalyFeedbackRequest\nProvideAnomalyFeedbackResponse\nProvidedContext\nProvidedContexts\nProvider\nProviderArn\nProviderAttributeName\nProviderAttributeValue\nProviderCalendarId\nProviderDescription\nProviderDetails\nProviderEndpoint\nProviderId\nProviderName\nProviderType\nProviderTypeFilter\nProviderTypes\nProviderUserIdentifierType\nProviders\nProvince\nProvisionByoipCidrRequest\nProvisionByoipCidrResponse\nProvisionByoipCidrResult\nProvisionData\nProvisionDeviceRequest\nProvisionDeviceResponse\nProvisionIpamPoolCidrRequest\nProvisionIpamPoolCidrResult\nProvisionPermissionSetRequest\nProvisionPermissionSetRequestId\nProvisionPermissionSetResponse\nProvisionProductId\nProvisionProductInput\nProvisionProductName\nProvisionProductOutput\nProvisionPublicIpv4PoolCidrRequest\nProvisionPublicIpv4PoolCidrResult\nProvisionState\nProvisionTime\nProvisionToken\nProvisionalConfiguration\nProvisioned\nProvisionedBandwidth\nProvisionedCapacity\nProvisionedCapacityDescription\nProvisionedCapacityList\nProvisionedCapacityUnits\nProvisionedCapacityUpdate\nProvisionedConcurrency\nProvisionedConcurrencyConfigListItem\nProvisionedConcurrencyConfigNotFoundException\nProvisionedConcurrencyConfigs\nProvisionedConcurrentExecutions\nProvisionedIops\nProvisionedIopsNotAvailableInAZFault\nProvisionedModelSummary\nProvisionedOnDemandCapacity\nProvisionedProductAttribute\nProvisionedProductDetail\nProvisionedProductId\nProvisionedProductName\nProvisionedProductPlanDetails\nProvisionedProductPlanSummary\nProvisionedProductPlans\nProvisionedProductProperties\nProvisionedProductStatusMessage\nProvisionedProductType\nProvisionedProducts\nProvisionedReadCapacityAutoScalingSettings\nProvisionedReadCapacityAutoScalingSettingsUpdate\nProvisionedReadCapacityAutoScalingUpdate\nProvisionedReadCapacityUnits\nProvisionedRequest\nProvisionedResource\nProvisionedSpotCapacity\nProvisionedStorageThroughput\nProvisionedThroughput\nProvisionedThroughputDescription\nProvisionedThroughputExceededException\nProvisionedThroughputInMibps\nProvisionedThroughputOverride\nProvisionedWriteCapacityAutoScalingSettings\nProvisionedWriteCapacityAutoScalingSettingsUpdate\nProvisionedWriteCapacityAutoScalingUpdate\nProvisionedWriteCapacityUnits\nProvisioningArtifact\nProvisioningArtifactDetail\nProvisioningArtifactDetails\nProvisioningArtifactId\nProvisioningArtifactMetadata\nProvisioningArtifactName\nProvisioningArtifactOutput\nProvisioningArtifactOutputKeys\nProvisioningArtifactOutputs\nProvisioningArtifactParameter\nProvisioningArtifactParameters\nProvisioningArtifactPreferences\nProvisioningArtifactProperties\nProvisioningArtifactSummaries\nProvisioningArtifactSummary\nProvisioningArtifactView\nProvisioningArtifactViews\nProvisioningArtifacts\nProvisioningHook\nProvisioningParameter\nProvisioningParameters\nProvisioningPreferences\nProvisioningStatus\nProvisioningTemplateSummary\nProvisioningTemplateVersionSummary\nProvisioningType\nProximity\nProximityEventConfiguration\nProximityResourceTypeEventConfiguration\nProxy\nProxyConfiguration\nProxyConfigurationProperties\nProxyPhoneNumber\nProxySession\nProxySessionId\nProxySessions\nProxyType\nProxyUrl\nPsAttributes\nPsDetailAttributes\nPsc\nPseudoTerminal\nPseudonym\nPsiControl\nPtrRecord\nPtrRecordUpdate\nPtrUpdateStatus\nPtsOffset\nPtsOffsetHandlingForBFrames\nPtsOffsetMode\nPublic\nPublicAccess\nPublicAccessBlock\nPublicAccessBlockConfiguration\nPublicAccessBlockEnabled\nPublicAddress\nPublicAddressAllocationIds\nPublicBaseImageReleasedDate\nPublicChannelFilter\nPublicContent\nPublicDefaultScopeId\nPublicDns\nPublicDnsName\nPublicDnsNamespaceChange\nPublicDnsNamespaceProperties\nPublicDnsNamespacePropertiesChange\nPublicDnsPropertiesMutable\nPublicDnsPropertiesMutableChange\nPublicEndpoint\nPublicIPAddress\nPublicIp\nPublicIpAddress\nPublicIpSource\nPublicIps\nPublicIpv4Pool\nPublicIpv4PoolRange\nPublicIpv4Pools\nPublicKey\nPublicKeyAlreadyExists\nPublicKeyCertificate\nPublicKeyConfig\nPublicKeyId\nPublicKeyInUse\nPublicKeyList\nPublicKeyMaterial\nPublicKeyRotationTimestamp\nPublicKeySummary\nPublicKeyVersion\nPublicKeys\nPublicPolicyException\nPublicSharingEnabled\nPublicSubject\nPublicTypeArn\nPublicVersionNumber\nPublicWorkforceTaskPrice\nPublicZoneVPCAssociation\nPublication\nPublications\nPubliclyAccessible\nPubliclyAdvertisable\nPublish\nPublishAppVersionRequest\nPublishAppVersionResponse\nPublishBatchInput\nPublishBatchRequestEntries\nPublishBatchRequestEntry\nPublishBatchResponse\nPublishBatchResultEntry\nPublishCloudWatchMetricsEnabled\nPublishFindingToSnsParams\nPublishFunctionRequest\nPublishFunctionResult\nPublishInput\nPublishLayerVersionRequest\nPublishLayerVersionResponse\nPublishMetricAction\nPublishMetricsInput\nPublishPackageVersionRequest\nPublishPackageVersionResult\nPublishRecipeRequest\nPublishRecipeResponse\nPublishRequest\nPublishResponse\nPublishSchemaRequest\nPublishSchemaResponse\nPublishStateMachineVersionInput\nPublishStateMachineVersionOutput\nPublishStatus\nPublishTimestamp\nPublishTypeInput\nPublishTypeOutput\nPublishVersionRequest\nPublishedBy\nPublishedDate\nPublishedSchemaArn\nPublishedVersionNumber\nPublishedVersions\nPublisherId\nPublisherIdentity\nPublisherName\nPublisherProfile\nPublisherStatus\nPublishingFailureStartTimestamp\nPublishingOptions\nPullRequest\nPullRequestAlreadyClosedException\nPullRequestApprovalRulesNotSatisfiedException\nPullRequestCannotBeApprovedByAuthorException\nPullRequestCreatedEventMetadata\nPullRequestDoesNotExistException\nPullRequestEvent\nPullRequestId\nPullRequestIdRequiredException\nPullRequestMergedStateChangedEventMetadata\nPullRequestSourceReferenceUpdatedEventMetadata\nPullRequestStatusChangedEventMetadata\nPullRequestStatusRequiredException\nPullRequestTarget\nPullThroughCacheRule\nPullThroughCacheRuleAlreadyExistsException\nPullThroughCacheRuleNotFoundException\nPurchase\nPurchaseHostReservationRequest\nPurchaseHostReservationResult\nPurchaseOfferingRequest\nPurchaseOfferingResponse\nPurchaseOfferingResult\nPurchaseProvisionedCapacityInput\nPurchaseProvisionedCapacityOutput\nPurchaseRequest\nPurchaseRequests\nPurchaseReservedCacheNodesOfferingMessage\nPurchaseReservedCacheNodesOfferingResult\nPurchaseReservedDBInstancesOfferingMessage\nPurchaseReservedDBInstancesOfferingResult\nPurchaseReservedElasticsearchInstanceOfferingRequest\nPurchaseReservedElasticsearchInstanceOfferingResponse\nPurchaseReservedInstanceOfferingRequest\nPurchaseReservedInstanceOfferingResponse\nPurchaseReservedInstancesOfferingRequest\nPurchaseReservedInstancesOfferingResult\nPurchaseReservedNodeOfferingMessage\nPurchaseReservedNodeOfferingResult\nPurchaseReservedNodesOfferingRequest\nPurchaseReservedNodesOfferingResponse\nPurchaseScheduledInstancesRequest\nPurchaseScheduledInstancesResult\nPurchaseTime\nPurchaseToken\nPurchasedAt\nPurchasedHours\nPurchasedUnits\nPurgeQueueRequest\nPushDomainRequest\nPushMessageActivity\nPushNotification\nPushNotificationConfiguration\nPushNotificationPreferences\nPushNotificationTemplateRequest\nPushNotificationTemplateResponse\nPushNotifications\nPushSync\nPushTemplate\nPut\nPutAccessControlRuleRequest\nPutAccessPointConfigurationForObjectLambdaRequest\nPutAccessPointPolicyForObjectLambdaRequest\nPutAccessPointPolicyRequest\nPutAccountAliasRequest\nPutAccountConfigurationRequest\nPutAccountDedicatedIpWarmupAttributesRequest\nPutAccountDetailsRequest\nPutAccountPolicyRequest\nPutAccountPolicyResponse\nPutAccountPreferencesRequest\nPutAccountPreferencesResponse\nPutAccountSendingAttributesRequest\nPutAccountSettingDefaultRequest\nPutAccountSettingDefaultResponse\nPutAccountSettingRequest\nPutAccountSettingResponse\nPutAccountSuppressionAttributesRequest\nPutAccountVdmAttributesRequest\nPutActionRevisionInput\nPutActionRevisionOutput\nPutAdminAccountRequest\nPutAggregationAuthorizationRequest\nPutAggregationAuthorizationResponse\nPutAlarmRequest\nPutAlarmResult\nPutAlertManagerDefinitionRequest\nPutAlertManagerDefinitionResponse\nPutAlternateContactRequest\nPutAnomalyDetectorInput\nPutAppInstanceRetentionSettingsRequest\nPutAppInstanceRetentionSettingsResponse\nPutAppInstanceStreamingConfigurationsRequest\nPutAppInstanceStreamingConfigurationsResponse\nPutAppInstanceUserExpirationSettingsRequest\nPutAppInstanceUserExpirationSettingsResponse\nPutAppLaunchConfigurationRequest\nPutAppReplicationConfigurationRequest\nPutAppValidationConfigurationRequest\nPutApplicationPolicyRequest\nPutApplicationPolicyResponse\nPutApprovalResultInput\nPutApprovalResultOutput\nPutAppsListRequest\nPutAppsListResponse\nPutAssetPropertyValueEntry\nPutAttributesRequest\nPutAttributesResponse\nPutAuditEventsRequest\nPutAuditEventsResponse\nPutAuthPolicyRequest\nPutAuthPolicyResponse\nPutAutoScalingPolicyInput\nPutAutoScalingPolicyOutput\nPutAutoTerminationPolicyInput\nPutBackupPolicyRequest\nPutBackupVaultAccessPolicyInput\nPutBackupVaultLockConfigurationInput\nPutBackupVaultNotificationsInput\nPutBandwidthRateLimitScheduleInput\nPutBandwidthRateLimitScheduleOutput\nPutBlockPublicAccessConfigurationInput\nPutBotAliasRequest\nPutBotAliasResponse\nPutBotRequest\nPutBotResponse\nPutBucketAccelerateConfigurationRequest\nPutBucketAclRequest\nPutBucketAnalyticsConfigurationRequest\nPutBucketCorsRequest\nPutBucketEncryptionRequest\nPutBucketIntelligentTieringConfigurationRequest\nPutBucketInventoryConfigurationRequest\nPutBucketLifecycleConfigurationRequest\nPutBucketLoggingRequest\nPutBucketMetricsConfigurationRequest\nPutBucketNotificationConfigurationRequest\nPutBucketOwnershipControlsRequest\nPutBucketPolicyRequest\nPutBucketReplicationRequest\nPutBucketRequestPaymentRequest\nPutBucketTaggingRequest\nPutBucketVersioningRequest\nPutBucketWebsiteRequest\nPutCapacityAssignmentConfigurationInput\nPutCaseEventConfigurationRequest\nPutChannelExpirationSettingsRequest\nPutChannelExpirationSettingsResponse\nPutChannelMembershipPreferencesRequest\nPutChannelMembershipPreferencesResponse\nPutChannelPolicyRequest\nPutChunkInput\nPutChunkOutput\nPutClassificationExportConfigurationRequest\nPutClassificationExportConfigurationResponse\nPutClusterCapacityProvidersRequest\nPutClusterCapacityProvidersResponse\nPutClusterPolicyRequest\nPutClusterPolicyResponse\nPutCodeBindingRequest\nPutCodeBindingResponse\nPutCommentReactionInput\nPutComplianceItemsRequest\nPutComponentPolicyRequest\nPutComponentPolicyResponse\nPutCompositeAlarmInput\nPutConferencePreferenceRequest\nPutConfigRuleRequest\nPutConfigurationAggregatorRequest\nPutConfigurationAggregatorResponse\nPutConfigurationRecorderRequest\nPutConfigurationRequest\nPutConfigurationSetDeliveryOptionsRequest\nPutConfigurationSetReputationOptionsRequest\nPutConfigurationSetSendingOptionsRequest\nPutConfigurationSetSuppressionOptionsRequest\nPutConfigurationSetTrackingOptionsRequest\nPutConfigurationSetVdmOptionsRequest\nPutConformancePackRequest\nPutConformancePackResponse\nPutContactInformationRequest\nPutContactPolicyRequest\nPutContainerPolicyInput\nPutContainerRecipePolicyRequest\nPutContainerRecipePolicyResponse\nPutCoreNetworkPolicyRequest\nPutCoreNetworkPolicyResponse\nPutCorsPolicyInput\nPutDashboardInput\nPutDashboardOutput\nPutDataCatalogEncryptionSettingsRequest\nPutDataLakeSettingsRequest\nPutDataProtectionPolicyInput\nPutDataProtectionPolicyRequest\nPutDataProtectionPolicyResponse\nPutDataSetRefreshPropertiesRequest\nPutDataSetRefreshPropertiesResponse\nPutDedicatedIpInPoolRequest\nPutDedicatedIpPoolScalingAttributesRequest\nPutDedicatedIpWarmupAttributesRequest\nPutDefaultEncryptionConfigurationRequest\nPutDefaultEncryptionConfigurationResponse\nPutDeliverabilityDashboardOptionRequest\nPutDeliveryChannelRequest\nPutDestinationPolicyRequest\nPutDestinationRequest\nPutDestinationResponse\nPutDetectorRequest\nPutDialRequestBatchRequest\nPutDialRequestBatchResponse\nPutDomainPermissionsPolicyRequest\nPutDomainPermissionsPolicyResult\nPutDraftAppVersionTemplateRequest\nPutDraftAppVersionTemplateResponse\nPutEmailIdentityConfigurationSetAttributesRequest\nPutEmailIdentityDkimAttributesRequest\nPutEmailIdentityDkimSigningAttributesRequest\nPutEmailIdentityDkimSigningAttributesResponse\nPutEmailIdentityFeedbackAttributesRequest\nPutEmailIdentityMailFromAttributesRequest\nPutEmailMonitoringConfigurationRequest\nPutEncryptionConfigRequest\nPutEncryptionConfigResult\nPutEncryptionConfigurationRequest\nPutEncryptionConfigurationResponse\nPutEntityTypeRequest\nPutEvaluationsRequest\nPutEvaluationsResponse\nPutEventSelectorsRequest\nPutEventSelectorsResponse\nPutEventStreamRequest\nPutEventStreamResponse\nPutEventTypeRequest\nPutEventsConfigurationRequest\nPutEventsConfigurationResponse\nPutEventsRequest\nPutEventsRequestEntry\nPutEventsResponse\nPutEventsResultEntry\nPutExternalEvaluationRequest\nPutExternalModelRequest\nPutFeedbackRequest\nPutFileEntry\nPutFileEntryConflictException\nPutFileInput\nPutFileOutput\nPutFileSystemPolicyRequest\nPutFindingsPublicationConfigurationRequest\nPutFirewallRuleGroupPolicyRequest\nPutFirewallRuleGroupPolicyResponse\nPutFunctionCodeSigningConfigRequest\nPutFunctionCodeSigningConfigResponse\nPutFunctionConcurrencyRequest\nPutFunctionEventInvokeConfigRequest\nPutGatewayResponseRequest\nPutGeofenceRequest\nPutGeofenceResponse\nPutGroupConfigurationInput\nPutGroupPolicyRequest\nPutHypervisorPropertyMappingsInput\nPutHypervisorPropertyMappingsOutput\nPutIdentityPolicyRequest\nPutImagePolicyRequest\nPutImagePolicyResponse\nPutImageRecipePolicyRequest\nPutImageRecipePolicyResponse\nPutImageRequest\nPutImageResponse\nPutImageScanningConfigurationRequest\nPutImageScanningConfigurationResponse\nPutImageTagMutabilityRequest\nPutImageTagMutabilityResponse\nPutInboundDmarcSettingsRequest\nPutInlinePolicyToPermissionSetRequest\nPutInsightRuleInput\nPutInsightSelectorsRequest\nPutInsightSelectorsResponse\nPutInstancePublicPortsRequest\nPutInstancePublicPortsResult\nPutIntegrationRequest\nPutIntegrationResponse\nPutIntegrationResponseRequest\nPutIntentRequest\nPutIntentResponse\nPutInventoryRequest\nPutInventoryResult\nPutInvitationConfigurationRequest\nPutItemInput\nPutItemOutput\nPutItemsRequest\nPutJobFailureResultInput\nPutJobSuccessResultInput\nPutJobTaggingRequest\nPutKMSEncryptionKeyRequest\nPutKeyPolicyRequest\nPutKeywordRequest\nPutKeywordResult\nPutLabelRequest\nPutLaunchActionRequest\nPutLaunchActionResponse\nPutLaunchProfileMembersRequest\nPutLexiconInput\nPutLifecycleConfigurationRequest\nPutLifecycleEventHookExecutionStatusInput\nPutLifecycleEventHookExecutionStatusOutput\nPutLifecycleHookType\nPutLifecyclePolicyInput\nPutLifecyclePolicyRequest\nPutLifecyclePolicyResponse\nPutLogEventsRequest\nPutLogEventsResponse\nPutLoggingConfigurationRequest\nPutLoggingConfigurationResponse\nPutLoggingOptionsRequest\nPutMailboxPermissionsRequest\nPutMaintenanceStartTimeInput\nPutMaintenanceStartTimeOutput\nPutManagedInsightRulesInput\nPutManagedInsightRulesOutput\nPutManagedRuleSetVersionsRequest\nPutManagedRuleSetVersionsResponse\nPutManagedScalingPolicyInput\nPutMessagingStreamingConfigurationsRequest\nPutMessagingStreamingConfigurationsResponse\nPutMetadataFlagBody\nPutMetadataFlagRequest\nPutMetadataRequest\nPutMethodRequest\nPutMethodResponseRequest\nPutMetricAlarmInput\nPutMetricDataInput\nPutMetricFilterRequest\nPutMetricPolicyInput\nPutMetricStreamInput\nPutMetricStreamOutput\nPutMobileDeviceAccessOverrideRequest\nPutModelInvocationLoggingConfigurationRequest\nPutModelPackageGroupPolicyInput\nPutModelPackageGroupPolicyOutput\nPutMultiRegionAccessPointPolicyInput\nPutMultiRegionAccessPointPolicyRequest\nPutMultiRegionAccessPointPolicyResult\nPutNotificationChannelRequest\nPutNotificationConfigurationType\nPutNotificationSettingsRequest\nPutNotificationSettingsResponse\nPutObjectAclOutput\nPutObjectAclRequest\nPutObjectInput\nPutObjectLegalHoldOutput\nPutObjectLegalHoldRequest\nPutObjectLockConfigurationOutput\nPutObjectLockConfigurationRequest\nPutObjectOutput\nPutObjectRequest\nPutObjectResponse\nPutObjectRetentionOutput\nPutObjectRetentionRequest\nPutObjectTaggingOutput\nPutObjectTaggingRequest\nPutOptedOutNumberRequest\nPutOptedOutNumberResult\nPutOrganizationConfigRuleRequest\nPutOrganizationConfigRuleResponse\nPutOrganizationConformancePackRequest\nPutOrganizationConformancePackResponse\nPutOriginEndpointPolicyRequest\nPutOutcomeRequest\nPutPackageOriginConfigurationRequest\nPutPackageOriginConfigurationResult\nPutParameterRequest\nPutParameterResult\nPutPartnerEventsRequest\nPutPartnerEventsRequestEntry\nPutPartnerEventsResponse\nPutPartnerEventsResultEntry\nPutPermissionPolicyRequest\nPutPermissionRequest\nPutPermissionResponse\nPutPermissionsBoundaryToPermissionSetRequest\nPutPipelineDefinitionInput\nPutPipelineDefinitionOutput\nPutPlaybackConfigurationRequest\nPutPlaybackConfigurationResponse\nPutPolicyRequest\nPutPolicyResponse\nPutPortfolioPreferencesRequest\nPutPositionConfigurationRequest\nPutPrincipalMappingRequest\nPutProfileObjectRequest\nPutProfileObjectResponse\nPutProfileObjectTypeRequest\nPutProfileObjectTypeResponse\nPutProjectEventsRequest\nPutProjectEventsResponse\nPutProjectEventsResultEntry\nPutProjectPolicyRequest\nPutProjectPolicyResponse\nPutProtocolsListRequest\nPutProtocolsListResponse\nPutProvisionedConcurrencyConfigRequest\nPutProvisionedConcurrencyConfigResponse\nPutPublicAccessBlockRequest\nPutQueryDefinitionRequest\nPutQueryDefinitionResponse\nPutRawMessageContentRequest\nPutRecommendationFeedbackRequest\nPutRecommendationPreferencesRequest\nPutRecordBatchInput\nPutRecordBatchOutput\nPutRecordBatchResponseEntry\nPutRecordInput\nPutRecordOutput\nPutRecordRequest\nPutRecordsInput\nPutRecordsOutput\nPutRecordsRequestEntry\nPutRecordsResultEntry\nPutRegistryCatalogDataRequest\nPutRegistryCatalogDataResponse\nPutRegistryPolicyRequest\nPutRegistryPolicyResponse\nPutRegistryScanningConfigurationRequest\nPutRegistryScanningConfigurationResponse\nPutRemediationConfigurationsRequest\nPutRemediationConfigurationsResponse\nPutRemediationExceptionsRequest\nPutRemediationExceptionsResponse\nPutReplicationConfigurationRequest\nPutReplicationConfigurationResponse\nPutReportDefinitionRequest\nPutReportDefinitionResult\nPutRepositoryCatalogDataRequest\nPutRepositoryCatalogDataResponse\nPutRepositoryPermissionsPolicyRequest\nPutRepositoryPermissionsPolicyResult\nPutRepositoryTriggersInput\nPutRepositoryTriggersOutput\nPutRequest\nPutResolverQueryLogConfigPolicyRequest\nPutResolverQueryLogConfigPolicyResponse\nPutResolverRulePolicyRequest\nPutResolverRulePolicyResponse\nPutResourceAttributesRequest\nPutResourceConfigRequest\nPutResourceLogLevelRequest\nPutResourcePermissionInput\nPutResourcePermissionOutput\nPutResourcePolicyInput\nPutResourcePolicyOutput\nPutResourcePolicyRequest\nPutResourcePolicyResponse\nPutResourcePolicyResult\nPutResourceSetRequest\nPutResourceSetResponse\nPutRestApiRequest\nPutRetentionConfigurationRequest\nPutRetentionConfigurationResponse\nPutRetentionPolicyRequest\nPutRetentionSettingsRequest\nPutRetentionSettingsResponse\nPutRolePermissionsBoundaryRequest\nPutRolePolicyRequest\nPutRoomSkillParameterRequest\nPutRuleGroupsNamespaceRequest\nPutRuleGroupsNamespaceResponse\nPutRuleRequest\nPutRuleResponse\nPutRumEventsRequest\nPutRumMetricsDestinationRequest\nPutRuntimeManagementConfigRequest\nPutRuntimeManagementConfigResponse\nPutScalingPolicyInput\nPutScalingPolicyOutput\nPutScalingPolicyRequest\nPutScalingPolicyResponse\nPutScalingPolicyType\nPutScheduledActionRequest\nPutScheduledUpdateGroupActionType\nPutSchemaFromJsonRequest\nPutSchemaFromJsonResponse\nPutSchemaInput\nPutSchemaOutput\nPutSchemaVersionMetadataInput\nPutSchemaVersionMetadataResponse\nPutSecretValueRequest\nPutSecretValueResponse\nPutServiceQuotaIncreaseRequestIntoTemplateRequest\nPutServiceQuotaIncreaseRequestIntoTemplateResponse\nPutSessionRequest\nPutSessionResponse\nPutSigningProfileRequest\nPutSigningProfileResponse\nPutSinkPolicyInput\nPutSinkPolicyOutput\nPutSipMediaApplicationAlexaSkillConfigurationRequest\nPutSipMediaApplicationAlexaSkillConfigurationResponse\nPutSipMediaApplicationLoggingConfigurationRequest\nPutSipMediaApplicationLoggingConfigurationResponse\nPutSkillAuthorizationRequest\nPutSlotTypeRequest\nPutSlotTypeResponse\nPutSnapshotBlockRequest\nPutSnapshotBlockResponse\nPutSolFunctionPackageContentInput\nPutSolFunctionPackageContentMetadata\nPutSolFunctionPackageContentOutput\nPutSolNetworkPackageContentInput\nPutSolNetworkPackageContentMetadata\nPutSolNetworkPackageContentOutput\nPutSourceServerActionRequest\nPutStorageConfigurationRequest\nPutStorageConfigurationResponse\nPutStorageLensConfigurationRequest\nPutStorageLensConfigurationTaggingRequest\nPutStoredQueryRequest\nPutStoredQueryResponse\nPutStudioMembersRequest\nPutSubscriptionFilterRequest\nPutSuppressedDestinationRequest\nPutTargetsRequest\nPutTargetsResponse\nPutTargetsResultEntry\nPutTelemetryRecordsRequest\nPutTemplateActionRequest\nPutThirdPartyJobFailureResultInput\nPutThirdPartyJobSuccessResultInput\nPutTraceSegmentsRequest\nPutTraceSegmentsResult\nPutUserPermissionsBoundaryRequest\nPutUserPolicyRequest\nPutUserStatusRequest\nPutUsersRequest\nPutVerificationStateOnViolationRequest\nPutVoiceConnectorEmergencyCallingConfigurationRequest\nPutVoiceConnectorEmergencyCallingConfigurationResponse\nPutVoiceConnectorLoggingConfigurationRequest\nPutVoiceConnectorLoggingConfigurationResponse\nPutVoiceConnectorOriginationRequest\nPutVoiceConnectorOriginationResponse\nPutVoiceConnectorProxyRequest\nPutVoiceConnectorProxyResponse\nPutVoiceConnectorStreamingConfigurationRequest\nPutVoiceConnectorStreamingConfigurationResponse\nPutVoiceConnectorTerminationCredentialsRequest\nPutVoiceConnectorTerminationRequest\nPutVoiceConnectorTerminationResponse\nPutWarmPoolType\nPutWebhookInput\nPutWebhookOutput\nPutWorkflowRunPropertiesRequest\nPwd\nPythonScript\nPythonVersion\nQRCodePNG\nQSearchBar\nQopConfiguration\nQualification\nQualificationRequest\nQualificationRequestId\nQualificationRequests\nQualificationRequirement\nQualificationRequirements\nQualificationStatus\nQualificationType\nQualificationTypeId\nQualificationTypeStatus\nQualificationTypes\nQualifications\nQualifier\nQuality\nQualityCheck\nQualityCheckStepMetadata\nQualityFilter\nQualityLevel\nQualityTuningLevel\nQuantile\nQuantity\nQuantumTaskQueueInfo\nQuantumTaskSummary\nQueries\nQueriesConfig\nQuery\nQueryAlias\nQueryArg\nQueryArgProfile\nQueryArgProfileConfig\nQueryArgProfileEmpty\nQueryArgProfiles\nQueryArgument\nQueryArn\nQueryAsOfTime\nQueryAssistantRequest\nQueryAssistantResponse\nQueryCapacityUnits\nQueryCompileError\nQueryCompileErrorLocation\nQueryDefinition\nQueryEndDate\nQueryError\nQueryErrors\nQueryEvalStats\nQueryExecution\nQueryExecutionContext\nQueryExecutionException\nQueryExecutionId\nQueryExecutionIds\nQueryExecutionStatistics\nQueryExecutionStatus\nQueryExecutions\nQueryFilter\nQueryFilters\nQueryForecastRequest\nQueryForecastResponse\nQueryId\nQueryIdNotFoundException\nQueryIdentifiersEnclosingOption\nQueryInfo\nQueryInput\nQueryLanguageVersion\nQueryLimitExceededException\nQueryLimitException\nQueryLineageRequest\nQueryLineageResponse\nQueryLogLookBackWindowInDays\nQueryLoggingConfig\nQueryLoggingConfigAlreadyExists\nQueryLoggingConfigs\nQueryName\nQueryObjectsInput\nQueryObjectsOutput\nQueryOutput\nQueryParameterMatch\nQueryParameters\nQueryPlanningContext\nQueryPlanningTimeInMillis\nQueryQueueTimeInMillis\nQueryRecommendationTriggerData\nQueryRequest\nQueryResponse\nQueryResult\nQueryResultItem\nQueryResultRows\nQueryResultTypeFilter\nQueryRuntimeStatistics\nQueryRuntimeStatisticsRows\nQueryRuntimeStatisticsTimeline\nQuerySchemaVersionMetadataInput\nQuerySchemaVersionMetadataResponse\nQueryScopes\nQuerySingleAlwaysOnNode\nQueryStage\nQueryStagePlan\nQueryStagePlanNode\nQueryStartDate\nQueryStatement\nQueryStatistics\nQueryStatisticsForDescribeQuery\nQueryStatus\nQueryString\nQueryStringBehavior\nQueryStringCacheKeys\nQueryStringConditionConfig\nQueryStringConfig\nQueryStringKeyValuePair\nQueryStringNames\nQueryStringObject\nQueryStringParameters\nQueryStrings\nQueryStringsConfig\nQuerySubmissionTime\nQuerySuggestionsBlockListSummary\nQuerySuggestionsId\nQueryTableRowsRequest\nQueryTableRowsResult\nQueryText\nQueryTexts\nQueryTimeoutException\nQueryTooLargeException\nQueryWhatIfForecastRequest\nQueryWhatIfForecastResponse\nQuestion\nQuestionChoices\nQuestionDescription\nQuestionDifference\nQuestionDifferences\nQuestionId\nQuestionIdentifier\nQuestionMetric\nQuestionPriority\nQuestionTitle\nQuestionType\nQuestionTypeProperties\nQuestions\nQueue\nQueueArn\nQueueConfig\nQueueConfigs\nQueueConfiguration\nQueueConfigurations\nQueueId\nQueueInfo\nQueueName\nQueueNamePrefix\nQueueOwnerAWSAccountId\nQueueQuickConnectConfig\nQueueReference\nQueueReferences\nQueueSearchCriteria\nQueueSearchFilter\nQueueSummary\nQueueSummaryList\nQueueTimeMillis\nQueueTransition\nQueueTransitions\nQueueType\nQueueTypeCondition\nQueueTypes\nQueueUrl\nQueueUrls\nQueuedIngestion\nQueues\nQuickConnect\nQuickConnectARN\nQuickConnectConfig\nQuickConnectId\nQuickConnectIds\nQuickConnectSearchCriteria\nQuickConnectSearchFilter\nQuickConnectSummary\nQuickConnectSummaryList\nQuickConnectType\nQuickConnectTypes\nQuickConnects\nQuickSightConsole\nQuickSightUserNotFoundException\nQuiet\nQuietTime\nQuipConfiguration\nQuota\nQuotaAppliedAtLevel\nQuotaArn\nQuotaCode\nQuotaContext\nQuotaContextInfo\nQuotaExceededException\nQuotaName\nQuotaPeriod\nQuotaRequestedAtLevel\nQuotaSettings\nQuotas\nQuoteChar\nQuoteCharacter\nQuoteEscapeCharacter\nQuoteFields\nQuoteSymbol\nQvbrQualityLevel\nQvbrQualityLevelFineTune\nQvbrSettings\nR53HostedZoneDeletionState\nR53Resource\nR53ResourceRecord\nRDFGraphSummary\nRDFGraphSummaryValueMap\nRDSData\nRDSDataSpec\nRDSDatabase\nRDSDatabaseCredentials\nRDSInstanceDetails\nRDSMetadata\nRDSSourceConfig\nRICostForUnusedHours\nRMSE\nRSessionAppSettings\nRStudioConnectUrl\nRStudioPackageManagerUrl\nRStudioServerProAppSettings\nRStudioServerProDomainSettings\nRStudioServerProDomainSettingsForUpdate\nRTMPConfiguration\nRaAllowed\nRabbitMQBrokerParameters\nRackElevation\nRackId\nRackPhysicalProperties\nRadarChartAggregatedFieldWells\nRadarChartAreaStyleSettings\nRadarChartConfiguration\nRadarChartFieldWells\nRadarChartSeriesSettings\nRadarChartSortConfiguration\nRadarChartVisual\nRadios\nRadius\nRadiusPort\nRadiusRetries\nRadiusServers\nRadiusSettings\nRadiusStatus\nRadiusTimeout\nRaidArray\nRaidArrayId\nRaidArrayIds\nRaidArrays\nRaidLevel\nRamDiskId\nRamdisk\nRamdiskId\nRandomNonce\nRandomPassword\nRandomSeed\nRandomSplit\nRandomSplitActivity\nRandomSplitEntry\nRange\nRangeConstant\nRangeEndsLabelType\nRangeInBytes\nRangeInKilometers\nRangeMaximum\nRangeMaximumValue\nRangeMinimum\nRangeMinimumValue\nRangeNotSatisfiableException\nRangedConnectionDetails\nRangedSocketAddress\nRangesOnIndexedValues\nRank\nRankOrder\nRasterDataCollectionArn\nRasterDataCollectionMetadata\nRasterDataCollectionName\nRasterDataCollectionQuery\nRasterDataCollectionQueryInput\nRasterDataCollectionQueryOutput\nRasterDataCollectionQueryWithBandFilterInput\nRasterDataCollectionSummaries\nRateBasedRule\nRateBasedStatement\nRateBasedStatementCustomKey\nRateBasedStatementManagedKeysIPSet\nRateControlMode\nRateExceededException\nRateIncreaseCriteria\nRateKey\nRateLimit\nRateLimitCookie\nRateLimitExceededException\nRateLimitHeader\nRateLimitLabelNamespace\nRateLimitQueryArgument\nRateLimitQueryString\nRateLimitUriPath\nRateMode\nRating\nRaw\nRawContent\nRawEmail\nRawFormat\nRawInputRecords\nRawMessage\nRawMessageContent\nRawMetricData\nRawSecretAccessKey\nRawSettings\nRawString\nRblName\nRdsConfiguration\nRdsDbClusterSnapshotConfiguration\nRdsDbInstance\nRdsDbInstanceArn\nRdsDbInstanceArns\nRdsDbInstanceDetails\nRdsDbInstances\nRdsDbSnapshotConfiguration\nRdsDbUserDetails\nRdsEngine\nRdsEventCategories\nRdsEventMessage\nRdsHttpEndpointConfig\nRdsLoginAttemptAction\nRdsParameters\nRdsRecommendation\nRdsRequirements\nRdsResourceId\nReEncryptDataInput\nReEncryptDataOutput\nReEncryptRequest\nReEncryptResponse\nReactStartCodegenJobData\nReactionForComment\nReactionLimitExceededException\nReactionValueFormats\nReactionValueRequiredException\nReactions\nReactiveAnomalies\nReactiveAnomaly\nReactiveAnomalySummary\nReactiveInsight\nReactiveInsightSummary\nReactiveInsights\nReactiveOrganizationInsightSummary\nRead\nReadAccessPrincipalArns\nReadAheadBlocks\nReadAttributes\nReadBackupOnly\nReadCapacityUnits\nReadDeleteRate\nReadEndpoint\nReadIOs\nReadJobRequest\nReadJobResponse\nReadMarkerTimestamp\nReadOnly\nReadOnlyAdmins\nReadOnlyFieldInfo\nReadOnlyFields\nReadOnlyViolationException\nReadOptions\nReadPipelineRequest\nReadPipelineResponse\nReadPresetRequest\nReadPresetResponse\nReadRate\nReadRatePercent\nReadReplicaCapable\nReadReplicaDBClusterIdentifiers\nReadReplicaDBInstanceIdentifiers\nReadReplicaIdentifiers\nReadReplicaSourceDBClusterIdentifier\nReadReplicaSourceDBInstanceIdentifier\nReadSetBatchError\nReadSetFiles\nReadSetFilter\nReadSetListItem\nReadSetUploadPartListFilter\nReadSetUploadPartListItem\nReadTableSpaceName\nReadTime\nReadTimestamp\nReadWriteType\nReaderEndpoint\nReaderGroup\nReaders\nReadiness\nReadinessCheckArn\nReadinessCheckName\nReadinessCheckOutput\nReadinessCheckSummary\nReadinessChecks\nReadinessScopes\nReadmeBody\nReadmeUrl\nReadonlyRootFilesystem\nReady\nReadyDateTime\nRealTimeAlertConfiguration\nRealTimeAlertRule\nRealTimeInferenceConfig\nRealTimeInferenceRecommendation\nRealTimeInferenceRecommendations\nRealizedSavings\nRealm\nRealtimeContactAnalysisSegment\nRealtimeEndpointInfo\nRealtimeLogConfig\nRealtimeLogConfigAlreadyExists\nRealtimeLogConfigArn\nRealtimeLogConfigInUse\nRealtimeLogConfigName\nRealtimeLogConfigOwnerMismatch\nRealtimeLogConfigs\nRealtimeMetricsSubscriptionConfig\nRealtimeMetricsSubscriptionStatus\nReason\nReasonCode\nReasonCodeSummary\nReasonCodes\nReasonContext\nReasonForNewProvisioningData\nReasonMessage\nReasons\nRebalanceSlotsInGlobalReplicationGroupMessage\nRebalanceSlotsInGlobalReplicationGroupResult\nRebootBrokerRequest\nRebootBrokerResponse\nRebootCacheClusterMessage\nRebootCacheClusterResult\nRebootClusterMessage\nRebootClusterResult\nRebootDBClusterMessage\nRebootDBClusterResult\nRebootDBInstanceMessage\nRebootDBInstanceResult\nRebootInputDeviceRequest\nRebootInstanceRequest\nRebootInstanceResult\nRebootInstancesRequest\nRebootNodeRequest\nRebootNodeResponse\nRebootOption\nRebootRelationalDatabaseRequest\nRebootRelationalDatabaseResult\nRebootReplicationInstanceMessage\nRebootReplicationInstanceResponse\nRebootRequest\nRebootWorkspaceRequests\nRebootWorkspacesRequest\nRebootWorkspacesResult\nRebooting\nRebuildEnvironmentMessage\nRebuildRequest\nRebuildSnapshots\nRebuildWorkspace\nRebuildWorkspaceRequests\nRebuildWorkspacesRequest\nRebuildWorkspacesResult\nRec601Settings\nRec709Settings\nRecall\nReceipt\nReceiptAction\nReceiptFilter\nReceiptHandle\nReceiptInfo\nReceiptIpFilter\nReceiptRule\nReceiptRuleSetMetadata\nReceiptTime\nReceiptType\nReceipts\nReceiveMessageRequest\nReceiveMessageResult\nReceiveRequestAttemptId\nReceivedAt\nReceivedEventAgeHistogram\nReceivedMetadata\nReceivedStatus\nReceivedStatusReason\nReceivedTime\nRecency\nRecencyDimension\nRecencyType\nRecentCaseCommunications\nRecentlyActive\nRecentlyFailedRuns\nRecipe\nRecipeAction\nRecipeArn\nRecipeName\nRecipeReference\nRecipeStep\nRecipeSummary\nRecipeUri\nRecipeVersion\nRecipeVersionErrorDetail\nRecipeVersions\nRecipes\nRecipient\nRecipientArn\nRecipientDetail\nRecipientDsnFields\nRecipientId\nRecipientInfo\nRecipientParticipantId\nRecipients\nRecognizeCelebritiesRequest\nRecognizeCelebritiesResponse\nRecognizeTextRequest\nRecognizeTextResponse\nRecognizeUtteranceRequest\nRecognizeUtteranceResponse\nRecognizedBotMember\nRecognizerMetadata\nRecognizerName\nRecommendation\nRecommendationCategory\nRecommendationData\nRecommendationDescription\nRecommendationDetailData\nRecommendationDetailHourlyMetrics\nRecommendationDetailId\nRecommendationDetails\nRecommendationDisruptionCompliance\nRecommendationExportJob\nRecommendationFeedback\nRecommendationFeedbackSummaries\nRecommendationFeedbackSummary\nRecommendationId\nRecommendationIds\nRecommendationItem\nRecommendationJobCompiledOutputConfig\nRecommendationJobContainerConfig\nRecommendationJobInferenceBenchmark\nRecommendationJobInputConfig\nRecommendationJobOutputConfig\nRecommendationJobPayloadConfig\nRecommendationJobResourceLimit\nRecommendationJobStoppingConditions\nRecommendationJobVpcConfig\nRecommendationMetrics\nRecommendationPreferences\nRecommendationPreferencesDetail\nRecommendationProviderIdType\nRecommendationProviderRoleArn\nRecommendationProviderUri\nRecommendationRelatedAnomaly\nRecommendationRelatedAnomalyResource\nRecommendationRelatedAnomalySourceDetail\nRecommendationRelatedCloudWatchMetricsSourceDetail\nRecommendationRelatedEvent\nRecommendationRelatedEventResource\nRecommendationReportDetails\nRecommendationRunId\nRecommendationSet\nRecommendationSettings\nRecommendationSource\nRecommendationStatus\nRecommendationSummaries\nRecommendationSummary\nRecommendationTarget\nRecommendationTemplate\nRecommendationText\nRecommendationTransformerUri\nRecommendationTrigger\nRecommendationType\nRecommendations\nRecommendationsDisplayName\nRecommendationsPerMessage\nRecommendedIntentSummary\nRecommendedNormalizedUnitsToPurchase\nRecommendedNumberOfInstancesToPurchase\nRecommendedOptionProjectedMetric\nRecommendedRuleset\nRecommendedVersion\nRecommender\nRecommenderConfig\nRecommenderConfigurationResponse\nRecommenderId\nRecommenderSummary\nRecommenderUpdateSummary\nReconfigurationType\nReconnectEnabled\nRecord\nRecordActivityTaskHeartbeatInput\nRecordColumn\nRecordColumnDelimiter\nRecordColumnUpdates\nRecordColumns\nRecordData\nRecordDelimiter\nRecordDetail\nRecordDetails\nRecordEncoding\nRecordEncodingUpdate\nRecordError\nRecordErrors\nRecordFormat\nRecordFormatType\nRecordFormatUpdate\nRecordHandlerProgressInput\nRecordId\nRecordIdentifierFeatureName\nRecordIdentifierValueAsString\nRecordIdentifiersValueAsString\nRecordIndex\nRecordIngestionFailures\nRecordLength\nRecordLifecycleActionHeartbeatType\nRecordMarkerDecisionAttributes\nRecordMarkerFailedEventAttributes\nRecordName\nRecordOutput\nRecordOutputs\nRecordPatch\nRecordPatches\nRecordPollingLimit\nRecordPreprocessorSourceUri\nRecordRowDelimiter\nRecordRowPath\nRecordSetId\nRecordSizeKiB\nRecordState\nRecordTag\nRecordTags\nRecordType\nRecordVersion\nRecordWrapperType\nRecordedAt\nRecorderConfig\nRecorderStatus\nRecordingConfiguration\nRecordingConfigurationSummary\nRecordingFileFormat\nRecordingGroup\nRecordingStrategy\nRecordingStreamConfiguration\nRecords\nRecordsEvent\nRecordsIngested\nRecordsProcessed\nRecoveryCheckpoint\nRecoveryGroupArn\nRecoveryGroupName\nRecoveryGroupOutput\nRecoveryGroups\nRecoveryInstance\nRecoveryInstanceDataReplicationError\nRecoveryInstanceDataReplicationInfo\nRecoveryInstanceDataReplicationInfoReplicatedDisk\nRecoveryInstanceDataReplicationInitiation\nRecoveryInstanceDataReplicationInitiationStep\nRecoveryInstanceDisk\nRecoveryInstanceFailback\nRecoveryInstanceProperties\nRecoveryLifeCycle\nRecoveryMechanisms\nRecoveryOptionType\nRecoveryPoint\nRecoveryPointArn\nRecoveryPointByBackupVault\nRecoveryPointByResource\nRecoveryPointCreator\nRecoveryPointMember\nRecoveryPointSelection\nRecoveryPointTags\nRecoveryPoints\nRecoverySnapshot\nRecoveryWindow\nRecoveryWindowInDays\nRecrawlBehavior\nRecrawlPolicy\nRectangle\nRecurrence\nRecurrenceInHours\nRecurrenceMultiplier\nRecurrenceSettings\nRecurringCharge\nRecurringChargeAmount\nRecurringChargeFrequency\nRecurringCharges\nRecurringCount\nRecurringStandardMonthlyCost\nRecurse\nRecursive\nRecursiveDeleteOption\nRecursiveInvocationException\nRecycleBinEnterTime\nRecycleBinExitTime\nRecycleBinFolderId\nRed\nRedPrimaryX\nRedPrimaryY\nRedactChannelMessageRequest\nRedactChannelMessageResponse\nRedactConversationMessageRequest\nRedactRoomMessageRequest\nRedacted\nRedactedEwsAvailabilityProvider\nRedactedFields\nRedactedMediaFileUri\nRedactedTranscriptFileUri\nRedactionConfig\nRedactionOutput\nRedactionType\nRedirect\nRedirectActionConfig\nRedirectAllRequestsTo\nRedirectConfig\nRedirectException\nRedirectLocation\nRedirectSignInURIs\nRedirectSignOutURIs\nRedirectURL\nRedisSettings\nRedshift\nRedshiftConnectorProfileCredentials\nRedshiftConnectorProfileProperties\nRedshiftDataParameters\nRedshiftDataProviderSettings\nRedshiftDataShareAsset\nRedshiftDataShareAssetSourceEntry\nRedshiftDataSpec\nRedshiftDatabase\nRedshiftDatabaseCredentials\nRedshiftDatasetDefinition\nRedshiftDestinationConfiguration\nRedshiftDestinationDescription\nRedshiftDestinationProperties\nRedshiftDestinationUpdate\nRedshiftInstanceDetails\nRedshiftMetadata\nRedshiftParameters\nRedshiftPid\nRedshiftQueryId\nRedshiftRetryOptions\nRedshiftSettings\nRedshiftSource\nRedshiftSourceConfig\nRedshiftTarget\nRedshiftTmpDir\nRedundancyPercent\nRedundantManifest\nReenrollAllCertificateHolders\nRefId\nRefResource\nReference\nReferenceActionName\nReferenceArn\nReferenceData\nReferenceDataSource\nReferenceDataSourceDescription\nReferenceDataSourceDescriptions\nReferenceDataSourceUpdate\nReferenceDataSourceUpdates\nReferenceDataSources\nReferenceDoesNotExistException\nReferenceFiles\nReferenceFilter\nReferenceId\nReferenceImage\nReferenceLine\nReferenceLineCustomLabelConfiguration\nReferenceLineDataConfiguration\nReferenceLineDynamicDataConfiguration\nReferenceLineLabelConfiguration\nReferenceLineStaticDataConfiguration\nReferenceLineStyleConfiguration\nReferenceLineValueLabelConfiguration\nReferenceLines\nReferenceListItem\nReferenceMetric\nReferenceNameRequiredException\nReferencePath\nReferencePredictorArn\nReferencePredictorSummary\nReferenceRoleARN\nReferenceRoleARNUpdate\nReferenceScalar\nReferenceSchema\nReferenceSchemaUpdate\nReferenceSets\nReferenceStoreDetail\nReferenceStoreFilter\nReferenceSummaryList\nReferenceTypeNotSupportedException\nReferenceTypes\nReferenceUrls\nReferencedBy\nReferencedByResources\nReferencedGroupId\nReferencedGroupInfo\nReferencedImageDetail\nReferencedImagesNotFoundException\nReferencedSecurityGroup\nReferences\nReferencingVpcId\nReferrerPolicy\nRefresh\nRefreshArn\nRefreshCacheInput\nRefreshCacheOutput\nRefreshClosedReports\nRefreshConfiguration\nRefreshDetails\nRefreshFrequency\nRefreshId\nRefreshOnDay\nRefreshOnSegmentUpdate\nRefreshPreferences\nRefreshSchedule\nRefreshSchedules\nRefreshSchemasMessage\nRefreshSchemasResponse\nRefreshSchemasStatus\nRefreshStatisticsIdMap\nRefreshStatus\nRefreshToken\nRefreshTokenExpiration\nRefreshTokenRequest\nRefreshTokenRequestBody\nRefreshTokenResponse\nRefreshTokenValidity\nRefreshTrustedAdvisorCheckRequest\nRefreshTrustedAdvisorCheckResponse\nRefreshType\nRefreshedAt\nRegParamsRevision\nRegenerateSecurityTokenRequest\nRegenerateSecurityTokenResponse\nRegex\nRegexMatchSet\nRegexMatchSetId\nRegexMatchSetSummary\nRegexMatchSetUpdate\nRegexMatchSets\nRegexMatchStatement\nRegexMatchTuple\nRegexMatchTuples\nRegexPatternSet\nRegexPatternSetId\nRegexPatternSetReferenceStatement\nRegexPatternSetSummary\nRegexPatternSetUpdate\nRegexPatternSets\nRegexPatternString\nRegexPatternStrings\nRegexString\nRegion\nRegionCode\nRegionConcurrencyType\nRegionDescription\nRegionDisabledException\nRegionFilters\nRegionIdentifier\nRegionInfo\nRegionLimitExceededException\nRegionLinkingMode\nRegionMapInputValue\nRegionName\nRegionNames\nRegionOfInterest\nRegionOptStatus\nRegionOptStatusContains\nRegionOrder\nRegionReport\nRegionScope\nRegionType\nRegionalBucket\nRegionalBucketList\nRegionalConfiguration\nRegionalConfigurations\nRegions\nRegionsDescription\nRegionsInfo\nRegionsOfInterest\nRegionsOfInterestForUpdate\nRegisterAVSDeviceRequest\nRegisterAVSDeviceResponse\nRegisterAccountRequest\nRegisterAccountResponse\nRegisterActivityTypeInput\nRegisterAgentRequest\nRegisterAgentResponse\nRegisterAppInstanceUserEndpointRequest\nRegisterAppInstanceUserEndpointResponse\nRegisterApplicationInput\nRegisterApplicationOutput\nRegisterApplicationRevisionInput\nRegisterCACertificateRequest\nRegisterCACertificateResponse\nRegisterCertificateRequest\nRegisterCertificateResponse\nRegisterCertificateResult\nRegisterCertificateWithoutCARequest\nRegisterCertificateWithoutCAResponse\nRegisterClientRequest\nRegisterClientResponse\nRegisterClusterRequest\nRegisterClusterResponse\nRegisterComputeInput\nRegisterComputeOutput\nRegisterConnectorRequest\nRegisterConnectorResponse\nRegisterContainerImageRequest\nRegisterContainerImageResult\nRegisterContainerInstanceRequest\nRegisterContainerInstanceResponse\nRegisterCrossAccountAccessRoleRequest\nRegisterDBProxyTargetsRequest\nRegisterDBProxyTargetsResponse\nRegisterDataLakeDelegatedAdministratorRequest\nRegisterDefaultPatchBaselineRequest\nRegisterDefaultPatchBaselineResult\nRegisterDelegatedAdministratorRequest\nRegisterDeviceRequest\nRegisterDeviceResponse\nRegisterDevicesRequest\nRegisterDomainInput\nRegisterDomainRequest\nRegisterDomainResponse\nRegisterEcsClusterRequest\nRegisterEcsClusterResult\nRegisterElasticIpRequest\nRegisterElasticIpResult\nRegisterEndPointsInput\nRegisterEndPointsOutput\nRegisterEndpoints\nRegisterEventTopicRequest\nRegisterGameServerInput\nRegisterGameServerOutput\nRegisterIdentityProviderRequest\nRegisterIdentityProviderResponse\nRegisterImageRequest\nRegisterImageResult\nRegisterInstanceEventNotificationAttributesRequest\nRegisterInstanceEventNotificationAttributesResult\nRegisterInstanceRequest\nRegisterInstanceResponse\nRegisterInstanceResult\nRegisterInstanceTagAttributeRequest\nRegisterJobDefinitionRequest\nRegisterJobDefinitionResponse\nRegisterMailDomainRequest\nRegisterModel\nRegisterModelStepMetadata\nRegisterNewBaseline\nRegisterOnPremisesInstanceInput\nRegisterOrganizationAdminAccountRequest\nRegisterOrganizationAdminAccountResponse\nRegisterOrganizationDelegatedAdminRequest\nRegisterPackageVersionRequest\nRegisterPatchBaselineForPatchGroupRequest\nRegisterPatchBaselineForPatchGroupResult\nRegisterPublisherInput\nRegisterPublisherOutput\nRegisterRdsDbInstanceRequest\nRegisterResourceRequest\nRegisterRobotRequest\nRegisterRobotResponse\nRegisterScalableTargetRequest\nRegisterScalableTargetResponse\nRegisterSchemaVersionInput\nRegisterSchemaVersionResponse\nRegisterSlackWorkspaceForOrganizationRequest\nRegisterSlackWorkspaceForOrganizationResult\nRegisterStreamConsumerInput\nRegisterStreamConsumerOutput\nRegisterTargetWithMaintenanceWindowRequest\nRegisterTargetWithMaintenanceWindowResult\nRegisterTargetsInput\nRegisterTargetsRequest\nRegisterTargetsResponse\nRegisterTaskDefinitionRequest\nRegisterTaskDefinitionResponse\nRegisterTaskWithMaintenanceWindowRequest\nRegisterTaskWithMaintenanceWindowResult\nRegisterThingRequest\nRegisterThingResponse\nRegisterToWorkMailRequest\nRegisterTransitGatewayMulticastGroupMembersRequest\nRegisterTransitGatewayMulticastGroupMembersResult\nRegisterTransitGatewayMulticastGroupSourcesRequest\nRegisterTransitGatewayMulticastGroupSourcesResult\nRegisterTransitGatewayRequest\nRegisterTransitGatewayResponse\nRegisterTypeInput\nRegisterTypeOutput\nRegisterUsageRequest\nRegisterUsageResult\nRegisterUserRequest\nRegisterUserResponse\nRegisterVolumeRequest\nRegisterVolumeResult\nRegisterWebhookWithThirdPartyInput\nRegisterWorkflowTypeInput\nRegisterWorkspaceDirectoryRequest\nRegistered\nRegisteredAt\nRegisteredBy\nRegisteredContainerInstancesCount\nRegisteredDate\nRegisteredDateTime\nRegisteredDeviceCount\nRegisteredDomainDelegationInfo\nRegisteredGatewayArn\nRegisteredId\nRegisteredMulticastGroupMembers\nRegisteredMulticastGroupSources\nRegisteredNetworkInterfaceIds\nRegisteredOn\nRegisteredTime\nRegisteredUserConsoleFeatureConfigurations\nRegisteredUserDashboardEmbeddingConfiguration\nRegisteredUserDashboardFeatureConfigurations\nRegisteredUserDashboardVisualEmbeddingConfiguration\nRegisteredUserEmbeddingExperienceConfiguration\nRegisteredUserQSearchBarEmbeddingConfiguration\nRegisteredUserQuickSightConsoleEmbeddingConfiguration\nRegistering\nRegistrantContact\nRegistrantPrivacy\nRegistrarName\nRegistrarUrl\nRegistrationCode\nRegistrationCodeValidationException\nRegistrationConfig\nRegistrationDate\nRegistrationId\nRegistrationLimit\nRegistrationMetadata\nRegistrationMetadataItem\nRegistrationOutput\nRegistrationPagePath\nRegistrationPrice\nRegistrationStatusFilter\nRegistrationTime\nRegistrationToken\nRegistrationTokenList\nRegistrationZone\nRegistrationsCount\nRegistries\nRegistry\nRegistryAlias\nRegistryArn\nRegistryCatalogData\nRegistryCredential\nRegistryDomainId\nRegistryId\nRegistryListItem\nRegistryName\nRegistryNamePrefix\nRegistryNotFoundException\nRegistryPolicyNotFoundException\nRegistryScanningConfiguration\nRegistryScanningRule\nRegistrySummary\nRegularExpressionList\nRehydrationType\nReimportApiRequest\nReimportApiResponse\nRejectAssignmentRequest\nRejectAttachmentRequest\nRejectAttachmentResponse\nRejectCertificateTransferRequest\nRejectClientVpcConnectionRequest\nRejectDataShareMessage\nRejectDomainTransferFromAnotherAwsAccountRequest\nRejectDomainTransferFromAnotherAwsAccountResponse\nRejectEnvironmentAccountConnectionInput\nRejectEnvironmentAccountConnectionOutput\nRejectGrantRequest\nRejectGrantResponse\nRejectInboundConnectionRequest\nRejectInboundConnectionResponse\nRejectInboundCrossClusterSearchConnectionRequest\nRejectInboundCrossClusterSearchConnectionResponse\nRejectInputDeviceTransferRequest\nRejectInvitationInput\nRejectInvitationRequest\nRejectPortfolioShareInput\nRejectQualificationRequestRequest\nRejectResourceShareInvitationRequest\nRejectResourceShareInvitationResponse\nRejectSharedDirectoryRequest\nRejectSharedDirectoryResult\nRejectSkillRequest\nRejectTransitGatewayMulticastDomainAssociationsRequest\nRejectTransitGatewayMulticastDomainAssociationsResult\nRejectTransitGatewayPeeringAttachmentRequest\nRejectTransitGatewayPeeringAttachmentResult\nRejectTransitGatewayVpcAttachmentRequest\nRejectTransitGatewayVpcAttachmentResult\nRejectVpcEndpointConnectionsRequest\nRejectVpcEndpointConnectionsResult\nRejectVpcPeeringConnectionRequest\nRejectVpcPeeringConnectionResult\nRejectedLogEventsInfo\nRejectedPatches\nRejectedPatchesAction\nRejectedRecord\nRejectedRecords\nRejectedRecordsException\nRejectionTime\nRejects\nRekeyFuzzPercentage\nRekeyMarginTimeSeconds\nRelatedAnomalies\nRelatedColumnName\nRelatedContactId\nRelatedDeployments\nRelatedEvents\nRelatedFinding\nRelatedFindings\nRelatedFindingsId\nRelatedFindingsProductArn\nRelatedItem\nRelatedItemEventIncludedData\nRelatedObservations\nRelatedOpsItem\nRelatedOpsItems\nRelatedRequirements\nRelatedResource\nRelatedResourceArns\nRelatedVulnerabilities\nRelatedWorkspaceProperties\nRelatedWorkspaces\nRelationType\nRelationalCatalogSource\nRelationalDatabase\nRelationalDatabaseBlueprint\nRelationalDatabaseBundle\nRelationalDatabaseDataSourceConfig\nRelationalDatabaseEndpoint\nRelationalDatabaseEvent\nRelationalDatabaseHardware\nRelationalDatabaseParameter\nRelationalDatabaseSnapshot\nRelationalTable\nRelationship\nRelationshipScore\nRelationshipStatus\nRelationshipType\nRelationshipTypeFilter\nRelationshipValue\nRelationships\nRelationshipsListItem\nRelative\nRelativeAggregationDuration\nRelativeDateFilter\nRelativeDateFilterFunction\nRelativeDateTime\nRelativeDateTimeControlDisplayOptions\nRelativeDateType\nRelativeDateValue\nRelativeDatesFilter\nRelativePath\nRelativePosition\nRelativeProgram\nRelativeTimeRange\nRelayState\nRelayStateParameterName\nRelease\nReleaseAddressRequest\nReleaseAfterMinutes\nReleaseAgentPath\nReleaseConfiguration\nReleaseDate\nReleaseFileSystemNfsV3LocksRequest\nReleaseFileSystemNfsV3LocksResponse\nReleaseHostsRequest\nReleaseHostsResult\nReleaseIpamPoolAllocationRequest\nReleaseIpamPoolAllocationResult\nReleaseLabel\nReleaseLabelFilter\nReleaseLabels\nReleaseNotes\nReleasePhoneNumberRequest\nReleasePhoneNumberResult\nReleaseStaticIpRequest\nReleaseStaticIpResult\nReleaseStatus\nReleaseSummaries\nReleaseSummary\nReleaseTime\nReleaseVersion\nReleasedCapacity\nRelevance\nRelevanceFeedback\nRelevanceFeedbackItems\nRelevanceValue\nReloadOption\nReloadReplicationTablesMessage\nReloadReplicationTablesResponse\nReloadTablesMessage\nReloadTablesResponse\nRemainingCount\nRemainingLife\nRemainingTotalValue\nRemainingUpfrontValue\nRemarks\nRemediation\nRemediationAction\nRemediationActionType\nRemediationActionWithOrder\nRemediationConfiguration\nRemediationConfigurations\nRemediationEnabled\nRemediationException\nRemediationExceptionResourceKey\nRemediationExceptions\nRemediationExecutionStatus\nRemediationExecutionStatuses\nRemediationExecutionStep\nRemediationInProgressException\nRemediationParameterValue\nRemediationRecommendation\nRemediationResult\nRemediationUrl\nReminderAtMinutes\nReminderType\nRemixSettings\nRemote\nRemoteAccessConfig\nRemoteAccessSession\nRemoteAccountDetails\nRemoteAdministrationEndpoint\nRemoteDirectoryPath\nRemoteDomainInfo\nRemoteDomainName\nRemoteDomainNames\nRemoteId\nRemoteIpDetails\nRemoteIpv4NetworkCidr\nRemoteIpv6NetworkCidr\nRemoteManagement\nRemoteMta\nRemotePortDetails\nRemoteSourceCodeAnalysisServerInfo\nRemoteSources\nRemovals\nRemove\nRemoveAccountFromOrganizationRequest\nRemoveAclConfiguration\nRemoveAction\nRemoveAllBackendsRequest\nRemoveAllBackendsResponse\nRemoveAllPermissions\nRemoveAllResourcePermissionsRequest\nRemoveAllocationResourceTags\nRemoveAllowedPrincipals\nRemoveApplicationInstanceRequest\nRemoveAttributesActivity\nRemoveAttributesFromFindingsRequest\nRemoveAttributesFromFindingsResponse\nRemoveAttributesRequest\nRemoveAttributesResponse\nRemoveAutoScalingPolicyInput\nRemoveAutoTerminationPolicyInput\nRemoveAvailabilityZonesInput\nRemoveAvailabilityZonesOutput\nRemoveBackendConfigRequest\nRemoveBackendConfigResponse\nRemoveBridgeOutputRequest\nRemoveBridgeOutputResponse\nRemoveBridgeSourceRequest\nRemoveBridgeSourceResponse\nRemoveBytesScannedCutoffPerQuery\nRemoveClientIDFromOpenIDConnectProviderRequest\nRemoveCustomRoutingEndpointsRequest\nRemoveCustomerContentEncryptionConfiguration\nRemoveCustomerOverride\nRemoveDraftAppVersionResourceMappingsRequest\nRemoveDraftAppVersionResourceMappingsResponse\nRemoveEncryptionConfiguration\nRemoveEndDate\nRemoveEndpointsRequest\nRemoveEntries\nRemoveExpectedBucketOwner\nRemoveFacetFromObject\nRemoveFacetFromObjectRequest\nRemoveFields\nRemoveFlowMediaStreamRequest\nRemoveFlowMediaStreamResponse\nRemoveFlowOutputRequest\nRemoveFlowOutputResponse\nRemoveFlowSourceRequest\nRemoveFlowSourceResponse\nRemoveFlowVpcInterfaceRequest\nRemoveFlowVpcInterfaceResponse\nRemoveFromGlobalClusterMessage\nRemoveFromGlobalClusterResult\nRemoveFromVersionId\nRemoveGatewayLoadBalancerArns\nRemoveHeadersConfig\nRemoveIamRoles\nRemoveInvalidCertificateFromPersonalStore\nRemoveIpRoutesRequest\nRemoveIpamOperatingRegion\nRemoveKnowledgeBaseTemplateUriRequest\nRemoveLFTagsFromResourceRequest\nRemoveLFTagsFromResourceResponse\nRemoveLayerVersionPermissionRequest\nRemoveLicenseSpecifications\nRemoveListenerCertificatesInput\nRemoveManagedScalingPolicyInput\nRemoveNetworkLoadBalancerArns\nRemoveNetworkServices\nRemoveNotificationChannelRequest\nRemoveNotificationChannelResponse\nRemoveOperatingRegions\nRemoveOutputLocation\nRemovePermissionInput\nRemovePermissionRequest\nRemovePermissionResponse\nRemovePrefixListEntry\nRemovePrivateDnsName\nRemoveProfilePermissionRequest\nRemoveProfilePermissionResponse\nRemoveQuotes\nRemoveRegionRequest\nRemoveRegionsFromReplicationRequest\nRemoveRegionsFromReplicationResponse\nRemoveReplicaRegions\nRemoveResourcePermissionRequest\nRemoveRoleFromDBClusterMessage\nRemoveRoleFromDBInstanceMessage\nRemoveRoleFromInstanceProfileRequest\nRemoveRouteTableIds\nRemoveSNSTopic\nRemoveSchemaVersionMetadataInput\nRemoveSchemaVersionMetadataResponse\nRemoveSecurityGroupIds\nRemoveSourceIdentifierFromSubscriptionMessage\nRemoveSourceIdentifierFromSubscriptionResult\nRemoveSourceServerActionRequest\nRemoveStorageSystemRequest\nRemoveSubnetArns\nRemoveSubnetIds\nRemoveSubnets\nRemoveSupportedIpAddressTypes\nRemoveTagKeys\nRemoveTags\nRemoveTagsFromCertificateRequest\nRemoveTagsFromOnPremisesInstancesInput\nRemoveTagsFromResourceInput\nRemoveTagsFromResourceMessage\nRemoveTagsFromResourceOutput\nRemoveTagsFromResourceRequest\nRemoveTagsFromResourceResponse\nRemoveTagsFromStreamInput\nRemoveTagsFromVaultInput\nRemoveTagsInput\nRemoveTagsRequest\nRemoveTargetsRequest\nRemoveTargetsResponse\nRemoveTargetsResultEntry\nRemoveTemplateActionRequest\nRemoveThingFromBillingGroupRequest\nRemoveThingFromThingGroupRequest\nRemoveTransitGatewayCidrBlocks\nRemoveUserFromGroupRequest\nRemoveUserGroups\nRemoveWorkloadRequest\nRemovedLabels\nRenameColumnOperation\nRenameField\nRenderUiTemplateRequest\nRenderUiTemplateResponse\nRenderableTask\nRenderedContent\nRenderedTemplate\nRenderingConfiguration\nRenderingEngine\nRenderingError\nRenderingRules\nRenditionConfiguration\nRenditionGroupId\nRenditionLanguageCode\nRenditionName\nRenewCertificateRequest\nRenewDomainRequest\nRenewDomainResponse\nRenewOfferingRequest\nRenewOfferingResult\nRenewType\nRenewalCount\nRenewalEligibility\nRenewalPeriod\nRenewalPrice\nRenewalSettings\nRenewalStatus\nRenewalStatusReason\nRenewalSummary\nRenewalType\nReorderReceiptRuleSetRequest\nRepInterval\nRepeatAt\nRepeatExtXKey\nRepeatFrameMsec\nRepeatPps\nReplace\nReplaceAllLabels\nReplaceChars\nReplaceContentEntry\nReplaceDefaultPolicyVersionParams\nReplaceIamInstanceProfileAssociationRequest\nReplaceIamInstanceProfileAssociationResult\nReplaceInvalidChars\nReplaceKeyPrefixWith\nReplaceKeyWith\nReplaceNetworkAclAssociationRequest\nReplaceNetworkAclAssociationResult\nReplaceNetworkAclEntryRequest\nReplacePathPrefix\nReplacePermissionAssociationsRequest\nReplacePermissionAssociationsResponse\nReplacePermissionAssociationsWork\nReplaceRootVolumeTask\nReplaceRootVolumeTaskId\nReplaceRootVolumeTaskIds\nReplaceRootVolumeTasks\nReplaceRouteRequest\nReplaceRouteTableAssociationRequest\nReplaceRouteTableAssociationResult\nReplaceTopicRuleRequest\nReplaceTransitGatewayRouteRequest\nReplaceTransitGatewayRouteResult\nReplaceUnhealthyInstances\nReplaceVpnTunnelRequest\nReplaceVpnTunnelResult\nReplacement\nReplacementContentRequiredException\nReplacementEmailContent\nReplacementJob\nReplacementStrategy\nReplacementTags\nReplacementTemplate\nReplacementTemplateData\nReplacementTypeRequiredException\nReplay\nReplayArn\nReplayDestination\nReplayEndTime\nReplayName\nReplayStartTime\nReplayWindowSize\nReplays\nReplica\nReplicaAlias\nReplicaAlreadyExistsException\nReplicaAutoScalingDescription\nReplicaAutoScalingUpdate\nReplicaAvailabilityZones\nReplicaBillingModeSummary\nReplicaConfiguration\nReplicaConfigurationRequest\nReplicaCount\nReplicaDescription\nReplicaGlobalSecondaryIndex\nReplicaGlobalSecondaryIndexAutoScalingDescription\nReplicaGlobalSecondaryIndexAutoScalingUpdate\nReplicaGlobalSecondaryIndexDescription\nReplicaGlobalSecondaryIndexSettings\nReplicaGlobalSecondaryIndexSettingsDescription\nReplicaGlobalSecondaryIndexSettingsUpdate\nReplicaGlobalSecondaryIndexUpdates\nReplicaInaccessibleDateTime\nReplicaKeyMetadata\nReplicaKeys\nReplicaKmsKeyID\nReplicaMode\nReplicaModifications\nReplicaNotFoundException\nReplicaOutpostArns\nReplicaPolicy\nReplicaProvisionedReadCapacityAutoScalingSettings\nReplicaProvisionedReadCapacityAutoScalingSettingsUpdate\nReplicaProvisionedReadCapacityAutoScalingUpdate\nReplicaProvisionedReadCapacityUnits\nReplicaProvisionedWriteCapacityAutoScalingSettings\nReplicaProvisionedWriteCapacityUnits\nReplicaRegion\nReplicaRegionType\nReplicaSettings\nReplicaSettingsDescription\nReplicaSettingsUpdate\nReplicaStatus\nReplicaStatusDescription\nReplicaStatusPercentProgress\nReplicaTableClass\nReplicaTableClassSummary\nReplicaTags\nReplicaUpdate\nReplicaUpdates\nReplicas\nReplicasPerNodeGroup\nReplicasToRemove\nReplicateInstanceRequest\nReplicateInstanceResponse\nReplicateKeyRequest\nReplicateKeyResponse\nReplicateSecretToRegionsRequest\nReplicateSecretToRegionsResponse\nReplicateShardCollections\nReplicateTo\nReplicatingFrom\nReplicatingTo\nReplication\nReplicationConfig\nReplicationConfigArn\nReplicationConfigCreateTime\nReplicationConfigIdentifier\nReplicationConfigUpdateTime\nReplicationConfigs\nReplicationConfiguration\nReplicationConfigurationDescription\nReplicationConfigurationReplicatedDisk\nReplicationConfigurationTemplate\nReplicationCreateTime\nReplicationDestination\nReplicationDetails\nReplicationFactor\nReplicationGroup\nReplicationGroupAlreadyExistsFault\nReplicationGroupAlreadyUnderMigrationFault\nReplicationGroupCreateTime\nReplicationGroupDescription\nReplicationGroupId\nReplicationGroupIds\nReplicationGroupLogDeliveryEnabled\nReplicationGroupMessage\nReplicationGroupNotFoundFault\nReplicationGroupNotUnderMigrationFault\nReplicationGroupPendingModifiedValues\nReplicationGroupRegion\nReplicationGroupUpdate\nReplicationGroups\nReplicationInstance\nReplicationInstanceArn\nReplicationInstanceClass\nReplicationInstanceEngineMinimumVersion\nReplicationInstanceIdentifier\nReplicationInstanceIpv6Addresses\nReplicationInstancePrivateIpAddress\nReplicationInstancePrivateIpAddresses\nReplicationInstancePublicIpAddress\nReplicationInstancePublicIpAddresses\nReplicationInstanceStatus\nReplicationInstanceTaskLog\nReplicationInstanceTaskLogSize\nReplicationInstanceTaskLogs\nReplicationInstances\nReplicationJob\nReplicationJobAlreadyExistsException\nReplicationJobNotFoundException\nReplicationLastStopTime\nReplicationNotFound\nReplicationPendingModifiedValues\nReplicationRule\nReplicationRuleAndOperator\nReplicationRuleFilter\nReplicationRun\nReplicationRunLimitExceededException\nReplicationRunStageDetails\nReplicationScope\nReplicationSet\nReplicationSettings\nReplicationSourceIdentifier\nReplicationSpecification\nReplicationStats\nReplicationStatus\nReplicationStatusType\nReplicationSubnetGroup\nReplicationSubnetGroupDescription\nReplicationSubnetGroupDoesNotCoverEnoughAZs\nReplicationSubnetGroupId\nReplicationSubnetGroupIdentifier\nReplicationSubnetGroups\nReplicationTableStatistics\nReplicationTask\nReplicationTaskArn\nReplicationTaskAssessmentResult\nReplicationTaskAssessmentResults\nReplicationTaskAssessmentRun\nReplicationTaskAssessmentRunArn\nReplicationTaskAssessmentRunCreationDate\nReplicationTaskAssessmentRunProgress\nReplicationTaskAssessmentRuns\nReplicationTaskCreationDate\nReplicationTaskIdentifier\nReplicationTaskIndividualAssessment\nReplicationTaskIndividualAssessmentArn\nReplicationTaskIndividualAssessmentStartDate\nReplicationTaskIndividualAssessments\nReplicationTaskLastAssessmentDate\nReplicationTaskName\nReplicationTaskSettings\nReplicationTaskStartDate\nReplicationTaskStats\nReplicationTasks\nReplicationTime\nReplicationTimeValue\nReplicationType\nReplicationUpdateTime\nReplicationUser\nReplications\nReplyTo\nReplyToAddresses\nReplyToEmailAddress\nRepoPrefixLocation\nRepoUpgradeOnBoot\nReport\nReportConfiguration\nReportContext\nReportCreatorAccount\nReportDefinition\nReportDefinitions\nReportDeliveryChannel\nReportDestination\nReportDestinationS3\nReportDevStatusBattery\nReportDevStatusMargin\nReportExportConfig\nReportFilter\nReportFormat\nReportFrequency\nReportGenerated\nReportGenerationLimitExceededException\nReportGenerator\nReportGeneratorName\nReportGenerators\nReportGroup\nReportGroupTrendStats\nReportId\nReportInstanceStatusRequest\nReportJob\nReportJobId\nReportJobs\nReportLevel\nReportLimitReachedException\nReportName\nReportOverride\nReportOverrides\nReportPlan\nReportPlanArn\nReportPlanDescription\nReportPlanName\nReportPlanTags\nReportPlans\nReportResult\nReportS3Configuration\nReportScope\nReportSetting\nReportTaskProgressInput\nReportTaskProgressOutput\nReportTaskRunnerHeartbeatInput\nReportTaskRunnerHeartbeatOutput\nReportTemplate\nReportType\nReportUri\nReportVersioning\nReportWithRawData\nReportedAgentVersion\nReportedName\nReportedOs\nReportedRuntimeContextState\nReportedVersion\nReportingMta\nRepository\nRepositoryAccessMode\nRepositoryAggregation\nRepositoryAggregationResponse\nRepositoryAlreadyExistsException\nRepositoryAnalysis\nRepositoryAssociation\nRepositoryAssociationArn\nRepositoryAssociationSummaries\nRepositoryAssociationSummary\nRepositoryAuthConfig\nRepositoryBranch\nRepositoryBranchInput\nRepositoryCatalogData\nRepositoryCatalogDataInput\nRepositoryCatalogDataNotFoundException\nRepositoryCredentials\nRepositoryCredentialsProviderArn\nRepositoryDescription\nRepositoryDoesNotExistException\nRepositoryExternalConnectionInfo\nRepositoryFilter\nRepositoryHead\nRepositoryHeadSourceCodeType\nRepositoryInput\nRepositoryLimitExceededException\nRepositoryMetadata\nRepositoryName\nRepositoryNameExistsException\nRepositoryNameIdPair\nRepositoryNameRequiredException\nRepositoryNames\nRepositoryNamesRequiredException\nRepositoryNotAssociatedWithPullRequestException\nRepositoryNotEmptyException\nRepositoryNotFoundException\nRepositoryOwner\nRepositoryPolicyNotFoundException\nRepositoryPolicyText\nRepositoryScanningConfiguration\nRepositoryScanningConfigurationFailure\nRepositorySummary\nRepositorySyncAttempt\nRepositorySyncDefinition\nRepositorySyncEvent\nRepositoryTrigger\nRepositoryTriggerBranchNameListRequiredException\nRepositoryTriggerDestinationArnRequiredException\nRepositoryTriggerEventsListRequiredException\nRepositoryTriggerExecutionFailure\nRepositoryTriggerNameRequiredException\nRepositoryTriggersListRequiredException\nRepositoryType\nRepositoryUrl\nReprocessingSummary\nRepublishAction\nReputationMetricsEnabled\nReputationOptions\nRequest\nRequestAlreadyInProgressException\nRequestAlreadyProcessedException\nRequestBody\nRequestBodyAssociatedResourceTypeConfig\nRequestCancelActivityTaskDecisionAttributes\nRequestCancelActivityTaskFailedEventAttributes\nRequestCancelExternalWorkflowExecutionDecisionAttributes\nRequestCancelExternalWorkflowExecutionFailedEventAttributes\nRequestCancelExternalWorkflowExecutionInitiatedEventAttributes\nRequestCancelWorkflowExecutionInput\nRequestCertificateRequest\nRequestCertificateResponse\nRequestChangedException\nRequestCharacters\nRequestCharged\nRequestCompletionTime\nRequestConfiguration\nRequestCount\nRequestDetailedStatus\nRequestDetails\nRequestEntityTooLargeException\nRequestEntry\nRequestEnvironmentInfoMessage\nRequestError\nRequestFailedException\nRequestFilterPortRange\nRequestHeaders\nRequestHeadersInserted\nRequestID\nRequestId\nRequestIdentifier\nRequestImpactStatistics\nRequestInProgressException\nRequestInspection\nRequestInspectionACFP\nRequestInterval\nRequestIpamResourceTag\nRequestItems\nRequestLaunchTemplateData\nRequestLimitExceeded\nRequestLimitExceededException\nRequestMetadata\nRequestModels\nRequestOrigin\nRequestOutputItem\nRequestParameterKey\nRequestParameters\nRequestPayer\nRequestPaymentConfiguration\nRequestPhoneNumberRequest\nRequestPhoneNumberResult\nRequestProgress\nRequestResponses\nRequestRoute\nRequestServiceQuotaIncreaseRequest\nRequestServiceQuotaIncreaseResponse\nRequestSource\nRequestSpotFleetRequest\nRequestSpotFleetResponse\nRequestSpotInstancesRequest\nRequestSpotInstancesResult\nRequestSpotLaunchSpecification\nRequestStatus\nRequestStatusMessage\nRequestTTLSeconds\nRequestTemplates\nRequestThrottledException\nRequestTime\nRequestTimeoutException\nRequestTimeoutSeconds\nRequestToken\nRequestTokenARN\nRequestTokenNotFoundException\nRequestTooLargeException\nRequestType\nRequestUploadCredentialsInput\nRequestUploadCredentialsOutput\nRequestUri\nRequestValidator\nRequestValidators\nRequested\nRequestedAmiVersion\nRequestedColumns\nRequestedDateTime\nRequestedDimensions\nRequestedDocumentAttributes\nRequestedEc2AvailabilityZones\nRequestedEc2SubnetIds\nRequestedEntityTooLargeException\nRequestedInstanceCount\nRequestedJobStatus\nRequestedProvisionedConcurrentExecutions\nRequestedQuota\nRequestedQuotas\nRequestedRangeNotSatisfiableException\nRequestedServiceQuotaChange\nRequestedTime\nRequestedTimestamp\nRequestedValue\nRequester\nRequesterAccountId\nRequesterAnnotation\nRequesterAwsRegion\nRequesterCharged\nRequesterFeedback\nRequesterId\nRequesterManaged\nRequesterPays\nRequesterPaysEnabled\nRequesterPeeringConnectionOptions\nRequesterTgwInfo\nRequesterVpcInfo\nRequests\nRequestsPerSecond\nRequireAlternateSignatureAlgorithm\nRequireAuthorizationForCacheControl\nRequireCheckIn\nRequireCommonName\nRequireDirectoryPath\nRequireDnsAsCn\nRequireEachIncludedType\nRequireEmail\nRequireEncryption\nRequireHibernateSupport\nRequireLowercase\nRequireLowercaseCharacters\nRequireNumbers\nRequirePin\nRequireSameKeyRenewal\nRequireSymbols\nRequireTLS\nRequireType\nRequireUppercase\nRequireUppercaseCharacters\nRequired\nRequiredActivatedType\nRequiredActivatedTypes\nRequiredBehavior\nRequiredCapabilities\nRequiredEquipmentTypes\nRequiredField\nRequiredFieldInfo\nRequiredFields\nRequiredMinimumPollIntervalInSeconds\nRequiredParameters\nRequiredSignUpAttributes\nRequiredTenancy\nRequiredToPreview\nRequirement\nRequirementsS3ObjectVersion\nRequirementsS3Path\nRequirementsToTarget\nRequires\nRequiresAutoMinorEngineVersionUpgrade\nRequiresCompatibilities\nRequiresIndexDocuments\nRequiresRecreation\nResamplingConfigInput\nRescoreCapacityUnits\nRescoreExecutionPlanId\nRescoreExecutionPlanSummary\nRescoreId\nRescoreRequest\nRescoreResult\nRescoreResultItem\nReseller\nResendConfirmationCodeRequest\nResendConfirmationCodeResponse\nResendContactReachabilityEmailRequest\nResendContactReachabilityEmailResponse\nResendOperationAuthorizationRequest\nResendValidationEmailRequest\nReservation\nReservationARN\nReservationAggregates\nReservationArn\nReservationCoverageGroup\nReservationCoveredHoursInLookbackPeriod\nReservationFleetInstanceSpecification\nReservationId\nReservationName\nReservationPlan\nReservationPlanSettings\nReservationPurchaseRecommendation\nReservationPurchaseRecommendationDetail\nReservationPurchaseRecommendationMetadata\nReservationPurchaseRecommendationSummary\nReservationResourceSpecification\nReservationState\nReservationType\nReservationUtilizationGroup\nReservationValue\nReservations\nReserveContactRequest\nReserveRange\nReserved\nReservedBitrate\nReservedCacheNode\nReservedCacheNodeAlreadyExistsFault\nReservedCacheNodeId\nReservedCacheNodeMessage\nReservedCacheNodeNotFoundFault\nReservedCacheNodeQuotaExceededFault\nReservedCacheNodes\nReservedCacheNodesOffering\nReservedCacheNodesOfferingId\nReservedCacheNodesOfferingMessage\nReservedCacheNodesOfferingNotFoundFault\nReservedCacheNodesOfferings\nReservedConcurrentExecutions\nReservedDBInstance\nReservedDBInstanceAlreadyExistsFault\nReservedDBInstanceArn\nReservedDBInstanceId\nReservedDBInstanceMessage\nReservedDBInstanceNotFoundFault\nReservedDBInstanceQuotaExceededFault\nReservedDBInstances\nReservedDBInstancesOffering\nReservedDBInstancesOfferingId\nReservedDBInstancesOfferingMessage\nReservedDBInstancesOfferingNotFoundFault\nReservedDBInstancesOfferings\nReservedElasticsearchInstance\nReservedElasticsearchInstanceId\nReservedElasticsearchInstanceOffering\nReservedElasticsearchInstanceOfferingId\nReservedElasticsearchInstanceOfferings\nReservedElasticsearchInstances\nReservedHours\nReservedInstance\nReservedInstanceId\nReservedInstanceIds\nReservedInstanceLimitPrice\nReservedInstanceOffering\nReservedInstanceOfferingId\nReservedInstanceOfferings\nReservedInstanceOptions\nReservedInstanceReservationValue\nReservedInstanceValueRollup\nReservedInstanceValueSet\nReservedInstances\nReservedInstancesConfiguration\nReservedInstancesId\nReservedInstancesIds\nReservedInstancesListing\nReservedInstancesListingId\nReservedInstancesListings\nReservedInstancesModification\nReservedInstancesModificationId\nReservedInstancesModificationIds\nReservedInstancesModificationResult\nReservedInstancesModifications\nReservedInstancesOffering\nReservedInstancesOfferingId\nReservedInstancesOfferingIds\nReservedInstancesOfferings\nReservedNameException\nReservedNode\nReservedNodeAlreadyExistsFault\nReservedNodeAlreadyMigratedFault\nReservedNodeConfigurationOption\nReservedNodeConfigurationOptionList\nReservedNodeExchangeNotFoundFault\nReservedNodeExchangeRequestId\nReservedNodeExchangeStatus\nReservedNodeExchangeStatusDetails\nReservedNodeId\nReservedNodeNotFoundFault\nReservedNodeOffering\nReservedNodeOfferingId\nReservedNodeOfferingNotFoundFault\nReservedNodeOfferingType\nReservedNodeOfferings\nReservedNodeOfferingsMessage\nReservedNodeQuotaExceededFault\nReservedNodes\nReservedNodesMessage\nReservedNodesOffering\nReservedNodesOfferingId\nReservedNodesOfferingNotFoundFault\nReservedNodesOfferings\nReservedNormalizedUnits\nReservedSlots\nReservedStreamCapacity\nReservoirQuota\nReservoirQuotaTTL\nReservoirSize\nResetActionConfiguration\nResetAddressAttributeRequest\nResetAddressAttributeResult\nResetAlarmActionRequest\nResetAllParameters\nResetAuthorizersCacheRequest\nResetCacheInput\nResetCacheOutput\nResetCacheParameterGroupMessage\nResetClusterParameterGroupMessage\nResetConnectorMetadataCacheRequest\nResetDBClusterParameterGroupMessage\nResetDBParameterGroupMessage\nResetDeploymentsRequest\nResetDeploymentsResponse\nResetDisabled\nResetDistributionCacheRequest\nResetDistributionCacheResult\nResetEbsDefaultKmsKeyIdRequest\nResetEbsDefaultKmsKeyIdResult\nResetElements\nResetEncryptionKeyRequest\nResetFpgaImageAttributeRequest\nResetFpgaImageAttributeResult\nResetImageAttributeRequest\nResetInstanceAttributeRequest\nResetJobBookmarkRequest\nResetJobBookmarkResponse\nResetNetworkInterfaceAttributeRequest\nResetNotificationSettingsRequest\nResetNotificationSettingsResponse\nResetOrderNumber\nResetParameterGroupRequest\nResetParameterGroupResponse\nResetPasswordRequest\nResetPersonalPINRequest\nResetPersonalPINResponse\nResetPolicy\nResetResourceLogLevelRequest\nResetServiceSettingRequest\nResetServiceSettingResult\nResetServiceSpecificCredentialRequest\nResetServiceSpecificCredentialResponse\nResetSnapshotAttributeRequest\nResetTimerAction\nResetUserPasswordRequest\nResetUserPasswordResponse\nResharding\nReshardingConfiguration\nReshardingStatus\nResilience\nResiliencyPolicy\nResiliencyScore\nResizeCluster\nResizeClusterMessage\nResizeClusterResult\nResizeInfo\nResizeNotFoundFault\nResizeOption\nResizeProgressMessage\nResizeSpecifications\nResizeType\nResolution\nResolutionContact\nResolutionMethod\nResolutionStrategy\nResolutionTechniques\nResolutionTime\nResolveAlias\nResolveAliasInput\nResolveAliasOutput\nResolveAppVersionResourcesRequest\nResolveAppVersionResourcesResponse\nResolveCaseRequest\nResolveCaseResponse\nResolveComponentCandidatesRequest\nResolveComponentCandidatesResponse\nResolveCustomerRequest\nResolveCustomerResult\nResolveRoomRequest\nResolveRoomResponse\nResolved\nResolvedArtifact\nResolvedAttributes\nResolvedCIDRCount\nResolvedComponentVersion\nResolvedImage\nResolvedImageUri\nResolvedOutputS3Uri\nResolvedTargets\nResolvedValue\nResolver\nResolverConfig\nResolverConfigs\nResolverDNSSECConfig\nResolverDnssecConfig\nResolverDnssecConfigs\nResolverEndpoint\nResolverEndpointId\nResolverEndpointType\nResolverEndpoints\nResolverIP\nResolverQueryLogConfig\nResolverQueryLogConfigAssociation\nResolverQueryLogConfigAssociationId\nResolverQueryLogConfigAssociations\nResolverQueryLogConfigId\nResolverQueryLogConfigPolicy\nResolverQueryLogConfigs\nResolverRule\nResolverRuleAssociation\nResolverRuleAssociationId\nResolverRuleAssociations\nResolverRuleConfig\nResolverRuleId\nResolverRulePolicy\nResolverRules\nResource\nResourceARN\nResourceARNDetail\nResourceARNList\nResourceARNNotValidException\nResourceARNUpdate\nResourceARNs\nResourceAccessPolicies\nResourceAccessPolicy\nResourceAccessRoleArn\nResourceAction\nResourceAlreadyCheckedOutException\nResourceAlreadyExistException\nResourceAlreadyExistsException\nResourceAlreadyExistsFault\nResourceArn\nResourceArnList\nResourceArnNotFoundException\nResourceArnRequiredException\nResourceArns\nResourceAssociatedException\nResourceAttribute\nResourceAttributeList\nResourceAwsEc2InstanceIamInstanceProfileArn\nResourceAwsEc2InstanceImageId\nResourceAwsEc2InstanceIpV4Addresses\nResourceAwsEc2InstanceIpV6Addresses\nResourceAwsEc2InstanceKeyName\nResourceAwsEc2InstanceLaunchedAt\nResourceAwsEc2InstanceSubnetId\nResourceAwsEc2InstanceType\nResourceAwsEc2InstanceVpcId\nResourceAwsIamAccessKeyCreatedAt\nResourceAwsIamAccessKeyPrincipalName\nResourceAwsIamAccessKeyStatus\nResourceAwsIamAccessKeyUserName\nResourceAwsIamUserUserName\nResourceAwsS3BucketOwnerId\nResourceAwsS3BucketOwnerName\nResourceBudgetEstimate\nResourceCatalog\nResourceCatalogArn\nResourceCatalogName\nResourceCatalogs\nResourceChange\nResourceChangeDetail\nResourceChanges\nResourceCidr\nResourceCollection\nResourceCollectionFilter\nResourceCollectionType\nResourceComplianceStatus\nResourceComplianceSummaryItem\nResourceComplianceSummaryItems\nResourceConcurrentModificationException\nResourceConfig\nResourceConfigForUpdate\nResourceConfiguration\nResourceConfigurationSchemaType\nResourceConflict\nResourceConflictException\nResourceContainerImageId\nResourceContainerImageName\nResourceContainerLaunchedAt\nResourceContainerName\nResourceContentionFault\nResourceCount\nResourceCountByStatus\nResourceCountFilters\nResourceCountsSummary\nResourceCreationFailedException\nResourceCreationLimitPolicy\nResourceDataContainer\nResourceDataSyncAlreadyExistsException\nResourceDataSyncAwsOrganizationsSource\nResourceDataSyncConflictException\nResourceDataSyncCountExceededException\nResourceDataSyncDestinationDataSharing\nResourceDataSyncInvalidConfigurationException\nResourceDataSyncItem\nResourceDataSyncItems\nResourceDataSyncNotFoundException\nResourceDataSyncOrganizationalUnit\nResourceDataSyncS3Destination\nResourceDataSyncSource\nResourceDataSyncSourceWithState\nResourceDefinitionId\nResourceDefinitionVersion\nResourceDefinitionVersionArn\nResourceDefinitionVersionId\nResourceDependencyException\nResourceDescription\nResourceDescriptions\nResourceDetail\nResourceDetails\nResourceDetailsOther\nResourceDiscoveryAssociationCount\nResourceDiscoveryStatus\nResourceDoesNotSupportTagging\nResourceDownloadOwnerSetting\nResourceEndpoint\nResourceEndpointList\nResourceEndpointListItem\nResourceError\nResourceErrorsDetails\nResourceEvaluation\nResourceEvaluationFilters\nResourceEvaluationId\nResourceEvaluations\nResourceExistsException\nResourceFilter\nResourceFilterCriteria\nResourceFilters\nResourceGroup\nResourceGroupName\nResourceGroupTag\nResourceHandlingOption\nResourceHours\nResourceId\nResourceIdList\nResourceIdOverrideConfiguration\nResourceIdPreference\nResourceIdScope\nResourceIdType\nResourceIdentifier\nResourceIdentifierSummaries\nResourceIdentifierSummary\nResourceIdentifiers\nResourceIds\nResourceInUse\nResourceInUseException\nResourceInUseFault\nResourceInfo\nResourceInfoList\nResourceIntegrations\nResourceInventory\nResourceInventoryList\nResourceKey\nResourceKeys\nResourceLabel\nResourceLifecycleConfig\nResourceLimit\nResourceLimitExceeded\nResourceLimitExceededException\nResourceLimits\nResourceList\nResourceLocation\nResourceLocations\nResourceLockedException\nResourceMapFilter\nResourceMapping\nResourceMetadata\nResourceMetrics\nResourceModel\nResourceName\nResourceNotAvailableException\nResourceNotDiscoveredException\nResourceNotFound\nResourceNotFoundException\nResourceNotFoundFault\nResourceNotReadyException\nResourceNotSupportedException\nResourceNumberLimitExceededException\nResourceOverlapStatus\nResourceOwner\nResourceOwnerCheckException\nResourceOwnerId\nResourceOwningAccountId\nResourcePartition\nResourcePath\nResourcePathComponent\nResourcePendingMaintenanceActions\nResourcePermission\nResourcePolicies\nResourcePolicy\nResourcePolicyConflictException\nResourcePolicyInvalidParameterException\nResourcePolicyLimitExceededException\nResourcePolicyNotFoundException\nResourcePolicyNotValidException\nResourcePolicySummary\nResourcePreconditionNotMetException\nResourceProfileArtifact\nResourcePropagationDelayException\nResourceProperties\nResourceProperty\nResourceProvisionedThroughputExceededException\nResourceQuery\nResourceQuota\nResourceQuotaExceededException\nResourceQuotaExceededFault\nResourceQuotas\nResourceReceivingAccess\nResourceRecord\nResourceRecordSet\nResourceRecordSetCount\nResourceRecordSets\nResourceRecords\nResourceReference\nResourceRegion\nResourceRegistrationFailureException\nResourceRequestStatusFilter\nResourceRequestStatusSummaries\nResourceRequirement\nResourceRequirements\nResourceResult\nResourceRetainedBillableTimeInSeconds\nResourceRole\nResourceScanMetadata\nResourceServer\nResourceServerScopeType\nResourceServerType\nResourceServers\nResourceSet\nResourceSetArn\nResourceSetIdentifier\nResourceSetIds\nResourceSetName\nResourceSetOutput\nResourceSetStatus\nResourceSetSummary\nResourceSetType\nResourceSets\nResourceShare\nResourceShareAssociation\nResourceShareInvitation\nResourceShareInvitationAlreadyAcceptedException\nResourceShareInvitationAlreadyRejectedException\nResourceShareInvitationArnNotFoundException\nResourceShareInvitationExpiredException\nResourceShareLimitExceededException\nResourceSharePermissionDetail\nResourceSharePermissionSummary\nResourceShareType\nResourceSpec\nResourceSpecificResult\nResourceSpecificResults\nResourceSpecification\nResourceState\nResourceStatement\nResourceStatementRequest\nResourceStatistics\nResourceStatus\nResourceStatusReason\nResourceStringFilter\nResourceSummary\nResourceSyncAttempt\nResourceSyncEvent\nResourceTag\nResourceTagKey\nResourceTagKeys\nResourceTagList\nResourceTagMapping\nResourceTagMappingList\nResourceTagSet\nResourceTagSets\nResourceTagValue\nResourceTags\nResourceTagsDescriptionMessage\nResourceTagsSearchCriteria\nResourceTargetDefinition\nResourceTargetDetails\nResourceToImport\nResourceType\nResourceTypeFilters\nResourceTypeList\nResourceTypeManagementPreference\nResourceTypeNotFound\nResourceTypeNotSupportedException\nResourceTypeOptInPreference\nResourceTypes\nResourceTypesScope\nResourceUnavailableException\nResourceUri\nResourceUris\nResourceUtilization\nResourceValidationException\nResourceValue\nResourceViolation\nResourceViolations\nResources\nResourcesAffected\nResourcesPerPage\nResourcesSupported\nResourcesToAdd\nResourcesToImport\nResourcesToRemove\nResourcesToSkip\nResourcesVpcConfig\nRespondActivityTaskCanceledInput\nRespondActivityTaskCompletedInput\nRespondActivityTaskFailedInput\nRespondDecisionTaskCompletedInput\nRespondToAfd\nRespondToAuthChallengeRequest\nRespondToAuthChallengeResponse\nRespondsTo\nResponse\nResponseAction\nResponseCacheControl\nResponseCard\nResponseCode\nResponseCodeSent\nResponseContentDisposition\nResponseContentEncoding\nResponseContentLanguage\nResponseContentType\nResponseDetails\nResponseError\nResponseExpires\nResponseFinishDateTime\nResponseHeaders\nResponseHeadersPolicy\nResponseHeadersPolicyAccessControlAllowHeaders\nResponseHeadersPolicyAccessControlAllowMethods\nResponseHeadersPolicyAccessControlAllowOrigins\nResponseHeadersPolicyAccessControlExposeHeaders\nResponseHeadersPolicyAlreadyExists\nResponseHeadersPolicyConfig\nResponseHeadersPolicyContentSecurityPolicy\nResponseHeadersPolicyContentTypeOptions\nResponseHeadersPolicyCorsConfig\nResponseHeadersPolicyCustomHeader\nResponseHeadersPolicyCustomHeadersConfig\nResponseHeadersPolicyFrameOptions\nResponseHeadersPolicyId\nResponseHeadersPolicyInUse\nResponseHeadersPolicyList\nResponseHeadersPolicyReferrerPolicy\nResponseHeadersPolicyRemoveHeader\nResponseHeadersPolicyRemoveHeadersConfig\nResponseHeadersPolicySecurityHeadersConfig\nResponseHeadersPolicyServerTimingHeadersConfig\nResponseHeadersPolicyStrictTransportSecurity\nResponseHeadersPolicySummary\nResponseHeadersPolicyXSSProtection\nResponseInspection\nResponseInspectionBodyContains\nResponseInspectionHeader\nResponseInspectionJson\nResponseInspectionStatusCode\nResponseItem\nResponseLaunchTemplateData\nResponseMessage\nResponseModels\nResponseOutputItem\nResponsePagePath\nResponseParameters\nResponsePartitionKey\nResponsePlanSummary\nResponseResourceMetric\nResponseResourceMetricKey\nResponseSignalPreroll\nResponseSpecification\nResponseStartDateTime\nResponseStreamContentType\nResponseTemplates\nResponseTime\nResponseTimeHistogram\nResponseTimeRootCause\nResponseTimeRootCauseEntity\nResponseTimeRootCauseService\nResponseTimeRootCauses\nResponses\nRestApi\nRestApis\nRestartAppServerMessage\nRestartDelay\nRestartSimulationJobRequest\nRestartWorkspace\nRestorableByUserIds\nRestorableNodeTypes\nRestorableUntil\nRestorationPrice\nRestore\nRestoreAddressToClassicRequest\nRestoreAddressToClassicResult\nRestoreAnalysisRequest\nRestoreAnalysisResponse\nRestoreBackupRequest\nRestoreBackupResponse\nRestoreCertificateAuthorityRequest\nRestoreClusterFromSnapshotInput\nRestoreClusterFromSnapshotOutput\nRestoreCoreNetworkPolicyVersionRequest\nRestoreCoreNetworkPolicyVersionResponse\nRestoreDBClusterFromS3Message\nRestoreDBClusterFromS3Result\nRestoreDBClusterFromSnapshotMessage\nRestoreDBClusterFromSnapshotResult\nRestoreDBClusterToPointInTimeMessage\nRestoreDBClusterToPointInTimeResult\nRestoreDBInstanceFromDBSnapshotMessage\nRestoreDBInstanceFromDBSnapshotResult\nRestoreDBInstanceFromS3Message\nRestoreDBInstanceFromS3Result\nRestoreDBInstanceToPointInTimeMessage\nRestoreDBInstanceToPointInTimeResult\nRestoreDateTime\nRestoreDocumentVersionsRequest\nRestoreDomainAccessRequest\nRestoreDuration\nRestoreEventDataStoreRequest\nRestoreEventDataStoreResponse\nRestoreExpiryDate\nRestoreExpiryTime\nRestoreFromClusterSnapshotMessage\nRestoreFromClusterSnapshotResult\nRestoreFromRecoveryPointRequest\nRestoreFromRecoveryPointResponse\nRestoreFromSnapshotRequest\nRestoreFromSnapshotResponse\nRestoreImageFromRecycleBinRequest\nRestoreImageFromRecycleBinResult\nRestoreInProgress\nRestoreJobId\nRestoreJobs\nRestoreJobsListMember\nRestoreKeyInput\nRestoreKeyOutput\nRestoreManagedPrefixListVersionRequest\nRestoreManagedPrefixListVersionResult\nRestoreMetadata\nRestoreObjectOutput\nRestoreObjectRequest\nRestoreOutputPath\nRestorePhoneNumberRequest\nRestorePhoneNumberResponse\nRestoreRequest\nRestoreSecretRequest\nRestoreSecretResponse\nRestoreServerRequest\nRestoreServerResponse\nRestoreSnapshotFromRecycleBinRequest\nRestoreSnapshotFromRecycleBinResult\nRestoreSnapshotTierRequest\nRestoreSnapshotTierResult\nRestoreSnapshots\nRestoreStartTime\nRestoreStatus\nRestoreSummary\nRestoreTableFromBackupInput\nRestoreTableFromBackupOutput\nRestoreTableFromClusterSnapshotMessage\nRestoreTableFromClusterSnapshotResult\nRestoreTableFromSnapshotRequest\nRestoreTableFromSnapshotResponse\nRestoreTableRequest\nRestoreTableResponse\nRestoreTableToPointInTimeInput\nRestoreTableToPointInTimeOutput\nRestoreTime\nRestoreToSnapshot\nRestoreToTime\nRestoreType\nRestoreVolumeFromSnapshotRequest\nRestoreVolumeFromSnapshotResponse\nRestoreWindow\nRestoreWorkspaceRequest\nRestrictPublicBuckets\nRestrictedPackageName\nRestrictedSourceFileException\nRestrictionType\nRestrictions\nResult\nResultAttribute\nResultAttributes\nResultBBox\nResultByTime\nResultCode\nResultConfiguration\nResultConfigurationUpdates\nResultData\nResultEncryptionMode\nResultErrorEntry\nResultField\nResultFrame\nResultId\nResultIds\nResultItems\nResultKmsKeyArn\nResultList\nResultLocationBucket\nResultLocationFolder\nResultRecordedTime\nResultReuseByAgeConfiguration\nResultReuseConfiguration\nResultReuseInformation\nResultRow\nResultRowValue\nResultRows\nResultS3Uri\nResultSet\nResultSetMetadata\nResultSetOptions\nResultSize\nResultStream\nResultToken\nResultType\nResultValues\nResults\nResultsByTime\nResultsCount\nResultsNotFound\nResultsPublishingEnabled\nResultsS3Prefix\nResumableUntil\nResumeActions\nResumeBatchLoadTaskRequest\nResumeCampaignRequest\nResumeCluster\nResumeClusterMessage\nResumeClusterResult\nResumeContactRecordingRequest\nResumeFullAutomationModeMinutes\nResumeFullAutomationModeTime\nResumeGameServerGroupInput\nResumeGameServerGroupOutput\nResumeReplicationRequest\nResumeResourceRequest\nResumeServiceRequest\nResumeServiceResponse\nResumeSessionRequest\nResumeSessionResponse\nResumeWorkflowRunRequest\nResumeWorkflowRunResponse\nResyncMFADeviceRequest\nRetainAllVariantProperties\nRetainDeploymentConfig\nRetainExceptOnCreate\nRetainPhysicalResources\nRetainPrimaryCluster\nRetainPrimaryReplicationGroup\nRetainRecordInDays\nRetainRecordUntil\nRetainResources\nRetainRule\nRetainStacks\nRetainStacksOnAccountRemoval\nRetainUntilDate\nRetainedMessageSummary\nRetention\nRetentionArchiveTier\nRetentionConfiguration\nRetentionConfigurationName\nRetentionConfigurationNames\nRetentionConfigurations\nRetentionDays\nRetentionLockTimeInDays\nRetentionLockType\nRetentionPeriod\nRetentionPeriodHours\nRetentionPeriodInDays\nRetentionPeriodUnit\nRetentionPeriodValue\nRetentionPolicy\nRetentionProperties\nRetentionSettings\nRetentionStartDate\nRetireGrantRequest\nRetiringPrincipal\nRetrainingAvailableDataInDays\nRetrainingFrequency\nRetrainingSchedulerStatus\nRetrainingSchedulerSummaries\nRetrainingSchedulerSummary\nRetrainingStartDate\nRetries\nRetrieval\nRetrievalByteRange\nRetrievalRoleArn\nRetrieveAZs\nRetrieveActions\nRetrieveDomainAuthCodeRequest\nRetrieveDomainAuthCodeResponse\nRetrieveEnvironmentInfoMessage\nRetrieveEnvironmentInfoResultMessage\nRetrieveFilePaths\nRetrieveRequest\nRetrieveResult\nRetrieveResultItem\nRetrieveResults\nRetrieveTapeArchiveInput\nRetrieveTapeArchiveOutput\nRetrieveTapeRecoveryPointInput\nRetrieveTapeRecoveryPointOutput\nRetrievedTo\nRetryAfter\nRetryAfterSeconds\nRetryAttemptSeconds\nRetryAttempts\nRetryBuildBatchInput\nRetryBuildBatchOutput\nRetryBuildInput\nRetryBuildOutput\nRetryCount\nRetryCriteria\nRetryDataReplicationRequest\nRetryDelayInSeconds\nRetryInterval\nRetryIntervalInMinutes\nRetryIntervalMs\nRetryOptions\nRetryPipelineExecutionRequest\nRetryPipelineExecutionResponse\nRetryPolicy\nRetryPolicyConfiguration\nRetryPolicyExecution\nRetryStageExecutionInput\nRetryStageExecutionOutput\nRetryStrategy\nRetryWorkflowStepRequest\nRetryWorkflowStepResponse\nRetryable\nRetryableConflictException\nRetryableError\nRetryableException\nReturn\nReturnCode\nReturnConnectionPasswordEncrypted\nReturnConsumedCapacity\nReturnData\nReturnEnabled\nReturnInformation\nReturnItemCollectionMetrics\nReturnPath\nReturnPathArn\nReturnPathComponents\nReturnShippingLabelAlreadyExistsException\nReturnShippingLabelURI\nReturnSize\nReturnSubscriptionArn\nReturnValue\nReturnValues\nReturnValuesOnConditionCheckFailure\nReusableDelegationSetLimit\nReuseOnScaleIn\nReusedByJob\nReusedPreviousResult\nRevealConfiguration\nReverseGeocodingConfig\nReverseOrder\nReverseReplicationRequest\nReverseReplicationResponse\nRevert\nReviewActionDetail\nReviewActions\nReviewDetails\nReviewInformation\nReviewOwner\nReviewPolicy\nReviewReport\nReviewRestrictionDate\nReviewResultDetail\nReviewResults\nReviewStatus\nReviewedTime\nReviewer\nReviewerResponse\nReviews\nRevision\nRevisionDestination\nRevisionDestinationEntry\nRevisionDestinations\nRevisionDoesNotExistException\nRevisionEntry\nRevisionId\nRevisionIdRequiredException\nRevisionInfo\nRevisionLocation\nRevisionNotCurrentException\nRevisionPublished\nRevisionRequiredException\nRevisionTarget\nRevisionTargets\nRevisions\nRevocationComment\nRevocationConfiguration\nRevocationReason\nRevokeAllGroups\nRevokeCacheSecurityGroupIngressMessage\nRevokeCacheSecurityGroupIngressResult\nRevokeCertificateRequest\nRevokeClientVpnIngressRequest\nRevokeClientVpnIngressResult\nRevokeClusterSecurityGroupIngressMessage\nRevokeClusterSecurityGroupIngressResult\nRevokeDBSecurityGroupIngressMessage\nRevokeDBSecurityGroupIngressResult\nRevokeDomainAccessRequest\nRevokeEndpointAccessMessage\nRevokeFlowEntitlementRequest\nRevokeFlowEntitlementResponse\nRevokeGrantRequest\nRevokeInvitationRequest\nRevokeIpRulesRequest\nRevokeLinkPermissions\nRevokePermissions\nRevokePermissionsRequest\nRevokeRevisionRequest\nRevokeRevisionResponse\nRevokeSecurityGroupEgressRequest\nRevokeSecurityGroupEgressResult\nRevokeSecurityGroupIngressRequest\nRevokeSecurityGroupIngressResult\nRevokeSignatureRequest\nRevokeSigningProfileRequest\nRevokeSnapshotAccessMessage\nRevokeSnapshotAccessResult\nRevokeTokenRequest\nRevokeVpcEndpointAccessRequest\nRevoked\nRevokedAt\nReward\nRfRegion\nRfc4180\nRfc822Name\nRichText\nRight\nRightJoinKeyProperties\nRightOperand\nRightsizingRecommendation\nRightsizingRecommendationConfiguration\nRightsizingRecommendationMetadata\nRightsizingRecommendationSummary\nRightsizingRecommendations\nRightsizingType\nRisk\nRiskConfiguration\nRiskConfigurationType\nRiskCounts\nRiskDecision\nRiskDetails\nRiskExceptionConfiguration\nRiskExceptionConfigurationType\nRiskLevel\nRiskRating\nRiskScore\nRiskThreshold\nRobot\nRobotApplicationConfig\nRobotApplicationSummary\nRobotDeployment\nRobotSoftwareSuite\nRole\nRoleARN\nRoleARNUpdate\nRoleAliasDescription\nRoleArn\nRoleArns\nRoleBase\nRoleCredentials\nRoleDetail\nRoleDetailList\nRoleId\nRoleInfo\nRoleLastUsed\nRoleLevel\nRoleMapping\nRoleMappings\nRoleName\nRolePolicyList\nRoleRequiredException\nRoleSearchMatching\nRoleSearchSubtree\nRoleSessionName\nRoleStatus\nRoleUsageList\nRoleUsageType\nRoleValues\nRoles\nRolesKey\nRoll\nRollback\nRollbackApplicationRequest\nRollbackApplicationResponse\nRollbackConfiguration\nRollbackDetails\nRollbackErrorMessage\nRollbackErrors\nRollbackFailureReason\nRollbackInfo\nRollbackInstanceRefreshAnswer\nRollbackInstanceRefreshType\nRollbackMaximumBatchSize\nRollbackOnDisable\nRollbackReason\nRollbackStackInput\nRollbackStackOutput\nRollbackStartTime\nRollbackTransactionRequest\nRollbackTransactionResponse\nRollbackTrigger\nRollbackTriggers\nRollingDate\nRollingDateConfiguration\nRollingUpdatePolicy\nRolloverInterval\nRoom\nRoomArn\nRoomData\nRoomFilters\nRoomId\nRoomMembership\nRoomMemberships\nRoomName\nRoomRetentionSettings\nRoomSkillParameter\nRoomSkillParameters\nRoomSummary\nRoomUtilizationMetricsEnabled\nRooms\nRoot\nRootAccess\nRootCause\nRootCauseException\nRootCauseServiceId\nRootCauseServiceRequestImpactStatistics\nRootCauses\nRootCertificatePublicKey\nRootChangeSetId\nRootDeviceName\nRootDeviceType\nRootDeviceVolumeId\nRootDirectory\nRootFolderId\nRootId\nRootNotFoundException\nRootSquash\nRootSquashConfiguration\nRootStorage\nRootVolumeConfiguration\nRootVolumeEncryptionEnabled\nRootVolumeId\nRootVolumeSecurityStyle\nRootVolumeSizeGib\nRoots\nRotate\nRotateChannelCredentialsRequest\nRotateChannelCredentialsResponse\nRotateEncryptionKeyMessage\nRotateEncryptionKeyResult\nRotateImmediately\nRotateIngestEndpointCredentialsRequest\nRotateIngestEndpointCredentialsResponse\nRotateMasterUserPassword\nRotateSecretRequest\nRotateSecretResponse\nRotateTunnelAccessTokenRequest\nRotateTunnelAccessTokenResponse\nRotation\nRotationAngle\nRotationArn\nRotationEnabled\nRotationId\nRotationIds\nRotationLambdaARN\nRotationLambdaArn\nRotationNamePrefix\nRotationOccurredWithinFrequency\nRotationOverride\nRotationOverrideId\nRotationOverrides\nRotationRules\nRotationRulesType\nRotationShift\nRotationShifts\nRotationStartTime\nRotations\nRoundTripTime\nRoute\nRouteAnalysis\nRouteAnalysisCompletion\nRouteAnalysisEndpointOptions\nRouteAnalysisEndpointOptionsSpecification\nRouteAnalysisId\nRouteAnalysisPath\nRouteBBox\nRouteCount\nRouteData\nRouteFilterPrefix\nRouteHasOutOfScopeEndpointViolation\nRouteId\nRouteIdentifier\nRouteKey\nRouteMatrix\nRouteMatrixEntry\nRouteMatrixEntryError\nRouteOrigin\nRouteRef\nRouteResponse\nRouteResponseId\nRouteResponseKey\nRouteResponseSelectionExpression\nRouteSelectionExpression\nRouteSet\nRouteSetDetails\nRouteSettings\nRouteSpec\nRouteStatus\nRouteSummary\nRouteSummaryList\nRouteTable\nRouteTableArn\nRouteTableAssociation\nRouteTableAssociationId\nRouteTableAssociationState\nRouteTableId\nRouteTableIdentifier\nRouteTableIds\nRouteTableRoute\nRouteTableTimestamp\nRouteTableType\nRouteTables\nRouteType\nRouteUpdates\nRoutedResource\nRouterType\nRoutes\nRoutingConfig\nRoutingConfigurationListItem\nRoutingControl\nRoutingControlArn\nRoutingControlCount\nRoutingControlName\nRoutingControlState\nRoutingControls\nRoutingPolicy\nRoutingProfile\nRoutingProfileArn\nRoutingProfileId\nRoutingProfileQueueConfig\nRoutingProfileQueueConfigSummary\nRoutingProfileQueueConfigSummaryList\nRoutingProfileQueueReference\nRoutingProfileReference\nRoutingProfileSearchCriteria\nRoutingProfileSearchFilter\nRoutingProfileSummary\nRoutingProfileSummaryList\nRoutingProfiles\nRoutingRule\nRoutingRules\nRoutingStrategy\nRoutingStrategyType\nRow\nRowAlternateColorOptions\nRowAlternateColors\nRowColumnInfo\nRowFieldNamesStyle\nRowFilter\nRowFilterExpression\nRowGroupLength\nRowHeaderStyle\nRowIndex\nRowIndexStride\nRowInfo\nRowLabelOptions\nRowLength\nRowLevelPermissionDataSet\nRowLevelPermissionTagConfiguration\nRowLevelPermissionTagConfigurationApplied\nRowLevelPermissionTagKeys\nRowLevelPermissionTagRule\nRowLevelPermissionTags\nRowRange\nRowSort\nRowSpan\nRowSubtotalOptions\nRowTag\nRowTotalOptions\nRowValue\nRows\nRowsDropped\nRowsIngested\nRowsLabelOptions\nRowsLayout\nRpcProtection\nRsaPublicKey\nRsaPublicKeyFingerprint\nRscp\nRsrp\nRsrq\nRss\nRssi\nRtmpCaptionInfoDestinationSettings\nRtmpGroupSettings\nRtmpOutputSettings\nRule\nRuleARN\nRuleAction\nRuleActionOverride\nRuleActionOverrides\nRuleArn\nRuleArns\nRuleBasedMatching\nRuleBasedMatchingRequest\nRuleBasedMatchingResponse\nRuleBasedProperties\nRuleCondition\nRuleConfig\nRuleConfigurationName\nRuleCount\nRuleDefinition\nRuleDescription\nRuleDetail\nRuleDoesNotExistException\nRuleEvaluation\nRuleEvaluationJobArn\nRuleEvaluationStatus\nRuleEvaluatorImage\nRuleGroup\nRuleGroupArn\nRuleGroupDetails\nRuleGroupId\nRuleGroupMetadata\nRuleGroupName\nRuleGroupReferenceStatement\nRuleGroupResponse\nRuleGroupRuleName\nRuleGroupRuleOptionsPair\nRuleGroupRuleOptionsPairs\nRuleGroupSource\nRuleGroupSourceCustomActionsDetails\nRuleGroupSourceListDetails\nRuleGroupSourceStatefulRulesDetails\nRuleGroupSourceStatefulRulesHeaderDetails\nRuleGroupSourceStatefulRulesOptionsDetails\nRuleGroupSourceStatelessRuleDefinition\nRuleGroupSourceStatelessRuleMatchAttributes\nRuleGroupSourceStatelessRuleMatchAttributesDestinationPorts\nRuleGroupSourceStatelessRuleMatchAttributesDestinations\nRuleGroupSourceStatelessRuleMatchAttributesSourcePorts\nRuleGroupSourceStatelessRuleMatchAttributesSources\nRuleGroupSourceStatelessRuleMatchAttributesTcpFlags\nRuleGroupSourceStatelessRulesAndCustomActionsDetails\nRuleGroupSourceStatelessRulesDetails\nRuleGroupStatus\nRuleGroupSummary\nRuleGroupType\nRuleGroupTypePair\nRuleGroupTypePairs\nRuleGroupUpdate\nRuleGroupVariables\nRuleGroupVariablesIpSetsDetails\nRuleGroupVariablesPortSetsDetails\nRuleGroups\nRuleGroupsNamespaceDescription\nRuleGroupsNamespaceStatus\nRuleGroupsNamespaceSummary\nRuleId\nRuleIdentifier\nRuleLabels\nRuleLevel\nRuleLimitExceededException\nRuleMetadata\nRuleMetricName\nRuleName\nRuleNameWithinRuleGroup\nRuleNames\nRuleNotFoundException\nRuleNumber\nRuleOption\nRuleOptions\nRuleOrder\nRuleParameters\nRulePriorities\nRulePriorityPair\nRuleResult\nRuleResults\nRuleSet\nRuleSetArn\nRuleSetBody\nRuleSetDoesNotExistException\nRuleSetName\nRuleSets\nRuleState\nRuleStatus\nRuleSummary\nRuleSummaryList\nRuleTags\nRuleTriggerEventSource\nRuleType\nRuleUpdate\nRuleUpdateFailure\nRuleUpdateSuccess\nRuleVariables\nRuleVersion\nRuleWithinRuleGroup\nRules\nRulesConfiguration\nRulesConfigurationType\nRulesList\nRulesPackage\nRulesSource\nRulesSourceList\nRulesString\nRuleset\nRulesetArn\nRulesetEvaluationRunId\nRulesetItem\nRulesetName\nRulesetNames\nRulesets\nRumEvent\nRumEvents\nRun\nRunAs\nRunBackTestMode\nRunCommand\nRunCommandParameters\nRunCommandTarget\nRunCommandTargets\nRunConfig\nRunConfiguration\nRunConfigurationDescription\nRunConfigurationUpdate\nRunFleetAdvisorLsaAnalysisResponse\nRunGroupListItem\nRunId\nRunInstancesMonitoringEnabled\nRunInstancesRequest\nRunJobFlowInput\nRunJobFlowOutput\nRunListItem\nRunName\nRunPipelineActivityRequest\nRunPipelineActivityResponse\nRunProperties\nRunScheduledInstancesRequest\nRunScheduledInstancesResult\nRunStatementRequest\nRunStatementResponse\nRunStatus\nRunTaskRequest\nRunTaskResponse\nRunbook\nRunbooks\nRuncBinaryPath\nRunning\nRunningActions\nRunningAmiVersion\nRunningBridgeCount\nRunningInstanceCount\nRunningMode\nRunningModeAutoStopTimeoutInMinutes\nRunningSetup\nRunningTasksCount\nRuns\nRuntime\nRuntimeConfiguration\nRuntimeContext\nRuntimeContextName\nRuntimeContextStates\nRuntimeDetails\nRuntimeEnvironment\nRuntimeEnvironmentSecrets\nRuntimeEnvironmentVariables\nRuntimeHintDetails\nRuntimeHintValue\nRuntimeHints\nRuntimeInSeconds\nRuntimePlatform\nRuntimeRoleArn\nRuntimeVersion\nRuntimeVersionArn\nRuntimeVersionConfig\nRuntimeVersionError\nRuntimeVersions\nRxDataRate2\nRxDelay1\nRxDrOffset1\nRxFreq2\nRxLevel\nRxNormAttribute\nRxNormConcept\nRxNormConcepts\nRxNormEntity\nRxNormTrait\nS\nS3\nS3AccessControlList\nS3AccessControlPolicy\nS3AccessDeniedFault\nS3AccessPointAlias\nS3AccessPointArn\nS3AccessPointConfiguration\nS3AclOption\nS3Action\nS3ApplicationCodeLocationDescription\nS3ArtifactLocation\nS3ArtifactPath\nS3BackupConfiguration\nS3BackupDescription\nS3BackupMode\nS3BackupUpdate\nS3Bucket\nS3BucketAccessRoleArn\nS3BucketAclGrantConfiguration\nS3BucketArn\nS3BucketConfiguration\nS3BucketCriteriaForJob\nS3BucketDefinitionForJob\nS3BucketDestination\nS3BucketDetail\nS3BucketDetails\nS3BucketDoesNotExistException\nS3BucketFolder\nS3BucketInfo\nS3BucketLogDestination\nS3BucketName\nS3BucketOwner\nS3BucketPath\nS3BucketPrefix\nS3BucketRegion\nS3BucketRepository\nS3BucketRoleArn\nS3BucketSinkConfiguration\nS3BucketSource\nS3BucketTranscriptSource\nS3CanonicalUserId\nS3CatalogDeltaSource\nS3CatalogHudiSource\nS3CatalogSource\nS3CatalogTarget\nS3ClassificationScope\nS3ClassificationScopeExclusion\nS3ClassificationScopeExclusionUpdate\nS3ClassificationScopeUpdate\nS3CompressionType\nS3Config\nS3Configuration\nS3ContentBaseLocation\nS3ContentBaseLocationDescription\nS3ContentBaseLocationUpdate\nS3ContentLocation\nS3ContentLocationDescription\nS3ContentLocationUpdate\nS3CopyObjectOperation\nS3CsvSource\nS3Data\nS3DataAccessAsset\nS3DataAccessAssetSourceEntry\nS3DataConfig\nS3DataDistributionType\nS3DataRepositoryConfiguration\nS3DataSize\nS3DataSource\nS3DataSourceConfiguration\nS3DataSpec\nS3DataType\nS3DataUrl\nS3DeleteObjectTagging\nS3DeltaCatalogTarget\nS3DeltaDirectTarget\nS3DeltaSource\nS3Destination\nS3DestinationAccessControl\nS3DestinationConfig\nS3DestinationConfiguration\nS3DestinationDescription\nS3DestinationProperties\nS3DestinationSettings\nS3DestinationUpdate\nS3Destinations\nS3DirectSourceAdditionalOptions\nS3DirectTarget\nS3Encryption\nS3EncryptionConfig\nS3EncryptionConfiguration\nS3EncryptionEnabled\nS3EncryptionMode\nS3EncryptionSettings\nS3EventName\nS3Exception\nS3ExportArtifacts\nS3ExportConfiguration\nS3ExportLocation\nS3Exporting\nS3ExportingConfig\nS3ExportingLocation\nS3FailurePath\nS3FileLocation\nS3GeneratedManifestDescriptor\nS3GlueParquetTarget\nS3Grant\nS3Grantee\nS3HudiCatalogTarget\nS3HudiDirectTarget\nS3HudiSource\nS3ImportSource\nS3IngestionRoleArn\nS3InitiateRestoreObject\nS3InitiateRestoreObjectOperation\nS3Input\nS3InputConfiguration\nS3InputDefinition\nS3InputFileLocation\nS3InputFormatConfig\nS3InputMode\nS3Inputs\nS3JobDefinition\nS3JobManifestGenerator\nS3JsonSource\nS3Key\nS3KeyFilter\nS3KeyName\nS3KeyOutput\nS3KeyPrefix\nS3Keys\nS3KmsKeyId\nS3Location\nS3LocationDescription\nS3LocationNotInServiceRegionException\nS3LocationUri\nS3LogDelivery\nS3LogDeliveryDescription\nS3LogUrl\nS3Logs\nS3LogsConfig\nS3LogsConfiguration\nS3LogsConfigurationResult\nS3MachineLearningModelResourceData\nS3ManifestOutputLocation\nS3ModelArtifacts\nS3ModelDataSource\nS3MonitoringConfiguration\nS3Object\nS3ObjectAcl\nS3ObjectKey\nS3ObjectLockLegalHold\nS3ObjectMetadata\nS3ObjectOwner\nS3ObjectSource\nS3ObjectTag\nS3ObjectTags\nS3ObjectUrl\nS3ObjectVersion\nS3OnDeviceService\nS3OnDeviceServiceConfiguration\nS3Options\nS3Origin\nS3OriginConfig\nS3Output\nS3OutputConfiguration\nS3OutputFormatConfig\nS3OutputLocation\nS3OutputPath\nS3OutputUri\nS3OutputUrl\nS3Parameters\nS3ParquetSource\nS3Path\nS3PathforGroupMembers\nS3Prefix\nS3PublicAccessBlockConfiguration\nS3PutObjectAcl\nS3PutObjectCopy\nS3PutObjectLegalHold\nS3PutObjectRetention\nS3PutObjectTagging\nS3RecordingConfig\nS3RecordingDetails\nS3RecordingSinkConfiguration\nS3RecordingSinkRuntimeConfiguration\nS3Reference\nS3ReferenceDataSource\nS3ReferenceDataSourceDescription\nS3ReferenceDataSourceUpdate\nS3Region\nS3ReplicateObject\nS3ReportExportConfig\nS3ReportLocation\nS3Repository\nS3RepositoryDetails\nS3Resource\nS3ResourceClassification\nS3ResourceClassificationUpdate\nS3ResourceNotFoundFault\nS3Resources\nS3Results\nS3ResultsPath\nS3Retention\nS3SetObjectAclOperation\nS3SetObjectLegalHoldOperation\nS3SetObjectRetentionOperation\nS3SetObjectTaggingOperation\nS3Settings\nS3SignedObject\nS3SnapshotAsset\nS3Source\nS3SourceAdditionalOptions\nS3SourceConfig\nS3SourceProperties\nS3SseAlgorithm\nS3SseKmsKeyId\nS3StagingLocation\nS3Storage\nS3StorageClass\nS3StorageConfig\nS3SubscriptionRequiredException\nS3TableOutputOptions\nS3Tag\nS3Target\nS3Targets\nS3Update\nS3UploadMode\nS3Uri\nS3Url\nS3UrlPrefix\nS3UrlSignerRole\nS3Version\nS3WordsList\nS3objectKey\nSAMLAssertion\nSAMLIdp\nSAMLMetadataDocument\nSAMLOptions\nSAMLOptionsInput\nSAMLOptionsOutput\nSAMLProviderArn\nSAMLProviderList\nSAMLProviderListEntry\nSAPOData\nSAPODataConnectorProfileCredentials\nSAPODataConnectorProfileProperties\nSAPODataDestinationProperties\nSAPODataPaginationConfig\nSAPODataParallelismConfig\nSAPODataSourceProperties\nSCApplicationAttributes\nSDM\nSHA256TreeHash\nSL\nSLRDeploymentStatus\nSMB\nSMBACLEnabled\nSMBFileShareInfo\nSMBFileShareInfoList\nSMBGuestPasswordSet\nSMBLocalGroups\nSMBSecurityStrategy\nSMS\nSMSChannelRequest\nSMSChannelResponse\nSMSConfiguration\nSMSMessage\nSMSMessageActivity\nSMSMfaSettings\nSMSMfaSettingsType\nSMSSandboxPhoneNumber\nSMSTemplate\nSMSTemplateRequest\nSMSTemplateResponse\nSNOMEDCTAttribute\nSNOMEDCTConcept\nSNOMEDCTConcepts\nSNOMEDCTDetails\nSNOMEDCTEntity\nSNOMEDCTTrait\nSNSAction\nSNSConfiguration\nSNSDestination\nSNSInvalidTopicFault\nSNSNoAuthorizationFault\nSNSTopic\nSNSTopicArn\nSNSTopicArnNotFoundFault\nSNSTopicPublishAction\nSNwkSIntKey\nSOA\nSOAChange\nSQLPort\nSS\nSSEAlgorithm\nSSEAwsKmsKeyId\nSSECustomerAlgorithm\nSSECustomerKey\nSSECustomerKeyMD5\nSSEDescription\nSSEKMS\nSSEKMSEncryption\nSSEKMSEncryptionContext\nSSEKMSKeyId\nSSES3\nSSESpecification\nSSESpecificationOverride\nSSEType\nSSHPublicKey\nSSHPublicKeyBody\nSSHPublicKeyId\nSSHPublicKeyMetadata\nSSHPublicKeys\nSSLCertificateId\nSSLPolicyNotFoundException\nSSLSupportMethod\nSSMLMessage\nSSMLMessageType\nSSMOutput\nSSMValidationParameters\nSSOIdentity\nSaaSConfiguration\nSafe\nSafeguardPolicy\nSafetyRuleArn\nSafetyRules\nSafetyRulesToOverride\nSageMakerImageArn\nSageMakerImageVersionAliases\nSageMakerImageVersionArn\nSageMakerJobArn\nSageMakerMachineLearningModelResourceData\nSageMakerPipelineParameter\nSageMakerPipelineParameters\nSalesforce\nSalesforceAction\nSalesforceChatterFeedConfiguration\nSalesforceConfiguration\nSalesforceConnectorProfileCredentials\nSalesforceConnectorProfileProperties\nSalesforceCustomKnowledgeArticleTypeConfiguration\nSalesforceDestinationProperties\nSalesforceKnowledgeArticleConfiguration\nSalesforceMetadata\nSalesforceSourceProperties\nSalesforceStandardKnowledgeArticleTypeConfiguration\nSalesforceStandardObjectAttachmentConfiguration\nSalesforceStandardObjectConfiguration\nSalt\nSameFileContentException\nSamePathRequestException\nSameSheetTargetVisualConfiguration\nSamlAuthentication\nSamlConfigCount\nSamlConfigOptions\nSamlConfiguration\nSamlProperties\nSamlProviderARNs\nSamlProviderArn\nSample\nSampleAdaptiveOffsetFilterMode\nSampleChannelDataRequest\nSampleChannelDataResponse\nSampleCount\nSampleDataS3SourceConfig\nSampleFraction\nSamplePath\nSamplePayloadUrl\nSampleQuery\nSampleRange\nSampleRangeConversion\nSampleRate\nSampleRows\nSampleSize\nSampleTime\nSampleTimestamp\nSampleUtterance\nSampleUtterances\nSampleValue\nSampleWeightAttributeName\nSampledCount\nSampledEndTime\nSampledHTTPRequest\nSampledRequests\nSampledRequestsEnabled\nSampledStartTime\nSampling\nSamplingDeviceCount\nSamplingInterval\nSamplingPercentage\nSamplingRate\nSamplingRule\nSamplingRuleRecord\nSamplingRuleRecords\nSamplingRuleUpdate\nSamplingStatisticSummaries\nSamplingStatisticSummary\nSamplingStatisticsDocument\nSamplingStatisticsDocuments\nSamplingStrategy\nSamplingTargetDocument\nSamplingTargetDocuments\nSanRequireDirectoryGuid\nSanRequireDns\nSanRequireDomainDns\nSanRequireEmail\nSanRequireSpn\nSanRequireUpn\nSanitizationWarning\nSankeyDiagramAggregatedFieldWells\nSankeyDiagramChartConfiguration\nSankeyDiagramFieldWells\nSankeyDiagramSortConfiguration\nSankeyDiagramVisual\nSapHostname\nSapInstanceNumber\nSapKernelVersion\nSasConfiguration\nSasl\nSaslMechanism\nSaslPassword\nSaslUsername\nSatelliteListItem\nSaturation\nSaturday\nSavings\nSavingsCurrencyCode\nSavingsOpportunity\nSavingsPercentage\nSavingsPlan\nSavingsPlanArn\nSavingsPlanFilter\nSavingsPlanOffering\nSavingsPlanOfferingFilterElement\nSavingsPlanOfferingProperty\nSavingsPlanOfferingRate\nSavingsPlanOfferingRateFilterElement\nSavingsPlanOfferingRateProperty\nSavingsPlanRate\nSavingsPlanRateFilter\nSavingsPlanRateProperty\nSavingsPlansAmortizedCommitment\nSavingsPlansCoverage\nSavingsPlansCoverageData\nSavingsPlansCoverages\nSavingsPlansCoveredHoursInLookbackPeriod\nSavingsPlansDetails\nSavingsPlansPurchaseRecommendation\nSavingsPlansPurchaseRecommendationDetail\nSavingsPlansPurchaseRecommendationDetails\nSavingsPlansPurchaseRecommendationMetadata\nSavingsPlansPurchaseRecommendationSummary\nSavingsPlansSavings\nSavingsPlansType\nSavingsPlansUtilization\nSavingsPlansUtilizationAggregates\nSavingsPlansUtilizationByTime\nSavingsPlansUtilizationDetail\nSavingsPlansUtilizationDetails\nSavingsPlansUtilizationsByTime\nScalaCode\nScalableDimension\nScalableTarget\nScalableTargetARN\nScalableTargetAction\nScalableTargets\nScalarCrlRequest\nScalarProfileRequest\nScalarSubjectRequest\nScalarTrustAnchorRequest\nScalarType\nScalarValue\nScale\nScaleDownBehavior\nScaleDownModifications\nScaleDownNodeTypes\nScaleInCooldown\nScaleInPolicy\nScaleInPolicyDescription\nScaleInPolicyUpdate\nScaleInProtectedInstances\nScaleOutCooldown\nScaleOutPolicy\nScaleOutPolicyDescription\nScaleOutPolicyUpdate\nScaleUpModifications\nScaleUpNodeTypes\nScalingAction\nScalingActivities\nScalingActivity\nScalingActivityInProgressFault\nScalingAdjustment\nScalingAdjustmentType\nScalingBehavior\nScalingConfig\nScalingConfiguration\nScalingConfigurationInfo\nScalingConstraints\nScalingInstruction\nScalingInstructions\nScalingMode\nScalingParameters\nScalingParametersStatus\nScalingPlan\nScalingPlanName\nScalingPlanNames\nScalingPlanResource\nScalingPlanResources\nScalingPlanVersion\nScalingPlans\nScalingPolicies\nScalingPolicy\nScalingPolicyMetric\nScalingPolicyObjective\nScalingPolicyUpdate\nScalingPolicyUpdateBehavior\nScalingProcessQuery\nScalingProcesses\nScalingRule\nScalingStatusCode\nScalingStatusMessage\nScalingTrigger\nScalingType\nScan\nScanAll\nScanBy\nScanCompletedAt\nScanCondition\nScanConditionPair\nScanDetections\nScanDirection\nScanEc2InstanceWithFindings\nScanEc2InstanceWithFindingsResult\nScanEnabled\nScanEndTime\nScanFilePath\nScanFilter\nScanId\nScanIndexForward\nScanInput\nScanMode\nScanNameWithFindingNum\nScanNotFoundException\nScanOnPush\nScanOutput\nScanProvisionedProductsInput\nScanProvisionedProductsOutput\nScanRange\nScanResourceCriteria\nScanResult\nScanResultDetails\nScanStartTime\nScanStartedAt\nScanStatus\nScanSummary\nScanThreatName\nScanType\nScanTypeConversionMode\nScannedCount\nScannedItemCount\nScannedVolumeDetails\nScanningRepositoryFilter\nScans\nScatterPlotCategoricallyAggregatedFieldWells\nScatterPlotConfiguration\nScatterPlotFieldWells\nScatterPlotUnaggregatedFieldWells\nScatterPlotVisual\nSccDestinationSettings\nSccXml\nScenario\nSceneChangeDetect\nSceneError\nSceneSummary\nSchedule\nScheduleAction\nScheduleActionSettings\nScheduleActionStartSettings\nScheduleActions\nScheduleActivityTaskDecisionAttributes\nScheduleActivityTaskFailedEventAttributes\nScheduleAdBreak\nScheduleAdBreaks\nScheduleArn\nScheduleAssociationState\nScheduleAt\nScheduleConfig\nScheduleConfiguration\nScheduleDefinitionTypeUnsupportedFault\nScheduleDefinitions\nScheduleDescription\nScheduleEndTime\nScheduleEntry\nScheduleEntryType\nScheduleExpression\nScheduleExpressionTimezone\nScheduleFrequency\nScheduleGroupArn\nScheduleGroupSummary\nScheduleGroups\nScheduleId\nScheduleIdentifier\nScheduleKeyDeletionRequest\nScheduleKeyDeletionResponse\nScheduleLambdaFunctionDecisionAttributes\nScheduleLambdaFunctionFailedEventAttributes\nScheduleName\nScheduleOffset\nScheduleRefreshOnEntity\nScheduleRunConfiguration\nScheduleRunRequest\nScheduleRunResult\nScheduleRunTest\nScheduleStartTime\nScheduleSummary\nScheduleTimezone\nScheduled\nScheduledAction\nScheduledActionARN\nScheduledActionAlreadyExistsFault\nScheduledActionBufferTime\nScheduledActionDescription\nScheduledActionFilter\nScheduledActionName\nScheduledActionNames\nScheduledActionNotFoundFault\nScheduledActionQuotaExceededFault\nScheduledActionType\nScheduledActionTypeUnsupportedFault\nScheduledActions\nScheduledActionsMessage\nScheduledActionsType\nScheduledAuditMetadata\nScheduledAutoTuneDetails\nScheduledBy\nScheduledEndTime\nScheduledInstance\nScheduledInstanceAvailability\nScheduledInstanceAvailabilitySet\nScheduledInstanceId\nScheduledInstanceIds\nScheduledInstanceRecurrence\nScheduledInstanceRecurrenceRequest\nScheduledInstanceSet\nScheduledInstancesBlockDeviceMapping\nScheduledInstancesEbs\nScheduledInstancesIamInstanceProfile\nScheduledInstancesIpv6Address\nScheduledInstancesLaunchSpecification\nScheduledInstancesMonitoring\nScheduledInstancesNetworkInterface\nScheduledInstancesPlacement\nScheduledInstancesPrivateIpAddressConfig\nScheduledJobRollout\nScheduledQueries\nScheduledQuery\nScheduledQueryArn\nScheduledQueryDescription\nScheduledQueryExecutionRoleArn\nScheduledQueryRunSummary\nScheduledScalingSuspended\nScheduledSplit\nScheduledSplitConfig\nScheduledSplitsLaunchConfig\nScheduledSplitsLaunchDefinition\nScheduledStart\nScheduledStartTime\nScheduledStartTimeMillis\nScheduledTime\nScheduledTimeAfter\nScheduledTimeBefore\nScheduledTimestamp\nScheduledTriggerProperties\nScheduledUpdateGroupAction\nScheduledUpdateGroupActionRequest\nScheduledUpdateGroupActions\nScheduledWindowExecution\nScheduledWindowExecutions\nSchedulerLogs\nSchedulerNotRunningException\nSchedulerRunningException\nSchedulerTransitioningException\nSchedulers\nSchedules\nSchedulingBufferTime\nSchedulingConfig\nSchedulingPolicyDetail\nSchedulingPolicyListingDetail\nSchedulingStrategy\nSchema\nSchemaAlreadyExistsException\nSchemaAlreadyPublishedException\nSchemaArn\nSchemaArns\nSchemaAttribute\nSchemaAttributeType\nSchemaAttributes\nSchemaChangePolicy\nSchemaCheckpoint\nSchemaColumn\nSchemaConfiguration\nSchemaConversionApplicationAttributes\nSchemaConversionRequest\nSchemaDefinition\nSchemaDeleteOption\nSchemaDiffType\nSchemaError\nSchemaExtensionId\nSchemaExtensionInfo\nSchemaExtensionStatus\nSchemaExtensionStatusReason\nSchemaExtensionsInfo\nSchemaFacet\nSchemaFacets\nSchemaHandlerPackage\nSchemaId\nSchemaInputAttribute\nSchemaListItem\nSchemaMappingSummary\nSchemaName\nSchemaNamePrefix\nSchemaPattern\nSchemaReference\nSchemaResponse\nSchemaS3Location\nSchemaShortInfoResponse\nSchemaStatus\nSchemaSummary\nSchemaUnion\nSchemaVersion\nSchemaVersionErrorItem\nSchemaVersionErrors\nSchemaVersionId\nSchemaVersionListItem\nSchemaVersionNumber\nSchemaVersionStatus\nSchemaVersionSummary\nSchemaVersions\nSchemas\nScheme\nScope\nScopeConfiguration\nScopeCount\nScopeDescription\nScopeDoesNotExistException\nScopeDownStatement\nScopeName\nScopes\nScoping\nScore\nScoreAttributes\nScoreConfidence\nScoreDetails\nScoreThreshold\nScoreThresholdLastUpdatedAt\nScores\nScoringStrategy\nScpActionDefinition\nScram\nScreenCanvasSizeOptions\nScreenDataUrl\nScreenSharingUrl\nScreenViewingUrl\nScreenshotName\nScript\nScriptArn\nScriptBatchJobDefinition\nScriptBatchJobIdentifier\nScriptBootstrapAction\nScriptBootstrapActionConfig\nScriptDetails\nScriptId\nScriptLocation\nScriptModeConfig\nScriptParameterKeyValue\nScriptPath\nScriptS3Location\nScripts\nScrollBarOptions\nScrollStatus\nScrollbarOptions\nScte\nScte20Detection\nScte20PlusEmbeddedDestinationSettings\nScte20SourceSettings\nScte27DestinationSettings\nScte27Pids\nScte27SourceSettings\nScte35Behavior\nScte35Control\nScte35DeliveryRestrictions\nScte35Descriptor\nScte35DescriptorSettings\nScte35Descriptors\nScte35Esam\nScte35EsamPid\nScte35InputScheduleActionSettings\nScte35InputSettings\nScte35Pid\nScte35PrerollPullupMilliseconds\nScte35ReturnToNetworkScheduleActionSettings\nScte35ReturnToNetworkSettings\nScte35SegmentationDescriptor\nScte35Source\nScte35SpliceInsert\nScte35SpliceInsertScheduleActionSettings\nScte35SpliceInsertSettings\nScte35TimeSignalApos\nScte35TimeSignalScheduleActionSettings\nScte35TimeSignalSettings\nScteFilter\nScteHls\nScteMarkersSource\nSdkConfigurationProperty\nSdkName\nSdkResponse\nSdkType\nSdkTypes\nSdrReferenceWhiteLevel\nSdtInterval\nSearch\nSearchAddressBooksRequest\nSearchAddressBooksResponse\nSearchAnalysesRequest\nSearchAnalysesResponse\nSearchAssociatedTranscriptsRequest\nSearchAssociatedTranscriptsResponse\nSearchAvailablePhoneNumbersRequest\nSearchAvailablePhoneNumbersResponse\nSearchCasesRequest\nSearchCasesResponse\nSearchCasesResponseItem\nSearchChannelsRequest\nSearchChannelsResponse\nSearchCollectionTypes\nSearchContactsRequest\nSearchContactsResponse\nSearchContentRequest\nSearchContentResponse\nSearchCriteria\nSearchDashboardsRequest\nSearchDashboardsResponse\nSearchDataSetsRequest\nSearchDataSetsResponse\nSearchDataSourcesRequest\nSearchDataSourcesResponse\nSearchDatabasesByLFTagsRequest\nSearchDatabasesByLFTagsResponse\nSearchDevicesFilter\nSearchDevicesRequest\nSearchDevicesResponse\nSearchEnabled\nSearchEntitiesRequest\nSearchEntitiesResponse\nSearchException\nSearchExpression\nSearchFacesByImageRequest\nSearchFacesByImageResponse\nSearchFacesRequest\nSearchFacesResponse\nSearchField\nSearchFilter\nSearchFlowExecutionsRequest\nSearchFlowExecutionsResponse\nSearchFlowTemplatesRequest\nSearchFlowTemplatesResponse\nSearchFoldersRequest\nSearchFoldersResponse\nSearchForPositionResult\nSearchForSuggestionsResult\nSearchForTextResult\nSearchGameSessionsInput\nSearchGameSessionsOutput\nSearchGroupsRequest\nSearchGroupsResponse\nSearchHoursOfOperationsRequest\nSearchHoursOfOperationsResponse\nSearchImageSetsRequest\nSearchImageSetsResponse\nSearchIndexRequest\nSearchIndexResponse\nSearchInput\nSearchInsightsFilters\nSearchInsightsRequest\nSearchInsightsResponse\nSearchInstanceCount\nSearchInstanceType\nSearchJobsFilter\nSearchJobsRequest\nSearchJobsResponse\nSearchKey\nSearchLocalGatewayRoutesRequest\nSearchLocalGatewayRoutesResult\nSearchNetworkProfilesRequest\nSearchNetworkProfilesResponse\nSearchOptions\nSearchOrganizationInsightsFilters\nSearchOrganizationInsightsRequest\nSearchOrganizationInsightsResponse\nSearchOutput\nSearchPartitionCount\nSearchPlaceIndexForPositionRequest\nSearchPlaceIndexForPositionResponse\nSearchPlaceIndexForPositionSummary\nSearchPlaceIndexForSuggestionsRequest\nSearchPlaceIndexForSuggestionsResponse\nSearchPlaceIndexForSuggestionsSummary\nSearchPlaceIndexForTextRequest\nSearchPlaceIndexForTextResponse\nSearchPlaceIndexForTextSummary\nSearchPrincipalType\nSearchProductsAsAdminInput\nSearchProductsAsAdminOutput\nSearchProductsInput\nSearchProductsOutput\nSearchProfilesRequest\nSearchProfilesResponse\nSearchPromptsRequest\nSearchPromptsResponse\nSearchProvisionedProductsInput\nSearchProvisionedProductsOutput\nSearchQuantumTasksFilter\nSearchQuantumTasksRequest\nSearchQuantumTasksResponse\nSearchQuery\nSearchQueuesRequest\nSearchQueuesResponse\nSearchQuickConnectsRequest\nSearchQuickConnectsResponse\nSearchRasterDataCollectionInput\nSearchRasterDataCollectionOutput\nSearchRecord\nSearchRelatedItemsRequest\nSearchRelatedItemsResponse\nSearchRelatedItemsResponseItem\nSearchRequest\nSearchResourceTagsRequest\nSearchResourceTagsResponse\nSearchResourcesBucketCriteria\nSearchResourcesCriteria\nSearchResourcesCriteriaBlock\nSearchResourcesInput\nSearchResourcesOutput\nSearchResourcesRequest\nSearchResourcesResponse\nSearchResourcesSimpleCriterion\nSearchResourcesSortCriteria\nSearchResourcesTagCriterion\nSearchResourcesTagCriterionPair\nSearchResponse\nSearchRoomsRequest\nSearchRoomsResponse\nSearchRoutingProfilesRequest\nSearchRoutingProfilesResponse\nSearchSchemaSummary\nSearchSchemaVersionSummary\nSearchSchemasRequest\nSearchSchemasResponse\nSearchSecurityProfilesRequest\nSearchSecurityProfilesResponse\nSearchService\nSearchSessionsRequest\nSearchSessionsResponse\nSearchSkillGroupsRequest\nSearchSkillGroupsResponse\nSearchSlowLogs\nSearchSortResult\nSearchStatus\nSearchString\nSearchSystemInstancesRequest\nSearchSystemInstancesResponse\nSearchSystemTemplatesRequest\nSearchSystemTemplatesResponse\nSearchTablesByLFTagsRequest\nSearchTablesByLFTagsResponse\nSearchTablesRequest\nSearchTablesResponse\nSearchText\nSearchThingsRequest\nSearchThingsResponse\nSearchTransitGatewayMulticastGroupsRequest\nSearchTransitGatewayMulticastGroupsResult\nSearchTransitGatewayRoutesRequest\nSearchTransitGatewayRoutesResult\nSearchUsersByImageRequest\nSearchUsersByImageResponse\nSearchUsersRequest\nSearchUsersResponse\nSearchValue\nSearchVocabulariesRequest\nSearchVocabulariesResponse\nSearchVulnerabilitiesFilterCriteria\nSearchVulnerabilitiesRequest\nSearchVulnerabilitiesResponse\nSearchable\nSearchedFace\nSearchedFaceBoundingBox\nSearchedFaceConfidence\nSearchedFaceDetails\nSearchedFaceId\nSearchedLogStream\nSearchedUser\nSeasonality\nSecondBlockToken\nSecondSchemaVersionNumber\nSecondSnapshotId\nSecondary\nSecondaryAllocationIds\nSecondaryArtifacts\nSecondaryAvailabilityZone\nSecondaryBackground\nSecondaryBtn\nSecondaryEmail\nSecondaryForeground\nSecondaryGids\nSecondaryInputId\nSecondaryPrivateIpAddressCount\nSecondaryPrivateIpAddresses\nSecondaryStatus\nSecondaryStatusTransition\nSecondaryStatusTransitions\nSecondaryValue\nSecondaryValueFontConfiguration\nSecondaryValueOptions\nSecondaryYAxisDisplayOptions\nSecondaryYAxisLabelOptions\nSecondsBeforeTimeout\nSecondsUntilAutoPause\nSecret\nSecretAccessKey\nSecretArn\nSecretArnList\nSecretBinary\nSecretCode\nSecretHash\nSecretId\nSecretKey\nSecretList\nSecretListEntry\nSecretManagerArn\nSecretOptions\nSecretStatus\nSecretString\nSecretStringKey\nSecretToAuthenticateInitiator\nSecretToAuthenticateTarget\nSecretToken\nSecretVersionsListEntry\nSecretVersionsToStages\nSecrets\nSecretsManagerAccessRoleArn\nSecretsManagerAccessTokenConfiguration\nSecretsManagerArn\nSecretsManagerOracleAsmAccessRoleArn\nSecretsManagerOracleAsmSecretId\nSecretsManagerSecretConfiguration\nSecretsManagerSecretId\nSecretsManagerSecretResourceData\nSecretsManagerSecurityDbEncryptionAccessRoleArn\nSecretsManagerSecurityDbEncryptionSecretId\nSecretsRoleArn\nSection\nSectionAfterPageBreak\nSectionBased\nSectionBasedLayout\nSectionBasedLayoutCanvasSizeOptions\nSectionBasedLayoutConfiguration\nSectionBasedLayoutPaperCanvasSizeOptions\nSectionId\nSectionLayoutConfiguration\nSectionModification\nSectionPageBreakConfiguration\nSectionStyle\nSectionalElement\nSections\nSecure\nSecurityConfig\nSecurityConfigDetail\nSecurityConfigStats\nSecurityConfigSummary\nSecurityConfiguration\nSecurityConfigurationSummary\nSecurityConfigurations\nSecurityContext\nSecurityControl\nSecurityControlArn\nSecurityControlDefinition\nSecurityControlDefinitions\nSecurityControlId\nSecurityControlIds\nSecurityControlStatus\nSecurityControls\nSecurityDbEncryption\nSecurityDbEncryptionName\nSecurityDescriptorCopyFlags\nSecurityDetails\nSecurityGroup\nSecurityGroupArns\nSecurityGroupId\nSecurityGroupIdForDomainBoundary\nSecurityGroupIdList\nSecurityGroupIdSet\nSecurityGroupIdUpdates\nSecurityGroupIdentifier\nSecurityGroupIds\nSecurityGroupLimitExceeded\nSecurityGroupMembership\nSecurityGroupNotFound\nSecurityGroupReference\nSecurityGroupReferenceSet\nSecurityGroupRemediationAction\nSecurityGroupRule\nSecurityGroupRuleDescription\nSecurityGroupRuleDescriptions\nSecurityGroupRuleId\nSecurityGroupRuleIds\nSecurityGroupRuleRequest\nSecurityGroupRuleUpdate\nSecurityGroupRules\nSecurityGroupSet\nSecurityGroups\nSecurityHeadersConfig\nSecurityHubConfiguration\nSecurityKey\nSecurityKeys\nSecurityNonCompliantCount\nSecurityPolicy\nSecurityPolicyDetail\nSecurityPolicyName\nSecurityPolicyNames\nSecurityPolicyStats\nSecurityPolicySummary\nSecurityProfile\nSecurityProfileArn\nSecurityProfileId\nSecurityProfileIdentifier\nSecurityProfileIds\nSecurityProfileName\nSecurityProfileSearchCriteria\nSecurityProfileSearchSummary\nSecurityProfileSummary\nSecurityProfileSummaryList\nSecurityProfileTarget\nSecurityProfileTargetMapping\nSecurityProfiles\nSecurityProfilesSearchFilter\nSecurityProtocol\nSecurityServicePolicyData\nSecurityServiceType\nSecurityStyle\nSecurityToken\nSecurityType\nSeed\nSeedUrlConfiguration\nSeedUrls\nSegment\nSegmentBehaviors\nSegmentCondition\nSegmentControl\nSegmentDeliveryConfiguration\nSegmentDeliveryConfigurations\nSegmentDemographics\nSegmentDetection\nSegmentDimensions\nSegmentDuration\nSegmentDurationSeconds\nSegmentGroup\nSegmentGroupList\nSegmentGroups\nSegmentId\nSegmentImportResource\nSegmentLength\nSegmentLengthControl\nSegmentLocation\nSegmentModifier\nSegmentName\nSegmentNum\nSegmentNumber\nSegmentOverride\nSegmentPrefix\nSegmentReference\nSegmentResponse\nSegmentStartCondition\nSegmentTemplateFormat\nSegmentType\nSegmentTypeInfo\nSegmentTypes\nSegmentVersion\nSegmentationCancelIndicator\nSegmentationDescriptor\nSegmentationDescriptorScte35DescriptorSettings\nSegmentationDescriptors\nSegmentationDuration\nSegmentationEventId\nSegmentationMarkers\nSegmentationMode\nSegmentationStyle\nSegmentationTime\nSegmentationTypeId\nSegmentationUpid\nSegmentationUpidType\nSegments\nSegmentsExpected\nSegmentsPerSubdirectory\nSegmentsReceivedCount\nSegmentsRejectedCount\nSegmentsResponse\nSegmentsSentCount\nSegmentsSpilloverCount\nSelect\nSelectAggregateResourceConfigRequest\nSelectAggregateResourceConfigResponse\nSelectAllOptions\nSelectAllValueOptions\nSelectAttributesActivity\nSelectColumn\nSelectFields\nSelectFromCollection\nSelectObjectContentOutput\nSelectObjectContentRequest\nSelectParameters\nSelectResourceConfigRequest\nSelectResourceConfigResponse\nSelectSqlQuery\nSelectableValues\nSelectedBinType\nSelectedBorderStyle\nSelectedChoiceIds\nSelectedChoices\nSelectedColumns\nSelectedEngineVersion\nSelectedFieldOptions\nSelectedFields\nSelectedFieldsConfiguration\nSelectedOutputs\nSelectedPointStyle\nSelectedSegmentTypes\nSelectedSheets\nSelectedSheetsFilterScopeConfiguration\nSelectedStep\nSelectedSteps\nSelectedTooltipType\nSelectedVideoStreams\nSelectionCriteria\nSelectionId\nSelectionName\nSelectionRules\nSelectionScope\nSelectionStatus\nSelectiveAuth\nSelectiveExecutionConfig\nSelectiveExecutionResult\nSelector\nSelectorSettings\nSelectorType\nSelectors\nSelfManageResources\nSelfManagedActiveDirectoryAttributes\nSelfManagedActiveDirectoryConfiguration\nSelfManagedActiveDirectoryConfigurationUpdates\nSelfManagedEventSource\nSelfManagedKafkaAccessConfigurationVpc\nSelfManagedKafkaEventSourceConfig\nSelfManagedKafkaParameters\nSelfManagedOptOutsEnabled\nSelfServicePortal\nSelfServicePortalUrl\nSelfServiceSAMLProviderArn\nSelfServiceSamlProviderArn\nSelfUserProfile\nSelfservicePermissions\nSellerName\nSemanticEntityType\nSemanticType\nSemanticVersion\nSemtechGnss\nSemtechGnssConfiguration\nSemtechGnssDetail\nSendActivationCodeRequest\nSendAlexaOfferToMasterRequest\nSendAlexaOfferToMasterResponse\nSendAnnouncementRequest\nSendAnnouncementResponse\nSendApiAssetRequest\nSendApiAssetResponse\nSendAutomationSignalRequest\nSendBonusRequest\nSendBounceRequest\nSendBounceResponse\nSendBulkEmailRequest\nSendBulkEmailResponse\nSendBulkTemplatedEmailRequest\nSendBulkTemplatedEmailResponse\nSendChannelMessageRequest\nSendChannelMessageResponse\nSendCommandRequest\nSendCommandResult\nSendContactMethodVerificationRequest\nSendContactMethodVerificationResult\nSendCustomVerificationEmailRequest\nSendCustomVerificationEmailResponse\nSendDataPoint\nSendDataPoints\nSendDataToMulticastGroupRequest\nSendDataToMulticastGroupResponse\nSendDataToWirelessDeviceRequest\nSendDataToWirelessDeviceResponse\nSendDelayMs\nSendDiagnosticInterruptRequest\nSendEmail\nSendEmailNotification\nSendEmailRequest\nSendEmailResponse\nSendEventRequest\nSendEventResponse\nSendFilePaths\nSendHeartbeatRequest\nSendInvitationRequest\nSendMessageBatchRequest\nSendMessageBatchRequestEntry\nSendMessageBatchResult\nSendMessageBatchResultEntry\nSendMessageRequest\nSendMessageResponse\nSendMessageResult\nSendMessagesRequest\nSendMessagesResponse\nSendNotification\nSendNotificationAction\nSendNotificationActionDefinition\nSendOTPMessageRequest\nSendOTPMessageRequestParameters\nSendOTPMessageResponse\nSendPipelineExecutionStepFailureRequest\nSendPipelineExecutionStepFailureResponse\nSendPipelineExecutionStepSuccessRequest\nSendPipelineExecutionStepSuccessResponse\nSendProjectSessionActionRequest\nSendProjectSessionActionResponse\nSendQuota\nSendRawEmailRequest\nSendRawEmailResponse\nSendSSHPublicKeyRequest\nSendSSHPublicKeyResponse\nSendSerialConsoleSSHPublicKeyRequest\nSendSerialConsoleSSHPublicKeyResponse\nSendTaskFailureInput\nSendTaskHeartbeatInput\nSendTaskSuccessInput\nSendTemplatedEmailRequest\nSendTemplatedEmailResponse\nSendTestEventNotificationRequest\nSendTextMessageRequest\nSendTextMessageResult\nSendUsersMessageRequest\nSendUsersMessageResponse\nSendUsersMessagesRequest\nSendUsersMessagesResponse\nSendVoiceMessageRequest\nSendVoiceMessageResponse\nSendVoiceMessageResult\nSendWorkflowStepStateRequest\nSender\nSenderClientId\nSenderControlPort\nSenderFault\nSenderId\nSenderIdAndCountry\nSenderIdArn\nSenderIdFilter\nSenderIdInformation\nSenderIds\nSenderIpAddress\nSendingEnabled\nSendingIps\nSendingOptions\nSendingPausedException\nSendingPoolName\nSendingSchedule\nSensitive\nSensitiveData\nSensitiveDataDetections\nSensitiveDataItem\nSensitiveDataResult\nSensitivityAggregations\nSensitivityInspectionTemplateExcludes\nSensitivityInspectionTemplateIncludes\nSensitivityInspectionTemplatesEntry\nSensitivityLevel\nSensitivityThreshold\nSensor\nSensorName\nSensorStatisticsSummaries\nSensorStatisticsSummary\nSensorsWithShortDateRange\nSentLast24Hours\nSentTime\nSentiment\nSentimentAnalysisSettings\nSentimentConfiguration\nSentimentDetectionJobFilter\nSentimentDetectionJobProperties\nSentimentDetectionJobPropertiesList\nSentimentFilter\nSentimentResponse\nSentimentScore\nSentimentType\nSentiments\nSeparator\nSeparatorConfiguration\nSeq\nSequence\nSequenceInformation\nSequenceNumber\nSequenceNumberForOrdering\nSequenceNumberRange\nSequenceStoreDetail\nSequenceStoreFilter\nSerDeInfo\nSerde\nSerdeInfo\nSerial\nSerialConsoleAccessDisabledException\nSerialConsoleAccessEnabled\nSerialConsoleSessionLimitExceededException\nSerialConsoleSessionUnavailableException\nSerialNumber\nSerialPort\nSerializationLibrary\nSerializer\nSeries\nSeriesItem\nServeSignature\nServer\nServerArn\nServerCannotBeReplicatedException\nServerCertLastUpdated\nServerCertUri\nServerCertificate\nServerCertificateArn\nServerCertificateConfiguration\nServerCertificateConfigurations\nServerCertificateId\nServerCertificateMetadata\nServerCertificateMetadataList\nServerCertificateName\nServerCertificateScope\nServerCertificateSummary\nServerCertificates\nServerConfiguration\nServerDetail\nServerEndpoint\nServerError\nServerEvent\nServerEvents\nServerException\nServerGroup\nServerGroupLaunchConfiguration\nServerGroupReplicationConfiguration\nServerGroupValidationConfiguration\nServerHostname\nServerId\nServerInternalErrorException\nServerInternalException\nServerLaunchConfiguration\nServerLaunchParameters\nServerLaunchPath\nServerName\nServerNameToVerify\nServerOsType\nServerPath\nServerPort\nServerProcess\nServerProcesses\nServerProperties\nServerProtocol\nServerPublicKey\nServerReplicationConfiguration\nServerReplicationParameters\nServerRootCaCertificate\nServerSdkVersion\nServerShortInfoResponse\nServerShutdownException\nServerSideEncryption\nServerSideEncryptionByDefault\nServerSideEncryptionConfiguration\nServerSideEncryptionKmsKeyId\nServerSideEncryptionRule\nServerSideEncryptionUpdateDetails\nServerSideKmsKeyId\nServerSideTokenCheck\nServerStatusSummary\nServerStrategy\nServerSummary\nServerTimestamp\nServerTimezone\nServerTimingHeadersConfig\nServerTrust\nServerTunnelAddress\nServerUrl\nServerValidation\nServerValidationConfiguration\nServerValidationOutput\nServerless\nServerlessClientAuthentication\nServerlessConfig\nServerlessRequest\nServerlessSasl\nServerlessUpdateConfig\nServerlessV2ScalingConfiguration\nServerlessV2ScalingConfigurationInfo\nServers\nService\nServiceAccessRoleArn\nServiceAccessSecurityGroup\nServiceAccountCredentials\nServiceAccountException\nServiceAccountPassword\nServiceAccountUsername\nServiceActionAssociation\nServiceActionAssociations\nServiceActionDetail\nServiceActionId\nServiceActionParameters\nServiceActionSummaries\nServiceActionSummary\nServiceAdditionalInfo\nServiceAlreadyExists\nServiceArn\nServiceArnList\nServiceCatalogConfiguration\nServiceCatalogProvisionedProductDetails\nServiceCatalogProvisioningDetails\nServiceCatalogProvisioningUpdateDetails\nServiceChange\nServiceCode\nServiceCollection\nServiceConfiguration\nServiceConfigurations\nServiceConnectClientAlias\nServiceConnectConfiguration\nServiceConnectService\nServiceConnectServiceResource\nServiceCount\nServiceDescriptor\nServiceDetail\nServiceDetails\nServiceEndpoint\nServiceError\nServiceErrorId\nServiceErrorIds\nServiceErrors\nServiceEvent\nServiceException\nServiceExecutionRole\nServiceExecutionRoleUpdate\nServiceFailureException\nServiceFault\nServiceFilter\nServiceForecastStatistics\nServiceGraphEndTime\nServiceGraphStartTime\nServiceHealth\nServiceId\nServiceIdentifier\nServiceIds\nServiceInfo\nServiceInsightHealth\nServiceInstance\nServiceInstanceState\nServiceInstanceSummary\nServiceIntegration\nServiceIntegrationConfig\nServiceInternalErrorException\nServiceInternalException\nServiceJson\nServiceLastAccessed\nServiceLimit\nServiceLimitExceeded\nServiceLimitExceededException\nServiceLinkedRoleARN\nServiceLinkedRoleFailure\nServiceLinkedRoleLockClientException\nServiceLinkedRoleNotFoundFault\nServiceLocation\nServiceMetadata\nServiceName\nServiceNameAndResourceType\nServiceNames\nServiceNamespace\nServiceNamespaces\nServiceNetworkServiceAssociationSummary\nServiceNetworkSummary\nServiceNetworkVpcAssociationSummary\nServiceNotActiveException\nServiceNotFound\nServiceNotFoundException\nServiceNotSupportedException\nServiceNow\nServiceNowBuildVersion\nServiceNowConfiguration\nServiceNowConnectorProfileCredentials\nServiceNowConnectorProfileProperties\nServiceNowKnowledgeArticleConfiguration\nServiceNowParameters\nServiceNowServiceCatalogConfiguration\nServiceNowSourceProperties\nServiceObservabilityConfiguration\nServicePack\nServicePassword\nServicePermissionId\nServicePipeline\nServicePipelineState\nServicePrincipal\nServicePrincipalName\nServicePrincipalNameSummary\nServicePrincipalNames\nServiceProcessingTimeInMillis\nServiceProfile\nServiceProfileId\nServiceProfileList\nServiceProviderName\nServiceProviderSamlMetadata\nServiceQuota\nServiceQuotaExceededException\nServiceQuotaIncreaseRequestInTemplate\nServiceQuotaIncreaseRequestInTemplateList\nServiceQuotaTemplateAssociationStatus\nServiceQuotaTemplateNotInUseException\nServiceRegistries\nServiceRegistry\nServiceResourceCost\nServiceRole\nServiceRoleArn\nServiceSetting\nServiceSettingNotFound\nServiceSize\nServiceSoftwareOptions\nServiceSpecificCredential\nServiceSpecificCredentialId\nServiceSpecificCredentialMetadata\nServiceSpecificCredentials\nServiceSpecification\nServiceState\nServiceStatistics\nServiceSummary\nServiceSummaryList\nServiceSummaryStatistics\nServiceSyncBlockerSummary\nServiceSyncConfig\nServiceTemplate\nServiceTemplateSummary\nServiceTemplateVersion\nServiceTemplateVersionSummary\nServiceTemporarilyUnavailableException\nServiceType\nServiceTypeDetail\nServiceUnavailable\nServiceUnavailableError\nServiceUnavailableException\nServiceUpdate\nServiceUpdateDescription\nServiceUpdateEndDate\nServiceUpdateName\nServiceUpdateNameToApply\nServiceUpdateNotFoundFault\nServiceUpdateRecommendedApplyByDate\nServiceUpdateReleaseDate\nServiceUpdateRequest\nServiceUpdateSeverity\nServiceUpdateStatus\nServiceUpdateTimeRange\nServiceUpdateType\nServiceUpdates\nServiceUpdatesMessage\nServiceUrl\nServiceUserName\nServiceVersion\nServiceVersions\nServices\nServicesLastAccessed\nSession\nSessionAlreadyExistsException\nSessionArn\nSessionCap\nSessionCommand\nSessionConfiguration\nSessionContext\nSessionContextAttributes\nSessionCookieName\nSessionData\nSessionDataSortBy\nSessionDuration\nSessionExpirationDurationInSeconds\nSessionExpiredException\nSessionFilter\nSessionId\nSessionIdleTimeoutInMinutes\nSessionInitializationEndpointPrefix\nSessionIntegrationConfiguration\nSessionIssuer\nSessionKeyAmex\nSessionKeyDerivationAttributes\nSessionKeyDerivationMode\nSessionKeyDerivationValue\nSessionKeyEmv2000\nSessionKeyEmvCommon\nSessionKeyMastercard\nSessionKeyVisa\nSessionKeys\nSessionKeysAbpV1_0_x\nSessionKeysAbpV1_1\nSessionLifetimeInMinutes\nSessionLifetimeInMinutesInvalidException\nSessionManagerOutputUrl\nSessionMapping\nSessionMappingDetail\nSessionMappingSummary\nSessionMappings\nSessionName\nSessionNameOrId\nSessionNotFoundException\nSessionNumber\nSessionPinningFilters\nSessionPolicyArn\nSessionSampleRate\nSessionScriptS3Location\nSessionSpecification\nSessionStartTime\nSessionState\nSessionStatistics\nSessionStatus\nSessionStickinessConfig\nSessionSummary\nSessionTag\nSessionTags\nSessionTimeout\nSessionTimeoutHours\nSessionTimeoutMinutes\nSessionToken\nSessions\nSet\nSetActiveReceiptRuleSetRequest\nSetAlarmStateInput\nSetAsDefault\nSetCognitoEventsRequest\nSetDataCaptureChanges\nSetDataRetrievalPolicyInput\nSetDefaultAuthorizerRequest\nSetDefaultAuthorizerResponse\nSetDefaultMessageTypeRequest\nSetDefaultMessageTypeResult\nSetDefaultPermissionVersionRequest\nSetDefaultPermissionVersionResponse\nSetDefaultPolicyVersionRequest\nSetDefaultSenderIdRequest\nSetDefaultSenderIdResult\nSetDesiredCapacityType\nSetDimension\nSetEndpointAttributesInput\nSetFileModeEntry\nSetGatewayBridgeSourceRequest\nSetId\nSetIdentifier\nSetIdentityDkimEnabledRequest\nSetIdentityFeedbackForwardingEnabledRequest\nSetIdentityHeadersInNotificationsEnabledRequest\nSetIdentityMailFromDomainRequest\nSetIdentityNotificationTopicRequest\nSetIdentityPoolConfigurationRequest\nSetIdentityPoolConfigurationResponse\nSetIdentityPoolRolesInput\nSetInstanceHealthQuery\nSetInstanceProtectionQuery\nSetIpAddressTypeInput\nSetIpAddressTypeOutput\nSetIpAddressTypeRequest\nSetIpAddressTypeResult\nSetLoadBalancerListenerSSLCertificateInput\nSetLoadBalancerPoliciesForBackendServerInput\nSetLoadBalancerPoliciesOfListenerInput\nSetLoadBasedAutoScalingRequest\nSetLocalConsolePasswordInput\nSetLocalConsolePasswordOutput\nSetLogDeliveryConfigurationRequest\nSetLogDeliveryConfigurationResponse\nSetLoggingOptionsRequest\nSetName\nSetParameterValueConfiguration\nSetParametersOperation\nSetPermissionRequest\nSetPlatformApplicationAttributesInput\nSetPrincipalTagAttributeMapInput\nSetPrincipalTagAttributeMapResponse\nSetQueueAttributesRequest\nSetReceiptRulePositionRequest\nSetRepositoryPolicyRequest\nSetRepositoryPolicyResponse\nSetResourceAccessForBucketRequest\nSetResourceAccessForBucketResult\nSetRiskConfigurationRequest\nSetRiskConfigurationResponse\nSetRulePrioritiesInput\nSetRulePrioritiesOutput\nSetSMBGuestPasswordInput\nSetSMBGuestPasswordOutput\nSetSMSAttributesInput\nSetSecurityGroupsInput\nSetSecurityGroupsOutput\nSetSecurityTokenServicePreferencesRequest\nSetSourceRequest\nSetStackPolicyInput\nSetStatOption\nSetStatusInput\nSetSubnetsInput\nSetSubnetsOutput\nSetSubscriptionAttributesInput\nSetTagsForResourceRequest\nSetTaskStatusInput\nSetTerminationProtectionInput\nSetTextMessageSpendLimitOverrideRequest\nSetTextMessageSpendLimitOverrideResult\nSetTimeBasedAutoScalingRequest\nSetTimerAction\nSetTopicAttributesInput\nSetTypeConfigurationInput\nSetTypeConfigurationOutput\nSetTypeDefaultVersionInput\nSetUICustomizationRequest\nSetUICustomizationResponse\nSetUserMFAPreferenceRequest\nSetUserPoolMfaConfigRequest\nSetUserPoolMfaConfigResponse\nSetUserSettingsRequest\nSetV2LoggingLevelRequest\nSetV2LoggingOptionsRequest\nSetVariableAction\nSetVaultAccessPolicyInput\nSetVaultNotificationsInput\nSetVisibleToAllUsersInput\nSetVoiceMessageSpendLimitOverrideRequest\nSetVoiceMessageSpendLimitOverrideResult\nSetting\nSettingDescription\nSettingEntries\nSettingEntry\nSettingId\nSettingName\nSettingValue\nSettings\nSettingsForUpdate\nSettingsGroup\nSetup\nSetupFailed\nSetupModeDisabled\nSetupScriptDetails\nSevere\nSeverities\nSeverity\nSeverityCounts\nSeverityLabel\nSeverityLevel\nSeverityNormalized\nSeverityProduct\nSeverityRating\nSeveritySummary\nSeverityUpdate\nSftpAuthenticationMethods\nSftpConfig\nSftpConnectorConfig\nSha1\nShadowColor\nShadowModeConfig\nShadowModelVariantConfig\nShadowModelVariantName\nShadowModelVariants\nShadowOpacity\nShadowProductionVariants\nShadowXOffset\nShadowYOffset\nShapBaseline\nShapBaselineConfig\nShapBaselineUri\nShapConfig\nShape\nShapeConditionalFormat\nShard\nShardConfiguration\nShardConfigurationRequest\nShardCount\nShardDetail\nShardFilter\nShardId\nShardIterator\nShardIteratorType\nShardLevelMetrics\nShardLimit\nShardName\nShardNotFoundFault\nShardToMerge\nShardToSplit\nShards\nShardsPerClusterQuotaExceededFault\nShareAttributes\nShareDetails\nShareDirectoryRequest\nShareDirectoryResult\nShareError\nShareErrors\nShareId\nShareInvitation\nShareInvitationAction\nShareInvitationId\nShareInvitationSummaries\nShareInvitationSummary\nShareLimitExceededException\nShareMethod\nShareNotes\nSharePointConfiguration\nSharePointVersion\nSharePrincipal\nSharePrincipals\nShareResourceType\nShareResult\nShareResults\nShareRule\nShareRules\nShareStatus\nShareTagOptions\nShareTarget\nSharedAccountId\nSharedAwsAccountIds\nSharedBy\nSharedDirectories\nSharedDirectory\nSharedDirectoryId\nSharedDirectoryIds\nSharedDocumentVersion\nSharedFileSystemConfiguration\nSharedImagePermissions\nSharedImagePermissionsList\nSharedMemorySize\nSharedRoutesEnabled\nSharedSecret\nSharedSegments\nSharedSnapshotQuotaExceededFault\nSharedWith\nSharedWithPrefix\nSharingModel\nSharingSettings\nSharpening\nSharpness\nSheet\nSheetContentType\nSheetControlInfoIconLabelOptions\nSheetControlLayout\nSheetControlLayoutConfiguration\nSheetControlLayouts\nSheetControlsOption\nSheetDefinition\nSheetElementConfigurationOverrides\nSheetElementRenderingRule\nSheetId\nSheetIndexes\nSheetLayoutElementMaximizationOption\nSheetNames\nSheetSelections\nSheetStyle\nSheetTextBox\nSheetTextBoxId\nSheetVisualScopingConfiguration\nSheetVisualScopingConfigurations\nSheets\nShellHistoryFilePath\nShellVersion\nShiftCoverages\nShiftDetails\nShipment\nShipmentCarrier\nShipmentInformation\nShipmentState\nShipmentTrackingNumber\nShippingAddress\nShippingDetails\nShippingOption\nShortCode\nShortDescription\nShortFormatText\nShortName\nShortened\nShortname\nShotFilter\nShotSegment\nShouldDecrementDesiredCapacity\nShouldRespectGracePeriod\nShow\nShowAlternatives\nShowAssignedLFTags\nShowCacheClustersNotInReplicationGroups\nShowCacheNodeInfo\nShowDetail\nShowMemberInfo\nShowNodeGroupConfig\nShowNodeLevelUpdateStatus\nShowShardDetails\nShowSpeakerLabel\nShowSpeakerLabels\nShrinkPolicy\nShuffleConfig\nShutdown\nShutdownEventConfiguration\nShutdownGatewayInput\nShutdownGatewayOutput\nShuttingDown\nSid\nSideSpecificBorder\nSidewalk\nSidewalkAccountInfo\nSidewalkAccountInfoWithFingerprint\nSidewalkCreateWirelessDevice\nSidewalkDevice\nSidewalkDeviceMetadata\nSidewalkEventNotificationConfigurations\nSidewalkGetDeviceProfile\nSidewalkGetStartImportInfo\nSidewalkId\nSidewalkListDevice\nSidewalkManufacturingSn\nSidewalkResourceTypeEventConfiguration\nSidewalkSendDataToDevice\nSidewalkSingleStartImportInfo\nSidewalkStartImportInfo\nSidewalkUpdateAccount\nSidewalkUpdateImportInfo\nSigKeyCrc\nSigV4Authorization\nSign\nSignInConfig\nSignInDistribution\nSignInMethod\nSignInUrl\nSignInWithApple\nSignKey\nSignOutUserRequest\nSignPayloadRequest\nSignPayloadResponse\nSignRequest\nSignResponse\nSignUpRequest\nSignUpResponse\nSignal\nSignalApplicationInstanceNodeInstancesRequest\nSignalApplicationInstanceNodeInstancesResponse\nSignalCatalogSummary\nSignalDecoder\nSignalExternalWorkflowExecutionDecisionAttributes\nSignalExternalWorkflowExecutionFailedEventAttributes\nSignalExternalWorkflowExecutionInitiatedEventAttributes\nSignalInformation\nSignalProcessingNotification\nSignalResourceInput\nSignalType\nSignalWorkflowExecutionInput\nSignalingUrl\nSignature\nSignatureAlgorithm\nSignatureDetection\nSignatureDetections\nSignatureValid\nSignatureValidityPeriod\nSigned\nSignedCert\nSignedHeaders\nSignedObject\nSignedToken\nSignedUrl\nSignedUrlExpiresAt\nSigner\nSigninDelegateGroup\nSigninDelegateGroups\nSigningAlg\nSigningAlgorithm\nSigningAlgorithmMnemonic\nSigningAlgorithmType\nSigningAlgorithms\nSigningAttributes\nSigningAttributesOrigin\nSigningBehavior\nSigningCertificate\nSigningConfiguration\nSigningConfigurationOverrides\nSigningEnabled\nSigningImageFormat\nSigningJob\nSigningJobArn\nSigningJobRevocationRecord\nSigningKeyAlgorithm\nSigningKeyCertificate\nSigningKeyCertificateChain\nSigningMaterial\nSigningPlatform\nSigningPlatformOverrides\nSigningProfile\nSigningProfileParameter\nSigningProfileRevocationRecord\nSigningProfileVersionArn\nSigningProfileVersionArns\nSigningProtocol\nSignupResponse\nSilentPush\nSimilarity\nSimilarityThreshold\nSimple\nSimpleAddress\nSimpleAttributeAggregation\nSimpleClusterMarker\nSimpleCondition\nSimpleCriterionForJob\nSimpleEmail\nSimpleEmailPart\nSimpleNumericalAggregation\nSimpleRule\nSimpleRuleEvaluation\nSimpleScalingPolicyConfiguration\nSimpleScopeTerm\nSimpleUser\nSimplifiedApplication\nSimplifiedColor\nSimulateCustomPolicyRequest\nSimulatePolicyResponse\nSimulatePrincipalPolicyRequest\nSimulateReservedQueue\nSimulation\nSimulationAppEndpointInfo\nSimulationAppMetadata\nSimulationAppPortMapping\nSimulationApplicationConfig\nSimulationApplicationSummary\nSimulationClock\nSimulationJob\nSimulationJobBatchSummary\nSimulationJobRequest\nSimulationJobSummary\nSimulationMetadata\nSimulationSoftwareSuite\nSimulations\nSinceCrawlDate\nSingleAvailabilityZone\nSingleHeader\nSingleHeaderConfig\nSingleInstanceHealth\nSingleInstanceType\nSingleMasterChannelEndpointConfiguration\nSingleMasterConfiguration\nSingleMetricAnomalyDetector\nSingleMetricVisibility\nSingleQueryArgument\nSingleSelectOptions\nSingleSelectQuestionRuleCategoryAutomation\nSingleSignOnManagedApplicationInstanceId\nSingleSignOnUserIdentifier\nSingleSignOnUserValue\nSingleWeightConfig\nSingular\nSingularConnectorProfileCredentials\nSingularConstant\nSingularSourceProperties\nSinkArn\nSinkId\nSinkIdentifier\nSinkType\nSinks\nSipAddress\nSipAddresses\nSipHeaders\nSipMediaApplication\nSipMediaApplicationAlexaSkillConfiguration\nSipMediaApplicationArn\nSipMediaApplicationCall\nSipMediaApplicationEndpoint\nSipMediaApplicationId\nSipMediaApplicationLoggingConfiguration\nSipMediaApplications\nSipRule\nSipRuleId\nSipRuleTargetApplication\nSipRules\nSite\nSiteArn\nSiteBaseUrl\nSiteId\nSiteIds\nSiteMaps\nSiteMapsConfiguration\nSitePlan\nSiteToSiteVpnAttachment\nSiteUrl\nSites\nSize\nSizeBytes\nSizeClassified\nSizeConstraint\nSizeConstraintSet\nSizeConstraintSetId\nSizeConstraintSetSummary\nSizeConstraintSetUpdate\nSizeConstraintSets\nSizeConstraintStatement\nSizeConstraints\nSizeEstimateRangeGB\nSizeFlexEligible\nSizeInBytes\nSizeInGB\nSizeInMBs\nSizeInMegabytes\nSizeInMiB\nSizeLabelOptions\nSizeOnDisk\nSizePercent\nSizeRange\nSizeUnit\nSizes\nSizingOptions\nSizingPolicy\nSkewedColumnNames\nSkewedColumnValueLocationMaps\nSkewedColumnValues\nSkewedInfo\nSkillDetails\nSkillGroup\nSkillGroupArn\nSkillGroupData\nSkillGroupName\nSkillGroups\nSkillId\nSkillName\nSkillNotLinkedException\nSkillSummaries\nSkillSummary\nSkillType\nSkillTypes\nSkillsStoreSkill\nSkillsStoreSkills\nSkipArchive\nSkipCheck\nSkipDestinationValidation\nSkipFinalBackup\nSkipFinalClusterSnapshot\nSkipFinalSnapshot\nSkipFirst\nSkipMatching\nSkipModelValidation\nSkipTunnelReplacement\nSkipUnavailable\nSkipWaitTimeForInstanceTerminationInput\nSkipped\nSkippedIPRangeList\nSkippedRecordCount\nSkippedTermCount\nSkippedUsers\nSkippedVolumeDetails\nSku\nSlaMet\nSlack\nSlackChannelConfiguration\nSlackConfiguration\nSlackConnectorProfileCredentials\nSlackConnectorProfileProperties\nSlackEntityList\nSlackMetadata\nSlackSourceProperties\nSlackWorkspaceConfiguration\nSlate\nSlateAdUrl\nSlateSource\nSlaveInstanceType\nSlices\nSlider\nSliderControlDisplayOptions\nSlot\nSlotCaptureSetting\nSlotDateTimeRangeRequest\nSlotDefaultValue\nSlotDefaultValueSpec\nSlotDefaultValueSpecification\nSlotDurationInHours\nSlotFilter\nSlotMigration\nSlotName\nSlotNotAvailableException\nSlotPriority\nSlotResolutionTestResultItem\nSlotResolutionTestResultItemCounts\nSlotSortBy\nSlotStartTimeRange\nSlotStartTimeRangeRequest\nSlotSuggestions\nSlotSummary\nSlotTypeConfiguration\nSlotTypeFilter\nSlotTypeMetadata\nSlotTypeRegexConfiguration\nSlotTypeSortBy\nSlotTypeStatistics\nSlotTypeSummary\nSlotTypeValue\nSlotValue\nSlotValueElicitationSetting\nSlotValueOverride\nSlotValueRegexFilter\nSlotValueSelectionSetting\nSlots\nSlowDownException\nSlowPal\nSmallImageIconUrl\nSmallMultiples\nSmallMultiplesAxisProperties\nSmallMultiplesLimitConfiguration\nSmallMultiplesOptions\nSmallMultiplesSort\nSmartHomeAppliance\nSmartHomeAppliances\nSmb\nSmbMountOptions\nSmile\nSmoothStreaming\nSmoothingLatency\nSmpte2038DataPreference\nSmpteTtDestinationSettings\nSmsAuthenticationMessage\nSmsConfiguration\nSmsConfigurationFailure\nSmsConfigurationType\nSmsMessage\nSmsMfaConfigType\nSmsMfaConfiguration\nSmsSettings\nSmsVerificationMessage\nSmtpReplyCode\nSnapShotTimeFilter\nSnapStart\nSnapStartException\nSnapStartNotReadyException\nSnapStartResponse\nSnapStartTimeoutException\nSnaplockConfiguration\nSnaplockRetentionPeriod\nSnaplockType\nSnappedDeparturePositions\nSnappedDestinationPositions\nSnapshot\nSnapshotARN\nSnapshotAlreadyExistsFault\nSnapshotAnonymousUser\nSnapshotAnonymousUserRedacted\nSnapshotArn\nSnapshotArns\nSnapshotCapacityUsed\nSnapshotClusterIdentifier\nSnapshotConfiguration\nSnapshotCopyAlreadyDisabledFault\nSnapshotCopyAlreadyEnabledFault\nSnapshotCopyDisabledFault\nSnapshotCopyGrant\nSnapshotCopyGrantAlreadyExistsFault\nSnapshotCopyGrantMessage\nSnapshotCopyGrantName\nSnapshotCopyGrantNotFoundFault\nSnapshotCopyGrantQuotaExceededFault\nSnapshotCopyGrants\nSnapshotCreateTime\nSnapshotCreationTime\nSnapshotCreationTimestamp\nSnapshotDatabaseTime\nSnapshotDescription\nSnapshotDestinationConfiguration\nSnapshotDetail\nSnapshotDetails\nSnapshotDiskContainer\nSnapshotDownloadUrl\nSnapshotErrorMessage\nSnapshotFeatureNotSupportedFault\nSnapshotFile\nSnapshotFileGroup\nSnapshotFileSheetSelection\nSnapshotFilter\nSnapshotId\nSnapshotIdentifier\nSnapshotIdentifierList\nSnapshotIds\nSnapshotInfo\nSnapshotJobErrorInfo\nSnapshotJobId\nSnapshotJobResult\nSnapshotJobResultErrorInfo\nSnapshotJobResultFileGroup\nSnapshotJobS3Result\nSnapshotLimitExceededException\nSnapshotLimits\nSnapshotMessage\nSnapshotName\nSnapshotNotFound\nSnapshotNotFoundFault\nSnapshotOptions\nSnapshotOptionsStatus\nSnapshotOwner\nSnapshotPolicy\nSnapshotQuotaExceededFault\nSnapshotRecycleBinInfo\nSnapshotRetentionLimit\nSnapshotRetentionStartTime\nSnapshotS3DestinationConfiguration\nSnapshotS3Location\nSnapshotSchedule\nSnapshotScheduleAlreadyExistsFault\nSnapshotScheduleIdentifier\nSnapshotScheduleNotFoundFault\nSnapshotScheduleQuotaExceededFault\nSnapshotScheduleState\nSnapshotScheduleUpdateInProgressFault\nSnapshotSchedules\nSnapshotSizeInMegaBytes\nSnapshotSortingEntity\nSnapshotSource\nSnapshotStatus\nSnapshotSummaries\nSnapshotSummary\nSnapshotTarget\nSnapshotTaskDetail\nSnapshotTierStatus\nSnapshotTierStatuses\nSnapshotTime\nSnapshotType\nSnapshotUserConfiguration\nSnapshotUserConfigurationRedacted\nSnapshotVersion\nSnapshotWindow\nSnapshots\nSnapshotsData\nSnapshotsDataHeader\nSnapshotsEnabled\nSnapshotsEnabledUpdate\nSnapshottingClusterId\nSnoozeActionConfiguration\nSnoozeAlarmActionRequest\nSnowballAmiId\nSnowballCapacityPreference\nSnowballId\nSnowballLimit\nSnowballType\nSnowballsInUse\nSnowconeDeviceConfiguration\nSnowflake\nSnowflakeConnectorProfileCredentials\nSnowflakeConnectorProfileProperties\nSnowflakeDestinationProperties\nSnowflakeMetadata\nSnowflakeNodeData\nSnowflakeParameters\nSnowflakeSource\nSnowflakeTarget\nSnr\nSns\nSnsAction\nSnsCallerArn\nSnsChannelConfig\nSnsConfiguration\nSnsDataSource\nSnsDestination\nSnsFormat\nSnsRegion\nSnsRoleName\nSnsTopic\nSnsTopicARN\nSnsTopicArn\nSnsTopicConfiguration\nSnsTopicName\nSnsTopicSinkConfiguration\nSnsTopicStatus\nSocialProviderSettings\nSocketAddress\nSocketPath\nSockets\nSoftIRQ\nSoftLimit\nSoftness\nSoftware\nSoftwareDetails\nSoftwareInformation\nSoftwarePackage\nSoftwareToUpdate\nSoftwareTokenMFANotFoundException\nSoftwareTokenMfaConfigType\nSoftwareTokenMfaConfiguration\nSoftwareTokenMfaSettings\nSoftwareTokenMfaSettingsType\nSoftwareUpdateOptions\nSoftwareUpdateOptionsStatus\nSoftwareUpdatesEndDate\nSoftwareVersion\nSolid\nSolution\nSolutionConfig\nSolutionStackDescription\nSolutionStackDetails\nSolutionStackName\nSolutionStacks\nSolutionSummary\nSolutionVersion\nSolutionVersionSummary\nSolveTimestamp\nSolverProvider\nSolverType\nSolverVersion\nSolvers\nSopRecommendation\nSort\nSortAscending\nSortBy\nSortByMetric\nSortColumns\nSortCondition\nSortConfiguration\nSortCriteria\nSortCriterion\nSortDefinition\nSortDirection\nSortEnabled\nSortExpression\nSortIconVisibility\nSortKey\nSortOrder\nSortPaths\nSortProperty\nSortable\nSortingConfiguration\nSortingEntities\nSound\nSource\nSource608ChannelNumber\nSource608TrackNumber\nSourceARN\nSourceAccessConfiguration\nSourceAccessConfigurations\nSourceAccount\nSourceAccountId\nSourceAddress\nSourceAddresses\nSourceAlgorithm\nSourceAlgorithmSpecification\nSourceAlgorithms\nSourceAnalysis\nSourceAncillaryChannelNumber\nSourceAndDestinationAreSameException\nSourceApiAssociation\nSourceApiAssociationConfig\nSourceApiAssociationSummary\nSourceApplicationName\nSourceApplicationUrl\nSourceArn\nSourceArnPrefix\nSourceAuth\nSourceBackup\nSourceBackupArn\nSourceBackupId\nSourceBackupRegion\nSourceBackupUnavailable\nSourceBackupVaultArn\nSourceBackupVaultName\nSourceBranchName\nSourceBucket\nSourceBucketArn\nSourceBuildInformation\nSourceBundle\nSourceBundleDeletionException\nSourceCacheNodeId\nSourceCidrBlock\nSourceCloudProperties\nSourceCluster\nSourceClusterInfo\nSourceClusterNotSupportedFault\nSourceCode\nSourceCodeArchiveUrl\nSourceCodeArtifactsObjectKey\nSourceCodeRepository\nSourceCodeType\nSourceCodeUrl\nSourceCodeVersion\nSourceColumn\nSourceCommit\nSourceConfig\nSourceConfiguration\nSourceConnection\nSourceConnectionDetail\nSourceConnectionParameters\nSourceConnectorProperties\nSourceConnectorType\nSourceContactId\nSourceContainer\nSourceControlDetails\nSourceControls\nSourceCredentialsInfo\nSourceCustomDbEngineVersionIdentifier\nSourceDBClusterIdentifier\nSourceDBClusterParameterGroupIdentifier\nSourceDBClusterSnapshotArn\nSourceDBClusterSnapshotIdentifier\nSourceDBInstanceArn\nSourceDBInstanceAutomatedBackupsArn\nSourceDBInstanceIdentifier\nSourceDBParameterGroupIdentifier\nSourceDBSnapshotIdentifier\nSourceDataColumnProperties\nSourceDataProviderDescriptors\nSourceDatabaseName\nSourceDatabaseNotSupportedFault\nSourceDatasetArn\nSourceDbClusterResourceId\nSourceDbSnapshotIdentifier\nSourceDbiResourceId\nSourceDescription\nSourceDestCheck\nSourceDetail\nSourceDetails\nSourceDirectory\nSourceDocument\nSourceDocuments\nSourceDocumentsS3Uri\nSourceDomain\nSourceDomainInfo\nSourceEncryptionAlgorithm\nSourceEncryptionContext\nSourceEndBehavior\nSourceEndpointArn\nSourceEngine\nSourceEngineName\nSourceEngineVersion\nSourceEntity\nSourceEntityArn\nSourceEnvironmentId\nSourceEnvironmentName\nSourceFailoverConfig\nSourceField\nSourceFieldProperties\nSourceFields\nSourceFile\nSourceFileLocation\nSourceFileOrContentRequiredException\nSourceFileSpecifier\nSourceFileSystemArn\nSourceFileSystemId\nSourceFileSystemRegion\nSourceFiles\nSourceFilterId\nSourceFlowConfig\nSourceFpgaImageId\nSourceGroup\nSourceId\nSourceIdType\nSourceIdentifier\nSourceIdentity\nSourceIds\nSourceIdsList\nSourceImage\nSourceImageFace\nSourceImageId\nSourceImageName\nSourceImageOrientationCorrection\nSourceIp\nSourceIpConditionConfig\nSourceIpConfig\nSourceIpV4\nSourceIpV6\nSourceIpamPoolId\nSourceIps\nSourceItemsLimit\nSourceKeyId\nSourceKeyword\nSourceLanguageCode\nSourceLastUpdatedTimestampFormat\nSourceLayerArn\nSourceLayerHash\nSourceLicenseContext\nSourceListenerAddress\nSourceListenerPort\nSourceLocation\nSourceLocationArn\nSourceLocationName\nSourceMac\nSourceMember\nSourceMetadata\nSourceModelArn\nSourceModelVariantName\nSourceModelVersionArn\nSourceName\nSourceNetwork\nSourceNetworkData\nSourceNetworkInterfaceArns\nSourceNotFoundFault\nSourceObject\nSourceObjectReference\nSourceOptionGroup\nSourceOptionGroupIdentifier\nSourceParameterName\nSourceParameters\nSourceParentId\nSourceParentNotFoundException\nSourcePath\nSourcePhoneNumber\nSourcePipelineExecutionArn\nSourcePolicyId\nSourcePolicyType\nSourcePort\nSourcePortRange\nSourcePortRanges\nSourcePortfolioId\nSourcePorts\nSourcePrefix\nSourcePrefixLists\nSourcePriority\nSourceProductArn\nSourceProjectArn\nSourceProjectVersionArn\nSourceProperties\nSourceProvisioningArtifactIdentifiers\nSourceQueue\nSourceRecoveryPointArn\nSourceRefContains\nSourceRegion\nSourceRegionMessage\nSourceRegions\nSourceRepository\nSourceReservedNode\nSourceReservedNodeCount\nSourceReservedNodeId\nSourceReservedNodeType\nSourceResourceArn\nSourceResourceName\nSourceResourceType\nSourceResult\nSourceRevision\nSourceRoleArn\nSourceS3Location\nSourceS3Path\nSourceSchema\nSourceSchemaName\nSourceSecurityGroup\nSourceSecurityGroupName\nSourceSecurityGroupOwnerId\nSourceSegments\nSourceSelectionCriteria\nSourceServer\nSourceServerActionDocument\nSourceServerActionsRequestFilters\nSourceSettings\nSourceSheetControlId\nSourceSnapshotClusterIdentifier\nSourceSnapshotId\nSourceSnapshotIdentifier\nSourceSnapshotIds\nSourceSnapshotName\nSourceStackId\nSourceTable\nSourceTableArn\nSourceTableDetails\nSourceTableFeatureDetails\nSourceTableName\nSourceTemplate\nSourceText\nSourceType\nSourceTypes\nSourceURI\nSourceUpdateToken\nSourceUri\nSourceUrl\nSourceUser\nSourceUserIdentifier\nSourceVersion\nSourceVolume\nSourceVolumeARN\nSourceVpc\nSourceWatermarkStatus\nSourceWorkspaceId\nSources\nSouth\nSpace\nSpaceArn\nSpaceConfiguration\nSpaceDetails\nSpaceFieldMappings\nSpaceName\nSpaceNameContains\nSpaceNameEquals\nSpaceSettings\nSpaceSummary\nSpaces\nSpacing\nSpamCount\nSpamPercentage\nSpamRawCount\nSpan\nSparkConnectorSource\nSparkConnectorTarget\nSparkParameters\nSparkProperties\nSparkSQL\nSparkSqlJobDriver\nSparkSubmit\nSparkSubmitJobDriver\nSparkline\nSparqlData\nSparqlRecord\nSparseTrackType\nSpatialAdaptiveQuantization\nSpatialAq\nSpatialDataOptionToGeoJsonFunctionName\nSpatialFilterSettings\nSpawnRate\nSpdxLicenseId\nSpeaker\nSpeakerEnrollmentJob\nSpeakerEnrollmentJobSummary\nSpeakerId\nSpeakerSearchDetails\nSpeakerSearchResult\nSpeakerSearchStatus\nSpeakerSearchTask\nSpeakerSearchTaskId\nSpeakerSearchTaskStatus\nSpeakerSummaries\nSpeakerSummary\nSpec\nSpecialFeature\nSpecialValue\nSpecialty\nSpecifedOrder\nSpecification\nSpecifications\nSpecifiedImage\nSpectrumConfig\nSpeechMarkTypes\nSpeechThreshold\nSpeed\nSpekeKeyProvider\nSpekeKeyProviderCmaf\nSpellCorrectedQueries\nSpellCorrectedQuery\nSpellCorrectionConfiguration\nSpend\nSpendCoveredBySavingsPlans\nSpendLimit\nSpendLimits\nSpfPercentage\nSpigot\nSpliceEventId\nSpliceInsertMessage\nSplit\nSplitChargeRules\nSplitDocument\nSplitDocuments\nSplitFields\nSplitShardInput\nSplitTunnel\nSplitType\nSplunkDestinationConfiguration\nSplunkDestinationDescription\nSplunkDestinationUpdate\nSplunkRetryOptions\nSpotAllocationStrategy\nSpotCapacityRebalance\nSpotDatafeedSubscription\nSpotFleetLaunchSpecification\nSpotFleetMonitoring\nSpotFleetRequestConfig\nSpotFleetRequestConfigData\nSpotFleetRequestConfigs\nSpotFleetRequestId\nSpotFleetRequestIds\nSpotFleetRequestState\nSpotFleetTagSpecification\nSpotInstancePools\nSpotInstanceRequest\nSpotInstanceRequestId\nSpotInstanceRequestIds\nSpotInstanceRequests\nSpotInstanceStateFault\nSpotInstanceStatus\nSpotInstanceType\nSpotMaintenanceStrategies\nSpotMarketOptions\nSpotMaxPrice\nSpotMaxPricePercentageOverLowestPrice\nSpotMaxTotalPrice\nSpotOptions\nSpotOptionsRequest\nSpotPlacement\nSpotPlacementScore\nSpotPlacementScores\nSpotPrice\nSpotPriceHistory\nSpotProvisioningSpecification\nSpotResizeSpecification\nSpotResizingSpecification\nSpotSpecification\nSpotTargetCapacity\nSpreadDomain\nSpreadLevel\nSql\nSqlAlias\nSqlAliases\nSqlApplicationConfiguration\nSqlApplicationConfigurationDescription\nSqlApplicationConfigurationUpdate\nSqlConfiguration\nSqlEndpointPath\nSqlInjectionMatchSet\nSqlInjectionMatchSetId\nSqlInjectionMatchSetSummary\nSqlInjectionMatchSetUpdate\nSqlInjectionMatchSets\nSqlInjectionMatchTuple\nSqlInjectionMatchTuples\nSqlParameter\nSqlParseException\nSqlQuery\nSqlQueryDatasetAction\nSqlRunConfiguration\nSqlRunConfigurations\nSqlServerParameters\nSqlStatementResult\nSqlType\nSqliMatchStatement\nSqls\nSqsAction\nSqsFailureFeedbackRoleArn\nSqsParameters\nSqsQueueArn\nSqsQueueConfiguration\nSqsQueueParameters\nSqsQueueSinkConfiguration\nSqsQueueUrl\nSqsSuccessFeedbackRoleArn\nSquash\nSriovNetSupport\nSrtDestinationSettings\nSseAwsKmsKeyId\nSseConfig\nSseConfiguration\nSseDescription\nSseKmsEncryptedObjects\nSseSpecification\nSseType\nSshCiphers\nSshHostDsaKeyFingerprint\nSshHostRsaKeyFingerprint\nSshKexs\nSshKey\nSshKeyLastUpdated\nSshKeyName\nSshMacs\nSshPublicKey\nSshPublicKeyBody\nSshPublicKeyCount\nSshPublicKeyId\nSshPublicKeys\nSshUsername\nSsid\nSsl\nSslCaCertificateArn\nSslCertificateId\nSslCertificateS3Path\nSslClientCertificateArn\nSslClientKeyArn\nSslClientKeyPassword\nSslConfiguration\nSslEndpointIdentificationAlgorithm\nSslMode\nSslPolicies\nSslPolicy\nSslProperties\nSslProtocols\nSslSecurityProtocol\nSslSupportMethod\nSsmActionDefinition\nSsmAutomation\nSsmControls\nSsmDocument\nSsmOpsItemId\nSsmParameterStoreParameter\nSsml\nSsmlList\nSsmlMarksNotSupportedForTextTypeException\nSsoEnabled\nStable\nStack\nStackArn\nStackConfigInput\nStackConfigurationManager\nStackDriftDetectionId\nStackDriftInformation\nStackDriftInformationSummary\nStackDriftStatus\nStackError\nStackErrors\nStackEvent\nStackEvents\nStackId\nStackIds\nStackIdsUrl\nStackInstance\nStackInstanceAccount\nStackInstanceComprehensiveStatus\nStackInstanceFilter\nStackInstanceNotFoundException\nStackInstanceRegion\nStackInstanceResourceDriftStatuses\nStackInstanceResourceDriftsSummary\nStackInstanceStatus\nStackInstanceSummary\nStackInstances\nStackName\nStackNames\nStackNotFoundException\nStackPolicyBody\nStackPolicyDuringUpdateBody\nStackPolicyDuringUpdateURL\nStackPolicyURL\nStackResource\nStackResourceDetail\nStackResourceDrift\nStackResourceDriftInformation\nStackResourceDriftInformationSummary\nStackResourceDriftStatus\nStackResourceDriftStatusFilters\nStackResourceDrifts\nStackResourceSummaries\nStackResourceSummary\nStackResources\nStackSet\nStackSetARN\nStackSetAccounts\nStackSetDriftDetectionDetails\nStackSetFailureToleranceCount\nStackSetFailureTolerancePercentage\nStackSetId\nStackSetMaxConcurrencyCount\nStackSetMaxConcurrencyPercentage\nStackSetName\nStackSetNotEmptyException\nStackSetNotFoundException\nStackSetOperation\nStackSetOperationPreferences\nStackSetOperationResultSummary\nStackSetOperationStatusDetails\nStackSetOperationSummary\nStackSetOperationType\nStackSetRegions\nStackSetSummary\nStackStatus\nStackStatusFilter\nStackStatusReason\nStackSummaries\nStackSummary\nStacks\nStage\nStageContext\nStageDeclaration\nStageDeployment\nStageDeploymentDetails\nStageDeploymentSummary\nStageDeployments\nStageDetails\nStageExecution\nStageId\nStageIndex\nStageKey\nStageLastUpdatedDateTime\nStageName\nStageNotFoundException\nStageNotRetryableException\nStageReason\nStageSession\nStageSessionSummary\nStageState\nStageStatus\nStageSummary\nStageVariableOverrides\nStageVariables\nStages\nStagesAvailable\nStaging\nStagingArea\nStagingDistributionDnsNames\nStagingDistributionId\nStagingDistributionInUse\nStagingSourceServer\nStagingTable\nStairs\nStaleIpPermission\nStaleIpPermissions\nStaleIpPermissionsEgress\nStaleRequestException\nStaleSecurityGroup\nStaleSecurityGroupSet\nStaleTagException\nStandByAvailabilityZoneCount\nStandard\nStandardErrorContent\nStandardErrorUrl\nStandardHlsSettings\nStandardIdentifiers\nStandardKnowledgeArticleTypeConfiguration\nStandardLayout\nStandardMessages\nStandardMetricName\nStandardObjectAttachmentConfiguration\nStandardObjectConfigurations\nStandardOutputContent\nStandardOutputUrl\nStandards\nStandardsArn\nStandardsControl\nStandardsControlArn\nStandardsControlArns\nStandardsControlAssociationDetail\nStandardsControlAssociationDetails\nStandardsControlAssociationId\nStandardsControlAssociationIds\nStandardsControlAssociationSummaries\nStandardsControlAssociationSummary\nStandardsControlAssociationUpdate\nStandardsControlAssociationUpdates\nStandardsControlDescription\nStandardsControlTitle\nStandardsId\nStandardsInput\nStandardsManagedBy\nStandardsStatus\nStandardsStatusReason\nStandardsSubscription\nStandardsSubscriptionArn\nStandardsSubscriptionArns\nStandardsSubscriptionRequest\nStandardsSubscriptionRequests\nStandardsSubscriptions\nStandbyDelayTime\nStandbyInstances\nStandbyWorkspace\nStandbyWorkspaceRequest\nStandbyWorkspaces\nStart\nStartAccessLoggingInput\nStartActivity\nStartActivityStreamRequest\nStartActivityStreamResponse\nStartAfter\nStartAfterDateTime\nStartAngle\nStartAnnotationImportRequest\nStartAnnotationImportResponse\nStartAppAssessmentRequest\nStartAppAssessmentResponse\nStartAppBlockBuilderRequest\nStartAppBlockBuilderResult\nStartAppInput\nStartAppOutput\nStartAppReplicationRequest\nStartApplicationRefreshInput\nStartApplicationRefreshOutput\nStartApplicationRequest\nStartArns\nStartAssessmentFrameworkShareRequest\nStartAssessmentFrameworkShareResponse\nStartAssessmentRequest\nStartAssessmentResponse\nStartAssessmentRunRequest\nStartAssessmentRunResponse\nStartAssetBundleExportJobRequest\nStartAssetBundleExportJobResponse\nStartAssetBundleImportJobRequest\nStartAssetBundleImportJobResponse\nStartAssociationsOnceRequest\nStartAt\nStartAttachmentUploadRequest\nStartAttachmentUploadResponse\nStartAuditMitigationActionsTaskRequest\nStartAuditMitigationActionsTaskResponse\nStartAutomationExecutionRequest\nStartAutomationExecutionResult\nStartAvailabilityMonitorTestInput\nStartAvailabilityMonitorTestOutput\nStartBackupJobInput\nStartBackupJobOutput\nStartBatchJobRequest\nStartBatchJobResponse\nStartBgpFailoverTestRequest\nStartBgpFailoverTestResponse\nStartBillingPeriod\nStartBlueprintRunRequest\nStartBlueprintRunResponse\nStartBotRecommendationRequest\nStartBotRecommendationResponse\nStartBuildBatchInput\nStartBuildBatchOutput\nStartBuildInput\nStartBuildOutput\nStartBulkAssociateWirelessDeviceWithMulticastGroupRequest\nStartBulkDeploymentRequest\nStartBulkDeploymentResponse\nStartBulkDisassociateWirelessDeviceFromMulticastGroupRequest\nStartBy\nStartCalculationExecutionRequest\nStartCalculationExecutionResponse\nStartCallAnalyticsJobRequest\nStartCallAnalyticsJobResponse\nStartCallAnalyticsStreamTranscriptionRequest\nStartCallAnalyticsStreamTranscriptionResponse\nStartCampaignRequest\nStartCanaryRequest\nStartCelebrityRecognitionRequest\nStartCelebrityRecognitionResponse\nStartChangeRequestExecutionRequest\nStartChangeRequestExecutionResult\nStartChangeSetRequest\nStartChangeSetResponse\nStartChannelRequest\nStartChannelResponse\nStartChatContactRequest\nStartChatContactResponse\nStartChildWorkflowExecutionDecisionAttributes\nStartChildWorkflowExecutionFailedEventAttributes\nStartChildWorkflowExecutionInitiatedEventAttributes\nStartClockInput\nStartCodegenJobData\nStartCodegenJobRequest\nStartCodegenJobResponse\nStartColumn\nStartColumnIndex\nStartCommand\nStartCondition\nStartConfigRulesEvaluationRequest\nStartConfigurationRecorderRequest\nStartConfigurationSessionRequest\nStartConfigurationSessionResponse\nStartConnectionRequest\nStartConnectionResponse\nStartContactEvaluationRequest\nStartContactEvaluationResponse\nStartContactRecordingRequest\nStartContactStreamingRequest\nStartContactStreamingResponse\nStartContentModerationRequest\nStartContentModerationResponse\nStartContentUploadRequest\nStartContentUploadResponse\nStartContinentCode\nStartContinuousExportResponse\nStartConversationRequest\nStartConversationResponse\nStartCopyJobInput\nStartCopyJobOutput\nStartCostEstimationRequest\nStartCountryCode\nStartCrawlerRequest\nStartCrawlerScheduleRequest\nStartCutoverRequest\nStartCutoverResponse\nStartDBClusterMessage\nStartDBClusterResult\nStartDBInstanceAutomatedBackupsReplicationMessage\nStartDBInstanceAutomatedBackupsReplicationResult\nStartDBInstanceMessage\nStartDBInstanceResult\nStartDICOMImportJobRequest\nStartDICOMImportJobResponse\nStartDashboardSnapshotJobRequest\nStartDashboardSnapshotJobResponse\nStartDataCollectionByAgentIdsRequest\nStartDataCollectionByAgentIdsResponse\nStartDataIngestionJobRequest\nStartDataIngestionJobResponse\nStartDataQualityRuleRecommendationRunRequest\nStartDataQualityRuleRecommendationRunResponse\nStartDataQualityRulesetEvaluationRunRequest\nStartDataQualityRulesetEvaluationRunResponse\nStartDataSourceSyncJobRequest\nStartDataSourceSyncJobResponse\nStartDate\nStartDateTime\nStartDeliveryStreamEncryptionInput\nStartDeploymentRequest\nStartDeploymentResponse\nStartDeploymentResult\nStartDetectMitigationActionsTaskRequest\nStartDetectMitigationActionsTaskResponse\nStartDetectorModelAnalysisRequest\nStartDetectorModelAnalysisResponse\nStartDevEnvironmentRequest\nStartDevEnvironmentResponse\nStartDevEnvironmentSessionRequest\nStartDevEnvironmentSessionResponse\nStartDeviceAuthorizationRequest\nStartDeviceAuthorizationResponse\nStartDeviceSyncRequest\nStartDiscovererRequest\nStartDiscovererResponse\nStartDiscoveryJobRequest\nStartDiscoveryJobResponse\nStartDocumentAnalysisRequest\nStartDocumentAnalysisResponse\nStartDocumentClassificationJobRequest\nStartDocumentClassificationJobResponse\nStartDocumentTextDetectionRequest\nStartDocumentTextDetectionResponse\nStartDominantLanguageDetectionJobRequest\nStartDominantLanguageDetectionJobResponse\nStartEarthObservationJobInput\nStartEarthObservationJobOutput\nStartEdgeConfigurationUpdateInput\nStartEdgeConfigurationUpdateOutput\nStartEdgeDeploymentStageRequest\nStartElasticsearchServiceSoftwareUpdateRequest\nStartElasticsearchServiceSoftwareUpdateResponse\nStartEngagementRequest\nStartEngagementResult\nStartEntitiesDetectionJobRequest\nStartEntitiesDetectionJobResponse\nStartEntitiesDetectionV2JobRequest\nStartEntitiesDetectionV2JobResponse\nStartError\nStartEventDataStoreIngestionRequest\nStartEventTime\nStartEventsDetectionJobRequest\nStartEventsDetectionJobResponse\nStartExecutionInput\nStartExecutionOutput\nStartExpenseAnalysisRequest\nStartExpenseAnalysisResponse\nStartExperimentRequest\nStartExperimentResponse\nStartExportLabelsTaskRunRequest\nStartExportLabelsTaskRunResponse\nStartExportRequest\nStartExportResponse\nStartExportTaskMessage\nStartExportTaskRequest\nStartExportTaskResponse\nStartExtensionPackAssociationMessage\nStartExtensionPackAssociationResponse\nStartFHIRExportJobRequest\nStartFHIRExportJobResponse\nStartFHIRImportJobRequest\nStartFHIRImportJobResponse\nStartFaceDetectionRequest\nStartFaceDetectionResponse\nStartFaceSearchRequest\nStartFaceSearchResponse\nStartFailbackLaunchRequest\nStartFailbackLaunchResponse\nStartFailed\nStartFileTransferRequest\nStartFileTransferResponse\nStartFleetActionsInput\nStartFleetActionsOutput\nStartFleetRequest\nStartFlowRequest\nStartFlowResponse\nStartFlywheelIterationRequest\nStartFlywheelIterationResponse\nStartFrameNumber\nStartFraudsterRegistrationJobRequest\nStartFraudsterRegistrationJobResponse\nStartFromRow\nStartFuotaTaskRequest\nStartGUISessionRequest\nStartGUISessionResult\nStartGameSessionPlacementInput\nStartGameSessionPlacementOutput\nStartGatewayInput\nStartGatewayOutput\nStartGeneratedCodeJobRequest\nStartGeneratedCodeJobResult\nStartHour\nStartHourOfDay\nStartHumanLoopRequest\nStartHumanLoopResponse\nStartICD10CMInferenceJobRequest\nStartICD10CMInferenceJobResponse\nStartImageBuilderRequest\nStartImageBuilderResult\nStartImagePipelineExecutionRequest\nStartImagePipelineExecutionResponse\nStartImageScanRequest\nStartImageScanResponse\nStartImportFileTaskRequest\nStartImportFileTaskResponse\nStartImportLabelsTaskRunRequest\nStartImportLabelsTaskRunResponse\nStartImportRequest\nStartImportResponse\nStartImportTaskRequest\nStartImportTaskResponse\nStartIncidentInput\nStartIncidentOutput\nStartInferenceExperimentRequest\nStartInferenceExperimentResponse\nStartInferenceSchedulerRequest\nStartInferenceSchedulerResponse\nStartIngestion\nStartIngestionRequest\nStartInputDeviceMaintenanceWindowRequest\nStartInputDeviceRequest\nStartInstanceOnboardingJobRequest\nStartInstanceOnboardingJobResponse\nStartInstanceRefreshAnswer\nStartInstanceRefreshType\nStartInstanceRequest\nStartInstanceResult\nStartInstancesRequest\nStartInstancesResult\nStartJobRequest\nStartJobResult\nStartJobRunRequest\nStartJobRunResponse\nStartKeyPhrasesDetectionJobRequest\nStartKeyPhrasesDetectionJobResponse\nStartKeyUsageInput\nStartKeyUsageOutput\nStartLabelDetectionRequest\nStartLabelDetectionResponse\nStartLambdaFunctionFailedEventAttributes\nStartLaunchRequest\nStartLaunchResponse\nStartLendingAnalysisRequest\nStartLendingAnalysisResponse\nStartLifecyclePolicyPreviewRequest\nStartLifecyclePolicyPreviewResponse\nStartLine\nStartLoaderJobInput\nStartLoaderJobOutput\nStartLoggingRequest\nStartLoggingTime\nStartMLDataProcessingJobInput\nStartMLDataProcessingJobOutput\nStartMLEvaluationTaskRunRequest\nStartMLEvaluationTaskRunResponse\nStartMLLabelingSetGenerationTaskRunRequest\nStartMLLabelingSetGenerationTaskRunResponse\nStartMLModelTrainingJobInput\nStartMLModelTrainingJobOutput\nStartMLModelTransformJobInput\nStartMLModelTransformJobOutput\nStartMailboxExportJobRequest\nStartMailboxExportJobResponse\nStartMaintenanceRequest\nStartMaintenanceResponse\nStartMalwareScanRequest\nStartMalwareScanResponse\nStartMatchBackfillInput\nStartMatchBackfillOutput\nStartMatchingJobInput\nStartMatchingJobOutput\nStartMatchmakingInput\nStartMatchmakingOutput\nStartMedicalStreamTranscriptionRequest\nStartMedicalStreamTranscriptionResponse\nStartMedicalTranscriptionJobRequest\nStartMedicalTranscriptionJobResponse\nStartMeetingTranscriptionRequest\nStartMessageMoveTaskRequest\nStartMessageMoveTaskResult\nStartMetadataModelAssessmentMessage\nStartMetadataModelAssessmentResponse\nStartMetadataModelConversionMessage\nStartMetadataModelConversionResponse\nStartMetadataModelExportAsScriptMessage\nStartMetadataModelExportAsScriptResponse\nStartMetadataModelExportToTargetMessage\nStartMetadataModelExportToTargetResponse\nStartMetadataModelImportMessage\nStartMetadataModelImportResponse\nStartMetricStreamsInput\nStartMigrationMessage\nStartMigrationRequest\nStartMigrationResponse\nStartMigrationWorkflowRequest\nStartMigrationWorkflowResponse\nStartMinuteOfHour\nStartMode\nStartModelPackagingJobRequest\nStartModelPackagingJobResponse\nStartModelRequest\nStartModelResponse\nStartMonitoringMemberRequest\nStartMonitoringMembersRequest\nStartMonitoringMembersResponse\nStartMonitoringScheduleRequest\nStartMulticastGroupSessionRequest\nStartMultiplexRequest\nStartMultiplexResponse\nStartNetworkInsightsAccessScopeAnalysisRequest\nStartNetworkInsightsAccessScopeAnalysisResult\nStartNetworkInsightsAnalysisRequest\nStartNetworkInsightsAnalysisResult\nStartNetworkResourceUpdateRequest\nStartNetworkResourceUpdateResponse\nStartNextPendingJobExecutionRequest\nStartNextPendingJobExecutionResponse\nStartNotebookExecutionInput\nStartNotebookExecutionOutput\nStartNotebookInstanceInput\nStartObjectInput\nStartObjectOutput\nStartOnCreation\nStartOnDemandAppReplicationRequest\nStartOnDemandAuditTaskRequest\nStartOnDemandAuditTaskResponse\nStartOnDemandReplicationRunRequest\nStartOnDemandReplicationRunResponse\nStartOrganizationServiceAccessUpdateRequest\nStartOrganizationServiceAccessUpdateResponse\nStartOutboundVoiceContactRequest\nStartOutboundVoiceContactResponse\nStartPHIDetectionJobRequest\nStartPHIDetectionJobResponse\nStartPercentage\nStartPeriod\nStartPersonTrackingRequest\nStartPersonTrackingResponse\nStartPiiEntitiesDetectionJobRequest\nStartPiiEntitiesDetectionJobResponse\nStartPipeRequest\nStartPipeResponse\nStartPipelineExecutionInput\nStartPipelineExecutionOutput\nStartPipelineExecutionRequest\nStartPipelineExecutionResponse\nStartPipelineReprocessingRequest\nStartPipelineReprocessingResponse\nStartPipelineRequest\nStartPipelineResponse\nStartPolicyGenerationRequest\nStartPolicyGenerationResponse\nStartPosition\nStartProductSubscriptionRequest\nStartProductSubscriptionResponse\nStartProjectSessionRequest\nStartProjectSessionResponse\nStartProjectVersionRequest\nStartProjectVersionResponse\nStartProtectedQueryInput\nStartProtectedQueryOutput\nStartQueryExecutionInput\nStartQueryExecutionOutput\nStartQueryPlanningRequest\nStartQueryPlanningResponse\nStartQueryRequest\nStartQueryResponse\nStartReadSetActivationJobRequest\nStartReadSetActivationJobResponse\nStartReadSetActivationJobSourceItem\nStartReadSetExportJobRequest\nStartReadSetExportJobResponse\nStartReadSetImportJobRequest\nStartReadSetImportJobResponse\nStartReadSetImportJobSourceItem\nStartRecommendationReportGenerationRequest\nStartRecommendationReportGenerationResponse\nStartRecommendationsRequest\nStartRecommendationsRequestEntry\nStartRecommenderRequest\nStartRecommenderResponse\nStartRecordIdentifier\nStartRecordName\nStartRecordType\nStartRecoveryRequest\nStartRecoveryRequestSourceServer\nStartRecoveryResponse\nStartReferenceImportJobRequest\nStartReferenceImportJobResponse\nStartReferenceImportJobSourceItem\nStartRelationalDatabaseRequest\nStartRelationalDatabaseResult\nStartRemediationExecutionRequest\nStartRemediationExecutionResponse\nStartReplayRequest\nStartReplayResponse\nStartReplicationMessage\nStartReplicationRequest\nStartReplicationResponse\nStartReplicationTaskAssessmentMessage\nStartReplicationTaskAssessmentResponse\nStartReplicationTaskAssessmentRunMessage\nStartReplicationTaskAssessmentRunResponse\nStartReplicationTaskMessage\nStartReplicationTaskResponse\nStartReplicationTaskType\nStartReplicationType\nStartReportCreationInput\nStartReportJobInput\nStartReportJobOutput\nStartRequest\nStartResourceEvaluationRequest\nStartResourceEvaluationResponse\nStartResourceScanRequest\nStartRestoreJobInput\nStartRestoreJobOutput\nStartRetrainingSchedulerRequest\nStartRetrainingSchedulerResponse\nStartRouteAnalysisRequest\nStartRouteAnalysisResponse\nStartRowIndex\nStartRunRequest\nStartRunResponse\nStartRxNormInferenceJobRequest\nStartRxNormInferenceJobResponse\nStartSNOMEDCTInferenceJobRequest\nStartSNOMEDCTInferenceJobResponse\nStartSavingsPlansPurchaseRecommendationGenerationResponse\nStartSchemaCreationRequest\nStartSchemaCreationResponse\nStartSchemaExtensionRequest\nStartSchemaExtensionResult\nStartSchemaMergeRequest\nStartSchemaMergeResponse\nStartSegmentDetectionFilters\nStartSegmentDetectionRequest\nStartSegmentDetectionResponse\nStartSelector\nStartSelectorType\nStartSentimentDetectionJobRequest\nStartSentimentDetectionJobResponse\nStartServerRequest\nStartServiceSoftwareUpdateRequest\nStartServiceSoftwareUpdateResponse\nStartSession\nStartSessionRequest\nStartSessionResponse\nStartSessionResult\nStartShotDetectionFilter\nStartSigningJobParameter\nStartSigningJobRequest\nStartSigningJobResponse\nStartSimulationInput\nStartSimulationJobBatchRequest\nStartSimulationJobBatchResponse\nStartSimulationOutput\nStartSingleWirelessDeviceImportTaskRequest\nStartSingleWirelessDeviceImportTaskResponse\nStartSmartHomeApplianceDiscoveryRequest\nStartSnapshotRequest\nStartSnapshotResponse\nStartSourceNetworkRecoveryRequest\nStartSourceNetworkRecoveryRequestNetworkEntry\nStartSourceNetworkRecoveryResponse\nStartSourceNetworkReplicationRequest\nStartSourceNetworkReplicationResponse\nStartSpeakerEnrollmentJobRequest\nStartSpeakerEnrollmentJobResponse\nStartSpeakerSearchTaskRequest\nStartSpeakerSearchTaskResponse\nStartSpeechSynthesisTaskInput\nStartSpeechSynthesisTaskOutput\nStartStackRequest\nStartStageDeploymentRequest\nStartStageDeploymentResult\nStartStreamEncryptionInput\nStartStreamProcessorRequest\nStartStreamProcessorResponse\nStartStreamTranscriptionRequest\nStartStreamTranscriptionResponse\nStartStreamingSessionRequest\nStartStreamingSessionResponse\nStartStudioSSOConfigurationRepairRequest\nStartStudioSSOConfigurationRepairResponse\nStartSubdivisionCode\nStartSuiteRunRequest\nStartSuiteRunResponse\nStartSupportDataExportRequest\nStartSupportDataExportResult\nStartSyncExecutionInput\nStartSyncExecutionOutput\nStartTableDataImportJobRequest\nStartTableDataImportJobResult\nStartTargetedSentimentDetectionJobRequest\nStartTargetedSentimentDetectionJobResponse\nStartTaskContactRequest\nStartTaskContactResponse\nStartTaskExecutionRequest\nStartTaskExecutionResponse\nStartTaskRequest\nStartTaskResponse\nStartTechnicalCueDetectionFilter\nStartTestExecutionRequest\nStartTestExecutionResponse\nStartTestRequest\nStartTestResponse\nStartTestSetGenerationRequest\nStartTestSetGenerationResponse\nStartTextDetectionFilters\nStartTextDetectionRequest\nStartTextDetectionResponse\nStartTextTranslationJobRequest\nStartTextTranslationJobResponse\nStartThingRegistrationTaskRequest\nStartThingRegistrationTaskResponse\nStartTime\nStartTimeFilter\nStartTimeInclusive\nStartTimeMillis\nStartTimeOffset\nStartTimeRange\nStartTimecode\nStartTimecodeSMPTE\nStartTimeout\nStartTimerDecisionAttributes\nStartTimerFailedEventAttributes\nStartTimestamp\nStartTimestampMillis\nStartTopicsDetectionJobRequest\nStartTopicsDetectionJobResponse\nStartTransaction\nStartTransactionRequest\nStartTransactionResponse\nStartTransactionResult\nStartTranscriptionJobRequest\nStartTranscriptionJobResponse\nStartTriggerRequest\nStartTriggerResponse\nStartUrl\nStartUserAccessTasksRequest\nStartUserAccessTasksResponse\nStartUserImportJobRequest\nStartUserImportJobResponse\nStartValue\nStartVariantImportRequest\nStartVariantImportResponse\nStartVectorEnrichmentJobInput\nStartVectorEnrichmentJobOutput\nStartViewerSessionRevocationRequest\nStartVirtualMachinesMetadataSyncInput\nStartVirtualMachinesMetadataSyncOutput\nStartVoiceToneAnalysisTaskRequest\nStartVoiceToneAnalysisTaskResponse\nStartVpcEndpointServicePrivateDnsVerificationRequest\nStartVpcEndpointServicePrivateDnsVerificationResult\nStartWeekDay\nStartWindowMinutes\nStartWirelessDeviceImportTaskRequest\nStartWirelessDeviceImportTaskResponse\nStartWorkflowExecutionInput\nStartWorkflowRunRequest\nStartWorkflowRunResponse\nStartWorkspaceRequests\nStartWorkspacesRequest\nStartWorkspacesResult\nStartZonalShiftRequest\nStarted\nStartedAfter\nStartedAt\nStartedBefore\nStartedBy\nStartedOn\nStartedTimestamp\nStartingAt\nStartingBlockIndex\nStartingEventBatchCondition\nStartingHashKey\nStartingInstances\nStartingObjectName\nStartingObjectPrefix\nStartingOffsets\nStartingPosition\nStartingPositionTimestamp\nStartingSequenceNumber\nStartingTimestamp\nStartoverWindowSeconds\nStartsWith\nStartupAction\nStartupScriptS3ObjectVersion\nStartupScriptS3Path\nStat\nState\nStateChangeConfiguration\nStateChangeReason\nStateDB\nStateDescription\nStateEnteredEventDetails\nStateEquals\nStateExitedEventDetails\nStateFilter\nStateInfo\nStateLastUpdatedDateTime\nStateMachineAliasListItem\nStateMachineAlreadyExists\nStateMachineArn\nStateMachineDeleting\nStateMachineDoesNotExist\nStateMachineLimitExceeded\nStateMachineListItem\nStateMachineTypeNotSupported\nStateMachineVersionListItem\nStateMessage\nStateOrProvince\nStateOrRegion\nStatePersistence\nStatePersistenceConfigurations\nStatePersistenceEnabled\nStateReason\nStateReasonCode\nStateReasonData\nStateStartTimestamp\nStateTransitionReason\nStateTransitionTime\nStateTransitionedTimestamp\nStateUpdatedTimestamp\nStateValue\nStatefulDefaultActions\nStatefulEngineOptions\nStatefulRule\nStatefulRuleGroup\nStatefulRuleGroupOverride\nStatefulRuleGroupReference\nStatefulRuleGroupReferences\nStatefulRuleGroups\nStatefulRuleOptions\nStatefulRules\nStatelessCustomActionDefinition\nStatelessCustomActions\nStatelessCustomPublishMetricAction\nStatelessCustomPublishMetricActionDimension\nStatelessDefaultActions\nStatelessFragmentDefaultActions\nStatelessRule\nStatelessRuleGroup\nStatelessRuleGroupReference\nStatelessRuleGroupReferences\nStatelessRuleGroups\nStatelessRules\nStatelessRulesAndCustomActions\nStatement\nStatementData\nStatementId\nStatementName\nStatementOutput\nStatementOutputData\nStatementTimeoutException\nStatementType\nStatements\nStates\nStatesArn\nStatesExecutionArn\nStatesInput\nStatesStatus\nStaticColumn\nStaticConfiguration\nStaticHyperParameters\nStaticImageActivateScheduleActionSettings\nStaticImageActivateSettings\nStaticImageDeactivateScheduleActionSettings\nStaticImageDeactivateSettings\nStaticIp\nStaticIpConnectionInfo\nStaticKeyProvider\nStaticKeySettings\nStaticKeyValue\nStaticMembers\nStaticPolicyDefinition\nStaticPolicyDefinitionDetail\nStaticPolicyDefinitionItem\nStaticRoutesOnly\nStaticSourcesSupport\nStaticValue\nStaticValues\nStation\nStatistic\nStatisticOverride\nStatisticSet\nStatisticValues\nStatisticalThreshold\nStatistics\nStatisticsConfiguration\nStatisticsConfigurations\nStatisticsData\nStatisticsNotAvailableException\nStatisticsNotReadyYetException\nStatisticsResource\nStatisticsSummary\nStatisticsType\nStatmuxSettings\nStats\nStatsAtAnomaly\nStatsAtBaseline\nStatsEvent\nStatus\nStatus2xx\nStatus3xx\nStatus4xx\nStatus5xx\nStatusArn\nStatusChangeDate\nStatusCode\nStatusCodes\nStatusDescription\nStatusDetail\nStatusDetailFilters\nStatusDetails\nStatusEquals\nStatusFilter\nStatusFlag\nStatusInformation\nStatusInfos\nStatusLastUpdatedDateTime\nStatusList\nStatusMessage\nStatusMessageCode\nStatusName\nStatusReason\nStatusReasonCode\nStatusReasons\nStatusReport\nStatusStartTime\nStatusStartTimestamp\nStatusType\nStatusUpdateInterval\nStatusUpdateReason\nStatuses\nStdDev\nStdErrorS3Uri\nStdEvent\nStdOutS3Uri\nStddev\nStemmingDictionary\nStep\nStepAdjustment\nStepAdjustments\nStepAutomationConfiguration\nStepCancellationOption\nStepConcurrencyLevel\nStepConfig\nStepCount\nStepDescription\nStepDetail\nStepDetails\nStepDisplayName\nStepExecution\nStepExecutionFilter\nStepExecutionId\nStepExecutionStatusDetail\nStepExecutions\nStepExecutionsTruncated\nStepFunctionStateMachineParameters\nStepFunctions\nStepFunctionsAction\nStepId\nStepIds\nStepIndex\nStepInfo\nStepName\nStepOutput\nStepScalingPolicyConfiguration\nStepSize\nStepStateChangeReason\nStepStates\nStepStatus\nStepSummary\nStepTimeline\nStepType\nSteps\nStepsCompleted\nStepsList\nStereoDownmix\nStillContainsLinksException\nStillEstimating\nStillWaitingResponseSpecification\nStopAccessLoggingInput\nStopAction\nStopActivityStreamRequest\nStopActivityStreamResponse\nStopAppBlockBuilderRequest\nStopAppBlockBuilderResult\nStopAppInput\nStopAppReplicationRequest\nStopApplicationRequest\nStopAssessmentRequest\nStopAssessmentRunRequest\nStopAutoMLJobRequest\nStopAutomationExecutionRequest\nStopBackupJobInput\nStopBgpFailoverTestRequest\nStopBgpFailoverTestResponse\nStopBotRecommendationRequest\nStopBotRecommendationResponse\nStopBuildBatchInput\nStopBuildBatchOutput\nStopBuildInput\nStopBuildOutput\nStopBulkDeploymentRequest\nStopCalculationExecutionRequest\nStopCalculationExecutionResponse\nStopCampaignRequest\nStopCanaryRequest\nStopChannelRequest\nStopChannelResponse\nStopClockInput\nStopCompilationJobRequest\nStopConfigurationRecorderRequest\nStopContactRecordingRequest\nStopContactRequest\nStopContactStreamingRequest\nStopContinuousExportRequest\nStopContinuousExportResponse\nStopCrawlerRequest\nStopCrawlerScheduleRequest\nStopDBClusterMessage\nStopDBClusterResult\nStopDBInstanceAutomatedBackupsReplicationMessage\nStopDBInstanceAutomatedBackupsReplicationResult\nStopDBInstanceMessage\nStopDBInstanceResult\nStopDataCollectionByAgentIdsRequest\nStopDataCollectionByAgentIdsResponse\nStopDataSourceSyncJobRequest\nStopDate\nStopDeliveryStreamEncryptionInput\nStopDeploymentInput\nStopDeploymentOutput\nStopDeploymentRequest\nStopDevEnvironmentRequest\nStopDevEnvironmentResponse\nStopDevEnvironmentSessionRequest\nStopDevEnvironmentSessionResponse\nStopDiscovererRequest\nStopDiscovererResponse\nStopDiscoveryJobRequest\nStopDominantLanguageDetectionJobRequest\nStopDominantLanguageDetectionJobResponse\nStopEarthObservationJobInput\nStopEdgeDeploymentStageRequest\nStopEdgePackagingJobRequest\nStopEngagementRequest\nStopEntitiesDetectionJobRequest\nStopEntitiesDetectionJobResponse\nStopEntitiesDetectionV2JobRequest\nStopEntitiesDetectionV2JobResponse\nStopEventDataStoreIngestionRequest\nStopEventsDetectionJobRequest\nStopEventsDetectionJobResponse\nStopExecutionInput\nStopExecutionOutput\nStopExecutionTrigger\nStopExperimentRequest\nStopExperimentResponse\nStopFailbackRequest\nStopFailed\nStopFleetActionsInput\nStopFleetActionsOutput\nStopFleetRequest\nStopFlowRequest\nStopFlowResponse\nStopGUISessionRequest\nStopGUISessionResult\nStopGameSessionPlacementInput\nStopGameSessionPlacementOutput\nStopHumanLoopRequest\nStopHyperParameterTuningJobRequest\nStopICD10CMInferenceJobRequest\nStopICD10CMInferenceJobResponse\nStopImageBuilderRequest\nStopImageBuilderResult\nStopImportRequest\nStopImportResponse\nStopInferenceExperimentRequest\nStopInferenceExperimentResponse\nStopInferenceRecommendationsJobRequest\nStopInferenceSchedulerRequest\nStopInferenceSchedulerResponse\nStopIngestionRequest\nStopInputDeviceRequest\nStopInstanceOnIdleRequest\nStopInstanceRequest\nStopInstanceResult\nStopInstancesRequest\nStopInstancesResult\nStopJobOnFailureOptions\nStopJobOnFailureTiming\nStopJobRequest\nStopJobResult\nStopJobRunRequest\nStopJobRunResponse\nStopKeyPhrasesDetectionJobRequest\nStopKeyPhrasesDetectionJobResponse\nStopKeyUsageInput\nStopKeyUsageOutput\nStopLabelingJobRequest\nStopLaunchRequest\nStopLaunchResponse\nStopLoggingRequest\nStopLoggingTime\nStopMatchmakingInput\nStopMeetingTranscriptionRequest\nStopMetricStreamsInput\nStopMigrationWorkflowRequest\nStopMigrationWorkflowResponse\nStopModelCustomizationJobRequest\nStopModelRequest\nStopModelResponse\nStopMonitoringMembersRequest\nStopMonitoringMembersResponse\nStopMonitoringScheduleRequest\nStopMultiplexRequest\nStopMultiplexResponse\nStopNotebookExecutionInput\nStopNotebookInstanceInput\nStopPHIDetectionJobRequest\nStopPHIDetectionJobResponse\nStopPiiEntitiesDetectionJobRequest\nStopPiiEntitiesDetectionJobResponse\nStopPipeRequest\nStopPipeResponse\nStopPipelineExecutionInput\nStopPipelineExecutionOutput\nStopPipelineExecutionRequest\nStopPipelineExecutionResponse\nStopPipelineRequest\nStopPipelineResponse\nStopProcessingJobRequest\nStopProductSubscriptionRequest\nStopProductSubscriptionResponse\nStopProjectVersionRequest\nStopProjectVersionResponse\nStopQueryExecutionInput\nStopQueryRequest\nStopQueryResponse\nStopReason\nStopRecommenderRequest\nStopRecommenderResponse\nStopRelationalDatabaseRequest\nStopRelationalDatabaseResult\nStopRemoteAccessSessionRequest\nStopRemoteAccessSessionResult\nStopReplicationMessage\nStopReplicationRequest\nStopReplicationResponse\nStopReplicationTaskMessage\nStopReplicationTaskResponse\nStopReplicationToReplicaRequest\nStopReplicationToReplicaResponse\nStopRequest\nStopResourceRequest\nStopRetrainingSchedulerRequest\nStopRetrainingSchedulerResponse\nStopRunRequest\nStopRunResult\nStopRxNormInferenceJobRequest\nStopRxNormInferenceJobResponse\nStopSNOMEDCTInferenceJobRequest\nStopSNOMEDCTInferenceJobResponse\nStopSelector\nStopSentimentDetectionJobRequest\nStopSentimentDetectionJobResponse\nStopServerRequest\nStopSessionRequest\nStopSessionResponse\nStopSimulationInput\nStopSolutionVersionCreationRequest\nStopSourceNetworkReplicationRequest\nStopSourceNetworkReplicationResponse\nStopSpeakerSearchTaskRequest\nStopStackRequest\nStopStackSetOperationInput\nStopStreamEncryptionInput\nStopStreamProcessorRequest\nStopStreamRequest\nStopStreamingSessionRequest\nStopStreamingSessionResponse\nStopSuiteRunRequest\nStopTargetedSentimentDetectionJobRequest\nStopTargetedSentimentDetectionJobResponse\nStopTaskRequest\nStopTaskResponse\nStopTextTranslationJobRequest\nStopTextTranslationJobResponse\nStopThingRegistrationTaskRequest\nStopTime\nStopTimecode\nStopTimeout\nStopTimestamp\nStopTrainingDocumentClassifierRequest\nStopTrainingEntityRecognizerRequest\nStopTrainingJobRequest\nStopTransformJobRequest\nStopTriggerRequest\nStopTriggerResponse\nStopUserImportJobRequest\nStopUserImportJobResponse\nStopVectorEnrichmentJobInput\nStopVoiceToneAnalysisTaskRequest\nStopWorkflowRunRequest\nStopWorkspaceRequests\nStopWorkspacesRequest\nStopWorkspacesResult\nStopped\nStoppedActions\nStoppedSince\nStopping\nStoppingCondition\nStoppingConditions\nStoppingInstances\nStops\nStopwords\nStorage\nStorageAllocatedInBytes\nStorageCapacity\nStorageCapacityQuotaGiB\nStorageCapacityReservationGiB\nStorageCapacityUnits\nStorageClass\nStorageClassAnalysis\nStorageClassAnalysisDataExport\nStorageConfig\nStorageConfigs\nStorageConfiguration\nStorageConnector\nStorageConnectors\nStorageDescriptor\nStorageEfficiencyEnabled\nStorageEncrypted\nStorageGB\nStorageGatewayError\nStorageInfo\nStorageIops\nStorageJobId\nStorageLensArn\nStorageLensAwsOrg\nStorageLensConfiguration\nStorageLensConfigurationList\nStorageLensDataExport\nStorageLensDataExportEncryption\nStorageLensTag\nStorageLimit\nStorageLimitExceededException\nStorageLimitWillExceedException\nStorageLocation\nStorageMetrics\nStorageMode\nStorageOptimizer\nStorageOptimizerConfig\nStorageOptimizerList\nStorageOptimizerType\nStorageQuotaExceededFault\nStorageResolution\nStorageRule\nStorageRuleType\nStorageSize\nStorageSubTypeName\nStorageSystemArn\nStorageSystemListEntry\nStorageSystems\nStorageThroughput\nStorageThroughputToIopsRatio\nStorageTier\nStorageType\nStorageTypeLimit\nStorageTypeLimits\nStorageTypeName\nStorageTypeNotAvailableFault\nStorageTypeNotSupportedFault\nStorageTypes\nStorageUnit\nStorageUtilizedInBytes\nStorageVirtualMachine\nStorageVirtualMachineArn\nStorageVirtualMachineFilter\nStorageVirtualMachineId\nStorageVirtualMachineIds\nStorageVirtualMachineNotFound\nStorageVirtualMachineRoot\nStorageVirtualMachines\nStorageVolumeType\nStoreImageTaskResult\nStoreImageTaskResults\nStoreTaskFailureReason\nStoreTaskState\nStoredAsSubDirectories\nStoredQuery\nStoredQueryMetadata\nStorediSCSIVolume\nStorediSCSIVolumes\nStrategy\nStrategyConfig\nStrategyOnFullSize\nStrategyOption\nStrategySummary\nStream\nStreamARN\nStreamArn\nStreamChannelDefinition\nStreamConfiguration\nStreamConfigurationCreate\nStreamConfigurationSessionBackup\nStreamConfigurationSessionStorage\nStreamCreationTimestamp\nStreamDescription\nStreamDescriptionSummary\nStreamEdgeConfigurationNotFoundException\nStreamEnabled\nStreamEncryption\nStreamEvent\nStreamExceptionPolicy\nStreamFile\nStreamFilters\nStreamId\nStreamInfResolution\nStreamInfo\nStreamInfoList\nStreamJournalToKinesisRequest\nStreamJournalToKinesisResponse\nStreamKey\nStreamKeySummary\nStreamLabel\nStreamManifestBehavior\nStreamMode\nStreamModeDetails\nStreamName\nStreamNameCondition\nStreamNames\nStreamOrder\nStreamProcessingStartSelector\nStreamProcessingStopSelector\nStreamProcessor\nStreamProcessorArn\nStreamProcessorDataSharingPreference\nStreamProcessorInput\nStreamProcessorNotificationChannel\nStreamProcessorOutput\nStreamProcessorSettings\nStreamProcessorSettingsForUpdate\nStreamProcessors\nStreamRecord\nStreamRecordsNotFoundException\nStreamSelection\nStreamSession\nStreamSessionSummary\nStreamSpecification\nStreamStatus\nStreamSummaries\nStreamSummary\nStreamType\nStreamUnavailable\nStreamUrl\nStreamView\nStreamViewType\nStreamingConfiguration\nStreamingConfigurations\nStreamingDataPreviewOptions\nStreamingDistribution\nStreamingDistributionAlreadyExists\nStreamingDistributionConfig\nStreamingDistributionConfigWithTags\nStreamingDistributionList\nStreamingDistributionNotDisabled\nStreamingDistributionSummary\nStreamingEndpointArn\nStreamingExperienceSettings\nStreamingId\nStreamingImage\nStreamingImageEncryptionConfiguration\nStreamingLoggingConfig\nStreamingNotificationTarget\nStreamingNotificationTargets\nStreamingOptions\nStreamingSession\nStreamingSessionBackup\nStreamingSessionStorageRoot\nStreamingSessionStream\nStreamingStatus\nStreamingURL\nStreams\nStreet\nStreet1\nStreet2\nStreet3\nStreetAddress\nStreetInfo\nStreetNumber\nStrength\nStrictTransportSecurity\nStringAttributeConstraints\nStringAttributeConstraintsType\nStringColumnStatisticsData\nStringCondition\nStringDatasetParameter\nStringDatasetParameterDefaultValues\nStringDefaultValues\nStringEquals\nStringFilter\nStringFormatConfiguration\nStringLike\nStringListValue\nStringListValues\nStringNotEquals\nStringNotLike\nStringParameter\nStringParameterDeclaration\nStringParameters\nStringReference\nStringStaticValues\nStringValue\nStringValueList\nStringValueWhenUnsetConfiguration\nStringValues\nStripeSizeBytes\nStrongKeyProtectionRequired\nStructValue\nStructuredLogDestinations\nStudio\nStudioArn\nStudioComponent\nStudioComponentInitializationScript\nStudioComponentSummary\nStudioEncryptionConfiguration\nStudioId\nStudioLifecycleConfigAppType\nStudioLifecycleConfigArn\nStudioLifecycleConfigContent\nStudioLifecycleConfigDetails\nStudioLifecycleConfigName\nStudioLifecycleConfigs\nStudioMembership\nStudioSummary\nStudios\nStyle\nStyleConfiguration\nStyleControl\nStyleOptions\nStylePassthrough\nStyleTargets\nSubBands\nSubChannelId\nSubChannelSummary\nSubChannels\nSubDomain\nSubDomainSetting\nSubErrorCode\nSubErrorCodeReason\nSubExpressions\nSubJobMetadata\nSubModule\nSubRegion\nSubResourceSummary\nSubResources\nSubSegmentNum\nSubSegmentsExpected\nSubSlotSetting\nSubSlotTypeComposition\nSubSlotValueElicitationSetting\nSubStages\nSubStatementData\nSubStatements\nSubType\nSubTypeCountLimitExceededException\nSubTypeName\nSubdirectory\nSubdivision\nSubdivisionCode\nSubdivisionName\nSubgopLength\nSubject\nSubjectAlternativeNameMatchers\nSubjectAlternativeNameSummaries\nSubjectAlternativeNames\nSubjectDetail\nSubjectDetailResponse\nSubjectFromWebIdentityToken\nSubjectId\nSubjectInformationAccess\nSubjectKey\nSubjectNameFlags\nSubjectNameFlagsV2\nSubjectNameFlagsV3\nSubjectNameFlagsV4\nSubjectPart\nSubjectStructure\nSubjectSummary\nSubjectType\nSubmissionDateTime\nSubmitAttachmentStateChangesRequest\nSubmitAttachmentStateChangesResponse\nSubmitContactEvaluationRequest\nSubmitContactEvaluationResponse\nSubmitContainerStateChangeRequest\nSubmitContainerStateChangeResponse\nSubmitFeedbackRequest\nSubmitJobRequest\nSubmitJobResponse\nSubmitMultiRegionAccessPointRoutesRequest\nSubmitTaskStateChangeRequest\nSubmitTaskStateChangeResponse\nSubmitTime\nSubmitTimeAfter\nSubmitTimeBefore\nSubmitTimeMillis\nSubmittedAfter\nSubmittedAfterTime\nSubmittedAt\nSubmittedBefore\nSubmittedBeforeTime\nSubmittedDate\nSubmittedJobsCount\nSubmittedSince\nSubmittedTime\nSubnet\nSubnetAlreadyInUse\nSubnetArn\nSubnetArns\nSubnetAssociation\nSubnetAvailabilityZone\nSubnetAvailabilityZoneId\nSubnetChangeProtection\nSubnetCidrBlockState\nSubnetCidrReservation\nSubnetCidrReservationId\nSubnetConfiguration\nSubnetConfigurations\nSubnetGroup\nSubnetGroupAlreadyExistsFault\nSubnetGroupIdentifier\nSubnetGroupInUseFault\nSubnetGroupName\nSubnetGroupNames\nSubnetGroupNotFoundFault\nSubnetGroupQuotaExceededFault\nSubnetGroupStatus\nSubnetGroups\nSubnetIPAddressLimitReachedException\nSubnetId\nSubnetIdList\nSubnetIdUpdates\nSubnetIdentifier\nSubnetIds\nSubnetInUse\nSubnetIpv4CidrReservations\nSubnetIpv6CidrBlockAssociation\nSubnetIpv6CidrReservations\nSubnetMapping\nSubnetMappings\nSubnetMask\nSubnetNotAllowedFault\nSubnetNotFound\nSubnetNotFoundException\nSubnetOfMatches\nSubnetOutpost\nSubnetOutpostArn\nSubnetQuotaExceededFault\nSubnetRouteTable\nSubnetStatus\nSubnets\nSubscribeInput\nSubscribePattern\nSubscribeRequest\nSubscribeResponse\nSubscribeResult\nSubscribeToDatasetRequest\nSubscribeToEventRequest\nSubscribeToShardEvent\nSubscribeToShardInput\nSubscribeToShardOutput\nSubscribedAt\nSubscribedDomain\nSubscribedDomains\nSubscribedRuleGroupSummary\nSubscribedWorkteam\nSubscribedWorkteams\nSubscriber\nSubscriberResource\nSubscribers\nSubscription\nSubscriptionAlreadyExistFault\nSubscriptionArn\nSubscriptionArnList\nSubscriptionCategoryNotFoundFault\nSubscriptionCreatedDateTime\nSubscriptionCreationTime\nSubscriptionDefinitionId\nSubscriptionDefinitionVersion\nSubscriptionDefinitionVersionArn\nSubscriptionDefinitionVersionId\nSubscriptionEndDate\nSubscriptionErrors\nSubscriptionEventIdNotFoundFault\nSubscriptionExpiryDate\nSubscriptionFilter\nSubscriptionId\nSubscriptionLimitExceededException\nSubscriptionLimits\nSubscriptionName\nSubscriptionNotFoundFault\nSubscriptionSeverityNotFoundFault\nSubscriptionStartDate\nSubscriptionState\nSubscriptionStatus\nSubscriptionType\nSubscriptions\nSubstatementType\nSubstitutionMap\nSubstitutions\nSubstring\nSubsystemId\nSubsystemVendorId\nSubtitle\nSubtitleFileUris\nSubtitles\nSubtitlesOutput\nSubtitlingType\nSubtotalOptions\nSubtype\nSucceeded\nSucceededActions\nSucceededCount\nSuccess\nSuccessCodes\nSuccessCount\nSuccessForeground\nSuccessRedirectionURL\nSuccessResponseHandlingConfig\nSuccessRetentionPeriodInDays\nSuccessSteps\nSuccessStrings\nSuccessTopic\nSuccessValues\nSuccesses\nSuccessful\nSuccessfulCampaignStateResponse\nSuccessfulEndpointCount\nSuccessfulFleetCancellations\nSuccessfulFleetDeletions\nSuccessfulFleetRequests\nSuccessfulInstanceCreditSpecificationItem\nSuccessfulInstanceCreditSpecifications\nSuccessfulLoginAttempts\nSuccessfulPackageVersionInfo\nSuccessfulQueuedPurchaseDeletion\nSuccessfulQueuedPurchaseDeletions\nSuccessfulRequest\nSuccessfulResponse\nSuccessfulShares\nSuccessfulSubmissions\nSuccessfullyAssociatedResources\nSuccessfullyDeletedLaunchTemplateVersions\nSuccessfullyDisassociatedResources\nSuffix\nSuggestModel\nSuggestRequest\nSuggestResponse\nSuggestStatus\nSuggestable\nSuggestableConfig\nSuggestableConfigList\nSuggestedAccounts\nSuggestedFix\nSuggestedPresentationDelaySeconds\nSuggestedQueryText\nSuggester\nSuggesterName\nSuggesterNames\nSuggesterStatus\nSuggesters\nSuggestion\nSuggestionAttributes\nSuggestionCount\nSuggestionHighlight\nSuggestionMatch\nSuggestionQuery\nSuggestionTextWithHighlights\nSuggestionTypes\nSuggestionValue\nSuggestions\nSuggestionsList\nSuite\nSuiteDefinitionConfiguration\nSuiteDefinitionInformation\nSuiteRunConfiguration\nSuiteRunInformation\nSum\nSumByAccount\nSumByDataSource\nSumByFeature\nSumByResource\nSummaries\nSummarizationAttributes\nSummarizedAttackVector\nSummarizedCounter\nSummary\nSummaryFields\nSummaryItems\nSummaryList\nSummaryMap\nSummaryStatistics\nSunday\nSunglasses\nSupernetOfMatches\nSupersededTemplates\nSuperuserParameters\nSupplementalCategories\nSupplementalImps\nSupplementalSettings\nSupplementaryFeature\nSupplementaryFeatures\nSupportDescription\nSupportEmail\nSupportLevel\nSupportLink\nSupportLowFramerateInputs\nSupportUrl\nSupported\nSupportedActivityStreamModes\nSupportedAddonList\nSupportedArchitectures\nSupportedBootModes\nSupportedCACertificateIdentifiers\nSupportedCharacterSets\nSupportedCompressionTypes\nSupportedContentTypes\nSupportedDPUSizes\nSupportedDeploymentModes\nSupportedEndpointType\nSupportedEndpointTypes\nSupportedEngineModes\nSupportedEngineVersions\nSupportedEngines\nSupportedFeatureNames\nSupportedFeatures\nSupportedFieldTypeDetails\nSupportedFilters\nSupportedGatewayCapacities\nSupportedHardwareType\nSupportedHour\nSupportedHyperParameters\nSupportedIdentityProviders\nSupportedInputModes\nSupportedInstanceType\nSupportedInstanceTypes\nSupportedIpAddressTypes\nSupportedLanguage\nSupportedLicenses\nSupportedLoadBalancerTypes\nSupportedLoginProviders\nSupportedMajorVersions\nSupportedMessagingContentTypes\nSupportedNcharCharacterSets\nSupportedNetworkTypes\nSupportedOperation\nSupportedOperations\nSupportedPermissionTypes\nSupportedPhoneNumberTypes\nSupportedPlatform\nSupportedPlatforms\nSupportedProductConfig\nSupportedProducts\nSupportedRealtimeInferenceInstanceTypes\nSupportedResourceType\nSupportedResponseMIMETypes\nSupportedRootDeviceTypes\nSupportedStorage\nSupportedStorageFilter\nSupportedStrategies\nSupportedTierList\nSupportedTimezones\nSupportedTrainingInstanceTypes\nSupportedTransformInstanceTypes\nSupportedTuningJobObjectiveMetrics\nSupportedUplinkGbps\nSupportedUsageClasses\nSupportedVersions\nSupportedVirtualizationTypes\nSupportingAccessPoint\nSupportingInsights\nSupports32BitFCnt\nSupportsBabelfish\nSupportsCDC\nSupportsCertificateRotationWithoutRestart\nSupportsClassB\nSupportsClassC\nSupportsClusters\nSupportsDBInstanceAutomatedBackupsReplication\nSupportsDistributedTraining\nSupportsEnhancedMonitoring\nSupportsGlobalDatabases\nSupportsIAMDatabaseAuthentication\nSupportsIops\nSupportsJoin\nSupportsKerberosAuthentication\nSupportsLinking\nSupportsLocalWriteForwarding\nSupportsLogExportsToCloudwatchLogs\nSupportsOptionVersionDowngrade\nSupportsParallelQuery\nSupportsPerformanceInsights\nSupportsReadReplica\nSupportsStorageAutoscaling\nSupportsStorageEncryption\nSupportsStorageThroughput\nSuppressDataIdentifier\nSuppressedDestination\nSuppressedDestinationAttributes\nSuppressedDestinationSummaries\nSuppressedDestinationSummary\nSuppressedLinesOfCodeCount\nSuppressedReasons\nSuppressionAttributes\nSuppressionListDestination\nSuppressionListImportAction\nSuppressionOptions\nSurname\nSurroundExMode\nSurroundMode\nSurroundTrim\nSuspendActions\nSuspendContactRecordingRequest\nSuspendGameServerGroupInput\nSuspendGameServerGroupOutput\nSuspendedActions\nSuspendedCause\nSuspendedDate\nSuspendedProcess\nSuspendedProcesses\nSuspendedState\nSuspensionReason\nSustainedClockSpeedInGhz\nSvmActiveDirectoryConfiguration\nSvmAdminPassword\nSvmEndpoint\nSvmEndpoints\nSvmName\nSvmUuid\nSwapEnvironmentCNAMEsMessage\nSwappiness\nSwitchRunningMode\nSwitchover\nSwitchoverBlueGreenDeploymentRequest\nSwitchoverBlueGreenDeploymentResponse\nSwitchoverDetail\nSwitchoverDetails\nSwitchoverGlobalClusterMessage\nSwitchoverGlobalClusterResult\nSwitchoverReadReplicaMessage\nSwitchoverReadReplicaResult\nSwitchoverTimeout\nSybaseSettings\nSymbol\nSymbolicLink\nSymmetricEncryptionAttributes\nSyncBlocker\nSyncBlockerContext\nSyncCompliance\nSyncConfig\nSyncCount\nSyncCreatedTime\nSyncDeploymentJobRequest\nSyncDeploymentJobResponse\nSyncFormat\nSyncJobStatus\nSyncJobSummary\nSyncLastModifiedTime\nSyncName\nSyncResourceRequest\nSyncResourceResponse\nSyncResourceStatus\nSyncResourceSummary\nSyncSessionToken\nSyncSessionsCount\nSyncShadow\nSyncSource\nSyncState\nSyncStates\nSyncStatus\nSyncThreshold\nSyncType\nSynchronizationStatus\nSynonymRuleCount\nSynonyms\nSyntax\nSyntaxToken\nSyntaxTokens\nSynthesisTask\nSynthesisTaskNotFoundException\nSynthesisTasks\nSynthesizeSpeechInput\nSynthesizeSpeechOutput\nSyslogIp\nSystem\nSystemControl\nSystemControls\nSystemEvent\nSystemId\nSystemIds\nSystemInfo\nSystemInstanceDescription\nSystemInstanceFilter\nSystemInstanceSummary\nSystemResourceLimits\nSystemStatus\nSystemSuggestedValue\nSystemTemplateDescription\nSystemTemplateFilter\nSystemTemplateSummary\nSystemType\nSystemsManagerAgent\nTCPFlagField\nTCPFlags\nTERMINATING\nTFIMetricDataPoint\nTFIModelPerformance\nTFITrainingMetricsValue\nTGWOnDeviceService\nTGWOnDeviceServiceConfiguration\nTLDRulesViolation\nTLEData\nTLEEphemeris\nTLSEnabled\nTLSInspectionConfiguration\nTLSInspectionConfigurationArn\nTLSInspectionConfigurationId\nTLSInspectionConfigurationMetadata\nTLSInspectionConfigurationName\nTLSInspectionConfigurationResponse\nTLSInspectionConfigurationStatus\nTLSInspectionConfigurations\nTLSSecurityPolicy\nTTL\nTable\nTableAggregatedFieldWells\nTableAlreadyExistsException\nTableArn\nTableAutoScalingDescription\nTableBorderOptions\nTableCatalogId\nTableCell\nTableCellConditionalFormatting\nTableCellImageScalingConfiguration\nTableCellImageSizingConfiguration\nTableCellStyle\nTableClass\nTableClassOverride\nTableClassSummary\nTableColumn\nTableConditionalFormatting\nTableConditionalFormattingOption\nTableConfiguration\nTableCount\nTableCreationDateTime\nTableCreationParameters\nTableData\nTableDataImportJobMetadata\nTableDescription\nTableError\nTableExcerpt\nTableFieldCustomIconContent\nTableFieldCustomTextContent\nTableFieldImageConfiguration\nTableFieldLinkConfiguration\nTableFieldLinkContentConfiguration\nTableFieldOption\nTableFieldOptions\nTableFieldURLConfiguration\nTableFieldWells\nTableFormat\nTableId\nTableIdentifier\nTableInUseException\nTableInlineVisualization\nTableInlineVisualizations\nTableInput\nTableLFTagPolicy\nTableLFTagPolicyAndPermissions\nTableLimitExceededFault\nTableList\nTableLocation\nTableMappings\nTableMaxReadCapacityUnits\nTableMaxWriteCapacityUnits\nTableMember\nTableMetadata\nTableMetadataList\nTableName\nTableNameUpdate\nTableNames\nTableNotFoundException\nTableObject\nTableOptions\nTablePaginatedReportOptions\nTablePattern\nTablePinnedFieldOptions\nTablePrefix\nTableResource\nTableRestoreNotFoundFault\nTableRestoreRequestId\nTableRestoreStatus\nTableRestoreStatusDetails\nTableRestoreStatusMessage\nTableRow\nTableRowConditionalFormatting\nTableSchema\nTableSideBorderOptions\nTableSizeBytes\nTableSortConfiguration\nTableState\nTableStatistics\nTableStatus\nTableStyleTarget\nTableSummary\nTableToReload\nTableType\nTableUnaggregatedFieldWells\nTableVersion\nTableVersionError\nTableVersions\nTableVisual\nTableWildcard\nTableWithColumns\nTableWithColumnsResource\nTables\nTablesCreated\nTablesDeleted\nTablesErrored\nTablesLoaded\nTablesLoading\nTablesQueued\nTablesToDelete\nTablesToReload\nTablesUpdated\nTabularConditions\nTabularJobConfig\nTabularResolvedAttributes\nTac\nTag\nTagAttendeeRequest\nTagCertificateAuthorityRequest\nTagCollection\nTagCollectionFilter\nTagColumnOperation\nTagCondition\nTagCostEstimationResourceCollectionFilter\nTagCount\nTagCriterionForJob\nTagCriterionPairForJob\nTagDeliveryStreamInput\nTagDescription\nTagDescriptions\nTagException\nTagFilter\nTagFilters\nTagHealth\nTagInfoForResource\nTagInput\nTagInstanceProfileRequest\nTagKey\nTagKeyFilters\nTagKeyList\nTagKeyOnly\nTagKeyScope\nTagKeys\nTagKeysListRequiredException\nTagLimitExceededException\nTagLimitExceededFault\nTagList\nTagListEntry\nTagListMessage\nTagLogGroupRequest\nTagMFADeviceRequest\nTagMeetingRequest\nTagMultiValueDelimiter\nTagNames\nTagNotFoundFault\nTagOpenIDConnectProviderRequest\nTagOperationException\nTagOptionDetail\nTagOptionDetails\nTagOptionId\nTagOptionNotMigratedException\nTagOptionSummary\nTagOptions\nTagOutput\nTagPolicyException\nTagPolicyRequest\nTagPolicyViolationException\nTagProjectRequest\nTagProjectResult\nTagQueryConfiguration\nTagQueueRequest\nTagQuotaPerResourceExceeded\nTagRef\nTagRequiredException\nTagResourceInput\nTagResourceOutput\nTagResourceRequest\nTagResourceResponse\nTagResourceResult\nTagResourcesInput\nTagResourcesOutput\nTagRestrictedResources\nTagRoleRequest\nTagRuleConfigurations\nTagRules\nTagSAMLProviderRequest\nTagScopeTerm\nTagSearchCondition\nTagServerCertificateRequest\nTagSet\nTagSetListLimitExceededException\nTagSpecification\nTagSpecifications\nTagStepDetails\nTagStreamInput\nTagUserRequest\nTagValue\nTagValuePair\nTagValueScope\nTagValues\nTagValuesToAdd\nTagValuesToDelete\nTaggedDatabase\nTaggedResource\nTaggedResourceListMessage\nTaggedResources\nTaggedTable\nTagging\nTaggingDirective\nTaggingFailedException\nTags\nTagsAlreadyExistException\nTagsLimitExceededException\nTagsList\nTagsMapRequiredException\nTagsModel\nTagsPerPage\nTagsPerResourceExceededLimitException\nTagsToAdd\nTagsToDelete\nTagsToRemove\nTagsToUpdate\nTagsType\nTaint\nTape\nTapeARN\nTapeARNs\nTapeArchive\nTapeArchives\nTapeBarcode\nTapeBarcodePrefix\nTapeCreatedDate\nTapeDriveType\nTapeInfo\nTapeInfos\nTapeRecoveryPointInfo\nTapeRecoveryPointInfos\nTapeRecoveryPointTime\nTapeSizeInBytes\nTapeStatus\nTapeUsedInBytes\nTapes\nTarget\nTargetARN\nTargetAccounts\nTargetAction\nTargetActionType\nTargetAddress\nTargetApplications\nTargetArn\nTargetAttributeName\nTargetBackupVault\nTargetBackupVaultName\nTargetBands\nTargetBrokerEBSVolumeInfo\nTargetBucket\nTargetCapacity\nTargetCapacitySpecification\nTargetCapacitySpecificationRequest\nTargetCapacityUnitType\nTargetClusterArn\nTargetClusterInfo\nTargetClusterType\nTargetColumn\nTargetConfiguration\nTargetConfigurationRequest\nTargetConfigurationValueRollup\nTargetConfigurationValueSet\nTargetConfigurations\nTargetContainerHostname\nTargetContainerRepository\nTargetControls\nTargetCount\nTargetCpuUtilizationPerCore\nTargetCustomAvailabilityZone\nTargetCustomerId\nTargetDBClusterParameterGroupDescription\nTargetDBClusterParameterGroupIdentifier\nTargetDBClusterParameterGroupName\nTargetDBClusterSnapshotIdentifier\nTargetDBInstanceIdentifier\nTargetDBParameterGroupDescription\nTargetDBParameterGroupIdentifier\nTargetDBParameterGroupName\nTargetDBSnapshotIdentifier\nTargetDataProviderDescriptors\nTargetDatabase\nTargetDatabaseName\nTargetDbClusterIdentifier\nTargetDbType\nTargetDescription\nTargetDestination\nTargetDetails\nTargetDevice\nTargetDistributionId\nTargetDocumentAttributeKey\nTargetDocumentAttributeValue\nTargetDocumentAttributeValueDeletion\nTargetDpus\nTargetDurationCompatibilityMode\nTargetEncryptionType\nTargetEndpointArn\nTargetEngineName\nTargetEngineVersion\nTargetEnvironment\nTargetEnvironmentName\nTargetEventTypes\nTargetFacetName\nTargetFailure\nTargetFileSystemValues\nTargetGrant\nTargetGrants\nTargetGroup\nTargetGroupARNs\nTargetGroupArn\nTargetGroupArns\nTargetGroupAssociationLimitException\nTargetGroupAttribute\nTargetGroupConfig\nTargetGroupInfo\nTargetGroupName\nTargetGroupNotFoundException\nTargetGroupPairInfo\nTargetGroupStickinessConfig\nTargetGroupSummary\nTargetGroupTuple\nTargetGroups\nTargetGroupsConfig\nTargetHealth\nTargetHealthDescription\nTargetHealthDescriptions\nTargetId\nTargetIdFilters\nTargetIdType\nTargetIds\nTargetImage\nTargetImageOrientationCorrection\nTargetInUseException\nTargetInstance\nTargetInstanceType\nTargetInstances\nTargetIops\nTargetIps\nTargetKafkaVersion\nTargetKeyId\nTargetKeyPrefix\nTargetLabelColumn\nTargetLanguageCode\nTargetLanguageCodes\nTargetLensVersion\nTargetLkfs\nTargetLocation\nTargetLocationAlarmConfiguration\nTargetLocationMaxConcurrency\nTargetLocationMaxErrors\nTargetLocations\nTargetMaps\nTargetMeasureName\nTargetMember\nTargetMembershipsPerSubChannel\nTargetModel\nTargetMonitorNits\nTargetMultiAttachEnabled\nTargetMultiMeasureAttributeName\nTargetMultiMeasureName\nTargetName\nTargetNetwork\nTargetNetworkCidr\nTargetNetworkId\nTargetNodeType\nTargetNotConnected\nTargetNotConnectedException\nTargetNotFoundException\nTargetNumberOfBrokerNodes\nTargetNumberOfNodes\nTargetObjectReference\nTargetObjectiveMetricValue\nTargetOnDemandCapacity\nTargetOnDeviceService\nTargetOnDeviceServices\nTargetOptionGroupDescription\nTargetOptionGroupIdentifier\nTargetOriginId\nTargetParameter\nTargetParameterName\nTargetParameters\nTargetPath\nTargetPer\nTargetPlatform\nTargetPrefix\nTargetProcess\nTargetProductId\nTargetProductName\nTargetReference\nTargetRegion\nTargetReplicationInstanceArn\nTargetRequiredException\nTargetReservationValue\nTargetReservedNodeCount\nTargetReservedNodeOffering\nTargetReservedNodeOfferingId\nTargetReservedNodeType\nTargetResource\nTargetResourceCount\nTargetResourceType\nTargetResourceTypeParameter\nTargetResourceTypeSummary\nTargetRole\nTargetRouteTableId\nTargetSamplingRate\nTargetSchemaName\nTargetShardCount\nTargetSheetId\nTargetSize\nTargetSnapshotIdentifier\nTargetSnapshotName\nTargetSnapshotValues\nTargetSpotCapacity\nTargetStatus\nTargetStores\nTargetString\nTargetSubnet\nTargetSummary\nTargetTable\nTargetTableName\nTargetTags\nTargetText\nTargetThroughput\nTargetTrackingConfiguration\nTargetTrackingConfigurations\nTargetTrackingMetric\nTargetTrackingMetricDataQuery\nTargetTrackingMetricDimension\nTargetTrackingMetricStat\nTargetTrackingScalingPolicyConfiguration\nTargetType\nTargetTypes\nTargetUser\nTargetUsers\nTargetValue\nTargetValues\nTargetVariant\nTargetVersion\nTargetVersions\nTargetViolationReason\nTargetViolationReasons\nTargetVisualOptions\nTargetVisuals\nTargetVisualsConfiguration\nTargetVolumeType\nTargetVolumeValues\nTargetVpcSubnetId\nTargetWorkspaceId\nTargetedMessages\nTargetedSentimentDetectionJobFilter\nTargetedSentimentDetectionJobProperties\nTargetedSentimentDetectionJobPropertiesList\nTargetedSentimentEntity\nTargetedSentimentMention\nTargets\nTargetsRequiredException\nTask\nTaskAction\nTaskActionDefinition\nTaskAlreadyExistsException\nTaskArn\nTaskAvailabilityLifetimeInSeconds\nTaskConfig\nTaskCount\nTaskCreatedAt\nTaskCredentials\nTaskData\nTaskDefinition\nTaskDefinitionArn\nTaskDefinitionPlacementConstraint\nTaskDefinitionType\nTaskDefinitions\nTaskDescription\nTaskDetails\nTaskDoesNotExist\nTaskEndTime\nTaskError\nTaskExecutionArn\nTaskExecutionId\nTaskExecutionListEntry\nTaskExecutionResultDetail\nTaskExecutions\nTaskFailedEventDetails\nTaskFieldMappings\nTaskFilter\nTaskHandle\nTaskId\nTaskIds\nTaskInvocationParameters\nTaskKeywords\nTaskList\nTaskListEntry\nTaskListItem\nTaskLogs\nTaskNotFoundException\nTaskObject\nTaskOverride\nTaskParameters\nTaskProperties\nTaskQueueing\nTaskReportConfig\nTaskRoleArn\nTaskRun\nTaskRunFilterCriteria\nTaskRunId\nTaskRunProperties\nTaskRunSecurityConfigurationName\nTaskRunSortCriteria\nTaskRunType\nTaskRuns\nTaskSchedule\nTaskScheduledEventDetails\nTaskSet\nTaskSetNotFoundException\nTaskStartFailedEventDetails\nTaskStartTime\nTaskStartedEventDetails\nTaskState\nTaskStatistics\nTaskStatisticsForAuditCheck\nTaskStatus\nTaskStatusReason\nTaskSubmitFailedEventDetails\nTaskSubmittedEventDetails\nTaskSucceededEventDetails\nTaskSummary\nTaskTemplateConstraints\nTaskTemplateDefaultFieldValue\nTaskTemplateDefaults\nTaskTemplateField\nTaskTemplateFieldIdentifier\nTaskTemplateId\nTaskTemplateMetadata\nTaskTemplates\nTaskTimeLimitInSeconds\nTaskTimedOut\nTaskTimedOutEventDetails\nTaskTitle\nTaskType\nTasks\nTaxDocuments\nTcpFlags\nTcpRoute\nTcpRouteAction\nTcpRouteMatch\nTcpTimeout\nTcs\nTdeCredentialArn\nTdeCredentialPassword\nTdscdma\nTdscdmaLocalId\nTdscdmaNmr\nTdscdmaNmrObj\nTdscdmaObj\nTdscdmaTimingAdvance\nTdtInterval\nTeam\nTeamId\nTeamMember\nTeamMemberAlreadyAssociatedException\nTeamMemberNotFoundException\nTechContact\nTechPrivacy\nTechnicalCueFilter\nTechnicalCueSegment\nTelecine\nTelemetries\nTelemetry\nTelemetryConfiguration\nTelemetryConfigurationUpdate\nTelemetryMetadata\nTelemetryRecord\nTelemetryRecords\nTelephone\nTelephony\nTelephonyConfig\nTelephonySettings\nTeletextDestinationSettings\nTeletextGridControl\nTeletextSourceSettings\nTeletextSpacing\nTempDir\nTempDirectory\nTemperatureUnit\nTemplate\nTemplateActionDocument\nTemplateActionsRequestFilters\nTemplateActiveVersionRequest\nTemplateAlias\nTemplateAliasList\nTemplateArn\nTemplateBody\nTemplateConfiguration\nTemplateContent\nTemplateCreateMessageBody\nTemplateData\nTemplateDescription\nTemplateDoesNotExistException\nTemplateError\nTemplateId\nTemplateInput\nTemplateLinkedPolicyDefinition\nTemplateLinkedPolicyDefinitionDetail\nTemplateLinkedPolicyDefinitionItem\nTemplateLocation\nTemplateMetadata\nTemplateName\nTemplateParameter\nTemplateParameterConfiguration\nTemplateParameters\nTemplateQuestions\nTemplateResponse\nTemplateRevision\nTemplateS3Uri\nTemplateSSMDocumentDetails\nTemplateSelectionExpression\nTemplateSourceAnalysis\nTemplateSourceEntity\nTemplateSourceTemplate\nTemplateStage\nTemplateStepGroupSummary\nTemplateStepSummary\nTemplateSubject\nTemplateSummary\nTemplateSummaryConfig\nTemplateSummaryList\nTemplateSyncConfig\nTemplateType\nTemplateURL\nTemplateUrl\nTemplateV2\nTemplateV3\nTemplateV4\nTemplateVersion\nTemplateVersionDefinition\nTemplateVersionNumber\nTemplateVersionResponse\nTemplateVersionSummary\nTemplateVersionSummaryList\nTemplateVersionsResponse\nTemplatedPathList\nTemplates\nTemplatesMetadata\nTemplatesNotAvailableInRegionException\nTemplatesResponse\nTemporalAdaptiveQuantization\nTemporalAq\nTemporalFilterSettings\nTemporalIds\nTemporalStatisticsConfigInput\nTemporaryCredential\nTemporaryPassword\nTemporaryPasswordValidityDays\nTemporaryRestoreDays\nTenancy\nTenant\nTenantDomain\nTenantId\nTenantIds\nTensorBoardAppSettings\nTensorBoardOutputConfig\nTenthFractionsOfACent\nTeradataParameters\nTerm\nTermCount\nTermEndDate\nTermInYears\nTermStartDate\nTerminalRoutingStrategyException\nTerminalStateException\nTerminateAppRequest\nTerminateCaptions\nTerminateClientVpnConnectionsRequest\nTerminateClientVpnConnectionsResult\nTerminateConnectionStatus\nTerminateEnvByForce\nTerminateEnvironmentMessage\nTerminateInstanceInAutoScalingGroupType\nTerminateInstances\nTerminateInstancesRequest\nTerminateInstancesResult\nTerminateInstancesWithExpiration\nTerminateJobFlowsInput\nTerminateJobRequest\nTerminateProvisionedProductInput\nTerminateProvisionedProductOutput\nTerminateRecommendationDetail\nTerminateRecoveryInstancesRequest\nTerminateRecoveryInstancesResponse\nTerminateRequest\nTerminateResources\nTerminateSessionRequest\nTerminateSessionResponse\nTerminateSolNetworkInstanceInput\nTerminateSolNetworkInstanceOutput\nTerminateTargetInstancesRequest\nTerminateTargetInstancesResponse\nTerminateToken\nTerminateWorkflowExecutionInput\nTerminateWorkspaceRequests\nTerminateWorkspacesRequest\nTerminateWorkspacesResult\nTerminated\nTerminatedAt\nTerminating\nTerminatingInstances\nTermination\nTerminationDate\nTerminationDateTime\nTerminationDelay\nTerminationHealth\nTerminationPolicies\nTerminationPolicyTypes\nTerminationProtected\nTerminationProtectionEnabled\nTerminationTime\nTerminationWaitInSeconds\nTerminologyData\nTerminologyDataFormat\nTerminologyDataLocation\nTerminologyNames\nTerminologyProperties\nTerminologyPropertiesList\nTerms\nTermsAggregation\nTerraformSource\nTest\nTestAlarmRequest\nTestAlarmResult\nTestAuthorizationRequest\nTestAuthorizationResponse\nTestAvailabilityConfigurationRequest\nTestAvailabilityConfigurationResponse\nTestCase\nTestCaseFilter\nTestCaseRun\nTestCaseScenario\nTestConnectionMessage\nTestConnectionRequest\nTestConnectionResponse\nTestCustomDataIdentifierRequest\nTestCustomDataIdentifierResponse\nTestDNSAnswerRequest\nTestDNSAnswerResponse\nTestDurationInSeconds\nTestEventPatternRequest\nTestEventPatternResponse\nTestEventType\nTestExecutionResultFilterBy\nTestExecutionResultItems\nTestExecutionSortBy\nTestExecutionSummary\nTestExecutionTarget\nTestFailoverMessage\nTestFailoverNotAvailableFault\nTestFailoverResult\nTestFunctionFailed\nTestFunctionRequest\nTestFunctionResult\nTestGridProject\nTestGridSession\nTestGridSessionAction\nTestGridSessionArtifact\nTestGridVpcConfig\nTestHypervisorConfigurationInput\nTestIdentityProviderRequest\nTestIdentityProviderResponse\nTestInvokeAuthorizerRequest\nTestInvokeAuthorizerResponse\nTestInvokeMethodRequest\nTestInvokeMethodResponse\nTestMetricFilterRequest\nTestMetricFilterResponse\nTestMigrationMessage\nTestMigrationResponse\nTestMode\nTestPassed\nTestPhoneNumber\nTestRecommendation\nTestRenderEmailTemplateRequest\nTestRenderEmailTemplateResponse\nTestRenderTemplateRequest\nTestRenderTemplateResponse\nTestReportSummary\nTestRepositoryTriggersInput\nTestRepositoryTriggersOutput\nTestResult\nTestRoleRequest\nTestRoleResponse\nTestS3Uri\nTestSegmentPatternRequest\nTestSegmentPatternResponse\nTestSetDiscrepancyErrors\nTestSetDiscrepancyReportBotAliasTarget\nTestSetDiscrepancyReportResourceTarget\nTestSetExportSpecification\nTestSetGenerationDataSource\nTestSetImportInputLocation\nTestSetImportResourceSpecification\nTestSetIntentDiscrepancyItem\nTestSetSlotDiscrepancyItem\nTestSetSortBy\nTestSetStorageLocation\nTestSetSummary\nTestSetTurnRecord\nTestSetTurnResult\nTestTypeInput\nTestTypeOutput\nTestWindowEnd\nTestWindowStart\nTestWindowSummary\nTestWindows\nTestWirelessDeviceRequest\nTestWirelessDeviceResponse\nTestingData\nTestingDataResult\nText\nTextArea\nTextAreaControlDisplayOptions\nTextArrayOptions\nTextBody\nTextBoxes\nTextClassificationJobConfig\nTextColor\nTextConditionalFormat\nTextConfig\nTextContent\nTextContentUpdate\nTextControlPlaceholderOptions\nTextDetection\nTextDetectionResult\nTextDetections\nTextDocumentStatistics\nTextField\nTextFieldControlDisplayOptions\nTextFormat\nTextInputEvent\nTextInputSpecification\nTextLengthExceededException\nTextList\nTextLocales\nTextLogDestination\nTextLogSetting\nTextModelVersion\nTextOptions\nTextPart\nTextPlain\nTextQualifier\nTextResponseEvent\nTextSizeLimitExceededException\nTextTransformation\nTextTransformations\nTextTranslationJobFilter\nTextTranslationJobProperties\nTextTranslationJobPropertiesList\nTextType\nTextWithHighlights\nTextWithHighlightsValue\nTextWrap\nTheme\nThemeAlias\nThemeAliasList\nThemeArn\nThemeConfiguration\nThemeError\nThemeId\nThemeSummary\nThemeSummaryList\nThemeValue\nThemeValues\nThemeVersion\nThemeVersionNumber\nThemeVersionSummary\nThemeVersionSummaryList\nThemes\nThesaurusSummary\nThesaurusSummaryItems\nThickness\nThing\nThingArn\nThingAttribute\nThingConnectivity\nThingDocument\nThingGroupDocument\nThingGroupIndexingConfiguration\nThingGroupMetadata\nThingGroupProperties\nThingIndexingConfiguration\nThingName\nThingTypeDefinition\nThingTypeMetadata\nThingTypeProperties\nThirdPartyFirewall\nThirdPartyFirewallFirewallPolicies\nThirdPartyFirewallFirewallPolicy\nThirdPartyFirewallMissingExpectedRouteTableViolation\nThirdPartyFirewallMissingFirewallViolation\nThirdPartyFirewallMissingSubnetViolation\nThirdPartyFirewallPolicy\nThirdPartyFirewallStatus\nThirdPartyJob\nThirdPartyJobData\nThirdPartyJobDetails\nThirdPartySourceRepository\nThousandSeparatorOptions\nThousandsSeparator\nThreadFieldMappings\nThreadId\nThreadsPerCore\nThreat\nThreatDetectedByName\nThreatIntelIndicator\nThreatIntelIndicatorCategory\nThreatIntelIndicatorLastObservedAt\nThreatIntelIndicatorSource\nThreatIntelIndicatorSourceUrl\nThreatIntelIndicatorType\nThreatIntelIndicatorValue\nThreatIntelIndicators\nThreatIntelSetId\nThreatIntelSetIds\nThreatIntelligenceDetail\nThreatIntelligenceDetails\nThreatListName\nThreatName\nThreatNames\nThreats\nThreatsDetectedItemCount\nThreshold\nThresholdComparator\nThresholdCount\nThresholdExpression\nThresholdFraction\nThresholdMetricId\nThresholdPercentage\nThresholdType\nThresholdV2\nThresholdValue\nThresholdsWaitTime\nThrottleCount\nThrottleSettings\nThrottledClientException\nThrottledException\nThrottlingBurstLimit\nThrottlingException\nThrottlingRateLimit\nThroughResources\nThroughResourcesStatement\nThroughResourcesStatementRequest\nThroughput\nThroughputCapacity\nThroughputLimitExceeded\nThroughputMode\nThroughputOther\nThroughputRead\nThroughputTotal\nThroughputWrite\nThrowOnDuplicate\nThumbnail\nThumbnailConfig\nThumbnailConfiguration\nThumbnailDetail\nThumbnailDetails\nThumbnailEncryption\nThumbnailHeight\nThumbnailInterval\nThumbnailPattern\nThumbnailType\nThumbnailWidth\nThumbnails\nThumbprint\nThumbprintList\nThursday\nTicServerUrl\nTickLabelOptions\nTicketId\nTicketIds\nTicketList\nTier\nTiering\nTieringPolicy\nTieringStartTime\nTierings\nTile\nTileAspectRatio\nTileCount\nTileHeight\nTileLayout\nTileLayoutStyle\nTileOrder\nTilePosition\nTileStyle\nTileWidth\nTiles\nTime\nTimeAlignmentBoundary\nTimeBasedAutoScalingConfiguration\nTimeBasedAutoScalingConfigurations\nTimeBasedCanary\nTimeBasedCollectionScheme\nTimeBasedForecastProperties\nTimeBasedLinear\nTimeColumn\nTimeCommitmentInSeconds\nTimeCreated\nTimeDelaySeconds\nTimeDelta\nTimeDeltaUnits\nTimeEqualityFilter\nTimeFormat\nTimeGranularity\nTimeInNanos\nTimeLeftSeconds\nTimeLimitExceededException\nTimeLoggingStarted\nTimeLoggingStopped\nTimeOfDay\nTimeOfTheDay\nTimeOffset\nTimePeriod\nTimePointGranularity\nTimeRange\nTimeRangeDrillDownFilter\nTimeRangeFilter\nTimeRangeFilterInput\nTimeRangeFilterOutput\nTimeRangeFilterValue\nTimeRangeLowerBound\nTimeRangeType\nTimeRangeUpperBound\nTimeRangeValue\nTimeRanges\nTimeSeries\nTimeSeriesCondition\nTimeSeriesConditions\nTimeSeriesConfig\nTimeSeriesDataPoint\nTimeSeriesFeedback\nTimeSeriesForecastingJobConfig\nTimeSeriesForecastingSettings\nTimeSeriesGranularity\nTimeSeriesId\nTimeSeriesIdentifiers\nTimeSeriesList\nTimeSeriesMeasureValueColumnInfo\nTimeSeriesReplacementsDataSource\nTimeSeriesSelector\nTimeSeriesServiceStatistics\nTimeSeriesSummaries\nTimeSeriesSummary\nTimeSeriesTransformation\nTimeSeriesTransformations\nTimeSeriesValue\nTimeSignalMessage\nTimeSpan\nTimeStamp\nTimeToLive\nTimeToLiveDescription\nTimeToLiveInSeconds\nTimeToLiveSpecification\nTimeToLiveStatus\nTimeUnit\nTimeWindow\nTimeZone\nTimeZoneId\nTimecode\nTimecodeBurnin\nTimecodeBurninSettings\nTimecodeConfig\nTimecodeInsertion\nTimecodeSource\nTimecodeStart\nTimedMetadata\nTimedMetadataBehavior\nTimedMetadataBoxVersion\nTimedMetadataId3Frame\nTimedMetadataId3Period\nTimedMetadataInsertion\nTimedMetadataPid\nTimedMetadataSchemeIdUri\nTimedMetadataValue\nTimedOutSteps\nTimeframeCap\nTimeline\nTimelineEvent\nTimeout\nTimeoutAction\nTimeoutActions\nTimeoutConfig\nTimeoutCount\nTimeoutDurationMinutes\nTimeoutInMillis\nTimeoutInMinutes\nTimeoutInSeconds\nTimeoutSeconds\nTimer\nTimerCanceledEventAttributes\nTimerDefinition\nTimerFiredEventAttributes\nTimerStartedEventAttributes\nTimerType\nTimerValue\nTimers\nTimes\nTimestamp\nTimestampAttributeName\nTimestampColumn\nTimestampColumnName\nTimestampDeltaMilliseconds\nTimestampForCollection\nTimestampFormat\nTimestampFormats\nTimestampList\nTimestampMetricValuePair\nTimestampMetricValuePairList\nTimestampOffset\nTimestampOffsetMode\nTimestampOutOfBoundsException\nTimestampPartition\nTimestampRange\nTimestampRanges\nTimestampStructure\nTimestampValue\nTimestamps\nTimestreamAction\nTimestreamConfig\nTimestreamConfiguration\nTimestreamDestination\nTimestreamDimension\nTimestreamRegistrationResponse\nTimestreamResources\nTimestreamSettings\nTimestreamTimestamp\nTimezone\nTimezoneEstimationMethods\nTimezoneName\nTimezoneOffset\nTimezonesCompletedCount\nTimezonesTotalCount\nTiming\nTimingInformation\nTipOfSourceReferenceIsDifferentException\nTipsDivergenceExceededException\nTitle\nTitleAggregation\nTitleAggregationResponse\nTitleOptions\nTitleOverride\nTitleRequiredException\nTld\nTlogAccessMode\nTls\nTlsCertificate\nTlsCertificateData\nTlsCiphers\nTlsConfig\nTlsConfigInput\nTlsContext\nTlsPolicy\nTlsSessionResumptionMode\nTlsValidationContext\nTlsValidationContextAcmTrust\nTlsValidationContextFileTrust\nTlsValidationContextSdsTrust\nTmpDirIAMRole\nTmpfs\nTo\nToAddresses\nToDate\nToDbClusterArn\nToExclusive\nToKey\nToPhoneNumber\nToPort\nToTime\nToTimeStamp\nToType\nToggleButtonsVisibility\nToken\nTokenAlreadyExistsException\nTokenBalance\nTokenCode\nTokenData\nTokenDomains\nTokenDuration\nTokenEndpoint\nTokenFilter\nTokenId\nTokenIdentifier\nTokenIds\nTokenKey\nTokenKeyId\nTokenProperties\nTokenType\nTokenValidityUnits\nTokenValidityUnitsType\nTokenValue\nTokenizedBody\nTokenizedTitle\nTokens\nTollFreePrefix\nTooLongCSPInResponseHeadersPolicy\nTooManyAccessPointsException\nTooManyActionsException\nTooManyApplicationVersionsException\nTooManyApplicationsException\nTooManyBucketsException\nTooManyCacheBehaviors\nTooManyCachePolicies\nTooManyCertificates\nTooManyCertificatesException\nTooManyCloudFrontOriginAccessIdentities\nTooManyConfigurationTemplatesException\nTooManyContinuousDeploymentPolicies\nTooManyCookieNamesInWhiteList\nTooManyCookiesInCachePolicy\nTooManyCookiesInOriginRequestPolicy\nTooManyCustomHeadersInResponseHeadersPolicy\nTooManyDistributionCNAMEs\nTooManyDistributions\nTooManyDistributionsAssociatedToCachePolicy\nTooManyDistributionsAssociatedToFieldLevelEncryptionConfig\nTooManyDistributionsAssociatedToKeyGroup\nTooManyDistributionsAssociatedToOriginAccessControl\nTooManyDistributionsAssociatedToOriginRequestPolicy\nTooManyDistributionsAssociatedToResponseHeadersPolicy\nTooManyDistributionsWithFunctionAssociations\nTooManyDistributionsWithLambdaAssociations\nTooManyDistributionsWithSingleFunctionARN\nTooManyEntriesInBatchRequestException\nTooManyEnvironmentsException\nTooManyFailedAttemptsException\nTooManyFieldLevelEncryptionConfigs\nTooManyFieldLevelEncryptionContentTypeProfiles\nTooManyFieldLevelEncryptionEncryptionEntities\nTooManyFieldLevelEncryptionFieldPatterns\nTooManyFieldLevelEncryptionProfiles\nTooManyFieldLevelEncryptionQueryArgProfiles\nTooManyFunctionAssociations\nTooManyFunctions\nTooManyHeadersInCachePolicy\nTooManyHeadersInForwardedValues\nTooManyHeadersInOriginRequestPolicy\nTooManyHealthChecks\nTooManyHostedZones\nTooManyInvalidationsInProgress\nTooManyKeyGroups\nTooManyKeyGroupsAssociatedToDistribution\nTooManyKeySigningKeys\nTooManyLabelsException\nTooManyLambdaFunctionAssociations\nTooManyListenersException\nTooManyLoadBalancersException\nTooManyOriginAccessControls\nTooManyOriginCustomHeaders\nTooManyOriginGroupsPerDistribution\nTooManyOriginRequestPolicies\nTooManyOrigins\nTooManyPlatformsException\nTooManyPoliciesException\nTooManyPublicKeys\nTooManyPublicKeysInKeyGroup\nTooManyQueryStringParameters\nTooManyQueryStringsInCachePolicy\nTooManyQueryStringsInOriginRequestPolicy\nTooManyRealtimeLogConfigs\nTooManyRegistrationsForTargetIdException\nTooManyRemoveHeadersInResponseHeadersPolicy\nTooManyRequests\nTooManyRequestsException\nTooManyResponseHeadersPolicies\nTooManyRulesException\nTooManyStreamingDistributionCNAMEs\nTooManyStreamingDistributions\nTooManySubscriptionsException\nTooManyTagKeysException\nTooManyTags\nTooManyTagsException\nTooManyTagsFault\nTooManyTargetGroupsException\nTooManyTargetsException\nTooManyTrafficPolicies\nTooManyTrafficPolicyInstances\nTooManyTrafficPolicyVersionsForCurrentPolicy\nTooManyTrustedSigners\nTooManyUniqueTargetGroupsPerLoadBalancerException\nTooManyUpdates\nTooManyVPCAssociationAuthorizations\nTool\nToolchain\nToolchainSource\nToolsVersion\nTooltip\nTooltipFields\nTooltipItem\nTooltipOptions\nTooltipTitleType\nTooltipVisibility\nTop\nTopAnomalousServices\nTopAnswer\nTopBottomFilter\nTopBottomMovers\nTopBottomMoversComputation\nTopBottomRanked\nTopBottomRankedComputation\nTopContributors\nTopOffset\nTopResources\nTopic\nTopicARN\nTopicArn\nTopicCalculatedField\nTopicCategoryFilter\nTopicCategoryFilterConstant\nTopicColumn\nTopicConfiguration\nTopicConfigurations\nTopicDateRangeFilter\nTopicDefaultPreferences\nTopicDetails\nTopicFilter\nTopicId\nTopicLimitExceededException\nTopicName\nTopicNamedEntity\nTopicNames\nTopicNumericEqualityFilter\nTopicNumericRangeFilter\nTopicPreference\nTopicPreferences\nTopicRangeFilterConstant\nTopicRefreshDetails\nTopicRefreshSchedule\nTopicRefreshScheduleSummary\nTopicRelativeDateFilter\nTopicRule\nTopicRuleDestination\nTopicRuleDestinationConfiguration\nTopicRuleDestinationSummary\nTopicRuleListItem\nTopicRulePayload\nTopicScheduleType\nTopicSingularFilterConstant\nTopicStatus\nTopicSummary\nTopics\nTopicsDetectionJobFilter\nTopicsDetectionJobProperties\nTopicsDetectionJobPropertiesList\nTopicsSummaries\nTopk\nToscaOverride\nTotal\nTotalActions\nTotalActualHours\nTotalActualSpend\nTotalActualUnits\nTotalAddressCount\nTotalAggregation\nTotalAggregationComputation\nTotalAmortizedCommitment\nTotalAmortizedFee\nTotalAuthenticatedEntities\nTotalAvailableAddressCount\nTotalBackupSizeInMegaBytes\nTotalBarLabel\nTotalBytes\nTotalCap\nTotalCapacity\nTotalCapacityProvisioned\nTotalCapacityUsed\nTotalCellStyle\nTotalCodeSize\nTotalCommitment\nTotalCost\nTotalCount\nTotalDataInMegaBytes\nTotalDiscoveredResources\nTotalDuration\nTotalEndpointCount\nTotalEntries\nTotalEstimatedMonthlySavingsAmount\nTotalEstimatedMonthlySavingsPercentage\nTotalExecutionTimeInMillis\nTotalExpectedSpend\nTotalExtractedDataInGB\nTotalFailures\nTotalFilteredCount\nTotalFpgaMemoryInMiB\nTotalFulfilledCapacity\nTotalGb\nTotalGpuMemoryInMiB\nTotalHourlyPrice\nTotalImpact\nTotalImpactFilter\nTotalImpactPercentage\nTotalInferenceMemoryInMiB\nTotalInstanceCount\nTotalLabeled\nTotalLabels\nTotalLocalStorageGB\nTotalLocalStorageGBRequest\nTotalLogicalCapacityUsed\nTotalNodes\nTotalNumRows\nTotalNumberOfDuplicateTimestamps\nTotalNumberOfFiles\nTotalNumberOfInvalidValues\nTotalNumberOfMissingValues\nTotalNumberOfResults\nTotalNumberOfRows\nTotalNumberOfStages\nTotalNumberOfTasks\nTotalNumberOfUnsupportedTimestamps\nTotalNumberOfUsers\nTotalObjects\nTotalOptions\nTotalPartsCount\nTotalPercentageArea\nTotalPieces\nTotalPolicyCount\nTotalPotentialRISavings\nTotalProcessed\nTotalProvisionedStorageInMegaBytes\nTotalRecommendationCount\nTotalRecordCount\nTotalResizeDataInMegaBytes\nTotalResourceUtilization\nTotalResources\nTotalResponseTime\nTotalResultsCount\nTotalRowsInDataset\nTotalRuleCount\nTotalRunningHours\nTotalRunningHoursInLookbackPeriod\nTotalRunningNormalizedUnits\nTotalScheduledInstanceHours\nTotalSegments\nTotalShards\nTotalSize\nTotalSizeInGB\nTotalSizeLimitExceededException\nTotalSnapshotCapacityUsed\nTotalStackInstancesCount\nTotalSteps\nTotalStorageCapacityInMegaBytes\nTotalSuggestionsCount\nTotalTargetCapacity\nTotalUnAssignedShards\nTotalUpfrontPrice\nTotalVCpus\nTotalsVisibility\nToxicityCategories\nToxicityDetection\nToxicityDetectionSettings\nTpmSupport\nTrace\nTraceConfiguration\nTraceContent\nTraceHeader\nTraceId\nTraceIds\nTraceOutput\nTraceSegmentDocuments\nTraceSummaries\nTraceSummary\nTraceUser\nTraceback\nTraces\nTracesProcessedCount\nTracingConfig\nTracingConfigResponse\nTracingConfiguration\nTracingEnabled\nTrack\nTrackData\nTrackListMessage\nTrackNumber\nTrackSourceSettings\nTrackedActionLastAccessed\nTrackedActionsLastAccessed\nTrackedClusterId\nTrackedIsps\nTrackerArn\nTrackerName\nTrackingConfig\nTrackingInformation\nTrackingNumber\nTrackingOptions\nTrackingOptionsAlreadyExistsException\nTrackingOptionsDoesNotExistException\nTracks\nTrafficConfig\nTrafficDialPercentage\nTrafficDirection\nTrafficDistributionGroup\nTrafficDistributionGroupId\nTrafficDistributionGroupSummary\nTrafficDistributionGroupSummaryList\nTrafficDistributionGroupUserSummary\nTrafficDistributionGroupUserSummaryList\nTrafficMirrorFilter\nTrafficMirrorFilterId\nTrafficMirrorFilterIds\nTrafficMirrorFilterRule\nTrafficMirrorFilterRuleId\nTrafficMirrorFilters\nTrafficMirrorPortRange\nTrafficMirrorPortRangeRequest\nTrafficMirrorSession\nTrafficMirrorSessionId\nTrafficMirrorSessionIds\nTrafficMirrorSessions\nTrafficMirrorTarget\nTrafficMirrorTargetId\nTrafficMirrorTargetIds\nTrafficMirrorTargets\nTrafficPattern\nTrafficPercentageToMonitor\nTrafficPolicies\nTrafficPolicy\nTrafficPolicyAlreadyExists\nTrafficPolicyCount\nTrafficPolicyId\nTrafficPolicyIdMarker\nTrafficPolicyInUse\nTrafficPolicyInstance\nTrafficPolicyInstanceAlreadyExists\nTrafficPolicyInstanceCount\nTrafficPolicyInstanceId\nTrafficPolicyInstanceNameMarker\nTrafficPolicyInstanceTypeMarker\nTrafficPolicyInstances\nTrafficPolicySummaries\nTrafficPolicySummary\nTrafficPolicyType\nTrafficPolicyVersion\nTrafficPolicyVersionMarker\nTrafficRoute\nTrafficRoutingConfig\nTrafficRoutingConfiguration\nTrafficSource\nTrafficSourceIdentifier\nTrafficSourceState\nTrafficSourceType\nTrafficSources\nTrafficType\nTrail\nTrailARN\nTrailAlreadyExistsException\nTrailArn\nTrailInfo\nTrailName\nTrailNotFoundException\nTrailNotProvidedException\nTrailProperties\nTrails\nTrainedModelArn\nTrainedModelMetrics\nTrainingChannels\nTrainingData\nTrainingDataConfig\nTrainingDataEndTime\nTrainingDataResult\nTrainingDataSchema\nTrainingDataSourceId\nTrainingDataStartTime\nTrainingEndTime\nTrainingEndTimestamp\nTrainingExecutionEndTime\nTrainingExecutionStartTime\nTrainingImage\nTrainingImageConfig\nTrainingImageDigest\nTrainingInputMode\nTrainingJob\nTrainingJobArn\nTrainingJobDefinition\nTrainingJobDefinitionName\nTrainingJobDefinitions\nTrainingJobEarlyStoppingType\nTrainingJobName\nTrainingJobStatus\nTrainingJobStatusCounters\nTrainingJobStepMetadata\nTrainingJobSummaries\nTrainingJobSummary\nTrainingMetrics\nTrainingMetricsV2\nTrainingParameters\nTrainingRepositoryAccessMode\nTrainingRepositoryAuthConfig\nTrainingRepositoryCredentialsProviderArn\nTrainingResult\nTrainingResultV2\nTrainingSpecification\nTrainingStartTime\nTrainingTimeInSeconds\nTrait\nTraitDiffRule\nTraits\nTransactGetItem\nTransactGetItemsInput\nTransactGetItemsOutput\nTransactItems\nTransactStatements\nTransactWriteItem\nTransactWriteItemsInput\nTransactWriteItemsOutput\nTransaction\nTransactionCanceledException\nTransactionCommitInProgressException\nTransactionCommittedException\nTransactionConflictException\nTransactionData\nTransactionDescription\nTransactionEndTime\nTransactionEvent\nTransactionId\nTransactionInProgressException\nTransactionOutputItem\nTransactionStartTime\nTransactionStatus\nTransactionType\nTransactionalMessagesPerSecond\nTransactions\nTranscodeProfileName\nTranscript\nTranscriptEvent\nTranscriptFileUri\nTranscriptFilter\nTranscriptFilterType\nTranscriptResultStream\nTranscriptSourceSetting\nTranscriptionConfiguration\nTranscriptionJob\nTranscriptionJobName\nTranscriptionJobStatus\nTranscriptionJobSummaries\nTranscriptionJobSummary\nTranscriptionMessages\nTranscriptionMessagesConcatenationConfiguration\nTransferAccountId\nTransferAlreadyCompletedException\nTransferCertificateRequest\nTransferCertificateResponse\nTransferConflictException\nTransferContactRequest\nTransferContactResponse\nTransferData\nTransferDomainRequest\nTransferDomainResponse\nTransferDomainToAnotherAwsAccountRequest\nTransferDomainToAnotherAwsAccountResponse\nTransferDuration\nTransferId\nTransferInputDeviceRequest\nTransferLock\nTransferMessage\nTransferMode\nTransferOfferAcceptedTimestamp\nTransferOfferExpirationTimestamp\nTransferOption\nTransferPrice\nTransferStatus\nTransferType\nTransferability\nTransferable\nTransferred\nTransferringInputDeviceSummary\nTransform\nTransformConfigParameter\nTransformDataSource\nTransformEncryption\nTransformEndTime\nTransformFilterCriteria\nTransformId\nTransformIds\nTransformInput\nTransformJob\nTransformJobArn\nTransformJobDefinition\nTransformJobName\nTransformJobStatus\nTransformJobStepMetadata\nTransformJobSummaries\nTransformJobSummary\nTransformName\nTransformOutput\nTransformParameters\nTransformProcessingConfig\nTransformResources\nTransformS3DataSource\nTransformSchema\nTransformSortCriteria\nTransformStartTime\nTransformType\nTransformationConfigurations\nTransformationRules\nTransformationTool\nTransformations\nTransforms\nTransitEncryption\nTransitEncryptionEnabled\nTransitEncryptionMode\nTransitEncryptionPort\nTransitGateway\nTransitGatewayAddress\nTransitGatewayArn\nTransitGatewayArns\nTransitGatewayAsn\nTransitGatewayAssociation\nTransitGatewayAttachment\nTransitGatewayAttachmentArn\nTransitGatewayAttachmentAssociation\nTransitGatewayAttachmentBgpConfiguration\nTransitGatewayAttachmentId\nTransitGatewayAttachmentIds\nTransitGatewayAttachmentPropagation\nTransitGatewayAttachmentPropagations\nTransitGatewayAttachments\nTransitGatewayCidrBlocks\nTransitGatewayConfiguration\nTransitGatewayConnect\nTransitGatewayConnectOptions\nTransitGatewayConnectPeer\nTransitGatewayConnectPeerArn\nTransitGatewayConnectPeerArns\nTransitGatewayConnectPeerAssociation\nTransitGatewayConnectPeerAssociations\nTransitGatewayConnectPeerConfiguration\nTransitGatewayConnectPeerId\nTransitGatewayConnectPeerIds\nTransitGatewayConnectPeers\nTransitGatewayConnectRequestBgpOptions\nTransitGatewayConnects\nTransitGatewayId\nTransitGatewayIds\nTransitGatewayMulticastDeregisteredGroupMembers\nTransitGatewayMulticastDeregisteredGroupSources\nTransitGatewayMulticastDomain\nTransitGatewayMulticastDomainArn\nTransitGatewayMulticastDomainAssociation\nTransitGatewayMulticastDomainAssociations\nTransitGatewayMulticastDomainId\nTransitGatewayMulticastDomainIds\nTransitGatewayMulticastDomainOptions\nTransitGatewayMulticastDomains\nTransitGatewayMulticastGroup\nTransitGatewayMulticastRegisteredGroupMembers\nTransitGatewayMulticastRegisteredGroupSources\nTransitGatewayOptions\nTransitGatewayOwnerId\nTransitGatewayPeering\nTransitGatewayPeeringAttachment\nTransitGatewayPeeringAttachmentId\nTransitGatewayPeeringAttachmentOptions\nTransitGatewayPeeringAttachments\nTransitGatewayPolicyRule\nTransitGatewayPolicyRuleMetaData\nTransitGatewayPolicyTable\nTransitGatewayPolicyTableAssociation\nTransitGatewayPolicyTableEntries\nTransitGatewayPolicyTableEntry\nTransitGatewayPolicyTableId\nTransitGatewayPolicyTableIds\nTransitGatewayPolicyTables\nTransitGatewayPrefixListAttachment\nTransitGatewayPrefixListReference\nTransitGatewayPrefixListReferences\nTransitGatewayPropagation\nTransitGatewayRegistration\nTransitGatewayRegistrationStateReason\nTransitGatewayRegistrations\nTransitGatewayRequestOptions\nTransitGatewayRoute\nTransitGatewayRouteAttachment\nTransitGatewayRouteTable\nTransitGatewayRouteTableAnnouncement\nTransitGatewayRouteTableAnnouncementId\nTransitGatewayRouteTableAnnouncementIds\nTransitGatewayRouteTableAnnouncements\nTransitGatewayRouteTableArn\nTransitGatewayRouteTableAssociation\nTransitGatewayRouteTableAttachment\nTransitGatewayRouteTableId\nTransitGatewayRouteTableIds\nTransitGatewayRouteTablePropagation\nTransitGatewayRouteTablePropagations\nTransitGatewayRouteTableRoute\nTransitGatewayRouteTables\nTransitGatewayVpcAttachment\nTransitGatewayVpcAttachmentOptions\nTransitGatewayVpcAttachments\nTransitGateways\nTransition\nTransitionEvent\nTransitionState\nTransitionToIA\nTransitionToPrimaryStorageClass\nTransitions\nTransitiveTagKeys\nTranslateDocumentRequest\nTranslateDocumentResponse\nTranslatePinDataInput\nTranslatePinDataOutput\nTranslateTextRequest\nTranslateTextResponse\nTranslatedDocument\nTranslatedDocumentsCount\nTranslatedText\nTranslationPinDataIsoFormat034\nTranslationSettings\nTransmissionInterval\nTransmitMode\nTransport\nTransportAttachmentId\nTransportProtocol\nTransportStreamBitrate\nTransportStreamId\nTransportStreamReservedBitrate\nTransportTransitGatewayAttachmentId\nTravelMode\nTreatMissingData\nTreatUndefinedSpecifiedValues\nTreatUnrecognizedResourceTypesAsWarnings\nTreatment\nTreatmentConfig\nTreatmentDescription\nTreatmentId\nTreatmentName\nTreatmentOption\nTreatmentResource\nTreeMapAggregatedFieldWells\nTreeMapConfiguration\nTreeMapFieldWells\nTreeMapGroupItemsLimitConfiguration\nTreeMapSort\nTreeMapSortConfiguration\nTreeMapVisual\nTrendArrowOptions\nTrendArrows\nTrendGroupSort\nTrendGroups\nTrendmicro\nTrendmicroConnectorProfileCredentials\nTrendmicroSourceProperties\nTrial\nTrialArn\nTrialComponent\nTrialComponentArn\nTrialComponentArtifact\nTrialComponentDisplayName\nTrialComponentMetricSummary\nTrialComponentName\nTrialComponentSimpleSummary\nTrialComponentSource\nTrialComponentSourceDetail\nTrialComponentStatus\nTrialComponentSummaries\nTrialComponentSummary\nTrialMinutes\nTrialName\nTrialSource\nTrialSummaries\nTrialSummary\nTrigger\nTriggerConfig\nTriggerDetails\nTriggerEventSource\nTriggerFindingId\nTriggerName\nTriggerNames\nTriggerNodeDetails\nTriggerProperties\nTriggerTargetsLimitExceededException\nTriggerTime\nTriggerType\nTriggerUpdate\nTriggerValue\nTriggeredAlarms\nTriggeredBy\nTriggeringDataset\nTriggers\nTriggersNotFound\nTrimBlanks\nTrimSpaceInChar\nTrimWhiteSpace\nTrimmedDataAccessException\nTruckDimensions\nTruckModeOptions\nTruckWeight\nTrueActivity\nTruePeakLimiterThreshold\nTruncateColumns\nTruncated\nTrunkInterfaceAssociation\nTrunkInterfaceId\nTrust\nTrustAnchor\nTrustAnchorCertificate\nTrustAnchorDetail\nTrustAnchorDetailResponse\nTrustAnchors\nTrustDirection\nTrustId\nTrustIds\nTrustPassword\nTrustProviderType\nTrustState\nTrustStateReason\nTrustStore\nTrustStoreSummary\nTrustType\nTrustedAdvisorCategorySpecificSummary\nTrustedAdvisorCheckDescription\nTrustedAdvisorCheckRefreshStatus\nTrustedAdvisorCheckResult\nTrustedAdvisorCheckSummary\nTrustedAdvisorCostOptimizingSummary\nTrustedAdvisorIntegrationStatus\nTrustedAdvisorResourceDetail\nTrustedAdvisorResourcesSummary\nTrustedCertificatePublicKey\nTrustedHostKeys\nTrustedKeyGroupDoesNotExist\nTrustedKeyGroups\nTrustedResourceOwners\nTrustedSignerDoesNotExist\nTrustedSigners\nTrusts\nTruststoreUri\nTruststoreVersion\nTruststoreWarnings\nTruthyCellValue\nTruthyCellValueSynonyms\nTsEncryptionMethod\nTsFileMode\nTsIncludeDvbSubtitles\nTsUseAudioRenditionGroup\nTsvOptions\nTsvStoreOptions\nTsvVersionOptions\nTtl\nTtlDuration\nTtmlDestinationSettings\nTuesday\nTumblingWindow\nTumblingWindowInSeconds\nTunedHPOParams\nTunedHyperParameters\nTuningDataS3Uri\nTuningJob\nTuningJobArn\nTuningJobCompletionCriteria\nTuningJobCompletionDetails\nTuningJobName\nTuningJobStepMetaData\nTuningObjective\nTunnel\nTunnelInsideCidr\nTunnelInsideIpVersion\nTunnelInsideIpv6Cidr\nTunnelOption\nTunnelOptions\nTunnelSummary\nTurkErrorCode\nTurnControlUrl\nTurnSpecification\nTwitterParameters\nTwoWayChannelArn\nTwoWayEnabled\nType\nTypeAlreadyExistsFault\nTypeArn\nTypeConfigurationAlias\nTypeConfigurationArn\nTypeConfigurationDetails\nTypeConfigurationIdentifier\nTypeConfigurationIdentifiers\nTypeConfigurationNotFoundException\nTypeConfigurationVersionId\nTypeConfigurations\nTypeDeprecatedFault\nTypeFilters\nTypeHierarchy\nTypeId\nTypeIdentifier\nTypeName\nTypeNameAlias\nTypeNamePrefix\nTypeNotFoundException\nTypeParameters\nTypeSummaries\nTypeSummary\nTypeTestsStatus\nTypeTestsStatusDescription\nTypeVersionArn\nTypeVersionId\nTypeVersionSummaries\nTypeVersionSummary\nTypedAttributeValueRange\nTypedLinkAttributeDefinition\nTypedLinkAttributeRange\nTypedLinkFacet\nTypedLinkFacetAttributeUpdate\nTypedLinkName\nTypedLinkSchemaAndFacetName\nTypedLinkSpecifier\nTypedLinkSpecifiers\nTypes\nTypography\nUIColorPalette\nUICustomization\nUICustomizationType\nURI\nURL\nURLOperation\nURLPath\nURLStyling\nURLTarget\nURLTemplate\nUSD\nUUID\nUarfcn\nUarfcndl\nUdpContainerSettings\nUdpGroupSettings\nUdpOutputSettings\nUefiData\nUhdDeviceSettings\nUiConfig\nUiTemplate\nUiTemplateInfo\nUiTemplateS3Uri\nUid\nUlBucketSize\nUlRate\nUlRatePolicy\nUlimit\nUlimits\nUnAuthenticated\nUnModifiedSinceConstraint\nUnableToDetectSchemaException\nUnaggregatedField\nUnapplyCustomPermissions\nUnarchiveApplicationRequest\nUnarchiveFindingsRequest\nUnarchiveWaveRequest\nUnassignInstanceRequest\nUnassignIpv6AddressesRequest\nUnassignIpv6AddressesResult\nUnassignPrivateIpAddressesRequest\nUnassignPrivateNatGatewayAddressRequest\nUnassignPrivateNatGatewayAddressResult\nUnassignVolumeRequest\nUnassignedIpv6Addresses\nUnassignedIpv6Prefixes\nUnassigning\nUnauthenticated\nUnauthenticatedException\nUnauthenticatedLogin\nUnauthorizedCacheControlHeaderStrategy\nUnauthorizedClientException\nUnauthorizedException\nUnauthorizedOperation\nUnauthorizedOperationException\nUnauthorizedPartnerIntegrationFault\nUnauthorizedResourceAccessException\nUnavailablePriorities\nUncertaintyRange\nUnclaimDeviceRequest\nUnclaimDeviceResponse\nUndeploy\nUndeploySystemInstanceRequest\nUndeploySystemInstanceResponse\nUndeprecateActivityTypeInput\nUndeprecateDomainInput\nUndeprecateWorkflowTypeInput\nUnderlayIpAddress\nUndetectedDocumentTypes\nUndetectedSignature\nUndetectedSignatures\nUndoRedoDisabled\nUnexpectedLambdaException\nUnfilteredPartition\nUnfilteredPartitions\nUngroupResourcesInput\nUngroupResourcesOutput\nUnhealthySince\nUnhealthyThreshold\nUnhealthyThresholdCount\nUnicodeIcon\nUniformBorder\nUniformResourceIdentifier\nUnindexedFace\nUnindexedFaces\nUninitializedAccountException\nUnion\nUnionType\nUniqueAccountIdentifier\nUniqueAttribute\nUniqueContributors\nUniqueId\nUniqueKey\nUniqueProblem\nUniqueProgramId\nUniqueRequestToken\nUniqueTag\nUniqueTagResourceIdentifier\nUniqueThreatNameCount\nUniqueTicPerAudioTrack\nUniqueValues\nUniqueValuesComputation\nUnit\nUnitCost\nUnitLabel\nUnitNumber\nUnitScaler\nUnitType\nUnits\nUnknown\nUnknownHostCount\nUnknownIpPermissions\nUnknownMonitorException\nUnknownResourceException\nUnknownResourceFault\nUnknownSnapshotCopyRegionFault\nUnknownSubscriptionException\nUnlabelParameterVersionRequest\nUnlabelParameterVersionResult\nUnlabeled\nUnlinkDeveloperIdentityInput\nUnlinkIdentityInput\nUnlockCode\nUnlockDelay\nUnlockDelayUnit\nUnlockDelayValue\nUnlockRuleRequest\nUnlockRuleResponse\nUnmappedAttribute\nUnmappedAttributes\nUnmatchedFaces\nUnmatchedPolicyPermissionException\nUnmodifiableEntityException\nUnmonitorInstancesRequest\nUnmonitorInstancesResult\nUnpeerVpcResult\nUnpredictableNumber\nUnprocessableEntityException\nUnprocessedAccount\nUnprocessedAccounts\nUnprocessedAssociationUpdates\nUnprocessedAssociations\nUnprocessedAutomationRule\nUnprocessedAutomationRules\nUnprocessedCluster\nUnprocessedClusters\nUnprocessedDataSources\nUnprocessedDataSourcesResult\nUnprocessedFindings\nUnprocessedGraph\nUnprocessedGraphs\nUnprocessedIdentifiers\nUnprocessedIdentityId\nUnprocessedIdentityIds\nUnprocessedIds\nUnprocessedItems\nUnprocessedKeys\nUnprocessedNamedQueryId\nUnprocessedNamedQueryIds\nUnprocessedPreparedStatementName\nUnprocessedPreparedStatementNames\nUnprocessedQueryExecutionId\nUnprocessedQueryExecutionIds\nUnprocessedRecords\nUnprocessedResourceIdentifiers\nUnprocessedScramSecret\nUnprocessedScramSecrets\nUnprocessedSecurityControl\nUnprocessedStandardsControlAssociation\nUnprocessedStandardsControlAssociationUpdate\nUnprocessedStatistics\nUnprocessedTraceIds\nUnprocessedTraceSegment\nUnprocessedTraceSegments\nUnprocessedTypeConfigurations\nUnprocessedUpdateAction\nUnprocessedUpdateActions\nUnrealizedSavings\nUnrecognizedClientException\nUnrecognizedFaces\nUnrecognizedPublicKeyEncodingException\nUnrecognizedResourceTypes\nUnregisterConnectorRequest\nUnregisteredSeiTimecode\nUnreportedNotApplicableCount\nUnreservedConcurrentExecutions\nUnresolvableUsageUnitException\nUnscaledValue\nUnsearchedFace\nUnsearchedFaces\nUnshareApplicationRequest\nUnshareDirectoryRequest\nUnshareDirectoryResult\nUnshareInterval\nUnshareIntervalUnit\nUnshareTarget\nUnspecifiedCount\nUnsubscribeAll\nUnsubscribeFromDatasetRequest\nUnsubscribeFromEventRequest\nUnsubscribeInput\nUnsubscribeRequest\nUnsubscribeResult\nUnsuccessful\nUnsuccessfulFaceAssociation\nUnsuccessfulFaceAssociations\nUnsuccessfulFaceDeletion\nUnsuccessfulFaceDeletions\nUnsuccessfulFaceDisassociation\nUnsuccessfulFaceDisassociations\nUnsuccessfulFleetDeletions\nUnsuccessfulFleetRequests\nUnsuccessfulInstanceCreditSpecificationItem\nUnsuccessfulInstanceCreditSpecificationItemError\nUnsuccessfulInstanceCreditSpecifications\nUnsuccessfulItem\nUnsuccessfulItemError\nUnsuccessfullyDeletedLaunchTemplateVersions\nUnsupportedAPIEndpointException\nUnsupportedActionException\nUnsupportedActionForDeploymentTypeException\nUnsupportedAddressException\nUnsupportedAvailabilityZone\nUnsupportedAvailabilityZoneException\nUnsupportedCalendarException\nUnsupportedCommandException\nUnsupportedDigitalSignatureMethodException\nUnsupportedDisplayLanguageCodeException\nUnsupportedDocumentEncodingException\nUnsupportedDocumentException\nUnsupportedFeatureException\nUnsupportedFeatureRequiredException\nUnsupportedGrantTypeException\nUnsupportedIdentityProviderException\nUnsupportedImageTypeException\nUnsupportedIndexTypeException\nUnsupportedInventoryItemContextException\nUnsupportedInventorySchemaVersionException\nUnsupportedLanguageException\nUnsupportedLanguagePairException\nUnsupportedLocale\nUnsupportedMediaTypeException\nUnsupportedNetworkConfigurationException\nUnsupportedOperatingSystem\nUnsupportedOperation\nUnsupportedOperationException\nUnsupportedOperationFault\nUnsupportedOptionFault\nUnsupportedParameterType\nUnsupportedPlatformType\nUnsupportedPlsAlphabetException\nUnsupportedPlsLanguageException\nUnsupportedPricingPlanException\nUnsupportedProtocolException\nUnsupportedRegionException\nUnsupportedResource\nUnsupportedSettingsException\nUnsupportedStreamMediaTypeException\nUnsupportedTLD\nUnsupportedTimestamps\nUnsupportedTokenTypeException\nUnsupportedUpstreamRegistryException\nUnsupportedUserEditionException\nUnsupportedUserStateException\nUnsupportedWorkspaceConfigurationException\nUntagAttendeeRequest\nUntagCertificateAuthorityRequest\nUntagColumnOperation\nUntagDeliveryStreamInput\nUntagInput\nUntagInstanceProfileRequest\nUntagLogGroupRequest\nUntagMFADeviceRequest\nUntagMeetingRequest\nUntagOpenIDConnectProviderRequest\nUntagOutput\nUntagPolicyRequest\nUntagProjectRequest\nUntagQueueRequest\nUntagResourceInput\nUntagResourceOutput\nUntagResourceRequest\nUntagResourceResponse\nUntagResourceResult\nUntagResourcesInput\nUntagResourcesOutput\nUntagRoleRequest\nUntagSAMLProviderRequest\nUntagServerCertificateRequest\nUntagStreamInput\nUntagUserRequest\nUntrustedArtifactOnDeployment\nUnusedAccountValidityDays\nUnusedCommitment\nUnusedHours\nUnusedUnits\nUnwrap\nUpScaling\nUpdate\nUpdateACLRequest\nUpdateACLResponse\nUpdateAbpV1_0_x\nUpdateAbpV1_1\nUpdateAcceleratorAttributesRequest\nUpdateAcceleratorAttributesResponse\nUpdateAcceleratorRequest\nUpdateAcceleratorResponse\nUpdateAccessControlConfigurationRequest\nUpdateAccessKeyRequest\nUpdateAccessLogSubscriptionRequest\nUpdateAccessLogSubscriptionResponse\nUpdateAccessPolicyRequest\nUpdateAccessPolicyResponse\nUpdateAccessRequest\nUpdateAccessResponse\nUpdateAccountAuditConfigurationRequest\nUpdateAccountConfigurationRequest\nUpdateAccountConfigurationResponse\nUpdateAccountCustomizationRequest\nUpdateAccountCustomizationResponse\nUpdateAccountPasswordPolicyRequest\nUpdateAccountRequest\nUpdateAccountResponse\nUpdateAccountSendingEnabledRequest\nUpdateAccountSettingsInput\nUpdateAccountSettingsOutput\nUpdateAccountSettingsRequest\nUpdateAccountSettingsResponse\nUpdateAction\nUpdateActionAvailableDate\nUpdateActionRequest\nUpdateActionResponse\nUpdateActionResultsMessage\nUpdateActionStatus\nUpdateActionStatusModifiedDate\nUpdateActionTargetRequest\nUpdateActionTypeInput\nUpdateActions\nUpdateActionsMessage\nUpdateActiveModelVersionRequest\nUpdateActiveModelVersionResponse\nUpdateActivities\nUpdateAddonRequest\nUpdateAddonResponse\nUpdateAddress\nUpdateAddressBookRequest\nUpdateAdmChannelRequest\nUpdateAdmChannelResponse\nUpdateAgentLogLevel\nUpdateAgentRequest\nUpdateAgentStatusRequest\nUpdateAgentStatusResponse\nUpdateAgreementRequest\nUpdateAgreementResponse\nUpdateAlarmModelRequest\nUpdateAlarmModelResponse\nUpdateAlertRequest\nUpdateAlertResponse\nUpdateAliasInput\nUpdateAliasOutput\nUpdateAliasRequest\nUpdateAllowListRequest\nUpdateAllowListResponse\nUpdateAnalysisPermissionsRequest\nUpdateAnalysisPermissionsResponse\nUpdateAnalysisRequest\nUpdateAnalysisResponse\nUpdateAnalysisTemplateInput\nUpdateAnalysisTemplateOutput\nUpdateAnnotationStoreRequest\nUpdateAnnotationStoreResponse\nUpdateAnnotationStoreVersionRequest\nUpdateAnnotationStoreVersionResponse\nUpdateAnomalyDetectorRequest\nUpdateAnomalyDetectorResponse\nUpdateAnomalyMonitorRequest\nUpdateAnomalyMonitorResponse\nUpdateAnomalySubscriptionRequest\nUpdateAnomalySubscriptionResponse\nUpdateAnswerInput\nUpdateAnswerOutput\nUpdateApiCacheRequest\nUpdateApiCacheResponse\nUpdateApiDestinationRequest\nUpdateApiDestinationResponse\nUpdateApiKeyRequest\nUpdateApiKeyResponse\nUpdateApiMappingRequest\nUpdateApiMappingResponse\nUpdateApiRequest\nUpdateApiResponse\nUpdateApnsChannelRequest\nUpdateApnsChannelResponse\nUpdateApnsSandboxChannelRequest\nUpdateApnsSandboxChannelResponse\nUpdateApnsVoipChannelRequest\nUpdateApnsVoipChannelResponse\nUpdateApnsVoipSandboxChannelRequest\nUpdateApnsVoipSandboxChannelResponse\nUpdateAppAuthorizationRequest\nUpdateAppAuthorizationResponse\nUpdateAppBlockBuilderRequest\nUpdateAppBlockBuilderResult\nUpdateAppImageConfigRequest\nUpdateAppImageConfigResponse\nUpdateAppInstanceBotRequest\nUpdateAppInstanceBotResponse\nUpdateAppInstanceRequest\nUpdateAppInstanceResponse\nUpdateAppInstanceUserEndpointRequest\nUpdateAppInstanceUserEndpointResponse\nUpdateAppInstanceUserRequest\nUpdateAppInstanceUserResponse\nUpdateAppMonitorRequest\nUpdateAppRequest\nUpdateAppResponse\nUpdateAppResult\nUpdateAppVersionAppComponentRequest\nUpdateAppVersionAppComponentResponse\nUpdateAppVersionRequest\nUpdateAppVersionResourceRequest\nUpdateAppVersionResourceResponse\nUpdateAppVersionResponse\nUpdateApplicationComponentConfigRequest\nUpdateApplicationInput\nUpdateApplicationLayerAutomaticResponseRequest\nUpdateApplicationMaintenanceConfigurationRequest\nUpdateApplicationMaintenanceConfigurationResponse\nUpdateApplicationMessage\nUpdateApplicationRequest\nUpdateApplicationResourceLifecycleMessage\nUpdateApplicationResponse\nUpdateApplicationResult\nUpdateApplicationSettingsInput\nUpdateApplicationSettingsOutput\nUpdateApplicationSettingsRequest\nUpdateApplicationSettingsResponse\nUpdateApplicationVersionMessage\nUpdateApprovalRuleTemplateContentInput\nUpdateApprovalRuleTemplateContentOutput\nUpdateApprovalRuleTemplateDescriptionInput\nUpdateApprovalRuleTemplateDescriptionOutput\nUpdateApprovalRuleTemplateNameInput\nUpdateApprovalRuleTemplateNameOutput\nUpdateArchiveRequest\nUpdateArchiveResponse\nUpdateArchiveRuleRequest\nUpdateArtifactRequest\nUpdateArtifactResponse\nUpdateAssessmentControlRequest\nUpdateAssessmentControlResponse\nUpdateAssessmentControlSetStatusRequest\nUpdateAssessmentControlSetStatusResponse\nUpdateAssessmentFrameworkControlSet\nUpdateAssessmentFrameworkRequest\nUpdateAssessmentFrameworkResponse\nUpdateAssessmentFrameworkShareRequest\nUpdateAssessmentFrameworkShareResponse\nUpdateAssessmentRequest\nUpdateAssessmentResponse\nUpdateAssessmentStatusRequest\nUpdateAssessmentStatusResponse\nUpdateAssessmentTargetRequest\nUpdateAssetModelRequest\nUpdateAssetModelResponse\nUpdateAssetPropertyRequest\nUpdateAssetRequest\nUpdateAssetResponse\nUpdateAssociationRequest\nUpdateAssociationResult\nUpdateAssociationStatusRequest\nUpdateAssociationStatusResult\nUpdateAssumeRolePolicyRequest\nUpdateAttendeeCapabilitiesRequest\nUpdateAttendeeCapabilitiesResponse\nUpdateAttributeGroupRequest\nUpdateAttributeGroupResponse\nUpdateAttributesRequest\nUpdateAuditStreamConfigurationRequest\nUpdateAuditSuppressionRequest\nUpdateAuthEventFeedbackRequest\nUpdateAuthorizerRequest\nUpdateAuthorizerResponse\nUpdateAutoScalingGroupType\nUpdateAutomatedDiscoveryConfigurationRequest\nUpdateAutomaticTapeCreationPolicyInput\nUpdateAutomaticTapeCreationPolicyOutput\nUpdateAutomationRulesRequestItem\nUpdateAutomationRulesRequestItems\nUpdateAvailabilityConfigurationRequest\nUpdateAvailabilityOptionsRequest\nUpdateAvailabilityOptionsResponse\nUpdateAvailable\nUpdateBackendAPIRequest\nUpdateBackendAPIResponse\nUpdateBackendAuthForgotPasswordConfig\nUpdateBackendAuthIdentityPoolConfig\nUpdateBackendAuthMFAConfig\nUpdateBackendAuthOAuthConfig\nUpdateBackendAuthPasswordPolicyConfig\nUpdateBackendAuthRequest\nUpdateBackendAuthResourceConfig\nUpdateBackendAuthResponse\nUpdateBackendAuthUserPoolConfig\nUpdateBackendAuthVerificationMessageConfig\nUpdateBackendConfigRequest\nUpdateBackendConfigResponse\nUpdateBackendJobRequest\nUpdateBackendJobResponse\nUpdateBackendStorageRequest\nUpdateBackendStorageResourceConfig\nUpdateBackendStorageResponse\nUpdateBackupPlanInput\nUpdateBackupPlanOutput\nUpdateBaiduChannelRequest\nUpdateBaiduChannelResponse\nUpdateBandwidthRateLimitInput\nUpdateBandwidthRateLimitOutput\nUpdateBandwidthRateLimitScheduleInput\nUpdateBandwidthRateLimitScheduleOutput\nUpdateBasePathMappingRequest\nUpdateBatchPredictionInput\nUpdateBatchPredictionOutput\nUpdateBehavior\nUpdateBillingGroupAccountGrouping\nUpdateBillingGroupInput\nUpdateBillingGroupOutput\nUpdateBillingGroupRequest\nUpdateBillingGroupResponse\nUpdateBlueprintRequest\nUpdateBlueprintResponse\nUpdateBotAliasRequest\nUpdateBotAliasResponse\nUpdateBotLocaleRequest\nUpdateBotLocaleResponse\nUpdateBotRecommendationRequest\nUpdateBotRecommendationResponse\nUpdateBotRequest\nUpdateBotResponse\nUpdateBranchRequest\nUpdateBranchResult\nUpdateBridgeFlowSourceRequest\nUpdateBridgeNetworkOutputRequest\nUpdateBridgeNetworkSourceRequest\nUpdateBridgeOutputRequest\nUpdateBridgeOutputResponse\nUpdateBridgeRequest\nUpdateBridgeResponse\nUpdateBridgeSourceRequest\nUpdateBridgeSourceResponse\nUpdateBridgeStateRequest\nUpdateBridgeStateResponse\nUpdateBrokerCountRequest\nUpdateBrokerCountResponse\nUpdateBrokerRequest\nUpdateBrokerResponse\nUpdateBrokerStorageRequest\nUpdateBrokerStorageResponse\nUpdateBrokerTypeRequest\nUpdateBrokerTypeResponse\nUpdateBrowserSettingsRequest\nUpdateBrowserSettingsResponse\nUpdateBucketBundleRequest\nUpdateBucketBundleResult\nUpdateBucketRequest\nUpdateBucketResult\nUpdateBudgetActionRequest\nUpdateBudgetActionResponse\nUpdateBudgetRequest\nUpdateBuildInput\nUpdateBuildOutput\nUpdateBusinessReportScheduleRequest\nUpdateByteMatchSetRequest\nUpdateByteMatchSetResponse\nUpdateCACertificateParams\nUpdateCACertificateRequest\nUpdateCachePolicyRequest\nUpdateCachePolicyResult\nUpdateCalculatedAttributeDefinitionRequest\nUpdateCalculatedAttributeDefinitionResponse\nUpdateCallAnalyticsCategoryRequest\nUpdateCallAnalyticsCategoryResponse\nUpdateCampaignDialerConfigRequest\nUpdateCampaignNameRequest\nUpdateCampaignOutboundCallConfigRequest\nUpdateCampaignRequest\nUpdateCampaignResponse\nUpdateCanaryRequest\nUpdateCapacityProviderRequest\nUpdateCapacityProviderResponse\nUpdateCapacityReservationInput\nUpdateCaseRequest\nUpdateCellRequest\nUpdateCellResponse\nUpdateCertificateAuthorityRequest\nUpdateCertificateOptionsRequest\nUpdateCertificateRequest\nUpdateCertificateResponse\nUpdateChangesetRequest\nUpdateChangesetResponse\nUpdateChannelClassRequest\nUpdateChannelClassResponse\nUpdateChannelFlowRequest\nUpdateChannelFlowResponse\nUpdateChannelGroupRequest\nUpdateChannelGroupResponse\nUpdateChannelMessageRequest\nUpdateChannelMessageResponse\nUpdateChannelReadMarkerRequest\nUpdateChannelReadMarkerResponse\nUpdateChannelRequest\nUpdateChannelResponse\nUpdateChapCredentialsInput\nUpdateChapCredentialsOutput\nUpdateClassificationJobRequest\nUpdateClassificationScopeRequest\nUpdateClassifierRequest\nUpdateClientCertificateRequest\nUpdateCloudFormationCollectionFilter\nUpdateCloudFrontOriginAccessIdentityRequest\nUpdateCloudFrontOriginAccessIdentityResult\nUpdateClusterConfigRequest\nUpdateClusterConfigResponse\nUpdateClusterConfigurationRequest\nUpdateClusterConfigurationResponse\nUpdateClusterInput\nUpdateClusterKafkaVersionRequest\nUpdateClusterKafkaVersionResponse\nUpdateClusterOutput\nUpdateClusterRequest\nUpdateClusterResponse\nUpdateClusterSettingsRequest\nUpdateClusterSettingsResponse\nUpdateClusterVersionRequest\nUpdateClusterVersionResponse\nUpdateCodeRepositoryInput\nUpdateCodeRepositoryOutput\nUpdateCodeSigningConfigRequest\nUpdateCodeSigningConfigResponse\nUpdateCognitoUserPoolConfiguration\nUpdateCollaborationInput\nUpdateCollaborationOutput\nUpdateCollectionDetail\nUpdateCollectionRequest\nUpdateCollectionResponse\nUpdateColumnStatisticsForPartitionRequest\nUpdateColumnStatisticsForPartitionResponse\nUpdateColumnStatisticsForTableRequest\nUpdateColumnStatisticsForTableResponse\nUpdateCommentInput\nUpdateCommentOutput\nUpdateCompanyNetworkConfigurationRequest\nUpdateComponentConfigurationRequest\nUpdateComponentData\nUpdateComponentInput\nUpdateComponentOutput\nUpdateComponentRequest\nUpdateComponentResponse\nUpdateComponentTypeRequest\nUpdateComponentTypeResponse\nUpdateComputeEnvironmentRequest\nUpdateComputeEnvironmentResponse\nUpdateConditionalForwarderRequest\nUpdateConferenceProviderRequest\nUpdateConfigRequest\nUpdateConfigurationProfileRequest\nUpdateConfigurationRequest\nUpdateConfigurationResponse\nUpdateConfigurationSetEventDestinationRequest\nUpdateConfigurationSetReputationMetricsEnabledRequest\nUpdateConfigurationSetSendingEnabledRequest\nUpdateConfigurationSetTrackingOptionsRequest\nUpdateConfigurationTemplateMessage\nUpdateConfiguredTableAnalysisRuleInput\nUpdateConfiguredTableAnalysisRuleOutput\nUpdateConfiguredTableAssociationInput\nUpdateConfiguredTableAssociationOutput\nUpdateConfiguredTableInput\nUpdateConfiguredTableOutput\nUpdateConnectClientAddInRequest\nUpdateConnectionAliasPermissionRequest\nUpdateConnectionApiKeyAuthRequestParameters\nUpdateConnectionAuthRequestParameters\nUpdateConnectionBasicAuthRequestParameters\nUpdateConnectionOAuthClientRequestParameters\nUpdateConnectionOAuthRequestParameters\nUpdateConnectionRequest\nUpdateConnectionResponse\nUpdateConnectivityInfoRequest\nUpdateConnectivityInfoResponse\nUpdateConnectivityRequest\nUpdateConnectivityResponse\nUpdateConnectorDefinitionRequest\nUpdateConnectorProfileRequest\nUpdateConnectorProfileResponse\nUpdateConnectorRegistrationRequest\nUpdateConnectorRegistrationResponse\nUpdateConnectorRequest\nUpdateConnectorResponse\nUpdateConstraintInput\nUpdateConstraintOutput\nUpdateContactAttributesRequest\nUpdateContactChannelRequest\nUpdateContactEvaluationRequest\nUpdateContactEvaluationResponse\nUpdateContactFlowContentRequest\nUpdateContactFlowMetadataRequest\nUpdateContactFlowModuleContentRequest\nUpdateContactFlowModuleMetadataRequest\nUpdateContactFlowNameRequest\nUpdateContactListRequest\nUpdateContactRequest\nUpdateContactScheduleRequest\nUpdateContainerAgentRequest\nUpdateContainerAgentResponse\nUpdateContainerInstancesStateRequest\nUpdateContainerInstancesStateResponse\nUpdateContainerServiceRequest\nUpdateContainerServiceResult\nUpdateContentRequest\nUpdateContentResponse\nUpdateContextRequest\nUpdateContextResponse\nUpdateContinuousBackupsInput\nUpdateContinuousBackupsOutput\nUpdateContinuousDeploymentPolicyRequest\nUpdateContinuousDeploymentPolicyResult\nUpdateContributorInsightsInput\nUpdateContributorInsightsOutput\nUpdateControlPanelRequest\nUpdateControlPanelResponse\nUpdateControlRequest\nUpdateControlResponse\nUpdateCoreDefinitionRequest\nUpdateCoreNetworkRequest\nUpdateCoreNetworkResponse\nUpdateCostAllocationTagsStatusError\nUpdateCostAllocationTagsStatusRequest\nUpdateCostAllocationTagsStatusResponse\nUpdateCostCategoryDefinitionRequest\nUpdateCostCategoryDefinitionResponse\nUpdateCount\nUpdateCrawlerRequest\nUpdateCrawlerScheduleRequest\nUpdateCrlRequest\nUpdateCsvClassifierRequest\nUpdateCustomKeyStoreRequest\nUpdateCustomLineItemChargeDetails\nUpdateCustomLineItemFlatChargeDetails\nUpdateCustomLineItemInput\nUpdateCustomLineItemOutput\nUpdateCustomLineItemPercentageChargeDetails\nUpdateCustomMetricRequest\nUpdateCustomMetricResponse\nUpdateCustomRoutingAcceleratorAttributesRequest\nUpdateCustomRoutingAcceleratorAttributesResponse\nUpdateCustomRoutingAcceleratorRequest\nUpdateCustomRoutingAcceleratorResponse\nUpdateCustomRoutingListenerRequest\nUpdateCustomRoutingListenerResponse\nUpdateCustomVerificationEmailTemplateRequest\nUpdateDashboardPermissionsRequest\nUpdateDashboardPermissionsResponse\nUpdateDashboardPublishedVersionRequest\nUpdateDashboardPublishedVersionResponse\nUpdateDashboardRequest\nUpdateDashboardResponse\nUpdateDataCatalogInput\nUpdateDataCellsFilterRequest\nUpdateDataIntegrationRequest\nUpdateDataLakeExceptionSubscriptionRequest\nUpdateDataLakeRequest\nUpdateDataLakeResponse\nUpdateDataQualityRulesetRequest\nUpdateDataQualityRulesetResponse\nUpdateDataRepositoryAssociationRequest\nUpdateDataRepositoryAssociationResponse\nUpdateDataRetentionInput\nUpdateDataRole\nUpdateDataSecurityConfig\nUpdateDataSetPermissionsRequest\nUpdateDataSetPermissionsResponse\nUpdateDataSetRequest\nUpdateDataSetResponse\nUpdateDataSource\nUpdateDataSourceInput\nUpdateDataSourceOutput\nUpdateDataSourcePermissionsRequest\nUpdateDataSourcePermissionsResponse\nUpdateDataSourceRequest\nUpdateDataSourceResponse\nUpdateDatabaseRequest\nUpdateDatabaseResponse\nUpdateDatasetEntriesRequest\nUpdateDatasetEntriesResponse\nUpdateDatasetGroupRequest\nUpdateDatasetRequest\nUpdateDatasetResponse\nUpdateDatasourcePackagesRequest\nUpdateDatastoreRequest\nUpdateDate\nUpdateDateTime\nUpdateDecoderManifestRequest\nUpdateDecoderManifestResponse\nUpdateDefaultAutoScalingConfigurationRequest\nUpdateDefaultAutoScalingConfigurationResponse\nUpdateDefaultBranchInput\nUpdateDefaultMailDomainRequest\nUpdateDeletionProtectionInput\nUpdateDeploymentGroupInput\nUpdateDeploymentGroupOutput\nUpdateDeploymentRequest\nUpdateDeploymentResponse\nUpdateDeploymentStrategyRequest\nUpdateDestinationInput\nUpdateDestinationRequest\nUpdateDestinationResponse\nUpdateDetectorModelRequest\nUpdateDetectorModelResponse\nUpdateDetectorRequest\nUpdateDetectorVersionMetadataRequest\nUpdateDetectorVersionRequest\nUpdateDetectorVersionStatusRequest\nUpdateDevEndpointRequest\nUpdateDevEnvironmentRequest\nUpdateDevEnvironmentResponse\nUpdateDeviceCertificateParams\nUpdateDeviceDefinitionRequest\nUpdateDeviceFleetRequest\nUpdateDeviceInstanceRequest\nUpdateDeviceInstanceResult\nUpdateDeviceMetadataRequest\nUpdateDeviceMetadataResponse\nUpdateDevicePolicyConfigurationRequest\nUpdateDevicePoolRequest\nUpdateDevicePoolResult\nUpdateDeviceRequest\nUpdateDeviceResponse\nUpdateDeviceStateRequest\nUpdateDeviceStatusRequest\nUpdateDevicesRequest\nUpdateDimensionRequest\nUpdateDimensionResponse\nUpdateDirectConnectGatewayAssociationRequest\nUpdateDirectConnectGatewayAssociationResult\nUpdateDirectConnectGatewayRequest\nUpdateDirectConnectGatewayResponse\nUpdateDirectoryConfigRequest\nUpdateDirectoryConfigResult\nUpdateDirectorySetupRequest\nUpdateDiscovererRequest\nUpdateDiscovererResponse\nUpdateDiscoveryJobRequest\nUpdateDistributionBundleRequest\nUpdateDistributionBundleResult\nUpdateDistributionConfigurationRequest\nUpdateDistributionConfigurationResponse\nUpdateDistributionRequest\nUpdateDistributionResult\nUpdateDistributionWithStagingConfigRequest\nUpdateDistributionWithStagingConfigResult\nUpdateDocumentDefaultVersionRequest\nUpdateDocumentDefaultVersionResult\nUpdateDocumentMetadataRequest\nUpdateDocumentRequest\nUpdateDocumentResult\nUpdateDocumentVersionRequest\nUpdateDocumentationPartRequest\nUpdateDocumentationVersionRequest\nUpdateDomainAssociationRequest\nUpdateDomainAssociationResult\nUpdateDomainConfigRequest\nUpdateDomainConfigResponse\nUpdateDomainConfigurationRequest\nUpdateDomainConfigurationResponse\nUpdateDomainContactPrivacyRequest\nUpdateDomainContactPrivacyResponse\nUpdateDomainContactRequest\nUpdateDomainContactResponse\nUpdateDomainEndpointOptionsRequest\nUpdateDomainEndpointOptionsResponse\nUpdateDomainEntryRequest\nUpdateDomainEntryResult\nUpdateDomainMetadataRequest\nUpdateDomainNameRequest\nUpdateDomainNameResponse\nUpdateDomainNameserversRequest\nUpdateDomainNameserversResponse\nUpdateDomainRequest\nUpdateDomainResponse\nUpdateDynamicThingGroupRequest\nUpdateDynamicThingGroupResponse\nUpdateEc2DeepInspectionConfigurationRequest\nUpdateEc2DeepInspectionConfigurationResponse\nUpdateEgressGatewayBridgeRequest\nUpdateElasticIpRequest\nUpdateElasticsearchDomainConfigRequest\nUpdateElasticsearchDomainConfigResponse\nUpdateEmailChannelRequest\nUpdateEmailChannelResponse\nUpdateEmailIdentityPolicyRequest\nUpdateEmailTemplateRequest\nUpdateEmailTemplateResponse\nUpdateEmergencyContactSettingsRequest\nUpdateEncryption\nUpdateEncryptionKeyRequest\nUpdateEndOfMeetingReminder\nUpdateEndpointAccessRequest\nUpdateEndpointAccessResponse\nUpdateEndpointGroupRequest\nUpdateEndpointGroupResponse\nUpdateEndpointInput\nUpdateEndpointOutput\nUpdateEndpointRequest\nUpdateEndpointResponse\nUpdateEndpointWeightsAndCapacitiesInput\nUpdateEndpointWeightsAndCapacitiesOutput\nUpdateEndpointsBatchRequest\nUpdateEndpointsBatchResponse\nUpdateEnrollmentStatusRequest\nUpdateEnrollmentStatusResponse\nUpdateEntitlementRequest\nUpdateEntitlementResult\nUpdateEntityRequest\nUpdateEntityResponse\nUpdateEnvironmentAccountConnectionInput\nUpdateEnvironmentAccountConnectionOutput\nUpdateEnvironmentInput\nUpdateEnvironmentMembershipRequest\nUpdateEnvironmentMembershipResult\nUpdateEnvironmentMessage\nUpdateEnvironmentOutput\nUpdateEnvironmentRequest\nUpdateEnvironmentResponse\nUpdateEnvironmentTemplateInput\nUpdateEnvironmentTemplateOutput\nUpdateEnvironmentTemplateVersionInput\nUpdateEnvironmentTemplateVersionOutput\nUpdateEphemerisRequest\nUpdateError\nUpdateEtlLibraries\nUpdateEvaluationFormRequest\nUpdateEvaluationFormResponse\nUpdateEvaluationInput\nUpdateEvaluationOutput\nUpdateEventActionRequest\nUpdateEventActionResponse\nUpdateEventConfigurationByResourceTypesRequest\nUpdateEventConfigurationsRequest\nUpdateEventDataStoreRequest\nUpdateEventDataStoreResponse\nUpdateEventDestinationRequest\nUpdateEventDestinationResult\nUpdateEventIntegrationRequest\nUpdateEventLabelRequest\nUpdateEventSourceMappingRequest\nUpdateEventSourcesConfigRequest\nUpdateExperienceRequest\nUpdateExperimentRequest\nUpdateExperimentResponse\nUpdateExperimentTemplateActionInputItem\nUpdateExperimentTemplateLogConfigurationInput\nUpdateExperimentTemplateRequest\nUpdateExperimentTemplateResponse\nUpdateExperimentTemplateStopConditionInput\nUpdateExperimentTemplateTargetInput\nUpdateExpirationForHITRequest\nUpdateExportRequest\nUpdateExportResponse\nUpdateExpression\nUpdateExtensionAssociationRequest\nUpdateExtensionRequest\nUpdateFPorts\nUpdateFacetRequest\nUpdateFailbackReplicationConfigurationRequest\nUpdateFailoverConfig\nUpdateFeatureGroupRequest\nUpdateFeatureGroupResponse\nUpdateFeatureMetadataRequest\nUpdateFeatureRequest\nUpdateFeatureResponse\nUpdateFeaturedResultsSetRequest\nUpdateFeaturedResultsSetResponse\nUpdateFieldLevelEncryptionConfigRequest\nUpdateFieldLevelEncryptionConfigResult\nUpdateFieldLevelEncryptionProfileRequest\nUpdateFieldLevelEncryptionProfileResult\nUpdateFieldRequest\nUpdateFileCacheLustreConfiguration\nUpdateFileCacheRequest\nUpdateFileCacheResponse\nUpdateFileSystemAssociationInput\nUpdateFileSystemAssociationOutput\nUpdateFileSystemLustreConfiguration\nUpdateFileSystemOntapConfiguration\nUpdateFileSystemOpenZFSConfiguration\nUpdateFileSystemRequest\nUpdateFileSystemResponse\nUpdateFileSystemWindowsConfiguration\nUpdateFilterRequest\nUpdateFilterResponse\nUpdateFindingAggregatorRequest\nUpdateFindingAggregatorResponse\nUpdateFindingsFeedbackRequest\nUpdateFindingsFilterRequest\nUpdateFindingsFilterResponse\nUpdateFindingsRequest\nUpdateFirewallConfigRequest\nUpdateFirewallConfigResponse\nUpdateFirewallDeleteProtectionRequest\nUpdateFirewallDeleteProtectionResponse\nUpdateFirewallDescriptionRequest\nUpdateFirewallDescriptionResponse\nUpdateFirewallDomainsRequest\nUpdateFirewallDomainsResponse\nUpdateFirewallEncryptionConfigurationRequest\nUpdateFirewallEncryptionConfigurationResponse\nUpdateFirewallPolicyChangeProtectionRequest\nUpdateFirewallPolicyChangeProtectionResponse\nUpdateFirewallPolicyRequest\nUpdateFirewallPolicyResponse\nUpdateFirewallRuleGroupAssociationRequest\nUpdateFirewallRuleGroupAssociationResponse\nUpdateFirewallRuleRequest\nUpdateFirewallRuleResponse\nUpdateFleetAttributesInput\nUpdateFleetAttributesOutput\nUpdateFleetCapacityInput\nUpdateFleetCapacityOutput\nUpdateFleetMetadataRequest\nUpdateFleetMetricRequest\nUpdateFleetPortSettingsInput\nUpdateFleetPortSettingsOutput\nUpdateFleetRequest\nUpdateFleetResponse\nUpdateFleetResult\nUpdateFlowEntitlementRequest\nUpdateFlowEntitlementResponse\nUpdateFlowMediaStreamRequest\nUpdateFlowMediaStreamResponse\nUpdateFlowOutputRequest\nUpdateFlowOutputResponse\nUpdateFlowRequest\nUpdateFlowResponse\nUpdateFlowSourceRequest\nUpdateFlowSourceResponse\nUpdateFlowTemplateRequest\nUpdateFlowTemplateResponse\nUpdateFlywheelRequest\nUpdateFlywheelResponse\nUpdateFolderPermissionsRequest\nUpdateFolderPermissionsResponse\nUpdateFolderRequest\nUpdateFolderResponse\nUpdateFormData\nUpdateFormRequest\nUpdateFormResponse\nUpdateFrameworkInput\nUpdateFrameworkOutput\nUpdateFreeTierConfig\nUpdateFunctionCodeRequest\nUpdateFunctionConfigurationRequest\nUpdateFunctionDefinitionRequest\nUpdateFunctionEventInvokeConfigRequest\nUpdateFunctionRequest\nUpdateFunctionResponse\nUpdateFunctionResult\nUpdateFunctionUrlConfigRequest\nUpdateFunctionUrlConfigResponse\nUpdateFuotaTaskRequest\nUpdateGameConfigurationRequest\nUpdateGameConfigurationResult\nUpdateGameRequest\nUpdateGameResult\nUpdateGameServerGroupInput\nUpdateGameServerGroupOutput\nUpdateGameServerInput\nUpdateGameServerOutput\nUpdateGameSessionInput\nUpdateGameSessionOutput\nUpdateGameSessionQueueInput\nUpdateGameSessionQueueOutput\nUpdateGatewayBridgeSourceRequest\nUpdateGatewayCapabilityConfigurationRequest\nUpdateGatewayCapabilityConfigurationResponse\nUpdateGatewayGroupRequest\nUpdateGatewayInformationInput\nUpdateGatewayInformationOutput\nUpdateGatewayInstanceRequest\nUpdateGatewayInstanceResponse\nUpdateGatewayRequest\nUpdateGatewayResponseRequest\nUpdateGatewayRouteInput\nUpdateGatewayRouteOutput\nUpdateGatewaySoftwareNowInput\nUpdateGatewaySoftwareNowOutput\nUpdateGcmChannelRequest\nUpdateGcmChannelResponse\nUpdateGeoMatchSetRequest\nUpdateGeoMatchSetResponse\nUpdateGeofenceCollectionRequest\nUpdateGeofenceCollectionResponse\nUpdateGlobalNetworkRequest\nUpdateGlobalNetworkResponse\nUpdateGlobalSecondaryIndexAction\nUpdateGlobalSettingsInput\nUpdateGlobalSettingsRequest\nUpdateGlobalTableInput\nUpdateGlobalTableOutput\nUpdateGlobalTableSettingsInput\nUpdateGlobalTableSettingsOutput\nUpdateGraphqlApiRequest\nUpdateGraphqlApiResponse\nUpdateGrokClassifierRequest\nUpdateGroupCertificateConfigurationRequest\nUpdateGroupCertificateConfigurationResponse\nUpdateGroupInput\nUpdateGroupOutput\nUpdateGroupQueryInput\nUpdateGroupQueryOutput\nUpdateGroupRequest\nUpdateGroupResponse\nUpdateGroupResult\nUpdateHITReviewStatusRequest\nUpdateHITTypeOfHITRequest\nUpdateHealthCheckRequest\nUpdateHealthCheckResponse\nUpdateHostInput\nUpdateHostKeyRequest\nUpdateHostKeyResponse\nUpdateHostedZoneCommentRequest\nUpdateHostedZoneCommentResponse\nUpdateHoursOfOperationRequest\nUpdateHttpNamespaceRequest\nUpdateHttpNamespaceResponse\nUpdateHubRequest\nUpdateHubResponse\nUpdateHypervisorInput\nUpdateHypervisorOutput\nUpdateIAMPolicyAssignmentRequest\nUpdateIAMPolicyAssignmentResponse\nUpdateIPSetRequest\nUpdateIPSetResponse\nUpdateIdentityProviderConfigurationRequest\nUpdateIdentityProviderRequest\nUpdateIdentityProviderResponse\nUpdateIdentityProviderSettingsRequest\nUpdateIdentityProviderSettingsResponse\nUpdateIdentitySourceInput\nUpdateIdentitySourceOutput\nUpdateImageGenerationConfigurationInput\nUpdateImagePermissionsRequest\nUpdateImagePipelineRequest\nUpdateImagePipelineResponse\nUpdateImageRequest\nUpdateImageResponse\nUpdateImageSetMetadataRequest\nUpdateImageSetMetadataResponse\nUpdateImageVersionRequest\nUpdateImageVersionResponse\nUpdateImpersonationRoleRequest\nUpdateInAppTemplateRequest\nUpdateInAppTemplateResponse\nUpdateInProgressException\nUpdateIncidentRecordInput\nUpdateIndexRequest\nUpdateIndexTypeInput\nUpdateIndexTypeOutput\nUpdateIndexingConfigurationRequest\nUpdateInferenceExperimentRequest\nUpdateInferenceExperimentResponse\nUpdateInferenceSchedulerRequest\nUpdateInfoEntry\nUpdateInfrastructureConfigurationRequest\nUpdateInfrastructureConfigurationResponse\nUpdateIngestionDestinationRequest\nUpdateIngestionDestinationResponse\nUpdateIngressGatewayBridgeRequest\nUpdateInputDeviceRequest\nUpdateInputDeviceResponse\nUpdateInputRequest\nUpdateInputResponse\nUpdateInputSecurityGroupRequest\nUpdateInputSecurityGroupResponse\nUpdateInsightRequest\nUpdateInstanceAccessControlAttributeConfigurationRequest\nUpdateInstanceAttributeRequest\nUpdateInstanceCustomHealthStatusRequest\nUpdateInstanceMetadataOptionsRequest\nUpdateInstanceMetadataOptionsResult\nUpdateInstanceProfileRequest\nUpdateInstanceProfileResult\nUpdateInstanceRequest\nUpdateInstanceStorageConfigRequest\nUpdateInstantBooking\nUpdateInstruction\nUpdateIntegrationRequest\nUpdateIntegrationResponseRequest\nUpdateIntegrationResponseResponse\nUpdateIntegrationResult\nUpdateIntentRequest\nUpdateIntentResponse\nUpdateIpAccessSettingsRequest\nUpdateIpAccessSettingsResponse\nUpdateIpAddress\nUpdateIpAddresses\nUpdateIpRestrictionRequest\nUpdateIpRestrictionResponse\nUpdateItemInput\nUpdateItemOutput\nUpdateJobExecutionRequest\nUpdateJobExecutionResponse\nUpdateJobFromSourceControlRequest\nUpdateJobFromSourceControlResponse\nUpdateJobPriorityRequest\nUpdateJobPriorityResult\nUpdateJobQueueRequest\nUpdateJobQueueResponse\nUpdateJobRequest\nUpdateJobResponse\nUpdateJobShipmentStateRequest\nUpdateJobStatusRequest\nUpdateJobStatusResult\nUpdateJobTemplateRequest\nUpdateJobTemplateResponse\nUpdateJourneyRequest\nUpdateJourneyResponse\nUpdateJourneyStateRequest\nUpdateJourneyStateResponse\nUpdateJsonClassifierRequest\nUpdateKeyDescriptionRequest\nUpdateKeyGroupRequest\nUpdateKeyGroupResult\nUpdateKeyRequest\nUpdateKeyResponse\nUpdateKnowledgeBaseTemplateUriRequest\nUpdateKnowledgeBaseTemplateUriResponse\nUpdateKxClusterDatabasesRequest\nUpdateKxDatabaseRequest\nUpdateKxDatabaseResponse\nUpdateKxEnvironmentNetworkRequest\nUpdateKxEnvironmentNetworkResponse\nUpdateKxEnvironmentRequest\nUpdateKxEnvironmentResponse\nUpdateKxUserRequest\nUpdateKxUserResponse\nUpdateLFTagRequest\nUpdateLabelGroupRequest\nUpdateLabelsPayload\nUpdateLagRequest\nUpdateLaunchConfigurationRequest\nUpdateLaunchConfigurationTemplateRequest\nUpdateLaunchConfigurationTemplateResponse\nUpdateLaunchProfileMemberRequest\nUpdateLaunchProfileMemberResponse\nUpdateLaunchProfileRequest\nUpdateLaunchProfileResponse\nUpdateLaunchRequest\nUpdateLaunchResponse\nUpdateLayerRequest\nUpdateLayoutRequest\nUpdateLedgerPermissionsModeRequest\nUpdateLedgerPermissionsModeResponse\nUpdateLedgerRequest\nUpdateLedgerResponse\nUpdateLensReviewInput\nUpdateLensReviewOutput\nUpdateLicenseConfigurationRequest\nUpdateLicenseManagerReportGeneratorRequest\nUpdateLicenseSpecificationsForResourceRequest\nUpdateLifecyclePolicyRequest\nUpdateLinkAttributes\nUpdateLinkAttributesRequest\nUpdateLinkInput\nUpdateLinkOutput\nUpdateLinkRequest\nUpdateLinkResponse\nUpdateListRequest\nUpdateListenerRequest\nUpdateListenerResponse\nUpdateLiveSourceRequest\nUpdateLiveSourceResponse\nUpdateLoadBalancerAttributeRequest\nUpdateLoadBalancerAttributeResult\nUpdateLocationAzureBlobRequest\nUpdateLocationHdfsRequest\nUpdateLocationNfsRequest\nUpdateLocationObjectStorageRequest\nUpdateLocationSmbRequest\nUpdateLogLevelsByResourceTypesRequest\nUpdateLogPatternRequest\nUpdateLogPatternResponse\nUpdateLoggerDefinitionRequest\nUpdateLoggingConfigurationRequest\nUpdateLoggingConfigurationResponse\nUpdateLoginProfileRequest\nUpdateLongTermPricingRequest\nUpdateMLModelInput\nUpdateMLModelOutput\nUpdateMLTransformRequest\nUpdateMLTransformResponse\nUpdateMacieSessionRequest\nUpdateMailboxQuotaRequest\nUpdateMaintenance\nUpdateMaintenanceStartTimeInput\nUpdateMaintenanceStartTimeOutput\nUpdateMaintenanceWindowRequest\nUpdateMaintenanceWindowResult\nUpdateMaintenanceWindowTargetRequest\nUpdateMaintenanceWindowTargetResult\nUpdateMaintenanceWindowTaskRequest\nUpdateMaintenanceWindowTaskResult\nUpdateMalwareScanSettingsRequest\nUpdateManagedInstanceRoleRequest\nUpdateManagedRuleSetVersionExpiryDateRequest\nUpdateManagedRuleSetVersionExpiryDateResponse\nUpdateMapRequest\nUpdateMapResponse\nUpdateMapRunInput\nUpdateMatchingWorkflowInput\nUpdateMatchingWorkflowOutput\nUpdateMatchmakingConfigurationInput\nUpdateMatchmakingConfigurationOutput\nUpdateMediaInsightsPipelineConfigurationRequest\nUpdateMediaInsightsPipelineConfigurationResponse\nUpdateMediaInsightsPipelineStatusRequest\nUpdateMediaPipelineKinesisVideoStreamPoolRequest\nUpdateMediaPipelineKinesisVideoStreamPoolResponse\nUpdateMediaStorageConfigurationInput\nUpdateMedicalVocabularyRequest\nUpdateMedicalVocabularyResponse\nUpdateMeetingRoomConfiguration\nUpdateMemberDetectorsRequest\nUpdateMemberDetectorsResponse\nUpdateMemberInput\nUpdateMemberSessionRequest\nUpdateMembershipInput\nUpdateMembershipOutput\nUpdateMeshInput\nUpdateMeshOutput\nUpdateMethodRequest\nUpdateMethodResponseRequest\nUpdateMetricAttributionRequest\nUpdateMetricAttributionResponse\nUpdateMetricSetRequest\nUpdateMetricSetResponse\nUpdateMigrationWorkflowRequest\nUpdateMigrationWorkflowResponse\nUpdateMissionProfileRequest\nUpdateMitigationActionRequest\nUpdateMitigationActionResponse\nUpdateMobileDeviceAccessRuleRequest\nUpdateModelCardRequest\nUpdateModelCardResponse\nUpdateModelManifestRequest\nUpdateModelManifestResponse\nUpdateModelPackageInput\nUpdateModelPackageOutput\nUpdateModelRequest\nUpdateModelResponse\nUpdateModelVersionRequest\nUpdateModelVersionResult\nUpdateModelVersionStatusRequest\nUpdateMonitorInput\nUpdateMonitorOutput\nUpdateMonitoringAlertRequest\nUpdateMonitoringAlertResponse\nUpdateMonitoringRequest\nUpdateMonitoringResponse\nUpdateMonitoringScheduleRequest\nUpdateMonitoringScheduleResponse\nUpdateMulticastGroupRequest\nUpdateMultiplexProgramRequest\nUpdateMultiplexProgramResponse\nUpdateMultiplexRequest\nUpdateMultiplexResponse\nUpdateMyUserProfileRequest\nUpdateNFSFileShareInput\nUpdateNFSFileShareOutput\nUpdateNamedQueryInput\nUpdateNamespaceRequest\nUpdateNamespaceResponse\nUpdateNetworkAnalyzerConfigurationRequest\nUpdateNetworkConfigurationInput\nUpdateNetworkProfileRequest\nUpdateNetworkProfileResult\nUpdateNetworkResourceMetadataRequest\nUpdateNetworkResourceMetadataResponse\nUpdateNetworkSettingsRequest\nUpdateNetworkSettingsResponse\nUpdateNetworkSitePlanRequest\nUpdateNetworkSiteRequest\nUpdateNetworkSiteResponse\nUpdateNodeInput\nUpdateNodegroupConfigRequest\nUpdateNodegroupConfigResponse\nUpdateNodegroupVersionRequest\nUpdateNodegroupVersionResponse\nUpdateNotebookInput\nUpdateNotebookInstanceInput\nUpdateNotebookInstanceLifecycleConfigInput\nUpdateNotebookMetadataInput\nUpdateNotificationConfigurationInput\nUpdateNotificationRequest\nUpdateNotificationRuleRequest\nUpdateNotificationSettingsRequest\nUpdateNumberOfDomainControllersRequest\nUpdateObjectAttributes\nUpdateObjectAttributesRequest\nUpdateObjectAttributesResponse\nUpdateOntapVolumeConfiguration\nUpdateOpenIDConnectProviderThumbprintRequest\nUpdateOpenZFSVolumeConfiguration\nUpdateOpsItemRequest\nUpdateOpsMetadataRequest\nUpdateOpsMetadataResult\nUpdateOrgEc2DeepInspectionConfigurationRequest\nUpdateOrganizationConfigurationRequest\nUpdateOrganizationConfigurationResponse\nUpdateOrganizationalUnitRequest\nUpdateOrganizationalUnitResponse\nUpdateOriginAccessControlRequest\nUpdateOriginAccessControlResult\nUpdateOriginEndpointRequest\nUpdateOriginEndpointResponse\nUpdateOriginRequestPolicyRequest\nUpdateOriginRequestPolicyResult\nUpdateOutpostInput\nUpdateOutpostOutput\nUpdateOutpostResolverRequest\nUpdateOutpostResolverResponse\nUpdatePackageConfigurationRequest\nUpdatePackageRequest\nUpdatePackageResponse\nUpdatePackageVersionRequest\nUpdatePackageVersionsStatusRequest\nUpdatePackageVersionsStatusResult\nUpdatePackagingGroupRequest\nUpdatePackagingGroupResponse\nUpdateParallelDataRequest\nUpdateParallelDataResponse\nUpdateParam\nUpdateParameterGroupRequest\nUpdateParameterGroupResponse\nUpdateParticipantRoleConfigRequest\nUpdatePartitionRequest\nUpdatePartnerAccountRequest\nUpdatePartnerStatusInputMessage\nUpdatePatchBaselineRequest\nUpdatePatchBaselineResult\nUpdatePermissionGroupRequest\nUpdatePermissionGroupResponse\nUpdatePermissionSetRequest\nUpdatePermissionsRequest\nUpdatePermissionsResponse\nUpdatePhoneNumberRequest\nUpdatePhoneNumberRequestItem\nUpdatePhoneNumberRequestItems\nUpdatePhoneNumberResponse\nUpdatePhoneNumberResult\nUpdatePhoneNumberSettingsRequest\nUpdatePipeRequest\nUpdatePipeResponse\nUpdatePipeSourceActiveMQBrokerParameters\nUpdatePipeSourceDynamoDBStreamParameters\nUpdatePipeSourceKinesisStreamParameters\nUpdatePipeSourceManagedStreamingKafkaParameters\nUpdatePipeSourceParameters\nUpdatePipeSourceRabbitMQBrokerParameters\nUpdatePipeSourceSelfManagedKafkaParameters\nUpdatePipeSourceSqsQueueParameters\nUpdatePipelineExecutionRequest\nUpdatePipelineExecutionResponse\nUpdatePipelineInput\nUpdatePipelineNotificationsRequest\nUpdatePipelineNotificationsResponse\nUpdatePipelineOutput\nUpdatePipelineRequest\nUpdatePipelineResponse\nUpdatePipelineStatusRequest\nUpdatePipelineStatusResponse\nUpdatePlaceIndexRequest\nUpdatePlaceIndexResponse\nUpdatePlacementRequest\nUpdatePolicy\nUpdatePolicyInput\nUpdatePolicyOutput\nUpdatePolicyRequest\nUpdatePolicyResponse\nUpdatePolicyStoreInput\nUpdatePolicyStoreOutput\nUpdatePolicyTemplateInput\nUpdatePolicyTemplateOutput\nUpdatePoolRequest\nUpdatePoolResult\nUpdatePortalRequest\nUpdatePortalResponse\nUpdatePortfolioInput\nUpdatePortfolioOutput\nUpdatePortfolioShareInput\nUpdatePortfolioShareOutput\nUpdatePositionRequest\nUpdatePreparedStatementInput\nUpdatePresetRequest\nUpdatePresetResponse\nUpdatePricingPlanInput\nUpdatePricingPlanOutput\nUpdatePricingPlanRequest\nUpdatePricingPlanResponse\nUpdatePricingRuleInput\nUpdatePricingRuleOutput\nUpdatePrimaryEmailAddressRequest\nUpdatePrimaryRegionRequest\nUpdatePrivateDnsNamespaceRequest\nUpdatePrivateDnsNamespaceResponse\nUpdateProactiveJoin\nUpdateProblemRequest\nUpdateProductInput\nUpdateProductOutput\nUpdateProfileInput\nUpdateProfileJobRequest\nUpdateProfileJobResponse\nUpdateProfileOutput\nUpdateProfileRequest\nUpdateProfileResponse\nUpdateProfilingGroupRequest\nUpdateProfilingGroupResponse\nUpdateProgramRequest\nUpdateProgramResponse\nUpdateProgramScheduleConfiguration\nUpdateProgramTransition\nUpdateProjectDataDeliveryRequest\nUpdateProjectDataDeliveryResponse\nUpdateProjectInput\nUpdateProjectOutput\nUpdateProjectRequest\nUpdateProjectResponse\nUpdateProjectResult\nUpdateProjectVisibilityInput\nUpdateProjectVisibilityOutput\nUpdatePromptRequest\nUpdatePromptResponse\nUpdateProtectedQueryInput\nUpdateProtectedQueryOutput\nUpdateProtectionGroupRequest\nUpdateProvisionedModelThroughputRequest\nUpdateProvisionedProductInput\nUpdateProvisionedProductOutput\nUpdateProvisionedProductPropertiesInput\nUpdateProvisionedProductPropertiesOutput\nUpdateProvisioningArtifactInput\nUpdateProvisioningArtifactOutput\nUpdateProvisioningParameter\nUpdateProvisioningPreferences\nUpdateProvisioningTemplateRequest\nUpdateProxySessionRequest\nUpdateProxySessionResponse\nUpdatePublicDnsNamespaceRequest\nUpdatePublicDnsNamespaceResponse\nUpdatePublicKeyRequest\nUpdatePublicKeyResult\nUpdatePublicSharingSettingsRequest\nUpdatePublicSharingSettingsResponse\nUpdatePublishingDestinationRequest\nUpdatePullRequestApprovalRuleContentInput\nUpdatePullRequestApprovalRuleContentOutput\nUpdatePullRequestApprovalStateInput\nUpdatePullRequestDescriptionInput\nUpdatePullRequestDescriptionOutput\nUpdatePullRequestStatusInput\nUpdatePullRequestStatusOutput\nUpdatePullRequestTitleInput\nUpdatePullRequestTitleOutput\nUpdatePushTemplateRequest\nUpdatePushTemplateResponse\nUpdateQualificationTypeRequest\nUpdateQualificationTypeResponse\nUpdateQuerySuggestionsBlockListRequest\nUpdateQuerySuggestionsConfigRequest\nUpdateQueueHoursOfOperationRequest\nUpdateQueueMaxContactsRequest\nUpdateQueueNameRequest\nUpdateQueueOutboundCallerConfigRequest\nUpdateQueueRequest\nUpdateQueueResponse\nUpdateQueueStatusRequest\nUpdateQuickConnectConfigRequest\nUpdateQuickConnectNameRequest\nUpdateRadiusRequest\nUpdateRateBasedRuleRequest\nUpdateRateBasedRuleResponse\nUpdateRdsDbInstanceRequest\nUpdateReadinessCheckRequest\nUpdateReadinessCheckResponse\nUpdateRealtimeLogConfigRequest\nUpdateRealtimeLogConfigResult\nUpdateReceiptRuleRequest\nUpdateRecipeJobRequest\nUpdateRecipeJobResponse\nUpdateRecipeRequest\nUpdateRecipeResponse\nUpdateRecommendationStatusItem\nUpdateRecommendationStatusRequestEntry\nUpdateRecommenderConfiguration\nUpdateRecommenderConfigurationRequest\nUpdateRecommenderConfigurationResponse\nUpdateRecommenderConfigurationShape\nUpdateRecommenderRequest\nUpdateRecommenderResponse\nUpdateRecordsRequest\nUpdateRecordsResponse\nUpdateRecoveryGroupRequest\nUpdateRecoveryGroupResponse\nUpdateRecoveryPointLifecycleInput\nUpdateRecoveryPointLifecycleOutput\nUpdateRefreshScheduleRequest\nUpdateRefreshScheduleResponse\nUpdateRegexMatchSetRequest\nUpdateRegexMatchSetResponse\nUpdateRegexPatternSetRequest\nUpdateRegexPatternSetResponse\nUpdateRegionSettingsInput\nUpdateRegistryInput\nUpdateRegistryRequest\nUpdateRegistryResponse\nUpdateRelatedItemsInput\nUpdateRelationalDatabaseParametersRequest\nUpdateRelationalDatabaseParametersResult\nUpdateRelationalDatabaseRequest\nUpdateRelationalDatabaseResult\nUpdateReplicationConfigurationRequest\nUpdateReplicationConfigurationTemplateRequest\nUpdateReplicationGroupMemberAction\nUpdateReplicationJobRequest\nUpdateReplicationSetInput\nUpdateReportDefinitionRequest\nUpdateReportDefinitionResult\nUpdateReportGroupInput\nUpdateReportGroupOutput\nUpdateReportPlanInput\nUpdateReportPlanOutput\nUpdateRepositoryDescriptionInput\nUpdateRepositoryNameInput\nUpdateRepositoryRequest\nUpdateRepositoryResult\nUpdateRequestValidatorRequest\nUpdateRequireCheckIn\nUpdateRescoreExecutionPlanRequest\nUpdateReservationRequest\nUpdateReservationResponse\nUpdateResiliencyPolicyRequest\nUpdateResiliencyPolicyResponse\nUpdateResolverConfigRequest\nUpdateResolverConfigResponse\nUpdateResolverDnssecConfigRequest\nUpdateResolverDnssecConfigResponse\nUpdateResolverEndpointRequest\nUpdateResolverEndpointResponse\nUpdateResolverRequest\nUpdateResolverResponse\nUpdateResolverRuleRequest\nUpdateResolverRuleResponse\nUpdateResourceCollectionFilter\nUpdateResourceCollectionRequest\nUpdateResourceDataSyncRequest\nUpdateResourceDefinitionRequest\nUpdateResourceEventConfigurationRequest\nUpdateResourceInput\nUpdateResourceOutput\nUpdateResourcePolicyRequest\nUpdateResourcePolicyResponse\nUpdateResourcePositionRequest\nUpdateResourceProfileDetectionsRequest\nUpdateResourceProfileRequest\nUpdateResourceRequest\nUpdateResourceServerRequest\nUpdateResourceServerResponse\nUpdateResourceSetRequest\nUpdateResourceSetResponse\nUpdateResourceShareRequest\nUpdateResourceShareResponse\nUpdateResponseHeadersPolicyRequest\nUpdateResponseHeadersPolicyResult\nUpdateResponsePlanInput\nUpdateRestApiRequest\nUpdateResult\nUpdateRetrainingSchedulerRequest\nUpdateRevealConfigurationRequest\nUpdateRevealConfigurationResponse\nUpdateRevisionRequest\nUpdateRevisionResponse\nUpdateRobotApplicationRequest\nUpdateRobotApplicationResponse\nUpdateRoleAliasRequest\nUpdateRoleAliasResponse\nUpdateRoleDescriptionRequest\nUpdateRoleDescriptionResponse\nUpdateRoleRequest\nUpdateRoomMembershipRequest\nUpdateRoomMembershipResponse\nUpdateRoomRequest\nUpdateRoomResponse\nUpdateRotationRequest\nUpdateRouteCalculatorRequest\nUpdateRouteCalculatorResponse\nUpdateRouteInput\nUpdateRouteOutput\nUpdateRouteRequest\nUpdateRouteResponse\nUpdateRouteResponseRequest\nUpdateRouteResponseResponse\nUpdateRouteResult\nUpdateRoutingControlRequest\nUpdateRoutingControlResponse\nUpdateRoutingControlStateEntries\nUpdateRoutingControlStateEntry\nUpdateRoutingControlStateRequest\nUpdateRoutingControlStatesRequest\nUpdateRoutingProfileAgentAvailabilityTimerRequest\nUpdateRoutingProfileConcurrencyRequest\nUpdateRoutingProfileDefaultOutboundQueueRequest\nUpdateRoutingProfileNameRequest\nUpdateRoutingProfileQueuesRequest\nUpdateRowData\nUpdateRuleGroupRequest\nUpdateRuleGroupResponse\nUpdateRuleMetadataRequest\nUpdateRuleRequest\nUpdateRuleResponse\nUpdateRuleVersionRequest\nUpdateRuleVersionResult\nUpdateRulesOfIpGroupRequest\nUpdateRulesetRequest\nUpdateRulesetResponse\nUpdateRumMetricDefinitionRequest\nUpdateRunGroupRequest\nUpdateRuntimeConfigurationInput\nUpdateRuntimeConfigurationOutput\nUpdateRuntimeOn\nUpdateS3ResourcesRequest\nUpdateS3ResourcesResult\nUpdateSAMLProviderRequest\nUpdateSAMLProviderResponse\nUpdateSMBFileShareInput\nUpdateSMBFileShareOutput\nUpdateSMBFileShareVisibilityInput\nUpdateSMBFileShareVisibilityOutput\nUpdateSMBLocalGroupsInput\nUpdateSMBLocalGroupsOutput\nUpdateSMBSecurityStrategyInput\nUpdateSMBSecurityStrategyOutput\nUpdateSSHPublicKeyRequest\nUpdateSafetyRuleRequest\nUpdateSafetyRuleResponse\nUpdateSamplingRuleRequest\nUpdateSamplingRuleResult\nUpdateScalingParametersRequest\nUpdateScalingParametersResponse\nUpdateScalingPlanRequest\nUpdateSceneRequest\nUpdateSceneResponse\nUpdateScheduleInput\nUpdateScheduleOutput\nUpdateScheduleRequest\nUpdateScheduleResponse\nUpdateScheduledActionRequest\nUpdateScheduledActionResponse\nUpdateScheduledAuditRequest\nUpdateScheduledAuditResponse\nUpdateScheduledQueryRequest\nUpdateSchedulingPolicyRequest\nUpdateSchemaInput\nUpdateSchemaRequest\nUpdateSchemaResponse\nUpdateScriptInput\nUpdateScriptOutput\nUpdateSecretRequest\nUpdateSecretResponse\nUpdateSecretVersionStageRequest\nUpdateSecretVersionStageResponse\nUpdateSecurityConfigRequest\nUpdateSecurityConfigResponse\nUpdateSecurityGroupForDirectoryControllers\nUpdateSecurityGroupRuleDescriptionsEgressRequest\nUpdateSecurityGroupRuleDescriptionsEgressResult\nUpdateSecurityGroupRuleDescriptionsIngressRequest\nUpdateSecurityGroupRuleDescriptionsIngressResult\nUpdateSecurityHubConfigurationRequest\nUpdateSecurityPolicyRequest\nUpdateSecurityPolicyResponse\nUpdateSecurityProfileRequest\nUpdateSecurityProfileResponse\nUpdateSecurityRequest\nUpdateSecurityResponse\nUpdateSegmentRequest\nUpdateSegmentResponse\nUpdateSensitivityInspectionTemplateRequest\nUpdateServerCertificateRequest\nUpdateServerConfigRequest\nUpdateServerEngineAttributesRequest\nUpdateServerEngineAttributesResponse\nUpdateServerRequest\nUpdateServerResponse\nUpdateServiceAccessPoliciesRequest\nUpdateServiceAccessPoliciesResponse\nUpdateServiceActionInput\nUpdateServiceActionOutput\nUpdateServiceInput\nUpdateServiceInstanceInput\nUpdateServiceInstanceOutput\nUpdateServiceIntegrationConfig\nUpdateServiceIntegrationRequest\nUpdateServiceNetworkRequest\nUpdateServiceNetworkResponse\nUpdateServiceNetworkVpcAssociationRequest\nUpdateServiceNetworkVpcAssociationResponse\nUpdateServiceOutput\nUpdateServicePipelineInput\nUpdateServicePipelineOutput\nUpdateServicePrimaryTaskSetRequest\nUpdateServicePrimaryTaskSetResponse\nUpdateServiceRequest\nUpdateServiceResponse\nUpdateServiceSettingRequest\nUpdateServiceSettingsRequest\nUpdateServiceSettingsResponse\nUpdateServiceSpecificCredentialRequest\nUpdateServiceSyncBlockerInput\nUpdateServiceSyncBlockerOutput\nUpdateServiceSyncConfigInput\nUpdateServiceSyncConfigOutput\nUpdateServiceTemplateInput\nUpdateServiceTemplateOutput\nUpdateServiceTemplateVersionInput\nUpdateServiceTemplateVersionOutput\nUpdateSettings\nUpdateSettingsRequest\nUpdateSettingsResponse\nUpdateSettingsResult\nUpdateShardCountInput\nUpdateShardCountOutput\nUpdateShareInvitationInput\nUpdateShareInvitationOutput\nUpdateSignalCatalogRequest\nUpdateSignalCatalogResponse\nUpdateSignalingChannelInput\nUpdateSignature\nUpdateSigningCertificateRequest\nUpdateSimulationApplicationRequest\nUpdateSimulationApplicationResponse\nUpdateSipMediaApplicationCallRequest\nUpdateSipMediaApplicationCallResponse\nUpdateSipMediaApplicationRequest\nUpdateSipMediaApplicationResponse\nUpdateSipRuleRequest\nUpdateSipRuleResponse\nUpdateSiteAddressInput\nUpdateSiteAddressOutput\nUpdateSiteInput\nUpdateSiteOutput\nUpdateSiteRackPhysicalPropertiesInput\nUpdateSiteRackPhysicalPropertiesOutput\nUpdateSiteRequest\nUpdateSiteResponse\nUpdateSizeConstraintSetRequest\nUpdateSizeConstraintSetResponse\nUpdateSkillGroupRequest\nUpdateSlackChannelConfigurationRequest\nUpdateSlackChannelConfigurationResult\nUpdateSlotRequest\nUpdateSlotResponse\nUpdateSlotTypeRequest\nUpdateSlotTypeResponse\nUpdateSmsChannelRequest\nUpdateSmsChannelResponse\nUpdateSmsTemplateRequest\nUpdateSmsTemplateResponse\nUpdateSnaplockConfiguration\nUpdateSnapshotRequest\nUpdateSnapshotResponse\nUpdateSnapshotResult\nUpdateSnapshotScheduleInput\nUpdateSnapshotScheduleOutput\nUpdateSolFunctionPackageInput\nUpdateSolFunctionPackageOutput\nUpdateSolNetworkInstanceInput\nUpdateSolNetworkInstanceOutput\nUpdateSolNetworkModify\nUpdateSolNetworkPackageInput\nUpdateSolNetworkPackageOutput\nUpdateSource\nUpdateSourceApiAssociationRequest\nUpdateSourceApiAssociationResponse\nUpdateSourceControlFromJobRequest\nUpdateSourceControlFromJobResponse\nUpdateSourceLocationRequest\nUpdateSourceLocationResponse\nUpdateSourceServerReplicationTypeRequest\nUpdateSpaceRequest\nUpdateSpaceResponse\nUpdateSqlInjectionMatchSetRequest\nUpdateSqlInjectionMatchSetResponse\nUpdateStackInput\nUpdateStackInstancesInput\nUpdateStackInstancesOutput\nUpdateStackOutput\nUpdateStackRequest\nUpdateStackResult\nUpdateStackSetInput\nUpdateStackSetOutput\nUpdateStageRequest\nUpdateStageResponse\nUpdateStageResult\nUpdateStandardsControlRequest\nUpdateStateMachineAliasInput\nUpdateStateMachineAliasOutput\nUpdateStateMachineInput\nUpdateStateMachineOutput\nUpdateStaticPolicyDefinition\nUpdateStatus\nUpdateStorageRequest\nUpdateStorageResponse\nUpdateStorageSystemRequest\nUpdateStorageVirtualMachineRequest\nUpdateStorageVirtualMachineResponse\nUpdateStreamInput\nUpdateStreamModeInput\nUpdateStreamProcessorRequest\nUpdateStreamRequest\nUpdateStreamResponse\nUpdateStreamingDistributionRequest\nUpdateStreamingDistributionResult\nUpdateStreamingImageRequest\nUpdateStreamingImageResponse\nUpdateStudioComponentRequest\nUpdateStudioComponentResponse\nUpdateStudioInput\nUpdateStudioRequest\nUpdateStudioResponse\nUpdateStudioSessionMappingInput\nUpdateSubnetChangeProtectionRequest\nUpdateSubnetChangeProtectionResponse\nUpdateSubnetGroupRequest\nUpdateSubnetGroupResponse\nUpdateSubscriberNotificationRequest\nUpdateSubscriberNotificationResponse\nUpdateSubscriberRequest\nUpdateSubscriberResponse\nUpdateSubscriptionDefinitionRequest\nUpdateSubscriptionRequest\nUpdateSubscriptionsToEventBridgeMessage\nUpdateSubscriptionsToEventBridgeResponse\nUpdateSuiteDefinitionRequest\nUpdateSuiteDefinitionResponse\nUpdateSvmActiveDirectoryConfiguration\nUpdateSystemTemplateRequest\nUpdateSystemTemplateResponse\nUpdateTLSInspectionConfigurationRequest\nUpdateTLSInspectionConfigurationResponse\nUpdateTableInput\nUpdateTableObjectsRequest\nUpdateTableOutput\nUpdateTableReplicaAutoScalingInput\nUpdateTableReplicaAutoScalingOutput\nUpdateTableRequest\nUpdateTableResponse\nUpdateTableStorageOptimizerRequest\nUpdateTableStorageOptimizerResponse\nUpdateTagCollectionFilter\nUpdateTagOptionInput\nUpdateTagOptionOutput\nUpdateTagsForDomainRequest\nUpdateTagsForResourceMessage\nUpdateTaintsPayload\nUpdateTarget\nUpdateTargetGroupRequest\nUpdateTargetGroupResponse\nUpdateTargets\nUpdateTargetsArchitecture\nUpdateTargetsOperatingSystem\nUpdateTaskExecutionRequest\nUpdateTaskProtectionRequest\nUpdateTaskProtectionResponse\nUpdateTaskRequest\nUpdateTaskSetRequest\nUpdateTaskSetResponse\nUpdateTaskTemplateRequest\nUpdateTaskTemplateResponse\nUpdateTeamMemberRequest\nUpdateTeamMemberResult\nUpdateTemplateActiveVersionRequest\nUpdateTemplateActiveVersionResponse\nUpdateTemplateAliasRequest\nUpdateTemplateAliasResponse\nUpdateTemplateGroupAccessControlEntryRequest\nUpdateTemplatePermissionsRequest\nUpdateTemplatePermissionsResponse\nUpdateTemplateRequest\nUpdateTemplateResponse\nUpdateTemplateSyncConfigInput\nUpdateTemplateSyncConfigOutput\nUpdateTerminationProtectionInput\nUpdateTerminationProtectionOutput\nUpdateTestGridProjectRequest\nUpdateTestGridProjectResult\nUpdateTestSetRequest\nUpdateTestSetResponse\nUpdateThemeAliasRequest\nUpdateThemeAliasResponse\nUpdateThemeData\nUpdateThemePermissionsRequest\nUpdateThemePermissionsResponse\nUpdateThemeRequest\nUpdateThemeResponse\nUpdateThesaurusRequest\nUpdateThingGroupRequest\nUpdateThingGroupResponse\nUpdateThingGroupsForThingRequest\nUpdateThingRequest\nUpdateThingRuntimeConfigurationRequest\nUpdateThingShadowRequest\nUpdateThingShadowResponse\nUpdateThreatIntelSetRequest\nUpdateTieringInput\nUpdateTime\nUpdateTimeToLiveInput\nUpdateTimeToLiveOutput\nUpdateTimelineEventInput\nUpdateToken\nUpdateTopicPermissionsRequest\nUpdateTopicPermissionsResponse\nUpdateTopicRefreshScheduleRequest\nUpdateTopicRefreshScheduleResponse\nUpdateTopicRequest\nUpdateTopicResponse\nUpdateTopicRuleDestinationRequest\nUpdateTrackerRequest\nUpdateTrackerResponse\nUpdateTrafficDistributionRequest\nUpdateTrafficPolicyCommentRequest\nUpdateTrafficPolicyCommentResponse\nUpdateTrafficPolicyInstanceRequest\nUpdateTrafficPolicyInstanceResponse\nUpdateTrailRequest\nUpdateTrailResponse\nUpdateTrainingJobRequest\nUpdateTrainingJobResponse\nUpdateTrialComponentRequest\nUpdateTrialComponentResponse\nUpdateTrialRequest\nUpdateTrialResponse\nUpdateTriggerRequest\nUpdateTriggerResponse\nUpdateTrustAnchorRequest\nUpdateTrustRequest\nUpdateTrustResult\nUpdateTrustStoreRequest\nUpdateTrustStoreResponse\nUpdateType\nUpdateTypeRequest\nUpdateTypeResponse\nUpdateTypedLinkFacetRequest\nUpdateUploadRequest\nUpdateUploadResult\nUpdateUsageLimitRequest\nUpdateUsageLimitResponse\nUpdateUsagePlanRequest\nUpdateUsageRequest\nUpdateUserAccessLoggingSettingsRequest\nUpdateUserAccessLoggingSettingsResponse\nUpdateUserAttributesRequest\nUpdateUserAttributesResponse\nUpdateUserDefinedFunctionRequest\nUpdateUserHierarchyGroupNameRequest\nUpdateUserHierarchyRequest\nUpdateUserHierarchyStructureRequest\nUpdateUserIdentityInfoRequest\nUpdateUserPhoneConfigRequest\nUpdateUserPoolClientRequest\nUpdateUserPoolClientResponse\nUpdateUserPoolDomainRequest\nUpdateUserPoolDomainResponse\nUpdateUserPoolRequest\nUpdateUserProfileRequest\nUpdateUserProfileResponse\nUpdateUserProfileResult\nUpdateUserRequest\nUpdateUserRequestItem\nUpdateUserRequestItems\nUpdateUserResponse\nUpdateUserRoutingProfileRequest\nUpdateUserSecurityProfilesRequest\nUpdateUserSettingsRequest\nUpdateUserSettingsResponse\nUpdateVPCConnectionRequest\nUpdateVPCConnectionResponse\nUpdateVPCEConfigurationRequest\nUpdateVPCEConfigurationResult\nUpdateVTLDeviceTypeInput\nUpdateVTLDeviceTypeOutput\nUpdateValue\nUpdateVariableRequest\nUpdateVariantStoreRequest\nUpdateVariantStoreResponse\nUpdateVehicleError\nUpdateVehicleRequest\nUpdateVehicleRequestItem\nUpdateVehicleResponse\nUpdateVehicleResponseItem\nUpdateVersion\nUpdateViewContentRequest\nUpdateViewContentResponse\nUpdateViewInput\nUpdateViewMetadataRequest\nUpdateViewOutput\nUpdateVirtualGatewayInput\nUpdateVirtualGatewayOutput\nUpdateVirtualInterfaceAttributesRequest\nUpdateVirtualNodeInput\nUpdateVirtualNodeOutput\nUpdateVirtualRouterInput\nUpdateVirtualRouterOutput\nUpdateVirtualServiceInput\nUpdateVirtualServiceOutput\nUpdateVocabularyFilterRequest\nUpdateVocabularyFilterResponse\nUpdateVocabularyRequest\nUpdateVocabularyResponse\nUpdateVodSourceRequest\nUpdateVodSourceResponse\nUpdateVoiceChannelRequest\nUpdateVoiceChannelResponse\nUpdateVoiceConnectorGroupRequest\nUpdateVoiceConnectorGroupResponse\nUpdateVoiceConnectorRequest\nUpdateVoiceConnectorResponse\nUpdateVoiceProfileDomainRequest\nUpdateVoiceProfileDomainResponse\nUpdateVoiceProfileRequest\nUpdateVoiceProfileResponse\nUpdateVoiceTemplateRequest\nUpdateVoiceTemplateResponse\nUpdateVolumeRequest\nUpdateVolumeResponse\nUpdateVpcAttachmentRequest\nUpdateVpcAttachmentResponse\nUpdateVpcEndpointDetail\nUpdateVpcEndpointRequest\nUpdateVpcEndpointResponse\nUpdateVpcIngressConnectionRequest\nUpdateVpcIngressConnectionResponse\nUpdateVpcLinkRequest\nUpdateVpcLinkResponse\nUpdateWatchlistRequest\nUpdateWatchlistResponse\nUpdateWaveRequest\nUpdateWebACLRequest\nUpdateWebACLResponse\nUpdateWebhookInput\nUpdateWebhookOutput\nUpdateWebhookRequest\nUpdateWebhookResult\nUpdateWirelessDeviceImportTaskRequest\nUpdateWirelessDeviceRequest\nUpdateWirelessGatewayRequest\nUpdateWirelessGatewayTaskCreate\nUpdateWirelessGatewayTaskEntry\nUpdateWorkGroupInput\nUpdateWorkerFleetRequest\nUpdateWorkerFleetResponse\nUpdateWorkerRequest\nUpdateWorkerResponse\nUpdateWorkflowRequest\nUpdateWorkflowResponse\nUpdateWorkflowStepGroupRequest\nUpdateWorkflowStepGroupResponse\nUpdateWorkflowStepRequest\nUpdateWorkflowStepResponse\nUpdateWorkforceRequest\nUpdateWorkforceResponse\nUpdateWorkgroupRequest\nUpdateWorkgroupResponse\nUpdateWorkloadInput\nUpdateWorkloadOutput\nUpdateWorkloadRequest\nUpdateWorkloadResponse\nUpdateWorkloadShareInput\nUpdateWorkloadShareOutput\nUpdateWorkspaceAliasRequest\nUpdateWorkspaceAuthenticationRequest\nUpdateWorkspaceAuthenticationResponse\nUpdateWorkspaceBundleRequest\nUpdateWorkspaceConfigurationRequest\nUpdateWorkspaceImagePermissionRequest\nUpdateWorkspaceRequest\nUpdateWorkspaceResponse\nUpdateWorkteamRequest\nUpdateWorkteamResponse\nUpdateWorldTemplateRequest\nUpdateWorldTemplateResponse\nUpdateXMLClassifierRequest\nUpdateXssMatchSetRequest\nUpdateXssMatchSetResponse\nUpdateZonalShiftRequest\nUpdatedAt\nUpdatedBy\nUpdatedDate\nUpdatedField\nUpdatedLatestPatchVersion\nUpdatedReason\nUpdatedTime\nUpdatedTimestamp\nUpdatedToken\nUpdaterRequestId\nUpdates\nUpdatesURI\nUpfrontCost\nUpfrontPrice\nUpgradeAppliedSchemaRequest\nUpgradeAppliedSchemaResponse\nUpgradeAvailability\nUpgradeDependencyFailureFault\nUpgradeDomainRequest\nUpgradeDomainResponse\nUpgradeElasticsearchDomainRequest\nUpgradeElasticsearchDomainResponse\nUpgradeHistories\nUpgradeHistory\nUpgradeId\nUpgradeLensReviewInput\nUpgradeName\nUpgradeProcessing\nUpgradeProfileVersionInput\nUpgradePublishedSchemaRequest\nUpgradePublishedSchemaResponse\nUpgradeStatus\nUpgradeStep\nUpgradeStepItem\nUpgradeStepStatus\nUpgradeTarget\nUpgradedSchemaArn\nUplinkCount\nUplinkEchoConfig\nUplinkGbps\nUplinkSpectrumConfig\nUpload\nUploadArchiveInput\nUploadAvailability\nUploadBufferAllocatedInBytes\nUploadBufferUsedInBytes\nUploadConfiguration\nUploadCredentials\nUploadDate\nUploadDocumentsRequest\nUploadDocumentsResponse\nUploadEnd\nUploadEntityDefinitionsRequest\nUploadEntityDefinitionsResponse\nUploadId\nUploadIdMarker\nUploadLayerPartRequest\nUploadLayerPartResponse\nUploadListElement\nUploadMetadata\nUploadMultipartPartInput\nUploadMultipartPartOutput\nUploadNotFoundException\nUploadPartCopyOutput\nUploadPartCopyRequest\nUploadPartOutput\nUploadPartRequest\nUploadPolicy\nUploadPolicySignature\nUploadReadSetPartRequest\nUploadReadSetPartResponse\nUploadSSHPublicKeyRequest\nUploadSSHPublicKeyResponse\nUploadServerCertificateRequest\nUploadServerCertificateResponse\nUploadSettings\nUploadSigningCertificateRequest\nUploadSigningCertificateResponse\nUploadSize\nUploadSpeed\nUploadStart\nUploadType\nUploadUrl\nUploaderConfig\nUploaderStatus\nUploads\nUploadsList\nUpperBound\nUpperBoundary\nUpsert\nUpsertKeys\nUpsertRedshiftOptions\nUpsertRedshiftTargetOptions\nUpsertRowData\nUpsertRowsResult\nUpsolver\nUpsolverDestinationProperties\nUpsolverS3OutputFormatConfig\nUpstreamRepository\nUpstreamRepositoryInfo\nUri\nUriEndpoint\nUriPath\nUriPathRoute\nUriPathRouteInput\nUris\nUrl\nUrlEndpoint\nUrlEndpointConfig\nUrlEndpointInput\nUrlEndpointSummary\nUrlExclusionPatterns\nUrlExpiry\nUrlInclusionPatterns\nUrlPath\nUrlReference\nUrlType\nUrls\nUsage\nUsageAccountResult\nUsageAllocation\nUsageAllocations\nUsageByAccount\nUsageCriteria\nUsageDataSourceResult\nUsageDimension\nUsageFeatureResult\nUsageFlags\nUsageInstruction\nUsageInstructions\nUsageLimit\nUsageLimitAlreadyExistsFault\nUsageLimitId\nUsageLimitList\nUsageLimitNotFoundFault\nUsageLimits\nUsageMetric\nUsageMetricBasis\nUsageMode\nUsageOperation\nUsageOperationUpdateTime\nUsagePlan\nUsagePlanKey\nUsagePlanKeys\nUsagePlans\nUsagePrice\nUsageQuantity\nUsageRecord\nUsageRecordResult\nUsageRecords\nUsageReportSubscription\nUsageReportSubscriptions\nUsageResourceResult\nUsageStartTimestamp\nUsageStatisticType\nUsageStatistics\nUsageStatisticsFilter\nUsageStatisticsSortBy\nUsageStopTimestamp\nUsageStrategy\nUsageTotal\nUsageType\nUsbDeviceFilterStrings\nUse2DSolver\nUseAlternateFolderForOnline\nUseAmortized\nUseAudioRenditionGroup\nUseAwsOwnedKey\nUseAwsProvidedLatestImage\nUseBFile\nUseBcpFullLoad\nUseBlankCellFormat\nUseBlended\nUseCase\nUseCaseArn\nUseCaseDescription\nUseCaseId\nUseCaseSummaryList\nUseCaseType\nUseChangeLog\nUseCsvNoSupValue\nUseCustomCookbooks\nUseDefaultIfPreferenceUnavailable\nUseDefaultProcessorFeatures\nUseDefaults\nUseDirectPathFullLoad\nUseEarliestTimeOnPointInTimeUnavailable\nUseEbsOptimizedInstances\nUseExistingClientSecret\nUseGeolocationForTimeZone\nUseGrouping\nUseLakeFormationCredentials\nUseLatestRestorableTime\nUseLegacyProvider\nUseLogit\nUseLogminerReader\nUseLongIds\nUseLongIdsAggregated\nUseMiddleboxes\nUseNewMappingType\nUseOffPeakWindow\nUseOpsworksSecurityGroups\nUseOrdering\nUsePathPrefix\nUsePreviousTemplate\nUsePreviousValue\nUsePrimaryBackgroundColor\nUseSameUsername\nUseServiceLinkedRole\nUseStageCache\nUseTaskStartTimeForFullLoadTimestamp\nUseThirdPartyBackupDevice\nUseUpdateLookUp\nUsed\nUsedCommitment\nUsedInstanceCount\nUser\nUserAccessLoggingSettings\nUserAccessLoggingSettingsSummary\nUserAccessResultItem\nUserAccessTaskItem\nUserAccessUrl\nUserActivities\nUserAgent\nUserAlreadyExistsFault\nUserAndGroupQuotas\nUserArn\nUserArnSession\nUserAttributeNames\nUserAttributeUpdateSettings\nUserAttributeUpdateSettingsType\nUserAttributes\nUserAuthConfig\nUserAuthConfigInfo\nUserBase\nUserBucket\nUserBucketDetails\nUserByPermissionGroup\nUserCode\nUserConfig\nUserConfiguration\nUserConfirmationNecessary\nUserConfirmed\nUserContext\nUserContextData\nUserContextDataType\nUserContextPolicy\nUserCount\nUserCreateDate\nUserData\nUserDataFilters\nUserDataList\nUserDataShared\nUserDataValidationParameters\nUserDefined\nUserDefinedFields\nUserDefinedFunction\nUserDefinedFunctionInput\nUserDefinedFunctions\nUserDetail\nUserDetailList\nUserDetails\nUserDoesNotExistException\nUserEmail\nUserEmailList\nUserEnabledAsLocalAdministrator\nUserError\nUserErrorException\nUserErrors\nUserFeedback\nUserGroup\nUserGroupAlreadyExistsFault\nUserGroupId\nUserGroupIds\nUserGroupIdsToAdd\nUserGroupIdsToRemove\nUserGroupNotFoundFault\nUserGroupPendingChanges\nUserGroupQuotaExceededFault\nUserGroupResolutionConfiguration\nUserGroupResolutionMode\nUserGroups\nUserGroupsUpdateStatus\nUserHierarchyGroupSummaryList\nUserHierarchyGroups\nUserId\nUserIdGroupPair\nUserIdGroupPairs\nUserIdList\nUserIdentity\nUserIdentityConfiguration\nUserIdentityInfo\nUserIdentityInfoLite\nUserIdentityRoot\nUserIds\nUserIdsToAdd\nUserIdsToRemove\nUserImportInProgressException\nUserImportJob\nUserImportJobType\nUserImportJobs\nUserInfo\nUserInfoEndpoint\nUserInteractionRequired\nUserInvitationStatus\nUserInvitationUrl\nUserLambdaValidationException\nUserLastModifiedDate\nUserList\nUserMFASettingList\nUserMatch\nUserMatchThreshold\nUserMatches\nUserMetadata\nUserMigration\nUserName\nUserNameAttributeField\nUserNameColumn\nUserNames\nUserNamesToAdd\nUserNamesToRemove\nUserNotConfirmedException\nUserNotFoundException\nUserNotFoundFault\nUserPassword\nUserPausedDetails\nUserPendingChanges\nUserPhoneConfig\nUserPolicyList\nUserPool\nUserPoolAddOnNotEnabledException\nUserPoolAddOns\nUserPoolAddOnsType\nUserPoolArn\nUserPoolClient\nUserPoolClientDescription\nUserPoolClientId\nUserPoolClientType\nUserPoolClients\nUserPoolConfig\nUserPoolConfigs\nUserPoolDescriptionType\nUserPoolDomain\nUserPoolId\nUserPoolName\nUserPoolPolicyType\nUserPoolTaggingException\nUserPoolTags\nUserPoolType\nUserPools\nUserProfile\nUserProfileAlreadyExistsException\nUserProfileArn\nUserProfileDetails\nUserProfileName\nUserProfileNameContains\nUserProfileNameEquals\nUserProfileNotFoundException\nUserProfileSummary\nUserProfiles\nUserProperty\nUserQuickConnectConfig\nUserQuotaExceededFault\nUserReference\nUserRegistrationStatus\nUserRole\nUserRoleName\nUserRules\nUserSearchCriteria\nUserSearchFilter\nUserSearchMatching\nUserSearchSubtree\nUserSearchSummary\nUserSecretId\nUserSetting\nUserSettings\nUserSettingsSummary\nUserStackAssociation\nUserStackAssociationError\nUserStackAssociations\nUserStatus\nUserStorage\nUserStorageMetadata\nUserSub\nUserSummary\nUserSummaryList\nUserTags\nUserTokenConfiguration\nUserTokenConfigurations\nUserTrustProviderType\nUserTurnInputSpecification\nUserTurnIntentOutput\nUserTurnOutputSpecification\nUserTurnResult\nUserTurnSlotOutput\nUserTurnSpecification\nUserType\nUserVolumeEncryptionEnabled\nUserVolumeSizeGib\nUsername\nUsernameAttributes\nUsernameConfiguration\nUsernameConfigurationType\nUsernameExistsException\nUsernameField\nUsernamePassword\nUsernamePrefix\nUsernames\nUsers\nUsersPerStep\nUtcTiming\nUtcTimingUri\nUtilization\nUtilizationByTime\nUtilizationMetric\nUtilizationPercentage\nUtilizationPercentageInUnits\nUtilizationStatus\nUtilizationsByTime\nUtilizedCIDRCount\nUtranCid\nUtteranceAggregationDuration\nUtteranceAudioInputSpecification\nUtteranceBotResponse\nUtteranceData\nUtteranceDataSortBy\nUtteranceEvent\nUtteranceId\nUtteranceInputSpecification\nUtteranceLevelTestResultItem\nUtteranceLevelTestResults\nUtteranceList\nUtteranceSpecification\nUuid\nVCPU\nVCpuCount\nVCpuCountRange\nVCpuCountRangeRequest\nVCpuCountRequest\nVCpuInfo\nVOICE\nVPC\nVPCAssociationAuthorizationNotFound\nVPCAssociationNotFound\nVPCConfig\nVPCConfigResponse\nVPCConnection\nVPCConnectionId\nVPCConnectionSummaries\nVPCConnectionSummary\nVPCConnections\nVPCDerivedInfo\nVPCDerivedInfoStatus\nVPCEConfiguration\nVPCEndpoint\nVPCEndpointDNSName\nVPCId\nVPCOptions\nVPCRegion\nVPCSettings\nVPCZoneIdentifier\nVPCs\nVTLDevice\nVTLDeviceARN\nVTLDeviceARNs\nVTLDeviceProductIdentifier\nVTLDeviceType\nVTLDeviceVendor\nVTLDevices\nValid\nValidCores\nValidDBInstanceModificationsMessage\nValidForInMinutes\nValidFrom\nValidFromDate\nValidNextSteps\nValidProcessorFeatures\nValidStorageOptions\nValidThreadsPerCore\nValidTill\nValidTo\nValidToDate\nValidUntil\nValidUpgradeTarget\nValidUserList\nValidateAssessmentReportIntegrityRequest\nValidateAssessmentReportIntegrityResponse\nValidateConfigurationRequest\nValidateConfigurationSettingsMessage\nValidateE911AddressRequest\nValidateE911AddressResponse\nValidateMatchmakingRuleSetInput\nValidateMatchmakingRuleSetOutput\nValidateOnly\nValidatePipelineDefinitionInput\nValidatePipelineDefinitionOutput\nValidatePipelineRequest\nValidatePipelineResponse\nValidatePolicyFinding\nValidatePolicyRequest\nValidatePolicyResponse\nValidateResourcePolicyRequest\nValidateResourcePolicyResponse\nValidateSecurityProfileBehaviorsRequest\nValidateSecurityProfileBehaviorsResponse\nValidateSolFunctionPackageContentInput\nValidateSolFunctionPackageContentMetadata\nValidateSolFunctionPackageContentOutput\nValidateSolNetworkPackageContentInput\nValidateSolNetworkPackageContentMetadata\nValidateSolNetworkPackageContentOutput\nValidateTemplateInput\nValidateTemplateOutput\nValidation\nValidationConfiguration\nValidationConfigurations\nValidationData\nValidationDataConfig\nValidationDataLength\nValidationDomain\nValidationEmails\nValidationError\nValidationErrors\nValidationErrorsEntry\nValidationException\nValidationExceptionErrorArgument\nValidationExceptionField\nValidationExceptionType\nValidationFailedRecords\nValidationFailure\nValidationFailureReason\nValidationFailures\nValidationFraction\nValidationIssue\nValidationMessage\nValidationMethod\nValidationMode\nValidationOutput\nValidationPendingRecords\nValidationProfiles\nValidationResult\nValidationRole\nValidationRule\nValidationSettings\nValidationSpecification\nValidationState\nValidationStateDetails\nValidationStatus\nValidationStatuses\nValidationSuspendedRecords\nValidationWarning\nValidator\nValidatorMetric\nValidatorTypes\nValidators\nValidity\nValidityEndTime\nValidityNotBefore\nValidityPeriod\nValidityStartTime\nValue\nValueAsString\nValueAsStringList\nValueAxis\nValueCellStyle\nValueDetection\nValueDetections\nValueForMultipleValues\nValueFrom\nValueHint\nValueHolder\nValueImportanceMap\nValueInIA\nValueInMilliseconds\nValueInStandard\nValueKey\nValueLabelConfiguration\nValueLabelOptions\nValueList\nValueMapping\nValueMappings\nValueOptions\nValueType\nValueWhenUnset\nValueWhenUnsetOption\nValueWithServiceIds\nValues\nValuesMap\nValuesToAdd\nValuesToRemove\nVarCharValue\nVariable\nVariableDefinition\nVariableEntry\nVariableImpactExplanation\nVariableImportanceMetrics\nVariableTags\nVariableValue\nVariables\nVariant\nVariantImportItemDetail\nVariantImportItemSource\nVariantImportJobItem\nVariantName\nVariantProperty\nVariantPropertyType\nVariantStatus\nVariantStoreItem\nVariation\nVariationConfig\nVaultARN\nVaultAccessPolicy\nVaultList\nVaultLockPolicy\nVaultName\nVaultNames\nVaultNotificationConfig\nVaultState\nVaultType\nVbrQuality\nVc3Class\nVc3Settings\nVcenterBasedRemoteInfo\nVcenterClient\nVcfOptions\nVchipAction\nVcpu\nVdmAttributes\nVdmEnabled\nVdmOptions\nVectorConfig\nVectorCounters\nVectorEnrichmentJobErrorDetails\nVectorEnrichmentJobExportErrorDetails\nVectorEnrichmentJobInputConfig\nVectorEnrichmentJobS3Data\nVectorEnrichmentJobSummaries\nVectorType\nVeeva\nVeevaConnectorProfileCredentials\nVeevaConnectorProfileProperties\nVeevaSourceProperties\nVehicleStatus\nVehicleSummary\nVendor\nVendorCreatedAt\nVendorGuidance\nVendorId\nVendorName\nVendorProperties\nVendorSeverity\nVendorUpdatedAt\nVerb\nVerbose\nVerificationAttributes\nVerificationException\nVerificationFailedException\nVerificationKeyArn\nVerificationKeyCheckValue\nVerificationKeyIdentifier\nVerificationMessage\nVerificationMessageTemplate\nVerificationMessageTemplateType\nVerificationResponse\nVerificationState\nVerificationStatus\nVerificationToken\nVerificationValue\nVerified\nVerifiedAccessEndpoint\nVerifiedAccessEndpointEniOptions\nVerifiedAccessEndpointId\nVerifiedAccessEndpointIds\nVerifiedAccessEndpointLoadBalancerOptions\nVerifiedAccessEndpointStatus\nVerifiedAccessEndpoints\nVerifiedAccessGroup\nVerifiedAccessGroupArn\nVerifiedAccessGroupId\nVerifiedAccessGroupIds\nVerifiedAccessGroups\nVerifiedAccessInstance\nVerifiedAccessInstanceId\nVerifiedAccessInstanceIds\nVerifiedAccessInstanceLoggingConfiguration\nVerifiedAccessInstances\nVerifiedAccessLogCloudWatchLogsDestination\nVerifiedAccessLogCloudWatchLogsDestinationOptions\nVerifiedAccessLogDeliveryStatus\nVerifiedAccessLogKinesisDataFirehoseDestination\nVerifiedAccessLogKinesisDataFirehoseDestinationOptions\nVerifiedAccessLogOptions\nVerifiedAccessLogS3Destination\nVerifiedAccessLogS3DestinationOptions\nVerifiedAccessLogs\nVerifiedAccessSseSpecificationRequest\nVerifiedAccessSseSpecificationResponse\nVerifiedAccessTrustProvider\nVerifiedAccessTrustProviderCondensed\nVerifiedAccessTrustProviderId\nVerifiedAccessTrustProviderIds\nVerifiedAccessTrustProviders\nVerifiedAuthorUrl\nVerifiedEmailAddresses\nVerifiedForSendingStatus\nVerify\nVerifyAuthChallengeResponse\nVerifyAuthRequestCryptogramInput\nVerifyAuthRequestCryptogramOutput\nVerifyCardValidationDataInput\nVerifyCardValidationDataOutput\nVerifyDomainDkimRequest\nVerifyDomainDkimResponse\nVerifyDomainIdentityRequest\nVerifyDomainIdentityResponse\nVerifyDuration\nVerifyEmailAddressRequest\nVerifyEmailIdentityRequest\nVerifyMacInput\nVerifyMacOutput\nVerifyMacRequest\nVerifyMacResponse\nVerifyMode\nVerifyOTPMessageRequest\nVerifyOTPMessageRequestParameters\nVerifyOTPMessageResponse\nVerifyPinDataInput\nVerifyPinDataOutput\nVerifyRequest\nVerifyResponse\nVerifySMSSandboxPhoneNumberInput\nVerifySessionResponse\nVerifySoftwareTokenRequest\nVerifySoftwareTokenResponse\nVerifyStatus\nVerifyTrustRequest\nVerifyTrustResult\nVerifyUserAttributeRequest\nVersion\nVersionArn\nVersionBump\nVersionConflictException\nVersionControlInfo\nVersionCount\nVersionCreatedDate\nVersionDate\nVersionDeleteError\nVersionDescription\nVersionDifferences\nVersionId\nVersionIdMarker\nVersionIds\nVersionIdsToStages\nVersionInfo\nVersionInformation\nVersionLabel\nVersionLabels\nVersionLifecycleConfig\nVersionMismatchException\nVersionName\nVersionNames\nVersionNumber\nVersionStage\nVersionStages\nVersionStatus\nVersionSummary\nVersionToExpire\nVersionToPublish\nVersionUpdateByJobsConfig\nVersioningConfiguration\nVersioningSupported\nVersions\nVersionsLimitExceededException\nVersionsToPublish\nVertex\nVerticalAccuracy\nVerticalAlign\nVerticalLayoutConfiguration\nVerticalOffset\nVerticalOverflowVisibility\nVerticalPosition\nVerticalTextAlignment\nVertices\nVgwTelemetry\nVideo\nVideoArtifactsConfiguration\nVideoAttribute\nVideoBlackFailoverSettings\nVideoBlackSettings\nVideoBlackThresholdMsec\nVideoCodecSettings\nVideoCompositionOffsets\nVideoConcatenationConfiguration\nVideoConfiguration\nVideoContentSourceUrl\nVideoDescription\nVideoDescriptionName\nVideoDescriptions\nVideoDetail\nVideoDetails\nVideoFormat\nVideoGenerator\nVideoMetadata\nVideoParameters\nVideoPid\nVideoPreprocessor\nVideoPreprocessors\nVideoQuality\nVideoSelector\nVideoSelectorColorSpaceSettings\nVideoSelectorPid\nVideoSelectorProgramId\nVideoSelectorSettings\nVideoSettings\nVideoTooLargeException\nView\nViewArn\nViewArns\nViewBillingRequest\nViewBillingResponse\nViewContent\nViewContentSha256\nViewExpandedText\nViewFrame\nViewId\nViewInputContent\nViewName\nViewOffNadir\nViewOffNadirInput\nViewOriginalText\nViewSummary\nViewSunAzimuth\nViewSunAzimuthInput\nViewSunElevation\nViewSunElevationInput\nViewToken\nViewVersion\nViewVersionSummary\nViewVersionSummaryList\nViewerCertificate\nViewerProtocolPolicy\nViews\nViewsSummaryList\nViolatedEntities\nViolatingRoute\nViolatingRoutes\nViolatingSecurityGroups\nViolationDetail\nViolationEvent\nViolationEventAdditionalInfo\nViolationEventOccurrenceRange\nViolationReason\nViolationReport\nViolationTarget\nViolationTargetDescription\nViolatorCount\nViolators\nVirtualCluster\nVirtualGateway\nVirtualGatewayBackendDefaults\nVirtualGatewayClientPolicy\nVirtualGatewayClientPolicyTls\nVirtualGatewayData\nVirtualGatewayFileAccessLog\nVirtualGatewayGrpcConnectionPool\nVirtualGatewayHealthCheckPolicy\nVirtualGatewayHttp2ConnectionPool\nVirtualGatewayHttpConnectionPool\nVirtualGatewayListener\nVirtualGatewayListenerTls\nVirtualGatewayListenerTlsAcmCertificate\nVirtualGatewayListenerTlsFileCertificate\nVirtualGatewayListenerTlsSdsCertificate\nVirtualGatewayListenerTlsValidationContext\nVirtualGatewayLogging\nVirtualGatewayPortMapping\nVirtualGatewayRef\nVirtualGatewaySpec\nVirtualGatewayStatus\nVirtualGatewayTlsValidationContext\nVirtualGatewayTlsValidationContextAcmTrust\nVirtualGatewayTlsValidationContextFileTrust\nVirtualGatewayTlsValidationContextSdsTrust\nVirtualGateways\nVirtualHost\nVirtualInterface\nVirtualInterfaceTestHistory\nVirtualInterfaces\nVirtualMFADevice\nVirtualMFADeviceName\nVirtualMFADevices\nVirtualMachine\nVirtualMachineDetails\nVirtualMachines\nVirtualName\nVirtualNetworkId\nVirtualNodeData\nVirtualNodeGrpcConnectionPool\nVirtualNodeHttp2ConnectionPool\nVirtualNodeHttpConnectionPool\nVirtualNodeRef\nVirtualNodeServiceProvider\nVirtualNodeSpec\nVirtualNodeStatus\nVirtualNodeTcpConnectionPool\nVirtualObject\nVirtualRouterData\nVirtualRouterListener\nVirtualRouterRef\nVirtualRouterServiceProvider\nVirtualRouterSpec\nVirtualRouterStatus\nVirtualServiceBackend\nVirtualServiceData\nVirtualServiceRef\nVirtualServiceSpec\nVirtualServiceStatus\nVirtualizationType\nVirtualizationTypes\nVisaPin\nVisaPinVerification\nVisaPinVerificationValue\nVisibility\nVisibilityConfig\nVisibilityState\nVisibilityTimeout\nVisibleRange\nVisibleRangeOptions\nVisibleToAllUsers\nVisitorId\nVisual\nVisualAxisSortOption\nVisualCustomAction\nVisualCustomActionOperation\nVisualId\nVisualIds\nVisualLayoutOptions\nVisualMenuOption\nVisualPalette\nVisualPublishOptions\nVisualReference\nVisualReferenceInput\nVisualReferenceOutput\nVisualSubtitleLabelOptions\nVisualTitleLabelOptions\nVisuals\nVlan\nVlanId\nVmServer\nVmServerAddress\nVmwareCategory\nVmwareTag\nVmwareTagDescription\nVmwareTagName\nVmwareTags\nVmwareToAwsTagMapping\nVmwareToAwsTagMappings\nVocabularies\nVocabulary\nVocabularyArn\nVocabularyFileUri\nVocabularyFilterFileUri\nVocabularyFilterInfo\nVocabularyFilterMatch\nVocabularyFilterMethod\nVocabularyFilterName\nVocabularyFilterNames\nVocabularyFilters\nVocabularyId\nVocabularyInfo\nVocabularyName\nVocabularyNames\nVocabularyState\nVocabularySummary\nVocabularySummaryList\nVodSource\nVodSourceName\nVoice\nVoiceAnalyticsProcessorConfiguration\nVoiceChannelRequest\nVoiceChannelResponse\nVoiceConnector\nVoiceConnectorArn\nVoiceConnectorGroup\nVoiceConnectorGroupArn\nVoiceConnectorGroupId\nVoiceConnectorGroups\nVoiceConnectorId\nVoiceConnectorItem\nVoiceConnectorItems\nVoiceConnectorRegions\nVoiceConnectorSettings\nVoiceConnectors\nVoiceEnhancementSinkConfiguration\nVoiceId\nVoiceMessage\nVoiceMessageContent\nVoiceProfile\nVoiceProfileArn\nVoiceProfileDomain\nVoiceProfileDomainArn\nVoiceProfileDomainId\nVoiceProfileDomainSummary\nVoiceProfileDomains\nVoiceProfileId\nVoiceProfileSummary\nVoiceProfiles\nVoiceRecordingConfiguration\nVoiceRecordingTrack\nVoiceSettings\nVoiceSpoofingRisk\nVoiceTemplate\nVoiceTemplateRequest\nVoiceTemplateResponse\nVoiceToneAnalysisStatus\nVoiceToneAnalysisTask\nVoiceToneAnalysisTaskId\nVoiceToneAnalysisTaskStatus\nVoiceprintGenerationStatus\nVoices\nVoipDeviceToken\nVolume\nVolumeARN\nVolumeARNs\nVolumeAppendModeEnabled\nVolumeArn\nVolumeAttachment\nVolumeAttachmentStatus\nVolumeConfiguration\nVolumeConfigurations\nVolumeDetail\nVolumeDiskId\nVolumeEncryptionKey\nVolumeFilter\nVolumeFrom\nVolumeId\nVolumeIds\nVolumeInfo\nVolumeInfos\nVolumeKmsKeyId\nVolumeModification\nVolumeMount\nVolumeMounts\nVolumeName\nVolumeNotFound\nVolumePath\nVolumeProgress\nVolumeRecommendation\nVolumeRecommendationOption\nVolumeRecoveryPointInfo\nVolumeRecoveryPointInfos\nVolumeRecoveryPointTime\nVolumeScanStatus\nVolumeSize\nVolumeSizeGB\nVolumeSizeInBytes\nVolumeSizeInGB\nVolumeSpecification\nVolumeStatistics\nVolumeStatus\nVolumeStatusAction\nVolumeStatusAttachmentStatus\nVolumeStatusDetails\nVolumeStatusEvent\nVolumeStatusInfo\nVolumeStatusItem\nVolumeStatuses\nVolumeThroughput\nVolumeType\nVolumeUsageByDatasourcePackage\nVolumeUsageInBytes\nVolumeUsageUpdateTime\nVolumeUsageUpdatedTime\nVolumeUsedInBytes\nVolumeiSCSIAttributes\nVolumes\nVolumesFrom\nVolumesModifications\nVolumesPerInstance\nVorbisSettings\nVote\nVoteOnProposalInput\nVoteSummary\nVoterMemberId\nVotingPolicy\nVp8Settings\nVp9Settings\nVpc\nVpcArn\nVpcAttachment\nVpcAttachments\nVpcCidrBlockAssociation\nVpcCidrBlockState\nVpcClassicLink\nVpcConfig\nVpcConfigInput\nVpcConfigOutput\nVpcConfigRequest\nVpcConfigResponse\nVpcConfigs\nVpcConfiguration\nVpcConfigurationDescription\nVpcConfigurationDescriptions\nVpcConfigurationId\nVpcConfigurationUpdate\nVpcConfigurationUpdates\nVpcConfigurations\nVpcConnection\nVpcConnectionArn\nVpcConnectionInfo\nVpcConnectionInfoServerless\nVpcConnectionProperties\nVpcConnections\nVpcConnectivity\nVpcConnectivityClientAuthentication\nVpcConnectivityIam\nVpcConnectivitySasl\nVpcConnectivityScram\nVpcConnectivityTls\nVpcConnector\nVpcConnectorArn\nVpcConnectorName\nVpcConnectorRevision\nVpcConnectors\nVpcDNSTarget\nVpcDNSTargets\nVpcDescription\nVpcDestinationConfiguration\nVpcDestinationProperties\nVpcDestinationSummary\nVpcEndpoint\nVpcEndpointConnection\nVpcEndpointConnectionId\nVpcEndpointConnections\nVpcEndpointDetail\nVpcEndpointError\nVpcEndpointErrorDetail\nVpcEndpointErrors\nVpcEndpointFilters\nVpcEndpointId\nVpcEndpointIds\nVpcEndpointOwner\nVpcEndpointPolicySupported\nVpcEndpointService\nVpcEndpointServiceName\nVpcEndpointState\nVpcEndpointSummary\nVpcEndpointSummaryList\nVpcEndpointType\nVpcEndpoints\nVpcId\nVpcIds\nVpcInfoCidrBlockSetDetails\nVpcInfoIpv6CidrBlockSetDetails\nVpcInfoPeeringOptionsDetails\nVpcInformation\nVpcIngressConnection\nVpcIngressConnectionArn\nVpcIngressConnectionName\nVpcIngressConnectionSummary\nVpcIngressConnectionSummaryList\nVpcInterface\nVpcInterfaceAttachment\nVpcInterfaceName\nVpcInterfaceRequest\nVpcInterfaces\nVpcIpv6CidrBlockAssociation\nVpcLink\nVpcLinkId\nVpcLinkStatus\nVpcLinkStatusMessage\nVpcLinkVersion\nVpcLinks\nVpcName\nVpcOnly\nVpcOptions\nVpcOutputSettings\nVpcOutputSettingsDescription\nVpcOwnerId\nVpcPeeringAuthorization\nVpcPeeringAuthorizations\nVpcPeeringConnection\nVpcPeeringConnectionId\nVpcPeeringConnectionIds\nVpcPeeringConnectionOptionsDescription\nVpcPeeringConnectionStateReason\nVpcPeeringConnectionStatus\nVpcPeeringConnectionVpcInfo\nVpcPeeringConnections\nVpcSecurityGroupId\nVpcSecurityGroupIds\nVpcSecurityGroupMembership\nVpcSecurityGroupMemberships\nVpcSecurityGroups\nVpcSettings\nVpcSubnetIds\nVpcSubnets\nVpceId\nVpcs\nVpnConnection\nVpnConnectionArn\nVpnConnectionDeviceSampleConfiguration\nVpnConnectionDeviceType\nVpnConnectionDeviceTypeId\nVpnConnectionDeviceTypes\nVpnConnectionId\nVpnConnectionIds\nVpnConnectionOptions\nVpnConnectionOptionsSpecification\nVpnConnections\nVpnEcmpSupport\nVpnGateway\nVpnGatewayId\nVpnGatewayIds\nVpnGateways\nVpnPort\nVpnProtocol\nVpnStaticRoute\nVpnTunnelLogOptions\nVpnTunnelLogOptionsSpecification\nVpnTunnelOptionsSpecification\nVpnTunnelOutsideIpAddress\nVsamAttributes\nVsamDetailAttributes\nVulnerabilities\nVulnerability\nVulnerabilityCodeVulnerabilities\nVulnerabilityIdAggregation\nVulnerabilityVendor\nVulnerablePackage\nVulnerablePackages\nWAFAssociatedItemException\nWAFBadRequestException\nWAFConfigurationWarningException\nWAFDisallowedNameException\nWAFDuplicateItemException\nWAFEntityMigrationException\nWAFExpiredManagedRuleGroupVersionException\nWAFInternalErrorException\nWAFInvalidOperationException\nWAFInvalidParameterException\nWAFInvalidPermissionPolicyException\nWAFInvalidRegexPatternException\nWAFInvalidResourceException\nWAFLimitsExceededException\nWAFLogDestinationPermissionIssueException\nWAFNonEmptyEntityException\nWAFNonexistentContainerException\nWAFNonexistentItemException\nWAFOptimisticLockException\nWAFReferencedItemException\nWAFServiceLinkedRoleErrorException\nWAFStaleDataException\nWAFSubscriptionNotFoundException\nWAFTagOperationException\nWAFTagOperationInternalErrorException\nWAFUnavailableEntityException\nWAFUnsupportedAggregateKeyTypeException\nWAPE\nWafAction\nWafExcludedRule\nWafOverrideAction\nWafWebAclArn\nWait\nWaitActivity\nWaitAndContinueSpecification\nWaitFor\nWaitForQuietTime\nWaitIntervalInSeconds\nWaitMinutes\nWaitPeriodMs\nWaitTime\nWaitTimeSeconds\nWaitUntil\nWaitingActions\nWaitingOnIngestion\nWakeUp\nWakeWord\nWarehouse\nWarmCount\nWarmEnabled\nWarmNodeCount\nWarmPoolConfiguration\nWarmPoolProgress\nWarmPoolSize\nWarmPoolStatus\nWarmPoolStatusEquals\nWarmStartConfig\nWarmStartType\nWarmType\nWarmupPercentage\nWarmupStatus\nWarnCode\nWarnMessage\nWarning\nWarningForeground\nWarningGroup\nWarningMessage\nWarnings\nWarningsListItem\nWatchlist\nWatchlistDetails\nWatchlistId\nWatchlistIds\nWatchlistSummaries\nWatchlistSummary\nWaterfallChartAggregatedFieldWells\nWaterfallChartConfiguration\nWaterfallChartFieldWells\nWaterfallChartOptions\nWaterfallChartSortConfiguration\nWaterfallVisual\nWatermarks\nWavSettings\nWave\nWaveAggregatedStatus\nWaypointPositions\nWcdma\nWcdmaLocalId\nWcdmaNmr\nWcdmaNmrObj\nWcdmaObj\nWeb\nWebACL\nWebACLArn\nWebACLId\nWebACLLockToken\nWebACLName\nWebACLSummary\nWebACLUpdate\nWebACLs\nWebAclArn\nWebAclId\nWebClientId\nWebCollectorGrantedRoleBasedAccess\nWebCollectorS3Access\nWebCrawlerConfiguration\nWebCrawlerMode\nWebDeliveryAllowedFlag\nWebIdentityToken\nWebLinkFieldMappings\nWebServerHostname\nWebSocketEndpoint\nWebToken\nWebUrl\nWebhook\nWebhookAuthConfiguration\nWebhookDefinition\nWebhookFilter\nWebhookFilterRule\nWebserverAccessMode\nWebserverLogs\nWebserverUrl\nWebsiteAuthorizationProviderSummary\nWebsiteAuthorizationProviders\nWebsiteCaId\nWebsiteCaSummary\nWebsiteCertificateAuthorities\nWebsiteConfiguration\nWebsiteRedirectLocation\nWebsiteURL\nWebsiteUrl\nWebsocket\nWebvttDestinationSettings\nWebvttHlsSourceSettings\nWednesday\nWeeklyAutoScalingSchedule\nWeeklyMaintenanceStartTime\nWeeklyMaintenanceWindowStart\nWeeklySchedule\nWeeklySetting\nWeeklySettings\nWeeklyStartTime\nWeight\nWeightLbs\nWeightSort\nWeightedCapacity\nWeightedQuantileLoss\nWeightedQuantileLosses\nWeightedTarget\nWeightedTargetGroup\nWelcomeIntent\nWest\nWhatIfAnalyses\nWhatIfAnalysisArn\nWhatIfAnalysisName\nWhatIfAnalysisSummary\nWhatIfForecastArn\nWhatIfForecastArns\nWhatIfForecastExportArn\nWhatIfForecastExportName\nWhatIfForecastExportSummary\nWhatIfForecastExports\nWhatIfForecastName\nWhatIfForecastSummary\nWhatIfForecasts\nWhatIfPointScenario\nWhatIfRangeScenario\nWhitePointX\nWhitePointY\nWhitelist\nWhitelistCidr\nWhitelistRules\nWhitelistedNames\nWhoIsServer\nWiFiAccessPoint\nWiFiAccessPoints\nWidth\nWidthInPx\nWidthPixels\nWikiFieldMappings\nWindowEndDatetime\nWindowExecutionId\nWindowExecutionTaskIdentities\nWindowExecutionTaskInvocationIdentities\nWindowExecutions\nWindowId\nWindowIdentities\nWindowOptions\nWindowSize\nWindowStartDatetime\nWindowStartTime\nWindowSummary\nWindowTargetId\nWindowTaskId\nWindowsAuditLogConfiguration\nWindowsAuditLogCreateConfiguration\nWindowsConfiguration\nWindowsFileSystemConfiguration\nWindowsResponse\nWirelessConnection\nWirelessDeviceEventLogOption\nWirelessDeviceEventTopic\nWirelessDeviceFrameInfo\nWirelessDeviceId\nWirelessDeviceIdEventTopic\nWirelessDeviceImportTask\nWirelessDeviceImportTaskList\nWirelessDeviceList\nWirelessDeviceLogOption\nWirelessDeviceLogOptions\nWirelessDeviceStatistics\nWirelessDeviceType\nWirelessDevices\nWirelessDevicesToAdd\nWirelessDevicesToRemove\nWirelessGatewayEventLogOption\nWirelessGatewayEventTopic\nWirelessGatewayId\nWirelessGatewayIdEventTopic\nWirelessGatewayList\nWirelessGatewayLogOption\nWirelessGatewayLogOptions\nWirelessGatewayStatistics\nWirelessGatewayTaskDefinitionId\nWirelessGateways\nWirelessGatewaysToAdd\nWirelessGatewaysToRemove\nWirelessMetadata\nWisdomInfo\nWithDecryption\nWithEvent\nWithFederation\nWithHeader\nWithdrawByoipCidrRequest\nWithdrawByoipCidrResponse\nWithdrawByoipCidrResult\nWithoutSettings\nWordCasing\nWordCloudAggregatedFieldWells\nWordCloudChartConfiguration\nWordCloudFieldWells\nWordCloudOptions\nWordCloudSortConfiguration\nWordCloudVisual\nWordFilter\nWordOrientation\nWordPadding\nWordScaling\nWords\nWorkDocsConfiguration\nWorkGroup\nWorkGroupConfiguration\nWorkGroupConfigurationUpdates\nWorkGroupName\nWorkGroupNames\nWorkGroupSummary\nWorkGroups\nWorkLogFieldMappings\nWorkRequesterAccountId\nWorkUnitId\nWorkUnitIdMax\nWorkUnitIdMin\nWorkUnitRange\nWorkUnitRanges\nWorkUnitToken\nWorkUnitsExecutedCount\nWorkUnitsGeneratedCount\nWorkUnitsNotReadyYetException\nWorker\nWorkerBlock\nWorkerBlocks\nWorkerConfiguration\nWorkerConfigurationDescription\nWorkerConfigurationRevisionDescription\nWorkerConfigurationRevisionSummary\nWorkerConfigurationSummary\nWorkerFleet\nWorkerId\nWorkerIds\nWorkerLogDelivery\nWorkerLogDeliveryDescription\nWorkerLogs\nWorkerResourceConfig\nWorkerType\nWorkerTypeSpecification\nWorkerTypeSpecificationInput\nWorkflow\nWorkflowAttributes\nWorkflowDetail\nWorkflowDetails\nWorkflowExecution\nWorkflowExecutionAlreadyStartedFault\nWorkflowExecutionCancelRequestedEventAttributes\nWorkflowExecutionCanceledEventAttributes\nWorkflowExecutionCompletedEventAttributes\nWorkflowExecutionConfiguration\nWorkflowExecutionContinuedAsNewEventAttributes\nWorkflowExecutionCount\nWorkflowExecutionDetail\nWorkflowExecutionFailedEventAttributes\nWorkflowExecutionFilter\nWorkflowExecutionInfo\nWorkflowExecutionInfos\nWorkflowExecutionMetadata\nWorkflowExecutionOpenCounts\nWorkflowExecutionSignaledEventAttributes\nWorkflowExecutionStartedEventAttributes\nWorkflowExecutionTerminatedEventAttributes\nWorkflowExecutionTimedOutEventAttributes\nWorkflowGraph\nWorkflowId\nWorkflowListItem\nWorkflowMetrics\nWorkflowName\nWorkflowParameter\nWorkflowRun\nWorkflowRunId\nWorkflowRunProperties\nWorkflowRunStatistics\nWorkflowState\nWorkflowStatus\nWorkflowStep\nWorkflowStepAutomationConfiguration\nWorkflowStepGroupSummary\nWorkflowStepItem\nWorkflowStepMetadata\nWorkflowStepOutput\nWorkflowStepSummary\nWorkflowToken\nWorkflowType\nWorkflowTypeConfiguration\nWorkflowTypeDetail\nWorkflowTypeFilter\nWorkflowTypeInfo\nWorkflowTypeInfos\nWorkflowUpdate\nWorkflows\nWorkforce\nWorkforceArn\nWorkforceName\nWorkforceVpcConfig\nWorkforceVpcConfigRequest\nWorkforceVpcConfigResponse\nWorkforces\nWorkgroup\nWorkgroupName\nWorkingDirectory\nWorkingStorageAllocatedInBytes\nWorkingStorageUsedInBytes\nWorkload\nWorkloadArn\nWorkloadConfiguration\nWorkloadDiscoveryConfig\nWorkloadId\nWorkloadList\nWorkloadName\nWorkloadNamePrefix\nWorkloadProfile\nWorkloadRemarks\nWorkloadResourceDefinition\nWorkloadShare\nWorkloadShareSummaries\nWorkloadShareSummary\nWorkloadSummaries\nWorkloadSummary\nWorkloadType\nWorkmailAction\nWorkspace\nWorkspaceAccessProperties\nWorkspaceBundle\nWorkspaceConnectionStatus\nWorkspaceCreationProperties\nWorkspaceDescription\nWorkspaceDirectory\nWorkspaceId\nWorkspaceIds\nWorkspaceImage\nWorkspaceProperties\nWorkspaceRequest\nWorkspaceSecurityGroupId\nWorkspaceSettings\nWorkspaceState\nWorkspaceStatus\nWorkspaceSummary\nWorkspaces\nWorkspacesConnectionStatus\nWorkspacesDefaultRoleNotFoundException\nWorkspacesIpGroup\nWorkteam\nWorkteamArn\nWorkteamName\nWorkteams\nWorldConfig\nWorldCount\nWorldExportJobSummary\nWorldFailure\nWorldGenerationJobSummary\nWorldSummary\nWorm\nWrap\nWrappedKey\nWrappedKeyBlock\nWrappedKeyMaterialFormat\nWrappingAlgorithm\nWrappingKeyAlgorithm\nWrappingKeyArn\nWrappingKeyCertificate\nWrappingKeyCertificateChain\nWrappingKeyIdentifier\nWrappingKeySpec\nWrite\nWriteAccessPrincipalArns\nWriteApplicationSettingsRequest\nWriteAttributes\nWriteBufferSize\nWriteCampaignRequest\nWriteCapacityUnits\nWriteDashManifest\nWriteEventStream\nWriteGetObjectResponseRequest\nWriteHeader\nWriteHlsManifest\nWriteIOs\nWriteJourneyRequest\nWriteManifest\nWriteMp4PackagingType\nWriteOperation\nWriteOperations\nWriteRecordsRequest\nWriteRecordsResponse\nWriteRequest\nWriteSegmentRequest\nWriteSegmentTimelineInRepresentation\nWriteTreatmentResource\nWriterVersion\nX\nXAttributeName\nXAxis\nXAxisDisplayOptions\nXAxisLabelOptions\nXAxisLocation\nXMLClassifier\nXPosition\nXRayErrorPercent\nXRayFaultPercent\nXRayNodeName\nXRayNodeType\nXRayRequestAverageLatency\nXRayRequestCount\nXRayThrottlePercent\nXSSProtection\nXavc4kIntraCbgProfileSettings\nXavc4kIntraVbrProfileSettings\nXavc4kProfileSettings\nXavcClass\nXavcHdIntraCbgProfileSettings\nXavcHdProfileSettings\nXavcProfileSettings\nXavcSettings\nXksKeyAlreadyInUseException\nXksKeyConfiguration\nXksKeyConfigurationType\nXksKeyId\nXksKeyInvalidConfigurationException\nXksKeyNotFoundException\nXksProxyAuthenticationCredential\nXksProxyAuthenticationCredentialType\nXksProxyConfiguration\nXksProxyConfigurationType\nXksProxyConnectivity\nXksProxyIncorrectAuthenticationCredentialException\nXksProxyInvalidConfigurationException\nXksProxyInvalidResponseException\nXksProxyUriEndpoint\nXksProxyUriEndpointInUseException\nXksProxyUriInUseException\nXksProxyUriPath\nXksProxyUriUnreachableException\nXksProxyVpcEndpointServiceInUseException\nXksProxyVpcEndpointServiceInvalidConfigurationException\nXksProxyVpcEndpointServiceName\nXksProxyVpcEndpointServiceNotFoundException\nXrayEnabled\nXssMatchSet\nXssMatchSetId\nXssMatchSetSummary\nXssMatchSetUpdate\nXssMatchSets\nXssMatchStatement\nXssMatchTuple\nXssMatchTuples\nY\nYAttributeName\nYAxis\nYAxisDisplayOptions\nYAxisLabelOptions\nYAxisLocation\nYPosition\nYarnEndpointAddress\nYaw\nYears\nYesVoteCount\nZ\nZendesk\nZendeskConnectorProfileCredentials\nZendeskConnectorProfileProperties\nZendeskDestinationProperties\nZendeskMetadata\nZendeskSourceProperties\nZeppelinApplicationConfiguration\nZeppelinApplicationConfigurationDescription\nZeppelinApplicationConfigurationUpdate\nZeppelinMonitoringConfiguration\nZeppelinMonitoringConfigurationDescription\nZeppelinMonitoringConfigurationUpdate\nZeppelinRemoteSparkInterpreterPort\nZipCode\nZipFile\nZipFileContent\nZipFileContentUpdate\nZonalShift\nZonalShiftInResource\nZonalShiftSummary\nZonalStatisticsConfigInput\nZone\nZoneAwarenessConfig\nZoneAwarenessEnabled\nZoneId\nZoneIdentity\nZoneIds\nZoneName\nZoneNames\nZoneS3Path\nZoneS3PathKmsKeyId\nZoneStatus\nZoneType\nZookeeperConnectString\nZookeeperConnectStringTls\nZookeeperId\nZookeeperNodeInfo\nZookeeperVersion\nabandon\nabilities\nableToUpdateBundle\nabortConfig\nabortCriteriaList\nabortStatement\naborted\naboutText\nabsolutePath\nacceleratorHealth\nacceleratorId\nacceleratorIds\nacceleratorSet\nacceleratorType\nacceleratorTypeName\nacceleratorTypeOfferings\nacceleratorTypes\naccelerators\naccept\nacceptDate\nacceptRanges\nacceptedAt\nacceptedBy\nacceptedFileTypes\nacceptedMediaTypes\nacceptedQueryCount\naccepteeId\naccepts\naccess\naccessControlList\naccessDetails\naccessDirection\naccessFrom\naccessKey\naccessKeyId\naccessKeys\naccessLevel\naccessLog\naccessLogConfig\naccessLogSettings\naccessLogSubscriptionIdentifier\naccessPoint\naccessPointAccount\naccessPointArn\naccessPointId\naccessPointPolicy\naccessPoints\naccessPolicy\naccessPolicyArn\naccessPolicyCreationDate\naccessPolicyDetail\naccessPolicyId\naccessPolicyIdentity\naccessPolicyLastUpdateDate\naccessPolicyPermission\naccessPolicyResource\naccessPolicySummaries\naccessPreview\naccessPreviewId\naccessPreviews\naccessRole\naccessRules\naccessToken\naccessTokenId\naccessType\naccessTypes\naccount\naccountAccessType\naccountAggregation\naccountAlias\naccountEnrollmentStatuses\naccountID\naccountId\naccountIdentifiers\naccountIds\naccountLevelBpaSync\naccountLevelPermissions\naccountList\naccountName\naccountPolicies\naccountPolicy\naccountSettings\naccountSettingsDetail\naccountStatus\naccountType\naccounts\naccountsCleanup\naccountsWithProvisionedRestoreAccess\naccountsWithRestoreAccess\nachievableRpoInSecs\nachievableRtoInSecs\nacknowledgeActionConfiguration\nacknowledgeActionRequests\nacknowledgeFlow\nacknowledgment\nacknowledgmentStatus\naction\nactionArn\nactionCode\nactionConfiguration\nactionConfigurationProperties\nactionExecutionDetails\nactionExecutionId\nactionGroup\nactionID\nactionIDs\nactionId\nactionIdentifiers\nactionIds\nactionName\nactionOnTimeout\nactionOwnerFilter\nactionParams\nactionPlanInstructions\nactionPlanTitle\nactionRevision\nactionStates\nactionStatus\nactionTaken\nactionType\nactionTypeId\nactionTypes\nactionVersion\nactions\nactionsDefinition\nactionsExecuted\nactionsExecutions\nactionsFailed\nactionsSkipped\nactivateCaseSensitiveIdentifier\nactivateDeepInspection\nactivationCode\nactivationExpiry\nactivationId\nactivationJobs\nactive\nactiveAgentlessCollectors\nactiveAgents\nactiveAssessmentsCount\nactiveConnectors\nactiveContexts\nactiveDirectory\nactiveDirectoryUser\nactiveExperimentCount\nactiveFromTimestamp\nactiveJobId\nactiveLaunchCount\nactiveMeCollectors\nactiveNames\nactiveServicesCount\nactiveSessionId\nactiveUntilTimestamp\nactiveViolations\nactivities\nactivityArn\nactivityFailedEventDetails\nactivityId\nactivityScheduleFailedEventDetails\nactivityScheduledEventDetails\nactivityStartedEventDetails\nactivitySucceededEventDetails\nactivityTaskCancelRequestedEventAttributes\nactivityTaskCanceledEventAttributes\nactivityTaskCompletedEventAttributes\nactivityTaskFailedEventAttributes\nactivityTaskScheduledEventAttributes\nactivityTaskStartedEventAttributes\nactivityTaskTimedOutEventAttributes\nactivityTimedOutEventDetails\nactivityType\nactor\nactorArn\nactualAgentPrompt\nactualCapacity\nactualElicitedSlot\nactualIncrementalBackupSizeInMegaBytes\nactualIntent\nactualOutput\nactualReferenceId\nactualValue\nadd\naddAllowedPrefixesToDirectConnectGateway\naddAttributes\naddColumns\naddGroupOwner\naddMetrics\naddOnRequest\naddOnType\naddOns\naddOrUpdateLabels\naddOrUpdateTaints\naddOrUpdateVariations\naddSecurityGroupIds\naddSubnetIds\naddThingsToThingGroupParams\naddedToServiceDateTime\nadditionalAllowedHeaders\nadditionalAttributeNames\nadditionalAuthenticationProviders\nadditionalContext\nadditionalData\nadditionalDeploymentStatusInfo\nadditionalEncryptionContext\nadditionalExposedHeaders\nadditionalFixedProperties\nadditionalInfo\nadditionalInstanceConfiguration\nadditionalMessage\nadditionalMetricsToRetain\nadditionalMetricsToRetainV2\nadditionalOccurrences\nadditionalParameters\nadditionalParamsForNs\nadditionalTransientProperties\naddon\naddonArn\naddonName\naddonVersion\naddonVersions\naddons\naddress\naddressFamily\nadds\nadjustedCvss\nadjustments\nadmin\nadminAccountId\nadminAccounts\nadminRoleArn\nadminUserName\nadminUserPassword\nadminUsername\nadministrator\nadministratorAccount\nadministratorAccountId\nadr\nadsApplicationConfigurationId\nadsApplicationConfigurationName\nadsApplicationName\nadvancedRecognitionSetting\naffectedAccounts\naffectedImages\naffectedInstances\nafterBlob\nafterBlobId\nafterCommitId\nafterCommitSpecifier\nafterPath\nafterTime\nagent\nagentConnected\nagentCpuCores\nagentDetails\nagentHash\nagentHealth\nagentHealthCode\nagentHealthCodes\nagentHealthDetails\nagentHealths\nagentId\nagentIds\nagentLastSeenByServiceDateTime\nagentNetworkInfoList\nagentOrchestrationConfig\nagentParameters\nagentPreviews\nagentProfile\nagentPrompt\nagentStatus\nagentSummary\nagentTurn\nagentType\nagentUpdateStatus\nagentVersion\nagentlessCollectorSummary\nagents\nagentsConfigurationStatus\nagentsInfo\nagentsTruncated\naggregateColumns\naggregateField\naggregateStatus\naggregateTypes\naggregateValue\naggregatedUtterancesSummaries\naggregatedValues\naggregatedVariablesImpactExplanations\naggregatedVariablesImportance\naggregatedVariablesImportanceMetrics\naggregationConfig\naggregationDuration\naggregationField\naggregationLastRefreshedDateTime\naggregationRequest\naggregationType\naggregationWindowEndTime\naggregationWindowStartTime\nagreementName\nagreements\nalarm\nalarmActions\nalarmCapabilities\nalarmConfiguration\nalarmEventActions\nalarmModelArn\nalarmModelDescription\nalarmModelName\nalarmModelSummaries\nalarmModelVersion\nalarmModelVersionSummaries\nalarmName\nalarmNames\nalarmNotification\nalarmRecommendations\nalarmRoleArn\nalarmRule\nalarmState\nalarmSummaries\nalarms\nalertManagerDefinition\nalertTargetArn\nalertTargets\nalerts\nalgorithm\nalgorithmArn\nalgorithmHyperParameterRanges\nalgorithmHyperParameters\nalgorithmImage\nalgorithmSpecification\nalias\naliasPrefix\naliases\nalignment\nall\nallColumns\nallMatchesCount\nallMatchesSum\nallRegions\nallSupported\nallocationStrategy\nallowAudioInput\nallowAuthorizerOverride\nallowAutoRegistration\nallowCleartext\nallowConstraintErrors\nallowDTMFInput\nallowDuplicates\nallowExternalPrincipals\nallowFleet\nallowImageBuilder\nallowInterrupt\nallowJoinsOnColumnsWithDifferentNames\nallowListIds\nallowLists\nallowMultipleValues\nallowOrganizationMemberAccount\nallowOverwrite\nallowPublicOverrides\nallowed\nallowedAccounts\nallowedAnalyses\nallowedAnalysisProviders\nallowedColumns\nallowedHTTPMethods\nallowedInputTypes\nallowedJoinOperators\nallowedOrganizations\nallowedPrefixesToDirectConnectGateway\nallowedValues\nallowlist\nallowsHostedConnections\nallowsPublicReadAccess\nallowsPublicWriteAccess\nallowsUnencryptedObjectUploads\nalreadyImplemented\nalternateKeys\nalternativeDomainNames\nalternativeIntents\namazonAddress\namazonSideAsn\nami\namiDistributionConfiguration\namiId\namiLaunchIndex\namiTags\namiType\namis\namount\namznErrorType\nanalysisCompleteTime\nanalysisId\nanalysisMethod\nanalysisParameters\nanalysisResults\nanalysisRule\nanalysisRulePolicy\nanalysisRuleType\nanalysisRuleTypes\nanalysisStatus\nanalysisTemplate\nanalysisTemplateArn\nanalysisTemplateArns\nanalysisTemplateIdentifier\nanalysisTemplateSummaries\nanalysisType\nanalyzedAt\nanalyzedResources\nanalyzer\nanalyzerArn\nanalyzerName\nanalyzers\nanchor\nand\nandroidPaths\nannotationFields\nannotationImportJobs\nannotationStoreVersions\nannotationStores\nannotationType\nanomalies\nanomalyInstanceId\nanswerMachineDetectionConfig\nantennaUplinkConfigArn\nantiPatternReportS3Object\nantipatternReportResultList\nantipatternReportS3Object\nantipatternReportStatus\nantipatternReportStatusMessage\napacheKafkaCluster\napi\napiAccess\napiAccessPrincipalArn\napiAssociation\napiCache\napiCachingBehavior\napiCallDateTime\napiCallDetails\napiConfiguration\napiId\napiKey\napiKeyRequired\napiKeySource\napiKeyVersion\napiKeys\napiMode\napiSecretKey\napiServiceName\napiStages\napiSummary\napiToken\napiType\napiVersion\napp\nappArn\nappAuthorization\nappAuthorizationArn\nappAuthorizationIdentifier\nappAuthorizationSummary\nappAuthorizationSummaryList\nappBundle\nappBundleArn\nappBundleIdentifier\nappBundleSummaryList\nappCategory\nappComponent\nappComponentName\nappComponentNames\nappComponents\nappConfigResource\nappId\nappIdClientRegex\nappIds\nappInputSource\nappInputSources\nappIntegrationArn\nappPackagesCleanup\nappProtocol\nappRegistryAppName\nappRegistryAppNames\nappSpecContent\nappSummaries\nappSummary\nappTemplateBody\nappType\nappUnitError\nappUnitErrorCategory\nappUpload\nappValidationConfigurations\nappValidationOutput\nappValidationStrategy\nappVersion\nappVersions\napplication\napplicationAggregatedStatus\napplicationArn\napplicationCallBackURL\napplicationComponentCriteria\napplicationComponentDetail\napplicationComponentId\napplicationComponentInfos\napplicationComponentStrategies\napplicationComponentStrategySummary\napplicationConfiguration\napplicationConfigurationId\napplicationCreationDate\napplicationDescription\napplicationHostUrl\napplicationID\napplicationIDs\napplicationId\napplicationImportFailure\napplicationImportSuccess\napplicationKey\napplicationLastUpdateDate\napplicationMode\napplicationName\napplicationNames\napplicationPermissions\napplicationPort\napplicationPreferences\napplicationServicePath\napplicationState\napplicationSummaries\napplicationType\napplicationUrl\napplicationVersion\napplicationVersions\napplications\napplicationsCount\napplicationsInfo\nappliedRulePriority\nappliedScanFilters\nappliedStatus\nappliedWeights\napplyDuringMaintenanceWindow\napplyImmediately\napplyMethod\napplyNormalization\napplyType\napprovalRule\napprovalRuleContent\napprovalRuleEventMetadata\napprovalRuleId\napprovalRuleName\napprovalRuleOverriddenEventMetadata\napprovalRuleTemplate\napprovalRuleTemplateContent\napprovalRuleTemplateDescription\napprovalRuleTemplateId\napprovalRuleTemplateName\napprovalRuleTemplateNames\napprovalRules\napprovalRulesNotSatisfied\napprovalRulesSatisfied\napprovalState\napprovalStateChangedEventMetadata\napprovalStatus\napprovals\napproved\napprovedAt\napproximateNumberOfObjectsToProcess\napproximateSecondsBeforeTimedOut\napps\nappsyncDomainName\narch\narchitecture\narchitectures\narchiveDescription\narchiveId\narchiveRule\narchiveRules\narchiveSize\narchived\nargs\narguments\narn\narns\narrayBaseColumnType\narrayJobId\narrayProperties\nartifactCredentials\nartifactFileName\nartifactId\nartifactIdentifier\nartifactMediaType\nartifactName\nartifactRevisions\nartifactStore\nartifactStores\nartifactUrl\nartifacts\nartifactsOverride\nartifactsUrl\nasOfTimestamp\nascendingOrder\nasi\nasn\nasnOrg\nassertionAttributes\nassessment\nassessmentArn\nassessmentControlsCountByNoncompliantEvidence\nassessmentDescription\nassessmentFrameworkShareRequest\nassessmentFrameworkShareRequests\nassessmentId\nassessmentMetadata\nassessmentName\nassessmentReport\nassessmentReportEvidenceCount\nassessmentReportId\nassessmentReportSelection\nassessmentReportSelectionCount\nassessmentReports\nassessmentReportsDestination\nassessmentRunAgents\nassessmentRunArn\nassessmentRunArns\nassessmentRunArnsTruncated\nassessmentRunCount\nassessmentRunName\nassessmentRuns\nassessmentSchedule\nassessmentStatus\nassessmentSummaries\nassessmentSummary\nassessmentTargetArn\nassessmentTargetArns\nassessmentTargetName\nassessmentTargetNamePattern\nassessmentTargets\nassessmentTemplateArn\nassessmentTemplateArns\nassessmentTemplateName\nassessmentTemplates\nasset\nassetArn\nassetAttributes\nassetCompositeModelId\nassetCompositeModels\nassetContent\nassetCreationDate\nassetDescription\nassetHierarchies\nassetId\nassetIds\nassetLastUpdateDate\nassetModelArn\nassetModelCompositeModelId\nassetModelCompositeModels\nassetModelCreationDate\nassetModelDescription\nassetModelHierarchies\nassetModelId\nassetModelLastUpdateDate\nassetModelName\nassetModelProperties\nassetModelPropertySummaries\nassetModelStatus\nassetModelSummaries\nassetName\nassetProperties\nassetProperty\nassetPropertySummaries\nassetPropertyValue\nassetPropertyValueHistory\nassetRelationshipSummaries\nassetSHA256\nassetSizeBytes\nassetStatus\nassetSummaries\nassetType\nassets\nassignPublicIp\nassignedLabel\nassignedValue\nassistant\nassistantArn\nassistantAssociation\nassistantAssociationArn\nassistantAssociationId\nassistantAssociationSummaries\nassistantId\nassistantSummaries\nassociateDefaultSecurityGroup\nassociatePublicIpAddress\nassociatedApplications\nassociatedAt\nassociatedClientDevices\nassociatedEntity\nassociatedFields\nassociatedGateway\nassociatedGatewayId\nassociatedGatewayOwnerAccount\nassociatedIntentName\nassociatedOn\nassociatedPortalArns\nassociatedRepositoryNames\nassociatedResourceCount\nassociatedResources\nassociatedS3Resources\nassociatedServerId\nassociatedServerIds\nassociatedSlotName\nassociatedTranscripts\nassociatedTranscriptsPassword\nassociatedTranscriptsUrl\nassociatedWithJob\nassociation\nassociationArn\nassociationBehavior\nassociationData\nassociationId\nassociationState\nassociationStatus\nassociationTime\nassociationTimestamp\nassociationType\nassumedRole\natBlockchainInstant\natRestEncryptionEnabled\nati\natigData\natodr\nattachTime\nattachedDiskMapping\nattachedObjectIdentifier\nattachedResource\nattachedTo\nattachment\nattachmentArn\nattachmentId\nattachmentLinkUrl\nattachmentNetworkAclConfiguration\nattachmentSet\nattachmentSetId\nattachmentState\nattachmentType\nattachments\nattachmentsStatus\nattemptDurationSeconds\nattemptId\nattempts\nattribute\nattributeGroup\nattributeGroupArn\nattributeGroups\nattributeGroupsDetails\nattributeKeys\nattributeMap\nattributeMatchingModel\nattributeName\nattributePartition\nattributePayload\nattributeResults\nattributeUpdateMode\nattributeValue\nattributes\nauc\naudio\naudioAndDTMFInputSpecification\naudioChunk\naudioFileS3Location\naudioInput\naudioLogSettings\naudioRecognitionStrategy\naudioSpecification\naudioStream\naudioVoiceDurationMillis\nauditCheckConfigurations\nauditCheckToActionsMapping\nauditCheckToReasonCodeFilter\nauditDetails\nauditEvents\nauditNotificationTargetConfigurations\nauditResults\nauditTaskId\nauth\nauthCode\nauthCodeUrl\nauthCodeUrls\nauthDecision\nauthDefinition\nauthInfo\nauthInfos\nauthKey\nauthParameters\nauthRequest\nauthResults\nauthTTL\nauthType\nauthUrl\nauthentication\nauthenticationConfig\nauthenticationConfiguration\nauthenticationMethod\nauthenticationProviders\nauthenticationType\nauthor\nauthorArn\nauthorName\nauthorization\nauthorizationApiKeyName\nauthorizationApiKeyValue\nauthorizationConfig\nauthorizationData\nauthorizationEndpoint\nauthorizationScopes\nauthorizationToken\nauthorizationType\nauthorized\nauthorizerArn\nauthorizerConfig\nauthorizerCredentials\nauthorizerDescription\nauthorizerFunctionArn\nauthorizerId\nauthorizerName\nauthorizerResultTtlInSeconds\nauthorizerUri\nauthorizers\nautoBranchCreationConfig\nautoBranchCreationPatterns\nautoCompute\nautoEnable\nautoEnableNewAccount\nautoGenerateForms\nautoLaunch\nautoMLConfig\nautoMLResult\nautoMountStatus\nautoMounting\nautoRegistrationStatus\nautoReplicateNewDisks\nautoResolve\nautoRollbackConfiguration\nautoRollbackEnabled\nautoScaling\nautoScalingConfiguration\nautoScalingGroup\nautoScalingGroupArn\nautoScalingGroupArns\nautoScalingGroupName\nautoScalingGroupProvider\nautoScalingGroupRecommendations\nautoScalingGroups\nautoScalingMetric\nautoSnapshotAddOnRequest\nautoSnapshots\nautoStartConfiguration\nautoStopConfiguration\nautoSubDomainCreationPatterns\nautoSubDomainIAMRole\nautoUpdate\nautoUpdateOutdatedInstancesDeploymentIds\nautoUpdateOutdatedInstancesRootDeploymentId\nautomatedDiscoveryFreeTrialStartDate\nautomaticRenewal\nautomaticStopTimeMinutes\nautomaticTerminationMode\nautomationExecutions\nautoprovision\nautotrack\nauxiliaryApps\navailability\navailabilityZone\navailabilityZoneId\navailabilityZoneIds\navailabilityZones\navailable\navailableMacSecPortSpeeds\navailablePlatforms\navailablePortSpeeds\navailableProviders\navcLevel\navcProfile\naverage\nawayFrom\nawsAccount\nawsAccountId\nawsAccountIds\nawsAccountName\nawsAccountNumber\nawsAccounts\nawsDevice\nawsDeviceV2\nawsEc2Instance\nawsEcrContainerImage\nawsGroundStationAgentEndpoint\nawsIamConfig\nawsInstanceID\nawsIotJobArn\nawsIotJobId\nawsIotSqlVersion\nawsJobAbortConfig\nawsJobExecutionsRolloutConfig\nawsJobPresignedUrlConfig\nawsJobTimeoutConfig\nawsLambdaFunction\nawsLogicalDeviceId\nawsOrganization\nawsRegion\nawsSecretStoreArn\nawsService\nawsServices\nawsSignerJobId\nawsSso\nawsvpcConfiguration\nazMode\nbackendDefaults\nbackendEnvironment\nbackendEnvironmentArn\nbackendEnvironments\nbackends\nbackfillStatus\nbackloggedStorageBytes\nbackupId\nbackupMode\nbackupProgressInMegaBytes\nbackupRetentionEnabled\nbadge\nbadgeEnabled\nbadgeRequestUrl\nbalance\nbandwidth\nbandwidthAllocation\nbandwidthThrottling\nbase\nbaseCapacity\nbaseCommitId\nbaseConfigurationItems\nbaseEjectionDuration\nbaseModelArn\nbaseModelArnEquals\nbaseModelIdentifier\nbaseModelName\nbasePath\nbaseProcessingInstanceType\nbaseProcessingInstanceVolumeSizeInGB\nbaseProcessingJob\nbaseRatePerMinute\nbaseScore\nbaseStat\nbaseTableTTL\nbasic\nbasicAuthCredentials\nbatch\nbatchDeleteDetectorErrorEntries\nbatchImports\nbatchInferenceJob\nbatchInferenceJobArn\nbatchInferenceJobConfig\nbatchInferenceJobs\nbatchItemId\nbatchJobDefinitions\nbatchJobExecutions\nbatchJobIdentifier\nbatchMode\nbatchPolicy\nbatchPredictions\nbatchPutMessageErrorEntries\nbatchReportMode\nbatchSegmentJob\nbatchSegmentJobArn\nbatchSegmentJobs\nbatchSize\nbatchUpdateDetectorErrorEntries\nbeforeBlob\nbeforeBlobId\nbeforeCommitId\nbeforeCommitSpecifier\nbeforePath\nbeforeTime\nbegin\nbeginDate\nbeginInclusive\nbeginOffsetInclusive\nbehavior\nbehaviorCriteriaType\nbehaviorName\nbehaviors\nbehindMajor\nbehindMinor\nbelongsToFieldOnRelatedModel\nbestRecipeArn\nbgpPeerId\nbgpPeerState\nbgpPeers\nbgpStatus\nbidPercentage\nbillableDuration\nbillableEntityCount\nbilledDurationInMilliseconds\nbilledMemoryUsedInMB\nbilledResourceUtilization\nbillingDetails\nbillingGroupArn\nbillingGroupDescription\nbillingGroupId\nbillingGroupMetadata\nbillingGroupName\nbillingGroupProperties\nbillingGroups\nbillingMethod\nbillingMinutes\nbinBy\nbinKeys\nbinaryMediaTypes\nbindIP\nbindingEvent\nbindingProperties\nbindings\nbitMaskLength\nbitRightShift\nblackListedAgents\nblackListedConnectors\nblobId\nblockDeviceMappings\nblockHash\nblockNumber\nblockPublicAccess\nblockPublicAcls\nblockPublicPolicy\nblockers\nblocklist\nblocksize\nblueGreenDeploymentConfiguration\nblueprintId\nblueprintName\nblueprints\nbluetooth\nbody\nbooleanValue\nbootMode\nbootstrapServers\nbotAlias\nbotAliasHistoryEvents\nbotAliasId\nbotAliasLocaleSettings\nbotAliasName\nbotAliasStatus\nbotAliasSummaries\nbotAliasTarget\nbotChannelAssociations\nbotConfiguration\nbotExportSpecification\nbotId\nbotImportSpecification\nbotLocaleExportPassword\nbotLocaleExportSpecification\nbotLocaleExportUrl\nbotLocaleHistoryEvents\nbotLocaleImportSpecification\nbotLocaleStatus\nbotLocaleSummaries\nbotMemberAliasId\nbotMemberAliasName\nbotMemberId\nbotMemberName\nbotMemberVersion\nbotMembers\nbotName\nbotRecommendationId\nbotRecommendationResults\nbotRecommendationStatus\nbotRecommendationSummaries\nbotResponseAudioVoiceId\nbotResponses\nbotStatus\nbotSummaries\nbotTags\nbotType\nbotVersion\nbotVersionLocaleSpecification\nbotVersionSummaries\nbotVersions\nbots\nbpaImpactsLightsail\nbranch\nbranchArn\nbranchCoveragePercentage\nbranchFilter\nbranchName\nbranches\nbranchesCovered\nbranchesMissed\nbreachAction\nbreakingChanges\nbrowserPolicy\nbrowserSettings\nbrowserSettingsArn\nbrowserType\nbucket\nbucketAclGrants\nbucketArn\nbucketCount\nbucketCountByEffectivePermission\nbucketCountByEncryptionType\nbucketCountByObjectEncryptionRequirement\nbucketCountBySharedAccessType\nbucketCreatedAt\nbucketCriteria\nbucketDefinitions\nbucketKey\nbucketLevelPermissions\nbucketName\nbucketNames\nbucketOwner\nbucketOwnerAccess\nbucketPolicy\nbucketPrefix\nbucketPublicAccessBlock\nbucketStatisticsBySensitivity\nbuckets\nbucketsAggregationType\nbuild\nbuildBatch\nbuildBatchArn\nbuildBatchConfig\nbuildBatchConfigOverride\nbuildBatchNumber\nbuildBatchStatus\nbuildBatches\nbuildBatchesNotFound\nbuildComplete\nbuildGroups\nbuildNumber\nbuildSpec\nbuildStatus\nbuildStatusConfig\nbuildStatusConfigOverride\nbuildTimeoutInMinutes\nbuildTimeoutInMinutesOverride\nbuildType\nbuilds\nbuildsDeleted\nbuildsNotDeleted\nbuildsNotFound\nbuildspec\nbuildspecOverride\nbuiltInIntentSummaries\nbuiltInSlotTypeSummaries\nbundleId\nbundleInformation\nbundleList\nbundleNames\nbundleType\nbundles\nburstLimit\nbusinessGoals\nbusinessUnitId\nbuttons\nbyCustomizationType\nbyInferenceType\nbyName\nbyOutputModality\nbyProvider\nbyteBuffer\nbyteLength\nbytes\nbytesProcessed\nbytesReceived\nbytesScanned\nbytesSent\nbytesWritten\ncaCertificate\ncaCertificateId\ncaCertificateIdentifier\ncaCertificatePem\ncache\ncacheAtStartup\ncacheBehaviorSettings\ncacheBehaviors\ncacheClusterEnabled\ncacheClusterSize\ncacheClusterStatus\ncacheConfigurations\ncacheDataEncrypted\ncacheKeyParameters\ncacheNamespace\ncacheOverride\ncacheStorageConfigurations\ncacheTtlInSeconds\ncacheType\ncachedHTTPMethods\ncachingConfig\ncachingEnabled\ncachingKeys\ncak\ncallbackOverrides\ncallerReactions\ncampaign\ncampaignArn\ncampaignConfig\ncampaignId\ncampaignIds\ncampaignName\ncampaignSummaries\ncampaignSummaryList\ncampaigns\ncanDbcFiles\ncanInterface\ncanRetry\ncanSignal\ncanUnlinkAssociatedModel\ncanUpdateImage\ncanUseAsDestination\ncanUseAsSource\ncanaryInterval\ncanaryPercentage\ncanarySettings\ncancel\ncancelActive\ncancelRequested\ncancelTimerDecisionAttributes\ncancelTimerFailedEventAttributes\ncancelWorkflowExecutionDecisionAttributes\ncancelWorkflowExecutionFailedEventAttributes\ncanceled\ncanceledChecks\ncanceledFindingsCount\ncancellationStatus\ncancelled\ncannedAcl\ncapabilities\ncapabilityArn\ncapabilityArns\ncapabilityConfiguration\ncapabilityList\ncapabilityNamespace\ncapabilitySyncStatus\ncapacity\ncapacityConfiguration\ncapacityId\ncapacityLimits\ncapacityProvider\ncapacityProviderArn\ncapacityProviderName\ncapacityProviderStrategy\ncapacityProviders\ncapacitySpecification\ncapacitySpecificationOverride\ncapacityType\ncaptureConditional\ncaptureNextStep\ncaptureResponse\ncardinality\ncarrier\ncaseArn\ncaseData\ncaseId\ncaseIdList\ncaseSensitive\ncases\ncatalogData\ncatalogType\ncategoricalHyperParameterRanges\ncategories\ncategoriesWithMostFindings\ncategory\ncategoryCode\ncategoryName\ncategorySpecificSummary\ncause\ncausedBy\ncausedByEventId\nccEmailAddresses\ncellReference\ncells\ncellsToCreate\ncellsToUpdate\ncenterFrequency\ncertKey\ncertificate\ncertificateAlternativeNames\ncertificateArn\ncertificateAuthority\ncertificateAuthorityArn\ncertificateAuthorityArns\ncertificateBody\ncertificateChain\ncertificateData\ncertificateDescription\ncertificateDetail\ncertificateDomainName\ncertificateHashes\ncertificateId\ncertificateList\ncertificateMode\ncertificateName\ncertificateOverride\ncertificatePathOnDevice\ncertificatePem\ncertificatePrivateKey\ncertificateSigningRequest\ncertificateStatuses\ncertificateUploadDate\ncertificateVerificationDNSRecord\ncertificates\ncertificatesToAdd\ncertificatesToDelete\ncfnStackName\nchange\nchangeDescription\nchangeIdentifier\nchangeLogs\nchangeRequests\nchangeType\nchangesetArn\nchangesetFormat\nchangesetId\nchangesets\nchannel\nchannelArn\nchannelId\nchannelMessages\nchannelName\nchannelRoleArn\nchannelStorage\nchannelSummaries\nchannels\nchatChannel\ncheckCompliant\ncheckId\ncheckIds\ncheckName\ncheckRunStatus\ncheckpointConfig\ncheckpointLabel\ncheckpointLabelFilter\nchecks\nchecksum\nchildAssetId\nchildAssetModelId\nchildConnectionTags\nchildDirected\nchildPolicy\nchildWorkflowExecutionCanceledEventAttributes\nchildWorkflowExecutionCompletedEventAttributes\nchildWorkflowExecutionFailedEventAttributes\nchildWorkflowExecutionStartedEventAttributes\nchildWorkflowExecutionTerminatedEventAttributes\nchildWorkflowExecutionTimedOutEventAttributes\nchildren\nchop\nchronologicalOrder\ncidr\ncidrBlock\ncidrListAliases\ncidrs\nciphers\nciphertext\ncisaData\ncity\nckn\nclaims\nclarificationPrompt\nclassName\nclasses\nclassifiableObjectCount\nclassifiableSizeInBytes\nclassification\nclassificationDetails\nclassificationError\nclassificationResultStatus\nclassificationScopeId\nclassificationScopes\nclassificationType\nclassificationTypeUpdate\nclean\nclear\nclearMaxDevices\nclearResiliencyPolicyArn\nclearTimer\nclientAliases\nclientCertificateId\nclientCredentialsArn\nclientId\nclientIdIssuedAt\nclientIds\nclientMode\nclientName\nclientNumber\nclientPolicy\nclientProperties\nclientRequestToken\nclientSecret\nclientSecretExpiresAt\nclientSideTimestamps\nclientStatus\nclientTimestampMillis\nclientToken\nclientType\nclipboardMode\nclock\ncloneFrom\ncloneUrlHttp\ncloneUrlSsh\ncloseStatus\ncloseStatusFilter\ncloseTimeFilter\ncloseTimestamp\nclosedFindings\nclosingResponse\ncloudFormationStackRecords\ncloudFormationTarget\ncloudMetricEnabled\ncloudTrailArn\ncloudTrailDetails\ncloudTrailProperties\ncloudWatch\ncloudWatchConfig\ncloudWatchEncryptionEnabled\ncloudWatchLogDelivery\ncloudWatchLogGroupArn\ncloudWatchLogGroupName\ncloudWatchLoggingConfiguration\ncloudWatchLogs\ncloudWatchLogsArn\ncloudWatchLogsConfiguration\ncloudWatchLogsLogGroup\ncloudWatchLogsRoleArn\ncloudWatchMonitoringConfiguration\ncloudwatchAlarm\ncloudwatchLogUrl\ncloudwatchLogs\ncloudwatchMetric\ncloudwatchRoleArn\ncluster\nclusterArn\nclusterArns\nclusterCreationTime\nclusterDescription\nclusterEndpoint\nclusterIdentifier\nclusterLogging\nclusterName\nclusterSecurityGroupId\nclusterType\nclusterVersion\nclusteringKeys\nclusters\ncode\ncodeArtifactId\ncodeCommit\ncodeCoverageSummary\ncodeCoverages\ncodeErrors\ncodeHook\ncodeHookInterfaceVersion\ncodeHookSpecification\ncodeSha256\ncodeSigning\ncodeSnippet\ncodeSnippetResults\ncodeVulnerabilityDetails\ncodeVulnerabilityDetectorName\ncodeVulnerabilityDetectorTags\ncodeVulnerabilityFilePath\ncodebuildRoleArn\ncodec\ncodegenJobToCreate\ncognitoIdentityPoolId\ncollaboration\ncollaborationAnalysisTemplate\ncollaborationAnalysisTemplateSummaries\ncollaborationAnalysisTemplates\ncollaborationArn\ncollaborationCreatorAccountId\ncollaborationCreatorDisplayName\ncollaborationId\ncollaborationIdentifier\ncollaborationList\ncollaborationName\ncollectionBindingProperties\ncollectionDetails\ncollectionEndpoint\ncollectionErrorDetails\ncollectionFilters\ncollectionProperties\ncollectionScheme\ncollectionStatus\ncollectionSummaries\ncollectorHealth\ncollectorId\ncollectorVersion\ncolumn\ncolumnCount\ncolumnDefault\ncolumnDescription\ncolumnDescriptions\ncolumnIds\ncolumnIndex\ncolumnMap\ncolumnMetadata\ncolumnName\ncolumnNames\ncolumns\ncombineArtifacts\ncommand\ncommandLineArguments\ncomment\ncommentBody\ncommentId\ncomments\ncommentsForComparedCommitData\ncommentsForPullRequestData\ncommit\ncommitId\ncommitIds\ncommitMessage\ncommitNum\ncommitSpecifier\ncommitTime\ncommitTimestampInMillis\ncommitment\ncommitmentConfiguration\ncommitmentDuration\ncommitmentExpirationTime\ncommitmentInformation\ncommitmentLength\ncommits\ncommitter\ncommonName\ncommunicationBody\ncommunicationTypes\ncommunications\ncompany\ncomparator\ncomparison\ncomparisonOperator\ncompatibilities\ncompatible\ncompatibleDevices\ncompatibleEnvironmentTemplates\ncompatibleNamespaceVersion\ncomplete\ncompleteTime\ncompleteWorkflowExecutionDecisionAttributes\ncompleteWorkflowExecutionFailedEventAttributes\ncompleted\ncompletedAt\ncompletedJobs\ncompletedOn\ncompletedSteps\ncompletedTime\ncompletionStatus\ncompletionTime\ncompletionTimeRange\ncompliance\ncomplianceCheck\ncomplianceDrifts\ncomplianceStatus\ncomplianceType\ncompliantChecks\ncompliantEvidenceCount\ncomponent\ncomponentArn\ncomponentBuildVersionArn\ncomponentCandidates\ncomponentCompliances\ncomponentDependencies\ncomponentId\ncomponentLambdaParameters\ncomponentName\ncomponentPlatforms\ncomponentRecommendations\ncomponentRoleArn\ncomponentState\ncomponentStatuses\ncomponentSummaryList\ncomponentToCreate\ncomponentType\ncomponentTypeId\ncomponentTypeName\ncomponentTypeSummaries\ncomponentUpdatePolicy\ncomponentUpdates\ncomponentVersion\ncomponentVersionArn\ncomponentVersionList\ncomponentVersions\ncomponents\ncompositeModel\ncompositeSlotTypeSetting\ncompressed\ncompression\ncompressionType\ncompute\ncomputeEnvironment\ncomputeEnvironmentArn\ncomputeEnvironmentName\ncomputeEnvironmentOrder\ncomputeEnvironments\ncomputeLocation\ncomputePlatform\ncomputeReservation\ncomputeResources\ncomputeType\ncomputeTypeOverride\ncomputeTypesAllowed\ncomputedDesiredCount\ncomputerAttributes\nconcat\nconclusionStatement\nconcurrentBuildLimit\nconcurrentDeploymentPercentage\ncondition\nconditionLanguageVersion\nconditional\nconditionalBranches\nconfidence\nconfidenceLevel\nconfig\nconfigArn\nconfigData\nconfigDetails\nconfigFileName\nconfigHistoryDeliveryInfo\nconfigId\nconfigList\nconfigParameters\nconfigRecommendations\nconfigSnapshotDeliveryInfo\nconfigSnapshotDeliveryProperties\nconfigSnapshotId\nconfigStreamDeliveryInfo\nconfigType\nconfigVersion\nconfiguration\nconfigurationId\nconfigurationIds\nconfigurationItemCaptureTime\nconfigurationItemMD5Hash\nconfigurationItemStatus\nconfigurationItems\nconfigurationOptions\nconfigurationOverrides\nconfigurationProfileId\nconfigurationProperties\nconfigurationSchema\nconfigurationStateId\nconfigurationStatus\nconfigurationSummary\nconfigurationType\nconfigurationUpdate\nconfigurationUrl\nconfigurationValidationPolicy\nconfigurationValues\nconfigurations\nconfigurationsDownloadUrl\nconfigureOnly\nconfigureScript\nconfigureScriptType\nconfigured\nconfiguredBy\nconfiguredTable\nconfiguredTableArn\nconfiguredTableAssociation\nconfiguredTableAssociationIdentifier\nconfiguredTableAssociationSummaries\nconfiguredTableId\nconfiguredTableIdentifier\nconfiguredTableSummaries\nconfirmationConditional\nconfirmationNextStep\nconfirmationPrompt\nconfirmationResponse\nconfirmationState\nconfirmationStatus\nconfirmationToken\nconfirmationUrl\nconflictDetailLevel\nconflictDetection\nconflictHandler\nconflictMetadata\nconflictMetadataList\nconflictResolution\nconflictResolutionStrategy\nconflicts\nconnectContactFlowId\nconnectInstanceConfig\nconnectInstanceId\nconnectInstanceOnboardingJobStatus\nconnectQueueId\nconnectSourcePhoneNumber\nconnected\nconnectedToSystemTime\nconnectionArn\nconnectionId\nconnectionMode\nconnectionName\nconnectionPool\nconnectionState\nconnectionType\nconnections\nconnectionsBandwidth\nconnectionsCount\nconnectivity\nconnectivityAt\nconnectivityInfo\nconnectorArn\nconnectorConfig\nconnectorConfiguration\nconnectorConfigurations\nconnectorDescription\nconnectorEntityFields\nconnectorEntityMap\nconnectorEntityName\nconnectorId\nconnectorLabel\nconnectorList\nconnectorMetadata\nconnectorModes\nconnectorName\nconnectorNamePrefix\nconnectorOperator\nconnectorOwner\nconnectorProfileArn\nconnectorProfileConfig\nconnectorProfileCredentials\nconnectorProfileDetails\nconnectorProfileName\nconnectorProfileNames\nconnectorProfileProperties\nconnectorProvisioningConfig\nconnectorProvisioningType\nconnectorRuntimeSettings\nconnectorState\nconnectorSummary\nconnectorSuppliedValueOptions\nconnectorSuppliedValues\nconnectorType\nconnectorTypes\nconnectorVersion\nconnectors\nconsecutiveDatapointsToAlarm\nconsecutiveDatapointsToClear\nconsoleUrl\nconstraints\ncontactArn\ncontactEndpoint\ncontactId\ncontactList\ncontactMethods\ncontactPostPassDurationSeconds\ncontactPrePassDurationSeconds\ncontactProtocols\ncontactStatus\ncontainer\ncontainerAction\ncontainerArn\ncontainerConfigurations\ncontainerDefinitions\ncontainerDistributionConfiguration\ncontainerImage\ncontainerImages\ncontainerInstance\ncontainerInstanceArn\ncontainerInstanceArns\ncontainerInstances\ncontainerLogRotationConfiguration\ncontainerName\ncontainerOrchestrationType\ncontainerOverrides\ncontainerParams\ncontainerPath\ncontainerPort\ncontainerPortRange\ncontainerProperties\ncontainerProvider\ncontainerProviderId\ncontainerProviderType\ncontainerRecipe\ncontainerRecipeArn\ncontainerRecipeSummaryList\ncontainerRecommendations\ncontainerService\ncontainerServiceName\ncontainerServices\ncontainerTags\ncontainerType\ncontainers\ncontains\ncontainsDataFromDeletedResources\ncontent\ncontentArn\ncontentConflict\ncontentDeliveryRules\ncontentDisposition\ncontentEncoding\ncontentExpression\ncontentHandling\ncontentId\ncontentLength\ncontentLocation\ncontentRange\ncontentReference\ncontentSummaries\ncontentSummary\ncontentType\ncontents\ncontext\ncontextAttributes\ncontextRowId\ncontexts\ncontinentCode\ncontinuationToken\ncontinueAfterTimeout\ncontinueAsNewWorkflowExecutionDecisionAttributes\ncontinueAsNewWorkflowExecutionFailedEventAttributes\ncontinueResponse\ncontinuedExecutionRunId\ncontinuous\ncontinuousHyperParameterRanges\ncontractAddress\ncontrol\ncontrolDomainId\ncontrolDomainInsights\ncontrolId\ncontrolIdentifier\ncontrolInsightsByAssessment\ncontrolInsightsMetadata\ncontrolMappingSources\ncontrolMetadataList\ncontrolName\ncontrolOperation\ncontrolPlaneInstanceType\ncontrolPlanePlacement\ncontrolSet\ncontrolSetId\ncontrolSetName\ncontrolSets\ncontrolSetsCount\ncontrolSources\ncontrolStatus\ncontrolTreatmentName\ncontrolType\ncontrols\ncontrolsCount\ncontrolsCountByNoncompliantEvidence\nconversationDurationSeconds\nconversationEndState\nconversationEndTime\nconversationId\nconversationLevelResult\nconversationLevelTestResults\nconversationLevelTestResultsFilterBy\nconversationLogSettings\nconversationLogs\nconversationLogsDataSource\nconversationMode\nconversationStartTime\nconversionProperties\nconversionServerID\ncookieSynchronizationConfiguration\ncookiesAllowList\ncopyAllowed\ncopyImageSetInformation\ncopyPrivateIp\ncopyTags\ncoreCount\ncoreDeviceExecutionStatus\ncoreDeviceThingName\ncoreDevices\ncoreVersion\ncores\ncorrelationData\ncors\ncost\ncostEstimates\ncostOptimizing\ncount\ncounters\ncountersToAggregate\ncountry\ncountryCode\ncounts\ncountsByGroup\ncoveredResources\ncpiSecretKey\ncpiUserId\ncpiUserPassword\ncpiUsername\ncpu\ncpuArchitecture\ncpuCount\ncpuOptions\ncpuPerformanceMetricBasis\ncpuUtilizationPercentage\ncpuVendorArchitectures\ncpus\ncr\ncrawlerArn\ncrawlerConfiguration\ncreateCollectionDetail\ncreateDate\ncreateDelegationRequest\ncreateDelegationRequests\ncreatePublicIP\ncreateSimulationJobRequests\ncreateStatus\ncreateTime\ncreateTimeRange\ncreateTimestamp\ncreateVersion\ncreateVpcEndpointDetail\ncreated\ncreatedAfter\ncreatedAt\ncreatedAtAfter\ncreatedAtBefore\ncreatedBefore\ncreatedBy\ncreatedCount\ncreatedDate\ncreatedOn\ncreatedReason\ncreatedRequestCount\ncreatedRequests\ncreatedRows\ncreatedTime\ncreatedTimeStamp\ncreatedTimestamp\ncreationDate\ncreationDateTime\ncreationTime\ncreationTimeAfter\ncreationTimeBefore\ncreationTimeInMillis\ncreationTimeRange\ncreationTimestamp\ncreationType\ncreator\ncreatorAccountId\ncreatorDisplayName\ncreatorId\ncreatorMemberAbilities\ncredential\ncredentialDurationSeconds\ncredentialProvider\ncredentialSpecs\ncredentialType\ncredentials\ncredentialsArn\ncredentialsMap\ncredentialsParameter\ncriteria\ncriteriaList\ncriterion\ncritical\ncrl\ncrlArn\ncrlData\ncrlId\ncrls\ncrossAccountRoleArns\ncsv\ncsvIndexToVariableMap\ncsvInputTemplate\ncta\ncumulativeGasUsed\ncurrencies\ncurrency\ncurrencyCode\ncurrent\ncurrentApplicationVersion\ncurrentApplyDate\ncurrentAttemptCount\ncurrentBackupRateInMegaBytesPerSecond\ncurrentBuildSummary\ncurrentConfiguration\ncurrentDeployment\ncurrentDeploymentGroupName\ncurrentEphemeris\ncurrentInstanceGpuInfo\ncurrentInstanceType\ncurrentLabel\ncurrentLicenseConfiguration\ncurrentMemorySize\ncurrentPerformanceRisk\ncurrentPerformanceRiskRatings\ncurrentPhase\ncurrentPlan\ncurrentPricingPlan\ncurrentProgress\ncurrentRevision\ncurrentRevisionId\ncurrentRpoInSecs\ncurrentRtoInSecs\ncurrentServiceConfiguration\ncurrentVersion\ncursor\ncustom\ncustomAuthConfigs\ncustomAuthenticationType\ncustomCodeSigning\ncustomControlsCount\ncustomDNSConfiguration\ncustomDNSServerIP\ncustomDNSServerName\ncustomData\ncustomDataIdentifierId\ncustomDataIdentifierIds\ncustomDataIdentifiers\ncustomDomainName\ncustomDomains\ncustomFields\ncustomHeaders\ncustomImageName\ncustomModelArn\ncustomModelKmsKeyId\ncustomModelName\ncustomModelTags\ncustomModelTrainingParameters\ncustomModelTransformParameters\ncustomPayload\ncustomPlugin\ncustomPluginArn\ncustomPluginState\ncustomPlugins\ncustomProperties\ncustomRules\ncustomVocabularyExportSpecification\ncustomVocabularyImportSpecification\ncustomVocabularyItemList\ncustomVocabularyItems\ncustomVocabularyStatus\ncustomerAccountId\ncustomerAction\ncustomerAddress\ncustomerArtifactPaths\ncustomerDefinedValues\ncustomerId\ncustomerManaged\ncustomerManagedKey\ncustomerManagedKeyArn\ncustomerManagedKeyIdentifier\ncustomerManagedS3\ncustomerManagedS3Storage\ncustomerRouterConfig\ncustomerVersion\ncustomizationsSupported\ncvss\ncvss2\ncvss3\ncvssSource\ncwes\ndailyReportsOnly\ndailySchedule\ndashboardArn\ndashboardCreationDate\ndashboardDefinition\ndashboardDescription\ndashboardEndpoint\ndashboardId\ndashboardLastUpdateDate\ndashboardName\ndashboardSummaries\ndashboardValidationMessages\ndata\ndataAccessRoleArn\ndataApiRoleArn\ndataBundles\ndataCharacterEncoding\ndataCollected\ndataCollectionDetails\ndataCollectionStatus\ndataDelivery\ndataDestinationConfigs\ndataEncryptionMetadata\ndataExtraDimensions\ndataFormat\ndataItems\ndataLakeArn\ndataLakeSources\ndataLakes\ndataLocation\ndataLocationConstraint\ndataPlaneRouting\ndataPrivacy\ndataProcessingJobId\ndataProtectionStatus\ndataPullEndTime\ndataPullMode\ndataPullStartTime\ndataReplicationError\ndataReplicationInfo\ndataReplicationInitiation\ndataReplicationState\ndataSet\ndataSetImportTasks\ndataSetName\ndataSetOrg\ndataSetPublicationDate\ndataSetRequestId\ndataSetType\ndataSets\ndataSize\ndataSource\ndataSourceArn\ndataSourceConfig\ndataSourceName\ndataSourceNames\ndataSourceType\ndataSourceUrl\ndataSources\ndataTimestamp\ndataTraceEnabled\ndataTransferApi\ndataTransferApis\ndataType\ndataTypeName\ndataTypeSpec\ndataTypeValue\ndataURI\ndataValidationMetrics\ndataViewArn\ndataViewId\ndataViews\ndatabase\ndatabaseArn\ndatabaseConfigDetail\ndatabaseManagementPreference\ndatabaseMigrationPreference\ndatabaseName\ndatabasePreferences\ndatabaseUrl\ndatabases\ndatacenterName\ndataflowDestinationRegion\ndataflowEdges\ndataflowEndpointGroupArn\ndataflowEndpointGroupId\ndataflowEndpointGroupList\ndataflowEndpointName\ndataflowEndpointRegion\ndataflowId\ndataflowList\ndataflowSourceRegion\ndatakey\ndatapointsCollectionPercentage\ndatapointsToAlarm\ndataset\ndatasetArn\ndatasetContentSummaries\ndatasetContentVersionValue\ndatasetDescription\ndatasetExportJob\ndatasetExportJobArn\ndatasetExportJobs\ndatasetGroup\ndatasetGroupArn\ndatasetGroups\ndatasetId\ndatasetImportJob\ndatasetImportJobArn\ndatasetImportJobs\ndatasetName\ndatasetOrg\ndatasetPermissions\ndatasetSummaries\ndatasetTitle\ndatasetType\ndatasets\ndatastore\ndatastoreArn\ndatastoreId\ndatastoreName\ndatastorePartitions\ndatastoreProperties\ndatastoreStatus\ndatastoreStorage\ndatastoreSummaries\ndatasyncErrorCode\ndate\ndateAdded\ndateCreated\ndateDue\ndateLastRun\ndateNextRun\ndateRangeFilter\ndateUpdated\ndatesWithoutSupport\ndatetimeTypeFieldName\ndayOfMonth\ndayOfWeek\ndays\ndbClusterIdentifier\ndbClusterOrInstanceArn\ndbConnectionId\ndbEngineVersion\ndbName\ndbPassword\ndbPath\ndbPaths\ndbUser\ndebugSession\ndebugSessionEnabled\ndecimalReturnType\ndecision\ndecisionTaskCompletedEventAttributes\ndecisionTaskCompletedEventId\ndecisionTaskScheduledEventAttributes\ndecisionTaskStartedEventAttributes\ndecisionTaskTimedOutEventAttributes\ndecisionType\ndecisions\ndeclinationConditional\ndeclinationNextStep\ndeclinationResponse\ndecodeConfig\ndecoderManifestArn\ndecryptionError\ndedicatedServiceAccountId\ndedupeString\ndeepLink\ndefaultAction\ndefaultAssessmentReportsDestination\ndefaultAttributes\ndefaultAuthorizerName\ndefaultBranch\ndefaultBranchName\ndefaultCacheBehavior\ndefaultCapacityProviderStrategy\ndefaultChecked\ndefaultChildPolicy\ndefaultClientId\ndefaultCountryCode\ndefaultDevices\ndefaultDisplayVersion\ndefaultDomain\ndefaultExecutionStartToCloseTimeout\ndefaultExportDestination\ndefaultFormat\ndefaultGateway\ndefaultHyperParameterRanges\ndefaultHyperParameters\ndefaultIamRoleArn\ndefaultJobTimeoutMinutes\ndefaultLambdaRole\ndefaultLargeStagingDiskType\ndefaultLayout\ndefaultLogLevel\ndefaultParameters\ndefaultPrefix\ndefaultProcessOwners\ndefaultRegistryAlias\ndefaultResourceConfig\ndefaultResponse\ndefaultResultConfiguration\ndefaultServerSideEncryption\ndefaultTTL\ndefaultTargetHostname\ndefaultTaskHeartbeatTimeout\ndefaultTaskList\ndefaultTaskPriority\ndefaultTaskScheduleToCloseTimeout\ndefaultTaskScheduleToStartTimeout\ndefaultTaskStartToCloseTimeout\ndefaultTimeToLive\ndefaultValue\ndefaultValueList\ndefaultValueSpec\ndefaultValueSpecification\ndefaultVariation\ndefaultVersion\ndefaultVersionId\ndefaultVersionName\ndefinedIn\ndefinition\ndefinitionContent\ndefinitionUri\ndefinitionZip\ndelayInSeconds\ndelegatedAdmin\ndelegatedAdminAccount\ndelegatedAdminAccountId\ndelegatedAdminAccounts\ndelegationId\ndelegationIds\ndelegations\ndelete\ndeleteAdditionalMetricsToRetain\ndeleteAlertTargets\ndeleteAuditHistory\ndeleteBehaviors\ndeleteCollectionDetail\ndeleteFiles\ndeleteOnTermination\ndeletePipelineProvisioningRepository\ndeleteReports\ndeleteResources\ndeleteScheduledAudits\ndeleteStack\ndeleteStream\ndeleteVpcEndpointDetail\ndeleted\ndeletedAt\ndeletedBranch\ndeletedPackage\ndeletedResources\ndeletes\ndeletionCharacter\ndeletionProtected\ndelimitedTextOptions\ndelimiter\ndeliveryChannelName\ndeliveryFrequency\ndeliveryStream\ndeliveryStreamName\ndeltaSyncConfig\ndeltaSyncTableName\ndeltaSyncTableTTL\ndeltaTime\ndeltaTimeSessionWindowConfiguration\ndemodulationConfig\ndenied\ndeniesUnencryptedObjectUploads\ndenyListedAgentlessCollectors\ndenyListedMeCollectors\ndependencies\ndependencyType\ndependsOn\ndependsOnAlarms\ndeployAsNew\ndeployed\ndeployedVersion\ndeployment\ndeploymentApplicationConfigs\ndeploymentArtifacts\ndeploymentCircuitBreaker\ndeploymentConfig\ndeploymentConfigId\ndeploymentConfigInfo\ndeploymentConfigName\ndeploymentConfigsList\ndeploymentConfiguration\ndeploymentController\ndeploymentDetail\ndeploymentFinishTime\ndeploymentGroupId\ndeploymentGroupInfo\ndeploymentGroupName\ndeploymentGroupNames\ndeploymentGroups\ndeploymentGroupsInfo\ndeploymentId\ndeploymentIds\ndeploymentInfo\ndeploymentJobs\ndeploymentName\ndeploymentOption\ndeploymentOverview\ndeploymentPolicies\ndeploymentReadyOption\ndeploymentStartTime\ndeploymentStatus\ndeploymentStatusMessage\ndeploymentStatusMessages\ndeploymentStrategy\ndeploymentStyle\ndeploymentTarget\ndeploymentTargetType\ndeploymentTargets\ndeploymentType\ndeploymentWaitType\ndeployments\ndeploymentsInfo\ndeprecateExistingEntities\ndeprecated\ndeprecationDate\ndeprecationMessage\nderegisterTime\nderegisteredAt\nderegistrationPolicy\ndescending\ndescription\ndescriptions\ndescriptiveText\ndesiredCapacity\ndesiredChange\ndesiredCount\ndesiredModelArn\ndesiredModelId\ndesiredModelUnits\ndesiredProvisionedModelName\ndesiredSize\ndesiredState\ndesiredStatus\ndesiredvCpus\ndestination\ndestinationAccessToken\ndestinationAccount\ndestinationArn\ndestinationBranch\ndestinationCommit\ndestinationCommitId\ndestinationCommitSpecifier\ndestinationConfig\ndestinationConfiguration\ndestinationConnectionState\ndestinationConnectorLabel\ndestinationConnectorProperties\ndestinationConnectorType\ndestinationField\ndestinationFlowConfigList\ndestinationImageSet\ndestinationImageSetProperties\ndestinationInfo\ndestinationName\ndestinationOptions\ndestinationPackageVersions\ndestinationPath\ndestinationPort\ndestinationPrefix\ndestinationProperties\ndestinationReference\ndestinationRegion\ndestinationRepository\ndestinationS3BucketName\ndestinationS3Location\ndestinationS3Prefix\ndestinationServerId\ndestinationSummaries\ndestinationTableId\ndestinationType\ndestinationTypeParams\ndestinationTypeProperties\ndestinations\ndetachedObjectIdentifier\ndetail\ndetailedMessage\ndetailedResultsLocation\ndetails\ndetailsMap\ndetectSentiment\ndetectionPlatforms\ndetections\ndetector\ndetectorDebugOptions\ndetectorId\ndetectorModel\ndetectorModelArn\ndetectorModelConfiguration\ndetectorModelDefinition\ndetectorModelDescription\ndetectorModelName\ndetectorModelSummaries\ndetectorModelVersion\ndetectorModelVersionSummaries\ndetectorName\ndetectorSummaries\ndetectorTags\ndetectorVersion\ndetectorVersionId\ndetectorVersionStatus\ndetectorVersionSummaries\ndetectors\ndeterminingPolicies\ndevEnvironmentId\ndevice\ndeviceArn\ndeviceCapabilities\ndeviceCapacities\ndeviceCertificateArn\ndeviceCertificateId\ndeviceCode\ndeviceConfig\ndeviceDefender\ndeviceDefenderIndexingMode\ndeviceHostPaths\ndeviceId\ndeviceIdentifier\ndeviceIdentifierArn\ndeviceIdentifiers\ndeviceInstance\ndeviceInstances\ndeviceMinutes\ndeviceName\ndeviceParameters\ndevicePermissionRoleArn\ndevicePool\ndevicePoolArn\ndevicePools\ndeviceQueueInfo\ndeviceRegistryEnrich\ndeviceRoleArn\ndeviceSelectionConfiguration\ndeviceSelectionResult\ndeviceShadowEnrich\ndeviceState\ndeviceStatus\ndeviceTemplateName\ndeviceTemplates\ndeviceType\ndeviceUdid\ndevices\ndfeQueryEngine\ndiagnostics\ndiagnosticsMode\ndialRequests\ndialerConfig\ndialingCapacity\ndialogAction\ndialogActionType\ndialogCodeHook\ndialogState\ndiffType\ndifferences\ndigest\ndimensionColumns\ndimensionName\ndimensionNames\ndimensionValueOperator\ndimensions\ndirectConnectGateway\ndirectConnectGatewayAssociation\ndirectConnectGatewayAssociationProposal\ndirectConnectGatewayAssociationProposals\ndirectConnectGatewayAssociations\ndirectConnectGatewayAttachments\ndirectConnectGatewayId\ndirectConnectGatewayName\ndirectConnectGatewayOwnerAccount\ndirectConnectGatewayState\ndirectConnectGateways\ndirection\ndirectory\ndirectoryId\ndirectoryName\ndirectoryType\ndisableActionConfiguration\ndisableActionRequests\ndisableAllLogs\ndisableBackupRetention\ndisableEmailNotification\ndisableExecuteApiEndpoint\ndisableNetworking\ndisablePlayback\ndisableSSO\ndisabledAt\ndisabledOnInitialization\ndisabledReason\ndisassociatedAt\ndisassociatedDataStorage\ndisassociatedRepositoryNames\ndisconnectAfterInSeconds\ndisconnectReason\ndisconnectTimeoutInMinutes\ndiscoveredIntentCount\ndiscoveredSlotTypeCount\ndiscoveryArn\ndiscoveryData\ndiscoveryName\ndiscoveryUrl\ndisk\ndiskImageFormat\ndiskName\ndiskPath\ndiskSize\ndiskSizeInGb\ndiskSnapshot\ndiskSnapshotInfo\ndiskSnapshotName\ndiskSnapshots\ndisks\ndisplay\ndisplayAs\ndisplayId\ndisplayName\ndisplayValue\ndisruptionScore\ndistinctOutgoingEdgeLabels\ndistinctUsers\ndistribution\ndistributionConfiguration\ndistributionConfigurationArn\ndistributionConfigurationSummaryList\ndistributionDomainName\ndistributionHostedZoneId\ndistributionName\ndistributions\ndns\ndnsEntry\ndnsIpAddresses\ndnsName\ndnsPolicy\ndnsRecord\ndnsRecordCreationState\ndnsSearchDomains\ndnsServers\ndnsStatus\ndockerLabels\ndockerSecurityOptions\ndockerURI\ndockerVersion\ndockerVolumeConfiguration\ndockerfileTemplateData\ndockerfileTemplateUri\ndocs\ndocument\ndocumentIdentifier\ndocumentName\ndocumentParameters\ndocumentSource\ndocumentType\ndocumentVersion\ndocumentation\ndocumentationPartId\ndocumentationVersion\ndocuments\ndomain\ndomainArn\ndomainAssociation\ndomainAssociationArn\ndomainAssociations\ndomainConfigurationArn\ndomainConfigurationName\ndomainConfigurationStatus\ndomainConfigurations\ndomainDetails\ndomainEntries\ndomainEntry\ndomainEntryPoint\ndomainId\ndomainInfo\ndomainInfos\ndomainName\ndomainNameConfig\ndomainNameConfigs\ndomainNameStatus\ndomainNameStatusMessage\ndomainOwner\ndomainStatus\ndomainType\ndomainValidationOptions\ndomainValidationRecords\ndomains\ndoubleValue\ndownlinkBandwidthBits\ndownlinkDelayMs\ndownlinkJitterMs\ndownlinkLossPercent\ndownloadAllowed\ndownloadArtifactsUrl\ndownloadConditionFile\ndownloadUrl\ndriftStatus\ndriftType\ndriver\ndriverOpts\ndrop\ndryRun\ndtcRequestIntervalSeconds\ndtmfSpecification\nduration\ndurationExpression\ndurationInMinutes\ndurationInNanoSeconds\ndurationInSeconds\ndurationRange\ndurationSeconds\ndurations\ndynamicParameters\ndynamoDB\ndynamoDBv2\ndynamodb\ndynamodbConfig\neTag\nearlierTime\nearliestRestorableTimestamp\nebs\nebsEncryption\nebsEncryptionKeyArn\nebsSnapshots\nebsVolumeID\nec2\nec2Configuration\nec2ImageId\nec2InstanceFamily\nec2InstanceID\nec2InstanceId\nec2InstanceImageId\nec2InstanceState\nec2InstanceSubnetId\nec2InstanceTags\nec2InstanceType\nec2InstanceTypes\nec2InstanceVpcId\nec2KeyName\nec2KeyPair\nec2LaunchTemplateID\nec2ScanStatus\nec2SecurityGroupIds\nec2SshKey\nec2SubnetIds\nec2TagFilters\nec2TagSet\nec2TagSetList\necr\necrConfiguration\necrImage\necrImageArchitecture\necrImageHash\necrImagePullerRole\necrImagePushedAt\necrImageRegistry\necrImageRepositoryName\necrImageTags\necrRepository\necrRepositoryName\necrRepositoryPrefix\necrRepositoryPrefixes\necsClusterArn\necsServiceRecommendations\necsServices\necsTarget\nedgeLabels\nedgeProperties\nedgeStructures\neditContent\neditor\neffect\neffectiveDateTime\neffectiveDeployments\neffectiveGasPrice\neffectiveOn\neffectivePermission\neffectivePolicies\neffectiveRecommendationPreferences\neffectiveSettings\neffectiveTime\nefsVolumeConfiguration\negressAddress\negressFilter\neksAttempts\neksClusterArn\neksConfiguration\neksProperties\neksPropertiesOverride\neksSourceClusterNamespace\neksSourceName\neksSourceNames\neksSources\nelapsed\nelapsedReplicationDuration\nelapsedTimeInSeconds\nelasticsearch\nelasticsearchConfig\nelbInfoList\nelement\nelements\nelevation\nelevationReference\nelevationUnit\nelicitationCodeHook\neligibleToRenew\nelse\nemail\nemailAddress\nemailConfigurations\nembed\nembeddingDataDeliveryEnabled\nemoji\nemptyDir\nenable\nenableActionConfiguration\nenableActionRequests\nenableAnswerMachineDetection\nenableAutoBranchCreation\nenableAutoBuild\nenableAutoSubDomain\nenableBackupRetention\nenableBasicAuth\nenableBranchAutoBuild\nenableBranchAutoDeletion\nenableCachingForHttp\nenableCodeHookInvocation\nenableDynamicFieldUpdate\nenableECSManagedTags\nenableExecuteCommand\nenableIoTLoggingParams\nenableManagedSpotTraining\nenableMapAutoTagging\nenableModelImprovements\nenableNotification\nenableObjectVersioning\nenableOnPublicIp\nenablePerformanceMode\nenablePullRequestPreview\nenableSiteLink\nenabled\nenabledControls\nenablementStatus\nencodedInputTranscript\nencodedMessage\nencoder\nencoding\nencodings\nencrypted\nencryptionAlgorithm\nencryptionAlgorithmOptions\nencryptionConfig\nencryptionConfiguration\nencryptionContextEquals\nencryptionContextSubset\nencryptionDisabled\nencryptionKey\nencryptionKeyArn\nencryptionKeyOverride\nencryptionMode\nencryptionSetting\nencryptionSpecification\nencryptionSpecificationOverride\nencryptionStatus\nencryptionType\nend\nendAt\nendBehavior\nendCharOffset\nendCharacter\nendDate\nendDateTime\nendInclusive\nendLine\nendOffsetExclusive\nendTime\nendTimeAfter\nendTimeBefore\nendTimeInSeconds\nendTimeOffsetInNanos\nendTimeoutMs\nendTimes\nendToEndResult\nendToEndResultCounts\nended\nendedAt\nendedTime\nendpoint\nendpointAddress\nendpointArn\nendpointConfig\nendpointConfiguration\nendpointCreateTime\nendpointDetails\nendpointIdentifier\nendpointName\nendpointPrivateAccess\nendpointPublicAccess\nendpointStatus\nendpointType\nendpoints\nendpointsDetails\nenforce\nengagements\nengine\nengineDescription\nengineType\nengineVersion\nengineVersionDescription\nengineVersions\nenhancedFindings\nenhancedImageMetadataEnabled\nenhancedInfrastructureMetrics\nenhancedVpcRouting\nentities\nentitiesPath\nentity\nentityAggregates\nentityArn\nentityArns\nentityId\nentityIdKey\nentityName\nentityOverrides\nentityPropertyReference\nentitySummaries\nentityType\nentityTypes\nentityUrl\nentityUrlTemplate\nentityValue\nentityValues\nentries\nentry\nentryId\nentryName\nentryPoint\nentryPointArguments\nenumerationValues\nenums\nenv\nenvironment\nenvironmentAccountConnection\nenvironmentAccountConnectionId\nenvironmentAccountConnections\nenvironmentAccountId\nenvironmentArn\nenvironmentFiles\nenvironmentId\nenvironmentIds\nenvironmentName\nenvironmentTemplate\nenvironmentTemplateVersion\nenvironmentTemplates\nenvironmentTypeOverride\nenvironmentUrl\nenvironmentVariables\nenvironmentVariablesOverride\nenvironments\nephemeralStorage\nephemerides\nephemeris\nephemerisData\nephemerisId\nepoch\nepss\nepssScore\neq\neqExactMatch\nerror\nerrorAction\nerrorCategory\nerrorCode\nerrorData\nerrorDateTime\nerrorDescription\nerrorDetails\nerrorEntries\nerrorHandlingConfig\nerrorId\nerrorInfo\nerrorInformation\nerrorMessage\nerrorName\nerrorReason\nerrorReportLocation\nerrorStack\nerrorStackTrace\nerrorTimestamp\nerrorType\nerrorTypes\nerror_description\nerrored\nerrors\nerrorsAndFailedEntriesZip\nerrorsPerPage\nescape\nescapeQuotes\nessential\nestimatedCost\nestimatedCostTier\nestimatedMinutesRemaining\nestimatedMonthlyCost\nestimatedMonthlySavings\nestimatedOn\nestimatedPercentMonthlySavings\nestimatedSecondsToCompletion\nestimatedSizeInBytes\nestimatedTimeRemainingSeconds\netaDateTime\netag\neula\neulaAcceptanceId\neulaAcceptances\neulaId\neulaIds\neulas\nevaluateExpressions\nevaluateOnExit\nevaluated\nevaluatedExpression\nevaluatedExternalModels\nevaluatedModelVersions\nevaluation\nevaluationContext\nevaluationMethod\nevaluationOrder\nevaluationPeriods\nevaluationResult\nevaluationRules\nevaluationScore\nevaluationStrategy\nevaluations\nevent\neventAggregates\neventArn\neventArns\neventAttributionSource\neventBridge\neventBridgeConfig\neventBridgeEnabled\neventBusArn\neventCategories\neventCategory\neventClasses\neventConfigurations\neventCount\neventData\neventDataChecksum\neventDataSizeInBytes\neventDataStoreArn\neventDate\neventDescription\neventID\neventId\neventIngestion\neventList\neventMessage\neventMetadata\neventName\neventNumber\neventOrchestration\neventPattern\neventPredictionSummaries\neventPublishers\neventReason\neventReferences\neventResourceData\neventResults\neventScopeCode\neventSource\neventSources\neventStatusCodes\neventSubscriptions\neventSummaries\neventTime\neventTimestamp\neventTracker\neventTrackerArn\neventTrackers\neventType\neventTypeCategories\neventTypeCategory\neventTypeCode\neventTypeCodes\neventTypeName\neventTypes\neventUpdatedTime\neventValue\neventValueThreshold\neventVariableName\neventVariableNames\neventVariables\neventVersion\nevents\neventsDeletionStatus\nevidence\nevidenceAwsAccountId\nevidenceAwsServiceSourceCount\nevidenceByType\nevidenceByTypeComplianceCheckCount\nevidenceByTypeComplianceCheckIssuesCount\nevidenceByTypeConfigurationDataCount\nevidenceByTypeManualCount\nevidenceByTypeUserActivityCount\nevidenceCount\nevidenceDetail\nevidenceFileName\nevidenceFinderEnabled\nevidenceFinderEnablement\nevidenceFolder\nevidenceFolderId\nevidenceFolders\nevidenceId\nevidenceIds\nevidenceInsights\nevidenceResourcesIncludedCount\nevidenceRule\nevidenceSources\nevidences\nexact\nexample\nexampleReference\nexception\nexceptionMessage\nexceptionName\nexceptionTimeToLive\nexceptions\nexcerpt\nexcludeAppPackagesFromCleanup\nexcludeMatchedPattern\nexcludeProperties\nexcludeReason\nexcludeVerboseContent\nexcluded\nexcludedDatasetColumns\nexcludedInstanceTypes\nexcludes\nexclusionArns\nexclusionByResourceTypes\nexclusionPreviews\nexclusions\nexecArgs\nexecuteCommandConfiguration\nexecuteCommandSessionConfiguration\nexecution\nexecutionAbortedEventDetails\nexecutionArn\nexecutionConfiguration\nexecutionContext\nexecutionCounts\nexecutionDetails\nexecutionEndDate\nexecutionFailedEventDetails\nexecutionFilter\nexecutionID\nexecutionId\nexecutionIds\nexecutionInfo\nexecutionInfos\nexecutionMessage\nexecutionNamePrefix\nexecutionNumber\nexecutionResult\nexecutionRole\nexecutionRoleArn\nexecutionStartDate\nexecutionStartToCloseTimeout\nexecutionStartedEventDetails\nexecutionState\nexecutionStatus\nexecutionStoppedAt\nexecutionSucceededEventDetails\nexecutionSummaries\nexecutionTimedOutEventDetails\nexecutionTimeoutMinutes\nexecutionTimeoutSeconds\nexecutionUrlTemplate\nexecutions\nexecutor\nexistingAllowedPrefixesToDirectConnectGateway\nexistingFindingId\nexistingFindingStatus\nexistingImageName\nexistingRuleContentSha256\nexists\nexitBehavior\nexitCode\nexpected\nexpectedAgentPrompt\nexpectedComplianceStatus\nexpectedFingerprint\nexpectedOutput\nexpectedReferenceId\nexpectedRevisionId\nexpectedRpoDescription\nexpectedRpoInSecs\nexpectedRtoDescription\nexpectedRtoInSecs\nexpectedSequenceToken\nexpectedStatus\nexpectedTimestamp\nexpectedValue\nexpectedVersion\nexperiment\nexperimentCount\nexperimentTemplate\nexperimentTemplateId\nexperimentTemplates\nexperiments\nexpiration\nexpirationDate\nexpirationInSeconds\nexpirationTime\nexpired\nexpiredLogEventEndIndex\nexpires\nexpiresAt\nexpiresIn\nexpiresInMinutes\nexpiresInSec\nexpiresInSeconds\nexpiresOn\nexpiresTime\nexpiringImageTotalCount\nexpiryTime\nexplainMode\nexplicitDeny\nexploitAvailable\nexploitObserved\nexploitabilityDetails\nexponentialRate\nexport\nexportBucketArn\nexportConfig\nexportConfigType\nexportDataFormat\nexportID\nexportIDs\nexportId\nexportIds\nexportJobs\nexportRequestTime\nexportSnapshotRecords\nexportStatus\nexportSummaries\nexportTask\nexportTasks\nexportType\nexportedEnvironmentVariables\nexportsInfo\nexpr\nexpression\nexpressionString\nexpressionWithValues\nexprs\nextendedKeyUsage\nextendsFrom\nextension\nexternal\nexternalConnection\nexternalConnectionName\nexternalConnections\nexternalEventsDetail\nexternalExecutionId\nexternalExecutionSummary\nexternalExecutionUrl\nexternalId\nexternalIdProperty\nexternalInitiatedEventId\nexternalLocation\nexternalMetricStatus\nexternalMetricsPreference\nexternalModel\nexternalModelEndpointDataBlobs\nexternalModelEndpoints\nexternalModelOutputs\nexternalModels\nexternalParameters\nexternalSourceSetting\nexternalWorkflowExecution\nexternalWorkflowExecutionCancelRequestedEventAttributes\nexternalWorkflowExecutionSignaledEventAttributes\nextraDataPackageArn\nextraHosts\nextractedValues\nfacet\nfacets\nfact\nfactor\nfacts\nfailOnError\nfailOnFirstDestinationError\nfailOnWarnings\nfailWhenMissing\nfailWorkflowExecutionDecisionAttributes\nfailWorkflowExecutionFailedEventAttributes\nfailback\nfailbackClientID\nfailbackClientLastSeenByServiceDateTime\nfailbackInitiationTime\nfailbackJobID\nfailbackLaunchType\nfailbackToOriginalServer\nfailed\nfailedAccountIds\nfailedAccounts\nfailedAt\nfailedBatchItems\nfailedChecks\nfailedEntries\nfailedEventCount\nfailedExecutions\nfailedFindings\nfailedFindingsCount\nfailedItem\nfailedItems\nfailedRecordsCount\nfailedRequestCount\nfailedRequests\nfailedS3Resources\nfailedSet\nfailedTasks\nfailedVersions\nfailedWorldCount\nfailure\nfailureBehavior\nfailureCause\nfailureCode\nfailureConditional\nfailureCount\nfailureDetails\nfailureHandlingPolicy\nfailureMessage\nfailureNextStep\nfailureReason\nfailureReasons\nfailureResource\nfailureResponse\nfailureSummary\nfailureThresholdPercentage\nfailureType\nfailures\nfairsharePolicy\nfallbackLocation\nfallbackResult\nfamilies\nfamily\nfamilyPrefix\nfargatePlatformConfiguration\nfargateProfile\nfargateProfileArn\nfargateProfileName\nfargateProfileNames\nfastLaunchConfigurations\nfeature\nfeatureCount\nfeatureName\nfeatureSet\nfeatureTransformation\nfeatureTransformationArn\nfeatureTransformationParameters\nfeatureVariations\nfeatures\nfederatedUser\nfederationMode\nfederationParameters\nfederationProviderName\nfederationURN\nfetchSubmodules\nfield\nfieldArn\nfieldId\nfieldLengthRange\nfieldLevelMessages\nfieldList\nfieldLogLevel\nfieldName\nfieldType\nfieldValueRange\nfields\nfieldsToExport\nfile\nfileContent\nfileDescription\nfileExistsBehavior\nfileFormat\nfileFormatConfiguration\nfileFormatType\nfileId\nfileKey\nfileLevelMessages\nfileLocation\nfileMap\nfileMd5\nfileMode\nfileModeConflict\nfileModes\nfileName\nfilePassword\nfilePath\nfilePaths\nfilePosition\nfileSize\nfileSizes\nfileSystemId\nfileSystemLocations\nfileSystemPolicy\nfileSystemType\nfileType\nfileUploadUrls\nfileUploaderConfig\nfileVersion\nfilename\nfiles\nfilesAdded\nfilesDeleted\nfilesUpdated\nfilter\nfilterArn\nfilterBy\nfilterByName\nfilterByPublished\nfilterByRecordingConfigurationArn\nfilterByState\nfilterByUserId\nfilterCriteria\nfilterExpression\nfilterFormula\nfilterGroups\nfilterName\nfilterNamePrefix\nfilterOperators\nfilterPattern\nfilterQuery\nfilterType\nfilterValue\nfilterValues\nfilters\nfinalCaseStatus\nfinalRelationalDatabaseSnapshotName\nfinalSnapshotName\nfinalSnapshotRetentionPeriod\nfinalized\nfinding\nfindingArn\nfindingArns\nfindingCounts\nfindingCriteria\nfindingDetails\nfindingId\nfindingIdentifiers\nfindingIds\nfindingNumber\nfindingPublishingFrequency\nfindingReasonCodes\nfindingSeverityCounts\nfindingStatus\nfindingTime\nfindingType\nfindingTypes\nfindings\nfindingsFilterListItems\nfindingsMetrics\nfindingsReportSummaries\nfingerprint\nfingerprintSHA1\nfingerprintSHA256\nfinishedAt\nfinishedCount\nfinishedWorldsSummary\nfirehose\nfirelensConfiguration\nfirstBoot\nfirstByteDateTime\nfirstEnabledAt\nfirstEventTimestamp\nfirstExecutionFrom\nfirstJoinTime\nfirstName\nfirstObservedAt\nfirstSeen\nfirstUsedTime\nfirstUtteredDate\nfixAvailable\nfixedInVersion\nflaggedResources\nflatten\nfleet\nfleetArn\nfleetDetails\nfleetId\nfleetInstanceId\nfleetMetrics\nfleetName\nfleetSummaries\nfleetType\nfleets\nfloorplanCount\nflowActionsRoleArn\nflowArn\nflowErrorDeactivationThreshold\nflowExecutionId\nflowExecutions\nflowName\nflowStatus\nflowStatusMessage\nflowTemplateId\nflows\nfolderPath\nfollowUpPrompt\nforce\nforceCanceled\nforceDelete\nforceDeleteAWSJob\nforceDeleteAddOns\nforceNewDeployment\nforceStop\nforceStopAppReplication\nforceTerminateApp\nforceUefi\nforceUpdate\nform\nformActionType\nformFactor\nformToCreate\nformat\nformatOptions\nformatParams\nformatRecordsAs\nformatToHeader\nformattedRecords\nformattedValue\nformattedValues\nformula\nforwardedCookies\nforwardedHeaders\nforwardedQueryStrings\nforwardingConfig\nfound\nfoundationModelArn\nfoundationModelArnEquals\nfpr\nfqdn\nfqdnForActionFramework\nfragmentsFilePath\nframeAddress\nframeMetric\nframeMetricData\nframeMetrics\nframeName\nframework\nframeworkDescription\nframeworkId\nframeworkMetadataList\nframeworkName\nframeworkType\nfreeTrialConsumed\nfreeTrialExpiration\nfreeTrialInfo\nfreeTrialStartDate\nfrequency\nfrequencyInSeconds\nfriendlyName\nfrom\nfromAttachedDisks\nfromBlockchainInstant\nfromBlueprintId\nfromBundleId\nfromDate\nfromDateTime\nfromDiskArn\nfromDiskInfo\nfromDiskName\nfromInstanceArn\nfromInstanceName\nfromPermissionArn\nfromPermissionVersion\nfromPort\nfromRelationalDatabaseArn\nfromRelationalDatabaseBlueprintId\nfromRelationalDatabaseBundleId\nfromRelationalDatabaseName\nfromResourceArn\nfromResourceName\nfsxWindowsFileServerVolumeConfiguration\nfulfillmentActivity\nfulfillmentCodeHook\nfulfillmentState\nfulfillmentUpdatesSpecification\nfullString\nfullyQualifiedName\nfunction\nfunctionAlias\nfunctionArn\nfunctionArns\nfunctionConfiguration\nfunctionId\nfunctionInstances\nfunctionName\nfunctionNames\nfunctionPackages\nfunctionTags\nfunctionVersion\nfunctions\ngasUsed\ngatewayArn\ngatewayCapabilitySummaries\ngatewayId\ngatewayName\ngatewayPlatform\ngatewayRoute\ngatewayRouteName\ngatewayRoutes\ngatewaySummaries\ngbInUse\ngbPerMonthAllocated\ngenerateDistinctId\ngeneratedFields\ngeneratedFrom\ngeneratedId\ngeneratedPolicies\ngeneratedPolicyResult\ngeneratedSceneMetadata\ngenerationDataSource\ngenerationId\ngenerationJob\ngeneratorId\ngenericAttachments\ngenericDataSchema\ngenericRevisionInfo\ngetObject\ngetTokenBalanceInputs\ngitCloneDepth\ngitCloneDepthOverride\ngitHub\ngitHubAccountName\ngitHubLocation\ngitSubmodulesConfig\ngitSubmodulesConfigOverride\nglobal\nglueConfiguration\nglueDataCatalog\ngps\ngpuCount\ngpuIds\ngpuMemorySizeInMiB\ngpuUnitLimit\ngpus\ngrafanaVersion\ngrafanaVersions\ngrammarSlotTypeSetting\ngrantType\ngrantee\ngranteePrincipal\ngrants\ngraphSummary\ngraphqlApi\ngraphqlApis\ngreenFleetProvisioningOption\ngreenGrassGroupId\ngreengrass\ngreengrassDeploymentId\ngreengrassGroupId\ngreengrassGroupName\ngreengrassGroupVersionId\ngreengrassV2\ngremlin\ngremlinQuery\ngroundStation\ngroundStationId\ngroundStationList\ngroundStationName\ngroundStations\ngroup\ngroupArn\ngroupAttribute\ngroupBy\ngroupByKeys\ngroupDesc\ngroupId\ngroupIdFilter\ngroupKey\ngroupName\ngroupNumber\ngroupType\ngroupWeights\ngroups\ngroupsClaim\ngroupsPrefix\ngrpcRetryEvents\ngrpcRoute\ngt\ngte\nhaArchitecture\nhardLimit\nhardware\nhardwareId\nhasChildEntities\nhasErrorEvent\nhasFlaggedResources\nhasHeaderRow\nhasLogicalRedundancy\nhasMoreErrors\nhasMoreResults\nhasNestedEntities\nhasTransmissionEcu\nhashAlgorithm\nhashAlgorithmOptions\nhashKeyField\nhashKeyType\nhashKeyValue\nhashed\nhashes\nheadCommitId\nheader\nheaderMatches\nheaderName\nheaderValue\nheaders\nheadersAllowList\nheadersToInclude\nhealth\nhealthCheck\nhealthCheckGracePeriodSeconds\nhealthCheckIntervalSeconds\nhealthCheckPath\nhealthCheckTimeoutSeconds\nhealthReasons\nhealthServiceAccessStatusForOrganization\nhealthStatus\nhealthyAgentlessCollectors\nhealthyAgents\nhealthyConnectors\nhealthyMeCollectors\nhealthyThreshold\nhealthyThresholdCount\nheapSize\nheartbeatInSeconds\nheartbeatTimeout\nheight\nhelmChart\nhierarchies\nhierarchyId\nhierarchyInfo\nhigh\nhighAvailabilityConfig\nhighlight\nhighlights\nhistoryFilter\nhit\nhitCount\nhits\nhomePage\nhomeRegion\nhook\nhooksNotCleanedUp\nhorizontalGap\nhost\nhostAddress\nhostKeys\nhostName\nhostNetwork\nhostPath\nhostPort\nhostPortRange\nhostPrefix\nhostedZoneId\nhostname\nhpoConfig\nhpoJob\nhpoObjective\nhpoResourceConfig\nhttp\nhttp2Route\nhttpApiKeyAuth\nhttpConfig\nhttpContext\nhttpEndpoint\nhttpMethod\nhttpProtocolIpv6\nhttpPutResponseHopLimit\nhttpRetryEvents\nhttpRoute\nhttpTokens\nhttpUrlConfiguration\nhttpUrlProperties\nhttpUrlSummary\nhttps\nhttpsRedirectionEnabled\nhunkContent\nhyperParameters\nhyperlinkName\niam\niamArn\niamId\niamInstanceProfileArn\niamInstanceProfileName\niamRegistrationResponse\niamResources\niamRole\niamRoleArn\niamRoles\niamServiceRoleArn\niamSessionArn\niamUser\niamUserArn\niatTTL\niccid\nicmpTypeCode\niconUrl\nid\nidFieldNames\nidRef\nidToken\nidempotencyToken\nidentifer\nidentificationHints\nidentifier\nidentifiers\nidentity\nidentityId\nidentityProvider\nidentityProviderArn\nidentityProviderConfig\nidentityProviderConfigArn\nidentityProviderConfigName\nidentityProviderConfigs\nidentityProviderDetails\nidentityProviderName\nidentityProviderType\nidentityProviders\nidentitySource\nidentitySourceId\nidentitySources\nidentityStoreId\nidentityToken\nidentityType\nidentityValidationExpression\nides\nidle\nidleDisconnectTimeoutInMinutes\nidleSessionTTLInSeconds\nidleTimeoutMinutes\nidpMetadata\nids\nignoreApplicationStopFailures\nignoreEmptyRows\nignoreFailure\nignoreFilterField\nignoreJobChecks\nignorePollAlarmFailure\nignorePublicAcls\nignoreQualField\nignoreWords\nimage\nimageAggregation\nimageArn\nimageBuildVersionArn\nimageConfiguration\nimageDataDeliveryEnabled\nimageDetail\nimageDetails\nimageDigest\nimageFrameBlob\nimageFrameId\nimageFrameInformation\nimageHash\nimageId\nimageIdOverride\nimageIds\nimageKubernetesVersion\nimageManifest\nimageManifestMediaType\nimageOsVersionOverride\nimageOverride\nimagePackageList\nimagePermissions\nimagePipeline\nimagePipelineAggregation\nimagePipelineArn\nimagePipelineList\nimagePullCredentialsType\nimagePullCredentialsTypeOverride\nimagePullPolicy\nimagePushedAt\nimageRecipe\nimageRecipeArn\nimageRecipeSummaryList\nimageResponseCard\nimageScanCompletedAt\nimageScanFindings\nimageScanFindingsSummary\nimageScanStatus\nimageScanningConfiguration\nimageScanningEnabled\nimageSetArn\nimageSetId\nimageSetMetadataBlob\nimageSetPropertiesList\nimageSetState\nimageSetWorkflowStatus\nimageSetsMetadataSummaries\nimageSha\nimageShas\nimageSizeInBytes\nimageSource\nimageSummaryList\nimageTag\nimageTagDetails\nimageTagMutability\nimageTags\nimageTestsConfiguration\nimageTestsEnabled\nimageType\nimageUri\nimageUris\nimageUrl\nimageVersionArn\nimageVersionList\nimages\nimpact\nimplementedBy\nimplicitDeny\nimportCompletionTime\nimportConfig\nimportDeletedTime\nimportID\nimportIDs\nimportId\nimportInputLocation\nimportJobs\nimportMode\nimportName\nimportOptions\nimportRequestTime\nimportStatus\nimportStrategy\nimportSummaries\nimportTask\nimportTaskId\nimportTaskIds\nimportType\nimportUrl\nimportedAppId\nimportedResourceId\nimportedResourceName\nimportedResourceType\nimportedValue\nimpression\nimsi\nin\ninProgress\ninProgressChecks\ninProgressJobs\ninProgressTimeoutInMinutes\ninReplyTo\ninUseResourceCount\ninactivityTimeoutMinutes\ninboundExecution\ninboundTransitionState\nincidentRecord\nincidentRecordArn\nincidentRecordSource\nincidentRecordSummaries\nincidentTags\nincidentTemplate\nincidentTemplateDedupeString\nincidentTemplateImpact\nincidentTemplateNotificationTargets\nincidentTemplateSummary\nincidentTemplateTags\nincidentTemplateTitle\ninclude\nincludeAllVersions\nincludeAvailabilityZones\nincludeCanceled\nincludeCertificateDetails\nincludeCommunications\nincludeConnectedResources\nincludeContent\nincludeDefaultKeyPair\nincludeDeletedRecords\nincludeDeletedResources\nincludeDeprecated\nincludeDescription\nincludeDirectives\nincludeExecutionData\nincludeFromUpstream\nincludeGlobalResourceTypes\nincludeInactive\nincludeJobDocument\nincludeJobExecutionState\nincludeLinkedAccounts\nincludeMemberAccounts\nincludeOnlyActiveViolations\nincludeOnlyStatuses\nincludeQueuedLoads\nincludeRelationalDatabaseAvailabilityZones\nincludeRenditions\nincludeResolvedCases\nincludeResourcePlaceholders\nincludeResultMetadata\nincludeServiceLevelTemplate\nincludeShadowTrails\nincludeSourceFiles\nincludeStatistics\nincludeSuppressedAlerts\nincludeValue\nincludeValues\nincludeWaiting\nincluded\nincludedData\nincludes\ninclusionStatus\nincompatibilityMessages\nincompatibleDevices\ninconclusiveEvidenceCount\nincrementFactor\nincrementalPullConfig\nincrementalRunConfig\nincrementalRunType\nindex\nindexName\nindexNames\nindexOps\nindexStatus\nindicatorOfCompromise\ninferenceAcceleratorOverrides\ninferenceAccelerators\ninferenceTypesSupported\ninferredWorkloadSavings\ninferredWorkloadTypes\ninfo\ninfrastructureConfiguration\ninfrastructureConfigurationArn\ninfrastructureConfigurationSummaryList\ningestConfiguration\ningestEndpoint\ningestedEventStatistics\ningestedEventsDetail\ningestedEventsTimeWindow\ningestion\ningestionArn\ningestionDestination\ningestionDestinationIdentifier\ningestionDestinations\ningestionIdentifier\ningestionMode\ningestionTime\ningestionType\ningestions\ningressAddress\ningressPortOverride\ninheritedProperties\ninitProcessEnabled\ninitQueryFile\ninitialCapacity\ninitialCaseStatus\ninitialResponse\ninitialResponseSetting\ninitialRevision\ninitialRun\ninitialState\ninitialStateName\ninitializationConfiguration\ninitializationScript\ninitializationScripts\ninitiated\ninitiatedBy\ninitiatedEventId\ninitiator\ninlineDocument\ninlineRecipe\ninlineSourceMap\ninput\ninputArn\ninputArtifactDetails\ninputArtifacts\ninputCharacter\ninputConfiguration\ninputContexts\ninputDataConfig\ninputDataS3Location\ninputDefinition\ninputDescription\ninputDetails\ninputFileBucket\ninputFileKey\ninputIdentifier\ninputList\ninputModalities\ninputMode\ninputName\ninputParameters\ninputPath\ninputPayloadEncodingType\ninputProperty\ninputPropertyValue\ninputRecords\ninputS3Bucket\ninputS3Key\ninputS3Uri\ninputSourceARN\ninputSourceConfig\ninputStream\ninputSummaries\ninputText\ninputToken\ninputTranscript\ninputType\ninputVariables\ninputs\ninsecureIngest\ninsecureSkipVerification\ninsecureSsl\ninsecureSslOverride\ninsights\ninspectorScore\ninspectorScoreDetails\ninstallState\ninstalledComponents\ninstalledVersion\ninstallingVersion\ninstance\ninstanceArn\ninstanceArns\ninstanceConfig\ninstanceConfiguration\ninstanceCount\ninstanceGpuInfo\ninstanceHealth\ninstanceHealthReason\ninstanceHealthSummary\ninstanceId\ninstanceIdFilter\ninstanceIdentity\ninstanceIdentityDocument\ninstanceIdentityDocumentSignature\ninstanceIds\ninstanceInfo\ninstanceInfos\ninstanceLabel\ninstanceMetadataOptions\ninstanceName\ninstanceNames\ninstancePort\ninstanceProfile\ninstanceProfileName\ninstanceProfiles\ninstanceProperties\ninstanceRecommendations\ninstanceRole\ninstanceSnapshot\ninstanceSnapshotInfo\ninstanceSnapshotName\ninstanceSnapshots\ninstanceState\ninstanceStatusFilter\ninstanceSummary\ninstanceTags\ninstanceTarget\ninstanceTerminationWaitTimeStarted\ninstanceType\ninstanceTypeFilter\ninstanceTypes\ninstanceUrl\ninstanceWarmupPeriod\ninstances\ninstancesList\ninstancesSummary\ninstantiatedVnfInfo\ninstantiationState\nintegerHyperParameterRanges\nintegerValue\nintegrationConfiguration\nintegrationHttpMethod\nintegrationResponses\nintegrations\nintendedForQualification\nintent\nintentClassificationResults\nintentClassificationTestResults\nintentClosingSetting\nintentConfirmationSetting\nintentCount\nintentDiscrepancies\nintentId\nintentLevel\nintentLevelSlotResolutionTestResults\nintentMatchResult\nintentMatchResultCounts\nintentName\nintentPath\nintentSignature\nintentState\nintentSummaries\nintentVersion\nintents\nintentsCount\ninteractionMode\ninteractive\ninterconnectId\ninterconnectName\ninterconnectState\ninterconnects\ninterfaceId\ninterfaceName\ninteriorCountPerFloorplan\ninterleaved\nintermediateBucketName\ninternal\ninternalDeviceName\ninterpolatedAssetPropertyValues\ninterpolation\ninterpolationType\ninterpretations\ninterpretedValue\ninterval\nintervalInSeconds\nintervalMillis\nintervalSeconds\nintervalWindowInSeconds\ninvalidExecutions\ninvalidNetworkInterfaces\ninvalidNodes\ninvalidReason\ninvalidSignals\ninvert\ninvitationId\ninvitationTimestamp\ninvitations\ninvitationsCount\ninvitedAt\ninvocationLabel\ninvokeModelEndpointRoleArn\ninvokedBy\ninvokedIntentSamples\ninvoker\ninvokerRoleName\niops\niosPaths\niotAnalytics\niotEvents\niotEventsDestinationConfiguration\niotEventsInputIdentifier\niotJobArn\niotJobConfiguration\niotJobId\niotSiteWise\niotSiteWiseAssetModelPropertyIdentifier\niotSiteWiseInputIdentifier\niotSiteWiseMultiLayerStorage\niotTopicPublish\nipAccessSettings\nipAccessSettingsArn\nipAddress\nipAddressAssignment\nipAddressBasedRemoteInfoList\nipAddressConfigurationTimeStamp\nipAddressDetails\nipAddressType\nipAddressV4\nipCity\nipCountry\nipFamily\nipGeoLocation\nipGroupIds\nipOwner\nipPreference\nipRange\nipRule\nipRules\nipV4Addresses\nipV6Addresses\nipcMode\nips\nipv4Address\nipv4Addresses\nipv6Address\nipv6Addresses\nipv6Cidrs\nisAbstract\nisActive\nisAlias\nisAlreadyVerified\nisApiKeyAuthSupported\nisArchived\nisArray\nisAttached\nisAuthenticated\nisAutoIncrement\nisAwsOrgEnabled\nisBasicAuthSupported\nisBigEndian\nisBinaryFile\nisBootDisk\nisCancelled\nisCaseSensitive\nisComplete\nisConcurrent\nisConflict\nisCreatable\nisCurrency\nisCustomAuthSupported\nisDefault\nisDefaultVersion\nisDefaultedOnCreate\nisDefinedInJob\nisDeprecated\nisDisabled\nisDrill\nisEnabled\nisEncrypted\nisEngineDefault\nisExternalId\nisFinal\nisFromAutoSnapshot\nisHasManyIndex\nisImported\nisInherited\nisJoinTable\nisLastOp\nisLatestForTarget\nisLongDurationTest\nisMainNode\nisMerged\nisModifiable\nisMonitoredByJob\nisMove\nisNative\nisNonModelSupported\nisNullable\nisOAuth2Supported\nisOptedOut\nisPeered\nisPreferred\nisPrimary\nisPrimaryKey\nisPrivateLinkEnabled\nisPrivateLinkEndpointUrlRequired\nisPublic\nisQueryable\nisRecursive\nisRedshiftServerless\nisRelationshipSupported\nisRequired\nisRequiredInEntity\nisReservedMinutesCustomer\nisResourceTypeDefault\nisResumable\nisRetrievable\nisRevoked\nisRoot\nisSandboxEnvironment\nisSchemaInitialized\nisSemVer\nisSensitiveField\nisServiceLimited\nisSigned\nisSingleton\nisStaticIp\nisStoredExternally\nisSuppressed\nisSystemDisk\nisTerminal\nisTerminated\nisTimeSeries\nisTimestampFieldForIncrementalQueries\nisTruncated\nisTunable\nisUpdatable\nisUpsertable\nisValid\nisolationMode\nisp\nissueCode\nissueType\nissuedAt\nissuer\nissuerCA\nissuerCertificateIdentifier\nissuerCertificateSerialNumber\nissuerCertificateSubject\nissuerId\nissuerUrl\nissues\nissuesEnabled\nissuingAccount\nitem\nitemAttribute\nitemCount\nitemCounts\nitemExplorationConfig\nitemId\nitemList\nitems\niteratorType\njob\njobArn\njobConfiguration\njobCreationDate\njobDefinition\njobDefinitionArn\njobDefinitionName\njobDefinitions\njobDetails\njobDocument\njobDriver\njobError\njobExecutionSummary\njobExecutionTimeoutMinutes\njobExecutionsRetryConfig\njobExecutionsRolloutConfig\njobExpiresAt\njobID\njobIDs\njobId\njobIdentifier\njobIds\njobImminentExpirationHealthEventArn\njobInput\njobInvoker\njobLastUpdateDate\njobMetadata\njobName\njobOutput\njobOutputPath\njobOwner\njobParameters\njobParams\njobPausedAt\njobPort\njobProcessDetails\njobProperties\njobQueue\njobQueueArn\njobQueueName\njobQueues\njobReason\njobRoleArn\njobRun\njobRunId\njobRuns\njobStatus\njobSummaries\njobSummary\njobSummaryList\njobTags\njobTemplate\njobTemplateArn\njobTemplateData\njobTemplateId\njobTemplateParameters\njobTemplates\njobTimeout\njobTimeoutMinutes\njobToken\njobType\njobUser\njobWorkerExecutorConfiguration\njobs\njoinColumns\njoinRequired\njsonConfiguration\njsonInputTemplate\njsonKeyToVariableMap\njsonPath\njumboFrameCapable\njwtToken\nkafka\nkafkaCluster\nkafkaClusterClientAuthentication\nkafkaClusterEncryptionInTransit\nkafkaConnectVersion\nkeepEmptyFolders\nkendraConfiguration\nkendraIndex\nkernelVersion\nkey\nkeyAlgorithm\nkeyArn\nkeyId\nkeyName\nkeyPair\nkeyPairName\nkeyPairs\nkeyPolicies\nkeyPrefix\nkeyRole\nkeyTemplate\nkeyType\nkeyTypes\nkeyUsage\nkeyValue\nkeyspaceName\nkeyspaces\nkeyword\nkeywordInputType\nkeywordValue\nkeywords\nkind\nkinesis\nkinesisStreamArn\nkmsArn\nkmsEncryptionKeyArn\nkmsError\nkmsKey\nkmsKeyArn\nkmsKeyId\nkmsKeyIdentifier\nkmsManaged\nkmsMasterKeyId\nknowledgeBase\nknowledgeBaseArn\nknowledgeBaseId\nknowledgeBaseSummaries\nknowledgeBaseType\nknownDependencyCount\nkubernetesNamespace\nkubernetesNetworkConfig\nkubernetesVersion\nkxChangesets\nkxClusterSummaries\nkxDatabases\nlabMode\nlabel\nlabelDecorator\nlabelMapper\nlabelSchema\nlabelTimestamp\nlabels\nlagDuration\nlagId\nlagName\nlagState\nlags\nlambda\nlambdaARN\nlambdaAction\nlambdaArn\nlambdaAuthorizerConfig\nlambdaCode\nlambdaCodeHook\nlambdaConfig\nlambdaConflictHandlerArn\nlambdaConflictHandlerConfig\nlambdaEventStructureVersion\nlambdaExecutorConfiguration\nlambdaFunction\nlambdaFunctionArn\nlambdaFunctionCompletedEventAttributes\nlambdaFunctionExecutionRoleArn\nlambdaFunctionFailedEventAttributes\nlambdaFunctionFailedEventDetails\nlambdaFunctionInfo\nlambdaFunctionLastModifiedAt\nlambdaFunctionLayers\nlambdaFunctionName\nlambdaFunctionRecommendations\nlambdaFunctionRuntime\nlambdaFunctionScheduleFailedEventDetails\nlambdaFunctionScheduledEventAttributes\nlambdaFunctionScheduledEventDetails\nlambdaFunctionStartFailedEventDetails\nlambdaFunctionStartedEventAttributes\nlambdaFunctionSucceededEventDetails\nlambdaFunctionTags\nlambdaFunctionTimedOutEventAttributes\nlambdaFunctionTimedOutEventDetails\nlambdaName\nlambdaRole\nlambdaTags\nlambdaTarget\nlanguage\nlanguageAvailability\nlanguages\nlargeDataDeliveryS3Config\nlargeVolumeConf\nlastAccess\nlastActivityDate\nlastActivityTimeStamp\nlastAnalyzedTimestamp\nlastAppComplianceEvaluationTime\nlastAssessmentRunArn\nlastAttemptTime\nlastAttemptedDeployment\nlastAttemptedDeploymentId\nlastAutomatedDiscoveryTime\nlastBuildSubmittedDateTime\nlastByteReceived\nlastChangedAt\nlastChangedBy\nlastClientRequestToken\nlastCompletedChangesetId\nlastContentModificationTime\nlastCutover\nlastDeployTime\nlastDeploymentAttemptedAt\nlastDeploymentJob\nlastDeploymentStatus\nlastDeploymentSucceededAt\nlastDeploymentTime\nlastDisabledTime\nlastDriftEvaluationTime\nlastEnabledTime\nlastErrorCode\nlastErrorMessage\nlastEvaluatedAt\nlastEventId\nlastEventTimestamp\nlastHealthPingTime\nlastHeartbeatTime\nlastIngestionTime\nlastInstallationSource\nlastJobId\nlastJobRunTime\nlastKnownExploitAt\nlastLaunch\nlastLaunchResult\nlastLoginTime\nlastMessageArrivalTime\nlastModelRefreshDate\nlastModificationTime\nlastModified\nlastModifiedAt\nlastModifiedBy\nlastModifiedDate\nlastModifiedDateTime\nlastModifiedOn\nlastModifiedSecret\nlastModifiedTime\nlastModifiedTimestamp\nlastModifiedUser\nlastName\nlastObservedAt\nlastReachedOutAt\nlastRecordedPullTime\nlastRecovery\nlastRecoveryResult\nlastReferencedTime\nlastRefreshTimestamp\nlastReportedTimestamp\nlastResiliencyScoreEvaluationTime\nlastResourceAnalyzed\nlastResourceAnalyzedAt\nlastRunErrorStatus\nlastRunExecutionDetails\nlastRunMetadataCatalogDetails\nlastRunTime\nlastScannedAt\nlastSeen\nlastSeenAt\nlastSeenByServiceDateTime\nlastSeenDatetime\nlastSnapshotDateTime\nlastStartTime\nlastStartedAt\nlastStatisticsComputationTime\nlastStatus\nlastStatusChange\nlastStatusChangeDate\nlastStatusChangeTime\nlastStatusChangeTimestamp\nlastStatusUpdateTimestamp\nlastStopTime\nlastSucceededDeploymentId\nlastSuccessfulComponentDeploymentIds\nlastSuccessfulDeployment\nlastSuccessfulEnvironmentDeploymentId\nlastSuccessfulMergeDate\nlastSuccessfulServicePipelineDeploymentId\nlastSuccessfulTime\nlastSyncedAt\nlastTest\nlastTriggered\nlastTrxTimestampInMillis\nlastUpdateDate\nlastUpdateDateTime\nlastUpdateTime\nlastUpdateToPayPerRequestTimestamp\nlastUpdated\nlastUpdatedAt\nlastUpdatedBy\nlastUpdatedDataTime\nlastUpdatedDate\nlastUpdatedDateTime\nlastUpdatedOn\nlastUpdatedTime\nlastUpdatedTimes\nlastUpdatedTimestamp\nlastUsed\nlastUsedDate\nlastUsedIntent\nlastUsedTime\nlastUtteredDate\nlastValidByteReceived\nlastViolationTime\nlastViolationValue\nlat\nlateDataRules\nlatency\nlatencyMode\nlaterTime\nlatestActivityTaskTimestamp\nlatestAgentOrchestratedAt\nlatestAgentProfileReportedAt\nlatestAggregatedProfile\nlatestAmiId\nlatestBlockers\nlatestBotVersion\nlatestCampaignUpdate\nlatestCancelRequestedEventId\nlatestDatasetUpdate\nlatestDate\nlatestDescription\nlatestExecution\nlatestExecutionContext\nlatestLaunchTime\nlatestRecommenderUpdate\nlatestReplicationTime\nlatestRestorableTime\nlatestRevision\nlatestSolutionVersion\nlatestSuccessfulSync\nlatestSync\nlatestValidationTime\nlatestVersion\nlatestVersionId\nlatitude\nlaunch\nlaunchActionsStatus\nlaunchConfig\nlaunchConfigurationStatus\nlaunchConfigurationTemplate\nlaunchConfigurationTemplateID\nlaunchConfigurationTemplateIDs\nlaunchCount\nlaunchDetails\nlaunchDisposition\nlaunchFile\nlaunchOrder\nlaunchPermission\nlaunchProfile\nlaunchProfileId\nlaunchProfileInitialization\nlaunchProfileProtocolVersion\nlaunchProfileProtocolVersions\nlaunchProfiles\nlaunchPurpose\nlaunchStatus\nlaunchStatusMessage\nlaunchTemplate\nlaunchTemplateConfigurations\nlaunchTemplateId\nlaunchTemplateName\nlaunchTemplateVersion\nlaunchTime\nlaunchType\nlaunchedAt\nlaunchedEc2InstanceID\nlaunchedInstance\nlaunchedVpcID\nlaunches\nlayerArn\nlayerArns\nlayerAvailability\nlayerDigest\nlayerDigests\nlayerHash\nlayerHashes\nlayerPartBlob\nlayerSize\nlayers\nlayoutArn\nlayoutConfiguration\nlayoutId\nlayouts\nlcmOpInfo\nlcmOperationType\nlearnMoreLink\nleastRecentEvent\nlength\nlevel\nlexTranscriptFilter\nlicenseConfigurationArns\nlicenseCostReduction\nlicenseEdition\nlicenseExpiration\nlicenseModel\nlicenseName\nlicenseRecommendationOptions\nlicenseRecommendations\nlicenseType\nlicenseUrl\nlicenseVersion\nlicenses\nlicensing\nlifeCycle\nlifeCycleStates\nlifecycle\nlifecycleConfiguration\nlifecycleEventHookExecutionId\nlifecycleEventName\nlifecycleEvents\nlifecyclePolicyText\nlifecycleState\nlifecycleStateDetails\nlifecycleStatusCodes\nlimit\nlimitCode\nlimits\nline\nlineCoveragePercentage\nlineNumber\nlineRange\nlineRanges\nlineSep\nlinearInterval\nlinearPercentage\nlinesCovered\nlinesMissed\nlink\nlinkOutUri\nlinkedToGitHub\nlinks\nlinux\nlinuxMountPoint\nlinuxParameters\nlinuxProcessParams\nlistAntipatternSeveritySummary\nlistApplicationComponentStatusSummary\nlistApplicationComponentStrategySummary\nlistApplicationComponentSummary\nlistColumns\nlistServerStatusSummary\nlistServerStrategySummary\nlistServerSummary\nlistSuppressedAlerts\nlistSuppressedFindings\nlistValue\nlistenerArns\nlistenerIdentifier\nlistenerPorts\nlisteners\nlists\nloa\nloaContent\nloaContentType\nloaIssueTime\nloadBalancer\nloadBalancerArn\nloadBalancerDnsName\nloadBalancerInfo\nloadBalancerName\nloadBalancers\nloadId\nloadIds\nlocalPath\nlocalTraits\nlocale\nlocaleId\nlocaleName\nlocation\nlocationCode\nlocationName\nlocationStatus\nlocationType\nlocations\nlockId\nlog\nlogConfig\nlogConfiguration\nlogContext\nlogDateTime\nlogDelivery\nlogDriver\nlogEventMessages\nlogEvents\nlogExports\nlogGroup\nlogGroupArn\nlogGroupFields\nlogGroupIdentifier\nlogGroupIdentifiers\nlogGroupName\nlogGroupNamePattern\nlogGroupNamePrefix\nlogGroupNames\nlogGroups\nlogLevel\nlogOddsImpact\nlogOddsMetrics\nlogPrefix\nlogRecord\nlogRecordPointer\nlogResult\nlogSchemaVersion\nlogSettings\nlogStream\nlogStreamName\nlogStreamNamePrefix\nlogStreamNames\nlogStreams\nlogTail\nlogTarget\nlogTargetConfigurations\nlogType\nlogTypes\nlogUri\nlogUrl\nlogging\nloggingConfig\nloggingConfiguration\nloggingConfigurationIdentifier\nloggingConfigurationIdentifiers\nloggingConfigurations\nloggingLevel\nloggingOptions\nloggingOptionsPayload\nlogicalId\nlogicalResourceId\nlogicalStackName\nlogicalStackNames\nlogin\nloginValidityDuration\nlogo\nlogoImageBlob\nlogoURL\nlogoUrl\nlogonLanguage\nlogs\nlogsConfig\nlogsConfigOverride\nlon\nlongReturnType\nlongValue\nlongitude\nlookBackPeriodInDays\nlookbackPeriodInDays\nlow\nlowerBoundValue\nlowerBoundValues\nlowerInclusive\nlt\nlte\nmacAddress\nmacSecCapable\nmacSecKeys\nmain\nmainNode\nmaintenanceWindows\nmajorVersion\nmajorVersionNumber\nmanagedAgentName\nmanagedAgents\nmanagedCredentialsAction\nmanagedCredentialsStatus\nmanagedDataIdentifierIds\nmanagedDataIdentifierSelector\nmanagedDeviceArn\nmanagedDeviceId\nmanagedFields\nmanagedJobTemplates\nmanagedPersistenceMonitoringConfiguration\nmanagedPolicyArns\nmanagedScaling\nmanagedTerminationProtection\nmanagementAccountId\nmanagementPreference\nmanifest\nmanualEvidence\nmanualEvidenceCount\nmanufacturer\nmapAutoTaggingMpeID\nmapIterationAbortedEventDetails\nmapIterationFailedEventDetails\nmapIterationStartedEventDetails\nmapIterationSucceededEventDetails\nmapRunArn\nmapRunFailedEventDetails\nmapRunStartedEventDetails\nmapRuns\nmapStateStartedEventDetails\nmapValue\nmappedInputFields\nmappingType\nmarker\nmarkerName\nmarkerRecordedEventAttributes\nmarketplaceCertified\nmarketplaceInformation\nmaster\nmasterAccount\nmasterAccountId\nmasterDatabaseName\nmasterEndpoint\nmasterUserPassword\nmasterUsername\nmatch\nmatchCount\nmatchEquals\nmatchIDs\nmatchId\nmatchKey\nmatchResult\nmatched\nmatchedDevicesCount\nmatcher\nmatches\nmatchingBucket\nmatchingKeys\nmatchingResources\nmath\nmax\nmaxAccountLimitReached\nmaxAge\nmaxAttempts\nmaxBackupsToRetain\nmaxBatchSize\nmaxBuckets\nmaxConcurrency\nmaxConflictFiles\nmaxConnections\nmaxCpus\nmaxDepth\nmaxDevices\nmaxDuration\nmaxEjectionPercent\nmaxFileCount\nmaxFilesToKeep\nmaxGpus\nmaxHPONumberOfTrainingJobs\nmaxHPOParallelTrainingJobs\nmaxIdleTimeInSeconds\nmaxIndexingCapacityInOCU\nmaxInstancesCount\nmaxItems\nmaxJobDurationInSeconds\nmaxJobTimeoutMinutes\nmaxLength\nmaxLengthMs\nmaxLifetimeTimeoutMinutes\nmaxLineCoveragePercentage\nmaxMergeHunks\nmaxMessages\nmaxNodeCount\nmaxNumberOfTrainingJobs\nmaxPageSize\nmaxParallelLaunches\nmaxParallelTrainingJobs\nmaxParallelism\nmaxPendingRequests\nmaxQueueSize\nmaxRequests\nmaxResult\nmaxResults\nmaxRetries\nmaxRuns\nmaxRuntimeInSeconds\nmaxSampleCount\nmaxSearchCapacityInOCU\nmaxSeconds\nmaxServerErrors\nmaxSessionLengthInMinutes\nmaxSize\nmaxSizeInMB\nmaxSlots\nmaxStoppedSessionLengthInMinutes\nmaxSwap\nmaxUnavailable\nmaxUnavailablePercentage\nmaxValue\nmaxVersions\nmaxWorkerCount\nmaximum\nmaximumBuildsAllowed\nmaximumCapacity\nmaximumCount\nmaximumElevation\nmaximumMatchDistance\nmaximumMessageLength\nmaximumMessageRatePerSecond\nmaximumPageSize\nmaximumPerMinute\nmaximumPercent\nmaximumScalingStepSize\nmaximumTTL\nmaxvCpus\nmcuCount\nmd5\nmd5sum\nmeCollectorSummary\nmean\nmeanTimeToClose\nmeasurement\nmediaType\nmedium\nmember\nmemberAbilities\nmemberAccountId\nmemberAccounts\nmemberAccountsEnrolled\nmemberFileExtensions\nmemberStatus\nmemberSummaries\nmembers\nmembership\nmembershipArn\nmembershipId\nmembershipIdentifier\nmembershipStatus\nmembershipSummaries\nmemberships\nmemory\nmemoryGBHour\nmemoryInfo\nmemoryReservation\nmemorySize\nmemorySizeConfiguration\nmemorySizeInKB\nmemorySizeRecommendationOptions\nmerge\nmergeBase\nmergeCommitId\nmergeHunks\nmergeMetadata\nmergeOperations\nmergeOption\nmergeOptions\nmergeStrategy\nmergeType\nmergeable\nmergedApiArn\nmergedApiExecutionRoleArn\nmergedApiId\nmergedApiIdentifier\nmergedBy\nmergedCommitId\nmesh\nmeshName\nmeshOwner\nmeshes\nmessage\nmessageContent\nmessageExpiry\nmessageFormat\nmessageGroups\nmessageId\nmessageReviewHandler\nmessageReviewHandlerUri\nmessageSelectionStrategy\nmessageType\nmessageVersion\nmessages\nmeta\nmetaStoreManagerRoleArn\nmetadata\nmetadataCatalogConfig\nmetadataCatalogDetails\nmetadataKey\nmetadataOptions\nmetered\nmethod\nmethodIntegration\nmethodName\nmethodResponses\nmethodSettings\nmetric\nmetricArn\nmetricAttribution\nmetricAttributionArn\nmetricAttributions\nmetricData\nmetricDataPoints\nmetricDatumList\nmetricDefinition\nmetricDimension\nmetricFilterCount\nmetricFilters\nmetricGoals\nmetricMonitors\nmetricName\nmetricNames\nmetricNamespace\nmetricRegex\nmetricRuleRoleArn\nmetricTarget\nmetricTimestamp\nmetricTransformations\nmetricType\nmetricUnit\nmetricValue\nmetrics\nmetricsConfiguration\nmetricsEnabled\nmetricsOutputConfig\nmetricsResults\nmetricsSource\nmetricsSummary\nmfaAuthenticated\nmigrationEffort\nmigrationId\nmigrationStatus\nmigrationStatusEquals\nmigrationStrategy\nmigrationSummaries\nmigrationTimestamp\nmigrationWorkflowSummary\nmillisUntilNextRefreshable\nmimeType\nmin\nminLineCoveragePercentage\nminNodeCount\nminNumberOfExecutedThings\nminPower\nminProvisionedTPS\nminRecommendationRequestsPerSecond\nminSeconds\nminSize\nminValue\nminWorkerCount\nminimum\nminimumCompressionSize\nminimumCount\nminimumHealthyHosts\nminimumHealthyPercent\nminimumLinks\nminimumSamplingIntervalMs\nminimumScalingStepSize\nminimumTTL\nminimumTriggerIntervalMs\nminimumViableContactDurationSeconds\nminorVersion\nminvCpus\nmissedCount\nmissing\nmissingContextValues\nmissionProfileArn\nmissionProfileId\nmissionProfileList\nmixed\nmixin\nmlDetectionConfig\nmlModelTrainingJobId\nmlModelTransformJobId\nmlModels\nmodality\nmode\nmodel\nmodelArn\nmodelArnEquals\nmodelCustomizationJobSummaries\nmodelDetails\nmodelEndpoint\nmodelEndpointStatus\nmodelId\nmodelIdentifier\nmodelKmsKeyArn\nmodelManifestArn\nmodelMetrics\nmodelName\nmodelPerformance\nmodelScores\nmodelSource\nmodelStatus\nmodelSummaries\nmodelTransformJob\nmodelTransformOutputS3Location\nmodelType\nmodelUnits\nmodelVariables\nmodelVersion\nmodelVersionDetails\nmodelVersionNumber\nmodelVersions\nmodels\nmodernizeInfrastructureWithCloudNativeTechnologies\nmodes\nmodified\nmodifiedAt\nmodifiedCount\nmodifiedTimestamp\nmodifyVnfInfoData\nmodule\nmonitoredResourceInfo\nmonitoredResourceName\nmonitoringConfiguration\nmonth\nmonthlySchedule\nmonthlyTransfer\nmoreApplicationResource\nmoreInfo\nmoreServerAssociationExists\nmostRecentEvent\nmostRecentExecutionMessage\nmostRecentExecutionStatus\nmostRecentExecutionTime\nmountOptions\nmountPath\nmountPoint\nmountPoints\nmountROSysfs\nmqttContext\nmqttTopic\nmtu\nmultiLayerStorage\nmultiNodeJobId\nmultiTurnConversation\nmultiValueHeaders\nmultipleValuesSetting\nmustSucceedForCutover\nmutationsFilePath\nmutualTlsAuthentication\nname\nnameContains\nnamePattern\nnamePrefixFilter\nnameQuery\nnameServersUpdateState\nnamedShadowIndexingMode\nnamedShadowNames\nnames\nnamespace\nnamespaceArn\nnamespaceId\nnamespaceName\nnamespaceType\nnamespaceVersion\nnamespaces\nneedsReplacements\nnegative\nneighborConfigurationIds\nneighbors\nneptuneIamRoleArn\nneq\nnestedType\nnetMask\nnetmask\nnetwork\nnetworkAccessControl\nnetworkArn\nnetworkBindings\nnetworkConfiguration\nnetworkFileDefinitions\nnetworkFindings\nnetworkInfoList\nnetworkInstances\nnetworkInterface\nnetworkInterfaceId\nnetworkInterfaces\nnetworkInterfacesToAdd\nnetworkInterfacesToRemove\nnetworkInterfacesToUpdate\nnetworkMode\nnetworkName\nnetworkOperations\nnetworkOrigin\nnetworkPackages\nnetworkPath\nnetworkProfile\nnetworkProfileArn\nnetworkProfiles\nnetworkProtocol\nnetworkReachabilityDetails\nnetworkResource\nnetworkResourceArn\nnetworkResources\nnetworkSettings\nnetworkSettingsArn\nnetworkSite\nnetworkSiteArn\nnetworkSiteName\nnetworkSites\nnetworking\nnetworks\nneutral\nnewApplicationName\nnewApprovalRuleTemplateName\nnewAutoRegistrationStatus\nnewBGPPeer\nnewDeploymentGroupName\nnewDirectConnectGatewayName\nnewDiskName\nnewExecutionRunId\nnewFindings\nnewImageDescription\nnewImageDisplayName\nnewImageName\nnewImageTags\nnewName\nnewPrivateVirtualInterface\nnewPrivateVirtualInterfaceAllocation\nnewPublicVirtualInterface\nnewPublicVirtualInterfaceAllocation\nnewRevision\nnewRuleContent\nnewStatus\nnewTableName\nnewTransitVirtualInterface\nnewTransitVirtualInterfaceAllocation\nnewValue\nnext\nnextAttemptDateTime\nnextBackwardToken\nnextDeliveryTime\nnextDeployment\nnextForwardToken\nnextIndex\nnextMarker\nnextPageCount\nnextPageToken\nnextPeriod\nnextRefreshTime\nnextReplicationRunStartTime\nnextSequenceToken\nnextSnapshotTimeOfDay\nnextState\nnextStep\nnextToken\nnfc\nnluConfidence\nnluIntentConfidence\nnluIntentConfidenceThreshold\nnniPartnerType\nnoDevice\nnoEcho\nnoInlineDocumentSupport\nnoOfSrvCompleted\nnoOfSrvFailed\nnodeCount\nnodeCounts\nnodeDetails\nnodeGroup\nnodeId\nnodeIndex\nnodeLabels\nnodeName\nnodeOverrides\nnodeProperties\nnodePropertyOverrides\nnodeRangeProperties\nnodeRole\nnodeStructures\nnodeSummaries\nnodeType\nnodegroup\nnodegroupArn\nnodegroupName\nnodegroups\nnodes\nnodesToAdd\nnodesToRemove\nnodesToUpdate\nnonCompliantChecks\nnonCompliantResource\nnonCompliantResourcesCount\nnonModels\nnonce\nnoncompliantEvidenceCount\nnoradSatelliteID\nnotAfter\nnotBefore\nnotClassified\nnotFoundIdentifierIds\nnotSensitive\nnotShared\nnotValidAfter\nnotValidBefore\nnote\nnotification\nnotificationActions\nnotificationConfiguration\nnotificationContext\nnotificationDestinations\nnotificationEnabled\nnotificationEndpoint\nnotificationLambdaArn\nnotificationSenderEmail\nnotificationSettingKeys\nnotificationSettings\nnotificationTargets\nnotificationTriggers\nnotifications\nnotifyOnAddCorrespondenceToCase\nnotifyOnCaseSeverity\nnotifyOnCreateOrReopenCase\nnotifyOnResolveCase\nnsDescription\nnsInstanceDescription\nnsInstanceId\nnsInstanceName\nnsLcmOpOccId\nnsName\nnsState\nnsd\nnsdContent\nnsdDesigner\nnsdId\nnsdInfoId\nnsdInvariantId\nnsdName\nnsdOnboardingState\nnsdOperationalState\nnsdUsageState\nnsdVersion\nnullable\nnumBytes\nnumChangesets\nnumClasses\nnumDistinctPredicates\nnumDistinctSubjects\nnumEdgeLabels\nnumEdgeProperties\nnumEdges\nnumFiles\nnumNodeLabels\nnumNodeProperties\nnumNodes\nnumOfReports\nnumParallelProcesses\nnumQuads\nnumResults\nnumTurns\nnumValues\nnumVersions\nnumber\nnumberOfApplicationComponents\nnumberOfAssociatedServices\nnumberOfAssociatedVPCs\nnumberOfCanceledThings\nnumberOfConflicts\nnumberOfConnections\nnumberOfCores\nnumberOfDays\nnumberOfEvents\nnumberOfFailedThings\nnumberOfInProgressThings\nnumberOfInvocations\nnumberOfMemberAccountsOptedIn\nnumberOfNotifiedThings\nnumberOfQueuedThings\nnumberOfRecentAmisToKeep\nnumberOfRecordsFailed\nnumberOfRecordsSuccess\nnumberOfRecordsUpdated\nnumberOfRejectedThings\nnumberOfRemovedThings\nnumberOfRetries\nnumberOfRevisions\nnumberOfRuns\nnumberOfSucceededThings\nnumberOfTimedOutThings\nnumberOfTransactions\nnumberOfTurns\nnumbers\nnumericSeverity\noAuth2Credentials\noAuth2Defaults\noAuth2GrantType\noAuth2Properties\noAuthCredentials\noAuthProperties\noAuthRequest\noAuthScopes\noauth2\noauth2CustomProperties\noauth2GrantTypesSupported\noauthScopes\noauthToken\nobdInterface\nobdSignal\nobdStandard\nobfuscate\nobfuscationSetting\nobfuscationSettingType\nobject\nobjectCount\nobjectCountByEncryptionType\nobjectFields\nobjectId\nobjectIds\nobjectKey\nobjectName\nobjectPath\nobjectPrefixes\nobjectType\nobjectTypeConflict\nobjectTypeName\nobjectTypes\nobjectVersion\nobjectVersioning\nobjectiveSensitivity\nobjects\noccurrences\noccurrencesThreshold\noemData\noffering\nofferingClass\nofferingId\nofferingIds\nofferingPromotionId\nofferingPromotions\nofferingStatus\nofferingTransaction\nofferingTransactions\nofferings\noffset\noffsetInNanos\noffsetRange\noffsetRanges\noffsetSeconds\nofi\noidc\noldApprovalRuleTemplateName\noldName\noldestDate\nonEnter\nonExit\nonExitCode\nonFailure\nonInput\nonPremisesInstanceTagFilters\nonPremisesTagSet\nonPremisesTagSetList\nonReason\nonStatusReason\nonboardingState\noneTime\nonlineAbConfig\nonlineAbDefinition\nonlyActiveViolationsIncluded\nonlyAssociated\nop\nopNum\nopenActivityTasks\nopenChildWorkflowExecutions\nopenCounts\nopenCypherQuery\nopenDecisionTasks\nopenFindings\nopenIDConnectConfig\nopenIdIssuer\nopenLambdaFunctions\nopenPortRange\nopenSearch\nopenSearchServiceConfig\nopenTimers\nopencypher\noperand\noperandType\noperatingSystem\noperatingSystemFamily\noperatingSystems\noperation\noperationDetails\noperationId\noperationIdentifier\noperationName\noperationState\noperationSucceeded\noperationType\noperationalState\noperations\noperator\noptimizationObjective\noptimizationType\noptimizedStagingDiskType\noption\noptional\noptions\nor\norder\norderArn\norderBy\norderByTime\norderedResources\norders\norg\norgPackagePaths\norganizationArns\norganizationEntityAccountFilters\norganizationEntityAggregates\norganizationEntityFilters\norganizationEventDetailFilters\norganizationId\norganizationRoleName\norganizationalUnitArns\norganizationalUnitDistinguishedName\norganizationalUnits\norientation\norigin\noriginAccountID\noriginApprovalRuleTemplate\noriginAvailabilityZone\noriginConfiguration\noriginEnvironment\noriginPublicDNS\noriginRegion\noriginType\noriginalDiskPath\noriginalMessage\noriginalStatusCode\noriginalValue\noriginatingRequestId\norphanedResources\nos\nosByol\nosDriver\nosInfo\nosType\nosVersion\notaUpdateArn\notaUpdateFiles\notaUpdateId\notaUpdateInfo\notaUpdateStatus\notaUpdates\noutboundCallConfig\noutcomes\noutdatedInstancesStrategy\nouterPadding\noutgoingCertificates\noutlierDetection\noutpostArns\noutpostConfig\noutput\noutputArtifactDetails\noutputArtifacts\noutputConfiguration\noutputConstraints\noutputContexts\noutputDataConfig\noutputDetails\noutputFileUriValue\noutputFormat\noutputLocation\noutputModalities\noutputModelArn\noutputModelKmsKeyArn\noutputModelName\noutputNode\noutputPath\noutputResources\noutputS3Bucket\noutputS3BucketName\noutputS3Directory\noutputS3KeyPrefix\noutputS3Path\noutputS3Uri\noutputSourceConfig\noutputToken\noutputType\noutputUri\noutputVariableName\noutputVariables\noutputs\noverallStatus\noverallTestResults\noverridden\noverrideAlarmConfiguration\noverrideAllowedPrefixesToDirectConnectGateway\noverrideArtifactName\noverrideDynamicGroups\noverrideFormat\noverrideLinkOutUri\noverrideStatus\noverrider\noverrides\nownedBy\nowner\nownerAccount\nownerArn\nownerContact\nownerFilter\nownerId\nownerIdentifier\nownerInfo\nowners\nownershipVerificationCertificateArn\nowningAccountId\npackage\npackageArn\npackageCleanup\npackageContent\npackageFormat\npackageManager\npackageName\npackageNames\npackagePaths\npackagePrefix\npackageSummaries\npackageType\npackageVersion\npackageVersionArn\npackageVersionRevision\npackageVersionSummaries\npackageVulnerabilityDetails\npackages\npackaging\npacketsDropped\npage\npageNumber\npageSize\npageToken\npagerDutyIncidentConfiguration\npages\npaginated\npaginationConfig\nparallelRun\nparallelism\nparallelismConfig\nparameter\nparameterApplyStatus\nparameterConfiguration\nparameterKey\nparameterName\nparameterObjects\nparameterSets\nparameterTemplate\nparameterType\nparameterValue\nparameterValues\nparameters\nparams\nparent\nparentAssetId\nparentBotNetworks\nparentCommitId\nparentConnectionId\nparentEntityId\nparentEntityUpdate\nparentGroup\nparentGroupName\nparentGroupNames\nparentId\nparentIdentifier\nparentImage\nparentInitiatedEventId\nparentIntentSignature\nparentResourceName\nparentSlotTypeSignature\nparentTargetArn\nparentWorkflowExecution\nparents\nparquetConfiguration\nparserConfiguration\nparsingResultUrl\npartFirstByte\npartLastByte\npartNumber\npartSize\npartSource\npartial\nparticipant\nparticipantId\nparticipantToken\nparticipantTokenConfigurations\nparticipantTokens\nparticipants\nparticipatingResourceID\nparticipatingResources\nparticipatingServers\npartition\npartitionColumns\npartitionKey\npartitionKeys\npartitionRegistrationOutput\npartitions\npartner\npartnerName\nparts\npassed\npassthroughBehavior\npassword\npasswordData\npasswordVersion\npasteAllowed\npatchOperations\npath\npathFormat\npathMatch\npathPart\npathPrefixHierarchy\npathWithQueryString\npattern\npayload\npayloadField\npayloadFormat\npayloadFormatIndicator\npayloadSize\npayloadUrl\npayloadVersion\npayloads\npaymentOption\npaymentOptions\npemEncodedCertificate\npending\npendingCount\npendingMaintenance\npendingMaintenanceActions\npendingModifiedValues\npendingPlan\npendingPricingPlan\npendingRequestCount\npendingRequests\npendingTasksCount\nperRequest\nperRetryTimeout\npercent\npercentComplete\npercentDone\npercentPromotedItems\npercentTraffic\npercentageAdjust\npercentageComplete\npercentageProgress\npercentiles\npercents\nperformAutoML\nperformHPO\nperformanceRisk\nperiod\nperiodInSeconds\nperiodMs\npermission\npermissionArn\npermissionArns\npermissionConfiguration\npermissionGroup\npermissionGroupId\npermissionGroupParams\npermissionGroups\npermissionModel\npermissionStatus\npermissionType\npermissionVersion\npermissions\npersistentAppUI\npersistentStorage\npersona\npersonalizedRanking\nphaseStatus\nphaseType\nphases\nphoneNumber\nphoneNumbers\nphrase\nphysicalConnectorType\nphysicalNetworkInterfaceId\nphysicalNetworkInterfaces\nphysicalResource\nphysicalResourceId\nphysicalResources\npid\npidMode\npidRequestIntervalSeconds\npidResponseLength\npinned\npipeline\npipelineActivities\npipelineActivity\npipelineArn\npipelineCodebuildRoleArn\npipelineConfig\npipelineConfigurationTimeStamp\npipelineContext\npipelineDescriptionList\npipelineExecution\npipelineExecutionId\npipelineExecutionStartCondition\npipelineExecutionSummaries\npipelineId\npipelineIdList\npipelineIds\npipelineInfoList\npipelineName\npipelineObjects\npipelineProvisioning\npipelineProvisioningRepository\npipelineServiceRoleArn\npipelineSummaries\npipelineType\npipelineVersion\npipelines\npitPolicy\nplaceholder\nplacement\nplacementConstraints\nplacementGroup\nplacementName\nplacementStrategy\nplacementTemplate\nplacements\nplainTextMessage\nplanDescription\nplanType\nplanTypes\nplatform\nplatformCapabilities\nplatformDevices\nplatformDifferences\nplatformDisplayName\nplatformFamily\nplatformId\nplatformOverride\nplatformVersion\nplatformVersions\nplatforms\nplaybackUrl\npluginId\nplugins\npodExecutionRoleArn\npodName\npodProperties\npointInTimeRecovery\npointInTimeRecoveryOverride\npointInTimeSnapshotDateTime\npolarization\npolicies\npolicy\npolicyArn\npolicyDescription\npolicyDetails\npolicyDocument\npolicyDocuments\npolicyGenerationDetails\npolicyGenerations\npolicyId\npolicyName\npolicyNamesToAdd\npolicyNamesToSkip\npolicyRevision\npolicySizeBytes\npolicyStatementsTemplate\npolicyStoreId\npolicyStores\npolicyTemplate\npolicyTemplateId\npolicyTemplates\npolicyText\npolicyType\npolicyVersion\npolicyVersionId\npolicyVersionIdentifier\npolicyVersions\npollingAccounts\npollingDisabledAt\npollingServicePrincipals\nport\nportEncryptionStatus\nportForwardingConfig\nportInfo\nportInfoSource\nportInformationNeeded\nportInfos\nportMapping\nportMappings\nportName\nportNumber\nportRange\nportStates\nportal\nportalArn\nportalAuthMode\nportalClientId\nportalContactEmail\nportalCreationDate\nportalDescription\nportalEndpoint\nportalId\nportalLastUpdateDate\nportalLogoImage\nportalLogoImageFile\nportalLogoImageLocation\nportalName\nportalStartUrl\nportalStatus\nportalSummaries\nportals\nports\nposition\npositive\nposixUser\npostCodeHookSpecification\npostDirectional\npostFulfillmentStatusSpecification\npostLaunchActions\npostLaunchActionsLaunchStatusList\npostLaunchActionsStatus\npostLaunchEnabled\npostLaunchFile\npostPassEndTime\npostTriggerCollectionDuration\npostalCode\npostalCodePlus4\npostedDate\npower\npowerId\npowers\npreDirectional\npreLaunchFile\nprePassStartTime\npreProvisioningHook\npreSignedUrl\nprecision\npredicate\npredicateCount\npredicates\npredictedLabel\npredictedScores\npredictedValue\npredictionExplanations\npredictionTimeRange\npredictionTimestamp\npreferences\npreferredBackupWindow\npreferredMaintenanceWindow\npreferredRegion\nprefix\nprefixConfig\nprefixFormat\nprefixListIds\nprefixType\nprerequisite\npreserve\npreserveNulls\npreserveSourceDataTyping\npreset\npresignedUrlConfig\npreviewAgentsArn\npreviewResults\npreviewStatus\npreviewToken\nprevious\npreviousDataProcessingJobId\npreviousEventId\npreviousModelTrainingJobId\npreviousOwnedBy\npreviousRevision\npreviousStartedEventId\nprice\npricingMode\npricingTier\npricingUnit\nprimaryArtifact\nprimaryDevice\nprimaryEmail\nprimaryKey\nprimaryKeyColumns\nprimaryKeys\nprimaryRegistryAlias\nprimaryTaskSet\nprincipal\nprincipalArn\nprincipalEntityType\nprincipalId\nprincipalSubscriber\nprincipals\nprintAllowed\npriorBuildSummaryList\nprioritizeBusinessGoals\npriority\nprivateConnectionProvisioningState\nprivateDnsName\nprivateDomainName\nprivateIpAddress\nprivateIpAddresses\nprivateIpv4Address\nprivateKey\nprivateKeyBase64\nprivateLinkServiceName\nprivateRegistryAccess\nprivateRepository\nprivileged\nprivilegedMode\nprivilegedModeOverride\nproblems\nprocessBehavior\nprocessedDataS3Location\nprocessedRecordsCount\nprocessingConfig\nprocessingConfiguration\nprocessingInstanceType\nprocessingInstanceVolumeSizeInGB\nprocessingJob\nprocessingTargets\nprocessingTimeOutInSeconds\nprodTrafficRoute\nproductCode\nproductId\nproductType\nproductTypes\nproductUrl\nproductionBranch\nproducts\nprofile\nprofileArn\nprofileEndTime\nprofileId\nprofileName\nprofileOwner\nprofileProperties\nprofileStartTime\nprofileTimes\nprofileToken\nprofileUpdatedAt\nprofileVersion\nprofileVersionArn\nprofiles\nprofilingEnabled\nprofilingGroup\nprofilingGroupName\nprofilingGroupNames\nprofilingGroups\nprofilingStatus\nprogress\nprogressDetail\nprogressInMegaBytes\nprogressPercentage\nprogressStatus\nproject\nprojectArn\nprojectCreationDate\nprojectDescription\nprojectId\nprojectInformation\nprojectLastUpdateDate\nprojectName\nprojectRole\nprojectSummaries\nprojectTemplateId\nprojectVisibility\nprojectedMetrics\nprojectedUtilizationMetrics\nprojects\nprojectsNotFound\nprometheusEndpoint\npromotionName\npromotions\nprompt\npromptAttemptsSpecification\npromptSpecification\npropagateTags\nproperties\npropertiesFileContent\nproperty\npropertyAlias\npropertyDefinitions\npropertyFilters\npropertyGroupName\npropertyGroupUpdates\npropertyGroups\npropertyId\npropertyName\npropertyNames\npropertyNotificationState\npropertyReference\npropertyUnit\npropertyUpdates\npropertyValue\npropertyValues\nproposalId\nproposalState\nprotectedQueries\nprotectedQuery\nprotectedQueryIdentifier\nprotectedTasks\nprotectionEnabled\nprotocol\nprotocolDefinition\nprotocolName\nprotocolPolicy\nprotocolVersion\nprotocols\nprotonServiceRoleArn\nprovider\nproviderARNs\nproviderArn\nproviderIdentity\nproviderName\nproviders\nprovisionedCapacity\nprovisionedModelArn\nprovisionedModelId\nprovisionedModelName\nprovisionedModelSummaries\nprovisionedResources\nprovisioning\nprovisioningEngine\nprovisioningRepository\nprovisioningRoleArn\nproxyConfiguration\nproxyEndpoint\npseudoTerminal\npublicAccess\npublicAccessBlock\npublicAccessCidrs\npublicDnsName\npublicDomainNames\npublicEndpoint\npublicIp\npublicIpAddress\npublicIpAddresses\npublicKey\npublicKeyBase64\npublicKeyMaterial\npublicPorts\npublicProjectAlias\npubliclyAccessible\npubliclyAccessibleCount\npubliclyReadable\npubliclyWritable\npublish\npublishAttributionMetricsToS3\npublishClassificationFindings\npublishFindingToSnsParams\npublishPolicyFindings\npublished\npublishedTime\npublisher\npublishers\npullRequest\npullRequestCreatedEventMetadata\npullRequestEnvironmentName\npullRequestEventType\npullRequestEvents\npullRequestId\npullRequestIds\npullRequestMergedStateChangedEventMetadata\npullRequestSourceReferenceUpdatedEventMetadata\npullRequestStatus\npullRequestStatusChangedEventMetadata\npullRequestTargets\npullStartedAt\npullStoppedAt\npullThroughCacheRules\npurchaseTime\npurchasingOption\npushedAt\nputAssetPropertyValueEntries\nputFailuresCount\nputFiles\nputItem\nqos\nqualificationReportDownloadUrl\nqualities\nquality\nquantity\nquantumTaskArn\nquantumTasks\nqueries\nqueriesFilePath\nquery\nqueryAction\nqueryCompileError\nqueryDefinitionId\nqueryDefinitionNamePrefix\nqueryDefinitions\nqueryEvalStats\nqueryFilterString\nqueryFilterStringEnabled\nqueryId\nqueryLogStatus\nqueryOptions\nqueryParam\nqueryParameters\nqueryParser\nqueryStatement\nqueryString\nqueryStringsAllowList\nqueryText\nqueryVersion\nqueryable\nqueue\nqueueInfo\nqueuePolicy\nqueuePriority\nqueueRequest\nqueueSize\nqueueUrl\nqueueUrls\nqueuedAt\nqueuedJobs\nqueuedTimeoutInMinutes\nqueuedTimeoutInMinutesOverride\nquota\nquotaCode\nquotaName\nquotaValue\nquote\nquoteAll\nr53HostedZoneDeletionState\nradio\nradios\nramBytes\nramPerformanceMetricBasis\nramResourceShareRegion\nramSizeInGb\nrandomizationSalt\nrange\nrangeKeyField\nrangeKeyType\nrangeKeyValue\nrank\nrate\nrateIncreaseCriteria\nrateLimit\nrawData\nrawError\nrawValue\nrdsHttpEndpointConfig\nreaction\nreactionCounts\nreactionUserArn\nreactionUsers\nreactionValue\nreactionsForComment\nreactionsFromDeletedUsersCount\nreadCapacityUnits\nreadOnly\nreadOnlyRootFilesystem\nreadOptions\nreadSetId\nreadSets\nreadme\nreadonlyAccessAccounts\nreadonlyRootFilesystem\nreason\nreasonCode\nreasonCodeSummaries\nreasonForNonCompliance\nreasonForNonComplianceCode\nreasons\nrebootAfterUse\nreceiverAccountId\nreceiverArn\nrecentCommunications\nrecentIntentSummaryView\nrecipe\nrecipeArn\nrecipeList\nrecipeOutputFormat\nrecipeProvider\nrecipeType\nrecipes\nrecipients\nrecognizedBotMember\nrecommendation\nrecommendationCompliance\nrecommendationExportJobs\nrecommendationId\nrecommendationIds\nrecommendationOptions\nrecommendationPreferenceNames\nrecommendationPreferences\nrecommendationPreferencesDetails\nrecommendationReportDetails\nrecommendationResourceType\nrecommendationSet\nrecommendationSourceArn\nrecommendationSourceType\nrecommendationSources\nrecommendationStatus\nrecommendationSummaries\nrecommendationTemplate\nrecommendationTemplateArn\nrecommendationTemplates\nrecommendationTypes\nrecommendations\nrecommended\nrecommendedActions\nrecommendedCpuUnits\nrecommendedInstanceType\nrecommendedMemorySize\nrecommendedMinorVersion\nrecommendedOptionProjectedMetrics\nrecommendedVersion\nrecommender\nrecommenderArn\nrecommenderConfig\nrecommenders\nrecord\nrecordAllRosTopics\nrecordFormat\nrecordIndex\nrecordLength\nrecordMarkerDecisionAttributes\nrecordMarkerFailedEventAttributes\nrecordNumber\nrecording\nrecordingConfiguration\nrecordingConfigurationArn\nrecordingConfigurations\nrecordingGroup\nrecordingMode\nrecordingReconnectWindowSeconds\nrecordingStrategy\nrecords\nrecordsMatched\nrecordsNotProcessed\nrecordsProcessed\nrecordsScanned\nrecoveryInstanceID\nrecoveryInstanceIDs\nrecoveryInstanceId\nrecoveryInstanceProperties\nrecoveryPoint\nrecoveryPointCreateTime\nrecoveryPointId\nrecoveryPoints\nrecoverySnapshotID\nrecurringCharges\nrecurringPaymentAmount\nrecursive\nredirectUri\nreduceOperationalOverheadWithManagedServices\nref\nrefValue\nreference\nreferenceArn\nreferenceId\nreferenceStoreId\nreferenceStores\nreferenceType\nreferenceURLs\nreferenceUrls\nreferencedBy\nreferencedTables\nreferences\nrefreshAfterInSeconds\nrefreshToken\nrefreshTokenBody\nregex\nregexConfiguration\nregexFilter\nregion\nregionFilter\nregionList\nregionMap\nregionName\nregionalCertificateArn\nregionalCertificateName\nregionalDomainName\nregionalHostedZoneId\nregions\nregisterAccountStatus\nregisterTime\nregisteredAt\nregisteredBy\nregisteredContainerInstancesCount\nregisteredDomainDelegationInfo\nregisteredResources\nregisteredTime\nregisteredTimeStamp\nregistrationCode\nregistrationConfig\nregistrationStatus\nregistries\nregistry\nregistryArn\nregistryCatalogData\nregistryCredential\nregistryCredentialOverride\nregistryId\nregistryIds\nregistryLogin\nregistryScanningConfiguration\nregistryUri\nrejectDate\nrejectReason\nrejectedLogEventsInfo\nrejectionStatement\nrel\nrelatedDeployments\nrelatedEvents\nrelatedItemArn\nrelatedItemData\nrelatedItemId\nrelatedItems\nrelatedItemsUpdate\nrelatedJoinFieldName\nrelatedJoinTableName\nrelatedModelFields\nrelatedModelName\nrelatedResources\nrelatedVulnerabilities\nrelationalDatabase\nrelationalDatabaseAvailabilityZones\nrelationalDatabaseBlueprintId\nrelationalDatabaseBundleId\nrelationalDatabaseConfig\nrelationalDatabaseEvents\nrelationalDatabaseName\nrelationalDatabaseSnapshot\nrelationalDatabaseSnapshotName\nrelationalDatabaseSnapshots\nrelationalDatabaseSourceType\nrelationalDatabases\nrelationship\nrelationshipName\nrelationshipStatus\nrelationshipType\nrelationshipValue\nrelationships\nrelativeAggregationDuration\nrelativeFileVersion\nrelativeImpact\nrelativePath\nrelease\nreleaseLabel\nreleaseVersion\nrelevanceLevel\nrelevanceScore\nremaining\nremainingResources\nremediation\nremoteAccess\nremoteAccessAllowed\nremoteAccessEnabled\nremoteAccessSecurityGroup\nremoteAccessSession\nremoteAccessSessionArn\nremoteAccessSessions\nremoteDebugEnabled\nremoteModelTransformJob\nremoteParticipantId\nremoteRecordAppArn\nremoteRecordEnabled\nremoteSourceCodeAnalysisServerConfigurationTimestamp\nremoteSourceCodeAnalysisServerInfo\nremovableAttributes\nremoveAllowedPrefixesToDirectConnectGateway\nremoveAttributes\nremoveAuthorizerConfig\nremoveAutoRegistration\nremoveLabels\nremoveMetrics\nremoveNetworkAccessConfiguration\nremoveOverrideLinkOutUri\nremovePreProvisioningHook\nremoveSecurityGroupIds\nremoveSegment\nremoveSubnetIds\nremoveTaints\nremoveThingType\nremoveVariations\nremoveVpcConfiguration\nrenderConfig\nrenderTypeDeclarations\nrendererType\nrenderingConfiguration\nrenderingEngine\nrenditionConfiguration\nrenditionSelection\nrenditions\nrenewalStatus\nrenewalStatusReason\nrenewalSummary\nreplace\nreplaceContents\nreplaceDefaultPolicyVersionParams\nreplacePermissionAssociationsWork\nreplacePermissionAssociationsWorks\nreplacementOrderArn\nreplacementType\nreplicated\nreplicatedDisks\nreplicatedExternally\nreplicatedStorageBytes\nreplicationAccounts\nreplicationConfiguration\nreplicationConfigurationStatus\nreplicationConfigurationTemplateID\nreplicationConfigurationTemplateIDs\nreplicationDetails\nreplicationDirection\nreplicationJob\nreplicationJobId\nreplicationJobList\nreplicationJobTerminated\nreplicationRegions\nreplicationRunId\nreplicationRunList\nreplicationServerInstanceType\nreplicationServersSecurityGroupsIDs\nreplicationSet\nreplicationSetArns\nreplicationSpecification\nreplicationStartedDateTime\nreplicationStatus\nreplicationStatusDetails\nreplicationStatusMessage\nreplicationStatuses\nreplicationStrategy\nreplicationType\nreplicationTypes\nreportARN\nreportArn\nreportArns\nreportBuildBatchStatusOverride\nreportBuildStatus\nreportBuildStatusOverride\nreportDefinitions\nreportDescription\nreportFileFormat\nreportFormat\nreportFrequency\nreportGroup\nreportGroupArn\nreportGroupArns\nreportGroups\nreportGroupsNotFound\nreportId\nreportName\nreportNames\nreportSummaries\nreportType\nreports\nreportsNotFound\nrepositories\nrepositoriesNotFound\nrepository\nrepositoryArn\nrepositoryCloneMethod\nrepositoryConnectionArn\nrepositoryCount\nrepositoryCredentials\nrepositoryDescription\nrepositoryEndpoint\nrepositoryFilters\nrepositoryId\nrepositoryMetadata\nrepositoryName\nrepositoryNames\nrepositoryPolicy\nrepositoryPrefix\nrepositoryProvider\nrepositoryUri\nreprocessingId\nreprocessingSummaries\nrepublish\nrequest\nrequestAttributes\nrequestCancelActivityTaskDecisionAttributes\nrequestCancelActivityTaskFailedEventAttributes\nrequestCancelExternalWorkflowExecutionDecisionAttributes\nrequestCancelExternalWorkflowExecutionFailedEventAttributes\nrequestCancelExternalWorkflowExecutionInitiatedEventAttributes\nrequestCompression\nrequestContentType\nrequestEntries\nrequestEventStream\nrequestFailureReason\nrequestHeaders\nrequestId\nrequestMACSec\nrequestMappingTemplate\nrequestMessageId\nrequestMethod\nrequestModels\nrequestParameters\nrequestPayload\nrequestTemplates\nrequestTime\nrequestType\nrequestValidatorId\nrequestedAllowedPrefixesToDirectConnectGateway\nrequestedAt\nrequestedBy\nrequestedEndTime\nrequestedOn\nrequestedStartTime\nrequests\nrequireAuthorizationForCacheControl\nrequireInstanceProperties\nrequired\nrequiredClaims\nrequiredFields\nrequiredProperties\nrequiresAttributes\nrequiresCompatibilities\nrequiresConfiguration\nrescanDuration\nrescanDurationState\nrescannedStorageBytes\nreservedCpuCores\nreservedInstanceOptions\nreset\nresetActionConfiguration\nresetActionRequests\nresetTimer\nresiliencyPolicies\nresiliencyScore\nresolution\nresolutionId\nresolutionSteps\nresolutionStrategy\nresolutionTechniques\nresolutionType\nresolveConflicts\nresolvedAt\nresolvedComponentVersions\nresolvedConfiguration\nresolvedImageDigest\nresolvedReason\nresolvedSourceVersion\nresolvedTime\nresolvedValues\nresolver\nresolverArn\nresolvers\nresource\nresourceARN\nresourceAccessRole\nresourceArn\nresourceArns\nresourceConfiguration\nresourceCount\nresourceCounts\nresourceCreationTime\nresourceDefinitions\nresourceDeletionTime\nresourceDetails\nresourceDigests\nresourceErrors\nresourceErrorsDetails\nresourceFilterCriteria\nresourceGroup\nresourceGroupArn\nresourceGroupArns\nresourceGroupName\nresourceGroupNames\nresourceGroupTags\nresourceGroups\nresourceId\nresourceIdentifier\nresourceIdentifiers\nresourceIds\nresourceKeys\nresourceLinks\nresourceLogEvents\nresourceMappings\nresourceMetadata\nresourceMethods\nresourceName\nresourceNames\nresourceOwner\nresourceOwnerAccount\nresourcePolicies\nresourcePolicy\nresourcePrefix\nresourceRecord\nresourceRegionScope\nresourceRequirements\nresourceShare\nresourceShareArn\nresourceShareArns\nresourceShareAssociations\nresourceShareInvitation\nresourceShareInvitationArn\nresourceShareInvitationArns\nresourceShareInvitations\nresourceShareName\nresourceShareStatus\nresourceShares\nresourceSpecification\nresourceState\nresourceStatus\nresourceSubType\nresourceTags\nresourceType\nresourceTypes\nresources\nresourcesAffected\nresourcesBudgetEstimate\nresourcesFlagged\nresourcesIgnored\nresourcesIncluded\nresourcesProcessed\nresourcesReceivingAccess\nresourcesSummary\nresourcesSuppressed\nresourcesVpcConfig\nresponse\nresponseCard\nresponseContentType\nresponseEventStream\nresponseMappingTemplate\nresponseModels\nresponseParameters\nresponsePayload\nresponsePlanArn\nresponsePlanSummaries\nresponseStreamingSupported\nresponseTemplates\nresponseTopic\nresponseType\nresponses\nrestApiId\nrestoreDate\nrestoreTime\nrestoreTimestamp\nrestoredTableARN\nrestrictPublicBuckets\nrestrictions\nresult\nresultCode\nresultConfiguration\nresultCounts\nresultFilterBy\nresultFormat\nresultFrame\nresultId\nresultList\nresultSetMetadata\nresultSetOptions\nresultStat\nresultStats\nresultStatus\nresultTypeFilter\nresults\nresultsByTime\nresultsData\nresultsWritten\nretain\nretainedTopics\nretentionDuration\nretentionInDays\nretentionMode\nretentionPeriod\nretiringPrincipal\nretries\nretryAfter\nretryAfterSeconds\nretryAttempt\nretryMode\nretryPolicy\nretryPolicyConfiguration\nretryPolicyExecution\nretryStrategy\nretryType\nretryable\nreturn\nreturnCode\nreturnInformation\nreturnReason\nreturnValue\nreverseOrder\nreversedDirectionSourceServerArn\nreverted\nrevision\nrevisionChangeId\nrevisionChangeIdentifier\nrevisionChildren\nrevisionDag\nrevisionId\nrevisionInfo\nrevisionLocation\nrevisionNumber\nrevisionSummary\nrevisionType\nrevisionUrl\nrevisionUrlTemplate\nrevisions\nrevocationEffectiveFrom\nrevocationReason\nrevocationRecord\nrevocationSupported\nrevokedAt\nrevokedBy\nrevokedEntities\nrewrite\nrid\nrisk\nriskScore\nrobot\nrobotApplicationNames\nrobotApplicationSummaries\nrobotApplications\nrobotDeploymentSummary\nrobotDeploymentTimeoutInSeconds\nrobotSoftwareSuite\nrobots\nrole\nroleARN\nroleAlias\nroleAliasArn\nroleAliasDescription\nroleAliases\nroleArn\nroleArnForLogging\nroleArns\nroleCredentials\nroleList\nroleName\nroleNameArn\nroleType\nroleValues\nroles\nrollDisposition\nrollback\nrollbackDeploymentId\nrollbackInfo\nrollbackMessage\nrollbackStatus\nrollbackTriggeringDeploymentId\nrollingBackTrxCount\nrollingBackTrxEarliestStartTime\nrolloutState\nrolloutStateReason\nroomIdentifier\nrooms\nroot\nrootDeviceName\nrootDirectory\nrootGroup\nrootResourceId\nrootToParentThingGroups\nrootVolume\nrootVolumeName\nrotateMasterUserPassword\nrotateSecret\nrotationSize\nroutableCIDRSpace\nroute\nrouteFilterPrefixes\nrouteName\nroutedResources\nrouter\nrouterTypeIdentifier\nroutes\nroutingConfiguration\nrow\nrowData\nrowId\nrowIds\nrowIdsNotFound\nrowNumber\nrows\nrowsToCreate\nrowsToUpdate\nrowsToUpsert\nrpoDescription\nrpoInSecs\nrpoReferenceId\nrtoDescription\nrtoInSecs\nrtoReferenceId\nrule\nruleAction\nruleArn\nruleBasedProperties\nruleConfiguration\nruleContentSha256\nruleDesc\nruleDetails\nruleDisabled\nruleEvaluation\nruleExecutionMode\nruleGroupsNamespace\nruleGroupsNamespaces\nruleID\nruleId\nruleIdentifier\nruleName\nruleNames\nruleNumber\nruleResults\nruleVersion\nrules\nrulesPackageArn\nrulesPackageArns\nrulesPackages\nrun\nrunAsGroup\nrunAsNonRoot\nrunAsUser\nrunContext\nrunEnvironment\nrunGroupId\nrunId\nrunLeftNormalization\nrunOnce\nrunOrder\nrunTimeAssessmentStatus\nrunWith\nrunning\nrunningCount\nrunningQueryCount\nrunningTasksCount\nruns\nruntime\nruntimeConfiguration\nruntimeHintValues\nruntimeHints\nruntimeId\nruntimePlatform\nruntimeRoleArn\nruntimeStatus\nruntimeStatusMessage\nruntimeVersion\nruntimes\ns3\ns3Bucket\ns3BucketArn\ns3BucketName\ns3BucketOwner\ns3BucketRegion\ns3BucketSource\ns3BucketTranscriptSource\ns3Config\ns3Configuration\ns3DataDestination\ns3DataSource\ns3DeepLink\ns3Destination\ns3DestinationConfig\ns3DestinationConfiguration\ns3DestinationExportFileFormat\ns3DestinationExportFileFormatOptions\ns3DestinationUrl\ns3EncryptionEnabled\ns3Etags\ns3ExportConfiguration\ns3InputFileType\ns3InputFormatConfig\ns3JobDefinition\ns3Key\ns3KeyPrefix\ns3Keys\ns3KmsKeyArn\ns3Location\ns3LogBucket\ns3Logs\ns3LogsArn\ns3Managed\ns3MonitoringConfiguration\ns3Object\ns3ObjectKey\ns3ObjectVersion\ns3OutputEncryptionKMSKey\ns3OutputFormatConfig\ns3OutputKeyPrefix\ns3Path\ns3Paths\ns3Prefix\ns3Reference\ns3RelativePath\ns3ResourceArn\ns3ResourcePath\ns3Resources\ns3ResourcesUpdate\ns3StateFileUrl\ns3Uri\ns3Url\ns3WordsList\ns3bucketForAnalysisData\ns3bucketForReportData\ns3key\ns3location\nsageMakerStudioDomainUrl\nsagemakerIamRoleArn\nsalesforce\nsaml\nsamlConfiguration\nsamlConfigurationStatus\nsamlMetadataDocument\nsamlMetadataURL\nsamlOptions\nsample\nsampleCount\nsampleFailureReason\nsampleId\nsampleRate\nsampleText\nsampleUtterances\nsampleUtterancesCount\nsampleValue\nsamples\nsamplingPercentage\nsamplingRate\nsatelliteArn\nsatelliteId\nsatellites\nsavedownStorageConfiguration\nsavingsOpportunity\nsavingsOpportunityPercentage\nsavingsPlanArn\nsavingsPlanArns\nsavingsPlanId\nsavingsPlanIds\nsavingsPlanOffering\nsavingsPlanOfferingId\nsavingsPlanOfferingIds\nsavingsPlanPaymentOptions\nsavingsPlanType\nsavingsPlanTypes\nsavingsPlans\nscalarFunctions\nscale\nscaleInCooldownSeconds\nscaleInPolicy\nscaleOutCooldownSeconds\nscaleOutPolicy\nscaling\nscalingConfig\nscanAll\nscanFrequency\nscanName\nscanNameArn\nscanOnPush\nscanRate\nscanState\nscanStatus\nscanStatusCode\nscanStatusReason\nscanType\nscanningConfiguration\nscanningConfigurations\nscansWithMostOpenCriticalFindings\nscansWithMostOpenFindings\nsceneId\nsceneMetadata\nsceneSummaries\nschedule\nscheduleActivityTaskDecisionAttributes\nscheduleActivityTaskFailedEventAttributes\nscheduleEndTime\nscheduleExpression\nscheduleFrequency\nscheduleLambdaFunctionDecisionAttributes\nscheduleLambdaFunctionFailedEventAttributes\nscheduleOffset\nscheduleStartTime\nscheduleTime\nscheduleToCloseTimeout\nscheduleToStartTimeout\nscheduledAuditArn\nscheduledAuditName\nscheduledAudits\nscheduledBefore\nscheduledEventId\nscheduledJobRollouts\nscheduledOnOrAfter\nscheduledSplitsConfig\nscheduledSplitsDefinition\nscheduledStartTime\nschedulingConfig\nschedulingPolicies\nschedulingPolicyArn\nschedulingPriority\nschedulingPriorityOverride\nschedulingStrategy\nschema\nschemaArn\nschemaDefinition\nschemaList\nschemaName\nschemaStorageConfig\nschemaSummaries\nschemaType\nschemaVersion\nschemas\nscheme\nscope\nscopes\nscoping\nscore\nscoreDetails\nscoreSource\nscores\nscoringVector\nscreenAutomationId\nscreenId\nscreenshots\nscript\nscriptLocation\nscriptLocationS3Bucket\nscriptLocationS3Key\nscriptModeConfig\nscriptName\nscriptOutputLocation\nscriptParameters\nscriptType\nsdkType\nsearchCriteria\nsearchExpression\nsearchOrder\nsearchResults\nsearchTerm\nsearchableAttributes\nsearchedCompletely\nsearchedLogStreams\nsecondaryArtifacts\nsecondaryArtifactsOverride\nsecondaryAvailabilityZone\nsecondarySourceVersions\nsecondarySources\nsecondarySourcesOverride\nsecondarySourcesVersionOverride\nseconds\nsecondsToLive\nsecret\nsecretARN\nsecretAccessKey\nsecretArn\nsecretId\nsecretKey\nsecretName\nsecretOptions\nsecretPolicy\nsecrets\nsecretsManagerKey\nsectionalElements\nsections\nsecureInitializationRoleArn\nsecurityConfigDetail\nsecurityConfigSummaries\nsecurityContext\nsecurityDetails\nsecurityGroup\nsecurityGroupIds\nsecurityGroups\nsecurityHubConfiguration\nsecurityPolicy\nsecurityPolicyDetail\nsecurityPolicySummaries\nsecurityProfileArn\nsecurityProfileDescription\nsecurityProfileIdentifier\nsecurityProfileIdentifiers\nsecurityProfileName\nsecurityProfileTargetArn\nsecurityProfileTargetMappings\nsecurityProfileTargets\nseed\nseedReplicationTime\nseedTime\nseenAt\nsegment\nsegmentOverrides\nsegments\nselectAttributes\nselectedProperties\nselectedTestList\nselectionMode\nselectionPattern\nselector\nselectors\nseleniumProperties\nsemanticVersion\nsenderAccountId\nsenderId\nsensitive\nsensitiveData\nsensitiveDataOccurrences\nsensitivityInspectionTemplateId\nsensitivityInspectionTemplates\nsensitivityScore\nsensitivityScoreOverridden\nsensitivityScoreOverride\nsentAt\nsentiment\nsentimentAnalysisSettings\nsentimentLabel\nsentimentResponse\nsentimentScore\nsep\nseparator\nsequenceInformation\nsequenceStoreId\nsequenceStores\nsequenceToken\nserial\nserialNumber\nserializer\nserver\nserverCatalogStatus\nserverCertificateArn\nserverCertificateArns\nserverCertificateStatus\nserverCertificateStatusDetail\nserverCertificates\nserverCriteria\nserverDetail\nserverError\nserverErrorCategory\nserverGroupId\nserverGroupLaunchConfigurations\nserverGroupReplicationConfigurations\nserverGroupValidationConfigurations\nserverGroups\nserverId\nserverImportFailure\nserverImportSuccess\nserverInfos\nserverLaunchConfigurations\nserverList\nserverName\nserverReplicationConfigurations\nserverReplicationParameters\nserverSideEncryption\nserverSideEncryptionConfiguration\nserverStrategies\nserverType\nserverUrl\nserverValidationConfigurations\nserverValidationOutput\nserverValidationStrategy\nservers\nserversCount\nserversMappedToApplications\nserversMappedtoTags\nservice\nserviceAccountName\nserviceAccountRoleArn\nserviceArn\nserviceArns\nserviceAttributes\nserviceCode\nserviceCodeList\nserviceCodes\nserviceConnectConfiguration\nserviceConnectDefaults\nserviceConnectEndpoint\nserviceConnectResources\nserviceDiscovery\nserviceDnsName\nserviceExecutionRoleArn\nserviceId\nserviceIdentifier\nserviceInstance\nserviceInstanceName\nserviceInstances\nserviceIpv4Cidr\nserviceIpv6Cidr\nserviceLimit\nserviceLinkedRoleArn\nserviceManagedS3\nserviceMetadata\nserviceMode\nserviceName\nserviceNetworkArn\nserviceNetworkId\nserviceNetworkIdentifier\nserviceNetworkName\nserviceNetworkServiceAssociationIdentifier\nserviceNetworkVpcAssociationIdentifier\nserviceProviderSamlMetadata\nserviceRecommendationOptions\nserviceRegistries\nserviceRole\nserviceRoleArn\nserviceRoleOverride\nserviceSpec\nserviceSyncBlocker\nserviceSyncBlockerSummary\nserviceSyncConfig\nserviceTemplate\nserviceTemplateVersion\nserviceTemplates\nserviceType\nservices\nsession\nsessionArn\nsessionAttributes\nsessionBackup\nsessionConfiguration\nsessionContext\nsessionDurationInMinutes\nsessionEnabled\nsessionExpirationTime\nsessionId\nsessionIds\nsessionIssuer\nsessionPersistenceMode\nsessionPolicy\nsessionState\nsessionStorage\nsessionSummaries\nsessionTarget\nsessionTimeout\nsessionToken\nsessionType\nsessions\nset\nsetAsActive\nsetAsDefault\nsetDefaultVersion\nsetFileModes\nsetTimer\nsetVariable\nsetting\nsettings\nseverities\nseverity\nseverityCode\nseverityCounts\nseverityLevels\nsha\nsha256\nsha256sum\nshadow\nshadowName\nshape\nshapeId\nshardCapacity\nshardCount\nshare\nshareDecaySeconds\nshareDistribution\nshareId\nshareIdentifier\nshareName\nshareUrl\nsharedAccess\nsharedAccountId\nsharedMemorySize\nsharedVia\nshares\nshippingAddress\nshippingLabel\nshortCode\nshots\nshouldOverwrite\nshouldProfile\nshowThumbnails\nshutdownAgentlessCollectors\nshutdownAgents\nshutdownConnectors\nshutdownMeCollectors\nsid\nsignalCatalogArn\nsignalDecoders\nsignalDecodersToAdd\nsignalDecodersToRemove\nsignalDecodersToUpdate\nsignalExternalWorkflowExecutionDecisionAttributes\nsignalExternalWorkflowExecutionFailedEventAttributes\nsignalExternalWorkflowExecutionInitiatedEventAttributes\nsignalName\nsignalsMap\nsignalsToCollect\nsignature\nsignatureAlgorithm\nsignatureContains\nsignatureCount\nsignatureDateTime\nsignatureExpiresAfter\nsignatureExpiresAt\nsignatureExpiresBefore\nsignatureInfo\nsignatureKeyId\nsignatureMap\nsignatureR\nsignatureS\nsignatureTimestamp\nsignatureV\nsignatureValid\nsignatureValidityPeriod\nsignedBiUrl\nsignedConnectionString\nsignedObject\nsigningConfiguration\nsigningDisabled\nsigningImageFormat\nsigningMaterial\nsigningParameters\nsigningProfileName\nsigningProfileParameter\nsigningRegion\nsigningServiceName\nsigv4\nsilent\nsimpleCriterion\nsimpleRule\nsimpleRuleEvaluation\nsimpleScopeTerm\nsimulationApplicationNames\nsimulationApplicationSummaries\nsimulationApplications\nsimulationJobBatchSummaries\nsimulationJobSummaries\nsimulationSoftwareSuite\nsimulationTimeMillis\nsimulationUnitLimit\nsince\nsite\nsiteLinkEnabled\nsites\nsize\nsizeClassified\nsizeInBytes\nsizeInBytesCompressed\nsizeInGb\nsizeInGiB\nsizeInMiB\nsizeLimit\nskipAppResign\nskipFinalSnapshot\nskipResourceInUseCheck\nskipped\nskippedEntries\nskippedFindingsCount\nslackChannelConfigurations\nslackWorkspaceConfigurations\nslotCaptureSetting\nslotConstraint\nslotDiscrepancies\nslotElicitationStyle\nslotHints\nslotId\nslotMatchResult\nslotMatchResultCounts\nslotName\nslotPriorities\nslotResolutionResults\nslotSpecifications\nslotSummaries\nslotToElicit\nslotType\nslotTypeCategory\nslotTypeConfigurations\nslotTypeId\nslotTypeName\nslotTypeSignature\nslotTypeSummaries\nslotTypeValues\nslotTypeVersion\nslotTypes\nslotTypesCount\nslots\nslotsFilledInSession\nsmallVolumeConf\nsmallVolumeMaxSize\nsmsConfigurations\nsnapshot\nsnapshotArn\nsnapshotConfiguration\nsnapshotCreateTime\nsnapshotCreationTime\nsnapshotID\nsnapshotId\nsnapshotName\nsnapshotRemainingDays\nsnapshotRetentionPeriod\nsnapshotRetentionStartTime\nsnapshotTimeOfDay\nsnapshots\nsnoozeActionConfiguration\nsnoozeActionRequests\nsnoozeDuration\nsns\nsnsPublishStatusCode\nsnsTopic\nsnsTopicARN\nsnsTopicArn\nsocketAddress\nsoftLimit\nsoftware\nsolution\nsolutionArn\nsolutionConfig\nsolutionVersion\nsolutionVersionArn\nsolutionVersions\nsolutions\nsopRecommendations\nsort\nsortBy\nsortByAttribute\nsortByOrder\nsortColumns\nsortCriteria\nsortOrder\nsorts\nsource\nsource1\nsource2\nsourceAccessToken\nsourceAccount\nsourceAccountID\nsourceApiArn\nsourceApiAssociation\nsourceApiAssociationConfig\nsourceApiAssociationStatus\nsourceApiAssociationStatusDetail\nsourceApiAssociationSummaries\nsourceApiId\nsourceApiIdentifier\nsourceArn\nsourceArns\nsourceAuthOverride\nsourceBotVersion\nsourceBranch\nsourceCloudProperties\nsourceCode\nsourceCodeList\nsourceCodeRepositories\nsourceCodeRepository\nsourceCommit\nsourceCommitId\nsourceCommitSpecifier\nsourceConfiguration\nsourceConnectionState\nsourceConnectorLabel\nsourceConnectorProperties\nsourceConnectorType\nsourceContainer\nsourceCredentialsInfos\nsourceData\nsourceDatabaseName\nsourceDescription\nsourceDiskName\nsourceFields\nsourceFile\nsourceFileType\nsourceFiles\nsourceFlowConfig\nsourceFrequency\nsourceId\nsourceIdentifier\nsourceImageSet\nsourceImageSetId\nsourceImageSetProperties\nsourceInfo\nsourceInstanceName\nsourceIpAddress\nsourceKeyspaceName\nsourceKeyword\nsourceLambdaLayerArn\nsourceLayerHash\nsourceLocationOverride\nsourceName\nsourceNetwork\nsourceNetworkID\nsourceNetworkIDs\nsourceNetworks\nsourceParams\nsourcePath\nsourcePipelineArn\nsourcePipelineName\nsourceProperties\nsourceReference\nsourceRegion\nsourceRelationalDatabaseName\nsourceRepository\nsourceRepositoryName\nsourceResourceName\nsourceRevisions\nsourceS3DirectoryPath\nsourceS3Location\nsourceS3Object\nsourceSchemaName\nsourceSecurityGroups\nsourceServer\nsourceServerArn\nsourceServerID\nsourceServerIDs\nsourceServerId\nsourceServerTags\nsourceServers\nsourceSetUpOption\nsourceSnapshotName\nsourceStatuses\nsourceTableName\nsourceType\nsourceTypeOverride\nsourceUrl\nsourceVersion\nsourceVolume\nsourceVpc\nsourceVpcID\nsources\nspaceName\nspan\nsparkSqlJobDriver\nsparkSqlParameters\nsparkSubmitJobDriver\nsparkSubmitParameters\nsparql\nspec\nspectrumConfig\nspeechTranscriptionResult\nspeechTranscriptionResultCounts\nspeedOfMigration\nsphere\nspoolingMode\nspotIamFleetRole\nsql\nsqlParameters\nsqlQuery\nsqlStatementResults\nsqlStatements\nsqs\nsrcCodeOrDbAnalysisStatus\nsseConfig\nsseKmsKeyId\nsshKeyName\nsshPublicKey\nssmAgentDiscoveryDatetime\nssmDocument\nssmDocumentName\nssmDocumentType\nssmDocuments\nssmOutput\nssmValidationParameters\nssmlMessage\nssoApplicationId\nssoClientId\nssoIdentity\nstabilityStatus\nstabilityStatusAt\nstackId\nstackName\nstackParameters\nstackSetName\nstage\nstageArn\nstageDescription\nstageDetails\nstageKeys\nstageName\nstageProgress\nstageSession\nstageSessions\nstageStates\nstageVariableOverrides\nstageVariables\nstages\nstagingAccountID\nstagingAccountIDs\nstagingArea\nstagingAreaSubnetId\nstagingAreaTags\nstagingAvailabilityZone\nstagingDiskType\nstagingSourceServerArn\nstandardControlsCount\nstandardDeviation\nstart\nstartAfter\nstartAt\nstartAtPreviousStartedEvent\nstartBit\nstartByte\nstartCharOffset\nstartChildWorkflowExecutionDecisionAttributes\nstartChildWorkflowExecutionFailedEventAttributes\nstartChildWorkflowExecutionInitiatedEventAttributes\nstartColumn\nstartDate\nstartDateTime\nstartFromHead\nstartInclusive\nstartLambdaFunctionFailedEventAttributes\nstartLine\nstartOn\nstartPeriod\nstartResponse\nstartSigningJobParameter\nstartTime\nstartTimeFilter\nstartTimeInSeconds\nstartTimeOffsetInNanos\nstartTimeRange\nstartTimeout\nstartTimeoutMs\nstartTimerDecisionAttributes\nstartTimerFailedEventAttributes\nstartTimes\nstartTimestamp\nstartToCloseTimeout\nstartToFireTimeout\nstartToken\nstartUrl\nstarted\nstartedAfter\nstartedAt\nstartedBefore\nstartedBy\nstartedEventId\nstartedFromBackupId\nstartedOn\nstartedTime\nstartingToken\nstat\nstate\nstateChangeConfiguration\nstateChangeError\nstateChangeTimeRange\nstateChangedAt\nstateChanges\nstateDescription\nstateDetail\nstateDetails\nstateEnteredEventDetails\nstateExitedEventDetails\nstateMachineAliasArn\nstateMachineAliases\nstateMachineArn\nstateMachineName\nstateMachineVersionArn\nstateMachineVersions\nstateMachines\nstateName\nstateOrProvince\nstateReason\nstateValue\nstatement\nstatementId\nstates\nstaticColumns\nstaticIp\nstaticIpName\nstaticIps\nstatistic\nstatisticalThreshold\nstatistics\nstatisticsId\nstats\nstatus\nstatusChangeTime\nstatusChangedAt\nstatusCode\nstatusCodes\nstatusCounts\nstatusDetail\nstatusDetails\nstatusEquals\nstatusFilter\nstatusList\nstatusMessage\nstatusReason\nstatusReportS3Bucket\nstatusReportS3Key\nstatusSummary\nstatusTimeoutInSeconds\nstatusType\nstatusUpdateDateTime\nstatuscode\nstatuses\nstdDeviation\nstddev\nstep\nstepActionType\nstepAutomationConfiguration\nstepExecutionId\nstepFunctions\nstepGroupId\nstepId\nstepName\nstepTarget\nstepTargets\nstepTimeoutInMinutes\nsteps\nstillWaitingResponse\nstmt\nstopAction\nstopAt\nstopCode\nstopConditions\nstopDate\nstopInstanceOnIdleRequest\nstopTime\nstopTimeout\nstopTrigger\nstopped\nstoppedAt\nstoppedBy\nstoppedReason\nstoppingAt\nstoppingCondition\nstorage\nstorageCapacity\nstorageClass\nstorageCompressionFormat\nstorageConfigurations\nstorageGBHour\nstorageLocation\nstoragePerMonthInGb\nstorageType\nstoreArn\nstoreFormat\nstoreId\nstoreName\nstoreOptions\nstoreSizeBytes\nstoredBytes\nstrValues\nstrategy\nstrategyOption\nstream\nstreamArn\nstreamConfiguration\nstreamId\nstreamInfo\nstreamKey\nstreamKeys\nstreamName\nstreamOutputToCloudWatch\nstreamSession\nstreamSessions\nstreamUI\nstreamUrl\nstreamVersion\nstreamingImage\nstreamingImageId\nstreamingImageIds\nstreamingImages\nstreamingSessionBackup\nstreamingSessionBackups\nstreams\nstreamsKmsKey\nstreamsKmsRole\nstreet1\nstreet2\nstreet3\nstreetInfo\nstreetName\nstreetNumber\nstreetSuffix\nstring\nstringSetValue\nstringValue\nstringValues\nstrings\nstructurallyExclusive\nstudio\nstudioComponent\nstudioComponentId\nstudioComponentIds\nstudioComponentName\nstudioComponentSummaries\nstudioComponents\nstudioEncryptionConfiguration\nstudioId\nstudioName\nstudioUrl\nstudios\nstyle\nsubDomainSetting\nsubDomainSettings\nsubDomains\nsubFolders\nsubModules\nsubResourceId\nsubSlotHints\nsubSlotSetting\nsubSlotToElicit\nsubSlots\nsubTitle\nsubdirectory\nsubject\nsubjectAlternativeNames\nsubjectArn\nsubjectId\nsubjectStructures\nsubjects\nsubmit\nsubmitTime\nsubmittedAt\nsubmittedBy\nsubmitter\nsubnet\nsubnetId\nsubnetIds\nsubnets\nsubqueries\nsubscribedAt\nsubscriber\nsubscriberArn\nsubscriberDescription\nsubscriberEndpoint\nsubscriberId\nsubscriberIdentity\nsubscriberName\nsubscriberStatus\nsubscribers\nsubscriptionFilters\nsubscriptionProtocol\nsubscriptionType\nsubscriptions\nsubscriptionsFilePath\nsubtitle\nsubtype\nsucceeded\nsucceededFindingsCount\nsucceededWorldCount\nsucceededWorlds\nsuccess\nsuccessCodes\nsuccessConditional\nsuccessCount\nsuccessEntries\nsuccessNextStep\nsuccessResponse\nsuccessResponseHandlingConfig\nsuccessful\nsuccessfulEntries\nsuccessfulExecutions\nsuccessfulRequests\nsuccessfulSet\nsuccessfulVersions\nsuffix\nsuggest\nsuggestedChanges\nsuggestedFixes\nsuggester\nsuggestion\nsuggestions\nsuite\nsuiteDefinitionArn\nsuiteDefinitionConfiguration\nsuiteDefinitionId\nsuiteDefinitionInformationList\nsuiteDefinitionName\nsuiteDefinitionVersion\nsuiteRunArn\nsuiteRunConfiguration\nsuiteRunId\nsuiteRunsList\nsuites\nsum\nsumOfSquares\nsummaries\nsummary\nsummaryList\nsuperuserParameters\nsupplementaryConfiguration\nsuppliedData\nsupportCode\nsupportedApiVersions\nsupportedAppCategories\nsupportedComponentSources\nsupportedDataTransferApis\nsupportedDataTransferTypes\nsupportedDateFormat\nsupportedDestinationConnectors\nsupportedFieldTypeDetails\nsupportedFormats\nsupportedHours\nsupportedLanguages\nsupportedLocales\nsupportedOperators\nsupportedOsVersions\nsupportedPlatforms\nsupportedRegions\nsupportedSchedulingFrequencies\nsupportedTriggerTypes\nsupportedValues\nsupportedVersion\nsupportedWriteOperations\nsupportsNitroInstances\nsuppressAlerts\nsuppressDataIdentifiers\nsuppressIndefinitely\nsuppressNextMessage\nsuppressed\nsuppressedAlertsIncluded\nsuppressedNonCompliantResourcesCount\nsuppressions\nswappiness\nsymbolicLinks\nsyncConfig\nsyncDefinitions\nsyncFromResources\nsyncJobSummaries\nsyncResources\nsyncRole\nsyncSource\nsyncType\nsyncWithPublicNamespace\nsynonyms\nsystemControls\nsystemEvent\nsystemEvidenceCount\nsystemInfo\nsystemInitializationScripts\nsystemInstanceId\nsystemMessage\nsystemResourceLimits\nsystemsManagerAgent\ntableArn\ntableColumnId\ntableColumnName\ntableColumns\ntableId\ntableName\ntablePrefix\ntableReference\ntableRegistrationOutput\ntableRestoreRequestId\ntableRestoreStatus\ntableRestoreStatuses\ntables\ntabularConditions\ntabularPropertyValues\ntabularSchemaConfig\ntag\ntagCriterion\ntagFilter\ntagFilters\ntagKey\ntagKeyComparisonType\ntagKeys\ntagList\ntagQueryConfiguration\ntagScopeTerm\ntagStatus\ntagValue\ntagValueComparisonType\ntagValues\ntags\ntagsOverride\ntaints\ntarget\ntargetAccount\ntargetAccountId\ntargetAccountIds\ntargetAction\ntargetArn\ntargetArns\ntargetAwsAccount\ntargetBitrate\ntargetBranch\ntargetCapacity\ntargetCheckNames\ntargetComponentName\ntargetComponentTypeId\ntargetDatabaseEngine\ntargetDatabaseName\ntargetDestination\ntargetEirp\ntargetEntityId\ntargetFileSize\ntargetFilters\ntargetFramerate\ntargetFrames\ntargetFramesIndex\ntargetGroup\ntargetGroupArn\ntargetGroupArns\ntargetGroupIdentifier\ntargetGroupInfoList\ntargetGroupPairInfoList\ntargetGroupType\ntargetGroups\ntargetId\ntargetIdentifier\ntargetIds\ntargetInstanceID\ntargetInstanceTypeRightSizingMethod\ntargetInstances\ntargetIntervalSeconds\ntargetKeyspaceName\ntargetName\ntargetNodes\ntargetPipeline\ntargetRegion\ntargetRepository\ntargetResolution\ntargetResource\ntargetResourceCount\ntargetResourceCreatedAt\ntargetResourceType\ntargetResourceTypes\ntargetRevision\ntargetRoleArn\ntargetSchemaName\ntargetSelection\ntargetSnapshotName\ntargetState\ntargetStatus\ntargetTableName\ntargetType\ntargetUrl\ntargetVersion\ntargetVersionWeight\ntargetVpc\ntargets\ntask\ntaskArn\ntaskArns\ntaskContext\ntaskCredentials\ntaskDefinition\ntaskDefinitionArn\ntaskDefinitionArns\ntaskDefinitions\ntaskEndTime\ntaskError\ntaskErrorDetails\ntaskFailedEventDetails\ntaskId\ntaskIdList\ntaskIds\ntaskInfos\ntaskList\ntaskListScheduleToStartTimeout\ntaskName\ntaskObject\ntaskPriority\ntaskProperties\ntaskRoleArn\ntaskScheduledEventDetails\ntaskSet\ntaskSetArn\ntaskSetLabel\ntaskSets\ntaskSetsInfo\ntaskStartFailedEventDetails\ntaskStartTime\ntaskStartToCloseTimeout\ntaskStartedEventDetails\ntaskStatistics\ntaskStatus\ntaskSubmitFailedEventDetails\ntaskSubmittedEventDetails\ntaskSucceededEventDetails\ntaskSummary\ntaskTimedOutEventDetails\ntaskToken\ntaskType\ntaskingDocument\ntaskrunnerId\ntasks\ntcpRetryEvents\ntcpRoute\nteamId\nteamMembers\nteamName\ntelemetryEndpoint\ntelemetryMetadata\ntemplate\ntemplateArn\ntemplateBody\ntemplateFile\ntemplateFormat\ntemplateId\ntemplateLocation\ntemplateMajorVersion\ntemplateMinorVersion\ntemplateName\ntemplateStepGroupSummary\ntemplateStepSummaryList\ntemplateSummaries\ntemplateSummary\ntemplateSyncConfig\ntemplateType\ntemplateUri\ntemplateVersion\ntemplateVersions\ntemplates\ntemplatesLocation\ntemporaryPassword\ntenancy\ntenant\ntenantDisplayName\ntenantId\ntenantIdentifier\ntermDurationInSeconds\ntermLength\nterminate\nterminateAt\nterminateBlueInstancesOnDeploymentSuccess\nterminateInstanceOnFailure\nterminateJobsOnUpdate\nterminationWaitTimeInMinutes\ntermsAggregation\nterraformSource\nterraformSourceName\nterraformSourceNames\nterraformSources\ntest\ntestArtifactsUrl\ntestBotAliasTags\ntestCaseDefinitionId\ntestCaseDefinitionName\ntestCaseRunId\ntestCaseScenarioId\ntestCaseScenarioType\ntestCases\ntestConfigUrl\ntestDurationInMinutes\ntestExecutionId\ntestExecutionModality\ntestExecutionResults\ntestExecutionStatus\ntestExecutions\ntestGridProject\ntestGridProjects\ntestGridSession\ntestGridSessions\ntestId\ntestPackageArn\ntestRawDataPath\ntestRecommendations\ntestResult\ntestScenarios\ntestSetDiscrepancyRawOutputUrl\ntestSetDiscrepancyReportId\ntestSetDiscrepancyReportStatus\ntestSetDiscrepancyTopErrors\ntestSetExportSpecification\ntestSetGenerationId\ntestSetGenerationStatus\ntestSetId\ntestSetImportResourceSpecification\ntestSetName\ntestSetRecords\ntestSetTags\ntestSets\ntestSpecArn\ntestSummary\ntestTrafficRoute\ntestType\ntestingInformation\ntests\ntext\ntextDataDeliveryEnabled\ntextInput\ntextInputSpecification\ntextLogSettings\ntextResponse\ntfi\ntgwStatus\ntheme\nthemeToCreate\nthen\nthingArn\nthingConnectivityIndexingMode\nthingGroupArn\nthingGroupDescription\nthingGroupId\nthingGroupIndexingConfiguration\nthingGroupIndexingMode\nthingGroupMetadata\nthingGroupName\nthingGroupNames\nthingGroupProperties\nthingGroups\nthingGroupsToAdd\nthingGroupsToRemove\nthingId\nthingIndexingConfiguration\nthingIndexingMode\nthingName\nthingTypeArn\nthingTypeDescription\nthingTypeId\nthingTypeMetadata\nthingTypeName\nthingTypeProperties\nthingTypes\nthings\nthirdPartyConfigurationUrl\nthreadStates\nthreadsPerCore\nthreshold\nthresholdBreachValue\nthresholdPercent\nthresholdPercentage\nthresholdValue\nthrottle\nthrottleSettings\nthrottling\nthrottlingBurstLimit\nthrottlingRateLimit\nthroughput\nthroughputInfo\nthroughputMode\nthumbnailConfiguration\nthumbnailUrl\nthumbprint\ntier\ntime\ntimeBasedCanary\ntimeBasedLinear\ntimeCreated\ntimeDimension\ntimeExpression\ntimeInMillis\ntimeInSeconds\ntimeOfCreation\ntimeOfEvent\ntimeOrdering\ntimePeriod\ntimeRange\ntimeSeriesArn\ntimeSeriesCreationDate\ntimeSeriesId\ntimeSeriesLastUpdateDate\ntimeSeriesType\ntimeToLive\ntimeToLiveInSeconds\ntimeValue\ntimedOut\ntimems\ntimeout\ntimeoutConditional\ntimeoutConfig\ntimeoutInMillis\ntimeoutInMins\ntimeoutInMinutes\ntimeoutInMinutesOverride\ntimeoutInSeconds\ntimeoutMillis\ntimeoutMinutes\ntimeoutNextStep\ntimeoutResponse\ntimeoutSeconds\ntimeoutType\ntimerCanceledEventAttributes\ntimerFiredEventAttributes\ntimerId\ntimerName\ntimerStartedEventAttributes\ntimers\ntimestamp\ntimestampFormat\ntimestampPartition\ntimestamps\ntimestream\ntimestreamDatabaseArn\ntimestreamDatabaseName\ntimestreamRegistrationResponse\ntimestreamResources\ntimestreamTableArn\ntimestreamTableName\ntimezone\ntip\ntitle\ntitles\ntleData\ntleLine1\ntleLine2\ntls\ntlsCertificateSummaries\ntlsCertificates\ntlsConfig\ntlsContext\ntlsPolicies\ntlsPolicyName\ntmpfs\nto\ntoBlockchainInstant\ntoDate\ntoDateTime\ntoPermissionArn\ntoPermissionVersion\ntoPort\ntoken\ntokenBalances\ntokenEndpoint\ntokenExpirationTime\ntokenFilter\ntokenId\ntokenIdentifier\ntokenKeyName\ntokenName\ntokenNameList\ntokenSignature\ntokenSigningPublicKeys\ntokenType\ntokenUrl\ntokenUrlCustomProperties\ntokenUrls\ntokenValue\ntoleratedFailureCount\ntoleratedFailurePercentage\ntooNewLogEventStartIndex\ntooOldLogEventEndIndex\ntoolName\ntoolchain\ntools\ntopMatches\ntopPanel\ntopic\ntopicArn\ntopicIntegrationArn\ntopicPattern\ntopicPolicy\ntopicRuleDestination\ntopicRulePayload\ntopologyFilter\ntotal\ntotalActuators\ntotalAgentlessCollectors\ntotalAgents\ntotalApplications\ntotalAssessmentControlsCount\ntotalAttributes\ntotalBackupSizeInMegaBytes\ntotalBaseCount\ntotalBranches\ntotalBytesClassified\ntotalChecks\ntotalConnectors\ntotalControlsCount\ntotalCount\ntotalCounts\ntotalDataInMegaBytes\ntotalDetections\ntotalDetectionsSuppressed\ntotalDiscoveredResources\ntotalDurationInMillis\ntotalEdgePropertyValues\ntotalEvidence\ntotalExecutionDurationSeconds\ntotalFailureCount\ntotalFindingsCount\ntotalItemsClassified\ntotalItemsSensitive\ntotalItemsSkipped\ntotalItemsSkippedInvalidEncryption\ntotalItemsSkippedInvalidKms\ntotalItemsSkippedPermissionDenied\ntotalJobs\ntotalMeCollectors\ntotalNoOfSrv\ntotalNodePropertyValues\ntotalNodes\ntotalNumberOfFindings\ntotalNumberOfJobs\ntotalParts\ntotalReadCount\ntotalRecords\ntotalRecordsCount\ntotalRecordsProcessed\ntotalReservedMinuteAllocation\ntotalResourceUtilization\ntotalResources\ntotalResourcesCount\ntotalResultCount\ntotalResults\ntotalScheduledMinutes\ntotalSensors\ntotalServerGroups\ntotalServers\ntotalSizeInBytes\ntotalSizeInMegaBytes\ntotalSourceServers\ntotalStepCount\ntotalSteps\ntotalStepsFailed\ntotalStepsSkipped\ntotalStepsSucceeded\ntotalStorageBytes\ntotals\ntpr\ntraceHeader\ntracingConfiguration\ntracingEnabled\ntrackerName\ntrackingConfigArn\ntrackingId\ntrackingInformation\ntrackingNamespaceName\ntrackingNamespaceVersion\ntrackingNumber\ntrafficGroupArn\ntrafficRoutingConfig\ntrafficWeight\ntrailList\ntrailNameList\ntrailProperties\ntrails\ntrainModelS3Location\ntrainingDataCollectionStartDate\ntrainingDataConfig\ntrainingDataSchema\ntrainingDataSource\ntrainingEntryPointScript\ntrainingHours\ntrainingInputMode\ntrainingInstanceType\ntrainingInstanceVolumeSizeInGB\ntrainingJobName\ntrainingLoss\ntrainingMetrics\ntrainingMetricsV2\ntrainingMode\ntrainingResult\ntrainingResultV2\ntrainingTimeOutInSeconds\ntrait\ntraits\ntranformationToolInstallationLink\ntransaction\ntransactionFee\ntransactionHash\ntransactionId\ntransactionIndex\ntransactionStatus\ntransactionTimestamp\ntransactions\ntranscript\ntranscriptFilter\ntranscriptFormat\ntranscriptSourceSetting\ntransferData\ntransferDate\ntransferMessage\ntransferPerMonthInGb\ntransferredCertificateArn\ntransferredTo\ntransform\ntransformEntryPointScript\ntransformationTool\ntransitEncryption\ntransitEncryptionEnabled\ntransitEncryptionPort\ntransitGatewayConfiguration\ntransitGatewayID\ntransitionEvents\ntransitionType\ntransitions\ntransmitDisabled\ntransportProtocol\ntraversalDirection\ntraversalType\ntreatMissingData\ntreatmentName\ntreatmentNames\ntreatmentWeights\ntreatments\ntreeId\ntrendField\ntrialMinutes\ntrigger\ntriggerArn\ntriggerConfig\ntriggerConfigurations\ntriggerDetail\ntriggerDetails\ntriggerEvents\ntriggerMode\ntriggerName\ntriggerProperties\ntriggerTargetArn\ntriggerType\ntriggers\ntroubleshootingText\ntruncated\ntruncatedEvents\ntrust\ntrustAnchor\ntrustAnchorArn\ntrustAnchorId\ntrustAnchors\ntrustPolicy\ntrustStore\ntrustStoreArn\ntrustStores\ntruststoreUri\ntruststoreVersion\ntruststoreWarnings\nttl\nttps\ntumbling\ntunedHPOParams\ntunnel\ntunnelArn\ntunnelId\ntunnelSummaries\nturnNumber\nturnResult\nturnSpecification\nturnsToLive\ntype\ntypeFilter\ntypeHint\ntypeInfo\ntypeInfos\ntypeName\ntypes\ntypesFilePath\nudid\nuid\nulimits\nunauthorizedCacheControlHeaderStrategy\nuncertaintyRange\nunclassifiableObjectCount\nunclassifiableObjectSizeInBytes\nundoDeprecate\nunencrypted\nunfinished\nunhealthyAgentlessCollectors\nunhealthyAgents\nunhealthyConnectors\nunhealthyMeCollectors\nunhealthyThreshold\nunhealthyThresholdCount\nunicode\nuninstallAfterBuild\nuniqueId\nuniqueProblems\nunit\nunitLabel\nunitOfMeasure\nunits\nunknown\nunknownAgentlessCollectors\nunknownAgents\nunknownConnectors\nunknownMeCollectors\nunlabeledEventsTreatment\nunlimited\nunmanagedvCpus\nunmask\nunmetered\nunmeteredDevices\nunmeteredRemoteAccessDevices\nunprocessedAccounts\nunprocessedEndTimes\nunprocessedJobs\nunprocessedResourceKeys\nunprocessedWorlds\nunsetDefaultVersion\nunsuccessful\nunsupportedResourceStatus\nunsupportedResources\nunvalidatedJSON\nupToDate\nupcomingMinutesScheduled\nupdatableAttributes\nupdate\nupdateCACertificateParams\nupdateCollectionDetail\nupdateConfig\nupdateConfiguration\nupdateDate\nupdateDateTime\nupdateDeviceCertificateParams\nupdateId\nupdateIds\nupdateImageSetMetadataUpdates\nupdateInstructionBatch\nupdateMode\nupdateOutdatedInstancesOnly\nupdatePolicy\nupdateReason\nupdateResponse\nupdateResults\nupdateSingleCardinalityProperties\nupdateStatus\nupdateStatusReason\nupdateTime\nupdateTimestamp\nupdateToLatestImageVersion\nupdateType\nupdated\nupdatedAt\nupdatedBy\nupdatedByChangesetId\nupdatedComponent\nupdatedDate\nupdatedForm\nupdatedTheme\nupdatedTime\nupdatesChangesetId\nupfrontPaymentAmount\nuplinkBandwidthBits\nuplinkDelayMs\nuplinkJitterMs\nuplinkLossPercent\nupload\nuploadAllowed\nuploadBehavior\nuploadConfigurations\nuploadId\nuploadSequenceToken\nuploadStatus\nuploadUrl\nuploads\nupperBoundValue\nupperBoundValues\nupperInclusive\nupsertAction\nupstream\nupstreamRegistryUrl\nupstreams\nuri\nuris\nurl\nurlExpiry\nurls\nusage\nusageCost\nusageLimit\nusageLimitArn\nusageLimitId\nusageLimits\nusagePlanId\nusageState\nusageText\nusageTotals\nusageType\nusageTypes\nuseBase64\nuseCallerCredentials\nuseDedicatedReplicationServer\nuseDefaultApplications\nuseDefaultTools\nuseDefaultUploadConfigurations\nuseEventVariables\nuseExtendedIds\nuseFipsEndpoint\nuseLatestRestorableAutoSnapshot\nuseLatestRestorableTime\nuseOnly\nusePrefixAttributeValue\nusePrivateIP\nusePrivateLinkForMetadataAndAuthorization\nuseStageCache\nused\nuser\nuserAccessLoggingSettings\nuserAccessLoggingSettingsArn\nuserAccessResultsList\nuserAccessTasksList\nuserAgent\nuserArn\nuserAttribute\nuserAttributes\nuserAttributesForFindings\nuserCode\nuserData\nuserDataOverride\nuserDataValidationParameters\nuserFeedback\nuserFirstName\nuserFullName\nuserGroups\nuserId\nuserIdentity\nuserIds\nuserInitializationScripts\nuserLastName\nuserLoginName\nuserName\nuserPausedDetails\nuserPoolArn\nuserPoolConfig\nuserPoolId\nuserProfiles\nuserProperties\nuserProvidedEdgeIds\nuserProvidedID\nuserRole\nuserRoleArn\nuserRules\nuserSettings\nuserSettingsArn\nuserStatus\nuserTurn\nuserType\nusername\nusernameClaim\nusernamePrefix\nusers\nutilizationMetrics\nutterance\nutteranceFirstRecordedInAggregationDuration\nutteranceInput\nutteranceLastRecordedInAggregationDuration\nutteranceLevelTestResults\nutteranceRequestId\nutteranceString\nutteranceTimestamp\nutteranceUnderstood\nutterances\nuuid\nv1\nv1BotLocale\nv1BotName\nv1BotNameContains\nv1BotVersion\nv2BotId\nv2BotName\nv2BotRole\nvCPUHour\nvalid\nvalidTimeRange\nvalidZones\nvalidatePolicyResourceType\nvalidateRequestBody\nvalidateRequestParameters\nvalidatedDependencyRevisions\nvalidatedNamespaceVersion\nvalidation\nvalidationCertificateArn\nvalidationDataConfig\nvalidationErrors\nvalidationId\nvalidationLoss\nvalidationMessage\nvalidationMetrics\nvalidationOutputList\nvalidationResults\nvalidationSettings\nvalidationStatus\nvalidationWarnings\nvalidations\nvalidators\nvalidity\nvalue\nvalueElicitationPrompt\nvalueElicitationPromptSpecification\nvalueElicitationSetting\nvalueFrom\nvalueKey\nvalueMappings\nvalueRegexPattern\nvalueSelectionSetting\nvalueSelectionStrategy\nvalueSet\nvalueString\nvalueType\nvalues\nvariableEntries\nvariableImpactExplanations\nvariableImportance\nvariableImportanceMetrics\nvariableName\nvariableNames\nvariableType\nvariables\nvariance\nvariantImportJobs\nvariantStores\nvariantValues\nvariants\nvariation\nvariations\nvaultName\nvaultNotificationConfig\nvcenterBasedRemoteInfoList\nvcenterClientID\nvcenterConfigurationTimeStamp\nvcenterUUID\nvcpus\nvehicleName\nvehicleSummaries\nvehicles\nvendor\nvendorAdditionalFixedProperties\nvendorAdditionalTransientProperties\nvendorCreatedAt\nvendorGuidance\nvendorGuidanceMessage\nvendorProperties\nvendorSeverity\nvendorUpdatedAt\nvendorWorkerId\nvendorWorkerIpAddress\nverificationCertificate\nverificationState\nverificationStateDescription\nverificationUri\nverificationUriComplete\nverified\nversion\nversionArn\nversionCode\nversionControl\nversionControlConfigurationTimeStamp\nversionControlInfoList\nversionControlType\nversionDescription\nversionId\nversionInfo\nversionName\nversionNumber\nversionOptions\nversionOrAlias\nversionQualifier\nversionRequirement\nversionRequirements\nversionRevision\nversionRevisions\nversionSizeBytes\nversionStatus\nversionUpdateByJobsConfig\nversioned\nversioning\nversioningConfiguration\nversions\nverticalGap\nveryLow\nvideo\nvideoCapture\nvideoEndpoint\nvideoHeight\nvideoWidth\nviewerCount\nviewerId\nviewerSessionVersionsLessThanOrEqualTo\nviewerSessions\nviolationEventAdditionalInfo\nviolationEventOccurrenceRange\nviolationEventTime\nviolationEventType\nviolationEvents\nviolationId\nviolationIds\nviolationStartTime\nvirtualCluster\nvirtualClusterId\nvirtualClusterIdentifier\nvirtualClusters\nvirtualGateway\nvirtualGatewayId\nvirtualGatewayName\nvirtualGatewayOwnerAccount\nvirtualGatewayRegion\nvirtualGatewayState\nvirtualGateways\nvirtualInterface\nvirtualInterfaceId\nvirtualInterfaceName\nvirtualInterfaceOwnerAccount\nvirtualInterfaceRegion\nvirtualInterfaceState\nvirtualInterfaceTest\nvirtualInterfaceTestHistory\nvirtualInterfaceType\nvirtualInterfaces\nvirtualName\nvirtualNode\nvirtualNodeName\nvirtualNodes\nvirtualRouter\nvirtualRouterName\nvirtualRouters\nvirtualService\nvirtualServiceName\nvirtualServices\nvisibility\nvlan\nvmId\nvmImportTaskId\nvmManagerId\nvmManagerName\nvmManagerType\nvmName\nvmPath\nvmServer\nvmServerAddress\nvmServerAddressList\nvmWareUuid\nvnfConfigurableProperties\nvnfInstanceId\nvnfPkgId\nvnfPkgIds\nvnfPkgName\nvnfProductName\nvnfProvider\nvnfState\nvnfcResourceInfo\nvnfd\nvnfdId\nvnfdVersion\nvoiceId\nvoiceSettings\nvolumeArn\nvolumeArns\nvolumeBaselineIOPS\nvolumeBaselineThroughput\nvolumeBurstIOPS\nvolumeBurstThroughput\nvolumeConfiguration\nvolumeEncryptionKMSKey\nvolumeId\nvolumeMounts\nvolumeRecommendationOptions\nvolumeRecommendations\nvolumeRetentionMode\nvolumeSize\nvolumeSizeInGB\nvolumeSizeInGb\nvolumeToConversionMap\nvolumeToVolumeSize\nvolumeType\nvolumes\nvolumesFrom\nvoutIndex\nvpc\nvpcConfig\nvpcConfiguration\nvpcDestinationSummary\nvpcEndpoint\nvpcEndpointDetails\nvpcEndpointErrorDetails\nvpcEndpointFilters\nvpcEndpointId\nvpcEndpointIds\nvpcEndpointSummaries\nvpcEndpoints\nvpcID\nvpcId\nvpcIdentifier\nvpcLinkId\nvpcProperties\nvpcSecurityGroupId\nvpcSecurityGroupIds\nvpcSecurityGroups\nvpceConfiguration\nvpceConfigurationArns\nvpceConfigurationDescription\nvpceConfigurationName\nvpceConfigurations\nvpceIds\nvpceServiceName\nvss\nvulnerabilities\nvulnerability\nvulnerabilityId\nvulnerabilityIdAggregation\nvulnerabilityIds\nvulnerabilitySource\nvulnerabilitySourceUpdatedAt\nvulnerablePackages\nwafWebAclArn\nwaitAndContinueSpecification\nwaitTimeInMinutes\nwaitTimeSeconds\nwaited\nwaitingForDataCollectionChecks\nwaitingResponse\nwarehouse\nwarned\nwarnings\nwaveAggregatedStatus\nwaveID\nwaveIDs\nwaves\nwavesCount\nwebAclArn\nwebUrl\nwebhook\nwebhookArn\nwebhookId\nwebhookName\nwebhookUrl\nwebhooks\nweeklySchedule\nweight\nweightFactor\nweightedTargets\nweights\nwelcomeMessages\nwidth\nwifi\nwindow\nwindows\nwindowsMountDrive\nwindowsUser\nwitnessedAt\nworkIds\nworkbookCursor\nworkbookId\nworkerConfiguration\nworkerConfigurationArn\nworkerConfigurations\nworkerCount\nworkerFleets\nworkerGroup\nworkerLogDelivery\nworkerName\nworkerTypeSpecifications\nworkers\nworkflowArn\nworkflowBucket\nworkflowBuildVersionArn\nworkflowExecution\nworkflowExecutionCancelRequestedEventAttributes\nworkflowExecutionCanceledEventAttributes\nworkflowExecutionCompletedEventAttributes\nworkflowExecutionContinuedAsNewEventAttributes\nworkflowExecutionFailedEventAttributes\nworkflowExecutionId\nworkflowExecutionRetentionPeriodInDays\nworkflowExecutionSignaledEventAttributes\nworkflowExecutionStartedEventAttributes\nworkflowExecutionTerminatedEventAttributes\nworkflowExecutionTimedOutEventAttributes\nworkflowExecutions\nworkflowId\nworkflowInputs\nworkflowName\nworkflowStepAutomationConfiguration\nworkflowStepGroupsSummary\nworkflowStepsSummary\nworkflowSummaries\nworkflowType\nworkflowTypeVersion\nworkgroup\nworkgroupArn\nworkgroupId\nworkgroupName\nworkgroups\nworkingDirectory\nworkspace\nworkspaceDataSources\nworkspaceDescription\nworkspaceId\nworkspaceName\nworkspaceNotificationDestinations\nworkspaceOrganizationalUnits\nworkspaceRoleArn\nworkspaceSummaries\nworkspaces\nworld\nworldConfigs\nworldCount\nworldDescriptionBody\nworldExportJobSummaries\nworldGenerationJobSummaries\nworldSummaries\nworldTags\nworlds\nwriteCapacityUnits\nwriteOperationType\nx\nx509CertificateData\nx509Subject\nxAmzErrorType\nxmlNamespace\nxrayEnabled\nxsltTemplateName\nxsltTemplateNameForMacSec\ny\nyear\nz\nzipUploadUrl\nzonalShiftId\nzonalShifts\nzoneName\n"
  },
  {
    "path": "codegen-core/src/test/resources/testOutput.txt",
    "content": "ACL,acl\nACLAlreadyExistsFault,acl_already_exists_fault\nACLName,acl_name\nACLNames,acl_names\nACLNotFoundFault,acl_not_found_fault\nACLPendingChanges,acl_pending_changes\nACLQuotaExceededFault,acl_quota_exceeded_fault\nACLToApply,acl_to_apply\nACLs,acls\nACLsUpdateStatus,acls_update_status\nACMCertificateArn,acm_certificate_arn\nACTIVE,active\nADDomainJoinPassword,ad_domain_join_password\nADDomainJoinUser,ad_domain_join_user\nADM,adm\nADMChannelRequest,adm_channel_request\nADMChannelResponse,adm_channel_response\nADMMessage,adm_message\nALPNPolicyNotSupportedException,alpn_policy_not_supported_exception\nAPICallRateForCustomerExceededFault,api_call_rate_for_customer_exceeded_fault\nAPIKey,api_key\nAPIKeySummaries,api_key_summaries\nAPIKeySummary,api_key_summary\nAPIName,api_name\nAPNS,apns\nAPNSChannelRequest,apns_channel_request\nAPNSChannelResponse,apns_channel_response\nAPNSMessage,apns_message\nAPNSPushNotificationTemplate,apns_push_notification_template\nAPNSPushType,apns_push_type\nAPNSSandboxChannelRequest,apns_sandbox_channel_request\nAPNSSandboxChannelResponse,apns_sandbox_channel_response\nAPNSVoipChannelRequest,apns_voip_channel_request\nAPNSVoipChannelResponse,apns_voip_channel_response\nAPNSVoipSandboxChannelRequest,apns_voip_sandbox_channel_request\nAPNSVoipSandboxChannelResponse,apns_voip_sandbox_channel_response\nARN,arn\nASN1Subject,asn1_subject\nASName,as_name\nASNumber,as_number\nASSERTION,assertion\nATIMetricDataPoint,ati_metric_data_point\nATIModelPerformance,ati_model_performance\nATITrainingMetricsValue,ati_training_metrics_value\nAWSAccessKeyId,aws_access_key_id\nAWSAccount,aws_account\nAWSAccountId,aws_account_id\nAWSAccountIds,aws_account_ids\nAWSCost,aws_cost\nAWSDomainInformation,aws_domain_information\nAWSKMSKeyARN,awskms_key_arn\nAWSLocation,aws_location\nAWSManagedRulesACFPRuleSet,aws_managed_rules_acfp_rule_set\nAWSManagedRulesATPRuleSet,aws_managed_rules_atp_rule_set\nAWSManagedRulesBotControlRuleSet,aws_managed_rules_bot_control_rule_set\nAWSOrganizationsNotInUseException,aws_organizations_not_in_use_exception\nAWSService,aws_service\nAWSServiceAccessNotEnabledException,aws_service_access_not_enabled_exception\nAWSServiceName,aws_service_name\nAWSSessionCredentials,aws_session_credentials\nAZList,az_list\nAZMode,az_mode\nAacSettings,aac_settings\nAbortConfig,abort_config\nAbortCriteria,abort_criteria\nAbortDate,abort_date\nAbortDocumentVersionUploadRequest,abort_document_version_upload_request\nAbortEnvironmentUpdateMessage,abort_environment_update_message\nAbortIncompleteMultipartUpload,abort_incomplete_multipart_upload\nAbortMultipartReadSetUploadRequest,abort_multipart_read_set_upload_request\nAbortMultipartUploadInput,abort_multipart_upload_input\nAbortMultipartUploadOutput,abort_multipart_upload_output\nAbortMultipartUploadRequest,abort_multipart_upload_request\nAbortRuleId,abort_rule_id\nAbortTransaction,abort_transaction\nAbortTransactionResult,abort_transaction_result\nAbortVaultLockInput,abort_vault_lock_input\nAbortableOperationInProgress,abortable_operation_in_progress\nAbpV1_0_x,abp_v1_0_x\nAbpV1_1,abp_v1_1\nAbrSettings,abr_settings\nAbsentInputAudioBehavior,absent_input_audio_behavior\nAbsoluteTime,absolute_time\nAbsoluteTimeRange,absolute_time_range\nAbuseContactEmail,abuse_contact_email\nAbuseContactPhone,abuse_contact_phone\nAc3Settings,ac3_settings\nAccelerateConfiguration,accelerate_configuration\nAccelerationSettings,acceleration_settings\nAccelerationStatus,acceleration_status\nAccelerator,accelerator\nAcceleratorArn,accelerator_arn\nAcceleratorAttributes,accelerator_attributes\nAcceleratorCount,accelerator_count\nAcceleratorCountRequest,accelerator_count_request\nAcceleratorEvent,accelerator_event\nAcceleratorManufacturers,accelerator_manufacturers\nAcceleratorNames,accelerator_names\nAcceleratorNotDisabledException,accelerator_not_disabled_exception\nAcceleratorNotFoundException,accelerator_not_found_exception\nAcceleratorPort,accelerator_port\nAcceleratorSocketAddresses,accelerator_socket_addresses\nAcceleratorTotalMemoryMiB,accelerator_total_memory_mib\nAcceleratorTotalMemoryMiBRequest,accelerator_total_memory_mib_request\nAcceleratorType,accelerator_type\nAcceleratorTypeOffering,accelerator_type_offering\nAcceleratorTypes,accelerator_types\nAccelerators,accelerators\nAccent,accent\nAccentForeground,accent_foreground\nAccept,accept\nAcceptAddressTransferRequest,accept_address_transfer_request\nAcceptAddressTransferResult,accept_address_transfer_result\nAcceptAdministratorInvitationRequest,accept_administrator_invitation_request\nAcceptAnyDate,accept_any_date\nAcceptAttachmentRequest,accept_attachment_request\nAcceptAttachmentResponse,accept_attachment_response\nAcceptCertificateTransferRequest,accept_certificate_transfer_request\nAcceptCode,accept_code\nAcceptCodeValidation,accept_code_validation\nAcceptDirectConnectGatewayAssociationProposalRequest,accept_direct_connect_gateway_association_proposal_request\nAcceptDirectConnectGatewayAssociationProposalResult,accept_direct_connect_gateway_association_proposal_result\nAcceptDomainTransferFromAnotherAwsAccountRequest,accept_domain_transfer_from_another_aws_account_request\nAcceptDomainTransferFromAnotherAwsAccountResponse,accept_domain_transfer_from_another_aws_account_response\nAcceptEnvironmentAccountConnectionInput,accept_environment_account_connection_input\nAcceptEnvironmentAccountConnectionOutput,accept_environment_account_connection_output\nAcceptEulasRequest,accept_eulas_request\nAcceptEulasResponse,accept_eulas_response\nAcceptGrantRequest,accept_grant_request\nAcceptGrantResponse,accept_grant_response\nAcceptHandshakeRequest,accept_handshake_request\nAcceptHandshakeResponse,accept_handshake_response\nAcceptInboundConnectionRequest,accept_inbound_connection_request\nAcceptInboundConnectionResponse,accept_inbound_connection_response\nAcceptInboundCrossClusterSearchConnectionRequest,accept_inbound_cross_cluster_search_connection_request\nAcceptInboundCrossClusterSearchConnectionResponse,accept_inbound_cross_cluster_search_connection_response\nAcceptInputDeviceTransferRequest,accept_input_device_transfer_request\nAcceptInvitationRequest,accept_invitation_request\nAcceptLanguage,accept_language\nAcceptMatchInput,accept_match_input\nAcceptPageRequest,accept_page_request\nAcceptPortfolioShareInput,accept_portfolio_share_input\nAcceptQualificationRequestRequest,accept_qualification_request_request\nAcceptRanges,accept_ranges\nAcceptReservedInstancesExchangeQuoteRequest,accept_reserved_instances_exchange_quote_request\nAcceptReservedInstancesExchangeQuoteResult,accept_reserved_instances_exchange_quote_result\nAcceptReservedNodeExchangeInputMessage,accept_reserved_node_exchange_input_message\nAcceptReservedNodeExchangeOutputMessage,accept_reserved_node_exchange_output_message\nAcceptResourceShareInvitationRequest,accept_resource_share_invitation_request\nAcceptResourceShareInvitationResponse,accept_resource_share_invitation_response\nAcceptShareRequest,accept_share_request\nAcceptShareResponse,accept_share_response\nAcceptSharedDirectoryRequest,accept_shared_directory_request\nAcceptSharedDirectoryResult,accept_shared_directory_result\nAcceptTermsAndConditions,accept_terms_and_conditions\nAcceptTime,accept_time\nAcceptTransitGatewayMulticastDomainAssociationsRequest,accept_transit_gateway_multicast_domain_associations_request\nAcceptTransitGatewayMulticastDomainAssociationsResult,accept_transit_gateway_multicast_domain_associations_result\nAcceptTransitGatewayPeeringAttachmentRequest,accept_transit_gateway_peering_attachment_request\nAcceptTransitGatewayPeeringAttachmentResult,accept_transit_gateway_peering_attachment_result\nAcceptTransitGatewayVpcAttachmentRequest,accept_transit_gateway_vpc_attachment_request\nAcceptTransitGatewayVpcAttachmentResult,accept_transit_gateway_vpc_attachment_result\nAcceptType,accept_type\nAcceptVpcEndpointConnectionsRequest,accept_vpc_endpoint_connections_request\nAcceptVpcEndpointConnectionsResult,accept_vpc_endpoint_connections_result\nAcceptVpcPeeringConnectionRequest,accept_vpc_peering_connection_request\nAcceptVpcPeeringConnectionResult,accept_vpc_peering_connection_result\nAcceptanceRequired,acceptance_required\nAcceptanceThreshold,acceptance_threshold\nAcceptanceTimeoutSeconds,acceptance_timeout_seconds\nAcceptanceType,acceptance_type\nAccepted,accepted\nAcceptedRouteCount,accepted_route_count\nAccepterPeeringConnectionOptions,accepter_peering_connection_options\nAccepterTgwInfo,accepter_tgw_info\nAccepterTransitGatewayAttachmentId,accepter_transit_gateway_attachment_id\nAccepterVpcInfo,accepter_vpc_info\nAccess,access\nAccessAll,access_all\nAccessAlternateDirectly,access_alternate_directly\nAccessBasedEnumeration,access_based_enumeration\nAccessConfiguration,access_configuration\nAccessControl,access_control\nAccessControlAllowCredentials,access_control_allow_credentials\nAccessControlAllowHeaders,access_control_allow_headers\nAccessControlAllowMethods,access_control_allow_methods\nAccessControlAllowOrigins,access_control_allow_origins\nAccessControlAttribute,access_control_attribute\nAccessControlAttributeValue,access_control_attribute_value\nAccessControlAttributes,access_control_attributes\nAccessControlConfigurationId,access_control_configuration_id\nAccessControlConfigurationSummary,access_control_configuration_summary\nAccessControlConfigurations,access_control_configurations\nAccessControlEntries,access_control_entries\nAccessControlEntry,access_control_entry\nAccessControlEntrySummary,access_control_entry_summary\nAccessControlExposeHeaders,access_control_expose_headers\nAccessControlGrants,access_control_grants\nAccessControlList,access_control_list\nAccessControlListConfiguration,access_control_list_configuration\nAccessControlMaxAgeSec,access_control_max_age_sec\nAccessControlPolicy,access_control_policy\nAccessControlRule,access_control_rule\nAccessControlTranslation,access_control_translation\nAccessDenied,access_denied\nAccessDeniedException,access_denied_exception\nAccessDeniedFault,access_denied_fault\nAccessDeniedForDependencyException,access_denied_for_dependency_exception\nAccessDescription,access_description\nAccessDetail,access_detail\nAccessDetails,access_details\nAccessEndpoint,access_endpoint\nAccessEndpoints,access_endpoints\nAccessForbidden,access_forbidden\nAccessGroupId,access_group_id\nAccessKey,access_key\nAccessKeyDetails,access_key_details\nAccessKeyId,access_key_id\nAccessKeyLastUsed,access_key_last_used\nAccessKeyMetadata,access_key_metadata\nAccessLevelFilter,access_level_filter\nAccessLocation,access_location\nAccessLog,access_log\nAccessLogSettings,access_log_settings\nAccessLogSubscriptionSummary,access_log_subscription_summary\nAccessLoggingEnabled,access_logging_enabled\nAccessLogs,access_logs\nAccessMethod,access_method\nAccessMethodType,access_method_type\nAccessPoint,access_point\nAccessPointAlreadyExists,access_point_already_exists\nAccessPointArn,access_point_arn\nAccessPointDescription,access_point_description\nAccessPointId,access_point_id\nAccessPointLimitExceeded,access_point_limit_exceeded\nAccessPointList,access_point_list\nAccessPointNotFound,access_point_not_found\nAccessPointNotFoundException,access_point_not_found_exception\nAccessPoints,access_points\nAccessPolicies,access_policies\nAccessPoliciesStatus,access_policies_status\nAccessPolicy,access_policy\nAccessPolicyDetail,access_policy_detail\nAccessPolicyStats,access_policy_stats\nAccessPolicySummary,access_policy_summary\nAccessPreview,access_preview\nAccessPreviewFinding,access_preview_finding\nAccessPreviewStatusReason,access_preview_status_reason\nAccessPreviewSummary,access_preview_summary\nAccessRights,access_rights\nAccessRole,access_role\nAccessRoleArn,access_role_arn\nAccessRules,access_rules\nAccessScopeAnalysisFinding,access_scope_analysis_finding\nAccessScopePath,access_scope_path\nAccessScopePathRequest,access_scope_path_request\nAccessStatus,access_status\nAccessString,access_string\nAccessSysfs,access_sysfs\nAccessTier,access_tier\nAccessToClusterDeniedFault,access_to_cluster_denied_fault\nAccessToSnapshotDeniedFault,access_to_snapshot_denied_fault\nAccessToken,access_token\nAccessTokenExpiration,access_token_expiration\nAccessTokenSummary,access_token_summary\nAccessTokenValidity,access_token_validity\nAccessType,access_type\nAccessUrl,access_url\nAccesses,accesses\nAccessibility,accessibility\nAccessibilityCaptionHints,accessibility_caption_hints\nAccessor,accessor\nAccessorId,accessor_id\nAccessorSummary,accessor_summary\nAccessorType,accessor_type\nAccessors,accessors\nAccount,account\nAccountActionRequiredException,account_action_required_exception\nAccountAggregation,account_aggregation\nAccountAggregationResponse,account_aggregation_response\nAccountAggregationSource,account_aggregation_source\nAccountAggregationSources,account_aggregation_sources\nAccountAlias,account_alias\nAccountAliases,account_aliases\nAccountAlreadyClosedException,account_already_closed_exception\nAccountAlreadyRegisteredException,account_already_registered_exception\nAccountAssignment,account_assignment\nAccountAssignmentCreationRequestId,account_assignment_creation_request_id\nAccountAssignmentCreationStatus,account_assignment_creation_status\nAccountAssignmentDeletionRequestId,account_assignment_deletion_request_id\nAccountAssignmentDeletionStatus,account_assignment_deletion_status\nAccountAssignmentOperationStatus,account_assignment_operation_status\nAccountAssignmentOperationStatusMetadata,account_assignment_operation_status_metadata\nAccountAssignments,account_assignments\nAccountAssignmentsCreationStatus,account_assignments_creation_status\nAccountAssignmentsDeletionStatus,account_assignments_deletion_status\nAccountAssociationsListElement,account_associations_list_element\nAccountAttribute,account_attribute\nAccountAttributeList,account_attribute_list\nAccountAttributeValue,account_attribute_value\nAccountAttributes,account_attributes\nAccountAttributesMessage,account_attributes_message\nAccountChannelLimitExceededException,account_channel_limit_exceeded_exception\nAccountConfiguration,account_configuration\nAccountCustomization,account_customization\nAccountDetail,account_detail\nAccountDetails,account_details\nAccountEmail,account_email\nAccountEnrollmentStatus,account_enrollment_status\nAccountEntityAggregate,account_entity_aggregate\nAccountFilterType,account_filter_type\nAccountFindingsMetric,account_findings_metric\nAccountFreeTrialInfo,account_free_trial_info\nAccountGateResult,account_gate_result\nAccountGrouping,account_grouping\nAccountHasOngoingImportException,account_has_ongoing_import_exception\nAccountHealth,account_health\nAccountID,account_id\nAccountId,account_id\nAccountIds,account_ids\nAccountIdsToAdd,account_ids_to_add\nAccountIdsToRemove,account_ids_to_remove\nAccountInfo,account_info\nAccountInsightHealth,account_insight_health\nAccountLevel,account_level\nAccountLevelBpaSync,account_level_bpa_sync\nAccountLevelPermissions,account_level_permissions\nAccountLimit,account_limit\nAccountLimitExceededException,account_limit_exceeded_exception\nAccountLimits,account_limits\nAccountLinked,account_linked\nAccountMaxReadCapacityUnits,account_max_read_capacity_units\nAccountMaxWriteCapacityUnits,account_max_write_capacity_units\nAccountModification,account_modification\nAccountModifications,account_modifications\nAccountName,account_name\nAccountNotFoundException,account_not_found_exception\nAccountNotRegisteredException,account_not_registered_exception\nAccountNumber,account_number\nAccountOwnerNotVerifiedException,account_owner_not_verified_exception\nAccountPassword,account_password\nAccountPolicy,account_policy\nAccountQuota,account_quota\nAccountQuotaName,account_quota_name\nAccountQuotas,account_quotas\nAccountRecoverySetting,account_recovery_setting\nAccountRecoverySettingType,account_recovery_setting_type\nAccountRegisteredException,account_registered_exception\nAccountScope,account_scope\nAccountSendingPausedException,account_sending_paused_exception\nAccountSettings,account_settings\nAccountSettingsDetail,account_settings_detail\nAccountSetupInProgressException,account_setup_in_progress_exception\nAccountSharingInfo,account_sharing_info\nAccountSharingInfoList,account_sharing_info_list\nAccountState,account_state\nAccountStatus,account_status\nAccountStatusList,account_status_list\nAccountStreamLimitExceededException,account_stream_limit_exceeded_exception\nAccountSubscriptionStatus,account_subscription_status\nAccountSummary,account_summary\nAccountSuspendedException,account_suspended_exception\nAccountTakeoverActionType,account_takeover_action_type\nAccountTakeoverActionsType,account_takeover_actions_type\nAccountTakeoverRiskConfiguration,account_takeover_risk_configuration\nAccountTakeoverRiskConfigurationType,account_takeover_risk_configuration_type\nAccountType,account_type\nAccountUsage,account_usage\nAccountWithRestoreAccess,account_with_restore_access\nAccounts,accounts\nAccountsUrl,accounts_url\nAccountsWithRestoreAccess,accounts_with_restore_access\nAccumulatedInferenceDataEndTime,accumulated_inference_data_end_time\nAccumulatedInferenceDataStartTime,accumulated_inference_data_start_time\nAccuracy,accuracy\nAccuracyCostTradeoff,accuracy_cost_tradeoff\nAckModeRetryDurationSecs,ack_mode_retry_duration_secs\nAcknowledgeActionConfiguration,acknowledge_action_configuration\nAcknowledgeAlarmActionRequest,acknowledge_alarm_action_request\nAcknowledgeFlow,acknowledge_flow\nAcknowledgeJobInput,acknowledge_job_input\nAcknowledgeJobOutput,acknowledge_job_output\nAcknowledgeOrderReceiptRequest,acknowledge_order_receipt_request\nAcknowledgeOrderReceiptResponse,acknowledge_order_receipt_response\nAcknowledgeThirdPartyJobInput,acknowledge_third_party_job_input\nAcknowledgeThirdPartyJobOutput,acknowledge_third_party_job_output\nAcknowledgedAt,acknowledged_at\nAcl,acl\nAclConfiguration,acl_configuration\nAclRule,acl_rule\nAcmCertificateArn,acm_certificate_arn\nAcquisitionPointId,acquisition_point_id\nAction,action\nActionAfterCompletion,action_after_completion\nActionArn,action_arn\nActionCondition,action_condition\nActionConfiguration,action_configuration\nActionConfigurationProperty,action_configuration_property\nActionContext,action_context\nActionDeclaration,action_declaration\nActionDefinition,action_definition\nActionDescription,action_description\nActionExecution,action_execution\nActionExecutionDetail,action_execution_detail\nActionExecutionFilter,action_execution_filter\nActionExecutionInput,action_execution_input\nActionExecutionOutput,action_execution_output\nActionExecutionResult,action_execution_result\nActionHistories,action_histories\nActionHistory,action_history\nActionHistoryDetails,action_history_details\nActionID,action_id\nActionId,action_id\nActionIdentifier,action_identifier\nActionInvocation,action_invocation\nActionInvocations,action_invocations\nActionLocalIpDetails,action_local_ip_details\nActionLocalPortDetails,action_local_port_details\nActionName,action_name\nActionNames,action_names\nActionNotFoundException,action_not_found_exception\nActionOnFailure,action_on_failure\nActionOperations,action_operations\nActionParameter,action_parameter\nActionParameters,action_parameters\nActionPrefix,action_prefix\nActionRemoteIpDetails,action_remote_ip_details\nActionRemotePortDetails,action_remote_port_details\nActionRequired,action_required\nActionRequiredCode,action_required_code\nActionRequiredInfo,action_required_info\nActionRevision,action_revision\nActionSource,action_source\nActionState,action_state\nActionSubType,action_sub_type\nActionSummaries,action_summaries\nActionSummary,action_summary\nActionTarget,action_target\nActionTargetArn,action_target_arn\nActionTargetArns,action_target_arns\nActionTargets,action_targets\nActionThreshold,action_threshold\nActionThresholdType,action_threshold_type\nActionThresholdValue,action_threshold_value\nActionToUse,action_to_use\nActionType,action_type\nActionTypeArtifactDetails,action_type_artifact_details\nActionTypeDeclaration,action_type_declaration\nActionTypeExecutor,action_type_executor\nActionTypeId,action_type_id\nActionTypeIdentifier,action_type_identifier\nActionTypeNotFoundException,action_type_not_found_exception\nActionTypePermissions,action_type_permissions\nActionTypeProperty,action_type_property\nActionTypeSettings,action_type_settings\nActionTypeUrls,action_type_urls\nActions,actions\nActionsEnabled,actions_enabled\nActionsGuarded,actions_guarded\nActionsRequired,actions_required\nActionsSuppressedBy,actions_suppressed_by\nActionsSuppressedReason,actions_suppressed_reason\nActionsSuppressor,actions_suppressor\nActionsSuppressorExtensionPeriod,actions_suppressor_extension_period\nActionsSuppressorWaitPeriod,actions_suppressor_wait_period\nActivate,activate\nActivateAnomalyDetectorRequest,activate_anomaly_detector_request\nActivateContactChannelRequest,activate_contact_channel_request\nActivateDeviceIdentifierRequest,activate_device_identifier_request\nActivateDeviceIdentifierResponse,activate_device_identifier_response\nActivateEvaluationFormRequest,activate_evaluation_form_request\nActivateEvaluationFormResponse,activate_evaluation_form_response\nActivateEventSourceRequest,activate_event_source_request\nActivateGatewayInput,activate_gateway_input\nActivateGatewayOutput,activate_gateway_output\nActivateKeySigningKeyRequest,activate_key_signing_key_request\nActivateKeySigningKeyResponse,activate_key_signing_key_response\nActivateNetworkSiteRequest,activate_network_site_request\nActivateNetworkSiteResponse,activate_network_site_response\nActivatePipelineInput,activate_pipeline_input\nActivateReadSetFilter,activate_read_set_filter\nActivateReadSetJobItem,activate_read_set_job_item\nActivateReadSetSourceItem,activate_read_set_source_item\nActivateTypeInput,activate_type_input\nActivateTypeOutput,activate_type_output\nActivateUserRequest,activate_user_request\nActivateUserResponse,activate_user_response\nActivated,activated\nActivatedRule,activated_rule\nActivatedRules,activated_rules\nActivation,activation\nActivationCode,activation_code\nActivationId,activation_id\nActivationKey,activation_key\nActivationList,activation_list\nActivationOverrideBehavior,activation_override_behavior\nActivationState,activation_state\nActivationStatus,activation_status\nActivationUrl,activation_url\nActive,active\nActiveAssignments,active_assignments\nActiveAvailabilityZoneCount,active_availability_zone_count\nActiveChannelPipeline,active_channel_pipeline\nActiveContext,active_context\nActiveContextTimeToLive,active_context_time_to_live\nActiveDate,active_date\nActiveDeviceCount,active_device_count\nActiveDirectory,active_directory\nActiveDirectoryBackupAttributes,active_directory_backup_attributes\nActiveDirectoryComputerAttribute,active_directory_computer_attribute\nActiveDirectoryConfiguration,active_directory_configuration\nActiveDirectoryError,active_directory_error\nActiveDirectoryId,active_directory_id\nActiveDirectoryIdentityProvider,active_directory_identity_provider\nActiveDirectoryName,active_directory_name\nActiveDirectoryStatus,active_directory_status\nActiveGameSessionCount,active_game_session_count\nActiveIAMPolicyAssignment,active_iam_policy_assignment\nActiveInput,active_input\nActiveInputAttachmentName,active_input_attachment_name\nActiveInputSwitchActionName,active_input_switch_action_name\nActiveInstance,active_instance\nActiveInstanceRefreshNotFoundFault,active_instance_refresh_not_found_fault\nActiveInstances,active_instances\nActiveMQBrokerParameters,active_mq_broker_parameters\nActiveModelArn,active_model_arn\nActiveModelVersion,active_model_version\nActiveModelVersionArn,active_model_version_arn\nActiveMotionGraphicsActionName,active_motion_graphics_action_name\nActiveMotionGraphicsUri,active_motion_graphics_uri\nActiveNodes,active_nodes\nActiveOperationArn,active_operation_arn\nActiveServerProcessCount,active_server_process_count\nActiveServicesCount,active_services_count\nActiveSlotsByChannel,active_slots_by_channel\nActiveSpeakerOnlyConfiguration,active_speaker_only_configuration\nActiveSpeakerPosition,active_speaker_position\nActiveStatementsExceededException,active_statements_exceeded_exception\nActiveSubscribedDomains,active_subscribed_domains\nActiveTracing,active_tracing\nActiveTrustedKeyGroups,active_trusted_key_groups\nActiveTrustedSigners,active_trusted_signers\nActiveVersion,active_version\nActiveViolation,active_violation\nActiveWatermarkProcess,active_watermark_process\nActivities,activities\nActivitiesResponse,activities_response\nActivitiesType,activities_type\nActivity,activity\nActivityDoesNotExist,activity_does_not_exist\nActivityFailedEventDetails,activity_failed_event_details\nActivityId,activity_id\nActivityIds,activity_ids\nActivityLimitExceeded,activity_limit_exceeded\nActivityListItem,activity_list_item\nActivityMetrics,activity_metrics\nActivityResponse,activity_response\nActivityScheduleFailedEventDetails,activity_schedule_failed_event_details\nActivityScheduledEventDetails,activity_scheduled_event_details\nActivityStartedEventDetails,activity_started_event_details\nActivityStatus,activity_status\nActivityStreamEngineNativeAuditFieldsIncluded,activity_stream_engine_native_audit_fields_included\nActivityStreamKinesisStreamName,activity_stream_kinesis_stream_name\nActivityStreamKmsKeyId,activity_stream_kms_key_id\nActivityStreamMode,activity_stream_mode\nActivityStreamPolicyStatus,activity_stream_policy_status\nActivityStreamStatus,activity_stream_status\nActivitySucceededEventDetails,activity_succeeded_event_details\nActivityTask,activity_task\nActivityTaskCancelRequestedEventAttributes,activity_task_cancel_requested_event_attributes\nActivityTaskCanceledEventAttributes,activity_task_canceled_event_attributes\nActivityTaskCompletedEventAttributes,activity_task_completed_event_attributes\nActivityTaskFailedEventAttributes,activity_task_failed_event_attributes\nActivityTaskScheduledEventAttributes,activity_task_scheduled_event_attributes\nActivityTaskStartedEventAttributes,activity_task_started_event_attributes\nActivityTaskStatus,activity_task_status\nActivityTaskTimedOutEventAttributes,activity_task_timed_out_event_attributes\nActivityTimedOutEventDetails,activity_timed_out_event_details\nActivityType,activity_type\nActivityTypeConfiguration,activity_type_configuration\nActivityTypeDetail,activity_type_detail\nActivityTypeInfo,activity_type_info\nActivityTypeInfos,activity_type_infos\nActivityTypes,activity_types\nActivityWorkerLimitExceeded,activity_worker_limit_exceeded\nActorDoesNotExistException,actor_does_not_exist_exception\nActual,actual\nActualAmount,actual_amount\nActualBlockHourlyPrice,actual_block_hourly_price\nActualEndTime,actual_end_time\nActualFirewallEndpoint,actual_firewall_endpoint\nActualFirewallSubnetId,actual_firewall_subnet_id\nActualFirewallSubnetRoutes,actual_firewall_subnet_routes\nActualIncrementalBackupSizeInMegaBytes,actual_incremental_backup_size_in_mega_bytes\nActualInternetGatewayRoutes,actual_internet_gateway_routes\nActualProperties,actual_properties\nActualSpend,actual_spend\nActualStartTime,actual_start_time\nActualValue,actual_value\nActuator,actuator\nAdAvailOffset,ad_avail_offset\nAdBreak,ad_break\nAdBreakMetadata,ad_break_metadata\nAdBreaks,ad_breaks\nAdDecisionServerUrl,ad_decision_server_url\nAdHocFilteringOption,ad_hoc_filtering_option\nAdMarkerHls,ad_marker_hls\nAdMarkerPassthrough,ad_marker_passthrough\nAdMarkers,ad_markers\nAdMarkupType,ad_markup_type\nAdSegmentUrlPrefix,ad_segment_url_prefix\nAdTriggers,ad_triggers\nAdaptiveQuantization,adaptive_quantization\nAdd,add\nAddAllocationResourceTags,add_allocation_resource_tags\nAddAllowedPrincipals,add_allowed_principals\nAddApplicationCloudWatchLoggingOptionRequest,add_application_cloud_watch_logging_option_request\nAddApplicationCloudWatchLoggingOptionResponse,add_application_cloud_watch_logging_option_response\nAddApplicationInputProcessingConfigurationRequest,add_application_input_processing_configuration_request\nAddApplicationInputProcessingConfigurationResponse,add_application_input_processing_configuration_response\nAddApplicationInputRequest,add_application_input_request\nAddApplicationInputResponse,add_application_input_response\nAddApplicationOutputRequest,add_application_output_request\nAddApplicationOutputResponse,add_application_output_response\nAddApplicationReferenceDataSourceRequest,add_application_reference_data_source_request\nAddApplicationReferenceDataSourceResponse,add_application_reference_data_source_response\nAddApplicationVpcConfigurationRequest,add_application_vpc_configuration_request\nAddApplicationVpcConfigurationResponse,add_application_vpc_configuration_response\nAddArguments,add_arguments\nAddAssociationRequest,add_association_request\nAddAssociationResponse,add_association_response\nAddAttachmentsToSetRequest,add_attachments_to_set_request\nAddAttachmentsToSetResponse,add_attachments_to_set_response\nAddAttributesActivity,add_attributes_activity\nAddAttributesToFindingsRequest,add_attributes_to_findings_request\nAddAttributesToFindingsResponse,add_attributes_to_findings_response\nAddAvailabilityZonesInput,add_availability_zones_input\nAddAvailabilityZonesOutput,add_availability_zones_output\nAddBridgeFlowSourceRequest,add_bridge_flow_source_request\nAddBridgeNetworkOutputRequest,add_bridge_network_output_request\nAddBridgeNetworkSourceRequest,add_bridge_network_source_request\nAddBridgeOutputRequest,add_bridge_output_request\nAddBridgeOutputsRequest,add_bridge_outputs_request\nAddBridgeOutputsResponse,add_bridge_outputs_response\nAddBridgeSourceRequest,add_bridge_source_request\nAddBridgeSourcesRequest,add_bridge_sources_request\nAddBridgeSourcesResponse,add_bridge_sources_response\nAddCacheInput,add_cache_input\nAddCacheOutput,add_cache_output\nAddClientIDToOpenIDConnectProviderRequest,add_client_id_to_open_id_connect_provider_request\nAddColumnName,add_column_name\nAddCommunicationToCaseRequest,add_communication_to_case_request\nAddCommunicationToCaseResponse,add_communication_to_case_response\nAddCustomAttributesRequest,add_custom_attributes_request\nAddCustomRoutingEndpointsRequest,add_custom_routing_endpoints_request\nAddCustomRoutingEndpointsResponse,add_custom_routing_endpoints_response\nAddDraftAppVersionResourceMappingsRequest,add_draft_app_version_resource_mappings_request\nAddDraftAppVersionResourceMappingsResponse,add_draft_app_version_resource_mappings_response\nAddEgressGatewayBridgeRequest,add_egress_gateway_bridge_request\nAddEndpointsRequest,add_endpoints_request\nAddEndpointsResponse,add_endpoints_response\nAddEntries,add_entries\nAddFacetToObject,add_facet_to_object\nAddFacetToObjectRequest,add_facet_to_object_request\nAddFlowMediaStreamsRequest,add_flow_media_streams_request\nAddFlowMediaStreamsResponse,add_flow_media_streams_response\nAddFlowOutputs420Exception,add_flow_outputs420_exception\nAddFlowOutputsRequest,add_flow_outputs_request\nAddFlowOutputsResponse,add_flow_outputs_response\nAddFlowSourcesRequest,add_flow_sources_request\nAddFlowSourcesResponse,add_flow_sources_response\nAddFlowVpcInterfacesRequest,add_flow_vpc_interfaces_request\nAddFlowVpcInterfacesResponse,add_flow_vpc_interfaces_response\nAddGatewayLoadBalancerArns,add_gateway_load_balancer_arns\nAddGwMetadata,add_gw_metadata\nAddHeaderAction,add_header_action\nAddIamRoles,add_iam_roles\nAddIdleTimeBetweenReads,add_idle_time_between_reads\nAddInId,add_in_id\nAddIngressGatewayBridgeRequest,add_ingress_gateway_bridge_request\nAddIns,add_ins\nAddInstanceFleetInput,add_instance_fleet_input\nAddInstanceFleetOutput,add_instance_fleet_output\nAddInstanceGroupsInput,add_instance_groups_input\nAddInstanceGroupsOutput,add_instance_groups_output\nAddIpRoutesRequest,add_ip_routes_request\nAddIpamOperatingRegion,add_ipam_operating_region\nAddJobFlowStepsInput,add_job_flow_steps_input\nAddJobFlowStepsOutput,add_job_flow_steps_output\nAddLFTagsToResourceRequest,add_lf_tags_to_resource_request\nAddLFTagsToResourceResponse,add_lf_tags_to_resource_response\nAddLayerVersionPermissionRequest,add_layer_version_permission_request\nAddLayerVersionPermissionResponse,add_layer_version_permission_response\nAddLicenseSpecifications,add_license_specifications\nAddListenerCertificatesInput,add_listener_certificates_input\nAddListenerCertificatesOutput,add_listener_certificates_output\nAddMaintenance,add_maintenance\nAddMediaStreamRequest,add_media_stream_request\nAddNetworkLoadBalancerArns,add_network_load_balancer_arns\nAddNetworkServices,add_network_services\nAddNotificationChannelRequest,add_notification_channel_request\nAddNotificationChannelResponse,add_notification_channel_response\nAddNotificationChannelsRequest,add_notification_channels_request\nAddNotificationChannelsResponse,add_notification_channels_response\nAddObject,add_object\nAddObjectInput,add_object_input\nAddOn,add_on\nAddOnRequest,add_on_request\nAddOperatingRegions,add_operating_regions\nAddOutputRequest,add_output_request\nAddPermissionInput,add_permission_input\nAddPermissionRequest,add_permission_request\nAddPermissionResponse,add_permission_response\nAddPrefixListEntry,add_prefix_list_entry\nAddProfileKeyRequest,add_profile_key_request\nAddProfileKeyResponse,add_profile_key_response\nAddProfilePermissionRequest,add_profile_permission_request\nAddProfilePermissionResponse,add_profile_permission_response\nAddPublicKeys,add_public_keys\nAddRecordTimestamp,add_record_timestamp\nAddRegionAction,add_region_action\nAddRegionRequest,add_region_request\nAddReplicaRegions,add_replica_regions\nAddResourcePermissionsRequest,add_resource_permissions_request\nAddResourcePermissionsResponse,add_resource_permissions_response\nAddRoleToDBClusterMessage,add_role_to_db_cluster_message\nAddRoleToDBInstanceMessage,add_role_to_db_instance_message\nAddRoleToInstanceProfileRequest,add_role_to_instance_profile_request\nAddRouteTableIds,add_route_table_ids\nAddSecurityGroupIds,add_security_group_ids\nAddSourceIdentifierToSubscriptionMessage,add_source_identifier_to_subscription_message\nAddSourceIdentifierToSubscriptionResult,add_source_identifier_to_subscription_result\nAddStorageSystemRequest,add_storage_system_request\nAddStorageSystemResponse,add_storage_system_response\nAddSubnetArns,add_subnet_arns\nAddSubnetIds,add_subnet_ids\nAddSubnets,add_subnets\nAddSupplementalLogging,add_supplemental_logging\nAddSupportedIpAddressTypes,add_supported_ip_address_types\nAddTags,add_tags\nAddTagsInput,add_tags_input\nAddTagsOutput,add_tags_output\nAddTagsRequest,add_tags_request\nAddTagsToCertificateRequest,add_tags_to_certificate_request\nAddTagsToOnPremisesInstancesInput,add_tags_to_on_premises_instances_input\nAddTagsToResourceInput,add_tags_to_resource_input\nAddTagsToResourceMessage,add_tags_to_resource_message\nAddTagsToResourceOutput,add_tags_to_resource_output\nAddTagsToResourceRequest,add_tags_to_resource_request\nAddTagsToResourceResponse,add_tags_to_resource_response\nAddTagsToStreamInput,add_tags_to_stream_input\nAddTagsToVaultInput,add_tags_to_vault_input\nAddTexture,add_texture\nAddThingToBillingGroupRequest,add_thing_to_billing_group_request\nAddThingToThingGroupRequest,add_thing_to_thing_group_request\nAddThingsToThingGroupParams,add_things_to_thing_group_params\nAddTrailingPaddingCharacter,add_trailing_padding_character\nAddTransitGatewayCidrBlocks,add_transit_gateway_cidr_blocks\nAddUploadBufferInput,add_upload_buffer_input\nAddUploadBufferOutput,add_upload_buffer_output\nAddUserToGroupRequest,add_user_to_group_request\nAddWorkingStorageInput,add_working_storage_input\nAddWorkingStorageOutput,add_working_storage_output\nAddWorkloadRequest,add_workload_request\nAddWorkloadResponse,add_workload_response\nAddedDateTime,added_date_time\nAddedPrincipal,added_principal\nAddedPrincipals,added_principals\nAddedToClusterTime,added_to_cluster_time\nAdditionalAccounts,additional_accounts\nAdditionalArchivedLogDestId,additional_archived_log_dest_id\nAdditionalArtifacts,additional_artifacts\nAdditionalAttribute,additional_attribute\nAdditionalAttributes,additional_attributes\nAdditionalAuditContext,additional_audit_context\nAdditionalAuthTypes,additional_auth_types\nAdditionalAuthenticationProvider,additional_authentication_provider\nAdditionalAuthenticationProviders,additional_authentication_providers\nAdditionalBootstrapServers,additional_bootstrap_servers\nAdditionalCodeRepositories,additional_code_repositories\nAdditionalCodeRepositoryEquals,additional_code_repository_equals\nAdditionalConfigs,additional_configs\nAdditionalConfiguration,additional_configuration\nAdditionalConstraints,additional_constraints\nAdditionalContactEmailAddresses,additional_contact_email_addresses\nAdditionalDashboardIds,additional_dashboard_ids\nAdditionalDataPending,additional_data_pending\nAdditionalDataSources,additional_data_sources\nAdditionalDataset,additional_dataset\nAdditionalDatasets,additional_datasets\nAdditionalDeltaOptions,additional_delta_options\nAdditionalDetail,additional_detail\nAdditionalDetailType,additional_detail_type\nAdditionalDetails,additional_details\nAdditionalHudiOptions,additional_hudi_options\nAdditionalInferenceSpecificationDefinition,additional_inference_specification_definition\nAdditionalInferenceSpecifications,additional_inference_specifications\nAdditionalInferenceSpecificationsToAdd,additional_inference_specifications_to_add\nAdditionalInfo,additional_info\nAdditionalInformation,additional_information\nAdditionalInstanceConfiguration,additional_instance_configuration\nAdditionalLanguageCodes,additional_language_codes\nAdditionalLimit,additional_limit\nAdditionalLimits,additional_limits\nAdditionalLocations,additional_locations\nAdditionalManifests,additional_manifests\nAdditionalMasterSecurityGroups,additional_master_security_groups\nAdditionalMetadata,additional_metadata\nAdditionalMetrics,additional_metrics\nAdditionalOccurrences,additional_occurrences\nAdditionalOptions,additional_options\nAdditionalPlanOptionsMap,additional_plan_options_map\nAdditionalPlayerCount,additional_player_count\nAdditionalRegions,additional_regions\nAdditionalResources,additional_resources\nAdditionalResponseAttributes,additional_response_attributes\nAdditionalResponseFields,additional_response_fields\nAdditionalResultAttribute,additional_result_attribute\nAdditionalResultAttributeValue,additional_result_attribute_value\nAdditionalRoutesAvailable,additional_routes_available\nAdditionalRunOptions,additional_run_options\nAdditionalSchemaElements,additional_schema_elements\nAdditionalSearchKey,additional_search_key\nAdditionalSearchKeys,additional_search_keys\nAdditionalSlaveSecurityGroups,additional_slave_security_groups\nAdditionalStagingLabelsToDownload,additional_staging_labels_to_download\nAdditionalStatistics,additional_statistics\nAdditionalTreatments,additional_treatments\nAdditionalVersionWeights,additional_version_weights\nAddon,addon\nAddonDetails,addon_details\nAddonHealth,addon_health\nAddonInfo,addon_info\nAddonIssue,addon_issue\nAddonStatus,addon_status\nAddonVersion,addon_version\nAddonVersionInfo,addon_version_info\nAddress,address\nAddress1,address1\nAddress2,address2\nAddress3,address3\nAddress4,address4\nAddressAllocationIds,address_allocation_ids\nAddressAttribute,address_attribute\nAddressBook,address_book\nAddressBookArn,address_book_arn\nAddressBookData,address_book_data\nAddressBooks,address_books\nAddressConfiguration,address_configuration\nAddressCount,address_count\nAddressDefinition,address_definition\nAddressExternalId,address_external_id\nAddressFamily,address_family\nAddressField,address_field\nAddressFields,address_fields\nAddressId,address_id\nAddressLine1,address_line1\nAddressLine2,address_line2\nAddressLine3,address_line3\nAddressNumber,address_number\nAddressTransfer,address_transfer\nAddressTransferStatus,address_transfer_status\nAddressTransfers,address_transfers\nAddressType,address_type\nAddresses,addresses\nAddressingType,addressing_type\nAdiFilename,adi_filename\nAdjacentParentShardId,adjacent_parent_shard_id\nAdjacentShardToMerge,adjacent_shard_to_merge\nAdjustable,adjustable\nAdjustment,adjustment\nAdjustmentType,adjustment_type\nAdjustmentTypes,adjustment_types\nAdjustments,adjustments\nAdmin,admin\nAdminAccount,admin_account\nAdminAccountId,admin_account_id\nAdminAccountSummary,admin_account_summary\nAdminAccounts,admin_accounts\nAdminAddUserToGroupRequest,admin_add_user_to_group_request\nAdminConfirmSignUpRequest,admin_confirm_sign_up_request\nAdminContact,admin_contact\nAdminCreateUserConfig,admin_create_user_config\nAdminCreateUserConfigType,admin_create_user_config_type\nAdminCreateUserRequest,admin_create_user_request\nAdminCreateUserResponse,admin_create_user_response\nAdminDeleteUserAttributesRequest,admin_delete_user_attributes_request\nAdminDeleteUserRequest,admin_delete_user_request\nAdminDetectorId,admin_detector_id\nAdminDisableProviderForUserRequest,admin_disable_provider_for_user_request\nAdminDisableUserRequest,admin_disable_user_request\nAdminEnableUserRequest,admin_enable_user_request\nAdminForgetDeviceRequest,admin_forget_device_request\nAdminGetDeviceRequest,admin_get_device_request\nAdminGetDeviceResponse,admin_get_device_response\nAdminGetUserRequest,admin_get_user_request\nAdminGetUserResponse,admin_get_user_response\nAdminGroup,admin_group\nAdminInitiateAuthRequest,admin_initiate_auth_request\nAdminInitiateAuthResponse,admin_initiate_auth_response\nAdminLinkProviderForUserRequest,admin_link_provider_for_user_request\nAdminListDevicesRequest,admin_list_devices_request\nAdminListDevicesResponse,admin_list_devices_response\nAdminListGroupsForUserRequest,admin_list_groups_for_user_request\nAdminListGroupsForUserResponse,admin_list_groups_for_user_response\nAdminListUserAuthEventsRequest,admin_list_user_auth_events_request\nAdminListUserAuthEventsResponse,admin_list_user_auth_events_response\nAdminPassword,admin_password\nAdminPrivacy,admin_privacy\nAdminRemoveUserFromGroupRequest,admin_remove_user_from_group_request\nAdminResetUserPasswordRequest,admin_reset_user_password_request\nAdminRespondToAuthChallengeRequest,admin_respond_to_auth_challenge_request\nAdminRespondToAuthChallengeResponse,admin_respond_to_auth_challenge_response\nAdminScope,admin_scope\nAdminSetUserMFAPreferenceRequest,admin_set_user_mfa_preference_request\nAdminSetUserPasswordRequest,admin_set_user_password_request\nAdminSetUserSettingsRequest,admin_set_user_settings_request\nAdminStatus,admin_status\nAdminUpdateAuthEventFeedbackRequest,admin_update_auth_event_feedback_request\nAdminUpdateDeviceStatusRequest,admin_update_device_status_request\nAdminUpdateUserAttributesRequest,admin_update_user_attributes_request\nAdminUserGlobalSignOutRequest,admin_user_global_sign_out_request\nAdminUserList,admin_user_list\nAdminUsername,admin_username\nAdministrationRoleARN,administration_role_arn\nAdministrativeAction,administrative_action\nAdministrativeActionFailureDetails,administrative_action_failure_details\nAdministrativeActionType,administrative_action_type\nAdministrativeActions,administrative_actions\nAdministrator,administrator\nAdministratorId,administrator_id\nAdministrators,administrators\nAdsOnDeliveryRestrictions,ads_on_delivery_restrictions\nAdvancedBackupSetting,advanced_backup_setting\nAdvancedBackupSettings,advanced_backup_settings\nAdvancedCostOptimizationMetrics,advanced_cost_optimization_metrics\nAdvancedDataProtectionMetrics,advanced_data_protection_metrics\nAdvancedEventSelector,advanced_event_selector\nAdvancedEventSelectors,advanced_event_selectors\nAdvancedFieldSelector,advanced_field_selector\nAdvancedInputFilter,advanced_input_filter\nAdvancedInputFilterSettings,advanced_input_filter_settings\nAdvancedOptions,advanced_options\nAdvancedOptionsStatus,advanced_options_status\nAdvancedRecognitionSetting,advanced_recognition_setting\nAdvancedSecurityEnabled,advanced_security_enabled\nAdvancedSecurityMode,advanced_security_mode\nAdvancedSecurityOptions,advanced_security_options\nAdvancedSecurityOptionsInput,advanced_security_options_input\nAdvancedSecurityOptionsStatus,advanced_security_options_status\nAdvertiseByoipCidrRequest,advertise_byoip_cidr_request\nAdvertiseByoipCidrResponse,advertise_byoip_cidr_response\nAdvertiseByoipCidrResult,advertise_byoip_cidr_result\nAdvisoryIds,advisory_ids\nAfdSignaling,afd_signaling\nAffectedEntity,affected_entity\nAffectedResource,affected_resource\nAffectedResources,affected_resources\nAffectedSensorCount,affected_sensor_count\nAffectedSubnets,affected_subnets\nAffiliated,affiliated\nAffinity,affinity\nAfter,after\nAfterConnectScript,after_connect_script\nAfterContactWorkTimeLimit,after_contact_work_time_limit\nAfterCreationDate,after_creation_date\nAfterFragmentNumber,after_fragment_number\nAgeRange,age_range\nAgentAlreadyRunningAssessment,agent_already_running_assessment\nAgentArn,agent_arn\nAgentArns,agent_arns\nAgentAvailabilityTimer,agent_availability_timer\nAgentConfig,agent_config\nAgentConfiguration,agent_configuration\nAgentConfigurationStatus,agent_configuration_status\nAgentContactReference,agent_contact_reference\nAgentContactState,agent_contact_state\nAgentCount,agent_count\nAgentDetails,agent_details\nAgentFilter,agent_filter\nAgentInfo,agent_info\nAgentInstallerUrl,agent_installer_url\nAgentListEntry,agent_list_entry\nAgentMetrics,agent_metrics\nAgentName,agent_name\nAgentNetworkInfo,agent_network_info\nAgentOrchestrationConfig,agent_orchestration_config\nAgentPreview,agent_preview\nAgentStatus,agent_status\nAgentStatusARN,agent_status_arn\nAgentStatusId,agent_status_id\nAgentStatusReference,agent_status_reference\nAgentStatusSummary,agent_status_summary\nAgentStatusSummaryList,agent_status_summary_list\nAgentStatusTypes,agent_status_types\nAgentTurnResult,agent_turn_result\nAgentTurnSpecification,agent_turn_specification\nAgentVersion,agent_version\nAgentVersions,agent_versions\nAgentlessDialerConfig,agentless_dialer_config\nAgents,agents\nAgentsAlreadyRunningAssessmentException,agents_already_running_assessment_exception\nAggFunc,agg_func\nAggregate,aggregate\nAggregateBy,aggregate_by\nAggregateColumn,aggregate_column\nAggregateComplianceByConfigRule,aggregate_compliance_by_config_rule\nAggregateComplianceByConfigRules,aggregate_compliance_by_config_rules\nAggregateComplianceByConformancePack,aggregate_compliance_by_conformance_pack\nAggregateComplianceByConformancePacks,aggregate_compliance_by_conformance_packs\nAggregateComplianceCount,aggregate_compliance_count\nAggregateComplianceCounts,aggregate_compliance_counts\nAggregateConformancePackCompliance,aggregate_conformance_pack_compliance\nAggregateConformancePackComplianceCount,aggregate_conformance_pack_compliance_count\nAggregateConformancePackComplianceFilters,aggregate_conformance_pack_compliance_filters\nAggregateConformancePackComplianceSummaries,aggregate_conformance_pack_compliance_summaries\nAggregateConformancePackComplianceSummary,aggregate_conformance_pack_compliance_summary\nAggregateConformancePackComplianceSummaryFilters,aggregate_conformance_pack_compliance_summary_filters\nAggregateEvaluationResult,aggregate_evaluation_result\nAggregateEvaluationResults,aggregate_evaluation_results\nAggregateKeyType,aggregate_key_type\nAggregateOperation,aggregate_operation\nAggregateResourceIdentifier,aggregate_resource_identifier\nAggregateStatus,aggregate_status\nAggregateValue,aggregate_value\nAggregatedLogOddsMetric,aggregated_log_odds_metric\nAggregatedProfileTime,aggregated_profile_time\nAggregatedSourceStatus,aggregated_source_status\nAggregatedSourceStatusList,aggregated_source_status_list\nAggregatedUtterancesFilter,aggregated_utterances_filter\nAggregatedUtterancesSortBy,aggregated_utterances_sort_by\nAggregatedUtterancesSummary,aggregated_utterances_summary\nAggregatedValue,aggregated_value\nAggregatedVariablesImpactExplanation,aggregated_variables_impact_explanation\nAggregatedVariablesImportanceMetrics,aggregated_variables_importance_metrics\nAggregates,aggregates\nAggregation,aggregation\nAggregationAuthorization,aggregation_authorization\nAggregationAuthorizationArn,aggregation_authorization_arn\nAggregationAuthorizations,aggregation_authorizations\nAggregationConfig,aggregation_config\nAggregationConstraint,aggregation_constraint\nAggregationEnabled,aggregation_enabled\nAggregationFunction,aggregation_function\nAggregationFunctionParameters,aggregation_function_parameters\nAggregationSortConfiguration,aggregation_sort_configuration\nAggregationSortConfigurations,aggregation_sort_configurations\nAggregationStatistic,aggregation_statistic\nAggregationType,aggregation_type\nAggregationVisibility,aggregation_visibility\nAggregations,aggregations\nAggregator,aggregator\nAggregatorType,aggregator_type\nAggregators,aggregators\nAggressiveMode,aggressive_mode\nAggs,aggs\nAgreement,agreement\nAgreementId,agreement_id\nAgreements,agreements\nAiffSettings,aiff_settings\nAirflowConfigurationOptions,airflow_configuration_options\nAirflowVersion,airflow_version\nAlarm,alarm\nAlarmARN,alarm_arn\nAlarmAction,alarm_action\nAlarmActions,alarm_actions\nAlarmArn,alarm_arn\nAlarmCapabilities,alarm_capabilities\nAlarmConfiguration,alarm_configuration\nAlarmConfigurationUpdatedTimestamp,alarm_configuration_updated_timestamp\nAlarmDescription,alarm_description\nAlarmEventActions,alarm_event_actions\nAlarmHistoryItem,alarm_history_item\nAlarmHistoryItems,alarm_history_items\nAlarmIdentifier,alarm_identifier\nAlarmModelSummary,alarm_model_summary\nAlarmModelVersionSummary,alarm_model_version_summary\nAlarmName,alarm_name\nAlarmNamePrefix,alarm_name_prefix\nAlarmNames,alarm_names\nAlarmNotification,alarm_notification\nAlarmRecommendation,alarm_recommendation\nAlarmRoleArn,alarm_role_arn\nAlarmRule,alarm_rule\nAlarmSpecification,alarm_specification\nAlarmState,alarm_state\nAlarmStateInformation,alarm_state_information\nAlarmSummary,alarm_summary\nAlarmType,alarm_type\nAlarmTypes,alarm_types\nAlarms,alarms\nAlarmsLimitExceededException,alarms_limit_exceeded_exception\nAlbumArt,album_art\nAlbumArtFormat,album_art_format\nAlert,alert\nAlertArn,alert_arn\nAlertCode,alert_code\nAlertDescription,alert_description\nAlertFilters,alert_filters\nAlertManagerDefinitionDescription,alert_manager_definition_description\nAlertManagerDefinitionStatus,alert_manager_definition_status\nAlertMessage,alert_message\nAlertName,alert_name\nAlertSensitivityThreshold,alert_sensitivity_threshold\nAlertStatus,alert_status\nAlertSummary,alert_summary\nAlertSummaryList,alert_summary_list\nAlertTarget,alert_target\nAlertType,alert_type\nAlexaForBusinessMetadata,alexa_for_business_metadata\nAlexaForBusinessRoomArn,alexa_for_business_room_arn\nAlexaSkillIds,alexa_skill_ids\nAlexaSkillStatus,alexa_skill_status\nAlfrescoConfiguration,alfresco_configuration\nAlgorithm,algorithm\nAlgorithmArn,algorithm_arn\nAlgorithmControl,algorithm_control\nAlgorithmDescription,algorithm_description\nAlgorithmImage,algorithm_image\nAlgorithmName,algorithm_name\nAlgorithmSpecification,algorithm_specification\nAlgorithmStatus,algorithm_status\nAlgorithmStatusDetails,algorithm_status_details\nAlgorithmStatusItem,algorithm_status_item\nAlgorithmSummary,algorithm_summary\nAlgorithmSummaryList,algorithm_summary_list\nAlgorithmValidationProfile,algorithm_validation_profile\nAlgorithmValidationSpecification,algorithm_validation_specification\nAlgorithmicStemming,algorithmic_stemming\nAlgorithmsConfig,algorithms_config\nAlias,alias\nAliasArn,alias_arn\nAliasAttributes,alias_attributes\nAliasConfiguration,alias_configuration\nAliasExistsException,alias_exists_exception\nAliasICPRecordal,alias_icp_recordal\nAliasICPRecordals,alias_icp_recordals\nAliasId,alias_id\nAliasIds,alias_ids\nAliasListEntry,alias_list_entry\nAliasName,alias_name\nAliasPrefix,alias_prefix\nAliasRoutingConfiguration,alias_routing_configuration\nAliasTarget,alias_target\nAliased,aliased\nAliases,aliases\nAliasesToAdd,aliases_to_add\nAliasesToDelete,aliases_to_delete\nAlignedEndTime,aligned_end_time\nAlignedStartTime,aligned_start_time\nAlignment,alignment\nAll,all\nAllAccountsEnabled,all_accounts_enabled\nAllAvailabilityZones,all_availability_zones\nAllAwsRegions,all_aws_regions\nAllColumnsRequested,all_columns_requested\nAllDataPointsVisibility,all_data_points_visibility\nAllOrganizationalUnitsEnabled,all_organizational_units_enabled\nAllParameters,all_parameters\nAllPolicyTypesEnabled,all_policy_types_enabled\nAllQueryArguments,all_query_arguments\nAllRegions,all_regions\nAllRegionsEnabled,all_regions_enabled\nAllRowsWildcard,all_rows_wildcard\nAllSheets,all_sheets\nAllocateAddressRequest,allocate_address_request\nAllocateAddressResult,allocate_address_result\nAllocateConnectionOnInterconnectRequest,allocate_connection_on_interconnect_request\nAllocateHostedConnectionRequest,allocate_hosted_connection_request\nAllocateHostsRequest,allocate_hosts_request\nAllocateHostsResult,allocate_hosts_result\nAllocateIpamPoolCidrRequest,allocate_ipam_pool_cidr_request\nAllocateIpamPoolCidrResult,allocate_ipam_pool_cidr_result\nAllocatePrivateVirtualInterfaceRequest,allocate_private_virtual_interface_request\nAllocatePublicVirtualInterfaceRequest,allocate_public_virtual_interface_request\nAllocateStaticIpRequest,allocate_static_ip_request\nAllocateStaticIpResult,allocate_static_ip_result\nAllocateTransitVirtualInterfaceRequest,allocate_transit_virtual_interface_request\nAllocateTransitVirtualInterfaceResult,allocate_transit_virtual_interface_result\nAllocatedCapacity,allocated_capacity\nAllocatedDpus,allocated_dpus\nAllocatedProvisionedConcurrentExecutions,allocated_provisioned_concurrent_executions\nAllocatedStorage,allocated_storage\nAllocatedUsageQuantity,allocated_usage_quantity\nAllocationDefaultNetmaskLength,allocation_default_netmask_length\nAllocationId,allocation_id\nAllocationIdNotFoundException,allocation_id_not_found_exception\nAllocationIds,allocation_ids\nAllocationMaxNetmaskLength,allocation_max_netmask_length\nAllocationMinNetmaskLength,allocation_min_netmask_length\nAllocationResourceTags,allocation_resource_tags\nAllocationStrategy,allocation_strategy\nAllocationTime,allocation_time\nAllocationType,allocation_type\nAllow,allow\nAllowAction,allow_action\nAllowActions,allow_actions\nAllowAdminCreateUserOnly,allow_admin_create_user_only\nAllowAllTrafficToEndpoint,allow_all_traffic_to_endpoint\nAllowAssociation,allow_association\nAllowCancelResize,allow_cancel_resize\nAllowCheckIn,allow_check_in\nAllowClassicFlow,allow_classic_flow\nAllowCookies,allow_cookies\nAllowCopyImage,allow_copy_image\nAllowCredentials,allow_credentials\nAllowCustomRoutingTrafficRequest,allow_custom_routing_traffic_request\nAllowDataLoss,allow_data_loss\nAllowDeferredExecution,allow_deferred_execution\nAllowDenyList,allow_deny_list\nAllowDnsResolutionFromRemoteVpc,allow_dns_resolution_from_remote_vpc\nAllowEarlyCheckIn,allow_early_check_in\nAllowEgressFromLocalClassicLinkToRemoteVpc,allow_egress_from_local_classic_link_to_remote_vpc\nAllowEgressFromLocalVpcToRemoteClassicLink,allow_egress_from_local_vpc_to_remote_classic_link\nAllowEngineModeChange,allow_engine_mode_change\nAllowExternalDataFiltering,allow_external_data_filtering\nAllowForceDelete,allow_force_delete\nAllowFullTableExternalDataAccess,allow_full_table_external_data_access\nAllowHeaders,allow_headers\nAllowListCriteria,allow_list_criteria\nAllowListStatus,allow_list_status\nAllowListSummary,allow_list_summary\nAllowMajorVersionUpdate,allow_major_version_update\nAllowMajorVersionUpgrade,allow_major_version_upgrade\nAllowMessages,allow_messages\nAllowMethods,allow_methods\nAllowNonRestoredState,allow_non_restored_state\nAllowNotifications,allow_notifications\nAllowOrigins,allow_origins\nAllowProfileCreation,allow_profile_creation\nAllowPubliclyAccessibleConsumers,allow_publicly_accessible_consumers\nAllowQuotedRecordDelimiter,allow_quoted_record_delimiter\nAllowReassignment,allow_reassignment\nAllowReassociation,allow_reassociation\nAllowReferers,allow_referers\nAllowResources,allow_resources\nAllowSelectNestedTables,allow_select_nested_tables\nAllowSelfManagement,allow_self_management\nAllowSingleColumn,allow_single_column\nAllowSsh,allow_ssh\nAllowSudo,allow_sudo\nAllowUnassociatedTargets,allow_unassociated_targets\nAllowUnauthenticatedIdentities,allow_unauthenticated_identities\nAllowUpdate,allow_update\nAllowUsersToChangePassword,allow_users_to_change_password\nAllowVersionUpgrade,allow_version_upgrade\nAllowed,allowed\nAllowedAccessControlTags,allowed_access_control_tags\nAllowedAggregations,allowed_aggregations\nAllowedAllVPCs,allowed_all_vpcs\nAllowedAttempts,allowed_attempts\nAllowedByOrganizations,allowed_by_organizations\nAllowedByPermissionsBoundary,allowed_by_permissions_boundary\nAllowedDomains,allowed_domains\nAllowedFeatures,allowed_features\nAllowedGroupsColumnName,allowed_groups_column_name\nAllowedHeaders,allowed_headers\nAllowedIPRange,allowed_ip_range\nAllowedInputTypes,allowed_input_types\nAllowedInstanceTypes,allowed_instance_types\nAllowedIps,allowed_ips\nAllowedLocations,allowed_locations\nAllowedMethods,allowed_methods\nAllowedMonitorCapabilities,allowed_monitor_capabilities\nAllowedNodeTypeModificationsMessage,allowed_node_type_modifications_message\nAllowedOAuthFlows,allowed_o_auth_flows\nAllowedOAuthFlowsUserPoolClient,allowed_o_auth_flows_user_pool_client\nAllowedOAuthScopes,allowed_o_auth_scopes\nAllowedOperations,allowed_operations\nAllowedOrigins,allowed_origins\nAllowedPattern,allowed_pattern\nAllowedPrincipal,allowed_principal\nAllowedPrincipals,allowed_principals\nAllowedPublishers,allowed_publishers\nAllowedRenditionSize,allowed_rendition_size\nAllowedRenditions,allowed_renditions\nAllowedStatistics,allowed_statistics\nAllowedTargets,allowed_targets\nAllowedVPCs,allowed_vpcs\nAllowedValue,allowed_value\nAllowedValues,allowed_values\nAllowsMultipleInstanceTypes,allows_multiple_instance_types\nAllowsPublicReadAccess,allows_public_read_access\nAllowsPublicWriteAccess,allows_public_write_access\nAllowsVpcAndNonVpcInstanceMemberships,allows_vpc_and_non_vpc_instance_memberships\nAlphaBehavior,alpha_behavior\nAlphabet,alphabet\nAlpnPolicy,alpn_policy\nAlreadyExistsException,already_exists_exception\nAlreadyExistsFault,already_exists_fault\nAlreadyInOrganizationException,already_in_organization_exception\nAlreadyStreamedException,already_streamed_exception\nAlternateBandColorsVisibility,alternate_band_colors_visibility\nAlternateBandEvenColor,alternate_band_even_color\nAlternateBandOddColor,alternate_band_odd_color\nAlternateContact,alternate_contact\nAlternateContactType,alternate_contact_type\nAlternateDataSourceParameters,alternate_data_source_parameters\nAlternateIdentifier,alternate_identifier\nAlternateKey,alternate_key\nAlternatePathHint,alternate_path_hint\nAlternatePathHints,alternate_path_hints\nAlternateSoftwareMetadata,alternate_software_metadata\nAlternateSoftwares,alternate_softwares\nAlternateTransferFunctionSei,alternate_transfer_function_sei\nAlternative,alternative\nAlternativeTransferFunction,alternative_transfer_function\nAlternatives,alternatives\nAmazonCodeGuruProfiler,amazon_code_guru_profiler\nAmazonCodeGuruProfilerIntegration,amazon_code_guru_profiler_integration\nAmazonElasticsearchParameters,amazon_elasticsearch_parameters\nAmazonForecastRoleArn,amazon_forecast_role_arn\nAmazonId,amazon_id\nAmazonIdEventTopic,amazon_id_event_topic\nAmazonManagedKafkaEventSourceConfig,amazon_managed_kafka_event_source_config\nAmazonOpenSearchParameters,amazon_open_search_parameters\nAmazonOpenSearchServerlessBufferingHints,amazon_open_search_serverless_buffering_hints\nAmazonOpenSearchServerlessDestinationConfiguration,amazon_open_search_serverless_destination_configuration\nAmazonOpenSearchServerlessDestinationDescription,amazon_open_search_serverless_destination_description\nAmazonOpenSearchServerlessDestinationUpdate,amazon_open_search_serverless_destination_update\nAmazonOpenSearchServerlessRetryOptions,amazon_open_search_serverless_retry_options\nAmazonProvidedIpv6CidrBlock,amazon_provided_ipv6_cidr_block\nAmazonRedshiftAdvancedOption,amazon_redshift_advanced_option\nAmazonRedshiftNodeData,amazon_redshift_node_data\nAmazonRedshiftSource,amazon_redshift_source\nAmazonRedshiftTarget,amazon_redshift_target\nAmazonSideAsn,amazon_side_asn\nAmazonTranscribeCallAnalyticsProcessorConfiguration,amazon_transcribe_call_analytics_processor_configuration\nAmazonTranscribeProcessorConfiguration,amazon_transcribe_processor_configuration\nAmazonopensearchserviceBufferingHints,amazonopensearchservice_buffering_hints\nAmazonopensearchserviceDestinationConfiguration,amazonopensearchservice_destination_configuration\nAmazonopensearchserviceDestinationDescription,amazonopensearchservice_destination_description\nAmazonopensearchserviceDestinationUpdate,amazonopensearchservice_destination_update\nAmazonopensearchserviceRetryOptions,amazonopensearchservice_retry_options\nAmbiguousRoleResolution,ambiguous_role_resolution\nAmdSevSnp,amd_sev_snp\nAmexCardSecurityCodeVersion1,amex_card_security_code_version1\nAmexCardSecurityCodeVersion2,amex_card_security_code_version2\nAmi,ami\nAmiAggregation,ami_aggregation\nAmiAggregationResponse,ami_aggregation_response\nAmiAssociationScope,ami_association_scope\nAmiDistributionConfiguration,ami_distribution_configuration\nAmiId,ami_id\nAmiLaunchIndex,ami_launch_index\nAmiVersion,ami_version\nAmortizedCommitment,amortized_commitment\nAmortizedRecurringCommitment,amortized_recurring_commitment\nAmortizedRecurringFee,amortized_recurring_fee\nAmortizedUpfrontCommitment,amortized_upfront_commitment\nAmortizedUpfrontFee,amortized_upfront_fee\nAmount,amount\nAmountInUsd,amount_in_usd\nAmplifyFeatureFlags,amplify_feature_flags\nAmplifyMetaConfig,amplify_meta_config\nAmplitude,amplitude\nAmplitudeConnectorProfileCredentials,amplitude_connector_profile_credentials\nAmplitudeSourceProperties,amplitude_source_properties\nAmznClientToken,amzn_client_token\nAnalyses,analyses\nAnalysis,analysis\nAnalysisAclRule,analysis_acl_rule\nAnalysisArn,analysis_arn\nAnalysisComponent,analysis_component\nAnalysisDefaults,analysis_defaults\nAnalysisDefinition,analysis_definition\nAnalysisEndTime,analysis_end_time\nAnalysisError,analysis_error\nAnalysisFindings,analysis_findings\nAnalysisId,analysis_id\nAnalysisLoadBalancerListener,analysis_load_balancer_listener\nAnalysisLoadBalancerTarget,analysis_load_balancer_target\nAnalysisOptions,analysis_options\nAnalysisPacketHeader,analysis_packet_header\nAnalysisParameter,analysis_parameter\nAnalysisReport,analysis_report\nAnalysisReportId,analysis_report_id\nAnalysisReportSummary,analysis_report_summary\nAnalysisReports,analysis_reports\nAnalysisResult,analysis_result\nAnalysisResultLocation,analysis_result_location\nAnalysisRouteTableRoute,analysis_route_table_route\nAnalysisRule,analysis_rule\nAnalysisRuleAggregation,analysis_rule_aggregation\nAnalysisRuleCustom,analysis_rule_custom\nAnalysisRuleList,analysis_rule_list\nAnalysisSchema,analysis_schema\nAnalysisScheme,analysis_scheme\nAnalysisSchemeLanguage,analysis_scheme_language\nAnalysisSchemeName,analysis_scheme_name\nAnalysisSchemeNames,analysis_scheme_names\nAnalysisSchemeStatus,analysis_scheme_status\nAnalysisSchemes,analysis_schemes\nAnalysisSearchFilter,analysis_search_filter\nAnalysisSecurityGroupRule,analysis_security_group_rule\nAnalysisSourceEntity,analysis_source_entity\nAnalysisSourceTemplate,analysis_source_template\nAnalysisStartTime,analysis_start_time\nAnalysisStartTimeBegin,analysis_start_time_begin\nAnalysisStartTimeEnd,analysis_start_time_end\nAnalysisStatus,analysis_status\nAnalysisSummary,analysis_summary\nAnalysisSummaryList,analysis_summary_list\nAnalysisTemplate,analysis_template\nAnalysisTemplateSummary,analysis_template_summary\nAnalysisTypes,analysis_types\nAnalytics,analytics\nAnalyticsAndOperator,analytics_and_operator\nAnalyticsBinBySpecification,analytics_bin_by_specification\nAnalyticsBinKey,analytics_bin_key\nAnalyticsConfiguration,analytics_configuration\nAnalyticsConfigurationList,analytics_configuration_list\nAnalyticsConfigurationType,analytics_configuration_type\nAnalyticsEndpointId,analytics_endpoint_id\nAnalyticsExportDestination,analytics_export_destination\nAnalyticsIntentFilter,analytics_intent_filter\nAnalyticsIntentGroupByKey,analytics_intent_group_by_key\nAnalyticsIntentGroupBySpecification,analytics_intent_group_by_specification\nAnalyticsIntentMetric,analytics_intent_metric\nAnalyticsIntentMetricResult,analytics_intent_metric_result\nAnalyticsIntentNodeSummary,analytics_intent_node_summary\nAnalyticsIntentResult,analytics_intent_result\nAnalyticsIntentStageFilter,analytics_intent_stage_filter\nAnalyticsIntentStageGroupByKey,analytics_intent_stage_group_by_key\nAnalyticsIntentStageGroupBySpecification,analytics_intent_stage_group_by_specification\nAnalyticsIntentStageMetric,analytics_intent_stage_metric\nAnalyticsIntentStageMetricResult,analytics_intent_stage_metric_result\nAnalyticsIntentStageResult,analytics_intent_stage_result\nAnalyticsMetadata,analytics_metadata\nAnalyticsMetadataType,analytics_metadata_type\nAnalyticsPathFilter,analytics_path_filter\nAnalyticsS3BucketDestination,analytics_s3_bucket_destination\nAnalyticsSessionFilter,analytics_session_filter\nAnalyticsSessionGroupByKey,analytics_session_group_by_key\nAnalyticsSessionGroupBySpecification,analytics_session_group_by_specification\nAnalyticsSessionMetric,analytics_session_metric\nAnalyticsSessionMetricResult,analytics_session_metric_result\nAnalyticsSessionResult,analytics_session_result\nAnalyticsUtteranceAttribute,analytics_utterance_attribute\nAnalyticsUtteranceAttributeResult,analytics_utterance_attribute_result\nAnalyticsUtteranceFilter,analytics_utterance_filter\nAnalyticsUtteranceGroupByKey,analytics_utterance_group_by_key\nAnalyticsUtteranceGroupBySpecification,analytics_utterance_group_by_specification\nAnalyticsUtteranceMetric,analytics_utterance_metric\nAnalyticsUtteranceMetricResult,analytics_utterance_metric_result\nAnalyticsUtteranceResult,analytics_utterance_result\nAnalyzeDocumentModelVersion,analyze_document_model_version\nAnalyzeDocumentRequest,analyze_document_request\nAnalyzeDocumentResponse,analyze_document_response\nAnalyzeExpenseModelVersion,analyze_expense_model_version\nAnalyzeExpenseRequest,analyze_expense_request\nAnalyzeExpenseResponse,analyze_expense_response\nAnalyzeIDDetections,analyze_id_detections\nAnalyzeIDModelVersion,analyze_id_model_version\nAnalyzeIDRequest,analyze_id_request\nAnalyzeIDResponse,analyze_id_response\nAnalyzeLendingModelVersion,analyze_lending_model_version\nAnalyzedEniCount,analyzed_eni_count\nAnalyzedResource,analyzed_resource\nAnalyzedResourceCount,analyzed_resource_count\nAnalyzedResourceSummary,analyzed_resource_summary\nAnalyzedTime,analyzed_time\nAnalyzerSummary,analyzer_summary\nAncestorIds,ancestor_ids\nAnchor,anchor\nAnchorDateConfiguration,anchor_date_configuration\nAnchorOption,anchor_option\nAncillarySourceSettings,ancillary_source_settings\nAnd,and\nAndAllFilters,and_all_filters\nAndConditions,and_conditions\nAndStatement,and_statement\nAndroid,android\nAndroidPushNotificationTemplate,android_push_notification_template\nAnnotation,annotation\nAnnotationConsolidationConfig,annotation_consolidation_config\nAnnotationConsolidationLambdaArn,annotation_consolidation_lambda_arn\nAnnotationDataS3Uri,annotation_data_s3_uri\nAnnotationImportItemDetail,annotation_import_item_detail\nAnnotationImportItemSource,annotation_import_item_source\nAnnotationImportJobItem,annotation_import_job_item\nAnnotationStoreItem,annotation_store_item\nAnnotationStoreVersionItem,annotation_store_version_item\nAnnotationValue,annotation_value\nAnnotations,annotations\nAnnouncementArn,announcement_arn\nAnnouncementDirection,announcement_direction\nAnomalies,anomalies\nAnomalousLogGroup,anomalous_log_group\nAnomalousLogGroups,anomalous_log_groups\nAnomalousService,anomalous_service\nAnomaly,anomaly\nAnomalyClass,anomaly_class\nAnomalyDateInterval,anomaly_date_interval\nAnomalyDetector,anomaly_detector\nAnomalyDetectorArn,anomaly_detector_arn\nAnomalyDetectorConfig,anomaly_detector_config\nAnomalyDetectorConfigSummary,anomaly_detector_config_summary\nAnomalyDetectorConfiguration,anomaly_detector_configuration\nAnomalyDetectorDataQualityMetric,anomaly_detector_data_quality_metric\nAnomalyDetectorDataQualityMetricList,anomaly_detector_data_quality_metric_list\nAnomalyDetectorDescription,anomaly_detector_description\nAnomalyDetectorFrequency,anomaly_detector_frequency\nAnomalyDetectorName,anomaly_detector_name\nAnomalyDetectorSummary,anomaly_detector_summary\nAnomalyDetectorSummaryList,anomaly_detector_summary_list\nAnomalyDetectorTypes,anomaly_detector_types\nAnomalyDetectors,anomaly_detectors\nAnomalyEndDate,anomaly_end_date\nAnomalyGroup,anomaly_group\nAnomalyGroupId,anomaly_group_id\nAnomalyGroupScore,anomaly_group_score\nAnomalyGroupStatistics,anomaly_group_statistics\nAnomalyGroupSummary,anomaly_group_summary\nAnomalyGroupSummaryList,anomaly_group_summary_list\nAnomalyGroupTimeSeries,anomaly_group_time_series\nAnomalyGroupTimeSeriesFeedback,anomaly_group_time_series_feedback\nAnomalyId,anomaly_id\nAnomalyInstance,anomaly_instance\nAnomalyMask,anomaly_mask\nAnomalyMonitor,anomaly_monitor\nAnomalyMonitors,anomaly_monitors\nAnomalyReportedTimeRange,anomaly_reported_time_range\nAnomalyResource,anomaly_resource\nAnomalyResources,anomaly_resources\nAnomalyScore,anomaly_score\nAnomalySourceDetails,anomaly_source_details\nAnomalySourceMetadata,anomaly_source_metadata\nAnomalyStartDate,anomaly_start_date\nAnomalySubscription,anomaly_subscription\nAnomalySubscriptions,anomaly_subscriptions\nAnomalyTimeRange,anomaly_time_range\nAnonymousAuthDisableDate,anonymous_auth_disable_date\nAnonymousAuthEnabled,anonymous_auth_enabled\nAnonymousUserArn,anonymous_user_arn\nAnonymousUserDashboardEmbeddingConfiguration,anonymous_user_dashboard_embedding_configuration\nAnonymousUserDashboardVisualEmbeddingConfiguration,anonymous_user_dashboard_visual_embedding_configuration\nAnonymousUserEmbeddingExperienceConfiguration,anonymous_user_embedding_experience_configuration\nAnonymousUserQSearchBarEmbeddingConfiguration,anonymous_user_q_search_bar_embedding_configuration\nAnonymousUserSnapshotJobResult,anonymous_user_snapshot_job_result\nAnonymousUsers,anonymous_users\nAnswer,answer\nAnswerKey,answer_key\nAnswerMachineDetectionConfig,answer_machine_detection_config\nAnswerSummaries,answer_summaries\nAnswerSummary,answer_summary\nAnswers,answers\nAntennaDemodDecodeDetails,antenna_demod_decode_details\nAntennaDownlinkConfig,antenna_downlink_config\nAntennaDownlinkDemodDecodeConfig,antenna_downlink_demod_decode_config\nAntennaUplinkConfig,antenna_uplink_config\nAntiAlias,anti_alias\nAntipatternReportResult,antipattern_report_result\nAntipatternSeveritySummary,antipattern_severity_summary\nAny,any\nAnywhereConfiguration,anywhere_configuration\nApId,ap_id\nApacheKafkaCluster,apache_kafka_cluster\nApacheKafkaClusterDescription,apache_kafka_cluster_description\nApi,api\nApiAssociation,api_association\nApiCache,api_cache\nApiCallDetails,api_call_details\nApiDescription,api_description\nApiDestination,api_destination\nApiDestinationArn,api_destination_arn\nApiDestinationState,api_destination_state\nApiDestinations,api_destinations\nApiEndpoint,api_endpoint\nApiGatewayApiAsset,api_gateway_api_asset\nApiGatewayDomainName,api_gateway_domain_name\nApiGatewayId,api_gateway_id\nApiGatewayManaged,api_gateway_managed\nApiGatewayProxy,api_gateway_proxy\nApiGatewayProxyConfig,api_gateway_proxy_config\nApiGatewayProxyInput,api_gateway_proxy_input\nApiGatewayProxySummary,api_gateway_proxy_summary\nApiId,api_id\nApiKey,api_key\nApiKeyAuthParameters,api_key_auth_parameters\nApiKeyCredential,api_key_credential\nApiKeyCredentials,api_key_credentials\nApiKeyFilter,api_key_filter\nApiKeyIds,api_key_ids\nApiKeyLimitExceededException,api_key_limit_exceeded_exception\nApiKeyName,api_key_name\nApiKeyRequired,api_key_required\nApiKeyRestrictions,api_key_restrictions\nApiKeySelectionExpression,api_key_selection_expression\nApiKeySource,api_key_source\nApiKeyValidityOutOfBoundsException,api_key_validity_out_of_bounds_exception\nApiKeyValue,api_key_value\nApiKeys,api_keys\nApiLimitExceededException,api_limit_exceeded_exception\nApiMapping,api_mapping\nApiMappingId,api_mapping_id\nApiMappingKey,api_mapping_key\nApiMappingSelectionExpression,api_mapping_selection_expression\nApiName,api_name\nApiPassthrough,api_passthrough\nApiSpecificationDownloadUrl,api_specification_download_url\nApiSpecificationDownloadUrlExpiresAt,api_specification_download_url_expires_at\nApiSpecificationMd5Hash,api_specification_md5_hash\nApiSpecificationUploadUrl,api_specification_upload_url\nApiSpecificationUploadUrlExpiresAt,api_specification_upload_url_expires_at\nApiStage,api_stage\nApp,app\nAppArn,app_arn\nAppAssessment,app_assessment\nAppAssessmentSummary,app_assessment_summary\nAppAuthorization,app_authorization\nAppAuthorizationSummary,app_authorization_summary\nAppBlock,app_block\nAppBlockArn,app_block_arn\nAppBlockBuilder,app_block_builder\nAppBlockBuilderAppBlockAssociation,app_block_builder_app_block_association\nAppBlockBuilderAppBlockAssociations,app_block_builder_app_block_associations\nAppBlockBuilderErrors,app_block_builder_errors\nAppBlockBuilderName,app_block_builder_name\nAppBlockBuilderStateChangeReason,app_block_builder_state_change_reason\nAppBlockBuilders,app_block_builders\nAppBlockErrors,app_block_errors\nAppBlocks,app_blocks\nAppBoundaryKey,app_boundary_key\nAppBundle,app_bundle\nAppBundleSummary,app_bundle_summary\nAppComponent,app_component\nAppComponentCompliance,app_component_compliance\nAppCookieStickinessPolicies,app_cookie_stickiness_policies\nAppCookieStickinessPolicy,app_cookie_stickiness_policy\nAppDetails,app_details\nAppEui,app_eui\nAppFlowConfig,app_flow_config\nAppId,app_id\nAppIdClientRegex,app_id_client_regex\nAppIds,app_ids\nAppImageConfigArn,app_image_config_arn\nAppImageConfigDetails,app_image_config_details\nAppImageConfigName,app_image_config_name\nAppImageConfigs,app_image_configs\nAppInputSource,app_input_source\nAppInstance,app_instance\nAppInstanceAdmin,app_instance_admin\nAppInstanceAdminArn,app_instance_admin_arn\nAppInstanceAdminSummary,app_instance_admin_summary\nAppInstanceAdmins,app_instance_admins\nAppInstanceArn,app_instance_arn\nAppInstanceBot,app_instance_bot\nAppInstanceBotArn,app_instance_bot_arn\nAppInstanceBotSummary,app_instance_bot_summary\nAppInstanceBots,app_instance_bots\nAppInstanceDataType,app_instance_data_type\nAppInstanceRetentionSettings,app_instance_retention_settings\nAppInstanceStreamingConfiguration,app_instance_streaming_configuration\nAppInstanceStreamingConfigurations,app_instance_streaming_configurations\nAppInstanceSummary,app_instance_summary\nAppInstanceUser,app_instance_user\nAppInstanceUserArn,app_instance_user_arn\nAppInstanceUserEndpoint,app_instance_user_endpoint\nAppInstanceUserEndpointSummary,app_instance_user_endpoint_summary\nAppInstanceUserEndpoints,app_instance_user_endpoints\nAppInstanceUserId,app_instance_user_id\nAppInstanceUserMembershipSummary,app_instance_user_membership_summary\nAppInstanceUserSummary,app_instance_user_summary\nAppInstanceUsers,app_instance_users\nAppInstances,app_instances\nAppIntegrationsConfiguration,app_integrations_configuration\nAppKey,app_key\nAppLogsEnabled,app_logs_enabled\nAppManaged,app_managed\nAppMonitor,app_monitor\nAppMonitorConfiguration,app_monitor_configuration\nAppMonitorDetails,app_monitor_details\nAppMonitorName,app_monitor_name\nAppMonitorSummaries,app_monitor_summaries\nAppMonitorSummary,app_monitor_summary\nAppName,app_name\nAppNetworkAccessType,app_network_access_type\nAppPackageName,app_package_name\nAppRegistryArn,app_registry_arn\nAppRegistryConfiguration,app_registry_configuration\nAppSKey,app_s_key\nAppSecurityGroupManagement,app_security_group_management\nAppServerPrivateKey,app_server_private_key\nAppSource,app_source\nAppSpecContent,app_spec_content\nAppSpecification,app_specification\nAppSummary,app_summary\nAppSyncRuntime,app_sync_runtime\nAppTitle,app_title\nAppType,app_type\nAppTypeEquals,app_type_equals\nAppUnitError,app_unit_error\nAppValidationConfiguration,app_validation_configuration\nAppValidationOutput,app_validation_output\nAppVersion,app_version\nAppVersionCode,app_version_code\nAppVersionSummary,app_version_summary\nAppVisibility,app_visibility\nAppendAccessString,append_access_string\nAppendSourcePath,append_source_path\nAppflowIntegration,appflow_integration\nAppflowIntegrationWorkflowAttributes,appflow_integration_workflow_attributes\nAppflowIntegrationWorkflowMetrics,appflow_integration_workflow_metrics\nAppflowIntegrationWorkflowStep,appflow_integration_workflow_step\nApplianceModeSupport,appliance_mode_support\nApplicability,applicability\nApplication,application\nApplicationARN,application_arn\nApplicationAggregatedStatus,application_aggregated_status\nApplicationAlreadyExistsException,application_already_exists_exception\nApplicationArn,application_arn\nApplicationArns,application_arns\nApplicationCode,application_code\nApplicationCodeConfiguration,application_code_configuration\nApplicationCodeConfigurationDescription,application_code_configuration_description\nApplicationCodeConfigurationUpdate,application_code_configuration_update\nApplicationCodeUpdate,application_code_update\nApplicationComponent,application_component\nApplicationComponentDetail,application_component_detail\nApplicationComponentList,application_component_list\nApplicationComponentStatusSummary,application_component_status_summary\nApplicationComponentStrategy,application_component_strategy\nApplicationComponentSummary,application_component_summary\nApplicationConfig,application_config\nApplicationConfiguration,application_configuration\nApplicationConfigurationDescription,application_configuration_description\nApplicationConfigurationUpdate,application_configuration_update\nApplicationCredential,application_credential\nApplicationDPUSizes,application_dpu_sizes\nApplicationDateRangeKpiResponse,application_date_range_kpi_response\nApplicationDependencySummary,application_dependency_summary\nApplicationDescription,application_description\nApplicationDescriptionMessage,application_description_message\nApplicationDescriptionsMessage,application_descriptions_message\nApplicationDetail,application_detail\nApplicationDoesNotExistException,application_does_not_exist_exception\nApplicationDomain,application_domain\nApplicationFleetAssociation,application_fleet_association\nApplicationFleetAssociations,application_fleet_associations\nApplicationId,application_id\nApplicationIdentifier,application_identifier\nApplicationIds,application_ids\nApplicationInfo,application_info\nApplicationInfoList,application_info_list\nApplicationInstance,application_instance\nApplicationInstanceId,application_instance_id\nApplicationInstanceIdToReplace,application_instance_id_to_replace\nApplicationInstances,application_instances\nApplicationIntegrationURL,application_integration_url\nApplicationLayerAutomaticResponseConfiguration,application_layer_automatic_response_configuration\nApplicationLimitExceededException,application_limit_exceeded_exception\nApplicationMaintenanceConfigurationDescription,application_maintenance_configuration_description\nApplicationMaintenanceConfigurationUpdate,application_maintenance_configuration_update\nApplicationMaintenanceWindowEndTime,application_maintenance_window_end_time\nApplicationMaintenanceWindowStartTime,application_maintenance_window_start_time\nApplicationMaintenanceWindowStartTimeUpdate,application_maintenance_window_start_time_update\nApplicationMetrics,application_metrics\nApplicationMode,application_mode\nApplicationName,application_name\nApplicationNameRequiredException,application_name_required_exception\nApplicationNames,application_names\nApplicationPermissions,application_permissions\nApplicationPolicies,application_policies\nApplicationPolicyStatement,application_policy_statement\nApplicationPreferences,application_preferences\nApplicationQuota,application_quota\nApplicationResourceLifecycleConfig,application_resource_lifecycle_config\nApplicationResourceLifecycleDescriptionMessage,application_resource_lifecycle_description_message\nApplicationResponse,application_response\nApplicationRestoreConfiguration,application_restore_configuration\nApplicationRestoreConfigurationDescription,application_restore_configuration_description\nApplicationRestoreType,application_restore_type\nApplicationRuntimeId,application_runtime_id\nApplicationServerPublicKey,application_server_public_key\nApplicationSettings,application_settings\nApplicationSettingsJourneyLimits,application_settings_journey_limits\nApplicationSettingsResource,application_settings_resource\nApplicationSettingsResponse,application_settings_response\nApplicationSnapshotConfiguration,application_snapshot_configuration\nApplicationSnapshotConfigurationDescription,application_snapshot_configuration_description\nApplicationSnapshotConfigurationUpdate,application_snapshot_configuration_update\nApplicationSource,application_source\nApplicationSourceConfig,application_source_config\nApplicationSources,application_sources\nApplicationState,application_state\nApplicationStateList,application_state_list\nApplicationStatus,application_status\nApplicationSuccessFeedbackRoleArn,application_success_feedback_role_arn\nApplicationSummaries,application_summaries\nApplicationSummary,application_summary\nApplicationSummaryList,application_summary_list\nApplicationTransactionCounter,application_transaction_counter\nApplicationType,application_type\nApplicationUpdate,application_update\nApplicationVersion,application_version\nApplicationVersionArn,application_version_arn\nApplicationVersionDescription,application_version_description\nApplicationVersionDescriptionMessage,application_version_description_message\nApplicationVersionDescriptionsMessage,application_version_descriptions_message\nApplicationVersionDetail,application_version_detail\nApplicationVersionId,application_version_id\nApplicationVersionLifecycleConfig,application_version_lifecycle_config\nApplicationVersionQuota,application_version_quota\nApplicationVersionRolledBackFrom,application_version_rolled_back_from\nApplicationVersionRolledBackTo,application_version_rolled_back_to\nApplicationVersionSummaries,application_version_summaries\nApplicationVersionSummary,application_version_summary\nApplicationVersionUpdatedFrom,application_version_updated_from\nApplicationVersions,application_versions\nApplications,applications\nApplicationsResponse,applications_response\nAppliedColorSpaceConversion,applied_color_space_conversion\nAppliedDdls,applied_ddls\nAppliedDeletes,applied_deletes\nAppliedExtension,applied_extension\nAppliedExtensions,applied_extensions\nAppliedInserts,applied_inserts\nAppliedSchemaArn,applied_schema_arn\nAppliedSettings,applied_settings\nAppliedTerminologies,applied_terminologies\nAppliedTerminology,applied_terminology\nAppliedUpdates,applied_updates\nAppliedValue,applied_value\nApplyAction,apply_action\nApplyArchiveRuleRequest,apply_archive_rule_request\nApplyEnvironmentManagedActionRequest,apply_environment_managed_action_request\nApplyEnvironmentManagedActionResult,apply_environment_managed_action_result\nApplyFontColor,apply_font_color\nApplyImmediately,apply_immediately\nApplyMapping,apply_mapping\nApplyMethod,apply_method\nApplyOn,apply_on\nApplyOnlyAtCronInterval,apply_only_at_cron_interval\nApplyPendingMaintenance,apply_pending_maintenance\nApplyPendingMaintenanceActionMessage,apply_pending_maintenance_action_message\nApplyPendingMaintenanceActionResponse,apply_pending_maintenance_action_response\nApplyPendingMaintenanceActionResult,apply_pending_maintenance_action_result\nApplySchemaRequest,apply_schema_request\nApplySchemaResponse,apply_schema_response\nApplySecurityGroupsToClientVpnTargetNetworkRequest,apply_security_groups_to_client_vpn_target_network_request\nApplySecurityGroupsToClientVpnTargetNetworkResult,apply_security_groups_to_client_vpn_target_network_result\nApplySecurityGroupsToLoadBalancerInput,apply_security_groups_to_load_balancer_input\nApplySecurityGroupsToLoadBalancerOutput,apply_security_groups_to_load_balancer_output\nApplyServerSideEncryptionByDefault,apply_server_side_encryption_by_default\nApplyStatus,apply_status\nApplyTo,apply_to\nApplyToAllRegions,apply_to_all_regions\nApplyType,apply_type\nApproval,approval\nApprovalAlreadyCompletedException,approval_already_completed_exception\nApprovalDate,approval_date\nApprovalDescription,approval_description\nApprovalModel,approval_model\nApprovalResult,approval_result\nApprovalRule,approval_rule\nApprovalRuleContentRequiredException,approval_rule_content_required_exception\nApprovalRuleDoesNotExistException,approval_rule_does_not_exist_exception\nApprovalRuleEventMetadata,approval_rule_event_metadata\nApprovalRuleNameAlreadyExistsException,approval_rule_name_already_exists_exception\nApprovalRuleNameRequiredException,approval_rule_name_required_exception\nApprovalRuleOverriddenEventMetadata,approval_rule_overridden_event_metadata\nApprovalRuleTemplate,approval_rule_template\nApprovalRuleTemplateContentRequiredException,approval_rule_template_content_required_exception\nApprovalRuleTemplateDoesNotExistException,approval_rule_template_does_not_exist_exception\nApprovalRuleTemplateInUseException,approval_rule_template_in_use_exception\nApprovalRuleTemplateNameAlreadyExistsException,approval_rule_template_name_already_exists_exception\nApprovalRuleTemplateNameRequiredException,approval_rule_template_name_required_exception\nApprovalRules,approval_rules\nApprovalStateChangedEventMetadata,approval_state_changed_event_metadata\nApprovalStateRequiredException,approval_state_required_exception\nApprovalThresholdPolicy,approval_threshold_policy\nApprovalTime,approval_time\nApproveAfterDays,approve_after_days\nApproveAssignmentRequest,approve_assignment_request\nApproveSkillRequest,approve_skill_request\nApproveUntilDate,approve_until_date\nApprovedOrigins,approved_origins\nApprovedPatches,approved_patches\nApprovedPatchesComplianceLevel,approved_patches_compliance_level\nApprovedPatchesEnableNonSecurity,approved_patches_enable_non_security\nApprovedVersion,approved_version\nApproximateAggregateValue,approximate_aggregate_value\nApproximateArrivalTimestamp,approximate_arrival_timestamp\nApproximateAssetCount,approximate_asset_count\nApproximateCount,approximate_count\nApproximateCreationDateTime,approximate_creation_date_time\nApproximateDurationSeconds,approximate_duration_seconds\nApproximateNumberOfMessagesMoved,approximate_number_of_messages_moved\nApproximateNumberOfMessagesToMove,approximate_number_of_messages_to_move\nApproximateResultCount,approximate_result_count\nApproximateStartTime,approximate_start_time\nApproximateTime,approximate_time\nApproximateTotalCount,approximate_total_count\nApproximateUniqueCount,approximate_unique_count\nApproximateValue,approximate_value\nApps,apps\nAppsCount,apps_count\nAppsList,apps_list\nAppsListArn,apps_list_arn\nAppsListData,apps_list_data\nAppsListDataSummary,apps_list_data_summary\nAppsLists,apps_lists\nAppstreamAgentVersion,appstream_agent_version\nAquaConfiguration,aqua_configuration\nAquaConfigurationStatus,aqua_configuration_status\nAquaStatus,aqua_status\nArbitraryPatternLimits,arbitrary_pattern_limits\nArc,arc\nArcAngle,arc_angle\nArcAxis,arc_axis\nArcAxisConfiguration,arc_axis_configuration\nArcAxisDisplayRange,arc_axis_display_range\nArcConfiguration,arc_configuration\nArcOptions,arc_options\nArcThickness,arc_thickness\nArch,arch\nArchitecturalDesign,architectural_design\nArchitecture,architecture\nArchitectureTypes,architecture_types\nArchitectures,architectures\nArchivalBackupArn,archival_backup_arn\nArchivalCompleteTime,archival_complete_time\nArchivalDateTime,archival_date_time\nArchivalReason,archival_reason\nArchivalSummary,archival_summary\nArchive,archive\nArchiveAllowedFlag,archive_allowed_flag\nArchiveApplicationRequest,archive_application_request\nArchiveArn,archive_arn\nArchiveCdnSettings,archive_cdn_settings\nArchiveContainerSettings,archive_container_settings\nArchiveCreationOutput,archive_creation_output\nArchiveDescription,archive_description\nArchiveFindingsRequest,archive_findings_request\nArchiveGroupSettings,archive_group_settings\nArchiveId,archive_id\nArchiveName,archive_name\nArchiveOutputSettings,archive_output_settings\nArchiveRetainRule,archive_retain_rule\nArchiveRule,archive_rule\nArchiveRuleSummary,archive_rule_summary\nArchiveS3Settings,archive_s3_settings\nArchiveSHA256TreeHash,archive_sha256_tree_hash\nArchiveSizeInBytes,archive_size_in_bytes\nArchiveStatus,archive_status\nArchiveWaveRequest,archive_wave_request\nArchived,archived\nArchivedLogDestId,archived_log_dest_id\nArchivedLogsOnly,archived_logs_only\nArchives,archives\nAreaCode,area_code\nAreaOfInterest,area_of_interest\nAreaStyleSettings,area_style_settings\nAreaUnderPRCurve,area_under_pr_curve\nArgs,args\nArgumentException,argument_exception\nArguments,arguments\nArgumentsMap,arguments_map\nArib,arib\nAribCaptionsPid,arib_captions_pid\nAribCaptionsPidControl,arib_captions_pid_control\nAribDestinationSettings,arib_destination_settings\nAribSourceSettings,arib_source_settings\nArn,arn\nArnNotSupportedException,arn_not_supported_exception\nArns,arns\nArrayColumnInfo,array_column_info\nArrayProperties,array_properties\nArrayPropertiesDetail,array_properties_detail\nArrayPropertiesSummary,array_properties_summary\nArrayValue,array_value\nArrivalDate,arrival_date\nArtifact,artifact\nArtifactArn,artifact_arn\nArtifactConfig,artifact_config\nArtifactConfigInput,artifact_config_input\nArtifactConfigOutput,artifact_config_output\nArtifactDetail,artifact_detail\nArtifactDetails,artifact_details\nArtifactDigest,artifact_digest\nArtifactId,artifact_id\nArtifactIdentifier,artifact_identifier\nArtifactLocation,artifact_location\nArtifactName,artifact_name\nArtifactPath,artifact_path\nArtifactRevision,artifact_revision\nArtifactS3Location,artifact_s3_location\nArtifactSource,artifact_source\nArtifactSourceType,artifact_source_type\nArtifactStore,artifact_store\nArtifactSummaries,artifact_summaries\nArtifactSummary,artifact_summary\nArtifactType,artifact_type\nArtifacts,artifacts\nArtifactsConcatenationConfiguration,artifacts_concatenation_configuration\nArtifactsConfiguration,artifacts_configuration\nArtwork,artwork\nAs2Config,as2_config\nAs2ConnectorConfig,as2_connector_config\nAs2Id,as2_id\nAs2Transports,as2_transports\nAsPath,as_path\nAscending,ascending\nAsmPassword,asm_password\nAsmServer,asm_server\nAsmUser,asm_user\nAsn,asn\nAsnOrg,asn_org\nAspectRatio,aspect_ratio\nAssembleWith,assemble_with\nAssertedControls,asserted_controls\nAssertionAttributes,assertion_attributes\nAssertionRule,assertion_rule\nAssertionRuleUpdate,assertion_rule_update\nAssessment,assessment\nAssessmentControl,assessment_control\nAssessmentControlSet,assessment_control_set\nAssessmentEvidenceFolder,assessment_evidence_folder\nAssessmentFramework,assessment_framework\nAssessmentFrameworkMetadata,assessment_framework_metadata\nAssessmentFrameworkShareRequest,assessment_framework_share_request\nAssessmentMetadata,assessment_metadata\nAssessmentMetadataItem,assessment_metadata_item\nAssessmentProgress,assessment_progress\nAssessmentReport,assessment_report\nAssessmentReportEvidenceError,assessment_report_evidence_error\nAssessmentReportMetadata,assessment_report_metadata\nAssessmentReportTypes,assessment_report_types\nAssessmentReportsDestination,assessment_reports_destination\nAssessmentResults,assessment_results\nAssessmentResultsFile,assessment_results_file\nAssessmentRun,assessment_run\nAssessmentRunAgent,assessment_run_agent\nAssessmentRunFilter,assessment_run_filter\nAssessmentRunInProgressException,assessment_run_in_progress_exception\nAssessmentRunName,assessment_run_name\nAssessmentRunNotification,assessment_run_notification\nAssessmentRunStateChange,assessment_run_state_change\nAssessmentStatus,assessment_status\nAssessmentSummary,assessment_summary\nAssessmentTarget,assessment_target\nAssessmentTargetFilter,assessment_target_filter\nAssessmentTemplate,assessment_template\nAssessmentTemplateFilter,assessment_template_filter\nAsset,asset\nAssetAttributes,asset_attributes\nAssetBundleCloudFormationOverridePropertyConfiguration,asset_bundle_cloud_formation_override_property_configuration\nAssetBundleExportJobAnalysisOverrideProperties,asset_bundle_export_job_analysis_override_properties\nAssetBundleExportJobDashboardOverrideProperties,asset_bundle_export_job_dashboard_override_properties\nAssetBundleExportJobDataSetOverrideProperties,asset_bundle_export_job_data_set_override_properties\nAssetBundleExportJobDataSourceOverrideProperties,asset_bundle_export_job_data_source_override_properties\nAssetBundleExportJobError,asset_bundle_export_job_error\nAssetBundleExportJobId,asset_bundle_export_job_id\nAssetBundleExportJobRefreshScheduleOverrideProperties,asset_bundle_export_job_refresh_schedule_override_properties\nAssetBundleExportJobResourceIdOverrideConfiguration,asset_bundle_export_job_resource_id_override_configuration\nAssetBundleExportJobSummary,asset_bundle_export_job_summary\nAssetBundleExportJobSummaryList,asset_bundle_export_job_summary_list\nAssetBundleExportJobThemeOverrideProperties,asset_bundle_export_job_theme_override_properties\nAssetBundleExportJobVPCConnectionOverrideProperties,asset_bundle_export_job_vpc_connection_override_properties\nAssetBundleImportJobAnalysisOverrideParameters,asset_bundle_import_job_analysis_override_parameters\nAssetBundleImportJobDashboardOverrideParameters,asset_bundle_import_job_dashboard_override_parameters\nAssetBundleImportJobDataSetOverrideParameters,asset_bundle_import_job_data_set_override_parameters\nAssetBundleImportJobDataSourceCredentialPair,asset_bundle_import_job_data_source_credential_pair\nAssetBundleImportJobDataSourceCredentials,asset_bundle_import_job_data_source_credentials\nAssetBundleImportJobDataSourceOverrideParameters,asset_bundle_import_job_data_source_override_parameters\nAssetBundleImportJobError,asset_bundle_import_job_error\nAssetBundleImportJobId,asset_bundle_import_job_id\nAssetBundleImportJobOverrideParameters,asset_bundle_import_job_override_parameters\nAssetBundleImportJobRefreshScheduleOverrideParameters,asset_bundle_import_job_refresh_schedule_override_parameters\nAssetBundleImportJobResourceIdOverrideConfiguration,asset_bundle_import_job_resource_id_override_configuration\nAssetBundleImportJobSummary,asset_bundle_import_job_summary\nAssetBundleImportJobSummaryList,asset_bundle_import_job_summary_list\nAssetBundleImportJobThemeOverrideParameters,asset_bundle_import_job_theme_override_parameters\nAssetBundleImportJobVPCConnectionOverrideParameters,asset_bundle_import_job_vpc_connection_override_parameters\nAssetBundleImportSource,asset_bundle_import_source\nAssetBundleImportSourceDescription,asset_bundle_import_source_description\nAssetCompositeModel,asset_composite_model\nAssetDestinationEntry,asset_destination_entry\nAssetDestinations,asset_destinations\nAssetDetails,asset_details\nAssetEntry,asset_entry\nAssetErrorDetails,asset_error_details\nAssetHierarchy,asset_hierarchy\nAssetHierarchyInfo,asset_hierarchy_info\nAssetId,asset_id\nAssetIds,asset_ids\nAssetInfo,asset_info\nAssetInformationList,asset_information_list\nAssetLocation,asset_location\nAssetModelCompositeModel,asset_model_composite_model\nAssetModelCompositeModelDefinition,asset_model_composite_model_definition\nAssetModelHierarchy,asset_model_hierarchy\nAssetModelHierarchyDefinition,asset_model_hierarchy_definition\nAssetModelProperty,asset_model_property\nAssetModelPropertyDefinition,asset_model_property_definition\nAssetModelPropertySummary,asset_model_property_summary\nAssetModelStatus,asset_model_status\nAssetModelSummary,asset_model_summary\nAssetName,asset_name\nAssetProperty,asset_property\nAssetPropertySummary,asset_property_summary\nAssetPropertyTimestamp,asset_property_timestamp\nAssetPropertyValue,asset_property_value\nAssetPropertyVariant,asset_property_variant\nAssetRelationshipSummary,asset_relationship_summary\nAssetShallow,asset_shallow\nAssetSource,asset_source\nAssetSourceEntry,asset_source_entry\nAssetSources,asset_sources\nAssetStatus,asset_status\nAssetSummary,asset_summary\nAssetType,asset_type\nAssetValue,asset_value\nAssets,assets\nAssign,assign\nAssignContactCategoryAction,assign_contact_category_action\nAssignInstanceRequest,assign_instance_request\nAssignIpv6AddressOnCreation,assign_ipv6_address_on_creation\nAssignIpv6AddressesRequest,assign_ipv6_addresses_request\nAssignIpv6AddressesResult,assign_ipv6_addresses_result\nAssignPrivateIpAddressesRequest,assign_private_ip_addresses_request\nAssignPrivateIpAddressesResult,assign_private_ip_addresses_result\nAssignPrivateNatGatewayAddressRequest,assign_private_nat_gateway_address_request\nAssignPrivateNatGatewayAddressResult,assign_private_nat_gateway_address_result\nAssignPublicIp,assign_public_ip\nAssignTapePoolInput,assign_tape_pool_input\nAssignTapePoolOutput,assign_tape_pool_output\nAssignVolumeRequest,assign_volume_request\nAssignedIpv4Prefixes,assigned_ipv4_prefixes\nAssignedIpv6Addresses,assigned_ipv6_addresses\nAssignedIpv6Prefixes,assigned_ipv6_prefixes\nAssignedPrivateIpAddress,assigned_private_ip_address\nAssignedPrivateIpAddresses,assigned_private_ip_addresses\nAssigning,assigning\nAssignment,assignment\nAssignmentDurationInSeconds,assignment_duration_in_seconds\nAssignmentId,assignment_id\nAssignmentName,assignment_name\nAssignmentReviewPolicy,assignment_review_policy\nAssignmentReviewReport,assignment_review_report\nAssignmentStatus,assignment_status\nAssignmentStatuses,assignment_statuses\nAssignments,assignments\nAssistAltitude,assist_altitude\nAssistPosition,assist_position\nAssistantAssociationData,assistant_association_data\nAssistantAssociationSummary,assistant_association_summary\nAssistantData,assistant_data\nAssistantIntegrationConfiguration,assistant_integration_configuration\nAssistantSummary,assistant_summary\nAssociateAccountsInput,associate_accounts_input\nAssociateAccountsOutput,associate_accounts_output\nAssociateAddressRequest,associate_address_request\nAssociateAddressResult,associate_address_result\nAssociateAdminAccountRequest,associate_admin_account_request\nAssociateAliasRequest,associate_alias_request\nAssociateApiRequest,associate_api_request\nAssociateApiResponse,associate_api_response\nAssociateAppBlockBuilderAppBlockRequest,associate_app_block_builder_app_block_request\nAssociateAppBlockBuilderAppBlockResult,associate_app_block_builder_app_block_result\nAssociateApplicationFleetRequest,associate_application_fleet_request\nAssociateApplicationFleetResult,associate_application_fleet_result\nAssociateApplicationToEntitlementRequest,associate_application_to_entitlement_request\nAssociateApplicationsRequest,associate_applications_request\nAssociateApprovalRuleTemplateWithRepositoryInput,associate_approval_rule_template_with_repository_input\nAssociateApprovedOriginRequest,associate_approved_origin_request\nAssociateAssessmentReportEvidenceFolderRequest,associate_assessment_report_evidence_folder_request\nAssociateAssetsRequest,associate_assets_request\nAssociateAttributeGroupRequest,associate_attribute_group_request\nAssociateAttributeGroupResponse,associate_attribute_group_response\nAssociateAwsAccountWithPartnerAccountRequest,associate_aws_account_with_partner_account_request\nAssociateAwsAccountWithPartnerAccountResponse,associate_aws_account_with_partner_account_response\nAssociateBotRequest,associate_bot_request\nAssociateBrowserSettingsRequest,associate_browser_settings_request\nAssociateBrowserSettingsResponse,associate_browser_settings_response\nAssociateBudgetWithResourceInput,associate_budget_with_resource_input\nAssociateCarrierIpAddress,associate_carrier_ip_address\nAssociateCertificateRequest,associate_certificate_request\nAssociateChannelFlowRequest,associate_channel_flow_request\nAssociateClientDeviceWithCoreDeviceEntry,associate_client_device_with_core_device_entry\nAssociateClientDeviceWithCoreDeviceErrorEntry,associate_client_device_with_core_device_error_entry\nAssociateClientVpnTargetNetworkRequest,associate_client_vpn_target_network_request\nAssociateClientVpnTargetNetworkResult,associate_client_vpn_target_network_result\nAssociateConfigurationItemsToApplicationRequest,associate_configuration_items_to_application_request\nAssociateConnectPeerRequest,associate_connect_peer_request\nAssociateConnectPeerResponse,associate_connect_peer_response\nAssociateConnectionAliasRequest,associate_connection_alias_request\nAssociateConnectionAliasResult,associate_connection_alias_result\nAssociateConnectionWithLagRequest,associate_connection_with_lag_request\nAssociateContactWithAddressBookRequest,associate_contact_with_address_book_request\nAssociateCreatedArtifactRequest,associate_created_artifact_request\nAssociateCustomDomainRequest,associate_custom_domain_request\nAssociateCustomDomainResponse,associate_custom_domain_response\nAssociateCustomerGatewayRequest,associate_customer_gateway_request\nAssociateCustomerGatewayResponse,associate_customer_gateway_response\nAssociateDRTLogBucketRequest,associate_drt_log_bucket_request\nAssociateDRTRoleRequest,associate_drt_role_request\nAssociateDataShareConsumerMessage,associate_data_share_consumer_message\nAssociateDefaultViewInput,associate_default_view_input\nAssociateDefaultViewOutput,associate_default_view_output\nAssociateDefaultVocabularyRequest,associate_default_vocabulary_request\nAssociateDelegateToResourceRequest,associate_delegate_to_resource_request\nAssociateDelegationSignerToDomainRequest,associate_delegation_signer_to_domain_request\nAssociateDelegationSignerToDomainResponse,associate_delegation_signer_to_domain_response\nAssociateDeviceWithNetworkProfileRequest,associate_device_with_network_profile_request\nAssociateDeviceWithPlacementRequest,associate_device_with_placement_request\nAssociateDeviceWithRoomRequest,associate_device_with_room_request\nAssociateDhcpOptionsRequest,associate_dhcp_options_request\nAssociateDiscoveredResourceRequest,associate_discovered_resource_request\nAssociateDomainRequest,associate_domain_request\nAssociateElasticIpRequest,associate_elastic_ip_request\nAssociateEnclaveCertificateIamRoleRequest,associate_enclave_certificate_iam_role_request\nAssociateEnclaveCertificateIamRoleResult,associate_enclave_certificate_iam_role_result\nAssociateEncryptionConfigRequest,associate_encryption_config_request\nAssociateEncryptionConfigResponse,associate_encryption_config_response\nAssociateEntireAccount,associate_entire_account\nAssociateEntitiesToExperienceRequest,associate_entities_to_experience_request\nAssociateEntitiesToExperienceResponse,associate_entities_to_experience_response\nAssociateEntityToThingRequest,associate_entity_to_thing_request\nAssociateEnvironmentOperationsRoleMessage,associate_environment_operations_role_message\nAssociateExternalConnectionRequest,associate_external_connection_request\nAssociateExternalConnectionResult,associate_external_connection_result\nAssociateFacesRequest,associate_faces_request\nAssociateFacesResponse,associate_faces_response\nAssociateFileSystemAliasesRequest,associate_file_system_aliases_request\nAssociateFileSystemAliasesResponse,associate_file_system_aliases_response\nAssociateFileSystemInput,associate_file_system_input\nAssociateFileSystemOutput,associate_file_system_output\nAssociateFirewallPolicyRequest,associate_firewall_policy_request\nAssociateFirewallPolicyResponse,associate_firewall_policy_response\nAssociateFirewallRuleGroupRequest,associate_firewall_rule_group_request\nAssociateFirewallRuleGroupResponse,associate_firewall_rule_group_response\nAssociateFleetRequest,associate_fleet_request\nAssociateFraudsterRequest,associate_fraudster_request\nAssociateFraudsterResponse,associate_fraudster_response\nAssociateGatewayToServerInput,associate_gateway_to_server_input\nAssociateGatewayToServerOutput,associate_gateway_to_server_output\nAssociateHealthCheckRequest,associate_health_check_request\nAssociateHostedConnectionRequest,associate_hosted_connection_request\nAssociateIamInstanceProfileRequest,associate_iam_instance_profile_request\nAssociateIamInstanceProfileResult,associate_iam_instance_profile_result\nAssociateIdentityProviderConfigRequest,associate_identity_provider_config_request\nAssociateIdentityProviderConfigResponse,associate_identity_provider_config_response\nAssociateInstanceEventWindowRequest,associate_instance_event_window_request\nAssociateInstanceEventWindowResult,associate_instance_event_window_result\nAssociateInstanceStorageConfigRequest,associate_instance_storage_config_request\nAssociateInstanceStorageConfigResponse,associate_instance_storage_config_response\nAssociateIpAccessSettingsRequest,associate_ip_access_settings_request\nAssociateIpAccessSettingsResponse,associate_ip_access_settings_response\nAssociateIpGroupsRequest,associate_ip_groups_request\nAssociateIpamResourceDiscoveryRequest,associate_ipam_resource_discovery_request\nAssociateIpamResourceDiscoveryResult,associate_ipam_resource_discovery_result\nAssociateKmsKeyRequest,associate_kms_key_request\nAssociateLambdaFunctionRequest,associate_lambda_function_request\nAssociateLensesInput,associate_lenses_input\nAssociateLexBotRequest,associate_lex_bot_request\nAssociateLicenseRequest,associate_license_request\nAssociateLicenseResponse,associate_license_response\nAssociateLinkRequest,associate_link_request\nAssociateLinkResponse,associate_link_response\nAssociateMacSecKeyRequest,associate_mac_sec_key_request\nAssociateMacSecKeyResponse,associate_mac_sec_key_response\nAssociateMemberAccountRequest,associate_member_account_request\nAssociateMemberRequest,associate_member_request\nAssociateMemberResponse,associate_member_response\nAssociateMemberToGroupRequest,associate_member_to_group_request\nAssociateMergedGraphqlApiRequest,associate_merged_graphql_api_request\nAssociateMergedGraphqlApiResponse,associate_merged_graphql_api_response\nAssociateMulticastGroupWithFuotaTaskRequest,associate_multicast_group_with_fuota_task_request\nAssociateNatGatewayAddressRequest,associate_nat_gateway_address_request\nAssociateNatGatewayAddressResult,associate_nat_gateway_address_result\nAssociateNetworkSettingsRequest,associate_network_settings_request\nAssociateNetworkSettingsResponse,associate_network_settings_response\nAssociateNodeRequest,associate_node_request\nAssociateNodeResponse,associate_node_response\nAssociateOpsItemRelatedItemRequest,associate_ops_item_related_item_request\nAssociateOpsItemRelatedItemResponse,associate_ops_item_related_item_response\nAssociateOriginationIdentityRequest,associate_origination_identity_request\nAssociateOriginationIdentityResult,associate_origination_identity_result\nAssociatePackageRequest,associate_package_request\nAssociatePackageResponse,associate_package_response\nAssociatePersonasToEntitiesRequest,associate_personas_to_entities_request\nAssociatePersonasToEntitiesResponse,associate_personas_to_entities_response\nAssociatePhoneNumberContactFlowRequest,associate_phone_number_contact_flow_request\nAssociatePhoneNumberWithUserRequest,associate_phone_number_with_user_request\nAssociatePhoneNumbersWithVoiceConnectorGroupRequest,associate_phone_numbers_with_voice_connector_group_request\nAssociatePhoneNumbersWithVoiceConnectorGroupResponse,associate_phone_numbers_with_voice_connector_group_response\nAssociatePhoneNumbersWithVoiceConnectorRequest,associate_phone_numbers_with_voice_connector_request\nAssociatePhoneNumbersWithVoiceConnectorResponse,associate_phone_numbers_with_voice_connector_response\nAssociatePricingRulesInput,associate_pricing_rules_input\nAssociatePricingRulesOutput,associate_pricing_rules_output\nAssociatePrincipalWithPortfolioInput,associate_principal_with_portfolio_input\nAssociateProactiveEngagementDetailsRequest,associate_proactive_engagement_details_request\nAssociateProductWithPortfolioInput,associate_product_with_portfolio_input\nAssociateProfilesInput,associate_profiles_input\nAssociatePublicIpAddress,associate_public_ip_address\nAssociateQualificationWithWorkerRequest,associate_qualification_with_worker_request\nAssociateQueueQuickConnectsRequest,associate_queue_quick_connects_request\nAssociateRepositoryRequest,associate_repository_request\nAssociateRepositoryResponse,associate_repository_response\nAssociateResolverEndpointIpAddressRequest,associate_resolver_endpoint_ip_address_request\nAssociateResolverEndpointIpAddressResponse,associate_resolver_endpoint_ip_address_response\nAssociateResolverQueryLogConfigRequest,associate_resolver_query_log_config_request\nAssociateResolverQueryLogConfigResponse,associate_resolver_query_log_config_response\nAssociateResolverRuleRequest,associate_resolver_rule_request\nAssociateResolverRuleResponse,associate_resolver_rule_response\nAssociateResourceError,associate_resource_error\nAssociateResourceRequest,associate_resource_request\nAssociateResourceResponse,associate_resource_response\nAssociateResourceResponseElement,associate_resource_response_element\nAssociateResourceSharePermissionRequest,associate_resource_share_permission_request\nAssociateResourceSharePermissionResponse,associate_resource_share_permission_response\nAssociateResourceShareRequest,associate_resource_share_request\nAssociateResourceShareResponse,associate_resource_share_response\nAssociateRoleToGroupRequest,associate_role_to_group_request\nAssociateRoleToGroupResponse,associate_role_to_group_response\nAssociateRouteTableRequest,associate_route_table_request\nAssociateRouteTableResult,associate_route_table_result\nAssociateRoutingProfileQueuesRequest,associate_routing_profile_queues_request\nAssociateS3ResourcesRequest,associate_s3_resources_request\nAssociateS3ResourcesResult,associate_s3_resources_result\nAssociateSecurityKeyRequest,associate_security_key_request\nAssociateSecurityKeyResponse,associate_security_key_response\nAssociateServiceActionWithProvisioningArtifactInput,associate_service_action_with_provisioning_artifact_input\nAssociateServiceRoleToAccountRequest,associate_service_role_to_account_request\nAssociateServiceRoleToAccountResponse,associate_service_role_to_account_response\nAssociateSigninDelegateGroupsWithAccountRequest,associate_signin_delegate_groups_with_account_request\nAssociateSkillGroupWithRoomRequest,associate_skill_group_with_room_request\nAssociateSkillWithSkillGroupRequest,associate_skill_with_skill_group_request\nAssociateSkillWithUsersRequest,associate_skill_with_users_request\nAssociateSoftwareTokenRequest,associate_software_token_request\nAssociateSoftwareTokenResponse,associate_software_token_response\nAssociateSourceGraphqlApiRequest,associate_source_graphql_api_request\nAssociateSourceGraphqlApiResponse,associate_source_graphql_api_response\nAssociateSourceNetworkStackRequest,associate_source_network_stack_request\nAssociateSourceNetworkStackResponse,associate_source_network_stack_response\nAssociateSourceServersRequest,associate_source_servers_request\nAssociateSubnetCidrBlockRequest,associate_subnet_cidr_block_request\nAssociateSubnetCidrBlockResult,associate_subnet_cidr_block_result\nAssociateSubnetsRequest,associate_subnets_request\nAssociateSubnetsResponse,associate_subnets_response\nAssociateTagOptionWithResourceInput,associate_tag_option_with_resource_input\nAssociateTargetsWithJobRequest,associate_targets_with_job_request\nAssociateTargetsWithJobResponse,associate_targets_with_job_response\nAssociateTeamMemberRequest,associate_team_member_request\nAssociateTeamMemberResult,associate_team_member_result\nAssociateThirdPartyFirewallRequest,associate_third_party_firewall_request\nAssociateThirdPartyFirewallResponse,associate_third_party_firewall_response\nAssociateTimeSeriesToAssetPropertyRequest,associate_time_series_to_asset_property_request\nAssociateTrackerConsumerRequest,associate_tracker_consumer_request\nAssociateTrafficDistributionGroupUserRequest,associate_traffic_distribution_group_user_request\nAssociateTransitGatewayConnectPeerRequest,associate_transit_gateway_connect_peer_request\nAssociateTransitGatewayConnectPeerResponse,associate_transit_gateway_connect_peer_response\nAssociateTransitGatewayMulticastDomainRequest,associate_transit_gateway_multicast_domain_request\nAssociateTransitGatewayMulticastDomainResult,associate_transit_gateway_multicast_domain_result\nAssociateTransitGatewayPolicyTableRequest,associate_transit_gateway_policy_table_request\nAssociateTransitGatewayPolicyTableResult,associate_transit_gateway_policy_table_result\nAssociateTransitGatewayRouteTableRequest,associate_transit_gateway_route_table_request\nAssociateTransitGatewayRouteTableResult,associate_transit_gateway_route_table_result\nAssociateTrialComponentRequest,associate_trial_component_request\nAssociateTrialComponentResponse,associate_trial_component_response\nAssociateTrunkInterfaceRequest,associate_trunk_interface_request\nAssociateTrunkInterfaceResult,associate_trunk_interface_result\nAssociateTrustStoreRequest,associate_trust_store_request\nAssociateTrustStoreResponse,associate_trust_store_response\nAssociateUserAccessLoggingSettingsRequest,associate_user_access_logging_settings_request\nAssociateUserAccessLoggingSettingsResponse,associate_user_access_logging_settings_response\nAssociateUserRequest,associate_user_request\nAssociateUserResponse,associate_user_response\nAssociateUserSettingsRequest,associate_user_settings_request\nAssociateUserSettingsResponse,associate_user_settings_response\nAssociateUserToPermissionGroupRequest,associate_user_to_permission_group_request\nAssociateUserToPermissionGroupResponse,associate_user_to_permission_group_response\nAssociateVPCWithHostedZoneRequest,associate_vpc_with_hosted_zone_request\nAssociateVPCWithHostedZoneResponse,associate_vpc_with_hosted_zone_response\nAssociateVehicleFleetRequest,associate_vehicle_fleet_request\nAssociateVirtualInterfaceRequest,associate_virtual_interface_request\nAssociateVpcCidrBlockRequest,associate_vpc_cidr_block_request\nAssociateVpcCidrBlockResult,associate_vpc_cidr_block_result\nAssociateWebACLRequest,associate_web_acl_request\nAssociateWebsiteAuthorizationProviderRequest,associate_website_authorization_provider_request\nAssociateWebsiteAuthorizationProviderResponse,associate_website_authorization_provider_response\nAssociateWebsiteCertificateAuthorityRequest,associate_website_certificate_authority_request\nAssociateWebsiteCertificateAuthorityResponse,associate_website_certificate_authority_response\nAssociateWirelessDeviceWithFuotaTaskRequest,associate_wireless_device_with_fuota_task_request\nAssociateWirelessDeviceWithMulticastGroupRequest,associate_wireless_device_with_multicast_group_request\nAssociateWirelessDeviceWithThingRequest,associate_wireless_device_with_thing_request\nAssociateWirelessGatewayWithCertificateRequest,associate_wireless_gateway_with_certificate_request\nAssociateWirelessGatewayWithCertificateResponse,associate_wireless_gateway_with_certificate_response\nAssociateWirelessGatewayWithThingRequest,associate_wireless_gateway_with_thing_request\nAssociatedAccountId,associated_account_id\nAssociatedApplication,associated_application\nAssociatedAssetsSummary,associated_assets_summary\nAssociatedAt,associated_at\nAssociatedClientDevice,associated_client_device\nAssociatedClusterCount,associated_cluster_count\nAssociatedClusters,associated_clusters\nAssociatedEndpointGroupFoundException,associated_endpoint_group_found_exception\nAssociatedFace,associated_face\nAssociatedFaces,associated_faces\nAssociatedGateway,associated_gateway\nAssociatedGlueResource,associated_glue_resource\nAssociatedHost,associated_host\nAssociatedInsightId,associated_insight_id\nAssociatedListenerFoundException,associated_listener_found_exception\nAssociatedPermission,associated_permission\nAssociatedPricingPlanCount,associated_pricing_plan_count\nAssociatedResource,associated_resource\nAssociatedResourceArns,associated_resource_arns\nAssociatedResources,associated_resources\nAssociatedRole,associated_role\nAssociatedRoleArn,associated_role_arn\nAssociatedRoles,associated_roles\nAssociatedRuleGroupArn,associated_rule_group_arn\nAssociatedStandard,associated_standard\nAssociatedStandards,associated_standards\nAssociatedTargetNetwork,associated_target_network\nAssociatedTargetNetworks,associated_target_networks\nAssociatedTimestamp,associated_timestamp\nAssociatedTranscript,associated_transcript\nAssociatedTranscriptFilter,associated_transcript_filter\nAssociatedValues,associated_values\nAssociation,association\nAssociationArn,association_arn\nAssociationConfig,association_config\nAssociationCount,association_count\nAssociationDate,association_date\nAssociationDefaultRouteTableId,association_default_route_table_id\nAssociationDescription,association_description\nAssociationDoesNotExist,association_does_not_exist\nAssociationExecution,association_execution\nAssociationExecutionDoesNotExist,association_execution_does_not_exist\nAssociationExecutionFilter,association_execution_filter\nAssociationExecutionTarget,association_execution_target\nAssociationExecutionTargets,association_execution_targets\nAssociationExecutionTargetsFilter,association_execution_targets_filter\nAssociationExecutions,association_executions\nAssociationFilter,association_filter\nAssociationFilterList,association_filter_list\nAssociationId,association_id\nAssociationIds,association_ids\nAssociationName,association_name\nAssociationOverview,association_overview\nAssociationSet,association_set\nAssociationSetDetails,association_set_details\nAssociationSize,association_size\nAssociationState,association_state\nAssociationStateDetails,association_state_details\nAssociationStatus,association_status\nAssociationStatusAggregatedCount,association_status_aggregated_count\nAssociationSummaries,association_summaries\nAssociationSummary,association_summary\nAssociationTarget,association_target\nAssociationTime,association_time\nAssociationType,association_type\nAssociationVersion,association_version\nAssociationVersionInfo,association_version_info\nAssociationVersionLimitExceeded,association_version_limit_exceeded\nAssociationVersions,association_versions\nAssociations,associations\nAssumeControl,assume_control\nAssumeDecoratedRoleWithSAMLRequest,assume_decorated_role_with_saml_request\nAssumeDecoratedRoleWithSAMLResponse,assume_decorated_role_with_saml_response\nAssumeImpersonationRoleRequest,assume_impersonation_role_request\nAssumeImpersonationRoleResponse,assume_impersonation_role_response\nAssumeRolePolicyDocument,assume_role_policy_document\nAssumeRoleRequest,assume_role_request\nAssumeRoleResponse,assume_role_response\nAssumeRoleWithSAMLRequest,assume_role_with_saml_request\nAssumeRoleWithSAMLResponse,assume_role_with_saml_response\nAssumeRoleWithWebIdentityRequest,assume_role_with_web_identity_request\nAssumeRoleWithWebIdentityResponse,assume_role_with_web_identity_response\nAssumedRole,assumed_role\nAssumedRoleId,assumed_role_id\nAssumedRoleUser,assumed_role_user\nAsymmetricEncryptionAttributes,asymmetric_encryption_attributes\nAsyncErrorDetails,async_error_details\nAsyncInferenceClientConfig,async_inference_client_config\nAsyncInferenceConfig,async_inference_config\nAsyncInferenceNotificationConfig,async_inference_notification_config\nAsyncInferenceOutputConfig,async_inference_output_config\nAsyncOperation,async_operation\nAsyncRequestParameters,async_request_parameters\nAsyncResponseDetails,async_response_details\nAtRestEncryptionEnabled,at_rest_encryption_enabled\nAtTime,at_time\nAthenaConnectorSource,athena_connector_source\nAthenaDatasetDefinition,athena_dataset_definition\nAthenaError,athena_error\nAthenaErrorCode,athena_error_code\nAthenaIntegration,athena_integration\nAthenaIntegrations,athena_integrations\nAthenaParameters,athena_parameters\nAthenaSourceConfig,athena_source_config\nAtigData,atig_data\nAtime,atime\nAttachCertificateToDistributionRequest,attach_certificate_to_distribution_request\nAttachCertificateToDistributionResult,attach_certificate_to_distribution_result\nAttachClassicLinkVpcRequest,attach_classic_link_vpc_request\nAttachClassicLinkVpcResult,attach_classic_link_vpc_result\nAttachCustomerManagedPolicyReferenceToPermissionSetRequest,attach_customer_managed_policy_reference_to_permission_set_request\nAttachDiskRequest,attach_disk_request\nAttachDiskResult,attach_disk_result\nAttachElasticLoadBalancerRequest,attach_elastic_load_balancer_request\nAttachGroupPolicyRequest,attach_group_policy_request\nAttachInstancesQuery,attach_instances_query\nAttachInstancesToLoadBalancerRequest,attach_instances_to_load_balancer_request\nAttachInstancesToLoadBalancerResult,attach_instances_to_load_balancer_result\nAttachInternetGatewayRequest,attach_internet_gateway_request\nAttachLoadBalancerTargetGroupsType,attach_load_balancer_target_groups_type\nAttachLoadBalancerTlsCertificateRequest,attach_load_balancer_tls_certificate_request\nAttachLoadBalancerTlsCertificateResult,attach_load_balancer_tls_certificate_result\nAttachLoadBalancerToSubnetsInput,attach_load_balancer_to_subnets_input\nAttachLoadBalancerToSubnetsOutput,attach_load_balancer_to_subnets_output\nAttachLoadBalancersType,attach_load_balancers_type\nAttachManagedPolicyToPermissionSetRequest,attach_managed_policy_to_permission_set_request\nAttachNetworkInterfaceRequest,attach_network_interface_request\nAttachNetworkInterfaceResult,attach_network_interface_result\nAttachObject,attach_object\nAttachObjectRequest,attach_object_request\nAttachObjectResponse,attach_object_response\nAttachPolicy,attach_policy\nAttachPolicyRequest,attach_policy_request\nAttachPrincipalPolicyRequest,attach_principal_policy_request\nAttachRolePolicyRequest,attach_role_policy_request\nAttachSecurityProfileRequest,attach_security_profile_request\nAttachStaticIpRequest,attach_static_ip_request\nAttachStaticIpResult,attach_static_ip_result\nAttachThingPrincipalRequest,attach_thing_principal_request\nAttachTime,attach_time\nAttachToIndex,attach_to_index\nAttachToIndexRequest,attach_to_index_request\nAttachToIndexResponse,attach_to_index_response\nAttachTrafficSourcesType,attach_traffic_sources_type\nAttachTypedLink,attach_typed_link\nAttachTypedLinkRequest,attach_typed_link_request\nAttachTypedLinkResponse,attach_typed_link_response\nAttachUserPolicyRequest,attach_user_policy_request\nAttachVerifiedAccessTrustProviderRequest,attach_verified_access_trust_provider_request\nAttachVerifiedAccessTrustProviderResult,attach_verified_access_trust_provider_result\nAttachVolumeInput,attach_volume_input\nAttachVolumeOutput,attach_volume_output\nAttachVolumeRequest,attach_volume_request\nAttachVpnGatewayRequest,attach_vpn_gateway_request\nAttachVpnGatewayResult,attach_vpn_gateway_result\nAttachedChannels,attached_channels\nAttachedDisk,attached_disk\nAttachedENIId,attached_eni_id\nAttachedManagedPolicies,attached_managed_policies\nAttachedManagedPolicy,attached_managed_policy\nAttachedObjectIdentifier,attached_object_identifier\nAttachedPermissionsBoundary,attached_permissions_boundary\nAttachedPolicies,attached_policies\nAttachedPolicy,attached_policy\nAttachedPolicyIds,attached_policy_ids\nAttachedTo,attached_to\nAttachedVolumes,attached_volumes\nAttachment,attachment\nAttachmentConfiguration,attachment_configuration\nAttachmentContent,attachment_content\nAttachmentCount,attachment_count\nAttachmentDetails,attachment_details\nAttachmentEnaSrdSpecification,attachment_ena_srd_specification\nAttachmentEnaSrdUdpSpecification,attachment_ena_srd_udp_specification\nAttachmentFieldMappings,attachment_field_mappings\nAttachmentId,attachment_id\nAttachmentIdNotFound,attachment_id_not_found\nAttachmentIds,attachment_ids\nAttachmentInformation,attachment_information\nAttachmentItem,attachment_item\nAttachmentLimitExceeded,attachment_limit_exceeded\nAttachmentName,attachment_name\nAttachmentPolicyRuleNumber,attachment_policy_rule_number\nAttachmentReference,attachment_reference\nAttachmentSetExpired,attachment_set_expired\nAttachmentSetIdNotFound,attachment_set_id_not_found\nAttachmentSetSizeLimitExceeded,attachment_set_size_limit_exceeded\nAttachmentSizeInBytes,attachment_size_in_bytes\nAttachmentStateChange,attachment_state_change\nAttachmentStatuses,attachment_statuses\nAttachmentType,attachment_type\nAttachments,attachments\nAttachmentsContent,attachments_content\nAttachmentsInformation,attachments_information\nAttachmentsSource,attachments_source\nAttack,attack\nAttackCount,attack_count\nAttackCounters,attack_counters\nAttackDetail,attack_detail\nAttackId,attack_id\nAttackLayer,attack_layer\nAttackProperties,attack_properties\nAttackProperty,attack_property\nAttackPropertyIdentifier,attack_property_identifier\nAttackStatisticsDataItem,attack_statistics_data_item\nAttackSummaries,attack_summaries\nAttackSummary,attack_summary\nAttackVectorDescription,attack_vector_description\nAttackVectors,attack_vectors\nAttackVolume,attack_volume\nAttackVolumeStatistics,attack_volume_statistics\nAttempt,attempt\nAttemptContainerDetail,attempt_container_detail\nAttemptCount,attempt_count\nAttemptDetail,attempt_detail\nAttempts,attempts\nAttendee,attendee\nAttendeeCapabilities,attendee_capabilities\nAttendeeId,attendee_id\nAttendeeIdItem,attendee_id_item\nAttendeeIds,attendee_ids\nAttendees,attendees\nAttenuationControl,attenuation_control\nAttestationDocument,attestation_document\nAttribute,attribute\nAttributeAction,attribute_action\nAttributeActionType,attribute_action_type\nAttributeAggregationFunction,attribute_aggregation_function\nAttributeBooleanValue,attribute_boolean_value\nAttributeConfig,attribute_config\nAttributeConfigs,attribute_configs\nAttributeDataType,attribute_data_type\nAttributeDefinition,attribute_definition\nAttributeDefinitions,attribute_definitions\nAttributeDetails,attribute_details\nAttributeDimension,attribute_dimension\nAttributeFilter,attribute_filter\nAttributeGroup,attribute_group\nAttributeGroupDetails,attribute_group_details\nAttributeGroupSummary,attribute_group_summary\nAttributeItem,attribute_item\nAttributeKey,attribute_key\nAttributeKeyAndValue,attribute_key_and_value\nAttributeLimitExceededException,attribute_limit_exceeded_exception\nAttributeMapping,attribute_mapping\nAttributeMatchingModel,attribute_matching_model\nAttributeName,attribute_name\nAttributeNameAndValue,attribute_name_and_value\nAttributeNames,attribute_names\nAttributeOperation,attribute_operation\nAttributePath,attribute_path\nAttributePayload,attribute_payload\nAttributeReference,attribute_reference\nAttributeSuggestionsConfig,attribute_suggestions_config\nAttributeSuggestionsDescribeConfig,attribute_suggestions_describe_config\nAttributeSuggestionsGetConfig,attribute_suggestions_get_config\nAttributeSuggestionsMode,attribute_suggestions_mode\nAttributeSuggestionsUpdateConfig,attribute_suggestions_update_config\nAttributeType,attribute_type\nAttributeTypesSelector,attribute_types_selector\nAttributeUpdateValue,attribute_update_value\nAttributeUpdates,attribute_updates\nAttributeValue,attribute_value\nAttributeValueList,attribute_value_list\nAttributeValueTarget,attribute_value_target\nAttributeValueUpdate,attribute_value_update\nAttributeValues,attribute_values\nAttributes,attributes\nAttributesData,attributes_data\nAttributesRequireVerificationBeforeUpdate,attributes_require_verification_before_update\nAttributesResource,attributes_resource\nAttributesToDelete,attributes_to_delete\nAttributesToGet,attributes_to_get\nAudience,audience\nAudio,audio\nAudioAggregationEndedAt,audio_aggregation_ended_at\nAudioAggregationStartedAt,audio_aggregation_started_at\nAudioAndDTMFInputSpecification,audio_and_dtmf_input_specification\nAudioArtifactsConfiguration,audio_artifacts_configuration\nAudioBufferModel,audio_buffer_model\nAudioChannelConfigSchemeIdUri,audio_channel_config_scheme_id_uri\nAudioChannelMapping,audio_channel_mapping\nAudioChannelTaggingSettings,audio_channel_tagging_settings\nAudioChannels,audio_channels\nAudioChunk,audio_chunk\nAudioCodecOptions,audio_codec_options\nAudioCodecSettings,audio_codec_settings\nAudioConcatenationConfiguration,audio_concatenation_configuration\nAudioConfiguration,audio_configuration\nAudioDeduplication,audio_deduplication\nAudioDescription,audio_description\nAudioDescriptionBroadcasterMix,audio_description_broadcaster_mix\nAudioDescriptionNames,audio_description_names\nAudioDescriptions,audio_descriptions\nAudioDolbyEDecode,audio_dolby_e_decode\nAudioDuration,audio_duration\nAudioDurationCorrection,audio_duration_correction\nAudioEvent,audio_event\nAudioFallbackUrl,audio_fallback_url\nAudioFeatures,audio_features\nAudioFramesPerPes,audio_frames_per_pes\nAudioGroupId,audio_group_id\nAudioHlsRenditionSelection,audio_hls_rendition_selection\nAudioHostUrl,audio_host_url\nAudioInputEvent,audio_input_event\nAudioLanguageSelection,audio_language_selection\nAudioList,audio_list\nAudioLogDestination,audio_log_destination\nAudioLogSetting,audio_log_setting\nAudioMetadata,audio_metadata\nAudioNormalizationSettings,audio_normalization_settings\nAudioOnlyContainer,audio_only_container\nAudioOnlyHeader,audio_only_header\nAudioOnlyHlsSettings,audio_only_hls_settings\nAudioOnlyImage,audio_only_image\nAudioOnlyTimecodeControl,audio_only_timecode_control\nAudioPackingMode,audio_packing_mode\nAudioParameters,audio_parameters\nAudioPidSelection,audio_pid_selection\nAudioPids,audio_pids\nAudioRenditionSets,audio_rendition_sets\nAudioResponseEvent,audio_response_event\nAudioSampleRate,audio_sample_rate\nAudioSelector,audio_selector\nAudioSelectorGroup,audio_selector_group\nAudioSelectorGroups,audio_selector_groups\nAudioSelectorName,audio_selector_name\nAudioSelectorNames,audio_selector_names\nAudioSelectorSettings,audio_selector_settings\nAudioSelectors,audio_selectors\nAudioSilenceFailoverSettings,audio_silence_failover_settings\nAudioSilenceSettings,audio_silence_settings\nAudioSilenceThresholdMsec,audio_silence_threshold_msec\nAudioSourceName,audio_source_name\nAudioSpecification,audio_specification\nAudioStream,audio_stream\nAudioStreamType,audio_stream_type\nAudioTrack,audio_track\nAudioTrackSelection,audio_track_selection\nAudioTrackType,audio_track_type\nAudioType,audio_type\nAudioTypeControl,audio_type_control\nAudioWatermarkSettings,audio_watermark_settings\nAudioWatermarkingSettings,audio_watermarking_settings\nAudit,audit\nAuditCheckConfiguration,audit_check_configuration\nAuditCheckDetails,audit_check_details\nAuditContext,audit_context\nAuditDestinationARN,audit_destination_arn\nAuditEvent,audit_event\nAuditEventResultEntry,audit_event_result_entry\nAuditFinding,audit_finding\nAuditImage,audit_image\nAuditImages,audit_images\nAuditImagesLimit,audit_images_limit\nAuditLogConfiguration,audit_log_configuration\nAuditLogDestination,audit_log_destination\nAuditLogDestinationConfiguration,audit_log_destination_configuration\nAuditLogGroup,audit_log_group\nAuditLogProcessingConfiguration,audit_log_processing_configuration\nAuditLogVolume,audit_log_volume\nAuditLogs,audit_logs\nAuditMitigationActionExecutionMetadata,audit_mitigation_action_execution_metadata\nAuditMitigationActionsTaskMetadata,audit_mitigation_actions_task_metadata\nAuditMitigationActionsTaskTarget,audit_mitigation_actions_task_target\nAuditNotificationTarget,audit_notification_target\nAuditPolicyState,audit_policy_state\nAuditReportId,audit_report_id\nAuditReportResponseFormat,audit_report_response_format\nAuditReportStatus,audit_report_status\nAuditStreamArn,audit_stream_arn\nAuditSuppression,audit_suppression\nAuditTaskMetadata,audit_task_metadata\nAugmentedManifests,augmented_manifests\nAugmentedManifestsListItem,augmented_manifests_list_item\nAuroraParameters,aurora_parameters\nAuroraPostgreSqlParameters,aurora_postgre_sql_parameters\nAuth,auth\nAuthCode,auth_code\nAuthEventType,auth_event_type\nAuthEvents,auth_events\nAuthException,auth_exception\nAuthFlow,auth_flow\nAuthInfo,auth_info\nAuthMechanism,auth_mechanism\nAuthMethod,auth_method\nAuthMode,auth_mode\nAuthParameter,auth_parameter\nAuthParameters,auth_parameters\nAuthPassword,auth_password\nAuthRequest,auth_request\nAuthRequestCryptogram,auth_request_cryptogram\nAuthResources,auth_resources\nAuthResponseAttributes,auth_response_attributes\nAuthResponseCode,auth_response_code\nAuthResponseValue,auth_response_value\nAuthResult,auth_result\nAuthScheme,auth_scheme\nAuthSecretArn,auth_secret_arn\nAuthSessionValidity,auth_session_validity\nAuthSource,auth_source\nAuthStrategy,auth_strategy\nAuthToken,auth_token\nAuthTokenEnabled,auth_token_enabled\nAuthTokenExpirationTime,auth_token_expiration_time\nAuthTokenLastModifiedDate,auth_token_last_modified_date\nAuthTokenStatus,auth_token_status\nAuthTokenUpdateStrategy,auth_token_update_strategy\nAuthTtL,auth_ttl\nAuthType,auth_type\nAuthUserName,auth_user_name\nAuthenticateCognitoActionConfig,authenticate_cognito_action_config\nAuthenticateCognitoConfig,authenticate_cognito_config\nAuthenticateOidcActionConfig,authenticate_oidc_action_config\nAuthenticateOidcConfig,authenticate_oidc_config\nAuthenticateOnUnsubscribe,authenticate_on_unsubscribe\nAuthenticated,authenticated\nAuthentication,authentication\nAuthenticationCode1,authentication_code1\nAuthenticationCode2,authentication_code2\nAuthenticationConfig,authentication_config\nAuthenticationConfiguration,authentication_configuration\nAuthenticationDescription,authentication_description\nAuthenticationFailedException,authentication_failed_exception\nAuthenticationMethod,authentication_method\nAuthenticationMode,authentication_mode\nAuthenticationOptions,authentication_options\nAuthenticationProfile,authentication_profile\nAuthenticationProfileAlreadyExistsFault,authentication_profile_already_exists_fault\nAuthenticationProfileContent,authentication_profile_content\nAuthenticationProfileName,authentication_profile_name\nAuthenticationProfileNotFoundFault,authentication_profile_not_found_fault\nAuthenticationProfileQuotaExceededFault,authentication_profile_quota_exceeded_fault\nAuthenticationProfiles,authentication_profiles\nAuthenticationProtocol,authentication_protocol\nAuthenticationRequestExtraParams,authentication_request_extra_params\nAuthenticationResult,authentication_result\nAuthenticationResultId,authentication_result_id\nAuthenticationResultType,authentication_result_type\nAuthenticationScheme,authentication_scheme\nAuthenticationStrategy,authentication_strategy\nAuthenticationSummary,authentication_summary\nAuthenticationToken,authentication_token\nAuthenticationType,authentication_type\nAuthor,author\nAuthorDoesNotExistException,author_does_not_exist_exception\nAuthorGroup,author_group\nAuthorization,authorization\nAuthorizationAlreadyExistsFault,authorization_already_exists_fault\nAuthorizationConfig,authorization_config\nAuthorizationData,authorization_data\nAuthorizationEndpoint,authorization_endpoint\nAuthorizationErrorException,authorization_error_exception\nAuthorizationException,authorization_exception\nAuthorizationNotFoundFault,authorization_not_found_fault\nAuthorizationPendingException,authorization_pending_exception\nAuthorizationProviderId,authorization_provider_id\nAuthorizationProviderType,authorization_provider_type\nAuthorizationQuotaExceededFault,authorization_quota_exceeded_fault\nAuthorizationResult,authorization_result\nAuthorizationRule,authorization_rule\nAuthorizationRules,authorization_rules\nAuthorizationScopes,authorization_scopes\nAuthorizationStrategy,authorization_strategy\nAuthorizationType,authorization_type\nAuthorizeAllGroups,authorize_all_groups\nAuthorizeCacheSecurityGroupIngressMessage,authorize_cache_security_group_ingress_message\nAuthorizeCacheSecurityGroupIngressResult,authorize_cache_security_group_ingress_result\nAuthorizeClientVpnIngressRequest,authorize_client_vpn_ingress_request\nAuthorizeClientVpnIngressResult,authorize_client_vpn_ingress_result\nAuthorizeClusterSecurityGroupIngressMessage,authorize_cluster_security_group_ingress_message\nAuthorizeClusterSecurityGroupIngressResult,authorize_cluster_security_group_ingress_result\nAuthorizeDBSecurityGroupIngressMessage,authorize_db_security_group_ingress_message\nAuthorizeDBSecurityGroupIngressResult,authorize_db_security_group_ingress_result\nAuthorizeDataShareMessage,authorize_data_share_message\nAuthorizeEndpointAccessMessage,authorize_endpoint_access_message\nAuthorizeIpRulesRequest,authorize_ip_rules_request\nAuthorizeSecurityGroupEgressRequest,authorize_security_group_egress_request\nAuthorizeSecurityGroupEgressResult,authorize_security_group_egress_result\nAuthorizeSecurityGroupIngressRequest,authorize_security_group_ingress_request\nAuthorizeSecurityGroupIngressResult,authorize_security_group_ingress_result\nAuthorizeSnapshotAccessMessage,authorize_snapshot_access_message\nAuthorizeSnapshotAccessResult,authorize_snapshot_access_result\nAuthorizeTime,authorize_time\nAuthorizeVpcEndpointAccessRequest,authorize_vpc_endpoint_access_request\nAuthorizeVpcEndpointAccessResponse,authorize_vpc_endpoint_access_response\nAuthorizedAccountId,authorized_account_id\nAuthorizedAwsRegion,authorized_aws_region\nAuthorizedColumns,authorized_columns\nAuthorizedPrincipal,authorized_principal\nAuthorizedPrincipalList,authorized_principal_list\nAuthorizedResourceArns,authorized_resource_arns\nAuthorizedSessionTagValueList,authorized_session_tag_value_list\nAuthorizedUrl,authorized_url\nAuthorizer,authorizer\nAuthorizerConfig,authorizer_config\nAuthorizerCredentialsArn,authorizer_credentials_arn\nAuthorizerDescription,authorizer_description\nAuthorizerId,authorizer_id\nAuthorizerPayloadFormatVersion,authorizer_payload_format_version\nAuthorizerResultTtlInSeconds,authorizer_result_ttl_in_seconds\nAuthorizerSummary,authorizer_summary\nAuthorizerType,authorizer_type\nAuthorizerUri,authorizer_uri\nAuthorizers,authorizers\nAutoAccept,auto_accept\nAutoAcceptRequests,auto_accept_requests\nAutoAcceptSharedAssociations,auto_accept_shared_associations\nAutoAcceptSharedAttachments,auto_accept_shared_attachments\nAutoAddGroupOwner,auto_add_group_owner\nAutoAdjustData,auto_adjust_data\nAutoAdjustType,auto_adjust_type\nAutoAppliedAfterDate,auto_applied_after_date\nAutoApprovalDelayInSeconds,auto_approval_delay_in_seconds\nAutoApprovalTime,auto_approval_time\nAutoApprove,auto_approve\nAutoAssignElasticIps,auto_assign_elastic_ips\nAutoAssignPublicIps,auto_assign_public_ips\nAutoAssociate,auto_associate\nAutoBranchCreationConfig,auto_branch_creation_config\nAutoConfigEnabled,auto_config_enabled\nAutoCreate,auto_create\nAutoCreateApplication,auto_create_application\nAutoCreateTasks,auto_create_tasks\nAutoDeclineConflictingRequests,auto_decline_conflicting_requests\nAutoDeclineRecurringRequests,auto_decline_recurring_requests\nAutoDeploy,auto_deploy\nAutoDeployed,auto_deployed\nAutoDeployment,auto_deployment\nAutoDeploymentsEnabled,auto_deployments_enabled\nAutoDetectionMetricSource,auto_detection_metric_source\nAutoDetectionS3SourceConfig,auto_detection_s3_source_config\nAutoEnable,auto_enable\nAutoEnableControls,auto_enable_controls\nAutoEnableIO,auto_enable_io\nAutoEnableOrganizationMembers,auto_enable_organization_members\nAutoEnableStandards,auto_enable_standards\nAutoEnroll,auto_enroll\nAutoEnrollment,auto_enrollment\nAutoExportPolicy,auto_export_policy\nAutoExportRevisionDestinationEntry,auto_export_revision_destination_entry\nAutoExportRevisionToS3RequestDetails,auto_export_revision_to_s3_request_details\nAutoGenerateEndpointName,auto_generate_endpoint_name\nAutoGranted,auto_granted\nAutoGrantedValue,auto_granted_value\nAutoImport,auto_import\nAutoImportPolicy,auto_import_policy\nAutoMLAlgorithmArns,auto_ml_algorithm_arns\nAutoMLAlgorithmConfig,auto_ml_algorithm_config\nAutoMLAlgorithms,auto_ml_algorithms\nAutoMLCandidate,auto_ml_candidate\nAutoMLCandidateGenerationConfig,auto_ml_candidate_generation_config\nAutoMLCandidateStep,auto_ml_candidate_step\nAutoMLChannel,auto_ml_channel\nAutoMLConfig,auto_ml_config\nAutoMLContainerDefinition,auto_ml_container_definition\nAutoMLDataSource,auto_ml_data_source\nAutoMLDataSplitConfig,auto_ml_data_split_config\nAutoMLJob,auto_ml_job\nAutoMLJobArn,auto_ml_job_arn\nAutoMLJobArtifacts,auto_ml_job_artifacts\nAutoMLJobChannel,auto_ml_job_channel\nAutoMLJobCompletionCriteria,auto_ml_job_completion_criteria\nAutoMLJobConfig,auto_ml_job_config\nAutoMLJobInputDataConfig,auto_ml_job_input_data_config\nAutoMLJobName,auto_ml_job_name\nAutoMLJobObjective,auto_ml_job_objective\nAutoMLJobSecondaryStatus,auto_ml_job_secondary_status\nAutoMLJobStatus,auto_ml_job_status\nAutoMLJobStepMetadata,auto_ml_job_step_metadata\nAutoMLJobSummaries,auto_ml_job_summaries\nAutoMLJobSummary,auto_ml_job_summary\nAutoMLOutputDataConfig,auto_ml_output_data_config\nAutoMLOverrideStrategy,auto_ml_override_strategy\nAutoMLPartialFailureReason,auto_ml_partial_failure_reason\nAutoMLProblemTypeConfig,auto_ml_problem_type_config\nAutoMLProblemTypeConfigName,auto_ml_problem_type_config_name\nAutoMLProblemTypeResolvedAttributes,auto_ml_problem_type_resolved_attributes\nAutoMLResolvedAttributes,auto_ml_resolved_attributes\nAutoMLResult,auto_ml_result\nAutoMLS3DataSource,auto_mls3_data_source\nAutoMLSecurityConfig,auto_ml_security_config\nAutoMerging,auto_merging\nAutoMinorVersionUpgrade,auto_minor_version_upgrade\nAutoParameter,auto_parameter\nAutoParameters,auto_parameters\nAutoPause,auto_pause\nAutoPlacement,auto_placement\nAutoPromotionResult,auto_promotion_result\nAutoPromotionResultReason,auto_promotion_result_reason\nAutoPushdown,auto_pushdown\nAutoRecovery,auto_recovery\nAutoRecoverySupported,auto_recovery_supported\nAutoRenew,auto_renew\nAutoRollback,auto_rollback\nAutoRollbackConfig,auto_rollback_config\nAutoRollbackConfiguration,auto_rollback_configuration\nAutoScaling,auto_scaling\nAutoScalingConfiguration,auto_scaling_configuration\nAutoScalingConfigurationArn,auto_scaling_configuration_arn\nAutoScalingConfigurationName,auto_scaling_configuration_name\nAutoScalingConfigurationRevision,auto_scaling_configuration_revision\nAutoScalingConfigurationSummary,auto_scaling_configuration_summary\nAutoScalingConfigurationSummaryList,auto_scaling_configuration_summary_list\nAutoScalingDescription,auto_scaling_description\nAutoScalingDisabled,auto_scaling_disabled\nAutoScalingEnabled,auto_scaling_enabled\nAutoScalingEnabledUpdate,auto_scaling_enabled_update\nAutoScalingGroup,auto_scaling_group\nAutoScalingGroupARN,auto_scaling_group_arn\nAutoScalingGroupArn,auto_scaling_group_arn\nAutoScalingGroupConfiguration,auto_scaling_group_configuration\nAutoScalingGroupName,auto_scaling_group_name\nAutoScalingGroupNames,auto_scaling_group_names\nAutoScalingGroupNamesType,auto_scaling_group_names_type\nAutoScalingGroupProvider,auto_scaling_group_provider\nAutoScalingGroupProviderUpdate,auto_scaling_group_provider_update\nAutoScalingGroupRecommendation,auto_scaling_group_recommendation\nAutoScalingGroupRecommendationOption,auto_scaling_group_recommendation_option\nAutoScalingGroupState,auto_scaling_group_state\nAutoScalingGroups,auto_scaling_groups\nAutoScalingGroupsType,auto_scaling_groups_type\nAutoScalingInstanceDetails,auto_scaling_instance_details\nAutoScalingInstances,auto_scaling_instances\nAutoScalingInstancesType,auto_scaling_instances_type\nAutoScalingNotificationTypes,auto_scaling_notification_types\nAutoScalingPolicy,auto_scaling_policy\nAutoScalingPolicyDescription,auto_scaling_policy_description\nAutoScalingPolicyStateChangeReason,auto_scaling_policy_state_change_reason\nAutoScalingPolicyStatus,auto_scaling_policy_status\nAutoScalingPolicyUpdate,auto_scaling_policy_update\nAutoScalingRole,auto_scaling_role\nAutoScalingRoleArn,auto_scaling_role_arn\nAutoScalingSchedule,auto_scaling_schedule\nAutoScalingSettingsDescription,auto_scaling_settings_description\nAutoScalingSettingsUpdate,auto_scaling_settings_update\nAutoScalingTargetTrackingScalingPolicyConfigurationDescription,auto_scaling_target_tracking_scaling_policy_configuration_description\nAutoScalingTargetTrackingScalingPolicyConfigurationUpdate,auto_scaling_target_tracking_scaling_policy_configuration_update\nAutoScalingThresholds,auto_scaling_thresholds\nAutoScalingType,auto_scaling_type\nAutoScalingUpdate,auto_scaling_update\nAutoSnapshotAddOnRequest,auto_snapshot_add_on_request\nAutoSnapshotDetails,auto_snapshot_details\nAutoSoftwareUpdateEnabled,auto_software_update_enabled\nAutoStartConfig,auto_start_config\nAutoStopConfig,auto_stop_config\nAutoTerminate,auto_terminate\nAutoTerminationPolicy,auto_termination_policy\nAutoTune,auto_tune\nAutoTuneDetails,auto_tune_details\nAutoTuneMaintenanceSchedule,auto_tune_maintenance_schedule\nAutoTuneOptions,auto_tune_options\nAutoTuneOptionsInput,auto_tune_options_input\nAutoTuneOptionsOutput,auto_tune_options_output\nAutoTuneOptionsStatus,auto_tune_options_status\nAutoTuneStatus,auto_tune_status\nAutoTuneType,auto_tune_type\nAutoTunes,auto_tunes\nAutoUpdate,auto_update\nAutoUpdateAfterRecommendedApplyByDate,auto_update_after_recommended_apply_by_date\nAutoUpdateStartDate,auto_update_start_date\nAutoUpgrade,auto_upgrade\nAutoUpgradeDate,auto_upgrade_date\nAutoVerifiedAttributes,auto_verified_attributes\nAutoWarmupEnabled,auto_warmup_enabled\nAutocommitPeriod,autocommit_period\nAutodefinedReverse,autodefined_reverse\nAutodefinedReverseFlag,autodefined_reverse_flag\nAutomatedAbrRule,automated_abr_rule\nAutomatedAbrSettings,automated_abr_settings\nAutomatedDiscoveryInformation,automated_discovery_information\nAutomatedEncodingSettings,automated_encoding_settings\nAutomatedSnapshotRetentionPeriod,automated_snapshot_retention_period\nAutomatedSnapshotStartHour,automated_snapshot_start_hour\nAutomatedUpdateDate,automated_update_date\nAutomatic,automatic\nAutomaticBackupRetentionDays,automatic_backup_retention_days\nAutomaticFail,automatic_fail\nAutomaticFailover,automatic_failover\nAutomaticFailoverEnabled,automatic_failover_enabled\nAutomaticFailoverStatus,automatic_failover_status\nAutomaticInputFailoverSettings,automatic_input_failover_settings\nAutomaticRenewal,automatic_renewal\nAutomaticRestartTime,automatic_restart_time\nAutomaticTapeCreationPolicyInfo,automatic_tape_creation_policy_info\nAutomaticTapeCreationPolicyInfos,automatic_tape_creation_policy_infos\nAutomaticTapeCreationRule,automatic_tape_creation_rule\nAutomaticTapeCreationRules,automatic_tape_creation_rules\nAutomaticallyAfterDays,automatically_after_days\nAutomation,automation\nAutomationDefinitionNotApprovedException,automation_definition_not_approved_exception\nAutomationDefinitionNotFoundException,automation_definition_not_found_exception\nAutomationDefinitionVersionNotFoundException,automation_definition_version_not_found_exception\nAutomationExecution,automation_execution\nAutomationExecutionException,automation_execution_exception\nAutomationExecutionFilter,automation_execution_filter\nAutomationExecutionId,automation_execution_id\nAutomationExecutionLimitExceededException,automation_execution_limit_exceeded_exception\nAutomationExecutionMetadata,automation_execution_metadata\nAutomationExecutionMetadataList,automation_execution_metadata_list\nAutomationExecutionNotFoundException,automation_execution_not_found_exception\nAutomationExecutionStatus,automation_execution_status\nAutomationExecutionTimeoutException,automation_execution_timeout_exception\nAutomationMode,automation_mode\nAutomationRulesAction,automation_rules_action\nAutomationRulesArns,automation_rules_arns\nAutomationRulesConfig,automation_rules_config\nAutomationRulesFindingFieldsUpdate,automation_rules_finding_fields_update\nAutomationRulesFindingFilters,automation_rules_finding_filters\nAutomationRulesMetadata,automation_rules_metadata\nAutomationStepNotFoundException,automation_step_not_found_exception\nAutomationSubtype,automation_subtype\nAutomationTargetParameterName,automation_target_parameter_name\nAutomationType,automation_type\nAutoprovision,autoprovision\nAutotune,autotune\nAuxiliaryDataLocation,auxiliary_data_location\nAv1QvbrSettings,av1_qvbr_settings\nAv1Settings,av1_settings\nAvailBlanking,avail_blanking\nAvailBlankingImage,avail_blanking_image\nAvailConfiguration,avail_configuration\nAvailMatchingCriteria,avail_matching_criteria\nAvailNum,avail_num\nAvailSettings,avail_settings\nAvailSuppression,avail_suppression\nAvailability,availability\nAvailabilityConfiguration,availability_configuration\nAvailabilityConfigurations,availability_configurations\nAvailabilityLocalHealthEventsConfig,availability_local_health_events_config\nAvailabilityMeasurement,availability_measurement\nAvailabilityMode,availability_mode\nAvailabilityOptions,availability_options\nAvailabilityOptionsStatus,availability_options_status\nAvailabilityScoreThreshold,availability_score_threshold\nAvailabilityStatus,availability_status\nAvailabilityZone,availability_zone\nAvailabilityZoneCount,availability_zone_count\nAvailabilityZoneDetail,availability_zone_detail\nAvailabilityZoneFilter,availability_zone_filter\nAvailabilityZoneGroup,availability_zone_group\nAvailabilityZoneId,availability_zone_id\nAvailabilityZoneIdFilter,availability_zone_id_filter\nAvailabilityZoneInfo,availability_zone_info\nAvailabilityZoneInformation,availability_zone_information\nAvailabilityZoneMessage,availability_zone_message\nAvailabilityZoneName,availability_zone_name\nAvailabilityZoneNotSupportedException,availability_zone_not_supported_exception\nAvailabilityZoneRelocation,availability_zone_relocation\nAvailabilityZoneRelocationStatus,availability_zone_relocation_status\nAvailabilityZones,availability_zones\nAvailabilityZonesMismatch,availability_zones_mismatch\nAvailable,available\nAvailableAddressCount,available_address_count\nAvailableBalance,available_balance\nAvailableCIDRCount,available_cidr_count\nAvailableCapacity,available_capacity\nAvailableDataNodeCount,available_data_node_count\nAvailableInstanceCapacity,available_instance_capacity\nAvailableInstanceCount,available_instance_count\nAvailableIpAddressCount,available_ip_address_count\nAvailableLabels,available_labels\nAvailableNumberSummary,available_number_summary\nAvailableNumbersList,available_numbers_list\nAvailableOSReleases,available_os_releases\nAvailablePackageVersion,available_package_version\nAvailablePolicyTypes,available_policy_types\nAvailableProcessorFeature,available_processor_feature\nAvailableProcessorFeatures,available_processor_features\nAvailableProvisionedConcurrentExecutions,available_provisioned_concurrent_executions\nAvailableSlotsByChannel,available_slots_by_channel\nAvailableUpgrades,available_upgrades\nAvailableVCpus,available_v_cpus\nAvailsExpected,avails_expected\nAvcIntraClass,avc_intra_class\nAvcIntraSettings,avc_intra_settings\nAvcIntraUhdSettings,avc_intra_uhd_settings\nAverage,average\nAverageAccuracy,average_accuracy\nAverageDownloadRateLimitInBitsPerSec,average_download_rate_limit_in_bits_per_sec\nAverageExecutionTimeMillis,average_execution_time_millis\nAverageF1Score,average_f1_score\nAverageLength,average_length\nAverageNormalizedUnitsUsedPerHour,average_normalized_units_used_per_hour\nAverageNumberOfInstancesUsedPerHour,average_number_of_instances_used_per_hour\nAveragePrecision,average_precision\nAverageRecall,average_recall\nAverageUploadRateLimitInBitsPerSec,average_upload_rate_limit_in_bits_per_sec\nAverageUtilization,average_utilization\nAverageWeightedQuantileLoss,average_weighted_quantile_loss\nAvg,avg\nAvgResizeRateInMegaBytesPerSecond,avg_resize_rate_in_mega_bytes_per_second\nAvoidEmptyBatches,avoid_empty_batches\nAvoidFerries,avoid_ferries\nAvoidTolls,avoid_tolls\nAwaitAnswerMachinePrompt,await_answer_machine_prompt\nAwsAccount,aws_account\nAwsAccountId,aws_account_id\nAwsAccountNumber,aws_account_number\nAwsAmazonMqBroker,aws_amazon_mq_broker\nAwsAmazonMqBrokerDetails,aws_amazon_mq_broker_details\nAwsAmazonMqBrokerEncryptionOptionsDetails,aws_amazon_mq_broker_encryption_options_details\nAwsAmazonMqBrokerLdapServerMetadataDetails,aws_amazon_mq_broker_ldap_server_metadata_details\nAwsAmazonMqBrokerLogsDetails,aws_amazon_mq_broker_logs_details\nAwsAmazonMqBrokerLogsPendingDetails,aws_amazon_mq_broker_logs_pending_details\nAwsAmazonMqBrokerMaintenanceWindowStartTimeDetails,aws_amazon_mq_broker_maintenance_window_start_time_details\nAwsAmazonMqBrokerUsersDetails,aws_amazon_mq_broker_users_details\nAwsApiCallAction,aws_api_call_action\nAwsApiCallActionDomainDetails,aws_api_call_action_domain_details\nAwsApiGatewayAccessLogSettings,aws_api_gateway_access_log_settings\nAwsApiGatewayCanarySettings,aws_api_gateway_canary_settings\nAwsApiGatewayEndpointConfiguration,aws_api_gateway_endpoint_configuration\nAwsApiGatewayMethodSettings,aws_api_gateway_method_settings\nAwsApiGatewayRestApi,aws_api_gateway_rest_api\nAwsApiGatewayRestApiDetails,aws_api_gateway_rest_api_details\nAwsApiGatewayStage,aws_api_gateway_stage\nAwsApiGatewayStageDetails,aws_api_gateway_stage_details\nAwsApiGatewayV2Api,aws_api_gateway_v2_api\nAwsApiGatewayV2ApiDetails,aws_api_gateway_v2_api_details\nAwsApiGatewayV2RouteSettings,aws_api_gateway_v2_route_settings\nAwsApiGatewayV2Stage,aws_api_gateway_v2_stage\nAwsApiGatewayV2StageDetails,aws_api_gateway_v2_stage_details\nAwsAppSyncGraphQlApi,aws_app_sync_graph_ql_api\nAwsAppSyncGraphQlApiAdditionalAuthenticationProvidersDetails,aws_app_sync_graph_ql_api_additional_authentication_providers_details\nAwsAppSyncGraphQlApiDetails,aws_app_sync_graph_ql_api_details\nAwsAppSyncGraphQlApiLambdaAuthorizerConfigDetails,aws_app_sync_graph_ql_api_lambda_authorizer_config_details\nAwsAppSyncGraphQlApiLogConfigDetails,aws_app_sync_graph_ql_api_log_config_details\nAwsAppSyncGraphQlApiOpenIdConnectConfigDetails,aws_app_sync_graph_ql_api_open_id_connect_config_details\nAwsAppSyncGraphQlApiUserPoolConfigDetails,aws_app_sync_graph_ql_api_user_pool_config_details\nAwsAthenaWorkGroup,aws_athena_work_group\nAwsAthenaWorkGroupConfigurationDetails,aws_athena_work_group_configuration_details\nAwsAthenaWorkGroupConfigurationResultConfigurationDetails,aws_athena_work_group_configuration_result_configuration_details\nAwsAthenaWorkGroupConfigurationResultConfigurationEncryptionConfigurationDetails,aws_athena_work_group_configuration_result_configuration_encryption_configuration_details\nAwsAthenaWorkGroupDetails,aws_athena_work_group_details\nAwsAutoScalingAutoScalingGroup,aws_auto_scaling_auto_scaling_group\nAwsAutoScalingAutoScalingGroupAvailabilityZonesListDetails,aws_auto_scaling_auto_scaling_group_availability_zones_list_details\nAwsAutoScalingAutoScalingGroupDetails,aws_auto_scaling_auto_scaling_group_details\nAwsAutoScalingAutoScalingGroupLaunchTemplateLaunchTemplateSpecification,aws_auto_scaling_auto_scaling_group_launch_template_launch_template_specification\nAwsAutoScalingAutoScalingGroupMixedInstancesPolicyDetails,aws_auto_scaling_auto_scaling_group_mixed_instances_policy_details\nAwsAutoScalingAutoScalingGroupMixedInstancesPolicyInstancesDistributionDetails,aws_auto_scaling_auto_scaling_group_mixed_instances_policy_instances_distribution_details\nAwsAutoScalingAutoScalingGroupMixedInstancesPolicyLaunchTemplateDetails,aws_auto_scaling_auto_scaling_group_mixed_instances_policy_launch_template_details\nAwsAutoScalingAutoScalingGroupMixedInstancesPolicyLaunchTemplateLaunchTemplateSpecification,aws_auto_scaling_auto_scaling_group_mixed_instances_policy_launch_template_launch_template_specification\nAwsAutoScalingAutoScalingGroupMixedInstancesPolicyLaunchTemplateOverridesListDetails,aws_auto_scaling_auto_scaling_group_mixed_instances_policy_launch_template_overrides_list_details\nAwsAutoScalingLaunchConfiguration,aws_auto_scaling_launch_configuration\nAwsAutoScalingLaunchConfigurationBlockDeviceMappingsDetails,aws_auto_scaling_launch_configuration_block_device_mappings_details\nAwsAutoScalingLaunchConfigurationBlockDeviceMappingsEbsDetails,aws_auto_scaling_launch_configuration_block_device_mappings_ebs_details\nAwsAutoScalingLaunchConfigurationDetails,aws_auto_scaling_launch_configuration_details\nAwsAutoScalingLaunchConfigurationInstanceMonitoringDetails,aws_auto_scaling_launch_configuration_instance_monitoring_details\nAwsAutoScalingLaunchConfigurationMetadataOptions,aws_auto_scaling_launch_configuration_metadata_options\nAwsBackupBackupPlan,aws_backup_backup_plan\nAwsBackupBackupPlanAdvancedBackupSettingsDetails,aws_backup_backup_plan_advanced_backup_settings_details\nAwsBackupBackupPlanBackupPlanDetails,aws_backup_backup_plan_backup_plan_details\nAwsBackupBackupPlanDetails,aws_backup_backup_plan_details\nAwsBackupBackupPlanLifecycleDetails,aws_backup_backup_plan_lifecycle_details\nAwsBackupBackupPlanRuleCopyActionsDetails,aws_backup_backup_plan_rule_copy_actions_details\nAwsBackupBackupPlanRuleDetails,aws_backup_backup_plan_rule_details\nAwsBackupBackupVault,aws_backup_backup_vault\nAwsBackupBackupVaultDetails,aws_backup_backup_vault_details\nAwsBackupBackupVaultNotificationsDetails,aws_backup_backup_vault_notifications_details\nAwsBackupRecoveryPoint,aws_backup_recovery_point\nAwsBackupRecoveryPointArn,aws_backup_recovery_point_arn\nAwsBackupRecoveryPointCalculatedLifecycleDetails,aws_backup_recovery_point_calculated_lifecycle_details\nAwsBackupRecoveryPointCreatedByDetails,aws_backup_recovery_point_created_by_details\nAwsBackupRecoveryPointDetails,aws_backup_recovery_point_details\nAwsBackupRecoveryPointLifecycleDetails,aws_backup_recovery_point_lifecycle_details\nAwsCertificateManagerCertificate,aws_certificate_manager_certificate\nAwsCertificateManagerCertificateDetails,aws_certificate_manager_certificate_details\nAwsCertificateManagerCertificateDomainValidationOption,aws_certificate_manager_certificate_domain_validation_option\nAwsCertificateManagerCertificateExtendedKeyUsage,aws_certificate_manager_certificate_extended_key_usage\nAwsCertificateManagerCertificateKeyUsage,aws_certificate_manager_certificate_key_usage\nAwsCertificateManagerCertificateOptions,aws_certificate_manager_certificate_options\nAwsCertificateManagerCertificateRenewalSummary,aws_certificate_manager_certificate_renewal_summary\nAwsCertificateManagerCertificateResourceRecord,aws_certificate_manager_certificate_resource_record\nAwsCloudFormationStack,aws_cloud_formation_stack\nAwsCloudFormationStackDetails,aws_cloud_formation_stack_details\nAwsCloudFormationStackDriftInformationDetails,aws_cloud_formation_stack_drift_information_details\nAwsCloudFormationStackOutputsDetails,aws_cloud_formation_stack_outputs_details\nAwsCloudFrontDistribution,aws_cloud_front_distribution\nAwsCloudFrontDistributionCacheBehavior,aws_cloud_front_distribution_cache_behavior\nAwsCloudFrontDistributionCacheBehaviors,aws_cloud_front_distribution_cache_behaviors\nAwsCloudFrontDistributionDefaultCacheBehavior,aws_cloud_front_distribution_default_cache_behavior\nAwsCloudFrontDistributionDetails,aws_cloud_front_distribution_details\nAwsCloudFrontDistributionLogging,aws_cloud_front_distribution_logging\nAwsCloudFrontDistributionOriginCustomOriginConfig,aws_cloud_front_distribution_origin_custom_origin_config\nAwsCloudFrontDistributionOriginGroup,aws_cloud_front_distribution_origin_group\nAwsCloudFrontDistributionOriginGroupFailover,aws_cloud_front_distribution_origin_group_failover\nAwsCloudFrontDistributionOriginGroupFailoverStatusCodes,aws_cloud_front_distribution_origin_group_failover_status_codes\nAwsCloudFrontDistributionOriginGroups,aws_cloud_front_distribution_origin_groups\nAwsCloudFrontDistributionOriginItem,aws_cloud_front_distribution_origin_item\nAwsCloudFrontDistributionOriginS3OriginConfig,aws_cloud_front_distribution_origin_s3_origin_config\nAwsCloudFrontDistributionOriginSslProtocols,aws_cloud_front_distribution_origin_ssl_protocols\nAwsCloudFrontDistributionOrigins,aws_cloud_front_distribution_origins\nAwsCloudFrontDistributionViewerCertificate,aws_cloud_front_distribution_viewer_certificate\nAwsCloudMapInstanceAttribute,aws_cloud_map_instance_attribute\nAwsCloudMapServiceDiscovery,aws_cloud_map_service_discovery\nAwsCloudTrailTrail,aws_cloud_trail_trail\nAwsCloudTrailTrailDetails,aws_cloud_trail_trail_details\nAwsCloudWatchAlarm,aws_cloud_watch_alarm\nAwsCloudWatchAlarmDetails,aws_cloud_watch_alarm_details\nAwsCloudWatchAlarmDimensionsDetails,aws_cloud_watch_alarm_dimensions_details\nAwsCodeBuildProject,aws_code_build_project\nAwsCodeBuildProjectArtifactsDetails,aws_code_build_project_artifacts_details\nAwsCodeBuildProjectDetails,aws_code_build_project_details\nAwsCodeBuildProjectEnvironment,aws_code_build_project_environment\nAwsCodeBuildProjectEnvironmentEnvironmentVariablesDetails,aws_code_build_project_environment_environment_variables_details\nAwsCodeBuildProjectEnvironmentRegistryCredential,aws_code_build_project_environment_registry_credential\nAwsCodeBuildProjectLogsConfigCloudWatchLogsDetails,aws_code_build_project_logs_config_cloud_watch_logs_details\nAwsCodeBuildProjectLogsConfigDetails,aws_code_build_project_logs_config_details\nAwsCodeBuildProjectLogsConfigS3LogsDetails,aws_code_build_project_logs_config_s3_logs_details\nAwsCodeBuildProjectSource,aws_code_build_project_source\nAwsCodeBuildProjectVpcConfig,aws_code_build_project_vpc_config\nAwsCognitoIdentityPoolId,aws_cognito_identity_pool_id\nAwsCognitoRegion,aws_cognito_region\nAwsCorsConfiguration,aws_cors_configuration\nAwsCredentials,aws_credentials\nAwsDynamoDbTable,aws_dynamo_db_table\nAwsDynamoDbTableAttributeDefinition,aws_dynamo_db_table_attribute_definition\nAwsDynamoDbTableBillingModeSummary,aws_dynamo_db_table_billing_mode_summary\nAwsDynamoDbTableDetails,aws_dynamo_db_table_details\nAwsDynamoDbTableGlobalSecondaryIndex,aws_dynamo_db_table_global_secondary_index\nAwsDynamoDbTableKeySchema,aws_dynamo_db_table_key_schema\nAwsDynamoDbTableLocalSecondaryIndex,aws_dynamo_db_table_local_secondary_index\nAwsDynamoDbTableProjection,aws_dynamo_db_table_projection\nAwsDynamoDbTableProvisionedThroughput,aws_dynamo_db_table_provisioned_throughput\nAwsDynamoDbTableProvisionedThroughputOverride,aws_dynamo_db_table_provisioned_throughput_override\nAwsDynamoDbTableReplica,aws_dynamo_db_table_replica\nAwsDynamoDbTableReplicaGlobalSecondaryIndex,aws_dynamo_db_table_replica_global_secondary_index\nAwsDynamoDbTableRestoreSummary,aws_dynamo_db_table_restore_summary\nAwsDynamoDbTableSseDescription,aws_dynamo_db_table_sse_description\nAwsDynamoDbTableStreamSpecification,aws_dynamo_db_table_stream_specification\nAwsEc2Eip,aws_ec2_eip\nAwsEc2EipDetails,aws_ec2_eip_details\nAwsEc2Instance,aws_ec2_instance\nAwsEc2InstanceDetails,aws_ec2_instance_details\nAwsEc2InstanceMetadataOptions,aws_ec2_instance_metadata_options\nAwsEc2InstanceMonitoringDetails,aws_ec2_instance_monitoring_details\nAwsEc2InstanceNetworkInterfacesDetails,aws_ec2_instance_network_interfaces_details\nAwsEc2InstanceViolation,aws_ec2_instance_violation\nAwsEc2LaunchTemplate,aws_ec2_launch_template\nAwsEc2LaunchTemplateDataBlockDeviceMappingSetDetails,aws_ec2_launch_template_data_block_device_mapping_set_details\nAwsEc2LaunchTemplateDataBlockDeviceMappingSetEbsDetails,aws_ec2_launch_template_data_block_device_mapping_set_ebs_details\nAwsEc2LaunchTemplateDataCapacityReservationSpecificationCapacityReservationTargetDetails,aws_ec2_launch_template_data_capacity_reservation_specification_capacity_reservation_target_details\nAwsEc2LaunchTemplateDataCapacityReservationSpecificationDetails,aws_ec2_launch_template_data_capacity_reservation_specification_details\nAwsEc2LaunchTemplateDataCpuOptionsDetails,aws_ec2_launch_template_data_cpu_options_details\nAwsEc2LaunchTemplateDataCreditSpecificationDetails,aws_ec2_launch_template_data_credit_specification_details\nAwsEc2LaunchTemplateDataDetails,aws_ec2_launch_template_data_details\nAwsEc2LaunchTemplateDataElasticGpuSpecificationSetDetails,aws_ec2_launch_template_data_elastic_gpu_specification_set_details\nAwsEc2LaunchTemplateDataElasticInferenceAcceleratorSetDetails,aws_ec2_launch_template_data_elastic_inference_accelerator_set_details\nAwsEc2LaunchTemplateDataEnclaveOptionsDetails,aws_ec2_launch_template_data_enclave_options_details\nAwsEc2LaunchTemplateDataHibernationOptionsDetails,aws_ec2_launch_template_data_hibernation_options_details\nAwsEc2LaunchTemplateDataIamInstanceProfileDetails,aws_ec2_launch_template_data_iam_instance_profile_details\nAwsEc2LaunchTemplateDataInstanceMarketOptionsDetails,aws_ec2_launch_template_data_instance_market_options_details\nAwsEc2LaunchTemplateDataInstanceMarketOptionsSpotOptionsDetails,aws_ec2_launch_template_data_instance_market_options_spot_options_details\nAwsEc2LaunchTemplateDataInstanceRequirementsAcceleratorCountDetails,aws_ec2_launch_template_data_instance_requirements_accelerator_count_details\nAwsEc2LaunchTemplateDataInstanceRequirementsAcceleratorTotalMemoryMiBDetails,aws_ec2_launch_template_data_instance_requirements_accelerator_total_memory_mib_details\nAwsEc2LaunchTemplateDataInstanceRequirementsBaselineEbsBandwidthMbpsDetails,aws_ec2_launch_template_data_instance_requirements_baseline_ebs_bandwidth_mbps_details\nAwsEc2LaunchTemplateDataInstanceRequirementsDetails,aws_ec2_launch_template_data_instance_requirements_details\nAwsEc2LaunchTemplateDataInstanceRequirementsMemoryGiBPerVCpuDetails,aws_ec2_launch_template_data_instance_requirements_memory_gib_per_v_cpu_details\nAwsEc2LaunchTemplateDataInstanceRequirementsMemoryMiBDetails,aws_ec2_launch_template_data_instance_requirements_memory_mib_details\nAwsEc2LaunchTemplateDataInstanceRequirementsNetworkInterfaceCountDetails,aws_ec2_launch_template_data_instance_requirements_network_interface_count_details\nAwsEc2LaunchTemplateDataInstanceRequirementsTotalLocalStorageGBDetails,aws_ec2_launch_template_data_instance_requirements_total_local_storage_gb_details\nAwsEc2LaunchTemplateDataInstanceRequirementsVCpuCountDetails,aws_ec2_launch_template_data_instance_requirements_v_cpu_count_details\nAwsEc2LaunchTemplateDataLicenseSetDetails,aws_ec2_launch_template_data_license_set_details\nAwsEc2LaunchTemplateDataMaintenanceOptionsDetails,aws_ec2_launch_template_data_maintenance_options_details\nAwsEc2LaunchTemplateDataMetadataOptionsDetails,aws_ec2_launch_template_data_metadata_options_details\nAwsEc2LaunchTemplateDataMonitoringDetails,aws_ec2_launch_template_data_monitoring_details\nAwsEc2LaunchTemplateDataNetworkInterfaceSetDetails,aws_ec2_launch_template_data_network_interface_set_details\nAwsEc2LaunchTemplateDataNetworkInterfaceSetIpv4PrefixesDetails,aws_ec2_launch_template_data_network_interface_set_ipv4_prefixes_details\nAwsEc2LaunchTemplateDataNetworkInterfaceSetIpv6AddressesDetails,aws_ec2_launch_template_data_network_interface_set_ipv6_addresses_details\nAwsEc2LaunchTemplateDataNetworkInterfaceSetIpv6PrefixesDetails,aws_ec2_launch_template_data_network_interface_set_ipv6_prefixes_details\nAwsEc2LaunchTemplateDataNetworkInterfaceSetPrivateIpAddressesDetails,aws_ec2_launch_template_data_network_interface_set_private_ip_addresses_details\nAwsEc2LaunchTemplateDataPlacementDetails,aws_ec2_launch_template_data_placement_details\nAwsEc2LaunchTemplateDataPrivateDnsNameOptionsDetails,aws_ec2_launch_template_data_private_dns_name_options_details\nAwsEc2LaunchTemplateDetails,aws_ec2_launch_template_details\nAwsEc2NetworkAcl,aws_ec2_network_acl\nAwsEc2NetworkAclAssociation,aws_ec2_network_acl_association\nAwsEc2NetworkAclDetails,aws_ec2_network_acl_details\nAwsEc2NetworkAclEntry,aws_ec2_network_acl_entry\nAwsEc2NetworkInterface,aws_ec2_network_interface\nAwsEc2NetworkInterfaceAttachment,aws_ec2_network_interface_attachment\nAwsEc2NetworkInterfaceDetails,aws_ec2_network_interface_details\nAwsEc2NetworkInterfaceIpV6AddressDetail,aws_ec2_network_interface_ipv6_address_detail\nAwsEc2NetworkInterfacePrivateIpAddressDetail,aws_ec2_network_interface_private_ip_address_detail\nAwsEc2NetworkInterfaceSecurityGroup,aws_ec2_network_interface_security_group\nAwsEc2NetworkInterfaceViolation,aws_ec2_network_interface_violation\nAwsEc2NetworkInterfaceViolations,aws_ec2_network_interface_violations\nAwsEc2RouteTable,aws_ec2_route_table\nAwsEc2RouteTableDetails,aws_ec2_route_table_details\nAwsEc2SecurityGroup,aws_ec2_security_group\nAwsEc2SecurityGroupDetails,aws_ec2_security_group_details\nAwsEc2SecurityGroupIpPermission,aws_ec2_security_group_ip_permission\nAwsEc2SecurityGroupIpRange,aws_ec2_security_group_ip_range\nAwsEc2SecurityGroupIpv6Range,aws_ec2_security_group_ipv6_range\nAwsEc2SecurityGroupPrefixListId,aws_ec2_security_group_prefix_list_id\nAwsEc2SecurityGroupUserIdGroupPair,aws_ec2_security_group_user_id_group_pair\nAwsEc2Subnet,aws_ec2_subnet\nAwsEc2SubnetDetails,aws_ec2_subnet_details\nAwsEc2TransitGateway,aws_ec2_transit_gateway\nAwsEc2TransitGatewayDetails,aws_ec2_transit_gateway_details\nAwsEc2Volume,aws_ec2_volume\nAwsEc2VolumeAttachment,aws_ec2_volume_attachment\nAwsEc2VolumeDetails,aws_ec2_volume_details\nAwsEc2Vpc,aws_ec2_vpc\nAwsEc2VpcDetails,aws_ec2_vpc_details\nAwsEc2VpcEndpointService,aws_ec2_vpc_endpoint_service\nAwsEc2VpcEndpointServiceDetails,aws_ec2_vpc_endpoint_service_details\nAwsEc2VpcEndpointServiceServiceTypeDetails,aws_ec2_vpc_endpoint_service_service_type_details\nAwsEc2VpcPeeringConnection,aws_ec2_vpc_peering_connection\nAwsEc2VpcPeeringConnectionDetails,aws_ec2_vpc_peering_connection_details\nAwsEc2VpcPeeringConnectionStatusDetails,aws_ec2_vpc_peering_connection_status_details\nAwsEc2VpcPeeringConnectionVpcInfoDetails,aws_ec2_vpc_peering_connection_vpc_info_details\nAwsEc2VpnConnection,aws_ec2_vpn_connection\nAwsEc2VpnConnectionDetails,aws_ec2_vpn_connection_details\nAwsEc2VpnConnectionOptionsDetails,aws_ec2_vpn_connection_options_details\nAwsEc2VpnConnectionOptionsTunnelOptionsDetails,aws_ec2_vpn_connection_options_tunnel_options_details\nAwsEc2VpnConnectionRoutesDetails,aws_ec2_vpn_connection_routes_details\nAwsEc2VpnConnectionVgwTelemetryDetails,aws_ec2_vpn_connection_vgw_telemetry_details\nAwsEcrContainerAggregation,aws_ecr_container_aggregation\nAwsEcrContainerAggregationResponse,aws_ecr_container_aggregation_response\nAwsEcrContainerImage,aws_ecr_container_image\nAwsEcrContainerImageDetails,aws_ecr_container_image_details\nAwsEcrRepository,aws_ecr_repository\nAwsEcrRepositoryDetails,aws_ecr_repository_details\nAwsEcrRepositoryImageScanningConfigurationDetails,aws_ecr_repository_image_scanning_configuration_details\nAwsEcrRepositoryLifecyclePolicyDetails,aws_ecr_repository_lifecycle_policy_details\nAwsEcsCluster,aws_ecs_cluster\nAwsEcsClusterClusterSettingsDetails,aws_ecs_cluster_cluster_settings_details\nAwsEcsClusterConfigurationDetails,aws_ecs_cluster_configuration_details\nAwsEcsClusterConfigurationExecuteCommandConfigurationDetails,aws_ecs_cluster_configuration_execute_command_configuration_details\nAwsEcsClusterConfigurationExecuteCommandConfigurationLogConfigurationDetails,aws_ecs_cluster_configuration_execute_command_configuration_log_configuration_details\nAwsEcsClusterDefaultCapacityProviderStrategyDetails,aws_ecs_cluster_default_capacity_provider_strategy_details\nAwsEcsClusterDetails,aws_ecs_cluster_details\nAwsEcsContainer,aws_ecs_container\nAwsEcsContainerDetails,aws_ecs_container_details\nAwsEcsService,aws_ecs_service\nAwsEcsServiceCapacityProviderStrategyDetails,aws_ecs_service_capacity_provider_strategy_details\nAwsEcsServiceDeploymentConfigurationDeploymentCircuitBreakerDetails,aws_ecs_service_deployment_configuration_deployment_circuit_breaker_details\nAwsEcsServiceDeploymentConfigurationDetails,aws_ecs_service_deployment_configuration_details\nAwsEcsServiceDeploymentControllerDetails,aws_ecs_service_deployment_controller_details\nAwsEcsServiceDetails,aws_ecs_service_details\nAwsEcsServiceLoadBalancersDetails,aws_ecs_service_load_balancers_details\nAwsEcsServiceNetworkConfigurationAwsVpcConfigurationDetails,aws_ecs_service_network_configuration_aws_vpc_configuration_details\nAwsEcsServiceNetworkConfigurationDetails,aws_ecs_service_network_configuration_details\nAwsEcsServicePlacementConstraintsDetails,aws_ecs_service_placement_constraints_details\nAwsEcsServicePlacementStrategiesDetails,aws_ecs_service_placement_strategies_details\nAwsEcsServiceServiceRegistriesDetails,aws_ecs_service_service_registries_details\nAwsEcsTask,aws_ecs_task\nAwsEcsTaskDefinition,aws_ecs_task_definition\nAwsEcsTaskDefinitionContainerDefinitionsDependsOnDetails,aws_ecs_task_definition_container_definitions_depends_on_details\nAwsEcsTaskDefinitionContainerDefinitionsDetails,aws_ecs_task_definition_container_definitions_details\nAwsEcsTaskDefinitionContainerDefinitionsEnvironmentDetails,aws_ecs_task_definition_container_definitions_environment_details\nAwsEcsTaskDefinitionContainerDefinitionsEnvironmentFilesDetails,aws_ecs_task_definition_container_definitions_environment_files_details\nAwsEcsTaskDefinitionContainerDefinitionsExtraHostsDetails,aws_ecs_task_definition_container_definitions_extra_hosts_details\nAwsEcsTaskDefinitionContainerDefinitionsFirelensConfigurationDetails,aws_ecs_task_definition_container_definitions_firelens_configuration_details\nAwsEcsTaskDefinitionContainerDefinitionsHealthCheckDetails,aws_ecs_task_definition_container_definitions_health_check_details\nAwsEcsTaskDefinitionContainerDefinitionsLinuxParametersCapabilitiesDetails,aws_ecs_task_definition_container_definitions_linux_parameters_capabilities_details\nAwsEcsTaskDefinitionContainerDefinitionsLinuxParametersDetails,aws_ecs_task_definition_container_definitions_linux_parameters_details\nAwsEcsTaskDefinitionContainerDefinitionsLinuxParametersDevicesDetails,aws_ecs_task_definition_container_definitions_linux_parameters_devices_details\nAwsEcsTaskDefinitionContainerDefinitionsLinuxParametersTmpfsDetails,aws_ecs_task_definition_container_definitions_linux_parameters_tmpfs_details\nAwsEcsTaskDefinitionContainerDefinitionsLogConfigurationDetails,aws_ecs_task_definition_container_definitions_log_configuration_details\nAwsEcsTaskDefinitionContainerDefinitionsLogConfigurationSecretOptionsDetails,aws_ecs_task_definition_container_definitions_log_configuration_secret_options_details\nAwsEcsTaskDefinitionContainerDefinitionsMountPointsDetails,aws_ecs_task_definition_container_definitions_mount_points_details\nAwsEcsTaskDefinitionContainerDefinitionsPortMappingsDetails,aws_ecs_task_definition_container_definitions_port_mappings_details\nAwsEcsTaskDefinitionContainerDefinitionsRepositoryCredentialsDetails,aws_ecs_task_definition_container_definitions_repository_credentials_details\nAwsEcsTaskDefinitionContainerDefinitionsResourceRequirementsDetails,aws_ecs_task_definition_container_definitions_resource_requirements_details\nAwsEcsTaskDefinitionContainerDefinitionsSecretsDetails,aws_ecs_task_definition_container_definitions_secrets_details\nAwsEcsTaskDefinitionContainerDefinitionsSystemControlsDetails,aws_ecs_task_definition_container_definitions_system_controls_details\nAwsEcsTaskDefinitionContainerDefinitionsUlimitsDetails,aws_ecs_task_definition_container_definitions_ulimits_details\nAwsEcsTaskDefinitionContainerDefinitionsVolumesFromDetails,aws_ecs_task_definition_container_definitions_volumes_from_details\nAwsEcsTaskDefinitionDetails,aws_ecs_task_definition_details\nAwsEcsTaskDefinitionInferenceAcceleratorsDetails,aws_ecs_task_definition_inference_accelerators_details\nAwsEcsTaskDefinitionPlacementConstraintsDetails,aws_ecs_task_definition_placement_constraints_details\nAwsEcsTaskDefinitionProxyConfigurationDetails,aws_ecs_task_definition_proxy_configuration_details\nAwsEcsTaskDefinitionProxyConfigurationProxyConfigurationPropertiesDetails,aws_ecs_task_definition_proxy_configuration_proxy_configuration_properties_details\nAwsEcsTaskDefinitionVolumesDetails,aws_ecs_task_definition_volumes_details\nAwsEcsTaskDefinitionVolumesDockerVolumeConfigurationDetails,aws_ecs_task_definition_volumes_docker_volume_configuration_details\nAwsEcsTaskDefinitionVolumesEfsVolumeConfigurationAuthorizationConfigDetails,aws_ecs_task_definition_volumes_efs_volume_configuration_authorization_config_details\nAwsEcsTaskDefinitionVolumesEfsVolumeConfigurationDetails,aws_ecs_task_definition_volumes_efs_volume_configuration_details\nAwsEcsTaskDefinitionVolumesHostDetails,aws_ecs_task_definition_volumes_host_details\nAwsEcsTaskDetails,aws_ecs_task_details\nAwsEcsTaskVolumeDetails,aws_ecs_task_volume_details\nAwsEcsTaskVolumeHostDetails,aws_ecs_task_volume_host_details\nAwsEfsAccessPoint,aws_efs_access_point\nAwsEfsAccessPointDetails,aws_efs_access_point_details\nAwsEfsAccessPointPosixUserDetails,aws_efs_access_point_posix_user_details\nAwsEfsAccessPointRootDirectoryCreationInfoDetails,aws_efs_access_point_root_directory_creation_info_details\nAwsEfsAccessPointRootDirectoryDetails,aws_efs_access_point_root_directory_details\nAwsEksCluster,aws_eks_cluster\nAwsEksClusterDetails,aws_eks_cluster_details\nAwsEksClusterLoggingClusterLoggingDetails,aws_eks_cluster_logging_cluster_logging_details\nAwsEksClusterLoggingDetails,aws_eks_cluster_logging_details\nAwsEksClusterResourcesVpcConfigDetails,aws_eks_cluster_resources_vpc_config_details\nAwsElasticBeanstalkEnvironment,aws_elastic_beanstalk_environment\nAwsElasticBeanstalkEnvironmentDetails,aws_elastic_beanstalk_environment_details\nAwsElasticBeanstalkEnvironmentEnvironmentLink,aws_elastic_beanstalk_environment_environment_link\nAwsElasticBeanstalkEnvironmentOptionSetting,aws_elastic_beanstalk_environment_option_setting\nAwsElasticBeanstalkEnvironmentTier,aws_elastic_beanstalk_environment_tier\nAwsElasticsearchDomain,aws_elasticsearch_domain\nAwsElasticsearchDomainDetails,aws_elasticsearch_domain_details\nAwsElasticsearchDomainDomainEndpointOptions,aws_elasticsearch_domain_domain_endpoint_options\nAwsElasticsearchDomainElasticsearchClusterConfigDetails,aws_elasticsearch_domain_elasticsearch_cluster_config_details\nAwsElasticsearchDomainElasticsearchClusterConfigZoneAwarenessConfigDetails,aws_elasticsearch_domain_elasticsearch_cluster_config_zone_awareness_config_details\nAwsElasticsearchDomainEncryptionAtRestOptions,aws_elasticsearch_domain_encryption_at_rest_options\nAwsElasticsearchDomainLogPublishingOptions,aws_elasticsearch_domain_log_publishing_options\nAwsElasticsearchDomainLogPublishingOptionsLogConfig,aws_elasticsearch_domain_log_publishing_options_log_config\nAwsElasticsearchDomainNodeToNodeEncryptionOptions,aws_elasticsearch_domain_node_to_node_encryption_options\nAwsElasticsearchDomainServiceSoftwareOptions,aws_elasticsearch_domain_service_software_options\nAwsElasticsearchDomainVPCOptions,aws_elasticsearch_domain_vpc_options\nAwsElbAppCookieStickinessPolicy,aws_elb_app_cookie_stickiness_policy\nAwsElbLbCookieStickinessPolicy,aws_elb_lb_cookie_stickiness_policy\nAwsElbLoadBalancer,aws_elb_load_balancer\nAwsElbLoadBalancerAccessLog,aws_elb_load_balancer_access_log\nAwsElbLoadBalancerAdditionalAttribute,aws_elb_load_balancer_additional_attribute\nAwsElbLoadBalancerAttributes,aws_elb_load_balancer_attributes\nAwsElbLoadBalancerBackendServerDescription,aws_elb_load_balancer_backend_server_description\nAwsElbLoadBalancerConnectionDraining,aws_elb_load_balancer_connection_draining\nAwsElbLoadBalancerConnectionSettings,aws_elb_load_balancer_connection_settings\nAwsElbLoadBalancerCrossZoneLoadBalancing,aws_elb_load_balancer_cross_zone_load_balancing\nAwsElbLoadBalancerDetails,aws_elb_load_balancer_details\nAwsElbLoadBalancerHealthCheck,aws_elb_load_balancer_health_check\nAwsElbLoadBalancerInstance,aws_elb_load_balancer_instance\nAwsElbLoadBalancerListener,aws_elb_load_balancer_listener\nAwsElbLoadBalancerListenerDescription,aws_elb_load_balancer_listener_description\nAwsElbLoadBalancerPolicies,aws_elb_load_balancer_policies\nAwsElbLoadBalancerSourceSecurityGroup,aws_elb_load_balancer_source_security_group\nAwsElbv2LoadBalancer,aws_elbv2_load_balancer\nAwsElbv2LoadBalancerAttribute,aws_elbv2_load_balancer_attribute\nAwsElbv2LoadBalancerDetails,aws_elbv2_load_balancer_details\nAwsEventSchemasRegistry,aws_event_schemas_registry\nAwsEventSchemasRegistryDetails,aws_event_schemas_registry_details\nAwsGroundStationAgentEndpoint,aws_ground_station_agent_endpoint\nAwsGuardDutyDetector,aws_guard_duty_detector\nAwsGuardDutyDetectorDataSourcesCloudTrailDetails,aws_guard_duty_detector_data_sources_cloud_trail_details\nAwsGuardDutyDetectorDataSourcesDetails,aws_guard_duty_detector_data_sources_details\nAwsGuardDutyDetectorDataSourcesDnsLogsDetails,aws_guard_duty_detector_data_sources_dns_logs_details\nAwsGuardDutyDetectorDataSourcesFlowLogsDetails,aws_guard_duty_detector_data_sources_flow_logs_details\nAwsGuardDutyDetectorDataSourcesKubernetesAuditLogsDetails,aws_guard_duty_detector_data_sources_kubernetes_audit_logs_details\nAwsGuardDutyDetectorDataSourcesKubernetesDetails,aws_guard_duty_detector_data_sources_kubernetes_details\nAwsGuardDutyDetectorDataSourcesMalwareProtectionDetails,aws_guard_duty_detector_data_sources_malware_protection_details\nAwsGuardDutyDetectorDataSourcesMalwareProtectionScanEc2InstanceWithFindingsDetails,aws_guard_duty_detector_data_sources_malware_protection_scan_ec2_instance_with_findings_details\nAwsGuardDutyDetectorDataSourcesMalwareProtectionScanEc2InstanceWithFindingsEbsVolumesDetails,aws_guard_duty_detector_data_sources_malware_protection_scan_ec2_instance_with_findings_ebs_volumes_details\nAwsGuardDutyDetectorDataSourcesS3LogsDetails,aws_guard_duty_detector_data_sources_s3_logs_details\nAwsGuardDutyDetectorDetails,aws_guard_duty_detector_details\nAwsGuardDutyDetectorFeaturesDetails,aws_guard_duty_detector_features_details\nAwsHardwareCertificate,aws_hardware_certificate\nAwsIamAccessKey,aws_iam_access_key\nAwsIamAccessKeyDetails,aws_iam_access_key_details\nAwsIamAccessKeySessionContext,aws_iam_access_key_session_context\nAwsIamAccessKeySessionContextAttributes,aws_iam_access_key_session_context_attributes\nAwsIamAccessKeySessionContextSessionIssuer,aws_iam_access_key_session_context_session_issuer\nAwsIamAttachedManagedPolicy,aws_iam_attached_managed_policy\nAwsIamConfig,aws_iam_config\nAwsIamGroup,aws_iam_group\nAwsIamGroupDetails,aws_iam_group_details\nAwsIamGroupPolicy,aws_iam_group_policy\nAwsIamInstanceProfile,aws_iam_instance_profile\nAwsIamInstanceProfileRole,aws_iam_instance_profile_role\nAwsIamPermissionsBoundary,aws_iam_permissions_boundary\nAwsIamPolicy,aws_iam_policy\nAwsIamPolicyDetails,aws_iam_policy_details\nAwsIamPolicyVersion,aws_iam_policy_version\nAwsIamRole,aws_iam_role\nAwsIamRoleDetails,aws_iam_role_details\nAwsIamRolePolicy,aws_iam_role_policy\nAwsIamUser,aws_iam_user\nAwsIamUserDetails,aws_iam_user_details\nAwsIamUserPolicy,aws_iam_user_policy\nAwsIdentity,aws_identity\nAwsIotAnalyticsParameters,aws_iot_analytics_parameters\nAwsJobAbortConfig,aws_job_abort_config\nAwsJobAbortCriteria,aws_job_abort_criteria\nAwsJobExecutionsRolloutConfig,aws_job_executions_rollout_config\nAwsJobExponentialRolloutRate,aws_job_exponential_rollout_rate\nAwsJobPresignedUrlConfig,aws_job_presigned_url_config\nAwsJobRateIncreaseCriteria,aws_job_rate_increase_criteria\nAwsJobTimeoutConfig,aws_job_timeout_config\nAwsKinesisStream,aws_kinesis_stream\nAwsKinesisStreamDetails,aws_kinesis_stream_details\nAwsKinesisStreamStreamEncryptionDetails,aws_kinesis_stream_stream_encryption_details\nAwsKmsKey,aws_kms_key\nAwsKmsKeyArn,aws_kms_key_arn\nAwsKmsKeyDetails,aws_kms_key_details\nAwsKmsKeyId,aws_kms_key_id\nAwsLambdaFunction,aws_lambda_function\nAwsLambdaFunctionCode,aws_lambda_function_code\nAwsLambdaFunctionDeadLetterConfig,aws_lambda_function_dead_letter_config\nAwsLambdaFunctionDetails,aws_lambda_function_details\nAwsLambdaFunctionEnvironment,aws_lambda_function_environment\nAwsLambdaFunctionEnvironmentError,aws_lambda_function_environment_error\nAwsLambdaFunctionLayer,aws_lambda_function_layer\nAwsLambdaFunctionTracingConfig,aws_lambda_function_tracing_config\nAwsLambdaFunctionVpcConfig,aws_lambda_function_vpc_config\nAwsLambdaLayerVersion,aws_lambda_layer_version\nAwsLambdaLayerVersionDetails,aws_lambda_layer_version_details\nAwsLambdaTransformation,aws_lambda_transformation\nAwsLogSourceConfiguration,aws_log_source_configuration\nAwsLogSourceResource,aws_log_source_resource\nAwsManaged,aws_managed\nAwsManagedHumanLoopRequestSource,aws_managed_human_loop_request_source\nAwsManagedResources,aws_managed_resources\nAwsMountPoint,aws_mount_point\nAwsNetworkFirewallFirewall,aws_network_firewall_firewall\nAwsNetworkFirewallFirewallDetails,aws_network_firewall_firewall_details\nAwsNetworkFirewallFirewallPolicy,aws_network_firewall_firewall_policy\nAwsNetworkFirewallFirewallPolicyDetails,aws_network_firewall_firewall_policy_details\nAwsNetworkFirewallFirewallSubnetMappingsDetails,aws_network_firewall_firewall_subnet_mappings_details\nAwsNetworkFirewallRuleGroup,aws_network_firewall_rule_group\nAwsNetworkFirewallRuleGroupDetails,aws_network_firewall_rule_group_details\nAwsOpenSearchServiceDomain,aws_open_search_service_domain\nAwsOpenSearchServiceDomainAdvancedSecurityOptionsDetails,aws_open_search_service_domain_advanced_security_options_details\nAwsOpenSearchServiceDomainClusterConfigDetails,aws_open_search_service_domain_cluster_config_details\nAwsOpenSearchServiceDomainClusterConfigZoneAwarenessConfigDetails,aws_open_search_service_domain_cluster_config_zone_awareness_config_details\nAwsOpenSearchServiceDomainDetails,aws_open_search_service_domain_details\nAwsOpenSearchServiceDomainDomainEndpointOptionsDetails,aws_open_search_service_domain_domain_endpoint_options_details\nAwsOpenSearchServiceDomainEncryptionAtRestOptionsDetails,aws_open_search_service_domain_encryption_at_rest_options_details\nAwsOpenSearchServiceDomainLogPublishingOption,aws_open_search_service_domain_log_publishing_option\nAwsOpenSearchServiceDomainLogPublishingOptionsDetails,aws_open_search_service_domain_log_publishing_options_details\nAwsOpenSearchServiceDomainMasterUserOptionsDetails,aws_open_search_service_domain_master_user_options_details\nAwsOpenSearchServiceDomainNodeToNodeEncryptionOptionsDetails,aws_open_search_service_domain_node_to_node_encryption_options_details\nAwsOpenSearchServiceDomainServiceSoftwareOptionsDetails,aws_open_search_service_domain_service_software_options_details\nAwsOpenSearchServiceDomainVpcOptionsDetails,aws_open_search_service_domain_vpc_options_details\nAwsOrg,aws_org\nAwsOrganizationsSource,aws_organizations_source\nAwsRdsDbCluster,aws_rds_db_cluster\nAwsRdsDbClusterAssociatedRole,aws_rds_db_cluster_associated_role\nAwsRdsDbClusterDetails,aws_rds_db_cluster_details\nAwsRdsDbClusterMember,aws_rds_db_cluster_member\nAwsRdsDbClusterOptionGroupMembership,aws_rds_db_cluster_option_group_membership\nAwsRdsDbClusterSnapshot,aws_rds_db_cluster_snapshot\nAwsRdsDbClusterSnapshotDbClusterSnapshotAttribute,aws_rds_db_cluster_snapshot_db_cluster_snapshot_attribute\nAwsRdsDbClusterSnapshotDetails,aws_rds_db_cluster_snapshot_details\nAwsRdsDbDomainMembership,aws_rds_db_domain_membership\nAwsRdsDbInstance,aws_rds_db_instance\nAwsRdsDbInstanceAssociatedRole,aws_rds_db_instance_associated_role\nAwsRdsDbInstanceDetails,aws_rds_db_instance_details\nAwsRdsDbInstanceEndpoint,aws_rds_db_instance_endpoint\nAwsRdsDbInstanceVpcSecurityGroup,aws_rds_db_instance_vpc_security_group\nAwsRdsDbOptionGroupMembership,aws_rds_db_option_group_membership\nAwsRdsDbParameterGroup,aws_rds_db_parameter_group\nAwsRdsDbPendingModifiedValues,aws_rds_db_pending_modified_values\nAwsRdsDbProcessorFeature,aws_rds_db_processor_feature\nAwsRdsDbSecurityGroup,aws_rds_db_security_group\nAwsRdsDbSecurityGroupDetails,aws_rds_db_security_group_details\nAwsRdsDbSecurityGroupEc2SecurityGroup,aws_rds_db_security_group_ec2_security_group\nAwsRdsDbSecurityGroupIpRange,aws_rds_db_security_group_ip_range\nAwsRdsDbSnapshot,aws_rds_db_snapshot\nAwsRdsDbSnapshotDetails,aws_rds_db_snapshot_details\nAwsRdsDbStatusInfo,aws_rds_db_status_info\nAwsRdsDbSubnetGroup,aws_rds_db_subnet_group\nAwsRdsDbSubnetGroupSubnet,aws_rds_db_subnet_group_subnet\nAwsRdsDbSubnetGroupSubnetAvailabilityZone,aws_rds_db_subnet_group_subnet_availability_zone\nAwsRdsEventSubscription,aws_rds_event_subscription\nAwsRdsEventSubscriptionDetails,aws_rds_event_subscription_details\nAwsRdsPendingCloudWatchLogsExports,aws_rds_pending_cloud_watch_logs_exports\nAwsRedshiftCluster,aws_redshift_cluster\nAwsRedshiftClusterClusterNode,aws_redshift_cluster_cluster_node\nAwsRedshiftClusterClusterParameterGroup,aws_redshift_cluster_cluster_parameter_group\nAwsRedshiftClusterClusterParameterStatus,aws_redshift_cluster_cluster_parameter_status\nAwsRedshiftClusterClusterSecurityGroup,aws_redshift_cluster_cluster_security_group\nAwsRedshiftClusterClusterSnapshotCopyStatus,aws_redshift_cluster_cluster_snapshot_copy_status\nAwsRedshiftClusterDeferredMaintenanceWindow,aws_redshift_cluster_deferred_maintenance_window\nAwsRedshiftClusterDetails,aws_redshift_cluster_details\nAwsRedshiftClusterElasticIpStatus,aws_redshift_cluster_elastic_ip_status\nAwsRedshiftClusterEndpoint,aws_redshift_cluster_endpoint\nAwsRedshiftClusterHsmStatus,aws_redshift_cluster_hsm_status\nAwsRedshiftClusterIamRole,aws_redshift_cluster_iam_role\nAwsRedshiftClusterLoggingStatus,aws_redshift_cluster_logging_status\nAwsRedshiftClusterPendingModifiedValues,aws_redshift_cluster_pending_modified_values\nAwsRedshiftClusterResizeInfo,aws_redshift_cluster_resize_info\nAwsRedshiftClusterRestoreStatus,aws_redshift_cluster_restore_status\nAwsRedshiftClusterVpcSecurityGroup,aws_redshift_cluster_vpc_security_group\nAwsRegion,aws_region\nAwsRegions,aws_regions\nAwsS3AccountPublicAccessBlock,aws_s3_account_public_access_block\nAwsS3AccountPublicAccessBlockDetails,aws_s3_account_public_access_block_details\nAwsS3Bucket,aws_s3_bucket\nAwsS3BucketBucketLifecycleConfigurationDetails,aws_s3_bucket_bucket_lifecycle_configuration_details\nAwsS3BucketBucketLifecycleConfigurationRulesAbortIncompleteMultipartUploadDetails,aws_s3_bucket_bucket_lifecycle_configuration_rules_abort_incomplete_multipart_upload_details\nAwsS3BucketBucketLifecycleConfigurationRulesDetails,aws_s3_bucket_bucket_lifecycle_configuration_rules_details\nAwsS3BucketBucketLifecycleConfigurationRulesFilterDetails,aws_s3_bucket_bucket_lifecycle_configuration_rules_filter_details\nAwsS3BucketBucketLifecycleConfigurationRulesFilterPredicateDetails,aws_s3_bucket_bucket_lifecycle_configuration_rules_filter_predicate_details\nAwsS3BucketBucketLifecycleConfigurationRulesFilterPredicateOperandsDetails,aws_s3_bucket_bucket_lifecycle_configuration_rules_filter_predicate_operands_details\nAwsS3BucketBucketLifecycleConfigurationRulesFilterPredicateOperandsTagDetails,aws_s3_bucket_bucket_lifecycle_configuration_rules_filter_predicate_operands_tag_details\nAwsS3BucketBucketLifecycleConfigurationRulesFilterPredicateTagDetails,aws_s3_bucket_bucket_lifecycle_configuration_rules_filter_predicate_tag_details\nAwsS3BucketBucketLifecycleConfigurationRulesNoncurrentVersionTransitionsDetails,aws_s3_bucket_bucket_lifecycle_configuration_rules_noncurrent_version_transitions_details\nAwsS3BucketBucketLifecycleConfigurationRulesTransitionsDetails,aws_s3_bucket_bucket_lifecycle_configuration_rules_transitions_details\nAwsS3BucketBucketVersioningConfiguration,aws_s3_bucket_bucket_versioning_configuration\nAwsS3BucketDetails,aws_s3_bucket_details\nAwsS3BucketLoggingConfiguration,aws_s3_bucket_logging_configuration\nAwsS3BucketNotificationConfiguration,aws_s3_bucket_notification_configuration\nAwsS3BucketNotificationConfigurationDetail,aws_s3_bucket_notification_configuration_detail\nAwsS3BucketNotificationConfigurationFilter,aws_s3_bucket_notification_configuration_filter\nAwsS3BucketNotificationConfigurationS3KeyFilter,aws_s3_bucket_notification_configuration_s3_key_filter\nAwsS3BucketNotificationConfigurationS3KeyFilterRule,aws_s3_bucket_notification_configuration_s3_key_filter_rule\nAwsS3BucketObjectLockConfiguration,aws_s3_bucket_object_lock_configuration\nAwsS3BucketObjectLockConfigurationRuleDefaultRetentionDetails,aws_s3_bucket_object_lock_configuration_rule_default_retention_details\nAwsS3BucketObjectLockConfigurationRuleDetails,aws_s3_bucket_object_lock_configuration_rule_details\nAwsS3BucketServerSideEncryptionByDefault,aws_s3_bucket_server_side_encryption_by_default\nAwsS3BucketServerSideEncryptionConfiguration,aws_s3_bucket_server_side_encryption_configuration\nAwsS3BucketServerSideEncryptionRule,aws_s3_bucket_server_side_encryption_rule\nAwsS3BucketWebsiteConfiguration,aws_s3_bucket_website_configuration\nAwsS3BucketWebsiteConfigurationRedirectTo,aws_s3_bucket_website_configuration_redirect_to\nAwsS3BucketWebsiteConfigurationRoutingRule,aws_s3_bucket_website_configuration_routing_rule\nAwsS3BucketWebsiteConfigurationRoutingRuleCondition,aws_s3_bucket_website_configuration_routing_rule_condition\nAwsS3BucketWebsiteConfigurationRoutingRuleRedirect,aws_s3_bucket_website_configuration_routing_rule_redirect\nAwsS3Object,aws_s3_object\nAwsS3ObjectDetails,aws_s3_object_details\nAwsSageMakerNotebookInstance,aws_sage_maker_notebook_instance\nAwsSageMakerNotebookInstanceDetails,aws_sage_maker_notebook_instance_details\nAwsSageMakerNotebookInstanceMetadataServiceConfigurationDetails,aws_sage_maker_notebook_instance_metadata_service_configuration_details\nAwsSecretsManagerSecret,aws_secrets_manager_secret\nAwsSecretsManagerSecretDetails,aws_secrets_manager_secret_details\nAwsSecretsManagerSecretRotationRules,aws_secrets_manager_secret_rotation_rules\nAwsSecurityFinding,aws_security_finding\nAwsSecurityFindingFilters,aws_security_finding_filters\nAwsSecurityFindingIdentifier,aws_security_finding_identifier\nAwsService,aws_service\nAwsSnsTopic,aws_sns_topic\nAwsSnsTopicDetails,aws_sns_topic_details\nAwsSnsTopicSubscription,aws_sns_topic_subscription\nAwsSqsQueue,aws_sqs_queue\nAwsSqsQueueDetails,aws_sqs_queue_details\nAwsSsmComplianceSummary,aws_ssm_compliance_summary\nAwsSsmPatch,aws_ssm_patch\nAwsSsmPatchCompliance,aws_ssm_patch_compliance\nAwsSsmPatchComplianceDetails,aws_ssm_patch_compliance_details\nAwsSsoAuthentication,aws_sso_authentication\nAwsStepFunctionStateMachine,aws_step_function_state_machine\nAwsStepFunctionStateMachineDetails,aws_step_function_state_machine_details\nAwsStepFunctionStateMachineLoggingConfigurationDestinationsCloudWatchLogsLogGroupDetails,aws_step_function_state_machine_logging_configuration_destinations_cloud_watch_logs_log_group_details\nAwsStepFunctionStateMachineLoggingConfigurationDestinationsDetails,aws_step_function_state_machine_logging_configuration_destinations_details\nAwsStepFunctionStateMachineLoggingConfigurationDetails,aws_step_function_state_machine_logging_configuration_details\nAwsStepFunctionStateMachineTracingConfigurationDetails,aws_step_function_state_machine_tracing_configuration_details\nAwsTagKey,aws_tag_key\nAwsTagValue,aws_tag_value\nAwsUserPoolsId,aws_user_pools_id\nAwsUserPoolsWebClientId,aws_user_pools_web_client_id\nAwsVPCSecurityGroupViolation,aws_vpc_security_group_violation\nAwsVpcConfiguration,aws_vpc_configuration\nAwsWafRateBasedRule,aws_waf_rate_based_rule\nAwsWafRateBasedRuleDetails,aws_waf_rate_based_rule_details\nAwsWafRateBasedRuleMatchPredicate,aws_waf_rate_based_rule_match_predicate\nAwsWafRegionalRateBasedRule,aws_waf_regional_rate_based_rule\nAwsWafRegionalRateBasedRuleDetails,aws_waf_regional_rate_based_rule_details\nAwsWafRegionalRateBasedRuleMatchPredicate,aws_waf_regional_rate_based_rule_match_predicate\nAwsWafRegionalRule,aws_waf_regional_rule\nAwsWafRegionalRuleDetails,aws_waf_regional_rule_details\nAwsWafRegionalRuleGroup,aws_waf_regional_rule_group\nAwsWafRegionalRuleGroupDetails,aws_waf_regional_rule_group_details\nAwsWafRegionalRuleGroupRulesActionDetails,aws_waf_regional_rule_group_rules_action_details\nAwsWafRegionalRuleGroupRulesDetails,aws_waf_regional_rule_group_rules_details\nAwsWafRegionalRulePredicateListDetails,aws_waf_regional_rule_predicate_list_details\nAwsWafRegionalWebAcl,aws_waf_regional_web_acl\nAwsWafRegionalWebAclDetails,aws_waf_regional_web_acl_details\nAwsWafRegionalWebAclRulesListActionDetails,aws_waf_regional_web_acl_rules_list_action_details\nAwsWafRegionalWebAclRulesListDetails,aws_waf_regional_web_acl_rules_list_details\nAwsWafRegionalWebAclRulesListOverrideActionDetails,aws_waf_regional_web_acl_rules_list_override_action_details\nAwsWafRule,aws_waf_rule\nAwsWafRuleDetails,aws_waf_rule_details\nAwsWafRuleGroup,aws_waf_rule_group\nAwsWafRuleGroupDetails,aws_waf_rule_group_details\nAwsWafRuleGroupRulesActionDetails,aws_waf_rule_group_rules_action_details\nAwsWafRuleGroupRulesDetails,aws_waf_rule_group_rules_details\nAwsWafRulePredicateListDetails,aws_waf_rule_predicate_list_details\nAwsWafWebAcl,aws_waf_web_acl\nAwsWafWebAclDetails,aws_waf_web_acl_details\nAwsWafWebAclRule,aws_waf_web_acl_rule\nAwsWafv2ActionAllowDetails,aws_wafv2_action_allow_details\nAwsWafv2ActionBlockDetails,aws_wafv2_action_block_details\nAwsWafv2CustomHttpHeader,aws_wafv2_custom_http_header\nAwsWafv2CustomRequestHandlingDetails,aws_wafv2_custom_request_handling_details\nAwsWafv2CustomResponseDetails,aws_wafv2_custom_response_details\nAwsWafv2RuleGroup,aws_wafv2_rule_group\nAwsWafv2RuleGroupDetails,aws_wafv2_rule_group_details\nAwsWafv2RulesActionCaptchaDetails,aws_wafv2_rules_action_captcha_details\nAwsWafv2RulesActionCountDetails,aws_wafv2_rules_action_count_details\nAwsWafv2RulesActionDetails,aws_wafv2_rules_action_details\nAwsWafv2RulesDetails,aws_wafv2_rules_details\nAwsWafv2VisibilityConfigDetails,aws_wafv2_visibility_config_details\nAwsWafv2WebAcl,aws_wafv2_web_acl\nAwsWafv2WebAclActionDetails,aws_wafv2_web_acl_action_details\nAwsWafv2WebAclCaptchaConfigDetails,aws_wafv2_web_acl_captcha_config_details\nAwsWafv2WebAclCaptchaConfigImmunityTimePropertyDetails,aws_wafv2_web_acl_captcha_config_immunity_time_property_details\nAwsWafv2WebAclDetails,aws_wafv2_web_acl_details\nAwsXrayEncryptionConfig,aws_xray_encryption_config\nAwsXrayEncryptionConfigDetails,aws_xray_encryption_config_details\nAxesRangeScale,axes_range_scale\nAxisBinding,axis_binding\nAxisDataOptions,axis_data_options\nAxisDisplayMinMaxRange,axis_display_min_max_range\nAxisDisplayOptions,axis_display_options\nAxisDisplayRange,axis_display_range\nAxisLabelOptions,axis_label_options\nAxisLabelReferenceOptions,axis_label_reference_options\nAxisLineVisibility,axis_line_visibility\nAxisLinearScale,axis_linear_scale\nAxisLogarithmicScale,axis_logarithmic_scale\nAxisOffset,axis_offset\nAxisOptions,axis_options\nAxisScale,axis_scale\nAxisTickLabelOptions,axis_tick_label_options\nAzureBlobSasConfiguration,azure_blob_sas_configuration\nB,b\nBGPPeer,bgp_peer\nBS,bs\nBabelfishDatabaseName,babelfish_database_name\nBackTestAnomalyDetectorRequest,back_test_anomaly_detector_request\nBackTestConfiguration,back_test_configuration\nBackTestWindowOffset,back_test_window_offset\nBackendAPIAppSyncAuthSettings,backend_api_app_sync_auth_settings\nBackendAPIAuthType,backend_api_auth_type\nBackendAPIConflictResolution,backend_api_conflict_resolution\nBackendAPIResourceConfig,backend_api_resource_config\nBackendAuthAppleProviderConfig,backend_auth_apple_provider_config\nBackendAuthSocialProviderConfig,backend_auth_social_provider_config\nBackendConnectionErrors,backend_connection_errors\nBackendDefaults,backend_defaults\nBackendEnvironment,backend_environment\nBackendEnvironmentList,backend_environment_list\nBackendEnvironmentName,backend_environment_name\nBackendJobRespObj,backend_job_resp_obj\nBackendManagerAppId,backend_manager_app_id\nBackendServerDescription,backend_server_description\nBackendServerDescriptions,backend_server_descriptions\nBackendStoragePermissions,backend_storage_permissions\nBackfillError,backfill_error\nBackfillErrors,backfill_errors\nBackfillMode,backfill_mode\nBackfilling,backfilling\nBackground,background\nBackgroundColor,background_color\nBackgroundOpacity,background_opacity\nBackgroundStyle,background_style\nBackgroundVisibility,background_visibility\nBackint,backint\nBackintConfig,backint_config\nBackintMode,backint_mode\nBacktestResults,backtest_results\nBacktrackConsumedChangeRecords,backtrack_consumed_change_records\nBacktrackDBClusterMessage,backtrack_db_cluster_message\nBacktrackIdentifier,backtrack_identifier\nBacktrackRequestCreationTime,backtrack_request_creation_time\nBacktrackTo,backtrack_to\nBacktrackWindow,backtrack_window\nBacktrackedFrom,backtracked_from\nBackup,backup\nBackupArn,backup_arn\nBackupBeingCopied,backup_being_copied\nBackupCreationDateTime,backup_creation_date_time\nBackupDescription,backup_description\nBackupDetails,backup_details\nBackupExpiryDateTime,backup_expiry_date_time\nBackupFailureDetails,backup_failure_details\nBackupId,backup_id\nBackupIds,backup_ids\nBackupInProgress,backup_in_progress\nBackupInUseException,backup_in_use_exception\nBackupJob,backup_job\nBackupJobId,backup_job_id\nBackupJobs,backup_jobs\nBackupName,backup_name\nBackupNotFound,backup_not_found\nBackupNotFoundException,backup_not_found_exception\nBackupObject,backup_object\nBackupOptions,backup_options\nBackupPlan,backup_plan\nBackupPlanArn,backup_plan_arn\nBackupPlanDocument,backup_plan_document\nBackupPlanId,backup_plan_id\nBackupPlanInput,backup_plan_input\nBackupPlanName,backup_plan_name\nBackupPlanRule,backup_plan_rule\nBackupPlanTags,backup_plan_tags\nBackupPlanTemplateId,backup_plan_template_id\nBackupPlanTemplateJson,backup_plan_template_json\nBackupPlanTemplateName,backup_plan_template_name\nBackupPlanTemplatesList,backup_plan_templates_list\nBackupPlanTemplatesListMember,backup_plan_templates_list_member\nBackupPlanVersion,backup_plan_version\nBackupPlanVersionsList,backup_plan_versions_list\nBackupPlansList,backup_plans_list\nBackupPlansListMember,backup_plans_list_member\nBackupPolicy,backup_policy\nBackupPolicyDescription,backup_policy_description\nBackupPolicyNotFoundFault,backup_policy_not_found_fault\nBackupProgressInMegaBytes,backup_progress_in_mega_bytes\nBackupRestoring,backup_restoring\nBackupRetentionCount,backup_retention_count\nBackupRetentionPeriod,backup_retention_period\nBackupRetentionPolicy,backup_retention_policy\nBackupRule,backup_rule\nBackupRuleId,backup_rule_id\nBackupRuleInput,backup_rule_input\nBackupSelection,backup_selection\nBackupSelectionsList,backup_selections_list\nBackupSelectionsListMember,backup_selections_list_member\nBackupSizeBytes,backup_size_bytes\nBackupSizeInBytes,backup_size_in_bytes\nBackupState,backup_state\nBackupStatus,backup_status\nBackupSummaries,backup_summaries\nBackupSummary,backup_summary\nBackupTarget,backup_target\nBackupType,backup_type\nBackupVaultAccountId,backup_vault_account_id\nBackupVaultArn,backup_vault_arn\nBackupVaultEvents,backup_vault_events\nBackupVaultList,backup_vault_list\nBackupVaultListMember,backup_vault_list_member\nBackupVaultName,backup_vault_name\nBackupVaultTags,backup_vault_tags\nBackups,backups\nBadDocumentException,bad_document_exception\nBadGatewayException,bad_gateway_exception\nBadRequest,bad_request\nBadRequestDetail,bad_request_detail\nBadRequestException,bad_request_exception\nBadge,badge\nBaidu,baidu\nBaiduChannelRequest,baidu_channel_request\nBaiduChannelResponse,baidu_channel_response\nBaiduMessage,baidu_message\nBalancingStrategy,balancing_strategy\nBandFilter,band_filter\nBandMathConfigInput,band_math_config_input\nBandName,band_name\nBandwidth,bandwidth\nBandwidthRateLimitInterval,bandwidth_rate_limit_interval\nBandwidthRateLimitIntervals,bandwidth_rate_limit_intervals\nBandwidthReductionFilter,bandwidth_reduction_filter\nBandwidthType,bandwidth_type\nBannerText,banner_text\nBarChartAggregatedFieldWells,bar_chart_aggregated_field_wells\nBarChartConfiguration,bar_chart_configuration\nBarChartFieldWells,bar_chart_field_wells\nBarChartSortConfiguration,bar_chart_sort_configuration\nBarChartVisual,bar_chart_visual\nBarDataLabels,bar_data_labels\nBarValues,bar_values\nBareMetal,bare_metal\nBarsArrangement,bars_arrangement\nBase,base\nBase32StringSeed,base32_string_seed\nBase64String,base64_string\nBaseCanaryRunId,base_canary_run_id\nBaseConfigurationItem,base_configuration_item\nBaseConfigurationItems,base_configuration_items\nBaseDirectory,base_directory\nBaseEndpointDnsNames,base_endpoint_dns_names\nBaseException,base_exception\nBaseImage,base_image\nBaseImageArn,base_image_arn\nBaseKpiResult,base_kpi_result\nBaseLat,base_lat\nBaseLensVersion,base_lens_version\nBaseLng,base_lng\nBaseMapStyle,base_map_style\nBaseModelName,base_model_name\nBasePath,base_path\nBasePathMapping,base_path_mapping\nBasePathMappings,base_path_mappings\nBasePathUpdate,base_path_update\nBaseScore,base_score\nBaseScreenshot,base_screenshot\nBaseScreenshots,base_screenshots\nBaseSeriesSettings,base_series_settings\nBaseStationId,base_station_id\nBaseThemeId,base_theme_id\nBaseUrl,base_url\nBaseUrlContent,base_url_content\nBaseUrlContent1,base_url_content1\nBaseUrlManifest,base_url_manifest\nBaseUrlManifest1,base_url_manifest1\nBaseVector,base_vector\nBasedOnSpiceSchedule,based_on_spice_schedule\nBaseline,baseline\nBaselineBandwidthInGbps,baseline_bandwidth_in_gbps\nBaselineBandwidthInMbps,baseline_bandwidth_in_mbps\nBaselineConfig,baseline_config\nBaselineData,baseline_data\nBaselineDescription,baseline_description\nBaselineEbsBandwidthMbps,baseline_ebs_bandwidth_mbps\nBaselineEbsBandwidthMbpsRequest,baseline_ebs_bandwidth_mbps_request\nBaselineId,baseline_id\nBaselineIdentities,baseline_identities\nBaselineIdentity,baseline_identity\nBaselineIops,baseline_iops\nBaselineMetric,baseline_metric\nBaselineMetrics,baseline_metrics\nBaselineName,baseline_name\nBaselineOverride,baseline_override\nBaselineThroughputInMBps,baseline_throughput_in_m_bps\nBaselineUsedForDriftCheckConstraints,baseline_used_for_drift_check_constraints\nBaselineUsedForDriftCheckStatistics,baseline_used_for_drift_check_statistics\nBaseliningJobName,baselining_job_name\nBasepath,basepath\nBasicAuthCredentials,basic_auth_credentials\nBasicAuthParameters,basic_auth_parameters\nBasicAuthSecretId,basic_auth_secret_id\nBasicAuthentication,basic_authentication\nBasicAuthenticationConfiguration,basic_authentication_configuration\nBasicCatalogTarget,basic_catalog_target\nBasicLayout,basic_layout\nBatch,batch\nBatchAcknowledgeAlarmRequest,batch_acknowledge_alarm_request\nBatchAcknowledgeAlarmResponse,batch_acknowledge_alarm_response\nBatchAddFacetToObject,batch_add_facet_to_object\nBatchAlarmActionErrorEntry,batch_alarm_action_error_entry\nBatchApplyUpdateActionMessage,batch_apply_update_action_message\nBatchArrayProperties,batch_array_properties\nBatchAssociateApprovalRuleTemplateWithRepositoriesError,batch_associate_approval_rule_template_with_repositories_error\nBatchAssociateApprovalRuleTemplateWithRepositoriesInput,batch_associate_approval_rule_template_with_repositories_input\nBatchAssociateApprovalRuleTemplateWithRepositoriesOutput,batch_associate_approval_rule_template_with_repositories_output\nBatchAssociateAssessmentReportEvidenceRequest,batch_associate_assessment_report_evidence_request\nBatchAssociateAssessmentReportEvidenceResponse,batch_associate_assessment_report_evidence_response\nBatchAssociateClientDeviceWithCoreDeviceRequest,batch_associate_client_device_with_core_device_request\nBatchAssociateClientDeviceWithCoreDeviceResponse,batch_associate_client_device_with_core_device_response\nBatchAssociateProjectAssetsRequest,batch_associate_project_assets_request\nBatchAssociateProjectAssetsResponse,batch_associate_project_assets_response\nBatchAssociateResourceRequest,batch_associate_resource_request\nBatchAssociateResourceResponse,batch_associate_resource_response\nBatchAssociateResourcesToCustomLineItemInput,batch_associate_resources_to_custom_line_item_input\nBatchAssociateResourcesToCustomLineItemOutput,batch_associate_resources_to_custom_line_item_output\nBatchAssociateScramSecretRequest,batch_associate_scram_secret_request\nBatchAssociateScramSecretResponse,batch_associate_scram_secret_response\nBatchAssociateServiceActionWithProvisioningArtifactInput,batch_associate_service_action_with_provisioning_artifact_input\nBatchAssociateServiceActionWithProvisioningArtifactOutput,batch_associate_service_action_with_provisioning_artifact_output\nBatchAssociateUserStackRequest,batch_associate_user_stack_request\nBatchAssociateUserStackResult,batch_associate_user_stack_result\nBatchAttachObject,batch_attach_object\nBatchAttachObjectResponse,batch_attach_object_response\nBatchAttachPolicy,batch_attach_policy\nBatchAttachToIndex,batch_attach_to_index\nBatchAttachToIndexResponse,batch_attach_to_index_response\nBatchAttachTypedLink,batch_attach_typed_link\nBatchAttachTypedLinkResponse,batch_attach_typed_link_response\nBatchChannelMemberships,batch_channel_memberships\nBatchCheckLayerAvailabilityRequest,batch_check_layer_availability_request\nBatchCheckLayerAvailabilityResponse,batch_check_layer_availability_response\nBatchContainerOverrides,batch_container_overrides\nBatchCount,batch_count\nBatchCreateAttendeeRequest,batch_create_attendee_request\nBatchCreateAttendeeResponse,batch_create_attendee_response\nBatchCreateChannelMembershipError,batch_create_channel_membership_error\nBatchCreateChannelMembershipRequest,batch_create_channel_membership_request\nBatchCreateChannelMembershipResponse,batch_create_channel_membership_response\nBatchCreateCustomVocabularyItemRequest,batch_create_custom_vocabulary_item_request\nBatchCreateCustomVocabularyItemResponse,batch_create_custom_vocabulary_item_response\nBatchCreateDelegationByAssessmentError,batch_create_delegation_by_assessment_error\nBatchCreateDelegationByAssessmentRequest,batch_create_delegation_by_assessment_request\nBatchCreateDelegationByAssessmentResponse,batch_create_delegation_by_assessment_response\nBatchCreateIndex,batch_create_index\nBatchCreateIndexResponse,batch_create_index_response\nBatchCreateObject,batch_create_object\nBatchCreateObjectResponse,batch_create_object_response\nBatchCreatePartitionRequest,batch_create_partition_request\nBatchCreatePartitionResponse,batch_create_partition_response\nBatchCreateRoomMembershipRequest,batch_create_room_membership_request\nBatchCreateRoomMembershipResponse,batch_create_room_membership_response\nBatchCreateRumMetricDefinitionsError,batch_create_rum_metric_definitions_error\nBatchCreateRumMetricDefinitionsRequest,batch_create_rum_metric_definitions_request\nBatchCreateRumMetricDefinitionsResponse,batch_create_rum_metric_definitions_response\nBatchCreateTableRowsRequest,batch_create_table_rows_request\nBatchCreateTableRowsResult,batch_create_table_rows_result\nBatchCreateVariableError,batch_create_variable_error\nBatchCreateVariableRequest,batch_create_variable_request\nBatchCreateVariableResult,batch_create_variable_result\nBatchCreateVehicleRequest,batch_create_vehicle_request\nBatchCreateVehicleResponse,batch_create_vehicle_response\nBatchDataCaptureConfig,batch_data_capture_config\nBatchDeleteAutomationRulesRequest,batch_delete_automation_rules_request\nBatchDeleteAutomationRulesResponse,batch_delete_automation_rules_response\nBatchDeleteBuildsInput,batch_delete_builds_input\nBatchDeleteBuildsOutput,batch_delete_builds_output\nBatchDeleteClusterSnapshotsRequest,batch_delete_cluster_snapshots_request\nBatchDeleteClusterSnapshotsResult,batch_delete_cluster_snapshots_result\nBatchDeleteConnectionRequest,batch_delete_connection_request\nBatchDeleteConnectionResponse,batch_delete_connection_response\nBatchDeleteCustomVocabularyItemRequest,batch_delete_custom_vocabulary_item_request\nBatchDeleteCustomVocabularyItemResponse,batch_delete_custom_vocabulary_item_response\nBatchDeleteDelegationByAssessmentError,batch_delete_delegation_by_assessment_error\nBatchDeleteDelegationByAssessmentRequest,batch_delete_delegation_by_assessment_request\nBatchDeleteDelegationByAssessmentResponse,batch_delete_delegation_by_assessment_response\nBatchDeleteDetectorErrorEntry,batch_delete_detector_error_entry\nBatchDeleteDetectorRequest,batch_delete_detector_request\nBatchDeleteDetectorResponse,batch_delete_detector_response\nBatchDeleteDevicePositionHistoryError,batch_delete_device_position_history_error\nBatchDeleteDevicePositionHistoryRequest,batch_delete_device_position_history_request\nBatchDeleteDevicePositionHistoryResponse,batch_delete_device_position_history_response\nBatchDeleteDocumentRequest,batch_delete_document_request\nBatchDeleteDocumentResponse,batch_delete_document_response\nBatchDeleteDocumentResponseFailedDocument,batch_delete_document_response_failed_document\nBatchDeleteFeaturedResultsSetError,batch_delete_featured_results_set_error\nBatchDeleteFeaturedResultsSetRequest,batch_delete_featured_results_set_request\nBatchDeleteFeaturedResultsSetResponse,batch_delete_featured_results_set_response\nBatchDeleteGeofenceError,batch_delete_geofence_error\nBatchDeleteGeofenceRequest,batch_delete_geofence_request\nBatchDeleteGeofenceResponse,batch_delete_geofence_response\nBatchDeleteImageRequest,batch_delete_image_request\nBatchDeleteImageResponse,batch_delete_image_response\nBatchDeleteImportDataError,batch_delete_import_data_error\nBatchDeleteImportDataRequest,batch_delete_import_data_request\nBatchDeleteImportDataResponse,batch_delete_import_data_response\nBatchDeleteObject,batch_delete_object\nBatchDeletePartitionRequest,batch_delete_partition_request\nBatchDeletePartitionResponse,batch_delete_partition_response\nBatchDeletePhoneNumberRequest,batch_delete_phone_number_request\nBatchDeletePhoneNumberResponse,batch_delete_phone_number_response\nBatchDeleteReadSetRequest,batch_delete_read_set_request\nBatchDeleteReadSetResponse,batch_delete_read_set_response\nBatchDeleteRecipeVersionRequest,batch_delete_recipe_version_request\nBatchDeleteRecipeVersionResponse,batch_delete_recipe_version_response\nBatchDeleteRequest,batch_delete_request\nBatchDeleteRequestSizeExceededFault,batch_delete_request_size_exceeded_fault\nBatchDeleteResponse,batch_delete_response\nBatchDeleteRumMetricDefinitionsError,batch_delete_rum_metric_definitions_error\nBatchDeleteRumMetricDefinitionsRequest,batch_delete_rum_metric_definitions_request\nBatchDeleteRumMetricDefinitionsResponse,batch_delete_rum_metric_definitions_response\nBatchDeleteScheduledActionAnswer,batch_delete_scheduled_action_answer\nBatchDeleteScheduledActionType,batch_delete_scheduled_action_type\nBatchDeleteTableRequest,batch_delete_table_request\nBatchDeleteTableResponse,batch_delete_table_response\nBatchDeleteTableRowsRequest,batch_delete_table_rows_request\nBatchDeleteTableRowsResult,batch_delete_table_rows_result\nBatchDeleteTableVersionRequest,batch_delete_table_version_request\nBatchDeleteTableVersionResponse,batch_delete_table_version_response\nBatchDeleteWorldsRequest,batch_delete_worlds_request\nBatchDeleteWorldsResponse,batch_delete_worlds_response\nBatchDescribeMergeConflictsError,batch_describe_merge_conflicts_error\nBatchDescribeMergeConflictsInput,batch_describe_merge_conflicts_input\nBatchDescribeMergeConflictsOutput,batch_describe_merge_conflicts_output\nBatchDescribeModelPackageError,batch_describe_model_package_error\nBatchDescribeModelPackageErrorMap,batch_describe_model_package_error_map\nBatchDescribeModelPackageInput,batch_describe_model_package_input\nBatchDescribeModelPackageOutput,batch_describe_model_package_output\nBatchDescribeModelPackageSummary,batch_describe_model_package_summary\nBatchDescribeSimulationJobRequest,batch_describe_simulation_job_request\nBatchDescribeSimulationJobResponse,batch_describe_simulation_job_response\nBatchDescribeTypeConfigurationsError,batch_describe_type_configurations_error\nBatchDescribeTypeConfigurationsInput,batch_describe_type_configurations_input\nBatchDescribeTypeConfigurationsOutput,batch_describe_type_configurations_output\nBatchDetachFromIndex,batch_detach_from_index\nBatchDetachFromIndexResponse,batch_detach_from_index_response\nBatchDetachObject,batch_detach_object\nBatchDetachObjectResponse,batch_detach_object_response\nBatchDetachPolicy,batch_detach_policy\nBatchDetachTypedLink,batch_detach_typed_link\nBatchDetectDominantLanguageItemResult,batch_detect_dominant_language_item_result\nBatchDetectDominantLanguageRequest,batch_detect_dominant_language_request\nBatchDetectDominantLanguageResponse,batch_detect_dominant_language_response\nBatchDetectEntitiesItemResult,batch_detect_entities_item_result\nBatchDetectEntitiesRequest,batch_detect_entities_request\nBatchDetectEntitiesResponse,batch_detect_entities_response\nBatchDetectKeyPhrasesItemResult,batch_detect_key_phrases_item_result\nBatchDetectKeyPhrasesRequest,batch_detect_key_phrases_request\nBatchDetectKeyPhrasesResponse,batch_detect_key_phrases_response\nBatchDetectSentimentItemResult,batch_detect_sentiment_item_result\nBatchDetectSentimentRequest,batch_detect_sentiment_request\nBatchDetectSentimentResponse,batch_detect_sentiment_response\nBatchDetectSyntaxItemResult,batch_detect_syntax_item_result\nBatchDetectSyntaxRequest,batch_detect_syntax_request\nBatchDetectSyntaxResponse,batch_detect_syntax_response\nBatchDetectTargetedSentimentItemResult,batch_detect_targeted_sentiment_item_result\nBatchDetectTargetedSentimentRequest,batch_detect_targeted_sentiment_request\nBatchDetectTargetedSentimentResponse,batch_detect_targeted_sentiment_response\nBatchDisableAlarmRequest,batch_disable_alarm_request\nBatchDisableAlarmResponse,batch_disable_alarm_response\nBatchDisableStandardsRequest,batch_disable_standards_request\nBatchDisableStandardsResponse,batch_disable_standards_response\nBatchDisassociateApprovalRuleTemplateFromRepositoriesError,batch_disassociate_approval_rule_template_from_repositories_error\nBatchDisassociateApprovalRuleTemplateFromRepositoriesInput,batch_disassociate_approval_rule_template_from_repositories_input\nBatchDisassociateApprovalRuleTemplateFromRepositoriesOutput,batch_disassociate_approval_rule_template_from_repositories_output\nBatchDisassociateAssessmentReportEvidenceRequest,batch_disassociate_assessment_report_evidence_request\nBatchDisassociateAssessmentReportEvidenceResponse,batch_disassociate_assessment_report_evidence_response\nBatchDisassociateClientDeviceFromCoreDeviceRequest,batch_disassociate_client_device_from_core_device_request\nBatchDisassociateClientDeviceFromCoreDeviceResponse,batch_disassociate_client_device_from_core_device_response\nBatchDisassociateProjectAssetsRequest,batch_disassociate_project_assets_request\nBatchDisassociateProjectAssetsResponse,batch_disassociate_project_assets_response\nBatchDisassociateResourceRequest,batch_disassociate_resource_request\nBatchDisassociateResourceResponse,batch_disassociate_resource_response\nBatchDisassociateResourcesFromCustomLineItemInput,batch_disassociate_resources_from_custom_line_item_input\nBatchDisassociateResourcesFromCustomLineItemOutput,batch_disassociate_resources_from_custom_line_item_output\nBatchDisassociateScramSecretRequest,batch_disassociate_scram_secret_request\nBatchDisassociateScramSecretResponse,batch_disassociate_scram_secret_response\nBatchDisassociateServiceActionFromProvisioningArtifactInput,batch_disassociate_service_action_from_provisioning_artifact_input\nBatchDisassociateServiceActionFromProvisioningArtifactOutput,batch_disassociate_service_action_from_provisioning_artifact_output\nBatchDisassociateUserStackRequest,batch_disassociate_user_stack_request\nBatchDisassociateUserStackResult,batch_disassociate_user_stack_result\nBatchEnableAlarmRequest,batch_enable_alarm_request\nBatchEnableAlarmResponse,batch_enable_alarm_response\nBatchEnableStandardsRequest,batch_enable_standards_request\nBatchEnableStandardsResponse,batch_enable_standards_response\nBatchEntryIdsNotDistinctException,batch_entry_ids_not_distinct_exception\nBatchEnvironmentVariable,batch_environment_variable\nBatchError,batch_error\nBatchEvaluateFeatureRequest,batch_evaluate_feature_request\nBatchEvaluateFeatureResponse,batch_evaluate_feature_response\nBatchEvaluateGeofencesError,batch_evaluate_geofences_error\nBatchEvaluateGeofencesRequest,batch_evaluate_geofences_request\nBatchEvaluateGeofencesResponse,batch_evaluate_geofences_response\nBatchExecuteStatementException,batch_execute_statement_exception\nBatchExecuteStatementInput,batch_execute_statement_input\nBatchExecuteStatementOutput,batch_execute_statement_output\nBatchExecuteStatementRequest,batch_execute_statement_request\nBatchExecuteStatementResponse,batch_execute_statement_response\nBatchFailedResultModel,batch_failed_result_model\nBatchGetAccountStatusRequest,batch_get_account_status_request\nBatchGetAccountStatusResponse,batch_get_account_status_response\nBatchGetAggregateResourceConfigRequest,batch_get_aggregate_resource_config_request\nBatchGetAggregateResourceConfigResponse,batch_get_aggregate_resource_config_response\nBatchGetApplicationRevisionsInput,batch_get_application_revisions_input\nBatchGetApplicationRevisionsOutput,batch_get_application_revisions_output\nBatchGetApplicationsInput,batch_get_applications_input\nBatchGetApplicationsOutput,batch_get_applications_output\nBatchGetAssetPropertyAggregatesEntry,batch_get_asset_property_aggregates_entry\nBatchGetAssetPropertyAggregatesErrorEntry,batch_get_asset_property_aggregates_error_entry\nBatchGetAssetPropertyAggregatesErrorInfo,batch_get_asset_property_aggregates_error_info\nBatchGetAssetPropertyAggregatesRequest,batch_get_asset_property_aggregates_request\nBatchGetAssetPropertyAggregatesResponse,batch_get_asset_property_aggregates_response\nBatchGetAssetPropertyAggregatesSkippedEntry,batch_get_asset_property_aggregates_skipped_entry\nBatchGetAssetPropertyAggregatesSuccessEntry,batch_get_asset_property_aggregates_success_entry\nBatchGetAssetPropertyValueEntry,batch_get_asset_property_value_entry\nBatchGetAssetPropertyValueErrorEntry,batch_get_asset_property_value_error_entry\nBatchGetAssetPropertyValueErrorInfo,batch_get_asset_property_value_error_info\nBatchGetAssetPropertyValueHistoryEntry,batch_get_asset_property_value_history_entry\nBatchGetAssetPropertyValueHistoryErrorEntry,batch_get_asset_property_value_history_error_entry\nBatchGetAssetPropertyValueHistoryErrorInfo,batch_get_asset_property_value_history_error_info\nBatchGetAssetPropertyValueHistoryRequest,batch_get_asset_property_value_history_request\nBatchGetAssetPropertyValueHistoryResponse,batch_get_asset_property_value_history_response\nBatchGetAssetPropertyValueHistorySkippedEntry,batch_get_asset_property_value_history_skipped_entry\nBatchGetAssetPropertyValueHistorySuccessEntry,batch_get_asset_property_value_history_success_entry\nBatchGetAssetPropertyValueRequest,batch_get_asset_property_value_request\nBatchGetAssetPropertyValueResponse,batch_get_asset_property_value_response\nBatchGetAssetPropertyValueSkippedEntry,batch_get_asset_property_value_skipped_entry\nBatchGetAssetPropertyValueSuccessEntry,batch_get_asset_property_value_success_entry\nBatchGetAutomationRulesRequest,batch_get_automation_rules_request\nBatchGetAutomationRulesResponse,batch_get_automation_rules_response\nBatchGetBlueprintsRequest,batch_get_blueprints_request\nBatchGetBlueprintsResponse,batch_get_blueprints_response\nBatchGetBuildBatchesInput,batch_get_build_batches_input\nBatchGetBuildBatchesOutput,batch_get_build_batches_output\nBatchGetBuildsInput,batch_get_builds_input\nBatchGetBuildsOutput,batch_get_builds_output\nBatchGetChannelRequest,batch_get_channel_request\nBatchGetChannelResponse,batch_get_channel_response\nBatchGetCodeSnippetRequest,batch_get_code_snippet_request\nBatchGetCodeSnippetResponse,batch_get_code_snippet_response\nBatchGetCollaborationAnalysisTemplateError,batch_get_collaboration_analysis_template_error\nBatchGetCollaborationAnalysisTemplateInput,batch_get_collaboration_analysis_template_input\nBatchGetCollaborationAnalysisTemplateOutput,batch_get_collaboration_analysis_template_output\nBatchGetCollectionRequest,batch_get_collection_request\nBatchGetCollectionResponse,batch_get_collection_response\nBatchGetCommitsError,batch_get_commits_error\nBatchGetCommitsInput,batch_get_commits_input\nBatchGetCommitsOutput,batch_get_commits_output\nBatchGetCrawlersRequest,batch_get_crawlers_request\nBatchGetCrawlersResponse,batch_get_crawlers_response\nBatchGetCustomDataIdentifierSummary,batch_get_custom_data_identifier_summary\nBatchGetCustomDataIdentifiersRequest,batch_get_custom_data_identifiers_request\nBatchGetCustomDataIdentifiersResponse,batch_get_custom_data_identifiers_response\nBatchGetCustomEntityTypesRequest,batch_get_custom_entity_types_request\nBatchGetCustomEntityTypesResponse,batch_get_custom_entity_types_response\nBatchGetDataQualityResultRequest,batch_get_data_quality_result_request\nBatchGetDataQualityResultResponse,batch_get_data_quality_result_response\nBatchGetDeploymentGroupsInput,batch_get_deployment_groups_input\nBatchGetDeploymentGroupsOutput,batch_get_deployment_groups_output\nBatchGetDeploymentInstancesInput,batch_get_deployment_instances_input\nBatchGetDeploymentInstancesOutput,batch_get_deployment_instances_output\nBatchGetDeploymentTargetsInput,batch_get_deployment_targets_input\nBatchGetDeploymentTargetsOutput,batch_get_deployment_targets_output\nBatchGetDeploymentsInput,batch_get_deployments_input\nBatchGetDeploymentsOutput,batch_get_deployments_output\nBatchGetDevEndpointsRequest,batch_get_dev_endpoints_request\nBatchGetDevEndpointsResponse,batch_get_dev_endpoints_response\nBatchGetDevicePositionError,batch_get_device_position_error\nBatchGetDevicePositionRequest,batch_get_device_position_request\nBatchGetDevicePositionResponse,batch_get_device_position_response\nBatchGetDocumentStatusRequest,batch_get_document_status_request\nBatchGetDocumentStatusResponse,batch_get_document_status_response\nBatchGetDocumentStatusResponseError,batch_get_document_status_response_error\nBatchGetFieldRequest,batch_get_field_request\nBatchGetFieldResponse,batch_get_field_response\nBatchGetFindingDetailsRequest,batch_get_finding_details_request\nBatchGetFindingDetailsResponse,batch_get_finding_details_response\nBatchGetFindingsError,batch_get_findings_error\nBatchGetFindingsRequest,batch_get_findings_request\nBatchGetFindingsResponse,batch_get_findings_response\nBatchGetFrameMetricDataRequest,batch_get_frame_metric_data_request\nBatchGetFrameMetricDataResponse,batch_get_frame_metric_data_response\nBatchGetFreeTrialInfoRequest,batch_get_free_trial_info_request\nBatchGetFreeTrialInfoResponse,batch_get_free_trial_info_response\nBatchGetGraphMemberDatasourcesRequest,batch_get_graph_member_datasources_request\nBatchGetGraphMemberDatasourcesResponse,batch_get_graph_member_datasources_response\nBatchGetImageRequest,batch_get_image_request\nBatchGetImageResponse,batch_get_image_response\nBatchGetItemInput,batch_get_item_input\nBatchGetItemOutput,batch_get_item_output\nBatchGetJobsRequest,batch_get_jobs_request\nBatchGetJobsResponse,batch_get_jobs_response\nBatchGetLinkAttributes,batch_get_link_attributes\nBatchGetLinkAttributesResponse,batch_get_link_attributes_response\nBatchGetMemberEc2DeepInspectionStatusRequest,batch_get_member_ec2_deep_inspection_status_request\nBatchGetMemberEc2DeepInspectionStatusResponse,batch_get_member_ec2_deep_inspection_status_response\nBatchGetMembershipDatasourcesRequest,batch_get_membership_datasources_request\nBatchGetMembershipDatasourcesResponse,batch_get_membership_datasources_response\nBatchGetMetricDataQuery,batch_get_metric_data_query\nBatchGetMetricDataRequest,batch_get_metric_data_request\nBatchGetMetricDataResponse,batch_get_metric_data_response\nBatchGetNamedQueryInput,batch_get_named_query_input\nBatchGetNamedQueryOutput,batch_get_named_query_output\nBatchGetObjectAttributes,batch_get_object_attributes\nBatchGetObjectAttributesResponse,batch_get_object_attributes_response\nBatchGetObjectInformation,batch_get_object_information\nBatchGetObjectInformationResponse,batch_get_object_information_response\nBatchGetOnPremisesInstancesInput,batch_get_on_premises_instances_input\nBatchGetOnPremisesInstancesOutput,batch_get_on_premises_instances_output\nBatchGetPartitionRequest,batch_get_partition_request\nBatchGetPartitionResponse,batch_get_partition_response\nBatchGetPreparedStatementInput,batch_get_prepared_statement_input\nBatchGetPreparedStatementOutput,batch_get_prepared_statement_output\nBatchGetProjectsInput,batch_get_projects_input\nBatchGetProjectsOutput,batch_get_projects_output\nBatchGetQueryExecutionInput,batch_get_query_execution_input\nBatchGetQueryExecutionOutput,batch_get_query_execution_output\nBatchGetRecordError,batch_get_record_error\nBatchGetRecordIdentifier,batch_get_record_identifier\nBatchGetRecordRequest,batch_get_record_request\nBatchGetRecordResponse,batch_get_record_response\nBatchGetRecordResultDetail,batch_get_record_result_detail\nBatchGetReportGroupsInput,batch_get_report_groups_input\nBatchGetReportGroupsOutput,batch_get_report_groups_output\nBatchGetReportsInput,batch_get_reports_input\nBatchGetReportsOutput,batch_get_reports_output\nBatchGetRepositoriesInput,batch_get_repositories_input\nBatchGetRepositoriesOutput,batch_get_repositories_output\nBatchGetRepositoryScanningConfigurationRequest,batch_get_repository_scanning_configuration_request\nBatchGetRepositoryScanningConfigurationResponse,batch_get_repository_scanning_configuration_response\nBatchGetResourceConfigRequest,batch_get_resource_config_request\nBatchGetResourceConfigResponse,batch_get_resource_config_response\nBatchGetRumMetricDefinitionsRequest,batch_get_rum_metric_definitions_request\nBatchGetRumMetricDefinitionsResponse,batch_get_rum_metric_definitions_response\nBatchGetSchemaError,batch_get_schema_error\nBatchGetSchemaInput,batch_get_schema_input\nBatchGetSchemaOutput,batch_get_schema_output\nBatchGetSecurityControlsRequest,batch_get_security_controls_request\nBatchGetSecurityControlsResponse,batch_get_security_controls_response\nBatchGetStandardsControlAssociationsRequest,batch_get_standards_control_associations_request\nBatchGetStandardsControlAssociationsResponse,batch_get_standards_control_associations_response\nBatchGetStreamKeyRequest,batch_get_stream_key_request\nBatchGetStreamKeyResponse,batch_get_stream_key_response\nBatchGetTokenBalanceErrorItem,batch_get_token_balance_error_item\nBatchGetTokenBalanceInput,batch_get_token_balance_input\nBatchGetTokenBalanceInputItem,batch_get_token_balance_input_item\nBatchGetTokenBalanceOutput,batch_get_token_balance_output\nBatchGetTokenBalanceOutputItem,batch_get_token_balance_output_item\nBatchGetTracesRequest,batch_get_traces_request\nBatchGetTracesResult,batch_get_traces_result\nBatchGetTriggersRequest,batch_get_triggers_request\nBatchGetTriggersResponse,batch_get_triggers_response\nBatchGetUserAccessTasksRequest,batch_get_user_access_tasks_request\nBatchGetUserAccessTasksResponse,batch_get_user_access_tasks_response\nBatchGetVariableError,batch_get_variable_error\nBatchGetVariableRequest,batch_get_variable_request\nBatchGetVariableResult,batch_get_variable_result\nBatchGetViewError,batch_get_view_error\nBatchGetViewInput,batch_get_view_input\nBatchGetViewOutput,batch_get_view_output\nBatchGetVpcEndpointRequest,batch_get_vpc_endpoint_request\nBatchGetVpcEndpointResponse,batch_get_vpc_endpoint_response\nBatchGetWorkflowsRequest,batch_get_workflows_request\nBatchGetWorkflowsResponse,batch_get_workflows_response\nBatchGrantPermissionsRequest,batch_grant_permissions_request\nBatchGrantPermissionsResponse,batch_grant_permissions_response\nBatchId,batch_id\nBatchImport,batch_import\nBatchImportEvidenceToAssessmentControlError,batch_import_evidence_to_assessment_control_error\nBatchImportEvidenceToAssessmentControlRequest,batch_import_evidence_to_assessment_control_request\nBatchImportEvidenceToAssessmentControlResponse,batch_import_evidence_to_assessment_control_response\nBatchImportFindingsRequest,batch_import_findings_request\nBatchImportFindingsResponse,batch_import_findings_response\nBatchImportMetaDataOnCreate,batch_import_meta_data_on_create\nBatchInferenceJob,batch_inference_job\nBatchInferenceJobConfig,batch_inference_job_config\nBatchInferenceJobInput,batch_inference_job_input\nBatchInferenceJobOutput,batch_inference_job_output\nBatchInferenceJobSummary,batch_inference_job_summary\nBatchItem,batch_item\nBatchItemError,batch_item_error\nBatchJobDependency,batch_job_dependency\nBatchJobExecutionSummary,batch_job_execution_summary\nBatchJobParameters,batch_job_parameters\nBatchLimitExceededException,batch_limit_exceeded_exception\nBatchListAttachedIndices,batch_list_attached_indices\nBatchListAttachedIndicesResponse,batch_list_attached_indices_response\nBatchListIncomingTypedLinks,batch_list_incoming_typed_links\nBatchListIncomingTypedLinksResponse,batch_list_incoming_typed_links_response\nBatchListIndex,batch_list_index\nBatchListIndexResponse,batch_list_index_response\nBatchListObjectAttributes,batch_list_object_attributes\nBatchListObjectAttributesResponse,batch_list_object_attributes_response\nBatchListObjectChildren,batch_list_object_children\nBatchListObjectChildrenResponse,batch_list_object_children_response\nBatchListObjectParentPaths,batch_list_object_parent_paths\nBatchListObjectParentPathsResponse,batch_list_object_parent_paths_response\nBatchListObjectParents,batch_list_object_parents\nBatchListObjectParentsResponse,batch_list_object_parents_response\nBatchListObjectPolicies,batch_list_object_policies\nBatchListObjectPoliciesResponse,batch_list_object_policies_response\nBatchListOutgoingTypedLinks,batch_list_outgoing_typed_links\nBatchListOutgoingTypedLinksResponse,batch_list_outgoing_typed_links_response\nBatchListPolicyAttachments,batch_list_policy_attachments\nBatchListPolicyAttachmentsResponse,batch_list_policy_attachments_response\nBatchLoadProgressReport,batch_load_progress_report\nBatchLoadTask,batch_load_task\nBatchLoadTaskDescription,batch_load_task_description\nBatchLoadTasks,batch_load_tasks\nBatchLookupPolicy,batch_lookup_policy\nBatchLookupPolicyResponse,batch_lookup_policy_response\nBatchMeterUsageRequest,batch_meter_usage_request\nBatchMeterUsageResult,batch_meter_usage_result\nBatchModifyClusterSnapshotsLimitExceededFault,batch_modify_cluster_snapshots_limit_exceeded_fault\nBatchModifyClusterSnapshotsMessage,batch_modify_cluster_snapshots_message\nBatchModifyClusterSnapshotsOutputMessage,batch_modify_cluster_snapshots_output_message\nBatchParameters,batch_parameters\nBatchPermissionsFailureEntry,batch_permissions_failure_entry\nBatchPermissionsRequestEntry,batch_permissions_request_entry\nBatchPolicy,batch_policy\nBatchPrediction,batch_prediction\nBatchPredictionDataSourceId,batch_prediction_data_source_id\nBatchPredictionId,batch_prediction_id\nBatchPredictionName,batch_prediction_name\nBatchPutAssetPropertyError,batch_put_asset_property_error\nBatchPutAssetPropertyErrorEntry,batch_put_asset_property_error_entry\nBatchPutAssetPropertyValueRequest,batch_put_asset_property_value_request\nBatchPutAssetPropertyValueResponse,batch_put_asset_property_value_response\nBatchPutDocumentRequest,batch_put_document_request\nBatchPutDocumentResponse,batch_put_document_response\nBatchPutDocumentResponseFailedDocument,batch_put_document_response_failed_document\nBatchPutFieldOptionsRequest,batch_put_field_options_request\nBatchPutFieldOptionsResponse,batch_put_field_options_response\nBatchPutGeofenceError,batch_put_geofence_error\nBatchPutGeofenceRequest,batch_put_geofence_request\nBatchPutGeofenceRequestEntry,batch_put_geofence_request_entry\nBatchPutGeofenceResponse,batch_put_geofence_response\nBatchPutGeofenceSuccess,batch_put_geofence_success\nBatchPutMessageErrorEntries,batch_put_message_error_entries\nBatchPutMessageErrorEntry,batch_put_message_error_entry\nBatchPutMessageRequest,batch_put_message_request\nBatchPutMessageResponse,batch_put_message_response\nBatchPutMetricsError,batch_put_metrics_error\nBatchPutMetricsRequest,batch_put_metrics_request\nBatchPutMetricsResponse,batch_put_metrics_response\nBatchPutPropertyError,batch_put_property_error\nBatchPutPropertyErrorEntry,batch_put_property_error_entry\nBatchPutPropertyValuesRequest,batch_put_property_values_request\nBatchPutPropertyValuesResponse,batch_put_property_values_response\nBatchPutScheduledUpdateGroupActionAnswer,batch_put_scheduled_update_group_action_answer\nBatchPutScheduledUpdateGroupActionType,batch_put_scheduled_update_group_action_type\nBatchReadException,batch_read_exception\nBatchReadOperation,batch_read_operation\nBatchReadOperationResponse,batch_read_operation_response\nBatchReadRequest,batch_read_request\nBatchReadResponse,batch_read_response\nBatchReadSuccessfulResponse,batch_read_successful_response\nBatchRecordsEndTime,batch_records_end_time\nBatchRecordsStartTime,batch_records_start_time\nBatchReferenceName,batch_reference_name\nBatchRemoveFacetFromObject,batch_remove_facet_from_object\nBatchRequestTooLongException,batch_request_too_long_exception\nBatchResetAlarmRequest,batch_reset_alarm_request\nBatchResetAlarmResponse,batch_reset_alarm_response\nBatchResourceRequirement,batch_resource_requirement\nBatchRestrictions,batch_restrictions\nBatchResultErrorEntry,batch_result_error_entry\nBatchRetryStrategy,batch_retry_strategy\nBatchRevokePermissionsRequest,batch_revoke_permissions_request\nBatchRevokePermissionsResponse,batch_revoke_permissions_response\nBatchScheduleActionCreateRequest,batch_schedule_action_create_request\nBatchScheduleActionCreateResult,batch_schedule_action_create_result\nBatchScheduleActionDeleteRequest,batch_schedule_action_delete_request\nBatchScheduleActionDeleteResult,batch_schedule_action_delete_result\nBatchSegmentJob,batch_segment_job\nBatchSegmentJobInput,batch_segment_job_input\nBatchSegmentJobOutput,batch_segment_job_output\nBatchSegmentJobSummary,batch_segment_job_summary\nBatchSize,batch_size\nBatchSizeLimitExceededException,batch_size_limit_exceeded_exception\nBatchSnoozeAlarmRequest,batch_snooze_alarm_request\nBatchSnoozeAlarmResponse,batch_snooze_alarm_response\nBatchStartRecommendationsErrorEntry,batch_start_recommendations_error_entry\nBatchStartRecommendationsRequest,batch_start_recommendations_request\nBatchStartRecommendationsResponse,batch_start_recommendations_response\nBatchStartRequest,batch_start_request\nBatchStartResponse,batch_start_response\nBatchStartViewerSessionRevocationError,batch_start_viewer_session_revocation_error\nBatchStartViewerSessionRevocationRequest,batch_start_viewer_session_revocation_request\nBatchStartViewerSessionRevocationResponse,batch_start_viewer_session_revocation_response\nBatchStartViewerSessionRevocationViewerSession,batch_start_viewer_session_revocation_viewer_session\nBatchStatementError,batch_statement_error\nBatchStatementRequest,batch_statement_request\nBatchStatementResponse,batch_statement_response\nBatchStopJobRunError,batch_stop_job_run_error\nBatchStopJobRunRequest,batch_stop_job_run_request\nBatchStopJobRunResponse,batch_stop_job_run_response\nBatchStopJobRunSuccessfulSubmission,batch_stop_job_run_successful_submission\nBatchStopRequest,batch_stop_request\nBatchStopResponse,batch_stop_response\nBatchStopUpdateActionMessage,batch_stop_update_action_message\nBatchStrategy,batch_strategy\nBatchSuccessfulResultModel,batch_successful_result_model\nBatchSuspendUserRequest,batch_suspend_user_request\nBatchSuspendUserResponse,batch_suspend_user_response\nBatchTooLarge,batch_too_large\nBatchTransformInput,batch_transform_input\nBatchUnsuspendUserRequest,batch_unsuspend_user_request\nBatchUnsuspendUserResponse,batch_unsuspend_user_response\nBatchUpdateAttendeeCapabilitiesExceptRequest,batch_update_attendee_capabilities_except_request\nBatchUpdateAutomationRulesRequest,batch_update_automation_rules_request\nBatchUpdateAutomationRulesResponse,batch_update_automation_rules_response\nBatchUpdateClusterRequest,batch_update_cluster_request\nBatchUpdateClusterResponse,batch_update_cluster_response\nBatchUpdateCustomVocabularyItemRequest,batch_update_custom_vocabulary_item_request\nBatchUpdateCustomVocabularyItemResponse,batch_update_custom_vocabulary_item_response\nBatchUpdateDetectorErrorEntry,batch_update_detector_error_entry\nBatchUpdateDetectorRequest,batch_update_detector_request\nBatchUpdateDetectorResponse,batch_update_detector_response\nBatchUpdateDevicePositionError,batch_update_device_position_error\nBatchUpdateDevicePositionRequest,batch_update_device_position_request\nBatchUpdateDevicePositionResponse,batch_update_device_position_response\nBatchUpdateFindingsRequest,batch_update_findings_request\nBatchUpdateFindingsResponse,batch_update_findings_response\nBatchUpdateFindingsUnprocessedFinding,batch_update_findings_unprocessed_finding\nBatchUpdateLinkAttributes,batch_update_link_attributes\nBatchUpdateMemberEc2DeepInspectionStatusRequest,batch_update_member_ec2_deep_inspection_status_request\nBatchUpdateMemberEc2DeepInspectionStatusResponse,batch_update_member_ec2_deep_inspection_status_response\nBatchUpdateObjectAttributes,batch_update_object_attributes\nBatchUpdateObjectAttributesResponse,batch_update_object_attributes_response\nBatchUpdatePartitionFailureEntry,batch_update_partition_failure_entry\nBatchUpdatePartitionRequest,batch_update_partition_request\nBatchUpdatePartitionRequestEntry,batch_update_partition_request_entry\nBatchUpdatePartitionResponse,batch_update_partition_response\nBatchUpdatePhoneNumberRequest,batch_update_phone_number_request\nBatchUpdatePhoneNumberResponse,batch_update_phone_number_response\nBatchUpdateRecommendationStatusFailedEntry,batch_update_recommendation_status_failed_entry\nBatchUpdateRecommendationStatusRequest,batch_update_recommendation_status_request\nBatchUpdateRecommendationStatusResponse,batch_update_recommendation_status_response\nBatchUpdateRecommendationStatusSuccessfulEntry,batch_update_recommendation_status_successful_entry\nBatchUpdateRuleRequest,batch_update_rule_request\nBatchUpdateRuleResponse,batch_update_rule_response\nBatchUpdateScheduleRequest,batch_update_schedule_request\nBatchUpdateScheduleResponse,batch_update_schedule_response\nBatchUpdateStandardsControlAssociationsRequest,batch_update_standards_control_associations_request\nBatchUpdateStandardsControlAssociationsResponse,batch_update_standards_control_associations_response\nBatchUpdateTableRowsRequest,batch_update_table_rows_request\nBatchUpdateTableRowsResult,batch_update_table_rows_result\nBatchUpdateUserRequest,batch_update_user_request\nBatchUpdateUserResponse,batch_update_user_response\nBatchUpdateVehicleRequest,batch_update_vehicle_request\nBatchUpdateVehicleResponse,batch_update_vehicle_response\nBatchUpsertTableRowsRequest,batch_upsert_table_rows_request\nBatchUpsertTableRowsResult,batch_upsert_table_rows_result\nBatchWindow,batch_window\nBatchWriteException,batch_write_exception\nBatchWriteItemInput,batch_write_item_input\nBatchWriteItemOutput,batch_write_item_output\nBatchWriteOperation,batch_write_operation\nBatchWriteOperationResponse,batch_write_operation_response\nBatchWriteRequest,batch_write_request\nBatchWriteResponse,batch_write_response\nBatches,batches\nBatteryLevel,battery_level\nBccAddresses,bcc_addresses\nBcch,bcch\nBcpPacketSize,bcp_packet_size\nBeaconing,beaconing\nBeard,beard\nBearerToken,bearer_token\nBefore,before\nBeforeCommitIdAndAfterCommitIdAreSameException,before_commit_id_and_after_commit_id_are_same_exception\nBeforeCreationDate,before_creation_date\nBegin,begin\nBeginMarker,begin_marker\nBeginOffset,begin_offset\nBeginOffsetChar,begin_offset_char\nBeginOffsetMillis,begin_offset_millis\nBeginTransactionRequest,begin_transaction_request\nBeginTransactionResponse,begin_transaction_response\nBehavior,behavior\nBehaviorCriteria,behavior_criteria\nBehaviorModelTrainingSummary,behavior_model_training_summary\nBehaviorOnMXFailure,behavior_on_mx_failure\nBehaviorOnMxFailure,behavior_on_mx_failure\nBehaviorType,behavior_type\nBeneficiary,beneficiary\nBenefitsConsidered,benefits_considered\nBerkshelfVersion,berkshelf_version\nBestCandidate,best_candidate\nBestObjectiveNotImproving,best_objective_not_improving\nBestPractice,best_practice\nBestPractices,best_practices\nBestTrainingJob,best_training_job\nBgpAsn,bgp_asn\nBgpConfigurations,bgp_configurations\nBgpOptions,bgp_options\nBgpStatus,bgp_status\nBias,bias\nBiasPosition,bias_position\nBidPrice,bid_price\nBidPriceAsPercentageOfOnDemandPrice,bid_price_as_percentage_of_on_demand_price\nBillDate,bill_date\nBillExpirationException,bill_expiration_exception\nBillableTimeInSeconds,billable_time_in_seconds\nBillableTrainingTimeInSeconds,billable_training_time_in_seconds\nBilledSizeBytes,billed_size_bytes\nBillingAddress,billing_address\nBillingDetails,billing_details\nBillingEntity,billing_entity\nBillingGroupArn,billing_group_arn\nBillingGroupArns,billing_group_arns\nBillingGroupCostReportElement,billing_group_cost_report_element\nBillingGroupCostReports,billing_group_cost_reports\nBillingGroupListElement,billing_group_list_element\nBillingGroupMetadata,billing_group_metadata\nBillingGroupProperties,billing_group_properties\nBillingGroups,billing_groups\nBillingMode,billing_mode\nBillingModeOverride,billing_mode_override\nBillingModeSummary,billing_mode_summary\nBillingPeriod,billing_period\nBillingPeriodRange,billing_period_range\nBillingProducts,billing_products\nBillingRecord,billing_record\nBillingRecords,billing_records\nBillingSubscriptionId,billing_subscription_id\nBillingTagsSource,billing_tags_source\nBillingToken,billing_token\nBillingViewArn,billing_view_arn\nBinCount,bin_count\nBinCountLimit,bin_count_limit\nBinCountOptions,bin_count_options\nBinOptions,bin_options\nBinWidth,bin_width\nBinWidthOptions,bin_width_options\nBinaryColumnStatisticsData,binary_column_statistics_data\nBinaryFile,binary_file\nBinaryListValues,binary_list_values\nBinaryMediaTypes,binary_media_types\nBinaryPrefixLocation,binary_prefix_location\nBinaryValue,binary_value\nBirthDate,birth_date\nBisectBatchOnFunctionError,bisect_batch_on_function_error\nBitDepth,bit_depth\nBitOrder,bit_order\nBitRate,bit_rate\nBitbucket,bitbucket\nBitrate,bitrate\nBitrateClass,bitrate_class\nBitsPerSecond,bits_per_second\nBitstreamMode,bitstream_mode\nBlackDetectThreshold,black_detect_threshold\nBlackFrame,black_frame\nBlackFrameMsec,black_frame_msec\nBlackhole,blackhole\nBlacklist,blacklist\nBlacklistEntry,blacklist_entry\nBlacklistItemNames,blacklist_item_names\nBlacklistReport,blacklist_report\nBlackoutSlate,blackout_slate\nBlackoutSlateImage,blackout_slate_image\nBlankCellFormat,blank_cell_format\nBlob,blob\nBlobAttributeValue,blob_attribute_value\nBlobIdDoesNotExistException,blob_id_does_not_exist_exception\nBlobIdRequiredException,blob_id_required_exception\nBlobMetadata,blob_metadata\nBlobType,blob_type\nBlock,block\nBlockAction,block_action\nBlockAddress,block_address\nBlockData,block_data\nBlockDeviceMapping,block_device_mapping\nBlockDeviceMappingSet,block_device_mapping_set\nBlockDeviceMappings,block_device_mappings\nBlockDurationMinutes,block_duration_minutes\nBlockEmail,block_email\nBlockId,block_id\nBlockIndex,block_index\nBlockListSummaryItems,block_list_summary_items\nBlockOverrideDnsType,block_override_dns_type\nBlockOverrideDomain,block_override_domain\nBlockOverrideTtl,block_override_ttl\nBlockPublicAccess,block_public_access\nBlockPublicAccessConfiguration,block_public_access_configuration\nBlockPublicAccessConfigurationMetadata,block_public_access_configuration_metadata\nBlockPublicAcls,block_public_acls\nBlockPublicPolicy,block_public_policy\nBlockPublicSecurityGroupRules,block_public_security_group_rules\nBlockReference,block_reference\nBlockReferences,block_references\nBlockResponse,block_response\nBlockSize,block_size\nBlockSizeBytes,block_size_bytes\nBlockToken,block_token\nBlockType,block_type\nBlockchainInstant,blockchain_instant\nBlocked,blocked\nBlockedException,blocked_exception\nBlockedIPRangeList,blocked_ip_range_list\nBlockedReason,blocked_reason\nBlockerDeclaration,blocker_declaration\nBlocks,blocks\nBlogConfiguration,blog_configuration\nBlogFieldMappings,blog_field_mappings\nBloomFilterColumns,bloom_filter_columns\nBloomFilterFalsePositiveProbability,bloom_filter_false_positive_probability\nBlue,blue\nBlueGreenDeployment,blue_green_deployment\nBlueGreenDeploymentAlreadyExistsFault,blue_green_deployment_already_exists_fault\nBlueGreenDeploymentConfiguration,blue_green_deployment_configuration\nBlueGreenDeploymentIdentifier,blue_green_deployment_identifier\nBlueGreenDeploymentName,blue_green_deployment_name\nBlueGreenDeploymentNotFoundFault,blue_green_deployment_not_found_fault\nBlueGreenDeploymentTask,blue_green_deployment_task\nBlueGreenDeployments,blue_green_deployments\nBlueGreenUpdatePolicy,blue_green_update_policy\nBlueInstanceTerminationOption,blue_instance_termination_option\nBluePrimaryX,blue_primary_x\nBluePrimaryY,blue_primary_y\nBlueprint,blueprint\nBlueprintDetails,blueprint_details\nBlueprintLocation,blueprint_location\nBlueprintName,blueprint_name\nBlueprintRun,blueprint_run\nBlueprintRuns,blueprint_runs\nBlueprintServiceLocation,blueprint_service_location\nBlueprints,blueprints\nBody,body\nBodyConfig,body_config\nBodyContains,body_contains\nBodyOverride,body_override\nBodyParameters,body_parameters\nBodyParts,body_parts\nBodySectionConfiguration,body_section_configuration\nBodySectionContent,body_section_content\nBodySections,body_sections\nBonusAmount,bonus_amount\nBonusPayment,bonus_payment\nBonusPayments,bonus_payments\nBookingOptions,booking_options\nBookmarks,bookmarks\nBookmarksConfigurations,bookmarks_configurations\nBooleanColumnStatisticsData,boolean_column_statistics_data\nBooleanFilter,boolean_filter\nBooleanValue,boolean_value\nBootMode,boot_mode\nBooting,booting\nBootstrapActionConfig,bootstrap_action_config\nBootstrapActionDetail,bootstrap_action_detail\nBootstrapActions,bootstrap_actions\nBootstrapBrokerString,bootstrap_broker_string\nBootstrapBrokerStringPublicSaslIam,bootstrap_broker_string_public_sasl_iam\nBootstrapBrokerStringPublicSaslScram,bootstrap_broker_string_public_sasl_scram\nBootstrapBrokerStringPublicTls,bootstrap_broker_string_public_tls\nBootstrapBrokerStringSaslIam,bootstrap_broker_string_sasl_iam\nBootstrapBrokerStringSaslScram,bootstrap_broker_string_sasl_scram\nBootstrapBrokerStringTls,bootstrap_broker_string_tls\nBootstrapBrokerStringVpcConnectivitySaslIam,bootstrap_broker_string_vpc_connectivity_sasl_iam\nBootstrapBrokerStringVpcConnectivitySaslScram,bootstrap_broker_string_vpc_connectivity_sasl_scram\nBootstrapBrokerStringVpcConnectivityTls,bootstrap_broker_string_vpc_connectivity_tls\nBootstrapServers,bootstrap_servers\nBorder,border\nBorderColor,border_color\nBorderRadius,border_radius\nBorderStyle,border_style\nBorderThickness,border_thickness\nBorderVisibility,border_visibility\nBorrowConfiguration,borrow_configuration\nBorrowCount,borrow_count\nBot,bot\nBotAliasHistoryEvent,bot_alias_history_event\nBotAliasLocaleSettings,bot_alias_locale_settings\nBotAliasMetadata,bot_alias_metadata\nBotAliasSummary,bot_alias_summary\nBotAliasTestExecutionTarget,bot_alias_test_execution_target\nBotAliases,bot_aliases\nBotChannelAssociation,bot_channel_association\nBotEmail,bot_email\nBotExportSpecification,bot_export_specification\nBotFilter,bot_filter\nBotId,bot_id\nBotImportSpecification,bot_import_specification\nBotLocaleExportSpecification,bot_locale_export_specification\nBotLocaleFilter,bot_locale_filter\nBotLocaleHistoryEvent,bot_locale_history_event\nBotLocaleImportSpecification,bot_locale_import_specification\nBotLocaleSortBy,bot_locale_sort_by\nBotLocaleSummary,bot_locale_summary\nBotMember,bot_member\nBotMetadata,bot_metadata\nBotName,bot_name\nBotRecommendationResultStatistics,bot_recommendation_result_statistics\nBotRecommendationResults,bot_recommendation_results\nBotRecommendationSummary,bot_recommendation_summary\nBotSortBy,bot_sort_by\nBotSummary,bot_summary\nBotType,bot_type\nBotVersionLocaleDetails,bot_version_locale_details\nBotVersionSortBy,bot_version_sort_by\nBotVersionSummary,bot_version_summary\nBots,bots\nBottom,bottom\nBounce,bounce\nBounceAction,bounce_action\nBounceSender,bounce_sender\nBounceSenderArn,bounce_sender_arn\nBounceSubType,bounce_sub_type\nBounceTopic,bounce_topic\nBounceType,bounce_type\nBouncedRecipientInfo,bounced_recipient_info\nBouncedRecipientInfoList,bounced_recipient_info_list\nBounces,bounces\nBoundedFiles,bounded_files\nBoundedSize,bounded_size\nBoundingBox,bounding_box\nBoundingBoxCount,bounding_box_count\nBounds,bounds\nBoxConfiguration,box_configuration\nBoxPlotAggregatedFieldWells,box_plot_aggregated_field_wells\nBoxPlotChartConfiguration,box_plot_chart_configuration\nBoxPlotFieldWells,box_plot_field_wells\nBoxPlotOptions,box_plot_options\nBoxPlotSortConfiguration,box_plot_sort_configuration\nBoxPlotStyleOptions,box_plot_style_options\nBoxPlotVisual,box_plot_visual\nBranch,branch\nBranchDiff,branch_diff\nBranchDiffSourceCodeType,branch_diff_source_code_type\nBranchDoesNotExistException,branch_does_not_exist_exception\nBranchInfo,branch_info\nBranchInterfaceId,branch_interface_id\nBranchName,branch_name\nBranchNameExistsException,branch_name_exists_exception\nBranchNameIsTagNameException,branch_name_is_tag_name_exception\nBranchNameRequiredException,branch_name_required_exception\nBranchOrder,branch_order\nBranches,branches\nBrand,brand\nBrandName,brand_name\nBreachAction,breach_action\nBreachThreshold,breach_threshold\nBreakdownItemsLimit,breakdown_items_limit\nBreakdowns,breakdowns\nBreakoutCode,breakout_code\nBridge,bridge\nBridgeArn,bridge_arn\nBridgeFlowOutput,bridge_flow_output\nBridgeFlowSource,bridge_flow_source\nBridgeMessages,bridge_messages\nBridgeNetworkOutput,bridge_network_output\nBridgeNetworkSource,bridge_network_source\nBridgeOutput,bridge_output\nBridgePlacement,bridge_placement\nBridgePorts,bridge_ports\nBridgeSource,bridge_source\nBridgeState,bridge_state\nBridgeType,bridge_type\nBridges,bridges\nBrightness,brightness\nBroker,broker\nBrokerAZDistribution,broker_az_distribution\nBrokerArn,broker_arn\nBrokerEBSVolumeInfo,broker_ebs_volume_info\nBrokerEngineType,broker_engine_type\nBrokerEngineTypes,broker_engine_types\nBrokerId,broker_id\nBrokerIds,broker_ids\nBrokerInstance,broker_instance\nBrokerInstanceOption,broker_instance_option\nBrokerInstanceOptions,broker_instance_options\nBrokerInstances,broker_instances\nBrokerLogs,broker_logs\nBrokerName,broker_name\nBrokerNodeGroupInfo,broker_node_group_info\nBrokerNodeInfo,broker_node_info\nBrokerSoftwareInfo,broker_software_info\nBrokerState,broker_state\nBrokerSummaries,broker_summaries\nBrokerSummary,broker_summary\nBrowserSettings,browser_settings\nBrowserSettingsSummary,browser_settings_summary\nBsic,bsic\nBucket,bucket\nBucketARN,bucket_arn\nBucketARNUpdate,bucket_arn_update\nBucketAccessLogConfig,bucket_access_log_config\nBucketAccessRoleArn,bucket_access_role_arn\nBucketAccountId,bucket_account_id\nBucketArn,bucket_arn\nBucketBundle,bucket_bundle\nBucketColumns,bucket_columns\nBucketConfiguration,bucket_configuration\nBucketCountByEffectivePermission,bucket_count_by_effective_permission\nBucketCountByEncryptionType,bucket_count_by_encryption_type\nBucketCountBySharedAccessType,bucket_count_by_shared_access_type\nBucketCountPolicyAllowsUnencryptedObjectUploads,bucket_count_policy_allows_unencrypted_object_uploads\nBucketCriteriaAdditionalProperties,bucket_criteria_additional_properties\nBucketFolder,bucket_folder\nBucketInfo,bucket_info\nBucketKeyEnabled,bucket_key_enabled\nBucketLevel,bucket_level\nBucketLevelPermissions,bucket_level_permissions\nBucketLifecycleConfiguration,bucket_lifecycle_configuration\nBucketLoggingConfiguration,bucket_logging_configuration\nBucketLoggingStatus,bucket_logging_status\nBucketMetadata,bucket_metadata\nBucketName,bucket_name\nBucketNameFilterRequiredException,bucket_name_filter_required_exception\nBucketNotFoundFault,bucket_not_found_fault\nBucketNotificationConfiguration,bucket_notification_configuration\nBucketOwner,bucket_owner\nBucketPermissionConfiguration,bucket_permission_configuration\nBucketPolicy,bucket_policy\nBucketPrefix,bucket_prefix\nBucketPublicAccess,bucket_public_access\nBucketRegion,bucket_region\nBucketServerSideEncryption,bucket_server_side_encryption\nBucketSortCriteria,bucket_sort_criteria\nBucketState,bucket_state\nBucketStatisticsBySensitivity,bucket_statistics_by_sensitivity\nBucketVersioningConfiguration,bucket_versioning_configuration\nBucketWebsiteConfiguration,bucket_website_configuration\nBuckets,buckets\nBucketsAggregationType,buckets_aggregation_type\nBudget,budget\nBudgetAdjustmentPeriod,budget_adjustment_period\nBudgetDetail,budget_detail\nBudgetLimit,budget_limit\nBudgetName,budget_name\nBudgetNotificationsForAccount,budget_notifications_for_account\nBudgetPerformanceHistory,budget_performance_history\nBudgetType,budget_type\nBudgetedAmount,budgeted_amount\nBudgetedAndActualAmounts,budgeted_and_actual_amounts\nBudgetedAndActualAmountsList,budgeted_and_actual_amounts_list\nBudgets,budgets\nBufFillPct,buf_fill_pct\nBufSize,buf_size\nBufferDuration,buffer_duration\nBufferModel,buffer_model\nBufferMsec,buffer_msec\nBufferSegments,buffer_segments\nBufferingHints,buffering_hints\nBugzillaIds,bugzilla_ids\nBuild,build\nBuildArn,build_arn\nBuildArtifacts,build_artifacts\nBuildArtifactsObjectKey,build_artifacts_object_key\nBuildBatch,build_batch\nBuildBatchFilter,build_batch_filter\nBuildBatchPhase,build_batch_phase\nBuildBotLocaleRequest,build_bot_locale_request\nBuildBotLocaleResponse,build_bot_locale_response\nBuildCommand,build_command\nBuildConfiguration,build_configuration\nBuildGroup,build_group\nBuildId,build_id\nBuildNotDeleted,build_not_deleted\nBuildPhase,build_phase\nBuildStatusConfig,build_status_config\nBuildSuggestersRequest,build_suggesters_request\nBuildSuggestersResponse,build_suggesters_response\nBuildSummary,build_summary\nBuilder,builder\nBuilds,builds\nBuiltInIntentSortBy,built_in_intent_sort_by\nBuiltInIntentSummary,built_in_intent_summary\nBuiltInSlotTypeSortBy,built_in_slot_type_sort_by\nBuiltInSlotTypeSummary,built_in_slot_type_summary\nBuiltinIntentMetadata,builtin_intent_metadata\nBuiltinIntentSlot,builtin_intent_slot\nBuiltinSlotTypeMetadata,builtin_slot_type_metadata\nBulkDeployment,bulk_deployment\nBulkDeploymentArn,bulk_deployment_arn\nBulkDeploymentId,bulk_deployment_id\nBulkDeploymentMetrics,bulk_deployment_metrics\nBulkDeploymentResult,bulk_deployment_result\nBulkDeploymentStatus,bulk_deployment_status\nBulkDeployments,bulk_deployments\nBulkEmailContent,bulk_email_content\nBulkEmailDestination,bulk_email_destination\nBulkEmailDestinationStatus,bulk_email_destination_status\nBulkEmailEntries,bulk_email_entries\nBulkEmailEntry,bulk_email_entry\nBulkEmailEntryResult,bulk_email_entry_result\nBulkEmailEntryResults,bulk_email_entry_results\nBulkLoadIdNotFoundException,bulk_load_id_not_found_exception\nBulkPublishCompleteTime,bulk_publish_complete_time\nBulkPublishRequest,bulk_publish_request\nBulkPublishResponse,bulk_publish_response\nBulkPublishStartTime,bulk_publish_start_time\nBulkPublishStatus,bulk_publish_status\nBulletPoints,bullet_points\nBumper,bumper\nBundle,bundle\nBundleDescription,bundle_description\nBundleDetails,bundle_details\nBundleId,bundle_id\nBundleIds,bundle_ids\nBundleInformation,bundle_information\nBundleInstanceRequest,bundle_instance_request\nBundleInstanceResult,bundle_instance_result\nBundleName,bundle_name\nBundleTask,bundle_task\nBundleTaskError,bundle_task_error\nBundleTasks,bundle_tasks\nBundleType,bundle_type\nBundles,bundles\nBurnInDestinationSettings,burn_in_destination_settings\nBurninDestinationSettings,burnin_destination_settings\nBurstablePerformance,burstable_performance\nBurstablePerformanceSupported,burstable_performance_supported\nBusinessCalling,business_calling\nBusinessCallingSettings,business_calling_settings\nBusinessEmailAddress,business_email_address\nBusinessGoals,business_goals\nBusinessName,business_name\nBusinessPhoneNumber,business_phone_number\nBusinessReport,business_report\nBusinessReportContentRange,business_report_content_range\nBusinessReportRecurrence,business_report_recurrence\nBusinessReportS3Location,business_report_s3_location\nBusinessReportSchedule,business_report_schedule\nBusinessReportSchedules,business_report_schedules\nButton,button\nButtonAction,button_action\nByAccountId,by_account_id\nByBackupPlanId,by_backup_plan_id\nByBackupVaultName,by_backup_vault_name\nByCompleteAfter,by_complete_after\nByCompleteBefore,by_complete_before\nByCreatedAfter,by_created_after\nByCreatedBefore,by_created_before\nByCreationAfter,by_creation_after\nByCreationBefore,by_creation_before\nByDestinationVaultArn,by_destination_vault_arn\nByParentJobId,by_parent_job_id\nByParentRecoveryPointArn,by_parent_recovery_point_arn\nByReportPlanName,by_report_plan_name\nByResourceArn,by_resource_arn\nByResourceType,by_resource_type\nByShared,by_shared\nByState,by_state\nByStatus,by_status\nByVaultType,by_vault_type\nByoipCidr,byoip_cidr\nByoipCidrEvent,byoip_cidr_event\nByoipCidrNotFoundException,byoip_cidr_not_found_exception\nByoipCidrs,byoip_cidrs\nBypassGovernanceRetention,bypass_governance_retention\nBypassPolicyLockoutCheck,bypass_policy_lockout_check\nBypassPolicyLockoutSafetyCheck,bypass_policy_lockout_safety_check\nBypassSnaplockEnterpriseRetention,bypass_snaplock_enterprise_retention\nByteMatchSet,byte_match_set\nByteMatchSetId,byte_match_set_id\nByteMatchSetSummary,byte_match_set_summary\nByteMatchSetUpdate,byte_match_set_update\nByteMatchSets,byte_match_sets\nByteMatchStatement,byte_match_statement\nByteMatchTuple,byte_match_tuple\nByteMatchTuples,byte_match_tuples\nBytes,bytes\nBytesCompressed,bytes_compressed\nBytesConverted,bytes_converted\nBytesMetered,bytes_metered\nBytesPerHour,bytes_per_hour\nBytesPerSecond,bytes_per_second\nBytesProcessed,bytes_processed\nBytesReturned,bytes_returned\nBytesScanned,bytes_scanned\nBytesScannedCutoffPerQuery,bytes_scanned_cutoff_per_query\nBytesTransferred,bytes_transferred\nBytesWritten,bytes_written\nCACertificate,ca_certificate\nCACertificateDescription,ca_certificate_description\nCACertificateIdentifier,ca_certificate_identifier\nCAIdentifier,ca_identifier\nCFNRegistryException,cfn_registry_exception\nCIDRIP,cidrip\nCIDRSummary,cidr_summary\nCIDRs,cidrs\nCNAME,cname\nCNAMEAlreadyExists,cname_already_exists\nCNAMEPrefix,cname_prefix\nCORSConfiguration,cors_configuration\nCORSRule,cors_rule\nCORSRules,cors_rules\nCPU,cpu\nCPUUtilization,cpu_utilization\nCRLSign,crl_sign\nCSS,css\nCSSColor,css_color\nCSSVersion,css_version\nCSV,csv\nCSVHeader,csv_header\nCSVInput,csv_input\nCSVMappingParameters,csv_mapping_parameters\nCSVOutput,csv_output\nCUSTOM,custom\nCVEIds,cve_ids\nCWEMonitorEnabled,cwe_monitor_enabled\nCaCertificateIdentifier,ca_certificate_identifier\nCaEndpoint,ca_endpoint\nCaLogs,ca_logs\nCacheAllocatedInBytes,cache_allocated_in_bytes\nCacheAttributes,cache_attributes\nCacheBehavior,cache_behavior\nCacheBehaviorPerPath,cache_behavior_per_path\nCacheBehaviors,cache_behaviors\nCacheCluster,cache_cluster\nCacheClusterAlreadyExistsFault,cache_cluster_already_exists_fault\nCacheClusterCreateTime,cache_cluster_create_time\nCacheClusterEnabled,cache_cluster_enabled\nCacheClusterId,cache_cluster_id\nCacheClusterIds,cache_cluster_ids\nCacheClusterMessage,cache_cluster_message\nCacheClusterNotFoundFault,cache_cluster_not_found_fault\nCacheClusterSize,cache_cluster_size\nCacheClusterStatus,cache_cluster_status\nCacheClusters,cache_clusters\nCacheControl,cache_control\nCacheDataEncrypted,cache_data_encrypted\nCacheDirtyPercentage,cache_dirty_percentage\nCacheEngineDescription,cache_engine_description\nCacheEngineVersion,cache_engine_version\nCacheEngineVersionDescription,cache_engine_version_description\nCacheEngineVersionMessage,cache_engine_version_message\nCacheEngineVersions,cache_engine_versions\nCacheFullBehavior,cache_full_behavior\nCacheHitPercentage,cache_hit_percentage\nCacheHitResult,cache_hit_result\nCacheLength,cache_length\nCacheMissPercentage,cache_miss_percentage\nCacheNode,cache_node\nCacheNodeCount,cache_node_count\nCacheNodeCreateTime,cache_node_create_time\nCacheNodeId,cache_node_id\nCacheNodeIdsToReboot,cache_node_ids_to_reboot\nCacheNodeIdsToRemove,cache_node_ids_to_remove\nCacheNodeStatus,cache_node_status\nCacheNodeType,cache_node_type\nCacheNodeTypeSpecificParameter,cache_node_type_specific_parameter\nCacheNodeTypeSpecificParameters,cache_node_type_specific_parameters\nCacheNodeTypeSpecificValue,cache_node_type_specific_value\nCacheNodeTypeSpecificValues,cache_node_type_specific_values\nCacheNodeUpdateStatus,cache_node_update_status\nCacheNodes,cache_nodes\nCacheParameterGroup,cache_parameter_group\nCacheParameterGroupAlreadyExistsFault,cache_parameter_group_already_exists_fault\nCacheParameterGroupDetails,cache_parameter_group_details\nCacheParameterGroupFamily,cache_parameter_group_family\nCacheParameterGroupName,cache_parameter_group_name\nCacheParameterGroupNameMessage,cache_parameter_group_name_message\nCacheParameterGroupNotFoundFault,cache_parameter_group_not_found_fault\nCacheParameterGroupQuotaExceededFault,cache_parameter_group_quota_exceeded_fault\nCacheParameterGroupStatus,cache_parameter_group_status\nCacheParameterGroups,cache_parameter_groups\nCacheParameterGroupsMessage,cache_parameter_groups_message\nCachePeriodInMinutes,cache_period_in_minutes\nCachePolicy,cache_policy\nCachePolicyAlreadyExists,cache_policy_already_exists\nCachePolicyConfig,cache_policy_config\nCachePolicyCookiesConfig,cache_policy_cookies_config\nCachePolicyHeadersConfig,cache_policy_headers_config\nCachePolicyId,cache_policy_id\nCachePolicyInUse,cache_policy_in_use\nCachePolicyList,cache_policy_list\nCachePolicyQueryStringsConfig,cache_policy_query_strings_config\nCachePolicySummary,cache_policy_summary\nCacheSecurityGroup,cache_security_group\nCacheSecurityGroupAlreadyExistsFault,cache_security_group_already_exists_fault\nCacheSecurityGroupMembership,cache_security_group_membership\nCacheSecurityGroupMessage,cache_security_group_message\nCacheSecurityGroupName,cache_security_group_name\nCacheSecurityGroupNames,cache_security_group_names\nCacheSecurityGroupNotFoundFault,cache_security_group_not_found_fault\nCacheSecurityGroupQuotaExceededFault,cache_security_group_quota_exceeded_fault\nCacheSecurityGroups,cache_security_groups\nCacheSettings,cache_settings\nCacheSize,cache_size\nCacheStaleTimeoutInSeconds,cache_stale_timeout_in_seconds\nCacheSubnetGroup,cache_subnet_group\nCacheSubnetGroupAlreadyExistsFault,cache_subnet_group_already_exists_fault\nCacheSubnetGroupDescription,cache_subnet_group_description\nCacheSubnetGroupInUse,cache_subnet_group_in_use\nCacheSubnetGroupMessage,cache_subnet_group_message\nCacheSubnetGroupName,cache_subnet_group_name\nCacheSubnetGroupNotFoundFault,cache_subnet_group_not_found_fault\nCacheSubnetGroupQuotaExceededFault,cache_subnet_group_quota_exceeded_fault\nCacheSubnetGroups,cache_subnet_groups\nCacheSubnetQuotaExceededFault,cache_subnet_quota_exceeded_fault\nCacheTTL,cache_ttl\nCacheTtlInSeconds,cache_ttl_in_seconds\nCacheUsedPercentage,cache_used_percentage\nCachedMethods,cached_methods\nCachediSCSIVolume,cachedi_scsi_volume\nCachediSCSIVolumes,cachedi_scsi_volumes\nCachingConfig,caching_config\nCachingEnabled,caching_enabled\nCalculateRouteCarModeOptions,calculate_route_car_mode_options\nCalculateRouteMatrixRequest,calculate_route_matrix_request\nCalculateRouteMatrixResponse,calculate_route_matrix_response\nCalculateRouteMatrixSummary,calculate_route_matrix_summary\nCalculateRouteRequest,calculate_route_request\nCalculateRouteResponse,calculate_route_response\nCalculateRouteSummary,calculate_route_summary\nCalculateRouteTruckModeOptions,calculate_route_truck_mode_options\nCalculatedAttributeName,calculated_attribute_name\nCalculatedBaselineConstraints,calculated_baseline_constraints\nCalculatedBaselineStatistics,calculated_baseline_statistics\nCalculatedColumn,calculated_column\nCalculatedField,calculated_field\nCalculatedFieldDescription,calculated_field_description\nCalculatedFieldName,calculated_field_name\nCalculatedFieldSynonyms,calculated_field_synonyms\nCalculatedFields,calculated_fields\nCalculatedLifecycle,calculated_lifecycle\nCalculatedMeasureField,calculated_measure_field\nCalculatedSpend,calculated_spend\nCalculation,calculation\nCalculationConfiguration,calculation_configuration\nCalculationExecutionId,calculation_execution_id\nCalculationResult,calculation_result\nCalculationStatistics,calculation_statistics\nCalculationStatus,calculation_status\nCalculationSummary,calculation_summary\nCalculations,calculations\nCalculatorArn,calculator_arn\nCalculatorName,calculator_name\nCalendarNames,calendar_names\nCallAnalyticsEntity,call_analytics_entity\nCallAnalyticsItem,call_analytics_item\nCallAnalyticsJob,call_analytics_job\nCallAnalyticsJobName,call_analytics_job_name\nCallAnalyticsJobSettings,call_analytics_job_settings\nCallAnalyticsJobStatus,call_analytics_job_status\nCallAnalyticsJobSummaries,call_analytics_job_summaries\nCallAnalyticsJobSummary,call_analytics_job_summary\nCallAnalyticsStreamCategories,call_analytics_stream_categories\nCallAnalyticsTranscriptResultStream,call_analytics_transcript_result_stream\nCallAs,call_as\nCallDetails,call_details\nCallInstructionsMessage,call_instructions_message\nCallInstructionsMessageType,call_instructions_message_type\nCallLeg,call_leg\nCallRateLimitExceededException,call_rate_limit_exceeded_exception\nCallback,callback\nCallbackId,callback_id\nCallbackStepMetadata,callback_step_metadata\nCallbackToken,callback_token\nCallbackURLs,callback_urls\nCallerArn,caller_arn\nCallerId,caller_id\nCallerReference,caller_reference\nCallerType,caller_type\nCallingCountry,calling_country\nCallingName,calling_name\nCallingNameStatus,calling_name_status\nCallingNameUpdatedTimestamp,calling_name_updated_timestamp\nCallingRegions,calling_regions\nCampaign,campaign\nCampaignConfig,campaign_config\nCampaignCustomMessage,campaign_custom_message\nCampaignDateRangeKpiResponse,campaign_date_range_kpi_response\nCampaignEmailMessage,campaign_email_message\nCampaignEventFilter,campaign_event_filter\nCampaignFilters,campaign_filters\nCampaignHook,campaign_hook\nCampaignId,campaign_id\nCampaignInAppMessage,campaign_in_app_message\nCampaignLimits,campaign_limits\nCampaignResponse,campaign_response\nCampaignSmsMessage,campaign_sms_message\nCampaignState,campaign_state\nCampaignStatus,campaign_status\nCampaignSummary,campaign_summary\nCampaignUpdateSummary,campaign_update_summary\nCampaignsResponse,campaigns_response\nCanDbcDefinition,can_dbc_definition\nCanInterface,can_interface\nCanSignal,can_signal\nCanaries,canaries\nCanariesLastRun,canaries_last_run\nCanary,canary\nCanaryCodeInput,canary_code_input\nCanaryCodeOutput,canary_code_output\nCanaryLastRun,canary_last_run\nCanaryName,canary_name\nCanaryRun,canary_run\nCanaryRunConfigInput,canary_run_config_input\nCanaryRunConfigOutput,canary_run_config_output\nCanaryRunStatus,canary_run_status\nCanaryRunTimeline,canary_run_timeline\nCanaryRuns,canary_runs\nCanaryScheduleInput,canary_schedule_input\nCanaryScheduleOutput,canary_schedule_output\nCanarySettings,canary_settings\nCanarySize,canary_size\nCanaryStatus,canary_status\nCanaryTimeline,canary_timeline\nCancelAnnotationImportRequest,cancel_annotation_import_request\nCancelArchivalInput,cancel_archival_input\nCancelArchivalOutput,cancel_archival_output\nCancelAuditMitigationActionsTaskRequest,cancel_audit_mitigation_actions_task_request\nCancelAuditTaskRequest,cancel_audit_task_request\nCancelBatchImportJobRequest,cancel_batch_import_job_request\nCancelBatchJobExecutionRequest,cancel_batch_job_execution_request\nCancelBatchPredictionJobRequest,cancel_batch_prediction_job_request\nCancelBundleTaskRequest,cancel_bundle_task_request\nCancelBundleTaskResult,cancel_bundle_task_result\nCancelCapacityReservationFleetError,cancel_capacity_reservation_fleet_error\nCancelCapacityReservationFleetsRequest,cancel_capacity_reservation_fleets_request\nCancelCapacityReservationFleetsResult,cancel_capacity_reservation_fleets_result\nCancelCapacityReservationInput,cancel_capacity_reservation_input\nCancelCapacityReservationRequest,cancel_capacity_reservation_request\nCancelCapacityReservationResult,cancel_capacity_reservation_result\nCancelCertificateTransferRequest,cancel_certificate_transfer_request\nCancelChangeSetRequest,cancel_change_set_request\nCancelChangeSetResponse,cancel_change_set_response\nCancelClusterRequest,cancel_cluster_request\nCancelCommandRequest,cancel_command_request\nCancelComponentDeploymentInput,cancel_component_deployment_input\nCancelComponentDeploymentOutput,cancel_component_deployment_output\nCancelContactRequest,cancel_contact_request\nCancelConversionRequest,cancel_conversion_request\nCancelDataQualityRuleRecommendationRunRequest,cancel_data_quality_rule_recommendation_run_request\nCancelDataQualityRulesetEvaluationRunRequest,cancel_data_quality_ruleset_evaluation_run_request\nCancelDataRepositoryTaskRequest,cancel_data_repository_task_request\nCancelDataRepositoryTaskResponse,cancel_data_repository_task_response\nCancelDeploymentJobRequest,cancel_deployment_job_request\nCancelDeploymentRequest,cancel_deployment_request\nCancelDeploymentResponse,cancel_deployment_response\nCancelDescription,cancel_description\nCancelDetectMitigationActionsTaskRequest,cancel_detect_mitigation_actions_task_request\nCancelDomainTransferToAnotherAwsAccountRequest,cancel_domain_transfer_to_another_aws_account_request\nCancelDomainTransferToAnotherAwsAccountResponse,cancel_domain_transfer_to_another_aws_account_response\nCancelElasticsearchServiceSoftwareUpdateRequest,cancel_elasticsearch_service_software_update_request\nCancelElasticsearchServiceSoftwareUpdateResponse,cancel_elasticsearch_service_software_update_response\nCancelEnvironmentDeploymentInput,cancel_environment_deployment_input\nCancelEnvironmentDeploymentOutput,cancel_environment_deployment_output\nCancelExportJobRequest,cancel_export_job_request\nCancelExportTaskMessage,cancel_export_task_message\nCancelExportTaskRequest,cancel_export_task_request\nCancelFindingsReportRequest,cancel_findings_report_request\nCancelFindingsReportResponse,cancel_findings_report_response\nCancelFlowExecutionsRequest,cancel_flow_executions_request\nCancelFlowExecutionsResponse,cancel_flow_executions_response\nCancelGremlinQueryInput,cancel_gremlin_query_input\nCancelGremlinQueryOutput,cancel_gremlin_query_output\nCancelHandshakeRequest,cancel_handshake_request\nCancelHandshakeResponse,cancel_handshake_response\nCancelImageCreationRequest,cancel_image_creation_request\nCancelImageCreationResponse,cancel_image_creation_response\nCancelImageLaunchPermissionRequest,cancel_image_launch_permission_request\nCancelImageLaunchPermissionResult,cancel_image_launch_permission_result\nCancelImportTaskRequest,cancel_import_task_request\nCancelImportTaskResult,cancel_import_task_result\nCancelIngestionRequest,cancel_ingestion_request\nCancelIngestionResponse,cancel_ingestion_response\nCancelInputDeviceTransferRequest,cancel_input_device_transfer_request\nCancelInstanceRefreshAnswer,cancel_instance_refresh_answer\nCancelInstanceRefreshType,cancel_instance_refresh_type\nCancelJobExecutionRequest,cancel_job_execution_request\nCancelJobRequest,cancel_job_request\nCancelJobResponse,cancel_job_response\nCancelJobRunRequest,cancel_job_run_request\nCancelJobRunResponse,cancel_job_run_response\nCancelJournalKinesisStreamRequest,cancel_journal_kinesis_stream_request\nCancelJournalKinesisStreamResponse,cancel_journal_kinesis_stream_response\nCancelKeyDeletionRequest,cancel_key_deletion_request\nCancelKeyDeletionResponse,cancel_key_deletion_response\nCancelLegalHoldInput,cancel_legal_hold_input\nCancelLoaderJobInput,cancel_loader_job_input\nCancelLoaderJobOutput,cancel_loader_job_output\nCancelMLDataProcessingJobInput,cancel_ml_data_processing_job_input\nCancelMLDataProcessingJobOutput,cancel_ml_data_processing_job_output\nCancelMLModelTrainingJobInput,cancel_ml_model_training_job_input\nCancelMLModelTrainingJobOutput,cancel_ml_model_training_job_output\nCancelMLModelTransformJobInput,cancel_ml_model_transform_job_input\nCancelMLModelTransformJobOutput,cancel_ml_model_transform_job_output\nCancelMLTaskRunRequest,cancel_ml_task_run_request\nCancelMLTaskRunResponse,cancel_ml_task_run_response\nCancelMailboxExportJobRequest,cancel_mailbox_export_job_request\nCancelMaintenanceWindowExecutionRequest,cancel_maintenance_window_execution_request\nCancelMaintenanceWindowExecutionResult,cancel_maintenance_window_execution_result\nCancelMessageMoveTaskRequest,cancel_message_move_task_request\nCancelMessageMoveTaskResult,cancel_message_move_task_result\nCancelMulticastGroupSessionRequest,cancel_multicast_group_session_request\nCancelOpenCypherQueryInput,cancel_open_cypher_query_input\nCancelOpenCypherQueryOutput,cancel_open_cypher_query_output\nCancelOrderInput,cancel_order_input\nCancelPipelineReprocessingRequest,cancel_pipeline_reprocessing_request\nCancelPolicyGenerationRequest,cancel_policy_generation_request\nCancelQuantumTaskRequest,cancel_quantum_task_request\nCancelQuantumTaskResponse,cancel_quantum_task_response\nCancelQueryRequest,cancel_query_request\nCancelQueryResponse,cancel_query_response\nCancelReason,cancel_reason\nCancelReplayRequest,cancel_replay_request\nCancelReplayResponse,cancel_replay_response\nCancelReplicationTaskAssessmentRunMessage,cancel_replication_task_assessment_run_message\nCancelReplicationTaskAssessmentRunResponse,cancel_replication_task_assessment_run_response\nCancelReservedInstancesListingRequest,cancel_reserved_instances_listing_request\nCancelReservedInstancesListingResult,cancel_reserved_instances_listing_result\nCancelResizeMessage,cancel_resize_message\nCancelResourceRequestInput,cancel_resource_request_input\nCancelResourceRequestOutput,cancel_resource_request_output\nCancelRetrievalInput,cancel_retrieval_input\nCancelRetrievalOutput,cancel_retrieval_output\nCancelRotateSecretRequest,cancel_rotate_secret_request\nCancelRotateSecretResponse,cancel_rotate_secret_response\nCancelRunRequest,cancel_run_request\nCancelSbomExportRequest,cancel_sbom_export_request\nCancelSbomExportResponse,cancel_sbom_export_response\nCancelSchemaExtensionRequest,cancel_schema_extension_request\nCancelServiceInstanceDeploymentInput,cancel_service_instance_deployment_input\nCancelServiceInstanceDeploymentOutput,cancel_service_instance_deployment_output\nCancelServicePipelineDeploymentInput,cancel_service_pipeline_deployment_input\nCancelServicePipelineDeploymentOutput,cancel_service_pipeline_deployment_output\nCancelServiceSoftwareUpdateRequest,cancel_service_software_update_request\nCancelServiceSoftwareUpdateResponse,cancel_service_software_update_response\nCancelSigningProfileRequest,cancel_signing_profile_request\nCancelSimulationJobBatchRequest,cancel_simulation_job_batch_request\nCancelSimulationJobRequest,cancel_simulation_job_request\nCancelSolNetworkOperationInput,cancel_sol_network_operation_input\nCancelSpotFleetRequestsError,cancel_spot_fleet_requests_error\nCancelSpotFleetRequestsErrorItem,cancel_spot_fleet_requests_error_item\nCancelSpotFleetRequestsRequest,cancel_spot_fleet_requests_request\nCancelSpotFleetRequestsResponse,cancel_spot_fleet_requests_response\nCancelSpotFleetRequestsSuccessItem,cancel_spot_fleet_requests_success_item\nCancelSpotInstanceRequestsRequest,cancel_spot_instance_requests_request\nCancelSpotInstanceRequestsResult,cancel_spot_instance_requests_result\nCancelStatementRequest,cancel_statement_request\nCancelStatementResponse,cancel_statement_response\nCancelStepsInfo,cancel_steps_info\nCancelStepsInfoList,cancel_steps_info_list\nCancelStepsInput,cancel_steps_input\nCancelStepsOutput,cancel_steps_output\nCancelTaskExecutionRequest,cancel_task_execution_request\nCancelTaskInput,cancel_task_input\nCancelTaskOutput,cancel_task_output\nCancelTimerDecisionAttributes,cancel_timer_decision_attributes\nCancelTimerFailedEventAttributes,cancel_timer_failed_event_attributes\nCancelTransactionRequest,cancel_transaction_request\nCancelUpdateStackInput,cancel_update_stack_input\nCancelVariantImportRequest,cancel_variant_import_request\nCancelWorkflowExecutionDecisionAttributes,cancel_workflow_execution_decision_attributes\nCancelWorkflowExecutionFailedEventAttributes,cancel_workflow_execution_failed_event_attributes\nCancelWorldExportJobRequest,cancel_world_export_job_request\nCancelWorldGenerationJobRequest,cancel_world_generation_job_request\nCancelZonalShiftRequest,cancel_zonal_shift_request\nCancellable,cancellable\nCancellationDate,cancellation_date\nCancellationMessage,cancellation_message\nCancellationReason,cancellation_reason\nCancellationReasons,cancellation_reasons\nCancelledByUserException,cancelled_by_user_exception\nCancelledSpotInstanceRequest,cancelled_spot_instance_request\nCancelledSpotInstanceRequests,cancelled_spot_instance_requests\nCancelledSteps,cancelled_steps\nCandidateAddress,candidate_address\nCandidateAddressList,candidate_address_list\nCandidateArtifactLocations,candidate_artifact_locations\nCandidateDefinitionNotebookLocation,candidate_definition_notebook_location\nCandidateGenerationConfig,candidate_generation_config\nCandidateMetrics,candidate_metrics\nCandidateName,candidate_name\nCandidateNameEquals,candidate_name_equals\nCandidateProperties,candidate_properties\nCandidateStatus,candidate_status\nCandidateStepArn,candidate_step_arn\nCandidateStepName,candidate_step_name\nCandidateStepType,candidate_step_type\nCandidateSteps,candidate_steps\nCandidates,candidates\nCannedACL,canned_acl\nCannedAccessControlList,canned_access_control_list\nCannedAcl,canned_acl\nCannedAclForObjects,canned_acl_for_objects\nCannotChangeImmutablePublicKeyFields,cannot_change_immutable_public_key_fields\nCannotDelegateManagementAccountException,cannot_delegate_management_account_exception\nCannotDeleteApprovalRuleFromTemplateException,cannot_delete_approval_rule_from_template_exception\nCannotDeleteException,cannot_delete_exception\nCannotListParentOfRootException,cannot_list_parent_of_root_exception\nCannotModifyApprovalRuleFromTemplateException,cannot_modify_approval_rule_from_template_exception\nCanonicalHostedZoneId,canonical_hosted_zone_id\nCanonicalHostedZoneName,canonical_hosted_zone_name\nCanonicalHostedZoneNameID,canonical_hosted_zone_name_id\nCanvasAppSettings,canvas_app_settings\nCanvasOrientation,canvas_orientation\nCanvasSizeOptions,canvas_size_options\nCap,cap\nCapExceeded,cap_exceeded\nCapabilities,capabilities\nCapabilitiesReason,capabilities_reason\nCapacity,capacity\nCapacityAllocation,capacity_allocation\nCapacityAllocations,capacity_allocations\nCapacityAssignment,capacity_assignment\nCapacityAssignmentConfiguration,capacity_assignment_configuration\nCapacityAssignments,capacity_assignments\nCapacityConfiguration,capacity_configuration\nCapacityDescription,capacity_description\nCapacityExceededException,capacity_exceeded_exception\nCapacityForecast,capacity_forecast\nCapacityId,capacity_id\nCapacityInBytes,capacity_in_bytes\nCapacityLimits,capacity_limits\nCapacityProvider,capacity_provider\nCapacityProviderStrategy,capacity_provider_strategy\nCapacityProviderStrategyItem,capacity_provider_strategy_item\nCapacityProviders,capacity_providers\nCapacityProvisioned,capacity_provisioned\nCapacityRebalance,capacity_rebalance\nCapacityRegion,capacity_region\nCapacityReservation,capacity_reservation\nCapacityReservationArn,capacity_reservation_arn\nCapacityReservationFleet,capacity_reservation_fleet\nCapacityReservationFleetArn,capacity_reservation_fleet_arn\nCapacityReservationFleetCancellationState,capacity_reservation_fleet_cancellation_state\nCapacityReservationFleetId,capacity_reservation_fleet_id\nCapacityReservationFleetIds,capacity_reservation_fleet_ids\nCapacityReservationFleets,capacity_reservation_fleets\nCapacityReservationGroup,capacity_reservation_group\nCapacityReservationGroups,capacity_reservation_groups\nCapacityReservationId,capacity_reservation_id\nCapacityReservationIds,capacity_reservation_ids\nCapacityReservationName,capacity_reservation_name\nCapacityReservationOptions,capacity_reservation_options\nCapacityReservationOptionsRequest,capacity_reservation_options_request\nCapacityReservationPreference,capacity_reservation_preference\nCapacityReservationResourceGroupArn,capacity_reservation_resource_group_arn\nCapacityReservationSpecification,capacity_reservation_specification\nCapacityReservationSpecificationResponse,capacity_reservation_specification_response\nCapacityReservationTarget,capacity_reservation_target\nCapacityReservationTargetResponse,capacity_reservation_target_response\nCapacityReservations,capacity_reservations\nCapacitySize,capacity_size\nCapacitySpecification,capacity_specification\nCapacitySpecificationSummary,capacity_specification_summary\nCapacityToRelease,capacity_to_release\nCapacityUnits,capacity_units\nCapacityUnitsConfiguration,capacity_units_configuration\nCapacityUpdate,capacity_update\nCapacityUsageSummary,capacity_usage_summary\nCapacityUsed,capacity_used\nCappedCount,capped_count\nCaptcha,captcha\nCaptchaAction,captcha_action\nCaptchaConfig,captcha_config\nCaptchaResponse,captcha_response\nCaptionChannel,caption_channel\nCaptionContainerType,caption_container_type\nCaptionData,caption_data\nCaptionDescription,caption_description\nCaptionDescriptionNames,caption_description_names\nCaptionDescriptionPreset,caption_description_preset\nCaptionDescriptions,caption_descriptions\nCaptionDestinationSettings,caption_destination_settings\nCaptionFormat,caption_format\nCaptionFormats,caption_formats\nCaptionLanguageMapping,caption_language_mapping\nCaptionLanguageMappings,caption_language_mappings\nCaptionLanguageSetting,caption_language_setting\nCaptionRectangle,caption_rectangle\nCaptionSegmentLengthControl,caption_segment_length_control\nCaptionSelector,caption_selector\nCaptionSelectorName,caption_selector_name\nCaptionSelectorSettings,caption_selector_settings\nCaptionSelectors,caption_selectors\nCaptionSource,caption_source\nCaptionSourceFramerate,caption_source_framerate\nCaptionSourceSettings,caption_source_settings\nCaptionSources,caption_sources\nCaptions,captions\nCaptureContentTypeHeader,capture_content_type_header\nCaptureDdls,capture_ddls\nCaptureInterval,capture_interval\nCaptureIntervalUnits,capture_interval_units\nCaptureMode,capture_mode\nCaptureOption,capture_option\nCaptureOptions,capture_options\nCaptureStatus,capture_status\nCaptureTime,capture_time\nCaptureTimeAccuracy,capture_time_accuracy\nCarModeOptions,car_mode_options\nCardExpiryDate,card_expiry_date\nCardHolderVerificationValue,card_holder_verification_value\nCardStatusUpdate,card_status_update\nCardVerificationValue1,card_verification_value1\nCardVerificationValue2,card_verification_value2\nCardinality,cardinality\nCarrier,carrier\nCarrierGateway,carrier_gateway\nCarrierGatewayId,carrier_gateway_id\nCarrierGatewayIds,carrier_gateway_ids\nCarrierGateways,carrier_gateways\nCarrierIp,carrier_ip\nCartesianCoordinates,cartesian_coordinates\nCascade,cascade\nCascadingControlConfiguration,cascading_control_configuration\nCascadingControlSource,cascading_control_source\nCaseCreationLimitExceeded,case_creation_limit_exceeded\nCaseDetails,case_details\nCaseEventIncludedData,case_event_included_data\nCaseId,case_id\nCaseIdNotFound,case_id_not_found\nCaseInsensitive,case_insensitive\nCaseSensitive,case_sensitive\nCaseSensitiveNames,case_sensitive_names\nCaseSensitivity,case_sensitivity\nCaseSummary,case_summary\nCastColumnTypeOperation,cast_column_type_operation\nCatalog,catalog\nCatalogConfiguration,catalog_configuration\nCatalogConfigurationDescription,catalog_configuration_description\nCatalogConfigurationUpdate,catalog_configuration_update\nCatalogDatabase,catalog_database\nCatalogDeltaSource,catalog_delta_source\nCatalogEncryptionMode,catalog_encryption_mode\nCatalogEntry,catalog_entry\nCatalogHudiSource,catalog_hudi_source\nCatalogId,catalog_id\nCatalogImportStatus,catalog_import_status\nCatalogItem,catalog_item\nCatalogItemId,catalog_item_id\nCatalogItems,catalog_items\nCatalogKafkaSource,catalog_kafka_source\nCatalogKinesisSource,catalog_kinesis_source\nCatalogName,catalog_name\nCatalogRedshiftSchema,catalog_redshift_schema\nCatalogRedshiftTable,catalog_redshift_table\nCatalogSchemaChangePolicy,catalog_schema_change_policy\nCatalogSource,catalog_source\nCatalogTable,catalog_table\nCatalogTarget,catalog_target\nCatalogTargets,catalog_targets\nCategoricalAggregationFunction,categorical_aggregation_function\nCategoricalDimensionField,categorical_dimension_field\nCategoricalHyperParameterRange,categorical_hyper_parameter_range\nCategoricalMeasureField,categorical_measure_field\nCategoricalParameter,categorical_parameter\nCategoricalParameterRange,categorical_parameter_range\nCategoricalParameterRangeSpecification,categorical_parameter_range_specification\nCategoricalParameterRanges,categorical_parameter_ranges\nCategoricalValues,categorical_values\nCategories,categories\nCategory,category\nCategoryAxis,category_axis\nCategoryAxisDisplayOptions,category_axis_display_options\nCategoryAxisLabelOptions,category_axis_label_options\nCategoryDetails,category_details\nCategoryDrillDownFilter,category_drill_down_filter\nCategoryEnum,category_enum\nCategoryEvent,category_event\nCategoryFilter,category_filter\nCategoryFilterConfiguration,category_filter_configuration\nCategoryFilterFunction,category_filter_function\nCategoryFilterType,category_filter_type\nCategoryId,category_id\nCategoryItemsLimit,category_items_limit\nCategoryItemsLimitConfiguration,category_items_limit_configuration\nCategoryLabelOptions,category_label_options\nCategoryLabelVisibility,category_label_visibility\nCategoryList,category_list\nCategoryName,category_name\nCategoryProperties,category_properties\nCategorySort,category_sort\nCategoryValue,category_value\nCategoryValues,category_values\nCategoryWithFindingNum,category_with_finding_num\nCausalAnomalyId,causal_anomaly_id\nCause,cause\nCausedBy,caused_by\nCauses,causes\nCausingEntity,causing_entity\nCbetCheckDigitString,cbet_check_digit_string\nCbetSourceId,cbet_source_id\nCbetStepaside,cbet_stepaside\nCcAddresses,cc_addresses\nCcDescriptor,cc_descriptor\nCdcInsertsAndUpdates,cdc_inserts_and_updates\nCdcInsertsOnly,cdc_inserts_only\nCdcMaxBatchInterval,cdc_max_batch_interval\nCdcMinFileSize,cdc_min_file_size\nCdcPath,cdc_path\nCdcStartPosition,cdc_start_position\nCdcStartTime,cdc_start_time\nCdcStopPosition,cdc_stop_position\nCdiInputSpecification,cdi_input_specification\nCdma,cdma\nCdmaChannel,cdma_channel\nCdmaLocalId,cdma_local_id\nCdmaNmr,cdma_nmr\nCdmaNmrObj,cdma_nmr_obj\nCdmaObj,cdma_obj\nCdnConfiguration,cdn_configuration\nCdnIdentifierSecret,cdn_identifier_secret\nCdrBucket,cdr_bucket\nCelebrities,celebrities\nCelebrity,celebrity\nCelebrityDetail,celebrity_detail\nCelebrityFaces,celebrity_faces\nCelebrityRecognition,celebrity_recognition\nCell,cell\nCellArn,cell_arn\nCellFilters,cell_filters\nCellInput,cell_input\nCellName,cell_name\nCellOutput,cell_output\nCellParams,cell_params\nCellReference,cell_reference\nCellStyle,cell_style\nCellTowers,cell_towers\nCellType,cell_type\nCellValue,cell_value\nCellValueSynonym,cell_value_synonym\nCellValueSynonyms,cell_value_synonyms\nCells,cells\nCenter,center\nCents,cents\nCertPolicyId,cert_policy_id\nCertificate,certificate\nCertificateAlreadyExistsException,certificate_already_exists_exception\nCertificateArn,certificate_arn\nCertificateAssociation,certificate_association\nCertificateAssociations,certificate_associations\nCertificateAuthentication,certificate_authentication\nCertificateAuthenticationRequest,certificate_authentication_request\nCertificateAuthorities,certificate_authorities\nCertificateAuthority,certificate_authority\nCertificateAuthorityArn,certificate_authority_arn\nCertificateAuthorityArnList,certificate_authority_arn_list\nCertificateAuthorityConfiguration,certificate_authority_configuration\nCertificateAuthorityData,certificate_authority_data\nCertificateAuthorityExpiryInMilliseconds,certificate_authority_expiry_in_milliseconds\nCertificateAuthorityId,certificate_authority_id\nCertificateAuthorityPublicKeyIdentifier,certificate_authority_public_key_identifier\nCertificateAuthorityType,certificate_authority_type\nCertificateBasedAuthProperties,certificate_based_auth_properties\nCertificateBody,certificate_body\nCertificateChain,certificate_chain\nCertificateConfiguration,certificate_configuration\nCertificateConflictException,certificate_conflict_exception\nCertificateCreationDate,certificate_creation_date\nCertificateData,certificate_data\nCertificateDescription,certificate_description\nCertificateDetail,certificate_detail\nCertificateDetails,certificate_details\nCertificateDoesNotExistException,certificate_does_not_exist_exception\nCertificateEnrollmentPolicyServerEndpoint,certificate_enrollment_policy_server_endpoint\nCertificateExpirationTime,certificate_expiration_time\nCertificateExpiryInMilliseconds,certificate_expiry_in_milliseconds\nCertificateFingerprint,certificate_fingerprint\nCertificateId,certificate_id\nCertificateIdentifier,certificate_identifier\nCertificateIds,certificate_ids\nCertificateInUseException,certificate_in_use_exception\nCertificateInfo,certificate_info\nCertificateLimitExceededException,certificate_limit_exceeded_exception\nCertificateList,certificate_list\nCertificateMessage,certificate_message\nCertificateMismatchException,certificate_mismatch_exception\nCertificateMode,certificate_mode\nCertificateName,certificate_name\nCertificateNotFoundException,certificate_not_found_exception\nCertificateNotFoundFault,certificate_not_found_fault\nCertificateOptions,certificate_options\nCertificateOwner,certificate_owner\nCertificatePath,certificate_path\nCertificatePem,certificate_pem\nCertificatePolicies,certificate_policies\nCertificateRevocationList,certificate_revocation_list\nCertificateRotationRestart,certificate_rotation_restart\nCertificateS3BucketName,certificate_s3_bucket_name\nCertificateS3ObjectKey,certificate_s3_object_key\nCertificateSerial,certificate_serial\nCertificateSource,certificate_source\nCertificateStateException,certificate_state_exception\nCertificateStatuses,certificate_statuses\nCertificateSummary,certificate_summary\nCertificateSummaryList,certificate_summary_list\nCertificateTransparencyLoggingPreference,certificate_transparency_logging_preference\nCertificateType,certificate_type\nCertificateUploadDate,certificate_upload_date\nCertificateValidationException,certificate_validation_exception\nCertificateValidationRecord,certificate_validation_record\nCertificateValidationRecords,certificate_validation_records\nCertificateValidity,certificate_validity\nCertificateWallet,certificate_wallet\nCertificates,certificates\nCertificatesInfo,certificates_info\nCertifications,certifications\nCertifyForMarketplace,certify_for_marketplace\nChain,chain\nChainId,chain_id\nChaincodeLogs,chaincode_logs\nChallenge,challenge\nChallengeAction,challenge_action\nChallengeCode,challenge_code\nChallengeConfig,challenge_config\nChallengeName,challenge_name\nChallengeParameters,challenge_parameters\nChallengeRequiredOnNewDevice,challenge_required_on_new_device\nChallengeResponse,challenge_response\nChallengeResponseType,challenge_response_type\nChallengeResponses,challenge_responses\nChange,change\nChangeBatch,change_batch\nChangeCidrCollectionRequest,change_cidr_collection_request\nChangeCidrCollectionResponse,change_cidr_collection_response\nChangeComputeType,change_compute_type\nChangeDetails,change_details\nChangeDetectingColumns,change_detecting_columns\nChangeId,change_id\nChangeInfo,change_info\nChangeLog,change_log\nChangeMessageVisibilityBatchRequest,change_message_visibility_batch_request\nChangeMessageVisibilityBatchRequestEntry,change_message_visibility_batch_request_entry\nChangeMessageVisibilityBatchResult,change_message_visibility_batch_result\nChangeMessageVisibilityBatchResultEntry,change_message_visibility_batch_result_entry\nChangeMessageVisibilityRequest,change_message_visibility_request\nChangeName,change_name\nChangeOwnershipPrice,change_ownership_price\nChangePasswordRequest,change_password_request\nChangeProgressDetails,change_progress_details\nChangeProgressStage,change_progress_stage\nChangeProgressStages,change_progress_stages\nChangeProgressStatus,change_progress_status\nChangeProgressStatusDetails,change_progress_status_details\nChangeProgressStatuses,change_progress_statuses\nChangeRequest,change_request\nChangeRequestName,change_request_name\nChangeResourceRecordSetsRequest,change_resource_record_sets_request\nChangeResourceRecordSetsResponse,change_resource_record_sets_response\nChangeServerLifeCycleStateRequest,change_server_life_cycle_state_request\nChangeServerLifeCycleStateSourceServerLifecycle,change_server_life_cycle_state_source_server_lifecycle\nChangeSet,change_set\nChangeSetArn,change_set_arn\nChangeSetHook,change_set_hook\nChangeSetHookResourceTargetDetails,change_set_hook_resource_target_details\nChangeSetHookTargetDetails,change_set_hook_target_details\nChangeSetId,change_set_id\nChangeSetName,change_set_name\nChangeSetNotFoundException,change_set_not_found_exception\nChangeSetState,change_set_state\nChangeSetSummary,change_set_summary\nChangeSetSummaryList,change_set_summary_list\nChangeSetSummaryListItem,change_set_summary_list_item\nChangeSetTags,change_set_tags\nChangeSetType,change_set_type\nChangeSeverity,change_severity\nChangeSource,change_source\nChangeSummary,change_summary\nChangeTagsForResourceRequest,change_tags_for_resource_request\nChangeToken,change_token\nChangeTokenStatus,change_token_status\nChangeType,change_type\nChangeableForDays,changeable_for_days\nChangedBlock,changed_block\nChangedBlocks,changed_blocks\nChangedBlocksCount,changed_blocks_count\nChanges,changes\nChangesetErrorInfo,changeset_error_info\nChangesetSummary,changeset_summary\nChannel,channel\nChannelARN,channel_arn\nChannelARNInvalidException,channel_arn_invalid_exception\nChannelActivity,channel_activity\nChannelAlreadyExistsException,channel_already_exists_exception\nChannelArn,channel_arn\nChannelAssociatedWithFlowSummary,channel_associated_with_flow_summary\nChannelBan,channel_ban\nChannelBanSummary,channel_ban_summary\nChannelBans,channel_bans\nChannelClass,channel_class\nChannelConfiguration,channel_configuration\nChannelCounts,channel_counts\nChannelDefinition,channel_definition\nChannelDefinitions,channel_definitions\nChannelEgressEndpoint,channel_egress_endpoint\nChannelExistsForEDSException,channel_exists_for_eds_exception\nChannelFlow,channel_flow\nChannelFlowArn,channel_flow_arn\nChannelFlowCallbackRequest,channel_flow_callback_request\nChannelFlowCallbackResponse,channel_flow_callback_response\nChannelFlowSummary,channel_flow_summary\nChannelFlows,channel_flows\nChannelGroupListConfiguration,channel_group_list_configuration\nChannelGroupName,channel_group_name\nChannelId,channel_id\nChannelIdentification,channel_identification\nChannelIds,channel_ids\nChannelInfo,channel_info\nChannelInfoList,channel_info_list\nChannelInsufficientPermission,channel_insufficient_permission\nChannelListConfiguration,channel_list_configuration\nChannelMapping,channel_mapping\nChannelMappings,channel_mappings\nChannelMask,channel_mask\nChannelMaxLimitExceededException,channel_max_limit_exceeded_exception\nChannelMembership,channel_membership\nChannelMembershipForAppInstanceUserSummary,channel_membership_for_app_instance_user_summary\nChannelMembershipPreferences,channel_membership_preferences\nChannelMembershipSummary,channel_membership_summary\nChannelMemberships,channel_memberships\nChannelMessage,channel_message\nChannelMessageCallback,channel_message_callback\nChannelMessageStatusStructure,channel_message_status_structure\nChannelMessageSummary,channel_message_summary\nChannelMessages,channel_messages\nChannelModeratedByAppInstanceUserSummary,channel_moderated_by_app_instance_user_summary\nChannelModerator,channel_moderator\nChannelModeratorArn,channel_moderator_arn\nChannelModeratorSummary,channel_moderator_summary\nChannelModerators,channel_moderators\nChannelName,channel_name\nChannelNameCondition,channel_name_condition\nChannelNotBroadcasting,channel_not_broadcasting\nChannelNotFound,channel_not_found\nChannelNotFoundException,channel_not_found_exception\nChannelOrder,channel_order\nChannelResponse,channel_response\nChannelRetentionSettings,channel_retention_settings\nChannelSpecification,channel_specification\nChannelState,channel_state\nChannelStatistics,channel_statistics\nChannelStatus,channel_status\nChannelStorage,channel_storage\nChannelStorageSummary,channel_storage_summary\nChannelSummary,channel_summary\nChannelTag,channel_tag\nChannelTargetInfo,channel_target_info\nChannelType,channel_type\nChannelUnsupportedSchema,channel_unsupported_schema\nChannels,channels\nChannelsIn,channels_in\nChannelsOut,channels_out\nChannelsResponse,channels_response\nChapCredentials,chap_credentials\nChapEnabled,chap_enabled\nChapInfo,chap_info\nCharLengthSemantics,char_length_semantics\nCharacterOffsets,character_offsets\nCharacterSet,character_set\nCharacterSetDescription,character_set_description\nCharacterSetName,character_set_name\nCharacters,characters\nChargeDetails,charge_details\nChargeValue,charge_value\nCharset,charset\nChartAxisLabelOptions,chart_axis_label_options\nChartColor,chart_color\nChartConfiguration,chart_configuration\nChatDurationInMinutes,chat_duration_in_minutes\nChatMessage,chat_message\nChatParticipantRoleConfig,chat_participant_role_config\nChatStreamingConfiguration,chat_streaming_configuration\nChatterFeedConfiguration,chatter_feed_configuration\nCheckCapacityRequest,check_capacity_request\nCheckCapacityResponse,check_capacity_response\nCheckDNSAvailabilityMessage,check_dns_availability_message\nCheckDNSAvailabilityResultMessage,check_dns_availability_result_message\nCheckDetail,check_detail\nCheckDetails,check_details\nCheckDigitString,check_digit_string\nCheckDomainAvailabilityRequest,check_domain_availability_request\nCheckDomainAvailabilityResponse,check_domain_availability_response\nCheckDomainTransferabilityRequest,check_domain_transferability_request\nCheckDomainTransferabilityResponse,check_domain_transferability_response\nCheckExpression,check_expression\nCheckIfPhoneNumberIsOptedOutInput,check_if_phone_number_is_opted_out_input\nCheckIfPhoneNumberIsOptedOutResponse,check_if_phone_number_is_opted_out_response\nCheckInLicenseRequest,check_in_license_request\nCheckJobArn,check_job_arn\nCheckName,check_name\nCheckSchemaVersionValidityInput,check_schema_version_validity_input\nCheckSchemaVersionValidityResponse,check_schema_version_validity_response\nCheckSummaries,check_summaries\nCheckSummary,check_summary\nCheckType,check_type\nCheckedTime,checked_time\nCheckerIpRanges,checker_ip_ranges\nCheckoutBorrowLicenseRequest,checkout_borrow_license_request\nCheckoutBorrowLicenseResponse,checkout_borrow_license_response\nCheckoutLicenseRequest,checkout_license_request\nCheckoutLicenseResponse,checkout_license_response\nCheckoutMetadata,checkout_metadata\nCheckoutType,checkout_type\nCheckpointConfig,checkpoint_config\nCheckpointConfiguration,checkpoint_configuration\nCheckpointConfigurationDescription,checkpoint_configuration_description\nCheckpointConfigurationUpdate,checkpoint_configuration_update\nCheckpointDelay,checkpoint_delay\nCheckpointInterval,checkpoint_interval\nCheckpointIntervalUpdate,checkpoint_interval_update\nCheckpointPercentages,checkpoint_percentages\nCheckpointingEnabled,checkpointing_enabled\nCheckpointingEnabledUpdate,checkpointing_enabled_update\nChecksum,checksum\nChecksumAggregationMethod,checksum_aggregation_method\nChecksumAlgorithm,checksum_algorithm\nChecksumCRC32,checksum_crc32\nChecksumCRC32C,checksum_crc32_c\nChecksumMode,checksum_mode\nChecksumSHA1,checksum_sha1\nChecksumSHA256,checksum_sha256\nChefConfiguration,chef_configuration\nChild,child\nChildBlock,child_block\nChildBlockId,child_block_id\nChildBlocks,child_blocks\nChildComponents,child_components\nChildHealthChecks,child_health_checks\nChildId,child_id\nChildJobsInState,child_jobs_in_state\nChildManifestName,child_manifest_name\nChildNotFoundException,child_not_found_exception\nChildReference,child_reference\nChildShard,child_shard\nChildShards,child_shards\nChildType,child_type\nChildWorkflowExecutionCanceledEventAttributes,child_workflow_execution_canceled_event_attributes\nChildWorkflowExecutionCompletedEventAttributes,child_workflow_execution_completed_event_attributes\nChildWorkflowExecutionFailedEventAttributes,child_workflow_execution_failed_event_attributes\nChildWorkflowExecutionStartedEventAttributes,child_workflow_execution_started_event_attributes\nChildWorkflowExecutionTerminatedEventAttributes,child_workflow_execution_terminated_event_attributes\nChildWorkflowExecutionTimedOutEventAttributes,child_workflow_execution_timed_out_event_attributes\nChildren,children\nChildrenOfAlarmName,children_of_alarm_name\nChimeBearer,chime_bearer\nChimeSdkMeetingConcatenationConfiguration,chime_sdk_meeting_concatenation_configuration\nChimeSdkMeetingConfiguration,chime_sdk_meeting_configuration\nChimeSdkMeetingLiveConnectorConfiguration,chime_sdk_meeting_live_connector_configuration\nChoice,choice\nChoiceAnswer,choice_answer\nChoiceAnswerSummaries,choice_answer_summaries\nChoiceAnswerSummary,choice_answer_summary\nChoiceAnswers,choice_answers\nChoiceContent,choice_content\nChoiceDescription,choice_description\nChoiceId,choice_id\nChoiceImprovementPlan,choice_improvement_plan\nChoiceTitle,choice_title\nChoiceUpdate,choice_update\nChoiceUpdates,choice_updates\nChoices,choices\nChromaSampling,chroma_sampling\nChunk,chunk\nChunkChecksum,chunk_checksum\nChunkChecksumAlgorithm,chunk_checksum_algorithm\nChunkIndex,chunk_index\nChunkList,chunk_list\nChunkToken,chunk_token\nChunksCount,chunks_count\nCidr,cidr\nCidrAllowList,cidr_allow_list\nCidrAllowedList,cidr_allowed_list\nCidrAuthorizationContext,cidr_authorization_context\nCidrBlock,cidr_block\nCidrBlockAssociation,cidr_block_association\nCidrBlockAssociationSet,cidr_block_association_set\nCidrBlockInUseException,cidr_block_in_use_exception\nCidrBlockSet,cidr_block_set\nCidrBlockState,cidr_block_state\nCidrBlockSummary,cidr_block_summary\nCidrBlocks,cidr_blocks\nCidrCollection,cidr_collection\nCidrCollectionAlreadyExistsException,cidr_collection_already_exists_exception\nCidrCollectionChange,cidr_collection_change\nCidrCollectionInUseException,cidr_collection_in_use_exception\nCidrCollectionVersionMismatchException,cidr_collection_version_mismatch_exception\nCidrCollections,cidr_collections\nCidrIp,cidr_ip\nCidrIps,cidr_ips\nCidrIpv4,cidr_ipv4\nCidrIpv6,cidr_ipv6\nCidrList,cidr_list\nCidrLocations,cidr_locations\nCidrRoutingConfig,cidr_routing_config\nCidrs,cidrs\nCifsShareCount,cifs_share_count\nCipher,cipher\nCipherText,cipher_text\nCiphers,ciphers\nCiphertextBlob,ciphertext_blob\nCiphertextForRecipient,ciphertext_for_recipient\nCircle,circle\nCisaData,cisa_data\nCity,city\nCityName,city_name\nClaim,claim\nClaimCode,claim_code\nClaimDeviceRequest,claim_device_request\nClaimDevicesByClaimCodeRequest,claim_devices_by_claim_code_request\nClaimDevicesByClaimCodeResponse,claim_devices_by_claim_code_response\nClaimFilterOption,claim_filter_option\nClaimGameServerInput,claim_game_server_input\nClaimGameServerOutput,claim_game_server_output\nClaimPhoneNumberRequest,claim_phone_number_request\nClaimPhoneNumberResponse,claim_phone_number_response\nClaimRegex,claim_regex\nClaimStatus,claim_status\nClaimedPhoneNumberSummary,claimed_phone_number_summary\nClapAtom,clap_atom\nClarifyCheck,clarify_check\nClarifyCheckStepMetadata,clarify_check_step_metadata\nClarifyExplainerConfig,clarify_explainer_config\nClarifyInferenceConfig,clarify_inference_config\nClarifyShapBaselineConfig,clarify_shap_baseline_config\nClarifyShapConfig,clarify_shap_config\nClarifyTextConfig,clarify_text_config\nClassBTimeout,class_b_timeout\nClassCTimeout,class_c_timeout\nClassName,class_name\nClasses,classes\nClassic,classic\nClassicLinkDnsSupport,classic_link_dns_support\nClassicLinkDnsSupported,classic_link_dns_supported\nClassicLinkEnabled,classic_link_enabled\nClassicLinkInstance,classic_link_instance\nClassicLinkVPCId,classic_link_vpc_id\nClassicLinkVPCSecurityGroups,classic_link_vpc_security_groups\nClassicLinkVpcId,classic_link_vpc_id\nClassicLinkVpcSecurityGroups,classic_link_vpc_security_groups\nClassicLoadBalancer,classic_load_balancer\nClassicLoadBalancerListener,classic_load_balancer_listener\nClassicLoadBalancers,classic_load_balancers\nClassicLoadBalancersConfig,classic_load_balancers_config\nClassification,classification\nClassificationDetails,classification_details\nClassificationExportConfiguration,classification_export_configuration\nClassificationResult,classification_result\nClassificationResultStatus,classification_result_status\nClassificationScopeSummary,classification_scope_summary\nClassificationStatus,classification_status\nClassificationType,classification_type\nClassificationTypeUpdate,classification_type_update\nClassifier,classifier\nClassifierEvaluationMetrics,classifier_evaluation_metrics\nClassifierMetadata,classifier_metadata\nClassifiers,classifiers\nClassifyDocumentRequest,classify_document_request\nClassifyDocumentResponse,classify_document_response\nCleanAmplifyApp,clean_amplify_app\nCleanSourceMetadataOnMismatch,clean_source_metadata_on_mismatch\nCleansedPhoneNumberE164,cleansed_phone_number_e164\nCleansedPhoneNumberNational,cleansed_phone_number_national\nClearAllocationDefaultNetmaskLength,clear_allocation_default_netmask_length\nClearQuerySuggestionsRequest,clear_query_suggestions_request\nClearTimerAction,clear_timer_action\nCliToken,cli_token\nClickFeedback,click_feedback\nClickFeedbackItems,click_feedback_items\nClickTime,click_time\nClientAffinity,client_affinity\nClientArn,client_arn\nClientAssociationMetadata,client_association_metadata\nClientAuthentication,client_authentication\nClientAuthenticationSettingInfo,client_authentication_setting_info\nClientAuthenticationSettingsInfo,client_authentication_settings_info\nClientBroker,client_broker\nClientCache,client_cache\nClientCertAuthSettings,client_cert_auth_settings\nClientCertificate,client_certificate\nClientCertificateId,client_certificate_id\nClientCertificateRevocationListStatus,client_certificate_revocation_list_status\nClientCertificates,client_certificates\nClientCidrBlock,client_cidr_block\nClientConfig,client_config\nClientConfiguration,client_configuration\nClientConfigurationVersion,client_configuration_version\nClientConfigurations,client_configurations\nClientConnectOptions,client_connect_options\nClientConnectResponseOptions,client_connect_response_options\nClientContext,client_context\nClientData,client_data\nClientDownloadLandingPage,client_download_landing_page\nClientException,client_exception\nClientID,client_id\nClientIDList,client_id_list\nClientIP,client_ip\nClientIPPreservationEnabled,client_ip_preservation_enabled\nClientId,client_id\nClientImpacting,client_impacting\nClientIp,client_ip\nClientLimitExceededException,client_limit_exceeded_exception\nClientList,client_list\nClientLoginBannerOptions,client_login_banner_options\nClientLoginBannerResponseOptions,client_login_banner_response_options\nClientMetadata,client_metadata\nClientName,client_name\nClientParameters,client_parameters\nClientPasswordAuthType,client_password_auth_type\nClientPolicy,client_policy\nClientPolicyTls,client_policy_tls\nClientProperties,client_properties\nClientPropertiesList,client_properties_list\nClientPropertiesResult,client_properties_result\nClientPublicKey,client_public_key\nClientRequestId,client_request_id\nClientRequestImpactStatistics,client_request_impact_statistics\nClientRequestToken,client_request_token\nClientRequestTokenRequiredException,client_request_token_required_exception\nClientRootCertificateChain,client_root_certificate_chain\nClientRootCertificateChainArn,client_root_certificate_chain_arn\nClientSdkVersion,client_sdk_version\nClientSecret,client_secret\nClientSessionId,client_session_id\nClientSideTimestamps,client_side_timestamps\nClientSubnet,client_subnet\nClientSubnets,client_subnets\nClientTimeoutException,client_timeout_exception\nClientToken,client_token\nClientTokenConflictException,client_token_conflict_exception\nClientTokenId,client_token_id\nClientTunnelAddress,client_tunnel_address\nClientVersion,client_version\nClientVpcConnection,client_vpc_connection\nClientVpcConnections,client_vpc_connections\nClientVpcIpAddress,client_vpc_ip_address\nClientVpnAuthentication,client_vpn_authentication\nClientVpnAuthenticationRequest,client_vpn_authentication_request\nClientVpnAuthorizationRuleStatus,client_vpn_authorization_rule_status\nClientVpnConnection,client_vpn_connection\nClientVpnConnectionStatus,client_vpn_connection_status\nClientVpnEndpoint,client_vpn_endpoint\nClientVpnEndpointAttributeStatus,client_vpn_endpoint_attribute_status\nClientVpnEndpointId,client_vpn_endpoint_id\nClientVpnEndpointIds,client_vpn_endpoint_ids\nClientVpnEndpointStatus,client_vpn_endpoint_status\nClientVpnEndpoints,client_vpn_endpoints\nClientVpnRoute,client_vpn_route\nClientVpnRouteStatus,client_vpn_route_status\nClientVpnTargetNetworks,client_vpn_target_networks\nClients,clients\nClip,clip\nClipFragmentSelector,clip_fragment_selector\nClipLimits,clip_limits\nClipRange,clip_range\nClipTimestampRange,clip_timestamp_range\nClockRate,clock_rate\nClockSync,clock_sync\nClocks,clocks\nCloneAppIds,clone_app_ids\nCloneBackendRequest,clone_backend_request\nCloneBackendResponse,clone_backend_response\nCloneGroupId,clone_group_id\nClonePermissions,clone_permissions\nCloneReceiptRuleSetRequest,clone_receipt_rule_set_request\nCloneStackRequest,clone_stack_request\nCloneStackResult,clone_stack_result\nCloseAccountRequest,close_account_request\nCloseInstancePublicPortsRequest,close_instance_public_ports_request\nCloseInstancePublicPortsResult,close_instance_public_ports_result\nCloseStatusFilter,close_status_filter\nCloseTime,close_time\nCloseTunnelRequest,close_tunnel_request\nClosed,closed\nClosedDays,closed_days\nClosedDaysRule,closed_days_rule\nCloudComponentStatus,cloud_component_status\nCloudFormation,cloud_formation\nCloudFormationCollection,cloud_formation_collection\nCloudFormationCollectionFilter,cloud_formation_collection_filter\nCloudFormationCostEstimationResourceCollectionFilter,cloud_formation_cost_estimation_resource_collection_filter\nCloudFormationHealth,cloud_formation_health\nCloudFormationOverridePropertyConfiguration,cloud_formation_override_property_configuration\nCloudFormationStackARN,cloud_formation_stack_arn\nCloudFormationStackArn,cloud_formation_stack_arn\nCloudFormationStackRecord,cloud_formation_stack_record\nCloudFormationStackRecordSourceInfo,cloud_formation_stack_record_source_info\nCloudFormationTarget,cloud_formation_target\nCloudFrontDefaultCertificate,cloud_front_default_certificate\nCloudFrontDistribution,cloud_front_distribution\nCloudFrontDomain,cloud_front_domain\nCloudFrontOriginAccessIdentity,cloud_front_origin_access_identity\nCloudFrontOriginAccessIdentityAlreadyExists,cloud_front_origin_access_identity_already_exists\nCloudFrontOriginAccessIdentityConfig,cloud_front_origin_access_identity_config\nCloudFrontOriginAccessIdentityInUse,cloud_front_origin_access_identity_in_use\nCloudFrontOriginAccessIdentityList,cloud_front_origin_access_identity_list\nCloudFrontOriginAccessIdentitySummary,cloud_front_origin_access_identity_summary\nCloudHsmAccessDeniedException,cloud_hsm_access_denied_exception\nCloudHsmClusterId,cloud_hsm_cluster_id\nCloudHsmClusterInUseException,cloud_hsm_cluster_in_use_exception\nCloudHsmClusterInvalidConfigurationException,cloud_hsm_cluster_invalid_configuration_exception\nCloudHsmClusterNotActiveException,cloud_hsm_cluster_not_active_exception\nCloudHsmClusterNotFoundException,cloud_hsm_cluster_not_found_exception\nCloudHsmClusterNotRelatedException,cloud_hsm_cluster_not_related_exception\nCloudHsmInternalException,cloud_hsm_internal_exception\nCloudHsmInternalFailureException,cloud_hsm_internal_failure_exception\nCloudHsmInvalidRequestException,cloud_hsm_invalid_request_exception\nCloudHsmResourceNotFoundException,cloud_hsm_resource_not_found_exception\nCloudHsmServiceException,cloud_hsm_service_exception\nCloudHsmTagException,cloud_hsm_tag_exception\nCloudLayout,cloud_layout\nCloudOnlyDirectoriesCurrentCount,cloud_only_directories_current_count\nCloudOnlyDirectoriesLimit,cloud_only_directories_limit\nCloudOnlyDirectoriesLimitReached,cloud_only_directories_limit_reached\nCloudOnlyMicrosoftADCurrentCount,cloud_only_microsoft_ad_current_count\nCloudOnlyMicrosoftADLimit,cloud_only_microsoft_ad_limit\nCloudOnlyMicrosoftADLimitReached,cloud_only_microsoft_ad_limit_reached\nCloudRemovalConfigInput,cloud_removal_config_input\nCloudTrail,cloud_trail\nCloudTrailARNInvalidException,cloud_trail_arn_invalid_exception\nCloudTrailAccessNotEnabledException,cloud_trail_access_not_enabled_exception\nCloudTrailConfigurationResult,cloud_trail_configuration_result\nCloudTrailDetails,cloud_trail_details\nCloudTrailEvent,cloud_trail_event\nCloudTrailInvalidClientTokenIdException,cloud_trail_invalid_client_token_id_exception\nCloudTrailProperties,cloud_trail_properties\nCloudWatchAlarmConfiguration,cloud_watch_alarm_configuration\nCloudWatchAlarmDefinition,cloud_watch_alarm_definition\nCloudWatchConfig,cloud_watch_config\nCloudWatchDashboard,cloud_watch_dashboard\nCloudWatchDashboards,cloud_watch_dashboards\nCloudWatchDestination,cloud_watch_destination\nCloudWatchDimensionConfiguration,cloud_watch_dimension_configuration\nCloudWatchEncryption,cloud_watch_encryption\nCloudWatchEncryptionEnabled,cloud_watch_encryption_enabled\nCloudWatchEncryptionMode,cloud_watch_encryption_mode\nCloudWatchEventDetailType,cloud_watch_event_detail_type\nCloudWatchEventId,cloud_watch_event_id\nCloudWatchEventSource,cloud_watch_event_source\nCloudWatchEventsExecutionDataDetails,cloud_watch_events_execution_data_details\nCloudWatchLogDeliveryOptions,cloud_watch_log_delivery_options\nCloudWatchLogDestination,cloud_watch_log_destination\nCloudWatchLogGroupARN,cloud_watch_log_group_arn\nCloudWatchLogGroupArn,cloud_watch_log_group_arn\nCloudWatchLogGroupLogDestination,cloud_watch_log_group_log_destination\nCloudWatchLogGroupName,cloud_watch_log_group_name\nCloudWatchLogOptions,cloud_watch_log_options\nCloudWatchLogOptionsSpecification,cloud_watch_log_options_specification\nCloudWatchLoggingConfiguration,cloud_watch_logging_configuration\nCloudWatchLoggingOption,cloud_watch_logging_option\nCloudWatchLoggingOptionDescription,cloud_watch_logging_option_description\nCloudWatchLoggingOptionDescriptions,cloud_watch_logging_option_descriptions\nCloudWatchLoggingOptionId,cloud_watch_logging_option_id\nCloudWatchLoggingOptionUpdate,cloud_watch_logging_option_update\nCloudWatchLoggingOptionUpdates,cloud_watch_logging_option_updates\nCloudWatchLoggingOptions,cloud_watch_logging_options\nCloudWatchLogs,cloud_watch_logs\nCloudWatchLogsConfig,cloud_watch_logs_config\nCloudWatchLogsConfiguration,cloud_watch_logs_configuration\nCloudWatchLogsConfigurationType,cloud_watch_logs_configuration_type\nCloudWatchLogsDeliveryUnavailableException,cloud_watch_logs_delivery_unavailable_exception\nCloudWatchLogsDestination,cloud_watch_logs_destination\nCloudWatchLogsDestinationConfig,cloud_watch_logs_destination_config\nCloudWatchLogsDestinationConfiguration,cloud_watch_logs_destination_configuration\nCloudWatchLogsDestinationDetails,cloud_watch_logs_destination_details\nCloudWatchLogsDetails,cloud_watch_logs_details\nCloudWatchLogsLogDelivery,cloud_watch_logs_log_delivery\nCloudWatchLogsLogDeliveryDescription,cloud_watch_logs_log_delivery_description\nCloudWatchLogsLogGroup,cloud_watch_logs_log_group\nCloudWatchLogsLogGroupArn,cloud_watch_logs_log_group_arn\nCloudWatchLogsLogStream,cloud_watch_logs_log_stream\nCloudWatchLogsParameters,cloud_watch_logs_parameters\nCloudWatchLogsRoleArn,cloud_watch_logs_role_arn\nCloudWatchMetrics,cloud_watch_metrics\nCloudWatchMetricsDataSummary,cloud_watch_metrics_data_summary\nCloudWatchMetricsDetail,cloud_watch_metrics_detail\nCloudWatchMetricsDimension,cloud_watch_metrics_dimension\nCloudWatchMetricsEnabled,cloud_watch_metrics_enabled\nCloudWatchMonitoringConfiguration,cloud_watch_monitoring_configuration\nCloudWatchOutputConfig,cloud_watch_output_config\nCloudWatchOutputEnabled,cloud_watch_output_enabled\nCloudWatchOutputUrl,cloud_watch_output_url\nCloudwatch,cloudwatch\nCloudwatchAlarmAction,cloudwatch_alarm_action\nCloudwatchLogGroup,cloudwatch_log_group\nCloudwatchLogStream,cloudwatch_log_stream\nCloudwatchLogsAction,cloudwatch_logs_action\nCloudwatchLogsExportConfiguration,cloudwatch_logs_export_configuration\nCloudwatchMetricAction,cloudwatch_metric_action\nCluster,cluster\nClusterAlreadyExistsFault,cluster_already_exists_fault\nClusterArn,cluster_arn\nClusterAssociatedToSchedule,cluster_associated_to_schedule\nClusterAvailabilityStatus,cluster_availability_status\nClusterBlockStorageLogicalUsed,cluster_block_storage_logical_used\nClusterBlockStorageSize,cluster_block_storage_size\nClusterBlockStorageUsed,cluster_block_storage_used\nClusterCertificate,cluster_certificate\nClusterCloudStorageUsed,cluster_cloud_storage_used\nClusterConfig,cluster_config\nClusterConfigStatus,cluster_config_status\nClusterConfiguration,cluster_configuration\nClusterContainsContainerInstancesException,cluster_contains_container_instances_exception\nClusterContainsServicesException,cluster_contains_services_exception\nClusterContainsTasksException,cluster_contains_tasks_exception\nClusterCreateTime,cluster_create_time\nClusterCredentials,cluster_credentials\nClusterCsr,cluster_csr\nClusterDbRevision,cluster_db_revision\nClusterDbRevisions,cluster_db_revisions\nClusterDbRevisionsMessage,cluster_db_revisions_message\nClusterDiscoveryEndpoint,cluster_discovery_endpoint\nClusterEnabled,cluster_enabled\nClusterEndpoint,cluster_endpoint\nClusterEndpointEncryptionType,cluster_endpoint_encryption_type\nClusterEndpoints,cluster_endpoints\nClusterExists,cluster_exists\nClusterExtendedCredentials,cluster_extended_credentials\nClusterHealth,cluster_health\nClusterIamRole,cluster_iam_role\nClusterId,cluster_id\nClusterIdentifier,cluster_identifier\nClusterInList,cluster_in_list\nClusterInfo,cluster_info\nClusterInfoList,cluster_info_list\nClusterIssue,cluster_issue\nClusterJDBCURL,cluster_jdbcurl\nClusterLimitExceededException,cluster_limit_exceeded_exception\nClusterListEntries,cluster_list_entries\nClusterListEntry,cluster_list_entry\nClusterLogging,cluster_logging\nClusterMarker,cluster_marker\nClusterMarkerConfiguration,cluster_marker_configuration\nClusterMetadata,cluster_metadata\nClusterMode,cluster_mode\nClusterName,cluster_name\nClusterNameFilter,cluster_name_filter\nClusterNames,cluster_names\nClusterNamespaceArn,cluster_namespace_arn\nClusterNode,cluster_node\nClusterNodes,cluster_nodes\nClusterNotFoundException,cluster_not_found_exception\nClusterNotFoundFault,cluster_not_found_fault\nClusterOnLatestRevisionFault,cluster_on_latest_revision_fault\nClusterOperationArn,cluster_operation_arn\nClusterOperationInfo,cluster_operation_info\nClusterOperationInfoList,cluster_operation_info_list\nClusterOperationStep,cluster_operation_step\nClusterOperationStepInfo,cluster_operation_step_info\nClusterOperationV2,cluster_operation_v2\nClusterOperationV2Provisioned,cluster_operation_v2_provisioned\nClusterOperationV2Serverless,cluster_operation_v2_serverless\nClusterOperationV2Summary,cluster_operation_v2_summary\nClusterParameterGroup,cluster_parameter_group\nClusterParameterGroupAlreadyExistsFault,cluster_parameter_group_already_exists_fault\nClusterParameterGroupDetails,cluster_parameter_group_details\nClusterParameterGroupFamily,cluster_parameter_group_family\nClusterParameterGroupName,cluster_parameter_group_name\nClusterParameterGroupNameMessage,cluster_parameter_group_name_message\nClusterParameterGroupNotFoundFault,cluster_parameter_group_not_found_fault\nClusterParameterGroupQuotaExceededFault,cluster_parameter_group_quota_exceeded_fault\nClusterParameterGroupStatus,cluster_parameter_group_status\nClusterParameterGroups,cluster_parameter_groups\nClusterParameterGroupsMessage,cluster_parameter_groups_message\nClusterParameterStatus,cluster_parameter_status\nClusterParameterStatusList,cluster_parameter_status_list\nClusterPendingModifiedValues,cluster_pending_modified_values\nClusterPendingUpdates,cluster_pending_updates\nClusterPublicKey,cluster_public_key\nClusterQuotaExceededFault,cluster_quota_exceeded_fault\nClusterQuotaForCustomerExceededFault,cluster_quota_for_customer_exceeded_fault\nClusterRevisionNumber,cluster_revision_number\nClusterRoleArn,cluster_role_arn\nClusterSecurityGroup,cluster_security_group\nClusterSecurityGroupAlreadyExistsFault,cluster_security_group_already_exists_fault\nClusterSecurityGroupMembership,cluster_security_group_membership\nClusterSecurityGroupMessage,cluster_security_group_message\nClusterSecurityGroupName,cluster_security_group_name\nClusterSecurityGroupNotFoundFault,cluster_security_group_not_found_fault\nClusterSecurityGroupQuotaExceededFault,cluster_security_group_quota_exceeded_fault\nClusterSecurityGroups,cluster_security_groups\nClusterServiceConnectDefaults,cluster_service_connect_defaults\nClusterServiceConnectDefaultsRequest,cluster_service_connect_defaults_request\nClusterSetting,cluster_setting\nClusterSettings,cluster_settings\nClusterSnapshot,cluster_snapshot\nClusterSnapshotAlreadyExistsFault,cluster_snapshot_already_exists_fault\nClusterSnapshotCopyStatus,cluster_snapshot_copy_status\nClusterSnapshotInList,cluster_snapshot_in_list\nClusterSnapshotNotFoundFault,cluster_snapshot_not_found_fault\nClusterSnapshotQuotaExceededFault,cluster_snapshot_quota_exceeded_fault\nClusterState,cluster_state\nClusterStateChangeReason,cluster_state_change_reason\nClusterStates,cluster_states\nClusterStatus,cluster_status\nClusterSubnetGroup,cluster_subnet_group\nClusterSubnetGroupAlreadyExistsFault,cluster_subnet_group_already_exists_fault\nClusterSubnetGroupMessage,cluster_subnet_group_message\nClusterSubnetGroupName,cluster_subnet_group_name\nClusterSubnetGroupNotFoundFault,cluster_subnet_group_not_found_fault\nClusterSubnetGroupQuotaExceededFault,cluster_subnet_group_quota_exceeded_fault\nClusterSubnetGroups,cluster_subnet_groups\nClusterSubnetQuotaExceededFault,cluster_subnet_quota_exceeded_fault\nClusterSummary,cluster_summary\nClusterTimeline,cluster_timeline\nClusterType,cluster_type\nClusterTypeFilter,cluster_type_filter\nClusterUuid,cluster_uuid\nClusterVersion,cluster_version\nClusterVersions,cluster_versions\nClusterVersionsMessage,cluster_versions_message\nClusteringKey,clustering_key\nClusters,clusters\nClustersMessage,clusters_message\nCmafAdditionalManifest,cmaf_additional_manifest\nCmafEncryption,cmaf_encryption\nCmafEncryptionMethod,cmaf_encryption_method\nCmafEncryptionSettings,cmaf_encryption_settings\nCmafGroupSettings,cmaf_group_settings\nCmafImageBasedTrickPlaySettings,cmaf_image_based_trick_play_settings\nCmafPackage,cmaf_package\nCmafPackageCreateOrUpdateParameters,cmaf_package_create_or_update_parameters\nCmfcSettings,cmfc_settings\nCmkArn,cmk_arn\nCmkType,cmk_type\nCname,cname\nCoIp,co_ip\nCode,code\nCodeArtifacts,code_artifacts\nCodeBlock,code_block\nCodeBuildNotInServiceRegionException,code_build_not_in_service_region_exception\nCodeBuildServiceRole,code_build_service_role\nCodeCommit,code_commit\nCodeCommitCodeDestination,code_commit_code_destination\nCodeCommitRepository,code_commit_repository\nCodeConfiguration,code_configuration\nCodeConfigurationValues,code_configuration_values\nCodeContent,code_content\nCodeContentDescription,code_content_description\nCodeContentType,code_content_type\nCodeContentTypeUpdate,code_content_type_update\nCodeContentUpdate,code_content_update\nCodeCoverage,code_coverage\nCodeCoverageReportSummary,code_coverage_report_summary\nCodeDeliveryDetails,code_delivery_details\nCodeDeliveryDetailsList,code_delivery_details_list\nCodeDeliveryDetailsType,code_delivery_details_type\nCodeDeliveryFailureException,code_delivery_failure_exception\nCodeDeployApplication,code_deploy_application\nCodeDeployDeploymentGroup,code_deploy_deployment_group\nCodeDeployDeploymentId,code_deploy_deployment_id\nCodeDeployInstanceGroupId,code_deploy_instance_group_id\nCodeDeployState,code_deploy_state\nCodeDestination,code_destination\nCodeError,code_error\nCodeErrorLocation,code_error_location\nCodeFilePath,code_file_path\nCodeGenConfigurationNode,code_gen_configuration_node\nCodeGenConfigurationNodes,code_gen_configuration_nodes\nCodeGenEdge,code_gen_edge\nCodeGenNode,code_gen_node\nCodeGenNodeArg,code_gen_node_arg\nCodeHook,code_hook\nCodeHookSpecification,code_hook_specification\nCodeLength,code_length\nCodeLine,code_line\nCodeLineCount,code_line_count\nCodeMD5,code_md5\nCodeMismatchException,code_mismatch_exception\nCodeRepositories,code_repositories\nCodeRepository,code_repository\nCodeRepositoryArn,code_repository_arn\nCodeRepositoryName,code_repository_name\nCodeRepositorySummary,code_repository_summary\nCodeRepositorySummaryList,code_repository_summary_list\nCodeReview,code_review\nCodeReviewArn,code_review_arn\nCodeReviewSummaries,code_review_summaries\nCodeReviewSummary,code_review_summary\nCodeReviewType,code_review_type\nCodeSha256,code_sha256\nCodeSigning,code_signing\nCodeSigningCertificateChain,code_signing_certificate_chain\nCodeSigningConfig,code_signing_config\nCodeSigningConfigArn,code_signing_config_arn\nCodeSigningConfigId,code_signing_config_id\nCodeSigningConfigNotFoundException,code_signing_config_not_found_exception\nCodeSigningConfigs,code_signing_configs\nCodeSigningPolicies,code_signing_policies\nCodeSigningSignature,code_signing_signature\nCodeSize,code_size\nCodeSizeUnzipped,code_size_unzipped\nCodeSizeZipped,code_size_zipped\nCodeSnippetError,code_snippet_error\nCodeSnippetResult,code_snippet_result\nCodeSource,code_source\nCodeStar,code_star\nCodeStarParameters,code_star_parameters\nCodeStorageExceededException,code_storage_exceeded_exception\nCodeValidationException,code_validation_exception\nCodeVerificationFailedException,code_verification_failed_exception\nCodeVulnerabilities,code_vulnerabilities\nCodeVulnerabilitiesFilePath,code_vulnerabilities_file_path\nCodeVulnerabilityDetails,code_vulnerability_details\nCodec,codec\nCodecLevel,codec_level\nCodecOptions,codec_options\nCodecProfile,codec_profile\nCodecSettings,codec_settings\nCodecSpecification,codec_specification\nCodegenDependency,codegen_dependency\nCodegenFeatureFlags,codegen_feature_flags\nCodegenGenericDataEnum,codegen_generic_data_enum\nCodegenGenericDataField,codegen_generic_data_field\nCodegenGenericDataModel,codegen_generic_data_model\nCodegenGenericDataNonModel,codegen_generic_data_non_model\nCodegenGenericDataRelationshipType,codegen_generic_data_relationship_type\nCodegenJob,codegen_job\nCodegenJobAsset,codegen_job_asset\nCodegenJobGenericDataSchema,codegen_job_generic_data_schema\nCodegenJobSummary,codegen_job_summary\nCodingMode,coding_mode\nCognitoConfig,cognito_config\nCognitoEnabled,cognito_enabled\nCognitoIdentityProvider,cognito_identity_provider\nCognitoIdentityProviders,cognito_identity_providers\nCognitoMemberDefinition,cognito_member_definition\nCognitoOptions,cognito_options\nCognitoOptionsStatus,cognito_options_status\nCognitoStreams,cognito_streams\nCognitoUserPoolConfig,cognito_user_pool_config\nCognitoUserPoolConfiguration,cognito_user_pool_configuration\nCognitoUserPoolId,cognito_user_pool_id\nCohortId,cohort_id\nCoipAddressUsage,coip_address_usage\nCoipAddressUsages,coip_address_usages\nCoipCidr,coip_cidr\nCoipPool,coip_pool\nCoipPoolId,coip_pool_id\nCoipPools,coip_pools\nColdStorageOptions,cold_storage_options\nCollaboration,collaboration\nCollaborationAnalysisTemplate,collaboration_analysis_template\nCollaborationAnalysisTemplateSummary,collaboration_analysis_template_summary\nCollaborationSummary,collaboration_summary\nCollapseId,collapse_id\nCollapseKey,collapse_key\nCollapseStateOptions,collapse_state_options\nCollapsedRowDimensionsVisibility,collapsed_row_dimensions_visibility\nCollection,collection\nCollectionARN,collection_arn\nCollectionArn,collection_arn\nCollectionConfig,collection_config\nCollectionConfiguration,collection_configuration\nCollectionConfigurations,collection_configurations\nCollectionDetail,collection_detail\nCollectionDurationMinutes,collection_duration_minutes\nCollectionEndpoint,collection_endpoint\nCollectionErrorDetail,collection_error_detail\nCollectionFilters,collection_filters\nCollectionId,collection_id\nCollectionIds,collection_ids\nCollectionName,collection_name\nCollectionParameters,collection_parameters\nCollectionSummary,collection_summary\nCollectionType,collection_type\nCollectionVersion,collection_version\nCollections,collections\nCollectiveConstant,collective_constant\nCollector,collector\nCollectorHealthCheck,collector_health_check\nCollectorName,collector_name\nCollectorNotFoundFault,collector_not_found_fault\nCollectorReferencedId,collector_referenced_id\nCollectorResponse,collector_response\nCollectorShortInfoResponse,collector_short_info_response\nCollectorStatus,collector_status\nCollectorVersion,collector_version\nCollectors,collectors\nColor,color\nColorAxis,color_axis\nColorCorrector,color_corrector\nColorFillType,color_fill_type\nColorItemsLimit,color_items_limit\nColorItemsLimitConfiguration,color_items_limit_configuration\nColorLabelOptions,color_label_options\nColorMap,color_map\nColorMetadata,color_metadata\nColorRange,color_range\nColorScale,color_scale\nColorSort,color_sort\nColorSpace,color_space\nColorSpaceConversion,color_space_conversion\nColorSpacePassthroughSettings,color_space_passthrough_settings\nColorSpaceSettings,color_space_settings\nColorSpaceUsage,color_space_usage\nColorimetry,colorimetry\nColors,colors\nColorsConfiguration,colors_configuration\nColumn,column\nColumnConfiguration,column_configuration\nColumnConfigurations,column_configurations\nColumnDataRole,column_data_role\nColumnDefinition,column_definition\nColumnDepth,column_depth\nColumnDescription,column_description\nColumnError,column_error\nColumnFormat,column_format\nColumnFriendlyName,column_friendly_name\nColumnGeographicRole,column_geographic_role\nColumnGroup,column_group\nColumnGroupColumnSchema,column_group_column_schema\nColumnGroupColumnSchemaList,column_group_column_schema_list\nColumnGroupSchema,column_group_schema\nColumnGroupSchemaList,column_group_schema_list\nColumnGroups,column_groups\nColumnHeaderStyle,column_header_style\nColumnHierarchies,column_hierarchies\nColumnHierarchy,column_hierarchy\nColumnId,column_id\nColumnIdentifier,column_identifier\nColumnImportance,column_importance\nColumnImportances,column_importances\nColumnIndex,column_index\nColumnInfo,column_info\nColumnLFTag,column_lf_tag\nColumnLabelOptions,column_label_options\nColumnLevelPermissionRule,column_level_permission_rule\nColumnLevelPermissionRules,column_level_permission_rules\nColumnLevelPermissionRulesApplied,column_level_permission_rules_applied\nColumnList,column_list\nColumnMetadata,column_metadata\nColumnName,column_name\nColumnNames,column_names\nColumnNamesVisibility,column_names_visibility\nColumnRange,column_range\nColumnRowFilter,column_row_filter\nColumnSchema,column_schema\nColumnSchemaList,column_schema_list\nColumnSelector,column_selector\nColumnSelectors,column_selectors\nColumnSeparator,column_separator\nColumnSort,column_sort\nColumnSpan,column_span\nColumnStatistics,column_statistics\nColumnStatisticsConfiguration,column_statistics_configuration\nColumnStatisticsConfigurations,column_statistics_configurations\nColumnStatisticsData,column_statistics_data\nColumnStatisticsError,column_statistics_error\nColumnStatisticsList,column_statistics_list\nColumnSubtotalOptions,column_subtotal_options\nColumnSynonyms,column_synonyms\nColumnTag,column_tag\nColumnToJsonKeyMappings,column_to_json_key_mappings\nColumnToMatch,column_to_match\nColumnTooltipItem,column_tooltip_item\nColumnTotalOptions,column_total_options\nColumnType,column_type\nColumnWildcard,column_wildcard\nColumns,columns\nComboChartAggregatedFieldWells,combo_chart_aggregated_field_wells\nComboChartConfiguration,combo_chart_configuration\nComboChartFieldWells,combo_chart_field_wells\nComboChartSortConfiguration,combo_chart_sort_configuration\nComboChartVisual,combo_chart_visual\nCommand,command\nCommandFilter,command_filter\nCommandId,command_id\nCommandIds,command_ids\nCommandInvocation,command_invocation\nCommandInvocations,command_invocations\nCommandPlugin,command_plugin\nCommandPlugins,command_plugins\nCommands,commands\nComment,comment\nCommentContent,comment_content\nCommentContentRequiredException,comment_content_required_exception\nCommentContentSizeLimitExceededException,comment_content_size_limit_exceeded_exception\nCommentDeletedException,comment_deleted_exception\nCommentDoesNotExistException,comment_does_not_exist_exception\nCommentFieldMappings,comment_field_mappings\nCommentId,comment_id\nCommentIdRequiredException,comment_id_required_exception\nCommentMetadata,comment_metadata\nCommentNotCreatedByCallerException,comment_not_created_by_caller_exception\nCommentStatus,comment_status\nComments,comments\nCommentsForComparedCommit,comments_for_compared_commit\nCommentsForPullRequest,comments_for_pull_request\nCommit,commit\nCommitDiff,commit_diff\nCommitDiffSourceCodeType,commit_diff_source_code_type\nCommitDigest,commit_digest\nCommitDoesNotExistException,commit_does_not_exist_exception\nCommitId,commit_id\nCommitIdDoesNotExistException,commit_id_does_not_exist_exception\nCommitIdRequiredException,commit_id_required_exception\nCommitIdsLimitExceededException,commit_ids_limit_exceeded_exception\nCommitIdsListRequiredException,commit_ids_list_required_exception\nCommitMessage,commit_message\nCommitMessageLengthExceededException,commit_message_length_exceeded_exception\nCommitRequiredException,commit_required_exception\nCommitTransaction,commit_transaction\nCommitTransactionRequest,commit_transaction_request\nCommitTransactionResponse,commit_transaction_response\nCommitTransactionResult,commit_transaction_result\nCommitment,commitment\nCommitmentConfiguration,commitment_configuration\nCommitmentInformation,commitment_information\nCommonAttributes,common_attributes\nCommonName,common_name\nCommonPrefix,common_prefix\nCommonPrefixes,common_prefixes\nCommsProtocol,comms_protocol\nCommunication,communication\nCommunicationTypeOptions,communication_type_options\nCompUpdate,comp_update\nCompany,company\nCompanyCode,company_code\nCompanyName,company_name\nComparativeOrder,comparative_order\nComparator,comparator\nCompareFacesMatch,compare_faces_match\nCompareFacesRequest,compare_faces_request\nCompareFacesResponse,compare_faces_response\nComparedFace,compared_face\nComparedSourceImageFace,compared_source_image_face\nComparison,comparison\nComparisonConfiguration,comparison_configuration\nComparisonFormat,comparison_format\nComparisonFormatConfiguration,comparison_format_configuration\nComparisonMethod,comparison_method\nComparisonOperator,comparison_operator\nComparisonType,comparison_type\nComparisonValue,comparison_value\nComparisonValues,comparison_values\nCompatibility,compatibility\nCompatibleArchitecture,compatible_architecture\nCompatibleArchitectures,compatible_architectures\nCompatibleElasticsearchVersions,compatible_elasticsearch_versions\nCompatibleEnvironmentTemplate,compatible_environment_template\nCompatibleEnvironmentTemplateInput,compatible_environment_template_input\nCompatibleImage,compatible_image\nCompatibleImages,compatible_images\nCompatibleKafkaVersion,compatible_kafka_version\nCompatibleKafkaVersions,compatible_kafka_versions\nCompatibleNodes,compatible_nodes\nCompatibleRuntime,compatible_runtime\nCompatibleRuntimes,compatible_runtimes\nCompatibleVersions,compatible_versions\nCompatibleVersionsMap,compatible_versions_map\nCompilationEndTime,compilation_end_time\nCompilationJobArn,compilation_job_arn\nCompilationJobName,compilation_job_name\nCompilationJobStatus,compilation_job_status\nCompilationJobSummaries,compilation_job_summaries\nCompilationJobSummary,compilation_job_summary\nCompilationStartTime,compilation_start_time\nCompilationTargetDevice,compilation_target_device\nCompilationTargetPlatformAccelerator,compilation_target_platform_accelerator\nCompilationTargetPlatformArch,compilation_target_platform_arch\nCompilationTargetPlatformOs,compilation_target_platform_os\nCompiledOutputConfig,compiled_output_config\nCompilerOptions,compiler_options\nComplaint,complaint\nComplaintFeedbackType,complaint_feedback_type\nComplaintSubType,complaint_sub_type\nComplaintTopic,complaint_topic\nComplaints,complaints\nComplete,complete\nCompleteAttachmentUploadRequest,complete_attachment_upload_request\nCompleteLayerUploadRequest,complete_layer_upload_request\nCompleteLayerUploadResponse,complete_layer_upload_response\nCompleteLifecycleActionType,complete_lifecycle_action_type\nCompleteMigrationMessage,complete_migration_message\nCompleteMigrationResponse,complete_migration_response\nCompleteMultipartReadSetUploadRequest,complete_multipart_read_set_upload_request\nCompleteMultipartReadSetUploadResponse,complete_multipart_read_set_upload_response\nCompleteMultipartUploadInput,complete_multipart_upload_input\nCompleteMultipartUploadOutput,complete_multipart_upload_output\nCompleteMultipartUploadRequest,complete_multipart_upload_request\nCompleteOnConvergence,complete_on_convergence\nCompleteReadSetUploadPartListItem,complete_read_set_upload_part_list_item\nCompleteSnapshotRequest,complete_snapshot_request\nCompleteSnapshotResponse,complete_snapshot_response\nCompleteTime,complete_time\nCompleteVaultLockInput,complete_vault_lock_input\nCompleteWindowMinutes,complete_window_minutes\nCompleteWorkflowExecutionDecisionAttributes,complete_workflow_execution_decision_attributes\nCompleteWorkflowExecutionFailedEventAttributes,complete_workflow_execution_failed_event_attributes\nCompleted,completed\nCompletedAt,completed_at\nCompletedCount,completed_count\nCompletedDate,completed_date\nCompletedMultipartUpload,completed_multipart_upload\nCompletedOn,completed_on\nCompletedPart,completed_part\nCompletedPieces,completed_pieces\nCompletedProperties,completed_properties\nCompletedTimestamp,completed_timestamp\nCompletionCriteria,completion_criteria\nCompletionDate,completion_date\nCompletionDateTime,completion_date_time\nCompletionMessage,completion_message\nCompletionReport,completion_report\nCompletionStatus,completion_status\nCompletionTime,completion_time\nCompletionWindowMinutes,completion_window_minutes\nComplexity,complexity\nCompliance,compliance\nComplianceAssociatedStandardsId,compliance_associated_standards_id\nComplianceByConfigRule,compliance_by_config_rule\nComplianceByConfigRules,compliance_by_config_rules\nComplianceByResource,compliance_by_resource\nComplianceByResources,compliance_by_resources\nComplianceContributorCount,compliance_contributor_count\nComplianceDetails,compliance_details\nComplianceDrift,compliance_drift\nComplianceExecutionSummary,compliance_execution_summary\nComplianceItem,compliance_item\nComplianceItemEntry,compliance_item_entry\nComplianceItems,compliance_items\nComplianceLevel,compliance_level\nComplianceResourceId,compliance_resource_id\nComplianceResourceIds,compliance_resource_ids\nComplianceResourceType,compliance_resource_type\nComplianceResourceTypes,compliance_resource_types\nComplianceSecurityControlId,compliance_security_control_id\nComplianceSeverity,compliance_severity\nComplianceStatus,compliance_status\nComplianceStringFilter,compliance_string_filter\nComplianceSummariesByResourceType,compliance_summaries_by_resource_type\nComplianceSummary,compliance_summary\nComplianceSummaryByResourceType,compliance_summary_by_resource_type\nComplianceSummaryItem,compliance_summary_item\nComplianceSummaryItems,compliance_summary_items\nComplianceSummaryTimestamp,compliance_summary_timestamp\nComplianceType,compliance_type\nComplianceTypeCountLimitExceededException,compliance_type_count_limit_exceeded_exception\nComplianceTypes,compliance_types\nComplianceViolator,compliance_violator\nCompliantConformancePackCount,compliant_conformance_pack_count\nCompliantCount,compliant_count\nCompliantCriticalCount,compliant_critical_count\nCompliantHighCount,compliant_high_count\nCompliantInformationalCount,compliant_informational_count\nCompliantLowCount,compliant_low_count\nCompliantMediumCount,compliant_medium_count\nCompliantResourceCount,compliant_resource_count\nCompliantRuleCount,compliant_rule_count\nCompliantSummary,compliant_summary\nCompliantUnspecifiedCount,compliant_unspecified_count\nComponent,component\nComponentAccount,component_account\nComponentArn,component_arn\nComponentBindingPropertiesValue,component_binding_properties_value\nComponentBindingPropertiesValueProperties,component_binding_properties_value_properties\nComponentCandidate,component_candidate\nComponentChild,component_child\nComponentConditionProperty,component_condition_property\nComponentConfiguration,component_configuration\nComponentConfigurationUpdate,component_configuration_update\nComponentDataConfiguration,component_data_configuration\nComponentDependencyRequirement,component_dependency_requirement\nComponentDeploymentSpecification,component_deployment_specification\nComponentDescription,component_description\nComponentEvent,component_event\nComponentId,component_id\nComponentLatestVersion,component_latest_version\nComponentName,component_name\nComponentParameter,component_parameter\nComponentParameterDetail,component_parameter_detail\nComponentPlatform,component_platform\nComponentProperty,component_property\nComponentPropertyBindingProperties,component_property_binding_properties\nComponentPropertyGroupRequest,component_property_group_request\nComponentPropertyGroupResponse,component_property_group_response\nComponentRecommendation,component_recommendation\nComponentRegion,component_region\nComponentRemarks,component_remarks\nComponentRequest,component_request\nComponentResponse,component_response\nComponentRunWith,component_run_with\nComponentState,component_state\nComponentStatusData,component_status_data\nComponentSummary,component_summary\nComponentTimestampDelimiter,component_timestamp_delimiter\nComponentType,component_type\nComponentTypeSummary,component_type_summary\nComponentUpdateRequest,component_update_request\nComponentVariant,component_variant\nComponentVersion,component_version\nComponentVersionArn,component_version_arn\nComponentVersionListItem,component_version_list_item\nComponents,components\nComposeEnvironmentsMessage,compose_environments_message\nCompositeAlarm,composite_alarm\nCompositeAlarms,composite_alarms\nCompositeMemberIdentifier,composite_member_identifier\nCompositeModelProperty,composite_model_property\nCompositePartitionKey,composite_partition_key\nCompositeSlotTypeSetting,composite_slot_type_setting\nCompositedVideo,composited_video\nCompositedVideoArtifactsConfiguration,composited_video_artifacts_configuration\nCompositedVideoConcatenationConfiguration,composited_video_concatenation_configuration\nComposition,composition\nComprehendMedicalAsyncJobFilter,comprehend_medical_async_job_filter\nComprehendMedicalAsyncJobProperties,comprehend_medical_async_job_properties\nComprehendMedicalAsyncJobPropertiesList,comprehend_medical_async_job_properties_list\nCompress,compress\nCompressed,compressed\nCompression,compression\nCompressionFactor,compression_factor\nCompressionFormat,compression_format\nCompressionType,compression_type\nCompromisedCredentialsActionsType,compromised_credentials_actions_type\nCompromisedCredentialsDetected,compromised_credentials_detected\nCompromisedCredentialsRiskConfiguration,compromised_credentials_risk_configuration\nCompromisedCredentialsRiskConfigurationType,compromised_credentials_risk_configuration_type\nComputation,computation\nComputationId,computation_id\nComputationPreference,computation_preference\nComputations,computations\nCompute,compute\nComputeArn,compute_arn\nComputeAttributes,compute_attributes\nComputeCapacity,compute_capacity\nComputeCapacityStatus,compute_capacity_status\nComputeConfig,compute_config\nComputeEnvironmentDetail,compute_environment_detail\nComputeEnvironmentOrder,compute_environment_order\nComputeFarmConfiguration,compute_farm_configuration\nComputeLimits,compute_limits\nComputeList,compute_list\nComputeName,compute_name\nComputeResource,compute_resource\nComputeResourceUpdate,compute_resource_update\nComputeResponse,compute_response\nComputeStatistics,compute_statistics\nComputeStatus,compute_status\nComputeTime,compute_time\nComputeType,compute_type\nComputeTypeName,compute_type_name\nComputeUtilization,compute_utilization\nComputer,computer\nComputerAttributes,computer_attributes\nComputerId,computer_id\nComputerName,computer_name\nConcatenationSink,concatenation_sink\nConcatenationSource,concatenation_source\nConcurrency,concurrency\nConcurrentAccessException,concurrent_access_exception\nConcurrentDeploymentException,concurrent_deployment_exception\nConcurrentExecutionRatePercentage,concurrent_execution_rate_percentage\nConcurrentExecutions,concurrent_executions\nConcurrentLimitExceededException,concurrent_limit_exceeded_exception\nConcurrentModification,concurrent_modification\nConcurrentModificationException,concurrent_modification_exception\nConcurrentOperationException,concurrent_operation_exception\nConcurrentReferenceUpdateException,concurrent_reference_update_exception\nConcurrentRunsExceededException,concurrent_runs_exceeded_exception\nConcurrentUpdateException,concurrent_update_exception\nConcurrentUpdatingException,concurrent_updating_exception\nCondition,condition\nConditionBasedCollectionScheme,condition_based_collection_scheme\nConditionCheck,condition_check\nConditionCheckFailureException,condition_check_failure_exception\nConditionDocumentAttributeKey,condition_document_attribute_key\nConditionExpression,condition_expression\nConditionExpressions,condition_expressions\nConditionKey,condition_key\nConditionOnValue,condition_on_value\nConditionParameter,condition_parameter\nConditionStepMetadata,condition_step_metadata\nConditionType,condition_type\nConditionValue,condition_value\nConditionalBranch,conditional_branch\nConditionalCheckFailedException,conditional_check_failed_exception\nConditionalFormatting,conditional_formatting\nConditionalFormattingColor,conditional_formatting_color\nConditionalFormattingCustomIconCondition,conditional_formatting_custom_icon_condition\nConditionalFormattingCustomIconOptions,conditional_formatting_custom_icon_options\nConditionalFormattingGradientColor,conditional_formatting_gradient_color\nConditionalFormattingIcon,conditional_formatting_icon\nConditionalFormattingIconDisplayConfiguration,conditional_formatting_icon_display_configuration\nConditionalFormattingIconSet,conditional_formatting_icon_set\nConditionalFormattingOptions,conditional_formatting_options\nConditionalFormattingSolidColor,conditional_formatting_solid_color\nConditionalForwarder,conditional_forwarder\nConditionalForwarderIpAddrs,conditional_forwarder_ip_addrs\nConditionalForwarders,conditional_forwarders\nConditionalOperator,conditional_operator\nConditionalSpecification,conditional_specification\nConditionalSplit,conditional_split\nConditionalSplitActivity,conditional_split_activity\nConditionalToken,conditional_token\nConditions,conditions\nConferencePreference,conference_preference\nConferenceProvider,conference_provider\nConferenceProviderArn,conference_provider_arn\nConferenceProviderName,conference_provider_name\nConferenceProviderType,conference_provider_type\nConferenceProviders,conference_providers\nConfidence,confidence\nConfidenceScore,confidence_score\nConfig,config\nConfigCred,config_cred\nConfigDeliveryS3DestinationArn,config_delivery_s3_destination_arn\nConfigExportDeliveryInfo,config_export_delivery_info\nConfigFile,config_file\nConfigFileState,config_file_state\nConfigId,config_id\nConfigIdResponse,config_id_response\nConfigListItem,config_list_item\nConfigParameter,config_parameter\nConfigRecommendation,config_recommendation\nConfigRule,config_rule\nConfigRuleArn,config_rule_arn\nConfigRuleComplianceFilters,config_rule_compliance_filters\nConfigRuleComplianceSummaryFilters,config_rule_compliance_summary_filters\nConfigRuleEvaluationStatus,config_rule_evaluation_status\nConfigRuleId,config_rule_id\nConfigRuleInvokedTime,config_rule_invoked_time\nConfigRuleName,config_rule_name\nConfigRuleNames,config_rule_names\nConfigRuleState,config_rule_state\nConfigRules,config_rules\nConfigRulesEvaluationStatus,config_rules_evaluation_status\nConfigSnapshotDeliveryProperties,config_snapshot_delivery_properties\nConfigStreamDeliveryInfo,config_stream_delivery_info\nConfigType,config_type\nConfigUri,config_uri\nConfiguration,configuration\nConfigurationAggregator,configuration_aggregator\nConfigurationAggregatorArn,configuration_aggregator_arn\nConfigurationAggregatorName,configuration_aggregator_name\nConfigurationAggregatorNames,configuration_aggregator_names\nConfigurationAggregators,configuration_aggregators\nConfigurationAlias,configuration_alias\nConfigurationAliases,configuration_aliases\nConfigurationArn,configuration_arn\nConfigurationEndpoint,configuration_endpoint\nConfigurationErrorDetails,configuration_error_details\nConfigurationEvent,configuration_event\nConfigurationException,configuration_exception\nConfigurationId,configuration_id\nConfigurationInfo,configuration_info\nConfigurationItem,configuration_item\nConfigurationLocationUri,configuration_location_uri\nConfigurationManager,configuration_manager\nConfigurationManagers,configuration_managers\nConfigurationName,configuration_name\nConfigurationOptionDescription,configuration_option_description\nConfigurationOptionSetting,configuration_option_setting\nConfigurationOptionsDescription,configuration_options_description\nConfigurationOverrides,configuration_overrides\nConfigurationProfile,configuration_profile\nConfigurationProfileId,configuration_profile_id\nConfigurationProfileIdentifier,configuration_profile_identifier\nConfigurationProfileSummary,configuration_profile_summary\nConfigurationProfiles,configuration_profiles\nConfigurationRecorder,configuration_recorder\nConfigurationRecorderName,configuration_recorder_name\nConfigurationRecorderNames,configuration_recorder_names\nConfigurationRecorderStatus,configuration_recorder_status\nConfigurationRecorders,configuration_recorders\nConfigurationRecordersStatus,configuration_recorders_status\nConfigurationRevision,configuration_revision\nConfigurationSchema,configuration_schema\nConfigurationSet,configuration_set\nConfigurationSetAlreadyExistsException,configuration_set_already_exists_exception\nConfigurationSetArn,configuration_set_arn\nConfigurationSetAttributeNames,configuration_set_attribute_names\nConfigurationSetDoesNotExistException,configuration_set_does_not_exist_exception\nConfigurationSetFilter,configuration_set_filter\nConfigurationSetInformation,configuration_set_information\nConfigurationSetName,configuration_set_name\nConfigurationSetNames,configuration_set_names\nConfigurationSetSendingPausedException,configuration_set_sending_paused_exception\nConfigurationSets,configuration_sets\nConfigurationSettings,configuration_settings\nConfigurationSettingsDescription,configuration_settings_description\nConfigurationSettingsDescriptions,configuration_settings_descriptions\nConfigurationSettingsValidationMessages,configuration_settings_validation_messages\nConfigurationSource,configuration_source\nConfigurationStatus,configuration_status\nConfigurationSummary,configuration_summary\nConfigurationSyncStateSummary,configuration_sync_state_summary\nConfigurationSyncStatus,configuration_sync_status\nConfigurationTag,configuration_tag\nConfigurationTemplateQuota,configuration_template_quota\nConfigurationTemplates,configuration_templates\nConfigurationToken,configuration_token\nConfigurationType,configuration_type\nConfigurationTypeUpdate,configuration_type_update\nConfigurationUpdate,configuration_update\nConfigurationUpdates,configuration_updates\nConfigurationVersion,configuration_version\nConfigurations,configurations\nConfigurationsVersion,configurations_version\nConfigure,configure\nConfigureAccessPointRequest,configure_access_point_request\nConfigureAccessPointResponse,configure_access_point_response\nConfigureAgentRequest,configure_agent_request\nConfigureAgentResponse,configure_agent_response\nConfigureHealthCheckInput,configure_health_check_input\nConfigureHealthCheckOutput,configure_health_check_output\nConfigureLogsForChannelRequest,configure_logs_for_channel_request\nConfigureLogsForChannelResponse,configure_logs_for_channel_response\nConfigureLogsForPlaybackConfigurationRequest,configure_logs_for_playback_configuration_request\nConfigureLogsForPlaybackConfigurationResponse,configure_logs_for_playback_configuration_response\nConfigureLogsRequest,configure_logs_request\nConfigureLogsResponse,configure_logs_response\nConfigureShard,configure_shard\nConfigured,configured\nConfiguredDataNodeCount,configured_data_node_count\nConfiguredInput,configured_input\nConfiguredTable,configured_table\nConfiguredTableAnalysisRule,configured_table_analysis_rule\nConfiguredTableAssociation,configured_table_association\nConfiguredTableAssociationSummary,configured_table_association_summary\nConfiguredTableSummary,configured_table_summary\nConfirmConnectionRequest,confirm_connection_request\nConfirmConnectionResponse,confirm_connection_response\nConfirmCustomerAgreementRequest,confirm_customer_agreement_request\nConfirmCustomerAgreementResponse,confirm_customer_agreement_response\nConfirmDeviceRequest,confirm_device_request\nConfirmDeviceResponse,confirm_device_response\nConfirmForgotPasswordRequest,confirm_forgot_password_request\nConfirmPrivateVirtualInterfaceRequest,confirm_private_virtual_interface_request\nConfirmPrivateVirtualInterfaceResponse,confirm_private_virtual_interface_response\nConfirmProductInstanceRequest,confirm_product_instance_request\nConfirmProductInstanceResult,confirm_product_instance_result\nConfirmPublicVirtualInterfaceRequest,confirm_public_virtual_interface_request\nConfirmPublicVirtualInterfaceResponse,confirm_public_virtual_interface_response\nConfirmRemoveSelfBucketAccess,confirm_remove_self_bucket_access\nConfirmSignUpRequest,confirm_sign_up_request\nConfirmSubscriptionInput,confirm_subscription_input\nConfirmSubscriptionResponse,confirm_subscription_response\nConfirmTopicRuleDestinationRequest,confirm_topic_rule_destination_request\nConfirmTransitVirtualInterfaceRequest,confirm_transit_virtual_interface_request\nConfirmTransitVirtualInterfaceResponse,confirm_transit_virtual_interface_response\nConfirmationCode,confirmation_code\nConfirmationRequired,confirmation_required\nConflict,conflict\nConflictErrorException,conflict_error_exception\nConflictException,conflict_exception\nConflictExceptionErrorArgument,conflict_exception_error_argument\nConflictExceptionType,conflict_exception_type\nConflictMetadata,conflict_metadata\nConflictResolution,conflict_resolution\nConflictResolvingModel,conflict_resolving_model\nConflictResource,conflict_resource\nConflictType,conflict_type\nConflictingAlias,conflicting_alias\nConflictingAliasesList,conflicting_aliases_list\nConflictingDomainExists,conflicting_domain_exists\nConflictingItem,conflicting_item\nConflictingItems,conflicting_items\nConflictingOperationException,conflicting_operation_exception\nConflictingPolicyId,conflicting_policy_id\nConflictingPriority,conflicting_priority\nConflictingResourceUpdateException,conflicting_resource_update_exception\nConflictingTypes,conflicting_types\nConfluenceAttachmentConfiguration,confluence_attachment_configuration\nConfluenceAttachmentToIndexFieldMapping,confluence_attachment_to_index_field_mapping\nConfluenceBlogConfiguration,confluence_blog_configuration\nConfluenceBlogToIndexFieldMapping,confluence_blog_to_index_field_mapping\nConfluenceConfiguration,confluence_configuration\nConfluencePageConfiguration,confluence_page_configuration\nConfluencePageToIndexFieldMapping,confluence_page_to_index_field_mapping\nConfluenceSpaceConfiguration,confluence_space_configuration\nConfluenceSpaceToIndexFieldMapping,confluence_space_to_index_field_mapping\nConformancePackArn,conformance_pack_arn\nConformancePackComplianceFilters,conformance_pack_compliance_filters\nConformancePackComplianceScore,conformance_pack_compliance_score\nConformancePackComplianceScores,conformance_pack_compliance_scores\nConformancePackComplianceScoresFilters,conformance_pack_compliance_scores_filters\nConformancePackComplianceStatus,conformance_pack_compliance_status\nConformancePackComplianceSummary,conformance_pack_compliance_summary\nConformancePackComplianceSummaryList,conformance_pack_compliance_summary_list\nConformancePackDetail,conformance_pack_detail\nConformancePackDetails,conformance_pack_details\nConformancePackEvaluationFilters,conformance_pack_evaluation_filters\nConformancePackEvaluationResult,conformance_pack_evaluation_result\nConformancePackId,conformance_pack_id\nConformancePackInputParameter,conformance_pack_input_parameter\nConformancePackInputParameters,conformance_pack_input_parameters\nConformancePackName,conformance_pack_name\nConformancePackNames,conformance_pack_names\nConformancePackRuleCompliance,conformance_pack_rule_compliance\nConformancePackRuleComplianceList,conformance_pack_rule_compliance_list\nConformancePackRuleEvaluationResults,conformance_pack_rule_evaluation_results\nConformancePackState,conformance_pack_state\nConformancePackStatusDetail,conformance_pack_status_detail\nConformancePackStatusDetails,conformance_pack_status_details\nConformancePackStatusReason,conformance_pack_status_reason\nConformancePackTemplateValidationException,conformance_pack_template_validation_exception\nConfusionMatrix,confusion_matrix\nConnectAppAuthorizationRequest,connect_app_authorization_request\nConnectAppAuthorizationResponse,connect_app_authorization_response\nConnectAttachment,connect_attachment\nConnectAttachmentId,connect_attachment_id\nConnectAttachmentOptions,connect_attachment_options\nConnectCampaignArn,connect_campaign_arn\nConnectCampaignExecutionRoleArn,connect_campaign_execution_role_arn\nConnectClientAddIn,connect_client_add_in\nConnectCustomKeyStoreRequest,connect_custom_key_store_request\nConnectDirectoryRequest,connect_directory_request\nConnectDirectoryResult,connect_directory_result\nConnectIps,connect_ips\nConnectParticipant,connect_participant\nConnectPeer,connect_peer\nConnectPeerAssociation,connect_peer_association\nConnectPeerAssociations,connect_peer_associations\nConnectPeerBgpConfiguration,connect_peer_bgp_configuration\nConnectPeerConfiguration,connect_peer_configuration\nConnectPeerId,connect_peer_id\nConnectPeerIds,connect_peer_ids\nConnectPeerState,connect_peer_state\nConnectPeerSummary,connect_peer_summary\nConnectPeers,connect_peers\nConnectSettings,connect_settings\nConnectedAt,connected_at\nConnectedDatabase,connected_database\nConnectedDeviceCount,connected_device_count\nConnectedDeviceId,connected_device_id\nConnectedDirectoriesCurrentCount,connected_directories_current_count\nConnectedDirectoriesLimit,connected_directories_limit\nConnectedDirectoriesLimitReached,connected_directories_limit_reached\nConnectedHome,connected_home\nConnectedHomeForUpdate,connected_home_for_update\nConnectedHomeSettings,connected_home_settings\nConnectedHomeSettingsForUpdate,connected_home_settings_for_update\nConnectedLinkId,connected_link_id\nConnectedToAgentTimestamp,connected_to_agent_timestamp\nConnection,connection\nConnectionAlias,connection_alias\nConnectionAliasAssociation,connection_alias_association\nConnectionAliasPermission,connection_alias_permission\nConnectionAliasPermissions,connection_alias_permissions\nConnectionAliases,connection_aliases\nConnectionApiKeyAuthResponseParameters,connection_api_key_auth_response_parameters\nConnectionArn,connection_arn\nConnectionAttempts,connection_attempts\nConnectionAuthResponseParameters,connection_auth_response_parameters\nConnectionBasicAuthResponseParameters,connection_basic_auth_response_parameters\nConnectionBodyParameter,connection_body_parameter\nConnectionBorrowTimeout,connection_borrow_timeout\nConnectionConfiguration,connection_configuration\nConnectionCredentials,connection_credentials\nConnectionDetails,connection_details\nConnectionDirection,connection_direction\nConnectionDraining,connection_draining\nConnectionEndTime,connection_end_time\nConnectionErrorCode,connection_error_code\nConnectionEstablishedTime,connection_established_time\nConnectionEvents,connection_events\nConnectionExpiry,connection_expiry\nConnectionHeaderParameter,connection_header_parameter\nConnectionHealth,connection_health\nConnectionHttpParameters,connection_http_parameters\nConnectionId,connection_id\nConnectionIdentifier,connection_identifier\nConnectionIds,connection_ids\nConnectionInfo,connection_info\nConnectionInput,connection_input\nConnectionLimitExceededException,connection_limit_exceeded_exception\nConnectionList,connection_list\nConnectionLogOptions,connection_log_options\nConnectionLogResponseOptions,connection_log_response_options\nConnectionLost,connection_lost\nConnectionMode,connection_mode\nConnectionName,connection_name\nConnectionNameList,connection_name_list\nConnectionNotification,connection_notification\nConnectionNotificationArn,connection_notification_arn\nConnectionNotificationId,connection_notification_id\nConnectionNotificationIds,connection_notification_ids\nConnectionNotificationSet,connection_notification_set\nConnectionNotificationState,connection_notification_state\nConnectionNotificationType,connection_notification_type\nConnectionOAuthClientResponseParameters,connection_o_auth_client_response_parameters\nConnectionOAuthResponseParameters,connection_o_auth_response_parameters\nConnectionParameters,connection_parameters\nConnectionPasswordEncryption,connection_password_encryption\nConnectionPoolConfig,connection_pool_config\nConnectionPoolConfiguration,connection_pool_configuration\nConnectionPoolConfigurationInfo,connection_pool_configuration_info\nConnectionProperties,connection_properties\nConnectionQueryStringParameter,connection_query_string_parameter\nConnectionRefusedCount,connection_refused_count\nConnectionRetryInterval,connection_retry_interval\nConnectionSettings,connection_settings\nConnectionState,connection_state\nConnectionStateCheckTimestamp,connection_state_check_timestamp\nConnectionStatus,connection_status\nConnectionStatusEventConfiguration,connection_status_event_configuration\nConnectionStatusResourceTypeEventConfiguration,connection_status_resource_type_event_configuration\nConnectionStatusUpdatedTime,connection_status_updated_time\nConnectionStatuses,connection_statuses\nConnectionString,connection_string\nConnectionSummary,connection_summary\nConnectionSummaryList,connection_summary_list\nConnectionTable,connection_table\nConnectionTimeout,connection_timeout\nConnectionToken,connection_token\nConnectionType,connection_type\nConnections,connections\nConnectionsList,connections_list\nConnectivity,connectivity\nConnectivityInfo,connectivity_info\nConnectivityStatus,connectivity_status\nConnectivityType,connectivity_type\nConnector,connector\nConnectorArn,connector_arn\nConnectorAuthenticationException,connector_authentication_exception\nConnectorConfigRequest,connector_config_request\nConnectorConfigResponse,connector_config_response\nConnectorConfiguration,connector_configuration\nConnectorDefinitionId,connector_definition_id\nConnectorDefinitionVersion,connector_definition_version\nConnectorDefinitionVersionArn,connector_definition_version_arn\nConnectorDefinitionVersionId,connector_definition_version_id\nConnectorDetail,connector_detail\nConnectorEntity,connector_entity\nConnectorEntityField,connector_entity_field\nConnectorFailureException,connector_failure_exception\nConnectorId,connector_id\nConnectorMetadata,connector_metadata\nConnectorName,connector_name\nConnectorOAuthRequest,connector_o_auth_request\nConnectorOperator,connector_operator\nConnectorProfile,connector_profile\nConnectorProfileConfig,connector_profile_config\nConnectorProfileCredentials,connector_profile_credentials\nConnectorProfileName,connector_profile_name\nConnectorProfileProperties,connector_profile_properties\nConnectorProvisioningConfig,connector_provisioning_config\nConnectorRuntimeSetting,connector_runtime_setting\nConnectorServerException,connector_server_exception\nConnectorSummary,connector_summary\nConnectorTimeoutException,connector_timeout_exception\nConnectorType,connector_type\nConnectors,connectors\nConsent,consent\nConsistencyLevel,consistency_level\nConsistentRead,consistent_read\nConsoleAccess,console_access\nConsoleURL,console_url\nConsolidatedReportMetric,consolidated_report_metric\nConsolidation,consolidation\nConsolidationKey,consolidation_key\nConstant,constant\nConstantBitrate,constant_bitrate\nConstantInitializationVector,constant_initialization_vector\nConstantIv,constant_iv\nConstantType,constant_type\nConstraint,constraint\nConstraintDescription,constraint_description\nConstraintDetail,constraint_detail\nConstraintDetails,constraint_details\nConstraintId,constraint_id\nConstraintParameters,constraint_parameters\nConstraintSummaries,constraint_summaries\nConstraintSummary,constraint_summary\nConstraintViolationException,constraint_violation_exception\nConstraints,constraints\nConstraintsResource,constraints_resource\nConsumedCapacity,consumed_capacity\nConsumedIOs,consumed_ios\nConsumedLabels,consumed_labels\nConsumedLicenseSummary,consumed_license_summary\nConsumedLicenseSummaryList,consumed_license_summary_list\nConsumedLicenses,consumed_licenses\nConsumedResources,consumed_resources\nConsumedSpiceCapacityInBytes,consumed_spice_capacity_in_bytes\nConsumedStatefulRuleCapacity,consumed_stateful_rule_capacity\nConsumedStatelessRuleCapacity,consumed_stateless_rule_capacity\nConsumedValue,consumed_value\nConsumer,consumer\nConsumerARN,consumer_arn\nConsumerArn,consumer_arn\nConsumerArns,consumer_arns\nConsumerCount,consumer_count\nConsumerCreationTimestamp,consumer_creation_timestamp\nConsumerDescription,consumer_description\nConsumerGroupID,consumer_group_id\nConsumerGroupId,consumer_group_id\nConsumerIdentifier,consumer_identifier\nConsumerName,consumer_name\nConsumerRegion,consumer_region\nConsumerStatus,consumer_status\nConsumers,consumers\nConsumption,consumption\nConsumptionConfiguration,consumption_configuration\nContact,contact\nContactAgentId,contact_agent_id\nContactArn,contact_arn\nContactCenter,contact_center\nContactCenterActivity,contact_center_activity\nContactChannel,contact_channel\nContactChannelAddress,contact_channel_address\nContactChannelArn,contact_channel_arn\nContactChannelId,contact_channel_id\nContactChannels,contact_channels\nContactContent,contact_content\nContactData,contact_data\nContactDetail,contact_detail\nContactEmail,contact_email\nContactFilter,contact_filter\nContactFlow,contact_flow\nContactFlowArn,contact_flow_arn\nContactFlowId,contact_flow_id\nContactFlowModule,contact_flow_module\nContactFlowModuleId,contact_flow_module_id\nContactFlowModuleState,contact_flow_module_state\nContactFlowModuleSummary,contact_flow_module_summary\nContactFlowModulesSummaryList,contact_flow_modules_summary_list\nContactFlowNotPublishedException,contact_flow_not_published_exception\nContactFlowState,contact_flow_state\nContactFlowSummary,contact_flow_summary\nContactFlowSummaryList,contact_flow_summary_list\nContactFlowType,contact_flow_type\nContactFlowTypes,contact_flow_types\nContactId,contact_id\nContactIdResponse,contact_id_response\nContactIds,contact_ids\nContactInformation,contact_information\nContactLanguage,contact_language\nContactList,contact_list\nContactListDestination,contact_list_destination\nContactListImportAction,contact_list_import_action\nContactListName,contact_list_name\nContactLists,contact_lists\nContactMethod,contact_method\nContactName,contact_name\nContactNotFoundException,contact_not_found_exception\nContactNotes,contact_notes\nContactNumber,contact_number\nContactPhoneNumber,contact_phone_number\nContactStates,contact_states\nContactTargetInfo,contact_target_info\nContactType,contact_type\nContacts,contacts\nContainer,container\nContainerArguments,container_arguments\nContainerConfig,container_config\nContainerConfiguration,container_configuration\nContainerDatasetAction,container_dataset_action\nContainerDefinition,container_definition\nContainerDefinitions,container_definitions\nContainerDependency,container_dependency\nContainerDetail,container_detail\nContainerDetails,container_details\nContainerDistributionConfiguration,container_distribution_configuration\nContainerEntrypoint,container_entrypoint\nContainerFormat,container_format\nContainerHostname,container_hostname\nContainerImage,container_image\nContainerInUseException,container_in_use_exception\nContainerInstance,container_instance\nContainerInstanceHealthStatus,container_instance_health_status\nContainerLevelMetrics,container_level_metrics\nContainerLogRotationConfiguration,container_log_rotation_configuration\nContainerName,container_name\nContainerNotFoundException,container_not_found_exception\nContainerOverride,container_override\nContainerOverrides,container_overrides\nContainerPath,container_path\nContainerPort,container_port\nContainerProperties,container_properties\nContainerProvider,container_provider\nContainerRecipe,container_recipe\nContainerRecipeSummary,container_recipe_summary\nContainerRecommendation,container_recommendation\nContainerRuntime,container_runtime\nContainerService,container_service\nContainerServiceDeployment,container_service_deployment\nContainerServiceDeploymentRequest,container_service_deployment_request\nContainerServiceECRImagePullerRole,container_service_ecr_image_puller_role\nContainerServiceECRImagePullerRoleRequest,container_service_ecr_image_puller_role_request\nContainerServiceEndpoint,container_service_endpoint\nContainerServiceHealthCheckConfig,container_service_health_check_config\nContainerServiceLogEvent,container_service_log_event\nContainerServicePower,container_service_power\nContainerServiceRegistryLogin,container_service_registry_login\nContainerServiceStateDetail,container_service_state_detail\nContainerServicesListResult,container_services_list_result\nContainerSettings,container_settings\nContainerStartupHealthCheckTimeoutInSeconds,container_startup_health_check_timeout_in_seconds\nContainerStateChange,container_state_change\nContainerSummary,container_summary\nContainerType,container_type\nContainerUrl,container_url\nContainers,containers\nContainsAll,contains_all\nContainsAny,contains_any\nContainsHeader,contains_header\nContainsLabels,contains_labels\nContainsOldGroupVersions,contains_old_group_versions\nContainsPiiEntitiesRequest,contains_pii_entities_request\nContainsPiiEntitiesResponse,contains_pii_entities_response\nContent,content\nContentArtifactsConfiguration,content_artifacts_configuration\nContentCategories,content_categories\nContentClassifiers,content_classifiers\nContentColumn,content_column\nContentConcatenationConfiguration,content_concatenation_configuration\nContentConfig,content_config\nContentCreatedTimestamp,content_created_timestamp\nContentData,content_data\nContentDigest,content_digest\nContentDisposition,content_disposition\nContentEncoding,content_encoding\nContentHandlingStrategy,content_handling_strategy\nContentHash,content_hash\nContentIdentificationType,content_identification_type\nContentLanguage,content_language\nContentLength,content_length\nContentMD5,content_md5\nContentModerationDetection,content_moderation_detection\nContentModifiedTimestamp,content_modified_timestamp\nContentRange,content_range\nContentRedaction,content_redaction\nContentRedactionOutput,content_redaction_output\nContentRedactionType,content_redaction_type\nContentReference,content_reference\nContentSHA256,content_sha256\nContentSecurityPolicy,content_security_policy\nContentSegmentUrlPrefix,content_segment_url_prefix\nContentSha256,content_sha256\nContentShareLayout,content_share_layout\nContentSourceConfiguration,content_source_configuration\nContentSummary,content_summary\nContentTemplate,content_template\nContentTransformation,content_transformation\nContentType,content_type\nContentTypeOptions,content_type_options\nContentTypeProfile,content_type_profile\nContentTypeProfileConfig,content_type_profile_config\nContentTypeProfiles,content_type_profiles\nContentUrl,content_url\nContents,contents\nContext,context\nContextArn,context_arn\nContextAssertion,context_assertion\nContextData,context_data\nContextDataType,context_data_type\nContextEntries,context_entries\nContextEntry,context_entry\nContextId,context_id\nContextKeyName,context_key_name\nContextKeyNames,context_key_names\nContextKeyType,context_key_type\nContextKeyValues,context_key_values\nContextName,context_name\nContextScope,context_scope\nContextScopeType,context_scope_type\nContextSource,context_source\nContextSummaries,context_summaries\nContextSummary,context_summary\nContextType,context_type\nContextWords,context_words\nContinentCode,continent_code\nContinentName,continent_name\nContinuationSequenceNumber,continuation_sequence_number\nContinuationToken,continuation_token\nContinueAsNewWorkflowExecutionDecisionAttributes,continue_as_new_workflow_execution_decision_attributes\nContinueAsNewWorkflowExecutionFailedEventAttributes,continue_as_new_workflow_execution_failed_event_attributes\nContinueDeploymentInput,continue_deployment_input\nContinueUpdateRollbackInput,continue_update_rollback_input\nContinuedFromContactId,continued_from_contact_id\nContinuousBackupsDescription,continuous_backups_description\nContinuousBackupsStatus,continuous_backups_status\nContinuousBackupsUnavailableException,continuous_backups_unavailable_exception\nContinuousDeploymentPolicy,continuous_deployment_policy\nContinuousDeploymentPolicyAlreadyExists,continuous_deployment_policy_already_exists\nContinuousDeploymentPolicyConfig,continuous_deployment_policy_config\nContinuousDeploymentPolicyId,continuous_deployment_policy_id\nContinuousDeploymentPolicyInUse,continuous_deployment_policy_in_use\nContinuousDeploymentPolicyList,continuous_deployment_policy_list\nContinuousDeploymentPolicySummary,continuous_deployment_policy_summary\nContinuousDeploymentSingleHeaderConfig,continuous_deployment_single_header_config\nContinuousDeploymentSingleWeightConfig,continuous_deployment_single_weight_config\nContinuousExportDescription,continuous_export_description\nContinuousHyperParameterRange,continuous_hyper_parameter_range\nContinuousParameterRange,continuous_parameter_range\nContinuousParameterRangeSpecification,continuous_parameter_range_specification\nContinuousParameterRanges,continuous_parameter_ranges\nContrast,contrast\nContributingSubnets,contributing_subnets\nContributionAnalysisDefault,contribution_analysis_default\nContributionAnalysisDefaults,contribution_analysis_defaults\nContributionMatrix,contribution_matrix\nContributionPercentage,contribution_percentage\nContributionScore,contribution_score\nContributor,contributor\nContributorDimensions,contributor_dimensions\nContributorId,contributor_id\nContributorInsightsAction,contributor_insights_action\nContributorInsightsRuleList,contributor_insights_rule_list\nContributorInsightsStatus,contributor_insights_status\nContributorInsightsSummaries,contributor_insights_summaries\nContributorInsightsSummary,contributor_insights_summary\nContributors,contributors\nControl,control\nControlComment,control_comment\nControlDomainInsights,control_domain_insights\nControlFindingGenerator,control_finding_generator\nControlId,control_id\nControlInputParameter,control_input_parameter\nControlInputParameters,control_input_parameters\nControlInsightsMetadataByAssessmentItem,control_insights_metadata_by_assessment_item\nControlInsightsMetadataItem,control_insights_metadata_item\nControlMappingSource,control_mapping_source\nControlMetadata,control_metadata\nControlName,control_name\nControlOperation,control_operation\nControlPanel,control_panel\nControlPanelArn,control_panel_arn\nControlPanelName,control_panel_name\nControlPanels,control_panels\nControlPlanePlacementRequest,control_plane_placement_request\nControlPlanePlacementResponse,control_plane_placement_response\nControlPlaneTagFilter,control_plane_tag_filter\nControlScope,control_scope\nControlSet,control_set\nControlStatus,control_status\nControlStatusUpdatedAt,control_status_updated_at\nControlTablesFileGroup,control_tables_file_group\nControls,controls\nConvergenceDetected,convergence_detected\nConvergenceDetectedTime,convergence_detected_time\nConversationId,conversation_id\nConversationLevelIntentClassificationResultItem,conversation_level_intent_classification_result_item\nConversationLevelResultDetail,conversation_level_result_detail\nConversationLevelSlotResolutionResultItem,conversation_level_slot_resolution_result_item\nConversationLevelTestResultItem,conversation_level_test_result_item\nConversationLevelTestResults,conversation_level_test_results\nConversationLevelTestResultsFilterBy,conversation_level_test_results_filter_by\nConversationLogSettings,conversation_log_settings\nConversationLogsDataSource,conversation_logs_data_source\nConversationLogsDataSourceFilterBy,conversation_logs_data_source_filter_by\nConversationLogsRequest,conversation_logs_request\nConversationLogsResponse,conversation_logs_response\nConversationRetentionSettings,conversation_retention_settings\nConversionConfiguration,conversion_configuration\nConversionProperties,conversion_properties\nConversionTask,conversion_task\nConversionTaskId,conversion_task_id\nConversionTaskIds,conversion_task_ids\nConversionTasks,conversion_tasks\nConvert608To708,convert608_to708\nConvertDotsInJsonKeysToUnderscores,convert_dots_in_json_keys_to_underscores\nConvertPaintToPop,convert_paint_to_pop\nConvertRecoveryPointToSnapshotRequest,convert_recovery_point_to_snapshot_request\nConvertRecoveryPointToSnapshotResponse,convert_recovery_point_to_snapshot_response\nConvertTimestampWithZoneToUTC,convert_timestamp_with_zone_to_utc\nCookie,cookie\nCookieBehavior,cookie_behavior\nCookieExpirationPeriod,cookie_expiration_period\nCookieMatchPattern,cookie_match_pattern\nCookieName,cookie_name\nCookieNames,cookie_names\nCookieObject,cookie_object\nCookiePreference,cookie_preference\nCookieSpecification,cookie_specification\nCookieSynchronizationConfiguration,cookie_synchronization_configuration\nCookies,cookies\nCookiesConfig,cookies_config\nCoolDown,cool_down\nCooldown,cooldown\nCoolingPeriod,cooling_period\nCoordinates,coordinates\nCoordinatorDpuSize,coordinator_dpu_size\nCopyAction,copy_action\nCopyActions,copy_actions\nCopyBackupRequest,copy_backup_request\nCopyBackupResponse,copy_backup_response\nCopyBackupToRegionRequest,copy_backup_to_region_request\nCopyBackupToRegionResponse,copy_backup_to_region_response\nCopyClusterSnapshotMessage,copy_cluster_snapshot_message\nCopyClusterSnapshotResult,copy_cluster_snapshot_result\nCopyCommand,copy_command\nCopyDBClusterParameterGroupMessage,copy_db_cluster_parameter_group_message\nCopyDBClusterParameterGroupResult,copy_db_cluster_parameter_group_result\nCopyDBClusterSnapshotMessage,copy_db_cluster_snapshot_message\nCopyDBClusterSnapshotResult,copy_db_cluster_snapshot_result\nCopyDBParameterGroupMessage,copy_db_parameter_group_message\nCopyDBParameterGroupResult,copy_db_parameter_group_result\nCopyDBSnapshotMessage,copy_db_snapshot_message\nCopyDBSnapshotResult,copy_db_snapshot_result\nCopyDestinationImageSet,copy_destination_image_set\nCopyDestinationImageSetProperties,copy_destination_image_set_properties\nCopyDistributionRequest,copy_distribution_request\nCopyDistributionResult,copy_distribution_result\nCopyFpgaImageRequest,copy_fpga_image_request\nCopyFpgaImageResult,copy_fpga_image_result\nCopyImageRequest,copy_image_request\nCopyImageResponse,copy_image_response\nCopyImageResult,copy_image_result\nCopyImageSetInformation,copy_image_set_information\nCopyImageSetRequest,copy_image_set_request\nCopyImageSetResponse,copy_image_set_response\nCopyImageTags,copy_image_tags\nCopyJob,copy_job\nCopyJobId,copy_job_id\nCopyJobs,copy_jobs\nCopyObjectOutput,copy_object_output\nCopyObjectRequest,copy_object_request\nCopyObjectResult,copy_object_result\nCopyOptionGroup,copy_option_group\nCopyOptionGroupMessage,copy_option_group_message\nCopyOptionGroupResult,copy_option_group_result\nCopyOptions,copy_options\nCopyPackageVersionsRequest,copy_package_versions_request\nCopyPackageVersionsResult,copy_package_versions_result\nCopyPartResult,copy_part_result\nCopyProductInput,copy_product_input\nCopyProductOutput,copy_product_output\nCopyProductStatus,copy_product_status\nCopyProductToken,copy_product_token\nCopyProjectVersionRequest,copy_project_version_request\nCopyProjectVersionResponse,copy_project_version_response\nCopyProtectionAction,copy_protection_action\nCopySnapshotMessage,copy_snapshot_message\nCopySnapshotRequest,copy_snapshot_request\nCopySnapshotResponse,copy_snapshot_response\nCopySnapshotResult,copy_snapshot_result\nCopySource,copy_source\nCopySourceArn,copy_source_arn\nCopySourceIfMatch,copy_source_if_match\nCopySourceIfModifiedSince,copy_source_if_modified_since\nCopySourceIfNoneMatch,copy_source_if_none_match\nCopySourceIfUnmodifiedSince,copy_source_if_unmodified_since\nCopySourceImageSetInformation,copy_source_image_set_information\nCopySourceImageSetProperties,copy_source_image_set_properties\nCopySourceRange,copy_source_range\nCopySourceSSECustomerAlgorithm,copy_source_sse_customer_algorithm\nCopySourceSSECustomerKey,copy_source_sse_customer_key\nCopySourceSSECustomerKeyMD5,copy_source_sse_customer_key_md5\nCopySourceTagsToRestoredResource,copy_source_tags_to_restored_resource\nCopySourceVersionId,copy_source_version_id\nCopyStepDetails,copy_step_details\nCopyStrategy,copy_strategy\nCopyTags,copy_tags\nCopyTagsFromSource,copy_tags_from_source\nCopyTagsToBackups,copy_tags_to_backups\nCopyTagsToDataRepositoryAssociations,copy_tags_to_data_repository_associations\nCopyTagsToSnapshot,copy_tags_to_snapshot\nCopyTagsToSnapshots,copy_tags_to_snapshots\nCopyTagsToVolumes,copy_tags_to_volumes\nCopyTimestamp,copy_timestamp\nCopyToRegionDisabledFault,copy_to_region_disabled_fault\nCopyWorkspaceImageRequest,copy_workspace_image_request\nCopyWorkspaceImageResult,copy_workspace_image_result\nCopyableCrossAccount,copyable_cross_account\nCopyrightHolder,copyright_holder\nCore,core\nCoreCount,core_count\nCoreDefinitionId,core_definition_id\nCoreDefinitionVersion,core_definition_version\nCoreDefinitionVersionArn,core_definition_version_arn\nCoreDefinitionVersionId,core_definition_version_id\nCoreDevice,core_device\nCoreDumpConfig,core_dump_config\nCoreNetwork,core_network\nCoreNetworkAddress,core_network_address\nCoreNetworkArn,core_network_arn\nCoreNetworkAsn,core_network_asn\nCoreNetworkAttachmentArn,core_network_attachment_arn\nCoreNetworkAttachmentId,core_network_attachment_id\nCoreNetworkChange,core_network_change\nCoreNetworkChangeEvent,core_network_change_event\nCoreNetworkChangeEventValues,core_network_change_event_values\nCoreNetworkChangeEvents,core_network_change_events\nCoreNetworkChangeValues,core_network_change_values\nCoreNetworkChanges,core_network_changes\nCoreNetworkEdge,core_network_edge\nCoreNetworkId,core_network_id\nCoreNetworkPolicy,core_network_policy\nCoreNetworkPolicyError,core_network_policy_error\nCoreNetworkPolicyException,core_network_policy_exception\nCoreNetworkPolicyVersion,core_network_policy_version\nCoreNetworkPolicyVersions,core_network_policy_versions\nCoreNetworkSegment,core_network_segment\nCoreNetworkSegmentEdge,core_network_segment_edge\nCoreNetworkSegmentEdgeIdentifier,core_network_segment_edge_identifier\nCoreNetworkSummary,core_network_summary\nCoreNetworks,core_networks\nCores,cores\nCornerRadius,corner_radius\nCorrectedTerm,corrected_term\nCorrection,correction\nCorrectionGateLevel,correction_gate_level\nCorrections,corrections\nCors,cors\nCorsConfig,cors_config\nCorsConfiguration,cors_configuration\nCorsPolicy,cors_policy\nCorsPolicyNotFoundException,cors_policy_not_found_exception\nCorsRule,cors_rule\nCost,cost\nCostAllocationTag,cost_allocation_tag\nCostAllocationTagStatusEntry,cost_allocation_tag_status_entry\nCostAllocationTags,cost_allocation_tags\nCostAllocationTagsStatus,cost_allocation_tags_status\nCostCategories,cost_categories\nCostCategory,cost_category\nCostCategoryArn,cost_category_arn\nCostCategoryInheritedValueDimension,cost_category_inherited_value_dimension\nCostCategoryName,cost_category_name\nCostCategoryNames,cost_category_names\nCostCategoryProcessingStatus,cost_category_processing_status\nCostCategoryReference,cost_category_reference\nCostCategoryReferences,cost_category_references\nCostCategoryRule,cost_category_rule\nCostCategorySplitChargeRule,cost_category_split_charge_rule\nCostCategorySplitChargeRuleParameter,cost_category_split_charge_rule_parameter\nCostCategoryValues,cost_category_values\nCostEstimate,cost_estimate\nCostEstimationResourceCollectionFilter,cost_estimation_resource_collection_filter\nCostEstimationTimeRange,cost_estimation_time_range\nCostFilters,cost_filters\nCostPerHour,cost_per_hour\nCostPerInference,cost_per_inference\nCostTypes,cost_types\nCosts,costs\nCount,count\nCountAction,count_action\nCountByCoverageStatus,count_by_coverage_status\nCountByResourceType,count_by_resource_type\nCountBySeverity,count_by_severity\nCountClosedWorkflowExecutionsInput,count_closed_workflow_executions_input\nCountDistinct,count_distinct\nCountDistinctLong,count_distinct_long\nCountLong,count_long\nCountNan,count_nan\nCountNanLong,count_nan_long\nCountNull,count_null\nCountNullLong,count_null_long\nCountOpenWorkflowExecutionsInput,count_open_workflow_executions_input\nCountPendingActivityTasksInput,count_pending_activity_tasks_input\nCountPendingDecisionTasksInput,count_pending_decision_tasks_input\nCountPercent,count_percent\nCountUpdate,count_update\nCounters,counters\nCountry,country\nCountryCode,country_code\nCountryCodeIso2,country_code_iso2\nCountryCodeNumeric,country_code_numeric\nCountryCodes,country_codes\nCountryName,country_name\nCounts,counts\nCountsSummary,counts_summary\nCounty,county\nCoverage,coverage\nCoverageByTime,coverage_by_time\nCoverageCost,coverage_cost\nCoverageDateFilter,coverage_date_filter\nCoverageEksClusterDetails,coverage_eks_cluster_details\nCoverageFilterCondition,coverage_filter_condition\nCoverageFilterCriteria,coverage_filter_criteria\nCoverageFilterCriterion,coverage_filter_criterion\nCoverageHours,coverage_hours\nCoverageHoursPercentage,coverage_hours_percentage\nCoverageMapFilter,coverage_map_filter\nCoverageNormalizedUnits,coverage_normalized_units\nCoverageNormalizedUnitsPercentage,coverage_normalized_units_percentage\nCoveragePercentage,coverage_percentage\nCoverageResource,coverage_resource\nCoverageResourceDetails,coverage_resource_details\nCoverageSortCriteria,coverage_sort_criteria\nCoverageStatistics,coverage_statistics\nCoverageStatus,coverage_status\nCoverageStringFilter,coverage_string_filter\nCoverageTime,coverage_time\nCoveragesByTime,coverages_by_time\nCoveredNodes,covered_nodes\nCoveredResource,covered_resource\nCoversBodyPart,covers_body_part\nCpsLimit,cps_limit\nCpsUri,cps_uri\nCpu,cpu\nCpuCredits,cpu_credits\nCpuManufacturers,cpu_manufacturers\nCpuOptions,cpu_options\nCpuOptionsRequest,cpu_options_request\nCpuThreshold,cpu_threshold\nCpuUtilization,cpu_utilization\nCrawl,crawl\nCrawlArchivedSpaces,crawl_archived_spaces\nCrawlAttachments,crawl_attachments\nCrawlBotMessage,crawl_bot_message\nCrawlChatRooms,crawl_chat_rooms\nCrawlComments,crawl_comments\nCrawlDepth,crawl_depth\nCrawlElapsedTime,crawl_elapsed_time\nCrawlFileComments,crawl_file_comments\nCrawlId,crawl_id\nCrawlIssue,crawl_issue\nCrawlIssueComment,crawl_issue_comment\nCrawlIssueCommentAttachment,crawl_issue_comment_attachment\nCrawlPersonalSpaces,crawl_personal_spaces\nCrawlPullRequest,crawl_pull_request\nCrawlPullRequestComment,crawl_pull_request_comment\nCrawlPullRequestCommentAttachment,crawl_pull_request_comment_attachment\nCrawlRepositoryDocuments,crawl_repository_documents\nCrawlState,crawl_state\nCrawlSystemFolders,crawl_system_folders\nCrawlTasks,crawl_tasks\nCrawlWebLinks,crawl_web_links\nCrawler,crawler\nCrawlerConnection,crawler_connection\nCrawlerDetails,crawler_details\nCrawlerHistory,crawler_history\nCrawlerLineageSettings,crawler_lineage_settings\nCrawlerMetrics,crawler_metrics\nCrawlerMetricsList,crawler_metrics_list\nCrawlerName,crawler_name\nCrawlerNameList,crawler_name_list\nCrawlerNames,crawler_names\nCrawlerNodeDetails,crawler_node_details\nCrawlerNotRunningException,crawler_not_running_exception\nCrawlerRunningException,crawler_running_exception\nCrawlerSecurityConfiguration,crawler_security_configuration\nCrawlerStoppingException,crawler_stopping_exception\nCrawlerTargets,crawler_targets\nCrawlers,crawlers\nCrawlersNotFound,crawlers_not_found\nCrawls,crawls\nCrawlsFilter,crawls_filter\nCreate,create\nCreateACLRequest,create_acl_request\nCreateACLResponse,create_acl_response\nCreateAPIKeyRequest,create_api_key_request\nCreateAPIKeyResponse,create_api_key_response\nCreateAcceleratorRequest,create_accelerator_request\nCreateAcceleratorResponse,create_accelerator_response\nCreateAccessControlConfigurationRequest,create_access_control_configuration_request\nCreateAccessControlConfigurationResponse,create_access_control_configuration_response\nCreateAccessKeyRequest,create_access_key_request\nCreateAccessKeyResponse,create_access_key_response\nCreateAccessLogSubscriptionRequest,create_access_log_subscription_request\nCreateAccessLogSubscriptionResponse,create_access_log_subscription_response\nCreateAccessPointForObjectLambdaRequest,create_access_point_for_object_lambda_request\nCreateAccessPointForObjectLambdaResult,create_access_point_for_object_lambda_result\nCreateAccessPointInput,create_access_point_input\nCreateAccessPointOutput,create_access_point_output\nCreateAccessPointRequest,create_access_point_request\nCreateAccessPointResult,create_access_point_result\nCreateAccessPolicyRequest,create_access_policy_request\nCreateAccessPolicyResponse,create_access_policy_response\nCreateAccessPreviewRequest,create_access_preview_request\nCreateAccessPreviewResponse,create_access_preview_response\nCreateAccessRequest,create_access_request\nCreateAccessResponse,create_access_response\nCreateAccessTokenRequest,create_access_token_request\nCreateAccessTokenResponse,create_access_token_response\nCreateAccessorInput,create_accessor_input\nCreateAccessorOutput,create_accessor_output\nCreateAccountAliasRequest,create_account_alias_request\nCreateAccountAssignmentRequest,create_account_assignment_request\nCreateAccountAssignmentResponse,create_account_assignment_response\nCreateAccountCustomizationRequest,create_account_customization_request\nCreateAccountCustomizationResponse,create_account_customization_response\nCreateAccountRequest,create_account_request\nCreateAccountRequestId,create_account_request_id\nCreateAccountResponse,create_account_response\nCreateAccountStatus,create_account_status\nCreateAccountStatusNotFoundException,create_account_status_not_found_exception\nCreateAccountStatuses,create_account_statuses\nCreateAccountSubscriptionRequest,create_account_subscription_request\nCreateAccountSubscriptionResponse,create_account_subscription_response\nCreateActionRequest,create_action_request\nCreateActionResponse,create_action_response\nCreateActionTargetRequest,create_action_target_request\nCreateActionTargetResponse,create_action_target_response\nCreateActivationRequest,create_activation_request\nCreateActivationResult,create_activation_result\nCreateActivityInput,create_activity_input\nCreateActivityOutput,create_activity_output\nCreateAdditionalAssignmentsForHITRequest,create_additional_assignments_for_hit_request\nCreateAddonRequest,create_addon_request\nCreateAddonResponse,create_addon_response\nCreateAddressBookRequest,create_address_book_request\nCreateAddressBookResponse,create_address_book_response\nCreateAddressRequest,create_address_request\nCreateAddressResult,create_address_result\nCreateAgentRequest,create_agent_request\nCreateAgentResponse,create_agent_response\nCreateAgentStatusRequest,create_agent_status_request\nCreateAgentStatusResponse,create_agent_status_response\nCreateAgreementRequest,create_agreement_request\nCreateAgreementResponse,create_agreement_response\nCreateAlarmModelRequest,create_alarm_model_request\nCreateAlarmModelResponse,create_alarm_model_response\nCreateAlertManagerDefinitionRequest,create_alert_manager_definition_request\nCreateAlertManagerDefinitionResponse,create_alert_manager_definition_response\nCreateAlertRequest,create_alert_request\nCreateAlertResponse,create_alert_response\nCreateAlgorithmInput,create_algorithm_input\nCreateAlgorithmOutput,create_algorithm_output\nCreateAliasInput,create_alias_input\nCreateAliasOutput,create_alias_output\nCreateAliasRequest,create_alias_request\nCreateAliasResult,create_alias_result\nCreateAllowListRequest,create_allow_list_request\nCreateAllowListResponse,create_allow_list_response\nCreateAnalysisRequest,create_analysis_request\nCreateAnalysisResponse,create_analysis_response\nCreateAnalysisTemplateInput,create_analysis_template_input\nCreateAnalysisTemplateOutput,create_analysis_template_output\nCreateAnalyzerRequest,create_analyzer_request\nCreateAnalyzerResponse,create_analyzer_response\nCreateAnnotationStoreRequest,create_annotation_store_request\nCreateAnnotationStoreResponse,create_annotation_store_response\nCreateAnnotationStoreVersionRequest,create_annotation_store_version_request\nCreateAnnotationStoreVersionResponse,create_annotation_store_version_response\nCreateAnomalyDetectorRequest,create_anomaly_detector_request\nCreateAnomalyDetectorResponse,create_anomaly_detector_response\nCreateAnomalyMonitorRequest,create_anomaly_monitor_request\nCreateAnomalyMonitorResponse,create_anomaly_monitor_response\nCreateAnomalySubscriptionRequest,create_anomaly_subscription_request\nCreateAnomalySubscriptionResponse,create_anomaly_subscription_response\nCreateApiCacheRequest,create_api_cache_request\nCreateApiCacheResponse,create_api_cache_response\nCreateApiDestinationRequest,create_api_destination_request\nCreateApiDestinationResponse,create_api_destination_response\nCreateApiKeyRequest,create_api_key_request\nCreateApiKeyResponse,create_api_key_response\nCreateApiMappingRequest,create_api_mapping_request\nCreateApiMappingResponse,create_api_mapping_response\nCreateApiRequest,create_api_request\nCreateApiResponse,create_api_response\nCreateAppAuthorizationRequest,create_app_authorization_request\nCreateAppAuthorizationResponse,create_app_authorization_response\nCreateAppBlockBuilderRequest,create_app_block_builder_request\nCreateAppBlockBuilderResult,create_app_block_builder_result\nCreateAppBlockBuilderStreamingURLRequest,create_app_block_builder_streaming_url_request\nCreateAppBlockBuilderStreamingURLResult,create_app_block_builder_streaming_url_result\nCreateAppBlockRequest,create_app_block_request\nCreateAppBlockResult,create_app_block_result\nCreateAppBundleRequest,create_app_bundle_request\nCreateAppBundleResponse,create_app_bundle_response\nCreateAppCookieStickinessPolicyInput,create_app_cookie_stickiness_policy_input\nCreateAppImageConfigRequest,create_app_image_config_request\nCreateAppImageConfigResponse,create_app_image_config_response\nCreateAppInstanceAdminRequest,create_app_instance_admin_request\nCreateAppInstanceAdminResponse,create_app_instance_admin_response\nCreateAppInstanceBotRequest,create_app_instance_bot_request\nCreateAppInstanceBotResponse,create_app_instance_bot_response\nCreateAppInstanceRequest,create_app_instance_request\nCreateAppInstanceResponse,create_app_instance_response\nCreateAppInstanceUserRequest,create_app_instance_user_request\nCreateAppInstanceUserResponse,create_app_instance_user_response\nCreateAppMonitorRequest,create_app_monitor_request\nCreateAppMonitorResponse,create_app_monitor_response\nCreateAppRequest,create_app_request\nCreateAppResponse,create_app_response\nCreateAppResult,create_app_result\nCreateAppVersionAppComponentRequest,create_app_version_app_component_request\nCreateAppVersionAppComponentResponse,create_app_version_app_component_response\nCreateAppVersionResourceRequest,create_app_version_resource_request\nCreateAppVersionResourceResponse,create_app_version_resource_response\nCreateApplicationInput,create_application_input\nCreateApplicationInstanceRequest,create_application_instance_request\nCreateApplicationInstanceResponse,create_application_instance_response\nCreateApplicationMessage,create_application_message\nCreateApplicationOutput,create_application_output\nCreateApplicationPresignedUrlRequest,create_application_presigned_url_request\nCreateApplicationPresignedUrlResponse,create_application_presigned_url_response\nCreateApplicationRequest,create_application_request\nCreateApplicationResponse,create_application_response\nCreateApplicationResult,create_application_result\nCreateApplicationSnapshotRequest,create_application_snapshot_request\nCreateApplicationVersionMessage,create_application_version_message\nCreateApplicationVersionRequest,create_application_version_request\nCreateApplicationVersionResponse,create_application_version_response\nCreateApprovalRuleTemplateInput,create_approval_rule_template_input\nCreateApprovalRuleTemplateOutput,create_approval_rule_template_output\nCreateArchiveRequest,create_archive_request\nCreateArchiveResponse,create_archive_response\nCreateArchiveRuleRequest,create_archive_rule_request\nCreateArtifactRequest,create_artifact_request\nCreateArtifactResponse,create_artifact_response\nCreateAssessmentFrameworkControl,create_assessment_framework_control\nCreateAssessmentFrameworkControlSet,create_assessment_framework_control_set\nCreateAssessmentFrameworkRequest,create_assessment_framework_request\nCreateAssessmentFrameworkResponse,create_assessment_framework_response\nCreateAssessmentReportRequest,create_assessment_report_request\nCreateAssessmentReportResponse,create_assessment_report_response\nCreateAssessmentRequest,create_assessment_request\nCreateAssessmentResponse,create_assessment_response\nCreateAssessmentTargetRequest,create_assessment_target_request\nCreateAssessmentTargetResponse,create_assessment_target_response\nCreateAssessmentTemplateRequest,create_assessment_template_request\nCreateAssessmentTemplateResponse,create_assessment_template_response\nCreateAssetModelRequest,create_asset_model_request\nCreateAssetModelResponse,create_asset_model_response\nCreateAssetRequest,create_asset_request\nCreateAssetResponse,create_asset_response\nCreateAssistantAssociationRequest,create_assistant_association_request\nCreateAssistantAssociationResponse,create_assistant_association_response\nCreateAssistantRequest,create_assistant_request\nCreateAssistantResponse,create_assistant_response\nCreateAssociationBatchRequest,create_association_batch_request\nCreateAssociationBatchRequestEntry,create_association_batch_request_entry\nCreateAssociationBatchResult,create_association_batch_result\nCreateAssociationRequest,create_association_request\nCreateAssociationResult,create_association_result\nCreateAttendeeError,create_attendee_error\nCreateAttendeeRequest,create_attendee_request\nCreateAttendeeRequestItem,create_attendee_request_item\nCreateAttendeeResponse,create_attendee_response\nCreateAttributeGroupRequest,create_attribute_group_request\nCreateAttributeGroupResponse,create_attribute_group_response\nCreateAuditSuppressionRequest,create_audit_suppression_request\nCreateAuthChallenge,create_auth_challenge\nCreateAuthenticationProfileMessage,create_authentication_profile_message\nCreateAuthenticationProfileResult,create_authentication_profile_result\nCreateAuthorizerRequest,create_authorizer_request\nCreateAuthorizerResponse,create_authorizer_response\nCreateAutoMLJobRequest,create_auto_ml_job_request\nCreateAutoMLJobResponse,create_auto_ml_job_response\nCreateAutoMLJobV2Request,create_auto_ml_job_v2_request\nCreateAutoMLJobV2Response,create_auto_ml_job_v2_response\nCreateAutoPredictorRequest,create_auto_predictor_request\nCreateAutoPredictorResponse,create_auto_predictor_response\nCreateAutoScalingConfigurationRequest,create_auto_scaling_configuration_request\nCreateAutoScalingConfigurationResponse,create_auto_scaling_configuration_response\nCreateAutoScalingGroupType,create_auto_scaling_group_type\nCreateAutomationRuleRequest,create_automation_rule_request\nCreateAutomationRuleResponse,create_automation_rule_response\nCreateAvailabilityConfigurationRequest,create_availability_configuration_request\nCreateAwsLogSourceRequest,create_aws_log_source_request\nCreateAwsLogSourceResponse,create_aws_log_source_response\nCreateBGPPeerRequest,create_bgp_peer_request\nCreateBGPPeerResponse,create_bgp_peer_response\nCreateBackendAPIRequest,create_backend_api_request\nCreateBackendAPIResponse,create_backend_api_response\nCreateBackendAuthForgotPasswordConfig,create_backend_auth_forgot_password_config\nCreateBackendAuthIdentityPoolConfig,create_backend_auth_identity_pool_config\nCreateBackendAuthMFAConfig,create_backend_auth_mfa_config\nCreateBackendAuthOAuthConfig,create_backend_auth_o_auth_config\nCreateBackendAuthPasswordPolicyConfig,create_backend_auth_password_policy_config\nCreateBackendAuthRequest,create_backend_auth_request\nCreateBackendAuthResourceConfig,create_backend_auth_resource_config\nCreateBackendAuthResponse,create_backend_auth_response\nCreateBackendAuthUserPoolConfig,create_backend_auth_user_pool_config\nCreateBackendAuthVerificationMessageConfig,create_backend_auth_verification_message_config\nCreateBackendConfigRequest,create_backend_config_request\nCreateBackendConfigResponse,create_backend_config_response\nCreateBackendEnvironmentRequest,create_backend_environment_request\nCreateBackendEnvironmentResult,create_backend_environment_result\nCreateBackendRequest,create_backend_request\nCreateBackendResponse,create_backend_response\nCreateBackendStorageRequest,create_backend_storage_request\nCreateBackendStorageResourceConfig,create_backend_storage_resource_config\nCreateBackendStorageResponse,create_backend_storage_response\nCreateBackupInput,create_backup_input\nCreateBackupOutput,create_backup_output\nCreateBackupPlanInput,create_backup_plan_input\nCreateBackupPlanOutput,create_backup_plan_output\nCreateBackupRequest,create_backup_request\nCreateBackupResponse,create_backup_response\nCreateBackupSelectionInput,create_backup_selection_input\nCreateBackupSelectionOutput,create_backup_selection_output\nCreateBackupVaultInput,create_backup_vault_input\nCreateBackupVaultOutput,create_backup_vault_output\nCreateBasePathMappingRequest,create_base_path_mapping_request\nCreateBatchImportJobRequest,create_batch_import_job_request\nCreateBatchInferenceJobRequest,create_batch_inference_job_request\nCreateBatchInferenceJobResponse,create_batch_inference_job_response\nCreateBatchLoadTaskRequest,create_batch_load_task_request\nCreateBatchLoadTaskResponse,create_batch_load_task_response\nCreateBatchPredictionInput,create_batch_prediction_input\nCreateBatchPredictionJobRequest,create_batch_prediction_job_request\nCreateBatchPredictionOutput,create_batch_prediction_output\nCreateBatchSegmentJobRequest,create_batch_segment_job_request\nCreateBatchSegmentJobResponse,create_batch_segment_job_response\nCreateBillingGroupInput,create_billing_group_input\nCreateBillingGroupOutput,create_billing_group_output\nCreateBillingGroupRequest,create_billing_group_request\nCreateBillingGroupResponse,create_billing_group_response\nCreateBlueGreenDeploymentRequest,create_blue_green_deployment_request\nCreateBlueGreenDeploymentResponse,create_blue_green_deployment_response\nCreateBlueprintRequest,create_blueprint_request\nCreateBlueprintResponse,create_blueprint_response\nCreateBotAliasRequest,create_bot_alias_request\nCreateBotAliasResponse,create_bot_alias_response\nCreateBotLocaleRequest,create_bot_locale_request\nCreateBotLocaleResponse,create_bot_locale_response\nCreateBotRequest,create_bot_request\nCreateBotResponse,create_bot_response\nCreateBotVersionRequest,create_bot_version_request\nCreateBotVersionResponse,create_bot_version_response\nCreateBranchInput,create_branch_input\nCreateBranchRequest,create_branch_request\nCreateBranchResult,create_branch_result\nCreateBridge420Exception,create_bridge420_exception\nCreateBridgeRequest,create_bridge_request\nCreateBridgeResponse,create_bridge_response\nCreateBrokerRequest,create_broker_request\nCreateBrokerResponse,create_broker_response\nCreateBrowserSettingsRequest,create_browser_settings_request\nCreateBrowserSettingsResponse,create_browser_settings_response\nCreateBucketAccessKeyRequest,create_bucket_access_key_request\nCreateBucketAccessKeyResult,create_bucket_access_key_result\nCreateBucketConfiguration,create_bucket_configuration\nCreateBucketOutput,create_bucket_output\nCreateBucketRequest,create_bucket_request\nCreateBucketResult,create_bucket_result\nCreateBudgetActionRequest,create_budget_action_request\nCreateBudgetActionResponse,create_budget_action_response\nCreateBudgetRequest,create_budget_request\nCreateBuildInput,create_build_input\nCreateBuildOutput,create_build_output\nCreateBulkImportJobRequest,create_bulk_import_job_request\nCreateBulkImportJobResponse,create_bulk_import_job_response\nCreateBusinessReportScheduleRequest,create_business_report_schedule_request\nCreateBusinessReportScheduleResponse,create_business_report_schedule_response\nCreateByteMatchSetRequest,create_byte_match_set_request\nCreateByteMatchSetResponse,create_byte_match_set_response\nCreateCacheClusterMessage,create_cache_cluster_message\nCreateCacheClusterResult,create_cache_cluster_result\nCreateCacheParameterGroupMessage,create_cache_parameter_group_message\nCreateCacheParameterGroupResult,create_cache_parameter_group_result\nCreateCachePolicyRequest,create_cache_policy_request\nCreateCachePolicyResult,create_cache_policy_result\nCreateCacheSecurityGroupMessage,create_cache_security_group_message\nCreateCacheSecurityGroupResult,create_cache_security_group_result\nCreateCacheSubnetGroupMessage,create_cache_subnet_group_message\nCreateCacheSubnetGroupResult,create_cache_subnet_group_result\nCreateCachediSCSIVolumeInput,create_cachedi_scsi_volume_input\nCreateCachediSCSIVolumeOutput,create_cachedi_scsi_volume_output\nCreateCalculatedAttributeDefinitionRequest,create_calculated_attribute_definition_request\nCreateCalculatedAttributeDefinitionResponse,create_calculated_attribute_definition_response\nCreateCallAnalyticsCategoryRequest,create_call_analytics_category_request\nCreateCallAnalyticsCategoryResponse,create_call_analytics_category_response\nCreateCampaignRequest,create_campaign_request\nCreateCampaignResponse,create_campaign_response\nCreateCanaryRequest,create_canary_request\nCreateCanaryResponse,create_canary_response\nCreateCapacityProviderRequest,create_capacity_provider_request\nCreateCapacityProviderResponse,create_capacity_provider_response\nCreateCapacityReservationFleetRequest,create_capacity_reservation_fleet_request\nCreateCapacityReservationFleetResult,create_capacity_reservation_fleet_result\nCreateCapacityReservationInput,create_capacity_reservation_input\nCreateCapacityReservationRequest,create_capacity_reservation_request\nCreateCapacityReservationResult,create_capacity_reservation_result\nCreateCarrierGatewayRequest,create_carrier_gateway_request\nCreateCarrierGatewayResult,create_carrier_gateway_result\nCreateCaseRequest,create_case_request\nCreateCaseResponse,create_case_response\nCreateCellRequest,create_cell_request\nCreateCellResponse,create_cell_response\nCreateCertificateAuthorityAuditReportRequest,create_certificate_authority_audit_report_request\nCreateCertificateAuthorityAuditReportResponse,create_certificate_authority_audit_report_response\nCreateCertificateAuthorityRequest,create_certificate_authority_request\nCreateCertificateAuthorityResponse,create_certificate_authority_response\nCreateCertificateFromCsrRequest,create_certificate_from_csr_request\nCreateCertificateFromCsrResponse,create_certificate_from_csr_response\nCreateCertificateRequest,create_certificate_request\nCreateCertificateResult,create_certificate_result\nCreateChangeSetInput,create_change_set_input\nCreateChangeSetOutput,create_change_set_output\nCreateChangesetRequest,create_changeset_request\nCreateChangesetResponse,create_changeset_response\nCreateChannelBanRequest,create_channel_ban_request\nCreateChannelBanResponse,create_channel_ban_response\nCreateChannelFlowRequest,create_channel_flow_request\nCreateChannelFlowResponse,create_channel_flow_response\nCreateChannelGroupRequest,create_channel_group_request\nCreateChannelGroupResponse,create_channel_group_response\nCreateChannelMembershipRequest,create_channel_membership_request\nCreateChannelMembershipResponse,create_channel_membership_response\nCreateChannelModeratorRequest,create_channel_moderator_request\nCreateChannelModeratorResponse,create_channel_moderator_response\nCreateChannelRequest,create_channel_request\nCreateChannelResponse,create_channel_response\nCreateChatTokenRequest,create_chat_token_request\nCreateChatTokenResponse,create_chat_token_response\nCreateCidrCollectionRequest,create_cidr_collection_request\nCreateCidrCollectionResponse,create_cidr_collection_response\nCreateClassificationJobRequest,create_classification_job_request\nCreateClassificationJobResponse,create_classification_job_response\nCreateClassifierRequest,create_classifier_request\nCreateCliTokenRequest,create_cli_token_request\nCreateCliTokenResponse,create_cli_token_response\nCreateClientVpnEndpointRequest,create_client_vpn_endpoint_request\nCreateClientVpnEndpointResult,create_client_vpn_endpoint_result\nCreateClientVpnRouteRequest,create_client_vpn_route_request\nCreateClientVpnRouteResult,create_client_vpn_route_result\nCreateCloudFormationChangeSetRequest,create_cloud_formation_change_set_request\nCreateCloudFormationChangeSetResponse,create_cloud_formation_change_set_response\nCreateCloudFormationStackRequest,create_cloud_formation_stack_request\nCreateCloudFormationStackResult,create_cloud_formation_stack_result\nCreateCloudFormationTemplateRequest,create_cloud_formation_template_request\nCreateCloudFormationTemplateResponse,create_cloud_formation_template_response\nCreateCloudFrontOriginAccessIdentityRequest,create_cloud_front_origin_access_identity_request\nCreateCloudFrontOriginAccessIdentityResult,create_cloud_front_origin_access_identity_result\nCreateClusterInput,create_cluster_input\nCreateClusterMessage,create_cluster_message\nCreateClusterOutput,create_cluster_output\nCreateClusterParameterGroupMessage,create_cluster_parameter_group_message\nCreateClusterParameterGroupResult,create_cluster_parameter_group_result\nCreateClusterRequest,create_cluster_request\nCreateClusterResponse,create_cluster_response\nCreateClusterResult,create_cluster_result\nCreateClusterSecurityGroupMessage,create_cluster_security_group_message\nCreateClusterSecurityGroupResult,create_cluster_security_group_result\nCreateClusterSnapshotInput,create_cluster_snapshot_input\nCreateClusterSnapshotMessage,create_cluster_snapshot_message\nCreateClusterSnapshotOutput,create_cluster_snapshot_output\nCreateClusterSnapshotResult,create_cluster_snapshot_result\nCreateClusterSubnetGroupMessage,create_cluster_subnet_group_message\nCreateClusterSubnetGroupResult,create_cluster_subnet_group_result\nCreateClusterV2Request,create_cluster_v2_request\nCreateClusterV2Response,create_cluster_v2_response\nCreateCodeRepositoryInput,create_code_repository_input\nCreateCodeRepositoryOutput,create_code_repository_output\nCreateCodeReviewRequest,create_code_review_request\nCreateCodeReviewResponse,create_code_review_response\nCreateCodeSigningConfigRequest,create_code_signing_config_request\nCreateCodeSigningConfigResponse,create_code_signing_config_response\nCreateCoipCidrRequest,create_coip_cidr_request\nCreateCoipCidrResult,create_coip_cidr_result\nCreateCoipPoolRequest,create_coip_pool_request\nCreateCoipPoolResult,create_coip_pool_result\nCreateCollaborationInput,create_collaboration_input\nCreateCollaborationOutput,create_collaboration_output\nCreateCollectionDetail,create_collection_detail\nCreateCollectionRequest,create_collection_request\nCreateCollectionResponse,create_collection_response\nCreateColumn,create_column\nCreateColumnsOperation,create_columns_operation\nCreateCommentRequest,create_comment_request\nCreateCommentResponse,create_comment_response\nCreateCommitInput,create_commit_input\nCreateCommitOutput,create_commit_output\nCreateCompilationJobRequest,create_compilation_job_request\nCreateCompilationJobResponse,create_compilation_job_response\nCreateComponentData,create_component_data\nCreateComponentInput,create_component_input\nCreateComponentOutput,create_component_output\nCreateComponentRequest,create_component_request\nCreateComponentResponse,create_component_response\nCreateComponentTypeRequest,create_component_type_request\nCreateComponentTypeResponse,create_component_type_response\nCreateComponentVersionRequest,create_component_version_request\nCreateComponentVersionResponse,create_component_version_response\nCreateComputeEnvironmentRequest,create_compute_environment_request\nCreateComputeEnvironmentResponse,create_compute_environment_response\nCreateComputerRequest,create_computer_request\nCreateComputerResult,create_computer_result\nCreateConditionalForwarderRequest,create_conditional_forwarder_request\nCreateConferenceProviderRequest,create_conference_provider_request\nCreateConferenceProviderResponse,create_conference_provider_response\nCreateConfigRequest,create_config_request\nCreateConfigurationProfileRequest,create_configuration_profile_request\nCreateConfigurationRequest,create_configuration_request\nCreateConfigurationResponse,create_configuration_response\nCreateConfigurationSetEventDestinationRequest,create_configuration_set_event_destination_request\nCreateConfigurationSetRequest,create_configuration_set_request\nCreateConfigurationSetResult,create_configuration_set_result\nCreateConfigurationSetTrackingOptionsRequest,create_configuration_set_tracking_options_request\nCreateConfigurationTemplateMessage,create_configuration_template_message\nCreateConfiguredTableAnalysisRuleInput,create_configured_table_analysis_rule_input\nCreateConfiguredTableAnalysisRuleOutput,create_configured_table_analysis_rule_output\nCreateConfiguredTableAssociationInput,create_configured_table_association_input\nCreateConfiguredTableAssociationOutput,create_configured_table_association_output\nCreateConfiguredTableInput,create_configured_table_input\nCreateConfiguredTableOutput,create_configured_table_output\nCreateConnectAttachmentRequest,create_connect_attachment_request\nCreateConnectAttachmentResponse,create_connect_attachment_response\nCreateConnectClientAddInRequest,create_connect_client_add_in_request\nCreateConnectClientAddInResult,create_connect_client_add_in_result\nCreateConnectPeerRequest,create_connect_peer_request\nCreateConnectPeerResponse,create_connect_peer_response\nCreateConnectionAliasRequest,create_connection_alias_request\nCreateConnectionAliasResult,create_connection_alias_result\nCreateConnectionApiKeyAuthRequestParameters,create_connection_api_key_auth_request_parameters\nCreateConnectionAuthRequestParameters,create_connection_auth_request_parameters\nCreateConnectionBasicAuthRequestParameters,create_connection_basic_auth_request_parameters\nCreateConnectionInput,create_connection_input\nCreateConnectionOAuthClientRequestParameters,create_connection_o_auth_client_request_parameters\nCreateConnectionOAuthRequestParameters,create_connection_o_auth_request_parameters\nCreateConnectionOutput,create_connection_output\nCreateConnectionRequest,create_connection_request\nCreateConnectionResponse,create_connection_response\nCreateConnectorDefinitionRequest,create_connector_definition_request\nCreateConnectorDefinitionResponse,create_connector_definition_response\nCreateConnectorDefinitionVersionRequest,create_connector_definition_version_request\nCreateConnectorDefinitionVersionResponse,create_connector_definition_version_response\nCreateConnectorProfileRequest,create_connector_profile_request\nCreateConnectorProfileResponse,create_connector_profile_response\nCreateConnectorRequest,create_connector_request\nCreateConnectorResponse,create_connector_response\nCreateConstraintInput,create_constraint_input\nCreateConstraintOutput,create_constraint_output\nCreateContactChannelRequest,create_contact_channel_request\nCreateContactChannelResult,create_contact_channel_result\nCreateContactFlowModuleRequest,create_contact_flow_module_request\nCreateContactFlowModuleResponse,create_contact_flow_module_response\nCreateContactFlowRequest,create_contact_flow_request\nCreateContactFlowResponse,create_contact_flow_response\nCreateContactListRequest,create_contact_list_request\nCreateContactMethodRequest,create_contact_method_request\nCreateContactMethodResult,create_contact_method_result\nCreateContactRequest,create_contact_request\nCreateContactResponse,create_contact_response\nCreateContactResult,create_contact_result\nCreateContainerInput,create_container_input\nCreateContainerOutput,create_container_output\nCreateContainerRecipeRequest,create_container_recipe_request\nCreateContainerRecipeResponse,create_container_recipe_response\nCreateContainerServiceDeploymentRequest,create_container_service_deployment_request\nCreateContainerServiceDeploymentResult,create_container_service_deployment_result\nCreateContainerServiceRegistryLoginResult,create_container_service_registry_login_result\nCreateContainerServiceRequest,create_container_service_request\nCreateContainerServiceResult,create_container_service_result\nCreateContentRequest,create_content_request\nCreateContentResponse,create_content_response\nCreateContextRequest,create_context_request\nCreateContextResponse,create_context_response\nCreateContinuousDeploymentPolicyRequest,create_continuous_deployment_policy_request\nCreateContinuousDeploymentPolicyResult,create_continuous_deployment_policy_result\nCreateControlMappingSource,create_control_mapping_source\nCreateControlPanelRequest,create_control_panel_request\nCreateControlPanelResponse,create_control_panel_response\nCreateControlRequest,create_control_request\nCreateControlResponse,create_control_response\nCreateCoreDefinitionRequest,create_core_definition_request\nCreateCoreDefinitionResponse,create_core_definition_response\nCreateCoreDefinitionVersionRequest,create_core_definition_version_request\nCreateCoreDefinitionVersionResponse,create_core_definition_version_response\nCreateCoreNetworkRequest,create_core_network_request\nCreateCoreNetworkResponse,create_core_network_response\nCreateCostCategoryDefinitionRequest,create_cost_category_definition_request\nCreateCostCategoryDefinitionResponse,create_cost_category_definition_response\nCreateCrawlerRequest,create_crawler_request\nCreateCrossAccountAuthorizationRequest,create_cross_account_authorization_request\nCreateCrossAccountAuthorizationResponse,create_cross_account_authorization_response\nCreateCsvClassifierRequest,create_csv_classifier_request\nCreateCustomActionTypeInput,create_custom_action_type_input\nCreateCustomActionTypeOutput,create_custom_action_type_output\nCreateCustomDBEngineVersionFault,create_custom_db_engine_version_fault\nCreateCustomDBEngineVersionMessage,create_custom_db_engine_version_message\nCreateCustomDataIdentifierRequest,create_custom_data_identifier_request\nCreateCustomDataIdentifierResponse,create_custom_data_identifier_response\nCreateCustomDomainAssociationMessage,create_custom_domain_association_message\nCreateCustomDomainAssociationResult,create_custom_domain_association_result\nCreateCustomEntityTypeRequest,create_custom_entity_type_request\nCreateCustomEntityTypeResponse,create_custom_entity_type_response\nCreateCustomKeyStoreRequest,create_custom_key_store_request\nCreateCustomKeyStoreResponse,create_custom_key_store_response\nCreateCustomLineItemInput,create_custom_line_item_input\nCreateCustomLineItemOutput,create_custom_line_item_output\nCreateCustomLogSourceRequest,create_custom_log_source_request\nCreateCustomLogSourceResponse,create_custom_log_source_response\nCreateCustomMetadataRequest,create_custom_metadata_request\nCreateCustomMetricRequest,create_custom_metric_request\nCreateCustomMetricResponse,create_custom_metric_response\nCreateCustomPluginRequest,create_custom_plugin_request\nCreateCustomPluginResponse,create_custom_plugin_response\nCreateCustomRoutingAcceleratorRequest,create_custom_routing_accelerator_request\nCreateCustomRoutingAcceleratorResponse,create_custom_routing_accelerator_response\nCreateCustomRoutingEndpointGroupRequest,create_custom_routing_endpoint_group_request\nCreateCustomRoutingEndpointGroupResponse,create_custom_routing_endpoint_group_response\nCreateCustomRoutingListenerRequest,create_custom_routing_listener_request\nCreateCustomRoutingListenerResponse,create_custom_routing_listener_response\nCreateCustomVerificationEmailTemplateRequest,create_custom_verification_email_template_request\nCreateCustomerGatewayRequest,create_customer_gateway_request\nCreateCustomerGatewayResult,create_customer_gateway_result\nCreateDBClusterEndpointMessage,create_db_cluster_endpoint_message\nCreateDBClusterEndpointOutput,create_db_cluster_endpoint_output\nCreateDBClusterMessage,create_db_cluster_message\nCreateDBClusterParameterGroupMessage,create_db_cluster_parameter_group_message\nCreateDBClusterParameterGroupResult,create_db_cluster_parameter_group_result\nCreateDBClusterResult,create_db_cluster_result\nCreateDBClusterSnapshotMessage,create_db_cluster_snapshot_message\nCreateDBClusterSnapshotResult,create_db_cluster_snapshot_result\nCreateDBInstanceMessage,create_db_instance_message\nCreateDBInstanceReadReplicaMessage,create_db_instance_read_replica_message\nCreateDBInstanceReadReplicaResult,create_db_instance_read_replica_result\nCreateDBInstanceResult,create_db_instance_result\nCreateDBParameterGroupMessage,create_db_parameter_group_message\nCreateDBParameterGroupResult,create_db_parameter_group_result\nCreateDBProxyEndpointRequest,create_db_proxy_endpoint_request\nCreateDBProxyEndpointResponse,create_db_proxy_endpoint_response\nCreateDBProxyRequest,create_db_proxy_request\nCreateDBProxyResponse,create_db_proxy_response\nCreateDBSecurityGroupMessage,create_db_security_group_message\nCreateDBSecurityGroupResult,create_db_security_group_result\nCreateDBSnapshotMessage,create_db_snapshot_message\nCreateDBSnapshotResult,create_db_snapshot_result\nCreateDBSubnetGroupMessage,create_db_subnet_group_message\nCreateDBSubnetGroupResult,create_db_subnet_group_result\nCreateDashboardRequest,create_dashboard_request\nCreateDashboardResponse,create_dashboard_response\nCreateDataCatalogInput,create_data_catalog_input\nCreateDataCellsFilterRequest,create_data_cells_filter_request\nCreateDataIntegrationRequest,create_data_integration_request\nCreateDataIntegrationResponse,create_data_integration_response\nCreateDataLakeExceptionSubscriptionRequest,create_data_lake_exception_subscription_request\nCreateDataLakeOrganizationConfigurationRequest,create_data_lake_organization_configuration_request\nCreateDataLakeRequest,create_data_lake_request\nCreateDataLakeResponse,create_data_lake_response\nCreateDataProviderMessage,create_data_provider_message\nCreateDataProviderResponse,create_data_provider_response\nCreateDataQualityJobDefinitionRequest,create_data_quality_job_definition_request\nCreateDataQualityJobDefinitionResponse,create_data_quality_job_definition_response\nCreateDataQualityRulesetRequest,create_data_quality_ruleset_request\nCreateDataQualityRulesetResponse,create_data_quality_ruleset_response\nCreateDataRepositoryAssociationRequest,create_data_repository_association_request\nCreateDataRepositoryAssociationResponse,create_data_repository_association_response\nCreateDataRepositoryTaskRequest,create_data_repository_task_request\nCreateDataRepositoryTaskResponse,create_data_repository_task_response\nCreateDataSetImportTaskRequest,create_data_set_import_task_request\nCreateDataSetImportTaskResponse,create_data_set_import_task_response\nCreateDataSetRequest,create_data_set_request\nCreateDataSetResponse,create_data_set_response\nCreateDataSourceFromRDSInput,create_data_source_from_rds_input\nCreateDataSourceFromRDSOutput,create_data_source_from_rds_output\nCreateDataSourceFromRedshiftInput,create_data_source_from_redshift_input\nCreateDataSourceFromRedshiftOutput,create_data_source_from_redshift_output\nCreateDataSourceFromS3Input,create_data_source_from_s3_input\nCreateDataSourceFromS3Output,create_data_source_from_s3_output\nCreateDataSourceRequest,create_data_source_request\nCreateDataSourceResponse,create_data_source_response\nCreateDataViewRequest,create_data_view_request\nCreateDataViewResponse,create_data_view_response\nCreateDatabaseDefaultPermissions,create_database_default_permissions\nCreateDatabaseRequest,create_database_request\nCreateDatabaseResponse,create_database_response\nCreateDataflowEndpointGroupRequest,create_dataflow_endpoint_group_request\nCreateDatasetContentRequest,create_dataset_content_request\nCreateDatasetContentResponse,create_dataset_content_response\nCreateDatasetExportJobRequest,create_dataset_export_job_request\nCreateDatasetExportJobResponse,create_dataset_export_job_response\nCreateDatasetGroupRequest,create_dataset_group_request\nCreateDatasetGroupResponse,create_dataset_group_response\nCreateDatasetImportJobRequest,create_dataset_import_job_request\nCreateDatasetImportJobResponse,create_dataset_import_job_response\nCreateDatasetRequest,create_dataset_request\nCreateDatasetResponse,create_dataset_response\nCreateDatastoreRequest,create_datastore_request\nCreateDatastoreResponse,create_datastore_response\nCreateDate,create_date\nCreateDecoderManifestRequest,create_decoder_manifest_request\nCreateDecoderManifestResponse,create_decoder_manifest_response\nCreateDedicatedIpPoolRequest,create_dedicated_ip_pool_request\nCreateDefaultSubnetRequest,create_default_subnet_request\nCreateDefaultSubnetResult,create_default_subnet_result\nCreateDefaultVpcRequest,create_default_vpc_request\nCreateDefaultVpcResult,create_default_vpc_result\nCreateDelegationRequest,create_delegation_request\nCreateDeliverabilityTestReportRequest,create_deliverability_test_report_request\nCreateDeliverabilityTestReportResponse,create_deliverability_test_report_response\nCreateDeliveryStreamInput,create_delivery_stream_input\nCreateDeliveryStreamOutput,create_delivery_stream_output\nCreateDeploymentConfigInput,create_deployment_config_input\nCreateDeploymentConfigOutput,create_deployment_config_output\nCreateDeploymentGroupInput,create_deployment_group_input\nCreateDeploymentGroupOutput,create_deployment_group_output\nCreateDeploymentInput,create_deployment_input\nCreateDeploymentJobRequest,create_deployment_job_request\nCreateDeploymentJobResponse,create_deployment_job_response\nCreateDeploymentOutput,create_deployment_output\nCreateDeploymentRequest,create_deployment_request\nCreateDeploymentResponse,create_deployment_response\nCreateDeploymentResult,create_deployment_result\nCreateDeploymentStrategyRequest,create_deployment_strategy_request\nCreateDestinationRequest,create_destination_request\nCreateDestinationResponse,create_destination_response\nCreateDetectorModelRequest,create_detector_model_request\nCreateDetectorModelResponse,create_detector_model_response\nCreateDetectorRequest,create_detector_request\nCreateDetectorResponse,create_detector_response\nCreateDetectorVersionRequest,create_detector_version_request\nCreateDetectorVersionResult,create_detector_version_result\nCreateDevEndpointRequest,create_dev_endpoint_request\nCreateDevEndpointResponse,create_dev_endpoint_response\nCreateDevEnvironmentRequest,create_dev_environment_request\nCreateDevEnvironmentResponse,create_dev_environment_response\nCreateDeviceDefinitionRequest,create_device_definition_request\nCreateDeviceDefinitionResponse,create_device_definition_response\nCreateDeviceDefinitionVersionRequest,create_device_definition_version_request\nCreateDeviceDefinitionVersionResponse,create_device_definition_version_response\nCreateDeviceFleetRequest,create_device_fleet_request\nCreateDevicePoolRequest,create_device_pool_request\nCreateDevicePoolResult,create_device_pool_result\nCreateDeviceProfileRequest,create_device_profile_request\nCreateDeviceProfileResponse,create_device_profile_response\nCreateDeviceRequest,create_device_request\nCreateDeviceResponse,create_device_response\nCreateDhcpOptionsRequest,create_dhcp_options_request\nCreateDhcpOptionsResult,create_dhcp_options_result\nCreateDimensionRequest,create_dimension_request\nCreateDimensionResponse,create_dimension_response\nCreateDirectConnectGatewayAssociationProposalRequest,create_direct_connect_gateway_association_proposal_request\nCreateDirectConnectGatewayAssociationProposalResult,create_direct_connect_gateway_association_proposal_result\nCreateDirectConnectGatewayAssociationRequest,create_direct_connect_gateway_association_request\nCreateDirectConnectGatewayAssociationResult,create_direct_connect_gateway_association_result\nCreateDirectConnectGatewayRequest,create_direct_connect_gateway_request\nCreateDirectConnectGatewayResult,create_direct_connect_gateway_result\nCreateDirectoryConfigRequest,create_directory_config_request\nCreateDirectoryConfigResult,create_directory_config_result\nCreateDirectoryRegistrationRequest,create_directory_registration_request\nCreateDirectoryRegistrationResponse,create_directory_registration_response\nCreateDirectoryRequest,create_directory_request\nCreateDirectoryResponse,create_directory_response\nCreateDirectoryResult,create_directory_result\nCreateDiscovererRequest,create_discoverer_request\nCreateDiscovererResponse,create_discoverer_response\nCreateDiskFromSnapshotRequest,create_disk_from_snapshot_request\nCreateDiskFromSnapshotResult,create_disk_from_snapshot_result\nCreateDiskRequest,create_disk_request\nCreateDiskResult,create_disk_result\nCreateDiskSnapshotRequest,create_disk_snapshot_request\nCreateDiskSnapshotResult,create_disk_snapshot_result\nCreateDistributionConfigurationRequest,create_distribution_configuration_request\nCreateDistributionConfigurationResponse,create_distribution_configuration_response\nCreateDistributionRequest,create_distribution_request\nCreateDistributionResult,create_distribution_result\nCreateDistributionWithTagsRequest,create_distribution_with_tags_request\nCreateDistributionWithTagsResult,create_distribution_with_tags_result\nCreateDocumentClassifierRequest,create_document_classifier_request\nCreateDocumentClassifierResponse,create_document_classifier_response\nCreateDocumentRequest,create_document_request\nCreateDocumentResult,create_document_result\nCreateDocumentationPartRequest,create_documentation_part_request\nCreateDocumentationVersionRequest,create_documentation_version_request\nCreateDomainAssociationRequest,create_domain_association_request\nCreateDomainAssociationResult,create_domain_association_result\nCreateDomainConfigurationRequest,create_domain_configuration_request\nCreateDomainConfigurationResponse,create_domain_configuration_response\nCreateDomainEntryRequest,create_domain_entry_request\nCreateDomainEntryResult,create_domain_entry_result\nCreateDomainNameRequest,create_domain_name_request\nCreateDomainNameResponse,create_domain_name_response\nCreateDomainRequest,create_domain_request\nCreateDomainResponse,create_domain_response\nCreateDomainResult,create_domain_result\nCreateDynamicThingGroupRequest,create_dynamic_thing_group_request\nCreateDynamicThingGroupResponse,create_dynamic_thing_group_response\nCreateEdgeDeploymentPlanRequest,create_edge_deployment_plan_request\nCreateEdgeDeploymentPlanResponse,create_edge_deployment_plan_response\nCreateEdgeDeploymentStageRequest,create_edge_deployment_stage_request\nCreateEdgePackagingJobRequest,create_edge_packaging_job_request\nCreateEgressOnlyInternetGatewayRequest,create_egress_only_internet_gateway_request\nCreateEgressOnlyInternetGatewayResult,create_egress_only_internet_gateway_result\nCreateElasticsearchDomainRequest,create_elasticsearch_domain_request\nCreateElasticsearchDomainResponse,create_elasticsearch_domain_response\nCreateEmailIdentityPolicyRequest,create_email_identity_policy_request\nCreateEmailIdentityRequest,create_email_identity_request\nCreateEmailIdentityResponse,create_email_identity_response\nCreateEmailTemplateRequest,create_email_template_request\nCreateEmailTemplateResponse,create_email_template_response\nCreateEndOfMeetingReminder,create_end_of_meeting_reminder\nCreateEndpointAccessMessage,create_endpoint_access_message\nCreateEndpointAccessRequest,create_endpoint_access_request\nCreateEndpointAccessResponse,create_endpoint_access_response\nCreateEndpointConfigInput,create_endpoint_config_input\nCreateEndpointConfigOutput,create_endpoint_config_output\nCreateEndpointGroupRequest,create_endpoint_group_request\nCreateEndpointGroupResponse,create_endpoint_group_response\nCreateEndpointInput,create_endpoint_input\nCreateEndpointMessage,create_endpoint_message\nCreateEndpointOutput,create_endpoint_output\nCreateEndpointRequest,create_endpoint_request\nCreateEndpointResponse,create_endpoint_response\nCreateEndpointResult,create_endpoint_result\nCreateEntitlementRequest,create_entitlement_request\nCreateEntitlementResult,create_entitlement_result\nCreateEntityRecognizerRequest,create_entity_recognizer_request\nCreateEntityRecognizerResponse,create_entity_recognizer_response\nCreateEntityRequest,create_entity_request\nCreateEntityResponse,create_entity_response\nCreateEnvironmentAccountConnectionInput,create_environment_account_connection_input\nCreateEnvironmentAccountConnectionOutput,create_environment_account_connection_output\nCreateEnvironmentEC2Request,create_environment_ec2_request\nCreateEnvironmentEC2Result,create_environment_ec2_result\nCreateEnvironmentInput,create_environment_input\nCreateEnvironmentMembershipRequest,create_environment_membership_request\nCreateEnvironmentMembershipResult,create_environment_membership_result\nCreateEnvironmentMessage,create_environment_message\nCreateEnvironmentOutput,create_environment_output\nCreateEnvironmentRequest,create_environment_request\nCreateEnvironmentResponse,create_environment_response\nCreateEnvironmentTemplateInput,create_environment_template_input\nCreateEnvironmentTemplateOutput,create_environment_template_output\nCreateEnvironmentTemplateVersionInput,create_environment_template_version_input\nCreateEnvironmentTemplateVersionOutput,create_environment_template_version_output\nCreateEphemerisRequest,create_ephemeris_request\nCreateEvaluationFormRequest,create_evaluation_form_request\nCreateEvaluationFormResponse,create_evaluation_form_response\nCreateEvaluationInput,create_evaluation_input\nCreateEvaluationOutput,create_evaluation_output\nCreateEventActionRequest,create_event_action_request\nCreateEventActionResponse,create_event_action_response\nCreateEventBusRequest,create_event_bus_request\nCreateEventBusResponse,create_event_bus_response\nCreateEventDataStoreRequest,create_event_data_store_request\nCreateEventDataStoreResponse,create_event_data_store_response\nCreateEventDestinationRequest,create_event_destination_request\nCreateEventDestinationResult,create_event_destination_result\nCreateEventIntegrationRequest,create_event_integration_request\nCreateEventIntegrationResponse,create_event_integration_response\nCreateEventSourceMappingRequest,create_event_source_mapping_request\nCreateEventStreamRequest,create_event_stream_request\nCreateEventStreamResponse,create_event_stream_response\nCreateEventSubscriptionMessage,create_event_subscription_message\nCreateEventSubscriptionResponse,create_event_subscription_response\nCreateEventSubscriptionResult,create_event_subscription_result\nCreateEventTrackerRequest,create_event_tracker_request\nCreateEventTrackerResponse,create_event_tracker_response\nCreateExclusionsPreviewRequest,create_exclusions_preview_request\nCreateExclusionsPreviewResponse,create_exclusions_preview_response\nCreateExperienceRequest,create_experience_request\nCreateExperienceResponse,create_experience_response\nCreateExperimentRequest,create_experiment_request\nCreateExperimentResponse,create_experiment_response\nCreateExperimentTemplateActionInput,create_experiment_template_action_input\nCreateExperimentTemplateLogConfigurationInput,create_experiment_template_log_configuration_input\nCreateExperimentTemplateRequest,create_experiment_template_request\nCreateExperimentTemplateResponse,create_experiment_template_response\nCreateExperimentTemplateStopConditionInput,create_experiment_template_stop_condition_input\nCreateExperimentTemplateTargetInput,create_experiment_template_target_input\nCreateExplainabilityExportRequest,create_explainability_export_request\nCreateExplainabilityExportResponse,create_explainability_export_response\nCreateExplainabilityRequest,create_explainability_request\nCreateExplainabilityResponse,create_explainability_response\nCreateExportJobRequest,create_export_job_request\nCreateExportJobResponse,create_export_job_response\nCreateExportRequest,create_export_request\nCreateExportResponse,create_export_response\nCreateExportTaskRequest,create_export_task_request\nCreateExportTaskResponse,create_export_task_response\nCreateExtendedSourceServerRequest,create_extended_source_server_request\nCreateExtendedSourceServerResponse,create_extended_source_server_response\nCreateExtensionAssociationRequest,create_extension_association_request\nCreateExtensionRequest,create_extension_request\nCreateFHIRDatastoreRequest,create_fhir_datastore_request\nCreateFHIRDatastoreResponse,create_fhir_datastore_response\nCreateFaceLivenessSessionRequest,create_face_liveness_session_request\nCreateFaceLivenessSessionRequestSettings,create_face_liveness_session_request_settings\nCreateFaceLivenessSessionResponse,create_face_liveness_session_response\nCreateFacetRequest,create_facet_request\nCreateFaqRequest,create_faq_request\nCreateFaqResponse,create_faq_response\nCreateFargateProfileRequest,create_fargate_profile_request\nCreateFargateProfileResponse,create_fargate_profile_response\nCreateFeatureGroupRequest,create_feature_group_request\nCreateFeatureGroupResponse,create_feature_group_response\nCreateFeatureRequest,create_feature_request\nCreateFeatureResponse,create_feature_response\nCreateFeaturedResultsSetRequest,create_featured_results_set_request\nCreateFeaturedResultsSetResponse,create_featured_results_set_response\nCreateFieldLevelEncryptionConfigRequest,create_field_level_encryption_config_request\nCreateFieldLevelEncryptionConfigResult,create_field_level_encryption_config_result\nCreateFieldLevelEncryptionProfileRequest,create_field_level_encryption_profile_request\nCreateFieldLevelEncryptionProfileResult,create_field_level_encryption_profile_result\nCreateFieldRequest,create_field_request\nCreateFieldResponse,create_field_response\nCreateFileCacheLustreConfiguration,create_file_cache_lustre_configuration\nCreateFileCacheRequest,create_file_cache_request\nCreateFileCacheResponse,create_file_cache_response\nCreateFileSystemFromBackupRequest,create_file_system_from_backup_request\nCreateFileSystemFromBackupResponse,create_file_system_from_backup_response\nCreateFileSystemLustreConfiguration,create_file_system_lustre_configuration\nCreateFileSystemOntapConfiguration,create_file_system_ontap_configuration\nCreateFileSystemOpenZFSConfiguration,create_file_system_open_zfs_configuration\nCreateFileSystemRequest,create_file_system_request\nCreateFileSystemResponse,create_file_system_response\nCreateFileSystemWindowsConfiguration,create_file_system_windows_configuration\nCreateFilterRequest,create_filter_request\nCreateFilterResponse,create_filter_response\nCreateFindingAggregatorRequest,create_finding_aggregator_request\nCreateFindingAggregatorResponse,create_finding_aggregator_response\nCreateFindingsFilterRequest,create_findings_filter_request\nCreateFindingsFilterResponse,create_findings_filter_response\nCreateFindingsReportRequest,create_findings_report_request\nCreateFindingsReportResponse,create_findings_report_response\nCreateFirewallDomainListRequest,create_firewall_domain_list_request\nCreateFirewallDomainListResponse,create_firewall_domain_list_response\nCreateFirewallPolicyRequest,create_firewall_policy_request\nCreateFirewallPolicyResponse,create_firewall_policy_response\nCreateFirewallRequest,create_firewall_request\nCreateFirewallResponse,create_firewall_response\nCreateFirewallRuleGroupRequest,create_firewall_rule_group_request\nCreateFirewallRuleGroupResponse,create_firewall_rule_group_response\nCreateFirewallRuleRequest,create_firewall_rule_request\nCreateFirewallRuleResponse,create_firewall_rule_response\nCreateFleetAdvisorCollectorRequest,create_fleet_advisor_collector_request\nCreateFleetAdvisorCollectorResponse,create_fleet_advisor_collector_response\nCreateFleetError,create_fleet_error\nCreateFleetInput,create_fleet_input\nCreateFleetInstance,create_fleet_instance\nCreateFleetLocationsInput,create_fleet_locations_input\nCreateFleetLocationsOutput,create_fleet_locations_output\nCreateFleetMetricRequest,create_fleet_metric_request\nCreateFleetMetricResponse,create_fleet_metric_response\nCreateFleetOutput,create_fleet_output\nCreateFleetRequest,create_fleet_request\nCreateFleetResponse,create_fleet_response\nCreateFleetResult,create_fleet_result\nCreateFlow420Exception,create_flow420_exception\nCreateFlowDefinitionRequest,create_flow_definition_request\nCreateFlowDefinitionResponse,create_flow_definition_response\nCreateFlowLogsRequest,create_flow_logs_request\nCreateFlowLogsResult,create_flow_logs_result\nCreateFlowRequest,create_flow_request\nCreateFlowResponse,create_flow_response\nCreateFlowTemplateRequest,create_flow_template_request\nCreateFlowTemplateResponse,create_flow_template_response\nCreateFlywheelRequest,create_flywheel_request\nCreateFlywheelResponse,create_flywheel_response\nCreateFolderMembershipRequest,create_folder_membership_request\nCreateFolderMembershipResponse,create_folder_membership_response\nCreateFolderRequest,create_folder_request\nCreateFolderResponse,create_folder_response\nCreateForecastExportJobRequest,create_forecast_export_job_request\nCreateForecastExportJobResponse,create_forecast_export_job_response\nCreateForecastRequest,create_forecast_request\nCreateForecastResponse,create_forecast_response\nCreateFormData,create_form_data\nCreateFormRequest,create_form_request\nCreateFormResponse,create_form_response\nCreateFpgaImageRequest,create_fpga_image_request\nCreateFpgaImageResult,create_fpga_image_result\nCreateFrameworkInput,create_framework_input\nCreateFrameworkOutput,create_framework_output\nCreateFreeTierConfig,create_free_tier_config\nCreateFunctionDefinitionRequest,create_function_definition_request\nCreateFunctionDefinitionResponse,create_function_definition_response\nCreateFunctionDefinitionVersionRequest,create_function_definition_version_request\nCreateFunctionDefinitionVersionResponse,create_function_definition_version_response\nCreateFunctionRequest,create_function_request\nCreateFunctionResponse,create_function_response\nCreateFunctionResult,create_function_result\nCreateFunctionUrlConfigRequest,create_function_url_config_request\nCreateFunctionUrlConfigResponse,create_function_url_config_response\nCreateFuotaTaskRequest,create_fuota_task_request\nCreateFuotaTaskResponse,create_fuota_task_response\nCreateGUISessionAccessDetailsRequest,create_gui_session_access_details_request\nCreateGUISessionAccessDetailsResult,create_gui_session_access_details_result\nCreateGameRequest,create_game_request\nCreateGameResult,create_game_result\nCreateGameServerGroupInput,create_game_server_group_input\nCreateGameServerGroupOutput,create_game_server_group_output\nCreateGameSessionInput,create_game_session_input\nCreateGameSessionOutput,create_game_session_output\nCreateGameSessionQueueInput,create_game_session_queue_input\nCreateGameSessionQueueOutput,create_game_session_queue_output\nCreateGateway420Exception,create_gateway420_exception\nCreateGatewayGroupRequest,create_gateway_group_request\nCreateGatewayGroupResponse,create_gateway_group_response\nCreateGatewayInput,create_gateway_input\nCreateGatewayOutput,create_gateway_output\nCreateGatewayRequest,create_gateway_request\nCreateGatewayResponse,create_gateway_response\nCreateGatewayRouteInput,create_gateway_route_input\nCreateGatewayRouteOutput,create_gateway_route_output\nCreateGeoMatchSetRequest,create_geo_match_set_request\nCreateGeoMatchSetResponse,create_geo_match_set_response\nCreateGeofenceCollectionRequest,create_geofence_collection_request\nCreateGeofenceCollectionResponse,create_geofence_collection_response\nCreateGlobalClusterMessage,create_global_cluster_message\nCreateGlobalClusterResult,create_global_cluster_result\nCreateGlobalNetworkRequest,create_global_network_request\nCreateGlobalNetworkResponse,create_global_network_response\nCreateGlobalReplicationGroupMessage,create_global_replication_group_message\nCreateGlobalReplicationGroupResult,create_global_replication_group_result\nCreateGlobalSecondaryIndexAction,create_global_secondary_index_action\nCreateGlobalTableInput,create_global_table_input\nCreateGlobalTableOutput,create_global_table_output\nCreateGovCloudAccountRequest,create_gov_cloud_account_request\nCreateGovCloudAccountResponse,create_gov_cloud_account_response\nCreateGrantRequest,create_grant_request\nCreateGrantResponse,create_grant_response\nCreateGrantVersionRequest,create_grant_version_request\nCreateGrantVersionResponse,create_grant_version_response\nCreateGraphRequest,create_graph_request\nCreateGraphResponse,create_graph_response\nCreateGraphqlApiRequest,create_graphql_api_request\nCreateGraphqlApiResponse,create_graphql_api_response\nCreateGrokClassifierRequest,create_grok_classifier_request\nCreateGroupCertificateAuthorityRequest,create_group_certificate_authority_request\nCreateGroupCertificateAuthorityResponse,create_group_certificate_authority_response\nCreateGroupInput,create_group_input\nCreateGroupMembershipRequest,create_group_membership_request\nCreateGroupMembershipResponse,create_group_membership_response\nCreateGroupOutput,create_group_output\nCreateGroupRequest,create_group_request\nCreateGroupResponse,create_group_response\nCreateGroupResult,create_group_result\nCreateGroupVersionRequest,create_group_version_request\nCreateGroupVersionResponse,create_group_version_response\nCreateHITRequest,create_hit_request\nCreateHITResponse,create_hit_response\nCreateHITTypeRequest,create_hit_type_request\nCreateHITTypeResponse,create_hit_type_response\nCreateHITWithHITTypeRequest,create_hit_with_hit_type_request\nCreateHITWithHITTypeResponse,create_hit_with_hit_type_response\nCreateHapgRequest,create_hapg_request\nCreateHapgResponse,create_hapg_response\nCreateHarvestJobRequest,create_harvest_job_request\nCreateHarvestJobResponse,create_harvest_job_response\nCreateHealthCheckRequest,create_health_check_request\nCreateHealthCheckResponse,create_health_check_response\nCreateHlsManifestConfiguration,create_hls_manifest_configuration\nCreateHomeRegionControlRequest,create_home_region_control_request\nCreateHomeRegionControlResult,create_home_region_control_result\nCreateHostInput,create_host_input\nCreateHostOutput,create_host_output\nCreateHostedConfigurationVersionRequest,create_hosted_configuration_version_request\nCreateHostedZoneRequest,create_hosted_zone_request\nCreateHostedZoneResponse,create_hosted_zone_response\nCreateHoursOfOperationRequest,create_hours_of_operation_request\nCreateHoursOfOperationResponse,create_hours_of_operation_response\nCreateHsmClientCertificateMessage,create_hsm_client_certificate_message\nCreateHsmClientCertificateResult,create_hsm_client_certificate_result\nCreateHsmConfigurationMessage,create_hsm_configuration_message\nCreateHsmConfigurationResult,create_hsm_configuration_result\nCreateHsmRequest,create_hsm_request\nCreateHsmResponse,create_hsm_response\nCreateHttpNamespaceRequest,create_http_namespace_request\nCreateHttpNamespaceResponse,create_http_namespace_response\nCreateHubRequest,create_hub_request\nCreateHubResponse,create_hub_response\nCreateHumanTaskUiRequest,create_human_task_ui_request\nCreateHumanTaskUiResponse,create_human_task_ui_response\nCreateHyperParameterTuningJobRequest,create_hyper_parameter_tuning_job_request\nCreateHyperParameterTuningJobResponse,create_hyper_parameter_tuning_job_response\nCreateIAMPolicyAssignmentRequest,create_iam_policy_assignment_request\nCreateIAMPolicyAssignmentResponse,create_iam_policy_assignment_response\nCreateIPSetRequest,create_ip_set_request\nCreateIPSetResponse,create_ip_set_response\nCreateIdentityPoolInput,create_identity_pool_input\nCreateIdentityProviderRequest,create_identity_provider_request\nCreateIdentityProviderResponse,create_identity_provider_response\nCreateIdentitySourceInput,create_identity_source_input\nCreateIdentitySourceOutput,create_identity_source_output\nCreateImageBuilderRequest,create_image_builder_request\nCreateImageBuilderResult,create_image_builder_result\nCreateImageBuilderStreamingURLRequest,create_image_builder_streaming_url_request\nCreateImageBuilderStreamingURLResult,create_image_builder_streaming_url_result\nCreateImagePipelineRequest,create_image_pipeline_request\nCreateImagePipelineResponse,create_image_pipeline_response\nCreateImageRecipeRequest,create_image_recipe_request\nCreateImageRecipeResponse,create_image_recipe_response\nCreateImageRequest,create_image_request\nCreateImageResponse,create_image_response\nCreateImageResult,create_image_result\nCreateImageVersionRequest,create_image_version_request\nCreateImageVersionResponse,create_image_version_response\nCreateImpersonationRoleRequest,create_impersonation_role_request\nCreateImpersonationRoleResponse,create_impersonation_role_response\nCreateImportJobRequest,create_import_job_request\nCreateImportJobResponse,create_import_job_response\nCreateInAppTemplateRequest,create_in_app_template_request\nCreateInAppTemplateResponse,create_in_app_template_response\nCreateIndex,create_index\nCreateIndexInput,create_index_input\nCreateIndexOutput,create_index_output\nCreateIndexRequest,create_index_request\nCreateIndexResponse,create_index_response\nCreateInferenceExperimentRequest,create_inference_experiment_request\nCreateInferenceExperimentResponse,create_inference_experiment_response\nCreateInferenceRecommendationsJobRequest,create_inference_recommendations_job_request\nCreateInferenceRecommendationsJobResponse,create_inference_recommendations_job_response\nCreateInferenceSchedulerRequest,create_inference_scheduler_request\nCreateInferenceSchedulerResponse,create_inference_scheduler_response\nCreateInfrastructureConfigurationRequest,create_infrastructure_configuration_request\nCreateInfrastructureConfigurationResponse,create_infrastructure_configuration_response\nCreateIngestionDestinationRequest,create_ingestion_destination_request\nCreateIngestionDestinationResponse,create_ingestion_destination_response\nCreateIngestionRequest,create_ingestion_request\nCreateIngestionResponse,create_ingestion_response\nCreateInputRequest,create_input_request\nCreateInputResponse,create_input_response\nCreateInputSecurityGroupRequest,create_input_security_group_request\nCreateInputSecurityGroupResponse,create_input_security_group_response\nCreateInsightRequest,create_insight_request\nCreateInsightResponse,create_insight_response\nCreateInstanceAccessControlAttributeConfigurationRequest,create_instance_access_control_attribute_configuration_request\nCreateInstanceConnectEndpointRequest,create_instance_connect_endpoint_request\nCreateInstanceConnectEndpointResult,create_instance_connect_endpoint_result\nCreateInstanceEventWindowRequest,create_instance_event_window_request\nCreateInstanceEventWindowResult,create_instance_event_window_result\nCreateInstanceExportTaskRequest,create_instance_export_task_request\nCreateInstanceExportTaskResult,create_instance_export_task_result\nCreateInstanceProfileMessage,create_instance_profile_message\nCreateInstanceProfileRequest,create_instance_profile_request\nCreateInstanceProfileResponse,create_instance_profile_response\nCreateInstanceProfileResult,create_instance_profile_result\nCreateInstanceRequest,create_instance_request\nCreateInstanceResponse,create_instance_response\nCreateInstanceResult,create_instance_result\nCreateInstanceSnapshotRequest,create_instance_snapshot_request\nCreateInstanceSnapshotResult,create_instance_snapshot_result\nCreateInstancesFromSnapshotRequest,create_instances_from_snapshot_request\nCreateInstancesFromSnapshotResult,create_instances_from_snapshot_result\nCreateInstancesRequest,create_instances_request\nCreateInstancesResult,create_instances_result\nCreateInstantBooking,create_instant_booking\nCreateIntegrationAssociationRequest,create_integration_association_request\nCreateIntegrationAssociationResponse,create_integration_association_response\nCreateIntegrationRequest,create_integration_request\nCreateIntegrationResponseRequest,create_integration_response_request\nCreateIntegrationResponseResponse,create_integration_response_response\nCreateIntegrationResult,create_integration_result\nCreateIntegrationWorkflowRequest,create_integration_workflow_request\nCreateIntegrationWorkflowResponse,create_integration_workflow_response\nCreateIntentRequest,create_intent_request\nCreateIntentResponse,create_intent_response\nCreateIntentVersionRequest,create_intent_version_request\nCreateIntentVersionResponse,create_intent_version_response\nCreateInterconnectRequest,create_interconnect_request\nCreateInternetGatewayRequest,create_internet_gateway_request\nCreateInternetGatewayResult,create_internet_gateway_result\nCreateInvalidationRequest,create_invalidation_request\nCreateInvalidationResult,create_invalidation_result\nCreateInvitationsRequest,create_invitations_request\nCreateInvitationsResponse,create_invitations_response\nCreateIpAccessSettingsRequest,create_ip_access_settings_request\nCreateIpAccessSettingsResponse,create_ip_access_settings_response\nCreateIpGroupRequest,create_ip_group_request\nCreateIpGroupResult,create_ip_group_result\nCreateIpamPoolRequest,create_ipam_pool_request\nCreateIpamPoolResult,create_ipam_pool_result\nCreateIpamRequest,create_ipam_request\nCreateIpamResourceDiscoveryRequest,create_ipam_resource_discovery_request\nCreateIpamResourceDiscoveryResult,create_ipam_resource_discovery_result\nCreateIpamResult,create_ipam_result\nCreateIpamScopeRequest,create_ipam_scope_request\nCreateIpamScopeResult,create_ipam_scope_result\nCreateJobForDevicesRequest,create_job_for_devices_request\nCreateJobForDevicesResponse,create_job_for_devices_response\nCreateJobOutput,create_job_output\nCreateJobPlaylist,create_job_playlist\nCreateJobQueueRequest,create_job_queue_request\nCreateJobQueueResponse,create_job_queue_response\nCreateJobRequest,create_job_request\nCreateJobResponse,create_job_response\nCreateJobResult,create_job_result\nCreateJobTemplateRequest,create_job_template_request\nCreateJobTemplateResponse,create_job_template_response\nCreateJourneyRequest,create_journey_request\nCreateJourneyResponse,create_journey_response\nCreateJsonClassifierRequest,create_json_classifier_request\nCreateKeyGroupRequest,create_key_group_request\nCreateKeyGroupResult,create_key_group_result\nCreateKeyInput,create_key_input\nCreateKeyOutput,create_key_output\nCreateKeyPairRequest,create_key_pair_request\nCreateKeyPairResult,create_key_pair_result\nCreateKeyRequest,create_key_request\nCreateKeyResponse,create_key_response\nCreateKeySigningKeyRequest,create_key_signing_key_request\nCreateKeySigningKeyResponse,create_key_signing_key_response\nCreateKeysAndCertificateRequest,create_keys_and_certificate_request\nCreateKeysAndCertificateResponse,create_keys_and_certificate_response\nCreateKeyspaceRequest,create_keyspace_request\nCreateKeyspaceResponse,create_keyspace_response\nCreateKnowledgeBaseRequest,create_knowledge_base_request\nCreateKnowledgeBaseResponse,create_knowledge_base_response\nCreateKxChangesetRequest,create_kx_changeset_request\nCreateKxChangesetResponse,create_kx_changeset_response\nCreateKxClusterRequest,create_kx_cluster_request\nCreateKxClusterResponse,create_kx_cluster_response\nCreateKxDatabaseRequest,create_kx_database_request\nCreateKxDatabaseResponse,create_kx_database_response\nCreateKxEnvironmentRequest,create_kx_environment_request\nCreateKxEnvironmentResponse,create_kx_environment_response\nCreateKxUserRequest,create_kx_user_request\nCreateKxUserResponse,create_kx_user_response\nCreateLBCookieStickinessPolicyInput,create_lb_cookie_stickiness_policy_input\nCreateLFTagRequest,create_lf_tag_request\nCreateLabelGroupRequest,create_label_group_request\nCreateLabelGroupResponse,create_label_group_response\nCreateLabelRequest,create_label_request\nCreateLabelResponse,create_label_response\nCreateLabelingJobRequest,create_labeling_job_request\nCreateLabelingJobResponse,create_labeling_job_response\nCreateLabelsRequest,create_labels_request\nCreateLagRequest,create_lag_request\nCreateLakeFormationOptInRequest,create_lake_formation_opt_in_request\nCreateLanguageModelRequest,create_language_model_request\nCreateLanguageModelResponse,create_language_model_response\nCreateLaunchConfigurationTemplateRequest,create_launch_configuration_template_request\nCreateLaunchConfigurationTemplateResponse,create_launch_configuration_template_response\nCreateLaunchConfigurationType,create_launch_configuration_type\nCreateLaunchProfileRequest,create_launch_profile_request\nCreateLaunchProfileResponse,create_launch_profile_response\nCreateLaunchRequest,create_launch_request\nCreateLaunchResponse,create_launch_response\nCreateLaunchTemplateRequest,create_launch_template_request\nCreateLaunchTemplateResult,create_launch_template_result\nCreateLaunchTemplateVersionRequest,create_launch_template_version_request\nCreateLaunchTemplateVersionResult,create_launch_template_version_result\nCreateLayerRequest,create_layer_request\nCreateLayerResult,create_layer_result\nCreateLayoutRequest,create_layout_request\nCreateLayoutResponse,create_layout_response\nCreateLedgerRequest,create_ledger_request\nCreateLedgerResponse,create_ledger_response\nCreateLegalHoldInput,create_legal_hold_input\nCreateLegalHoldOutput,create_legal_hold_output\nCreateLensShareInput,create_lens_share_input\nCreateLensShareOutput,create_lens_share_output\nCreateLensVersionInput,create_lens_version_input\nCreateLensVersionOutput,create_lens_version_output\nCreateLicenseConfigurationRequest,create_license_configuration_request\nCreateLicenseConfigurationResponse,create_license_configuration_response\nCreateLicenseConversionTaskForResourceRequest,create_license_conversion_task_for_resource_request\nCreateLicenseConversionTaskForResourceResponse,create_license_conversion_task_for_resource_response\nCreateLicenseManagerReportGeneratorRequest,create_license_manager_report_generator_request\nCreateLicenseManagerReportGeneratorResponse,create_license_manager_report_generator_response\nCreateLicenseRequest,create_license_request\nCreateLicenseResponse,create_license_response\nCreateLicenseVersionRequest,create_license_version_request\nCreateLicenseVersionResponse,create_license_version_response\nCreateLifecyclePolicyRequest,create_lifecycle_policy_request\nCreateLifecyclePolicyResponse,create_lifecycle_policy_response\nCreateLinkInput,create_link_input\nCreateLinkOutput,create_link_output\nCreateLinkRequest,create_link_request\nCreateLinkResponse,create_link_response\nCreateListRequest,create_list_request\nCreateListenerInput,create_listener_input\nCreateListenerOutput,create_listener_output\nCreateListenerRequest,create_listener_request\nCreateListenerResponse,create_listener_response\nCreateLiveSourceRequest,create_live_source_request\nCreateLiveSourceResponse,create_live_source_response\nCreateLoadBalancerInput,create_load_balancer_input\nCreateLoadBalancerListenerInput,create_load_balancer_listener_input\nCreateLoadBalancerOutput,create_load_balancer_output\nCreateLoadBalancerPolicyInput,create_load_balancer_policy_input\nCreateLoadBalancerRequest,create_load_balancer_request\nCreateLoadBalancerResult,create_load_balancer_result\nCreateLoadBalancerTlsCertificateRequest,create_load_balancer_tls_certificate_request\nCreateLoadBalancerTlsCertificateResult,create_load_balancer_tls_certificate_result\nCreateLocalGatewayRouteRequest,create_local_gateway_route_request\nCreateLocalGatewayRouteResult,create_local_gateway_route_result\nCreateLocalGatewayRouteTableRequest,create_local_gateway_route_table_request\nCreateLocalGatewayRouteTableResult,create_local_gateway_route_table_result\nCreateLocalGatewayRouteTableVirtualInterfaceGroupAssociationRequest,create_local_gateway_route_table_virtual_interface_group_association_request\nCreateLocalGatewayRouteTableVirtualInterfaceGroupAssociationResult,create_local_gateway_route_table_virtual_interface_group_association_result\nCreateLocalGatewayRouteTableVpcAssociationRequest,create_local_gateway_route_table_vpc_association_request\nCreateLocalGatewayRouteTableVpcAssociationResult,create_local_gateway_route_table_vpc_association_result\nCreateLocationAzureBlobRequest,create_location_azure_blob_request\nCreateLocationAzureBlobResponse,create_location_azure_blob_response\nCreateLocationEfsRequest,create_location_efs_request\nCreateLocationEfsResponse,create_location_efs_response\nCreateLocationFsxLustreRequest,create_location_fsx_lustre_request\nCreateLocationFsxLustreResponse,create_location_fsx_lustre_response\nCreateLocationFsxOntapRequest,create_location_fsx_ontap_request\nCreateLocationFsxOntapResponse,create_location_fsx_ontap_response\nCreateLocationFsxOpenZfsRequest,create_location_fsx_open_zfs_request\nCreateLocationFsxOpenZfsResponse,create_location_fsx_open_zfs_response\nCreateLocationFsxWindowsRequest,create_location_fsx_windows_request\nCreateLocationFsxWindowsResponse,create_location_fsx_windows_response\nCreateLocationHdfsRequest,create_location_hdfs_request\nCreateLocationHdfsResponse,create_location_hdfs_response\nCreateLocationInput,create_location_input\nCreateLocationNfsRequest,create_location_nfs_request\nCreateLocationNfsResponse,create_location_nfs_response\nCreateLocationObjectStorageRequest,create_location_object_storage_request\nCreateLocationObjectStorageResponse,create_location_object_storage_response\nCreateLocationOutput,create_location_output\nCreateLocationS3Request,create_location_s3_request\nCreateLocationS3Response,create_location_s3_response\nCreateLocationSmbRequest,create_location_smb_request\nCreateLocationSmbResponse,create_location_smb_response\nCreateLogGroupRequest,create_log_group_request\nCreateLogPatternRequest,create_log_pattern_request\nCreateLogPatternResponse,create_log_pattern_response\nCreateLogStreamRequest,create_log_stream_request\nCreateLogSubscriptionRequest,create_log_subscription_request\nCreateLoggerDefinitionRequest,create_logger_definition_request\nCreateLoggerDefinitionResponse,create_logger_definition_response\nCreateLoggerDefinitionVersionRequest,create_logger_definition_version_request\nCreateLoggerDefinitionVersionResponse,create_logger_definition_version_response\nCreateLoggingConfigurationRequest,create_logging_configuration_request\nCreateLoggingConfigurationResponse,create_logging_configuration_response\nCreateLogicallyAirGappedBackupVaultInput,create_logically_air_gapped_backup_vault_input\nCreateLogicallyAirGappedBackupVaultOutput,create_logically_air_gapped_backup_vault_output\nCreateLoginProfileRequest,create_login_profile_request\nCreateLoginProfileResponse,create_login_profile_response\nCreateLongTermPricingRequest,create_long_term_pricing_request\nCreateLongTermPricingResult,create_long_term_pricing_result\nCreateLowLatencyHlsManifestConfiguration,create_low_latency_hls_manifest_configuration\nCreateLunaClientRequest,create_luna_client_request\nCreateLunaClientResponse,create_luna_client_response\nCreateMLEndpointInput,create_ml_endpoint_input\nCreateMLEndpointOutput,create_ml_endpoint_output\nCreateMLModelInput,create_ml_model_input\nCreateMLModelOutput,create_ml_model_output\nCreateMLTransformRequest,create_ml_transform_request\nCreateMLTransformResponse,create_ml_transform_response\nCreateMaintenanceWindowRequest,create_maintenance_window_request\nCreateMaintenanceWindowResult,create_maintenance_window_result\nCreateManagedEndpointRequest,create_managed_endpoint_request\nCreateManagedEndpointResponse,create_managed_endpoint_response\nCreateManagedPrefixListRequest,create_managed_prefix_list_request\nCreateManagedPrefixListResult,create_managed_prefix_list_result\nCreateMapRequest,create_map_request\nCreateMapResponse,create_map_response\nCreateMatchingWorkflowInput,create_matching_workflow_input\nCreateMatchingWorkflowOutput,create_matching_workflow_output\nCreateMatchmakingConfigurationInput,create_matchmaking_configuration_input\nCreateMatchmakingConfigurationOutput,create_matchmaking_configuration_output\nCreateMatchmakingRuleSetInput,create_matchmaking_rule_set_input\nCreateMatchmakingRuleSetOutput,create_matchmaking_rule_set_output\nCreateMediaCapturePipelineRequest,create_media_capture_pipeline_request\nCreateMediaCapturePipelineResponse,create_media_capture_pipeline_response\nCreateMediaConcatenationPipelineRequest,create_media_concatenation_pipeline_request\nCreateMediaConcatenationPipelineResponse,create_media_concatenation_pipeline_response\nCreateMediaInsightsPipelineConfigurationRequest,create_media_insights_pipeline_configuration_request\nCreateMediaInsightsPipelineConfigurationResponse,create_media_insights_pipeline_configuration_response\nCreateMediaInsightsPipelineRequest,create_media_insights_pipeline_request\nCreateMediaInsightsPipelineResponse,create_media_insights_pipeline_response\nCreateMediaLiveConnectorPipelineRequest,create_media_live_connector_pipeline_request\nCreateMediaLiveConnectorPipelineResponse,create_media_live_connector_pipeline_response\nCreateMediaPipelineKinesisVideoStreamPoolRequest,create_media_pipeline_kinesis_video_stream_pool_request\nCreateMediaPipelineKinesisVideoStreamPoolResponse,create_media_pipeline_kinesis_video_stream_pool_response\nCreateMediaStreamPipelineRequest,create_media_stream_pipeline_request\nCreateMediaStreamPipelineResponse,create_media_stream_pipeline_response\nCreateMedicalVocabularyRequest,create_medical_vocabulary_request\nCreateMedicalVocabularyResponse,create_medical_vocabulary_response\nCreateMeetingDialOutRequest,create_meeting_dial_out_request\nCreateMeetingDialOutResponse,create_meeting_dial_out_response\nCreateMeetingRequest,create_meeting_request\nCreateMeetingResponse,create_meeting_response\nCreateMeetingRoomConfiguration,create_meeting_room_configuration\nCreateMeetingWithAttendeesRequest,create_meeting_with_attendees_request\nCreateMeetingWithAttendeesResponse,create_meeting_with_attendees_response\nCreateMemberInput,create_member_input\nCreateMemberOutput,create_member_output\nCreateMemberRequest,create_member_request\nCreateMemberResponse,create_member_response\nCreateMembersRequest,create_members_request\nCreateMembersResponse,create_members_response\nCreateMembershipInput,create_membership_input\nCreateMembershipOutput,create_membership_output\nCreateMeshInput,create_mesh_input\nCreateMeshOutput,create_mesh_output\nCreateMetricAttributionRequest,create_metric_attribution_request\nCreateMetricAttributionResponse,create_metric_attribution_response\nCreateMetricSetRequest,create_metric_set_request\nCreateMetricSetResponse,create_metric_set_response\nCreateMicrosoftADRequest,create_microsoft_ad_request\nCreateMicrosoftADResult,create_microsoft_ad_result\nCreateMigrationProjectMessage,create_migration_project_message\nCreateMigrationProjectResponse,create_migration_project_response\nCreateMigrationWorkflowRequest,create_migration_workflow_request\nCreateMigrationWorkflowResponse,create_migration_workflow_response\nCreateMilestoneInput,create_milestone_input\nCreateMilestoneOutput,create_milestone_output\nCreateMissionProfileRequest,create_mission_profile_request\nCreateMitigationActionRequest,create_mitigation_action_request\nCreateMitigationActionResponse,create_mitigation_action_response\nCreateMobileDeviceAccessRuleRequest,create_mobile_device_access_rule_request\nCreateMobileDeviceAccessRuleResponse,create_mobile_device_access_rule_response\nCreateModelBiasJobDefinitionRequest,create_model_bias_job_definition_request\nCreateModelBiasJobDefinitionResponse,create_model_bias_job_definition_response\nCreateModelCardExportJobRequest,create_model_card_export_job_request\nCreateModelCardExportJobResponse,create_model_card_export_job_response\nCreateModelCardRequest,create_model_card_request\nCreateModelCardResponse,create_model_card_response\nCreateModelCustomizationJobRequest,create_model_customization_job_request\nCreateModelCustomizationJobResponse,create_model_customization_job_response\nCreateModelExplainabilityJobDefinitionRequest,create_model_explainability_job_definition_request\nCreateModelExplainabilityJobDefinitionResponse,create_model_explainability_job_definition_response\nCreateModelInput,create_model_input\nCreateModelManifestRequest,create_model_manifest_request\nCreateModelManifestResponse,create_model_manifest_response\nCreateModelOutput,create_model_output\nCreateModelPackageGroupInput,create_model_package_group_input\nCreateModelPackageGroupOutput,create_model_package_group_output\nCreateModelPackageInput,create_model_package_input\nCreateModelPackageOutput,create_model_package_output\nCreateModelQualityJobDefinitionRequest,create_model_quality_job_definition_request\nCreateModelQualityJobDefinitionResponse,create_model_quality_job_definition_response\nCreateModelRequest,create_model_request\nCreateModelResponse,create_model_response\nCreateModelVersionRequest,create_model_version_request\nCreateModelVersionResult,create_model_version_result\nCreateMonitorInput,create_monitor_input\nCreateMonitorOutput,create_monitor_output\nCreateMonitorRequest,create_monitor_request\nCreateMonitorResponse,create_monitor_response\nCreateMonitoringScheduleRequest,create_monitoring_schedule_request\nCreateMonitoringScheduleResponse,create_monitoring_schedule_response\nCreateMonitoringSubscriptionRequest,create_monitoring_subscription_request\nCreateMonitoringSubscriptionResult,create_monitoring_subscription_result\nCreateMountTargetRequest,create_mount_target_request\nCreateMultiRegionAccessPointInput,create_multi_region_access_point_input\nCreateMultiRegionAccessPointRequest,create_multi_region_access_point_request\nCreateMultiRegionAccessPointResult,create_multi_region_access_point_result\nCreateMulticastGroupRequest,create_multicast_group_request\nCreateMulticastGroupResponse,create_multicast_group_response\nCreateMultipartReadSetUploadRequest,create_multipart_read_set_upload_request\nCreateMultipartReadSetUploadResponse,create_multipart_read_set_upload_response\nCreateMultipartUploadOutput,create_multipart_upload_output\nCreateMultipartUploadRequest,create_multipart_upload_request\nCreateMultiplexProgramRequest,create_multiplex_program_request\nCreateMultiplexProgramResponse,create_multiplex_program_response\nCreateMultiplexRequest,create_multiplex_request\nCreateMultiplexResponse,create_multiplex_response\nCreateNFSFileShareInput,create_nfs_file_share_input\nCreateNFSFileShareOutput,create_nfs_file_share_output\nCreateNamedQueryInput,create_named_query_input\nCreateNamedQueryOutput,create_named_query_output\nCreateNamespaceRequest,create_namespace_request\nCreateNamespaceResponse,create_namespace_response\nCreateNatGatewayRequest,create_nat_gateway_request\nCreateNatGatewayResult,create_nat_gateway_result\nCreateNativeDeltaTable,create_native_delta_table\nCreateNetworkAclEntryRequest,create_network_acl_entry_request\nCreateNetworkAclRequest,create_network_acl_request\nCreateNetworkAclResult,create_network_acl_result\nCreateNetworkAnalyzerConfigurationRequest,create_network_analyzer_configuration_request\nCreateNetworkAnalyzerConfigurationResponse,create_network_analyzer_configuration_response\nCreateNetworkInput,create_network_input\nCreateNetworkInsightsAccessScopeRequest,create_network_insights_access_scope_request\nCreateNetworkInsightsAccessScopeResult,create_network_insights_access_scope_result\nCreateNetworkInsightsPathRequest,create_network_insights_path_request\nCreateNetworkInsightsPathResult,create_network_insights_path_result\nCreateNetworkInterfacePermissionRequest,create_network_interface_permission_request\nCreateNetworkInterfacePermissionResult,create_network_interface_permission_result\nCreateNetworkInterfaceRequest,create_network_interface_request\nCreateNetworkInterfaceResult,create_network_interface_result\nCreateNetworkOutput,create_network_output\nCreateNetworkProfileRequest,create_network_profile_request\nCreateNetworkProfileResponse,create_network_profile_response\nCreateNetworkProfileResult,create_network_profile_result\nCreateNetworkRequest,create_network_request\nCreateNetworkResponse,create_network_response\nCreateNetworkSettingsRequest,create_network_settings_request\nCreateNetworkSettingsResponse,create_network_settings_response\nCreateNetworkSiteRequest,create_network_site_request\nCreateNetworkSiteResponse,create_network_site_response\nCreateNewVersion,create_new_version\nCreateNodeFromTemplateJobRequest,create_node_from_template_job_request\nCreateNodeFromTemplateJobResponse,create_node_from_template_job_response\nCreateNodeInput,create_node_input\nCreateNodeOutput,create_node_output\nCreateNodegroupRequest,create_nodegroup_request\nCreateNodegroupResponse,create_nodegroup_response\nCreateNotebookInput,create_notebook_input\nCreateNotebookInstanceInput,create_notebook_instance_input\nCreateNotebookInstanceLifecycleConfigInput,create_notebook_instance_lifecycle_config_input\nCreateNotebookInstanceLifecycleConfigOutput,create_notebook_instance_lifecycle_config_output\nCreateNotebookInstanceOutput,create_notebook_instance_output\nCreateNotebookOutput,create_notebook_output\nCreateNotificationRequest,create_notification_request\nCreateNotificationRuleRequest,create_notification_rule_request\nCreateNotificationRuleResult,create_notification_rule_result\nCreateNotificationSubscriptionRequest,create_notification_subscription_request\nCreateNotificationSubscriptionResponse,create_notification_subscription_response\nCreateOTAUpdateRequest,create_ota_update_request\nCreateOTAUpdateResponse,create_ota_update_response\nCreateObject,create_object\nCreateObjectRequest,create_object_request\nCreateObjectResponse,create_object_response\nCreateObservabilityConfigurationRequest,create_observability_configuration_request\nCreateObservabilityConfigurationResponse,create_observability_configuration_response\nCreateOntapVolumeConfiguration,create_ontap_volume_configuration\nCreateOpenIDConnectProviderRequest,create_open_id_connect_provider_request\nCreateOpenIDConnectProviderResponse,create_open_id_connect_provider_response\nCreateOpenZFSOriginSnapshotConfiguration,create_open_zfs_origin_snapshot_configuration\nCreateOpenZFSVolumeConfiguration,create_open_zfs_volume_configuration\nCreateOpsItemRequest,create_ops_item_request\nCreateOpsItemResponse,create_ops_item_response\nCreateOpsMetadataRequest,create_ops_metadata_request\nCreateOpsMetadataResult,create_ops_metadata_result\nCreateOptOutListRequest,create_opt_out_list_request\nCreateOptOutListResult,create_opt_out_list_result\nCreateOptionGroupMessage,create_option_group_message\nCreateOptionGroupResult,create_option_group_result\nCreateOrUpdateTagsType,create_or_update_tags_type\nCreateOrderInput,create_order_input\nCreateOrderOutput,create_order_output\nCreateOrganizationRequest,create_organization_request\nCreateOrganizationResponse,create_organization_response\nCreateOrganizationalUnitRequest,create_organizational_unit_request\nCreateOrganizationalUnitResponse,create_organizational_unit_response\nCreateOriginAccessControlRequest,create_origin_access_control_request\nCreateOriginAccessControlResult,create_origin_access_control_result\nCreateOriginEndpointRequest,create_origin_endpoint_request\nCreateOriginEndpointResponse,create_origin_endpoint_response\nCreateOriginRequestPolicyRequest,create_origin_request_policy_request\nCreateOriginRequestPolicyResult,create_origin_request_policy_result\nCreateOutboundConnectionRequest,create_outbound_connection_request\nCreateOutboundConnectionResponse,create_outbound_connection_response\nCreateOutboundCrossClusterSearchConnectionRequest,create_outbound_cross_cluster_search_connection_request\nCreateOutboundCrossClusterSearchConnectionResponse,create_outbound_cross_cluster_search_connection_response\nCreateOutpostInput,create_outpost_input\nCreateOutpostOutput,create_outpost_output\nCreateOutpostResolverRequest,create_outpost_resolver_request\nCreateOutpostResolverResponse,create_outpost_resolver_response\nCreatePackageImportJobRequest,create_package_import_job_request\nCreatePackageImportJobResponse,create_package_import_job_response\nCreatePackageRequest,create_package_request\nCreatePackageResponse,create_package_response\nCreatePackageVersionRequest,create_package_version_request\nCreatePackageVersionResponse,create_package_version_response\nCreatePackagingConfigurationRequest,create_packaging_configuration_request\nCreatePackagingConfigurationResponse,create_packaging_configuration_response\nCreatePackagingGroupRequest,create_packaging_group_request\nCreatePackagingGroupResponse,create_packaging_group_response\nCreateParallelDataRequest,create_parallel_data_request\nCreateParallelDataResponse,create_parallel_data_response\nCreateParameterGroupRequest,create_parameter_group_request\nCreateParameterGroupResponse,create_parameter_group_response\nCreateParticipantConnectionRequest,create_participant_connection_request\nCreateParticipantConnectionResponse,create_participant_connection_response\nCreateParticipantRequest,create_participant_request\nCreateParticipantResponse,create_participant_response\nCreateParticipantTokenRequest,create_participant_token_request\nCreateParticipantTokenResponse,create_participant_token_response\nCreatePartitionIndexRequest,create_partition_index_request\nCreatePartitionRequest,create_partition_request\nCreatePartnerEventSourceRequest,create_partner_event_source_request\nCreatePartnerEventSourceResponse,create_partner_event_source_response\nCreatePartnerInputRequest,create_partner_input_request\nCreatePartnerInputResponse,create_partner_input_response\nCreatePatchBaselineRequest,create_patch_baseline_request\nCreatePatchBaselineResult,create_patch_baseline_result\nCreatePerformanceAnalysisReportRequest,create_performance_analysis_report_request\nCreatePerformanceAnalysisReportResponse,create_performance_analysis_report_response\nCreatePermissionGroupRequest,create_permission_group_request\nCreatePermissionGroupResponse,create_permission_group_response\nCreatePermissionRequest,create_permission_request\nCreatePermissionResponse,create_permission_response\nCreatePermissionSetRequest,create_permission_set_request\nCreatePermissionSetResponse,create_permission_set_response\nCreatePermissionVersionRequest,create_permission_version_request\nCreatePermissionVersionResponse,create_permission_version_response\nCreatePhoneNumberOrderRequest,create_phone_number_order_request\nCreatePhoneNumberOrderResponse,create_phone_number_order_response\nCreatePipeRequest,create_pipe_request\nCreatePipeResponse,create_pipe_response\nCreatePipelineInput,create_pipeline_input\nCreatePipelineOutput,create_pipeline_output\nCreatePipelineRequest,create_pipeline_request\nCreatePipelineResponse,create_pipeline_response\nCreatePlaceIndexRequest,create_place_index_request\nCreatePlaceIndexResponse,create_place_index_response\nCreatePlacementGroupRequest,create_placement_group_request\nCreatePlacementGroupResult,create_placement_group_result\nCreatePlacementRequest,create_placement_request\nCreatePlatformApplicationInput,create_platform_application_input\nCreatePlatformApplicationResponse,create_platform_application_response\nCreatePlatformEndpointInput,create_platform_endpoint_input\nCreatePlatformVersionRequest,create_platform_version_request\nCreatePlatformVersionResult,create_platform_version_result\nCreatePlayerSessionInput,create_player_session_input\nCreatePlayerSessionOutput,create_player_session_output\nCreatePlayerSessionsInput,create_player_sessions_input\nCreatePlayerSessionsOutput,create_player_sessions_output\nCreatePolicyInput,create_policy_input\nCreatePolicyOutput,create_policy_output\nCreatePolicyRequest,create_policy_request\nCreatePolicyResponse,create_policy_response\nCreatePolicyStoreInput,create_policy_store_input\nCreatePolicyStoreOutput,create_policy_store_output\nCreatePolicyTemplateInput,create_policy_template_input\nCreatePolicyTemplateOutput,create_policy_template_output\nCreatePolicyVersionRequest,create_policy_version_request\nCreatePolicyVersionResponse,create_policy_version_response\nCreatePoolRequest,create_pool_request\nCreatePoolResult,create_pool_result\nCreatePortalRequest,create_portal_request\nCreatePortalResponse,create_portal_response\nCreatePortfolioInput,create_portfolio_input\nCreatePortfolioOutput,create_portfolio_output\nCreatePortfolioShareInput,create_portfolio_share_input\nCreatePortfolioShareOutput,create_portfolio_share_output\nCreatePredictorBacktestExportJobRequest,create_predictor_backtest_export_job_request\nCreatePredictorBacktestExportJobResponse,create_predictor_backtest_export_job_response\nCreatePredictorRequest,create_predictor_request\nCreatePredictorResponse,create_predictor_response\nCreatePrefetchScheduleRequest,create_prefetch_schedule_request\nCreatePrefetchScheduleResponse,create_prefetch_schedule_response\nCreatePreparedStatementInput,create_prepared_statement_input\nCreatePresetRequest,create_preset_request\nCreatePresetResponse,create_preset_response\nCreatePresignedDomainUrlRequest,create_presigned_domain_url_request\nCreatePresignedDomainUrlResponse,create_presigned_domain_url_response\nCreatePresignedNotebookInstanceUrlInput,create_presigned_notebook_instance_url_input\nCreatePresignedNotebookInstanceUrlOutput,create_presigned_notebook_instance_url_output\nCreatePresignedNotebookUrlRequest,create_presigned_notebook_url_request\nCreatePresignedNotebookUrlResponse,create_presigned_notebook_url_response\nCreatePricingPlanInput,create_pricing_plan_input\nCreatePricingPlanOutput,create_pricing_plan_output\nCreatePricingRuleInput,create_pricing_rule_input\nCreatePricingRuleOutput,create_pricing_rule_output\nCreatePrivateDnsNamespaceRequest,create_private_dns_namespace_request\nCreatePrivateDnsNamespaceResponse,create_private_dns_namespace_response\nCreatePrivateVirtualInterfaceRequest,create_private_virtual_interface_request\nCreateProactiveJoin,create_proactive_join\nCreateProcessingJobRequest,create_processing_job_request\nCreateProcessingJobResponse,create_processing_job_response\nCreateProductInput,create_product_input\nCreateProductOutput,create_product_output\nCreateProfileInput,create_profile_input\nCreateProfileJobRequest,create_profile_job_request\nCreateProfileJobResponse,create_profile_job_response\nCreateProfileOutput,create_profile_output\nCreateProfileRequest,create_profile_request\nCreateProfileResponse,create_profile_response\nCreateProfileShareInput,create_profile_share_input\nCreateProfileShareOutput,create_profile_share_output\nCreateProfilingGroupRequest,create_profiling_group_request\nCreateProfilingGroupResponse,create_profiling_group_response\nCreateProgramRequest,create_program_request\nCreateProgramResponse,create_program_response\nCreateProgressUpdateStreamRequest,create_progress_update_stream_request\nCreateProjectInput,create_project_input\nCreateProjectOutput,create_project_output\nCreateProjectRequest,create_project_request\nCreateProjectResponse,create_project_response\nCreateProjectResult,create_project_result\nCreateProjectVersionRequest,create_project_version_request\nCreateProjectVersionResponse,create_project_version_response\nCreatePromptRequest,create_prompt_request\nCreatePromptResponse,create_prompt_response\nCreateProposalInput,create_proposal_input\nCreateProposalOutput,create_proposal_output\nCreateProtectionGroupRequest,create_protection_group_request\nCreateProtectionRequest,create_protection_request\nCreateProtectionResponse,create_protection_response\nCreateProvisionedModelThroughputRequest,create_provisioned_model_throughput_request\nCreateProvisionedModelThroughputResponse,create_provisioned_model_throughput_response\nCreateProvisionedProductPlanInput,create_provisioned_product_plan_input\nCreateProvisionedProductPlanOutput,create_provisioned_product_plan_output\nCreateProvisioningArtifactInput,create_provisioning_artifact_input\nCreateProvisioningArtifactOutput,create_provisioning_artifact_output\nCreateProvisioningClaimRequest,create_provisioning_claim_request\nCreateProvisioningClaimResponse,create_provisioning_claim_response\nCreateProvisioningTemplateRequest,create_provisioning_template_request\nCreateProvisioningTemplateResponse,create_provisioning_template_response\nCreateProvisioningTemplateVersionRequest,create_provisioning_template_version_request\nCreateProvisioningTemplateVersionResponse,create_provisioning_template_version_response\nCreateProxySessionRequest,create_proxy_session_request\nCreateProxySessionResponse,create_proxy_session_response\nCreatePublicDnsNamespaceRequest,create_public_dns_namespace_request\nCreatePublicDnsNamespaceResponse,create_public_dns_namespace_response\nCreatePublicIpv4PoolRequest,create_public_ipv4_pool_request\nCreatePublicIpv4PoolResult,create_public_ipv4_pool_result\nCreatePublicKeyRequest,create_public_key_request\nCreatePublicKeyResult,create_public_key_result\nCreatePublicVirtualInterfaceRequest,create_public_virtual_interface_request\nCreatePublishingDestinationRequest,create_publishing_destination_request\nCreatePublishingDestinationResponse,create_publishing_destination_response\nCreatePullRequestApprovalRuleInput,create_pull_request_approval_rule_input\nCreatePullRequestApprovalRuleOutput,create_pull_request_approval_rule_output\nCreatePullRequestInput,create_pull_request_input\nCreatePullRequestOutput,create_pull_request_output\nCreatePullThroughCacheRuleRequest,create_pull_through_cache_rule_request\nCreatePullThroughCacheRuleResponse,create_pull_through_cache_rule_response\nCreatePushTemplateRequest,create_push_template_request\nCreatePushTemplateResponse,create_push_template_response\nCreateQualificationTypeRequest,create_qualification_type_request\nCreateQualificationTypeResponse,create_qualification_type_response\nCreateQuantumTaskRequest,create_quantum_task_request\nCreateQuantumTaskResponse,create_quantum_task_response\nCreateQueryLoggingConfigRequest,create_query_logging_config_request\nCreateQueryLoggingConfigResponse,create_query_logging_config_response\nCreateQuerySuggestionsBlockListRequest,create_query_suggestions_block_list_request\nCreateQuerySuggestionsBlockListResponse,create_query_suggestions_block_list_response\nCreateQueueRequest,create_queue_request\nCreateQueueResponse,create_queue_response\nCreateQueueResult,create_queue_result\nCreateQuickConnectRequest,create_quick_connect_request\nCreateQuickConnectResponse,create_quick_connect_response\nCreateRateBasedRuleRequest,create_rate_based_rule_request\nCreateRateBasedRuleResponse,create_rate_based_rule_response\nCreateReadinessCheckRequest,create_readiness_check_request\nCreateReadinessCheckResponse,create_readiness_check_response\nCreateRealtimeEndpointInput,create_realtime_endpoint_input\nCreateRealtimeEndpointOutput,create_realtime_endpoint_output\nCreateRealtimeLogConfigRequest,create_realtime_log_config_request\nCreateRealtimeLogConfigResult,create_realtime_log_config_result\nCreateReceiptFilterRequest,create_receipt_filter_request\nCreateReceiptRuleRequest,create_receipt_rule_request\nCreateReceiptRuleSetRequest,create_receipt_rule_set_request\nCreateRecipeJobRequest,create_recipe_job_request\nCreateRecipeJobResponse,create_recipe_job_response\nCreateRecipeRequest,create_recipe_request\nCreateRecipeResponse,create_recipe_response\nCreateRecommendationTemplateRequest,create_recommendation_template_request\nCreateRecommendationTemplateResponse,create_recommendation_template_response\nCreateRecommenderConfiguration,create_recommender_configuration\nCreateRecommenderConfigurationRequest,create_recommender_configuration_request\nCreateRecommenderConfigurationResponse,create_recommender_configuration_response\nCreateRecommenderConfigurationShape,create_recommender_configuration_shape\nCreateRecommenderRequest,create_recommender_request\nCreateRecommenderResponse,create_recommender_response\nCreateRecordingConfigurationRequest,create_recording_configuration_request\nCreateRecordingConfigurationResponse,create_recording_configuration_response\nCreateRecoveryGroupRequest,create_recovery_group_request\nCreateRecoveryGroupResponse,create_recovery_group_response\nCreateReferenceStoreRequest,create_reference_store_request\nCreateReferenceStoreResponse,create_reference_store_response\nCreateRefreshScheduleRequest,create_refresh_schedule_request\nCreateRefreshScheduleResponse,create_refresh_schedule_response\nCreateRegexMatchSetRequest,create_regex_match_set_request\nCreateRegexMatchSetResponse,create_regex_match_set_response\nCreateRegexPatternSetRequest,create_regex_pattern_set_request\nCreateRegexPatternSetResponse,create_regex_pattern_set_response\nCreateRegistryInput,create_registry_input\nCreateRegistryRequest,create_registry_request\nCreateRegistryResponse,create_registry_response\nCreateRelatedItemRequest,create_related_item_request\nCreateRelatedItemResponse,create_related_item_response\nCreateRelationalDatabaseFromSnapshotRequest,create_relational_database_from_snapshot_request\nCreateRelationalDatabaseFromSnapshotResult,create_relational_database_from_snapshot_result\nCreateRelationalDatabaseRequest,create_relational_database_request\nCreateRelationalDatabaseResult,create_relational_database_result\nCreateRelationalDatabaseSnapshotRequest,create_relational_database_snapshot_request\nCreateRelationalDatabaseSnapshotResult,create_relational_database_snapshot_result\nCreateRemoteAccessSessionConfiguration,create_remote_access_session_configuration\nCreateRemoteAccessSessionRequest,create_remote_access_session_request\nCreateRemoteAccessSessionResult,create_remote_access_session_result\nCreateReplaceRootVolumeTaskRequest,create_replace_root_volume_task_request\nCreateReplaceRootVolumeTaskResult,create_replace_root_volume_task_result\nCreateReplicaAction,create_replica_action\nCreateReplicationConfigMessage,create_replication_config_message\nCreateReplicationConfigResponse,create_replication_config_response\nCreateReplicationConfigurationRequest,create_replication_configuration_request\nCreateReplicationConfigurationTemplateRequest,create_replication_configuration_template_request\nCreateReplicationGroupMemberAction,create_replication_group_member_action\nCreateReplicationGroupMessage,create_replication_group_message\nCreateReplicationGroupResult,create_replication_group_result\nCreateReplicationInstanceMessage,create_replication_instance_message\nCreateReplicationInstanceResponse,create_replication_instance_response\nCreateReplicationJobRequest,create_replication_job_request\nCreateReplicationJobResponse,create_replication_job_response\nCreateReplicationSetInput,create_replication_set_input\nCreateReplicationSetOutput,create_replication_set_output\nCreateReplicationSubnetGroupMessage,create_replication_subnet_group_message\nCreateReplicationSubnetGroupResponse,create_replication_subnet_group_response\nCreateReplicationTaskMessage,create_replication_task_message\nCreateReplicationTaskResponse,create_replication_task_response\nCreateReportGroupInput,create_report_group_input\nCreateReportGroupOutput,create_report_group_output\nCreateReportPlanInput,create_report_plan_input\nCreateReportPlanOutput,create_report_plan_output\nCreateRepositoryInput,create_repository_input\nCreateRepositoryOutput,create_repository_output\nCreateRepositoryRequest,create_repository_request\nCreateRepositoryResponse,create_repository_response\nCreateRepositoryResult,create_repository_result\nCreateRequestValidatorRequest,create_request_validator_request\nCreateRequireCheckIn,create_require_check_in\nCreateRescoreExecutionPlanRequest,create_rescore_execution_plan_request\nCreateRescoreExecutionPlanResponse,create_rescore_execution_plan_response\nCreateReservedInstancesListingRequest,create_reserved_instances_listing_request\nCreateReservedInstancesListingResult,create_reserved_instances_listing_result\nCreateResiliencyPolicyRequest,create_resiliency_policy_request\nCreateResiliencyPolicyResponse,create_resiliency_policy_response\nCreateResolverEndpointRequest,create_resolver_endpoint_request\nCreateResolverEndpointResponse,create_resolver_endpoint_response\nCreateResolverQueryLogConfigRequest,create_resolver_query_log_config_request\nCreateResolverQueryLogConfigResponse,create_resolver_query_log_config_response\nCreateResolverRequest,create_resolver_request\nCreateResolverResponse,create_resolver_response\nCreateResolverRuleRequest,create_resolver_rule_request\nCreateResolverRuleResponse,create_resolver_rule_response\nCreateResourceDataSyncRequest,create_resource_data_sync_request\nCreateResourceDefinitionRequest,create_resource_definition_request\nCreateResourceDefinitionResponse,create_resource_definition_response\nCreateResourceDefinitionVersionRequest,create_resource_definition_version_request\nCreateResourceDefinitionVersionResponse,create_resource_definition_version_response\nCreateResourceGroupRequest,create_resource_group_request\nCreateResourceGroupResponse,create_resource_group_response\nCreateResourceInput,create_resource_input\nCreateResourceOutput,create_resource_output\nCreateResourcePolicyRequest,create_resource_policy_request\nCreateResourcePolicyResponse,create_resource_policy_response\nCreateResourcePolicyStatementRequest,create_resource_policy_statement_request\nCreateResourcePolicyStatementResponse,create_resource_policy_statement_response\nCreateResourceRequest,create_resource_request\nCreateResourceResponse,create_resource_response\nCreateResourceServerRequest,create_resource_server_request\nCreateResourceServerResponse,create_resource_server_response\nCreateResourceSetRequest,create_resource_set_request\nCreateResourceSetResponse,create_resource_set_response\nCreateResourceShareRequest,create_resource_share_request\nCreateResourceShareResponse,create_resource_share_response\nCreateResponseHeadersPolicyRequest,create_response_headers_policy_request\nCreateResponseHeadersPolicyResult,create_response_headers_policy_result\nCreateResponsePlanInput,create_response_plan_input\nCreateResponsePlanOutput,create_response_plan_output\nCreateRestApiRequest,create_rest_api_request\nCreateRestoreImageTaskRequest,create_restore_image_task_request\nCreateRestoreImageTaskResult,create_restore_image_task_result\nCreateRetrainingSchedulerRequest,create_retraining_scheduler_request\nCreateRetrainingSchedulerResponse,create_retraining_scheduler_response\nCreateReturnShippingLabelRequest,create_return_shipping_label_request\nCreateReturnShippingLabelResult,create_return_shipping_label_result\nCreateReusableDelegationSetRequest,create_reusable_delegation_set_request\nCreateReusableDelegationSetResponse,create_reusable_delegation_set_response\nCreateRevisionRequest,create_revision_request\nCreateRevisionResponse,create_revision_response\nCreateRobotApplicationRequest,create_robot_application_request\nCreateRobotApplicationResponse,create_robot_application_response\nCreateRobotApplicationVersionRequest,create_robot_application_version_request\nCreateRobotApplicationVersionResponse,create_robot_application_version_response\nCreateRobotRequest,create_robot_request\nCreateRobotResponse,create_robot_response\nCreateRoleAliasRequest,create_role_alias_request\nCreateRoleAliasResponse,create_role_alias_response\nCreateRoleRequest,create_role_request\nCreateRoleResponse,create_role_response\nCreateRoomMembershipRequest,create_room_membership_request\nCreateRoomMembershipResponse,create_room_membership_response\nCreateRoomRequest,create_room_request\nCreateRoomResponse,create_room_response\nCreateRotationOverrideRequest,create_rotation_override_request\nCreateRotationOverrideResult,create_rotation_override_result\nCreateRotationRequest,create_rotation_request\nCreateRotationResult,create_rotation_result\nCreateRouteCalculatorRequest,create_route_calculator_request\nCreateRouteCalculatorResponse,create_route_calculator_response\nCreateRouteInput,create_route_input\nCreateRouteOutput,create_route_output\nCreateRouteRequest,create_route_request\nCreateRouteResponse,create_route_response\nCreateRouteResponseRequest,create_route_response_request\nCreateRouteResponseResponse,create_route_response_response\nCreateRouteResult,create_route_result\nCreateRouteTableRequest,create_route_table_request\nCreateRouteTableResult,create_route_table_result\nCreateRoutingControlRequest,create_routing_control_request\nCreateRoutingControlResponse,create_routing_control_response\nCreateRoutingProfileRequest,create_routing_profile_request\nCreateRoutingProfileResponse,create_routing_profile_response\nCreateRowData,create_row_data\nCreateRule,create_rule\nCreateRuleGroupRequest,create_rule_group_request\nCreateRuleGroupResponse,create_rule_group_response\nCreateRuleGroupsNamespaceRequest,create_rule_groups_namespace_request\nCreateRuleGroupsNamespaceResponse,create_rule_groups_namespace_response\nCreateRuleInput,create_rule_input\nCreateRuleOutput,create_rule_output\nCreateRuleRequest,create_rule_request\nCreateRuleResponse,create_rule_response\nCreateRuleResult,create_rule_result\nCreateRulesetRequest,create_ruleset_request\nCreateRulesetResponse,create_ruleset_response\nCreateRunGroupRequest,create_run_group_request\nCreateRunGroupResponse,create_run_group_response\nCreateS3DataAccessFromS3Bucket,create_s3_data_access_from_s3_bucket\nCreateS3DataAccessFromS3BucketRequestDetails,create_s3_data_access_from_s3_bucket_request_details\nCreateS3DataAccessFromS3BucketResponseDetails,create_s3_data_access_from_s3_bucket_response_details\nCreateSAMLProviderRequest,create_saml_provider_request\nCreateSAMLProviderResponse,create_saml_provider_response\nCreateSMBFileShareInput,create_smb_file_share_input\nCreateSMBFileShareOutput,create_smb_file_share_output\nCreateSMSSandboxPhoneNumberInput,create_sms_sandbox_phone_number_input\nCreateSafetyRuleRequest,create_safety_rule_request\nCreateSafetyRuleResponse,create_safety_rule_response\nCreateSampleFindingsRequest,create_sample_findings_request\nCreateSamplingRuleRequest,create_sampling_rule_request\nCreateSamplingRuleResult,create_sampling_rule_result\nCreateSavingsPlanRequest,create_savings_plan_request\nCreateSavingsPlanResponse,create_savings_plan_response\nCreateSbomExportRequest,create_sbom_export_request\nCreateSbomExportResponse,create_sbom_export_response\nCreateScalingPlanRequest,create_scaling_plan_request\nCreateScalingPlanResponse,create_scaling_plan_response\nCreateScanRequest,create_scan_request\nCreateScanResponse,create_scan_response\nCreateSceneRequest,create_scene_request\nCreateSceneResponse,create_scene_response\nCreateScheduleGroupInput,create_schedule_group_input\nCreateScheduleGroupOutput,create_schedule_group_output\nCreateScheduleInput,create_schedule_input\nCreateScheduleOutput,create_schedule_output\nCreateScheduleRequest,create_schedule_request\nCreateScheduleResponse,create_schedule_response\nCreateScheduledActionMessage,create_scheduled_action_message\nCreateScheduledAuditRequest,create_scheduled_audit_request\nCreateScheduledAuditResponse,create_scheduled_audit_response\nCreateScheduledQueryRequest,create_scheduled_query_request\nCreateScheduledQueryResponse,create_scheduled_query_response\nCreateSchedulingPolicyRequest,create_scheduling_policy_request\nCreateSchedulingPolicyResponse,create_scheduling_policy_response\nCreateSchemaInput,create_schema_input\nCreateSchemaMappingInput,create_schema_mapping_input\nCreateSchemaMappingOutput,create_schema_mapping_output\nCreateSchemaRequest,create_schema_request\nCreateSchemaResponse,create_schema_response\nCreateScriptInput,create_script_input\nCreateScriptOutput,create_script_output\nCreateScriptRequest,create_script_request\nCreateScriptResponse,create_script_response\nCreateSecretRequest,create_secret_request\nCreateSecretResponse,create_secret_response\nCreateSecurityConfigRequest,create_security_config_request\nCreateSecurityConfigResponse,create_security_config_response\nCreateSecurityConfigurationInput,create_security_configuration_input\nCreateSecurityConfigurationOutput,create_security_configuration_output\nCreateSecurityConfigurationRequest,create_security_configuration_request\nCreateSecurityConfigurationResponse,create_security_configuration_response\nCreateSecurityGroupRequest,create_security_group_request\nCreateSecurityGroupResult,create_security_group_result\nCreateSecurityPolicyRequest,create_security_policy_request\nCreateSecurityPolicyResponse,create_security_policy_response\nCreateSecurityProfileRequest,create_security_profile_request\nCreateSecurityProfileResponse,create_security_profile_response\nCreateSegmentRequest,create_segment_request\nCreateSegmentResponse,create_segment_response\nCreateSequenceStoreRequest,create_sequence_store_request\nCreateSequenceStoreResponse,create_sequence_store_response\nCreateServerRequest,create_server_request\nCreateServerResponse,create_server_response\nCreateServiceActionInput,create_service_action_input\nCreateServiceActionOutput,create_service_action_output\nCreateServiceInput,create_service_input\nCreateServiceInstanceInput,create_service_instance_input\nCreateServiceInstanceOutput,create_service_instance_output\nCreateServiceLinkedRoleRequest,create_service_linked_role_request\nCreateServiceLinkedRoleResponse,create_service_linked_role_response\nCreateServiceNetworkRequest,create_service_network_request\nCreateServiceNetworkResponse,create_service_network_response\nCreateServiceNetworkServiceAssociationRequest,create_service_network_service_association_request\nCreateServiceNetworkServiceAssociationResponse,create_service_network_service_association_response\nCreateServiceNetworkVpcAssociationRequest,create_service_network_vpc_association_request\nCreateServiceNetworkVpcAssociationResponse,create_service_network_vpc_association_response\nCreateServiceOutput,create_service_output\nCreateServicePrincipalNameRequest,create_service_principal_name_request\nCreateServiceProfileRequest,create_service_profile_request\nCreateServiceProfileResponse,create_service_profile_response\nCreateServiceRequest,create_service_request\nCreateServiceResponse,create_service_response\nCreateServiceSpecificCredentialRequest,create_service_specific_credential_request\nCreateServiceSpecificCredentialResponse,create_service_specific_credential_response\nCreateServiceSyncConfigInput,create_service_sync_config_input\nCreateServiceSyncConfigOutput,create_service_sync_config_output\nCreateServiceTemplateInput,create_service_template_input\nCreateServiceTemplateOutput,create_service_template_output\nCreateServiceTemplateVersionInput,create_service_template_version_input\nCreateServiceTemplateVersionOutput,create_service_template_version_output\nCreateSessionRequest,create_session_request\nCreateSessionResponse,create_session_response\nCreateShareRequest,create_share_request\nCreateShareResponse,create_share_response\nCreateSignalCatalogRequest,create_signal_catalog_request\nCreateSignalCatalogResponse,create_signal_catalog_response\nCreateSignalingChannelInput,create_signaling_channel_input\nCreateSignalingChannelOutput,create_signaling_channel_output\nCreateSimulationApplicationRequest,create_simulation_application_request\nCreateSimulationApplicationResponse,create_simulation_application_response\nCreateSimulationApplicationVersionRequest,create_simulation_application_version_request\nCreateSimulationApplicationVersionResponse,create_simulation_application_version_response\nCreateSimulationJobRequest,create_simulation_job_request\nCreateSimulationJobResponse,create_simulation_job_response\nCreateSinkInput,create_sink_input\nCreateSinkOutput,create_sink_output\nCreateSipMediaApplicationCallRequest,create_sip_media_application_call_request\nCreateSipMediaApplicationCallResponse,create_sip_media_application_call_response\nCreateSipMediaApplicationRequest,create_sip_media_application_request\nCreateSipMediaApplicationResponse,create_sip_media_application_response\nCreateSipRuleRequest,create_sip_rule_request\nCreateSipRuleResponse,create_sip_rule_response\nCreateSiteInput,create_site_input\nCreateSiteOutput,create_site_output\nCreateSiteRequest,create_site_request\nCreateSiteResponse,create_site_response\nCreateSiteToSiteVpnAttachmentRequest,create_site_to_site_vpn_attachment_request\nCreateSiteToSiteVpnAttachmentResponse,create_site_to_site_vpn_attachment_response\nCreateSizeConstraintSetRequest,create_size_constraint_set_request\nCreateSizeConstraintSetResponse,create_size_constraint_set_response\nCreateSkillGroupRequest,create_skill_group_request\nCreateSkillGroupResponse,create_skill_group_response\nCreateSlackChannelConfigurationRequest,create_slack_channel_configuration_request\nCreateSlotRequest,create_slot_request\nCreateSlotResponse,create_slot_response\nCreateSlotTypeRequest,create_slot_type_request\nCreateSlotTypeResponse,create_slot_type_response\nCreateSlotTypeVersionRequest,create_slot_type_version_request\nCreateSlotTypeVersionResponse,create_slot_type_version_response\nCreateSmsTemplateRequest,create_sms_template_request\nCreateSmsTemplateResponse,create_sms_template_response\nCreateSnaplockConfiguration,create_snaplock_configuration\nCreateSnapshotBeforeSchemaExtension,create_snapshot_before_schema_extension\nCreateSnapshotBeforeUpdate,create_snapshot_before_update\nCreateSnapshotCopyGrantMessage,create_snapshot_copy_grant_message\nCreateSnapshotCopyGrantResult,create_snapshot_copy_grant_result\nCreateSnapshotFromVolumeRecoveryPointInput,create_snapshot_from_volume_recovery_point_input\nCreateSnapshotFromVolumeRecoveryPointOutput,create_snapshot_from_volume_recovery_point_output\nCreateSnapshotInput,create_snapshot_input\nCreateSnapshotMessage,create_snapshot_message\nCreateSnapshotOutput,create_snapshot_output\nCreateSnapshotRequest,create_snapshot_request\nCreateSnapshotResponse,create_snapshot_response\nCreateSnapshotResult,create_snapshot_result\nCreateSnapshotScheduleMessage,create_snapshot_schedule_message\nCreateSnapshotsRequest,create_snapshots_request\nCreateSnapshotsResult,create_snapshots_result\nCreateSoftwareUpdateJobRequest,create_software_update_job_request\nCreateSoftwareUpdateJobResponse,create_software_update_job_response\nCreateSolFunctionPackageInput,create_sol_function_package_input\nCreateSolFunctionPackageOutput,create_sol_function_package_output\nCreateSolNetworkInstanceInput,create_sol_network_instance_input\nCreateSolNetworkInstanceOutput,create_sol_network_instance_output\nCreateSolNetworkPackageInput,create_sol_network_package_input\nCreateSolNetworkPackageOutput,create_sol_network_package_output\nCreateSolutionRequest,create_solution_request\nCreateSolutionResponse,create_solution_response\nCreateSolutionVersionRequest,create_solution_version_request\nCreateSolutionVersionResponse,create_solution_version_response\nCreateSourceLocationRequest,create_source_location_request\nCreateSourceLocationResponse,create_source_location_response\nCreateSourceNetworkRequest,create_source_network_request\nCreateSourceNetworkResponse,create_source_network_response\nCreateSourceRepositoryBranchRequest,create_source_repository_branch_request\nCreateSourceRepositoryBranchResponse,create_source_repository_branch_response\nCreateSourceRepositoryRequest,create_source_repository_request\nCreateSourceRepositoryResponse,create_source_repository_response\nCreateSpaceRequest,create_space_request\nCreateSpaceResponse,create_space_response\nCreateSpotDatafeedSubscriptionRequest,create_spot_datafeed_subscription_request\nCreateSpotDatafeedSubscriptionResult,create_spot_datafeed_subscription_result\nCreateSqlInjectionMatchSetRequest,create_sql_injection_match_set_request\nCreateSqlInjectionMatchSetResponse,create_sql_injection_match_set_response\nCreateStackInput,create_stack_input\nCreateStackInstancesInput,create_stack_instances_input\nCreateStackInstancesOutput,create_stack_instances_output\nCreateStackOutput,create_stack_output\nCreateStackRequest,create_stack_request\nCreateStackResult,create_stack_result\nCreateStackSetInput,create_stack_set_input\nCreateStackSetOutput,create_stack_set_output\nCreateStageRequest,create_stage_request\nCreateStageResponse,create_stage_response\nCreateStageResult,create_stage_result\nCreateStandbyWorkspacesRequest,create_standby_workspaces_request\nCreateStandbyWorkspacesResult,create_standby_workspaces_result\nCreateStateMachineAliasInput,create_state_machine_alias_input\nCreateStateMachineAliasOutput,create_state_machine_alias_output\nCreateStateMachineInput,create_state_machine_input\nCreateStateMachineOutput,create_state_machine_output\nCreateStorageLocationResultMessage,create_storage_location_result_message\nCreateStorageVirtualMachineRequest,create_storage_virtual_machine_request\nCreateStorageVirtualMachineResponse,create_storage_virtual_machine_response\nCreateStoreImageTaskRequest,create_store_image_task_request\nCreateStoreImageTaskResult,create_store_image_task_result\nCreateStorediSCSIVolumeInput,create_storedi_scsi_volume_input\nCreateStorediSCSIVolumeOutput,create_storedi_scsi_volume_output\nCreateStreamInput,create_stream_input\nCreateStreamKeyRequest,create_stream_key_request\nCreateStreamKeyResponse,create_stream_key_response\nCreateStreamOutput,create_stream_output\nCreateStreamProcessorRequest,create_stream_processor_request\nCreateStreamProcessorResponse,create_stream_processor_response\nCreateStreamRequest,create_stream_request\nCreateStreamResponse,create_stream_response\nCreateStreamingDistributionRequest,create_streaming_distribution_request\nCreateStreamingDistributionResult,create_streaming_distribution_result\nCreateStreamingDistributionWithTagsRequest,create_streaming_distribution_with_tags_request\nCreateStreamingDistributionWithTagsResult,create_streaming_distribution_with_tags_result\nCreateStreamingImageRequest,create_streaming_image_request\nCreateStreamingImageResponse,create_streaming_image_response\nCreateStreamingSessionRequest,create_streaming_session_request\nCreateStreamingSessionResponse,create_streaming_session_response\nCreateStreamingSessionStreamRequest,create_streaming_session_stream_request\nCreateStreamingSessionStreamResponse,create_streaming_session_stream_response\nCreateStreamingURLRequest,create_streaming_url_request\nCreateStreamingURLResult,create_streaming_url_result\nCreateStudioComponentRequest,create_studio_component_request\nCreateStudioComponentResponse,create_studio_component_response\nCreateStudioInput,create_studio_input\nCreateStudioLifecycleConfigRequest,create_studio_lifecycle_config_request\nCreateStudioLifecycleConfigResponse,create_studio_lifecycle_config_response\nCreateStudioOutput,create_studio_output\nCreateStudioRequest,create_studio_request\nCreateStudioResponse,create_studio_response\nCreateStudioSessionMappingInput,create_studio_session_mapping_input\nCreateSubnetCidrReservationRequest,create_subnet_cidr_reservation_request\nCreateSubnetCidrReservationResult,create_subnet_cidr_reservation_result\nCreateSubnetGroupRequest,create_subnet_group_request\nCreateSubnetGroupResponse,create_subnet_group_response\nCreateSubnetRequest,create_subnet_request\nCreateSubnetResult,create_subnet_result\nCreateSubscriberNotificationRequest,create_subscriber_notification_request\nCreateSubscriberNotificationResponse,create_subscriber_notification_response\nCreateSubscriberRequest,create_subscriber_request\nCreateSubscriberResponse,create_subscriber_response\nCreateSubscriptionDefinitionRequest,create_subscription_definition_request\nCreateSubscriptionDefinitionResponse,create_subscription_definition_response\nCreateSubscriptionDefinitionVersionRequest,create_subscription_definition_version_request\nCreateSubscriptionDefinitionVersionResponse,create_subscription_definition_version_response\nCreateSuiteDefinitionRequest,create_suite_definition_request\nCreateSuiteDefinitionResponse,create_suite_definition_response\nCreateSvmActiveDirectoryConfiguration,create_svm_active_directory_configuration\nCreateSyncJobRequest,create_sync_job_request\nCreateSyncJobResponse,create_sync_job_response\nCreateSystemInstanceRequest,create_system_instance_request\nCreateSystemInstanceResponse,create_system_instance_response\nCreateSystemTemplateRequest,create_system_template_request\nCreateSystemTemplateResponse,create_system_template_response\nCreateTLSInspectionConfigurationRequest,create_tls_inspection_configuration_request\nCreateTLSInspectionConfigurationResponse,create_tls_inspection_configuration_response\nCreateTableDefaultPermissions,create_table_default_permissions\nCreateTableInput,create_table_input\nCreateTableOutput,create_table_output\nCreateTableRequest,create_table_request\nCreateTableResponse,create_table_response\nCreateTagOptionInput,create_tag_option_input\nCreateTagOptionOutput,create_tag_option_output\nCreateTagsMessage,create_tags_message\nCreateTagsRequest,create_tags_request\nCreateTapePoolInput,create_tape_pool_input\nCreateTapePoolOutput,create_tape_pool_output\nCreateTapeWithBarcodeInput,create_tape_with_barcode_input\nCreateTapeWithBarcodeOutput,create_tape_with_barcode_output\nCreateTapesInput,create_tapes_input\nCreateTapesOutput,create_tapes_output\nCreateTargetGroupInput,create_target_group_input\nCreateTargetGroupOutput,create_target_group_output\nCreateTargetGroupRequest,create_target_group_request\nCreateTargetGroupResponse,create_target_group_response\nCreateTaskInput,create_task_input\nCreateTaskOutput,create_task_output\nCreateTaskRequest,create_task_request\nCreateTaskResponse,create_task_response\nCreateTaskSetRequest,create_task_set_request\nCreateTaskSetResponse,create_task_set_response\nCreateTaskTemplateRequest,create_task_template_request\nCreateTaskTemplateResponse,create_task_template_response\nCreateTemplateAliasRequest,create_template_alias_request\nCreateTemplateAliasResponse,create_template_alias_response\nCreateTemplateGroupAccessControlEntryRequest,create_template_group_access_control_entry_request\nCreateTemplateMessageBody,create_template_message_body\nCreateTemplateRequest,create_template_request\nCreateTemplateResponse,create_template_response\nCreateTemplateSyncConfigInput,create_template_sync_config_input\nCreateTemplateSyncConfigOutput,create_template_sync_config_output\nCreateTestGridProjectRequest,create_test_grid_project_request\nCreateTestGridProjectResult,create_test_grid_project_result\nCreateTestGridUrlRequest,create_test_grid_url_request\nCreateTestGridUrlResult,create_test_grid_url_result\nCreateTestSetDiscrepancyReportRequest,create_test_set_discrepancy_report_request\nCreateTestSetDiscrepancyReportResponse,create_test_set_discrepancy_report_response\nCreateThemeAliasRequest,create_theme_alias_request\nCreateThemeAliasResponse,create_theme_alias_response\nCreateThemeData,create_theme_data\nCreateThemeRequest,create_theme_request\nCreateThemeResponse,create_theme_response\nCreateThesaurusRequest,create_thesaurus_request\nCreateThesaurusResponse,create_thesaurus_response\nCreateThingGroupRequest,create_thing_group_request\nCreateThingGroupResponse,create_thing_group_response\nCreateThingRequest,create_thing_request\nCreateThingResponse,create_thing_response\nCreateThingTypeRequest,create_thing_type_request\nCreateThingTypeResponse,create_thing_type_response\nCreateThreatIntelSetRequest,create_threat_intel_set_request\nCreateThreatIntelSetResponse,create_threat_intel_set_response\nCreateTieringInput,create_tiering_input\nCreateTime,create_time\nCreateTimelineEventInput,create_timeline_event_input\nCreateTimelineEventOutput,create_timeline_event_output\nCreateTimestamp,create_timestamp\nCreateTokenRequest,create_token_request\nCreateTokenResponse,create_token_response\nCreateTopicInput,create_topic_input\nCreateTopicRefreshScheduleRequest,create_topic_refresh_schedule_request\nCreateTopicRefreshScheduleResponse,create_topic_refresh_schedule_response\nCreateTopicRequest,create_topic_request\nCreateTopicResponse,create_topic_response\nCreateTopicRuleDestinationRequest,create_topic_rule_destination_request\nCreateTopicRuleDestinationResponse,create_topic_rule_destination_response\nCreateTopicRuleRequest,create_topic_rule_request\nCreateTrackerRequest,create_tracker_request\nCreateTrackerResponse,create_tracker_response\nCreateTrafficDistributionGroupRequest,create_traffic_distribution_group_request\nCreateTrafficDistributionGroupResponse,create_traffic_distribution_group_response\nCreateTrafficMirrorFilterRequest,create_traffic_mirror_filter_request\nCreateTrafficMirrorFilterResult,create_traffic_mirror_filter_result\nCreateTrafficMirrorFilterRuleRequest,create_traffic_mirror_filter_rule_request\nCreateTrafficMirrorFilterRuleResult,create_traffic_mirror_filter_rule_result\nCreateTrafficMirrorSessionRequest,create_traffic_mirror_session_request\nCreateTrafficMirrorSessionResult,create_traffic_mirror_session_result\nCreateTrafficMirrorTargetRequest,create_traffic_mirror_target_request\nCreateTrafficMirrorTargetResult,create_traffic_mirror_target_result\nCreateTrafficPolicyInstanceRequest,create_traffic_policy_instance_request\nCreateTrafficPolicyInstanceResponse,create_traffic_policy_instance_response\nCreateTrafficPolicyRequest,create_traffic_policy_request\nCreateTrafficPolicyResponse,create_traffic_policy_response\nCreateTrafficPolicyVersionRequest,create_traffic_policy_version_request\nCreateTrafficPolicyVersionResponse,create_traffic_policy_version_response\nCreateTrailRequest,create_trail_request\nCreateTrailResponse,create_trail_response\nCreateTrainingJobRequest,create_training_job_request\nCreateTrainingJobResponse,create_training_job_response\nCreateTransformJobRequest,create_transform_job_request\nCreateTransformJobResponse,create_transform_job_response\nCreateTransitGatewayConnectPeerRequest,create_transit_gateway_connect_peer_request\nCreateTransitGatewayConnectPeerResult,create_transit_gateway_connect_peer_result\nCreateTransitGatewayConnectRequest,create_transit_gateway_connect_request\nCreateTransitGatewayConnectRequestOptions,create_transit_gateway_connect_request_options\nCreateTransitGatewayConnectResult,create_transit_gateway_connect_result\nCreateTransitGatewayMulticastDomainRequest,create_transit_gateway_multicast_domain_request\nCreateTransitGatewayMulticastDomainRequestOptions,create_transit_gateway_multicast_domain_request_options\nCreateTransitGatewayMulticastDomainResult,create_transit_gateway_multicast_domain_result\nCreateTransitGatewayPeeringAttachmentRequest,create_transit_gateway_peering_attachment_request\nCreateTransitGatewayPeeringAttachmentRequestOptions,create_transit_gateway_peering_attachment_request_options\nCreateTransitGatewayPeeringAttachmentResult,create_transit_gateway_peering_attachment_result\nCreateTransitGatewayPeeringRequest,create_transit_gateway_peering_request\nCreateTransitGatewayPeeringResponse,create_transit_gateway_peering_response\nCreateTransitGatewayPolicyTableRequest,create_transit_gateway_policy_table_request\nCreateTransitGatewayPolicyTableResult,create_transit_gateway_policy_table_result\nCreateTransitGatewayPrefixListReferenceRequest,create_transit_gateway_prefix_list_reference_request\nCreateTransitGatewayPrefixListReferenceResult,create_transit_gateway_prefix_list_reference_result\nCreateTransitGatewayRequest,create_transit_gateway_request\nCreateTransitGatewayResult,create_transit_gateway_result\nCreateTransitGatewayRouteRequest,create_transit_gateway_route_request\nCreateTransitGatewayRouteResult,create_transit_gateway_route_result\nCreateTransitGatewayRouteTableAnnouncementRequest,create_transit_gateway_route_table_announcement_request\nCreateTransitGatewayRouteTableAnnouncementResult,create_transit_gateway_route_table_announcement_result\nCreateTransitGatewayRouteTableAttachmentRequest,create_transit_gateway_route_table_attachment_request\nCreateTransitGatewayRouteTableAttachmentResponse,create_transit_gateway_route_table_attachment_response\nCreateTransitGatewayRouteTableRequest,create_transit_gateway_route_table_request\nCreateTransitGatewayRouteTableResult,create_transit_gateway_route_table_result\nCreateTransitGatewayVpcAttachmentRequest,create_transit_gateway_vpc_attachment_request\nCreateTransitGatewayVpcAttachmentRequestOptions,create_transit_gateway_vpc_attachment_request_options\nCreateTransitGatewayVpcAttachmentResult,create_transit_gateway_vpc_attachment_result\nCreateTransitVirtualInterfaceRequest,create_transit_virtual_interface_request\nCreateTransitVirtualInterfaceResult,create_transit_virtual_interface_result\nCreateTrialComponentRequest,create_trial_component_request\nCreateTrialComponentResponse,create_trial_component_response\nCreateTrialRequest,create_trial_request\nCreateTrialResponse,create_trial_response\nCreateTriggerRequest,create_trigger_request\nCreateTriggerResponse,create_trigger_response\nCreateTrustAnchorRequest,create_trust_anchor_request\nCreateTrustRequest,create_trust_request\nCreateTrustResult,create_trust_result\nCreateTrustStoreRequest,create_trust_store_request\nCreateTrustStoreResponse,create_trust_store_response\nCreateTypeRequest,create_type_request\nCreateTypeResponse,create_type_response\nCreateTypedLinkFacetRequest,create_typed_link_facet_request\nCreateUnreferencedMergeCommitInput,create_unreferenced_merge_commit_input\nCreateUnreferencedMergeCommitOutput,create_unreferenced_merge_commit_output\nCreateUpdatedImageRequest,create_updated_image_request\nCreateUpdatedImageResult,create_updated_image_result\nCreateUpdatedWorkspaceImageRequest,create_updated_workspace_image_request\nCreateUpdatedWorkspaceImageResult,create_updated_workspace_image_result\nCreateUploadRequest,create_upload_request\nCreateUploadResult,create_upload_result\nCreateUploadUrlRequest,create_upload_url_request\nCreateUploadUrlResponse,create_upload_url_response\nCreateUsageLimitMessage,create_usage_limit_message\nCreateUsageLimitRequest,create_usage_limit_request\nCreateUsageLimitResponse,create_usage_limit_response\nCreateUsagePlanKeyRequest,create_usage_plan_key_request\nCreateUsagePlanRequest,create_usage_plan_request\nCreateUsageReportSubscriptionResult,create_usage_report_subscription_result\nCreateUseCaseRequest,create_use_case_request\nCreateUseCaseResponse,create_use_case_response\nCreateUserAccessLoggingSettingsRequest,create_user_access_logging_settings_request\nCreateUserAccessLoggingSettingsResponse,create_user_access_logging_settings_response\nCreateUserDefinedFunctionRequest,create_user_defined_function_request\nCreateUserGroupMessage,create_user_group_message\nCreateUserHierarchyGroupRequest,create_user_hierarchy_group_request\nCreateUserHierarchyGroupResponse,create_user_hierarchy_group_response\nCreateUserImportJobRequest,create_user_import_job_request\nCreateUserImportJobResponse,create_user_import_job_response\nCreateUserMessage,create_user_message\nCreateUserPoolClientRequest,create_user_pool_client_request\nCreateUserPoolClientResponse,create_user_pool_client_response\nCreateUserPoolDomainRequest,create_user_pool_domain_request\nCreateUserPoolDomainResponse,create_user_pool_domain_response\nCreateUserPoolRequest,create_user_pool_request\nCreateUserPoolResponse,create_user_pool_response\nCreateUserProfileRequest,create_user_profile_request\nCreateUserProfileResponse,create_user_profile_response\nCreateUserProfileResult,create_user_profile_result\nCreateUserRequest,create_user_request\nCreateUserResponse,create_user_response\nCreateUserSettingsRequest,create_user_settings_request\nCreateUserSettingsResponse,create_user_settings_response\nCreateVPCAssociationAuthorizationRequest,create_vpc_association_authorization_request\nCreateVPCAssociationAuthorizationResponse,create_vpc_association_authorization_response\nCreateVPCConnectionRequest,create_vpc_connection_request\nCreateVPCConnectionResponse,create_vpc_connection_response\nCreateVPCEConfigurationRequest,create_vpce_configuration_request\nCreateVPCEConfigurationResult,create_vpce_configuration_result\nCreateVariableRequest,create_variable_request\nCreateVariantStoreRequest,create_variant_store_request\nCreateVariantStoreResponse,create_variant_store_response\nCreateVaultInput,create_vault_input\nCreateVaultOutput,create_vault_output\nCreateVehicleError,create_vehicle_error\nCreateVehicleRequest,create_vehicle_request\nCreateVehicleRequestItem,create_vehicle_request_item\nCreateVehicleResponse,create_vehicle_response\nCreateVehicleResponseItem,create_vehicle_response_item\nCreateVerifiedAccessEndpointEniOptions,create_verified_access_endpoint_eni_options\nCreateVerifiedAccessEndpointLoadBalancerOptions,create_verified_access_endpoint_load_balancer_options\nCreateVerifiedAccessEndpointRequest,create_verified_access_endpoint_request\nCreateVerifiedAccessEndpointResult,create_verified_access_endpoint_result\nCreateVerifiedAccessGroupRequest,create_verified_access_group_request\nCreateVerifiedAccessGroupResult,create_verified_access_group_result\nCreateVerifiedAccessInstanceRequest,create_verified_access_instance_request\nCreateVerifiedAccessInstanceResult,create_verified_access_instance_result\nCreateVerifiedAccessTrustProviderDeviceOptions,create_verified_access_trust_provider_device_options\nCreateVerifiedAccessTrustProviderOidcOptions,create_verified_access_trust_provider_oidc_options\nCreateVerifiedAccessTrustProviderRequest,create_verified_access_trust_provider_request\nCreateVerifiedAccessTrustProviderResult,create_verified_access_trust_provider_result\nCreateViewInput,create_view_input\nCreateViewOutput,create_view_output\nCreateViewRequest,create_view_request\nCreateViewResponse,create_view_response\nCreateViewVersionRequest,create_view_version_request\nCreateViewVersionResponse,create_view_version_response\nCreateVirtualClusterRequest,create_virtual_cluster_request\nCreateVirtualClusterResponse,create_virtual_cluster_response\nCreateVirtualGatewayInput,create_virtual_gateway_input\nCreateVirtualGatewayOutput,create_virtual_gateway_output\nCreateVirtualMFADeviceRequest,create_virtual_mfa_device_request\nCreateVirtualMFADeviceResponse,create_virtual_mfa_device_response\nCreateVirtualNodeInput,create_virtual_node_input\nCreateVirtualNodeOutput,create_virtual_node_output\nCreateVirtualRouterInput,create_virtual_router_input\nCreateVirtualRouterOutput,create_virtual_router_output\nCreateVirtualServiceInput,create_virtual_service_input\nCreateVirtualServiceOutput,create_virtual_service_output\nCreateVocabularyFilterRequest,create_vocabulary_filter_request\nCreateVocabularyFilterResponse,create_vocabulary_filter_response\nCreateVocabularyRequest,create_vocabulary_request\nCreateVocabularyResponse,create_vocabulary_response\nCreateVodSourceRequest,create_vod_source_request\nCreateVodSourceResponse,create_vod_source_response\nCreateVoiceConnectorGroupRequest,create_voice_connector_group_request\nCreateVoiceConnectorGroupResponse,create_voice_connector_group_response\nCreateVoiceConnectorRequest,create_voice_connector_request\nCreateVoiceConnectorResponse,create_voice_connector_response\nCreateVoiceProfileDomainRequest,create_voice_profile_domain_request\nCreateVoiceProfileDomainResponse,create_voice_profile_domain_response\nCreateVoiceProfileRequest,create_voice_profile_request\nCreateVoiceProfileResponse,create_voice_profile_response\nCreateVoiceTemplateRequest,create_voice_template_request\nCreateVoiceTemplateResponse,create_voice_template_response\nCreateVolumeFromBackupRequest,create_volume_from_backup_request\nCreateVolumeFromBackupResponse,create_volume_from_backup_response\nCreateVolumePermission,create_volume_permission\nCreateVolumePermissionModifications,create_volume_permission_modifications\nCreateVolumePermissions,create_volume_permissions\nCreateVolumeRequest,create_volume_request\nCreateVolumeResponse,create_volume_response\nCreateVpcAttachmentRequest,create_vpc_attachment_request\nCreateVpcAttachmentResponse,create_vpc_attachment_response\nCreateVpcConnectionRequest,create_vpc_connection_request\nCreateVpcConnectionResponse,create_vpc_connection_response\nCreateVpcConnectorRequest,create_vpc_connector_request\nCreateVpcConnectorResponse,create_vpc_connector_response\nCreateVpcEndpointConnectionNotificationRequest,create_vpc_endpoint_connection_notification_request\nCreateVpcEndpointConnectionNotificationResult,create_vpc_endpoint_connection_notification_result\nCreateVpcEndpointDetail,create_vpc_endpoint_detail\nCreateVpcEndpointRequest,create_vpc_endpoint_request\nCreateVpcEndpointResponse,create_vpc_endpoint_response\nCreateVpcEndpointResult,create_vpc_endpoint_result\nCreateVpcEndpointServiceConfigurationRequest,create_vpc_endpoint_service_configuration_request\nCreateVpcEndpointServiceConfigurationResult,create_vpc_endpoint_service_configuration_result\nCreateVpcIngressConnectionRequest,create_vpc_ingress_connection_request\nCreateVpcIngressConnectionResponse,create_vpc_ingress_connection_response\nCreateVpcLinkRequest,create_vpc_link_request\nCreateVpcLinkResponse,create_vpc_link_response\nCreateVpcPeeringAuthorizationInput,create_vpc_peering_authorization_input\nCreateVpcPeeringAuthorizationOutput,create_vpc_peering_authorization_output\nCreateVpcPeeringConnectionInput,create_vpc_peering_connection_input\nCreateVpcPeeringConnectionRequest,create_vpc_peering_connection_request\nCreateVpcPeeringConnectionResult,create_vpc_peering_connection_result\nCreateVpcRequest,create_vpc_request\nCreateVpcResult,create_vpc_result\nCreateVpnConnectionRequest,create_vpn_connection_request\nCreateVpnConnectionResult,create_vpn_connection_result\nCreateVpnConnectionRouteRequest,create_vpn_connection_route_request\nCreateVpnGatewayRequest,create_vpn_gateway_request\nCreateVpnGatewayResult,create_vpn_gateway_result\nCreateWatchlistRequest,create_watchlist_request\nCreateWatchlistResponse,create_watchlist_response\nCreateWaveRequest,create_wave_request\nCreateWebACLMigrationStackRequest,create_web_acl_migration_stack_request\nCreateWebACLMigrationStackResponse,create_web_acl_migration_stack_response\nCreateWebACLRequest,create_web_acl_request\nCreateWebACLResponse,create_web_acl_response\nCreateWebLoginTokenRequest,create_web_login_token_request\nCreateWebLoginTokenResponse,create_web_login_token_response\nCreateWebhookInput,create_webhook_input\nCreateWebhookOutput,create_webhook_output\nCreateWebhookRequest,create_webhook_request\nCreateWebhookResult,create_webhook_result\nCreateWhatIfAnalysisRequest,create_what_if_analysis_request\nCreateWhatIfAnalysisResponse,create_what_if_analysis_response\nCreateWhatIfForecastExportRequest,create_what_if_forecast_export_request\nCreateWhatIfForecastExportResponse,create_what_if_forecast_export_response\nCreateWhatIfForecastRequest,create_what_if_forecast_request\nCreateWhatIfForecastResponse,create_what_if_forecast_response\nCreateWirelessDeviceRequest,create_wireless_device_request\nCreateWirelessDeviceResponse,create_wireless_device_response\nCreateWirelessGatewayRequest,create_wireless_gateway_request\nCreateWirelessGatewayResponse,create_wireless_gateway_response\nCreateWirelessGatewayTaskDefinitionRequest,create_wireless_gateway_task_definition_request\nCreateWirelessGatewayTaskDefinitionResponse,create_wireless_gateway_task_definition_response\nCreateWirelessGatewayTaskRequest,create_wireless_gateway_task_request\nCreateWirelessGatewayTaskResponse,create_wireless_gateway_task_response\nCreateWorkGroupInput,create_work_group_input\nCreateWorkerBlockRequest,create_worker_block_request\nCreateWorkerConfigurationRequest,create_worker_configuration_request\nCreateWorkerConfigurationResponse,create_worker_configuration_response\nCreateWorkerFleetRequest,create_worker_fleet_request\nCreateWorkerFleetResponse,create_worker_fleet_response\nCreateWorkerRequest,create_worker_request\nCreateWorkerResponse,create_worker_response\nCreateWorkflowRequest,create_workflow_request\nCreateWorkflowResponse,create_workflow_response\nCreateWorkflowStepGroupRequest,create_workflow_step_group_request\nCreateWorkflowStepGroupResponse,create_workflow_step_group_response\nCreateWorkflowStepRequest,create_workflow_step_request\nCreateWorkflowStepResponse,create_workflow_step_response\nCreateWorkforceRequest,create_workforce_request\nCreateWorkforceResponse,create_workforce_response\nCreateWorkgroupRequest,create_workgroup_request\nCreateWorkgroupResponse,create_workgroup_response\nCreateWorkloadInput,create_workload_input\nCreateWorkloadOutput,create_workload_output\nCreateWorkloadShareInput,create_workload_share_input\nCreateWorkloadShareOutput,create_workload_share_output\nCreateWorkspaceApiKeyRequest,create_workspace_api_key_request\nCreateWorkspaceApiKeyResponse,create_workspace_api_key_response\nCreateWorkspaceBundleRequest,create_workspace_bundle_request\nCreateWorkspaceBundleResult,create_workspace_bundle_result\nCreateWorkspaceImageRequest,create_workspace_image_request\nCreateWorkspaceImageResult,create_workspace_image_result\nCreateWorkspaceRequest,create_workspace_request\nCreateWorkspaceResponse,create_workspace_response\nCreateWorkspacesRequest,create_workspaces_request\nCreateWorkspacesResult,create_workspaces_result\nCreateWorkteamRequest,create_workteam_request\nCreateWorkteamResponse,create_workteam_response\nCreateWorldExportJobRequest,create_world_export_job_request\nCreateWorldExportJobResponse,create_world_export_job_response\nCreateWorldGenerationJobRequest,create_world_generation_job_request\nCreateWorldGenerationJobResponse,create_world_generation_job_response\nCreateWorldTemplateRequest,create_world_template_request\nCreateWorldTemplateResponse,create_world_template_response\nCreateXMLClassifierRequest,create_xml_classifier_request\nCreateXssMatchSetRequest,create_xss_match_set_request\nCreateXssMatchSetResponse,create_xss_match_set_response\nCreated,created\nCreatedAfter,created_after\nCreatedArtifact,created_artifact\nCreatedArtifactList,created_artifact_list\nCreatedArtifactName,created_artifact_name\nCreatedAt,created_at\nCreatedAtEndTime,created_at_end_time\nCreatedAtStartTime,created_at_start_time\nCreatedBefore,created_before\nCreatedButModifiedException,created_but_modified_exception\nCreatedBy,created_by\nCreatedByAccountId,created_by_account_id\nCreatedByArn,created_by_arn\nCreatedByIamUser,created_by_iam_user\nCreatedByService,created_by_service\nCreatedDate,created_date\nCreatedDateTime,created_date_time\nCreatedOn,created_on\nCreatedRange,created_range\nCreatedResourceArn,created_resource_arn\nCreatedRulesetName,created_ruleset_name\nCreatedTime,created_time\nCreatedTimeStamp,created_time_stamp\nCreatedTimestamp,created_timestamp\nCreatedUsingAutoPredictor,created_using_auto_predictor\nCreates,creates\nCreationDate,creation_date\nCreationDateTime,creation_date_time\nCreationInfo,creation_info\nCreationLimitExceededException,creation_limit_exceeded_exception\nCreationPath,creation_path\nCreationRequestDateTime,creation_request_date_time\nCreationStatus,creation_status\nCreationTime,creation_time\nCreationTimeAfter,creation_time_after\nCreationTimeBefore,creation_time_before\nCreationTimestamp,creation_timestamp\nCreationToken,creation_token\nCreatorId,creator_id\nCreatorRequestId,creator_request_id\nCredential,credential\nCredentialPair,credential_pair\nCredentialProvider,credential_provider\nCredentialReportExpiredException,credential_report_expired_exception\nCredentialReportNotPresentException,credential_report_not_present_exception\nCredentialReportNotReadyException,credential_report_not_ready_exception\nCredentialSummary,credential_summary\nCredentialType,credential_type\nCredentials,credentials\nCredentialsArn,credentials_arn\nCredentialsParameter,credentials_parameter\nCredentialsSecretName,credentials_secret_name\nCredentialsToAddOrUpdate,credentials_to_add_or_update\nCredentialsToRemove,credentials_to_remove\nCreditSpecification,credit_specification\nCreditSpecificationRequest,credit_specification_request\nCriteria,criteria\nCriteriaBlockForJob,criteria_block_for_job\nCriteriaForJob,criteria_for_job\nCriterion,criterion\nCriterionAdditionalProperties,criterion_additional_properties\nCriterionKey,criterion_key\nCritical,critical\nCriticalCount,critical_count\nCriticalNonCompliantCount,critical_non_compliant_count\nCriticality,criticality\nCrlConfiguration,crl_configuration\nCrlDetail,crl_detail\nCrlDetailResponse,crl_detail_response\nCronExpression,cron_expression\nCronExpressionForRecurrence,cron_expression_for_recurrence\nCrop,crop\nCrossAccount,cross_account\nCrossAccountAuthorization,cross_account_authorization\nCrossAccountAuthorizations,cross_account_authorizations\nCrossAccountClone,cross_account_clone\nCrossAccountFilterOption,cross_account_filter_option\nCrossAccountModelRegisterRoleArn,cross_account_model_register_role_arn\nCrossChannelBehavior,cross_channel_behavior\nCrossClusterSearch,cross_cluster_search\nCrossClusterSearchConnection,cross_cluster_search_connection\nCrossClusterSearchConnectionId,cross_cluster_search_connection_id\nCrossClusterSearchConnectionProperties,cross_cluster_search_connection_properties\nCrossClusterSearchConnections,cross_cluster_search_connections\nCrossDataset,cross_dataset\nCrossRealmTrustPrincipalPassword,cross_realm_trust_principal_password\nCrossRegionCopy,cross_region_copy\nCrossRegionCopyAction,cross_region_copy_action\nCrossRegionCopyDeprecateRule,cross_region_copy_deprecate_rule\nCrossRegionCopyRetainRule,cross_region_copy_retain_rule\nCrossRegionCopyRule,cross_region_copy_rule\nCrossRegionCopyRules,cross_region_copy_rules\nCrossZoneLoadBalancing,cross_zone_load_balancing\nCryptoProviders,crypto_providers\nCryptogramVerificationArpcMethod1,cryptogram_verification_arpc_method1\nCryptogramVerificationArpcMethod2,cryptogram_verification_arpc_method2\nCsid,csid\nCslgAtom,cslg_atom\nCsr,csr\nCsrExtensions,csr_extensions\nCsv,csv\nCsvClassifier,csv_classifier\nCsvConfiguration,csv_configuration\nCsvContentTypes,csv_content_types\nCsvDelimiter,csv_delimiter\nCsvFormatDescriptor,csv_format_descriptor\nCsvNoSupValue,csv_no_sup_value\nCsvNullValue,csv_null_value\nCsvOptions,csv_options\nCsvOutputOptions,csv_output_options\nCsvReport,csv_report\nCsvRowDelimiter,csv_row_delimiter\nCttsVersion,ctts_version\nCumulativeBytesMetered,cumulative_bytes_metered\nCumulativeBytesScanned,cumulative_bytes_scanned\nCurrency,currency\nCurrencyCode,currency_code\nCurrencyDisplayFormatConfiguration,currency_display_format_configuration\nCurrencySymbol,currency_symbol\nCurrent,current\nCurrentAction,current_action\nCurrentActiveJob,current_active_job\nCurrentActiveVersion,current_active_version\nCurrentActiveVersionArn,current_active_version_arn\nCurrentApplicationVersionId,current_application_version_id\nCurrentApplyDate,current_apply_date\nCurrentAverageCoverage,current_average_coverage\nCurrentAverageHourlyOnDemandSpend,current_average_hourly_on_demand_spend\nCurrentBackupRateInMegaBytesPerSecond,current_backup_rate_in_mega_bytes_per_second\nCurrentBrokerSoftwareInfo,current_broker_software_info\nCurrentCapacity,current_capacity\nCurrentCoverage,current_coverage\nCurrentDatabaseRevision,current_database_revision\nCurrentDefaultVersion,current_default_version\nCurrentDeliveryStreamVersionId,current_delivery_stream_version_id\nCurrentExpiryYear,current_expiry_year\nCurrentFirewallSubnetRouteTable,current_firewall_subnet_route_table\nCurrentFleetState,current_fleet_state\nCurrentGeneration,current_generation\nCurrentInferenceUnits,current_inference_units\nCurrentInstance,current_instance\nCurrentInstanceBootMode,current_instance_boot_mode\nCurrentInstanceCount,current_instance_count\nCurrentInstances,current_instances\nCurrentInternetGatewayRouteTable,current_internet_gateway_route_table\nCurrentIpamScopeId,current_ipam_scope_id\nCurrentLensVersion,current_lens_version\nCurrentLsn,current_lsn\nCurrentMaximumHourlyOnDemandSpend,current_maximum_hourly_on_demand_spend\nCurrentMetric,current_metric\nCurrentMetricData,current_metric_data\nCurrentMetricResult,current_metric_result\nCurrentMetricSortCriteria,current_metric_sort_criteria\nCurrentMetrics,current_metrics\nCurrentMinimumHourlyOnDemandSpend,current_minimum_hourly_on_demand_spend\nCurrentNetworkingStatus,current_networking_status\nCurrentOnDemandSpend,current_on_demand_spend\nCurrentOperationStatus,current_operation_status\nCurrentParallelism,current_parallelism\nCurrentPassword,current_password\nCurrentPerformanceRiskRatings,current_performance_risk_ratings\nCurrentPhase,current_phase\nCurrentPlayerSessionCount,current_player_session_count\nCurrentPolicyDescription,current_policy_description\nCurrentProfileVersion,current_profile_version\nCurrentRateInMegaBytesPerSecond,current_rate_in_mega_bytes_per_second\nCurrentRegionAvailability,current_region_availability\nCurrentRestoreRateInMegaBytesPerSecond,current_restore_rate_in_mega_bytes_per_second\nCurrentRevision,current_revision\nCurrentRole,current_role\nCurrentRouteTable,current_route_table\nCurrentSamplingPercentage,current_sampling_percentage\nCurrentScore,current_score\nCurrentServerlessConfig,current_serverless_config\nCurrentShardCount,current_shard_count\nCurrentShardLevelMetrics,current_shard_level_metrics\nCurrentSigningKeyLength,current_signing_key_length\nCurrentSoftware,current_software\nCurrentSpotFleetRequestState,current_spot_fleet_request_state\nCurrentState,current_state\nCurrentStatus,current_status\nCurrentStepName,current_step_name\nCurrentTaskExecutionArn,current_task_execution_arn\nCurrentVersion,current_version\nCurrentWeight,current_weight\nCustSubscriptionId,cust_subscription_id\nCustomAction,custom_action\nCustomActionFilterOperation,custom_action_filter_operation\nCustomActionId,custom_action_id\nCustomActionNavigationOperation,custom_action_navigation_operation\nCustomActionSetParametersOperation,custom_action_set_parameters_operation\nCustomActionURLOperation,custom_action_url_operation\nCustomActions,custom_actions\nCustomAmi,custom_ami\nCustomAmiId,custom_ami_id\nCustomAmiList,custom_ami_list\nCustomArtifactConfiguration,custom_artifact_configuration\nCustomArtifactConfigurationDescription,custom_artifact_configuration_description\nCustomArtifactsConfiguration,custom_artifacts_configuration\nCustomArtifactsConfigurationDescription,custom_artifacts_configuration_description\nCustomArtifactsConfigurationUpdate,custom_artifacts_configuration_update\nCustomAttribute,custom_attribute\nCustomAttributes,custom_attributes\nCustomAuthConfig,custom_auth_config\nCustomAuthCredentials,custom_auth_credentials\nCustomAvailabilityZoneNotFoundFault,custom_availability_zone_not_found_fault\nCustomCertificate,custom_certificate\nCustomCname,custom_cname\nCustomCnameAssociationFault,custom_cname_association_fault\nCustomCode,custom_code\nCustomCodeSigning,custom_code_signing\nCustomColor,custom_color\nCustomColors,custom_colors\nCustomCondition,custom_condition\nCustomConfig,custom_config\nCustomConnector,custom_connector\nCustomConnectorDestinationProperties,custom_connector_destination_properties\nCustomConnectorProfileCredentials,custom_connector_profile_credentials\nCustomConnectorProfileProperties,custom_connector_profile_properties\nCustomConnectorSourceProperties,custom_connector_source_properties\nCustomContentConfiguration,custom_content_configuration\nCustomContentVisual,custom_content_visual\nCustomCookbooksSource,custom_cookbooks_source\nCustomDBEngineVersionAMI,custom_db_engine_version_ami\nCustomDBEngineVersionAlreadyExistsFault,custom_db_engine_version_already_exists_fault\nCustomDBEngineVersionManifest,custom_db_engine_version_manifest\nCustomDBEngineVersionNotFoundFault,custom_db_engine_version_not_found_fault\nCustomDBEngineVersionQuotaExceededFault,custom_db_engine_version_quota_exceeded_fault\nCustomDNSServer,custom_dns_server\nCustomDataIdentifierSummary,custom_data_identifier_summary\nCustomDataIdentifiers,custom_data_identifiers\nCustomDataIdentifiersDetections,custom_data_identifiers_detections\nCustomDataIdentifiersResult,custom_data_identifiers_result\nCustomDatatypeConfigured,custom_datatype_configured\nCustomDatatypes,custom_datatypes\nCustomDeliveryConfiguration,custom_delivery_configuration\nCustomDetection,custom_detection\nCustomDnsServers,custom_dns_servers\nCustomDocumentEnrichmentConfiguration,custom_document_enrichment_configuration\nCustomDomain,custom_domain\nCustomDomainAssociationNotFoundFault,custom_domain_association_not_found_fault\nCustomDomainAssociationsMessage,custom_domain_associations_message\nCustomDomainCertExpiryTime,custom_domain_cert_expiry_time\nCustomDomainCertificateArn,custom_domain_certificate_arn\nCustomDomainCertificateExpiryDate,custom_domain_certificate_expiry_date\nCustomDomainConfig,custom_domain_config\nCustomDomainConfigType,custom_domain_config_type\nCustomDomainName,custom_domain_name\nCustomDomains,custom_domains\nCustomEmailLambdaVersionConfigType,custom_email_lambda_version_config_type\nCustomEmailSender,custom_email_sender\nCustomEndpoint,custom_endpoint\nCustomEndpointCertificateArn,custom_endpoint_certificate_arn\nCustomEndpointEnabled,custom_endpoint_enabled\nCustomEndpointType,custom_endpoint_type\nCustomEndpoints,custom_endpoints\nCustomEntityType,custom_entity_type\nCustomEntityTypes,custom_entity_types\nCustomEntityTypesNotFound,custom_entity_types_not_found\nCustomEpoch,custom_epoch\nCustomErrorResponse,custom_error_response\nCustomErrorResponses,custom_error_responses\nCustomEventData,custom_event_data\nCustomEvents,custom_events\nCustomExtension,custom_extension\nCustomExtensions,custom_extensions\nCustomFederationProviderUrl,custom_federation_provider_url\nCustomFilterConfiguration,custom_filter_configuration\nCustomFilterListConfiguration,custom_filter_list_configuration\nCustomHTTPHeader,custom_http_header\nCustomHeaders,custom_headers\nCustomHeadersConfig,custom_headers_config\nCustomHealthNotFound,custom_health_not_found\nCustomIamInstanceProfile,custom_iam_instance_profile\nCustomIconContent,custom_icon_content\nCustomImage,custom_image\nCustomImages,custom_images\nCustomIndices,custom_indices\nCustomIndicesInput,custom_indices_input\nCustomInstanceProfileArn,custom_instance_profile_arn\nCustomJson,custom_json\nCustomKeyStoreHasCMKsException,custom_key_store_has_cmks_exception\nCustomKeyStoreId,custom_key_store_id\nCustomKeyStoreInvalidStateException,custom_key_store_invalid_state_exception\nCustomKeyStoreName,custom_key_store_name\nCustomKeyStoreNameInUseException,custom_key_store_name_in_use_exception\nCustomKeyStoreNotFoundException,custom_key_store_not_found_exception\nCustomKeyStoreType,custom_key_store_type\nCustomKeyStores,custom_key_stores\nCustomKeyStoresListEntry,custom_key_stores_list_entry\nCustomKeys,custom_keys\nCustomKnowledgeArticleTypeConfigurations,custom_knowledge_article_type_configurations\nCustomLabel,custom_label\nCustomLabelConfiguration,custom_label_configuration\nCustomLabels,custom_labels\nCustomLanguageCode,custom_language_code\nCustomLibraries,custom_libraries\nCustomLineItemBillingPeriodRange,custom_line_item_billing_period_range\nCustomLineItemChargeDetails,custom_line_item_charge_details\nCustomLineItemFlatChargeDetails,custom_line_item_flat_charge_details\nCustomLineItemListElement,custom_line_item_list_element\nCustomLineItemPercentageChargeDetails,custom_line_item_percentage_charge_details\nCustomLineItemVersionListElement,custom_line_item_version_list_element\nCustomLineItemVersions,custom_line_item_versions\nCustomLineItems,custom_line_items\nCustomLogSourceAttributes,custom_log_source_attributes\nCustomLogSourceConfiguration,custom_log_source_configuration\nCustomLogSourceCrawlerConfiguration,custom_log_source_crawler_configuration\nCustomLogSourceProvider,custom_log_source_provider\nCustomLogSourceResource,custom_log_source_resource\nCustomMessage,custom_message\nCustomMessageActivity,custom_message_activity\nCustomMetadata,custom_metadata\nCustomMetadataLimitExceededException,custom_metadata_limit_exceeded_exception\nCustomModelSummary,custom_model_summary\nCustomModelTrainingParameters,custom_model_training_parameters\nCustomModelTransformParameters,custom_model_transform_parameters\nCustomName,custom_name\nCustomNarrative,custom_narrative\nCustomNarrativeOptions,custom_narrative_options\nCustomObjectIdentifier,custom_object_identifier\nCustomOriginConfig,custom_origin_config\nCustomParameterValues,custom_parameter_values\nCustomPatterns,custom_patterns\nCustomPayload,custom_payload\nCustomPermissionsName,custom_permissions_name\nCustomPlatformQuota,custom_platform_quota\nCustomPlugin,custom_plugin\nCustomPluginDescription,custom_plugin_description\nCustomPluginFileDescription,custom_plugin_file_description\nCustomPluginLocation,custom_plugin_location\nCustomPluginLocationDescription,custom_plugin_location_description\nCustomPluginRevisionSummary,custom_plugin_revision_summary\nCustomPluginSummary,custom_plugin_summary\nCustomPolicyDetails,custom_policy_details\nCustomPrivateKey,custom_private_key\nCustomRecipes,custom_recipes\nCustomRedirectDomain,custom_redirect_domain\nCustomRequestHandling,custom_request_handling\nCustomResponse,custom_response\nCustomResponseBodies,custom_response_bodies\nCustomResponseBody,custom_response_body\nCustomResponseBodyKey,custom_response_body_key\nCustomRoleArn,custom_role_arn\nCustomRoutingAccelerator,custom_routing_accelerator\nCustomRoutingAcceleratorAttributes,custom_routing_accelerator_attributes\nCustomRoutingDestinationConfiguration,custom_routing_destination_configuration\nCustomRoutingDestinationDescription,custom_routing_destination_description\nCustomRoutingEndpointConfiguration,custom_routing_endpoint_configuration\nCustomRoutingEndpointDescription,custom_routing_endpoint_description\nCustomRoutingEndpointGroup,custom_routing_endpoint_group\nCustomRoutingListener,custom_routing_listener\nCustomRule,custom_rule\nCustomSMSLambdaVersionConfigType,custom_sms_lambda_version_config_type\nCustomSMSSender,custom_sms_sender\nCustomSchemaCountLimitExceededException,custom_schema_count_limit_exceeded_exception\nCustomSeasonalityValue,custom_seasonality_value\nCustomSecurityGroupId,custom_security_group_id\nCustomSecurityGroupIds,custom_security_group_ids\nCustomSql,custom_sql\nCustomStepDetails,custom_step_details\nCustomSuffix,custom_suffix\nCustomTextContent,custom_text_content\nCustomUserData,custom_user_data\nCustomValue,custom_value\nCustomValues,custom_values\nCustomValuesConfiguration,custom_values_configuration\nCustomVerificationEmailInvalidContentException,custom_verification_email_invalid_content_exception\nCustomVerificationEmailTemplate,custom_verification_email_template\nCustomVerificationEmailTemplateAlreadyExistsException,custom_verification_email_template_already_exists_exception\nCustomVerificationEmailTemplateDoesNotExistException,custom_verification_email_template_does_not_exist_exception\nCustomVerificationEmailTemplateMetadata,custom_verification_email_template_metadata\nCustomVerificationEmailTemplateName,custom_verification_email_template_name\nCustomVerificationEmailTemplates,custom_verification_email_templates\nCustomVocabularyEntryId,custom_vocabulary_entry_id\nCustomVocabularyExportSpecification,custom_vocabulary_export_specification\nCustomVocabularyImportSpecification,custom_vocabulary_import_specification\nCustomVocabularyItem,custom_vocabulary_item\nCustomerAWSAccountId,customer_aws_account_id\nCustomerAction,customer_action\nCustomerAgentInfo,customer_agent_info\nCustomerAgentlessCollectorInfo,customer_agentless_collector_info\nCustomerAgreement,customer_agreement\nCustomerArtifactPaths,customer_artifact_paths\nCustomerAvailabilityZone,customer_availability_zone\nCustomerAwsId,customer_aws_id\nCustomerConnectorInfo,customer_connector_info\nCustomerContentEncryptionConfiguration,customer_content_encryption_configuration\nCustomerDnsIps,customer_dns_ips\nCustomerGateway,customer_gateway\nCustomerGatewayArn,customer_gateway_arn\nCustomerGatewayArns,customer_gateway_arns\nCustomerGatewayAssociation,customer_gateway_association\nCustomerGatewayAssociations,customer_gateway_associations\nCustomerGatewayConfiguration,customer_gateway_configuration\nCustomerGatewayId,customer_gateway_id\nCustomerGatewayIds,customer_gateway_ids\nCustomerGateways,customer_gateways\nCustomerIdentifier,customer_identifier\nCustomerManagedChannelS3Storage,customer_managed_channel_s3_storage\nCustomerManagedChannelS3StorageSummary,customer_managed_channel_s3_storage_summary\nCustomerManagedDatastoreS3Storage,customer_managed_datastore_s3_storage\nCustomerManagedDatastoreS3StorageSummary,customer_managed_datastore_s3_storage_summary\nCustomerManagedKeyEnabled,customer_managed_key_enabled\nCustomerManagedPolicyReference,customer_managed_policy_reference\nCustomerManagedPolicyReferences,customer_managed_policy_references\nCustomerManagedS3Storage,customer_managed_s3_storage\nCustomerMasterKeySpec,customer_master_key_spec\nCustomerMeCollectorInfo,customer_me_collector_info\nCustomerMetadataProperties,customer_metadata_properties\nCustomerMetadataPropertiesToRemove,customer_metadata_properties_to_remove\nCustomerNodeEndpoint,customer_node_endpoint\nCustomerNodeEndpointList,customer_node_endpoint_list\nCustomerNotEntitledException,customer_not_entitled_exception\nCustomerOutpostArn,customer_outpost_arn\nCustomerOverride,customer_override\nCustomerOverrideValidTill,customer_override_valid_till\nCustomerOwnedIp,customer_owned_ip\nCustomerOwnedIpEnabled,customer_owned_ip_enabled\nCustomerOwnedIpv4Pool,customer_owned_ipv4_pool\nCustomerProfiles,customer_profiles\nCustomerProfilesDestinationProperties,customer_profiles_destination_properties\nCustomerResultObject,customer_result_object\nCustomerSpeakerId,customer_speaker_id\nCustomerStorageMessage,customer_storage_message\nCustomerUserName,customer_user_name\nCustomizedCapacityMetricSpecification,customized_capacity_metric_specification\nCustomizedLoadMetricSpecification,customized_load_metric_specification\nCustomizedMetricSpecification,customized_metric_specification\nCustomizedScalingMetricSpecification,customized_scaling_metric_specification\nCutoff,cutoff\nCutoffBehavior,cutoff_behavior\nCvss,cvss\nCvss2,cvss2\nCvss3,cvss3\nCvssScore,cvss_score\nCvssScoreAdjustment,cvss_score_adjustment\nCvssScoreDetails,cvss_score_details\nCwLog,cw_log\nCwLogEnabled,cw_log_enabled\nCwLogGroup,cw_log_group\nCwes,cwes\nDASHFragmentSelector,dash_fragment_selector\nDASHStreamingSessionURL,dash_streaming_session_url\nDASHTimestampRange,dash_timestamp_range\nDBCluster,db_cluster\nDBClusterAlreadyExistsFault,db_cluster_already_exists_fault\nDBClusterArn,db_cluster_arn\nDBClusterAutomatedBackup,db_cluster_automated_backup\nDBClusterAutomatedBackupMessage,db_cluster_automated_backup_message\nDBClusterAutomatedBackupNotFoundFault,db_cluster_automated_backup_not_found_fault\nDBClusterAutomatedBackupQuotaExceededFault,db_cluster_automated_backup_quota_exceeded_fault\nDBClusterAutomatedBackups,db_cluster_automated_backups\nDBClusterAutomatedBackupsArn,db_cluster_automated_backups_arn\nDBClusterBacktrack,db_cluster_backtrack\nDBClusterBacktrackMessage,db_cluster_backtrack_message\nDBClusterBacktrackNotFoundFault,db_cluster_backtrack_not_found_fault\nDBClusterBacktracks,db_cluster_backtracks\nDBClusterCapacityInfo,db_cluster_capacity_info\nDBClusterEndpoint,db_cluster_endpoint\nDBClusterEndpointAlreadyExistsFault,db_cluster_endpoint_already_exists_fault\nDBClusterEndpointArn,db_cluster_endpoint_arn\nDBClusterEndpointIdentifier,db_cluster_endpoint_identifier\nDBClusterEndpointMessage,db_cluster_endpoint_message\nDBClusterEndpointNotFoundFault,db_cluster_endpoint_not_found_fault\nDBClusterEndpointQuotaExceededFault,db_cluster_endpoint_quota_exceeded_fault\nDBClusterEndpointResourceIdentifier,db_cluster_endpoint_resource_identifier\nDBClusterEndpoints,db_cluster_endpoints\nDBClusterIdentifier,db_cluster_identifier\nDBClusterIdentifiers,db_cluster_identifiers\nDBClusterInstanceClass,db_cluster_instance_class\nDBClusterMember,db_cluster_member\nDBClusterMembers,db_cluster_members\nDBClusterMessage,db_cluster_message\nDBClusterNotFoundFault,db_cluster_not_found_fault\nDBClusterOptionGroupMemberships,db_cluster_option_group_memberships\nDBClusterOptionGroupName,db_cluster_option_group_name\nDBClusterOptionGroupStatus,db_cluster_option_group_status\nDBClusterParameterGroup,db_cluster_parameter_group\nDBClusterParameterGroupArn,db_cluster_parameter_group_arn\nDBClusterParameterGroupDetails,db_cluster_parameter_group_details\nDBClusterParameterGroupName,db_cluster_parameter_group_name\nDBClusterParameterGroupNameMessage,db_cluster_parameter_group_name_message\nDBClusterParameterGroupNotFoundFault,db_cluster_parameter_group_not_found_fault\nDBClusterParameterGroupStatus,db_cluster_parameter_group_status\nDBClusterParameterGroups,db_cluster_parameter_groups\nDBClusterParameterGroupsMessage,db_cluster_parameter_groups_message\nDBClusterQuotaExceededFault,db_cluster_quota_exceeded_fault\nDBClusterRole,db_cluster_role\nDBClusterRoleAlreadyExistsFault,db_cluster_role_already_exists_fault\nDBClusterRoleNotFoundFault,db_cluster_role_not_found_fault\nDBClusterRoleQuotaExceededFault,db_cluster_role_quota_exceeded_fault\nDBClusterSnapshot,db_cluster_snapshot\nDBClusterSnapshotAlreadyExistsFault,db_cluster_snapshot_already_exists_fault\nDBClusterSnapshotArn,db_cluster_snapshot_arn\nDBClusterSnapshotAttribute,db_cluster_snapshot_attribute\nDBClusterSnapshotAttributes,db_cluster_snapshot_attributes\nDBClusterSnapshotAttributesResult,db_cluster_snapshot_attributes_result\nDBClusterSnapshotIdentifier,db_cluster_snapshot_identifier\nDBClusterSnapshotMessage,db_cluster_snapshot_message\nDBClusterSnapshotNotFoundFault,db_cluster_snapshot_not_found_fault\nDBClusterSnapshots,db_cluster_snapshots\nDBClusters,db_clusters\nDBEngineDescription,db_engine_description\nDBEngineMediaType,db_engine_media_type\nDBEngineVersion,db_engine_version\nDBEngineVersionArn,db_engine_version_arn\nDBEngineVersionDescription,db_engine_version_description\nDBEngineVersionMessage,db_engine_version_message\nDBEngineVersions,db_engine_versions\nDBInstance,db_instance\nDBInstanceAlreadyExistsFault,db_instance_already_exists_fault\nDBInstanceArn,db_instance_arn\nDBInstanceAutomatedBackup,db_instance_automated_backup\nDBInstanceAutomatedBackupMessage,db_instance_automated_backup_message\nDBInstanceAutomatedBackupNotFoundFault,db_instance_automated_backup_not_found_fault\nDBInstanceAutomatedBackupQuotaExceededFault,db_instance_automated_backup_quota_exceeded_fault\nDBInstanceAutomatedBackups,db_instance_automated_backups\nDBInstanceAutomatedBackupsArn,db_instance_automated_backups_arn\nDBInstanceAutomatedBackupsReplication,db_instance_automated_backups_replication\nDBInstanceAutomatedBackupsReplications,db_instance_automated_backups_replications\nDBInstanceClass,db_instance_class\nDBInstanceCount,db_instance_count\nDBInstanceIdentifier,db_instance_identifier\nDBInstanceIdentifiers,db_instance_identifiers\nDBInstanceMessage,db_instance_message\nDBInstanceNotFoundFault,db_instance_not_found_fault\nDBInstanceParameterGroupName,db_instance_parameter_group_name\nDBInstanceRole,db_instance_role\nDBInstanceRoleAlreadyExistsFault,db_instance_role_already_exists_fault\nDBInstanceRoleNotFoundFault,db_instance_role_not_found_fault\nDBInstanceRoleQuotaExceededFault,db_instance_role_quota_exceeded_fault\nDBInstanceStatus,db_instance_status\nDBInstanceStatusInfo,db_instance_status_info\nDBInstances,db_instances\nDBLogFileNotFoundFault,db_log_file_not_found_fault\nDBName,db_name\nDBParameterGroup,db_parameter_group\nDBParameterGroupAlreadyExistsFault,db_parameter_group_already_exists_fault\nDBParameterGroupArn,db_parameter_group_arn\nDBParameterGroupDetails,db_parameter_group_details\nDBParameterGroupFamily,db_parameter_group_family\nDBParameterGroupName,db_parameter_group_name\nDBParameterGroupNameMessage,db_parameter_group_name_message\nDBParameterGroupNotFoundFault,db_parameter_group_not_found_fault\nDBParameterGroupQuotaExceededFault,db_parameter_group_quota_exceeded_fault\nDBParameterGroupStatus,db_parameter_group_status\nDBParameterGroups,db_parameter_groups\nDBParameterGroupsMessage,db_parameter_groups_message\nDBPortNumber,db_port_number\nDBProxies,db_proxies\nDBProxy,db_proxy\nDBProxyAlreadyExistsFault,db_proxy_already_exists_fault\nDBProxyArn,db_proxy_arn\nDBProxyEndpoint,db_proxy_endpoint\nDBProxyEndpointAlreadyExistsFault,db_proxy_endpoint_already_exists_fault\nDBProxyEndpointArn,db_proxy_endpoint_arn\nDBProxyEndpointName,db_proxy_endpoint_name\nDBProxyEndpointNotFoundFault,db_proxy_endpoint_not_found_fault\nDBProxyEndpointQuotaExceededFault,db_proxy_endpoint_quota_exceeded_fault\nDBProxyEndpoints,db_proxy_endpoints\nDBProxyName,db_proxy_name\nDBProxyNotFoundFault,db_proxy_not_found_fault\nDBProxyQuotaExceededFault,db_proxy_quota_exceeded_fault\nDBProxyTarget,db_proxy_target\nDBProxyTargetAlreadyRegisteredFault,db_proxy_target_already_registered_fault\nDBProxyTargetGroup,db_proxy_target_group\nDBProxyTargetGroupNotFoundFault,db_proxy_target_group_not_found_fault\nDBProxyTargetNotFoundFault,db_proxy_target_not_found_fault\nDBProxyTargets,db_proxy_targets\nDBSecurityGroup,db_security_group\nDBSecurityGroupAlreadyExistsFault,db_security_group_already_exists_fault\nDBSecurityGroupArn,db_security_group_arn\nDBSecurityGroupDescription,db_security_group_description\nDBSecurityGroupMembership,db_security_group_membership\nDBSecurityGroupMemberships,db_security_group_memberships\nDBSecurityGroupMessage,db_security_group_message\nDBSecurityGroupName,db_security_group_name\nDBSecurityGroupNotFoundFault,db_security_group_not_found_fault\nDBSecurityGroupNotSupportedFault,db_security_group_not_supported_fault\nDBSecurityGroupQuotaExceededFault,db_security_group_quota_exceeded_fault\nDBSecurityGroups,db_security_groups\nDBSnapshot,db_snapshot\nDBSnapshotAlreadyExistsFault,db_snapshot_already_exists_fault\nDBSnapshotArn,db_snapshot_arn\nDBSnapshotAttribute,db_snapshot_attribute\nDBSnapshotAttributes,db_snapshot_attributes\nDBSnapshotAttributesResult,db_snapshot_attributes_result\nDBSnapshotIdentifier,db_snapshot_identifier\nDBSnapshotMessage,db_snapshot_message\nDBSnapshotNotFoundFault,db_snapshot_not_found_fault\nDBSnapshots,db_snapshots\nDBSubnetGroup,db_subnet_group\nDBSubnetGroupAlreadyExistsFault,db_subnet_group_already_exists_fault\nDBSubnetGroupArn,db_subnet_group_arn\nDBSubnetGroupDescription,db_subnet_group_description\nDBSubnetGroupDoesNotCoverEnoughAZs,db_subnet_group_does_not_cover_enough_azs\nDBSubnetGroupMessage,db_subnet_group_message\nDBSubnetGroupName,db_subnet_group_name\nDBSubnetGroupNotAllowedFault,db_subnet_group_not_allowed_fault\nDBSubnetGroupNotFoundFault,db_subnet_group_not_found_fault\nDBSubnetGroupQuotaExceededFault,db_subnet_group_quota_exceeded_fault\nDBSubnetGroups,db_subnet_groups\nDBSubnetQuotaExceededFault,db_subnet_quota_exceeded_fault\nDBSystemId,db_system_id\nDBUpgradeDependencyFailureFault,db_upgrade_dependency_failure_fault\nDESIRED,desired\nDICOMAccessionNumber,dicom_accession_number\nDICOMImportJobProperties,dicom_import_job_properties\nDICOMImportJobSummary,dicom_import_job_summary\nDICOMNumberOfStudyRelatedInstances,dicom_number_of_study_related_instances\nDICOMNumberOfStudyRelatedSeries,dicom_number_of_study_related_series\nDICOMPatientBirthDate,dicom_patient_birth_date\nDICOMPatientId,dicom_patient_id\nDICOMPatientName,dicom_patient_name\nDICOMPatientSex,dicom_patient_sex\nDICOMStudyDate,dicom_study_date\nDICOMStudyDateAndTime,dicom_study_date_and_time\nDICOMStudyDescription,dicom_study_description\nDICOMStudyId,dicom_study_id\nDICOMStudyInstanceUID,dicom_study_instance_uid\nDICOMStudyTime,dicom_study_time\nDICOMTags,dicom_tags\nDICOMUpdates,dicom_updates\nDNIS,dnis\nDNISEmergencyCallingConfiguration,dnis_emergency_calling_configuration\nDNSKEYRecord,dnskey_record\nDNSLogs,dns_logs\nDNSLogsConfigurationResult,dns_logs_configuration_result\nDNSName,dns_name\nDNSSECNotFound,dnssec_not_found\nDNSSECStatus,dnssec_status\nDNSTarget,dns_target\nDNSTargetResource,dns_target_resource\nDPDTimeoutAction,dpd_timeout_action\nDPDTimeoutSeconds,dpd_timeout_seconds\nDPUHour,dpu_hour\nDPUSeconds,dpu_seconds\nDQResultsPublishingOptions,dq_results_publishing_options\nDQStopJobOnFailureOptions,dq_stop_job_on_failure_options\nDSRecord,ds_record\nDTMFInputEvent,dtmf_input_event\nDTMFSpecification,dtmf_specification\nDagEdges,dag_edges\nDagNodes,dag_nodes\nDagProcessingLogs,dag_processing_logs\nDagS3Path,dag_s3_path\nDaily,daily\nDailyAutomaticBackupStartTime,daily_automatic_backup_start_time\nDailyCap,daily_cap\nDailyCommitmentToPurchase,daily_commitment_to_purchase\nDailySettings,daily_settings\nDailyVolume,daily_volume\nDailyVolumes,daily_volumes\nDakCertificateMetadata,dak_certificate_metadata\nDanger,danger\nDangerForeground,danger_foreground\nDashAdditionalManifest,dash_additional_manifest\nDashConfiguration,dash_configuration\nDashConfigurationForPut,dash_configuration_for_put\nDashEncryption,dash_encryption\nDashIsoEncryptionSettings,dash_iso_encryption_settings\nDashIsoGroupSettings,dash_iso_group_settings\nDashIsoImageBasedTrickPlaySettings,dash_iso_image_based_trick_play_settings\nDashManifest,dash_manifest\nDashManifestStyle,dash_manifest_style\nDashManifests,dash_manifests\nDashPackage,dash_package\nDashPlaylistSettings,dash_playlist_settings\nDashSignaledSystemIds,dash_signaled_system_ids\nDashboard,dashboard\nDashboardArn,dashboard_arn\nDashboardAttributes,dashboard_attributes\nDashboardBody,dashboard_body\nDashboardEnabled,dashboard_enabled\nDashboardEntries,dashboard_entries\nDashboardEntry,dashboard_entry\nDashboardError,dashboard_error\nDashboardId,dashboard_id\nDashboardInvalidInputError,dashboard_invalid_input_error\nDashboardName,dashboard_name\nDashboardNamePrefix,dashboard_name_prefix\nDashboardNames,dashboard_names\nDashboardNotFoundError,dashboard_not_found_error\nDashboardOptions,dashboard_options\nDashboardPublishOptions,dashboard_publish_options\nDashboardSearchFilter,dashboard_search_filter\nDashboardSourceEntity,dashboard_source_entity\nDashboardSourceTemplate,dashboard_source_template\nDashboardSummary,dashboard_summary\nDashboardSummaryList,dashboard_summary_list\nDashboardValidationMessage,dashboard_validation_message\nDashboardValidationMessages,dashboard_validation_messages\nDashboardVersion,dashboard_version\nDashboardVersionDefinition,dashboard_version_definition\nDashboardVersionSummary,dashboard_version_summary\nDashboardVersionSummaryList,dashboard_version_summary_list\nDashboardVisual,dashboard_visual\nDashboardVisualId,dashboard_visual_id\nDashboardVisualPublishOptions,dashboard_visual_publish_options\nDashboards,dashboards\nData,data\nDataAccessRoleArn,data_access_role_arn\nDataAggregation,data_aggregation\nDataAlreadyAcceptedException,data_already_accepted_exception\nDataAlreadyExistsException,data_already_exists_exception\nDataAnalysisEndTime,data_analysis_end_time\nDataAnalysisStartTime,data_analysis_start_time\nDataAttributes,data_attributes\nDataBars,data_bars\nDataBarsOptions,data_bars_options\nDataCaptureConfig,data_capture_config\nDataCaptureConfigSummary,data_capture_config_summary\nDataCapturedDestinationS3Uri,data_captured_destination_s3_uri\nDataCatalog,data_catalog\nDataCatalogConfig,data_catalog_config\nDataCatalogEncryptionSettings,data_catalog_encryption_settings\nDataCatalogInputDefinition,data_catalog_input_definition\nDataCatalogOutput,data_catalog_output\nDataCatalogOutputs,data_catalog_outputs\nDataCatalogSummary,data_catalog_summary\nDataCatalogsSummary,data_catalogs_summary\nDataCellsFilter,data_cells_filter\nDataCellsFilterResource,data_cells_filter_resource\nDataCellsFilters,data_cells_filters\nDataChannel,data_channel\nDataChannelConcatenationConfiguration,data_channel_concatenation_configuration\nDataClassification,data_classification\nDataClassificationDetails,data_classification_details\nDataCollectionDetails,data_collection_details\nDataColor,data_color\nDataColorPalette,data_color_palette\nDataCompressionType,data_compression_type\nDataConfig,data_config\nDataConfiguration,data_configuration\nDataConnector,data_connector\nDataDelayOffsetInMinutes,data_delay_offset_in_minutes\nDataDestination,data_destination\nDataDistributionType,data_distribution_type\nDataDriven,data_driven\nDataEncipherment,data_encipherment\nDataEncryptionException,data_encryption_exception\nDataEncryptionKeyId,data_encryption_key_id\nDataEncryptionMetadata,data_encryption_metadata\nDataEndTime,data_end_time\nDataEndTimeBefore,data_end_time_before\nDataEndpoint,data_endpoint\nDataExists,data_exists\nDataExplorationNotebookLocation,data_exploration_notebook_location\nDataExport,data_export\nDataFieldSeriesItem,data_field_series_item\nDataFormat,data_format\nDataFormatConversionConfiguration,data_format_conversion_configuration\nDataFrequency,data_frequency\nDataId,data_id\nDataIngestionJobSummaries,data_ingestion_job_summaries\nDataIngestionJobSummary,data_ingestion_job_summary\nDataInputConfig,data_input_config\nDataInputConfiguration,data_input_configuration\nDataIntegrationArn,data_integration_arn\nDataIntegrationAssociationArn,data_integration_association_arn\nDataIntegrationAssociationSummary,data_integration_association_summary\nDataIntegrationAssociations,data_integration_associations\nDataIntegrationIdentifier,data_integration_identifier\nDataIntegrationSummary,data_integration_summary\nDataIntegrations,data_integrations\nDataItem,data_item\nDataItems,data_items\nDataLabelOptions,data_label_options\nDataLabelType,data_label_type\nDataLabelTypes,data_label_types\nDataLabels,data_labels\nDataLakeAdmins,data_lake_admins\nDataLakeAutoEnableNewAccountConfiguration,data_lake_auto_enable_new_account_configuration\nDataLakeConfiguration,data_lake_configuration\nDataLakeEncryptionConfiguration,data_lake_encryption_configuration\nDataLakeException,data_lake_exception\nDataLakeKmsKeyId,data_lake_kms_key_id\nDataLakeLifecycleConfiguration,data_lake_lifecycle_configuration\nDataLakeLifecycleExpiration,data_lake_lifecycle_expiration\nDataLakeLifecycleTransition,data_lake_lifecycle_transition\nDataLakePrincipal,data_lake_principal\nDataLakePrincipalIdentifier,data_lake_principal_identifier\nDataLakeReplicationConfiguration,data_lake_replication_configuration\nDataLakeResource,data_lake_resource\nDataLakeS3Uri,data_lake_s3_uri\nDataLakeSettings,data_lake_settings\nDataLakeSource,data_lake_source\nDataLakeSourceStatus,data_lake_source_status\nDataLakeUpdateException,data_lake_update_exception\nDataLakeUpdateStatus,data_lake_update_status\nDataLength,data_length\nDataLocation,data_location\nDataLocationResource,data_location_resource\nDataLocationS3,data_location_s3\nDataManifestLocation,data_manifest_location\nDataModel,data_model\nDataModelConfiguration,data_model_configuration\nDataModelS3Configuration,data_model_s3_configuration\nDataNodeCount,data_node_count\nDataOptions,data_options\nDataOutputConfiguration,data_output_configuration\nDataPTSControl,data_pts_control\nDataPageSize,data_page_size\nDataPath,data_path\nDataPathColor,data_path_color\nDataPathLabelType,data_path_label_type\nDataPathList,data_path_list\nDataPathOptions,data_path_options\nDataPathSort,data_path_sort\nDataPathValue,data_path_value\nDataPipelineId,data_pipeline_id\nDataPoint,data_point\nDataPointDrillUpDownOption,data_point_drill_up_down_option\nDataPointMenuLabelOption,data_point_menu_label_option\nDataPointTooltipOption,data_point_tooltip_option\nDataPoints,data_points\nDataPolicyCount,data_policy_count\nDataPreProcessingConfiguration,data_pre_processing_configuration\nDataPreviewOptions,data_preview_options\nDataPrivacy,data_privacy\nDataProcessing,data_processing\nDataProtectionPolicy,data_protection_policy\nDataProvider,data_provider\nDataProviderArn,data_provider_arn\nDataProviderCreationTime,data_provider_creation_time\nDataProviderDescriptor,data_provider_descriptor\nDataProviderDescriptorDefinition,data_provider_descriptor_definition\nDataProviderIdentifier,data_provider_identifier\nDataProviderName,data_provider_name\nDataProviders,data_providers\nDataPullMode,data_pull_mode\nDataQualityAppSpecification,data_quality_app_specification\nDataQualityBaselineConfig,data_quality_baseline_config\nDataQualityEvaluationRunAdditionalRunOptions,data_quality_evaluation_run_additional_run_options\nDataQualityJobInput,data_quality_job_input\nDataQualityJobOutputConfig,data_quality_job_output_config\nDataQualityMetric,data_quality_metric\nDataQualityMetricList,data_quality_metric_list\nDataQualityResult,data_quality_result\nDataQualityResultDescription,data_quality_result_description\nDataQualityResultFilterCriteria,data_quality_result_filter_criteria\nDataQualityRuleRecommendationRunDescription,data_quality_rule_recommendation_run_description\nDataQualityRuleRecommendationRunFilter,data_quality_rule_recommendation_run_filter\nDataQualityRuleResult,data_quality_rule_result\nDataQualityRulesetEvaluationRunDescription,data_quality_ruleset_evaluation_run_description\nDataQualityRulesetEvaluationRunFilter,data_quality_ruleset_evaluation_run_filter\nDataQualityRulesetFilterCriteria,data_quality_ruleset_filter_criteria\nDataQualityRulesetListDetails,data_quality_ruleset_list_details\nDataQualitySummary,data_quality_summary\nDataQualityTargetTable,data_quality_target_table\nDataQueries,data_queries\nDataQuery,data_query\nDataRate,data_rate\nDataRearrangement,data_rearrangement\nDataReplicationCounterpart,data_replication_counterpart\nDataReplicationError,data_replication_error\nDataReplicationInfo,data_replication_info\nDataReplicationInfoReplicatedDisk,data_replication_info_replicated_disk\nDataReplicationInitiation,data_replication_initiation\nDataReplicationInitiationStep,data_replication_initiation_step\nDataReplicationMetadata,data_replication_metadata\nDataReplicationMetadataOutput,data_replication_metadata_output\nDataReplicationMode,data_replication_mode\nDataReplicationPrimaryBrokerArn,data_replication_primary_broker_arn\nDataReplicationRole,data_replication_role\nDataRepositoryAssociation,data_repository_association\nDataRepositoryAssociationIds,data_repository_association_ids\nDataRepositoryAssociationNotFound,data_repository_association_not_found\nDataRepositoryAssociations,data_repository_associations\nDataRepositoryConfiguration,data_repository_configuration\nDataRepositoryFailureDetails,data_repository_failure_details\nDataRepositoryPath,data_repository_path\nDataRepositorySubdirectories,data_repository_subdirectories\nDataRepositoryTask,data_repository_task\nDataRepositoryTaskEnded,data_repository_task_ended\nDataRepositoryTaskExecuting,data_repository_task_executing\nDataRepositoryTaskFailureDetails,data_repository_task_failure_details\nDataRepositoryTaskFilter,data_repository_task_filter\nDataRepositoryTaskNotFound,data_repository_task_not_found\nDataRepositoryTaskStatus,data_repository_task_status\nDataRepositoryTasks,data_repository_tasks\nDataResource,data_resource\nDataResources,data_resources\nDataResponse,data_response\nDataResponses,data_responses\nDataRetentionChangeInHours,data_retention_change_in_hours\nDataRetentionInHours,data_retention_in_hours\nDataRetentionOptIn,data_retention_opt_in\nDataRetentionSupport,data_retention_support\nDataRetrievalPolicy,data_retrieval_policy\nDataRetrievalRule,data_retrieval_rule\nDataScannedBytes,data_scanned_bytes\nDataScannedInBytes,data_scanned_in_bytes\nDataSchema,data_schema\nDataSchemaLocationS3,data_schema_location_s3\nDataSchemaUri,data_schema_uri\nDataSecurityConfig,data_security_config\nDataSet,data_set\nDataSetArn,data_set_arn\nDataSetArns,data_set_arns\nDataSetConfiguration,data_set_configuration\nDataSetConfigurations,data_set_configurations\nDataSetEntry,data_set_entry\nDataSetId,data_set_id\nDataSetIdentifier,data_set_identifier\nDataSetIdentifierDeclaration,data_set_identifier_declaration\nDataSetIdentifierDeclarations,data_set_identifier_declarations\nDataSetImportItem,data_set_import_item\nDataSetImportSummary,data_set_import_summary\nDataSetImportTask,data_set_import_task\nDataSetName,data_set_name\nDataSetParameterName,data_set_parameter_name\nDataSetPlaceholder,data_set_placeholder\nDataSetReference,data_set_reference\nDataSetReferences,data_set_references\nDataSetRefreshProperties,data_set_refresh_properties\nDataSetSchema,data_set_schema\nDataSetSearchFilter,data_set_search_filter\nDataSetSummaries,data_set_summaries\nDataSetSummary,data_set_summary\nDataSetUsageConfiguration,data_set_usage_configuration\nDataSets,data_sets\nDataShare,data_share\nDataShareArn,data_share_arn\nDataShareAssociation,data_share_association\nDataShareAssociations,data_share_associations\nDataShares,data_shares\nDataSharingPreference,data_sharing_preference\nDataSharingPreferenceForUpdate,data_sharing_preference_for_update\nDataSize,data_size\nDataSizeInBytes,data_size_in_bytes\nDataSnapshotTime,data_snapshot_time\nDataSource,data_source\nDataSourceArn,data_source_arn\nDataSourceConfig,data_source_config\nDataSourceConfiguration,data_source_configuration\nDataSourceConfigurations,data_source_configurations\nDataSourceConfigurationsResult,data_source_configurations_result\nDataSourceCredentials,data_source_credentials\nDataSourceErrorCode,data_source_error_code\nDataSourceErrorInfo,data_source_error_info\nDataSourceFieldName,data_source_field_name\nDataSourceFreeTrial,data_source_free_trial\nDataSourceGroup,data_source_group\nDataSourceGroups,data_source_groups\nDataSourceId,data_source_id\nDataSourceIds,data_source_ids\nDataSourceName,data_source_name\nDataSourceParameters,data_source_parameters\nDataSourceS3Configuration,data_source_s3_configuration\nDataSourceSchema,data_source_schema\nDataSourceSearchFilter,data_source_search_filter\nDataSourceSummaries,data_source_summaries\nDataSourceSummary,data_source_summary\nDataSourceSyncJob,data_source_sync_job\nDataSourceSyncJobId,data_source_sync_job_id\nDataSourceSyncJobMetricTarget,data_source_sync_job_metric_target\nDataSourceSyncJobMetrics,data_source_sync_job_metrics\nDataSourceToIndexFieldMapping,data_source_to_index_field_mapping\nDataSourceVpcConfiguration,data_source_vpc_configuration\nDataSources,data_sources\nDataSourcesFreeTrial,data_sources_free_trial\nDataSpec,data_spec\nDataSplitConfig,data_split_config\nDataStartTime,data_start_time\nDataStartTimeAfter,data_start_time_after\nDataStorage,data_storage\nDataStorageConfig,data_storage_config\nDataTableColumns,data_table_columns\nDataTableName,data_table_name\nDataTiering,data_tiering\nDataTieringEnabled,data_tiering_enabled\nDataTraceEnabled,data_trace_enabled\nDataTransfer,data_transfer\nDataTransferApi,data_transfer_api\nDataTransferProgress,data_transfer_progress\nDataTransferProgressPercent,data_transfer_progress_percent\nDataTransferProtection,data_transfer_protection\nDataTransferSubscriberFeePercent,data_transfer_subscriber_fee_percent\nDataTransferredInMegaBytes,data_transferred_in_mega_bytes\nDataTransforms,data_transforms\nDataType,data_type\nDataTypeMapping,data_type_mapping\nDataUnavailableException,data_unavailable_exception\nDataUploadFrequency,data_upload_frequency\nDataValidationMetrics,data_validation_metrics\nDataValue,data_value\nDataViewDestinationTypeParams,data_view_destination_type_params\nDataViewErrorInfo,data_view_error_info\nDataViewSummary,data_view_summary\nDataVolumeKMSKeyId,data_volume_kms_key_id\nDataWrites,data_writes\nDatabase,database\nDatabaseARN,database_arn\nDatabaseARNUpdate,database_arn_update\nDatabaseArn,database_arn\nDatabaseConfigDetail,database_config_detail\nDatabaseConfiguration,database_configuration\nDatabaseConnectionException,database_connection_exception\nDatabaseCredentials,database_credentials\nDatabaseEdition,database_edition\nDatabaseEngine,database_engine\nDatabaseEngineType,database_engine_type\nDatabaseHost,database_host\nDatabaseId,database_id\nDatabaseIdentifier,database_identifier\nDatabaseIds,database_ids\nDatabaseInformation,database_information\nDatabaseInput,database_input\nDatabaseInputDefinition,database_input_definition\nDatabaseInstallationFilesS3BucketName,database_installation_files_s3_bucket_name\nDatabaseInstallationFilesS3Prefix,database_installation_files_s3_prefix\nDatabaseInstance,database_instance\nDatabaseInstanceSoftwareDetailsResponse,database_instance_software_details_response\nDatabaseIpAddress,database_ip_address\nDatabaseLFTagPolicy,database_lf_tag_policy\nDatabaseLFTagPolicyAndPermissions,database_lf_tag_policy_and_permissions\nDatabaseList,database_list\nDatabaseMode,database_mode\nDatabaseName,database_name\nDatabaseOptions,database_options\nDatabaseOutput,database_output\nDatabaseOutputMode,database_output_mode\nDatabaseOutputs,database_outputs\nDatabasePort,database_port\nDatabasePreferences,database_preferences\nDatabaseResource,database_resource\nDatabaseResponse,database_response\nDatabaseRevision,database_revision\nDatabaseRevisionReleaseDate,database_revision_release_date\nDatabaseShortInfoResponse,database_short_info_response\nDatabaseSummary,database_summary\nDatabaseTableName,database_table_name\nDatabaseTableOutputOptions,database_table_output_options\nDatabaseType,database_type\nDatabaseUserName,database_user_name\nDatabaseVersion,database_version\nDatabases,databases\nDatabricksParameters,databricks_parameters\nDatadog,datadog\nDatadogConnectorProfileCredentials,datadog_connector_profile_credentials\nDatadogConnectorProfileProperties,datadog_connector_profile_properties\nDatadogSourceProperties,datadog_source_properties\nDataflowDetail,dataflow_detail\nDataflowEndpoint,dataflow_endpoint\nDataflowEndpointConfig,dataflow_endpoint_config\nDataflowEndpointGroupIdResponse,dataflow_endpoint_group_id_response\nDataflowEndpointListItem,dataflow_endpoint_list_item\nDatapoint,datapoint\nDatapoints,datapoints\nDatapointsToAlarm,datapoints_to_alarm\nDatapointsToAlert,datapoints_to_alert\nDataset,dataset\nDatasetAction,dataset_action\nDatasetActionSummary,dataset_action_summary\nDatasetArn,dataset_arn\nDatasetArns,dataset_arns\nDatasetAugmentedManifestsListItem,dataset_augmented_manifests_list_item\nDatasetChanges,dataset_changes\nDatasetContentDeliveryDestination,dataset_content_delivery_destination\nDatasetContentDeliveryRule,dataset_content_delivery_rule\nDatasetContentStatus,dataset_content_status\nDatasetContentSummary,dataset_content_summary\nDatasetContentVersionValue,dataset_content_version_value\nDatasetCount,dataset_count\nDatasetDefinition,dataset_definition\nDatasetDeletedAfterRequestedSyncCount,dataset_deleted_after_requested_sync_count\nDatasetDescription,dataset_description\nDatasetDocumentClassifierInputDataConfig,dataset_document_classifier_input_data_config\nDatasetEntityRecognizerAnnotations,dataset_entity_recognizer_annotations\nDatasetEntityRecognizerDocuments,dataset_entity_recognizer_documents\nDatasetEntityRecognizerEntityList,dataset_entity_recognizer_entity_list\nDatasetEntityRecognizerInputDataConfig,dataset_entity_recognizer_input_data_config\nDatasetEntries,dataset_entries\nDatasetEntry,dataset_entry\nDatasetExists,dataset_exists\nDatasetExportJob,dataset_export_job\nDatasetExportJobOutput,dataset_export_job_output\nDatasetExportJobSummary,dataset_export_job_summary\nDatasetFilter,dataset_filter\nDatasetFormat,dataset_format\nDatasetGroundTruthManifest,dataset_ground_truth_manifest\nDatasetGroup,dataset_group\nDatasetGroupArn,dataset_group_arn\nDatasetGroupName,dataset_group_name\nDatasetGroupSummary,dataset_group_summary\nDatasetGroups,dataset_groups\nDatasetId,dataset_id\nDatasetImageStats,dataset_image_stats\nDatasetImportJob,dataset_import_job\nDatasetImportJobArn,dataset_import_job_arn\nDatasetImportJobArns,dataset_import_job_arns\nDatasetImportJobName,dataset_import_job_name\nDatasetImportJobSummary,dataset_import_job_summary\nDatasetImportJobs,dataset_import_jobs\nDatasetInputDataConfig,dataset_input_data_config\nDatasetLabelDescription,dataset_label_description\nDatasetLabelDescriptions,dataset_label_descriptions\nDatasetLabelStats,dataset_label_stats\nDatasetMetadata,dataset_metadata\nDatasetName,dataset_name\nDatasetNameBeginsWith,dataset_name_begins_with\nDatasetOwnerInfo,dataset_owner_info\nDatasetParameter,dataset_parameter\nDatasetParameters,dataset_parameters\nDatasetProperties,dataset_properties\nDatasetPropertiesList,dataset_properties_list\nDatasetRowDateGranularity,dataset_row_date_granularity\nDatasetS3Uri,dataset_s3_uri\nDatasetSchema,dataset_schema\nDatasetSchemaSummary,dataset_schema_summary\nDatasetSource,dataset_source\nDatasetStatisticsConfiguration,dataset_statistics_configuration\nDatasetStats,dataset_stats\nDatasetSummaries,dataset_summaries\nDatasetSummary,dataset_summary\nDatasetSyncCount,dataset_sync_count\nDatasetTrigger,dataset_trigger\nDatasetType,dataset_type\nDatasetUpdateSummary,dataset_update_summary\nDatasets,datasets\nDatasourcePackageIngestDetail,datasource_package_ingest_detail\nDatasourcePackageIngestHistory,datasource_package_ingest_history\nDatasourcePackageIngestState,datasource_package_ingest_state\nDatasourcePackageIngestStates,datasource_package_ingest_states\nDatasourcePackageUsageInfo,datasource_package_usage_info\nDatasourcePackages,datasource_packages\nDatastore,datastore\nDatastoreActivity,datastore_activity\nDatastoreArn,datastore_arn\nDatastoreEndpoint,datastore_endpoint\nDatastoreFilter,datastore_filter\nDatastoreId,datastore_id\nDatastoreIotSiteWiseMultiLayerStorage,datastore_iot_site_wise_multi_layer_storage\nDatastoreIotSiteWiseMultiLayerStorageSummary,datastore_iot_site_wise_multi_layer_storage_summary\nDatastoreName,datastore_name\nDatastorePartition,datastore_partition\nDatastorePartitions,datastore_partitions\nDatastoreProperties,datastore_properties\nDatastorePropertiesList,datastore_properties_list\nDatastoreStatistics,datastore_statistics\nDatastoreStatus,datastore_status\nDatastoreStorageSummary,datastore_storage_summary\nDatastoreSummary,datastore_summary\nDatastoreTypeVersion,datastore_type_version\nDatatype,datatype\nDate,date\nDateAggregationFunction,date_aggregation_function\nDateArrayOptions,date_array_options\nDateAxisOptions,date_axis_options\nDateColumnStatisticsData,date_column_statistics_data\nDateCreated,date_created\nDateDimensionField,date_dimension_field\nDateEnabled,date_enabled\nDateFieldFormat,date_field_format\nDateFilter,date_filter\nDateFormat,date_format\nDateGranularity,date_granularity\nDateImported,date_imported\nDateInterval,date_interval\nDateMeasureField,date_measure_field\nDateModified,date_modified\nDateNewProvisioningDataAvailable,date_new_provisioning_data_available\nDateOptions,date_options\nDatePartitionDelimiter,date_partition_delimiter\nDatePartitionEnabled,date_partition_enabled\nDatePartitionSequence,date_partition_sequence\nDatePartitionTimezone,date_partition_timezone\nDateProvisioned,date_provisioned\nDateRange,date_range\nDateRangeFilter,date_range_filter\nDateRangeType,date_range_type\nDateReference,date_reference\nDateTime,date_time\nDateTimeDatasetParameter,date_time_dataset_parameter\nDateTimeDatasetParameterDefaultValues,date_time_dataset_parameter_default_values\nDateTimeDefaultValues,date_time_default_values\nDateTimeFormat,date_time_format\nDateTimeFormatConfiguration,date_time_format_configuration\nDateTimeHierarchy,date_time_hierarchy\nDateTimeParameter,date_time_parameter\nDateTimeParameterDeclaration,date_time_parameter_declaration\nDateTimeParameters,date_time_parameters\nDateTimePicker,date_time_picker\nDateTimePickerControlDisplayOptions,date_time_picker_control_display_options\nDateTimeRange,date_time_range\nDateTimeStaticValues,date_time_static_values\nDateTimeValueWhenUnsetConfiguration,date_time_value_when_unset_configuration\nDateTimeValues,date_time_values\nDateUpdated,date_updated\nDateValue,date_value\nDatetime,datetime\nDatetimeFormat,datetime_format\nDatetimeOptions,datetime_options\nDatetimeRange,datetime_range\nDatetimeTypeFieldName,datetime_type_field_name\nDatum,datum\nDay,day\nDayOfMonth,day_of_month\nDayOfTheWeek,day_of_the_week\nDayOfWeek,day_of_week\nDays,days\nDaysAfterInitiation,days_after_initiation\nDaysBeforeExpiry,days_before_expiry\nDaysOfWeek,days_of_week\nDbClusterIdentifier,db_cluster_identifier\nDbClusterMembers,db_cluster_members\nDbClusterOptionGroupMemberships,db_cluster_option_group_memberships\nDbClusterOptionGroupName,db_cluster_option_group_name\nDbClusterParameterGroup,db_cluster_parameter_group\nDbClusterParameterGroupStatus,db_cluster_parameter_group_status\nDbClusterResourceId,db_cluster_resource_id\nDbClusterSnapshotAttributes,db_cluster_snapshot_attributes\nDbClusterSnapshotIdentifier,db_cluster_snapshot_identifier\nDbGroups,db_groups\nDbInstanceArn,db_instance_arn\nDbInstanceClass,db_instance_class\nDbInstanceIdentifier,db_instance_identifier\nDbInstancePort,db_instance_port\nDbInstanceStatus,db_instance_status\nDbName,db_name\nDbParameterGroupName,db_parameter_group_name\nDbParameterGroups,db_parameter_groups\nDbPassword,db_password\nDbSecurityGroupArn,db_security_group_arn\nDbSecurityGroupDescription,db_security_group_description\nDbSecurityGroupName,db_security_group_name\nDbSecurityGroups,db_security_groups\nDbSnapshotIdentifier,db_snapshot_identifier\nDbSubnetGroup,db_subnet_group\nDbSubnetGroupArn,db_subnet_group_arn\nDbSubnetGroupDescription,db_subnet_group_description\nDbSubnetGroupName,db_subnet_group_name\nDbUser,db_user\nDbiResourceId,dbi_resource_id\nDcFilter,dc_filter\nDdlArtifactsSchema,ddl_artifacts_schema\nDdls,ddls\nDdsHandling,dds_handling\nDdsXCoordinate,dds_x_coordinate\nDdsYCoordinate,dds_y_coordinate\nDeactivateAnomalyDetectorRequest,deactivate_anomaly_detector_request\nDeactivateContactChannelRequest,deactivate_contact_channel_request\nDeactivateDeviceIdentifierRequest,deactivate_device_identifier_request\nDeactivateDeviceIdentifierResponse,deactivate_device_identifier_response\nDeactivateEvaluationFormRequest,deactivate_evaluation_form_request\nDeactivateEvaluationFormResponse,deactivate_evaluation_form_response\nDeactivateEventSourceRequest,deactivate_event_source_request\nDeactivateKeySigningKeyRequest,deactivate_key_signing_key_request\nDeactivateKeySigningKeyResponse,deactivate_key_signing_key_response\nDeactivateMFADeviceRequest,deactivate_mfa_device_request\nDeactivatePipelineInput,deactivate_pipeline_input\nDeactivateTypeInput,deactivate_type_input\nDeactivateUserRequest,deactivate_user_request\nDeactivatingLastSystemUserException,deactivating_last_system_user_exception\nDeadLetterConfig,dead_letter_config\nDeadLetterQueueUrl,dead_letter_queue_url\nDeadLetterTargetArn,dead_letter_target_arn\nDeadline,deadline\nDeauthorizeConnectionRequest,deauthorize_connection_request\nDeauthorizeConnectionResponse,deauthorize_connection_response\nDeauthorizeDataShareMessage,deauthorize_data_share_message\nDeblockFilter,deblock_filter\nDebugHookConfig,debug_hook_config\nDebugLogDeliveryAccounts,debug_log_delivery_accounts\nDebugLogging,debug_logging\nDebugRuleConfiguration,debug_rule_configuration\nDebugRuleConfigurations,debug_rule_configurations\nDebugRuleEvaluationStatus,debug_rule_evaluation_status\nDebugRuleEvaluationStatuses,debug_rule_evaluation_statuses\nDebugSession,debug_session\nDecimalColumnStatisticsData,decimal_column_statistics_data\nDecimalDatasetParameter,decimal_dataset_parameter\nDecimalDatasetParameterDefaultValues,decimal_dataset_parameter_default_values\nDecimalDefaultValues,decimal_default_values\nDecimalNumber,decimal_number\nDecimalParameter,decimal_parameter\nDecimalParameterDeclaration,decimal_parameter_declaration\nDecimalParameters,decimal_parameters\nDecimalPlaces,decimal_places\nDecimalPlacesConfiguration,decimal_places_configuration\nDecimalSeparator,decimal_separator\nDecimalStaticValues,decimal_static_values\nDecimalValueWhenUnsetConfiguration,decimal_value_when_unset_configuration\nDecimalValues,decimal_values\nDecimalizationTable,decimalization_table\nDecipherOnly,decipher_only\nDecision,decision\nDecisionTask,decision_task\nDecisionTaskCompletedEventAttributes,decision_task_completed_event_attributes\nDecisionTaskScheduledEventAttributes,decision_task_scheduled_event_attributes\nDecisionTaskStartedEventAttributes,decision_task_started_event_attributes\nDecisionTaskTimedOutEventAttributes,decision_task_timed_out_event_attributes\nDeclared,declared\nDeclaredTransforms,declared_transforms\nDeclineHandshakeRequest,decline_handshake_request\nDeclineHandshakeResponse,decline_handshake_response\nDeclineInvitationsRequest,decline_invitations_request\nDeclineInvitationsResponse,decline_invitations_response\nDecodeAuthorizationMessageRequest,decode_authorization_message_request\nDecodeAuthorizationMessageResponse,decode_authorization_message_response\nDecodeConfig,decode_config\nDecodedMessage,decoded_message\nDecoderManifestSummary,decoder_manifest_summary\nDecoderManifestValidationException,decoder_manifest_validation_exception\nDecommissionTimeout,decommission_timeout\nDecreaseNodeGroupsInGlobalReplicationGroupMessage,decrease_node_groups_in_global_replication_group_message\nDecreaseNodeGroupsInGlobalReplicationGroupResult,decrease_node_groups_in_global_replication_group_result\nDecreaseReplicaCountMessage,decrease_replica_count_message\nDecreaseReplicaCountResult,decrease_replica_count_result\nDecreaseReplicationFactorRequest,decrease_replication_factor_request\nDecreaseReplicationFactorResponse,decrease_replication_factor_response\nDecreaseStreamRetentionPeriodInput,decrease_stream_retention_period_input\nDecrypt,decrypt\nDecryptDataInput,decrypt_data_input\nDecryptDataOutput,decrypt_data_output\nDecryptRequest,decrypt_request\nDecryptResponse,decrypt_response\nDecryptStepDetails,decrypt_step_details\nDecryption,decryption\nDecryptionAttributes,decryption_attributes\nDecryptionFailure,decryption_failure\nDecryptionMode,decryption_mode\nDecryptionSettings,decryption_settings\nDedicatedHostIds,dedicated_host_ids\nDedicatedHostsSupported,dedicated_hosts_supported\nDedicatedIp,dedicated_ip\nDedicatedIpAutoWarmupEnabled,dedicated_ip_auto_warmup_enabled\nDedicatedIpPool,dedicated_ip_pool\nDedicatedIpPools,dedicated_ip_pools\nDedicatedIps,dedicated_ips\nDedicatedMaster,dedicated_master\nDedicatedMasterCount,dedicated_master_count\nDedicatedMasterEnabled,dedicated_master_enabled\nDedicatedMasterType,dedicated_master_type\nDedicatedTenancyManagementCidrRange,dedicated_tenancy_management_cidr_range\nDedicatedTenancySupport,dedicated_tenancy_support\nDefault,default\nDefaultAction,default_action\nDefaultActions,default_actions\nDefaultActivity,default_activity\nDefaultAdmin,default_admin\nDefaultAllocatedStorage,default_allocated_storage\nDefaultArguments,default_arguments\nDefaultAssociationRouteTable,default_association_route_table\nDefaultAuthType,default_auth_type\nDefaultAuthenticationMethod,default_authentication_method\nDefaultAvailabilityZone,default_availability_zone\nDefaultBaseline,default_baseline\nDefaultBehavior,default_behavior\nDefaultBranchCannotBeDeletedException,default_branch_cannot_be_deleted_exception\nDefaultButtonConfiguration,default_button_configuration\nDefaultCacheBehavior,default_cache_behavior\nDefaultCapacityProviderStrategy,default_capacity_provider_strategy\nDefaultCategoricalHyperParameterRange,default_categorical_hyper_parameter_range\nDefaultCellWidth,default_cell_width\nDefaultCertificateForNewLaunches,default_certificate_for_new_launches\nDefaultCharacterSet,default_character_set\nDefaultClientBrandingAttributes,default_client_branding_attributes\nDefaultClusterParameters,default_cluster_parameters\nDefaultCodeRepository,default_code_repository\nDefaultCodeRepositoryContains,default_code_repository_contains\nDefaultConditionalBranch,default_conditional_branch\nDefaultConferenceProviderArn,default_conference_provider_arn\nDefaultConfig,default_config\nDefaultContent,default_content\nDefaultContinuousHyperParameterRange,default_continuous_hyper_parameter_range\nDefaultControlPanel,default_control_panel\nDefaultCooldown,default_cooldown\nDefaultCores,default_cores\nDefaultDateColumnName,default_date_column_name\nDefaultDetection,default_detection\nDefaultDimensionValue,default_dimension_value\nDefaultDocumentIdFormat,default_document_id_format\nDefaultDomain,default_domain\nDefaultEmailCustomizationTemplate,default_email_customization_template\nDefaultEmailOption,default_email_option\nDefaultEmailTags,default_email_tags\nDefaultEncryptionKey,default_encryption_key\nDefaultErrorDetails,default_error_details\nDefaultExecutorDpuSize,default_executor_dpu_size\nDefaultExpirationDays,default_expiration_days\nDefaultExportDestination,default_export_destination\nDefaultFieldValues,default_field_values\nDefaultForAz,default_for_az\nDefaultFormatting,default_formatting\nDefaultFreeFormLayoutConfiguration,default_free_form_layout_configuration\nDefaultGateway,default_gateway\nDefaultGid,default_gid\nDefaultGridLayoutConfiguration,default_grid_layout_configuration\nDefaultHyperParameterRanges,default_hyper_parameter_ranges\nDefaultIamRoleArn,default_iam_role_arn\nDefaultImportClientBrandingAttributes,default_import_client_branding_attributes\nDefaultInstanceName,default_instance_name\nDefaultInstanceProfileArn,default_instance_profile_arn\nDefaultInstanceWarmup,default_instance_warmup\nDefaultIntegerHyperParameterRange,default_integer_hyper_parameter_range\nDefaultInteractiveLayoutConfiguration,default_interactive_layout_configuration\nDefaultLicense,default_license\nDefaultList,default_list\nDefaultLists,default_lists\nDefaultLogLevel,default_log_level\nDefaultMailDomain,default_mail_domain\nDefaultMessage,default_message\nDefaultMessageType,default_message_type\nDefaultNamespace,default_namespace\nDefaultNetworkCardIndex,default_network_card_index\nDefaultNewSheetConfiguration,default_new_sheet_configuration\nDefaultOnly,default_only\nDefaultOptionRefId,default_option_ref_id\nDefaultOs,default_os\nDefaultOu,default_ou\nDefaultOutboundQueueId,default_outbound_queue_id\nDefaultPaginatedLayoutConfiguration,default_paginated_layout_configuration\nDefaultPhoneNumber,default_phone_number\nDefaultPort,default_port\nDefaultPropagationRouteTable,default_propagation_route_table\nDefaultPushNotificationMessage,default_push_notification_message\nDefaultPushNotificationTemplate,default_push_notification_template\nDefaultRecipes,default_recipes\nDefaultRedirectURI,default_redirect_uri\nDefaultResourceDiscoveryAssociationId,default_resource_discovery_association_id\nDefaultResourceDiscoveryId,default_resource_discovery_id\nDefaultResourceSpec,default_resource_spec\nDefaultResult,default_result\nDefaultRetention,default_retention\nDefaultRootDeviceType,default_root_device_type\nDefaultRootObject,default_root_object\nDefaultRoute,default_route\nDefaultRouteInput,default_route_input\nDefaultRouteSettings,default_route_settings\nDefaultRouteTableAssociation,default_route_table_association\nDefaultRouteTablePropagation,default_route_table_propagation\nDefaultRunProperties,default_run_properties\nDefaultRuntimeContextDevice,default_runtime_context_device\nDefaultRuntimeContextDeviceName,default_runtime_context_device_name\nDefaultS3Location,default_s3_location\nDefaultSectionBasedLayoutConfiguration,default_section_based_layout_configuration\nDefaultSecurityGroupNames,default_security_group_names\nDefaultSegmentDeliveryConfiguration,default_segment_delivery_configuration\nDefaultSelection,default_selection\nDefaultSenderId,default_sender_id\nDefaultSeriesSettings,default_series_settings\nDefaultServerSideEncryption,default_server_side_encryption\nDefaultSessionExpiryMinutes,default_session_expiry_minutes\nDefaultSizeInspectionLimit,default_size_inspection_limit\nDefaultSpaceSettings,default_space_settings\nDefaultSshKeyName,default_ssh_key_name\nDefaultState,default_state\nDefaultStorageClass,default_storage_class\nDefaultSubnetId,default_subnet_id\nDefaultSubscriptionStatus,default_subscription_status\nDefaultSubstitutions,default_substitutions\nDefaultTTL,default_ttl\nDefaultTags,default_tags\nDefaultTargetCapacityType,default_target_capacity_type\nDefaultTargetInstance,default_target_instance\nDefaultTemplateData,default_template_data\nDefaultTheme,default_theme\nDefaultThreadsPerCore,default_threads_per_core\nDefaultUid,default_uid\nDefaultUndefinedFault,default_undefined_fault\nDefaultUserAssociatedToUserGroupFault,default_user_associated_to_user_group_fault\nDefaultUserRequired,default_user_required\nDefaultUserSettings,default_user_settings\nDefaultVCpus,default_v_cpus\nDefaultValue,default_value\nDefaultValueColumn,default_value_column\nDefaultValues,default_values\nDefaultVersion,default_version\nDefaultVersionId,default_version_id\nDefaultVersionName,default_version_name\nDefaultVersionNumber,default_version_number\nDefaultVocabulary,default_vocabulary\nDefaultVocabularyList,default_vocabulary_list\nDefaultWatchlist,default_watchlist\nDefaultWatchlistId,default_watchlist_id\nDefaultWorkspaceCreationProperties,default_workspace_creation_properties\nDefaults,defaults\nDeferActivation,defer_activation\nDeferMaintenance,defer_maintenance\nDeferMaintenanceDuration,defer_maintenance_duration\nDeferMaintenanceEndTime,defer_maintenance_end_time\nDeferMaintenanceIdentifier,defer_maintenance_identifier\nDeferMaintenanceStartTime,defer_maintenance_start_time\nDeferredMaintenanceWindow,deferred_maintenance_window\nDeferredMaintenanceWindows,deferred_maintenance_windows\nDefineAnalysisSchemeRequest,define_analysis_scheme_request\nDefineAnalysisSchemeResponse,define_analysis_scheme_response\nDefineAuthChallenge,define_auth_challenge\nDefineExpressionRequest,define_expression_request\nDefineExpressionResponse,define_expression_response\nDefineIndexFieldRequest,define_index_field_request\nDefineIndexFieldResponse,define_index_field_response\nDefineSegment,define_segment\nDefineSuggesterRequest,define_suggester_request\nDefineSuggesterResponse,define_suggester_response\nDefinition,definition\nDefinitionArn,definition_arn\nDefinitionDocument,definition_document\nDefinitionInformation,definition_information\nDefinitionName,definition_name\nDefinitionTimestamp,definition_timestamp\nDefinitionType,definition_type\nDefinitions,definitions\nDegraded,degraded\nDeinterlacer,deinterlacer\nDelay,delay\nDelaySeconds,delay_seconds\nDelayUntilElbConnectionsDrained,delay_until_elb_connections_drained\nDelegate,delegate\nDelegatedAdmin,delegated_admin\nDelegatedAdminAccount,delegated_admin_account\nDelegatedAdminAccountId,delegated_admin_account_id\nDelegatedAdminAccountLimitExceededException,delegated_admin_account_limit_exceeded_exception\nDelegatedAdministrator,delegated_administrator\nDelegatedAdministrators,delegated_administrators\nDelegatedService,delegated_service\nDelegatedServices,delegated_services\nDelegates,delegates\nDelegation,delegation\nDelegationEnabledDate,delegation_enabled_date\nDelegationMetadata,delegation_metadata\nDelegationSet,delegation_set\nDelegationSetAlreadyCreated,delegation_set_already_created\nDelegationSetAlreadyReusable,delegation_set_already_reusable\nDelegationSetId,delegation_set_id\nDelegationSetInUse,delegation_set_in_use\nDelegationSetNotAvailable,delegation_set_not_available\nDelegationSetNotReusable,delegation_set_not_reusable\nDelegationSets,delegation_sets\nDelegationTime,delegation_time\nDelete,delete\nDeleteACLRequest,delete_acl_request\nDeleteACLResponse,delete_acl_response\nDeleteAcceleratorRequest,delete_accelerator_request\nDeleteAccessControlConfigurationRequest,delete_access_control_configuration_request\nDeleteAccessControlRuleRequest,delete_access_control_rule_request\nDeleteAccessKeyRequest,delete_access_key_request\nDeleteAccessLogSettingsRequest,delete_access_log_settings_request\nDeleteAccessLogSubscriptionRequest,delete_access_log_subscription_request\nDeleteAccessPointForObjectLambdaRequest,delete_access_point_for_object_lambda_request\nDeleteAccessPointInput,delete_access_point_input\nDeleteAccessPointPolicyForObjectLambdaRequest,delete_access_point_policy_for_object_lambda_request\nDeleteAccessPointPolicyRequest,delete_access_point_policy_request\nDeleteAccessPointRequest,delete_access_point_request\nDeleteAccessPolicyRequest,delete_access_policy_request\nDeleteAccessRequest,delete_access_request\nDeleteAccessTokenRequest,delete_access_token_request\nDeleteAccessorInput,delete_accessor_input\nDeleteAccountAliasRequest,delete_account_alias_request\nDeleteAccountAssignmentRequest,delete_account_assignment_request\nDeleteAccountAssignmentResponse,delete_account_assignment_response\nDeleteAccountAuditConfigurationRequest,delete_account_audit_configuration_request\nDeleteAccountCustomizationRequest,delete_account_customization_request\nDeleteAccountCustomizationResponse,delete_account_customization_response\nDeleteAccountPolicyRequest,delete_account_policy_request\nDeleteAccountRequest,delete_account_request\nDeleteAccountSettingRequest,delete_account_setting_request\nDeleteAccountSettingResponse,delete_account_setting_response\nDeleteAccountSubscriptionRequest,delete_account_subscription_request\nDeleteAccountSubscriptionResponse,delete_account_subscription_response\nDeleteActionRequest,delete_action_request\nDeleteActionResponse,delete_action_response\nDeleteActionTargetRequest,delete_action_target_request\nDeleteActionTargetResponse,delete_action_target_response\nDeleteActivationRequest,delete_activation_request\nDeleteActivityInput,delete_activity_input\nDeleteAddonRequest,delete_addon_request\nDeleteAddonResponse,delete_addon_response\nDeleteAddressBookRequest,delete_address_book_request\nDeleteAdmChannelRequest,delete_adm_channel_request\nDeleteAdmChannelResponse,delete_adm_channel_response\nDeleteAfterDays,delete_after_days\nDeleteAfterUpload,delete_after_upload\nDeleteAgentRequest,delete_agent_request\nDeleteAggregationAuthorizationRequest,delete_aggregation_authorization_request\nDeleteAgreementRequest,delete_agreement_request\nDeleteAlarmModelRequest,delete_alarm_model_request\nDeleteAlarmRequest,delete_alarm_request\nDeleteAlarmResult,delete_alarm_result\nDeleteAlarmsInput,delete_alarms_input\nDeleteAlertManagerDefinitionRequest,delete_alert_manager_definition_request\nDeleteAlertRequest,delete_alert_request\nDeleteAlgorithmInput,delete_algorithm_input\nDeleteAliasInput,delete_alias_input\nDeleteAliasRequest,delete_alias_request\nDeleteAll,delete_all\nDeleteAllPolicyResources,delete_all_policy_resources\nDeleteAllRevisions,delete_all_revisions\nDeleteAllowListRequest,delete_allow_list_request\nDeleteAlternateContactRequest,delete_alternate_contact_request\nDeleteAnalysisRequest,delete_analysis_request\nDeleteAnalysisResponse,delete_analysis_response\nDeleteAnalysisSchemeRequest,delete_analysis_scheme_request\nDeleteAnalysisSchemeResponse,delete_analysis_scheme_response\nDeleteAnalysisTemplateInput,delete_analysis_template_input\nDeleteAnalyzerRequest,delete_analyzer_request\nDeleteAnnotationStoreRequest,delete_annotation_store_request\nDeleteAnnotationStoreResponse,delete_annotation_store_response\nDeleteAnnotationStoreVersionsRequest,delete_annotation_store_versions_request\nDeleteAnnotationStoreVersionsResponse,delete_annotation_store_versions_response\nDeleteAnomalyDetectorInput,delete_anomaly_detector_input\nDeleteAnomalyDetectorRequest,delete_anomaly_detector_request\nDeleteAnomalyMonitorRequest,delete_anomaly_monitor_request\nDeleteAnomalySubscriptionRequest,delete_anomaly_subscription_request\nDeleteApiCacheRequest,delete_api_cache_request\nDeleteApiDestinationRequest,delete_api_destination_request\nDeleteApiKeyRequest,delete_api_key_request\nDeleteApiMappingRequest,delete_api_mapping_request\nDeleteApiRequest,delete_api_request\nDeleteApnsChannelRequest,delete_apns_channel_request\nDeleteApnsChannelResponse,delete_apns_channel_response\nDeleteApnsSandboxChannelRequest,delete_apns_sandbox_channel_request\nDeleteApnsSandboxChannelResponse,delete_apns_sandbox_channel_response\nDeleteApnsVoipChannelRequest,delete_apns_voip_channel_request\nDeleteApnsVoipChannelResponse,delete_apns_voip_channel_response\nDeleteApnsVoipSandboxChannelRequest,delete_apns_voip_sandbox_channel_request\nDeleteApnsVoipSandboxChannelResponse,delete_apns_voip_sandbox_channel_response\nDeleteAppAssessmentRequest,delete_app_assessment_request\nDeleteAppAssessmentResponse,delete_app_assessment_response\nDeleteAppAuthorizationRequest,delete_app_authorization_request\nDeleteAppBlockBuilderRequest,delete_app_block_builder_request\nDeleteAppBlockRequest,delete_app_block_request\nDeleteAppBundleRequest,delete_app_bundle_request\nDeleteAppImageConfigRequest,delete_app_image_config_request\nDeleteAppInput,delete_app_input\nDeleteAppInputSourceRequest,delete_app_input_source_request\nDeleteAppInputSourceResponse,delete_app_input_source_response\nDeleteAppInstanceAdminRequest,delete_app_instance_admin_request\nDeleteAppInstanceBotRequest,delete_app_instance_bot_request\nDeleteAppInstanceRequest,delete_app_instance_request\nDeleteAppInstanceStreamingConfigurationsRequest,delete_app_instance_streaming_configurations_request\nDeleteAppInstanceUserRequest,delete_app_instance_user_request\nDeleteAppLaunchConfigurationRequest,delete_app_launch_configuration_request\nDeleteAppMonitorRequest,delete_app_monitor_request\nDeleteAppReplicationConfigurationRequest,delete_app_replication_configuration_request\nDeleteAppRequest,delete_app_request\nDeleteAppResponse,delete_app_response\nDeleteAppResult,delete_app_result\nDeleteAppValidationConfigurationRequest,delete_app_validation_configuration_request\nDeleteAppVersionAppComponentRequest,delete_app_version_app_component_request\nDeleteAppVersionAppComponentResponse,delete_app_version_app_component_response\nDeleteAppVersionResourceRequest,delete_app_version_resource_request\nDeleteAppVersionResourceResponse,delete_app_version_resource_response\nDeleteApplicationCloudWatchLoggingOptionRequest,delete_application_cloud_watch_logging_option_request\nDeleteApplicationCloudWatchLoggingOptionResponse,delete_application_cloud_watch_logging_option_response\nDeleteApplicationFromEnvironmentRequest,delete_application_from_environment_request\nDeleteApplicationInput,delete_application_input\nDeleteApplicationInputProcessingConfigurationRequest,delete_application_input_processing_configuration_request\nDeleteApplicationInputProcessingConfigurationResponse,delete_application_input_processing_configuration_response\nDeleteApplicationMessage,delete_application_message\nDeleteApplicationOutputRequest,delete_application_output_request\nDeleteApplicationOutputResponse,delete_application_output_response\nDeleteApplicationReferenceDataSourceRequest,delete_application_reference_data_source_request\nDeleteApplicationReferenceDataSourceResponse,delete_application_reference_data_source_response\nDeleteApplicationRequest,delete_application_request\nDeleteApplicationResponse,delete_application_response\nDeleteApplicationSnapshotRequest,delete_application_snapshot_request\nDeleteApplicationVersionMessage,delete_application_version_message\nDeleteApplicationVpcConfigurationRequest,delete_application_vpc_configuration_request\nDeleteApplicationVpcConfigurationResponse,delete_application_vpc_configuration_response\nDeleteApplicationsRequest,delete_applications_request\nDeleteApprovalRuleTemplateInput,delete_approval_rule_template_input\nDeleteApprovalRuleTemplateOutput,delete_approval_rule_template_output\nDeleteAppsListRequest,delete_apps_list_request\nDeleteArchiveInput,delete_archive_input\nDeleteArchiveRequest,delete_archive_request\nDeleteArchiveRuleRequest,delete_archive_rule_request\nDeleteArguments,delete_arguments\nDeleteArtifactRequest,delete_artifact_request\nDeleteArtifactResponse,delete_artifact_response\nDeleteAssessmentFrameworkRequest,delete_assessment_framework_request\nDeleteAssessmentFrameworkShareRequest,delete_assessment_framework_share_request\nDeleteAssessmentReportRequest,delete_assessment_report_request\nDeleteAssessmentRequest,delete_assessment_request\nDeleteAssessmentRunRequest,delete_assessment_run_request\nDeleteAssessmentTargetRequest,delete_assessment_target_request\nDeleteAssessmentTemplateRequest,delete_assessment_template_request\nDeleteAssetModelRequest,delete_asset_model_request\nDeleteAssetModelResponse,delete_asset_model_response\nDeleteAssetRequest,delete_asset_request\nDeleteAssetResponse,delete_asset_response\nDeleteAssistantAssociationRequest,delete_assistant_association_request\nDeleteAssistantRequest,delete_assistant_request\nDeleteAssociatedConditionalForwarder,delete_associated_conditional_forwarder\nDeleteAssociationRequest,delete_association_request\nDeleteAssociationResponse,delete_association_response\nDeleteAt,delete_at\nDeleteAttachmentRequest,delete_attachment_request\nDeleteAttachmentResponse,delete_attachment_response\nDeleteAttendeeRequest,delete_attendee_request\nDeleteAttributeGroupRequest,delete_attribute_group_request\nDeleteAttributeGroupResponse,delete_attribute_group_response\nDeleteAttributesRequest,delete_attributes_request\nDeleteAttributesResponse,delete_attributes_response\nDeleteAuditSuppressionRequest,delete_audit_suppression_request\nDeleteAuthPolicyRequest,delete_auth_policy_request\nDeleteAuthenticationProfileMessage,delete_authentication_profile_message\nDeleteAuthenticationProfileResult,delete_authentication_profile_result\nDeleteAuthorizerRequest,delete_authorizer_request\nDeleteAutoScalingConfigurationRequest,delete_auto_scaling_configuration_request\nDeleteAutoScalingConfigurationResponse,delete_auto_scaling_configuration_response\nDeleteAutoScalingGroupType,delete_auto_scaling_group_type\nDeleteAutoSnapshotRequest,delete_auto_snapshot_request\nDeleteAutoSnapshotResult,delete_auto_snapshot_result\nDeleteAutomatedBackups,delete_automated_backups\nDeleteAutomaticTapeCreationPolicyInput,delete_automatic_tape_creation_policy_input\nDeleteAutomaticTapeCreationPolicyOutput,delete_automatic_tape_creation_policy_output\nDeleteAvailabilityConfigurationRequest,delete_availability_configuration_request\nDeleteAwsLogSourceRequest,delete_aws_log_source_request\nDeleteAwsLogSourceResponse,delete_aws_log_source_response\nDeleteBGPPeerRequest,delete_bgp_peer_request\nDeleteBGPPeerResponse,delete_bgp_peer_response\nDeleteBackendAPIRequest,delete_backend_api_request\nDeleteBackendAPIResponse,delete_backend_api_response\nDeleteBackendAuthRequest,delete_backend_auth_request\nDeleteBackendAuthResponse,delete_backend_auth_response\nDeleteBackendEnvironmentRequest,delete_backend_environment_request\nDeleteBackendEnvironmentResult,delete_backend_environment_result\nDeleteBackendRequest,delete_backend_request\nDeleteBackendResponse,delete_backend_response\nDeleteBackendStorageRequest,delete_backend_storage_request\nDeleteBackendStorageResponse,delete_backend_storage_response\nDeleteBackupInput,delete_backup_input\nDeleteBackupOutput,delete_backup_output\nDeleteBackupPlanInput,delete_backup_plan_input\nDeleteBackupPlanOutput,delete_backup_plan_output\nDeleteBackupRequest,delete_backup_request\nDeleteBackupResponse,delete_backup_response\nDeleteBackupSelectionInput,delete_backup_selection_input\nDeleteBackupVaultAccessPolicyInput,delete_backup_vault_access_policy_input\nDeleteBackupVaultInput,delete_backup_vault_input\nDeleteBackupVaultLockConfigurationInput,delete_backup_vault_lock_configuration_input\nDeleteBackupVaultNotificationsInput,delete_backup_vault_notifications_input\nDeleteBaiduChannelRequest,delete_baidu_channel_request\nDeleteBaiduChannelResponse,delete_baidu_channel_response\nDeleteBandwidthRateLimitInput,delete_bandwidth_rate_limit_input\nDeleteBandwidthRateLimitOutput,delete_bandwidth_rate_limit_output\nDeleteBasePathMappingRequest,delete_base_path_mapping_request\nDeleteBatchImportJobRequest,delete_batch_import_job_request\nDeleteBatchPredictionInput,delete_batch_prediction_input\nDeleteBatchPredictionJobRequest,delete_batch_prediction_job_request\nDeleteBatchPredictionOutput,delete_batch_prediction_output\nDeleteBehavior,delete_behavior\nDeleteBillingGroupInput,delete_billing_group_input\nDeleteBillingGroupOutput,delete_billing_group_output\nDeleteBillingGroupRequest,delete_billing_group_request\nDeleteBlueGreenDeploymentRequest,delete_blue_green_deployment_request\nDeleteBlueGreenDeploymentResponse,delete_blue_green_deployment_response\nDeleteBlueprintRequest,delete_blueprint_request\nDeleteBlueprintResponse,delete_blueprint_response\nDeleteBotAliasRequest,delete_bot_alias_request\nDeleteBotAliasResponse,delete_bot_alias_response\nDeleteBotChannelAssociationRequest,delete_bot_channel_association_request\nDeleteBotLocaleRequest,delete_bot_locale_request\nDeleteBotLocaleResponse,delete_bot_locale_response\nDeleteBotRequest,delete_bot_request\nDeleteBotResponse,delete_bot_response\nDeleteBotVersionRequest,delete_bot_version_request\nDeleteBotVersionResponse,delete_bot_version_response\nDeleteBranchInput,delete_branch_input\nDeleteBranchOutput,delete_branch_output\nDeleteBranchRequest,delete_branch_request\nDeleteBranchResult,delete_branch_result\nDeleteBridgeRequest,delete_bridge_request\nDeleteBridgeResponse,delete_bridge_response\nDeleteBrokerRequest,delete_broker_request\nDeleteBrokerResponse,delete_broker_response\nDeleteBrowserSettingsRequest,delete_browser_settings_request\nDeleteBucketAccessKeyRequest,delete_bucket_access_key_request\nDeleteBucketAccessKeyResult,delete_bucket_access_key_result\nDeleteBucketAnalyticsConfigurationRequest,delete_bucket_analytics_configuration_request\nDeleteBucketCorsRequest,delete_bucket_cors_request\nDeleteBucketEncryptionRequest,delete_bucket_encryption_request\nDeleteBucketIntelligentTieringConfigurationRequest,delete_bucket_intelligent_tiering_configuration_request\nDeleteBucketInventoryConfigurationRequest,delete_bucket_inventory_configuration_request\nDeleteBucketLifecycleConfigurationRequest,delete_bucket_lifecycle_configuration_request\nDeleteBucketLifecycleRequest,delete_bucket_lifecycle_request\nDeleteBucketMetricsConfigurationRequest,delete_bucket_metrics_configuration_request\nDeleteBucketOwnershipControlsRequest,delete_bucket_ownership_controls_request\nDeleteBucketPolicyRequest,delete_bucket_policy_request\nDeleteBucketReplicationRequest,delete_bucket_replication_request\nDeleteBucketRequest,delete_bucket_request\nDeleteBucketResult,delete_bucket_result\nDeleteBucketTaggingRequest,delete_bucket_tagging_request\nDeleteBucketWebsiteRequest,delete_bucket_website_request\nDeleteBudgetActionRequest,delete_budget_action_request\nDeleteBudgetActionResponse,delete_budget_action_response\nDeleteBudgetRequest,delete_budget_request\nDeleteBuildBatchInput,delete_build_batch_input\nDeleteBuildBatchOutput,delete_build_batch_output\nDeleteBuildInput,delete_build_input\nDeleteBusinessReportScheduleRequest,delete_business_report_schedule_request\nDeleteByteMatchSetRequest,delete_byte_match_set_request\nDeleteByteMatchSetResponse,delete_byte_match_set_response\nDeleteCACertificateRequest,delete_ca_certificate_request\nDeleteCacheClusterMessage,delete_cache_cluster_message\nDeleteCacheClusterResult,delete_cache_cluster_result\nDeleteCacheParameterGroupMessage,delete_cache_parameter_group_message\nDeleteCachePolicyRequest,delete_cache_policy_request\nDeleteCacheSecurityGroupMessage,delete_cache_security_group_message\nDeleteCacheSubnetGroupMessage,delete_cache_subnet_group_message\nDeleteCalculatedAttributeDefinitionRequest,delete_calculated_attribute_definition_request\nDeleteCallAnalyticsCategoryRequest,delete_call_analytics_category_request\nDeleteCallAnalyticsJobRequest,delete_call_analytics_job_request\nDeleteCampaignRequest,delete_campaign_request\nDeleteCampaignResponse,delete_campaign_response\nDeleteCanaryRequest,delete_canary_request\nDeleteCapacityProviderRequest,delete_capacity_provider_request\nDeleteCapacityProviderResponse,delete_capacity_provider_response\nDeleteCapacityReservationInput,delete_capacity_reservation_input\nDeleteCarrierGatewayRequest,delete_carrier_gateway_request\nDeleteCarrierGatewayResult,delete_carrier_gateway_result\nDeleteCellRequest,delete_cell_request\nDeleteCertificateAuthorityRequest,delete_certificate_authority_request\nDeleteCertificateMessage,delete_certificate_message\nDeleteCertificateRequest,delete_certificate_request\nDeleteCertificateResponse,delete_certificate_response\nDeleteCertificateResult,delete_certificate_result\nDeleteChangeSetInput,delete_change_set_input\nDeleteChannelBanRequest,delete_channel_ban_request\nDeleteChannelFlowRequest,delete_channel_flow_request\nDeleteChannelGroupRequest,delete_channel_group_request\nDeleteChannelMembershipRequest,delete_channel_membership_request\nDeleteChannelMessageRequest,delete_channel_message_request\nDeleteChannelModeratorRequest,delete_channel_moderator_request\nDeleteChannelPolicyRequest,delete_channel_policy_request\nDeleteChannelRequest,delete_channel_request\nDeleteChannelResponse,delete_channel_response\nDeleteChapCredentialsInput,delete_chap_credentials_input\nDeleteChapCredentialsOutput,delete_chap_credentials_output\nDeleteCidrCollectionRequest,delete_cidr_collection_request\nDeleteClassifierRequest,delete_classifier_request\nDeleteClientBrandingRequest,delete_client_branding_request\nDeleteClientCertificateRequest,delete_client_certificate_request\nDeleteClientVpnEndpointRequest,delete_client_vpn_endpoint_request\nDeleteClientVpnEndpointResult,delete_client_vpn_endpoint_result\nDeleteClientVpnRouteRequest,delete_client_vpn_route_request\nDeleteClientVpnRouteResult,delete_client_vpn_route_result\nDeleteClonedVolumes,delete_cloned_volumes\nDeleteCloudFrontOriginAccessIdentityRequest,delete_cloud_front_origin_access_identity_request\nDeleteClusterInput,delete_cluster_input\nDeleteClusterMessage,delete_cluster_message\nDeleteClusterOutput,delete_cluster_output\nDeleteClusterParameterGroupMessage,delete_cluster_parameter_group_message\nDeleteClusterPolicyRequest,delete_cluster_policy_request\nDeleteClusterRequest,delete_cluster_request\nDeleteClusterResponse,delete_cluster_response\nDeleteClusterResult,delete_cluster_result\nDeleteClusterSecurityGroupMessage,delete_cluster_security_group_message\nDeleteClusterSnapshotInput,delete_cluster_snapshot_input\nDeleteClusterSnapshotMessage,delete_cluster_snapshot_message\nDeleteClusterSnapshotOutput,delete_cluster_snapshot_output\nDeleteClusterSnapshotResult,delete_cluster_snapshot_result\nDeleteClusterSubnetGroupMessage,delete_cluster_subnet_group_message\nDeleteCodeRepositoryInput,delete_code_repository_input\nDeleteCodeSigningConfigRequest,delete_code_signing_config_request\nDeleteCoipCidrRequest,delete_coip_cidr_request\nDeleteCoipCidrResult,delete_coip_cidr_result\nDeleteCoipPoolRequest,delete_coip_pool_request\nDeleteCoipPoolResult,delete_coip_pool_result\nDeleteCollaborationInput,delete_collaboration_input\nDeleteCollectionDetail,delete_collection_detail\nDeleteCollectionRequest,delete_collection_request\nDeleteCollectionResponse,delete_collection_response\nDeleteCollectorRequest,delete_collector_request\nDeleteColumnStatisticsForPartitionRequest,delete_column_statistics_for_partition_request\nDeleteColumnStatisticsForTableRequest,delete_column_statistics_for_table_request\nDeleteCommentContentInput,delete_comment_content_input\nDeleteCommentContentOutput,delete_comment_content_output\nDeleteCommentRequest,delete_comment_request\nDeleteComponentInput,delete_component_input\nDeleteComponentOutput,delete_component_output\nDeleteComponentRequest,delete_component_request\nDeleteComponentResponse,delete_component_response\nDeleteComponentTypeRequest,delete_component_type_request\nDeleteComponentTypeResponse,delete_component_type_response\nDeleteComputeEnvironmentRequest,delete_compute_environment_request\nDeleteConditionalForwarderRequest,delete_conditional_forwarder_request\nDeleteConferenceProviderRequest,delete_conference_provider_request\nDeleteConfigRequest,delete_config_request\nDeleteConfigRuleRequest,delete_config_rule_request\nDeleteConfigurationAggregatorRequest,delete_configuration_aggregator_request\nDeleteConfigurationProfileRequest,delete_configuration_profile_request\nDeleteConfigurationRecorderRequest,delete_configuration_recorder_request\nDeleteConfigurationRequest,delete_configuration_request\nDeleteConfigurationResponse,delete_configuration_response\nDeleteConfigurationSetEventDestinationRequest,delete_configuration_set_event_destination_request\nDeleteConfigurationSetRequest,delete_configuration_set_request\nDeleteConfigurationSetResult,delete_configuration_set_result\nDeleteConfigurationSetTrackingOptionsRequest,delete_configuration_set_tracking_options_request\nDeleteConfigurationTemplateMessage,delete_configuration_template_message\nDeleteConfiguredTableAnalysisRuleInput,delete_configured_table_analysis_rule_input\nDeleteConfiguredTableAssociationInput,delete_configured_table_association_input\nDeleteConfiguredTableInput,delete_configured_table_input\nDeleteConflictException,delete_conflict_exception\nDeleteConformancePackRequest,delete_conformance_pack_request\nDeleteConnectClientAddInRequest,delete_connect_client_add_in_request\nDeleteConnectInstanceConfigRequest,delete_connect_instance_config_request\nDeleteConnectPeerRequest,delete_connect_peer_request\nDeleteConnectPeerResponse,delete_connect_peer_response\nDeleteConnectionAliasRequest,delete_connection_alias_request\nDeleteConnectionInput,delete_connection_input\nDeleteConnectionMessage,delete_connection_message\nDeleteConnectionRequest,delete_connection_request\nDeleteConnectionResponse,delete_connection_response\nDeleteConnectorDefinitionRequest,delete_connector_definition_request\nDeleteConnectorProfileRequest,delete_connector_profile_request\nDeleteConnectorRequest,delete_connector_request\nDeleteConnectorResponse,delete_connector_response\nDeleteConstraintInput,delete_constraint_input\nDeleteContactChannelRequest,delete_contact_channel_request\nDeleteContactEvaluationRequest,delete_contact_evaluation_request\nDeleteContactFlowModuleRequest,delete_contact_flow_module_request\nDeleteContactFlowRequest,delete_contact_flow_request\nDeleteContactListRequest,delete_contact_list_request\nDeleteContactMethodRequest,delete_contact_method_request\nDeleteContactMethodResult,delete_contact_method_result\nDeleteContactRequest,delete_contact_request\nDeleteContainerImageRequest,delete_container_image_request\nDeleteContainerInput,delete_container_input\nDeleteContainerPolicyInput,delete_container_policy_input\nDeleteContainerRecipeRequest,delete_container_recipe_request\nDeleteContainerRecipeResponse,delete_container_recipe_response\nDeleteContainerServiceRequest,delete_container_service_request\nDeleteContentRequest,delete_content_request\nDeleteContextRequest,delete_context_request\nDeleteContextResponse,delete_context_response\nDeleteContinuousDeploymentPolicyRequest,delete_continuous_deployment_policy_request\nDeleteControlPanelRequest,delete_control_panel_request\nDeleteControlRequest,delete_control_request\nDeleteCoreDefinitionRequest,delete_core_definition_request\nDeleteCoreDeviceRequest,delete_core_device_request\nDeleteCoreNetworkPolicyVersionRequest,delete_core_network_policy_version_request\nDeleteCoreNetworkPolicyVersionResponse,delete_core_network_policy_version_response\nDeleteCoreNetworkRequest,delete_core_network_request\nDeleteCoreNetworkResponse,delete_core_network_response\nDeleteCorsConfigurationRequest,delete_cors_configuration_request\nDeleteCorsPolicyInput,delete_cors_policy_input\nDeleteCostCategoryDefinitionRequest,delete_cost_category_definition_request\nDeleteCostCategoryDefinitionResponse,delete_cost_category_definition_response\nDeleteCrawlerRequest,delete_crawler_request\nDeleteCrossAccountAuthorizationRequest,delete_cross_account_authorization_request\nDeleteCustomActionTypeInput,delete_custom_action_type_input\nDeleteCustomDBEngineVersionMessage,delete_custom_db_engine_version_message\nDeleteCustomDataIdentifierRequest,delete_custom_data_identifier_request\nDeleteCustomDomainAssociationMessage,delete_custom_domain_association_message\nDeleteCustomEntityTypeRequest,delete_custom_entity_type_request\nDeleteCustomEntityTypeResponse,delete_custom_entity_type_response\nDeleteCustomKeyStoreRequest,delete_custom_key_store_request\nDeleteCustomLineItemInput,delete_custom_line_item_input\nDeleteCustomLineItemOutput,delete_custom_line_item_output\nDeleteCustomLogSourceRequest,delete_custom_log_source_request\nDeleteCustomMetadataRequest,delete_custom_metadata_request\nDeleteCustomMetricRequest,delete_custom_metric_request\nDeleteCustomModelRequest,delete_custom_model_request\nDeleteCustomPluginRequest,delete_custom_plugin_request\nDeleteCustomPluginResponse,delete_custom_plugin_response\nDeleteCustomRoutingAcceleratorRequest,delete_custom_routing_accelerator_request\nDeleteCustomRoutingEndpointGroupRequest,delete_custom_routing_endpoint_group_request\nDeleteCustomRoutingListenerRequest,delete_custom_routing_listener_request\nDeleteCustomVerificationEmailTemplateRequest,delete_custom_verification_email_template_request\nDeleteCustomVocabularyRequest,delete_custom_vocabulary_request\nDeleteCustomVocabularyResponse,delete_custom_vocabulary_response\nDeleteCustomerGatewayRequest,delete_customer_gateway_request\nDeleteDBClusterAutomatedBackupMessage,delete_db_cluster_automated_backup_message\nDeleteDBClusterAutomatedBackupResult,delete_db_cluster_automated_backup_result\nDeleteDBClusterEndpointMessage,delete_db_cluster_endpoint_message\nDeleteDBClusterEndpointOutput,delete_db_cluster_endpoint_output\nDeleteDBClusterMessage,delete_db_cluster_message\nDeleteDBClusterParameterGroupMessage,delete_db_cluster_parameter_group_message\nDeleteDBClusterResult,delete_db_cluster_result\nDeleteDBClusterSnapshotMessage,delete_db_cluster_snapshot_message\nDeleteDBClusterSnapshotResult,delete_db_cluster_snapshot_result\nDeleteDBInstanceAutomatedBackupMessage,delete_db_instance_automated_backup_message\nDeleteDBInstanceAutomatedBackupResult,delete_db_instance_automated_backup_result\nDeleteDBInstanceMessage,delete_db_instance_message\nDeleteDBInstanceResult,delete_db_instance_result\nDeleteDBParameterGroupMessage,delete_db_parameter_group_message\nDeleteDBProxyEndpointRequest,delete_db_proxy_endpoint_request\nDeleteDBProxyEndpointResponse,delete_db_proxy_endpoint_response\nDeleteDBProxyRequest,delete_db_proxy_request\nDeleteDBProxyResponse,delete_db_proxy_response\nDeleteDBSecurityGroupMessage,delete_db_security_group_message\nDeleteDBSnapshotMessage,delete_db_snapshot_message\nDeleteDBSnapshotResult,delete_db_snapshot_result\nDeleteDBSubnetGroupMessage,delete_db_subnet_group_message\nDeleteDashboardRequest,delete_dashboard_request\nDeleteDashboardResponse,delete_dashboard_response\nDeleteDashboardsInput,delete_dashboards_input\nDeleteDataCatalogInput,delete_data_catalog_input\nDeleteDataCellsFilterRequest,delete_data_cells_filter_request\nDeleteDataInFileSystem,delete_data_in_file_system\nDeleteDataIntegrationRequest,delete_data_integration_request\nDeleteDataLakeOrganizationConfigurationRequest,delete_data_lake_organization_configuration_request\nDeleteDataLakeRequest,delete_data_lake_request\nDeleteDataProtectionPolicyRequest,delete_data_protection_policy_request\nDeleteDataProviderMessage,delete_data_provider_message\nDeleteDataProviderResponse,delete_data_provider_response\nDeleteDataQualityJobDefinitionRequest,delete_data_quality_job_definition_request\nDeleteDataQualityRulesetRequest,delete_data_quality_ruleset_request\nDeleteDataRepositoryAssociationRequest,delete_data_repository_association_request\nDeleteDataRepositoryAssociationResponse,delete_data_repository_association_response\nDeleteDataSetRefreshPropertiesRequest,delete_data_set_refresh_properties_request\nDeleteDataSetRefreshPropertiesResponse,delete_data_set_refresh_properties_response\nDeleteDataSetRequest,delete_data_set_request\nDeleteDataSetResponse,delete_data_set_response\nDeleteDataSourceInput,delete_data_source_input\nDeleteDataSourceOutput,delete_data_source_output\nDeleteDataSourceRequest,delete_data_source_request\nDeleteDataSourceResponse,delete_data_source_response\nDeleteDatabaseRequest,delete_database_request\nDeleteDataflowEndpointGroupRequest,delete_dataflow_endpoint_group_request\nDeleteDatasetContentRequest,delete_dataset_content_request\nDeleteDatasetGroupRequest,delete_dataset_group_request\nDeleteDatasetImportJobRequest,delete_dataset_import_job_request\nDeleteDatasetRequest,delete_dataset_request\nDeleteDatasetResponse,delete_dataset_response\nDeleteDatastoreRequest,delete_datastore_request\nDeleteDatastoreResponse,delete_datastore_response\nDeleteDecoderManifestRequest,delete_decoder_manifest_request\nDeleteDecoderManifestResponse,delete_decoder_manifest_response\nDeleteDedicatedIpPoolRequest,delete_dedicated_ip_pool_request\nDeleteDefaultMessageTypeRequest,delete_default_message_type_request\nDeleteDefaultMessageTypeResult,delete_default_message_type_result\nDeleteDefaultSenderIdRequest,delete_default_sender_id_request\nDeleteDefaultSenderIdResult,delete_default_sender_id_result\nDeleteDeliveryChannelRequest,delete_delivery_channel_request\nDeleteDeliveryStreamInput,delete_delivery_stream_input\nDeleteDeploymentConfigInput,delete_deployment_config_input\nDeleteDeploymentGroupInput,delete_deployment_group_input\nDeleteDeploymentGroupOutput,delete_deployment_group_output\nDeleteDeploymentInput,delete_deployment_input\nDeleteDeploymentOutput,delete_deployment_output\nDeleteDeploymentRequest,delete_deployment_request\nDeleteDeploymentStrategyRequest,delete_deployment_strategy_request\nDeleteDestinationRequest,delete_destination_request\nDeleteDetectorModelRequest,delete_detector_model_request\nDeleteDetectorRequest,delete_detector_request\nDeleteDetectorVersionRequest,delete_detector_version_request\nDeleteDevEndpointRequest,delete_dev_endpoint_request\nDeleteDevEnvironmentRequest,delete_dev_environment_request\nDeleteDevEnvironmentResponse,delete_dev_environment_response\nDeleteDeviceDefinitionRequest,delete_device_definition_request\nDeleteDeviceFleetRequest,delete_device_fleet_request\nDeleteDevicePoolRequest,delete_device_pool_request\nDeleteDeviceProfileRequest,delete_device_profile_request\nDeleteDeviceRequest,delete_device_request\nDeleteDeviceResponse,delete_device_response\nDeleteDeviceUsageDataRequest,delete_device_usage_data_request\nDeleteDhcpOptionsRequest,delete_dhcp_options_request\nDeleteDimensionRequest,delete_dimension_request\nDeleteDirectConnectGatewayAssociationProposalRequest,delete_direct_connect_gateway_association_proposal_request\nDeleteDirectConnectGatewayAssociationProposalResult,delete_direct_connect_gateway_association_proposal_result\nDeleteDirectConnectGatewayAssociationRequest,delete_direct_connect_gateway_association_request\nDeleteDirectConnectGatewayAssociationResult,delete_direct_connect_gateway_association_result\nDeleteDirectConnectGatewayRequest,delete_direct_connect_gateway_request\nDeleteDirectConnectGatewayResult,delete_direct_connect_gateway_result\nDeleteDirectory,delete_directory\nDeleteDirectoryConfigRequest,delete_directory_config_request\nDeleteDirectoryRegistrationRequest,delete_directory_registration_request\nDeleteDirectoryRequest,delete_directory_request\nDeleteDirectoryResponse,delete_directory_response\nDeleteDirectoryResult,delete_directory_result\nDeleteDiscovererRequest,delete_discoverer_request\nDeleteDiskRequest,delete_disk_request\nDeleteDiskResult,delete_disk_result\nDeleteDiskSnapshotRequest,delete_disk_snapshot_request\nDeleteDiskSnapshotResult,delete_disk_snapshot_result\nDeleteDistributionConfigurationRequest,delete_distribution_configuration_request\nDeleteDistributionConfigurationResponse,delete_distribution_configuration_response\nDeleteDistributionRequest,delete_distribution_request\nDeleteDistributionResult,delete_distribution_result\nDeleteDocumentClassifierRequest,delete_document_classifier_request\nDeleteDocumentRequest,delete_document_request\nDeleteDocumentVersionRequest,delete_document_version_request\nDeleteDocumentationPartRequest,delete_documentation_part_request\nDeleteDocumentationVersionRequest,delete_documentation_version_request\nDeleteDomainAssociationRequest,delete_domain_association_request\nDeleteDomainAssociationResult,delete_domain_association_result\nDeleteDomainConfigurationRequest,delete_domain_configuration_request\nDeleteDomainEntryRequest,delete_domain_entry_request\nDeleteDomainEntryResult,delete_domain_entry_result\nDeleteDomainNameRequest,delete_domain_name_request\nDeleteDomainPermissionsPolicyRequest,delete_domain_permissions_policy_request\nDeleteDomainPermissionsPolicyResult,delete_domain_permissions_policy_result\nDeleteDomainRequest,delete_domain_request\nDeleteDomainResponse,delete_domain_response\nDeleteDomainResult,delete_domain_result\nDeleteDynamicThingGroupRequest,delete_dynamic_thing_group_request\nDeleteEarthObservationJobInput,delete_earth_observation_job_input\nDeleteEdgeConfigurationInput,delete_edge_configuration_input\nDeleteEdgeDeploymentPlanRequest,delete_edge_deployment_plan_request\nDeleteEdgeDeploymentStageRequest,delete_edge_deployment_stage_request\nDeleteEgressOnlyInternetGatewayRequest,delete_egress_only_internet_gateway_request\nDeleteEgressOnlyInternetGatewayResult,delete_egress_only_internet_gateway_result\nDeleteElasticIp,delete_elastic_ip\nDeleteElasticsearchDomainRequest,delete_elasticsearch_domain_request\nDeleteElasticsearchDomainResponse,delete_elasticsearch_domain_response\nDeleteEmailChannelRequest,delete_email_channel_request\nDeleteEmailChannelResponse,delete_email_channel_response\nDeleteEmailIdentityPolicyRequest,delete_email_identity_policy_request\nDeleteEmailIdentityRequest,delete_email_identity_request\nDeleteEmailMonitoringConfigurationRequest,delete_email_monitoring_configuration_request\nDeleteEmailTemplateRequest,delete_email_template_request\nDeleteEmailTemplateResponse,delete_email_template_response\nDeleteEndpointAccessMessage,delete_endpoint_access_message\nDeleteEndpointAccessRequest,delete_endpoint_access_request\nDeleteEndpointAccessResponse,delete_endpoint_access_response\nDeleteEndpointConfigInput,delete_endpoint_config_input\nDeleteEndpointGroupRequest,delete_endpoint_group_request\nDeleteEndpointInput,delete_endpoint_input\nDeleteEndpointMessage,delete_endpoint_message\nDeleteEndpointRequest,delete_endpoint_request\nDeleteEndpointResponse,delete_endpoint_response\nDeleteEntitlementRequest,delete_entitlement_request\nDeleteEntityRecognizerRequest,delete_entity_recognizer_request\nDeleteEntityRequest,delete_entity_request\nDeleteEntityResponse,delete_entity_response\nDeleteEntityTypeRequest,delete_entity_type_request\nDeleteEnvironmentAccountConnectionInput,delete_environment_account_connection_input\nDeleteEnvironmentAccountConnectionOutput,delete_environment_account_connection_output\nDeleteEnvironmentConfigurationMessage,delete_environment_configuration_message\nDeleteEnvironmentInput,delete_environment_input\nDeleteEnvironmentMembershipRequest,delete_environment_membership_request\nDeleteEnvironmentOutput,delete_environment_output\nDeleteEnvironmentRequest,delete_environment_request\nDeleteEnvironmentResponse,delete_environment_response\nDeleteEnvironmentTemplateInput,delete_environment_template_input\nDeleteEnvironmentTemplateOutput,delete_environment_template_output\nDeleteEnvironmentTemplateVersionInput,delete_environment_template_version_input\nDeleteEnvironmentTemplateVersionOutput,delete_environment_template_version_output\nDeleteEphemerisRequest,delete_ephemeris_request\nDeleteEvaluationFormRequest,delete_evaluation_form_request\nDeleteEvaluationInput,delete_evaluation_input\nDeleteEvaluationOutput,delete_evaluation_output\nDeleteEvaluationResultsRequest,delete_evaluation_results_request\nDeleteEventActionRequest,delete_event_action_request\nDeleteEventBusRequest,delete_event_bus_request\nDeleteEventDataStoreRequest,delete_event_data_store_request\nDeleteEventDestinationRequest,delete_event_destination_request\nDeleteEventDestinationResult,delete_event_destination_result\nDeleteEventIntegrationRequest,delete_event_integration_request\nDeleteEventRequest,delete_event_request\nDeleteEventSourceMappingRequest,delete_event_source_mapping_request\nDeleteEventStreamRequest,delete_event_stream_request\nDeleteEventStreamResponse,delete_event_stream_response\nDeleteEventSubscriptionMessage,delete_event_subscription_message\nDeleteEventSubscriptionResponse,delete_event_subscription_response\nDeleteEventSubscriptionResult,delete_event_subscription_result\nDeleteEventTrackerRequest,delete_event_tracker_request\nDeleteEventTypeRequest,delete_event_type_request\nDeleteEventsByEventTypeRequest,delete_events_by_event_type_request\nDeleteEventsByEventTypeResult,delete_events_by_event_type_result\nDeleteEventsConfigurationRequest,delete_events_configuration_request\nDeleteExperienceRequest,delete_experience_request\nDeleteExperimentRequest,delete_experiment_request\nDeleteExperimentResponse,delete_experiment_response\nDeleteExperimentTemplateRequest,delete_experiment_template_request\nDeleteExperimentTemplateResponse,delete_experiment_template_response\nDeleteExplainabilityExportRequest,delete_explainability_export_request\nDeleteExplainabilityRequest,delete_explainability_request\nDeleteExportRequest,delete_export_request\nDeleteExportResponse,delete_export_response\nDeleteExpressionRequest,delete_expression_request\nDeleteExpressionResponse,delete_expression_response\nDeleteExtensionAssociationRequest,delete_extension_association_request\nDeleteExtensionRequest,delete_extension_request\nDeleteExternalModelRequest,delete_external_model_request\nDeleteFHIRDatastoreRequest,delete_fhir_datastore_request\nDeleteFHIRDatastoreResponse,delete_fhir_datastore_response\nDeleteFacesRequest,delete_faces_request\nDeleteFacesResponse,delete_faces_response\nDeleteFacetRequest,delete_facet_request\nDeleteFaqRequest,delete_faq_request\nDeleteFargateProfileRequest,delete_fargate_profile_request\nDeleteFargateProfileResponse,delete_fargate_profile_response\nDeleteFeatureGroupRequest,delete_feature_group_request\nDeleteFeatureRequest,delete_feature_request\nDeleteFieldLevelEncryptionConfigRequest,delete_field_level_encryption_config_request\nDeleteFieldLevelEncryptionProfileRequest,delete_field_level_encryption_profile_request\nDeleteFileCacheRequest,delete_file_cache_request\nDeleteFileCacheResponse,delete_file_cache_response\nDeleteFileEntry,delete_file_entry\nDeleteFileInput,delete_file_input\nDeleteFileOutput,delete_file_output\nDeleteFileShareInput,delete_file_share_input\nDeleteFileShareOutput,delete_file_share_output\nDeleteFileSystemLustreConfiguration,delete_file_system_lustre_configuration\nDeleteFileSystemLustreResponse,delete_file_system_lustre_response\nDeleteFileSystemOpenZFSConfiguration,delete_file_system_open_zfs_configuration\nDeleteFileSystemOpenZFSResponse,delete_file_system_open_zfs_response\nDeleteFileSystemPolicyRequest,delete_file_system_policy_request\nDeleteFileSystemRequest,delete_file_system_request\nDeleteFileSystemResponse,delete_file_system_response\nDeleteFileSystemWindowsConfiguration,delete_file_system_windows_configuration\nDeleteFileSystemWindowsResponse,delete_file_system_windows_response\nDeleteFilterRequest,delete_filter_request\nDeleteFilterResponse,delete_filter_response\nDeleteFindingAggregatorRequest,delete_finding_aggregator_request\nDeleteFindingsFilterRequest,delete_findings_filter_request\nDeleteFirewallDomainListRequest,delete_firewall_domain_list_request\nDeleteFirewallDomainListResponse,delete_firewall_domain_list_response\nDeleteFirewallManagerRuleGroupsRequest,delete_firewall_manager_rule_groups_request\nDeleteFirewallManagerRuleGroupsResponse,delete_firewall_manager_rule_groups_response\nDeleteFirewallPolicyRequest,delete_firewall_policy_request\nDeleteFirewallPolicyResponse,delete_firewall_policy_response\nDeleteFirewallRequest,delete_firewall_request\nDeleteFirewallResponse,delete_firewall_response\nDeleteFirewallRuleGroupRequest,delete_firewall_rule_group_request\nDeleteFirewallRuleGroupResponse,delete_firewall_rule_group_response\nDeleteFirewallRuleRequest,delete_firewall_rule_request\nDeleteFirewallRuleResponse,delete_firewall_rule_response\nDeleteFleetAdvisorDatabasesRequest,delete_fleet_advisor_databases_request\nDeleteFleetAdvisorDatabasesResponse,delete_fleet_advisor_databases_response\nDeleteFleetError,delete_fleet_error\nDeleteFleetErrorItem,delete_fleet_error_item\nDeleteFleetInput,delete_fleet_input\nDeleteFleetLocationsInput,delete_fleet_locations_input\nDeleteFleetLocationsOutput,delete_fleet_locations_output\nDeleteFleetMetricRequest,delete_fleet_metric_request\nDeleteFleetRequest,delete_fleet_request\nDeleteFleetResponse,delete_fleet_response\nDeleteFleetSuccessItem,delete_fleet_success_item\nDeleteFleetsRequest,delete_fleets_request\nDeleteFleetsResult,delete_fleets_result\nDeleteFlowDefinitionRequest,delete_flow_definition_request\nDeleteFlowLogsRequest,delete_flow_logs_request\nDeleteFlowLogsResult,delete_flow_logs_result\nDeleteFlowRequest,delete_flow_request\nDeleteFlowResponse,delete_flow_response\nDeleteFlowTemplateRequest,delete_flow_template_request\nDeleteFlywheelRequest,delete_flywheel_request\nDeleteFolderContentsRequest,delete_folder_contents_request\nDeleteFolderMembershipRequest,delete_folder_membership_request\nDeleteFolderMembershipResponse,delete_folder_membership_response\nDeleteFolderRequest,delete_folder_request\nDeleteFolderResponse,delete_folder_response\nDeleteForecastExportJobRequest,delete_forecast_export_job_request\nDeleteForecastRequest,delete_forecast_request\nDeleteFormRequest,delete_form_request\nDeleteFpgaImageRequest,delete_fpga_image_request\nDeleteFpgaImageResult,delete_fpga_image_result\nDeleteFrameworkInput,delete_framework_input\nDeleteFraudsterRequest,delete_fraudster_request\nDeleteFunctionCodeSigningConfigRequest,delete_function_code_signing_config_request\nDeleteFunctionConcurrencyRequest,delete_function_concurrency_request\nDeleteFunctionDefinitionRequest,delete_function_definition_request\nDeleteFunctionEventInvokeConfigRequest,delete_function_event_invoke_config_request\nDeleteFunctionRequest,delete_function_request\nDeleteFunctionUrlConfigRequest,delete_function_url_config_request\nDeleteFuotaTaskRequest,delete_fuota_task_request\nDeleteGameRequest,delete_game_request\nDeleteGameServerGroupInput,delete_game_server_group_input\nDeleteGameServerGroupOutput,delete_game_server_group_output\nDeleteGameSessionQueueInput,delete_game_session_queue_input\nDeleteGatewayGroupRequest,delete_gateway_group_request\nDeleteGatewayInput,delete_gateway_input\nDeleteGatewayOutput,delete_gateway_output\nDeleteGatewayRequest,delete_gateway_request\nDeleteGatewayResponse,delete_gateway_response\nDeleteGatewayResponseRequest,delete_gateway_response_request\nDeleteGatewayRouteInput,delete_gateway_route_input\nDeleteGatewayRouteOutput,delete_gateway_route_output\nDeleteGcmChannelRequest,delete_gcm_channel_request\nDeleteGcmChannelResponse,delete_gcm_channel_response\nDeleteGeoMatchSetRequest,delete_geo_match_set_request\nDeleteGeoMatchSetResponse,delete_geo_match_set_response\nDeleteGeofenceCollectionRequest,delete_geofence_collection_request\nDeleteGitHubAccountTokenInput,delete_git_hub_account_token_input\nDeleteGitHubAccountTokenOutput,delete_git_hub_account_token_output\nDeleteGlobalClusterMessage,delete_global_cluster_message\nDeleteGlobalClusterResult,delete_global_cluster_result\nDeleteGlobalNetworkRequest,delete_global_network_request\nDeleteGlobalNetworkResponse,delete_global_network_response\nDeleteGlobalReplicationGroupMessage,delete_global_replication_group_message\nDeleteGlobalReplicationGroupResult,delete_global_replication_group_result\nDeleteGlobalSecondaryIndexAction,delete_global_secondary_index_action\nDeleteGrantRequest,delete_grant_request\nDeleteGrantResponse,delete_grant_response\nDeleteGraphRequest,delete_graph_request\nDeleteGraphqlApiRequest,delete_graphql_api_request\nDeleteGroupInput,delete_group_input\nDeleteGroupMembershipRequest,delete_group_membership_request\nDeleteGroupMembershipResponse,delete_group_membership_response\nDeleteGroupOutput,delete_group_output\nDeleteGroupPolicyRequest,delete_group_policy_request\nDeleteGroupRequest,delete_group_request\nDeleteGroupResponse,delete_group_response\nDeleteHITRequest,delete_hit_request\nDeleteHapgRequest,delete_hapg_request\nDeleteHapgResponse,delete_hapg_response\nDeleteHealthCheckRequest,delete_health_check_request\nDeleteHostInput,delete_host_input\nDeleteHostKeyRequest,delete_host_key_request\nDeleteHostedConfigurationVersionRequest,delete_hosted_configuration_version_request\nDeleteHostedZoneRequest,delete_hosted_zone_request\nDeleteHostedZoneResponse,delete_hosted_zone_response\nDeleteHoursOfOperationRequest,delete_hours_of_operation_request\nDeleteHsmClientCertificateMessage,delete_hsm_client_certificate_message\nDeleteHsmConfigurationMessage,delete_hsm_configuration_message\nDeleteHsmRequest,delete_hsm_request\nDeleteHsmResponse,delete_hsm_response\nDeleteHubContentRequest,delete_hub_content_request\nDeleteHubRequest,delete_hub_request\nDeleteHumanLoopRequest,delete_human_loop_request\nDeleteHumanTaskUiRequest,delete_human_task_ui_request\nDeleteHypervisorInput,delete_hypervisor_input\nDeleteHypervisorOutput,delete_hypervisor_output\nDeleteIAMPolicyAssignmentRequest,delete_iam_policy_assignment_request\nDeleteIAMPolicyAssignmentResponse,delete_iam_policy_assignment_response\nDeleteIPSetRequest,delete_ip_set_request\nDeleteIPSetResponse,delete_ip_set_response\nDeleteIdentitiesInput,delete_identities_input\nDeleteIdentitiesResponse,delete_identities_response\nDeleteIdentityPolicyRequest,delete_identity_policy_request\nDeleteIdentityPoolInput,delete_identity_pool_input\nDeleteIdentityProviderRequest,delete_identity_provider_request\nDeleteIdentityRequest,delete_identity_request\nDeleteIdentitySourceInput,delete_identity_source_input\nDeleteImageBuilderRequest,delete_image_builder_request\nDeleteImageBuilderResult,delete_image_builder_result\nDeleteImagePermissionsRequest,delete_image_permissions_request\nDeleteImagePipelineRequest,delete_image_pipeline_request\nDeleteImagePipelineResponse,delete_image_pipeline_response\nDeleteImageRecipeRequest,delete_image_recipe_request\nDeleteImageRecipeResponse,delete_image_recipe_response\nDeleteImageRequest,delete_image_request\nDeleteImageResponse,delete_image_response\nDeleteImageResult,delete_image_result\nDeleteImageSetRequest,delete_image_set_request\nDeleteImageSetResponse,delete_image_set_response\nDeleteImageVersionRequest,delete_image_version_request\nDeleteImpersonationRoleRequest,delete_impersonation_role_request\nDeleteImportRequest,delete_import_request\nDeleteImportResponse,delete_import_response\nDeleteImportedKeyMaterialRequest,delete_imported_key_material_request\nDeleteInAppTemplateRequest,delete_in_app_template_request\nDeleteInAppTemplateResponse,delete_in_app_template_response\nDeleteInboundConnectionRequest,delete_inbound_connection_request\nDeleteInboundConnectionResponse,delete_inbound_connection_response\nDeleteInboundCrossClusterSearchConnectionRequest,delete_inbound_cross_cluster_search_connection_request\nDeleteInboundCrossClusterSearchConnectionResponse,delete_inbound_cross_cluster_search_connection_response\nDeleteIncidentRecordInput,delete_incident_record_input\nDeleteIndexFieldRequest,delete_index_field_request\nDeleteIndexFieldResponse,delete_index_field_response\nDeleteIndexInput,delete_index_input\nDeleteIndexOutput,delete_index_output\nDeleteIndexRequest,delete_index_request\nDeleteInferenceExperimentRequest,delete_inference_experiment_request\nDeleteInferenceExperimentResponse,delete_inference_experiment_response\nDeleteInferenceSchedulerRequest,delete_inference_scheduler_request\nDeleteInfrastructureConfigurationRequest,delete_infrastructure_configuration_request\nDeleteInfrastructureConfigurationResponse,delete_infrastructure_configuration_response\nDeleteIngestionDestinationRequest,delete_ingestion_destination_request\nDeleteIngestionRequest,delete_ingestion_request\nDeleteInlinePolicyFromPermissionSetRequest,delete_inline_policy_from_permission_set_request\nDeleteInputRequest,delete_input_request\nDeleteInputSecurityGroupRequest,delete_input_security_group_request\nDeleteInsightRequest,delete_insight_request\nDeleteInsightResponse,delete_insight_response\nDeleteInsightRulesInput,delete_insight_rules_input\nDeleteInsightRulesOutput,delete_insight_rules_output\nDeleteInstanceAccessControlAttributeConfigurationRequest,delete_instance_access_control_attribute_configuration_request\nDeleteInstanceConnectEndpointRequest,delete_instance_connect_endpoint_request\nDeleteInstanceConnectEndpointResult,delete_instance_connect_endpoint_result\nDeleteInstanceEventWindowRequest,delete_instance_event_window_request\nDeleteInstanceEventWindowResult,delete_instance_event_window_result\nDeleteInstanceOnboardingJobRequest,delete_instance_onboarding_job_request\nDeleteInstanceProfileMessage,delete_instance_profile_message\nDeleteInstanceProfileRequest,delete_instance_profile_request\nDeleteInstanceProfileResponse,delete_instance_profile_response\nDeleteInstanceRequest,delete_instance_request\nDeleteInstanceResult,delete_instance_result\nDeleteInstanceSnapshotRequest,delete_instance_snapshot_request\nDeleteInstanceSnapshotResult,delete_instance_snapshot_result\nDeleteIntegrationAssociationRequest,delete_integration_association_request\nDeleteIntegrationRequest,delete_integration_request\nDeleteIntegrationResponse,delete_integration_response\nDeleteIntegrationResponseRequest,delete_integration_response_request\nDeleteIntentRequest,delete_intent_request\nDeleteIntentVersionRequest,delete_intent_version_request\nDeleteInterconnectRequest,delete_interconnect_request\nDeleteInterconnectResponse,delete_interconnect_response\nDeleteIntermediateSnaphots,delete_intermediate_snaphots\nDeleteInternetGatewayRequest,delete_internet_gateway_request\nDeleteInventoryRequest,delete_inventory_request\nDeleteInventoryResult,delete_inventory_result\nDeleteInvitationsRequest,delete_invitations_request\nDeleteInvitationsResponse,delete_invitations_response\nDeleteIpAccessSettingsRequest,delete_ip_access_settings_request\nDeleteIpGroupRequest,delete_ip_group_request\nDeleteIpamPoolRequest,delete_ipam_pool_request\nDeleteIpamPoolResult,delete_ipam_pool_result\nDeleteIpamRequest,delete_ipam_request\nDeleteIpamResourceDiscoveryRequest,delete_ipam_resource_discovery_request\nDeleteIpamResourceDiscoveryResult,delete_ipam_resource_discovery_result\nDeleteIpamResult,delete_ipam_result\nDeleteIpamScopeRequest,delete_ipam_scope_request\nDeleteIpamScopeResult,delete_ipam_scope_result\nDeleteItemInput,delete_item_input\nDeleteItemOutput,delete_item_output\nDeleteJobExecutionRequest,delete_job_execution_request\nDeleteJobQueueRequest,delete_job_queue_request\nDeleteJobRequest,delete_job_request\nDeleteJobResponse,delete_job_response\nDeleteJobResult,delete_job_result\nDeleteJobTaggingRequest,delete_job_tagging_request\nDeleteJobTemplateRequest,delete_job_template_request\nDeleteJobTemplateResponse,delete_job_template_response\nDeleteJourneyRequest,delete_journey_request\nDeleteJourneyResponse,delete_journey_response\nDeleteKeyGroupRequest,delete_key_group_request\nDeleteKeyInDays,delete_key_in_days\nDeleteKeyInput,delete_key_input\nDeleteKeyOutput,delete_key_output\nDeleteKeyPairRequest,delete_key_pair_request\nDeleteKeyPairResult,delete_key_pair_result\nDeleteKeyRequest,delete_key_request\nDeleteKeySigningKeyRequest,delete_key_signing_key_request\nDeleteKeySigningKeyResponse,delete_key_signing_key_response\nDeleteKeyspaceRequest,delete_keyspace_request\nDeleteKeywordRequest,delete_keyword_request\nDeleteKeywordResult,delete_keyword_result\nDeleteKnowledgeBaseRequest,delete_knowledge_base_request\nDeleteKnownHostKeysRequest,delete_known_host_keys_request\nDeleteKnownHostKeysResult,delete_known_host_keys_result\nDeleteKxClusterRequest,delete_kx_cluster_request\nDeleteKxDatabaseRequest,delete_kx_database_request\nDeleteKxEnvironmentRequest,delete_kx_environment_request\nDeleteKxUserRequest,delete_kx_user_request\nDeleteLFTagRequest,delete_lf_tag_request\nDeleteLabelGroupRequest,delete_label_group_request\nDeleteLabelRequest,delete_label_request\nDeleteLabelsRequest,delete_labels_request\nDeleteLagRequest,delete_lag_request\nDeleteLakeFormationOptInRequest,delete_lake_formation_opt_in_request\nDeleteLambda,delete_lambda\nDeleteLanguageModelRequest,delete_language_model_request\nDeleteLaunchActionRequest,delete_launch_action_request\nDeleteLaunchConfigurationTemplateRequest,delete_launch_configuration_template_request\nDeleteLaunchProfileMemberRequest,delete_launch_profile_member_request\nDeleteLaunchProfileRequest,delete_launch_profile_request\nDeleteLaunchProfileResponse,delete_launch_profile_response\nDeleteLaunchRequest,delete_launch_request\nDeleteLaunchTemplateRequest,delete_launch_template_request\nDeleteLaunchTemplateResult,delete_launch_template_result\nDeleteLaunchTemplateVersionsRequest,delete_launch_template_versions_request\nDeleteLaunchTemplateVersionsResponseErrorItem,delete_launch_template_versions_response_error_item\nDeleteLaunchTemplateVersionsResponseSuccessItem,delete_launch_template_versions_response_success_item\nDeleteLaunchTemplateVersionsResult,delete_launch_template_versions_result\nDeleteLayerRequest,delete_layer_request\nDeleteLayerVersionRequest,delete_layer_version_request\nDeleteLedgerRequest,delete_ledger_request\nDeleteLensInput,delete_lens_input\nDeleteLensShareInput,delete_lens_share_input\nDeleteLexiconInput,delete_lexicon_input\nDeleteLicenseConfigurationRequest,delete_license_configuration_request\nDeleteLicenseManagerReportGeneratorRequest,delete_license_manager_report_generator_request\nDeleteLicenseRequest,delete_license_request\nDeleteLicenseResponse,delete_license_response\nDeleteLifecycleHookType,delete_lifecycle_hook_type\nDeleteLifecyclePolicyInput,delete_lifecycle_policy_input\nDeleteLifecyclePolicyRequest,delete_lifecycle_policy_request\nDeleteLifecyclePolicyResponse,delete_lifecycle_policy_response\nDeleteLinkInput,delete_link_input\nDeleteLinkRequest,delete_link_request\nDeleteLinkResponse,delete_link_response\nDeleteListRequest,delete_list_request\nDeleteListenerInput,delete_listener_input\nDeleteListenerRequest,delete_listener_request\nDeleteLiveSourceRequest,delete_live_source_request\nDeleteLoadBalancerInput,delete_load_balancer_input\nDeleteLoadBalancerListenerInput,delete_load_balancer_listener_input\nDeleteLoadBalancerPolicyInput,delete_load_balancer_policy_input\nDeleteLoadBalancerRequest,delete_load_balancer_request\nDeleteLoadBalancerResult,delete_load_balancer_result\nDeleteLoadBalancerTlsCertificateRequest,delete_load_balancer_tls_certificate_request\nDeleteLoadBalancerTlsCertificateResult,delete_load_balancer_tls_certificate_result\nDeleteLocalGatewayRouteRequest,delete_local_gateway_route_request\nDeleteLocalGatewayRouteResult,delete_local_gateway_route_result\nDeleteLocalGatewayRouteTableRequest,delete_local_gateway_route_table_request\nDeleteLocalGatewayRouteTableResult,delete_local_gateway_route_table_result\nDeleteLocalGatewayRouteTableVirtualInterfaceGroupAssociationRequest,delete_local_gateway_route_table_virtual_interface_group_association_request\nDeleteLocalGatewayRouteTableVirtualInterfaceGroupAssociationResult,delete_local_gateway_route_table_virtual_interface_group_association_result\nDeleteLocalGatewayRouteTableVpcAssociationRequest,delete_local_gateway_route_table_vpc_association_request\nDeleteLocalGatewayRouteTableVpcAssociationResult,delete_local_gateway_route_table_vpc_association_result\nDeleteLocationInput,delete_location_input\nDeleteLocationRequest,delete_location_request\nDeleteLogGroupRequest,delete_log_group_request\nDeleteLogPatternRequest,delete_log_pattern_request\nDeleteLogStreamRequest,delete_log_stream_request\nDeleteLogSubscriptionRequest,delete_log_subscription_request\nDeleteLoggerDefinitionRequest,delete_logger_definition_request\nDeleteLoggingConfigurationRequest,delete_logging_configuration_request\nDeleteLoginProfileRequest,delete_login_profile_request\nDeleteLunaClientRequest,delete_luna_client_request\nDeleteLunaClientResponse,delete_luna_client_response\nDeleteMLEndpointInput,delete_ml_endpoint_input\nDeleteMLEndpointOutput,delete_ml_endpoint_output\nDeleteMLModelInput,delete_ml_model_input\nDeleteMLModelOutput,delete_ml_model_output\nDeleteMLTransformRequest,delete_ml_transform_request\nDeleteMLTransformResponse,delete_ml_transform_response\nDeleteMailboxPermissionsRequest,delete_mailbox_permissions_request\nDeleteMaintenanceWindowRequest,delete_maintenance_window_request\nDeleteMaintenanceWindowResult,delete_maintenance_window_result\nDeleteManagedEndpointRequest,delete_managed_endpoint_request\nDeleteManagedEndpointResponse,delete_managed_endpoint_response\nDeleteManagedPrefixListRequest,delete_managed_prefix_list_request\nDeleteManagedPrefixListResult,delete_managed_prefix_list_result\nDeleteMapRequest,delete_map_request\nDeleteMarker,delete_marker\nDeleteMarkerEntry,delete_marker_entry\nDeleteMarkerReplication,delete_marker_replication\nDeleteMarkerVersionId,delete_marker_version_id\nDeleteMarkers,delete_markers\nDeleteMatchingWorkflowInput,delete_matching_workflow_input\nDeleteMatchingWorkflowOutput,delete_matching_workflow_output\nDeleteMatchmakingConfigurationInput,delete_matchmaking_configuration_input\nDeleteMatchmakingRuleSetInput,delete_matchmaking_rule_set_input\nDeleteMediaCapturePipelineRequest,delete_media_capture_pipeline_request\nDeleteMediaInsightsPipelineConfigurationRequest,delete_media_insights_pipeline_configuration_request\nDeleteMediaPipelineKinesisVideoStreamPoolRequest,delete_media_pipeline_kinesis_video_stream_pool_request\nDeleteMediaPipelineRequest,delete_media_pipeline_request\nDeleteMedicalTranscriptionJobRequest,delete_medical_transcription_job_request\nDeleteMedicalVocabularyRequest,delete_medical_vocabulary_request\nDeleteMeetingRequest,delete_meeting_request\nDeleteMemberInput,delete_member_input\nDeleteMemberRequest,delete_member_request\nDeleteMembersRequest,delete_members_request\nDeleteMembersResponse,delete_members_response\nDeleteMembershipInput,delete_membership_input\nDeleteMeshInput,delete_mesh_input\nDeleteMeshOutput,delete_mesh_output\nDeleteMessageBatchRequest,delete_message_batch_request\nDeleteMessageBatchRequestEntry,delete_message_batch_request_entry\nDeleteMessageBatchResult,delete_message_batch_result\nDeleteMessageBatchResultEntry,delete_message_batch_result_entry\nDeleteMessageRequest,delete_message_request\nDeleteMessageResponse,delete_message_response\nDeleteMessagingStreamingConfigurationsRequest,delete_messaging_streaming_configurations_request\nDeleteMethodRequest,delete_method_request\nDeleteMethodResponseRequest,delete_method_response_request\nDeleteMetricAttributionRequest,delete_metric_attribution_request\nDeleteMetricFilterRequest,delete_metric_filter_request\nDeleteMetricPolicyInput,delete_metric_policy_input\nDeleteMetricStreamInput,delete_metric_stream_input\nDeleteMigrationProjectMessage,delete_migration_project_message\nDeleteMigrationProjectResponse,delete_migration_project_response\nDeleteMigrationWorkflowRequest,delete_migration_workflow_request\nDeleteMigrationWorkflowResponse,delete_migration_workflow_response\nDeleteMissionProfileRequest,delete_mission_profile_request\nDeleteMitigationActionRequest,delete_mitigation_action_request\nDeleteMobileDeviceAccessOverrideRequest,delete_mobile_device_access_override_request\nDeleteMobileDeviceAccessRuleRequest,delete_mobile_device_access_rule_request\nDeleteModelBiasJobDefinitionRequest,delete_model_bias_job_definition_request\nDeleteModelCardRequest,delete_model_card_request\nDeleteModelExplainabilityJobDefinitionRequest,delete_model_explainability_job_definition_request\nDeleteModelInput,delete_model_input\nDeleteModelManifestRequest,delete_model_manifest_request\nDeleteModelManifestResponse,delete_model_manifest_response\nDeleteModelPackageGroupInput,delete_model_package_group_input\nDeleteModelPackageGroupPolicyInput,delete_model_package_group_policy_input\nDeleteModelPackageInput,delete_model_package_input\nDeleteModelQualityJobDefinitionRequest,delete_model_quality_job_definition_request\nDeleteModelRequest,delete_model_request\nDeleteModelResponse,delete_model_response\nDeleteModelVersionRequest,delete_model_version_request\nDeleteMonitorInput,delete_monitor_input\nDeleteMonitorRequest,delete_monitor_request\nDeleteMonitoringScheduleRequest,delete_monitoring_schedule_request\nDeleteMonitoringSubscriptionRequest,delete_monitoring_subscription_request\nDeleteMountTargetRequest,delete_mount_target_request\nDeleteMultiRegionAccessPointInput,delete_multi_region_access_point_input\nDeleteMultiRegionAccessPointRequest,delete_multi_region_access_point_request\nDeleteMultiRegionAccessPointResult,delete_multi_region_access_point_result\nDeleteMulticastGroupRequest,delete_multicast_group_request\nDeleteMultiplexProgramRequest,delete_multiplex_program_request\nDeleteMultiplexProgramResponse,delete_multiplex_program_response\nDeleteMultiplexRequest,delete_multiplex_request\nDeleteMultiplexResponse,delete_multiplex_response\nDeleteNamedQueryInput,delete_named_query_input\nDeleteNamespaceRequest,delete_namespace_request\nDeleteNamespaceResponse,delete_namespace_response\nDeleteNatGatewayRequest,delete_nat_gateway_request\nDeleteNatGatewayResult,delete_nat_gateway_result\nDeleteNetworkAclEntryRequest,delete_network_acl_entry_request\nDeleteNetworkAclRequest,delete_network_acl_request\nDeleteNetworkAnalyzerConfigurationRequest,delete_network_analyzer_configuration_request\nDeleteNetworkInsightsAccessScopeAnalysisRequest,delete_network_insights_access_scope_analysis_request\nDeleteNetworkInsightsAccessScopeAnalysisResult,delete_network_insights_access_scope_analysis_result\nDeleteNetworkInsightsAccessScopeRequest,delete_network_insights_access_scope_request\nDeleteNetworkInsightsAccessScopeResult,delete_network_insights_access_scope_result\nDeleteNetworkInsightsAnalysisRequest,delete_network_insights_analysis_request\nDeleteNetworkInsightsAnalysisResult,delete_network_insights_analysis_result\nDeleteNetworkInsightsPathRequest,delete_network_insights_path_request\nDeleteNetworkInsightsPathResult,delete_network_insights_path_result\nDeleteNetworkInterfacePermissionRequest,delete_network_interface_permission_request\nDeleteNetworkInterfacePermissionResult,delete_network_interface_permission_result\nDeleteNetworkInterfaceRequest,delete_network_interface_request\nDeleteNetworkProfileRequest,delete_network_profile_request\nDeleteNetworkRequest,delete_network_request\nDeleteNetworkResponse,delete_network_response\nDeleteNetworkSettingsRequest,delete_network_settings_request\nDeleteNetworkSiteRequest,delete_network_site_request\nDeleteNetworkSiteResponse,delete_network_site_response\nDeleteNodeInput,delete_node_input\nDeleteNodegroupRequest,delete_nodegroup_request\nDeleteNodegroupResponse,delete_nodegroup_response\nDeleteNotebookInput,delete_notebook_input\nDeleteNotebookInstanceInput,delete_notebook_instance_input\nDeleteNotebookInstanceLifecycleConfigInput,delete_notebook_instance_lifecycle_config_input\nDeleteNotificationConfigurationType,delete_notification_configuration_type\nDeleteNotificationRequest,delete_notification_request\nDeleteNotificationRuleRequest,delete_notification_rule_request\nDeleteNotificationRuleResult,delete_notification_rule_result\nDeleteNotificationSubscriptionRequest,delete_notification_subscription_request\nDeleteOTAUpdateRequest,delete_ota_update_request\nDeleteObject,delete_object\nDeleteObjectInput,delete_object_input\nDeleteObjectOutput,delete_object_output\nDeleteObjectRequest,delete_object_request\nDeleteObjectTaggingOutput,delete_object_tagging_output\nDeleteObjectTaggingRequest,delete_object_tagging_request\nDeleteObjectsOnCancelRequest,delete_objects_on_cancel_request\nDeleteObjectsOutput,delete_objects_output\nDeleteObjectsRequest,delete_objects_request\nDeleteObservabilityConfigurationRequest,delete_observability_configuration_request\nDeleteObservabilityConfigurationResponse,delete_observability_configuration_response\nDeleteOnTermination,delete_on_termination\nDeleteOpenIDConnectProviderRequest,delete_open_id_connect_provider_request\nDeleteOpsMetadataRequest,delete_ops_metadata_request\nDeleteOptOutListRequest,delete_opt_out_list_request\nDeleteOptOutListResult,delete_opt_out_list_result\nDeleteOptedOutNumberRequest,delete_opted_out_number_request\nDeleteOptedOutNumberResult,delete_opted_out_number_result\nDeleteOption,delete_option\nDeleteOptionGroupMessage,delete_option_group_message\nDeleteOrganizationConfigRuleRequest,delete_organization_config_rule_request\nDeleteOrganizationConformancePackRequest,delete_organization_conformance_pack_request\nDeleteOrganizationRequest,delete_organization_request\nDeleteOrganizationResponse,delete_organization_response\nDeleteOrganizationalUnitRequest,delete_organizational_unit_request\nDeleteOriginAccessControlRequest,delete_origin_access_control_request\nDeleteOriginEndpointPolicyRequest,delete_origin_endpoint_policy_request\nDeleteOriginEndpointRequest,delete_origin_endpoint_request\nDeleteOriginRequestPolicyRequest,delete_origin_request_policy_request\nDeleteOutboundConnectionRequest,delete_outbound_connection_request\nDeleteOutboundConnectionResponse,delete_outbound_connection_response\nDeleteOutboundCrossClusterSearchConnectionRequest,delete_outbound_cross_cluster_search_connection_request\nDeleteOutboundCrossClusterSearchConnectionResponse,delete_outbound_cross_cluster_search_connection_response\nDeleteOutcomeRequest,delete_outcome_request\nDeleteOutpostInput,delete_outpost_input\nDeleteOutpostResolverRequest,delete_outpost_resolver_request\nDeleteOutpostResolverResponse,delete_outpost_resolver_response\nDeletePackageRequest,delete_package_request\nDeletePackageResponse,delete_package_response\nDeletePackageResult,delete_package_result\nDeletePackageVersionRequest,delete_package_version_request\nDeletePackageVersionsRequest,delete_package_versions_request\nDeletePackageVersionsResult,delete_package_versions_result\nDeletePackagingConfigurationRequest,delete_packaging_configuration_request\nDeletePackagingGroupRequest,delete_packaging_group_request\nDeleteParallelDataRequest,delete_parallel_data_request\nDeleteParallelDataResponse,delete_parallel_data_response\nDeleteParameterGroupRequest,delete_parameter_group_request\nDeleteParameterGroupResponse,delete_parameter_group_response\nDeleteParameterRequest,delete_parameter_request\nDeleteParametersRequest,delete_parameters_request\nDeleteParametersResult,delete_parameters_result\nDeletePartitionIndexRequest,delete_partition_index_request\nDeletePartitionRequest,delete_partition_request\nDeletePartnerEventSourceRequest,delete_partner_event_source_request\nDeletePatchBaselineRequest,delete_patch_baseline_request\nDeletePatchBaselineResult,delete_patch_baseline_result\nDeletePeeringRequest,delete_peering_request\nDeletePeeringResponse,delete_peering_response\nDeletePendingAggregationRequestRequest,delete_pending_aggregation_request_request\nDeletePendingTimestamp,delete_pending_timestamp\nDeletePerformanceAnalysisReportRequest,delete_performance_analysis_report_request\nDeletePermissionGroupRequest,delete_permission_group_request\nDeletePermissionGroupResponse,delete_permission_group_response\nDeletePermissionPolicyRequest,delete_permission_policy_request\nDeletePermissionRequest,delete_permission_request\nDeletePermissionResponse,delete_permission_response\nDeletePermissionSetRequest,delete_permission_set_request\nDeletePermissionVersionRequest,delete_permission_version_request\nDeletePermissionVersionResponse,delete_permission_version_response\nDeletePermissionsBoundaryFromPermissionSetRequest,delete_permissions_boundary_from_permission_set_request\nDeletePhoneNumberRequest,delete_phone_number_request\nDeletePipeRequest,delete_pipe_request\nDeletePipeResponse,delete_pipe_response\nDeletePipelineInput,delete_pipeline_input\nDeletePipelineRequest,delete_pipeline_request\nDeletePipelineResponse,delete_pipeline_response\nDeletePlaceIndexRequest,delete_place_index_request\nDeletePlacementGroupRequest,delete_placement_group_request\nDeletePlacementRequest,delete_placement_request\nDeletePlatformApplicationInput,delete_platform_application_input\nDeletePlatformVersionRequest,delete_platform_version_request\nDeletePlatformVersionResult,delete_platform_version_result\nDeletePlaybackConfigurationRequest,delete_playback_configuration_request\nDeletePlaybackKeyPairRequest,delete_playback_key_pair_request\nDeletePolicyInput,delete_policy_input\nDeletePolicyRequest,delete_policy_request\nDeletePolicyStoreInput,delete_policy_store_input\nDeletePolicyTemplateInput,delete_policy_template_input\nDeletePolicyType,delete_policy_type\nDeletePolicyVersionRequest,delete_policy_version_request\nDeletePoolRequest,delete_pool_request\nDeletePoolResult,delete_pool_result\nDeletePortalRequest,delete_portal_request\nDeletePortalResponse,delete_portal_response\nDeletePortfolioInput,delete_portfolio_input\nDeletePortfolioShareInput,delete_portfolio_share_input\nDeletePortfolioShareOutput,delete_portfolio_share_output\nDeletePredictorBacktestExportJobRequest,delete_predictor_backtest_export_job_request\nDeletePredictorRequest,delete_predictor_request\nDeletePrefetchScheduleRequest,delete_prefetch_schedule_request\nDeletePreparedStatementInput,delete_prepared_statement_input\nDeletePresetRequest,delete_preset_request\nDeletePricingPlanInput,delete_pricing_plan_input\nDeletePricingPlanOutput,delete_pricing_plan_output\nDeletePricingRuleInput,delete_pricing_rule_input\nDeletePricingRuleOutput,delete_pricing_rule_output\nDeletePrincipalMappingRequest,delete_principal_mapping_request\nDeletePriorVersions,delete_prior_versions\nDeleteProductInput,delete_product_input\nDeleteProfileInput,delete_profile_input\nDeleteProfileKeyRequest,delete_profile_key_request\nDeleteProfileKeyResponse,delete_profile_key_response\nDeleteProfileObjectRequest,delete_profile_object_request\nDeleteProfileObjectResponse,delete_profile_object_response\nDeleteProfileObjectTypeRequest,delete_profile_object_type_request\nDeleteProfileObjectTypeResponse,delete_profile_object_type_response\nDeleteProfileRequest,delete_profile_request\nDeleteProfileResponse,delete_profile_response\nDeleteProfileShareInput,delete_profile_share_input\nDeleteProfilingGroupRequest,delete_profiling_group_request\nDeleteProgramRequest,delete_program_request\nDeleteProgressUpdateStreamRequest,delete_progress_update_stream_request\nDeleteProjectInput,delete_project_input\nDeleteProjectPolicyRequest,delete_project_policy_request\nDeleteProjectRequest,delete_project_request\nDeleteProjectResponse,delete_project_response\nDeleteProjectResult,delete_project_result\nDeleteProjectVersionRequest,delete_project_version_request\nDeleteProjectVersionResponse,delete_project_version_response\nDeletePromptRequest,delete_prompt_request\nDeleteProperties,delete_properties\nDeletePropertygraphStatisticsOutput,delete_propertygraph_statistics_output\nDeleteProtection,delete_protection\nDeleteProtectionGroupRequest,delete_protection_group_request\nDeleteProtectionRequest,delete_protection_request\nDeleteProtocolsListRequest,delete_protocols_list_request\nDeleteProvisionedConcurrencyConfigRequest,delete_provisioned_concurrency_config_request\nDeleteProvisionedModelThroughputRequest,delete_provisioned_model_throughput_request\nDeleteProvisionedProductPlanInput,delete_provisioned_product_plan_input\nDeleteProvisioningArtifactInput,delete_provisioning_artifact_input\nDeleteProvisioningTemplateRequest,delete_provisioning_template_request\nDeleteProvisioningTemplateVersionRequest,delete_provisioning_template_version_request\nDeleteProxySessionRequest,delete_proxy_session_request\nDeletePublicAccessBlockRequest,delete_public_access_block_request\nDeletePublicIpv4PoolRequest,delete_public_ipv4_pool_request\nDeletePublicIpv4PoolResult,delete_public_ipv4_pool_result\nDeletePublicKeyRequest,delete_public_key_request\nDeletePublicKeys,delete_public_keys\nDeletePublishingDestinationRequest,delete_publishing_destination_request\nDeletePullRequestApprovalRuleInput,delete_pull_request_approval_rule_input\nDeletePullRequestApprovalRuleOutput,delete_pull_request_approval_rule_output\nDeletePullThroughCacheRuleRequest,delete_pull_through_cache_rule_request\nDeletePullThroughCacheRuleResponse,delete_pull_through_cache_rule_response\nDeletePushTemplateRequest,delete_push_template_request\nDeletePushTemplateResponse,delete_push_template_response\nDeleteQualificationTypeRequest,delete_qualification_type_request\nDeleteQueryDefinitionRequest,delete_query_definition_request\nDeleteQueryDefinitionResponse,delete_query_definition_response\nDeleteQueryLoggingConfigRequest,delete_query_logging_config_request\nDeleteQuerySuggestionsBlockListRequest,delete_query_suggestions_block_list_request\nDeleteQueueRequest,delete_queue_request\nDeleteQueuedMessagesRequest,delete_queued_messages_request\nDeleteQueuedReservedInstancesError,delete_queued_reserved_instances_error\nDeleteQueuedReservedInstancesRequest,delete_queued_reserved_instances_request\nDeleteQueuedReservedInstancesResult,delete_queued_reserved_instances_result\nDeleteQueuedSavingsPlanRequest,delete_queued_savings_plan_request\nDeleteQuickConnectRequest,delete_quick_connect_request\nDeleteRate,delete_rate\nDeleteRateBasedRuleRequest,delete_rate_based_rule_request\nDeleteRateBasedRuleResponse,delete_rate_based_rule_response\nDeleteReadinessCheckRequest,delete_readiness_check_request\nDeleteRealtimeEndpointInput,delete_realtime_endpoint_input\nDeleteRealtimeEndpointOutput,delete_realtime_endpoint_output\nDeleteRealtimeLogConfigRequest,delete_realtime_log_config_request\nDeleteReceiptFilterRequest,delete_receipt_filter_request\nDeleteReceiptRuleRequest,delete_receipt_rule_request\nDeleteReceiptRuleSetRequest,delete_receipt_rule_set_request\nDeleteRecipeVersionRequest,delete_recipe_version_request\nDeleteRecipeVersionResponse,delete_recipe_version_response\nDeleteRecommendationPreferencesRequest,delete_recommendation_preferences_request\nDeleteRecommendationTemplateRequest,delete_recommendation_template_request\nDeleteRecommendationTemplateResponse,delete_recommendation_template_response\nDeleteRecommenderConfigurationRequest,delete_recommender_configuration_request\nDeleteRecommenderConfigurationResponse,delete_recommender_configuration_response\nDeleteRecommenderRequest,delete_recommender_request\nDeleteRecordRequest,delete_record_request\nDeleteRecordingConfigurationRequest,delete_recording_configuration_request\nDeleteRecoveryGroupRequest,delete_recovery_group_request\nDeleteRecoveryInstanceRequest,delete_recovery_instance_request\nDeleteRecoveryPointInput,delete_recovery_point_input\nDeleteReferenceRequest,delete_reference_request\nDeleteReferenceStoreRequest,delete_reference_store_request\nDeleteRefreshScheduleRequest,delete_refresh_schedule_request\nDeleteRefreshScheduleResponse,delete_refresh_schedule_response\nDeleteRegexMatchSetRequest,delete_regex_match_set_request\nDeleteRegexMatchSetResponse,delete_regex_match_set_response\nDeleteRegexPatternSetRequest,delete_regex_pattern_set_request\nDeleteRegexPatternSetResponse,delete_regex_pattern_set_response\nDeleteRegionAction,delete_region_action\nDeleteRegistryInput,delete_registry_input\nDeleteRegistryPolicyResponse,delete_registry_policy_response\nDeleteRegistryRequest,delete_registry_request\nDeleteRegistryResponse,delete_registry_response\nDeleteRelationalDatabaseRequest,delete_relational_database_request\nDeleteRelationalDatabaseResult,delete_relational_database_result\nDeleteRelationalDatabaseSnapshotRequest,delete_relational_database_snapshot_request\nDeleteRelationalDatabaseSnapshotResult,delete_relational_database_snapshot_result\nDeleteRemediationConfigurationRequest,delete_remediation_configuration_request\nDeleteRemediationExceptionsRequest,delete_remediation_exceptions_request\nDeleteRemediationExceptionsResponse,delete_remediation_exceptions_response\nDeleteRemoteAccessSessionRequest,delete_remote_access_session_request\nDeleteReplacedRootVolume,delete_replaced_root_volume\nDeleteReplicaAction,delete_replica_action\nDeleteReplicationConfigMessage,delete_replication_config_message\nDeleteReplicationConfigResponse,delete_replication_config_response\nDeleteReplicationConfigurationRequest,delete_replication_configuration_request\nDeleteReplicationConfigurationTemplateRequest,delete_replication_configuration_template_request\nDeleteReplicationGroupMemberAction,delete_replication_group_member_action\nDeleteReplicationGroupMessage,delete_replication_group_message\nDeleteReplicationGroupResult,delete_replication_group_result\nDeleteReplicationInstanceMessage,delete_replication_instance_message\nDeleteReplicationInstanceResponse,delete_replication_instance_response\nDeleteReplicationJobRequest,delete_replication_job_request\nDeleteReplicationSetInput,delete_replication_set_input\nDeleteReplicationSubnetGroupMessage,delete_replication_subnet_group_message\nDeleteReplicationTaskAssessmentRunMessage,delete_replication_task_assessment_run_message\nDeleteReplicationTaskAssessmentRunResponse,delete_replication_task_assessment_run_response\nDeleteReplicationTaskMessage,delete_replication_task_message\nDeleteReplicationTaskResponse,delete_replication_task_response\nDeleteReportDefinitionRequest,delete_report_definition_request\nDeleteReportDefinitionResponse,delete_report_definition_response\nDeleteReportDefinitionResult,delete_report_definition_result\nDeleteReportGroupInput,delete_report_group_input\nDeleteReportInput,delete_report_input\nDeleteReportPlanInput,delete_report_plan_input\nDeleteRepositoryInput,delete_repository_input\nDeleteRepositoryOutput,delete_repository_output\nDeleteRepositoryPermissionsPolicyRequest,delete_repository_permissions_policy_request\nDeleteRepositoryPermissionsPolicyResult,delete_repository_permissions_policy_result\nDeleteRepositoryPolicyRequest,delete_repository_policy_request\nDeleteRepositoryPolicyResponse,delete_repository_policy_response\nDeleteRepositoryRequest,delete_repository_request\nDeleteRepositoryResponse,delete_repository_response\nDeleteRepositoryResult,delete_repository_result\nDeleteRequest,delete_request\nDeleteRequestValidatorRequest,delete_request_validator_request\nDeleteRescoreExecutionPlanRequest,delete_rescore_execution_plan_request\nDeleteReservationRequest,delete_reservation_request\nDeleteReservationResponse,delete_reservation_response\nDeleteResiliencyPolicyRequest,delete_resiliency_policy_request\nDeleteResiliencyPolicyResponse,delete_resiliency_policy_response\nDeleteResolverEndpointRequest,delete_resolver_endpoint_request\nDeleteResolverEndpointResponse,delete_resolver_endpoint_response\nDeleteResolverQueryLogConfigRequest,delete_resolver_query_log_config_request\nDeleteResolverQueryLogConfigResponse,delete_resolver_query_log_config_response\nDeleteResolverRequest,delete_resolver_request\nDeleteResolverRuleRequest,delete_resolver_rule_request\nDeleteResolverRuleResponse,delete_resolver_rule_response\nDeleteResource,delete_resource\nDeleteResourceConfigRequest,delete_resource_config_request\nDeleteResourceDataSyncRequest,delete_resource_data_sync_request\nDeleteResourceDefinitionRequest,delete_resource_definition_request\nDeleteResourceInput,delete_resource_input\nDeleteResourceOutput,delete_resource_output\nDeleteResourcePermissionInput,delete_resource_permission_input\nDeleteResourcePermissionOutput,delete_resource_permission_output\nDeleteResourcePolicyInput,delete_resource_policy_input\nDeleteResourcePolicyRequest,delete_resource_policy_request\nDeleteResourcePolicyResponse,delete_resource_policy_response\nDeleteResourcePolicyStatementRequest,delete_resource_policy_statement_request\nDeleteResourcePolicyStatementResponse,delete_resource_policy_statement_response\nDeleteResourceRequest,delete_resource_request\nDeleteResourceServerRequest,delete_resource_server_request\nDeleteResourceSetRequest,delete_resource_set_request\nDeleteResourceShareRequest,delete_resource_share_request\nDeleteResourceShareResponse,delete_resource_share_response\nDeleteResourceTreeRequest,delete_resource_tree_request\nDeleteResourcesByExternalIdInput,delete_resources_by_external_id_input\nDeleteResponseHeadersPolicyRequest,delete_response_headers_policy_request\nDeleteResponsePlanInput,delete_response_plan_input\nDeleteRestApiRequest,delete_rest_api_request\nDeleteRetentionConfigurationRequest,delete_retention_configuration_request\nDeleteRetentionPolicyRequest,delete_retention_policy_request\nDeleteRetrainingSchedulerRequest,delete_retraining_scheduler_request\nDeleteReusableDelegationSetRequest,delete_reusable_delegation_set_request\nDeleteRevisionRequest,delete_revision_request\nDeleteRobotApplicationRequest,delete_robot_application_request\nDeleteRobotRequest,delete_robot_request\nDeleteRoleAliasRequest,delete_role_alias_request\nDeleteRolePermissionsBoundaryRequest,delete_role_permissions_boundary_request\nDeleteRolePolicyRequest,delete_role_policy_request\nDeleteRoleRequest,delete_role_request\nDeleteRoomMembershipRequest,delete_room_membership_request\nDeleteRoomRequest,delete_room_request\nDeleteRoomSkillParameterRequest,delete_room_skill_parameter_request\nDeleteRotationOverrideRequest,delete_rotation_override_request\nDeleteRotationRequest,delete_rotation_request\nDeleteRouteCalculatorRequest,delete_route_calculator_request\nDeleteRouteInput,delete_route_input\nDeleteRouteOutput,delete_route_output\nDeleteRouteRequest,delete_route_request\nDeleteRouteRequestParameterRequest,delete_route_request_parameter_request\nDeleteRouteResponse,delete_route_response\nDeleteRouteResponseRequest,delete_route_response_request\nDeleteRouteSettingsRequest,delete_route_settings_request\nDeleteRouteTableRequest,delete_route_table_request\nDeleteRoutingControlRequest,delete_routing_control_request\nDeleteRoutingProfileRequest,delete_routing_profile_request\nDeleteRuleGroupRequest,delete_rule_group_request\nDeleteRuleGroupResponse,delete_rule_group_response\nDeleteRuleGroupsNamespaceRequest,delete_rule_groups_namespace_request\nDeleteRuleInput,delete_rule_input\nDeleteRuleRequest,delete_rule_request\nDeleteRuleResponse,delete_rule_response\nDeleteRulesetRequest,delete_ruleset_request\nDeleteRulesetResponse,delete_ruleset_response\nDeleteRumMetricsDestinationRequest,delete_rum_metrics_destination_request\nDeleteRunGroupRequest,delete_run_group_request\nDeleteRunRequest,delete_run_request\nDeleteSAMLProviderRequest,delete_saml_provider_request\nDeleteSMSSandboxPhoneNumberInput,delete_sms_sandbox_phone_number_input\nDeleteSSHPublicKeyRequest,delete_ssh_public_key_request\nDeleteSafetyRuleRequest,delete_safety_rule_request\nDeleteSamplingRuleRequest,delete_sampling_rule_request\nDeleteSamplingRuleResult,delete_sampling_rule_result\nDeleteScalingPlanRequest,delete_scaling_plan_request\nDeleteScalingPolicyInput,delete_scaling_policy_input\nDeleteScalingPolicyRequest,delete_scaling_policy_request\nDeleteSceneRequest,delete_scene_request\nDeleteScheduleGroupInput,delete_schedule_group_input\nDeleteScheduleInput,delete_schedule_input\nDeleteScheduleRequest,delete_schedule_request\nDeleteScheduleResponse,delete_schedule_response\nDeleteScheduledActionMessage,delete_scheduled_action_message\nDeleteScheduledActionRequest,delete_scheduled_action_request\nDeleteScheduledActionType,delete_scheduled_action_type\nDeleteScheduledAuditRequest,delete_scheduled_audit_request\nDeleteScheduledQueryRequest,delete_scheduled_query_request\nDeleteSchedulingPolicyRequest,delete_scheduling_policy_request\nDeleteSchemaInput,delete_schema_input\nDeleteSchemaMappingInput,delete_schema_mapping_input\nDeleteSchemaMappingOutput,delete_schema_mapping_output\nDeleteSchemaRequest,delete_schema_request\nDeleteSchemaResponse,delete_schema_response\nDeleteSchemaVersionRequest,delete_schema_version_request\nDeleteSchemaVersionsInput,delete_schema_versions_input\nDeleteSchemaVersionsResponse,delete_schema_versions_response\nDeleteScriptInput,delete_script_input\nDeleteSecretRequest,delete_secret_request\nDeleteSecretResponse,delete_secret_response\nDeleteSecurityConfigRequest,delete_security_config_request\nDeleteSecurityConfigurationInput,delete_security_configuration_input\nDeleteSecurityConfigurationRequest,delete_security_configuration_request\nDeleteSecurityGroupRequest,delete_security_group_request\nDeleteSecurityPolicyRequest,delete_security_policy_request\nDeleteSecurityProfileRequest,delete_security_profile_request\nDeleteSegmentRequest,delete_segment_request\nDeleteSegmentResponse,delete_segment_response\nDeleteSequenceStoreRequest,delete_sequence_store_request\nDeleteServerCertificateRequest,delete_server_certificate_request\nDeleteServerRequest,delete_server_request\nDeleteServiceActionInput,delete_service_action_input\nDeleteServiceInput,delete_service_input\nDeleteServiceLinkedRoleRequest,delete_service_linked_role_request\nDeleteServiceLinkedRoleResponse,delete_service_linked_role_response\nDeleteServiceNetworkRequest,delete_service_network_request\nDeleteServiceNetworkServiceAssociationRequest,delete_service_network_service_association_request\nDeleteServiceNetworkServiceAssociationResponse,delete_service_network_service_association_response\nDeleteServiceNetworkVpcAssociationRequest,delete_service_network_vpc_association_request\nDeleteServiceNetworkVpcAssociationResponse,delete_service_network_vpc_association_response\nDeleteServiceOutput,delete_service_output\nDeleteServicePrincipalNameRequest,delete_service_principal_name_request\nDeleteServiceProfileRequest,delete_service_profile_request\nDeleteServiceQuotaIncreaseRequestFromTemplateRequest,delete_service_quota_increase_request_from_template_request\nDeleteServiceRequest,delete_service_request\nDeleteServiceResponse,delete_service_response\nDeleteServiceSpecificCredentialRequest,delete_service_specific_credential_request\nDeleteServiceSyncConfigInput,delete_service_sync_config_input\nDeleteServiceSyncConfigOutput,delete_service_sync_config_output\nDeleteServiceTemplateInput,delete_service_template_input\nDeleteServiceTemplateOutput,delete_service_template_output\nDeleteServiceTemplateVersionInput,delete_service_template_version_input\nDeleteServiceTemplateVersionOutput,delete_service_template_version_output\nDeleteSessionRequest,delete_session_request\nDeleteSessionResponse,delete_session_response\nDeleteShareRequest,delete_share_request\nDeleteShareResponse,delete_share_response\nDeleteSignalCatalogRequest,delete_signal_catalog_request\nDeleteSignalCatalogResponse,delete_signal_catalog_response\nDeleteSignalingChannelInput,delete_signaling_channel_input\nDeleteSigningCertificateRequest,delete_signing_certificate_request\nDeleteSimulationApplicationRequest,delete_simulation_application_request\nDeleteSimulationInput,delete_simulation_input\nDeleteSinkInput,delete_sink_input\nDeleteSipMediaApplicationRequest,delete_sip_media_application_request\nDeleteSipRuleRequest,delete_sip_rule_request\nDeleteSiteInput,delete_site_input\nDeleteSiteRequest,delete_site_request\nDeleteSiteResponse,delete_site_response\nDeleteSizeConstraintSetRequest,delete_size_constraint_set_request\nDeleteSizeConstraintSetResponse,delete_size_constraint_set_response\nDeleteSkillAuthorizationRequest,delete_skill_authorization_request\nDeleteSkillGroupRequest,delete_skill_group_request\nDeleteSlackChannelConfigurationRequest,delete_slack_channel_configuration_request\nDeleteSlackWorkspaceConfigurationRequest,delete_slack_workspace_configuration_request\nDeleteSlotRequest,delete_slot_request\nDeleteSlotTypeRequest,delete_slot_type_request\nDeleteSlotTypeVersionRequest,delete_slot_type_version_request\nDeleteSmsChannelRequest,delete_sms_channel_request\nDeleteSmsChannelResponse,delete_sms_channel_response\nDeleteSmsTemplateRequest,delete_sms_template_request\nDeleteSmsTemplateResponse,delete_sms_template_response\nDeleteSnapshotCopyGrantMessage,delete_snapshot_copy_grant_message\nDeleteSnapshotMessage,delete_snapshot_message\nDeleteSnapshotRequest,delete_snapshot_request\nDeleteSnapshotResponse,delete_snapshot_response\nDeleteSnapshotResult,delete_snapshot_result\nDeleteSnapshotScheduleInput,delete_snapshot_schedule_input\nDeleteSnapshotScheduleMessage,delete_snapshot_schedule_message\nDeleteSnapshotScheduleOutput,delete_snapshot_schedule_output\nDeleteSolFunctionPackageInput,delete_sol_function_package_input\nDeleteSolNetworkInstanceInput,delete_sol_network_instance_input\nDeleteSolNetworkPackageInput,delete_sol_network_package_input\nDeleteSolutionRequest,delete_solution_request\nDeleteSourceBundle,delete_source_bundle\nDeleteSourceCredentialsInput,delete_source_credentials_input\nDeleteSourceCredentialsOutput,delete_source_credentials_output\nDeleteSourceFromS3,delete_source_from_s3\nDeleteSourceLocationRequest,delete_source_location_request\nDeleteSourceNetworkRequest,delete_source_network_request\nDeleteSourceRepositoryRequest,delete_source_repository_request\nDeleteSourceRepositoryResponse,delete_source_repository_response\nDeleteSourceServerRequest,delete_source_server_request\nDeleteSpaceRequest,delete_space_request\nDeleteSpaceResponse,delete_space_response\nDeleteSparqlStatisticsOutput,delete_sparql_statistics_output\nDeleteSpeakerRequest,delete_speaker_request\nDeleteSpotDatafeedSubscriptionRequest,delete_spot_datafeed_subscription_request\nDeleteSqlInjectionMatchSetRequest,delete_sql_injection_match_set_request\nDeleteSqlInjectionMatchSetResponse,delete_sql_injection_match_set_response\nDeleteSshPublicKeyRequest,delete_ssh_public_key_request\nDeleteStackInput,delete_stack_input\nDeleteStackInstancesInput,delete_stack_instances_input\nDeleteStackInstancesOutput,delete_stack_instances_output\nDeleteStackRequest,delete_stack_request\nDeleteStackSetInput,delete_stack_set_input\nDeleteStageRequest,delete_stage_request\nDeleteStateMachineAliasInput,delete_state_machine_alias_input\nDeleteStateMachineInput,delete_state_machine_input\nDeleteStateMachineVersionInput,delete_state_machine_version_input\nDeleteStatisticsValueMap,delete_statistics_value_map\nDeleteStepDetails,delete_step_details\nDeleteStorageConnectors,delete_storage_connectors\nDeleteStorageLensConfigurationRequest,delete_storage_lens_configuration_request\nDeleteStorageLensConfigurationTaggingRequest,delete_storage_lens_configuration_tagging_request\nDeleteStorageVirtualMachineRequest,delete_storage_virtual_machine_request\nDeleteStorageVirtualMachineResponse,delete_storage_virtual_machine_response\nDeleteStoredQueryRequest,delete_stored_query_request\nDeleteStreamInput,delete_stream_input\nDeleteStreamKeyRequest,delete_stream_key_request\nDeleteStreamProcessorRequest,delete_stream_processor_request\nDeleteStreamRequest,delete_stream_request\nDeleteStreamingDistributionRequest,delete_streaming_distribution_request\nDeleteStreamingImageRequest,delete_streaming_image_request\nDeleteStreamingImageResponse,delete_streaming_image_response\nDeleteStreamingSessionRequest,delete_streaming_session_request\nDeleteStreamingSessionResponse,delete_streaming_session_response\nDeleteStudioComponentRequest,delete_studio_component_request\nDeleteStudioComponentResponse,delete_studio_component_response\nDeleteStudioInput,delete_studio_input\nDeleteStudioLifecycleConfigRequest,delete_studio_lifecycle_config_request\nDeleteStudioMemberRequest,delete_studio_member_request\nDeleteStudioRequest,delete_studio_request\nDeleteStudioResponse,delete_studio_response\nDeleteStudioSessionMappingInput,delete_studio_session_mapping_input\nDeleteSubnetCidrReservationRequest,delete_subnet_cidr_reservation_request\nDeleteSubnetCidrReservationResult,delete_subnet_cidr_reservation_result\nDeleteSubnetGroupRequest,delete_subnet_group_request\nDeleteSubnetGroupResponse,delete_subnet_group_response\nDeleteSubnetRequest,delete_subnet_request\nDeleteSubscriberNotificationRequest,delete_subscriber_notification_request\nDeleteSubscriberRequest,delete_subscriber_request\nDeleteSubscriptionDefinitionRequest,delete_subscription_definition_request\nDeleteSubscriptionFilterRequest,delete_subscription_filter_request\nDeleteSuggesterRequest,delete_suggester_request\nDeleteSuggesterResponse,delete_suggester_response\nDeleteSuiteDefinitionRequest,delete_suite_definition_request\nDeleteSuppressedDestinationRequest,delete_suppressed_destination_request\nDeleteSyncJobRequest,delete_sync_job_request\nDeleteSyncJobResponse,delete_sync_job_response\nDeleteSystemInstanceRequest,delete_system_instance_request\nDeleteSystemTemplateRequest,delete_system_template_request\nDeleteTLSInspectionConfigurationRequest,delete_tls_inspection_configuration_request\nDeleteTLSInspectionConfigurationResponse,delete_tls_inspection_configuration_response\nDeleteTableInput,delete_table_input\nDeleteTableOutput,delete_table_output\nDeleteTableRequest,delete_table_request\nDeleteTableVersionRequest,delete_table_version_request\nDeleteTagOptionInput,delete_tag_option_input\nDeleteTagsForDomainRequest,delete_tags_for_domain_request\nDeleteTagsInput,delete_tags_input\nDeleteTagsMessage,delete_tags_message\nDeleteTagsOutput,delete_tags_output\nDeleteTagsRequest,delete_tags_request\nDeleteTagsType,delete_tags_type\nDeleteTapeArchiveInput,delete_tape_archive_input\nDeleteTapeArchiveOutput,delete_tape_archive_output\nDeleteTapeInput,delete_tape_input\nDeleteTapeOutput,delete_tape_output\nDeleteTapePoolInput,delete_tape_pool_input\nDeleteTapePoolOutput,delete_tape_pool_output\nDeleteTarget,delete_target\nDeleteTargetGroupInput,delete_target_group_input\nDeleteTargetGroupRequest,delete_target_group_request\nDeleteTargetGroupResponse,delete_target_group_response\nDeleteTargetRequest,delete_target_request\nDeleteTaskDefinitionsRequest,delete_task_definitions_request\nDeleteTaskDefinitionsResponse,delete_task_definitions_response\nDeleteTaskRequest,delete_task_request\nDeleteTaskSetRequest,delete_task_set_request\nDeleteTaskSetResponse,delete_task_set_response\nDeleteTaskTemplateRequest,delete_task_template_request\nDeleteTemplateAliasRequest,delete_template_alias_request\nDeleteTemplateAliasResponse,delete_template_alias_response\nDeleteTemplateGroupAccessControlEntryRequest,delete_template_group_access_control_entry_request\nDeleteTemplateRequest,delete_template_request\nDeleteTemplateResponse,delete_template_response\nDeleteTemplateSyncConfigInput,delete_template_sync_config_input\nDeleteTemplateSyncConfigOutput,delete_template_sync_config_output\nDeleteTerminologyRequest,delete_terminology_request\nDeleteTestGridProjectRequest,delete_test_grid_project_request\nDeleteTestSetRequest,delete_test_set_request\nDeleteTextMessageSpendLimitOverrideResult,delete_text_message_spend_limit_override_result\nDeleteThemeAliasRequest,delete_theme_alias_request\nDeleteThemeAliasResponse,delete_theme_alias_response\nDeleteThemeRequest,delete_theme_request\nDeleteThemeResponse,delete_theme_response\nDeleteThesaurusRequest,delete_thesaurus_request\nDeleteThingGroupRequest,delete_thing_group_request\nDeleteThingRequest,delete_thing_request\nDeleteThingShadowRequest,delete_thing_shadow_request\nDeleteThingShadowResponse,delete_thing_shadow_response\nDeleteThingTypeRequest,delete_thing_type_request\nDeleteThreatIntelSetRequest,delete_threat_intel_set_request\nDeleteTime,delete_time\nDeleteTimeSeriesRequest,delete_time_series_request\nDeleteTimelineEventInput,delete_timeline_event_input\nDeleteTimestamp,delete_timestamp\nDeleteTokenRequest,delete_token_request\nDeleteTokenResponse,delete_token_response\nDeleteTopicInput,delete_topic_input\nDeleteTopicRefreshScheduleRequest,delete_topic_refresh_schedule_request\nDeleteTopicRefreshScheduleResponse,delete_topic_refresh_schedule_response\nDeleteTopicRequest,delete_topic_request\nDeleteTopicResponse,delete_topic_response\nDeleteTopicRuleDestinationRequest,delete_topic_rule_destination_request\nDeleteTopicRuleRequest,delete_topic_rule_request\nDeleteTrackerRequest,delete_tracker_request\nDeleteTrafficDistributionGroupRequest,delete_traffic_distribution_group_request\nDeleteTrafficMirrorFilterRequest,delete_traffic_mirror_filter_request\nDeleteTrafficMirrorFilterResult,delete_traffic_mirror_filter_result\nDeleteTrafficMirrorFilterRuleRequest,delete_traffic_mirror_filter_rule_request\nDeleteTrafficMirrorFilterRuleResult,delete_traffic_mirror_filter_rule_result\nDeleteTrafficMirrorSessionRequest,delete_traffic_mirror_session_request\nDeleteTrafficMirrorSessionResult,delete_traffic_mirror_session_result\nDeleteTrafficMirrorTargetRequest,delete_traffic_mirror_target_request\nDeleteTrafficMirrorTargetResult,delete_traffic_mirror_target_result\nDeleteTrafficPolicyInstanceRequest,delete_traffic_policy_instance_request\nDeleteTrafficPolicyRequest,delete_traffic_policy_request\nDeleteTrailRequest,delete_trail_request\nDeleteTranscriptionJobRequest,delete_transcription_job_request\nDeleteTransitGatewayConnectPeerRequest,delete_transit_gateway_connect_peer_request\nDeleteTransitGatewayConnectPeerResult,delete_transit_gateway_connect_peer_result\nDeleteTransitGatewayConnectRequest,delete_transit_gateway_connect_request\nDeleteTransitGatewayConnectResult,delete_transit_gateway_connect_result\nDeleteTransitGatewayMulticastDomainRequest,delete_transit_gateway_multicast_domain_request\nDeleteTransitGatewayMulticastDomainResult,delete_transit_gateway_multicast_domain_result\nDeleteTransitGatewayPeeringAttachmentRequest,delete_transit_gateway_peering_attachment_request\nDeleteTransitGatewayPeeringAttachmentResult,delete_transit_gateway_peering_attachment_result\nDeleteTransitGatewayPolicyTableRequest,delete_transit_gateway_policy_table_request\nDeleteTransitGatewayPolicyTableResult,delete_transit_gateway_policy_table_result\nDeleteTransitGatewayPrefixListReferenceRequest,delete_transit_gateway_prefix_list_reference_request\nDeleteTransitGatewayPrefixListReferenceResult,delete_transit_gateway_prefix_list_reference_result\nDeleteTransitGatewayRequest,delete_transit_gateway_request\nDeleteTransitGatewayResult,delete_transit_gateway_result\nDeleteTransitGatewayRouteRequest,delete_transit_gateway_route_request\nDeleteTransitGatewayRouteResult,delete_transit_gateway_route_result\nDeleteTransitGatewayRouteTableAnnouncementRequest,delete_transit_gateway_route_table_announcement_request\nDeleteTransitGatewayRouteTableAnnouncementResult,delete_transit_gateway_route_table_announcement_result\nDeleteTransitGatewayRouteTableRequest,delete_transit_gateway_route_table_request\nDeleteTransitGatewayRouteTableResult,delete_transit_gateway_route_table_result\nDeleteTransitGatewayVpcAttachmentRequest,delete_transit_gateway_vpc_attachment_request\nDeleteTransitGatewayVpcAttachmentResult,delete_transit_gateway_vpc_attachment_result\nDeleteTrialComponentRequest,delete_trial_component_request\nDeleteTrialComponentResponse,delete_trial_component_response\nDeleteTrialRequest,delete_trial_request\nDeleteTrialResponse,delete_trial_response\nDeleteTriggerRequest,delete_trigger_request\nDeleteTriggerResponse,delete_trigger_response\nDeleteTrustRequest,delete_trust_request\nDeleteTrustResult,delete_trust_result\nDeleteTrustStoreRequest,delete_trust_store_request\nDeleteTypeRequest,delete_type_request\nDeleteTypedLinkFacetRequest,delete_typed_link_facet_request\nDeleteUnusedFMManagedResources,delete_unused_fm_managed_resources\nDeleteUploadRequest,delete_upload_request\nDeleteUsageLimitMessage,delete_usage_limit_message\nDeleteUsageLimitRequest,delete_usage_limit_request\nDeleteUsageLimitResponse,delete_usage_limit_response\nDeleteUsagePlanKeyRequest,delete_usage_plan_key_request\nDeleteUsagePlanRequest,delete_usage_plan_request\nDeleteUseCaseRequest,delete_use_case_request\nDeleteUserAccessLoggingSettingsRequest,delete_user_access_logging_settings_request\nDeleteUserAttributesRequest,delete_user_attributes_request\nDeleteUserByPrincipalIdRequest,delete_user_by_principal_id_request\nDeleteUserByPrincipalIdResponse,delete_user_by_principal_id_response\nDeleteUserDefinedFunctionRequest,delete_user_defined_function_request\nDeleteUserEndpointsRequest,delete_user_endpoints_request\nDeleteUserEndpointsResponse,delete_user_endpoints_response\nDeleteUserGroupMessage,delete_user_group_message\nDeleteUserHierarchyGroupRequest,delete_user_hierarchy_group_request\nDeleteUserMessage,delete_user_message\nDeleteUserPermissionsBoundaryRequest,delete_user_permissions_boundary_request\nDeleteUserPolicyRequest,delete_user_policy_request\nDeleteUserPoolClientRequest,delete_user_pool_client_request\nDeleteUserPoolDomainRequest,delete_user_pool_domain_request\nDeleteUserPoolRequest,delete_user_pool_request\nDeleteUserProfileRequest,delete_user_profile_request\nDeleteUserProfileResult,delete_user_profile_result\nDeleteUserRequest,delete_user_request\nDeleteUserResponse,delete_user_response\nDeleteUserSettingsRequest,delete_user_settings_request\nDeleteUtterancesRequest,delete_utterances_request\nDeleteV2LoggingLevelRequest,delete_v2_logging_level_request\nDeleteVPCAssociationAuthorizationRequest,delete_vpc_association_authorization_request\nDeleteVPCConnectionRequest,delete_vpc_connection_request\nDeleteVPCConnectionResponse,delete_vpc_connection_response\nDeleteVPCEConfigurationRequest,delete_vpce_configuration_request\nDeleteVariableRequest,delete_variable_request\nDeleteVariantStoreRequest,delete_variant_store_request\nDeleteVariantStoreResponse,delete_variant_store_response\nDeleteVaultAccessPolicyInput,delete_vault_access_policy_input\nDeleteVaultInput,delete_vault_input\nDeleteVaultNotificationsInput,delete_vault_notifications_input\nDeleteVcenterClientRequest,delete_vcenter_client_request\nDeleteVectorEnrichmentJobInput,delete_vector_enrichment_job_input\nDeleteVehicleRequest,delete_vehicle_request\nDeleteVehicleResponse,delete_vehicle_response\nDeleteVerifiedAccessEndpointRequest,delete_verified_access_endpoint_request\nDeleteVerifiedAccessEndpointResult,delete_verified_access_endpoint_result\nDeleteVerifiedAccessGroupRequest,delete_verified_access_group_request\nDeleteVerifiedAccessGroupResult,delete_verified_access_group_result\nDeleteVerifiedAccessInstanceRequest,delete_verified_access_instance_request\nDeleteVerifiedAccessInstanceResult,delete_verified_access_instance_result\nDeleteVerifiedAccessTrustProviderRequest,delete_verified_access_trust_provider_request\nDeleteVerifiedAccessTrustProviderResult,delete_verified_access_trust_provider_result\nDeleteVerifiedEmailAddressRequest,delete_verified_email_address_request\nDeleteViewInput,delete_view_input\nDeleteViewOutput,delete_view_output\nDeleteViewRequest,delete_view_request\nDeleteViewVersionRequest,delete_view_version_request\nDeleteVirtualClusterRequest,delete_virtual_cluster_request\nDeleteVirtualClusterResponse,delete_virtual_cluster_response\nDeleteVirtualGatewayInput,delete_virtual_gateway_input\nDeleteVirtualGatewayOutput,delete_virtual_gateway_output\nDeleteVirtualInterfaceRequest,delete_virtual_interface_request\nDeleteVirtualInterfaceResponse,delete_virtual_interface_response\nDeleteVirtualMFADeviceRequest,delete_virtual_mfa_device_request\nDeleteVirtualNodeInput,delete_virtual_node_input\nDeleteVirtualNodeOutput,delete_virtual_node_output\nDeleteVirtualRouterInput,delete_virtual_router_input\nDeleteVirtualRouterOutput,delete_virtual_router_output\nDeleteVirtualServiceInput,delete_virtual_service_input\nDeleteVirtualServiceOutput,delete_virtual_service_output\nDeleteVocabularyFilterRequest,delete_vocabulary_filter_request\nDeleteVocabularyRequest,delete_vocabulary_request\nDeleteVocabularyResponse,delete_vocabulary_response\nDeleteVodSourceRequest,delete_vod_source_request\nDeleteVoiceChannelRequest,delete_voice_channel_request\nDeleteVoiceChannelResponse,delete_voice_channel_response\nDeleteVoiceConnectorEmergencyCallingConfigurationRequest,delete_voice_connector_emergency_calling_configuration_request\nDeleteVoiceConnectorGroupRequest,delete_voice_connector_group_request\nDeleteVoiceConnectorOriginationRequest,delete_voice_connector_origination_request\nDeleteVoiceConnectorProxyRequest,delete_voice_connector_proxy_request\nDeleteVoiceConnectorRequest,delete_voice_connector_request\nDeleteVoiceConnectorStreamingConfigurationRequest,delete_voice_connector_streaming_configuration_request\nDeleteVoiceConnectorTerminationCredentialsRequest,delete_voice_connector_termination_credentials_request\nDeleteVoiceConnectorTerminationRequest,delete_voice_connector_termination_request\nDeleteVoiceMessageSpendLimitOverrideResult,delete_voice_message_spend_limit_override_result\nDeleteVoiceProfileDomainRequest,delete_voice_profile_domain_request\nDeleteVoiceProfileRequest,delete_voice_profile_request\nDeleteVoiceTemplateRequest,delete_voice_template_request\nDeleteVoiceTemplateResponse,delete_voice_template_response\nDeleteVolumeInput,delete_volume_input\nDeleteVolumeOntapConfiguration,delete_volume_ontap_configuration\nDeleteVolumeOntapResponse,delete_volume_ontap_response\nDeleteVolumeOpenZFSConfiguration,delete_volume_open_zfs_configuration\nDeleteVolumeOutput,delete_volume_output\nDeleteVolumeRequest,delete_volume_request\nDeleteVolumeResponse,delete_volume_response\nDeleteVolumes,delete_volumes\nDeleteVpcConfig,delete_vpc_config\nDeleteVpcConnectionRequest,delete_vpc_connection_request\nDeleteVpcConnectionResponse,delete_vpc_connection_response\nDeleteVpcConnectorRequest,delete_vpc_connector_request\nDeleteVpcConnectorResponse,delete_vpc_connector_response\nDeleteVpcEndpointConnectionNotificationsRequest,delete_vpc_endpoint_connection_notifications_request\nDeleteVpcEndpointConnectionNotificationsResult,delete_vpc_endpoint_connection_notifications_result\nDeleteVpcEndpointDetail,delete_vpc_endpoint_detail\nDeleteVpcEndpointRequest,delete_vpc_endpoint_request\nDeleteVpcEndpointResponse,delete_vpc_endpoint_response\nDeleteVpcEndpointServiceConfigurationsRequest,delete_vpc_endpoint_service_configurations_request\nDeleteVpcEndpointServiceConfigurationsResult,delete_vpc_endpoint_service_configurations_result\nDeleteVpcEndpointsRequest,delete_vpc_endpoints_request\nDeleteVpcEndpointsResult,delete_vpc_endpoints_result\nDeleteVpcIngressConnectionRequest,delete_vpc_ingress_connection_request\nDeleteVpcIngressConnectionResponse,delete_vpc_ingress_connection_response\nDeleteVpcLinkRequest,delete_vpc_link_request\nDeleteVpcPeeringAuthorizationInput,delete_vpc_peering_authorization_input\nDeleteVpcPeeringConnectionInput,delete_vpc_peering_connection_input\nDeleteVpcPeeringConnectionRequest,delete_vpc_peering_connection_request\nDeleteVpcPeeringConnectionResult,delete_vpc_peering_connection_result\nDeleteVpcRequest,delete_vpc_request\nDeleteVpnConnectionRequest,delete_vpn_connection_request\nDeleteVpnConnectionRouteRequest,delete_vpn_connection_route_request\nDeleteVpnGatewayRequest,delete_vpn_gateway_request\nDeleteWarmPoolType,delete_warm_pool_type\nDeleteWatchlistRequest,delete_watchlist_request\nDeleteWaveRequest,delete_wave_request\nDeleteWebACLRequest,delete_web_acl_request\nDeleteWebACLResponse,delete_web_acl_response\nDeleteWebhookInput,delete_webhook_input\nDeleteWebhookRequest,delete_webhook_request\nDeleteWebhookResult,delete_webhook_result\nDeleteWhatIfAnalysisRequest,delete_what_if_analysis_request\nDeleteWhatIfForecastExportRequest,delete_what_if_forecast_export_request\nDeleteWhatIfForecastRequest,delete_what_if_forecast_request\nDeleteWirelessDeviceImportTaskRequest,delete_wireless_device_import_task_request\nDeleteWirelessDeviceRequest,delete_wireless_device_request\nDeleteWirelessGatewayRequest,delete_wireless_gateway_request\nDeleteWirelessGatewayTaskDefinitionRequest,delete_wireless_gateway_task_definition_request\nDeleteWirelessGatewayTaskRequest,delete_wireless_gateway_task_request\nDeleteWorkGroupInput,delete_work_group_input\nDeleteWorkerBlockRequest,delete_worker_block_request\nDeleteWorkerFleetRequest,delete_worker_fleet_request\nDeleteWorkerRequest,delete_worker_request\nDeleteWorkflowRequest,delete_workflow_request\nDeleteWorkflowResponse,delete_workflow_response\nDeleteWorkflowStepGroupRequest,delete_workflow_step_group_request\nDeleteWorkflowStepRequest,delete_workflow_step_request\nDeleteWorkforceRequest,delete_workforce_request\nDeleteWorkgroupRequest,delete_workgroup_request\nDeleteWorkgroupResponse,delete_workgroup_response\nDeleteWorkloadInput,delete_workload_input\nDeleteWorkloadShareInput,delete_workload_share_input\nDeleteWorkspaceApiKeyRequest,delete_workspace_api_key_request\nDeleteWorkspaceApiKeyResponse,delete_workspace_api_key_response\nDeleteWorkspaceBundleRequest,delete_workspace_bundle_request\nDeleteWorkspaceImageRequest,delete_workspace_image_request\nDeleteWorkspaceRequest,delete_workspace_request\nDeleteWorkspaceResponse,delete_workspace_response\nDeleteWorkteamRequest,delete_workteam_request\nDeleteWorkteamResponse,delete_workteam_response\nDeleteWorldTemplateRequest,delete_world_template_request\nDeleteXssMatchSetRequest,delete_xss_match_set_request\nDeleteXssMatchSetResponse,delete_xss_match_set_response\nDeleted,deleted\nDeletedAt,deleted_at\nDeletedDate,deleted_date\nDeletedFaces,deleted_faces\nDeletedObject,deleted_object\nDeletedParameters,deleted_parameters\nDeletedSubnetCidrReservation,deleted_subnet_cidr_reservation\nDeletes,deletes\nDeletionConfig,deletion_config\nDeletionDate,deletion_date\nDeletionId,deletion_id\nDeletionMessage,deletion_message\nDeletionMode,deletion_mode\nDeletionProtection,deletion_protection\nDeletionProtectionEnabled,deletion_protection_enabled\nDeletionStartTime,deletion_start_time\nDeletionStatus,deletion_status\nDeletionSummary,deletion_summary\nDeletionTaskFailureReasonType,deletion_task_failure_reason_type\nDeletionTaskId,deletion_task_id\nDeletionTime,deletion_time\nDeletionTimestamp,deletion_timestamp\nDelimitedTextImportOptions,delimited_text_import_options\nDelimiter,delimiter\nDeliverConfigSnapshotRequest,deliver_config_snapshot_request\nDeliverConfigSnapshotResponse,deliver_config_snapshot_response\nDeliverCrossAccountRole,deliver_cross_account_role\nDeliverLogsErrorMessage,deliver_logs_error_message\nDeliverLogsPermissionArn,deliver_logs_permission_arn\nDeliverLogsStatus,deliver_logs_status\nDeliverabilityTestReport,deliverability_test_report\nDeliverabilityTestReports,deliverability_test_reports\nDeliverabilityTestStatus,deliverability_test_status\nDeliveredTimestamp,delivered_timestamp\nDeliveryAddress,delivery_address\nDeliveryAttempts,delivery_attempts\nDeliveryChannel,delivery_channel\nDeliveryChannelName,delivery_channel_name\nDeliveryChannelNames,delivery_channel_names\nDeliveryChannelStatus,delivery_channel_status\nDeliveryChannels,delivery_channels\nDeliveryChannelsStatus,delivery_channels_status\nDeliveryMedium,delivery_medium\nDeliveryMethod,delivery_method\nDeliveryOptions,delivery_options\nDeliveryRestrictions,delivery_restrictions\nDeliveryS3Bucket,delivery_s3_bucket\nDeliveryS3KeyPrefix,delivery_s3_key_prefix\nDeliveryS3Uri,delivery_s3_uri\nDeliveryStartTimestamp,delivery_start_timestamp\nDeliveryStatus,delivery_status\nDeliveryStream,delivery_stream\nDeliveryStreamARN,delivery_stream_arn\nDeliveryStreamArn,delivery_stream_arn\nDeliveryStreamDescription,delivery_stream_description\nDeliveryStreamEncryptionConfiguration,delivery_stream_encryption_configuration\nDeliveryStreamEncryptionConfigurationInput,delivery_stream_encryption_configuration_input\nDeliveryStreamName,delivery_stream_name\nDeliveryStreamNames,delivery_stream_names\nDeliveryStreamStatus,delivery_stream_status\nDeliveryStreamType,delivery_stream_type\nDeliveryTime,delivery_time\nDeliveryTimedOutCount,delivery_timed_out_count\nDeliveryTopic,delivery_topic\nDeliveryUri,delivery_uri\nDeltaSyncConfig,delta_sync_config\nDeltaTables,delta_tables\nDeltaTarget,delta_target\nDeltaTargets,delta_targets\nDeltaTime,delta_time\nDeltaTimeSessionWindowConfiguration,delta_time_session_window_configuration\nDemodulationConfig,demodulation_config\nDemographic,demographic\nDenied,denied\nDenoiseFilter,denoise_filter\nDenyAllIgwTraffic,deny_all_igw_traffic\nDenyAllTrafficToEndpoint,deny_all_traffic_to_endpoint\nDenyCustomRoutingTrafficRequest,deny_custom_routing_traffic_request\nDepartNow,depart_now\nDepartment,department\nDeparturePosition,departure_position\nDeparturePositions,departure_positions\nDepartureTime,departure_time\nDependencies,dependencies\nDependencyAccessDeniedException,dependency_access_denied_exception\nDependencyCopyPath,dependency_copy_path\nDependencyException,dependency_exception\nDependencyFailedException,dependency_failed_exception\nDependencyFailureException,dependency_failure_exception\nDependencyOriginPath,dependency_origin_path\nDependencyRevision,dependency_revision\nDependencyThrottleException,dependency_throttle_exception\nDependencyTimeout,dependency_timeout\nDependencyTimeoutException,dependency_timeout_exception\nDependentEntities,dependent_entities\nDependentEntity,dependent_entity\nDependentJobName,dependent_job_name\nDependentResourceIds,dependent_resource_ids\nDependentService,dependent_service\nDependentServiceFailureException,dependent_service_failure_exception\nDependentServiceRequestThrottlingFault,dependent_service_request_throttling_fault\nDependentServiceUnavailableFault,dependent_service_unavailable_fault\nDependentServices,dependent_services\nDependsOn,depends_on\nDeploy,deploy\nDeployAsApplicationConfiguration,deploy_as_application_configuration\nDeployAsApplicationConfigurationDescription,deploy_as_application_configuration_description\nDeployAsApplicationConfigurationUpdate,deploy_as_application_configuration_update\nDeploySystemInstanceRequest,deploy_system_instance_request\nDeploySystemInstanceResponse,deploy_system_instance_response\nDeployed,deployed\nDeployedImage,deployed_image\nDeployedImages,deployed_images\nDeployedStageName,deployed_stage_name\nDeployedVersionSummary,deployed_version_summary\nDeployment,deployment\nDeploymentAction,deployment_action\nDeploymentAlarms,deployment_alarms\nDeploymentAlreadyCompletedException,deployment_already_completed_exception\nDeploymentApplicationConfig,deployment_application_config\nDeploymentArn,deployment_arn\nDeploymentCanarySettings,deployment_canary_settings\nDeploymentCircuitBreaker,deployment_circuit_breaker\nDeploymentCommand,deployment_command\nDeploymentComponentUpdatePolicy,deployment_component_update_policy\nDeploymentConfig,deployment_config\nDeploymentConfigAlreadyExistsException,deployment_config_already_exists_exception\nDeploymentConfigDoesNotExistException,deployment_config_does_not_exist_exception\nDeploymentConfigInUseException,deployment_config_in_use_exception\nDeploymentConfigInfo,deployment_config_info\nDeploymentConfigLimitExceededException,deployment_config_limit_exceeded_exception\nDeploymentConfigNameRequiredException,deployment_config_name_required_exception\nDeploymentConfiguration,deployment_configuration\nDeploymentConfigurationValidationPolicy,deployment_configuration_validation_policy\nDeploymentController,deployment_controller\nDeploymentDoesNotExistException,deployment_does_not_exist_exception\nDeploymentDurationInMinutes,deployment_duration_in_minutes\nDeploymentEndTime,deployment_end_time\nDeploymentEvent,deployment_event\nDeploymentGroupAlreadyExistsException,deployment_group_already_exists_exception\nDeploymentGroupDoesNotExistException,deployment_group_does_not_exist_exception\nDeploymentGroupInfo,deployment_group_info\nDeploymentGroupLimitExceededException,deployment_group_limit_exceeded_exception\nDeploymentGroupNameRequiredException,deployment_group_name_required_exception\nDeploymentId,deployment_id\nDeploymentIdRequiredException,deployment_id_required_exception\nDeploymentIds,deployment_ids\nDeploymentInfo,deployment_info\nDeploymentIoTJobConfiguration,deployment_io_t_job_configuration\nDeploymentIsNotInReadyStateException,deployment_is_not_in_ready_state_exception\nDeploymentJob,deployment_job\nDeploymentLaunchConfig,deployment_launch_config\nDeploymentLimitExceededException,deployment_limit_exceeded_exception\nDeploymentMode,deployment_mode\nDeploymentModel,deployment_model\nDeploymentModels,deployment_models\nDeploymentName,deployment_name\nDeploymentNotStartedException,deployment_not_started_exception\nDeploymentNumber,deployment_number\nDeploymentOption,deployment_option\nDeploymentOverview,deployment_overview\nDeploymentPolicies,deployment_policies\nDeploymentReadyOption,deployment_ready_option\nDeploymentRecommendation,deployment_recommendation\nDeploymentResult,deployment_result\nDeploymentStage,deployment_stage\nDeploymentStageStatusSummary,deployment_stage_status_summary\nDeploymentStartTime,deployment_start_time\nDeploymentState,deployment_state\nDeploymentStatus,deployment_status\nDeploymentStatusMessage,deployment_status_message\nDeploymentStrategies,deployment_strategies\nDeploymentStrategy,deployment_strategy\nDeploymentStrategyId,deployment_strategy_id\nDeploymentStyle,deployment_style\nDeploymentSummary,deployment_summary\nDeploymentTarget,deployment_target\nDeploymentTargetDoesNotExistException,deployment_target_does_not_exist_exception\nDeploymentTargetIdRequiredException,deployment_target_id_required_exception\nDeploymentTargetListSizeExceededException,deployment_target_list_size_exceeded_exception\nDeploymentTargets,deployment_targets\nDeploymentTime,deployment_time\nDeploymentType,deployment_type\nDeployments,deployments\nDeprecateActivityTypeInput,deprecate_activity_type_input\nDeprecateAt,deprecate_at\nDeprecateDomainInput,deprecate_domain_input\nDeprecateFlowTemplateRequest,deprecate_flow_template_request\nDeprecateRule,deprecate_rule\nDeprecateSystemTemplateRequest,deprecate_system_template_request\nDeprecateThingTypeRequest,deprecate_thing_type_request\nDeprecateWorkflowTypeInput,deprecate_workflow_type_input\nDeprecatedStatus,deprecated_status\nDeprecationDate,deprecation_date\nDeprecationTime,deprecation_time\nDeprovisionByoipCidrRequest,deprovision_byoip_cidr_request\nDeprovisionByoipCidrResponse,deprovision_byoip_cidr_response\nDeprovisionByoipCidrResult,deprovision_byoip_cidr_result\nDeprovisionIpamPoolCidrRequest,deprovision_ipam_pool_cidr_request\nDeprovisionIpamPoolCidrResult,deprovision_ipam_pool_cidr_result\nDeprovisionPublicIpv4PoolCidrRequest,deprovision_public_ipv4_pool_cidr_request\nDeprovisionPublicIpv4PoolCidrResult,deprovision_public_ipv4_pool_cidr_result\nDeprovisionedAddresses,deprovisioned_addresses\nDeregisterAccountResponse,deregister_account_response\nDeregisterAppInstanceUserEndpointRequest,deregister_app_instance_user_endpoint_request\nDeregisterApplicationInput,deregister_application_input\nDeregisterCertificateRequest,deregister_certificate_request\nDeregisterClusterRequest,deregister_cluster_request\nDeregisterClusterResponse,deregister_cluster_response\nDeregisterComputeInput,deregister_compute_input\nDeregisterContainerInstanceRequest,deregister_container_instance_request\nDeregisterContainerInstanceResponse,deregister_container_instance_response\nDeregisterDBProxyTargetsRequest,deregister_db_proxy_targets_request\nDeregisterDelegatedAdministratorRequest,deregister_delegated_administrator_request\nDeregisterDevicesRequest,deregister_devices_request\nDeregisterEcsClusterRequest,deregister_ecs_cluster_request\nDeregisterElasticIpRequest,deregister_elastic_ip_request\nDeregisterEndPointsInput,deregister_end_points_input\nDeregisterEndPointsOutput,deregister_end_points_output\nDeregisterEventTopicRequest,deregister_event_topic_request\nDeregisterFromWorkMailRequest,deregister_from_work_mail_request\nDeregisterGameServerInput,deregister_game_server_input\nDeregisterGatewayInstanceRequest,deregister_gateway_instance_request\nDeregisterGatewayInstanceResponse,deregister_gateway_instance_response\nDeregisterIdentityProviderRequest,deregister_identity_provider_request\nDeregisterIdentityProviderResponse,deregister_identity_provider_response\nDeregisterImageRequest,deregister_image_request\nDeregisterInstanceEventNotificationAttributesRequest,deregister_instance_event_notification_attributes_request\nDeregisterInstanceEventNotificationAttributesResult,deregister_instance_event_notification_attributes_result\nDeregisterInstanceRequest,deregister_instance_request\nDeregisterInstanceResponse,deregister_instance_response\nDeregisterInstanceTagAttributeRequest,deregister_instance_tag_attribute_request\nDeregisterJobDefinitionRequest,deregister_job_definition_request\nDeregisterMailDomainRequest,deregister_mail_domain_request\nDeregisterManagedInstanceRequest,deregister_managed_instance_request\nDeregisterOnPremisesInstanceInput,deregister_on_premises_instance_input\nDeregisterOrganizationAdminAccountRequest,deregister_organization_admin_account_request\nDeregisterOrganizationDelegatedAdminRequest,deregister_organization_delegated_admin_request\nDeregisterPackageVersionRequest,deregister_package_version_request\nDeregisterPatchBaselineForPatchGroupRequest,deregister_patch_baseline_for_patch_group_request\nDeregisterPatchBaselineForPatchGroupResult,deregister_patch_baseline_for_patch_group_result\nDeregisterRdsDbInstanceRequest,deregister_rds_db_instance_request\nDeregisterResourceRequest,deregister_resource_request\nDeregisterRobotRequest,deregister_robot_request\nDeregisterRobotResponse,deregister_robot_response\nDeregisterScalableTargetRequest,deregister_scalable_target_request\nDeregisterStreamConsumerInput,deregister_stream_consumer_input\nDeregisterTargetFromMaintenanceWindowRequest,deregister_target_from_maintenance_window_request\nDeregisterTargetFromMaintenanceWindowResult,deregister_target_from_maintenance_window_result\nDeregisterTargetsInput,deregister_targets_input\nDeregisterTargetsRequest,deregister_targets_request\nDeregisterTargetsResponse,deregister_targets_response\nDeregisterTaskDefinitionRequest,deregister_task_definition_request\nDeregisterTaskDefinitionResponse,deregister_task_definition_response\nDeregisterTaskFromMaintenanceWindowRequest,deregister_task_from_maintenance_window_request\nDeregisterTaskFromMaintenanceWindowResult,deregister_task_from_maintenance_window_result\nDeregisterTransitGatewayMulticastGroupMembersRequest,deregister_transit_gateway_multicast_group_members_request\nDeregisterTransitGatewayMulticastGroupMembersResult,deregister_transit_gateway_multicast_group_members_result\nDeregisterTransitGatewayMulticastGroupSourcesRequest,deregister_transit_gateway_multicast_group_sources_request\nDeregisterTransitGatewayMulticastGroupSourcesResult,deregister_transit_gateway_multicast_group_sources_result\nDeregisterTransitGatewayRequest,deregister_transit_gateway_request\nDeregisterTransitGatewayResponse,deregister_transit_gateway_response\nDeregisterTypeInput,deregister_type_input\nDeregisterVolumeRequest,deregister_volume_request\nDeregisterWebhookWithThirdPartyInput,deregister_webhook_with_third_party_input\nDeregisterWirelessDeviceRequest,deregister_wireless_device_request\nDeregisterWorkspaceDirectoryRequest,deregister_workspace_directory_request\nDeregisteredMulticastGroupMembers,deregistered_multicast_group_members\nDeregisteredMulticastGroupSources,deregistered_multicast_group_sources\nDeregisteredNetworkInterfaceIds,deregistered_network_interface_ids\nDeregistering,deregistering\nDeregistrationPolicy,deregistration_policy\nDeriveKey,derive_key\nDerivedDataInputConfig,derived_data_input_config\nDerivedInformation,derived_information\nDescribeACLsRequest,describe_acls_request\nDescribeACLsResponse,describe_acls_response\nDescribeAcceleratorAttributesRequest,describe_accelerator_attributes_request\nDescribeAcceleratorAttributesResponse,describe_accelerator_attributes_response\nDescribeAcceleratorOfferingsRequest,describe_accelerator_offerings_request\nDescribeAcceleratorOfferingsResponse,describe_accelerator_offerings_response\nDescribeAcceleratorRequest,describe_accelerator_request\nDescribeAcceleratorResponse,describe_accelerator_response\nDescribeAcceleratorTypesResponse,describe_accelerator_types_response\nDescribeAcceleratorsRequest,describe_accelerators_request\nDescribeAcceleratorsResponse,describe_accelerators_response\nDescribeAccessControlConfigurationRequest,describe_access_control_configuration_request\nDescribeAccessControlConfigurationResponse,describe_access_control_configuration_response\nDescribeAccessPointsInput,describe_access_points_input\nDescribeAccessPointsOutput,describe_access_points_output\nDescribeAccessPointsRequest,describe_access_points_request\nDescribeAccessPointsResponse,describe_access_points_response\nDescribeAccessPolicyRequest,describe_access_policy_request\nDescribeAccessPolicyResponse,describe_access_policy_response\nDescribeAccessRequest,describe_access_request\nDescribeAccessResponse,describe_access_response\nDescribeAccountAssignmentCreationStatusRequest,describe_account_assignment_creation_status_request\nDescribeAccountAssignmentCreationStatusResponse,describe_account_assignment_creation_status_response\nDescribeAccountAssignmentDeletionStatusRequest,describe_account_assignment_deletion_status_request\nDescribeAccountAssignmentDeletionStatusResponse,describe_account_assignment_deletion_status_response\nDescribeAccountAttributesMessage,describe_account_attributes_message\nDescribeAccountAttributesRequest,describe_account_attributes_request\nDescribeAccountAttributesResponse,describe_account_attributes_response\nDescribeAccountAttributesResult,describe_account_attributes_result\nDescribeAccountAuditConfigurationResponse,describe_account_audit_configuration_response\nDescribeAccountConfigurationResponse,describe_account_configuration_response\nDescribeAccountCustomizationRequest,describe_account_customization_request\nDescribeAccountCustomizationResponse,describe_account_customization_response\nDescribeAccountHealthResponse,describe_account_health_response\nDescribeAccountLimitsAnswer,describe_account_limits_answer\nDescribeAccountLimitsInput,describe_account_limits_input\nDescribeAccountLimitsOutput,describe_account_limits_output\nDescribeAccountLimitsRequest,describe_account_limits_request\nDescribeAccountLimitsResult,describe_account_limits_result\nDescribeAccountModificationsRequest,describe_account_modifications_request\nDescribeAccountModificationsResult,describe_account_modifications_result\nDescribeAccountOverviewRequest,describe_account_overview_request\nDescribeAccountOverviewResponse,describe_account_overview_response\nDescribeAccountPoliciesRequest,describe_account_policies_request\nDescribeAccountPoliciesResponse,describe_account_policies_response\nDescribeAccountPreferencesRequest,describe_account_preferences_request\nDescribeAccountPreferencesResponse,describe_account_preferences_response\nDescribeAccountRequest,describe_account_request\nDescribeAccountResponse,describe_account_response\nDescribeAccountResult,describe_account_result\nDescribeAccountSettingsRequest,describe_account_settings_request\nDescribeAccountSettingsResponse,describe_account_settings_response\nDescribeAccountSubscriptionRequest,describe_account_subscription_request\nDescribeAccountSubscriptionResponse,describe_account_subscription_response\nDescribeActionRequest,describe_action_request\nDescribeActionResponse,describe_action_response\nDescribeActionTargetsRequest,describe_action_targets_request\nDescribeActionTargetsResponse,describe_action_targets_response\nDescribeActivationsFilter,describe_activations_filter\nDescribeActivationsRequest,describe_activations_request\nDescribeActivationsResult,describe_activations_result\nDescribeActiveReceiptRuleSetResponse,describe_active_receipt_rule_set_response\nDescribeActivitiesRequest,describe_activities_request\nDescribeActivitiesResponse,describe_activities_response\nDescribeActivityInput,describe_activity_input\nDescribeActivityOutput,describe_activity_output\nDescribeActivityTypeInput,describe_activity_type_input\nDescribeAddonConfigurationRequest,describe_addon_configuration_request\nDescribeAddonConfigurationResponse,describe_addon_configuration_response\nDescribeAddonRequest,describe_addon_request\nDescribeAddonResponse,describe_addon_response\nDescribeAddonVersionsRequest,describe_addon_versions_request\nDescribeAddonVersionsResponse,describe_addon_versions_response\nDescribeAddressRequest,describe_address_request\nDescribeAddressResult,describe_address_result\nDescribeAddressTransfersRequest,describe_address_transfers_request\nDescribeAddressTransfersResult,describe_address_transfers_result\nDescribeAddressesAttributeRequest,describe_addresses_attribute_request\nDescribeAddressesAttributeResult,describe_addresses_attribute_result\nDescribeAddressesRequest,describe_addresses_request\nDescribeAddressesResult,describe_addresses_result\nDescribeAdjustmentTypesAnswer,describe_adjustment_types_answer\nDescribeAffectedAccountsForOrganizationRequest,describe_affected_accounts_for_organization_request\nDescribeAffectedAccountsForOrganizationResponse,describe_affected_accounts_for_organization_response\nDescribeAffectedEntitiesForOrganizationRequest,describe_affected_entities_for_organization_request\nDescribeAffectedEntitiesForOrganizationResponse,describe_affected_entities_for_organization_response\nDescribeAffectedEntitiesRequest,describe_affected_entities_request\nDescribeAffectedEntitiesResponse,describe_affected_entities_response\nDescribeAgentRequest,describe_agent_request\nDescribeAgentResponse,describe_agent_response\nDescribeAgentStatusRequest,describe_agent_status_request\nDescribeAgentStatusResponse,describe_agent_status_response\nDescribeAgentVersionsRequest,describe_agent_versions_request\nDescribeAgentVersionsResult,describe_agent_versions_result\nDescribeAgentsRequest,describe_agents_request\nDescribeAgentsResponse,describe_agents_response\nDescribeAggregateComplianceByConfigRulesRequest,describe_aggregate_compliance_by_config_rules_request\nDescribeAggregateComplianceByConfigRulesResponse,describe_aggregate_compliance_by_config_rules_response\nDescribeAggregateComplianceByConformancePacksRequest,describe_aggregate_compliance_by_conformance_packs_request\nDescribeAggregateComplianceByConformancePacksResponse,describe_aggregate_compliance_by_conformance_packs_response\nDescribeAggregateIdFormatRequest,describe_aggregate_id_format_request\nDescribeAggregateIdFormatResult,describe_aggregate_id_format_result\nDescribeAggregationAuthorizationsRequest,describe_aggregation_authorizations_request\nDescribeAggregationAuthorizationsResponse,describe_aggregation_authorizations_response\nDescribeAgreementRequest,describe_agreement_request\nDescribeAgreementResponse,describe_agreement_response\nDescribeAlarmHistoryInput,describe_alarm_history_input\nDescribeAlarmHistoryOutput,describe_alarm_history_output\nDescribeAlarmModelRequest,describe_alarm_model_request\nDescribeAlarmModelResponse,describe_alarm_model_response\nDescribeAlarmRequest,describe_alarm_request\nDescribeAlarmResponse,describe_alarm_response\nDescribeAlarmsForMetricInput,describe_alarms_for_metric_input\nDescribeAlarmsForMetricOutput,describe_alarms_for_metric_output\nDescribeAlarmsInput,describe_alarms_input\nDescribeAlarmsOutput,describe_alarms_output\nDescribeAlertManagerDefinitionRequest,describe_alert_manager_definition_request\nDescribeAlertManagerDefinitionResponse,describe_alert_manager_definition_response\nDescribeAlertRequest,describe_alert_request\nDescribeAlertResponse,describe_alert_response\nDescribeAlgorithmInput,describe_algorithm_input\nDescribeAlgorithmOutput,describe_algorithm_output\nDescribeAlgorithmRequest,describe_algorithm_request\nDescribeAlgorithmResponse,describe_algorithm_response\nDescribeAliasInput,describe_alias_input\nDescribeAliasOutput,describe_alias_output\nDescribeAllManagedProductsRequest,describe_all_managed_products_request\nDescribeAllManagedProductsResponse,describe_all_managed_products_response\nDescribeAnalysisDefinitionRequest,describe_analysis_definition_request\nDescribeAnalysisDefinitionResponse,describe_analysis_definition_response\nDescribeAnalysisPermissionsRequest,describe_analysis_permissions_request\nDescribeAnalysisPermissionsResponse,describe_analysis_permissions_response\nDescribeAnalysisRequest,describe_analysis_request\nDescribeAnalysisResponse,describe_analysis_response\nDescribeAnalysisSchemesRequest,describe_analysis_schemes_request\nDescribeAnalysisSchemesResponse,describe_analysis_schemes_response\nDescribeAnomalyDetectionExecutionsRequest,describe_anomaly_detection_executions_request\nDescribeAnomalyDetectionExecutionsResponse,describe_anomaly_detection_executions_response\nDescribeAnomalyDetectorRequest,describe_anomaly_detector_request\nDescribeAnomalyDetectorResponse,describe_anomaly_detector_response\nDescribeAnomalyDetectorsInput,describe_anomaly_detectors_input\nDescribeAnomalyDetectorsOutput,describe_anomaly_detectors_output\nDescribeAnomalyRequest,describe_anomaly_request\nDescribeAnomalyResponse,describe_anomaly_response\nDescribeApiDestinationRequest,describe_api_destination_request\nDescribeApiDestinationResponse,describe_api_destination_response\nDescribeAppAssessmentRequest,describe_app_assessment_request\nDescribeAppAssessmentResponse,describe_app_assessment_response\nDescribeAppBlockBuilderAppBlockAssociationsRequest,describe_app_block_builder_app_block_associations_request\nDescribeAppBlockBuilderAppBlockAssociationsResult,describe_app_block_builder_app_block_associations_result\nDescribeAppBlockBuildersRequest,describe_app_block_builders_request\nDescribeAppBlockBuildersResult,describe_app_block_builders_result\nDescribeAppBlocksRequest,describe_app_blocks_request\nDescribeAppBlocksResult,describe_app_blocks_result\nDescribeAppImageConfigRequest,describe_app_image_config_request\nDescribeAppImageConfigResponse,describe_app_image_config_response\nDescribeAppInput,describe_app_input\nDescribeAppInstanceAdminRequest,describe_app_instance_admin_request\nDescribeAppInstanceAdminResponse,describe_app_instance_admin_response\nDescribeAppInstanceBotRequest,describe_app_instance_bot_request\nDescribeAppInstanceBotResponse,describe_app_instance_bot_response\nDescribeAppInstanceRequest,describe_app_instance_request\nDescribeAppInstanceResponse,describe_app_instance_response\nDescribeAppInstanceUserEndpointRequest,describe_app_instance_user_endpoint_request\nDescribeAppInstanceUserEndpointResponse,describe_app_instance_user_endpoint_response\nDescribeAppInstanceUserRequest,describe_app_instance_user_request\nDescribeAppInstanceUserResponse,describe_app_instance_user_response\nDescribeAppOutput,describe_app_output\nDescribeAppRequest,describe_app_request\nDescribeAppResponse,describe_app_response\nDescribeAppVersionAppComponentRequest,describe_app_version_app_component_request\nDescribeAppVersionAppComponentResponse,describe_app_version_app_component_response\nDescribeAppVersionRequest,describe_app_version_request\nDescribeAppVersionResourceRequest,describe_app_version_resource_request\nDescribeAppVersionResourceResponse,describe_app_version_resource_response\nDescribeAppVersionResourcesResolutionStatusRequest,describe_app_version_resources_resolution_status_request\nDescribeAppVersionResourcesResolutionStatusResponse,describe_app_version_resources_resolution_status_response\nDescribeAppVersionResponse,describe_app_version_response\nDescribeAppVersionTemplateRequest,describe_app_version_template_request\nDescribeAppVersionTemplateResponse,describe_app_version_template_response\nDescribeApplicableIndividualAssessmentsMessage,describe_applicable_individual_assessments_message\nDescribeApplicableIndividualAssessmentsResponse,describe_applicable_individual_assessments_response\nDescribeApplicationFleetAssociationsRequest,describe_application_fleet_associations_request\nDescribeApplicationFleetAssociationsResult,describe_application_fleet_associations_result\nDescribeApplicationInstanceDetailsRequest,describe_application_instance_details_request\nDescribeApplicationInstanceDetailsResponse,describe_application_instance_details_response\nDescribeApplicationInstanceRequest,describe_application_instance_request\nDescribeApplicationInstanceResponse,describe_application_instance_response\nDescribeApplicationRequest,describe_application_request\nDescribeApplicationResponse,describe_application_response\nDescribeApplicationSnapshotRequest,describe_application_snapshot_request\nDescribeApplicationSnapshotResponse,describe_application_snapshot_response\nDescribeApplicationStateRequest,describe_application_state_request\nDescribeApplicationStateResult,describe_application_state_result\nDescribeApplicationVersionRequest,describe_application_version_request\nDescribeApplicationVersionResponse,describe_application_version_response\nDescribeApplicationVersionsMessage,describe_application_versions_message\nDescribeApplicationsMessage,describe_applications_message\nDescribeApplicationsRequest,describe_applications_request\nDescribeApplicationsResult,describe_applications_result\nDescribeAppsRequest,describe_apps_request\nDescribeAppsResult,describe_apps_result\nDescribeArchiveRequest,describe_archive_request\nDescribeArchiveResponse,describe_archive_response\nDescribeArtifactRequest,describe_artifact_request\nDescribeArtifactResponse,describe_artifact_response\nDescribeAssessmentRunsRequest,describe_assessment_runs_request\nDescribeAssessmentRunsResponse,describe_assessment_runs_response\nDescribeAssessmentTargetsRequest,describe_assessment_targets_request\nDescribeAssessmentTargetsResponse,describe_assessment_targets_response\nDescribeAssessmentTemplatesRequest,describe_assessment_templates_request\nDescribeAssessmentTemplatesResponse,describe_assessment_templates_response\nDescribeAssetBundleExportJobRequest,describe_asset_bundle_export_job_request\nDescribeAssetBundleExportJobResponse,describe_asset_bundle_export_job_response\nDescribeAssetBundleImportJobRequest,describe_asset_bundle_import_job_request\nDescribeAssetBundleImportJobResponse,describe_asset_bundle_import_job_response\nDescribeAssetModelRequest,describe_asset_model_request\nDescribeAssetModelResponse,describe_asset_model_response\nDescribeAssetPropertyRequest,describe_asset_property_request\nDescribeAssetPropertyResponse,describe_asset_property_response\nDescribeAssetRequest,describe_asset_request\nDescribeAssetResponse,describe_asset_response\nDescribeAssociationExecutionTargetsRequest,describe_association_execution_targets_request\nDescribeAssociationExecutionTargetsResult,describe_association_execution_targets_result\nDescribeAssociationExecutionsRequest,describe_association_executions_request\nDescribeAssociationExecutionsResult,describe_association_executions_result\nDescribeAssociationRequest,describe_association_request\nDescribeAssociationResult,describe_association_result\nDescribeAttachmentLimitExceeded,describe_attachment_limit_exceeded\nDescribeAttachmentRequest,describe_attachment_request\nDescribeAttachmentResponse,describe_attachment_response\nDescribeAttackRequest,describe_attack_request\nDescribeAttackResponse,describe_attack_response\nDescribeAttackStatisticsResponse,describe_attack_statistics_response\nDescribeAuditFindingRequest,describe_audit_finding_request\nDescribeAuditFindingResponse,describe_audit_finding_response\nDescribeAuditMitigationActionsTaskRequest,describe_audit_mitigation_actions_task_request\nDescribeAuditMitigationActionsTaskResponse,describe_audit_mitigation_actions_task_response\nDescribeAuditStreamConfigurationRequest,describe_audit_stream_configuration_request\nDescribeAuditStreamConfigurationResponse,describe_audit_stream_configuration_response\nDescribeAuditSuppressionRequest,describe_audit_suppression_request\nDescribeAuditSuppressionResponse,describe_audit_suppression_response\nDescribeAuditTaskRequest,describe_audit_task_request\nDescribeAuditTaskResponse,describe_audit_task_response\nDescribeAuthenticationProfilesMessage,describe_authentication_profiles_message\nDescribeAuthenticationProfilesResult,describe_authentication_profiles_result\nDescribeAuthorizerRequest,describe_authorizer_request\nDescribeAuthorizerResponse,describe_authorizer_response\nDescribeAutoMLJobRequest,describe_auto_ml_job_request\nDescribeAutoMLJobResponse,describe_auto_ml_job_response\nDescribeAutoMLJobV2Request,describe_auto_ml_job_v2_request\nDescribeAutoMLJobV2Response,describe_auto_ml_job_v2_response\nDescribeAutoPredictorRequest,describe_auto_predictor_request\nDescribeAutoPredictorResponse,describe_auto_predictor_response\nDescribeAutoScalingConfigurationRequest,describe_auto_scaling_configuration_request\nDescribeAutoScalingConfigurationResponse,describe_auto_scaling_configuration_response\nDescribeAutoScalingInstancesType,describe_auto_scaling_instances_type\nDescribeAutoScalingNotificationTypesAnswer,describe_auto_scaling_notification_types_answer\nDescribeAutomationExecutionsRequest,describe_automation_executions_request\nDescribeAutomationExecutionsResult,describe_automation_executions_result\nDescribeAutomationStepExecutionsRequest,describe_automation_step_executions_request\nDescribeAutomationStepExecutionsResult,describe_automation_step_executions_result\nDescribeAvailabilityMonitorTestInput,describe_availability_monitor_test_input\nDescribeAvailabilityMonitorTestOutput,describe_availability_monitor_test_output\nDescribeAvailabilityOptionsRequest,describe_availability_options_request\nDescribeAvailabilityOptionsResponse,describe_availability_options_response\nDescribeAvailabilityZonesRequest,describe_availability_zones_request\nDescribeAvailabilityZonesResult,describe_availability_zones_result\nDescribeAvailablePatchesRequest,describe_available_patches_request\nDescribeAvailablePatchesResult,describe_available_patches_result\nDescribeAwsNetworkPerformanceMetricSubscriptionsRequest,describe_aws_network_performance_metric_subscriptions_request\nDescribeAwsNetworkPerformanceMetricSubscriptionsResult,describe_aws_network_performance_metric_subscriptions_result\nDescribeBackupInput,describe_backup_input\nDescribeBackupJobInput,describe_backup_job_input\nDescribeBackupJobOutput,describe_backup_job_output\nDescribeBackupOutput,describe_backup_output\nDescribeBackupPolicyRequest,describe_backup_policy_request\nDescribeBackupVaultInput,describe_backup_vault_input\nDescribeBackupVaultOutput,describe_backup_vault_output\nDescribeBackupsRequest,describe_backups_request\nDescribeBackupsResponse,describe_backups_response\nDescribeBandwidthRateLimitInput,describe_bandwidth_rate_limit_input\nDescribeBandwidthRateLimitOutput,describe_bandwidth_rate_limit_output\nDescribeBandwidthRateLimitScheduleInput,describe_bandwidth_rate_limit_schedule_input\nDescribeBandwidthRateLimitScheduleOutput,describe_bandwidth_rate_limit_schedule_output\nDescribeBatchInferenceJobRequest,describe_batch_inference_job_request\nDescribeBatchInferenceJobResponse,describe_batch_inference_job_response\nDescribeBatchLoadTaskRequest,describe_batch_load_task_request\nDescribeBatchLoadTaskResponse,describe_batch_load_task_response\nDescribeBatchPredictionsInput,describe_batch_predictions_input\nDescribeBatchPredictionsOutput,describe_batch_predictions_output\nDescribeBatchSegmentJobRequest,describe_batch_segment_job_request\nDescribeBatchSegmentJobResponse,describe_batch_segment_job_response\nDescribeBillingGroupRequest,describe_billing_group_request\nDescribeBillingGroupResponse,describe_billing_group_response\nDescribeBlueGreenDeploymentsRequest,describe_blue_green_deployments_request\nDescribeBlueGreenDeploymentsResponse,describe_blue_green_deployments_response\nDescribeBotAliasRequest,describe_bot_alias_request\nDescribeBotAliasResponse,describe_bot_alias_response\nDescribeBotLocaleRequest,describe_bot_locale_request\nDescribeBotLocaleResponse,describe_bot_locale_response\nDescribeBotRecommendationRequest,describe_bot_recommendation_request\nDescribeBotRecommendationResponse,describe_bot_recommendation_response\nDescribeBotRequest,describe_bot_request\nDescribeBotResponse,describe_bot_response\nDescribeBotVersionRequest,describe_bot_version_request\nDescribeBotVersionResponse,describe_bot_version_response\nDescribeBridgeRequest,describe_bridge_request\nDescribeBridgeResponse,describe_bridge_response\nDescribeBrokerEngineTypesRequest,describe_broker_engine_types_request\nDescribeBrokerEngineTypesResponse,describe_broker_engine_types_response\nDescribeBrokerInstanceOptionsRequest,describe_broker_instance_options_request\nDescribeBrokerInstanceOptionsResponse,describe_broker_instance_options_response\nDescribeBrokerRequest,describe_broker_request\nDescribeBrokerResponse,describe_broker_response\nDescribeBucketsRequest,describe_buckets_request\nDescribeBucketsResponse,describe_buckets_response\nDescribeBudgetActionHistoriesRequest,describe_budget_action_histories_request\nDescribeBudgetActionHistoriesResponse,describe_budget_action_histories_response\nDescribeBudgetActionRequest,describe_budget_action_request\nDescribeBudgetActionResponse,describe_budget_action_response\nDescribeBudgetActionsForAccountRequest,describe_budget_actions_for_account_request\nDescribeBudgetActionsForAccountResponse,describe_budget_actions_for_account_response\nDescribeBudgetActionsForBudgetRequest,describe_budget_actions_for_budget_request\nDescribeBudgetActionsForBudgetResponse,describe_budget_actions_for_budget_response\nDescribeBudgetNotificationsForAccountRequest,describe_budget_notifications_for_account_request\nDescribeBudgetNotificationsForAccountResponse,describe_budget_notifications_for_account_response\nDescribeBudgetPerformanceHistoryRequest,describe_budget_performance_history_request\nDescribeBudgetPerformanceHistoryResponse,describe_budget_performance_history_response\nDescribeBudgetRequest,describe_budget_request\nDescribeBudgetResponse,describe_budget_response\nDescribeBudgetsRequest,describe_budgets_request\nDescribeBudgetsResponse,describe_budgets_response\nDescribeBuildInput,describe_build_input\nDescribeBuildOutput,describe_build_output\nDescribeBulkImportJobRequest,describe_bulk_import_job_request\nDescribeBulkImportJobResponse,describe_bulk_import_job_response\nDescribeBundleRequest,describe_bundle_request\nDescribeBundleResult,describe_bundle_result\nDescribeBundleTasksRequest,describe_bundle_tasks_request\nDescribeBundleTasksResult,describe_bundle_tasks_result\nDescribeByoipCidrsRequest,describe_byoip_cidrs_request\nDescribeByoipCidrsResult,describe_byoip_cidrs_result\nDescribeCACertificateRequest,describe_ca_certificate_request\nDescribeCACertificateResponse,describe_ca_certificate_response\nDescribeCacheClustersMessage,describe_cache_clusters_message\nDescribeCacheEngineVersionsMessage,describe_cache_engine_versions_message\nDescribeCacheInput,describe_cache_input\nDescribeCacheOutput,describe_cache_output\nDescribeCacheParameterGroupsMessage,describe_cache_parameter_groups_message\nDescribeCacheParametersMessage,describe_cache_parameters_message\nDescribeCacheSecurityGroupsMessage,describe_cache_security_groups_message\nDescribeCacheSubnetGroupsMessage,describe_cache_subnet_groups_message\nDescribeCachediSCSIVolumesInput,describe_cachedi_scsi_volumes_input\nDescribeCachediSCSIVolumesOutput,describe_cachedi_scsi_volumes_output\nDescribeCampaignRequest,describe_campaign_request\nDescribeCampaignResponse,describe_campaign_response\nDescribeCanariesLastRunRequest,describe_canaries_last_run_request\nDescribeCanariesLastRunResponse,describe_canaries_last_run_response\nDescribeCanariesRequest,describe_canaries_request\nDescribeCanariesResponse,describe_canaries_response\nDescribeCapacityProvidersRequest,describe_capacity_providers_request\nDescribeCapacityProvidersResponse,describe_capacity_providers_response\nDescribeCapacityReservationFleetsRequest,describe_capacity_reservation_fleets_request\nDescribeCapacityReservationFleetsResult,describe_capacity_reservation_fleets_result\nDescribeCapacityReservationsRequest,describe_capacity_reservations_request\nDescribeCapacityReservationsResult,describe_capacity_reservations_result\nDescribeCarrierGatewaysRequest,describe_carrier_gateways_request\nDescribeCarrierGatewaysResult,describe_carrier_gateways_result\nDescribeCasesRequest,describe_cases_request\nDescribeCasesResponse,describe_cases_response\nDescribeCertificateAuthorityAuditReportRequest,describe_certificate_authority_audit_report_request\nDescribeCertificateAuthorityAuditReportResponse,describe_certificate_authority_audit_report_response\nDescribeCertificateAuthorityRequest,describe_certificate_authority_request\nDescribeCertificateAuthorityResponse,describe_certificate_authority_response\nDescribeCertificateRequest,describe_certificate_request\nDescribeCertificateResponse,describe_certificate_response\nDescribeCertificateResult,describe_certificate_result\nDescribeCertificatesMessage,describe_certificates_message\nDescribeCertificatesResponse,describe_certificates_response\nDescribeChangeSetHooksInput,describe_change_set_hooks_input\nDescribeChangeSetHooksOutput,describe_change_set_hooks_output\nDescribeChangeSetInput,describe_change_set_input\nDescribeChangeSetOutput,describe_change_set_output\nDescribeChangeSetRequest,describe_change_set_request\nDescribeChangeSetResponse,describe_change_set_response\nDescribeChannelBanRequest,describe_channel_ban_request\nDescribeChannelBanResponse,describe_channel_ban_response\nDescribeChannelFlowRequest,describe_channel_flow_request\nDescribeChannelFlowResponse,describe_channel_flow_response\nDescribeChannelMembershipForAppInstanceUserRequest,describe_channel_membership_for_app_instance_user_request\nDescribeChannelMembershipForAppInstanceUserResponse,describe_channel_membership_for_app_instance_user_response\nDescribeChannelMembershipRequest,describe_channel_membership_request\nDescribeChannelMembershipResponse,describe_channel_membership_response\nDescribeChannelModeratedByAppInstanceUserRequest,describe_channel_moderated_by_app_instance_user_request\nDescribeChannelModeratedByAppInstanceUserResponse,describe_channel_moderated_by_app_instance_user_response\nDescribeChannelModeratorRequest,describe_channel_moderator_request\nDescribeChannelModeratorResponse,describe_channel_moderator_response\nDescribeChannelRequest,describe_channel_request\nDescribeChannelResponse,describe_channel_response\nDescribeChapCredentialsInput,describe_chap_credentials_input\nDescribeChapCredentialsOutput,describe_chap_credentials_output\nDescribeClassicLinkInstancesRequest,describe_classic_link_instances_request\nDescribeClassicLinkInstancesResult,describe_classic_link_instances_result\nDescribeClassificationJobRequest,describe_classification_job_request\nDescribeClassificationJobResponse,describe_classification_job_response\nDescribeClientAuthenticationSettingsRequest,describe_client_authentication_settings_request\nDescribeClientAuthenticationSettingsResult,describe_client_authentication_settings_result\nDescribeClientBrandingRequest,describe_client_branding_request\nDescribeClientBrandingResult,describe_client_branding_result\nDescribeClientPropertiesRequest,describe_client_properties_request\nDescribeClientPropertiesResult,describe_client_properties_result\nDescribeClientVpnAuthorizationRulesRequest,describe_client_vpn_authorization_rules_request\nDescribeClientVpnAuthorizationRulesResult,describe_client_vpn_authorization_rules_result\nDescribeClientVpnConnectionsRequest,describe_client_vpn_connections_request\nDescribeClientVpnConnectionsResult,describe_client_vpn_connections_result\nDescribeClientVpnEndpointsRequest,describe_client_vpn_endpoints_request\nDescribeClientVpnEndpointsResult,describe_client_vpn_endpoints_result\nDescribeClientVpnRoutesRequest,describe_client_vpn_routes_request\nDescribeClientVpnRoutesResult,describe_client_vpn_routes_result\nDescribeClientVpnTargetNetworksRequest,describe_client_vpn_target_networks_request\nDescribeClientVpnTargetNetworksResult,describe_client_vpn_target_networks_result\nDescribeClusterDbRevisionsMessage,describe_cluster_db_revisions_message\nDescribeClusterInput,describe_cluster_input\nDescribeClusterOperationRequest,describe_cluster_operation_request\nDescribeClusterOperationResponse,describe_cluster_operation_response\nDescribeClusterOperationV2Request,describe_cluster_operation_v2_request\nDescribeClusterOperationV2Response,describe_cluster_operation_v2_response\nDescribeClusterOutput,describe_cluster_output\nDescribeClusterParameterGroupsMessage,describe_cluster_parameter_groups_message\nDescribeClusterParametersMessage,describe_cluster_parameters_message\nDescribeClusterRequest,describe_cluster_request\nDescribeClusterResponse,describe_cluster_response\nDescribeClusterResult,describe_cluster_result\nDescribeClusterSecurityGroupsMessage,describe_cluster_security_groups_message\nDescribeClusterSnapshotsMessage,describe_cluster_snapshots_message\nDescribeClusterSubnetGroupsMessage,describe_cluster_subnet_groups_message\nDescribeClusterTracksMessage,describe_cluster_tracks_message\nDescribeClusterV2Request,describe_cluster_v2_request\nDescribeClusterV2Response,describe_cluster_v2_response\nDescribeClusterVersionsMessage,describe_cluster_versions_message\nDescribeClustersMessage,describe_clusters_message\nDescribeClustersRequest,describe_clusters_request\nDescribeClustersResponse,describe_clusters_response\nDescribeCodeBindingRequest,describe_code_binding_request\nDescribeCodeBindingResponse,describe_code_binding_response\nDescribeCodeCoveragesInput,describe_code_coverages_input\nDescribeCodeCoveragesOutput,describe_code_coverages_output\nDescribeCodeRepositoryInput,describe_code_repository_input\nDescribeCodeRepositoryOutput,describe_code_repository_output\nDescribeCodeReviewRequest,describe_code_review_request\nDescribeCodeReviewResponse,describe_code_review_response\nDescribeCoipPoolsRequest,describe_coip_pools_request\nDescribeCoipPoolsResult,describe_coip_pools_result\nDescribeCollectionRequest,describe_collection_request\nDescribeCollectionResponse,describe_collection_response\nDescribeCommandsRequest,describe_commands_request\nDescribeCommandsResult,describe_commands_result\nDescribeCommentsRequest,describe_comments_request\nDescribeCommentsResponse,describe_comments_response\nDescribeCommunicationsRequest,describe_communications_request\nDescribeCommunicationsResponse,describe_communications_response\nDescribeCompanyNetworkConfigurationRequest,describe_company_network_configuration_request\nDescribeCompanyNetworkConfigurationResponse,describe_company_network_configuration_response\nDescribeCompilationJobRequest,describe_compilation_job_request\nDescribeCompilationJobResponse,describe_compilation_job_response\nDescribeComplianceByConfigRuleRequest,describe_compliance_by_config_rule_request\nDescribeComplianceByConfigRuleResponse,describe_compliance_by_config_rule_response\nDescribeComplianceByResourceRequest,describe_compliance_by_resource_request\nDescribeComplianceByResourceResponse,describe_compliance_by_resource_response\nDescribeComponentConfigurationRecommendationRequest,describe_component_configuration_recommendation_request\nDescribeComponentConfigurationRecommendationResponse,describe_component_configuration_recommendation_response\nDescribeComponentConfigurationRequest,describe_component_configuration_request\nDescribeComponentConfigurationResponse,describe_component_configuration_response\nDescribeComponentRequest,describe_component_request\nDescribeComponentResponse,describe_component_response\nDescribeComputeEnvironmentsRequest,describe_compute_environments_request\nDescribeComputeEnvironmentsResponse,describe_compute_environments_response\nDescribeComputeInput,describe_compute_input\nDescribeComputeOutput,describe_compute_output\nDescribeConditionalForwardersRequest,describe_conditional_forwarders_request\nDescribeConditionalForwardersResult,describe_conditional_forwarders_result\nDescribeConfigRuleEvaluationStatusRequest,describe_config_rule_evaluation_status_request\nDescribeConfigRuleEvaluationStatusResponse,describe_config_rule_evaluation_status_response\nDescribeConfigRulesFilters,describe_config_rules_filters\nDescribeConfigRulesRequest,describe_config_rules_request\nDescribeConfigRulesResponse,describe_config_rules_response\nDescribeConfigurationAggregatorSourcesStatusRequest,describe_configuration_aggregator_sources_status_request\nDescribeConfigurationAggregatorSourcesStatusResponse,describe_configuration_aggregator_sources_status_response\nDescribeConfigurationAggregatorsRequest,describe_configuration_aggregators_request\nDescribeConfigurationAggregatorsResponse,describe_configuration_aggregators_response\nDescribeConfigurationOptionsMessage,describe_configuration_options_message\nDescribeConfigurationRecorderStatusRequest,describe_configuration_recorder_status_request\nDescribeConfigurationRecorderStatusResponse,describe_configuration_recorder_status_response\nDescribeConfigurationRecordersRequest,describe_configuration_recorders_request\nDescribeConfigurationRecordersResponse,describe_configuration_recorders_response\nDescribeConfigurationRequest,describe_configuration_request\nDescribeConfigurationResponse,describe_configuration_response\nDescribeConfigurationRevisionRequest,describe_configuration_revision_request\nDescribeConfigurationRevisionResponse,describe_configuration_revision_response\nDescribeConfigurationSetRequest,describe_configuration_set_request\nDescribeConfigurationSetResponse,describe_configuration_set_response\nDescribeConfigurationSetsRequest,describe_configuration_sets_request\nDescribeConfigurationSetsResult,describe_configuration_sets_result\nDescribeConfigurationSettingsMessage,describe_configuration_settings_message\nDescribeConfigurationsRequest,describe_configurations_request\nDescribeConfigurationsResponse,describe_configurations_response\nDescribeConformancePackComplianceRequest,describe_conformance_pack_compliance_request\nDescribeConformancePackComplianceResponse,describe_conformance_pack_compliance_response\nDescribeConformancePackStatusRequest,describe_conformance_pack_status_request\nDescribeConformancePackStatusResponse,describe_conformance_pack_status_response\nDescribeConformancePacksRequest,describe_conformance_packs_request\nDescribeConformancePacksResponse,describe_conformance_packs_response\nDescribeConnectClientAddInsRequest,describe_connect_client_add_ins_request\nDescribeConnectClientAddInsResult,describe_connect_client_add_ins_result\nDescribeConnectionAliasPermissionsRequest,describe_connection_alias_permissions_request\nDescribeConnectionAliasPermissionsResult,describe_connection_alias_permissions_result\nDescribeConnectionAliasesRequest,describe_connection_aliases_request\nDescribeConnectionAliasesResult,describe_connection_aliases_result\nDescribeConnectionLoaRequest,describe_connection_loa_request\nDescribeConnectionLoaResponse,describe_connection_loa_response\nDescribeConnectionRequest,describe_connection_request\nDescribeConnectionResponse,describe_connection_response\nDescribeConnectionsMessage,describe_connections_message\nDescribeConnectionsOnInterconnectRequest,describe_connections_on_interconnect_request\nDescribeConnectionsRequest,describe_connections_request\nDescribeConnectionsResponse,describe_connections_response\nDescribeConnectorEntityRequest,describe_connector_entity_request\nDescribeConnectorEntityResponse,describe_connector_entity_response\nDescribeConnectorProfilesRequest,describe_connector_profiles_request\nDescribeConnectorProfilesResponse,describe_connector_profiles_response\nDescribeConnectorRequest,describe_connector_request\nDescribeConnectorResponse,describe_connector_response\nDescribeConnectorsRequest,describe_connectors_request\nDescribeConnectorsResponse,describe_connectors_response\nDescribeConstraintInput,describe_constraint_input\nDescribeConstraintOutput,describe_constraint_output\nDescribeContactEvaluationRequest,describe_contact_evaluation_request\nDescribeContactEvaluationResponse,describe_contact_evaluation_response\nDescribeContactFlowModuleRequest,describe_contact_flow_module_request\nDescribeContactFlowModuleResponse,describe_contact_flow_module_response\nDescribeContactFlowRequest,describe_contact_flow_request\nDescribeContactFlowResponse,describe_contact_flow_response\nDescribeContactRequest,describe_contact_request\nDescribeContactResponse,describe_contact_response\nDescribeContainerInput,describe_container_input\nDescribeContainerInstancesRequest,describe_container_instances_request\nDescribeContainerInstancesResponse,describe_container_instances_response\nDescribeContainerOutput,describe_container_output\nDescribeContextRequest,describe_context_request\nDescribeContextResponse,describe_context_response\nDescribeContinuousBackupsInput,describe_continuous_backups_input\nDescribeContinuousBackupsOutput,describe_continuous_backups_output\nDescribeContinuousExportsRequest,describe_continuous_exports_request\nDescribeContinuousExportsResponse,describe_continuous_exports_response\nDescribeContributorInsightsInput,describe_contributor_insights_input\nDescribeContributorInsightsOutput,describe_contributor_insights_output\nDescribeControlPanelRequest,describe_control_panel_request\nDescribeControlPanelResponse,describe_control_panel_response\nDescribeConversionConfigurationMessage,describe_conversion_configuration_message\nDescribeConversionConfigurationResponse,describe_conversion_configuration_response\nDescribeConversionTasksRequest,describe_conversion_tasks_request\nDescribeConversionTasksResult,describe_conversion_tasks_result\nDescribeCopyJobInput,describe_copy_job_input\nDescribeCopyJobOutput,describe_copy_job_output\nDescribeCopyProductStatusInput,describe_copy_product_status_input\nDescribeCopyProductStatusOutput,describe_copy_product_status_output\nDescribeCostCategoryDefinitionRequest,describe_cost_category_definition_request\nDescribeCostCategoryDefinitionResponse,describe_cost_category_definition_response\nDescribeCreateAccountStatusRequest,describe_create_account_status_request\nDescribeCreateAccountStatusResponse,describe_create_account_status_response\nDescribeCreateCaseOptionsRequest,describe_create_case_options_request\nDescribeCreateCaseOptionsResponse,describe_create_case_options_response\nDescribeCrossAccountAccessRoleResponse,describe_cross_account_access_role_response\nDescribeCustomDomainAssociationsMessage,describe_custom_domain_associations_message\nDescribeCustomDomainsRequest,describe_custom_domains_request\nDescribeCustomDomainsResponse,describe_custom_domains_response\nDescribeCustomKeyStoresRequest,describe_custom_key_stores_request\nDescribeCustomKeyStoresResponse,describe_custom_key_stores_response\nDescribeCustomMetricRequest,describe_custom_metric_request\nDescribeCustomMetricResponse,describe_custom_metric_response\nDescribeCustomPluginRequest,describe_custom_plugin_request\nDescribeCustomPluginResponse,describe_custom_plugin_response\nDescribeCustomRoutingAcceleratorAttributesRequest,describe_custom_routing_accelerator_attributes_request\nDescribeCustomRoutingAcceleratorAttributesResponse,describe_custom_routing_accelerator_attributes_response\nDescribeCustomRoutingAcceleratorRequest,describe_custom_routing_accelerator_request\nDescribeCustomRoutingAcceleratorResponse,describe_custom_routing_accelerator_response\nDescribeCustomRoutingEndpointGroupRequest,describe_custom_routing_endpoint_group_request\nDescribeCustomRoutingEndpointGroupResponse,describe_custom_routing_endpoint_group_response\nDescribeCustomRoutingListenerRequest,describe_custom_routing_listener_request\nDescribeCustomRoutingListenerResponse,describe_custom_routing_listener_response\nDescribeCustomVocabularyMetadataRequest,describe_custom_vocabulary_metadata_request\nDescribeCustomVocabularyMetadataResponse,describe_custom_vocabulary_metadata_response\nDescribeCustomerGatewaysRequest,describe_customer_gateways_request\nDescribeCustomerGatewaysResult,describe_customer_gateways_result\nDescribeCustomerMetadataResponse,describe_customer_metadata_response\nDescribeDBClusterAutomatedBackupsMessage,describe_db_cluster_automated_backups_message\nDescribeDBClusterBacktracksMessage,describe_db_cluster_backtracks_message\nDescribeDBClusterEndpointsMessage,describe_db_cluster_endpoints_message\nDescribeDBClusterParameterGroupsMessage,describe_db_cluster_parameter_groups_message\nDescribeDBClusterParametersMessage,describe_db_cluster_parameters_message\nDescribeDBClusterSnapshotAttributesMessage,describe_db_cluster_snapshot_attributes_message\nDescribeDBClusterSnapshotAttributesResult,describe_db_cluster_snapshot_attributes_result\nDescribeDBClusterSnapshotsMessage,describe_db_cluster_snapshots_message\nDescribeDBClustersMessage,describe_db_clusters_message\nDescribeDBEngineVersionsMessage,describe_db_engine_versions_message\nDescribeDBInstanceAutomatedBackupsMessage,describe_db_instance_automated_backups_message\nDescribeDBInstancesMessage,describe_db_instances_message\nDescribeDBLogFiles,describe_db_log_files\nDescribeDBLogFilesDetails,describe_db_log_files_details\nDescribeDBLogFilesMessage,describe_db_log_files_message\nDescribeDBLogFilesResponse,describe_db_log_files_response\nDescribeDBParameterGroupsMessage,describe_db_parameter_groups_message\nDescribeDBParametersMessage,describe_db_parameters_message\nDescribeDBProxiesRequest,describe_db_proxies_request\nDescribeDBProxiesResponse,describe_db_proxies_response\nDescribeDBProxyEndpointsRequest,describe_db_proxy_endpoints_request\nDescribeDBProxyEndpointsResponse,describe_db_proxy_endpoints_response\nDescribeDBProxyTargetGroupsRequest,describe_db_proxy_target_groups_request\nDescribeDBProxyTargetGroupsResponse,describe_db_proxy_target_groups_response\nDescribeDBProxyTargetsRequest,describe_db_proxy_targets_request\nDescribeDBProxyTargetsResponse,describe_db_proxy_targets_response\nDescribeDBSecurityGroupsMessage,describe_db_security_groups_message\nDescribeDBSnapshotAttributesMessage,describe_db_snapshot_attributes_message\nDescribeDBSnapshotAttributesResult,describe_db_snapshot_attributes_result\nDescribeDBSnapshotsMessage,describe_db_snapshots_message\nDescribeDBSubnetGroupsMessage,describe_db_subnet_groups_message\nDescribeDRTAccessResponse,describe_drt_access_response\nDescribeDashboardDefinitionRequest,describe_dashboard_definition_request\nDescribeDashboardDefinitionResponse,describe_dashboard_definition_response\nDescribeDashboardPermissionsRequest,describe_dashboard_permissions_request\nDescribeDashboardPermissionsResponse,describe_dashboard_permissions_response\nDescribeDashboardRequest,describe_dashboard_request\nDescribeDashboardResponse,describe_dashboard_response\nDescribeDashboardSnapshotJobRequest,describe_dashboard_snapshot_job_request\nDescribeDashboardSnapshotJobResponse,describe_dashboard_snapshot_job_response\nDescribeDashboardSnapshotJobResultRequest,describe_dashboard_snapshot_job_result_request\nDescribeDashboardSnapshotJobResultResponse,describe_dashboard_snapshot_job_result_response\nDescribeDataIngestionJobRequest,describe_data_ingestion_job_request\nDescribeDataIngestionJobResponse,describe_data_ingestion_job_response\nDescribeDataProvidersMessage,describe_data_providers_message\nDescribeDataProvidersResponse,describe_data_providers_response\nDescribeDataQualityJobDefinitionRequest,describe_data_quality_job_definition_request\nDescribeDataQualityJobDefinitionResponse,describe_data_quality_job_definition_response\nDescribeDataRepositoryAssociationsRequest,describe_data_repository_associations_request\nDescribeDataRepositoryAssociationsResponse,describe_data_repository_associations_response\nDescribeDataRepositoryTasksRequest,describe_data_repository_tasks_request\nDescribeDataRepositoryTasksResponse,describe_data_repository_tasks_response\nDescribeDataSetPermissionsRequest,describe_data_set_permissions_request\nDescribeDataSetPermissionsResponse,describe_data_set_permissions_response\nDescribeDataSetRefreshPropertiesRequest,describe_data_set_refresh_properties_request\nDescribeDataSetRefreshPropertiesResponse,describe_data_set_refresh_properties_response\nDescribeDataSetRequest,describe_data_set_request\nDescribeDataSetResponse,describe_data_set_response\nDescribeDataSharesForConsumerMessage,describe_data_shares_for_consumer_message\nDescribeDataSharesForConsumerResult,describe_data_shares_for_consumer_result\nDescribeDataSharesForProducerMessage,describe_data_shares_for_producer_message\nDescribeDataSharesForProducerResult,describe_data_shares_for_producer_result\nDescribeDataSharesMessage,describe_data_shares_message\nDescribeDataSharesResult,describe_data_shares_result\nDescribeDataSourcePermissionsRequest,describe_data_source_permissions_request\nDescribeDataSourcePermissionsResponse,describe_data_source_permissions_response\nDescribeDataSourceRequest,describe_data_source_request\nDescribeDataSourceResponse,describe_data_source_response\nDescribeDataSourcesInput,describe_data_sources_input\nDescribeDataSourcesOutput,describe_data_sources_output\nDescribeDatabaseRequest,describe_database_request\nDescribeDatabaseResponse,describe_database_response\nDescribeDatasetExportJobRequest,describe_dataset_export_job_request\nDescribeDatasetExportJobResponse,describe_dataset_export_job_response\nDescribeDatasetGroupRequest,describe_dataset_group_request\nDescribeDatasetGroupResponse,describe_dataset_group_response\nDescribeDatasetImportJobRequest,describe_dataset_import_job_request\nDescribeDatasetImportJobResponse,describe_dataset_import_job_response\nDescribeDatasetRequest,describe_dataset_request\nDescribeDatasetResponse,describe_dataset_response\nDescribeDatastoreRequest,describe_datastore_request\nDescribeDatastoreResponse,describe_datastore_response\nDescribeDefaultAuthorizerResponse,describe_default_authorizer_response\nDescribeDefaultClusterParametersMessage,describe_default_cluster_parameters_message\nDescribeDefaultClusterParametersResult,describe_default_cluster_parameters_result\nDescribeDefaultEncryptionConfigurationResponse,describe_default_encryption_configuration_response\nDescribeDefaultParametersRequest,describe_default_parameters_request\nDescribeDefaultParametersResponse,describe_default_parameters_response\nDescribeDeliveryChannelStatusRequest,describe_delivery_channel_status_request\nDescribeDeliveryChannelStatusResponse,describe_delivery_channel_status_response\nDescribeDeliveryChannelsRequest,describe_delivery_channels_request\nDescribeDeliveryChannelsResponse,describe_delivery_channels_response\nDescribeDeliveryStreamInput,describe_delivery_stream_input\nDescribeDeliveryStreamOutput,describe_delivery_stream_output\nDescribeDeploymentJobRequest,describe_deployment_job_request\nDescribeDeploymentJobResponse,describe_deployment_job_response\nDescribeDeploymentsRequest,describe_deployments_request\nDescribeDeploymentsResult,describe_deployments_result\nDescribeDestinationsRequest,describe_destinations_request\nDescribeDestinationsResponse,describe_destinations_response\nDescribeDetectMitigationActionsTaskRequest,describe_detect_mitigation_actions_task_request\nDescribeDetectMitigationActionsTaskResponse,describe_detect_mitigation_actions_task_response\nDescribeDetectorModelAnalysisRequest,describe_detector_model_analysis_request\nDescribeDetectorModelAnalysisResponse,describe_detector_model_analysis_response\nDescribeDetectorModelRequest,describe_detector_model_request\nDescribeDetectorModelResponse,describe_detector_model_response\nDescribeDetectorRequest,describe_detector_request\nDescribeDetectorResponse,describe_detector_response\nDescribeDetectorResult,describe_detector_result\nDescribeDeviceEc2Input,describe_device_ec2_input\nDescribeDeviceEc2Output,describe_device_ec2_output\nDescribeDeviceFleetRequest,describe_device_fleet_request\nDescribeDeviceFleetResponse,describe_device_fleet_response\nDescribeDeviceInput,describe_device_input\nDescribeDeviceJobRequest,describe_device_job_request\nDescribeDeviceJobResponse,describe_device_job_response\nDescribeDeviceOutput,describe_device_output\nDescribeDevicePolicyConfigurationRequest,describe_device_policy_configuration_request\nDescribeDevicePolicyConfigurationResponse,describe_device_policy_configuration_response\nDescribeDeviceRequest,describe_device_request\nDescribeDeviceResponse,describe_device_response\nDescribeDhcpOptionsRequest,describe_dhcp_options_request\nDescribeDhcpOptionsResult,describe_dhcp_options_result\nDescribeDimensionKeysRequest,describe_dimension_keys_request\nDescribeDimensionKeysResponse,describe_dimension_keys_response\nDescribeDimensionRequest,describe_dimension_request\nDescribeDimensionResponse,describe_dimension_response\nDescribeDirectConnectGatewayAssociationProposalsRequest,describe_direct_connect_gateway_association_proposals_request\nDescribeDirectConnectGatewayAssociationProposalsResult,describe_direct_connect_gateway_association_proposals_result\nDescribeDirectConnectGatewayAssociationsRequest,describe_direct_connect_gateway_associations_request\nDescribeDirectConnectGatewayAssociationsResult,describe_direct_connect_gateway_associations_result\nDescribeDirectConnectGatewayAttachmentsRequest,describe_direct_connect_gateway_attachments_request\nDescribeDirectConnectGatewayAttachmentsResult,describe_direct_connect_gateway_attachments_result\nDescribeDirectConnectGatewaysRequest,describe_direct_connect_gateways_request\nDescribeDirectConnectGatewaysResult,describe_direct_connect_gateways_result\nDescribeDirectoriesRequest,describe_directories_request\nDescribeDirectoriesResult,describe_directories_result\nDescribeDirectoryConfigsRequest,describe_directory_configs_request\nDescribeDirectoryConfigsResult,describe_directory_configs_result\nDescribeDiscovererRequest,describe_discoverer_request\nDescribeDiscovererResponse,describe_discoverer_response\nDescribeDiscoveryJobRequest,describe_discovery_job_request\nDescribeDiscoveryJobResponse,describe_discovery_job_response\nDescribeDocumentClassificationJobRequest,describe_document_classification_job_request\nDescribeDocumentClassificationJobResponse,describe_document_classification_job_response\nDescribeDocumentClassifierRequest,describe_document_classifier_request\nDescribeDocumentClassifierResponse,describe_document_classifier_response\nDescribeDocumentPermissionRequest,describe_document_permission_request\nDescribeDocumentPermissionResponse,describe_document_permission_response\nDescribeDocumentRequest,describe_document_request\nDescribeDocumentResult,describe_document_result\nDescribeDocumentVersionsRequest,describe_document_versions_request\nDescribeDocumentVersionsResponse,describe_document_versions_response\nDescribeDomainAutoTunesRequest,describe_domain_auto_tunes_request\nDescribeDomainAutoTunesResponse,describe_domain_auto_tunes_response\nDescribeDomainChangeProgressRequest,describe_domain_change_progress_request\nDescribeDomainChangeProgressResponse,describe_domain_change_progress_response\nDescribeDomainConfigRequest,describe_domain_config_request\nDescribeDomainConfigResponse,describe_domain_config_response\nDescribeDomainConfigurationRequest,describe_domain_configuration_request\nDescribeDomainConfigurationResponse,describe_domain_configuration_response\nDescribeDomainControllersRequest,describe_domain_controllers_request\nDescribeDomainControllersResult,describe_domain_controllers_result\nDescribeDomainEndpointOptionsRequest,describe_domain_endpoint_options_request\nDescribeDomainEndpointOptionsResponse,describe_domain_endpoint_options_response\nDescribeDomainHealthRequest,describe_domain_health_request\nDescribeDomainHealthResponse,describe_domain_health_response\nDescribeDomainInput,describe_domain_input\nDescribeDomainNodesRequest,describe_domain_nodes_request\nDescribeDomainNodesResponse,describe_domain_nodes_response\nDescribeDomainRequest,describe_domain_request\nDescribeDomainResponse,describe_domain_response\nDescribeDomainResult,describe_domain_result\nDescribeDomainsRequest,describe_domains_request\nDescribeDomainsResponse,describe_domains_response\nDescribeDominantLanguageDetectionJobRequest,describe_dominant_language_detection_job_request\nDescribeDominantLanguageDetectionJobResponse,describe_dominant_language_detection_job_response\nDescribeDraftAppVersionResourcesImportStatusRequest,describe_draft_app_version_resources_import_status_request\nDescribeDraftAppVersionResourcesImportStatusResponse,describe_draft_app_version_resources_import_status_response\nDescribeDryRunProgressRequest,describe_dry_run_progress_request\nDescribeDryRunProgressResponse,describe_dry_run_progress_response\nDescribeEC2InstanceLimitsInput,describe_ec2_instance_limits_input\nDescribeEC2InstanceLimitsOutput,describe_ec2_instance_limits_output\nDescribeEcsClustersRequest,describe_ecs_clusters_request\nDescribeEcsClustersResult,describe_ecs_clusters_result\nDescribeEdgeConfigurationInput,describe_edge_configuration_input\nDescribeEdgeConfigurationOutput,describe_edge_configuration_output\nDescribeEdgeDeploymentPlanRequest,describe_edge_deployment_plan_request\nDescribeEdgeDeploymentPlanResponse,describe_edge_deployment_plan_response\nDescribeEdgePackagingJobRequest,describe_edge_packaging_job_request\nDescribeEdgePackagingJobResponse,describe_edge_packaging_job_response\nDescribeEffectiveInstanceAssociationsRequest,describe_effective_instance_associations_request\nDescribeEffectiveInstanceAssociationsResult,describe_effective_instance_associations_result\nDescribeEffectivePatchesForPatchBaselineRequest,describe_effective_patches_for_patch_baseline_request\nDescribeEffectivePatchesForPatchBaselineResult,describe_effective_patches_for_patch_baseline_result\nDescribeEffectivePolicyRequest,describe_effective_policy_request\nDescribeEffectivePolicyResponse,describe_effective_policy_response\nDescribeEgressOnlyInternetGatewaysRequest,describe_egress_only_internet_gateways_request\nDescribeEgressOnlyInternetGatewaysResult,describe_egress_only_internet_gateways_result\nDescribeElasticGpusRequest,describe_elastic_gpus_request\nDescribeElasticGpusResult,describe_elastic_gpus_result\nDescribeElasticIpsRequest,describe_elastic_ips_request\nDescribeElasticIpsResult,describe_elastic_ips_result\nDescribeElasticLoadBalancersRequest,describe_elastic_load_balancers_request\nDescribeElasticLoadBalancersResult,describe_elastic_load_balancers_result\nDescribeElasticsearchDomainConfigRequest,describe_elasticsearch_domain_config_request\nDescribeElasticsearchDomainConfigResponse,describe_elasticsearch_domain_config_response\nDescribeElasticsearchDomainRequest,describe_elasticsearch_domain_request\nDescribeElasticsearchDomainResponse,describe_elasticsearch_domain_response\nDescribeElasticsearchDomainsRequest,describe_elasticsearch_domains_request\nDescribeElasticsearchDomainsResponse,describe_elasticsearch_domains_response\nDescribeElasticsearchInstanceTypeLimitsRequest,describe_elasticsearch_instance_type_limits_request\nDescribeElasticsearchInstanceTypeLimitsResponse,describe_elasticsearch_instance_type_limits_response\nDescribeEmailMonitoringConfigurationRequest,describe_email_monitoring_configuration_request\nDescribeEmailMonitoringConfigurationResponse,describe_email_monitoring_configuration_response\nDescribeEmergencyContactSettingsResponse,describe_emergency_contact_settings_response\nDescribeEndPointStateInput,describe_end_point_state_input\nDescribeEndPointStateOutput,describe_end_point_state_output\nDescribeEndpointAccessMessage,describe_endpoint_access_message\nDescribeEndpointAuthorizationMessage,describe_endpoint_authorization_message\nDescribeEndpointConfigInput,describe_endpoint_config_input\nDescribeEndpointConfigOutput,describe_endpoint_config_output\nDescribeEndpointGroupRequest,describe_endpoint_group_request\nDescribeEndpointGroupResponse,describe_endpoint_group_response\nDescribeEndpointInput,describe_endpoint_input\nDescribeEndpointOutput,describe_endpoint_output\nDescribeEndpointRequest,describe_endpoint_request\nDescribeEndpointResponse,describe_endpoint_response\nDescribeEndpointSettingsMessage,describe_endpoint_settings_message\nDescribeEndpointSettingsResponse,describe_endpoint_settings_response\nDescribeEndpointTypesMessage,describe_endpoint_types_message\nDescribeEndpointTypesResponse,describe_endpoint_types_response\nDescribeEndpointsMessage,describe_endpoints_message\nDescribeEndpointsRequest,describe_endpoints_request\nDescribeEndpointsResponse,describe_endpoints_response\nDescribeEngagementRequest,describe_engagement_request\nDescribeEngagementResult,describe_engagement_result\nDescribeEngineDefaultClusterParametersMessage,describe_engine_default_cluster_parameters_message\nDescribeEngineDefaultClusterParametersResult,describe_engine_default_cluster_parameters_result\nDescribeEngineDefaultParametersMessage,describe_engine_default_parameters_message\nDescribeEngineDefaultParametersResult,describe_engine_default_parameters_result\nDescribeEngineVersionsMessage,describe_engine_versions_message\nDescribeEngineVersionsRequest,describe_engine_versions_request\nDescribeEngineVersionsResponse,describe_engine_versions_response\nDescribeEntitiesDetectionJobRequest,describe_entities_detection_job_request\nDescribeEntitiesDetectionJobResponse,describe_entities_detection_job_response\nDescribeEntitiesDetectionV2JobRequest,describe_entities_detection_v2_job_request\nDescribeEntitiesDetectionV2JobResponse,describe_entities_detection_v2_job_response\nDescribeEntitlementsRequest,describe_entitlements_request\nDescribeEntitlementsResult,describe_entitlements_result\nDescribeEntityAggregatesForOrganizationRequest,describe_entity_aggregates_for_organization_request\nDescribeEntityAggregatesForOrganizationResponse,describe_entity_aggregates_for_organization_response\nDescribeEntityAggregatesRequest,describe_entity_aggregates_request\nDescribeEntityAggregatesResponse,describe_entity_aggregates_response\nDescribeEntityRecognizerRequest,describe_entity_recognizer_request\nDescribeEntityRecognizerResponse,describe_entity_recognizer_response\nDescribeEntityRequest,describe_entity_request\nDescribeEntityResponse,describe_entity_response\nDescribeEnvironmentHealthRequest,describe_environment_health_request\nDescribeEnvironmentHealthResult,describe_environment_health_result\nDescribeEnvironmentManagedActionHistoryRequest,describe_environment_managed_action_history_request\nDescribeEnvironmentManagedActionHistoryResult,describe_environment_managed_action_history_result\nDescribeEnvironmentManagedActionsRequest,describe_environment_managed_actions_request\nDescribeEnvironmentManagedActionsResult,describe_environment_managed_actions_result\nDescribeEnvironmentMembershipsRequest,describe_environment_memberships_request\nDescribeEnvironmentMembershipsResult,describe_environment_memberships_result\nDescribeEnvironmentResourcesMessage,describe_environment_resources_message\nDescribeEnvironmentStatusRequest,describe_environment_status_request\nDescribeEnvironmentStatusResult,describe_environment_status_result\nDescribeEnvironmentsMessage,describe_environments_message\nDescribeEnvironmentsRequest,describe_environments_request\nDescribeEnvironmentsResult,describe_environments_result\nDescribeEphemerisRequest,describe_ephemeris_request\nDescribeEphemerisResponse,describe_ephemeris_response\nDescribeEvaluationFormRequest,describe_evaluation_form_request\nDescribeEvaluationFormResponse,describe_evaluation_form_response\nDescribeEvaluationsInput,describe_evaluations_input\nDescribeEvaluationsOutput,describe_evaluations_output\nDescribeEventAggregatesRequest,describe_event_aggregates_request\nDescribeEventAggregatesResponse,describe_event_aggregates_response\nDescribeEventBusRequest,describe_event_bus_request\nDescribeEventBusResponse,describe_event_bus_response\nDescribeEventCategoriesMessage,describe_event_categories_message\nDescribeEventCategoriesResponse,describe_event_categories_response\nDescribeEventConfigurationsResponse,describe_event_configurations_response\nDescribeEventDetailsForOrganizationRequest,describe_event_details_for_organization_request\nDescribeEventDetailsForOrganizationResponse,describe_event_details_for_organization_response\nDescribeEventDetailsRequest,describe_event_details_request\nDescribeEventDetailsResponse,describe_event_details_response\nDescribeEventSourceRequest,describe_event_source_request\nDescribeEventSourceResponse,describe_event_source_response\nDescribeEventSourcesConfigResponse,describe_event_sources_config_response\nDescribeEventSubscriptionsMessage,describe_event_subscriptions_message\nDescribeEventSubscriptionsResponse,describe_event_subscriptions_response\nDescribeEventTopicsRequest,describe_event_topics_request\nDescribeEventTopicsResult,describe_event_topics_result\nDescribeEventTrackerRequest,describe_event_tracker_request\nDescribeEventTrackerResponse,describe_event_tracker_response\nDescribeEventTypesRequest,describe_event_types_request\nDescribeEventTypesResponse,describe_event_types_response\nDescribeEventsDetectionJobRequest,describe_events_detection_job_request\nDescribeEventsDetectionJobResponse,describe_events_detection_job_response\nDescribeEventsForOrganizationRequest,describe_events_for_organization_request\nDescribeEventsForOrganizationResponse,describe_events_for_organization_response\nDescribeEventsMessage,describe_events_message\nDescribeEventsRequest,describe_events_request\nDescribeEventsResponse,describe_events_response\nDescribeExclusionsRequest,describe_exclusions_request\nDescribeExclusionsResponse,describe_exclusions_response\nDescribeExecutionInput,describe_execution_input\nDescribeExecutionOutput,describe_execution_output\nDescribeExecutionRequest,describe_execution_request\nDescribeExecutionResponse,describe_execution_response\nDescribeExperienceRequest,describe_experience_request\nDescribeExperienceResponse,describe_experience_response\nDescribeExperimentRequest,describe_experiment_request\nDescribeExperimentResponse,describe_experiment_response\nDescribeExplainabilityExportRequest,describe_explainability_export_request\nDescribeExplainabilityExportResponse,describe_explainability_export_response\nDescribeExplainabilityRequest,describe_explainability_request\nDescribeExplainabilityResponse,describe_explainability_response\nDescribeExportConfigurationsRequest,describe_export_configurations_request\nDescribeExportConfigurationsResponse,describe_export_configurations_response\nDescribeExportImageTasksRequest,describe_export_image_tasks_request\nDescribeExportImageTasksResult,describe_export_image_tasks_result\nDescribeExportInput,describe_export_input\nDescribeExportOutput,describe_export_output\nDescribeExportRequest,describe_export_request\nDescribeExportResponse,describe_export_response\nDescribeExportTasksMessage,describe_export_tasks_message\nDescribeExportTasksRequest,describe_export_tasks_request\nDescribeExportTasksResponse,describe_export_tasks_response\nDescribeExportTasksResult,describe_export_tasks_result\nDescribeExpressionsRequest,describe_expressions_request\nDescribeExpressionsResponse,describe_expressions_response\nDescribeExtensionPackAssociationsMessage,describe_extension_pack_associations_message\nDescribeExtensionPackAssociationsResponse,describe_extension_pack_associations_response\nDescribeFHIRDatastoreRequest,describe_fhir_datastore_request\nDescribeFHIRDatastoreResponse,describe_fhir_datastore_response\nDescribeFHIRExportJobRequest,describe_fhir_export_job_request\nDescribeFHIRExportJobResponse,describe_fhir_export_job_response\nDescribeFHIRImportJobRequest,describe_fhir_import_job_request\nDescribeFHIRImportJobResponse,describe_fhir_import_job_response\nDescribeFaqRequest,describe_faq_request\nDescribeFaqResponse,describe_faq_response\nDescribeFargateProfileRequest,describe_fargate_profile_request\nDescribeFargateProfileResponse,describe_fargate_profile_response\nDescribeFastLaunchImagesRequest,describe_fast_launch_images_request\nDescribeFastLaunchImagesResult,describe_fast_launch_images_result\nDescribeFastLaunchImagesSuccessItem,describe_fast_launch_images_success_item\nDescribeFastSnapshotRestoreSuccessItem,describe_fast_snapshot_restore_success_item\nDescribeFastSnapshotRestoresRequest,describe_fast_snapshot_restores_request\nDescribeFastSnapshotRestoresResult,describe_fast_snapshot_restores_result\nDescribeFeatureGroupRequest,describe_feature_group_request\nDescribeFeatureGroupResponse,describe_feature_group_response\nDescribeFeatureMetadataRequest,describe_feature_metadata_request\nDescribeFeatureMetadataResponse,describe_feature_metadata_response\nDescribeFeatureTransformationRequest,describe_feature_transformation_request\nDescribeFeatureTransformationResponse,describe_feature_transformation_response\nDescribeFeaturedResultsSetRequest,describe_featured_results_set_request\nDescribeFeaturedResultsSetResponse,describe_featured_results_set_response\nDescribeFeedbackRequest,describe_feedback_request\nDescribeFeedbackResponse,describe_feedback_response\nDescribeFileCachesRequest,describe_file_caches_request\nDescribeFileCachesResponse,describe_file_caches_response\nDescribeFileSystemAliasesRequest,describe_file_system_aliases_request\nDescribeFileSystemAliasesResponse,describe_file_system_aliases_response\nDescribeFileSystemAssociationsInput,describe_file_system_associations_input\nDescribeFileSystemAssociationsOutput,describe_file_system_associations_output\nDescribeFileSystemPolicyRequest,describe_file_system_policy_request\nDescribeFileSystemsRequest,describe_file_systems_request\nDescribeFileSystemsResponse,describe_file_systems_response\nDescribeFilterRequest,describe_filter_request\nDescribeFilterResponse,describe_filter_response\nDescribeFindingsRequest,describe_findings_request\nDescribeFindingsResponse,describe_findings_response\nDescribeFirewallPolicyRequest,describe_firewall_policy_request\nDescribeFirewallPolicyResponse,describe_firewall_policy_response\nDescribeFirewallRequest,describe_firewall_request\nDescribeFirewallResponse,describe_firewall_response\nDescribeFleetAdvisorCollectorsRequest,describe_fleet_advisor_collectors_request\nDescribeFleetAdvisorCollectorsResponse,describe_fleet_advisor_collectors_response\nDescribeFleetAdvisorDatabasesRequest,describe_fleet_advisor_databases_request\nDescribeFleetAdvisorDatabasesResponse,describe_fleet_advisor_databases_response\nDescribeFleetAdvisorLsaAnalysisRequest,describe_fleet_advisor_lsa_analysis_request\nDescribeFleetAdvisorLsaAnalysisResponse,describe_fleet_advisor_lsa_analysis_response\nDescribeFleetAdvisorSchemaObjectSummaryRequest,describe_fleet_advisor_schema_object_summary_request\nDescribeFleetAdvisorSchemaObjectSummaryResponse,describe_fleet_advisor_schema_object_summary_response\nDescribeFleetAdvisorSchemasRequest,describe_fleet_advisor_schemas_request\nDescribeFleetAdvisorSchemasResponse,describe_fleet_advisor_schemas_response\nDescribeFleetAttributesInput,describe_fleet_attributes_input\nDescribeFleetAttributesOutput,describe_fleet_attributes_output\nDescribeFleetCapacityInput,describe_fleet_capacity_input\nDescribeFleetCapacityOutput,describe_fleet_capacity_output\nDescribeFleetError,describe_fleet_error\nDescribeFleetEventsInput,describe_fleet_events_input\nDescribeFleetEventsOutput,describe_fleet_events_output\nDescribeFleetHistoryRequest,describe_fleet_history_request\nDescribeFleetHistoryResult,describe_fleet_history_result\nDescribeFleetInstancesRequest,describe_fleet_instances_request\nDescribeFleetInstancesResult,describe_fleet_instances_result\nDescribeFleetLocationAttributesInput,describe_fleet_location_attributes_input\nDescribeFleetLocationAttributesOutput,describe_fleet_location_attributes_output\nDescribeFleetLocationCapacityInput,describe_fleet_location_capacity_input\nDescribeFleetLocationCapacityOutput,describe_fleet_location_capacity_output\nDescribeFleetLocationUtilizationInput,describe_fleet_location_utilization_input\nDescribeFleetLocationUtilizationOutput,describe_fleet_location_utilization_output\nDescribeFleetMetadataRequest,describe_fleet_metadata_request\nDescribeFleetMetadataResponse,describe_fleet_metadata_response\nDescribeFleetMetricRequest,describe_fleet_metric_request\nDescribeFleetMetricResponse,describe_fleet_metric_response\nDescribeFleetPortSettingsInput,describe_fleet_port_settings_input\nDescribeFleetPortSettingsOutput,describe_fleet_port_settings_output\nDescribeFleetRequest,describe_fleet_request\nDescribeFleetResponse,describe_fleet_response\nDescribeFleetUtilizationInput,describe_fleet_utilization_input\nDescribeFleetUtilizationOutput,describe_fleet_utilization_output\nDescribeFleetsInstances,describe_fleets_instances\nDescribeFleetsRequest,describe_fleets_request\nDescribeFleetsResult,describe_fleets_result\nDescribeFlowDefinitionRequest,describe_flow_definition_request\nDescribeFlowDefinitionResponse,describe_flow_definition_response\nDescribeFlowExecutionRecordsRequest,describe_flow_execution_records_request\nDescribeFlowExecutionRecordsResponse,describe_flow_execution_records_response\nDescribeFlowLogsRequest,describe_flow_logs_request\nDescribeFlowLogsResult,describe_flow_logs_result\nDescribeFlowRequest,describe_flow_request\nDescribeFlowResponse,describe_flow_response\nDescribeFlywheelIterationRequest,describe_flywheel_iteration_request\nDescribeFlywheelIterationResponse,describe_flywheel_iteration_response\nDescribeFlywheelRequest,describe_flywheel_request\nDescribeFlywheelResponse,describe_flywheel_response\nDescribeFolderContentsRequest,describe_folder_contents_request\nDescribeFolderContentsResponse,describe_folder_contents_response\nDescribeFolderPermissionsRequest,describe_folder_permissions_request\nDescribeFolderPermissionsResponse,describe_folder_permissions_response\nDescribeFolderRequest,describe_folder_request\nDescribeFolderResolvedPermissionsRequest,describe_folder_resolved_permissions_request\nDescribeFolderResolvedPermissionsResponse,describe_folder_resolved_permissions_response\nDescribeFolderResponse,describe_folder_response\nDescribeForecastExportJobRequest,describe_forecast_export_job_request\nDescribeForecastExportJobResponse,describe_forecast_export_job_response\nDescribeForecastRequest,describe_forecast_request\nDescribeForecastResponse,describe_forecast_response\nDescribeFpgaImageAttributeRequest,describe_fpga_image_attribute_request\nDescribeFpgaImageAttributeResult,describe_fpga_image_attribute_result\nDescribeFpgaImagesRequest,describe_fpga_images_request\nDescribeFpgaImagesResult,describe_fpga_images_result\nDescribeFrameworkInput,describe_framework_input\nDescribeFrameworkOutput,describe_framework_output\nDescribeFraudsterRegistrationJobRequest,describe_fraudster_registration_job_request\nDescribeFraudsterRegistrationJobResponse,describe_fraudster_registration_job_response\nDescribeFraudsterRequest,describe_fraudster_request\nDescribeFraudsterResponse,describe_fraudster_response\nDescribeFunctionRequest,describe_function_request\nDescribeFunctionResult,describe_function_result\nDescribeGameServerGroupInput,describe_game_server_group_input\nDescribeGameServerGroupOutput,describe_game_server_group_output\nDescribeGameServerInput,describe_game_server_input\nDescribeGameServerInstancesInput,describe_game_server_instances_input\nDescribeGameServerInstancesOutput,describe_game_server_instances_output\nDescribeGameServerOutput,describe_game_server_output\nDescribeGameSessionDetailsInput,describe_game_session_details_input\nDescribeGameSessionDetailsOutput,describe_game_session_details_output\nDescribeGameSessionPlacementInput,describe_game_session_placement_input\nDescribeGameSessionPlacementOutput,describe_game_session_placement_output\nDescribeGameSessionQueuesInput,describe_game_session_queues_input\nDescribeGameSessionQueuesOutput,describe_game_session_queues_output\nDescribeGameSessionsInput,describe_game_sessions_input\nDescribeGameSessionsOutput,describe_game_sessions_output\nDescribeGatewayCapabilityConfigurationRequest,describe_gateway_capability_configuration_request\nDescribeGatewayCapabilityConfigurationResponse,describe_gateway_capability_configuration_response\nDescribeGatewayInformationInput,describe_gateway_information_input\nDescribeGatewayInformationOutput,describe_gateway_information_output\nDescribeGatewayInstanceRequest,describe_gateway_instance_request\nDescribeGatewayInstanceResponse,describe_gateway_instance_response\nDescribeGatewayRequest,describe_gateway_request\nDescribeGatewayResponse,describe_gateway_response\nDescribeGatewayRouteInput,describe_gateway_route_input\nDescribeGatewayRouteOutput,describe_gateway_route_output\nDescribeGeofenceCollectionRequest,describe_geofence_collection_request\nDescribeGeofenceCollectionResponse,describe_geofence_collection_response\nDescribeGlobalClustersMessage,describe_global_clusters_message\nDescribeGlobalNetworksRequest,describe_global_networks_request\nDescribeGlobalNetworksResponse,describe_global_networks_response\nDescribeGlobalReplicationGroupsMessage,describe_global_replication_groups_message\nDescribeGlobalReplicationGroupsResult,describe_global_replication_groups_result\nDescribeGlobalSettingsOutput,describe_global_settings_output\nDescribeGlobalTableInput,describe_global_table_input\nDescribeGlobalTableOutput,describe_global_table_output\nDescribeGlobalTableSettingsInput,describe_global_table_settings_input\nDescribeGlobalTableSettingsOutput,describe_global_table_settings_output\nDescribeGroupMembershipRequest,describe_group_membership_request\nDescribeGroupMembershipResponse,describe_group_membership_response\nDescribeGroupRequest,describe_group_request\nDescribeGroupResponse,describe_group_response\nDescribeGroupsRequest,describe_groups_request\nDescribeGroupsResponse,describe_groups_response\nDescribeHandshakeRequest,describe_handshake_request\nDescribeHandshakeResponse,describe_handshake_response\nDescribeHapgRequest,describe_hapg_request\nDescribeHapgResponse,describe_hapg_response\nDescribeHarvestJobRequest,describe_harvest_job_request\nDescribeHarvestJobResponse,describe_harvest_job_response\nDescribeHealthServiceStatusForOrganizationResponse,describe_health_service_status_for_organization_response\nDescribeHomeRegionControlsRequest,describe_home_region_controls_request\nDescribeHomeRegionControlsResult,describe_home_region_controls_result\nDescribeHostKeyRequest,describe_host_key_request\nDescribeHostKeyResponse,describe_host_key_response\nDescribeHostReservationOfferingsRequest,describe_host_reservation_offerings_request\nDescribeHostReservationOfferingsResult,describe_host_reservation_offerings_result\nDescribeHostReservationsRequest,describe_host_reservations_request\nDescribeHostReservationsResult,describe_host_reservations_result\nDescribeHostedConnectionsRequest,describe_hosted_connections_request\nDescribeHostsRequest,describe_hosts_request\nDescribeHostsResult,describe_hosts_result\nDescribeHoursOfOperationRequest,describe_hours_of_operation_request\nDescribeHoursOfOperationResponse,describe_hours_of_operation_response\nDescribeHsmClientCertificatesMessage,describe_hsm_client_certificates_message\nDescribeHsmConfigurationsMessage,describe_hsm_configurations_message\nDescribeHsmRequest,describe_hsm_request\nDescribeHsmResponse,describe_hsm_response\nDescribeHubContentRequest,describe_hub_content_request\nDescribeHubContentResponse,describe_hub_content_response\nDescribeHubRequest,describe_hub_request\nDescribeHubResponse,describe_hub_response\nDescribeHumanLoopRequest,describe_human_loop_request\nDescribeHumanLoopResponse,describe_human_loop_response\nDescribeHumanTaskUiRequest,describe_human_task_ui_request\nDescribeHumanTaskUiResponse,describe_human_task_ui_response\nDescribeHyperParameterTuningJobRequest,describe_hyper_parameter_tuning_job_request\nDescribeHyperParameterTuningJobResponse,describe_hyper_parameter_tuning_job_response\nDescribeIAMPolicyAssignmentRequest,describe_iam_policy_assignment_request\nDescribeIAMPolicyAssignmentResponse,describe_iam_policy_assignment_response\nDescribeICD10CMInferenceJobRequest,describe_icd10_cm_inference_job_request\nDescribeICD10CMInferenceJobResponse,describe_icd10_cm_inference_job_response\nDescribeIamInstanceProfileAssociationsRequest,describe_iam_instance_profile_associations_request\nDescribeIamInstanceProfileAssociationsResult,describe_iam_instance_profile_associations_result\nDescribeIdFormatRequest,describe_id_format_request\nDescribeIdFormatResult,describe_id_format_result\nDescribeIdentityIdFormatRequest,describe_identity_id_format_request\nDescribeIdentityIdFormatResult,describe_identity_id_format_result\nDescribeIdentityInput,describe_identity_input\nDescribeIdentityPoolInput,describe_identity_pool_input\nDescribeIdentityPoolUsageRequest,describe_identity_pool_usage_request\nDescribeIdentityPoolUsageResponse,describe_identity_pool_usage_response\nDescribeIdentityProviderConfigRequest,describe_identity_provider_config_request\nDescribeIdentityProviderConfigResponse,describe_identity_provider_config_response\nDescribeIdentityProviderConfigurationRequest,describe_identity_provider_configuration_request\nDescribeIdentityProviderConfigurationResponse,describe_identity_provider_configuration_response\nDescribeIdentityProviderRequest,describe_identity_provider_request\nDescribeIdentityProviderResponse,describe_identity_provider_response\nDescribeIdentityUsageRequest,describe_identity_usage_request\nDescribeIdentityUsageResponse,describe_identity_usage_response\nDescribeImageAttributeRequest,describe_image_attribute_request\nDescribeImageBuildersRequest,describe_image_builders_request\nDescribeImageBuildersResult,describe_image_builders_result\nDescribeImageGenerationConfigurationInput,describe_image_generation_configuration_input\nDescribeImageGenerationConfigurationOutput,describe_image_generation_configuration_output\nDescribeImagePermissionsRequest,describe_image_permissions_request\nDescribeImagePermissionsResult,describe_image_permissions_result\nDescribeImageReplicationStatusRequest,describe_image_replication_status_request\nDescribeImageReplicationStatusResponse,describe_image_replication_status_response\nDescribeImageRequest,describe_image_request\nDescribeImageResponse,describe_image_response\nDescribeImageScanFindingsRequest,describe_image_scan_findings_request\nDescribeImageScanFindingsResponse,describe_image_scan_findings_response\nDescribeImageTagsRequest,describe_image_tags_request\nDescribeImageTagsResponse,describe_image_tags_response\nDescribeImageVersionRequest,describe_image_version_request\nDescribeImageVersionResponse,describe_image_version_response\nDescribeImagesFilter,describe_images_filter\nDescribeImagesRequest,describe_images_request\nDescribeImagesResponse,describe_images_response\nDescribeImagesResult,describe_images_result\nDescribeImportImageTasksRequest,describe_import_image_tasks_request\nDescribeImportImageTasksResult,describe_import_image_tasks_result\nDescribeImportInput,describe_import_input\nDescribeImportOutput,describe_import_output\nDescribeImportRequest,describe_import_request\nDescribeImportResponse,describe_import_response\nDescribeImportSnapshotTasksRequest,describe_import_snapshot_tasks_request\nDescribeImportSnapshotTasksResult,describe_import_snapshot_tasks_result\nDescribeImportTasksRequest,describe_import_tasks_request\nDescribeImportTasksResponse,describe_import_tasks_response\nDescribeInboundConnectionsRequest,describe_inbound_connections_request\nDescribeInboundConnectionsResponse,describe_inbound_connections_response\nDescribeInboundCrossClusterSearchConnectionsRequest,describe_inbound_cross_cluster_search_connections_request\nDescribeInboundCrossClusterSearchConnectionsResponse,describe_inbound_cross_cluster_search_connections_response\nDescribeInboundDmarcSettingsRequest,describe_inbound_dmarc_settings_request\nDescribeInboundDmarcSettingsResponse,describe_inbound_dmarc_settings_response\nDescribeIndexFieldsRequest,describe_index_fields_request\nDescribeIndexFieldsResponse,describe_index_fields_response\nDescribeIndexRequest,describe_index_request\nDescribeIndexResponse,describe_index_response\nDescribeInferenceExperimentRequest,describe_inference_experiment_request\nDescribeInferenceExperimentResponse,describe_inference_experiment_response\nDescribeInferenceRecommendationsJobRequest,describe_inference_recommendations_job_request\nDescribeInferenceRecommendationsJobResponse,describe_inference_recommendations_job_response\nDescribeInferenceSchedulerRequest,describe_inference_scheduler_request\nDescribeInferenceSchedulerResponse,describe_inference_scheduler_response\nDescribeIngestionRequest,describe_ingestion_request\nDescribeIngestionResponse,describe_ingestion_response\nDescribeInputDeviceRequest,describe_input_device_request\nDescribeInputDeviceResponse,describe_input_device_response\nDescribeInputDeviceThumbnailRequest,describe_input_device_thumbnail_request\nDescribeInputDeviceThumbnailResponse,describe_input_device_thumbnail_response\nDescribeInputRequest,describe_input_request\nDescribeInputResponse,describe_input_response\nDescribeInputSecurityGroupRequest,describe_input_security_group_request\nDescribeInputSecurityGroupResponse,describe_input_security_group_response\nDescribeInsightRequest,describe_insight_request\nDescribeInsightResponse,describe_insight_response\nDescribeInsightRulesInput,describe_insight_rules_input\nDescribeInsightRulesOutput,describe_insight_rules_output\nDescribeInstanceAccessControlAttributeConfigurationRequest,describe_instance_access_control_attribute_configuration_request\nDescribeInstanceAccessControlAttributeConfigurationResponse,describe_instance_access_control_attribute_configuration_response\nDescribeInstanceAssociationsStatusRequest,describe_instance_associations_status_request\nDescribeInstanceAssociationsStatusResult,describe_instance_associations_status_result\nDescribeInstanceAttributeRequest,describe_instance_attribute_request\nDescribeInstanceAttributeResponse,describe_instance_attribute_response\nDescribeInstanceConnectEndpointsRequest,describe_instance_connect_endpoints_request\nDescribeInstanceConnectEndpointsResult,describe_instance_connect_endpoints_result\nDescribeInstanceCreditSpecificationsRequest,describe_instance_credit_specifications_request\nDescribeInstanceCreditSpecificationsResult,describe_instance_credit_specifications_result\nDescribeInstanceEventNotificationAttributesRequest,describe_instance_event_notification_attributes_request\nDescribeInstanceEventNotificationAttributesResult,describe_instance_event_notification_attributes_result\nDescribeInstanceEventWindowsRequest,describe_instance_event_windows_request\nDescribeInstanceEventWindowsResult,describe_instance_event_windows_result\nDescribeInstanceInformationRequest,describe_instance_information_request\nDescribeInstanceInformationResult,describe_instance_information_result\nDescribeInstancePatchStatesForPatchGroupRequest,describe_instance_patch_states_for_patch_group_request\nDescribeInstancePatchStatesForPatchGroupResult,describe_instance_patch_states_for_patch_group_result\nDescribeInstancePatchStatesRequest,describe_instance_patch_states_request\nDescribeInstancePatchStatesResult,describe_instance_patch_states_result\nDescribeInstancePatchesRequest,describe_instance_patches_request\nDescribeInstancePatchesResult,describe_instance_patches_result\nDescribeInstanceProfilesMessage,describe_instance_profiles_message\nDescribeInstanceProfilesResponse,describe_instance_profiles_response\nDescribeInstanceRefreshesAnswer,describe_instance_refreshes_answer\nDescribeInstanceRefreshesType,describe_instance_refreshes_type\nDescribeInstanceRequest,describe_instance_request\nDescribeInstanceResponse,describe_instance_response\nDescribeInstanceStatusRequest,describe_instance_status_request\nDescribeInstanceStatusResult,describe_instance_status_result\nDescribeInstanceStorageConfigRequest,describe_instance_storage_config_request\nDescribeInstanceStorageConfigResponse,describe_instance_storage_config_response\nDescribeInstanceTypeLimitsRequest,describe_instance_type_limits_request\nDescribeInstanceTypeLimitsResponse,describe_instance_type_limits_response\nDescribeInstanceTypeOfferingsRequest,describe_instance_type_offerings_request\nDescribeInstanceTypeOfferingsResult,describe_instance_type_offerings_result\nDescribeInstanceTypesRequest,describe_instance_types_request\nDescribeInstanceTypesResult,describe_instance_types_result\nDescribeInstancesHealthRequest,describe_instances_health_request\nDescribeInstancesHealthResult,describe_instances_health_result\nDescribeInstancesInput,describe_instances_input\nDescribeInstancesOutput,describe_instances_output\nDescribeInstancesRequest,describe_instances_request\nDescribeInstancesResult,describe_instances_result\nDescribeIntentRequest,describe_intent_request\nDescribeIntentResponse,describe_intent_response\nDescribeInterconnectLoaRequest,describe_interconnect_loa_request\nDescribeInterconnectLoaResponse,describe_interconnect_loa_response\nDescribeInterconnectsRequest,describe_interconnects_request\nDescribeInternetGatewaysRequest,describe_internet_gateways_request\nDescribeInternetGatewaysResult,describe_internet_gateways_result\nDescribeInventoryDeletionsRequest,describe_inventory_deletions_request\nDescribeInventoryDeletionsResult,describe_inventory_deletions_result\nDescribeIpGroupsRequest,describe_ip_groups_request\nDescribeIpGroupsResult,describe_ip_groups_result\nDescribeIpRestrictionRequest,describe_ip_restriction_request\nDescribeIpRestrictionResponse,describe_ip_restriction_response\nDescribeIpamPoolsRequest,describe_ipam_pools_request\nDescribeIpamPoolsResult,describe_ipam_pools_result\nDescribeIpamResourceDiscoveriesRequest,describe_ipam_resource_discoveries_request\nDescribeIpamResourceDiscoveriesResult,describe_ipam_resource_discoveries_result\nDescribeIpamResourceDiscoveryAssociationsRequest,describe_ipam_resource_discovery_associations_request\nDescribeIpamResourceDiscoveryAssociationsResult,describe_ipam_resource_discovery_associations_result\nDescribeIpamScopesRequest,describe_ipam_scopes_request\nDescribeIpamScopesResult,describe_ipam_scopes_result\nDescribeIpamsRequest,describe_ipams_request\nDescribeIpamsResult,describe_ipams_result\nDescribeIpv6PoolsRequest,describe_ipv6_pools_request\nDescribeIpv6PoolsResult,describe_ipv6_pools_result\nDescribeJobDefinitionsRequest,describe_job_definitions_request\nDescribeJobDefinitionsResponse,describe_job_definitions_response\nDescribeJobExecutionRequest,describe_job_execution_request\nDescribeJobExecutionResponse,describe_job_execution_response\nDescribeJobFlowsInput,describe_job_flows_input\nDescribeJobFlowsOutput,describe_job_flows_output\nDescribeJobInput,describe_job_input\nDescribeJobLogItemsRequest,describe_job_log_items_request\nDescribeJobLogItemsResponse,describe_job_log_items_response\nDescribeJobQueuesRequest,describe_job_queues_request\nDescribeJobQueuesResponse,describe_job_queues_response\nDescribeJobRequest,describe_job_request\nDescribeJobResponse,describe_job_response\nDescribeJobResult,describe_job_result\nDescribeJobRunRequest,describe_job_run_request\nDescribeJobRunResponse,describe_job_run_response\nDescribeJobTemplateRequest,describe_job_template_request\nDescribeJobTemplateResponse,describe_job_template_response\nDescribeJobsRequest,describe_jobs_request\nDescribeJobsRequestFilters,describe_jobs_request_filters\nDescribeJobsResponse,describe_jobs_response\nDescribeJournalKinesisStreamRequest,describe_journal_kinesis_stream_request\nDescribeJournalKinesisStreamResponse,describe_journal_kinesis_stream_response\nDescribeJournalS3ExportRequest,describe_journal_s3_export_request\nDescribeJournalS3ExportResponse,describe_journal_s3_export_response\nDescribeKeyPairsRequest,describe_key_pairs_request\nDescribeKeyPairsResult,describe_key_pairs_result\nDescribeKeyPhrasesDetectionJobRequest,describe_key_phrases_detection_job_request\nDescribeKeyPhrasesDetectionJobResponse,describe_key_phrases_detection_job_response\nDescribeKeyRequest,describe_key_request\nDescribeKeyResponse,describe_key_response\nDescribeKeywordsRequest,describe_keywords_request\nDescribeKeywordsResult,describe_keywords_result\nDescribeKinesisStreamingDestinationInput,describe_kinesis_streaming_destination_input\nDescribeKinesisStreamingDestinationOutput,describe_kinesis_streaming_destination_output\nDescribeLDAPSSettingsRequest,describe_ldaps_settings_request\nDescribeLDAPSSettingsResult,describe_ldaps_settings_result\nDescribeLabelGroupRequest,describe_label_group_request\nDescribeLabelGroupResponse,describe_label_group_response\nDescribeLabelRequest,describe_label_request\nDescribeLabelResponse,describe_label_response\nDescribeLabelingJobRequest,describe_labeling_job_request\nDescribeLabelingJobResponse,describe_labeling_job_response\nDescribeLagsRequest,describe_lags_request\nDescribeLanguageModelRequest,describe_language_model_request\nDescribeLanguageModelResponse,describe_language_model_response\nDescribeLaunchConfigurationTemplatesRequest,describe_launch_configuration_templates_request\nDescribeLaunchConfigurationTemplatesResponse,describe_launch_configuration_templates_response\nDescribeLaunchTemplateVersionsRequest,describe_launch_template_versions_request\nDescribeLaunchTemplateVersionsResult,describe_launch_template_versions_result\nDescribeLaunchTemplatesRequest,describe_launch_templates_request\nDescribeLaunchTemplatesResult,describe_launch_templates_result\nDescribeLayersRequest,describe_layers_request\nDescribeLayersResult,describe_layers_result\nDescribeLedgerRequest,describe_ledger_request\nDescribeLedgerResponse,describe_ledger_response\nDescribeLifecycleConfigurationRequest,describe_lifecycle_configuration_request\nDescribeLifecycleHookTypesAnswer,describe_lifecycle_hook_types_answer\nDescribeLifecycleHooksAnswer,describe_lifecycle_hooks_answer\nDescribeLifecycleHooksType,describe_lifecycle_hooks_type\nDescribeLimitsOutput,describe_limits_output\nDescribeLineageGroupRequest,describe_lineage_group_request\nDescribeLineageGroupResponse,describe_lineage_group_response\nDescribeListenerCertificatesInput,describe_listener_certificates_input\nDescribeListenerCertificatesOutput,describe_listener_certificates_output\nDescribeListenerRequest,describe_listener_request\nDescribeListenerResponse,describe_listener_response\nDescribeListenersInput,describe_listeners_input\nDescribeListenersOutput,describe_listeners_output\nDescribeLiveSourceRequest,describe_live_source_request\nDescribeLiveSourceResponse,describe_live_source_response\nDescribeLoaRequest,describe_loa_request\nDescribeLoadBalancerAttributesInput,describe_load_balancer_attributes_input\nDescribeLoadBalancerAttributesOutput,describe_load_balancer_attributes_output\nDescribeLoadBalancerPoliciesInput,describe_load_balancer_policies_input\nDescribeLoadBalancerPoliciesOutput,describe_load_balancer_policies_output\nDescribeLoadBalancerPolicyTypesInput,describe_load_balancer_policy_types_input\nDescribeLoadBalancerPolicyTypesOutput,describe_load_balancer_policy_types_output\nDescribeLoadBalancerTargetGroupsRequest,describe_load_balancer_target_groups_request\nDescribeLoadBalancerTargetGroupsResponse,describe_load_balancer_target_groups_response\nDescribeLoadBalancersInput,describe_load_balancers_input\nDescribeLoadBalancersOutput,describe_load_balancers_output\nDescribeLoadBalancersRequest,describe_load_balancers_request\nDescribeLoadBalancersResponse,describe_load_balancers_response\nDescribeLoadBasedAutoScalingRequest,describe_load_based_auto_scaling_request\nDescribeLoadBasedAutoScalingResult,describe_load_based_auto_scaling_result\nDescribeLocalGatewayRouteTableVirtualInterfaceGroupAssociationsRequest,describe_local_gateway_route_table_virtual_interface_group_associations_request\nDescribeLocalGatewayRouteTableVirtualInterfaceGroupAssociationsResult,describe_local_gateway_route_table_virtual_interface_group_associations_result\nDescribeLocalGatewayRouteTableVpcAssociationsRequest,describe_local_gateway_route_table_vpc_associations_request\nDescribeLocalGatewayRouteTableVpcAssociationsResult,describe_local_gateway_route_table_vpc_associations_result\nDescribeLocalGatewayRouteTablesRequest,describe_local_gateway_route_tables_request\nDescribeLocalGatewayRouteTablesResult,describe_local_gateway_route_tables_result\nDescribeLocalGatewayVirtualInterfaceGroupsRequest,describe_local_gateway_virtual_interface_groups_request\nDescribeLocalGatewayVirtualInterfaceGroupsResult,describe_local_gateway_virtual_interface_groups_result\nDescribeLocalGatewayVirtualInterfacesRequest,describe_local_gateway_virtual_interfaces_request\nDescribeLocalGatewayVirtualInterfacesResult,describe_local_gateway_virtual_interfaces_result\nDescribeLocalGatewaysRequest,describe_local_gateways_request\nDescribeLocalGatewaysResult,describe_local_gateways_result\nDescribeLocationAzureBlobRequest,describe_location_azure_blob_request\nDescribeLocationAzureBlobResponse,describe_location_azure_blob_response\nDescribeLocationEfsRequest,describe_location_efs_request\nDescribeLocationEfsResponse,describe_location_efs_response\nDescribeLocationFsxLustreRequest,describe_location_fsx_lustre_request\nDescribeLocationFsxLustreResponse,describe_location_fsx_lustre_response\nDescribeLocationFsxOntapRequest,describe_location_fsx_ontap_request\nDescribeLocationFsxOntapResponse,describe_location_fsx_ontap_response\nDescribeLocationFsxOpenZfsRequest,describe_location_fsx_open_zfs_request\nDescribeLocationFsxOpenZfsResponse,describe_location_fsx_open_zfs_response\nDescribeLocationFsxWindowsRequest,describe_location_fsx_windows_request\nDescribeLocationFsxWindowsResponse,describe_location_fsx_windows_response\nDescribeLocationHdfsRequest,describe_location_hdfs_request\nDescribeLocationHdfsResponse,describe_location_hdfs_response\nDescribeLocationNfsRequest,describe_location_nfs_request\nDescribeLocationNfsResponse,describe_location_nfs_response\nDescribeLocationObjectStorageRequest,describe_location_object_storage_request\nDescribeLocationObjectStorageResponse,describe_location_object_storage_response\nDescribeLocationS3Request,describe_location_s3_request\nDescribeLocationS3Response,describe_location_s3_response\nDescribeLocationSmbRequest,describe_location_smb_request\nDescribeLocationSmbResponse,describe_location_smb_response\nDescribeLogGroupsRequest,describe_log_groups_request\nDescribeLogGroupsResponse,describe_log_groups_response\nDescribeLogPatternRequest,describe_log_pattern_request\nDescribeLogPatternResponse,describe_log_pattern_response\nDescribeLogStreamsRequest,describe_log_streams_request\nDescribeLogStreamsResponse,describe_log_streams_response\nDescribeLoggingConfigurationRequest,describe_logging_configuration_request\nDescribeLoggingConfigurationResponse,describe_logging_configuration_response\nDescribeLoggingOptionsResponse,describe_logging_options_response\nDescribeLoggingStatusMessage,describe_logging_status_message\nDescribeLunaClientRequest,describe_luna_client_request\nDescribeLunaClientResponse,describe_luna_client_response\nDescribeMLModelsInput,describe_ml_models_input\nDescribeMLModelsOutput,describe_ml_models_output\nDescribeMailboxExportJobRequest,describe_mailbox_export_job_request\nDescribeMailboxExportJobResponse,describe_mailbox_export_job_response\nDescribeMaintenanceStartTimeInput,describe_maintenance_start_time_input\nDescribeMaintenanceStartTimeOutput,describe_maintenance_start_time_output\nDescribeMaintenanceWindowExecutionTaskInvocationsRequest,describe_maintenance_window_execution_task_invocations_request\nDescribeMaintenanceWindowExecutionTaskInvocationsResult,describe_maintenance_window_execution_task_invocations_result\nDescribeMaintenanceWindowExecutionTasksRequest,describe_maintenance_window_execution_tasks_request\nDescribeMaintenanceWindowExecutionTasksResult,describe_maintenance_window_execution_tasks_result\nDescribeMaintenanceWindowExecutionsRequest,describe_maintenance_window_executions_request\nDescribeMaintenanceWindowExecutionsResult,describe_maintenance_window_executions_result\nDescribeMaintenanceWindowScheduleRequest,describe_maintenance_window_schedule_request\nDescribeMaintenanceWindowScheduleResult,describe_maintenance_window_schedule_result\nDescribeMaintenanceWindowTargetsRequest,describe_maintenance_window_targets_request\nDescribeMaintenanceWindowTargetsResult,describe_maintenance_window_targets_result\nDescribeMaintenanceWindowTasksRequest,describe_maintenance_window_tasks_request\nDescribeMaintenanceWindowTasksResult,describe_maintenance_window_tasks_result\nDescribeMaintenanceWindowsForTargetRequest,describe_maintenance_windows_for_target_request\nDescribeMaintenanceWindowsForTargetResult,describe_maintenance_windows_for_target_result\nDescribeMaintenanceWindowsRequest,describe_maintenance_windows_request\nDescribeMaintenanceWindowsResult,describe_maintenance_windows_result\nDescribeMalwareScansRequest,describe_malware_scans_request\nDescribeMalwareScansResponse,describe_malware_scans_response\nDescribeManagedEndpointRequest,describe_managed_endpoint_request\nDescribeManagedEndpointResponse,describe_managed_endpoint_response\nDescribeManagedJobTemplateRequest,describe_managed_job_template_request\nDescribeManagedJobTemplateResponse,describe_managed_job_template_response\nDescribeManagedPrefixListsRequest,describe_managed_prefix_lists_request\nDescribeManagedPrefixListsResult,describe_managed_prefix_lists_result\nDescribeManagedProductsByVendorRequest,describe_managed_products_by_vendor_request\nDescribeManagedProductsByVendorResponse,describe_managed_products_by_vendor_response\nDescribeManagedRuleGroupRequest,describe_managed_rule_group_request\nDescribeManagedRuleGroupResponse,describe_managed_rule_group_response\nDescribeMapRequest,describe_map_request\nDescribeMapResponse,describe_map_response\nDescribeMapRunInput,describe_map_run_input\nDescribeMapRunOutput,describe_map_run_output\nDescribeMappedResourceConfigurationInput,describe_mapped_resource_configuration_input\nDescribeMappedResourceConfigurationOutput,describe_mapped_resource_configuration_output\nDescribeMatchmakingConfigurationsInput,describe_matchmaking_configurations_input\nDescribeMatchmakingConfigurationsOutput,describe_matchmaking_configurations_output\nDescribeMatchmakingInput,describe_matchmaking_input\nDescribeMatchmakingOutput,describe_matchmaking_output\nDescribeMatchmakingRuleSetsInput,describe_matchmaking_rule_sets_input\nDescribeMatchmakingRuleSetsOutput,describe_matchmaking_rule_sets_output\nDescribeMediaStorageConfigurationInput,describe_media_storage_configuration_input\nDescribeMediaStorageConfigurationOutput,describe_media_storage_configuration_output\nDescribeMergeConflictsInput,describe_merge_conflicts_input\nDescribeMergeConflictsOutput,describe_merge_conflicts_output\nDescribeMeshInput,describe_mesh_input\nDescribeMeshOutput,describe_mesh_output\nDescribeMetadataModelAssessmentsMessage,describe_metadata_model_assessments_message\nDescribeMetadataModelAssessmentsResponse,describe_metadata_model_assessments_response\nDescribeMetadataModelConversionsMessage,describe_metadata_model_conversions_message\nDescribeMetadataModelConversionsResponse,describe_metadata_model_conversions_response\nDescribeMetadataModelExportsAsScriptMessage,describe_metadata_model_exports_as_script_message\nDescribeMetadataModelExportsAsScriptResponse,describe_metadata_model_exports_as_script_response\nDescribeMetadataModelExportsToTargetMessage,describe_metadata_model_exports_to_target_message\nDescribeMetadataModelExportsToTargetResponse,describe_metadata_model_exports_to_target_response\nDescribeMetadataModelImportsMessage,describe_metadata_model_imports_message\nDescribeMetadataModelImportsResponse,describe_metadata_model_imports_response\nDescribeMetricAttributionRequest,describe_metric_attribution_request\nDescribeMetricAttributionResponse,describe_metric_attribution_response\nDescribeMetricCollectionTypesAnswer,describe_metric_collection_types_answer\nDescribeMetricFiltersRequest,describe_metric_filters_request\nDescribeMetricFiltersResponse,describe_metric_filters_response\nDescribeMetricSetRequest,describe_metric_set_request\nDescribeMetricSetResponse,describe_metric_set_response\nDescribeMigrationProjectsMessage,describe_migration_projects_message\nDescribeMigrationProjectsResponse,describe_migration_projects_response\nDescribeMigrationTaskRequest,describe_migration_task_request\nDescribeMigrationTaskResult,describe_migration_task_result\nDescribeMitigationActionRequest,describe_mitigation_action_request\nDescribeMitigationActionResponse,describe_mitigation_action_response\nDescribeModelBiasJobDefinitionRequest,describe_model_bias_job_definition_request\nDescribeModelBiasJobDefinitionResponse,describe_model_bias_job_definition_response\nDescribeModelCardExportJobRequest,describe_model_card_export_job_request\nDescribeModelCardExportJobResponse,describe_model_card_export_job_response\nDescribeModelCardRequest,describe_model_card_request\nDescribeModelCardResponse,describe_model_card_response\nDescribeModelExplainabilityJobDefinitionRequest,describe_model_explainability_job_definition_request\nDescribeModelExplainabilityJobDefinitionResponse,describe_model_explainability_job_definition_response\nDescribeModelInput,describe_model_input\nDescribeModelOutput,describe_model_output\nDescribeModelPackageGroupInput,describe_model_package_group_input\nDescribeModelPackageGroupOutput,describe_model_package_group_output\nDescribeModelPackageInput,describe_model_package_input\nDescribeModelPackageOutput,describe_model_package_output\nDescribeModelPackagingJobRequest,describe_model_packaging_job_request\nDescribeModelPackagingJobResponse,describe_model_packaging_job_response\nDescribeModelQualityJobDefinitionRequest,describe_model_quality_job_definition_request\nDescribeModelQualityJobDefinitionResponse,describe_model_quality_job_definition_response\nDescribeModelRequest,describe_model_request\nDescribeModelResponse,describe_model_response\nDescribeModelVersionRequest,describe_model_version_request\nDescribeModelVersionResponse,describe_model_version_response\nDescribeModelVersionsRequest,describe_model_versions_request\nDescribeModelVersionsResult,describe_model_versions_result\nDescribeMonitorRequest,describe_monitor_request\nDescribeMonitorResponse,describe_monitor_response\nDescribeMonitoringScheduleRequest,describe_monitoring_schedule_request\nDescribeMonitoringScheduleResponse,describe_monitoring_schedule_response\nDescribeMountTargetSecurityGroupsRequest,describe_mount_target_security_groups_request\nDescribeMountTargetSecurityGroupsResponse,describe_mount_target_security_groups_response\nDescribeMountTargetsRequest,describe_mount_targets_request\nDescribeMountTargetsResponse,describe_mount_targets_response\nDescribeMovingAddressesRequest,describe_moving_addresses_request\nDescribeMovingAddressesResult,describe_moving_addresses_result\nDescribeMultiRegionAccessPointOperationRequest,describe_multi_region_access_point_operation_request\nDescribeMultiRegionAccessPointOperationResult,describe_multi_region_access_point_operation_result\nDescribeMultiplexProgramRequest,describe_multiplex_program_request\nDescribeMultiplexProgramResponse,describe_multiplex_program_response\nDescribeMultiplexRequest,describe_multiplex_request\nDescribeMultiplexResponse,describe_multiplex_response\nDescribeMyUserProfileResult,describe_my_user_profile_result\nDescribeNFSFileSharesInput,describe_nfs_file_shares_input\nDescribeNFSFileSharesOutput,describe_nfs_file_shares_output\nDescribeNamespaceRequest,describe_namespace_request\nDescribeNamespaceResponse,describe_namespace_response\nDescribeNatGatewaysRequest,describe_nat_gateways_request\nDescribeNatGatewaysResult,describe_nat_gateways_result\nDescribeNetworkAclsRequest,describe_network_acls_request\nDescribeNetworkAclsResult,describe_network_acls_result\nDescribeNetworkInsightsAccessScopeAnalysesRequest,describe_network_insights_access_scope_analyses_request\nDescribeNetworkInsightsAccessScopeAnalysesResult,describe_network_insights_access_scope_analyses_result\nDescribeNetworkInsightsAccessScopesRequest,describe_network_insights_access_scopes_request\nDescribeNetworkInsightsAccessScopesResult,describe_network_insights_access_scopes_result\nDescribeNetworkInsightsAnalysesRequest,describe_network_insights_analyses_request\nDescribeNetworkInsightsAnalysesResult,describe_network_insights_analyses_result\nDescribeNetworkInsightsPathsRequest,describe_network_insights_paths_request\nDescribeNetworkInsightsPathsResult,describe_network_insights_paths_result\nDescribeNetworkInterfaceAttributeRequest,describe_network_interface_attribute_request\nDescribeNetworkInterfaceAttributeResult,describe_network_interface_attribute_result\nDescribeNetworkInterfacePermissionsRequest,describe_network_interface_permissions_request\nDescribeNetworkInterfacePermissionsResult,describe_network_interface_permissions_result\nDescribeNetworkInterfacesRequest,describe_network_interfaces_request\nDescribeNetworkInterfacesResult,describe_network_interfaces_result\nDescribeNodeAssociationStatusRequest,describe_node_association_status_request\nDescribeNodeAssociationStatusResponse,describe_node_association_status_response\nDescribeNodeConfigurationOptionsMessage,describe_node_configuration_options_message\nDescribeNodeFromTemplateJobRequest,describe_node_from_template_job_request\nDescribeNodeFromTemplateJobResponse,describe_node_from_template_job_response\nDescribeNodeRequest,describe_node_request\nDescribeNodeResponse,describe_node_response\nDescribeNodegroupRequest,describe_nodegroup_request\nDescribeNodegroupResponse,describe_nodegroup_response\nDescribeNotebookExecutionInput,describe_notebook_execution_input\nDescribeNotebookExecutionOutput,describe_notebook_execution_output\nDescribeNotebookInstanceInput,describe_notebook_instance_input\nDescribeNotebookInstanceLifecycleConfigInput,describe_notebook_instance_lifecycle_config_input\nDescribeNotebookInstanceLifecycleConfigOutput,describe_notebook_instance_lifecycle_config_output\nDescribeNotebookInstanceOutput,describe_notebook_instance_output\nDescribeNotificationConfigurationInput,describe_notification_configuration_input\nDescribeNotificationConfigurationOutput,describe_notification_configuration_output\nDescribeNotificationConfigurationsAnswer,describe_notification_configurations_answer\nDescribeNotificationConfigurationsType,describe_notification_configurations_type\nDescribeNotificationRuleRequest,describe_notification_rule_request\nDescribeNotificationRuleResult,describe_notification_rule_result\nDescribeNotificationSubscriptionsRequest,describe_notification_subscriptions_request\nDescribeNotificationSubscriptionsResponse,describe_notification_subscriptions_response\nDescribeNotificationsForBudgetRequest,describe_notifications_for_budget_request\nDescribeNotificationsForBudgetResponse,describe_notifications_for_budget_response\nDescribeObjectRequest,describe_object_request\nDescribeObjectResponse,describe_object_response\nDescribeObjectsInput,describe_objects_input\nDescribeObjectsOutput,describe_objects_output\nDescribeObservabilityConfigurationRequest,describe_observability_configuration_request\nDescribeObservabilityConfigurationResponse,describe_observability_configuration_response\nDescribeObservationRequest,describe_observation_request\nDescribeObservationResponse,describe_observation_response\nDescribeOfferingRequest,describe_offering_request\nDescribeOfferingResponse,describe_offering_response\nDescribeOperatingSystemsResponse,describe_operating_systems_response\nDescribeOpsItemsRequest,describe_ops_items_request\nDescribeOpsItemsResponse,describe_ops_items_response\nDescribeOptOutListsRequest,describe_opt_out_lists_request\nDescribeOptOutListsResult,describe_opt_out_lists_result\nDescribeOptedOutNumbersRequest,describe_opted_out_numbers_request\nDescribeOptedOutNumbersResult,describe_opted_out_numbers_result\nDescribeOptionGroupOptionsMessage,describe_option_group_options_message\nDescribeOptionGroupsMessage,describe_option_groups_message\nDescribeOrderableClusterOptionsMessage,describe_orderable_cluster_options_message\nDescribeOrderableDBInstanceOptionsMessage,describe_orderable_db_instance_options_message\nDescribeOrderableReplicationInstancesMessage,describe_orderable_replication_instances_message\nDescribeOrderableReplicationInstancesResponse,describe_orderable_replication_instances_response\nDescribeOrganizationConfigRuleStatusesRequest,describe_organization_config_rule_statuses_request\nDescribeOrganizationConfigRuleStatusesResponse,describe_organization_config_rule_statuses_response\nDescribeOrganizationConfigRulesRequest,describe_organization_config_rules_request\nDescribeOrganizationConfigRulesResponse,describe_organization_config_rules_response\nDescribeOrganizationConfigurationRequest,describe_organization_configuration_request\nDescribeOrganizationConfigurationResponse,describe_organization_configuration_response\nDescribeOrganizationConformancePackStatusesRequest,describe_organization_conformance_pack_statuses_request\nDescribeOrganizationConformancePackStatusesResponse,describe_organization_conformance_pack_statuses_response\nDescribeOrganizationConformancePacksRequest,describe_organization_conformance_packs_request\nDescribeOrganizationConformancePacksResponse,describe_organization_conformance_packs_response\nDescribeOrganizationHealthRequest,describe_organization_health_request\nDescribeOrganizationHealthResponse,describe_organization_health_response\nDescribeOrganizationOverviewRequest,describe_organization_overview_request\nDescribeOrganizationOverviewResponse,describe_organization_overview_response\nDescribeOrganizationRequest,describe_organization_request\nDescribeOrganizationResourceCollectionHealthRequest,describe_organization_resource_collection_health_request\nDescribeOrganizationResourceCollectionHealthResponse,describe_organization_resource_collection_health_response\nDescribeOrganizationResponse,describe_organization_response\nDescribeOrganizationalUnitRequest,describe_organizational_unit_request\nDescribeOrganizationalUnitResponse,describe_organizational_unit_response\nDescribeOrganizationsAccessInput,describe_organizations_access_input\nDescribeOrganizationsAccessOutput,describe_organizations_access_output\nDescribeOriginEndpointRequest,describe_origin_endpoint_request\nDescribeOriginEndpointResponse,describe_origin_endpoint_response\nDescribeOutboundConnectionsRequest,describe_outbound_connections_request\nDescribeOutboundConnectionsResponse,describe_outbound_connections_response\nDescribeOutboundCrossClusterSearchConnectionsRequest,describe_outbound_cross_cluster_search_connections_request\nDescribeOutboundCrossClusterSearchConnectionsResponse,describe_outbound_cross_cluster_search_connections_response\nDescribePHIDetectionJobRequest,describe_phi_detection_job_request\nDescribePHIDetectionJobResponse,describe_phi_detection_job_response\nDescribePackageImportJobRequest,describe_package_import_job_request\nDescribePackageImportJobResponse,describe_package_import_job_response\nDescribePackageRequest,describe_package_request\nDescribePackageResponse,describe_package_response\nDescribePackageResult,describe_package_result\nDescribePackageVersionRequest,describe_package_version_request\nDescribePackageVersionResponse,describe_package_version_response\nDescribePackageVersionResult,describe_package_version_result\nDescribePackagesFilter,describe_packages_filter\nDescribePackagesRequest,describe_packages_request\nDescribePackagesResponse,describe_packages_response\nDescribePackagingConfigurationRequest,describe_packaging_configuration_request\nDescribePackagingConfigurationResponse,describe_packaging_configuration_response\nDescribePackagingGroupRequest,describe_packaging_group_request\nDescribePackagingGroupResponse,describe_packaging_group_response\nDescribePageRequest,describe_page_request\nDescribePageResult,describe_page_result\nDescribeParameterGroupsRequest,describe_parameter_groups_request\nDescribeParameterGroupsResponse,describe_parameter_groups_response\nDescribeParametersRequest,describe_parameters_request\nDescribeParametersResponse,describe_parameters_response\nDescribeParametersResult,describe_parameters_result\nDescribePartnerEventSourceRequest,describe_partner_event_source_request\nDescribePartnerEventSourceResponse,describe_partner_event_source_response\nDescribePartnersInputMessage,describe_partners_input_message\nDescribePartnersOutputMessage,describe_partners_output_message\nDescribePatchBaselinesRequest,describe_patch_baselines_request\nDescribePatchBaselinesResult,describe_patch_baselines_result\nDescribePatchGroupStateRequest,describe_patch_group_state_request\nDescribePatchGroupStateResult,describe_patch_group_state_result\nDescribePatchGroupsRequest,describe_patch_groups_request\nDescribePatchGroupsResult,describe_patch_groups_result\nDescribePatchPropertiesRequest,describe_patch_properties_request\nDescribePatchPropertiesResult,describe_patch_properties_result\nDescribePendingAggregationRequestsRequest,describe_pending_aggregation_requests_request\nDescribePendingAggregationRequestsResponse,describe_pending_aggregation_requests_response\nDescribePendingMaintenanceActionsMessage,describe_pending_maintenance_actions_message\nDescribePendingMaintenanceActionsResponse,describe_pending_maintenance_actions_response\nDescribePermissionSetProvisioningStatusRequest,describe_permission_set_provisioning_status_request\nDescribePermissionSetProvisioningStatusResponse,describe_permission_set_provisioning_status_response\nDescribePermissionSetRequest,describe_permission_set_request\nDescribePermissionSetResponse,describe_permission_set_response\nDescribePermissionsRequest,describe_permissions_request\nDescribePermissionsResult,describe_permissions_result\nDescribePhoneNumberRequest,describe_phone_number_request\nDescribePhoneNumberResponse,describe_phone_number_response\nDescribePhoneNumbersRequest,describe_phone_numbers_request\nDescribePhoneNumbersResult,describe_phone_numbers_result\nDescribePiiEntitiesDetectionJobRequest,describe_pii_entities_detection_job_request\nDescribePiiEntitiesDetectionJobResponse,describe_pii_entities_detection_job_response\nDescribePipeRequest,describe_pipe_request\nDescribePipeResponse,describe_pipe_response\nDescribePipelineDefinitionForExecutionRequest,describe_pipeline_definition_for_execution_request\nDescribePipelineDefinitionForExecutionResponse,describe_pipeline_definition_for_execution_response\nDescribePipelineExecutionRequest,describe_pipeline_execution_request\nDescribePipelineExecutionResponse,describe_pipeline_execution_response\nDescribePipelineRequest,describe_pipeline_request\nDescribePipelineResponse,describe_pipeline_response\nDescribePipelinesInput,describe_pipelines_input\nDescribePipelinesOutput,describe_pipelines_output\nDescribePlaceIndexRequest,describe_place_index_request\nDescribePlaceIndexResponse,describe_place_index_response\nDescribePlacementGroupsRequest,describe_placement_groups_request\nDescribePlacementGroupsResult,describe_placement_groups_result\nDescribePlacementRequest,describe_placement_request\nDescribePlacementResponse,describe_placement_response\nDescribePlatformVersionRequest,describe_platform_version_request\nDescribePlatformVersionResult,describe_platform_version_result\nDescribePlayerSessionsInput,describe_player_sessions_input\nDescribePlayerSessionsOutput,describe_player_sessions_output\nDescribePoliciesType,describe_policies_type\nDescribePolicyRequest,describe_policy_request\nDescribePolicyResponse,describe_policy_response\nDescribePoolsRequest,describe_pools_request\nDescribePoolsResult,describe_pools_result\nDescribePortalRequest,describe_portal_request\nDescribePortalResponse,describe_portal_response\nDescribePortfolioInput,describe_portfolio_input\nDescribePortfolioOutput,describe_portfolio_output\nDescribePortfolioShareStatusInput,describe_portfolio_share_status_input\nDescribePortfolioShareStatusOutput,describe_portfolio_share_status_output\nDescribePortfolioSharesInput,describe_portfolio_shares_input\nDescribePortfolioSharesOutput,describe_portfolio_shares_output\nDescribePredictorBacktestExportJobRequest,describe_predictor_backtest_export_job_request\nDescribePredictorBacktestExportJobResponse,describe_predictor_backtest_export_job_response\nDescribePredictorRequest,describe_predictor_request\nDescribePredictorResponse,describe_predictor_response\nDescribePrefixListsRequest,describe_prefix_lists_request\nDescribePrefixListsResult,describe_prefix_lists_result\nDescribePrincipalIdFormatRequest,describe_principal_id_format_request\nDescribePrincipalIdFormatResult,describe_principal_id_format_result\nDescribePrincipalMappingRequest,describe_principal_mapping_request\nDescribePrincipalMappingResponse,describe_principal_mapping_response\nDescribeProblemObservationsRequest,describe_problem_observations_request\nDescribeProblemObservationsResponse,describe_problem_observations_response\nDescribeProblemRequest,describe_problem_request\nDescribeProblemResponse,describe_problem_response\nDescribeProcessingJobRequest,describe_processing_job_request\nDescribeProcessingJobResponse,describe_processing_job_response\nDescribeProductAsAdminInput,describe_product_as_admin_input\nDescribeProductAsAdminOutput,describe_product_as_admin_output\nDescribeProductInput,describe_product_input\nDescribeProductOutput,describe_product_output\nDescribeProductViewInput,describe_product_view_input\nDescribeProductViewOutput,describe_product_view_output\nDescribeProductsRequest,describe_products_request\nDescribeProductsResponse,describe_products_response\nDescribeProfileRequest,describe_profile_request\nDescribeProfileResponse,describe_profile_response\nDescribeProfilingGroupRequest,describe_profiling_group_request\nDescribeProfilingGroupResponse,describe_profiling_group_response\nDescribeProgramRequest,describe_program_request\nDescribeProgramResponse,describe_program_response\nDescribeProjectInput,describe_project_input\nDescribeProjectOutput,describe_project_output\nDescribeProjectRequest,describe_project_request\nDescribeProjectResponse,describe_project_response\nDescribeProjectResult,describe_project_result\nDescribeProjectVersionsRequest,describe_project_versions_request\nDescribeProjectVersionsResponse,describe_project_versions_response\nDescribeProjectsRequest,describe_projects_request\nDescribeProjectsResponse,describe_projects_response\nDescribePromptRequest,describe_prompt_request\nDescribePromptResponse,describe_prompt_response\nDescribeProtectedResourceInput,describe_protected_resource_input\nDescribeProtectedResourceOutput,describe_protected_resource_output\nDescribeProtectionGroupRequest,describe_protection_group_request\nDescribeProtectionGroupResponse,describe_protection_group_response\nDescribeProtectionRequest,describe_protection_request\nDescribeProtectionResponse,describe_protection_response\nDescribeProvisionedProductInput,describe_provisioned_product_input\nDescribeProvisionedProductOutput,describe_provisioned_product_output\nDescribeProvisionedProductPlanInput,describe_provisioned_product_plan_input\nDescribeProvisionedProductPlanOutput,describe_provisioned_product_plan_output\nDescribeProvisioningArtifactInput,describe_provisioning_artifact_input\nDescribeProvisioningArtifactOutput,describe_provisioning_artifact_output\nDescribeProvisioningParametersInput,describe_provisioning_parameters_input\nDescribeProvisioningParametersOutput,describe_provisioning_parameters_output\nDescribeProvisioningTemplateRequest,describe_provisioning_template_request\nDescribeProvisioningTemplateResponse,describe_provisioning_template_response\nDescribeProvisioningTemplateVersionRequest,describe_provisioning_template_version_request\nDescribeProvisioningTemplateVersionResponse,describe_provisioning_template_version_response\nDescribePublicIpv4PoolsRequest,describe_public_ipv4_pools_request\nDescribePublicIpv4PoolsResult,describe_public_ipv4_pools_result\nDescribePublisherInput,describe_publisher_input\nDescribePublisherOutput,describe_publisher_output\nDescribePublishingDestinationRequest,describe_publishing_destination_request\nDescribePublishingDestinationResponse,describe_publishing_destination_response\nDescribePullRequestEventsInput,describe_pull_request_events_input\nDescribePullRequestEventsOutput,describe_pull_request_events_output\nDescribePullThroughCacheRulesRequest,describe_pull_through_cache_rules_request\nDescribePullThroughCacheRulesResponse,describe_pull_through_cache_rules_response\nDescribeQueriesRequest,describe_queries_request\nDescribeQueriesResponse,describe_queries_response\nDescribeQueryDefinitionsRequest,describe_query_definitions_request\nDescribeQueryDefinitionsResponse,describe_query_definitions_response\nDescribeQueryRequest,describe_query_request\nDescribeQueryResponse,describe_query_response\nDescribeQuerySuggestionsBlockListRequest,describe_query_suggestions_block_list_request\nDescribeQuerySuggestionsBlockListResponse,describe_query_suggestions_block_list_response\nDescribeQuerySuggestionsConfigRequest,describe_query_suggestions_config_request\nDescribeQuerySuggestionsConfigResponse,describe_query_suggestions_config_response\nDescribeQueueRequest,describe_queue_request\nDescribeQueueResponse,describe_queue_response\nDescribeQuickConnectRequest,describe_quick_connect_request\nDescribeQuickConnectResponse,describe_quick_connect_response\nDescribeRaidArraysRequest,describe_raid_arrays_request\nDescribeRaidArraysResult,describe_raid_arrays_result\nDescribeRdsDbInstancesRequest,describe_rds_db_instances_request\nDescribeRdsDbInstancesResult,describe_rds_db_instances_result\nDescribeReceiptRuleRequest,describe_receipt_rule_request\nDescribeReceiptRuleResponse,describe_receipt_rule_response\nDescribeReceiptRuleSetRequest,describe_receipt_rule_set_request\nDescribeReceiptRuleSetResponse,describe_receipt_rule_set_response\nDescribeRecipeRequest,describe_recipe_request\nDescribeRecipeResponse,describe_recipe_response\nDescribeRecommendationExportJobsRequest,describe_recommendation_export_jobs_request\nDescribeRecommendationExportJobsResponse,describe_recommendation_export_jobs_response\nDescribeRecommendationFeedbackRequest,describe_recommendation_feedback_request\nDescribeRecommendationFeedbackResponse,describe_recommendation_feedback_response\nDescribeRecommendationLimitationsRequest,describe_recommendation_limitations_request\nDescribeRecommendationLimitationsResponse,describe_recommendation_limitations_response\nDescribeRecommendationsRequest,describe_recommendations_request\nDescribeRecommendationsResponse,describe_recommendations_response\nDescribeRecommenderRequest,describe_recommender_request\nDescribeRecommenderResponse,describe_recommender_response\nDescribeRecordInput,describe_record_input\nDescribeRecordOutput,describe_record_output\nDescribeRecoveryInstancesRequest,describe_recovery_instances_request\nDescribeRecoveryInstancesRequestFilters,describe_recovery_instances_request_filters\nDescribeRecoveryInstancesResponse,describe_recovery_instances_response\nDescribeRecoveryPointInput,describe_recovery_point_input\nDescribeRecoveryPointOutput,describe_recovery_point_output\nDescribeRecoverySnapshotsRequest,describe_recovery_snapshots_request\nDescribeRecoverySnapshotsRequestFilters,describe_recovery_snapshots_request_filters\nDescribeRecoverySnapshotsResponse,describe_recovery_snapshots_response\nDescribeRefreshScheduleRequest,describe_refresh_schedule_request\nDescribeRefreshScheduleResponse,describe_refresh_schedule_response\nDescribeRefreshSchemasStatusMessage,describe_refresh_schemas_status_message\nDescribeRefreshSchemasStatusResponse,describe_refresh_schemas_status_response\nDescribeRegionSettingsOutput,describe_region_settings_output\nDescribeRegionsRequest,describe_regions_request\nDescribeRegionsResult,describe_regions_result\nDescribeRegistriesRequest,describe_registries_request\nDescribeRegistriesResponse,describe_registries_response\nDescribeRegistryRequest,describe_registry_request\nDescribeRegistryResponse,describe_registry_response\nDescribeReleaseLabelInput,describe_release_label_input\nDescribeReleaseLabelOutput,describe_release_label_output\nDescribeRemediationConfigurationsRequest,describe_remediation_configurations_request\nDescribeRemediationConfigurationsResponse,describe_remediation_configurations_response\nDescribeRemediationExceptionsRequest,describe_remediation_exceptions_request\nDescribeRemediationExceptionsResponse,describe_remediation_exceptions_response\nDescribeRemediationExecutionStatusRequest,describe_remediation_execution_status_request\nDescribeRemediationExecutionStatusResponse,describe_remediation_execution_status_response\nDescribeReplaceRootVolumeTasksRequest,describe_replace_root_volume_tasks_request\nDescribeReplaceRootVolumeTasksResult,describe_replace_root_volume_tasks_result\nDescribeReplayRequest,describe_replay_request\nDescribeReplayResponse,describe_replay_response\nDescribeReplicationConfigsMessage,describe_replication_configs_message\nDescribeReplicationConfigsResponse,describe_replication_configs_response\nDescribeReplicationConfigurationTemplatesRequest,describe_replication_configuration_templates_request\nDescribeReplicationConfigurationTemplatesResponse,describe_replication_configuration_templates_response\nDescribeReplicationConfigurationsRequest,describe_replication_configurations_request\nDescribeReplicationConfigurationsResponse,describe_replication_configurations_response\nDescribeReplicationGroupsMessage,describe_replication_groups_message\nDescribeReplicationInstanceTaskLogsMessage,describe_replication_instance_task_logs_message\nDescribeReplicationInstanceTaskLogsResponse,describe_replication_instance_task_logs_response\nDescribeReplicationInstancesMessage,describe_replication_instances_message\nDescribeReplicationInstancesResponse,describe_replication_instances_response\nDescribeReplicationSubnetGroupsMessage,describe_replication_subnet_groups_message\nDescribeReplicationSubnetGroupsResponse,describe_replication_subnet_groups_response\nDescribeReplicationTableStatisticsMessage,describe_replication_table_statistics_message\nDescribeReplicationTableStatisticsResponse,describe_replication_table_statistics_response\nDescribeReplicationTaskAssessmentResultsMessage,describe_replication_task_assessment_results_message\nDescribeReplicationTaskAssessmentResultsResponse,describe_replication_task_assessment_results_response\nDescribeReplicationTaskAssessmentRunsMessage,describe_replication_task_assessment_runs_message\nDescribeReplicationTaskAssessmentRunsResponse,describe_replication_task_assessment_runs_response\nDescribeReplicationTaskIndividualAssessmentsMessage,describe_replication_task_individual_assessments_message\nDescribeReplicationTaskIndividualAssessmentsResponse,describe_replication_task_individual_assessments_response\nDescribeReplicationTasksMessage,describe_replication_tasks_message\nDescribeReplicationTasksResponse,describe_replication_tasks_response\nDescribeReplicationsMessage,describe_replications_message\nDescribeReplicationsResponse,describe_replications_response\nDescribeReportCreationOutput,describe_report_creation_output\nDescribeReportDefinitionsRequest,describe_report_definitions_request\nDescribeReportDefinitionsResponse,describe_report_definitions_response\nDescribeReportJobInput,describe_report_job_input\nDescribeReportJobOutput,describe_report_job_output\nDescribeReportPlanInput,describe_report_plan_input\nDescribeReportPlanOutput,describe_report_plan_output\nDescribeRepositoriesRequest,describe_repositories_request\nDescribeRepositoriesResponse,describe_repositories_response\nDescribeRepositoryAssociationRequest,describe_repository_association_request\nDescribeRepositoryAssociationResponse,describe_repository_association_response\nDescribeRepositoryRequest,describe_repository_request\nDescribeRepositoryResult,describe_repository_result\nDescribeRescoreExecutionPlanRequest,describe_rescore_execution_plan_request\nDescribeRescoreExecutionPlanResponse,describe_rescore_execution_plan_response\nDescribeReservationRequest,describe_reservation_request\nDescribeReservationResponse,describe_reservation_response\nDescribeReservedCacheNodesMessage,describe_reserved_cache_nodes_message\nDescribeReservedCacheNodesOfferingsMessage,describe_reserved_cache_nodes_offerings_message\nDescribeReservedDBInstancesMessage,describe_reserved_db_instances_message\nDescribeReservedDBInstancesOfferingsMessage,describe_reserved_db_instances_offerings_message\nDescribeReservedElasticsearchInstanceOfferingsRequest,describe_reserved_elasticsearch_instance_offerings_request\nDescribeReservedElasticsearchInstanceOfferingsResponse,describe_reserved_elasticsearch_instance_offerings_response\nDescribeReservedElasticsearchInstancesRequest,describe_reserved_elasticsearch_instances_request\nDescribeReservedElasticsearchInstancesResponse,describe_reserved_elasticsearch_instances_response\nDescribeReservedInstanceOfferingsRequest,describe_reserved_instance_offerings_request\nDescribeReservedInstanceOfferingsResponse,describe_reserved_instance_offerings_response\nDescribeReservedInstancesListingsRequest,describe_reserved_instances_listings_request\nDescribeReservedInstancesListingsResult,describe_reserved_instances_listings_result\nDescribeReservedInstancesModificationsRequest,describe_reserved_instances_modifications_request\nDescribeReservedInstancesModificationsResult,describe_reserved_instances_modifications_result\nDescribeReservedInstancesOfferingsRequest,describe_reserved_instances_offerings_request\nDescribeReservedInstancesOfferingsResult,describe_reserved_instances_offerings_result\nDescribeReservedInstancesRequest,describe_reserved_instances_request\nDescribeReservedInstancesResponse,describe_reserved_instances_response\nDescribeReservedInstancesResult,describe_reserved_instances_result\nDescribeReservedNodeExchangeStatusInputMessage,describe_reserved_node_exchange_status_input_message\nDescribeReservedNodeExchangeStatusOutputMessage,describe_reserved_node_exchange_status_output_message\nDescribeReservedNodeOfferingsMessage,describe_reserved_node_offerings_message\nDescribeReservedNodesMessage,describe_reserved_nodes_message\nDescribeReservedNodesOfferingsRequest,describe_reserved_nodes_offerings_request\nDescribeReservedNodesOfferingsResponse,describe_reserved_nodes_offerings_response\nDescribeReservedNodesRequest,describe_reserved_nodes_request\nDescribeReservedNodesResponse,describe_reserved_nodes_response\nDescribeResiliencyPolicyRequest,describe_resiliency_policy_request\nDescribeResiliencyPolicyResponse,describe_resiliency_policy_response\nDescribeResizeMessage,describe_resize_message\nDescribeResourceCollectionHealthRequest,describe_resource_collection_health_request\nDescribeResourceCollectionHealthResponse,describe_resource_collection_health_response\nDescribeResourceGroupsRequest,describe_resource_groups_request\nDescribeResourceGroupsResponse,describe_resource_groups_response\nDescribeResourcePermissionsRequest,describe_resource_permissions_request\nDescribeResourcePermissionsResponse,describe_resource_permissions_response\nDescribeResourcePoliciesRequest,describe_resource_policies_request\nDescribeResourcePoliciesResponse,describe_resource_policies_response\nDescribeResourcePolicyRequest,describe_resource_policy_request\nDescribeResourcePolicyResponse,describe_resource_policy_response\nDescribeResourceRequest,describe_resource_request\nDescribeResourceResponse,describe_resource_response\nDescribeResourceServerRequest,describe_resource_server_request\nDescribeResourceServerResponse,describe_resource_server_response\nDescribeRestoreJobInput,describe_restore_job_input\nDescribeRestoreJobOutput,describe_restore_job_output\nDescribeRetentionConfigurationsRequest,describe_retention_configurations_request\nDescribeRetentionConfigurationsResponse,describe_retention_configurations_response\nDescribeRetrainingSchedulerRequest,describe_retraining_scheduler_request\nDescribeRetrainingSchedulerResponse,describe_retraining_scheduler_response\nDescribeReturnShippingLabelRequest,describe_return_shipping_label_request\nDescribeReturnShippingLabelResult,describe_return_shipping_label_result\nDescribeRiskConfigurationRequest,describe_risk_configuration_request\nDescribeRiskConfigurationResponse,describe_risk_configuration_response\nDescribeRobotApplicationRequest,describe_robot_application_request\nDescribeRobotApplicationResponse,describe_robot_application_response\nDescribeRobotRequest,describe_robot_request\nDescribeRobotResponse,describe_robot_response\nDescribeRoleAliasRequest,describe_role_alias_request\nDescribeRoleAliasResponse,describe_role_alias_response\nDescribeRootFoldersRequest,describe_root_folders_request\nDescribeRootFoldersResponse,describe_root_folders_response\nDescribeRouteCalculatorRequest,describe_route_calculator_request\nDescribeRouteCalculatorResponse,describe_route_calculator_response\nDescribeRouteInput,describe_route_input\nDescribeRouteOutput,describe_route_output\nDescribeRouteTablesRequest,describe_route_tables_request\nDescribeRouteTablesResult,describe_route_tables_result\nDescribeRouterConfigurationRequest,describe_router_configuration_request\nDescribeRouterConfigurationResponse,describe_router_configuration_response\nDescribeRoutingControlRequest,describe_routing_control_request\nDescribeRoutingControlResponse,describe_routing_control_response\nDescribeRoutingProfileRequest,describe_routing_profile_request\nDescribeRoutingProfileResponse,describe_routing_profile_response\nDescribeRuleGroupMetadataRequest,describe_rule_group_metadata_request\nDescribeRuleGroupMetadataResponse,describe_rule_group_metadata_response\nDescribeRuleGroupRequest,describe_rule_group_request\nDescribeRuleGroupResponse,describe_rule_group_response\nDescribeRuleGroupsNamespaceRequest,describe_rule_groups_namespace_request\nDescribeRuleGroupsNamespaceResponse,describe_rule_groups_namespace_response\nDescribeRuleRequest,describe_rule_request\nDescribeRuleResponse,describe_rule_response\nDescribeRulesInput,describe_rules_input\nDescribeRulesOutput,describe_rules_output\nDescribeRulesPackagesRequest,describe_rules_packages_request\nDescribeRulesPackagesResponse,describe_rules_packages_response\nDescribeRulesetRequest,describe_ruleset_request\nDescribeRulesetResponse,describe_ruleset_response\nDescribeRuntimeConfigurationInput,describe_runtime_configuration_input\nDescribeRuntimeConfigurationOutput,describe_runtime_configuration_output\nDescribeRuntimeVersionsRequest,describe_runtime_versions_request\nDescribeRuntimeVersionsResponse,describe_runtime_versions_response\nDescribeRxNormInferenceJobRequest,describe_rx_norm_inference_job_request\nDescribeRxNormInferenceJobResponse,describe_rx_norm_inference_job_response\nDescribeSMBFileSharesInput,describe_smb_file_shares_input\nDescribeSMBFileSharesOutput,describe_smb_file_shares_output\nDescribeSMBSettingsInput,describe_smb_settings_input\nDescribeSMBSettingsOutput,describe_smb_settings_output\nDescribeSNOMEDCTInferenceJobRequest,describe_snomedct_inference_job_request\nDescribeSNOMEDCTInferenceJobResponse,describe_snomedct_inference_job_response\nDescribeSSLPoliciesInput,describe_ssl_policies_input\nDescribeSSLPoliciesOutput,describe_ssl_policies_output\nDescribeSafetyRuleRequest,describe_safety_rule_request\nDescribeSafetyRuleResponse,describe_safety_rule_response\nDescribeSavingsPlanRatesRequest,describe_savings_plan_rates_request\nDescribeSavingsPlanRatesResponse,describe_savings_plan_rates_response\nDescribeSavingsPlansOfferingRatesRequest,describe_savings_plans_offering_rates_request\nDescribeSavingsPlansOfferingRatesResponse,describe_savings_plans_offering_rates_response\nDescribeSavingsPlansOfferingsRequest,describe_savings_plans_offerings_request\nDescribeSavingsPlansOfferingsResponse,describe_savings_plans_offerings_response\nDescribeSavingsPlansRequest,describe_savings_plans_request\nDescribeSavingsPlansResponse,describe_savings_plans_response\nDescribeScalableTargetsRequest,describe_scalable_targets_request\nDescribeScalableTargetsResponse,describe_scalable_targets_response\nDescribeScalingActivitiesRequest,describe_scaling_activities_request\nDescribeScalingActivitiesResponse,describe_scaling_activities_response\nDescribeScalingActivitiesType,describe_scaling_activities_type\nDescribeScalingParametersRequest,describe_scaling_parameters_request\nDescribeScalingParametersResponse,describe_scaling_parameters_response\nDescribeScalingPlanResourcesRequest,describe_scaling_plan_resources_request\nDescribeScalingPlanResourcesResponse,describe_scaling_plan_resources_response\nDescribeScalingPlansRequest,describe_scaling_plans_request\nDescribeScalingPlansResponse,describe_scaling_plans_response\nDescribeScalingPoliciesInput,describe_scaling_policies_input\nDescribeScalingPoliciesOutput,describe_scaling_policies_output\nDescribeScalingPoliciesRequest,describe_scaling_policies_request\nDescribeScalingPoliciesResponse,describe_scaling_policies_response\nDescribeScheduleRequest,describe_schedule_request\nDescribeScheduleResponse,describe_schedule_response\nDescribeScheduledActionsMessage,describe_scheduled_actions_message\nDescribeScheduledActionsRequest,describe_scheduled_actions_request\nDescribeScheduledActionsResponse,describe_scheduled_actions_response\nDescribeScheduledActionsType,describe_scheduled_actions_type\nDescribeScheduledAuditRequest,describe_scheduled_audit_request\nDescribeScheduledAuditResponse,describe_scheduled_audit_response\nDescribeScheduledInstanceAvailabilityRequest,describe_scheduled_instance_availability_request\nDescribeScheduledInstanceAvailabilityResult,describe_scheduled_instance_availability_result\nDescribeScheduledInstancesRequest,describe_scheduled_instances_request\nDescribeScheduledInstancesResult,describe_scheduled_instances_result\nDescribeScheduledQueryRequest,describe_scheduled_query_request\nDescribeScheduledQueryResponse,describe_scheduled_query_response\nDescribeSchedulingPoliciesRequest,describe_scheduling_policies_request\nDescribeSchedulingPoliciesResponse,describe_scheduling_policies_response\nDescribeSchemaRequest,describe_schema_request\nDescribeSchemaResponse,describe_schema_response\nDescribeSchemasMessage,describe_schemas_message\nDescribeSchemasResponse,describe_schemas_response\nDescribeScriptInput,describe_script_input\nDescribeScriptOutput,describe_script_output\nDescribeSecretRequest,describe_secret_request\nDescribeSecretResponse,describe_secret_response\nDescribeSecurityConfigurationInput,describe_security_configuration_input\nDescribeSecurityConfigurationOutput,describe_security_configuration_output\nDescribeSecurityGroupReferencesRequest,describe_security_group_references_request\nDescribeSecurityGroupReferencesResult,describe_security_group_references_result\nDescribeSecurityGroupRulesRequest,describe_security_group_rules_request\nDescribeSecurityGroupRulesResult,describe_security_group_rules_result\nDescribeSecurityGroupsRequest,describe_security_groups_request\nDescribeSecurityGroupsResult,describe_security_groups_result\nDescribeSecurityPolicyRequest,describe_security_policy_request\nDescribeSecurityPolicyResponse,describe_security_policy_response\nDescribeSecurityProfileRequest,describe_security_profile_request\nDescribeSecurityProfileResponse,describe_security_profile_response\nDescribeSenderIdsRequest,describe_sender_ids_request\nDescribeSenderIdsResult,describe_sender_ids_result\nDescribeSentimentDetectionJobRequest,describe_sentiment_detection_job_request\nDescribeSentimentDetectionJobResponse,describe_sentiment_detection_job_response\nDescribeServerRequest,describe_server_request\nDescribeServerResponse,describe_server_response\nDescribeServersRequest,describe_servers_request\nDescribeServersResponse,describe_servers_response\nDescribeServiceAccessPoliciesRequest,describe_service_access_policies_request\nDescribeServiceAccessPoliciesResponse,describe_service_access_policies_response\nDescribeServiceActionExecutionParametersInput,describe_service_action_execution_parameters_input\nDescribeServiceActionExecutionParametersOutput,describe_service_action_execution_parameters_output\nDescribeServiceActionInput,describe_service_action_input\nDescribeServiceActionOutput,describe_service_action_output\nDescribeServiceErrorsRequest,describe_service_errors_request\nDescribeServiceErrorsResult,describe_service_errors_result\nDescribeServiceIntegrationResponse,describe_service_integration_response\nDescribeServiceRequest,describe_service_request\nDescribeServiceResponse,describe_service_response\nDescribeServiceUpdatesMessage,describe_service_updates_message\nDescribeServiceUpdatesRequest,describe_service_updates_request\nDescribeServiceUpdatesResponse,describe_service_updates_response\nDescribeServicesRequest,describe_services_request\nDescribeServicesResponse,describe_services_response\nDescribeSessionsRequest,describe_sessions_request\nDescribeSessionsResponse,describe_sessions_response\nDescribeSessionsResult,describe_sessions_result\nDescribeSettingsRequest,describe_settings_request\nDescribeSettingsResult,describe_settings_result\nDescribeSeverityLevelsRequest,describe_severity_levels_request\nDescribeSeverityLevelsResponse,describe_severity_levels_response\nDescribeShardInterval,describe_shard_interval\nDescribeSharedDirectoriesRequest,describe_shared_directories_request\nDescribeSharedDirectoriesResult,describe_shared_directories_result\nDescribeSignalingChannelInput,describe_signaling_channel_input\nDescribeSignalingChannelOutput,describe_signaling_channel_output\nDescribeSigningJobRequest,describe_signing_job_request\nDescribeSigningJobResponse,describe_signing_job_response\nDescribeSimulationApplicationRequest,describe_simulation_application_request\nDescribeSimulationApplicationResponse,describe_simulation_application_response\nDescribeSimulationInput,describe_simulation_input\nDescribeSimulationJobBatchRequest,describe_simulation_job_batch_request\nDescribeSimulationJobBatchResponse,describe_simulation_job_batch_response\nDescribeSimulationJobRequest,describe_simulation_job_request\nDescribeSimulationJobResponse,describe_simulation_job_response\nDescribeSimulationOutput,describe_simulation_output\nDescribeSlotRequest,describe_slot_request\nDescribeSlotResponse,describe_slot_response\nDescribeSlotTypeRequest,describe_slot_type_request\nDescribeSlotTypeResponse,describe_slot_type_response\nDescribeSnapshotAttributeRequest,describe_snapshot_attribute_request\nDescribeSnapshotAttributeResult,describe_snapshot_attribute_result\nDescribeSnapshotCopyGrantsMessage,describe_snapshot_copy_grants_message\nDescribeSnapshotScheduleInput,describe_snapshot_schedule_input\nDescribeSnapshotScheduleOutput,describe_snapshot_schedule_output\nDescribeSnapshotSchedulesMessage,describe_snapshot_schedules_message\nDescribeSnapshotSchedulesOutputMessage,describe_snapshot_schedules_output_message\nDescribeSnapshotTierStatusRequest,describe_snapshot_tier_status_request\nDescribeSnapshotTierStatusResult,describe_snapshot_tier_status_result\nDescribeSnapshotsListMessage,describe_snapshots_list_message\nDescribeSnapshotsMessage,describe_snapshots_message\nDescribeSnapshotsRequest,describe_snapshots_request\nDescribeSnapshotsResponse,describe_snapshots_response\nDescribeSnapshotsResult,describe_snapshots_result\nDescribeSolutionRequest,describe_solution_request\nDescribeSolutionResponse,describe_solution_response\nDescribeSolutionVersionRequest,describe_solution_version_request\nDescribeSolutionVersionResponse,describe_solution_version_response\nDescribeSourceLocationRequest,describe_source_location_request\nDescribeSourceLocationResponse,describe_source_location_response\nDescribeSourceNetworksRequest,describe_source_networks_request\nDescribeSourceNetworksRequestFilters,describe_source_networks_request_filters\nDescribeSourceNetworksResponse,describe_source_networks_response\nDescribeSourceRegionsMessage,describe_source_regions_message\nDescribeSourceServersRequest,describe_source_servers_request\nDescribeSourceServersRequestFilters,describe_source_servers_request_filters\nDescribeSourceServersResponse,describe_source_servers_response\nDescribeSpaceRequest,describe_space_request\nDescribeSpaceResponse,describe_space_response\nDescribeSpeakerEnrollmentJobRequest,describe_speaker_enrollment_job_request\nDescribeSpeakerEnrollmentJobResponse,describe_speaker_enrollment_job_response\nDescribeSpeakerRequest,describe_speaker_request\nDescribeSpeakerResponse,describe_speaker_response\nDescribeSpendLimitsRequest,describe_spend_limits_request\nDescribeSpendLimitsResult,describe_spend_limits_result\nDescribeSpotDatafeedSubscriptionRequest,describe_spot_datafeed_subscription_request\nDescribeSpotDatafeedSubscriptionResult,describe_spot_datafeed_subscription_result\nDescribeSpotFleetInstancesRequest,describe_spot_fleet_instances_request\nDescribeSpotFleetInstancesResponse,describe_spot_fleet_instances_response\nDescribeSpotFleetRequestHistoryRequest,describe_spot_fleet_request_history_request\nDescribeSpotFleetRequestHistoryResponse,describe_spot_fleet_request_history_response\nDescribeSpotFleetRequestsRequest,describe_spot_fleet_requests_request\nDescribeSpotFleetRequestsResponse,describe_spot_fleet_requests_response\nDescribeSpotInstanceRequestsRequest,describe_spot_instance_requests_request\nDescribeSpotInstanceRequestsResult,describe_spot_instance_requests_result\nDescribeSpotPriceHistoryRequest,describe_spot_price_history_request\nDescribeSpotPriceHistoryResult,describe_spot_price_history_result\nDescribeStackDriftDetectionStatusInput,describe_stack_drift_detection_status_input\nDescribeStackDriftDetectionStatusOutput,describe_stack_drift_detection_status_output\nDescribeStackEventsInput,describe_stack_events_input\nDescribeStackEventsOutput,describe_stack_events_output\nDescribeStackInstanceInput,describe_stack_instance_input\nDescribeStackInstanceOutput,describe_stack_instance_output\nDescribeStackProvisioningParametersRequest,describe_stack_provisioning_parameters_request\nDescribeStackProvisioningParametersResult,describe_stack_provisioning_parameters_result\nDescribeStackResourceDriftsInput,describe_stack_resource_drifts_input\nDescribeStackResourceDriftsOutput,describe_stack_resource_drifts_output\nDescribeStackResourceInput,describe_stack_resource_input\nDescribeStackResourceOutput,describe_stack_resource_output\nDescribeStackResourcesInput,describe_stack_resources_input\nDescribeStackResourcesOutput,describe_stack_resources_output\nDescribeStackSetInput,describe_stack_set_input\nDescribeStackSetOperationInput,describe_stack_set_operation_input\nDescribeStackSetOperationOutput,describe_stack_set_operation_output\nDescribeStackSetOutput,describe_stack_set_output\nDescribeStackSummaryRequest,describe_stack_summary_request\nDescribeStackSummaryResult,describe_stack_summary_result\nDescribeStacksInput,describe_stacks_input\nDescribeStacksOutput,describe_stacks_output\nDescribeStacksRequest,describe_stacks_request\nDescribeStacksResult,describe_stacks_result\nDescribeStaleSecurityGroupsRequest,describe_stale_security_groups_request\nDescribeStaleSecurityGroupsResult,describe_stale_security_groups_result\nDescribeStandardsControlsRequest,describe_standards_controls_request\nDescribeStandardsControlsResponse,describe_standards_controls_response\nDescribeStandardsRequest,describe_standards_request\nDescribeStandardsResponse,describe_standards_response\nDescribeStateMachineAliasInput,describe_state_machine_alias_input\nDescribeStateMachineAliasOutput,describe_state_machine_alias_output\nDescribeStateMachineForExecutionInput,describe_state_machine_for_execution_input\nDescribeStateMachineForExecutionOutput,describe_state_machine_for_execution_output\nDescribeStateMachineInput,describe_state_machine_input\nDescribeStateMachineOutput,describe_state_machine_output\nDescribeStatementRequest,describe_statement_request\nDescribeStatementResponse,describe_statement_response\nDescribeStepInput,describe_step_input\nDescribeStepOutput,describe_step_output\nDescribeStorageConfigurationResponse,describe_storage_configuration_response\nDescribeStorageSystemRequest,describe_storage_system_request\nDescribeStorageSystemResourceMetricsRequest,describe_storage_system_resource_metrics_request\nDescribeStorageSystemResourceMetricsResponse,describe_storage_system_resource_metrics_response\nDescribeStorageSystemResourcesRequest,describe_storage_system_resources_request\nDescribeStorageSystemResourcesResponse,describe_storage_system_resources_response\nDescribeStorageSystemResponse,describe_storage_system_response\nDescribeStorageVirtualMachinesRequest,describe_storage_virtual_machines_request\nDescribeStorageVirtualMachinesResponse,describe_storage_virtual_machines_response\nDescribeStoreImageTasksRequest,describe_store_image_tasks_request\nDescribeStoreImageTasksResult,describe_store_image_tasks_result\nDescribeStorediSCSIVolumesInput,describe_storedi_scsi_volumes_input\nDescribeStorediSCSIVolumesOutput,describe_storedi_scsi_volumes_output\nDescribeStreamConsumerInput,describe_stream_consumer_input\nDescribeStreamConsumerOutput,describe_stream_consumer_output\nDescribeStreamInput,describe_stream_input\nDescribeStreamOutput,describe_stream_output\nDescribeStreamProcessorRequest,describe_stream_processor_request\nDescribeStreamProcessorResponse,describe_stream_processor_response\nDescribeStreamRequest,describe_stream_request\nDescribeStreamResponse,describe_stream_response\nDescribeStreamSummaryInput,describe_stream_summary_input\nDescribeStreamSummaryOutput,describe_stream_summary_output\nDescribeStudioInput,describe_studio_input\nDescribeStudioLifecycleConfigRequest,describe_studio_lifecycle_config_request\nDescribeStudioLifecycleConfigResponse,describe_studio_lifecycle_config_response\nDescribeStudioOutput,describe_studio_output\nDescribeSubnetGroupsRequest,describe_subnet_groups_request\nDescribeSubnetGroupsResponse,describe_subnet_groups_response\nDescribeSubnetsRequest,describe_subnets_request\nDescribeSubnetsResult,describe_subnets_result\nDescribeSubscribedWorkteamRequest,describe_subscribed_workteam_request\nDescribeSubscribedWorkteamResponse,describe_subscribed_workteam_response\nDescribeSubscribersForNotificationRequest,describe_subscribers_for_notification_request\nDescribeSubscribersForNotificationResponse,describe_subscribers_for_notification_response\nDescribeSubscriptionFiltersRequest,describe_subscription_filters_request\nDescribeSubscriptionFiltersResponse,describe_subscription_filters_response\nDescribeSubscriptionResponse,describe_subscription_response\nDescribeSuggestersRequest,describe_suggesters_request\nDescribeSuggestersResponse,describe_suggesters_response\nDescribeSupportedLanguagesRequest,describe_supported_languages_request\nDescribeSupportedLanguagesResponse,describe_supported_languages_response\nDescribeTLSInspectionConfigurationRequest,describe_tls_inspection_configuration_request\nDescribeTLSInspectionConfigurationResponse,describe_tls_inspection_configuration_response\nDescribeTableDataImportJobRequest,describe_table_data_import_job_request\nDescribeTableDataImportJobResult,describe_table_data_import_job_result\nDescribeTableInput,describe_table_input\nDescribeTableOutput,describe_table_output\nDescribeTableReplicaAutoScalingInput,describe_table_replica_auto_scaling_input\nDescribeTableReplicaAutoScalingOutput,describe_table_replica_auto_scaling_output\nDescribeTableRequest,describe_table_request\nDescribeTableResponse,describe_table_response\nDescribeTableRestoreStatusMessage,describe_table_restore_status_message\nDescribeTableStatisticsMessage,describe_table_statistics_message\nDescribeTableStatisticsResponse,describe_table_statistics_response\nDescribeTagOptionInput,describe_tag_option_input\nDescribeTagOptionOutput,describe_tag_option_output\nDescribeTagsInput,describe_tags_input\nDescribeTagsMessage,describe_tags_message\nDescribeTagsOutput,describe_tags_output\nDescribeTagsRequest,describe_tags_request\nDescribeTagsResponse,describe_tags_response\nDescribeTagsResult,describe_tags_result\nDescribeTagsType,describe_tags_type\nDescribeTapeArchivesInput,describe_tape_archives_input\nDescribeTapeArchivesOutput,describe_tape_archives_output\nDescribeTapeRecoveryPointsInput,describe_tape_recovery_points_input\nDescribeTapeRecoveryPointsOutput,describe_tape_recovery_points_output\nDescribeTapesInput,describe_tapes_input\nDescribeTapesOutput,describe_tapes_output\nDescribeTargetGroupAttributesInput,describe_target_group_attributes_input\nDescribeTargetGroupAttributesOutput,describe_target_group_attributes_output\nDescribeTargetGroupsInput,describe_target_groups_input\nDescribeTargetGroupsOutput,describe_target_groups_output\nDescribeTargetHealthInput,describe_target_health_input\nDescribeTargetHealthOutput,describe_target_health_output\nDescribeTargetedSentimentDetectionJobRequest,describe_targeted_sentiment_detection_job_request\nDescribeTargetedSentimentDetectionJobResponse,describe_targeted_sentiment_detection_job_response\nDescribeTaskDefinitionRequest,describe_task_definition_request\nDescribeTaskDefinitionResponse,describe_task_definition_response\nDescribeTaskExecutionRequest,describe_task_execution_request\nDescribeTaskExecutionResponse,describe_task_execution_response\nDescribeTaskInput,describe_task_input\nDescribeTaskOutput,describe_task_output\nDescribeTaskRequest,describe_task_request\nDescribeTaskResponse,describe_task_response\nDescribeTaskSetsRequest,describe_task_sets_request\nDescribeTaskSetsResponse,describe_task_sets_response\nDescribeTasksRequest,describe_tasks_request\nDescribeTasksResponse,describe_tasks_response\nDescribeTemplateAliasRequest,describe_template_alias_request\nDescribeTemplateAliasResponse,describe_template_alias_response\nDescribeTemplateDefinitionRequest,describe_template_definition_request\nDescribeTemplateDefinitionResponse,describe_template_definition_response\nDescribeTemplatePermissionsRequest,describe_template_permissions_request\nDescribeTemplatePermissionsResponse,describe_template_permissions_response\nDescribeTemplateRequest,describe_template_request\nDescribeTemplateResponse,describe_template_response\nDescribeTerminationPolicyTypesAnswer,describe_termination_policy_types_answer\nDescribeTestCasesInput,describe_test_cases_input\nDescribeTestCasesOutput,describe_test_cases_output\nDescribeTestExecutionRequest,describe_test_execution_request\nDescribeTestExecutionResponse,describe_test_execution_response\nDescribeTestSetDiscrepancyReportRequest,describe_test_set_discrepancy_report_request\nDescribeTestSetDiscrepancyReportResponse,describe_test_set_discrepancy_report_response\nDescribeTestSetGenerationRequest,describe_test_set_generation_request\nDescribeTestSetGenerationResponse,describe_test_set_generation_response\nDescribeTestSetRequest,describe_test_set_request\nDescribeTestSetResponse,describe_test_set_response\nDescribeTextTranslationJobRequest,describe_text_translation_job_request\nDescribeTextTranslationJobResponse,describe_text_translation_job_response\nDescribeThemeAliasRequest,describe_theme_alias_request\nDescribeThemeAliasResponse,describe_theme_alias_response\nDescribeThemePermissionsRequest,describe_theme_permissions_request\nDescribeThemePermissionsResponse,describe_theme_permissions_response\nDescribeThemeRequest,describe_theme_request\nDescribeThemeResponse,describe_theme_response\nDescribeThesaurusRequest,describe_thesaurus_request\nDescribeThesaurusResponse,describe_thesaurus_response\nDescribeThingGroupRequest,describe_thing_group_request\nDescribeThingGroupResponse,describe_thing_group_response\nDescribeThingRegistrationTaskRequest,describe_thing_registration_task_request\nDescribeThingRegistrationTaskResponse,describe_thing_registration_task_response\nDescribeThingRequest,describe_thing_request\nDescribeThingResponse,describe_thing_response\nDescribeThingTypeRequest,describe_thing_type_request\nDescribeThingTypeResponse,describe_thing_type_response\nDescribeThumbnailsRequest,describe_thumbnails_request\nDescribeThumbnailsResponse,describe_thumbnails_response\nDescribeTimeBasedAutoScalingRequest,describe_time_based_auto_scaling_request\nDescribeTimeBasedAutoScalingResult,describe_time_based_auto_scaling_result\nDescribeTimeSeriesRequest,describe_time_series_request\nDescribeTimeSeriesResponse,describe_time_series_response\nDescribeTimeToLiveInput,describe_time_to_live_input\nDescribeTimeToLiveOutput,describe_time_to_live_output\nDescribeTopicPermissionsRequest,describe_topic_permissions_request\nDescribeTopicPermissionsResponse,describe_topic_permissions_response\nDescribeTopicRefreshRequest,describe_topic_refresh_request\nDescribeTopicRefreshResponse,describe_topic_refresh_response\nDescribeTopicRefreshScheduleRequest,describe_topic_refresh_schedule_request\nDescribeTopicRefreshScheduleResponse,describe_topic_refresh_schedule_response\nDescribeTopicRequest,describe_topic_request\nDescribeTopicResponse,describe_topic_response\nDescribeTopicsDetectionJobRequest,describe_topics_detection_job_request\nDescribeTopicsDetectionJobResponse,describe_topics_detection_job_response\nDescribeTrackerRequest,describe_tracker_request\nDescribeTrackerResponse,describe_tracker_response\nDescribeTrafficDistributionGroupRequest,describe_traffic_distribution_group_request\nDescribeTrafficDistributionGroupResponse,describe_traffic_distribution_group_response\nDescribeTrafficMirrorFiltersRequest,describe_traffic_mirror_filters_request\nDescribeTrafficMirrorFiltersResult,describe_traffic_mirror_filters_result\nDescribeTrafficMirrorSessionsRequest,describe_traffic_mirror_sessions_request\nDescribeTrafficMirrorSessionsResult,describe_traffic_mirror_sessions_result\nDescribeTrafficMirrorTargetsRequest,describe_traffic_mirror_targets_request\nDescribeTrafficMirrorTargetsResult,describe_traffic_mirror_targets_result\nDescribeTrafficSourcesRequest,describe_traffic_sources_request\nDescribeTrafficSourcesResponse,describe_traffic_sources_response\nDescribeTrailsRequest,describe_trails_request\nDescribeTrailsResponse,describe_trails_response\nDescribeTrainingJobRequest,describe_training_job_request\nDescribeTrainingJobResponse,describe_training_job_response\nDescribeTransactionRequest,describe_transaction_request\nDescribeTransactionResponse,describe_transaction_response\nDescribeTransformJobRequest,describe_transform_job_request\nDescribeTransformJobResponse,describe_transform_job_response\nDescribeTransitGatewayAttachmentsRequest,describe_transit_gateway_attachments_request\nDescribeTransitGatewayAttachmentsResult,describe_transit_gateway_attachments_result\nDescribeTransitGatewayConnectPeersRequest,describe_transit_gateway_connect_peers_request\nDescribeTransitGatewayConnectPeersResult,describe_transit_gateway_connect_peers_result\nDescribeTransitGatewayConnectsRequest,describe_transit_gateway_connects_request\nDescribeTransitGatewayConnectsResult,describe_transit_gateway_connects_result\nDescribeTransitGatewayMulticastDomainsRequest,describe_transit_gateway_multicast_domains_request\nDescribeTransitGatewayMulticastDomainsResult,describe_transit_gateway_multicast_domains_result\nDescribeTransitGatewayPeeringAttachmentsRequest,describe_transit_gateway_peering_attachments_request\nDescribeTransitGatewayPeeringAttachmentsResult,describe_transit_gateway_peering_attachments_result\nDescribeTransitGatewayPolicyTablesRequest,describe_transit_gateway_policy_tables_request\nDescribeTransitGatewayPolicyTablesResult,describe_transit_gateway_policy_tables_result\nDescribeTransitGatewayRouteTableAnnouncementsRequest,describe_transit_gateway_route_table_announcements_request\nDescribeTransitGatewayRouteTableAnnouncementsResult,describe_transit_gateway_route_table_announcements_result\nDescribeTransitGatewayRouteTablesRequest,describe_transit_gateway_route_tables_request\nDescribeTransitGatewayRouteTablesResult,describe_transit_gateway_route_tables_result\nDescribeTransitGatewayVpcAttachmentsRequest,describe_transit_gateway_vpc_attachments_request\nDescribeTransitGatewayVpcAttachmentsResult,describe_transit_gateway_vpc_attachments_result\nDescribeTransitGatewaysRequest,describe_transit_gateways_request\nDescribeTransitGatewaysResult,describe_transit_gateways_result\nDescribeTrialComponentRequest,describe_trial_component_request\nDescribeTrialComponentResponse,describe_trial_component_response\nDescribeTrialRequest,describe_trial_request\nDescribeTrialResponse,describe_trial_response\nDescribeTrunkInterfaceAssociationsRequest,describe_trunk_interface_associations_request\nDescribeTrunkInterfaceAssociationsResult,describe_trunk_interface_associations_result\nDescribeTrustedAdvisorCheckRefreshStatusesRequest,describe_trusted_advisor_check_refresh_statuses_request\nDescribeTrustedAdvisorCheckRefreshStatusesResponse,describe_trusted_advisor_check_refresh_statuses_response\nDescribeTrustedAdvisorCheckResultRequest,describe_trusted_advisor_check_result_request\nDescribeTrustedAdvisorCheckResultResponse,describe_trusted_advisor_check_result_response\nDescribeTrustedAdvisorCheckSummariesRequest,describe_trusted_advisor_check_summaries_request\nDescribeTrustedAdvisorCheckSummariesResponse,describe_trusted_advisor_check_summaries_response\nDescribeTrustedAdvisorChecksRequest,describe_trusted_advisor_checks_request\nDescribeTrustedAdvisorChecksResponse,describe_trusted_advisor_checks_response\nDescribeTrustsRequest,describe_trusts_request\nDescribeTrustsResult,describe_trusts_result\nDescribeTunnelRequest,describe_tunnel_request\nDescribeTunnelResponse,describe_tunnel_response\nDescribeTypeInput,describe_type_input\nDescribeTypeOutput,describe_type_output\nDescribeTypeRegistrationInput,describe_type_registration_input\nDescribeTypeRegistrationOutput,describe_type_registration_output\nDescribeUpdateActionsMessage,describe_update_actions_message\nDescribeUpdateDirectoryRequest,describe_update_directory_request\nDescribeUpdateDirectoryResult,describe_update_directory_result\nDescribeUpdateRequest,describe_update_request\nDescribeUpdateResponse,describe_update_response\nDescribeUploadBufferInput,describe_upload_buffer_input\nDescribeUploadBufferOutput,describe_upload_buffer_output\nDescribeUsageLimitsMessage,describe_usage_limits_message\nDescribeUsageReportSubscriptionsRequest,describe_usage_report_subscriptions_request\nDescribeUsageReportSubscriptionsResult,describe_usage_report_subscriptions_result\nDescribeUserGroupsMessage,describe_user_groups_message\nDescribeUserGroupsResult,describe_user_groups_result\nDescribeUserHierarchyGroupRequest,describe_user_hierarchy_group_request\nDescribeUserHierarchyGroupResponse,describe_user_hierarchy_group_response\nDescribeUserHierarchyStructureRequest,describe_user_hierarchy_structure_request\nDescribeUserHierarchyStructureResponse,describe_user_hierarchy_structure_response\nDescribeUserImportJobRequest,describe_user_import_job_request\nDescribeUserImportJobResponse,describe_user_import_job_response\nDescribeUserPoolClientRequest,describe_user_pool_client_request\nDescribeUserPoolClientResponse,describe_user_pool_client_response\nDescribeUserPoolDomainRequest,describe_user_pool_domain_request\nDescribeUserPoolDomainResponse,describe_user_pool_domain_response\nDescribeUserPoolRequest,describe_user_pool_request\nDescribeUserPoolResponse,describe_user_pool_response\nDescribeUserProfileRequest,describe_user_profile_request\nDescribeUserProfileResponse,describe_user_profile_response\nDescribeUserProfileResult,describe_user_profile_result\nDescribeUserProfilesRequest,describe_user_profiles_request\nDescribeUserProfilesResult,describe_user_profiles_result\nDescribeUserRequest,describe_user_request\nDescribeUserResponse,describe_user_response\nDescribeUserStackAssociationsRequest,describe_user_stack_associations_request\nDescribeUserStackAssociationsResult,describe_user_stack_associations_result\nDescribeUsersMessage,describe_users_message\nDescribeUsersRequest,describe_users_request\nDescribeUsersResponse,describe_users_response\nDescribeUsersResult,describe_users_result\nDescribeVPCConnectionRequest,describe_vpc_connection_request\nDescribeVPCConnectionResponse,describe_vpc_connection_response\nDescribeVTLDevicesInput,describe_vtl_devices_input\nDescribeVTLDevicesOutput,describe_vtl_devices_output\nDescribeValidDBInstanceModificationsMessage,describe_valid_db_instance_modifications_message\nDescribeValidDBInstanceModificationsResult,describe_valid_db_instance_modifications_result\nDescribeVaultInput,describe_vault_input\nDescribeVaultOutput,describe_vault_output\nDescribeVcenterClientsRequest,describe_vcenter_clients_request\nDescribeVcenterClientsResponse,describe_vcenter_clients_response\nDescribeVerifiedAccessEndpointsRequest,describe_verified_access_endpoints_request\nDescribeVerifiedAccessEndpointsResult,describe_verified_access_endpoints_result\nDescribeVerifiedAccessGroupsRequest,describe_verified_access_groups_request\nDescribeVerifiedAccessGroupsResult,describe_verified_access_groups_result\nDescribeVerifiedAccessInstanceLoggingConfigurationsRequest,describe_verified_access_instance_logging_configurations_request\nDescribeVerifiedAccessInstanceLoggingConfigurationsResult,describe_verified_access_instance_logging_configurations_result\nDescribeVerifiedAccessInstancesRequest,describe_verified_access_instances_request\nDescribeVerifiedAccessInstancesResult,describe_verified_access_instances_result\nDescribeVerifiedAccessTrustProvidersRequest,describe_verified_access_trust_providers_request\nDescribeVerifiedAccessTrustProvidersResult,describe_verified_access_trust_providers_result\nDescribeViewRequest,describe_view_request\nDescribeViewResponse,describe_view_response\nDescribeVirtualClusterRequest,describe_virtual_cluster_request\nDescribeVirtualClusterResponse,describe_virtual_cluster_response\nDescribeVirtualGatewayInput,describe_virtual_gateway_input\nDescribeVirtualGatewayOutput,describe_virtual_gateway_output\nDescribeVirtualInterfacesRequest,describe_virtual_interfaces_request\nDescribeVirtualNodeInput,describe_virtual_node_input\nDescribeVirtualNodeOutput,describe_virtual_node_output\nDescribeVirtualRouterInput,describe_virtual_router_input\nDescribeVirtualRouterOutput,describe_virtual_router_output\nDescribeVirtualServiceInput,describe_virtual_service_input\nDescribeVirtualServiceOutput,describe_virtual_service_output\nDescribeVocabularyRequest,describe_vocabulary_request\nDescribeVocabularyResponse,describe_vocabulary_response\nDescribeVodSourceRequest,describe_vod_source_request\nDescribeVodSourceResponse,describe_vod_source_response\nDescribeVoicesInput,describe_voices_input\nDescribeVoicesOutput,describe_voices_output\nDescribeVolumeAttributeRequest,describe_volume_attribute_request\nDescribeVolumeAttributeResult,describe_volume_attribute_result\nDescribeVolumeStatusRequest,describe_volume_status_request\nDescribeVolumeStatusResult,describe_volume_status_result\nDescribeVolumesModificationsRequest,describe_volumes_modifications_request\nDescribeVolumesModificationsResult,describe_volumes_modifications_result\nDescribeVolumesRequest,describe_volumes_request\nDescribeVolumesResponse,describe_volumes_response\nDescribeVolumesResult,describe_volumes_result\nDescribeVpcAttributeRequest,describe_vpc_attribute_request\nDescribeVpcAttributeResult,describe_vpc_attribute_result\nDescribeVpcClassicLinkDnsSupportRequest,describe_vpc_classic_link_dns_support_request\nDescribeVpcClassicLinkDnsSupportResult,describe_vpc_classic_link_dns_support_result\nDescribeVpcClassicLinkRequest,describe_vpc_classic_link_request\nDescribeVpcClassicLinkResult,describe_vpc_classic_link_result\nDescribeVpcConnectionRequest,describe_vpc_connection_request\nDescribeVpcConnectionResponse,describe_vpc_connection_response\nDescribeVpcConnectorRequest,describe_vpc_connector_request\nDescribeVpcConnectorResponse,describe_vpc_connector_response\nDescribeVpcEndpointConnectionNotificationsRequest,describe_vpc_endpoint_connection_notifications_request\nDescribeVpcEndpointConnectionNotificationsResult,describe_vpc_endpoint_connection_notifications_result\nDescribeVpcEndpointConnectionsRequest,describe_vpc_endpoint_connections_request\nDescribeVpcEndpointConnectionsResult,describe_vpc_endpoint_connections_result\nDescribeVpcEndpointServiceConfigurationsRequest,describe_vpc_endpoint_service_configurations_request\nDescribeVpcEndpointServiceConfigurationsResult,describe_vpc_endpoint_service_configurations_result\nDescribeVpcEndpointServicePermissionsRequest,describe_vpc_endpoint_service_permissions_request\nDescribeVpcEndpointServicePermissionsResult,describe_vpc_endpoint_service_permissions_result\nDescribeVpcEndpointServicesRequest,describe_vpc_endpoint_services_request\nDescribeVpcEndpointServicesResult,describe_vpc_endpoint_services_result\nDescribeVpcEndpointsRequest,describe_vpc_endpoints_request\nDescribeVpcEndpointsResponse,describe_vpc_endpoints_response\nDescribeVpcEndpointsResult,describe_vpc_endpoints_result\nDescribeVpcIngressConnectionRequest,describe_vpc_ingress_connection_request\nDescribeVpcIngressConnectionResponse,describe_vpc_ingress_connection_response\nDescribeVpcPeeringAuthorizationsOutput,describe_vpc_peering_authorizations_output\nDescribeVpcPeeringConnectionsInput,describe_vpc_peering_connections_input\nDescribeVpcPeeringConnectionsOutput,describe_vpc_peering_connections_output\nDescribeVpcPeeringConnectionsRequest,describe_vpc_peering_connections_request\nDescribeVpcPeeringConnectionsResult,describe_vpc_peering_connections_result\nDescribeVpcsRequest,describe_vpcs_request\nDescribeVpcsResult,describe_vpcs_result\nDescribeVpnConnectionsRequest,describe_vpn_connections_request\nDescribeVpnConnectionsResult,describe_vpn_connections_result\nDescribeVpnGatewaysRequest,describe_vpn_gateways_request\nDescribeVpnGatewaysResult,describe_vpn_gateways_result\nDescribeWarmPoolAnswer,describe_warm_pool_answer\nDescribeWarmPoolType,describe_warm_pool_type\nDescribeWatchlistRequest,describe_watchlist_request\nDescribeWatchlistResponse,describe_watchlist_response\nDescribeWebsiteCertificateAuthorityRequest,describe_website_certificate_authority_request\nDescribeWebsiteCertificateAuthorityResponse,describe_website_certificate_authority_response\nDescribeWhatIfAnalysisRequest,describe_what_if_analysis_request\nDescribeWhatIfAnalysisResponse,describe_what_if_analysis_response\nDescribeWhatIfForecastExportRequest,describe_what_if_forecast_export_request\nDescribeWhatIfForecastExportResponse,describe_what_if_forecast_export_response\nDescribeWhatIfForecastRequest,describe_what_if_forecast_request\nDescribeWhatIfForecastResponse,describe_what_if_forecast_response\nDescribeWorkerConfigurationRequest,describe_worker_configuration_request\nDescribeWorkerConfigurationResponse,describe_worker_configuration_response\nDescribeWorkflowExecutionInput,describe_workflow_execution_input\nDescribeWorkflowRequest,describe_workflow_request\nDescribeWorkflowResponse,describe_workflow_response\nDescribeWorkflowTypeInput,describe_workflow_type_input\nDescribeWorkforceRequest,describe_workforce_request\nDescribeWorkforceResponse,describe_workforce_response\nDescribeWorkingStorageInput,describe_working_storage_input\nDescribeWorkingStorageOutput,describe_working_storage_output\nDescribeWorkloadRequest,describe_workload_request\nDescribeWorkloadResponse,describe_workload_response\nDescribeWorkspaceAuthenticationRequest,describe_workspace_authentication_request\nDescribeWorkspaceAuthenticationResponse,describe_workspace_authentication_response\nDescribeWorkspaceBundlesRequest,describe_workspace_bundles_request\nDescribeWorkspaceBundlesResult,describe_workspace_bundles_result\nDescribeWorkspaceConfigurationRequest,describe_workspace_configuration_request\nDescribeWorkspaceConfigurationResponse,describe_workspace_configuration_response\nDescribeWorkspaceDirectoriesRequest,describe_workspace_directories_request\nDescribeWorkspaceDirectoriesResult,describe_workspace_directories_result\nDescribeWorkspaceImagePermissionsRequest,describe_workspace_image_permissions_request\nDescribeWorkspaceImagePermissionsResult,describe_workspace_image_permissions_result\nDescribeWorkspaceImagesRequest,describe_workspace_images_request\nDescribeWorkspaceImagesResult,describe_workspace_images_result\nDescribeWorkspaceRequest,describe_workspace_request\nDescribeWorkspaceResponse,describe_workspace_response\nDescribeWorkspaceSnapshotsRequest,describe_workspace_snapshots_request\nDescribeWorkspaceSnapshotsResult,describe_workspace_snapshots_result\nDescribeWorkspacesConnectionStatusRequest,describe_workspaces_connection_status_request\nDescribeWorkspacesConnectionStatusResult,describe_workspaces_connection_status_result\nDescribeWorkspacesRequest,describe_workspaces_request\nDescribeWorkspacesResult,describe_workspaces_result\nDescribeWorkteamRequest,describe_workteam_request\nDescribeWorkteamResponse,describe_workteam_response\nDescribeWorldExportJobRequest,describe_world_export_job_request\nDescribeWorldExportJobResponse,describe_world_export_job_response\nDescribeWorldGenerationJobRequest,describe_world_generation_job_request\nDescribeWorldGenerationJobResponse,describe_world_generation_job_response\nDescribeWorldRequest,describe_world_request\nDescribeWorldResponse,describe_world_response\nDescribeWorldTemplateRequest,describe_world_template_request\nDescribeWorldTemplateResponse,describe_world_template_response\nDescribedAccess,described_access\nDescribedAgreement,described_agreement\nDescribedCertificate,described_certificate\nDescribedConnector,described_connector\nDescribedExecution,described_execution\nDescribedHostKey,described_host_key\nDescribedProfile,described_profile\nDescribedSecurityPolicy,described_security_policy\nDescribedServer,described_server\nDescribedUser,described_user\nDescribedWorkflow,described_workflow\nDescription,description\nDescriptionPageUrl,description_page_url\nDescriptionRegex,description_regex\nDescriptionTooLongException,description_too_long_exception\nDescriptiveMentionIndex,descriptive_mention_index\nDescriptiveVideoServiceFlag,descriptive_video_service_flag\nDeserializer,deserializer\nDesired,desired\nDesiredCapacity,desired_capacity\nDesiredCapacityType,desired_capacity_type\nDesiredConfiguration,desired_configuration\nDesiredCount,desired_count\nDesiredDataAccessRoleArn,desired_data_access_role_arn\nDesiredDeliveryMediums,desired_delivery_mediums\nDesiredInferenceUnits,desired_inference_units\nDesiredInstanceCount,desired_instance_count\nDesiredInstanceType,desired_instance_type\nDesiredInstances,desired_instances\nDesiredModelArn,desired_model_arn\nDesiredModelVariants,desired_model_variants\nDesiredNumber,desired_number\nDesiredNumberOfDomainControllers,desired_number_of_domain_controllers\nDesiredPartitionCount,desired_partition_count\nDesiredPlayerSession,desired_player_session\nDesiredPlayerSessions,desired_player_sessions\nDesiredReplicationCount,desired_replication_count\nDesiredServerlessConfig,desired_serverless_config\nDesiredShardLevelMetrics,desired_shard_level_metrics\nDesiredStartTime,desired_start_time\nDesiredState,desired_state\nDesiredValue,desired_value\nDesiredWeight,desired_weight\nDesiredWeightAndCapacity,desired_weight_and_capacity\nDesiredWeightsAndCapacities,desired_weights_and_capacities\nDeskPhoneNumber,desk_phone_number\nDestination,destination\nDestination608ChannelNumber,destination608_channel_number\nDestination708ServiceNumber,destination708_service_number\nDestinationAddress,destination_address\nDestinationAddresses,destination_addresses\nDestinationArn,destination_arn\nDestinationBackup,destination_backup\nDestinationBackupVaultArn,destination_backup_vault_arn\nDestinationBranchName,destination_branch_name\nDestinationBucketName,destination_bucket_name\nDestinationCidr,destination_cidr\nDestinationCidrBlock,destination_cidr_block\nDestinationColumn,destination_column\nDestinationCommit,destination_commit\nDestinationConfig,destination_config\nDestinationConfiguration,destination_configuration\nDestinationConfigurationRequest,destination_configuration_request\nDestinationConfigurations,destination_configurations\nDestinationConnectorProperties,destination_connector_properties\nDestinationCountryParameters,destination_country_parameters\nDestinationDataSharing,destination_data_sharing\nDestinationDataSharingType,destination_data_sharing_type\nDestinationDescription,destination_description\nDestinationDescriptions,destination_descriptions\nDestinationDetails,destination_details\nDestinationDomain,destination_domain\nDestinationDomainInfo,destination_domain_info\nDestinationEncryptionAlgorithm,destination_encryption_algorithm\nDestinationEncryptionContext,destination_encryption_context\nDestinationEnvironmentId,destination_environment_id\nDestinationEnvironmentName,destination_environment_name\nDestinationField,destination_field\nDestinationFieldProperties,destination_field_properties\nDestinationFileLocation,destination_file_location\nDestinationFilters,destination_filters\nDestinationFlowConfig,destination_flow_config\nDestinationId,destination_id\nDestinationIdentifier,destination_identifier\nDestinationIdentity,destination_identity\nDestinationImageDescription,destination_image_description\nDestinationImageName,destination_image_name\nDestinationInfo,destination_info\nDestinationIp,destination_ip\nDestinationIpV4,destination_ipv4\nDestinationIpV6,destination_ipv6\nDestinationIpamScopeId,destination_ipam_scope_id\nDestinationIpv6CidrBlock,destination_ipv6_cidr_block\nDestinationItemsLimit,destination_items_limit\nDestinationKeyId,destination_key_id\nDestinationLicenseContext,destination_license_context\nDestinationList,destination_list\nDestinationLocationArn,destination_location_arn\nDestinationName,destination_name\nDestinationNamePrefix,destination_name_prefix\nDestinationNetworkInterfaceArns,destination_network_interface_arns\nDestinationNotAllowedException,destination_not_allowed_exception\nDestinationOptions,destination_options\nDestinationOptionsRequest,destination_options_request\nDestinationOptionsResponse,destination_options_response\nDestinationOutpostArn,destination_outpost_arn\nDestinationParameterName,destination_parameter_name\nDestinationParameterValueConfiguration,destination_parameter_value_configuration\nDestinationParentId,destination_parent_id\nDestinationParentNotFoundException,destination_parent_not_found_exception\nDestinationPath,destination_path\nDestinationPhoneNumber,destination_phone_number\nDestinationPoolName,destination_pool_name\nDestinationPort,destination_port\nDestinationPortMapping,destination_port_mapping\nDestinationPortMappings,destination_port_mappings\nDestinationPortRange,destination_port_range\nDestinationPortRanges,destination_port_ranges\nDestinationPorts,destination_ports\nDestinationPosition,destination_position\nDestinationPositions,destination_positions\nDestinationPrefixListId,destination_prefix_list_id\nDestinationPrefixLists,destination_prefix_lists\nDestinationProjectArn,destination_project_arn\nDestinationProperties,destination_properties\nDestinationQueue,destination_queue\nDestinationRecoveryPointArn,destination_recovery_point_arn\nDestinationRefId,destination_ref_id\nDestinationRegion,destination_region\nDestinationS3Uri,destination_s3_uri\nDestinationSchema,destination_schema\nDestinationSchemaUpdate,destination_schema_update\nDestinationSettings,destination_settings\nDestinationSocketAddress,destination_socket_address\nDestinationStatus,destination_status\nDestinationStatusDescription,destination_status_description\nDestinationStreamArn,destination_stream_arn\nDestinationSummary,destination_summary\nDestinationToCreate,destination_to_create\nDestinationTrafficState,destination_traffic_state\nDestinationType,destination_type\nDestinationUser,destination_user\nDestinationUserIdentifier,destination_user_identifier\nDestinationVpc,destination_vpc\nDestinations,destinations\nDetachCertificateFromDistributionRequest,detach_certificate_from_distribution_request\nDetachCertificateFromDistributionResult,detach_certificate_from_distribution_result\nDetachClassicLinkVpcRequest,detach_classic_link_vpc_request\nDetachClassicLinkVpcResult,detach_classic_link_vpc_result\nDetachCustomerManagedPolicyReferenceFromPermissionSetRequest,detach_customer_managed_policy_reference_from_permission_set_request\nDetachDiskRequest,detach_disk_request\nDetachDiskResult,detach_disk_result\nDetachElasticLoadBalancerRequest,detach_elastic_load_balancer_request\nDetachFromIndex,detach_from_index\nDetachFromIndexRequest,detach_from_index_request\nDetachFromIndexResponse,detach_from_index_response\nDetachGroupPolicyRequest,detach_group_policy_request\nDetachInstancesAnswer,detach_instances_answer\nDetachInstancesFromLoadBalancerRequest,detach_instances_from_load_balancer_request\nDetachInstancesFromLoadBalancerResult,detach_instances_from_load_balancer_result\nDetachInstancesQuery,detach_instances_query\nDetachInternetGatewayRequest,detach_internet_gateway_request\nDetachLoadBalancerFromSubnetsInput,detach_load_balancer_from_subnets_input\nDetachLoadBalancerFromSubnetsOutput,detach_load_balancer_from_subnets_output\nDetachLoadBalancerTargetGroupsType,detach_load_balancer_target_groups_type\nDetachLoadBalancersType,detach_load_balancers_type\nDetachManagedPolicyFromPermissionSetRequest,detach_managed_policy_from_permission_set_request\nDetachNetworkInterfaceRequest,detach_network_interface_request\nDetachObject,detach_object\nDetachObjectRequest,detach_object_request\nDetachObjectResponse,detach_object_response\nDetachPolicy,detach_policy\nDetachPolicyRequest,detach_policy_request\nDetachPrincipalPolicyRequest,detach_principal_policy_request\nDetachRolePolicyRequest,detach_role_policy_request\nDetachSecurityProfileRequest,detach_security_profile_request\nDetachStaticIpRequest,detach_static_ip_request\nDetachStaticIpResult,detach_static_ip_result\nDetachThingPrincipalRequest,detach_thing_principal_request\nDetachTrafficSourcesType,detach_traffic_sources_type\nDetachTypedLink,detach_typed_link\nDetachTypedLinkRequest,detach_typed_link_request\nDetachUserPolicyRequest,detach_user_policy_request\nDetachVerifiedAccessTrustProviderRequest,detach_verified_access_trust_provider_request\nDetachVerifiedAccessTrustProviderResult,detach_verified_access_trust_provider_result\nDetachVolumeInput,detach_volume_input\nDetachVolumeOutput,detach_volume_output\nDetachVolumeRequest,detach_volume_request\nDetachVpnGatewayRequest,detach_vpn_gateway_request\nDetachedObjectIdentifier,detached_object_identifier\nDetail,detail\nDetailType,detail_type\nDetailedError,detailed_error\nDetailedErrorCode,detailed_error_code\nDetailedErrorMessage,detailed_error_message\nDetailedMetricsEnabled,detailed_metrics_enabled\nDetailedResultsLocation,detailed_results_location\nDetailedStatus,detailed_status\nDetailedStatusCodesMetrics,detailed_status_codes_metrics\nDetails,details\nDetailsMap,details_map\nDetectAnomaliesRequest,detect_anomalies_request\nDetectAnomaliesResponse,detect_anomalies_response\nDetectAnomalyResult,detect_anomaly_result\nDetectCustomLabelsRequest,detect_custom_labels_request\nDetectCustomLabelsResponse,detect_custom_labels_response\nDetectDocumentTextModelVersion,detect_document_text_model_version\nDetectDocumentTextRequest,detect_document_text_request\nDetectDocumentTextResponse,detect_document_text_response\nDetectDominantLanguageRequest,detect_dominant_language_request\nDetectDominantLanguageResponse,detect_dominant_language_response\nDetectEntitiesRequest,detect_entities_request\nDetectEntitiesResponse,detect_entities_response\nDetectEntitiesV2Request,detect_entities_v2_request\nDetectEntitiesV2Response,detect_entities_v2_response\nDetectFacesRequest,detect_faces_request\nDetectFacesResponse,detect_faces_response\nDetectKeyPhrasesRequest,detect_key_phrases_request\nDetectKeyPhrasesResponse,detect_key_phrases_response\nDetectLabelsImageBackground,detect_labels_image_background\nDetectLabelsImageForeground,detect_labels_image_foreground\nDetectLabelsImageProperties,detect_labels_image_properties\nDetectLabelsImagePropertiesSettings,detect_labels_image_properties_settings\nDetectLabelsImageQuality,detect_labels_image_quality\nDetectLabelsRequest,detect_labels_request\nDetectLabelsResponse,detect_labels_response\nDetectLabelsSettings,detect_labels_settings\nDetectMetricSetConfigRequest,detect_metric_set_config_request\nDetectMetricSetConfigResponse,detect_metric_set_config_response\nDetectMitigationActionExecution,detect_mitigation_action_execution\nDetectMitigationActionsTaskStatistics,detect_mitigation_actions_task_statistics\nDetectMitigationActionsTaskSummary,detect_mitigation_actions_task_summary\nDetectMitigationActionsTaskTarget,detect_mitigation_actions_task_target\nDetectModerationLabelsRequest,detect_moderation_labels_request\nDetectModerationLabelsResponse,detect_moderation_labels_response\nDetectPHIRequest,detect_phi_request\nDetectPHIResponse,detect_phi_response\nDetectPiiEntitiesRequest,detect_pii_entities_request\nDetectPiiEntitiesResponse,detect_pii_entities_response\nDetectProtectiveEquipmentRequest,detect_protective_equipment_request\nDetectProtectiveEquipmentResponse,detect_protective_equipment_response\nDetectSchema,detect_schema\nDetectSentimentRequest,detect_sentiment_request\nDetectSentimentResponse,detect_sentiment_response\nDetectStackDriftInput,detect_stack_drift_input\nDetectStackDriftOutput,detect_stack_drift_output\nDetectStackResourceDriftInput,detect_stack_resource_drift_input\nDetectStackResourceDriftOutput,detect_stack_resource_drift_output\nDetectStackSetDriftInput,detect_stack_set_drift_input\nDetectStackSetDriftOutput,detect_stack_set_drift_output\nDetectSyntaxRequest,detect_syntax_request\nDetectSyntaxResponse,detect_syntax_response\nDetectTargetedSentimentRequest,detect_targeted_sentiment_request\nDetectTargetedSentimentResponse,detect_targeted_sentiment_response\nDetectTextFilters,detect_text_filters\nDetectTextRequest,detect_text_request\nDetectTextResponse,detect_text_response\nDetectedCsvFormatDescriptor,detected_csv_format_descriptor\nDetectedDataDetails,detected_data_details\nDetectedField,detected_field\nDetectedFileFormatDescriptor,detected_file_format_descriptor\nDetectedJsonFormatDescriptor,detected_json_format_descriptor\nDetectedLanguageCode,detected_language_code\nDetectedLanguageLowConfidenceException,detected_language_low_confidence_exception\nDetectedMetricSetConfig,detected_metric_set_config\nDetectedMetricSource,detected_metric_source\nDetectedProperties,detected_properties\nDetectedS3SourceConfig,detected_s3_source_config\nDetectedSignature,detected_signature\nDetectedSignatures,detected_signatures\nDetectedText,detected_text\nDetectedWorkload,detected_workload\nDetection,detection\nDetectionAttributes,detection_attributes\nDetectionFilter,detection_filter\nDetectionStatus,detection_status\nDetectionStatusReason,detection_status_reason\nDetections,detections\nDetector,detector\nDetectorAdditionalConfiguration,detector_additional_configuration\nDetectorAdditionalConfigurationResult,detector_additional_configuration_result\nDetectorDebugOption,detector_debug_option\nDetectorFeatureConfiguration,detector_feature_configuration\nDetectorFeatureConfigurationResult,detector_feature_configuration_result\nDetectorId,detector_id\nDetectorIds,detector_ids\nDetectorModel,detector_model\nDetectorModelConfiguration,detector_model_configuration\nDetectorModelDefinition,detector_model_definition\nDetectorModelSummary,detector_model_summary\nDetectorModelVersionSummary,detector_model_version_summary\nDetectorState,detector_state\nDetectorStateDefinition,detector_state_definition\nDetectorStateSummary,detector_state_summary\nDetectorSummary,detector_summary\nDetectorVersionSummary,detector_version_summary\nDeterminingPolicyItem,determining_policy_item\nDevAddr,dev_addr\nDevEndpoint,dev_endpoint\nDevEndpointCustomLibraries,dev_endpoint_custom_libraries\nDevEndpointNames,dev_endpoint_names\nDevEndpoints,dev_endpoints\nDevEndpointsNotFound,dev_endpoints_not_found\nDevEnvironmentAccessDetails,dev_environment_access_details\nDevEnvironmentRepositorySummary,dev_environment_repository_summary\nDevEnvironmentSessionConfiguration,dev_environment_session_configuration\nDevEnvironmentSessionSummary,dev_environment_session_summary\nDevEnvironmentSummary,dev_environment_summary\nDevEui,dev_eui\nDevEuiEventTopic,dev_eui_event_topic\nDevStatusReqFreq,dev_status_req_freq\nDeveloperInfo,developer_info\nDeveloperName,developer_name\nDeveloperOnlyAttribute,developer_only_attribute\nDeveloperProviderName,developer_provider_name\nDeveloperUserAlreadyRegisteredException,developer_user_already_registered_exception\nDeveloperUserIdentifier,developer_user_identifier\nDeveloperUserIdentifierList,developer_user_identifier_list\nDevelopmentSchemaArn,development_schema_arn\nDevice,device\nDeviceAggregatedStatus,device_aggregated_status\nDeviceAggregatedStatusFilter,device_aggregated_status_filter\nDeviceArn,device_arn\nDeviceAttributes,device_attributes\nDeviceCaCertificate,device_ca_certificate\nDeviceCertificates,device_certificates\nDeviceConfig,device_config\nDeviceConfiguration,device_configuration\nDeviceConfigurationType,device_configuration_type\nDeviceConnectionStatus,device_connection_status\nDeviceCreateDate,device_create_date\nDeviceCreationFile,device_creation_file\nDeviceCreationFileList,device_creation_file_list\nDeviceData,device_data\nDeviceDefinitionId,device_definition_id\nDeviceDefinitionVersion,device_definition_version\nDeviceDefinitionVersionArn,device_definition_version_arn\nDeviceDefinitionVersionId,device_definition_version_id\nDeviceDeploymentStatus,device_deployment_status\nDeviceDeploymentStatusMessage,device_deployment_status_message\nDeviceDeploymentSummaries,device_deployment_summaries\nDeviceDeploymentSummary,device_deployment_summary\nDeviceDescription,device_description\nDeviceEvent,device_event\nDeviceEvents,device_events\nDeviceFilter,device_filter\nDeviceFleetArn,device_fleet_arn\nDeviceFleetName,device_fleet_name\nDeviceFleetNameContains,device_fleet_name_contains\nDeviceFleetSummaries,device_fleet_summaries\nDeviceFleetSummary,device_fleet_summary\nDeviceGroupKey,device_group_key\nDeviceId,device_id\nDeviceIdentifier,device_identifier\nDeviceIds,device_ids\nDeviceIndex,device_index\nDeviceInstance,device_instance\nDeviceJob,device_job\nDeviceJobConfig,device_job_config\nDeviceJobs,device_jobs\nDeviceKey,device_key\nDeviceLastAuthenticatedDate,device_last_authenticated_date\nDeviceLastModifiedDate,device_last_modified_date\nDeviceMethod,device_method\nDeviceMethodParameters,device_method_parameters\nDeviceMethodResponse,device_method_response\nDeviceMethods,device_methods\nDeviceMinutes,device_minutes\nDeviceModel,device_model\nDeviceModels,device_models\nDeviceName,device_name\nDeviceNameContains,device_name_contains\nDeviceNames,device_names\nDeviceNetworkProfileInfo,device_network_profile_info\nDeviceNotRegisteredException,device_not_registered_exception\nDeviceOfflineException,device_offline_exception\nDeviceOnlyRememberedOnUserPrompt,device_only_remembered_on_user_prompt\nDeviceOperatingSystem,device_operating_system\nDeviceOperatingSystems,device_operating_systems\nDeviceOptions,device_options\nDevicePickupId,device_pickup_id\nDevicePickupSnsTopicARN,device_pickup_sns_topic_arn\nDevicePool,device_pool\nDevicePoolCompatibilityResult,device_pool_compatibility_result\nDevicePosition,device_position\nDevicePositionUpdate,device_position_update\nDevicePositionUpdates,device_position_updates\nDevicePositions,device_positions\nDeviceProfile,device_profile\nDeviceProfileId,device_profile_id\nDeviceProfileList,device_profile_list\nDeviceProfileType,device_profile_type\nDeviceQueueInfo,device_queue_info\nDeviceRegistration,device_registration\nDeviceRegistrationState,device_registration_state\nDeviceRegistrationStateEventConfiguration,device_registration_state_event_configuration\nDeviceRegistrationStateResourceTypeEventConfiguration,device_registration_state_resource_type_event_configuration\nDeviceRegistryEnrichActivity,device_registry_enrich_activity\nDeviceRememberedStatus,device_remembered_status\nDeviceReportedStatus,device_reported_status\nDeviceReportedTime,device_reported_time\nDeviceRestrictions,device_restrictions\nDeviceRetiredException,device_retired_exception\nDeviceSecretVerifierConfig,device_secret_verifier_config\nDeviceSecretVerifierConfigType,device_secret_verifier_config_type\nDeviceSelectionConfig,device_selection_config\nDeviceSelectionConfiguration,device_selection_configuration\nDeviceSelectionResult,device_selection_result\nDeviceSerialNumber,device_serial_number\nDeviceSettingsSyncState,device_settings_sync_state\nDeviceShadowEnrichActivity,device_shadow_enrich_activity\nDeviceState,device_state\nDeviceStats,device_stats\nDeviceStatus,device_status\nDeviceStatusDetail,device_status_detail\nDeviceStatusDetails,device_status_details\nDeviceStatusInfo,device_status_info\nDeviceStreamLimitExceededException,device_stream_limit_exceeded_exception\nDeviceSubsetType,device_subset_type\nDeviceSummaries,device_summaries\nDeviceSummary,device_summary\nDeviceTemplate,device_template\nDeviceToken,device_token\nDeviceTrustProviderType,device_trust_provider_type\nDeviceType,device_type\nDeviceTypeAndroid,device_type_android\nDeviceTypeChromeOs,device_type_chrome_os\nDeviceTypeId,device_type_id\nDeviceTypeIos,device_type_ios\nDeviceTypeLinux,device_type_linux\nDeviceTypeOsx,device_type_osx\nDeviceTypeWeb,device_type_web\nDeviceTypeWindows,device_type_windows\nDeviceTypeZeroClient,device_type_zero_client\nDeviceTypes,device_types\nDeviceUnderTest,device_under_test\nDeviceUpdateStatus,device_update_status\nDeviceUsageType,device_usage_type\nDeviceUserAgent,device_user_agent\nDeviceUserAgents,device_user_agents\nDeviceValidationDomain,device_validation_domain\nDeviceiSCSIAttributes,devicei_scsi_attributes\nDevices,devices\nDhcpConfiguration,dhcp_configuration\nDhcpConfigurations,dhcp_configurations\nDhcpOptions,dhcp_options\nDhcpOptionsId,dhcp_options_id\nDhcpOptionsIds,dhcp_options_ids\nDiagnosticCode,diagnostic_code\nDiagnostics,diagnostics\nDialRequest,dial_request\nDialnorm,dialnorm\nDialogAction,dialog_action\nDialogCodeHookInvocationSetting,dialog_code_hook_invocation_setting\nDialogCodeHookSettings,dialog_code_hook_settings\nDialogState,dialog_state\nDialogueIntelligence,dialogue_intelligence\nDictPageSizeLimit,dict_page_size_limit\nDictionaryKeyThreshold,dictionary_key_threshold\nDiff,diff\nDifference,difference\nDifferenceStatus,difference_status\nDifferenceType,difference_type\nDigest,digest\nDigestAlgorithmMnemonic,digest_algorithm_mnemonic\nDigestAlgorithmType,digest_algorithm_type\nDigestTipAddress,digest_tip_address\nDigestType,digest_type\nDigestValue,digest_value\nDigitalSignature,digital_signature\nDigitalSignatureMethod,digital_signature_method\nDimension,dimension\nDimensionConfigurations,dimension_configurations\nDimensionContribution,dimension_contribution\nDimensionContributionList,dimension_contribution_list\nDimensionDetail,dimension_detail\nDimensionField,dimension_field\nDimensionFilter,dimension_filter\nDimensionFilterList,dimension_filter_list\nDimensionForeground,dimension_foreground\nDimensionGroup,dimension_group\nDimensionGroupDetail,dimension_group_detail\nDimensionKey,dimension_key\nDimensionKeyDescription,dimension_key_description\nDimensionKeyDetail,dimension_key_detail\nDimensionKeys,dimension_keys\nDimensionList,dimension_list\nDimensionMapping,dimension_mapping\nDimensionMappings,dimension_mappings\nDimensionName,dimension_name\nDimensionNameValue,dimension_name_value\nDimensionType,dimension_type\nDimensionValue,dimension_value\nDimensionValueAttributes,dimension_value_attributes\nDimensionValueContribution,dimension_value_contribution\nDimensionValueContributionList,dimension_value_contribution_list\nDimensionValueList,dimension_value_list\nDimensionValueSource,dimension_value_source\nDimensionValueType,dimension_value_type\nDimensionValues,dimension_values\nDimensionValuesWithAttributes,dimension_values_with_attributes\nDimensionalValueCount,dimensional_value_count\nDimensions,dimensions\nDirectConnectClientException,direct_connect_client_exception\nDirectConnectGateway,direct_connect_gateway\nDirectConnectGatewayAssociation,direct_connect_gateway_association\nDirectConnectGatewayAssociationProposal,direct_connect_gateway_association_proposal\nDirectConnectGatewayAttachment,direct_connect_gateway_attachment\nDirectConnectServerException,direct_connect_server_exception\nDirectInternetAccess,direct_internet_access\nDirectJDBCSource,direct_jdbc_source\nDirectKafkaSource,direct_kafka_source\nDirectKinesisSource,direct_kinesis_source\nDirectMessageConfiguration,direct_message_configuration\nDirectPathNoLog,direct_path_no_log\nDirectPathParallelLoad,direct_path_parallel_load\nDirectPutContent,direct_put_content\nDirectSchemaChangePolicy,direct_schema_change_policy\nDirection,direction\nDirectionality,directionality\nDirectories,directories\nDirectory,directory\nDirectoryAlreadyExistsException,directory_already_exists_exception\nDirectoryAlreadyInRegionException,directory_already_in_region_exception\nDirectoryAlreadySharedException,directory_already_shared_exception\nDirectoryArn,directory_arn\nDirectoryConfig,directory_config\nDirectoryConfigs,directory_configs\nDirectoryConnectSettings,directory_connect_settings\nDirectoryConnectSettingsDescription,directory_connect_settings_description\nDirectoryDeletedException,directory_deleted_exception\nDirectoryDescription,directory_description\nDirectoryDescriptions,directory_descriptions\nDirectoryDoesNotExistException,directory_does_not_exist_exception\nDirectoryId,directory_id\nDirectoryIds,directory_ids\nDirectoryInDesiredStateException,directory_in_desired_state_exception\nDirectoryInUseException,directory_in_use_exception\nDirectoryInformation,directory_information\nDirectoryLimitExceededException,directory_limit_exceeded_exception\nDirectoryLimits,directory_limits\nDirectoryMode,directory_mode\nDirectoryName,directory_name\nDirectoryNameConflictsWithFileNameException,directory_name_conflicts_with_file_name_exception\nDirectoryNames,directory_names\nDirectoryNotDisabledException,directory_not_disabled_exception\nDirectoryNotEnabledException,directory_not_enabled_exception\nDirectoryNotSharedException,directory_not_shared_exception\nDirectoryPath,directory_path\nDirectoryRegistration,directory_registration\nDirectoryRegistrationArn,directory_registration_arn\nDirectoryRegistrationSummary,directory_registration_summary\nDirectoryRegistrations,directory_registrations\nDirectoryServiceAuthentication,directory_service_authentication\nDirectoryServiceAuthenticationFailedException,directory_service_authentication_failed_exception\nDirectoryServiceAuthenticationRequest,directory_service_authentication_request\nDirectoryStructure,directory_structure\nDirectoryType,directory_type\nDirectoryUnavailableException,directory_unavailable_exception\nDirectoryUserId,directory_user_id\nDirectoryVpcSettings,directory_vpc_settings\nDirectoryVpcSettingsDescription,directory_vpc_settings_description\nDisableAWSServiceAccessRequest,disable_aws_service_access_request\nDisableActionConfiguration,disable_action_configuration\nDisableAddOnRequest,disable_add_on_request\nDisableAddOnResult,disable_add_on_result\nDisableAddressTransferRequest,disable_address_transfer_request\nDisableAddressTransferResult,disable_address_transfer_result\nDisableAlarmActionRequest,disable_alarm_action_request\nDisableAlarmActionsInput,disable_alarm_actions_input\nDisableApiStop,disable_api_stop\nDisableApiTermination,disable_api_termination\nDisableApplicationLayerAutomaticResponseRequest,disable_application_layer_automatic_response_request\nDisableAutomatedBackup,disable_automated_backup\nDisableAwsNetworkPerformanceMetricSubscriptionRequest,disable_aws_network_performance_metric_subscription_request\nDisableAwsNetworkPerformanceMetricSubscriptionResult,disable_aws_network_performance_metric_subscription_result\nDisableClientAuthenticationRequest,disable_client_authentication_request\nDisableControlInput,disable_control_input\nDisableControlOutput,disable_control_output\nDisableDelegatedAdminAccountRequest,disable_delegated_admin_account_request\nDisableDelegatedAdminAccountResponse,disable_delegated_admin_account_response\nDisableDirectoryRequest,disable_directory_request\nDisableDirectoryResponse,disable_directory_response\nDisableDomain,disable_domain\nDisableDomainAutoRenewRequest,disable_domain_auto_renew_request\nDisableDomainTransferLockRequest,disable_domain_transfer_lock_request\nDisableDomainTransferLockResponse,disable_domain_transfer_lock_response\nDisableDynamicScaling,disable_dynamic_scaling\nDisableEbsEncryptionByDefaultRequest,disable_ebs_encryption_by_default_request\nDisableEbsEncryptionByDefaultResult,disable_ebs_encryption_by_default_result\nDisableEmailNotification,disable_email_notification\nDisableEnhancedMonitoringInput,disable_enhanced_monitoring_input\nDisableExecuteApiEndpoint,disable_execute_api_endpoint\nDisableFastLaunchRequest,disable_fast_launch_request\nDisableFastLaunchResult,disable_fast_launch_result\nDisableFastSnapshotRestoreErrorItem,disable_fast_snapshot_restore_error_item\nDisableFastSnapshotRestoreStateError,disable_fast_snapshot_restore_state_error\nDisableFastSnapshotRestoreStateErrorItem,disable_fast_snapshot_restore_state_error_item\nDisableFastSnapshotRestoreSuccessItem,disable_fast_snapshot_restore_success_item\nDisableFastSnapshotRestoresRequest,disable_fast_snapshot_restores_request\nDisableFastSnapshotRestoresResult,disable_fast_snapshot_restores_result\nDisableGatewayInput,disable_gateway_input\nDisableGatewayOutput,disable_gateway_output\nDisableGlueTableCreation,disable_glue_table_creation\nDisableHostedZoneDNSSECRequest,disable_hosted_zone_dnssec_request\nDisableHostedZoneDNSSECResponse,disable_hosted_zone_dnssec_response\nDisableImageBlockPublicAccessRequest,disable_image_block_public_access_request\nDisableImageBlockPublicAccessResult,disable_image_block_public_access_result\nDisableImageDeprecationRequest,disable_image_deprecation_request\nDisableImageDeprecationResult,disable_image_deprecation_result\nDisableImportFindingsForProductRequest,disable_import_findings_for_product_request\nDisableIndexing,disable_indexing\nDisableInsightRulesInput,disable_insight_rules_input\nDisableInsightRulesOutput,disable_insight_rules_output\nDisableIpamOrganizationAdminAccountRequest,disable_ipam_organization_admin_account_request\nDisableIpamOrganizationAdminAccountResult,disable_ipam_organization_admin_account_result\nDisableKeyRequest,disable_key_request\nDisableKeyRotationRequest,disable_key_rotation_request\nDisableLDAPSRequest,disable_ldaps_request\nDisableLniAtDeviceIndex,disable_lni_at_device_index\nDisableLocalGroups,disable_local_groups\nDisableLogTypes,disable_log_types\nDisableLoggingMessage,disable_logging_message\nDisableMetricsCollectionQuery,disable_metrics_collection_query\nDisableNetworking,disable_networking\nDisableOrganizationAdminAccountRequest,disable_organization_admin_account_request\nDisablePolicyTypeRequest,disable_policy_type_request\nDisablePolicyTypeResponse,disable_policy_type_response\nDisableProfiler,disable_profiler\nDisableRadiusRequest,disable_radius_request\nDisableRegionRequest,disable_region_request\nDisableRemoteControl,disable_remote_control\nDisableRequest,disable_request\nDisableResponse,disable_response\nDisableRollback,disable_rollback\nDisableRuleRequest,disable_rule_request\nDisableScaleIn,disable_scale_in\nDisableSchemaValidation,disable_schema_validation\nDisableSerialConsoleAccessRequest,disable_serial_console_access_request\nDisableSerialConsoleAccessResult,disable_serial_console_access_result\nDisableSnapshotCopyMessage,disable_snapshot_copy_message\nDisableSnapshotCopyResult,disable_snapshot_copy_result\nDisableSsl,disable_ssl\nDisableSsoRequest,disable_sso_request\nDisableStageTransitionInput,disable_stage_transition_input\nDisableTemplateValidation,disable_template_validation\nDisableTopicRuleRequest,disable_topic_rule_request\nDisableTransitGatewayRouteTablePropagationRequest,disable_transit_gateway_route_table_propagation_request\nDisableTransitGatewayRouteTablePropagationResult,disable_transit_gateway_route_table_propagation_result\nDisableUseAsDirectQuerySource,disable_use_as_direct_query_source\nDisableUseAsImportedSource,disable_use_as_imported_source\nDisableUserRequest,disable_user_request\nDisableUserResponse,disable_user_response\nDisableValueTrimming,disable_value_trimming\nDisableVgwRoutePropagationRequest,disable_vgw_route_propagation_request\nDisableVpcClassicLinkDnsSupportRequest,disable_vpc_classic_link_dns_support_request\nDisableVpcClassicLinkDnsSupportResult,disable_vpc_classic_link_dns_support_result\nDisableVpcClassicLinkRequest,disable_vpc_classic_link_request\nDisableVpcClassicLinkResult,disable_vpc_classic_link_result\nDisabled,disabled\nDisabledApiException,disabled_api_exception\nDisabledDate,disabled_date\nDisabledException,disabled_exception\nDisabledOperationException,disabled_operation_exception\nDisabledReason,disabled_reason\nDisabledTime,disabled_time\nDisablingTime,disabling_time\nDisallowedCidrs,disallowed_cidrs\nDisassociateAcceleratorTypes,disassociate_accelerator_types\nDisassociateAccountsInput,disassociate_accounts_input\nDisassociateAccountsOutput,disassociate_accounts_output\nDisassociateAdditionalCodeRepositories,disassociate_additional_code_repositories\nDisassociateAddressRequest,disassociate_address_request\nDisassociateApiRequest,disassociate_api_request\nDisassociateAppBlockBuilderAppBlockRequest,disassociate_app_block_builder_app_block_request\nDisassociateApplicationFleetRequest,disassociate_application_fleet_request\nDisassociateApplicationFromEntitlementRequest,disassociate_application_from_entitlement_request\nDisassociateApplicationsRequest,disassociate_applications_request\nDisassociateApprovalRuleTemplateFromRepositoryInput,disassociate_approval_rule_template_from_repository_input\nDisassociateApprovedOriginRequest,disassociate_approved_origin_request\nDisassociateAssessmentReportEvidenceFolderRequest,disassociate_assessment_report_evidence_folder_request\nDisassociateAssetsRequest,disassociate_assets_request\nDisassociateAttributeGroupRequest,disassociate_attribute_group_request\nDisassociateAttributeGroupResponse,disassociate_attribute_group_response\nDisassociateAwsAccountFromPartnerAccountRequest,disassociate_aws_account_from_partner_account_request\nDisassociateBotRequest,disassociate_bot_request\nDisassociateBrowserSettingsRequest,disassociate_browser_settings_request\nDisassociateBudgetFromResourceInput,disassociate_budget_from_resource_input\nDisassociateCertificateRequest,disassociate_certificate_request\nDisassociateChannelFlowRequest,disassociate_channel_flow_request\nDisassociateClientDeviceFromCoreDeviceEntry,disassociate_client_device_from_core_device_entry\nDisassociateClientDeviceFromCoreDeviceErrorEntry,disassociate_client_device_from_core_device_error_entry\nDisassociateClientVpnTargetNetworkRequest,disassociate_client_vpn_target_network_request\nDisassociateClientVpnTargetNetworkResult,disassociate_client_vpn_target_network_result\nDisassociateConfigurationItemsFromApplicationRequest,disassociate_configuration_items_from_application_request\nDisassociateConnectPeerRequest,disassociate_connect_peer_request\nDisassociateConnectPeerResponse,disassociate_connect_peer_response\nDisassociateConnectionAliasRequest,disassociate_connection_alias_request\nDisassociateConnectionFromLagRequest,disassociate_connection_from_lag_request\nDisassociateConnectorRequest,disassociate_connector_request\nDisassociateContactFromAddressBookRequest,disassociate_contact_from_address_book_request\nDisassociateCreatedArtifactRequest,disassociate_created_artifact_request\nDisassociateCustomDomainRequest,disassociate_custom_domain_request\nDisassociateCustomDomainResponse,disassociate_custom_domain_response\nDisassociateCustomerGatewayRequest,disassociate_customer_gateway_request\nDisassociateCustomerGatewayResponse,disassociate_customer_gateway_response\nDisassociateDRTLogBucketRequest,disassociate_drt_log_bucket_request\nDisassociateDataShareConsumerMessage,disassociate_data_share_consumer_message\nDisassociateDefaultCodeRepository,disassociate_default_code_repository\nDisassociateDelegateFromResourceRequest,disassociate_delegate_from_resource_request\nDisassociateDelegationSignerFromDomainRequest,disassociate_delegation_signer_from_domain_request\nDisassociateDelegationSignerFromDomainResponse,disassociate_delegation_signer_from_domain_response\nDisassociateDeviceFromPlacementRequest,disassociate_device_from_placement_request\nDisassociateDeviceFromRoomRequest,disassociate_device_from_room_request\nDisassociateDiscoveredResourceRequest,disassociate_discovered_resource_request\nDisassociateDomainRequest,disassociate_domain_request\nDisassociateElasticIpRequest,disassociate_elastic_ip_request\nDisassociateEnclaveCertificateIamRoleRequest,disassociate_enclave_certificate_iam_role_request\nDisassociateEnclaveCertificateIamRoleResult,disassociate_enclave_certificate_iam_role_result\nDisassociateEntireAccount,disassociate_entire_account\nDisassociateEntitiesFromExperienceRequest,disassociate_entities_from_experience_request\nDisassociateEntitiesFromExperienceResponse,disassociate_entities_from_experience_response\nDisassociateEnvironmentOperationsRoleMessage,disassociate_environment_operations_role_message\nDisassociateExternalConnectionRequest,disassociate_external_connection_request\nDisassociateExternalConnectionResult,disassociate_external_connection_result\nDisassociateFacesRequest,disassociate_faces_request\nDisassociateFacesResponse,disassociate_faces_response\nDisassociateFileSystemAliasesRequest,disassociate_file_system_aliases_request\nDisassociateFileSystemAliasesResponse,disassociate_file_system_aliases_response\nDisassociateFileSystemInput,disassociate_file_system_input\nDisassociateFileSystemOutput,disassociate_file_system_output\nDisassociateFirewallRuleGroupRequest,disassociate_firewall_rule_group_request\nDisassociateFirewallRuleGroupResponse,disassociate_firewall_rule_group_response\nDisassociateFleetRequest,disassociate_fleet_request\nDisassociateFraudsterRequest,disassociate_fraudster_request\nDisassociateFraudsterResponse,disassociate_fraudster_response\nDisassociateFromAdministratorAccountRequest,disassociate_from_administrator_account_request\nDisassociateFromMasterAccountRequest,disassociate_from_master_account_request\nDisassociateGatewayFromServerInput,disassociate_gateway_from_server_input\nDisassociateGatewayFromServerOutput,disassociate_gateway_from_server_output\nDisassociateGlobalReplicationGroupMessage,disassociate_global_replication_group_message\nDisassociateGlobalReplicationGroupResult,disassociate_global_replication_group_result\nDisassociateHealthCheckRequest,disassociate_health_check_request\nDisassociateIamInstanceProfileRequest,disassociate_iam_instance_profile_request\nDisassociateIamInstanceProfileResult,disassociate_iam_instance_profile_result\nDisassociateIdentityProviderConfigRequest,disassociate_identity_provider_config_request\nDisassociateIdentityProviderConfigResponse,disassociate_identity_provider_config_response\nDisassociateInstanceEventWindowRequest,disassociate_instance_event_window_request\nDisassociateInstanceEventWindowResult,disassociate_instance_event_window_result\nDisassociateInstanceStorageConfigRequest,disassociate_instance_storage_config_request\nDisassociateIpAccessSettingsRequest,disassociate_ip_access_settings_request\nDisassociateIpGroupsRequest,disassociate_ip_groups_request\nDisassociateIpamResourceDiscoveryRequest,disassociate_ipam_resource_discovery_request\nDisassociateIpamResourceDiscoveryResult,disassociate_ipam_resource_discovery_result\nDisassociateKmsKeyRequest,disassociate_kms_key_request\nDisassociateLambdaFunctionRequest,disassociate_lambda_function_request\nDisassociateLensesInput,disassociate_lenses_input\nDisassociateLexBotRequest,disassociate_lex_bot_request\nDisassociateLicenseRequest,disassociate_license_request\nDisassociateLicenseResponse,disassociate_license_response\nDisassociateLifecycleConfig,disassociate_lifecycle_config\nDisassociateLinkRequest,disassociate_link_request\nDisassociateLinkResponse,disassociate_link_response\nDisassociateMacSecKeyRequest,disassociate_mac_sec_key_request\nDisassociateMacSecKeyResponse,disassociate_mac_sec_key_response\nDisassociateMemberAccountRequest,disassociate_member_account_request\nDisassociateMemberFromGroupRequest,disassociate_member_from_group_request\nDisassociateMemberRequest,disassociate_member_request\nDisassociateMemberResponse,disassociate_member_response\nDisassociateMembersRequest,disassociate_members_request\nDisassociateMembersResponse,disassociate_members_response\nDisassociateMembershipRequest,disassociate_membership_request\nDisassociateMergedGraphqlApiRequest,disassociate_merged_graphql_api_request\nDisassociateMergedGraphqlApiResponse,disassociate_merged_graphql_api_response\nDisassociateMulticastGroupFromFuotaTaskRequest,disassociate_multicast_group_from_fuota_task_request\nDisassociateNatGatewayAddressRequest,disassociate_nat_gateway_address_request\nDisassociateNatGatewayAddressResult,disassociate_nat_gateway_address_result\nDisassociateNetworkSettingsRequest,disassociate_network_settings_request\nDisassociateNodeRequest,disassociate_node_request\nDisassociateNodeResponse,disassociate_node_response\nDisassociateOpsItemRelatedItemRequest,disassociate_ops_item_related_item_request\nDisassociateOriginationIdentityRequest,disassociate_origination_identity_request\nDisassociateOriginationIdentityResult,disassociate_origination_identity_result\nDisassociatePersonasFromEntitiesRequest,disassociate_personas_from_entities_request\nDisassociatePersonasFromEntitiesResponse,disassociate_personas_from_entities_response\nDisassociatePhoneNumberContactFlowRequest,disassociate_phone_number_contact_flow_request\nDisassociatePhoneNumberFromUserRequest,disassociate_phone_number_from_user_request\nDisassociatePhoneNumbersFromVoiceConnectorGroupRequest,disassociate_phone_numbers_from_voice_connector_group_request\nDisassociatePhoneNumbersFromVoiceConnectorGroupResponse,disassociate_phone_numbers_from_voice_connector_group_response\nDisassociatePhoneNumbersFromVoiceConnectorRequest,disassociate_phone_numbers_from_voice_connector_request\nDisassociatePhoneNumbersFromVoiceConnectorResponse,disassociate_phone_numbers_from_voice_connector_response\nDisassociatePricingRulesInput,disassociate_pricing_rules_input\nDisassociatePricingRulesOutput,disassociate_pricing_rules_output\nDisassociatePrincipalFromPortfolioInput,disassociate_principal_from_portfolio_input\nDisassociateProductFromPortfolioInput,disassociate_product_from_portfolio_input\nDisassociateProfilesInput,disassociate_profiles_input\nDisassociateQualificationFromWorkerRequest,disassociate_qualification_from_worker_request\nDisassociateQueueQuickConnectsRequest,disassociate_queue_quick_connects_request\nDisassociateRecoveryPointFromParentInput,disassociate_recovery_point_from_parent_input\nDisassociateRecoveryPointInput,disassociate_recovery_point_input\nDisassociateRepositoryRequest,disassociate_repository_request\nDisassociateRepositoryResponse,disassociate_repository_response\nDisassociateResolverEndpointIpAddressRequest,disassociate_resolver_endpoint_ip_address_request\nDisassociateResolverEndpointIpAddressResponse,disassociate_resolver_endpoint_ip_address_response\nDisassociateResolverQueryLogConfigRequest,disassociate_resolver_query_log_config_request\nDisassociateResolverQueryLogConfigResponse,disassociate_resolver_query_log_config_response\nDisassociateResolverRuleRequest,disassociate_resolver_rule_request\nDisassociateResolverRuleResponse,disassociate_resolver_rule_response\nDisassociateResourceRequest,disassociate_resource_request\nDisassociateResourceResponse,disassociate_resource_response\nDisassociateResourceResponseElement,disassociate_resource_response_element\nDisassociateResourceSharePermissionRequest,disassociate_resource_share_permission_request\nDisassociateResourceSharePermissionResponse,disassociate_resource_share_permission_response\nDisassociateResourceShareRequest,disassociate_resource_share_request\nDisassociateResourceShareResponse,disassociate_resource_share_response\nDisassociateRoleFromGroupRequest,disassociate_role_from_group_request\nDisassociateRoleFromGroupResponse,disassociate_role_from_group_response\nDisassociateRouteTableRequest,disassociate_route_table_request\nDisassociateRoutingProfileQueuesRequest,disassociate_routing_profile_queues_request\nDisassociateS3ResourcesRequest,disassociate_s3_resources_request\nDisassociateS3ResourcesResult,disassociate_s3_resources_result\nDisassociateSchedule,disassociate_schedule\nDisassociateSecurityKeyRequest,disassociate_security_key_request\nDisassociateServiceActionFromProvisioningArtifactInput,disassociate_service_action_from_provisioning_artifact_input\nDisassociateServiceRoleFromAccountResponse,disassociate_service_role_from_account_response\nDisassociateSigninDelegateGroupsFromAccountRequest,disassociate_signin_delegate_groups_from_account_request\nDisassociateSkillFromSkillGroupRequest,disassociate_skill_from_skill_group_request\nDisassociateSkillFromUsersRequest,disassociate_skill_from_users_request\nDisassociateSkillGroupFromRoomRequest,disassociate_skill_group_from_room_request\nDisassociateSourceGraphqlApiRequest,disassociate_source_graphql_api_request\nDisassociateSourceGraphqlApiResponse,disassociate_source_graphql_api_response\nDisassociateSourceServersRequest,disassociate_source_servers_request\nDisassociateSubnetCidrBlockRequest,disassociate_subnet_cidr_block_request\nDisassociateSubnetCidrBlockResult,disassociate_subnet_cidr_block_result\nDisassociateSubnetsRequest,disassociate_subnets_request\nDisassociateSubnetsResponse,disassociate_subnets_response\nDisassociateTagOptionFromResourceInput,disassociate_tag_option_from_resource_input\nDisassociateTeamMemberRequest,disassociate_team_member_request\nDisassociateThirdPartyFirewallRequest,disassociate_third_party_firewall_request\nDisassociateThirdPartyFirewallResponse,disassociate_third_party_firewall_response\nDisassociateTimeSeriesFromAssetPropertyRequest,disassociate_time_series_from_asset_property_request\nDisassociateTrackerConsumerRequest,disassociate_tracker_consumer_request\nDisassociateTrafficDistributionGroupUserRequest,disassociate_traffic_distribution_group_user_request\nDisassociateTransitGatewayConnectPeerRequest,disassociate_transit_gateway_connect_peer_request\nDisassociateTransitGatewayConnectPeerResponse,disassociate_transit_gateway_connect_peer_response\nDisassociateTransitGatewayMulticastDomainRequest,disassociate_transit_gateway_multicast_domain_request\nDisassociateTransitGatewayMulticastDomainResult,disassociate_transit_gateway_multicast_domain_result\nDisassociateTransitGatewayPolicyTableRequest,disassociate_transit_gateway_policy_table_request\nDisassociateTransitGatewayPolicyTableResult,disassociate_transit_gateway_policy_table_result\nDisassociateTransitGatewayRouteTableRequest,disassociate_transit_gateway_route_table_request\nDisassociateTransitGatewayRouteTableResult,disassociate_transit_gateway_route_table_result\nDisassociateTrialComponentRequest,disassociate_trial_component_request\nDisassociateTrialComponentResponse,disassociate_trial_component_response\nDisassociateTrunkInterfaceRequest,disassociate_trunk_interface_request\nDisassociateTrunkInterfaceResult,disassociate_trunk_interface_result\nDisassociateTrustStoreRequest,disassociate_trust_store_request\nDisassociateUserAccessLoggingSettingsRequest,disassociate_user_access_logging_settings_request\nDisassociateUserFromPermissionGroupRequest,disassociate_user_from_permission_group_request\nDisassociateUserFromPermissionGroupResponse,disassociate_user_from_permission_group_response\nDisassociateUserRequest,disassociate_user_request\nDisassociateUserResponse,disassociate_user_response\nDisassociateUserSettingsRequest,disassociate_user_settings_request\nDisassociateVPCFromHostedZoneRequest,disassociate_vpc_from_hosted_zone_request\nDisassociateVPCFromHostedZoneResponse,disassociate_vpc_from_hosted_zone_response\nDisassociateVehicleFleetRequest,disassociate_vehicle_fleet_request\nDisassociateVpcCidrBlockRequest,disassociate_vpc_cidr_block_request\nDisassociateVpcCidrBlockResult,disassociate_vpc_cidr_block_result\nDisassociateWebACLRequest,disassociate_web_acl_request\nDisassociateWebsiteAuthorizationProviderRequest,disassociate_website_authorization_provider_request\nDisassociateWebsiteCertificateAuthorityRequest,disassociate_website_certificate_authority_request\nDisassociateWhenNotFound,disassociate_when_not_found\nDisassociateWirelessDeviceFromFuotaTaskRequest,disassociate_wireless_device_from_fuota_task_request\nDisassociateWirelessDeviceFromMulticastGroupRequest,disassociate_wireless_device_from_multicast_group_request\nDisassociateWirelessDeviceFromThingRequest,disassociate_wireless_device_from_thing_request\nDisassociateWirelessGatewayFromCertificateRequest,disassociate_wireless_gateway_from_certificate_request\nDisassociateWirelessGatewayFromThingRequest,disassociate_wireless_gateway_from_thing_request\nDisassociatedAt,disassociated_at\nDisassociatedFace,disassociated_face\nDisassociatedFaces,disassociated_faces\nDisassociationDate,disassociation_date\nDiscardedFiles,discarded_files\nDisconnectCustomKeyStoreRequest,disconnect_custom_key_store_request\nDisconnectFailures,disconnect_failures\nDisconnectFromServiceRequest,disconnect_from_service_request\nDisconnectParticipantRequest,disconnect_participant_request\nDisconnectPlayerRequest,disconnect_player_request\nDisconnectPlayerResult,disconnect_player_result\nDisconnectRecoveryInstanceRequest,disconnect_recovery_instance_request\nDisconnectSourceServerRequest,disconnect_source_server_request\nDisconnectSuccesses,disconnect_successes\nDisconnectTimeoutInSeconds,disconnect_timeout_in_seconds\nDisconnectTimestamp,disconnect_timestamp\nDisconnectUserRequest,disconnect_user_request\nDisconnectionEvent,disconnection_event\nDiscontinuityMode,discontinuity_mode\nDiscontinuityTags,discontinuity_tags\nDiscoverDynamicCardVerificationCode,discover_dynamic_card_verification_code\nDiscoverInputSchemaRequest,discover_input_schema_request\nDiscoverInputSchemaResponse,discover_input_schema_response\nDiscoverInstancesRequest,discover_instances_request\nDiscoverInstancesResponse,discover_instances_response\nDiscoverInstancesRevisionRequest,discover_instances_revision_request\nDiscoverInstancesRevisionResponse,discover_instances_revision_response\nDiscoverPollEndpointRequest,discover_poll_endpoint_request\nDiscoverPollEndpointResponse,discover_poll_endpoint_response\nDiscoveredResource,discovered_resource\nDiscoveredResourceList,discovered_resource_list\nDiscovererArn,discoverer_arn\nDiscovererId,discoverer_id\nDiscovererIdPrefix,discoverer_id_prefix\nDiscovererSummary,discoverer_summary\nDiscoverers,discoverers\nDiscoveryConfig,discovery_config\nDiscoveryData,discovery_data\nDiscoveryIntegrationStatus,discovery_integration_status\nDiscoveryJobArn,discovery_job_arn\nDiscoveryJobListEntry,discovery_job_list_entry\nDiscoveryJobs,discovery_jobs\nDiscoveryRegion,discovery_region\nDiscoveryServerConfiguration,discovery_server_configuration\nDiscoveryStatus,discovery_status\nDiscoveryType,discovery_type\nDisk,disk\nDiskAllocationResource,disk_allocation_resource\nDiskAllocationType,disk_allocation_type\nDiskAttributeList,disk_attribute_list\nDiskContainer,disk_container\nDiskContainers,disk_containers\nDiskId,disk_id\nDiskIds,disk_ids\nDiskImage,disk_image\nDiskImageDescription,disk_image_description\nDiskImageDetail,disk_image_detail\nDiskImageFormat,disk_image_format\nDiskImageSize,disk_image_size\nDiskImageVolumeDescription,disk_image_volume_description\nDiskImages,disk_images\nDiskInfo,disk_info\nDiskIopsConfiguration,disk_iops_configuration\nDiskMap,disk_map\nDiskNode,disk_node\nDiskPath,disk_path\nDiskReadBytesPerSecond,disk_read_bytes_per_second\nDiskReadOpsPerSecond,disk_read_ops_per_second\nDiskResourceUtilization,disk_resource_utilization\nDiskSizeInBytes,disk_size_in_bytes\nDiskSnapshot,disk_snapshot\nDiskSnapshotInfo,disk_snapshot_info\nDiskStatus,disk_status\nDiskWriteBytesPerSecond,disk_write_bytes_per_second\nDiskWriteOpsPerSecond,disk_write_ops_per_second\nDisks,disks\nDismissUserContactRequest,dismiss_user_contact_request\nDisplayAs,display_as\nDisplayAspectRatio,display_aspect_ratio\nDisplayConfiguration,display_configuration\nDisplayData,display_data\nDisplayFormat,display_format\nDisplayFormatOptions,display_format_options\nDisplayFragmentNumber,display_fragment_number\nDisplayFragmentTimestamp,display_fragment_timestamp\nDisplayLabel,display_label\nDisplayLanguageCode,display_language_code\nDisplayMode,display_mode\nDisplayName,display_name\nDisplayNamePrefix,display_name_prefix\nDisplayOptions,display_options\nDisplayOrder,display_order\nDisplayText,display_text\nDisplayable,displayable\nDisposePackageVersionsRequest,dispose_package_versions_request\nDisposePackageVersionsResult,dispose_package_versions_result\nDisruptionCompliance,disruption_compliance\nDissociateEntityFromThingRequest,dissociate_entity_from_thing_request\nDissociatePackageRequest,dissociate_package_request\nDissociatePackageResponse,dissociate_package_response\nDistance,distance\nDistanceUnit,distance_unit\nDistinguishedNameQualifier,distinguished_name_qualifier\nDistributeDataset,distribute_dataset\nDistributeDatasetEntriesRequest,distribute_dataset_entries_request\nDistribution,distribution\nDistributionAlreadyExists,distribution_already_exists\nDistributionBundle,distribution_bundle\nDistributionConfig,distribution_config\nDistributionConfigWithTags,distribution_config_with_tags\nDistributionConfiguration,distribution_configuration\nDistributionConfigurationSummary,distribution_configuration_summary\nDistributionId,distribution_id\nDistributionIdList,distribution_id_list\nDistributionList,distribution_list\nDistributionNotDisabled,distribution_not_disabled\nDistributionSummary,distribution_summary\nDistributions,distributions\nDistributor,distributor\nDistributorId,distributor_id\nDistrictOrCounty,district_or_county\nDkimAttributes,dkim_attributes\nDkimEnabled,dkim_enabled\nDkimPercentage,dkim_percentage\nDkimSigningAttributes,dkim_signing_attributes\nDkimStatus,dkim_status\nDkimTokens,dkim_tokens\nDkimVerificationStatus,dkim_verification_status\nDlBucketSize,dl_bucket_size\nDlClass,dl_class\nDlDr,dl_dr\nDlFreq,dl_freq\nDlRate,dl_rate\nDlRatePolicy,dl_rate_policy\nDlqEventQueueArn,dlq_event_queue_arn\nDmsTransferSettings,dms_transfer_settings\nDns,dns\nDnsAddresses,dns_addresses\nDnsConfig,dns_config\nDnsConfigChange,dns_config_change\nDnsDuplicateRuleGroupViolation,dns_duplicate_rule_group_violation\nDnsEntries,dns_entries\nDnsEntry,dns_entry\nDnsIpAddr,dns_ip_addr\nDnsIpAddresses,dns_ip_addresses\nDnsIpAddrs,dns_ip_addrs\nDnsIps,dns_ips\nDnsLogs,dns_logs\nDnsName,dns_name\nDnsNameServers,dns_name_servers\nDnsOptions,dns_options\nDnsOptionsSpecification,dns_options_specification\nDnsProperties,dns_properties\nDnsRecord,dns_record\nDnsRecordCreationState,dns_record_creation_state\nDnsRecordIpType,dns_record_ip_type\nDnsRecords,dns_records\nDnsRequestAction,dns_request_action\nDnsResolvers,dns_resolvers\nDnsRuleGroupLimitExceededViolation,dns_rule_group_limit_exceeded_violation\nDnsRuleGroupPriorityConflictViolation,dns_rule_group_priority_conflict_violation\nDnsSearchDomains,dns_search_domains\nDnsSec,dns_sec\nDnsServers,dns_servers\nDnsServersOptionsModifyStructure,dns_servers_options_modify_structure\nDnsServiceDiscovery,dns_service_discovery\nDnsSupport,dns_support\nDnsTargetResource,dns_target_resource\nDnssecKey,dnssec_key\nDnssecKeys,dnssec_keys\nDnssecLimitExceeded,dnssec_limit_exceeded\nDnssecSigningAttributes,dnssec_signing_attributes\nDocDbDataProviderSettings,doc_db_data_provider_settings\nDocDbSettings,doc_db_settings\nDocService,doc_service\nDockerLabels,docker_labels\nDockerSecurityOptions,docker_security_options\nDockerVolumeConfiguration,docker_volume_configuration\nDocsToInvestigate,docs_to_investigate\nDocument,document\nDocumentAlreadyExists,document_already_exists\nDocumentAttribute,document_attribute\nDocumentAttributeCondition,document_attribute_condition\nDocumentAttributeKey,document_attribute_key\nDocumentAttributeTarget,document_attribute_target\nDocumentAttributeValue,document_attribute_value\nDocumentAttributeValueCountPair,document_attribute_value_count_pair\nDocumentAttributeValueCountPairs,document_attribute_value_count_pairs\nDocumentAttributeValueType,document_attribute_value_type\nDocumentAttributes,document_attributes\nDocumentClass,document_class\nDocumentClassificationConfig,document_classification_config\nDocumentClassificationJobFilter,document_classification_job_filter\nDocumentClassificationJobProperties,document_classification_job_properties\nDocumentClassificationJobPropertiesList,document_classification_job_properties_list\nDocumentClassifierArn,document_classifier_arn\nDocumentClassifierDocuments,document_classifier_documents\nDocumentClassifierFilter,document_classifier_filter\nDocumentClassifierInputDataConfig,document_classifier_input_data_config\nDocumentClassifierName,document_classifier_name\nDocumentClassifierOutputDataConfig,document_classifier_output_data_config\nDocumentClassifierProperties,document_classifier_properties\nDocumentClassifierPropertiesList,document_classifier_properties_list\nDocumentClassifierSummariesList,document_classifier_summaries_list\nDocumentClassifierSummary,document_classifier_summary\nDocumentContentDeletion,document_content_deletion\nDocumentDBEventSourceConfig,document_db_event_source_config\nDocumentDataColumnName,document_data_column_name\nDocumentDataFieldName,document_data_field_name\nDocumentDefaultVersionDescription,document_default_version_description\nDocumentDescription,document_description\nDocumentExcerpt,document_excerpt\nDocumentFilter,document_filter\nDocumentFilterList,document_filter_list\nDocumentFormat,document_format\nDocumentGroup,document_group\nDocumentGroups,document_groups\nDocumentHash,document_hash\nDocumentHashType,document_hash_type\nDocumentId,document_id\nDocumentIdColumnName,document_id_column_name\nDocumentIdList,document_id_list\nDocumentIdOptions,document_id_options\nDocumentIdentifier,document_identifier\nDocumentIdentifiers,document_identifiers\nDocumentIndex,document_index\nDocumentInfo,document_info\nDocumentInfoList,document_info_list\nDocumentKeyValuesFilter,document_key_values_filter\nDocumentLabel,document_label\nDocumentLibraryFieldMappings,document_library_field_mappings\nDocumentLimitExceeded,document_limit_exceeded\nDocumentLocation,document_location\nDocumentLockedForCommentsException,document_locked_for_comments_exception\nDocumentMetadata,document_metadata\nDocumentMetadataConfiguration,document_metadata_configuration\nDocumentMetadataConfigurationUpdates,document_metadata_configuration_updates\nDocumentMetadataConfigurations,document_metadata_configurations\nDocumentMetadataResponseInfo,document_metadata_response_info\nDocumentName,document_name\nDocumentPages,document_pages\nDocumentParameter,document_parameter\nDocumentPermissionLimit,document_permission_limit\nDocumentReadAction,document_read_action\nDocumentReadMode,document_read_mode\nDocumentReaderConfig,document_reader_config\nDocumentRelevanceConfiguration,document_relevance_configuration\nDocumentRelevanceOverrideConfigurations,document_relevance_override_configurations\nDocumentRequires,document_requires\nDocumentReviewCommentSource,document_review_comment_source\nDocumentReviewerResponseSource,document_reviewer_response_source\nDocumentReviews,document_reviews\nDocumentSchemaVersion,document_schema_version\nDocumentServiceException,document_service_exception\nDocumentServiceWarning,document_service_warning\nDocumentSizeInBytes,document_size_in_bytes\nDocumentStatus,document_status\nDocumentStatusList,document_status_list\nDocumentSuggesterOptions,document_suggester_options\nDocumentText,document_text\nDocumentTitle,document_title\nDocumentTitleColumnName,document_title_column_name\nDocumentTitleFieldName,document_title_field_name\nDocumentTooLargeException,document_too_large_exception\nDocumentType,document_type\nDocumentTypeListItem,document_type_list_item\nDocumentURI,document_uri\nDocumentVersion,document_version\nDocumentVersionInfo,document_version_info\nDocumentVersionLimitExceeded,document_version_limit_exceeded\nDocumentVersionMetadata,document_version_metadata\nDocumentVersions,document_versions\nDocumentationPart,documentation_part\nDocumentationPartIds,documentation_part_ids\nDocumentationPartLocation,documentation_part_location\nDocumentationParts,documentation_parts\nDocumentationUrl,documentation_url\nDocumentationVersion,documentation_version\nDocumentationVersions,documentation_versions\nDocuments,documents\nDocumentsAdded,documents_added\nDocumentsDeleted,documents_deleted\nDocumentsFailed,documents_failed\nDocumentsMetadataConfiguration,documents_metadata_configuration\nDocumentsModified,documents_modified\nDocumentsScanned,documents_scanned\nDocumentsWithErrorsCount,documents_with_errors_count\nDoesNotExistException,does_not_exist_exception\nDolbyEDecode,dolby_e_decode\nDolbyVision,dolby_vision\nDolbyVision81Settings,dolby_vision81_settings\nDolbyVisionLevel6Metadata,dolby_vision_level6_metadata\nDolbyVisionMetadataXml,dolby_vision_metadata_xml\nDollars,dollars\nDomain,domain\nDomainARN,domain_arn\nDomainAlreadyExistsFault,domain_already_exists_fault\nDomainArn,domain_arn\nDomainAssociation,domain_association\nDomainAuthSecretArn,domain_auth_secret_arn\nDomainCertificateArn,domain_certificate_arn\nDomainConfig,domain_config\nDomainConfiguration,domain_configuration\nDomainConfigurationSummary,domain_configuration_summary\nDomainController,domain_controller\nDomainControllerId,domain_controller_id\nDomainControllerIds,domain_controller_ids\nDomainControllerLimitExceededException,domain_controller_limit_exceeded_exception\nDomainControllers,domain_controllers\nDomainCount,domain_count\nDomainDeliverabilityCampaign,domain_deliverability_campaign\nDomainDeliverabilityCampaigns,domain_deliverability_campaigns\nDomainDeliverabilityTrackingOption,domain_deliverability_tracking_option\nDomainDeprecatedFault,domain_deprecated_fault\nDomainDescription,domain_description\nDomainDescriptionType,domain_description_type\nDomainDetail,domain_detail\nDomainDetails,domain_details\nDomainDnsIps,domain_dns_ips\nDomainEndpoint,domain_endpoint\nDomainEndpointOptions,domain_endpoint_options\nDomainEndpointOptionsStatus,domain_endpoint_options_status\nDomainEndpoints,domain_endpoints\nDomainEntry,domain_entry\nDomainEntryPoint,domain_entry_point\nDomainExecutionRoleArn,domain_execution_role_arn\nDomainFileUrl,domain_file_url\nDomainFqdn,domain_fqdn\nDomainIAMRoleName,domain_iam_role_name\nDomainId,domain_id\nDomainIdEquals,domain_id_equals\nDomainInfo,domain_info\nDomainInformation,domain_information\nDomainInformationContainer,domain_information_container\nDomainInfos,domain_infos\nDomainIspPlacement,domain_isp_placement\nDomainIspPlacements,domain_isp_placements\nDomainJoinInfo,domain_join_info\nDomainLimitExceeded,domain_limit_exceeded\nDomainMembership,domain_membership\nDomainMemberships,domain_memberships\nDomainName,domain_name\nDomainNameConfig,domain_name_config\nDomainNameConfiguration,domain_name_configuration\nDomainNameConfigurations,domain_name_configurations\nDomainNameStatus,domain_name_status\nDomainNameStatusMessage,domain_name_status_message\nDomainNames,domain_names\nDomainNodesStatus,domain_nodes_status\nDomainNodesStatusList,domain_nodes_status_list\nDomainNotFoundFault,domain_not_found_fault\nDomainNotWhitelistedException,domain_not_whitelisted_exception\nDomainOu,domain_ou\nDomainPackageDetails,domain_package_details\nDomainPackageDetailsList,domain_package_details_list\nDomainPackageStatus,domain_package_status\nDomainPrefix,domain_prefix\nDomainPrice,domain_price\nDomainSettings,domain_settings\nDomainSettingsForUpdate,domain_settings_for_update\nDomainSigningPrivateKey,domain_signing_private_key\nDomainSigningSelector,domain_signing_selector\nDomainState,domain_state\nDomainStats,domain_stats\nDomainStatus,domain_status\nDomainStatusList,domain_status_list\nDomainSuggestion,domain_suggestion\nDomainSummaries,domain_summaries\nDomainSummary,domain_summary\nDomainTransferability,domain_transferability\nDomainValidation,domain_validation\nDomainValidationOption,domain_validation_option\nDomainValidationOptions,domain_validation_options\nDomainValidationRecord,domain_validation_record\nDomains,domains\nDominantColor,dominant_color\nDominantColors,dominant_colors\nDominantLanguage,dominant_language\nDominantLanguageDetectionJobFilter,dominant_language_detection_job_filter\nDominantLanguageDetectionJobProperties,dominant_language_detection_job_properties\nDominantLanguageDetectionJobPropertiesList,dominant_language_detection_job_properties_list\nDonutCenterOptions,donut_center_options\nDonutOptions,donut_options\nDoubleArrayOptions,double_array_options\nDoubleColumnStatisticsData,double_column_statistics_data\nDoubleOptions,double_options\nDoubleRange,double_range\nDoubleValue,double_value\nDownScaling,down_scaling\nDownlinkFrequency,downlink_frequency\nDownlinkMode,downlink_mode\nDownlinkQueueMessage,downlink_queue_message\nDownlinkQueueMessagesList,downlink_queue_messages_list\nDownloadDBLogFilePortionDetails,download_db_log_file_portion_details\nDownloadDBLogFilePortionMessage,download_db_log_file_portion_message\nDownloadDefaultKeyPairResult,download_default_key_pair_result\nDownloadSpeed,download_speed\nDownloadUri,download_uri\nDownloadUrl,download_url\nDownmixControl,downmix_control\nDpdTimeoutAction,dpd_timeout_action\nDpdTimeoutSeconds,dpd_timeout_seconds\nDpuExecutionInMillis,dpu_execution_in_millis\nDrMax,dr_max\nDrMin,dr_min\nDraftUploadOutOfSyncException,draft_upload_out_of_sync_exception\nDrcLine,drc_line\nDrcProfile,drc_profile\nDrcRf,drc_rf\nDriftCheckBaselines,drift_check_baselines\nDriftCheckBias,drift_check_bias\nDriftCheckExplainability,drift_check_explainability\nDriftCheckModelDataQuality,drift_check_model_data_quality\nDriftCheckModelQuality,drift_check_model_quality\nDriftDetectionStatus,drift_detection_status\nDriftInformation,drift_information\nDriftStatus,drift_status\nDriftedStackInstancesCount,drifted_stack_instances_count\nDriftedStackResourceCount,drifted_stack_resource_count\nDrillDownFilter,drill_down_filter\nDrillDownFilters,drill_down_filters\nDriveCacheType,drive_cache_type\nDriver,driver\nDriverOpts,driver_opts\nDrmSystems,drm_systems\nDrop,drop\nDropDownControlDisplayOptions,drop_down_control_display_options\nDropDuplicates,drop_duplicates\nDropFields,drop_fields\nDropFrameTimecode,drop_frame_timecode\nDropNullFields,drop_null_fields\nDropdown,dropdown\nDropped,dropped\nDryRun,dry_run\nDryRunConfig,dry_run_config\nDryRunId,dry_run_id\nDryRunMode,dry_run_mode\nDryRunOperation,dry_run_operation\nDryRunOperationException,dry_run_operation_exception\nDryRunProgressStatus,dry_run_progress_status\nDryRunResults,dry_run_results\nDryRunStatus,dry_run_status\nDualStackDnsName,dual_stack_dns_name\nDukptAttributes,dukpt_attributes\nDukptDerivationAttributes,dukpt_derivation_attributes\nDukptDerivationType,dukpt_derivation_type\nDukptEncryptionAttributes,dukpt_encryption_attributes\nDukptKeyDerivationType,dukpt_key_derivation_type\nDukptKeyVariant,dukpt_key_variant\nDuplicateAccessPointNameException,duplicate_access_point_name_exception\nDuplicateAccountException,duplicate_account_exception\nDuplicateCertificateException,duplicate_certificate_exception\nDuplicateDocumentContent,duplicate_document_content\nDuplicateDocumentVersionName,duplicate_document_version_name\nDuplicateHandshakeException,duplicate_handshake_exception\nDuplicateItemException,duplicate_item_exception\nDuplicateListenerException,duplicate_listener_exception\nDuplicateLoadBalancerNameException,duplicate_load_balancer_name_exception\nDuplicateOperationId,duplicate_operation_id\nDuplicateOrganizationalUnitException,duplicate_organizational_unit_exception\nDuplicatePolicyAttachmentException,duplicate_policy_attachment_exception\nDuplicatePolicyException,duplicate_policy_exception\nDuplicatePolicyNameException,duplicate_policy_name_exception\nDuplicateProviderException,duplicate_provider_exception\nDuplicateRecordException,duplicate_record_exception\nDuplicateRegistrationAction,duplicate_registration_action\nDuplicateReportNameException,duplicate_report_name_exception\nDuplicateRequest,duplicate_request\nDuplicateRequestException,duplicate_request_exception\nDuplicateResourceException,duplicate_resource_exception\nDuplicateSSHPublicKeyException,duplicate_ssh_public_key_exception\nDuplicateTagKeysException,duplicate_tag_keys_exception\nDuplicateTargetGroupNameException,duplicate_target_group_name_exception\nDuplicateTimestamps,duplicate_timestamps\nDuplicateUserNameFault,duplicate_user_name_fault\nDuplicatedAuditEventId,duplicated_audit_event_id\nDuplicatedStopRequestException,duplicated_stop_request_exception\nDuration,duration\nDurationFrames,duration_frames\nDurationHistogram,duration_histogram\nDurationInMinutes,duration_in_minutes\nDurationInMs,duration_in_ms\nDurationInSeconds,duration_in_seconds\nDurationInYears,duration_in_years\nDurationMillis,duration_millis\nDurationMinutes,duration_minutes\nDurationMode,duration_mode\nDurationRange,duration_range\nDurationSMPTE,duration_smpte\nDurationSeconds,duration_seconds\nDurationSinceLastAccess,duration_since_last_access\nDurationUnits,duration_units\nDvbNitSettings,dvb_nit_settings\nDvbSdtSettings,dvb_sdt_settings\nDvbSubDestinationSettings,dvb_sub_destination_settings\nDvbSubPids,dvb_sub_pids\nDvbSubSourceSettings,dvb_sub_source_settings\nDvbTdtSettings,dvb_tdt_settings\nDvbTeletextPid,dvb_teletext_pid\nDynamicCardVerificationCode,dynamic_card_verification_code\nDynamicCardVerificationValue,dynamic_card_verification_value\nDynamicConfiguration,dynamic_configuration\nDynamicDefaultValue,dynamic_default_value\nDynamicPartitioningConfiguration,dynamic_partitioning_configuration\nDynamicRangeCompressionLine,dynamic_range_compression_line\nDynamicRangeCompressionProfile,dynamic_range_compression_profile\nDynamicRangeCompressionRf,dynamic_range_compression_rf\nDynamicRangeControl,dynamic_range_control\nDynamicRouting,dynamic_routing\nDynamicScalingConfiguration,dynamic_scaling_configuration\nDynamicScalingInSuspended,dynamic_scaling_in_suspended\nDynamicScalingOutSuspended,dynamic_scaling_out_suspended\nDynamicSubGop,dynamic_sub_gop\nDynamicTransform,dynamic_transform\nDynamicValue,dynamic_value\nDynamicVariable,dynamic_variable\nDynamicVariables,dynamic_variables\nDynamoDB,dynamo_db\nDynamoDBAction,dynamo_db_action\nDynamoDBCatalogSource,dynamo_db_catalog_source\nDynamoDBStreamParameters,dynamo_db_stream_parameters\nDynamoDBTarget,dynamo_db_target\nDynamoDBTargets,dynamo_db_targets\nDynamoDBv2Action,dynamo_dbv2_action\nDynamoDbSettings,dynamo_db_settings\nDynamodbDataSourceConfig,dynamodb_data_source_config\nDynatrace,dynatrace\nDynatraceConnectorProfileCredentials,dynatrace_connector_profile_credentials\nDynatraceConnectorProfileProperties,dynatrace_connector_profile_properties\nDynatraceSourceProperties,dynatrace_source_properties\nE164PhoneNumber,e164_phone_number\nE164PhoneNumbers,e164_phone_numbers\nEBSEnabled,ebs_enabled\nEBSFilter,ebs_filter\nEBSOptions,ebs_options\nEBSOptionsStatus,ebs_options_status\nEBSResourceUtilization,ebs_resource_utilization\nEBSStorageInfo,ebs_storage_info\nEBSUtilizationMetric,ebs_utilization_metric\nEC2AccessDeniedException,ec2_access_denied_exception\nEC2AssociateRouteTableAction,ec2_associate_route_table_action\nEC2Capacities,ec2_capacities\nEC2Capacity,ec2_capacity\nEC2CopyRouteTableAction,ec2_copy_route_table_action\nEC2CreateRouteAction,ec2_create_route_action\nEC2CreateRouteTableAction,ec2_create_route_table_action\nEC2DeleteRouteAction,ec2_delete_route_action\nEC2ErrorCode,ec2_error_code\nEC2FamilyFilter,ec2_family_filter\nEC2InboundPermissions,ec2_inbound_permissions\nEC2InstanceCounts,ec2_instance_counts\nEC2InstanceDetails,ec2_instance_details\nEC2InstanceId,ec2_instance_id\nEC2InstanceIdsToTerminate,ec2_instance_ids_to_terminate\nEC2InstanceLimit,ec2_instance_limit\nEC2InstanceLimits,ec2_instance_limits\nEC2InstanceNotFoundException,ec2_instance_not_found_exception\nEC2InstanceStateInvalidException,ec2_instance_state_invalid_exception\nEC2InstanceType,ec2_instance_type\nEC2InstanceTypeInvalidException,ec2_instance_type_invalid_exception\nEC2InstanceUnavailableException,ec2_instance_unavailable_exception\nEC2ReplaceRouteAction,ec2_replace_route_action\nEC2ReplaceRouteTableAssociationAction,ec2_replace_route_table_association_action\nEC2ResourceDetails,ec2_resource_details\nEC2ResourceUtilization,ec2_resource_utilization\nEC2SecurityGroup,ec2_security_group\nEC2SecurityGroupId,ec2_security_group_id\nEC2SecurityGroupName,ec2_security_group_name\nEC2SecurityGroupOwnerId,ec2_security_group_owner_id\nEC2SecurityGroups,ec2_security_groups\nEC2Specification,ec2_specification\nEC2TagFilter,ec2_tag_filter\nEC2TagSet,ec2_tag_set\nEC2ThrottledException,ec2_throttled_exception\nEC2UnexpectedException,ec2_unexpected_exception\nECSService,ecs_service\nECSServiceMappingLimitExceededException,ecs_service_mapping_limit_exceeded_exception\nECSServiceProjectedMetric,ecs_service_projected_metric\nECSServiceProjectedUtilizationMetric,ecs_service_projected_utilization_metric\nECSServiceRecommendation,ecs_service_recommendation\nECSServiceRecommendationFilter,ecs_service_recommendation_filter\nECSServiceRecommendationOption,ecs_service_recommendation_option\nECSServiceRecommendedOptionProjectedMetric,ecs_service_recommended_option_projected_metric\nECSServiceUtilizationMetric,ecs_service_utilization_metric\nECSTarget,ecs_target\nECSTaskSet,ecs_task_set\nEDNS0ClientSubnetIP,edns0_client_subnet_ip\nEDNS0ClientSubnetMask,edns0_client_subnet_mask\nEFSAuthorizationConfig,efs_authorization_config\nEFSIOException,efsio_exception\nEFSMountConnectivityException,efs_mount_connectivity_exception\nEFSMountFailureException,efs_mount_failure_exception\nEFSMountTimeoutException,efs_mount_timeout_exception\nEFSVolumeConfiguration,efs_volume_configuration\nEKSAnywhereVersion,eks_anywhere_version\nEKSOnDeviceService,eks_on_device_service\nEKSOnDeviceServiceConfiguration,eks_on_device_service_configuration\nELBInfo,elb_info\nEMAIL,email\nEMR,emr\nEMRStepMetadata,emr_step_metadata\nENILimitReachedException,eni_limit_reached_exception\nEQ,eq\nESInstanceDetails,es_instance_details\nETag,e_tag\nEac3AtmosSettings,eac3_atmos_settings\nEac3Settings,eac3_settings\nEapMethod,eap_method\nEarfcn,earfcn\nEarliestBacktrackTime,earliest_backtrack_time\nEarliestRestorableDateTime,earliest_restorable_date_time\nEarliestRestorableTime,earliest_restorable_time\nEarliestTime,earliest_time\nEarthObservationJobErrorDetails,earth_observation_job_error_details\nEarthObservationJobSummaries,earth_observation_job_summaries\nEast,east\nEbif,ebif\nEbpAudioInterval,ebp_audio_interval\nEbpLookaheadMs,ebp_lookahead_ms\nEbpPlacement,ebp_placement\nEbs,ebs\nEbsBlockDevice,ebs_block_device\nEbsBlockDeviceConfig,ebs_block_device_config\nEbsBlockDeviceConfigs,ebs_block_device_configs\nEbsBlockDevices,ebs_block_devices\nEbsCause,ebs_cause\nEbsConfiguration,ebs_configuration\nEbsEncryptionByDefault,ebs_encryption_by_default\nEbsEvent,ebs_event\nEbsInfo,ebs_info\nEbsInstanceBlockDevice,ebs_instance_block_device\nEbsInstanceBlockDeviceSpecification,ebs_instance_block_device_specification\nEbsOptimized,ebs_optimized\nEbsOptimizedAvailable,ebs_optimized_available\nEbsOptimizedByDefault,ebs_optimized_by_default\nEbsOptimizedInfo,ebs_optimized_info\nEbsOptimizedSupport,ebs_optimized_support\nEbsReadBytesPerSecond,ebs_read_bytes_per_second\nEbsReadOpsPerSecond,ebs_read_ops_per_second\nEbsRequestId,ebs_request_id\nEbsResult,ebs_result\nEbsRootVolumeSize,ebs_root_volume_size\nEbsSnapshotConfiguration,ebs_snapshot_configuration\nEbsSnapshotPreservation,ebs_snapshot_preservation\nEbsStorageInfo,ebs_storage_info\nEbsStorageOnly,ebs_storage_only\nEbsVolume,ebs_volume\nEbsVolumeDetails,ebs_volume_details\nEbsVolumeScanDetails,ebs_volume_scan_details\nEbsVolumes,ebs_volumes\nEbsVolumesResult,ebs_volumes_result\nEbsWriteBytesPerSecond,ebs_write_bytes_per_second\nEbsWriteOpsPerSecond,ebs_write_ops_per_second\nEbuTtDDestinationSettings,ebu_tt_d_destination_settings\nEc2AmiResource,ec2_ami_resource\nEc2AmiResources,ec2_ami_resources\nEc2AvailabilityZone,ec2_availability_zone\nEc2Config,ec2_config\nEc2Configuration,ec2_configuration\nEc2ImageId,ec2_image_id\nEc2ImagePropertiesNotSupportedFault,ec2_image_properties_not_supported_fault\nEc2InstanceAggregation,ec2_instance_aggregation\nEc2InstanceAggregationResponse,ec2_instance_aggregation_response\nEc2InstanceAttributes,ec2_instance_attributes\nEc2InstanceConnectEndpoint,ec2_instance_connect_endpoint\nEc2InstanceId,ec2_instance_id\nEc2InstanceIds,ec2_instance_ids\nEc2InstanceRegion,ec2_instance_region\nEc2KeyName,ec2_key_name\nEc2Metadata,ec2_metadata\nEc2RecommendationsExportPreferences,ec2_recommendations_export_preferences\nEc2RequestFailedException,ec2_request_failed_exception\nEc2SecurityGroupId,ec2_security_group_id\nEc2SecurityGroupName,ec2_security_group_name\nEc2SecurityGroupOwnerId,ec2_security_group_owner_id\nEc2SecurityGroups,ec2_security_groups\nEc2State,ec2_state\nEc2SubnetId,ec2_subnet_id\nEc2SubnetIds,ec2_subnet_ids\nEc2VolumeId,ec2_volume_id\nEchoReduction,echo_reduction\nEcmPid,ecm_pid\nEcrConfiguration,ecr_configuration\nEcrConfigurationState,ecr_configuration_state\nEcrContainerImageMetadata,ecr_container_image_metadata\nEcrRepositoryConfiguration,ecr_repository_configuration\nEcrRepositoryMetadata,ecr_repository_metadata\nEcrRescanDurationState,ecr_rescan_duration_state\nEcsCluster,ecs_cluster\nEcsClusterArn,ecs_cluster_arn\nEcsClusterArns,ecs_cluster_arns\nEcsClusterDetails,ecs_cluster_details\nEcsClusterName,ecs_cluster_name\nEcsClusters,ecs_clusters\nEcsContainerInstanceArn,ecs_container_instance_arn\nEcsContainerOverride,ecs_container_override\nEcsEnvironmentFile,ecs_environment_file\nEcsEnvironmentVariable,ecs_environment_variable\nEcsEphemeralStorage,ecs_ephemeral_storage\nEcsInferenceAcceleratorOverride,ecs_inference_accelerator_override\nEcsParameters,ecs_parameters\nEcsResourceRequirement,ecs_resource_requirement\nEcsTaskDetails,ecs_task_details\nEcsTaskOverride,ecs_task_override\nEcsTaskParameters,ecs_task_parameters\nEdge,edge\nEdgeAgentStatus,edge_agent_status\nEdgeConfig,edge_config\nEdgeConfigs,edge_configs\nEdgeDeployment,edge_deployment\nEdgeDeploymentConfig,edge_deployment_config\nEdgeDeploymentFailed,edge_deployment_failed\nEdgeDeploymentFailedInStage,edge_deployment_failed_in_stage\nEdgeDeploymentModelConfig,edge_deployment_model_config\nEdgeDeploymentPending,edge_deployment_pending\nEdgeDeploymentPendingInStage,edge_deployment_pending_in_stage\nEdgeDeploymentPlanArn,edge_deployment_plan_arn\nEdgeDeploymentPlanName,edge_deployment_plan_name\nEdgeDeploymentPlanSummaries,edge_deployment_plan_summaries\nEdgeDeploymentPlanSummary,edge_deployment_plan_summary\nEdgeDeploymentStageStartTime,edge_deployment_stage_start_time\nEdgeDeploymentStatus,edge_deployment_status\nEdgeDeploymentStatusMessage,edge_deployment_status_message\nEdgeDeploymentSuccess,edge_deployment_success\nEdgeDeploymentSuccessInStage,edge_deployment_success_in_stage\nEdgeLocation,edge_location\nEdgeLocations,edge_locations\nEdgeMetric,edge_metric\nEdgeModel,edge_model\nEdgeModelStat,edge_model_stat\nEdgeModelSummary,edge_model_summary\nEdgeOutputConfig,edge_output_config\nEdgePackagingJobArn,edge_packaging_job_arn\nEdgePackagingJobName,edge_packaging_job_name\nEdgePackagingJobStatus,edge_packaging_job_status\nEdgePackagingJobStatusMessage,edge_packaging_job_status_message\nEdgePackagingJobSummaries,edge_packaging_job_summaries\nEdgePackagingJobSummary,edge_packaging_job_summary\nEdgePresetDeploymentOutput,edge_preset_deployment_output\nEdgeRetentionInHours,edge_retention_in_hours\nEdgeStatistics,edge_statistics\nEdgeStructure,edge_structure\nEdgeSummaryStatistics,edge_summary_statistics\nEdgeType,edge_type\nEdges,edges\nEdiPartyName,edi_party_name\nEdition,edition\nEditorId,editor_id\nEfaInfo,efa_info\nEfaSupported,efa_supported\nEffect,effect\nEffectiveDate,effective_date\nEffectiveDeployment,effective_deployment\nEffectiveDeploymentStatusDetails,effective_deployment_status_details\nEffectiveEnd,effective_end\nEffectiveEngineVersion,effective_engine_version\nEffectiveOn,effective_on\nEffectivePatch,effective_patch\nEffectivePatches,effective_patches\nEffectivePermission,effective_permission\nEffectivePolicy,effective_policy\nEffectivePolicyNotFoundException,effective_policy_not_found_exception\nEffectiveRecommendationPreferences,effective_recommendation_preferences\nEffectiveStart,effective_start\nEfsFileLocation,efs_file_location\nEfsFileSystemConfiguration,efs_file_system_configuration\nEfsFilesystemArn,efs_filesystem_arn\nEfsStorageConfiguration,efs_storage_configuration\nEfsVolumeConfiguration,efs_volume_configuration\nEgress,egress\nEgressAccessLogs,egress_access_logs\nEgressBytes,egress_bytes\nEgressCidrBlocks,egress_cidr_blocks\nEgressConfiguration,egress_configuration\nEgressDomain,egress_domain\nEgressEndpoint,egress_endpoint\nEgressEndpoints,egress_endpoints\nEgressFilter,egress_filter\nEgressFilterRules,egress_filter_rules\nEgressGatewayBridge,egress_gateway_bridge\nEgressIp,egress_ip\nEgressOnlyInternetGateway,egress_only_internet_gateway\nEgressOnlyInternetGatewayId,egress_only_internet_gateway_id\nEgressOnlyInternetGatewayIds,egress_only_internet_gateway_ids\nEgressOnlyInternetGateways,egress_only_internet_gateways\nEgressPackets,egress_packets\nEgressType,egress_type\nEirp,eirp\nEksAttemptContainerDetail,eks_attempt_container_detail\nEksAttemptDetail,eks_attempt_detail\nEksClusterDetails,eks_cluster_details\nEksConfiguration,eks_configuration\nEksContainer,eks_container\nEksContainerDetail,eks_container_detail\nEksContainerEnvironmentVariable,eks_container_environment_variable\nEksContainerOverride,eks_container_override\nEksContainerResourceRequirements,eks_container_resource_requirements\nEksContainerSecurityContext,eks_container_security_context\nEksContainerVolumeMount,eks_container_volume_mount\nEksEmptyDir,eks_empty_dir\nEksHostPath,eks_host_path\nEksInfo,eks_info\nEksMetadata,eks_metadata\nEksPodProperties,eks_pod_properties\nEksPodPropertiesDetail,eks_pod_properties_detail\nEksPodPropertiesOverride,eks_pod_properties_override\nEksProperties,eks_properties\nEksPropertiesDetail,eks_properties_detail\nEksPropertiesOverride,eks_properties_override\nEksSecret,eks_secret\nEksSource,eks_source\nEksSourceClusterNamespace,eks_source_cluster_namespace\nEksVolume,eks_volume\nElapsedTimeInActiveSeconds,elapsed_time_in_active_seconds\nElapsedTimeInSeconds,elapsed_time_in_seconds\nElapsedTimeMillis,elapsed_time_millis\nElastiCacheInstanceDetails,elasti_cache_instance_details\nElasticBeanstalkServiceException,elastic_beanstalk_service_exception\nElasticChannelConfiguration,elastic_channel_configuration\nElasticGpuAssociation,elastic_gpu_association\nElasticGpuAssociationId,elastic_gpu_association_id\nElasticGpuAssociationState,elastic_gpu_association_state\nElasticGpuAssociationTime,elastic_gpu_association_time\nElasticGpuAssociations,elastic_gpu_associations\nElasticGpuHealth,elastic_gpu_health\nElasticGpuId,elastic_gpu_id\nElasticGpuIds,elastic_gpu_ids\nElasticGpuSet,elastic_gpu_set\nElasticGpuSpecification,elastic_gpu_specification\nElasticGpuSpecificationResponse,elastic_gpu_specification_response\nElasticGpuSpecificationSet,elastic_gpu_specification_set\nElasticGpuSpecifications,elastic_gpu_specifications\nElasticGpuState,elastic_gpu_state\nElasticGpuType,elastic_gpu_type\nElasticGpus,elastic_gpus\nElasticInferenceAccelerator,elastic_inference_accelerator\nElasticInferenceAcceleratorArn,elastic_inference_accelerator_arn\nElasticInferenceAcceleratorAssociation,elastic_inference_accelerator_association\nElasticInferenceAcceleratorAssociationId,elastic_inference_accelerator_association_id\nElasticInferenceAcceleratorAssociationState,elastic_inference_accelerator_association_state\nElasticInferenceAcceleratorAssociationTime,elastic_inference_accelerator_association_time\nElasticInferenceAcceleratorAssociations,elastic_inference_accelerator_associations\nElasticInferenceAcceleratorHealth,elastic_inference_accelerator_health\nElasticInferenceAcceleratorSet,elastic_inference_accelerator_set\nElasticInferenceAccelerators,elastic_inference_accelerators\nElasticIp,elastic_ip\nElasticIpStatus,elastic_ip_status\nElasticIps,elastic_ips\nElasticLoadBalancer,elastic_load_balancer\nElasticLoadBalancerListener,elastic_load_balancer_listener\nElasticLoadBalancerName,elastic_load_balancer_name\nElasticLoadBalancers,elastic_load_balancers\nElasticResizeNumberOfNodeOptions,elastic_resize_number_of_node_options\nElasticsearchAction,elasticsearch_action\nElasticsearchBufferingHints,elasticsearch_buffering_hints\nElasticsearchClusterConfig,elasticsearch_cluster_config\nElasticsearchClusterConfigStatus,elasticsearch_cluster_config_status\nElasticsearchDataSourceConfig,elasticsearch_data_source_config\nElasticsearchDestinationConfiguration,elasticsearch_destination_configuration\nElasticsearchDestinationDescription,elasticsearch_destination_description\nElasticsearchDestinationUpdate,elasticsearch_destination_update\nElasticsearchDomainConfig,elasticsearch_domain_config\nElasticsearchDomainStatus,elasticsearch_domain_status\nElasticsearchInstanceCount,elasticsearch_instance_count\nElasticsearchInstanceType,elasticsearch_instance_type\nElasticsearchInstanceTypes,elasticsearch_instance_types\nElasticsearchRetryOptions,elasticsearch_retry_options\nElasticsearchSettings,elasticsearch_settings\nElasticsearchVersion,elasticsearch_version\nElasticsearchVersionStatus,elasticsearch_version_status\nElasticsearchVersions,elasticsearch_versions\nElement,element\nElementId,element_id\nElementName,element_name\nElementPath,element_path\nElementStatuses,element_statuses\nElementType,element_type\nElements,elements\nElevation,elevation\nElicitSubSlot,elicit_sub_slot\nElicitationCodeHookInvocationSetting,elicitation_code_hook_invocation_setting\nEligibleForReplication,eligible_for_replication\nEmail,email\nEmailAddress,email_address\nEmailAddressInUseException,email_address_in_use_exception\nEmailChannelRequest,email_channel_request\nEmailChannelResponse,email_channel_response\nEmailConfiguration,email_configuration\nEmailConfigurationFailure,email_configuration_failure\nEmailConfigurationType,email_configuration_type\nEmailContent,email_content\nEmailField,email_field\nEmailForwardingEnabled,email_forwarding_enabled\nEmailIdentities,email_identities\nEmailIdentity,email_identity\nEmailInsights,email_insights\nEmailMessage,email_message\nEmailMessageActivity,email_message_activity\nEmailMessageByLink,email_message_by_link\nEmailRecipients,email_recipients\nEmailReference,email_reference\nEmailSendingAccount,email_sending_account\nEmailSettings,email_settings\nEmailStatus,email_status\nEmailSubject,email_subject\nEmailSubjectByLink,email_subject_by_link\nEmailTags,email_tags\nEmailTemplate,email_template\nEmailTemplateContent,email_template_content\nEmailTemplateMetadata,email_template_metadata\nEmailTemplateRequest,email_template_request\nEmailTemplateResponse,email_template_response\nEmailVerificationMessage,email_verification_message\nEmailVerificationSubject,email_verification_subject\nEmails,emails\nEmbedHostDomains,embed_host_domains\nEmbedUrl,embed_url\nEmbeddedDestinationSettings,embedded_destination_settings\nEmbeddedPlusScte20DestinationSettings,embedded_plus_scte20_destination_settings\nEmbeddedSourceSettings,embedded_source_settings\nEmbeddedTimecodeOverride,embedded_timecode_override\nEmergencyCallingConfiguration,emergency_calling_configuration\nEmergencyContact,emergency_contact\nEmergencyContactList,emergency_contact_list\nEmergencyPhoneNumber,emergency_phone_number\nEmitConsumerLagMetrics,emit_consumer_lag_metrics\nEmitInterval,emit_interval\nEmotion,emotion\nEmotions,emotions\nEmptyAsNull,empty_as_null\nEmptyBatchRequestException,empty_batch_request_exception\nEmptyFillColor,empty_fill_color\nEmptyUploadException,empty_upload_exception\nEmptyVisual,empty_visual\nEmrManagedMasterSecurityGroup,emr_managed_master_security_group\nEmrManagedSlaveSecurityGroup,emr_managed_slave_security_group\nEnaSrdEnabled,ena_srd_enabled\nEnaSrdSpecification,ena_srd_specification\nEnaSrdSupported,ena_srd_supported\nEnaSrdUdpEnabled,ena_srd_udp_enabled\nEnaSrdUdpSpecification,ena_srd_udp_specification\nEnaSupport,ena_support\nEnable,enable\nEnableAWSServiceAccessRequest,enable_aws_service_access_request\nEnableAcceleration,enable_acceleration\nEnableAcceptEncodingBrotli,enable_accept_encoding_brotli\nEnableAcceptEncodingGzip,enable_accept_encoding_gzip\nEnableActionConfiguration,enable_action_configuration\nEnableAddOnRequest,enable_add_on_request\nEnableAddOnResult,enable_add_on_result\nEnableAdditionalMetadata,enable_additional_metadata\nEnableAddressTransferRequest,enable_address_transfer_request\nEnableAddressTransferResult,enable_address_transfer_result\nEnableAlarmActionRequest,enable_alarm_action_request\nEnableAlarmActionsInput,enable_alarm_actions_input\nEnableAllFeaturesResponse,enable_all_features_response\nEnableAllOpsDataSources,enable_all_ops_data_sources\nEnableAnswerMachineDetection,enable_answer_machine_detection\nEnableApplicationLayerAutomaticResponseRequest,enable_application_layer_automatic_response_request\nEnableAutoHealing,enable_auto_healing\nEnableAwsNetworkPerformanceMetricSubscriptionRequest,enable_aws_network_performance_metric_subscription_request\nEnableAwsNetworkPerformanceMetricSubscriptionResult,enable_aws_network_performance_metric_subscription_result\nEnableCapture,enable_capture\nEnableCaseSensitiveIdentifier,enable_case_sensitive_identifier\nEnableChannelIdentification,enable_channel_identification\nEnableClientAuthenticationRequest,enable_client_authentication_request\nEnableCloudwatchLogsExports,enable_cloudwatch_logs_exports\nEnableContinuousBackup,enable_continuous_backup\nEnableControlInput,enable_control_input\nEnableControlOutput,enable_control_output\nEnableCrossAccountsDiscovery,enable_cross_accounts_discovery\nEnableCustomerOwnedIp,enable_customer_owned_ip\nEnableDate,enable_date\nEnableDebugLogDelivery,enable_debug_log_delivery\nEnableDefaultInternetAccess,enable_default_internet_access\nEnableDefaultStandards,enable_default_standards\nEnableDelegatedAdminAccountRequest,enable_delegated_admin_account_request\nEnableDelegatedAdminAccountResponse,enable_delegated_admin_account_response\nEnableDialOut,enable_dial_out\nEnableDictionaryCompression,enable_dictionary_compression\nEnableDirectoryRequest,enable_directory_request\nEnableDirectoryResponse,enable_directory_response\nEnableDns64,enable_dns64\nEnableDnsHostnames,enable_dns_hostnames\nEnableDnsSupport,enable_dns_support\nEnableDomainAutoRenewRequest,enable_domain_auto_renew_request\nEnableDomainTransferLockRequest,enable_domain_transfer_lock_request\nEnableDomainTransferLockResponse,enable_domain_transfer_lock_response\nEnableDynamicFieldUpdate,enable_dynamic_field_update\nEnableECSManagedTags,enable_ecs_managed_tags\nEnableEbsEncryptionByDefaultRequest,enable_ebs_encryption_by_default_request\nEnableEbsEncryptionByDefaultResult,enable_ebs_encryption_by_default_result\nEnableEcsManagedTags,enable_ecs_managed_tags\nEnableEnhancedMonitoringInput,enable_enhanced_monitoring_input\nEnableExecuteCommand,enable_execute_command\nEnableExplanations,enable_explanations\nEnableFastLaunchRequest,enable_fast_launch_request\nEnableFastLaunchResult,enable_fast_launch_result\nEnableFastSnapshotRestoreErrorItem,enable_fast_snapshot_restore_error_item\nEnableFastSnapshotRestoreStateError,enable_fast_snapshot_restore_state_error\nEnableFastSnapshotRestoreStateErrorItem,enable_fast_snapshot_restore_state_error_item\nEnableFastSnapshotRestoreSuccessItem,enable_fast_snapshot_restore_success_item\nEnableFastSnapshotRestoresRequest,enable_fast_snapshot_restores_request\nEnableFastSnapshotRestoresResult,enable_fast_snapshot_restores_result\nEnableGlobalWriteForwarding,enable_global_write_forwarding\nEnableHomogenousTablespace,enable_homogenous_tablespace\nEnableHostedZoneDNSSECRequest,enable_hosted_zone_dnssec_request\nEnableHostedZoneDNSSECResponse,enable_hosted_zone_dnssec_response\nEnableHttpEndpoint,enable_http_endpoint\nEnableHybrid,enable_hybrid\nEnableIAMDatabaseAuthentication,enable_iam_database_authentication\nEnableImageBlockPublicAccessRequest,enable_image_block_public_access_request\nEnableImageBlockPublicAccessResult,enable_image_block_public_access_result\nEnableImageDeprecationRequest,enable_image_deprecation_request\nEnableImageDeprecationResult,enable_image_deprecation_result\nEnableImportFindingsForProductRequest,enable_import_findings_for_product_request\nEnableImportFindingsForProductResponse,enable_import_findings_for_product_response\nEnableInsightRulesInput,enable_insight_rules_input\nEnableInsightRulesOutput,enable_insight_rules_output\nEnableIntegration,enable_integration\nEnableInterContainerTrafficEncryption,enable_inter_container_traffic_encryption\nEnableInternetAccess,enable_internet_access\nEnableInteroperability,enable_interoperability\nEnableIoTLoggingParams,enable_io_t_logging_params\nEnableIotRoleAlias,enable_iot_role_alias\nEnableIpamOrganizationAdminAccountRequest,enable_ipam_organization_admin_account_request\nEnableIpamOrganizationAdminAccountResult,enable_ipam_organization_admin_account_result\nEnableKeyRequest,enable_key_request\nEnableKeyReuseOnNtTokenKeysetStorageFull,enable_key_reuse_on_nt_token_keyset_storage_full\nEnableKeyRotationRequest,enable_key_rotation_request\nEnableLDAPSRequest,enable_ldaps_request\nEnableLniAtDeviceIndex,enable_lni_at_device_index\nEnableLocalWriteForwarding,enable_local_write_forwarding\nEnableLogFileValidation,enable_log_file_validation\nEnableLogTypes,enable_log_types\nEnableLoggingMessage,enable_logging_message\nEnableMFADeviceRequest,enable_mfa_device_request\nEnableMachineLearning,enable_machine_learning\nEnableMacieRequest,enable_macie_request\nEnableMagneticStoreWrites,enable_magnetic_store_writes\nEnableMaintenanceMode,enable_maintenance_mode\nEnableManagedSpotTraining,enable_managed_spot_training\nEnableManifestOutput,enable_manifest_output\nEnableMediaMetricLogs,enable_media_metric_logs\nEnableMetricsCollectionQuery,enable_metrics_collection_query\nEnableMinimumEncryptionConfiguration,enable_minimum_encryption_configuration\nEnableNetworkAddressUsageMetrics,enable_network_address_usage_metrics\nEnableNetworkIsolation,enable_network_isolation\nEnableNonSecurity,enable_non_security\nEnableOnlineStore,enable_online_store\nEnableOrganizationAdminAccountRequest,enable_organization_admin_account_request\nEnablePadding,enable_padding\nEnablePartialResultsStabilization,enable_partial_results_stabilization\nEnablePerformanceInsights,enable_performance_insights\nEnablePolicyTypeRequest,enable_policy_type_request\nEnablePolicyTypeResponse,enable_policy_type_response\nEnablePrimaryIpv6,enable_primary_ipv6\nEnablePropagateAdditionalUserContextData,enable_propagate_additional_user_context_data\nEnableRadiusRequest,enable_radius_request\nEnableReachabilityAnalyzerOrganizationSharingRequest,enable_reachability_analyzer_organization_sharing_request\nEnableReachabilityAnalyzerOrganizationSharingResult,enable_reachability_analyzer_organization_sharing_result\nEnableRegexInPath,enable_regex_in_path\nEnableRegionRequest,enable_region_request\nEnableRequest,enable_request\nEnableResourceNameDnsAAAARecord,enable_resource_name_dns_aaaa_record\nEnableResourceNameDnsAAAARecordOnLaunch,enable_resource_name_dns_aaaa_record_on_launch\nEnableResourceNameDnsARecord,enable_resource_name_dns_a_record\nEnableResourceNameDnsARecordOnLaunch,enable_resource_name_dns_a_record_on_launch\nEnableResponse,enable_response\nEnableRuleRequest,enable_rule_request\nEnableSIPLogs,enable_sip_logs\nEnableSNI,enable_sni\nEnableSSMAccess,enable_ssm_access\nEnableSageMakerMetricsTimeSeries,enable_sage_maker_metrics_time_series\nEnableSamplePath,enable_sample_path\nEnableSecurityHubRequest,enable_security_hub_request\nEnableSelfService,enable_self_service\nEnableSerialConsoleAccessRequest,enable_serial_console_access_request\nEnableSerialConsoleAccessResult,enable_serial_console_access_result\nEnableSharingWithAwsOrganizationResponse,enable_sharing_with_aws_organization_response\nEnableSimpleResponses,enable_simple_responses\nEnableSipMediaApplicationMessageLogs,enable_sip_media_application_message_logs\nEnableSnapshotCopyMessage,enable_snapshot_copy_message\nEnableSnapshotCopyResult,enable_snapshot_copy_result\nEnableSoftwareTokenMFAException,enable_software_token_mfa_exception\nEnableSsl,enable_ssl\nEnableSsoRequest,enable_sso_request\nEnableStageTransitionInput,enable_stage_transition_input\nEnableStatistics,enable_statistics\nEnableTerminationProtection,enable_termination_protection\nEnableTokenRevocation,enable_token_revocation\nEnableTopicRuleRequest,enable_topic_rule_request\nEnableTransitGatewayRouteTablePropagationRequest,enable_transit_gateway_route_table_propagation_request\nEnableTransitGatewayRouteTablePropagationResult,enable_transit_gateway_route_table_propagation_result\nEnableTunnelLifecycleControl,enable_tunnel_lifecycle_control\nEnableUpdateCatalog,enable_update_catalog\nEnableUserRequest,enable_user_request\nEnableUserResponse,enable_user_response\nEnableVgwRoutePropagationRequest,enable_vgw_route_propagation_request\nEnableVisualization,enable_visualization\nEnableVolumeIORequest,enable_volume_io_request\nEnableVpcClassicLinkDnsSupportRequest,enable_vpc_classic_link_dns_support_request\nEnableVpcClassicLinkDnsSupportResult,enable_vpc_classic_link_dns_support_result\nEnableVpcClassicLinkRequest,enable_vpc_classic_link_request\nEnableVpcClassicLinkResult,enable_vpc_classic_link_result\nEnableWWWSubdomain,enable_www_subdomain\nEnableWorkDocs,enable_work_docs\nEnableXRay,enable_x_ray\nEnabled,enabled\nEnabledByDefault,enabled_by_default\nEnabledByMotion,enabled_by_motion\nEnabledCloudWatchLogsExports,enabled_cloud_watch_logs_exports\nEnabledCloudwatchLogsExports,enabled_cloudwatch_logs_exports\nEnabledControlSummary,enabled_control_summary\nEnabledDate,enabled_date\nEnabledInBroker,enabled_in_broker\nEnabledMetric,enabled_metric\nEnabledMetrics,enabled_metrics\nEnabledProtocols,enabled_protocols\nEnabledServicePrincipal,enabled_service_principal\nEnabledServicePrincipals,enabled_service_principals\nEnabledTime,enabled_time\nEnablementType,enablement_type\nEnablingTime,enabling_time\nEncipherOnly,encipher_only\nEnclaveOptions,enclave_options\nEnclaveOptionsRequest,enclave_options_request\nEncodedData,encoded_data\nEncodedKey,encoded_key\nEncodedMessage,encoded_message\nEncoderProfile,encoder_profile\nEncoderSettings,encoder_settings\nEncoding,encoding\nEncodingName,encoding_name\nEncodingParameters,encoding_parameters\nEncodingParametersRequest,encoding_parameters_request\nEncodingType,encoding_type\nEncrypt,encrypt\nEncryptDataInput,encrypt_data_input\nEncryptDataOutput,encrypt_data_output\nEncryptRequest,encrypt_request\nEncryptResponse,encrypt_response\nEncrypted,encrypted\nEncryptedDecryptionKey,encrypted_decryption_key\nEncryptedKeyMaterial,encrypted_key_material\nEncryptedPinBlock,encrypted_pin_block\nEncryptedWithHSM,encrypted_with_hsm\nEncryption,encryption\nEncryptionAlgorithm,encryption_algorithm\nEncryptionAlgorithmOptions,encryption_algorithm_options\nEncryptionAlgorithms,encryption_algorithms\nEncryptionAtRest,encryption_at_rest\nEncryptionAtRestOptions,encryption_at_rest_options\nEncryptionAtRestOptionsStatus,encryption_at_rest_options_status\nEncryptionAttributes,encryption_attributes\nEncryptionConfig,encryption_config\nEncryptionConfiguration,encryption_configuration\nEncryptionContext,encryption_context\nEncryptionContextEquals,encryption_context_equals\nEncryptionContextSubset,encryption_context_subset\nEncryptionContractConfiguration,encryption_contract_configuration\nEncryptionDescription,encryption_description\nEncryptionDisabled,encryption_disabled\nEncryptionEnabled,encryption_enabled\nEncryptionEntities,encryption_entities\nEncryptionEntity,encryption_entity\nEncryptionFailure,encryption_failure\nEncryptionInTransit,encryption_in_transit\nEncryptionInTransitSupported,encryption_in_transit_supported\nEncryptionInfo,encryption_info\nEncryptionIntegrityChecksFailedException,encryption_integrity_checks_failed_exception\nEncryptionKey,encryption_key\nEncryptionKeyAccessDeniedException,encryption_key_access_denied_exception\nEncryptionKeyArn,encryption_key_arn\nEncryptionKeyCheckValue,encryption_key_check_value\nEncryptionKeyDisabledException,encryption_key_disabled_exception\nEncryptionKeyIdentifier,encryption_key_identifier\nEncryptionKeyNotFoundException,encryption_key_not_found_exception\nEncryptionKeyUnavailableException,encryption_key_unavailable_exception\nEncryptionKmsKeyId,encryption_kms_key_id\nEncryptionMethod,encryption_method\nEncryptionMode,encryption_mode\nEncryptionOption,encryption_option\nEncryptionOptions,encryption_options\nEncryptionPolicyCount,encryption_policy_count\nEncryptionSetting,encryption_setting\nEncryptionSpecification,encryption_specification\nEncryptionStatus,encryption_status\nEncryptionSupport,encryption_support\nEncryptionType,encryption_type\nEnd,end\nEndBillingPeriod,end_billing_period\nEndDate,end_date\nEndDateTime,end_date_time\nEndDateType,end_date_type\nEndEventTime,end_event_time\nEndFrameNumber,end_frame_number\nEndHour,end_hour\nEndHourOfDay,end_hour_of_day\nEndLine,end_line\nEndMarker,end_marker\nEndMinuteOfHour,end_minute_of_hour\nEndMode,end_mode\nEndOfMeetingReminder,end_of_meeting_reminder\nEndOffset,end_offset\nEndOffsetChar,end_offset_char\nEndOffsetMillis,end_offset_millis\nEndPercentage,end_percentage\nEndPoint,end_point\nEndPoints,end_points\nEndPosition,end_position\nEndSession,end_session\nEndSessionResult,end_session_result\nEndTime,end_time\nEndTimeExclusive,end_time_exclusive\nEndTimeOffset,end_time_offset\nEndTimeRange,end_time_range\nEndTimecode,end_timecode\nEndTimecodeSMPTE,end_timecode_smpte\nEndTimestamp,end_timestamp\nEndTimestampMillis,end_timestamp_millis\nEndUrl,end_url\nEndUserLicenseAgreement,end_user_license_agreement\nEndUserOptedOut,end_user_opted_out\nEndValue,end_value\nEndWeekDay,end_week_day\nEndedAt,ended_at\nEndedTimestamp,ended_timestamp\nEndingHashKey,ending_hash_key\nEndingOffsets,ending_offsets\nEndingSequenceNumber,ending_sequence_number\nEndpoint,endpoint\nEndpointAccess,endpoint_access\nEndpointAccessList,endpoint_access_list\nEndpointAlreadyExistsException,endpoint_already_exists_exception\nEndpointAlreadyExistsFault,endpoint_already_exists_fault\nEndpointArn,endpoint_arn\nEndpointAttributes,endpoint_attributes\nEndpointAuthorization,endpoint_authorization\nEndpointAuthorizationAlreadyExistsFault,endpoint_authorization_already_exists_fault\nEndpointAuthorizationList,endpoint_authorization_list\nEndpointAuthorizationNotFoundFault,endpoint_authorization_not_found_fault\nEndpointAuthorizationsPerClusterLimitExceededFault,endpoint_authorizations_per_cluster_limit_exceeded_fault\nEndpointBatchItem,endpoint_batch_item\nEndpointBatchRequest,endpoint_batch_request\nEndpointConfigArn,endpoint_config_arn\nEndpointConfigName,endpoint_config_name\nEndpointConfigSummary,endpoint_config_summary\nEndpointConfigs,endpoint_configs\nEndpointConfiguration,endpoint_configuration\nEndpointConfigurations,endpoint_configurations\nEndpointCount,endpoint_count\nEndpointCreateTime,endpoint_create_time\nEndpointDemographic,endpoint_demographic\nEndpointDescription,endpoint_description\nEndpointDescriptions,endpoint_descriptions\nEndpointDetails,endpoint_details\nEndpointDisabledException,endpoint_disabled_exception\nEndpointDomain,endpoint_domain\nEndpointDomainPrefix,endpoint_domain_prefix\nEndpointEventBus,endpoint_event_bus\nEndpointFilter,endpoint_filter\nEndpointGroup,endpoint_group\nEndpointGroupAlreadyExistsException,endpoint_group_already_exists_exception\nEndpointGroupArn,endpoint_group_arn\nEndpointGroupNotFoundException,endpoint_group_not_found_exception\nEndpointGroupRegion,endpoint_group_region\nEndpointGroups,endpoint_groups\nEndpointId,endpoint_id\nEndpointIdentifier,endpoint_identifier\nEndpointIdentifiers,endpoint_identifiers\nEndpointIds,endpoint_ids\nEndpointInfo,endpoint_info\nEndpointInput,endpoint_input\nEndpointInputConfiguration,endpoint_input_configuration\nEndpointIpAddress,endpoint_ip_address\nEndpointIpAddressRange,endpoint_ip_address_range\nEndpointItemResponse,endpoint_item_response\nEndpointLocation,endpoint_location\nEndpointMessageResult,endpoint_message_result\nEndpointMetadata,endpoint_metadata\nEndpointMetrics,endpoint_metrics\nEndpointName,endpoint_name\nEndpointNetworkConfiguration,endpoint_network_configuration\nEndpointNotFoundException,endpoint_not_found_exception\nEndpointNotFoundFault,endpoint_not_found_fault\nEndpointOutputConfiguration,endpoint_output_configuration\nEndpointPerformance,endpoint_performance\nEndpointPerformances,endpoint_performances\nEndpointPort,endpoint_port\nEndpointProperties,endpoint_properties\nEndpointPropertiesList,endpoint_properties_list\nEndpointPublicAccess,endpoint_public_access\nEndpointReentryCap,endpoint_reentry_cap\nEndpointReentryInterval,endpoint_reentry_interval\nEndpointRequest,endpoint_request\nEndpointResponse,endpoint_response\nEndpointResult,endpoint_result\nEndpointSendConfiguration,endpoint_send_configuration\nEndpointSetting,endpoint_setting\nEndpointSettings,endpoint_settings\nEndpointState,endpoint_state\nEndpointStatus,endpoint_status\nEndpointSummary,endpoint_summary\nEndpointTemporarilyUnavailableException,endpoint_temporarily_unavailable_exception\nEndpointType,endpoint_type\nEndpointTypes,endpoint_types\nEndpointURL,endpoint_url\nEndpointUri,endpoint_uri\nEndpointUrl,endpoint_url\nEndpointUser,endpoint_user\nEndpoints,endpoints\nEndpointsPerAuthorizationLimitExceededFault,endpoints_per_authorization_limit_exceeded_fault\nEndpointsPerClusterLimitExceededFault,endpoints_per_cluster_limit_exceeded_fault\nEndpointsResponse,endpoints_response\nEndsWith,ends_with\nEnforceConsumerDeletion,enforce_consumer_deletion\nEnforceHTTPS,enforce_https\nEnforceProvidedLabels,enforce_provided_labels\nEnforceSecurityGroupInboundRulesOnPrivateLinkTraffic,enforce_security_group_inbound_rules_on_private_link_traffic\nEnforceWorkGroupConfiguration,enforce_work_group_configuration\nEnforced,enforced\nEnforcedLimit,enforced_limit\nEnforcementInRecord,enforcement_in_record\nEnforcementStatus,enforcement_status\nEngagement,engagement\nEngagementArn,engagement_arn\nEngagementId,engagement_id\nEngagementMetrics,engagement_metrics\nEngagements,engagements\nEngine,engine\nEngineArn,engine_arn\nEngineAttribute,engine_attribute\nEngineAttributes,engine_attributes\nEngineConfiguration,engine_configuration\nEngineDefaults,engine_defaults\nEngineDisplayName,engine_display_name\nEngineEdition,engine_edition\nEngineExecutionTimeInMillis,engine_execution_time_in_millis\nEngineFamily,engine_family\nEngineFullVersion,engine_full_version\nEngineMode,engine_mode\nEngineModel,engine_model\nEngineName,engine_name\nEngineNativeAuditFieldsIncluded,engine_native_audit_fields_included\nEngineNotSupportedException,engine_not_supported_exception\nEnginePatchVersion,engine_patch_version\nEngineSecurityGroupId,engine_security_group_id\nEngineTranscribeMedicalSettings,engine_transcribe_medical_settings\nEngineTranscribeSettings,engine_transcribe_settings\nEngineType,engine_type\nEngineVersion,engine_version\nEngineVersionInfo,engine_version_info\nEngineVersions,engine_versions\nEngineVersionsSummary,engine_versions_summary\nEngineWorkflowResourceIdentifier,engine_workflow_resource_identifier\nEnhancedImageScanFinding,enhanced_image_scan_finding\nEnhancedMetrics,enhanced_metrics\nEnhancedMonitoring,enhanced_monitoring\nEnhancedMonitoringOutput,enhanced_monitoring_output\nEnhancedMonitoringResourceArn,enhanced_monitoring_resource_arn\nEnhancedVpcRouting,enhanced_vpc_routing\nEniId,eni_id\nEniIp,eni_ip\nEniPrivateIpAddress,eni_private_ip_address\nEnqueueTimestamp,enqueue_timestamp\nEnrichment,enrichment\nEnrichmentParameters,enrichment_parameters\nEnroll,enroll\nEnrollmentConfig,enrollment_config\nEnrollmentFilter,enrollment_filter\nEnrollmentFlags,enrollment_flags\nEnrollmentFlagsV2,enrollment_flags_v2\nEnrollmentFlagsV3,enrollment_flags_v3\nEnrollmentFlagsV4,enrollment_flags_v4\nEnrollmentId,enrollment_id\nEnrollmentJobFraudDetectionConfig,enrollment_job_fraud_detection_config\nEnrollmentStatus,enrollment_status\nEnsureNoBackupInProcess,ensure_no_backup_in_process\nEnterStandbyAnswer,enter_standby_answer\nEnterStandbyQuery,enter_standby_query\nEnterpriseId,enterprise_id\nEntities,entities\nEntitiesDetectionJobFilter,entities_detection_job_filter\nEntitiesDetectionJobProperties,entities_detection_job_properties\nEntitiesDetectionJobPropertiesList,entities_detection_job_properties_list\nEntitledApplication,entitled_application\nEntitledApplications,entitled_applications\nEntitlement,entitlement\nEntitlementAlreadyExistsException,entitlement_already_exists_exception\nEntitlementArn,entitlement_arn\nEntitlementAttribute,entitlement_attribute\nEntitlementData,entitlement_data\nEntitlementName,entitlement_name\nEntitlementNotAllowedException,entitlement_not_allowed_exception\nEntitlementNotFoundException,entitlement_not_found_exception\nEntitlementStatus,entitlement_status\nEntitlementUsage,entitlement_usage\nEntitlementUsages,entitlement_usages\nEntitlementValue,entitlement_value\nEntitlements,entitlements\nEntitlementsAllowed,entitlements_allowed\nEntity,entity\nEntityAccountFilter,entity_account_filter\nEntityAggregate,entity_aggregate\nEntityAlreadyExistsException,entity_already_exists_exception\nEntityAlreadyRegisteredException,entity_already_registered_exception\nEntityArn,entity_arn\nEntityConfiguration,entity_configuration\nEntityDescription,entity_description\nEntityDetails,entity_details\nEntityDetailsList,entity_details_list\nEntityDetectorConfiguration,entity_detector_configuration\nEntityDisplayData,entity_display_data\nEntityDoesNotExistException,entity_does_not_exist_exception\nEntityFilter,entity_filter\nEntityId,entity_id\nEntityIdList,entity_id_list\nEntityIdentifier,entity_identifier\nEntityIds,entity_ids\nEntityInfo,entity_info\nEntityItem,entity_item\nEntityLabel,entity_label\nEntityList,entity_list\nEntityName,entity_name\nEntityNotExistsException,entity_not_exists_exception\nEntityNotFoundException,entity_not_found_exception\nEntityPath,entity_path\nEntityPersonaConfiguration,entity_persona_configuration\nEntityPropertyReference,entity_property_reference\nEntityRecognitionConfig,entity_recognition_config\nEntityRecognizerAnnotations,entity_recognizer_annotations\nEntityRecognizerArn,entity_recognizer_arn\nEntityRecognizerDocuments,entity_recognizer_documents\nEntityRecognizerEntityList,entity_recognizer_entity_list\nEntityRecognizerEvaluationMetrics,entity_recognizer_evaluation_metrics\nEntityRecognizerFilter,entity_recognizer_filter\nEntityRecognizerInputDataConfig,entity_recognizer_input_data_config\nEntityRecognizerMetadata,entity_recognizer_metadata\nEntityRecognizerMetadataEntityTypesListItem,entity_recognizer_metadata_entity_types_list_item\nEntityRecognizerOutputDataConfig,entity_recognizer_output_data_config\nEntityRecognizerProperties,entity_recognizer_properties\nEntityRecognizerPropertiesList,entity_recognizer_properties_list\nEntityRecognizerSummariesList,entity_recognizer_summaries_list\nEntityRecognizerSummary,entity_recognizer_summary\nEntitySelectorExpression,entity_selector_expression\nEntityStateException,entity_state_exception\nEntitySummary,entity_summary\nEntitySummaryList,entity_summary_list\nEntitySynonyms,entity_synonyms\nEntityTags,entity_tags\nEntityTemporarilyUnmodifiableException,entity_temporarily_unmodifiable_exception\nEntityType,entity_type\nEntityTypes,entity_types\nEntityTypesEvaluationMetrics,entity_types_evaluation_metrics\nEntityTypesListItem,entity_types_list_item\nEntityTypesToDetect,entity_types_to_detect\nEntries,entries\nEntropyEncoding,entropy_encoding\nEntry,entry\nEntryCount,entry_count\nEntryPoint,entry_point\nEnumDefinition,enum_definition\nEnumValues,enum_values\nEnumerationValue,enumeration_value\nEnvironment,environment\nEnvironmentAccountConnection,environment_account_connection\nEnvironmentAccountConnectionSummary,environment_account_connection_summary\nEnvironmentArn,environment_arn\nEnvironmentClass,environment_class\nEnvironmentDescription,environment_description\nEnvironmentDescriptionsMessage,environment_descriptions_message\nEnvironmentError,environment_error\nEnvironmentFile,environment_file\nEnvironmentFiles,environment_files\nEnvironmentId,environment_id\nEnvironmentIdentifier,environment_identifier\nEnvironmentIds,environment_ids\nEnvironmentImage,environment_image\nEnvironmentInfo,environment_info\nEnvironmentInfoDescription,environment_info_description\nEnvironmentInformation,environment_information\nEnvironmentLanguage,environment_language\nEnvironmentLifecycle,environment_lifecycle\nEnvironmentLink,environment_link\nEnvironmentLinks,environment_links\nEnvironmentMember,environment_member\nEnvironmentName,environment_name\nEnvironmentNames,environment_names\nEnvironmentParameter,environment_parameter\nEnvironmentParameterRanges,environment_parameter_ranges\nEnvironmentParameters,environment_parameters\nEnvironmentPlatform,environment_platform\nEnvironmentProperties,environment_properties\nEnvironmentPropertyDescriptions,environment_property_descriptions\nEnvironmentPropertyUpdates,environment_property_updates\nEnvironmentQuota,environment_quota\nEnvironmentResourceDescription,environment_resource_description\nEnvironmentResourceDescriptionsMessage,environment_resource_descriptions_message\nEnvironmentResources,environment_resources\nEnvironmentResourcesDescription,environment_resources_description\nEnvironmentResponse,environment_response\nEnvironmentState,environment_state\nEnvironmentSummary,environment_summary\nEnvironmentSummaryList,environment_summary_list\nEnvironmentTemplate,environment_template\nEnvironmentTemplateFilter,environment_template_filter\nEnvironmentTemplateSummary,environment_template_summary\nEnvironmentTemplateVersion,environment_template_version\nEnvironmentTemplateVersionSummary,environment_template_version_summary\nEnvironmentTier,environment_tier\nEnvironmentVariable,environment_variable\nEnvironmentVariables,environment_variables\nEnvironmentVpc,environment_vpc\nEnvironmentVpcList,environment_vpc_list\nEnvironments,environments\nEoCloudCover,eo_cloud_cover\nEoCloudCoverInput,eo_cloud_cover_input\nEphemeralStorage,ephemeral_storage\nEphemerisDescription,ephemeris_description\nEphemerisIdResponse,ephemeris_id_response\nEphemerisItem,ephemeris_item\nEphemerisMetaData,ephemeris_meta_data\nEpisodeId,episode_id\nEpoch,epoch\nEpochLockingSettings,epoch_locking_settings\nEpss,epss\nEpssDetails,epss_details\nEpssScore,epss_score\nEq,eq\nEquals,equals\nEqualsTo,equals_to\nEqualsValue,equals_value\nEquation,equation\nEquipment,equipment\nEquipmentDetection,equipment_detection\nEquipmentDetections,equipment_detections\nError,error\nErrorArguments,error_arguments\nErrorAttribute,error_attribute\nErrorCachingMinTTL,error_caching_min_ttl\nErrorCategory,error_category\nErrorCause,error_cause\nErrorClearTimeMsec,error_clear_time_msec\nErrorCode,error_code\nErrorCodeReason,error_code_reason\nErrorCount,error_count\nErrorData,error_data\nErrorDescription,error_description\nErrorDetail,error_detail\nErrorDetailList,error_detail_list\nErrorDetails,error_details\nErrorDocument,error_document\nErrorEntries,error_entries\nErrorHandlingConfig,error_handling_config\nErrorId,error_id\nErrorInfo,error_info\nErrorInformation,error_information\nErrorList,error_list\nErrorMessage,error_message\nErrorMetric,error_metric\nErrorMetrics,error_metrics\nErrorName,error_name\nErrorOutputPrefix,error_output_prefix\nErrorPercentage,error_percentage\nErrorReason,error_reason\nErrorReportConfiguration,error_report_configuration\nErrorReportLocation,error_report_location\nErrorResponse,error_response\nErrorRetryDuration,error_retry_duration\nErrorRootCause,error_root_cause\nErrorRootCauseEntity,error_root_cause_entity\nErrorRootCauseService,error_root_cause_service\nErrorRootCauses,error_root_causes\nErrorStatistics,error_statistics\nErrorString,error_string\nErrorTimestamp,error_timestamp\nErrorTopic,error_topic\nErrorType,error_type\nErrorValue,error_value\nErroredActions,errored_actions\nErrors,errors\nErrorsListItem,errors_list_item\nEsRateInPes,es_rate_in_pes\nEsam,esam\nEsamManifestConfirmConditionNotification,esam_manifest_confirm_condition_notification\nEsamSettings,esam_settings\nEsamSignalProcessingNotification,esam_signal_processing_notification\nEscapeChar,escape_char\nEscaper,escaper\nEsps,esps\nEssential,essential\nEstablished,established\nEstablishedMultiRegionAccessPointPolicy,established_multi_region_access_point_policy\nEstimateByTime,estimate_by_time\nEstimateTemplateCostInput,estimate_template_cost_input\nEstimateTemplateCostOutput,estimate_template_cost_output\nEstimated,estimated\nEstimatedAverageCoverage,estimated_average_coverage\nEstimatedAverageUtilization,estimated_average_utilization\nEstimatedBreakEvenInMonths,estimated_break_even_in_months\nEstimatedBytesToTransfer,estimated_bytes_to_transfer\nEstimatedCompletionTime,estimated_completion_time\nEstimatedCoverage,estimated_coverage\nEstimatedDataToScanBytes,estimated_data_to_scan_bytes\nEstimatedDiskUtilizationPercent,estimated_disk_utilization_percent\nEstimatedEvaluationTimeRemainingInMinutes,estimated_evaluation_time_remaining_in_minutes\nEstimatedFilesToDelete,estimated_files_to_delete\nEstimatedFilesToTransfer,estimated_files_to_transfer\nEstimatedInstanceWarmup,estimated_instance_warmup\nEstimatedMonthlyCost,estimated_monthly_cost\nEstimatedMonthlyOnDemandCost,estimated_monthly_on_demand_cost\nEstimatedMonthlySavings,estimated_monthly_savings\nEstimatedMonthlySavingsAmount,estimated_monthly_savings_amount\nEstimatedMonthlySavingsPercentage,estimated_monthly_savings_percentage\nEstimatedMonthlyStorageCost,estimated_monthly_storage_cost\nEstimatedNewCommitmentUtilization,estimated_new_commitment_utilization\nEstimatedNumberOfUsers,estimated_number_of_users\nEstimatedOnDemandCost,estimated_on_demand_cost\nEstimatedOnDemandCostWithCurrentCommitment,estimated_on_demand_cost_with_current_commitment\nEstimatedProgress,estimated_progress\nEstimatedROI,estimated_roi\nEstimatedReservationCostForLookbackPeriod,estimated_reservation_cost_for_lookback_period\nEstimatedResourceSize,estimated_resource_size\nEstimatedSPCost,estimated_sp_cost\nEstimatedSavingsAmount,estimated_savings_amount\nEstimatedSavingsPercentage,estimated_savings_percentage\nEstimatedSecondsToCompletion,estimated_seconds_to_completion\nEstimatedTimeRemainingInMinutes,estimated_time_remaining_in_minutes\nEstimatedTimeToCompletionInSeconds,estimated_time_to_completion_in_seconds\nEstimatedTotalCost,estimated_total_cost\nEstimatedTotalMonthlySavingsAmount,estimated_total_monthly_savings_amount\nEstimatedUpdateTime,estimated_update_time\nEstimatedWaitTime,estimated_wait_time\nEtag,etag\nEthereum,ethereum\nEthernet0,ethernet0\nEthernet0Status,ethernet0_status\nEthernet1,ethernet1\nEthernet1Status,ethernet1_status\nEthernetPayload,ethernet_payload\nEthernetStatus,ethernet_status\nEtvPlatformPid,etv_platform_pid\nEtvSignalPid,etv_signal_pid\nEuid,euid\nEula,eula\nEulaAcceptance,eula_acceptance\nEutranCid,eutran_cid\nEvalActionName,eval_action_name\nEvalDecision,eval_decision\nEvalDecisionDetails,eval_decision_details\nEvalResourceDecision,eval_resource_decision\nEvalResourceName,eval_resource_name\nEvaluateCodeErrorDetail,evaluate_code_error_detail\nEvaluateCodeRequest,evaluate_code_request\nEvaluateCodeResponse,evaluate_code_response\nEvaluateDataQuality,evaluate_data_quality\nEvaluateDataQualityMultiFrame,evaluate_data_quality_multi_frame\nEvaluateExpressionInput,evaluate_expression_input\nEvaluateExpressionOutput,evaluate_expression_output\nEvaluateFeatureRequest,evaluate_feature_request\nEvaluateFeatureResponse,evaluate_feature_response\nEvaluateLowSampleCountPercentile,evaluate_low_sample_count_percentile\nEvaluateMappingTemplateRequest,evaluate_mapping_template_request\nEvaluateMappingTemplateResponse,evaluate_mapping_template_response\nEvaluateOnExit,evaluate_on_exit\nEvaluatePullRequestApprovalRulesInput,evaluate_pull_request_approval_rules_input\nEvaluatePullRequestApprovalRulesOutput,evaluate_pull_request_approval_rules_output\nEvaluateSessionRequest,evaluate_session_request\nEvaluateSessionResponse,evaluate_session_response\nEvaluateTargetHealth,evaluate_target_health\nEvaluatedExternalModel,evaluated_external_model\nEvaluatedMetrics,evaluated_metrics\nEvaluatedModelArn,evaluated_model_arn\nEvaluatedModelMetrics,evaluated_model_metrics\nEvaluatedModelVersion,evaluated_model_version\nEvaluatedRule,evaluated_rule\nEvaluation,evaluation\nEvaluationAnswerInput,evaluation_answer_input\nEvaluationAnswerOutput,evaluation_answer_output\nEvaluationArn,evaluation_arn\nEvaluationContext,evaluation_context\nEvaluationContextIdentifier,evaluation_context_identifier\nEvaluationDataEndTime,evaluation_data_end_time\nEvaluationDataSourceId,evaluation_data_source_id\nEvaluationDataStartTime,evaluation_data_start_time\nEvaluationEndTimestamp,evaluation_end_timestamp\nEvaluationErrorItem,evaluation_error_item\nEvaluationForm,evaluation_form\nEvaluationFormArn,evaluation_form_arn\nEvaluationFormContent,evaluation_form_content\nEvaluationFormId,evaluation_form_id\nEvaluationFormNumericQuestionOption,evaluation_form_numeric_question_option\nEvaluationFormNumericQuestionProperties,evaluation_form_numeric_question_properties\nEvaluationFormQuestion,evaluation_form_question\nEvaluationFormScoringStrategy,evaluation_form_scoring_strategy\nEvaluationFormSection,evaluation_form_section\nEvaluationFormSingleSelectQuestionAutomation,evaluation_form_single_select_question_automation\nEvaluationFormSingleSelectQuestionOption,evaluation_form_single_select_question_option\nEvaluationFormSingleSelectQuestionProperties,evaluation_form_single_select_question_properties\nEvaluationFormSummary,evaluation_form_summary\nEvaluationFormSummaryList,evaluation_form_summary_list\nEvaluationFormTitle,evaluation_form_title\nEvaluationFormVersion,evaluation_form_version\nEvaluationFormVersionSummary,evaluation_form_version_summary\nEvaluationFormVersionSummaryList,evaluation_form_version_summary_list\nEvaluationId,evaluation_id\nEvaluationLimitExceeded,evaluation_limit_exceeded\nEvaluationManifest,evaluation_manifest\nEvaluationManifestS3Prefix,evaluation_manifest_s3_prefix\nEvaluationMessage,evaluation_message\nEvaluationMetadata,evaluation_metadata\nEvaluationMetrics,evaluation_metrics\nEvaluationMode,evaluation_mode\nEvaluationModeConfiguration,evaluation_mode_configuration\nEvaluationModes,evaluation_modes\nEvaluationName,evaluation_name\nEvaluationNote,evaluation_note\nEvaluationParameters,evaluation_parameters\nEvaluationPeriod,evaluation_period\nEvaluationPeriods,evaluation_periods\nEvaluationRequest,evaluation_request\nEvaluationResult,evaluation_result\nEvaluationResultIdentifier,evaluation_result_identifier\nEvaluationResultQualifier,evaluation_result_qualifier\nEvaluationResults,evaluation_results\nEvaluationRule,evaluation_rule\nEvaluationScore,evaluation_score\nEvaluationStartDate,evaluation_start_date\nEvaluationStartTimestamp,evaluation_start_timestamp\nEvaluationState,evaluation_state\nEvaluationStatus,evaluation_status\nEvaluationSummary,evaluation_summary\nEvaluationSummaryList,evaluation_summary_list\nEvaluationTime,evaluation_time\nEvaluationTimeout,evaluation_timeout\nEvaluationType,evaluation_type\nEvaluationWaitTime,evaluation_wait_time\nEvaluations,evaluations\nEvaluatorArn,evaluator_arn\nEvent,event\nEventAccountFilter,event_account_filter\nEventAction,event_action\nEventActionArn,event_action_arn\nEventActionEntry,event_action_entry\nEventActionId,event_action_id\nEventActions,event_actions\nEventAggregate,event_aggregate\nEventArn,event_arn\nEventBatchingCondition,event_batching_condition\nEventBridge,event_bridge\nEventBridgeAction,event_bridge_action\nEventBridgeActionDefinition,event_bridge_action_definition\nEventBridgeBus,event_bridge_bus\nEventBridgeConfiguration,event_bridge_configuration\nEventBridgeDataSourceConfig,event_bridge_data_source_config\nEventBridgeDestinationProperties,event_bridge_destination_properties\nEventBridgeEnabled,event_bridge_enabled\nEventBridgeEventBusParameters,event_bridge_event_bus_parameters\nEventBridgeParameters,event_bridge_parameters\nEventBridgeRuleName,event_bridge_rule_name\nEventBus,event_bus\nEventBusArn,event_bus_arn\nEventBusName,event_bus_name\nEventBuses,event_buses\nEventCategories,event_categories\nEventCategoriesList,event_categories_list\nEventCategoriesMap,event_categories_map\nEventCategoriesMapList,event_categories_map_list\nEventCategoriesMessage,event_categories_message\nEventCategory,event_category\nEventCategoryGroup,event_category_group\nEventCategoryGroupList,event_category_group_list\nEventClass,event_class\nEventCode,event_code\nEventCondition,event_condition\nEventConfigurationItem,event_configuration_item\nEventConfigurationsList,event_configurations_list\nEventContextData,event_context_data\nEventContextDataType,event_context_data_type\nEventCount,event_count\nEventDataStore,event_data_store\nEventDataStoreARNInvalidException,event_data_store_arn_invalid_exception\nEventDataStoreAlreadyExistsException,event_data_store_already_exists_exception\nEventDataStoreArn,event_data_store_arn\nEventDataStoreHasOngoingImportException,event_data_store_has_ongoing_import_exception\nEventDataStoreMaxLimitExceededException,event_data_store_max_limit_exceeded_exception\nEventDataStoreNotFoundException,event_data_store_not_found_exception\nEventDataStoreTerminationProtectedException,event_data_store_termination_protected_exception\nEventDataStores,event_data_stores\nEventDate,event_date\nEventDescription,event_description\nEventDescriptionsMessage,event_descriptions_message\nEventDestination,event_destination\nEventDestinationAlreadyExistsException,event_destination_already_exists_exception\nEventDestinationDefinition,event_destination_definition\nEventDestinationDoesNotExistException,event_destination_does_not_exist_exception\nEventDestinationName,event_destination_name\nEventDestinations,event_destinations\nEventDetail,event_detail\nEventDetails,event_details\nEventDetailsErrorItem,event_details_error_item\nEventDimensions,event_dimensions\nEventDurationInSeconds,event_duration_in_seconds\nEventEndTime,event_end_time\nEventFeedback,event_feedback\nEventFeedbackType,event_feedback_type\nEventFilter,event_filter\nEventFirstSeen,event_first_seen\nEventId,event_id\nEventIdMode,event_id_mode\nEventIncludedData,event_included_data\nEventInfo,event_info\nEventInfoMap,event_info_map\nEventInformation,event_information\nEventIngestionUrl,event_ingestion_url\nEventIntegration,event_integration\nEventIntegrationArn,event_integration_arn\nEventIntegrationAssociation,event_integration_association\nEventIntegrationAssociationArn,event_integration_association_arn\nEventIntegrationAssociationId,event_integration_association_id\nEventIntegrationAssociations,event_integration_associations\nEventIntegrationName,event_integration_name\nEventIntegrations,event_integrations\nEventItemResponse,event_item_response\nEventLastReplayedTime,event_last_replayed_time\nEventLastSeen,event_last_seen\nEventList,event_list\nEventLog,event_log\nEventLogEntry,event_log_entry\nEventName,event_name\nEventNotificationItemConfigurations,event_notification_item_configurations\nEventObject,event_object\nEventOrchestration,event_orchestration\nEventParameters,event_parameters\nEventPattern,event_pattern\nEventPayload,event_payload\nEventPredictionSummary,event_prediction_summary\nEventQueueArn,event_queue_arn\nEventResource,event_resource\nEventResourceARN,event_resource_arn\nEventResourceName,event_resource_name\nEventResourceType,event_resource_type\nEventResponse,event_response\nEventRisk,event_risk\nEventRiskType,event_risk_type\nEventSelector,event_selector\nEventSelectors,event_selectors\nEventSource,event_source\nEventSourceArn,event_source_arn\nEventSourceId,event_source_id\nEventSourceMappingConfiguration,event_source_mapping_configuration\nEventSourceMappings,event_source_mappings\nEventSourceName,event_source_name\nEventSourceToken,event_source_token\nEventSources,event_sources\nEventSourcesConfig,event_sources_config\nEventStartCondition,event_start_condition\nEventStartTime,event_start_time\nEventStatus,event_status\nEventStopBehavior,event_stop_behavior\nEventStream,event_stream\nEventStreamArn,event_stream_arn\nEventStreamDestinationDetails,event_stream_destination_details\nEventStreamName,event_stream_name\nEventStreamSummary,event_stream_summary\nEventSubType,event_sub_type\nEventSubscription,event_subscription\nEventSubscriptionArn,event_subscription_arn\nEventSubscriptionQuotaExceededFault,event_subscription_quota_exceeded_fault\nEventSubscriptionsList,event_subscriptions_list\nEventSubscriptionsMessage,event_subscriptions_message\nEventSummary,event_summary\nEventTaggingEnabled,event_tagging_enabled\nEventThreshold,event_threshold\nEventTime,event_time\nEventTimeFeatureName,event_time_feature_name\nEventTimeRange,event_time_range\nEventTopic,event_topic\nEventTopics,event_topics\nEventTracker,event_tracker\nEventTrackerSummary,event_tracker_summary\nEventTriggerDefinition,event_trigger_definition\nEventTriggers,event_triggers\nEventType,event_type\nEventTypeFilter,event_type_filter\nEventTypeId,event_type_id\nEventTypeIds,event_type_ids\nEventTypeName,event_type_name\nEventTypeSummary,event_type_summary\nEventTypes,event_types\nEventVariableSummary,event_variable_summary\nEvents,events\nEventsBatch,events_batch\nEventsCompleted,events_completed\nEventsConfiguration,events_configuration\nEventsDetectionJobFilter,events_detection_job_filter\nEventsDetectionJobProperties,events_detection_job_properties\nEventsDetectionJobPropertiesList,events_detection_job_properties_list\nEventsItemResponse,events_item_response\nEventsMatched,events_matched\nEventsMessage,events_message\nEventsPollInterval,events_poll_interval\nEventsRequest,events_request\nEventsResponse,events_response\nEventsScanned,events_scanned\nEvidence,evidence\nEvidenceFinderEnablement,evidence_finder_enablement\nEvidenceInsights,evidence_insights\nEwsAvailabilityProvider,ews_availability_provider\nEwsEndpoint,ews_endpoint\nEwsPassword,ews_password\nEwsProvider,ews_provider\nEwsUsername,ews_username\nExactCidrMatches,exact_cidr_matches\nExactFramerate,exact_framerate\nExactSettings,exact_settings\nExample,example\nExampleError,example_error\nExasolParameters,exasol_parameters\nExceedsLimitException,exceeds_limit_exception\nExcel,excel\nExcelOptions,excel_options\nExceptionCause,exception_cause\nExceptionDescription,exception_description\nExceptionName,exception_name\nExceptionResponse,exception_response\nExceptionType,exception_type\nExceptions,exceptions\nExcessCapacityTerminationPolicy,excess_capacity_termination_policy\nExchangeCodeForTokenRequest,exchange_code_for_token_request\nExchangeCodeForTokenRequestBody,exchange_code_for_token_request_body\nExchangeCodeForTokenResponse,exchange_code_for_token_response\nExchangeId,exchange_id\nExchangedReservedNode,exchanged_reserved_node\nExclude,exclude\nExcludeArchived,exclude_archived\nExcludeAttachmentFilePatterns,exclude_attachment_file_patterns\nExcludeBootVolume,exclude_boot_volume\nExcludeCharacters,exclude_characters\nExcludeColumnSchema,exclude_column_schema\nExcludeCompliantResources,exclude_compliant_resources\nExcludeDataVolumeIds,exclude_data_volume_ids\nExcludeDataVolumeTags,exclude_data_volume_tags\nExcludeDevicesDeployedInOtherStage,exclude_devices_deployed_in_other_stage\nExcludeFeaturesAttribute,exclude_features_attribute\nExcludeFilters,exclude_filters\nExcludeLowercase,exclude_lowercase\nExcludeManagementEventSources,exclude_management_event_sources\nExcludeMap,exclude_map\nExcludeMimeTypes,exclude_mime_types\nExcludeNumbers,exclude_numbers\nExcludePaths,exclude_paths\nExcludePeriodConfiguration,exclude_period_configuration\nExcludePunctuation,exclude_punctuation\nExcludeResourceTags,exclude_resource_tags\nExcludeRetainedVariantProperties,exclude_retained_variant_properties\nExcludeSharedDrives,exclude_shared_drives\nExcludeSpaces,exclude_spaces\nExcludeSpecifiedAccounts,exclude_specified_accounts\nExcludeSpecifiedOrganizationalUnits,exclude_specified_organizational_units\nExcludeUppercase,exclude_uppercase\nExcludeUserAccounts,exclude_user_accounts\nExcludeVerboseContent,exclude_verbose_content\nExcludedAccounts,excluded_accounts\nExcludedAttendeeIds,excluded_attendee_ids\nExcludedColumnNames,excluded_column_names\nExcludedCookies,excluded_cookies\nExcludedHeaders,excluded_headers\nExcludedInstanceTypes,excluded_instance_types\nExcludedMembers,excluded_members\nExcludedPages,excluded_pages\nExcludedRule,excluded_rule\nExcludedRules,excluded_rules\nExcludedTimeRanges,excluded_time_ranges\nExcludes,excludes\nExclusion,exclusion\nExclusionByResourceTypes,exclusion_by_resource_types\nExclusionFileNamePatterns,exclusion_file_name_patterns\nExclusionFileTypePatterns,exclusion_file_type_patterns\nExclusionFolderNamePatterns,exclusion_folder_name_patterns\nExclusionPatterns,exclusion_patterns\nExclusionPreview,exclusion_preview\nExclusions,exclusions\nExclusiveEndBillingPeriod,exclusive_end_billing_period\nExclusiveEndTime,exclusive_end_time\nExclusiveStartApplicationName,exclusive_start_application_name\nExclusiveStartBackupArn,exclusive_start_backup_arn\nExclusiveStartDeliveryStreamName,exclusive_start_delivery_stream_name\nExclusiveStartDestinationId,exclusive_start_destination_id\nExclusiveStartGlobalTableName,exclusive_start_global_table_name\nExclusiveStartKey,exclusive_start_key\nExclusiveStartShardId,exclusive_start_shard_id\nExclusiveStartStreamArn,exclusive_start_stream_arn\nExclusiveStartStreamName,exclusive_start_stream_name\nExclusiveStartTableName,exclusive_start_table_name\nExclusiveStartTagKey,exclusive_start_tag_key\nExecArgs,exec_args\nExecutable,executable\nExecutableParameters,executable_parameters\nExecutablePath,executable_path\nExecutableSha256,executable_sha256\nExecutableUsers,executable_users\nExecuteBudgetActionRequest,execute_budget_action_request\nExecuteBudgetActionResponse,execute_budget_action_response\nExecuteChangeSetInput,execute_change_set_input\nExecuteCommandConfiguration,execute_command_configuration\nExecuteCommandLogConfiguration,execute_command_log_configuration\nExecuteCommandRequest,execute_command_request\nExecuteCommandResponse,execute_command_response\nExecuteCommandSessionConfiguration,execute_command_session_configuration\nExecuteCoreNetworkChangeSetRequest,execute_core_network_change_set_request\nExecuteFastResetInput,execute_fast_reset_input\nExecuteFastResetOutput,execute_fast_reset_output\nExecuteGremlinExplainQueryInput,execute_gremlin_explain_query_input\nExecuteGremlinExplainQueryOutput,execute_gremlin_explain_query_output\nExecuteGremlinProfileQueryInput,execute_gremlin_profile_query_input\nExecuteGremlinProfileQueryOutput,execute_gremlin_profile_query_output\nExecuteGremlinQueryInput,execute_gremlin_query_input\nExecuteGremlinQueryOutput,execute_gremlin_query_output\nExecuteOpenCypherExplainQueryInput,execute_open_cypher_explain_query_input\nExecuteOpenCypherExplainQueryOutput,execute_open_cypher_explain_query_output\nExecuteOpenCypherQueryInput,execute_open_cypher_query_input\nExecuteOpenCypherQueryOutput,execute_open_cypher_query_output\nExecutePolicyType,execute_policy_type\nExecuteProvisionedProductPlanInput,execute_provisioned_product_plan_input\nExecuteProvisionedProductPlanOutput,execute_provisioned_product_plan_output\nExecuteProvisionedProductServiceActionInput,execute_provisioned_product_service_action_input\nExecuteProvisionedProductServiceActionOutput,execute_provisioned_product_service_action_output\nExecuteQueryRequest,execute_query_request\nExecuteQueryResponse,execute_query_response\nExecuteScheduledQueryRequest,execute_scheduled_query_request\nExecuteSqlRequest,execute_sql_request\nExecuteSqlResponse,execute_sql_response\nExecuteStatement,execute_statement\nExecuteStatementException,execute_statement_exception\nExecuteStatementInput,execute_statement_input\nExecuteStatementOutput,execute_statement_output\nExecuteStatementRequest,execute_statement_request\nExecuteStatementResponse,execute_statement_response\nExecuteStatementResult,execute_statement_result\nExecuteTimeout,execute_timeout\nExecuteToken,execute_token\nExecuteTransactionInput,execute_transaction_input\nExecuteTransactionOutput,execute_transaction_output\nExecutedBy,executed_by\nExecutedTime,executed_time\nExecutedVersion,executed_version\nExecution,execution\nExecutionAbortedEventDetails,execution_aborted_event_details\nExecutionAlreadyExists,execution_already_exists\nExecutionClass,execution_class\nExecutionConfiguration,execution_configuration\nExecutionControls,execution_controls\nExecutionCount,execution_count\nExecutionDate,execution_date\nExecutionDetails,execution_details\nExecutionDoesNotExist,execution_does_not_exist\nExecutionElapsedTime,execution_elapsed_time\nExecutionEndDateTime,execution_end_date_time\nExecutionEndTime,execution_end_time\nExecutionEngine,execution_engine\nExecutionEngineConfig,execution_engine_config\nExecutionEngineId,execution_engine_id\nExecutionError,execution_error\nExecutionErrorDetails,execution_error_details\nExecutionFailedEventDetails,execution_failed_event_details\nExecutionId,execution_id\nExecutionLimitExceeded,execution_limit_exceeded\nExecutionList,execution_list\nExecutionListItem,execution_list_item\nExecutionMessage,execution_message\nExecutionMetrics,execution_metrics\nExecutionOrder,execution_order\nExecutionParameter,execution_parameter\nExecutionParameters,execution_parameters\nExecutionProperty,execution_property\nExecutionRecord,execution_record\nExecutionResult,execution_result\nExecutionResults,execution_results\nExecutionRole,execution_role\nExecutionRoleArn,execution_role_arn\nExecutionRoleIdentityConfig,execution_role_identity_config\nExecutionRoleName,execution_role_name\nExecutionStartDateTime,execution_start_date_time\nExecutionStartTime,execution_start_time\nExecutionStartedEventDetails,execution_started_event_details\nExecutionStatistics,execution_statistics\nExecutionStats,execution_stats\nExecutionStatus,execution_status\nExecutionStatusDetail,execution_status_detail\nExecutionStepResult,execution_step_result\nExecutionSucceededEventDetails,execution_succeeded_event_details\nExecutionSummary,execution_summary\nExecutionTime,execution_time\nExecutionTimeFilter,execution_time_filter\nExecutionTimeInMillis,execution_time_in_millis\nExecutionTimedOutEventDetails,execution_timed_out_event_details\nExecutionTimeout,execution_timeout\nExecutionTrigger,execution_trigger\nExecutionType,execution_type\nExecutions,executions\nExecutorConfiguration,executor_configuration\nExecutorId,executor_id\nExecutorSize,executor_size\nExecutorState,executor_state\nExecutorStateFilter,executor_state_filter\nExecutorType,executor_type\nExecutorsSummary,executors_summary\nExistingEnrollmentAction,existing_enrollment_action\nExistingHourlyCommitment,existing_hourly_commitment\nExistingObjectReplication,existing_object_replication\nExistingVersion,existing_version\nExists,exists\nExitCode,exit_code\nExitMessage,exit_message\nExitStandbyAnswer,exit_standby_answer\nExitStandbyQuery,exit_standby_query\nExpected,expected\nExpectedAttributeValue,expected_attribute_value\nExpectedBucketOwner,expected_bucket_owner\nExpectedCompletionDate,expected_completion_date\nExpectedCompletionTimeMinutes,expected_completion_time_minutes\nExpectedFirewallEndpoint,expected_firewall_endpoint\nExpectedFirewallSubnetId,expected_firewall_subnet_id\nExpectedFirewallSubnetRoutes,expected_firewall_subnet_routes\nExpectedInternetGatewayRoutes,expected_internet_gateway_routes\nExpectedManifestBucketOwner,expected_manifest_bucket_owner\nExpectedNextSnapshotScheduleTime,expected_next_snapshot_schedule_time\nExpectedNextSnapshotScheduleTimeStatus,expected_next_snapshot_schedule_time_status\nExpectedPolicyDescription,expected_policy_description\nExpectedProperties,expected_properties\nExpectedResourceUtilization,expected_resource_utilization\nExpectedRoute,expected_route\nExpectedRouteTable,expected_route_table\nExpectedRoutes,expected_routes\nExpectedSourceBucketOwner,expected_source_bucket_owner\nExpectedValue,expected_value\nExpenseCurrency,expense_currency\nExpenseDetection,expense_detection\nExpenseDocument,expense_document\nExpenseDocuments,expense_documents\nExpenseField,expense_field\nExpenseGroupProperty,expense_group_property\nExpenseIndex,expense_index\nExpenseType,expense_type\nExperienceConfiguration,experience_configuration\nExperienceEndpoint,experience_endpoint\nExperienceEntitiesSummary,experience_entities_summary\nExperienceScore,experience_score\nExperiencesSummary,experiences_summary\nExperiment,experiment\nExperimentAction,experiment_action\nExperimentActionState,experiment_action_state\nExperimentArn,experiment_arn\nExperimentCloudWatchLogsLogConfiguration,experiment_cloud_watch_logs_log_configuration\nExperimentConfig,experiment_config\nExperimentExecution,experiment_execution\nExperimentLogConfiguration,experiment_log_configuration\nExperimentName,experiment_name\nExperimentReport,experiment_report\nExperimentResultsData,experiment_results_data\nExperimentS3LogConfiguration,experiment_s3_log_configuration\nExperimentSchedule,experiment_schedule\nExperimentSource,experiment_source\nExperimentState,experiment_state\nExperimentStopCondition,experiment_stop_condition\nExperimentSummaries,experiment_summaries\nExperimentSummary,experiment_summary\nExperimentTarget,experiment_target\nExperimentTargetFilter,experiment_target_filter\nExperimentTemplate,experiment_template\nExperimentTemplateAction,experiment_template_action\nExperimentTemplateCloudWatchLogsLogConfiguration,experiment_template_cloud_watch_logs_log_configuration\nExperimentTemplateCloudWatchLogsLogConfigurationInput,experiment_template_cloud_watch_logs_log_configuration_input\nExperimentTemplateLogConfiguration,experiment_template_log_configuration\nExperimentTemplateS3LogConfiguration,experiment_template_s3_log_configuration\nExperimentTemplateS3LogConfigurationInput,experiment_template_s3_log_configuration_input\nExperimentTemplateStopCondition,experiment_template_stop_condition\nExperimentTemplateSummary,experiment_template_summary\nExperimentTemplateTarget,experiment_template_target\nExperimentTemplateTargetFilter,experiment_template_target_filter\nExperimentTemplateTargetInputFilter,experiment_template_target_input_filter\nExpiration,expiration\nExpirationCriterion,expiration_criterion\nExpirationDate,expiration_date\nExpirationDays,expiration_days\nExpirationInDays,expiration_in_days\nExpirationModel,expiration_model\nExpirationSettings,expiration_settings\nExpirationTime,expiration_time\nExpirationTimeResponse,expiration_time_response\nExpirationTimestamp,expiration_timestamp\nExpireAt,expire_at\nExpirePasswords,expire_passwords\nExpireSessionRequest,expire_session_request\nExpireTime,expire_time\nExpired,expired\nExpiredAt,expired_at\nExpiredCodeException,expired_code_exception\nExpiredException,expired_exception\nExpiredImportTokenException,expired_import_token_exception\nExpiredIteratorException,expired_iterator_exception\nExpiredNextTokenException,expired_next_token_exception\nExpiredObjectDeleteMarker,expired_object_delete_marker\nExpiredStreamException,expired_stream_exception\nExpiredTokenException,expired_token_exception\nExpires,expires\nExpiresAfter,expires_after\nExpiresAt,expires_at\nExpiresIn,expires_in\nExpiresInSeconds,expires_in_seconds\nExpiringVersion,expiring_version\nExpiry,expiry\nExpiryDateTime,expiry_date_time\nExpiryEvents,expiry_events\nExpiryEventsConfiguration,expiry_events_configuration\nExpiryMinutes,expiry_minutes\nExpiryTime,expiry_time\nExpiryTimestamp,expiry_timestamp\nExplainPredictor,explain_predictor\nExplainabilities,explainabilities\nExplainability,explainability\nExplainabilityArn,explainability_arn\nExplainabilityConfig,explainability_config\nExplainabilityExportArn,explainability_export_arn\nExplainabilityExportName,explainability_export_name\nExplainabilityExportSummary,explainability_export_summary\nExplainabilityExports,explainability_exports\nExplainabilityInfo,explainability_info\nExplainabilityName,explainability_name\nExplainabilitySummary,explainability_summary\nExplainerConfig,explainer_config\nExplanation,explanation\nExplanationCode,explanation_code\nExplanations,explanations\nExplicitAuthFlows,explicit_auth_flows\nExplicitDeny,explicit_deny\nExplicitHashKey,explicit_hash_key\nExplicitHierarchy,explicit_hierarchy\nExplicitIds,explicit_ids\nExploitAvailable,exploit_available\nExploitObserved,exploit_observed\nExploitabilityDetails,exploitability_details\nExponentialRolloutRate,exponential_rollout_rate\nExport,export\nExportApiRequest,export_api_request\nExportApiResponse,export_api_response\nExportArn,export_arn\nExportArtifacts,export_artifacts\nExportAssetToSignedUrl,export_asset_to_signed_url\nExportAssetToSignedUrlRequestDetails,export_asset_to_signed_url_request_details\nExportAssetToSignedUrlResponseDetails,export_asset_to_signed_url_response_details\nExportAssetsToS3,export_assets_to_s3\nExportAssetsToS3RequestDetails,export_assets_to_s3_request_details\nExportAssetsToS3ResponseDetails,export_assets_to_s3_response_details\nExportAttributeName,export_attribute_name\nExportAutoScalingGroupRecommendationsRequest,export_auto_scaling_group_recommendations_request\nExportAutoScalingGroupRecommendationsResponse,export_auto_scaling_group_recommendations_response\nExportBackupPlanTemplateInput,export_backup_plan_template_input\nExportBackupPlanTemplateOutput,export_backup_plan_template_output\nExportBundleRequest,export_bundle_request\nExportBundleResult,export_bundle_result\nExportCertificateRequest,export_certificate_request\nExportCertificateResponse,export_certificate_response\nExportClientVpnClientCertificateRevocationListRequest,export_client_vpn_client_certificate_revocation_list_request\nExportClientVpnClientCertificateRevocationListResult,export_client_vpn_client_certificate_revocation_list_result\nExportClientVpnClientConfigurationRequest,export_client_vpn_client_configuration_request\nExportClientVpnClientConfigurationResult,export_client_vpn_client_configuration_result\nExportComponentsRequest,export_components_request\nExportComponentsResponse,export_components_response\nExportConfigurationsResponse,export_configurations_response\nExportConflictException,export_conflict_exception\nExportCreationTime,export_creation_time\nExportDataSource,export_data_source\nExportDescription,export_description\nExportDestination,export_destination\nExportEBSVolumeRecommendationsRequest,export_ebs_volume_recommendations_request\nExportEBSVolumeRecommendationsResponse,export_ebs_volume_recommendations_response\nExportEC2InstanceRecommendationsRequest,export_ec2_instance_recommendations_request\nExportEC2InstanceRecommendationsResponse,export_ec2_instance_recommendations_response\nExportECSServiceRecommendationsRequest,export_ecs_service_recommendations_request\nExportECSServiceRecommendationsResponse,export_ecs_service_recommendations_response\nExportEarthObservationJobInput,export_earth_observation_job_input\nExportEarthObservationJobOutput,export_earth_observation_job_output\nExportErrorData,export_error_data\nExportErrorDetails,export_error_details\nExportErrorDetailsOutput,export_error_details_output\nExportFilter,export_filter\nExportFormat,export_format\nExportFormsRequest,export_forms_request\nExportFormsResponse,export_forms_response\nExportFromTime,export_from_time\nExportHiddenFieldsOption,export_hidden_fields_option\nExportId,export_id\nExportImageRequest,export_image_request\nExportImageResult,export_image_result\nExportImageTask,export_image_task\nExportImageTaskId,export_image_task_id\nExportImageTaskIds,export_image_task_ids\nExportImageTasks,export_image_tasks\nExportInfo,export_info\nExportJobProperties,export_job_properties\nExportJobPropertiesList,export_job_properties_list\nExportJobRequest,export_job_request\nExportJobResource,export_job_resource\nExportJobResponse,export_job_response\nExportJobSummary,export_job_summary\nExportJobs,export_jobs\nExportJobsResponse,export_jobs_response\nExportJournalToS3Request,export_journal_to_s3_request\nExportJournalToS3Response,export_journal_to_s3_response\nExportKeyIdentifier,export_key_identifier\nExportKeyInput,export_key_input\nExportKeyOutput,export_key_output\nExportLabelsTaskRunProperties,export_labels_task_run_properties\nExportLambdaFunctionRecommendationsRequest,export_lambda_function_recommendations_request\nExportLambdaFunctionRecommendationsResponse,export_lambda_function_recommendations_response\nExportLensInput,export_lens_input\nExportLensOutput,export_lens_output\nExportLicenseRecommendationsRequest,export_license_recommendations_request\nExportLicenseRecommendationsResponse,export_license_recommendations_response\nExportManifest,export_manifest\nExportMetadataModelAssessmentMessage,export_metadata_model_assessment_message\nExportMetadataModelAssessmentResponse,export_metadata_model_assessment_response\nExportMetadataModelAssessmentResultEntry,export_metadata_model_assessment_result_entry\nExportMetric,export_metric\nExportName,export_name\nExportNotFoundException,export_not_found_exception\nExportNotebookInput,export_notebook_input\nExportNotebookOutput,export_notebook_output\nExportOnly,export_only\nExportPath,export_path\nExportProjectRequest,export_project_request\nExportProjectResult,export_project_result\nExportReadSet,export_read_set\nExportReadSetDetail,export_read_set_detail\nExportReadSetFilter,export_read_set_filter\nExportReadSetJobDetail,export_read_set_job_detail\nExportResourceSpecification,export_resource_specification\nExportResponse,export_response\nExportResults,export_results\nExportRevisionToS3,export_revision_to_s3\nExportRevisionsToS3,export_revisions_to_s3\nExportRevisionsToS3RequestDetails,export_revisions_to_s3_request_details\nExportRevisionsToS3ResponseDetails,export_revisions_to_s3_response_details\nExportS3DataInput,export_s3_data_input\nExportSchemaRequest,export_schema_request\nExportSchemaResponse,export_schema_response\nExportServerEngineAttributeRequest,export_server_engine_attribute_request\nExportServerEngineAttributeResponse,export_server_engine_attribute_response\nExportServerSideEncryption,export_server_side_encryption\nExportSnapshotRecord,export_snapshot_record\nExportSnapshotRecordSourceInfo,export_snapshot_record_source_info\nExportSnapshotRequest,export_snapshot_request\nExportSnapshotResult,export_snapshot_result\nExportSortBy,export_sort_by\nExportSourceImages,export_source_images\nExportSourceNetworkCfnTemplateRequest,export_source_network_cfn_template_request\nExportSourceNetworkCfnTemplateResponse,export_source_network_cfn_template_response\nExportSourceType,export_source_type\nExportSqlDetails,export_sql_details\nExportStatistics,export_statistics\nExportStatus,export_status\nExportSummaries,export_summaries\nExportSummary,export_summary\nExportTableToPointInTimeInput,export_table_to_point_in_time_input\nExportTableToPointInTimeOutput,export_table_to_point_in_time_output\nExportTask,export_task\nExportTaskAlreadyExistsFault,export_task_already_exists_fault\nExportTaskError,export_task_error\nExportTaskExecutionInfo,export_task_execution_info\nExportTaskId,export_task_id\nExportTaskIdentifier,export_task_identifier\nExportTaskIds,export_task_ids\nExportTaskNotFoundFault,export_task_not_found_fault\nExportTaskS3Location,export_task_s3_location\nExportTaskS3LocationRequest,export_task_s3_location_request\nExportTaskStatus,export_task_status\nExportTaskSummary,export_task_summary\nExportTasks,export_tasks\nExportTasksMessage,export_tasks_message\nExportThemesRequest,export_themes_request\nExportThemesResponse,export_themes_response\nExportTime,export_time\nExportToCSVOption,export_to_csv_option\nExportToS3Task,export_to_s3_task\nExportToS3TaskSpecification,export_to_s3_task_specification\nExportToTime,export_to_time\nExportToken,export_token\nExportTr31KeyBlock,export_tr31_key_block\nExportTr34KeyBlock,export_tr34_key_block\nExportTransitGatewayRoutesRequest,export_transit_gateway_routes_request\nExportTransitGatewayRoutesResult,export_transit_gateway_routes_result\nExportType,export_type\nExportVectorEnrichmentJobInput,export_vector_enrichment_job_input\nExportVectorEnrichmentJobOutput,export_vector_enrichment_job_output\nExportVectorEnrichmentJobOutputConfig,export_vector_enrichment_job_output_config\nExportVersion,export_version\nExportViewType,export_view_type\nExportWithHiddenFieldsOption,export_with_hidden_fields_option\nExportable,exportable\nExportableKey,exportable_key\nExportableLogTypes,exportable_log_types\nExported,exported\nExportedEnvironmentVariable,exported_environment_variable\nExportedRecordsCount,exported_records_count\nExportingConfig,exporting_config\nExportingLocation,exporting_location\nExportingStackId,exporting_stack_id\nExports,exports\nExposeHeaders,expose_headers\nExpression,expression\nExpressionAttributeNames,expression_attribute_names\nExpressionAttributeValues,expression_attribute_values\nExpressionName,expression_name\nExpressionNames,expression_names\nExpressionStatus,expression_status\nExpressionType,expression_type\nExpressionValue,expression_value\nExpressionVariable,expression_variable\nExpressions,expressions\nExtendLicenseConsumptionRequest,extend_license_consumption_request\nExtendLicenseConsumptionResponse,extend_license_consumption_response\nExtendTransactionRequest,extend_transaction_request\nExtendedDataServices,extended_data_services\nExtendedKeyUsage,extended_key_usage\nExtendedKeyUsageObjectIdentifier,extended_key_usage_object_identifier\nExtendedKeyUsageType,extended_key_usage_type\nExtendedKeyUsages,extended_key_usages\nExtendedS3DestinationConfiguration,extended_s3_destination_configuration\nExtendedS3DestinationDescription,extended_s3_destination_description\nExtendedS3DestinationUpdate,extended_s3_destination_update\nExtendedStatistic,extended_statistic\nExtendedStatistics,extended_statistics\nExtension,extension\nExtensionArn,extension_arn\nExtensionAssociation,extension_association\nExtensionAssociationId,extension_association_id\nExtensionAssociationSummary,extension_association_summary\nExtensionAssociations,extension_associations\nExtensionDetails,extension_details\nExtensionField,extension_field\nExtensionFields,extension_fields\nExtensionId,extension_id\nExtensionIdentifier,extension_identifier\nExtensionSummary,extension_summary\nExtensionVersion,extension_version\nExtensionVersionDetails,extension_version_details\nExtensionVersionNumber,extension_version_number\nExtensionVersions,extension_versions\nExtensions,extensions\nExtensionsV2,extensions_v2\nExtensionsV3,extensions_v3\nExtensionsV4,extensions_v4\nExternalAudioFileInput,external_audio_file_input\nExternalDataFilteringAllowList,external_data_filtering_allow_list\nExternalEvaluation,external_evaluation\nExternalEventsDetail,external_events_detail\nExternalId,external_id\nExternalIds,external_ids\nExternalImageId,external_image_id\nExternalLoginFederationProviderType,external_login_federation_provider_type\nExternalLoginFederationProviderUrl,external_login_federation_provider_url\nExternalLoginId,external_login_id\nExternalMeetingId,external_meeting_id\nExternalMetricStatus,external_metric_status\nExternalMetricsPreference,external_metrics_preference\nExternalModel,external_model\nExternalModelOutputs,external_model_outputs\nExternalModelSummary,external_model_summary\nExternalServiceException,external_service_exception\nExternalSourceSetting,external_source_setting\nExternalTableDefinition,external_table_definition\nExternalUrlConfig,external_url_config\nExternalUserId,external_user_id\nExternalUserIds,external_user_ids\nExternalWorkflowExecutionCancelRequestedEventAttributes,external_workflow_execution_cancel_requested_event_attributes\nExternalWorkflowExecutionSignaledEventAttributes,external_workflow_execution_signaled_event_attributes\nExtraArchivedLogDestIds,extra_archived_log_dest_ids\nExtraConnectionAttributes,extra_connection_attributes\nExtraHosts,extra_hosts\nExtraJarsS3Path,extra_jars_s3_path\nExtraParam,extra_param\nExtraParams,extra_params\nExtraPythonLibsS3Path,extra_python_libs_s3_path\nExtractDocId,extract_doc_id\nExtractedCharacters,extracted_characters\nExtractedCharactersListItem,extracted_characters_list_item\nExtraction,extraction\nExtractions,extractions\nEyeDirection,eye_direction\nEyeOpen,eye_open\nEyeglasses,eyeglasses\nEyesOpen,eyes_open\nF1,f1\nF1Score,f1_score\nF4vSettings,f4v_settings\nFCntStart,f_cnt_start\nFIAuthKey,fi_auth_key\nFIPSEnabled,fips_enabled\nFMSPolicyUpdateFirewallCreationConfigAction,fms_policy_update_firewall_creation_config_action\nFNwkSIntKey,f_nwk_s_int_key\nFPort,f_port\nFPorts,f_ports\nFQDN,fqdn\nFSxWindowsFileServerAuthorizationConfig,f_sx_windows_file_server_authorization_config\nFSxWindowsFileServerVolumeConfiguration,f_sx_windows_file_server_volume_configuration\nFabric,fabric\nFace,face\nFaceAttributes,face_attributes\nFaceCount,face_count\nFaceDetail,face_detail\nFaceDetails,face_details\nFaceDetection,face_detection\nFaceId,face_id\nFaceIds,face_ids\nFaceMatch,face_match\nFaceMatchThreshold,face_match_threshold\nFaceMatches,face_matches\nFaceModelVersion,face_model_version\nFaceModelVersions,face_model_versions\nFaceOccluded,face_occluded\nFaceRecord,face_record\nFaceRecords,face_records\nFaceSearch,face_search\nFaceSearchSettings,face_search_settings\nFacebook,facebook\nFaces,faces\nFacet,facet\nFacetAlreadyExistsException,facet_already_exists_exception\nFacetAttribute,facet_attribute\nFacetAttributeDefinition,facet_attribute_definition\nFacetAttributeReference,facet_attribute_reference\nFacetAttributeUpdate,facet_attribute_update\nFacetEnabled,facet_enabled\nFacetFilter,facet_filter\nFacetInUseException,facet_in_use_exception\nFacetName,facet_name\nFacetNames,facet_names\nFacetNotFoundException,facet_not_found_exception\nFacetResult,facet_result\nFacetResults,facet_results\nFacetStyle,facet_style\nFacetValidationException,facet_validation_exception\nFacetable,facetable\nFacets,facets\nFactoryPresetFreqsList,factory_preset_freqs_list\nFactorySupport,factory_support\nFadeIn,fade_in\nFadeOut,fade_out\nFail,fail\nFailOnWarnings,fail_on_warnings\nFailStepMetadata,fail_step_metadata\nFailTasksOnLobTruncation,fail_tasks_on_lob_truncation\nFailWorkflowExecutionDecisionAttributes,fail_workflow_execution_decision_attributes\nFailWorkflowExecutionFailedEventAttributes,fail_workflow_execution_failed_event_attributes\nFailed,failed\nFailedAccount,failed_account\nFailedActions,failed_actions\nFailedAssociatedResources,failed_associated_resources\nFailedBatchItem,failed_batch_item\nFailedBatches,failed_batches\nFailedCampaignStateResponse,failed_campaign_state_response\nFailedCapacityReservationFleetCancellationResult,failed_capacity_reservation_fleet_cancellation_result\nFailedCount,failed_count\nFailedCreateAssociation,failed_create_association\nFailedCreateSimulationJobRequest,failed_create_simulation_job_request\nFailedCreateStandbyWorkspacesRequest,failed_create_standby_workspaces_request\nFailedCreateWorkspaceRequest,failed_create_workspace_request\nFailedCustomVocabularyItem,failed_custom_vocabulary_item\nFailedDeleteRemediationExceptionsBatch,failed_delete_remediation_exceptions_batch\nFailedDependencyException,failed_dependency_exception\nFailedDisassociatedResources,failed_disassociated_resources\nFailedDocuments,failed_documents\nFailedEntity,failed_entity\nFailedEntityList,failed_entity_list\nFailedEntries,failed_entries\nFailedEntryCount,failed_entry_count\nFailedEvaluations,failed_evaluations\nFailedFindings,failed_findings\nFailedFleetCancellations,failed_fleet_cancellations\nFailedImportedDeviceCount,failed_imported_device_count\nFailedItem,failed_item\nFailedItemDetails,failed_item_details\nFailedItems,failed_items\nFailedLoginAttempts,failed_login_attempts\nFailedMemberAccountEc2DeepInspectionStatusState,failed_member_account_ec2_deep_inspection_status_state\nFailedNonRetryableError,failed_non_retryable_error\nFailedPieces,failed_pieces\nFailedPutCount,failed_put_count\nFailedQueuedPurchaseDeletion,failed_queued_purchase_deletion\nFailedQueuedPurchaseDeletions,failed_queued_purchase_deletions\nFailedReason,failed_reason\nFailedRecordCount,failed_record_count\nFailedRecordsCount,failed_records_count\nFailedRecordsS3Url,failed_records_s3_url\nFailedRemediationBatch,failed_remediation_batch\nFailedRemediationExceptionBatch,failed_remediation_exception_batch\nFailedRequest,failed_request\nFailedRequests,failed_requests\nFailedResource,failed_resource\nFailedResourceAccessException,failed_resource_access_exception\nFailedResourcesMap,failed_resources_map\nFailedS3Resource,failed_s3_resource\nFailedScheduledActions,failed_scheduled_actions\nFailedScheduledUpdateGroupActionRequest,failed_scheduled_update_group_action_request\nFailedScheduledUpdateGroupActions,failed_scheduled_update_group_actions\nFailedServiceActionAssociation,failed_service_action_association\nFailedServiceActionAssociations,failed_service_action_associations\nFailedStackInstancesCount,failed_stack_instances_count\nFailedStandbyRequests,failed_standby_requests\nFailedStatusDetails,failed_status_details\nFailedSteps,failed_steps\nFailedUsers,failed_users\nFailedWorkspaceChangeRequest,failed_workspace_change_request\nFailover,failover\nFailoverCondition,failover_condition\nFailoverConditionSettings,failover_condition_settings\nFailoverConditions,failover_conditions\nFailoverConfig,failover_config\nFailoverCriteria,failover_criteria\nFailoverDBClusterMessage,failover_db_cluster_message\nFailoverDBClusterResult,failover_db_cluster_result\nFailoverGlobalClusterMessage,failover_global_cluster_message\nFailoverGlobalClusterResult,failover_global_cluster_result\nFailoverGlobalReplicationGroupMessage,failover_global_replication_group_message\nFailoverGlobalReplicationGroupResult,failover_global_replication_group_result\nFailoverMode,failover_mode\nFailoverShardRequest,failover_shard_request\nFailoverShardResponse,failover_shard_response\nFailoverState,failover_state\nFailure,failure\nFailureAction,failure_action\nFailureByQueryException,failure_by_query_exception\nFailureCause,failure_cause\nFailureCode,failure_code\nFailureCodes,failure_codes\nFailureDescription,failure_description\nFailureDetails,failure_details\nFailureException,failure_exception\nFailureHandlingPolicy,failure_handling_policy\nFailureInfo,failure_info\nFailureLocation,failure_location\nFailureMessage,failure_message\nFailureMessages,failure_messages\nFailureMode,failure_mode\nFailurePolicy,failure_policy\nFailureReason,failure_reason\nFailureReasons,failure_reasons\nFailureRedirectionURL,failure_redirection_url\nFailureResource,failure_resource\nFailureRetentionPeriodInDays,failure_retention_period_in_days\nFailureStage,failure_stage\nFailureStrings,failure_strings\nFailureSummary,failure_summary\nFailureThreshold,failure_threshold\nFailureTime,failure_time\nFailureToleranceCount,failure_tolerance_count\nFailureTolerancePercentage,failure_tolerance_percentage\nFailureType,failure_type\nFailureValues,failure_values\nFailures,failures\nFairsharePolicy,fairshare_policy\nFallBackPhoneNumber,fall_back_phone_number\nFallbackAction,fallback_action\nFallbackBehavior,fallback_behavior\nFallbackFont,fallback_font\nFalseActivity,false_activity\nFalseyCellValue,falsey_cell_value\nFalseyCellValueSynonyms,falsey_cell_value_synonyms\nFamily,family\nFamilyName,family_name\nFaqIds,faq_ids\nFaqStatistics,faq_statistics\nFaqSummary,faq_summary\nFaqSummaryItems,faq_summary_items\nFargatePlatformConfiguration,fargate_platform_configuration\nFargateProfile,fargate_profile\nFargateProfileSelector,fargate_profile_selector\nFastLaunchConfiguration,fast_launch_configuration\nFastLaunchImages,fast_launch_images\nFastLaunchLaunchTemplateSpecification,fast_launch_launch_template_specification\nFastLaunchLaunchTemplateSpecificationRequest,fast_launch_launch_template_specification_request\nFastLaunchLaunchTemplateSpecificationResponse,fast_launch_launch_template_specification_response\nFastLaunchSnapshotConfiguration,fast_launch_snapshot_configuration\nFastLaunchSnapshotConfigurationRequest,fast_launch_snapshot_configuration_request\nFastLaunchSnapshotConfigurationResponse,fast_launch_snapshot_configuration_response\nFastResetToken,fast_reset_token\nFastRestoreRule,fast_restore_rule\nFastRestored,fast_restored\nFastSnapshotRestoreStateErrors,fast_snapshot_restore_state_errors\nFastSnapshotRestores,fast_snapshot_restores\nFault,fault\nFaultCode,fault_code\nFaultCodes,fault_codes\nFaultCount,fault_count\nFaultCountHigh,fault_count_high\nFaultCountLow,fault_count_low\nFaultRootCause,fault_root_cause\nFaultRootCauseEntity,fault_root_cause_entity\nFaultRootCauseService,fault_root_cause_service\nFaultRootCauses,fault_root_causes\nFaultStatistics,fault_statistics\nFaultTolerance,fault_tolerance\nFavoritePages,favorite_pages\nFax,fax\nFeature,feature\nFeatureActivations,feature_activations\nFeatureAdditions,feature_additions\nFeatureConfigurations,feature_configurations\nFeatureDefinition,feature_definition\nFeatureDefinitions,feature_definitions\nFeatureGroup,feature_group\nFeatureGroupArn,feature_group_arn\nFeatureGroupName,feature_group_name\nFeatureGroupStatus,feature_group_status\nFeatureGroupStatusEquals,feature_group_status_equals\nFeatureGroupSummaries,feature_group_summaries\nFeatureGroupSummary,feature_group_summary\nFeatureHeaders,feature_headers\nFeatureMetadata,feature_metadata\nFeatureName,feature_name\nFeatureNames,feature_names\nFeatureNotAvailableException,feature_not_available_exception\nFeatureParameter,feature_parameter\nFeatureSet,feature_set\nFeatureSpecificationS3Uri,feature_specification_s3_uri\nFeatureStoreOutput,feature_store_output\nFeatureSummary,feature_summary\nFeatureTransformation,feature_transformation\nFeatureType,feature_type\nFeatureTypes,feature_types\nFeatureValue,feature_value\nFeaturedDocument,featured_document\nFeaturedDocumentMissing,featured_document_missing\nFeaturedDocumentWithMetadata,featured_document_with_metadata\nFeaturedDocuments,featured_documents\nFeaturedDocumentsMissing,featured_documents_missing\nFeaturedDocumentsWithMetadata,featured_documents_with_metadata\nFeaturedResultsConflictException,featured_results_conflict_exception\nFeaturedResultsItem,featured_results_item\nFeaturedResultsItems,featured_results_items\nFeaturedResultsSet,featured_results_set\nFeaturedResultsSetId,featured_results_set_id\nFeaturedResultsSetIds,featured_results_set_ids\nFeaturedResultsSetName,featured_results_set_name\nFeaturedResultsSetSummary,featured_results_set_summary\nFeaturedResultsSetSummaryItems,featured_results_set_summary_items\nFeatures,features\nFeaturesAttribute,features_attribute\nFeaturization,featurization\nFeaturizationConfig,featurization_config\nFeaturizationMethod,featurization_method\nFeaturizationMethodName,featurization_method_name\nFeaturizationMethodParameters,featurization_method_parameters\nFeaturizationPipeline,featurization_pipeline\nFeaturizations,featurizations\nFec,fec\nFecOutputSettings,fec_output_settings\nFederatedAuthentication,federated_authentication\nFederatedAuthenticationRequest,federated_authentication_request\nFederatedDatabase,federated_database\nFederatedResourceAlreadyExistsException,federated_resource_already_exists_exception\nFederatedTable,federated_table\nFederatedUser,federated_user\nFederatedUserId,federated_user_id\nFederationParameters,federation_parameters\nFederationSourceErrorCode,federation_source_error_code\nFederationSourceException,federation_source_exception\nFederationSourceRetryableException,federation_source_retryable_exception\nFeedback,feedback\nFeedbackDate,feedback_date\nFeedbackForwardingAddress,feedback_forwarding_address\nFeedbackForwardingEmailAddress,feedback_forwarding_email_address\nFeedbackForwardingEmailAddressIdentityArn,feedback_forwarding_email_address_identity_arn\nFeedbackForwardingStatus,feedback_forwarding_status\nFeedbackId,feedback_id\nFeedbackToken,feedback_token\nFeedbackURL,feedback_url\nFeedbackValue,feedback_value\nFetchOwner,fetch_owner\nFetchPage,fetch_page\nFetchPageRequest,fetch_page_request\nFetchPageResult,fetch_page_result\nFiberOpticCableType,fiber_optic_cable_type\nField,field\nFieldBasedTooltip,field_based_tooltip\nFieldConfig,field_config\nFieldDataPathValues,field_data_path_values\nFieldDelimiter,field_delimiter\nFieldEncoding,field_encoding\nFieldError,field_error\nFieldFolder,field_folder\nFieldFolders,field_folders\nFieldGroup,field_group\nFieldId,field_id\nFieldIdentifier,field_identifier\nFieldInfo,field_info\nFieldInputConfig,field_input_config\nFieldItem,field_item\nFieldLabelType,field_label_type\nFieldLevel,field_level\nFieldLevelEncryption,field_level_encryption\nFieldLevelEncryptionConfig,field_level_encryption_config\nFieldLevelEncryptionConfigAlreadyExists,field_level_encryption_config_already_exists\nFieldLevelEncryptionConfigInUse,field_level_encryption_config_in_use\nFieldLevelEncryptionId,field_level_encryption_id\nFieldLevelEncryptionList,field_level_encryption_list\nFieldLevelEncryptionProfile,field_level_encryption_profile\nFieldLevelEncryptionProfileAlreadyExists,field_level_encryption_profile_already_exists\nFieldLevelEncryptionProfileConfig,field_level_encryption_profile_config\nFieldLevelEncryptionProfileInUse,field_level_encryption_profile_in_use\nFieldLevelEncryptionProfileList,field_level_encryption_profile_list\nFieldLevelEncryptionProfileSizeExceeded,field_level_encryption_profile_size_exceeded\nFieldLevelEncryptionProfileSummary,field_level_encryption_profile_summary\nFieldLevelEncryptionSummary,field_level_encryption_summary\nFieldLevelOptions,field_level_options\nFieldList,field_list\nFieldLogLevel,field_log_level\nFieldMappings,field_mappings\nFieldName,field_name\nFieldNames,field_names\nFieldOption,field_option\nFieldOptionError,field_option_error\nFieldOptions,field_options\nFieldPatterns,field_patterns\nFieldSelectors,field_selectors\nFieldSeriesItem,field_series_item\nFieldSort,field_sort\nFieldSortOptions,field_sort_options\nFieldSourceProfileIds,field_source_profile_ids\nFieldStatistics,field_statistics\nFieldStats,field_stats\nFieldSummary,field_summary\nFieldToMatch,field_to_match\nFieldTooltipItem,field_tooltip_item\nFieldTypeDetails,field_type_details\nFieldValidationConfiguration,field_validation_configuration\nFieldValidationMessage,field_validation_message\nFieldValue,field_value\nFieldWells,field_wells\nFields,fields\nFile,file\nFileAccessAuditLogLevel,file_access_audit_log_level\nFileAccessLog,file_access_log\nFileBatchJobDefinition,file_batch_job_definition\nFileBatchJobIdentifier,file_batch_job_identifier\nFileCache,file_cache\nFileCacheCreating,file_cache_creating\nFileCacheDataRepositoryAssociation,file_cache_data_repository_association\nFileCacheFailureDetails,file_cache_failure_details\nFileCacheId,file_cache_id\nFileCacheIds,file_cache_ids\nFileCacheLustreConfiguration,file_cache_lustre_configuration\nFileCacheLustreMetadataConfiguration,file_cache_lustre_metadata_configuration\nFileCacheNFSConfiguration,file_cache_nfs_configuration\nFileCacheNotFound,file_cache_not_found\nFileCachePath,file_cache_path\nFileCacheType,file_cache_type\nFileCacheTypeVersion,file_cache_type_version\nFileCaches,file_caches\nFileCompression,file_compression\nFileConfiguration,file_configuration\nFileContentAndSourceFileSpecifiedException,file_content_and_source_file_specified_exception\nFileContentRequiredException,file_content_required_exception\nFileContentSizeLimitExceededException,file_content_size_limit_exceeded_exception\nFileCount,file_count\nFileDoesNotExistException,file_does_not_exist_exception\nFileEntryRequiredException,file_entry_required_exception\nFileFailures,file_failures\nFileFieldMappings,file_field_mappings\nFileFingerprintLines,file_fingerprint_lines\nFileFormat,file_format\nFileFormatConfiguration,file_format_configuration\nFileFormatDescriptor,file_format_descriptor\nFileFormats,file_formats\nFileGroupSettings,file_group_settings\nFileGroups,file_groups\nFileHeaderInfo,file_header_info\nFileInformation,file_information\nFileInput,file_input\nFileKey,file_key\nFileKeyUpdate,file_key_update\nFileLastWritten,file_last_written\nFileLocation,file_location\nFileMetadata,file_metadata\nFileMode,file_mode\nFileModeRequiredException,file_mode_required_exception\nFileModes,file_modes\nFileName,file_name\nFileNameConflictsWithDirectoryNameException,file_name_conflicts_with_directory_name_exception\nFileOffset,file_offset\nFilePath,file_path\nFilePathConflictsWithSubmodulePathException,file_path_conflicts_with_submodule_path_exception\nFilePaths,file_paths\nFileShareARN,file_share_arn\nFileShareARNList,file_share_arn_list\nFileShareAccessAuditLogLevel,file_share_access_audit_log_level\nFileShareId,file_share_id\nFileShareInfo,file_share_info\nFileShareInfoList,file_share_info_list\nFileShareName,file_share_name\nFileShareStatus,file_share_status\nFileShareType,file_share_type\nFileSharesVisible,file_shares_visible\nFileSize,file_size\nFileSizeBytes,file_size_bytes\nFileSizes,file_sizes\nFileSource,file_source\nFileSourceSettings,file_source_settings\nFileSystem,file_system\nFileSystemAccessMode,file_system_access_mode\nFileSystemAccessRoleArn,file_system_access_role_arn\nFileSystemAdministratorsGroup,file_system_administrators_group\nFileSystemAlreadyExists,file_system_already_exists\nFileSystemArn,file_system_arn\nFileSystemAssociationARN,file_system_association_arn\nFileSystemAssociationARNList,file_system_association_arn_list\nFileSystemAssociationId,file_system_association_id\nFileSystemAssociationInfo,file_system_association_info\nFileSystemAssociationInfoList,file_system_association_info_list\nFileSystemAssociationStatus,file_system_association_status\nFileSystemAssociationStatusDetail,file_system_association_status_detail\nFileSystemAssociationStatusDetails,file_system_association_status_details\nFileSystemAssociationSummary,file_system_association_summary\nFileSystemAssociationSummaryList,file_system_association_summary_list\nFileSystemConfig,file_system_config\nFileSystemConfigs,file_system_configs\nFileSystemDataSource,file_system_data_source\nFileSystemDescription,file_system_description\nFileSystemEndpoint,file_system_endpoint\nFileSystemEndpoints,file_system_endpoints\nFileSystemFailureDetails,file_system_failure_details\nFileSystemId,file_system_id\nFileSystemIds,file_system_ids\nFileSystemInUse,file_system_in_use\nFileSystemLimitExceeded,file_system_limit_exceeded\nFileSystemNotFound,file_system_not_found\nFileSystemPath,file_system_path\nFileSystemPolicyDescription,file_system_policy_description\nFileSystemSize,file_system_size\nFileSystemType,file_system_type\nFileSystemTypeVersion,file_system_type_version\nFileSystems,file_systems\nFileTooLargeException,file_too_large_exception\nFileTransferUploadStreams,file_transfer_upload_streams\nFileUploadURL,file_upload_url\nFileUploaderFieldConfig,file_uploader_field_config\nFileValidationMessage,file_validation_message\nFileVersion,file_version\nFilecacheDuration,filecache_duration\nFilenameContains,filename_contains\nFiles,files\nFilesCompleted,files_completed\nFilesDeleted,files_deleted\nFilesLimit,files_limit\nFilesSkipped,files_skipped\nFilesTransferred,files_transferred\nFilesVerified,files_verified\nFilesystemId,filesystem_id\nFillLineGap,fill_line_gap\nFillMissingValues,fill_missing_values\nFillPolicy,fill_policy\nFillStyle,fill_style\nFilledMapAggregatedFieldWells,filled_map_aggregated_field_wells\nFilledMapConditionalFormatting,filled_map_conditional_formatting\nFilledMapConditionalFormattingOption,filled_map_conditional_formatting_option\nFilledMapConfiguration,filled_map_configuration\nFilledMapFieldWells,filled_map_field_wells\nFilledMapShapeConditionalFormatting,filled_map_shape_conditional_formatting\nFilledMapSortConfiguration,filled_map_sort_configuration\nFilledMapVisual,filled_map_visual\nFilledPath,filled_path\nFillerSlate,filler_slate\nFilling,filling\nFilmGrainSynthesis,film_grain_synthesis\nFilter,filter\nFilterActivity,filter_activity\nFilterArn,filter_arn\nFilterArns,filter_arns\nFilterAtDestination,filter_at_destination\nFilterAtSource,filter_at_source\nFilterAttributeRanges,filter_attribute_ranges\nFilterBBox,filter_b_box\nFilterCategories,filter_categories\nFilterClass,filter_class\nFilterCondition,filter_condition\nFilterConditionList,filter_condition_list\nFilterConditions,filter_conditions\nFilterConfiguration,filter_configuration\nFilterControl,filter_control\nFilterControlId,filter_control_id\nFilterControls,filter_controls\nFilterCountries,filter_countries\nFilterCriteria,filter_criteria\nFilterCriterion,filter_criterion\nFilterDateTimePickerControl,filter_date_time_picker_control\nFilterDefinition,filter_definition\nFilterDescription,filter_description\nFilterDropDownControl,filter_drop_down_control\nFilterEnable,filter_enable\nFilterExpression,filter_expression\nFilterGroup,filter_group\nFilterGroupId,filter_group_id\nFilterGroups,filter_groups\nFilterId,filter_id\nFilterInArns,filter_in_arns\nFilterKey,filter_key\nFilterLimitExceededException,filter_limit_exceeded_exception\nFilterList,filter_list\nFilterListConfiguration,filter_list_configuration\nFilterListControl,filter_list_control\nFilterLogEventsRequest,filter_log_events_request\nFilterLogEventsResponse,filter_log_events_response\nFilterName,filter_name\nFilterNames,filter_names\nFilterOperation,filter_operation\nFilterOperationSelectedFieldsConfiguration,filter_operation_selected_fields_configuration\nFilterOperationTargetVisualsConfiguration,filter_operation_target_visuals_configuration\nFilterOperator,filter_operator\nFilterOption,filter_option\nFilterPartialResults,filter_partial_results\nFilterPolicyLimitExceededException,filter_policy_limit_exceeded_exception\nFilterPortRange,filter_port_range\nFilterPredicate,filter_predicate\nFilterQuery,filter_query\nFilterRelativeDateTimeControl,filter_relative_date_time_control\nFilterRule,filter_rule\nFilterRules,filter_rules\nFilterScopeConfiguration,filter_scope_configuration\nFilterSelectableValues,filter_selectable_values\nFilterSettings,filter_settings\nFilterSliderControl,filter_slider_control\nFilterStrength,filter_strength\nFilterString,filter_string\nFilterSummary,filter_summary\nFilterSynonyms,filter_synonyms\nFilterTextAreaControl,filter_text_area_control\nFilterTextFieldControl,filter_text_field_control\nFilterType,filter_type\nFilterTypedLink,filter_typed_link\nFilterV2,filter_v2\nFilterValue,filter_value\nFilterValues,filter_values\nFilterVariable,filter_variable\nFilteredLogEvent,filtered_log_event\nFilteredStatus,filtered_status\nFilters,filters\nFinalActiveLearningModelArn,final_active_learning_model_arn\nFinalAutoMLJobObjectiveMetric,final_auto_ml_job_objective_metric\nFinalBackupId,final_backup_id\nFinalBackupTags,final_backup_tags\nFinalBakeTimeInMinutes,final_bake_time_in_minutes\nFinalClusterSnapshotIdentifier,final_cluster_snapshot_identifier\nFinalClusterSnapshotRetentionPeriod,final_cluster_snapshot_retention_period\nFinalDBSnapshotIdentifier,final_db_snapshot_identifier\nFinalHyperParameterTuningJobObjectiveMetric,final_hyper_parameter_tuning_job_objective_metric\nFinalMetricDataList,final_metric_data_list\nFinalRecipient,final_recipient\nFinalSnapshotIdentifier,final_snapshot_identifier\nFinalSnapshotName,final_snapshot_name\nFinalizeCutoverRequest,finalize_cutover_request\nFinalizeDeviceClaimRequest,finalize_device_claim_request\nFinalizeDeviceClaimResponse,finalize_device_claim_response\nFinalized,finalized\nFinalizingOrganizationException,finalizing_organization_exception\nFindMatchesMetrics,find_matches_metrics\nFindMatchesParameters,find_matches_parameters\nFindMatchesTaskRunProperties,find_matches_task_run_properties\nFinding,finding\nFindingAction,finding_action\nFindingActor,finding_actor\nFindingAggregationRegion,finding_aggregation_region\nFindingAggregator,finding_aggregator\nFindingAggregatorArn,finding_aggregator_arn\nFindingAggregators,finding_aggregators\nFindingComponents,finding_components\nFindingCreated,finding_created\nFindingCriteria,finding_criteria\nFindingDetail,finding_detail\nFindingDetailsError,finding_details_error\nFindingFieldsUpdate,finding_fields_update\nFindingFilter,finding_filter\nFindingHistoryRecord,finding_history_record\nFindingHistoryUpdate,finding_history_update\nFindingHistoryUpdateSource,finding_history_update_source\nFindingId,finding_id\nFindingIdentifier,finding_identifier\nFindingIdentifiers,finding_identifiers\nFindingIds,finding_ids\nFindingMetricsValuePerSeverity,finding_metrics_value_per_severity\nFindingProviderFields,finding_provider_fields\nFindingProviderFieldsConfidence,finding_provider_fields_confidence\nFindingProviderFieldsCriticality,finding_provider_fields_criticality\nFindingProviderFieldsRelatedFindingsId,finding_provider_fields_related_findings_id\nFindingProviderFieldsRelatedFindingsProductArn,finding_provider_fields_related_findings_product_arn\nFindingProviderFieldsSeverityLabel,finding_provider_fields_severity_label\nFindingProviderFieldsSeverityOriginal,finding_provider_fields_severity_original\nFindingProviderFieldsTypes,finding_provider_fields_types\nFindingProviderSeverity,finding_provider_severity\nFindingPublishingFrequency,finding_publishing_frequency\nFindingReasonCodes,finding_reason_codes\nFindingSource,finding_source\nFindingSourceDetail,finding_source_detail\nFindingStatisticTypes,finding_statistic_types\nFindingStatistics,finding_statistics\nFindingStatisticsSortCriteria,finding_statistics_sort_criteria\nFindingSummary,finding_summary\nFindingTypeAggregation,finding_type_aggregation\nFindingTypeAggregationResponse,finding_type_aggregation_response\nFindingTypes,finding_types\nFindings,findings\nFindingsCount,findings_count\nFindingsFilterListItem,findings_filter_list_item\nFindingsFound,findings_found\nFindingsReportSummary,findings_report_summary\nFineGrainedAuthorizationEnabled,fine_grained_authorization_enabled\nFingerprint,fingerprint\nFinishTime,finish_time\nFinishTimeMillis,finish_time_millis\nFinishedAt,finished_at\nFinishedTime,finished_time\nFinishedWorldsSummary,finished_worlds_summary\nFips,fips\nFipsDnsName,fips_dns_name\nFipsEnabled,fips_enabled\nFirehose,firehose\nFirehoseAction,firehose_action\nFirehoseArn,firehose_arn\nFirehoseDestinationConfiguration,firehose_destination_configuration\nFirehoseFailureFeedbackRoleArn,firehose_failure_feedback_role_arn\nFirehoseLogDelivery,firehose_log_delivery\nFirehoseLogDeliveryDescription,firehose_log_delivery_description\nFirehoseStream,firehose_stream\nFirehoseSuccessFeedbackRoleArn,firehose_success_feedback_role_arn\nFirelensConfiguration,firelens_configuration\nFirewall,firewall\nFirewallArn,firewall_arn\nFirewallConfig,firewall_config\nFirewallConfigs,firewall_configs\nFirewallCreationConfig,firewall_creation_config\nFirewallDeploymentModel,firewall_deployment_model\nFirewallDomainList,firewall_domain_list\nFirewallDomainListId,firewall_domain_list_id\nFirewallDomainListMetadata,firewall_domain_list_metadata\nFirewallDomainLists,firewall_domain_lists\nFirewallEndpoint,firewall_endpoint\nFirewallFailOpen,firewall_fail_open\nFirewallId,firewall_id\nFirewallManagerRuleGroup,firewall_manager_rule_group\nFirewallManagerStatement,firewall_manager_statement\nFirewallMetadata,firewall_metadata\nFirewallName,firewall_name\nFirewallPolicies,firewall_policies\nFirewallPolicy,firewall_policy\nFirewallPolicyArn,firewall_policy_arn\nFirewallPolicyChangeProtection,firewall_policy_change_protection\nFirewallPolicyDetails,firewall_policy_details\nFirewallPolicyId,firewall_policy_id\nFirewallPolicyMetadata,firewall_policy_metadata\nFirewallPolicyName,firewall_policy_name\nFirewallPolicyResponse,firewall_policy_response\nFirewallPolicyStatefulRuleGroupReferencesDetails,firewall_policy_stateful_rule_group_references_details\nFirewallPolicyStatelessCustomActionsDetails,firewall_policy_stateless_custom_actions_details\nFirewallPolicyStatelessRuleGroupReferencesDetails,firewall_policy_stateless_rule_group_references_details\nFirewallPolicyStatus,firewall_policy_status\nFirewallRule,firewall_rule\nFirewallRuleGroup,firewall_rule_group\nFirewallRuleGroupAssociation,firewall_rule_group_association\nFirewallRuleGroupAssociationId,firewall_rule_group_association_id\nFirewallRuleGroupAssociations,firewall_rule_group_associations\nFirewallRuleGroupId,firewall_rule_group_id\nFirewallRuleGroupMetadata,firewall_rule_group_metadata\nFirewallRuleGroupPolicy,firewall_rule_group_policy\nFirewallRuleGroups,firewall_rule_groups\nFirewallRules,firewall_rules\nFirewallStatefulRule,firewall_stateful_rule\nFirewallStatelessRule,firewall_stateless_rule\nFirewallStatus,firewall_status\nFirewallSubnetId,firewall_subnet_id\nFirewallSubnetIsOutOfScopeViolation,firewall_subnet_is_out_of_scope_violation\nFirewallSubnetMissingVPCEndpointViolation,firewall_subnet_missing_vpc_endpoint_violation\nFirewallSubnetRoutes,firewall_subnet_routes\nFirewalls,firewalls\nFirmwareUpdateImage,firmware_update_image\nFirmwareUpdateRole,firmware_update_role\nFirst,first\nFirstAccessedTime,first_accessed_time\nFirstActivatedTime,first_activated_time\nFirstAddress,first_address\nFirstBlockToken,first_block_token\nFirstEvaluationStarted,first_evaluation_started\nFirstExecutionFrom,first_execution_from\nFirstName,first_name\nFirstObservedAt,first_observed_at\nFirstPage,first_page\nFirstSchemaVersionNumber,first_schema_version_number\nFirstSeen,first_seen\nFirstSeenDateTime,first_seen_date_time\nFirstSlotStartTime,first_slot_start_time\nFirstSlotStartTimeRange,first_slot_start_time_range\nFirstSnapshotId,first_snapshot_id\nFixAvailable,fix_available\nFixedAfd,fixed_afd\nFixedGOP,fixed_gop\nFixedInVersion,fixed_in_version\nFixedModeScheduleActionStartSettings,fixed_mode_schedule_action_start_settings\nFixedPrice,fixed_price\nFixedRate,fixed_rate\nFixedResponseAction,fixed_response_action\nFixedResponseActionConfig,fixed_response_action_config\nFixedResponseConfig,fixed_response_config\nFlacSettings,flac_settings\nFlag,flag\nFlaggedResources,flagged_resources\nFlags,flags\nFlat,flat\nFlatInvocations,flat_invocations\nFleet,fleet\nFleetAdvisorLsaAnalysisResponse,fleet_advisor_lsa_analysis_response\nFleetAdvisorSchemaObjectResponse,fleet_advisor_schema_object_response\nFleetAdvisorSchemaObjects,fleet_advisor_schema_objects\nFleetAdvisorSchemas,fleet_advisor_schemas\nFleetArn,fleet_arn\nFleetAttributes,fleet_attributes\nFleetCapacity,fleet_capacity\nFleetCapacityExceededException,fleet_capacity_exceeded_exception\nFleetCapacityReservation,fleet_capacity_reservation\nFleetCapacityReservations,fleet_capacity_reservations\nFleetData,fleet_data\nFleetError,fleet_error\nFleetErrors,fleet_errors\nFleetId,fleet_id\nFleetIds,fleet_ids\nFleetLaunchTemplateConfig,fleet_launch_template_config\nFleetLaunchTemplateConfigRequest,fleet_launch_template_config_request\nFleetLaunchTemplateOverrides,fleet_launch_template_overrides\nFleetLaunchTemplateOverridesRequest,fleet_launch_template_overrides_request\nFleetLaunchTemplateSpecification,fleet_launch_template_specification\nFleetLaunchTemplateSpecificationRequest,fleet_launch_template_specification_request\nFleetMetricNameAndArn,fleet_metric_name_and_arn\nFleetName,fleet_name\nFleetSpotCapacityRebalance,fleet_spot_capacity_rebalance\nFleetSpotCapacityRebalanceRequest,fleet_spot_capacity_rebalance_request\nFleetSpotMaintenanceStrategies,fleet_spot_maintenance_strategies\nFleetSpotMaintenanceStrategiesRequest,fleet_spot_maintenance_strategies_request\nFleetState,fleet_state\nFleetStatus,fleet_status\nFleetSummary,fleet_summary\nFleetSummaryList,fleet_summary_list\nFleetType,fleet_type\nFleetUtilization,fleet_utilization\nFleets,fleets\nFlexCacheEndpointType,flex_cache_endpoint_type\nFlexMatchMode,flex_match_mode\nFlexibleTimeWindow,flexible_time_window\nFlickerAdaptiveQuantization,flicker_adaptive_quantization\nFlickerAq,flicker_aq\nFlinkApplicationConfiguration,flink_application_configuration\nFlinkApplicationConfigurationDescription,flink_application_configuration_description\nFlinkApplicationConfigurationUpdate,flink_application_configuration_update\nFlinkRunConfiguration,flink_run_configuration\nFlinkRunConfigurationDescription,flink_run_configuration_description\nFlow,flow\nFlowArn,flow_arn\nFlowDefinition,flow_definition\nFlowDefinitionArn,flow_definition_arn\nFlowDefinitionName,flow_definition_name\nFlowDefinitionOutputConfig,flow_definition_output_config\nFlowDefinitionStatus,flow_definition_status\nFlowDefinitionSummaries,flow_definition_summaries\nFlowDefinitionSummary,flow_definition_summary\nFlowExecutionMessage,flow_execution_message\nFlowExecutionSummary,flow_execution_summary\nFlowLog,flow_log\nFlowLogId,flow_log_id\nFlowLogIds,flow_log_ids\nFlowLogStatus,flow_log_status\nFlowLogs,flow_logs\nFlowLogsConfigurationResult,flow_logs_configuration_result\nFlowLogsEnabled,flow_logs_enabled\nFlowLogsS3Bucket,flow_logs_s3_bucket\nFlowLogsS3Prefix,flow_logs_s3_prefix\nFlowName,flow_name\nFlowOutput,flow_output\nFlowSource,flow_source\nFlowSourceArn,flow_source_arn\nFlowTemplateDescription,flow_template_description\nFlowTemplateFilter,flow_template_filter\nFlowTemplateSummary,flow_template_summary\nFlowVpcInterfaceAttachment,flow_vpc_interface_attachment\nFlows,flows\nFlushApiCacheRequest,flush_api_cache_request\nFlushStageAuthorizersCacheRequest,flush_stage_authorizers_cache_request\nFlushStageCacheRequest,flush_stage_cache_request\nFlywheelArn,flywheel_arn\nFlywheelFilter,flywheel_filter\nFlywheelIterationFilter,flywheel_iteration_filter\nFlywheelIterationId,flywheel_iteration_id\nFlywheelIterationProperties,flywheel_iteration_properties\nFlywheelIterationPropertiesList,flywheel_iteration_properties_list\nFlywheelModelEvaluationMetrics,flywheel_model_evaluation_metrics\nFlywheelName,flywheel_name\nFlywheelProperties,flywheel_properties\nFlywheelStatsS3Prefix,flywheel_stats_s3_prefix\nFlywheelSummary,flywheel_summary\nFlywheelSummaryList,flywheel_summary_list\nFmp4HlsSettings,fmp4_hls_settings\nFmt,fmt\nFmtp,fmtp\nFmtpRequest,fmtp_request\nFolder,folder\nFolderConfiguration,folder_configuration\nFolderConfigurations,folder_configurations\nFolderContentSizeLimitExceededException,folder_content_size_limit_exceeded_exception\nFolderDoesNotExistException,folder_does_not_exist_exception\nFolderId,folder_id\nFolderIds,folder_ids\nFolderList,folder_list\nFolderMember,folder_member\nFolderMemberList,folder_member_list\nFolderMetadata,folder_metadata\nFolderPath,folder_path\nFolderSearchFilter,folder_search_filter\nFolderSummary,folder_summary\nFolderSummaryList,folder_summary_list\nFolderType,folder_type\nFolders,folders\nFollowInputIndex,follow_input_index\nFollowModeScheduleActionStartSettings,follow_mode_schedule_action_start_settings\nFollowPoint,follow_point\nFollowUpPrompt,follow_up_prompt\nFont,font\nFontColor,font_color\nFontConfiguration,font_configuration\nFontDecoration,font_decoration\nFontFamilies,font_families\nFontFamily,font_family\nFontOpacity,font_opacity\nFontResolution,font_resolution\nFontScript,font_script\nFontSize,font_size\nFontStack,font_stack\nFontStyle,font_style\nFontUnicodeRange,font_unicode_range\nFontWeight,font_weight\nFooterSections,footer_sections\nForbiddenException,forbidden_exception\nForce,force\nForceAliasCreation,force_alias_creation\nForceAssociate,force_associate\nForceCreateJobs,force_create_jobs\nForceDelete,force_delete\nForceDeleteWithoutRecovery,force_delete_without_recovery\nForceDetach,force_detach\nForceFailover,force_failover\nForceFieldPictures,force_field_pictures\nForceIncludeRenditionSize,force_include_rendition_size\nForceIncludeRenditions,force_include_renditions\nForceLobLookup,force_lob_lookup\nForceMove,force_move\nForceOverwriteReplicaSecret,force_overwrite_replica_secret\nForcePlannedFailover,force_planned_failover\nForceTerminate,force_terminate\nForceTsVideoEbpOrder,force_ts_video_ebp_order\nForceUnsubscribeAll,force_unsubscribe_all\nForceUpdate,force_update\nForceUpgradeDate,force_upgrade_date\nForcedApplyDate,forced_apply_date\nForecast,forecast\nForecastArn,forecast_arn\nForecastComputation,forecast_computation\nForecastConfiguration,forecast_configuration\nForecastConfigurations,forecast_configurations\nForecastDataType,forecast_data_type\nForecastDimensions,forecast_dimensions\nForecastExportJobArn,forecast_export_job_arn\nForecastExportJobName,forecast_export_job_name\nForecastExportJobSummary,forecast_export_job_summary\nForecastExportJobs,forecast_export_jobs\nForecastFrequency,forecast_frequency\nForecastHorizon,forecast_horizon\nForecastName,forecast_name\nForecastProperties,forecast_properties\nForecastQuantiles,forecast_quantiles\nForecastResult,forecast_result\nForecastResultsByTime,forecast_results_by_time\nForecastScenario,forecast_scenario\nForecastStatistics,forecast_statistics\nForecastSummary,forecast_summary\nForecastType,forecast_type\nForecastTypes,forecast_types\nForecastedLifetime,forecasted_lifetime\nForecastedSpend,forecasted_spend\nForecasts,forecasts\nForeground,foreground\nForegroundColor,foreground_color\nForgetDeviceRequest,forget_device_request\nForgetSmartHomeAppliancesRequest,forget_smart_home_appliances_request\nForgotPassword,forgot_password\nForgotPasswordLink,forgot_password_link\nForgotPasswordRequest,forgot_password_request\nForgotPasswordResponse,forgot_password_response\nForm,form\nFormBindingElement,form_binding_element\nFormButton,form_button\nFormCTA,form_cta\nFormDataTypeConfig,form_data_type_config\nFormInputBindingPropertiesValue,form_input_binding_properties_value\nFormInputBindingPropertiesValueProperties,form_input_binding_properties_value_properties\nFormInputValueProperty,form_input_value_property\nFormInputValuePropertyBindingProperties,form_input_value_property_binding_properties\nFormStyle,form_style\nFormSummary,form_summary\nFormality,formality\nFormat,format\nFormatConfig,format_config\nFormatConfiguration,format_configuration\nFormatOptions,format_options\nFormatText,format_text\nFormatType,format_type\nFormatVersion,format_version\nFormats,formats\nFormatted,formatted\nForward,forward\nForwardAction,forward_action\nForwardActionConfig,forward_action_config\nForwardConfig,forward_config\nForwardPath,forward_path\nForwardPathComponents,forward_path_components\nForwardWhenContentTypeIsUnknown,forward_when_content_type_is_unknown\nForwardWhenQueryArgProfileIsUnknown,forward_when_query_arg_profile_is_unknown\nForwardedIP,forwarded_ip\nForwardedIPConfig,forwarded_ip_config\nForwardedValues,forwarded_values\nForwardingAddressId,forwarding_address_id\nForwardingConfig,forwarding_config\nForwardingEnabled,forwarding_enabled\nFoundByItems,found_by_items\nFoundByKeyValue,found_by_key_value\nFoundationModelDetails,foundation_model_details\nFoundationModelSummary,foundation_model_summary\nFpgaDeviceInfo,fpga_device_info\nFpgaDeviceMemoryInfo,fpga_device_memory_info\nFpgaImage,fpga_image\nFpgaImageAttribute,fpga_image_attribute\nFpgaImageGlobalId,fpga_image_global_id\nFpgaImageId,fpga_image_id\nFpgaImageIds,fpga_image_ids\nFpgaImageState,fpga_image_state\nFpgaImages,fpga_images\nFpgaInfo,fpga_info\nFpgas,fpgas\nFqdn,fqdn\nFractionDigits,fraction_digits\nFragment,fragment\nFragmentIntervalMS,fragment_interval_ms\nFragmentLength,fragment_length\nFragmentLengthControl,fragment_length_control\nFragmentLengthInMilliseconds,fragment_length_in_milliseconds\nFragmentNumber,fragment_number\nFragmentSelector,fragment_selector\nFragmentSelectorType,fragment_selector_type\nFragmentSizeBytes,fragment_size_bytes\nFragmentSizeInBytes,fragment_size_in_bytes\nFragmentTime,fragment_time\nFragments,fragments\nFrameCaptureCdnSettings,frame_capture_cdn_settings\nFrameCaptureGroupSettings,frame_capture_group_settings\nFrameCaptureHlsSettings,frame_capture_hls_settings\nFrameCaptureOutputSettings,frame_capture_output_settings\nFrameCaptureS3Settings,frame_capture_s3_settings\nFrameCaptureSettings,frame_capture_settings\nFrameHeight,frame_height\nFrameMetric,frame_metric\nFrameMetricDatum,frame_metric_datum\nFrameOption,frame_option\nFrameOptions,frame_options\nFrameRate,frame_rate\nFrameWidth,frame_width\nFramerate,framerate\nFramerateControl,framerate_control\nFramerateConversionAlgorithm,framerate_conversion_algorithm\nFramerateDenominator,framerate_denominator\nFramerateNumerator,framerate_numerator\nFramework,framework\nFrameworkArn,framework_arn\nFrameworkArns,framework_arns\nFrameworkAttributes,framework_attributes\nFrameworkConfiguration,framework_configuration\nFrameworkControl,framework_control\nFrameworkControls,framework_controls\nFrameworkDescription,framework_description\nFrameworkMetadata,framework_metadata\nFrameworkName,framework_name\nFrameworkStatus,framework_status\nFrameworkTags,framework_tags\nFrameworkVersion,framework_version\nFrameworks,frameworks\nFraudDetectionAction,fraud_detection_action\nFraudDetectionConfig,fraud_detection_config\nFraudDetectionConfiguration,fraud_detection_configuration\nFraudDetectionResult,fraud_detection_result\nFraudDetectionResultId,fraud_detection_result_id\nFraudRiskDetails,fraud_risk_details\nFraudster,fraudster\nFraudsterId,fraudster_id\nFraudsterRegistrationJob,fraudster_registration_job\nFraudsterRegistrationJobSummary,fraudster_registration_job_summary\nFraudsterSimilarityThreshold,fraudster_similarity_threshold\nFraudsterSummaries,fraudster_summaries\nFraudsterSummary,fraudster_summary\nFreeForm,free_form\nFreeFormLayout,free_form_layout\nFreeFormLayoutCanvasSizeOptions,free_form_layout_canvas_size_options\nFreeFormLayoutConfiguration,free_form_layout_configuration\nFreeFormLayoutElement,free_form_layout_element\nFreeFormLayoutElementBackgroundStyle,free_form_layout_element_background_style\nFreeFormLayoutElementBorderStyle,free_form_layout_element_border_style\nFreeFormLayoutScreenCanvasSizeOptions,free_form_layout_screen_canvas_size_options\nFreeFormSectionLayoutConfiguration,free_form_section_layout_configuration\nFreeSpaceBox,free_space_box\nFreeTier,free_tier\nFreeTierConfig,free_tier_config\nFreeTierEligible,free_tier_eligible\nFreeTrialAccountInfo,free_trial_account_info\nFreeTrialDaysRemaining,free_trial_days_remaining\nFreeTrialFeatureConfigurationResult,free_trial_feature_configuration_result\nFreeTrialInfo,free_trial_info\nFreeTrialInfoError,free_trial_info_error\nFreeUntil,free_until\nFrequencies,frequencies\nFrequency,frequency\nFrequencyBandwidth,frequency_bandwidth\nFreshStartDate,fresh_start_date\nFreshness,freshness\nFriday,friday\nFriendlyDeviceName,friendly_device_name\nFriendlyName,friendly_name\nFrom,from\nFromAddress,from_address\nFromArn,from_arn\nFromDate,from_date\nFromDbClusterArn,from_db_cluster_arn\nFromEmailAddress,from_email_address\nFromEmailAddressIdentityArn,from_email_address_identity_arn\nFromEmailAddressNotVerifiedException,from_email_address_not_verified_exception\nFromFederationSource,from_federation_source\nFromInclusive,from_inclusive\nFromPath,from_path\nFromPhoneNumber,from_phone_number\nFromPort,from_port\nFromTime,from_time\nFromTimeStamp,from_time_stamp\nFromType,from_type\nFromValue,from_value\nFsxAdminPassword,fsx_admin_password\nFsxConfiguration,fsx_configuration\nFsxFilesystemArn,fsx_filesystem_arn\nFsxProtocol,fsx_protocol\nFsxProtocolNfs,fsx_protocol_nfs\nFsxProtocolSmb,fsx_protocol_smb\nFsxStorageConfiguration,fsx_storage_configuration\nFulfilledCapacity,fulfilled_capacity\nFulfilledOnDemandCapacity,fulfilled_on_demand_capacity\nFulfillmentActivity,fulfillment_activity\nFulfillmentCodeHookSettings,fulfillment_code_hook_settings\nFulfillmentStartResponseSpecification,fulfillment_start_response_specification\nFulfillmentUpdateResponseSpecification,fulfillment_update_response_specification\nFulfillmentUpdatesSpecification,fulfillment_updates_specification\nFullDocument,full_document\nFullLoadCondtnlChkFailedRows,full_load_condtnl_chk_failed_rows\nFullLoadEndTime,full_load_end_time\nFullLoadErrorPercentage,full_load_error_percentage\nFullLoadErrorRows,full_load_error_rows\nFullLoadFinishDate,full_load_finish_date\nFullLoadProgressPercent,full_load_progress_percent\nFullLoadReloaded,full_load_reloaded\nFullLoadRows,full_load_rows\nFullLoadStartDate,full_load_start_date\nFullLoadStartTime,full_load_start_time\nFullName,full_name\nFullyQualifiedCNAME,fully_qualified_cname\nFullyQualifiedDomainName,fully_qualified_domain_name\nFunction,function\nFunctionARN,function_arn\nFunctionAlreadyExists,function_already_exists\nFunctionArn,function_arn\nFunctionArns,function_arns\nFunctionArtifactMeta,function_artifact_meta\nFunctionAssociation,function_association\nFunctionAssociations,function_associations\nFunctionCode,function_code\nFunctionCodeLocation,function_code_location\nFunctionConfig,function_config\nFunctionConfiguration,function_configuration\nFunctionConfigurationEnvironment,function_configuration_environment\nFunctionCount,function_count\nFunctionDefaultConfig,function_default_config\nFunctionDefaultExecutionConfig,function_default_execution_config\nFunctionDefinitionId,function_definition_id\nFunctionDefinitionVersion,function_definition_version\nFunctionDefinitionVersionArn,function_definition_version_arn\nFunctionDefinitionVersionId,function_definition_version_id\nFunctionError,function_error\nFunctionErrorMessage,function_error_message\nFunctionEventInvokeConfig,function_event_invoke_config\nFunctionEventInvokeConfigs,function_event_invoke_configs\nFunctionExecutionConfig,function_execution_config\nFunctionExecutionLogs,function_execution_logs\nFunctionInUse,function_in_use\nFunctionInput,function_input\nFunctionList,function_list\nFunctionMetadata,function_metadata\nFunctionName,function_name\nFunctionOutput,function_output\nFunctionPayload,function_payload\nFunctionRequest,function_request\nFunctionResponse,function_response\nFunctionResponseTypes,function_response_types\nFunctionRunAsConfig,function_run_as_config\nFunctionRuntimeOverride,function_runtime_override\nFunctionSizeLimitExceeded,function_size_limit_exceeded\nFunctionSummary,function_summary\nFunctionUrl,function_url\nFunctionUrlAuthType,function_url_auth_type\nFunctionUrlConfig,function_url_config\nFunctionUrlConfigs,function_url_configs\nFunctionVersion,function_version\nFunctions,functions\nFunnelChartAggregatedFieldWells,funnel_chart_aggregated_field_wells\nFunnelChartConfiguration,funnel_chart_configuration\nFunnelChartDataLabelOptions,funnel_chart_data_label_options\nFunnelChartFieldWells,funnel_chart_field_wells\nFunnelChartSortConfiguration,funnel_chart_sort_configuration\nFunnelChartVisual,funnel_chart_visual\nFuota,fuota\nFuotaDeviceStatus,fuota_device_status\nFuotaTask,fuota_task\nFuotaTaskId,fuota_task_id\nFuotaTaskList,fuota_task_list\nFuzzyMatching,fuzzy_matching\nGATING,gating\nGCM,gcm\nGCMChannelRequest,gcm_channel_request\nGCMChannelResponse,gcm_channel_response\nGCMMessage,gcm_message\nGE,ge\nGPSCoordinates,gps_coordinates\nGPSPoint,gps_point\nGPSPointDimension,gps_point_dimension\nGSTIN,gstin\nGT,gt\nGain,gain\nGame,game\nGameConfiguration,game_configuration\nGameConfigurationDetails,game_configuration_details\nGameDetails,game_details\nGameKey,game_key\nGameLiftAwsAccountId,game_lift_aws_account_id\nGameLiftServiceSdkEndpoint,game_lift_service_sdk_endpoint\nGameLiftVpcId,game_lift_vpc_id\nGameName,game_name\nGameProperties,game_properties\nGameProperty,game_property\nGameSdkVersion,game_sdk_version\nGameServer,game_server\nGameServerData,game_server_data\nGameServerGroup,game_server_group\nGameServerGroupArn,game_server_group_arn\nGameServerGroupAutoScalingPolicy,game_server_group_auto_scaling_policy\nGameServerGroupName,game_server_group_name\nGameServerGroups,game_server_groups\nGameServerId,game_server_id\nGameServerInstance,game_server_instance\nGameServerInstances,game_server_instances\nGameServerProtectionPolicy,game_server_protection_policy\nGameServers,game_servers\nGameSession,game_session\nGameSessionActivationTimeoutSeconds,game_session_activation_timeout_seconds\nGameSessionArn,game_session_arn\nGameSessionConnectionInfo,game_session_connection_info\nGameSessionData,game_session_data\nGameSessionDetail,game_session_detail\nGameSessionDetails,game_session_details\nGameSessionFullException,game_session_full_exception\nGameSessionId,game_session_id\nGameSessionName,game_session_name\nGameSessionPlacement,game_session_placement\nGameSessionQueue,game_session_queue\nGameSessionQueueArn,game_session_queue_arn\nGameSessionQueueArns,game_session_queue_arns\nGameSessionQueueDestination,game_session_queue_destination\nGameSessionQueueName,game_session_queue_name\nGameSessionQueues,game_session_queues\nGameSessionRegion,game_session_region\nGameSessions,game_sessions\nGameSummary,game_summary\nGames,games\nGateway,gateway\nGatewayARN,gateway_arn\nGatewayAdmins,gateway_admins\nGatewayArn,gateway_arn\nGatewayAssociationState,gateway_association_state\nGatewayBridgeSource,gateway_bridge_source\nGatewayCapabilitySummary,gateway_capability_summary\nGatewayCapacity,gateway_capacity\nGatewayDetails,gateway_details\nGatewayDisplayName,gateway_display_name\nGatewayEui,gateway_eui\nGatewayEuiEventTopic,gateway_eui_event_topic\nGatewayGroup,gateway_group\nGatewayGroupArn,gateway_group_arn\nGatewayGroupSummary,gateway_group_summary\nGatewayGroups,gateway_groups\nGatewayId,gateway_id\nGatewayInfo,gateway_info\nGatewayInstance,gateway_instance\nGatewayInstanceArn,gateway_instance_arn\nGatewayList,gateway_list\nGatewayListItem,gateway_list_item\nGatewayLoadBalancerArns,gateway_load_balancer_arns\nGatewayLoadBalancerEndpointId,gateway_load_balancer_endpoint_id\nGatewayMessages,gateway_messages\nGatewayName,gateway_name\nGatewayNetwork,gateway_network\nGatewayNetworkInterfaces,gateway_network_interfaces\nGatewayOperationalState,gateway_operational_state\nGatewayPlatform,gateway_platform\nGatewayRegion,gateway_region\nGatewayResponse,gateway_response\nGatewayResponses,gateway_responses\nGatewayRouteData,gateway_route_data\nGatewayRouteHostnameMatch,gateway_route_hostname_match\nGatewayRouteHostnameRewrite,gateway_route_hostname_rewrite\nGatewayRouteRef,gateway_route_ref\nGatewayRouteSpec,gateway_route_spec\nGatewayRouteStatus,gateway_route_status\nGatewayRouteTarget,gateway_route_target\nGatewayRouteVirtualService,gateway_route_virtual_service\nGatewayState,gateway_state\nGatewaySummary,gateway_summary\nGatewayTimeoutException,gateway_timeout_exception\nGatewayTimezone,gateway_timezone\nGatewayType,gateway_type\nGateways,gateways\nGatingControls,gating_controls\nGatingRule,gating_rule\nGatingRuleUpdate,gating_rule_update\nGaugeChartArcConditionalFormatting,gauge_chart_arc_conditional_formatting\nGaugeChartConditionalFormatting,gauge_chart_conditional_formatting\nGaugeChartConditionalFormattingOption,gauge_chart_conditional_formatting_option\nGaugeChartConfiguration,gauge_chart_configuration\nGaugeChartFieldWells,gauge_chart_field_wells\nGaugeChartOptions,gauge_chart_options\nGaugeChartPrimaryValueConditionalFormatting,gauge_chart_primary_value_conditional_formatting\nGaugeChartVisual,gauge_chart_visual\nGcpMySQLSettings,gcp_my_sql_settings\nGdgAttributes,gdg_attributes\nGdgDetailAttributes,gdg_detail_attributes\nGenAppKey,gen_app_key\nGender,gender\nGenderString,gender_string\nGeneral,general\nGeneralFlags,general_flags\nGeneralFlagsV2,general_flags_v2\nGeneralFlagsV3,general_flags_v3\nGeneralFlagsV4,general_flags_v4\nGeneralLabels,general_labels\nGeneralLabelsSettings,general_labels_settings\nGeneralLogGroup,general_log_group\nGeneralName,general_name\nGeneralServiceException,general_service_exception\nGenerate,generate\nGenerateAccessLogsRequest,generate_access_logs_request\nGenerateAccessLogsResult,generate_access_logs_result\nGenerateBackendAPIModelsRequest,generate_backend_api_models_request\nGenerateBackendAPIModelsResponse,generate_backend_api_models_response\nGenerateCandidateDefinitionsOnly,generate_candidate_definitions_only\nGenerateCardValidationDataInput,generate_card_validation_data_input\nGenerateCardValidationDataOutput,generate_card_validation_data_output\nGenerateChangeSetRequest,generate_change_set_request\nGenerateChangeSetResponse,generate_change_set_response\nGenerateClientCertificateRequest,generate_client_certificate_request\nGenerateCredentialReportResponse,generate_credential_report_response\nGenerateDataKeyPairRequest,generate_data_key_pair_request\nGenerateDataKeyPairResponse,generate_data_key_pair_response\nGenerateDataKeyPairWithoutPlaintextRequest,generate_data_key_pair_without_plaintext_request\nGenerateDataKeyPairWithoutPlaintextResponse,generate_data_key_pair_without_plaintext_response\nGenerateDataKeyRequest,generate_data_key_request\nGenerateDataKeyResponse,generate_data_key_response\nGenerateDataKeyWithoutPlaintextRequest,generate_data_key_without_plaintext_request\nGenerateDataKeyWithoutPlaintextResponse,generate_data_key_without_plaintext_response\nGenerateDataSetRequest,generate_data_set_request\nGenerateDataSetResult,generate_data_set_result\nGenerateEmbedUrlForAnonymousUserRequest,generate_embed_url_for_anonymous_user_request\nGenerateEmbedUrlForAnonymousUserResponse,generate_embed_url_for_anonymous_user_response\nGenerateEmbedUrlForRegisteredUserRequest,generate_embed_url_for_registered_user_request\nGenerateEmbedUrlForRegisteredUserResponse,generate_embed_url_for_registered_user_response\nGenerateInferenceId,generate_inference_id\nGenerateMacInput,generate_mac_input\nGenerateMacOutput,generate_mac_output\nGenerateMacRequest,generate_mac_request\nGenerateMacResponse,generate_mac_response\nGenerateMobileSdkReleaseUrlRequest,generate_mobile_sdk_release_url_request\nGenerateMobileSdkReleaseUrlResponse,generate_mobile_sdk_release_url_response\nGenerateOrganizationsAccessReportRequest,generate_organizations_access_report_request\nGenerateOrganizationsAccessReportResponse,generate_organizations_access_report_response\nGeneratePinDataInput,generate_pin_data_input\nGeneratePinDataOutput,generate_pin_data_output\nGenerateRandomRequest,generate_random_request\nGenerateRandomResponse,generate_random_response\nGenerateRecommendationsRequest,generate_recommendations_request\nGenerateSecret,generate_secret\nGenerateServiceLastAccessedDetailsRequest,generate_service_last_accessed_details_request\nGenerateServiceLastAccessedDetailsResponse,generate_service_last_accessed_details_response\nGenerateTemplateRequest,generate_template_request\nGenerateTemplateResponse,generate_template_response\nGeneratedBy,generated_by\nGeneratedCodeJob,generated_code_job\nGeneratedCodeJobDetails,generated_code_job_details\nGeneratedCodeJobId,generated_code_job_id\nGeneratedCodeJobs,generated_code_jobs\nGeneratedFraudsterId,generated_fraudster_id\nGeneratedManifestDescriptor,generated_manifest_descriptor\nGeneratedManifestEncryption,generated_manifest_encryption\nGeneratedPolicy,generated_policy\nGeneratedPolicyProperties,generated_policy_properties\nGeneratedPolicyResult,generated_policy_result\nGeneratedPrefixLocation,generated_prefix_location\nGeneratedRulesType,generated_rules_type\nGeneratedSpeakerId,generated_speaker_id\nGeneratedTime,generated_time\nGenerationAttributes,generation_attributes\nGenerationCompletionTime,generation_completion_time\nGenerationExistsException,generation_exists_exception\nGenerationKeyArn,generation_key_arn\nGenerationKeyCheckValue,generation_key_check_value\nGenerationKeyIdentifier,generation_key_identifier\nGenerationQualifier,generation_qualifier\nGenerationStartedTime,generation_started_time\nGenerationStatus,generation_status\nGenerationSummary,generation_summary\nGenerationSummaryList,generation_summary_list\nGenerationTimestamp,generation_timestamp\nGenerator,generator\nGeneratorDetails,generator_details\nGeneratorId,generator_id\nGenericAttachment,generic_attachment\nGenericKeywords,generic_keywords\nGenericRevisionInfo,generic_revision_info\nGeoJsonPayload,geo_json_payload\nGeoLocation,geo_location\nGeoLocationDetails,geo_location_details\nGeoLocationDetailsList,geo_location_details_list\nGeoMatchConstraint,geo_match_constraint\nGeoMatchConstraints,geo_match_constraints\nGeoMatchLevel,geo_match_level\nGeoMatchParams,geo_match_params\nGeoMatchSet,geo_match_set\nGeoMatchSetId,geo_match_set_id\nGeoMatchSetSummary,geo_match_set_summary\nGeoMatchSetUpdate,geo_match_set_update\nGeoMatchSets,geo_match_sets\nGeoMatchStatement,geo_match_statement\nGeoMosaicConfigInput,geo_mosaic_config_input\nGeoRestriction,geo_restriction\nGeoSpatialColumnGroup,geo_spatial_column_group\nGeofenceGeometry,geofence_geometry\nGeofenceId,geofence_id\nGeofenceIds,geofence_ids\nGeofenceProperties,geofence_properties\nGeographicRole,geographic_role\nGeolocationFormat,geolocation_format\nGeometry,geometry\nGeometryOffset,geometry_offset\nGeospatial,geospatial\nGeospatialCoordinateBounds,geospatial_coordinate_bounds\nGeospatialHeatmapColorScale,geospatial_heatmap_color_scale\nGeospatialHeatmapConfiguration,geospatial_heatmap_configuration\nGeospatialHeatmapDataColor,geospatial_heatmap_data_color\nGeospatialMapAggregatedFieldWells,geospatial_map_aggregated_field_wells\nGeospatialMapConfiguration,geospatial_map_configuration\nGeospatialMapFieldWells,geospatial_map_field_wells\nGeospatialMapStyleOptions,geospatial_map_style_options\nGeospatialMapVisual,geospatial_map_visual\nGeospatialPointStyleOptions,geospatial_point_style_options\nGeospatialWindowOptions,geospatial_window_options\nGeranCid,geran_cid\nGet,get\nGetAWSDefaultServiceQuotaRequest,get_aws_default_service_quota_request\nGetAWSDefaultServiceQuotaResponse,get_aws_default_service_quota_response\nGetAWSOrganizationsAccessStatusOutput,get_aws_organizations_access_status_output\nGetAccessControlEffectRequest,get_access_control_effect_request\nGetAccessControlEffectResponse,get_access_control_effect_response\nGetAccessKeyInfoRequest,get_access_key_info_request\nGetAccessKeyInfoResponse,get_access_key_info_response\nGetAccessKeyLastUsedRequest,get_access_key_last_used_request\nGetAccessKeyLastUsedResponse,get_access_key_last_used_response\nGetAccessLogSubscriptionRequest,get_access_log_subscription_request\nGetAccessLogSubscriptionResponse,get_access_log_subscription_response\nGetAccessPointConfigurationForObjectLambdaRequest,get_access_point_configuration_for_object_lambda_request\nGetAccessPointConfigurationForObjectLambdaResult,get_access_point_configuration_for_object_lambda_result\nGetAccessPointForObjectLambdaRequest,get_access_point_for_object_lambda_request\nGetAccessPointForObjectLambdaResult,get_access_point_for_object_lambda_result\nGetAccessPointPolicyForObjectLambdaRequest,get_access_point_policy_for_object_lambda_request\nGetAccessPointPolicyForObjectLambdaResult,get_access_point_policy_for_object_lambda_result\nGetAccessPointPolicyRequest,get_access_point_policy_request\nGetAccessPointPolicyResult,get_access_point_policy_result\nGetAccessPointPolicyStatusForObjectLambdaRequest,get_access_point_policy_status_for_object_lambda_request\nGetAccessPointPolicyStatusForObjectLambdaResult,get_access_point_policy_status_for_object_lambda_result\nGetAccessPointPolicyStatusRequest,get_access_point_policy_status_request\nGetAccessPointPolicyStatusResult,get_access_point_policy_status_result\nGetAccessPointRequest,get_access_point_request\nGetAccessPointResult,get_access_point_result\nGetAccessPolicyRequest,get_access_policy_request\nGetAccessPolicyResponse,get_access_policy_response\nGetAccessPreviewRequest,get_access_preview_request\nGetAccessPreviewResponse,get_access_preview_response\nGetAccessTokenRequest,get_access_token_request\nGetAccessTokenResponse,get_access_token_response\nGetAccessorInput,get_accessor_input\nGetAccessorOutput,get_accessor_output\nGetAccountAliasResult,get_account_alias_result\nGetAccountAuthorizationDetailsRequest,get_account_authorization_details_request\nGetAccountAuthorizationDetailsResponse,get_account_authorization_details_response\nGetAccountBalanceResponse,get_account_balance_response\nGetAccountConfigurationResponse,get_account_configuration_response\nGetAccountLimitRequest,get_account_limit_request\nGetAccountLimitResponse,get_account_limit_response\nGetAccountPasswordPolicyResponse,get_account_password_policy_response\nGetAccountRequest,get_account_request\nGetAccountResponse,get_account_response\nGetAccountSendingEnabledResponse,get_account_sending_enabled_response\nGetAccountSettingsOutput,get_account_settings_output\nGetAccountSettingsRequest,get_account_settings_request\nGetAccountSettingsResponse,get_account_settings_response\nGetAccountSettingsResult,get_account_settings_result\nGetAccountStatusResponse,get_account_status_response\nGetAccountSummaryResponse,get_account_summary_response\nGetAccuracyMetricsRequest,get_accuracy_metrics_request\nGetAccuracyMetricsResponse,get_accuracy_metrics_response\nGetActionRequest,get_action_request\nGetActionResponse,get_action_response\nGetActionTypeInput,get_action_type_input\nGetActionTypeOutput,get_action_type_output\nGetActiveNamesRequest,get_active_names_request\nGetActiveNamesResult,get_active_names_result\nGetActivityTaskInput,get_activity_task_input\nGetActivityTaskOutput,get_activity_task_output\nGetAddressBookRequest,get_address_book_request\nGetAddressBookResponse,get_address_book_response\nGetAdmChannelRequest,get_adm_channel_request\nGetAdmChannelResponse,get_adm_channel_response\nGetAdminAccountResponse,get_admin_account_response\nGetAdminScopeRequest,get_admin_scope_request\nGetAdminScopeResponse,get_admin_scope_response\nGetAdministratorAccountRequest,get_administrator_account_request\nGetAdministratorAccountResponse,get_administrator_account_response\nGetAgentConfigurationRequest,get_agent_configuration_request\nGetAgentConfigurationResponse,get_agent_configuration_response\nGetAggregateComplianceDetailsByConfigRuleRequest,get_aggregate_compliance_details_by_config_rule_request\nGetAggregateComplianceDetailsByConfigRuleResponse,get_aggregate_compliance_details_by_config_rule_response\nGetAggregateConfigRuleComplianceSummaryRequest,get_aggregate_config_rule_compliance_summary_request\nGetAggregateConfigRuleComplianceSummaryResponse,get_aggregate_config_rule_compliance_summary_response\nGetAggregateConformancePackComplianceSummaryRequest,get_aggregate_conformance_pack_compliance_summary_request\nGetAggregateConformancePackComplianceSummaryResponse,get_aggregate_conformance_pack_compliance_summary_response\nGetAggregateDiscoveredResourceCountsRequest,get_aggregate_discovered_resource_counts_request\nGetAggregateDiscoveredResourceCountsResponse,get_aggregate_discovered_resource_counts_response\nGetAggregateResourceConfigRequest,get_aggregate_resource_config_request\nGetAggregateResourceConfigResponse,get_aggregate_resource_config_response\nGetAlarmsRequest,get_alarms_request\nGetAlarmsResult,get_alarms_result\nGetAliasInput,get_alias_input\nGetAliasOutput,get_alias_output\nGetAliasRequest,get_alias_request\nGetAllowListRequest,get_allow_list_request\nGetAllowListResponse,get_allow_list_response\nGetAlternateContactRequest,get_alternate_contact_request\nGetAlternateContactResponse,get_alternate_contact_response\nGetAnalysisTemplateInput,get_analysis_template_input\nGetAnalysisTemplateOutput,get_analysis_template_output\nGetAnalyzedResourceRequest,get_analyzed_resource_request\nGetAnalyzedResourceResponse,get_analyzed_resource_response\nGetAnalyzerRequest,get_analyzer_request\nGetAnalyzerResponse,get_analyzer_response\nGetAnnotationImportRequest,get_annotation_import_request\nGetAnnotationImportResponse,get_annotation_import_response\nGetAnnotationStoreRequest,get_annotation_store_request\nGetAnnotationStoreResponse,get_annotation_store_response\nGetAnnotationStoreVersionRequest,get_annotation_store_version_request\nGetAnnotationStoreVersionResponse,get_annotation_store_version_response\nGetAnomaliesRequest,get_anomalies_request\nGetAnomaliesResponse,get_anomalies_response\nGetAnomalyGroupRequest,get_anomaly_group_request\nGetAnomalyGroupResponse,get_anomaly_group_response\nGetAnomalyMonitorsRequest,get_anomaly_monitors_request\nGetAnomalyMonitorsResponse,get_anomaly_monitors_response\nGetAnomalySubscriptionsRequest,get_anomaly_subscriptions_request\nGetAnomalySubscriptionsResponse,get_anomaly_subscriptions_response\nGetAnswerInput,get_answer_input\nGetAnswerOutput,get_answer_output\nGetApiAssociationRequest,get_api_association_request\nGetApiAssociationResponse,get_api_association_response\nGetApiCacheRequest,get_api_cache_request\nGetApiCacheResponse,get_api_cache_response\nGetApiKeyRequest,get_api_key_request\nGetApiKeysRequest,get_api_keys_request\nGetApiMappingRequest,get_api_mapping_request\nGetApiMappingResponse,get_api_mapping_response\nGetApiMappingsRequest,get_api_mappings_request\nGetApiMappingsResponse,get_api_mappings_response\nGetApiRequest,get_api_request\nGetApiResponse,get_api_response\nGetApisRequest,get_apis_request\nGetApisResponse,get_apis_response\nGetApnsChannelRequest,get_apns_channel_request\nGetApnsChannelResponse,get_apns_channel_response\nGetApnsSandboxChannelRequest,get_apns_sandbox_channel_request\nGetApnsSandboxChannelResponse,get_apns_sandbox_channel_response\nGetApnsVoipChannelRequest,get_apns_voip_channel_request\nGetApnsVoipChannelResponse,get_apns_voip_channel_response\nGetApnsVoipSandboxChannelRequest,get_apns_voip_sandbox_channel_request\nGetApnsVoipSandboxChannelResponse,get_apns_voip_sandbox_channel_response\nGetAppAuthorizationRequest,get_app_authorization_request\nGetAppAuthorizationResponse,get_app_authorization_response\nGetAppBundleRequest,get_app_bundle_request\nGetAppBundleResponse,get_app_bundle_response\nGetAppInstanceRetentionSettingsRequest,get_app_instance_retention_settings_request\nGetAppInstanceRetentionSettingsResponse,get_app_instance_retention_settings_response\nGetAppInstanceStreamingConfigurationsRequest,get_app_instance_streaming_configurations_request\nGetAppInstanceStreamingConfigurationsResponse,get_app_instance_streaming_configurations_response\nGetAppLaunchConfigurationRequest,get_app_launch_configuration_request\nGetAppLaunchConfigurationResponse,get_app_launch_configuration_response\nGetAppMonitorDataRequest,get_app_monitor_data_request\nGetAppMonitorDataResponse,get_app_monitor_data_response\nGetAppMonitorRequest,get_app_monitor_request\nGetAppMonitorResponse,get_app_monitor_response\nGetAppReplicationConfigurationRequest,get_app_replication_configuration_request\nGetAppReplicationConfigurationResponse,get_app_replication_configuration_response\nGetAppRequest,get_app_request\nGetAppResponse,get_app_response\nGetAppResult,get_app_result\nGetAppValidationConfigurationRequest,get_app_validation_configuration_request\nGetAppValidationConfigurationResponse,get_app_validation_configuration_response\nGetAppValidationOutputRequest,get_app_validation_output_request\nGetAppValidationOutputResponse,get_app_validation_output_response\nGetApplicationComponentDetailsRequest,get_application_component_details_request\nGetApplicationComponentDetailsResponse,get_application_component_details_response\nGetApplicationComponentStrategiesRequest,get_application_component_strategies_request\nGetApplicationComponentStrategiesResponse,get_application_component_strategies_response\nGetApplicationDateRangeKpiRequest,get_application_date_range_kpi_request\nGetApplicationDateRangeKpiResponse,get_application_date_range_kpi_response\nGetApplicationInput,get_application_input\nGetApplicationOutput,get_application_output\nGetApplicationPolicyRequest,get_application_policy_request\nGetApplicationPolicyResponse,get_application_policy_response\nGetApplicationRequest,get_application_request\nGetApplicationResponse,get_application_response\nGetApplicationRevisionInput,get_application_revision_input\nGetApplicationRevisionOutput,get_application_revision_output\nGetApplicationSettingsRequest,get_application_settings_request\nGetApplicationSettingsResponse,get_application_settings_response\nGetApplicationVersionRequest,get_application_version_request\nGetApplicationVersionResponse,get_application_version_response\nGetAppliedSchemaVersionRequest,get_applied_schema_version_request\nGetAppliedSchemaVersionResponse,get_applied_schema_version_response\nGetApprovalRuleTemplateInput,get_approval_rule_template_input\nGetApprovalRuleTemplateOutput,get_approval_rule_template_output\nGetAppsListRequest,get_apps_list_request\nGetAppsListResponse,get_apps_list_response\nGetAppsRequest,get_apps_request\nGetAppsResponse,get_apps_response\nGetArchitectureRecommendationsRequest,get_architecture_recommendations_request\nGetArchitectureRecommendationsResponse,get_architecture_recommendations_response\nGetArchiveRuleRequest,get_archive_rule_request\nGetArchiveRuleResponse,get_archive_rule_response\nGetArtifactUrlRequest,get_artifact_url_request\nGetArtifactUrlResult,get_artifact_url_result\nGetAssessmentFrameworkRequest,get_assessment_framework_request\nGetAssessmentFrameworkResponse,get_assessment_framework_response\nGetAssessmentReportRequest,get_assessment_report_request\nGetAssessmentReportResponse,get_assessment_report_response\nGetAssessmentReportUrlRequest,get_assessment_report_url_request\nGetAssessmentReportUrlResponse,get_assessment_report_url_response\nGetAssessmentRequest,get_assessment_request\nGetAssessmentResponse,get_assessment_response\nGetAssetPropertyAggregatesRequest,get_asset_property_aggregates_request\nGetAssetPropertyAggregatesResponse,get_asset_property_aggregates_response\nGetAssetPropertyValueHistoryRequest,get_asset_property_value_history_request\nGetAssetPropertyValueHistoryResponse,get_asset_property_value_history_response\nGetAssetPropertyValueRequest,get_asset_property_value_request\nGetAssetPropertyValueResponse,get_asset_property_value_response\nGetAssetRequest,get_asset_request\nGetAssetResponse,get_asset_response\nGetAssignmentRequest,get_assignment_request\nGetAssignmentResponse,get_assignment_response\nGetAssistantAssociationRequest,get_assistant_association_request\nGetAssistantAssociationResponse,get_assistant_association_response\nGetAssistantRequest,get_assistant_request\nGetAssistantResponse,get_assistant_response\nGetAssociatedEnclaveCertificateIamRolesRequest,get_associated_enclave_certificate_iam_roles_request\nGetAssociatedEnclaveCertificateIamRolesResult,get_associated_enclave_certificate_iam_roles_result\nGetAssociatedIpv6PoolCidrsRequest,get_associated_ipv6_pool_cidrs_request\nGetAssociatedIpv6PoolCidrsResult,get_associated_ipv6_pool_cidrs_result\nGetAssociatedResourceRequest,get_associated_resource_request\nGetAssociatedResourceResponse,get_associated_resource_response\nGetAssociatedRoleRequest,get_associated_role_request\nGetAssociatedRoleResponse,get_associated_role_response\nGetAssociationForServiceQuotaTemplateResponse,get_association_for_service_quota_template_response\nGetAttachmentRequest,get_attachment_request\nGetAttachmentResponse,get_attachment_response\nGetAttendeeRequest,get_attendee_request\nGetAttendeeResponse,get_attendee_response\nGetAttributeGroupRequest,get_attribute_group_request\nGetAttributeGroupResponse,get_attribute_group_response\nGetAttributeValuesRequest,get_attribute_values_request\nGetAttributeValuesResponse,get_attribute_values_response\nGetAuthPolicyRequest,get_auth_policy_request\nGetAuthPolicyResponse,get_auth_policy_response\nGetAuthorizationTokenRequest,get_authorization_token_request\nGetAuthorizationTokenResponse,get_authorization_token_response\nGetAuthorizationTokenResult,get_authorization_token_result\nGetAuthorizerRequest,get_authorizer_request\nGetAuthorizerResponse,get_authorizer_response\nGetAuthorizersRequest,get_authorizers_request\nGetAuthorizersResponse,get_authorizers_response\nGetAutoMergingPreviewRequest,get_auto_merging_preview_request\nGetAutoMergingPreviewResponse,get_auto_merging_preview_response\nGetAutoScalingGroupRecommendationsRequest,get_auto_scaling_group_recommendations_request\nGetAutoScalingGroupRecommendationsResponse,get_auto_scaling_group_recommendations_response\nGetAutoSnapshotsRequest,get_auto_snapshots_request\nGetAutoSnapshotsResult,get_auto_snapshots_result\nGetAutoTerminationPolicyInput,get_auto_termination_policy_input\nGetAutoTerminationPolicyOutput,get_auto_termination_policy_output\nGetAutomatedDiscoveryConfigurationResponse,get_automated_discovery_configuration_response\nGetAutomationExecutionRequest,get_automation_execution_request\nGetAutomationExecutionResult,get_automation_execution_result\nGetAwsNetworkPerformanceDataRequest,get_aws_network_performance_data_request\nGetAwsNetworkPerformanceDataResult,get_aws_network_performance_data_result\nGetBackendAPIModelsRequest,get_backend_api_models_request\nGetBackendAPIModelsResponse,get_backend_api_models_response\nGetBackendAPIRequest,get_backend_api_request\nGetBackendAPIResponse,get_backend_api_response\nGetBackendAuthRequest,get_backend_auth_request\nGetBackendAuthResponse,get_backend_auth_response\nGetBackendEnvironmentRequest,get_backend_environment_request\nGetBackendEnvironmentResult,get_backend_environment_result\nGetBackendJobRequest,get_backend_job_request\nGetBackendJobResponse,get_backend_job_response\nGetBackendRequest,get_backend_request\nGetBackendResponse,get_backend_response\nGetBackendStorageRequest,get_backend_storage_request\nGetBackendStorageResourceConfig,get_backend_storage_resource_config\nGetBackendStorageResponse,get_backend_storage_response\nGetBackupPlanFromJSONInput,get_backup_plan_from_json_input\nGetBackupPlanFromJSONOutput,get_backup_plan_from_json_output\nGetBackupPlanFromTemplateInput,get_backup_plan_from_template_input\nGetBackupPlanFromTemplateOutput,get_backup_plan_from_template_output\nGetBackupPlanInput,get_backup_plan_input\nGetBackupPlanOutput,get_backup_plan_output\nGetBackupSelectionInput,get_backup_selection_input\nGetBackupSelectionOutput,get_backup_selection_output\nGetBackupVaultAccessPolicyInput,get_backup_vault_access_policy_input\nGetBackupVaultAccessPolicyOutput,get_backup_vault_access_policy_output\nGetBackupVaultNotificationsInput,get_backup_vault_notifications_input\nGetBackupVaultNotificationsOutput,get_backup_vault_notifications_output\nGetBaiduChannelRequest,get_baidu_channel_request\nGetBaiduChannelResponse,get_baidu_channel_response\nGetBandwidthRateLimitScheduleInput,get_bandwidth_rate_limit_schedule_input\nGetBandwidthRateLimitScheduleOutput,get_bandwidth_rate_limit_schedule_output\nGetBasePathMappingRequest,get_base_path_mapping_request\nGetBasePathMappingsRequest,get_base_path_mappings_request\nGetBatchImportJobsRequest,get_batch_import_jobs_request\nGetBatchImportJobsResult,get_batch_import_jobs_result\nGetBatchJobExecutionRequest,get_batch_job_execution_request\nGetBatchJobExecutionResponse,get_batch_job_execution_response\nGetBatchPredictionInput,get_batch_prediction_input\nGetBatchPredictionJobsRequest,get_batch_prediction_jobs_request\nGetBatchPredictionJobsResult,get_batch_prediction_jobs_result\nGetBatchPredictionOutput,get_batch_prediction_output\nGetBehaviorModelTrainingSummariesRequest,get_behavior_model_training_summaries_request\nGetBehaviorModelTrainingSummariesResponse,get_behavior_model_training_summaries_response\nGetBlacklistReportsRequest,get_blacklist_reports_request\nGetBlacklistReportsResponse,get_blacklist_reports_response\nGetBlobInput,get_blob_input\nGetBlobOutput,get_blob_output\nGetBlockPublicAccessConfigurationOutput,get_block_public_access_configuration_output\nGetBlockRequest,get_block_request\nGetBlockResponse,get_block_response\nGetBlueprintRequest,get_blueprint_request\nGetBlueprintResponse,get_blueprint_response\nGetBlueprintRunRequest,get_blueprint_run_request\nGetBlueprintRunResponse,get_blueprint_run_response\nGetBlueprintRunsRequest,get_blueprint_runs_request\nGetBlueprintRunsResponse,get_blueprint_runs_response\nGetBlueprintsRequest,get_blueprints_request\nGetBlueprintsResult,get_blueprints_result\nGetBootstrapBrokersRequest,get_bootstrap_brokers_request\nGetBootstrapBrokersResponse,get_bootstrap_brokers_response\nGetBotAliasRequest,get_bot_alias_request\nGetBotAliasResponse,get_bot_alias_response\nGetBotAliasesRequest,get_bot_aliases_request\nGetBotAliasesResponse,get_bot_aliases_response\nGetBotChannelAssociationRequest,get_bot_channel_association_request\nGetBotChannelAssociationResponse,get_bot_channel_association_response\nGetBotChannelAssociationsRequest,get_bot_channel_associations_request\nGetBotChannelAssociationsResponse,get_bot_channel_associations_response\nGetBotRequest,get_bot_request\nGetBotResponse,get_bot_response\nGetBotVersionsRequest,get_bot_versions_request\nGetBotVersionsResponse,get_bot_versions_response\nGetBotsRequest,get_bots_request\nGetBotsResponse,get_bots_response\nGetBranchInput,get_branch_input\nGetBranchOutput,get_branch_output\nGetBranchRequest,get_branch_request\nGetBranchResult,get_branch_result\nGetBrowserSettingsRequest,get_browser_settings_request\nGetBrowserSettingsResponse,get_browser_settings_response\nGetBucketAccelerateConfigurationOutput,get_bucket_accelerate_configuration_output\nGetBucketAccelerateConfigurationRequest,get_bucket_accelerate_configuration_request\nGetBucketAccessKeysRequest,get_bucket_access_keys_request\nGetBucketAccessKeysResult,get_bucket_access_keys_result\nGetBucketAclOutput,get_bucket_acl_output\nGetBucketAclRequest,get_bucket_acl_request\nGetBucketAnalyticsConfigurationOutput,get_bucket_analytics_configuration_output\nGetBucketAnalyticsConfigurationRequest,get_bucket_analytics_configuration_request\nGetBucketBundlesRequest,get_bucket_bundles_request\nGetBucketBundlesResult,get_bucket_bundles_result\nGetBucketCorsOutput,get_bucket_cors_output\nGetBucketCorsRequest,get_bucket_cors_request\nGetBucketEncryptionOutput,get_bucket_encryption_output\nGetBucketEncryptionRequest,get_bucket_encryption_request\nGetBucketIntelligentTieringConfigurationOutput,get_bucket_intelligent_tiering_configuration_output\nGetBucketIntelligentTieringConfigurationRequest,get_bucket_intelligent_tiering_configuration_request\nGetBucketInventoryConfigurationOutput,get_bucket_inventory_configuration_output\nGetBucketInventoryConfigurationRequest,get_bucket_inventory_configuration_request\nGetBucketLifecycleConfigurationOutput,get_bucket_lifecycle_configuration_output\nGetBucketLifecycleConfigurationRequest,get_bucket_lifecycle_configuration_request\nGetBucketLifecycleConfigurationResult,get_bucket_lifecycle_configuration_result\nGetBucketLocationOutput,get_bucket_location_output\nGetBucketLocationRequest,get_bucket_location_request\nGetBucketLoggingOutput,get_bucket_logging_output\nGetBucketLoggingRequest,get_bucket_logging_request\nGetBucketMetricDataRequest,get_bucket_metric_data_request\nGetBucketMetricDataResult,get_bucket_metric_data_result\nGetBucketMetricsConfigurationOutput,get_bucket_metrics_configuration_output\nGetBucketMetricsConfigurationRequest,get_bucket_metrics_configuration_request\nGetBucketNotificationConfigurationRequest,get_bucket_notification_configuration_request\nGetBucketOwnershipControlsOutput,get_bucket_ownership_controls_output\nGetBucketOwnershipControlsRequest,get_bucket_ownership_controls_request\nGetBucketPolicyOutput,get_bucket_policy_output\nGetBucketPolicyRequest,get_bucket_policy_request\nGetBucketPolicyResult,get_bucket_policy_result\nGetBucketPolicyStatusOutput,get_bucket_policy_status_output\nGetBucketPolicyStatusRequest,get_bucket_policy_status_request\nGetBucketReplicationOutput,get_bucket_replication_output\nGetBucketReplicationRequest,get_bucket_replication_request\nGetBucketReplicationResult,get_bucket_replication_result\nGetBucketRequest,get_bucket_request\nGetBucketRequestPaymentOutput,get_bucket_request_payment_output\nGetBucketRequestPaymentRequest,get_bucket_request_payment_request\nGetBucketResult,get_bucket_result\nGetBucketStatisticsRequest,get_bucket_statistics_request\nGetBucketStatisticsResponse,get_bucket_statistics_response\nGetBucketTaggingOutput,get_bucket_tagging_output\nGetBucketTaggingRequest,get_bucket_tagging_request\nGetBucketTaggingResult,get_bucket_tagging_result\nGetBucketVersioningOutput,get_bucket_versioning_output\nGetBucketVersioningRequest,get_bucket_versioning_request\nGetBucketVersioningResult,get_bucket_versioning_result\nGetBucketWebsiteOutput,get_bucket_website_output\nGetBucketWebsiteRequest,get_bucket_website_request\nGetBucketsAggregationRequest,get_buckets_aggregation_request\nGetBucketsAggregationResponse,get_buckets_aggregation_response\nGetBucketsRequest,get_buckets_request\nGetBucketsResult,get_buckets_result\nGetBuiltinIntentRequest,get_builtin_intent_request\nGetBuiltinIntentResponse,get_builtin_intent_response\nGetBuiltinIntentsRequest,get_builtin_intents_request\nGetBuiltinIntentsResponse,get_builtin_intents_response\nGetBuiltinSlotTypesRequest,get_builtin_slot_types_request\nGetBuiltinSlotTypesResponse,get_builtin_slot_types_response\nGetBulkDeploymentStatusRequest,get_bulk_deployment_status_request\nGetBulkDeploymentStatusResponse,get_bulk_deployment_status_response\nGetBulkPublishDetailsRequest,get_bulk_publish_details_request\nGetBulkPublishDetailsResponse,get_bulk_publish_details_response\nGetBundlesRequest,get_bundles_request\nGetBundlesResult,get_bundles_result\nGetByteMatchSetRequest,get_byte_match_set_request\nGetByteMatchSetResponse,get_byte_match_set_response\nGetCSVHeaderRequest,get_csv_header_request\nGetCSVHeaderResponse,get_csv_header_response\nGetCachePolicyConfigRequest,get_cache_policy_config_request\nGetCachePolicyConfigResult,get_cache_policy_config_result\nGetCachePolicyRequest,get_cache_policy_request\nGetCachePolicyResult,get_cache_policy_result\nGetCalculatedAttributeDefinitionRequest,get_calculated_attribute_definition_request\nGetCalculatedAttributeDefinitionResponse,get_calculated_attribute_definition_response\nGetCalculatedAttributeForProfileRequest,get_calculated_attribute_for_profile_request\nGetCalculatedAttributeForProfileResponse,get_calculated_attribute_for_profile_response\nGetCalculationExecutionCodeRequest,get_calculation_execution_code_request\nGetCalculationExecutionCodeResponse,get_calculation_execution_code_response\nGetCalculationExecutionRequest,get_calculation_execution_request\nGetCalculationExecutionResponse,get_calculation_execution_response\nGetCalculationExecutionStatusRequest,get_calculation_execution_status_request\nGetCalculationExecutionStatusResponse,get_calculation_execution_status_response\nGetCalendarStateRequest,get_calendar_state_request\nGetCalendarStateResponse,get_calendar_state_response\nGetCallAnalyticsCategoryRequest,get_call_analytics_category_request\nGetCallAnalyticsCategoryResponse,get_call_analytics_category_response\nGetCallAnalyticsJobRequest,get_call_analytics_job_request\nGetCallAnalyticsJobResponse,get_call_analytics_job_response\nGetCallerIdentityResponse,get_caller_identity_response\nGetCampaignActivitiesRequest,get_campaign_activities_request\nGetCampaignActivitiesResponse,get_campaign_activities_response\nGetCampaignDateRangeKpiRequest,get_campaign_date_range_kpi_request\nGetCampaignDateRangeKpiResponse,get_campaign_date_range_kpi_response\nGetCampaignRequest,get_campaign_request\nGetCampaignResponse,get_campaign_response\nGetCampaignStateBatchRequest,get_campaign_state_batch_request\nGetCampaignStateBatchResponse,get_campaign_state_batch_response\nGetCampaignStateRequest,get_campaign_state_request\nGetCampaignStateResponse,get_campaign_state_response\nGetCampaignVersionRequest,get_campaign_version_request\nGetCampaignVersionResponse,get_campaign_version_response\nGetCampaignVersionsRequest,get_campaign_versions_request\nGetCampaignVersionsResponse,get_campaign_versions_response\nGetCampaignsRequest,get_campaigns_request\nGetCampaignsResponse,get_campaigns_response\nGetCanaryRequest,get_canary_request\nGetCanaryResponse,get_canary_response\nGetCanaryRunsRequest,get_canary_runs_request\nGetCanaryRunsResponse,get_canary_runs_response\nGetCapacityAssignmentConfigurationInput,get_capacity_assignment_configuration_input\nGetCapacityAssignmentConfigurationOutput,get_capacity_assignment_configuration_output\nGetCapacityReservationInput,get_capacity_reservation_input\nGetCapacityReservationOutput,get_capacity_reservation_output\nGetCapacityReservationUsageRequest,get_capacity_reservation_usage_request\nGetCapacityReservationUsageResult,get_capacity_reservation_usage_result\nGetCardinalityRequest,get_cardinality_request\nGetCardinalityResponse,get_cardinality_response\nGetCaseEventConfigurationRequest,get_case_event_configuration_request\nGetCaseEventConfigurationResponse,get_case_event_configuration_response\nGetCaseRequest,get_case_request\nGetCaseResponse,get_case_response\nGetCatalogImportStatusRequest,get_catalog_import_status_request\nGetCatalogImportStatusResponse,get_catalog_import_status_response\nGetCatalogItemInput,get_catalog_item_input\nGetCatalogItemOutput,get_catalog_item_output\nGetCelebrityInfoRequest,get_celebrity_info_request\nGetCelebrityInfoResponse,get_celebrity_info_response\nGetCelebrityRecognitionRequest,get_celebrity_recognition_request\nGetCelebrityRecognitionResponse,get_celebrity_recognition_response\nGetCellReadinessSummaryRequest,get_cell_readiness_summary_request\nGetCellReadinessSummaryResponse,get_cell_readiness_summary_response\nGetCellRequest,get_cell_request\nGetCellResponse,get_cell_response\nGetCertificateAuthorityCertificateRequest,get_certificate_authority_certificate_request\nGetCertificateAuthorityCertificateResponse,get_certificate_authority_certificate_response\nGetCertificateAuthorityCsrRequest,get_certificate_authority_csr_request\nGetCertificateAuthorityCsrResponse,get_certificate_authority_csr_response\nGetCertificateRequest,get_certificate_request\nGetCertificateResponse,get_certificate_response\nGetCertificatesRequest,get_certificates_request\nGetCertificatesResult,get_certificates_result\nGetChangeLogsRequest,get_change_logs_request\nGetChangeLogsResponse,get_change_logs_response\nGetChangeRequest,get_change_request\nGetChangeResponse,get_change_response\nGetChangeTokenResponse,get_change_token_response\nGetChangeTokenStatusRequest,get_change_token_status_request\nGetChangeTokenStatusResponse,get_change_token_status_response\nGetChangesetRequest,get_changeset_request\nGetChangesetResponse,get_changeset_response\nGetChannelGroupRequest,get_channel_group_request\nGetChannelGroupResponse,get_channel_group_response\nGetChannelMembershipPreferencesRequest,get_channel_membership_preferences_request\nGetChannelMembershipPreferencesResponse,get_channel_membership_preferences_response\nGetChannelMessageRequest,get_channel_message_request\nGetChannelMessageResponse,get_channel_message_response\nGetChannelMessageStatusRequest,get_channel_message_status_request\nGetChannelMessageStatusResponse,get_channel_message_status_response\nGetChannelPolicyRequest,get_channel_policy_request\nGetChannelPolicyResponse,get_channel_policy_response\nGetChannelRequest,get_channel_request\nGetChannelResponse,get_channel_response\nGetChannelScheduleRequest,get_channel_schedule_request\nGetChannelScheduleResponse,get_channel_schedule_response\nGetChannelsRequest,get_channels_request\nGetChannelsResponse,get_channels_response\nGetCheckerIpRangesResponse,get_checker_ip_ranges_response\nGetChunkInput,get_chunk_input\nGetChunkOutput,get_chunk_output\nGetClassificationExportConfigurationResponse,get_classification_export_configuration_response\nGetClassificationScopeRequest,get_classification_scope_request\nGetClassificationScopeResponse,get_classification_scope_response\nGetClassifierRequest,get_classifier_request\nGetClassifierResponse,get_classifier_response\nGetClassifiersRequest,get_classifiers_request\nGetClassifiersResponse,get_classifiers_response\nGetClientCertificateRequest,get_client_certificate_request\nGetClientCertificatesRequest,get_client_certificates_request\nGetClipInput,get_clip_input\nGetClipOutput,get_clip_output\nGetCloudFormationStackRecordsRequest,get_cloud_formation_stack_records_request\nGetCloudFormationStackRecordsResult,get_cloud_formation_stack_records_result\nGetCloudFormationTemplateRequest,get_cloud_formation_template_request\nGetCloudFormationTemplateResponse,get_cloud_formation_template_response\nGetCloudFrontOriginAccessIdentityConfigRequest,get_cloud_front_origin_access_identity_config_request\nGetCloudFrontOriginAccessIdentityConfigResult,get_cloud_front_origin_access_identity_config_result\nGetCloudFrontOriginAccessIdentityRequest,get_cloud_front_origin_access_identity_request\nGetCloudFrontOriginAccessIdentityResult,get_cloud_front_origin_access_identity_result\nGetClusterCredentialsMessage,get_cluster_credentials_message\nGetClusterCredentialsWithIAMMessage,get_cluster_credentials_with_iam_message\nGetClusterInput,get_cluster_input\nGetClusterOutput,get_cluster_output\nGetClusterPolicyRequest,get_cluster_policy_request\nGetClusterPolicyResponse,get_cluster_policy_response\nGetClusterSessionCredentialsInput,get_cluster_session_credentials_input\nGetClusterSessionCredentialsOutput,get_cluster_session_credentials_output\nGetClusterSnapshotInput,get_cluster_snapshot_input\nGetClusterSnapshotOutput,get_cluster_snapshot_output\nGetCodeBindingSourceRequest,get_code_binding_source_request\nGetCodeBindingSourceResponse,get_code_binding_source_response\nGetCodeSigningConfigRequest,get_code_signing_config_request\nGetCodeSigningConfigResponse,get_code_signing_config_response\nGetCodegenJobRequest,get_codegen_job_request\nGetCodegenJobResponse,get_codegen_job_response\nGetCognitoEventsRequest,get_cognito_events_request\nGetCognitoEventsResponse,get_cognito_events_response\nGetCoipPoolUsageRequest,get_coip_pool_usage_request\nGetCoipPoolUsageResult,get_coip_pool_usage_result\nGetCollaborationAnalysisTemplateInput,get_collaboration_analysis_template_input\nGetCollaborationAnalysisTemplateOutput,get_collaboration_analysis_template_output\nGetCollaborationInput,get_collaboration_input\nGetCollaborationOutput,get_collaboration_output\nGetColumnStatisticsForPartitionRequest,get_column_statistics_for_partition_request\nGetColumnStatisticsForPartitionResponse,get_column_statistics_for_partition_response\nGetColumnStatisticsForTableRequest,get_column_statistics_for_table_request\nGetColumnStatisticsForTableResponse,get_column_statistics_for_table_response\nGetCommandInvocationRequest,get_command_invocation_request\nGetCommandInvocationResult,get_command_invocation_result\nGetCommentInput,get_comment_input\nGetCommentOutput,get_comment_output\nGetCommentReactionsInput,get_comment_reactions_input\nGetCommentReactionsOutput,get_comment_reactions_output\nGetCommentsForComparedCommitInput,get_comments_for_compared_commit_input\nGetCommentsForComparedCommitOutput,get_comments_for_compared_commit_output\nGetCommentsForPullRequestInput,get_comments_for_pull_request_input\nGetCommentsForPullRequestOutput,get_comments_for_pull_request_output\nGetCommitInput,get_commit_input\nGetCommitOutput,get_commit_output\nGetCompatibleElasticsearchVersionsRequest,get_compatible_elasticsearch_versions_request\nGetCompatibleElasticsearchVersionsResponse,get_compatible_elasticsearch_versions_response\nGetCompatibleKafkaVersionsRequest,get_compatible_kafka_versions_request\nGetCompatibleKafkaVersionsResponse,get_compatible_kafka_versions_response\nGetCompatibleVersionsRequest,get_compatible_versions_request\nGetCompatibleVersionsResponse,get_compatible_versions_response\nGetComplianceDetailRequest,get_compliance_detail_request\nGetComplianceDetailResponse,get_compliance_detail_response\nGetComplianceDetailsByConfigRuleRequest,get_compliance_details_by_config_rule_request\nGetComplianceDetailsByConfigRuleResponse,get_compliance_details_by_config_rule_response\nGetComplianceDetailsByResourceRequest,get_compliance_details_by_resource_request\nGetComplianceDetailsByResourceResponse,get_compliance_details_by_resource_response\nGetComplianceSummaryByConfigRuleResponse,get_compliance_summary_by_config_rule_response\nGetComplianceSummaryByResourceTypeRequest,get_compliance_summary_by_resource_type_request\nGetComplianceSummaryByResourceTypeResponse,get_compliance_summary_by_resource_type_response\nGetComplianceSummaryInput,get_compliance_summary_input\nGetComplianceSummaryOutput,get_compliance_summary_output\nGetComponentInput,get_component_input\nGetComponentOutput,get_component_output\nGetComponentPolicyRequest,get_component_policy_request\nGetComponentPolicyResponse,get_component_policy_response\nGetComponentRequest,get_component_request\nGetComponentResponse,get_component_response\nGetComponentTypeRequest,get_component_type_request\nGetComponentTypeResponse,get_component_type_response\nGetComponentVersionArtifactRequest,get_component_version_artifact_request\nGetComponentVersionArtifactResponse,get_component_version_artifact_response\nGetComputeAccessInput,get_compute_access_input\nGetComputeAccessOutput,get_compute_access_output\nGetComputeAuthTokenInput,get_compute_auth_token_input\nGetComputeAuthTokenOutput,get_compute_auth_token_output\nGetConferencePreferenceResponse,get_conference_preference_response\nGetConferenceProviderRequest,get_conference_provider_request\nGetConferenceProviderResponse,get_conference_provider_response\nGetConfigRequest,get_config_request\nGetConfigResponse,get_config_response\nGetConfigurationProfileRequest,get_configuration_profile_request\nGetConfigurationRequest,get_configuration_request\nGetConfigurationResponse,get_configuration_response\nGetConfigurationSetEventDestinationsRequest,get_configuration_set_event_destinations_request\nGetConfigurationSetEventDestinationsResponse,get_configuration_set_event_destinations_response\nGetConfigurationSetRequest,get_configuration_set_request\nGetConfigurationSetResponse,get_configuration_set_response\nGetConfiguredTableAnalysisRuleInput,get_configured_table_analysis_rule_input\nGetConfiguredTableAnalysisRuleOutput,get_configured_table_analysis_rule_output\nGetConfiguredTableAssociationInput,get_configured_table_association_input\nGetConfiguredTableAssociationOutput,get_configured_table_association_output\nGetConfiguredTableInput,get_configured_table_input\nGetConfiguredTableOutput,get_configured_table_output\nGetConformancePackComplianceDetailsRequest,get_conformance_pack_compliance_details_request\nGetConformancePackComplianceDetailsResponse,get_conformance_pack_compliance_details_response\nGetConformancePackComplianceSummaryRequest,get_conformance_pack_compliance_summary_request\nGetConformancePackComplianceSummaryResponse,get_conformance_pack_compliance_summary_response\nGetConnectAttachmentRequest,get_connect_attachment_request\nGetConnectAttachmentResponse,get_connect_attachment_response\nGetConnectInstanceConfigRequest,get_connect_instance_config_request\nGetConnectInstanceConfigResponse,get_connect_instance_config_response\nGetConnectPeerAssociationsRequest,get_connect_peer_associations_request\nGetConnectPeerAssociationsResponse,get_connect_peer_associations_response\nGetConnectPeerRequest,get_connect_peer_request\nGetConnectPeerResponse,get_connect_peer_response\nGetConnectionInput,get_connection_input\nGetConnectionOutput,get_connection_output\nGetConnectionRequest,get_connection_request\nGetConnectionResponse,get_connection_response\nGetConnectionStatusRequest,get_connection_status_request\nGetConnectionStatusResponse,get_connection_status_response\nGetConnectionsFilter,get_connections_filter\nGetConnectionsRequest,get_connections_request\nGetConnectionsResponse,get_connections_response\nGetConnectivityInfoRequest,get_connectivity_info_request\nGetConnectivityInfoResponse,get_connectivity_info_response\nGetConnectorDefinitionRequest,get_connector_definition_request\nGetConnectorDefinitionResponse,get_connector_definition_response\nGetConnectorDefinitionVersionRequest,get_connector_definition_version_request\nGetConnectorDefinitionVersionResponse,get_connector_definition_version_response\nGetConnectorRequest,get_connector_request\nGetConnectorResponse,get_connector_response\nGetConnectorsRequest,get_connectors_request\nGetConnectorsResponse,get_connectors_response\nGetConsoleOutputRequest,get_console_output_request\nGetConsoleOutputResult,get_console_output_result\nGetConsoleScreenshotRequest,get_console_screenshot_request\nGetConsoleScreenshotResult,get_console_screenshot_result\nGetConsolidatedReportInput,get_consolidated_report_input\nGetConsolidatedReportOutput,get_consolidated_report_output\nGetContactAttributesRequest,get_contact_attributes_request\nGetContactAttributesResponse,get_contact_attributes_response\nGetContactChannelRequest,get_contact_channel_request\nGetContactChannelResult,get_contact_channel_result\nGetContactInformationRequest,get_contact_information_request\nGetContactInformationResponse,get_contact_information_response\nGetContactListRequest,get_contact_list_request\nGetContactListResponse,get_contact_list_response\nGetContactMethodsRequest,get_contact_methods_request\nGetContactMethodsResult,get_contact_methods_result\nGetContactPolicyRequest,get_contact_policy_request\nGetContactPolicyResult,get_contact_policy_result\nGetContactReachabilityStatusRequest,get_contact_reachability_status_request\nGetContactReachabilityStatusResponse,get_contact_reachability_status_response\nGetContactRequest,get_contact_request\nGetContactResponse,get_contact_response\nGetContactResult,get_contact_result\nGetContainerAPIMetadataResult,get_container_api_metadata_result\nGetContainerImagesRequest,get_container_images_request\nGetContainerImagesResult,get_container_images_result\nGetContainerLogRequest,get_container_log_request\nGetContainerLogResult,get_container_log_result\nGetContainerPolicyInput,get_container_policy_input\nGetContainerPolicyOutput,get_container_policy_output\nGetContainerRecipePolicyRequest,get_container_recipe_policy_request\nGetContainerRecipePolicyResponse,get_container_recipe_policy_response\nGetContainerRecipeRequest,get_container_recipe_request\nGetContainerRecipeResponse,get_container_recipe_response\nGetContainerServiceDeploymentsRequest,get_container_service_deployments_request\nGetContainerServiceDeploymentsResult,get_container_service_deployments_result\nGetContainerServiceMetricDataRequest,get_container_service_metric_data_request\nGetContainerServiceMetricDataResult,get_container_service_metric_data_result\nGetContainerServicePowersResult,get_container_service_powers_result\nGetContainerServicesRequest,get_container_services_request\nGetContentModerationRequest,get_content_moderation_request\nGetContentModerationRequestMetadata,get_content_moderation_request_metadata\nGetContentModerationResponse,get_content_moderation_response\nGetContentRequest,get_content_request\nGetContentResponse,get_content_response\nGetContentSummaryRequest,get_content_summary_request\nGetContentSummaryResponse,get_content_summary_response\nGetContextKeysForCustomPolicyRequest,get_context_keys_for_custom_policy_request\nGetContextKeysForPolicyResponse,get_context_keys_for_policy_response\nGetContextKeysForPrincipalPolicyRequest,get_context_keys_for_principal_policy_request\nGetContinuousDeploymentPolicyConfigRequest,get_continuous_deployment_policy_config_request\nGetContinuousDeploymentPolicyConfigResult,get_continuous_deployment_policy_config_result\nGetContinuousDeploymentPolicyRequest,get_continuous_deployment_policy_request\nGetContinuousDeploymentPolicyResult,get_continuous_deployment_policy_result\nGetControlOperationInput,get_control_operation_input\nGetControlOperationOutput,get_control_operation_output\nGetControlRequest,get_control_request\nGetControlResponse,get_control_response\nGetCoreDefinitionRequest,get_core_definition_request\nGetCoreDefinitionResponse,get_core_definition_response\nGetCoreDefinitionVersionRequest,get_core_definition_version_request\nGetCoreDefinitionVersionResponse,get_core_definition_version_response\nGetCoreDeviceRequest,get_core_device_request\nGetCoreDeviceResponse,get_core_device_response\nGetCoreNetworkChangeEventsRequest,get_core_network_change_events_request\nGetCoreNetworkChangeEventsResponse,get_core_network_change_events_response\nGetCoreNetworkChangeSetRequest,get_core_network_change_set_request\nGetCoreNetworkChangeSetResponse,get_core_network_change_set_response\nGetCoreNetworkPolicyRequest,get_core_network_policy_request\nGetCoreNetworkPolicyResponse,get_core_network_policy_response\nGetCoreNetworkRequest,get_core_network_request\nGetCoreNetworkResponse,get_core_network_response\nGetCorsPolicyInput,get_cors_policy_input\nGetCorsPolicyOutput,get_cors_policy_output\nGetCostAndUsageRequest,get_cost_and_usage_request\nGetCostAndUsageResponse,get_cost_and_usage_response\nGetCostAndUsageWithResourcesRequest,get_cost_and_usage_with_resources_request\nGetCostAndUsageWithResourcesResponse,get_cost_and_usage_with_resources_response\nGetCostCategoriesRequest,get_cost_categories_request\nGetCostCategoriesResponse,get_cost_categories_response\nGetCostEstimateRequest,get_cost_estimate_request\nGetCostEstimateResult,get_cost_estimate_result\nGetCostEstimationRequest,get_cost_estimation_request\nGetCostEstimationResponse,get_cost_estimation_response\nGetCostForecastRequest,get_cost_forecast_request\nGetCostForecastResponse,get_cost_forecast_response\nGetCoverageStatisticsRequest,get_coverage_statistics_request\nGetCoverageStatisticsResponse,get_coverage_statistics_response\nGetCrawlerMetricsRequest,get_crawler_metrics_request\nGetCrawlerMetricsResponse,get_crawler_metrics_response\nGetCrawlerRequest,get_crawler_request\nGetCrawlerResponse,get_crawler_response\nGetCrawlersRequest,get_crawlers_request\nGetCrawlersResponse,get_crawlers_response\nGetCredentialReportResponse,get_credential_report_response\nGetCredentialsForIdentityInput,get_credentials_for_identity_input\nGetCredentialsForIdentityResponse,get_credentials_for_identity_response\nGetCredentialsRequest,get_credentials_request\nGetCredentialsResponse,get_credentials_response\nGetCurrentMetricDataRequest,get_current_metric_data_request\nGetCurrentMetricDataResponse,get_current_metric_data_response\nGetCurrentUserDataRequest,get_current_user_data_request\nGetCurrentUserDataResponse,get_current_user_data_response\nGetCurrentUserRequest,get_current_user_request\nGetCurrentUserResponse,get_current_user_response\nGetCustomDataIdentifierRequest,get_custom_data_identifier_request\nGetCustomDataIdentifierResponse,get_custom_data_identifier_response\nGetCustomEntityTypeRequest,get_custom_entity_type_request\nGetCustomEntityTypeResponse,get_custom_entity_type_response\nGetCustomModelRequest,get_custom_model_request\nGetCustomModelResponse,get_custom_model_response\nGetCustomRulePolicyRequest,get_custom_rule_policy_request\nGetCustomRulePolicyResponse,get_custom_rule_policy_response\nGetCustomVerificationEmailTemplateRequest,get_custom_verification_email_template_request\nGetCustomVerificationEmailTemplateResponse,get_custom_verification_email_template_response\nGetCustomerGatewayAssociationsRequest,get_customer_gateway_associations_request\nGetCustomerGatewayAssociationsResponse,get_customer_gateway_associations_response\nGetDASHStreamingSessionURLInput,get_dash_streaming_session_url_input\nGetDASHStreamingSessionURLOutput,get_dash_streaming_session_url_output\nGetDICOMImportJobRequest,get_dicom_import_job_request\nGetDICOMImportJobResponse,get_dicom_import_job_response\nGetDNSSECRequest,get_dnssec_request\nGetDNSSECResponse,get_dnssec_response\nGetDashboardEmbedUrlRequest,get_dashboard_embed_url_request\nGetDashboardEmbedUrlResponse,get_dashboard_embed_url_response\nGetDashboardForJobRunRequest,get_dashboard_for_job_run_request\nGetDashboardForJobRunResponse,get_dashboard_for_job_run_response\nGetDashboardInput,get_dashboard_input\nGetDashboardOutput,get_dashboard_output\nGetDataCatalogEncryptionSettingsRequest,get_data_catalog_encryption_settings_request\nGetDataCatalogEncryptionSettingsResponse,get_data_catalog_encryption_settings_response\nGetDataCatalogInput,get_data_catalog_input\nGetDataCatalogOutput,get_data_catalog_output\nGetDataCellsFilterRequest,get_data_cells_filter_request\nGetDataCellsFilterResponse,get_data_cells_filter_response\nGetDataEndpointInput,get_data_endpoint_input\nGetDataEndpointOutput,get_data_endpoint_output\nGetDataIntegrationRequest,get_data_integration_request\nGetDataIntegrationResponse,get_data_integration_response\nGetDataLakeExceptionSubscriptionResponse,get_data_lake_exception_subscription_response\nGetDataLakeOrganizationConfigurationResponse,get_data_lake_organization_configuration_response\nGetDataLakeSettingsRequest,get_data_lake_settings_request\nGetDataLakeSettingsResponse,get_data_lake_settings_response\nGetDataLakeSourcesRequest,get_data_lake_sources_request\nGetDataLakeSourcesResponse,get_data_lake_sources_response\nGetDataProtectionPolicyInput,get_data_protection_policy_input\nGetDataProtectionPolicyRequest,get_data_protection_policy_request\nGetDataProtectionPolicyResponse,get_data_protection_policy_response\nGetDataQualityMetricsRequest,get_data_quality_metrics_request\nGetDataQualityMetricsResponse,get_data_quality_metrics_response\nGetDataQualityResultRequest,get_data_quality_result_request\nGetDataQualityResultResponse,get_data_quality_result_response\nGetDataQualityRuleRecommendationRunRequest,get_data_quality_rule_recommendation_run_request\nGetDataQualityRuleRecommendationRunResponse,get_data_quality_rule_recommendation_run_response\nGetDataQualityRulesetEvaluationRunRequest,get_data_quality_ruleset_evaluation_run_request\nGetDataQualityRulesetEvaluationRunResponse,get_data_quality_ruleset_evaluation_run_response\nGetDataQualityRulesetRequest,get_data_quality_ruleset_request\nGetDataQualityRulesetResponse,get_data_quality_ruleset_response\nGetDataRetrievalPolicyInput,get_data_retrieval_policy_input\nGetDataRetrievalPolicyOutput,get_data_retrieval_policy_output\nGetDataSetDetailsRequest,get_data_set_details_request\nGetDataSetDetailsResponse,get_data_set_details_response\nGetDataSetImportTaskRequest,get_data_set_import_task_request\nGetDataSetImportTaskResponse,get_data_set_import_task_response\nGetDataSetRequest,get_data_set_request\nGetDataSetResponse,get_data_set_response\nGetDataSourceInput,get_data_source_input\nGetDataSourceOutput,get_data_source_output\nGetDataSourceRequest,get_data_source_request\nGetDataSourceResponse,get_data_source_response\nGetDataViewRequest,get_data_view_request\nGetDataViewResponse,get_data_view_response\nGetDatabaseInput,get_database_input\nGetDatabaseOutput,get_database_output\nGetDatabaseRequest,get_database_request\nGetDatabaseResponse,get_database_response\nGetDatabasesRequest,get_databases_request\nGetDatabasesResponse,get_databases_response\nGetDataflowEndpointGroupRequest,get_dataflow_endpoint_group_request\nGetDataflowEndpointGroupResponse,get_dataflow_endpoint_group_response\nGetDataflowGraphRequest,get_dataflow_graph_request\nGetDataflowGraphResponse,get_dataflow_graph_response\nGetDatasetContentRequest,get_dataset_content_request\nGetDatasetContentResponse,get_dataset_content_response\nGetDatasetRequest,get_dataset_request\nGetDatasetResponse,get_dataset_response\nGetDatastoreRequest,get_datastore_request\nGetDatastoreResponse,get_datastore_response\nGetDecoderManifestRequest,get_decoder_manifest_request\nGetDecoderManifestResponse,get_decoder_manifest_response\nGetDecryptedAPIKeyRequest,get_decrypted_api_key_request\nGetDecryptedAPIKeyResponse,get_decrypted_api_key_response\nGetDedicatedIpPoolRequest,get_dedicated_ip_pool_request\nGetDedicatedIpPoolResponse,get_dedicated_ip_pool_response\nGetDedicatedIpRequest,get_dedicated_ip_request\nGetDedicatedIpResponse,get_dedicated_ip_response\nGetDedicatedIpsRequest,get_dedicated_ips_request\nGetDedicatedIpsResponse,get_dedicated_ips_response\nGetDefaultCreditSpecificationRequest,get_default_credit_specification_request\nGetDefaultCreditSpecificationResult,get_default_credit_specification_result\nGetDefaultPatchBaselineRequest,get_default_patch_baseline_request\nGetDefaultPatchBaselineResult,get_default_patch_baseline_result\nGetDefaultRetentionPolicyRequest,get_default_retention_policy_request\nGetDefaultRetentionPolicyResponse,get_default_retention_policy_response\nGetDefaultViewOutput,get_default_view_output\nGetDelegatedAdminAccountResponse,get_delegated_admin_account_response\nGetDelegationsRequest,get_delegations_request\nGetDelegationsResponse,get_delegations_response\nGetDeleteEventsByEventTypeStatusRequest,get_delete_events_by_event_type_status_request\nGetDeleteEventsByEventTypeStatusResult,get_delete_events_by_event_type_status_result\nGetDeliverabilityDashboardOptionsResponse,get_deliverability_dashboard_options_response\nGetDeliverabilityTestReportRequest,get_deliverability_test_report_request\nGetDeliverabilityTestReportResponse,get_deliverability_test_report_response\nGetDeployablePatchSnapshotForInstanceRequest,get_deployable_patch_snapshot_for_instance_request\nGetDeployablePatchSnapshotForInstanceResult,get_deployable_patch_snapshot_for_instance_result\nGetDeploymentConfigInput,get_deployment_config_input\nGetDeploymentConfigOutput,get_deployment_config_output\nGetDeploymentGroupInput,get_deployment_group_input\nGetDeploymentGroupOutput,get_deployment_group_output\nGetDeploymentInput,get_deployment_input\nGetDeploymentInstanceInput,get_deployment_instance_input\nGetDeploymentInstanceOutput,get_deployment_instance_output\nGetDeploymentOutput,get_deployment_output\nGetDeploymentRequest,get_deployment_request\nGetDeploymentResponse,get_deployment_response\nGetDeploymentStatusRequest,get_deployment_status_request\nGetDeploymentStatusResponse,get_deployment_status_response\nGetDeploymentStrategyRequest,get_deployment_strategy_request\nGetDeploymentTargetInput,get_deployment_target_input\nGetDeploymentTargetOutput,get_deployment_target_output\nGetDeploymentsRequest,get_deployments_request\nGetDeploymentsResponse,get_deployments_response\nGetDeploymentsResult,get_deployments_result\nGetDestinationRequest,get_destination_request\nGetDestinationResponse,get_destination_response\nGetDetectorModelAnalysisResultsRequest,get_detector_model_analysis_results_request\nGetDetectorModelAnalysisResultsResponse,get_detector_model_analysis_results_response\nGetDetectorRequest,get_detector_request\nGetDetectorResponse,get_detector_response\nGetDetectorVersionRequest,get_detector_version_request\nGetDetectorVersionResult,get_detector_version_result\nGetDetectorsRequest,get_detectors_request\nGetDetectorsResult,get_detectors_result\nGetDevEndpointRequest,get_dev_endpoint_request\nGetDevEndpointResponse,get_dev_endpoint_response\nGetDevEndpointsRequest,get_dev_endpoints_request\nGetDevEndpointsResponse,get_dev_endpoints_response\nGetDevEnvironmentRequest,get_dev_environment_request\nGetDevEnvironmentResponse,get_dev_environment_response\nGetDeviceDefinitionRequest,get_device_definition_request\nGetDeviceDefinitionResponse,get_device_definition_response\nGetDeviceDefinitionVersionRequest,get_device_definition_version_request\nGetDeviceDefinitionVersionResponse,get_device_definition_version_response\nGetDeviceFleetReportRequest,get_device_fleet_report_request\nGetDeviceFleetReportResponse,get_device_fleet_report_response\nGetDeviceIdentifierRequest,get_device_identifier_request\nGetDeviceIdentifierResponse,get_device_identifier_response\nGetDeviceInstanceRequest,get_device_instance_request\nGetDeviceInstanceResult,get_device_instance_result\nGetDeviceMethodsRequest,get_device_methods_request\nGetDeviceMethodsResponse,get_device_methods_response\nGetDevicePoolCompatibilityRequest,get_device_pool_compatibility_request\nGetDevicePoolCompatibilityResult,get_device_pool_compatibility_result\nGetDevicePoolRequest,get_device_pool_request\nGetDevicePoolResult,get_device_pool_result\nGetDevicePositionHistoryRequest,get_device_position_history_request\nGetDevicePositionHistoryResponse,get_device_position_history_response\nGetDevicePositionRequest,get_device_position_request\nGetDevicePositionResponse,get_device_position_response\nGetDeviceProfileRequest,get_device_profile_request\nGetDeviceProfileResponse,get_device_profile_response\nGetDeviceRegistrationRequest,get_device_registration_request\nGetDeviceRegistrationResult,get_device_registration_result\nGetDeviceRequest,get_device_request\nGetDeviceResponse,get_device_response\nGetDeviceResult,get_device_result\nGetDevicesInPlacementRequest,get_devices_in_placement_request\nGetDevicesInPlacementResponse,get_devices_in_placement_response\nGetDevicesRequest,get_devices_request\nGetDevicesResponse,get_devices_response\nGetDifferencesInput,get_differences_input\nGetDifferencesOutput,get_differences_output\nGetDigestRequest,get_digest_request\nGetDigestResponse,get_digest_response\nGetDimensionKeyDetailsRequest,get_dimension_key_details_request\nGetDimensionKeyDetailsResponse,get_dimension_key_details_response\nGetDimensionValuesRequest,get_dimension_values_request\nGetDimensionValuesResponse,get_dimension_values_response\nGetDirectoryLimitsResult,get_directory_limits_result\nGetDirectoryRegistrationRequest,get_directory_registration_request\nGetDirectoryRegistrationResponse,get_directory_registration_response\nGetDirectoryRequest,get_directory_request\nGetDirectoryResponse,get_directory_response\nGetDiscoveredResourceCountsRequest,get_discovered_resource_counts_request\nGetDiscoveredResourceCountsResponse,get_discovered_resource_counts_response\nGetDiscoveredSchemaRequest,get_discovered_schema_request\nGetDiscoveredSchemaResponse,get_discovered_schema_response\nGetDiscoverySummaryResponse,get_discovery_summary_response\nGetDiskRequest,get_disk_request\nGetDiskResult,get_disk_result\nGetDiskSnapshotRequest,get_disk_snapshot_request\nGetDiskSnapshotResult,get_disk_snapshot_result\nGetDiskSnapshotsRequest,get_disk_snapshots_request\nGetDiskSnapshotsResult,get_disk_snapshots_result\nGetDisksRequest,get_disks_request\nGetDisksResult,get_disks_result\nGetDistributionBundlesResult,get_distribution_bundles_result\nGetDistributionConfigRequest,get_distribution_config_request\nGetDistributionConfigResult,get_distribution_config_result\nGetDistributionConfigurationRequest,get_distribution_configuration_request\nGetDistributionConfigurationResponse,get_distribution_configuration_response\nGetDistributionLatestCacheResetRequest,get_distribution_latest_cache_reset_request\nGetDistributionLatestCacheResetResult,get_distribution_latest_cache_reset_result\nGetDistributionMetricDataRequest,get_distribution_metric_data_request\nGetDistributionMetricDataResult,get_distribution_metric_data_result\nGetDistributionRequest,get_distribution_request\nGetDistributionResult,get_distribution_result\nGetDistributionsRequest,get_distributions_request\nGetDistributionsResult,get_distributions_result\nGetDocumentAnalysisRequest,get_document_analysis_request\nGetDocumentAnalysisResponse,get_document_analysis_response\nGetDocumentPathRequest,get_document_path_request\nGetDocumentPathResponse,get_document_path_response\nGetDocumentRequest,get_document_request\nGetDocumentResponse,get_document_response\nGetDocumentResult,get_document_result\nGetDocumentTextDetectionRequest,get_document_text_detection_request\nGetDocumentTextDetectionResponse,get_document_text_detection_response\nGetDocumentVersionRequest,get_document_version_request\nGetDocumentVersionResponse,get_document_version_response\nGetDocumentationPartRequest,get_documentation_part_request\nGetDocumentationPartsRequest,get_documentation_parts_request\nGetDocumentationVersionRequest,get_documentation_version_request\nGetDocumentationVersionsRequest,get_documentation_versions_request\nGetDomainAssociationRequest,get_domain_association_request\nGetDomainAssociationResult,get_domain_association_result\nGetDomainDeliverabilityCampaignRequest,get_domain_deliverability_campaign_request\nGetDomainDeliverabilityCampaignResponse,get_domain_deliverability_campaign_response\nGetDomainDetailRequest,get_domain_detail_request\nGetDomainDetailResponse,get_domain_detail_response\nGetDomainNameRequest,get_domain_name_request\nGetDomainNameResponse,get_domain_name_response\nGetDomainNamesRequest,get_domain_names_request\nGetDomainNamesResponse,get_domain_names_response\nGetDomainPermissionsPolicyRequest,get_domain_permissions_policy_request\nGetDomainPermissionsPolicyResult,get_domain_permissions_policy_result\nGetDomainRequest,get_domain_request\nGetDomainResponse,get_domain_response\nGetDomainResult,get_domain_result\nGetDomainStatisticsReportRequest,get_domain_statistics_report_request\nGetDomainStatisticsReportResponse,get_domain_statistics_report_response\nGetDomainSuggestionsRequest,get_domain_suggestions_request\nGetDomainSuggestionsResponse,get_domain_suggestions_response\nGetDomainsRequest,get_domains_request\nGetDomainsResult,get_domains_result\nGetDownloadUrlForLayerRequest,get_download_url_for_layer_request\nGetDownloadUrlForLayerResponse,get_download_url_for_layer_response\nGetEBSVolumeRecommendationsRequest,get_ebs_volume_recommendations_request\nGetEBSVolumeRecommendationsResponse,get_ebs_volume_recommendations_response\nGetEC2InstanceRecommendationsRequest,get_ec2_instance_recommendations_request\nGetEC2InstanceRecommendationsResponse,get_ec2_instance_recommendations_response\nGetEC2RecommendationProjectedMetricsRequest,get_ec2_recommendation_projected_metrics_request\nGetEC2RecommendationProjectedMetricsResponse,get_ec2_recommendation_projected_metrics_response\nGetECSServiceRecommendationProjectedMetricsRequest,get_ecs_service_recommendation_projected_metrics_request\nGetECSServiceRecommendationProjectedMetricsResponse,get_ecs_service_recommendation_projected_metrics_response\nGetECSServiceRecommendationsRequest,get_ecs_service_recommendations_request\nGetECSServiceRecommendationsResponse,get_ecs_service_recommendations_response\nGetEarthObservationJobInput,get_earth_observation_job_input\nGetEarthObservationJobOutput,get_earth_observation_job_output\nGetEbsDefaultKmsKeyIdRequest,get_ebs_default_kms_key_id_request\nGetEbsDefaultKmsKeyIdResult,get_ebs_default_kms_key_id_result\nGetEbsEncryptionByDefaultRequest,get_ebs_encryption_by_default_request\nGetEbsEncryptionByDefaultResult,get_ebs_encryption_by_default_result\nGetEc2DeepInspectionConfigurationResponse,get_ec2_deep_inspection_configuration_response\nGetEffectivePermissionsForPathRequest,get_effective_permissions_for_path_request\nGetEffectivePermissionsForPathResponse,get_effective_permissions_for_path_response\nGetEffectivePoliciesRequest,get_effective_policies_request\nGetEffectivePoliciesResponse,get_effective_policies_response\nGetEffectiveRecommendationPreferencesRequest,get_effective_recommendation_preferences_request\nGetEffectiveRecommendationPreferencesResponse,get_effective_recommendation_preferences_response\nGetEmailChannelRequest,get_email_channel_request\nGetEmailChannelResponse,get_email_channel_response\nGetEmailIdentityPoliciesRequest,get_email_identity_policies_request\nGetEmailIdentityPoliciesResponse,get_email_identity_policies_response\nGetEmailIdentityRequest,get_email_identity_request\nGetEmailIdentityResponse,get_email_identity_response\nGetEmailTemplateRequest,get_email_template_request\nGetEmailTemplateResponse,get_email_template_response\nGetEnabledStandardsRequest,get_enabled_standards_request\nGetEnabledStandardsResponse,get_enabled_standards_response\nGetEncryptionConfigResult,get_encryption_config_result\nGetEncryptionConfigurationResponse,get_encryption_configuration_response\nGetEncryptionKeyRequest,get_encryption_key_request\nGetEncryptionKeyResponse,get_encryption_key_response\nGetEndpointAccessRequest,get_endpoint_access_request\nGetEndpointAccessResponse,get_endpoint_access_response\nGetEndpointAttributesInput,get_endpoint_attributes_input\nGetEndpointAttributesResponse,get_endpoint_attributes_response\nGetEndpointRequest,get_endpoint_request\nGetEndpointResponse,get_endpoint_response\nGetEngineStatusOutput,get_engine_status_output\nGetEnrollmentStatusResponse,get_enrollment_status_response\nGetEnrollmentStatusesForOrganizationRequest,get_enrollment_statuses_for_organization_request\nGetEnrollmentStatusesForOrganizationResponse,get_enrollment_statuses_for_organization_response\nGetEntitiesRequest,get_entities_request\nGetEntitiesResponse,get_entities_response\nGetEntitlementsRequest,get_entitlements_request\nGetEntitlementsResult,get_entitlements_result\nGetEntityRequest,get_entity_request\nGetEntityResponse,get_entity_response\nGetEntityTypesRequest,get_entity_types_request\nGetEntityTypesResult,get_entity_types_result\nGetEnvironmentAccountConnectionInput,get_environment_account_connection_input\nGetEnvironmentAccountConnectionOutput,get_environment_account_connection_output\nGetEnvironmentInput,get_environment_input\nGetEnvironmentOutput,get_environment_output\nGetEnvironmentRequest,get_environment_request\nGetEnvironmentResponse,get_environment_response\nGetEnvironmentTemplateInput,get_environment_template_input\nGetEnvironmentTemplateOutput,get_environment_template_output\nGetEnvironmentTemplateVersionInput,get_environment_template_version_input\nGetEnvironmentTemplateVersionOutput,get_environment_template_version_output\nGetEulaRequest,get_eula_request\nGetEulaResponse,get_eula_response\nGetEvaluationInput,get_evaluation_input\nGetEvaluationOutput,get_evaluation_output\nGetEventActionRequest,get_event_action_request\nGetEventActionResponse,get_event_action_response\nGetEventConfigurationByResourceTypesResponse,get_event_configuration_by_resource_types_response\nGetEventDataStoreRequest,get_event_data_store_request\nGetEventDataStoreResponse,get_event_data_store_response\nGetEventIntegrationRequest,get_event_integration_request\nGetEventIntegrationResponse,get_event_integration_response\nGetEventPredictionMetadataRequest,get_event_prediction_metadata_request\nGetEventPredictionMetadataResult,get_event_prediction_metadata_result\nGetEventPredictionRequest,get_event_prediction_request\nGetEventPredictionResult,get_event_prediction_result\nGetEventRequest,get_event_request\nGetEventResult,get_event_result\nGetEventSelectorsRequest,get_event_selectors_request\nGetEventSelectorsResponse,get_event_selectors_response\nGetEventSourceMappingRequest,get_event_source_mapping_request\nGetEventStreamRequest,get_event_stream_request\nGetEventStreamResponse,get_event_stream_response\nGetEventTypesRequest,get_event_types_request\nGetEventTypesResult,get_event_types_result\nGetEventsConfigurationRequest,get_events_configuration_request\nGetEventsConfigurationResponse,get_events_configuration_response\nGetEvidenceByEvidenceFolderRequest,get_evidence_by_evidence_folder_request\nGetEvidenceByEvidenceFolderResponse,get_evidence_by_evidence_folder_response\nGetEvidenceFileUploadUrlRequest,get_evidence_file_upload_url_request\nGetEvidenceFileUploadUrlResponse,get_evidence_file_upload_url_response\nGetEvidenceFolderRequest,get_evidence_folder_request\nGetEvidenceFolderResponse,get_evidence_folder_response\nGetEvidenceFoldersByAssessmentControlRequest,get_evidence_folders_by_assessment_control_request\nGetEvidenceFoldersByAssessmentControlResponse,get_evidence_folders_by_assessment_control_response\nGetEvidenceFoldersByAssessmentRequest,get_evidence_folders_by_assessment_request\nGetEvidenceFoldersByAssessmentResponse,get_evidence_folders_by_assessment_response\nGetEvidenceRequest,get_evidence_request\nGetEvidenceResponse,get_evidence_response\nGetExclusionsPreviewRequest,get_exclusions_preview_request\nGetExclusionsPreviewResponse,get_exclusions_preview_response\nGetExecutionHistoryInput,get_execution_history_input\nGetExecutionHistoryOutput,get_execution_history_output\nGetExpenseAnalysisRequest,get_expense_analysis_request\nGetExpenseAnalysisResponse,get_expense_analysis_response\nGetExperimentRequest,get_experiment_request\nGetExperimentResponse,get_experiment_response\nGetExperimentResultsRequest,get_experiment_results_request\nGetExperimentResultsResponse,get_experiment_results_response\nGetExperimentTemplateRequest,get_experiment_template_request\nGetExperimentTemplateResponse,get_experiment_template_response\nGetExportJobRequest,get_export_job_request\nGetExportJobResponse,get_export_job_response\nGetExportJobsRequest,get_export_jobs_request\nGetExportJobsResponse,get_export_jobs_response\nGetExportRequest,get_export_request\nGetExportResponse,get_export_response\nGetExportSnapshotRecordsRequest,get_export_snapshot_records_request\nGetExportSnapshotRecordsResult,get_export_snapshot_records_result\nGetExtensionAssociationRequest,get_extension_association_request\nGetExtensionRequest,get_extension_request\nGetExtensionResult,get_extension_result\nGetExtensionVersionRequest,get_extension_version_request\nGetExtensionVersionResult,get_extension_version_result\nGetExternalDataViewAccessDetailsRequest,get_external_data_view_access_details_request\nGetExternalDataViewAccessDetailsResponse,get_external_data_view_access_details_response\nGetExternalModelsRequest,get_external_models_request\nGetExternalModelsResult,get_external_models_result\nGetFaceDetectionRequest,get_face_detection_request\nGetFaceDetectionResponse,get_face_detection_response\nGetFaceLivenessSessionResultsRequest,get_face_liveness_session_results_request\nGetFaceLivenessSessionResultsResponse,get_face_liveness_session_results_response\nGetFaceSearchRequest,get_face_search_request\nGetFaceSearchResponse,get_face_search_response\nGetFacetRequest,get_facet_request\nGetFacetResponse,get_facet_response\nGetFailbackReplicationConfigurationRequest,get_failback_replication_configuration_request\nGetFailbackReplicationConfigurationResponse,get_failback_replication_configuration_response\nGetFeatureRequest,get_feature_request\nGetFeatureResponse,get_feature_response\nGetFederationTokenRequest,get_federation_token_request\nGetFederationTokenResponse,get_federation_token_response\nGetFeedbackRequest,get_feedback_request\nGetFeedbackResponse,get_feedback_response\nGetFieldLevelEncryptionConfigRequest,get_field_level_encryption_config_request\nGetFieldLevelEncryptionConfigResult,get_field_level_encryption_config_result\nGetFieldLevelEncryptionProfileConfigRequest,get_field_level_encryption_profile_config_request\nGetFieldLevelEncryptionProfileConfigResult,get_field_level_encryption_profile_config_result\nGetFieldLevelEncryptionProfileRequest,get_field_level_encryption_profile_request\nGetFieldLevelEncryptionProfileResult,get_field_level_encryption_profile_result\nGetFieldLevelEncryptionRequest,get_field_level_encryption_request\nGetFieldLevelEncryptionResult,get_field_level_encryption_result\nGetFieldResponse,get_field_response\nGetFileInput,get_file_input\nGetFileOutput,get_file_output\nGetFileUploadURLRequest,get_file_upload_url_request\nGetFileUploadURLResponse,get_file_upload_url_response\nGetFilterRequest,get_filter_request\nGetFilterResponse,get_filter_response\nGetFindingAggregatorRequest,get_finding_aggregator_request\nGetFindingAggregatorResponse,get_finding_aggregator_response\nGetFindingHistoryRequest,get_finding_history_request\nGetFindingHistoryResponse,get_finding_history_response\nGetFindingRequest,get_finding_request\nGetFindingResponse,get_finding_response\nGetFindingStatisticsRequest,get_finding_statistics_request\nGetFindingStatisticsResponse,get_finding_statistics_response\nGetFindingsFilterRequest,get_findings_filter_request\nGetFindingsFilterResponse,get_findings_filter_response\nGetFindingsPublicationConfigurationResponse,get_findings_publication_configuration_response\nGetFindingsReportAccountSummaryRequest,get_findings_report_account_summary_request\nGetFindingsReportAccountSummaryResponse,get_findings_report_account_summary_response\nGetFindingsReportStatusRequest,get_findings_report_status_request\nGetFindingsReportStatusResponse,get_findings_report_status_response\nGetFindingsRequest,get_findings_request\nGetFindingsResponse,get_findings_response\nGetFindingsStatisticsRequest,get_findings_statistics_request\nGetFindingsStatisticsResponse,get_findings_statistics_response\nGetFirewallConfigRequest,get_firewall_config_request\nGetFirewallConfigResponse,get_firewall_config_response\nGetFirewallDomainListRequest,get_firewall_domain_list_request\nGetFirewallDomainListResponse,get_firewall_domain_list_response\nGetFirewallRuleGroupAssociationRequest,get_firewall_rule_group_association_request\nGetFirewallRuleGroupAssociationResponse,get_firewall_rule_group_association_response\nGetFirewallRuleGroupPolicyRequest,get_firewall_rule_group_policy_request\nGetFirewallRuleGroupPolicyResponse,get_firewall_rule_group_policy_response\nGetFirewallRuleGroupRequest,get_firewall_rule_group_request\nGetFirewallRuleGroupResponse,get_firewall_rule_group_response\nGetFleetRequest,get_fleet_request\nGetFleetResponse,get_fleet_response\nGetFlowLogsIntegrationTemplateRequest,get_flow_logs_integration_template_request\nGetFlowLogsIntegrationTemplateResult,get_flow_logs_integration_template_result\nGetFlowTemplateRequest,get_flow_template_request\nGetFlowTemplateResponse,get_flow_template_response\nGetFlowTemplateRevisionsRequest,get_flow_template_revisions_request\nGetFlowTemplateRevisionsResponse,get_flow_template_revisions_response\nGetFolderInput,get_folder_input\nGetFolderOutput,get_folder_output\nGetFolderPathRequest,get_folder_path_request\nGetFolderPathResponse,get_folder_path_response\nGetFolderRequest,get_folder_request\nGetFolderResponse,get_folder_response\nGetFormRequest,get_form_request\nGetFormResponse,get_form_response\nGetFoundationModelRequest,get_foundation_model_request\nGetFoundationModelResponse,get_foundation_model_response\nGetFunctionCodeSigningConfigRequest,get_function_code_signing_config_request\nGetFunctionCodeSigningConfigResponse,get_function_code_signing_config_response\nGetFunctionConcurrencyRequest,get_function_concurrency_request\nGetFunctionConcurrencyResponse,get_function_concurrency_response\nGetFunctionConfigurationRequest,get_function_configuration_request\nGetFunctionDefinitionRequest,get_function_definition_request\nGetFunctionDefinitionResponse,get_function_definition_response\nGetFunctionDefinitionVersionRequest,get_function_definition_version_request\nGetFunctionDefinitionVersionResponse,get_function_definition_version_response\nGetFunctionEventInvokeConfigRequest,get_function_event_invoke_config_request\nGetFunctionRequest,get_function_request\nGetFunctionResponse,get_function_response\nGetFunctionResult,get_function_result\nGetFunctionUrlConfigRequest,get_function_url_config_request\nGetFunctionUrlConfigResponse,get_function_url_config_response\nGetFuotaTaskRequest,get_fuota_task_request\nGetFuotaTaskResponse,get_fuota_task_response\nGetGameConfigurationRequest,get_game_configuration_request\nGetGameConfigurationResult,get_game_configuration_result\nGetGameRequest,get_game_request\nGetGameResult,get_game_result\nGetGameSessionLogUrlInput,get_game_session_log_url_input\nGetGameSessionLogUrlOutput,get_game_session_log_url_output\nGetGatewayGroupRequest,get_gateway_group_request\nGetGatewayGroupResponse,get_gateway_group_response\nGetGatewayInput,get_gateway_input\nGetGatewayOutput,get_gateway_output\nGetGatewayRequest,get_gateway_request\nGetGatewayResponse,get_gateway_response\nGetGatewayResponseRequest,get_gateway_response_request\nGetGatewayResponsesRequest,get_gateway_responses_request\nGetGcmChannelRequest,get_gcm_channel_request\nGetGcmChannelResponse,get_gcm_channel_response\nGetGeneratedCodeJobRequest,get_generated_code_job_request\nGetGeneratedCodeJobResult,get_generated_code_job_result\nGetGeneratedPolicyRequest,get_generated_policy_request\nGetGeneratedPolicyResponse,get_generated_policy_response\nGetGeoLocationRequest,get_geo_location_request\nGetGeoLocationResponse,get_geo_location_response\nGetGeoMatchSetRequest,get_geo_match_set_request\nGetGeoMatchSetResponse,get_geo_match_set_response\nGetGeofenceRequest,get_geofence_request\nGetGeofenceResponse,get_geofence_response\nGetGlobalSettingsResponse,get_global_settings_response\nGetGrantRequest,get_grant_request\nGetGrantResponse,get_grant_response\nGetGraphqlApiRequest,get_graphql_api_request\nGetGraphqlApiResponse,get_graphql_api_response\nGetGremlinQueryStatusInput,get_gremlin_query_status_input\nGetGremlinQueryStatusOutput,get_gremlin_query_status_output\nGetGroupCertificateAuthorityRequest,get_group_certificate_authority_request\nGetGroupCertificateAuthorityResponse,get_group_certificate_authority_response\nGetGroupCertificateConfigurationRequest,get_group_certificate_configuration_request\nGetGroupCertificateConfigurationResponse,get_group_certificate_configuration_response\nGetGroupConfigurationInput,get_group_configuration_input\nGetGroupConfigurationOutput,get_group_configuration_output\nGetGroupIdRequest,get_group_id_request\nGetGroupIdResponse,get_group_id_response\nGetGroupInput,get_group_input\nGetGroupMembershipIdRequest,get_group_membership_id_request\nGetGroupMembershipIdResponse,get_group_membership_id_response\nGetGroupOutput,get_group_output\nGetGroupPolicyRequest,get_group_policy_request\nGetGroupPolicyResponse,get_group_policy_response\nGetGroupQueryInput,get_group_query_input\nGetGroupQueryOutput,get_group_query_output\nGetGroupRequest,get_group_request\nGetGroupResponse,get_group_response\nGetGroupResult,get_group_result\nGetGroupVersionRequest,get_group_version_request\nGetGroupVersionResponse,get_group_version_response\nGetGroupsForCapacityReservationRequest,get_groups_for_capacity_reservation_request\nGetGroupsForCapacityReservationResult,get_groups_for_capacity_reservation_result\nGetGroupsRequest,get_groups_request\nGetGroupsResult,get_groups_result\nGetHITRequest,get_hit_request\nGetHITResponse,get_hit_response\nGetHLSStreamingSessionURLInput,get_hls_streaming_session_url_input\nGetHLSStreamingSessionURLOutput,get_hls_streaming_session_url_output\nGetHealthCheckCountResponse,get_health_check_count_response\nGetHealthCheckLastFailureReasonRequest,get_health_check_last_failure_reason_request\nGetHealthCheckLastFailureReasonResponse,get_health_check_last_failure_reason_response\nGetHealthCheckRequest,get_health_check_request\nGetHealthCheckResponse,get_health_check_response\nGetHealthCheckStatusRequest,get_health_check_status_request\nGetHealthCheckStatusResponse,get_health_check_status_response\nGetHealthEventInput,get_health_event_input\nGetHealthEventOutput,get_health_event_output\nGetHlsManifestConfiguration,get_hls_manifest_configuration\nGetHomeRegionResult,get_home_region_result\nGetHostInput,get_host_input\nGetHostOutput,get_host_output\nGetHostReservationPurchasePreviewRequest,get_host_reservation_purchase_preview_request\nGetHostReservationPurchasePreviewResult,get_host_reservation_purchase_preview_result\nGetHostedConfigurationVersionRequest,get_hosted_configuration_version_request\nGetHostedZoneCountResponse,get_hosted_zone_count_response\nGetHostedZoneLimitRequest,get_hosted_zone_limit_request\nGetHostedZoneLimitResponse,get_hosted_zone_limit_response\nGetHostedZoneRequest,get_hosted_zone_request\nGetHostedZoneResponse,get_hosted_zone_response\nGetHostnameSuggestionRequest,get_hostname_suggestion_request\nGetHostnameSuggestionResult,get_hostname_suggestion_result\nGetHypervisorInput,get_hypervisor_input\nGetHypervisorOutput,get_hypervisor_output\nGetHypervisorPropertyMappingsInput,get_hypervisor_property_mappings_input\nGetHypervisorPropertyMappingsOutput,get_hypervisor_property_mappings_output\nGetIPSetRequest,get_ip_set_request\nGetIPSetResponse,get_ip_set_response\nGetIceServerConfigRequest,get_ice_server_config_request\nGetIceServerConfigResponse,get_ice_server_config_response\nGetIdInput,get_id_input\nGetIdResponse,get_id_response\nGetIdentityDkimAttributesRequest,get_identity_dkim_attributes_request\nGetIdentityDkimAttributesResponse,get_identity_dkim_attributes_response\nGetIdentityMailFromDomainAttributesRequest,get_identity_mail_from_domain_attributes_request\nGetIdentityMailFromDomainAttributesResponse,get_identity_mail_from_domain_attributes_response\nGetIdentityNotificationAttributesRequest,get_identity_notification_attributes_request\nGetIdentityNotificationAttributesResponse,get_identity_notification_attributes_response\nGetIdentityPoliciesRequest,get_identity_policies_request\nGetIdentityPoliciesResponse,get_identity_policies_response\nGetIdentityPoolConfigurationRequest,get_identity_pool_configuration_request\nGetIdentityPoolConfigurationResponse,get_identity_pool_configuration_response\nGetIdentityPoolRolesInput,get_identity_pool_roles_input\nGetIdentityPoolRolesResponse,get_identity_pool_roles_response\nGetIdentityProviderByIdentifierRequest,get_identity_provider_by_identifier_request\nGetIdentityProviderByIdentifierResponse,get_identity_provider_by_identifier_response\nGetIdentityProviderRequest,get_identity_provider_request\nGetIdentityProviderResponse,get_identity_provider_response\nGetIdentityResolutionJobRequest,get_identity_resolution_job_request\nGetIdentityResolutionJobResponse,get_identity_resolution_job_response\nGetIdentitySourceInput,get_identity_source_input\nGetIdentitySourceOutput,get_identity_source_output\nGetIdentityVerificationAttributesRequest,get_identity_verification_attributes_request\nGetIdentityVerificationAttributesResponse,get_identity_verification_attributes_response\nGetImageBlockPublicAccessStateRequest,get_image_block_public_access_state_request\nGetImageBlockPublicAccessStateResult,get_image_block_public_access_state_result\nGetImageFrameRequest,get_image_frame_request\nGetImageFrameResponse,get_image_frame_response\nGetImagePipelineRequest,get_image_pipeline_request\nGetImagePipelineResponse,get_image_pipeline_response\nGetImagePolicyRequest,get_image_policy_request\nGetImagePolicyResponse,get_image_policy_response\nGetImageRecipePolicyRequest,get_image_recipe_policy_request\nGetImageRecipePolicyResponse,get_image_recipe_policy_response\nGetImageRecipeRequest,get_image_recipe_request\nGetImageRecipeResponse,get_image_recipe_response\nGetImageRequest,get_image_request\nGetImageResponse,get_image_response\nGetImageSetMetadataRequest,get_image_set_metadata_request\nGetImageSetMetadataResponse,get_image_set_metadata_response\nGetImageSetRequest,get_image_set_request\nGetImageSetResponse,get_image_set_response\nGetImagesInput,get_images_input\nGetImagesOutput,get_images_output\nGetImpersonationRoleEffectRequest,get_impersonation_role_effect_request\nGetImpersonationRoleEffectResponse,get_impersonation_role_effect_response\nGetImpersonationRoleRequest,get_impersonation_role_request\nGetImpersonationRoleResponse,get_impersonation_role_response\nGetImportFileTaskRequest,get_import_file_task_request\nGetImportFileTaskResponse,get_import_file_task_response\nGetImportJobRequest,get_import_job_request\nGetImportJobResponse,get_import_job_response\nGetImportJobsRequest,get_import_jobs_request\nGetImportJobsResponse,get_import_jobs_response\nGetImportRequest,get_import_request\nGetImportResponse,get_import_response\nGetInAppMessagesRequest,get_in_app_messages_request\nGetInAppMessagesResponse,get_in_app_messages_response\nGetInAppTemplateRequest,get_in_app_template_request\nGetInAppTemplateResponse,get_in_app_template_response\nGetIncidentRecordInput,get_incident_record_input\nGetIncidentRecordOutput,get_incident_record_output\nGetIndexOutput,get_index_output\nGetIndexingConfigurationResponse,get_indexing_configuration_response\nGetInfrastructureConfigurationRequest,get_infrastructure_configuration_request\nGetInfrastructureConfigurationResponse,get_infrastructure_configuration_response\nGetIngestionDestinationRequest,get_ingestion_destination_request\nGetIngestionDestinationResponse,get_ingestion_destination_response\nGetIngestionRequest,get_ingestion_request\nGetIngestionResponse,get_ingestion_response\nGetInlinePolicyForPermissionSetRequest,get_inline_policy_for_permission_set_request\nGetInlinePolicyForPermissionSetResponse,get_inline_policy_for_permission_set_response\nGetInsightEventsRequest,get_insight_events_request\nGetInsightEventsResult,get_insight_events_result\nGetInsightImpactGraphRequest,get_insight_impact_graph_request\nGetInsightImpactGraphResult,get_insight_impact_graph_result\nGetInsightRequest,get_insight_request\nGetInsightResult,get_insight_result\nGetInsightResultsRequest,get_insight_results_request\nGetInsightResultsResponse,get_insight_results_response\nGetInsightRuleReportInput,get_insight_rule_report_input\nGetInsightRuleReportOutput,get_insight_rule_report_output\nGetInsightSelectorsRequest,get_insight_selectors_request\nGetInsightSelectorsResponse,get_insight_selectors_response\nGetInsightSummariesRequest,get_insight_summaries_request\nGetInsightSummariesResult,get_insight_summaries_result\nGetInsightsByAssessmentRequest,get_insights_by_assessment_request\nGetInsightsByAssessmentResponse,get_insights_by_assessment_response\nGetInsightsRequest,get_insights_request\nGetInsightsResponse,get_insights_response\nGetInstanceAccessDetailsRequest,get_instance_access_details_request\nGetInstanceAccessDetailsResult,get_instance_access_details_result\nGetInstanceAccessInput,get_instance_access_input\nGetInstanceAccessOutput,get_instance_access_output\nGetInstanceMetricDataRequest,get_instance_metric_data_request\nGetInstanceMetricDataResult,get_instance_metric_data_result\nGetInstanceOnboardingJobStatusRequest,get_instance_onboarding_job_status_request\nGetInstanceOnboardingJobStatusResponse,get_instance_onboarding_job_status_response\nGetInstancePortStatesRequest,get_instance_port_states_request\nGetInstancePortStatesResult,get_instance_port_states_result\nGetInstanceProfileRequest,get_instance_profile_request\nGetInstanceProfileResponse,get_instance_profile_response\nGetInstanceProfileResult,get_instance_profile_result\nGetInstanceRequest,get_instance_request\nGetInstanceResponse,get_instance_response\nGetInstanceResult,get_instance_result\nGetInstanceSnapshotRequest,get_instance_snapshot_request\nGetInstanceSnapshotResult,get_instance_snapshot_result\nGetInstanceSnapshotsRequest,get_instance_snapshots_request\nGetInstanceSnapshotsResult,get_instance_snapshots_result\nGetInstanceStateRequest,get_instance_state_request\nGetInstanceStateResult,get_instance_state_result\nGetInstanceTypesFromInstanceRequirementsRequest,get_instance_types_from_instance_requirements_request\nGetInstanceTypesFromInstanceRequirementsResult,get_instance_types_from_instance_requirements_result\nGetInstanceUefiDataRequest,get_instance_uefi_data_request\nGetInstanceUefiDataResult,get_instance_uefi_data_result\nGetInstancesHealthStatusRequest,get_instances_health_status_request\nGetInstancesHealthStatusResponse,get_instances_health_status_response\nGetInstancesRequest,get_instances_request\nGetInstancesResult,get_instances_result\nGetIntegrationRequest,get_integration_request\nGetIntegrationResponse,get_integration_response\nGetIntegrationResponseRequest,get_integration_response_request\nGetIntegrationResponseResponse,get_integration_response_response\nGetIntegrationResponsesRequest,get_integration_responses_request\nGetIntegrationResponsesResponse,get_integration_responses_response\nGetIntegrationResult,get_integration_result\nGetIntegrationsRequest,get_integrations_request\nGetIntegrationsResponse,get_integrations_response\nGetIntentRequest,get_intent_request\nGetIntentResponse,get_intent_response\nGetIntentVersionsRequest,get_intent_versions_request\nGetIntentVersionsResponse,get_intent_versions_response\nGetIntentsRequest,get_intents_request\nGetIntentsResponse,get_intents_response\nGetInterpolatedAssetPropertyValuesRequest,get_interpolated_asset_property_values_request\nGetInterpolatedAssetPropertyValuesResponse,get_interpolated_asset_property_values_response\nGetIntrospectionSchemaRequest,get_introspection_schema_request\nGetIntrospectionSchemaResponse,get_introspection_schema_response\nGetInvalidationRequest,get_invalidation_request\nGetInvalidationResult,get_invalidation_result\nGetInventoryRequest,get_inventory_request\nGetInventoryResult,get_inventory_result\nGetInventorySchemaRequest,get_inventory_schema_request\nGetInventorySchemaResult,get_inventory_schema_result\nGetInvitationConfigurationResponse,get_invitation_configuration_response\nGetInvitationsCountResponse,get_invitations_count_response\nGetIpAccessSettingsRequest,get_ip_access_settings_request\nGetIpAccessSettingsResponse,get_ip_access_settings_response\nGetIpamAddressHistoryRequest,get_ipam_address_history_request\nGetIpamAddressHistoryResult,get_ipam_address_history_result\nGetIpamDiscoveredAccountsRequest,get_ipam_discovered_accounts_request\nGetIpamDiscoveredAccountsResult,get_ipam_discovered_accounts_result\nGetIpamDiscoveredResourceCidrsRequest,get_ipam_discovered_resource_cidrs_request\nGetIpamDiscoveredResourceCidrsResult,get_ipam_discovered_resource_cidrs_result\nGetIpamPoolAllocationsRequest,get_ipam_pool_allocations_request\nGetIpamPoolAllocationsResult,get_ipam_pool_allocations_result\nGetIpamPoolCidrsRequest,get_ipam_pool_cidrs_request\nGetIpamPoolCidrsResult,get_ipam_pool_cidrs_result\nGetIpamResourceCidrsRequest,get_ipam_resource_cidrs_request\nGetIpamResourceCidrsResult,get_ipam_resource_cidrs_result\nGetItemInput,get_item_input\nGetItemOutput,get_item_output\nGetJobBookmarkRequest,get_job_bookmark_request\nGetJobBookmarkResponse,get_job_bookmark_response\nGetJobDetailsInput,get_job_details_input\nGetJobDetailsOutput,get_job_details_output\nGetJobDocumentRequest,get_job_document_request\nGetJobDocumentResponse,get_job_document_response\nGetJobManifestRequest,get_job_manifest_request\nGetJobManifestResult,get_job_manifest_result\nGetJobOutputInput,get_job_output_input\nGetJobOutputOutput,get_job_output_output\nGetJobRequest,get_job_request\nGetJobResponse,get_job_response\nGetJobResult,get_job_result\nGetJobRunRequest,get_job_run_request\nGetJobRunResponse,get_job_run_response\nGetJobRunsRequest,get_job_runs_request\nGetJobRunsResponse,get_job_runs_response\nGetJobTaggingRequest,get_job_tagging_request\nGetJobTaggingResult,get_job_tagging_result\nGetJobTemplateRequest,get_job_template_request\nGetJobTemplateResponse,get_job_template_response\nGetJobUnlockCodeRequest,get_job_unlock_code_request\nGetJobUnlockCodeResult,get_job_unlock_code_result\nGetJobsRequest,get_jobs_request\nGetJobsResponse,get_jobs_response\nGetJourneyDateRangeKpiRequest,get_journey_date_range_kpi_request\nGetJourneyDateRangeKpiResponse,get_journey_date_range_kpi_response\nGetJourneyExecutionActivityMetricsRequest,get_journey_execution_activity_metrics_request\nGetJourneyExecutionActivityMetricsResponse,get_journey_execution_activity_metrics_response\nGetJourneyExecutionMetricsRequest,get_journey_execution_metrics_request\nGetJourneyExecutionMetricsResponse,get_journey_execution_metrics_response\nGetJourneyRequest,get_journey_request\nGetJourneyResponse,get_journey_response\nGetJourneyRunExecutionActivityMetricsRequest,get_journey_run_execution_activity_metrics_request\nGetJourneyRunExecutionActivityMetricsResponse,get_journey_run_execution_activity_metrics_response\nGetJourneyRunExecutionMetricsRequest,get_journey_run_execution_metrics_request\nGetJourneyRunExecutionMetricsResponse,get_journey_run_execution_metrics_response\nGetJourneyRunsRequest,get_journey_runs_request\nGetJourneyRunsResponse,get_journey_runs_response\nGetKMSEncryptionKeyResult,get_kms_encryption_key_result\nGetKeyGroupConfigRequest,get_key_group_config_request\nGetKeyGroupConfigResult,get_key_group_config_result\nGetKeyGroupRequest,get_key_group_request\nGetKeyGroupResult,get_key_group_result\nGetKeyInput,get_key_input\nGetKeyOutput,get_key_output\nGetKeyPairRequest,get_key_pair_request\nGetKeyPairResult,get_key_pair_result\nGetKeyPairsRequest,get_key_pairs_request\nGetKeyPairsResult,get_key_pairs_result\nGetKeyPolicyRequest,get_key_policy_request\nGetKeyPolicyResponse,get_key_policy_response\nGetKeyRotationStatusRequest,get_key_rotation_status_request\nGetKeyRotationStatusResponse,get_key_rotation_status_response\nGetKeyspaceRequest,get_keyspace_request\nGetKeyspaceResponse,get_keyspace_response\nGetKnowledgeBaseRequest,get_knowledge_base_request\nGetKnowledgeBaseResponse,get_knowledge_base_response\nGetKxChangesetRequest,get_kx_changeset_request\nGetKxChangesetResponse,get_kx_changeset_response\nGetKxClusterRequest,get_kx_cluster_request\nGetKxClusterResponse,get_kx_cluster_response\nGetKxConnectionStringRequest,get_kx_connection_string_request\nGetKxConnectionStringResponse,get_kx_connection_string_response\nGetKxDatabaseRequest,get_kx_database_request\nGetKxDatabaseResponse,get_kx_database_response\nGetKxEnvironmentRequest,get_kx_environment_request\nGetKxEnvironmentResponse,get_kx_environment_response\nGetKxUserRequest,get_kx_user_request\nGetKxUserResponse,get_kx_user_response\nGetLFTagRequest,get_lf_tag_request\nGetLFTagResponse,get_lf_tag_response\nGetLabelDetectionRequest,get_label_detection_request\nGetLabelDetectionRequestMetadata,get_label_detection_request_metadata\nGetLabelDetectionResponse,get_label_detection_response\nGetLabelsRequest,get_labels_request\nGetLabelsResult,get_labels_result\nGetLambdaFunctionRecommendationsRequest,get_lambda_function_recommendations_request\nGetLambdaFunctionRecommendationsResponse,get_lambda_function_recommendations_response\nGetLatestAssessmentIdResponse,get_latest_assessment_id_response\nGetLatestConfigurationRequest,get_latest_configuration_request\nGetLatestConfigurationResponse,get_latest_configuration_response\nGetLaunchConfigurationRequest,get_launch_configuration_request\nGetLaunchProfileDetailsRequest,get_launch_profile_details_request\nGetLaunchProfileDetailsResponse,get_launch_profile_details_response\nGetLaunchProfileInitializationRequest,get_launch_profile_initialization_request\nGetLaunchProfileInitializationResponse,get_launch_profile_initialization_response\nGetLaunchProfileMemberRequest,get_launch_profile_member_request\nGetLaunchProfileMemberResponse,get_launch_profile_member_response\nGetLaunchProfileRequest,get_launch_profile_request\nGetLaunchProfileResponse,get_launch_profile_response\nGetLaunchRequest,get_launch_request\nGetLaunchResponse,get_launch_response\nGetLaunchTemplateDataRequest,get_launch_template_data_request\nGetLaunchTemplateDataResult,get_launch_template_data_result\nGetLayerVersionByArnRequest,get_layer_version_by_arn_request\nGetLayerVersionPolicyRequest,get_layer_version_policy_request\nGetLayerVersionPolicyResponse,get_layer_version_policy_response\nGetLayerVersionRequest,get_layer_version_request\nGetLayerVersionResponse,get_layer_version_response\nGetLayoutRequest,get_layout_request\nGetLayoutResponse,get_layout_response\nGetLegalHoldInput,get_legal_hold_input\nGetLegalHoldOutput,get_legal_hold_output\nGetLendingAnalysisRequest,get_lending_analysis_request\nGetLendingAnalysisResponse,get_lending_analysis_response\nGetLendingAnalysisSummaryRequest,get_lending_analysis_summary_request\nGetLendingAnalysisSummaryResponse,get_lending_analysis_summary_response\nGetLensInput,get_lens_input\nGetLensOutput,get_lens_output\nGetLensReviewInput,get_lens_review_input\nGetLensReviewOutput,get_lens_review_output\nGetLensReviewReportInput,get_lens_review_report_input\nGetLensReviewReportOutput,get_lens_review_report_output\nGetLensVersionDifferenceInput,get_lens_version_difference_input\nGetLensVersionDifferenceOutput,get_lens_version_difference_output\nGetLexiconInput,get_lexicon_input\nGetLexiconOutput,get_lexicon_output\nGetLicenseConfigurationRequest,get_license_configuration_request\nGetLicenseConfigurationResponse,get_license_configuration_response\nGetLicenseConversionTaskRequest,get_license_conversion_task_request\nGetLicenseConversionTaskResponse,get_license_conversion_task_response\nGetLicenseManagerReportGeneratorRequest,get_license_manager_report_generator_request\nGetLicenseManagerReportGeneratorResponse,get_license_manager_report_generator_response\nGetLicenseRecommendationsRequest,get_license_recommendations_request\nGetLicenseRecommendationsResponse,get_license_recommendations_response\nGetLicenseRequest,get_license_request\nGetLicenseResponse,get_license_response\nGetLicenseUsageRequest,get_license_usage_request\nGetLicenseUsageResponse,get_license_usage_response\nGetLifecyclePoliciesRequest,get_lifecycle_policies_request\nGetLifecyclePoliciesResponse,get_lifecycle_policies_response\nGetLifecyclePolicyInput,get_lifecycle_policy_input\nGetLifecyclePolicyOutput,get_lifecycle_policy_output\nGetLifecyclePolicyPreviewRequest,get_lifecycle_policy_preview_request\nGetLifecyclePolicyPreviewResponse,get_lifecycle_policy_preview_response\nGetLifecyclePolicyRequest,get_lifecycle_policy_request\nGetLifecyclePolicyResponse,get_lifecycle_policy_response\nGetLineageGroupPolicyRequest,get_lineage_group_policy_request\nGetLineageGroupPolicyResponse,get_lineage_group_policy_response\nGetLinkAssociationsRequest,get_link_associations_request\nGetLinkAssociationsResponse,get_link_associations_response\nGetLinkAttributes,get_link_attributes\nGetLinkAttributesRequest,get_link_attributes_request\nGetLinkAttributesResponse,get_link_attributes_response\nGetLinkInput,get_link_input\nGetLinkOutput,get_link_output\nGetLinksRequest,get_links_request\nGetLinksResponse,get_links_response\nGetListElementsRequest,get_list_elements_request\nGetListElementsResult,get_list_elements_result\nGetListenerRequest,get_listener_request\nGetListenerResponse,get_listener_response\nGetListsMetadataRequest,get_lists_metadata_request\nGetListsMetadataResult,get_lists_metadata_result\nGetLoadBalancerMetricDataRequest,get_load_balancer_metric_data_request\nGetLoadBalancerMetricDataResult,get_load_balancer_metric_data_result\nGetLoadBalancerRequest,get_load_balancer_request\nGetLoadBalancerResult,get_load_balancer_result\nGetLoadBalancerTlsCertificatesRequest,get_load_balancer_tls_certificates_request\nGetLoadBalancerTlsCertificatesResult,get_load_balancer_tls_certificates_result\nGetLoadBalancerTlsPoliciesRequest,get_load_balancer_tls_policies_request\nGetLoadBalancerTlsPoliciesResult,get_load_balancer_tls_policies_result\nGetLoadBalancersRequest,get_load_balancers_request\nGetLoadBalancersResult,get_load_balancers_result\nGetLoaderJobStatusInput,get_loader_job_status_input\nGetLoaderJobStatusOutput,get_loader_job_status_output\nGetLogDeliveryConfigurationRequest,get_log_delivery_configuration_request\nGetLogDeliveryConfigurationResponse,get_log_delivery_configuration_response\nGetLogEventsRequest,get_log_events_request\nGetLogEventsResponse,get_log_events_response\nGetLogGroupFieldsRequest,get_log_group_fields_request\nGetLogGroupFieldsResponse,get_log_group_fields_response\nGetLogLevelsByResourceTypesResponse,get_log_levels_by_resource_types_response\nGetLogRecordRequest,get_log_record_request\nGetLogRecordResponse,get_log_record_response\nGetLoggerDefinitionRequest,get_logger_definition_request\nGetLoggerDefinitionResponse,get_logger_definition_response\nGetLoggerDefinitionVersionRequest,get_logger_definition_version_request\nGetLoggerDefinitionVersionResponse,get_logger_definition_version_response\nGetLoggingConfigurationRequest,get_logging_configuration_request\nGetLoggingConfigurationResponse,get_logging_configuration_response\nGetLoggingOptionsResponse,get_logging_options_response\nGetLoginProfileRequest,get_login_profile_request\nGetLoginProfileResponse,get_login_profile_response\nGetLowLatencyHlsManifestConfiguration,get_low_latency_hls_manifest_configuration\nGetMFADeviceRequest,get_mfa_device_request\nGetMFADeviceResponse,get_mfa_device_response\nGetMLDataProcessingJobInput,get_ml_data_processing_job_input\nGetMLDataProcessingJobOutput,get_ml_data_processing_job_output\nGetMLEndpointInput,get_ml_endpoint_input\nGetMLEndpointOutput,get_ml_endpoint_output\nGetMLModelInput,get_ml_model_input\nGetMLModelOutput,get_ml_model_output\nGetMLModelTrainingJobInput,get_ml_model_training_job_input\nGetMLModelTrainingJobOutput,get_ml_model_training_job_output\nGetMLModelTransformJobInput,get_ml_model_transform_job_input\nGetMLModelTransformJobOutput,get_ml_model_transform_job_output\nGetMLTaskRunRequest,get_ml_task_run_request\nGetMLTaskRunResponse,get_ml_task_run_response\nGetMLTaskRunsRequest,get_ml_task_runs_request\nGetMLTaskRunsResponse,get_ml_task_runs_response\nGetMLTransformRequest,get_ml_transform_request\nGetMLTransformResponse,get_ml_transform_response\nGetMLTransformsRequest,get_ml_transforms_request\nGetMLTransformsResponse,get_ml_transforms_response\nGetMacieSessionResponse,get_macie_session_response\nGetMailDomainRequest,get_mail_domain_request\nGetMailDomainResponse,get_mail_domain_response\nGetMailboxDetailsRequest,get_mailbox_details_request\nGetMailboxDetailsResponse,get_mailbox_details_response\nGetMaintenanceWindowExecutionRequest,get_maintenance_window_execution_request\nGetMaintenanceWindowExecutionResult,get_maintenance_window_execution_result\nGetMaintenanceWindowExecutionTaskInvocationRequest,get_maintenance_window_execution_task_invocation_request\nGetMaintenanceWindowExecutionTaskInvocationResult,get_maintenance_window_execution_task_invocation_result\nGetMaintenanceWindowExecutionTaskRequest,get_maintenance_window_execution_task_request\nGetMaintenanceWindowExecutionTaskResult,get_maintenance_window_execution_task_result\nGetMaintenanceWindowRequest,get_maintenance_window_request\nGetMaintenanceWindowResult,get_maintenance_window_result\nGetMaintenanceWindowTaskRequest,get_maintenance_window_task_request\nGetMaintenanceWindowTaskResult,get_maintenance_window_task_result\nGetMalwareScanSettingsRequest,get_malware_scan_settings_request\nGetMalwareScanSettingsResponse,get_malware_scan_settings_response\nGetManagedEndpointSessionCredentialsRequest,get_managed_endpoint_session_credentials_request\nGetManagedEndpointSessionCredentialsResponse,get_managed_endpoint_session_credentials_response\nGetManagedPrefixListAssociationsRequest,get_managed_prefix_list_associations_request\nGetManagedPrefixListAssociationsResult,get_managed_prefix_list_associations_result\nGetManagedPrefixListEntriesRequest,get_managed_prefix_list_entries_request\nGetManagedPrefixListEntriesResult,get_managed_prefix_list_entries_result\nGetManagedResourceRequest,get_managed_resource_request\nGetManagedResourceResponse,get_managed_resource_response\nGetManagedRuleSetRequest,get_managed_rule_set_request\nGetManagedRuleSetResponse,get_managed_rule_set_response\nGetManagedScalingPolicyInput,get_managed_scaling_policy_input\nGetManagedScalingPolicyOutput,get_managed_scaling_policy_output\nGetMapGlyphsRequest,get_map_glyphs_request\nGetMapGlyphsResponse,get_map_glyphs_response\nGetMapSpritesRequest,get_map_sprites_request\nGetMapSpritesResponse,get_map_sprites_response\nGetMapStyleDescriptorRequest,get_map_style_descriptor_request\nGetMapStyleDescriptorResponse,get_map_style_descriptor_response\nGetMapTileRequest,get_map_tile_request\nGetMapTileResponse,get_map_tile_response\nGetMappingRequest,get_mapping_request\nGetMappingResponse,get_mapping_response\nGetMasterAccountRequest,get_master_account_request\nGetMasterAccountResponse,get_master_account_response\nGetMatchIdInput,get_match_id_input\nGetMatchIdOutput,get_match_id_output\nGetMatchesRequest,get_matches_request\nGetMatchesResponse,get_matches_response\nGetMatchingJobInput,get_matching_job_input\nGetMatchingJobOutput,get_matching_job_output\nGetMatchingWorkflowInput,get_matching_workflow_input\nGetMatchingWorkflowOutput,get_matching_workflow_output\nGetMediaCapturePipelineRequest,get_media_capture_pipeline_request\nGetMediaCapturePipelineResponse,get_media_capture_pipeline_response\nGetMediaForFragmentListInput,get_media_for_fragment_list_input\nGetMediaForFragmentListOutput,get_media_for_fragment_list_output\nGetMediaInput,get_media_input\nGetMediaInsightsPipelineConfigurationRequest,get_media_insights_pipeline_configuration_request\nGetMediaInsightsPipelineConfigurationResponse,get_media_insights_pipeline_configuration_response\nGetMediaOutput,get_media_output\nGetMediaPipelineKinesisVideoStreamPoolRequest,get_media_pipeline_kinesis_video_stream_pool_request\nGetMediaPipelineKinesisVideoStreamPoolResponse,get_media_pipeline_kinesis_video_stream_pool_response\nGetMediaPipelineRequest,get_media_pipeline_request\nGetMediaPipelineResponse,get_media_pipeline_response\nGetMedicalTranscriptionJobRequest,get_medical_transcription_job_request\nGetMedicalTranscriptionJobResponse,get_medical_transcription_job_response\nGetMedicalVocabularyRequest,get_medical_vocabulary_request\nGetMedicalVocabularyResponse,get_medical_vocabulary_response\nGetMeetingRequest,get_meeting_request\nGetMeetingResponse,get_meeting_response\nGetMemberDetectorsRequest,get_member_detectors_request\nGetMemberDetectorsResponse,get_member_detectors_response\nGetMemberInput,get_member_input\nGetMemberOutput,get_member_output\nGetMemberRequest,get_member_request\nGetMemberResponse,get_member_response\nGetMembersRequest,get_members_request\nGetMembersResponse,get_members_response\nGetMembershipInput,get_membership_input\nGetMembershipOutput,get_membership_output\nGetMergeCommitInput,get_merge_commit_input\nGetMergeCommitOutput,get_merge_commit_output\nGetMergeConflictsInput,get_merge_conflicts_input\nGetMergeConflictsOutput,get_merge_conflicts_output\nGetMergeOptionsInput,get_merge_options_input\nGetMergeOptionsOutput,get_merge_options_output\nGetMessageInsightsRequest,get_message_insights_request\nGetMessageInsightsResponse,get_message_insights_response\nGetMessagingSessionEndpointResponse,get_messaging_session_endpoint_response\nGetMessagingStreamingConfigurationsRequest,get_messaging_streaming_configurations_request\nGetMessagingStreamingConfigurationsResponse,get_messaging_streaming_configurations_response\nGetMetadataRequest,get_metadata_request\nGetMetadataResponse,get_metadata_response\nGetMethodRequest,get_method_request\nGetMethodResponseRequest,get_method_response_request\nGetMetricDataInput,get_metric_data_input\nGetMetricDataOutput,get_metric_data_output\nGetMetricDataRequest,get_metric_data_request\nGetMetricDataResponse,get_metric_data_response\nGetMetricDataV2Request,get_metric_data_v2_request\nGetMetricDataV2Response,get_metric_data_v2_response\nGetMetricPolicyInput,get_metric_policy_input\nGetMetricPolicyOutput,get_metric_policy_output\nGetMetricStatisticsInput,get_metric_statistics_input\nGetMetricStatisticsOutput,get_metric_statistics_output\nGetMetricStreamInput,get_metric_stream_input\nGetMetricStreamOutput,get_metric_stream_output\nGetMetricWidgetImageInput,get_metric_widget_image_input\nGetMetricWidgetImageOutput,get_metric_widget_image_output\nGetMetricsSummaryRequest,get_metrics_summary_request\nGetMetricsSummaryResponse,get_metrics_summary_response\nGetMigrationRequest,get_migration_request\nGetMigrationResponse,get_migration_response\nGetMigrationWorkflowRequest,get_migration_workflow_request\nGetMigrationWorkflowResponse,get_migration_workflow_response\nGetMigrationWorkflowTemplateRequest,get_migration_workflow_template_request\nGetMigrationWorkflowTemplateResponse,get_migration_workflow_template_response\nGetMigrationsRequest,get_migrations_request\nGetMigrationsResponse,get_migrations_response\nGetMilestoneInput,get_milestone_input\nGetMilestoneOutput,get_milestone_output\nGetMinuteUsageRequest,get_minute_usage_request\nGetMinuteUsageResponse,get_minute_usage_response\nGetMissionProfileRequest,get_mission_profile_request\nGetMissionProfileResponse,get_mission_profile_response\nGetMobileDeviceAccessEffectRequest,get_mobile_device_access_effect_request\nGetMobileDeviceAccessEffectResponse,get_mobile_device_access_effect_response\nGetMobileDeviceAccessOverrideRequest,get_mobile_device_access_override_request\nGetMobileDeviceAccessOverrideResponse,get_mobile_device_access_override_response\nGetMobileSdkReleaseRequest,get_mobile_sdk_release_request\nGetMobileSdkReleaseResponse,get_mobile_sdk_release_response\nGetModelCustomizationJobRequest,get_model_customization_job_request\nGetModelCustomizationJobResponse,get_model_customization_job_response\nGetModelInvocationLoggingConfigurationResponse,get_model_invocation_logging_configuration_response\nGetModelManifestRequest,get_model_manifest_request\nGetModelManifestResponse,get_model_manifest_response\nGetModelPackageGroupPolicyInput,get_model_package_group_policy_input\nGetModelPackageGroupPolicyOutput,get_model_package_group_policy_output\nGetModelRequest,get_model_request\nGetModelResponse,get_model_response\nGetModelTemplateRequest,get_model_template_request\nGetModelTemplateResponse,get_model_template_response\nGetModelVersionRequest,get_model_version_request\nGetModelVersionResult,get_model_version_result\nGetModelsRequest,get_models_request\nGetModelsResponse,get_models_response\nGetModelsResult,get_models_result\nGetMonitorInput,get_monitor_input\nGetMonitorOutput,get_monitor_output\nGetMonitoringSubscriptionRequest,get_monitoring_subscription_request\nGetMonitoringSubscriptionResult,get_monitoring_subscription_result\nGetMultiRegionAccessPointPolicyRequest,get_multi_region_access_point_policy_request\nGetMultiRegionAccessPointPolicyResult,get_multi_region_access_point_policy_result\nGetMultiRegionAccessPointPolicyStatusRequest,get_multi_region_access_point_policy_status_request\nGetMultiRegionAccessPointPolicyStatusResult,get_multi_region_access_point_policy_status_result\nGetMultiRegionAccessPointRequest,get_multi_region_access_point_request\nGetMultiRegionAccessPointResult,get_multi_region_access_point_result\nGetMultiRegionAccessPointRoutesRequest,get_multi_region_access_point_routes_request\nGetMultiRegionAccessPointRoutesResult,get_multi_region_access_point_routes_result\nGetMulticastGroupRequest,get_multicast_group_request\nGetMulticastGroupResponse,get_multicast_group_response\nGetMulticastGroupSessionRequest,get_multicast_group_session_request\nGetMulticastGroupSessionResponse,get_multicast_group_session_response\nGetNamedQueryInput,get_named_query_input\nGetNamedQueryOutput,get_named_query_output\nGetNamespaceDeletionStatusResponse,get_namespace_deletion_status_response\nGetNamespaceRequest,get_namespace_request\nGetNamespaceResponse,get_namespace_response\nGetNetworkAnalyzerConfigurationRequest,get_network_analyzer_configuration_request\nGetNetworkAnalyzerConfigurationResponse,get_network_analyzer_configuration_response\nGetNetworkInput,get_network_input\nGetNetworkInsightsAccessScopeAnalysisFindingsRequest,get_network_insights_access_scope_analysis_findings_request\nGetNetworkInsightsAccessScopeAnalysisFindingsResult,get_network_insights_access_scope_analysis_findings_result\nGetNetworkInsightsAccessScopeContentRequest,get_network_insights_access_scope_content_request\nGetNetworkInsightsAccessScopeContentResult,get_network_insights_access_scope_content_result\nGetNetworkOutput,get_network_output\nGetNetworkProfileRequest,get_network_profile_request\nGetNetworkProfileResponse,get_network_profile_response\nGetNetworkProfileResult,get_network_profile_result\nGetNetworkRequest,get_network_request\nGetNetworkResourceCountsRequest,get_network_resource_counts_request\nGetNetworkResourceCountsResponse,get_network_resource_counts_response\nGetNetworkResourceRelationshipsRequest,get_network_resource_relationships_request\nGetNetworkResourceRelationshipsResponse,get_network_resource_relationships_response\nGetNetworkResourceRequest,get_network_resource_request\nGetNetworkResourceResponse,get_network_resource_response\nGetNetworkResourcesRequest,get_network_resources_request\nGetNetworkResourcesResponse,get_network_resources_response\nGetNetworkResponse,get_network_response\nGetNetworkRoutesRequest,get_network_routes_request\nGetNetworkRoutesResponse,get_network_routes_response\nGetNetworkSettingsRequest,get_network_settings_request\nGetNetworkSettingsResponse,get_network_settings_response\nGetNetworkSiteRequest,get_network_site_request\nGetNetworkSiteResponse,get_network_site_response\nGetNetworkTelemetryRequest,get_network_telemetry_request\nGetNetworkTelemetryResponse,get_network_telemetry_response\nGetNodeInput,get_node_input\nGetNodeOutput,get_node_output\nGetNotebookMetadataInput,get_notebook_metadata_input\nGetNotebookMetadataOutput,get_notebook_metadata_output\nGetNotificationChannelResponse,get_notification_channel_response\nGetNotificationConfigurationRequest,get_notification_configuration_request\nGetNotificationConfigurationResponse,get_notification_configuration_response\nGetOTAUpdateRequest,get_ota_update_request\nGetOTAUpdateResponse,get_ota_update_response\nGetObjectAclOutput,get_object_acl_output\nGetObjectAclRequest,get_object_acl_request\nGetObjectAttributes,get_object_attributes\nGetObjectAttributesOutput,get_object_attributes_output\nGetObjectAttributesParts,get_object_attributes_parts\nGetObjectAttributesRequest,get_object_attributes_request\nGetObjectAttributesResponse,get_object_attributes_response\nGetObjectInformation,get_object_information\nGetObjectInformationRequest,get_object_information_request\nGetObjectInformationResponse,get_object_information_response\nGetObjectLegalHoldOutput,get_object_legal_hold_output\nGetObjectLegalHoldRequest,get_object_legal_hold_request\nGetObjectLockConfigurationOutput,get_object_lock_configuration_output\nGetObjectLockConfigurationRequest,get_object_lock_configuration_request\nGetObjectMetadataInput,get_object_metadata_input\nGetObjectMetadataOutput,get_object_metadata_output\nGetObjectOutput,get_object_output\nGetObjectRequest,get_object_request\nGetObjectResponse,get_object_response\nGetObjectRetentionOutput,get_object_retention_output\nGetObjectRetentionRequest,get_object_retention_request\nGetObjectTaggingOutput,get_object_tagging_output\nGetObjectTaggingRequest,get_object_tagging_request\nGetObjectTorrentOutput,get_object_torrent_output\nGetObjectTorrentRequest,get_object_torrent_request\nGetOfferingStatusRequest,get_offering_status_request\nGetOfferingStatusResult,get_offering_status_result\nGetOnPremisesInstanceInput,get_on_premises_instance_input\nGetOnPremisesInstanceOutput,get_on_premises_instance_output\nGetOpenCypherQueryStatusInput,get_open_cypher_query_status_input\nGetOpenCypherQueryStatusOutput,get_open_cypher_query_status_output\nGetOpenIDConnectProviderRequest,get_open_id_connect_provider_request\nGetOpenIDConnectProviderResponse,get_open_id_connect_provider_response\nGetOpenIdTokenForDeveloperIdentityInput,get_open_id_token_for_developer_identity_input\nGetOpenIdTokenForDeveloperIdentityResponse,get_open_id_token_for_developer_identity_response\nGetOpenIdTokenInput,get_open_id_token_input\nGetOpenIdTokenResponse,get_open_id_token_response\nGetOperationDetailRequest,get_operation_detail_request\nGetOperationDetailResponse,get_operation_detail_response\nGetOperationInput,get_operation_input\nGetOperationOutput,get_operation_output\nGetOperationRequest,get_operation_request\nGetOperationResponse,get_operation_response\nGetOperationResult,get_operation_result\nGetOperationsForResourceRequest,get_operations_for_resource_request\nGetOperationsForResourceResult,get_operations_for_resource_result\nGetOperationsRequest,get_operations_request\nGetOperationsResult,get_operations_result\nGetOpsItemRequest,get_ops_item_request\nGetOpsItemResponse,get_ops_item_response\nGetOpsMetadataRequest,get_ops_metadata_request\nGetOpsMetadataResult,get_ops_metadata_result\nGetOpsSummaryRequest,get_ops_summary_request\nGetOpsSummaryResult,get_ops_summary_result\nGetOrderInput,get_order_input\nGetOrderOutput,get_order_output\nGetOrderRequest,get_order_request\nGetOrderResponse,get_order_response\nGetOrganizationAdminAccountResponse,get_organization_admin_account_response\nGetOrganizationConfigRuleDetailedStatusRequest,get_organization_config_rule_detailed_status_request\nGetOrganizationConfigRuleDetailedStatusResponse,get_organization_config_rule_detailed_status_response\nGetOrganizationConformancePackDetailedStatusRequest,get_organization_conformance_pack_detailed_status_request\nGetOrganizationConformancePackDetailedStatusResponse,get_organization_conformance_pack_detailed_status_response\nGetOrganizationCustomRulePolicyRequest,get_organization_custom_rule_policy_request\nGetOrganizationCustomRulePolicyResponse,get_organization_custom_rule_policy_response\nGetOrganizationsAccessReportRequest,get_organizations_access_report_request\nGetOrganizationsAccessReportResponse,get_organizations_access_report_response\nGetOriginAccessControlConfigRequest,get_origin_access_control_config_request\nGetOriginAccessControlConfigResult,get_origin_access_control_config_result\nGetOriginAccessControlRequest,get_origin_access_control_request\nGetOriginAccessControlResult,get_origin_access_control_result\nGetOriginEndpointPolicyRequest,get_origin_endpoint_policy_request\nGetOriginEndpointPolicyResponse,get_origin_endpoint_policy_response\nGetOriginEndpointRequest,get_origin_endpoint_request\nGetOriginEndpointResponse,get_origin_endpoint_response\nGetOriginRequestPolicyConfigRequest,get_origin_request_policy_config_request\nGetOriginRequestPolicyConfigResult,get_origin_request_policy_config_result\nGetOriginRequestPolicyRequest,get_origin_request_policy_request\nGetOriginRequestPolicyResult,get_origin_request_policy_result\nGetOutcomesRequest,get_outcomes_request\nGetOutcomesResult,get_outcomes_result\nGetOutpostInput,get_outpost_input\nGetOutpostInstanceTypesInput,get_outpost_instance_types_input\nGetOutpostInstanceTypesOutput,get_outpost_instance_types_output\nGetOutpostOutput,get_outpost_output\nGetOutpostResolverRequest,get_outpost_resolver_request\nGetOutpostResolverResponse,get_outpost_resolver_response\nGetPackageConfigurationResponse,get_package_configuration_response\nGetPackageRequest,get_package_request\nGetPackageResponse,get_package_response\nGetPackageVersionAssetRequest,get_package_version_asset_request\nGetPackageVersionAssetResult,get_package_version_asset_result\nGetPackageVersionHistoryRequest,get_package_version_history_request\nGetPackageVersionHistoryResponse,get_package_version_history_response\nGetPackageVersionReadmeRequest,get_package_version_readme_request\nGetPackageVersionReadmeResult,get_package_version_readme_result\nGetPackageVersionRequest,get_package_version_request\nGetPackageVersionResponse,get_package_version_response\nGetParallelDataRequest,get_parallel_data_request\nGetParallelDataResponse,get_parallel_data_response\nGetParameterHistoryRequest,get_parameter_history_request\nGetParameterHistoryResult,get_parameter_history_result\nGetParameterRequest,get_parameter_request\nGetParameterResult,get_parameter_result\nGetParametersByPathRequest,get_parameters_by_path_request\nGetParametersByPathResult,get_parameters_by_path_result\nGetParametersForExportInput,get_parameters_for_export_input\nGetParametersForExportOutput,get_parameters_for_export_output\nGetParametersForImportInput,get_parameters_for_import_input\nGetParametersForImportOutput,get_parameters_for_import_output\nGetParametersForImportRequest,get_parameters_for_import_request\nGetParametersForImportResponse,get_parameters_for_import_response\nGetParametersRequest,get_parameters_request\nGetParametersResult,get_parameters_result\nGetParticipantRequest,get_participant_request\nGetParticipantResponse,get_participant_response\nGetPartitionIndexesRequest,get_partition_indexes_request\nGetPartitionIndexesResponse,get_partition_indexes_response\nGetPartitionRequest,get_partition_request\nGetPartitionResponse,get_partition_response\nGetPartitionsRequest,get_partitions_request\nGetPartitionsResponse,get_partitions_response\nGetPartnerAccountRequest,get_partner_account_request\nGetPartnerAccountResponse,get_partner_account_response\nGetPasswordDataRequest,get_password_data_request\nGetPasswordDataResult,get_password_data_result\nGetPatchBaselineForPatchGroupRequest,get_patch_baseline_for_patch_group_request\nGetPatchBaselineForPatchGroupResult,get_patch_baseline_for_patch_group_result\nGetPatchBaselineRequest,get_patch_baseline_request\nGetPatchBaselineResult,get_patch_baseline_result\nGetPendingJobExecutionsRequest,get_pending_job_executions_request\nGetPendingJobExecutionsResponse,get_pending_job_executions_response\nGetPercentilesRequest,get_percentiles_request\nGetPercentilesResponse,get_percentiles_response\nGetPerformanceAnalysisReportRequest,get_performance_analysis_report_request\nGetPerformanceAnalysisReportResponse,get_performance_analysis_report_response\nGetPermissionGroupRequest,get_permission_group_request\nGetPermissionGroupResponse,get_permission_group_response\nGetPermissionPolicyRequest,get_permission_policy_request\nGetPermissionPolicyResponse,get_permission_policy_response\nGetPermissionRequest,get_permission_request\nGetPermissionResponse,get_permission_response\nGetPermissionsBoundaryForPermissionSetRequest,get_permissions_boundary_for_permission_set_request\nGetPermissionsBoundaryForPermissionSetResponse,get_permissions_boundary_for_permission_set_response\nGetPersonTrackingRequest,get_person_tracking_request\nGetPersonTrackingResponse,get_person_tracking_response\nGetPersonalizedRankingRequest,get_personalized_ranking_request\nGetPersonalizedRankingResponse,get_personalized_ranking_response\nGetPhoneNumberOrderRequest,get_phone_number_order_request\nGetPhoneNumberOrderResponse,get_phone_number_order_response\nGetPhoneNumberRequest,get_phone_number_request\nGetPhoneNumberResponse,get_phone_number_response\nGetPhoneNumberSettingsResponse,get_phone_number_settings_response\nGetPipelineBlueprintRequest,get_pipeline_blueprint_request\nGetPipelineBlueprintResponse,get_pipeline_blueprint_response\nGetPipelineChangeProgressRequest,get_pipeline_change_progress_request\nGetPipelineChangeProgressResponse,get_pipeline_change_progress_response\nGetPipelineDefinitionInput,get_pipeline_definition_input\nGetPipelineDefinitionOutput,get_pipeline_definition_output\nGetPipelineExecutionInput,get_pipeline_execution_input\nGetPipelineExecutionOutput,get_pipeline_execution_output\nGetPipelineInput,get_pipeline_input\nGetPipelineOutput,get_pipeline_output\nGetPipelineRequest,get_pipeline_request\nGetPipelineResponse,get_pipeline_response\nGetPipelineStateInput,get_pipeline_state_input\nGetPipelineStateOutput,get_pipeline_state_output\nGetPlaceRequest,get_place_request\nGetPlaceResponse,get_place_response\nGetPlanRequest,get_plan_request\nGetPlanResponse,get_plan_response\nGetPlatformApplicationAttributesInput,get_platform_application_attributes_input\nGetPlatformApplicationAttributesResponse,get_platform_application_attributes_response\nGetPlaybackConfigurationRequest,get_playback_configuration_request\nGetPlaybackConfigurationResponse,get_playback_configuration_response\nGetPlaybackKeyPairRequest,get_playback_key_pair_request\nGetPlaybackKeyPairResponse,get_playback_key_pair_response\nGetPlayerConnectionStatusRequest,get_player_connection_status_request\nGetPlayerConnectionStatusResult,get_player_connection_status_result\nGetPoliciesStatsResponse,get_policies_stats_response\nGetPolicyInput,get_policy_input\nGetPolicyOutput,get_policy_output\nGetPolicyRequest,get_policy_request\nGetPolicyResponse,get_policy_response\nGetPolicyStoreInput,get_policy_store_input\nGetPolicyStoreOutput,get_policy_store_output\nGetPolicyTemplateInput,get_policy_template_input\nGetPolicyTemplateOutput,get_policy_template_output\nGetPolicyVersionRequest,get_policy_version_request\nGetPolicyVersionResponse,get_policy_version_response\nGetPortalRequest,get_portal_request\nGetPortalResponse,get_portal_response\nGetPortalServiceProviderMetadataRequest,get_portal_service_provider_metadata_request\nGetPortalServiceProviderMetadataResponse,get_portal_service_provider_metadata_response\nGetPortfolioPreferencesResponse,get_portfolio_preferences_response\nGetPortfolioSummaryResponse,get_portfolio_summary_response\nGetPositionConfigurationRequest,get_position_configuration_request\nGetPositionConfigurationResponse,get_position_configuration_response\nGetPositionEstimateRequest,get_position_estimate_request\nGetPositionEstimateResponse,get_position_estimate_response\nGetPositionRequest,get_position_request\nGetPositionResponse,get_position_response\nGetPredictiveScalingForecastAnswer,get_predictive_scaling_forecast_answer\nGetPredictiveScalingForecastType,get_predictive_scaling_forecast_type\nGetPrefetchScheduleRequest,get_prefetch_schedule_request\nGetPrefetchScheduleResponse,get_prefetch_schedule_response\nGetPreparedStatementInput,get_prepared_statement_input\nGetPreparedStatementOutput,get_prepared_statement_output\nGetPresetRequest,get_preset_request\nGetPresetResponse,get_preset_response\nGetPriceListFileUrlRequest,get_price_list_file_url_request\nGetPriceListFileUrlResponse,get_price_list_file_url_response\nGetPricingPlanResponse,get_pricing_plan_response\nGetPrincipalTagAttributeMapInput,get_principal_tag_attribute_map_input\nGetPrincipalTagAttributeMapResponse,get_principal_tag_attribute_map_response\nGetProductsRequest,get_products_request\nGetProductsResponse,get_products_response\nGetProfileInput,get_profile_input\nGetProfileObjectTypeRequest,get_profile_object_type_request\nGetProfileObjectTypeResponse,get_profile_object_type_response\nGetProfileObjectTypeTemplateRequest,get_profile_object_type_template_request\nGetProfileObjectTypeTemplateResponse,get_profile_object_type_template_response\nGetProfileOutput,get_profile_output\nGetProfileRequest,get_profile_request\nGetProfileResponse,get_profile_response\nGetProfileTemplateOutput,get_profile_template_output\nGetProgrammaticAccessCredentialsRequest,get_programmatic_access_credentials_request\nGetProgrammaticAccessCredentialsResponse,get_programmatic_access_credentials_response\nGetProjectRequest,get_project_request\nGetProjectResponse,get_project_response\nGetProjectResult,get_project_result\nGetPromptFileRequest,get_prompt_file_request\nGetPromptFileResponse,get_prompt_file_response\nGetPropertyValueHistoryRequest,get_property_value_history_request\nGetPropertyValueHistoryResponse,get_property_value_history_response\nGetPropertyValueRequest,get_property_value_request\nGetPropertyValueResponse,get_property_value_response\nGetPropertygraphStatisticsOutput,get_propertygraph_statistics_output\nGetPropertygraphStreamInput,get_propertygraph_stream_input\nGetPropertygraphStreamOutput,get_propertygraph_stream_output\nGetPropertygraphSummaryInput,get_propertygraph_summary_input\nGetPropertygraphSummaryOutput,get_propertygraph_summary_output\nGetProposalInput,get_proposal_input\nGetProposalOutput,get_proposal_output\nGetProtectedQueryInput,get_protected_query_input\nGetProtectedQueryOutput,get_protected_query_output\nGetProtectionStatusRequest,get_protection_status_request\nGetProtectionStatusResponse,get_protection_status_response\nGetProtocolsListRequest,get_protocols_list_request\nGetProtocolsListResponse,get_protocols_list_response\nGetProvisionedConcurrencyConfigRequest,get_provisioned_concurrency_config_request\nGetProvisionedConcurrencyConfigResponse,get_provisioned_concurrency_config_response\nGetProvisionedModelThroughputRequest,get_provisioned_model_throughput_request\nGetProvisionedModelThroughputResponse,get_provisioned_model_throughput_response\nGetProvisionedProductOutputsInput,get_provisioned_product_outputs_input\nGetProvisionedProductOutputsOutput,get_provisioned_product_outputs_output\nGetProxySessionRequest,get_proxy_session_request\nGetProxySessionResponse,get_proxy_session_response\nGetPublicAccessBlockOutput,get_public_access_block_output\nGetPublicAccessBlockRequest,get_public_access_block_request\nGetPublicKeyCertificateInput,get_public_key_certificate_input\nGetPublicKeyCertificateOutput,get_public_key_certificate_output\nGetPublicKeyConfigRequest,get_public_key_config_request\nGetPublicKeyConfigResult,get_public_key_config_result\nGetPublicKeyRequest,get_public_key_request\nGetPublicKeyResponse,get_public_key_response\nGetPublicKeyResult,get_public_key_result\nGetPullRequestApprovalStatesInput,get_pull_request_approval_states_input\nGetPullRequestApprovalStatesOutput,get_pull_request_approval_states_output\nGetPullRequestInput,get_pull_request_input\nGetPullRequestOutput,get_pull_request_output\nGetPullRequestOverrideStateInput,get_pull_request_override_state_input\nGetPullRequestOverrideStateOutput,get_pull_request_override_state_output\nGetPushTemplateRequest,get_push_template_request\nGetPushTemplateResponse,get_push_template_response\nGetQualificationScoreRequest,get_qualification_score_request\nGetQualificationScoreResponse,get_qualification_score_response\nGetQualificationTypeRequest,get_qualification_type_request\nGetQualificationTypeResponse,get_qualification_type_response\nGetQuantumTaskRequest,get_quantum_task_request\nGetQuantumTaskResponse,get_quantum_task_response\nGetQueryExecutionInput,get_query_execution_input\nGetQueryExecutionOutput,get_query_execution_output\nGetQueryLoggingConfigRequest,get_query_logging_config_request\nGetQueryLoggingConfigResponse,get_query_logging_config_response\nGetQueryResultsInput,get_query_results_input\nGetQueryResultsOutput,get_query_results_output\nGetQueryResultsRequest,get_query_results_request\nGetQueryResultsResponse,get_query_results_response\nGetQueryRuntimeStatisticsInput,get_query_runtime_statistics_input\nGetQueryRuntimeStatisticsOutput,get_query_runtime_statistics_output\nGetQueryStateRequest,get_query_state_request\nGetQueryStateResponse,get_query_state_response\nGetQueryStatisticsRequest,get_query_statistics_request\nGetQueryStatisticsResponse,get_query_statistics_response\nGetQuerySuggestionsRequest,get_query_suggestions_request\nGetQuerySuggestionsResponse,get_query_suggestions_response\nGetQueueAttributesRequest,get_queue_attributes_request\nGetQueueAttributesResult,get_queue_attributes_result\nGetQueueRequest,get_queue_request\nGetQueueResponse,get_queue_response\nGetQueueUrlRequest,get_queue_url_request\nGetQueueUrlResult,get_queue_url_result\nGetRDFGraphSummaryInput,get_rdf_graph_summary_input\nGetRDFGraphSummaryOutput,get_rdf_graph_summary_output\nGetRandomPasswordRequest,get_random_password_request\nGetRandomPasswordResponse,get_random_password_response\nGetRasterDataCollectionInput,get_raster_data_collection_input\nGetRasterDataCollectionOutput,get_raster_data_collection_output\nGetRateBasedRuleManagedKeysRequest,get_rate_based_rule_managed_keys_request\nGetRateBasedRuleManagedKeysResponse,get_rate_based_rule_managed_keys_response\nGetRateBasedRuleRequest,get_rate_based_rule_request\nGetRateBasedRuleResponse,get_rate_based_rule_response\nGetRateBasedStatementManagedKeysRequest,get_rate_based_statement_managed_keys_request\nGetRateBasedStatementManagedKeysResponse,get_rate_based_statement_managed_keys_response\nGetRawMessageContentRequest,get_raw_message_content_request\nGetRawMessageContentResponse,get_raw_message_content_response\nGetReadSetActivationJobRequest,get_read_set_activation_job_request\nGetReadSetActivationJobResponse,get_read_set_activation_job_response\nGetReadSetExportJobRequest,get_read_set_export_job_request\nGetReadSetExportJobResponse,get_read_set_export_job_response\nGetReadSetImportJobRequest,get_read_set_import_job_request\nGetReadSetImportJobResponse,get_read_set_import_job_response\nGetReadSetMetadataRequest,get_read_set_metadata_request\nGetReadSetMetadataResponse,get_read_set_metadata_response\nGetReadSetRequest,get_read_set_request\nGetReadSetResponse,get_read_set_response\nGetReadinessCheckRequest,get_readiness_check_request\nGetReadinessCheckResourceStatusRequest,get_readiness_check_resource_status_request\nGetReadinessCheckResourceStatusResponse,get_readiness_check_resource_status_response\nGetReadinessCheckResponse,get_readiness_check_response\nGetReadinessCheckStatusRequest,get_readiness_check_status_request\nGetReadinessCheckStatusResponse,get_readiness_check_status_response\nGetRealtimeLogConfigRequest,get_realtime_log_config_request\nGetRealtimeLogConfigResult,get_realtime_log_config_result\nGetRecommendationError,get_recommendation_error\nGetRecommendationPreferencesRequest,get_recommendation_preferences_request\nGetRecommendationPreferencesResponse,get_recommendation_preferences_response\nGetRecommendationReportDetailsRequest,get_recommendation_report_details_request\nGetRecommendationReportDetailsResponse,get_recommendation_report_details_response\nGetRecommendationSummariesRequest,get_recommendation_summaries_request\nGetRecommendationSummariesResponse,get_recommendation_summaries_response\nGetRecommendationsRequest,get_recommendations_request\nGetRecommendationsResponse,get_recommendations_response\nGetRecommenderConfigurationRequest,get_recommender_configuration_request\nGetRecommenderConfigurationResponse,get_recommender_configuration_response\nGetRecommenderConfigurationsRequest,get_recommender_configurations_request\nGetRecommenderConfigurationsResponse,get_recommender_configurations_response\nGetRecordRequest,get_record_request\nGetRecordResponse,get_record_response\nGetRecordingConfigurationRequest,get_recording_configuration_request\nGetRecordingConfigurationResponse,get_recording_configuration_response\nGetRecordsInput,get_records_input\nGetRecordsOutput,get_records_output\nGetRecoveryGroupReadinessSummaryRequest,get_recovery_group_readiness_summary_request\nGetRecoveryGroupReadinessSummaryResponse,get_recovery_group_readiness_summary_response\nGetRecoveryGroupRequest,get_recovery_group_request\nGetRecoveryGroupResponse,get_recovery_group_response\nGetRecoveryPointRequest,get_recovery_point_request\nGetRecoveryPointResponse,get_recovery_point_response\nGetRecoveryPointRestoreMetadataInput,get_recovery_point_restore_metadata_input\nGetRecoveryPointRestoreMetadataOutput,get_recovery_point_restore_metadata_output\nGetReferenceImportJobRequest,get_reference_import_job_request\nGetReferenceImportJobResponse,get_reference_import_job_response\nGetReferenceMetadataRequest,get_reference_metadata_request\nGetReferenceMetadataResponse,get_reference_metadata_response\nGetReferenceRequest,get_reference_request\nGetReferenceResponse,get_reference_response\nGetReferenceStoreRequest,get_reference_store_request\nGetReferenceStoreResponse,get_reference_store_response\nGetRegexMatchSetRequest,get_regex_match_set_request\nGetRegexMatchSetResponse,get_regex_match_set_response\nGetRegexPatternSetRequest,get_regex_pattern_set_request\nGetRegexPatternSetResponse,get_regex_pattern_set_response\nGetRegionOptStatusRequest,get_region_opt_status_request\nGetRegionOptStatusResponse,get_region_opt_status_response\nGetRegionsRequest,get_regions_request\nGetRegionsResult,get_regions_result\nGetRegisterAccountStatusResponse,get_register_account_status_response\nGetRegistrationCodeResponse,get_registration_code_response\nGetRegistryCatalogDataResponse,get_registry_catalog_data_response\nGetRegistryInput,get_registry_input\nGetRegistryPolicyResponse,get_registry_policy_response\nGetRegistryResponse,get_registry_response\nGetRegistryScanningConfigurationResponse,get_registry_scanning_configuration_response\nGetRelationalDatabaseBlueprintsRequest,get_relational_database_blueprints_request\nGetRelationalDatabaseBlueprintsResult,get_relational_database_blueprints_result\nGetRelationalDatabaseBundlesRequest,get_relational_database_bundles_request\nGetRelationalDatabaseBundlesResult,get_relational_database_bundles_result\nGetRelationalDatabaseEventsRequest,get_relational_database_events_request\nGetRelationalDatabaseEventsResult,get_relational_database_events_result\nGetRelationalDatabaseLogEventsRequest,get_relational_database_log_events_request\nGetRelationalDatabaseLogEventsResult,get_relational_database_log_events_result\nGetRelationalDatabaseLogStreamsRequest,get_relational_database_log_streams_request\nGetRelationalDatabaseLogStreamsResult,get_relational_database_log_streams_result\nGetRelationalDatabaseMasterUserPasswordRequest,get_relational_database_master_user_password_request\nGetRelationalDatabaseMasterUserPasswordResult,get_relational_database_master_user_password_result\nGetRelationalDatabaseMetricDataRequest,get_relational_database_metric_data_request\nGetRelationalDatabaseMetricDataResult,get_relational_database_metric_data_result\nGetRelationalDatabaseParametersRequest,get_relational_database_parameters_request\nGetRelationalDatabaseParametersResult,get_relational_database_parameters_result\nGetRelationalDatabaseRequest,get_relational_database_request\nGetRelationalDatabaseResult,get_relational_database_result\nGetRelationalDatabaseSnapshotRequest,get_relational_database_snapshot_request\nGetRelationalDatabaseSnapshotResult,get_relational_database_snapshot_result\nGetRelationalDatabaseSnapshotsRequest,get_relational_database_snapshots_request\nGetRelationalDatabaseSnapshotsResult,get_relational_database_snapshots_result\nGetRelationalDatabasesRequest,get_relational_databases_request\nGetRelationalDatabasesResult,get_relational_databases_result\nGetRemainingFreeTrialDaysRequest,get_remaining_free_trial_days_request\nGetRemainingFreeTrialDaysResponse,get_remaining_free_trial_days_response\nGetRemoteAccessSessionRequest,get_remote_access_session_request\nGetRemoteAccessSessionResult,get_remote_access_session_result\nGetReplicationConfigurationRequest,get_replication_configuration_request\nGetReplicationJobsRequest,get_replication_jobs_request\nGetReplicationJobsResponse,get_replication_jobs_response\nGetReplicationRunsRequest,get_replication_runs_request\nGetReplicationRunsResponse,get_replication_runs_response\nGetReplicationSetInput,get_replication_set_input\nGetReplicationSetOutput,get_replication_set_output\nGetReportDefinitionRequest,get_report_definition_request\nGetReportDefinitionResult,get_report_definition_result\nGetReportGroupTrendInput,get_report_group_trend_input\nGetReportGroupTrendOutput,get_report_group_trend_output\nGetRepositoryCatalogDataRequest,get_repository_catalog_data_request\nGetRepositoryCatalogDataResponse,get_repository_catalog_data_response\nGetRepositoryEndpointRequest,get_repository_endpoint_request\nGetRepositoryEndpointResult,get_repository_endpoint_result\nGetRepositoryInput,get_repository_input\nGetRepositoryOutput,get_repository_output\nGetRepositoryPermissionsPolicyRequest,get_repository_permissions_policy_request\nGetRepositoryPermissionsPolicyResult,get_repository_permissions_policy_result\nGetRepositoryPolicyRequest,get_repository_policy_request\nGetRepositoryPolicyResponse,get_repository_policy_response\nGetRepositorySyncStatusInput,get_repository_sync_status_input\nGetRepositorySyncStatusOutput,get_repository_sync_status_output\nGetRepositoryTriggersInput,get_repository_triggers_input\nGetRepositoryTriggersOutput,get_repository_triggers_output\nGetRequestMetadata,get_request_metadata\nGetRequestValidatorRequest,get_request_validator_request\nGetRequestValidatorsRequest,get_request_validators_request\nGetRequestedServiceQuotaChangeRequest,get_requested_service_quota_change_request\nGetRequestedServiceQuotaChangeResponse,get_requested_service_quota_change_response\nGetReservationCoverageRequest,get_reservation_coverage_request\nGetReservationCoverageResponse,get_reservation_coverage_response\nGetReservationPurchaseRecommendationRequest,get_reservation_purchase_recommendation_request\nGetReservationPurchaseRecommendationResponse,get_reservation_purchase_recommendation_response\nGetReservationUtilizationRequest,get_reservation_utilization_request\nGetReservationUtilizationResponse,get_reservation_utilization_response\nGetReservedInstancesExchangeQuoteRequest,get_reserved_instances_exchange_quote_request\nGetReservedInstancesExchangeQuoteResult,get_reserved_instances_exchange_quote_result\nGetReservedNodeExchangeConfigurationOptionsInputMessage,get_reserved_node_exchange_configuration_options_input_message\nGetReservedNodeExchangeConfigurationOptionsOutputMessage,get_reserved_node_exchange_configuration_options_output_message\nGetReservedNodeExchangeOfferingsInputMessage,get_reserved_node_exchange_offerings_input_message\nGetReservedNodeExchangeOfferingsOutputMessage,get_reserved_node_exchange_offerings_output_message\nGetResolverConfigRequest,get_resolver_config_request\nGetResolverConfigResponse,get_resolver_config_response\nGetResolverDnssecConfigRequest,get_resolver_dnssec_config_request\nGetResolverDnssecConfigResponse,get_resolver_dnssec_config_response\nGetResolverEndpointRequest,get_resolver_endpoint_request\nGetResolverEndpointResponse,get_resolver_endpoint_response\nGetResolverQueryLogConfigAssociationRequest,get_resolver_query_log_config_association_request\nGetResolverQueryLogConfigAssociationResponse,get_resolver_query_log_config_association_response\nGetResolverQueryLogConfigPolicyRequest,get_resolver_query_log_config_policy_request\nGetResolverQueryLogConfigPolicyResponse,get_resolver_query_log_config_policy_response\nGetResolverQueryLogConfigRequest,get_resolver_query_log_config_request\nGetResolverQueryLogConfigResponse,get_resolver_query_log_config_response\nGetResolverRequest,get_resolver_request\nGetResolverResponse,get_resolver_response\nGetResolverRuleAssociationRequest,get_resolver_rule_association_request\nGetResolverRuleAssociationResponse,get_resolver_rule_association_response\nGetResolverRulePolicyRequest,get_resolver_rule_policy_request\nGetResolverRulePolicyResponse,get_resolver_rule_policy_response\nGetResolverRuleRequest,get_resolver_rule_request\nGetResolverRuleResponse,get_resolver_rule_response\nGetResourceCollectionRequest,get_resource_collection_request\nGetResourceCollectionResponse,get_resource_collection_response\nGetResourceConfigHistoryRequest,get_resource_config_history_request\nGetResourceConfigHistoryResponse,get_resource_config_history_response\nGetResourceDefinitionRequest,get_resource_definition_request\nGetResourceDefinitionResponse,get_resource_definition_response\nGetResourceDefinitionVersionRequest,get_resource_definition_version_request\nGetResourceDefinitionVersionResponse,get_resource_definition_version_response\nGetResourceEvaluationSummaryRequest,get_resource_evaluation_summary_request\nGetResourceEvaluationSummaryResponse,get_resource_evaluation_summary_response\nGetResourceEventConfigurationRequest,get_resource_event_configuration_request\nGetResourceEventConfigurationResponse,get_resource_event_configuration_response\nGetResourceInput,get_resource_input\nGetResourceLFTagsRequest,get_resource_lf_tags_request\nGetResourceLFTagsResponse,get_resource_lf_tags_response\nGetResourceLogLevelRequest,get_resource_log_level_request\nGetResourceLogLevelResponse,get_resource_log_level_response\nGetResourceMetadataRequest,get_resource_metadata_request\nGetResourceMetadataResponse,get_resource_metadata_response\nGetResourceMetricsRequest,get_resource_metrics_request\nGetResourceMetricsResponse,get_resource_metrics_response\nGetResourceOutput,get_resource_output\nGetResourcePermissionInput,get_resource_permission_input\nGetResourcePermissionOutput,get_resource_permission_output\nGetResourcePoliciesInput,get_resource_policies_input\nGetResourcePoliciesOutput,get_resource_policies_output\nGetResourcePoliciesRequest,get_resource_policies_request\nGetResourcePoliciesResponse,get_resource_policies_response\nGetResourcePoliciesResponseEntry,get_resource_policies_response_entry\nGetResourcePoliciesResponseList,get_resource_policies_response_list\nGetResourcePolicyInput,get_resource_policy_input\nGetResourcePolicyOutput,get_resource_policy_output\nGetResourcePolicyRequest,get_resource_policy_request\nGetResourcePolicyResponse,get_resource_policy_response\nGetResourcePositionRequest,get_resource_position_request\nGetResourcePositionResponse,get_resource_position_response\nGetResourceProfileRequest,get_resource_profile_request\nGetResourceProfileResponse,get_resource_profile_response\nGetResourceRequest,get_resource_request\nGetResourceRequestStatusInput,get_resource_request_status_input\nGetResourceRequestStatusOutput,get_resource_request_status_output\nGetResourceSetRequest,get_resource_set_request\nGetResourceSetResponse,get_resource_set_response\nGetResourceShareAssociationsRequest,get_resource_share_associations_request\nGetResourceShareAssociationsResponse,get_resource_share_associations_response\nGetResourceShareInvitationsRequest,get_resource_share_invitations_request\nGetResourceShareInvitationsResponse,get_resource_share_invitations_response\nGetResourceSharesRequest,get_resource_shares_request\nGetResourceSharesResponse,get_resource_shares_response\nGetResourcesInput,get_resources_input\nGetResourcesOutput,get_resources_output\nGetResourcesRequest,get_resources_request\nGetResourcesResponse,get_resources_response\nGetResourcesSummaryOutput,get_resources_summary_output\nGetResponseHeadersPolicyConfigRequest,get_response_headers_policy_config_request\nGetResponseHeadersPolicyConfigResult,get_response_headers_policy_config_result\nGetResponseHeadersPolicyRequest,get_response_headers_policy_request\nGetResponseHeadersPolicyResult,get_response_headers_policy_result\nGetResponsePlanInput,get_response_plan_input\nGetResponsePlanOutput,get_response_plan_output\nGetRestApiRequest,get_rest_api_request\nGetRestApisRequest,get_rest_apis_request\nGetRetainedMessageRequest,get_retained_message_request\nGetRetainedMessageResponse,get_retained_message_response\nGetRetentionSettingsRequest,get_retention_settings_request\nGetRetentionSettingsResponse,get_retention_settings_response\nGetReusableDelegationSetLimitRequest,get_reusable_delegation_set_limit_request\nGetReusableDelegationSetLimitResponse,get_reusable_delegation_set_limit_response\nGetReusableDelegationSetRequest,get_reusable_delegation_set_request\nGetReusableDelegationSetResponse,get_reusable_delegation_set_response\nGetRevealConfigurationResponse,get_reveal_configuration_response\nGetRevisionRequest,get_revision_request\nGetRevisionResponse,get_revision_response\nGetRevocationStatusRequest,get_revocation_status_request\nGetRevocationStatusResponse,get_revocation_status_response\nGetRightsizingRecommendationRequest,get_rightsizing_recommendation_request\nGetRightsizingRecommendationResponse,get_rightsizing_recommendation_response\nGetRoleCredentialsRequest,get_role_credentials_request\nGetRoleCredentialsResponse,get_role_credentials_response\nGetRolePolicyRequest,get_role_policy_request\nGetRolePolicyResponse,get_role_policy_response\nGetRoleRequest,get_role_request\nGetRoleResponse,get_role_response\nGetRoomRequest,get_room_request\nGetRoomResponse,get_room_response\nGetRoomSkillParameterRequest,get_room_skill_parameter_request\nGetRoomSkillParameterResponse,get_room_skill_parameter_response\nGetRotationOverrideRequest,get_rotation_override_request\nGetRotationOverrideResult,get_rotation_override_result\nGetRotationRequest,get_rotation_request\nGetRotationResult,get_rotation_result\nGetRouteAnalysisRequest,get_route_analysis_request\nGetRouteAnalysisResponse,get_route_analysis_response\nGetRouteRequest,get_route_request\nGetRouteResponse,get_route_response\nGetRouteResponseRequest,get_route_response_request\nGetRouteResponseResponse,get_route_response_response\nGetRouteResponsesRequest,get_route_responses_request\nGetRouteResponsesResponse,get_route_responses_response\nGetRouteResult,get_route_result\nGetRoutesRequest,get_routes_request\nGetRoutesResponse,get_routes_response\nGetRoutingControlStateRequest,get_routing_control_state_request\nGetRoutingControlStateResponse,get_routing_control_state_response\nGetRuleGroupRequest,get_rule_group_request\nGetRuleGroupResponse,get_rule_group_response\nGetRuleRequest,get_rule_request\nGetRuleResponse,get_rule_response\nGetRulesRequest,get_rules_request\nGetRulesResult,get_rules_result\nGetRunGroupRequest,get_run_group_request\nGetRunGroupResponse,get_run_group_response\nGetRunRequest,get_run_request\nGetRunResponse,get_run_response\nGetRunResult,get_run_result\nGetRunTaskRequest,get_run_task_request\nGetRunTaskResponse,get_run_task_response\nGetRuntimeManagementConfigRequest,get_runtime_management_config_request\nGetRuntimeManagementConfigResponse,get_runtime_management_config_response\nGetSAMLProviderRequest,get_saml_provider_request\nGetSAMLProviderResponse,get_saml_provider_response\nGetSMSAttributesInput,get_sms_attributes_input\nGetSMSAttributesResponse,get_sms_attributes_response\nGetSMSSandboxAccountStatusResult,get_sms_sandbox_account_status_result\nGetSSHPublicKeyRequest,get_ssh_public_key_request\nGetSSHPublicKeyResponse,get_ssh_public_key_response\nGetSagemakerServicecatalogPortfolioStatusOutput,get_sagemaker_servicecatalog_portfolio_status_output\nGetSampleDataRequest,get_sample_data_request\nGetSampleDataResponse,get_sample_data_response\nGetSampledRequestsRequest,get_sampled_requests_request\nGetSampledRequestsResponse,get_sampled_requests_response\nGetSamplingRulesRequest,get_sampling_rules_request\nGetSamplingRulesResult,get_sampling_rules_result\nGetSamplingStatisticSummariesRequest,get_sampling_statistic_summaries_request\nGetSamplingStatisticSummariesResult,get_sampling_statistic_summaries_result\nGetSamplingTargetsRequest,get_sampling_targets_request\nGetSamplingTargetsResult,get_sampling_targets_result\nGetSatelliteRequest,get_satellite_request\nGetSatelliteResponse,get_satellite_response\nGetSavingsPlanPurchaseRecommendationDetailsRequest,get_savings_plan_purchase_recommendation_details_request\nGetSavingsPlanPurchaseRecommendationDetailsResponse,get_savings_plan_purchase_recommendation_details_response\nGetSavingsPlansCoverageRequest,get_savings_plans_coverage_request\nGetSavingsPlansCoverageResponse,get_savings_plans_coverage_response\nGetSavingsPlansPurchaseRecommendationRequest,get_savings_plans_purchase_recommendation_request\nGetSavingsPlansPurchaseRecommendationResponse,get_savings_plans_purchase_recommendation_response\nGetSavingsPlansUtilizationDetailsRequest,get_savings_plans_utilization_details_request\nGetSavingsPlansUtilizationDetailsResponse,get_savings_plans_utilization_details_response\nGetSavingsPlansUtilizationRequest,get_savings_plans_utilization_request\nGetSavingsPlansUtilizationResponse,get_savings_plans_utilization_response\nGetSbomExportRequest,get_sbom_export_request\nGetSbomExportResponse,get_sbom_export_response\nGetScalingConfigurationRecommendationRequest,get_scaling_configuration_recommendation_request\nGetScalingConfigurationRecommendationResponse,get_scaling_configuration_recommendation_response\nGetScalingPlanResourceForecastDataRequest,get_scaling_plan_resource_forecast_data_request\nGetScalingPlanResourceForecastDataResponse,get_scaling_plan_resource_forecast_data_response\nGetScanRequest,get_scan_request\nGetScanResponse,get_scan_response\nGetSceneRequest,get_scene_request\nGetSceneResponse,get_scene_response\nGetScheduleGroupInput,get_schedule_group_input\nGetScheduleGroupOutput,get_schedule_group_output\nGetScheduleInput,get_schedule_input\nGetScheduleOutput,get_schedule_output\nGetSchemaAnalysisRuleInput,get_schema_analysis_rule_input\nGetSchemaAnalysisRuleOutput,get_schema_analysis_rule_output\nGetSchemaAsJsonRequest,get_schema_as_json_request\nGetSchemaAsJsonResponse,get_schema_as_json_response\nGetSchemaByDefinitionInput,get_schema_by_definition_input\nGetSchemaByDefinitionResponse,get_schema_by_definition_response\nGetSchemaCreationStatusRequest,get_schema_creation_status_request\nGetSchemaCreationStatusResponse,get_schema_creation_status_response\nGetSchemaInput,get_schema_input\nGetSchemaMappingInput,get_schema_mapping_input\nGetSchemaMappingOutput,get_schema_mapping_output\nGetSchemaOutput,get_schema_output\nGetSchemaResponse,get_schema_response\nGetSchemaVersionInput,get_schema_version_input\nGetSchemaVersionResponse,get_schema_version_response\nGetSchemaVersionsDiffInput,get_schema_versions_diff_input\nGetSchemaVersionsDiffResponse,get_schema_versions_diff_response\nGetScreenDataRequest,get_screen_data_request\nGetScreenDataResult,get_screen_data_result\nGetSdkRequest,get_sdk_request\nGetSdkTypeRequest,get_sdk_type_request\nGetSdkTypesRequest,get_sdk_types_request\nGetSearchSuggestionsRequest,get_search_suggestions_request\nGetSearchSuggestionsResponse,get_search_suggestions_response\nGetSecretValueRequest,get_secret_value_request\nGetSecretValueResponse,get_secret_value_response\nGetSecurityConfigRequest,get_security_config_request\nGetSecurityConfigResponse,get_security_config_response\nGetSecurityConfigurationRequest,get_security_configuration_request\nGetSecurityConfigurationResponse,get_security_configuration_response\nGetSecurityConfigurationsRequest,get_security_configurations_request\nGetSecurityConfigurationsResponse,get_security_configurations_response\nGetSecurityPolicyRequest,get_security_policy_request\nGetSecurityPolicyResponse,get_security_policy_response\nGetSegmentDetectionRequest,get_segment_detection_request\nGetSegmentDetectionResponse,get_segment_detection_response\nGetSegmentExportJobsRequest,get_segment_export_jobs_request\nGetSegmentExportJobsResponse,get_segment_export_jobs_response\nGetSegmentImportJobsRequest,get_segment_import_jobs_request\nGetSegmentImportJobsResponse,get_segment_import_jobs_response\nGetSegmentRequest,get_segment_request\nGetSegmentResponse,get_segment_response\nGetSegmentVersionRequest,get_segment_version_request\nGetSegmentVersionResponse,get_segment_version_response\nGetSegmentVersionsRequest,get_segment_versions_request\nGetSegmentVersionsResponse,get_segment_versions_response\nGetSegmentsRequest,get_segments_request\nGetSegmentsResponse,get_segments_response\nGetSendQuotaResponse,get_send_quota_response\nGetSendStatisticsResponse,get_send_statistics_response\nGetSensitiveDataOccurrencesAvailabilityRequest,get_sensitive_data_occurrences_availability_request\nGetSensitiveDataOccurrencesAvailabilityResponse,get_sensitive_data_occurrences_availability_response\nGetSensitiveDataOccurrencesRequest,get_sensitive_data_occurrences_request\nGetSensitiveDataOccurrencesResponse,get_sensitive_data_occurrences_response\nGetSensitivityInspectionTemplateRequest,get_sensitivity_inspection_template_request\nGetSensitivityInspectionTemplateResponse,get_sensitivity_inspection_template_response\nGetSequenceStoreRequest,get_sequence_store_request\nGetSequenceStoreResponse,get_sequence_store_response\nGetSerialConsoleAccessStatusRequest,get_serial_console_access_status_request\nGetSerialConsoleAccessStatusResult,get_serial_console_access_status_result\nGetServerCertificateRequest,get_server_certificate_request\nGetServerCertificateResponse,get_server_certificate_response\nGetServerDetailsRequest,get_server_details_request\nGetServerDetailsResponse,get_server_details_response\nGetServerStrategiesRequest,get_server_strategies_request\nGetServerStrategiesResponse,get_server_strategies_response\nGetServersRequest,get_servers_request\nGetServersResponse,get_servers_response\nGetServiceEndpointRequest,get_service_endpoint_request\nGetServiceEndpointResponse,get_service_endpoint_response\nGetServiceGraphRequest,get_service_graph_request\nGetServiceGraphResult,get_service_graph_result\nGetServiceInput,get_service_input\nGetServiceInstanceInput,get_service_instance_input\nGetServiceInstanceOutput,get_service_instance_output\nGetServiceInstanceSyncStatusInput,get_service_instance_sync_status_input\nGetServiceInstanceSyncStatusOutput,get_service_instance_sync_status_output\nGetServiceLastAccessedDetailsRequest,get_service_last_accessed_details_request\nGetServiceLastAccessedDetailsResponse,get_service_last_accessed_details_response\nGetServiceLastAccessedDetailsWithEntitiesRequest,get_service_last_accessed_details_with_entities_request\nGetServiceLastAccessedDetailsWithEntitiesResponse,get_service_last_accessed_details_with_entities_response\nGetServiceLinkedRoleDeletionStatusRequest,get_service_linked_role_deletion_status_request\nGetServiceLinkedRoleDeletionStatusResponse,get_service_linked_role_deletion_status_response\nGetServiceNetworkRequest,get_service_network_request\nGetServiceNetworkResponse,get_service_network_response\nGetServiceNetworkServiceAssociationRequest,get_service_network_service_association_request\nGetServiceNetworkServiceAssociationResponse,get_service_network_service_association_response\nGetServiceNetworkVpcAssociationRequest,get_service_network_vpc_association_request\nGetServiceNetworkVpcAssociationResponse,get_service_network_vpc_association_response\nGetServiceOutput,get_service_output\nGetServicePrincipalNameRequest,get_service_principal_name_request\nGetServicePrincipalNameResponse,get_service_principal_name_response\nGetServiceProfileRequest,get_service_profile_request\nGetServiceProfileResponse,get_service_profile_response\nGetServiceQuotaIncreaseRequestFromTemplateRequest,get_service_quota_increase_request_from_template_request\nGetServiceQuotaIncreaseRequestFromTemplateResponse,get_service_quota_increase_request_from_template_response\nGetServiceQuotaRequest,get_service_quota_request\nGetServiceQuotaResponse,get_service_quota_response\nGetServiceRequest,get_service_request\nGetServiceResponse,get_service_response\nGetServiceRoleForAccountResponse,get_service_role_for_account_response\nGetServiceSettingRequest,get_service_setting_request\nGetServiceSettingResult,get_service_setting_result\nGetServiceSettingsResponse,get_service_settings_response\nGetServiceSyncBlockerSummaryInput,get_service_sync_blocker_summary_input\nGetServiceSyncBlockerSummaryOutput,get_service_sync_blocker_summary_output\nGetServiceSyncConfigInput,get_service_sync_config_input\nGetServiceSyncConfigOutput,get_service_sync_config_output\nGetServiceTemplateInput,get_service_template_input\nGetServiceTemplateOutput,get_service_template_output\nGetServiceTemplateVersionInput,get_service_template_version_input\nGetServiceTemplateVersionOutput,get_service_template_version_output\nGetServicesInScopeResponse,get_services_in_scope_response\nGetSessionEmbedUrlRequest,get_session_embed_url_request\nGetSessionEmbedUrlResponse,get_session_embed_url_response\nGetSessionRequest,get_session_request\nGetSessionResponse,get_session_response\nGetSessionStatusRequest,get_session_status_request\nGetSessionStatusResponse,get_session_status_response\nGetSessionTokenRequest,get_session_token_request\nGetSessionTokenResponse,get_session_token_response\nGetSettingsRequest,get_settings_request\nGetSettingsResponse,get_settings_response\nGetShardIteratorInput,get_shard_iterator_input\nGetShardIteratorOutput,get_shard_iterator_output\nGetShareRequest,get_share_request\nGetShareResponse,get_share_response\nGetSignalCatalogRequest,get_signal_catalog_request\nGetSignalCatalogResponse,get_signal_catalog_response\nGetSignalingChannelEndpointInput,get_signaling_channel_endpoint_input\nGetSignalingChannelEndpointOutput,get_signaling_channel_endpoint_output\nGetSignedBluinsightsUrlResponse,get_signed_bluinsights_url_response\nGetSigningCertificateRequest,get_signing_certificate_request\nGetSigningCertificateResponse,get_signing_certificate_response\nGetSigningPlatformRequest,get_signing_platform_request\nGetSigningPlatformResponse,get_signing_platform_response\nGetSigningProfileRequest,get_signing_profile_request\nGetSigningProfileResponse,get_signing_profile_response\nGetSimilarProfilesRequest,get_similar_profiles_request\nGetSimilarProfilesResponse,get_similar_profiles_response\nGetSinkInput,get_sink_input\nGetSinkOutput,get_sink_output\nGetSinkPolicyInput,get_sink_policy_input\nGetSinkPolicyOutput,get_sink_policy_output\nGetSipMediaApplicationAlexaSkillConfigurationRequest,get_sip_media_application_alexa_skill_configuration_request\nGetSipMediaApplicationAlexaSkillConfigurationResponse,get_sip_media_application_alexa_skill_configuration_response\nGetSipMediaApplicationLoggingConfigurationRequest,get_sip_media_application_logging_configuration_request\nGetSipMediaApplicationLoggingConfigurationResponse,get_sip_media_application_logging_configuration_response\nGetSipMediaApplicationRequest,get_sip_media_application_request\nGetSipMediaApplicationResponse,get_sip_media_application_response\nGetSipRuleRequest,get_sip_rule_request\nGetSipRuleResponse,get_sip_rule_response\nGetSiteAddressInput,get_site_address_input\nGetSiteAddressOutput,get_site_address_output\nGetSiteInput,get_site_input\nGetSiteOutput,get_site_output\nGetSiteRequest,get_site_request\nGetSiteResponse,get_site_response\nGetSiteToSiteVpnAttachmentRequest,get_site_to_site_vpn_attachment_request\nGetSiteToSiteVpnAttachmentResponse,get_site_to_site_vpn_attachment_response\nGetSitesRequest,get_sites_request\nGetSitesResponse,get_sites_response\nGetSizeConstraintSetRequest,get_size_constraint_set_request\nGetSizeConstraintSetResponse,get_size_constraint_set_response\nGetSkillGroupRequest,get_skill_group_request\nGetSkillGroupResponse,get_skill_group_response\nGetSlotTypeRequest,get_slot_type_request\nGetSlotTypeResponse,get_slot_type_response\nGetSlotTypeVersionsRequest,get_slot_type_versions_request\nGetSlotTypeVersionsResponse,get_slot_type_versions_response\nGetSlotTypesRequest,get_slot_types_request\nGetSlotTypesResponse,get_slot_types_response\nGetSmsChannelRequest,get_sms_channel_request\nGetSmsChannelResponse,get_sms_channel_response\nGetSmsTemplateRequest,get_sms_template_request\nGetSmsTemplateResponse,get_sms_template_response\nGetSnapshotBlockRequest,get_snapshot_block_request\nGetSnapshotBlockResponse,get_snapshot_block_response\nGetSnapshotLimitsRequest,get_snapshot_limits_request\nGetSnapshotLimitsResult,get_snapshot_limits_result\nGetSnapshotRequest,get_snapshot_request\nGetSnapshotResponse,get_snapshot_response\nGetSnapshotResult,get_snapshot_result\nGetSnapshotsRequest,get_snapshots_request\nGetSnapshotsResponse,get_snapshots_response\nGetSnowballUsageResult,get_snowball_usage_result\nGetSoftwareUpdatesRequest,get_software_updates_request\nGetSoftwareUpdatesResult,get_software_updates_result\nGetSolFunctionInstanceInput,get_sol_function_instance_input\nGetSolFunctionInstanceMetadata,get_sol_function_instance_metadata\nGetSolFunctionInstanceOutput,get_sol_function_instance_output\nGetSolFunctionPackageContentInput,get_sol_function_package_content_input\nGetSolFunctionPackageContentOutput,get_sol_function_package_content_output\nGetSolFunctionPackageDescriptorInput,get_sol_function_package_descriptor_input\nGetSolFunctionPackageDescriptorOutput,get_sol_function_package_descriptor_output\nGetSolFunctionPackageInput,get_sol_function_package_input\nGetSolFunctionPackageMetadata,get_sol_function_package_metadata\nGetSolFunctionPackageOutput,get_sol_function_package_output\nGetSolInstantiatedVnfInfo,get_sol_instantiated_vnf_info\nGetSolNetworkInstanceInput,get_sol_network_instance_input\nGetSolNetworkInstanceMetadata,get_sol_network_instance_metadata\nGetSolNetworkInstanceOutput,get_sol_network_instance_output\nGetSolNetworkOperationInput,get_sol_network_operation_input\nGetSolNetworkOperationMetadata,get_sol_network_operation_metadata\nGetSolNetworkOperationOutput,get_sol_network_operation_output\nGetSolNetworkOperationTaskDetails,get_sol_network_operation_task_details\nGetSolNetworkPackageContentInput,get_sol_network_package_content_input\nGetSolNetworkPackageContentOutput,get_sol_network_package_content_output\nGetSolNetworkPackageDescriptorInput,get_sol_network_package_descriptor_input\nGetSolNetworkPackageDescriptorOutput,get_sol_network_package_descriptor_output\nGetSolNetworkPackageInput,get_sol_network_package_input\nGetSolNetworkPackageMetadata,get_sol_network_package_metadata\nGetSolNetworkPackageOutput,get_sol_network_package_output\nGetSolVnfInfo,get_sol_vnf_info\nGetSolVnfcResourceInfo,get_sol_vnfc_resource_info\nGetSolVnfcResourceInfoMetadata,get_sol_vnfc_resource_info_metadata\nGetSolutionMetricsRequest,get_solution_metrics_request\nGetSolutionMetricsResponse,get_solution_metrics_response\nGetSourceApiAssociationRequest,get_source_api_association_request\nGetSourceApiAssociationResponse,get_source_api_association_response\nGetSourceRepositoryCloneUrlsRequest,get_source_repository_clone_urls_request\nGetSourceRepositoryCloneUrlsResponse,get_source_repository_clone_urls_response\nGetSourceRepositoryRequest,get_source_repository_request\nGetSourceRepositoryResponse,get_source_repository_response\nGetSpaceRequest,get_space_request\nGetSpaceResponse,get_space_response\nGetSparqlStatisticsOutput,get_sparql_statistics_output\nGetSparqlStreamInput,get_sparql_stream_input\nGetSparqlStreamOutput,get_sparql_stream_output\nGetSpeakerSearchTaskRequest,get_speaker_search_task_request\nGetSpeakerSearchTaskResponse,get_speaker_search_task_response\nGetSpeechSynthesisTaskInput,get_speech_synthesis_task_input\nGetSpeechSynthesisTaskOutput,get_speech_synthesis_task_output\nGetSpotPlacementScoresRequest,get_spot_placement_scores_request\nGetSpotPlacementScoresResult,get_spot_placement_scores_result\nGetSqlInjectionMatchSetRequest,get_sql_injection_match_set_request\nGetSqlInjectionMatchSetResponse,get_sql_injection_match_set_response\nGetStackPolicyInput,get_stack_policy_input\nGetStackPolicyOutput,get_stack_policy_output\nGetStageDeploymentRequest,get_stage_deployment_request\nGetStageDeploymentResult,get_stage_deployment_result\nGetStageRequest,get_stage_request\nGetStageResponse,get_stage_response\nGetStageResult,get_stage_result\nGetStageSessionRequest,get_stage_session_request\nGetStageSessionResponse,get_stage_session_response\nGetStagesRequest,get_stages_request\nGetStagesResponse,get_stages_response\nGetStatementRequest,get_statement_request\nGetStatementResponse,get_statement_response\nGetStatementResultRequest,get_statement_result_request\nGetStatementResultResponse,get_statement_result_response\nGetStaticIpRequest,get_static_ip_request\nGetStaticIpResult,get_static_ip_result\nGetStaticIpsRequest,get_static_ips_request\nGetStaticIpsResult,get_static_ips_result\nGetStatisticsRequest,get_statistics_request\nGetStatisticsResponse,get_statistics_response\nGetStorageLensConfigurationRequest,get_storage_lens_configuration_request\nGetStorageLensConfigurationResult,get_storage_lens_configuration_result\nGetStorageLensConfigurationTaggingRequest,get_storage_lens_configuration_tagging_request\nGetStorageLensConfigurationTaggingResult,get_storage_lens_configuration_tagging_result\nGetStoredQueryRequest,get_stored_query_request\nGetStoredQueryResponse,get_stored_query_response\nGetStreamKeyRequest,get_stream_key_request\nGetStreamKeyResponse,get_stream_key_response\nGetStreamRequest,get_stream_request\nGetStreamResponse,get_stream_response\nGetStreamSessionRequest,get_stream_session_request\nGetStreamSessionResponse,get_stream_session_response\nGetStreamingDistributionConfigRequest,get_streaming_distribution_config_request\nGetStreamingDistributionConfigResult,get_streaming_distribution_config_result\nGetStreamingDistributionRequest,get_streaming_distribution_request\nGetStreamingDistributionResult,get_streaming_distribution_result\nGetStreamingImageRequest,get_streaming_image_request\nGetStreamingImageResponse,get_streaming_image_response\nGetStreamingSessionBackupRequest,get_streaming_session_backup_request\nGetStreamingSessionBackupResponse,get_streaming_session_backup_response\nGetStreamingSessionRequest,get_streaming_session_request\nGetStreamingSessionResponse,get_streaming_session_response\nGetStreamingSessionStreamRequest,get_streaming_session_stream_request\nGetStreamingSessionStreamResponse,get_streaming_session_stream_response\nGetStudioComponentRequest,get_studio_component_request\nGetStudioComponentResponse,get_studio_component_response\nGetStudioMemberRequest,get_studio_member_request\nGetStudioMemberResponse,get_studio_member_response\nGetStudioRequest,get_studio_request\nGetStudioResponse,get_studio_response\nGetStudioSessionMappingInput,get_studio_session_mapping_input\nGetStudioSessionMappingOutput,get_studio_session_mapping_output\nGetSubnetCidrReservationsRequest,get_subnet_cidr_reservations_request\nGetSubnetCidrReservationsResult,get_subnet_cidr_reservations_result\nGetSubscriberRequest,get_subscriber_request\nGetSubscriberResponse,get_subscriber_response\nGetSubscriptionAttributesInput,get_subscription_attributes_input\nGetSubscriptionAttributesResponse,get_subscription_attributes_response\nGetSubscriptionDefinitionRequest,get_subscription_definition_request\nGetSubscriptionDefinitionResponse,get_subscription_definition_response\nGetSubscriptionDefinitionVersionRequest,get_subscription_definition_version_request\nGetSubscriptionDefinitionVersionResponse,get_subscription_definition_version_response\nGetSubscriptionRequest,get_subscription_request\nGetSubscriptionResponse,get_subscription_response\nGetSubscriptionStateResponse,get_subscription_state_response\nGetSuiteDefinitionRequest,get_suite_definition_request\nGetSuiteDefinitionResponse,get_suite_definition_response\nGetSuiteRequest,get_suite_request\nGetSuiteResult,get_suite_result\nGetSuiteRunReportRequest,get_suite_run_report_request\nGetSuiteRunReportResponse,get_suite_run_report_response\nGetSuiteRunRequest,get_suite_run_request\nGetSuiteRunResponse,get_suite_run_response\nGetSupportedResourceTypesOutput,get_supported_resource_types_output\nGetSuppressedDestinationRequest,get_suppressed_destination_request\nGetSuppressedDestinationResponse,get_suppressed_destination_response\nGetSyncJobRequest,get_sync_job_request\nGetSyncJobResponse,get_sync_job_response\nGetSystemInstanceRequest,get_system_instance_request\nGetSystemInstanceResponse,get_system_instance_response\nGetSystemTemplateRequest,get_system_template_request\nGetSystemTemplateResponse,get_system_template_response\nGetSystemTemplateRevisionsRequest,get_system_template_revisions_request\nGetSystemTemplateRevisionsResponse,get_system_template_revisions_response\nGetTableMetadataInput,get_table_metadata_input\nGetTableMetadataOutput,get_table_metadata_output\nGetTableObjectsRequest,get_table_objects_request\nGetTableObjectsResponse,get_table_objects_response\nGetTableRequest,get_table_request\nGetTableResponse,get_table_response\nGetTableRestoreStatusRequest,get_table_restore_status_request\nGetTableRestoreStatusResponse,get_table_restore_status_response\nGetTableVersionRequest,get_table_version_request\nGetTableVersionResponse,get_table_version_response\nGetTableVersionsRequest,get_table_versions_request\nGetTableVersionsResponse,get_table_versions_response\nGetTablesRequest,get_tables_request\nGetTablesResponse,get_tables_response\nGetTagKeysInput,get_tag_keys_input\nGetTagKeysOutput,get_tag_keys_output\nGetTagValuesInput,get_tag_values_input\nGetTagValuesOutput,get_tag_values_output\nGetTagsInput,get_tags_input\nGetTagsOutput,get_tags_output\nGetTagsRequest,get_tags_request\nGetTagsResponse,get_tags_response\nGetTargetGroupRequest,get_target_group_request\nGetTargetGroupResponse,get_target_group_response\nGetTargetResourceTypeRequest,get_target_resource_type_request\nGetTargetResourceTypeResponse,get_target_resource_type_response\nGetTaskProtectionRequest,get_task_protection_request\nGetTaskProtectionResponse,get_task_protection_response\nGetTaskTemplateRequest,get_task_template_request\nGetTaskTemplateResponse,get_task_template_response\nGetTelemetryMetadataRequest,get_telemetry_metadata_request\nGetTelemetryMetadataResponse,get_telemetry_metadata_response\nGetTemplateGroupAccessControlEntryRequest,get_template_group_access_control_entry_request\nGetTemplateGroupAccessControlEntryResponse,get_template_group_access_control_entry_response\nGetTemplateInput,get_template_input\nGetTemplateOutput,get_template_output\nGetTemplateRequest,get_template_request\nGetTemplateResponse,get_template_response\nGetTemplateStepGroupRequest,get_template_step_group_request\nGetTemplateStepGroupResponse,get_template_step_group_response\nGetTemplateStepRequest,get_template_step_request\nGetTemplateStepResponse,get_template_step_response\nGetTemplateSummaryInput,get_template_summary_input\nGetTemplateSummaryOutput,get_template_summary_output\nGetTemplateSyncConfigInput,get_template_sync_config_input\nGetTemplateSyncConfigOutput,get_template_sync_config_output\nGetTemplateSyncStatusInput,get_template_sync_status_input\nGetTemplateSyncStatusOutput,get_template_sync_status_output\nGetTemporaryGluePartitionCredentialsRequest,get_temporary_glue_partition_credentials_request\nGetTemporaryGluePartitionCredentialsResponse,get_temporary_glue_partition_credentials_response\nGetTemporaryGlueTableCredentialsRequest,get_temporary_glue_table_credentials_request\nGetTemporaryGlueTableCredentialsResponse,get_temporary_glue_table_credentials_response\nGetTerminologyRequest,get_terminology_request\nGetTerminologyResponse,get_terminology_response\nGetTestExecutionArtifactsUrlRequest,get_test_execution_artifacts_url_request\nGetTestExecutionArtifactsUrlResponse,get_test_execution_artifacts_url_response\nGetTestGridProjectRequest,get_test_grid_project_request\nGetTestGridProjectResult,get_test_grid_project_result\nGetTestGridSessionRequest,get_test_grid_session_request\nGetTestGridSessionResult,get_test_grid_session_result\nGetTestRequest,get_test_request\nGetTestResult,get_test_result\nGetTextDetectionRequest,get_text_detection_request\nGetTextDetectionResponse,get_text_detection_response\nGetThemeRequest,get_theme_request\nGetThemeResponse,get_theme_response\nGetThingRuntimeConfigurationRequest,get_thing_runtime_configuration_request\nGetThingRuntimeConfigurationResponse,get_thing_runtime_configuration_response\nGetThingShadowRequest,get_thing_shadow_request\nGetThingShadowResponse,get_thing_shadow_response\nGetThirdPartyFirewallAssociationStatusRequest,get_third_party_firewall_association_status_request\nGetThirdPartyFirewallAssociationStatusResponse,get_third_party_firewall_association_status_response\nGetThirdPartyJobDetailsInput,get_third_party_job_details_input\nGetThirdPartyJobDetailsOutput,get_third_party_job_details_output\nGetThreatIntelSetRequest,get_threat_intel_set_request\nGetThreatIntelSetResponse,get_threat_intel_set_response\nGetTileInput,get_tile_input\nGetTileOutput,get_tile_output\nGetTimeSeriesServiceStatisticsRequest,get_time_series_service_statistics_request\nGetTimeSeriesServiceStatisticsResult,get_time_series_service_statistics_result\nGetTimelineEventInput,get_timeline_event_input\nGetTimelineEventOutput,get_timeline_event_output\nGetTokenBalanceInput,get_token_balance_input\nGetTokenBalanceOutput,get_token_balance_output\nGetTokenRequest,get_token_request\nGetTokenResponse,get_token_response\nGetTopicAttributesInput,get_topic_attributes_input\nGetTopicAttributesResponse,get_topic_attributes_response\nGetTopicRuleDestinationRequest,get_topic_rule_destination_request\nGetTopicRuleDestinationResponse,get_topic_rule_destination_response\nGetTopicRuleRequest,get_topic_rule_request\nGetTopicRuleResponse,get_topic_rule_response\nGetTraceGraphRequest,get_trace_graph_request\nGetTraceGraphResult,get_trace_graph_result\nGetTraceSummariesRequest,get_trace_summaries_request\nGetTraceSummariesResult,get_trace_summaries_result\nGetTrafficDistributionRequest,get_traffic_distribution_request\nGetTrafficDistributionResponse,get_traffic_distribution_response\nGetTrafficPolicyInstanceCountResponse,get_traffic_policy_instance_count_response\nGetTrafficPolicyInstanceRequest,get_traffic_policy_instance_request\nGetTrafficPolicyInstanceResponse,get_traffic_policy_instance_response\nGetTrafficPolicyRequest,get_traffic_policy_request\nGetTrafficPolicyResponse,get_traffic_policy_response\nGetTrailRequest,get_trail_request\nGetTrailResponse,get_trail_response\nGetTrailStatusRequest,get_trail_status_request\nGetTrailStatusResponse,get_trail_status_response\nGetTransactionInput,get_transaction_input\nGetTransactionOutput,get_transaction_output\nGetTranscriptRequest,get_transcript_request\nGetTranscriptResponse,get_transcript_response\nGetTranscriptionJobRequest,get_transcription_job_request\nGetTranscriptionJobResponse,get_transcription_job_response\nGetTransitGatewayAttachmentPropagationsRequest,get_transit_gateway_attachment_propagations_request\nGetTransitGatewayAttachmentPropagationsResult,get_transit_gateway_attachment_propagations_result\nGetTransitGatewayConnectPeerAssociationsRequest,get_transit_gateway_connect_peer_associations_request\nGetTransitGatewayConnectPeerAssociationsResponse,get_transit_gateway_connect_peer_associations_response\nGetTransitGatewayMulticastDomainAssociationsRequest,get_transit_gateway_multicast_domain_associations_request\nGetTransitGatewayMulticastDomainAssociationsResult,get_transit_gateway_multicast_domain_associations_result\nGetTransitGatewayPeeringRequest,get_transit_gateway_peering_request\nGetTransitGatewayPeeringResponse,get_transit_gateway_peering_response\nGetTransitGatewayPolicyTableAssociationsRequest,get_transit_gateway_policy_table_associations_request\nGetTransitGatewayPolicyTableAssociationsResult,get_transit_gateway_policy_table_associations_result\nGetTransitGatewayPolicyTableEntriesRequest,get_transit_gateway_policy_table_entries_request\nGetTransitGatewayPolicyTableEntriesResult,get_transit_gateway_policy_table_entries_result\nGetTransitGatewayPrefixListReferencesRequest,get_transit_gateway_prefix_list_references_request\nGetTransitGatewayPrefixListReferencesResult,get_transit_gateway_prefix_list_references_result\nGetTransitGatewayRegistrationsRequest,get_transit_gateway_registrations_request\nGetTransitGatewayRegistrationsResponse,get_transit_gateway_registrations_response\nGetTransitGatewayRouteTableAssociationsRequest,get_transit_gateway_route_table_associations_request\nGetTransitGatewayRouteTableAssociationsResult,get_transit_gateway_route_table_associations_result\nGetTransitGatewayRouteTableAttachmentRequest,get_transit_gateway_route_table_attachment_request\nGetTransitGatewayRouteTableAttachmentResponse,get_transit_gateway_route_table_attachment_response\nGetTransitGatewayRouteTablePropagationsRequest,get_transit_gateway_route_table_propagations_request\nGetTransitGatewayRouteTablePropagationsResult,get_transit_gateway_route_table_propagations_result\nGetTriggerRequest,get_trigger_request\nGetTriggerResponse,get_trigger_response\nGetTriggersRequest,get_triggers_request\nGetTriggersResponse,get_triggers_response\nGetTrustStoreCertificateRequest,get_trust_store_certificate_request\nGetTrustStoreCertificateResponse,get_trust_store_certificate_response\nGetTrustStoreRequest,get_trust_store_request\nGetTrustStoreResponse,get_trust_store_response\nGetTypeRequest,get_type_request\nGetTypeResponse,get_type_response\nGetTypedLinkFacetInformationRequest,get_typed_link_facet_information_request\nGetTypedLinkFacetInformationResponse,get_typed_link_facet_information_response\nGetUICustomizationRequest,get_ui_customization_request\nGetUICustomizationResponse,get_ui_customization_response\nGetUnfilteredPartitionMetadataRequest,get_unfiltered_partition_metadata_request\nGetUnfilteredPartitionMetadataResponse,get_unfiltered_partition_metadata_response\nGetUnfilteredPartitionsMetadataRequest,get_unfiltered_partitions_metadata_request\nGetUnfilteredPartitionsMetadataResponse,get_unfiltered_partitions_metadata_response\nGetUnfilteredTableMetadataRequest,get_unfiltered_table_metadata_request\nGetUnfilteredTableMetadataResponse,get_unfiltered_table_metadata_response\nGetUpgradeHistoryRequest,get_upgrade_history_request\nGetUpgradeHistoryResponse,get_upgrade_history_response\nGetUpgradeStatusRequest,get_upgrade_status_request\nGetUpgradeStatusResponse,get_upgrade_status_response\nGetUploadRequest,get_upload_request\nGetUploadResult,get_upload_result\nGetUploadStatusRequest,get_upload_status_request\nGetUploadStatusResponse,get_upload_status_response\nGetUsageForecastRequest,get_usage_forecast_request\nGetUsageForecastResponse,get_usage_forecast_response\nGetUsageLimitRequest,get_usage_limit_request\nGetUsageLimitResponse,get_usage_limit_response\nGetUsagePlanKeyRequest,get_usage_plan_key_request\nGetUsagePlanKeysRequest,get_usage_plan_keys_request\nGetUsagePlanRequest,get_usage_plan_request\nGetUsagePlansRequest,get_usage_plans_request\nGetUsageRequest,get_usage_request\nGetUsageStatisticsRequest,get_usage_statistics_request\nGetUsageStatisticsResponse,get_usage_statistics_response\nGetUsageTotalsRequest,get_usage_totals_request\nGetUsageTotalsResponse,get_usage_totals_response\nGetUserAccessLoggingSettingsRequest,get_user_access_logging_settings_request\nGetUserAccessLoggingSettingsResponse,get_user_access_logging_settings_response\nGetUserAttributeVerificationCodeRequest,get_user_attribute_verification_code_request\nGetUserAttributeVerificationCodeResponse,get_user_attribute_verification_code_response\nGetUserDefinedFunctionRequest,get_user_defined_function_request\nGetUserDefinedFunctionResponse,get_user_defined_function_response\nGetUserDefinedFunctionsRequest,get_user_defined_functions_request\nGetUserDefinedFunctionsResponse,get_user_defined_functions_response\nGetUserDetailsRequest,get_user_details_request\nGetUserDetailsResponse,get_user_details_response\nGetUserEndpointsRequest,get_user_endpoints_request\nGetUserEndpointsResponse,get_user_endpoints_response\nGetUserIdRequest,get_user_id_request\nGetUserIdResponse,get_user_id_response\nGetUserPolicyRequest,get_user_policy_request\nGetUserPolicyResponse,get_user_policy_response\nGetUserPoolMfaConfigRequest,get_user_pool_mfa_config_request\nGetUserPoolMfaConfigResponse,get_user_pool_mfa_config_response\nGetUserRequest,get_user_request\nGetUserResponse,get_user_response\nGetUserSettingsRequest,get_user_settings_request\nGetUserSettingsResponse,get_user_settings_response\nGetUtterancesViewRequest,get_utterances_view_request\nGetUtterancesViewResponse,get_utterances_view_response\nGetV2LoggingOptionsResponse,get_v2_logging_options_response\nGetVPCEConfigurationRequest,get_vpce_configuration_request\nGetVPCEConfigurationResult,get_vpce_configuration_result\nGetVariablesRequest,get_variables_request\nGetVariablesResult,get_variables_result\nGetVariantImportRequest,get_variant_import_request\nGetVariantImportResponse,get_variant_import_response\nGetVariantStoreRequest,get_variant_store_request\nGetVariantStoreResponse,get_variant_store_response\nGetVaultAccessPolicyInput,get_vault_access_policy_input\nGetVaultAccessPolicyOutput,get_vault_access_policy_output\nGetVaultLockInput,get_vault_lock_input\nGetVaultLockOutput,get_vault_lock_output\nGetVaultNotificationsInput,get_vault_notifications_input\nGetVaultNotificationsOutput,get_vault_notifications_output\nGetVectorEnrichmentJobInput,get_vector_enrichment_job_input\nGetVectorEnrichmentJobOutput,get_vector_enrichment_job_output\nGetVehicleRequest,get_vehicle_request\nGetVehicleResponse,get_vehicle_response\nGetVehicleStatusRequest,get_vehicle_status_request\nGetVehicleStatusResponse,get_vehicle_status_response\nGetVerifiedAccessEndpointPolicyRequest,get_verified_access_endpoint_policy_request\nGetVerifiedAccessEndpointPolicyResult,get_verified_access_endpoint_policy_result\nGetVerifiedAccessGroupPolicyRequest,get_verified_access_group_policy_request\nGetVerifiedAccessGroupPolicyResult,get_verified_access_group_policy_result\nGetViewInput,get_view_input\nGetViewOutput,get_view_output\nGetViolationDetailsRequest,get_violation_details_request\nGetViolationDetailsResponse,get_violation_details_response\nGetVirtualMachineInput,get_virtual_machine_input\nGetVirtualMachineOutput,get_virtual_machine_output\nGetVocabularyFilterRequest,get_vocabulary_filter_request\nGetVocabularyFilterResponse,get_vocabulary_filter_response\nGetVocabularyRequest,get_vocabulary_request\nGetVocabularyResponse,get_vocabulary_response\nGetVoiceChannelRequest,get_voice_channel_request\nGetVoiceChannelResponse,get_voice_channel_response\nGetVoiceConnectorEmergencyCallingConfigurationRequest,get_voice_connector_emergency_calling_configuration_request\nGetVoiceConnectorEmergencyCallingConfigurationResponse,get_voice_connector_emergency_calling_configuration_response\nGetVoiceConnectorGroupRequest,get_voice_connector_group_request\nGetVoiceConnectorGroupResponse,get_voice_connector_group_response\nGetVoiceConnectorLoggingConfigurationRequest,get_voice_connector_logging_configuration_request\nGetVoiceConnectorLoggingConfigurationResponse,get_voice_connector_logging_configuration_response\nGetVoiceConnectorOriginationRequest,get_voice_connector_origination_request\nGetVoiceConnectorOriginationResponse,get_voice_connector_origination_response\nGetVoiceConnectorProxyRequest,get_voice_connector_proxy_request\nGetVoiceConnectorProxyResponse,get_voice_connector_proxy_response\nGetVoiceConnectorRequest,get_voice_connector_request\nGetVoiceConnectorResponse,get_voice_connector_response\nGetVoiceConnectorStreamingConfigurationRequest,get_voice_connector_streaming_configuration_request\nGetVoiceConnectorStreamingConfigurationResponse,get_voice_connector_streaming_configuration_response\nGetVoiceConnectorTerminationHealthRequest,get_voice_connector_termination_health_request\nGetVoiceConnectorTerminationHealthResponse,get_voice_connector_termination_health_response\nGetVoiceConnectorTerminationRequest,get_voice_connector_termination_request\nGetVoiceConnectorTerminationResponse,get_voice_connector_termination_response\nGetVoiceProfileDomainRequest,get_voice_profile_domain_request\nGetVoiceProfileDomainResponse,get_voice_profile_domain_response\nGetVoiceProfileRequest,get_voice_profile_request\nGetVoiceProfileResponse,get_voice_profile_response\nGetVoiceTemplateRequest,get_voice_template_request\nGetVoiceTemplateResponse,get_voice_template_response\nGetVoiceToneAnalysisTaskRequest,get_voice_tone_analysis_task_request\nGetVoiceToneAnalysisTaskResponse,get_voice_tone_analysis_task_response\nGetVpcAttachmentRequest,get_vpc_attachment_request\nGetVpcAttachmentResponse,get_vpc_attachment_response\nGetVpcLinkRequest,get_vpc_link_request\nGetVpcLinkResponse,get_vpc_link_response\nGetVpcLinksRequest,get_vpc_links_request\nGetVpcLinksResponse,get_vpc_links_response\nGetVpnConnectionDeviceSampleConfigurationRequest,get_vpn_connection_device_sample_configuration_request\nGetVpnConnectionDeviceSampleConfigurationResult,get_vpn_connection_device_sample_configuration_result\nGetVpnConnectionDeviceTypesRequest,get_vpn_connection_device_types_request\nGetVpnConnectionDeviceTypesResult,get_vpn_connection_device_types_result\nGetVpnTunnelReplacementStatusRequest,get_vpn_tunnel_replacement_status_request\nGetVpnTunnelReplacementStatusResult,get_vpn_tunnel_replacement_status_result\nGetWebACLForResourceRequest,get_web_acl_for_resource_request\nGetWebACLForResourceResponse,get_web_acl_for_resource_response\nGetWebACLRequest,get_web_acl_request\nGetWebACLResponse,get_web_acl_response\nGetWebhookRequest,get_webhook_request\nGetWebhookResult,get_webhook_result\nGetWirelessDeviceImportTaskRequest,get_wireless_device_import_task_request\nGetWirelessDeviceImportTaskResponse,get_wireless_device_import_task_response\nGetWirelessDeviceRequest,get_wireless_device_request\nGetWirelessDeviceResponse,get_wireless_device_response\nGetWirelessDeviceStatisticsRequest,get_wireless_device_statistics_request\nGetWirelessDeviceStatisticsResponse,get_wireless_device_statistics_response\nGetWirelessGatewayCertificateRequest,get_wireless_gateway_certificate_request\nGetWirelessGatewayCertificateResponse,get_wireless_gateway_certificate_response\nGetWirelessGatewayFirmwareInformationRequest,get_wireless_gateway_firmware_information_request\nGetWirelessGatewayFirmwareInformationResponse,get_wireless_gateway_firmware_information_response\nGetWirelessGatewayRequest,get_wireless_gateway_request\nGetWirelessGatewayResponse,get_wireless_gateway_response\nGetWirelessGatewayStatisticsRequest,get_wireless_gateway_statistics_request\nGetWirelessGatewayStatisticsResponse,get_wireless_gateway_statistics_response\nGetWirelessGatewayTaskDefinitionRequest,get_wireless_gateway_task_definition_request\nGetWirelessGatewayTaskDefinitionResponse,get_wireless_gateway_task_definition_response\nGetWirelessGatewayTaskRequest,get_wireless_gateway_task_request\nGetWirelessGatewayTaskResponse,get_wireless_gateway_task_response\nGetWorkGroupInput,get_work_group_input\nGetWorkGroupOutput,get_work_group_output\nGetWorkUnitResultsRequest,get_work_unit_results_request\nGetWorkUnitResultsResponse,get_work_unit_results_response\nGetWorkUnitsRequest,get_work_units_request\nGetWorkUnitsResponse,get_work_units_response\nGetWorkerFleetRequest,get_worker_fleet_request\nGetWorkerFleetResponse,get_worker_fleet_response\nGetWorkerRequest,get_worker_request\nGetWorkerResponse,get_worker_response\nGetWorkflowExecutionHistoryInput,get_workflow_execution_history_input\nGetWorkflowExecutionRequest,get_workflow_execution_request\nGetWorkflowExecutionResponse,get_workflow_execution_response\nGetWorkflowRequest,get_workflow_request\nGetWorkflowResponse,get_workflow_response\nGetWorkflowRunPropertiesRequest,get_workflow_run_properties_request\nGetWorkflowRunPropertiesResponse,get_workflow_run_properties_response\nGetWorkflowRunRequest,get_workflow_run_request\nGetWorkflowRunResponse,get_workflow_run_response\nGetWorkflowRunsRequest,get_workflow_runs_request\nGetWorkflowRunsResponse,get_workflow_runs_response\nGetWorkflowStepExecutionRequest,get_workflow_step_execution_request\nGetWorkflowStepExecutionResponse,get_workflow_step_execution_response\nGetWorkflowStepGroupRequest,get_workflow_step_group_request\nGetWorkflowStepGroupResponse,get_workflow_step_group_response\nGetWorkflowStepRequest,get_workflow_step_request\nGetWorkflowStepResponse,get_workflow_step_response\nGetWorkflowStepsRequest,get_workflow_steps_request\nGetWorkflowStepsResponse,get_workflow_steps_response\nGetWorkgroupRequest,get_workgroup_request\nGetWorkgroupResponse,get_workgroup_response\nGetWorkingLocationRequest,get_working_location_request\nGetWorkingLocationResponse,get_working_location_response\nGetWorkloadInput,get_workload_input\nGetWorkloadOutput,get_workload_output\nGetWorkspaceRequest,get_workspace_request\nGetWorkspaceResponse,get_workspace_response\nGetWorldTemplateBodyRequest,get_world_template_body_request\nGetWorldTemplateBodyResponse,get_world_template_body_response\nGetXssMatchSetRequest,get_xss_match_set_request\nGetXssMatchSetResponse,get_xss_match_set_response\nGid,gid\nGitCloneDepth,git_clone_depth\nGitConfig,git_config\nGitConfigForUpdate,git_config_for_update\nGitHubAccountTokenDoesNotExistException,git_hub_account_token_does_not_exist_exception\nGitHubAccountTokenNameRequiredException,git_hub_account_token_name_required_exception\nGitHubCodeDestination,git_hub_code_destination\nGitHubCommitConfigurationFieldMappings,git_hub_commit_configuration_field_mappings\nGitHubConfiguration,git_hub_configuration\nGitHubDocumentCrawlProperties,git_hub_document_crawl_properties\nGitHubEnterpriseServer,git_hub_enterprise_server\nGitHubIssueAttachmentConfigurationFieldMappings,git_hub_issue_attachment_configuration_field_mappings\nGitHubIssueCommentConfigurationFieldMappings,git_hub_issue_comment_configuration_field_mappings\nGitHubIssueDocumentConfigurationFieldMappings,git_hub_issue_document_configuration_field_mappings\nGitHubLocation,git_hub_location\nGitHubPullRequestCommentConfigurationFieldMappings,git_hub_pull_request_comment_configuration_field_mappings\nGitHubPullRequestDocumentAttachmentConfigurationFieldMappings,git_hub_pull_request_document_attachment_configuration_field_mappings\nGitHubPullRequestDocumentConfigurationFieldMappings,git_hub_pull_request_document_configuration_field_mappings\nGitHubRepositoryConfigurationFieldMappings,git_hub_repository_configuration_field_mappings\nGitSubmodulesConfig,git_submodules_config\nGivenName,given_name\nGlacierJobDescription,glacier_job_description\nGlacierJobParameters,glacier_job_parameters\nGlacierJobTier,glacier_job_tier\nGlobal,global\nGlobalCluster,global_cluster\nGlobalClusterAlreadyExistsFault,global_cluster_already_exists_fault\nGlobalClusterArn,global_cluster_arn\nGlobalClusterIdentifier,global_cluster_identifier\nGlobalClusterMember,global_cluster_member\nGlobalClusterMembers,global_cluster_members\nGlobalClusterNotFoundFault,global_cluster_not_found_fault\nGlobalClusterQuotaExceededFault,global_cluster_quota_exceeded_fault\nGlobalClusterResourceId,global_cluster_resource_id\nGlobalClusters,global_clusters\nGlobalClustersMessage,global_clusters_message\nGlobalConfiguration,global_configuration\nGlobalEndpointTokenVersion,global_endpoint_token_version\nGlobalFilters,global_filters\nGlobalIdentity,global_identity\nGlobalNetwork,global_network\nGlobalNetworkArn,global_network_arn\nGlobalNetworkId,global_network_id\nGlobalNetworkIds,global_network_ids\nGlobalNetworks,global_networks\nGlobalNodeGroup,global_node_group\nGlobalNodeGroupId,global_node_group_id\nGlobalNodeGroups,global_node_groups\nGlobalNodeGroupsToRemove,global_node_groups_to_remove\nGlobalNodeGroupsToRetain,global_node_groups_to_retain\nGlobalQuota,global_quota\nGlobalReplicationGroup,global_replication_group\nGlobalReplicationGroupAlreadyExistsFault,global_replication_group_already_exists_fault\nGlobalReplicationGroupDescription,global_replication_group_description\nGlobalReplicationGroupId,global_replication_group_id\nGlobalReplicationGroupIdSuffix,global_replication_group_id_suffix\nGlobalReplicationGroupInfo,global_replication_group_info\nGlobalReplicationGroupMember,global_replication_group_member\nGlobalReplicationGroupMemberRole,global_replication_group_member_role\nGlobalReplicationGroupNotFoundFault,global_replication_group_not_found_fault\nGlobalReplicationGroups,global_replication_groups\nGlobalSecondaryIndex,global_secondary_index\nGlobalSecondaryIndexAutoScalingUpdate,global_secondary_index_auto_scaling_update\nGlobalSecondaryIndexDescription,global_secondary_index_description\nGlobalSecondaryIndexInfo,global_secondary_index_info\nGlobalSecondaryIndexOverride,global_secondary_index_override\nGlobalSecondaryIndexUpdate,global_secondary_index_update\nGlobalSecondaryIndexUpdates,global_secondary_index_updates\nGlobalSecondaryIndexes,global_secondary_indexes\nGlobalSettings,global_settings\nGlobalSignOutRequest,global_sign_out_request\nGlobalTable,global_table\nGlobalTableAlreadyExistsException,global_table_already_exists_exception\nGlobalTableArn,global_table_arn\nGlobalTableBillingMode,global_table_billing_mode\nGlobalTableBorderOptions,global_table_border_options\nGlobalTableDescription,global_table_description\nGlobalTableGlobalSecondaryIndexSettingsUpdate,global_table_global_secondary_index_settings_update\nGlobalTableName,global_table_name\nGlobalTableNotFoundException,global_table_not_found_exception\nGlobalTableProvisionedWriteCapacityAutoScalingSettingsUpdate,global_table_provisioned_write_capacity_auto_scaling_settings_update\nGlobalTableProvisionedWriteCapacityUnits,global_table_provisioned_write_capacity_units\nGlobalTableStatus,global_table_status\nGlobalTableVersion,global_table_version\nGlobalTables,global_tables\nGlobalTimeout,global_timeout\nGlobalWriteForwardingRequested,global_write_forwarding_requested\nGlobalWriteForwardingStatus,global_write_forwarding_status\nGlueCatalogGeneration,glue_catalog_generation\nGlueConfiguration,glue_configuration\nGlueConnectionName,glue_connection_name\nGlueDataCatalogConfig,glue_data_catalog_config\nGlueDataCatalogConfiguration,glue_data_catalog_configuration\nGlueDataCatalogConfigurationDescription,glue_data_catalog_configuration_description\nGlueDataCatalogConfigurationUpdate,glue_data_catalog_configuration_update\nGlueEncryptionException,glue_encryption_exception\nGlueIps,glue_ips\nGluePolicy,glue_policy\nGlueSchema,glue_schema\nGlueStudioSchemaColumn,glue_studio_schema_column\nGlueTable,glue_table\nGlueTableReference,glue_table_reference\nGlueVersion,glue_version\nGnss,gnss\nGoneException,gone_exception\nGoogle,google\nGoogleAnalytics,google_analytics\nGoogleAnalyticsConnectorProfileCredentials,google_analytics_connector_profile_credentials\nGoogleAnalyticsMetadata,google_analytics_metadata\nGoogleAnalyticsSourceProperties,google_analytics_source_properties\nGoogleDriveConfiguration,google_drive_configuration\nGopBReference,gop_b_reference\nGopClosedCadence,gop_closed_cadence\nGopNumBFrames,gop_num_b_frames\nGopSize,gop_size\nGopSizeUnits,gop_size_units\nGovCloudAccountId,gov_cloud_account_id\nGovernedCatalogSource,governed_catalog_source\nGovernedCatalogTarget,governed_catalog_target\nGpu,gpu\nGpuDeviceInfo,gpu_device_info\nGpuDeviceMemoryInfo,gpu_device_memory_info\nGpuInfo,gpu_info\nGpus,gpus\nGradient,gradient\nGradientColor,gradient_color\nGradientOffset,gradient_offset\nGradientStop,gradient_stop\nGrammarSlotTypeSetting,grammar_slot_type_setting\nGrammarSlotTypeSource,grammar_slot_type_source\nGrant,grant\nGrantAccessRequest,grant_access_request\nGrantAccessResult,grant_access_result\nGrantArn,grant_arn\nGrantArns,grant_arns\nGrantConstraints,grant_constraints\nGrantEntitlementRequest,grant_entitlement_request\nGrantFlowEntitlements420Exception,grant_flow_entitlements420_exception\nGrantFlowEntitlementsRequest,grant_flow_entitlements_request\nGrantFlowEntitlementsResponse,grant_flow_entitlements_response\nGrantFullControl,grant_full_control\nGrantId,grant_id\nGrantLinkPermissions,grant_link_permissions\nGrantListEntry,grant_list_entry\nGrantName,grant_name\nGrantPermissions,grant_permissions\nGrantPermissionsRequest,grant_permissions_request\nGrantPoweruserPrivileges,grant_poweruser_privileges\nGrantRead,grant_read\nGrantReadACP,grant_read_acp\nGrantStatus,grant_status\nGrantTime,grant_time\nGrantToken,grant_token\nGrantTokens,grant_tokens\nGrantWrite,grant_write\nGrantWriteACP,grant_write_acp\nGrantedLicense,granted_license\nGrantedOperations,granted_operations\nGrantee,grantee\nGranteeId,grantee_id\nGranteePrincipal,grantee_principal\nGranteePrincipalArn,grantee_principal_arn\nGranteeType,grantee_type\nGrantor,grantor\nGrants,grants\nGranularities,granularities\nGranularity,granularity\nGraph,graph\nGraphArn,graph_arn\nGraphArns,graph_arns\nGraphList,graph_list\nGraphQLRenderConfig,graph_ql_render_config\nGraphQLSchemaException,graph_ql_schema_exception\nGraphqlApi,graphql_api\nGreKey,gre_key\nGreaterThan,greater_than\nGreaterThanOrEqual,greater_than_or_equal\nGreaterThanOrEquals,greater_than_or_equals\nGreen,green\nGreenFleetProvisioningOption,green_fleet_provisioning_option\nGreenPrimaryX,green_primary_x\nGreenPrimaryY,green_primary_y\nGreengrass,greengrass\nGreengrassConfiguration,greengrass_configuration\nGreengrassOutputDetails,greengrass_output_details\nGreengrassV2,greengrass_v2\nGremlinQueryStatus,gremlin_query_status\nGremlinQueryStatusAttributes,gremlin_query_status_attributes\nGrid,grid\nGridLayout,grid_layout\nGridLayoutCanvasSizeOptions,grid_layout_canvas_size_options\nGridLayoutConfiguration,grid_layout_configuration\nGridLayoutElement,grid_layout_element\nGridLayoutScreenCanvasSizeOptions,grid_layout_screen_canvas_size_options\nGridLineVisibility,grid_line_visibility\nGridViewConfiguration,grid_view_configuration\nGrokClassifier,grok_classifier\nGrokPattern,grok_pattern\nGroundStationData,ground_station_data\nGroundTruth,ground_truth\nGroundTruthManifest,ground_truth_manifest\nGroundTruthS3Input,ground_truth_s3_input\nGroup,group\nGroupARN,group_arn\nGroupArn,group_arn\nGroupAttributeField,group_attribute_field\nGroupBy,group_by\nGroupByAttribute,group_by_attribute\nGroupByAttributeValue,group_by_attribute_value\nGroupByKey,group_by_key\nGroupCertificateAuthorities,group_certificate_authorities\nGroupCertificateAuthorityArn,group_certificate_authority_arn\nGroupCertificateAuthorityId,group_certificate_authority_id\nGroupCertificateAuthorityProperties,group_certificate_authority_properties\nGroupConfiguration,group_configuration\nGroupConfigurationItem,group_configuration_item\nGroupConfigurationParameter,group_configuration_parameter\nGroupCount,group_count\nGroupDefinition,group_definition\nGroupDefinitions,group_definitions\nGroupDesc,group_desc\nGroupDetail,group_detail\nGroupDetailList,group_detail_list\nGroupDisplayName,group_display_name\nGroupExistsException,group_exists_exception\nGroupFiles,group_files\nGroupFilter,group_filter\nGroupId,group_id\nGroupIdentifier,group_identifier\nGroupIdentifiers,group_identifiers\nGroupIdentity,group_identity\nGroupIds,group_ids\nGroupInformation,group_information\nGroupIpAddress,group_ip_address\nGroupLabelOptions,group_label_options\nGroupLifecycleEventsDesiredStatus,group_lifecycle_events_desired_status\nGroupLifecycleEventsStatus,group_lifecycle_events_status\nGroupLifecycleEventsStatusMessage,group_lifecycle_events_status_message\nGroupList,group_list\nGroupMember,group_member\nGroupMemberList,group_member_list\nGroupMembers,group_members\nGroupMembership,group_membership\nGroupMembershipExistenceResult,group_membership_existence_result\nGroupMemberships,group_memberships\nGroupMetadata,group_metadata\nGroupName,group_name\nGroupNameAndArn,group_name_and_arn\nGroupNameColumn,group_name_column\nGroupNamePrefix,group_name_prefix\nGroupNames,group_names\nGroupOrderingIdSummaries,group_ordering_id_summaries\nGroupOrderingIdSummary,group_ordering_id_summary\nGroupOwner,group_owner\nGroupOwnerId,group_owner_id\nGroupOwnerSetting,group_owner_setting\nGroupPermission,group_permission\nGroupPolicyList,group_policy_list\nGroupProperties,group_properties\nGroupQuery,group_query\nGroupResourcesInput,group_resources_input\nGroupResourcesOutput,group_resources_output\nGroupResult,group_result\nGroupScore,group_score\nGroupSearchFilter,group_search_filter\nGroupSecurityIdentifier,group_security_identifier\nGroupSize,group_size\nGroupSource,group_source\nGroupSummary,group_summary\nGroupType,group_type\nGroupVersion,group_version\nGroupVersionId,group_version_id\nGroupedBys,grouped_bys\nGroupedResourceCount,grouped_resource_count\nGroupedResourceCounts,grouped_resource_counts\nGroupingAttributeNames,grouping_attribute_names\nGroupingSeparator,grouping_separator\nGroupingType,grouping_type\nGroupings,groupings\nGroups,groups\nGroupsSummaries,groups_summaries\nGrowthFactor,growth_factor\nGrowthRate,growth_rate\nGrowthRateComputation,growth_rate_computation\nGrowthType,growth_type\nGrpcCode,grpc_code\nGrpcGatewayRoute,grpc_gateway_route\nGrpcGatewayRouteAction,grpc_gateway_route_action\nGrpcGatewayRouteMatch,grpc_gateway_route_match\nGrpcGatewayRouteMetadata,grpc_gateway_route_metadata\nGrpcGatewayRouteRewrite,grpc_gateway_route_rewrite\nGrpcRetryPolicy,grpc_retry_policy\nGrpcRoute,grpc_route\nGrpcRouteAction,grpc_route_action\nGrpcRouteMatch,grpc_route_match\nGrpcRouteMetadata,grpc_route_metadata\nGrpcTimeout,grpc_timeout\nGsm,gsm\nGsmLocalId,gsm_local_id\nGsmNmr,gsm_nmr\nGsmNmrObj,gsm_nmr_obj\nGsmObj,gsm_obj\nGsmTimingAdvance,gsm_timing_advance\nGt,gt\nGte,gte\nGuardDutyFindingId,guard_duty_finding_id\nGuardianAttributes,guardian_attributes\nGuardianOptions,guardian_options\nGuessMIMETypeEnabled,guess_mime_type_enabled\nGuestRoleArn,guest_role_arn\nGuidance,guidance\nGutter,gutter\nGutterSpacing,gutter_spacing\nGutterStyle,gutter_style\nGutterVisibility,gutter_visibility\nH264ColorSpaceSettings,h264_color_space_settings\nH264FilterSettings,h264_filter_settings\nH264QvbrSettings,h264_qvbr_settings\nH264Settings,h264_settings\nH265ColorSpaceSettings,h265_color_space_settings\nH265FilterSettings,h265_filter_settings\nH265PackagingType,h265_packaging_type\nH265QvbrSettings,h265_qvbr_settings\nH265Settings,h265_settings\nHECAcknowledgmentTimeoutInSeconds,hec_acknowledgment_timeout_in_seconds\nHECEndpoint,hec_endpoint\nHECEndpointType,hec_endpoint_type\nHECToken,hec_token\nHIT,hit\nHITGroupId,hit_group_id\nHITId,hit_id\nHITLayoutId,hit_layout_id\nHITLayoutParameter,hit_layout_parameter\nHITLayoutParameters,hit_layout_parameters\nHITReviewPolicy,hit_review_policy\nHITReviewReport,hit_review_report\nHITReviewStatus,hit_review_status\nHITStatus,hit_status\nHITTypeId,hit_type_id\nHITs,hits\nHLSFragmentSelector,hls_fragment_selector\nHLSStreamingSessionURL,hls_streaming_session_url\nHLSTimestampRange,hls_timestamp_range\nHPOConfig,hpo_config\nHPOObjective,hpo_objective\nHPOResourceConfig,hpo_resource_config\nHTTPCode4XXCount,http_code4_xx_count\nHTTPCode5XXCount,http_code5_xx_count\nHTTPHeader,http_header\nHTTPMethod,http_method\nHTTPPort,http_port\nHTTPRequest,http_request\nHTTPSPort,https_port\nHTTPVersion,http_version\nHadoopJarStep,hadoop_jar_step\nHadoopJarStepConfig,hadoop_jar_step_config\nHadoopStepConfig,hadoop_step_config\nHadoopVersion,hadoop_version\nHammingLoss,hamming_loss\nHandOffTime,hand_off_time\nHandler,handler\nHandlerFailureException,handler_failure_exception\nHandlerInternalFailureException,handler_internal_failure_exception\nHandshake,handshake\nHandshakeAlreadyInStateException,handshake_already_in_state_exception\nHandshakeConstraintViolationException,handshake_constraint_violation_exception\nHandshakeFilter,handshake_filter\nHandshakeId,handshake_id\nHandshakeNotFoundException,handshake_not_found_exception\nHandshakeParty,handshake_party\nHandshakeResource,handshake_resource\nHandshakes,handshakes\nHapgArn,hapg_arn\nHapgList,hapg_list\nHapgSerial,hapg_serial\nHardExpiry,hard_expiry\nHardLimit,hard_limit\nHarvestJob,harvest_job\nHarvestJobs,harvest_jobs\nHasAdditionalSubjectAlternativeNames,has_additional_subject_alternative_names\nHasAssociatedService,has_associated_service\nHasCredential,has_credential\nHasCustomEventSelectors,has_custom_event_selectors\nHasDefaultPath,has_default_path\nHasError,has_error\nHasErrors,has_errors\nHasFault,has_fault\nHasFcmServiceCredentials,has_fcm_service_credentials\nHasInsightSelectors,has_insight_selectors\nHasMoreApplications,has_more_applications\nHasMoreDeliveryStreams,has_more_delivery_streams\nHasMoreDestinations,has_more_destinations\nHasMoreShards,has_more_shards\nHasMoreStreams,has_more_streams\nHasMoreTags,has_more_tags\nHasResultSet,has_result_set\nHasThrottle,has_throttle\nHasTokenKey,has_token_key\nHash,hash\nHashAlgorithm,hash_algorithm\nHashAlgorithmOptions,hash_algorithm_options\nHashKeyRange,hash_key_range\nHashType,hash_type\nHbbtvCompliance,hbbtv_compliance\nHdDeviceSettings,hd_device_settings\nHdbVersion,hdb_version\nHdfsNameNode,hdfs_name_node\nHdr10Metadata,hdr10_metadata\nHdr10Plus,hdr10_plus\nHdr10Settings,hdr10_settings\nHdrToSdrToneMapper,hdr_to_sdr_tone_mapper\nHeadBucketRequest,head_bucket_request\nHeadObjectOutput,head_object_output\nHeadObjectRequest,head_object_request\nHeader,header\nHeaderBehavior,header_behavior\nHeaderConfig,header_config\nHeaderFooterSectionConfiguration,header_footer_section_configuration\nHeaderList,header_list\nHeaderMatch,header_match\nHeaderMatchPattern,header_match_pattern\nHeaderName,header_name\nHeaderObject,header_object\nHeaderOrder,header_order\nHeaderParameters,header_parameters\nHeaderRow,header_row\nHeaderSections,header_sections\nHeaderStyle,header_style\nHeaderValue,header_value\nHeaderValues,header_values\nHeaders,headers\nHeadersConfig,headers_config\nHeadersInBounceNotificationsEnabled,headers_in_bounce_notifications_enabled\nHeadersInComplaintNotificationsEnabled,headers_in_complaint_notifications_enabled\nHeadersInDeliveryNotificationsEnabled,headers_in_delivery_notifications_enabled\nHeadersToInclude,headers_to_include\nHealth,health\nHealthCheck,health_check\nHealthCheckAlreadyExists,health_check_already_exists\nHealthCheckArn,health_check_arn\nHealthCheckConfig,health_check_config\nHealthCheckConfiguration,health_check_configuration\nHealthCheckCount,health_check_count\nHealthCheckCustomConfig,health_check_custom_config\nHealthCheckEnabled,health_check_enabled\nHealthCheckGracePeriod,health_check_grace_period\nHealthCheckGracePeriodSeconds,health_check_grace_period_seconds\nHealthCheckId,health_check_id\nHealthCheckIds,health_check_ids\nHealthCheckInUse,health_check_in_use\nHealthCheckIntervalSeconds,health_check_interval_seconds\nHealthCheckObservation,health_check_observation\nHealthCheckObservations,health_check_observations\nHealthCheckPath,health_check_path\nHealthCheckPolicy,health_check_policy\nHealthCheckPort,health_check_port\nHealthCheckProtocol,health_check_protocol\nHealthCheckTimeoutSeconds,health_check_timeout_seconds\nHealthCheckType,health_check_type\nHealthCheckVersion,health_check_version\nHealthCheckVersionMismatch,health_check_version_mismatch\nHealthChecks,health_checks\nHealthEvent,health_event\nHealthEventArn,health_event_arn\nHealthEventDescription,health_event_description\nHealthEventTypeCategory,health_event_type_category\nHealthEventTypeCode,health_event_type_code\nHealthEvents,health_events\nHealthEventsConfig,health_events_config\nHealthReason,health_reason\nHealthScoreThreshold,health_score_threshold\nHealthService,health_service\nHealthState,health_state\nHealthStatus,health_status\nHealthThreshold,health_threshold\nHealthUnavailableException,health_unavailable_exception\nHealthUrl,health_url\nHealthyThreshold,healthy_threshold\nHealthyThresholdCount,healthy_threshold_count\nHeartbeatEnable,heartbeat_enable\nHeartbeatEvent,heartbeat_event\nHeartbeatFrequency,heartbeat_frequency\nHeartbeatSchema,heartbeat_schema\nHeartbeatTimeout,heartbeat_timeout\nHeatMapAggregatedFieldWells,heat_map_aggregated_field_wells\nHeatMapColumnItemsLimitConfiguration,heat_map_column_items_limit_configuration\nHeatMapColumnSort,heat_map_column_sort\nHeatMapConfiguration,heat_map_configuration\nHeatMapFieldWells,heat_map_field_wells\nHeatMapRowItemsLimitConfiguration,heat_map_row_items_limit_configuration\nHeatMapRowSort,heat_map_row_sort\nHeatMapSortConfiguration,heat_map_sort_configuration\nHeatMapVisual,heat_map_visual\nHeatmapColor,heatmap_color\nHeatmapConfiguration,heatmap_configuration\nHeight,height\nHeightInPx,height_in_px\nHeightPixels,height_pixels\nHeightTrim,height_trim\nHelpfulResource,helpful_resource\nHelpfulResourceDisplayText,helpful_resource_display_text\nHelpfulResourceUrl,helpful_resource_url\nHeterogeneous,heterogeneous\nHexCode,hex_code\nHexFontColor,hex_font_color\nHibernate,hibernate\nHibernationOptions,hibernation_options\nHibernationOptionsRequest,hibernation_options_request\nHibernationSupported,hibernation_supported\nHiddenColumns,hidden_columns\nHiddenFromGlobalAddressList,hidden_from_global_address_list\nHideDisabled,hide_disabled\nHidePassword,hide_password\nHierarchicalAccessControlList,hierarchical_access_control_list\nHierarchicalPrincipal,hierarchical_principal\nHierarchyGroup,hierarchy_group\nHierarchyGroupArn,hierarchy_group_arn\nHierarchyGroupCondition,hierarchy_group_condition\nHierarchyGroupId,hierarchy_group_id\nHierarchyGroupMatchType,hierarchy_group_match_type\nHierarchyGroupSummary,hierarchy_group_summary\nHierarchyGroupSummaryReference,hierarchy_group_summary_reference\nHierarchyId,hierarchy_id\nHierarchyLevel,hierarchy_level\nHierarchyLevelLimitExceededException,hierarchy_level_limit_exceeded_exception\nHierarchyLevelUpdate,hierarchy_level_update\nHierarchyPath,hierarchy_path\nHierarchyPathReference,hierarchy_path_reference\nHierarchyStructure,hierarchy_structure\nHierarchyStructureUpdate,hierarchy_structure_update\nHierarchyTypeMismatchException,hierarchy_type_mismatch_exception\nHigh,high\nHighAction,high_action\nHighAvailabilityConfig,high_availability_config\nHighCount,high_count\nHighestSeverityThreatDetails,highest_severity_threat_details\nHighlight,highlight\nHighlightColor,highlight_color\nHighlightEnabled,highlight_enabled\nHighlighted,highlighted\nHighlights,highlights\nHistogramAggregatedFieldWells,histogram_aggregated_field_wells\nHistogramBinOptions,histogram_bin_options\nHistogramConfiguration,histogram_configuration\nHistogramEntry,histogram_entry\nHistogramFieldWells,histogram_field_wells\nHistogramVisual,histogram_visual\nHistoricalDataPathList,historical_data_path_list\nHistoricalMetric,historical_metric\nHistoricalMetricData,historical_metric_data\nHistoricalMetricResult,historical_metric_result\nHistoricalMetrics,historical_metrics\nHistoricalOptions,historical_options\nHistory,history\nHistoryData,history_data\nHistoryEvent,history_event\nHistoryEventExecutionDataDetails,history_event_execution_data_details\nHistoryItemType,history_item_type\nHistoryRecord,history_record\nHistoryRecordEntry,history_record_entry\nHistoryRecords,history_records\nHistorySummary,history_summary\nHit,hit\nHits,hits\nHive,hive\nHiveCompatiblePartitions,hive_compatible_partitions\nHiveJsonSerDe,hive_json_ser_de\nHlsAdditionalManifest,hls_additional_manifest\nHlsAkamaiSettings,hls_akamai_settings\nHlsBasicPutSettings,hls_basic_put_settings\nHlsCaptionLanguageMapping,hls_caption_language_mapping\nHlsCdnSettings,hls_cdn_settings\nHlsConfiguration,hls_configuration\nHlsContentProtection,hls_content_protection\nHlsEncryption,hls_encryption\nHlsEncryptionSettings,hls_encryption_settings\nHlsGroupSettings,hls_group_settings\nHlsId3SegmentTagging,hls_id3_segment_tagging\nHlsId3SegmentTaggingScheduleActionSettings,hls_id3_segment_tagging_schedule_action_settings\nHlsId3SegmentTaggingSettings,hls_id3_segment_tagging_settings\nHlsImageBasedTrickPlaySettings,hls_image_based_trick_play_settings\nHlsIngest,hls_ingest\nHlsInputSettings,hls_input_settings\nHlsManifest,hls_manifest\nHlsManifestCreateOrUpdateParameters,hls_manifest_create_or_update_parameters\nHlsManifests,hls_manifests\nHlsMediaStoreSettings,hls_media_store_settings\nHlsOutputSettings,hls_output_settings\nHlsPackage,hls_package\nHlsPlaylistSettings,hls_playlist_settings\nHlsRenditionGroupSettings,hls_rendition_group_settings\nHlsS3Settings,hls_s3_settings\nHlsSettings,hls_settings\nHlsSignaledSystemIds,hls_signaled_system_ids\nHlsTimedMetadataScheduleActionSettings,hls_timed_metadata_schedule_action_settings\nHlsTimedMetadataSettings,hls_timed_metadata_settings\nHlsWebdavSettings,hls_webdav_settings\nHoldout,holdout\nHoldoutActivity,holdout_activity\nHoldoutPercent,holdout_percent\nHolidayConfig,holiday_config\nHolidayConfigAttributes,holiday_config_attributes\nHomeDirectory,home_directory\nHomeDirectoryMapEntry,home_directory_map_entry\nHomeDirectoryMappings,home_directory_mappings\nHomeDirectoryType,home_directory_type\nHomeEfsFileSystem,home_efs_file_system\nHomeEfsFileSystemId,home_efs_file_system_id\nHomeEfsFileSystemKmsKeyId,home_efs_file_system_kms_key_id\nHomeEfsFileSystemUid,home_efs_file_system_uid\nHomePageUrl,home_page_url\nHomePhoneNumber,home_phone_number\nHomeRegion,home_region\nHomeRegionControl,home_region_control\nHomeRegionControls,home_region_controls\nHomeRegionNotSetException,home_region_not_set_exception\nHomeRegions,home_regions\nHomogeneous,homogeneous\nHoneycode,honeycode\nHoneycodeConnectorProfileCredentials,honeycode_connector_profile_credentials\nHoneycodeDestinationProperties,honeycode_destination_properties\nHoneycodeMetadata,honeycode_metadata\nHonorCooldown,honor_cooldown\nHonorificPrefix,honorific_prefix\nHonorificSuffix,honorific_suffix\nHook,hook\nHookConfiguration,hook_configuration\nHookFailureMode,hook_failure_mode\nHookInvocationCount,hook_invocation_count\nHookInvocationPoint,hook_invocation_point\nHookParameters,hook_parameters\nHookStatus,hook_status\nHookStatusReason,hook_status_reason\nHookType,hook_type\nHooks,hooks\nHopDestination,hop_destination\nHopDestinations,hop_destinations\nHorizontal,horizontal\nHorizontalAccuracy,horizontal_accuracy\nHorizontalAlign,horizontal_align\nHorizontalLayoutConfiguration,horizontal_layout_configuration\nHorizontalOffset,horizontal_offset\nHorizontalPosition,horizontal_position\nHorizontalTextAlignment,horizontal_text_alignment\nHorovod,horovod\nHost,host\nHostAddress,host_address\nHostArn,host_arn\nHostArnFilter,host_arn_filter\nHostEntry,host_entry\nHostEnvironment,host_environment\nHostEnvironmentId,host_environment_id\nHostHeaderConditionConfig,host_header_condition_config\nHostHeaderConfig,host_header_config\nHostId,host_id\nHostIdFilter,host_id_filter\nHostIdSet,host_id_set\nHostIds,host_ids\nHostInstance,host_instance\nHostInstanceType,host_instance_type\nHostIp,host_ip\nHostKey,host_key\nHostKeyAttributes,host_key_attributes\nHostKeyBody,host_key_body\nHostKeyFingerprint,host_key_fingerprint\nHostKeyId,host_key_id\nHostKeys,host_keys\nHostMaintenance,host_maintenance\nHostName,host_name\nHostNetwork,host_network\nHostOffering,host_offering\nHostPath,host_path\nHostPort,host_port\nHostProperties,host_properties\nHostRecovery,host_recovery\nHostReservation,host_reservation\nHostReservationId,host_reservation_id\nHostReservationIdSet,host_reservation_id_set\nHostReservationSet,host_reservation_set\nHostResourceGroupArn,host_resource_group_arn\nHostRole,host_role\nHostUrl,host_url\nHostVPCId,host_vpc_id\nHostVolumeProperties,host_volume_properties\nHostedConfigurationVersion,hosted_configuration_version\nHostedConfigurationVersionSummary,hosted_configuration_version_summary\nHostedConfigurationVersions,hosted_configuration_versions\nHostedZone,hosted_zone\nHostedZoneAlreadyExists,hosted_zone_already_exists\nHostedZoneArn,hosted_zone_arn\nHostedZoneConfig,hosted_zone_config\nHostedZoneCount,hosted_zone_count\nHostedZoneId,hosted_zone_id\nHostedZoneIdMarker,hosted_zone_id_marker\nHostedZoneLimit,hosted_zone_limit\nHostedZoneNotEmpty,hosted_zone_not_empty\nHostedZoneNotFound,hosted_zone_not_found\nHostedZoneNotPrivate,hosted_zone_not_private\nHostedZoneOwner,hosted_zone_owner\nHostedZonePartiallyDelegated,hosted_zone_partially_delegated\nHostedZoneSummaries,hosted_zone_summaries\nHostedZoneSummary,hosted_zone_summary\nHostedZones,hosted_zones\nHostname,hostname\nHostnameTheme,hostname_theme\nHostnameType,hostname_type\nHosts,hosts\nHour,hour\nHourOfDay,hour_of_day\nHourlyCommitmentToPurchase,hourly_commitment_to_purchase\nHourlyOnDemandRate,hourly_on_demand_rate\nHourlyPrice,hourly_price\nHours,hours\nHoursOfOperation,hours_of_operation\nHoursOfOperationArn,hours_of_operation_arn\nHoursOfOperationConfig,hours_of_operation_config\nHoursOfOperationId,hours_of_operation_id\nHoursOfOperationSearchCriteria,hours_of_operation_search_criteria\nHoursOfOperationSearchFilter,hours_of_operation_search_filter\nHoursOfOperationSummary,hours_of_operation_summary\nHoursOfOperationSummaryList,hours_of_operation_summary_list\nHoursOfOperationTimeSlice,hours_of_operation_time_slice\nHoursOfOperations,hours_of_operations\nHrAllowed,hr_allowed\nHrdBufferFinalFillPercentage,hrd_buffer_final_fill_percentage\nHrdBufferInitialFillPercentage,hrd_buffer_initial_fill_percentage\nHrdBufferSize,hrd_buffer_size\nHref,href\nHsm,hsm\nHsmArn,hsm_arn\nHsmCertificate,hsm_certificate\nHsmClientCertificate,hsm_client_certificate\nHsmClientCertificateAlreadyExistsFault,hsm_client_certificate_already_exists_fault\nHsmClientCertificateIdentifier,hsm_client_certificate_identifier\nHsmClientCertificateMessage,hsm_client_certificate_message\nHsmClientCertificateNotFoundFault,hsm_client_certificate_not_found_fault\nHsmClientCertificatePublicKey,hsm_client_certificate_public_key\nHsmClientCertificateQuotaExceededFault,hsm_client_certificate_quota_exceeded_fault\nHsmClientCertificates,hsm_client_certificates\nHsmConfiguration,hsm_configuration\nHsmConfigurationAlreadyExistsFault,hsm_configuration_already_exists_fault\nHsmConfigurationIdentifier,hsm_configuration_identifier\nHsmConfigurationMessage,hsm_configuration_message\nHsmConfigurationNotFoundFault,hsm_configuration_not_found_fault\nHsmConfigurationQuotaExceededFault,hsm_configuration_quota_exceeded_fault\nHsmConfigurations,hsm_configurations\nHsmId,hsm_id\nHsmIpAddress,hsm_ip_address\nHsmList,hsm_list\nHsmPartitionName,hsm_partition_name\nHsmPartitionPassword,hsm_partition_password\nHsmSerialNumber,hsm_serial_number\nHsmServerPublicCertificate,hsm_server_public_certificate\nHsmStatus,hsm_status\nHsmType,hsm_type\nHsms,hsms\nHsmsLastActionFailed,hsms_last_action_failed\nHsmsPendingDeletion,hsms_pending_deletion\nHsmsPendingRegistration,hsms_pending_registration\nHsrOperationMode,hsr_operation_mode\nHsrReplicationMode,hsr_replication_mode\nHsrTier,hsr_tier\nHtml,html\nHtmlBody,html_body\nHtmlMotionGraphicsSettings,html_motion_graphics_settings\nHtmlPart,html_part\nHttp,http\nHttpAction,http_action\nHttpActionHeader,http_action_header\nHttpAuthorization,http_authorization\nHttpCode,http_code\nHttpConfiguration,http_configuration\nHttpContext,http_context\nHttpDataSourceConfig,http_data_source_config\nHttpEndpoint,http_endpoint\nHttpEndpointBufferingHints,http_endpoint_buffering_hints\nHttpEndpointCommonAttribute,http_endpoint_common_attribute\nHttpEndpointConfiguration,http_endpoint_configuration\nHttpEndpointDescription,http_endpoint_description\nHttpEndpointDestinationConfiguration,http_endpoint_destination_configuration\nHttpEndpointDestinationDescription,http_endpoint_destination_description\nHttpEndpointDestinationUpdate,http_endpoint_destination_update\nHttpEndpointEnabled,http_endpoint_enabled\nHttpEndpointRequestConfiguration,http_endpoint_request_configuration\nHttpEndpointRetryOptions,http_endpoint_retry_options\nHttpErrorCodeReturnedEquals,http_error_code_returned_equals\nHttpExpiresDate,http_expires_date\nHttpFailureFeedbackRoleArn,http_failure_feedback_role_arn\nHttpGatewayRoute,http_gateway_route\nHttpGatewayRouteAction,http_gateway_route_action\nHttpGatewayRouteHeader,http_gateway_route_header\nHttpGatewayRouteMatch,http_gateway_route_match\nHttpGatewayRoutePathRewrite,http_gateway_route_path_rewrite\nHttpGatewayRoutePrefixRewrite,http_gateway_route_prefix_rewrite\nHttpGatewayRouteRewrite,http_gateway_route_rewrite\nHttpHeader,http_header\nHttpHeaderConditionConfig,http_header_condition_config\nHttpHeaderConfig,http_header_config\nHttpHeaderName,http_header_name\nHttpHeaders,http_headers\nHttpInputs,http_inputs\nHttpInstanceSummary,http_instance_summary\nHttpMatch,http_match\nHttpMethod,http_method\nHttpName,http_name\nHttpNamespaceChange,http_namespace_change\nHttpPackageConfiguration,http_package_configuration\nHttpPackageConfigurations,http_package_configurations\nHttpParameters,http_parameters\nHttpPathMatch,http_path_match\nHttpPort,http_port\nHttpProperties,http_properties\nHttpProtocolIpv6,http_protocol_ipv6\nHttpPutResponseHopLimit,http_put_response_hop_limit\nHttpQueryParameter,http_query_parameter\nHttpRedirectCode,http_redirect_code\nHttpRequestMethodConditionConfig,http_request_method_condition_config\nHttpRequestMethodConfig,http_request_method_config\nHttpRetryPolicy,http_retry_policy\nHttpRoute,http_route\nHttpRouteAction,http_route_action\nHttpRouteHeader,http_route_header\nHttpRouteMatch,http_route_match\nHttpStatus,http_status\nHttpSuccessFeedbackRoleArn,http_success_feedback_role_arn\nHttpTimeout,http_timeout\nHttpTokens,http_tokens\nHttpTransferMode,http_transfer_mode\nHttpURL,http_url\nHttpUrlDestinationConfiguration,http_url_destination_configuration\nHttpUrlDestinationProperties,http_url_destination_properties\nHttpUrlDestinationSummary,http_url_destination_summary\nHttpVersion,http_version\nHttpsInputs,https_inputs\nHttpsNotificationConfiguration,https_notification_configuration\nHttpsPort,https_port\nHubArn,hub_arn\nHubContentArn,hub_content_arn\nHubContentDependencies,hub_content_dependencies\nHubContentDependency,hub_content_dependency\nHubContentDescription,hub_content_description\nHubContentDisplayName,hub_content_display_name\nHubContentDocument,hub_content_document\nHubContentInfo,hub_content_info\nHubContentMarkdown,hub_content_markdown\nHubContentName,hub_content_name\nHubContentSearchKeywords,hub_content_search_keywords\nHubContentStatus,hub_content_status\nHubContentSummaries,hub_content_summaries\nHubContentType,hub_content_type\nHubContentVersion,hub_content_version\nHubDescription,hub_description\nHubDeviceArn,hub_device_arn\nHubDisplayName,hub_display_name\nHubInfo,hub_info\nHubName,hub_name\nHubS3StorageConfig,hub_s3_storage_config\nHubSearchKeywords,hub_search_keywords\nHubStatus,hub_status\nHubSummaries,hub_summaries\nHudiTarget,hudi_target\nHudiTargets,hudi_targets\nHue,hue\nHumanLabeled,human_labeled\nHumanLoopActivationConditions,human_loop_activation_conditions\nHumanLoopActivationConditionsConfig,human_loop_activation_conditions_config\nHumanLoopActivationConditionsEvaluationResults,human_loop_activation_conditions_evaluation_results\nHumanLoopActivationConfig,human_loop_activation_config\nHumanLoopActivationOutput,human_loop_activation_output\nHumanLoopActivationReasons,human_loop_activation_reasons\nHumanLoopArn,human_loop_arn\nHumanLoopConfig,human_loop_config\nHumanLoopDataAttributes,human_loop_data_attributes\nHumanLoopInput,human_loop_input\nHumanLoopName,human_loop_name\nHumanLoopOutput,human_loop_output\nHumanLoopQuotaExceededException,human_loop_quota_exceeded_exception\nHumanLoopRequestSource,human_loop_request_source\nHumanLoopStatus,human_loop_status\nHumanLoopSummaries,human_loop_summaries\nHumanLoopSummary,human_loop_summary\nHumanTaskConfig,human_task_config\nHumanTaskUiArn,human_task_ui_arn\nHumanTaskUiName,human_task_ui_name\nHumanTaskUiStatus,human_task_ui_status\nHumanTaskUiSummaries,human_task_ui_summaries\nHumanTaskUiSummary,human_task_ui_summary\nHwAddress,hw_address\nHybridAccessEnabled,hybrid_access_enabled\nHybridJobQueueInfo,hybrid_job_queue_info\nHyperParameterAlgorithmSpecification,hyper_parameter_algorithm_specification\nHyperParameterRanges,hyper_parameter_ranges\nHyperParameterSpecification,hyper_parameter_specification\nHyperParameterTrainingJobDefinition,hyper_parameter_training_job_definition\nHyperParameterTrainingJobSummary,hyper_parameter_training_job_summary\nHyperParameterTuningEndTime,hyper_parameter_tuning_end_time\nHyperParameterTuningInstanceConfig,hyper_parameter_tuning_instance_config\nHyperParameterTuningJob,hyper_parameter_tuning_job\nHyperParameterTuningJobArn,hyper_parameter_tuning_job_arn\nHyperParameterTuningJobCompletionDetails,hyper_parameter_tuning_job_completion_details\nHyperParameterTuningJobConfig,hyper_parameter_tuning_job_config\nHyperParameterTuningJobConsumedResources,hyper_parameter_tuning_job_consumed_resources\nHyperParameterTuningJobName,hyper_parameter_tuning_job_name\nHyperParameterTuningJobObjective,hyper_parameter_tuning_job_objective\nHyperParameterTuningJobSearchEntity,hyper_parameter_tuning_job_search_entity\nHyperParameterTuningJobStatus,hyper_parameter_tuning_job_status\nHyperParameterTuningJobStrategyConfig,hyper_parameter_tuning_job_strategy_config\nHyperParameterTuningJobSummaries,hyper_parameter_tuning_job_summaries\nHyperParameterTuningJobSummary,hyper_parameter_tuning_job_summary\nHyperParameterTuningJobWarmStartConfig,hyper_parameter_tuning_job_warm_start_config\nHyperParameterTuningResourceConfig,hyper_parameter_tuning_resource_config\nHyperParameters,hyper_parameters\nHyperbandStrategyConfig,hyperband_strategy_config\nHypervisor,hypervisor\nHypervisorArn,hypervisor_arn\nHypervisorDetails,hypervisor_details\nHypervisorId,hypervisor_id\nHypervisors,hypervisors\nIAMAuth,iam_auth\nIAMCertificateId,iam_certificate_id\nIAMDatabaseAuthenticationEnabled,iam_database_authentication_enabled\nIAMIdentityCenterInstanceArn,iam_identity_center_instance_arn\nIAMPolicyAssignment,iam_policy_assignment\nIAMPolicyAssignmentSummary,iam_policy_assignment_summary\nIAMPolicyAssignments,iam_policy_assignments\nIAMRoleARN,iam_role_arn\nIAMRoleIdentity,iam_role_identity\nIAMRoleName,iam_role_name\nIAMUser,iam_user\nIAMUserIdentity,iam_user_identity\nIBMDb2Settings,ibm_db2_settings\nICD10CMAttribute,icd10_cm_attribute\nICD10CMConcept,icd10_cm_concept\nICD10CMConcepts,icd10_cm_concepts\nICD10CMEntity,icd10_cm_entity\nICD10CMTrait,icd10_cm_trait\nICPRecordalStatus,icp_recordal_status\nID,id\nIDLE,idle\nIDPCommunicationErrorException,idp_communication_error_exception\nIDPRejectedClaimException,idp_rejected_claim_exception\nIFrameOnlyManifest,i_frame_only_manifest\nIFrameOnlyPlaylists,i_frame_only_playlists\nIKEVersions,ike_versions\nIKEVersionsListValue,ike_versions_list_value\nIKEVersionsRequestListValue,ike_versions_request_list_value\nIND,ind\nINDTaxDocuments,ind_tax_documents\nIOOptimizedNextAllowedModificationTime,io_optimized_next_allowed_modification_time\nIOPS,iops\nIOS,ios\nIOUsage,io_usage\nIOWait,io_wait\nIP,ip\nIPAddress,ip_address\nIPAddressBasedRemoteInfo,ip_address_based_remote_info\nIPAddressType,ip_address_type\nIPAddressVersion,ip_address_version\nIPDialIn,ip_dial_in\nIPRange,ip_range\nIPRanges,ip_ranges\nIPSet,ip_set\nIPSetDescriptor,ip_set_descriptor\nIPSetDescriptors,ip_set_descriptors\nIPSetForwardedIPConfig,ip_set_forwarded_ip_config\nIPSetId,ip_set_id\nIPSetMetadata,ip_set_metadata\nIPSetReference,ip_set_reference\nIPSetReferenceStatement,ip_set_reference_statement\nIPSetReferences,ip_set_references\nIPSetSummary,ip_set_summary\nIPSetUpdate,ip_set_update\nIPSets,ip_sets\nIPV4Range,ipv4_range\nIPV6Range,ipv6_range\nIPv6Address,ipv6_address\nIRQ,irq\nIam,iam\nIamActionDefinition,iam_action_definition\nIamArn,iam_arn\nIamArnRequiredException,iam_arn_required_exception\nIamAuthEnabled,iam_auth_enabled\nIamCertificateId,iam_certificate_id\nIamDatabaseAuthenticationEnabled,iam_database_authentication_enabled\nIamFleetRole,iam_fleet_role\nIamIdentity,iam_identity\nIamInstanceProfile,iam_instance_profile\nIamInstanceProfileArn,iam_instance_profile_arn\nIamInstanceProfileAssociation,iam_instance_profile_association\nIamInstanceProfileAssociations,iam_instance_profile_associations\nIamInstanceProfileSpecification,iam_instance_profile_specification\nIamRegistrationResponse,iam_registration_response\nIamResources,iam_resources\nIamRole,iam_role\nIamRoleArn,iam_role_arn\nIamRoleConfiguration,iam_role_configuration\nIamRoleId,iam_role_id\nIamRoleMissingPermissionsFault,iam_role_missing_permissions_fault\nIamRoleName,iam_role_name\nIamRoleNotFoundFault,iam_role_not_found_fault\nIamRoles,iam_roles\nIamSessionArnAlreadyRegisteredException,iam_session_arn_already_registered_exception\nIamUser,iam_user\nIamUserAccessToBilling,iam_user_access_to_billing\nIamUserArn,iam_user_arn\nIamUserArnAlreadyRegisteredException,iam_user_arn_already_registered_exception\nIamUserArnRequiredException,iam_user_arn_required_exception\nIamUserArns,iam_user_arns\nIanaProtocolNumber,iana_protocol_number\nIatTtL,iat_ttl\nIbm3624NaturalPin,ibm3624_natural_pin\nIbm3624PinFromOffset,ibm3624_pin_from_offset\nIbm3624PinOffset,ibm3624_pin_offset\nIbm3624PinVerification,ibm3624_pin_verification\nIbm3624RandomPin,ibm3624_random_pin\nIceServer,ice_server\nIceServerList,ice_server_list\nIcebergInput,iceberg_input\nIcebergTarget,iceberg_target\nIcebergTargets,iceberg_targets\nIcmpTypeCode,icmp_type_code\nIcon,icon\nIconDisplayOption,icon_display_option\nIconOptions,icon_options\nIconReference,icon_reference\nIconS3Location,icon_s3_location\nIconSet,icon_set\nIconSetType,icon_set_type\nIconURL,icon_url\nIconUrl,icon_url\nId,id\nId3,id3\nId3Insertion,id3_insertion\nId3Insertions,id3_insertions\nIdAttributeName,id_attribute_name\nIdFormat,id_format\nIdToken,id_token\nIdTokenValidity,id_token_validity\nIde,ide\nIdeConfiguration,ide_configuration\nIdempotencyException,idempotency_exception\nIdempotencyParameterMismatchException,idempotency_parameter_mismatch_exception\nIdempotencyToken,idempotency_token\nIdempotentParameterMismatch,idempotent_parameter_mismatch\nIdempotentParameterMismatchException,idempotent_parameter_mismatch_exception\nIdentificationExpirationDate,identification_expiration_date\nIdentificationHints,identification_hints\nIdentificationIssuingOrg,identification_issuing_org\nIdentificationNumber,identification_number\nIdentifiedLanguageScore,identified_language_score\nIdentifiedUserName,identified_user_name\nIdentifier,identifier\nIdentifierPath,identifier_path\nIdentifierType,identifier_type\nIdentifiers,identifiers\nIdentifyLanguage,identify_language\nIdentifyMultipleLanguages,identify_multiple_languages\nIdentities,identities\nIdentity,identity\nIdentityAttributeName,identity_attribute_name\nIdentityAttributeOrder,identity_attribute_order\nIdentityAttributeValues,identity_attribute_values\nIdentityDescription,identity_description\nIdentityDkimAttributes,identity_dkim_attributes\nIdentityDocument,identity_document\nIdentityDocumentField,identity_document_field\nIdentityDocumentFields,identity_document_fields\nIdentityDocuments,identity_documents\nIdentityId,identity_id\nIdentityIdsToDelete,identity_ids_to_delete\nIdentityInfo,identity_info\nIdentityMailFromDomainAttributes,identity_mail_from_domain_attributes\nIdentityManagementType,identity_management_type\nIdentityName,identity_name\nIdentityNotificationAttributes,identity_notification_attributes\nIdentityPool,identity_pool\nIdentityPoolConfigs,identity_pool_configs\nIdentityPoolId,identity_pool_id\nIdentityPoolName,identity_pool_name\nIdentityPoolShortDescription,identity_pool_short_description\nIdentityPoolTags,identity_pool_tags\nIdentityPoolUsage,identity_pool_usage\nIdentityPoolUsages,identity_pool_usages\nIdentityPools,identity_pools\nIdentityProvider,identity_provider\nIdentityProviderConfig,identity_provider_config\nIdentityProviderConfigResponse,identity_provider_config_response\nIdentityProviderConfiguration,identity_provider_configuration\nIdentityProviderDetails,identity_provider_details\nIdentityProviderName,identity_provider_name\nIdentityProviderOAuthSetting,identity_provider_o_auth_setting\nIdentityProviderOAuthSettings,identity_provider_o_auth_settings\nIdentityProviderSamlMetadata,identity_provider_saml_metadata\nIdentityProviderSummaries,identity_provider_summaries\nIdentityProviderSummary,identity_provider_summary\nIdentityProviderType,identity_provider_type\nIdentityResolutionJob,identity_resolution_job\nIdentityResolutionJobsList,identity_resolution_jobs_list\nIdentitySource,identity_source\nIdentitySourceDetails,identity_source_details\nIdentitySourceFilter,identity_source_filter\nIdentitySourceItem,identity_source_item\nIdentitySourceItemDetails,identity_source_item_details\nIdentityStore,identity_store\nIdentityStoreId,identity_store_id\nIdentityType,identity_type\nIdentityTypeNotSupportedException,identity_type_not_supported_exception\nIdentityUsage,identity_usage\nIdentityValidationExpression,identity_validation_expression\nIdentityVerificationAttributes,identity_verification_attributes\nIdle,idle\nIdleClientTimeout,idle_client_timeout\nIdleDisconnectTimeoutInSeconds,idle_disconnect_timeout_in_seconds\nIdleSinceDateTime,idle_since_date_time\nIdleTTL,idle_ttl\nIdleTimeBetweenReadsInMs,idle_time_between_reads_in_ms\nIdleTimeout,idle_timeout\nIdleTimeoutSeconds,idle_timeout_seconds\nIdnLangCode,idn_lang_code\nIdp,idp\nIdpAuthUrl,idp_auth_url\nIdpIdentifier,idp_identifier\nIdpIdentifiers,idp_identifiers\nIdpLambdaArn,idp_lambda_arn\nIdpRelayStateParameterName,idp_relay_state_parameter_name\nIds,ids\nIfMatch,if_match\nIfModifiedSince,if_modified_since\nIfNoneMatch,if_none_match\nIfUnmodifiedSince,if_unmodified_since\nIgmpv2Support,igmpv2_support\nIgnoreCoordinates,ignore_coordinates\nIgnoreErrors,ignore_errors\nIgnoreHeaderRows,ignore_header_rows\nIgnoreMetricsTime,ignore_metrics_time\nIgnorePollAlarmFailure,ignore_poll_alarm_failure\nIgnorePublicAcls,ignore_public_acls\nIgnoreUnsupportedType,ignore_unsupported_type\nIkeVersions,ike_versions\nIllegalActionException,illegal_action_exception\nIllegalArgumentException,illegal_argument_exception\nIllegalBlueprintStateException,illegal_blueprint_state_exception\nIllegalDelete,illegal_delete\nIllegalFieldLevelEncryptionConfigAssociationWithCacheBehavior,illegal_field_level_encryption_config_association_with_cache_behavior\nIllegalOriginAccessConfiguration,illegal_origin_access_configuration\nIllegalSessionStateException,illegal_session_state_exception\nIllegalStatusException,illegal_status_exception\nIllegalUpdate,illegal_update\nIllegalUserStateException,illegal_user_state_exception\nIllegalWorkflowStateException,illegal_workflow_state_exception\nImage,image\nImageAggregation,image_aggregation\nImageAlreadyExistsException,image_already_exists_exception\nImageArn,image_arn\nImageAssets,image_assets\nImageAttribute,image_attribute\nImageBasedTrickPlay,image_based_trick_play\nImageBasedTrickPlaySettings,image_based_trick_play_settings\nImageBlockPublicAccessState,image_block_public_access_state\nImageBuilder,image_builder\nImageBuilderErrors,image_builder_errors\nImageBuilderName,image_builder_name\nImageBuilderStateChangeReason,image_builder_state_change_reason\nImageBuilderSupported,image_builder_supported\nImageBuilders,image_builders\nImageClassificationJobConfig,image_classification_job_config\nImageConfig,image_config\nImageConfigError,image_config_error\nImageConfigResponse,image_config_response\nImageConfiguration,image_configuration\nImageConfigurationInput,image_configuration_input\nImageContent,image_content\nImageData,image_data\nImageDescription,image_description\nImageDetail,image_detail\nImageDigest,image_digest\nImageDigestDoesNotMatchException,image_digest_does_not_match_exception\nImageDiskContainer,image_disk_container\nImageErrors,image_errors\nImageFailure,image_failure\nImageFile,image_file\nImageFrameInformation,image_frame_information\nImageGenerationConfiguration,image_generation_configuration\nImageGenerationDestinationConfig,image_generation_destination_config\nImageIconUrl,image_icon_url\nImageId,image_id\nImageIdentifier,image_identifier\nImageIds,image_ids\nImageInserter,image_inserter\nImageInserterInput,image_inserter_input\nImageLayerAggregation,image_layer_aggregation\nImageLayerAggregationResponse,image_layer_aggregation_response\nImageLocation,image_location\nImageMask,image_mask\nImageName,image_name\nImageNotFoundException,image_not_found_exception\nImageOwnerAlias,image_owner_alias\nImagePackage,image_package\nImagePermission,image_permission\nImagePermissions,image_permissions\nImagePipeline,image_pipeline\nImagePipelineAggregation,image_pipeline_aggregation\nImagePrefix,image_prefix\nImageProperties,image_properties\nImagePublishedAt,image_published_at\nImagePullCredentialsType,image_pull_credentials_type\nImageQuality,image_quality\nImageRecipe,image_recipe\nImageRecipeSummary,image_recipe_summary\nImageRecycleBinInfo,image_recycle_bin_info\nImageReplicationStatus,image_replication_status\nImageRepository,image_repository\nImageRepositoryType,image_repository_type\nImageResponseCard,image_response_card\nImageScaling,image_scaling\nImageScanFinding,image_scan_finding\nImageScanFindingAggregation,image_scan_finding_aggregation\nImageScanFindings,image_scan_findings\nImageScanFindingsFilter,image_scan_findings_filter\nImageScanFindingsSummary,image_scan_findings_summary\nImageScanState,image_scan_state\nImageScanStatus,image_scan_status\nImageScanStatuses,image_scan_statuses\nImageScanningConfiguration,image_scanning_configuration\nImageSelectorType,image_selector_type\nImageSetProperties,image_set_properties\nImageSetWorkflowStatus,image_set_workflow_status\nImageSetsMetadataSummary,image_sets_metadata_summary\nImageSmallIconUrl,image_small_icon_url\nImageSource,image_source\nImageSourceBands,image_source_bands\nImageState,image_state\nImageStateChangeReason,image_state_change_reason\nImageStats,image_stats\nImageStatus,image_status\nImageSummary,image_summary\nImageTagAlreadyExistsException,image_tag_already_exists_exception\nImageTagDetail,image_tag_detail\nImageTagMutability,image_tag_mutability\nImageTags,image_tags\nImageTestsConfiguration,image_tests_configuration\nImageTooLargeException,image_too_large_exception\nImageType,image_type\nImageUri,image_uri\nImageUrl,image_url\nImageVersion,image_version\nImageVersionArn,image_version_arn\nImageVersionNumber,image_version_number\nImageVersionStatus,image_version_status\nImageVersions,image_versions\nImageX,image_x\nImageY,image_y\nImages,images\nImdsSupport,imds_support\nImmediateModeScheduleActionStartSettings,immediate_mode_schedule_action_start_settings\nImmunityTime,immunity_time\nImmunityTimeProperty,immunity_time_property\nImpact,impact\nImpactEndTime,impact_end_time\nImpactLevel,impact_level\nImpactStartTime,impact_start_time\nImpactType,impact_type\nImpactedLocation,impacted_location\nImpactedLocations,impacted_locations\nImpairedSince,impaired_since\nImpersonationMatchedRule,impersonation_matched_rule\nImpersonationRole,impersonation_role\nImpersonationRoleId,impersonation_role_id\nImpersonationRoleIds,impersonation_role_ids\nImpersonationRule,impersonation_rule\nImpersonationRuleId,impersonation_rule_id\nImplicitDeny,implicit_deny\nImportApiKeysRequest,import_api_keys_request\nImportApiRequest,import_api_request\nImportApiResponse,import_api_response\nImportAppCatalogRequest,import_app_catalog_request\nImportApplicationUsageRequest,import_application_usage_request\nImportApplicationUsageResult,import_application_usage_result\nImportArn,import_arn\nImportAsProvisionedProductInput,import_as_provisioned_product_input\nImportAsProvisionedProductOutput,import_as_provisioned_product_output\nImportAssetFromApiGatewayApi,import_asset_from_api_gateway_api\nImportAssetFromApiGatewayApiRequestDetails,import_asset_from_api_gateway_api_request_details\nImportAssetFromApiGatewayApiResponseDetails,import_asset_from_api_gateway_api_response_details\nImportAssetFromSignedUrl,import_asset_from_signed_url\nImportAssetFromSignedUrlJobErrorDetails,import_asset_from_signed_url_job_error_details\nImportAssetFromSignedUrlRequestDetails,import_asset_from_signed_url_request_details\nImportAssetFromSignedUrlResponseDetails,import_asset_from_signed_url_response_details\nImportAssetsFromLakeFormationTagPolicy,import_assets_from_lake_formation_tag_policy\nImportAssetsFromLakeFormationTagPolicyRequestDetails,import_assets_from_lake_formation_tag_policy_request_details\nImportAssetsFromLakeFormationTagPolicyResponseDetails,import_assets_from_lake_formation_tag_policy_response_details\nImportAssetsFromRedshiftDataShares,import_assets_from_redshift_data_shares\nImportAssetsFromRedshiftDataSharesRequestDetails,import_assets_from_redshift_data_shares_request_details\nImportAssetsFromRedshiftDataSharesResponseDetails,import_assets_from_redshift_data_shares_response_details\nImportAssetsFromS3,import_assets_from_s3\nImportAssetsFromS3JobErrorDetails,import_assets_from_s3_job_error_details\nImportAssetsFromS3RequestDetails,import_assets_from_s3_request_details\nImportAssetsFromS3ResponseDetails,import_assets_from_s3_response_details\nImportBackendAuthRequest,import_backend_auth_request\nImportBackendAuthResponse,import_backend_auth_response\nImportBackendStorageRequest,import_backend_storage_request\nImportBackendStorageResponse,import_backend_storage_response\nImportCatalogToGlueRequest,import_catalog_to_glue_request\nImportCertificateAuthorityCertificateRequest,import_certificate_authority_certificate_request\nImportCertificateMessage,import_certificate_message\nImportCertificateRequest,import_certificate_request\nImportCertificateResponse,import_certificate_response\nImportClientBrandingRequest,import_client_branding_request\nImportClientBrandingResult,import_client_branding_result\nImportClientVpnClientCertificateRevocationListRequest,import_client_vpn_client_certificate_revocation_list_request\nImportClientVpnClientCertificateRevocationListResult,import_client_vpn_client_certificate_revocation_list_result\nImportCompleted,import_completed\nImportComponentRequest,import_component_request\nImportComponentResponse,import_component_response\nImportConflictException,import_conflict_exception\nImportCrlRequest,import_crl_request\nImportDataSource,import_data_source\nImportDataSourceConfig,import_data_source_config\nImportDatasetRequest,import_dataset_request\nImportDatasetResponse,import_dataset_response\nImportDecoderManifestRequest,import_decoder_manifest_request\nImportDecoderManifestResponse,import_decoder_manifest_response\nImportDefinition,import_definition\nImportDestination,import_destination\nImportDestinationType,import_destination_type\nImportDocumentationPartsRequest,import_documentation_parts_request\nImportErrorData,import_error_data\nImportFailureListItem,import_failure_list_item\nImportFileTaskInformation,import_file_task_information\nImportFilter,import_filter\nImportFindingsError,import_findings_error\nImportFirewallDomainsRequest,import_firewall_domains_request\nImportFirewallDomainsResponse,import_firewall_domains_response\nImportGameConfigurationRequest,import_game_configuration_request\nImportGameConfigurationResult,import_game_configuration_result\nImportGameConfigurationSource,import_game_configuration_source\nImportHostKeyRequest,import_host_key_request\nImportHostKeyResponse,import_host_key_response\nImportHubContentRequest,import_hub_content_request\nImportHubContentResponse,import_hub_content_response\nImportHypervisorConfigurationInput,import_hypervisor_configuration_input\nImportHypervisorConfigurationOutput,import_hypervisor_configuration_output\nImportId,import_id\nImportImageLicenseConfigurationRequest,import_image_license_configuration_request\nImportImageLicenseConfigurationResponse,import_image_license_configuration_response\nImportImageRequest,import_image_request\nImportImageResult,import_image_result\nImportImageTask,import_image_task\nImportImageTasks,import_image_tasks\nImportInfo,import_info\nImportInstance,import_instance\nImportInstanceLaunchSpecification,import_instance_launch_specification\nImportInstanceRequest,import_instance_request\nImportInstanceResult,import_instance_result\nImportInstanceTaskDetails,import_instance_task_details\nImportInstanceVolumeDetailItem,import_instance_volume_detail_item\nImportJobEndTime,import_job_end_time\nImportJobProperties,import_job_properties\nImportJobPropertiesList,import_job_properties_list\nImportJobRequest,import_job_request\nImportJobResource,import_job_resource\nImportJobResponse,import_job_response\nImportJobStartTime,import_job_start_time\nImportJobSubmitter,import_job_submitter\nImportJobSummary,import_job_summary\nImportJobs,import_jobs\nImportJobsResponse,import_jobs_response\nImportKeyInput,import_key_input\nImportKeyMaterialRequest,import_key_material_request\nImportKeyOutput,import_key_output\nImportKeyPairRequest,import_key_pair_request\nImportKeyPairResult,import_key_pair_result\nImportLabelsTaskRunProperties,import_labels_task_run_properties\nImportLensInput,import_lens_input\nImportLensOutput,import_lens_output\nImportManifestUrl,import_manifest_url\nImportMigrationTaskRequest,import_migration_task_request\nImportMode,import_mode\nImportModelRequest,import_model_request\nImportModelResponse,import_model_response\nImportModelVersionRequest,import_model_version_request\nImportModelVersionResponse,import_model_version_response\nImportNotFoundException,import_not_found_exception\nImportNotebookInput,import_notebook_input\nImportNotebookOutput,import_notebook_output\nImportOptions,import_options\nImportPath,import_path\nImportPlaybackKeyPairRequest,import_playback_key_pair_request\nImportPlaybackKeyPairResponse,import_playback_key_pair_response\nImportReadSetFilter,import_read_set_filter\nImportReadSetJobItem,import_read_set_job_item\nImportReadSetSourceItem,import_read_set_source_item\nImportReferenceFilter,import_reference_filter\nImportReferenceJobItem,import_reference_job_item\nImportReferenceSourceItem,import_reference_source_item\nImportResourceSpecification,import_resource_specification\nImportResourcesToDraftAppVersionRequest,import_resources_to_draft_app_version_request\nImportResourcesToDraftAppVersionResponse,import_resources_to_draft_app_version_response\nImportRestApiRequest,import_rest_api_request\nImportSignalCatalogRequest,import_signal_catalog_request\nImportSignalCatalogResponse,import_signal_catalog_response\nImportSnapshotRequest,import_snapshot_request\nImportSnapshotResult,import_snapshot_result\nImportSnapshotTask,import_snapshot_task\nImportSnapshotTasks,import_snapshot_tasks\nImportSortBy,import_sort_by\nImportSource,import_source\nImportSourceCredentialsInput,import_source_credentials_input\nImportSourceCredentialsOutput,import_source_credentials_output\nImportSshPublicKeyRequest,import_ssh_public_key_request\nImportSshPublicKeyResponse,import_ssh_public_key_response\nImportStacksToStackSetInput,import_stacks_to_stack_set_input\nImportStacksToStackSetOutput,import_stacks_to_stack_set_output\nImportStatistics,import_statistics\nImportStatus,import_status\nImportSummary,import_summary\nImportSummaryList,import_summary_list\nImportTableDescription,import_table_description\nImportTableInput,import_table_input\nImportTableOutput,import_table_output\nImportTablesCompleted,import_tables_completed\nImportTablesInProgress,import_tables_in_progress\nImportTablesNotStarted,import_tables_not_started\nImportTask,import_task\nImportTaskError,import_task_error\nImportTaskFilter,import_task_filter\nImportTaskId,import_task_id\nImportTaskIds,import_task_ids\nImportTaskSummary,import_task_summary\nImportTaskSummaryApplications,import_task_summary_applications\nImportTaskSummaryServers,import_task_summary_servers\nImportTaskSummaryWaves,import_task_summary_waves\nImportTerminologyRequest,import_terminology_request\nImportTerminologyResponse,import_terminology_response\nImportTime,import_time\nImportToken,import_token\nImportTr31KeyBlock,import_tr31_key_block\nImportTr34KeyBlock,import_tr34_key_block\nImportVmImageRequest,import_vm_image_request\nImportVmImageResponse,import_vm_image_response\nImportVolume,import_volume\nImportVolumeRequest,import_volume_request\nImportVolumeResult,import_volume_result\nImportVolumeTaskDetails,import_volume_task_details\nImportWorkspaceImageRequest,import_workspace_image_request\nImportWorkspaceImageResult,import_workspace_image_result\nImportance,importance\nImported,imported\nImportedAt,imported_at\nImportedBy,imported_by\nImportedDataSize,imported_data_size\nImportedDataSizeInBytes,imported_data_size_in_bytes\nImportedFileChunkSize,imported_file_chunk_size\nImportedItemCount,imported_item_count\nImportedRecordCount,imported_record_count\nImportedSidewalkDevice,imported_sidewalk_device\nImportedUsers,imported_users\nImportedWirelessDevice,imported_wireless_device\nImportedWirelessDeviceList,imported_wireless_device_list\nImports,imports\nImportsListItem,imports_list_item\nImprovementPlan,improvement_plan\nImprovementPlanUrl,improvement_plan_url\nImprovementPlans,improvement_plans\nImprovementStatus,improvement_status\nImprovementSummaries,improvement_summaries\nImprovementSummary,improvement_summary\nImputedPath,imputed_path\nImscDestinationSettings,imsc_destination_settings\nInAppCampaignSchedule,in_app_campaign_schedule\nInAppMessage,in_app_message\nInAppMessageBodyConfig,in_app_message_body_config\nInAppMessageButton,in_app_message_button\nInAppMessageCampaign,in_app_message_campaign\nInAppMessageCampaigns,in_app_message_campaigns\nInAppMessageContent,in_app_message_content\nInAppMessageHeaderConfig,in_app_message_header_config\nInAppMessagesResponse,in_app_messages_response\nInAppStreamNames,in_app_stream_names\nInAppTemplate,in_app_template\nInAppTemplateRequest,in_app_template_request\nInAppTemplateResponse,in_app_template_response\nInCluster,in_cluster\nInProgress,in_progress\nInProgressInvalidationBatches,in_progress_invalidation_batches\nInProgressStackInstancesCount,in_progress_stack_instances_count\nInProgressTableRestoreQuotaExceededFault,in_progress_table_restore_quota_exceeded_fault\nInSyncStackInstancesCount,in_sync_stack_instances_count\nInTransitEncryption,in_transit_encryption\nInUse,in_use\nInUseBy,in_use_by\nInaccessibleEncryptionDateTime,inaccessible_encryption_date_time\nInaccessibleKmsKeyDateTime,inaccessible_kms_key_date_time\nInactiveDate,inactive_date\nInactiveEventDataStoreException,inactive_event_data_store_exception\nInactiveQueryException,inactive_query_exception\nInboundCall,inbound_call\nInboundCalling,inbound_calling\nInboundCallsEnabled,inbound_calls_enabled\nInboundConnection,inbound_connection\nInboundConnectionStatus,inbound_connection_status\nInboundCrossClusterSearchConnection,inbound_cross_cluster_search_connection\nInboundCrossClusterSearchConnectionStatus,inbound_cross_cluster_search_connection_status\nInboundHeader,inbound_header\nInboundMMS,inbound_mms\nInboundPermissionAuthorizations,inbound_permission_authorizations\nInboundPermissionRevocations,inbound_permission_revocations\nInboundPermissions,inbound_permissions\nInboundSMS,inbound_sms\nInboundShipment,inbound_shipment\nInboxCount,inbox_count\nInboxPercentage,inbox_percentage\nInboxPlacementTrackingOption,inbox_placement_tracking_option\nInboxRawCount,inbox_raw_count\nIncidentId,incident_id\nIncidentRecord,incident_record\nIncidentRecordSource,incident_record_source\nIncidentRecordSummary,incident_record_summary\nIncidentTemplate,incident_template\nInclude,include\nIncludeAdditionalDetails,include_additional_details\nIncludeAdditionalLanguageCodes,include_additional_language_codes\nIncludeAll,include_all\nIncludeAllDependencies,include_all_dependencies\nIncludeAllInstances,include_all_instances\nIncludeAllLinksToEachParent,include_all_links_to_each_parent\nIncludeAllTagsOfInstance,include_all_tags_of_instance\nIncludeAttachmentFilePatterns,include_attachment_file_patterns\nIncludeBlueprint,include_blueprint\nIncludeBody,include_body\nIncludeChannelId,include_channel_id\nIncludeChildPaths,include_child_paths\nIncludeComplianceDetails,include_compliance_details\nIncludeControlDetails,include_control_details\nIncludeCookies,include_cookies\nIncludeCredit,include_credit\nIncludeCustomMetadata,include_custom_metadata\nIncludeDeleted,include_deleted\nIncludeDeletedGroups,include_deleted_groups\nIncludeDeletedRecords,include_deleted_records\nIncludeDeprecated,include_deprecated\nIncludeDiscount,include_discount\nIncludeDvbSubtitles,include_dvb_subtitles\nIncludeEdges,include_edges\nIncludeEncoderConfigurationInSegments,include_encoder_configuration_in_segments\nIncludeExecutionData,include_execution_data\nIncludeExtensions,include_extensions\nIncludeFec,include_fec\nIncludeFillerNalUnits,include_filler_nal_units\nIncludeFilterTypes,include_filter_types\nIncludeFilters,include_filters\nIncludeFutureRegions,include_future_regions\nIncludeGlobalServiceEvents,include_global_service_events\nIncludeGraph,include_graph\nIncludeHeaders,include_headers\nIncludeHidden,include_hidden\nIncludeIframeOnlyStream,include_iframe_only_stream\nIncludeIframeOnlyStreams,include_iframe_only_streams\nIncludeIndirectActivities,include_indirect_activities\nIncludeInferenceResponseIn,include_inference_response_in\nIncludeLegGeometry,include_leg_geometry\nIncludeLinkedAccounts,include_linked_accounts\nIncludeLinkedAccountsMetrics,include_linked_accounts_metrics\nIncludeManagementEvents,include_management_events\nIncludeMap,include_map\nIncludeMarketplace,include_marketplace\nIncludeMaximum,include_maximum\nIncludeMetrics,include_metrics\nIncludeMinimum,include_minimum\nIncludeNestedStacks,include_nested_stacks\nIncludeNotScaledActivities,include_not_scaled_activities\nIncludeNullAndEmpty,include_null_and_empty\nIncludeNullValue,include_null_value\nIncludeOnly,include_only\nIncludeOpForFullLoad,include_op_for_full_load\nIncludeOtherSubscription,include_other_subscription\nIncludeParameterSpec,include_parameter_spec\nIncludePartitionValue,include_partition_value\nIncludePlannedDeletion,include_planned_deletion\nIncludeProvisioningArtifactParameters,include_provisioning_artifact_parameters\nIncludePublic,include_public\nIncludePublicKey,include_public_key\nIncludeQueriesWithoutUserInformation,include_queries_without_user_information\nIncludeQuerySpellCheckSuggestions,include_query_spell_check_suggestions\nIncludeRecurring,include_recurring\nIncludeRefund,include_refund\nIncludeRelated,include_related\nIncludeReturnPath,include_return_path\nIncludeShared,include_shared\nIncludeSharedResources,include_shared_resources\nIncludeSpace,include_space\nIncludeSpaces,include_spaces\nIncludeStatus,include_status\nIncludeSubdomains,include_subdomains\nIncludeSubscription,include_subscription\nIncludeSupport,include_support\nIncludeSymmetricAlgorithms,include_symmetric_algorithms\nIncludeTableAlterOperations,include_table_alter_operations\nIncludeTax,include_tax\nIncludeTransactionDetails,include_transaction_details\nIncludeTrustContext,include_trust_context\nIncludeUpfront,include_upfront\nIncludedAllocatedStorage,included_allocated_storage\nIncludedCookies,included_cookies\nIncludedDeletedBackTo,included_deleted_back_to\nIncludedHeaders,included_headers\nIncludedObjectVersions,included_object_versions\nIncludedPages,included_pages\nIncludedPaths,included_paths\nIncludedProperties,included_properties\nIncludedProperty,included_property\nIncludedStates,included_states\nIncludedStatistics,included_statistics\nIncludes,includes\nInclusionFileNamePatterns,inclusion_file_name_patterns\nInclusionFileTypePatterns,inclusion_file_type_patterns\nInclusionFilters,inclusion_filters\nInclusionFolderNamePatterns,inclusion_folder_name_patterns\nInclusionPatterns,inclusion_patterns\nInclusionPrefixes,inclusion_prefixes\nInclusionProtectionFilters,inclusion_protection_filters\nInclusionProtectionGroupFilters,inclusion_protection_group_filters\nInclusive,inclusive\nInclusiveStartBillingPeriod,inclusive_start_billing_period\nInclusiveStartTime,inclusive_start_time\nIncomingDukptAttributes,incoming_dukpt_attributes\nIncomingEncryptionAttributes,incoming_encryption_attributes\nIncomingKeyIdentifier,incoming_key_identifier\nIncomingTranslationAttributes,incoming_translation_attributes\nIncompatibilityMessage,incompatibility_message\nIncompatibleImageException,incompatible_image_exception\nIncompatibleOrderableOptions,incompatible_orderable_options\nIncompatibleParameterError,incompatible_parameter_error\nIncompatiblePolicyException,incompatible_policy_exception\nIncompatibleProtocolsException,incompatible_protocols_exception\nIncompatibleRegionForMultiAZ,incompatible_region_for_multi_az\nIncompatibleSchemaException,incompatible_schema_exception\nIncompatibleSettingsException,incompatible_settings_exception\nIncompatibleVersion,incompatible_version\nIncompatibleVersionException,incompatible_version_exception\nIncompleteSegmentBehavior,incomplete_segment_behavior\nInconsistentQuantities,inconsistent_quantities\nIncorrectCidrStateException,incorrect_cidr_state_exception\nIncorrectFileSystemLifeCycleState,incorrect_file_system_life_cycle_state\nIncorrectKeyException,incorrect_key_exception\nIncorrectKeyMaterialException,incorrect_key_material_exception\nIncorrectMountTargetState,incorrect_mount_target_state\nIncorrectTrustAnchorException,incorrect_trust_anchor_exception\nIncreaseNodeGroupsInGlobalReplicationGroupMessage,increase_node_groups_in_global_replication_group_message\nIncreaseNodeGroupsInGlobalReplicationGroupResult,increase_node_groups_in_global_replication_group_result\nIncreaseReplicaCountMessage,increase_replica_count_message\nIncreaseReplicaCountResult,increase_replica_count_result\nIncreaseReplicationFactorRequest,increase_replication_factor_request\nIncreaseReplicationFactorResponse,increase_replication_factor_response\nIncreaseStreamRetentionPeriodInput,increase_stream_retention_period_input\nIncreaseVolumeSize,increase_volume_size\nIncrementalExportSpecification,incremental_export_specification\nIncrementalPullConfig,incremental_pull_config\nIncrementalRefresh,incremental_refresh\nIncrementalRunConfig,incremental_run_config\nIndex,index\nIndexArn,index_arn\nIndexAttachment,index_attachment\nIndexAttachments,index_attachments\nIndexConfigurationSummary,index_configuration_summary\nIndexConfigurationSummaryItems,index_configuration_summary_items\nIndexDocument,index_document\nIndexDocumentSuffix,index_document_suffix\nIndexDocumentsRequest,index_documents_request\nIndexDocumentsResponse,index_documents_response\nIndexFacesModelVersion,index_faces_model_version\nIndexFacesRequest,index_faces_request\nIndexFacesResponse,index_faces_response\nIndexField,index_field\nIndexFieldName,index_field_name\nIndexFieldStatus,index_field_status\nIndexFieldType,index_field_type\nIndexFields,index_fields\nIndexId,index_id\nIndexNSegments,index_n_segments\nIndexName,index_name\nIndexNotFoundException,index_not_found_exception\nIndexNotReadyException,index_not_ready_exception\nIndexReference,index_reference\nIndexRotationPeriod,index_rotation_period\nIndexSizeBytes,index_size_bytes\nIndexSlowLogs,index_slow_logs\nIndexStatistics,index_statistics\nIndexStatus,index_status\nIndexedAttributeMissingException,indexed_attribute_missing_exception\nIndexedAttributes,indexed_attributes\nIndexedQuestionAnswersCount,indexed_question_answers_count\nIndexedTextBytes,indexed_text_bytes\nIndexedTextDocumentsCount,indexed_text_documents_count\nIndexes,indexes\nIndexingFilter,indexing_filter\nIndividualAssessmentCompletedCount,individual_assessment_completed_count\nIndividualAssessmentCount,individual_assessment_count\nIndividualAssessmentName,individual_assessment_name\nIndividualAssessmentNames,individual_assessment_names\nIndustry,industry\nIndustryType,industry_type\nInferICD10CMRequest,infer_icd10_cm_request\nInferICD10CMResponse,infer_icd10_cm_response\nInferRxNormRequest,infer_rx_norm_request\nInferRxNormResponse,infer_rx_norm_response\nInferSNOMEDCTRequest,infer_snomedct_request\nInferSNOMEDCTResponse,infer_snomedct_response\nInferenceAccelerator,inference_accelerator\nInferenceAcceleratorInfo,inference_accelerator_info\nInferenceAcceleratorOverride,inference_accelerator_override\nInferenceAcceleratorOverrides,inference_accelerator_overrides\nInferenceAccelerators,inference_accelerators\nInferenceAttribute,inference_attribute\nInferenceBenchmark,inference_benchmark\nInferenceConfig,inference_config\nInferenceContainerDefinitions,inference_container_definitions\nInferenceContainers,inference_containers\nInferenceDataImportStrategy,inference_data_import_strategy\nInferenceDeviceInfo,inference_device_info\nInferenceDeviceMemoryInfo,inference_device_memory_info\nInferenceEventSummaries,inference_event_summaries\nInferenceEventSummary,inference_event_summary\nInferenceExecutionConfig,inference_execution_config\nInferenceExecutionSummaries,inference_execution_summaries\nInferenceExecutionSummary,inference_execution_summary\nInferenceExperimentArn,inference_experiment_arn\nInferenceExperimentDataStorageConfig,inference_experiment_data_storage_config\nInferenceExperimentSchedule,inference_experiment_schedule\nInferenceExperimentSummary,inference_experiment_summary\nInferenceExperiments,inference_experiments\nInferenceId,inference_id\nInferenceImage,inference_image\nInferenceInputConfiguration,inference_input_configuration\nInferenceInputNameConfiguration,inference_input_name_configuration\nInferenceMetrics,inference_metrics\nInferenceOutputConfiguration,inference_output_configuration\nInferenceRecommendation,inference_recommendation\nInferenceRecommendations,inference_recommendations\nInferenceRecommendationsJob,inference_recommendations_job\nInferenceRecommendationsJobName,inference_recommendations_job_name\nInferenceRecommendationsJobStep,inference_recommendations_job_step\nInferenceRecommendationsJobs,inference_recommendations_jobs\nInferenceS3InputConfiguration,inference_s3_input_configuration\nInferenceS3OutputConfiguration,inference_s3_output_configuration\nInferenceSchedulerArn,inference_scheduler_arn\nInferenceSchedulerName,inference_scheduler_name\nInferenceSchedulerNameBeginsWith,inference_scheduler_name_begins_with\nInferenceSchedulerSummaries,inference_scheduler_summaries\nInferenceSchedulerSummary,inference_scheduler_summary\nInferenceSpecification,inference_specification\nInferenceSpecificationName,inference_specification_name\nInferred,inferred\nInferredWorkloadSaving,inferred_workload_saving\nInfo,info\nInfoIconLabelOptions,info_icon_label_options\nInfoIconText,info_icon_text\nInfoType,info_type\nInforNexus,infor_nexus\nInforNexusConnectorProfileCredentials,infor_nexus_connector_profile_credentials\nInforNexusConnectorProfileProperties,infor_nexus_connector_profile_properties\nInforNexusSourceProperties,infor_nexus_source_properties\nInformationalCount,informational_count\nInfrastructureClass,infrastructure_class\nInfrastructureConfig,infrastructure_config\nInfrastructureConfiguration,infrastructure_configuration\nInfrastructureConfigurationSummary,infrastructure_configuration_summary\nInfrastructureType,infrastructure_type\nIngestConfiguration,ingest_configuration\nIngestEndpoint,ingest_endpoint\nIngestEndpointId,ingest_endpoint_id\nIngestEndpointUrls,ingest_endpoint_urls\nIngestEndpoints,ingest_endpoints\nIngestIp,ingest_ip\nIngestPort,ingest_port\nIngestedDataSize,ingested_data_size\nIngestedEventStatistics,ingested_event_statistics\nIngestedEventsDetail,ingested_events_detail\nIngestedEventsTimeWindow,ingested_events_time_window\nIngestedFilesSummary,ingested_files_summary\nIngestedNumberOfFiles,ingested_number_of_files\nIngestion,ingestion\nIngestionArn,ingestion_arn\nIngestionDestination,ingestion_destination\nIngestionDestinationSummary,ingestion_destination_summary\nIngestionId,ingestion_id\nIngestionInputConfiguration,ingestion_input_configuration\nIngestionJobId,ingestion_job_id\nIngestionProcess,ingestion_process\nIngestionS3InputConfiguration,ingestion_s3_input_configuration\nIngestionSizeInBytes,ingestion_size_in_bytes\nIngestionStatus,ingestion_status\nIngestionSummary,ingestion_summary\nIngestionTimeInSeconds,ingestion_time_in_seconds\nIngestionType,ingestion_type\nIngestions,ingestions\nIngress,ingress\nIngressAccessLogs,ingress_access_logs\nIngressBytes,ingress_bytes\nIngressConfiguration,ingress_configuration\nIngressFilterRules,ingress_filter_rules\nIngressGatewayBridge,ingress_gateway_bridge\nIngressPackets,ingress_packets\nIngressPortMappings,ingress_port_mappings\nIngressRouteTable,ingress_route_table\nIngressVpcConfiguration,ingress_vpc_configuration\nInheritedValue,inherited_value\nInitProcessEnabled,init_process_enabled\nInitQuery,init_query\nInitialActiveLearningModelArn,initial_active_learning_model_arn\nInitialAudioGain,initial_audio_gain\nInitialCapacityConfig,initial_capacity_config\nInitialClusterSize,initial_cluster_size\nInitialConfigurationToken,initial_configuration_token\nInitialContactId,initial_contact_id\nInitialDashboardId,initial_dashboard_id\nInitialDashboardVisualId,initial_dashboard_visual_id\nInitialFileLocation,initial_file_location\nInitialInstanceCount,initial_instance_count\nInitialMessage,initial_message\nInitialNumberOfUsers,initial_number_of_users\nInitialPath,initial_path\nInitialPosition,initial_position\nInitialResponseSetting,initial_response_setting\nInitialSamplingPercentage,initial_sampling_percentage\nInitialTopicId,initial_topic_id\nInitialVariantWeight,initial_variant_weight\nInitialVersion,initial_version\nInitializationConfiguration,initialization_configuration\nInitializationVector,initialization_vector\nInitializationVectorInManifest,initialization_vector_in_manifest\nInitializeClusterRequest,initialize_cluster_request\nInitializeClusterResponse,initialize_cluster_response\nInitializedImportedDeviceCount,initialized_imported_device_count\nInitials,initials\nInitiateAuthRequest,initiate_auth_request\nInitiateAuthResponse,initiate_auth_response\nInitiateDeletionTimestamp,initiate_deletion_timestamp\nInitiateDeviceClaimRequest,initiate_device_claim_request\nInitiateDeviceClaimResponse,initiate_device_claim_response\nInitiateDocumentVersionUploadRequest,initiate_document_version_upload_request\nInitiateDocumentVersionUploadResponse,initiate_document_version_upload_response\nInitiateJobInput,initiate_job_input\nInitiateJobOutput,initiate_job_output\nInitiateLayerUploadRequest,initiate_layer_upload_request\nInitiateLayerUploadResponse,initiate_layer_upload_response\nInitiateMultipartUploadInput,initiate_multipart_upload_input\nInitiateMultipartUploadOutput,initiate_multipart_upload_output\nInitiateVaultLockInput,initiate_vault_lock_input\nInitiateVaultLockOutput,initiate_vault_lock_output\nInitiated,initiated\nInitiatedBy,initiated_by\nInitiationMethod,initiation_method\nInitiationTimestamp,initiation_timestamp\nInitiator,initiator\nInitiatorName,initiator_name\nInitiators,initiators\nInlineArchiveRule,inline_archive_rule\nInlineChunk,inline_chunk\nInlineChunkChecksum,inline_chunk_checksum\nInlineChunkChecksumAlgorithm,inline_chunk_checksum_algorithm\nInlineChunkLength,inline_chunk_length\nInlineConfigurations,inline_configurations\nInlineCustomDocumentEnrichmentConfiguration,inline_custom_document_enrichment_configuration\nInlineDataSchema,inline_data_schema\nInlinePolicy,inline_policy\nInnerHorizontal,inner_horizontal\nInnerVertical,inner_vertical\nInput,input\nInputArtifact,input_artifact\nInputArtifacts,input_artifacts\nInputArtifactsToRemove,input_artifacts_to_remove\nInputAttachment,input_attachment\nInputAttachmentName,input_attachment_name\nInputAttachmentNameReference,input_attachment_name_reference\nInputAttachments,input_attachments\nInputAttributes,input_attributes\nInputBucket,input_bucket\nInputBytes,input_bytes\nInputCaptions,input_captions\nInputChannel,input_channel\nInputChannelLevel,input_channel_level\nInputChannelLevels,input_channel_levels\nInputChannels,input_channels\nInputChannelsFineTune,input_channels_fine_tune\nInputClass,input_class\nInputClipping,input_clipping\nInputClippingSettings,input_clipping_settings\nInputClippings,input_clippings\nInputColumn,input_column\nInputColumns,input_columns\nInputCompressionType,input_compression_type\nInputConfig,input_config\nInputConfigInput,input_config_input\nInputConfigOutput,input_config_output\nInputConfiguration,input_configuration\nInputConfigurationRequest,input_configuration_request\nInputConfigurations,input_configurations\nInputContent,input_content\nInputContext,input_context\nInputDataConfig,input_data_config\nInputDataLocationS3,input_data_location_s3\nInputDecryptionSettings,input_decryption_settings\nInputDefinition,input_definition\nInputDescription,input_description\nInputDescriptions,input_descriptions\nInputDestination,input_destination\nInputDestinationRequest,input_destination_request\nInputDestinationVpc,input_destination_vpc\nInputDeviceConfigurableSettings,input_device_configurable_settings\nInputDeviceHdSettings,input_device_hd_settings\nInputDeviceId,input_device_id\nInputDeviceMediaConnectConfigurableSettings,input_device_media_connect_configurable_settings\nInputDeviceMediaConnectSettings,input_device_media_connect_settings\nInputDeviceNetworkSettings,input_device_network_settings\nInputDeviceRequest,input_device_request\nInputDeviceSettings,input_device_settings\nInputDeviceSummary,input_device_summary\nInputDeviceTransfers,input_device_transfers\nInputDeviceUhdSettings,input_device_uhd_settings\nInputDevices,input_devices\nInputDocumentsCount,input_documents_count\nInputEndAction,input_end_action\nInputFileConfig,input_file_config\nInputFileLocation,input_file_location\nInputFileUri,input_file_uri\nInputFilter,input_filter\nInputFormat,input_format\nInputFormatConfiguration,input_format_configuration\nInputFormatOptions,input_format_options\nInputId,input_id\nInputIdentifier,input_identifier\nInputIds,input_ids\nInputIp,input_ip\nInputKey,input_key\nInputLambdaProcessor,input_lambda_processor\nInputLambdaProcessorDescription,input_lambda_processor_description\nInputLambdaProcessorUpdate,input_lambda_processor_update\nInputLocation,input_location\nInputLogEvent,input_log_event\nInputLossAction,input_loss_action\nInputLossBehavior,input_loss_behavior\nInputLossFailoverSettings,input_loss_failover_settings\nInputLossImageColor,input_loss_image_color\nInputLossImageSlate,input_loss_image_slate\nInputLossImageType,input_loss_image_type\nInputLossSettings,input_loss_settings\nInputLossThresholdMsec,input_loss_threshold_msec\nInputMode,input_mode\nInputName,input_name\nInputOrigin,input_origin\nInputParallelism,input_parallelism\nInputParallelismUpdate,input_parallelism_update\nInputParameters,input_parameters\nInputPartnerIds,input_partner_ids\nInputPath,input_path\nInputPathsMap,input_paths_map\nInputPort,input_port\nInputPreference,input_preference\nInputPrepareScheduleActionSettings,input_prepare_schedule_action_settings\nInputPrepareScheduleActions,input_prepare_schedule_actions\nInputPrepareSettings,input_prepare_settings\nInputProcessingConfiguration,input_processing_configuration\nInputProcessingConfigurationDescription,input_processing_configuration_description\nInputProcessingConfigurationUpdate,input_processing_configuration_update\nInputRecordTables,input_record_tables\nInputRows,input_rows\nInputS3Object,input_s3_object\nInputS3Path,input_s3_path\nInputScanType,input_scan_type\nInputSchema,input_schema\nInputSchemaUpdate,input_schema_update\nInputSecurityGroup,input_security_group\nInputSecurityGroupId,input_security_group_id\nInputSecurityGroupIds,input_security_group_ids\nInputSecurityGroups,input_security_groups\nInputSerialization,input_serialization\nInputSessionStateSpecification,input_session_state_specification\nInputSettings,input_settings\nInputSource,input_source\nInputSourceRequest,input_source_request\nInputSourceType,input_source_type\nInputSpecification,input_specification\nInputStartingPosition,input_starting_position\nInputStartingPositionConfiguration,input_starting_position_configuration\nInputStorageLocation,input_storage_location\nInputSummary,input_summary\nInputSwitchScheduleActionSettings,input_switch_schedule_action_settings\nInputSwitchSettings,input_switch_settings\nInputTemplate,input_template\nInputTimeZoneOffset,input_time_zone_offset\nInputTimecodeSource,input_timecode_source\nInputTransformer,input_transformer\nInputType,input_type\nInputUpdate,input_update\nInputUpdates,input_updates\nInputVideoGenerator,input_video_generator\nInputVpcRequest,input_vpc_request\nInputWhitelistRule,input_whitelist_rule\nInputWhitelistRuleCidr,input_whitelist_rule_cidr\nInputs,inputs\nInsecureSsl,insecure_ssl\nInsertHeaders,insert_headers\nInsertableImage,insertable_image\nInsertableImages,insertable_images\nInsertionMode,insertion_mode\nInserts,inserts\nInsideCidrBlocks,inside_cidr_blocks\nInsight,insight\nInsightArn,insight_arn\nInsightArns,insight_arns\nInsightConfiguration,insight_configuration\nInsightData,insight_data\nInsightEvent,insight_event\nInsightEvents,insight_events\nInsightFeedback,insight_feedback\nInsightHealth,insight_health\nInsightId,insight_id\nInsightImpactGraphEdge,insight_impact_graph_edge\nInsightImpactGraphService,insight_impact_graph_service\nInsightNotEnabledException,insight_not_enabled_exception\nInsightResultValue,insight_result_value\nInsightResults,insight_results\nInsightRule,insight_rule\nInsightRuleContributor,insight_rule_contributor\nInsightRuleContributorDatapoint,insight_rule_contributor_datapoint\nInsightRuleMetricDatapoint,insight_rule_metric_datapoint\nInsightRules,insight_rules\nInsightSelector,insight_selector\nInsightSelectors,insight_selectors\nInsightSummaries,insight_summaries\nInsightSummary,insight_summary\nInsightTimeRange,insight_time_range\nInsightType,insight_type\nInsightVisual,insight_visual\nInsights,insights\nInsightsByAssessment,insights_by_assessment\nInsightsConfiguration,insights_configuration\nInsightsEnabled,insights_enabled\nInsightsEvent,insights_event\nInsightsTarget,insights_target\nInspectionLevel,inspection_level\nInspectorScoreDetails,inspector_score_details\nInspectorServiceAttributes,inspector_service_attributes\nInstallOverrideList,install_override_list\nInstallToRemoteAccessSessionRequest,install_to_remote_access_session_request\nInstallToRemoteAccessSessionResult,install_to_remote_access_session_result\nInstallUpdatesOnBoot,install_updates_on_boot\nInstalledComponent,installed_component\nInstalledCount,installed_count\nInstalledOtherCount,installed_other_count\nInstalledPendingReboot,installed_pending_reboot\nInstalledPendingRebootCount,installed_pending_reboot_count\nInstalledRejectedCount,installed_rejected_count\nInstalledTime,installed_time\nInstance,instance\nInstanceAccess,instance_access\nInstanceAccessControlAttributeConfiguration,instance_access_control_attribute_configuration\nInstanceAccessDetails,instance_access_details\nInstanceAccessUrl,instance_access_url\nInstanceAggregatedAssociationOverview,instance_aggregated_association_overview\nInstanceAlias,instance_alias\nInstanceArn,instance_arn\nInstanceAssociation,instance_association\nInstanceAssociationOutputLocation,instance_association_output_location\nInstanceAssociationOutputUrl,instance_association_output_url\nInstanceAssociationStatusAggregatedCount,instance_association_status_aggregated_count\nInstanceAssociationStatusInfo,instance_association_status_info\nInstanceAssociationStatusInfos,instance_association_status_infos\nInstanceAttribute,instance_attribute\nInstanceBlockDeviceMapping,instance_block_device_mapping\nInstanceBlockDeviceMappingSpecification,instance_block_device_mapping_specification\nInstanceCapacity,instance_capacity\nInstanceClass,instance_class\nInstanceCollectionType,instance_collection_type\nInstanceConfig,instance_config\nInstanceConfigs,instance_configs\nInstanceConfiguration,instance_configuration\nInstanceConnectEndpoint,instance_connect_endpoint\nInstanceConnectEndpointArn,instance_connect_endpoint_arn\nInstanceConnectEndpointId,instance_connect_endpoint_id\nInstanceConnectEndpointIds,instance_connect_endpoint_ids\nInstanceConnectEndpoints,instance_connect_endpoints\nInstanceCount,instance_count\nInstanceCountLimits,instance_count_limits\nInstanceCounts,instance_counts\nInstanceCreateTime,instance_create_time\nInstanceCredentials,instance_credentials\nInstanceCreditSpecification,instance_credit_specification\nInstanceCreditSpecificationRequest,instance_credit_specification_request\nInstanceCreditSpecifications,instance_credit_specifications\nInstanceDefinition,instance_definition\nInstanceDefinitions,instance_definitions\nInstanceDetails,instance_details\nInstanceDoesNotExistException,instance_does_not_exist_exception\nInstanceEntry,instance_entry\nInstanceEventId,instance_event_id\nInstanceEventWindow,instance_event_window\nInstanceEventWindowAssociationRequest,instance_event_window_association_request\nInstanceEventWindowAssociationTarget,instance_event_window_association_target\nInstanceEventWindowDisassociationRequest,instance_event_window_disassociation_request\nInstanceEventWindowId,instance_event_window_id\nInstanceEventWindowIds,instance_event_window_ids\nInstanceEventWindowState,instance_event_window_state\nInstanceEventWindowStateChange,instance_event_window_state_change\nInstanceEventWindowTimeRange,instance_event_window_time_range\nInstanceEventWindowTimeRangeRequest,instance_event_window_time_range_request\nInstanceEventWindows,instance_event_windows\nInstanceExportDetails,instance_export_details\nInstanceFamilies,instance_families\nInstanceFamily,instance_family\nInstanceFamilyCreditSpecification,instance_family_credit_specification\nInstanceFamilyId,instance_family_id\nInstanceFleet,instance_fleet\nInstanceFleetConfig,instance_fleet_config\nInstanceFleetId,instance_fleet_id\nInstanceFleetModifyConfig,instance_fleet_modify_config\nInstanceFleetProvisioningSpecifications,instance_fleet_provisioning_specifications\nInstanceFleetResizingSpecifications,instance_fleet_resizing_specifications\nInstanceFleetStateChangeReason,instance_fleet_state_change_reason\nInstanceFleetStatus,instance_fleet_status\nInstanceFleetTimeline,instance_fleet_timeline\nInstanceFleetType,instance_fleet_type\nInstanceFleets,instance_fleets\nInstanceGenerations,instance_generations\nInstanceGroup,instance_group\nInstanceGroupConfig,instance_group_config\nInstanceGroupDetail,instance_group_detail\nInstanceGroupId,instance_group_id\nInstanceGroupIds,instance_group_ids\nInstanceGroupModifyConfig,instance_group_modify_config\nInstanceGroupName,instance_group_name\nInstanceGroupNames,instance_group_names\nInstanceGroupStateChangeReason,instance_group_state_change_reason\nInstanceGroupStatus,instance_group_status\nInstanceGroupTimeline,instance_group_timeline\nInstanceGroupType,instance_group_type\nInstanceGroupTypes,instance_group_types\nInstanceGroups,instance_groups\nInstanceHardware,instance_hardware\nInstanceHealth,instance_health\nInstanceHealthCheckResult,instance_health_check_result\nInstanceHealthList,instance_health_list\nInstanceHealthSummary,instance_health_summary\nInstanceID,instance_id\nInstanceId,instance_id\nInstanceIdDetail,instance_id_detail\nInstanceIdFilter,instance_id_filter\nInstanceIdRequiredException,instance_id_required_exception\nInstanceIdSet,instance_id_set\nInstanceIdentifier,instance_identifier\nInstanceIdentity,instance_identity\nInstanceIds,instance_ids\nInstanceInfo,instance_info\nInstanceInformation,instance_information\nInstanceInformationFilter,instance_information_filter\nInstanceInformationFilterList,instance_information_filter_list\nInstanceInformationList,instance_information_list\nInstanceInformationStringFilter,instance_information_string_filter\nInstanceInitiatedShutdownBehavior,instance_initiated_shutdown_behavior\nInstanceInterruptionBehavior,instance_interruption_behavior\nInstanceIpv4Prefix,instance_ipv4_prefix\nInstanceIpv6Address,instance_ipv6_address\nInstanceIpv6AddressRequest,instance_ipv6_address_request\nInstanceIpv6Prefix,instance_ipv6_prefix\nInstanceLifecycle,instance_lifecycle\nInstanceLimit,instance_limit\nInstanceLimitExceededException,instance_limit_exceeded_exception\nInstanceLimits,instance_limits\nInstanceMaintenanceOptions,instance_maintenance_options\nInstanceMaintenanceOptionsRequest,instance_maintenance_options_request\nInstanceMarketOptions,instance_market_options\nInstanceMarketOptionsRequest,instance_market_options_request\nInstanceMatchCriteria,instance_match_criteria\nInstanceMemory,instance_memory\nInstanceMessages,instance_messages\nInstanceMetadata,instance_metadata\nInstanceMetadataOptions,instance_metadata_options\nInstanceMetadataOptionsRequest,instance_metadata_options_request\nInstanceMetadataOptionsResponse,instance_metadata_options_response\nInstanceMetadataServiceConfiguration,instance_metadata_service_configuration\nInstanceMetadataTags,instance_metadata_tags\nInstanceMonitoring,instance_monitoring\nInstanceMonitorings,instance_monitorings\nInstanceName,instance_name\nInstanceNameAlreadyRegisteredException,instance_name_already_registered_exception\nInstanceNameRequiredException,instance_name_required_exception\nInstanceNetworkInterface,instance_network_interface\nInstanceNetworkInterfaceAssociation,instance_network_interface_association\nInstanceNetworkInterfaceAttachment,instance_network_interface_attachment\nInstanceNetworkInterfaceSpecification,instance_network_interface_specification\nInstanceNetworking,instance_networking\nInstanceNotFound,instance_not_found\nInstanceNotRegisteredException,instance_not_registered_exception\nInstanceOSUser,instance_os_user\nInstanceOnboardingJobStatus,instance_onboarding_job_status\nInstanceOwnerId,instance_owner_id\nInstancePatchState,instance_patch_state\nInstancePatchStateFilter,instance_patch_state_filter\nInstancePatchStates,instance_patch_states\nInstancePlatform,instance_platform\nInstancePoolsToUseCount,instance_pools_to_use_count\nInstancePort,instance_port\nInstancePortInfo,instance_port_info\nInstancePortState,instance_port_state\nInstancePrivateIpAddress,instance_private_ip_address\nInstanceProfile,instance_profile\nInstanceProfileArn,instance_profile_arn\nInstanceProfileCreationTime,instance_profile_creation_time\nInstanceProfileId,instance_profile_id\nInstanceProfileIdentifier,instance_profile_identifier\nInstanceProfileList,instance_profile_list\nInstanceProfileName,instance_profile_name\nInstanceProfiles,instance_profiles\nInstanceProperty,instance_property\nInstanceProtocol,instance_protocol\nInstanceQuotaExceededFault,instance_quota_exceeded_fault\nInstanceRecommendation,instance_recommendation\nInstanceRecommendationOption,instance_recommendation_option\nInstanceRefresh,instance_refresh\nInstanceRefreshId,instance_refresh_id\nInstanceRefreshIds,instance_refresh_ids\nInstanceRefreshInProgressFault,instance_refresh_in_progress_fault\nInstanceRefreshLivePoolProgress,instance_refresh_live_pool_progress\nInstanceRefreshProgressDetails,instance_refresh_progress_details\nInstanceRefreshWarmPoolProgress,instance_refresh_warm_pool_progress\nInstanceRefreshes,instance_refreshes\nInstanceRequestCount,instance_request_count\nInstanceRequirements,instance_requirements\nInstanceRequirementsRequest,instance_requirements_request\nInstanceRequirementsWithMetadata,instance_requirements_with_metadata\nInstanceRequirementsWithMetadataRequest,instance_requirements_with_metadata_request\nInstanceResizePolicy,instance_resize_policy\nInstanceReusePolicy,instance_reuse_policy\nInstanceRole,instance_role\nInstanceRoleArn,instance_role_arn\nInstanceRunningCount,instance_running_count\nInstanceSize,instance_size\nInstanceSizingType,instance_sizing_type\nInstanceSnapshot,instance_snapshot\nInstanceSnapshotInfo,instance_snapshot_info\nInstanceSpecification,instance_specification\nInstanceState,instance_state\nInstanceStateChange,instance_state_change\nInstanceStateChangeReason,instance_state_change_reason\nInstanceStates,instance_states\nInstanceStatus,instance_status\nInstanceStatusDetails,instance_status_details\nInstanceStatusEvent,instance_status_event\nInstanceStatusReason,instance_status_reason\nInstanceStatusSummary,instance_status_summary\nInstanceStatuses,instance_statuses\nInstanceStorageConfig,instance_storage_config\nInstanceStorageInfo,instance_storage_info\nInstanceStorageSupported,instance_storage_supported\nInstanceSummaries,instance_summaries\nInstanceSummary,instance_summary\nInstanceSummaryList,instance_summary_list\nInstanceTagAttribute,instance_tag_attribute\nInstanceTagKeys,instance_tag_keys\nInstanceTagNotificationAttribute,instance_tag_notification_attribute\nInstanceTags,instance_tags\nInstanceTarget,instance_target\nInstanceTenancy,instance_tenancy\nInstanceTerminationTimeout,instance_termination_timeout\nInstanceTimeline,instance_timeline\nInstanceType,instance_type\nInstanceTypeConfig,instance_type_config\nInstanceTypeConfigs,instance_type_configs\nInstanceTypeDetails,instance_type_details\nInstanceTypeInfo,instance_type_info\nInstanceTypeInfoFromInstanceRequirements,instance_type_info_from_instance_requirements\nInstanceTypeItem,instance_type_item\nInstanceTypeOffering,instance_type_offering\nInstanceTypeOfferings,instance_type_offerings\nInstanceTypeSpecification,instance_type_specification\nInstanceTypeSpecifications,instance_type_specifications\nInstanceTypes,instance_types\nInstanceUsage,instance_usage\nInstanceUsages,instance_usages\nInstanceUserSummaries,instance_user_summaries\nInstanceUserSummary,instance_user_summary\nInstanceVcpu,instance_vcpu\nInstanceWarmup,instance_warmup\nInstances,instances\nInstancesCount,instances_count\nInstancesDistribution,instances_distribution\nInstancesHealth,instances_health\nInstancesRevision,instances_revision\nInstancesToProtect,instances_to_protect\nInstancesToTerminate,instances_to_terminate\nInstancesToUpdate,instances_to_update\nInstancesToUpdateOnRollback,instances_to_update_on_rollback\nInstancesWithCriticalNonCompliantPatches,instances_with_critical_non_compliant_patches\nInstancesWithFailedPatches,instances_with_failed_patches\nInstancesWithInstalledOtherPatches,instances_with_installed_other_patches\nInstancesWithInstalledPatches,instances_with_installed_patches\nInstancesWithInstalledPendingRebootPatches,instances_with_installed_pending_reboot_patches\nInstancesWithInstalledRejectedPatches,instances_with_installed_rejected_patches\nInstancesWithMissingPatches,instances_with_missing_patches\nInstancesWithNotApplicablePatches,instances_with_not_applicable_patches\nInstancesWithOtherNonCompliantPatches,instances_with_other_non_compliant_patches\nInstancesWithSecurityNonCompliantPatches,instances_with_security_non_compliant_patches\nInstancesWithUnreportedNotApplicablePatches,instances_with_unreported_not_applicable_patches\nInstantBooking,instant_booking\nInstantiateSolNetworkInstanceInput,instantiate_sol_network_instance_input\nInstantiateSolNetworkInstanceOutput,instantiate_sol_network_instance_output\nInstructions,instructions\nInsufficientAvailableIPsInSubnetFault,insufficient_available_ips_in_subnet_fault\nInsufficientCacheClusterCapacityFault,insufficient_cache_cluster_capacity_fault\nInsufficientCapabilitiesException,insufficient_capabilities_exception\nInsufficientCapacityException,insufficient_capacity_exception\nInsufficientCloudWatchLogsResourcePolicy,insufficient_cloud_watch_logs_resource_policy\nInsufficientClusterCapacityFault,insufficient_cluster_capacity_fault\nInsufficientDBClusterCapacityFault,insufficient_db_cluster_capacity_fault\nInsufficientDBInstanceCapacityFault,insufficient_db_instance_capacity_fault\nInsufficientDataActions,insufficient_data_actions\nInsufficientDataHealthStatus,insufficient_data_health_status\nInsufficientDeliveryPolicyException,insufficient_delivery_policy_exception\nInsufficientDependencyServiceAccessPermissionException,insufficient_dependency_service_access_permission_exception\nInsufficientEncryptionPolicyException,insufficient_encryption_policy_exception\nInsufficientPermissionsException,insufficient_permissions_exception\nInsufficientPrivilegesException,insufficient_privileges_exception\nInsufficientResourceCapacityFault,insufficient_resource_capacity_fault\nInsufficientS3BucketPolicyException,insufficient_s3_bucket_policy_exception\nInsufficientS3BucketPolicyFault,insufficient_s3_bucket_policy_fault\nInsufficientSensorData,insufficient_sensor_data\nInsufficientSnsTopicPolicyException,insufficient_sns_topic_policy_exception\nInsufficientStorageClusterCapacityFault,insufficient_storage_cluster_capacity_fault\nInsufficientThroughputCapacity,insufficient_throughput_capacity\nIntArrayOptions,int_array_options\nIntOptions,int_options\nIntValueMax,int_value_max\nIntValueMin,int_value_min\nIntegerDatasetParameter,integer_dataset_parameter\nIntegerDatasetParameterDefaultValues,integer_dataset_parameter_default_values\nIntegerDefaultValues,integer_default_values\nIntegerHyperParameterRange,integer_hyper_parameter_range\nIntegerParameter,integer_parameter\nIntegerParameterDeclaration,integer_parameter_declaration\nIntegerParameterRange,integer_parameter_range\nIntegerParameterRangeSpecification,integer_parameter_range_specification\nIntegerParameterRanges,integer_parameter_ranges\nIntegerParameters,integer_parameters\nIntegerRange,integer_range\nIntegerStaticValues,integer_static_values\nIntegerValue,integer_value\nIntegerValueWhenUnsetConfiguration,integer_value_when_unset_configuration\nIntegerValues,integer_values\nIntegrateServices,integrate_services\nIntegration,integration\nIntegrationArn,integration_arn\nIntegrationAssociationArn,integration_association_arn\nIntegrationAssociationId,integration_association_id\nIntegrationAssociationSummary,integration_association_summary\nIntegrationAssociationSummaryList,integration_association_summary_list\nIntegrationConfig,integration_config\nIntegrationId,integration_id\nIntegrationMethod,integration_method\nIntegrationResponse,integration_response\nIntegrationResponseId,integration_response_id\nIntegrationResponseKey,integration_response_key\nIntegrationResponseSelectionExpression,integration_response_selection_expression\nIntegrationResultS3DestinationArn,integration_result_s3_destination_arn\nIntegrationSubtype,integration_subtype\nIntegrationType,integration_type\nIntegrationTypes,integration_types\nIntegrationUri,integration_uri\nIntegrations,integrations\nIntelligentTieringAndOperator,intelligent_tiering_and_operator\nIntelligentTieringConfiguration,intelligent_tiering_configuration\nIntelligentTieringConfigurationList,intelligent_tiering_configuration_list\nIntelligentTieringFilter,intelligent_tiering_filter\nIntendedUse,intended_use\nIntent,intent\nIntentClassificationTestResultItem,intent_classification_test_result_item\nIntentClassificationTestResultItemCounts,intent_classification_test_result_item_counts\nIntentClassificationTestResults,intent_classification_test_results\nIntentClosingSetting,intent_closing_setting\nIntentConfidence,intent_confidence\nIntentConfirmationSetting,intent_confirmation_setting\nIntentFilter,intent_filter\nIntentLevelSlotResolutionTestResultItem,intent_level_slot_resolution_test_result_item\nIntentLevelSlotResolutionTestResults,intent_level_slot_resolution_test_results\nIntentMetadata,intent_metadata\nIntentOverride,intent_override\nIntentResultEvent,intent_result_event\nIntentSortBy,intent_sort_by\nIntentStatistics,intent_statistics\nIntentSummary,intent_summary\nInterMetricImpactDetails,inter_metric_impact_details\nInterMetricImpactList,inter_metric_impact_list\nInteractive,interactive\nInteractiveLayoutConfiguration,interactive_layout_configuration\nIntercluster,intercluster\nInterconnect,interconnect\nInterconnects,interconnects\nInterface,interface\nInterfaceAssociation,interface_association\nInterfaceAssociations,interface_associations\nInterfacePermission,interface_permission\nInterfaceProtocol,interface_protocol\nInterfaceRequest,interface_request\nInterfaceType,interface_type\nInterlaceMode,interlace_mode\nInterlaced,interlaced\nInternalDependencyException,internal_dependency_exception\nInternalError,internal_error\nInternalErrorException,internal_error_exception\nInternalException,internal_exception\nInternalFailure,internal_failure\nInternalFailureException,internal_failure_exception\nInternalServerError,internal_server_error\nInternalServerErrorException,internal_server_error_exception\nInternalServerException,internal_server_exception\nInternalServiceError,internal_service_error\nInternalServiceErrorException,internal_service_error_exception\nInternalServiceException,internal_service_exception\nInternalServiceFault,internal_service_fault\nInternalStreamFailure,internal_stream_failure\nInternalUserDatabaseEnabled,internal_user_database_enabled\nInternetGateway,internet_gateway\nInternetGatewayAttachment,internet_gateway_attachment\nInternetGatewayId,internet_gateway_id\nInternetGatewayIds,internet_gateway_ids\nInternetGatewayRoutes,internet_gateway_routes\nInternetGateways,internet_gateways\nInternetHealth,internet_health\nInternetKeyExchangeVersion,internet_key_exchange_version\nInternetMeasurementsLogDelivery,internet_measurements_log_delivery\nInteroperabilityEnabled,interoperability_enabled\nInterpolated,interpolated\nInterpolatedAssetPropertyValue,interpolated_asset_property_value\nInterpolationParameters,interpolation_parameters\nInterpolationValue,interpolation_value\nInterpretation,interpretation\nInterruptionFilter,interruption_filter\nInterval,interval\nIntervalCadence,interval_cadence\nIntervalEndTime,interval_end_time\nIntervalInSeconds,interval_in_seconds\nIntervalStartTime,interval_start_time\nIntervalUnit,interval_unit\nIntraDcPrecision,intra_dc_precision\nInvalidACLStateFault,invalid_acl_state_fault\nInvalidARNFault,invalid_arn_fault\nInvalidAccessException,invalid_access_exception\nInvalidAccountStatusException,invalid_account_status_exception\nInvalidActionDeclarationException,invalid_action_declaration_exception\nInvalidActivation,invalid_activation\nInvalidActivationId,invalid_activation_id\nInvalidActorArnException,invalid_actor_arn_exception\nInvalidAddressException,invalid_address_exception\nInvalidAggregationException,invalid_aggregation_exception\nInvalidAggregatorException,invalid_aggregator_exception\nInvalidAlarmConfigException,invalid_alarm_config_exception\nInvalidAliasNameException,invalid_alias_name_exception\nInvalidAllowedPatternException,invalid_allowed_pattern_exception\nInvalidApplicationConfigurationException,invalid_application_configuration_exception\nInvalidApplicationNameException,invalid_application_name_exception\nInvalidApprovalRuleContentException,invalid_approval_rule_content_exception\nInvalidApprovalRuleNameException,invalid_approval_rule_name_exception\nInvalidApprovalRuleTemplateContentException,invalid_approval_rule_template_content_exception\nInvalidApprovalRuleTemplateDescriptionException,invalid_approval_rule_template_description_exception\nInvalidApprovalRuleTemplateNameException,invalid_approval_rule_template_name_exception\nInvalidApprovalStateException,invalid_approval_state_exception\nInvalidApprovalTokenException,invalid_approval_token_exception\nInvalidArgsException,invalid_args_exception\nInvalidArgument,invalid_argument\nInvalidArgumentException,invalid_argument_exception\nInvalidArn,invalid_arn\nInvalidArnException,invalid_arn_exception\nInvalidAssociation,invalid_association\nInvalidAssociationVersion,invalid_association_version\nInvalidAttachmentException,invalid_attachment_exception\nInvalidAuthenticationCodeException,invalid_authentication_code_exception\nInvalidAuthenticationProfileRequestFault,invalid_authentication_profile_request_fault\nInvalidAuthorArnException,invalid_author_arn_exception\nInvalidAuthorizationMessageException,invalid_authorization_message_exception\nInvalidAuthorizationStateFault,invalid_authorization_state_fault\nInvalidAutoRollbackConfigException,invalid_auto_rollback_config_exception\nInvalidAutoScalingGroupException,invalid_auto_scaling_group_exception\nInvalidAutomationExecutionParametersException,invalid_automation_execution_parameters_exception\nInvalidAutomationSignalException,invalid_automation_signal_exception\nInvalidAutomationStatusUpdateException,invalid_automation_status_update_exception\nInvalidBatchEntryIdException,invalid_batch_entry_id_exception\nInvalidBlobIdException,invalid_blob_id_exception\nInvalidBlockerDeclarationException,invalid_blocker_declaration_exception\nInvalidBlueGreenDeploymentConfigurationException,invalid_blue_green_deployment_configuration_exception\nInvalidBlueGreenDeploymentStateFault,invalid_blue_green_deployment_state_fault\nInvalidBranchNameException,invalid_branch_name_exception\nInvalidBucketNameFilterException,invalid_bucket_name_filter_exception\nInvalidCacheClusterStateFault,invalid_cache_cluster_state_fault\nInvalidCacheParameterGroupStateFault,invalid_cache_parameter_group_state_fault\nInvalidCacheSecurityGroupStateFault,invalid_cache_security_group_state_fault\nInvalidCampaignStateException,invalid_campaign_state_exception\nInvalidCertificateAuthorityException,invalid_certificate_authority_exception\nInvalidCertificateException,invalid_certificate_exception\nInvalidCertificateFault,invalid_certificate_fault\nInvalidChangeBatch,invalid_change_batch\nInvalidChangeSetStatusException,invalid_change_set_status_exception\nInvalidChannelARN,invalid_channel_arn\nInvalidCiphertextException,invalid_ciphertext_exception\nInvalidClientAuthStatusException,invalid_client_auth_status_exception\nInvalidClientException,invalid_client_exception\nInvalidClientMetadataException,invalid_client_metadata_exception\nInvalidClientRequestTokenException,invalid_client_request_token_exception\nInvalidClientTokenException,invalid_client_token_exception\nInvalidCloudWatchDestinationException,invalid_cloud_watch_destination_exception\nInvalidCloudWatchLogsLogGroupArnException,invalid_cloud_watch_logs_log_group_arn_exception\nInvalidCloudWatchLogsRoleArnException,invalid_cloud_watch_logs_role_arn_exception\nInvalidClusterParameterGroupStateFault,invalid_cluster_parameter_group_state_fault\nInvalidClusterSecurityGroupStateFault,invalid_cluster_security_group_state_fault\nInvalidClusterSnapshotScheduleStateFault,invalid_cluster_snapshot_schedule_state_fault\nInvalidClusterSnapshotStateFault,invalid_cluster_snapshot_state_fault\nInvalidClusterStateFault,invalid_cluster_state_fault\nInvalidClusterSubnetGroupStateFault,invalid_cluster_subnet_group_state_fault\nInvalidClusterSubnetStateFault,invalid_cluster_subnet_state_fault\nInvalidClusterTrackFault,invalid_cluster_track_fault\nInvalidCodeSignatureException,invalid_code_signature_exception\nInvalidCodecPrivateDataException,invalid_codec_private_data_exception\nInvalidCommentIdException,invalid_comment_id_exception\nInvalidCommentOperationException,invalid_comment_operation_exception\nInvalidCommitException,invalid_commit_exception\nInvalidCommitIdException,invalid_commit_id_exception\nInvalidComputePlatformException,invalid_compute_platform_exception\nInvalidConfigurationDetail,invalid_configuration_detail\nInvalidConfigurationException,invalid_configuration_exception\nInvalidConfigurationRecorderNameException,invalid_configuration_recorder_name_exception\nInvalidConfigurationRequestException,invalid_configuration_request_exception\nInvalidConfigurationSetException,invalid_configuration_set_exception\nInvalidConflictDetailLevelException,invalid_conflict_detail_level_exception\nInvalidConflictResolutionException,invalid_conflict_resolution_exception\nInvalidConflictResolutionStrategyException,invalid_conflict_resolution_strategy_exception\nInvalidContactFlowException,invalid_contact_flow_exception\nInvalidContactFlowModuleException,invalid_contact_flow_module_exception\nInvalidContentLocation,invalid_content_location\nInvalidContinuationTokenException,invalid_continuation_token_exception\nInvalidCredentialsException,invalid_credentials_exception\nInvalidCrossAccountRoleException,invalid_cross_account_role_exception\nInvalidCustomDBEngineVersionStateFault,invalid_custom_db_engine_version_state_fault\nInvalidCustomSesConfigurationException,invalid_custom_ses_configuration_exception\nInvalidCustomerIdentifierException,invalid_customer_identifier_exception\nInvalidDBClusterAutomatedBackupStateFault,invalid_db_cluster_automated_backup_state_fault\nInvalidDBClusterCapacityFault,invalid_db_cluster_capacity_fault\nInvalidDBClusterEndpointStateFault,invalid_db_cluster_endpoint_state_fault\nInvalidDBClusterSnapshotStateFault,invalid_db_cluster_snapshot_state_fault\nInvalidDBClusterStateFault,invalid_db_cluster_state_fault\nInvalidDBInstanceAutomatedBackupStateFault,invalid_db_instance_automated_backup_state_fault\nInvalidDBInstanceStateFault,invalid_db_instance_state_fault\nInvalidDBParameterGroupStateFault,invalid_db_parameter_group_state_fault\nInvalidDBProxyEndpointStateFault,invalid_db_proxy_endpoint_state_fault\nInvalidDBProxyStateFault,invalid_db_proxy_state_fault\nInvalidDBSecurityGroupStateFault,invalid_db_security_group_state_fault\nInvalidDBSnapshotStateFault,invalid_db_snapshot_state_fault\nInvalidDBSubnetGroupFault,invalid_db_subnet_group_fault\nInvalidDBSubnetGroupStateFault,invalid_db_subnet_group_state_fault\nInvalidDBSubnetStateFault,invalid_db_subnet_state_fault\nInvalidDataRepositoryType,invalid_data_repository_type\nInvalidDataShareFault,invalid_data_share_fault\nInvalidDateEntries,invalid_date_entries\nInvalidDateRangeException,invalid_date_range_exception\nInvalidDefaultRootObject,invalid_default_root_object\nInvalidDefinition,invalid_definition\nInvalidDeleteInventoryParametersException,invalid_delete_inventory_parameters_exception\nInvalidDeletionIdException,invalid_deletion_id_exception\nInvalidDeletionParameterException,invalid_deletion_parameter_exception\nInvalidDeliveryChannelNameException,invalid_delivery_channel_name_exception\nInvalidDeliveryOptionsException,invalid_delivery_options_exception\nInvalidDeployedStateFilterException,invalid_deployed_state_filter_exception\nInvalidDeploymentConfigNameException,invalid_deployment_config_name_exception\nInvalidDeploymentGroupNameException,invalid_deployment_group_name_exception\nInvalidDeploymentIdException,invalid_deployment_id_exception\nInvalidDeploymentInstanceTypeException,invalid_deployment_instance_type_exception\nInvalidDeploymentStatusException,invalid_deployment_status_exception\nInvalidDeploymentStyleException,invalid_deployment_style_exception\nInvalidDeploymentTargetIdException,invalid_deployment_target_id_exception\nInvalidDeploymentWaitTypeException,invalid_deployment_wait_type_exception\nInvalidDescriptionException,invalid_description_exception\nInvalidDestinationCommitSpecifierException,invalid_destination_commit_specifier_exception\nInvalidDestinationKmsKey,invalid_destination_kms_key\nInvalidDeviceException,invalid_device_exception\nInvalidDocument,invalid_document\nInvalidDocumentContent,invalid_document_content\nInvalidDocumentOperation,invalid_document_operation\nInvalidDocumentSchemaVersion,invalid_document_schema_version\nInvalidDocumentType,invalid_document_type\nInvalidDocumentVersion,invalid_document_version\nInvalidDomainName,invalid_domain_name\nInvalidDomainNameForOriginAccessControl,invalid_domain_name_for_origin_access_control\nInvalidDomainValidationOptionsException,invalid_domain_validation_options_exception\nInvalidEC2TagCombinationException,invalid_ec2_tag_combination_exception\nInvalidEC2TagException,invalid_ec2_tag_exception\nInvalidECSServiceException,invalid_ecs_service_exception\nInvalidElasticIpFault,invalid_elastic_ip_fault\nInvalidEmailException,invalid_email_exception\nInvalidEmailRoleAccessPolicyException,invalid_email_role_access_policy_exception\nInvalidEncodingException,invalid_encoding_exception\nInvalidEndPointException,invalid_end_point_exception\nInvalidEndpointException,invalid_endpoint_exception\nInvalidEndpointRegionException,invalid_endpoint_region_exception\nInvalidEndpointStateFault,invalid_endpoint_state_fault\nInvalidErrorCode,invalid_error_code\nInvalidEventCategoryException,invalid_event_category_exception\nInvalidEventDataStoreCategoryException,invalid_event_data_store_category_exception\nInvalidEventDataStoreStatusException,invalid_event_data_store_status_exception\nInvalidEventPatternException,invalid_event_pattern_exception\nInvalidEventSelectorsException,invalid_event_selectors_exception\nInvalidEventSubscriptionStateFault,invalid_event_subscription_state_fault\nInvalidExecutionInput,invalid_execution_input\nInvalidExportOnlyFault,invalid_export_only_fault\nInvalidExportPath,invalid_export_path\nInvalidExportSourceStateFault,invalid_export_source_state_fault\nInvalidExportTaskStateFault,invalid_export_task_state_fault\nInvalidExportTimeException,invalid_export_time_exception\nInvalidExpressionException,invalid_expression_exception\nInvalidExternalIdException,invalid_external_id_exception\nInvalidFacetUpdateException,invalid_facet_update_exception\nInvalidFallbackBehavior,invalid_fallback_behavior\nInvalidFileExistsBehaviorException,invalid_file_exists_behavior_exception\nInvalidFileLocationException,invalid_file_location_exception\nInvalidFileModeException,invalid_file_mode_exception\nInvalidFilePositionException,invalid_file_position_exception\nInvalidFilter,invalid_filter\nInvalidFilterException,invalid_filter_exception\nInvalidFilterOption,invalid_filter_option\nInvalidFilterValue,invalid_filter_value\nInvalidFirehoseDestinationException,invalid_firehose_destination_exception\nInvalidFleetStatusException,invalid_fleet_status_exception\nInvalidFormatFault,invalid_format_fault\nInvalidForwardCookies,invalid_forward_cookies\nInvalidFunctionAssociation,invalid_function_association\nInvalidGameSessionStatusException,invalid_game_session_status_exception\nInvalidGatewayRequestException,invalid_gateway_request_exception\nInvalidGeoRestrictionParameter,invalid_geo_restriction_parameter\nInvalidGitHubAccountTokenException,invalid_git_hub_account_token_exception\nInvalidGitHubAccountTokenNameException,invalid_git_hub_account_token_name_exception\nInvalidGlobalClusterStateFault,invalid_global_cluster_state_fault\nInvalidGlobalReplicationGroupStateFault,invalid_global_replication_group_state_fault\nInvalidGrantException,invalid_grant_exception\nInvalidGrantIdException,invalid_grant_id_exception\nInvalidGrantTokenException,invalid_grant_token_exception\nInvalidHandshakeTransitionException,invalid_handshake_transition_exception\nInvalidHeadersForS3Origin,invalid_headers_for_s3_origin\nInvalidHomeRegionException,invalid_home_region_exception\nInvalidHsmClientCertificateStateFault,invalid_hsm_client_certificate_state_fault\nInvalidHsmConfigurationStateFault,invalid_hsm_configuration_state_fault\nInvalidIamSessionArnException,invalid_iam_session_arn_exception\nInvalidIamUserArnException,invalid_iam_user_arn_exception\nInvalidIdentityPoolConfigurationException,invalid_identity_pool_configuration_exception\nInvalidIdentityTokenException,invalid_identity_token_exception\nInvalidIfMatchVersion,invalid_if_match_version\nInvalidIgnoreApplicationStopFailuresValueException,invalid_ignore_application_stop_failures_value_exception\nInvalidImageFormatException,invalid_image_format_exception\nInvalidImportPath,invalid_import_path\nInvalidImportSourceException,invalid_import_source_exception\nInvalidImportTokenException,invalid_import_token_exception\nInvalidInput,invalid_input\nInvalidInputCombinationException,invalid_input_combination_exception\nInvalidInputException,invalid_input_exception\nInvalidInputRecords,invalid_input_records\nInvalidInsightSelectorsException,invalid_insight_selectors_exception\nInvalidInstanceId,invalid_instance_id\nInvalidInstanceInformationFilterValue,invalid_instance_information_filter_value\nInvalidInstanceNameException,invalid_instance_name_exception\nInvalidInstanceStatusException,invalid_instance_status_exception\nInvalidInstanceTypeException,invalid_instance_type_exception\nInvalidInventoryGroupException,invalid_inventory_group_exception\nInvalidInventoryItemContextException,invalid_inventory_item_context_exception\nInvalidInventoryRequestException,invalid_inventory_request_exception\nInvalidItemContentException,invalid_item_content_exception\nInvalidJobException,invalid_job_exception\nInvalidJobIdException,invalid_job_id_exception\nInvalidJobStateException,invalid_job_state_exception\nInvalidKMSArn,invalid_kms_arn\nInvalidKMSKeyException,invalid_kms_key_exception\nInvalidKMSKeyFault,invalid_kms_key_fault\nInvalidKMSResourceException,invalid_kms_resource_exception\nInvalidKeyId,invalid_key_id\nInvalidKeyPrefixFilterException,invalid_key_prefix_filter_exception\nInvalidKeySigningKeyName,invalid_key_signing_key_name\nInvalidKeySigningKeyStatus,invalid_key_signing_key_status\nInvalidKeyUsageException,invalid_key_usage_exception\nInvalidKmsKeyIdException,invalid_kms_key_id_exception\nInvalidLDAPSStatusException,invalid_ldaps_status_exception\nInvalidLabels,invalid_labels\nInvalidLambdaFunctionAssociation,invalid_lambda_function_association\nInvalidLambdaFunctionException,invalid_lambda_function_exception\nInvalidLambdaFunctionOutputException,invalid_lambda_function_output_exception\nInvalidLambdaResponseException,invalid_lambda_response_exception\nInvalidLayerException,invalid_layer_exception\nInvalidLayerPartException,invalid_layer_part_exception\nInvalidLexiconException,invalid_lexicon_exception\nInvalidLifecycleEventHookExecutionIdException,invalid_lifecycle_event_hook_execution_id_exception\nInvalidLifecycleEventHookExecutionStatusException,invalid_lifecycle_event_hook_execution_status_exception\nInvalidLimitException,invalid_limit_exception\nInvalidLoadBalancerActionException,invalid_load_balancer_action_exception\nInvalidLoadBalancerInfoException,invalid_load_balancer_info_exception\nInvalidLocationCode,invalid_location_code\nInvalidLoggingConfiguration,invalid_logging_configuration\nInvalidLookupAttributesException,invalid_lookup_attributes_exception\nInvalidMarkerException,invalid_marker_exception\nInvalidMaxConflictFilesException,invalid_max_conflict_files_exception\nInvalidMaxMergeHunksException,invalid_max_merge_hunks_exception\nInvalidMaxResultsException,invalid_max_results_exception\nInvalidMediaFrameException,invalid_media_frame_exception\nInvalidMergeOptionException,invalid_merge_option_exception\nInvalidMinimumHealthyHostValueException,invalid_minimum_healthy_host_value_exception\nInvalidMinimumProtocolVersion,invalid_minimum_protocol_version\nInvalidName,invalid_name\nInvalidNamespaceFault,invalid_namespace_fault\nInvalidNetworkInterface,invalid_network_interface\nInvalidNetworkSettings,invalid_network_settings\nInvalidNextToken,invalid_next_token\nInvalidNextTokenException,invalid_next_token_exception\nInvalidNodeException,invalid_node_exception\nInvalidNodeStateFault,invalid_node_state_fault\nInvalidNonceException,invalid_nonce_exception\nInvalidNotificationConfig,invalid_notification_config\nInvalidNumericDataException,invalid_numeric_data_exception\nInvalidOAuthFlowException,invalid_o_auth_flow_exception\nInvalidObjectState,invalid_object_state\nInvalidOnPremisesTagCombinationException,invalid_on_premises_tag_combination_exception\nInvalidOperationException,invalid_operation_exception\nInvalidOperationFault,invalid_operation_fault\nInvalidOptionException,invalid_option_exception\nInvalidOptionGroupStateFault,invalid_option_group_state_fault\nInvalidOrderException,invalid_order_exception\nInvalidOrigin,invalid_origin\nInvalidOriginAccessControl,invalid_origin_access_control\nInvalidOriginAccessIdentity,invalid_origin_access_identity\nInvalidOriginKeepaliveTimeout,invalid_origin_keepalive_timeout\nInvalidOriginReadTimeout,invalid_origin_read_timeout\nInvalidOutput,invalid_output\nInvalidOverrideStatusException,invalid_override_status_exception\nInvalidPaginationException,invalid_pagination_exception\nInvalidPaginationToken,invalid_pagination_token\nInvalidPaginationTokenException,invalid_pagination_token_exception\nInvalidParameter,invalid_parameter\nInvalidParameterCombinationException,invalid_parameter_combination_exception\nInvalidParameterDetail,invalid_parameter_detail\nInvalidParameterException,invalid_parameter_exception\nInvalidParameterGroupStateFault,invalid_parameter_group_state_fault\nInvalidParameterValueException,invalid_parameter_value_exception\nInvalidParameterValuesException,invalid_parameter_values_exception\nInvalidParameters,invalid_parameters\nInvalidParametersException,invalid_parameters_exception\nInvalidParentCommitIdException,invalid_parent_commit_id_exception\nInvalidPasswordException,invalid_password_exception\nInvalidPathException,invalid_path_exception\nInvalidPerUnitStorageThroughput,invalid_per_unit_storage_throughput\nInvalidPermissionType,invalid_permission_type\nInvalidPolicyAttributeException,invalid_policy_attribute_exception\nInvalidPolicyDocument,invalid_policy_document\nInvalidPolicyException,invalid_policy_exception\nInvalidPolicyRevisionIdException,invalid_policy_revision_id_exception\nInvalidPolicyTypeException,invalid_policy_type_exception\nInvalidPortRangeException,invalid_port_range_exception\nInvalidProductCodeException,invalid_product_code_exception\nInvalidProtocolSettings,invalid_protocol_settings\nInvalidPublicKeyException,invalid_public_key_exception\nInvalidPublicKeyVersionException,invalid_public_key_version_exception\nInvalidPullRequestEventTypeException,invalid_pull_request_event_type_exception\nInvalidPullRequestIdException,invalid_pull_request_id_exception\nInvalidPullRequestStatusException,invalid_pull_request_status_exception\nInvalidPullRequestStatusUpdateException,invalid_pull_request_status_update_exception\nInvalidQueryException,invalid_query_exception\nInvalidQueryStatementException,invalid_query_statement_exception\nInvalidQueryStatusException,invalid_query_status_exception\nInvalidQueryStringParameters,invalid_query_string_parameters\nInvalidReactionUserArnException,invalid_reaction_user_arn_exception\nInvalidReactionValueException,invalid_reaction_value_exception\nInvalidRecordCount,invalid_record_count\nInvalidRecordingGroupException,invalid_recording_group_exception\nInvalidReferenceNameException,invalid_reference_name_exception\nInvalidRegion,invalid_region\nInvalidRegionException,invalid_region_exception\nInvalidRegistrationStatusException,invalid_registration_status_exception\nInvalidRelativeFileVersionEnumException,invalid_relative_file_version_enum_exception\nInvalidRelativePath,invalid_relative_path\nInvalidRenderingParameterException,invalid_rendering_parameter_exception\nInvalidReplacementContentException,invalid_replacement_content_exception\nInvalidReplacementTypeException,invalid_replacement_type_exception\nInvalidReplicationGroupStateFault,invalid_replication_group_state_fault\nInvalidRepositoryDescriptionException,invalid_repository_description_exception\nInvalidRepositoryNameException,invalid_repository_name_exception\nInvalidRepositoryTriggerBranchNameException,invalid_repository_trigger_branch_name_exception\nInvalidRepositoryTriggerCustomDataException,invalid_repository_trigger_custom_data_exception\nInvalidRepositoryTriggerDestinationArnException,invalid_repository_trigger_destination_arn_exception\nInvalidRepositoryTriggerEventsException,invalid_repository_trigger_events_exception\nInvalidRepositoryTriggerNameException,invalid_repository_trigger_name_exception\nInvalidRepositoryTriggerRegionException,invalid_repository_trigger_region_exception\nInvalidRequestContentException,invalid_request_content_exception\nInvalidRequestDetail,invalid_request_detail\nInvalidRequestException,invalid_request_exception\nInvalidRequiredProtocol,invalid_required_protocol\nInvalidReservedNodeStateFault,invalid_reserved_node_state_fault\nInvalidResourceArnException,invalid_resource_arn_exception\nInvalidResourceException,invalid_resource_exception\nInvalidResourceFormatException,invalid_resource_format_exception\nInvalidResourcePolicyException,invalid_resource_policy_exception\nInvalidResourceStateException,invalid_resource_state_exception\nInvalidResourceStateFault,invalid_resource_state_fault\nInvalidResourceTypeException,invalid_resource_type_exception\nInvalidResponseCode,invalid_response_code\nInvalidResponseException,invalid_response_exception\nInvalidRestoreFault,invalid_restore_fault\nInvalidRestoreTimeException,invalid_restore_time_exception\nInvalidResultAttributeException,invalid_result_attribute_exception\nInvalidResultTokenException,invalid_result_token_exception\nInvalidRetentionPeriodFault,invalid_retention_period_fault\nInvalidRevisionException,invalid_revision_exception\nInvalidRevisionIdException,invalid_revision_id_exception\nInvalidRole,invalid_role\nInvalidRoleException,invalid_role_exception\nInvalidRouteTableId,invalid_route_table_id\nInvalidRuleContentSha256Exception,invalid_rule_content_sha256_exception\nInvalidRuleException,invalid_rule_exception\nInvalidRuntimeException,invalid_runtime_exception\nInvalidS3BucketException,invalid_s3_bucket_exception\nInvalidS3BucketFault,invalid_s3_bucket_fault\nInvalidS3BucketNameException,invalid_s3_bucket_name_exception\nInvalidS3BucketNameFault,invalid_s3_bucket_name_fault\nInvalidS3ConfigurationException,invalid_s3_configuration_exception\nInvalidS3KeyException,invalid_s3_key_exception\nInvalidS3KeyPrefixException,invalid_s3_key_prefix_exception\nInvalidS3KeyPrefixFault,invalid_s3_key_prefix_fault\nInvalidS3KmsKeyArnException,invalid_s3_kms_key_arn_exception\nInvalidS3ObjectException,invalid_s3_object_exception\nInvalidS3PrefixException,invalid_s3_prefix_exception\nInvalidSNSDestinationException,invalid_sns_destination_exception\nInvalidSNSTopicARNException,invalid_sns_topic_arn_exception\nInvalidSampleRateException,invalid_sample_rate_exception\nInvalidSchedule,invalid_schedule\nInvalidScheduleFault,invalid_schedule_fault\nInvalidScheduledActionFault,invalid_scheduled_action_fault\nInvalidSchemaDocException,invalid_schema_doc_exception\nInvalidSchemeException,invalid_scheme_exception\nInvalidScopeException,invalid_scope_exception\nInvalidSecretsManagerResourceException,invalid_secrets_manager_resource_exception\nInvalidSecurityException,invalid_security_exception\nInvalidSecurityGroupException,invalid_security_group_exception\nInvalidSecurityGroupIDException,invalid_security_group_id_exception\nInvalidSecurityGroupId,invalid_security_group_id\nInvalidSensorData,invalid_sensor_data\nInvalidSequenceTokenException,invalid_sequence_token_exception\nInvalidServiceLinkedRoleStateException,invalid_service_linked_role_state_exception\nInvalidServiceRoleException,invalid_service_role_exception\nInvalidSessionException,invalid_session_exception\nInvalidSignal,invalid_signal\nInvalidSignalDecoder,invalid_signal_decoder\nInvalidSignalsException,invalid_signals_exception\nInvalidSigningStatus,invalid_signing_status\nInvalidSmsRoleAccessPolicyException,invalid_sms_role_access_policy_exception\nInvalidSmsRoleTrustRelationshipException,invalid_sms_role_trust_relationship_exception\nInvalidSnapshotCopyGrantStateFault,invalid_snapshot_copy_grant_state_fault\nInvalidSnapshotStateFault,invalid_snapshot_state_fault\nInvalidSnsTopicArnException,invalid_sns_topic_arn_exception\nInvalidSnsTopicException,invalid_sns_topic_exception\nInvalidSnsTopicNameException,invalid_sns_topic_name_exception\nInvalidSortByException,invalid_sort_by_exception\nInvalidSortOrderException,invalid_sort_order_exception\nInvalidSourceCommitSpecifierException,invalid_source_commit_specifier_exception\nInvalidSourceException,invalid_source_exception\nInvalidSourceKmsKey,invalid_source_kms_key\nInvalidSsmlException,invalid_ssml_exception\nInvalidStageDeclarationException,invalid_stage_declaration_exception\nInvalidStateException,invalid_state_exception\nInvalidStateTransitionException,invalid_state_transition_exception\nInvalidStructureException,invalid_structure_exception\nInvalidSubnet,invalid_subnet\nInvalidSubnetException,invalid_subnet_exception\nInvalidSubnetIDException,invalid_subnet_id_exception\nInvalidSubnetId,invalid_subnet_id\nInvalidSubscriptionStateFault,invalid_subscription_state_fault\nInvalidSystemTagUsageException,invalid_system_tag_usage_exception\nInvalidTTLOrder,invalid_ttl_order\nInvalidTableRestoreArgumentFault,invalid_table_restore_argument_fault\nInvalidTag,invalid_tag\nInvalidTagException,invalid_tag_exception\nInvalidTagFault,invalid_tag_fault\nInvalidTagFilterException,invalid_tag_filter_exception\nInvalidTagKeysListException,invalid_tag_keys_list_exception\nInvalidTagParameterException,invalid_tag_parameter_exception\nInvalidTagging,invalid_tagging\nInvalidTaggingRequestException,invalid_tagging_request_exception\nInvalidTagsException,invalid_tags_exception\nInvalidTagsMapException,invalid_tags_map_exception\nInvalidTagsToAddException,invalid_tags_to_add_exception\nInvalidTarget,invalid_target\nInvalidTargetBranchException,invalid_target_branch_exception\nInvalidTargetException,invalid_target_exception\nInvalidTargetFilterNameException,invalid_target_filter_name_exception\nInvalidTargetGroupPairException,invalid_target_group_pair_exception\nInvalidTargetInstancesException,invalid_target_instances_exception\nInvalidTargetMaps,invalid_target_maps\nInvalidTargetsException,invalid_targets_exception\nInvalidTaskIdException,invalid_task_id_exception\nInvalidTemplateException,invalid_template_exception\nInvalidTimeRangeException,invalid_time_range_exception\nInvalidTitleException,invalid_title_exception\nInvalidToken,invalid_token\nInvalidTokenException,invalid_token_exception\nInvalidTracingConfiguration,invalid_tracing_configuration\nInvalidTrackingOptionsException,invalid_tracking_options_exception\nInvalidTrafficPolicyDocument,invalid_traffic_policy_document\nInvalidTrafficRoutingConfigurationException,invalid_traffic_routing_configuration_exception\nInvalidTrailNameException,invalid_trail_name_exception\nInvalidTriggerConfigException,invalid_trigger_config_exception\nInvalidTypeException,invalid_type_exception\nInvalidTypeNameException,invalid_type_name_exception\nInvalidUpdate,invalid_update\nInvalidUpdateOutdatedInstancesOnlyValueException,invalid_update_outdated_instances_only_value_exception\nInvalidUsageAllocationsException,invalid_usage_allocations_exception\nInvalidUsageDimensionException,invalid_usage_dimension_exception\nInvalidUsageLimitFault,invalid_usage_limit_fault\nInvalidUserGroupStateFault,invalid_user_group_state_fault\nInvalidUserList,invalid_user_list\nInvalidUserPoolConfigurationException,invalid_user_pool_configuration_exception\nInvalidUserStateFault,invalid_user_state_fault\nInvalidUserStatusException,invalid_user_status_exception\nInvalidUserTypeException,invalid_user_type_exception\nInvalidVPCId,invalid_vpc_id\nInvalidVPCNetworkStateFault,invalid_vpc_network_state_fault\nInvalidValues,invalid_values\nInvalidVersionNumberException,invalid_version_number_exception\nInvalidViewerCertificate,invalid_viewer_certificate\nInvalidWebACLId,invalid_web_acl_id\nInvalidWebhookAuthenticationParametersException,invalid_webhook_authentication_parameters_exception\nInvalidWebhookFilterPatternException,invalid_webhook_filter_pattern_exception\nInvalidZipFileException,invalid_zip_file_exception\nInvalidateProjectCacheInput,invalidate_project_cache_input\nInvalidation,invalidation\nInvalidationBatch,invalidation_batch\nInvalidationList,invalidation_list\nInvalidationSummary,invalidation_summary\nInventoryAggregator,inventory_aggregator\nInventoryConfiguration,inventory_configuration\nInventoryConfigurationList,inventory_configuration_list\nInventoryData,inventory_data\nInventoryDeletionStatusItem,inventory_deletion_status_item\nInventoryDeletionSummary,inventory_deletion_summary\nInventoryDeletionSummaryItem,inventory_deletion_summary_item\nInventoryDeletions,inventory_deletions\nInventoryDestination,inventory_destination\nInventoryEncryption,inventory_encryption\nInventoryFilter,inventory_filter\nInventoryGroup,inventory_group\nInventoryItem,inventory_item\nInventoryItemAttribute,inventory_item_attribute\nInventoryItemSchema,inventory_item_schema\nInventoryResultEntity,inventory_result_entity\nInventoryResultItem,inventory_result_item\nInventoryRetrievalJobDescription,inventory_retrieval_job_description\nInventoryRetrievalJobInput,inventory_retrieval_job_input\nInventoryRetrievalParameters,inventory_retrieval_parameters\nInventoryS3BucketDestination,inventory_s3_bucket_destination\nInventorySchedule,inventory_schedule\nInventorySizeInBytes,inventory_size_in_bytes\nInverse,inverse\nInverted,inverted\nInvisibleFieldInfo,invisible_field_info\nInvisibleFields,invisible_fields\nInvitation,invitation\nInvitationId,invitation_id\nInvitationType,invitation_type\nInvitations,invitations\nInvitationsCount,invitations_count\nInvite,invite\nInviteAccountToOrganizationRequest,invite_account_to_organization_request\nInviteAccountToOrganizationResponse,invite_account_to_organization_response\nInviteAction,invite_action\nInviteId,invite_id\nInviteMembersRequest,invite_members_request\nInviteMembersResponse,invite_members_response\nInviteMessageTemplate,invite_message_template\nInviteUsersRequest,invite_users_request\nInviteUsersResponse,invite_users_response\nInvitedAt,invited_at\nInvitedBy,invited_by\nInvitedOn,invited_on\nInvitedTime,invited_time\nInviteePrincipalId,invitee_principal_id\nInvites,invites\nInvocationCondition,invocation_condition\nInvocationEndTime,invocation_end_time\nInvocationEndpoint,invocation_endpoint\nInvocationHttpParameters,invocation_http_parameters\nInvocationId,invocation_id\nInvocationPhrase,invocation_phrase\nInvocationPoint,invocation_point\nInvocationRateLimitPerSecond,invocation_rate_limit_per_second\nInvocationRequest,invocation_request\nInvocationResponse,invocation_response\nInvocationRole,invocation_role\nInvocationStartTime,invocation_start_time\nInvocationTime,invocation_time\nInvocationTimeoutSeconds,invocation_timeout_seconds\nInvocationType,invocation_type\nInvocationsMaxRetries,invocations_max_retries\nInvocationsPerInstance,invocations_per_instance\nInvocationsTimeoutInSeconds,invocations_timeout_in_seconds\nInvoiceId,invoice_id\nInvokeArgs,invoke_args\nInvokeAsyncRequest,invoke_async_request\nInvokeAsyncResponse,invoke_async_response\nInvokeDeviceMethodRequest,invoke_device_method_request\nInvokeDeviceMethodResponse,invoke_device_method_response\nInvokeEndpointAsyncInput,invoke_endpoint_async_input\nInvokeEndpointAsyncOutput,invoke_endpoint_async_output\nInvokeEndpointInput,invoke_endpoint_input\nInvokeEndpointOutput,invoke_endpoint_output\nInvokeEndpointWithResponseStreamInput,invoke_endpoint_with_response_stream_input\nInvokeEndpointWithResponseStreamOutput,invoke_endpoint_with_response_stream_output\nInvokeMode,invoke_mode\nInvokeModelRequest,invoke_model_request\nInvokeModelResponse,invoke_model_response\nInvokeModelWithResponseStreamRequest,invoke_model_with_response_stream_request\nInvokeModelWithResponseStreamResponse,invoke_model_with_response_stream_response\nInvokeResponseStreamUpdate,invoke_response_stream_update\nInvokeScreenAutomationRequest,invoke_screen_automation_request\nInvokeScreenAutomationResult,invoke_screen_automation_result\nInvokeWithResponseStreamCompleteEvent,invoke_with_response_stream_complete_event\nInvokeWithResponseStreamRequest,invoke_with_response_stream_request\nInvokeWithResponseStreamResponse,invoke_with_response_stream_response\nInvokedBy,invoked_by\nInvokedIntentSample,invoked_intent_sample\nInvokedProductionVariant,invoked_production_variant\nIoPerformance,io_performance\nIoTJobAbortConfig,io_t_job_abort_config\nIoTJobAbortCriteria,io_t_job_abort_criteria\nIoTJobExecutionsRolloutConfig,io_t_job_executions_rollout_config\nIoTJobExponentialRolloutRate,io_t_job_exponential_rollout_rate\nIoTJobRateIncreaseCriteria,io_t_job_rate_increase_criteria\nIoTJobTimeoutConfig,io_t_job_timeout_config\nIonBinary,ion_binary\nIonText,ion_text\nIops,iops\nIopsOther,iops_other\nIopsRead,iops_read\nIopsToStorageRatio,iops_to_storage_ratio\nIopsTotal,iops_total\nIopsWrite,iops_write\nIosClientBrandingAttributes,ios_client_branding_attributes\nIosImportClientBrandingAttributes,ios_import_client_branding_attributes\nIotAnalyticsAction,iot_analytics_action\nIotCertificateId,iot_certificate_id\nIotEventsAction,iot_events_action\nIotEventsDestinationConfiguration,iot_events_destination_configuration\nIotEventsInputIdentifier,iot_events_input_identifier\nIotJobArn,iot_job_arn\nIotJobId,iot_job_id\nIotRoleAlias,iot_role_alias\nIotSiteWiseAction,iot_site_wise_action\nIotSiteWiseAssetModelPropertyIdentifier,iot_site_wise_asset_model_property_identifier\nIotSiteWiseCustomerManagedDatastoreS3Storage,iot_site_wise_customer_managed_datastore_s3_storage\nIotSiteWiseCustomerManagedDatastoreS3StorageSummary,iot_site_wise_customer_managed_datastore_s3_storage_summary\nIotSiteWiseInputIdentifier,iot_site_wise_input_identifier\nIotThingName,iot_thing_name\nIotTopicPublishAction,iot_topic_publish_action\nIp,ip\nIpAccessSettings,ip_access_settings\nIpAccessSettingsSummary,ip_access_settings_summary\nIpAddress,ip_address\nIpAddressCount,ip_address_count\nIpAddressDetails,ip_address_details\nIpAddressFamily,ip_address_family\nIpAddressInUse,ip_address_in_use\nIpAddressRequest,ip_address_request\nIpAddressResponse,ip_address_response\nIpAddressType,ip_address_type\nIpAddressUpdate,ip_address_update\nIpAddressV4,ip_address_v4\nIpAddresses,ip_addresses\nIpCity,ip_city\nIpCountry,ip_country\nIpDiscovery,ip_discovery\nIpFamily,ip_family\nIpFilter,ip_filter\nIpGeoLocation,ip_geo_location\nIpId,ip_id\nIpOrganizationDetails,ip_organization_details\nIpOwner,ip_owner\nIpOwnerId,ip_owner_id\nIpPermission,ip_permission\nIpPermissions,ip_permissions\nIpPermissionsEgress,ip_permissions_egress\nIpProtocol,ip_protocol\nIpRange,ip_range\nIpRanges,ip_ranges\nIpRestrictionRuleMap,ip_restriction_rule_map\nIpRoute,ip_route\nIpRouteInfo,ip_route_info\nIpRouteLimitExceededException,ip_route_limit_exceeded_exception\nIpRouteStatusMsg,ip_route_status_msg\nIpRouteStatusReason,ip_route_status_reason\nIpRoutes,ip_routes\nIpRoutesInfo,ip_routes_info\nIpRule,ip_rule\nIpRuleItem,ip_rule_item\nIpScheme,ip_scheme\nIpSet,ip_set\nIpSetId,ip_set_id\nIpSetIds,ip_set_ids\nIpSets,ip_sets\nIpUsage,ip_usage\nIpV4Addresses,ipv4_addresses\nIpV4Cidr,ipv4_cidr\nIpV4CidrBlock,ipv4_cidr_block\nIpV6Address,ipv6_address\nIpV6Addresses,ipv6_addresses\nIpV6Cidr,ipv6_cidr\nIpam,ipam\nIpamAddressHistoryRecord,ipam_address_history_record\nIpamArn,ipam_arn\nIpamCidrAuthorizationContext,ipam_cidr_authorization_context\nIpamDiscoveredAccount,ipam_discovered_account\nIpamDiscoveredAccounts,ipam_discovered_accounts\nIpamDiscoveredResourceCidr,ipam_discovered_resource_cidr\nIpamDiscoveredResourceCidrs,ipam_discovered_resource_cidrs\nIpamDiscoveryFailureReason,ipam_discovery_failure_reason\nIpamId,ipam_id\nIpamIds,ipam_ids\nIpamOperatingRegion,ipam_operating_region\nIpamPool,ipam_pool\nIpamPoolAllocation,ipam_pool_allocation\nIpamPoolAllocationId,ipam_pool_allocation_id\nIpamPoolAllocations,ipam_pool_allocations\nIpamPoolArn,ipam_pool_arn\nIpamPoolCidr,ipam_pool_cidr\nIpamPoolCidrFailureReason,ipam_pool_cidr_failure_reason\nIpamPoolCidrId,ipam_pool_cidr_id\nIpamPoolCidrs,ipam_pool_cidrs\nIpamPoolId,ipam_pool_id\nIpamPoolIds,ipam_pool_ids\nIpamPoolOwner,ipam_pool_owner\nIpamPools,ipam_pools\nIpamRegion,ipam_region\nIpamResourceCidr,ipam_resource_cidr\nIpamResourceCidrs,ipam_resource_cidrs\nIpamResourceDiscoveries,ipam_resource_discoveries\nIpamResourceDiscovery,ipam_resource_discovery\nIpamResourceDiscoveryArn,ipam_resource_discovery_arn\nIpamResourceDiscoveryAssociation,ipam_resource_discovery_association\nIpamResourceDiscoveryAssociationArn,ipam_resource_discovery_association_arn\nIpamResourceDiscoveryAssociationId,ipam_resource_discovery_association_id\nIpamResourceDiscoveryAssociationIds,ipam_resource_discovery_association_ids\nIpamResourceDiscoveryAssociations,ipam_resource_discovery_associations\nIpamResourceDiscoveryId,ipam_resource_discovery_id\nIpamResourceDiscoveryIds,ipam_resource_discovery_ids\nIpamResourceDiscoveryRegion,ipam_resource_discovery_region\nIpamResourceTag,ipam_resource_tag\nIpamScope,ipam_scope\nIpamScopeArn,ipam_scope_arn\nIpamScopeId,ipam_scope_id\nIpamScopeIds,ipam_scope_ids\nIpamScopeType,ipam_scope_type\nIpamScopes,ipam_scopes\nIpams,ipams\nIpcMode,ipc_mode\nIps,ips\nIpv4,ipv4\nIpv4Address,ipv4_address\nIpv4AddressesPerInterface,ipv4_addresses_per_interface\nIpv4IpamPoolId,ipv4_ipam_pool_id\nIpv4NetmaskLength,ipv4_netmask_length\nIpv4Prefix,ipv4_prefix\nIpv4PrefixCount,ipv4_prefix_count\nIpv4PrefixSpecification,ipv4_prefix_specification\nIpv4PrefixSpecificationRequest,ipv4_prefix_specification_request\nIpv4PrefixSpecificationResponse,ipv4_prefix_specification_response\nIpv4Prefixes,ipv4_prefixes\nIpv6,ipv6\nIpv6Address,ipv6_address\nIpv6AddressCount,ipv6_address_count\nIpv6Addresses,ipv6_addresses\nIpv6AddressesPerInterface,ipv6_addresses_per_interface\nIpv6Cidr,ipv6_cidr\nIpv6CidrAssociation,ipv6_cidr_association\nIpv6CidrAssociations,ipv6_cidr_associations\nIpv6CidrBlock,ipv6_cidr_block\nIpv6CidrBlockAssociation,ipv6_cidr_block_association\nIpv6CidrBlockAssociationSet,ipv6_cidr_block_association_set\nIpv6CidrBlockNetworkBorderGroup,ipv6_cidr_block_network_border_group\nIpv6CidrBlockSet,ipv6_cidr_block_set\nIpv6CidrBlockState,ipv6_cidr_block_state\nIpv6IpamPoolId,ipv6_ipam_pool_id\nIpv6Native,ipv6_native\nIpv6NetmaskLength,ipv6_netmask_length\nIpv6Pool,ipv6_pool\nIpv6Pools,ipv6_pools\nIpv6Prefix,ipv6_prefix\nIpv6PrefixCount,ipv6_prefix_count\nIpv6PrefixSpecification,ipv6_prefix_specification\nIpv6PrefixSpecificationRequest,ipv6_prefix_specification_request\nIpv6PrefixSpecificationResponse,ipv6_prefix_specification_response\nIpv6Prefixes,ipv6_prefixes\nIpv6Range,ipv6_range\nIpv6Ranges,ipv6_ranges\nIpv6Support,ipv6_support\nIpv6Supported,ipv6_supported\nIrreversibleInstanceRefreshFault,irreversible_instance_refresh_fault\nIs64BitsOnly,is64_bits_only\nIsActivated,is_activated\nIsAdvancedManagedRuleSet,is_advanced_managed_rule_set\nIsAlexaForBusinessEnabled,is_alexa_for_business_enabled\nIsAnomalous,is_anomalous\nIsAnomaly,is_anomaly\nIsApplicable,is_applicable\nIsArchived,is_archived\nIsAttachable,is_attachable\nIsAuthorizedInput,is_authorized_input\nIsAuthorizedOutput,is_authorized_output\nIsAuthorizedWithTokenInput,is_authorized_with_token_input\nIsAuthorizedWithTokenOutput,is_authorized_with_token_output\nIsAutoPredictor,is_auto_predictor\nIsBatchStatement,is_batch_statement\nIsBinaryFile,is_binary_file\nIsCaller,is_caller\nIsClusterWriter,is_cluster_writer\nIsCollection,is_collection\nIsCritical,is_critical\nIsDataLossAllowed,is_data_loss_allowed\nIsDataPartial,is_data_partial\nIsDefault,is_default\nIsDefaultAction,is_default_action\nIsDefaultConfiguration,is_default_configuration\nIsDefaultVersion,is_default_version\nIsEgress,is_egress\nIsEmpty,is_empty\nIsEnabled,is_enabled\nIsEncrypted,is_encrypted\nIsEnd,is_end\nIsEssential,is_essential\nIsGlobal,is_global\nIsIPV6Enabled,is_ipv6_enabled\nIsImmutable,is_immutable\nIsInSandbox,is_in_sandbox\nIsIncludedInTopic,is_included_in_topic\nIsIndirectActivity,is_indirect_activity\nIsLatest,is_latest\nIsLatestPatch,is_latest_patch\nIsLatestVersion,is_latest_version\nIsLocalTime,is_local_time\nIsLogging,is_logging\nIsLoggingEnabled,is_logging_enabled\nIsLongTermPricingAutoRenew,is_long_term_pricing_auto_renew\nIsMajorVersion,is_major_version\nIsMajorVersionUpgrade,is_major_version_upgrade\nIsMaster,is_master\nIsMemberInGroupsRequest,is_member_in_groups_request\nIsMemberInGroupsResponse,is_member_in_groups_response\nIsMfaDeleteEnabled,is_mfa_delete_enabled\nIsMiddlebox,is_middlebox\nIsModifiable,is_modifiable\nIsMultiRegionTrail,is_multi_region_trail\nIsNegOne,is_neg_one\nIsNewProvisioningAvailable,is_new_provisioning_available\nIsNoEcho,is_no_echo\nIsNullString,is_null_string\nIsOptional,is_optional\nIsOrganizationTrail,is_organization_trail\nIsOwned,is_owned\nIsParent,is_parent\nIsPartial,is_partial\nIsPaused,is_paused\nIsPermanentRestore,is_permanent_restore\nIsPrimary,is_primary\nIsPrimaryIpv6,is_primary_ipv6\nIsPublic,is_public\nIsPubliclyAccessible,is_publicly_accessible\nIsRegisteredWithLakeFormation,is_registered_with_lake_formation\nIsRequestable,is_requestable\nIsRequired,is_required\nIsRestoreInProgress,is_restore_in_progress\nIsRestricted,is_restricted\nIsReviewOwnerUpdateAcknowledged,is_review_owner_update_acknowledged\nIsRouteTableUsedInDifferentAZ,is_route_table_used_in_different_az\nIsSuccess,is_success\nIsTerminal,is_terminal\nIsTestDomain,is_test_domain\nIsTruncated,is_truncated\nIsTunable,is_tunable\nIsUnique,is_unique\nIsUnstructured,is_unstructured\nIsValidExchange,is_valid_exchange\nIsValueSecret,is_value_secret\nIsVerifiedAuthor,is_verified_author\nIsVersioningSupported,is_versioning_supported\nIsVpcPeeredResult,is_vpc_peered_result\nIsWifiEnabled,is_wifi_enabled\nIsWriter,is_writer\nIscsi,iscsi\nIso2CountryCode,iso2_country_code\nIsoCountryCode,iso_country_code\nIsolationMode,isolation_mode\nIsp,isp\nIspName,isp_name\nIspPlacement,isp_placement\nIspPlacements,isp_placements\nIssue,issue\nIssueCertificateRequest,issue_certificate_request\nIssueCertificateResponse,issue_certificate_response\nIssueDetected,issue_detected\nIssueDetectionConfiguration,issue_detection_configuration\nIssueFieldMappings,issue_field_mappings\nIssueInfoMap,issue_info_map\nIssueSubEntityFilter,issue_sub_entity_filter\nIssueType,issue_type\nIssuedAt,issued_at\nIssuer,issuer\nIssuerCertificateIdentifier,issuer_certificate_identifier\nIssuerDetails,issuer_details\nIssues,issues\nIssuesDetected,issues_detected\nIssuingAccount,issuing_account\nItem,item\nItemClassFilter,item_class_filter\nItemCollectionKey,item_collection_key\nItemCollectionMetrics,item_collection_metrics\nItemCollectionSizeLimitExceededException,item_collection_size_limit_exceeded_exception\nItemContentHash,item_content_hash\nItemContentMismatchException,item_content_mismatch_exception\nItemCount,item_count\nItemIdentifier,item_identifier\nItemIdentifierAttributeName,item_identifier_attribute_name\nItemResponse,item_response\nItemSizeLimitExceededException,item_size_limit_exceeded_exception\nItemSource,item_source\nItemStatus,item_status\nItemizedMetricStats,itemized_metric_stats\nItemizedMetricStatsList,itemized_metric_stats_list\nItems,items\nItemsLimit,items_limit\nItemsLimitConfiguration,items_limit_configuration\nIvInManifest,iv_in_manifest\nIvSource,iv_source\nJA3Fingerprint,ja3_fingerprint\nJDBCConnectorOptions,jdbc_connector_options\nJDBCConnectorSource,jdbc_connector_source\nJDBCConnectorTarget,jdbc_connector_target\nJSON,json\nJSONInput,json_input\nJSONMappingParameters,json_mapping_parameters\nJSONOutput,json_output\nJSONString,json_string\nJWTConfiguration,jwt_configuration\nJamSyncTime,jam_sync_time\nJapaneseTokenizationDictionary,japanese_tokenization_dictionary\nJar,jar\nJdbc,jdbc\nJdbcTarget,jdbc_target\nJdbcTargets,jdbc_targets\nJiraAccountUrl,jira_account_url\nJiraConfiguration,jira_configuration\nJiraParameters,jira_parameters\nJmxExporter,jmx_exporter\nJmxExporterInfo,jmx_exporter_info\nJob,job\nJobAlbumArt,job_album_art\nJobArn,job_arn\nJobBookmark,job_bookmark\nJobBookmarkEntry,job_bookmark_entry\nJobBookmarkKeys,job_bookmark_keys\nJobBookmarkKeysSortOrder,job_bookmark_keys_sort_order\nJobBookmarksEncryption,job_bookmarks_encryption\nJobBookmarksEncryptionMode,job_bookmarks_encryption_mode\nJobCheckpointConfig,job_checkpoint_config\nJobCommand,job_command\nJobCompletionDate,job_completion_date\nJobCompletionReportURI,job_completion_report_uri\nJobConfig,job_config\nJobConfiguration,job_configuration\nJobCreationDate,job_creation_date\nJobData,job_data\nJobDefinition,job_definition\nJobDefinitionArn,job_definition_arn\nJobDefinitionName,job_definition_name\nJobDefinitionSummaries,job_definition_summaries\nJobDependency,job_dependency\nJobDescription,job_description\nJobDescriptor,job_descriptor\nJobDetail,job_detail\nJobDetails,job_details\nJobDriver,job_driver\nJobDurationInSeconds,job_duration_in_seconds\nJobEndTime,job_end_time\nJobEntry,job_entry\nJobError,job_error\nJobEventDetails,job_event_details\nJobExecution,job_execution\nJobExecutionSettings,job_execution_settings\nJobExecutionState,job_execution_state\nJobExecutionStatusDetails,job_execution_status_details\nJobExecutionSummary,job_execution_summary\nJobExecutionSummaryForJob,job_execution_summary_for_job\nJobExecutionSummaryForThing,job_execution_summary_for_thing\nJobExecutionsRetryConfig,job_executions_retry_config\nJobExecutionsRolloutConfig,job_executions_rollout_config\nJobExpirationTime,job_expiration_time\nJobFailure,job_failure\nJobFailureLogURI,job_failure_log_uri\nJobFilter,job_filter\nJobFlowDetail,job_flow_detail\nJobFlowExecutionStatusDetail,job_flow_execution_status_detail\nJobFlowId,job_flow_id\nJobFlowIds,job_flow_ids\nJobFlowInstancesConfig,job_flow_instances_config\nJobFlowInstancesDetail,job_flow_instances_detail\nJobFlowRole,job_flow_role\nJobFlowStates,job_flow_states\nJobFlows,job_flows\nJobId,job_id\nJobIds,job_ids\nJobInput,job_input\nJobList,job_list\nJobListDescriptor,job_list_descriptor\nJobListEntries,job_list_entries\nJobListEntry,job_list_entry\nJobLog,job_log\nJobLogEventData,job_log_event_data\nJobLogInfo,job_log_info\nJobLogs,job_logs\nJobManifest,job_manifest\nJobManifestGeneratorFilter,job_manifest_generator_filter\nJobManifestLocation,job_manifest_location\nJobManifestSpec,job_manifest_spec\nJobMessages,job_messages\nJobMetadata,job_metadata\nJobMetrics,job_metrics\nJobName,job_name\nJobNameContains,job_name_contains\nJobNames,job_names\nJobNodeDetails,job_node_details\nJobNotFoundException,job_not_found_exception\nJobOperation,job_operation\nJobOutput,job_output\nJobOutputDataConfig,job_output_data_config\nJobOutputPath,job_output_path\nJobParameters,job_parameters\nJobPercentComplete,job_percent_complete\nJobPlanDescription,job_plan_description\nJobPostLaunchActionsLaunchStatus,job_post_launch_actions_launch_status\nJobProcessDetails,job_process_details\nJobProgress,job_progress\nJobProgressSummary,job_progress_summary\nJobQueueDetail,job_queue_detail\nJobReferenceCode,job_reference_code\nJobReferenceCodeContains,job_reference_code_contains\nJobReport,job_report\nJobResource,job_resource\nJobResourceTags,job_resource_tags\nJobResources,job_resources\nJobRun,job_run\nJobRunId,job_run_id\nJobRunIds,job_run_ids\nJobRunState,job_run_state\nJobRunSummary,job_run_summary\nJobRuns,job_runs\nJobSample,job_sample\nJobSchedule,job_schedule\nJobScheduleFrequency,job_schedule_frequency\nJobScopeTerm,job_scope_term\nJobScopingBlock,job_scoping_block\nJobSettings,job_settings\nJobStartTime,job_start_time\nJobState,job_state\nJobStatesToNotify,job_states_to_notify\nJobStats,job_stats\nJobStatus,job_status\nJobStatusDetails,job_status_details\nJobStatusException,job_status_exception\nJobStatuses,job_statuses\nJobStoppingCondition,job_stopping_condition\nJobSuccessLogURI,job_success_log_uri\nJobSummaries,job_summaries\nJobSummary,job_summary\nJobTag,job_tag\nJobTags,job_tags\nJobTemplate,job_template\nJobTemplateData,job_template_data\nJobTemplateSettings,job_template_settings\nJobTemplateSummary,job_template_summary\nJobTemplates,job_templates\nJobTimeout,job_timeout\nJobTimers,job_timers\nJobTitle,job_title\nJobType,job_type\nJobUpdate,job_update\nJobWatermark,job_watermark\nJobWorkerExecutorConfiguration,job_worker_executor_configuration\nJobs,jobs\nJobsNotFound,jobs_not_found\nJoin,join\nJoinColumn,join_column\nJoinDomainInput,join_domain_input\nJoinDomainOutput,join_domain_output\nJoinEui,join_eui\nJoinEuiFilters,join_eui_filters\nJoinEventConfiguration,join_event_configuration\nJoinInstruction,join_instruction\nJoinKeyProperties,join_key_properties\nJoinResourceTypeEventConfiguration,join_resource_type_event_configuration\nJoinSource,join_source\nJoinStorageSessionInput,join_storage_session_input\nJoinToken,join_token\nJoinType,join_type\nJoinedMethod,joined_method\nJoinedTimestamp,joined_timestamp\nJournalKinesisStreamDescription,journal_kinesis_stream_description\nJournalS3ExportDescription,journal_s3_export_description\nJournalS3Exports,journal_s3_exports\nJourneyActivityId,journey_activity_id\nJourneyChannelSettings,journey_channel_settings\nJourneyCustomMessage,journey_custom_message\nJourneyDateRangeKpiResponse,journey_date_range_kpi_response\nJourneyEmailMessage,journey_email_message\nJourneyExecutionActivityMetricsResponse,journey_execution_activity_metrics_response\nJourneyExecutionMetricsResponse,journey_execution_metrics_response\nJourneyId,journey_id\nJourneyLimits,journey_limits\nJourneyPushMessage,journey_push_message\nJourneyResponse,journey_response\nJourneyRunExecutionActivityMetricsResponse,journey_run_execution_activity_metrics_response\nJourneyRunExecutionMetricsResponse,journey_run_execution_metrics_response\nJourneyRunResponse,journey_run_response\nJourneyRunsResponse,journey_runs_response\nJourneySMSMessage,journey_sms_message\nJourneySchedule,journey_schedule\nJourneyStateRequest,journey_state_request\nJourneyTimeframeCap,journey_timeframe_cap\nJourneysResponse,journeys_response\nJson,json\nJsonBody,json_body\nJsonClassifier,json_classifier\nJsonContentTypes,json_content_types\nJsonFormatDescriptor,json_format_descriptor\nJsonFormatRef,json_format_ref\nJsonMatchPattern,json_match_pattern\nJsonOptions,json_options\nJsonPath,json_path\nJsonTokenTypeConfiguration,json_token_type_configuration\nJunctionPath,junction_path\nJupyterServerAppSettings,jupyter_server_app_settings\nJwksUri,jwks_uri\nJwtConfiguration,jwt_configuration\nJwtTokenTypeConfiguration,jwt_token_type_configuration\nKBId,kb_id\nKGKeyPairIds,kg_key_pair_ids\nKMSAccessDeniedException,kms_access_denied_exception\nKMSAccessDeniedFault,kms_access_denied_fault\nKMSArn,kms_arn\nKMSContext,kms_context\nKMSDisabledException,kms_disabled_exception\nKMSDisabledFault,kms_disabled_fault\nKMSEncrypted,kms_encrypted\nKMSEncryptionConfig,kms_encryption_config\nKMSEncryptionContext,kms_encryption_context\nKMSFault,kms_fault\nKMSInternalException,kms_internal_exception\nKMSInvalidKeyUsageException,kms_invalid_key_usage_exception\nKMSInvalidMacException,kms_invalid_mac_exception\nKMSInvalidSignatureException,kms_invalid_signature_exception\nKMSInvalidStateException,kms_invalid_state_exception\nKMSInvalidStateFault,kms_invalid_state_fault\nKMSKey,kms_key\nKMSKeyArn,kms_key_arn\nKMSKeyDetails,kms_key_details\nKMSKeyID,kms_key_id\nKMSKeyId,kms_key_id\nKMSKeyNotAccessibleFault,kms_key_not_accessible_fault\nKMSMasterKeyArn,kms_master_key_arn\nKMSMasterKeyID,kms_master_key_id\nKMSMasterKeyId,kms_master_key_id\nKMSNotFoundException,kms_not_found_exception\nKMSNotFoundFault,kms_not_found_fault\nKMSOptInRequired,kms_opt_in_required\nKMSRequestFailedException,kms_request_failed_exception\nKMSServerSideEncryption,kms_server_side_encryption\nKMSServerSideEncryptionIntegration,kms_server_side_encryption_integration\nKMSServerSideEncryptionIntegrationConfig,kms_server_side_encryption_integration_config\nKMSThrottlingException,kms_throttling_exception\nKMSThrottlingFault,kms_throttling_fault\nKPIActualValueConditionalFormatting,kpi_actual_value_conditional_formatting\nKPIComparisonValueConditionalFormatting,kpi_comparison_value_conditional_formatting\nKPIConditionalFormatting,kpi_conditional_formatting\nKPIConditionalFormattingOption,kpi_conditional_formatting_option\nKPIConfiguration,kpi_configuration\nKPIFieldWells,kpi_field_wells\nKPIOptions,kpi_options\nKPIPrimaryValueConditionalFormatting,kpi_primary_value_conditional_formatting\nKPIProgressBarConditionalFormatting,kpi_progress_bar_conditional_formatting\nKPISortConfiguration,kpi_sort_configuration\nKPISparklineOptions,kpi_sparkline_options\nKPIVisual,kpi_visual\nKPIVisualLayoutOptions,kpi_visual_layout_options\nKPIVisualStandardLayout,kpi_visual_standard_layout\nKVSStreamStartSelector,kvs_stream_start_selector\nKafkaAction,kafka_action\nKafkaActionHeader,kafka_action_header\nKafkaBrokerNodeId,kafka_broker_node_id\nKafkaCluster,kafka_cluster\nKafkaClusterClientAuthentication,kafka_cluster_client_authentication\nKafkaClusterClientAuthenticationDescription,kafka_cluster_client_authentication_description\nKafkaClusterDescription,kafka_cluster_description\nKafkaClusterEncryptionInTransit,kafka_cluster_encryption_in_transit\nKafkaClusterEncryptionInTransitDescription,kafka_cluster_encryption_in_transit_description\nKafkaSettings,kafka_settings\nKafkaStreamingSourceOptions,kafka_streaming_source_options\nKafkaVersion,kafka_version\nKafkaVersions,kafka_versions\nKantarLicenseId,kantar_license_id\nKantarServerUrl,kantar_server_url\nKantarWatermark,kantar_watermark\nKantarWatermarkSettings,kantar_watermark_settings\nKbNumber,kb_number\nKdcAdminPassword,kdc_admin_password\nKeepAlivePeriodInSeconds,keep_alive_period_in_seconds\nKeepJobFlowAliveWhenNoSteps,keep_job_flow_alive_when_no_steps\nKeepSegments,keep_segments\nKendraConfiguration,kendra_configuration\nKerberosAttributes,kerberos_attributes\nKerberosKeytab,kerberos_keytab\nKerberosKrb5Conf,kerberos_krb5_conf\nKerberosPrincipal,kerberos_principal\nKernel,kernel\nKernelCapabilities,kernel_capabilities\nKernelGatewayAppSettings,kernel_gateway_app_settings\nKernelGatewayImageConfig,kernel_gateway_image_config\nKernelId,kernel_id\nKernelSpec,kernel_spec\nKernelSpecs,kernel_specs\nKey,key\nKeyARN,key_arn\nKeyAgreement,key_agreement\nKeyAlgorithm,key_algorithm\nKeyArn,key_arn\nKeyAttributes,key_attributes\nKeyBlockFormat,key_block_format\nKeyCertSign,key_cert_sign\nKeyCertificate,key_certificate\nKeyCertificateChain,key_certificate_chain\nKeyCheckValue,key_check_value\nKeyCheckValueAlgorithm,key_check_value_algorithm\nKeyClass,key_class\nKeyConditionExpression,key_condition_expression\nKeyConditions,key_conditions\nKeyCount,key_count\nKeyDetection,key_detection\nKeyEncipherment,key_encipherment\nKeyEncryptionAlgorithm,key_encryption_algorithm\nKeyFingerprint,key_fingerprint\nKeyFormat,key_format\nKeyFormatVersions,key_format_versions\nKeyGroup,key_group\nKeyGroupAlreadyExists,key_group_already_exists\nKeyGroupConfig,key_group_config\nKeyGroupId,key_group_id\nKeyGroupList,key_group_list\nKeyGroupSummary,key_group_summary\nKeyId,key_id\nKeyIdentifier,key_identifier\nKeyLabels,key_labels\nKeyLength,key_length\nKeyListEntry,key_list_entry\nKeyLocation,key_location\nKeyManagementServiceArn,key_management_service_arn\nKeyManager,key_manager\nKeyMarker,key_marker\nKeyMaterial,key_material\nKeyMaterialType,key_material_type\nKeyMd5,key_md5\nKeyMetadata,key_metadata\nKeyModesOfUse,key_modes_of_use\nKeyName,key_name\nKeyNames,key_names\nKeyOrigin,key_origin\nKeyPair,key_pair\nKeyPairId,key_pair_id\nKeyPairIds,key_pair_ids\nKeyPairInfo,key_pair_info\nKeyPairMismatchException,key_pair_mismatch_exception\nKeyPairSpec,key_pair_spec\nKeyPairs,key_pairs\nKeyPath,key_path\nKeyPattern,key_pattern\nKeyPhrase,key_phrase\nKeyPhrases,key_phrases\nKeyPhrasesDetectionJobFilter,key_phrases_detection_job_filter\nKeyPhrasesDetectionJobProperties,key_phrases_detection_job_properties\nKeyPhrasesDetectionJobPropertiesList,key_phrases_detection_job_properties_list\nKeyPrefix,key_prefix\nKeyPrefixEquals,key_prefix_equals\nKeyPrefixes,key_prefixes\nKeyProviderServer,key_provider_server\nKeyProviderSettings,key_provider_settings\nKeyRange,key_range\nKeyRotationEnabled,key_rotation_enabled\nKeyRotationIntervalSeconds,key_rotation_interval_seconds\nKeyRotationStatus,key_rotation_status\nKeySchema,key_schema\nKeySchemaElement,key_schema_element\nKeySerialNumber,key_serial_number\nKeySigningKey,key_signing_key\nKeySigningKeyAlreadyExists,key_signing_key_already_exists\nKeySigningKeyInParentDSRecord,key_signing_key_in_parent_ds_record\nKeySigningKeyInUse,key_signing_key_in_use\nKeySigningKeyWithActiveStatusNotFound,key_signing_key_with_active_status_not_found\nKeySigningKeys,key_signing_keys\nKeySpec,key_spec\nKeyState,key_state\nKeyStatus,key_status\nKeyStoragePolicy,key_storage_policy\nKeyStorageSecurityStandard,key_storage_security_standard\nKeyStorePassword,key_store_password\nKeySummary,key_summary\nKeyTag,key_tag\nKeyType,key_type\nKeyUnavailableException,key_unavailable_exception\nKeyUsage,key_usage\nKeyUsageFlags,key_usage_flags\nKeyUsageProperty,key_usage_property\nKeyUsagePropertyFlags,key_usage_property_flags\nKeyUsages,key_usages\nKeyValue,key_value\nKeyValuePair,key_value_pair\nKeyValuesPair,key_values_pair\nKeyframesMaxDist,keyframes_max_dist\nKeys,keys\nKeysAndAttributes,keys_and_attributes\nKeysToDelete,keys_to_delete\nKeysWithNoncompliantValues,keys_with_noncompliant_values\nKeyspaceSummary,keyspace_summary\nKeyword,keyword\nKeywordAction,keyword_action\nKeywordFilter,keyword_filter\nKeywordInformation,keyword_information\nKeywordMatchConfiguration,keyword_match_configuration\nKeywordMessage,keyword_message\nKeywords,keywords\nKinesisAction,kinesis_action\nKinesisConfiguration,kinesis_configuration\nKinesisDataFirehose,kinesis_data_firehose\nKinesisDataStream,kinesis_data_stream\nKinesisDataStreamDestination,kinesis_data_stream_destination\nKinesisDataStreamDestinations,kinesis_data_stream_destinations\nKinesisDataStreamSinkConfiguration,kinesis_data_stream_sink_configuration\nKinesisFirehoseConfig,kinesis_firehose_config\nKinesisFirehoseDestination,kinesis_firehose_destination\nKinesisFirehoseDestinationDetails,kinesis_firehose_destination_details\nKinesisFirehoseDetails,kinesis_firehose_details\nKinesisFirehoseInput,kinesis_firehose_input\nKinesisFirehoseInputDescription,kinesis_firehose_input_description\nKinesisFirehoseInputUpdate,kinesis_firehose_input_update\nKinesisFirehoseOutput,kinesis_firehose_output\nKinesisFirehoseOutputDescription,kinesis_firehose_output_description\nKinesisFirehoseOutputUpdate,kinesis_firehose_output_update\nKinesisParameters,kinesis_parameters\nKinesisSettings,kinesis_settings\nKinesisStreamARN,kinesis_stream_arn\nKinesisStreamConfig,kinesis_stream_config\nKinesisStreamName,kinesis_stream_name\nKinesisStreamParameters,kinesis_stream_parameters\nKinesisStreamSourceConfiguration,kinesis_stream_source_configuration\nKinesisStreamSourceDescription,kinesis_stream_source_description\nKinesisStreamingDestinationInput,kinesis_streaming_destination_input\nKinesisStreamingDestinationOutput,kinesis_streaming_destination_output\nKinesisStreamingSourceOptions,kinesis_streaming_source_options\nKinesisStreamsInput,kinesis_streams_input\nKinesisStreamsInputDescription,kinesis_streams_input_description\nKinesisStreamsInputUpdate,kinesis_streams_input_update\nKinesisStreamsOutput,kinesis_streams_output\nKinesisStreamsOutputDescription,kinesis_streams_output_description\nKinesisStreamsOutputUpdate,kinesis_streams_output_update\nKinesisVideoStream,kinesis_video_stream\nKinesisVideoStreamConfig,kinesis_video_stream_config\nKinesisVideoStreamConfiguration,kinesis_video_stream_configuration\nKinesisVideoStreamConfigurationUpdate,kinesis_video_stream_configuration_update\nKinesisVideoStreamPoolConfiguration,kinesis_video_stream_pool_configuration\nKinesisVideoStreamPoolSummary,kinesis_video_stream_pool_summary\nKinesisVideoStreamPools,kinesis_video_stream_pools\nKinesisVideoStreamRecordingSourceRuntimeConfiguration,kinesis_video_stream_recording_source_runtime_configuration\nKinesisVideoStreamSourceRuntimeConfiguration,kinesis_video_stream_source_runtime_configuration\nKinesisVideoStreamSourceTaskConfiguration,kinesis_video_stream_source_task_configuration\nKinesisVideoStreamStartSelector,kinesis_video_stream_start_selector\nKlv,klv\nKlvBehavior,klv_behavior\nKlvDataPids,klv_data_pids\nKlvMetadata,klv_metadata\nKmsArn,kms_arn\nKmsDataKeyReusePeriodSeconds,kms_data_key_reuse_period_seconds\nKmsEncryptionConfig,kms_encryption_config\nKmsEncryptionContext,kms_encryption_context\nKmsException,kms_exception\nKmsGrantConfiguration,kms_grant_configuration\nKmsGrantConstraints,kms_grant_constraints\nKmsKey,kms_key\nKmsKeyARN,kms_key_arn\nKmsKeyArn,kms_key_arn\nKmsKeyConfiguration,kms_key_configuration\nKmsKeyDisabledException,kms_key_disabled_exception\nKmsKeyId,kms_key_id\nKmsKeyIdentifier,kms_key_identifier\nKmsKeyIds,kms_key_ids\nKmsKeyNotFoundException,kms_key_not_found_exception\nKmsKeyProviderUri,kms_key_provider_uri\nKmsKeyRegion,kms_key_region\nKmsKeyToGrant,kms_key_to_grant\nKmsKeyValidationException,kms_key_validation_exception\nKmsKeysToGrant,kms_keys_to_grant\nKmsMasterKeyArn,kms_master_key_arn\nKmsMasterKeyId,kms_master_key_id\nKnowledgeArticleConfiguration,knowledge_article_configuration\nKnowledgeBaseAssociationData,knowledge_base_association_data\nKnowledgeBaseData,knowledge_base_data\nKnowledgeBaseSummary,knowledge_base_summary\nKnownFraudsterRisk,known_fraudster_risk\nKnownGender,known_gender\nKpiName,kpi_name\nKpiResult,kpi_result\nKubernetes,kubernetes\nKubernetesApiCallAction,kubernetes_api_call_action\nKubernetesAuditLogsConfiguration,kubernetes_audit_logs_configuration\nKubernetesAuditLogsConfigurationResult,kubernetes_audit_logs_configuration_result\nKubernetesConfiguration,kubernetes_configuration\nKubernetesConfigurationResult,kubernetes_configuration_result\nKubernetesDataSourceFreeTrial,kubernetes_data_source_free_trial\nKubernetesDetails,kubernetes_details\nKubernetesNetworkConfigRequest,kubernetes_network_config_request\nKubernetesNetworkConfigResponse,kubernetes_network_config_response\nKubernetesUserDetails,kubernetes_user_details\nKubernetesVersion,kubernetes_version\nKubernetesWorkloadDetails,kubernetes_workload_details\nKxCacheStorageConfiguration,kx_cache_storage_configuration\nKxChangesetListEntry,kx_changeset_list_entry\nKxCluster,kx_cluster\nKxCommandLineArgument,kx_command_line_argument\nKxDatabaseCacheConfiguration,kx_database_cache_configuration\nKxDatabaseConfiguration,kx_database_configuration\nKxDatabaseListEntry,kx_database_list_entry\nKxDeploymentConfiguration,kx_deployment_configuration\nKxEnvironment,kx_environment\nKxNode,kx_node\nKxSavedownStorageConfiguration,kx_savedown_storage_configuration\nKxUser,kx_user\nL6Metadata,l6_metadata\nL6Mode,l6_mode\nLBCookieStickinessPolicies,lb_cookie_stickiness_policies\nLBCookieStickinessPolicy,lb_cookie_stickiness_policy\nLDAPSSettingInfo,ldaps_setting_info\nLDAPSSettingsInfo,ldaps_settings_info\nLDAPSStatus,ldaps_status\nLDAPSStatusReason,ldaps_status_reason\nLE,le\nLFResourceDetails,lf_resource_details\nLFTag,lf_tag\nLFTagError,lf_tag_error\nLFTagKeyResource,lf_tag_key_resource\nLFTagOnDatabase,lf_tag_on_database\nLFTagPair,lf_tag_pair\nLFTagPolicy,lf_tag_policy\nLFTagPolicyDetails,lf_tag_policy_details\nLFTagPolicyResource,lf_tag_policy_resource\nLFTags,lf_tags\nLFTagsOnColumns,lf_tags_on_columns\nLFTagsOnTable,lf_tags_on_table\nLT,lt\nLabel,label\nLabelAlias,label_alias\nLabelAttribute,label_attribute\nLabelAttributeName,label_attribute_name\nLabelCategory,label_category\nLabelCategoryConfigS3Uri,label_category_config_s3_uri\nLabelCategoryExclusionFilters,label_category_exclusion_filters\nLabelCategoryInclusionFilters,label_category_inclusion_filters\nLabelColor,label_color\nLabelConfiguration,label_configuration\nLabelContent,label_content\nLabelCount,label_count\nLabelCounters,label_counters\nLabelCountersForWorkteam,label_counters_for_workteam\nLabelDelimiter,label_delimiter\nLabelDetection,label_detection\nLabelDetectionSettings,label_detection_settings\nLabelExclusionFilters,label_exclusion_filters\nLabelFontConfiguration,label_font_configuration\nLabelGroupArn,label_group_arn\nLabelGroupName,label_group_name\nLabelGroupNameBeginsWith,label_group_name_begins_with\nLabelGroupSummaries,label_group_summaries\nLabelGroupSummary,label_group_summary\nLabelHeaders,label_headers\nLabelId,label_id\nLabelInclusionFilters,label_inclusion_filters\nLabelIndex,label_index\nLabelMatchStatement,label_match_statement\nLabelModelVersion,label_model_version\nLabelName,label_name\nLabelNameCondition,label_name_condition\nLabelNamespace,label_namespace\nLabelOptions,label_options\nLabelParameterVersionRequest,label_parameter_version_request\nLabelParameterVersionResult,label_parameter_version_result\nLabelSchema,label_schema\nLabelStats,label_stats\nLabelSummaries,label_summaries\nLabelSummary,label_summary\nLabelTemplate,label_template\nLabelVisibility,label_visibility\nLabeled,labeled\nLabeledEntries,labeled_entries\nLabelingJobAlgorithmSpecificationArn,labeling_job_algorithm_specification_arn\nLabelingJobAlgorithmsConfig,labeling_job_algorithms_config\nLabelingJobArn,labeling_job_arn\nLabelingJobDataAttributes,labeling_job_data_attributes\nLabelingJobDataSource,labeling_job_data_source\nLabelingJobForWorkteamSummary,labeling_job_for_workteam_summary\nLabelingJobInputConfig,labeling_job_input_config\nLabelingJobName,labeling_job_name\nLabelingJobOutput,labeling_job_output\nLabelingJobOutputConfig,labeling_job_output_config\nLabelingJobResourceConfig,labeling_job_resource_config\nLabelingJobS3DataSource,labeling_job_s3_data_source\nLabelingJobSnsDataSource,labeling_job_sns_data_source\nLabelingJobStatus,labeling_job_status\nLabelingJobStoppingConditions,labeling_job_stopping_conditions\nLabelingJobSummary,labeling_job_summary\nLabelingJobSummaryList,labeling_job_summary_list\nLabelingSetGenerationTaskRunProperties,labeling_set_generation_task_run_properties\nLabels,labels\nLabelsInputConfiguration,labels_input_configuration\nLabelsS3InputConfiguration,labels_s3_input_configuration\nLac,lac\nLag,lag\nLags,lags\nLakeFormationConfiguration,lake_formation_configuration\nLakeFormationDataPermissionAsset,lake_formation_data_permission_asset\nLakeFormationDataPermissionDetails,lake_formation_data_permission_details\nLakeFormationDataPermissionType,lake_formation_data_permission_type\nLakeFormationOptInsInfo,lake_formation_opt_ins_info\nLakeFormationOptInsInfoList,lake_formation_opt_ins_info_list\nLambda,lambda\nLambdaAction,lambda_action\nLambdaActivity,lambda_activity\nLambdaArn,lambda_arn\nLambdaAuthorizerConfig,lambda_authorizer_config\nLambdaAvailabilityProvider,lambda_availability_provider\nLambdaCodeHook,lambda_code_hook\nLambdaConfig,lambda_config\nLambdaConfigType,lambda_config_type\nLambdaConfiguration,lambda_configuration\nLambdaConflictHandlerConfig,lambda_conflict_handler_config\nLambdaConnectorProvisioningConfig,lambda_connector_provisioning_config\nLambdaContainerParams,lambda_container_params\nLambdaDataSourceConfig,lambda_data_source_config\nLambdaDetails,lambda_details\nLambdaDeviceMount,lambda_device_mount\nLambdaEndpoint,lambda_endpoint\nLambdaEndpointConfig,lambda_endpoint_config\nLambdaEndpointInput,lambda_endpoint_input\nLambdaEndpointSummary,lambda_endpoint_summary\nLambdaEventSource,lambda_event_source\nLambdaExecutionParameters,lambda_execution_parameters\nLambdaExecutorConfiguration,lambda_executor_configuration\nLambdaFunction,lambda_function\nLambdaFunctionARN,lambda_function_arn\nLambdaFunctionAggregation,lambda_function_aggregation\nLambdaFunctionAggregationResponse,lambda_function_aggregation_response\nLambdaFunctionArn,lambda_function_arn\nLambdaFunctionAssociation,lambda_function_association\nLambdaFunctionAssociations,lambda_function_associations\nLambdaFunctionCompletedEventAttributes,lambda_function_completed_event_attributes\nLambdaFunctionConfiguration,lambda_function_configuration\nLambdaFunctionConfigurations,lambda_function_configurations\nLambdaFunctionFailedEventAttributes,lambda_function_failed_event_attributes\nLambdaFunctionFailedEventDetails,lambda_function_failed_event_details\nLambdaFunctionInfo,lambda_function_info\nLambdaFunctionMemoryProjectedMetric,lambda_function_memory_projected_metric\nLambdaFunctionMemoryRecommendationOption,lambda_function_memory_recommendation_option\nLambdaFunctionMetadata,lambda_function_metadata\nLambdaFunctionName,lambda_function_name\nLambdaFunctionParameters,lambda_function_parameters\nLambdaFunctionRecipeSource,lambda_function_recipe_source\nLambdaFunctionRecommendation,lambda_function_recommendation\nLambdaFunctionRecommendationFilter,lambda_function_recommendation_filter\nLambdaFunctionScheduleFailedEventDetails,lambda_function_schedule_failed_event_details\nLambdaFunctionScheduledEventAttributes,lambda_function_scheduled_event_attributes\nLambdaFunctionScheduledEventDetails,lambda_function_scheduled_event_details\nLambdaFunctionSinkConfiguration,lambda_function_sink_configuration\nLambdaFunctionStartFailedEventDetails,lambda_function_start_failed_event_details\nLambdaFunctionStartedEventAttributes,lambda_function_started_event_attributes\nLambdaFunctionSucceededEventDetails,lambda_function_succeeded_event_details\nLambdaFunctionTimedOutEventAttributes,lambda_function_timed_out_event_attributes\nLambdaFunctionTimedOutEventDetails,lambda_function_timed_out_event_details\nLambdaFunctionUtilizationMetric,lambda_function_utilization_metric\nLambdaFunctions,lambda_functions\nLambdaInvoke,lambda_invoke\nLambdaInvokeOperation,lambda_invoke_operation\nLambdaLayerAggregation,lambda_layer_aggregation\nLambdaLayerAggregationResponse,lambda_layer_aggregation_response\nLambdaLinuxProcessParams,lambda_linux_process_params\nLambdaOutput,lambda_output\nLambdaOutputDescription,lambda_output_description\nLambdaOutputUpdate,lambda_output_update\nLambdaProvider,lambda_provider\nLambdaResource,lambda_resource\nLambdaResources,lambda_resources\nLambdaStepMetadata,lambda_step_metadata\nLambdaTarget,lambda_target\nLambdaThrottledException,lambda_throttled_exception\nLambdaVersion,lambda_version\nLambdaVolumeMount,lambda_volume_mount\nLambdaVpcConfig,lambda_vpc_config\nLandmark,landmark\nLandmarks,landmarks\nLandsatCloudCoverLand,landsat_cloud_cover_land\nLandsatCloudCoverLandInput,landsat_cloud_cover_land_input\nLang,lang\nLanguage,language\nLanguageCode,language_code\nLanguageCodeControl,language_code_control\nLanguageCodeItem,language_code_item\nLanguageCodes,language_codes\nLanguageDescription,language_description\nLanguageIdSettings,language_id_settings\nLanguageIdentification,language_identification\nLanguageModel,language_model\nLanguageModelName,language_model_name\nLanguageName,language_name\nLanguageNotSupportedException,language_not_supported_exception\nLanguageOptions,language_options\nLanguageSelectionPolicy,language_selection_policy\nLanguageWithScore,language_with_score\nLanguages,languages\nLargeTimestampGaps,large_timestamp_gaps\nLast,last\nLastAccessTime,last_access_time\nLastAccessedAt,last_accessed_at\nLastAccessedDate,last_accessed_date\nLastAccessedEntity,last_accessed_entity\nLastAccessedRegion,last_accessed_region\nLastAccessedTime,last_accessed_time\nLastActivatedBy,last_activated_by\nLastActivatedTime,last_activated_time\nLastActiveAt,last_active_at\nLastActiveDefinition,last_active_definition\nLastAddress,last_address\nLastAllocation,last_allocation\nLastAnalyzedTime,last_analyzed_time\nLastAssociationExecutionDate,last_association_execution_date\nLastAttemptDate,last_attempt_date\nLastAttemptedDiscoveryTime,last_attempted_discovery_time\nLastAttemptedExecutionTime,last_attempted_execution_time\nLastAuditTimestamp,last_audit_timestamp\nLastAuthenticated,last_authenticated\nLastAuthenticatedEntity,last_authenticated_entity\nLastAuthenticatedRegion,last_authenticated_region\nLastAuthenticatedTime,last_authenticated_time\nLastAuthorizedTime,last_authorized_time\nLastAutoAdjustTime,last_auto_adjust_time\nLastBackupDate,last_backup_date\nLastBackupTime,last_backup_time\nLastBatchTransformJob,last_batch_transform_job\nLastBusinessReport,last_business_report\nLastChangedDate,last_changed_date\nLastCheckTimestamp,last_check_timestamp\nLastCheckedTimestamp,last_checked_timestamp\nLastClaimTime,last_claim_time\nLastClearTime,last_clear_time\nLastCollectedTime,last_collected_time\nLastCommitId,last_commit_id\nLastConnectionTime,last_connection_time\nLastCrawl,last_crawl\nLastCrawlInfo,last_crawl_info\nLastDataReceived,last_data_received\nLastDeactivatedTime,last_deactivated_time\nLastDebugLogDeliveryStatus,last_debug_log_delivery_status\nLastDebugLogDeliveryStatusReason,last_debug_log_delivery_status_reason\nLastDebugLogDeliveryTime,last_debug_log_delivery_time\nLastDecreaseDateTime,last_decrease_date_time\nLastDeliveryChannelDeleteFailedException,last_delivery_channel_delete_failed_exception\nLastDeliveryEvent,last_delivery_event\nLastDeploymentConfig,last_deployment_config\nLastDeploymentInfo,last_deployment_info\nLastDeploymentStatusMessage,last_deployment_status_message\nLastDriftCheckTimestamp,last_drift_check_timestamp\nLastEditedTimestamp,last_edited_timestamp\nLastEngagementEvent,last_engagement_event\nLastError,last_error\nLastErrorCode,last_error_code\nLastErrorMessage,last_error_message\nLastEvaluatedBackupArn,last_evaluated_backup_arn\nLastEvaluatedDate,last_evaluated_date\nLastEvaluatedGlobalTableName,last_evaluated_global_table_name\nLastEvaluatedKey,last_evaluated_key\nLastEvaluatedShardId,last_evaluated_shard_id\nLastEvaluatedStreamArn,last_evaluated_stream_arn\nLastEvaluatedTableName,last_evaluated_table_name\nLastEvaluatedTime,last_evaluated_time\nLastEvaluationState,last_evaluation_state\nLastEvaluationTime,last_evaluation_time\nLastExecutionDate,last_execution_date\nLastExecutionTime,last_execution_time\nLastFailedEvaluationTime,last_failed_evaluation_time\nLastFailedInvocationTime,last_failed_invocation_time\nLastFailureMessage,last_failure_message\nLastFailureTime,last_failure_time\nLastFrameClippingBehavior,last_frame_clipping_behavior\nLastFreshStart,last_fresh_start\nLastGeneratedReportDate,last_generated_report_date\nLastHealthCheckTime,last_health_check_time\nLastHealthCheckTimestamp,last_health_check_timestamp\nLastIncreaseDateTime,last_increase_date_time\nLastIngestStateChange,last_ingest_state_change\nLastInventoryDate,last_inventory_date\nLastKeyGenerationTimestamp,last_key_generation_timestamp\nLastKnownUserConnectionTimestamp,last_known_user_connection_timestamp\nLastLaunchedTime,last_launched_time\nLastMaintenanceApplied,last_maintenance_applied\nLastMessageTimestamp,last_message_timestamp\nLastModificationDate,last_modification_date\nLastModificationTime,last_modification_time\nLastModified,last_modified\nLastModifiedAfter,last_modified_after\nLastModifiedAt,last_modified_at\nLastModifiedBefore,last_modified_before\nLastModifiedBy,last_modified_by\nLastModifiedDate,last_modified_date\nLastModifiedDateCondition,last_modified_date_condition\nLastModifiedDateTime,last_modified_date_time\nLastModifiedOn,last_modified_on\nLastModifiedTime,last_modified_time\nLastModifiedTimeAfter,last_modified_time_after\nLastModifiedTimeBefore,last_modified_time_before\nLastModifiedTimestamp,last_modified_timestamp\nLastModifiedUser,last_modified_user\nLastMonitoringExecutionSummary,last_monitoring_execution_summary\nLastName,last_name\nLastNoRebootInstallOperationTime,last_no_reboot_install_operation_time\nLastObservedAt,last_observed_at\nLastOperationId,last_operation_id\nLastPingDateTime,last_ping_date_time\nLastProcessingResult,last_processing_result\nLastProvisioningRecordId,last_provisioning_record_id\nLastPublishedTime,last_published_time\nLastRecordId,last_record_id\nLastRecorderStatus,last_recorder_status\nLastRecurrenceTime,last_recurrence_time\nLastRefreshDate,last_refresh_date\nLastReplicatedTimestamp,last_replicated_timestamp\nLastReportGenerationExecutionError,last_report_generation_execution_error\nLastReportGenerationTime,last_report_generation_time\nLastReportedAt,last_reported_at\nLastRequestedDateTime,last_requested_date_time\nLastRestoreTime,last_restore_time\nLastRotatedDate,last_rotated_date\nLastRuleModification,last_rule_modification\nLastRun,last_run\nLastRunDetails,last_run_details\nLastRunErrorStatus,last_run_error_status\nLastRunFailureReason,last_run_failure_reason\nLastRunStatus,last_run_status\nLastRunSummary,last_run_summary\nLastRunTime,last_run_time\nLastRuntimeSeconds,last_runtime_seconds\nLastSeen,last_seen\nLastSeenDateTime,last_seen_date_time\nLastSeenTime,last_seen_time\nLastServiceErrorId,last_service_error_id\nLastSoftwareUpdate,last_software_update\nLastStarted,last_started\nLastStateChangeAt,last_state_change_at\nLastStateChangeReason,last_state_change_reason\nLastStatus,last_status\nLastStatusChange,last_status_change\nLastStatusCheckDate,last_status_check_date\nLastStatusMessage,last_status_message\nLastStatusUpdateTime,last_status_update_time\nLastStopped,last_stopped\nLastSuccessfulAllocationTime,last_successful_allocation_time\nLastSuccessfulAssociationExecutionDate,last_successful_association_execution_date\nLastSuccessfulDeliveryTime,last_successful_delivery_time\nLastSuccessfulDiscoveryTime,last_successful_discovery_time\nLastSuccessfulEvaluationTime,last_successful_evaluation_time\nLastSuccessfulExecutionDate,last_successful_execution_date\nLastSuccessfulExecutionTime,last_successful_execution_time\nLastSuccessfulInvocationTime,last_successful_invocation_time\nLastSuccessfulMetadataSyncTime,last_successful_metadata_sync_time\nLastSuccessfulProvisioningRecordId,last_successful_provisioning_record_id\nLastSuccessfulSyncProvisioningArtifactId,last_successful_sync_provisioning_artifact_id\nLastSuccessfulSyncTime,last_successful_sync_time\nLastSuccessfullyAppliedConfigurations,last_successfully_applied_configurations\nLastSuccessfullyAppliedConfigurationsVersion,last_successfully_applied_configurations_version\nLastSuggestionsBuildTime,last_suggestions_build_time\nLastSync,last_sync\nLastSyncCount,last_sync_count\nLastSyncStatus,last_sync_status\nLastSyncStatusMessage,last_sync_status_message\nLastSyncTime,last_sync_time\nLastTieringOperationStatus,last_tiering_operation_status\nLastTieringOperationStatusDetail,last_tiering_operation_status_detail\nLastTieringProgress,last_tiering_progress\nLastTieringStartTime,last_tiering_start_time\nLastUpdate,last_update\nLastUpdateAssociationDate,last_update_association_date\nLastUpdateCompletedTime,last_update_completed_time\nLastUpdateDate,last_update_date\nLastUpdateDateTime,last_update_date_time\nLastUpdateRequestedTime,last_update_requested_time\nLastUpdateStatus,last_update_status\nLastUpdateStatusReason,last_update_status_reason\nLastUpdateStatusReasonCode,last_update_status_reason_code\nLastUpdateTime,last_update_time\nLastUpdateTimestamp,last_update_timestamp\nLastUpdateToPayPerRequestDateTime,last_update_to_pay_per_request_date_time\nLastUpdated,last_updated\nLastUpdatedAt,last_updated_at\nLastUpdatedBy,last_updated_by\nLastUpdatedDate,last_updated_date\nLastUpdatedDateTime,last_updated_date_time\nLastUpdatedTime,last_updated_time\nLastUpdatedTimeStamp,last_updated_time_stamp\nLastUpdatedTimestamp,last_updated_timestamp\nLastUplinkReceivedAt,last_uplink_received_at\nLastUploaderStatus,last_uploader_status\nLastUsedDate,last_used_date\nLastUserActivityTimestamp,last_user_activity_timestamp\nLastVPCAssociation,last_vpc_association\nLastWritten,last_written\nLat,lat\nLatLonOptions,lat_lon_options\nLateDataRule,late_data_rule\nLateDataRuleConfiguration,late_data_rule_configuration\nLatency,latency\nLatencyInMilliseconds,latency_in_milliseconds\nLatencyInMs,latency_in_ms\nLatencyMs,latency_ms\nLatencyOther,latency_other\nLatencyRead,latency_read\nLatencyWrite,latency_write\nLatest,latest\nLatestAlternateSoftware,latest_alternate_software\nLatestCloudWatchLogsDeliveryError,latest_cloud_watch_logs_delivery_error\nLatestCloudWatchLogsDeliveryTime,latest_cloud_watch_logs_delivery_time\nLatestDeliveryAttemptSucceeded,latest_delivery_attempt_succeeded\nLatestDeliveryAttemptTime,latest_delivery_attempt_time\nLatestDeliveryError,latest_delivery_error\nLatestDeliveryTime,latest_delivery_time\nLatestDeviceJob,latest_device_job\nLatestDigestDeliveryError,latest_digest_delivery_error\nLatestDigestDeliveryTime,latest_digest_delivery_time\nLatestFlywheelIteration,latest_flywheel_iteration\nLatestHeartbeat,latest_heartbeat\nLatestHeartbeatAfter,latest_heartbeat_after\nLatestInference,latest_inference\nLatestInferenceResult,latest_inference_result\nLatestIngestionAttemptEventID,latest_ingestion_attempt_event_id\nLatestIngestionAttemptTime,latest_ingestion_attempt_time\nLatestIngestionErrorCode,latest_ingestion_error_code\nLatestIngestionSuccessEventID,latest_ingestion_success_event_id\nLatestIngestionSuccessTime,latest_ingestion_success_time\nLatestLensVersion,latest_lens_version\nLatestMatchingVersion,latest_matching_version\nLatestMetadataSyncStatus,latest_metadata_sync_status\nLatestMetadataSyncStatusMessage,latest_metadata_sync_status_message\nLatestNotificationAttemptSucceeded,latest_notification_attempt_succeeded\nLatestNotificationAttemptTime,latest_notification_attempt_time\nLatestNotificationError,latest_notification_error\nLatestNotificationTime,latest_notification_time\nLatestOnly,latest_only\nLatestProfileVersion,latest_profile_version\nLatestPublicVersion,latest_public_version\nLatestRestorableDateTime,latest_restorable_date_time\nLatestRestorableTime,latest_restorable_time\nLatestRevision,latest_revision\nLatestSampleTime,latest_sample_time\nLatestScheduledRetrainingAvailableDataInDays,latest_scheduled_retraining_available_data_in_days\nLatestScheduledRetrainingFailedReason,latest_scheduled_retraining_failed_reason\nLatestScheduledRetrainingModelVersion,latest_scheduled_retraining_model_version\nLatestScheduledRetrainingStartTime,latest_scheduled_retraining_start_time\nLatestScheduledRetrainingStatus,latest_scheduled_retraining_status\nLatestSchemaVersion,latest_schema_version\nLatestSoftware,latest_software\nLatestStreamArn,latest_stream_arn\nLatestStreamLabel,latest_stream_label\nLatestTime,latest_time\nLatestUpdateAttemptAt,latest_update_attempt_at\nLatestUpdateAttemptAuxiliaryDataLocation,latest_update_attempt_auxiliary_data_location\nLatestUpdateAttemptStatus,latest_update_attempt_status\nLatestUsageTimestamp,latest_usage_timestamp\nLatestVersion,latest_version\nLatestVersionArn,latest_version_arn\nLatestVersionCreatedAt,latest_version_created_at\nLatestVersionId,latest_version_id\nLatestVersionMetadata,latest_version_metadata\nLatestVersionName,latest_version_name\nLatestVersionNumber,latest_version_number\nLatestVersionSize,latest_version_size\nLatestVersionStatus,latest_version_status\nLatitude,latitude\nLaunch,launch\nLaunchAction,launch_action\nLaunchActionParameter,launch_action_parameter\nLaunchActionRun,launch_action_run\nLaunchActionsRequestFilters,launch_actions_request_filters\nLaunchActionsStatus,launch_actions_status\nLaunchAppRequest,launch_app_request\nLaunchCommands,launch_commands\nLaunchConfig,launch_config\nLaunchConfiguration,launch_configuration\nLaunchConfigurationARN,launch_configuration_arn\nLaunchConfigurationName,launch_configuration_name\nLaunchConfigurationNameType,launch_configuration_name_type\nLaunchConfigurationNames,launch_configuration_names\nLaunchConfigurationNamesType,launch_configuration_names_type\nLaunchConfigurationTemplate,launch_configuration_template\nLaunchConfigurations,launch_configurations\nLaunchConfigurationsType,launch_configurations_type\nLaunchDate,launch_date\nLaunchDetails,launch_details\nLaunchExecution,launch_execution\nLaunchGroup,launch_group\nLaunchGroupConfig,launch_group_config\nLaunchOverrides,launch_overrides\nLaunchParameters,launch_parameters\nLaunchPath,launch_path\nLaunchPathSummaries,launch_path_summaries\nLaunchPathSummary,launch_path_summary\nLaunchPaths,launch_paths\nLaunchPermission,launch_permission\nLaunchPermissionConfiguration,launch_permission_configuration\nLaunchPermissionModifications,launch_permission_modifications\nLaunchPermissions,launch_permissions\nLaunchProfile,launch_profile\nLaunchProfileInitialization,launch_profile_initialization\nLaunchProfileInitializationActiveDirectory,launch_profile_initialization_active_directory\nLaunchProfileInitializationScript,launch_profile_initialization_script\nLaunchProfileMembership,launch_profile_membership\nLaunchRoleArn,launch_role_arn\nLaunchSpecification,launch_specification\nLaunchSpecifications,launch_specifications\nLaunchTemplate,launch_template\nLaunchTemplateAndOverrides,launch_template_and_overrides\nLaunchTemplateAndOverridesResponse,launch_template_and_overrides_response\nLaunchTemplateBlockDeviceMapping,launch_template_block_device_mapping\nLaunchTemplateBlockDeviceMappingRequest,launch_template_block_device_mapping_request\nLaunchTemplateCapacityReservationSpecificationRequest,launch_template_capacity_reservation_specification_request\nLaunchTemplateCapacityReservationSpecificationResponse,launch_template_capacity_reservation_specification_response\nLaunchTemplateConfig,launch_template_config\nLaunchTemplateConfigs,launch_template_configs\nLaunchTemplateConfiguration,launch_template_configuration\nLaunchTemplateCpuOptions,launch_template_cpu_options\nLaunchTemplateCpuOptionsRequest,launch_template_cpu_options_request\nLaunchTemplateData,launch_template_data\nLaunchTemplateDiskConf,launch_template_disk_conf\nLaunchTemplateEbsBlockDevice,launch_template_ebs_block_device\nLaunchTemplateEbsBlockDeviceRequest,launch_template_ebs_block_device_request\nLaunchTemplateElasticInferenceAccelerator,launch_template_elastic_inference_accelerator\nLaunchTemplateElasticInferenceAcceleratorResponse,launch_template_elastic_inference_accelerator_response\nLaunchTemplateEnclaveOptions,launch_template_enclave_options\nLaunchTemplateEnclaveOptionsRequest,launch_template_enclave_options_request\nLaunchTemplateHibernationOptions,launch_template_hibernation_options\nLaunchTemplateHibernationOptionsRequest,launch_template_hibernation_options_request\nLaunchTemplateIamInstanceProfileSpecification,launch_template_iam_instance_profile_specification\nLaunchTemplateIamInstanceProfileSpecificationRequest,launch_template_iam_instance_profile_specification_request\nLaunchTemplateId,launch_template_id\nLaunchTemplateIds,launch_template_ids\nLaunchTemplateInstanceMaintenanceOptions,launch_template_instance_maintenance_options\nLaunchTemplateInstanceMaintenanceOptionsRequest,launch_template_instance_maintenance_options_request\nLaunchTemplateInstanceMarketOptions,launch_template_instance_market_options\nLaunchTemplateInstanceMarketOptionsRequest,launch_template_instance_market_options_request\nLaunchTemplateInstanceMetadataOptions,launch_template_instance_metadata_options\nLaunchTemplateInstanceMetadataOptionsRequest,launch_template_instance_metadata_options_request\nLaunchTemplateInstanceNetworkInterfaceSpecification,launch_template_instance_network_interface_specification\nLaunchTemplateInstanceNetworkInterfaceSpecificationRequest,launch_template_instance_network_interface_specification_request\nLaunchTemplateLicenseConfiguration,launch_template_license_configuration\nLaunchTemplateLicenseConfigurationRequest,launch_template_license_configuration_request\nLaunchTemplateName,launch_template_name\nLaunchTemplateNames,launch_template_names\nLaunchTemplateOverrides,launch_template_overrides\nLaunchTemplatePlacement,launch_template_placement\nLaunchTemplatePlacementRequest,launch_template_placement_request\nLaunchTemplatePrivateDnsNameOptions,launch_template_private_dns_name_options\nLaunchTemplatePrivateDnsNameOptionsRequest,launch_template_private_dns_name_options_request\nLaunchTemplateSpecification,launch_template_specification\nLaunchTemplateSpotMarketOptions,launch_template_spot_market_options\nLaunchTemplateSpotMarketOptionsRequest,launch_template_spot_market_options_request\nLaunchTemplateTagSpecification,launch_template_tag_specification\nLaunchTemplateTagSpecificationRequest,launch_template_tag_specification_request\nLaunchTemplateVersion,launch_template_version\nLaunchTemplateVersions,launch_template_versions\nLaunchTemplates,launch_templates\nLaunchTemplatesMonitoring,launch_templates_monitoring\nLaunchTemplatesMonitoringRequest,launch_templates_monitoring_request\nLaunchTime,launch_time\nLaunchType,launch_type\nLaunchedAt,launched_at\nLaunchedAvailabilityZone,launched_availability_zone\nLaunchedInstance,launched_instance\nLayer,layer\nLayerAlreadyExistsException,layer_already_exists_exception\nLayerArn,layer_arn\nLayerFailure,layer_failure\nLayerId,layer_id\nLayerIds,layer_ids\nLayerInaccessibleException,layer_inaccessible_exception\nLayerName,layer_name\nLayerPartTooSmallException,layer_part_too_small_exception\nLayerVersionArn,layer_version_arn\nLayerVersionContentInput,layer_version_content_input\nLayerVersionContentOutput,layer_version_content_output\nLayerVersions,layer_versions\nLayerVersionsListItem,layer_versions_list_item\nLayers,layers\nLayersCount,layers_count\nLayersListItem,layers_list_item\nLayersNotFoundException,layers_not_found_exception\nLayout,layout\nLayoutConfiguration,layout_configuration\nLayoutSections,layout_sections\nLayoutSummary,layout_summary\nLayouts,layouts\nLbCookieStickinessPolicies,lb_cookie_stickiness_policies\nLcmOperationInfo,lcm_operation_info\nLdPreloadValue,ld_preload_value\nLdapServerMetadata,ldap_server_metadata\nLdapServerMetadataInput,ldap_server_metadata_input\nLdapServerMetadataOutput,ldap_server_metadata_output\nLdifContent,ldif_content\nLeaseExpirationTime,lease_expiration_time\nLeaseId,lease_id\nLedgerEncryptionDescription,ledger_encryption_description\nLedgerName,ledger_name\nLedgerSummary,ledger_summary\nLedgers,ledgers\nLeft,left\nLeftJoinKeyProperties,left_join_key_properties\nLeftOffset,left_offset\nLeftOperand,left_operand\nLeg,leg\nLegGeometry,leg_geometry\nLegalHold,legal_hold\nLegalHoldArn,legal_hold_arn\nLegalHoldId,legal_hold_id\nLegalHolds,legal_holds\nLegend,legend\nLegendOptions,legend_options\nLegs,legs\nLendingDetection,lending_detection\nLendingDocument,lending_document\nLendingField,lending_field\nLendingFields,lending_fields\nLendingResult,lending_result\nLendingSummary,lending_summary\nLength,length\nLens,lens\nLensAlias,lens_alias\nLensAliases,lens_aliases\nLensArn,lens_arn\nLensJSON,lens_json\nLensMetric,lens_metric\nLensName,lens_name\nLensNamePrefix,lens_name_prefix\nLensNotes,lens_notes\nLensReview,lens_review\nLensReviewReport,lens_review_report\nLensReviewSummaries,lens_review_summaries\nLensReviewSummary,lens_review_summary\nLensShareSummaries,lens_share_summaries\nLensShareSummary,lens_share_summary\nLensStatus,lens_status\nLensSummaries,lens_summaries\nLensSummary,lens_summary\nLensType,lens_type\nLensUpgradeSummary,lens_upgrade_summary\nLensVersion,lens_version\nLenses,lenses\nLensesAppliedCount,lenses_applied_count\nLessThan,less_than\nLessThanOrEqual,less_than_or_equal\nLessThanOrEquals,less_than_or_equals\nLevel,level\nLevelFive,level_five\nLevelFour,level_four\nLevelId,level_id\nLevelOne,level_one\nLevelThree,level_three\nLevelTwo,level_two\nLex,lex\nLexBot,lex_bot\nLexBotAliasArn,lex_bot_alias_arn\nLexBotConfig,lex_bot_config\nLexBots,lex_bots\nLexConfiguration,lex_configuration\nLexRegion,lex_region\nLexTranscriptFilter,lex_transcript_filter\nLexV2Bot,lex_v2_bot\nLexVersion,lex_version\nLexemesCount,lexemes_count\nLexicon,lexicon\nLexiconArn,lexicon_arn\nLexiconAttributes,lexicon_attributes\nLexiconDescription,lexicon_description\nLexiconNames,lexicon_names\nLexiconNotFoundException,lexicon_not_found_exception\nLexiconSizeExceededException,lexicon_size_exceeded_exception\nLexicons,lexicons\nLfeControl,lfe_control\nLfeFilter,lfe_filter\nLibraryPath,library_path\nLicense,license\nLicenseAcquisitionUrl,license_acquisition_url\nLicenseArn,license_arn\nLicenseArns,license_arns\nLicenseBody,license_body\nLicenseConfiguration,license_configuration\nLicenseConfigurationArn,license_configuration_arn\nLicenseConfigurationArns,license_configuration_arns\nLicenseConfigurationAssociation,license_configuration_association\nLicenseConfigurationAssociations,license_configuration_associations\nLicenseConfigurationId,license_configuration_id\nLicenseConfigurationRequest,license_configuration_request\nLicenseConfigurationStatus,license_configuration_status\nLicenseConfigurationUsage,license_configuration_usage\nLicenseConfigurationUsageList,license_configuration_usage_list\nLicenseConfigurations,license_configurations\nLicenseConsumptionToken,license_consumption_token\nLicenseConversionContext,license_conversion_context\nLicenseConversionTask,license_conversion_task\nLicenseConversionTaskId,license_conversion_task_id\nLicenseConversionTasks,license_conversion_tasks\nLicenseConversionTime,license_conversion_time\nLicenseCount,license_count\nLicenseCountHardLimit,license_count_hard_limit\nLicenseCountingType,license_counting_type\nLicenseInfo,license_info\nLicenseManagerReportGeneratorArn,license_manager_report_generator_arn\nLicenseManagerResourceShareArn,license_manager_resource_share_arn\nLicenseMetadata,license_metadata\nLicenseModel,license_model\nLicenseName,license_name\nLicenseOperationFailure,license_operation_failure\nLicenseOperationFailureList,license_operation_failure_list\nLicenseRecommendation,license_recommendation\nLicenseRecommendationFilter,license_recommendation_filter\nLicenseRecommendationOption,license_recommendation_option\nLicenseRules,license_rules\nLicenseServiceConfiguration,license_service_configuration\nLicenseSet,license_set\nLicenseSpecification,license_specification\nLicenseSpecifications,license_specifications\nLicenseType,license_type\nLicenseUrl,license_url\nLicenseUsage,license_usage\nLicenseUsageException,license_usage_exception\nLicenses,licenses\nLicensing,licensing\nLifeCycle,life_cycle\nLifeCycleLastCutover,life_cycle_last_cutover\nLifeCycleLastCutoverFinalized,life_cycle_last_cutover_finalized\nLifeCycleLastCutoverInitiated,life_cycle_last_cutover_initiated\nLifeCycleLastCutoverReverted,life_cycle_last_cutover_reverted\nLifeCycleLastLaunch,life_cycle_last_launch\nLifeCycleLastLaunchInitiated,life_cycle_last_launch_initiated\nLifeCycleLastTest,life_cycle_last_test\nLifeCycleLastTestFinalized,life_cycle_last_test_finalized\nLifeCycleLastTestInitiated,life_cycle_last_test_initiated\nLifeCycleLastTestReverted,life_cycle_last_test_reverted\nLifeCycleState,life_cycle_state\nLifeCycleStatus,life_cycle_status\nLifeCycleStatusFilter,life_cycle_status_filter\nLifecycle,lifecycle\nLifecycleActionResult,lifecycle_action_result\nLifecycleActionToken,lifecycle_action_token\nLifecycleConfigArn,lifecycle_config_arn\nLifecycleConfigArns,lifecycle_config_arns\nLifecycleConfigName,lifecycle_config_name\nLifecycleConfiguration,lifecycle_configuration\nLifecycleConfigurationDescription,lifecycle_configuration_description\nLifecycleEvent,lifecycle_event\nLifecycleEventAlreadyCompletedException,lifecycle_event_already_completed_exception\nLifecycleEventConfiguration,lifecycle_event_configuration\nLifecycleExpiration,lifecycle_expiration\nLifecycleHook,lifecycle_hook\nLifecycleHookLimitExceededException,lifecycle_hook_limit_exceeded_exception\nLifecycleHookName,lifecycle_hook_name\nLifecycleHookNames,lifecycle_hook_names\nLifecycleHookSpecification,lifecycle_hook_specification\nLifecycleHookSpecificationList,lifecycle_hook_specification_list\nLifecycleHookTypes,lifecycle_hook_types\nLifecycleHooks,lifecycle_hooks\nLifecyclePolicies,lifecycle_policies\nLifecyclePolicy,lifecycle_policy\nLifecyclePolicyNotFoundException,lifecycle_policy_not_found_exception\nLifecyclePolicyPreviewFilter,lifecycle_policy_preview_filter\nLifecyclePolicyPreviewInProgressException,lifecycle_policy_preview_in_progress_exception\nLifecyclePolicyPreviewNotFoundException,lifecycle_policy_preview_not_found_exception\nLifecyclePolicyPreviewResult,lifecycle_policy_preview_result\nLifecyclePolicyPreviewSummary,lifecycle_policy_preview_summary\nLifecyclePolicyRuleAction,lifecycle_policy_rule_action\nLifecyclePolicySummary,lifecycle_policy_summary\nLifecyclePolicyText,lifecycle_policy_text\nLifecycleRule,lifecycle_rule\nLifecycleRuleAndOperator,lifecycle_rule_and_operator\nLifecycleRuleFilter,lifecycle_rule_filter\nLifecycleState,lifecycle_state\nLifecycleTransition,lifecycle_transition\nLifecycleTransitionReason,lifecycle_transition_reason\nLifetimeInSeconds,lifetime_in_seconds\nLightsailDistribution,lightsail_distribution\nLimit,limit\nLimitCode,limit_code\nLimitExceeded,limit_exceeded\nLimitExceededException,limit_exceeded_exception\nLimitExceededFault,limit_exceeded_fault\nLimitName,limit_name\nLimitPrice,limit_price\nLimitType,limit_type\nLimitValue,limit_value\nLimitValues,limit_values\nLimitation,limitation\nLimitations,limitations\nLimits,limits\nLimitsByRole,limits_by_role\nLimitsExceeded,limits_exceeded\nLimitsExceededException,limits_exceeded_exception\nLine,line\nLineChartAggregatedFieldWells,line_chart_aggregated_field_wells\nLineChartConfiguration,line_chart_configuration\nLineChartDefaultSeriesSettings,line_chart_default_series_settings\nLineChartFieldWells,line_chart_field_wells\nLineChartLineStyleSettings,line_chart_line_style_settings\nLineChartMarkerStyleSettings,line_chart_marker_style_settings\nLineChartSeriesSettings,line_chart_series_settings\nLineChartSortConfiguration,line_chart_sort_configuration\nLineChartVisual,line_chart_visual\nLineDataLabels,line_data_labels\nLineInterpolation,line_interpolation\nLineItem,line_item\nLineItemAssetInformation,line_item_asset_information\nLineItemCountsByStatus,line_item_counts_by_status\nLineItemExpenseFields,line_item_expense_fields\nLineItemFields,line_item_fields\nLineItemFilter,line_item_filter\nLineItemFilters,line_item_filters\nLineItemGroup,line_item_group\nLineItemGroupIndex,line_item_group_index\nLineItemGroups,line_item_groups\nLineItemId,line_item_id\nLineItemRequest,line_item_request\nLineItems,line_items\nLineNumber,line_number\nLineRange,line_range\nLineRanges,line_ranges\nLineSeriesAxisDisplayOptions,line_series_axis_display_options\nLineString,line_string\nLineStyle,line_style\nLineStyleSettings,line_style_settings\nLineTime,line_time\nLineValues,line_values\nLineVisibility,line_visibility\nLineWidth,line_width\nLineage,lineage\nLineageConfiguration,lineage_configuration\nLineageGroupArn,lineage_group_arn\nLineageGroupName,lineage_group_name\nLineageGroupSummaries,lineage_group_summaries\nLineageGroupSummary,lineage_group_summary\nLineageObject,lineage_object\nLineageType,lineage_type\nLineageTypes,lineage_types\nLinear,linear\nLinearStepSize,linear_step_size\nLink,link\nLinkArn,link_arn\nLinkAssociation,link_association\nLinkAssociationState,link_association_state\nLinkAssociations,link_associations\nLinkAttributeAction,link_attribute_action\nLinkAttributeUpdate,link_attribute_update\nLinkConfiguration,link_configuration\nLinkId,link_id\nLinkIds,link_ids\nLinkName,link_name\nLinkNameAlreadyInUseException,link_name_already_in_use_exception\nLinkSharingConfiguration,link_sharing_configuration\nLinkSpecifiers,link_specifiers\nLinkToDataSetColumn,link_to_data_set_column\nLinkedAccount,linked_account\nLinkedAccountIds,linked_account_ids\nLinkedAccountName,linked_account_name\nLinkedAccounts,linked_accounts\nLinkedService,linked_service\nLinks,links\nLinuxParameters,linux_parameters\nLinuxSubscriptionsDiscovery,linux_subscriptions_discovery\nLinuxSubscriptionsDiscoverySettings,linux_subscriptions_discovery_settings\nList,list\nListAPIKeysRequest,list_api_keys_request\nListAPIKeysResponse,list_api_keys_response\nListAWSDefaultServiceQuotasRequest,list_aws_default_service_quotas_request\nListAWSDefaultServiceQuotasResponse,list_aws_default_service_quotas_response\nListAWSServiceAccessForOrganizationRequest,list_aws_service_access_for_organization_request\nListAWSServiceAccessForOrganizationResponse,list_aws_service_access_for_organization_response\nListAcceleratorsRequest,list_accelerators_request\nListAcceleratorsResponse,list_accelerators_response\nListAcceptedPortfolioSharesInput,list_accepted_portfolio_shares_input\nListAcceptedPortfolioSharesOutput,list_accepted_portfolio_shares_output\nListAccessControlConfigurationsRequest,list_access_control_configurations_request\nListAccessControlConfigurationsResponse,list_access_control_configurations_response\nListAccessControlRulesRequest,list_access_control_rules_request\nListAccessControlRulesResponse,list_access_control_rules_response\nListAccessKeysRequest,list_access_keys_request\nListAccessKeysResponse,list_access_keys_response\nListAccessLogSubscriptionsRequest,list_access_log_subscriptions_request\nListAccessLogSubscriptionsResponse,list_access_log_subscriptions_response\nListAccessPointsForObjectLambdaRequest,list_access_points_for_object_lambda_request\nListAccessPointsForObjectLambdaResult,list_access_points_for_object_lambda_result\nListAccessPointsRequest,list_access_points_request\nListAccessPointsResult,list_access_points_result\nListAccessPoliciesRequest,list_access_policies_request\nListAccessPoliciesResponse,list_access_policies_response\nListAccessPreviewFindingsRequest,list_access_preview_findings_request\nListAccessPreviewFindingsResponse,list_access_preview_findings_response\nListAccessPreviewsRequest,list_access_previews_request\nListAccessPreviewsResponse,list_access_previews_response\nListAccessTokensRequest,list_access_tokens_request\nListAccessTokensResponse,list_access_tokens_response\nListAccessesRequest,list_accesses_request\nListAccessesResponse,list_accesses_response\nListAccessorsInput,list_accessors_input\nListAccessorsOutput,list_accessors_output\nListAccountAliasesRequest,list_account_aliases_request\nListAccountAliasesResponse,list_account_aliases_response\nListAccountAssignmentCreationStatusRequest,list_account_assignment_creation_status_request\nListAccountAssignmentCreationStatusResponse,list_account_assignment_creation_status_response\nListAccountAssignmentDeletionStatusRequest,list_account_assignment_deletion_status_request\nListAccountAssignmentDeletionStatusResponse,list_account_assignment_deletion_status_response\nListAccountAssignmentsRequest,list_account_assignments_request\nListAccountAssignmentsResponse,list_account_assignments_response\nListAccountAssociationsFilter,list_account_associations_filter\nListAccountAssociationsInput,list_account_associations_input\nListAccountAssociationsOutput,list_account_associations_output\nListAccountIntegrationsRequest,list_account_integrations_request\nListAccountIntegrationsResponse,list_account_integrations_response\nListAccountPermissionsRequest,list_account_permissions_request\nListAccountPermissionsResponse,list_account_permissions_response\nListAccountRolesRequest,list_account_roles_request\nListAccountRolesResponse,list_account_roles_response\nListAccountSettingsRequest,list_account_settings_request\nListAccountSettingsResponse,list_account_settings_response\nListAccountsForParentRequest,list_accounts_for_parent_request\nListAccountsForParentResponse,list_accounts_for_parent_response\nListAccountsForProvisionedPermissionSetRequest,list_accounts_for_provisioned_permission_set_request\nListAccountsForProvisionedPermissionSetResponse,list_accounts_for_provisioned_permission_set_response\nListAccountsRequest,list_accounts_request\nListAccountsResponse,list_accounts_response\nListActionExecutionsInput,list_action_executions_input\nListActionExecutionsOutput,list_action_executions_output\nListActionTypesInput,list_action_types_input\nListActionTypesOutput,list_action_types_output\nListActionsRequest,list_actions_request\nListActionsResponse,list_actions_response\nListActivatedRulesInRuleGroupRequest,list_activated_rules_in_rule_group_request\nListActivatedRulesInRuleGroupResponse,list_activated_rules_in_rule_group_response\nListActiveViolationsRequest,list_active_violations_request\nListActiveViolationsResponse,list_active_violations_response\nListActivitiesInput,list_activities_input\nListActivitiesOutput,list_activities_output\nListActivityTypesInput,list_activity_types_input\nListAddonsRequest,list_addons_request\nListAddonsResponse,list_addons_response\nListAdminAccountsForOrganizationRequest,list_admin_accounts_for_organization_request\nListAdminAccountsForOrganizationResponse,list_admin_accounts_for_organization_response\nListAdminsManagingAccountRequest,list_admins_managing_account_request\nListAdminsManagingAccountResponse,list_admins_managing_account_response\nListAgentStatusRequest,list_agent_status_request\nListAgentStatusResponse,list_agent_status_response\nListAgentsRequest,list_agents_request\nListAgentsResponse,list_agents_response\nListAggregateDiscoveredResourcesRequest,list_aggregate_discovered_resources_request\nListAggregateDiscoveredResourcesResponse,list_aggregate_discovered_resources_response\nListAggregatedUtterancesRequest,list_aggregated_utterances_request\nListAggregatedUtterancesResponse,list_aggregated_utterances_response\nListAgreementsRequest,list_agreements_request\nListAgreementsResponse,list_agreements_response\nListAlarmModelVersionsRequest,list_alarm_model_versions_request\nListAlarmModelVersionsResponse,list_alarm_model_versions_response\nListAlarmModelsRequest,list_alarm_models_request\nListAlarmModelsResponse,list_alarm_models_response\nListAlarmRecommendationsRequest,list_alarm_recommendations_request\nListAlarmRecommendationsResponse,list_alarm_recommendations_response\nListAlarmsRequest,list_alarms_request\nListAlarmsResponse,list_alarms_response\nListAlertsRequest,list_alerts_request\nListAlertsResponse,list_alerts_response\nListAlgorithmsInput,list_algorithms_input\nListAlgorithmsOutput,list_algorithms_output\nListAliasesInput,list_aliases_input\nListAliasesOutput,list_aliases_output\nListAliasesRequest,list_aliases_request\nListAliasesResponse,list_aliases_response\nListAllowListsRequest,list_allow_lists_request\nListAllowListsResponse,list_allow_lists_response\nListAllowedNodeTypeModificationsMessage,list_allowed_node_type_modifications_message\nListAllowedNodeTypeUpdatesRequest,list_allowed_node_type_updates_request\nListAllowedNodeTypeUpdatesResponse,list_allowed_node_type_updates_response\nListAnalysesRequest,list_analyses_request\nListAnalysesResponse,list_analyses_response\nListAnalysisTemplatesInput,list_analysis_templates_input\nListAnalysisTemplatesOutput,list_analysis_templates_output\nListAnalyzedResourcesRequest,list_analyzed_resources_request\nListAnalyzedResourcesResponse,list_analyzed_resources_response\nListAnalyzersRequest,list_analyzers_request\nListAnalyzersResponse,list_analyzers_response\nListAnnotationImportJobsFilter,list_annotation_import_jobs_filter\nListAnnotationImportJobsRequest,list_annotation_import_jobs_request\nListAnnotationImportJobsResponse,list_annotation_import_jobs_response\nListAnnotationStoreVersionsFilter,list_annotation_store_versions_filter\nListAnnotationStoreVersionsRequest,list_annotation_store_versions_request\nListAnnotationStoreVersionsResponse,list_annotation_store_versions_response\nListAnnotationStoresFilter,list_annotation_stores_filter\nListAnnotationStoresRequest,list_annotation_stores_request\nListAnnotationStoresResponse,list_annotation_stores_response\nListAnomaliesForInsightFilters,list_anomalies_for_insight_filters\nListAnomaliesForInsightRequest,list_anomalies_for_insight_request\nListAnomaliesForInsightResponse,list_anomalies_for_insight_response\nListAnomalousLogGroupsRequest,list_anomalous_log_groups_request\nListAnomalousLogGroupsResponse,list_anomalous_log_groups_response\nListAnomalyDetectorsRequest,list_anomaly_detectors_request\nListAnomalyDetectorsResponse,list_anomaly_detectors_response\nListAnomalyGroupRelatedMetricsRequest,list_anomaly_group_related_metrics_request\nListAnomalyGroupRelatedMetricsResponse,list_anomaly_group_related_metrics_response\nListAnomalyGroupSummariesRequest,list_anomaly_group_summaries_request\nListAnomalyGroupSummariesResponse,list_anomaly_group_summaries_response\nListAnomalyGroupTimeSeriesRequest,list_anomaly_group_time_series_request\nListAnomalyGroupTimeSeriesResponse,list_anomaly_group_time_series_response\nListAnswersInput,list_answers_input\nListAnswersOutput,list_answers_output\nListApiDestinationsRequest,list_api_destinations_request\nListApiDestinationsResponse,list_api_destinations_response\nListApiKeysRequest,list_api_keys_request\nListApiKeysResponse,list_api_keys_response\nListAppAssessmentComplianceDriftsRequest,list_app_assessment_compliance_drifts_request\nListAppAssessmentComplianceDriftsResponse,list_app_assessment_compliance_drifts_response\nListAppAssessmentsRequest,list_app_assessments_request\nListAppAssessmentsResponse,list_app_assessments_response\nListAppAuthorizationsRequest,list_app_authorizations_request\nListAppAuthorizationsResponse,list_app_authorizations_response\nListAppBundlesRequest,list_app_bundles_request\nListAppBundlesResponse,list_app_bundles_response\nListAppComponentCompliancesRequest,list_app_component_compliances_request\nListAppComponentCompliancesResponse,list_app_component_compliances_response\nListAppComponentRecommendationsRequest,list_app_component_recommendations_request\nListAppComponentRecommendationsResponse,list_app_component_recommendations_response\nListAppImageConfigsRequest,list_app_image_configs_request\nListAppImageConfigsResponse,list_app_image_configs_response\nListAppInputSourcesRequest,list_app_input_sources_request\nListAppInputSourcesResponse,list_app_input_sources_response\nListAppInstanceAdminsRequest,list_app_instance_admins_request\nListAppInstanceAdminsResponse,list_app_instance_admins_response\nListAppInstanceBotsRequest,list_app_instance_bots_request\nListAppInstanceBotsResponse,list_app_instance_bots_response\nListAppInstanceUserEndpointsRequest,list_app_instance_user_endpoints_request\nListAppInstanceUserEndpointsResponse,list_app_instance_user_endpoints_response\nListAppInstanceUsersRequest,list_app_instance_users_request\nListAppInstanceUsersResponse,list_app_instance_users_response\nListAppInstancesRequest,list_app_instances_request\nListAppInstancesResponse,list_app_instances_response\nListAppMonitorsRequest,list_app_monitors_request\nListAppMonitorsResponse,list_app_monitors_response\nListAppVersionAppComponentsRequest,list_app_version_app_components_request\nListAppVersionAppComponentsResponse,list_app_version_app_components_response\nListAppVersionResourceMappingsRequest,list_app_version_resource_mappings_request\nListAppVersionResourceMappingsResponse,list_app_version_resource_mappings_response\nListAppVersionResourcesRequest,list_app_version_resources_request\nListAppVersionResourcesResponse,list_app_version_resources_response\nListAppVersionsRequest,list_app_versions_request\nListAppVersionsResponse,list_app_versions_response\nListApplicationComponentsRequest,list_application_components_request\nListApplicationComponentsResponse,list_application_components_response\nListApplicationDPUSizesInput,list_application_dpu_sizes_input\nListApplicationDPUSizesOutput,list_application_dpu_sizes_output\nListApplicationDependenciesRequest,list_application_dependencies_request\nListApplicationDependenciesResponse,list_application_dependencies_response\nListApplicationInstanceDependenciesRequest,list_application_instance_dependencies_request\nListApplicationInstanceDependenciesResponse,list_application_instance_dependencies_response\nListApplicationInstanceNodeInstancesRequest,list_application_instance_node_instances_request\nListApplicationInstanceNodeInstancesResponse,list_application_instance_node_instances_response\nListApplicationInstancesRequest,list_application_instances_request\nListApplicationInstancesResponse,list_application_instances_response\nListApplicationRevisionsInput,list_application_revisions_input\nListApplicationRevisionsOutput,list_application_revisions_output\nListApplicationSnapshotsRequest,list_application_snapshots_request\nListApplicationSnapshotsResponse,list_application_snapshots_response\nListApplicationStatesRequest,list_application_states_request\nListApplicationStatesResult,list_application_states_result\nListApplicationVersionsRequest,list_application_versions_request\nListApplicationVersionsResponse,list_application_versions_response\nListApplicationsInput,list_applications_input\nListApplicationsOutput,list_applications_output\nListApplicationsRequest,list_applications_request\nListApplicationsRequestFilters,list_applications_request_filters\nListApplicationsResponse,list_applications_response\nListAppliedSchemaArnsRequest,list_applied_schema_arns_request\nListAppliedSchemaArnsResponse,list_applied_schema_arns_response\nListApprovalRuleTemplatesInput,list_approval_rule_templates_input\nListApprovalRuleTemplatesOutput,list_approval_rule_templates_output\nListApprovedOriginsRequest,list_approved_origins_request\nListApprovedOriginsResponse,list_approved_origins_response\nListAppsInput,list_apps_input\nListAppsListsRequest,list_apps_lists_request\nListAppsListsResponse,list_apps_lists_response\nListAppsOutput,list_apps_output\nListAppsRequest,list_apps_request\nListAppsResponse,list_apps_response\nListAppsResult,list_apps_result\nListArchiveRulesRequest,list_archive_rules_request\nListArchiveRulesResponse,list_archive_rules_response\nListArchivesRequest,list_archives_request\nListArchivesResponse,list_archives_response\nListArn,list_arn\nListArtifactsRequest,list_artifacts_request\nListArtifactsResponse,list_artifacts_response\nListArtifactsResult,list_artifacts_result\nListAssessmentControlInsightsByControlDomainRequest,list_assessment_control_insights_by_control_domain_request\nListAssessmentControlInsightsByControlDomainResponse,list_assessment_control_insights_by_control_domain_response\nListAssessmentFrameworkShareRequestsRequest,list_assessment_framework_share_requests_request\nListAssessmentFrameworkShareRequestsResponse,list_assessment_framework_share_requests_response\nListAssessmentFrameworksRequest,list_assessment_frameworks_request\nListAssessmentFrameworksResponse,list_assessment_frameworks_response\nListAssessmentReportsRequest,list_assessment_reports_request\nListAssessmentReportsResponse,list_assessment_reports_response\nListAssessmentRunAgentsRequest,list_assessment_run_agents_request\nListAssessmentRunAgentsResponse,list_assessment_run_agents_response\nListAssessmentRunsRequest,list_assessment_runs_request\nListAssessmentRunsResponse,list_assessment_runs_response\nListAssessmentTargetsRequest,list_assessment_targets_request\nListAssessmentTargetsResponse,list_assessment_targets_response\nListAssessmentTemplatesRequest,list_assessment_templates_request\nListAssessmentTemplatesResponse,list_assessment_templates_response\nListAssessmentsRequest,list_assessments_request\nListAssessmentsResponse,list_assessments_response\nListAssetBundleExportJobsRequest,list_asset_bundle_export_jobs_request\nListAssetBundleExportJobsResponse,list_asset_bundle_export_jobs_response\nListAssetBundleImportJobsRequest,list_asset_bundle_import_jobs_request\nListAssetBundleImportJobsResponse,list_asset_bundle_import_jobs_response\nListAssetModelPropertiesRequest,list_asset_model_properties_request\nListAssetModelPropertiesResponse,list_asset_model_properties_response\nListAssetModelsRequest,list_asset_models_request\nListAssetModelsResponse,list_asset_models_response\nListAssetPropertiesRequest,list_asset_properties_request\nListAssetPropertiesResponse,list_asset_properties_response\nListAssetRelationshipsRequest,list_asset_relationships_request\nListAssetRelationshipsResponse,list_asset_relationships_response\nListAssetsInput,list_assets_input\nListAssetsOutput,list_assets_output\nListAssetsRequest,list_assets_request\nListAssetsResponse,list_assets_response\nListAssignmentsForHITRequest,list_assignments_for_hit_request\nListAssignmentsForHITResponse,list_assignments_for_hit_response\nListAssistantAssociationsRequest,list_assistant_associations_request\nListAssistantAssociationsResponse,list_assistant_associations_response\nListAssistantsRequest,list_assistants_request\nListAssistantsResponse,list_assistants_response\nListAssociatedApprovalRuleTemplatesForRepositoryInput,list_associated_approval_rule_templates_for_repository_input\nListAssociatedApprovalRuleTemplatesForRepositoryOutput,list_associated_approval_rule_templates_for_repository_output\nListAssociatedAssetsRequest,list_associated_assets_request\nListAssociatedAssetsResponse,list_associated_assets_response\nListAssociatedAttributeGroupsRequest,list_associated_attribute_groups_request\nListAssociatedAttributeGroupsResponse,list_associated_attribute_groups_response\nListAssociatedFleetsRequest,list_associated_fleets_request\nListAssociatedFleetsResult,list_associated_fleets_result\nListAssociatedGroupsRequest,list_associated_groups_request\nListAssociatedGroupsResponse,list_associated_groups_response\nListAssociatedResourcesRequest,list_associated_resources_request\nListAssociatedResourcesResponse,list_associated_resources_response\nListAssociatedRoute53HealthChecksRequest,list_associated_route53_health_checks_request\nListAssociatedRoute53HealthChecksResponse,list_associated_route53_health_checks_response\nListAssociatedStacksRequest,list_associated_stacks_request\nListAssociatedStacksResult,list_associated_stacks_result\nListAssociationVersionsRequest,list_association_versions_request\nListAssociationVersionsResult,list_association_versions_result\nListAssociationsForLicenseConfigurationRequest,list_associations_for_license_configuration_request\nListAssociationsForLicenseConfigurationResponse,list_associations_for_license_configuration_response\nListAssociationsRequest,list_associations_request\nListAssociationsResponse,list_associations_response\nListAssociationsResult,list_associations_result\nListAttachedGroupPoliciesRequest,list_attached_group_policies_request\nListAttachedGroupPoliciesResponse,list_attached_group_policies_response\nListAttachedIndices,list_attached_indices\nListAttachedIndicesRequest,list_attached_indices_request\nListAttachedIndicesResponse,list_attached_indices_response\nListAttachedLinksInput,list_attached_links_input\nListAttachedLinksItem,list_attached_links_item\nListAttachedLinksOutput,list_attached_links_output\nListAttachedPoliciesRequest,list_attached_policies_request\nListAttachedPoliciesResponse,list_attached_policies_response\nListAttachedRolePoliciesRequest,list_attached_role_policies_request\nListAttachedRolePoliciesResponse,list_attached_role_policies_response\nListAttachedUserPoliciesRequest,list_attached_user_policies_request\nListAttachedUserPoliciesResponse,list_attached_user_policies_response\nListAttachmentsRequest,list_attachments_request\nListAttachmentsResponse,list_attachments_response\nListAttacksRequest,list_attacks_request\nListAttacksResponse,list_attacks_response\nListAttendeeTagsRequest,list_attendee_tags_request\nListAttendeeTagsResponse,list_attendee_tags_response\nListAttendeesRequest,list_attendees_request\nListAttendeesResponse,list_attendees_response\nListAttributeGroupsForApplicationRequest,list_attribute_groups_for_application_request\nListAttributeGroupsForApplicationResponse,list_attribute_groups_for_application_response\nListAttributeGroupsRequest,list_attribute_groups_request\nListAttributeGroupsResponse,list_attribute_groups_response\nListAttributesRequest,list_attributes_request\nListAttributesResponse,list_attributes_response\nListAuditFindingsRequest,list_audit_findings_request\nListAuditFindingsResponse,list_audit_findings_response\nListAuditMitigationActionsExecutionsRequest,list_audit_mitigation_actions_executions_request\nListAuditMitigationActionsExecutionsResponse,list_audit_mitigation_actions_executions_response\nListAuditMitigationActionsTasksRequest,list_audit_mitigation_actions_tasks_request\nListAuditMitigationActionsTasksResponse,list_audit_mitigation_actions_tasks_response\nListAuditSuppressionsRequest,list_audit_suppressions_request\nListAuditSuppressionsResponse,list_audit_suppressions_response\nListAuditTasksRequest,list_audit_tasks_request\nListAuditTasksResponse,list_audit_tasks_response\nListAuthorizersRequest,list_authorizers_request\nListAuthorizersResponse,list_authorizers_response\nListAutoMLJobsRequest,list_auto_ml_jobs_request\nListAutoMLJobsResponse,list_auto_ml_jobs_response\nListAutoScalingConfigurationsRequest,list_auto_scaling_configurations_request\nListAutoScalingConfigurationsResponse,list_auto_scaling_configurations_response\nListAutomaticTapeCreationPoliciesInput,list_automatic_tape_creation_policies_input\nListAutomaticTapeCreationPoliciesOutput,list_automatic_tape_creation_policies_output\nListAutomationRulesRequest,list_automation_rules_request\nListAutomationRulesResponse,list_automation_rules_response\nListAvailabilityConfigurationsRequest,list_availability_configurations_request\nListAvailabilityConfigurationsResponse,list_availability_configurations_response\nListAvailableManagedRuleGroupVersionsRequest,list_available_managed_rule_group_versions_request\nListAvailableManagedRuleGroupVersionsResponse,list_available_managed_rule_group_versions_response\nListAvailableManagedRuleGroupsRequest,list_available_managed_rule_groups_request\nListAvailableManagedRuleGroupsResponse,list_available_managed_rule_groups_response\nListAvailableManagementCidrRangesRequest,list_available_management_cidr_ranges_request\nListAvailableManagementCidrRangesResult,list_available_management_cidr_ranges_result\nListAvailableResourceDimensionsRequest,list_available_resource_dimensions_request\nListAvailableResourceDimensionsResponse,list_available_resource_dimensions_response\nListAvailableResourceMetricsRequest,list_available_resource_metrics_request\nListAvailableResourceMetricsResponse,list_available_resource_metrics_response\nListAvailableSolutionStacksResultMessage,list_available_solution_stacks_result_message\nListAvailableVoiceConnectorRegionsResponse,list_available_voice_connector_regions_response\nListAvailableZonesResponse,list_available_zones_response\nListBackendEnvironmentsRequest,list_backend_environments_request\nListBackendEnvironmentsResult,list_backend_environments_result\nListBackendJobsRequest,list_backend_jobs_request\nListBackendJobsResponse,list_backend_jobs_response\nListBackupJobsInput,list_backup_jobs_input\nListBackupJobsOutput,list_backup_jobs_output\nListBackupPlanTemplatesInput,list_backup_plan_templates_input\nListBackupPlanTemplatesOutput,list_backup_plan_templates_output\nListBackupPlanVersionsInput,list_backup_plan_versions_input\nListBackupPlanVersionsOutput,list_backup_plan_versions_output\nListBackupPlansInput,list_backup_plans_input\nListBackupPlansOutput,list_backup_plans_output\nListBackupSelectionsInput,list_backup_selections_input\nListBackupSelectionsOutput,list_backup_selections_output\nListBackupVaultsInput,list_backup_vaults_input\nListBackupVaultsOutput,list_backup_vaults_output\nListBackupsInput,list_backups_input\nListBackupsOutput,list_backups_output\nListBatchInferenceJobsRequest,list_batch_inference_jobs_request\nListBatchInferenceJobsResponse,list_batch_inference_jobs_response\nListBatchJobDefinitionsRequest,list_batch_job_definitions_request\nListBatchJobDefinitionsResponse,list_batch_job_definitions_response\nListBatchJobExecutionsRequest,list_batch_job_executions_request\nListBatchJobExecutionsResponse,list_batch_job_executions_response\nListBatchLoadTasksRequest,list_batch_load_tasks_request\nListBatchLoadTasksResponse,list_batch_load_tasks_response\nListBatchSegmentJobsRequest,list_batch_segment_jobs_request\nListBatchSegmentJobsResponse,list_batch_segment_jobs_response\nListBillingGroupAccountGrouping,list_billing_group_account_grouping\nListBillingGroupCostReportsFilter,list_billing_group_cost_reports_filter\nListBillingGroupCostReportsInput,list_billing_group_cost_reports_input\nListBillingGroupCostReportsOutput,list_billing_group_cost_reports_output\nListBillingGroupsFilter,list_billing_groups_filter\nListBillingGroupsInput,list_billing_groups_input\nListBillingGroupsOutput,list_billing_groups_output\nListBillingGroupsRequest,list_billing_groups_request\nListBillingGroupsResponse,list_billing_groups_response\nListBlueprintsRequest,list_blueprints_request\nListBlueprintsResponse,list_blueprints_response\nListBonusPaymentsRequest,list_bonus_payments_request\nListBonusPaymentsResponse,list_bonus_payments_response\nListBootstrapActionsInput,list_bootstrap_actions_input\nListBootstrapActionsOutput,list_bootstrap_actions_output\nListBotAliasesRequest,list_bot_aliases_request\nListBotAliasesResponse,list_bot_aliases_response\nListBotLocalesRequest,list_bot_locales_request\nListBotLocalesResponse,list_bot_locales_response\nListBotRecommendationsRequest,list_bot_recommendations_request\nListBotRecommendationsResponse,list_bot_recommendations_response\nListBotVersionsRequest,list_bot_versions_request\nListBotVersionsResponse,list_bot_versions_response\nListBotsRequest,list_bots_request\nListBotsResponse,list_bots_response\nListBranchesInput,list_branches_input\nListBranchesOutput,list_branches_output\nListBranchesRequest,list_branches_request\nListBranchesResult,list_branches_result\nListBridgesRequest,list_bridges_request\nListBridgesResponse,list_bridges_response\nListBrokersRequest,list_brokers_request\nListBrokersResponse,list_brokers_response\nListBrowserSettingsRequest,list_browser_settings_request\nListBrowserSettingsResponse,list_browser_settings_response\nListBucketAnalyticsConfigurationsOutput,list_bucket_analytics_configurations_output\nListBucketAnalyticsConfigurationsRequest,list_bucket_analytics_configurations_request\nListBucketIntelligentTieringConfigurationsOutput,list_bucket_intelligent_tiering_configurations_output\nListBucketIntelligentTieringConfigurationsRequest,list_bucket_intelligent_tiering_configurations_request\nListBucketInventoryConfigurationsOutput,list_bucket_inventory_configurations_output\nListBucketInventoryConfigurationsRequest,list_bucket_inventory_configurations_request\nListBucketMetricsConfigurationsOutput,list_bucket_metrics_configurations_output\nListBucketMetricsConfigurationsRequest,list_bucket_metrics_configurations_request\nListBucketsOutput,list_buckets_output\nListBudgetsForResourceInput,list_budgets_for_resource_input\nListBudgetsForResourceOutput,list_budgets_for_resource_output\nListBuildBatchesForProjectInput,list_build_batches_for_project_input\nListBuildBatchesForProjectOutput,list_build_batches_for_project_output\nListBuildBatchesInput,list_build_batches_input\nListBuildBatchesOutput,list_build_batches_output\nListBuildsForProjectInput,list_builds_for_project_input\nListBuildsForProjectOutput,list_builds_for_project_output\nListBuildsInput,list_builds_input\nListBuildsOutput,list_builds_output\nListBuiltInIntentsRequest,list_built_in_intents_request\nListBuiltInIntentsResponse,list_built_in_intents_response\nListBuiltInSlotTypesRequest,list_built_in_slot_types_request\nListBuiltInSlotTypesResponse,list_built_in_slot_types_response\nListBulkDeploymentDetailedReportsRequest,list_bulk_deployment_detailed_reports_request\nListBulkDeploymentDetailedReportsResponse,list_bulk_deployment_detailed_reports_response\nListBulkDeploymentsRequest,list_bulk_deployments_request\nListBulkDeploymentsResponse,list_bulk_deployments_response\nListBulkImportJobsRequest,list_bulk_import_jobs_request\nListBulkImportJobsResponse,list_bulk_import_jobs_response\nListBundlesRequest,list_bundles_request\nListBundlesResult,list_bundles_result\nListBusinessReportSchedulesRequest,list_business_report_schedules_request\nListBusinessReportSchedulesResponse,list_business_report_schedules_response\nListBy,list_by\nListByoipCidrsRequest,list_byoip_cidrs_request\nListByoipCidrsResponse,list_byoip_cidrs_response\nListByteMatchSetsRequest,list_byte_match_sets_request\nListByteMatchSetsResponse,list_byte_match_sets_response\nListCACertificatesRequest,list_ca_certificates_request\nListCACertificatesResponse,list_ca_certificates_response\nListCachePoliciesRequest,list_cache_policies_request\nListCachePoliciesResult,list_cache_policies_result\nListCalculatedAttributeDefinitionItem,list_calculated_attribute_definition_item\nListCalculatedAttributeDefinitionsRequest,list_calculated_attribute_definitions_request\nListCalculatedAttributeDefinitionsResponse,list_calculated_attribute_definitions_response\nListCalculatedAttributeForProfileItem,list_calculated_attribute_for_profile_item\nListCalculatedAttributesForProfileRequest,list_calculated_attributes_for_profile_request\nListCalculatedAttributesForProfileResponse,list_calculated_attributes_for_profile_response\nListCalculationExecutionsRequest,list_calculation_executions_request\nListCalculationExecutionsResponse,list_calculation_executions_response\nListCallAnalyticsCategoriesRequest,list_call_analytics_categories_request\nListCallAnalyticsCategoriesResponse,list_call_analytics_categories_response\nListCallAnalyticsJobsRequest,list_call_analytics_jobs_request\nListCallAnalyticsJobsResponse,list_call_analytics_jobs_response\nListCampaignsRequest,list_campaigns_request\nListCampaignsResponse,list_campaigns_response\nListCandidatesForAutoMLJobRequest,list_candidates_for_auto_ml_job_request\nListCandidatesForAutoMLJobResponse,list_candidates_for_auto_ml_job_response\nListCapacityReservationsInput,list_capacity_reservations_input\nListCapacityReservationsOutput,list_capacity_reservations_output\nListCasesForContactRequest,list_cases_for_contact_request\nListCasesForContactResponse,list_cases_for_contact_response\nListCatalogItemsInput,list_catalog_items_input\nListCatalogItemsOutput,list_catalog_items_output\nListCellsRequest,list_cells_request\nListCellsResponse,list_cells_response\nListCertificateAuthoritiesRequest,list_certificate_authorities_request\nListCertificateAuthoritiesResponse,list_certificate_authorities_response\nListCertificatesByCARequest,list_certificates_by_ca_request\nListCertificatesByCAResponse,list_certificates_by_ca_response\nListCertificatesRequest,list_certificates_request\nListCertificatesResponse,list_certificates_response\nListCertificatesResult,list_certificates_result\nListChangeSetsInput,list_change_sets_input\nListChangeSetsOutput,list_change_sets_output\nListChangeSetsRequest,list_change_sets_request\nListChangeSetsResponse,list_change_sets_response\nListChangedBlocksRequest,list_changed_blocks_request\nListChangedBlocksResponse,list_changed_blocks_response\nListChangesetsRequest,list_changesets_request\nListChangesetsResponse,list_changesets_response\nListChannelBansRequest,list_channel_bans_request\nListChannelBansResponse,list_channel_bans_response\nListChannelFlowsRequest,list_channel_flows_request\nListChannelFlowsResponse,list_channel_flows_response\nListChannelGroupsRequest,list_channel_groups_request\nListChannelGroupsResponse,list_channel_groups_response\nListChannelMembershipsForAppInstanceUserRequest,list_channel_memberships_for_app_instance_user_request\nListChannelMembershipsForAppInstanceUserResponse,list_channel_memberships_for_app_instance_user_response\nListChannelMembershipsRequest,list_channel_memberships_request\nListChannelMembershipsResponse,list_channel_memberships_response\nListChannelMessagesRequest,list_channel_messages_request\nListChannelMessagesResponse,list_channel_messages_response\nListChannelModeratorsRequest,list_channel_moderators_request\nListChannelModeratorsResponse,list_channel_moderators_response\nListChannelsAssociatedWithChannelFlowRequest,list_channels_associated_with_channel_flow_request\nListChannelsAssociatedWithChannelFlowResponse,list_channels_associated_with_channel_flow_response\nListChannelsModeratedByAppInstanceUserRequest,list_channels_moderated_by_app_instance_user_request\nListChannelsModeratedByAppInstanceUserResponse,list_channels_moderated_by_app_instance_user_response\nListChannelsRequest,list_channels_request\nListChannelsResponse,list_channels_response\nListCheckDetailsInput,list_check_details_input\nListCheckDetailsOutput,list_check_details_output\nListCheckSummariesInput,list_check_summaries_input\nListCheckSummariesOutput,list_check_summaries_output\nListChildrenRequest,list_children_request\nListChildrenResponse,list_children_response\nListChunksInput,list_chunks_input\nListChunksOutput,list_chunks_output\nListCidrBlocksRequest,list_cidr_blocks_request\nListCidrBlocksResponse,list_cidr_blocks_response\nListCidrCollectionsRequest,list_cidr_collections_request\nListCidrCollectionsResponse,list_cidr_collections_response\nListCidrLocationsRequest,list_cidr_locations_request\nListCidrLocationsResponse,list_cidr_locations_response\nListClassificationJobsRequest,list_classification_jobs_request\nListClassificationJobsResponse,list_classification_jobs_response\nListClassificationScopesRequest,list_classification_scopes_request\nListClassificationScopesResponse,list_classification_scopes_response\nListClientDevicesAssociatedWithCoreDeviceRequest,list_client_devices_associated_with_core_device_request\nListClientDevicesAssociatedWithCoreDeviceResponse,list_client_devices_associated_with_core_device_response\nListClientVpcConnectionsRequest,list_client_vpc_connections_request\nListClientVpcConnectionsResponse,list_client_vpc_connections_response\nListClosedWorkflowExecutionsInput,list_closed_workflow_executions_input\nListCloudFrontOriginAccessIdentitiesRequest,list_cloud_front_origin_access_identities_request\nListCloudFrontOriginAccessIdentitiesResult,list_cloud_front_origin_access_identities_result\nListClusterJobsRequest,list_cluster_jobs_request\nListClusterJobsResult,list_cluster_jobs_result\nListClusterOperationsRequest,list_cluster_operations_request\nListClusterOperationsResponse,list_cluster_operations_response\nListClusterOperationsV2Request,list_cluster_operations_v2_request\nListClusterOperationsV2Response,list_cluster_operations_v2_response\nListClusterSnapshotsInput,list_cluster_snapshots_input\nListClusterSnapshotsOutput,list_cluster_snapshots_output\nListClustersInput,list_clusters_input\nListClustersOutput,list_clusters_output\nListClustersRequest,list_clusters_request\nListClustersResponse,list_clusters_response\nListClustersResult,list_clusters_result\nListClustersV2Request,list_clusters_v2_request\nListClustersV2Response,list_clusters_v2_response\nListCodeRepositoriesInput,list_code_repositories_input\nListCodeRepositoriesOutput,list_code_repositories_output\nListCodeReviewsRequest,list_code_reviews_request\nListCodeReviewsResponse,list_code_reviews_response\nListCodeSigningConfigsRequest,list_code_signing_configs_request\nListCodeSigningConfigsResponse,list_code_signing_configs_response\nListCodegenJobsRequest,list_codegen_jobs_request\nListCodegenJobsResponse,list_codegen_jobs_response\nListCollaborationAnalysisTemplatesInput,list_collaboration_analysis_templates_input\nListCollaborationAnalysisTemplatesOutput,list_collaboration_analysis_templates_output\nListCollaborationsInput,list_collaborations_input\nListCollaborationsOutput,list_collaborations_output\nListCollectionsRequest,list_collections_request\nListCollectionsResponse,list_collections_response\nListCollectorsRequest,list_collectors_request\nListCollectorsResponse,list_collectors_response\nListCommandInvocationsRequest,list_command_invocations_request\nListCommandInvocationsResult,list_command_invocations_result\nListCommandsRequest,list_commands_request\nListCommandsResult,list_commands_result\nListCompatibleImagesRequest,list_compatible_images_request\nListCompatibleImagesResult,list_compatible_images_result\nListCompilationJobsRequest,list_compilation_jobs_request\nListCompilationJobsResponse,list_compilation_jobs_response\nListComplianceItemsRequest,list_compliance_items_request\nListComplianceItemsResult,list_compliance_items_result\nListComplianceStatusRequest,list_compliance_status_request\nListComplianceStatusResponse,list_compliance_status_response\nListComplianceSummariesRequest,list_compliance_summaries_request\nListComplianceSummariesResult,list_compliance_summaries_result\nListComponentBuildVersionsRequest,list_component_build_versions_request\nListComponentBuildVersionsResponse,list_component_build_versions_response\nListComponentOutputsInput,list_component_outputs_input\nListComponentOutputsOutput,list_component_outputs_output\nListComponentProvisionedResourcesInput,list_component_provisioned_resources_input\nListComponentProvisionedResourcesOutput,list_component_provisioned_resources_output\nListComponentTypesRequest,list_component_types_request\nListComponentTypesResponse,list_component_types_response\nListComponentVersionsRequest,list_component_versions_request\nListComponentVersionsResponse,list_component_versions_response\nListComponentsInput,list_components_input\nListComponentsOutput,list_components_output\nListComponentsRequest,list_components_request\nListComponentsResponse,list_components_response\nListComputeInput,list_compute_input\nListComputeOutput,list_compute_output\nListConferenceProvidersRequest,list_conference_providers_request\nListConferenceProvidersResponse,list_conference_providers_response\nListConfigsRequest,list_configs_request\nListConfigsResponse,list_configs_response\nListConfigurationHistoryRequest,list_configuration_history_request\nListConfigurationHistoryResponse,list_configuration_history_response\nListConfigurationProfilesRequest,list_configuration_profiles_request\nListConfigurationRevisionsRequest,list_configuration_revisions_request\nListConfigurationRevisionsResponse,list_configuration_revisions_response\nListConfigurationSetsRequest,list_configuration_sets_request\nListConfigurationSetsResponse,list_configuration_sets_response\nListConfigurationsRequest,list_configurations_request\nListConfigurationsResponse,list_configurations_response\nListConfiguredTableAssociationsInput,list_configured_table_associations_input\nListConfiguredTableAssociationsOutput,list_configured_table_associations_output\nListConfiguredTablesInput,list_configured_tables_input\nListConfiguredTablesOutput,list_configured_tables_output\nListConflictingAliasesRequest,list_conflicting_aliases_request\nListConflictingAliasesResult,list_conflicting_aliases_result\nListConformancePackComplianceScoresRequest,list_conformance_pack_compliance_scores_request\nListConformancePackComplianceScoresResponse,list_conformance_pack_compliance_scores_response\nListConnectPeersRequest,list_connect_peers_request\nListConnectPeersResponse,list_connect_peers_response\nListConnectionsInput,list_connections_input\nListConnectionsOutput,list_connections_output\nListConnectionsRequest,list_connections_request\nListConnectionsResponse,list_connections_response\nListConnectorDefinitionVersionsRequest,list_connector_definition_versions_request\nListConnectorDefinitionVersionsResponse,list_connector_definition_versions_response\nListConnectorDefinitionsRequest,list_connector_definitions_request\nListConnectorDefinitionsResponse,list_connector_definitions_response\nListConnectorEntitiesRequest,list_connector_entities_request\nListConnectorEntitiesResponse,list_connector_entities_response\nListConnectorsRequest,list_connectors_request\nListConnectorsResponse,list_connectors_response\nListConstraintsForPortfolioInput,list_constraints_for_portfolio_input\nListConstraintsForPortfolioOutput,list_constraints_for_portfolio_output\nListContactChannelsRequest,list_contact_channels_request\nListContactChannelsResult,list_contact_channels_result\nListContactEvaluationsRequest,list_contact_evaluations_request\nListContactEvaluationsResponse,list_contact_evaluations_response\nListContactFlowModulesRequest,list_contact_flow_modules_request\nListContactFlowModulesResponse,list_contact_flow_modules_response\nListContactFlowsRequest,list_contact_flows_request\nListContactFlowsResponse,list_contact_flows_response\nListContactListsRequest,list_contact_lists_request\nListContactListsResponse,list_contact_lists_response\nListContactReferencesRequest,list_contact_references_request\nListContactReferencesResponse,list_contact_references_response\nListContactsFilter,list_contacts_filter\nListContactsRequest,list_contacts_request\nListContactsResponse,list_contacts_response\nListContactsResult,list_contacts_result\nListContainerInstancesRequest,list_container_instances_request\nListContainerInstancesResponse,list_container_instances_response\nListContainerRecipesRequest,list_container_recipes_request\nListContainerRecipesResponse,list_container_recipes_response\nListContainersInput,list_containers_input\nListContainersOutput,list_containers_output\nListContentsRequest,list_contents_request\nListContentsResponse,list_contents_response\nListContextsRequest,list_contexts_request\nListContextsResponse,list_contexts_response\nListContinuousDeploymentPoliciesRequest,list_continuous_deployment_policies_request\nListContinuousDeploymentPoliciesResult,list_continuous_deployment_policies_result\nListContributorInsightsInput,list_contributor_insights_input\nListContributorInsightsOutput,list_contributor_insights_output\nListControlDisplayOptions,list_control_display_options\nListControlDomainInsightsByAssessmentRequest,list_control_domain_insights_by_assessment_request\nListControlDomainInsightsByAssessmentResponse,list_control_domain_insights_by_assessment_response\nListControlDomainInsightsRequest,list_control_domain_insights_request\nListControlDomainInsightsResponse,list_control_domain_insights_response\nListControlInsightsByControlDomainRequest,list_control_insights_by_control_domain_request\nListControlInsightsByControlDomainResponse,list_control_insights_by_control_domain_response\nListControlPanelsRequest,list_control_panels_request\nListControlPanelsResponse,list_control_panels_response\nListControlSearchOptions,list_control_search_options\nListControlSelectAllOptions,list_control_select_all_options\nListControlsRequest,list_controls_request\nListControlsResponse,list_controls_response\nListCopyJobsInput,list_copy_jobs_input\nListCopyJobsOutput,list_copy_jobs_output\nListCoreDefinitionVersionsRequest,list_core_definition_versions_request\nListCoreDefinitionVersionsResponse,list_core_definition_versions_response\nListCoreDefinitionsRequest,list_core_definitions_request\nListCoreDefinitionsResponse,list_core_definitions_response\nListCoreDevicesRequest,list_core_devices_request\nListCoreDevicesResponse,list_core_devices_response\nListCoreNetworkPolicyVersionsRequest,list_core_network_policy_versions_request\nListCoreNetworkPolicyVersionsResponse,list_core_network_policy_versions_response\nListCoreNetworksRequest,list_core_networks_request\nListCoreNetworksResponse,list_core_networks_response\nListCostAllocationTagsRequest,list_cost_allocation_tags_request\nListCostAllocationTagsResponse,list_cost_allocation_tags_response\nListCostCategoryDefinitionsRequest,list_cost_category_definitions_request\nListCostCategoryDefinitionsResponse,list_cost_category_definitions_response\nListCoverageRequest,list_coverage_request\nListCoverageResponse,list_coverage_response\nListCoverageStatisticsRequest,list_coverage_statistics_request\nListCoverageStatisticsResponse,list_coverage_statistics_response\nListCrawlersRequest,list_crawlers_request\nListCrawlersResponse,list_crawlers_response\nListCrawlsRequest,list_crawls_request\nListCrawlsResponse,list_crawls_response\nListCreateAccountStatusRequest,list_create_account_status_request\nListCreateAccountStatusResponse,list_create_account_status_response\nListCreatedArtifactsRequest,list_created_artifacts_request\nListCreatedArtifactsResult,list_created_artifacts_result\nListCrlsResponse,list_crls_response\nListCrossAccountAuthorizationsRequest,list_cross_account_authorizations_request\nListCrossAccountAuthorizationsResponse,list_cross_account_authorizations_response\nListCuratedEnvironmentImagesOutput,list_curated_environment_images_output\nListCustomDataIdentifiersRequest,list_custom_data_identifiers_request\nListCustomDataIdentifiersResponse,list_custom_data_identifiers_response\nListCustomEntityTypesRequest,list_custom_entity_types_request\nListCustomEntityTypesResponse,list_custom_entity_types_response\nListCustomLineItemChargeDetails,list_custom_line_item_charge_details\nListCustomLineItemFlatChargeDetails,list_custom_line_item_flat_charge_details\nListCustomLineItemPercentageChargeDetails,list_custom_line_item_percentage_charge_details\nListCustomLineItemVersionsBillingPeriodRangeFilter,list_custom_line_item_versions_billing_period_range_filter\nListCustomLineItemVersionsFilter,list_custom_line_item_versions_filter\nListCustomLineItemVersionsInput,list_custom_line_item_versions_input\nListCustomLineItemVersionsOutput,list_custom_line_item_versions_output\nListCustomLineItemsFilter,list_custom_line_items_filter\nListCustomLineItemsInput,list_custom_line_items_input\nListCustomLineItemsOutput,list_custom_line_items_output\nListCustomMetricsRequest,list_custom_metrics_request\nListCustomMetricsResponse,list_custom_metrics_response\nListCustomModelsRequest,list_custom_models_request\nListCustomModelsResponse,list_custom_models_response\nListCustomPluginsRequest,list_custom_plugins_request\nListCustomPluginsResponse,list_custom_plugins_response\nListCustomRoutingAcceleratorsRequest,list_custom_routing_accelerators_request\nListCustomRoutingAcceleratorsResponse,list_custom_routing_accelerators_response\nListCustomRoutingEndpointGroupsRequest,list_custom_routing_endpoint_groups_request\nListCustomRoutingEndpointGroupsResponse,list_custom_routing_endpoint_groups_response\nListCustomRoutingListenersRequest,list_custom_routing_listeners_request\nListCustomRoutingListenersResponse,list_custom_routing_listeners_response\nListCustomRoutingPortMappingsByDestinationRequest,list_custom_routing_port_mappings_by_destination_request\nListCustomRoutingPortMappingsByDestinationResponse,list_custom_routing_port_mappings_by_destination_response\nListCustomRoutingPortMappingsRequest,list_custom_routing_port_mappings_request\nListCustomRoutingPortMappingsResponse,list_custom_routing_port_mappings_response\nListCustomVerificationEmailTemplatesRequest,list_custom_verification_email_templates_request\nListCustomVerificationEmailTemplatesResponse,list_custom_verification_email_templates_response\nListCustomVocabularyItemsRequest,list_custom_vocabulary_items_request\nListCustomVocabularyItemsResponse,list_custom_vocabulary_items_response\nListCustomerManagedPolicyReferencesInPermissionSetRequest,list_customer_managed_policy_references_in_permission_set_request\nListCustomerManagedPolicyReferencesInPermissionSetResponse,list_customer_managed_policy_references_in_permission_set_response\nListDICOMImportJobsRequest,list_dicom_import_jobs_request\nListDICOMImportJobsResponse,list_dicom_import_jobs_response\nListDashboardVersionsRequest,list_dashboard_versions_request\nListDashboardVersionsResponse,list_dashboard_versions_response\nListDashboardsInput,list_dashboards_input\nListDashboardsOutput,list_dashboards_output\nListDashboardsRequest,list_dashboards_request\nListDashboardsResponse,list_dashboards_response\nListDataCatalogsInput,list_data_catalogs_input\nListDataCatalogsOutput,list_data_catalogs_output\nListDataCellsFilterRequest,list_data_cells_filter_request\nListDataCellsFilterResponse,list_data_cells_filter_response\nListDataIngestionJobsRequest,list_data_ingestion_jobs_request\nListDataIngestionJobsResponse,list_data_ingestion_jobs_response\nListDataIntegrationAssociationsRequest,list_data_integration_associations_request\nListDataIntegrationAssociationsResponse,list_data_integration_associations_response\nListDataIntegrationsRequest,list_data_integrations_request\nListDataIntegrationsResponse,list_data_integrations_response\nListDataLakeExceptionsRequest,list_data_lake_exceptions_request\nListDataLakeExceptionsResponse,list_data_lake_exceptions_response\nListDataLakesRequest,list_data_lakes_request\nListDataLakesResponse,list_data_lakes_response\nListDataQualityJobDefinitionsRequest,list_data_quality_job_definitions_request\nListDataQualityJobDefinitionsResponse,list_data_quality_job_definitions_response\nListDataQualityResultsRequest,list_data_quality_results_request\nListDataQualityResultsResponse,list_data_quality_results_response\nListDataQualityRuleRecommendationRunsRequest,list_data_quality_rule_recommendation_runs_request\nListDataQualityRuleRecommendationRunsResponse,list_data_quality_rule_recommendation_runs_response\nListDataQualityRulesetEvaluationRunsRequest,list_data_quality_ruleset_evaluation_runs_request\nListDataQualityRulesetEvaluationRunsResponse,list_data_quality_ruleset_evaluation_runs_response\nListDataQualityRulesetsRequest,list_data_quality_rulesets_request\nListDataQualityRulesetsResponse,list_data_quality_rulesets_response\nListDataSetImportHistoryRequest,list_data_set_import_history_request\nListDataSetImportHistoryResponse,list_data_set_import_history_response\nListDataSetRevisionsRequest,list_data_set_revisions_request\nListDataSetRevisionsResponse,list_data_set_revisions_response\nListDataSetsRequest,list_data_sets_request\nListDataSetsResponse,list_data_sets_response\nListDataSourceSyncJobsRequest,list_data_source_sync_jobs_request\nListDataSourceSyncJobsResponse,list_data_source_sync_jobs_response\nListDataSourcesRequest,list_data_sources_request\nListDataSourcesResponse,list_data_sources_response\nListDataViewsRequest,list_data_views_request\nListDataViewsResponse,list_data_views_response\nListDatabasesInput,list_databases_input\nListDatabasesOutput,list_databases_output\nListDatabasesRequest,list_databases_request\nListDatabasesResponse,list_databases_response\nListDataflowEndpointGroupsRequest,list_dataflow_endpoint_groups_request\nListDataflowEndpointGroupsResponse,list_dataflow_endpoint_groups_response\nListDatasetContentsRequest,list_dataset_contents_request\nListDatasetContentsResponse,list_dataset_contents_response\nListDatasetEntriesRequest,list_dataset_entries_request\nListDatasetEntriesResponse,list_dataset_entries_response\nListDatasetExportJobsRequest,list_dataset_export_jobs_request\nListDatasetExportJobsResponse,list_dataset_export_jobs_response\nListDatasetGroupsRequest,list_dataset_groups_request\nListDatasetGroupsResponse,list_dataset_groups_response\nListDatasetImportJobsRequest,list_dataset_import_jobs_request\nListDatasetImportJobsResponse,list_dataset_import_jobs_response\nListDatasetLabelsRequest,list_dataset_labels_request\nListDatasetLabelsResponse,list_dataset_labels_response\nListDatasetsRequest,list_datasets_request\nListDatasetsResponse,list_datasets_response\nListDatasourcePackagesRequest,list_datasource_packages_request\nListDatasourcePackagesResponse,list_datasource_packages_response\nListDatastoresRequest,list_datastores_request\nListDatastoresResponse,list_datastores_response\nListDeadLetterSourceQueuesRequest,list_dead_letter_source_queues_request\nListDeadLetterSourceQueuesResult,list_dead_letter_source_queues_result\nListDecoderManifestNetworkInterfacesRequest,list_decoder_manifest_network_interfaces_request\nListDecoderManifestNetworkInterfacesResponse,list_decoder_manifest_network_interfaces_response\nListDecoderManifestSignalsRequest,list_decoder_manifest_signals_request\nListDecoderManifestSignalsResponse,list_decoder_manifest_signals_response\nListDecoderManifestsRequest,list_decoder_manifests_request\nListDecoderManifestsResponse,list_decoder_manifests_response\nListDedicatedIpPoolsRequest,list_dedicated_ip_pools_request\nListDedicatedIpPoolsResponse,list_dedicated_ip_pools_response\nListDefaultVocabulariesRequest,list_default_vocabularies_request\nListDefaultVocabulariesResponse,list_default_vocabularies_response\nListDelegatedAdminAccountsRequest,list_delegated_admin_accounts_request\nListDelegatedAdminAccountsResponse,list_delegated_admin_accounts_response\nListDelegatedAdministratorsRequest,list_delegated_administrators_request\nListDelegatedAdministratorsResponse,list_delegated_administrators_response\nListDelegatedServicesForAccountRequest,list_delegated_services_for_account_request\nListDelegatedServicesForAccountResponse,list_delegated_services_for_account_response\nListDeliverabilityTestReportsRequest,list_deliverability_test_reports_request\nListDeliverabilityTestReportsResponse,list_deliverability_test_reports_response\nListDeliveryStreamsInput,list_delivery_streams_input\nListDeliveryStreamsOutput,list_delivery_streams_output\nListDeploymentConfigsInput,list_deployment_configs_input\nListDeploymentConfigsOutput,list_deployment_configs_output\nListDeploymentGroupsInput,list_deployment_groups_input\nListDeploymentGroupsOutput,list_deployment_groups_output\nListDeploymentInstancesInput,list_deployment_instances_input\nListDeploymentInstancesOutput,list_deployment_instances_output\nListDeploymentJobsRequest,list_deployment_jobs_request\nListDeploymentJobsResponse,list_deployment_jobs_response\nListDeploymentStrategiesRequest,list_deployment_strategies_request\nListDeploymentTargetsInput,list_deployment_targets_input\nListDeploymentTargetsOutput,list_deployment_targets_output\nListDeploymentsInput,list_deployments_input\nListDeploymentsOutput,list_deployments_output\nListDeploymentsRequest,list_deployments_request\nListDeploymentsResponse,list_deployments_response\nListDestinationsRequest,list_destinations_request\nListDestinationsResponse,list_destinations_response\nListDetectMitigationActionsExecutionsRequest,list_detect_mitigation_actions_executions_request\nListDetectMitigationActionsExecutionsResponse,list_detect_mitigation_actions_executions_response\nListDetectMitigationActionsTasksRequest,list_detect_mitigation_actions_tasks_request\nListDetectMitigationActionsTasksResponse,list_detect_mitigation_actions_tasks_response\nListDetectorModelVersionsRequest,list_detector_model_versions_request\nListDetectorModelVersionsResponse,list_detector_model_versions_response\nListDetectorModelsRequest,list_detector_models_request\nListDetectorModelsResponse,list_detector_models_response\nListDetectorsRequest,list_detectors_request\nListDetectorsResponse,list_detectors_response\nListDevEndpointsRequest,list_dev_endpoints_request\nListDevEndpointsResponse,list_dev_endpoints_response\nListDevEnvironmentSessionsRequest,list_dev_environment_sessions_request\nListDevEnvironmentSessionsResponse,list_dev_environment_sessions_response\nListDevEnvironmentsRequest,list_dev_environments_request\nListDevEnvironmentsResponse,list_dev_environments_response\nListDevelopmentSchemaArnsRequest,list_development_schema_arns_request\nListDevelopmentSchemaArnsResponse,list_development_schema_arns_response\nListDeviceDefinitionVersionsRequest,list_device_definition_versions_request\nListDeviceDefinitionVersionsResponse,list_device_definition_versions_response\nListDeviceDefinitionsRequest,list_device_definitions_request\nListDeviceDefinitionsResponse,list_device_definitions_response\nListDeviceEventsRequest,list_device_events_request\nListDeviceEventsResponse,list_device_events_response\nListDeviceFleetsRequest,list_device_fleets_request\nListDeviceFleetsResponse,list_device_fleets_response\nListDeviceIdentifiersRequest,list_device_identifiers_request\nListDeviceIdentifiersResponse,list_device_identifiers_response\nListDeviceInstancesRequest,list_device_instances_request\nListDeviceInstancesResult,list_device_instances_result\nListDevicePoolsRequest,list_device_pools_request\nListDevicePoolsResult,list_device_pools_result\nListDevicePositionsRequest,list_device_positions_request\nListDevicePositionsResponse,list_device_positions_response\nListDevicePositionsResponseEntry,list_device_positions_response_entry\nListDeviceProfilesRequest,list_device_profiles_request\nListDeviceProfilesResponse,list_device_profiles_response\nListDeviceResourcesInput,list_device_resources_input\nListDeviceResourcesOutput,list_device_resources_output\nListDevicesForWirelessDeviceImportTaskRequest,list_devices_for_wireless_device_import_task_request\nListDevicesForWirelessDeviceImportTaskResponse,list_devices_for_wireless_device_import_task_response\nListDevicesInput,list_devices_input\nListDevicesJobsRequest,list_devices_jobs_request\nListDevicesJobsResponse,list_devices_jobs_response\nListDevicesOutput,list_devices_output\nListDevicesRequest,list_devices_request\nListDevicesResponse,list_devices_response\nListDevicesResult,list_devices_result\nListDimensionsRequest,list_dimensions_request\nListDimensionsResponse,list_dimensions_response\nListDirectoriesRequest,list_directories_request\nListDirectoriesResponse,list_directories_response\nListDirectoryRegistrationsRequest,list_directory_registrations_request\nListDirectoryRegistrationsResponse,list_directory_registrations_response\nListDiscoveredResourcesRequest,list_discovered_resources_request\nListDiscoveredResourcesResponse,list_discovered_resources_response\nListDiscoveredResourcesResult,list_discovered_resources_result\nListDiscoverersRequest,list_discoverers_request\nListDiscoverersResponse,list_discoverers_response\nListDiscoveryJobsRequest,list_discovery_jobs_request\nListDiscoveryJobsResponse,list_discovery_jobs_response\nListDistributedGrantsRequest,list_distributed_grants_request\nListDistributedGrantsResponse,list_distributed_grants_response\nListDistributionConfigurationsRequest,list_distribution_configurations_request\nListDistributionConfigurationsResponse,list_distribution_configurations_response\nListDistributionsByCachePolicyIdRequest,list_distributions_by_cache_policy_id_request\nListDistributionsByCachePolicyIdResult,list_distributions_by_cache_policy_id_result\nListDistributionsByKeyGroupRequest,list_distributions_by_key_group_request\nListDistributionsByKeyGroupResult,list_distributions_by_key_group_result\nListDistributionsByOriginRequestPolicyIdRequest,list_distributions_by_origin_request_policy_id_request\nListDistributionsByOriginRequestPolicyIdResult,list_distributions_by_origin_request_policy_id_result\nListDistributionsByRealtimeLogConfigRequest,list_distributions_by_realtime_log_config_request\nListDistributionsByRealtimeLogConfigResult,list_distributions_by_realtime_log_config_result\nListDistributionsByResponseHeadersPolicyIdRequest,list_distributions_by_response_headers_policy_id_request\nListDistributionsByResponseHeadersPolicyIdResult,list_distributions_by_response_headers_policy_id_result\nListDistributionsByWebACLIdRequest,list_distributions_by_web_acl_id_request\nListDistributionsByWebACLIdResult,list_distributions_by_web_acl_id_result\nListDistributionsRequest,list_distributions_request\nListDistributionsResult,list_distributions_result\nListDocumentClassificationJobsRequest,list_document_classification_jobs_request\nListDocumentClassificationJobsResponse,list_document_classification_jobs_response\nListDocumentClassifierSummariesRequest,list_document_classifier_summaries_request\nListDocumentClassifierSummariesResponse,list_document_classifier_summaries_response\nListDocumentClassifiersRequest,list_document_classifiers_request\nListDocumentClassifiersResponse,list_document_classifiers_response\nListDocumentMetadataHistoryRequest,list_document_metadata_history_request\nListDocumentMetadataHistoryResponse,list_document_metadata_history_response\nListDocumentVersionsRequest,list_document_versions_request\nListDocumentVersionsResult,list_document_versions_result\nListDocumentsRequest,list_documents_request\nListDocumentsResult,list_documents_result\nListDomainAssociationsRequest,list_domain_associations_request\nListDomainAssociationsResult,list_domain_associations_result\nListDomainConfigurationsRequest,list_domain_configurations_request\nListDomainConfigurationsResponse,list_domain_configurations_response\nListDomainDeliverabilityCampaignsRequest,list_domain_deliverability_campaigns_request\nListDomainDeliverabilityCampaignsResponse,list_domain_deliverability_campaigns_response\nListDomainItem,list_domain_item\nListDomainNamesRequest,list_domain_names_request\nListDomainNamesResponse,list_domain_names_response\nListDomainsForPackageRequest,list_domains_for_package_request\nListDomainsForPackageResponse,list_domains_for_package_response\nListDomainsInput,list_domains_input\nListDomainsRequest,list_domains_request\nListDomainsResponse,list_domains_response\nListDomainsResult,list_domains_result\nListDominantLanguageDetectionJobsRequest,list_dominant_language_detection_jobs_request\nListDominantLanguageDetectionJobsResponse,list_dominant_language_detection_jobs_response\nListEarthObservationJobInput,list_earth_observation_job_input\nListEarthObservationJobOutput,list_earth_observation_job_output\nListEarthObservationJobOutputConfig,list_earth_observation_job_output_config\nListEdgeAgentConfigurationsEdgeConfig,list_edge_agent_configurations_edge_config\nListEdgeAgentConfigurationsInput,list_edge_agent_configurations_input\nListEdgeAgentConfigurationsOutput,list_edge_agent_configurations_output\nListEdgeDeploymentPlansRequest,list_edge_deployment_plans_request\nListEdgeDeploymentPlansResponse,list_edge_deployment_plans_response\nListEdgePackagingJobsRequest,list_edge_packaging_jobs_request\nListEdgePackagingJobsResponse,list_edge_packaging_jobs_response\nListEffectiveDeploymentsRequest,list_effective_deployments_request\nListEffectiveDeploymentsResponse,list_effective_deployments_response\nListElasticsearchInstanceTypesRequest,list_elasticsearch_instance_types_request\nListElasticsearchInstanceTypesResponse,list_elasticsearch_instance_types_response\nListElasticsearchVersionsRequest,list_elasticsearch_versions_request\nListElasticsearchVersionsResponse,list_elasticsearch_versions_response\nListEmailIdentitiesRequest,list_email_identities_request\nListEmailIdentitiesResponse,list_email_identities_response\nListEmailTemplatesRequest,list_email_templates_request\nListEmailTemplatesResponse,list_email_templates_response\nListEnabledControlsInput,list_enabled_controls_input\nListEnabledControlsOutput,list_enabled_controls_output\nListEnabledProductsForImportRequest,list_enabled_products_for_import_request\nListEnabledProductsForImportResponse,list_enabled_products_for_import_response\nListEndpointAccessRequest,list_endpoint_access_request\nListEndpointAccessResponse,list_endpoint_access_response\nListEndpointConfigsInput,list_endpoint_configs_input\nListEndpointConfigsOutput,list_endpoint_configs_output\nListEndpointGroupsRequest,list_endpoint_groups_request\nListEndpointGroupsResponse,list_endpoint_groups_response\nListEndpointsByPlatformApplicationInput,list_endpoints_by_platform_application_input\nListEndpointsByPlatformApplicationResponse,list_endpoints_by_platform_application_response\nListEndpointsInput,list_endpoints_input\nListEndpointsOutput,list_endpoints_output\nListEndpointsRequest,list_endpoints_request\nListEndpointsResponse,list_endpoints_response\nListEndpointsResult,list_endpoints_result\nListEngagementsRequest,list_engagements_request\nListEngagementsResult,list_engagements_result\nListEngineVersionsInput,list_engine_versions_input\nListEngineVersionsOutput,list_engine_versions_output\nListEngineVersionsRequest,list_engine_versions_request\nListEngineVersionsResponse,list_engine_versions_response\nListEntitiesDetectionJobsRequest,list_entities_detection_jobs_request\nListEntitiesDetectionJobsResponse,list_entities_detection_jobs_response\nListEntitiesDetectionV2JobsRequest,list_entities_detection_v2_jobs_request\nListEntitiesDetectionV2JobsResponse,list_entities_detection_v2_jobs_response\nListEntitiesForPolicyRequest,list_entities_for_policy_request\nListEntitiesForPolicyResponse,list_entities_for_policy_response\nListEntitiesRequest,list_entities_request\nListEntitiesResponse,list_entities_response\nListEntitledApplicationsRequest,list_entitled_applications_request\nListEntitledApplicationsResult,list_entitled_applications_result\nListEntitlementsRequest,list_entitlements_request\nListEntitlementsResponse,list_entitlements_response\nListEntityPersonasRequest,list_entity_personas_request\nListEntityPersonasResponse,list_entity_personas_response\nListEntityRecognizerSummariesRequest,list_entity_recognizer_summaries_request\nListEntityRecognizerSummariesResponse,list_entity_recognizer_summaries_response\nListEntityRecognizersRequest,list_entity_recognizers_request\nListEntityRecognizersResponse,list_entity_recognizers_response\nListEnvironmentAccountConnectionsInput,list_environment_account_connections_input\nListEnvironmentAccountConnectionsOutput,list_environment_account_connections_output\nListEnvironmentOutputsInput,list_environment_outputs_input\nListEnvironmentOutputsOutput,list_environment_outputs_output\nListEnvironmentProvisionedResourcesInput,list_environment_provisioned_resources_input\nListEnvironmentProvisionedResourcesOutput,list_environment_provisioned_resources_output\nListEnvironmentTemplateVersionsInput,list_environment_template_versions_input\nListEnvironmentTemplateVersionsOutput,list_environment_template_versions_output\nListEnvironmentTemplatesInput,list_environment_templates_input\nListEnvironmentTemplatesOutput,list_environment_templates_output\nListEnvironmentVpcsRequest,list_environment_vpcs_request\nListEnvironmentVpcsResponse,list_environment_vpcs_response\nListEnvironmentsInput,list_environments_input\nListEnvironmentsOutput,list_environments_output\nListEnvironmentsRequest,list_environments_request\nListEnvironmentsResponse,list_environments_response\nListEnvironmentsResult,list_environments_result\nListEphemeridesRequest,list_ephemerides_request\nListEphemeridesResponse,list_ephemerides_response\nListEulaAcceptancesRequest,list_eula_acceptances_request\nListEulaAcceptancesResponse,list_eula_acceptances_response\nListEulasRequest,list_eulas_request\nListEulasResponse,list_eulas_response\nListEvaluationFormVersionsRequest,list_evaluation_form_versions_request\nListEvaluationFormVersionsResponse,list_evaluation_form_versions_response\nListEvaluationFormsRequest,list_evaluation_forms_request\nListEvaluationFormsResponse,list_evaluation_forms_response\nListEventActionsRequest,list_event_actions_request\nListEventActionsResponse,list_event_actions_response\nListEventBusesRequest,list_event_buses_request\nListEventBusesResponse,list_event_buses_response\nListEventConfigurationsRequest,list_event_configurations_request\nListEventConfigurationsResponse,list_event_configurations_response\nListEventDataStoresRequest,list_event_data_stores_request\nListEventDataStoresResponse,list_event_data_stores_response\nListEventIntegrationAssociationsRequest,list_event_integration_associations_request\nListEventIntegrationAssociationsResponse,list_event_integration_associations_response\nListEventIntegrationsRequest,list_event_integrations_request\nListEventIntegrationsResponse,list_event_integrations_response\nListEventLogsRequest,list_event_logs_request\nListEventLogsResponse,list_event_logs_response\nListEventPredictionsRequest,list_event_predictions_request\nListEventPredictionsResult,list_event_predictions_result\nListEventSourceMappingsRequest,list_event_source_mappings_request\nListEventSourceMappingsResponse,list_event_source_mappings_response\nListEventSourcesRequest,list_event_sources_request\nListEventSourcesResponse,list_event_sources_response\nListEventStreamsRequest,list_event_streams_request\nListEventStreamsResponse,list_event_streams_response\nListEventSubscriptionsRequest,list_event_subscriptions_request\nListEventSubscriptionsResponse,list_event_subscriptions_response\nListEventTrackersRequest,list_event_trackers_request\nListEventTrackersResponse,list_event_trackers_response\nListEventTypesFilter,list_event_types_filter\nListEventTypesRequest,list_event_types_request\nListEventTypesResult,list_event_types_result\nListEventsDetectionJobsRequest,list_events_detection_jobs_request\nListEventsDetectionJobsResponse,list_events_detection_jobs_response\nListEventsFilters,list_events_filters\nListEventsRequest,list_events_request\nListEventsResponse,list_events_response\nListExclusionsRequest,list_exclusions_request\nListExclusionsResponse,list_exclusions_response\nListExecutionsInput,list_executions_input\nListExecutionsOutput,list_executions_output\nListExecutionsRequest,list_executions_request\nListExecutionsResponse,list_executions_response\nListExecutorsRequest,list_executors_request\nListExecutorsResponse,list_executors_response\nListExperienceEntitiesRequest,list_experience_entities_request\nListExperienceEntitiesResponse,list_experience_entities_response\nListExperiencesRequest,list_experiences_request\nListExperiencesResponse,list_experiences_response\nListExperimentTemplatesRequest,list_experiment_templates_request\nListExperimentTemplatesResponse,list_experiment_templates_response\nListExperimentsRequest,list_experiments_request\nListExperimentsResponse,list_experiments_response\nListExplainabilitiesRequest,list_explainabilities_request\nListExplainabilitiesResponse,list_explainabilities_response\nListExplainabilityExportsRequest,list_explainability_exports_request\nListExplainabilityExportsResponse,list_explainability_exports_response\nListExportErrorsRequest,list_export_errors_request\nListExportErrorsResponse,list_export_errors_response\nListExportJobsRequest,list_export_jobs_request\nListExportJobsResponse,list_export_jobs_response\nListExportsInput,list_exports_input\nListExportsOutput,list_exports_output\nListExportsRequest,list_exports_request\nListExportsRequestFilters,list_exports_request_filters\nListExportsResponse,list_exports_response\nListExtensibleSourceServersRequest,list_extensible_source_servers_request\nListExtensibleSourceServersResponse,list_extensible_source_servers_response\nListExtensionAssociationsRequest,list_extension_associations_request\nListExtensionVersionsRequest,list_extension_versions_request\nListExtensionVersionsResult,list_extension_versions_result\nListExtensionsRequest,list_extensions_request\nListExtensionsResult,list_extensions_result\nListFHIRDatastoresRequest,list_fhir_datastores_request\nListFHIRDatastoresResponse,list_fhir_datastores_response\nListFHIRExportJobsRequest,list_fhir_export_jobs_request\nListFHIRExportJobsResponse,list_fhir_export_jobs_response\nListFHIRImportJobsRequest,list_fhir_import_jobs_request\nListFHIRImportJobsResponse,list_fhir_import_jobs_response\nListFacesRequest,list_faces_request\nListFacesResponse,list_faces_response\nListFacetAttributesRequest,list_facet_attributes_request\nListFacetAttributesResponse,list_facet_attributes_response\nListFacetNamesRequest,list_facet_names_request\nListFacetNamesResponse,list_facet_names_response\nListFailuresForLicenseConfigurationOperationsRequest,list_failures_for_license_configuration_operations_request\nListFailuresForLicenseConfigurationOperationsResponse,list_failures_for_license_configuration_operations_response\nListFaqsRequest,list_faqs_request\nListFaqsResponse,list_faqs_response\nListFargateProfilesRequest,list_fargate_profiles_request\nListFargateProfilesResponse,list_fargate_profiles_response\nListFeatureGroupsRequest,list_feature_groups_request\nListFeatureGroupsResponse,list_feature_groups_response\nListFeaturedResultsSetsRequest,list_featured_results_sets_request\nListFeaturedResultsSetsResponse,list_featured_results_sets_response\nListFeaturesRequest,list_features_request\nListFeaturesResponse,list_features_response\nListFieldLevelEncryptionConfigsRequest,list_field_level_encryption_configs_request\nListFieldLevelEncryptionConfigsResult,list_field_level_encryption_configs_result\nListFieldLevelEncryptionProfilesRequest,list_field_level_encryption_profiles_request\nListFieldLevelEncryptionProfilesResult,list_field_level_encryption_profiles_result\nListFieldOptionsRequest,list_field_options_request\nListFieldOptionsResponse,list_field_options_response\nListFieldsRequest,list_fields_request\nListFieldsResponse,list_fields_response\nListFileCommitHistoryRequest,list_file_commit_history_request\nListFileCommitHistoryResponse,list_file_commit_history_response\nListFileSharesInput,list_file_shares_input\nListFileSharesOutput,list_file_shares_output\nListFileSystemAssociationsInput,list_file_system_associations_input\nListFileSystemAssociationsOutput,list_file_system_associations_output\nListFiltersRequest,list_filters_request\nListFiltersResponse,list_filters_response\nListFindingAggregationsRequest,list_finding_aggregations_request\nListFindingAggregationsResponse,list_finding_aggregations_response\nListFindingAggregatorsRequest,list_finding_aggregators_request\nListFindingAggregatorsResponse,list_finding_aggregators_response\nListFindingsFiltersRequest,list_findings_filters_request\nListFindingsFiltersResponse,list_findings_filters_response\nListFindingsMetricsRequest,list_findings_metrics_request\nListFindingsMetricsResponse,list_findings_metrics_response\nListFindingsReportsRequest,list_findings_reports_request\nListFindingsReportsResponse,list_findings_reports_response\nListFindingsRequest,list_findings_request\nListFindingsResponse,list_findings_response\nListFirewallConfigsRequest,list_firewall_configs_request\nListFirewallConfigsResponse,list_firewall_configs_response\nListFirewallDomainListsRequest,list_firewall_domain_lists_request\nListFirewallDomainListsResponse,list_firewall_domain_lists_response\nListFirewallDomainsRequest,list_firewall_domains_request\nListFirewallDomainsResponse,list_firewall_domains_response\nListFirewallPoliciesRequest,list_firewall_policies_request\nListFirewallPoliciesResponse,list_firewall_policies_response\nListFirewallRuleGroupAssociationsRequest,list_firewall_rule_group_associations_request\nListFirewallRuleGroupAssociationsResponse,list_firewall_rule_group_associations_response\nListFirewallRuleGroupsRequest,list_firewall_rule_groups_request\nListFirewallRuleGroupsResponse,list_firewall_rule_groups_response\nListFirewallRulesRequest,list_firewall_rules_request\nListFirewallRulesResponse,list_firewall_rules_response\nListFirewallsRequest,list_firewalls_request\nListFirewallsResponse,list_firewalls_response\nListFleetMetricsRequest,list_fleet_metrics_request\nListFleetMetricsResponse,list_fleet_metrics_response\nListFleetsForVehicleRequest,list_fleets_for_vehicle_request\nListFleetsForVehicleResponse,list_fleets_for_vehicle_response\nListFleetsInput,list_fleets_input\nListFleetsOutput,list_fleets_output\nListFleetsRequest,list_fleets_request\nListFleetsResponse,list_fleets_response\nListFlowDefinitionsRequest,list_flow_definitions_request\nListFlowDefinitionsResponse,list_flow_definitions_response\nListFlowExecutionMessagesRequest,list_flow_execution_messages_request\nListFlowExecutionMessagesResponse,list_flow_execution_messages_response\nListFlowsRequest,list_flows_request\nListFlowsResponse,list_flows_response\nListFlywheelIterationHistoryRequest,list_flywheel_iteration_history_request\nListFlywheelIterationHistoryResponse,list_flywheel_iteration_history_response\nListFlywheelsRequest,list_flywheels_request\nListFlywheelsResponse,list_flywheels_response\nListFolderMembersRequest,list_folder_members_request\nListFolderMembersResponse,list_folder_members_response\nListFoldersRequest,list_folders_request\nListFoldersResponse,list_folders_response\nListForecastExportJobsRequest,list_forecast_export_jobs_request\nListForecastExportJobsResponse,list_forecast_export_jobs_response\nListForecastsRequest,list_forecasts_request\nListForecastsResponse,list_forecasts_response\nListFormsRequest,list_forms_request\nListFormsResponse,list_forms_response\nListFoundationModelsRequest,list_foundation_models_request\nListFoundationModelsResponse,list_foundation_models_response\nListFragmentsInput,list_fragments_input\nListFragmentsOutput,list_fragments_output\nListFrameworksInput,list_frameworks_input\nListFrameworksOutput,list_frameworks_output\nListFraudsterRegistrationJobsRequest,list_fraudster_registration_jobs_request\nListFraudsterRegistrationJobsResponse,list_fraudster_registration_jobs_response\nListFraudstersRequest,list_fraudsters_request\nListFraudstersResponse,list_fraudsters_response\nListFunctionDefinitionVersionsRequest,list_function_definition_versions_request\nListFunctionDefinitionVersionsResponse,list_function_definition_versions_response\nListFunctionDefinitionsRequest,list_function_definitions_request\nListFunctionDefinitionsResponse,list_function_definitions_response\nListFunctionEventInvokeConfigsRequest,list_function_event_invoke_configs_request\nListFunctionEventInvokeConfigsResponse,list_function_event_invoke_configs_response\nListFunctionUrlConfigsRequest,list_function_url_configs_request\nListFunctionUrlConfigsResponse,list_function_url_configs_response\nListFunctionsByCodeSigningConfigRequest,list_functions_by_code_signing_config_request\nListFunctionsByCodeSigningConfigResponse,list_functions_by_code_signing_config_response\nListFunctionsRequest,list_functions_request\nListFunctionsResponse,list_functions_response\nListFunctionsResult,list_functions_result\nListFuotaTasksRequest,list_fuota_tasks_request\nListFuotaTasksResponse,list_fuota_tasks_response\nListGameServerGroupsInput,list_game_server_groups_input\nListGameServerGroupsOutput,list_game_server_groups_output\nListGameServersInput,list_game_servers_input\nListGameServersOutput,list_game_servers_output\nListGamesRequest,list_games_request\nListGamesResult,list_games_result\nListGatewayGroupsRequest,list_gateway_groups_request\nListGatewayGroupsResponse,list_gateway_groups_response\nListGatewayInstancesRequest,list_gateway_instances_request\nListGatewayInstancesResponse,list_gateway_instances_response\nListGatewayRoutesInput,list_gateway_routes_input\nListGatewayRoutesOutput,list_gateway_routes_output\nListGatewaysInput,list_gateways_input\nListGatewaysOutput,list_gateways_output\nListGatewaysRequest,list_gateways_request\nListGatewaysResponse,list_gateways_response\nListGeneratedCodeJobsRequest,list_generated_code_jobs_request\nListGeneratedCodeJobsResult,list_generated_code_jobs_result\nListGeoLocationsRequest,list_geo_locations_request\nListGeoLocationsResponse,list_geo_locations_response\nListGeoMatchSetsRequest,list_geo_match_sets_request\nListGeoMatchSetsResponse,list_geo_match_sets_response\nListGeofenceCollectionsRequest,list_geofence_collections_request\nListGeofenceCollectionsResponse,list_geofence_collections_response\nListGeofenceCollectionsResponseEntry,list_geofence_collections_response_entry\nListGeofenceResponseEntry,list_geofence_response_entry\nListGeofencesRequest,list_geofences_request\nListGeofencesResponse,list_geofences_response\nListGitHubAccountTokenNamesInput,list_git_hub_account_token_names_input\nListGitHubAccountTokenNamesOutput,list_git_hub_account_token_names_output\nListGlobalTablesInput,list_global_tables_input\nListGlobalTablesOutput,list_global_tables_output\nListGrantsRequest,list_grants_request\nListGrantsResponse,list_grants_response\nListGraphqlApisRequest,list_graphql_apis_request\nListGraphqlApisResponse,list_graphql_apis_response\nListGraphsRequest,list_graphs_request\nListGraphsResponse,list_graphs_response\nListGremlinQueriesInput,list_gremlin_queries_input\nListGremlinQueriesOutput,list_gremlin_queries_output\nListGroundStationsRequest,list_ground_stations_request\nListGroundStationsResponse,list_ground_stations_response\nListGroupCertificateAuthoritiesRequest,list_group_certificate_authorities_request\nListGroupCertificateAuthoritiesResponse,list_group_certificate_authorities_response\nListGroupMembersRequest,list_group_members_request\nListGroupMembersResponse,list_group_members_response\nListGroupMembershipsForMemberRequest,list_group_memberships_for_member_request\nListGroupMembershipsForMemberResponse,list_group_memberships_for_member_response\nListGroupMembershipsRequest,list_group_memberships_request\nListGroupMembershipsResponse,list_group_memberships_response\nListGroupPoliciesRequest,list_group_policies_request\nListGroupPoliciesResponse,list_group_policies_response\nListGroupResourcesInput,list_group_resources_input\nListGroupResourcesItem,list_group_resources_item\nListGroupResourcesOutput,list_group_resources_output\nListGroupResourcesRequest,list_group_resources_request\nListGroupResourcesResponse,list_group_resources_response\nListGroupVersionsRequest,list_group_versions_request\nListGroupVersionsResponse,list_group_versions_response\nListGroupsFilters,list_groups_filters\nListGroupsForEntityFilters,list_groups_for_entity_filters\nListGroupsForEntityRequest,list_groups_for_entity_request\nListGroupsForEntityResponse,list_groups_for_entity_response\nListGroupsForUserRequest,list_groups_for_user_request\nListGroupsForUserResponse,list_groups_for_user_response\nListGroupsInput,list_groups_input\nListGroupsOlderThanOrderingIdRequest,list_groups_older_than_ordering_id_request\nListGroupsOlderThanOrderingIdResponse,list_groups_older_than_ordering_id_response\nListGroupsOutput,list_groups_output\nListGroupsRequest,list_groups_request\nListGroupsResponse,list_groups_response\nListHITsForQualificationTypeRequest,list_hits_for_qualification_type_request\nListHITsForQualificationTypeResponse,list_hits_for_qualification_type_response\nListHITsRequest,list_hits_request\nListHITsResponse,list_hits_response\nListHandshakesForAccountRequest,list_handshakes_for_account_request\nListHandshakesForAccountResponse,list_handshakes_for_account_response\nListHandshakesForOrganizationRequest,list_handshakes_for_organization_request\nListHandshakesForOrganizationResponse,list_handshakes_for_organization_response\nListHapgsRequest,list_hapgs_request\nListHapgsResponse,list_hapgs_response\nListHarvestJobsRequest,list_harvest_jobs_request\nListHarvestJobsResponse,list_harvest_jobs_response\nListHealthChecksRequest,list_health_checks_request\nListHealthChecksResponse,list_health_checks_response\nListHealthEventsInput,list_health_events_input\nListHealthEventsOutput,list_health_events_output\nListHlsManifestConfiguration,list_hls_manifest_configuration\nListHostKeysRequest,list_host_keys_request\nListHostKeysResponse,list_host_keys_response\nListHostedConfigurationVersionsRequest,list_hosted_configuration_versions_request\nListHostedZonesByNameRequest,list_hosted_zones_by_name_request\nListHostedZonesByNameResponse,list_hosted_zones_by_name_response\nListHostedZonesByVPCRequest,list_hosted_zones_by_vpc_request\nListHostedZonesByVPCResponse,list_hosted_zones_by_vpc_response\nListHostedZonesRequest,list_hosted_zones_request\nListHostedZonesResponse,list_hosted_zones_response\nListHostsInput,list_hosts_input\nListHostsOutput,list_hosts_output\nListHoursOfOperationsRequest,list_hours_of_operations_request\nListHoursOfOperationsResponse,list_hours_of_operations_response\nListHsmsRequest,list_hsms_request\nListHsmsResponse,list_hsms_response\nListHubContentVersionsRequest,list_hub_content_versions_request\nListHubContentVersionsResponse,list_hub_content_versions_response\nListHubContentsRequest,list_hub_contents_request\nListHubContentsResponse,list_hub_contents_response\nListHubsRequest,list_hubs_request\nListHubsResponse,list_hubs_response\nListHumanLoopsRequest,list_human_loops_request\nListHumanLoopsResponse,list_human_loops_response\nListHumanTaskUisRequest,list_human_task_uis_request\nListHumanTaskUisResponse,list_human_task_uis_response\nListHyperParameterTuningJobsRequest,list_hyper_parameter_tuning_jobs_request\nListHyperParameterTuningJobsResponse,list_hyper_parameter_tuning_jobs_response\nListHypervisorsInput,list_hypervisors_input\nListHypervisorsOutput,list_hypervisors_output\nListIAMPolicyAssignmentsForUserRequest,list_iam_policy_assignments_for_user_request\nListIAMPolicyAssignmentsForUserResponse,list_iam_policy_assignments_for_user_response\nListIAMPolicyAssignmentsRequest,list_iam_policy_assignments_request\nListIAMPolicyAssignmentsResponse,list_iam_policy_assignments_response\nListICD10CMInferenceJobsRequest,list_icd10_cm_inference_jobs_request\nListICD10CMInferenceJobsResponse,list_icd10_cm_inference_jobs_response\nListIPSetsRequest,list_ip_sets_request\nListIPSetsResponse,list_ip_sets_response\nListId,list_id\nListIdentitiesInput,list_identities_input\nListIdentitiesRequest,list_identities_request\nListIdentitiesResponse,list_identities_response\nListIdentityPoliciesRequest,list_identity_policies_request\nListIdentityPoliciesResponse,list_identity_policies_response\nListIdentityPoolUsageRequest,list_identity_pool_usage_request\nListIdentityPoolUsageResponse,list_identity_pool_usage_response\nListIdentityPoolsInput,list_identity_pools_input\nListIdentityPoolsResponse,list_identity_pools_response\nListIdentityProviderConfigsRequest,list_identity_provider_configs_request\nListIdentityProviderConfigsResponse,list_identity_provider_configs_response\nListIdentityProvidersRequest,list_identity_providers_request\nListIdentityProvidersResponse,list_identity_providers_response\nListIdentityResolutionJobsRequest,list_identity_resolution_jobs_request\nListIdentityResolutionJobsResponse,list_identity_resolution_jobs_response\nListIdentitySourcesInput,list_identity_sources_input\nListIdentitySourcesOutput,list_identity_sources_output\nListImageBuildVersionsRequest,list_image_build_versions_request\nListImageBuildVersionsResponse,list_image_build_versions_response\nListImagePackagesRequest,list_image_packages_request\nListImagePackagesResponse,list_image_packages_response\nListImagePipelineImagesRequest,list_image_pipeline_images_request\nListImagePipelineImagesResponse,list_image_pipeline_images_response\nListImagePipelinesRequest,list_image_pipelines_request\nListImagePipelinesResponse,list_image_pipelines_response\nListImageRecipesRequest,list_image_recipes_request\nListImageRecipesResponse,list_image_recipes_response\nListImageScanFindingAggregationsRequest,list_image_scan_finding_aggregations_request\nListImageScanFindingAggregationsResponse,list_image_scan_finding_aggregations_response\nListImageScanFindingsRequest,list_image_scan_findings_request\nListImageScanFindingsResponse,list_image_scan_findings_response\nListImageSetVersionsRequest,list_image_set_versions_request\nListImageSetVersionsResponse,list_image_set_versions_response\nListImageVersionsRequest,list_image_versions_request\nListImageVersionsResponse,list_image_versions_response\nListImagesFilter,list_images_filter\nListImagesInRecycleBinRequest,list_images_in_recycle_bin_request\nListImagesInRecycleBinResult,list_images_in_recycle_bin_result\nListImagesRequest,list_images_request\nListImagesResponse,list_images_response\nListImpersonationRolesRequest,list_impersonation_roles_request\nListImpersonationRolesResponse,list_impersonation_roles_response\nListImportErrorsRequest,list_import_errors_request\nListImportErrorsResponse,list_import_errors_response\nListImportFailuresRequest,list_import_failures_request\nListImportFailuresResponse,list_import_failures_response\nListImportFileTaskRequest,list_import_file_task_request\nListImportFileTaskResponse,list_import_file_task_response\nListImportJobsRequest,list_import_jobs_request\nListImportJobsResponse,list_import_jobs_response\nListImportsInput,list_imports_input\nListImportsOutput,list_imports_output\nListImportsRequest,list_imports_request\nListImportsRequestFilters,list_imports_request_filters\nListImportsResponse,list_imports_response\nListIncidentRecordsInput,list_incident_records_input\nListIncidentRecordsOutput,list_incident_records_output\nListIncomingTypedLinks,list_incoming_typed_links\nListIncomingTypedLinksRequest,list_incoming_typed_links_request\nListIncomingTypedLinksResponse,list_incoming_typed_links_response\nListIndex,list_index\nListIndexRequest,list_index_request\nListIndexResponse,list_index_response\nListIndexesInput,list_indexes_input\nListIndexesOutput,list_indexes_output\nListIndicesRequest,list_indices_request\nListIndicesResponse,list_indices_response\nListInferenceEventsRequest,list_inference_events_request\nListInferenceEventsResponse,list_inference_events_response\nListInferenceExecutionsRequest,list_inference_executions_request\nListInferenceExecutionsResponse,list_inference_executions_response\nListInferenceExperimentsRequest,list_inference_experiments_request\nListInferenceExperimentsResponse,list_inference_experiments_response\nListInferenceRecommendationsJobStepsRequest,list_inference_recommendations_job_steps_request\nListInferenceRecommendationsJobStepsResponse,list_inference_recommendations_job_steps_response\nListInferenceRecommendationsJobsRequest,list_inference_recommendations_jobs_request\nListInferenceRecommendationsJobsResponse,list_inference_recommendations_jobs_response\nListInferenceSchedulersRequest,list_inference_schedulers_request\nListInferenceSchedulersResponse,list_inference_schedulers_response\nListInfrastructureConfigurationsRequest,list_infrastructure_configurations_request\nListInfrastructureConfigurationsResponse,list_infrastructure_configurations_response\nListIngestionDestinationsRequest,list_ingestion_destinations_request\nListIngestionDestinationsResponse,list_ingestion_destinations_response\nListIngestionsRequest,list_ingestions_request\nListIngestionsResponse,list_ingestions_response\nListInputDeviceTransfersRequest,list_input_device_transfers_request\nListInputDeviceTransfersResponse,list_input_device_transfers_response\nListInputDevicesRequest,list_input_devices_request\nListInputDevicesResponse,list_input_devices_response\nListInputRoutingsRequest,list_input_routings_request\nListInputRoutingsResponse,list_input_routings_response\nListInputSecurityGroupsRequest,list_input_security_groups_request\nListInputSecurityGroupsResponse,list_input_security_groups_response\nListInputsRequest,list_inputs_request\nListInputsResponse,list_inputs_response\nListInsightsAnyStatusFilter,list_insights_any_status_filter\nListInsightsClosedStatusFilter,list_insights_closed_status_filter\nListInsightsOngoingStatusFilter,list_insights_ongoing_status_filter\nListInsightsRequest,list_insights_request\nListInsightsResponse,list_insights_response\nListInsightsStatusFilter,list_insights_status_filter\nListInstalledComponentsRequest,list_installed_components_request\nListInstalledComponentsResponse,list_installed_components_response\nListInstanceAttributesRequest,list_instance_attributes_request\nListInstanceAttributesResponse,list_instance_attributes_response\nListInstanceFleetsInput,list_instance_fleets_input\nListInstanceFleetsOutput,list_instance_fleets_output\nListInstanceGroupsInput,list_instance_groups_input\nListInstanceGroupsOutput,list_instance_groups_output\nListInstanceProfileTagsRequest,list_instance_profile_tags_request\nListInstanceProfileTagsResponse,list_instance_profile_tags_response\nListInstanceProfilesForRoleRequest,list_instance_profiles_for_role_request\nListInstanceProfilesForRoleResponse,list_instance_profiles_for_role_response\nListInstanceProfilesRequest,list_instance_profiles_request\nListInstanceProfilesResponse,list_instance_profiles_response\nListInstanceProfilesResult,list_instance_profiles_result\nListInstanceStorageConfigsRequest,list_instance_storage_configs_request\nListInstanceStorageConfigsResponse,list_instance_storage_configs_response\nListInstanceTypeDetailsRequest,list_instance_type_details_request\nListInstanceTypeDetailsResponse,list_instance_type_details_response\nListInstancesInput,list_instances_input\nListInstancesOutput,list_instances_output\nListInstancesRequest,list_instances_request\nListInstancesResponse,list_instances_response\nListIntegrationAssociationsRequest,list_integration_associations_request\nListIntegrationAssociationsResponse,list_integration_associations_response\nListIntegrationItem,list_integration_item\nListIntegrationsRequest,list_integrations_request\nListIntegrationsResponse,list_integrations_response\nListIntentMetricsRequest,list_intent_metrics_request\nListIntentMetricsResponse,list_intent_metrics_response\nListIntentPathsRequest,list_intent_paths_request\nListIntentPathsResponse,list_intent_paths_response\nListIntentStageMetricsRequest,list_intent_stage_metrics_request\nListIntentStageMetricsResponse,list_intent_stage_metrics_response\nListIntentsRequest,list_intents_request\nListIntentsResponse,list_intents_response\nListInvalidationsRequest,list_invalidations_request\nListInvalidationsResult,list_invalidations_result\nListInventoryEntriesRequest,list_inventory_entries_request\nListInventoryEntriesResult,list_inventory_entries_result\nListInvitationsInput,list_invitations_input\nListInvitationsOutput,list_invitations_output\nListInvitationsRequest,list_invitations_request\nListInvitationsResponse,list_invitations_response\nListIpAccessSettingsRequest,list_ip_access_settings_request\nListIpAccessSettingsResponse,list_ip_access_settings_response\nListIpRoutesRequest,list_ip_routes_request\nListIpRoutesResult,list_ip_routes_result\nListItemsRequest,list_items_request\nListItemsResponse,list_items_response\nListJobExecutionsForJobRequest,list_job_executions_for_job_request\nListJobExecutionsForJobResponse,list_job_executions_for_job_response\nListJobExecutionsForThingRequest,list_job_executions_for_thing_request\nListJobExecutionsForThingResponse,list_job_executions_for_thing_response\nListJobRunsRequest,list_job_runs_request\nListJobRunsResponse,list_job_runs_response\nListJobTemplatesRequest,list_job_templates_request\nListJobTemplatesResponse,list_job_templates_response\nListJobsByPipelineRequest,list_jobs_by_pipeline_request\nListJobsByPipelineResponse,list_jobs_by_pipeline_response\nListJobsByStatusRequest,list_jobs_by_status_request\nListJobsByStatusResponse,list_jobs_by_status_response\nListJobsFilterCriteria,list_jobs_filter_criteria\nListJobsFilterTerm,list_jobs_filter_term\nListJobsInput,list_jobs_input\nListJobsOutput,list_jobs_output\nListJobsRequest,list_jobs_request\nListJobsResponse,list_jobs_response\nListJobsResult,list_jobs_result\nListJobsSortCriteria,list_jobs_sort_criteria\nListJournalKinesisStreamsForLedgerRequest,list_journal_kinesis_streams_for_ledger_request\nListJournalKinesisStreamsForLedgerResponse,list_journal_kinesis_streams_for_ledger_response\nListJournalS3ExportsForLedgerRequest,list_journal_s3_exports_for_ledger_request\nListJournalS3ExportsForLedgerResponse,list_journal_s3_exports_for_ledger_response\nListJournalS3ExportsRequest,list_journal_s3_exports_request\nListJournalS3ExportsResponse,list_journal_s3_exports_response\nListJourneysRequest,list_journeys_request\nListJourneysResponse,list_journeys_response\nListKafkaVersionsRequest,list_kafka_versions_request\nListKafkaVersionsResponse,list_kafka_versions_response\nListKeyGroupsRequest,list_key_groups_request\nListKeyGroupsResult,list_key_groups_result\nListKeyPhrasesDetectionJobsRequest,list_key_phrases_detection_jobs_request\nListKeyPhrasesDetectionJobsResponse,list_key_phrases_detection_jobs_response\nListKeyPoliciesRequest,list_key_policies_request\nListKeyPoliciesResponse,list_key_policies_response\nListKeysInput,list_keys_input\nListKeysOutput,list_keys_output\nListKeysRequest,list_keys_request\nListKeysResponse,list_keys_response\nListKeysResponseEntry,list_keys_response_entry\nListKeyspacesRequest,list_keyspaces_request\nListKeyspacesResponse,list_keyspaces_response\nListKeywordsForDataSourceRequest,list_keywords_for_data_source_request\nListKeywordsForDataSourceResponse,list_keywords_for_data_source_response\nListKnowledgeBasesRequest,list_knowledge_bases_request\nListKnowledgeBasesResponse,list_knowledge_bases_response\nListKxChangesetsRequest,list_kx_changesets_request\nListKxChangesetsResponse,list_kx_changesets_response\nListKxClusterNodesRequest,list_kx_cluster_nodes_request\nListKxClusterNodesResponse,list_kx_cluster_nodes_response\nListKxClustersRequest,list_kx_clusters_request\nListKxClustersResponse,list_kx_clusters_response\nListKxDatabasesRequest,list_kx_databases_request\nListKxDatabasesResponse,list_kx_databases_response\nListKxEnvironmentsRequest,list_kx_environments_request\nListKxEnvironmentsResponse,list_kx_environments_response\nListKxUsersRequest,list_kx_users_request\nListKxUsersResponse,list_kx_users_response\nListLFTagsRequest,list_lf_tags_request\nListLFTagsResponse,list_lf_tags_response\nListLabelGroupsRequest,list_label_groups_request\nListLabelGroupsResponse,list_label_groups_response\nListLabelingJobsForWorkteamRequest,list_labeling_jobs_for_workteam_request\nListLabelingJobsForWorkteamResponse,list_labeling_jobs_for_workteam_response\nListLabelingJobsRequest,list_labeling_jobs_request\nListLabelingJobsResponse,list_labeling_jobs_response\nListLabelsRequest,list_labels_request\nListLabelsResponse,list_labels_response\nListLakeFormationOptInsRequest,list_lake_formation_opt_ins_request\nListLakeFormationOptInsResponse,list_lake_formation_opt_ins_response\nListLambdaFunctionsRequest,list_lambda_functions_request\nListLambdaFunctionsResponse,list_lambda_functions_response\nListLanguageModelsRequest,list_language_models_request\nListLanguageModelsResponse,list_language_models_response\nListLanguagesRequest,list_languages_request\nListLanguagesResponse,list_languages_response\nListLaunchActionsRequest,list_launch_actions_request\nListLaunchActionsResponse,list_launch_actions_response\nListLaunchPathsInput,list_launch_paths_input\nListLaunchPathsOutput,list_launch_paths_output\nListLaunchProfileMembersRequest,list_launch_profile_members_request\nListLaunchProfileMembersResponse,list_launch_profile_members_response\nListLaunchProfilesRequest,list_launch_profiles_request\nListLaunchProfilesResponse,list_launch_profiles_response\nListLaunchesRequest,list_launches_request\nListLaunchesResponse,list_launches_response\nListLayerVersionsRequest,list_layer_versions_request\nListLayerVersionsResponse,list_layer_versions_response\nListLayersRequest,list_layers_request\nListLayersResponse,list_layers_response\nListLayoutsRequest,list_layouts_request\nListLayoutsResponse,list_layouts_response\nListLedgersRequest,list_ledgers_request\nListLedgersResponse,list_ledgers_response\nListLegalHoldsInput,list_legal_holds_input\nListLegalHoldsOutput,list_legal_holds_output\nListLensReviewImprovementsInput,list_lens_review_improvements_input\nListLensReviewImprovementsOutput,list_lens_review_improvements_output\nListLensReviewsInput,list_lens_reviews_input\nListLensReviewsOutput,list_lens_reviews_output\nListLensSharesInput,list_lens_shares_input\nListLensSharesOutput,list_lens_shares_output\nListLensesInput,list_lenses_input\nListLensesOutput,list_lenses_output\nListLexBotsRequest,list_lex_bots_request\nListLexBotsResponse,list_lex_bots_response\nListLexiconsInput,list_lexicons_input\nListLexiconsOutput,list_lexicons_output\nListLicenseConfigurationsRequest,list_license_configurations_request\nListLicenseConfigurationsResponse,list_license_configurations_response\nListLicenseConversionTasksRequest,list_license_conversion_tasks_request\nListLicenseConversionTasksResponse,list_license_conversion_tasks_response\nListLicenseManagerReportGeneratorsRequest,list_license_manager_report_generators_request\nListLicenseManagerReportGeneratorsResponse,list_license_manager_report_generators_response\nListLicenseSpecificationsForResourceRequest,list_license_specifications_for_resource_request\nListLicenseSpecificationsForResourceResponse,list_license_specifications_for_resource_response\nListLicenseVersionsRequest,list_license_versions_request\nListLicenseVersionsResponse,list_license_versions_response\nListLicensesRequest,list_licenses_request\nListLicensesResponse,list_licenses_response\nListLineageGroupsRequest,list_lineage_groups_request\nListLineageGroupsResponse,list_lineage_groups_response\nListLinksInput,list_links_input\nListLinksItem,list_links_item\nListLinksOutput,list_links_output\nListLinuxSubscriptionInstancesRequest,list_linux_subscription_instances_request\nListLinuxSubscriptionInstancesResponse,list_linux_subscription_instances_response\nListLinuxSubscriptionsRequest,list_linux_subscriptions_request\nListLinuxSubscriptionsResponse,list_linux_subscriptions_response\nListListenersRequest,list_listeners_request\nListListenersResponse,list_listeners_response\nListLiveSourcesRequest,list_live_sources_request\nListLiveSourcesResponse,list_live_sources_response\nListLoaderJobsInput,list_loader_jobs_input\nListLoaderJobsOutput,list_loader_jobs_output\nListLocalDisksInput,list_local_disks_input\nListLocalDisksOutput,list_local_disks_output\nListLocationsInput,list_locations_input\nListLocationsOutput,list_locations_output\nListLocationsRequest,list_locations_request\nListLocationsResponse,list_locations_response\nListLogPatternSetsRequest,list_log_pattern_sets_request\nListLogPatternSetsResponse,list_log_pattern_sets_response\nListLogPatternsRequest,list_log_patterns_request\nListLogPatternsResponse,list_log_patterns_response\nListLogSourcesRequest,list_log_sources_request\nListLogSourcesResponse,list_log_sources_response\nListLogSubscriptionsRequest,list_log_subscriptions_request\nListLogSubscriptionsResult,list_log_subscriptions_result\nListLoggerDefinitionVersionsRequest,list_logger_definition_versions_request\nListLoggerDefinitionVersionsResponse,list_logger_definition_versions_response\nListLoggerDefinitionsRequest,list_logger_definitions_request\nListLoggerDefinitionsResponse,list_logger_definitions_response\nListLoggingConfigurationsRequest,list_logging_configurations_request\nListLoggingConfigurationsResponse,list_logging_configurations_response\nListLongTermPricingRequest,list_long_term_pricing_request\nListLongTermPricingResult,list_long_term_pricing_result\nListLowLatencyHlsManifestConfiguration,list_low_latency_hls_manifest_configuration\nListLunaClientsRequest,list_luna_clients_request\nListLunaClientsResponse,list_luna_clients_response\nListMFADeviceTagsRequest,list_mfa_device_tags_request\nListMFADeviceTagsResponse,list_mfa_device_tags_response\nListMFADevicesRequest,list_mfa_devices_request\nListMFADevicesResponse,list_mfa_devices_response\nListMLDataProcessingJobsInput,list_ml_data_processing_jobs_input\nListMLDataProcessingJobsOutput,list_ml_data_processing_jobs_output\nListMLEndpointsInput,list_ml_endpoints_input\nListMLEndpointsOutput,list_ml_endpoints_output\nListMLModelTrainingJobsInput,list_ml_model_training_jobs_input\nListMLModelTrainingJobsOutput,list_ml_model_training_jobs_output\nListMLModelTransformJobsInput,list_ml_model_transform_jobs_input\nListMLModelTransformJobsOutput,list_ml_model_transform_jobs_output\nListMLTransformsRequest,list_ml_transforms_request\nListMLTransformsResponse,list_ml_transforms_response\nListMailDomainsRequest,list_mail_domains_request\nListMailDomainsResponse,list_mail_domains_response\nListMailboxExportJobsRequest,list_mailbox_export_jobs_request\nListMailboxExportJobsResponse,list_mailbox_export_jobs_response\nListMailboxPermissionsRequest,list_mailbox_permissions_request\nListMailboxPermissionsResponse,list_mailbox_permissions_response\nListManagedAccountsRequest,list_managed_accounts_request\nListManagedAccountsResponse,list_managed_accounts_response\nListManagedDataIdentifiersRequest,list_managed_data_identifiers_request\nListManagedDataIdentifiersResponse,list_managed_data_identifiers_response\nListManagedEndpointsRequest,list_managed_endpoints_request\nListManagedEndpointsResponse,list_managed_endpoints_response\nListManagedInsightRulesInput,list_managed_insight_rules_input\nListManagedInsightRulesOutput,list_managed_insight_rules_output\nListManagedJobTemplatesRequest,list_managed_job_templates_request\nListManagedJobTemplatesResponse,list_managed_job_templates_response\nListManagedPoliciesInPermissionSetRequest,list_managed_policies_in_permission_set_request\nListManagedPoliciesInPermissionSetResponse,list_managed_policies_in_permission_set_response\nListManagedResourcesRequest,list_managed_resources_request\nListManagedResourcesResponse,list_managed_resources_response\nListManagedRuleSetsRequest,list_managed_rule_sets_request\nListManagedRuleSetsResponse,list_managed_rule_sets_response\nListManagedSchemaArnsRequest,list_managed_schema_arns_request\nListManagedSchemaArnsResponse,list_managed_schema_arns_response\nListManagementOptions,list_management_options\nListMapRunsInput,list_map_runs_input\nListMapRunsOutput,list_map_runs_output\nListMapsRequest,list_maps_request\nListMapsResponse,list_maps_response\nListMapsResponseEntry,list_maps_response_entry\nListMatchingJobsInput,list_matching_jobs_input\nListMatchingJobsOutput,list_matching_jobs_output\nListMatchingWorkflowsInput,list_matching_workflows_input\nListMatchingWorkflowsOutput,list_matching_workflows_output\nListMediaCapturePipelinesRequest,list_media_capture_pipelines_request\nListMediaCapturePipelinesResponse,list_media_capture_pipelines_response\nListMediaInsightsPipelineConfigurationsRequest,list_media_insights_pipeline_configurations_request\nListMediaInsightsPipelineConfigurationsResponse,list_media_insights_pipeline_configurations_response\nListMediaPipelineKinesisVideoStreamPoolsRequest,list_media_pipeline_kinesis_video_stream_pools_request\nListMediaPipelineKinesisVideoStreamPoolsResponse,list_media_pipeline_kinesis_video_stream_pools_response\nListMediaPipelinesRequest,list_media_pipelines_request\nListMediaPipelinesResponse,list_media_pipelines_response\nListMedicalTranscriptionJobsRequest,list_medical_transcription_jobs_request\nListMedicalTranscriptionJobsResponse,list_medical_transcription_jobs_response\nListMedicalVocabulariesRequest,list_medical_vocabularies_request\nListMedicalVocabulariesResponse,list_medical_vocabularies_response\nListMeetingTagsRequest,list_meeting_tags_request\nListMeetingTagsResponse,list_meeting_tags_response\nListMeetingsRequest,list_meetings_request\nListMeetingsResponse,list_meetings_response\nListMemberAccountsRequest,list_member_accounts_request\nListMemberAccountsResponse,list_member_accounts_response\nListMemberAccountsResult,list_member_accounts_result\nListMembersInput,list_members_input\nListMembersOutput,list_members_output\nListMembersRequest,list_members_request\nListMembersResponse,list_members_response\nListMembershipsInput,list_memberships_input\nListMembershipsOutput,list_memberships_output\nListMeshesInput,list_meshes_input\nListMeshesOutput,list_meshes_output\nListMessageMoveTasksRequest,list_message_move_tasks_request\nListMessageMoveTasksResult,list_message_move_tasks_result\nListMessageMoveTasksResultEntry,list_message_move_tasks_result_entry\nListMetricAttributionMetricsRequest,list_metric_attribution_metrics_request\nListMetricAttributionMetricsResponse,list_metric_attribution_metrics_response\nListMetricAttributionsRequest,list_metric_attributions_request\nListMetricAttributionsResponse,list_metric_attributions_response\nListMetricSetsRequest,list_metric_sets_request\nListMetricSetsResponse,list_metric_sets_response\nListMetricStreamsInput,list_metric_streams_input\nListMetricStreamsOutput,list_metric_streams_output\nListMetricValuesRequest,list_metric_values_request\nListMetricValuesResponse,list_metric_values_response\nListMetricsInput,list_metrics_input\nListMetricsOutput,list_metrics_output\nListMigrationTasksRequest,list_migration_tasks_request\nListMigrationTasksResult,list_migration_tasks_result\nListMigrationWorkflowTemplatesRequest,list_migration_workflow_templates_request\nListMigrationWorkflowTemplatesResponse,list_migration_workflow_templates_response\nListMigrationWorkflowsRequest,list_migration_workflows_request\nListMigrationWorkflowsResponse,list_migration_workflows_response\nListMilestonesInput,list_milestones_input\nListMilestonesOutput,list_milestones_output\nListMissionProfilesRequest,list_mission_profiles_request\nListMissionProfilesResponse,list_mission_profiles_response\nListMitigationActionsRequest,list_mitigation_actions_request\nListMitigationActionsResponse,list_mitigation_actions_response\nListMobileDeviceAccessOverridesRequest,list_mobile_device_access_overrides_request\nListMobileDeviceAccessOverridesResponse,list_mobile_device_access_overrides_response\nListMobileDeviceAccessRulesRequest,list_mobile_device_access_rules_request\nListMobileDeviceAccessRulesResponse,list_mobile_device_access_rules_response\nListMobileSdkReleasesRequest,list_mobile_sdk_releases_request\nListMobileSdkReleasesResponse,list_mobile_sdk_releases_response\nListModelBiasJobDefinitionsRequest,list_model_bias_job_definitions_request\nListModelBiasJobDefinitionsResponse,list_model_bias_job_definitions_response\nListModelCardExportJobsRequest,list_model_card_export_jobs_request\nListModelCardExportJobsResponse,list_model_card_export_jobs_response\nListModelCardVersionsRequest,list_model_card_versions_request\nListModelCardVersionsResponse,list_model_card_versions_response\nListModelCardsRequest,list_model_cards_request\nListModelCardsResponse,list_model_cards_response\nListModelCustomizationJobsRequest,list_model_customization_jobs_request\nListModelCustomizationJobsResponse,list_model_customization_jobs_response\nListModelExplainabilityJobDefinitionsRequest,list_model_explainability_job_definitions_request\nListModelExplainabilityJobDefinitionsResponse,list_model_explainability_job_definitions_response\nListModelManifestNodesRequest,list_model_manifest_nodes_request\nListModelManifestNodesResponse,list_model_manifest_nodes_response\nListModelManifestsRequest,list_model_manifests_request\nListModelManifestsResponse,list_model_manifests_response\nListModelMetadataRequest,list_model_metadata_request\nListModelMetadataResponse,list_model_metadata_response\nListModelPackageGroupsInput,list_model_package_groups_input\nListModelPackageGroupsOutput,list_model_package_groups_output\nListModelPackagesInput,list_model_packages_input\nListModelPackagesOutput,list_model_packages_output\nListModelPackagingJobsRequest,list_model_packaging_jobs_request\nListModelPackagingJobsResponse,list_model_packaging_jobs_response\nListModelQualityJobDefinitionsRequest,list_model_quality_job_definitions_request\nListModelQualityJobDefinitionsResponse,list_model_quality_job_definitions_response\nListModelVersionsRequest,list_model_versions_request\nListModelVersionsResponse,list_model_versions_response\nListModelsInput,list_models_input\nListModelsOutput,list_models_output\nListModelsRequest,list_models_request\nListModelsResponse,list_models_response\nListMonitorEvaluationsRequest,list_monitor_evaluations_request\nListMonitorEvaluationsResponse,list_monitor_evaluations_response\nListMonitoredResourcesFilters,list_monitored_resources_filters\nListMonitoredResourcesRequest,list_monitored_resources_request\nListMonitoredResourcesResponse,list_monitored_resources_response\nListMonitoringAlertHistoryRequest,list_monitoring_alert_history_request\nListMonitoringAlertHistoryResponse,list_monitoring_alert_history_response\nListMonitoringAlertsRequest,list_monitoring_alerts_request\nListMonitoringAlertsResponse,list_monitoring_alerts_response\nListMonitoringExecutionsRequest,list_monitoring_executions_request\nListMonitoringExecutionsResponse,list_monitoring_executions_response\nListMonitoringSchedulesRequest,list_monitoring_schedules_request\nListMonitoringSchedulesResponse,list_monitoring_schedules_response\nListMonitorsInput,list_monitors_input\nListMonitorsOutput,list_monitors_output\nListMonitorsRequest,list_monitors_request\nListMonitorsResponse,list_monitors_response\nListMultiRegionAccessPointsRequest,list_multi_region_access_points_request\nListMultiRegionAccessPointsResult,list_multi_region_access_points_result\nListMulticastGroupsByFuotaTaskRequest,list_multicast_groups_by_fuota_task_request\nListMulticastGroupsByFuotaTaskResponse,list_multicast_groups_by_fuota_task_response\nListMulticastGroupsRequest,list_multicast_groups_request\nListMulticastGroupsResponse,list_multicast_groups_response\nListMultipartReadSetUploadsRequest,list_multipart_read_set_uploads_request\nListMultipartReadSetUploadsResponse,list_multipart_read_set_uploads_response\nListMultipartUploadsInput,list_multipart_uploads_input\nListMultipartUploadsOutput,list_multipart_uploads_output\nListMultipartUploadsRequest,list_multipart_uploads_request\nListMultiplexProgramsRequest,list_multiplex_programs_request\nListMultiplexProgramsResponse,list_multiplex_programs_response\nListMultiplexesRequest,list_multiplexes_request\nListMultiplexesResponse,list_multiplexes_response\nListName,list_name\nListNamedQueriesInput,list_named_queries_input\nListNamedQueriesOutput,list_named_queries_output\nListNamedShadowsForThingRequest,list_named_shadows_for_thing_request\nListNamedShadowsForThingResponse,list_named_shadows_for_thing_response\nListNamespacesRequest,list_namespaces_request\nListNamespacesResponse,list_namespaces_response\nListNetworkAnalyzerConfigurationsRequest,list_network_analyzer_configurations_request\nListNetworkAnalyzerConfigurationsResponse,list_network_analyzer_configurations_response\nListNetworkProfilesRequest,list_network_profiles_request\nListNetworkProfilesResult,list_network_profiles_result\nListNetworkResourcesRequest,list_network_resources_request\nListNetworkResourcesResponse,list_network_resources_response\nListNetworkSettingsRequest,list_network_settings_request\nListNetworkSettingsResponse,list_network_settings_response\nListNetworkSitesRequest,list_network_sites_request\nListNetworkSitesResponse,list_network_sites_response\nListNetworksInput,list_networks_input\nListNetworksOutput,list_networks_output\nListNetworksRequest,list_networks_request\nListNetworksResponse,list_networks_response\nListNodeFromTemplateJobsRequest,list_node_from_template_jobs_request\nListNodeFromTemplateJobsResponse,list_node_from_template_jobs_response\nListNodegroupsRequest,list_nodegroups_request\nListNodegroupsResponse,list_nodegroups_response\nListNodesInput,list_nodes_input\nListNodesOutput,list_nodes_output\nListNodesRequest,list_nodes_request\nListNodesResponse,list_nodes_response\nListNotebookExecutionsInput,list_notebook_executions_input\nListNotebookExecutionsOutput,list_notebook_executions_output\nListNotebookInstanceLifecycleConfigsInput,list_notebook_instance_lifecycle_configs_input\nListNotebookInstanceLifecycleConfigsOutput,list_notebook_instance_lifecycle_configs_output\nListNotebookInstancesInput,list_notebook_instances_input\nListNotebookInstancesOutput,list_notebook_instances_output\nListNotebookMetadataInput,list_notebook_metadata_input\nListNotebookMetadataOutput,list_notebook_metadata_output\nListNotebookSessionsRequest,list_notebook_sessions_request\nListNotebookSessionsResponse,list_notebook_sessions_response\nListNotificationChannelsRequest,list_notification_channels_request\nListNotificationChannelsResponse,list_notification_channels_response\nListNotificationRulesFilter,list_notification_rules_filter\nListNotificationRulesRequest,list_notification_rules_request\nListNotificationRulesResult,list_notification_rules_result\nListNotificationsInput,list_notifications_input\nListNotificationsOutput,list_notifications_output\nListNotificationsRequest,list_notifications_request\nListNotificationsResponse,list_notifications_response\nListOTAUpdatesRequest,list_ota_updates_request\nListOTAUpdatesResponse,list_ota_updates_response\nListObjectAttributes,list_object_attributes\nListObjectAttributesRequest,list_object_attributes_request\nListObjectAttributesResponse,list_object_attributes_response\nListObjectChildren,list_object_children\nListObjectChildrenRequest,list_object_children_request\nListObjectChildrenResponse,list_object_children_response\nListObjectParentPaths,list_object_parent_paths\nListObjectParentPathsRequest,list_object_parent_paths_request\nListObjectParentPathsResponse,list_object_parent_paths_response\nListObjectParents,list_object_parents\nListObjectParentsRequest,list_object_parents_request\nListObjectParentsResponse,list_object_parents_response\nListObjectPolicies,list_object_policies\nListObjectPoliciesRequest,list_object_policies_request\nListObjectPoliciesResponse,list_object_policies_response\nListObjectVersionsOutput,list_object_versions_output\nListObjectVersionsRequest,list_object_versions_request\nListObjectsInput,list_objects_input\nListObjectsOutput,list_objects_output\nListObjectsRequest,list_objects_request\nListObjectsV2Output,list_objects_v2_output\nListObjectsV2Request,list_objects_v2_request\nListObservabilityConfigurationsRequest,list_observability_configurations_request\nListObservabilityConfigurationsResponse,list_observability_configurations_response\nListOfTags,list_of_tags\nListOfferingPromotionsRequest,list_offering_promotions_request\nListOfferingPromotionsResult,list_offering_promotions_result\nListOfferingTransactionsRequest,list_offering_transactions_request\nListOfferingTransactionsResult,list_offering_transactions_result\nListOfferingsRequest,list_offerings_request\nListOfferingsResponse,list_offerings_response\nListOfferingsResult,list_offerings_result\nListOnPremisesInstancesInput,list_on_premises_instances_input\nListOnPremisesInstancesOutput,list_on_premises_instances_output\nListOpenCypherQueriesInput,list_open_cypher_queries_input\nListOpenCypherQueriesOutput,list_open_cypher_queries_output\nListOpenIDConnectProviderTagsRequest,list_open_id_connect_provider_tags_request\nListOpenIDConnectProviderTagsResponse,list_open_id_connect_provider_tags_response\nListOpenIDConnectProvidersResponse,list_open_id_connect_providers_response\nListOpenWorkflowExecutionsInput,list_open_workflow_executions_input\nListOperationsInput,list_operations_input\nListOperationsOutput,list_operations_output\nListOperationsRequest,list_operations_request\nListOperationsResponse,list_operations_response\nListOpsItemEventsRequest,list_ops_item_events_request\nListOpsItemEventsResponse,list_ops_item_events_response\nListOpsItemRelatedItemsRequest,list_ops_item_related_items_request\nListOpsItemRelatedItemsResponse,list_ops_item_related_items_response\nListOpsMetadataRequest,list_ops_metadata_request\nListOpsMetadataResult,list_ops_metadata_result\nListOrdersInput,list_orders_input\nListOrdersOutput,list_orders_output\nListOrdersRequest,list_orders_request\nListOrdersResponse,list_orders_response\nListOrganizationAdminAccountsRequest,list_organization_admin_accounts_request\nListOrganizationAdminAccountsResponse,list_organization_admin_accounts_response\nListOrganizationInsightsRequest,list_organization_insights_request\nListOrganizationInsightsResponse,list_organization_insights_response\nListOrganizationPortfolioAccessInput,list_organization_portfolio_access_input\nListOrganizationPortfolioAccessOutput,list_organization_portfolio_access_output\nListOrganizationServiceAccessStatusRequest,list_organization_service_access_status_request\nListOrganizationServiceAccessStatusResponse,list_organization_service_access_status_response\nListOrganizationalUnitsForParentRequest,list_organizational_units_for_parent_request\nListOrganizationalUnitsForParentResponse,list_organizational_units_for_parent_response\nListOrganizationsRequest,list_organizations_request\nListOrganizationsResponse,list_organizations_response\nListOriginAccessControlsRequest,list_origin_access_controls_request\nListOriginAccessControlsResult,list_origin_access_controls_result\nListOriginEndpointsRequest,list_origin_endpoints_request\nListOriginEndpointsResponse,list_origin_endpoints_response\nListOriginRequestPoliciesRequest,list_origin_request_policies_request\nListOriginRequestPoliciesResult,list_origin_request_policies_result\nListOriginationNumbersRequest,list_origination_numbers_request\nListOriginationNumbersResult,list_origination_numbers_result\nListOutgoingCertificatesRequest,list_outgoing_certificates_request\nListOutgoingCertificatesResponse,list_outgoing_certificates_response\nListOutgoingTypedLinks,list_outgoing_typed_links\nListOutgoingTypedLinksRequest,list_outgoing_typed_links_request\nListOutgoingTypedLinksResponse,list_outgoing_typed_links_response\nListOutpostResolversRequest,list_outpost_resolvers_request\nListOutpostResolversResponse,list_outpost_resolvers_response\nListOutpostsInput,list_outposts_input\nListOutpostsOutput,list_outposts_output\nListOutpostsWithS3Request,list_outposts_with_s3_request\nListOutpostsWithS3Result,list_outposts_with_s3_result\nListPHIDetectionJobsRequest,list_phi_detection_jobs_request\nListPHIDetectionJobsResponse,list_phi_detection_jobs_response\nListPackageImportJobsRequest,list_package_import_jobs_request\nListPackageImportJobsResponse,list_package_import_jobs_response\nListPackageVersionAssetsRequest,list_package_version_assets_request\nListPackageVersionAssetsResult,list_package_version_assets_result\nListPackageVersionDependenciesRequest,list_package_version_dependencies_request\nListPackageVersionDependenciesResult,list_package_version_dependencies_result\nListPackageVersionsRequest,list_package_versions_request\nListPackageVersionsResponse,list_package_versions_response\nListPackageVersionsResult,list_package_versions_result\nListPackagesForDomainRequest,list_packages_for_domain_request\nListPackagesForDomainResponse,list_packages_for_domain_response\nListPackagesRequest,list_packages_request\nListPackagesResponse,list_packages_response\nListPackagesResult,list_packages_result\nListPackagingConfigurationsRequest,list_packaging_configurations_request\nListPackagingConfigurationsResponse,list_packaging_configurations_response\nListPackagingGroupsRequest,list_packaging_groups_request\nListPackagingGroupsResponse,list_packaging_groups_response\nListPageReceiptsRequest,list_page_receipts_request\nListPageReceiptsResult,list_page_receipts_result\nListPageResolutionsRequest,list_page_resolutions_request\nListPageResolutionsResult,list_page_resolutions_result\nListPagesByContactRequest,list_pages_by_contact_request\nListPagesByContactResult,list_pages_by_contact_result\nListPagesByEngagementRequest,list_pages_by_engagement_request\nListPagesByEngagementResult,list_pages_by_engagement_result\nListParallelDataRequest,list_parallel_data_request\nListParallelDataResponse,list_parallel_data_response\nListParentsRequest,list_parents_request\nListParentsResponse,list_parents_response\nListParticipantEventsRequest,list_participant_events_request\nListParticipantEventsResponse,list_participant_events_response\nListParticipantsRequest,list_participants_request\nListParticipantsResponse,list_participants_response\nListPartnerAccountsRequest,list_partner_accounts_request\nListPartnerAccountsResponse,list_partner_accounts_response\nListPartnerEventSourceAccountsRequest,list_partner_event_source_accounts_request\nListPartnerEventSourceAccountsResponse,list_partner_event_source_accounts_response\nListPartnerEventSourcesRequest,list_partner_event_sources_request\nListPartnerEventSourcesResponse,list_partner_event_sources_response\nListPartsInput,list_parts_input\nListPartsOutput,list_parts_output\nListPartsRequest,list_parts_request\nListPeeringsRequest,list_peerings_request\nListPeeringsResponse,list_peerings_response\nListPendingInvitationResourcesRequest,list_pending_invitation_resources_request\nListPendingInvitationResourcesResponse,list_pending_invitation_resources_response\nListPerformanceAnalysisReportsRequest,list_performance_analysis_reports_request\nListPerformanceAnalysisReportsResponse,list_performance_analysis_reports_response\nListPermissionAssociationsRequest,list_permission_associations_request\nListPermissionAssociationsResponse,list_permission_associations_response\nListPermissionGroupsByUserRequest,list_permission_groups_by_user_request\nListPermissionGroupsByUserResponse,list_permission_groups_by_user_response\nListPermissionGroupsRequest,list_permission_groups_request\nListPermissionGroupsResponse,list_permission_groups_response\nListPermissionSetProvisioningStatusRequest,list_permission_set_provisioning_status_request\nListPermissionSetProvisioningStatusResponse,list_permission_set_provisioning_status_response\nListPermissionSetsProvisionedToAccountRequest,list_permission_sets_provisioned_to_account_request\nListPermissionSetsProvisionedToAccountResponse,list_permission_sets_provisioned_to_account_response\nListPermissionSetsRequest,list_permission_sets_request\nListPermissionSetsResponse,list_permission_sets_response\nListPermissionVersionsRequest,list_permission_versions_request\nListPermissionVersionsResponse,list_permission_versions_response\nListPermissionsRequest,list_permissions_request\nListPermissionsResponse,list_permissions_response\nListPhoneNumberOrdersRequest,list_phone_number_orders_request\nListPhoneNumberOrdersResponse,list_phone_number_orders_response\nListPhoneNumbersOptedOutInput,list_phone_numbers_opted_out_input\nListPhoneNumbersOptedOutResponse,list_phone_numbers_opted_out_response\nListPhoneNumbersRequest,list_phone_numbers_request\nListPhoneNumbersResponse,list_phone_numbers_response\nListPhoneNumbersSummary,list_phone_numbers_summary\nListPhoneNumbersSummaryList,list_phone_numbers_summary_list\nListPhoneNumbersV2Request,list_phone_numbers_v2_request\nListPhoneNumbersV2Response,list_phone_numbers_v2_response\nListPickupLocationsRequest,list_pickup_locations_request\nListPickupLocationsResult,list_pickup_locations_result\nListPiiEntitiesDetectionJobsRequest,list_pii_entities_detection_jobs_request\nListPiiEntitiesDetectionJobsResponse,list_pii_entities_detection_jobs_response\nListPipelineBlueprintsResponse,list_pipeline_blueprints_response\nListPipelineExecutionStepsRequest,list_pipeline_execution_steps_request\nListPipelineExecutionStepsResponse,list_pipeline_execution_steps_response\nListPipelineExecutionsInput,list_pipeline_executions_input\nListPipelineExecutionsOutput,list_pipeline_executions_output\nListPipelineExecutionsRequest,list_pipeline_executions_request\nListPipelineExecutionsResponse,list_pipeline_executions_response\nListPipelineParametersForExecutionRequest,list_pipeline_parameters_for_execution_request\nListPipelineParametersForExecutionResponse,list_pipeline_parameters_for_execution_response\nListPipelinesInput,list_pipelines_input\nListPipelinesOutput,list_pipelines_output\nListPipelinesRequest,list_pipelines_request\nListPipelinesResponse,list_pipelines_response\nListPipesRequest,list_pipes_request\nListPipesResponse,list_pipes_response\nListPlaceIndexesRequest,list_place_indexes_request\nListPlaceIndexesResponse,list_place_indexes_response\nListPlaceIndexesResponseEntry,list_place_indexes_response_entry\nListPlacementsRequest,list_placements_request\nListPlacementsResponse,list_placements_response\nListPlatformApplicationsInput,list_platform_applications_input\nListPlatformApplicationsResponse,list_platform_applications_response\nListPlatformBranchesRequest,list_platform_branches_request\nListPlatformBranchesResult,list_platform_branches_result\nListPlatformVersionsRequest,list_platform_versions_request\nListPlatformVersionsResult,list_platform_versions_result\nListPlaybackConfigurationsRequest,list_playback_configurations_request\nListPlaybackConfigurationsResponse,list_playback_configurations_response\nListPlaybackKeyPairsRequest,list_playback_key_pairs_request\nListPlaybackKeyPairsResponse,list_playback_key_pairs_response\nListPluginsRequest,list_plugins_request\nListPluginsResponse,list_plugins_response\nListPoliciesForTargetRequest,list_policies_for_target_request\nListPoliciesForTargetResponse,list_policies_for_target_response\nListPoliciesGrantingServiceAccessEntry,list_policies_granting_service_access_entry\nListPoliciesGrantingServiceAccessRequest,list_policies_granting_service_access_request\nListPoliciesGrantingServiceAccessResponse,list_policies_granting_service_access_response\nListPoliciesInput,list_policies_input\nListPoliciesOutput,list_policies_output\nListPoliciesRequest,list_policies_request\nListPoliciesResponse,list_policies_response\nListPolicyAttachments,list_policy_attachments\nListPolicyAttachmentsRequest,list_policy_attachments_request\nListPolicyAttachmentsResponse,list_policy_attachments_response\nListPolicyGenerationsRequest,list_policy_generations_request\nListPolicyGenerationsResponse,list_policy_generations_response\nListPolicyPrincipalsRequest,list_policy_principals_request\nListPolicyPrincipalsResponse,list_policy_principals_response\nListPolicyStoresInput,list_policy_stores_input\nListPolicyStoresOutput,list_policy_stores_output\nListPolicyTagsRequest,list_policy_tags_request\nListPolicyTagsResponse,list_policy_tags_response\nListPolicyTemplatesInput,list_policy_templates_input\nListPolicyTemplatesOutput,list_policy_templates_output\nListPolicyVersionsRequest,list_policy_versions_request\nListPolicyVersionsResponse,list_policy_versions_response\nListPoolOriginationIdentitiesRequest,list_pool_origination_identities_request\nListPoolOriginationIdentitiesResult,list_pool_origination_identities_result\nListPortalsRequest,list_portals_request\nListPortalsResponse,list_portals_response\nListPortfolioAccessInput,list_portfolio_access_input\nListPortfolioAccessOutput,list_portfolio_access_output\nListPortfoliosForProductInput,list_portfolios_for_product_input\nListPortfoliosForProductOutput,list_portfolios_for_product_output\nListPortfoliosInput,list_portfolios_input\nListPortfoliosOutput,list_portfolios_output\nListPositionConfigurationsRequest,list_position_configurations_request\nListPositionConfigurationsResponse,list_position_configurations_response\nListPredictorBacktestExportJobsRequest,list_predictor_backtest_export_jobs_request\nListPredictorBacktestExportJobsResponse,list_predictor_backtest_export_jobs_response\nListPredictorsRequest,list_predictors_request\nListPredictorsResponse,list_predictors_response\nListPrefetchSchedulesRequest,list_prefetch_schedules_request\nListPrefetchSchedulesResponse,list_prefetch_schedules_response\nListPreparedStatementsInput,list_prepared_statements_input\nListPreparedStatementsOutput,list_prepared_statements_output\nListPresetsRequest,list_presets_request\nListPresetsResponse,list_presets_response\nListPreviewRotationShiftsRequest,list_preview_rotation_shifts_request\nListPreviewRotationShiftsResult,list_preview_rotation_shifts_result\nListPriceListsRequest,list_price_lists_request\nListPriceListsResponse,list_price_lists_response\nListPricesRequest,list_prices_request\nListPricesResponse,list_prices_response\nListPricingPlansAssociatedWithPricingRuleInput,list_pricing_plans_associated_with_pricing_rule_input\nListPricingPlansAssociatedWithPricingRuleOutput,list_pricing_plans_associated_with_pricing_rule_output\nListPricingPlansFilter,list_pricing_plans_filter\nListPricingPlansInput,list_pricing_plans_input\nListPricingPlansOutput,list_pricing_plans_output\nListPricingRulesAssociatedToPricingPlanInput,list_pricing_rules_associated_to_pricing_plan_input\nListPricingRulesAssociatedToPricingPlanOutput,list_pricing_rules_associated_to_pricing_plan_output\nListPricingRulesFilter,list_pricing_rules_filter\nListPricingRulesInput,list_pricing_rules_input\nListPricingRulesOutput,list_pricing_rules_output\nListPrincipalPoliciesRequest,list_principal_policies_request\nListPrincipalPoliciesResponse,list_principal_policies_response\nListPrincipalThingsRequest,list_principal_things_request\nListPrincipalThingsResponse,list_principal_things_response\nListPrincipalsForPortfolioInput,list_principals_for_portfolio_input\nListPrincipalsForPortfolioOutput,list_principals_for_portfolio_output\nListPrincipalsRequest,list_principals_request\nListPrincipalsResponse,list_principals_response\nListProblemsRequest,list_problems_request\nListProblemsResponse,list_problems_response\nListProcessingJobsRequest,list_processing_jobs_request\nListProcessingJobsResponse,list_processing_jobs_response\nListProductSubscriptionsRequest,list_product_subscriptions_request\nListProductSubscriptionsResponse,list_product_subscriptions_response\nListProfileNotificationsInput,list_profile_notifications_input\nListProfileNotificationsOutput,list_profile_notifications_output\nListProfileObjectTypeItem,list_profile_object_type_item\nListProfileObjectTypeTemplateItem,list_profile_object_type_template_item\nListProfileObjectTypeTemplatesRequest,list_profile_object_type_templates_request\nListProfileObjectTypeTemplatesResponse,list_profile_object_type_templates_response\nListProfileObjectTypesRequest,list_profile_object_types_request\nListProfileObjectTypesResponse,list_profile_object_types_response\nListProfileObjectsItem,list_profile_objects_item\nListProfileObjectsRequest,list_profile_objects_request\nListProfileObjectsResponse,list_profile_objects_response\nListProfilePermissionsRequest,list_profile_permissions_request\nListProfilePermissionsResponse,list_profile_permissions_response\nListProfileSharesInput,list_profile_shares_input\nListProfileSharesOutput,list_profile_shares_output\nListProfileTimesRequest,list_profile_times_request\nListProfileTimesResponse,list_profile_times_response\nListProfilesInput,list_profiles_input\nListProfilesOutput,list_profiles_output\nListProfilesRequest,list_profiles_request\nListProfilesResponse,list_profiles_response\nListProfilingGroupsRequest,list_profiling_groups_request\nListProfilingGroupsResponse,list_profiling_groups_response\nListProgressUpdateStreamsRequest,list_progress_update_streams_request\nListProgressUpdateStreamsResult,list_progress_update_streams_result\nListProjectAssetsRequest,list_project_assets_request\nListProjectAssetsResponse,list_project_assets_response\nListProjectPoliciesRequest,list_project_policies_request\nListProjectPoliciesResponse,list_project_policies_response\nListProjectsInput,list_projects_input\nListProjectsOutput,list_projects_output\nListProjectsRequest,list_projects_request\nListProjectsResponse,list_projects_response\nListProjectsResult,list_projects_result\nListPromptsRequest,list_prompts_request\nListPromptsResponse,list_prompts_response\nListProposalVotesInput,list_proposal_votes_input\nListProposalVotesOutput,list_proposal_votes_output\nListProposalsInput,list_proposals_input\nListProposalsOutput,list_proposals_output\nListProtectedQueriesInput,list_protected_queries_input\nListProtectedQueriesOutput,list_protected_queries_output\nListProtectedResourcesByBackupVaultInput,list_protected_resources_by_backup_vault_input\nListProtectedResourcesByBackupVaultOutput,list_protected_resources_by_backup_vault_output\nListProtectedResourcesInput,list_protected_resources_input\nListProtectedResourcesOutput,list_protected_resources_output\nListProtectionGroupsRequest,list_protection_groups_request\nListProtectionGroupsResponse,list_protection_groups_response\nListProtectionsRequest,list_protections_request\nListProtectionsResponse,list_protections_response\nListProtocolsListsRequest,list_protocols_lists_request\nListProtocolsListsResponse,list_protocols_lists_response\nListProvisionedCapacityInput,list_provisioned_capacity_input\nListProvisionedCapacityOutput,list_provisioned_capacity_output\nListProvisionedConcurrencyConfigsRequest,list_provisioned_concurrency_configs_request\nListProvisionedConcurrencyConfigsResponse,list_provisioned_concurrency_configs_response\nListProvisionedModelThroughputsRequest,list_provisioned_model_throughputs_request\nListProvisionedModelThroughputsResponse,list_provisioned_model_throughputs_response\nListProvisionedProductPlansInput,list_provisioned_product_plans_input\nListProvisionedProductPlansOutput,list_provisioned_product_plans_output\nListProvisioningArtifactsForServiceActionInput,list_provisioning_artifacts_for_service_action_input\nListProvisioningArtifactsForServiceActionOutput,list_provisioning_artifacts_for_service_action_output\nListProvisioningArtifactsInput,list_provisioning_artifacts_input\nListProvisioningArtifactsOutput,list_provisioning_artifacts_output\nListProvisioningTemplateVersionsRequest,list_provisioning_template_versions_request\nListProvisioningTemplateVersionsResponse,list_provisioning_template_versions_response\nListProvisioningTemplatesRequest,list_provisioning_templates_request\nListProvisioningTemplatesResponse,list_provisioning_templates_response\nListProxySessionsRequest,list_proxy_sessions_request\nListProxySessionsResponse,list_proxy_sessions_response\nListPublicKeysRequest,list_public_keys_request\nListPublicKeysResponse,list_public_keys_response\nListPublicKeysResult,list_public_keys_result\nListPublishedSchemaArnsRequest,list_published_schema_arns_request\nListPublishedSchemaArnsResponse,list_published_schema_arns_response\nListPublishingDestinationsRequest,list_publishing_destinations_request\nListPublishingDestinationsResponse,list_publishing_destinations_response\nListPullRequestsInput,list_pull_requests_input\nListPullRequestsOutput,list_pull_requests_output\nListQualificationRequestsRequest,list_qualification_requests_request\nListQualificationRequestsResponse,list_qualification_requests_response\nListQualificationTypesRequest,list_qualification_types_request\nListQualificationTypesResponse,list_qualification_types_response\nListQueriesRequest,list_queries_request\nListQueriesResponse,list_queries_response\nListQueryExecutionsInput,list_query_executions_input\nListQueryExecutionsOutput,list_query_executions_output\nListQueryLoggingConfigsRequest,list_query_logging_configs_request\nListQueryLoggingConfigsResponse,list_query_logging_configs_response\nListQuerySuggestionsBlockListsRequest,list_query_suggestions_block_lists_request\nListQuerySuggestionsBlockListsResponse,list_query_suggestions_block_lists_response\nListQueueQuickConnectsRequest,list_queue_quick_connects_request\nListQueueQuickConnectsResponse,list_queue_quick_connects_response\nListQueueTagsRequest,list_queue_tags_request\nListQueueTagsResult,list_queue_tags_result\nListQueuedMessagesRequest,list_queued_messages_request\nListQueuedMessagesResponse,list_queued_messages_response\nListQueuesRequest,list_queues_request\nListQueuesResponse,list_queues_response\nListQueuesResult,list_queues_result\nListQuickConnectsRequest,list_quick_connects_request\nListQuickConnectsResponse,list_quick_connects_response\nListRasterDataCollectionsInput,list_raster_data_collections_input\nListRasterDataCollectionsOutput,list_raster_data_collections_output\nListRateBasedRulesRequest,list_rate_based_rules_request\nListRateBasedRulesResponse,list_rate_based_rules_response\nListReadSetActivationJobsRequest,list_read_set_activation_jobs_request\nListReadSetActivationJobsResponse,list_read_set_activation_jobs_response\nListReadSetExportJobsRequest,list_read_set_export_jobs_request\nListReadSetExportJobsResponse,list_read_set_export_jobs_response\nListReadSetImportJobsRequest,list_read_set_import_jobs_request\nListReadSetImportJobsResponse,list_read_set_import_jobs_response\nListReadSetUploadPartsRequest,list_read_set_upload_parts_request\nListReadSetUploadPartsResponse,list_read_set_upload_parts_response\nListReadSetsRequest,list_read_sets_request\nListReadSetsResponse,list_read_sets_response\nListReadinessChecksRequest,list_readiness_checks_request\nListReadinessChecksResponse,list_readiness_checks_response\nListRealtimeContactAnalysisSegmentsRequest,list_realtime_contact_analysis_segments_request\nListRealtimeContactAnalysisSegmentsResponse,list_realtime_contact_analysis_segments_response\nListRealtimeLogConfigsRequest,list_realtime_log_configs_request\nListRealtimeLogConfigsResult,list_realtime_log_configs_result\nListReceiptFiltersResponse,list_receipt_filters_response\nListReceiptRuleSetsRequest,list_receipt_rule_sets_request\nListReceiptRuleSetsResponse,list_receipt_rule_sets_response\nListReceivedGrantsForOrganizationRequest,list_received_grants_for_organization_request\nListReceivedGrantsForOrganizationResponse,list_received_grants_for_organization_response\nListReceivedGrantsRequest,list_received_grants_request\nListReceivedGrantsResponse,list_received_grants_response\nListReceivedLicensesForOrganizationRequest,list_received_licenses_for_organization_request\nListReceivedLicensesForOrganizationResponse,list_received_licenses_for_organization_response\nListReceivedLicensesRequest,list_received_licenses_request\nListReceivedLicensesResponse,list_received_licenses_response\nListRecipeVersionsRequest,list_recipe_versions_request\nListRecipeVersionsResponse,list_recipe_versions_response\nListRecipesRequest,list_recipes_request\nListRecipesResponse,list_recipes_response\nListRecommendationFeedbackRequest,list_recommendation_feedback_request\nListRecommendationFeedbackResponse,list_recommendation_feedback_response\nListRecommendationTemplatesRequest,list_recommendation_templates_request\nListRecommendationTemplatesResponse,list_recommendation_templates_response\nListRecommendationsRequest,list_recommendations_request\nListRecommendationsResponse,list_recommendations_response\nListRecommendedIntentsRequest,list_recommended_intents_request\nListRecommendedIntentsResponse,list_recommended_intents_response\nListRecommenderConfigurationsResponse,list_recommender_configurations_response\nListRecommendersRequest,list_recommenders_request\nListRecommendersResponse,list_recommenders_response\nListRecordHistoryInput,list_record_history_input\nListRecordHistoryOutput,list_record_history_output\nListRecordHistorySearchFilter,list_record_history_search_filter\nListRecordingConfigurationsRequest,list_recording_configurations_request\nListRecordingConfigurationsResponse,list_recording_configurations_response\nListRecordsRequest,list_records_request\nListRecordsResponse,list_records_response\nListRecoveryGroupsRequest,list_recovery_groups_request\nListRecoveryGroupsResponse,list_recovery_groups_response\nListRecoveryPointsByBackupVaultInput,list_recovery_points_by_backup_vault_input\nListRecoveryPointsByBackupVaultOutput,list_recovery_points_by_backup_vault_output\nListRecoveryPointsByLegalHoldInput,list_recovery_points_by_legal_hold_input\nListRecoveryPointsByLegalHoldOutput,list_recovery_points_by_legal_hold_output\nListRecoveryPointsByResourceInput,list_recovery_points_by_resource_input\nListRecoveryPointsByResourceOutput,list_recovery_points_by_resource_output\nListRecoveryPointsRequest,list_recovery_points_request\nListRecoveryPointsResponse,list_recovery_points_response\nListReferenceImportJobsRequest,list_reference_import_jobs_request\nListReferenceImportJobsResponse,list_reference_import_jobs_response\nListReferenceStoresRequest,list_reference_stores_request\nListReferenceStoresResponse,list_reference_stores_response\nListReferencesRequest,list_references_request\nListReferencesResponse,list_references_response\nListRefreshSchedulesRequest,list_refresh_schedules_request\nListRefreshSchedulesResponse,list_refresh_schedules_response\nListRegexMatchSetsRequest,list_regex_match_sets_request\nListRegexMatchSetsResponse,list_regex_match_sets_response\nListRegexPatternSetsRequest,list_regex_pattern_sets_request\nListRegexPatternSetsResponse,list_regex_pattern_sets_response\nListRegionalBucketsRequest,list_regional_buckets_request\nListRegionalBucketsResult,list_regional_buckets_result\nListRegionsRequest,list_regions_request\nListRegionsResponse,list_regions_response\nListRegistriesInput,list_registries_input\nListRegistriesRequest,list_registries_request\nListRegistriesResponse,list_registries_response\nListRelatedItemsInput,list_related_items_input\nListRelatedItemsOutput,list_related_items_output\nListRelatedResourcesForAuditFindingRequest,list_related_resources_for_audit_finding_request\nListRelatedResourcesForAuditFindingResponse,list_related_resources_for_audit_finding_response\nListReleaseLabelsInput,list_release_labels_input\nListReleaseLabelsOutput,list_release_labels_output\nListRemoteAccessSessionsRequest,list_remote_access_sessions_request\nListRemoteAccessSessionsResult,list_remote_access_sessions_result\nListReplacePermissionAssociationsWorkRequest,list_replace_permission_associations_work_request\nListReplacePermissionAssociationsWorkResponse,list_replace_permission_associations_work_response\nListReplaysRequest,list_replays_request\nListReplaysResponse,list_replays_response\nListReplicationSetsInput,list_replication_sets_input\nListReplicationSetsOutput,list_replication_sets_output\nListReportDefinitionsRequest,list_report_definitions_request\nListReportDefinitionsResult,list_report_definitions_result\nListReportGroupsInput,list_report_groups_input\nListReportGroupsOutput,list_report_groups_output\nListReportJobsInput,list_report_jobs_input\nListReportJobsOutput,list_report_jobs_output\nListReportPlansInput,list_report_plans_input\nListReportPlansOutput,list_report_plans_output\nListReportsForReportGroupInput,list_reports_for_report_group_input\nListReportsForReportGroupOutput,list_reports_for_report_group_output\nListReportsInput,list_reports_input\nListReportsOutput,list_reports_output\nListRepositoriesForApprovalRuleTemplateInput,list_repositories_for_approval_rule_template_input\nListRepositoriesForApprovalRuleTemplateOutput,list_repositories_for_approval_rule_template_output\nListRepositoriesInDomainRequest,list_repositories_in_domain_request\nListRepositoriesInDomainResult,list_repositories_in_domain_result\nListRepositoriesInput,list_repositories_input\nListRepositoriesOutput,list_repositories_output\nListRepositoriesRequest,list_repositories_request\nListRepositoriesResult,list_repositories_result\nListRepositoryAssociationsRequest,list_repository_associations_request\nListRepositoryAssociationsResponse,list_repository_associations_response\nListRepositorySyncDefinitionsInput,list_repository_sync_definitions_input\nListRepositorySyncDefinitionsOutput,list_repository_sync_definitions_output\nListRequest,list_request\nListRequestedServiceQuotaChangeHistoryByQuotaRequest,list_requested_service_quota_change_history_by_quota_request\nListRequestedServiceQuotaChangeHistoryByQuotaResponse,list_requested_service_quota_change_history_by_quota_response\nListRequestedServiceQuotaChangeHistoryRequest,list_requested_service_quota_change_history_request\nListRequestedServiceQuotaChangeHistoryResponse,list_requested_service_quota_change_history_response\nListRescoreExecutionPlansRequest,list_rescore_execution_plans_request\nListRescoreExecutionPlansResponse,list_rescore_execution_plans_response\nListReservationsRequest,list_reservations_request\nListReservationsResponse,list_reservations_response\nListResiliencyPoliciesRequest,list_resiliency_policies_request\nListResiliencyPoliciesResponse,list_resiliency_policies_response\nListResolverConfigsRequest,list_resolver_configs_request\nListResolverConfigsResponse,list_resolver_configs_response\nListResolverDnssecConfigsRequest,list_resolver_dnssec_configs_request\nListResolverDnssecConfigsResponse,list_resolver_dnssec_configs_response\nListResolverEndpointIpAddressesRequest,list_resolver_endpoint_ip_addresses_request\nListResolverEndpointIpAddressesResponse,list_resolver_endpoint_ip_addresses_response\nListResolverEndpointsRequest,list_resolver_endpoints_request\nListResolverEndpointsResponse,list_resolver_endpoints_response\nListResolverQueryLogConfigAssociationsRequest,list_resolver_query_log_config_associations_request\nListResolverQueryLogConfigAssociationsResponse,list_resolver_query_log_config_associations_response\nListResolverQueryLogConfigsRequest,list_resolver_query_log_configs_request\nListResolverQueryLogConfigsResponse,list_resolver_query_log_configs_response\nListResolverRuleAssociationsRequest,list_resolver_rule_associations_request\nListResolverRuleAssociationsResponse,list_resolver_rule_associations_response\nListResolverRulesRequest,list_resolver_rules_request\nListResolverRulesResponse,list_resolver_rules_response\nListResolversByFunctionRequest,list_resolvers_by_function_request\nListResolversByFunctionResponse,list_resolvers_by_function_response\nListResolversRequest,list_resolvers_request\nListResolversResponse,list_resolvers_response\nListResourceCatalogsRequest,list_resource_catalogs_request\nListResourceCatalogsResponse,list_resource_catalogs_response\nListResourceComplianceSummariesRequest,list_resource_compliance_summaries_request\nListResourceComplianceSummariesResult,list_resource_compliance_summaries_result\nListResourceDataSyncRequest,list_resource_data_sync_request\nListResourceDataSyncResult,list_resource_data_sync_result\nListResourceDefinitionVersionsRequest,list_resource_definition_versions_request\nListResourceDefinitionVersionsResponse,list_resource_definition_versions_response\nListResourceDefinitionsRequest,list_resource_definitions_request\nListResourceDefinitionsResponse,list_resource_definitions_response\nListResourceDelegatesRequest,list_resource_delegates_request\nListResourceDelegatesResponse,list_resource_delegates_response\nListResourceEvaluationsRequest,list_resource_evaluations_request\nListResourceEvaluationsResponse,list_resource_evaluations_response\nListResourceInventoryRequest,list_resource_inventory_request\nListResourceInventoryResponse,list_resource_inventory_response\nListResourcePoliciesRequest,list_resource_policies_request\nListResourcePoliciesResult,list_resource_policies_result\nListResourceProfileArtifactsRequest,list_resource_profile_artifacts_request\nListResourceProfileArtifactsResponse,list_resource_profile_artifacts_response\nListResourceProfileDetectionsRequest,list_resource_profile_detections_request\nListResourceProfileDetectionsResponse,list_resource_profile_detections_response\nListResourceRecordSetsRequest,list_resource_record_sets_request\nListResourceRecordSetsResponse,list_resource_record_sets_response\nListResourceRequestsInput,list_resource_requests_input\nListResourceRequestsOutput,list_resource_requests_output\nListResourceServersRequest,list_resource_servers_request\nListResourceServersResponse,list_resource_servers_response\nListResourceSetResourcesRequest,list_resource_set_resources_request\nListResourceSetResourcesResponse,list_resource_set_resources_response\nListResourceSetsRequest,list_resource_sets_request\nListResourceSetsResponse,list_resource_sets_response\nListResourceSharePermissionsRequest,list_resource_share_permissions_request\nListResourceSharePermissionsResponse,list_resource_share_permissions_response\nListResourceTagsRequest,list_resource_tags_request\nListResourceTagsResponse,list_resource_tags_response\nListResourceTypesRequest,list_resource_types_request\nListResourceTypesResponse,list_resource_types_response\nListResourcesAssociatedToCustomLineItemFilter,list_resources_associated_to_custom_line_item_filter\nListResourcesAssociatedToCustomLineItemInput,list_resources_associated_to_custom_line_item_input\nListResourcesAssociatedToCustomLineItemOutput,list_resources_associated_to_custom_line_item_output\nListResourcesAssociatedToCustomLineItemResponseElement,list_resources_associated_to_custom_line_item_response_element\nListResourcesFilters,list_resources_filters\nListResourcesForTagOptionInput,list_resources_for_tag_option_input\nListResourcesForTagOptionOutput,list_resources_for_tag_option_output\nListResourcesForWebACLRequest,list_resources_for_web_acl_request\nListResourcesForWebACLResponse,list_resources_for_web_acl_response\nListResourcesInProtectionGroupRequest,list_resources_in_protection_group_request\nListResourcesInProtectionGroupResponse,list_resources_in_protection_group_response\nListResourcesInput,list_resources_input\nListResourcesOutput,list_resources_output\nListResourcesRequest,list_resources_request\nListResourcesResponse,list_resources_response\nListResourcesResult,list_resources_result\nListResponseHeadersPoliciesRequest,list_response_headers_policies_request\nListResponseHeadersPoliciesResult,list_response_headers_policies_result\nListResponsePlansInput,list_response_plans_input\nListResponsePlansOutput,list_response_plans_output\nListRestoreJobsInput,list_restore_jobs_input\nListRestoreJobsOutput,list_restore_jobs_output\nListRetainedMessagesRequest,list_retained_messages_request\nListRetainedMessagesResponse,list_retained_messages_response\nListRetirableGrantsRequest,list_retirable_grants_request\nListRetrainingSchedulersRequest,list_retraining_schedulers_request\nListRetrainingSchedulersResponse,list_retraining_schedulers_response\nListReusableDelegationSetsRequest,list_reusable_delegation_sets_request\nListReusableDelegationSetsResponse,list_reusable_delegation_sets_response\nListReviewPolicyResultsForHITRequest,list_review_policy_results_for_hit_request\nListReviewPolicyResultsForHITResponse,list_review_policy_results_for_hit_response\nListReviewableHITsRequest,list_reviewable_hits_request\nListReviewableHITsResponse,list_reviewable_hits_response\nListRevisionAssetsRequest,list_revision_assets_request\nListRevisionAssetsResponse,list_revision_assets_response\nListRobotApplicationsRequest,list_robot_applications_request\nListRobotApplicationsResponse,list_robot_applications_response\nListRobotsRequest,list_robots_request\nListRobotsResponse,list_robots_response\nListRoleAliasesRequest,list_role_aliases_request\nListRoleAliasesResponse,list_role_aliases_response\nListRolePoliciesRequest,list_role_policies_request\nListRolePoliciesResponse,list_role_policies_response\nListRoleTagsRequest,list_role_tags_request\nListRoleTagsResponse,list_role_tags_response\nListRolesRequest,list_roles_request\nListRolesResponse,list_roles_response\nListRoomMembershipsRequest,list_room_memberships_request\nListRoomMembershipsResponse,list_room_memberships_response\nListRoomsRequest,list_rooms_request\nListRoomsResponse,list_rooms_response\nListRootsRequest,list_roots_request\nListRootsResponse,list_roots_response\nListRotationOverridesRequest,list_rotation_overrides_request\nListRotationOverridesResult,list_rotation_overrides_result\nListRotationShiftsRequest,list_rotation_shifts_request\nListRotationShiftsResult,list_rotation_shifts_result\nListRotationsRequest,list_rotations_request\nListRotationsResult,list_rotations_result\nListRouteCalculatorsRequest,list_route_calculators_request\nListRouteCalculatorsResponse,list_route_calculators_response\nListRouteCalculatorsResponseEntry,list_route_calculators_response_entry\nListRoutesInput,list_routes_input\nListRoutesOutput,list_routes_output\nListRoutesRequest,list_routes_request\nListRoutesResponse,list_routes_response\nListRoutingControlsRequest,list_routing_controls_request\nListRoutingControlsResponse,list_routing_controls_response\nListRoutingProfileQueuesRequest,list_routing_profile_queues_request\nListRoutingProfileQueuesResponse,list_routing_profile_queues_response\nListRoutingProfilesRequest,list_routing_profiles_request\nListRoutingProfilesResponse,list_routing_profiles_response\nListRuleBasedMatchesRequest,list_rule_based_matches_request\nListRuleBasedMatchesResponse,list_rule_based_matches_response\nListRuleGroupsNamespacesRequest,list_rule_groups_namespaces_request\nListRuleGroupsNamespacesResponse,list_rule_groups_namespaces_response\nListRuleGroupsRequest,list_rule_groups_request\nListRuleGroupsResponse,list_rule_groups_response\nListRuleNamesByTargetRequest,list_rule_names_by_target_request\nListRuleNamesByTargetResponse,list_rule_names_by_target_response\nListRulesOutput,list_rules_output\nListRulesPackagesRequest,list_rules_packages_request\nListRulesPackagesResponse,list_rules_packages_response\nListRulesRequest,list_rules_request\nListRulesResponse,list_rules_response\nListRulesetsRequest,list_rulesets_request\nListRulesetsResponse,list_rulesets_response\nListRumMetricsDestinationsRequest,list_rum_metrics_destinations_request\nListRumMetricsDestinationsResponse,list_rum_metrics_destinations_response\nListRunGroupsRequest,list_run_groups_request\nListRunGroupsResponse,list_run_groups_response\nListRunTasksRequest,list_run_tasks_request\nListRunTasksResponse,list_run_tasks_response\nListRunsRequest,list_runs_request\nListRunsResponse,list_runs_response\nListRunsResult,list_runs_result\nListRxNormInferenceJobsRequest,list_rx_norm_inference_jobs_request\nListRxNormInferenceJobsResponse,list_rx_norm_inference_jobs_response\nListS3BucketsRequest,list_s3_buckets_request\nListS3BucketsResponse,list_s3_buckets_response\nListS3ResourcesRequest,list_s3_resources_request\nListS3ResourcesResult,list_s3_resources_result\nListSAMLProviderTagsRequest,list_saml_provider_tags_request\nListSAMLProviderTagsResponse,list_saml_provider_tags_response\nListSAMLProvidersResponse,list_saml_providers_response\nListSMSSandboxPhoneNumbersInput,list_sms_sandbox_phone_numbers_input\nListSMSSandboxPhoneNumbersResult,list_sms_sandbox_phone_numbers_result\nListSNOMEDCTInferenceJobsRequest,list_snomedct_inference_jobs_request\nListSNOMEDCTInferenceJobsResponse,list_snomedct_inference_jobs_response\nListSSHPublicKeysRequest,list_ssh_public_keys_request\nListSSHPublicKeysResponse,list_ssh_public_keys_response\nListSafetyRulesRequest,list_safety_rules_request\nListSafetyRulesResponse,list_safety_rules_response\nListSamplesRequest,list_samples_request\nListSamplesResult,list_samples_result\nListSatellitesRequest,list_satellites_request\nListSatellitesResponse,list_satellites_response\nListSavingsPlansPurchaseRecommendationGenerationRequest,list_savings_plans_purchase_recommendation_generation_request\nListSavingsPlansPurchaseRecommendationGenerationResponse,list_savings_plans_purchase_recommendation_generation_response\nListScansRequest,list_scans_request\nListScansResponse,list_scans_response\nListScenesRequest,list_scenes_request\nListScenesResponse,list_scenes_response\nListScheduleGroupsInput,list_schedule_groups_input\nListScheduleGroupsOutput,list_schedule_groups_output\nListScheduledActionsRequest,list_scheduled_actions_request\nListScheduledActionsResponse,list_scheduled_actions_response\nListScheduledAuditsRequest,list_scheduled_audits_request\nListScheduledAuditsResponse,list_scheduled_audits_response\nListScheduledQueriesRequest,list_scheduled_queries_request\nListScheduledQueriesResponse,list_scheduled_queries_response\nListSchedulesInput,list_schedules_input\nListSchedulesOutput,list_schedules_output\nListSchedulesRequest,list_schedules_request\nListSchedulesResponse,list_schedules_response\nListSchedulingPoliciesRequest,list_scheduling_policies_request\nListSchedulingPoliciesResponse,list_scheduling_policies_response\nListSchemaExtensionsRequest,list_schema_extensions_request\nListSchemaExtensionsResult,list_schema_extensions_result\nListSchemaMappingsInput,list_schema_mappings_input\nListSchemaMappingsOutput,list_schema_mappings_output\nListSchemaVersionsInput,list_schema_versions_input\nListSchemaVersionsRequest,list_schema_versions_request\nListSchemaVersionsResponse,list_schema_versions_response\nListSchemasInput,list_schemas_input\nListSchemasOutput,list_schemas_output\nListSchemasRequest,list_schemas_request\nListSchemasResponse,list_schemas_response\nListScramSecretsRequest,list_scram_secrets_request\nListScramSecretsResponse,list_scram_secrets_response\nListScriptsInput,list_scripts_input\nListScriptsOutput,list_scripts_output\nListSecretVersionIdsRequest,list_secret_version_ids_request\nListSecretVersionIdsResponse,list_secret_version_ids_response\nListSecretsRequest,list_secrets_request\nListSecretsResponse,list_secrets_response\nListSecurityConfigsRequest,list_security_configs_request\nListSecurityConfigsResponse,list_security_configs_response\nListSecurityConfigurationsInput,list_security_configurations_input\nListSecurityConfigurationsOutput,list_security_configurations_output\nListSecurityControlDefinitionsRequest,list_security_control_definitions_request\nListSecurityControlDefinitionsResponse,list_security_control_definitions_response\nListSecurityKeysRequest,list_security_keys_request\nListSecurityKeysResponse,list_security_keys_response\nListSecurityPoliciesRequest,list_security_policies_request\nListSecurityPoliciesResponse,list_security_policies_response\nListSecurityProfileApplicationsRequest,list_security_profile_applications_request\nListSecurityProfileApplicationsResponse,list_security_profile_applications_response\nListSecurityProfilePermissionsRequest,list_security_profile_permissions_request\nListSecurityProfilePermissionsResponse,list_security_profile_permissions_response\nListSecurityProfilesForTargetRequest,list_security_profiles_for_target_request\nListSecurityProfilesForTargetResponse,list_security_profiles_for_target_response\nListSecurityProfilesRequest,list_security_profiles_request\nListSecurityProfilesResponse,list_security_profiles_response\nListSegmentReferencesRequest,list_segment_references_request\nListSegmentReferencesResponse,list_segment_references_response\nListSegmentsRequest,list_segments_request\nListSegmentsResponse,list_segments_response\nListSensitivityInspectionTemplatesRequest,list_sensitivity_inspection_templates_request\nListSensitivityInspectionTemplatesResponse,list_sensitivity_inspection_templates_response\nListSensorStatisticsRequest,list_sensor_statistics_request\nListSensorStatisticsResponse,list_sensor_statistics_response\nListSentimentDetectionJobsRequest,list_sentiment_detection_jobs_request\nListSentimentDetectionJobsResponse,list_sentiment_detection_jobs_response\nListSequenceStoresRequest,list_sequence_stores_request\nListSequenceStoresResponse,list_sequence_stores_response\nListServerCertificateTagsRequest,list_server_certificate_tags_request\nListServerCertificateTagsResponse,list_server_certificate_tags_response\nListServerCertificatesRequest,list_server_certificates_request\nListServerCertificatesResponse,list_server_certificates_response\nListServerNeighborsRequest,list_server_neighbors_request\nListServerNeighborsResponse,list_server_neighbors_response\nListServersRequest,list_servers_request\nListServersResponse,list_servers_response\nListServiceActionsForProvisioningArtifactInput,list_service_actions_for_provisioning_artifact_input\nListServiceActionsForProvisioningArtifactOutput,list_service_actions_for_provisioning_artifact_output\nListServiceActionsInput,list_service_actions_input\nListServiceActionsOutput,list_service_actions_output\nListServiceInstanceOutputsInput,list_service_instance_outputs_input\nListServiceInstanceOutputsOutput,list_service_instance_outputs_output\nListServiceInstanceProvisionedResourcesInput,list_service_instance_provisioned_resources_input\nListServiceInstanceProvisionedResourcesOutput,list_service_instance_provisioned_resources_output\nListServiceInstancesFilter,list_service_instances_filter\nListServiceInstancesInput,list_service_instances_input\nListServiceInstancesOutput,list_service_instances_output\nListServiceNetworkServiceAssociationsRequest,list_service_network_service_associations_request\nListServiceNetworkServiceAssociationsResponse,list_service_network_service_associations_response\nListServiceNetworkVpcAssociationsRequest,list_service_network_vpc_associations_request\nListServiceNetworkVpcAssociationsResponse,list_service_network_vpc_associations_response\nListServiceNetworksRequest,list_service_networks_request\nListServiceNetworksResponse,list_service_networks_response\nListServicePipelineOutputsInput,list_service_pipeline_outputs_input\nListServicePipelineOutputsOutput,list_service_pipeline_outputs_output\nListServicePipelineProvisionedResourcesInput,list_service_pipeline_provisioned_resources_input\nListServicePipelineProvisionedResourcesOutput,list_service_pipeline_provisioned_resources_output\nListServicePrincipalNamesRequest,list_service_principal_names_request\nListServicePrincipalNamesResponse,list_service_principal_names_response\nListServiceProfilesRequest,list_service_profiles_request\nListServiceProfilesResponse,list_service_profiles_response\nListServiceQuotaIncreaseRequestsInTemplateRequest,list_service_quota_increase_requests_in_template_request\nListServiceQuotaIncreaseRequestsInTemplateResponse,list_service_quota_increase_requests_in_template_response\nListServiceQuotasRequest,list_service_quotas_request\nListServiceQuotasResponse,list_service_quotas_response\nListServiceSpecificCredentialsRequest,list_service_specific_credentials_request\nListServiceSpecificCredentialsResponse,list_service_specific_credentials_response\nListServiceTemplateVersionsInput,list_service_template_versions_input\nListServiceTemplateVersionsOutput,list_service_template_versions_output\nListServiceTemplatesInput,list_service_templates_input\nListServiceTemplatesOutput,list_service_templates_output\nListServiceVersionsRequest,list_service_versions_request\nListServiceVersionsResult,list_service_versions_result\nListServicesByNamespaceRequest,list_services_by_namespace_request\nListServicesByNamespaceResponse,list_services_by_namespace_response\nListServicesForAutoScalingConfigurationRequest,list_services_for_auto_scaling_configuration_request\nListServicesForAutoScalingConfigurationResponse,list_services_for_auto_scaling_configuration_response\nListServicesInput,list_services_input\nListServicesOutput,list_services_output\nListServicesRequest,list_services_request\nListServicesResponse,list_services_response\nListSessionAnalyticsDataRequest,list_session_analytics_data_request\nListSessionAnalyticsDataResponse,list_session_analytics_data_response\nListSessionMetricsRequest,list_session_metrics_request\nListSessionMetricsResponse,list_session_metrics_response\nListSessionsRequest,list_sessions_request\nListSessionsResponse,list_sessions_response\nListShardsInput,list_shards_input\nListShardsOutput,list_shards_output\nListShareInvitationsInput,list_share_invitations_input\nListShareInvitationsOutput,list_share_invitations_output\nListSharedEndpointsRequest,list_shared_endpoints_request\nListSharedEndpointsResult,list_shared_endpoints_result\nListSharedProjectsInput,list_shared_projects_input\nListSharedProjectsOutput,list_shared_projects_output\nListSharedReportGroupsInput,list_shared_report_groups_input\nListSharedReportGroupsOutput,list_shared_report_groups_output\nListSharesRequest,list_shares_request\nListSharesResponse,list_shares_response\nListSignalCatalogNodesRequest,list_signal_catalog_nodes_request\nListSignalCatalogNodesResponse,list_signal_catalog_nodes_response\nListSignalCatalogsRequest,list_signal_catalogs_request\nListSignalCatalogsResponse,list_signal_catalogs_response\nListSignalingChannelsInput,list_signaling_channels_input\nListSignalingChannelsOutput,list_signaling_channels_output\nListSigningCertificatesRequest,list_signing_certificates_request\nListSigningCertificatesResponse,list_signing_certificates_response\nListSigningJobsRequest,list_signing_jobs_request\nListSigningJobsResponse,list_signing_jobs_response\nListSigningPlatformsRequest,list_signing_platforms_request\nListSigningPlatformsResponse,list_signing_platforms_response\nListSigningProfilesRequest,list_signing_profiles_request\nListSigningProfilesResponse,list_signing_profiles_response\nListSimulationApplicationsRequest,list_simulation_applications_request\nListSimulationApplicationsResponse,list_simulation_applications_response\nListSimulationJobBatchesRequest,list_simulation_job_batches_request\nListSimulationJobBatchesResponse,list_simulation_job_batches_response\nListSimulationJobsRequest,list_simulation_jobs_request\nListSimulationJobsResponse,list_simulation_jobs_response\nListSimulationsInput,list_simulations_input\nListSimulationsOutput,list_simulations_output\nListSinksInput,list_sinks_input\nListSinksItem,list_sinks_item\nListSinksOutput,list_sinks_output\nListSipMediaApplicationsRequest,list_sip_media_applications_request\nListSipMediaApplicationsResponse,list_sip_media_applications_response\nListSipRulesRequest,list_sip_rules_request\nListSipRulesResponse,list_sip_rules_response\nListSitesInput,list_sites_input\nListSitesOutput,list_sites_output\nListSitesRequest,list_sites_request\nListSitesResponse,list_sites_response\nListSizeConstraintSetsRequest,list_size_constraint_sets_request\nListSizeConstraintSetsResponse,list_size_constraint_sets_response\nListSkillsRequest,list_skills_request\nListSkillsResponse,list_skills_response\nListSkillsStoreCategoriesRequest,list_skills_store_categories_request\nListSkillsStoreCategoriesResponse,list_skills_store_categories_response\nListSkillsStoreSkillsByCategoryRequest,list_skills_store_skills_by_category_request\nListSkillsStoreSkillsByCategoryResponse,list_skills_store_skills_by_category_response\nListSlackChannelConfigurationsRequest,list_slack_channel_configurations_request\nListSlackChannelConfigurationsResult,list_slack_channel_configurations_result\nListSlackWorkspaceConfigurationsRequest,list_slack_workspace_configurations_request\nListSlackWorkspaceConfigurationsResult,list_slack_workspace_configurations_result\nListSlotTypesRequest,list_slot_types_request\nListSlotTypesResponse,list_slot_types_response\nListSlotsRequest,list_slots_request\nListSlotsResponse,list_slots_response\nListSmartHomeAppliancesRequest,list_smart_home_appliances_request\nListSmartHomeAppliancesResponse,list_smart_home_appliances_response\nListSnapshotBlocksRequest,list_snapshot_blocks_request\nListSnapshotBlocksResponse,list_snapshot_blocks_response\nListSnapshotsInRecycleBinRequest,list_snapshots_in_recycle_bin_request\nListSnapshotsInRecycleBinResult,list_snapshots_in_recycle_bin_result\nListSnapshotsRequest,list_snapshots_request\nListSnapshotsResponse,list_snapshots_response\nListSnapshotsResult,list_snapshots_result\nListSolFunctionInstanceInfo,list_sol_function_instance_info\nListSolFunctionInstanceMetadata,list_sol_function_instance_metadata\nListSolFunctionInstancesInput,list_sol_function_instances_input\nListSolFunctionInstancesOutput,list_sol_function_instances_output\nListSolFunctionPackageInfo,list_sol_function_package_info\nListSolFunctionPackageMetadata,list_sol_function_package_metadata\nListSolFunctionPackagesInput,list_sol_function_packages_input\nListSolFunctionPackagesOutput,list_sol_function_packages_output\nListSolNetworkInstanceInfo,list_sol_network_instance_info\nListSolNetworkInstanceMetadata,list_sol_network_instance_metadata\nListSolNetworkInstancesInput,list_sol_network_instances_input\nListSolNetworkInstancesOutput,list_sol_network_instances_output\nListSolNetworkOperationsInfo,list_sol_network_operations_info\nListSolNetworkOperationsInput,list_sol_network_operations_input\nListSolNetworkOperationsMetadata,list_sol_network_operations_metadata\nListSolNetworkOperationsOutput,list_sol_network_operations_output\nListSolNetworkPackageInfo,list_sol_network_package_info\nListSolNetworkPackageMetadata,list_sol_network_package_metadata\nListSolNetworkPackagesInput,list_sol_network_packages_input\nListSolNetworkPackagesOutput,list_sol_network_packages_output\nListSolutionVersionsRequest,list_solution_versions_request\nListSolutionVersionsResponse,list_solution_versions_response\nListSolutionsRequest,list_solutions_request\nListSolutionsResponse,list_solutions_response\nListSopRecommendationsRequest,list_sop_recommendations_request\nListSopRecommendationsResponse,list_sop_recommendations_response\nListSourceApiAssociationsRequest,list_source_api_associations_request\nListSourceApiAssociationsResponse,list_source_api_associations_response\nListSourceCredentialsOutput,list_source_credentials_output\nListSourceLocationsRequest,list_source_locations_request\nListSourceLocationsResponse,list_source_locations_response\nListSourceRepositoriesItem,list_source_repositories_item\nListSourceRepositoriesRequest,list_source_repositories_request\nListSourceRepositoriesResponse,list_source_repositories_response\nListSourceRepositoryBranchesItem,list_source_repository_branches_item\nListSourceRepositoryBranchesRequest,list_source_repository_branches_request\nListSourceRepositoryBranchesResponse,list_source_repository_branches_response\nListSourceServerActionsRequest,list_source_server_actions_request\nListSourceServerActionsResponse,list_source_server_actions_response\nListSpacesRequest,list_spaces_request\nListSpacesResponse,list_spaces_response\nListSpeakerEnrollmentJobsRequest,list_speaker_enrollment_jobs_request\nListSpeakerEnrollmentJobsResponse,list_speaker_enrollment_jobs_response\nListSpeakersRequest,list_speakers_request\nListSpeakersResponse,list_speakers_response\nListSpeechSynthesisTasksInput,list_speech_synthesis_tasks_input\nListSpeechSynthesisTasksOutput,list_speech_synthesis_tasks_output\nListSqlInjectionMatchSetsRequest,list_sql_injection_match_sets_request\nListSqlInjectionMatchSetsResponse,list_sql_injection_match_sets_response\nListStackInstanceResourceDriftsInput,list_stack_instance_resource_drifts_input\nListStackInstanceResourceDriftsOutput,list_stack_instance_resource_drifts_output\nListStackInstancesForProvisionedProductInput,list_stack_instances_for_provisioned_product_input\nListStackInstancesForProvisionedProductOutput,list_stack_instances_for_provisioned_product_output\nListStackInstancesInput,list_stack_instances_input\nListStackInstancesOutput,list_stack_instances_output\nListStackResourcesInput,list_stack_resources_input\nListStackResourcesOutput,list_stack_resources_output\nListStackSetOperationResultsInput,list_stack_set_operation_results_input\nListStackSetOperationResultsOutput,list_stack_set_operation_results_output\nListStackSetOperationsInput,list_stack_set_operations_input\nListStackSetOperationsOutput,list_stack_set_operations_output\nListStackSetsInput,list_stack_sets_input\nListStackSetsOutput,list_stack_sets_output\nListStacksInput,list_stacks_input\nListStacksOutput,list_stacks_output\nListStageDeploymentsRequest,list_stage_deployments_request\nListStageDeploymentsResult,list_stage_deployments_result\nListStageDevicesRequest,list_stage_devices_request\nListStageDevicesResponse,list_stage_devices_response\nListStageSessionsRequest,list_stage_sessions_request\nListStageSessionsResponse,list_stage_sessions_response\nListStagesRequest,list_stages_request\nListStagesResponse,list_stages_response\nListStagesResult,list_stages_result\nListStagingAccountsRequest,list_staging_accounts_request\nListStagingAccountsResponse,list_staging_accounts_response\nListStandardsControlAssociationsRequest,list_standards_control_associations_request\nListStandardsControlAssociationsResponse,list_standards_control_associations_response\nListStateMachineAliasesInput,list_state_machine_aliases_input\nListStateMachineAliasesOutput,list_state_machine_aliases_output\nListStateMachineVersionsInput,list_state_machine_versions_input\nListStateMachineVersionsOutput,list_state_machine_versions_output\nListStateMachinesInput,list_state_machines_input\nListStateMachinesOutput,list_state_machines_output\nListStatementsRequest,list_statements_request\nListStatementsResponse,list_statements_response\nListStepsInput,list_steps_input\nListStepsOutput,list_steps_output\nListStorageLensConfigurationEntry,list_storage_lens_configuration_entry\nListStorageLensConfigurationsRequest,list_storage_lens_configurations_request\nListStorageLensConfigurationsResult,list_storage_lens_configurations_result\nListStorageSystemsRequest,list_storage_systems_request\nListStorageSystemsResponse,list_storage_systems_response\nListStoredQueriesRequest,list_stored_queries_request\nListStoredQueriesResponse,list_stored_queries_response\nListStreamConsumersInput,list_stream_consumers_input\nListStreamConsumersOutput,list_stream_consumers_output\nListStreamKeysRequest,list_stream_keys_request\nListStreamKeysResponse,list_stream_keys_response\nListStreamProcessorsRequest,list_stream_processors_request\nListStreamProcessorsResponse,list_stream_processors_response\nListStreamSessionsRequest,list_stream_sessions_request\nListStreamSessionsResponse,list_stream_sessions_response\nListStreamingDistributionsRequest,list_streaming_distributions_request\nListStreamingDistributionsResult,list_streaming_distributions_result\nListStreamingImagesRequest,list_streaming_images_request\nListStreamingImagesResponse,list_streaming_images_response\nListStreamingSessionBackupsRequest,list_streaming_session_backups_request\nListStreamingSessionBackupsResponse,list_streaming_session_backups_response\nListStreamingSessionsRequest,list_streaming_sessions_request\nListStreamingSessionsResponse,list_streaming_sessions_response\nListStreamsInput,list_streams_input\nListStreamsOutput,list_streams_output\nListStreamsRequest,list_streams_request\nListStreamsResponse,list_streams_response\nListStudioComponentsRequest,list_studio_components_request\nListStudioComponentsResponse,list_studio_components_response\nListStudioLifecycleConfigsRequest,list_studio_lifecycle_configs_request\nListStudioLifecycleConfigsResponse,list_studio_lifecycle_configs_response\nListStudioMembersRequest,list_studio_members_request\nListStudioMembersResponse,list_studio_members_response\nListStudioSessionMappingsInput,list_studio_session_mappings_input\nListStudioSessionMappingsOutput,list_studio_session_mappings_output\nListStudiosInput,list_studios_input\nListStudiosOutput,list_studios_output\nListStudiosRequest,list_studios_request\nListStudiosResponse,list_studios_response\nListSubChannelsRequest,list_sub_channels_request\nListSubChannelsResponse,list_sub_channels_response\nListSubjectsResponse,list_subjects_response\nListSubscribedRuleGroupsRequest,list_subscribed_rule_groups_request\nListSubscribedRuleGroupsResponse,list_subscribed_rule_groups_response\nListSubscribedWorkteamsRequest,list_subscribed_workteams_request\nListSubscribedWorkteamsResponse,list_subscribed_workteams_response\nListSubscribersRequest,list_subscribers_request\nListSubscribersResponse,list_subscribers_response\nListSubscriptionDefinitionVersionsRequest,list_subscription_definition_versions_request\nListSubscriptionDefinitionVersionsResponse,list_subscription_definition_versions_response\nListSubscriptionDefinitionsRequest,list_subscription_definitions_request\nListSubscriptionDefinitionsResponse,list_subscription_definitions_response\nListSubscriptionsByTopicInput,list_subscriptions_by_topic_input\nListSubscriptionsByTopicResponse,list_subscriptions_by_topic_response\nListSubscriptionsInput,list_subscriptions_input\nListSubscriptionsResponse,list_subscriptions_response\nListSuggestedResiliencyPoliciesRequest,list_suggested_resiliency_policies_request\nListSuggestedResiliencyPoliciesResponse,list_suggested_resiliency_policies_response\nListSuiteDefinitionsRequest,list_suite_definitions_request\nListSuiteDefinitionsResponse,list_suite_definitions_response\nListSuiteRunsRequest,list_suite_runs_request\nListSuiteRunsResponse,list_suite_runs_response\nListSuitesRequest,list_suites_request\nListSuitesResult,list_suites_result\nListSupportedCharacterSets,list_supported_character_sets\nListSupportedInstanceTypesInput,list_supported_instance_types_input\nListSupportedInstanceTypesOutput,list_supported_instance_types_output\nListSupportedPhoneNumberCountriesRequest,list_supported_phone_number_countries_request\nListSupportedPhoneNumberCountriesResponse,list_supported_phone_number_countries_response\nListSupportedResourceTypesInput,list_supported_resource_types_input\nListSupportedResourceTypesOutput,list_supported_resource_types_output\nListSupportedTimezones,list_supported_timezones\nListSuppressedDestinationsRequest,list_suppressed_destinations_request\nListSuppressedDestinationsResponse,list_suppressed_destinations_response\nListSyncJobsRequest,list_sync_jobs_request\nListSyncJobsResponse,list_sync_jobs_response\nListSyncResourcesRequest,list_sync_resources_request\nListSyncResourcesResponse,list_sync_resources_response\nListTLSInspectionConfigurationsRequest,list_tls_inspection_configurations_request\nListTLSInspectionConfigurationsResponse,list_tls_inspection_configurations_response\nListTableColumnsRequest,list_table_columns_request\nListTableColumnsResult,list_table_columns_result\nListTableMetadataInput,list_table_metadata_input\nListTableMetadataOutput,list_table_metadata_output\nListTableRestoreStatusRequest,list_table_restore_status_request\nListTableRestoreStatusResponse,list_table_restore_status_response\nListTableRowsRequest,list_table_rows_request\nListTableRowsResult,list_table_rows_result\nListTableStorageOptimizersRequest,list_table_storage_optimizers_request\nListTableStorageOptimizersResponse,list_table_storage_optimizers_response\nListTablesInput,list_tables_input\nListTablesOutput,list_tables_output\nListTablesRequest,list_tables_request\nListTablesResponse,list_tables_response\nListTablesResult,list_tables_result\nListTagOptionsFilters,list_tag_options_filters\nListTagOptionsInput,list_tag_options_input\nListTagOptionsOutput,list_tag_options_output\nListTags,list_tags\nListTagsForCertificateRequest,list_tags_for_certificate_request\nListTagsForCertificateResponse,list_tags_for_certificate_response\nListTagsForDeliveryStreamInput,list_tags_for_delivery_stream_input\nListTagsForDeliveryStreamOutput,list_tags_for_delivery_stream_output\nListTagsForDomainRequest,list_tags_for_domain_request\nListTagsForDomainResponse,list_tags_for_domain_response\nListTagsForProjectRequest,list_tags_for_project_request\nListTagsForProjectResult,list_tags_for_project_result\nListTagsForResourceInput,list_tags_for_resource_input\nListTagsForResourceMessage,list_tags_for_resource_message\nListTagsForResourceOutput,list_tags_for_resource_output\nListTagsForResourceRequest,list_tags_for_resource_request\nListTagsForResourceResponse,list_tags_for_resource_response\nListTagsForResourceResult,list_tags_for_resource_result\nListTagsForResourcesRequest,list_tags_for_resources_request\nListTagsForResourcesResponse,list_tags_for_resources_response\nListTagsForStreamInput,list_tags_for_stream_input\nListTagsForStreamOutput,list_tags_for_stream_output\nListTagsForVaultInput,list_tags_for_vault_input\nListTagsForVaultOutput,list_tags_for_vault_output\nListTagsInput,list_tags_input\nListTagsLogGroupRequest,list_tags_log_group_request\nListTagsLogGroupResponse,list_tags_log_group_response\nListTagsOfResourceInput,list_tags_of_resource_input\nListTagsOfResourceOutput,list_tags_of_resource_output\nListTagsOutput,list_tags_output\nListTagsRequest,list_tags_request\nListTagsResponse,list_tags_response\nListTagsResult,list_tags_result\nListTapePoolsInput,list_tape_pools_input\nListTapePoolsOutput,list_tape_pools_output\nListTapesInput,list_tapes_input\nListTapesOutput,list_tapes_output\nListTargetGroupsRequest,list_target_groups_request\nListTargetGroupsResponse,list_target_groups_response\nListTargetResourceTypesRequest,list_target_resource_types_request\nListTargetResourceTypesResponse,list_target_resource_types_response\nListTargetedSentimentDetectionJobsRequest,list_targeted_sentiment_detection_jobs_request\nListTargetedSentimentDetectionJobsResponse,list_targeted_sentiment_detection_jobs_response\nListTargetsByRuleRequest,list_targets_by_rule_request\nListTargetsByRuleResponse,list_targets_by_rule_response\nListTargetsFilter,list_targets_filter\nListTargetsForPolicyRequest,list_targets_for_policy_request\nListTargetsForPolicyResponse,list_targets_for_policy_response\nListTargetsForSecurityProfileRequest,list_targets_for_security_profile_request\nListTargetsForSecurityProfileResponse,list_targets_for_security_profile_response\nListTargetsRequest,list_targets_request\nListTargetsResponse,list_targets_response\nListTargetsResult,list_targets_result\nListTaskDefinitionFamiliesRequest,list_task_definition_families_request\nListTaskDefinitionFamiliesResponse,list_task_definition_families_response\nListTaskDefinitionsRequest,list_task_definitions_request\nListTaskDefinitionsResponse,list_task_definitions_response\nListTaskExecutionsRequest,list_task_executions_request\nListTaskExecutionsResponse,list_task_executions_response\nListTaskTemplatesRequest,list_task_templates_request\nListTaskTemplatesResponse,list_task_templates_response\nListTasksInput,list_tasks_input\nListTasksOutput,list_tasks_output\nListTasksRequest,list_tasks_request\nListTasksResponse,list_tasks_response\nListTeamMembersRequest,list_team_members_request\nListTeamMembersResult,list_team_members_result\nListTemplateActionsRequest,list_template_actions_request\nListTemplateActionsResponse,list_template_actions_response\nListTemplateAliasesRequest,list_template_aliases_request\nListTemplateAliasesResponse,list_template_aliases_response\nListTemplateGroupAccessControlEntriesRequest,list_template_group_access_control_entries_request\nListTemplateGroupAccessControlEntriesResponse,list_template_group_access_control_entries_response\nListTemplateStepGroupsRequest,list_template_step_groups_request\nListTemplateStepGroupsResponse,list_template_step_groups_response\nListTemplateStepsRequest,list_template_steps_request\nListTemplateStepsResponse,list_template_steps_response\nListTemplateVersionsRequest,list_template_versions_request\nListTemplateVersionsResponse,list_template_versions_response\nListTemplatesRequest,list_templates_request\nListTemplatesResponse,list_templates_response\nListTerminologiesRequest,list_terminologies_request\nListTerminologiesResponse,list_terminologies_response\nListTestExecutionResultItemsRequest,list_test_execution_result_items_request\nListTestExecutionResultItemsResponse,list_test_execution_result_items_response\nListTestExecutionsRequest,list_test_executions_request\nListTestExecutionsResponse,list_test_executions_response\nListTestGridProjectsRequest,list_test_grid_projects_request\nListTestGridProjectsResult,list_test_grid_projects_result\nListTestGridSessionActionsRequest,list_test_grid_session_actions_request\nListTestGridSessionActionsResult,list_test_grid_session_actions_result\nListTestGridSessionArtifactsRequest,list_test_grid_session_artifacts_request\nListTestGridSessionArtifactsResult,list_test_grid_session_artifacts_result\nListTestGridSessionsRequest,list_test_grid_sessions_request\nListTestGridSessionsResult,list_test_grid_sessions_result\nListTestRecommendationsRequest,list_test_recommendations_request\nListTestRecommendationsResponse,list_test_recommendations_response\nListTestSetRecordsRequest,list_test_set_records_request\nListTestSetRecordsResponse,list_test_set_records_response\nListTestSetsRequest,list_test_sets_request\nListTestSetsResponse,list_test_sets_response\nListTestsRequest,list_tests_request\nListTestsResult,list_tests_result\nListTextTranslationJobsRequest,list_text_translation_jobs_request\nListTextTranslationJobsResponse,list_text_translation_jobs_response\nListThemeAliasesRequest,list_theme_aliases_request\nListThemeAliasesResponse,list_theme_aliases_response\nListThemeVersionsRequest,list_theme_versions_request\nListThemeVersionsResponse,list_theme_versions_response\nListThemesRequest,list_themes_request\nListThemesResponse,list_themes_response\nListThesauriRequest,list_thesauri_request\nListThesauriResponse,list_thesauri_response\nListThingGroupsForThingRequest,list_thing_groups_for_thing_request\nListThingGroupsForThingResponse,list_thing_groups_for_thing_response\nListThingGroupsRequest,list_thing_groups_request\nListThingGroupsResponse,list_thing_groups_response\nListThingPrincipalsRequest,list_thing_principals_request\nListThingPrincipalsResponse,list_thing_principals_response\nListThingRegistrationTaskReportsRequest,list_thing_registration_task_reports_request\nListThingRegistrationTaskReportsResponse,list_thing_registration_task_reports_response\nListThingRegistrationTasksRequest,list_thing_registration_tasks_request\nListThingRegistrationTasksResponse,list_thing_registration_tasks_response\nListThingTypesRequest,list_thing_types_request\nListThingTypesResponse,list_thing_types_response\nListThingsInBillingGroupRequest,list_things_in_billing_group_request\nListThingsInBillingGroupResponse,list_things_in_billing_group_response\nListThingsInThingGroupRequest,list_things_in_thing_group_request\nListThingsInThingGroupResponse,list_things_in_thing_group_response\nListThingsRequest,list_things_request\nListThingsResponse,list_things_response\nListThirdPartyFirewallFirewallPoliciesRequest,list_third_party_firewall_firewall_policies_request\nListThirdPartyFirewallFirewallPoliciesResponse,list_third_party_firewall_firewall_policies_response\nListThreatIntelSetsRequest,list_threat_intel_sets_request\nListThreatIntelSetsResponse,list_threat_intel_sets_response\nListTimeSeriesRequest,list_time_series_request\nListTimeSeriesResponse,list_time_series_response\nListTimelineEventsInput,list_timeline_events_input\nListTimelineEventsOutput,list_timeline_events_output\nListTokenBalancesInput,list_token_balances_input\nListTokenBalancesOutput,list_token_balances_output\nListTokensRequest,list_tokens_request\nListTokensResponse,list_tokens_response\nListTopicRefreshSchedulesRequest,list_topic_refresh_schedules_request\nListTopicRefreshSchedulesResponse,list_topic_refresh_schedules_response\nListTopicRuleDestinationsRequest,list_topic_rule_destinations_request\nListTopicRuleDestinationsResponse,list_topic_rule_destinations_response\nListTopicRulesRequest,list_topic_rules_request\nListTopicRulesResponse,list_topic_rules_response\nListTopicsDetectionJobsRequest,list_topics_detection_jobs_request\nListTopicsDetectionJobsResponse,list_topics_detection_jobs_response\nListTopicsInput,list_topics_input\nListTopicsRequest,list_topics_request\nListTopicsResponse,list_topics_response\nListTrackerConsumersRequest,list_tracker_consumers_request\nListTrackerConsumersResponse,list_tracker_consumers_response\nListTrackersRequest,list_trackers_request\nListTrackersResponse,list_trackers_response\nListTrackersResponseEntry,list_trackers_response_entry\nListTrafficDistributionGroupUsersRequest,list_traffic_distribution_group_users_request\nListTrafficDistributionGroupUsersResponse,list_traffic_distribution_group_users_response\nListTrafficDistributionGroupsRequest,list_traffic_distribution_groups_request\nListTrafficDistributionGroupsResponse,list_traffic_distribution_groups_response\nListTrafficPoliciesRequest,list_traffic_policies_request\nListTrafficPoliciesResponse,list_traffic_policies_response\nListTrafficPolicyInstancesByHostedZoneRequest,list_traffic_policy_instances_by_hosted_zone_request\nListTrafficPolicyInstancesByHostedZoneResponse,list_traffic_policy_instances_by_hosted_zone_response\nListTrafficPolicyInstancesByPolicyRequest,list_traffic_policy_instances_by_policy_request\nListTrafficPolicyInstancesByPolicyResponse,list_traffic_policy_instances_by_policy_response\nListTrafficPolicyInstancesRequest,list_traffic_policy_instances_request\nListTrafficPolicyInstancesResponse,list_traffic_policy_instances_response\nListTrafficPolicyVersionsRequest,list_traffic_policy_versions_request\nListTrafficPolicyVersionsResponse,list_traffic_policy_versions_response\nListTrailsRequest,list_trails_request\nListTrailsResponse,list_trails_response\nListTrainingJobsForHyperParameterTuningJobRequest,list_training_jobs_for_hyper_parameter_tuning_job_request\nListTrainingJobsForHyperParameterTuningJobResponse,list_training_jobs_for_hyper_parameter_tuning_job_response\nListTrainingJobsRequest,list_training_jobs_request\nListTrainingJobsResponse,list_training_jobs_response\nListTransactionEventsInput,list_transaction_events_input\nListTransactionEventsOutput,list_transaction_events_output\nListTransactionsInput,list_transactions_input\nListTransactionsOutput,list_transactions_output\nListTransactionsRequest,list_transactions_request\nListTransactionsResponse,list_transactions_response\nListTransactionsSort,list_transactions_sort\nListTranscriptionJobsRequest,list_transcription_jobs_request\nListTranscriptionJobsResponse,list_transcription_jobs_response\nListTransformJobsRequest,list_transform_jobs_request\nListTransformJobsResponse,list_transform_jobs_response\nListTrialComponentsRequest,list_trial_components_request\nListTrialComponentsResponse,list_trial_components_response\nListTrialsRequest,list_trials_request\nListTrialsResponse,list_trials_response\nListTriggersRequest,list_triggers_request\nListTriggersResponse,list_triggers_response\nListTrustAnchorsResponse,list_trust_anchors_response\nListTrustStoreCertificatesRequest,list_trust_store_certificates_request\nListTrustStoreCertificatesResponse,list_trust_store_certificates_response\nListTrustStoresRequest,list_trust_stores_request\nListTrustStoresResponse,list_trust_stores_response\nListTunnelsRequest,list_tunnels_request\nListTunnelsResponse,list_tunnels_response\nListType,list_type\nListTypeRegistrationsInput,list_type_registrations_input\nListTypeRegistrationsOutput,list_type_registrations_output\nListTypeVersionsInput,list_type_versions_input\nListTypeVersionsOutput,list_type_versions_output\nListTypedLinkFacetAttributesRequest,list_typed_link_facet_attributes_request\nListTypedLinkFacetAttributesResponse,list_typed_link_facet_attributes_response\nListTypedLinkFacetNamesRequest,list_typed_link_facet_names_request\nListTypedLinkFacetNamesResponse,list_typed_link_facet_names_response\nListTypesByAssociationRequest,list_types_by_association_request\nListTypesByAssociationResponse,list_types_by_association_response\nListTypesInput,list_types_input\nListTypesOutput,list_types_output\nListTypesRequest,list_types_request\nListTypesResponse,list_types_response\nListUniqueProblemsRequest,list_unique_problems_request\nListUniqueProblemsResult,list_unique_problems_result\nListUnsupportedAppVersionResourcesRequest,list_unsupported_app_version_resources_request\nListUnsupportedAppVersionResourcesResponse,list_unsupported_app_version_resources_response\nListUpdateToken,list_update_token\nListUpdatesRequest,list_updates_request\nListUpdatesResponse,list_updates_response\nListUploadsRequest,list_uploads_request\nListUploadsResult,list_uploads_result\nListUsageForLicenseConfigurationRequest,list_usage_for_license_configuration_request\nListUsageForLicenseConfigurationResponse,list_usage_for_license_configuration_response\nListUsageLimitsRequest,list_usage_limits_request\nListUsageLimitsResponse,list_usage_limits_response\nListUsageTotalsRequest,list_usage_totals_request\nListUsageTotalsResponse,list_usage_totals_response\nListUseCasesRequest,list_use_cases_request\nListUseCasesResponse,list_use_cases_response\nListUserAccessLoggingSettingsRequest,list_user_access_logging_settings_request\nListUserAccessLoggingSettingsResponse,list_user_access_logging_settings_response\nListUserAssociationsRequest,list_user_associations_request\nListUserAssociationsResponse,list_user_associations_response\nListUserGroupsRequest,list_user_groups_request\nListUserGroupsResponse,list_user_groups_response\nListUserHierarchyGroupsRequest,list_user_hierarchy_groups_request\nListUserHierarchyGroupsResponse,list_user_hierarchy_groups_response\nListUserImportJobsRequest,list_user_import_jobs_request\nListUserImportJobsResponse,list_user_import_jobs_response\nListUserPoliciesRequest,list_user_policies_request\nListUserPoliciesResponse,list_user_policies_response\nListUserPoolClientsRequest,list_user_pool_clients_request\nListUserPoolClientsResponse,list_user_pool_clients_response\nListUserPoolsRequest,list_user_pools_request\nListUserPoolsResponse,list_user_pools_response\nListUserProfilesRequest,list_user_profiles_request\nListUserProfilesResponse,list_user_profiles_response\nListUserProfilesResult,list_user_profiles_result\nListUserSettingsRequest,list_user_settings_request\nListUserSettingsResponse,list_user_settings_response\nListUserTagsRequest,list_user_tags_request\nListUserTagsResponse,list_user_tags_response\nListUsersByPermissionGroupRequest,list_users_by_permission_group_request\nListUsersByPermissionGroupResponse,list_users_by_permission_group_response\nListUsersFilters,list_users_filters\nListUsersInGroupRequest,list_users_in_group_request\nListUsersInGroupResponse,list_users_in_group_response\nListUsersRequest,list_users_request\nListUsersResponse,list_users_response\nListUtteranceAnalyticsDataRequest,list_utterance_analytics_data_request\nListUtteranceAnalyticsDataResponse,list_utterance_analytics_data_response\nListUtteranceMetricsRequest,list_utterance_metrics_request\nListUtteranceMetricsResponse,list_utterance_metrics_response\nListV2LoggingLevelsRequest,list_v2_logging_levels_request\nListV2LoggingLevelsResponse,list_v2_logging_levels_response\nListVPCAssociationAuthorizationsRequest,list_vpc_association_authorizations_request\nListVPCAssociationAuthorizationsResponse,list_vpc_association_authorizations_response\nListVPCConnectionsRequest,list_vpc_connections_request\nListVPCConnectionsResponse,list_vpc_connections_response\nListVPCEConfigurationsRequest,list_vpce_configurations_request\nListVPCEConfigurationsResult,list_vpce_configurations_result\nListVariantImportJobsFilter,list_variant_import_jobs_filter\nListVariantImportJobsRequest,list_variant_import_jobs_request\nListVariantImportJobsResponse,list_variant_import_jobs_response\nListVariantStoresFilter,list_variant_stores_filter\nListVariantStoresRequest,list_variant_stores_request\nListVariantStoresResponse,list_variant_stores_response\nListVaultsInput,list_vaults_input\nListVaultsOutput,list_vaults_output\nListVectorEnrichmentJobInput,list_vector_enrichment_job_input\nListVectorEnrichmentJobOutput,list_vector_enrichment_job_output\nListVectorEnrichmentJobOutputConfig,list_vector_enrichment_job_output_config\nListVehiclesInFleetRequest,list_vehicles_in_fleet_request\nListVehiclesInFleetResponse,list_vehicles_in_fleet_response\nListVehiclesRequest,list_vehicles_request\nListVehiclesResponse,list_vehicles_response\nListVerifiedEmailAddressesResponse,list_verified_email_addresses_response\nListVersionsByFunctionRequest,list_versions_by_function_request\nListVersionsByFunctionResponse,list_versions_by_function_response\nListVersionsRequest,list_versions_request\nListVersionsResponse,list_versions_response\nListViewVersionsRequest,list_view_versions_request\nListViewVersionsResponse,list_view_versions_response\nListViewsInput,list_views_input\nListViewsOutput,list_views_output\nListViewsRequest,list_views_request\nListViewsResponse,list_views_response\nListViolationEventsRequest,list_violation_events_request\nListViolationEventsResponse,list_violation_events_response\nListVirtualClustersRequest,list_virtual_clusters_request\nListVirtualClustersResponse,list_virtual_clusters_response\nListVirtualGatewaysInput,list_virtual_gateways_input\nListVirtualGatewaysOutput,list_virtual_gateways_output\nListVirtualInterfaceTestHistoryRequest,list_virtual_interface_test_history_request\nListVirtualInterfaceTestHistoryResponse,list_virtual_interface_test_history_response\nListVirtualMFADevicesRequest,list_virtual_mfa_devices_request\nListVirtualMFADevicesResponse,list_virtual_mfa_devices_response\nListVirtualMachinesInput,list_virtual_machines_input\nListVirtualMachinesOutput,list_virtual_machines_output\nListVirtualNodesInput,list_virtual_nodes_input\nListVirtualNodesOutput,list_virtual_nodes_output\nListVirtualRoutersInput,list_virtual_routers_input\nListVirtualRoutersOutput,list_virtual_routers_output\nListVirtualServicesInput,list_virtual_services_input\nListVirtualServicesOutput,list_virtual_services_output\nListVocabulariesRequest,list_vocabularies_request\nListVocabulariesResponse,list_vocabularies_response\nListVocabularyFiltersRequest,list_vocabulary_filters_request\nListVocabularyFiltersResponse,list_vocabulary_filters_response\nListVodSourcesRequest,list_vod_sources_request\nListVodSourcesResponse,list_vod_sources_response\nListVoiceConnectorGroupsRequest,list_voice_connector_groups_request\nListVoiceConnectorGroupsResponse,list_voice_connector_groups_response\nListVoiceConnectorTerminationCredentialsRequest,list_voice_connector_termination_credentials_request\nListVoiceConnectorTerminationCredentialsResponse,list_voice_connector_termination_credentials_response\nListVoiceConnectorsRequest,list_voice_connectors_request\nListVoiceConnectorsResponse,list_voice_connectors_response\nListVoiceProfileDomainsRequest,list_voice_profile_domains_request\nListVoiceProfileDomainsResponse,list_voice_profile_domains_response\nListVoiceProfilesRequest,list_voice_profiles_request\nListVoiceProfilesResponse,list_voice_profiles_response\nListVolumeInitiatorsInput,list_volume_initiators_input\nListVolumeInitiatorsOutput,list_volume_initiators_output\nListVolumeRecoveryPointsInput,list_volume_recovery_points_input\nListVolumeRecoveryPointsOutput,list_volume_recovery_points_output\nListVolumesInput,list_volumes_input\nListVolumesOutput,list_volumes_output\nListVpcConnectionsRequest,list_vpc_connections_request\nListVpcConnectionsResponse,list_vpc_connections_response\nListVpcConnectorsRequest,list_vpc_connectors_request\nListVpcConnectorsResponse,list_vpc_connectors_response\nListVpcEndpointAccessRequest,list_vpc_endpoint_access_request\nListVpcEndpointAccessResponse,list_vpc_endpoint_access_response\nListVpcEndpointsForDomainRequest,list_vpc_endpoints_for_domain_request\nListVpcEndpointsForDomainResponse,list_vpc_endpoints_for_domain_response\nListVpcEndpointsRequest,list_vpc_endpoints_request\nListVpcEndpointsResponse,list_vpc_endpoints_response\nListVpcIngressConnectionsFilter,list_vpc_ingress_connections_filter\nListVpcIngressConnectionsRequest,list_vpc_ingress_connections_request\nListVpcIngressConnectionsResponse,list_vpc_ingress_connections_response\nListWatchlistsRequest,list_watchlists_request\nListWatchlistsResponse,list_watchlists_response\nListWavesRequest,list_waves_request\nListWavesRequestFilters,list_waves_request_filters\nListWavesResponse,list_waves_response\nListWebACLsRequest,list_web_acls_request\nListWebACLsResponse,list_web_acls_response\nListWebhookItem,list_webhook_item\nListWebhooksInput,list_webhooks_input\nListWebhooksOutput,list_webhooks_output\nListWebhooksRequest,list_webhooks_request\nListWebhooksResult,list_webhooks_result\nListWebsiteAuthorizationProvidersRequest,list_website_authorization_providers_request\nListWebsiteAuthorizationProvidersResponse,list_website_authorization_providers_response\nListWebsiteCertificateAuthoritiesRequest,list_website_certificate_authorities_request\nListWebsiteCertificateAuthoritiesResponse,list_website_certificate_authorities_response\nListWhatIfAnalysesRequest,list_what_if_analyses_request\nListWhatIfAnalysesResponse,list_what_if_analyses_response\nListWhatIfForecastExportsRequest,list_what_if_forecast_exports_request\nListWhatIfForecastExportsResponse,list_what_if_forecast_exports_response\nListWhatIfForecastsRequest,list_what_if_forecasts_request\nListWhatIfForecastsResponse,list_what_if_forecasts_response\nListWirelessDeviceImportTasksRequest,list_wireless_device_import_tasks_request\nListWirelessDeviceImportTasksResponse,list_wireless_device_import_tasks_response\nListWirelessDevicesRequest,list_wireless_devices_request\nListWirelessDevicesResponse,list_wireless_devices_response\nListWirelessGatewayTaskDefinitionsRequest,list_wireless_gateway_task_definitions_request\nListWirelessGatewayTaskDefinitionsResponse,list_wireless_gateway_task_definitions_response\nListWirelessGatewaysRequest,list_wireless_gateways_request\nListWirelessGatewaysResponse,list_wireless_gateways_response\nListWorkGroupsInput,list_work_groups_input\nListWorkGroupsOutput,list_work_groups_output\nListWorkerBlocksRequest,list_worker_blocks_request\nListWorkerBlocksResponse,list_worker_blocks_response\nListWorkerConfigurationsRequest,list_worker_configurations_request\nListWorkerConfigurationsResponse,list_worker_configurations_response\nListWorkerFleetsRequest,list_worker_fleets_request\nListWorkerFleetsResponse,list_worker_fleets_response\nListWorkersRequest,list_workers_request\nListWorkersResponse,list_workers_response\nListWorkersWithQualificationTypeRequest,list_workers_with_qualification_type_request\nListWorkersWithQualificationTypeResponse,list_workers_with_qualification_type_response\nListWorkflowExecutionsRequest,list_workflow_executions_request\nListWorkflowExecutionsResponse,list_workflow_executions_response\nListWorkflowStepExecutionsRequest,list_workflow_step_executions_request\nListWorkflowStepExecutionsResponse,list_workflow_step_executions_response\nListWorkflowStepGroupsRequest,list_workflow_step_groups_request\nListWorkflowStepGroupsResponse,list_workflow_step_groups_response\nListWorkflowStepsRequest,list_workflow_steps_request\nListWorkflowStepsResponse,list_workflow_steps_response\nListWorkflowTypesInput,list_workflow_types_input\nListWorkflowsItem,list_workflows_item\nListWorkflowsRequest,list_workflows_request\nListWorkflowsResponse,list_workflows_response\nListWorkforcesRequest,list_workforces_request\nListWorkforcesResponse,list_workforces_response\nListWorkgroupsRequest,list_workgroups_request\nListWorkgroupsResponse,list_workgroups_response\nListWorkloadSharesInput,list_workload_shares_input\nListWorkloadSharesOutput,list_workload_shares_output\nListWorkloadsInput,list_workloads_input\nListWorkloadsOutput,list_workloads_output\nListWorkloadsRequest,list_workloads_request\nListWorkloadsResponse,list_workloads_response\nListWorkspacesRequest,list_workspaces_request\nListWorkspacesResponse,list_workspaces_response\nListWorkteamsRequest,list_workteams_request\nListWorkteamsResponse,list_workteams_response\nListWorldExportJobsRequest,list_world_export_jobs_request\nListWorldExportJobsResponse,list_world_export_jobs_response\nListWorldGenerationJobsRequest,list_world_generation_jobs_request\nListWorldGenerationJobsResponse,list_world_generation_jobs_response\nListWorldTemplatesRequest,list_world_templates_request\nListWorldTemplatesResponse,list_world_templates_response\nListWorldsRequest,list_worlds_request\nListWorldsResponse,list_worlds_response\nListXssMatchSetsRequest,list_xss_match_sets_request\nListXssMatchSetsResponse,list_xss_match_sets_response\nListZonalShiftsRequest,list_zonal_shifts_request\nListZonalShiftsResponse,list_zonal_shifts_response\nListedAccess,listed_access\nListedAgreement,listed_agreement\nListedBridge,listed_bridge\nListedCertificate,listed_certificate\nListedConnector,listed_connector\nListedEntitlement,listed_entitlement\nListedExecution,listed_execution\nListedFlow,listed_flow\nListedGateway,listed_gateway\nListedGatewayInstance,listed_gateway_instance\nListedHostKey,listed_host_key\nListedProfile,listed_profile\nListedServer,listed_server\nListedUser,listed_user\nListedWorkflow,listed_workflow\nListener,listener\nListenerAddress,listener_address\nListenerArn,listener_arn\nListenerArns,listener_arns\nListenerDescription,listener_description\nListenerDescriptions,listener_descriptions\nListenerEndpoint,listener_endpoint\nListenerNotFoundException,listener_not_found_exception\nListenerPort,listener_port\nListenerSummary,listener_summary\nListenerTls,listener_tls\nListenerTlsAcmCertificate,listener_tls_acm_certificate\nListenerTlsFileCertificate,listener_tls_file_certificate\nListenerTlsSdsCertificate,listener_tls_sds_certificate\nListenerTlsValidationContext,listener_tls_validation_context\nListeners,listeners\nListingId,listing_id\nListingTime,listing_time\nLiteralArrayOptions,literal_array_options\nLiteralOptions,literal_options\nLiveConnectorRTMPConfiguration,live_connector_rtmp_configuration\nLiveConnectorSinkConfiguration,live_connector_sink_configuration\nLiveConnectorSourceConfiguration,live_connector_source_configuration\nLivePoolProgress,live_pool_progress\nLivePreRollConfiguration,live_pre_roll_configuration\nLiveSimulationState,live_simulation_state\nLiveSource,live_source\nLiveSourceName,live_source_name\nLivenessOutputConfig,liveness_output_config\nLoRaWAN,lo_ra_wan\nLoRaWANConnectionStatusEventNotificationConfigurations,lo_ra_wan_connection_status_event_notification_configurations\nLoRaWANConnectionStatusResourceTypeEventConfiguration,lo_ra_wan_connection_status_resource_type_event_configuration\nLoRaWANDevice,lo_ra_wan_device\nLoRaWANDeviceMetadata,lo_ra_wan_device_metadata\nLoRaWANDeviceProfile,lo_ra_wan_device_profile\nLoRaWANFuotaTask,lo_ra_wan_fuota_task\nLoRaWANFuotaTaskGetInfo,lo_ra_wan_fuota_task_get_info\nLoRaWANGateway,lo_ra_wan_gateway\nLoRaWANGatewayCurrentVersion,lo_ra_wan_gateway_current_version\nLoRaWANGatewayMetadata,lo_ra_wan_gateway_metadata\nLoRaWANGatewayVersion,lo_ra_wan_gateway_version\nLoRaWANGetServiceProfileInfo,lo_ra_wan_get_service_profile_info\nLoRaWANJoinEventNotificationConfigurations,lo_ra_wan_join_event_notification_configurations\nLoRaWANJoinResourceTypeEventConfiguration,lo_ra_wan_join_resource_type_event_configuration\nLoRaWANListDevice,lo_ra_wan_list_device\nLoRaWANMulticast,lo_ra_wan_multicast\nLoRaWANMulticastGet,lo_ra_wan_multicast_get\nLoRaWANMulticastMetadata,lo_ra_wan_multicast_metadata\nLoRaWANMulticastSession,lo_ra_wan_multicast_session\nLoRaWANNetworkServerCertificateId,lo_ra_wan_network_server_certificate_id\nLoRaWANSendDataToDevice,lo_ra_wan_send_data_to_device\nLoRaWANServiceProfile,lo_ra_wan_service_profile\nLoRaWANStartFuotaTask,lo_ra_wan_start_fuota_task\nLoRaWANUpdateDevice,lo_ra_wan_update_device\nLoRaWANUpdateGatewayTaskCreate,lo_ra_wan_update_gateway_task_create\nLoRaWANUpdateGatewayTaskEntry,lo_ra_wan_update_gateway_task_entry\nLoRoCenterMixLevel,lo_ro_center_mix_level\nLoRoSurroundMixLevel,lo_ro_surround_mix_level\nLoa,loa\nLoadAverage,load_average\nLoadBalancer,load_balancer\nLoadBalancerAddress,load_balancer_address\nLoadBalancerAddresses,load_balancer_addresses\nLoadBalancerArn,load_balancer_arn\nLoadBalancerArns,load_balancer_arns\nLoadBalancerAttribute,load_balancer_attribute\nLoadBalancerAttributeNotFoundException,load_balancer_attribute_not_found_exception\nLoadBalancerAttributes,load_balancer_attributes\nLoadBalancerDescription,load_balancer_description\nLoadBalancerDescriptions,load_balancer_descriptions\nLoadBalancerInfo,load_balancer_info\nLoadBalancerListenerPort,load_balancer_listener_port\nLoadBalancerName,load_balancer_name\nLoadBalancerNames,load_balancer_names\nLoadBalancerNotFoundException,load_balancer_not_found_exception\nLoadBalancerOptions,load_balancer_options\nLoadBalancerPort,load_balancer_port\nLoadBalancerPorts,load_balancer_ports\nLoadBalancerState,load_balancer_state\nLoadBalancerTarget,load_balancer_target\nLoadBalancerTargetGroup,load_balancer_target_group\nLoadBalancerTargetGroupARN,load_balancer_target_group_arn\nLoadBalancerTargetGroupState,load_balancer_target_group_state\nLoadBalancerTargetGroups,load_balancer_target_groups\nLoadBalancerTargetPort,load_balancer_target_port\nLoadBalancerTlsCertificate,load_balancer_tls_certificate\nLoadBalancerTlsCertificateDnsRecordCreationState,load_balancer_tls_certificate_dns_record_creation_state\nLoadBalancerTlsCertificateDomainValidationOption,load_balancer_tls_certificate_domain_validation_option\nLoadBalancerTlsCertificateDomainValidationRecord,load_balancer_tls_certificate_domain_validation_record\nLoadBalancerTlsCertificateRenewalSummary,load_balancer_tls_certificate_renewal_summary\nLoadBalancerTlsCertificateSummary,load_balancer_tls_certificate_summary\nLoadBalancerTlsPolicy,load_balancer_tls_policy\nLoadBalancerType,load_balancer_type\nLoadBalancers,load_balancers\nLoadBalancersConfig,load_balancers_config\nLoadBasedAutoScalingConfiguration,load_based_auto_scaling_configuration\nLoadBasedAutoScalingConfigurations,load_based_auto_scaling_configurations\nLoadDryRunConfig,load_dry_run_config\nLoadForecast,load_forecast\nLoadPermission,load_permission\nLoadPermissionModifications,load_permission_modifications\nLoadPermissionRequest,load_permission_request\nLoadPermissions,load_permissions\nLoadSampleData,load_sample_data\nLoadThreshold,load_threshold\nLoadTimeout,load_timeout\nLoadUrlAccessDeniedException,load_url_access_denied_exception\nLoaderIdResult,loader_id_result\nLoadingAnimation,loading_animation\nLocalAddress,local_address\nLocalBgpAsn,local_bgp_asn\nLocalCollectorS3Access,local_collector_s3_access\nLocalConsolePassword,local_console_password\nLocalDeviceResourceData,local_device_resource_data\nLocalDirectoryPath,local_directory_path\nLocalDomainInfo,local_domain_info\nLocalGateway,local_gateway\nLocalGatewayId,local_gateway_id\nLocalGatewayIds,local_gateway_ids\nLocalGatewayRoute,local_gateway_route\nLocalGatewayRouteTable,local_gateway_route_table\nLocalGatewayRouteTableArn,local_gateway_route_table_arn\nLocalGatewayRouteTableId,local_gateway_route_table_id\nLocalGatewayRouteTableIds,local_gateway_route_table_ids\nLocalGatewayRouteTableVirtualInterfaceGroupAssociation,local_gateway_route_table_virtual_interface_group_association\nLocalGatewayRouteTableVirtualInterfaceGroupAssociationId,local_gateway_route_table_virtual_interface_group_association_id\nLocalGatewayRouteTableVirtualInterfaceGroupAssociationIds,local_gateway_route_table_virtual_interface_group_association_ids\nLocalGatewayRouteTableVirtualInterfaceGroupAssociations,local_gateway_route_table_virtual_interface_group_associations\nLocalGatewayRouteTableVpcAssociation,local_gateway_route_table_vpc_association\nLocalGatewayRouteTableVpcAssociationId,local_gateway_route_table_vpc_association_id\nLocalGatewayRouteTableVpcAssociationIds,local_gateway_route_table_vpc_association_ids\nLocalGatewayRouteTableVpcAssociations,local_gateway_route_table_vpc_associations\nLocalGatewayRouteTables,local_gateway_route_tables\nLocalGatewayVirtualInterface,local_gateway_virtual_interface\nLocalGatewayVirtualInterfaceGroup,local_gateway_virtual_interface_group\nLocalGatewayVirtualInterfaceGroupId,local_gateway_virtual_interface_group_id\nLocalGatewayVirtualInterfaceGroupIds,local_gateway_virtual_interface_group_ids\nLocalGatewayVirtualInterfaceGroups,local_gateway_virtual_interface_groups\nLocalGatewayVirtualInterfaceId,local_gateway_virtual_interface_id\nLocalGatewayVirtualInterfaceIds,local_gateway_virtual_interface_ids\nLocalGatewayVirtualInterfaces,local_gateway_virtual_interfaces\nLocalGateways,local_gateways\nLocalHealthEventsConfig,local_health_events_config\nLocalIpDetails,local_ip_details\nLocalIpv4NetworkCidr,local_ipv4_network_cidr\nLocalIpv6NetworkCidr,local_ipv6_network_cidr\nLocalMountPath,local_mount_path\nLocalNavigationConfiguration,local_navigation_configuration\nLocalPath,local_path\nLocalPortDetails,local_port_details\nLocalProfileId,local_profile_id\nLocalSecondaryIndex,local_secondary_index\nLocalSecondaryIndexDescription,local_secondary_index_description\nLocalSecondaryIndexInfo,local_secondary_index_info\nLocalSecondaryIndexOverride,local_secondary_index_override\nLocalSecondaryIndexes,local_secondary_indexes\nLocalSizeConfig,local_size_config\nLocalStorage,local_storage\nLocalStorageTypes,local_storage_types\nLocalTarget,local_target\nLocalTime,local_time\nLocalVolumeResourceData,local_volume_resource_data\nLocalWriteForwardingStatus,local_write_forwarding_status\nLocale,locale\nLocaleCode,locale_code\nLocaleId,locale_id\nLocaleValue,locale_value\nLocaleValues,locale_values\nLocality,locality\nLocation,location\nLocationARN,location_arn\nLocationAction,location_action\nLocationArn,location_arn\nLocationAttributes,location_attributes\nLocationConfiguration,location_configuration\nLocationConstraint,location_constraint\nLocationFilter,location_filter\nLocationListEntry,location_list_entry\nLocationModel,location_model\nLocationName,location_name\nLocationOrder,location_order\nLocationState,location_state\nLocationStates,location_states\nLocationSummary,location_summary\nLocationTimestamp,location_timestamp\nLocationType,location_type\nLocationUri,location_uri\nLocations,locations\nLockConfiguration,lock_configuration\nLockDate,lock_date\nLockEndTime,lock_end_time\nLockRuleRequest,lock_rule_request\nLockRuleResponse,lock_rule_response\nLockState,lock_state\nLockToken,lock_token\nLocked,locked\nLockedSubscriptionException,locked_subscription_exception\nLockoutPreventedException,lockout_prevented_exception\nLockoutPreventionException,lockout_prevention_exception\nLogAnomalyClass,log_anomaly_class\nLogAnomalyClasses,log_anomaly_classes\nLogAnomalyShowcase,log_anomaly_showcase\nLogAnomalyShowcases,log_anomaly_showcases\nLogAnomalyToken,log_anomaly_token\nLogAnomalyType,log_anomaly_type\nLogBucket,log_bucket\nLogBucketList,log_bucket_list\nLogConfig,log_config\nLogConfiguration,log_configuration\nLogConfigurationForChannel,log_configuration_for_channel\nLogConfigurationType,log_configuration_type\nLogConfigurations,log_configurations\nLogDelivery,log_delivery\nLogDeliveryBucket,log_delivery_bucket\nLogDeliveryConfiguration,log_delivery_configuration\nLogDeliveryConfigurationRequest,log_delivery_configuration_request\nLogDeliveryConfigurationType,log_delivery_configuration_type\nLogDeliveryConfigurations,log_delivery_configurations\nLogDeliveryDescription,log_delivery_description\nLogDeliveryStatus,log_delivery_status\nLogDestination,log_destination\nLogDestinationConfig,log_destination_config\nLogDestinationConfigs,log_destination_configs\nLogDestinationPermissionException,log_destination_permission_exception\nLogDestinationType,log_destination_type\nLogDriver,log_driver\nLogEnabled,log_enabled\nLogEncryptionKmsKeyId,log_encryption_kms_key_id\nLogEvent,log_event\nLogEventId,log_event_id\nLogEventTimestamp,log_event_timestamp\nLogExports,log_exports\nLogFile,log_file\nLogFileData,log_file_data\nLogFileName,log_file_name\nLogFilePath,log_file_path\nLogFilePrefix,log_file_prefix\nLogFileValidationEnabled,log_file_validation_enabled\nLogFilter,log_filter\nLogFormat,log_format\nLogGroup,log_group\nLogGroupArn,log_group_arn\nLogGroupField,log_group_field\nLogGroupName,log_group_name\nLogGroupSummary,log_group_summary\nLogLevel,log_level\nLogLevelUpdate,log_level_update\nLogOddsMetric,log_odds_metric\nLogOptions,log_options\nLogOutputFormat,log_output_format\nLogPaths,log_paths\nLogPattern,log_pattern\nLogPatternSets,log_pattern_sets\nLogPatterns,log_patterns\nLogPublishingConfiguration,log_publishing_configuration\nLogPublishingOption,log_publishing_option\nLogPublishingOptions,log_publishing_options\nLogPublishingOptionsStatus,log_publishing_options_status\nLogResult,log_result\nLogRoleArn,log_role_arn\nLogSettingsRequest,log_settings_request\nLogSettingsResponse,log_settings_response\nLogSetup,log_setup\nLogSource,log_source\nLogStream,log_stream\nLogStreamARN,log_stream_arn\nLogStreamARNUpdate,log_stream_arn_update\nLogStreamArn,log_stream_arn\nLogStreamName,log_stream_name\nLogStreams,log_streams\nLogSubscription,log_subscription\nLogSubscriptions,log_subscriptions\nLogTarget,log_target\nLogTargetConfiguration,log_target_configuration\nLogText,log_text\nLogType,log_type\nLogTypes,log_types\nLogTypesToDisable,log_types_to_disable\nLogTypesToEnable,log_types_to_enable\nLogUploadEnabled,log_upload_enabled\nLogUri,log_uri\nLogUrl,log_url\nLogVersion,log_version\nLogarithmic,logarithmic\nLogger,logger\nLoggerDefinitionId,logger_definition_id\nLoggerDefinitionVersion,logger_definition_version\nLoggerDefinitionVersionArn,logger_definition_version_arn\nLoggerDefinitionVersionId,logger_definition_version_id\nLoggers,loggers\nLogging,logging\nLoggingConfig,logging_config\nLoggingConfiguration,logging_configuration\nLoggingConfigurationInput,logging_configuration_input\nLoggingConfigurationMetadata,logging_configuration_metadata\nLoggingConfigurationStatus,logging_configuration_status\nLoggingConfigurationSummary,logging_configuration_summary\nLoggingConfigurations,logging_configurations\nLoggingEnabled,logging_enabled\nLoggingFilter,logging_filter\nLoggingInfo,logging_info\nLoggingLevel,logging_level\nLoggingOptions,logging_options\nLoggingOptionsPayload,logging_options_payload\nLoggingRole,logging_role\nLoggingStatus,logging_status\nLogical,logical\nLogicalCapacityUsed,logical_capacity_used\nLogicalIdHierarchy,logical_id_hierarchy\nLogicalOperator,logical_operator\nLogicalResourceId,logical_resource_id\nLogicalResourceIds,logical_resource_ids\nLogicalTable,logical_table\nLogicalTableMap,logical_table_map\nLogicalTableSource,logical_table_source\nLogicalUsed,logical_used\nLoginAttribute,login_attribute\nLoginAttributes,login_attributes\nLoginAuthConfig,login_auth_config\nLoginAuthConfigReqObj,login_auth_config_req_obj\nLoginMessage,login_message\nLoginPath,login_path\nLoginProfile,login_profile\nLoginWithAmazon,login_with_amazon\nLogins,logins\nLoginsToRemove,logins_to_remove\nLogo,logo\nLogo2x,logo2x\nLogo2xUrl,logo2x_url\nLogo3x,logo3x\nLogo3xUrl,logo3x_url\nLogoUrl,logo_url\nLogoutEndpoint,logout_endpoint\nLogoutRequest,logout_request\nLogoutURLs,logout_urls\nLogoutUserRequest,logout_user_request\nLogref,logref\nLogs,logs\nLogsAnomalyDetection,logs_anomaly_detection\nLogsAnomalyDetectionIntegration,logs_anomaly_detection_integration\nLogsAnomalyDetectionIntegrationConfig,logs_anomaly_detection_integration_config\nLogsConfig,logs_config\nLogsLocation,logs_location\nLogsStorageLocation,logs_storage_location\nLogsSummary,logs_summary\nLon,lon\nLongColumnStatisticsData,long_column_statistics_data\nLongDescription,long_description\nLongFormatText,long_format_text\nLongRangeType,long_range_type\nLongTermPricingEndDate,long_term_pricing_end_date\nLongTermPricingEntries,long_term_pricing_entries\nLongTermPricingId,long_term_pricing_id\nLongTermPricingIds,long_term_pricing_ids\nLongTermPricingListEntry,long_term_pricing_list_entry\nLongTermPricingStartDate,long_term_pricing_start_date\nLongTermPricingStatus,long_term_pricing_status\nLongTermPricingType,long_term_pricing_type\nLongValue,long_value\nLongestPrefixMatches,longest_prefix_matches\nLongitude,longitude\nLookAheadRateControl,look_ahead_rate_control\nLookBackAvailablePeriods,look_back_available_periods\nLookBackPeriod,look_back_period\nLookbackPeriodInDays,lookback_period_in_days\nLookbackWindow,lookback_window\nLookoutMetrics,lookout_metrics\nLookupAttribute,lookup_attribute\nLookupAttributes,lookup_attributes\nLookupDeveloperIdentityInput,lookup_developer_identity_input\nLookupDeveloperIdentityResponse,lookup_developer_identity_response\nLookupEventsRequest,lookup_events_request\nLookupEventsResponse,lookup_events_response\nLookupPolicy,lookup_policy\nLookupPolicyRequest,lookup_policy_request\nLookupPolicyResponse,lookup_policy_response\nLoopDetectedException,loop_detected_exception\nLossValue,loss_value\nLoudnessLogging,loudness_logging\nLow,low\nLowAction,low_action\nLowCount,low_count\nLowLatencyHlsManifests,low_latency_hls_manifests\nLowerBound,lower_bound\nLowerBoundary,lower_boundary\nLsaAnalysisId,lsa_analysis_id\nLt,lt\nLtRtCenterMixLevel,lt_rt_center_mix_level\nLtRtSurroundMixLevel,lt_rt_surround_mix_level\nLte,lte\nLteLocalId,lte_local_id\nLteNmr,lte_nmr\nLteNmrObj,lte_nmr_obj\nLteObj,lte_obj\nLteTimingAdvance,lte_timing_advance\nLunCount,lun_count\nLunNumber,lun_number\nLustreConfiguration,lustre_configuration\nLustreFileSystemConfiguration,lustre_file_system_configuration\nLustreLogConfiguration,lustre_log_configuration\nLustreLogCreateConfiguration,lustre_log_create_configuration\nLustreResponse,lustre_response\nLustreRootSquashConfiguration,lustre_root_squash_configuration\nM2tsScte35Esam,m2ts_scte35_esam\nM2tsSettings,m2ts_settings\nM3u8Settings,m3u8_settings\nMAPE,mape\nMASE,mase\nMAXIMUM,maximum\nMD5,md5\nMD5OfBody,md5_of_body\nMD5OfMessageAttributes,md5_of_message_attributes\nMD5OfMessageBody,md5_of_message_body\nMD5OfMessageSystemAttributes,md5_of_message_system_attributes\nMFA,mfa\nMFADelete,mfa_delete\nMFADevice,mfa_device\nMFADevices,mfa_devices\nMFAMethodNotFoundException,mfa_method_not_found_exception\nMFAMode,mfa_mode\nMFAOptionType,mfa_option_type\nMFAOptions,mfa_options\nMINIMUM,minimum\nMLFramework,ml_framework\nMLModel,ml_model\nMLModelId,ml_model_id\nMLModelName,ml_model_name\nMLModelType,ml_model_type\nMLResourceNotFoundException,ml_resource_not_found_exception\nMLTransform,ml_transform\nMLTransformNotReadyException,ml_transform_not_ready_exception\nMLUserDataEncryption,ml_user_data_encryption\nMSKClusterARN,msk_cluster_arn\nMSKSourceConfiguration,msk_source_configuration\nMSKSourceDescription,msk_source_description\nMac,mac\nMacAddress,mac_address\nMacAddressList,mac_address_list\nMacAlgorithm,mac_algorithm\nMacAlgorithmDukpt,mac_algorithm_dukpt\nMacAlgorithmEmv,mac_algorithm_emv\nMacAlgorithms,mac_algorithms\nMacLength,mac_length\nMacSecKey,mac_sec_key\nMacValid,mac_valid\nMacVersion,mac_version\nMachineLabeled,machine_labeled\nMachineLearningDetectionConfig,machine_learning_detection_config\nMachineType,machine_type\nMagneticDuration,magnetic_duration\nMagneticStore,magnetic_store\nMagneticStoreRejectedDataLocation,magnetic_store_rejected_data_location\nMagneticStoreRetentionPeriodInDays,magnetic_store_retention_period_in_days\nMagneticStoreWriteProperties,magnetic_store_write_properties\nMailDomainInUseException,mail_domain_in_use_exception\nMailDomainNotFoundException,mail_domain_not_found_exception\nMailDomainStateException,mail_domain_state_exception\nMailDomainSummary,mail_domain_summary\nMailDomains,mail_domains\nMailFromAttributes,mail_from_attributes\nMailFromDomain,mail_from_domain\nMailFromDomainAttributes,mail_from_domain_attributes\nMailFromDomainNotVerifiedException,mail_from_domain_not_verified_exception\nMailFromDomainStatus,mail_from_domain_status\nMailType,mail_type\nMailboxDeprovisionedDate,mailbox_deprovisioned_date\nMailboxExportJob,mailbox_export_job\nMailboxProvisionedDate,mailbox_provisioned_date\nMailboxQuota,mailbox_quota\nMailboxSize,mailbox_size\nMailingAddress,mailing_address\nMain,main\nMainClass,main_class\nMainProfileId,main_profile_id\nMaintainer,maintainer\nMaintenance,maintenance\nMaintenanceAutoAppliedAfter,maintenance_auto_applied_after\nMaintenanceCreateSettings,maintenance_create_settings\nMaintenanceDay,maintenance_day\nMaintenanceDeadline,maintenance_deadline\nMaintenanceDetails,maintenance_details\nMaintenanceOperationsInProgress,maintenance_operations_in_progress\nMaintenanceOptions,maintenance_options\nMaintenanceSchedule,maintenance_schedule\nMaintenanceScheduledDate,maintenance_scheduled_date\nMaintenanceSchedules,maintenance_schedules\nMaintenanceStartHour,maintenance_start_hour\nMaintenanceStartTime,maintenance_start_time\nMaintenanceStatus,maintenance_status\nMaintenanceStrategies,maintenance_strategies\nMaintenanceTrack,maintenance_track\nMaintenanceTrackName,maintenance_track_name\nMaintenanceTracks,maintenance_tracks\nMaintenanceUpdateSettings,maintenance_update_settings\nMaintenanceWindow,maintenance_window\nMaintenanceWindowAutomationParameters,maintenance_window_automation_parameters\nMaintenanceWindowExecution,maintenance_window_execution\nMaintenanceWindowExecutionTaskIdentity,maintenance_window_execution_task_identity\nMaintenanceWindowExecutionTaskInvocationIdentity,maintenance_window_execution_task_invocation_identity\nMaintenanceWindowFilter,maintenance_window_filter\nMaintenanceWindowIdentity,maintenance_window_identity\nMaintenanceWindowIdentityForTarget,maintenance_window_identity_for_target\nMaintenanceWindowLambdaParameters,maintenance_window_lambda_parameters\nMaintenanceWindowRunCommandParameters,maintenance_window_run_command_parameters\nMaintenanceWindowStartTime,maintenance_window_start_time\nMaintenanceWindowStepFunctionsParameters,maintenance_window_step_functions_parameters\nMaintenanceWindowTarget,maintenance_window_target\nMaintenanceWindowTask,maintenance_window_task\nMaintenanceWindowTaskInvocationParameters,maintenance_window_task_invocation_parameters\nMaintenanceWindowTaskParameterValueExpression,maintenance_window_task_parameter_value_expression\nMajorEngineVersion,major_engine_version\nMajorKeyDerivationMode,major_key_derivation_mode\nMajorRevision,major_revision\nMajorVersion,major_version\nMake,make\nMalformedArnException,malformed_arn_exception\nMalformedCSRException,malformed_csr_exception\nMalformedCertificateException,malformed_certificate_exception\nMalformedPolicyDocumentException,malformed_policy_document_exception\nMalformedPolicyException,malformed_policy_exception\nMalformedPolicyTemplateException,malformed_policy_template_exception\nMalformedQueryException,malformed_query_exception\nMalware,malware\nMalwareName,malware_name\nMalwarePath,malware_path\nMalwareProtection,malware_protection\nMalwareProtectionConfiguration,malware_protection_configuration\nMalwareProtectionConfigurationResult,malware_protection_configuration_result\nMalwareProtectionDataSourceFreeTrial,malware_protection_data_source_free_trial\nMalwareState,malware_state\nMalwareType,malware_type\nManageBerkshelf,manage_berkshelf\nManageMasterUserPassword,manage_master_user_password\nManagePropertygraphStatisticsInput,manage_propertygraph_statistics_input\nManagePropertygraphStatisticsOutput,manage_propertygraph_statistics_output\nManageSparqlStatisticsInput,manage_sparql_statistics_input\nManageSparqlStatisticsOutput,manage_sparql_statistics_output\nManagedAccount,managed_account\nManagedAction,managed_action\nManagedActionHistoryItem,managed_action_history_item\nManagedActionHistoryItems,managed_action_history_items\nManagedActionInvalidStateException,managed_action_invalid_state_exception\nManagedActions,managed_actions\nManagedAgent,managed_agent\nManagedAgentStateChange,managed_agent_state_change\nManagedBy,managed_by\nManagedByFirewallManager,managed_by_firewall_manager\nManagedDataIdentifierSummary,managed_data_identifier_summary\nManagedExecution,managed_execution\nManagedJobTemplateSummary,managed_job_template_summary\nManagedKeys,managed_keys\nManagedKeysIPV4,managed_keys_ipv4\nManagedKeysIPV6,managed_keys_ipv6\nManagedOwnerName,managed_owner_name\nManagedPersistenceMonitoringConfiguration,managed_persistence_monitoring_configuration\nManagedPolicyArn,managed_policy_arn\nManagedPolicyDetail,managed_policy_detail\nManagedPrefixList,managed_prefix_list\nManagedProductDescriptor,managed_product_descriptor\nManagedProducts,managed_products\nManagedResourceSummary,managed_resource_summary\nManagedResourceSummaryList,managed_resource_summary_list\nManagedRule,managed_rule\nManagedRuleDescription,managed_rule_description\nManagedRuleException,managed_rule_exception\nManagedRuleGroupConfig,managed_rule_group_config\nManagedRuleGroupConfigs,managed_rule_group_configs\nManagedRuleGroupStatement,managed_rule_group_statement\nManagedRuleGroupSummary,managed_rule_group_summary\nManagedRuleGroupVersion,managed_rule_group_version\nManagedRuleGroups,managed_rule_groups\nManagedRuleSet,managed_rule_set\nManagedRuleSetName,managed_rule_set_name\nManagedRuleSetSummary,managed_rule_set_summary\nManagedRuleSetVersion,managed_rule_set_version\nManagedRuleSets,managed_rule_sets\nManagedRuleState,managed_rule_state\nManagedRules,managed_rules\nManagedScaling,managed_scaling\nManagedScalingPolicy,managed_scaling_policy\nManagedServiceData,managed_service_data\nManagedStreamingKafkaParameters,managed_streaming_kafka_parameters\nManagedType,managed_type\nManagedbyFirewallManager,managedby_firewall_manager\nManagement,management\nManagementCidrRangeConstraint,management_cidr_range_constraint\nManagementCidrRanges,management_cidr_ranges\nManagementState,management_state\nManagementType,management_type\nManagesVpcEndpoints,manages_vpc_endpoints\nMandatory,mandatory\nManifest,manifest\nManifestCompression,manifest_compression\nManifestConfirmConditionNotification,manifest_confirm_condition_notification\nManifestDurationFormat,manifest_duration_format\nManifestEncoding,manifest_encoding\nManifestEncryption,manifest_encryption\nManifestEndpointPrefix,manifest_endpoint_prefix\nManifestFileLocation,manifest_file_location\nManifestFilePath,manifest_file_path\nManifestFormat,manifest_format\nManifestGenerator,manifest_generator\nManifestKey,manifest_key\nManifestLayout,manifest_layout\nManifestMetadataSignaling,manifest_metadata_signaling\nManifestName,manifest_name\nManifestNameModifier,manifest_name_modifier\nManifestOutputLocation,manifest_output_location\nManifestOverridesPayload,manifest_overrides_payload\nManifestPayload,manifest_payload\nManifestPrefix,manifest_prefix\nManifestPrefixLocation,manifest_prefix_location\nManifestProcessingRules,manifest_processing_rules\nManifestS3Uri,manifest_s3_uri\nManifestSummary,manifest_summary\nManifestURI,manifest_uri\nManifestWindowSeconds,manifest_window_seconds\nManual,manual\nManualEvidence,manual_evidence\nManualMergeRequiredException,manual_merge_required_exception\nManualSnapshotRemainingDays,manual_snapshot_remaining_days\nManualSnapshotRetentionPeriod,manual_snapshot_retention_period\nManualSnapshotsCurrentCount,manual_snapshots_current_count\nManualSnapshotsLimit,manual_snapshots_limit\nManualSnapshotsLimitReached,manual_snapshots_limit_reached\nManufacturer,manufacturer\nManufacturerHardwareCertificate,manufacturer_hardware_certificate\nManufacturerName,manufacturer_name\nMapArn,map_arn\nMapBooleanAsBoolean,map_boolean_as_boolean\nMapConfiguration,map_configuration\nMapConfigurationUpdate,map_configuration_update\nMapCustomerOwnedIpOnLaunch,map_customer_owned_ip_on_launch\nMapEntries,map_entries\nMapEquals,map_equals\nMapFilter,map_filter\nMapIterationEventDetails,map_iteration_event_details\nMapJsonbAsClob,map_jsonb_as_clob\nMapLongVarcharAs,map_long_varchar_as\nMapMatchingConfig,map_matching_config\nMapName,map_name\nMapPublicIpOnLaunch,map_public_ip_on_launch\nMapRunExecutionCounts,map_run_execution_counts\nMapRunFailedEventDetails,map_run_failed_event_details\nMapRunItemCounts,map_run_item_counts\nMapRunListItem,map_run_list_item\nMapRunStartedEventDetails,map_run_started_event_details\nMapStateStartedEventDetails,map_state_started_event_details\nMapStyleOptions,map_style_options\nMapZoomMode,map_zoom_mode\nMappedDataSetParameter,mapped_data_set_parameter\nMappedDataSetParameters,mapped_data_set_parameters\nMappedResourceConfigurationList,mapped_resource_configuration_list\nMappedResourceConfigurationListItem,mapped_resource_configuration_list_item\nMapping,mapping\nMappingEntry,mapping_entry\nMappingParameters,mapping_parameters\nMappingRule,mapping_rule\nMappings,mappings\nMargin,margin\nMarginPercentage,margin_percentage\nMarginStyle,margin_style\nMariaDbDataProviderSettings,maria_db_data_provider_settings\nMariaDbParameters,maria_db_parameters\nMarkAsArchivedRequest,mark_as_archived_request\nMarkLatest,mark_latest\nMarker,marker\nMarkerColor,marker_color\nMarkerRecordedEventAttributes,marker_recorded_event_attributes\nMarkerShape,marker_shape\nMarkerSize,marker_size\nMarkerStyleSettings,marker_style_settings\nMarkerVisibility,marker_visibility\nMarket,market\nMarketType,market_type\nMarketo,marketo\nMarketoConnectorProfileCredentials,marketo_connector_profile_credentials\nMarketoConnectorProfileProperties,marketo_connector_profile_properties\nMarketoDestinationProperties,marketo_destination_properties\nMarketoSourceProperties,marketo_source_properties\nMarketplace,marketplace\nMarketplaceCommerceAnalyticsException,marketplace_commerce_analytics_exception\nMarketplaceDescription,marketplace_description\nMarketplaceInformation,marketplace_information\nMarketplaceOnboardingStatus,marketplace_onboarding_status\nMarketplaceTitle,marketplace_title\nMarketplaceUrl,marketplace_url\nMarksNotSupportedForFormatException,marks_not_supported_for_format_exception\nMask,mask\nMaskCharacter,mask_character\nMaskMode,mask_mode\nMaskValue,mask_value\nMasks,masks\nMaster,master\nMasterAccountArn,master_account_arn\nMasterAccountEmail,master_account_email\nMasterAccountId,master_account_id\nMasterArn,master_arn\nMasterBackendRole,master_backend_role\nMasterCannotLeaveOrganizationException,master_cannot_leave_organization_exception\nMasterEligibleNodeCount,master_eligible_node_count\nMasterId,master_id\nMasterInstanceId,master_instance_id\nMasterInstanceSecurityGroupId,master_instance_security_group_id\nMasterInstanceType,master_instance_type\nMasterNode,master_node\nMasterPublicDnsName,master_public_dns_name\nMasterRegion,master_region\nMasterUserARN,master_user_arn\nMasterUserArn,master_user_arn\nMasterUserName,master_user_name\nMasterUserOptions,master_user_options\nMasterUserPassword,master_user_password\nMasterUserSecret,master_user_secret\nMasterUserSecretKmsKeyId,master_user_secret_kms_key_id\nMasterUsername,master_username\nMasteringMonitorNits,mastering_monitor_nits\nMatch,match\nMatchAllValue,match_all_value\nMatchAttributes,match_attributes\nMatchConfidence,match_confidence\nMatchCriteria,match_criteria\nMatchGenerationDate,match_generation_date\nMatchId,match_id\nMatchIds,match_ids\nMatchItem,match_item\nMatchOperator,match_operator\nMatchOption,match_option\nMatchOptions,match_options\nMatchPaths,match_paths\nMatchPattern,match_pattern\nMatchPredicates,match_predicates\nMatchRange,match_range\nMatchScope,match_scope\nMatchType,match_type\nMatchedCategories,matched_categories\nMatchedDetails,matched_details\nMatchedEventTime,matched_event_time\nMatchedPlayerSession,matched_player_session\nMatchedPlayerSessions,matched_player_sessions\nMatchedRules,matched_rules\nMatchedStatements,matched_statements\nMatchedUser,matched_user\nMatcher,matcher\nMatches,matches\nMatching,matching\nMatchingAttributesList,matching_attributes_list\nMatchingBucket,matching_bucket\nMatchingEventTypes,matching_event_types\nMatchingRequest,matching_request\nMatchingResource,matching_resource\nMatchingResponse,matching_response\nMatchingRule,matching_rule\nMatchingRules,matching_rules\nMatchingWorkflowSummary,matching_workflow_summary\nMatchmakerData,matchmaker_data\nMatchmakingConfiguration,matchmaking_configuration\nMatchmakingRuleSet,matchmaking_rule_set\nMatchmakingTicket,matchmaking_ticket\nMathActivity,math_activity\nMavenReference,maven_reference\nMavenReferenceDescription,maven_reference_description\nMax,max\nMax24HourSend,max24_hour_send\nMaxAbrBitrate,max_abr_bitrate\nMaxActiveResourcesExceededException,max_active_resources_exceeded_exception\nMaxAge,max_age\nMaxAgeInDays,max_age_in_days\nMaxAgeInMinutes,max_age_in_minutes\nMaxAgeRule,max_age_rule\nMaxAgeSeconds,max_age_seconds\nMaxAggregationInterval,max_aggregation_interval\nMaxAllocatedStorage,max_allocated_storage\nMaxAllowedRuleLevelForMatching,max_allowed_rule_level_for_matching\nMaxAllowedRuleLevelForMerging,max_allowed_rule_level_for_merging\nMaxAllowedSignature,max_allowed_signature\nMaxAlternatives,max_alternatives\nMaxAncDataSize,max_anc_data_size\nMaxAssignments,max_assignments\nMaxAttempts,max_attempts\nMaxAutoMLJobRuntimeInSeconds,max_auto_ml_job_runtime_in_seconds\nMaxAverageBitrate,max_average_bitrate\nMaxBand,max_band\nMaxBitrate,max_bitrate\nMaxCandidates,max_candidates\nMaxCapacity,max_capacity\nMaxCapacityBreachBehavior,max_capacity_breach_behavior\nMaxCapacityBuffer,max_capacity_buffer\nMaxCapacityUnits,max_capacity_units\nMaxCaptures,max_captures\nMaxCityNetworksToMonitor,max_city_networks_to_monitor\nMaxCll,max_cll\nMaxConcurrency,max_concurrency\nMaxConcurrentCount,max_concurrent_count\nMaxConcurrentDpus,max_concurrent_dpus\nMaxConcurrentGameSessionActivations,max_concurrent_game_session_activations\nMaxConcurrentInvocationsPerInstance,max_concurrent_invocations_per_instance\nMaxConcurrentPercentage,max_concurrent_percentage\nMaxConcurrentQueriesException,max_concurrent_queries_exception\nMaxConcurrentRuns,max_concurrent_runs\nMaxConcurrentSessions,max_concurrent_sessions\nMaxConcurrentTaskCount,max_concurrent_task_count\nMaxConcurrentTransforms,max_concurrent_transforms\nMaxConnections,max_connections\nMaxConnectionsPercent,max_connections_percent\nMaxContacts,max_contacts\nMaxContentLightLevel,max_content_light_level\nMaxContentSizePerPageInMegaBytes,max_content_size_per_page_in_mega_bytes\nMaxContributorCount,max_contributor_count\nMaxContributorValue,max_contributor_value\nMaxCount,max_count\nMaxCountRule,max_count_rule\nMaxCpuUtilizationPercentage,max_cpu_utilization_percentage\nMaxDatapoints,max_datapoints\nMaxDepth,max_depth\nMaxDocumentSizeExceeded,max_document_size_exceeded\nMaxDominantColors,max_dominant_colors\nMaxDrainDurationSeconds,max_drain_duration_seconds\nMaxDuration,max_duration\nMaxDurationInSeconds,max_duration_in_seconds\nMaxDurationSeconds,max_duration_seconds\nMaxDutyCycle,max_duty_cycle\nMaxEirp,max_eirp\nMaxEntries,max_entries\nMaxErrors,max_errors\nMaxExpirationTime,max_expiration_time\nMaxFaces,max_faces\nMaxFall,max_fall\nMaxFetchRecordsPerShard,max_fetch_records_per_shard\nMaxFetchTimeInMs,max_fetch_time_in_ms\nMaxFileSize,max_file_size\nMaxFiles,max_files\nMaxFilesInBand,max_files_in_band\nMaxFrameAverageLightLevel,max_frame_average_light_level\nMaxFrameRate,max_frame_rate\nMaxGroupPreparedCapacity,max_group_prepared_capacity\nMaxHeight,max_height\nMaxHumanLabeledObjectCount,max_human_labeled_object_count\nMaxIdleConnectionsPercent,max_idle_connections_percent\nMaxImpact,max_impact\nMaxInferenceUnits,max_inference_units\nMaxInstanceCount,max_instance_count\nMaxInstanceLifetime,max_instance_lifetime\nMaxInvocations,max_invocations\nMaxInvocationsPerMinute,max_invocations_per_minute\nMaxIopsPerDbInstance,max_iops_per_db_instance\nMaxIopsPerGib,max_iops_per_gib\nMaxItems,max_items\nMaxKBytesPerRead,max_k_bytes_per_read\nMaxKeys,max_keys\nMaxLabels,max_labels\nMaxLatency,max_latency\nMaxLength,max_length\nMaxLexemeLengthExceededException,max_lexeme_length_exceeded_exception\nMaxLexiconsNumberExceededException,max_lexicons_number_exceeded_exception\nMaxLimit,max_limit\nMaxLinksPerPage,max_links_per_page\nMaxLocalMediaSizeInMB,max_local_media_size_in_mb\nMaxLuminance,max_luminance\nMaxManifestFragmentResults,max_manifest_fragment_results\nMaxMediaPlaylistFragmentResults,max_media_playlist_fragment_results\nMaxMembers,max_members\nMaxMemoryUtilizationPercentage,max_memory_utilization_percentage\nMaxModelVersion,max_model_version\nMaxModels,max_models\nMaxNumberOfAutoScalingGroups,max_number_of_auto_scaling_groups\nMaxNumberOfConfigRulesExceededException,max_number_of_config_rules_exceeded_exception\nMaxNumberOfConfigurationRecordersExceededException,max_number_of_configuration_recorders_exceeded_exception\nMaxNumberOfConformancePacksExceededException,max_number_of_conformance_packs_exceeded_exception\nMaxNumberOfDeliveryChannelsExceededException,max_number_of_delivery_channels_exceeded_exception\nMaxNumberOfLaunchConfigurations,max_number_of_launch_configurations\nMaxNumberOfMessages,max_number_of_messages\nMaxNumberOfMessagesPerSecond,max_number_of_messages_per_second\nMaxNumberOfOrganizationConfigRulesExceededException,max_number_of_organization_config_rules_exceeded_exception\nMaxNumberOfOrganizationConformancePacksExceededException,max_number_of_organization_conformance_packs_exceeded_exception\nMaxNumberOfRetentionConfigurationsExceededException,max_number_of_retention_configurations_exceeded_exception\nMaxNumberOfTests,max_number_of_tests\nMaxNumberOfTrainingJobs,max_number_of_training_jobs\nMaxNumberOfTrainingJobsNotImproving,max_number_of_training_jobs_not_improving\nMaxOffsetsPerTrigger,max_offsets_per_trigger\nMaxOutputFiles,max_output_files\nMaxOutputs,max_outputs\nMaxP95Performance,max_p95_performance\nMaxPaddingBytes,max_padding_bytes\nMaxParallelExecutionSteps,max_parallel_execution_steps\nMaxParallelLaunches,max_parallel_launches\nMaxParallelOfTests,max_parallel_of_tests\nMaxParallelTrainingJobs,max_parallel_training_jobs\nMaxParts,max_parts\nMaxPasswordAge,max_password_age\nMaxPayloadInMB,max_payload_in_mb\nMaxPcrInterval,max_pcr_interval\nMaxPercentageOfInputDatasetLabeled,max_percentage_of_input_dataset_labeled\nMaxPixelThreshold,max_pixel_threshold\nMaxPrice,max_price\nMaxPricePerMinute,max_price_per_minute\nMaxProtectionGroups,max_protection_groups\nMaxQueryResults,max_query_results\nMaxRange,max_range\nMaxRecordCount,max_record_count\nMaxRecordPerRead,max_record_per_read\nMaxRecords,max_records\nMaxRenditions,max_renditions\nMaxResource,max_resource\nMaxResults,max_results\nMaxRetentionDays,max_retention_days\nMaxRetries,max_retries\nMaxRetryCount,max_retry_count\nMaxRetryIntervalMs,max_retry_interval_ms\nMaxRows,max_rows\nMaxRuntimeInSeconds,max_runtime_in_seconds\nMaxRuntimePerTrainingJobInSeconds,max_runtime_per_training_job_in_seconds\nMaxSchemaVersion,max_schema_version\nMaxScore,max_score\nMaxSelectedChoices,max_selected_choices\nMaxSendRate,max_send_rate\nMaxSessionDuration,max_session_duration\nMaxSize,max_size\nMaxSlotDurationInHours,max_slot_duration_in_hours\nMaxSlotsByChannel,max_slots_by_channel\nMaxSpeakerLabels,max_speaker_labels\nMaxStorageSize,max_storage_size\nMaxStorageThroughputPerDbInstance,max_storage_throughput_per_db_instance\nMaxStorageThroughputPerIops,max_storage_throughput_per_iops\nMaxStorageUtilizationPercentage,max_storage_utilization_percentage\nMaxSuggestionsCount,max_suggestions_count\nMaxSwap,max_swap\nMaxSyncBuffer,max_sync_buffer\nMaxTTL,max_ttl\nMaxTermDurationInDays,max_term_duration_in_days\nMaxTimeToLiveInMinutes,max_time_to_live_in_minutes\nMaxTimestampGapInDays,max_timestamp_gap_in_days\nMaxTotalPrice,max_total_price\nMaxUnits,max_units\nMaxUploads,max_uploads\nMaxUrlsPerMinuteCrawlRate,max_urls_per_minute_crawl_rate\nMaxUserDurationInSeconds,max_user_duration_in_seconds\nMaxUsers,max_users\nMaxValue,max_value\nMaxVersion,max_version\nMaxVideoBitsPerSecond,max_video_bits_per_second\nMaxVisibleColumns,max_visible_columns\nMaxVisibleRows,max_visible_rows\nMaxVolumeLimit,max_volume_limit\nMaxWaitTimeInSeconds,max_wait_time_in_seconds\nMaxWidth,max_width\nMaxWorkers,max_workers\nMaximum,maximum\nMaximumAllowedResources,maximum_allowed_resources\nMaximumAutomaticAttempts,maximum_automatic_attempts\nMaximumBandwidthInMbps,maximum_bandwidth_in_mbps\nMaximumBatchSize,maximum_batch_size\nMaximumBatchingWindowInSeconds,maximum_batching_window_in_seconds\nMaximumBitrate,maximum_bitrate\nMaximumBranchesExceededException,maximum_branches_exceeded_exception\nMaximumCapacityUnits,maximum_capacity_units\nMaximumConcurrency,maximum_concurrency\nMaximumConflictResolutionEntriesExceededException,maximum_conflict_resolution_entries_exceeded_exception\nMaximumCoreCapacityUnits,maximum_core_capacity_units\nMaximumDuration,maximum_duration\nMaximumEfaInterfaces,maximum_efa_interfaces\nMaximumEventAgeInSeconds,maximum_event_age_in_seconds\nMaximumExecutionFrequency,maximum_execution_frequency\nMaximumExecutionTimeoutInSeconds,maximum_execution_timeout_in_seconds\nMaximumFileContentToLoadExceededException,maximum_file_content_to_load_exceeded_exception\nMaximumFileEntriesExceededException,maximum_file_entries_exceeded_exception\nMaximumFramerate,maximum_framerate\nMaximumIndividualPlayerLatencyMilliseconds,maximum_individual_player_latency_milliseconds\nMaximumInstanceCount,maximum_instance_count\nMaximumIops,maximum_iops\nMaximumItemsToCompareExceededException,maximum_items_to_compare_exceeded_exception\nMaximumLabelType,maximum_label_type\nMaximumLength,maximum_length\nMaximumMinimum,maximum_minimum\nMaximumMinimumComputation,maximum_minimum_computation\nMaximumNetworkCards,maximum_network_cards\nMaximumNetworkInterfaces,maximum_network_interfaces\nMaximumNormalizedUnitsUsedPerHour,maximum_normalized_units_used_per_hour\nMaximumNumberOfApprovalsExceededException,maximum_number_of_approvals_exceeded_exception\nMaximumNumberOfInstancesUsedPerHour,maximum_number_of_instances_used_per_hour\nMaximumNumberOfTrailsExceededException,maximum_number_of_trails_exceeded_exception\nMaximumOnDemandCapacityUnits,maximum_on_demand_capacity_units\nMaximumOpenPullRequestsExceededException,maximum_open_pull_requests_exceeded_exception\nMaximumPartitionCount,maximum_partition_count\nMaximumPercent,maximum_percent\nMaximumPlayerSessionCount,maximum_player_session_count\nMaximumRGBTolerance,maximum_rgb_tolerance\nMaximumRecordAgeInSeconds,maximum_record_age_in_seconds\nMaximumReplicationCount,maximum_replication_count\nMaximumRepositoryNamesExceededException,maximum_repository_names_exceeded_exception\nMaximumRepositoryTriggersExceededException,maximum_repository_triggers_exceeded_exception\nMaximumResultReturnedException,maximum_result_returned_exception\nMaximumRetention,maximum_retention\nMaximumRetryAttempts,maximum_retry_attempts\nMaximumRuleTemplatesAssociatedWithRepositoryException,maximum_rule_templates_associated_with_repository_exception\nMaximumStringLength,maximum_string_length\nMaximumSubChannels,maximum_sub_channels\nMaximumSupportedWeightLbs,maximum_supported_weight_lbs\nMaximumTTL,maximum_ttl\nMaximumThroughputInMBps,maximum_throughput_in_m_bps\nMaximumTraversalDepth,maximum_traversal_depth\nMaximumUnits,maximum_units\nMaximumValue,maximum_value\nMaximumVideoBufferDelayMilliseconds,maximum_video_buffer_delay_milliseconds\nMaximumWindowInMinutes,maximum_window_in_minutes\nMaximumYUV,maximum_yuv\nMcGroupId,mc_group_id\nMcc,mcc\nMccXml,mcc_xml\nMd5Hash,md5_hash\nMdnResponse,mdn_response\nMdnSigningAlgorithm,mdn_signing_algorithm\nMeanTimeToRecoverInMilliseconds,mean_time_to_recover_in_milliseconds\nMeanValue,mean_value\nMeasure,measure\nMeasureAggregationFunction,measure_aggregation_function\nMeasureDataLabelStyle,measure_data_label_style\nMeasureField,measure_field\nMeasureFieldId,measure_field_id\nMeasureForeground,measure_foreground\nMeasureLabelVisibility,measure_label_visibility\nMeasureLatency,measure_latency\nMeasureName,measure_name\nMeasureNameColumn,measure_name_column\nMeasureValue,measure_value\nMeasureValueType,measure_value_type\nMeasureValues,measure_values\nMeasurement,measurement\nMeasurementProcessingConfig,measurement_processing_config\nMedia,media\nMediaCapturePipeline,media_capture_pipeline\nMediaCapturePipelineSourceConfiguration,media_capture_pipeline_source_configuration\nMediaCapturePipelineSummary,media_capture_pipeline_summary\nMediaCapturePipelines,media_capture_pipelines\nMediaConcatenationPipeline,media_concatenation_pipeline\nMediaConcurrencies,media_concurrencies\nMediaConcurrency,media_concurrency\nMediaConnectFlow,media_connect_flow\nMediaConnectFlowRequest,media_connect_flow_request\nMediaConnectFlows,media_connect_flows\nMediaConnectSettings,media_connect_settings\nMediaEncoding,media_encoding\nMediaFileUri,media_file_uri\nMediaFormat,media_format\nMediaInsightsConfiguration,media_insights_configuration\nMediaInsightsPipeline,media_insights_pipeline\nMediaInsightsPipelineConfiguration,media_insights_pipeline_configuration\nMediaInsightsPipelineConfigurationArn,media_insights_pipeline_configuration_arn\nMediaInsightsPipelineConfigurationElement,media_insights_pipeline_configuration_element\nMediaInsightsPipelineConfigurationId,media_insights_pipeline_configuration_id\nMediaInsightsPipelineConfigurationName,media_insights_pipeline_configuration_name\nMediaInsightsPipelineConfigurationSummary,media_insights_pipeline_configuration_summary\nMediaInsightsPipelineConfigurations,media_insights_pipeline_configurations\nMediaInsightsPipelineElementStatus,media_insights_pipeline_element_status\nMediaInsightsRuntimeMetadata,media_insights_runtime_metadata\nMediaLiveConnectorPipeline,media_live_connector_pipeline\nMediaLiveInputArn,media_live_input_arn\nMediaPackageGroupSettings,media_package_group_settings\nMediaPackageOutputDestinationSettings,media_package_output_destination_settings\nMediaPackageOutputSettings,media_package_output_settings\nMediaPackageSettings,media_package_settings\nMediaPipeline,media_pipeline\nMediaPipelineArn,media_pipeline_arn\nMediaPipelineId,media_pipeline_id\nMediaPipelineSummary,media_pipeline_summary\nMediaPipelines,media_pipelines\nMediaPlacement,media_placement\nMediaRegion,media_region\nMediaSampleRate,media_sample_rate\nMediaSampleRateHertz,media_sample_rate_hertz\nMediaSourceConfig,media_source_config\nMediaStorageConfiguration,media_storage_configuration\nMediaStoreStorageClass,media_store_storage_class\nMediaStream,media_stream\nMediaStreamAttributes,media_stream_attributes\nMediaStreamAttributesRequest,media_stream_attributes_request\nMediaStreamId,media_stream_id\nMediaStreamName,media_stream_name\nMediaStreamOutputConfiguration,media_stream_output_configuration\nMediaStreamOutputConfigurationRequest,media_stream_output_configuration_request\nMediaStreamOutputConfigurations,media_stream_output_configurations\nMediaStreamPipeline,media_stream_pipeline\nMediaStreamSink,media_stream_sink\nMediaStreamSource,media_stream_source\nMediaStreamSourceConfiguration,media_stream_source_configuration\nMediaStreamSourceConfigurationRequest,media_stream_source_configuration_request\nMediaStreamSourceConfigurations,media_stream_source_configurations\nMediaStreamType,media_stream_type\nMediaStreams,media_streams\nMediaType,media_type\nMediaUriSecretArn,media_uri_secret_arn\nMediaUriType,media_uri_type\nMediaUrl,media_url\nMediaconnectSettings,mediaconnect_settings\nMedialiveInputArns,medialive_input_arns\nMedianRuntimeSeconds,median_runtime_seconds\nMedicalAlternative,medical_alternative\nMedicalEntity,medical_entity\nMedicalItem,medical_item\nMedicalResult,medical_result\nMedicalTranscript,medical_transcript\nMedicalTranscriptEvent,medical_transcript_event\nMedicalTranscriptionJob,medical_transcription_job\nMedicalTranscriptionJobName,medical_transcription_job_name\nMedicalTranscriptionJobSummaries,medical_transcription_job_summaries\nMedicalTranscriptionJobSummary,medical_transcription_job_summary\nMedicalTranscriptionSetting,medical_transcription_setting\nMediumAction,medium_action\nMediumChangerType,medium_changer_type\nMediumCount,medium_count\nMeeting,meeting\nMeetingArn,meeting_arn\nMeetingEvents,meeting_events\nMeetingEventsConcatenationConfiguration,meeting_events_concatenation_configuration\nMeetingFeatures,meeting_features\nMeetingFeaturesConfiguration,meeting_features_configuration\nMeetingHostId,meeting_host_id\nMeetingId,meeting_id\nMeetingNotificationConfiguration,meeting_notification_configuration\nMeetingRoomConfiguration,meeting_room_configuration\nMeetingSetting,meeting_setting\nMeetings,meetings\nMember,member\nMemberAccount,member_account\nMemberAccountEc2DeepInspectionStatus,member_account_ec2_deep_inspection_status\nMemberAccountEc2DeepInspectionStatusState,member_account_ec2_deep_inspection_status_state\nMemberAccountId,member_account_id\nMemberAccountIds,member_account_ids\nMemberAccountLimitReached,member_account_limit_reached\nMemberAccountRuleStatus,member_account_rule_status\nMemberAccountStatus,member_account_status\nMemberAccounts,member_accounts\nMemberAdditionalConfiguration,member_additional_configuration\nMemberAdditionalConfigurationResult,member_additional_configuration_result\nMemberArn,member_arn\nMemberArns,member_arns\nMemberClusters,member_clusters\nMemberClustersOutpostArns,member_clusters_outpost_arns\nMemberConfiguration,member_configuration\nMemberDataSourceConfiguration,member_data_source_configuration\nMemberDataSourceConfigurations,member_data_source_configurations\nMemberDatasources,member_datasources\nMemberDefinition,member_definition\nMemberDefinitions,member_definitions\nMemberDetail,member_detail\nMemberDetails,member_details\nMemberError,member_error\nMemberFabricAttributes,member_fabric_attributes\nMemberFabricConfiguration,member_fabric_configuration\nMemberFabricLogPublishingConfiguration,member_fabric_log_publishing_configuration\nMemberFeaturesConfiguration,member_features_configuration\nMemberFeaturesConfigurationResult,member_features_configuration_result\nMemberFrameworkAttributes,member_framework_attributes\nMemberFrameworkConfiguration,member_framework_configuration\nMemberGroup,member_group\nMemberGroups,member_groups\nMemberId,member_id\nMemberIdArnPair,member_id_arn_pair\nMemberLogPublishingConfiguration,member_log_publishing_configuration\nMemberName,member_name\nMemberOfServiceLinkedResourceGroup,member_of_service_linked_resource_group\nMemberSpecification,member_specification\nMemberStatus,member_status\nMemberSummary,member_summary\nMemberType,member_type\nMemberUser,member_user\nMemberUsers,member_users\nMembers,members\nMembership,membership\nMembershipCount,membership_count\nMembershipDatasources,membership_datasources\nMembershipExists,membership_exists\nMembershipId,membership_id\nMembershipItem,membership_item\nMembershipItemList,membership_item_list\nMembershipProtectedQueryResultConfiguration,membership_protected_query_result_configuration\nMembershipSummary,membership_summary\nMemory,memory\nMemoryDuration,memory_duration\nMemoryGB,memory_gb\nMemoryGiBPerVCpu,memory_gib_per_v_cpu\nMemoryGiBPerVCpuRequest,memory_gib_per_v_cpu_request\nMemoryInMB,memory_in_mb\nMemoryInfo,memory_info\nMemoryLimitExceededException,memory_limit_exceeded_exception\nMemoryMiB,memory_mib\nMemoryMiBRequest,memory_mib_request\nMemoryRegions,memory_regions\nMemoryReservation,memory_reservation\nMemorySize,memory_size\nMemorySizeConfiguration,memory_size_configuration\nMemorySizeInMB,memory_size_in_mb\nMemoryStore,memory_store\nMemoryStoreRetentionPeriodInHours,memory_store_retention_period_in_hours\nMemoryThreshold,memory_threshold\nMemoryUtilization,memory_utilization\nMentionSentiment,mention_sentiment\nMentions,mentions\nMerge,merge\nMergeAction,merge_action\nMergeBaseCommit,merge_base_commit\nMergeBranchesByFastForwardInput,merge_branches_by_fast_forward_input\nMergeBranchesByFastForwardOutput,merge_branches_by_fast_forward_output\nMergeBranchesBySquashInput,merge_branches_by_squash_input\nMergeBranchesBySquashOutput,merge_branches_by_squash_output\nMergeBranchesByThreeWayInput,merge_branches_by_three_way_input\nMergeBranchesByThreeWayOutput,merge_branches_by_three_way_output\nMergeClause,merge_clause\nMergeDeveloperIdentitiesInput,merge_developer_identities_input\nMergeDeveloperIdentitiesResponse,merge_developer_identities_response\nMergeHunk,merge_hunk\nMergeHunkDetail,merge_hunk_detail\nMergeMetadata,merge_metadata\nMergeOperations,merge_operations\nMergeOptionRequiredException,merge_option_required_exception\nMergePolicy,merge_policy\nMergeProfilesRequest,merge_profiles_request\nMergeProfilesResponse,merge_profiles_response\nMergePullRequestByFastForwardInput,merge_pull_request_by_fast_forward_input\nMergePullRequestByFastForwardOutput,merge_pull_request_by_fast_forward_output\nMergePullRequestBySquashInput,merge_pull_request_by_squash_input\nMergePullRequestBySquashOutput,merge_pull_request_by_squash_output\nMergePullRequestByThreeWayInput,merge_pull_request_by_three_way_input\nMergePullRequestByThreeWayOutput,merge_pull_request_by_three_way_output\nMergeShardsInput,merge_shards_input\nMergeStrategy,merge_strategy\nMergeWhenMatched,merge_when_matched\nMergeWhenNotMatched,merge_when_not_matched\nMergedDatasetNames,merged_dataset_names\nMeshData,mesh_data\nMeshRef,mesh_ref\nMeshServiceDiscovery,mesh_service_discovery\nMeshSpec,mesh_spec\nMeshStatus,mesh_status\nMessage,message\nMessageAction,message_action\nMessageActivity,message_activity\nMessageAttributeNames,message_attribute_names\nMessageAttributeValue,message_attribute_value\nMessageAttributes,message_attributes\nMessageBody,message_body\nMessageBodyTextType,message_body_text_type\nMessageConfig,message_config\nMessageConfiguration,message_configuration\nMessageData,message_data\nMessageDeduplicationId,message_deduplication_id\nMessageDeliveryStatus,message_delivery_status\nMessageDeliveryStatusEventConfiguration,message_delivery_status_event_configuration\nMessageDeliveryStatusResourceTypeEventConfiguration,message_delivery_status_resource_type_event_configuration\nMessageDetail,message_detail\nMessageDsn,message_dsn\nMessageFieldMappings,message_field_mappings\nMessageFormat,message_format\nMessageFrozen,message_frozen\nMessageGroup,message_group\nMessageGroupId,message_group_id\nMessageId,message_id\nMessageInsightsDataSource,message_insights_data_source\nMessageInsightsFilters,message_insights_filters\nMessageMaxBytes,message_max_bytes\nMessageMetadata,message_metadata\nMessagePayload,message_payload\nMessagePrefix,message_prefix\nMessageRejected,message_rejected\nMessageRequest,message_request\nMessageResponse,message_response\nMessageResult,message_result\nMessageReviewHandler,message_review_handler\nMessageStructure,message_structure\nMessageSubject,message_subject\nMessageSystemAttributeValue,message_system_attribute_value\nMessageSystemAttributes,message_system_attributes\nMessageTag,message_tag\nMessageTemplateType,message_template_type\nMessageText,message_text\nMessageTtlSeconds,message_ttl_seconds\nMessageType,message_type\nMessageTypes,message_types\nMessages,messages\nMessagesPerSecond,messages_per_second\nMessagingSessionEndpoint,messaging_session_endpoint\nMetaData,meta_data\nMetaDataKey,meta_data_key\nMetaDataValue,meta_data_value\nMetadata,metadata\nMetadata3,metadata3\nMetadata4,metadata4\nMetadata5,metadata5\nMetadata6,metadata6\nMetadata7,metadata7\nMetadata8,metadata8\nMetadataBlob,metadata_blob\nMetadataBlobChecksum,metadata_blob_checksum\nMetadataBlobChecksumAlgorithm,metadata_blob_checksum_algorithm\nMetadataBlobLength,metadata_blob_length\nMetadataCatalogConfig,metadata_catalog_config\nMetadataCatalogDetail,metadata_catalog_detail\nMetadataConfiguration,metadata_configuration\nMetadataContent,metadata_content\nMetadataControl,metadata_control\nMetadataDestination,metadata_destination\nMetadataDirective,metadata_directive\nMetadataEntry,metadata_entry\nMetadataException,metadata_exception\nMetadataInfo,metadata_info\nMetadataInfoMap,metadata_info_map\nMetadataKey,metadata_key\nMetadataKeyValue,metadata_key_value\nMetadataKeyValuePair,metadata_key_value_pair\nMetadataList,metadata_list\nMetadataOperation,metadata_operation\nMetadataOptions,metadata_options\nMetadataProperties,metadata_properties\nMetadataString,metadata_string\nMetadataToUpdate,metadata_to_update\nMetadataValue,metadata_value\nMeterUsageRequest,meter_usage_request\nMeterUsageResult,meter_usage_result\nMeteredLinesOfCodeCount,metered_lines_of_code_count\nMeteringMode,metering_mode\nMeteringProfileCount,metering_profile_count\nMeteringRecordId,metering_record_id\nMethod,method\nMethodName,method_name\nMethodNotAllowedException,method_not_allowed_exception\nMethodResponse,method_response\nMethodSetting,method_setting\nMethodSettings,method_settings\nMethodSnapshot,method_snapshot\nMethods,methods\nMetric,metric\nMetricAggregationType,metric_aggregation_type\nMetricAlarm,metric_alarm\nMetricAlarms,metric_alarms\nMetricAttribute,metric_attribute\nMetricAttribution,metric_attribution\nMetricAttributionOutput,metric_attribution_output\nMetricAttributionSummary,metric_attribution_summary\nMetricCollectionType,metric_collection_type\nMetricComparison,metric_comparison\nMetricComparisonComputation,metric_comparison_computation\nMetricData,metric_data\nMetricDataError,metric_data_error\nMetricDataPoint,metric_data_point\nMetricDataQueries,metric_data_queries\nMetricDataQuery,metric_data_query\nMetricDataResult,metric_data_result\nMetricDataResults,metric_data_results\nMetricDataSummary,metric_data_summary\nMetricDataV2,metric_data_v2\nMetricDatapoint,metric_datapoint\nMetricDatapoints,metric_datapoints\nMetricDatum,metric_datum\nMetricDefinition,metric_definition\nMetricDefinitionConfig,metric_definition_config\nMetricDefinitionId,metric_definition_id\nMetricDefinitionIds,metric_definition_ids\nMetricDefinitionRequest,metric_definition_request\nMetricDefinitions,metric_definitions\nMetricDescription,metric_description\nMetricDestinationSummary,metric_destination_summary\nMetricDimension,metric_dimension\nMetricDimensionGroups,metric_dimension_groups\nMetricDimensions,metric_dimensions\nMetricDisplayName,metric_display_name\nMetricFilter,metric_filter\nMetricFilterKey,metric_filter_key\nMetricFilterMatchRecord,metric_filter_match_record\nMetricFilterV2,metric_filter_v2\nMetricFilterValues,metric_filter_values\nMetricFilters,metric_filters\nMetricGoal,metric_goal\nMetricGoalConfig,metric_goal_config\nMetricGranularityType,metric_granularity_type\nMetricGroups,metric_groups\nMetricHeaderCellStyle,metric_header_cell_style\nMetricIndex,metric_index\nMetricInfo,metric_info\nMetricIntervalLowerBound,metric_interval_lower_bound\nMetricIntervalUpperBound,metric_interval_upper_bound\nMetricKeyDataPoints,metric_key_data_points\nMetricLevelImpact,metric_level_impact\nMetricLevelImpactList,metric_level_impact_list\nMetricList,metric_list\nMetricMathAnomalyDetector,metric_math_anomaly_detector\nMetricMonitor,metric_monitor\nMetricMonitorConfig,metric_monitor_config\nMetricName,metric_name\nMetricNames,metric_names\nMetricNamespace,metric_namespace\nMetricPlacement,metric_placement\nMetricPoint,metric_point\nMetricPoints,metric_points\nMetricPolicy,metric_policy\nMetricPolicyRule,metric_policy_rule\nMetricPolicyRules,metric_policy_rules\nMetricProcessingConfig,metric_processing_config\nMetricQueries,metric_queries\nMetricQuery,metric_query\nMetricResult,metric_result\nMetricResultV2,metric_result_v2\nMetricResults,metric_results\nMetricSetArn,metric_set_arn\nMetricSetDataQualityMetric,metric_set_data_quality_metric\nMetricSetDataQualityMetricList,metric_set_data_quality_metric_list\nMetricSetDescription,metric_set_description\nMetricSetDimensionFilter,metric_set_dimension_filter\nMetricSetFrequency,metric_set_frequency\nMetricSetName,metric_set_name\nMetricSetSummary,metric_set_summary\nMetricSetSummaryList,metric_set_summary_list\nMetricSource,metric_source\nMetricSpecification,metric_specification\nMetricSpecifications,metric_specifications\nMetricStat,metric_stat\nMetricStatisticRecommendation,metric_statistic_recommendation\nMetricStreamEntry,metric_stream_entry\nMetricStreamFilter,metric_stream_filter\nMetricStreamStatisticsConfiguration,metric_stream_statistics_configuration\nMetricStreamStatisticsMetric,metric_stream_statistics_metric\nMetricTimezone,metric_timezone\nMetricToRetain,metric_to_retain\nMetricTransformation,metric_transformation\nMetricType,metric_type\nMetricTypes,metric_types\nMetricV2,metric_v2\nMetricValue,metric_value\nMetricValueList,metric_value_list\nMetricWidget,metric_widget\nMetricWidgetImage,metric_widget_image\nMetricWindow,metric_window\nMetrics,metrics\nMetricsAnalyzed,metrics_analyzed\nMetricsAndOperator,metrics_and_operator\nMetricsConfiguration,metrics_configuration\nMetricsConfigurationList,metrics_configuration_list\nMetricsDataSource,metrics_data_source\nMetricsEnabled,metrics_enabled\nMetricsLevel,metrics_level\nMetricsLevelUpdate,metrics_level_update\nMetricsOverLookbackPeriod,metrics_over_lookback_period\nMetricsSource,metrics_source\nMetricsSummary,metrics_summary\nMetro,metro\nMfa,mfa\nMfaAuthenticated,mfa_authenticated\nMfaConfiguration,mfa_configuration\nMfaEmail,mfa_email\nMfaTypes,mfa_types\nMicroF1Score,micro_f1_score\nMicroPrecision,micro_precision\nMicroRecall,micro_recall\nMicrosoftSQLServerCatalogSource,microsoft_sql_server_catalog_source\nMicrosoftSQLServerCatalogTarget,microsoft_sql_server_catalog_target\nMicrosoftSQLServerSettings,microsoft_sql_server_settings\nMicrosoftSqlServerDataProviderSettings,microsoft_sql_server_data_provider_settings\nMiddleName,middle_name\nMigrateWorkspaceRequest,migrate_workspace_request\nMigrateWorkspaceResult,migrate_workspace_result\nMigrationAdmin,migration_admin\nMigrationAlert,migration_alert\nMigrationErrorReason,migration_error_reason\nMigrationErrorType,migration_error_type\nMigrationProject,migration_project\nMigrationProjectArn,migration_project_arn\nMigrationProjectCreationTime,migration_project_creation_time\nMigrationProjectIdentifier,migration_project_identifier\nMigrationProjectName,migration_project_name\nMigrationProjects,migration_projects\nMigrationSummary,migration_summary\nMigrationTask,migration_task\nMigrationTaskName,migration_task_name\nMigrationTaskSummary,migration_task_summary\nMigrationTaskSummaryList,migration_task_summary_list\nMigrationType,migration_type\nMigrationWorkflowSummary,migration_workflow_summary\nMilestone,milestone\nMilestoneName,milestone_name\nMilestoneNumber,milestone_number\nMilestoneSummaries,milestone_summaries\nMilestoneSummary,milestone_summary\nMillisBehindLatest,millis_behind_latest\nMimeType,mime_type\nMin,min\nMinAbrBitrate,min_abr_bitrate\nMinAdjustmentMagnitude,min_adjustment_magnitude\nMinAdjustmentStep,min_adjustment_step\nMinAllocatedStorage,min_allocated_storage\nMinAllowedConfidenceScoreForMerging,min_allowed_confidence_score_for_merging\nMinBottomRenditionSize,min_bottom_rendition_size\nMinBoundingBoxHeight,min_bounding_box_height\nMinBoundingBoxWidth,min_bounding_box_width\nMinBufferTime,min_buffer_time\nMinBufferTimeSeconds,min_buffer_time_seconds\nMinCapacity,min_capacity\nMinCapacityUnits,min_capacity_units\nMinConfidence,min_confidence\nMinCount,min_count\nMinCoveragePercentage,min_coverage_percentage\nMinDuration,min_duration\nMinEbpInterval,min_ebp_interval\nMinFinalSegmentLength,min_final_segment_length\nMinGwDiversity,min_gw_diversity\nMinHealthyPercentage,min_healthy_percentage\nMinIInterval,min_i_interval\nMinInferenceUnits,min_inference_units\nMinInvocationsPerMinute,min_invocations_per_minute\nMinIopsPerDbInstance,min_iops_per_db_instance\nMinIopsPerGib,min_iops_per_gib\nMinLatency,min_latency\nMinLength,min_length\nMinLuminance,min_luminance\nMinMax,min_max\nMinMaxGradient,min_max_gradient\nMinModelVersion,min_model_version\nMinPartitions,min_partitions\nMinPauseBetweenCheckpoints,min_pause_between_checkpoints\nMinPauseBetweenCheckpointsUpdate,min_pause_between_checkpoints_update\nMinRange,min_range\nMinResource,min_resource\nMinRetentionDays,min_retention_days\nMinSegmentConfidence,min_segment_confidence\nMinSegmentLength,min_segment_length\nMinSelectedChoices,min_selected_choices\nMinSize,min_size\nMinSlotDurationInHours,min_slot_duration_in_hours\nMinStorageBytesPercentage,min_storage_bytes_percentage\nMinStorageSize,min_storage_size\nMinStorageThroughputPerDbInstance,min_storage_throughput_per_db_instance\nMinStorageThroughputPerIops,min_storage_throughput_per_iops\nMinTTL,min_ttl\nMinTargetCapacity,min_target_capacity\nMinTermDurationInDays,min_term_duration_in_days\nMinTopRenditionSize,min_top_rendition_size\nMinTrafficImpact,min_traffic_impact\nMinUnits,min_units\nMinUpdatePeriodSeconds,min_update_period_seconds\nMinValue,min_value\nMinVersion,min_version\nMinVideoBitsPerSecond,min_video_bits_per_second\nMinWorkers,min_workers\nMinimalKeyLength,minimal_key_length\nMinimum,minimum\nMinimumBitrate,minimum_bitrate\nMinimumCapacityUnits,minimum_capacity_units\nMinimumCompressionSize,minimum_compression_size\nMinimumEngineVersion,minimum_engine_version\nMinimumEngineVersionPerAllowedValue,minimum_engine_version_per_allowed_value\nMinimumGranularity,minimum_granularity\nMinimumHealthyHosts,minimum_healthy_hosts\nMinimumHealthyPercent,minimum_healthy_percent\nMinimumInstanceCount,minimum_instance_count\nMinimumInstanceMetadataServiceVersion,minimum_instance_metadata_service_version\nMinimumLabelType,minimum_label_type\nMinimumLength,minimum_length\nMinimumMembershipPercentage,minimum_membership_percentage\nMinimumNormalizedUnitsUsedPerHour,minimum_normalized_units_used_per_hour\nMinimumNumTapes,minimum_num_tapes\nMinimumNumberOfInstancesUsedPerHour,minimum_number_of_instances_used_per_hour\nMinimumNumberOfQueryingUsers,minimum_number_of_querying_users\nMinimumPasswordLength,minimum_password_length\nMinimumProtocolVersion,minimum_protocol_version\nMinimumQueryCount,minimum_query_count\nMinimumRGBTolerance,minimum_rgb_tolerance\nMinimumRequiredMinorEngineVersion,minimum_required_minor_engine_version\nMinimumRetention,minimum_retention\nMinimumUnits,minimum_units\nMinimumValue,minimum_value\nMinimumYUV,minimum_yuv\nMinorRevision,minor_revision\nMinorVersion,minor_version\nMinuteOfHour,minute_of_hour\nMinutes,minutes\nMissingAuthenticationToken,missing_authentication_token\nMissingBlueprints,missing_blueprints\nMissingBody,missing_body\nMissingCodecPrivateDataException,missing_codec_private_data_exception\nMissingCompleteSensorData,missing_complete_sensor_data\nMissingComponent,missing_component\nMissingContextValues,missing_context_values\nMissingCount,missing_count\nMissingDataConfiguration,missing_data_configuration\nMissingDataConfigurations,missing_data_configurations\nMissingDateVisibility,missing_date_visibility\nMissingFileCacheConfiguration,missing_file_cache_configuration\nMissingFileSystemConfiguration,missing_file_system_configuration\nMissingMeta,missing_meta\nMissingOnRds,missing_on_rds\nMissingParameterException,missing_parameter_exception\nMissingParameterValueException,missing_parameter_value_exception\nMissingPercentage,missing_percentage\nMissingRenderingAttributeException,missing_rendering_attribute_exception\nMissingRequiredParameter,missing_required_parameter\nMissingRequiredParameterException,missing_required_parameter_exception\nMissingSensorData,missing_sensor_data\nMissingValues,missing_values\nMissingVersionException,missing_version_exception\nMissingVolumeConfiguration,missing_volume_configuration\nMissingWorkflows,missing_workflows\nMissionProfileIdResponse,mission_profile_id_response\nMissionProfileListItem,mission_profile_list_item\nMitigation,mitigation\nMitigationAction,mitigation_action\nMitigationActionIdentifier,mitigation_action_identifier\nMitigationActionParams,mitigation_action_params\nMitigationName,mitigation_name\nMitigations,mitigations\nMixed,mixed\nMixedInstancesPolicy,mixed_instances_policy\nMixedMeasureMapping,mixed_measure_mapping\nMixedMeasureMappings,mixed_measure_mappings\nMlConfigDefinition,ml_config_definition\nMlResourceDefinition,ml_resource_definition\nMlUserDataEncryption,ml_user_data_encryption\nMlUserDataEncryptionMode,ml_user_data_encryption_mode\nMnc,mnc\nMobile,mobile\nMobileDeviceAccessMatchedRule,mobile_device_access_matched_rule\nMobileDeviceAccessOverride,mobile_device_access_override\nMobileDeviceAccessRule,mobile_device_access_rule\nMobileDeviceAccessRuleId,mobile_device_access_rule_id\nMobilePhoneNumber,mobile_phone_number\nMobileSdkRelease,mobile_sdk_release\nMode,mode\nModeBlock,mode_block\nModel,model\nModelApprovalStatus,model_approval_status\nModelArn,model_arn\nModelArtifact,model_artifact\nModelArtifacts,model_artifacts\nModelBiasAppSpecification,model_bias_app_specification\nModelBiasBaselineConfig,model_bias_baseline_config\nModelBiasJobInput,model_bias_job_input\nModelBiasJobOutputConfig,model_bias_job_output_config\nModelCacheSetting,model_cache_setting\nModelCard,model_card\nModelCardArn,model_card_arn\nModelCardExportArtifacts,model_card_export_artifacts\nModelCardExportJobArn,model_card_export_job_arn\nModelCardExportJobName,model_card_export_job_name\nModelCardExportJobNameContains,model_card_export_job_name_contains\nModelCardExportJobSummaries,model_card_export_job_summaries\nModelCardExportJobSummary,model_card_export_job_summary\nModelCardExportOutputConfig,model_card_export_output_config\nModelCardName,model_card_name\nModelCardProcessingStatus,model_card_processing_status\nModelCardSecurityConfig,model_card_security_config\nModelCardStatus,model_card_status\nModelCardSummaries,model_card_summaries\nModelCardSummary,model_card_summary\nModelCardVersion,model_card_version\nModelCardVersionSummary,model_card_version_summary\nModelCardVersionSummaryList,model_card_version_summary_list\nModelClientConfig,model_client_config\nModelConfigs,model_configs\nModelConfiguration,model_configuration\nModelCustomizationJobSummary,model_customization_job_summary\nModelDashboardEndpoint,model_dashboard_endpoint\nModelDashboardIndicator,model_dashboard_indicator\nModelDashboardIndicatorAction,model_dashboard_indicator_action\nModelDashboardModel,model_dashboard_model\nModelDashboardModelCard,model_dashboard_model_card\nModelDashboardMonitoringSchedule,model_dashboard_monitoring_schedule\nModelDataDownloadTimeoutInSeconds,model_data_download_timeout_in_seconds\nModelDataQuality,model_data_quality\nModelDataSource,model_data_source\nModelDataUrl,model_data_url\nModelDeployConfig,model_deploy_config\nModelDeployResult,model_deploy_result\nModelDescription,model_description\nModelDigests,model_digests\nModelEndpointDataBlob,model_endpoint_data_blob\nModelError,model_error\nModelErrorException,model_error_exception\nModelExplainabilityAppSpecification,model_explainability_app_specification\nModelExplainabilityBaselineConfig,model_explainability_baseline_config\nModelExplainabilityJobInput,model_explainability_job_input\nModelExplainabilityJobOutputConfig,model_explainability_job_output_config\nModelHandle,model_handle\nModelId,model_id\nModelInfrastructureConfig,model_infrastructure_config\nModelInput,model_input\nModelInputConfiguration,model_input_configuration\nModelInsights,model_insights\nModelIntrospectionSchema,model_introspection_schema\nModelKmsKeyId,model_kms_key_id\nModelLatency,model_latency\nModelLatencyThreshold,model_latency_threshold\nModelLatencyThresholds,model_latency_thresholds\nModelManifestSummary,model_manifest_summary\nModelMetadata,model_metadata\nModelMetadataFilter,model_metadata_filter\nModelMetadataSearchExpression,model_metadata_search_expression\nModelMetadataSummaries,model_metadata_summaries\nModelMetadataSummary,model_metadata_summary\nModelMetrics,model_metrics\nModelName,model_name\nModelNameBeginsWith,model_name_begins_with\nModelNameContains,model_name_contains\nModelNameEquals,model_name_equals\nModelNotReadyException,model_not_ready_exception\nModelOutputConfiguration,model_output_configuration\nModelPackage,model_package\nModelPackageArn,model_package_arn\nModelPackageArnList,model_package_arn_list\nModelPackageContainerDefinition,model_package_container_definition\nModelPackageDescription,model_package_description\nModelPackageGroup,model_package_group\nModelPackageGroupArn,model_package_group_arn\nModelPackageGroupDescription,model_package_group_description\nModelPackageGroupName,model_package_group_name\nModelPackageGroupStatus,model_package_group_status\nModelPackageGroupSummary,model_package_group_summary\nModelPackageGroupSummaryList,model_package_group_summary_list\nModelPackageName,model_package_name\nModelPackageStatus,model_package_status\nModelPackageStatusDetails,model_package_status_details\nModelPackageStatusItem,model_package_status_item\nModelPackageSummaries,model_package_summaries\nModelPackageSummary,model_package_summary\nModelPackageSummaryList,model_package_summary_list\nModelPackageType,model_package_type\nModelPackageValidationProfile,model_package_validation_profile\nModelPackageValidationSpecification,model_package_validation_specification\nModelPackageVersion,model_package_version\nModelPackageVersionArn,model_package_version_arn\nModelPackageVersionArnEquals,model_package_version_arn_equals\nModelPackagingConfiguration,model_packaging_configuration\nModelPackagingDescription,model_packaging_description\nModelPackagingJobDescription,model_packaging_job_description\nModelPackagingJobMetadata,model_packaging_job_metadata\nModelPackagingJobs,model_packaging_jobs\nModelPackagingMethod,model_packaging_method\nModelPackagingOutputDetails,model_packaging_output_details\nModelPerformance,model_performance\nModelPolicy,model_policy\nModelQuality,model_quality\nModelQualityAppSpecification,model_quality_app_specification\nModelQualityBaselineConfig,model_quality_baseline_config\nModelQualityJobInput,model_quality_job_input\nModelQualityJobOutputConfig,model_quality_job_output_config\nModelRegisterSettings,model_register_settings\nModelScores,model_scores\nModelSelectionExpression,model_selection_expression\nModelSettings,model_settings\nModelSetupTime,model_setup_time\nModelSignature,model_signature\nModelStats,model_stats\nModelStatus,model_status\nModelStepMetadata,model_step_metadata\nModelStreamError,model_stream_error\nModelStreamErrorException,model_stream_error_exception\nModelSummaries,model_summaries\nModelSummary,model_summary\nModelTimeoutException,model_timeout_exception\nModelType,model_type\nModelVariantActions,model_variant_actions\nModelVariantConfig,model_variant_config\nModelVariantConfigSummary,model_variant_config_summary\nModelVariants,model_variants\nModelVersion,model_version\nModelVersionActivatedAt,model_version_activated_at\nModelVersionArn,model_version_arn\nModelVersionDetail,model_version_detail\nModelVersionEvaluation,model_version_evaluation\nModelVersionSummaries,model_version_summaries\nModelVersionSummary,model_version_summary\nModels,models\nModerationLabel,moderation_label\nModerationLabels,moderation_labels\nModerationModelVersion,moderation_model_version\nModerator,moderator\nModeratorArns,moderator_arns\nModificationResults,modification_results\nModificationState,modification_state\nModificationStates,modification_states\nModificationTime,modification_time\nModifications,modifications\nModifiedAfter,modified_after\nModifiedAt,modified_at\nModifiedBefore,modified_before\nModifiedDate,modified_date\nModifiedRange,modified_range\nModifiedSinceConstraint,modified_since_constraint\nModifiedTimeAfter,modified_time_after\nModifiedTimeBefore,modified_time_before\nModifiedTimestamp,modified_timestamp\nModifierPercentage,modifier_percentage\nModifyAccountRequest,modify_account_request\nModifyActivityStreamRequest,modify_activity_stream_request\nModifyActivityStreamResponse,modify_activity_stream_response\nModifyAddressAttributeRequest,modify_address_attribute_request\nModifyAddressAttributeResult,modify_address_attribute_result\nModifyAquaInputMessage,modify_aqua_input_message\nModifyAquaOutputMessage,modify_aqua_output_message\nModifyAuthenticationProfileMessage,modify_authentication_profile_message\nModifyAuthenticationProfileResult,modify_authentication_profile_result\nModifyAvailabilityZoneGroupRequest,modify_availability_zone_group_request\nModifyAvailabilityZoneGroupResult,modify_availability_zone_group_result\nModifyBackupAttributesRequest,modify_backup_attributes_request\nModifyBackupAttributesResponse,modify_backup_attributes_response\nModifyCacheClusterMessage,modify_cache_cluster_message\nModifyCacheClusterResult,modify_cache_cluster_result\nModifyCacheParameterGroupMessage,modify_cache_parameter_group_message\nModifyCacheSubnetGroupMessage,modify_cache_subnet_group_message\nModifyCacheSubnetGroupResult,modify_cache_subnet_group_result\nModifyCapacityReservationFleetRequest,modify_capacity_reservation_fleet_request\nModifyCapacityReservationFleetResult,modify_capacity_reservation_fleet_result\nModifyCapacityReservationRequest,modify_capacity_reservation_request\nModifyCapacityReservationResult,modify_capacity_reservation_result\nModifyCertificateBasedAuthPropertiesRequest,modify_certificate_based_auth_properties_request\nModifyCertificatesMessage,modify_certificates_message\nModifyCertificatesResult,modify_certificates_result\nModifyClientPropertiesRequest,modify_client_properties_request\nModifyClientVpnEndpointRequest,modify_client_vpn_endpoint_request\nModifyClientVpnEndpointResult,modify_client_vpn_endpoint_result\nModifyClusterDbRevisionMessage,modify_cluster_db_revision_message\nModifyClusterDbRevisionResult,modify_cluster_db_revision_result\nModifyClusterIamRolesMessage,modify_cluster_iam_roles_message\nModifyClusterIamRolesResult,modify_cluster_iam_roles_result\nModifyClusterInput,modify_cluster_input\nModifyClusterMaintenanceMessage,modify_cluster_maintenance_message\nModifyClusterMaintenanceResult,modify_cluster_maintenance_result\nModifyClusterMessage,modify_cluster_message\nModifyClusterOutput,modify_cluster_output\nModifyClusterParameterGroupMessage,modify_cluster_parameter_group_message\nModifyClusterRequest,modify_cluster_request\nModifyClusterResponse,modify_cluster_response\nModifyClusterResult,modify_cluster_result\nModifyClusterSnapshotMessage,modify_cluster_snapshot_message\nModifyClusterSnapshotResult,modify_cluster_snapshot_result\nModifyClusterSnapshotScheduleMessage,modify_cluster_snapshot_schedule_message\nModifyClusterSubnetGroupMessage,modify_cluster_subnet_group_message\nModifyClusterSubnetGroupResult,modify_cluster_subnet_group_result\nModifyConversionConfigurationMessage,modify_conversion_configuration_message\nModifyConversionConfigurationResponse,modify_conversion_configuration_response\nModifyCurrentDBClusterCapacityMessage,modify_current_db_cluster_capacity_message\nModifyCustomDBEngineVersionMessage,modify_custom_db_engine_version_message\nModifyCustomDomainAssociationMessage,modify_custom_domain_association_message\nModifyCustomDomainAssociationResult,modify_custom_domain_association_result\nModifyDBClusterEndpointMessage,modify_db_cluster_endpoint_message\nModifyDBClusterEndpointOutput,modify_db_cluster_endpoint_output\nModifyDBClusterMessage,modify_db_cluster_message\nModifyDBClusterParameterGroupMessage,modify_db_cluster_parameter_group_message\nModifyDBClusterResult,modify_db_cluster_result\nModifyDBClusterSnapshotAttributeMessage,modify_db_cluster_snapshot_attribute_message\nModifyDBClusterSnapshotAttributeResult,modify_db_cluster_snapshot_attribute_result\nModifyDBInstanceMessage,modify_db_instance_message\nModifyDBInstanceResult,modify_db_instance_result\nModifyDBParameterGroupMessage,modify_db_parameter_group_message\nModifyDBProxyEndpointRequest,modify_db_proxy_endpoint_request\nModifyDBProxyEndpointResponse,modify_db_proxy_endpoint_response\nModifyDBProxyRequest,modify_db_proxy_request\nModifyDBProxyResponse,modify_db_proxy_response\nModifyDBProxyTargetGroupRequest,modify_db_proxy_target_group_request\nModifyDBProxyTargetGroupResponse,modify_db_proxy_target_group_response\nModifyDBSnapshotAttributeMessage,modify_db_snapshot_attribute_message\nModifyDBSnapshotAttributeResult,modify_db_snapshot_attribute_result\nModifyDBSnapshotMessage,modify_db_snapshot_message\nModifyDBSnapshotResult,modify_db_snapshot_result\nModifyDBSubnetGroupMessage,modify_db_subnet_group_message\nModifyDBSubnetGroupResult,modify_db_subnet_group_result\nModifyDataProviderMessage,modify_data_provider_message\nModifyDataProviderResponse,modify_data_provider_response\nModifyDefaultCreditSpecificationRequest,modify_default_credit_specification_request\nModifyDefaultCreditSpecificationResult,modify_default_credit_specification_result\nModifyDocumentPermissionRequest,modify_document_permission_request\nModifyEbsDefaultKmsKeyIdRequest,modify_ebs_default_kms_key_id_request\nModifyEbsDefaultKmsKeyIdResult,modify_ebs_default_kms_key_id_result\nModifyEndpointAccessMessage,modify_endpoint_access_message\nModifyEndpointMessage,modify_endpoint_message\nModifyEndpointResponse,modify_endpoint_response\nModifyEventSubscriptionMessage,modify_event_subscription_message\nModifyEventSubscriptionResponse,modify_event_subscription_response\nModifyEventSubscriptionResult,modify_event_subscription_result\nModifyFleetRequest,modify_fleet_request\nModifyFleetResult,modify_fleet_result\nModifyFpgaImageAttributeRequest,modify_fpga_image_attribute_request\nModifyFpgaImageAttributeResult,modify_fpga_image_attribute_result\nModifyGlobalClusterMessage,modify_global_cluster_message\nModifyGlobalClusterResult,modify_global_cluster_result\nModifyGlobalReplicationGroupMessage,modify_global_replication_group_message\nModifyGlobalReplicationGroupResult,modify_global_replication_group_result\nModifyHapgRequest,modify_hapg_request\nModifyHapgResponse,modify_hapg_response\nModifyHostsRequest,modify_hosts_request\nModifyHostsResult,modify_hosts_result\nModifyHsmRequest,modify_hsm_request\nModifyHsmResponse,modify_hsm_response\nModifyIdFormatRequest,modify_id_format_request\nModifyIdentityIdFormatRequest,modify_identity_id_format_request\nModifyImageAttributeRequest,modify_image_attribute_request\nModifyInstanceAttributeRequest,modify_instance_attribute_request\nModifyInstanceCapacityReservationAttributesRequest,modify_instance_capacity_reservation_attributes_request\nModifyInstanceCapacityReservationAttributesResult,modify_instance_capacity_reservation_attributes_result\nModifyInstanceCreditSpecificationRequest,modify_instance_credit_specification_request\nModifyInstanceCreditSpecificationResult,modify_instance_credit_specification_result\nModifyInstanceEventStartTimeRequest,modify_instance_event_start_time_request\nModifyInstanceEventStartTimeResult,modify_instance_event_start_time_result\nModifyInstanceEventWindowRequest,modify_instance_event_window_request\nModifyInstanceEventWindowResult,modify_instance_event_window_result\nModifyInstanceFleetInput,modify_instance_fleet_input\nModifyInstanceGroupsInput,modify_instance_groups_input\nModifyInstanceMaintenanceOptionsRequest,modify_instance_maintenance_options_request\nModifyInstanceMaintenanceOptionsResult,modify_instance_maintenance_options_result\nModifyInstanceMetadataOptionsRequest,modify_instance_metadata_options_request\nModifyInstanceMetadataOptionsResult,modify_instance_metadata_options_result\nModifyInstancePlacementRequest,modify_instance_placement_request\nModifyInstancePlacementResult,modify_instance_placement_result\nModifyInstanceProfileMessage,modify_instance_profile_message\nModifyInstanceProfileResponse,modify_instance_profile_response\nModifyIpamPoolRequest,modify_ipam_pool_request\nModifyIpamPoolResult,modify_ipam_pool_result\nModifyIpamRequest,modify_ipam_request\nModifyIpamResourceCidrRequest,modify_ipam_resource_cidr_request\nModifyIpamResourceCidrResult,modify_ipam_resource_cidr_result\nModifyIpamResourceDiscoveryRequest,modify_ipam_resource_discovery_request\nModifyIpamResourceDiscoveryResult,modify_ipam_resource_discovery_result\nModifyIpamResult,modify_ipam_result\nModifyIpamScopeRequest,modify_ipam_scope_request\nModifyIpamScopeResult,modify_ipam_scope_result\nModifyLaunchTemplateRequest,modify_launch_template_request\nModifyLaunchTemplateResult,modify_launch_template_result\nModifyListenerInput,modify_listener_input\nModifyListenerOutput,modify_listener_output\nModifyLoadBalancerAttributesInput,modify_load_balancer_attributes_input\nModifyLoadBalancerAttributesOutput,modify_load_balancer_attributes_output\nModifyLocalGatewayRouteRequest,modify_local_gateway_route_request\nModifyLocalGatewayRouteResult,modify_local_gateway_route_result\nModifyLunaClientRequest,modify_luna_client_request\nModifyLunaClientResponse,modify_luna_client_response\nModifyManagedPrefixListRequest,modify_managed_prefix_list_request\nModifyManagedPrefixListResult,modify_managed_prefix_list_result\nModifyMigrationProjectMessage,modify_migration_project_message\nModifyMigrationProjectResponse,modify_migration_project_response\nModifyMountTargetSecurityGroupsRequest,modify_mount_target_security_groups_request\nModifyNetworkInterfaceAttributeRequest,modify_network_interface_attribute_request\nModifyOptionGroupMessage,modify_option_group_message\nModifyOptionGroupResult,modify_option_group_result\nModifyPrivateDnsNameOptionsRequest,modify_private_dns_name_options_request\nModifyPrivateDnsNameOptionsResult,modify_private_dns_name_options_result\nModifyRecommendationDetail,modify_recommendation_detail\nModifyReplicationConfigMessage,modify_replication_config_message\nModifyReplicationConfigResponse,modify_replication_config_response\nModifyReplicationGroupMessage,modify_replication_group_message\nModifyReplicationGroupResult,modify_replication_group_result\nModifyReplicationGroupShardConfigurationMessage,modify_replication_group_shard_configuration_message\nModifyReplicationGroupShardConfigurationResult,modify_replication_group_shard_configuration_result\nModifyReplicationInstanceMessage,modify_replication_instance_message\nModifyReplicationInstanceResponse,modify_replication_instance_response\nModifyReplicationSubnetGroupMessage,modify_replication_subnet_group_message\nModifyReplicationSubnetGroupResponse,modify_replication_subnet_group_response\nModifyReplicationTaskMessage,modify_replication_task_message\nModifyReplicationTaskResponse,modify_replication_task_response\nModifyReportDefinitionRequest,modify_report_definition_request\nModifyReservedInstancesRequest,modify_reserved_instances_request\nModifyReservedInstancesResult,modify_reserved_instances_result\nModifyRuleInput,modify_rule_input\nModifyRuleOutput,modify_rule_output\nModifySamlPropertiesRequest,modify_saml_properties_request\nModifyScheduledActionMessage,modify_scheduled_action_message\nModifySecurityGroupRulesRequest,modify_security_group_rules_request\nModifySecurityGroupRulesResult,modify_security_group_rules_result\nModifySelfservicePermissionsRequest,modify_selfservice_permissions_request\nModifySnapshotAttributeRequest,modify_snapshot_attribute_request\nModifySnapshotCopyRetentionPeriodMessage,modify_snapshot_copy_retention_period_message\nModifySnapshotCopyRetentionPeriodResult,modify_snapshot_copy_retention_period_result\nModifySnapshotScheduleMessage,modify_snapshot_schedule_message\nModifySnapshotTierRequest,modify_snapshot_tier_request\nModifySnapshotTierResult,modify_snapshot_tier_result\nModifySpotFleetRequestRequest,modify_spot_fleet_request_request\nModifySpotFleetRequestResponse,modify_spot_fleet_request_response\nModifyStatus,modify_status\nModifySubnetAttributeRequest,modify_subnet_attribute_request\nModifyTargetGroupAttributesInput,modify_target_group_attributes_input\nModifyTargetGroupAttributesOutput,modify_target_group_attributes_output\nModifyTargetGroupInput,modify_target_group_input\nModifyTargetGroupOutput,modify_target_group_output\nModifyTrafficMirrorFilterNetworkServicesRequest,modify_traffic_mirror_filter_network_services_request\nModifyTrafficMirrorFilterNetworkServicesResult,modify_traffic_mirror_filter_network_services_result\nModifyTrafficMirrorFilterRuleRequest,modify_traffic_mirror_filter_rule_request\nModifyTrafficMirrorFilterRuleResult,modify_traffic_mirror_filter_rule_result\nModifyTrafficMirrorSessionRequest,modify_traffic_mirror_session_request\nModifyTrafficMirrorSessionResult,modify_traffic_mirror_session_result\nModifyTransitGatewayOptions,modify_transit_gateway_options\nModifyTransitGatewayPrefixListReferenceRequest,modify_transit_gateway_prefix_list_reference_request\nModifyTransitGatewayPrefixListReferenceResult,modify_transit_gateway_prefix_list_reference_result\nModifyTransitGatewayRequest,modify_transit_gateway_request\nModifyTransitGatewayResult,modify_transit_gateway_result\nModifyTransitGatewayVpcAttachmentRequest,modify_transit_gateway_vpc_attachment_request\nModifyTransitGatewayVpcAttachmentRequestOptions,modify_transit_gateway_vpc_attachment_request_options\nModifyTransitGatewayVpcAttachmentResult,modify_transit_gateway_vpc_attachment_result\nModifyUsageLimitMessage,modify_usage_limit_message\nModifyUserGroupMessage,modify_user_group_message\nModifyUserMessage,modify_user_message\nModifyVerifiedAccessEndpointEniOptions,modify_verified_access_endpoint_eni_options\nModifyVerifiedAccessEndpointLoadBalancerOptions,modify_verified_access_endpoint_load_balancer_options\nModifyVerifiedAccessEndpointPolicyRequest,modify_verified_access_endpoint_policy_request\nModifyVerifiedAccessEndpointPolicyResult,modify_verified_access_endpoint_policy_result\nModifyVerifiedAccessEndpointRequest,modify_verified_access_endpoint_request\nModifyVerifiedAccessEndpointResult,modify_verified_access_endpoint_result\nModifyVerifiedAccessGroupPolicyRequest,modify_verified_access_group_policy_request\nModifyVerifiedAccessGroupPolicyResult,modify_verified_access_group_policy_result\nModifyVerifiedAccessGroupRequest,modify_verified_access_group_request\nModifyVerifiedAccessGroupResult,modify_verified_access_group_result\nModifyVerifiedAccessInstanceLoggingConfigurationRequest,modify_verified_access_instance_logging_configuration_request\nModifyVerifiedAccessInstanceLoggingConfigurationResult,modify_verified_access_instance_logging_configuration_result\nModifyVerifiedAccessInstanceRequest,modify_verified_access_instance_request\nModifyVerifiedAccessInstanceResult,modify_verified_access_instance_result\nModifyVerifiedAccessTrustProviderOidcOptions,modify_verified_access_trust_provider_oidc_options\nModifyVerifiedAccessTrustProviderRequest,modify_verified_access_trust_provider_request\nModifyVerifiedAccessTrustProviderResult,modify_verified_access_trust_provider_result\nModifyVolumeAttributeRequest,modify_volume_attribute_request\nModifyVolumeRequest,modify_volume_request\nModifyVolumeResult,modify_volume_result\nModifyVpcAttributeRequest,modify_vpc_attribute_request\nModifyVpcEndpointConnectionNotificationRequest,modify_vpc_endpoint_connection_notification_request\nModifyVpcEndpointConnectionNotificationResult,modify_vpc_endpoint_connection_notification_result\nModifyVpcEndpointRequest,modify_vpc_endpoint_request\nModifyVpcEndpointResult,modify_vpc_endpoint_result\nModifyVpcEndpointServiceConfigurationRequest,modify_vpc_endpoint_service_configuration_request\nModifyVpcEndpointServiceConfigurationResult,modify_vpc_endpoint_service_configuration_result\nModifyVpcEndpointServicePayerResponsibilityRequest,modify_vpc_endpoint_service_payer_responsibility_request\nModifyVpcEndpointServicePayerResponsibilityResult,modify_vpc_endpoint_service_payer_responsibility_result\nModifyVpcEndpointServicePermissionsRequest,modify_vpc_endpoint_service_permissions_request\nModifyVpcEndpointServicePermissionsResult,modify_vpc_endpoint_service_permissions_result\nModifyVpcPeeringConnectionOptionsRequest,modify_vpc_peering_connection_options_request\nModifyVpcPeeringConnectionOptionsResult,modify_vpc_peering_connection_options_result\nModifyVpcTenancyRequest,modify_vpc_tenancy_request\nModifyVpcTenancyResult,modify_vpc_tenancy_result\nModifyVpnConnectionOptionsRequest,modify_vpn_connection_options_request\nModifyVpnConnectionOptionsResult,modify_vpn_connection_options_result\nModifyVpnConnectionRequest,modify_vpn_connection_request\nModifyVpnConnectionResult,modify_vpn_connection_result\nModifyVpnTunnelCertificateRequest,modify_vpn_tunnel_certificate_request\nModifyVpnTunnelCertificateResult,modify_vpn_tunnel_certificate_result\nModifyVpnTunnelOptionsRequest,modify_vpn_tunnel_options_request\nModifyVpnTunnelOptionsResult,modify_vpn_tunnel_options_result\nModifyVpnTunnelOptionsSpecification,modify_vpn_tunnel_options_specification\nModifyWorkspaceAccessPropertiesRequest,modify_workspace_access_properties_request\nModifyWorkspaceCreationPropertiesRequest,modify_workspace_creation_properties_request\nModifyWorkspacePropertiesRequest,modify_workspace_properties_request\nModifyWorkspaceStateRequest,modify_workspace_state_request\nModifyingProcess,modifying_process\nModuleFilePath,module_file_path\nModuleInfo,module_info\nModuleLoggingConfiguration,module_logging_configuration\nModuleLoggingConfigurationInput,module_logging_configuration_input\nModuleName,module_name\nModuleSha256,module_sha256\nMonday,monday\nMonetaryAmount,monetary_amount\nMongoDBTarget,mongo_db_target\nMongoDBTargets,mongo_db_targets\nMongoDbDataProviderSettings,mongo_db_data_provider_settings\nMongoDbSettings,mongo_db_settings\nMonitor,monitor\nMonitorArn,monitor_arn\nMonitorArnList,monitor_arn_list\nMonitorConfig,monitor_config\nMonitorContactRequest,monitor_contact_request\nMonitorContactResponse,monitor_contact_response\nMonitorDataSource,monitor_data_source\nMonitorDimension,monitor_dimension\nMonitorErrorDetails,monitor_error_details\nMonitorInfo,monitor_info\nMonitorInstancesRequest,monitor_instances_request\nMonitorInstancesResult,monitor_instances_result\nMonitorName,monitor_name\nMonitorSpecification,monitor_specification\nMonitorStatus,monitor_status\nMonitorSummary,monitor_summary\nMonitorType,monitor_type\nMonitored,monitored\nMonitoredResourceARN,monitored_resource_arn\nMonitoredResourceIdentifier,monitored_resource_identifier\nMonitoredResourceIdentifiers,monitored_resource_identifiers\nMonitoredResourceInfo,monitored_resource_info\nMonitoredResourceName,monitored_resource_name\nMonitoring,monitoring\nMonitoringAlertActions,monitoring_alert_actions\nMonitoringAlertHistory,monitoring_alert_history\nMonitoringAlertHistorySummary,monitoring_alert_history_summary\nMonitoringAlertName,monitoring_alert_name\nMonitoringAlertSummaries,monitoring_alert_summaries\nMonitoringAlertSummary,monitoring_alert_summary\nMonitoringAppSpecification,monitoring_app_specification\nMonitoringBaselineConfig,monitoring_baseline_config\nMonitoringClusterConfig,monitoring_cluster_config\nMonitoringConfiguration,monitoring_configuration\nMonitoringConfigurationDescription,monitoring_configuration_description\nMonitoringConfigurationUpdate,monitoring_configuration_update\nMonitoringConstraintsResource,monitoring_constraints_resource\nMonitoringCsvDatasetFormat,monitoring_csv_dataset_format\nMonitoringDatasetFormat,monitoring_dataset_format\nMonitoringExecutionStatus,monitoring_execution_status\nMonitoringExecutionSummaries,monitoring_execution_summaries\nMonitoringExecutionSummary,monitoring_execution_summary\nMonitoringGroundTruthS3Input,monitoring_ground_truth_s3_input\nMonitoringInput,monitoring_input\nMonitoringInputs,monitoring_inputs\nMonitoringInterval,monitoring_interval\nMonitoringJobDefinition,monitoring_job_definition\nMonitoringJobDefinitionArn,monitoring_job_definition_arn\nMonitoringJobDefinitionName,monitoring_job_definition_name\nMonitoringJobDefinitionSummary,monitoring_job_definition_summary\nMonitoringJsonDatasetFormat,monitoring_json_dataset_format\nMonitoringNetworkConfig,monitoring_network_config\nMonitoringOutput,monitoring_output\nMonitoringOutputConfig,monitoring_output_config\nMonitoringOutputs,monitoring_outputs\nMonitoringResources,monitoring_resources\nMonitoringRoleArn,monitoring_role_arn\nMonitoringS3Output,monitoring_s3_output\nMonitoringSchedule,monitoring_schedule\nMonitoringScheduleArn,monitoring_schedule_arn\nMonitoringScheduleConfig,monitoring_schedule_config\nMonitoringScheduleName,monitoring_schedule_name\nMonitoringScheduleStatus,monitoring_schedule_status\nMonitoringScheduleSummaries,monitoring_schedule_summaries\nMonitoringScheduleSummary,monitoring_schedule_summary\nMonitoringSchedules,monitoring_schedules\nMonitoringStatisticsResource,monitoring_statistics_resource\nMonitoringStoppingCondition,monitoring_stopping_condition\nMonitoringSubscription,monitoring_subscription\nMonitoringSubscriptionAlreadyExists,monitoring_subscription_already_exists\nMonitoringTimeInMinutes,monitoring_time_in_minutes\nMonitoringType,monitoring_type\nMonitoringTypeEquals,monitoring_type_equals\nMonitors,monitors\nMonotonicValues,monotonic_values\nMonotonicity,monotonicity\nMonth,month\nMonthlyCost,monthly_cost\nMonthlyLeasingPrice,monthly_leasing_price\nMonthlyLimit,monthly_limit\nMonthlySchedule,monthly_schedule\nMonthlySetting,monthly_setting\nMonthlySettings,monthly_settings\nMonthlyTransfer,monthly_transfer\nMoovPlacement,moov_placement\nMostRecent,most_recent\nMotionGraphicsActivateScheduleActionSettings,motion_graphics_activate_schedule_action_settings\nMotionGraphicsConfiguration,motion_graphics_configuration\nMotionGraphicsImageActivateSettings,motion_graphics_image_activate_settings\nMotionGraphicsImageDeactivateSettings,motion_graphics_image_deactivate_settings\nMotionGraphicsInsertion,motion_graphics_insertion\nMotionGraphicsSettings,motion_graphics_settings\nMotionImageInserter,motion_image_inserter\nMotionImageInsertionFramerate,motion_image_insertion_framerate\nMotionImageInsertionOffset,motion_image_insertion_offset\nMountName,mount_name\nMountOptions,mount_options\nMountPath,mount_path\nMountPoint,mount_point\nMountPoints,mount_points\nMountSource,mount_source\nMountTarget,mount_target\nMountTargetConflict,mount_target_conflict\nMountTargetDescription,mount_target_description\nMountTargetId,mount_target_id\nMountTargetNotFound,mount_target_not_found\nMountTargets,mount_targets\nMouthOpen,mouth_open\nMovSettings,mov_settings\nMoveAccountRequest,move_account_request\nMoveAddressToVpcRequest,move_address_to_vpc_request\nMoveAddressToVpcResult,move_address_to_vpc_result\nMoveByoipCidrToIpamRequest,move_byoip_cidr_to_ipam_request\nMoveByoipCidrToIpamResult,move_byoip_cidr_to_ipam_result\nMoveReplicationTaskMessage,move_replication_task_message\nMoveReplicationTaskResponse,move_replication_task_response\nMoveStatus,move_status\nMoveToColdStorageAfterDays,move_to_cold_storage_after_days\nMoveToColdStorageAt,move_to_cold_storage_at\nMoveToVersionId,move_to_version_id\nMoverSize,mover_size\nMovingAddressStatus,moving_address_status\nMovingAddressStatuses,moving_address_statuses\nMp2Settings,mp2_settings\nMp3Settings,mp3_settings\nMp4MajorBrand,mp4_major_brand\nMp4Settings,mp4_settings\nMpdLocation,mpd_location\nMpdManifestBandwidthType,mpd_manifest_bandwidth_type\nMpdProfile,mpd_profile\nMpdSettings,mpd_settings\nMpeg2FilterSettings,mpeg2_filter_settings\nMpeg2FourCCControl,mpeg2_four_cc_control\nMpeg2Settings,mpeg2_settings\nMqttContext,mqtt_context\nMqttHeaders,mqtt_headers\nMrap,mrap\nMsSmoothAdditionalManifest,ms_smooth_additional_manifest\nMsSmoothEncryptionSettings,ms_smooth_encryption_settings\nMsSmoothGroupSettings,ms_smooth_group_settings\nMsSmoothOutputSettings,ms_smooth_output_settings\nMsrcNumber,msrc_number\nMsrcSeverity,msrc_severity\nMssEncryption,mss_encryption\nMssManifest,mss_manifest\nMssManifests,mss_manifests\nMssPackage,mss_package\nMtime,mtime\nMultiAZ,multi_az\nMultiAZCapable,multi_az_capable\nMultiAZEnabled,multi_az_enabled\nMultiAZWithStandbyEnabled,multi_az_with_standby_enabled\nMultiAttachEnabled,multi_attach_enabled\nMultiAz,multi_az\nMultiCondition,multi_condition\nMultiConditionalBranch,multi_conditional_branch\nMultiConditionalSplitActivity,multi_conditional_split_activity\nMultiLayerStorage,multi_layer_storage\nMultiLine,multi_line\nMultiLineStartPattern,multi_line_start_pattern\nMultiMeasureAttributeMapping,multi_measure_attribute_mapping\nMultiMeasureAttributeMappings,multi_measure_attribute_mappings\nMultiMeasureMappings,multi_measure_mappings\nMultiModelConfig,multi_model_config\nMultiPolygonGeometryInput,multi_polygon_geometry_input\nMultiRegion,multi_region\nMultiRegionAccessPointDetails,multi_region_access_point_details\nMultiRegionAccessPointPolicyDocument,multi_region_access_point_policy_document\nMultiRegionAccessPointRegionalResponse,multi_region_access_point_regional_response\nMultiRegionAccessPointReport,multi_region_access_point_report\nMultiRegionAccessPointRoute,multi_region_access_point_route\nMultiRegionAccessPointsAsyncResponse,multi_region_access_points_async_response\nMultiRegionConfiguration,multi_region_configuration\nMultiRegionEnabled,multi_region_enabled\nMultiRegionKey,multi_region_key\nMultiRegionKeyType,multi_region_key_type\nMultiValueAnswer,multi_value_answer\nMulticast,multicast\nMulticastDeviceStatus,multicast_device_status\nMulticastDomainAssociations,multicast_domain_associations\nMulticastFrameInfo,multicast_frame_info\nMulticastGroup,multicast_group\nMulticastGroupByFuotaTask,multicast_group_by_fuota_task\nMulticastGroupId,multicast_group_id\nMulticastGroupList,multicast_group_list\nMulticastGroups,multicast_groups\nMulticastGroupsToAdd,multicast_groups_to_add\nMulticastGroupsToRemove,multicast_groups_to_remove\nMulticastIp,multicast_ip\nMulticastSupport,multicast_support\nMulticastWirelessMetadata,multicast_wireless_metadata\nMultiline,multiline\nMultipartReadSetUploadListItem,multipart_read_set_upload_list_item\nMultipartUpload,multipart_upload\nMultipartUploadId,multipart_upload_id\nMultipleConflictResolutionEntriesException,multiple_conflict_resolution_entries_exception\nMultipleIamArnsProvidedException,multiple_iam_arns_provided_exception\nMultipleOperatingModes,multiple_operating_modes\nMultipleRepositoriesInPullRequestException,multiple_repositories_in_pull_request_exception\nMultipleValuesSetting,multiple_values_setting\nMultiplex,multiplex\nMultiplexGroupSettings,multiplex_group_settings\nMultiplexId,multiplex_id\nMultiplexIds,multiplex_ids\nMultiplexMediaConnectOutputDestinationSettings,multiplex_media_connect_output_destination_settings\nMultiplexOutputDestination,multiplex_output_destination\nMultiplexOutputSettings,multiplex_output_settings\nMultiplexProgram,multiplex_program\nMultiplexProgramChannelDestinationSettings,multiplex_program_channel_destination_settings\nMultiplexProgramPacketIdentifiersMap,multiplex_program_packet_identifiers_map\nMultiplexProgramPipelineDetail,multiplex_program_pipeline_detail\nMultiplexProgramServiceDescriptor,multiplex_program_service_descriptor\nMultiplexProgramSettings,multiplex_program_settings\nMultiplexProgramSummary,multiplex_program_summary\nMultiplexPrograms,multiplex_programs\nMultiplexSettings,multiplex_settings\nMultiplexSettingsSummary,multiplex_settings_summary\nMultiplexStatmuxVideoSettings,multiplex_statmux_video_settings\nMultiplexSummary,multiplex_summary\nMultiplexVideoSettings,multiplex_video_settings\nMultiplexes,multiplexes\nMunicipality,municipality\nMustBeOwnedByCaller,must_be_owned_by_caller\nMustBeRequestable,must_be_requestable\nMustache,mustache\nMutable,mutable\nMutableClusterInfo,mutable_cluster_info\nMutationActionSetStateParameter,mutation_action_set_state_parameter\nMutationProtection,mutation_protection\nMutualAuthentication,mutual_authentication\nMutualTlsAuthentication,mutual_tls_authentication\nMutualTlsAuthenticationInput,mutual_tls_authentication_input\nMutuallyExclusiveParameters,mutually_exclusive_parameters\nMuxType,mux_type\nMxfSettings,mxf_settings\nMxfXavcProfileSettings,mxf_xavc_profile_settings\nMySQLCatalogSource,my_sql_catalog_source\nMySQLCatalogTarget,my_sql_catalog_target\nMySQLSettings,my_sql_settings\nMySqlDataProviderSettings,my_sql_data_provider_settings\nMySqlParameters,my_sql_parameters\nN,n\nNE,ne\nNFS,nfs\nNFSDataRepositoryConfiguration,nfs_data_repository_configuration\nNFSFileShareDefaults,nfs_file_share_defaults\nNFSFileShareInfo,nfs_file_share_info\nNFSFileShareInfoList,nfs_file_share_info_list\nNFSOnDeviceService,nfs_on_device_service\nNFSOnDeviceServiceConfiguration,nfs_on_device_service_configuration\nNLBResource,nlb_resource\nNS,ns\nName,name\nNameAlreadyExistsException,name_already_exists_exception\nNameAssigner,name_assigner\nNameAvailabilityException,name_availability_exception\nNameContains,name_contains\nNameFilter,name_filter\nNameInUseException,name_in_use_exception\nNameLengthExceededException,name_length_exceeded_exception\nNameModifier,name_modifier\nNameNodes,name_nodes\nNamePrefix,name_prefix\nNamePrefixUpdate,name_prefix_update\nNameQualifier,name_qualifier\nNameServers,name_servers\nNameServersUpdateState,name_servers_update_state\nNameStartsWith,name_starts_with\nNameTag,name_tag\nNameUpdate,name_update\nNameValuePair,name_value_pair\nNamedEntities,named_entities\nNamedEntityDefinition,named_entity_definition\nNamedEntityDefinitionMetric,named_entity_definition_metric\nNamedQueries,named_queries\nNamedQuery,named_query\nNamedQueryId,named_query_id\nNamedQueryIds,named_query_ids\nNames,names\nNameserver,nameserver\nNameservers,nameservers\nNamespace,namespace\nNamespaceAlreadyExists,namespace_already_exists\nNamespaceError,namespace_error\nNamespaceFilter,namespace_filter\nNamespaceId,namespace_id\nNamespaceInfoV2,namespace_info_v2\nNamespaceName,namespace_name\nNamespaceNotFound,namespace_not_found\nNamespaceNotFoundException,namespace_not_found_exception\nNamespacePid,namespace_pid\nNamespaceProperties,namespace_properties\nNamespaceSummary,namespace_summary\nNamespaceType,namespace_type\nNamespaces,namespaces\nNarrative,narrative\nNatGateway,nat_gateway\nNatGatewayAddress,nat_gateway_address\nNatGatewayAddresses,nat_gateway_addresses\nNatGatewayId,nat_gateway_id\nNatGatewayIds,nat_gateway_ids\nNatGateways,nat_gateways\nNativeClientId,native_client_id\nNavigationOperation,navigation_operation\nNcharCharacterSetName,nchar_character_set_name\nNearestModelName,nearest_model_name\nNegate,negate\nNegated,negated\nNegative,negative\nNegativeColor,negative_color\nNegativeFormat,negative_format\nNegativeValueConfiguration,negative_value_configuration\nNeighborConnectionDetail,neighbor_connection_detail\nNeighborhood,neighborhood\nNeoVpcConfig,neo_vpc_config\nNeptuneSettings,neptune_settings\nNeq,neq\nNestedFilters,nested_filters\nNestedPropertyName,nested_property_name\nNestingLevel,nesting_level\nNetAppONTAPCluster,net_app_ontap_cluster\nNetAppONTAPClusters,net_app_ontap_clusters\nNetAppONTAPSVM,net_app_ontapsvm\nNetAppONTAPSVMs,net_app_ontapsvms\nNetAppONTAPVolume,net_app_ontap_volume\nNetAppONTAPVolumes,net_app_ontap_volumes\nNetBiosName,net_bios_name\nNetIdFilters,net_id_filters\nNetRISavings,net_ri_savings\nNetSavings,net_savings\nNetmaskLength,netmask_length\nNetwork,network\nNetworkACLEntry,network_acl_entry\nNetworkAccessConfiguration,network_access_configuration\nNetworkAcl,network_acl\nNetworkAclAssociation,network_acl_association\nNetworkAclAssociationId,network_acl_association_id\nNetworkAclEntry,network_acl_entry\nNetworkAclId,network_acl_id\nNetworkAclIds,network_acl_ids\nNetworkAcls,network_acls\nNetworkAnalyzerConfigurationList,network_analyzer_configuration_list\nNetworkAnalyzerConfigurations,network_analyzer_configurations\nNetworkArtifactMeta,network_artifact_meta\nNetworkBandwidthGbps,network_bandwidth_gbps\nNetworkBandwidthGbpsRequest,network_bandwidth_gbps_request\nNetworkBinding,network_binding\nNetworkBorderGroup,network_border_group\nNetworkCardIndex,network_card_index\nNetworkCardInfo,network_card_info\nNetworkCards,network_cards\nNetworkConfig,network_config\nNetworkConfiguration,network_configuration\nNetworkConnectionAction,network_connection_action\nNetworkDestinationDomain,network_destination_domain\nNetworkDestinationIpV4,network_destination_ipv4\nNetworkDestinationIpV6,network_destination_ipv6\nNetworkDestinationPort,network_destination_port\nNetworkDirection,network_direction\nNetworkEndBlackout,network_end_blackout\nNetworkEndBlackoutImage,network_end_blackout_image\nNetworkEthereumAttributes,network_ethereum_attributes\nNetworkEventType,network_event_type\nNetworkFabricAttributes,network_fabric_attributes\nNetworkFabricConfiguration,network_fabric_configuration\nNetworkFabricType,network_fabric_type\nNetworkFailureException,network_failure_exception\nNetworkFirewallBlackHoleRouteDetectedViolation,network_firewall_black_hole_route_detected_violation\nNetworkFirewallInternetTrafficNotInspectedViolation,network_firewall_internet_traffic_not_inspected_violation\nNetworkFirewallInvalidRouteConfigurationViolation,network_firewall_invalid_route_configuration_violation\nNetworkFirewallMissingExpectedRTViolation,network_firewall_missing_expected_rt_violation\nNetworkFirewallMissingExpectedRoutesViolation,network_firewall_missing_expected_routes_violation\nNetworkFirewallMissingFirewallViolation,network_firewall_missing_firewall_violation\nNetworkFirewallMissingSubnetViolation,network_firewall_missing_subnet_violation\nNetworkFirewallPolicy,network_firewall_policy\nNetworkFirewallPolicyDescription,network_firewall_policy_description\nNetworkFirewallPolicyModifiedViolation,network_firewall_policy_modified_violation\nNetworkFirewallStatefulRuleGroupOverride,network_firewall_stateful_rule_group_override\nNetworkFirewallUnexpectedFirewallRoutesViolation,network_firewall_unexpected_firewall_routes_violation\nNetworkFirewallUnexpectedGatewayRoutesViolation,network_firewall_unexpected_gateway_routes_violation\nNetworkFrameworkAttributes,network_framework_attributes\nNetworkFrameworkConfiguration,network_framework_configuration\nNetworkHeader,network_header\nNetworkId,network_id\nNetworkImpairment,network_impairment\nNetworkInBytesPerSecond,network_in_bytes_per_second\nNetworkInfo,network_info\nNetworkInputSettings,network_input_settings\nNetworkInsightsAccessScope,network_insights_access_scope\nNetworkInsightsAccessScopeAnalyses,network_insights_access_scope_analyses\nNetworkInsightsAccessScopeAnalysis,network_insights_access_scope_analysis\nNetworkInsightsAccessScopeAnalysisArn,network_insights_access_scope_analysis_arn\nNetworkInsightsAccessScopeAnalysisId,network_insights_access_scope_analysis_id\nNetworkInsightsAccessScopeAnalysisIds,network_insights_access_scope_analysis_ids\nNetworkInsightsAccessScopeArn,network_insights_access_scope_arn\nNetworkInsightsAccessScopeContent,network_insights_access_scope_content\nNetworkInsightsAccessScopeId,network_insights_access_scope_id\nNetworkInsightsAccessScopeIds,network_insights_access_scope_ids\nNetworkInsightsAccessScopes,network_insights_access_scopes\nNetworkInsightsAnalyses,network_insights_analyses\nNetworkInsightsAnalysis,network_insights_analysis\nNetworkInsightsAnalysisArn,network_insights_analysis_arn\nNetworkInsightsAnalysisId,network_insights_analysis_id\nNetworkInsightsAnalysisIds,network_insights_analysis_ids\nNetworkInsightsPath,network_insights_path\nNetworkInsightsPathArn,network_insights_path_arn\nNetworkInsightsPathId,network_insights_path_id\nNetworkInsightsPathIds,network_insights_path_ids\nNetworkInsightsPaths,network_insights_paths\nNetworkInterface,network_interface\nNetworkInterfaceAssociation,network_interface_association\nNetworkInterfaceAttachment,network_interface_attachment\nNetworkInterfaceAttachmentChanges,network_interface_attachment_changes\nNetworkInterfaceCount,network_interface_count\nNetworkInterfaceCountRequest,network_interface_count_request\nNetworkInterfaceDeviceIndex,network_interface_device_index\nNetworkInterfaceId,network_interface_id\nNetworkInterfaceIds,network_interface_ids\nNetworkInterfaceIpv6Address,network_interface_ipv6_address\nNetworkInterfaceLimitExceeded,network_interface_limit_exceeded\nNetworkInterfaceOptions,network_interface_options\nNetworkInterfaceOwnerId,network_interface_owner_id\nNetworkInterfacePermission,network_interface_permission\nNetworkInterfacePermissionId,network_interface_permission_id\nNetworkInterfacePermissionIds,network_interface_permission_ids\nNetworkInterfacePermissionState,network_interface_permission_state\nNetworkInterfacePermissions,network_interface_permissions\nNetworkInterfacePort,network_interface_port\nNetworkInterfacePrivateIpAddress,network_interface_private_ip_address\nNetworkInterfaceSet,network_interface_set\nNetworkInterfaceType,network_interface_type\nNetworkInterfaces,network_interfaces\nNetworkLoadBalancerArn,network_load_balancer_arn\nNetworkLoadBalancerArns,network_load_balancer_arns\nNetworkMode,network_mode\nNetworkName,network_name\nNetworkOrigin,network_origin\nNetworkOutBytesPerSecond,network_out_bytes_per_second\nNetworkOutput,network_output\nNetworkPacketsInPerSecond,network_packets_in_per_second\nNetworkPacketsOutPerSecond,network_packets_out_per_second\nNetworkPath,network_path\nNetworkPathComponent,network_path_component\nNetworkPathComponentDetails,network_path_component_details\nNetworkPathFound,network_path_found\nNetworkPayload,network_payload\nNetworkPerformance,network_performance\nNetworkPlatform,network_platform\nNetworkPolicyCount,network_policy_count\nNetworkProfile,network_profile\nNetworkProfileArn,network_profile_arn\nNetworkProfileData,network_profile_data\nNetworkProfileInfo,network_profile_info\nNetworkProfileName,network_profile_name\nNetworkProfiles,network_profiles\nNetworkProtocol,network_protocol\nNetworkReachabilityDetails,network_reachability_details\nNetworkResource,network_resource\nNetworkResourceCount,network_resource_count\nNetworkResourceCounts,network_resource_counts\nNetworkResourceDefinition,network_resource_definition\nNetworkResourceSummary,network_resource_summary\nNetworkResourceUtilization,network_resource_utilization\nNetworkResources,network_resources\nNetworkRoute,network_route\nNetworkRouteDestination,network_route_destination\nNetworkRoutes,network_routes\nNetworkServices,network_services\nNetworkSettings,network_settings\nNetworkSettingsSummary,network_settings_summary\nNetworkSite,network_site\nNetworkSource,network_source\nNetworkSourceDomain,network_source_domain\nNetworkSourceIpV4,network_source_ipv4\nNetworkSourceIpV6,network_source_ipv6\nNetworkSourceMac,network_source_mac\nNetworkSourcePort,network_source_port\nNetworkStatus,network_status\nNetworkSummary,network_summary\nNetworkTelemetry,network_telemetry\nNetworkType,network_type\nNetworkTypeNotSupported,network_type_not_supported\nNetworkingConfiguration,networking_configuration\nNetworks,networks\nNeutral,neutral\nNeverAggregateInFilter,never_aggregate_in_filter\nNeverExpires,never_expires\nNewAction,new_action\nNewAssertionRule,new_assertion_rule\nNewAssociationId,new_association_id\nNewAvailabilityZones,new_availability_zones\nNewBGPPeer,new_bgp_peer\nNewBudget,new_budget\nNewClusterIdentifier,new_cluster_identifier\nNewColumnName,new_column_name\nNewColumnType,new_column_type\nNewComponentName,new_component_name\nNewContactIds,new_contact_ids\nNewCustomKeyStoreName,new_custom_key_store_name\nNewCustomVocabularyItem,new_custom_vocabulary_item\nNewDBClusterIdentifier,new_db_cluster_identifier\nNewDBInstanceIdentifier,new_db_instance_identifier\nNewDBProxyEndpointName,new_db_proxy_endpoint_name\nNewDBProxyName,new_db_proxy_name\nNewDefaultValues,new_default_values\nNewDeviceMetadata,new_device_metadata\nNewDeviceMetadataType,new_device_metadata_type\nNewDhcpConfiguration,new_dhcp_configuration\nNewGameSessionProtectionPolicy,new_game_session_protection_policy\nNewGameSessionsPerCreator,new_game_sessions_per_creator\nNewGatingRule,new_gating_rule\nNewGlobalClusterIdentifier,new_global_cluster_identifier\nNewGroupName,new_group_name\nNewImage,new_image\nNewInThisVersionBulletPoints,new_in_this_version_bullet_points\nNewInstancesProtectedFromScaleIn,new_instances_protected_from_scale_in\nNewLaunchProfileMember,new_launch_profile_member\nNewMembers,new_members\nNewName,new_name\nNewNotification,new_notification\nNewObjectMetadata,new_object_metadata\nNewObjectTagging,new_object_tagging\nNewParameterName,new_parameter_name\nNewPassword,new_password\nNewPath,new_path\nNewPrivateVirtualInterface,new_private_virtual_interface\nNewPrivateVirtualInterfaceAllocation,new_private_virtual_interface_allocation\nNewPublicVirtualInterface,new_public_virtual_interface\nNewPublicVirtualInterfaceAllocation,new_public_virtual_interface_allocation\nNewReplicaCount,new_replica_count\nNewReplicationFactor,new_replication_factor\nNewServerCertificateName,new_server_certificate_name\nNewStartingHashKey,new_starting_hash_key\nNewStudioMember,new_studio_member\nNewSubscriber,new_subscriber\nNewSupportedProducts,new_supported_products\nNewTableName,new_table_name\nNewTransitVirtualInterface,new_transit_virtual_interface\nNewTransitVirtualInterfaceAllocation,new_transit_virtual_interface_allocation\nNewUserName,new_user_name\nNewValue,new_value\nNewValues,new_values\nNewVersion,new_version\nNewerNoncurrentVersions,newer_noncurrent_versions\nNexGuardFileMarkerSettings,nex_guard_file_marker_settings\nNexguardFileMarkerSettings,nexguard_file_marker_settings\nNextActivity,next_activity\nNextContinentCode,next_continent_code\nNextContinuationToken,next_continuation_token\nNextCountryCode,next_country_code\nNextDNSName,next_dns_name\nNextExecutionTime,next_execution_time\nNextHostedZoneId,next_hosted_zone_id\nNextInvocationTime,next_invocation_time\nNextInvocations,next_invocations\nNextKeyMarker,next_key_marker\nNextLockToken,next_lock_token\nNextMaintenanceWindowStartTime,next_maintenance_window_start_time\nNextMarker,next_marker\nNextPageMarker,next_page_marker\nNextPageToken,next_page_token\nNextPartNumberMarker,next_part_number_marker\nNextPassword,next_password\nNextPollConfigurationToken,next_poll_configuration_token\nNextPollIntervalInSeconds,next_poll_interval_in_seconds\nNextRecordIdentifier,next_record_identifier\nNextRecordName,next_record_name\nNextRecordType,next_record_type\nNextRefreshTime,next_refresh_time\nNextRotationDate,next_rotation_date\nNextScheduledRetrainingStartDate,next_scheduled_retraining_start_date\nNextSchemaVersion,next_schema_version\nNextShardIterator,next_shard_iterator\nNextSigningKeyLength,next_signing_key_length\nNextSlotStartTime,next_slot_start_time\nNextStatus,next_status\nNextStep,next_step\nNextSubdivisionCode,next_subdivision_code\nNextToken,next_token\nNextTransitionTime,next_transition_time\nNextUpdateAvailabilityDate,next_update_availability_date\nNextUpdateAvailabilityTime,next_update_availability_time\nNextUpdateSeconds,next_update_seconds\nNextUploadIdMarker,next_upload_id_marker\nNextVersionIdMarker,next_version_id_marker\nNextWebACLLockToken,next_web_acl_lock_token\nNfs,nfs\nNfsExported,nfs_exported\nNfsExportedVolumes,nfs_exported_volumes\nNfsExports,nfs_exports\nNfsMountOptions,nfs_mount_options\nNice,nice\nNickName,nick_name\nNielsenCBET,nielsen_cbet\nNielsenCbetSettings,nielsen_cbet_settings\nNielsenConfiguration,nielsen_configuration\nNielsenDistributionType,nielsen_distribution_type\nNielsenId3,nielsen_id3\nNielsenId3Behavior,nielsen_id3_behavior\nNielsenNaesIiNw,nielsen_naes_ii_nw\nNielsenNaesIiNwSettings,nielsen_naes_ii_nw_settings\nNielsenNonLinearWatermark,nielsen_non_linear_watermark\nNielsenNonLinearWatermarkSettings,nielsen_non_linear_watermark_settings\nNielsenPcmToId3Tagging,nielsen_pcm_to_id3_tagging\nNielsenWatermarksSettings,nielsen_watermarks_settings\nNitInterval,nit_interval\nNitroEnclavesSupport,nitro_enclaves_support\nNitroTpmInfo,nitro_tpm_info\nNitroTpmSupport,nitro_tpm_support\nNlbArn,nlb_arn\nNlbName,nlb_name\nNoActionEmail,no_action_email\nNoAssociatedRoleException,no_associated_role_exception\nNoAvailableCertificateException,no_available_certificate_exception\nNoAvailableConfigurationRecorderException,no_available_configuration_recorder_exception\nNoAvailableDeliveryChannelException,no_available_delivery_channel_exception\nNoAvailableOrganizationException,no_available_organization_exception\nNoChangeException,no_change_exception\nNoConnectorsAvailableException,no_connectors_available_exception\nNoData,no_data\nNoDataRetentionException,no_data_retention_exception\nNoDatabaseMigrationPreference,no_database_migration_preference\nNoDevice,no_device\nNoEcho,no_echo\nNoEncryptionConfig,no_encryption_config\nNoEntitlementsAllowedException,no_entitlements_allowed_exception\nNoExpiry,no_expiry\nNoFreeAddressesInSubnet,no_free_addresses_in_subnet\nNoHexPrefix,no_hex_prefix\nNoManagementAccountSLRExistsException,no_management_account_slr_exists_exception\nNoManagementPreference,no_management_preference\nNoOperationFault,no_operation_fault\nNoPasswordRequired,no_password_required\nNoReboot,no_reboot\nNoRegionalBlackoutFlag,no_regional_blackout_flag\nNoRestrictions,no_restrictions\nNoRunningConfigurationRecorderException,no_running_configuration_recorder_exception\nNoScheduleException,no_schedule_exception\nNoSecurityExtension,no_security_extension\nNoSquashNids,no_squash_nids\nNoSuchBucketException,no_such_bucket_exception\nNoSuchCachePolicy,no_such_cache_policy\nNoSuchChange,no_such_change\nNoSuchCidrCollectionException,no_such_cidr_collection_exception\nNoSuchCidrLocationException,no_such_cidr_location_exception\nNoSuchCloudFrontOriginAccessIdentity,no_such_cloud_front_origin_access_identity\nNoSuchCloudWatchLogsLogGroup,no_such_cloud_watch_logs_log_group\nNoSuchConfigRuleException,no_such_config_rule_exception\nNoSuchConfigRuleInConformancePackException,no_such_config_rule_in_conformance_pack_exception\nNoSuchConfigurationAggregatorException,no_such_configuration_aggregator_exception\nNoSuchConfigurationRecorderException,no_such_configuration_recorder_exception\nNoSuchConformancePackException,no_such_conformance_pack_exception\nNoSuchContinuousDeploymentPolicy,no_such_continuous_deployment_policy\nNoSuchDelegationSet,no_such_delegation_set\nNoSuchDeliveryChannelException,no_such_delivery_channel_exception\nNoSuchDistribution,no_such_distribution\nNoSuchEntityException,no_such_entity_exception\nNoSuchFieldLevelEncryptionConfig,no_such_field_level_encryption_config\nNoSuchFieldLevelEncryptionProfile,no_such_field_level_encryption_profile\nNoSuchFunctionExists,no_such_function_exists\nNoSuchGeoLocation,no_such_geo_location\nNoSuchHealthCheck,no_such_health_check\nNoSuchHostedZone,no_such_hosted_zone\nNoSuchInvalidation,no_such_invalidation\nNoSuchKeySigningKey,no_such_key_signing_key\nNoSuchMonitoringSubscription,no_such_monitoring_subscription\nNoSuchOrganizationConfigRuleException,no_such_organization_config_rule_exception\nNoSuchOrganizationConformancePackException,no_such_organization_conformance_pack_exception\nNoSuchOrigin,no_such_origin\nNoSuchOriginAccessControl,no_such_origin_access_control\nNoSuchOriginRequestPolicy,no_such_origin_request_policy\nNoSuchPublicAccessBlockConfiguration,no_such_public_access_block_configuration\nNoSuchPublicKey,no_such_public_key\nNoSuchQueryLoggingConfig,no_such_query_logging_config\nNoSuchRealtimeLogConfig,no_such_realtime_log_config\nNoSuchRemediationConfigurationException,no_such_remediation_configuration_exception\nNoSuchRemediationExceptionException,no_such_remediation_exception_exception\nNoSuchResource,no_such_resource\nNoSuchResourceException,no_such_resource_exception\nNoSuchResponseHeadersPolicy,no_such_response_headers_policy\nNoSuchRetentionConfigurationException,no_such_retention_configuration_exception\nNoSuchStreamingDistribution,no_such_streaming_distribution\nNoSuchTrafficPolicy,no_such_traffic_policy\nNoSuchTrafficPolicyInstance,no_such_traffic_policy_instance\nNoUpdateAvailableException,no_update_available_exception\nNoVoteCount,no_vote_count\nNode,node\nNodeARN,node_arn\nNodeAssociationStatus,node_association_status\nNodeAssociationStatusToken,node_association_status_token\nNodeConfiguration,node_configuration\nNodeConfigurationOption,node_configuration_option\nNodeConfigurationOptionList,node_configuration_option_list\nNodeConfigurationOptionsFilter,node_configuration_options_filter\nNodeConfigurationOptionsMessage,node_configuration_options_message\nNodeCount,node_count\nNodeCounts,node_counts\nNodeCreateTime,node_create_time\nNodeDeletionDate,node_deletion_date\nNodeDescription,node_description\nNodeDetails,node_details\nNodeEthereumAttributes,node_ethereum_attributes\nNodeExporter,node_exporter\nNodeExporterInfo,node_exporter_info\nNodeFabricAttributes,node_fabric_attributes\nNodeFabricLogPublishingConfiguration,node_fabric_log_publishing_configuration\nNodeFrameworkAttributes,node_framework_attributes\nNodeFromTemplateJob,node_from_template_job\nNodeFromTemplateJobs,node_from_template_jobs\nNodeGroup,node_group\nNodeGroupConfiguration,node_group_configuration\nNodeGroupCount,node_group_count\nNodeGroupId,node_group_id\nNodeGroupMember,node_group_member\nNodeGroupMemberUpdateStatus,node_group_member_update_status\nNodeGroupMembers,node_group_members\nNodeGroupNotFoundFault,node_group_not_found_fault\nNodeGroupUpdateStatus,node_group_update_status\nNodeGroups,node_groups\nNodeGroupsPerReplicationGroupQuotaExceededFault,node_groups_per_replication_group_quota_exceeded_fault\nNodeGroupsToRemove,node_groups_to_remove\nNodeGroupsToRetain,node_groups_to_retain\nNodeId,node_id\nNodeIds,node_ids\nNodeIdsToReboot,node_ids_to_reboot\nNodeIdsToRemove,node_ids_to_remove\nNodeInfo,node_info\nNodeInfoList,node_info_list\nNodeInputPort,node_input_port\nNodeInstance,node_instance\nNodeInstanceId,node_instance_id\nNodeInstances,node_instances\nNodeInterface,node_interface\nNodeLogPublishingConfiguration,node_log_publishing_configuration\nNodeName,node_name\nNodeNotFoundFault,node_not_found_fault\nNodeOutputPort,node_output_port\nNodeOverrides,node_overrides\nNodeProperties,node_properties\nNodePropertiesSummary,node_properties_summary\nNodePropertyOverride,node_property_override\nNodeQuotaForClusterExceededFault,node_quota_for_cluster_exceeded_fault\nNodeQuotaForCustomerExceededFault,node_quota_for_customer_exceeded_fault\nNodeRangeProperty,node_range_property\nNodeRole,node_role\nNodeSignal,node_signal\nNodeSignals,node_signals\nNodeSnapshot,node_snapshot\nNodeSnapshots,node_snapshots\nNodeStatus,node_status\nNodeStructure,node_structure\nNodeSummary,node_summary\nNodeToNodeEncryptionOptions,node_to_node_encryption_options\nNodeToNodeEncryptionOptionsStatus,node_to_node_encryption_options_status\nNodeType,node_type\nNodeTypeSpecificValue,node_type_specific_value\nNodeTypeSpecificValues,node_type_specific_values\nNodeUpdateEndDate,node_update_end_date\nNodeUpdateInitiatedBy,node_update_initiated_by\nNodeUpdateInitiatedDate,node_update_initiated_date\nNodeUpdateStartDate,node_update_start_date\nNodeUpdateStatus,node_update_status\nNodeUpdateStatusModifiedDate,node_update_status_modified_date\nNodegroup,nodegroup\nNodegroupHealth,nodegroup_health\nNodegroupResources,nodegroup_resources\nNodegroupScalingConfig,nodegroup_scaling_config\nNodegroupUpdateConfig,nodegroup_update_config\nNodes,nodes\nNodesUpdated,nodes_updated\nNoiseReducer,noise_reducer\nNoiseReducerFilterSettings,noise_reducer_filter_settings\nNoiseReducerSpatialFilterSettings,noise_reducer_spatial_filter_settings\nNoiseReducerTemporalFilterSettings,noise_reducer_temporal_filter_settings\nNonAdditive,non_additive\nNonAwsRegions,non_aws_regions\nNonCompliantConformancePackCount,non_compliant_conformance_pack_count\nNonCompliantCount,non_compliant_count\nNonCompliantCriticalCount,non_compliant_critical_count\nNonCompliantHighCount,non_compliant_high_count\nNonCompliantInformationalCount,non_compliant_informational_count\nNonCompliantLowCount,non_compliant_low_count\nNonCompliantMediumCount,non_compliant_medium_count\nNonCompliantResource,non_compliant_resource\nNonCompliantResourceCount,non_compliant_resource_count\nNonCompliantResources,non_compliant_resources\nNonCompliantRuleCount,non_compliant_rule_count\nNonCompliantSummary,non_compliant_summary\nNonCompliantUnspecifiedCount,non_compliant_unspecified_count\nNonDeletedNetworkInterfaceIds,non_deleted_network_interface_ids\nNonKeyAttributes,non_key_attributes\nNonOverridableArguments,non_overridable_arguments\nNonRepudiation,non_repudiation\nNonRetryableError,non_retryable_error\nNonTalkTimeFilter,non_talk_time_filter\nNonce,nonce\nNoncompliantKeys,noncompliant_keys\nNoncurrentDays,noncurrent_days\nNoncurrentVersionExpiration,noncurrent_version_expiration\nNoncurrentVersionExpirationInDays,noncurrent_version_expiration_in_days\nNoncurrentVersionTransition,noncurrent_version_transition\nNoncurrentVersionTransitions,noncurrent_version_transitions\nNone,none\nNormal,normal\nNormalized,normalized\nNormalizedInstanceHours,normalized_instance_hours\nNormalizedValue,normalized_value\nNorth,north\nNot,not\nNotAcceptableException,not_acceptable_exception\nNotActions,not_actions\nNotAfter,not_after\nNotAfterDate,not_after_date\nNotAllowedAggregations,not_allowed_aggregations\nNotApplicable,not_applicable\nNotApplicableCount,not_applicable_count\nNotApplicableEnabled,not_applicable_enabled\nNotAuthorizedException,not_authorized_exception\nNotBefore,not_before\nNotBeforeDate,not_before_date\nNotBeforeDeadline,not_before_deadline\nNotConfiguredException,not_configured_exception\nNotDeviceModels,not_device_models\nNotDeviceOperatingSystems,not_device_operating_systems\nNotDeviceTypes,not_device_types\nNotDeviceUserAgents,not_device_user_agents\nNotEligibleException,not_eligible_exception\nNotEndsWith,not_ends_with\nNotEquals,not_equals\nNotFilter,not_filter\nNotFoundException,not_found_exception\nNotImpersonationRoleIds,not_impersonation_role_ids\nNotIndexException,not_index_exception\nNotIpRanges,not_ip_ranges\nNotLatestPipelineExecutionException,not_latest_pipeline_execution_exception\nNotNodeException,not_node_exception\nNotOrganizationManagementAccountException,not_organization_management_account_exception\nNotOrganizationMasterAccountException,not_organization_master_account_exception\nNotPolicyException,not_policy_exception\nNotReadableInputStreamException,not_readable_input_stream_exception\nNotResources,not_resources\nNotScaledReason,not_scaled_reason\nNotScaledReasons,not_scaled_reasons\nNotServiceResourceError,not_service_resource_error\nNotStabilizedException,not_stabilized_exception\nNotStartsWith,not_starts_with\nNotStatement,not_statement\nNotSupportedOperationException,not_supported_operation_exception\nNotTargetUsers,not_target_users\nNotUpdatableException,not_updatable_exception\nNotUserIds,not_user_ids\nNote,note\nNoteText,note_text\nNoteUpdate,note_update\nNoteUpdatedAt,note_updated_at\nNoteUpdatedBy,note_updated_by\nNotebookExecution,notebook_execution\nNotebookExecutionId,notebook_execution_id\nNotebookExecutionName,notebook_execution_name\nNotebookExecutionSummary,notebook_execution_summary\nNotebookExecutions,notebook_executions\nNotebookId,notebook_id\nNotebookInstanceArn,notebook_instance_arn\nNotebookInstanceLifecycleConfigArn,notebook_instance_lifecycle_config_arn\nNotebookInstanceLifecycleConfigName,notebook_instance_lifecycle_config_name\nNotebookInstanceLifecycleConfigNameContains,notebook_instance_lifecycle_config_name_contains\nNotebookInstanceLifecycleConfigSummary,notebook_instance_lifecycle_config_summary\nNotebookInstanceLifecycleConfigs,notebook_instance_lifecycle_configs\nNotebookInstanceLifecycleHook,notebook_instance_lifecycle_hook\nNotebookInstanceName,notebook_instance_name\nNotebookInstanceSecurityGroupId,notebook_instance_security_group_id\nNotebookInstanceStatus,notebook_instance_status\nNotebookInstanceSummary,notebook_instance_summary\nNotebookInstances,notebook_instances\nNotebookMetadata,notebook_metadata\nNotebookMetadataList,notebook_metadata_list\nNotebookOutputOption,notebook_output_option\nNotebookParams,notebook_params\nNotebookS3Location,notebook_s3_location\nNotebookS3LocationForOutput,notebook_s3_location_for_output\nNotebookS3LocationFromInput,notebook_s3_location_from_input\nNotebookSessionSummary,notebook_session_summary\nNotebookSessionsList,notebook_sessions_list\nNotebookUrl,notebook_url\nNotebookVersion,notebook_version\nNotes,notes\nNotification,notification\nNotificationARNs,notification_arns\nNotificationAction,notification_action\nNotificationArn,notification_arn\nNotificationArns,notification_arns\nNotificationAttributes,notification_attributes\nNotificationChannel,notification_channel\nNotificationChannelConfig,notification_channel_config\nNotificationConfig,notification_config\nNotificationConfiguration,notification_configuration\nNotificationConfigurationFilter,notification_configuration_filter\nNotificationConfigurations,notification_configurations\nNotificationContext,notification_context\nNotificationDestinationConfig,notification_destination_config\nNotificationEmail,notification_email\nNotificationEvents,notification_events\nNotificationFilterConfig,notification_filter_config\nNotificationId,notification_id\nNotificationMetadata,notification_metadata\nNotificationOptions,notification_options\nNotificationPolicy,notification_policy\nNotificationProperty,notification_property\nNotificationRecipientType,notification_recipient_type\nNotificationRuleSummary,notification_rule_summary\nNotificationRules,notification_rules\nNotificationSetting,notification_setting\nNotificationSettingDetail,notification_setting_detail\nNotificationSettingKey,notification_setting_key\nNotificationSpecification,notification_specification\nNotificationState,notification_state\nNotificationSummaries,notification_summaries\nNotificationSummary,notification_summary\nNotificationTarget,notification_target\nNotificationTargetARN,notification_target_arn\nNotificationTargetActions,notification_target_actions\nNotificationTopicArn,notification_topic_arn\nNotificationTopicStatus,notification_topic_status\nNotificationType,notification_type\nNotificationTypes,notification_types\nNotificationWithSubscribers,notification_with_subscribers\nNotifications,notifications\nNotificationsConfiguration,notifications_configuration\nNotificationsEnabled,notifications_enabled\nNotificationsWithSubscribers,notifications_with_subscribers\nNotify,notify\nNotifyAll,notify_all\nNotifyAppValidationOutputRequest,notify_app_validation_output_request\nNotifyApplicationStateRequest,notify_application_state_request\nNotifyCollaborators,notify_collaborators\nNotifyConfiguration,notify_configuration\nNotifyConfigurationType,notify_configuration_type\nNotifyDelayAfter,notify_delay_after\nNotifyEmailType,notify_email_type\nNotifyMigrationTaskStateRequest,notify_migration_task_state_request\nNotifyObjectCompleteInput,notify_object_complete_input\nNotifyObjectCompleteOutput,notify_object_complete_output\nNotifyProvisionProductEngineWorkflowResultInput,notify_provision_product_engine_workflow_result_input\nNotifyRecommendationsReceivedError,notify_recommendations_received_error\nNotifyRecommendationsReceivedRequest,notify_recommendations_received_request\nNotifyRecommendationsReceivedResponse,notify_recommendations_received_response\nNotifyResourceDeploymentStatusChangeInput,notify_resource_deployment_status_change_input\nNotifyTerminateProvisionedProductEngineWorkflowResultInput,notify_terminate_provisioned_product_engine_workflow_result_input\nNotifyUpdateProvisionedProductEngineWorkflowResultInput,notify_update_provisioned_product_engine_workflow_result_input\nNotifyWhenUploadedInput,notify_when_uploaded_input\nNotifyWhenUploadedOutput,notify_when_uploaded_output\nNotifyWorkersFailureCode,notify_workers_failure_code\nNotifyWorkersFailureMessage,notify_workers_failure_message\nNotifyWorkersFailureStatus,notify_workers_failure_status\nNotifyWorkersFailureStatuses,notify_workers_failure_statuses\nNotifyWorkersRequest,notify_workers_request\nNotifyWorkersResponse,notify_workers_response\nNrCapable,nr_capable\nNtp,ntp\nNtpPayload,ntp_payload\nNtpServerName,ntp_server_name\nNtpServers,ntp_servers\nNtpStatus,ntp_status\nNullCheckBoxList,null_check_box_list\nNullOption,null_option\nNullPacketBitrate,null_packet_bitrate\nNullString,null_string\nNullTextList,null_text_list\nNullValue,null_value\nNullValueColor,null_value_color\nNullValueField,null_value_field\nNullValueFormatConfiguration,null_value_format_configuration\nNullable,nullable\nNumCacheClusters,num_cache_clusters\nNumCacheNodes,num_cache_nodes\nNumFalseNegatives,num_false_negatives\nNumFalsePositives,num_false_positives\nNumItemsEvaluated,num_items_evaluated\nNumNodeGroups,num_node_groups\nNumPartitions,num_partitions\nNumRecords,num_records\nNumRefFrames,num_ref_frames\nNumReplicasPerShard,num_replicas_per_shard\nNumResults,num_results\nNumRetries,num_retries\nNumShards,num_shards\nNumTapesToCreate,num_tapes_to_create\nNumTimeSeries,num_time_series\nNumTrueNegatives,num_true_negatives\nNumTruePositives,num_true_positives\nNumber,number\nNumberAttributeConstraints,number_attribute_constraints\nNumberAttributeConstraintsType,number_attribute_constraints_type\nNumberBFramesBetweenReferenceFrames,number_b_frames_between_reference_frames\nNumberCapabilities,number_capabilities\nNumberDatatypeScale,number_datatype_scale\nNumberDisplayFormatConfiguration,number_display_format_configuration\nNumberFilter,number_filter\nNumberFormatConfiguration,number_format_configuration\nNumberOfAdditionalAssignments,number_of_additional_assignments\nNumberOfArchives,number_of_archives\nNumberOfAssignmentsAvailable,number_of_assignments_available\nNumberOfAssignmentsCompleted,number_of_assignments_completed\nNumberOfAssignmentsPending,number_of_assignments_pending\nNumberOfAssociatedQueues,number_of_associated_queues\nNumberOfAssociatedUsers,number_of_associated_users\nNumberOfAssociations,number_of_associations\nNumberOfAutoScalingGroups,number_of_auto_scaling_groups\nNumberOfBacktestWindows,number_of_backtest_windows\nNumberOfBrokerNodes,number_of_broker_nodes\nNumberOfBuckets,number_of_buckets\nNumberOfBytes,number_of_bytes\nNumberOfCategory,number_of_category\nNumberOfChannels,number_of_channels\nNumberOfChildJobs,number_of_child_jobs\nNumberOfControls,number_of_controls\nNumberOfDatabases,number_of_databases\nNumberOfDecreasesToday,number_of_decreases_today\nNumberOfDevicesInGroup,number_of_devices_in_group\nNumberOfDevicesRequested,number_of_devices_requested\nNumberOfDisks,number_of_disks\nNumberOfDistinctValues,number_of_distinct_values\nNumberOfDocuments,number_of_documents\nNumberOfFalses,number_of_falses\nNumberOfFiles,number_of_files\nNumberOfFrameworks,number_of_frameworks\nNumberOfHumanWorkersPerDataObject,number_of_human_workers_per_data_object\nNumberOfLabels,number_of_labels\nNumberOfLargeTimestampGaps,number_of_large_timestamp_gaps\nNumberOfLaunchConfigurations,number_of_launch_configurations\nNumberOfLines,number_of_lines\nNumberOfLogLinesOccurrences,number_of_log_lines_occurrences\nNumberOfLogLinesScanned,number_of_log_lines_scanned\nNumberOfMatchesFound,number_of_matches_found\nNumberOfMatchesInSample,number_of_matches_in_sample\nNumberOfMergesDone,number_of_merges_done\nNumberOfMountTargets,number_of_mount_targets\nNumberOfNodes,number_of_nodes\nNumberOfNodesPerClusterLimitExceededFault,number_of_nodes_per_cluster_limit_exceeded_fault\nNumberOfNodesQuotaExceededFault,number_of_nodes_quota_exceeded_fault\nNumberOfNulls,number_of_nulls\nNumberOfObjects,number_of_objects\nNumberOfOnCalls,number_of_on_calls\nNumberOfProfilesInSample,number_of_profiles_in_sample\nNumberOfProfilesReviewed,number_of_profiles_reviewed\nNumberOfProfilesWillBeMerged,number_of_profiles_will_be_merged\nNumberOfRecoveryPoints,number_of_recovery_points\nNumberOfRuleGroupsAlreadyAssociated,number_of_rule_groups_already_associated\nNumberOfRuleTemplatesExceededException,number_of_rule_templates_exceeded_exception\nNumberOfRules,number_of_rules\nNumberOfRulesExceededException,number_of_rules_exceeded_exception\nNumberOfSamples,number_of_samples\nNumberOfSchemas,number_of_schemas\nNumberOfServicesAccessible,number_of_services_accessible\nNumberOfServicesNotAccessed,number_of_services_not_accessed\nNumberOfShards,number_of_shards\nNumberOfSteps,number_of_steps\nNumberOfTasksFailed,number_of_tasks_failed\nNumberOfTasksSucceeded,number_of_tasks_succeeded\nNumberOfTestDocuments,number_of_test_documents\nNumberOfTopics,number_of_topics\nNumberOfTrainMentions,number_of_train_mentions\nNumberOfTrainedDocuments,number_of_trained_documents\nNumberOfTrainingJobsObjectiveNotImproving,number_of_training_jobs_objective_not_improving\nNumberOfTrues,number_of_trues\nNumberOfVersions,number_of_versions\nNumberOfWorkers,number_of_workers\nNumberReference,number_reference\nNumberReferenceFrames,number_reference_frames\nNumberScale,number_scale\nNumberSelectionBehavior,number_selection_behavior\nNumberType,number_type\nNumberValidateRequest,number_validate_request\nNumberValidateResponse,number_validate_response\nNumericAxisOptions,numeric_axis_options\nNumericEqualityDrillDownFilter,numeric_equality_drill_down_filter\nNumericEqualityFilter,numeric_equality_filter\nNumericFormatConfiguration,numeric_format_configuration\nNumericOperator,numeric_operator\nNumericQuestionPropertyValueAutomation,numeric_question_property_value_automation\nNumericRangeFilter,numeric_range_filter\nNumericRangeFilterValue,numeric_range_filter_value\nNumericSeparatorConfiguration,numeric_separator_configuration\nNumericalAggregationFunction,numerical_aggregation_function\nNumericalDimensionField,numerical_dimension_field\nNumericalMeasureField,numerical_measure_field\nNvmeSupport,nvme_support\nNwkGeoLoc,nwk_geo_loc\nNwkKey,nwk_key\nNwkSEncKey,nwk_s_enc_key\nNwkSKey,nwk_s_key\nOAuth,o_auth\nOAuth2Credentials,o_auth2_credentials\nOAuth2CustomParameter,o_auth2_custom_parameter\nOAuth2Defaults,o_auth2_defaults\nOAuth2Properties,o_auth2_properties\nOAuthCredentials,o_auth_credentials\nOAuthGrantType,o_auth_grant_type\nOAuthHttpParameters,o_auth_http_parameters\nOAuthParameters,o_auth_parameters\nOAuthProperties,o_auth_properties\nOAuthProviderException,o_auth_provider_exception\nOAuthScopes,o_auth_scopes\nOCSPUrl,ocsp_url\nOEMEphemeris,oem_ephemeris\nOFIMetricDataPoint,ofi_metric_data_point\nOFIModelPerformance,ofi_model_performance\nOFITrainingMetricsValue,ofi_training_metrics_value\nOID,oid\nOIDC,oidc\nOId,o_id\nOKActions,ok_actions\nOS,os\nOSInfo,os_info\nOSRelease,os_release\nOSReleaseLabel,os_release_label\nOSUpdateSettings,os_update_settings\nOSVersion,os_version\nOTAJobConfig,ota_job_config\nOTAUpdateFile,ota_update_file\nOTAUpdateInfo,ota_update_info\nOTAUpdateSummary,ota_update_summary\nOU,ou\nOauth2Credential,oauth2_credential\nObdInterface,obd_interface\nObdSignal,obd_signal\nObfuscationSetting,obfuscation_setting\nObject,object\nObjectACL,object_acl\nObjectAlreadyDetachedException,object_already_detached_exception\nObjectArn,object_arn\nObjectAttributeAction,object_attribute_action\nObjectAttributeActionType,object_attribute_action_type\nObjectAttributeKey,object_attribute_key\nObjectAttributeList,object_attribute_list\nObjectAttributeRange,object_attribute_range\nObjectAttributeUpdate,object_attribute_update\nObjectAttributeUpdateValue,object_attribute_update_value\nObjectAttributes,object_attributes\nObjectChecksum,object_checksum\nObjectChecksumAlgorithm,object_checksum_algorithm\nObjectConfiguration,object_configuration\nObjectCount,object_count\nObjectCountByEncryptionType,object_count_by_encryption_type\nObjectEncryptionType,object_encryption_type\nObjectFilter,object_filter\nObjectGroup,object_group\nObjectGroupName,object_group_name\nObjectIdentifier,object_identifier\nObjectIdentifierAndLinkNameTuple,object_identifier_and_link_name_tuple\nObjectIdentifiers,object_identifiers\nObjectKey,object_key\nObjectKeyPrefix,object_key_prefix\nObjectLambdaAccessPoint,object_lambda_access_point\nObjectLambdaAccessPointAlias,object_lambda_access_point_alias\nObjectLambdaAccessPointArn,object_lambda_access_point_arn\nObjectLambdaAccessPointList,object_lambda_access_point_list\nObjectLambdaConfiguration,object_lambda_configuration\nObjectLambdaTransformationConfiguration,object_lambda_transformation_configuration\nObjectLevelStatistics,object_level_statistics\nObjectList,object_list\nObjectLockConfiguration,object_lock_configuration\nObjectLockEnabled,object_lock_enabled\nObjectLockEnabledForBucket,object_lock_enabled_for_bucket\nObjectLockLegalHold,object_lock_legal_hold\nObjectLockLegalHoldStatus,object_lock_legal_hold_status\nObjectLockMode,object_lock_mode\nObjectLockRetainUntilDate,object_lock_retain_until_date\nObjectLockRetention,object_lock_retention\nObjectLockRule,object_lock_rule\nObjectName,object_name\nObjectNotDetachedException,object_not_detached_exception\nObjectNotFoundException,object_not_found_exception\nObjectOwnership,object_ownership\nObjectPart,object_part\nObjectParts,object_parts\nObjectReference,object_reference\nObjectReplicationStatuses,object_replication_statuses\nObjectSize,object_size\nObjectSizeGreaterThan,object_size_greater_than\nObjectSizeLessThan,object_size_less_than\nObjectTags,object_tags\nObjectToken,object_token\nObjectType,object_type\nObjectTypeField,object_type_field\nObjectTypeKey,object_type_key\nObjectTypeName,object_type_name\nObjectTypeNames,object_type_names\nObjectTypes,object_types\nObjectURL,object_url\nObjectVersion,object_version\nObjectVersionId,object_version_id\nObjectVersionIds,object_version_ids\nObjectVersionUpdate,object_version_update\nObjectiveStatus,objective_status\nObjectiveStatusCounters,objective_status_counters\nObjects,objects\nObjectsTransferred,objects_transferred\nObservabilityConfiguration,observability_configuration\nObservabilityConfigurationArn,observability_configuration_arn\nObservabilityConfigurationName,observability_configuration_name\nObservabilityConfigurationRevision,observability_configuration_revision\nObservabilityConfigurationSummary,observability_configuration_summary\nObservabilityConfigurationSummaryList,observability_configuration_summary_list\nObservabilityEnabled,observability_enabled\nObservation,observation\nObservationId,observation_id\nObservationList,observation_list\nOccConflictException,occ_conflict_exception\nOccurredAt,occurred_at\nOccurrenceCount,occurrence_count\nOccurrenceDaySet,occurrence_day_set\nOccurrenceDays,occurrence_days\nOccurrenceRelativeToEnd,occurrence_relative_to_end\nOccurrenceUnit,occurrence_unit\nOccurrences,occurrences\nOcrLanguage,ocr_language\nOcspConfiguration,ocsp_configuration\nOcspCustomCname,ocsp_custom_cname\nOcuLimitExceededException,ocu_limit_exceeded_exception\nOffCondition,off_condition\nOffPeakWindow,off_peak_window\nOffPeakWindowOptions,off_peak_window_options\nOffPeakWindowOptionsStatus,off_peak_window_options_status\nOffering,offering\nOfferingArn,offering_arn\nOfferingClass,offering_class\nOfferingDescription,offering_description\nOfferingId,offering_id\nOfferingPromotion,offering_promotion\nOfferingSet,offering_set\nOfferingStatus,offering_status\nOfferingTransaction,offering_transaction\nOfferingType,offering_type\nOfferings,offerings\nOffice,office\nOfflineDeviceCount,offline_device_count\nOfflineEncrypted,offline_encrypted\nOfflineStoreConfig,offline_store_config\nOfflineStoreStatus,offline_store_status\nOfflineStoreStatusEquals,offline_store_status_equals\nOffset,offset\nOffsetMillis,offset_millis\nOffsetRange,offset_range\nOffsetRanges,offset_ranges\nOidcConfig,oidc_config\nOidcConfigForResponse,oidc_config_for_response\nOidcIdentityProviderConfig,oidc_identity_provider_config\nOidcIdentityProviderConfigRequest,oidc_identity_provider_config_request\nOidcMemberDefinition,oidc_member_definition\nOidcOptions,oidc_options\nOk,ok\nOkActions,ok_actions\nOkCount,ok_count\nOldAction,old_action\nOldImage,old_image\nOldKmsKeyId,old_kms_key_id\nOldNotification,old_notification\nOldPassword,old_password\nOldSubscriber,old_subscriber\nOldValue,old_value\nOnClause,on_clause\nOnCreate,on_create\nOnDemandAllocationStrategy,on_demand_allocation_strategy\nOnDemandBaseCapacity,on_demand_base_capacity\nOnDemandCapacityReservationOptions,on_demand_capacity_reservation_options\nOnDemandCost,on_demand_cost\nOnDemandCostEquivalent,on_demand_cost_equivalent\nOnDemandCostOfRIHoursUsed,on_demand_cost_of_ri_hours_used\nOnDemandFulfilledCapacity,on_demand_fulfilled_capacity\nOnDemandHours,on_demand_hours\nOnDemandHoursInLookbackPeriod,on_demand_hours_in_lookback_period\nOnDemandMaxPricePercentageOverLowestPrice,on_demand_max_price_percentage_over_lowest_price\nOnDemandMaxTotalPrice,on_demand_max_total_price\nOnDemandNormalizedUnits,on_demand_normalized_units\nOnDemandOptions,on_demand_options\nOnDemandOptionsRequest,on_demand_options_request\nOnDemandPercentageAboveBaseCapacity,on_demand_percentage_above_base_capacity\nOnDemandProvisioningSpecification,on_demand_provisioning_specification\nOnDemandResizeSpecification,on_demand_resize_specification\nOnDemandResizingSpecification,on_demand_resizing_specification\nOnDemandSpecification,on_demand_specification\nOnDemandStreamCount,on_demand_stream_count\nOnDemandStreamCountLimit,on_demand_stream_count_limit\nOnDemandTargetCapacity,on_demand_target_capacity\nOnDeviceServiceConfiguration,on_device_service_configuration\nOnEnterLifecycle,on_enter_lifecycle\nOnExceptionSteps,on_exception_steps\nOnExitLifecycle,on_exit_lifecycle\nOnFailure,on_failure\nOnHoldBalance,on_hold_balance\nOnInputLifecycle,on_input_lifecycle\nOnPartialBatchItemFailure,on_partial_batch_item_failure\nOnPartialUpload,on_partial_upload\nOnPremConfig,on_prem_config\nOnPremiseConfiguration,on_premise_configuration\nOnPremisesTagSet,on_premises_tag_set\nOnStackFailure,on_stack_failure\nOnStart,on_start\nOnSuccess,on_success\nOnUnauthenticatedRequest,on_unauthenticated_request\nOnUpload,on_upload\nOnboardedImportedDeviceCount,onboarded_imported_device_count\nOnboardingStatus,onboarding_status\nOnboardingStatusReason,onboarding_status_reason\nOneClickIdDelay,one_click_id_delay\nOneClickPinDelay,one_click_pin_delay\nOneDriveConfiguration,one_drive_configuration\nOneDriveUserList,one_drive_user_list\nOneDriveUserS3Path,one_drive_user_s3_path\nOneDriveUsers,one_drive_users\nOneTimePassword,one_time_password\nOngoing,ongoing\nOnline,online\nOnlineAbConfig,online_ab_config\nOnlineAbDefinition,online_ab_definition\nOnlineStoreConfig,online_store_config\nOnlineStoreConfigUpdate,online_store_config_update\nOnlineStoreSecurityConfig,online_store_security_config\nOnlineStoreTotalSizeBytes,online_store_total_size_bytes\nOnlyAssociated,only_associated\nOnlyAttached,only_attached\nOnlyAvailable,only_available\nOntapConfiguration,ontap_configuration\nOntapFileSystemConfiguration,ontap_file_system_configuration\nOntapResponse,ontap_response\nOntapVolumeConfiguration,ontap_volume_configuration\nOntapVolumeType,ontap_volume_type\nOp,op\nOpacity,opacity\nOpenDate,open_date\nOpenHours,open_hours\nOpenHoursRule,open_hours_rule\nOpenIDAuthTTL,open_id_auth_ttl\nOpenIDClientId,open_id_client_id\nOpenIDConnectConfig,open_id_connect_config\nOpenIDConnectProviderArn,open_id_connect_provider_arn\nOpenIDConnectProviderList,open_id_connect_provider_list\nOpenIDConnectProviderListEntry,open_id_connect_provider_list_entry\nOpenIDIatTTL,open_id_iat_ttl\nOpenIDIssueURL,open_id_issue_url\nOpenIDProviderName,open_id_provider_name\nOpenIdConnectConfig,open_id_connect_config\nOpenIdConnectProviderARNs,open_id_connect_provider_arns\nOpenInstancePublicPortsRequest,open_instance_public_ports_request\nOpenInstancePublicPortsResult,open_instance_public_ports_result\nOpenMonitoring,open_monitoring\nOpenMonitoringInfo,open_monitoring_info\nOpenPortRange,open_port_range\nOpenProactiveInsights,open_proactive_insights\nOpenReactiveInsights,open_reactive_insights\nOpenSearchAction,open_search_action\nOpenSearchServiceDataSourceConfig,open_search_service_data_source_config\nOpenShardCount,open_shard_count\nOpenTableFormatInput,open_table_format_input\nOpenTime,open_time\nOpenTransactionWindow,open_transaction_window\nOpenTunnelRequest,open_tunnel_request\nOpenTunnelResponse,open_tunnel_response\nOpenXJsonSerDe,open_x_json_ser_de\nOpenZFSClientConfiguration,open_zfs_client_configuration\nOpenZFSConfiguration,open_zfs_configuration\nOpenZFSCreateRootVolumeConfiguration,open_zfs_create_root_volume_configuration\nOpenZFSFileSystemConfiguration,open_zfs_file_system_configuration\nOpenZFSNfsExport,open_zfs_nfs_export\nOpenZFSOriginSnapshotConfiguration,open_zfs_origin_snapshot_configuration\nOpenZFSResponse,open_zfs_response\nOpenZFSUserOrGroupQuota,open_zfs_user_or_group_quota\nOpenZFSVolumeConfiguration,open_zfs_volume_configuration\nOpenedBy,opened_by\nOperandFieldName,operand_field_name\nOperands,operands\nOperatingAddress,operating_address\nOperatingAddressCity,operating_address_city\nOperatingAddressCityFilter,operating_address_city_filter\nOperatingAddressCountryCode,operating_address_country_code\nOperatingAddressCountryCodeFilter,operating_address_country_code_filter\nOperatingAddressStateOrRegion,operating_address_state_or_region\nOperatingAddressStateOrRegionFilter,operating_address_state_or_region_filter\nOperatingRegions,operating_regions\nOperatingSystem,operating_system\nOperatingSystemConfigurationManager,operating_system_configuration_manager\nOperatingSystemName,operating_system_name\nOperatingSystemVersion,operating_system_version\nOperatingSystems,operating_systems\nOperation,operation\nOperationAbortedException,operation_aborted_exception\nOperationArn,operation_arn\nOperationDisabledException,operation_disabled_exception\nOperationEndTime,operation_end_time\nOperationFailureException,operation_failure_exception\nOperationFilter,operation_filter\nOperationId,operation_id\nOperationIdAlreadyExistsException,operation_id_already_exists_exception\nOperationIds,operation_ids\nOperationInProgressException,operation_in_progress_exception\nOperationLimitExceeded,operation_limit_exceeded\nOperationName,operation_name\nOperationNotFound,operation_not_found\nOperationNotFoundException,operation_not_found_exception\nOperationNotPermittedException,operation_not_permitted_exception\nOperationNotPermittedFault,operation_not_permitted_fault\nOperationNotSupportedException,operation_not_supported_exception\nOperationPreferences,operation_preferences\nOperationRequestedBy,operation_requested_by\nOperationResultFilter,operation_result_filter\nOperationStartTime,operation_start_time\nOperationState,operation_state\nOperationStatus,operation_status\nOperationStatusCheckFailedException,operation_status_check_failed_exception\nOperationStatusFilter,operation_status_filter\nOperationStatuses,operation_statuses\nOperationSteps,operation_steps\nOperationSummary,operation_summary\nOperationSummaryList,operation_summary_list\nOperationTimeoutException,operation_timeout_exception\nOperationType,operation_type\nOperationalData,operational_data\nOperationalDataToDelete,operational_data_to_delete\nOperations,operations\nOperationsRole,operations_role\nOperator,operator\nOplocksEnabled,oplocks_enabled\nOpsAggregator,ops_aggregator\nOpsCenter,ops_center\nOpsCenterEnabled,ops_center_enabled\nOpsCenterIntegration,ops_center_integration\nOpsCenterIntegrationConfig,ops_center_integration_config\nOpsEntity,ops_entity\nOpsEntityItem,ops_entity_item\nOpsFilter,ops_filter\nOpsItem,ops_item\nOpsItemAccessDeniedException,ops_item_access_denied_exception\nOpsItemAlreadyExistsException,ops_item_already_exists_exception\nOpsItemArn,ops_item_arn\nOpsItemDataValue,ops_item_data_value\nOpsItemEventFilter,ops_item_event_filter\nOpsItemEventSummary,ops_item_event_summary\nOpsItemFilter,ops_item_filter\nOpsItemFilters,ops_item_filters\nOpsItemId,ops_item_id\nOpsItemIdentity,ops_item_identity\nOpsItemInvalidParameterException,ops_item_invalid_parameter_exception\nOpsItemLimitExceededException,ops_item_limit_exceeded_exception\nOpsItemNotFoundException,ops_item_not_found_exception\nOpsItemNotification,ops_item_notification\nOpsItemRelatedItemAlreadyExistsException,ops_item_related_item_already_exists_exception\nOpsItemRelatedItemAssociationNotFoundException,ops_item_related_item_association_not_found_exception\nOpsItemRelatedItemSummary,ops_item_related_item_summary\nOpsItemRelatedItemsFilter,ops_item_related_items_filter\nOpsItemSNSTopicArn,ops_item_sns_topic_arn\nOpsItemSummaries,ops_item_summaries\nOpsItemSummary,ops_item_summary\nOpsItemType,ops_item_type\nOpsMetadata,ops_metadata\nOpsMetadataAlreadyExistsException,ops_metadata_already_exists_exception\nOpsMetadataArn,ops_metadata_arn\nOpsMetadataFilter,ops_metadata_filter\nOpsMetadataInvalidArgumentException,ops_metadata_invalid_argument_exception\nOpsMetadataKeyLimitExceededException,ops_metadata_key_limit_exceeded_exception\nOpsMetadataLimitExceededException,ops_metadata_limit_exceeded_exception\nOpsMetadataList,ops_metadata_list\nOpsMetadataNotFoundException,ops_metadata_not_found_exception\nOpsMetadataTooManyUpdatesException,ops_metadata_too_many_updates_exception\nOpsResultAttribute,ops_result_attribute\nOptIn,opt_in\nOptInPhoneNumberInput,opt_in_phone_number_input\nOptInRequiredException,opt_in_required_exception\nOptInStatus,opt_in_status\nOptInType,opt_in_type\nOptOut,opt_out\nOptOutListArn,opt_out_list_arn\nOptOutListInformation,opt_out_list_information\nOptOutListName,opt_out_list_name\nOptOutListNames,opt_out_list_names\nOptOutLists,opt_out_lists\nOptOutSpeakerRequest,opt_out_speaker_request\nOptOutSpeakerResponse,opt_out_speaker_response\nOptedOutException,opted_out_exception\nOptedOutFilter,opted_out_filter\nOptedOutNumber,opted_out_number\nOptedOutNumberInformation,opted_out_number_information\nOptedOutNumbers,opted_out_numbers\nOptedOutTimestamp,opted_out_timestamp\nOpticalStandard,optical_standard\nOptimisticLockException,optimistic_lock_exception\nOptimizationMetric,optimization_metric\nOptimizationObjective,optimization_objective\nOptimizationStatus,optimization_status\nOptimizeForEndUserLocation,optimize_for_end_user_location\nOptimizePerformance,optimize_performance\nOptimizedSharedDelivery,optimized_shared_delivery\nOptimizedViewPortWidth,optimized_view_port_width\nOptimizingTime,optimizing_time\nOption,option\nOptionConfiguration,option_configuration\nOptionDescription,option_description\nOptionGroup,option_group\nOptionGroupAlreadyExistsFault,option_group_already_exists_fault\nOptionGroupArn,option_group_arn\nOptionGroupDescription,option_group_description\nOptionGroupMembership,option_group_membership\nOptionGroupMemberships,option_group_memberships\nOptionGroupName,option_group_name\nOptionGroupNotFoundFault,option_group_not_found_fault\nOptionGroupOption,option_group_option\nOptionGroupOptionSetting,option_group_option_setting\nOptionGroupOptionSettings,option_group_option_settings\nOptionGroupOptionVersions,option_group_option_versions\nOptionGroupOptions,option_group_options\nOptionGroupOptionsMessage,option_group_options_message\nOptionGroupQuotaExceededFault,option_group_quota_exceeded_fault\nOptionGroups,option_groups\nOptionGroupsList,option_groups_list\nOptionName,option_name\nOptionRefId,option_ref_id\nOptionRestrictionRegex,option_restriction_regex\nOptionSetting,option_setting\nOptionSettings,option_settings\nOptionSpecification,option_specification\nOptionStatus,option_status\nOptionVersion,option_version\nOptionalDeployment,optional_deployment\nOptionalFields,optional_fields\nOptionalObjectAttributes,optional_object_attributes\nOptionalParameters,optional_parameters\nOptions,options\nOptionsConflictsWith,options_conflicts_with\nOptionsDependedOn,options_depended_on\nOptionsToInclude,options_to_include\nOptionsToRemove,options_to_remove\nOpusSettings,opus_settings\nOr,or\nOrAllFilters,or_all_filters\nOrConditions,or_conditions\nOrStatement,or_statement\nOracleDataProviderSettings,oracle_data_provider_settings\nOracleParameters,oracle_parameters\nOraclePathPrefix,oracle_path_prefix\nOracleSQLCatalogSource,oracle_sql_catalog_source\nOracleSQLCatalogTarget,oracle_sql_catalog_target\nOracleSettings,oracle_settings\nOrcSerDe,orc_ser_de\nOrder,order\nOrderBy,order_by\nOrderByElement,order_by_element\nOrderFulfilledDate,order_fulfilled_date\nOrderId,order_id\nOrderSubmissionDate,order_submission_date\nOrderSummary,order_summary\nOrderType,order_type\nOrderableClusterOption,orderable_cluster_option\nOrderableClusterOptions,orderable_cluster_options\nOrderableClusterOptionsMessage,orderable_cluster_options_message\nOrderableDBInstanceOption,orderable_db_instance_option\nOrderableDBInstanceOptions,orderable_db_instance_options\nOrderableDBInstanceOptionsMessage,orderable_db_instance_options_message\nOrderableReplicationInstance,orderable_replication_instance\nOrderableReplicationInstances,orderable_replication_instances\nOrderedBy,ordered_by\nOrderedIndexedAttributeList,ordered_indexed_attribute_list\nOrderedPhoneNumber,ordered_phone_number\nOrderedPhoneNumbers,ordered_phone_numbers\nOrderedRemediationActions,ordered_remediation_actions\nOrderedResourceDefinition,ordered_resource_definition\nOrderingId,ordering_id\nOrderingServiceEndpoint,ordering_service_endpoint\nOrderingTimestamp,ordering_timestamp\nOrders,orders\nOrg,org\nOrganization,organization\nOrganizationAccessDeniedException,organization_access_denied_exception\nOrganizationAdditionalConfiguration,organization_additional_configuration\nOrganizationAdditionalConfigurationResult,organization_additional_configuration_result\nOrganizationAffectedEntitiesErrorItem,organization_affected_entities_error_item\nOrganizationAggregationSource,organization_aggregation_source\nOrganizationAllFeaturesNotEnabledException,organization_all_features_not_enabled_exception\nOrganizationArn,organization_arn\nOrganizationArns,organization_arns\nOrganizationAwsServiceAccessStatus,organization_aws_service_access_status\nOrganizationConfigRule,organization_config_rule\nOrganizationConfigRuleArn,organization_config_rule_arn\nOrganizationConfigRuleDetailedStatus,organization_config_rule_detailed_status\nOrganizationConfigRuleName,organization_config_rule_name\nOrganizationConfigRuleNames,organization_config_rule_names\nOrganizationConfigRuleStatus,organization_config_rule_status\nOrganizationConfigRuleStatuses,organization_config_rule_statuses\nOrganizationConfigRuleTriggerTypes,organization_config_rule_trigger_types\nOrganizationConfigRules,organization_config_rules\nOrganizationConfiguration,organization_configuration\nOrganizationConformancePack,organization_conformance_pack\nOrganizationConformancePackArn,organization_conformance_pack_arn\nOrganizationConformancePackDetailedStatus,organization_conformance_pack_detailed_status\nOrganizationConformancePackDetailedStatuses,organization_conformance_pack_detailed_statuses\nOrganizationConformancePackName,organization_conformance_pack_name\nOrganizationConformancePackNames,organization_conformance_pack_names\nOrganizationConformancePackStatus,organization_conformance_pack_status\nOrganizationConformancePackStatuses,organization_conformance_pack_statuses\nOrganizationConformancePackTemplateValidationException,organization_conformance_pack_template_validation_exception\nOrganizationConformancePacks,organization_conformance_packs\nOrganizationCustomPolicyRuleMetadata,organization_custom_policy_rule_metadata\nOrganizationCustomPolicyRuleMetadataNoPolicy,organization_custom_policy_rule_metadata_no_policy\nOrganizationCustomRuleMetadata,organization_custom_rule_metadata\nOrganizationDataSourceConfigurations,organization_data_source_configurations\nOrganizationDataSourceConfigurationsResult,organization_data_source_configurations_result\nOrganizationEbsVolumes,organization_ebs_volumes\nOrganizationEbsVolumesResult,organization_ebs_volumes_result\nOrganizationEnabled,organization_enabled\nOrganizationEntityAggregate,organization_entity_aggregate\nOrganizationEvent,organization_event\nOrganizationEventDetails,organization_event_details\nOrganizationEventDetailsErrorItem,organization_event_details_error_item\nOrganizationEventFilter,organization_event_filter\nOrganizationFeatureConfiguration,organization_feature_configuration\nOrganizationFeatureConfigurationResult,organization_feature_configuration_result\nOrganizationId,organization_id\nOrganizationIntegration,organization_integration\nOrganizationKubernetesAuditLogsConfiguration,organization_kubernetes_audit_logs_configuration\nOrganizationKubernetesAuditLogsConfigurationResult,organization_kubernetes_audit_logs_configuration_result\nOrganizationKubernetesConfiguration,organization_kubernetes_configuration\nOrganizationKubernetesConfigurationResult,organization_kubernetes_configuration_result\nOrganizationMalwareProtectionConfiguration,organization_malware_protection_configuration\nOrganizationMalwareProtectionConfigurationResult,organization_malware_protection_configuration_result\nOrganizationManagedRuleMetadata,organization_managed_rule_metadata\nOrganizationName,organization_name\nOrganizationNode,organization_node\nOrganizationNodeType,organization_node_type\nOrganizationNodeValue,organization_node_value\nOrganizationNodes,organization_nodes\nOrganizationNotEmptyException,organization_not_empty_exception\nOrganizationNotFoundException,organization_not_found_exception\nOrganizationNotInAllFeaturesModeException,organization_not_in_all_features_mode_exception\nOrganizationParentId,organization_parent_id\nOrganizationResourceCollectionType,organization_resource_collection_type\nOrganizationResourceDetailedStatusFilters,organization_resource_detailed_status_filters\nOrganizationResourceId,organization_resource_id\nOrganizationRuleStatus,organization_rule_status\nOrganizationS3LogsConfiguration,organization_s3_logs_configuration\nOrganizationS3LogsConfigurationResult,organization_s3_logs_configuration_result\nOrganizationScanEc2InstanceWithFindings,organization_scan_ec2_instance_with_findings\nOrganizationScanEc2InstanceWithFindingsResult,organization_scan_ec2_instance_with_findings_result\nOrganizationSharingStatus,organization_sharing_status\nOrganizationSourceType,organization_source_type\nOrganizationStateException,organization_state_exception\nOrganizationStatus,organization_status\nOrganizationSummaries,organization_summaries\nOrganizationSummary,organization_summary\nOrganizationUnits,organization_units\nOrganizationalUnit,organizational_unit\nOrganizationalUnitArn,organizational_unit_arn\nOrganizationalUnitArns,organizational_unit_arns\nOrganizationalUnitDistinguishedName,organizational_unit_distinguished_name\nOrganizationalUnitDistinguishedNames,organizational_unit_distinguished_names\nOrganizationalUnitId,organizational_unit_id\nOrganizationalUnitIds,organizational_unit_ids\nOrganizationalUnitNotEmptyException,organizational_unit_not_empty_exception\nOrganizationalUnitNotFoundException,organizational_unit_not_found_exception\nOrganizationalUnitScope,organizational_unit_scope\nOrganizationalUnits,organizational_units\nOrganizationsDecisionDetail,organizations_decision_detail\nOrganizationsException,organizations_exception\nOrganizationsNotInUseException,organizations_not_in_use_exception\nOrganizationsPolicyId,organizations_policy_id\nOrientation,orientation\nOrientationCorrection,orientation_correction\nOrigin,origin\nOriginAccessControl,origin_access_control\nOriginAccessControlAlreadyExists,origin_access_control_already_exists\nOriginAccessControlConfig,origin_access_control_config\nOriginAccessControlId,origin_access_control_id\nOriginAccessControlInUse,origin_access_control_in_use\nOriginAccessControlList,origin_access_control_list\nOriginAccessControlOriginType,origin_access_control_origin_type\nOriginAccessControlSummary,origin_access_control_summary\nOriginAccessIdentity,origin_access_identity\nOriginApprovalRuleTemplate,origin_approval_rule_template\nOriginCustomHeader,origin_custom_header\nOriginDetails,origin_details\nOriginEndpoint,origin_endpoint\nOriginEndpointId,origin_endpoint_id\nOriginEndpointListConfiguration,origin_endpoint_list_configuration\nOriginEndpointName,origin_endpoint_name\nOriginEndpoints,origin_endpoints\nOriginGroup,origin_group\nOriginGroupFailoverCriteria,origin_group_failover_criteria\nOriginGroupMember,origin_group_member\nOriginGroupMembers,origin_group_members\nOriginGroups,origin_groups\nOriginId,origin_id\nOriginKeepaliveTimeout,origin_keepalive_timeout\nOriginManifestType,origin_manifest_type\nOriginOverride,origin_override\nOriginPath,origin_path\nOriginProtocolPolicy,origin_protocol_policy\nOriginReadTimeout,origin_read_timeout\nOriginRequestPolicy,origin_request_policy\nOriginRequestPolicyAlreadyExists,origin_request_policy_already_exists\nOriginRequestPolicyConfig,origin_request_policy_config\nOriginRequestPolicyCookiesConfig,origin_request_policy_cookies_config\nOriginRequestPolicyHeadersConfig,origin_request_policy_headers_config\nOriginRequestPolicyId,origin_request_policy_id\nOriginRequestPolicyInUse,origin_request_policy_in_use\nOriginRequestPolicyList,origin_request_policy_list\nOriginRequestPolicyQueryStringsConfig,origin_request_policy_query_strings_config\nOriginRequestPolicySummary,origin_request_policy_summary\nOriginShield,origin_shield\nOriginShieldRegion,origin_shield_region\nOriginSnapshot,origin_snapshot\nOriginSslProtocols,origin_ssl_protocols\nOriginal,original\nOriginalCountryCodeIso2,original_country_code_iso2\nOriginalIops,original_iops\nOriginalMessage,original_message\nOriginalMessageId,original_message_id\nOriginalMultiAttachEnabled,original_multi_attach_enabled\nOriginalName,original_name\nOriginalParent,original_parent\nOriginalPhoneNumber,original_phone_number\nOriginalRuleSetName,original_rule_set_name\nOriginalSchema,original_schema\nOriginalScore,original_score\nOriginalSize,original_size\nOriginalSnapshotCreateTime,original_snapshot_create_time\nOriginalSourceFileSystemArn,original_source_file_system_arn\nOriginalStatusCode,original_status_code\nOriginalTextCharacters,original_text_characters\nOriginalThroughput,original_throughput\nOriginalTypeArn,original_type_arn\nOriginalTypeName,original_type_name\nOriginalVolumeType,original_volume_type\nOrigination,origination\nOriginationIdentities,origination_identities\nOriginationIdentity,origination_identity\nOriginationIdentityArn,origination_identity_arn\nOriginationIdentityMetadata,origination_identity_metadata\nOriginationNumber,origination_number\nOriginationPhoneNumber,origination_phone_number\nOriginationRoute,origination_route\nOrigins,origins\nOs,os\nOsArchitecture,os_architecture\nOsType,os_type\nOsVersion,os_version\nOtaaV1_0_x,otaa_v1_0_x\nOtaaV1_1,otaa_v1_1\nOther,other\nOtherCategories,other_categories\nOtherCount,other_count\nOtherMetadataValueList,other_metadata_value_list\nOtherMetadataValueListItem,other_metadata_value_list_item\nOtherName,other_name\nOtherNonCompliantCount,other_non_compliant_count\nOtherPolicies,other_policies\nOtp,otp\nOutOfCapacityException,out_of_capacity_exception\nOutPutS3Location,out_put_s3_location\nOutboundCall,outbound_call\nOutboundCallConfig,outbound_call_config\nOutboundCallerConfig,outbound_caller_config\nOutboundCallerIdName,outbound_caller_id_name\nOutboundCallerIdNumberId,outbound_caller_id_number_id\nOutboundCalling,outbound_calling\nOutboundCallsEnabled,outbound_calls_enabled\nOutboundConnection,outbound_connection\nOutboundConnectionStatus,outbound_connection_status\nOutboundContactNotPermittedException,outbound_contact_not_permitted_exception\nOutboundCrossClusterSearchConnection,outbound_cross_cluster_search_connection\nOutboundCrossClusterSearchConnectionStatus,outbound_cross_cluster_search_connection_status\nOutboundEventsHTTPSEndpoint,outbound_events_https_endpoint\nOutboundFlowId,outbound_flow_id\nOutboundHeader,outbound_header\nOutboundHostName,outbound_host_name\nOutboundIp,outbound_ip\nOutboundMMS,outbound_mms\nOutboundSMS,outbound_sms\nOutboundShipment,outbound_shipment\nOutcome,outcome\nOutgoingCertificate,outgoing_certificate\nOutgoingDukptAttributes,outgoing_dukpt_attributes\nOutgoingEncryptionAttributes,outgoing_encryption_attributes\nOutgoingKeyIdentifier,outgoing_key_identifier\nOutgoingTranslationAttributes,outgoing_translation_attributes\nOutlierDetection,outlier_detection\nOutlierVisibility,outlier_visibility\nOutlineColor,outline_color\nOutlineSize,outline_size\nOutpost,outpost\nOutpostArn,outpost_arn\nOutpostCapable,outpost_capable\nOutpostConfigRequest,outpost_config_request\nOutpostConfigResponse,outpost_config_response\nOutpostId,outpost_id\nOutpostIdentifier,outpost_identifier\nOutpostIdentifierFilter,outpost_identifier_filter\nOutpostMode,outpost_mode\nOutpostOfflineException,outpost_offline_exception\nOutpostResolver,outpost_resolver\nOutpostResolvers,outpost_resolvers\nOutposts,outposts\nOutpostsId,outposts_id\nOutput,output\nOutputArn,output_arn\nOutputArtifact,output_artifact\nOutputArtifacts,output_artifacts\nOutputArtifactsToRemove,output_artifacts_to_remove\nOutputAttribute,output_attribute\nOutputBand,output_band\nOutputBands,output_bands\nOutputBucket,output_bucket\nOutputBucketName,output_bucket_name\nOutputBytes,output_bytes\nOutputChannel,output_channel\nOutputChannelMapping,output_channel_mapping\nOutputChannels,output_channels\nOutputColumn,output_column\nOutputColumnName,output_column_name\nOutputColumns,output_columns\nOutputCompression,output_compression\nOutputConfig,output_config\nOutputConfigInput,output_config_input\nOutputContext,output_context\nOutputDataConfig,output_data_config\nOutputDataType,output_data_type\nOutputDatasetS3Uri,output_dataset_s3_uri\nOutputDescription,output_description\nOutputDescriptions,output_descriptions\nOutputDestination,output_destination\nOutputDestinationSettings,output_destination_settings\nOutputDetail,output_detail\nOutputDetails,output_details\nOutputEncryptionKMSKeyId,output_encryption_kms_key_id\nOutputFileUriValue,output_file_uri_value\nOutputFilter,output_filter\nOutputFormat,output_format\nOutputFormatConfiguration,output_format_configuration\nOutputFormatOptions,output_format_options\nOutputGroup,output_group\nOutputGroupDetail,output_group_detail\nOutputGroupDetails,output_group_details\nOutputGroupSettings,output_group_settings\nOutputGroups,output_groups\nOutputId,output_id\nOutputKey,output_key\nOutputKeyPrefix,output_key_prefix\nOutputKeys,output_keys\nOutputLocation,output_location\nOutputLocationRef,output_location_ref\nOutputLocationType,output_location_type\nOutputLockingMode,output_locking_mode\nOutputLockingSettings,output_locking_settings\nOutputLogEvent,output_log_event\nOutputName,output_name\nOutputNotebookFormat,output_notebook_format\nOutputNotebookS3Location,output_notebook_s3_location\nOutputNotebookS3LocationForOutput,output_notebook_s3_location_for_output\nOutputNotebookS3LocationFromInput,output_notebook_s3_location_from_input\nOutputNotebookURI,output_notebook_uri\nOutputPackageName,output_package_name\nOutputPackageVersion,output_package_version\nOutputParameter,output_parameter\nOutputParameters,output_parameters\nOutputRectangle,output_rectangle\nOutputReservedInstancesWillExpireAt,output_reserved_instances_will_expire_at\nOutputResolution,output_resolution\nOutputResolutionResamplingInput,output_resolution_resampling_input\nOutputResolutionStackInput,output_resolution_stack_input\nOutputResources,output_resources\nOutputRows,output_rows\nOutputS3BucketName,output_s3_bucket_name\nOutputS3KeyPrefix,output_s3_key_prefix\nOutputS3Location,output_s3_location\nOutputS3Object,output_s3_object\nOutputS3Path,output_s3_path\nOutputS3Region,output_s3_region\nOutputS3Uri,output_s3_uri\nOutputSchemaVersion,output_schema_version\nOutputSchemas,output_schemas\nOutputSdt,output_sdt\nOutputSelection,output_selection\nOutputSerialization,output_serialization\nOutputSettings,output_settings\nOutputSource,output_source\nOutputSourceId,output_source_id\nOutputSourceType,output_source_type\nOutputStage,output_stage\nOutputStartIndex,output_start_index\nOutputTimingSource,output_timing_source\nOutputType,output_type\nOutputUpdate,output_update\nOutputUpdates,output_updates\nOutputUri,output_uri\nOutputUrl,output_url\nOutputValue,output_value\nOutputVariablesSizeExceededException,output_variables_size_exceeded_exception\nOutputs,outputs\nOutsideIpAddress,outside_ip_address\nOutsideIpAddressType,outside_ip_address_type\nOutstandingVoteCount,outstanding_vote_count\nOverage,overage\nOverallBestTrainingJob,overall_best_training_job\nOverallPlacement,overall_placement\nOverallSeverity,overall_severity\nOverallTestResultItem,overall_test_result_item\nOverallTestResults,overall_test_results\nOverallVolume,overall_volume\nOverflowColumnHeaderVisibility,overflow_column_header_visibility\nOverlap,overlap\nOverlapStatus,overlap_status\nOverridden,overridden\nOverriddenAction,overridden_action\nOverriddenContactIds,overridden_contact_ids\nOverriddenParameters,overridden_parameters\nOverride,override\nOverrideAction,override_action\nOverrideAlreadySetException,override_already_set_exception\nOverrideArtifactName,override_artifact_name\nOverrideButtonConfiguration,override_button_configuration\nOverrideDatasetParameterOperation,override_dataset_parameter_operation\nOverrideOptions,override_options\nOverrideParameters,override_parameters\nOverridePullRequestApprovalRulesInput,override_pull_request_approval_rules_input\nOverrideRejection,override_rejection\nOverrideStatusRequiredException,override_status_required_exception\nOverrides,overrides\nOversizeHandling,oversize_handling\nOversizedConfigurationItemException,oversized_configuration_item_exception\nOverview,overview\nOverwrite,overwrite\nOverwriteExisting,overwrite_existing\nOverwriteExtensionPack,overwrite_extension_pack\nOverwriteMode,overwrite_mode\nOwner,owner\nOwnerAccount,owner_account\nOwnerAccountId,owner_account_id\nOwnerAlias,owner_alias\nOwnerDirectoryDescription,owner_directory_description\nOwnerDirectoryId,owner_directory_id\nOwnerFilter,owner_filter\nOwnerGid,owner_gid\nOwnerId,owner_id\nOwnerIdentifier,owner_identifier\nOwnerIds,owner_ids\nOwnerInformation,owner_information\nOwnerName,owner_name\nOwnerSetting,owner_setting\nOwnerType,owner_type\nOwnerUid,owner_uid\nOwners,owners\nOwnershipControls,ownership_controls\nOwnershipControlsRule,ownership_controls_rule\nOwnershipType,ownership_type\nOwnershipVerificationCertificateArn,ownership_verification_certificate_arn\nOwnershipVerificationStatus,ownership_verification_status\nOwningAccount,owning_account\nOwningAccountId,owning_account_id\nOwningAccounts,owning_accounts\nOwningService,owning_service\nP10,p10\nP50,p50\nP75,p75\nP85,p85\nP90,p90\nP95,p95\nP95Metrics,p95_metrics\nP99,p99\nP999,p999\nPENDING,pending\nPIIDetection,pii_detection\nPITPolicyRule,pit_policy_rule\nPSTNDialIn,pstn_dial_in\nPSTNEnabled,pstn_enabled\nPUSH,push\nPackageAggregation,package_aggregation\nPackageAggregationResponse,package_aggregation_response\nPackageArn,package_arn\nPackageDependency,package_dependency\nPackageDescription,package_description\nPackageDetails,package_details\nPackageDetailsList,package_details_list\nPackageFilter,package_filter\nPackageID,package_id\nPackageId,package_id\nPackageImportJob,package_import_job\nPackageImportJobInputConfig,package_import_job_input_config\nPackageImportJobOutput,package_import_job_output\nPackageImportJobOutputConfig,package_import_job_output_config\nPackageImportJobs,package_import_jobs\nPackageListItem,package_list_item\nPackageManager,package_manager\nPackageName,package_name\nPackageObject,package_object\nPackageObjects,package_objects\nPackageOriginConfiguration,package_origin_configuration\nPackageOriginRestrictions,package_origin_restrictions\nPackagePatchVersion,package_patch_version\nPackageSource,package_source\nPackageStatus,package_status\nPackageSummary,package_summary\nPackageType,package_type\nPackageVersion,package_version\nPackageVersionDescription,package_version_description\nPackageVersionError,package_version_error\nPackageVersionHistory,package_version_history\nPackageVersionHistoryList,package_version_history_list\nPackageVersionInputConfig,package_version_input_config\nPackageVersionOrigin,package_version_origin\nPackageVersionOutputConfig,package_version_output_config\nPackageVersionSummary,package_version_summary\nPackageVulnerabilityDetails,package_vulnerability_details\nPackages,packages\nPackaging,packaging\nPackagingConfiguration,packaging_configuration\nPackagingConfigurationId,packaging_configuration_id\nPackagingConfigurations,packaging_configurations\nPackagingGroup,packaging_group\nPackagingGroupId,packaging_group_id\nPackagingGroups,packaging_groups\nPackagingType,packaging_type\nPackedPolicySize,packed_policy_size\nPackedPolicyTooLargeException,packed_policy_too_large_exception\nPacketField,packet_field\nPacketHeaderStatement,packet_header_statement\nPacketHeaderStatementRequest,packet_header_statement_request\nPacketIdentifiersMap,packet_identifiers_map\nPacketLength,packet_length\nPacketsPerSecond,packets_per_second\nPadVideo,pad_video\nPadding,padding\nPaddingControl,padding_control\nPaddingPolicy,padding_policy\nPaddingTolerance,padding_tolerance\nPaddingType,padding_type\nPage,page\nPageArn,page_arn\nPageBreakConfiguration,page_break_configuration\nPageClassification,page_classification\nPageConfiguration,page_configuration\nPageFieldMappings,page_field_mappings\nPageId,page_id\nPageNumber,page_number\nPageResolutions,page_resolutions\nPageSize,page_size\nPageSizeBytes,page_size_bytes\nPageToken,page_token\nPageType,page_type\nPageTypes,page_types\nPagerDutyConfiguration,pager_duty_configuration\nPagerDutyIncidentConfiguration,pager_duty_incident_configuration\nPagerDutyIncidentDetail,pager_duty_incident_detail\nPages,pages\nPaginatedLayoutConfiguration,paginated_layout_configuration\nPaginatedReportOptions,paginated_report_options\nPaginationConfiguration,pagination_configuration\nPaginationToken,pagination_token\nPaginationTokenExpiredException,pagination_token_expired_exception\nPanSequenceNumber,pan_sequence_number\nPanelConfiguration,panel_configuration\nPanelTitleOptions,panel_title_options\nPaperCanvasSizeOptions,paper_canvas_size_options\nPaperMargin,paper_margin\nPaperOrientation,paper_orientation\nPaperSize,paper_size\nPar,par\nParControl,par_control\nParDenominator,par_denominator\nParNumerator,par_numerator\nParallelAsmReadThreads,parallel_asm_read_threads\nParallelDataConfig,parallel_data_config\nParallelDataDataLocation,parallel_data_data_location\nParallelDataNames,parallel_data_names\nParallelDataProperties,parallel_data_properties\nParallelDataPropertiesList,parallel_data_properties_list\nParallelLoadThreads,parallel_load_threads\nParallelism,parallelism\nParallelismConfiguration,parallelism_configuration\nParallelismConfigurationDescription,parallelism_configuration_description\nParallelismConfigurationUpdate,parallelism_configuration_update\nParallelismPerKPU,parallelism_per_kpu\nParallelismPerKPUUpdate,parallelism_per_kpu_update\nParallelismUpdate,parallelism_update\nParallelizationFactor,parallelization_factor\nParam,param\nParameter,parameter\nParameterAdditions,parameter_additions\nParameterAlreadyExists,parameter_already_exists\nParameterApplyErrorDescription,parameter_apply_error_description\nParameterApplyStatus,parameter_apply_status\nParameterAttribute,parameter_attribute\nParameterConstraints,parameter_constraints\nParameterControl,parameter_control\nParameterControlId,parameter_control_id\nParameterControls,parameter_controls\nParameterDateTimePickerControl,parameter_date_time_picker_control\nParameterDeclaration,parameter_declaration\nParameterDeclarations,parameter_declarations\nParameterDefinition,parameter_definition\nParameterDefinitions,parameter_definitions\nParameterDropDownControl,parameter_drop_down_control\nParameterFilters,parameter_filters\nParameterGroup,parameter_group\nParameterGroupAlreadyExistsFault,parameter_group_already_exists_fault\nParameterGroupFamily,parameter_group_family\nParameterGroupName,parameter_group_name\nParameterGroupNames,parameter_group_names\nParameterGroupNotFoundFault,parameter_group_not_found_fault\nParameterGroupQuotaExceededFault,parameter_group_quota_exceeded_fault\nParameterGroupStatus,parameter_group_status\nParameterGroups,parameter_groups\nParameterHistory,parameter_history\nParameterInlinePolicy,parameter_inline_policy\nParameterKey,parameter_key\nParameterLimitExceeded,parameter_limit_exceeded\nParameterListControl,parameter_list_control\nParameterMapEntry,parameter_map_entry\nParameterMapping,parameter_mapping\nParameterMaxVersionLimitExceeded,parameter_max_version_limit_exceeded\nParameterMetadata,parameter_metadata\nParameterName,parameter_name\nParameterNameValue,parameter_name_value\nParameterNameValues,parameter_name_values\nParameterNames,parameter_names\nParameterNotFound,parameter_not_found\nParameterObject,parameter_object\nParameterOverrides,parameter_overrides\nParameterPatternMismatchException,parameter_pattern_mismatch_exception\nParameterRange,parameter_range\nParameterRanges,parameter_ranges\nParameterRemovals,parameter_removals\nParameterSelectableValues,parameter_selectable_values\nParameterSliderControl,parameter_slider_control\nParameterSpec,parameter_spec\nParameterStringFilter,parameter_string_filter\nParameterTextAreaControl,parameter_text_area_control\nParameterTextFieldControl,parameter_text_field_control\nParameterType,parameter_type\nParameterValue,parameter_value\nParameterValueConfigurations,parameter_value_configurations\nParameterValueType,parameter_value_type\nParameterValues,parameter_values\nParameterVersion,parameter_version\nParameterVersionLabelLimitExceeded,parameter_version_label_limit_exceeded\nParameterVersionNotFound,parameter_version_not_found\nParameterizedStatement,parameterized_statement\nParameters,parameters\nParametersFilter,parameters_filter\nParametersInCacheKeyAndForwardedToOrigin,parameters_in_cache_key_and_forwarded_to_origin\nParametersToDelete,parameters_to_delete\nParametersToRemove,parameters_to_remove\nParametersValidTo,parameters_valid_to\nParametersValidUntilTimestamp,parameters_valid_until_timestamp\nParametricCloudWatchMonitoringConfiguration,parametric_cloud_watch_monitoring_configuration\nParametricConfigurationOverrides,parametric_configuration_overrides\nParametricMonitoringConfiguration,parametric_monitoring_configuration\nParametricS3MonitoringConfiguration,parametric_s3_monitoring_configuration\nPardot,pardot\nPardotConnectorProfileCredentials,pardot_connector_profile_credentials\nPardotConnectorProfileProperties,pardot_connector_profile_properties\nPardotSourceProperties,pardot_source_properties\nParent,parent\nParentArn,parent_arn\nParentAutomationExecutionId,parent_automation_execution_id\nParentBotNetwork,parent_bot_network\nParentChangeSetId,parent_change_set_id\nParentCommitDoesNotExistException,parent_commit_does_not_exist_exception\nParentCommitIdOutdatedException,parent_commit_id_outdated_exception\nParentCommitIdRequiredException,parent_commit_id_required_exception\nParentComponent,parent_component\nParentEntityUpdateRequest,parent_entity_update_request\nParentFolderArn,parent_folder_arn\nParentFolderId,parent_folder_id\nParentGroupId,parent_group_id\nParentHandshakeId,parent_handshake_id\nParentHyperParameterTuningJob,parent_hyper_parameter_tuning_job\nParentHyperParameterTuningJobs,parent_hyper_parameter_tuning_jobs\nParentId,parent_id\nParentJobId,parent_job_id\nParentLinks,parent_links\nParentName,parent_name\nParentNotFoundException,parent_not_found_exception\nParentPid,parent_pid\nParentReadinessScopes,parent_readiness_scopes\nParentRecoveryPointArn,parent_recovery_point_arn\nParentReference,parent_reference\nParentSavingsPlanOffering,parent_savings_plan_offering\nParentShardId,parent_shard_id\nParentShards,parent_shards\nParentSnapshotId,parent_snapshot_id\nParentUuid,parent_uuid\nParentVolumeId,parent_volume_id\nParentZoneId,parent_zone_id\nParentZoneName,parent_zone_name\nParents,parents\nParentsOfAlarmName,parents_of_alarm_name\nParquet,parquet\nParquetConfiguration,parquet_configuration\nParquetSerDe,parquet_ser_de\nParquetTimestampInMillisecond,parquet_timestamp_in_millisecond\nParquetVersion,parquet_version\nParseFailures,parse_failures\nParsedInputRecords,parsed_input_records\nParsingException,parsing_exception\nPart,part\nPartListElement,part_list_element\nPartNumber,part_number\nPartNumberMarker,part_number_marker\nPartOfSpeech,part_of_speech\nPartOfSpeechTag,part_of_speech_tag\nPartSizeInBytes,part_size_in_bytes\nPartialFailure,partial_failure\nPartialFailureMessage,partial_failure_message\nPartialFailureReasons,partial_failure_reasons\nPartialMatch,partial_match\nPartialMatches,partial_matches\nPartialResultsStability,partial_results_stability\nParticipant,participant\nParticipantCredentials,participant_credentials\nParticipantDetails,participant_details\nParticipantDetailsToAdd,participant_details_to_add\nParticipantId,participant_id\nParticipantPhoneNumbers,participant_phone_numbers\nParticipantRole,participant_role\nParticipantSummary,participant_summary\nParticipantTimerConfigList,participant_timer_config_list\nParticipantTimerConfiguration,participant_timer_configuration\nParticipantToken,participant_token\nParticipantTokenConfiguration,participant_token_configuration\nParticipantTokenCredentials,participant_token_credentials\nParticipants,participants\nParticipatingGateways,participating_gateways\nParticipatingResource,participating_resource\nParticipatingServer,participating_server\nParties,parties\nPartition,partition\nPartitionBy,partition_by\nPartitionColumn,partition_column\nPartitionColumns,partition_columns\nPartitionCount,partition_count\nPartitionEndDate,partition_end_date\nPartitionError,partition_error\nPartitionIncludeSchemaTable,partition_include_schema_table\nPartitionIndex,partition_index\nPartitionIndexDescriptor,partition_index_descriptor\nPartitionIndexDescriptorList,partition_index_descriptor_list\nPartitionIndexes,partition_indexes\nPartitionInput,partition_input\nPartitionInputList,partition_input_list\nPartitionKey,partition_key\nPartitionKeyPath,partition_key_path\nPartitionKeys,partition_keys\nPartitionLoadFrequency,partition_load_frequency\nPartitionNumber,partition_number\nPartitionObjects,partition_objects\nPartitionPredicate,partition_predicate\nPartitionSerialList,partition_serial_list\nPartitionStartDate,partition_start_date\nPartitionValueList,partition_value_list\nPartitionValues,partition_values\nPartitions,partitions\nPartitionsToDelete,partitions_to_delete\nPartitionsToGet,partitions_to_get\nPartnerAccountId,partner_account_id\nPartnerEventSource,partner_event_source\nPartnerEventSourceAccount,partner_event_source_account\nPartnerEventSourceAccounts,partner_event_source_accounts\nPartnerEventSources,partner_event_sources\nPartnerIntegrationInfo,partner_integration_info\nPartnerIntegrationInfoList,partner_integration_info_list\nPartnerIntegrationInputMessage,partner_integration_input_message\nPartnerIntegrationOutputMessage,partner_integration_output_message\nPartnerName,partner_name\nPartnerNotFoundFault,partner_not_found_fault\nPartnerProfileId,partner_profile_id\nPartnerType,partner_type\nPartnerWatermarking,partner_watermarking\nParts,parts\nPartsCount,parts_count\nPartyName,party_name\nPartyType,party_type\nPartyTypeString,party_type_string\nPassThroughSettings,pass_through_settings\nPassiveIp,passive_ip\nPassphrase,passphrase\nPassthroughBehavior,passthrough_behavior\nPassthroughControl,passthrough_control\nPassword,password\nPasswordCount,password_count\nPasswordData,password_data\nPasswordField,password_field\nPasswordLastUsed,password_last_used\nPasswordLength,password_length\nPasswordParam,password_param\nPasswordPolicy,password_policy\nPasswordPolicyType,password_policy_type\nPasswordPolicyViolationException,password_policy_violation_exception\nPasswordResetRequired,password_reset_required\nPasswordResetRequiredException,password_reset_required_exception\nPasswordReusePrevention,password_reuse_prevention\nPasswordVerifier,password_verifier\nPasswords,passwords\nPatInterval,pat_interval\nPatch,patch\nPatchBaselineId,patch_baseline_id\nPatchBaselineIdentity,patch_baseline_identity\nPatchComplianceData,patch_compliance_data\nPatchDocument,patch_document\nPatchFilter,patch_filter\nPatchFilterGroup,patch_filter_group\nPatchFilters,patch_filters\nPatchGroup,patch_group\nPatchGroupPatchBaselineMapping,patch_group_patch_baseline_mapping\nPatchGroups,patch_groups\nPatchLevel,patch_level\nPatchOperation,patch_operation\nPatchOrchestratorFilter,patch_orchestrator_filter\nPatchRule,patch_rule\nPatchRuleGroup,patch_rule_group\nPatchRules,patch_rules\nPatchSet,patch_set\nPatchSource,patch_source\nPatchStatus,patch_status\nPatchSummary,patch_summary\nPatchVersion,patch_version\nPatches,patches\nPath,path\nPathComponent,path_component\nPathDoesNotExistException,path_does_not_exist_exception\nPathFilter,path_filter\nPathFormat,path_format\nPathId,path_id\nPathLoss,path_loss\nPathMatch,path_match\nPathName,path_name\nPathOptions,path_options\nPathParameterValues,path_parameter_values\nPathPattern,path_pattern\nPathPatternConditionConfig,path_pattern_condition_config\nPathPatternConfig,path_pattern_config\nPathPrefix,path_prefix\nPathRequestFilter,path_request_filter\nPathRequiredException,path_required_exception\nPathResourceToId,path_resource_to_id\nPathStatement,path_statement\nPathStatementRequest,path_statement_request\nPathToObjectIdentifiers,path_to_object_identifiers\nPathToObjectIdentifiersList,path_to_object_identifiers_list\nPaths,paths\nPattern,pattern\nPatternName,pattern_name\nPatternSetName,pattern_set_name\nPatternTypeLimits,pattern_type_limits\nPatterns,patterns\nPauseCampaignRequest,pause_campaign_request\nPauseCluster,pause_cluster\nPauseClusterMessage,pause_cluster_message\nPauseClusterResult,pause_cluster_result\nPauseReplicationRequest,pause_replication_request\nPauseServiceRequest,pause_service_request\nPauseServiceResponse,pause_service_response\nPauseStateScheduleActionSettings,pause_state_schedule_action_settings\nPauseStateSettings,pause_state_settings\nPayer,payer\nPayerResponsibility,payer_responsibility\nPayload,payload\nPayloadConfig,payload_config\nPayloadData,payload_data\nPayloadFormatVersion,payload_format_version\nPayloadPart,payload_part\nPayloadTooLargeException,payload_too_large_exception\nPayloadType,payload_type\nPaymentDue,payment_due\nPaymentOption,payment_option\nPaymentTerm,payment_term\nPci,pci\nPciId,pci_id\nPcrControl,pcr_control\nPcrPeriod,pcr_period\nPcrPid,pcr_pid\nPdfReport,pdf_report\nPeakBandwidthInGbps,peak_bandwidth_in_gbps\nPeakCalculation,peak_calculation\nPeakRequestsPerSecond,peak_requests_per_second\nPeerAccountId,peer_account_id\nPeerAddress,peer_address\nPeerAsn,peer_asn\nPeerBgpAsn,peer_bgp_asn\nPeerCoreNetworkId,peer_core_network_id\nPeerEndpoint,peer_endpoint\nPeerEventEndpoint,peer_event_endpoint\nPeerLogs,peer_logs\nPeerOwnerId,peer_owner_id\nPeerRegion,peer_region\nPeerTransitGatewayId,peer_transit_gateway_id\nPeerVpcAwsAccountId,peer_vpc_aws_account_id\nPeerVpcId,peer_vpc_id\nPeerVpcResult,peer_vpc_result\nPeering,peering\nPeeringAttachmentId,peering_attachment_id\nPeeringAttachmentStatus,peering_attachment_status\nPeeringConnectionOptions,peering_connection_options\nPeeringConnectionOptionsRequest,peering_connection_options_request\nPeeringId,peering_id\nPeeringOptions,peering_options\nPeeringStatus,peering_status\nPeeringTgwInfo,peering_tgw_info\nPeeringType,peering_type\nPeerings,peerings\nPemEncodedCertificate,pem_encoded_certificate\nPending,pending\nPendingActions,pending_actions\nPendingAggregationRequest,pending_aggregation_request\nPendingAggregationRequests,pending_aggregation_requests\nPendingAuthenticationStrategy,pending_authentication_strategy\nPendingCapacity,pending_capacity\nPendingChange,pending_change\nPendingChanges,pending_changes\nPendingCloudWatchLogsExports,pending_cloud_watch_logs_exports\nPendingCloudwatchLogsExports,pending_cloudwatch_logs_exports\nPendingCreateStandbyWorkspacesRequest,pending_create_standby_workspaces_request\nPendingDataReplicationMetadata,pending_data_replication_metadata\nPendingDataReplicationMode,pending_data_replication_mode\nPendingDeletion,pending_deletion\nPendingDeletionWindowInDays,pending_deletion_window_in_days\nPendingDeploymentSummary,pending_deployment_summary\nPendingEngineVersion,pending_engine_version\nPendingExpirationSubscribedDomains,pending_expiration_subscribed_domains\nPendingHostInstanceType,pending_host_instance_type\nPendingHuman,pending_human\nPendingImportedDeviceCount,pending_imported_device_count\nPendingLdapServerMetadata,pending_ldap_server_metadata\nPendingLogDeliveryConfiguration,pending_log_delivery_configuration\nPendingLogs,pending_logs\nPendingMaintenance,pending_maintenance\nPendingMaintenanceAction,pending_maintenance_action\nPendingMaintenanceActionDetails,pending_maintenance_action_details\nPendingMaintenanceActions,pending_maintenance_actions\nPendingMaintenanceActionsMessage,pending_maintenance_actions_message\nPendingModifiedRelationalDatabaseValues,pending_modified_relational_database_values\nPendingModifiedServiceUpdate,pending_modified_service_update\nPendingModifiedValues,pending_modified_values\nPendingProductionVariantSummary,pending_production_variant_summary\nPendingProperties,pending_properties\nPendingRequests,pending_requests\nPendingResource,pending_resource\nPendingReviewVersion,pending_review_version\nPendingSecurityGroups,pending_security_groups\nPendingStandbyRequests,pending_standby_requests\nPendingTaskCount,pending_task_count\nPendingUpdates,pending_updates\nPendingVerification,pending_verification\nPendingWindowInDays,pending_window_in_days\nPerHourPartition,per_hour_partition\nPerObjectStatus,per_object_status\nPerUnitStorageThroughput,per_unit_storage_throughput\nPercentComplete,percent_complete\nPercentDone,percent_done\nPercentEnabled,percent_enabled\nPercentOfClientLocationImpacted,percent_of_client_location_impacted\nPercentOfGraphUtilization,percent_of_graph_utilization\nPercentOfGraphUtilizationUpdatedTime,percent_of_graph_utilization_updated_time\nPercentOfTotalTrafficImpacted,percent_of_total_traffic_impacted\nPercentPair,percent_pair\nPercentProgress,percent_progress\nPercentRange,percent_range\nPercentTraffic,percent_traffic\nPercentVisibleRange,percent_visible_range\nPercentage,percentage\nPercentageComplete,percentage_complete\nPercentageCompleteOnRollback,percentage_complete_on_rollback\nPercentageDisplayFormatConfiguration,percentage_display_format_configuration\nPercentageValue,percentage_value\nPercentile,percentile\nPercentileAggregation,percentile_aggregation\nPercentileValue,percentile_value\nPerformAutoML,perform_auto_ml\nPerformCheckOnly,perform_check_only\nPerformHPO,perform_hpo\nPerformance,performance\nPerformanceInsightsEnabled,performance_insights_enabled\nPerformanceInsightsKMSKeyId,performance_insights_kms_key_id\nPerformanceInsightsKmsKeyId,performance_insights_kms_key_id\nPerformanceInsightsMetric,performance_insights_metric\nPerformanceInsightsMetricDimensionGroup,performance_insights_metric_dimension_group\nPerformanceInsightsMetricQuery,performance_insights_metric_query\nPerformanceInsightsMetrics,performance_insights_metrics\nPerformanceInsightsMetricsDetail,performance_insights_metrics_detail\nPerformanceInsightsReferenceComparisonValues,performance_insights_reference_comparison_values\nPerformanceInsightsReferenceData,performance_insights_reference_data\nPerformanceInsightsReferenceMetric,performance_insights_reference_metric\nPerformanceInsightsReferenceScalar,performance_insights_reference_scalar\nPerformanceInsightsRetentionPeriod,performance_insights_retention_period\nPerformanceInsightsStat,performance_insights_stat\nPerformanceLocalHealthEventsConfig,performance_local_health_events_config\nPerformanceMeasurement,performance_measurement\nPerformanceMetrics,performance_metrics\nPerformanceMode,performance_mode\nPerformanceScoreThreshold,performance_score_threshold\nPeriod,period\nPeriodAlignment,period_alignment\nPeriodInSeconds,period_in_seconds\nPeriodOverPeriod,period_over_period\nPeriodOverPeriodComputation,period_over_period_computation\nPeriodSize,period_size\nPeriodTimeGranularity,period_time_granularity\nPeriodToDate,period_to_date\nPeriodToDateComputation,period_to_date_computation\nPeriodTriggers,period_triggers\nPeriodType,period_type\nPeriodUnit,period_unit\nPeriodValue,period_value\nPeriodsBackward,periods_backward\nPeriodsForward,periods_forward\nPermanent,permanent\nPermanentDeletionTimeInDays,permanent_deletion_time_in_days\nPermanentRestore,permanent_restore\nPermission,permission\nPermissionAlreadyExistsException,permission_already_exists_exception\nPermissionConfiguration,permission_configuration\nPermissionEntry,permission_entry\nPermissionGroup,permission_group\nPermissionGroupByUser,permission_group_by_user\nPermissionGroupParams,permission_group_params\nPermissionInfo,permission_info\nPermissionLimitExceededException,permission_limit_exceeded_exception\nPermissionModel,permission_model\nPermissionPolicy,permission_policy\nPermissionSet,permission_set\nPermissionSetArn,permission_set_arn\nPermissionSetProvisioningStatus,permission_set_provisioning_status\nPermissionSetProvisioningStatusMetadata,permission_set_provisioning_status_metadata\nPermissionSets,permission_sets\nPermissionSetsProvisioningStatus,permission_sets_provisioning_status\nPermissionState,permission_state\nPermissionType,permission_type\nPermissionTypeMismatchException,permission_type_mismatch_exception\nPermissionValues,permission_values\nPermissionVersionsLimitExceededException,permission_versions_limit_exceeded_exception\nPermissions,permissions\nPermissionsBoundary,permissions_boundary\nPermissionsBoundaryArn,permissions_boundary_arn\nPermissionsBoundaryDecisionDetail,permissions_boundary_decision_detail\nPermissionsBoundaryPolicyInputList,permissions_boundary_policy_input_list\nPermissionsBoundaryType,permissions_boundary_type\nPermissionsBoundaryUsageCount,permissions_boundary_usage_count\nPermissionsMode,permissions_mode\nPermissionsWithGrantOption,permissions_with_grant_option\nPermittedFileTypes,permitted_file_types\nPermittedPublicSecurityGroupRuleRanges,permitted_public_security_group_rule_ranges\nPersistence,persistence\nPersistent,persistent\nPersistentChat,persistent_chat\nPersistentStorage,persistent_storage\nPersistentStorageConfiguration,persistent_storage_configuration\nPerson,person\nPersonDetail,person_detail\nPersonDetection,person_detection\nPersonMatch,person_match\nPersona,persona\nPersonalEmailAddress,personal_email_address\nPersonalPIN,personal_pin\nPersonalizationThresholdSeconds,personalization_threshold_seconds\nPersonas,personas\nPersonasSummary,personas_summary\nPersons,persons\nPersonsIndeterminate,persons_indeterminate\nPersonsWithRequiredEquipment,persons_with_required_equipment\nPersonsWithoutRequiredEquipment,persons_without_required_equipment\nPhase,phase\nPhase1DHGroupNumbers,phase1_dh_group_numbers\nPhase1DHGroupNumbersListValue,phase1_dh_group_numbers_list_value\nPhase1DHGroupNumbersRequestListValue,phase1_dh_group_numbers_request_list_value\nPhase1DhGroupNumbers,phase1_dh_group_numbers\nPhase1EncryptionAlgorithms,phase1_encryption_algorithms\nPhase1EncryptionAlgorithmsListValue,phase1_encryption_algorithms_list_value\nPhase1EncryptionAlgorithmsRequestListValue,phase1_encryption_algorithms_request_list_value\nPhase1IntegrityAlgorithms,phase1_integrity_algorithms\nPhase1IntegrityAlgorithmsListValue,phase1_integrity_algorithms_list_value\nPhase1IntegrityAlgorithmsRequestListValue,phase1_integrity_algorithms_request_list_value\nPhase1LifetimeSeconds,phase1_lifetime_seconds\nPhase2DHGroupNumbers,phase2_dh_group_numbers\nPhase2DHGroupNumbersListValue,phase2_dh_group_numbers_list_value\nPhase2DHGroupNumbersRequestListValue,phase2_dh_group_numbers_request_list_value\nPhase2DhGroupNumbers,phase2_dh_group_numbers\nPhase2EncryptionAlgorithms,phase2_encryption_algorithms\nPhase2EncryptionAlgorithmsListValue,phase2_encryption_algorithms_list_value\nPhase2EncryptionAlgorithmsRequestListValue,phase2_encryption_algorithms_request_list_value\nPhase2IntegrityAlgorithms,phase2_integrity_algorithms\nPhase2IntegrityAlgorithmsListValue,phase2_integrity_algorithms_list_value\nPhase2IntegrityAlgorithmsRequestListValue,phase2_integrity_algorithms_request_list_value\nPhase2LifetimeSeconds,phase2_lifetime_seconds\nPhaseContext,phase_context\nPhaseControl,phase_control\nPhases,phases\nPhoneConfig,phone_config\nPhoneNumber,phone_number\nPhoneNumberArn,phone_number_arn\nPhoneNumberAssociation,phone_number_association\nPhoneNumberCapabilities,phone_number_capabilities\nPhoneNumberCountries,phone_number_countries\nPhoneNumberCountry,phone_number_country\nPhoneNumberCountryCode,phone_number_country_code\nPhoneNumberCountryCodes,phone_number_country_codes\nPhoneNumberDescription,phone_number_description\nPhoneNumberError,phone_number_error\nPhoneNumberErrors,phone_number_errors\nPhoneNumberField,phone_number_field\nPhoneNumberFields,phone_number_fields\nPhoneNumberFilter,phone_number_filter\nPhoneNumberId,phone_number_id\nPhoneNumberIds,phone_number_ids\nPhoneNumberInformation,phone_number_information\nPhoneNumberOrder,phone_number_order\nPhoneNumberOrderId,phone_number_order_id\nPhoneNumberOrders,phone_number_orders\nPhoneNumberPoolCountries,phone_number_pool_countries\nPhoneNumberPrefix,phone_number_prefix\nPhoneNumberQuickConnectConfig,phone_number_quick_connect_config\nPhoneNumberStatus,phone_number_status\nPhoneNumberSummary,phone_number_summary\nPhoneNumberSummaryList,phone_number_summary_list\nPhoneNumberType,phone_number_type\nPhoneNumberTypes,phone_number_types\nPhoneNumberValidateRequest,phone_number_validate_request\nPhoneNumberValidateResponse,phone_number_validate_response\nPhoneNumbers,phone_numbers\nPhoneType,phone_type\nPhoneTypeCode,phone_type_code\nPhrases,phrases\nPhysicalConnectionRequirements,physical_connection_requirements\nPhysicalId,physical_id\nPhysicalNetworkInterface,physical_network_interface\nPhysicalResource,physical_resource\nPhysicalResourceId,physical_resource_id\nPhysicalResourceIdContext,physical_resource_id_context\nPhysicalResourceIdContextKeyValuePair,physical_resource_id_context_key_value_pair\nPhysicalTableId,physical_table_id\nPhysicalTableMap,physical_table_map\nPickupDetails,pickup_details\nPid,pid\nPidMode,pid_mode\nPids,pids\nPieChartAggregatedFieldWells,pie_chart_aggregated_field_wells\nPieChartConfiguration,pie_chart_configuration\nPieChartFieldWells,pie_chart_field_wells\nPieChartSortConfiguration,pie_chart_sort_configuration\nPieChartVisual,pie_chart_visual\nPiiEntitiesDetectionJobFilter,pii_entities_detection_job_filter\nPiiEntitiesDetectionJobProperties,pii_entities_detection_job_properties\nPiiEntitiesDetectionJobPropertiesList,pii_entities_detection_job_properties_list\nPiiEntity,pii_entity\nPiiEntityTypes,pii_entity_types\nPiiOutputDataConfig,pii_output_data_config\nPiiType,pii_type\nPillarDifference,pillar_difference\nPillarDifferences,pillar_differences\nPillarId,pillar_id\nPillarMetric,pillar_metric\nPillarName,pillar_name\nPillarNotes,pillar_notes\nPillarPriorities,pillar_priorities\nPillarReviewSummaries,pillar_review_summaries\nPillarReviewSummary,pillar_review_summary\nPillars,pillars\nPilotPower,pilot_power\nPinBlock,pin_block\nPinBlockFormat,pin_block_format\nPinData,pin_data\nPinDataLength,pin_data_length\nPinOffset,pin_offset\nPinValidationData,pin_validation_data\nPinValidationDataPadCharacter,pin_validation_data_pad_character\nPinVerificationKeyIndex,pin_verification_key_index\nPingResponse,ping_response\nPingSlotDr,ping_slot_dr\nPingSlotFreq,ping_slot_freq\nPingSlotPeriod,ping_slot_period\nPingStatus,ping_status\nPinned,pinned\nPinnedFieldOptions,pinned_field_options\nPinnedLeftFields,pinned_left_fields\nPinpointDestination,pinpoint_destination\nPipe,pipe\nPipeEnrichmentHttpParameters,pipe_enrichment_http_parameters\nPipeEnrichmentParameters,pipe_enrichment_parameters\nPipeSourceActiveMQBrokerParameters,pipe_source_active_mq_broker_parameters\nPipeSourceDynamoDBStreamParameters,pipe_source_dynamo_db_stream_parameters\nPipeSourceKinesisStreamParameters,pipe_source_kinesis_stream_parameters\nPipeSourceManagedStreamingKafkaParameters,pipe_source_managed_streaming_kafka_parameters\nPipeSourceParameters,pipe_source_parameters\nPipeSourceRabbitMQBrokerParameters,pipe_source_rabbit_mq_broker_parameters\nPipeSourceSelfManagedKafkaParameters,pipe_source_self_managed_kafka_parameters\nPipeSourceSqsQueueParameters,pipe_source_sqs_queue_parameters\nPipeTargetBatchJobParameters,pipe_target_batch_job_parameters\nPipeTargetCloudWatchLogsParameters,pipe_target_cloud_watch_logs_parameters\nPipeTargetEcsTaskParameters,pipe_target_ecs_task_parameters\nPipeTargetEventBridgeEventBusParameters,pipe_target_event_bridge_event_bus_parameters\nPipeTargetHttpParameters,pipe_target_http_parameters\nPipeTargetKinesisStreamParameters,pipe_target_kinesis_stream_parameters\nPipeTargetLambdaFunctionParameters,pipe_target_lambda_function_parameters\nPipeTargetParameters,pipe_target_parameters\nPipeTargetRedshiftDataParameters,pipe_target_redshift_data_parameters\nPipeTargetSageMakerPipelineParameters,pipe_target_sage_maker_pipeline_parameters\nPipeTargetSqsQueueParameters,pipe_target_sqs_queue_parameters\nPipeTargetStateMachineParameters,pipe_target_state_machine_parameters\nPipeline,pipeline\nPipelineActivity,pipeline_activity\nPipelineArn,pipeline_arn\nPipelineBlueprint,pipeline_blueprint\nPipelineBlueprintSummary,pipeline_blueprint_summary\nPipelineConfig,pipeline_config\nPipelineConfigurationBody,pipeline_configuration_body\nPipelineContext,pipeline_context\nPipelineDeclaration,pipeline_declaration\nPipelineDefinition,pipeline_definition\nPipelineDefinitionS3Location,pipeline_definition_s3_location\nPipelineDeletedException,pipeline_deleted_exception\nPipelineDescription,pipeline_description\nPipelineDetail,pipeline_detail\nPipelineDetails,pipeline_details\nPipelineDisplayName,pipeline_display_name\nPipelineExecution,pipeline_execution\nPipelineExecutionArn,pipeline_execution_arn\nPipelineExecutionDescription,pipeline_execution_description\nPipelineExecutionDisplayName,pipeline_execution_display_name\nPipelineExecutionFailureReason,pipeline_execution_failure_reason\nPipelineExecutionNotFoundException,pipeline_execution_not_found_exception\nPipelineExecutionNotStoppableException,pipeline_execution_not_stoppable_exception\nPipelineExecutionStatus,pipeline_execution_status\nPipelineExecutionStep,pipeline_execution_step\nPipelineExecutionStepMetadata,pipeline_execution_step_metadata\nPipelineExecutionSteps,pipeline_execution_steps\nPipelineExecutionSummaries,pipeline_execution_summaries\nPipelineExecutionSummary,pipeline_execution_summary\nPipelineExperimentConfig,pipeline_experiment_config\nPipelineId,pipeline_id\nPipelineIdName,pipeline_id_name\nPipelineInfo,pipeline_info\nPipelineLockingSettings,pipeline_locking_settings\nPipelineMetadata,pipeline_metadata\nPipelineName,pipeline_name\nPipelineNameInUseException,pipeline_name_in_use_exception\nPipelineNamePrefix,pipeline_name_prefix\nPipelineNotFoundException,pipeline_not_found_exception\nPipelineObject,pipeline_object\nPipelineOutputConfig,pipeline_output_config\nPipelineParameterList,pipeline_parameter_list\nPipelineParameters,pipeline_parameters\nPipelinePauseStateSettings,pipeline_pause_state_settings\nPipelineStatus,pipeline_status\nPipelineStatusReason,pipeline_status_reason\nPipelineSummaries,pipeline_summaries\nPipelineSummary,pipeline_summary\nPipelineVersionNotFoundException,pipeline_version_not_found_exception\nPipelines,pipelines\nPipelinesRunningCount,pipelines_running_count\nPipes,pipes\nPitch,pitch\nPivotFieldSortOptions,pivot_field_sort_options\nPivotTableAggregatedFieldWells,pivot_table_aggregated_field_wells\nPivotTableCellConditionalFormatting,pivot_table_cell_conditional_formatting\nPivotTableConditionalFormatting,pivot_table_conditional_formatting\nPivotTableConditionalFormattingOption,pivot_table_conditional_formatting_option\nPivotTableConditionalFormattingScope,pivot_table_conditional_formatting_scope\nPivotTableConfiguration,pivot_table_configuration\nPivotTableDataPathOption,pivot_table_data_path_option\nPivotTableFieldCollapseStateOption,pivot_table_field_collapse_state_option\nPivotTableFieldCollapseStateTarget,pivot_table_field_collapse_state_target\nPivotTableFieldOption,pivot_table_field_option\nPivotTableFieldOptions,pivot_table_field_options\nPivotTableFieldSubtotalOptions,pivot_table_field_subtotal_options\nPivotTableFieldWells,pivot_table_field_wells\nPivotTableOptions,pivot_table_options\nPivotTablePaginatedReportOptions,pivot_table_paginated_report_options\nPivotTableRowsLabelOptions,pivot_table_rows_label_options\nPivotTableSortBy,pivot_table_sort_by\nPivotTableSortConfiguration,pivot_table_sort_configuration\nPivotTableTotalOptions,pivot_table_total_options\nPivotTableVisual,pivot_table_visual\nPivotTotalOptions,pivot_total_options\nPixelAnomaly,pixel_anomaly\nPixelPercent,pixel_percent\nPlace,place\nPlaceGeometry,place_geometry\nPlaceId,place_id\nPlacedPlayerSession,placed_player_session\nPlacedPlayerSessions,placed_player_sessions\nPlaceholder,placeholder\nPlaceholderOptions,placeholder_options\nPlacement,placement\nPlacementArn,placement_arn\nPlacementConstraint,placement_constraint\nPlacementConstraints,placement_constraints\nPlacementDescription,placement_description\nPlacementGroup,placement_group\nPlacementGroupArn,placement_group_arn\nPlacementGroupConfig,placement_group_config\nPlacementGroupConfigs,placement_group_configs\nPlacementGroupInfo,placement_group_info\nPlacementGroups,placement_groups\nPlacementId,placement_id\nPlacementResponse,placement_response\nPlacementStatistics,placement_statistics\nPlacementStrategies,placement_strategies\nPlacementStrategy,placement_strategy\nPlacementSummary,placement_summary\nPlacementTemplate,placement_template\nPlacementTenancy,placement_tenancy\nPlacementType,placement_type\nPlainText,plain_text\nPlainTextMessage,plain_text_message\nPlainTextMessageType,plain_text_message_type\nPlaintext,plaintext\nPlan,plan\nPlanId,plan_id\nPlanName,plan_name\nPlanType,plan_type\nPlannedBudgetLimits,planned_budget_limits\nPlannedEndTime,planned_end_time\nPlannedStartTime,planned_start_time\nPlanningStatistics,planning_statistics\nPlanningTimeMillis,planning_time_millis\nPlatform,platform\nPlatformApplication,platform_application\nPlatformApplicationArn,platform_application_arn\nPlatformApplicationDisabledException,platform_application_disabled_exception\nPlatformApplications,platform_applications\nPlatformArn,platform_arn\nPlatformBranchLifecycleState,platform_branch_lifecycle_state\nPlatformBranchName,platform_branch_name\nPlatformBranchSummary,platform_branch_summary\nPlatformBranchSummaryList,platform_branch_summary_list\nPlatformCategory,platform_category\nPlatformCommand,platform_command\nPlatformDefinitionBundle,platform_definition_bundle\nPlatformDescription,platform_description\nPlatformDetails,platform_details\nPlatformDevice,platform_device\nPlatformDifferences,platform_differences\nPlatformFilter,platform_filter\nPlatformFramework,platform_framework\nPlatformIdentifier,platform_identifier\nPlatformInput,platform_input\nPlatformLifecycleState,platform_lifecycle_state\nPlatformName,platform_name\nPlatformNotSupportedException,platform_not_supported_exception\nPlatformOwner,platform_owner\nPlatformProgrammingLanguage,platform_programming_language\nPlatformScriptKey,platform_script_key\nPlatformSoftwareVersion,platform_software_version\nPlatformStatus,platform_status\nPlatformSummary,platform_summary\nPlatformSummaryList,platform_summary_list\nPlatformTaskDefinitionIncompatibilityException,platform_task_definition_incompatibility_exception\nPlatformType,platform_type\nPlatformTypes,platform_types\nPlatformUnknownException,platform_unknown_exception\nPlatformVersion,platform_version\nPlatformVersionStillReferencedException,platform_version_still_referenced_exception\nPlatforms,platforms\nPlayReadyDrm,play_ready_drm\nPlayback,playback\nPlaybackCompletionEvent,playback_completion_event\nPlaybackConfiguration,playback_configuration\nPlaybackConfigurationArn,playback_configuration_arn\nPlaybackConfigurationName,playback_configuration_name\nPlaybackDeviceCompatibility,playback_device_compatibility\nPlaybackEndpointPrefix,playback_endpoint_prefix\nPlaybackInterruptionEvent,playback_interruption_event\nPlaybackKeyPair,playback_key_pair\nPlaybackKeyPairSummary,playback_key_pair_summary\nPlaybackMode,playback_mode\nPlaybackUrl,playback_url\nPlayer,player\nPlayerAttributes,player_attributes\nPlayerData,player_data\nPlayerDataMap,player_data_map\nPlayerId,player_id\nPlayerIds,player_ids\nPlayerLatencies,player_latencies\nPlayerLatency,player_latency\nPlayerLatencyPolicies,player_latency_policies\nPlayerLatencyPolicy,player_latency_policy\nPlayerSession,player_session\nPlayerSessionCreationPolicy,player_session_creation_policy\nPlayerSessionId,player_session_id\nPlayerSessionStatusFilter,player_session_status_filter\nPlayerSessions,player_sessions\nPlayers,players\nPlaylist,playlist\nPlaylistType,playlist_type\nPlaylistWindowSeconds,playlist_window_seconds\nPlaylists,playlists\nPlugin,plugin\nPluginDescription,plugin_description\nPluginName,plugin_name\nPluginSummary,plugin_summary\nPluginsS3ObjectVersion,plugins_s3_object_version\nPluginsS3Path,plugins_s3_path\nPmtInterval,pmt_interval\nPmtPid,pmt_pid\nPnOffset,pn_offset\nPoAttributes,po_attributes\nPoDetailAttributes,po_detail_attributes\nPoint,point\nPointInTimeRecovery,point_in_time_recovery\nPointInTimeRecoveryDescription,point_in_time_recovery_description\nPointInTimeRecoveryEnabled,point_in_time_recovery_enabled\nPointInTimeRecoverySpecification,point_in_time_recovery_specification\nPointInTimeRecoveryStatus,point_in_time_recovery_status\nPointInTimeRecoverySummary,point_in_time_recovery_summary\nPointInTimeRecoveryUnavailableException,point_in_time_recovery_unavailable_exception\nPointInTimeRestoreNotEnabledFault,point_in_time_restore_not_enabled_fault\nPointOfInterest,point_of_interest\nPointStyleOptions,point_style_options\nPointsOfInterest,points_of_interest\nPoisEndpoint,pois_endpoint\nPolicies,policies\nPoliciesGrantingServiceAccess,policies_granting_service_access\nPoliciesLimitExceededException,policies_limit_exceeded_exception\nPoliciesType,policies_type\nPolicy,policy\nPolicyARN,policy_arn\nPolicyARNType,policy_arn_type\nPolicyArn,policy_arn\nPolicyArns,policy_arns\nPolicyAttachment,policy_attachment\nPolicyAttribute,policy_attribute\nPolicyAttributeDescription,policy_attribute_description\nPolicyAttributeDescriptions,policy_attribute_descriptions\nPolicyAttributeTypeDescription,policy_attribute_type_description\nPolicyAttributeTypeDescriptions,policy_attribute_type_descriptions\nPolicyAttributes,policy_attributes\nPolicyChangesInProgressException,policy_changes_in_progress_exception\nPolicyComplianceDetail,policy_compliance_detail\nPolicyComplianceStatus,policy_compliance_status\nPolicyComplianceStatusList,policy_compliance_status_list\nPolicyContent,policy_content\nPolicyCountLimitExceededException,policy_count_limit_exceeded_exception\nPolicyDescription,policy_description\nPolicyDescriptions,policy_descriptions\nPolicyDescriptorType,policy_descriptor_type\nPolicyDetail,policy_detail\nPolicyDetails,policy_details\nPolicyDocument,policy_document\nPolicyDurationSeconds,policy_duration_seconds\nPolicyEnabled,policy_enabled\nPolicyEnforcedException,policy_enforced_exception\nPolicyErrorException,policy_error_exception\nPolicyErrors,policy_errors\nPolicyEvaluationException,policy_evaluation_exception\nPolicyExistsCondition,policy_exists_condition\nPolicyFilter,policy_filter\nPolicyGeneration,policy_generation\nPolicyGenerationDetails,policy_generation_details\nPolicyGrantingServiceAccess,policy_granting_service_access\nPolicyGroup,policy_group\nPolicyGroups,policy_groups\nPolicyHash,policy_hash\nPolicyHashCondition,policy_hash_condition\nPolicyId,policy_id\nPolicyIds,policy_ids\nPolicyInJson,policy_in_json\nPolicyInUseException,policy_in_use_exception\nPolicyInformation,policy_information\nPolicyInputList,policy_input_list\nPolicyItem,policy_item\nPolicyLengthExceededException,policy_length_exceeded_exception\nPolicyLevels,policy_levels\nPolicyList,policy_list\nPolicyName,policy_name\nPolicyNames,policy_names\nPolicyNotAttachableException,policy_not_attachable_exception\nPolicyNotAttachedException,policy_not_attached_exception\nPolicyNotFound,policy_not_found\nPolicyNotFoundException,policy_not_found_exception\nPolicyOption,policy_option\nPolicyOwner,policy_owner\nPolicyParameter,policy_parameter\nPolicyPeriodInMinutes,policy_period_in_minutes\nPolicyQualifierId,policy_qualifier_id\nPolicyQualifierInfo,policy_qualifier_info\nPolicyQualifiers,policy_qualifiers\nPolicyReference,policy_reference\nPolicyReferenceName,policy_reference_name\nPolicyRevisionId,policy_revision_id\nPolicyRole,policy_role\nPolicyRoles,policy_roles\nPolicyRule,policy_rule\nPolicyRuleNumber,policy_rule_number\nPolicyRuntime,policy_runtime\nPolicySchema,policy_schema\nPolicySizeLimitExceededException,policy_size_limit_exceeded_exception\nPolicySourceArn,policy_source_arn\nPolicyStatus,policy_status\nPolicyStoreItem,policy_store_item\nPolicySummary,policy_summary\nPolicyTargetSummary,policy_target_summary\nPolicyTemplateItem,policy_template_item\nPolicyText,policy_text\nPolicyToPath,policy_to_path\nPolicyToPathList,policy_to_path_list\nPolicyType,policy_type\nPolicyTypeAlreadyEnabledException,policy_type_already_enabled_exception\nPolicyTypeDescription,policy_type_description\nPolicyTypeDescriptions,policy_type_descriptions\nPolicyTypeName,policy_type_name\nPolicyTypeNames,policy_type_names\nPolicyTypeNotAvailableForOrganizationException,policy_type_not_available_for_organization_exception\nPolicyTypeNotEnabledException,policy_type_not_enabled_exception\nPolicyTypeNotFoundException,policy_type_not_found_exception\nPolicyTypeScope,policy_type_scope\nPolicyTypeSummary,policy_type_summary\nPolicyTypes,policy_types\nPolicyUpdateToken,policy_update_token\nPolicyUsageFilter,policy_usage_filter\nPolicyUser,policy_user\nPolicyUsers,policy_users\nPolicyValidationPassed,policy_validation_passed\nPolicyVariables,policy_variables\nPolicyVersion,policy_version\nPolicyVersionId,policy_version_id\nPolicyVersionIdentifier,policy_version_identifier\nPolicyVersionList,policy_version_list\nPoliticalView,political_view\nPollForActivityTaskInput,poll_for_activity_task_input\nPollForDecisionTaskInput,poll_for_decision_task_input\nPollForJobsInput,poll_for_jobs_input\nPollForJobsOutput,poll_for_jobs_output\nPollForTaskInput,poll_for_task_input\nPollForTaskOutput,poll_for_task_output\nPollForThirdPartyJobsInput,poll_for_third_party_jobs_input\nPollForThirdPartyJobsOutput,poll_for_third_party_jobs_output\nPollTimeoutMs,poll_timeout_ms\nPollingTime,polling_time\nPolygon,polygon\nPolygonGeometryInput,polygon_geometry_input\nPoolARN,pool_arn\nPoolARNs,pool_arns\nPoolAddressRange,pool_address_range\nPoolAddressRanges,pool_address_ranges\nPoolArn,pool_arn\nPoolCidrBlock,pool_cidr_block\nPoolCidrBlocks,pool_cidr_blocks\nPoolCidrs,pool_cidrs\nPoolCount,pool_count\nPoolDepth,pool_depth\nPoolEntryDate,pool_entry_date\nPoolFilter,pool_filter\nPoolId,pool_id\nPoolIds,pool_ids\nPoolInfo,pool_info\nPoolInformation,pool_information\nPoolInfos,pool_infos\nPoolName,pool_name\nPoolOriginationIdentitiesFilter,pool_origination_identities_filter\nPoolSize,pool_size\nPoolState,pool_state\nPoolStatus,pool_status\nPoolTagSpecifications,pool_tag_specifications\nPools,pools\nPopulationSize,population_size\nPort,port\nPortForwardingConfig,port_forwarding_config\nPortInfo,port_info\nPortMapping,port_mapping\nPortMappings,port_mappings\nPortName,port_name\nPortNumber,port_number\nPortOverride,port_override\nPortOverrides,port_overrides\nPortProbeAction,port_probe_action\nPortProbeDetail,port_probe_detail\nPortProbeDetails,port_probe_details\nPortRange,port_range\nPortRangeFilter,port_range_filter\nPortRangeFromTo,port_range_from_to\nPortRanges,port_ranges\nPortRequired,port_required\nPortSet,port_set\nPortSets,port_sets\nPortal,portal\nPortalResource,portal_resource\nPortalStatus,portal_status\nPortalSummary,portal_summary\nPortfolioDetail,portfolio_detail\nPortfolioDetails,portfolio_details\nPortfolioId,portfolio_id\nPortfolioShareDetail,portfolio_share_detail\nPortfolioShareDetails,portfolio_share_details\nPortfolioShareToken,portfolio_share_token\nPortfolioShareType,portfolio_share_type\nPose,pose\nPosition,position\nPositionConfigurationItem,position_configuration_item\nPositionConfigurationList,position_configuration_list\nPositionFiltering,position_filtering\nPositionProperties,position_properties\nPositionSolverConfigurations,position_solver_configurations\nPositionSolverDetails,position_solver_details\nPositionalAccuracy,positional_accuracy\nPositionalConstraint,positional_constraint\nPositioning,positioning\nPositive,positive\nPositiveColor,positive_color\nPosixPermissions,posix_permissions\nPosixProfile,posix_profile\nPosixUser,posix_user\nPossibleRemediationAction,possible_remediation_action\nPossibleRemediationActions,possible_remediation_actions\nPossibleSecurityGroupRemediationActions,possible_security_group_remediation_actions\nPostAction,post_action\nPostAgentProfileRequest,post_agent_profile_request\nPostAnalyticsProcessorSourceUri,post_analytics_processor_source_uri\nPostAuthentication,post_authentication\nPostAuthenticationLoginBanner,post_authentication_login_banner\nPostCallAnalyticsSettings,post_call_analytics_settings\nPostCommentForComparedCommitInput,post_comment_for_compared_commit_input\nPostCommentForComparedCommitOutput,post_comment_for_compared_commit_output\nPostCommentForPullRequestInput,post_comment_for_pull_request_input\nPostCommentForPullRequestOutput,post_comment_for_pull_request_output\nPostCommentReplyInput,post_comment_reply_input\nPostCommentReplyOutput,post_comment_reply_output\nPostConfirmation,post_confirmation\nPostContentRequest,post_content_request\nPostContentResponse,post_content_response\nPostDialogCodeHookInvocationSpecification,post_dialog_code_hook_invocation_specification\nPostExtractionHookConfiguration,post_extraction_hook_configuration\nPostFilterSharpenStrength,post_filter_sharpen_strength\nPostFilterSharpening,post_filter_sharpening\nPostFulfillmentStatusSpecification,post_fulfillment_status_specification\nPostLaunchActions,post_launch_actions\nPostLaunchActionsStatus,post_launch_actions_status\nPostProcessFirewallManagerRuleGroups,post_process_firewall_manager_rule_groups\nPostSetupScriptDetails,post_setup_script_details\nPostTemporalSharpening,post_temporal_sharpening\nPostTemporalSharpeningStrength,post_temporal_sharpening_strength\nPostTextRequest,post_text_request\nPostTextResponse,post_text_response\nPostToConnectionRequest,post_to_connection_request\nPostTrainingConstraints,post_training_constraints\nPostTrainingReport,post_training_report\nPostalCode,postal_code\nPostgreSQLCatalogSource,postgre_sql_catalog_source\nPostgreSQLCatalogTarget,postgre_sql_catalog_target\nPostgreSQLSettings,postgre_sql_settings\nPostgreSqlDataProviderSettings,postgre_sql_data_provider_settings\nPostgreSqlParameters,postgre_sql_parameters\nPostureComplianceStatuses,posture_compliance_statuses\nPotentialMatches,potential_matches\nPowerConnector,power_connector\nPowerDrawKva,power_draw_kva\nPowerFeedDrop,power_feed_drop\nPowerKva,power_kva\nPowerPhase,power_phase\nPrAllowed,pr_allowed\nPreAction,pre_action\nPreAuthentication,pre_authentication\nPreAuthenticationLoginBanner,pre_authentication_login_banner\nPreCoPassword,pre_co_password\nPreExtractionHookConfiguration,pre_extraction_hook_configuration\nPreHumanTaskLambdaArn,pre_human_task_lambda_arn\nPreProcessFirewallManagerRuleGroups,pre_process_firewall_manager_rule_groups\nPreSharedKey,pre_shared_key\nPreSignUp,pre_sign_up\nPreSignedLogUrl,pre_signed_log_url\nPreSignedUrl,pre_signed_url\nPreTokenGeneration,pre_token_generation\nPreTrainingConstraints,pre_training_constraints\nPreTrainingReport,pre_training_report\nPrecedence,precedence\nPrecision,precision\nPrecisionRecallTradeoff,precision_recall_tradeoff\nPreconditionFailed,precondition_failed\nPreconditionFailedException,precondition_failed_exception\nPreconditionNotMetException,precondition_not_met_exception\nPreconditionsFailedException,preconditions_failed_exception\nPredecessor,predecessor\nPredecessorRuns,predecessor_runs\nPredecessorsIncluded,predecessors_included\nPredefined,predefined\nPredefinedHierarchy,predefined_hierarchy\nPredefinedIndices,predefined_indices\nPredefinedLoadMetricSpecification,predefined_load_metric_specification\nPredefinedLoadMetricType,predefined_load_metric_type\nPredefinedMetricPairSpecification,predefined_metric_pair_specification\nPredefinedMetricSpecification,predefined_metric_specification\nPredefinedMetricType,predefined_metric_type\nPredefinedScalingMetricSpecification,predefined_scaling_metric_specification\nPredefinedScalingMetricType,predefined_scaling_metric_type\nPredicate,predicate\nPredicateList,predicate_list\nPredicates,predicates\nPredictEndpoint,predict_endpoint\nPredictInput,predict_input\nPredictOutput,predict_output\nPredictedCapacity,predicted_capacity\nPredictedIntent,predicted_intent\nPredictedItem,predicted_item\nPrediction,prediction\nPredictionExplanations,prediction_explanations\nPredictionInterval,prediction_interval\nPredictionIntervalLevel,prediction_interval_level\nPredictionIntervalLowerBound,prediction_interval_lower_bound\nPredictionIntervalUpperBound,prediction_interval_upper_bound\nPredictionTimeRange,prediction_time_range\nPredictions,predictions\nPredictiveDialerConfig,predictive_dialer_config\nPredictiveScalingConfiguration,predictive_scaling_configuration\nPredictiveScalingCustomizedCapacityMetric,predictive_scaling_customized_capacity_metric\nPredictiveScalingCustomizedLoadMetric,predictive_scaling_customized_load_metric\nPredictiveScalingCustomizedScalingMetric,predictive_scaling_customized_scaling_metric\nPredictiveScalingMaxCapacityBehavior,predictive_scaling_max_capacity_behavior\nPredictiveScalingMaxCapacityBuffer,predictive_scaling_max_capacity_buffer\nPredictiveScalingMetricSpecification,predictive_scaling_metric_specification\nPredictiveScalingMode,predictive_scaling_mode\nPredictiveScalingPredefinedLoadMetric,predictive_scaling_predefined_load_metric\nPredictiveScalingPredefinedMetricPair,predictive_scaling_predefined_metric_pair\nPredictiveScalingPredefinedScalingMetric,predictive_scaling_predefined_scaling_metric\nPredictorArn,predictor_arn\nPredictorBacktestExportJobArn,predictor_backtest_export_job_arn\nPredictorBacktestExportJobName,predictor_backtest_export_job_name\nPredictorBacktestExportJobSummary,predictor_backtest_export_job_summary\nPredictorBacktestExportJobs,predictor_backtest_export_jobs\nPredictorBaseline,predictor_baseline\nPredictorEvaluationResults,predictor_evaluation_results\nPredictorEvent,predictor_event\nPredictorExecution,predictor_execution\nPredictorExecutionDetails,predictor_execution_details\nPredictorExecutions,predictor_executions\nPredictorMonitorEvaluation,predictor_monitor_evaluation\nPredictorMonitorEvaluations,predictor_monitor_evaluations\nPredictorName,predictor_name\nPredictorNotMountedException,predictor_not_mounted_exception\nPredictorSummary,predictor_summary\nPredictors,predictors\nPrefectureOrDistrict,prefecture_or_district\nPreference,preference\nPreferences,preferences\nPreferred,preferred\nPreferredAuthenticationMethod,preferred_authentication_method\nPreferredAvailabilityZone,preferred_availability_zone\nPreferredAvailabilityZones,preferred_availability_zones\nPreferredBackupWindow,preferred_backup_window\nPreferredCacheClusterAZs,preferred_cache_cluster_azs\nPreferredChannelPipeline,preferred_channel_pipeline\nPreferredFileServerIp,preferred_file_server_ip\nPreferredInstanceType,preferred_instance_type\nPreferredLanguage,preferred_language\nPreferredMaintenanceWindow,preferred_maintenance_window\nPreferredMfa,preferred_mfa\nPreferredMfaSetting,preferred_mfa_setting\nPreferredOutpostArn,preferred_outpost_arn\nPreferredOutpostArns,preferred_outpost_arns\nPreferredProtocol,preferred_protocol\nPreferredSubnetId,preferred_subnet_id\nPrefetchConsumption,prefetch_consumption\nPrefetchRetrieval,prefetch_retrieval\nPrefetchSchedule,prefetch_schedule\nPrefix,prefix\nPrefixConfig,prefix_config\nPrefixForAllResources,prefix_for_all_resources\nPrefixLevel,prefix_level\nPrefixLevelStorageMetrics,prefix_level_storage_metrics\nPrefixList,prefix_list\nPrefixListArn,prefix_list_arn\nPrefixListAssociation,prefix_list_association\nPrefixListAssociations,prefix_list_associations\nPrefixListEntry,prefix_list_entry\nPrefixListId,prefix_list_id\nPrefixListIds,prefix_list_ids\nPrefixListName,prefix_list_name\nPrefixListOwnerId,prefix_list_owner_id\nPrefixLists,prefix_lists\nPrefixesCompleted,prefixes_completed\nPrefixesFound,prefixes_found\nPreload,preload\nPreloadDataConfig,preload_data_config\nPreloadDataType,preload_data_type\nPrepareDuration,prepare_duration\nPrepareQueryRequest,prepare_query_request\nPrepareQueryResponse,prepare_query_response\nPrepareStatus,prepare_status\nPreparedStatement,prepared_statement\nPreparedStatementNames,prepared_statement_names\nPreparedStatementSummary,prepared_statement_summary\nPreparedStatements,prepared_statements\nPresenterOnlyConfiguration,presenter_only_configuration\nPresenterPosition,presenter_position\nPreserveClientIp,preserve_client_ip\nPreserveDeletedFiles,preserve_deleted_files\nPreserveDevices,preserve_devices\nPreserveExistingData,preserve_existing_data\nPreserveTransactions,preserve_transactions\nPreservedExistingData,preserved_existing_data\nPreset,preset\nPresetDeploymentConfig,preset_deployment_config\nPresetDeploymentOutput,preset_deployment_output\nPresetDeploymentType,preset_deployment_type\nPresetId,preset_id\nPresetSettings,preset_settings\nPresetSpeke20Audio,preset_speke20_audio\nPresetSpeke20Video,preset_speke20_video\nPresetWatermark,preset_watermark\nPresetWatermarkId,preset_watermark_id\nPresets,presets\nPresignedUrl,presigned_url\nPresignedUrlConfig,presigned_url_config\nPrestoParameters,presto_parameters\nPreventUserExistenceErrors,prevent_user_existence_errors\nPreview,preview\nPreviewAgentsRequest,preview_agents_request\nPreviewAgentsResponse,preview_agents_response\nPreviewGenerationInProgressException,preview_generation_in_progress_exception\nPreviewNextCidr,preview_next_cidr\nPreviewOverride,preview_override\nPreviousActiveModelVersion,previous_active_model_version\nPreviousActiveModelVersionArn,previous_active_model_version_arn\nPreviousActiveVersion,previous_active_version\nPreviousActiveVersionArn,previous_active_version_arn\nPreviousAppsList,previous_apps_list\nPreviousContactId,previous_contact_id\nPreviousEarthObservationJobArn,previous_earth_observation_job_arn\nPreviousFleetState,previous_fleet_state\nPreviousInvocationTime,previous_invocation_time\nPreviousLineItemId,previous_line_item_id\nPreviousModelVersionActivatedAt,previous_model_version_activated_at\nPreviousOrderId,previous_order_id\nPreviousPassword,previous_password\nPreviousProtocolsList,previous_protocols_list\nPreviousRunId,previous_run_id\nPreviousSlotEndTime,previous_slot_end_time\nPreviousSpotFleetRequestState,previous_spot_fleet_request_state\nPreviousState,previous_state\nPreviousStatus,previous_status\nPreviousValue,previous_value\nPreviousValues,previous_values\nPreviousVersion,previous_version\nPrice,price\nPriceClass,price_class\nPriceList,price_list\nPriceListArn,price_list_arn\nPriceLists,price_lists\nPricePerUnit,price_per_unit\nPriceSchedule,price_schedule\nPriceScheduleSpecification,price_schedule_specification\nPriceSchedules,price_schedules\nPriceUnits,price_units\nPriceWithCurrency,price_with_currency\nPrices,prices\nPricingDetail,pricing_detail\nPricingDetails,pricing_details\nPricingPlan,pricing_plan\nPricingPlanArn,pricing_plan_arn\nPricingPlanArns,pricing_plan_arns\nPricingPlanDataSource,pricing_plan_data_source\nPricingPlanListElement,pricing_plan_list_element\nPricingPlans,pricing_plans\nPricingRuleArn,pricing_rule_arn\nPricingRuleArns,pricing_rule_arns\nPricingRuleListElement,pricing_rule_list_element\nPricingRules,pricing_rules\nPrimary,primary\nPrimaryAccountId,primary_account_id\nPrimaryAccountNumber,primary_account_number\nPrimaryAvailabilityZone,primary_availability_zone\nPrimaryBackground,primary_background\nPrimaryBtn,primary_btn\nPrimaryClusterId,primary_cluster_id\nPrimaryContainer,primary_container\nPrimaryDistributionId,primary_distribution_id\nPrimaryEmail,primary_email\nPrimaryEmailPrefix,primary_email_prefix\nPrimaryEndpoint,primary_endpoint\nPrimaryForeground,primary_foreground\nPrimaryHost,primary_host\nPrimaryIpv6,primary_ipv6\nPrimaryKey,primary_key\nPrimaryKeyColumnName,primary_key_column_name\nPrimaryKeys,primary_keys\nPrimaryMeetingId,primary_meeting_id\nPrimaryMetricName,primary_metric_name\nPrimaryOutpostArn,primary_outpost_arn\nPrimaryProvisionedNumber,primary_provisioned_number\nPrimaryRegion,primary_region\nPrimaryReplicationGroupId,primary_replication_group_id\nPrimarySource,primary_source\nPrimaryStatus,primary_status\nPrimaryValue,primary_value\nPrimaryValueDisplayType,primary_value_display_type\nPrimaryValueFontConfiguration,primary_value_font_configuration\nPrimaryWorkspaceId,primary_workspace_id\nPrimaryYAxisDisplayOptions,primary_y_axis_display_options\nPrimaryYAxisLabelOptions,primary_y_axis_label_options\nPrincipal,principal\nPrincipalARN,principal_arn\nPrincipalArn,principal_arn\nPrincipalId,principal_id\nPrincipalIdFormat,principal_id_format\nPrincipalList,principal_list\nPrincipalName,principal_name\nPrincipalOrgID,principal_org_id\nPrincipalOrgIDs,principal_org_ids\nPrincipalPermissions,principal_permissions\nPrincipalResourcePermissions,principal_resource_permissions\nPrincipalTags,principal_tags\nPrincipalType,principal_type\nPrincipals,principals\nPriorModelMetrics,prior_model_metrics\nPriorRequestNotComplete,prior_request_not_complete\nPrioritizeBusinessGoals,prioritize_business_goals\nPrioritizedRiskCounts,prioritized_risk_counts\nPriority,priority\nPriorityConfiguration,priority_configuration\nPriorityInUseException,priority_in_use_exception\nPriorityOrder,priority_order\nPrivacy,privacy\nPrivacyPolicy,privacy_policy\nPrivacyProtectAdminContact,privacy_protect_admin_contact\nPrivacyProtectRegistrantContact,privacy_protect_registrant_contact\nPrivacyProtectTechContact,privacy_protect_tech_contact\nPrivateAddress,private_address\nPrivateChannelFilter,private_channel_filter\nPrivateConnectionProvisioningState,private_connection_provisioning_state\nPrivateDefaultScopeId,private_default_scope_id\nPrivateDns,private_dns\nPrivateDnsDetails,private_dns_details\nPrivateDnsEnabled,private_dns_enabled\nPrivateDnsHostnameType,private_dns_hostname_type\nPrivateDnsHostnameTypeOnLaunch,private_dns_hostname_type_on_launch\nPrivateDnsName,private_dns_name\nPrivateDnsNameConfiguration,private_dns_name_configuration\nPrivateDnsNameOptions,private_dns_name_options\nPrivateDnsNameOptionsOnLaunch,private_dns_name_options_on_launch\nPrivateDnsNameOptionsRequest,private_dns_name_options_request\nPrivateDnsNameOptionsResponse,private_dns_name_options_response\nPrivateDnsNameVerificationState,private_dns_name_verification_state\nPrivateDnsNames,private_dns_names\nPrivateDnsNamespaceChange,private_dns_namespace_change\nPrivateDnsNamespaceProperties,private_dns_namespace_properties\nPrivateDnsNamespacePropertiesChange,private_dns_namespace_properties_change\nPrivateDnsOnlyForInboundResolverEndpoint,private_dns_only_for_inbound_resolver_endpoint\nPrivateDnsPropertiesMutable,private_dns_properties_mutable\nPrivateDnsPropertiesMutableChange,private_dns_properties_mutable_change\nPrivateIPAddress,private_ip_address\nPrivateIPv4Address,private_ipv4_address\nPrivateIp,private_ip\nPrivateIpAddress,private_ip_address\nPrivateIpAddressConfigs,private_ip_address_configs\nPrivateIpAddressCount,private_ip_address_count\nPrivateIpAddressDetails,private_ip_address_details\nPrivateIpAddressSpecification,private_ip_address_specification\nPrivateIpAddresses,private_ip_addresses\nPrivateKey,private_key\nPrivateKeyAttributes,private_key_attributes\nPrivateKeyAttributesV2,private_key_attributes_v2\nPrivateKeyAttributesV3,private_key_attributes_v3\nPrivateKeyAttributesV4,private_key_attributes_v4\nPrivateKeyCiphertextBlob,private_key_ciphertext_blob\nPrivateKeyFlags,private_key_flags\nPrivateKeyFlagsV2,private_key_flags_v2\nPrivateKeyFlagsV3,private_key_flags_v3\nPrivateKeyFlagsV4,private_key_flags_v4\nPrivateKeyPlaintext,private_key_plaintext\nPrivateKeys,private_keys\nPrivateLinkConfig,private_link_config\nPrivateLinkEndpoint,private_link_endpoint\nPrivateMetadataPid,private_metadata_pid\nPrivateRegistryAccess,private_registry_access\nPrivateRegistryAccessRequest,private_registry_access_request\nPrivateSkillIds,private_skill_ids\nPrivateTypeException,private_type_exception\nPrivateZone,private_zone\nPrivileged,privileged\nPrivilegedDelete,privileged_delete\nPrivilegedMode,privileged_mode\nProactiveAnomalies,proactive_anomalies\nProactiveAnomaly,proactive_anomaly\nProactiveAnomalySummary,proactive_anomaly_summary\nProactiveEngagementStatus,proactive_engagement_status\nProactiveInsight,proactive_insight\nProactiveInsightSummary,proactive_insight_summary\nProactiveInsights,proactive_insights\nProactiveJoin,proactive_join\nProactiveOrganizationInsightSummary,proactive_organization_insight_summary\nProb,prob\nProbabilityAttribute,probability_attribute\nProbabilityIndex,probability_index\nProbabilityThresholdAttribute,probability_threshold_attribute\nProblem,problem\nProblemDetail,problem_detail\nProblemDetails,problem_details\nProblemId,problem_id\nProblemList,problem_list\nProblemType,problem_type\nProblems,problems\nProcess,process\nProcessDetails,process_details\nProcessLaunchedAt,process_launched_at\nProcessName,process_name\nProcessParentPid,process_parent_pid\nProcessPath,process_path\nProcessPid,process_pid\nProcessTerminatedAt,process_terminated_at\nProcessType,process_type\nProcessedAutomationRules,processed_automation_rules\nProcessedClusters,processed_clusters\nProcessedFindings,processed_findings\nProcessedInputRecords,processed_input_records\nProcessedItemCount,processed_item_count\nProcessedRecordsCount,processed_records_count\nProcessedSizeBytes,processed_size_bytes\nProcessedUpdateAction,processed_update_action\nProcessedUpdateActions,processed_update_actions\nProcesses,processes\nProcessesType,processes_type\nProcessing,processing\nProcessingClusterConfig,processing_cluster_config\nProcessingConfiguration,processing_configuration\nProcessingEndTime,processing_end_time\nProcessingFeatureStoreOutput,processing_feature_store_output\nProcessingInput,processing_input\nProcessingInputs,processing_inputs\nProcessingJob,processing_job\nProcessingJobArn,processing_job_arn\nProcessingJobName,processing_job_name\nProcessingJobStatus,processing_job_status\nProcessingJobStepMetadata,processing_job_step_metadata\nProcessingJobSummaries,processing_job_summaries\nProcessingJobSummary,processing_job_summary\nProcessingOutput,processing_output\nProcessingOutputConfig,processing_output_config\nProcessingResources,processing_resources\nProcessingResult,processing_result\nProcessingS3Input,processing_s3_input\nProcessingS3Output,processing_s3_output\nProcessingStartTime,processing_start_time\nProcessingStatus,processing_status\nProcessingStatusInfo,processing_status_info\nProcessingStoppingCondition,processing_stopping_condition\nProcessingTimeMilliseconds,processing_time_milliseconds\nProcessor,processor\nProcessorConfiguration,processor_configuration\nProcessorFeature,processor_feature\nProcessorFeatures,processor_features\nProcessorInfo,processor_info\nProcessorParameter,processor_parameter\nProcessors,processors\nProducerArn,producer_arn\nProducerTimestamp,producer_timestamp\nProduct,product\nProductARN,product_arn\nProductArn,product_arn\nProductCode,product_code\nProductCodeId,product_code_id\nProductCodeType,product_code_type\nProductCodes,product_codes\nProductDescription,product_description\nProductDescriptions,product_descriptions\nProductFamily,product_family\nProductFields,product_fields\nProductId,product_id\nProductInformation,product_information\nProductInformationFilter,product_information_filter\nProductInformationFilterComparator,product_information_filter_comparator\nProductInformationFilterList,product_information_filter_list\nProductInformationFilterName,product_information_filter_name\nProductInformationFilterValue,product_information_filter_value\nProductInformationList,product_information_list\nProductLink,product_link\nProductListingIds,product_listing_ids\nProductName,product_name\nProductSKU,product_sku\nProductSource,product_source\nProductSubscriptionArn,product_subscription_arn\nProductSubscriptionResourcePolicy,product_subscription_resource_policy\nProductSubscriptions,product_subscriptions\nProductTitle,product_title\nProductType,product_type\nProductUserSummaries,product_user_summaries\nProductUserSummary,product_user_summary\nProductViewAggregationValue,product_view_aggregation_value\nProductViewAggregations,product_view_aggregations\nProductViewDetail,product_view_detail\nProductViewDetails,product_view_details\nProductViewSummaries,product_view_summaries\nProductViewSummary,product_view_summary\nProductionAccessEnabled,production_access_enabled\nProductionAccessNotGrantedException,production_access_not_granted_exception\nProductionBranch,production_branch\nProductionVariant,production_variant\nProductionVariantCoreDumpConfig,production_variant_core_dump_config\nProductionVariantServerlessConfig,production_variant_serverless_config\nProductionVariantServerlessUpdateConfig,production_variant_serverless_update_config\nProductionVariantStatus,production_variant_status\nProductionVariantSummary,production_variant_summary\nProductionVariants,production_variants\nProducts,products\nProfanity,profanity\nProfile,profile\nProfileArn,profile_arn\nProfileArns,profile_arns\nProfileChoice,profile_choice\nProfileColumns,profile_columns\nProfileConfiguration,profile_configuration\nProfileCount,profile_count\nProfileData,profile_data\nProfileDescription,profile_description\nProfileDetail,profile_detail\nProfileDetailResponse,profile_detail_response\nProfileId,profile_id\nProfileIds,profile_ids\nProfileIdsToBeMerged,profile_ids_to_be_merged\nProfileName,profile_name\nProfileNamePrefix,profile_name_prefix\nProfileNotificationSummary,profile_notification_summary\nProfileObjectUniqueKey,profile_object_unique_key\nProfileOwnerType,profile_owner_type\nProfileQuestion,profile_question\nProfileQuestionUpdate,profile_question_update\nProfileQuestions,profile_questions\nProfileShareSummaries,profile_share_summaries\nProfileShareSummary,profile_share_summary\nProfileSummaries,profile_summaries\nProfileSummary,profile_summary\nProfileTemplate,profile_template\nProfileTemplateChoice,profile_template_choice\nProfileTemplateQuestion,profile_template_question\nProfileTime,profile_time\nProfileType,profile_type\nProfileUrl,profile_url\nProfileVersion,profile_version\nProfilerConfig,profiler_config\nProfilerConfigForUpdate,profiler_config_for_update\nProfilerRuleConfiguration,profiler_rule_configuration\nProfilerRuleConfigurations,profiler_rule_configurations\nProfilerRuleEvaluationStatus,profiler_rule_evaluation_status\nProfilerRuleEvaluationStatuses,profiler_rule_evaluation_statuses\nProfiles,profiles\nProfilingGroupDescription,profiling_group_description\nProfilingIntervalInMilliseconds,profiling_interval_in_milliseconds\nProfilingParameters,profiling_parameters\nProfilingStatus,profiling_status\nProformaCost,proforma_cost\nProgramCount,program_count\nProgramDateTime,program_date_time\nProgramDateTimeClock,program_date_time_clock\nProgramDateTimeIntervalSeconds,program_date_time_interval_seconds\nProgramDateTimePeriod,program_date_time_period\nProgramId,program_id\nProgramName,program_name\nProgramNum,program_num\nProgramNumber,program_number\nProgramSelection,program_selection\nProgrammingLang,programming_lang\nProgrammingLanguages,programming_languages\nProgress,progress\nProgressBar,progress_bar\nProgressBarOptions,progress_bar_options\nProgressCounters,progress_counters\nProgressDetail,progress_detail\nProgressDetails,progress_details\nProgressDetailsOnRollback,progress_details_on_rollback\nProgressEvent,progress_event\nProgressInMegaBytes,progress_in_mega_bytes\nProgressPercent,progress_percent\nProgressPercentage,progress_percentage\nProgressReport,progress_report\nProgressStatus,progress_status\nProgressSummary,progress_summary\nProgressUpdateStream,progress_update_stream\nProgressUpdateStreamName,progress_update_stream_name\nProgressUpdateStreamSummary,progress_update_stream_summary\nProgressUpdateStreamSummaryList,progress_update_stream_summary_list\nProgressing,progressing\nProgressingJobsCount,progressing_jobs_count\nProgressiveDialerConfig,progressive_dialer_config\nProgressiveWriteHlsManifest,progressive_write_hls_manifest\nProhibitedStateException,prohibited_state_exception\nProject,project\nProjectAlreadyExistsException,project_already_exists_exception\nProjectAppConfigResource,project_app_config_resource\nProjectAppConfigResourceConfig,project_app_config_resource_config\nProjectArn,project_arn\nProjectArtifacts,project_artifacts\nProjectBadge,project_badge\nProjectBuildBatchConfig,project_build_batch_config\nProjectCache,project_cache\nProjectConfigurationException,project_configuration_exception\nProjectCreationFailedException,project_creation_failed_exception\nProjectDataDelivery,project_data_delivery\nProjectDataDeliveryConfig,project_data_delivery_config\nProjectDescription,project_description\nProjectDescriptions,project_descriptions\nProjectDetails,project_details\nProjectEnvironment,project_environment\nProjectFieldMappings,project_field_mappings\nProjectFileSystemLocation,project_file_system_location\nProjectId,project_id\nProjectInformation,project_information\nProjectListFilter,project_list_filter\nProjectMetadata,project_metadata\nProjectName,project_name\nProjectNames,project_names\nProjectNotFoundException,project_not_found_exception\nProjectOperation,project_operation\nProjectPolicies,project_policies\nProjectPolicy,project_policy\nProjectResource,project_resource\nProjectSource,project_source\nProjectSourceVersion,project_source_version\nProjectStatus,project_status\nProjectSummary,project_summary\nProjectSummaryList,project_summary_list\nProjectVersionArn,project_version_arn\nProjectVersionDescription,project_version_description\nProjectVersionDescriptions,project_version_descriptions\nProjectedColumns,projected_columns\nProjectedInbox,projected_inbox\nProjectedMetric,projected_metric\nProjectedSpam,projected_spam\nProjectedVolume,projected_volume\nProjection,projection\nProjectionExpression,projection_expression\nProjectionType,projection_type\nProjects,projects\nPrometheus,prometheus\nPrometheusInfo,prometheus_info\nPromoteMode,promote_mode\nPromotePermissionCreatedFromPolicyRequest,promote_permission_created_from_policy_request\nPromotePermissionCreatedFromPolicyResponse,promote_permission_created_from_policy_response\nPromoteReadReplicaDBClusterMessage,promote_read_replica_db_cluster_message\nPromoteReadReplicaDBClusterResult,promote_read_replica_db_cluster_result\nPromoteReadReplicaMessage,promote_read_replica_message\nPromoteReadReplicaResult,promote_read_replica_result\nPromoteRequest,promote_request\nPromoteResourceShareCreatedFromPolicyRequest,promote_resource_share_created_from_policy_request\nPromoteResourceShareCreatedFromPolicyResponse,promote_resource_share_created_from_policy_response\nPromoteResponse,promote_response\nPromotion,promotion\nPromotionTier,promotion_tier\nPromotionalMessagesPerSecond,promotional_messages_per_second\nPrompt,prompt\nPromptARN,prompt_arn\nPromptAttemptSpecification,prompt_attempt_specification\nPromptId,prompt_id\nPromptPresignedUrl,prompt_presigned_url\nPromptSearchCriteria,prompt_search_criteria\nPromptSearchFilter,prompt_search_filter\nPromptSpecification,prompt_specification\nPromptSummary,prompt_summary\nPromptSummaryList,prompt_summary_list\nPrompts,prompts\nProof,proof\nPropagateAtLaunch,propagate_at_launch\nPropagateTags,propagate_tags\nPropagatingVgw,propagating_vgw\nPropagatingVgwSet,propagating_vgw_set\nPropagatingVgwSetDetails,propagating_vgw_set_details\nPropagatingVgws,propagating_vgws\nPropagation,propagation\nPropagationDefaultRouteTableId,propagation_default_route_table_id\nProperties,properties\nPropertiesToDelete,properties_to_delete\nPropertiesToRemove,properties_to_remove\nProperty,property\nPropertyDefinitionRequest,property_definition_request\nPropertyDefinitionResponse,property_definition_response\nPropertyDifference,property_difference\nPropertyDifferences,property_differences\nPropertyFilter,property_filter\nPropertyFilters,property_filters\nPropertyGroup,property_group\nPropertyGroupDescriptions,property_group_descriptions\nPropertyGroupId,property_group_id\nPropertyGroupRequest,property_group_request\nPropertyGroupResponse,property_group_response\nPropertyGroups,property_groups\nPropertyLatestValue,property_latest_value\nPropertyList,property_list\nPropertyMap,property_map\nPropertyName,property_name\nPropertyNameHint,property_name_hint\nPropertyNameQuery,property_name_query\nPropertyNameSuggestion,property_name_suggestion\nPropertyNameSuggestions,property_name_suggestions\nPropertyNotification,property_notification\nPropertyPath,property_path\nPropertyPredicate,property_predicate\nPropertyRequest,property_request\nPropertyResponse,property_response\nPropertyRole,property_role\nPropertyType,property_type\nPropertyUsage,property_usage\nPropertyValidationException,property_validation_exception\nPropertyValidationExceptionProperty,property_validation_exception_property\nPropertyValue,property_value\nPropertyValueEntry,property_value_entry\nPropertyValueHistory,property_value_history\nPropertygraphData,propertygraph_data\nPropertygraphRecord,propertygraph_record\nPropertygraphSummary,propertygraph_summary\nPropertygraphSummaryValueMap,propertygraph_summary_value_map\nProposal,proposal\nProposalActions,proposal_actions\nProposalDurationInHours,proposal_duration_in_hours\nProposalId,proposal_id\nProposalSummary,proposal_summary\nProposalVotes,proposal_votes\nProposals,proposals\nProposed,proposed\nProposedByMemberId,proposed_by_member_id\nProposedByMemberName,proposed_by_member_name\nProposedConfiguration,proposed_configuration\nProposedMultiRegionAccessPointPolicy,proposed_multi_region_access_point_policy\nProposedPassword,proposed_password\nProposedSegmentChange,proposed_segment_change\nProprietaryAuthenticationData,proprietary_authentication_data\nProresSettings,prores_settings\nProtectedFromScaleIn,protected_from_scale_in\nProtectedQuery,protected_query\nProtectedQueryError,protected_query_error\nProtectedQueryResult,protected_query_result\nProtectedQueryResultConfiguration,protected_query_result_configuration\nProtectedQueryS3Output,protected_query_s3_output\nProtectedQueryS3OutputConfiguration,protected_query_s3_output_configuration\nProtectedQuerySQLParameters,protected_query_sql_parameters\nProtectedQuerySingleMemberOutput,protected_query_single_member_output\nProtectedQueryStatistics,protected_query_statistics\nProtectedQuerySummary,protected_query_summary\nProtectedResource,protected_resource\nProtectedResourceTypeLimits,protected_resource_type_limits\nProtectedTask,protected_task\nProtection,protection\nProtectionArn,protection_arn\nProtectionGroup,protection_group\nProtectionGroupArbitraryPatternLimits,protection_group_arbitrary_pattern_limits\nProtectionGroupArn,protection_group_arn\nProtectionGroupId,protection_group_id\nProtectionGroupIds,protection_group_ids\nProtectionGroupLimits,protection_group_limits\nProtectionGroupPatternTypeLimits,protection_group_pattern_type_limits\nProtectionGroups,protection_groups\nProtectionId,protection_id\nProtectionLimits,protection_limits\nProtectionNames,protection_names\nProtectionPolicy,protection_policy\nProtections,protections\nProtectiveEquipmentBodyPart,protective_equipment_body_part\nProtectiveEquipmentModelVersion,protective_equipment_model_version\nProtectiveEquipmentPerson,protective_equipment_person\nProtectiveEquipmentSummarizationAttributes,protective_equipment_summarization_attributes\nProtectiveEquipmentSummary,protective_equipment_summary\nProtocol,protocol\nProtocolDetails,protocol_details\nProtocolType,protocol_type\nProtocolVersion,protocol_version\nProtocols,protocols\nProtocolsList,protocols_list\nProtocolsListArn,protocols_list_arn\nProtocolsListData,protocols_list_data\nProtocolsListDataSummary,protocols_list_data_summary\nProtocolsLists,protocols_lists\nProvideAnomalyFeedbackRequest,provide_anomaly_feedback_request\nProvideAnomalyFeedbackResponse,provide_anomaly_feedback_response\nProvidedContext,provided_context\nProvidedContexts,provided_contexts\nProvider,provider\nProviderArn,provider_arn\nProviderAttributeName,provider_attribute_name\nProviderAttributeValue,provider_attribute_value\nProviderCalendarId,provider_calendar_id\nProviderDescription,provider_description\nProviderDetails,provider_details\nProviderEndpoint,provider_endpoint\nProviderId,provider_id\nProviderName,provider_name\nProviderType,provider_type\nProviderTypeFilter,provider_type_filter\nProviderTypes,provider_types\nProviderUserIdentifierType,provider_user_identifier_type\nProviders,providers\nProvince,province\nProvisionByoipCidrRequest,provision_byoip_cidr_request\nProvisionByoipCidrResponse,provision_byoip_cidr_response\nProvisionByoipCidrResult,provision_byoip_cidr_result\nProvisionData,provision_data\nProvisionDeviceRequest,provision_device_request\nProvisionDeviceResponse,provision_device_response\nProvisionIpamPoolCidrRequest,provision_ipam_pool_cidr_request\nProvisionIpamPoolCidrResult,provision_ipam_pool_cidr_result\nProvisionPermissionSetRequest,provision_permission_set_request\nProvisionPermissionSetRequestId,provision_permission_set_request_id\nProvisionPermissionSetResponse,provision_permission_set_response\nProvisionProductId,provision_product_id\nProvisionProductInput,provision_product_input\nProvisionProductName,provision_product_name\nProvisionProductOutput,provision_product_output\nProvisionPublicIpv4PoolCidrRequest,provision_public_ipv4_pool_cidr_request\nProvisionPublicIpv4PoolCidrResult,provision_public_ipv4_pool_cidr_result\nProvisionState,provision_state\nProvisionTime,provision_time\nProvisionToken,provision_token\nProvisionalConfiguration,provisional_configuration\nProvisioned,provisioned\nProvisionedBandwidth,provisioned_bandwidth\nProvisionedCapacity,provisioned_capacity\nProvisionedCapacityDescription,provisioned_capacity_description\nProvisionedCapacityList,provisioned_capacity_list\nProvisionedCapacityUnits,provisioned_capacity_units\nProvisionedCapacityUpdate,provisioned_capacity_update\nProvisionedConcurrency,provisioned_concurrency\nProvisionedConcurrencyConfigListItem,provisioned_concurrency_config_list_item\nProvisionedConcurrencyConfigNotFoundException,provisioned_concurrency_config_not_found_exception\nProvisionedConcurrencyConfigs,provisioned_concurrency_configs\nProvisionedConcurrentExecutions,provisioned_concurrent_executions\nProvisionedIops,provisioned_iops\nProvisionedIopsNotAvailableInAZFault,provisioned_iops_not_available_in_az_fault\nProvisionedModelSummary,provisioned_model_summary\nProvisionedOnDemandCapacity,provisioned_on_demand_capacity\nProvisionedProductAttribute,provisioned_product_attribute\nProvisionedProductDetail,provisioned_product_detail\nProvisionedProductId,provisioned_product_id\nProvisionedProductName,provisioned_product_name\nProvisionedProductPlanDetails,provisioned_product_plan_details\nProvisionedProductPlanSummary,provisioned_product_plan_summary\nProvisionedProductPlans,provisioned_product_plans\nProvisionedProductProperties,provisioned_product_properties\nProvisionedProductStatusMessage,provisioned_product_status_message\nProvisionedProductType,provisioned_product_type\nProvisionedProducts,provisioned_products\nProvisionedReadCapacityAutoScalingSettings,provisioned_read_capacity_auto_scaling_settings\nProvisionedReadCapacityAutoScalingSettingsUpdate,provisioned_read_capacity_auto_scaling_settings_update\nProvisionedReadCapacityAutoScalingUpdate,provisioned_read_capacity_auto_scaling_update\nProvisionedReadCapacityUnits,provisioned_read_capacity_units\nProvisionedRequest,provisioned_request\nProvisionedResource,provisioned_resource\nProvisionedSpotCapacity,provisioned_spot_capacity\nProvisionedStorageThroughput,provisioned_storage_throughput\nProvisionedThroughput,provisioned_throughput\nProvisionedThroughputDescription,provisioned_throughput_description\nProvisionedThroughputExceededException,provisioned_throughput_exceeded_exception\nProvisionedThroughputInMibps,provisioned_throughput_in_mibps\nProvisionedThroughputOverride,provisioned_throughput_override\nProvisionedWriteCapacityAutoScalingSettings,provisioned_write_capacity_auto_scaling_settings\nProvisionedWriteCapacityAutoScalingSettingsUpdate,provisioned_write_capacity_auto_scaling_settings_update\nProvisionedWriteCapacityAutoScalingUpdate,provisioned_write_capacity_auto_scaling_update\nProvisionedWriteCapacityUnits,provisioned_write_capacity_units\nProvisioningArtifact,provisioning_artifact\nProvisioningArtifactDetail,provisioning_artifact_detail\nProvisioningArtifactDetails,provisioning_artifact_details\nProvisioningArtifactId,provisioning_artifact_id\nProvisioningArtifactMetadata,provisioning_artifact_metadata\nProvisioningArtifactName,provisioning_artifact_name\nProvisioningArtifactOutput,provisioning_artifact_output\nProvisioningArtifactOutputKeys,provisioning_artifact_output_keys\nProvisioningArtifactOutputs,provisioning_artifact_outputs\nProvisioningArtifactParameter,provisioning_artifact_parameter\nProvisioningArtifactParameters,provisioning_artifact_parameters\nProvisioningArtifactPreferences,provisioning_artifact_preferences\nProvisioningArtifactProperties,provisioning_artifact_properties\nProvisioningArtifactSummaries,provisioning_artifact_summaries\nProvisioningArtifactSummary,provisioning_artifact_summary\nProvisioningArtifactView,provisioning_artifact_view\nProvisioningArtifactViews,provisioning_artifact_views\nProvisioningArtifacts,provisioning_artifacts\nProvisioningHook,provisioning_hook\nProvisioningParameter,provisioning_parameter\nProvisioningParameters,provisioning_parameters\nProvisioningPreferences,provisioning_preferences\nProvisioningStatus,provisioning_status\nProvisioningTemplateSummary,provisioning_template_summary\nProvisioningTemplateVersionSummary,provisioning_template_version_summary\nProvisioningType,provisioning_type\nProximity,proximity\nProximityEventConfiguration,proximity_event_configuration\nProximityResourceTypeEventConfiguration,proximity_resource_type_event_configuration\nProxy,proxy\nProxyConfiguration,proxy_configuration\nProxyConfigurationProperties,proxy_configuration_properties\nProxyPhoneNumber,proxy_phone_number\nProxySession,proxy_session\nProxySessionId,proxy_session_id\nProxySessions,proxy_sessions\nProxyType,proxy_type\nProxyUrl,proxy_url\nPsAttributes,ps_attributes\nPsDetailAttributes,ps_detail_attributes\nPsc,psc\nPseudoTerminal,pseudo_terminal\nPseudonym,pseudonym\nPsiControl,psi_control\nPtrRecord,ptr_record\nPtrRecordUpdate,ptr_record_update\nPtrUpdateStatus,ptr_update_status\nPtsOffset,pts_offset\nPtsOffsetHandlingForBFrames,pts_offset_handling_for_b_frames\nPtsOffsetMode,pts_offset_mode\nPublic,public\nPublicAccess,public_access\nPublicAccessBlock,public_access_block\nPublicAccessBlockConfiguration,public_access_block_configuration\nPublicAccessBlockEnabled,public_access_block_enabled\nPublicAddress,public_address\nPublicAddressAllocationIds,public_address_allocation_ids\nPublicBaseImageReleasedDate,public_base_image_released_date\nPublicChannelFilter,public_channel_filter\nPublicContent,public_content\nPublicDefaultScopeId,public_default_scope_id\nPublicDns,public_dns\nPublicDnsName,public_dns_name\nPublicDnsNamespaceChange,public_dns_namespace_change\nPublicDnsNamespaceProperties,public_dns_namespace_properties\nPublicDnsNamespacePropertiesChange,public_dns_namespace_properties_change\nPublicDnsPropertiesMutable,public_dns_properties_mutable\nPublicDnsPropertiesMutableChange,public_dns_properties_mutable_change\nPublicEndpoint,public_endpoint\nPublicIPAddress,public_ip_address\nPublicIp,public_ip\nPublicIpAddress,public_ip_address\nPublicIpSource,public_ip_source\nPublicIps,public_ips\nPublicIpv4Pool,public_ipv4_pool\nPublicIpv4PoolRange,public_ipv4_pool_range\nPublicIpv4Pools,public_ipv4_pools\nPublicKey,public_key\nPublicKeyAlreadyExists,public_key_already_exists\nPublicKeyCertificate,public_key_certificate\nPublicKeyConfig,public_key_config\nPublicKeyId,public_key_id\nPublicKeyInUse,public_key_in_use\nPublicKeyList,public_key_list\nPublicKeyMaterial,public_key_material\nPublicKeyRotationTimestamp,public_key_rotation_timestamp\nPublicKeySummary,public_key_summary\nPublicKeyVersion,public_key_version\nPublicKeys,public_keys\nPublicPolicyException,public_policy_exception\nPublicSharingEnabled,public_sharing_enabled\nPublicSubject,public_subject\nPublicTypeArn,public_type_arn\nPublicVersionNumber,public_version_number\nPublicWorkforceTaskPrice,public_workforce_task_price\nPublicZoneVPCAssociation,public_zone_vpc_association\nPublication,publication\nPublications,publications\nPubliclyAccessible,publicly_accessible\nPubliclyAdvertisable,publicly_advertisable\nPublish,publish\nPublishAppVersionRequest,publish_app_version_request\nPublishAppVersionResponse,publish_app_version_response\nPublishBatchInput,publish_batch_input\nPublishBatchRequestEntries,publish_batch_request_entries\nPublishBatchRequestEntry,publish_batch_request_entry\nPublishBatchResponse,publish_batch_response\nPublishBatchResultEntry,publish_batch_result_entry\nPublishCloudWatchMetricsEnabled,publish_cloud_watch_metrics_enabled\nPublishFindingToSnsParams,publish_finding_to_sns_params\nPublishFunctionRequest,publish_function_request\nPublishFunctionResult,publish_function_result\nPublishInput,publish_input\nPublishLayerVersionRequest,publish_layer_version_request\nPublishLayerVersionResponse,publish_layer_version_response\nPublishMetricAction,publish_metric_action\nPublishMetricsInput,publish_metrics_input\nPublishPackageVersionRequest,publish_package_version_request\nPublishPackageVersionResult,publish_package_version_result\nPublishRecipeRequest,publish_recipe_request\nPublishRecipeResponse,publish_recipe_response\nPublishRequest,publish_request\nPublishResponse,publish_response\nPublishSchemaRequest,publish_schema_request\nPublishSchemaResponse,publish_schema_response\nPublishStateMachineVersionInput,publish_state_machine_version_input\nPublishStateMachineVersionOutput,publish_state_machine_version_output\nPublishStatus,publish_status\nPublishTimestamp,publish_timestamp\nPublishTypeInput,publish_type_input\nPublishTypeOutput,publish_type_output\nPublishVersionRequest,publish_version_request\nPublishedBy,published_by\nPublishedDate,published_date\nPublishedSchemaArn,published_schema_arn\nPublishedVersionNumber,published_version_number\nPublishedVersions,published_versions\nPublisherId,publisher_id\nPublisherIdentity,publisher_identity\nPublisherName,publisher_name\nPublisherProfile,publisher_profile\nPublisherStatus,publisher_status\nPublishingFailureStartTimestamp,publishing_failure_start_timestamp\nPublishingOptions,publishing_options\nPullRequest,pull_request\nPullRequestAlreadyClosedException,pull_request_already_closed_exception\nPullRequestApprovalRulesNotSatisfiedException,pull_request_approval_rules_not_satisfied_exception\nPullRequestCannotBeApprovedByAuthorException,pull_request_cannot_be_approved_by_author_exception\nPullRequestCreatedEventMetadata,pull_request_created_event_metadata\nPullRequestDoesNotExistException,pull_request_does_not_exist_exception\nPullRequestEvent,pull_request_event\nPullRequestId,pull_request_id\nPullRequestIdRequiredException,pull_request_id_required_exception\nPullRequestMergedStateChangedEventMetadata,pull_request_merged_state_changed_event_metadata\nPullRequestSourceReferenceUpdatedEventMetadata,pull_request_source_reference_updated_event_metadata\nPullRequestStatusChangedEventMetadata,pull_request_status_changed_event_metadata\nPullRequestStatusRequiredException,pull_request_status_required_exception\nPullRequestTarget,pull_request_target\nPullThroughCacheRule,pull_through_cache_rule\nPullThroughCacheRuleAlreadyExistsException,pull_through_cache_rule_already_exists_exception\nPullThroughCacheRuleNotFoundException,pull_through_cache_rule_not_found_exception\nPurchase,purchase\nPurchaseHostReservationRequest,purchase_host_reservation_request\nPurchaseHostReservationResult,purchase_host_reservation_result\nPurchaseOfferingRequest,purchase_offering_request\nPurchaseOfferingResponse,purchase_offering_response\nPurchaseOfferingResult,purchase_offering_result\nPurchaseProvisionedCapacityInput,purchase_provisioned_capacity_input\nPurchaseProvisionedCapacityOutput,purchase_provisioned_capacity_output\nPurchaseRequest,purchase_request\nPurchaseRequests,purchase_requests\nPurchaseReservedCacheNodesOfferingMessage,purchase_reserved_cache_nodes_offering_message\nPurchaseReservedCacheNodesOfferingResult,purchase_reserved_cache_nodes_offering_result\nPurchaseReservedDBInstancesOfferingMessage,purchase_reserved_db_instances_offering_message\nPurchaseReservedDBInstancesOfferingResult,purchase_reserved_db_instances_offering_result\nPurchaseReservedElasticsearchInstanceOfferingRequest,purchase_reserved_elasticsearch_instance_offering_request\nPurchaseReservedElasticsearchInstanceOfferingResponse,purchase_reserved_elasticsearch_instance_offering_response\nPurchaseReservedInstanceOfferingRequest,purchase_reserved_instance_offering_request\nPurchaseReservedInstanceOfferingResponse,purchase_reserved_instance_offering_response\nPurchaseReservedInstancesOfferingRequest,purchase_reserved_instances_offering_request\nPurchaseReservedInstancesOfferingResult,purchase_reserved_instances_offering_result\nPurchaseReservedNodeOfferingMessage,purchase_reserved_node_offering_message\nPurchaseReservedNodeOfferingResult,purchase_reserved_node_offering_result\nPurchaseReservedNodesOfferingRequest,purchase_reserved_nodes_offering_request\nPurchaseReservedNodesOfferingResponse,purchase_reserved_nodes_offering_response\nPurchaseScheduledInstancesRequest,purchase_scheduled_instances_request\nPurchaseScheduledInstancesResult,purchase_scheduled_instances_result\nPurchaseTime,purchase_time\nPurchaseToken,purchase_token\nPurchasedAt,purchased_at\nPurchasedHours,purchased_hours\nPurchasedUnits,purchased_units\nPurgeQueueRequest,purge_queue_request\nPushDomainRequest,push_domain_request\nPushMessageActivity,push_message_activity\nPushNotification,push_notification\nPushNotificationConfiguration,push_notification_configuration\nPushNotificationPreferences,push_notification_preferences\nPushNotificationTemplateRequest,push_notification_template_request\nPushNotificationTemplateResponse,push_notification_template_response\nPushNotifications,push_notifications\nPushSync,push_sync\nPushTemplate,push_template\nPut,put\nPutAccessControlRuleRequest,put_access_control_rule_request\nPutAccessPointConfigurationForObjectLambdaRequest,put_access_point_configuration_for_object_lambda_request\nPutAccessPointPolicyForObjectLambdaRequest,put_access_point_policy_for_object_lambda_request\nPutAccessPointPolicyRequest,put_access_point_policy_request\nPutAccountAliasRequest,put_account_alias_request\nPutAccountConfigurationRequest,put_account_configuration_request\nPutAccountDedicatedIpWarmupAttributesRequest,put_account_dedicated_ip_warmup_attributes_request\nPutAccountDetailsRequest,put_account_details_request\nPutAccountPolicyRequest,put_account_policy_request\nPutAccountPolicyResponse,put_account_policy_response\nPutAccountPreferencesRequest,put_account_preferences_request\nPutAccountPreferencesResponse,put_account_preferences_response\nPutAccountSendingAttributesRequest,put_account_sending_attributes_request\nPutAccountSettingDefaultRequest,put_account_setting_default_request\nPutAccountSettingDefaultResponse,put_account_setting_default_response\nPutAccountSettingRequest,put_account_setting_request\nPutAccountSettingResponse,put_account_setting_response\nPutAccountSuppressionAttributesRequest,put_account_suppression_attributes_request\nPutAccountVdmAttributesRequest,put_account_vdm_attributes_request\nPutActionRevisionInput,put_action_revision_input\nPutActionRevisionOutput,put_action_revision_output\nPutAdminAccountRequest,put_admin_account_request\nPutAggregationAuthorizationRequest,put_aggregation_authorization_request\nPutAggregationAuthorizationResponse,put_aggregation_authorization_response\nPutAlarmRequest,put_alarm_request\nPutAlarmResult,put_alarm_result\nPutAlertManagerDefinitionRequest,put_alert_manager_definition_request\nPutAlertManagerDefinitionResponse,put_alert_manager_definition_response\nPutAlternateContactRequest,put_alternate_contact_request\nPutAnomalyDetectorInput,put_anomaly_detector_input\nPutAppInstanceRetentionSettingsRequest,put_app_instance_retention_settings_request\nPutAppInstanceRetentionSettingsResponse,put_app_instance_retention_settings_response\nPutAppInstanceStreamingConfigurationsRequest,put_app_instance_streaming_configurations_request\nPutAppInstanceStreamingConfigurationsResponse,put_app_instance_streaming_configurations_response\nPutAppInstanceUserExpirationSettingsRequest,put_app_instance_user_expiration_settings_request\nPutAppInstanceUserExpirationSettingsResponse,put_app_instance_user_expiration_settings_response\nPutAppLaunchConfigurationRequest,put_app_launch_configuration_request\nPutAppReplicationConfigurationRequest,put_app_replication_configuration_request\nPutAppValidationConfigurationRequest,put_app_validation_configuration_request\nPutApplicationPolicyRequest,put_application_policy_request\nPutApplicationPolicyResponse,put_application_policy_response\nPutApprovalResultInput,put_approval_result_input\nPutApprovalResultOutput,put_approval_result_output\nPutAppsListRequest,put_apps_list_request\nPutAppsListResponse,put_apps_list_response\nPutAssetPropertyValueEntry,put_asset_property_value_entry\nPutAttributesRequest,put_attributes_request\nPutAttributesResponse,put_attributes_response\nPutAuditEventsRequest,put_audit_events_request\nPutAuditEventsResponse,put_audit_events_response\nPutAuthPolicyRequest,put_auth_policy_request\nPutAuthPolicyResponse,put_auth_policy_response\nPutAutoScalingPolicyInput,put_auto_scaling_policy_input\nPutAutoScalingPolicyOutput,put_auto_scaling_policy_output\nPutAutoTerminationPolicyInput,put_auto_termination_policy_input\nPutBackupPolicyRequest,put_backup_policy_request\nPutBackupVaultAccessPolicyInput,put_backup_vault_access_policy_input\nPutBackupVaultLockConfigurationInput,put_backup_vault_lock_configuration_input\nPutBackupVaultNotificationsInput,put_backup_vault_notifications_input\nPutBandwidthRateLimitScheduleInput,put_bandwidth_rate_limit_schedule_input\nPutBandwidthRateLimitScheduleOutput,put_bandwidth_rate_limit_schedule_output\nPutBlockPublicAccessConfigurationInput,put_block_public_access_configuration_input\nPutBotAliasRequest,put_bot_alias_request\nPutBotAliasResponse,put_bot_alias_response\nPutBotRequest,put_bot_request\nPutBotResponse,put_bot_response\nPutBucketAccelerateConfigurationRequest,put_bucket_accelerate_configuration_request\nPutBucketAclRequest,put_bucket_acl_request\nPutBucketAnalyticsConfigurationRequest,put_bucket_analytics_configuration_request\nPutBucketCorsRequest,put_bucket_cors_request\nPutBucketEncryptionRequest,put_bucket_encryption_request\nPutBucketIntelligentTieringConfigurationRequest,put_bucket_intelligent_tiering_configuration_request\nPutBucketInventoryConfigurationRequest,put_bucket_inventory_configuration_request\nPutBucketLifecycleConfigurationRequest,put_bucket_lifecycle_configuration_request\nPutBucketLoggingRequest,put_bucket_logging_request\nPutBucketMetricsConfigurationRequest,put_bucket_metrics_configuration_request\nPutBucketNotificationConfigurationRequest,put_bucket_notification_configuration_request\nPutBucketOwnershipControlsRequest,put_bucket_ownership_controls_request\nPutBucketPolicyRequest,put_bucket_policy_request\nPutBucketReplicationRequest,put_bucket_replication_request\nPutBucketRequestPaymentRequest,put_bucket_request_payment_request\nPutBucketTaggingRequest,put_bucket_tagging_request\nPutBucketVersioningRequest,put_bucket_versioning_request\nPutBucketWebsiteRequest,put_bucket_website_request\nPutCapacityAssignmentConfigurationInput,put_capacity_assignment_configuration_input\nPutCaseEventConfigurationRequest,put_case_event_configuration_request\nPutChannelExpirationSettingsRequest,put_channel_expiration_settings_request\nPutChannelExpirationSettingsResponse,put_channel_expiration_settings_response\nPutChannelMembershipPreferencesRequest,put_channel_membership_preferences_request\nPutChannelMembershipPreferencesResponse,put_channel_membership_preferences_response\nPutChannelPolicyRequest,put_channel_policy_request\nPutChunkInput,put_chunk_input\nPutChunkOutput,put_chunk_output\nPutClassificationExportConfigurationRequest,put_classification_export_configuration_request\nPutClassificationExportConfigurationResponse,put_classification_export_configuration_response\nPutClusterCapacityProvidersRequest,put_cluster_capacity_providers_request\nPutClusterCapacityProvidersResponse,put_cluster_capacity_providers_response\nPutClusterPolicyRequest,put_cluster_policy_request\nPutClusterPolicyResponse,put_cluster_policy_response\nPutCodeBindingRequest,put_code_binding_request\nPutCodeBindingResponse,put_code_binding_response\nPutCommentReactionInput,put_comment_reaction_input\nPutComplianceItemsRequest,put_compliance_items_request\nPutComponentPolicyRequest,put_component_policy_request\nPutComponentPolicyResponse,put_component_policy_response\nPutCompositeAlarmInput,put_composite_alarm_input\nPutConferencePreferenceRequest,put_conference_preference_request\nPutConfigRuleRequest,put_config_rule_request\nPutConfigurationAggregatorRequest,put_configuration_aggregator_request\nPutConfigurationAggregatorResponse,put_configuration_aggregator_response\nPutConfigurationRecorderRequest,put_configuration_recorder_request\nPutConfigurationRequest,put_configuration_request\nPutConfigurationSetDeliveryOptionsRequest,put_configuration_set_delivery_options_request\nPutConfigurationSetReputationOptionsRequest,put_configuration_set_reputation_options_request\nPutConfigurationSetSendingOptionsRequest,put_configuration_set_sending_options_request\nPutConfigurationSetSuppressionOptionsRequest,put_configuration_set_suppression_options_request\nPutConfigurationSetTrackingOptionsRequest,put_configuration_set_tracking_options_request\nPutConfigurationSetVdmOptionsRequest,put_configuration_set_vdm_options_request\nPutConformancePackRequest,put_conformance_pack_request\nPutConformancePackResponse,put_conformance_pack_response\nPutContactInformationRequest,put_contact_information_request\nPutContactPolicyRequest,put_contact_policy_request\nPutContainerPolicyInput,put_container_policy_input\nPutContainerRecipePolicyRequest,put_container_recipe_policy_request\nPutContainerRecipePolicyResponse,put_container_recipe_policy_response\nPutCoreNetworkPolicyRequest,put_core_network_policy_request\nPutCoreNetworkPolicyResponse,put_core_network_policy_response\nPutCorsPolicyInput,put_cors_policy_input\nPutDashboardInput,put_dashboard_input\nPutDashboardOutput,put_dashboard_output\nPutDataCatalogEncryptionSettingsRequest,put_data_catalog_encryption_settings_request\nPutDataLakeSettingsRequest,put_data_lake_settings_request\nPutDataProtectionPolicyInput,put_data_protection_policy_input\nPutDataProtectionPolicyRequest,put_data_protection_policy_request\nPutDataProtectionPolicyResponse,put_data_protection_policy_response\nPutDataSetRefreshPropertiesRequest,put_data_set_refresh_properties_request\nPutDataSetRefreshPropertiesResponse,put_data_set_refresh_properties_response\nPutDedicatedIpInPoolRequest,put_dedicated_ip_in_pool_request\nPutDedicatedIpPoolScalingAttributesRequest,put_dedicated_ip_pool_scaling_attributes_request\nPutDedicatedIpWarmupAttributesRequest,put_dedicated_ip_warmup_attributes_request\nPutDefaultEncryptionConfigurationRequest,put_default_encryption_configuration_request\nPutDefaultEncryptionConfigurationResponse,put_default_encryption_configuration_response\nPutDeliverabilityDashboardOptionRequest,put_deliverability_dashboard_option_request\nPutDeliveryChannelRequest,put_delivery_channel_request\nPutDestinationPolicyRequest,put_destination_policy_request\nPutDestinationRequest,put_destination_request\nPutDestinationResponse,put_destination_response\nPutDetectorRequest,put_detector_request\nPutDialRequestBatchRequest,put_dial_request_batch_request\nPutDialRequestBatchResponse,put_dial_request_batch_response\nPutDomainPermissionsPolicyRequest,put_domain_permissions_policy_request\nPutDomainPermissionsPolicyResult,put_domain_permissions_policy_result\nPutDraftAppVersionTemplateRequest,put_draft_app_version_template_request\nPutDraftAppVersionTemplateResponse,put_draft_app_version_template_response\nPutEmailIdentityConfigurationSetAttributesRequest,put_email_identity_configuration_set_attributes_request\nPutEmailIdentityDkimAttributesRequest,put_email_identity_dkim_attributes_request\nPutEmailIdentityDkimSigningAttributesRequest,put_email_identity_dkim_signing_attributes_request\nPutEmailIdentityDkimSigningAttributesResponse,put_email_identity_dkim_signing_attributes_response\nPutEmailIdentityFeedbackAttributesRequest,put_email_identity_feedback_attributes_request\nPutEmailIdentityMailFromAttributesRequest,put_email_identity_mail_from_attributes_request\nPutEmailMonitoringConfigurationRequest,put_email_monitoring_configuration_request\nPutEncryptionConfigRequest,put_encryption_config_request\nPutEncryptionConfigResult,put_encryption_config_result\nPutEncryptionConfigurationRequest,put_encryption_configuration_request\nPutEncryptionConfigurationResponse,put_encryption_configuration_response\nPutEntityTypeRequest,put_entity_type_request\nPutEvaluationsRequest,put_evaluations_request\nPutEvaluationsResponse,put_evaluations_response\nPutEventSelectorsRequest,put_event_selectors_request\nPutEventSelectorsResponse,put_event_selectors_response\nPutEventStreamRequest,put_event_stream_request\nPutEventStreamResponse,put_event_stream_response\nPutEventTypeRequest,put_event_type_request\nPutEventsConfigurationRequest,put_events_configuration_request\nPutEventsConfigurationResponse,put_events_configuration_response\nPutEventsRequest,put_events_request\nPutEventsRequestEntry,put_events_request_entry\nPutEventsResponse,put_events_response\nPutEventsResultEntry,put_events_result_entry\nPutExternalEvaluationRequest,put_external_evaluation_request\nPutExternalModelRequest,put_external_model_request\nPutFeedbackRequest,put_feedback_request\nPutFileEntry,put_file_entry\nPutFileEntryConflictException,put_file_entry_conflict_exception\nPutFileInput,put_file_input\nPutFileOutput,put_file_output\nPutFileSystemPolicyRequest,put_file_system_policy_request\nPutFindingsPublicationConfigurationRequest,put_findings_publication_configuration_request\nPutFirewallRuleGroupPolicyRequest,put_firewall_rule_group_policy_request\nPutFirewallRuleGroupPolicyResponse,put_firewall_rule_group_policy_response\nPutFunctionCodeSigningConfigRequest,put_function_code_signing_config_request\nPutFunctionCodeSigningConfigResponse,put_function_code_signing_config_response\nPutFunctionConcurrencyRequest,put_function_concurrency_request\nPutFunctionEventInvokeConfigRequest,put_function_event_invoke_config_request\nPutGatewayResponseRequest,put_gateway_response_request\nPutGeofenceRequest,put_geofence_request\nPutGeofenceResponse,put_geofence_response\nPutGroupConfigurationInput,put_group_configuration_input\nPutGroupPolicyRequest,put_group_policy_request\nPutHypervisorPropertyMappingsInput,put_hypervisor_property_mappings_input\nPutHypervisorPropertyMappingsOutput,put_hypervisor_property_mappings_output\nPutIdentityPolicyRequest,put_identity_policy_request\nPutImagePolicyRequest,put_image_policy_request\nPutImagePolicyResponse,put_image_policy_response\nPutImageRecipePolicyRequest,put_image_recipe_policy_request\nPutImageRecipePolicyResponse,put_image_recipe_policy_response\nPutImageRequest,put_image_request\nPutImageResponse,put_image_response\nPutImageScanningConfigurationRequest,put_image_scanning_configuration_request\nPutImageScanningConfigurationResponse,put_image_scanning_configuration_response\nPutImageTagMutabilityRequest,put_image_tag_mutability_request\nPutImageTagMutabilityResponse,put_image_tag_mutability_response\nPutInboundDmarcSettingsRequest,put_inbound_dmarc_settings_request\nPutInlinePolicyToPermissionSetRequest,put_inline_policy_to_permission_set_request\nPutInsightRuleInput,put_insight_rule_input\nPutInsightSelectorsRequest,put_insight_selectors_request\nPutInsightSelectorsResponse,put_insight_selectors_response\nPutInstancePublicPortsRequest,put_instance_public_ports_request\nPutInstancePublicPortsResult,put_instance_public_ports_result\nPutIntegrationRequest,put_integration_request\nPutIntegrationResponse,put_integration_response\nPutIntegrationResponseRequest,put_integration_response_request\nPutIntentRequest,put_intent_request\nPutIntentResponse,put_intent_response\nPutInventoryRequest,put_inventory_request\nPutInventoryResult,put_inventory_result\nPutInvitationConfigurationRequest,put_invitation_configuration_request\nPutItemInput,put_item_input\nPutItemOutput,put_item_output\nPutItemsRequest,put_items_request\nPutJobFailureResultInput,put_job_failure_result_input\nPutJobSuccessResultInput,put_job_success_result_input\nPutJobTaggingRequest,put_job_tagging_request\nPutKMSEncryptionKeyRequest,put_kms_encryption_key_request\nPutKeyPolicyRequest,put_key_policy_request\nPutKeywordRequest,put_keyword_request\nPutKeywordResult,put_keyword_result\nPutLabelRequest,put_label_request\nPutLaunchActionRequest,put_launch_action_request\nPutLaunchActionResponse,put_launch_action_response\nPutLaunchProfileMembersRequest,put_launch_profile_members_request\nPutLexiconInput,put_lexicon_input\nPutLifecycleConfigurationRequest,put_lifecycle_configuration_request\nPutLifecycleEventHookExecutionStatusInput,put_lifecycle_event_hook_execution_status_input\nPutLifecycleEventHookExecutionStatusOutput,put_lifecycle_event_hook_execution_status_output\nPutLifecycleHookType,put_lifecycle_hook_type\nPutLifecyclePolicyInput,put_lifecycle_policy_input\nPutLifecyclePolicyRequest,put_lifecycle_policy_request\nPutLifecyclePolicyResponse,put_lifecycle_policy_response\nPutLogEventsRequest,put_log_events_request\nPutLogEventsResponse,put_log_events_response\nPutLoggingConfigurationRequest,put_logging_configuration_request\nPutLoggingConfigurationResponse,put_logging_configuration_response\nPutLoggingOptionsRequest,put_logging_options_request\nPutMailboxPermissionsRequest,put_mailbox_permissions_request\nPutMaintenanceStartTimeInput,put_maintenance_start_time_input\nPutMaintenanceStartTimeOutput,put_maintenance_start_time_output\nPutManagedInsightRulesInput,put_managed_insight_rules_input\nPutManagedInsightRulesOutput,put_managed_insight_rules_output\nPutManagedRuleSetVersionsRequest,put_managed_rule_set_versions_request\nPutManagedRuleSetVersionsResponse,put_managed_rule_set_versions_response\nPutManagedScalingPolicyInput,put_managed_scaling_policy_input\nPutMessagingStreamingConfigurationsRequest,put_messaging_streaming_configurations_request\nPutMessagingStreamingConfigurationsResponse,put_messaging_streaming_configurations_response\nPutMetadataFlagBody,put_metadata_flag_body\nPutMetadataFlagRequest,put_metadata_flag_request\nPutMetadataRequest,put_metadata_request\nPutMethodRequest,put_method_request\nPutMethodResponseRequest,put_method_response_request\nPutMetricAlarmInput,put_metric_alarm_input\nPutMetricDataInput,put_metric_data_input\nPutMetricFilterRequest,put_metric_filter_request\nPutMetricPolicyInput,put_metric_policy_input\nPutMetricStreamInput,put_metric_stream_input\nPutMetricStreamOutput,put_metric_stream_output\nPutMobileDeviceAccessOverrideRequest,put_mobile_device_access_override_request\nPutModelInvocationLoggingConfigurationRequest,put_model_invocation_logging_configuration_request\nPutModelPackageGroupPolicyInput,put_model_package_group_policy_input\nPutModelPackageGroupPolicyOutput,put_model_package_group_policy_output\nPutMultiRegionAccessPointPolicyInput,put_multi_region_access_point_policy_input\nPutMultiRegionAccessPointPolicyRequest,put_multi_region_access_point_policy_request\nPutMultiRegionAccessPointPolicyResult,put_multi_region_access_point_policy_result\nPutNotificationChannelRequest,put_notification_channel_request\nPutNotificationConfigurationType,put_notification_configuration_type\nPutNotificationSettingsRequest,put_notification_settings_request\nPutNotificationSettingsResponse,put_notification_settings_response\nPutObjectAclOutput,put_object_acl_output\nPutObjectAclRequest,put_object_acl_request\nPutObjectInput,put_object_input\nPutObjectLegalHoldOutput,put_object_legal_hold_output\nPutObjectLegalHoldRequest,put_object_legal_hold_request\nPutObjectLockConfigurationOutput,put_object_lock_configuration_output\nPutObjectLockConfigurationRequest,put_object_lock_configuration_request\nPutObjectOutput,put_object_output\nPutObjectRequest,put_object_request\nPutObjectResponse,put_object_response\nPutObjectRetentionOutput,put_object_retention_output\nPutObjectRetentionRequest,put_object_retention_request\nPutObjectTaggingOutput,put_object_tagging_output\nPutObjectTaggingRequest,put_object_tagging_request\nPutOptedOutNumberRequest,put_opted_out_number_request\nPutOptedOutNumberResult,put_opted_out_number_result\nPutOrganizationConfigRuleRequest,put_organization_config_rule_request\nPutOrganizationConfigRuleResponse,put_organization_config_rule_response\nPutOrganizationConformancePackRequest,put_organization_conformance_pack_request\nPutOrganizationConformancePackResponse,put_organization_conformance_pack_response\nPutOriginEndpointPolicyRequest,put_origin_endpoint_policy_request\nPutOutcomeRequest,put_outcome_request\nPutPackageOriginConfigurationRequest,put_package_origin_configuration_request\nPutPackageOriginConfigurationResult,put_package_origin_configuration_result\nPutParameterRequest,put_parameter_request\nPutParameterResult,put_parameter_result\nPutPartnerEventsRequest,put_partner_events_request\nPutPartnerEventsRequestEntry,put_partner_events_request_entry\nPutPartnerEventsResponse,put_partner_events_response\nPutPartnerEventsResultEntry,put_partner_events_result_entry\nPutPermissionPolicyRequest,put_permission_policy_request\nPutPermissionRequest,put_permission_request\nPutPermissionResponse,put_permission_response\nPutPermissionsBoundaryToPermissionSetRequest,put_permissions_boundary_to_permission_set_request\nPutPipelineDefinitionInput,put_pipeline_definition_input\nPutPipelineDefinitionOutput,put_pipeline_definition_output\nPutPlaybackConfigurationRequest,put_playback_configuration_request\nPutPlaybackConfigurationResponse,put_playback_configuration_response\nPutPolicyRequest,put_policy_request\nPutPolicyResponse,put_policy_response\nPutPortfolioPreferencesRequest,put_portfolio_preferences_request\nPutPositionConfigurationRequest,put_position_configuration_request\nPutPrincipalMappingRequest,put_principal_mapping_request\nPutProfileObjectRequest,put_profile_object_request\nPutProfileObjectResponse,put_profile_object_response\nPutProfileObjectTypeRequest,put_profile_object_type_request\nPutProfileObjectTypeResponse,put_profile_object_type_response\nPutProjectEventsRequest,put_project_events_request\nPutProjectEventsResponse,put_project_events_response\nPutProjectEventsResultEntry,put_project_events_result_entry\nPutProjectPolicyRequest,put_project_policy_request\nPutProjectPolicyResponse,put_project_policy_response\nPutProtocolsListRequest,put_protocols_list_request\nPutProtocolsListResponse,put_protocols_list_response\nPutProvisionedConcurrencyConfigRequest,put_provisioned_concurrency_config_request\nPutProvisionedConcurrencyConfigResponse,put_provisioned_concurrency_config_response\nPutPublicAccessBlockRequest,put_public_access_block_request\nPutQueryDefinitionRequest,put_query_definition_request\nPutQueryDefinitionResponse,put_query_definition_response\nPutRawMessageContentRequest,put_raw_message_content_request\nPutRecommendationFeedbackRequest,put_recommendation_feedback_request\nPutRecommendationPreferencesRequest,put_recommendation_preferences_request\nPutRecordBatchInput,put_record_batch_input\nPutRecordBatchOutput,put_record_batch_output\nPutRecordBatchResponseEntry,put_record_batch_response_entry\nPutRecordInput,put_record_input\nPutRecordOutput,put_record_output\nPutRecordRequest,put_record_request\nPutRecordsInput,put_records_input\nPutRecordsOutput,put_records_output\nPutRecordsRequestEntry,put_records_request_entry\nPutRecordsResultEntry,put_records_result_entry\nPutRegistryCatalogDataRequest,put_registry_catalog_data_request\nPutRegistryCatalogDataResponse,put_registry_catalog_data_response\nPutRegistryPolicyRequest,put_registry_policy_request\nPutRegistryPolicyResponse,put_registry_policy_response\nPutRegistryScanningConfigurationRequest,put_registry_scanning_configuration_request\nPutRegistryScanningConfigurationResponse,put_registry_scanning_configuration_response\nPutRemediationConfigurationsRequest,put_remediation_configurations_request\nPutRemediationConfigurationsResponse,put_remediation_configurations_response\nPutRemediationExceptionsRequest,put_remediation_exceptions_request\nPutRemediationExceptionsResponse,put_remediation_exceptions_response\nPutReplicationConfigurationRequest,put_replication_configuration_request\nPutReplicationConfigurationResponse,put_replication_configuration_response\nPutReportDefinitionRequest,put_report_definition_request\nPutReportDefinitionResult,put_report_definition_result\nPutRepositoryCatalogDataRequest,put_repository_catalog_data_request\nPutRepositoryCatalogDataResponse,put_repository_catalog_data_response\nPutRepositoryPermissionsPolicyRequest,put_repository_permissions_policy_request\nPutRepositoryPermissionsPolicyResult,put_repository_permissions_policy_result\nPutRepositoryTriggersInput,put_repository_triggers_input\nPutRepositoryTriggersOutput,put_repository_triggers_output\nPutRequest,put_request\nPutResolverQueryLogConfigPolicyRequest,put_resolver_query_log_config_policy_request\nPutResolverQueryLogConfigPolicyResponse,put_resolver_query_log_config_policy_response\nPutResolverRulePolicyRequest,put_resolver_rule_policy_request\nPutResolverRulePolicyResponse,put_resolver_rule_policy_response\nPutResourceAttributesRequest,put_resource_attributes_request\nPutResourceConfigRequest,put_resource_config_request\nPutResourceLogLevelRequest,put_resource_log_level_request\nPutResourcePermissionInput,put_resource_permission_input\nPutResourcePermissionOutput,put_resource_permission_output\nPutResourcePolicyInput,put_resource_policy_input\nPutResourcePolicyOutput,put_resource_policy_output\nPutResourcePolicyRequest,put_resource_policy_request\nPutResourcePolicyResponse,put_resource_policy_response\nPutResourcePolicyResult,put_resource_policy_result\nPutResourceSetRequest,put_resource_set_request\nPutResourceSetResponse,put_resource_set_response\nPutRestApiRequest,put_rest_api_request\nPutRetentionConfigurationRequest,put_retention_configuration_request\nPutRetentionConfigurationResponse,put_retention_configuration_response\nPutRetentionPolicyRequest,put_retention_policy_request\nPutRetentionSettingsRequest,put_retention_settings_request\nPutRetentionSettingsResponse,put_retention_settings_response\nPutRolePermissionsBoundaryRequest,put_role_permissions_boundary_request\nPutRolePolicyRequest,put_role_policy_request\nPutRoomSkillParameterRequest,put_room_skill_parameter_request\nPutRuleGroupsNamespaceRequest,put_rule_groups_namespace_request\nPutRuleGroupsNamespaceResponse,put_rule_groups_namespace_response\nPutRuleRequest,put_rule_request\nPutRuleResponse,put_rule_response\nPutRumEventsRequest,put_rum_events_request\nPutRumMetricsDestinationRequest,put_rum_metrics_destination_request\nPutRuntimeManagementConfigRequest,put_runtime_management_config_request\nPutRuntimeManagementConfigResponse,put_runtime_management_config_response\nPutScalingPolicyInput,put_scaling_policy_input\nPutScalingPolicyOutput,put_scaling_policy_output\nPutScalingPolicyRequest,put_scaling_policy_request\nPutScalingPolicyResponse,put_scaling_policy_response\nPutScalingPolicyType,put_scaling_policy_type\nPutScheduledActionRequest,put_scheduled_action_request\nPutScheduledUpdateGroupActionType,put_scheduled_update_group_action_type\nPutSchemaFromJsonRequest,put_schema_from_json_request\nPutSchemaFromJsonResponse,put_schema_from_json_response\nPutSchemaInput,put_schema_input\nPutSchemaOutput,put_schema_output\nPutSchemaVersionMetadataInput,put_schema_version_metadata_input\nPutSchemaVersionMetadataResponse,put_schema_version_metadata_response\nPutSecretValueRequest,put_secret_value_request\nPutSecretValueResponse,put_secret_value_response\nPutServiceQuotaIncreaseRequestIntoTemplateRequest,put_service_quota_increase_request_into_template_request\nPutServiceQuotaIncreaseRequestIntoTemplateResponse,put_service_quota_increase_request_into_template_response\nPutSessionRequest,put_session_request\nPutSessionResponse,put_session_response\nPutSigningProfileRequest,put_signing_profile_request\nPutSigningProfileResponse,put_signing_profile_response\nPutSinkPolicyInput,put_sink_policy_input\nPutSinkPolicyOutput,put_sink_policy_output\nPutSipMediaApplicationAlexaSkillConfigurationRequest,put_sip_media_application_alexa_skill_configuration_request\nPutSipMediaApplicationAlexaSkillConfigurationResponse,put_sip_media_application_alexa_skill_configuration_response\nPutSipMediaApplicationLoggingConfigurationRequest,put_sip_media_application_logging_configuration_request\nPutSipMediaApplicationLoggingConfigurationResponse,put_sip_media_application_logging_configuration_response\nPutSkillAuthorizationRequest,put_skill_authorization_request\nPutSlotTypeRequest,put_slot_type_request\nPutSlotTypeResponse,put_slot_type_response\nPutSnapshotBlockRequest,put_snapshot_block_request\nPutSnapshotBlockResponse,put_snapshot_block_response\nPutSolFunctionPackageContentInput,put_sol_function_package_content_input\nPutSolFunctionPackageContentMetadata,put_sol_function_package_content_metadata\nPutSolFunctionPackageContentOutput,put_sol_function_package_content_output\nPutSolNetworkPackageContentInput,put_sol_network_package_content_input\nPutSolNetworkPackageContentMetadata,put_sol_network_package_content_metadata\nPutSolNetworkPackageContentOutput,put_sol_network_package_content_output\nPutSourceServerActionRequest,put_source_server_action_request\nPutStorageConfigurationRequest,put_storage_configuration_request\nPutStorageConfigurationResponse,put_storage_configuration_response\nPutStorageLensConfigurationRequest,put_storage_lens_configuration_request\nPutStorageLensConfigurationTaggingRequest,put_storage_lens_configuration_tagging_request\nPutStoredQueryRequest,put_stored_query_request\nPutStoredQueryResponse,put_stored_query_response\nPutStudioMembersRequest,put_studio_members_request\nPutSubscriptionFilterRequest,put_subscription_filter_request\nPutSuppressedDestinationRequest,put_suppressed_destination_request\nPutTargetsRequest,put_targets_request\nPutTargetsResponse,put_targets_response\nPutTargetsResultEntry,put_targets_result_entry\nPutTelemetryRecordsRequest,put_telemetry_records_request\nPutTemplateActionRequest,put_template_action_request\nPutThirdPartyJobFailureResultInput,put_third_party_job_failure_result_input\nPutThirdPartyJobSuccessResultInput,put_third_party_job_success_result_input\nPutTraceSegmentsRequest,put_trace_segments_request\nPutTraceSegmentsResult,put_trace_segments_result\nPutUserPermissionsBoundaryRequest,put_user_permissions_boundary_request\nPutUserPolicyRequest,put_user_policy_request\nPutUserStatusRequest,put_user_status_request\nPutUsersRequest,put_users_request\nPutVerificationStateOnViolationRequest,put_verification_state_on_violation_request\nPutVoiceConnectorEmergencyCallingConfigurationRequest,put_voice_connector_emergency_calling_configuration_request\nPutVoiceConnectorEmergencyCallingConfigurationResponse,put_voice_connector_emergency_calling_configuration_response\nPutVoiceConnectorLoggingConfigurationRequest,put_voice_connector_logging_configuration_request\nPutVoiceConnectorLoggingConfigurationResponse,put_voice_connector_logging_configuration_response\nPutVoiceConnectorOriginationRequest,put_voice_connector_origination_request\nPutVoiceConnectorOriginationResponse,put_voice_connector_origination_response\nPutVoiceConnectorProxyRequest,put_voice_connector_proxy_request\nPutVoiceConnectorProxyResponse,put_voice_connector_proxy_response\nPutVoiceConnectorStreamingConfigurationRequest,put_voice_connector_streaming_configuration_request\nPutVoiceConnectorStreamingConfigurationResponse,put_voice_connector_streaming_configuration_response\nPutVoiceConnectorTerminationCredentialsRequest,put_voice_connector_termination_credentials_request\nPutVoiceConnectorTerminationRequest,put_voice_connector_termination_request\nPutVoiceConnectorTerminationResponse,put_voice_connector_termination_response\nPutWarmPoolType,put_warm_pool_type\nPutWebhookInput,put_webhook_input\nPutWebhookOutput,put_webhook_output\nPutWorkflowRunPropertiesRequest,put_workflow_run_properties_request\nPwd,pwd\nPythonScript,python_script\nPythonVersion,python_version\nQRCodePNG,qr_code_png\nQSearchBar,q_search_bar\nQopConfiguration,qop_configuration\nQualification,qualification\nQualificationRequest,qualification_request\nQualificationRequestId,qualification_request_id\nQualificationRequests,qualification_requests\nQualificationRequirement,qualification_requirement\nQualificationRequirements,qualification_requirements\nQualificationStatus,qualification_status\nQualificationType,qualification_type\nQualificationTypeId,qualification_type_id\nQualificationTypeStatus,qualification_type_status\nQualificationTypes,qualification_types\nQualifications,qualifications\nQualifier,qualifier\nQuality,quality\nQualityCheck,quality_check\nQualityCheckStepMetadata,quality_check_step_metadata\nQualityFilter,quality_filter\nQualityLevel,quality_level\nQualityTuningLevel,quality_tuning_level\nQuantile,quantile\nQuantity,quantity\nQuantumTaskQueueInfo,quantum_task_queue_info\nQuantumTaskSummary,quantum_task_summary\nQueries,queries\nQueriesConfig,queries_config\nQuery,query\nQueryAlias,query_alias\nQueryArg,query_arg\nQueryArgProfile,query_arg_profile\nQueryArgProfileConfig,query_arg_profile_config\nQueryArgProfileEmpty,query_arg_profile_empty\nQueryArgProfiles,query_arg_profiles\nQueryArgument,query_argument\nQueryArn,query_arn\nQueryAsOfTime,query_as_of_time\nQueryAssistantRequest,query_assistant_request\nQueryAssistantResponse,query_assistant_response\nQueryCapacityUnits,query_capacity_units\nQueryCompileError,query_compile_error\nQueryCompileErrorLocation,query_compile_error_location\nQueryDefinition,query_definition\nQueryEndDate,query_end_date\nQueryError,query_error\nQueryErrors,query_errors\nQueryEvalStats,query_eval_stats\nQueryExecution,query_execution\nQueryExecutionContext,query_execution_context\nQueryExecutionException,query_execution_exception\nQueryExecutionId,query_execution_id\nQueryExecutionIds,query_execution_ids\nQueryExecutionStatistics,query_execution_statistics\nQueryExecutionStatus,query_execution_status\nQueryExecutions,query_executions\nQueryFilter,query_filter\nQueryFilters,query_filters\nQueryForecastRequest,query_forecast_request\nQueryForecastResponse,query_forecast_response\nQueryId,query_id\nQueryIdNotFoundException,query_id_not_found_exception\nQueryIdentifiersEnclosingOption,query_identifiers_enclosing_option\nQueryInfo,query_info\nQueryInput,query_input\nQueryLanguageVersion,query_language_version\nQueryLimitExceededException,query_limit_exceeded_exception\nQueryLimitException,query_limit_exception\nQueryLineageRequest,query_lineage_request\nQueryLineageResponse,query_lineage_response\nQueryLogLookBackWindowInDays,query_log_look_back_window_in_days\nQueryLoggingConfig,query_logging_config\nQueryLoggingConfigAlreadyExists,query_logging_config_already_exists\nQueryLoggingConfigs,query_logging_configs\nQueryName,query_name\nQueryObjectsInput,query_objects_input\nQueryObjectsOutput,query_objects_output\nQueryOutput,query_output\nQueryParameterMatch,query_parameter_match\nQueryParameters,query_parameters\nQueryPlanningContext,query_planning_context\nQueryPlanningTimeInMillis,query_planning_time_in_millis\nQueryQueueTimeInMillis,query_queue_time_in_millis\nQueryRecommendationTriggerData,query_recommendation_trigger_data\nQueryRequest,query_request\nQueryResponse,query_response\nQueryResult,query_result\nQueryResultItem,query_result_item\nQueryResultRows,query_result_rows\nQueryResultTypeFilter,query_result_type_filter\nQueryRuntimeStatistics,query_runtime_statistics\nQueryRuntimeStatisticsRows,query_runtime_statistics_rows\nQueryRuntimeStatisticsTimeline,query_runtime_statistics_timeline\nQuerySchemaVersionMetadataInput,query_schema_version_metadata_input\nQuerySchemaVersionMetadataResponse,query_schema_version_metadata_response\nQueryScopes,query_scopes\nQuerySingleAlwaysOnNode,query_single_always_on_node\nQueryStage,query_stage\nQueryStagePlan,query_stage_plan\nQueryStagePlanNode,query_stage_plan_node\nQueryStartDate,query_start_date\nQueryStatement,query_statement\nQueryStatistics,query_statistics\nQueryStatisticsForDescribeQuery,query_statistics_for_describe_query\nQueryStatus,query_status\nQueryString,query_string\nQueryStringBehavior,query_string_behavior\nQueryStringCacheKeys,query_string_cache_keys\nQueryStringConditionConfig,query_string_condition_config\nQueryStringConfig,query_string_config\nQueryStringKeyValuePair,query_string_key_value_pair\nQueryStringNames,query_string_names\nQueryStringObject,query_string_object\nQueryStringParameters,query_string_parameters\nQueryStrings,query_strings\nQueryStringsConfig,query_strings_config\nQuerySubmissionTime,query_submission_time\nQuerySuggestionsBlockListSummary,query_suggestions_block_list_summary\nQuerySuggestionsId,query_suggestions_id\nQueryTableRowsRequest,query_table_rows_request\nQueryTableRowsResult,query_table_rows_result\nQueryText,query_text\nQueryTexts,query_texts\nQueryTimeoutException,query_timeout_exception\nQueryTooLargeException,query_too_large_exception\nQueryWhatIfForecastRequest,query_what_if_forecast_request\nQueryWhatIfForecastResponse,query_what_if_forecast_response\nQuestion,question\nQuestionChoices,question_choices\nQuestionDescription,question_description\nQuestionDifference,question_difference\nQuestionDifferences,question_differences\nQuestionId,question_id\nQuestionIdentifier,question_identifier\nQuestionMetric,question_metric\nQuestionPriority,question_priority\nQuestionTitle,question_title\nQuestionType,question_type\nQuestionTypeProperties,question_type_properties\nQuestions,questions\nQueue,queue\nQueueArn,queue_arn\nQueueConfig,queue_config\nQueueConfigs,queue_configs\nQueueConfiguration,queue_configuration\nQueueConfigurations,queue_configurations\nQueueId,queue_id\nQueueInfo,queue_info\nQueueName,queue_name\nQueueNamePrefix,queue_name_prefix\nQueueOwnerAWSAccountId,queue_owner_aws_account_id\nQueueQuickConnectConfig,queue_quick_connect_config\nQueueReference,queue_reference\nQueueReferences,queue_references\nQueueSearchCriteria,queue_search_criteria\nQueueSearchFilter,queue_search_filter\nQueueSummary,queue_summary\nQueueSummaryList,queue_summary_list\nQueueTimeMillis,queue_time_millis\nQueueTransition,queue_transition\nQueueTransitions,queue_transitions\nQueueType,queue_type\nQueueTypeCondition,queue_type_condition\nQueueTypes,queue_types\nQueueUrl,queue_url\nQueueUrls,queue_urls\nQueuedIngestion,queued_ingestion\nQueues,queues\nQuickConnect,quick_connect\nQuickConnectARN,quick_connect_arn\nQuickConnectConfig,quick_connect_config\nQuickConnectId,quick_connect_id\nQuickConnectIds,quick_connect_ids\nQuickConnectSearchCriteria,quick_connect_search_criteria\nQuickConnectSearchFilter,quick_connect_search_filter\nQuickConnectSummary,quick_connect_summary\nQuickConnectSummaryList,quick_connect_summary_list\nQuickConnectType,quick_connect_type\nQuickConnectTypes,quick_connect_types\nQuickConnects,quick_connects\nQuickSightConsole,quick_sight_console\nQuickSightUserNotFoundException,quick_sight_user_not_found_exception\nQuiet,quiet\nQuietTime,quiet_time\nQuipConfiguration,quip_configuration\nQuota,quota\nQuotaAppliedAtLevel,quota_applied_at_level\nQuotaArn,quota_arn\nQuotaCode,quota_code\nQuotaContext,quota_context\nQuotaContextInfo,quota_context_info\nQuotaExceededException,quota_exceeded_exception\nQuotaName,quota_name\nQuotaPeriod,quota_period\nQuotaRequestedAtLevel,quota_requested_at_level\nQuotaSettings,quota_settings\nQuotas,quotas\nQuoteChar,quote_char\nQuoteCharacter,quote_character\nQuoteEscapeCharacter,quote_escape_character\nQuoteFields,quote_fields\nQuoteSymbol,quote_symbol\nQvbrQualityLevel,qvbr_quality_level\nQvbrQualityLevelFineTune,qvbr_quality_level_fine_tune\nQvbrSettings,qvbr_settings\nR53HostedZoneDeletionState,r53_hosted_zone_deletion_state\nR53Resource,r53_resource\nR53ResourceRecord,r53_resource_record\nRDFGraphSummary,rdf_graph_summary\nRDFGraphSummaryValueMap,rdf_graph_summary_value_map\nRDSData,rds_data\nRDSDataSpec,rds_data_spec\nRDSDatabase,rds_database\nRDSDatabaseCredentials,rds_database_credentials\nRDSInstanceDetails,rds_instance_details\nRDSMetadata,rds_metadata\nRDSSourceConfig,rds_source_config\nRICostForUnusedHours,ri_cost_for_unused_hours\nRMSE,rmse\nRSessionAppSettings,r_session_app_settings\nRStudioConnectUrl,r_studio_connect_url\nRStudioPackageManagerUrl,r_studio_package_manager_url\nRStudioServerProAppSettings,r_studio_server_pro_app_settings\nRStudioServerProDomainSettings,r_studio_server_pro_domain_settings\nRStudioServerProDomainSettingsForUpdate,r_studio_server_pro_domain_settings_for_update\nRTMPConfiguration,rtmp_configuration\nRaAllowed,ra_allowed\nRabbitMQBrokerParameters,rabbit_mq_broker_parameters\nRackElevation,rack_elevation\nRackId,rack_id\nRackPhysicalProperties,rack_physical_properties\nRadarChartAggregatedFieldWells,radar_chart_aggregated_field_wells\nRadarChartAreaStyleSettings,radar_chart_area_style_settings\nRadarChartConfiguration,radar_chart_configuration\nRadarChartFieldWells,radar_chart_field_wells\nRadarChartSeriesSettings,radar_chart_series_settings\nRadarChartSortConfiguration,radar_chart_sort_configuration\nRadarChartVisual,radar_chart_visual\nRadios,radios\nRadius,radius\nRadiusPort,radius_port\nRadiusRetries,radius_retries\nRadiusServers,radius_servers\nRadiusSettings,radius_settings\nRadiusStatus,radius_status\nRadiusTimeout,radius_timeout\nRaidArray,raid_array\nRaidArrayId,raid_array_id\nRaidArrayIds,raid_array_ids\nRaidArrays,raid_arrays\nRaidLevel,raid_level\nRamDiskId,ram_disk_id\nRamdisk,ramdisk\nRamdiskId,ramdisk_id\nRandomNonce,random_nonce\nRandomPassword,random_password\nRandomSeed,random_seed\nRandomSplit,random_split\nRandomSplitActivity,random_split_activity\nRandomSplitEntry,random_split_entry\nRange,range\nRangeConstant,range_constant\nRangeEndsLabelType,range_ends_label_type\nRangeInBytes,range_in_bytes\nRangeInKilometers,range_in_kilometers\nRangeMaximum,range_maximum\nRangeMaximumValue,range_maximum_value\nRangeMinimum,range_minimum\nRangeMinimumValue,range_minimum_value\nRangeNotSatisfiableException,range_not_satisfiable_exception\nRangedConnectionDetails,ranged_connection_details\nRangedSocketAddress,ranged_socket_address\nRangesOnIndexedValues,ranges_on_indexed_values\nRank,rank\nRankOrder,rank_order\nRasterDataCollectionArn,raster_data_collection_arn\nRasterDataCollectionMetadata,raster_data_collection_metadata\nRasterDataCollectionName,raster_data_collection_name\nRasterDataCollectionQuery,raster_data_collection_query\nRasterDataCollectionQueryInput,raster_data_collection_query_input\nRasterDataCollectionQueryOutput,raster_data_collection_query_output\nRasterDataCollectionQueryWithBandFilterInput,raster_data_collection_query_with_band_filter_input\nRasterDataCollectionSummaries,raster_data_collection_summaries\nRateBasedRule,rate_based_rule\nRateBasedStatement,rate_based_statement\nRateBasedStatementCustomKey,rate_based_statement_custom_key\nRateBasedStatementManagedKeysIPSet,rate_based_statement_managed_keys_ip_set\nRateControlMode,rate_control_mode\nRateExceededException,rate_exceeded_exception\nRateIncreaseCriteria,rate_increase_criteria\nRateKey,rate_key\nRateLimit,rate_limit\nRateLimitCookie,rate_limit_cookie\nRateLimitExceededException,rate_limit_exceeded_exception\nRateLimitHeader,rate_limit_header\nRateLimitLabelNamespace,rate_limit_label_namespace\nRateLimitQueryArgument,rate_limit_query_argument\nRateLimitQueryString,rate_limit_query_string\nRateLimitUriPath,rate_limit_uri_path\nRateMode,rate_mode\nRating,rating\nRaw,raw\nRawContent,raw_content\nRawEmail,raw_email\nRawFormat,raw_format\nRawInputRecords,raw_input_records\nRawMessage,raw_message\nRawMessageContent,raw_message_content\nRawMetricData,raw_metric_data\nRawSecretAccessKey,raw_secret_access_key\nRawSettings,raw_settings\nRawString,raw_string\nRblName,rbl_name\nRdsConfiguration,rds_configuration\nRdsDbClusterSnapshotConfiguration,rds_db_cluster_snapshot_configuration\nRdsDbInstance,rds_db_instance\nRdsDbInstanceArn,rds_db_instance_arn\nRdsDbInstanceArns,rds_db_instance_arns\nRdsDbInstanceDetails,rds_db_instance_details\nRdsDbInstances,rds_db_instances\nRdsDbSnapshotConfiguration,rds_db_snapshot_configuration\nRdsDbUserDetails,rds_db_user_details\nRdsEngine,rds_engine\nRdsEventCategories,rds_event_categories\nRdsEventMessage,rds_event_message\nRdsHttpEndpointConfig,rds_http_endpoint_config\nRdsLoginAttemptAction,rds_login_attempt_action\nRdsParameters,rds_parameters\nRdsRecommendation,rds_recommendation\nRdsRequirements,rds_requirements\nRdsResourceId,rds_resource_id\nReEncryptDataInput,re_encrypt_data_input\nReEncryptDataOutput,re_encrypt_data_output\nReEncryptRequest,re_encrypt_request\nReEncryptResponse,re_encrypt_response\nReactStartCodegenJobData,react_start_codegen_job_data\nReactionForComment,reaction_for_comment\nReactionLimitExceededException,reaction_limit_exceeded_exception\nReactionValueFormats,reaction_value_formats\nReactionValueRequiredException,reaction_value_required_exception\nReactions,reactions\nReactiveAnomalies,reactive_anomalies\nReactiveAnomaly,reactive_anomaly\nReactiveAnomalySummary,reactive_anomaly_summary\nReactiveInsight,reactive_insight\nReactiveInsightSummary,reactive_insight_summary\nReactiveInsights,reactive_insights\nReactiveOrganizationInsightSummary,reactive_organization_insight_summary\nRead,read\nReadAccessPrincipalArns,read_access_principal_arns\nReadAheadBlocks,read_ahead_blocks\nReadAttributes,read_attributes\nReadBackupOnly,read_backup_only\nReadCapacityUnits,read_capacity_units\nReadDeleteRate,read_delete_rate\nReadEndpoint,read_endpoint\nReadIOs,read_ios\nReadJobRequest,read_job_request\nReadJobResponse,read_job_response\nReadMarkerTimestamp,read_marker_timestamp\nReadOnly,read_only\nReadOnlyAdmins,read_only_admins\nReadOnlyFieldInfo,read_only_field_info\nReadOnlyFields,read_only_fields\nReadOnlyViolationException,read_only_violation_exception\nReadOptions,read_options\nReadPipelineRequest,read_pipeline_request\nReadPipelineResponse,read_pipeline_response\nReadPresetRequest,read_preset_request\nReadPresetResponse,read_preset_response\nReadRate,read_rate\nReadRatePercent,read_rate_percent\nReadReplicaCapable,read_replica_capable\nReadReplicaDBClusterIdentifiers,read_replica_db_cluster_identifiers\nReadReplicaDBInstanceIdentifiers,read_replica_db_instance_identifiers\nReadReplicaIdentifiers,read_replica_identifiers\nReadReplicaSourceDBClusterIdentifier,read_replica_source_db_cluster_identifier\nReadReplicaSourceDBInstanceIdentifier,read_replica_source_db_instance_identifier\nReadSetBatchError,read_set_batch_error\nReadSetFiles,read_set_files\nReadSetFilter,read_set_filter\nReadSetListItem,read_set_list_item\nReadSetUploadPartListFilter,read_set_upload_part_list_filter\nReadSetUploadPartListItem,read_set_upload_part_list_item\nReadTableSpaceName,read_table_space_name\nReadTime,read_time\nReadTimestamp,read_timestamp\nReadWriteType,read_write_type\nReaderEndpoint,reader_endpoint\nReaderGroup,reader_group\nReaders,readers\nReadiness,readiness\nReadinessCheckArn,readiness_check_arn\nReadinessCheckName,readiness_check_name\nReadinessCheckOutput,readiness_check_output\nReadinessCheckSummary,readiness_check_summary\nReadinessChecks,readiness_checks\nReadinessScopes,readiness_scopes\nReadmeBody,readme_body\nReadmeUrl,readme_url\nReadonlyRootFilesystem,readonly_root_filesystem\nReady,ready\nReadyDateTime,ready_date_time\nRealTimeAlertConfiguration,real_time_alert_configuration\nRealTimeAlertRule,real_time_alert_rule\nRealTimeInferenceConfig,real_time_inference_config\nRealTimeInferenceRecommendation,real_time_inference_recommendation\nRealTimeInferenceRecommendations,real_time_inference_recommendations\nRealizedSavings,realized_savings\nRealm,realm\nRealtimeContactAnalysisSegment,realtime_contact_analysis_segment\nRealtimeEndpointInfo,realtime_endpoint_info\nRealtimeLogConfig,realtime_log_config\nRealtimeLogConfigAlreadyExists,realtime_log_config_already_exists\nRealtimeLogConfigArn,realtime_log_config_arn\nRealtimeLogConfigInUse,realtime_log_config_in_use\nRealtimeLogConfigName,realtime_log_config_name\nRealtimeLogConfigOwnerMismatch,realtime_log_config_owner_mismatch\nRealtimeLogConfigs,realtime_log_configs\nRealtimeMetricsSubscriptionConfig,realtime_metrics_subscription_config\nRealtimeMetricsSubscriptionStatus,realtime_metrics_subscription_status\nReason,reason\nReasonCode,reason_code\nReasonCodeSummary,reason_code_summary\nReasonCodes,reason_codes\nReasonContext,reason_context\nReasonForNewProvisioningData,reason_for_new_provisioning_data\nReasonMessage,reason_message\nReasons,reasons\nRebalanceSlotsInGlobalReplicationGroupMessage,rebalance_slots_in_global_replication_group_message\nRebalanceSlotsInGlobalReplicationGroupResult,rebalance_slots_in_global_replication_group_result\nRebootBrokerRequest,reboot_broker_request\nRebootBrokerResponse,reboot_broker_response\nRebootCacheClusterMessage,reboot_cache_cluster_message\nRebootCacheClusterResult,reboot_cache_cluster_result\nRebootClusterMessage,reboot_cluster_message\nRebootClusterResult,reboot_cluster_result\nRebootDBClusterMessage,reboot_db_cluster_message\nRebootDBClusterResult,reboot_db_cluster_result\nRebootDBInstanceMessage,reboot_db_instance_message\nRebootDBInstanceResult,reboot_db_instance_result\nRebootInputDeviceRequest,reboot_input_device_request\nRebootInstanceRequest,reboot_instance_request\nRebootInstanceResult,reboot_instance_result\nRebootInstancesRequest,reboot_instances_request\nRebootNodeRequest,reboot_node_request\nRebootNodeResponse,reboot_node_response\nRebootOption,reboot_option\nRebootRelationalDatabaseRequest,reboot_relational_database_request\nRebootRelationalDatabaseResult,reboot_relational_database_result\nRebootReplicationInstanceMessage,reboot_replication_instance_message\nRebootReplicationInstanceResponse,reboot_replication_instance_response\nRebootRequest,reboot_request\nRebootWorkspaceRequests,reboot_workspace_requests\nRebootWorkspacesRequest,reboot_workspaces_request\nRebootWorkspacesResult,reboot_workspaces_result\nRebooting,rebooting\nRebuildEnvironmentMessage,rebuild_environment_message\nRebuildRequest,rebuild_request\nRebuildSnapshots,rebuild_snapshots\nRebuildWorkspace,rebuild_workspace\nRebuildWorkspaceRequests,rebuild_workspace_requests\nRebuildWorkspacesRequest,rebuild_workspaces_request\nRebuildWorkspacesResult,rebuild_workspaces_result\nRec601Settings,rec601_settings\nRec709Settings,rec709_settings\nRecall,recall\nReceipt,receipt\nReceiptAction,receipt_action\nReceiptFilter,receipt_filter\nReceiptHandle,receipt_handle\nReceiptInfo,receipt_info\nReceiptIpFilter,receipt_ip_filter\nReceiptRule,receipt_rule\nReceiptRuleSetMetadata,receipt_rule_set_metadata\nReceiptTime,receipt_time\nReceiptType,receipt_type\nReceipts,receipts\nReceiveMessageRequest,receive_message_request\nReceiveMessageResult,receive_message_result\nReceiveRequestAttemptId,receive_request_attempt_id\nReceivedAt,received_at\nReceivedEventAgeHistogram,received_event_age_histogram\nReceivedMetadata,received_metadata\nReceivedStatus,received_status\nReceivedStatusReason,received_status_reason\nReceivedTime,received_time\nRecency,recency\nRecencyDimension,recency_dimension\nRecencyType,recency_type\nRecentCaseCommunications,recent_case_communications\nRecentlyActive,recently_active\nRecentlyFailedRuns,recently_failed_runs\nRecipe,recipe\nRecipeAction,recipe_action\nRecipeArn,recipe_arn\nRecipeName,recipe_name\nRecipeReference,recipe_reference\nRecipeStep,recipe_step\nRecipeSummary,recipe_summary\nRecipeUri,recipe_uri\nRecipeVersion,recipe_version\nRecipeVersionErrorDetail,recipe_version_error_detail\nRecipeVersions,recipe_versions\nRecipes,recipes\nRecipient,recipient\nRecipientArn,recipient_arn\nRecipientDetail,recipient_detail\nRecipientDsnFields,recipient_dsn_fields\nRecipientId,recipient_id\nRecipientInfo,recipient_info\nRecipientParticipantId,recipient_participant_id\nRecipients,recipients\nRecognizeCelebritiesRequest,recognize_celebrities_request\nRecognizeCelebritiesResponse,recognize_celebrities_response\nRecognizeTextRequest,recognize_text_request\nRecognizeTextResponse,recognize_text_response\nRecognizeUtteranceRequest,recognize_utterance_request\nRecognizeUtteranceResponse,recognize_utterance_response\nRecognizedBotMember,recognized_bot_member\nRecognizerMetadata,recognizer_metadata\nRecognizerName,recognizer_name\nRecommendation,recommendation\nRecommendationCategory,recommendation_category\nRecommendationData,recommendation_data\nRecommendationDescription,recommendation_description\nRecommendationDetailData,recommendation_detail_data\nRecommendationDetailHourlyMetrics,recommendation_detail_hourly_metrics\nRecommendationDetailId,recommendation_detail_id\nRecommendationDetails,recommendation_details\nRecommendationDisruptionCompliance,recommendation_disruption_compliance\nRecommendationExportJob,recommendation_export_job\nRecommendationFeedback,recommendation_feedback\nRecommendationFeedbackSummaries,recommendation_feedback_summaries\nRecommendationFeedbackSummary,recommendation_feedback_summary\nRecommendationId,recommendation_id\nRecommendationIds,recommendation_ids\nRecommendationItem,recommendation_item\nRecommendationJobCompiledOutputConfig,recommendation_job_compiled_output_config\nRecommendationJobContainerConfig,recommendation_job_container_config\nRecommendationJobInferenceBenchmark,recommendation_job_inference_benchmark\nRecommendationJobInputConfig,recommendation_job_input_config\nRecommendationJobOutputConfig,recommendation_job_output_config\nRecommendationJobPayloadConfig,recommendation_job_payload_config\nRecommendationJobResourceLimit,recommendation_job_resource_limit\nRecommendationJobStoppingConditions,recommendation_job_stopping_conditions\nRecommendationJobVpcConfig,recommendation_job_vpc_config\nRecommendationMetrics,recommendation_metrics\nRecommendationPreferences,recommendation_preferences\nRecommendationPreferencesDetail,recommendation_preferences_detail\nRecommendationProviderIdType,recommendation_provider_id_type\nRecommendationProviderRoleArn,recommendation_provider_role_arn\nRecommendationProviderUri,recommendation_provider_uri\nRecommendationRelatedAnomaly,recommendation_related_anomaly\nRecommendationRelatedAnomalyResource,recommendation_related_anomaly_resource\nRecommendationRelatedAnomalySourceDetail,recommendation_related_anomaly_source_detail\nRecommendationRelatedCloudWatchMetricsSourceDetail,recommendation_related_cloud_watch_metrics_source_detail\nRecommendationRelatedEvent,recommendation_related_event\nRecommendationRelatedEventResource,recommendation_related_event_resource\nRecommendationReportDetails,recommendation_report_details\nRecommendationRunId,recommendation_run_id\nRecommendationSet,recommendation_set\nRecommendationSettings,recommendation_settings\nRecommendationSource,recommendation_source\nRecommendationStatus,recommendation_status\nRecommendationSummaries,recommendation_summaries\nRecommendationSummary,recommendation_summary\nRecommendationTarget,recommendation_target\nRecommendationTemplate,recommendation_template\nRecommendationText,recommendation_text\nRecommendationTransformerUri,recommendation_transformer_uri\nRecommendationTrigger,recommendation_trigger\nRecommendationType,recommendation_type\nRecommendations,recommendations\nRecommendationsDisplayName,recommendations_display_name\nRecommendationsPerMessage,recommendations_per_message\nRecommendedIntentSummary,recommended_intent_summary\nRecommendedNormalizedUnitsToPurchase,recommended_normalized_units_to_purchase\nRecommendedNumberOfInstancesToPurchase,recommended_number_of_instances_to_purchase\nRecommendedOptionProjectedMetric,recommended_option_projected_metric\nRecommendedRuleset,recommended_ruleset\nRecommendedVersion,recommended_version\nRecommender,recommender\nRecommenderConfig,recommender_config\nRecommenderConfigurationResponse,recommender_configuration_response\nRecommenderId,recommender_id\nRecommenderSummary,recommender_summary\nRecommenderUpdateSummary,recommender_update_summary\nReconfigurationType,reconfiguration_type\nReconnectEnabled,reconnect_enabled\nRecord,record\nRecordActivityTaskHeartbeatInput,record_activity_task_heartbeat_input\nRecordColumn,record_column\nRecordColumnDelimiter,record_column_delimiter\nRecordColumnUpdates,record_column_updates\nRecordColumns,record_columns\nRecordData,record_data\nRecordDelimiter,record_delimiter\nRecordDetail,record_detail\nRecordDetails,record_details\nRecordEncoding,record_encoding\nRecordEncodingUpdate,record_encoding_update\nRecordError,record_error\nRecordErrors,record_errors\nRecordFormat,record_format\nRecordFormatType,record_format_type\nRecordFormatUpdate,record_format_update\nRecordHandlerProgressInput,record_handler_progress_input\nRecordId,record_id\nRecordIdentifierFeatureName,record_identifier_feature_name\nRecordIdentifierValueAsString,record_identifier_value_as_string\nRecordIdentifiersValueAsString,record_identifiers_value_as_string\nRecordIndex,record_index\nRecordIngestionFailures,record_ingestion_failures\nRecordLength,record_length\nRecordLifecycleActionHeartbeatType,record_lifecycle_action_heartbeat_type\nRecordMarkerDecisionAttributes,record_marker_decision_attributes\nRecordMarkerFailedEventAttributes,record_marker_failed_event_attributes\nRecordName,record_name\nRecordOutput,record_output\nRecordOutputs,record_outputs\nRecordPatch,record_patch\nRecordPatches,record_patches\nRecordPollingLimit,record_polling_limit\nRecordPreprocessorSourceUri,record_preprocessor_source_uri\nRecordRowDelimiter,record_row_delimiter\nRecordRowPath,record_row_path\nRecordSetId,record_set_id\nRecordSizeKiB,record_size_kib\nRecordState,record_state\nRecordTag,record_tag\nRecordTags,record_tags\nRecordType,record_type\nRecordVersion,record_version\nRecordWrapperType,record_wrapper_type\nRecordedAt,recorded_at\nRecorderConfig,recorder_config\nRecorderStatus,recorder_status\nRecordingConfiguration,recording_configuration\nRecordingConfigurationSummary,recording_configuration_summary\nRecordingFileFormat,recording_file_format\nRecordingGroup,recording_group\nRecordingStrategy,recording_strategy\nRecordingStreamConfiguration,recording_stream_configuration\nRecords,records\nRecordsEvent,records_event\nRecordsIngested,records_ingested\nRecordsProcessed,records_processed\nRecoveryCheckpoint,recovery_checkpoint\nRecoveryGroupArn,recovery_group_arn\nRecoveryGroupName,recovery_group_name\nRecoveryGroupOutput,recovery_group_output\nRecoveryGroups,recovery_groups\nRecoveryInstance,recovery_instance\nRecoveryInstanceDataReplicationError,recovery_instance_data_replication_error\nRecoveryInstanceDataReplicationInfo,recovery_instance_data_replication_info\nRecoveryInstanceDataReplicationInfoReplicatedDisk,recovery_instance_data_replication_info_replicated_disk\nRecoveryInstanceDataReplicationInitiation,recovery_instance_data_replication_initiation\nRecoveryInstanceDataReplicationInitiationStep,recovery_instance_data_replication_initiation_step\nRecoveryInstanceDisk,recovery_instance_disk\nRecoveryInstanceFailback,recovery_instance_failback\nRecoveryInstanceProperties,recovery_instance_properties\nRecoveryLifeCycle,recovery_life_cycle\nRecoveryMechanisms,recovery_mechanisms\nRecoveryOptionType,recovery_option_type\nRecoveryPoint,recovery_point\nRecoveryPointArn,recovery_point_arn\nRecoveryPointByBackupVault,recovery_point_by_backup_vault\nRecoveryPointByResource,recovery_point_by_resource\nRecoveryPointCreator,recovery_point_creator\nRecoveryPointMember,recovery_point_member\nRecoveryPointSelection,recovery_point_selection\nRecoveryPointTags,recovery_point_tags\nRecoveryPoints,recovery_points\nRecoverySnapshot,recovery_snapshot\nRecoveryWindow,recovery_window\nRecoveryWindowInDays,recovery_window_in_days\nRecrawlBehavior,recrawl_behavior\nRecrawlPolicy,recrawl_policy\nRectangle,rectangle\nRecurrence,recurrence\nRecurrenceInHours,recurrence_in_hours\nRecurrenceMultiplier,recurrence_multiplier\nRecurrenceSettings,recurrence_settings\nRecurringCharge,recurring_charge\nRecurringChargeAmount,recurring_charge_amount\nRecurringChargeFrequency,recurring_charge_frequency\nRecurringCharges,recurring_charges\nRecurringCount,recurring_count\nRecurringStandardMonthlyCost,recurring_standard_monthly_cost\nRecurse,recurse\nRecursive,recursive\nRecursiveDeleteOption,recursive_delete_option\nRecursiveInvocationException,recursive_invocation_exception\nRecycleBinEnterTime,recycle_bin_enter_time\nRecycleBinExitTime,recycle_bin_exit_time\nRecycleBinFolderId,recycle_bin_folder_id\nRed,red\nRedPrimaryX,red_primary_x\nRedPrimaryY,red_primary_y\nRedactChannelMessageRequest,redact_channel_message_request\nRedactChannelMessageResponse,redact_channel_message_response\nRedactConversationMessageRequest,redact_conversation_message_request\nRedactRoomMessageRequest,redact_room_message_request\nRedacted,redacted\nRedactedEwsAvailabilityProvider,redacted_ews_availability_provider\nRedactedFields,redacted_fields\nRedactedMediaFileUri,redacted_media_file_uri\nRedactedTranscriptFileUri,redacted_transcript_file_uri\nRedactionConfig,redaction_config\nRedactionOutput,redaction_output\nRedactionType,redaction_type\nRedirect,redirect\nRedirectActionConfig,redirect_action_config\nRedirectAllRequestsTo,redirect_all_requests_to\nRedirectConfig,redirect_config\nRedirectException,redirect_exception\nRedirectLocation,redirect_location\nRedirectSignInURIs,redirect_sign_in_uris\nRedirectSignOutURIs,redirect_sign_out_uris\nRedirectURL,redirect_url\nRedisSettings,redis_settings\nRedshift,redshift\nRedshiftConnectorProfileCredentials,redshift_connector_profile_credentials\nRedshiftConnectorProfileProperties,redshift_connector_profile_properties\nRedshiftDataParameters,redshift_data_parameters\nRedshiftDataProviderSettings,redshift_data_provider_settings\nRedshiftDataShareAsset,redshift_data_share_asset\nRedshiftDataShareAssetSourceEntry,redshift_data_share_asset_source_entry\nRedshiftDataSpec,redshift_data_spec\nRedshiftDatabase,redshift_database\nRedshiftDatabaseCredentials,redshift_database_credentials\nRedshiftDatasetDefinition,redshift_dataset_definition\nRedshiftDestinationConfiguration,redshift_destination_configuration\nRedshiftDestinationDescription,redshift_destination_description\nRedshiftDestinationProperties,redshift_destination_properties\nRedshiftDestinationUpdate,redshift_destination_update\nRedshiftInstanceDetails,redshift_instance_details\nRedshiftMetadata,redshift_metadata\nRedshiftParameters,redshift_parameters\nRedshiftPid,redshift_pid\nRedshiftQueryId,redshift_query_id\nRedshiftRetryOptions,redshift_retry_options\nRedshiftSettings,redshift_settings\nRedshiftSource,redshift_source\nRedshiftSourceConfig,redshift_source_config\nRedshiftTarget,redshift_target\nRedshiftTmpDir,redshift_tmp_dir\nRedundancyPercent,redundancy_percent\nRedundantManifest,redundant_manifest\nReenrollAllCertificateHolders,reenroll_all_certificate_holders\nRefId,ref_id\nRefResource,ref_resource\nReference,reference\nReferenceActionName,reference_action_name\nReferenceArn,reference_arn\nReferenceData,reference_data\nReferenceDataSource,reference_data_source\nReferenceDataSourceDescription,reference_data_source_description\nReferenceDataSourceDescriptions,reference_data_source_descriptions\nReferenceDataSourceUpdate,reference_data_source_update\nReferenceDataSourceUpdates,reference_data_source_updates\nReferenceDataSources,reference_data_sources\nReferenceDoesNotExistException,reference_does_not_exist_exception\nReferenceFiles,reference_files\nReferenceFilter,reference_filter\nReferenceId,reference_id\nReferenceImage,reference_image\nReferenceLine,reference_line\nReferenceLineCustomLabelConfiguration,reference_line_custom_label_configuration\nReferenceLineDataConfiguration,reference_line_data_configuration\nReferenceLineDynamicDataConfiguration,reference_line_dynamic_data_configuration\nReferenceLineLabelConfiguration,reference_line_label_configuration\nReferenceLineStaticDataConfiguration,reference_line_static_data_configuration\nReferenceLineStyleConfiguration,reference_line_style_configuration\nReferenceLineValueLabelConfiguration,reference_line_value_label_configuration\nReferenceLines,reference_lines\nReferenceListItem,reference_list_item\nReferenceMetric,reference_metric\nReferenceNameRequiredException,reference_name_required_exception\nReferencePath,reference_path\nReferencePredictorArn,reference_predictor_arn\nReferencePredictorSummary,reference_predictor_summary\nReferenceRoleARN,reference_role_arn\nReferenceRoleARNUpdate,reference_role_arn_update\nReferenceScalar,reference_scalar\nReferenceSchema,reference_schema\nReferenceSchemaUpdate,reference_schema_update\nReferenceSets,reference_sets\nReferenceStoreDetail,reference_store_detail\nReferenceStoreFilter,reference_store_filter\nReferenceSummaryList,reference_summary_list\nReferenceTypeNotSupportedException,reference_type_not_supported_exception\nReferenceTypes,reference_types\nReferenceUrls,reference_urls\nReferencedBy,referenced_by\nReferencedByResources,referenced_by_resources\nReferencedGroupId,referenced_group_id\nReferencedGroupInfo,referenced_group_info\nReferencedImageDetail,referenced_image_detail\nReferencedImagesNotFoundException,referenced_images_not_found_exception\nReferencedSecurityGroup,referenced_security_group\nReferences,references\nReferencingVpcId,referencing_vpc_id\nReferrerPolicy,referrer_policy\nRefresh,refresh\nRefreshArn,refresh_arn\nRefreshCacheInput,refresh_cache_input\nRefreshCacheOutput,refresh_cache_output\nRefreshClosedReports,refresh_closed_reports\nRefreshConfiguration,refresh_configuration\nRefreshDetails,refresh_details\nRefreshFrequency,refresh_frequency\nRefreshId,refresh_id\nRefreshOnDay,refresh_on_day\nRefreshOnSegmentUpdate,refresh_on_segment_update\nRefreshPreferences,refresh_preferences\nRefreshSchedule,refresh_schedule\nRefreshSchedules,refresh_schedules\nRefreshSchemasMessage,refresh_schemas_message\nRefreshSchemasResponse,refresh_schemas_response\nRefreshSchemasStatus,refresh_schemas_status\nRefreshStatisticsIdMap,refresh_statistics_id_map\nRefreshStatus,refresh_status\nRefreshToken,refresh_token\nRefreshTokenExpiration,refresh_token_expiration\nRefreshTokenRequest,refresh_token_request\nRefreshTokenRequestBody,refresh_token_request_body\nRefreshTokenResponse,refresh_token_response\nRefreshTokenValidity,refresh_token_validity\nRefreshTrustedAdvisorCheckRequest,refresh_trusted_advisor_check_request\nRefreshTrustedAdvisorCheckResponse,refresh_trusted_advisor_check_response\nRefreshType,refresh_type\nRefreshedAt,refreshed_at\nRegParamsRevision,reg_params_revision\nRegenerateSecurityTokenRequest,regenerate_security_token_request\nRegenerateSecurityTokenResponse,regenerate_security_token_response\nRegex,regex\nRegexMatchSet,regex_match_set\nRegexMatchSetId,regex_match_set_id\nRegexMatchSetSummary,regex_match_set_summary\nRegexMatchSetUpdate,regex_match_set_update\nRegexMatchSets,regex_match_sets\nRegexMatchStatement,regex_match_statement\nRegexMatchTuple,regex_match_tuple\nRegexMatchTuples,regex_match_tuples\nRegexPatternSet,regex_pattern_set\nRegexPatternSetId,regex_pattern_set_id\nRegexPatternSetReferenceStatement,regex_pattern_set_reference_statement\nRegexPatternSetSummary,regex_pattern_set_summary\nRegexPatternSetUpdate,regex_pattern_set_update\nRegexPatternSets,regex_pattern_sets\nRegexPatternString,regex_pattern_string\nRegexPatternStrings,regex_pattern_strings\nRegexString,regex_string\nRegion,region\nRegionCode,region_code\nRegionConcurrencyType,region_concurrency_type\nRegionDescription,region_description\nRegionDisabledException,region_disabled_exception\nRegionFilters,region_filters\nRegionIdentifier,region_identifier\nRegionInfo,region_info\nRegionLimitExceededException,region_limit_exceeded_exception\nRegionLinkingMode,region_linking_mode\nRegionMapInputValue,region_map_input_value\nRegionName,region_name\nRegionNames,region_names\nRegionOfInterest,region_of_interest\nRegionOptStatus,region_opt_status\nRegionOptStatusContains,region_opt_status_contains\nRegionOrder,region_order\nRegionReport,region_report\nRegionScope,region_scope\nRegionType,region_type\nRegionalBucket,regional_bucket\nRegionalBucketList,regional_bucket_list\nRegionalConfiguration,regional_configuration\nRegionalConfigurations,regional_configurations\nRegions,regions\nRegionsDescription,regions_description\nRegionsInfo,regions_info\nRegionsOfInterest,regions_of_interest\nRegionsOfInterestForUpdate,regions_of_interest_for_update\nRegisterAVSDeviceRequest,register_avs_device_request\nRegisterAVSDeviceResponse,register_avs_device_response\nRegisterAccountRequest,register_account_request\nRegisterAccountResponse,register_account_response\nRegisterActivityTypeInput,register_activity_type_input\nRegisterAgentRequest,register_agent_request\nRegisterAgentResponse,register_agent_response\nRegisterAppInstanceUserEndpointRequest,register_app_instance_user_endpoint_request\nRegisterAppInstanceUserEndpointResponse,register_app_instance_user_endpoint_response\nRegisterApplicationInput,register_application_input\nRegisterApplicationOutput,register_application_output\nRegisterApplicationRevisionInput,register_application_revision_input\nRegisterCACertificateRequest,register_ca_certificate_request\nRegisterCACertificateResponse,register_ca_certificate_response\nRegisterCertificateRequest,register_certificate_request\nRegisterCertificateResponse,register_certificate_response\nRegisterCertificateResult,register_certificate_result\nRegisterCertificateWithoutCARequest,register_certificate_without_ca_request\nRegisterCertificateWithoutCAResponse,register_certificate_without_ca_response\nRegisterClientRequest,register_client_request\nRegisterClientResponse,register_client_response\nRegisterClusterRequest,register_cluster_request\nRegisterClusterResponse,register_cluster_response\nRegisterComputeInput,register_compute_input\nRegisterComputeOutput,register_compute_output\nRegisterConnectorRequest,register_connector_request\nRegisterConnectorResponse,register_connector_response\nRegisterContainerImageRequest,register_container_image_request\nRegisterContainerImageResult,register_container_image_result\nRegisterContainerInstanceRequest,register_container_instance_request\nRegisterContainerInstanceResponse,register_container_instance_response\nRegisterCrossAccountAccessRoleRequest,register_cross_account_access_role_request\nRegisterDBProxyTargetsRequest,register_db_proxy_targets_request\nRegisterDBProxyTargetsResponse,register_db_proxy_targets_response\nRegisterDataLakeDelegatedAdministratorRequest,register_data_lake_delegated_administrator_request\nRegisterDefaultPatchBaselineRequest,register_default_patch_baseline_request\nRegisterDefaultPatchBaselineResult,register_default_patch_baseline_result\nRegisterDelegatedAdministratorRequest,register_delegated_administrator_request\nRegisterDeviceRequest,register_device_request\nRegisterDeviceResponse,register_device_response\nRegisterDevicesRequest,register_devices_request\nRegisterDomainInput,register_domain_input\nRegisterDomainRequest,register_domain_request\nRegisterDomainResponse,register_domain_response\nRegisterEcsClusterRequest,register_ecs_cluster_request\nRegisterEcsClusterResult,register_ecs_cluster_result\nRegisterElasticIpRequest,register_elastic_ip_request\nRegisterElasticIpResult,register_elastic_ip_result\nRegisterEndPointsInput,register_end_points_input\nRegisterEndPointsOutput,register_end_points_output\nRegisterEndpoints,register_endpoints\nRegisterEventTopicRequest,register_event_topic_request\nRegisterGameServerInput,register_game_server_input\nRegisterGameServerOutput,register_game_server_output\nRegisterIdentityProviderRequest,register_identity_provider_request\nRegisterIdentityProviderResponse,register_identity_provider_response\nRegisterImageRequest,register_image_request\nRegisterImageResult,register_image_result\nRegisterInstanceEventNotificationAttributesRequest,register_instance_event_notification_attributes_request\nRegisterInstanceEventNotificationAttributesResult,register_instance_event_notification_attributes_result\nRegisterInstanceRequest,register_instance_request\nRegisterInstanceResponse,register_instance_response\nRegisterInstanceResult,register_instance_result\nRegisterInstanceTagAttributeRequest,register_instance_tag_attribute_request\nRegisterJobDefinitionRequest,register_job_definition_request\nRegisterJobDefinitionResponse,register_job_definition_response\nRegisterMailDomainRequest,register_mail_domain_request\nRegisterModel,register_model\nRegisterModelStepMetadata,register_model_step_metadata\nRegisterNewBaseline,register_new_baseline\nRegisterOnPremisesInstanceInput,register_on_premises_instance_input\nRegisterOrganizationAdminAccountRequest,register_organization_admin_account_request\nRegisterOrganizationAdminAccountResponse,register_organization_admin_account_response\nRegisterOrganizationDelegatedAdminRequest,register_organization_delegated_admin_request\nRegisterPackageVersionRequest,register_package_version_request\nRegisterPatchBaselineForPatchGroupRequest,register_patch_baseline_for_patch_group_request\nRegisterPatchBaselineForPatchGroupResult,register_patch_baseline_for_patch_group_result\nRegisterPublisherInput,register_publisher_input\nRegisterPublisherOutput,register_publisher_output\nRegisterRdsDbInstanceRequest,register_rds_db_instance_request\nRegisterResourceRequest,register_resource_request\nRegisterRobotRequest,register_robot_request\nRegisterRobotResponse,register_robot_response\nRegisterScalableTargetRequest,register_scalable_target_request\nRegisterScalableTargetResponse,register_scalable_target_response\nRegisterSchemaVersionInput,register_schema_version_input\nRegisterSchemaVersionResponse,register_schema_version_response\nRegisterSlackWorkspaceForOrganizationRequest,register_slack_workspace_for_organization_request\nRegisterSlackWorkspaceForOrganizationResult,register_slack_workspace_for_organization_result\nRegisterStreamConsumerInput,register_stream_consumer_input\nRegisterStreamConsumerOutput,register_stream_consumer_output\nRegisterTargetWithMaintenanceWindowRequest,register_target_with_maintenance_window_request\nRegisterTargetWithMaintenanceWindowResult,register_target_with_maintenance_window_result\nRegisterTargetsInput,register_targets_input\nRegisterTargetsRequest,register_targets_request\nRegisterTargetsResponse,register_targets_response\nRegisterTaskDefinitionRequest,register_task_definition_request\nRegisterTaskDefinitionResponse,register_task_definition_response\nRegisterTaskWithMaintenanceWindowRequest,register_task_with_maintenance_window_request\nRegisterTaskWithMaintenanceWindowResult,register_task_with_maintenance_window_result\nRegisterThingRequest,register_thing_request\nRegisterThingResponse,register_thing_response\nRegisterToWorkMailRequest,register_to_work_mail_request\nRegisterTransitGatewayMulticastGroupMembersRequest,register_transit_gateway_multicast_group_members_request\nRegisterTransitGatewayMulticastGroupMembersResult,register_transit_gateway_multicast_group_members_result\nRegisterTransitGatewayMulticastGroupSourcesRequest,register_transit_gateway_multicast_group_sources_request\nRegisterTransitGatewayMulticastGroupSourcesResult,register_transit_gateway_multicast_group_sources_result\nRegisterTransitGatewayRequest,register_transit_gateway_request\nRegisterTransitGatewayResponse,register_transit_gateway_response\nRegisterTypeInput,register_type_input\nRegisterTypeOutput,register_type_output\nRegisterUsageRequest,register_usage_request\nRegisterUsageResult,register_usage_result\nRegisterUserRequest,register_user_request\nRegisterUserResponse,register_user_response\nRegisterVolumeRequest,register_volume_request\nRegisterVolumeResult,register_volume_result\nRegisterWebhookWithThirdPartyInput,register_webhook_with_third_party_input\nRegisterWorkflowTypeInput,register_workflow_type_input\nRegisterWorkspaceDirectoryRequest,register_workspace_directory_request\nRegistered,registered\nRegisteredAt,registered_at\nRegisteredBy,registered_by\nRegisteredContainerInstancesCount,registered_container_instances_count\nRegisteredDate,registered_date\nRegisteredDateTime,registered_date_time\nRegisteredDeviceCount,registered_device_count\nRegisteredDomainDelegationInfo,registered_domain_delegation_info\nRegisteredGatewayArn,registered_gateway_arn\nRegisteredId,registered_id\nRegisteredMulticastGroupMembers,registered_multicast_group_members\nRegisteredMulticastGroupSources,registered_multicast_group_sources\nRegisteredNetworkInterfaceIds,registered_network_interface_ids\nRegisteredOn,registered_on\nRegisteredTime,registered_time\nRegisteredUserConsoleFeatureConfigurations,registered_user_console_feature_configurations\nRegisteredUserDashboardEmbeddingConfiguration,registered_user_dashboard_embedding_configuration\nRegisteredUserDashboardFeatureConfigurations,registered_user_dashboard_feature_configurations\nRegisteredUserDashboardVisualEmbeddingConfiguration,registered_user_dashboard_visual_embedding_configuration\nRegisteredUserEmbeddingExperienceConfiguration,registered_user_embedding_experience_configuration\nRegisteredUserQSearchBarEmbeddingConfiguration,registered_user_q_search_bar_embedding_configuration\nRegisteredUserQuickSightConsoleEmbeddingConfiguration,registered_user_quick_sight_console_embedding_configuration\nRegistering,registering\nRegistrantContact,registrant_contact\nRegistrantPrivacy,registrant_privacy\nRegistrarName,registrar_name\nRegistrarUrl,registrar_url\nRegistrationCode,registration_code\nRegistrationCodeValidationException,registration_code_validation_exception\nRegistrationConfig,registration_config\nRegistrationDate,registration_date\nRegistrationId,registration_id\nRegistrationLimit,registration_limit\nRegistrationMetadata,registration_metadata\nRegistrationMetadataItem,registration_metadata_item\nRegistrationOutput,registration_output\nRegistrationPagePath,registration_page_path\nRegistrationPrice,registration_price\nRegistrationStatusFilter,registration_status_filter\nRegistrationTime,registration_time\nRegistrationToken,registration_token\nRegistrationTokenList,registration_token_list\nRegistrationZone,registration_zone\nRegistrationsCount,registrations_count\nRegistries,registries\nRegistry,registry\nRegistryAlias,registry_alias\nRegistryArn,registry_arn\nRegistryCatalogData,registry_catalog_data\nRegistryCredential,registry_credential\nRegistryDomainId,registry_domain_id\nRegistryId,registry_id\nRegistryListItem,registry_list_item\nRegistryName,registry_name\nRegistryNamePrefix,registry_name_prefix\nRegistryNotFoundException,registry_not_found_exception\nRegistryPolicyNotFoundException,registry_policy_not_found_exception\nRegistryScanningConfiguration,registry_scanning_configuration\nRegistryScanningRule,registry_scanning_rule\nRegistrySummary,registry_summary\nRegularExpressionList,regular_expression_list\nRehydrationType,rehydration_type\nReimportApiRequest,reimport_api_request\nReimportApiResponse,reimport_api_response\nRejectAssignmentRequest,reject_assignment_request\nRejectAttachmentRequest,reject_attachment_request\nRejectAttachmentResponse,reject_attachment_response\nRejectCertificateTransferRequest,reject_certificate_transfer_request\nRejectClientVpcConnectionRequest,reject_client_vpc_connection_request\nRejectDataShareMessage,reject_data_share_message\nRejectDomainTransferFromAnotherAwsAccountRequest,reject_domain_transfer_from_another_aws_account_request\nRejectDomainTransferFromAnotherAwsAccountResponse,reject_domain_transfer_from_another_aws_account_response\nRejectEnvironmentAccountConnectionInput,reject_environment_account_connection_input\nRejectEnvironmentAccountConnectionOutput,reject_environment_account_connection_output\nRejectGrantRequest,reject_grant_request\nRejectGrantResponse,reject_grant_response\nRejectInboundConnectionRequest,reject_inbound_connection_request\nRejectInboundConnectionResponse,reject_inbound_connection_response\nRejectInboundCrossClusterSearchConnectionRequest,reject_inbound_cross_cluster_search_connection_request\nRejectInboundCrossClusterSearchConnectionResponse,reject_inbound_cross_cluster_search_connection_response\nRejectInputDeviceTransferRequest,reject_input_device_transfer_request\nRejectInvitationInput,reject_invitation_input\nRejectInvitationRequest,reject_invitation_request\nRejectPortfolioShareInput,reject_portfolio_share_input\nRejectQualificationRequestRequest,reject_qualification_request_request\nRejectResourceShareInvitationRequest,reject_resource_share_invitation_request\nRejectResourceShareInvitationResponse,reject_resource_share_invitation_response\nRejectSharedDirectoryRequest,reject_shared_directory_request\nRejectSharedDirectoryResult,reject_shared_directory_result\nRejectSkillRequest,reject_skill_request\nRejectTransitGatewayMulticastDomainAssociationsRequest,reject_transit_gateway_multicast_domain_associations_request\nRejectTransitGatewayMulticastDomainAssociationsResult,reject_transit_gateway_multicast_domain_associations_result\nRejectTransitGatewayPeeringAttachmentRequest,reject_transit_gateway_peering_attachment_request\nRejectTransitGatewayPeeringAttachmentResult,reject_transit_gateway_peering_attachment_result\nRejectTransitGatewayVpcAttachmentRequest,reject_transit_gateway_vpc_attachment_request\nRejectTransitGatewayVpcAttachmentResult,reject_transit_gateway_vpc_attachment_result\nRejectVpcEndpointConnectionsRequest,reject_vpc_endpoint_connections_request\nRejectVpcEndpointConnectionsResult,reject_vpc_endpoint_connections_result\nRejectVpcPeeringConnectionRequest,reject_vpc_peering_connection_request\nRejectVpcPeeringConnectionResult,reject_vpc_peering_connection_result\nRejectedLogEventsInfo,rejected_log_events_info\nRejectedPatches,rejected_patches\nRejectedPatchesAction,rejected_patches_action\nRejectedRecord,rejected_record\nRejectedRecords,rejected_records\nRejectedRecordsException,rejected_records_exception\nRejectionTime,rejection_time\nRejects,rejects\nRekeyFuzzPercentage,rekey_fuzz_percentage\nRekeyMarginTimeSeconds,rekey_margin_time_seconds\nRelatedAnomalies,related_anomalies\nRelatedColumnName,related_column_name\nRelatedContactId,related_contact_id\nRelatedDeployments,related_deployments\nRelatedEvents,related_events\nRelatedFinding,related_finding\nRelatedFindings,related_findings\nRelatedFindingsId,related_findings_id\nRelatedFindingsProductArn,related_findings_product_arn\nRelatedItem,related_item\nRelatedItemEventIncludedData,related_item_event_included_data\nRelatedObservations,related_observations\nRelatedOpsItem,related_ops_item\nRelatedOpsItems,related_ops_items\nRelatedRequirements,related_requirements\nRelatedResource,related_resource\nRelatedResourceArns,related_resource_arns\nRelatedVulnerabilities,related_vulnerabilities\nRelatedWorkspaceProperties,related_workspace_properties\nRelatedWorkspaces,related_workspaces\nRelationType,relation_type\nRelationalCatalogSource,relational_catalog_source\nRelationalDatabase,relational_database\nRelationalDatabaseBlueprint,relational_database_blueprint\nRelationalDatabaseBundle,relational_database_bundle\nRelationalDatabaseDataSourceConfig,relational_database_data_source_config\nRelationalDatabaseEndpoint,relational_database_endpoint\nRelationalDatabaseEvent,relational_database_event\nRelationalDatabaseHardware,relational_database_hardware\nRelationalDatabaseParameter,relational_database_parameter\nRelationalDatabaseSnapshot,relational_database_snapshot\nRelationalTable,relational_table\nRelationship,relationship\nRelationshipScore,relationship_score\nRelationshipStatus,relationship_status\nRelationshipType,relationship_type\nRelationshipTypeFilter,relationship_type_filter\nRelationshipValue,relationship_value\nRelationships,relationships\nRelationshipsListItem,relationships_list_item\nRelative,relative\nRelativeAggregationDuration,relative_aggregation_duration\nRelativeDateFilter,relative_date_filter\nRelativeDateFilterFunction,relative_date_filter_function\nRelativeDateTime,relative_date_time\nRelativeDateTimeControlDisplayOptions,relative_date_time_control_display_options\nRelativeDateType,relative_date_type\nRelativeDateValue,relative_date_value\nRelativeDatesFilter,relative_dates_filter\nRelativePath,relative_path\nRelativePosition,relative_position\nRelativeProgram,relative_program\nRelativeTimeRange,relative_time_range\nRelayState,relay_state\nRelayStateParameterName,relay_state_parameter_name\nRelease,release\nReleaseAddressRequest,release_address_request\nReleaseAfterMinutes,release_after_minutes\nReleaseAgentPath,release_agent_path\nReleaseConfiguration,release_configuration\nReleaseDate,release_date\nReleaseFileSystemNfsV3LocksRequest,release_file_system_nfs_v3_locks_request\nReleaseFileSystemNfsV3LocksResponse,release_file_system_nfs_v3_locks_response\nReleaseHostsRequest,release_hosts_request\nReleaseHostsResult,release_hosts_result\nReleaseIpamPoolAllocationRequest,release_ipam_pool_allocation_request\nReleaseIpamPoolAllocationResult,release_ipam_pool_allocation_result\nReleaseLabel,release_label\nReleaseLabelFilter,release_label_filter\nReleaseLabels,release_labels\nReleaseNotes,release_notes\nReleasePhoneNumberRequest,release_phone_number_request\nReleasePhoneNumberResult,release_phone_number_result\nReleaseStaticIpRequest,release_static_ip_request\nReleaseStaticIpResult,release_static_ip_result\nReleaseStatus,release_status\nReleaseSummaries,release_summaries\nReleaseSummary,release_summary\nReleaseTime,release_time\nReleaseVersion,release_version\nReleasedCapacity,released_capacity\nRelevance,relevance\nRelevanceFeedback,relevance_feedback\nRelevanceFeedbackItems,relevance_feedback_items\nRelevanceValue,relevance_value\nReloadOption,reload_option\nReloadReplicationTablesMessage,reload_replication_tables_message\nReloadReplicationTablesResponse,reload_replication_tables_response\nReloadTablesMessage,reload_tables_message\nReloadTablesResponse,reload_tables_response\nRemainingCount,remaining_count\nRemainingLife,remaining_life\nRemainingTotalValue,remaining_total_value\nRemainingUpfrontValue,remaining_upfront_value\nRemarks,remarks\nRemediation,remediation\nRemediationAction,remediation_action\nRemediationActionType,remediation_action_type\nRemediationActionWithOrder,remediation_action_with_order\nRemediationConfiguration,remediation_configuration\nRemediationConfigurations,remediation_configurations\nRemediationEnabled,remediation_enabled\nRemediationException,remediation_exception\nRemediationExceptionResourceKey,remediation_exception_resource_key\nRemediationExceptions,remediation_exceptions\nRemediationExecutionStatus,remediation_execution_status\nRemediationExecutionStatuses,remediation_execution_statuses\nRemediationExecutionStep,remediation_execution_step\nRemediationInProgressException,remediation_in_progress_exception\nRemediationParameterValue,remediation_parameter_value\nRemediationRecommendation,remediation_recommendation\nRemediationResult,remediation_result\nRemediationUrl,remediation_url\nReminderAtMinutes,reminder_at_minutes\nReminderType,reminder_type\nRemixSettings,remix_settings\nRemote,remote\nRemoteAccessConfig,remote_access_config\nRemoteAccessSession,remote_access_session\nRemoteAccountDetails,remote_account_details\nRemoteAdministrationEndpoint,remote_administration_endpoint\nRemoteDirectoryPath,remote_directory_path\nRemoteDomainInfo,remote_domain_info\nRemoteDomainName,remote_domain_name\nRemoteDomainNames,remote_domain_names\nRemoteId,remote_id\nRemoteIpDetails,remote_ip_details\nRemoteIpv4NetworkCidr,remote_ipv4_network_cidr\nRemoteIpv6NetworkCidr,remote_ipv6_network_cidr\nRemoteManagement,remote_management\nRemoteMta,remote_mta\nRemotePortDetails,remote_port_details\nRemoteSourceCodeAnalysisServerInfo,remote_source_code_analysis_server_info\nRemoteSources,remote_sources\nRemovals,removals\nRemove,remove\nRemoveAccountFromOrganizationRequest,remove_account_from_organization_request\nRemoveAclConfiguration,remove_acl_configuration\nRemoveAction,remove_action\nRemoveAllBackendsRequest,remove_all_backends_request\nRemoveAllBackendsResponse,remove_all_backends_response\nRemoveAllPermissions,remove_all_permissions\nRemoveAllResourcePermissionsRequest,remove_all_resource_permissions_request\nRemoveAllocationResourceTags,remove_allocation_resource_tags\nRemoveAllowedPrincipals,remove_allowed_principals\nRemoveApplicationInstanceRequest,remove_application_instance_request\nRemoveAttributesActivity,remove_attributes_activity\nRemoveAttributesFromFindingsRequest,remove_attributes_from_findings_request\nRemoveAttributesFromFindingsResponse,remove_attributes_from_findings_response\nRemoveAttributesRequest,remove_attributes_request\nRemoveAttributesResponse,remove_attributes_response\nRemoveAutoScalingPolicyInput,remove_auto_scaling_policy_input\nRemoveAutoTerminationPolicyInput,remove_auto_termination_policy_input\nRemoveAvailabilityZonesInput,remove_availability_zones_input\nRemoveAvailabilityZonesOutput,remove_availability_zones_output\nRemoveBackendConfigRequest,remove_backend_config_request\nRemoveBackendConfigResponse,remove_backend_config_response\nRemoveBridgeOutputRequest,remove_bridge_output_request\nRemoveBridgeOutputResponse,remove_bridge_output_response\nRemoveBridgeSourceRequest,remove_bridge_source_request\nRemoveBridgeSourceResponse,remove_bridge_source_response\nRemoveBytesScannedCutoffPerQuery,remove_bytes_scanned_cutoff_per_query\nRemoveClientIDFromOpenIDConnectProviderRequest,remove_client_id_from_open_id_connect_provider_request\nRemoveCustomRoutingEndpointsRequest,remove_custom_routing_endpoints_request\nRemoveCustomerContentEncryptionConfiguration,remove_customer_content_encryption_configuration\nRemoveCustomerOverride,remove_customer_override\nRemoveDraftAppVersionResourceMappingsRequest,remove_draft_app_version_resource_mappings_request\nRemoveDraftAppVersionResourceMappingsResponse,remove_draft_app_version_resource_mappings_response\nRemoveEncryptionConfiguration,remove_encryption_configuration\nRemoveEndDate,remove_end_date\nRemoveEndpointsRequest,remove_endpoints_request\nRemoveEntries,remove_entries\nRemoveExpectedBucketOwner,remove_expected_bucket_owner\nRemoveFacetFromObject,remove_facet_from_object\nRemoveFacetFromObjectRequest,remove_facet_from_object_request\nRemoveFields,remove_fields\nRemoveFlowMediaStreamRequest,remove_flow_media_stream_request\nRemoveFlowMediaStreamResponse,remove_flow_media_stream_response\nRemoveFlowOutputRequest,remove_flow_output_request\nRemoveFlowOutputResponse,remove_flow_output_response\nRemoveFlowSourceRequest,remove_flow_source_request\nRemoveFlowSourceResponse,remove_flow_source_response\nRemoveFlowVpcInterfaceRequest,remove_flow_vpc_interface_request\nRemoveFlowVpcInterfaceResponse,remove_flow_vpc_interface_response\nRemoveFromGlobalClusterMessage,remove_from_global_cluster_message\nRemoveFromGlobalClusterResult,remove_from_global_cluster_result\nRemoveFromVersionId,remove_from_version_id\nRemoveGatewayLoadBalancerArns,remove_gateway_load_balancer_arns\nRemoveHeadersConfig,remove_headers_config\nRemoveIamRoles,remove_iam_roles\nRemoveInvalidCertificateFromPersonalStore,remove_invalid_certificate_from_personal_store\nRemoveIpRoutesRequest,remove_ip_routes_request\nRemoveIpamOperatingRegion,remove_ipam_operating_region\nRemoveKnowledgeBaseTemplateUriRequest,remove_knowledge_base_template_uri_request\nRemoveLFTagsFromResourceRequest,remove_lf_tags_from_resource_request\nRemoveLFTagsFromResourceResponse,remove_lf_tags_from_resource_response\nRemoveLayerVersionPermissionRequest,remove_layer_version_permission_request\nRemoveLicenseSpecifications,remove_license_specifications\nRemoveListenerCertificatesInput,remove_listener_certificates_input\nRemoveManagedScalingPolicyInput,remove_managed_scaling_policy_input\nRemoveNetworkLoadBalancerArns,remove_network_load_balancer_arns\nRemoveNetworkServices,remove_network_services\nRemoveNotificationChannelRequest,remove_notification_channel_request\nRemoveNotificationChannelResponse,remove_notification_channel_response\nRemoveOperatingRegions,remove_operating_regions\nRemoveOutputLocation,remove_output_location\nRemovePermissionInput,remove_permission_input\nRemovePermissionRequest,remove_permission_request\nRemovePermissionResponse,remove_permission_response\nRemovePrefixListEntry,remove_prefix_list_entry\nRemovePrivateDnsName,remove_private_dns_name\nRemoveProfilePermissionRequest,remove_profile_permission_request\nRemoveProfilePermissionResponse,remove_profile_permission_response\nRemoveQuotes,remove_quotes\nRemoveRegionRequest,remove_region_request\nRemoveRegionsFromReplicationRequest,remove_regions_from_replication_request\nRemoveRegionsFromReplicationResponse,remove_regions_from_replication_response\nRemoveReplicaRegions,remove_replica_regions\nRemoveResourcePermissionRequest,remove_resource_permission_request\nRemoveRoleFromDBClusterMessage,remove_role_from_db_cluster_message\nRemoveRoleFromDBInstanceMessage,remove_role_from_db_instance_message\nRemoveRoleFromInstanceProfileRequest,remove_role_from_instance_profile_request\nRemoveRouteTableIds,remove_route_table_ids\nRemoveSNSTopic,remove_sns_topic\nRemoveSchemaVersionMetadataInput,remove_schema_version_metadata_input\nRemoveSchemaVersionMetadataResponse,remove_schema_version_metadata_response\nRemoveSecurityGroupIds,remove_security_group_ids\nRemoveSourceIdentifierFromSubscriptionMessage,remove_source_identifier_from_subscription_message\nRemoveSourceIdentifierFromSubscriptionResult,remove_source_identifier_from_subscription_result\nRemoveSourceServerActionRequest,remove_source_server_action_request\nRemoveStorageSystemRequest,remove_storage_system_request\nRemoveSubnetArns,remove_subnet_arns\nRemoveSubnetIds,remove_subnet_ids\nRemoveSubnets,remove_subnets\nRemoveSupportedIpAddressTypes,remove_supported_ip_address_types\nRemoveTagKeys,remove_tag_keys\nRemoveTags,remove_tags\nRemoveTagsFromCertificateRequest,remove_tags_from_certificate_request\nRemoveTagsFromOnPremisesInstancesInput,remove_tags_from_on_premises_instances_input\nRemoveTagsFromResourceInput,remove_tags_from_resource_input\nRemoveTagsFromResourceMessage,remove_tags_from_resource_message\nRemoveTagsFromResourceOutput,remove_tags_from_resource_output\nRemoveTagsFromResourceRequest,remove_tags_from_resource_request\nRemoveTagsFromResourceResponse,remove_tags_from_resource_response\nRemoveTagsFromStreamInput,remove_tags_from_stream_input\nRemoveTagsFromVaultInput,remove_tags_from_vault_input\nRemoveTagsInput,remove_tags_input\nRemoveTagsRequest,remove_tags_request\nRemoveTargetsRequest,remove_targets_request\nRemoveTargetsResponse,remove_targets_response\nRemoveTargetsResultEntry,remove_targets_result_entry\nRemoveTemplateActionRequest,remove_template_action_request\nRemoveThingFromBillingGroupRequest,remove_thing_from_billing_group_request\nRemoveThingFromThingGroupRequest,remove_thing_from_thing_group_request\nRemoveTransitGatewayCidrBlocks,remove_transit_gateway_cidr_blocks\nRemoveUserFromGroupRequest,remove_user_from_group_request\nRemoveUserGroups,remove_user_groups\nRemoveWorkloadRequest,remove_workload_request\nRemovedLabels,removed_labels\nRenameColumnOperation,rename_column_operation\nRenameField,rename_field\nRenderUiTemplateRequest,render_ui_template_request\nRenderUiTemplateResponse,render_ui_template_response\nRenderableTask,renderable_task\nRenderedContent,rendered_content\nRenderedTemplate,rendered_template\nRenderingConfiguration,rendering_configuration\nRenderingEngine,rendering_engine\nRenderingError,rendering_error\nRenderingRules,rendering_rules\nRenditionConfiguration,rendition_configuration\nRenditionGroupId,rendition_group_id\nRenditionLanguageCode,rendition_language_code\nRenditionName,rendition_name\nRenewCertificateRequest,renew_certificate_request\nRenewDomainRequest,renew_domain_request\nRenewDomainResponse,renew_domain_response\nRenewOfferingRequest,renew_offering_request\nRenewOfferingResult,renew_offering_result\nRenewType,renew_type\nRenewalCount,renewal_count\nRenewalEligibility,renewal_eligibility\nRenewalPeriod,renewal_period\nRenewalPrice,renewal_price\nRenewalSettings,renewal_settings\nRenewalStatus,renewal_status\nRenewalStatusReason,renewal_status_reason\nRenewalSummary,renewal_summary\nRenewalType,renewal_type\nReorderReceiptRuleSetRequest,reorder_receipt_rule_set_request\nRepInterval,rep_interval\nRepeatAt,repeat_at\nRepeatExtXKey,repeat_ext_x_key\nRepeatFrameMsec,repeat_frame_msec\nRepeatPps,repeat_pps\nReplace,replace\nReplaceAllLabels,replace_all_labels\nReplaceChars,replace_chars\nReplaceContentEntry,replace_content_entry\nReplaceDefaultPolicyVersionParams,replace_default_policy_version_params\nReplaceIamInstanceProfileAssociationRequest,replace_iam_instance_profile_association_request\nReplaceIamInstanceProfileAssociationResult,replace_iam_instance_profile_association_result\nReplaceInvalidChars,replace_invalid_chars\nReplaceKeyPrefixWith,replace_key_prefix_with\nReplaceKeyWith,replace_key_with\nReplaceNetworkAclAssociationRequest,replace_network_acl_association_request\nReplaceNetworkAclAssociationResult,replace_network_acl_association_result\nReplaceNetworkAclEntryRequest,replace_network_acl_entry_request\nReplacePathPrefix,replace_path_prefix\nReplacePermissionAssociationsRequest,replace_permission_associations_request\nReplacePermissionAssociationsResponse,replace_permission_associations_response\nReplacePermissionAssociationsWork,replace_permission_associations_work\nReplaceRootVolumeTask,replace_root_volume_task\nReplaceRootVolumeTaskId,replace_root_volume_task_id\nReplaceRootVolumeTaskIds,replace_root_volume_task_ids\nReplaceRootVolumeTasks,replace_root_volume_tasks\nReplaceRouteRequest,replace_route_request\nReplaceRouteTableAssociationRequest,replace_route_table_association_request\nReplaceRouteTableAssociationResult,replace_route_table_association_result\nReplaceTopicRuleRequest,replace_topic_rule_request\nReplaceTransitGatewayRouteRequest,replace_transit_gateway_route_request\nReplaceTransitGatewayRouteResult,replace_transit_gateway_route_result\nReplaceUnhealthyInstances,replace_unhealthy_instances\nReplaceVpnTunnelRequest,replace_vpn_tunnel_request\nReplaceVpnTunnelResult,replace_vpn_tunnel_result\nReplacement,replacement\nReplacementContentRequiredException,replacement_content_required_exception\nReplacementEmailContent,replacement_email_content\nReplacementJob,replacement_job\nReplacementStrategy,replacement_strategy\nReplacementTags,replacement_tags\nReplacementTemplate,replacement_template\nReplacementTemplateData,replacement_template_data\nReplacementTypeRequiredException,replacement_type_required_exception\nReplay,replay\nReplayArn,replay_arn\nReplayDestination,replay_destination\nReplayEndTime,replay_end_time\nReplayName,replay_name\nReplayStartTime,replay_start_time\nReplayWindowSize,replay_window_size\nReplays,replays\nReplica,replica\nReplicaAlias,replica_alias\nReplicaAlreadyExistsException,replica_already_exists_exception\nReplicaAutoScalingDescription,replica_auto_scaling_description\nReplicaAutoScalingUpdate,replica_auto_scaling_update\nReplicaAvailabilityZones,replica_availability_zones\nReplicaBillingModeSummary,replica_billing_mode_summary\nReplicaConfiguration,replica_configuration\nReplicaConfigurationRequest,replica_configuration_request\nReplicaCount,replica_count\nReplicaDescription,replica_description\nReplicaGlobalSecondaryIndex,replica_global_secondary_index\nReplicaGlobalSecondaryIndexAutoScalingDescription,replica_global_secondary_index_auto_scaling_description\nReplicaGlobalSecondaryIndexAutoScalingUpdate,replica_global_secondary_index_auto_scaling_update\nReplicaGlobalSecondaryIndexDescription,replica_global_secondary_index_description\nReplicaGlobalSecondaryIndexSettings,replica_global_secondary_index_settings\nReplicaGlobalSecondaryIndexSettingsDescription,replica_global_secondary_index_settings_description\nReplicaGlobalSecondaryIndexSettingsUpdate,replica_global_secondary_index_settings_update\nReplicaGlobalSecondaryIndexUpdates,replica_global_secondary_index_updates\nReplicaInaccessibleDateTime,replica_inaccessible_date_time\nReplicaKeyMetadata,replica_key_metadata\nReplicaKeys,replica_keys\nReplicaKmsKeyID,replica_kms_key_id\nReplicaMode,replica_mode\nReplicaModifications,replica_modifications\nReplicaNotFoundException,replica_not_found_exception\nReplicaOutpostArns,replica_outpost_arns\nReplicaPolicy,replica_policy\nReplicaProvisionedReadCapacityAutoScalingSettings,replica_provisioned_read_capacity_auto_scaling_settings\nReplicaProvisionedReadCapacityAutoScalingSettingsUpdate,replica_provisioned_read_capacity_auto_scaling_settings_update\nReplicaProvisionedReadCapacityAutoScalingUpdate,replica_provisioned_read_capacity_auto_scaling_update\nReplicaProvisionedReadCapacityUnits,replica_provisioned_read_capacity_units\nReplicaProvisionedWriteCapacityAutoScalingSettings,replica_provisioned_write_capacity_auto_scaling_settings\nReplicaProvisionedWriteCapacityUnits,replica_provisioned_write_capacity_units\nReplicaRegion,replica_region\nReplicaRegionType,replica_region_type\nReplicaSettings,replica_settings\nReplicaSettingsDescription,replica_settings_description\nReplicaSettingsUpdate,replica_settings_update\nReplicaStatus,replica_status\nReplicaStatusDescription,replica_status_description\nReplicaStatusPercentProgress,replica_status_percent_progress\nReplicaTableClass,replica_table_class\nReplicaTableClassSummary,replica_table_class_summary\nReplicaTags,replica_tags\nReplicaUpdate,replica_update\nReplicaUpdates,replica_updates\nReplicas,replicas\nReplicasPerNodeGroup,replicas_per_node_group\nReplicasToRemove,replicas_to_remove\nReplicateInstanceRequest,replicate_instance_request\nReplicateInstanceResponse,replicate_instance_response\nReplicateKeyRequest,replicate_key_request\nReplicateKeyResponse,replicate_key_response\nReplicateSecretToRegionsRequest,replicate_secret_to_regions_request\nReplicateSecretToRegionsResponse,replicate_secret_to_regions_response\nReplicateShardCollections,replicate_shard_collections\nReplicateTo,replicate_to\nReplicatingFrom,replicating_from\nReplicatingTo,replicating_to\nReplication,replication\nReplicationConfig,replication_config\nReplicationConfigArn,replication_config_arn\nReplicationConfigCreateTime,replication_config_create_time\nReplicationConfigIdentifier,replication_config_identifier\nReplicationConfigUpdateTime,replication_config_update_time\nReplicationConfigs,replication_configs\nReplicationConfiguration,replication_configuration\nReplicationConfigurationDescription,replication_configuration_description\nReplicationConfigurationReplicatedDisk,replication_configuration_replicated_disk\nReplicationConfigurationTemplate,replication_configuration_template\nReplicationCreateTime,replication_create_time\nReplicationDestination,replication_destination\nReplicationDetails,replication_details\nReplicationFactor,replication_factor\nReplicationGroup,replication_group\nReplicationGroupAlreadyExistsFault,replication_group_already_exists_fault\nReplicationGroupAlreadyUnderMigrationFault,replication_group_already_under_migration_fault\nReplicationGroupCreateTime,replication_group_create_time\nReplicationGroupDescription,replication_group_description\nReplicationGroupId,replication_group_id\nReplicationGroupIds,replication_group_ids\nReplicationGroupLogDeliveryEnabled,replication_group_log_delivery_enabled\nReplicationGroupMessage,replication_group_message\nReplicationGroupNotFoundFault,replication_group_not_found_fault\nReplicationGroupNotUnderMigrationFault,replication_group_not_under_migration_fault\nReplicationGroupPendingModifiedValues,replication_group_pending_modified_values\nReplicationGroupRegion,replication_group_region\nReplicationGroupUpdate,replication_group_update\nReplicationGroups,replication_groups\nReplicationInstance,replication_instance\nReplicationInstanceArn,replication_instance_arn\nReplicationInstanceClass,replication_instance_class\nReplicationInstanceEngineMinimumVersion,replication_instance_engine_minimum_version\nReplicationInstanceIdentifier,replication_instance_identifier\nReplicationInstanceIpv6Addresses,replication_instance_ipv6_addresses\nReplicationInstancePrivateIpAddress,replication_instance_private_ip_address\nReplicationInstancePrivateIpAddresses,replication_instance_private_ip_addresses\nReplicationInstancePublicIpAddress,replication_instance_public_ip_address\nReplicationInstancePublicIpAddresses,replication_instance_public_ip_addresses\nReplicationInstanceStatus,replication_instance_status\nReplicationInstanceTaskLog,replication_instance_task_log\nReplicationInstanceTaskLogSize,replication_instance_task_log_size\nReplicationInstanceTaskLogs,replication_instance_task_logs\nReplicationInstances,replication_instances\nReplicationJob,replication_job\nReplicationJobAlreadyExistsException,replication_job_already_exists_exception\nReplicationJobNotFoundException,replication_job_not_found_exception\nReplicationLastStopTime,replication_last_stop_time\nReplicationNotFound,replication_not_found\nReplicationPendingModifiedValues,replication_pending_modified_values\nReplicationRule,replication_rule\nReplicationRuleAndOperator,replication_rule_and_operator\nReplicationRuleFilter,replication_rule_filter\nReplicationRun,replication_run\nReplicationRunLimitExceededException,replication_run_limit_exceeded_exception\nReplicationRunStageDetails,replication_run_stage_details\nReplicationScope,replication_scope\nReplicationSet,replication_set\nReplicationSettings,replication_settings\nReplicationSourceIdentifier,replication_source_identifier\nReplicationSpecification,replication_specification\nReplicationStats,replication_stats\nReplicationStatus,replication_status\nReplicationStatusType,replication_status_type\nReplicationSubnetGroup,replication_subnet_group\nReplicationSubnetGroupDescription,replication_subnet_group_description\nReplicationSubnetGroupDoesNotCoverEnoughAZs,replication_subnet_group_does_not_cover_enough_azs\nReplicationSubnetGroupId,replication_subnet_group_id\nReplicationSubnetGroupIdentifier,replication_subnet_group_identifier\nReplicationSubnetGroups,replication_subnet_groups\nReplicationTableStatistics,replication_table_statistics\nReplicationTask,replication_task\nReplicationTaskArn,replication_task_arn\nReplicationTaskAssessmentResult,replication_task_assessment_result\nReplicationTaskAssessmentResults,replication_task_assessment_results\nReplicationTaskAssessmentRun,replication_task_assessment_run\nReplicationTaskAssessmentRunArn,replication_task_assessment_run_arn\nReplicationTaskAssessmentRunCreationDate,replication_task_assessment_run_creation_date\nReplicationTaskAssessmentRunProgress,replication_task_assessment_run_progress\nReplicationTaskAssessmentRuns,replication_task_assessment_runs\nReplicationTaskCreationDate,replication_task_creation_date\nReplicationTaskIdentifier,replication_task_identifier\nReplicationTaskIndividualAssessment,replication_task_individual_assessment\nReplicationTaskIndividualAssessmentArn,replication_task_individual_assessment_arn\nReplicationTaskIndividualAssessmentStartDate,replication_task_individual_assessment_start_date\nReplicationTaskIndividualAssessments,replication_task_individual_assessments\nReplicationTaskLastAssessmentDate,replication_task_last_assessment_date\nReplicationTaskName,replication_task_name\nReplicationTaskSettings,replication_task_settings\nReplicationTaskStartDate,replication_task_start_date\nReplicationTaskStats,replication_task_stats\nReplicationTasks,replication_tasks\nReplicationTime,replication_time\nReplicationTimeValue,replication_time_value\nReplicationType,replication_type\nReplicationUpdateTime,replication_update_time\nReplicationUser,replication_user\nReplications,replications\nReplyTo,reply_to\nReplyToAddresses,reply_to_addresses\nReplyToEmailAddress,reply_to_email_address\nRepoPrefixLocation,repo_prefix_location\nRepoUpgradeOnBoot,repo_upgrade_on_boot\nReport,report\nReportConfiguration,report_configuration\nReportContext,report_context\nReportCreatorAccount,report_creator_account\nReportDefinition,report_definition\nReportDefinitions,report_definitions\nReportDeliveryChannel,report_delivery_channel\nReportDestination,report_destination\nReportDestinationS3,report_destination_s3\nReportDevStatusBattery,report_dev_status_battery\nReportDevStatusMargin,report_dev_status_margin\nReportExportConfig,report_export_config\nReportFilter,report_filter\nReportFormat,report_format\nReportFrequency,report_frequency\nReportGenerated,report_generated\nReportGenerationLimitExceededException,report_generation_limit_exceeded_exception\nReportGenerator,report_generator\nReportGeneratorName,report_generator_name\nReportGenerators,report_generators\nReportGroup,report_group\nReportGroupTrendStats,report_group_trend_stats\nReportId,report_id\nReportInstanceStatusRequest,report_instance_status_request\nReportJob,report_job\nReportJobId,report_job_id\nReportJobs,report_jobs\nReportLevel,report_level\nReportLimitReachedException,report_limit_reached_exception\nReportName,report_name\nReportOverride,report_override\nReportOverrides,report_overrides\nReportPlan,report_plan\nReportPlanArn,report_plan_arn\nReportPlanDescription,report_plan_description\nReportPlanName,report_plan_name\nReportPlanTags,report_plan_tags\nReportPlans,report_plans\nReportResult,report_result\nReportS3Configuration,report_s3_configuration\nReportScope,report_scope\nReportSetting,report_setting\nReportTaskProgressInput,report_task_progress_input\nReportTaskProgressOutput,report_task_progress_output\nReportTaskRunnerHeartbeatInput,report_task_runner_heartbeat_input\nReportTaskRunnerHeartbeatOutput,report_task_runner_heartbeat_output\nReportTemplate,report_template\nReportType,report_type\nReportUri,report_uri\nReportVersioning,report_versioning\nReportWithRawData,report_with_raw_data\nReportedAgentVersion,reported_agent_version\nReportedName,reported_name\nReportedOs,reported_os\nReportedRuntimeContextState,reported_runtime_context_state\nReportedVersion,reported_version\nReportingMta,reporting_mta\nRepository,repository\nRepositoryAccessMode,repository_access_mode\nRepositoryAggregation,repository_aggregation\nRepositoryAggregationResponse,repository_aggregation_response\nRepositoryAlreadyExistsException,repository_already_exists_exception\nRepositoryAnalysis,repository_analysis\nRepositoryAssociation,repository_association\nRepositoryAssociationArn,repository_association_arn\nRepositoryAssociationSummaries,repository_association_summaries\nRepositoryAssociationSummary,repository_association_summary\nRepositoryAuthConfig,repository_auth_config\nRepositoryBranch,repository_branch\nRepositoryBranchInput,repository_branch_input\nRepositoryCatalogData,repository_catalog_data\nRepositoryCatalogDataInput,repository_catalog_data_input\nRepositoryCatalogDataNotFoundException,repository_catalog_data_not_found_exception\nRepositoryCredentials,repository_credentials\nRepositoryCredentialsProviderArn,repository_credentials_provider_arn\nRepositoryDescription,repository_description\nRepositoryDoesNotExistException,repository_does_not_exist_exception\nRepositoryExternalConnectionInfo,repository_external_connection_info\nRepositoryFilter,repository_filter\nRepositoryHead,repository_head\nRepositoryHeadSourceCodeType,repository_head_source_code_type\nRepositoryInput,repository_input\nRepositoryLimitExceededException,repository_limit_exceeded_exception\nRepositoryMetadata,repository_metadata\nRepositoryName,repository_name\nRepositoryNameExistsException,repository_name_exists_exception\nRepositoryNameIdPair,repository_name_id_pair\nRepositoryNameRequiredException,repository_name_required_exception\nRepositoryNames,repository_names\nRepositoryNamesRequiredException,repository_names_required_exception\nRepositoryNotAssociatedWithPullRequestException,repository_not_associated_with_pull_request_exception\nRepositoryNotEmptyException,repository_not_empty_exception\nRepositoryNotFoundException,repository_not_found_exception\nRepositoryOwner,repository_owner\nRepositoryPolicyNotFoundException,repository_policy_not_found_exception\nRepositoryPolicyText,repository_policy_text\nRepositoryScanningConfiguration,repository_scanning_configuration\nRepositoryScanningConfigurationFailure,repository_scanning_configuration_failure\nRepositorySummary,repository_summary\nRepositorySyncAttempt,repository_sync_attempt\nRepositorySyncDefinition,repository_sync_definition\nRepositorySyncEvent,repository_sync_event\nRepositoryTrigger,repository_trigger\nRepositoryTriggerBranchNameListRequiredException,repository_trigger_branch_name_list_required_exception\nRepositoryTriggerDestinationArnRequiredException,repository_trigger_destination_arn_required_exception\nRepositoryTriggerEventsListRequiredException,repository_trigger_events_list_required_exception\nRepositoryTriggerExecutionFailure,repository_trigger_execution_failure\nRepositoryTriggerNameRequiredException,repository_trigger_name_required_exception\nRepositoryTriggersListRequiredException,repository_triggers_list_required_exception\nRepositoryType,repository_type\nRepositoryUrl,repository_url\nReprocessingSummary,reprocessing_summary\nRepublishAction,republish_action\nReputationMetricsEnabled,reputation_metrics_enabled\nReputationOptions,reputation_options\nRequest,request\nRequestAlreadyInProgressException,request_already_in_progress_exception\nRequestAlreadyProcessedException,request_already_processed_exception\nRequestBody,request_body\nRequestBodyAssociatedResourceTypeConfig,request_body_associated_resource_type_config\nRequestCancelActivityTaskDecisionAttributes,request_cancel_activity_task_decision_attributes\nRequestCancelActivityTaskFailedEventAttributes,request_cancel_activity_task_failed_event_attributes\nRequestCancelExternalWorkflowExecutionDecisionAttributes,request_cancel_external_workflow_execution_decision_attributes\nRequestCancelExternalWorkflowExecutionFailedEventAttributes,request_cancel_external_workflow_execution_failed_event_attributes\nRequestCancelExternalWorkflowExecutionInitiatedEventAttributes,request_cancel_external_workflow_execution_initiated_event_attributes\nRequestCancelWorkflowExecutionInput,request_cancel_workflow_execution_input\nRequestCertificateRequest,request_certificate_request\nRequestCertificateResponse,request_certificate_response\nRequestChangedException,request_changed_exception\nRequestCharacters,request_characters\nRequestCharged,request_charged\nRequestCompletionTime,request_completion_time\nRequestConfiguration,request_configuration\nRequestCount,request_count\nRequestDetailedStatus,request_detailed_status\nRequestDetails,request_details\nRequestEntityTooLargeException,request_entity_too_large_exception\nRequestEntry,request_entry\nRequestEnvironmentInfoMessage,request_environment_info_message\nRequestError,request_error\nRequestFailedException,request_failed_exception\nRequestFilterPortRange,request_filter_port_range\nRequestHeaders,request_headers\nRequestHeadersInserted,request_headers_inserted\nRequestID,request_id\nRequestId,request_id\nRequestIdentifier,request_identifier\nRequestImpactStatistics,request_impact_statistics\nRequestInProgressException,request_in_progress_exception\nRequestInspection,request_inspection\nRequestInspectionACFP,request_inspection_acfp\nRequestInterval,request_interval\nRequestIpamResourceTag,request_ipam_resource_tag\nRequestItems,request_items\nRequestLaunchTemplateData,request_launch_template_data\nRequestLimitExceeded,request_limit_exceeded\nRequestLimitExceededException,request_limit_exceeded_exception\nRequestMetadata,request_metadata\nRequestModels,request_models\nRequestOrigin,request_origin\nRequestOutputItem,request_output_item\nRequestParameterKey,request_parameter_key\nRequestParameters,request_parameters\nRequestPayer,request_payer\nRequestPaymentConfiguration,request_payment_configuration\nRequestPhoneNumberRequest,request_phone_number_request\nRequestPhoneNumberResult,request_phone_number_result\nRequestProgress,request_progress\nRequestResponses,request_responses\nRequestRoute,request_route\nRequestServiceQuotaIncreaseRequest,request_service_quota_increase_request\nRequestServiceQuotaIncreaseResponse,request_service_quota_increase_response\nRequestSource,request_source\nRequestSpotFleetRequest,request_spot_fleet_request\nRequestSpotFleetResponse,request_spot_fleet_response\nRequestSpotInstancesRequest,request_spot_instances_request\nRequestSpotInstancesResult,request_spot_instances_result\nRequestSpotLaunchSpecification,request_spot_launch_specification\nRequestStatus,request_status\nRequestStatusMessage,request_status_message\nRequestTTLSeconds,request_ttl_seconds\nRequestTemplates,request_templates\nRequestThrottledException,request_throttled_exception\nRequestTime,request_time\nRequestTimeoutException,request_timeout_exception\nRequestTimeoutSeconds,request_timeout_seconds\nRequestToken,request_token\nRequestTokenARN,request_token_arn\nRequestTokenNotFoundException,request_token_not_found_exception\nRequestTooLargeException,request_too_large_exception\nRequestType,request_type\nRequestUploadCredentialsInput,request_upload_credentials_input\nRequestUploadCredentialsOutput,request_upload_credentials_output\nRequestUri,request_uri\nRequestValidator,request_validator\nRequestValidators,request_validators\nRequested,requested\nRequestedAmiVersion,requested_ami_version\nRequestedColumns,requested_columns\nRequestedDateTime,requested_date_time\nRequestedDimensions,requested_dimensions\nRequestedDocumentAttributes,requested_document_attributes\nRequestedEc2AvailabilityZones,requested_ec2_availability_zones\nRequestedEc2SubnetIds,requested_ec2_subnet_ids\nRequestedEntityTooLargeException,requested_entity_too_large_exception\nRequestedInstanceCount,requested_instance_count\nRequestedJobStatus,requested_job_status\nRequestedProvisionedConcurrentExecutions,requested_provisioned_concurrent_executions\nRequestedQuota,requested_quota\nRequestedQuotas,requested_quotas\nRequestedRangeNotSatisfiableException,requested_range_not_satisfiable_exception\nRequestedServiceQuotaChange,requested_service_quota_change\nRequestedTime,requested_time\nRequestedTimestamp,requested_timestamp\nRequestedValue,requested_value\nRequester,requester\nRequesterAccountId,requester_account_id\nRequesterAnnotation,requester_annotation\nRequesterAwsRegion,requester_aws_region\nRequesterCharged,requester_charged\nRequesterFeedback,requester_feedback\nRequesterId,requester_id\nRequesterManaged,requester_managed\nRequesterPays,requester_pays\nRequesterPaysEnabled,requester_pays_enabled\nRequesterPeeringConnectionOptions,requester_peering_connection_options\nRequesterTgwInfo,requester_tgw_info\nRequesterVpcInfo,requester_vpc_info\nRequests,requests\nRequestsPerSecond,requests_per_second\nRequireAlternateSignatureAlgorithm,require_alternate_signature_algorithm\nRequireAuthorizationForCacheControl,require_authorization_for_cache_control\nRequireCheckIn,require_check_in\nRequireCommonName,require_common_name\nRequireDirectoryPath,require_directory_path\nRequireDnsAsCn,require_dns_as_cn\nRequireEachIncludedType,require_each_included_type\nRequireEmail,require_email\nRequireEncryption,require_encryption\nRequireHibernateSupport,require_hibernate_support\nRequireLowercase,require_lowercase\nRequireLowercaseCharacters,require_lowercase_characters\nRequireNumbers,require_numbers\nRequirePin,require_pin\nRequireSameKeyRenewal,require_same_key_renewal\nRequireSymbols,require_symbols\nRequireTLS,require_tls\nRequireType,require_type\nRequireUppercase,require_uppercase\nRequireUppercaseCharacters,require_uppercase_characters\nRequired,required\nRequiredActivatedType,required_activated_type\nRequiredActivatedTypes,required_activated_types\nRequiredBehavior,required_behavior\nRequiredCapabilities,required_capabilities\nRequiredEquipmentTypes,required_equipment_types\nRequiredField,required_field\nRequiredFieldInfo,required_field_info\nRequiredFields,required_fields\nRequiredMinimumPollIntervalInSeconds,required_minimum_poll_interval_in_seconds\nRequiredParameters,required_parameters\nRequiredSignUpAttributes,required_sign_up_attributes\nRequiredTenancy,required_tenancy\nRequiredToPreview,required_to_preview\nRequirement,requirement\nRequirementsS3ObjectVersion,requirements_s3_object_version\nRequirementsS3Path,requirements_s3_path\nRequirementsToTarget,requirements_to_target\nRequires,requires\nRequiresAutoMinorEngineVersionUpgrade,requires_auto_minor_engine_version_upgrade\nRequiresCompatibilities,requires_compatibilities\nRequiresIndexDocuments,requires_index_documents\nRequiresRecreation,requires_recreation\nResamplingConfigInput,resampling_config_input\nRescoreCapacityUnits,rescore_capacity_units\nRescoreExecutionPlanId,rescore_execution_plan_id\nRescoreExecutionPlanSummary,rescore_execution_plan_summary\nRescoreId,rescore_id\nRescoreRequest,rescore_request\nRescoreResult,rescore_result\nRescoreResultItem,rescore_result_item\nReseller,reseller\nResendConfirmationCodeRequest,resend_confirmation_code_request\nResendConfirmationCodeResponse,resend_confirmation_code_response\nResendContactReachabilityEmailRequest,resend_contact_reachability_email_request\nResendContactReachabilityEmailResponse,resend_contact_reachability_email_response\nResendOperationAuthorizationRequest,resend_operation_authorization_request\nResendValidationEmailRequest,resend_validation_email_request\nReservation,reservation\nReservationARN,reservation_arn\nReservationAggregates,reservation_aggregates\nReservationArn,reservation_arn\nReservationCoverageGroup,reservation_coverage_group\nReservationCoveredHoursInLookbackPeriod,reservation_covered_hours_in_lookback_period\nReservationFleetInstanceSpecification,reservation_fleet_instance_specification\nReservationId,reservation_id\nReservationName,reservation_name\nReservationPlan,reservation_plan\nReservationPlanSettings,reservation_plan_settings\nReservationPurchaseRecommendation,reservation_purchase_recommendation\nReservationPurchaseRecommendationDetail,reservation_purchase_recommendation_detail\nReservationPurchaseRecommendationMetadata,reservation_purchase_recommendation_metadata\nReservationPurchaseRecommendationSummary,reservation_purchase_recommendation_summary\nReservationResourceSpecification,reservation_resource_specification\nReservationState,reservation_state\nReservationType,reservation_type\nReservationUtilizationGroup,reservation_utilization_group\nReservationValue,reservation_value\nReservations,reservations\nReserveContactRequest,reserve_contact_request\nReserveRange,reserve_range\nReserved,reserved\nReservedBitrate,reserved_bitrate\nReservedCacheNode,reserved_cache_node\nReservedCacheNodeAlreadyExistsFault,reserved_cache_node_already_exists_fault\nReservedCacheNodeId,reserved_cache_node_id\nReservedCacheNodeMessage,reserved_cache_node_message\nReservedCacheNodeNotFoundFault,reserved_cache_node_not_found_fault\nReservedCacheNodeQuotaExceededFault,reserved_cache_node_quota_exceeded_fault\nReservedCacheNodes,reserved_cache_nodes\nReservedCacheNodesOffering,reserved_cache_nodes_offering\nReservedCacheNodesOfferingId,reserved_cache_nodes_offering_id\nReservedCacheNodesOfferingMessage,reserved_cache_nodes_offering_message\nReservedCacheNodesOfferingNotFoundFault,reserved_cache_nodes_offering_not_found_fault\nReservedCacheNodesOfferings,reserved_cache_nodes_offerings\nReservedConcurrentExecutions,reserved_concurrent_executions\nReservedDBInstance,reserved_db_instance\nReservedDBInstanceAlreadyExistsFault,reserved_db_instance_already_exists_fault\nReservedDBInstanceArn,reserved_db_instance_arn\nReservedDBInstanceId,reserved_db_instance_id\nReservedDBInstanceMessage,reserved_db_instance_message\nReservedDBInstanceNotFoundFault,reserved_db_instance_not_found_fault\nReservedDBInstanceQuotaExceededFault,reserved_db_instance_quota_exceeded_fault\nReservedDBInstances,reserved_db_instances\nReservedDBInstancesOffering,reserved_db_instances_offering\nReservedDBInstancesOfferingId,reserved_db_instances_offering_id\nReservedDBInstancesOfferingMessage,reserved_db_instances_offering_message\nReservedDBInstancesOfferingNotFoundFault,reserved_db_instances_offering_not_found_fault\nReservedDBInstancesOfferings,reserved_db_instances_offerings\nReservedElasticsearchInstance,reserved_elasticsearch_instance\nReservedElasticsearchInstanceId,reserved_elasticsearch_instance_id\nReservedElasticsearchInstanceOffering,reserved_elasticsearch_instance_offering\nReservedElasticsearchInstanceOfferingId,reserved_elasticsearch_instance_offering_id\nReservedElasticsearchInstanceOfferings,reserved_elasticsearch_instance_offerings\nReservedElasticsearchInstances,reserved_elasticsearch_instances\nReservedHours,reserved_hours\nReservedInstance,reserved_instance\nReservedInstanceId,reserved_instance_id\nReservedInstanceIds,reserved_instance_ids\nReservedInstanceLimitPrice,reserved_instance_limit_price\nReservedInstanceOffering,reserved_instance_offering\nReservedInstanceOfferingId,reserved_instance_offering_id\nReservedInstanceOfferings,reserved_instance_offerings\nReservedInstanceOptions,reserved_instance_options\nReservedInstanceReservationValue,reserved_instance_reservation_value\nReservedInstanceValueRollup,reserved_instance_value_rollup\nReservedInstanceValueSet,reserved_instance_value_set\nReservedInstances,reserved_instances\nReservedInstancesConfiguration,reserved_instances_configuration\nReservedInstancesId,reserved_instances_id\nReservedInstancesIds,reserved_instances_ids\nReservedInstancesListing,reserved_instances_listing\nReservedInstancesListingId,reserved_instances_listing_id\nReservedInstancesListings,reserved_instances_listings\nReservedInstancesModification,reserved_instances_modification\nReservedInstancesModificationId,reserved_instances_modification_id\nReservedInstancesModificationIds,reserved_instances_modification_ids\nReservedInstancesModificationResult,reserved_instances_modification_result\nReservedInstancesModifications,reserved_instances_modifications\nReservedInstancesOffering,reserved_instances_offering\nReservedInstancesOfferingId,reserved_instances_offering_id\nReservedInstancesOfferingIds,reserved_instances_offering_ids\nReservedInstancesOfferings,reserved_instances_offerings\nReservedNameException,reserved_name_exception\nReservedNode,reserved_node\nReservedNodeAlreadyExistsFault,reserved_node_already_exists_fault\nReservedNodeAlreadyMigratedFault,reserved_node_already_migrated_fault\nReservedNodeConfigurationOption,reserved_node_configuration_option\nReservedNodeConfigurationOptionList,reserved_node_configuration_option_list\nReservedNodeExchangeNotFoundFault,reserved_node_exchange_not_found_fault\nReservedNodeExchangeRequestId,reserved_node_exchange_request_id\nReservedNodeExchangeStatus,reserved_node_exchange_status\nReservedNodeExchangeStatusDetails,reserved_node_exchange_status_details\nReservedNodeId,reserved_node_id\nReservedNodeNotFoundFault,reserved_node_not_found_fault\nReservedNodeOffering,reserved_node_offering\nReservedNodeOfferingId,reserved_node_offering_id\nReservedNodeOfferingNotFoundFault,reserved_node_offering_not_found_fault\nReservedNodeOfferingType,reserved_node_offering_type\nReservedNodeOfferings,reserved_node_offerings\nReservedNodeOfferingsMessage,reserved_node_offerings_message\nReservedNodeQuotaExceededFault,reserved_node_quota_exceeded_fault\nReservedNodes,reserved_nodes\nReservedNodesMessage,reserved_nodes_message\nReservedNodesOffering,reserved_nodes_offering\nReservedNodesOfferingId,reserved_nodes_offering_id\nReservedNodesOfferingNotFoundFault,reserved_nodes_offering_not_found_fault\nReservedNodesOfferings,reserved_nodes_offerings\nReservedNormalizedUnits,reserved_normalized_units\nReservedSlots,reserved_slots\nReservedStreamCapacity,reserved_stream_capacity\nReservoirQuota,reservoir_quota\nReservoirQuotaTTL,reservoir_quota_ttl\nReservoirSize,reservoir_size\nResetActionConfiguration,reset_action_configuration\nResetAddressAttributeRequest,reset_address_attribute_request\nResetAddressAttributeResult,reset_address_attribute_result\nResetAlarmActionRequest,reset_alarm_action_request\nResetAllParameters,reset_all_parameters\nResetAuthorizersCacheRequest,reset_authorizers_cache_request\nResetCacheInput,reset_cache_input\nResetCacheOutput,reset_cache_output\nResetCacheParameterGroupMessage,reset_cache_parameter_group_message\nResetClusterParameterGroupMessage,reset_cluster_parameter_group_message\nResetConnectorMetadataCacheRequest,reset_connector_metadata_cache_request\nResetDBClusterParameterGroupMessage,reset_db_cluster_parameter_group_message\nResetDBParameterGroupMessage,reset_db_parameter_group_message\nResetDeploymentsRequest,reset_deployments_request\nResetDeploymentsResponse,reset_deployments_response\nResetDisabled,reset_disabled\nResetDistributionCacheRequest,reset_distribution_cache_request\nResetDistributionCacheResult,reset_distribution_cache_result\nResetEbsDefaultKmsKeyIdRequest,reset_ebs_default_kms_key_id_request\nResetEbsDefaultKmsKeyIdResult,reset_ebs_default_kms_key_id_result\nResetElements,reset_elements\nResetEncryptionKeyRequest,reset_encryption_key_request\nResetFpgaImageAttributeRequest,reset_fpga_image_attribute_request\nResetFpgaImageAttributeResult,reset_fpga_image_attribute_result\nResetImageAttributeRequest,reset_image_attribute_request\nResetInstanceAttributeRequest,reset_instance_attribute_request\nResetJobBookmarkRequest,reset_job_bookmark_request\nResetJobBookmarkResponse,reset_job_bookmark_response\nResetNetworkInterfaceAttributeRequest,reset_network_interface_attribute_request\nResetNotificationSettingsRequest,reset_notification_settings_request\nResetNotificationSettingsResponse,reset_notification_settings_response\nResetOrderNumber,reset_order_number\nResetParameterGroupRequest,reset_parameter_group_request\nResetParameterGroupResponse,reset_parameter_group_response\nResetPasswordRequest,reset_password_request\nResetPersonalPINRequest,reset_personal_pin_request\nResetPersonalPINResponse,reset_personal_pin_response\nResetPolicy,reset_policy\nResetResourceLogLevelRequest,reset_resource_log_level_request\nResetServiceSettingRequest,reset_service_setting_request\nResetServiceSettingResult,reset_service_setting_result\nResetServiceSpecificCredentialRequest,reset_service_specific_credential_request\nResetServiceSpecificCredentialResponse,reset_service_specific_credential_response\nResetSnapshotAttributeRequest,reset_snapshot_attribute_request\nResetTimerAction,reset_timer_action\nResetUserPasswordRequest,reset_user_password_request\nResetUserPasswordResponse,reset_user_password_response\nResharding,resharding\nReshardingConfiguration,resharding_configuration\nReshardingStatus,resharding_status\nResilience,resilience\nResiliencyPolicy,resiliency_policy\nResiliencyScore,resiliency_score\nResizeCluster,resize_cluster\nResizeClusterMessage,resize_cluster_message\nResizeClusterResult,resize_cluster_result\nResizeInfo,resize_info\nResizeNotFoundFault,resize_not_found_fault\nResizeOption,resize_option\nResizeProgressMessage,resize_progress_message\nResizeSpecifications,resize_specifications\nResizeType,resize_type\nResolution,resolution\nResolutionContact,resolution_contact\nResolutionMethod,resolution_method\nResolutionStrategy,resolution_strategy\nResolutionTechniques,resolution_techniques\nResolutionTime,resolution_time\nResolveAlias,resolve_alias\nResolveAliasInput,resolve_alias_input\nResolveAliasOutput,resolve_alias_output\nResolveAppVersionResourcesRequest,resolve_app_version_resources_request\nResolveAppVersionResourcesResponse,resolve_app_version_resources_response\nResolveCaseRequest,resolve_case_request\nResolveCaseResponse,resolve_case_response\nResolveComponentCandidatesRequest,resolve_component_candidates_request\nResolveComponentCandidatesResponse,resolve_component_candidates_response\nResolveCustomerRequest,resolve_customer_request\nResolveCustomerResult,resolve_customer_result\nResolveRoomRequest,resolve_room_request\nResolveRoomResponse,resolve_room_response\nResolved,resolved\nResolvedArtifact,resolved_artifact\nResolvedAttributes,resolved_attributes\nResolvedCIDRCount,resolved_cidr_count\nResolvedComponentVersion,resolved_component_version\nResolvedImage,resolved_image\nResolvedImageUri,resolved_image_uri\nResolvedOutputS3Uri,resolved_output_s3_uri\nResolvedTargets,resolved_targets\nResolvedValue,resolved_value\nResolver,resolver\nResolverConfig,resolver_config\nResolverConfigs,resolver_configs\nResolverDNSSECConfig,resolver_dnssec_config\nResolverDnssecConfig,resolver_dnssec_config\nResolverDnssecConfigs,resolver_dnssec_configs\nResolverEndpoint,resolver_endpoint\nResolverEndpointId,resolver_endpoint_id\nResolverEndpointType,resolver_endpoint_type\nResolverEndpoints,resolver_endpoints\nResolverIP,resolver_ip\nResolverQueryLogConfig,resolver_query_log_config\nResolverQueryLogConfigAssociation,resolver_query_log_config_association\nResolverQueryLogConfigAssociationId,resolver_query_log_config_association_id\nResolverQueryLogConfigAssociations,resolver_query_log_config_associations\nResolverQueryLogConfigId,resolver_query_log_config_id\nResolverQueryLogConfigPolicy,resolver_query_log_config_policy\nResolverQueryLogConfigs,resolver_query_log_configs\nResolverRule,resolver_rule\nResolverRuleAssociation,resolver_rule_association\nResolverRuleAssociationId,resolver_rule_association_id\nResolverRuleAssociations,resolver_rule_associations\nResolverRuleConfig,resolver_rule_config\nResolverRuleId,resolver_rule_id\nResolverRulePolicy,resolver_rule_policy\nResolverRules,resolver_rules\nResource,resource\nResourceARN,resource_arn\nResourceARNDetail,resource_arn_detail\nResourceARNList,resource_arn_list\nResourceARNNotValidException,resource_arn_not_valid_exception\nResourceARNUpdate,resource_arn_update\nResourceARNs,resource_arns\nResourceAccessPolicies,resource_access_policies\nResourceAccessPolicy,resource_access_policy\nResourceAccessRoleArn,resource_access_role_arn\nResourceAction,resource_action\nResourceAlreadyCheckedOutException,resource_already_checked_out_exception\nResourceAlreadyExistException,resource_already_exist_exception\nResourceAlreadyExistsException,resource_already_exists_exception\nResourceAlreadyExistsFault,resource_already_exists_fault\nResourceArn,resource_arn\nResourceArnList,resource_arn_list\nResourceArnNotFoundException,resource_arn_not_found_exception\nResourceArnRequiredException,resource_arn_required_exception\nResourceArns,resource_arns\nResourceAssociatedException,resource_associated_exception\nResourceAttribute,resource_attribute\nResourceAttributeList,resource_attribute_list\nResourceAwsEc2InstanceIamInstanceProfileArn,resource_aws_ec2_instance_iam_instance_profile_arn\nResourceAwsEc2InstanceImageId,resource_aws_ec2_instance_image_id\nResourceAwsEc2InstanceIpV4Addresses,resource_aws_ec2_instance_ipv4_addresses\nResourceAwsEc2InstanceIpV6Addresses,resource_aws_ec2_instance_ipv6_addresses\nResourceAwsEc2InstanceKeyName,resource_aws_ec2_instance_key_name\nResourceAwsEc2InstanceLaunchedAt,resource_aws_ec2_instance_launched_at\nResourceAwsEc2InstanceSubnetId,resource_aws_ec2_instance_subnet_id\nResourceAwsEc2InstanceType,resource_aws_ec2_instance_type\nResourceAwsEc2InstanceVpcId,resource_aws_ec2_instance_vpc_id\nResourceAwsIamAccessKeyCreatedAt,resource_aws_iam_access_key_created_at\nResourceAwsIamAccessKeyPrincipalName,resource_aws_iam_access_key_principal_name\nResourceAwsIamAccessKeyStatus,resource_aws_iam_access_key_status\nResourceAwsIamAccessKeyUserName,resource_aws_iam_access_key_user_name\nResourceAwsIamUserUserName,resource_aws_iam_user_user_name\nResourceAwsS3BucketOwnerId,resource_aws_s3_bucket_owner_id\nResourceAwsS3BucketOwnerName,resource_aws_s3_bucket_owner_name\nResourceBudgetEstimate,resource_budget_estimate\nResourceCatalog,resource_catalog\nResourceCatalogArn,resource_catalog_arn\nResourceCatalogName,resource_catalog_name\nResourceCatalogs,resource_catalogs\nResourceChange,resource_change\nResourceChangeDetail,resource_change_detail\nResourceChanges,resource_changes\nResourceCidr,resource_cidr\nResourceCollection,resource_collection\nResourceCollectionFilter,resource_collection_filter\nResourceCollectionType,resource_collection_type\nResourceComplianceStatus,resource_compliance_status\nResourceComplianceSummaryItem,resource_compliance_summary_item\nResourceComplianceSummaryItems,resource_compliance_summary_items\nResourceConcurrentModificationException,resource_concurrent_modification_exception\nResourceConfig,resource_config\nResourceConfigForUpdate,resource_config_for_update\nResourceConfiguration,resource_configuration\nResourceConfigurationSchemaType,resource_configuration_schema_type\nResourceConflict,resource_conflict\nResourceConflictException,resource_conflict_exception\nResourceContainerImageId,resource_container_image_id\nResourceContainerImageName,resource_container_image_name\nResourceContainerLaunchedAt,resource_container_launched_at\nResourceContainerName,resource_container_name\nResourceContentionFault,resource_contention_fault\nResourceCount,resource_count\nResourceCountByStatus,resource_count_by_status\nResourceCountFilters,resource_count_filters\nResourceCountsSummary,resource_counts_summary\nResourceCreationFailedException,resource_creation_failed_exception\nResourceCreationLimitPolicy,resource_creation_limit_policy\nResourceDataContainer,resource_data_container\nResourceDataSyncAlreadyExistsException,resource_data_sync_already_exists_exception\nResourceDataSyncAwsOrganizationsSource,resource_data_sync_aws_organizations_source\nResourceDataSyncConflictException,resource_data_sync_conflict_exception\nResourceDataSyncCountExceededException,resource_data_sync_count_exceeded_exception\nResourceDataSyncDestinationDataSharing,resource_data_sync_destination_data_sharing\nResourceDataSyncInvalidConfigurationException,resource_data_sync_invalid_configuration_exception\nResourceDataSyncItem,resource_data_sync_item\nResourceDataSyncItems,resource_data_sync_items\nResourceDataSyncNotFoundException,resource_data_sync_not_found_exception\nResourceDataSyncOrganizationalUnit,resource_data_sync_organizational_unit\nResourceDataSyncS3Destination,resource_data_sync_s3_destination\nResourceDataSyncSource,resource_data_sync_source\nResourceDataSyncSourceWithState,resource_data_sync_source_with_state\nResourceDefinitionId,resource_definition_id\nResourceDefinitionVersion,resource_definition_version\nResourceDefinitionVersionArn,resource_definition_version_arn\nResourceDefinitionVersionId,resource_definition_version_id\nResourceDependencyException,resource_dependency_exception\nResourceDescription,resource_description\nResourceDescriptions,resource_descriptions\nResourceDetail,resource_detail\nResourceDetails,resource_details\nResourceDetailsOther,resource_details_other\nResourceDiscoveryAssociationCount,resource_discovery_association_count\nResourceDiscoveryStatus,resource_discovery_status\nResourceDoesNotSupportTagging,resource_does_not_support_tagging\nResourceDownloadOwnerSetting,resource_download_owner_setting\nResourceEndpoint,resource_endpoint\nResourceEndpointList,resource_endpoint_list\nResourceEndpointListItem,resource_endpoint_list_item\nResourceError,resource_error\nResourceErrorsDetails,resource_errors_details\nResourceEvaluation,resource_evaluation\nResourceEvaluationFilters,resource_evaluation_filters\nResourceEvaluationId,resource_evaluation_id\nResourceEvaluations,resource_evaluations\nResourceExistsException,resource_exists_exception\nResourceFilter,resource_filter\nResourceFilterCriteria,resource_filter_criteria\nResourceFilters,resource_filters\nResourceGroup,resource_group\nResourceGroupName,resource_group_name\nResourceGroupTag,resource_group_tag\nResourceHandlingOption,resource_handling_option\nResourceHours,resource_hours\nResourceId,resource_id\nResourceIdList,resource_id_list\nResourceIdOverrideConfiguration,resource_id_override_configuration\nResourceIdPreference,resource_id_preference\nResourceIdScope,resource_id_scope\nResourceIdType,resource_id_type\nResourceIdentifier,resource_identifier\nResourceIdentifierSummaries,resource_identifier_summaries\nResourceIdentifierSummary,resource_identifier_summary\nResourceIdentifiers,resource_identifiers\nResourceIds,resource_ids\nResourceInUse,resource_in_use\nResourceInUseException,resource_in_use_exception\nResourceInUseFault,resource_in_use_fault\nResourceInfo,resource_info\nResourceInfoList,resource_info_list\nResourceIntegrations,resource_integrations\nResourceInventory,resource_inventory\nResourceInventoryList,resource_inventory_list\nResourceKey,resource_key\nResourceKeys,resource_keys\nResourceLabel,resource_label\nResourceLifecycleConfig,resource_lifecycle_config\nResourceLimit,resource_limit\nResourceLimitExceeded,resource_limit_exceeded\nResourceLimitExceededException,resource_limit_exceeded_exception\nResourceLimits,resource_limits\nResourceList,resource_list\nResourceLocation,resource_location\nResourceLocations,resource_locations\nResourceLockedException,resource_locked_exception\nResourceMapFilter,resource_map_filter\nResourceMapping,resource_mapping\nResourceMetadata,resource_metadata\nResourceMetrics,resource_metrics\nResourceModel,resource_model\nResourceName,resource_name\nResourceNotAvailableException,resource_not_available_exception\nResourceNotDiscoveredException,resource_not_discovered_exception\nResourceNotFound,resource_not_found\nResourceNotFoundException,resource_not_found_exception\nResourceNotFoundFault,resource_not_found_fault\nResourceNotReadyException,resource_not_ready_exception\nResourceNotSupportedException,resource_not_supported_exception\nResourceNumberLimitExceededException,resource_number_limit_exceeded_exception\nResourceOverlapStatus,resource_overlap_status\nResourceOwner,resource_owner\nResourceOwnerCheckException,resource_owner_check_exception\nResourceOwnerId,resource_owner_id\nResourceOwningAccountId,resource_owning_account_id\nResourcePartition,resource_partition\nResourcePath,resource_path\nResourcePathComponent,resource_path_component\nResourcePendingMaintenanceActions,resource_pending_maintenance_actions\nResourcePermission,resource_permission\nResourcePolicies,resource_policies\nResourcePolicy,resource_policy\nResourcePolicyConflictException,resource_policy_conflict_exception\nResourcePolicyInvalidParameterException,resource_policy_invalid_parameter_exception\nResourcePolicyLimitExceededException,resource_policy_limit_exceeded_exception\nResourcePolicyNotFoundException,resource_policy_not_found_exception\nResourcePolicyNotValidException,resource_policy_not_valid_exception\nResourcePolicySummary,resource_policy_summary\nResourcePreconditionNotMetException,resource_precondition_not_met_exception\nResourceProfileArtifact,resource_profile_artifact\nResourcePropagationDelayException,resource_propagation_delay_exception\nResourceProperties,resource_properties\nResourceProperty,resource_property\nResourceProvisionedThroughputExceededException,resource_provisioned_throughput_exceeded_exception\nResourceQuery,resource_query\nResourceQuota,resource_quota\nResourceQuotaExceededException,resource_quota_exceeded_exception\nResourceQuotaExceededFault,resource_quota_exceeded_fault\nResourceQuotas,resource_quotas\nResourceReceivingAccess,resource_receiving_access\nResourceRecord,resource_record\nResourceRecordSet,resource_record_set\nResourceRecordSetCount,resource_record_set_count\nResourceRecordSets,resource_record_sets\nResourceRecords,resource_records\nResourceReference,resource_reference\nResourceRegion,resource_region\nResourceRegistrationFailureException,resource_registration_failure_exception\nResourceRequestStatusFilter,resource_request_status_filter\nResourceRequestStatusSummaries,resource_request_status_summaries\nResourceRequirement,resource_requirement\nResourceRequirements,resource_requirements\nResourceResult,resource_result\nResourceRetainedBillableTimeInSeconds,resource_retained_billable_time_in_seconds\nResourceRole,resource_role\nResourceScanMetadata,resource_scan_metadata\nResourceServer,resource_server\nResourceServerScopeType,resource_server_scope_type\nResourceServerType,resource_server_type\nResourceServers,resource_servers\nResourceSet,resource_set\nResourceSetArn,resource_set_arn\nResourceSetIdentifier,resource_set_identifier\nResourceSetIds,resource_set_ids\nResourceSetName,resource_set_name\nResourceSetOutput,resource_set_output\nResourceSetStatus,resource_set_status\nResourceSetSummary,resource_set_summary\nResourceSetType,resource_set_type\nResourceSets,resource_sets\nResourceShare,resource_share\nResourceShareAssociation,resource_share_association\nResourceShareInvitation,resource_share_invitation\nResourceShareInvitationAlreadyAcceptedException,resource_share_invitation_already_accepted_exception\nResourceShareInvitationAlreadyRejectedException,resource_share_invitation_already_rejected_exception\nResourceShareInvitationArnNotFoundException,resource_share_invitation_arn_not_found_exception\nResourceShareInvitationExpiredException,resource_share_invitation_expired_exception\nResourceShareLimitExceededException,resource_share_limit_exceeded_exception\nResourceSharePermissionDetail,resource_share_permission_detail\nResourceSharePermissionSummary,resource_share_permission_summary\nResourceShareType,resource_share_type\nResourceSpec,resource_spec\nResourceSpecificResult,resource_specific_result\nResourceSpecificResults,resource_specific_results\nResourceSpecification,resource_specification\nResourceState,resource_state\nResourceStatement,resource_statement\nResourceStatementRequest,resource_statement_request\nResourceStatistics,resource_statistics\nResourceStatus,resource_status\nResourceStatusReason,resource_status_reason\nResourceStringFilter,resource_string_filter\nResourceSummary,resource_summary\nResourceSyncAttempt,resource_sync_attempt\nResourceSyncEvent,resource_sync_event\nResourceTag,resource_tag\nResourceTagKey,resource_tag_key\nResourceTagKeys,resource_tag_keys\nResourceTagList,resource_tag_list\nResourceTagMapping,resource_tag_mapping\nResourceTagMappingList,resource_tag_mapping_list\nResourceTagSet,resource_tag_set\nResourceTagSets,resource_tag_sets\nResourceTagValue,resource_tag_value\nResourceTags,resource_tags\nResourceTagsDescriptionMessage,resource_tags_description_message\nResourceTagsSearchCriteria,resource_tags_search_criteria\nResourceTargetDefinition,resource_target_definition\nResourceTargetDetails,resource_target_details\nResourceToImport,resource_to_import\nResourceType,resource_type\nResourceTypeFilters,resource_type_filters\nResourceTypeList,resource_type_list\nResourceTypeManagementPreference,resource_type_management_preference\nResourceTypeNotFound,resource_type_not_found\nResourceTypeNotSupportedException,resource_type_not_supported_exception\nResourceTypeOptInPreference,resource_type_opt_in_preference\nResourceTypes,resource_types\nResourceTypesScope,resource_types_scope\nResourceUnavailableException,resource_unavailable_exception\nResourceUri,resource_uri\nResourceUris,resource_uris\nResourceUtilization,resource_utilization\nResourceValidationException,resource_validation_exception\nResourceValue,resource_value\nResourceViolation,resource_violation\nResourceViolations,resource_violations\nResources,resources\nResourcesAffected,resources_affected\nResourcesPerPage,resources_per_page\nResourcesSupported,resources_supported\nResourcesToAdd,resources_to_add\nResourcesToImport,resources_to_import\nResourcesToRemove,resources_to_remove\nResourcesToSkip,resources_to_skip\nResourcesVpcConfig,resources_vpc_config\nRespondActivityTaskCanceledInput,respond_activity_task_canceled_input\nRespondActivityTaskCompletedInput,respond_activity_task_completed_input\nRespondActivityTaskFailedInput,respond_activity_task_failed_input\nRespondDecisionTaskCompletedInput,respond_decision_task_completed_input\nRespondToAfd,respond_to_afd\nRespondToAuthChallengeRequest,respond_to_auth_challenge_request\nRespondToAuthChallengeResponse,respond_to_auth_challenge_response\nRespondsTo,responds_to\nResponse,response\nResponseAction,response_action\nResponseCacheControl,response_cache_control\nResponseCard,response_card\nResponseCode,response_code\nResponseCodeSent,response_code_sent\nResponseContentDisposition,response_content_disposition\nResponseContentEncoding,response_content_encoding\nResponseContentLanguage,response_content_language\nResponseContentType,response_content_type\nResponseDetails,response_details\nResponseError,response_error\nResponseExpires,response_expires\nResponseFinishDateTime,response_finish_date_time\nResponseHeaders,response_headers\nResponseHeadersPolicy,response_headers_policy\nResponseHeadersPolicyAccessControlAllowHeaders,response_headers_policy_access_control_allow_headers\nResponseHeadersPolicyAccessControlAllowMethods,response_headers_policy_access_control_allow_methods\nResponseHeadersPolicyAccessControlAllowOrigins,response_headers_policy_access_control_allow_origins\nResponseHeadersPolicyAccessControlExposeHeaders,response_headers_policy_access_control_expose_headers\nResponseHeadersPolicyAlreadyExists,response_headers_policy_already_exists\nResponseHeadersPolicyConfig,response_headers_policy_config\nResponseHeadersPolicyContentSecurityPolicy,response_headers_policy_content_security_policy\nResponseHeadersPolicyContentTypeOptions,response_headers_policy_content_type_options\nResponseHeadersPolicyCorsConfig,response_headers_policy_cors_config\nResponseHeadersPolicyCustomHeader,response_headers_policy_custom_header\nResponseHeadersPolicyCustomHeadersConfig,response_headers_policy_custom_headers_config\nResponseHeadersPolicyFrameOptions,response_headers_policy_frame_options\nResponseHeadersPolicyId,response_headers_policy_id\nResponseHeadersPolicyInUse,response_headers_policy_in_use\nResponseHeadersPolicyList,response_headers_policy_list\nResponseHeadersPolicyReferrerPolicy,response_headers_policy_referrer_policy\nResponseHeadersPolicyRemoveHeader,response_headers_policy_remove_header\nResponseHeadersPolicyRemoveHeadersConfig,response_headers_policy_remove_headers_config\nResponseHeadersPolicySecurityHeadersConfig,response_headers_policy_security_headers_config\nResponseHeadersPolicyServerTimingHeadersConfig,response_headers_policy_server_timing_headers_config\nResponseHeadersPolicyStrictTransportSecurity,response_headers_policy_strict_transport_security\nResponseHeadersPolicySummary,response_headers_policy_summary\nResponseHeadersPolicyXSSProtection,response_headers_policy_xss_protection\nResponseInspection,response_inspection\nResponseInspectionBodyContains,response_inspection_body_contains\nResponseInspectionHeader,response_inspection_header\nResponseInspectionJson,response_inspection_json\nResponseInspectionStatusCode,response_inspection_status_code\nResponseItem,response_item\nResponseLaunchTemplateData,response_launch_template_data\nResponseMessage,response_message\nResponseModels,response_models\nResponseOutputItem,response_output_item\nResponsePagePath,response_page_path\nResponseParameters,response_parameters\nResponsePartitionKey,response_partition_key\nResponsePlanSummary,response_plan_summary\nResponseResourceMetric,response_resource_metric\nResponseResourceMetricKey,response_resource_metric_key\nResponseSignalPreroll,response_signal_preroll\nResponseSpecification,response_specification\nResponseStartDateTime,response_start_date_time\nResponseStreamContentType,response_stream_content_type\nResponseTemplates,response_templates\nResponseTime,response_time\nResponseTimeHistogram,response_time_histogram\nResponseTimeRootCause,response_time_root_cause\nResponseTimeRootCauseEntity,response_time_root_cause_entity\nResponseTimeRootCauseService,response_time_root_cause_service\nResponseTimeRootCauses,response_time_root_causes\nResponses,responses\nRestApi,rest_api\nRestApis,rest_apis\nRestartAppServerMessage,restart_app_server_message\nRestartDelay,restart_delay\nRestartSimulationJobRequest,restart_simulation_job_request\nRestartWorkspace,restart_workspace\nRestorableByUserIds,restorable_by_user_ids\nRestorableNodeTypes,restorable_node_types\nRestorableUntil,restorable_until\nRestorationPrice,restoration_price\nRestore,restore\nRestoreAddressToClassicRequest,restore_address_to_classic_request\nRestoreAddressToClassicResult,restore_address_to_classic_result\nRestoreAnalysisRequest,restore_analysis_request\nRestoreAnalysisResponse,restore_analysis_response\nRestoreBackupRequest,restore_backup_request\nRestoreBackupResponse,restore_backup_response\nRestoreCertificateAuthorityRequest,restore_certificate_authority_request\nRestoreClusterFromSnapshotInput,restore_cluster_from_snapshot_input\nRestoreClusterFromSnapshotOutput,restore_cluster_from_snapshot_output\nRestoreCoreNetworkPolicyVersionRequest,restore_core_network_policy_version_request\nRestoreCoreNetworkPolicyVersionResponse,restore_core_network_policy_version_response\nRestoreDBClusterFromS3Message,restore_db_cluster_from_s3_message\nRestoreDBClusterFromS3Result,restore_db_cluster_from_s3_result\nRestoreDBClusterFromSnapshotMessage,restore_db_cluster_from_snapshot_message\nRestoreDBClusterFromSnapshotResult,restore_db_cluster_from_snapshot_result\nRestoreDBClusterToPointInTimeMessage,restore_db_cluster_to_point_in_time_message\nRestoreDBClusterToPointInTimeResult,restore_db_cluster_to_point_in_time_result\nRestoreDBInstanceFromDBSnapshotMessage,restore_db_instance_from_db_snapshot_message\nRestoreDBInstanceFromDBSnapshotResult,restore_db_instance_from_db_snapshot_result\nRestoreDBInstanceFromS3Message,restore_db_instance_from_s3_message\nRestoreDBInstanceFromS3Result,restore_db_instance_from_s3_result\nRestoreDBInstanceToPointInTimeMessage,restore_db_instance_to_point_in_time_message\nRestoreDBInstanceToPointInTimeResult,restore_db_instance_to_point_in_time_result\nRestoreDateTime,restore_date_time\nRestoreDocumentVersionsRequest,restore_document_versions_request\nRestoreDomainAccessRequest,restore_domain_access_request\nRestoreDuration,restore_duration\nRestoreEventDataStoreRequest,restore_event_data_store_request\nRestoreEventDataStoreResponse,restore_event_data_store_response\nRestoreExpiryDate,restore_expiry_date\nRestoreExpiryTime,restore_expiry_time\nRestoreFromClusterSnapshotMessage,restore_from_cluster_snapshot_message\nRestoreFromClusterSnapshotResult,restore_from_cluster_snapshot_result\nRestoreFromRecoveryPointRequest,restore_from_recovery_point_request\nRestoreFromRecoveryPointResponse,restore_from_recovery_point_response\nRestoreFromSnapshotRequest,restore_from_snapshot_request\nRestoreFromSnapshotResponse,restore_from_snapshot_response\nRestoreImageFromRecycleBinRequest,restore_image_from_recycle_bin_request\nRestoreImageFromRecycleBinResult,restore_image_from_recycle_bin_result\nRestoreInProgress,restore_in_progress\nRestoreJobId,restore_job_id\nRestoreJobs,restore_jobs\nRestoreJobsListMember,restore_jobs_list_member\nRestoreKeyInput,restore_key_input\nRestoreKeyOutput,restore_key_output\nRestoreManagedPrefixListVersionRequest,restore_managed_prefix_list_version_request\nRestoreManagedPrefixListVersionResult,restore_managed_prefix_list_version_result\nRestoreMetadata,restore_metadata\nRestoreObjectOutput,restore_object_output\nRestoreObjectRequest,restore_object_request\nRestoreOutputPath,restore_output_path\nRestorePhoneNumberRequest,restore_phone_number_request\nRestorePhoneNumberResponse,restore_phone_number_response\nRestoreRequest,restore_request\nRestoreSecretRequest,restore_secret_request\nRestoreSecretResponse,restore_secret_response\nRestoreServerRequest,restore_server_request\nRestoreServerResponse,restore_server_response\nRestoreSnapshotFromRecycleBinRequest,restore_snapshot_from_recycle_bin_request\nRestoreSnapshotFromRecycleBinResult,restore_snapshot_from_recycle_bin_result\nRestoreSnapshotTierRequest,restore_snapshot_tier_request\nRestoreSnapshotTierResult,restore_snapshot_tier_result\nRestoreSnapshots,restore_snapshots\nRestoreStartTime,restore_start_time\nRestoreStatus,restore_status\nRestoreSummary,restore_summary\nRestoreTableFromBackupInput,restore_table_from_backup_input\nRestoreTableFromBackupOutput,restore_table_from_backup_output\nRestoreTableFromClusterSnapshotMessage,restore_table_from_cluster_snapshot_message\nRestoreTableFromClusterSnapshotResult,restore_table_from_cluster_snapshot_result\nRestoreTableFromSnapshotRequest,restore_table_from_snapshot_request\nRestoreTableFromSnapshotResponse,restore_table_from_snapshot_response\nRestoreTableRequest,restore_table_request\nRestoreTableResponse,restore_table_response\nRestoreTableToPointInTimeInput,restore_table_to_point_in_time_input\nRestoreTableToPointInTimeOutput,restore_table_to_point_in_time_output\nRestoreTime,restore_time\nRestoreToSnapshot,restore_to_snapshot\nRestoreToTime,restore_to_time\nRestoreType,restore_type\nRestoreVolumeFromSnapshotRequest,restore_volume_from_snapshot_request\nRestoreVolumeFromSnapshotResponse,restore_volume_from_snapshot_response\nRestoreWindow,restore_window\nRestoreWorkspaceRequest,restore_workspace_request\nRestrictPublicBuckets,restrict_public_buckets\nRestrictedPackageName,restricted_package_name\nRestrictedSourceFileException,restricted_source_file_exception\nRestrictionType,restriction_type\nRestrictions,restrictions\nResult,result\nResultAttribute,result_attribute\nResultAttributes,result_attributes\nResultBBox,result_b_box\nResultByTime,result_by_time\nResultCode,result_code\nResultConfiguration,result_configuration\nResultConfigurationUpdates,result_configuration_updates\nResultData,result_data\nResultEncryptionMode,result_encryption_mode\nResultErrorEntry,result_error_entry\nResultField,result_field\nResultFrame,result_frame\nResultId,result_id\nResultIds,result_ids\nResultItems,result_items\nResultKmsKeyArn,result_kms_key_arn\nResultList,result_list\nResultLocationBucket,result_location_bucket\nResultLocationFolder,result_location_folder\nResultRecordedTime,result_recorded_time\nResultReuseByAgeConfiguration,result_reuse_by_age_configuration\nResultReuseConfiguration,result_reuse_configuration\nResultReuseInformation,result_reuse_information\nResultRow,result_row\nResultRowValue,result_row_value\nResultRows,result_rows\nResultS3Uri,result_s3_uri\nResultSet,result_set\nResultSetMetadata,result_set_metadata\nResultSetOptions,result_set_options\nResultSize,result_size\nResultStream,result_stream\nResultToken,result_token\nResultType,result_type\nResultValues,result_values\nResults,results\nResultsByTime,results_by_time\nResultsCount,results_count\nResultsNotFound,results_not_found\nResultsPublishingEnabled,results_publishing_enabled\nResultsS3Prefix,results_s3_prefix\nResumableUntil,resumable_until\nResumeActions,resume_actions\nResumeBatchLoadTaskRequest,resume_batch_load_task_request\nResumeCampaignRequest,resume_campaign_request\nResumeCluster,resume_cluster\nResumeClusterMessage,resume_cluster_message\nResumeClusterResult,resume_cluster_result\nResumeContactRecordingRequest,resume_contact_recording_request\nResumeFullAutomationModeMinutes,resume_full_automation_mode_minutes\nResumeFullAutomationModeTime,resume_full_automation_mode_time\nResumeGameServerGroupInput,resume_game_server_group_input\nResumeGameServerGroupOutput,resume_game_server_group_output\nResumeReplicationRequest,resume_replication_request\nResumeResourceRequest,resume_resource_request\nResumeServiceRequest,resume_service_request\nResumeServiceResponse,resume_service_response\nResumeSessionRequest,resume_session_request\nResumeSessionResponse,resume_session_response\nResumeWorkflowRunRequest,resume_workflow_run_request\nResumeWorkflowRunResponse,resume_workflow_run_response\nResyncMFADeviceRequest,resync_mfa_device_request\nRetainAllVariantProperties,retain_all_variant_properties\nRetainDeploymentConfig,retain_deployment_config\nRetainExceptOnCreate,retain_except_on_create\nRetainPhysicalResources,retain_physical_resources\nRetainPrimaryCluster,retain_primary_cluster\nRetainPrimaryReplicationGroup,retain_primary_replication_group\nRetainRecordInDays,retain_record_in_days\nRetainRecordUntil,retain_record_until\nRetainResources,retain_resources\nRetainRule,retain_rule\nRetainStacks,retain_stacks\nRetainStacksOnAccountRemoval,retain_stacks_on_account_removal\nRetainUntilDate,retain_until_date\nRetainedMessageSummary,retained_message_summary\nRetention,retention\nRetentionArchiveTier,retention_archive_tier\nRetentionConfiguration,retention_configuration\nRetentionConfigurationName,retention_configuration_name\nRetentionConfigurationNames,retention_configuration_names\nRetentionConfigurations,retention_configurations\nRetentionDays,retention_days\nRetentionLockTimeInDays,retention_lock_time_in_days\nRetentionLockType,retention_lock_type\nRetentionPeriod,retention_period\nRetentionPeriodHours,retention_period_hours\nRetentionPeriodInDays,retention_period_in_days\nRetentionPeriodUnit,retention_period_unit\nRetentionPeriodValue,retention_period_value\nRetentionPolicy,retention_policy\nRetentionProperties,retention_properties\nRetentionSettings,retention_settings\nRetentionStartDate,retention_start_date\nRetireGrantRequest,retire_grant_request\nRetiringPrincipal,retiring_principal\nRetrainingAvailableDataInDays,retraining_available_data_in_days\nRetrainingFrequency,retraining_frequency\nRetrainingSchedulerStatus,retraining_scheduler_status\nRetrainingSchedulerSummaries,retraining_scheduler_summaries\nRetrainingSchedulerSummary,retraining_scheduler_summary\nRetrainingStartDate,retraining_start_date\nRetries,retries\nRetrieval,retrieval\nRetrievalByteRange,retrieval_byte_range\nRetrievalRoleArn,retrieval_role_arn\nRetrieveAZs,retrieve_azs\nRetrieveActions,retrieve_actions\nRetrieveDomainAuthCodeRequest,retrieve_domain_auth_code_request\nRetrieveDomainAuthCodeResponse,retrieve_domain_auth_code_response\nRetrieveEnvironmentInfoMessage,retrieve_environment_info_message\nRetrieveEnvironmentInfoResultMessage,retrieve_environment_info_result_message\nRetrieveFilePaths,retrieve_file_paths\nRetrieveRequest,retrieve_request\nRetrieveResult,retrieve_result\nRetrieveResultItem,retrieve_result_item\nRetrieveResults,retrieve_results\nRetrieveTapeArchiveInput,retrieve_tape_archive_input\nRetrieveTapeArchiveOutput,retrieve_tape_archive_output\nRetrieveTapeRecoveryPointInput,retrieve_tape_recovery_point_input\nRetrieveTapeRecoveryPointOutput,retrieve_tape_recovery_point_output\nRetrievedTo,retrieved_to\nRetryAfter,retry_after\nRetryAfterSeconds,retry_after_seconds\nRetryAttemptSeconds,retry_attempt_seconds\nRetryAttempts,retry_attempts\nRetryBuildBatchInput,retry_build_batch_input\nRetryBuildBatchOutput,retry_build_batch_output\nRetryBuildInput,retry_build_input\nRetryBuildOutput,retry_build_output\nRetryCount,retry_count\nRetryCriteria,retry_criteria\nRetryDataReplicationRequest,retry_data_replication_request\nRetryDelayInSeconds,retry_delay_in_seconds\nRetryInterval,retry_interval\nRetryIntervalInMinutes,retry_interval_in_minutes\nRetryIntervalMs,retry_interval_ms\nRetryOptions,retry_options\nRetryPipelineExecutionRequest,retry_pipeline_execution_request\nRetryPipelineExecutionResponse,retry_pipeline_execution_response\nRetryPolicy,retry_policy\nRetryPolicyConfiguration,retry_policy_configuration\nRetryPolicyExecution,retry_policy_execution\nRetryStageExecutionInput,retry_stage_execution_input\nRetryStageExecutionOutput,retry_stage_execution_output\nRetryStrategy,retry_strategy\nRetryWorkflowStepRequest,retry_workflow_step_request\nRetryWorkflowStepResponse,retry_workflow_step_response\nRetryable,retryable\nRetryableConflictException,retryable_conflict_exception\nRetryableError,retryable_error\nRetryableException,retryable_exception\nReturn,return\nReturnCode,return_code\nReturnConnectionPasswordEncrypted,return_connection_password_encrypted\nReturnConsumedCapacity,return_consumed_capacity\nReturnData,return_data\nReturnEnabled,return_enabled\nReturnInformation,return_information\nReturnItemCollectionMetrics,return_item_collection_metrics\nReturnPath,return_path\nReturnPathArn,return_path_arn\nReturnPathComponents,return_path_components\nReturnShippingLabelAlreadyExistsException,return_shipping_label_already_exists_exception\nReturnShippingLabelURI,return_shipping_label_uri\nReturnSize,return_size\nReturnSubscriptionArn,return_subscription_arn\nReturnValue,return_value\nReturnValues,return_values\nReturnValuesOnConditionCheckFailure,return_values_on_condition_check_failure\nReusableDelegationSetLimit,reusable_delegation_set_limit\nReuseOnScaleIn,reuse_on_scale_in\nReusedByJob,reused_by_job\nReusedPreviousResult,reused_previous_result\nRevealConfiguration,reveal_configuration\nReverseGeocodingConfig,reverse_geocoding_config\nReverseOrder,reverse_order\nReverseReplicationRequest,reverse_replication_request\nReverseReplicationResponse,reverse_replication_response\nRevert,revert\nReviewActionDetail,review_action_detail\nReviewActions,review_actions\nReviewDetails,review_details\nReviewInformation,review_information\nReviewOwner,review_owner\nReviewPolicy,review_policy\nReviewReport,review_report\nReviewRestrictionDate,review_restriction_date\nReviewResultDetail,review_result_detail\nReviewResults,review_results\nReviewStatus,review_status\nReviewedTime,reviewed_time\nReviewer,reviewer\nReviewerResponse,reviewer_response\nReviews,reviews\nRevision,revision\nRevisionDestination,revision_destination\nRevisionDestinationEntry,revision_destination_entry\nRevisionDestinations,revision_destinations\nRevisionDoesNotExistException,revision_does_not_exist_exception\nRevisionEntry,revision_entry\nRevisionId,revision_id\nRevisionIdRequiredException,revision_id_required_exception\nRevisionInfo,revision_info\nRevisionLocation,revision_location\nRevisionNotCurrentException,revision_not_current_exception\nRevisionPublished,revision_published\nRevisionRequiredException,revision_required_exception\nRevisionTarget,revision_target\nRevisionTargets,revision_targets\nRevisions,revisions\nRevocationComment,revocation_comment\nRevocationConfiguration,revocation_configuration\nRevocationReason,revocation_reason\nRevokeAllGroups,revoke_all_groups\nRevokeCacheSecurityGroupIngressMessage,revoke_cache_security_group_ingress_message\nRevokeCacheSecurityGroupIngressResult,revoke_cache_security_group_ingress_result\nRevokeCertificateRequest,revoke_certificate_request\nRevokeClientVpnIngressRequest,revoke_client_vpn_ingress_request\nRevokeClientVpnIngressResult,revoke_client_vpn_ingress_result\nRevokeClusterSecurityGroupIngressMessage,revoke_cluster_security_group_ingress_message\nRevokeClusterSecurityGroupIngressResult,revoke_cluster_security_group_ingress_result\nRevokeDBSecurityGroupIngressMessage,revoke_db_security_group_ingress_message\nRevokeDBSecurityGroupIngressResult,revoke_db_security_group_ingress_result\nRevokeDomainAccessRequest,revoke_domain_access_request\nRevokeEndpointAccessMessage,revoke_endpoint_access_message\nRevokeFlowEntitlementRequest,revoke_flow_entitlement_request\nRevokeFlowEntitlementResponse,revoke_flow_entitlement_response\nRevokeGrantRequest,revoke_grant_request\nRevokeInvitationRequest,revoke_invitation_request\nRevokeIpRulesRequest,revoke_ip_rules_request\nRevokeLinkPermissions,revoke_link_permissions\nRevokePermissions,revoke_permissions\nRevokePermissionsRequest,revoke_permissions_request\nRevokeRevisionRequest,revoke_revision_request\nRevokeRevisionResponse,revoke_revision_response\nRevokeSecurityGroupEgressRequest,revoke_security_group_egress_request\nRevokeSecurityGroupEgressResult,revoke_security_group_egress_result\nRevokeSecurityGroupIngressRequest,revoke_security_group_ingress_request\nRevokeSecurityGroupIngressResult,revoke_security_group_ingress_result\nRevokeSignatureRequest,revoke_signature_request\nRevokeSigningProfileRequest,revoke_signing_profile_request\nRevokeSnapshotAccessMessage,revoke_snapshot_access_message\nRevokeSnapshotAccessResult,revoke_snapshot_access_result\nRevokeTokenRequest,revoke_token_request\nRevokeVpcEndpointAccessRequest,revoke_vpc_endpoint_access_request\nRevoked,revoked\nRevokedAt,revoked_at\nReward,reward\nRfRegion,rf_region\nRfc4180,rfc4180\nRfc822Name,rfc822_name\nRichText,rich_text\nRight,right\nRightJoinKeyProperties,right_join_key_properties\nRightOperand,right_operand\nRightsizingRecommendation,rightsizing_recommendation\nRightsizingRecommendationConfiguration,rightsizing_recommendation_configuration\nRightsizingRecommendationMetadata,rightsizing_recommendation_metadata\nRightsizingRecommendationSummary,rightsizing_recommendation_summary\nRightsizingRecommendations,rightsizing_recommendations\nRightsizingType,rightsizing_type\nRisk,risk\nRiskConfiguration,risk_configuration\nRiskConfigurationType,risk_configuration_type\nRiskCounts,risk_counts\nRiskDecision,risk_decision\nRiskDetails,risk_details\nRiskExceptionConfiguration,risk_exception_configuration\nRiskExceptionConfigurationType,risk_exception_configuration_type\nRiskLevel,risk_level\nRiskRating,risk_rating\nRiskScore,risk_score\nRiskThreshold,risk_threshold\nRobot,robot\nRobotApplicationConfig,robot_application_config\nRobotApplicationSummary,robot_application_summary\nRobotDeployment,robot_deployment\nRobotSoftwareSuite,robot_software_suite\nRole,role\nRoleARN,role_arn\nRoleARNUpdate,role_arn_update\nRoleAliasDescription,role_alias_description\nRoleArn,role_arn\nRoleArns,role_arns\nRoleBase,role_base\nRoleCredentials,role_credentials\nRoleDetail,role_detail\nRoleDetailList,role_detail_list\nRoleId,role_id\nRoleInfo,role_info\nRoleLastUsed,role_last_used\nRoleLevel,role_level\nRoleMapping,role_mapping\nRoleMappings,role_mappings\nRoleName,role_name\nRolePolicyList,role_policy_list\nRoleRequiredException,role_required_exception\nRoleSearchMatching,role_search_matching\nRoleSearchSubtree,role_search_subtree\nRoleSessionName,role_session_name\nRoleStatus,role_status\nRoleUsageList,role_usage_list\nRoleUsageType,role_usage_type\nRoleValues,role_values\nRoles,roles\nRolesKey,roles_key\nRoll,roll\nRollback,rollback\nRollbackApplicationRequest,rollback_application_request\nRollbackApplicationResponse,rollback_application_response\nRollbackConfiguration,rollback_configuration\nRollbackDetails,rollback_details\nRollbackErrorMessage,rollback_error_message\nRollbackErrors,rollback_errors\nRollbackFailureReason,rollback_failure_reason\nRollbackInfo,rollback_info\nRollbackInstanceRefreshAnswer,rollback_instance_refresh_answer\nRollbackInstanceRefreshType,rollback_instance_refresh_type\nRollbackMaximumBatchSize,rollback_maximum_batch_size\nRollbackOnDisable,rollback_on_disable\nRollbackReason,rollback_reason\nRollbackStackInput,rollback_stack_input\nRollbackStackOutput,rollback_stack_output\nRollbackStartTime,rollback_start_time\nRollbackTransactionRequest,rollback_transaction_request\nRollbackTransactionResponse,rollback_transaction_response\nRollbackTrigger,rollback_trigger\nRollbackTriggers,rollback_triggers\nRollingDate,rolling_date\nRollingDateConfiguration,rolling_date_configuration\nRollingUpdatePolicy,rolling_update_policy\nRolloverInterval,rollover_interval\nRoom,room\nRoomArn,room_arn\nRoomData,room_data\nRoomFilters,room_filters\nRoomId,room_id\nRoomMembership,room_membership\nRoomMemberships,room_memberships\nRoomName,room_name\nRoomRetentionSettings,room_retention_settings\nRoomSkillParameter,room_skill_parameter\nRoomSkillParameters,room_skill_parameters\nRoomSummary,room_summary\nRoomUtilizationMetricsEnabled,room_utilization_metrics_enabled\nRooms,rooms\nRoot,root\nRootAccess,root_access\nRootCause,root_cause\nRootCauseException,root_cause_exception\nRootCauseServiceId,root_cause_service_id\nRootCauseServiceRequestImpactStatistics,root_cause_service_request_impact_statistics\nRootCauses,root_causes\nRootCertificatePublicKey,root_certificate_public_key\nRootChangeSetId,root_change_set_id\nRootDeviceName,root_device_name\nRootDeviceType,root_device_type\nRootDeviceVolumeId,root_device_volume_id\nRootDirectory,root_directory\nRootFolderId,root_folder_id\nRootId,root_id\nRootNotFoundException,root_not_found_exception\nRootSquash,root_squash\nRootSquashConfiguration,root_squash_configuration\nRootStorage,root_storage\nRootVolumeConfiguration,root_volume_configuration\nRootVolumeEncryptionEnabled,root_volume_encryption_enabled\nRootVolumeId,root_volume_id\nRootVolumeSecurityStyle,root_volume_security_style\nRootVolumeSizeGib,root_volume_size_gib\nRoots,roots\nRotate,rotate\nRotateChannelCredentialsRequest,rotate_channel_credentials_request\nRotateChannelCredentialsResponse,rotate_channel_credentials_response\nRotateEncryptionKeyMessage,rotate_encryption_key_message\nRotateEncryptionKeyResult,rotate_encryption_key_result\nRotateImmediately,rotate_immediately\nRotateIngestEndpointCredentialsRequest,rotate_ingest_endpoint_credentials_request\nRotateIngestEndpointCredentialsResponse,rotate_ingest_endpoint_credentials_response\nRotateMasterUserPassword,rotate_master_user_password\nRotateSecretRequest,rotate_secret_request\nRotateSecretResponse,rotate_secret_response\nRotateTunnelAccessTokenRequest,rotate_tunnel_access_token_request\nRotateTunnelAccessTokenResponse,rotate_tunnel_access_token_response\nRotation,rotation\nRotationAngle,rotation_angle\nRotationArn,rotation_arn\nRotationEnabled,rotation_enabled\nRotationId,rotation_id\nRotationIds,rotation_ids\nRotationLambdaARN,rotation_lambda_arn\nRotationLambdaArn,rotation_lambda_arn\nRotationNamePrefix,rotation_name_prefix\nRotationOccurredWithinFrequency,rotation_occurred_within_frequency\nRotationOverride,rotation_override\nRotationOverrideId,rotation_override_id\nRotationOverrides,rotation_overrides\nRotationRules,rotation_rules\nRotationRulesType,rotation_rules_type\nRotationShift,rotation_shift\nRotationShifts,rotation_shifts\nRotationStartTime,rotation_start_time\nRotations,rotations\nRoundTripTime,round_trip_time\nRoute,route\nRouteAnalysis,route_analysis\nRouteAnalysisCompletion,route_analysis_completion\nRouteAnalysisEndpointOptions,route_analysis_endpoint_options\nRouteAnalysisEndpointOptionsSpecification,route_analysis_endpoint_options_specification\nRouteAnalysisId,route_analysis_id\nRouteAnalysisPath,route_analysis_path\nRouteBBox,route_b_box\nRouteCount,route_count\nRouteData,route_data\nRouteFilterPrefix,route_filter_prefix\nRouteHasOutOfScopeEndpointViolation,route_has_out_of_scope_endpoint_violation\nRouteId,route_id\nRouteIdentifier,route_identifier\nRouteKey,route_key\nRouteMatrix,route_matrix\nRouteMatrixEntry,route_matrix_entry\nRouteMatrixEntryError,route_matrix_entry_error\nRouteOrigin,route_origin\nRouteRef,route_ref\nRouteResponse,route_response\nRouteResponseId,route_response_id\nRouteResponseKey,route_response_key\nRouteResponseSelectionExpression,route_response_selection_expression\nRouteSelectionExpression,route_selection_expression\nRouteSet,route_set\nRouteSetDetails,route_set_details\nRouteSettings,route_settings\nRouteSpec,route_spec\nRouteStatus,route_status\nRouteSummary,route_summary\nRouteSummaryList,route_summary_list\nRouteTable,route_table\nRouteTableArn,route_table_arn\nRouteTableAssociation,route_table_association\nRouteTableAssociationId,route_table_association_id\nRouteTableAssociationState,route_table_association_state\nRouteTableId,route_table_id\nRouteTableIdentifier,route_table_identifier\nRouteTableIds,route_table_ids\nRouteTableRoute,route_table_route\nRouteTableTimestamp,route_table_timestamp\nRouteTableType,route_table_type\nRouteTables,route_tables\nRouteType,route_type\nRouteUpdates,route_updates\nRoutedResource,routed_resource\nRouterType,router_type\nRoutes,routes\nRoutingConfig,routing_config\nRoutingConfigurationListItem,routing_configuration_list_item\nRoutingControl,routing_control\nRoutingControlArn,routing_control_arn\nRoutingControlCount,routing_control_count\nRoutingControlName,routing_control_name\nRoutingControlState,routing_control_state\nRoutingControls,routing_controls\nRoutingPolicy,routing_policy\nRoutingProfile,routing_profile\nRoutingProfileArn,routing_profile_arn\nRoutingProfileId,routing_profile_id\nRoutingProfileQueueConfig,routing_profile_queue_config\nRoutingProfileQueueConfigSummary,routing_profile_queue_config_summary\nRoutingProfileQueueConfigSummaryList,routing_profile_queue_config_summary_list\nRoutingProfileQueueReference,routing_profile_queue_reference\nRoutingProfileReference,routing_profile_reference\nRoutingProfileSearchCriteria,routing_profile_search_criteria\nRoutingProfileSearchFilter,routing_profile_search_filter\nRoutingProfileSummary,routing_profile_summary\nRoutingProfileSummaryList,routing_profile_summary_list\nRoutingProfiles,routing_profiles\nRoutingRule,routing_rule\nRoutingRules,routing_rules\nRoutingStrategy,routing_strategy\nRoutingStrategyType,routing_strategy_type\nRow,row\nRowAlternateColorOptions,row_alternate_color_options\nRowAlternateColors,row_alternate_colors\nRowColumnInfo,row_column_info\nRowFieldNamesStyle,row_field_names_style\nRowFilter,row_filter\nRowFilterExpression,row_filter_expression\nRowGroupLength,row_group_length\nRowHeaderStyle,row_header_style\nRowIndex,row_index\nRowIndexStride,row_index_stride\nRowInfo,row_info\nRowLabelOptions,row_label_options\nRowLength,row_length\nRowLevelPermissionDataSet,row_level_permission_data_set\nRowLevelPermissionTagConfiguration,row_level_permission_tag_configuration\nRowLevelPermissionTagConfigurationApplied,row_level_permission_tag_configuration_applied\nRowLevelPermissionTagKeys,row_level_permission_tag_keys\nRowLevelPermissionTagRule,row_level_permission_tag_rule\nRowLevelPermissionTags,row_level_permission_tags\nRowRange,row_range\nRowSort,row_sort\nRowSpan,row_span\nRowSubtotalOptions,row_subtotal_options\nRowTag,row_tag\nRowTotalOptions,row_total_options\nRowValue,row_value\nRows,rows\nRowsDropped,rows_dropped\nRowsIngested,rows_ingested\nRowsLabelOptions,rows_label_options\nRowsLayout,rows_layout\nRpcProtection,rpc_protection\nRsaPublicKey,rsa_public_key\nRsaPublicKeyFingerprint,rsa_public_key_fingerprint\nRscp,rscp\nRsrp,rsrp\nRsrq,rsrq\nRss,rss\nRssi,rssi\nRtmpCaptionInfoDestinationSettings,rtmp_caption_info_destination_settings\nRtmpGroupSettings,rtmp_group_settings\nRtmpOutputSettings,rtmp_output_settings\nRule,rule\nRuleARN,rule_arn\nRuleAction,rule_action\nRuleActionOverride,rule_action_override\nRuleActionOverrides,rule_action_overrides\nRuleArn,rule_arn\nRuleArns,rule_arns\nRuleBasedMatching,rule_based_matching\nRuleBasedMatchingRequest,rule_based_matching_request\nRuleBasedMatchingResponse,rule_based_matching_response\nRuleBasedProperties,rule_based_properties\nRuleCondition,rule_condition\nRuleConfig,rule_config\nRuleConfigurationName,rule_configuration_name\nRuleCount,rule_count\nRuleDefinition,rule_definition\nRuleDescription,rule_description\nRuleDetail,rule_detail\nRuleDoesNotExistException,rule_does_not_exist_exception\nRuleEvaluation,rule_evaluation\nRuleEvaluationJobArn,rule_evaluation_job_arn\nRuleEvaluationStatus,rule_evaluation_status\nRuleEvaluatorImage,rule_evaluator_image\nRuleGroup,rule_group\nRuleGroupArn,rule_group_arn\nRuleGroupDetails,rule_group_details\nRuleGroupId,rule_group_id\nRuleGroupMetadata,rule_group_metadata\nRuleGroupName,rule_group_name\nRuleGroupReferenceStatement,rule_group_reference_statement\nRuleGroupResponse,rule_group_response\nRuleGroupRuleName,rule_group_rule_name\nRuleGroupRuleOptionsPair,rule_group_rule_options_pair\nRuleGroupRuleOptionsPairs,rule_group_rule_options_pairs\nRuleGroupSource,rule_group_source\nRuleGroupSourceCustomActionsDetails,rule_group_source_custom_actions_details\nRuleGroupSourceListDetails,rule_group_source_list_details\nRuleGroupSourceStatefulRulesDetails,rule_group_source_stateful_rules_details\nRuleGroupSourceStatefulRulesHeaderDetails,rule_group_source_stateful_rules_header_details\nRuleGroupSourceStatefulRulesOptionsDetails,rule_group_source_stateful_rules_options_details\nRuleGroupSourceStatelessRuleDefinition,rule_group_source_stateless_rule_definition\nRuleGroupSourceStatelessRuleMatchAttributes,rule_group_source_stateless_rule_match_attributes\nRuleGroupSourceStatelessRuleMatchAttributesDestinationPorts,rule_group_source_stateless_rule_match_attributes_destination_ports\nRuleGroupSourceStatelessRuleMatchAttributesDestinations,rule_group_source_stateless_rule_match_attributes_destinations\nRuleGroupSourceStatelessRuleMatchAttributesSourcePorts,rule_group_source_stateless_rule_match_attributes_source_ports\nRuleGroupSourceStatelessRuleMatchAttributesSources,rule_group_source_stateless_rule_match_attributes_sources\nRuleGroupSourceStatelessRuleMatchAttributesTcpFlags,rule_group_source_stateless_rule_match_attributes_tcp_flags\nRuleGroupSourceStatelessRulesAndCustomActionsDetails,rule_group_source_stateless_rules_and_custom_actions_details\nRuleGroupSourceStatelessRulesDetails,rule_group_source_stateless_rules_details\nRuleGroupStatus,rule_group_status\nRuleGroupSummary,rule_group_summary\nRuleGroupType,rule_group_type\nRuleGroupTypePair,rule_group_type_pair\nRuleGroupTypePairs,rule_group_type_pairs\nRuleGroupUpdate,rule_group_update\nRuleGroupVariables,rule_group_variables\nRuleGroupVariablesIpSetsDetails,rule_group_variables_ip_sets_details\nRuleGroupVariablesPortSetsDetails,rule_group_variables_port_sets_details\nRuleGroups,rule_groups\nRuleGroupsNamespaceDescription,rule_groups_namespace_description\nRuleGroupsNamespaceStatus,rule_groups_namespace_status\nRuleGroupsNamespaceSummary,rule_groups_namespace_summary\nRuleId,rule_id\nRuleIdentifier,rule_identifier\nRuleLabels,rule_labels\nRuleLevel,rule_level\nRuleLimitExceededException,rule_limit_exceeded_exception\nRuleMetadata,rule_metadata\nRuleMetricName,rule_metric_name\nRuleName,rule_name\nRuleNameWithinRuleGroup,rule_name_within_rule_group\nRuleNames,rule_names\nRuleNotFoundException,rule_not_found_exception\nRuleNumber,rule_number\nRuleOption,rule_option\nRuleOptions,rule_options\nRuleOrder,rule_order\nRuleParameters,rule_parameters\nRulePriorities,rule_priorities\nRulePriorityPair,rule_priority_pair\nRuleResult,rule_result\nRuleResults,rule_results\nRuleSet,rule_set\nRuleSetArn,rule_set_arn\nRuleSetBody,rule_set_body\nRuleSetDoesNotExistException,rule_set_does_not_exist_exception\nRuleSetName,rule_set_name\nRuleSets,rule_sets\nRuleState,rule_state\nRuleStatus,rule_status\nRuleSummary,rule_summary\nRuleSummaryList,rule_summary_list\nRuleTags,rule_tags\nRuleTriggerEventSource,rule_trigger_event_source\nRuleType,rule_type\nRuleUpdate,rule_update\nRuleUpdateFailure,rule_update_failure\nRuleUpdateSuccess,rule_update_success\nRuleVariables,rule_variables\nRuleVersion,rule_version\nRuleWithinRuleGroup,rule_within_rule_group\nRules,rules\nRulesConfiguration,rules_configuration\nRulesConfigurationType,rules_configuration_type\nRulesList,rules_list\nRulesPackage,rules_package\nRulesSource,rules_source\nRulesSourceList,rules_source_list\nRulesString,rules_string\nRuleset,ruleset\nRulesetArn,ruleset_arn\nRulesetEvaluationRunId,ruleset_evaluation_run_id\nRulesetItem,ruleset_item\nRulesetName,ruleset_name\nRulesetNames,ruleset_names\nRulesets,rulesets\nRumEvent,rum_event\nRumEvents,rum_events\nRun,run\nRunAs,run_as\nRunBackTestMode,run_back_test_mode\nRunCommand,run_command\nRunCommandParameters,run_command_parameters\nRunCommandTarget,run_command_target\nRunCommandTargets,run_command_targets\nRunConfig,run_config\nRunConfiguration,run_configuration\nRunConfigurationDescription,run_configuration_description\nRunConfigurationUpdate,run_configuration_update\nRunFleetAdvisorLsaAnalysisResponse,run_fleet_advisor_lsa_analysis_response\nRunGroupListItem,run_group_list_item\nRunId,run_id\nRunInstancesMonitoringEnabled,run_instances_monitoring_enabled\nRunInstancesRequest,run_instances_request\nRunJobFlowInput,run_job_flow_input\nRunJobFlowOutput,run_job_flow_output\nRunListItem,run_list_item\nRunName,run_name\nRunPipelineActivityRequest,run_pipeline_activity_request\nRunPipelineActivityResponse,run_pipeline_activity_response\nRunProperties,run_properties\nRunScheduledInstancesRequest,run_scheduled_instances_request\nRunScheduledInstancesResult,run_scheduled_instances_result\nRunStatementRequest,run_statement_request\nRunStatementResponse,run_statement_response\nRunStatus,run_status\nRunTaskRequest,run_task_request\nRunTaskResponse,run_task_response\nRunbook,runbook\nRunbooks,runbooks\nRuncBinaryPath,runc_binary_path\nRunning,running\nRunningActions,running_actions\nRunningAmiVersion,running_ami_version\nRunningBridgeCount,running_bridge_count\nRunningInstanceCount,running_instance_count\nRunningMode,running_mode\nRunningModeAutoStopTimeoutInMinutes,running_mode_auto_stop_timeout_in_minutes\nRunningSetup,running_setup\nRunningTasksCount,running_tasks_count\nRuns,runs\nRuntime,runtime\nRuntimeConfiguration,runtime_configuration\nRuntimeContext,runtime_context\nRuntimeContextName,runtime_context_name\nRuntimeContextStates,runtime_context_states\nRuntimeDetails,runtime_details\nRuntimeEnvironment,runtime_environment\nRuntimeEnvironmentSecrets,runtime_environment_secrets\nRuntimeEnvironmentVariables,runtime_environment_variables\nRuntimeHintDetails,runtime_hint_details\nRuntimeHintValue,runtime_hint_value\nRuntimeHints,runtime_hints\nRuntimeInSeconds,runtime_in_seconds\nRuntimePlatform,runtime_platform\nRuntimeRoleArn,runtime_role_arn\nRuntimeVersion,runtime_version\nRuntimeVersionArn,runtime_version_arn\nRuntimeVersionConfig,runtime_version_config\nRuntimeVersionError,runtime_version_error\nRuntimeVersions,runtime_versions\nRxDataRate2,rx_data_rate2\nRxDelay1,rx_delay1\nRxDrOffset1,rx_dr_offset1\nRxFreq2,rx_freq2\nRxLevel,rx_level\nRxNormAttribute,rx_norm_attribute\nRxNormConcept,rx_norm_concept\nRxNormConcepts,rx_norm_concepts\nRxNormEntity,rx_norm_entity\nRxNormTrait,rx_norm_trait\nS,s\nS3,s3\nS3AccessControlList,s3_access_control_list\nS3AccessControlPolicy,s3_access_control_policy\nS3AccessDeniedFault,s3_access_denied_fault\nS3AccessPointAlias,s3_access_point_alias\nS3AccessPointArn,s3_access_point_arn\nS3AccessPointConfiguration,s3_access_point_configuration\nS3AclOption,s3_acl_option\nS3Action,s3_action\nS3ApplicationCodeLocationDescription,s3_application_code_location_description\nS3ArtifactLocation,s3_artifact_location\nS3ArtifactPath,s3_artifact_path\nS3BackupConfiguration,s3_backup_configuration\nS3BackupDescription,s3_backup_description\nS3BackupMode,s3_backup_mode\nS3BackupUpdate,s3_backup_update\nS3Bucket,s3_bucket\nS3BucketAccessRoleArn,s3_bucket_access_role_arn\nS3BucketAclGrantConfiguration,s3_bucket_acl_grant_configuration\nS3BucketArn,s3_bucket_arn\nS3BucketConfiguration,s3_bucket_configuration\nS3BucketCriteriaForJob,s3_bucket_criteria_for_job\nS3BucketDefinitionForJob,s3_bucket_definition_for_job\nS3BucketDestination,s3_bucket_destination\nS3BucketDetail,s3_bucket_detail\nS3BucketDetails,s3_bucket_details\nS3BucketDoesNotExistException,s3_bucket_does_not_exist_exception\nS3BucketFolder,s3_bucket_folder\nS3BucketInfo,s3_bucket_info\nS3BucketLogDestination,s3_bucket_log_destination\nS3BucketName,s3_bucket_name\nS3BucketOwner,s3_bucket_owner\nS3BucketPath,s3_bucket_path\nS3BucketPrefix,s3_bucket_prefix\nS3BucketRegion,s3_bucket_region\nS3BucketRepository,s3_bucket_repository\nS3BucketRoleArn,s3_bucket_role_arn\nS3BucketSinkConfiguration,s3_bucket_sink_configuration\nS3BucketSource,s3_bucket_source\nS3BucketTranscriptSource,s3_bucket_transcript_source\nS3CanonicalUserId,s3_canonical_user_id\nS3CatalogDeltaSource,s3_catalog_delta_source\nS3CatalogHudiSource,s3_catalog_hudi_source\nS3CatalogSource,s3_catalog_source\nS3CatalogTarget,s3_catalog_target\nS3ClassificationScope,s3_classification_scope\nS3ClassificationScopeExclusion,s3_classification_scope_exclusion\nS3ClassificationScopeExclusionUpdate,s3_classification_scope_exclusion_update\nS3ClassificationScopeUpdate,s3_classification_scope_update\nS3CompressionType,s3_compression_type\nS3Config,s3_config\nS3Configuration,s3_configuration\nS3ContentBaseLocation,s3_content_base_location\nS3ContentBaseLocationDescription,s3_content_base_location_description\nS3ContentBaseLocationUpdate,s3_content_base_location_update\nS3ContentLocation,s3_content_location\nS3ContentLocationDescription,s3_content_location_description\nS3ContentLocationUpdate,s3_content_location_update\nS3CopyObjectOperation,s3_copy_object_operation\nS3CsvSource,s3_csv_source\nS3Data,s3_data\nS3DataAccessAsset,s3_data_access_asset\nS3DataAccessAssetSourceEntry,s3_data_access_asset_source_entry\nS3DataConfig,s3_data_config\nS3DataDistributionType,s3_data_distribution_type\nS3DataRepositoryConfiguration,s3_data_repository_configuration\nS3DataSize,s3_data_size\nS3DataSource,s3_data_source\nS3DataSourceConfiguration,s3_data_source_configuration\nS3DataSpec,s3_data_spec\nS3DataType,s3_data_type\nS3DataUrl,s3_data_url\nS3DeleteObjectTagging,s3_delete_object_tagging\nS3DeltaCatalogTarget,s3_delta_catalog_target\nS3DeltaDirectTarget,s3_delta_direct_target\nS3DeltaSource,s3_delta_source\nS3Destination,s3_destination\nS3DestinationAccessControl,s3_destination_access_control\nS3DestinationConfig,s3_destination_config\nS3DestinationConfiguration,s3_destination_configuration\nS3DestinationDescription,s3_destination_description\nS3DestinationProperties,s3_destination_properties\nS3DestinationSettings,s3_destination_settings\nS3DestinationUpdate,s3_destination_update\nS3Destinations,s3_destinations\nS3DirectSourceAdditionalOptions,s3_direct_source_additional_options\nS3DirectTarget,s3_direct_target\nS3Encryption,s3_encryption\nS3EncryptionConfig,s3_encryption_config\nS3EncryptionConfiguration,s3_encryption_configuration\nS3EncryptionEnabled,s3_encryption_enabled\nS3EncryptionMode,s3_encryption_mode\nS3EncryptionSettings,s3_encryption_settings\nS3EventName,s3_event_name\nS3Exception,s3_exception\nS3ExportArtifacts,s3_export_artifacts\nS3ExportConfiguration,s3_export_configuration\nS3ExportLocation,s3_export_location\nS3Exporting,s3_exporting\nS3ExportingConfig,s3_exporting_config\nS3ExportingLocation,s3_exporting_location\nS3FailurePath,s3_failure_path\nS3FileLocation,s3_file_location\nS3GeneratedManifestDescriptor,s3_generated_manifest_descriptor\nS3GlueParquetTarget,s3_glue_parquet_target\nS3Grant,s3_grant\nS3Grantee,s3_grantee\nS3HudiCatalogTarget,s3_hudi_catalog_target\nS3HudiDirectTarget,s3_hudi_direct_target\nS3HudiSource,s3_hudi_source\nS3ImportSource,s3_import_source\nS3IngestionRoleArn,s3_ingestion_role_arn\nS3InitiateRestoreObject,s3_initiate_restore_object\nS3InitiateRestoreObjectOperation,s3_initiate_restore_object_operation\nS3Input,s3_input\nS3InputConfiguration,s3_input_configuration\nS3InputDefinition,s3_input_definition\nS3InputFileLocation,s3_input_file_location\nS3InputFormatConfig,s3_input_format_config\nS3InputMode,s3_input_mode\nS3Inputs,s3_inputs\nS3JobDefinition,s3_job_definition\nS3JobManifestGenerator,s3_job_manifest_generator\nS3JsonSource,s3_json_source\nS3Key,s3_key\nS3KeyFilter,s3_key_filter\nS3KeyName,s3_key_name\nS3KeyOutput,s3_key_output\nS3KeyPrefix,s3_key_prefix\nS3Keys,s3_keys\nS3KmsKeyId,s3_kms_key_id\nS3Location,s3_location\nS3LocationDescription,s3_location_description\nS3LocationNotInServiceRegionException,s3_location_not_in_service_region_exception\nS3LocationUri,s3_location_uri\nS3LogDelivery,s3_log_delivery\nS3LogDeliveryDescription,s3_log_delivery_description\nS3LogUrl,s3_log_url\nS3Logs,s3_logs\nS3LogsConfig,s3_logs_config\nS3LogsConfiguration,s3_logs_configuration\nS3LogsConfigurationResult,s3_logs_configuration_result\nS3MachineLearningModelResourceData,s3_machine_learning_model_resource_data\nS3ManifestOutputLocation,s3_manifest_output_location\nS3ModelArtifacts,s3_model_artifacts\nS3ModelDataSource,s3_model_data_source\nS3MonitoringConfiguration,s3_monitoring_configuration\nS3Object,s3_object\nS3ObjectAcl,s3_object_acl\nS3ObjectKey,s3_object_key\nS3ObjectLockLegalHold,s3_object_lock_legal_hold\nS3ObjectMetadata,s3_object_metadata\nS3ObjectOwner,s3_object_owner\nS3ObjectSource,s3_object_source\nS3ObjectTag,s3_object_tag\nS3ObjectTags,s3_object_tags\nS3ObjectUrl,s3_object_url\nS3ObjectVersion,s3_object_version\nS3OnDeviceService,s3_on_device_service\nS3OnDeviceServiceConfiguration,s3_on_device_service_configuration\nS3Options,s3_options\nS3Origin,s3_origin\nS3OriginConfig,s3_origin_config\nS3Output,s3_output\nS3OutputConfiguration,s3_output_configuration\nS3OutputFormatConfig,s3_output_format_config\nS3OutputLocation,s3_output_location\nS3OutputPath,s3_output_path\nS3OutputUri,s3_output_uri\nS3OutputUrl,s3_output_url\nS3Parameters,s3_parameters\nS3ParquetSource,s3_parquet_source\nS3Path,s3_path\nS3PathforGroupMembers,s3_pathfor_group_members\nS3Prefix,s3_prefix\nS3PublicAccessBlockConfiguration,s3_public_access_block_configuration\nS3PutObjectAcl,s3_put_object_acl\nS3PutObjectCopy,s3_put_object_copy\nS3PutObjectLegalHold,s3_put_object_legal_hold\nS3PutObjectRetention,s3_put_object_retention\nS3PutObjectTagging,s3_put_object_tagging\nS3RecordingConfig,s3_recording_config\nS3RecordingDetails,s3_recording_details\nS3RecordingSinkConfiguration,s3_recording_sink_configuration\nS3RecordingSinkRuntimeConfiguration,s3_recording_sink_runtime_configuration\nS3Reference,s3_reference\nS3ReferenceDataSource,s3_reference_data_source\nS3ReferenceDataSourceDescription,s3_reference_data_source_description\nS3ReferenceDataSourceUpdate,s3_reference_data_source_update\nS3Region,s3_region\nS3ReplicateObject,s3_replicate_object\nS3ReportExportConfig,s3_report_export_config\nS3ReportLocation,s3_report_location\nS3Repository,s3_repository\nS3RepositoryDetails,s3_repository_details\nS3Resource,s3_resource\nS3ResourceClassification,s3_resource_classification\nS3ResourceClassificationUpdate,s3_resource_classification_update\nS3ResourceNotFoundFault,s3_resource_not_found_fault\nS3Resources,s3_resources\nS3Results,s3_results\nS3ResultsPath,s3_results_path\nS3Retention,s3_retention\nS3SetObjectAclOperation,s3_set_object_acl_operation\nS3SetObjectLegalHoldOperation,s3_set_object_legal_hold_operation\nS3SetObjectRetentionOperation,s3_set_object_retention_operation\nS3SetObjectTaggingOperation,s3_set_object_tagging_operation\nS3Settings,s3_settings\nS3SignedObject,s3_signed_object\nS3SnapshotAsset,s3_snapshot_asset\nS3Source,s3_source\nS3SourceAdditionalOptions,s3_source_additional_options\nS3SourceConfig,s3_source_config\nS3SourceProperties,s3_source_properties\nS3SseAlgorithm,s3_sse_algorithm\nS3SseKmsKeyId,s3_sse_kms_key_id\nS3StagingLocation,s3_staging_location\nS3Storage,s3_storage\nS3StorageClass,s3_storage_class\nS3StorageConfig,s3_storage_config\nS3SubscriptionRequiredException,s3_subscription_required_exception\nS3TableOutputOptions,s3_table_output_options\nS3Tag,s3_tag\nS3Target,s3_target\nS3Targets,s3_targets\nS3Update,s3_update\nS3UploadMode,s3_upload_mode\nS3Uri,s3_uri\nS3Url,s3_url\nS3UrlPrefix,s3_url_prefix\nS3UrlSignerRole,s3_url_signer_role\nS3Version,s3_version\nS3WordsList,s3_words_list\nS3objectKey,s3object_key\nSAMLAssertion,saml_assertion\nSAMLIdp,saml_idp\nSAMLMetadataDocument,saml_metadata_document\nSAMLOptions,saml_options\nSAMLOptionsInput,saml_options_input\nSAMLOptionsOutput,saml_options_output\nSAMLProviderArn,saml_provider_arn\nSAMLProviderList,saml_provider_list\nSAMLProviderListEntry,saml_provider_list_entry\nSAPOData,sapo_data\nSAPODataConnectorProfileCredentials,sapo_data_connector_profile_credentials\nSAPODataConnectorProfileProperties,sapo_data_connector_profile_properties\nSAPODataDestinationProperties,sapo_data_destination_properties\nSAPODataPaginationConfig,sapo_data_pagination_config\nSAPODataParallelismConfig,sapo_data_parallelism_config\nSAPODataSourceProperties,sapo_data_source_properties\nSCApplicationAttributes,sc_application_attributes\nSDM,sdm\nSHA256TreeHash,sha256_tree_hash\nSL,sl\nSLRDeploymentStatus,slr_deployment_status\nSMB,smb\nSMBACLEnabled,smbacl_enabled\nSMBFileShareInfo,smb_file_share_info\nSMBFileShareInfoList,smb_file_share_info_list\nSMBGuestPasswordSet,smb_guest_password_set\nSMBLocalGroups,smb_local_groups\nSMBSecurityStrategy,smb_security_strategy\nSMS,sms\nSMSChannelRequest,sms_channel_request\nSMSChannelResponse,sms_channel_response\nSMSConfiguration,sms_configuration\nSMSMessage,sms_message\nSMSMessageActivity,sms_message_activity\nSMSMfaSettings,sms_mfa_settings\nSMSMfaSettingsType,sms_mfa_settings_type\nSMSSandboxPhoneNumber,sms_sandbox_phone_number\nSMSTemplate,sms_template\nSMSTemplateRequest,sms_template_request\nSMSTemplateResponse,sms_template_response\nSNOMEDCTAttribute,snomedct_attribute\nSNOMEDCTConcept,snomedct_concept\nSNOMEDCTConcepts,snomedct_concepts\nSNOMEDCTDetails,snomedct_details\nSNOMEDCTEntity,snomedct_entity\nSNOMEDCTTrait,snomedct_trait\nSNSAction,sns_action\nSNSConfiguration,sns_configuration\nSNSDestination,sns_destination\nSNSInvalidTopicFault,sns_invalid_topic_fault\nSNSNoAuthorizationFault,sns_no_authorization_fault\nSNSTopic,sns_topic\nSNSTopicArn,sns_topic_arn\nSNSTopicArnNotFoundFault,sns_topic_arn_not_found_fault\nSNSTopicPublishAction,sns_topic_publish_action\nSNwkSIntKey,s_nwk_s_int_key\nSOA,soa\nSOAChange,soa_change\nSQLPort,sql_port\nSS,ss\nSSEAlgorithm,sse_algorithm\nSSEAwsKmsKeyId,sse_aws_kms_key_id\nSSECustomerAlgorithm,sse_customer_algorithm\nSSECustomerKey,sse_customer_key\nSSECustomerKeyMD5,sse_customer_key_md5\nSSEDescription,sse_description\nSSEKMS,ssekms\nSSEKMSEncryption,ssekms_encryption\nSSEKMSEncryptionContext,ssekms_encryption_context\nSSEKMSKeyId,ssekms_key_id\nSSES3,sses3\nSSESpecification,sse_specification\nSSESpecificationOverride,sse_specification_override\nSSEType,sse_type\nSSHPublicKey,ssh_public_key\nSSHPublicKeyBody,ssh_public_key_body\nSSHPublicKeyId,ssh_public_key_id\nSSHPublicKeyMetadata,ssh_public_key_metadata\nSSHPublicKeys,ssh_public_keys\nSSLCertificateId,ssl_certificate_id\nSSLPolicyNotFoundException,ssl_policy_not_found_exception\nSSLSupportMethod,ssl_support_method\nSSMLMessage,ssml_message\nSSMLMessageType,ssml_message_type\nSSMOutput,ssm_output\nSSMValidationParameters,ssm_validation_parameters\nSSOIdentity,sso_identity\nSaaSConfiguration,saa_s_configuration\nSafe,safe\nSafeguardPolicy,safeguard_policy\nSafetyRuleArn,safety_rule_arn\nSafetyRules,safety_rules\nSafetyRulesToOverride,safety_rules_to_override\nSageMakerImageArn,sage_maker_image_arn\nSageMakerImageVersionAliases,sage_maker_image_version_aliases\nSageMakerImageVersionArn,sage_maker_image_version_arn\nSageMakerJobArn,sage_maker_job_arn\nSageMakerMachineLearningModelResourceData,sage_maker_machine_learning_model_resource_data\nSageMakerPipelineParameter,sage_maker_pipeline_parameter\nSageMakerPipelineParameters,sage_maker_pipeline_parameters\nSalesforce,salesforce\nSalesforceAction,salesforce_action\nSalesforceChatterFeedConfiguration,salesforce_chatter_feed_configuration\nSalesforceConfiguration,salesforce_configuration\nSalesforceConnectorProfileCredentials,salesforce_connector_profile_credentials\nSalesforceConnectorProfileProperties,salesforce_connector_profile_properties\nSalesforceCustomKnowledgeArticleTypeConfiguration,salesforce_custom_knowledge_article_type_configuration\nSalesforceDestinationProperties,salesforce_destination_properties\nSalesforceKnowledgeArticleConfiguration,salesforce_knowledge_article_configuration\nSalesforceMetadata,salesforce_metadata\nSalesforceSourceProperties,salesforce_source_properties\nSalesforceStandardKnowledgeArticleTypeConfiguration,salesforce_standard_knowledge_article_type_configuration\nSalesforceStandardObjectAttachmentConfiguration,salesforce_standard_object_attachment_configuration\nSalesforceStandardObjectConfiguration,salesforce_standard_object_configuration\nSalt,salt\nSameFileContentException,same_file_content_exception\nSamePathRequestException,same_path_request_exception\nSameSheetTargetVisualConfiguration,same_sheet_target_visual_configuration\nSamlAuthentication,saml_authentication\nSamlConfigCount,saml_config_count\nSamlConfigOptions,saml_config_options\nSamlConfiguration,saml_configuration\nSamlProperties,saml_properties\nSamlProviderARNs,saml_provider_arns\nSamlProviderArn,saml_provider_arn\nSample,sample\nSampleAdaptiveOffsetFilterMode,sample_adaptive_offset_filter_mode\nSampleChannelDataRequest,sample_channel_data_request\nSampleChannelDataResponse,sample_channel_data_response\nSampleCount,sample_count\nSampleDataS3SourceConfig,sample_data_s3_source_config\nSampleFraction,sample_fraction\nSamplePath,sample_path\nSamplePayloadUrl,sample_payload_url\nSampleQuery,sample_query\nSampleRange,sample_range\nSampleRangeConversion,sample_range_conversion\nSampleRate,sample_rate\nSampleRows,sample_rows\nSampleSize,sample_size\nSampleTime,sample_time\nSampleTimestamp,sample_timestamp\nSampleUtterance,sample_utterance\nSampleUtterances,sample_utterances\nSampleValue,sample_value\nSampleWeightAttributeName,sample_weight_attribute_name\nSampledCount,sampled_count\nSampledEndTime,sampled_end_time\nSampledHTTPRequest,sampled_http_request\nSampledRequests,sampled_requests\nSampledRequestsEnabled,sampled_requests_enabled\nSampledStartTime,sampled_start_time\nSampling,sampling\nSamplingDeviceCount,sampling_device_count\nSamplingInterval,sampling_interval\nSamplingPercentage,sampling_percentage\nSamplingRate,sampling_rate\nSamplingRule,sampling_rule\nSamplingRuleRecord,sampling_rule_record\nSamplingRuleRecords,sampling_rule_records\nSamplingRuleUpdate,sampling_rule_update\nSamplingStatisticSummaries,sampling_statistic_summaries\nSamplingStatisticSummary,sampling_statistic_summary\nSamplingStatisticsDocument,sampling_statistics_document\nSamplingStatisticsDocuments,sampling_statistics_documents\nSamplingStrategy,sampling_strategy\nSamplingTargetDocument,sampling_target_document\nSamplingTargetDocuments,sampling_target_documents\nSanRequireDirectoryGuid,san_require_directory_guid\nSanRequireDns,san_require_dns\nSanRequireDomainDns,san_require_domain_dns\nSanRequireEmail,san_require_email\nSanRequireSpn,san_require_spn\nSanRequireUpn,san_require_upn\nSanitizationWarning,sanitization_warning\nSankeyDiagramAggregatedFieldWells,sankey_diagram_aggregated_field_wells\nSankeyDiagramChartConfiguration,sankey_diagram_chart_configuration\nSankeyDiagramFieldWells,sankey_diagram_field_wells\nSankeyDiagramSortConfiguration,sankey_diagram_sort_configuration\nSankeyDiagramVisual,sankey_diagram_visual\nSapHostname,sap_hostname\nSapInstanceNumber,sap_instance_number\nSapKernelVersion,sap_kernel_version\nSasConfiguration,sas_configuration\nSasl,sasl\nSaslMechanism,sasl_mechanism\nSaslPassword,sasl_password\nSaslUsername,sasl_username\nSatelliteListItem,satellite_list_item\nSaturation,saturation\nSaturday,saturday\nSavings,savings\nSavingsCurrencyCode,savings_currency_code\nSavingsOpportunity,savings_opportunity\nSavingsPercentage,savings_percentage\nSavingsPlan,savings_plan\nSavingsPlanArn,savings_plan_arn\nSavingsPlanFilter,savings_plan_filter\nSavingsPlanOffering,savings_plan_offering\nSavingsPlanOfferingFilterElement,savings_plan_offering_filter_element\nSavingsPlanOfferingProperty,savings_plan_offering_property\nSavingsPlanOfferingRate,savings_plan_offering_rate\nSavingsPlanOfferingRateFilterElement,savings_plan_offering_rate_filter_element\nSavingsPlanOfferingRateProperty,savings_plan_offering_rate_property\nSavingsPlanRate,savings_plan_rate\nSavingsPlanRateFilter,savings_plan_rate_filter\nSavingsPlanRateProperty,savings_plan_rate_property\nSavingsPlansAmortizedCommitment,savings_plans_amortized_commitment\nSavingsPlansCoverage,savings_plans_coverage\nSavingsPlansCoverageData,savings_plans_coverage_data\nSavingsPlansCoverages,savings_plans_coverages\nSavingsPlansCoveredHoursInLookbackPeriod,savings_plans_covered_hours_in_lookback_period\nSavingsPlansDetails,savings_plans_details\nSavingsPlansPurchaseRecommendation,savings_plans_purchase_recommendation\nSavingsPlansPurchaseRecommendationDetail,savings_plans_purchase_recommendation_detail\nSavingsPlansPurchaseRecommendationDetails,savings_plans_purchase_recommendation_details\nSavingsPlansPurchaseRecommendationMetadata,savings_plans_purchase_recommendation_metadata\nSavingsPlansPurchaseRecommendationSummary,savings_plans_purchase_recommendation_summary\nSavingsPlansSavings,savings_plans_savings\nSavingsPlansType,savings_plans_type\nSavingsPlansUtilization,savings_plans_utilization\nSavingsPlansUtilizationAggregates,savings_plans_utilization_aggregates\nSavingsPlansUtilizationByTime,savings_plans_utilization_by_time\nSavingsPlansUtilizationDetail,savings_plans_utilization_detail\nSavingsPlansUtilizationDetails,savings_plans_utilization_details\nSavingsPlansUtilizationsByTime,savings_plans_utilizations_by_time\nScalaCode,scala_code\nScalableDimension,scalable_dimension\nScalableTarget,scalable_target\nScalableTargetARN,scalable_target_arn\nScalableTargetAction,scalable_target_action\nScalableTargets,scalable_targets\nScalarCrlRequest,scalar_crl_request\nScalarProfileRequest,scalar_profile_request\nScalarSubjectRequest,scalar_subject_request\nScalarTrustAnchorRequest,scalar_trust_anchor_request\nScalarType,scalar_type\nScalarValue,scalar_value\nScale,scale\nScaleDownBehavior,scale_down_behavior\nScaleDownModifications,scale_down_modifications\nScaleDownNodeTypes,scale_down_node_types\nScaleInCooldown,scale_in_cooldown\nScaleInPolicy,scale_in_policy\nScaleInPolicyDescription,scale_in_policy_description\nScaleInPolicyUpdate,scale_in_policy_update\nScaleInProtectedInstances,scale_in_protected_instances\nScaleOutCooldown,scale_out_cooldown\nScaleOutPolicy,scale_out_policy\nScaleOutPolicyDescription,scale_out_policy_description\nScaleOutPolicyUpdate,scale_out_policy_update\nScaleUpModifications,scale_up_modifications\nScaleUpNodeTypes,scale_up_node_types\nScalingAction,scaling_action\nScalingActivities,scaling_activities\nScalingActivity,scaling_activity\nScalingActivityInProgressFault,scaling_activity_in_progress_fault\nScalingAdjustment,scaling_adjustment\nScalingAdjustmentType,scaling_adjustment_type\nScalingBehavior,scaling_behavior\nScalingConfig,scaling_config\nScalingConfiguration,scaling_configuration\nScalingConfigurationInfo,scaling_configuration_info\nScalingConstraints,scaling_constraints\nScalingInstruction,scaling_instruction\nScalingInstructions,scaling_instructions\nScalingMode,scaling_mode\nScalingParameters,scaling_parameters\nScalingParametersStatus,scaling_parameters_status\nScalingPlan,scaling_plan\nScalingPlanName,scaling_plan_name\nScalingPlanNames,scaling_plan_names\nScalingPlanResource,scaling_plan_resource\nScalingPlanResources,scaling_plan_resources\nScalingPlanVersion,scaling_plan_version\nScalingPlans,scaling_plans\nScalingPolicies,scaling_policies\nScalingPolicy,scaling_policy\nScalingPolicyMetric,scaling_policy_metric\nScalingPolicyObjective,scaling_policy_objective\nScalingPolicyUpdate,scaling_policy_update\nScalingPolicyUpdateBehavior,scaling_policy_update_behavior\nScalingProcessQuery,scaling_process_query\nScalingProcesses,scaling_processes\nScalingRule,scaling_rule\nScalingStatusCode,scaling_status_code\nScalingStatusMessage,scaling_status_message\nScalingTrigger,scaling_trigger\nScalingType,scaling_type\nScan,scan\nScanAll,scan_all\nScanBy,scan_by\nScanCompletedAt,scan_completed_at\nScanCondition,scan_condition\nScanConditionPair,scan_condition_pair\nScanDetections,scan_detections\nScanDirection,scan_direction\nScanEc2InstanceWithFindings,scan_ec2_instance_with_findings\nScanEc2InstanceWithFindingsResult,scan_ec2_instance_with_findings_result\nScanEnabled,scan_enabled\nScanEndTime,scan_end_time\nScanFilePath,scan_file_path\nScanFilter,scan_filter\nScanId,scan_id\nScanIndexForward,scan_index_forward\nScanInput,scan_input\nScanMode,scan_mode\nScanNameWithFindingNum,scan_name_with_finding_num\nScanNotFoundException,scan_not_found_exception\nScanOnPush,scan_on_push\nScanOutput,scan_output\nScanProvisionedProductsInput,scan_provisioned_products_input\nScanProvisionedProductsOutput,scan_provisioned_products_output\nScanRange,scan_range\nScanResourceCriteria,scan_resource_criteria\nScanResult,scan_result\nScanResultDetails,scan_result_details\nScanStartTime,scan_start_time\nScanStartedAt,scan_started_at\nScanStatus,scan_status\nScanSummary,scan_summary\nScanThreatName,scan_threat_name\nScanType,scan_type\nScanTypeConversionMode,scan_type_conversion_mode\nScannedCount,scanned_count\nScannedItemCount,scanned_item_count\nScannedVolumeDetails,scanned_volume_details\nScanningRepositoryFilter,scanning_repository_filter\nScans,scans\nScatterPlotCategoricallyAggregatedFieldWells,scatter_plot_categorically_aggregated_field_wells\nScatterPlotConfiguration,scatter_plot_configuration\nScatterPlotFieldWells,scatter_plot_field_wells\nScatterPlotUnaggregatedFieldWells,scatter_plot_unaggregated_field_wells\nScatterPlotVisual,scatter_plot_visual\nSccDestinationSettings,scc_destination_settings\nSccXml,scc_xml\nScenario,scenario\nSceneChangeDetect,scene_change_detect\nSceneError,scene_error\nSceneSummary,scene_summary\nSchedule,schedule\nScheduleAction,schedule_action\nScheduleActionSettings,schedule_action_settings\nScheduleActionStartSettings,schedule_action_start_settings\nScheduleActions,schedule_actions\nScheduleActivityTaskDecisionAttributes,schedule_activity_task_decision_attributes\nScheduleActivityTaskFailedEventAttributes,schedule_activity_task_failed_event_attributes\nScheduleAdBreak,schedule_ad_break\nScheduleAdBreaks,schedule_ad_breaks\nScheduleArn,schedule_arn\nScheduleAssociationState,schedule_association_state\nScheduleAt,schedule_at\nScheduleConfig,schedule_config\nScheduleConfiguration,schedule_configuration\nScheduleDefinitionTypeUnsupportedFault,schedule_definition_type_unsupported_fault\nScheduleDefinitions,schedule_definitions\nScheduleDescription,schedule_description\nScheduleEndTime,schedule_end_time\nScheduleEntry,schedule_entry\nScheduleEntryType,schedule_entry_type\nScheduleExpression,schedule_expression\nScheduleExpressionTimezone,schedule_expression_timezone\nScheduleFrequency,schedule_frequency\nScheduleGroupArn,schedule_group_arn\nScheduleGroupSummary,schedule_group_summary\nScheduleGroups,schedule_groups\nScheduleId,schedule_id\nScheduleIdentifier,schedule_identifier\nScheduleKeyDeletionRequest,schedule_key_deletion_request\nScheduleKeyDeletionResponse,schedule_key_deletion_response\nScheduleLambdaFunctionDecisionAttributes,schedule_lambda_function_decision_attributes\nScheduleLambdaFunctionFailedEventAttributes,schedule_lambda_function_failed_event_attributes\nScheduleName,schedule_name\nScheduleOffset,schedule_offset\nScheduleRefreshOnEntity,schedule_refresh_on_entity\nScheduleRunConfiguration,schedule_run_configuration\nScheduleRunRequest,schedule_run_request\nScheduleRunResult,schedule_run_result\nScheduleRunTest,schedule_run_test\nScheduleStartTime,schedule_start_time\nScheduleSummary,schedule_summary\nScheduleTimezone,schedule_timezone\nScheduled,scheduled\nScheduledAction,scheduled_action\nScheduledActionARN,scheduled_action_arn\nScheduledActionAlreadyExistsFault,scheduled_action_already_exists_fault\nScheduledActionBufferTime,scheduled_action_buffer_time\nScheduledActionDescription,scheduled_action_description\nScheduledActionFilter,scheduled_action_filter\nScheduledActionName,scheduled_action_name\nScheduledActionNames,scheduled_action_names\nScheduledActionNotFoundFault,scheduled_action_not_found_fault\nScheduledActionQuotaExceededFault,scheduled_action_quota_exceeded_fault\nScheduledActionType,scheduled_action_type\nScheduledActionTypeUnsupportedFault,scheduled_action_type_unsupported_fault\nScheduledActions,scheduled_actions\nScheduledActionsMessage,scheduled_actions_message\nScheduledActionsType,scheduled_actions_type\nScheduledAuditMetadata,scheduled_audit_metadata\nScheduledAutoTuneDetails,scheduled_auto_tune_details\nScheduledBy,scheduled_by\nScheduledEndTime,scheduled_end_time\nScheduledInstance,scheduled_instance\nScheduledInstanceAvailability,scheduled_instance_availability\nScheduledInstanceAvailabilitySet,scheduled_instance_availability_set\nScheduledInstanceId,scheduled_instance_id\nScheduledInstanceIds,scheduled_instance_ids\nScheduledInstanceRecurrence,scheduled_instance_recurrence\nScheduledInstanceRecurrenceRequest,scheduled_instance_recurrence_request\nScheduledInstanceSet,scheduled_instance_set\nScheduledInstancesBlockDeviceMapping,scheduled_instances_block_device_mapping\nScheduledInstancesEbs,scheduled_instances_ebs\nScheduledInstancesIamInstanceProfile,scheduled_instances_iam_instance_profile\nScheduledInstancesIpv6Address,scheduled_instances_ipv6_address\nScheduledInstancesLaunchSpecification,scheduled_instances_launch_specification\nScheduledInstancesMonitoring,scheduled_instances_monitoring\nScheduledInstancesNetworkInterface,scheduled_instances_network_interface\nScheduledInstancesPlacement,scheduled_instances_placement\nScheduledInstancesPrivateIpAddressConfig,scheduled_instances_private_ip_address_config\nScheduledJobRollout,scheduled_job_rollout\nScheduledQueries,scheduled_queries\nScheduledQuery,scheduled_query\nScheduledQueryArn,scheduled_query_arn\nScheduledQueryDescription,scheduled_query_description\nScheduledQueryExecutionRoleArn,scheduled_query_execution_role_arn\nScheduledQueryRunSummary,scheduled_query_run_summary\nScheduledScalingSuspended,scheduled_scaling_suspended\nScheduledSplit,scheduled_split\nScheduledSplitConfig,scheduled_split_config\nScheduledSplitsLaunchConfig,scheduled_splits_launch_config\nScheduledSplitsLaunchDefinition,scheduled_splits_launch_definition\nScheduledStart,scheduled_start\nScheduledStartTime,scheduled_start_time\nScheduledStartTimeMillis,scheduled_start_time_millis\nScheduledTime,scheduled_time\nScheduledTimeAfter,scheduled_time_after\nScheduledTimeBefore,scheduled_time_before\nScheduledTimestamp,scheduled_timestamp\nScheduledTriggerProperties,scheduled_trigger_properties\nScheduledUpdateGroupAction,scheduled_update_group_action\nScheduledUpdateGroupActionRequest,scheduled_update_group_action_request\nScheduledUpdateGroupActions,scheduled_update_group_actions\nScheduledWindowExecution,scheduled_window_execution\nScheduledWindowExecutions,scheduled_window_executions\nSchedulerLogs,scheduler_logs\nSchedulerNotRunningException,scheduler_not_running_exception\nSchedulerRunningException,scheduler_running_exception\nSchedulerTransitioningException,scheduler_transitioning_exception\nSchedulers,schedulers\nSchedules,schedules\nSchedulingBufferTime,scheduling_buffer_time\nSchedulingConfig,scheduling_config\nSchedulingPolicyDetail,scheduling_policy_detail\nSchedulingPolicyListingDetail,scheduling_policy_listing_detail\nSchedulingStrategy,scheduling_strategy\nSchema,schema\nSchemaAlreadyExistsException,schema_already_exists_exception\nSchemaAlreadyPublishedException,schema_already_published_exception\nSchemaArn,schema_arn\nSchemaArns,schema_arns\nSchemaAttribute,schema_attribute\nSchemaAttributeType,schema_attribute_type\nSchemaAttributes,schema_attributes\nSchemaChangePolicy,schema_change_policy\nSchemaCheckpoint,schema_checkpoint\nSchemaColumn,schema_column\nSchemaConfiguration,schema_configuration\nSchemaConversionApplicationAttributes,schema_conversion_application_attributes\nSchemaConversionRequest,schema_conversion_request\nSchemaDefinition,schema_definition\nSchemaDeleteOption,schema_delete_option\nSchemaDiffType,schema_diff_type\nSchemaError,schema_error\nSchemaExtensionId,schema_extension_id\nSchemaExtensionInfo,schema_extension_info\nSchemaExtensionStatus,schema_extension_status\nSchemaExtensionStatusReason,schema_extension_status_reason\nSchemaExtensionsInfo,schema_extensions_info\nSchemaFacet,schema_facet\nSchemaFacets,schema_facets\nSchemaHandlerPackage,schema_handler_package\nSchemaId,schema_id\nSchemaInputAttribute,schema_input_attribute\nSchemaListItem,schema_list_item\nSchemaMappingSummary,schema_mapping_summary\nSchemaName,schema_name\nSchemaNamePrefix,schema_name_prefix\nSchemaPattern,schema_pattern\nSchemaReference,schema_reference\nSchemaResponse,schema_response\nSchemaS3Location,schema_s3_location\nSchemaShortInfoResponse,schema_short_info_response\nSchemaStatus,schema_status\nSchemaSummary,schema_summary\nSchemaUnion,schema_union\nSchemaVersion,schema_version\nSchemaVersionErrorItem,schema_version_error_item\nSchemaVersionErrors,schema_version_errors\nSchemaVersionId,schema_version_id\nSchemaVersionListItem,schema_version_list_item\nSchemaVersionNumber,schema_version_number\nSchemaVersionStatus,schema_version_status\nSchemaVersionSummary,schema_version_summary\nSchemaVersions,schema_versions\nSchemas,schemas\nScheme,scheme\nScope,scope\nScopeConfiguration,scope_configuration\nScopeCount,scope_count\nScopeDescription,scope_description\nScopeDoesNotExistException,scope_does_not_exist_exception\nScopeDownStatement,scope_down_statement\nScopeName,scope_name\nScopes,scopes\nScoping,scoping\nScore,score\nScoreAttributes,score_attributes\nScoreConfidence,score_confidence\nScoreDetails,score_details\nScoreThreshold,score_threshold\nScoreThresholdLastUpdatedAt,score_threshold_last_updated_at\nScores,scores\nScoringStrategy,scoring_strategy\nScpActionDefinition,scp_action_definition\nScram,scram\nScreenCanvasSizeOptions,screen_canvas_size_options\nScreenDataUrl,screen_data_url\nScreenSharingUrl,screen_sharing_url\nScreenViewingUrl,screen_viewing_url\nScreenshotName,screenshot_name\nScript,script\nScriptArn,script_arn\nScriptBatchJobDefinition,script_batch_job_definition\nScriptBatchJobIdentifier,script_batch_job_identifier\nScriptBootstrapAction,script_bootstrap_action\nScriptBootstrapActionConfig,script_bootstrap_action_config\nScriptDetails,script_details\nScriptId,script_id\nScriptLocation,script_location\nScriptModeConfig,script_mode_config\nScriptParameterKeyValue,script_parameter_key_value\nScriptPath,script_path\nScriptS3Location,script_s3_location\nScripts,scripts\nScrollBarOptions,scroll_bar_options\nScrollStatus,scroll_status\nScrollbarOptions,scrollbar_options\nScte,scte\nScte20Detection,scte20_detection\nScte20PlusEmbeddedDestinationSettings,scte20_plus_embedded_destination_settings\nScte20SourceSettings,scte20_source_settings\nScte27DestinationSettings,scte27_destination_settings\nScte27Pids,scte27_pids\nScte27SourceSettings,scte27_source_settings\nScte35Behavior,scte35_behavior\nScte35Control,scte35_control\nScte35DeliveryRestrictions,scte35_delivery_restrictions\nScte35Descriptor,scte35_descriptor\nScte35DescriptorSettings,scte35_descriptor_settings\nScte35Descriptors,scte35_descriptors\nScte35Esam,scte35_esam\nScte35EsamPid,scte35_esam_pid\nScte35InputScheduleActionSettings,scte35_input_schedule_action_settings\nScte35InputSettings,scte35_input_settings\nScte35Pid,scte35_pid\nScte35PrerollPullupMilliseconds,scte35_preroll_pullup_milliseconds\nScte35ReturnToNetworkScheduleActionSettings,scte35_return_to_network_schedule_action_settings\nScte35ReturnToNetworkSettings,scte35_return_to_network_settings\nScte35SegmentationDescriptor,scte35_segmentation_descriptor\nScte35Source,scte35_source\nScte35SpliceInsert,scte35_splice_insert\nScte35SpliceInsertScheduleActionSettings,scte35_splice_insert_schedule_action_settings\nScte35SpliceInsertSettings,scte35_splice_insert_settings\nScte35TimeSignalApos,scte35_time_signal_apos\nScte35TimeSignalScheduleActionSettings,scte35_time_signal_schedule_action_settings\nScte35TimeSignalSettings,scte35_time_signal_settings\nScteFilter,scte_filter\nScteHls,scte_hls\nScteMarkersSource,scte_markers_source\nSdkConfigurationProperty,sdk_configuration_property\nSdkName,sdk_name\nSdkResponse,sdk_response\nSdkType,sdk_type\nSdkTypes,sdk_types\nSdrReferenceWhiteLevel,sdr_reference_white_level\nSdtInterval,sdt_interval\nSearch,search\nSearchAddressBooksRequest,search_address_books_request\nSearchAddressBooksResponse,search_address_books_response\nSearchAnalysesRequest,search_analyses_request\nSearchAnalysesResponse,search_analyses_response\nSearchAssociatedTranscriptsRequest,search_associated_transcripts_request\nSearchAssociatedTranscriptsResponse,search_associated_transcripts_response\nSearchAvailablePhoneNumbersRequest,search_available_phone_numbers_request\nSearchAvailablePhoneNumbersResponse,search_available_phone_numbers_response\nSearchCasesRequest,search_cases_request\nSearchCasesResponse,search_cases_response\nSearchCasesResponseItem,search_cases_response_item\nSearchChannelsRequest,search_channels_request\nSearchChannelsResponse,search_channels_response\nSearchCollectionTypes,search_collection_types\nSearchContactsRequest,search_contacts_request\nSearchContactsResponse,search_contacts_response\nSearchContentRequest,search_content_request\nSearchContentResponse,search_content_response\nSearchCriteria,search_criteria\nSearchDashboardsRequest,search_dashboards_request\nSearchDashboardsResponse,search_dashboards_response\nSearchDataSetsRequest,search_data_sets_request\nSearchDataSetsResponse,search_data_sets_response\nSearchDataSourcesRequest,search_data_sources_request\nSearchDataSourcesResponse,search_data_sources_response\nSearchDatabasesByLFTagsRequest,search_databases_by_lf_tags_request\nSearchDatabasesByLFTagsResponse,search_databases_by_lf_tags_response\nSearchDevicesFilter,search_devices_filter\nSearchDevicesRequest,search_devices_request\nSearchDevicesResponse,search_devices_response\nSearchEnabled,search_enabled\nSearchEntitiesRequest,search_entities_request\nSearchEntitiesResponse,search_entities_response\nSearchException,search_exception\nSearchExpression,search_expression\nSearchFacesByImageRequest,search_faces_by_image_request\nSearchFacesByImageResponse,search_faces_by_image_response\nSearchFacesRequest,search_faces_request\nSearchFacesResponse,search_faces_response\nSearchField,search_field\nSearchFilter,search_filter\nSearchFlowExecutionsRequest,search_flow_executions_request\nSearchFlowExecutionsResponse,search_flow_executions_response\nSearchFlowTemplatesRequest,search_flow_templates_request\nSearchFlowTemplatesResponse,search_flow_templates_response\nSearchFoldersRequest,search_folders_request\nSearchFoldersResponse,search_folders_response\nSearchForPositionResult,search_for_position_result\nSearchForSuggestionsResult,search_for_suggestions_result\nSearchForTextResult,search_for_text_result\nSearchGameSessionsInput,search_game_sessions_input\nSearchGameSessionsOutput,search_game_sessions_output\nSearchGroupsRequest,search_groups_request\nSearchGroupsResponse,search_groups_response\nSearchHoursOfOperationsRequest,search_hours_of_operations_request\nSearchHoursOfOperationsResponse,search_hours_of_operations_response\nSearchImageSetsRequest,search_image_sets_request\nSearchImageSetsResponse,search_image_sets_response\nSearchIndexRequest,search_index_request\nSearchIndexResponse,search_index_response\nSearchInput,search_input\nSearchInsightsFilters,search_insights_filters\nSearchInsightsRequest,search_insights_request\nSearchInsightsResponse,search_insights_response\nSearchInstanceCount,search_instance_count\nSearchInstanceType,search_instance_type\nSearchJobsFilter,search_jobs_filter\nSearchJobsRequest,search_jobs_request\nSearchJobsResponse,search_jobs_response\nSearchKey,search_key\nSearchLocalGatewayRoutesRequest,search_local_gateway_routes_request\nSearchLocalGatewayRoutesResult,search_local_gateway_routes_result\nSearchNetworkProfilesRequest,search_network_profiles_request\nSearchNetworkProfilesResponse,search_network_profiles_response\nSearchOptions,search_options\nSearchOrganizationInsightsFilters,search_organization_insights_filters\nSearchOrganizationInsightsRequest,search_organization_insights_request\nSearchOrganizationInsightsResponse,search_organization_insights_response\nSearchOutput,search_output\nSearchPartitionCount,search_partition_count\nSearchPlaceIndexForPositionRequest,search_place_index_for_position_request\nSearchPlaceIndexForPositionResponse,search_place_index_for_position_response\nSearchPlaceIndexForPositionSummary,search_place_index_for_position_summary\nSearchPlaceIndexForSuggestionsRequest,search_place_index_for_suggestions_request\nSearchPlaceIndexForSuggestionsResponse,search_place_index_for_suggestions_response\nSearchPlaceIndexForSuggestionsSummary,search_place_index_for_suggestions_summary\nSearchPlaceIndexForTextRequest,search_place_index_for_text_request\nSearchPlaceIndexForTextResponse,search_place_index_for_text_response\nSearchPlaceIndexForTextSummary,search_place_index_for_text_summary\nSearchPrincipalType,search_principal_type\nSearchProductsAsAdminInput,search_products_as_admin_input\nSearchProductsAsAdminOutput,search_products_as_admin_output\nSearchProductsInput,search_products_input\nSearchProductsOutput,search_products_output\nSearchProfilesRequest,search_profiles_request\nSearchProfilesResponse,search_profiles_response\nSearchPromptsRequest,search_prompts_request\nSearchPromptsResponse,search_prompts_response\nSearchProvisionedProductsInput,search_provisioned_products_input\nSearchProvisionedProductsOutput,search_provisioned_products_output\nSearchQuantumTasksFilter,search_quantum_tasks_filter\nSearchQuantumTasksRequest,search_quantum_tasks_request\nSearchQuantumTasksResponse,search_quantum_tasks_response\nSearchQuery,search_query\nSearchQueuesRequest,search_queues_request\nSearchQueuesResponse,search_queues_response\nSearchQuickConnectsRequest,search_quick_connects_request\nSearchQuickConnectsResponse,search_quick_connects_response\nSearchRasterDataCollectionInput,search_raster_data_collection_input\nSearchRasterDataCollectionOutput,search_raster_data_collection_output\nSearchRecord,search_record\nSearchRelatedItemsRequest,search_related_items_request\nSearchRelatedItemsResponse,search_related_items_response\nSearchRelatedItemsResponseItem,search_related_items_response_item\nSearchRequest,search_request\nSearchResourceTagsRequest,search_resource_tags_request\nSearchResourceTagsResponse,search_resource_tags_response\nSearchResourcesBucketCriteria,search_resources_bucket_criteria\nSearchResourcesCriteria,search_resources_criteria\nSearchResourcesCriteriaBlock,search_resources_criteria_block\nSearchResourcesInput,search_resources_input\nSearchResourcesOutput,search_resources_output\nSearchResourcesRequest,search_resources_request\nSearchResourcesResponse,search_resources_response\nSearchResourcesSimpleCriterion,search_resources_simple_criterion\nSearchResourcesSortCriteria,search_resources_sort_criteria\nSearchResourcesTagCriterion,search_resources_tag_criterion\nSearchResourcesTagCriterionPair,search_resources_tag_criterion_pair\nSearchResponse,search_response\nSearchRoomsRequest,search_rooms_request\nSearchRoomsResponse,search_rooms_response\nSearchRoutingProfilesRequest,search_routing_profiles_request\nSearchRoutingProfilesResponse,search_routing_profiles_response\nSearchSchemaSummary,search_schema_summary\nSearchSchemaVersionSummary,search_schema_version_summary\nSearchSchemasRequest,search_schemas_request\nSearchSchemasResponse,search_schemas_response\nSearchSecurityProfilesRequest,search_security_profiles_request\nSearchSecurityProfilesResponse,search_security_profiles_response\nSearchService,search_service\nSearchSessionsRequest,search_sessions_request\nSearchSessionsResponse,search_sessions_response\nSearchSkillGroupsRequest,search_skill_groups_request\nSearchSkillGroupsResponse,search_skill_groups_response\nSearchSlowLogs,search_slow_logs\nSearchSortResult,search_sort_result\nSearchStatus,search_status\nSearchString,search_string\nSearchSystemInstancesRequest,search_system_instances_request\nSearchSystemInstancesResponse,search_system_instances_response\nSearchSystemTemplatesRequest,search_system_templates_request\nSearchSystemTemplatesResponse,search_system_templates_response\nSearchTablesByLFTagsRequest,search_tables_by_lf_tags_request\nSearchTablesByLFTagsResponse,search_tables_by_lf_tags_response\nSearchTablesRequest,search_tables_request\nSearchTablesResponse,search_tables_response\nSearchText,search_text\nSearchThingsRequest,search_things_request\nSearchThingsResponse,search_things_response\nSearchTransitGatewayMulticastGroupsRequest,search_transit_gateway_multicast_groups_request\nSearchTransitGatewayMulticastGroupsResult,search_transit_gateway_multicast_groups_result\nSearchTransitGatewayRoutesRequest,search_transit_gateway_routes_request\nSearchTransitGatewayRoutesResult,search_transit_gateway_routes_result\nSearchUsersByImageRequest,search_users_by_image_request\nSearchUsersByImageResponse,search_users_by_image_response\nSearchUsersRequest,search_users_request\nSearchUsersResponse,search_users_response\nSearchValue,search_value\nSearchVocabulariesRequest,search_vocabularies_request\nSearchVocabulariesResponse,search_vocabularies_response\nSearchVulnerabilitiesFilterCriteria,search_vulnerabilities_filter_criteria\nSearchVulnerabilitiesRequest,search_vulnerabilities_request\nSearchVulnerabilitiesResponse,search_vulnerabilities_response\nSearchable,searchable\nSearchedFace,searched_face\nSearchedFaceBoundingBox,searched_face_bounding_box\nSearchedFaceConfidence,searched_face_confidence\nSearchedFaceDetails,searched_face_details\nSearchedFaceId,searched_face_id\nSearchedLogStream,searched_log_stream\nSearchedUser,searched_user\nSeasonality,seasonality\nSecondBlockToken,second_block_token\nSecondSchemaVersionNumber,second_schema_version_number\nSecondSnapshotId,second_snapshot_id\nSecondary,secondary\nSecondaryAllocationIds,secondary_allocation_ids\nSecondaryArtifacts,secondary_artifacts\nSecondaryAvailabilityZone,secondary_availability_zone\nSecondaryBackground,secondary_background\nSecondaryBtn,secondary_btn\nSecondaryEmail,secondary_email\nSecondaryForeground,secondary_foreground\nSecondaryGids,secondary_gids\nSecondaryInputId,secondary_input_id\nSecondaryPrivateIpAddressCount,secondary_private_ip_address_count\nSecondaryPrivateIpAddresses,secondary_private_ip_addresses\nSecondaryStatus,secondary_status\nSecondaryStatusTransition,secondary_status_transition\nSecondaryStatusTransitions,secondary_status_transitions\nSecondaryValue,secondary_value\nSecondaryValueFontConfiguration,secondary_value_font_configuration\nSecondaryValueOptions,secondary_value_options\nSecondaryYAxisDisplayOptions,secondary_y_axis_display_options\nSecondaryYAxisLabelOptions,secondary_y_axis_label_options\nSecondsBeforeTimeout,seconds_before_timeout\nSecondsUntilAutoPause,seconds_until_auto_pause\nSecret,secret\nSecretAccessKey,secret_access_key\nSecretArn,secret_arn\nSecretArnList,secret_arn_list\nSecretBinary,secret_binary\nSecretCode,secret_code\nSecretHash,secret_hash\nSecretId,secret_id\nSecretKey,secret_key\nSecretList,secret_list\nSecretListEntry,secret_list_entry\nSecretManagerArn,secret_manager_arn\nSecretOptions,secret_options\nSecretStatus,secret_status\nSecretString,secret_string\nSecretStringKey,secret_string_key\nSecretToAuthenticateInitiator,secret_to_authenticate_initiator\nSecretToAuthenticateTarget,secret_to_authenticate_target\nSecretToken,secret_token\nSecretVersionsListEntry,secret_versions_list_entry\nSecretVersionsToStages,secret_versions_to_stages\nSecrets,secrets\nSecretsManagerAccessRoleArn,secrets_manager_access_role_arn\nSecretsManagerAccessTokenConfiguration,secrets_manager_access_token_configuration\nSecretsManagerArn,secrets_manager_arn\nSecretsManagerOracleAsmAccessRoleArn,secrets_manager_oracle_asm_access_role_arn\nSecretsManagerOracleAsmSecretId,secrets_manager_oracle_asm_secret_id\nSecretsManagerSecretConfiguration,secrets_manager_secret_configuration\nSecretsManagerSecretId,secrets_manager_secret_id\nSecretsManagerSecretResourceData,secrets_manager_secret_resource_data\nSecretsManagerSecurityDbEncryptionAccessRoleArn,secrets_manager_security_db_encryption_access_role_arn\nSecretsManagerSecurityDbEncryptionSecretId,secrets_manager_security_db_encryption_secret_id\nSecretsRoleArn,secrets_role_arn\nSection,section\nSectionAfterPageBreak,section_after_page_break\nSectionBased,section_based\nSectionBasedLayout,section_based_layout\nSectionBasedLayoutCanvasSizeOptions,section_based_layout_canvas_size_options\nSectionBasedLayoutConfiguration,section_based_layout_configuration\nSectionBasedLayoutPaperCanvasSizeOptions,section_based_layout_paper_canvas_size_options\nSectionId,section_id\nSectionLayoutConfiguration,section_layout_configuration\nSectionModification,section_modification\nSectionPageBreakConfiguration,section_page_break_configuration\nSectionStyle,section_style\nSectionalElement,sectional_element\nSections,sections\nSecure,secure\nSecurityConfig,security_config\nSecurityConfigDetail,security_config_detail\nSecurityConfigStats,security_config_stats\nSecurityConfigSummary,security_config_summary\nSecurityConfiguration,security_configuration\nSecurityConfigurationSummary,security_configuration_summary\nSecurityConfigurations,security_configurations\nSecurityContext,security_context\nSecurityControl,security_control\nSecurityControlArn,security_control_arn\nSecurityControlDefinition,security_control_definition\nSecurityControlDefinitions,security_control_definitions\nSecurityControlId,security_control_id\nSecurityControlIds,security_control_ids\nSecurityControlStatus,security_control_status\nSecurityControls,security_controls\nSecurityDbEncryption,security_db_encryption\nSecurityDbEncryptionName,security_db_encryption_name\nSecurityDescriptorCopyFlags,security_descriptor_copy_flags\nSecurityDetails,security_details\nSecurityGroup,security_group\nSecurityGroupArns,security_group_arns\nSecurityGroupId,security_group_id\nSecurityGroupIdForDomainBoundary,security_group_id_for_domain_boundary\nSecurityGroupIdList,security_group_id_list\nSecurityGroupIdSet,security_group_id_set\nSecurityGroupIdUpdates,security_group_id_updates\nSecurityGroupIdentifier,security_group_identifier\nSecurityGroupIds,security_group_ids\nSecurityGroupLimitExceeded,security_group_limit_exceeded\nSecurityGroupMembership,security_group_membership\nSecurityGroupNotFound,security_group_not_found\nSecurityGroupReference,security_group_reference\nSecurityGroupReferenceSet,security_group_reference_set\nSecurityGroupRemediationAction,security_group_remediation_action\nSecurityGroupRule,security_group_rule\nSecurityGroupRuleDescription,security_group_rule_description\nSecurityGroupRuleDescriptions,security_group_rule_descriptions\nSecurityGroupRuleId,security_group_rule_id\nSecurityGroupRuleIds,security_group_rule_ids\nSecurityGroupRuleRequest,security_group_rule_request\nSecurityGroupRuleUpdate,security_group_rule_update\nSecurityGroupRules,security_group_rules\nSecurityGroupSet,security_group_set\nSecurityGroups,security_groups\nSecurityHeadersConfig,security_headers_config\nSecurityHubConfiguration,security_hub_configuration\nSecurityKey,security_key\nSecurityKeys,security_keys\nSecurityNonCompliantCount,security_non_compliant_count\nSecurityPolicy,security_policy\nSecurityPolicyDetail,security_policy_detail\nSecurityPolicyName,security_policy_name\nSecurityPolicyNames,security_policy_names\nSecurityPolicyStats,security_policy_stats\nSecurityPolicySummary,security_policy_summary\nSecurityProfile,security_profile\nSecurityProfileArn,security_profile_arn\nSecurityProfileId,security_profile_id\nSecurityProfileIdentifier,security_profile_identifier\nSecurityProfileIds,security_profile_ids\nSecurityProfileName,security_profile_name\nSecurityProfileSearchCriteria,security_profile_search_criteria\nSecurityProfileSearchSummary,security_profile_search_summary\nSecurityProfileSummary,security_profile_summary\nSecurityProfileSummaryList,security_profile_summary_list\nSecurityProfileTarget,security_profile_target\nSecurityProfileTargetMapping,security_profile_target_mapping\nSecurityProfiles,security_profiles\nSecurityProfilesSearchFilter,security_profiles_search_filter\nSecurityProtocol,security_protocol\nSecurityServicePolicyData,security_service_policy_data\nSecurityServiceType,security_service_type\nSecurityStyle,security_style\nSecurityToken,security_token\nSecurityType,security_type\nSeed,seed\nSeedUrlConfiguration,seed_url_configuration\nSeedUrls,seed_urls\nSegment,segment\nSegmentBehaviors,segment_behaviors\nSegmentCondition,segment_condition\nSegmentControl,segment_control\nSegmentDeliveryConfiguration,segment_delivery_configuration\nSegmentDeliveryConfigurations,segment_delivery_configurations\nSegmentDemographics,segment_demographics\nSegmentDetection,segment_detection\nSegmentDimensions,segment_dimensions\nSegmentDuration,segment_duration\nSegmentDurationSeconds,segment_duration_seconds\nSegmentGroup,segment_group\nSegmentGroupList,segment_group_list\nSegmentGroups,segment_groups\nSegmentId,segment_id\nSegmentImportResource,segment_import_resource\nSegmentLength,segment_length\nSegmentLengthControl,segment_length_control\nSegmentLocation,segment_location\nSegmentModifier,segment_modifier\nSegmentName,segment_name\nSegmentNum,segment_num\nSegmentNumber,segment_number\nSegmentOverride,segment_override\nSegmentPrefix,segment_prefix\nSegmentReference,segment_reference\nSegmentResponse,segment_response\nSegmentStartCondition,segment_start_condition\nSegmentTemplateFormat,segment_template_format\nSegmentType,segment_type\nSegmentTypeInfo,segment_type_info\nSegmentTypes,segment_types\nSegmentVersion,segment_version\nSegmentationCancelIndicator,segmentation_cancel_indicator\nSegmentationDescriptor,segmentation_descriptor\nSegmentationDescriptorScte35DescriptorSettings,segmentation_descriptor_scte35_descriptor_settings\nSegmentationDescriptors,segmentation_descriptors\nSegmentationDuration,segmentation_duration\nSegmentationEventId,segmentation_event_id\nSegmentationMarkers,segmentation_markers\nSegmentationMode,segmentation_mode\nSegmentationStyle,segmentation_style\nSegmentationTime,segmentation_time\nSegmentationTypeId,segmentation_type_id\nSegmentationUpid,segmentation_upid\nSegmentationUpidType,segmentation_upid_type\nSegments,segments\nSegmentsExpected,segments_expected\nSegmentsPerSubdirectory,segments_per_subdirectory\nSegmentsReceivedCount,segments_received_count\nSegmentsRejectedCount,segments_rejected_count\nSegmentsResponse,segments_response\nSegmentsSentCount,segments_sent_count\nSegmentsSpilloverCount,segments_spillover_count\nSelect,select\nSelectAggregateResourceConfigRequest,select_aggregate_resource_config_request\nSelectAggregateResourceConfigResponse,select_aggregate_resource_config_response\nSelectAllOptions,select_all_options\nSelectAllValueOptions,select_all_value_options\nSelectAttributesActivity,select_attributes_activity\nSelectColumn,select_column\nSelectFields,select_fields\nSelectFromCollection,select_from_collection\nSelectObjectContentOutput,select_object_content_output\nSelectObjectContentRequest,select_object_content_request\nSelectParameters,select_parameters\nSelectResourceConfigRequest,select_resource_config_request\nSelectResourceConfigResponse,select_resource_config_response\nSelectSqlQuery,select_sql_query\nSelectableValues,selectable_values\nSelectedBinType,selected_bin_type\nSelectedBorderStyle,selected_border_style\nSelectedChoiceIds,selected_choice_ids\nSelectedChoices,selected_choices\nSelectedColumns,selected_columns\nSelectedEngineVersion,selected_engine_version\nSelectedFieldOptions,selected_field_options\nSelectedFields,selected_fields\nSelectedFieldsConfiguration,selected_fields_configuration\nSelectedOutputs,selected_outputs\nSelectedPointStyle,selected_point_style\nSelectedSegmentTypes,selected_segment_types\nSelectedSheets,selected_sheets\nSelectedSheetsFilterScopeConfiguration,selected_sheets_filter_scope_configuration\nSelectedStep,selected_step\nSelectedSteps,selected_steps\nSelectedTooltipType,selected_tooltip_type\nSelectedVideoStreams,selected_video_streams\nSelectionCriteria,selection_criteria\nSelectionId,selection_id\nSelectionName,selection_name\nSelectionRules,selection_rules\nSelectionScope,selection_scope\nSelectionStatus,selection_status\nSelectiveAuth,selective_auth\nSelectiveExecutionConfig,selective_execution_config\nSelectiveExecutionResult,selective_execution_result\nSelector,selector\nSelectorSettings,selector_settings\nSelectorType,selector_type\nSelectors,selectors\nSelfManageResources,self_manage_resources\nSelfManagedActiveDirectoryAttributes,self_managed_active_directory_attributes\nSelfManagedActiveDirectoryConfiguration,self_managed_active_directory_configuration\nSelfManagedActiveDirectoryConfigurationUpdates,self_managed_active_directory_configuration_updates\nSelfManagedEventSource,self_managed_event_source\nSelfManagedKafkaAccessConfigurationVpc,self_managed_kafka_access_configuration_vpc\nSelfManagedKafkaEventSourceConfig,self_managed_kafka_event_source_config\nSelfManagedKafkaParameters,self_managed_kafka_parameters\nSelfManagedOptOutsEnabled,self_managed_opt_outs_enabled\nSelfServicePortal,self_service_portal\nSelfServicePortalUrl,self_service_portal_url\nSelfServiceSAMLProviderArn,self_service_saml_provider_arn\nSelfServiceSamlProviderArn,self_service_saml_provider_arn\nSelfUserProfile,self_user_profile\nSelfservicePermissions,selfservice_permissions\nSellerName,seller_name\nSemanticEntityType,semantic_entity_type\nSemanticType,semantic_type\nSemanticVersion,semantic_version\nSemtechGnss,semtech_gnss\nSemtechGnssConfiguration,semtech_gnss_configuration\nSemtechGnssDetail,semtech_gnss_detail\nSendActivationCodeRequest,send_activation_code_request\nSendAlexaOfferToMasterRequest,send_alexa_offer_to_master_request\nSendAlexaOfferToMasterResponse,send_alexa_offer_to_master_response\nSendAnnouncementRequest,send_announcement_request\nSendAnnouncementResponse,send_announcement_response\nSendApiAssetRequest,send_api_asset_request\nSendApiAssetResponse,send_api_asset_response\nSendAutomationSignalRequest,send_automation_signal_request\nSendBonusRequest,send_bonus_request\nSendBounceRequest,send_bounce_request\nSendBounceResponse,send_bounce_response\nSendBulkEmailRequest,send_bulk_email_request\nSendBulkEmailResponse,send_bulk_email_response\nSendBulkTemplatedEmailRequest,send_bulk_templated_email_request\nSendBulkTemplatedEmailResponse,send_bulk_templated_email_response\nSendChannelMessageRequest,send_channel_message_request\nSendChannelMessageResponse,send_channel_message_response\nSendCommandRequest,send_command_request\nSendCommandResult,send_command_result\nSendContactMethodVerificationRequest,send_contact_method_verification_request\nSendContactMethodVerificationResult,send_contact_method_verification_result\nSendCustomVerificationEmailRequest,send_custom_verification_email_request\nSendCustomVerificationEmailResponse,send_custom_verification_email_response\nSendDataPoint,send_data_point\nSendDataPoints,send_data_points\nSendDataToMulticastGroupRequest,send_data_to_multicast_group_request\nSendDataToMulticastGroupResponse,send_data_to_multicast_group_response\nSendDataToWirelessDeviceRequest,send_data_to_wireless_device_request\nSendDataToWirelessDeviceResponse,send_data_to_wireless_device_response\nSendDelayMs,send_delay_ms\nSendDiagnosticInterruptRequest,send_diagnostic_interrupt_request\nSendEmail,send_email\nSendEmailNotification,send_email_notification\nSendEmailRequest,send_email_request\nSendEmailResponse,send_email_response\nSendEventRequest,send_event_request\nSendEventResponse,send_event_response\nSendFilePaths,send_file_paths\nSendHeartbeatRequest,send_heartbeat_request\nSendInvitationRequest,send_invitation_request\nSendMessageBatchRequest,send_message_batch_request\nSendMessageBatchRequestEntry,send_message_batch_request_entry\nSendMessageBatchResult,send_message_batch_result\nSendMessageBatchResultEntry,send_message_batch_result_entry\nSendMessageRequest,send_message_request\nSendMessageResponse,send_message_response\nSendMessageResult,send_message_result\nSendMessagesRequest,send_messages_request\nSendMessagesResponse,send_messages_response\nSendNotification,send_notification\nSendNotificationAction,send_notification_action\nSendNotificationActionDefinition,send_notification_action_definition\nSendOTPMessageRequest,send_otp_message_request\nSendOTPMessageRequestParameters,send_otp_message_request_parameters\nSendOTPMessageResponse,send_otp_message_response\nSendPipelineExecutionStepFailureRequest,send_pipeline_execution_step_failure_request\nSendPipelineExecutionStepFailureResponse,send_pipeline_execution_step_failure_response\nSendPipelineExecutionStepSuccessRequest,send_pipeline_execution_step_success_request\nSendPipelineExecutionStepSuccessResponse,send_pipeline_execution_step_success_response\nSendProjectSessionActionRequest,send_project_session_action_request\nSendProjectSessionActionResponse,send_project_session_action_response\nSendQuota,send_quota\nSendRawEmailRequest,send_raw_email_request\nSendRawEmailResponse,send_raw_email_response\nSendSSHPublicKeyRequest,send_ssh_public_key_request\nSendSSHPublicKeyResponse,send_ssh_public_key_response\nSendSerialConsoleSSHPublicKeyRequest,send_serial_console_ssh_public_key_request\nSendSerialConsoleSSHPublicKeyResponse,send_serial_console_ssh_public_key_response\nSendTaskFailureInput,send_task_failure_input\nSendTaskHeartbeatInput,send_task_heartbeat_input\nSendTaskSuccessInput,send_task_success_input\nSendTemplatedEmailRequest,send_templated_email_request\nSendTemplatedEmailResponse,send_templated_email_response\nSendTestEventNotificationRequest,send_test_event_notification_request\nSendTextMessageRequest,send_text_message_request\nSendTextMessageResult,send_text_message_result\nSendUsersMessageRequest,send_users_message_request\nSendUsersMessageResponse,send_users_message_response\nSendUsersMessagesRequest,send_users_messages_request\nSendUsersMessagesResponse,send_users_messages_response\nSendVoiceMessageRequest,send_voice_message_request\nSendVoiceMessageResponse,send_voice_message_response\nSendVoiceMessageResult,send_voice_message_result\nSendWorkflowStepStateRequest,send_workflow_step_state_request\nSender,sender\nSenderClientId,sender_client_id\nSenderControlPort,sender_control_port\nSenderFault,sender_fault\nSenderId,sender_id\nSenderIdAndCountry,sender_id_and_country\nSenderIdArn,sender_id_arn\nSenderIdFilter,sender_id_filter\nSenderIdInformation,sender_id_information\nSenderIds,sender_ids\nSenderIpAddress,sender_ip_address\nSendingEnabled,sending_enabled\nSendingIps,sending_ips\nSendingOptions,sending_options\nSendingPausedException,sending_paused_exception\nSendingPoolName,sending_pool_name\nSendingSchedule,sending_schedule\nSensitive,sensitive\nSensitiveData,sensitive_data\nSensitiveDataDetections,sensitive_data_detections\nSensitiveDataItem,sensitive_data_item\nSensitiveDataResult,sensitive_data_result\nSensitivityAggregations,sensitivity_aggregations\nSensitivityInspectionTemplateExcludes,sensitivity_inspection_template_excludes\nSensitivityInspectionTemplateIncludes,sensitivity_inspection_template_includes\nSensitivityInspectionTemplatesEntry,sensitivity_inspection_templates_entry\nSensitivityLevel,sensitivity_level\nSensitivityThreshold,sensitivity_threshold\nSensor,sensor\nSensorName,sensor_name\nSensorStatisticsSummaries,sensor_statistics_summaries\nSensorStatisticsSummary,sensor_statistics_summary\nSensorsWithShortDateRange,sensors_with_short_date_range\nSentLast24Hours,sent_last24_hours\nSentTime,sent_time\nSentiment,sentiment\nSentimentAnalysisSettings,sentiment_analysis_settings\nSentimentConfiguration,sentiment_configuration\nSentimentDetectionJobFilter,sentiment_detection_job_filter\nSentimentDetectionJobProperties,sentiment_detection_job_properties\nSentimentDetectionJobPropertiesList,sentiment_detection_job_properties_list\nSentimentFilter,sentiment_filter\nSentimentResponse,sentiment_response\nSentimentScore,sentiment_score\nSentimentType,sentiment_type\nSentiments,sentiments\nSeparator,separator\nSeparatorConfiguration,separator_configuration\nSeq,seq\nSequence,sequence\nSequenceInformation,sequence_information\nSequenceNumber,sequence_number\nSequenceNumberForOrdering,sequence_number_for_ordering\nSequenceNumberRange,sequence_number_range\nSequenceStoreDetail,sequence_store_detail\nSequenceStoreFilter,sequence_store_filter\nSerDeInfo,ser_de_info\nSerde,serde\nSerdeInfo,serde_info\nSerial,serial\nSerialConsoleAccessDisabledException,serial_console_access_disabled_exception\nSerialConsoleAccessEnabled,serial_console_access_enabled\nSerialConsoleSessionLimitExceededException,serial_console_session_limit_exceeded_exception\nSerialConsoleSessionUnavailableException,serial_console_session_unavailable_exception\nSerialNumber,serial_number\nSerialPort,serial_port\nSerializationLibrary,serialization_library\nSerializer,serializer\nSeries,series\nSeriesItem,series_item\nServeSignature,serve_signature\nServer,server\nServerArn,server_arn\nServerCannotBeReplicatedException,server_cannot_be_replicated_exception\nServerCertLastUpdated,server_cert_last_updated\nServerCertUri,server_cert_uri\nServerCertificate,server_certificate\nServerCertificateArn,server_certificate_arn\nServerCertificateConfiguration,server_certificate_configuration\nServerCertificateConfigurations,server_certificate_configurations\nServerCertificateId,server_certificate_id\nServerCertificateMetadata,server_certificate_metadata\nServerCertificateMetadataList,server_certificate_metadata_list\nServerCertificateName,server_certificate_name\nServerCertificateScope,server_certificate_scope\nServerCertificateSummary,server_certificate_summary\nServerCertificates,server_certificates\nServerConfiguration,server_configuration\nServerDetail,server_detail\nServerEndpoint,server_endpoint\nServerError,server_error\nServerEvent,server_event\nServerEvents,server_events\nServerException,server_exception\nServerGroup,server_group\nServerGroupLaunchConfiguration,server_group_launch_configuration\nServerGroupReplicationConfiguration,server_group_replication_configuration\nServerGroupValidationConfiguration,server_group_validation_configuration\nServerHostname,server_hostname\nServerId,server_id\nServerInternalErrorException,server_internal_error_exception\nServerInternalException,server_internal_exception\nServerLaunchConfiguration,server_launch_configuration\nServerLaunchParameters,server_launch_parameters\nServerLaunchPath,server_launch_path\nServerName,server_name\nServerNameToVerify,server_name_to_verify\nServerOsType,server_os_type\nServerPath,server_path\nServerPort,server_port\nServerProcess,server_process\nServerProcesses,server_processes\nServerProperties,server_properties\nServerProtocol,server_protocol\nServerPublicKey,server_public_key\nServerReplicationConfiguration,server_replication_configuration\nServerReplicationParameters,server_replication_parameters\nServerRootCaCertificate,server_root_ca_certificate\nServerSdkVersion,server_sdk_version\nServerShortInfoResponse,server_short_info_response\nServerShutdownException,server_shutdown_exception\nServerSideEncryption,server_side_encryption\nServerSideEncryptionByDefault,server_side_encryption_by_default\nServerSideEncryptionConfiguration,server_side_encryption_configuration\nServerSideEncryptionKmsKeyId,server_side_encryption_kms_key_id\nServerSideEncryptionRule,server_side_encryption_rule\nServerSideEncryptionUpdateDetails,server_side_encryption_update_details\nServerSideKmsKeyId,server_side_kms_key_id\nServerSideTokenCheck,server_side_token_check\nServerStatusSummary,server_status_summary\nServerStrategy,server_strategy\nServerSummary,server_summary\nServerTimestamp,server_timestamp\nServerTimezone,server_timezone\nServerTimingHeadersConfig,server_timing_headers_config\nServerTrust,server_trust\nServerTunnelAddress,server_tunnel_address\nServerUrl,server_url\nServerValidation,server_validation\nServerValidationConfiguration,server_validation_configuration\nServerValidationOutput,server_validation_output\nServerless,serverless\nServerlessClientAuthentication,serverless_client_authentication\nServerlessConfig,serverless_config\nServerlessRequest,serverless_request\nServerlessSasl,serverless_sasl\nServerlessUpdateConfig,serverless_update_config\nServerlessV2ScalingConfiguration,serverless_v2_scaling_configuration\nServerlessV2ScalingConfigurationInfo,serverless_v2_scaling_configuration_info\nServers,servers\nService,service\nServiceAccessRoleArn,service_access_role_arn\nServiceAccessSecurityGroup,service_access_security_group\nServiceAccountCredentials,service_account_credentials\nServiceAccountException,service_account_exception\nServiceAccountPassword,service_account_password\nServiceAccountUsername,service_account_username\nServiceActionAssociation,service_action_association\nServiceActionAssociations,service_action_associations\nServiceActionDetail,service_action_detail\nServiceActionId,service_action_id\nServiceActionParameters,service_action_parameters\nServiceActionSummaries,service_action_summaries\nServiceActionSummary,service_action_summary\nServiceAdditionalInfo,service_additional_info\nServiceAlreadyExists,service_already_exists\nServiceArn,service_arn\nServiceArnList,service_arn_list\nServiceCatalogConfiguration,service_catalog_configuration\nServiceCatalogProvisionedProductDetails,service_catalog_provisioned_product_details\nServiceCatalogProvisioningDetails,service_catalog_provisioning_details\nServiceCatalogProvisioningUpdateDetails,service_catalog_provisioning_update_details\nServiceChange,service_change\nServiceCode,service_code\nServiceCollection,service_collection\nServiceConfiguration,service_configuration\nServiceConfigurations,service_configurations\nServiceConnectClientAlias,service_connect_client_alias\nServiceConnectConfiguration,service_connect_configuration\nServiceConnectService,service_connect_service\nServiceConnectServiceResource,service_connect_service_resource\nServiceCount,service_count\nServiceDescriptor,service_descriptor\nServiceDetail,service_detail\nServiceDetails,service_details\nServiceEndpoint,service_endpoint\nServiceError,service_error\nServiceErrorId,service_error_id\nServiceErrorIds,service_error_ids\nServiceErrors,service_errors\nServiceEvent,service_event\nServiceException,service_exception\nServiceExecutionRole,service_execution_role\nServiceExecutionRoleUpdate,service_execution_role_update\nServiceFailureException,service_failure_exception\nServiceFault,service_fault\nServiceFilter,service_filter\nServiceForecastStatistics,service_forecast_statistics\nServiceGraphEndTime,service_graph_end_time\nServiceGraphStartTime,service_graph_start_time\nServiceHealth,service_health\nServiceId,service_id\nServiceIdentifier,service_identifier\nServiceIds,service_ids\nServiceInfo,service_info\nServiceInsightHealth,service_insight_health\nServiceInstance,service_instance\nServiceInstanceState,service_instance_state\nServiceInstanceSummary,service_instance_summary\nServiceIntegration,service_integration\nServiceIntegrationConfig,service_integration_config\nServiceInternalErrorException,service_internal_error_exception\nServiceInternalException,service_internal_exception\nServiceJson,service_json\nServiceLastAccessed,service_last_accessed\nServiceLimit,service_limit\nServiceLimitExceeded,service_limit_exceeded\nServiceLimitExceededException,service_limit_exceeded_exception\nServiceLinkedRoleARN,service_linked_role_arn\nServiceLinkedRoleFailure,service_linked_role_failure\nServiceLinkedRoleLockClientException,service_linked_role_lock_client_exception\nServiceLinkedRoleNotFoundFault,service_linked_role_not_found_fault\nServiceLocation,service_location\nServiceMetadata,service_metadata\nServiceName,service_name\nServiceNameAndResourceType,service_name_and_resource_type\nServiceNames,service_names\nServiceNamespace,service_namespace\nServiceNamespaces,service_namespaces\nServiceNetworkServiceAssociationSummary,service_network_service_association_summary\nServiceNetworkSummary,service_network_summary\nServiceNetworkVpcAssociationSummary,service_network_vpc_association_summary\nServiceNotActiveException,service_not_active_exception\nServiceNotFound,service_not_found\nServiceNotFoundException,service_not_found_exception\nServiceNotSupportedException,service_not_supported_exception\nServiceNow,service_now\nServiceNowBuildVersion,service_now_build_version\nServiceNowConfiguration,service_now_configuration\nServiceNowConnectorProfileCredentials,service_now_connector_profile_credentials\nServiceNowConnectorProfileProperties,service_now_connector_profile_properties\nServiceNowKnowledgeArticleConfiguration,service_now_knowledge_article_configuration\nServiceNowParameters,service_now_parameters\nServiceNowServiceCatalogConfiguration,service_now_service_catalog_configuration\nServiceNowSourceProperties,service_now_source_properties\nServiceObservabilityConfiguration,service_observability_configuration\nServicePack,service_pack\nServicePassword,service_password\nServicePermissionId,service_permission_id\nServicePipeline,service_pipeline\nServicePipelineState,service_pipeline_state\nServicePrincipal,service_principal\nServicePrincipalName,service_principal_name\nServicePrincipalNameSummary,service_principal_name_summary\nServicePrincipalNames,service_principal_names\nServiceProcessingTimeInMillis,service_processing_time_in_millis\nServiceProfile,service_profile\nServiceProfileId,service_profile_id\nServiceProfileList,service_profile_list\nServiceProviderName,service_provider_name\nServiceProviderSamlMetadata,service_provider_saml_metadata\nServiceQuota,service_quota\nServiceQuotaExceededException,service_quota_exceeded_exception\nServiceQuotaIncreaseRequestInTemplate,service_quota_increase_request_in_template\nServiceQuotaIncreaseRequestInTemplateList,service_quota_increase_request_in_template_list\nServiceQuotaTemplateAssociationStatus,service_quota_template_association_status\nServiceQuotaTemplateNotInUseException,service_quota_template_not_in_use_exception\nServiceRegistries,service_registries\nServiceRegistry,service_registry\nServiceResourceCost,service_resource_cost\nServiceRole,service_role\nServiceRoleArn,service_role_arn\nServiceSetting,service_setting\nServiceSettingNotFound,service_setting_not_found\nServiceSize,service_size\nServiceSoftwareOptions,service_software_options\nServiceSpecificCredential,service_specific_credential\nServiceSpecificCredentialId,service_specific_credential_id\nServiceSpecificCredentialMetadata,service_specific_credential_metadata\nServiceSpecificCredentials,service_specific_credentials\nServiceSpecification,service_specification\nServiceState,service_state\nServiceStatistics,service_statistics\nServiceSummary,service_summary\nServiceSummaryList,service_summary_list\nServiceSummaryStatistics,service_summary_statistics\nServiceSyncBlockerSummary,service_sync_blocker_summary\nServiceSyncConfig,service_sync_config\nServiceTemplate,service_template\nServiceTemplateSummary,service_template_summary\nServiceTemplateVersion,service_template_version\nServiceTemplateVersionSummary,service_template_version_summary\nServiceTemporarilyUnavailableException,service_temporarily_unavailable_exception\nServiceType,service_type\nServiceTypeDetail,service_type_detail\nServiceUnavailable,service_unavailable\nServiceUnavailableError,service_unavailable_error\nServiceUnavailableException,service_unavailable_exception\nServiceUpdate,service_update\nServiceUpdateDescription,service_update_description\nServiceUpdateEndDate,service_update_end_date\nServiceUpdateName,service_update_name\nServiceUpdateNameToApply,service_update_name_to_apply\nServiceUpdateNotFoundFault,service_update_not_found_fault\nServiceUpdateRecommendedApplyByDate,service_update_recommended_apply_by_date\nServiceUpdateReleaseDate,service_update_release_date\nServiceUpdateRequest,service_update_request\nServiceUpdateSeverity,service_update_severity\nServiceUpdateStatus,service_update_status\nServiceUpdateTimeRange,service_update_time_range\nServiceUpdateType,service_update_type\nServiceUpdates,service_updates\nServiceUpdatesMessage,service_updates_message\nServiceUrl,service_url\nServiceUserName,service_user_name\nServiceVersion,service_version\nServiceVersions,service_versions\nServices,services\nServicesLastAccessed,services_last_accessed\nSession,session\nSessionAlreadyExistsException,session_already_exists_exception\nSessionArn,session_arn\nSessionCap,session_cap\nSessionCommand,session_command\nSessionConfiguration,session_configuration\nSessionContext,session_context\nSessionContextAttributes,session_context_attributes\nSessionCookieName,session_cookie_name\nSessionData,session_data\nSessionDataSortBy,session_data_sort_by\nSessionDuration,session_duration\nSessionExpirationDurationInSeconds,session_expiration_duration_in_seconds\nSessionExpiredException,session_expired_exception\nSessionFilter,session_filter\nSessionId,session_id\nSessionIdleTimeoutInMinutes,session_idle_timeout_in_minutes\nSessionInitializationEndpointPrefix,session_initialization_endpoint_prefix\nSessionIntegrationConfiguration,session_integration_configuration\nSessionIssuer,session_issuer\nSessionKeyAmex,session_key_amex\nSessionKeyDerivationAttributes,session_key_derivation_attributes\nSessionKeyDerivationMode,session_key_derivation_mode\nSessionKeyDerivationValue,session_key_derivation_value\nSessionKeyEmv2000,session_key_emv2000\nSessionKeyEmvCommon,session_key_emv_common\nSessionKeyMastercard,session_key_mastercard\nSessionKeyVisa,session_key_visa\nSessionKeys,session_keys\nSessionKeysAbpV1_0_x,session_keys_abp_v1_0_x\nSessionKeysAbpV1_1,session_keys_abp_v1_1\nSessionLifetimeInMinutes,session_lifetime_in_minutes\nSessionLifetimeInMinutesInvalidException,session_lifetime_in_minutes_invalid_exception\nSessionManagerOutputUrl,session_manager_output_url\nSessionMapping,session_mapping\nSessionMappingDetail,session_mapping_detail\nSessionMappingSummary,session_mapping_summary\nSessionMappings,session_mappings\nSessionName,session_name\nSessionNameOrId,session_name_or_id\nSessionNotFoundException,session_not_found_exception\nSessionNumber,session_number\nSessionPinningFilters,session_pinning_filters\nSessionPolicyArn,session_policy_arn\nSessionSampleRate,session_sample_rate\nSessionScriptS3Location,session_script_s3_location\nSessionSpecification,session_specification\nSessionStartTime,session_start_time\nSessionState,session_state\nSessionStatistics,session_statistics\nSessionStatus,session_status\nSessionStickinessConfig,session_stickiness_config\nSessionSummary,session_summary\nSessionTag,session_tag\nSessionTags,session_tags\nSessionTimeout,session_timeout\nSessionTimeoutHours,session_timeout_hours\nSessionTimeoutMinutes,session_timeout_minutes\nSessionToken,session_token\nSessions,sessions\nSet,set\nSetActiveReceiptRuleSetRequest,set_active_receipt_rule_set_request\nSetAlarmStateInput,set_alarm_state_input\nSetAsDefault,set_as_default\nSetCognitoEventsRequest,set_cognito_events_request\nSetDataCaptureChanges,set_data_capture_changes\nSetDataRetrievalPolicyInput,set_data_retrieval_policy_input\nSetDefaultAuthorizerRequest,set_default_authorizer_request\nSetDefaultAuthorizerResponse,set_default_authorizer_response\nSetDefaultMessageTypeRequest,set_default_message_type_request\nSetDefaultMessageTypeResult,set_default_message_type_result\nSetDefaultPermissionVersionRequest,set_default_permission_version_request\nSetDefaultPermissionVersionResponse,set_default_permission_version_response\nSetDefaultPolicyVersionRequest,set_default_policy_version_request\nSetDefaultSenderIdRequest,set_default_sender_id_request\nSetDefaultSenderIdResult,set_default_sender_id_result\nSetDesiredCapacityType,set_desired_capacity_type\nSetDimension,set_dimension\nSetEndpointAttributesInput,set_endpoint_attributes_input\nSetFileModeEntry,set_file_mode_entry\nSetGatewayBridgeSourceRequest,set_gateway_bridge_source_request\nSetId,set_id\nSetIdentifier,set_identifier\nSetIdentityDkimEnabledRequest,set_identity_dkim_enabled_request\nSetIdentityFeedbackForwardingEnabledRequest,set_identity_feedback_forwarding_enabled_request\nSetIdentityHeadersInNotificationsEnabledRequest,set_identity_headers_in_notifications_enabled_request\nSetIdentityMailFromDomainRequest,set_identity_mail_from_domain_request\nSetIdentityNotificationTopicRequest,set_identity_notification_topic_request\nSetIdentityPoolConfigurationRequest,set_identity_pool_configuration_request\nSetIdentityPoolConfigurationResponse,set_identity_pool_configuration_response\nSetIdentityPoolRolesInput,set_identity_pool_roles_input\nSetInstanceHealthQuery,set_instance_health_query\nSetInstanceProtectionQuery,set_instance_protection_query\nSetIpAddressTypeInput,set_ip_address_type_input\nSetIpAddressTypeOutput,set_ip_address_type_output\nSetIpAddressTypeRequest,set_ip_address_type_request\nSetIpAddressTypeResult,set_ip_address_type_result\nSetLoadBalancerListenerSSLCertificateInput,set_load_balancer_listener_ssl_certificate_input\nSetLoadBalancerPoliciesForBackendServerInput,set_load_balancer_policies_for_backend_server_input\nSetLoadBalancerPoliciesOfListenerInput,set_load_balancer_policies_of_listener_input\nSetLoadBasedAutoScalingRequest,set_load_based_auto_scaling_request\nSetLocalConsolePasswordInput,set_local_console_password_input\nSetLocalConsolePasswordOutput,set_local_console_password_output\nSetLogDeliveryConfigurationRequest,set_log_delivery_configuration_request\nSetLogDeliveryConfigurationResponse,set_log_delivery_configuration_response\nSetLoggingOptionsRequest,set_logging_options_request\nSetName,set_name\nSetParameterValueConfiguration,set_parameter_value_configuration\nSetParametersOperation,set_parameters_operation\nSetPermissionRequest,set_permission_request\nSetPlatformApplicationAttributesInput,set_platform_application_attributes_input\nSetPrincipalTagAttributeMapInput,set_principal_tag_attribute_map_input\nSetPrincipalTagAttributeMapResponse,set_principal_tag_attribute_map_response\nSetQueueAttributesRequest,set_queue_attributes_request\nSetReceiptRulePositionRequest,set_receipt_rule_position_request\nSetRepositoryPolicyRequest,set_repository_policy_request\nSetRepositoryPolicyResponse,set_repository_policy_response\nSetResourceAccessForBucketRequest,set_resource_access_for_bucket_request\nSetResourceAccessForBucketResult,set_resource_access_for_bucket_result\nSetRiskConfigurationRequest,set_risk_configuration_request\nSetRiskConfigurationResponse,set_risk_configuration_response\nSetRulePrioritiesInput,set_rule_priorities_input\nSetRulePrioritiesOutput,set_rule_priorities_output\nSetSMBGuestPasswordInput,set_smb_guest_password_input\nSetSMBGuestPasswordOutput,set_smb_guest_password_output\nSetSMSAttributesInput,set_sms_attributes_input\nSetSecurityGroupsInput,set_security_groups_input\nSetSecurityGroupsOutput,set_security_groups_output\nSetSecurityTokenServicePreferencesRequest,set_security_token_service_preferences_request\nSetSourceRequest,set_source_request\nSetStackPolicyInput,set_stack_policy_input\nSetStatOption,set_stat_option\nSetStatusInput,set_status_input\nSetSubnetsInput,set_subnets_input\nSetSubnetsOutput,set_subnets_output\nSetSubscriptionAttributesInput,set_subscription_attributes_input\nSetTagsForResourceRequest,set_tags_for_resource_request\nSetTaskStatusInput,set_task_status_input\nSetTerminationProtectionInput,set_termination_protection_input\nSetTextMessageSpendLimitOverrideRequest,set_text_message_spend_limit_override_request\nSetTextMessageSpendLimitOverrideResult,set_text_message_spend_limit_override_result\nSetTimeBasedAutoScalingRequest,set_time_based_auto_scaling_request\nSetTimerAction,set_timer_action\nSetTopicAttributesInput,set_topic_attributes_input\nSetTypeConfigurationInput,set_type_configuration_input\nSetTypeConfigurationOutput,set_type_configuration_output\nSetTypeDefaultVersionInput,set_type_default_version_input\nSetUICustomizationRequest,set_ui_customization_request\nSetUICustomizationResponse,set_ui_customization_response\nSetUserMFAPreferenceRequest,set_user_mfa_preference_request\nSetUserPoolMfaConfigRequest,set_user_pool_mfa_config_request\nSetUserPoolMfaConfigResponse,set_user_pool_mfa_config_response\nSetUserSettingsRequest,set_user_settings_request\nSetV2LoggingLevelRequest,set_v2_logging_level_request\nSetV2LoggingOptionsRequest,set_v2_logging_options_request\nSetVariableAction,set_variable_action\nSetVaultAccessPolicyInput,set_vault_access_policy_input\nSetVaultNotificationsInput,set_vault_notifications_input\nSetVisibleToAllUsersInput,set_visible_to_all_users_input\nSetVoiceMessageSpendLimitOverrideRequest,set_voice_message_spend_limit_override_request\nSetVoiceMessageSpendLimitOverrideResult,set_voice_message_spend_limit_override_result\nSetting,setting\nSettingDescription,setting_description\nSettingEntries,setting_entries\nSettingEntry,setting_entry\nSettingId,setting_id\nSettingName,setting_name\nSettingValue,setting_value\nSettings,settings\nSettingsForUpdate,settings_for_update\nSettingsGroup,settings_group\nSetup,setup\nSetupFailed,setup_failed\nSetupModeDisabled,setup_mode_disabled\nSetupScriptDetails,setup_script_details\nSevere,severe\nSeverities,severities\nSeverity,severity\nSeverityCounts,severity_counts\nSeverityLabel,severity_label\nSeverityLevel,severity_level\nSeverityNormalized,severity_normalized\nSeverityProduct,severity_product\nSeverityRating,severity_rating\nSeveritySummary,severity_summary\nSeverityUpdate,severity_update\nSftpAuthenticationMethods,sftp_authentication_methods\nSftpConfig,sftp_config\nSftpConnectorConfig,sftp_connector_config\nSha1,sha1\nShadowColor,shadow_color\nShadowModeConfig,shadow_mode_config\nShadowModelVariantConfig,shadow_model_variant_config\nShadowModelVariantName,shadow_model_variant_name\nShadowModelVariants,shadow_model_variants\nShadowOpacity,shadow_opacity\nShadowProductionVariants,shadow_production_variants\nShadowXOffset,shadow_x_offset\nShadowYOffset,shadow_y_offset\nShapBaseline,shap_baseline\nShapBaselineConfig,shap_baseline_config\nShapBaselineUri,shap_baseline_uri\nShapConfig,shap_config\nShape,shape\nShapeConditionalFormat,shape_conditional_format\nShard,shard\nShardConfiguration,shard_configuration\nShardConfigurationRequest,shard_configuration_request\nShardCount,shard_count\nShardDetail,shard_detail\nShardFilter,shard_filter\nShardId,shard_id\nShardIterator,shard_iterator\nShardIteratorType,shard_iterator_type\nShardLevelMetrics,shard_level_metrics\nShardLimit,shard_limit\nShardName,shard_name\nShardNotFoundFault,shard_not_found_fault\nShardToMerge,shard_to_merge\nShardToSplit,shard_to_split\nShards,shards\nShardsPerClusterQuotaExceededFault,shards_per_cluster_quota_exceeded_fault\nShareAttributes,share_attributes\nShareDetails,share_details\nShareDirectoryRequest,share_directory_request\nShareDirectoryResult,share_directory_result\nShareError,share_error\nShareErrors,share_errors\nShareId,share_id\nShareInvitation,share_invitation\nShareInvitationAction,share_invitation_action\nShareInvitationId,share_invitation_id\nShareInvitationSummaries,share_invitation_summaries\nShareInvitationSummary,share_invitation_summary\nShareLimitExceededException,share_limit_exceeded_exception\nShareMethod,share_method\nShareNotes,share_notes\nSharePointConfiguration,share_point_configuration\nSharePointVersion,share_point_version\nSharePrincipal,share_principal\nSharePrincipals,share_principals\nShareResourceType,share_resource_type\nShareResult,share_result\nShareResults,share_results\nShareRule,share_rule\nShareRules,share_rules\nShareStatus,share_status\nShareTagOptions,share_tag_options\nShareTarget,share_target\nSharedAccountId,shared_account_id\nSharedAwsAccountIds,shared_aws_account_ids\nSharedBy,shared_by\nSharedDirectories,shared_directories\nSharedDirectory,shared_directory\nSharedDirectoryId,shared_directory_id\nSharedDirectoryIds,shared_directory_ids\nSharedDocumentVersion,shared_document_version\nSharedFileSystemConfiguration,shared_file_system_configuration\nSharedImagePermissions,shared_image_permissions\nSharedImagePermissionsList,shared_image_permissions_list\nSharedMemorySize,shared_memory_size\nSharedRoutesEnabled,shared_routes_enabled\nSharedSecret,shared_secret\nSharedSegments,shared_segments\nSharedSnapshotQuotaExceededFault,shared_snapshot_quota_exceeded_fault\nSharedWith,shared_with\nSharedWithPrefix,shared_with_prefix\nSharingModel,sharing_model\nSharingSettings,sharing_settings\nSharpening,sharpening\nSharpness,sharpness\nSheet,sheet\nSheetContentType,sheet_content_type\nSheetControlInfoIconLabelOptions,sheet_control_info_icon_label_options\nSheetControlLayout,sheet_control_layout\nSheetControlLayoutConfiguration,sheet_control_layout_configuration\nSheetControlLayouts,sheet_control_layouts\nSheetControlsOption,sheet_controls_option\nSheetDefinition,sheet_definition\nSheetElementConfigurationOverrides,sheet_element_configuration_overrides\nSheetElementRenderingRule,sheet_element_rendering_rule\nSheetId,sheet_id\nSheetIndexes,sheet_indexes\nSheetLayoutElementMaximizationOption,sheet_layout_element_maximization_option\nSheetNames,sheet_names\nSheetSelections,sheet_selections\nSheetStyle,sheet_style\nSheetTextBox,sheet_text_box\nSheetTextBoxId,sheet_text_box_id\nSheetVisualScopingConfiguration,sheet_visual_scoping_configuration\nSheetVisualScopingConfigurations,sheet_visual_scoping_configurations\nSheets,sheets\nShellHistoryFilePath,shell_history_file_path\nShellVersion,shell_version\nShiftCoverages,shift_coverages\nShiftDetails,shift_details\nShipment,shipment\nShipmentCarrier,shipment_carrier\nShipmentInformation,shipment_information\nShipmentState,shipment_state\nShipmentTrackingNumber,shipment_tracking_number\nShippingAddress,shipping_address\nShippingDetails,shipping_details\nShippingOption,shipping_option\nShortCode,short_code\nShortDescription,short_description\nShortFormatText,short_format_text\nShortName,short_name\nShortened,shortened\nShortname,shortname\nShotFilter,shot_filter\nShotSegment,shot_segment\nShouldDecrementDesiredCapacity,should_decrement_desired_capacity\nShouldRespectGracePeriod,should_respect_grace_period\nShow,show\nShowAlternatives,show_alternatives\nShowAssignedLFTags,show_assigned_lf_tags\nShowCacheClustersNotInReplicationGroups,show_cache_clusters_not_in_replication_groups\nShowCacheNodeInfo,show_cache_node_info\nShowDetail,show_detail\nShowMemberInfo,show_member_info\nShowNodeGroupConfig,show_node_group_config\nShowNodeLevelUpdateStatus,show_node_level_update_status\nShowShardDetails,show_shard_details\nShowSpeakerLabel,show_speaker_label\nShowSpeakerLabels,show_speaker_labels\nShrinkPolicy,shrink_policy\nShuffleConfig,shuffle_config\nShutdown,shutdown\nShutdownEventConfiguration,shutdown_event_configuration\nShutdownGatewayInput,shutdown_gateway_input\nShutdownGatewayOutput,shutdown_gateway_output\nShuttingDown,shutting_down\nSid,sid\nSideSpecificBorder,side_specific_border\nSidewalk,sidewalk\nSidewalkAccountInfo,sidewalk_account_info\nSidewalkAccountInfoWithFingerprint,sidewalk_account_info_with_fingerprint\nSidewalkCreateWirelessDevice,sidewalk_create_wireless_device\nSidewalkDevice,sidewalk_device\nSidewalkDeviceMetadata,sidewalk_device_metadata\nSidewalkEventNotificationConfigurations,sidewalk_event_notification_configurations\nSidewalkGetDeviceProfile,sidewalk_get_device_profile\nSidewalkGetStartImportInfo,sidewalk_get_start_import_info\nSidewalkId,sidewalk_id\nSidewalkListDevice,sidewalk_list_device\nSidewalkManufacturingSn,sidewalk_manufacturing_sn\nSidewalkResourceTypeEventConfiguration,sidewalk_resource_type_event_configuration\nSidewalkSendDataToDevice,sidewalk_send_data_to_device\nSidewalkSingleStartImportInfo,sidewalk_single_start_import_info\nSidewalkStartImportInfo,sidewalk_start_import_info\nSidewalkUpdateAccount,sidewalk_update_account\nSidewalkUpdateImportInfo,sidewalk_update_import_info\nSigKeyCrc,sig_key_crc\nSigV4Authorization,sigv4_authorization\nSign,sign\nSignInConfig,sign_in_config\nSignInDistribution,sign_in_distribution\nSignInMethod,sign_in_method\nSignInUrl,sign_in_url\nSignInWithApple,sign_in_with_apple\nSignKey,sign_key\nSignOutUserRequest,sign_out_user_request\nSignPayloadRequest,sign_payload_request\nSignPayloadResponse,sign_payload_response\nSignRequest,sign_request\nSignResponse,sign_response\nSignUpRequest,sign_up_request\nSignUpResponse,sign_up_response\nSignal,signal\nSignalApplicationInstanceNodeInstancesRequest,signal_application_instance_node_instances_request\nSignalApplicationInstanceNodeInstancesResponse,signal_application_instance_node_instances_response\nSignalCatalogSummary,signal_catalog_summary\nSignalDecoder,signal_decoder\nSignalExternalWorkflowExecutionDecisionAttributes,signal_external_workflow_execution_decision_attributes\nSignalExternalWorkflowExecutionFailedEventAttributes,signal_external_workflow_execution_failed_event_attributes\nSignalExternalWorkflowExecutionInitiatedEventAttributes,signal_external_workflow_execution_initiated_event_attributes\nSignalInformation,signal_information\nSignalProcessingNotification,signal_processing_notification\nSignalResourceInput,signal_resource_input\nSignalType,signal_type\nSignalWorkflowExecutionInput,signal_workflow_execution_input\nSignalingUrl,signaling_url\nSignature,signature\nSignatureAlgorithm,signature_algorithm\nSignatureDetection,signature_detection\nSignatureDetections,signature_detections\nSignatureValid,signature_valid\nSignatureValidityPeriod,signature_validity_period\nSigned,signed\nSignedCert,signed_cert\nSignedHeaders,signed_headers\nSignedObject,signed_object\nSignedToken,signed_token\nSignedUrl,signed_url\nSignedUrlExpiresAt,signed_url_expires_at\nSigner,signer\nSigninDelegateGroup,signin_delegate_group\nSigninDelegateGroups,signin_delegate_groups\nSigningAlg,signing_alg\nSigningAlgorithm,signing_algorithm\nSigningAlgorithmMnemonic,signing_algorithm_mnemonic\nSigningAlgorithmType,signing_algorithm_type\nSigningAlgorithms,signing_algorithms\nSigningAttributes,signing_attributes\nSigningAttributesOrigin,signing_attributes_origin\nSigningBehavior,signing_behavior\nSigningCertificate,signing_certificate\nSigningConfiguration,signing_configuration\nSigningConfigurationOverrides,signing_configuration_overrides\nSigningEnabled,signing_enabled\nSigningImageFormat,signing_image_format\nSigningJob,signing_job\nSigningJobArn,signing_job_arn\nSigningJobRevocationRecord,signing_job_revocation_record\nSigningKeyAlgorithm,signing_key_algorithm\nSigningKeyCertificate,signing_key_certificate\nSigningKeyCertificateChain,signing_key_certificate_chain\nSigningMaterial,signing_material\nSigningPlatform,signing_platform\nSigningPlatformOverrides,signing_platform_overrides\nSigningProfile,signing_profile\nSigningProfileParameter,signing_profile_parameter\nSigningProfileRevocationRecord,signing_profile_revocation_record\nSigningProfileVersionArn,signing_profile_version_arn\nSigningProfileVersionArns,signing_profile_version_arns\nSigningProtocol,signing_protocol\nSignupResponse,signup_response\nSilentPush,silent_push\nSimilarity,similarity\nSimilarityThreshold,similarity_threshold\nSimple,simple\nSimpleAddress,simple_address\nSimpleAttributeAggregation,simple_attribute_aggregation\nSimpleClusterMarker,simple_cluster_marker\nSimpleCondition,simple_condition\nSimpleCriterionForJob,simple_criterion_for_job\nSimpleEmail,simple_email\nSimpleEmailPart,simple_email_part\nSimpleNumericalAggregation,simple_numerical_aggregation\nSimpleRule,simple_rule\nSimpleRuleEvaluation,simple_rule_evaluation\nSimpleScalingPolicyConfiguration,simple_scaling_policy_configuration\nSimpleScopeTerm,simple_scope_term\nSimpleUser,simple_user\nSimplifiedApplication,simplified_application\nSimplifiedColor,simplified_color\nSimulateCustomPolicyRequest,simulate_custom_policy_request\nSimulatePolicyResponse,simulate_policy_response\nSimulatePrincipalPolicyRequest,simulate_principal_policy_request\nSimulateReservedQueue,simulate_reserved_queue\nSimulation,simulation\nSimulationAppEndpointInfo,simulation_app_endpoint_info\nSimulationAppMetadata,simulation_app_metadata\nSimulationAppPortMapping,simulation_app_port_mapping\nSimulationApplicationConfig,simulation_application_config\nSimulationApplicationSummary,simulation_application_summary\nSimulationClock,simulation_clock\nSimulationJob,simulation_job\nSimulationJobBatchSummary,simulation_job_batch_summary\nSimulationJobRequest,simulation_job_request\nSimulationJobSummary,simulation_job_summary\nSimulationMetadata,simulation_metadata\nSimulationSoftwareSuite,simulation_software_suite\nSimulations,simulations\nSinceCrawlDate,since_crawl_date\nSingleAvailabilityZone,single_availability_zone\nSingleHeader,single_header\nSingleHeaderConfig,single_header_config\nSingleInstanceHealth,single_instance_health\nSingleInstanceType,single_instance_type\nSingleMasterChannelEndpointConfiguration,single_master_channel_endpoint_configuration\nSingleMasterConfiguration,single_master_configuration\nSingleMetricAnomalyDetector,single_metric_anomaly_detector\nSingleMetricVisibility,single_metric_visibility\nSingleQueryArgument,single_query_argument\nSingleSelectOptions,single_select_options\nSingleSelectQuestionRuleCategoryAutomation,single_select_question_rule_category_automation\nSingleSignOnManagedApplicationInstanceId,single_sign_on_managed_application_instance_id\nSingleSignOnUserIdentifier,single_sign_on_user_identifier\nSingleSignOnUserValue,single_sign_on_user_value\nSingleWeightConfig,single_weight_config\nSingular,singular\nSingularConnectorProfileCredentials,singular_connector_profile_credentials\nSingularConstant,singular_constant\nSingularSourceProperties,singular_source_properties\nSinkArn,sink_arn\nSinkId,sink_id\nSinkIdentifier,sink_identifier\nSinkType,sink_type\nSinks,sinks\nSipAddress,sip_address\nSipAddresses,sip_addresses\nSipHeaders,sip_headers\nSipMediaApplication,sip_media_application\nSipMediaApplicationAlexaSkillConfiguration,sip_media_application_alexa_skill_configuration\nSipMediaApplicationArn,sip_media_application_arn\nSipMediaApplicationCall,sip_media_application_call\nSipMediaApplicationEndpoint,sip_media_application_endpoint\nSipMediaApplicationId,sip_media_application_id\nSipMediaApplicationLoggingConfiguration,sip_media_application_logging_configuration\nSipMediaApplications,sip_media_applications\nSipRule,sip_rule\nSipRuleId,sip_rule_id\nSipRuleTargetApplication,sip_rule_target_application\nSipRules,sip_rules\nSite,site\nSiteArn,site_arn\nSiteBaseUrl,site_base_url\nSiteId,site_id\nSiteIds,site_ids\nSiteMaps,site_maps\nSiteMapsConfiguration,site_maps_configuration\nSitePlan,site_plan\nSiteToSiteVpnAttachment,site_to_site_vpn_attachment\nSiteUrl,site_url\nSites,sites\nSize,size\nSizeBytes,size_bytes\nSizeClassified,size_classified\nSizeConstraint,size_constraint\nSizeConstraintSet,size_constraint_set\nSizeConstraintSetId,size_constraint_set_id\nSizeConstraintSetSummary,size_constraint_set_summary\nSizeConstraintSetUpdate,size_constraint_set_update\nSizeConstraintSets,size_constraint_sets\nSizeConstraintStatement,size_constraint_statement\nSizeConstraints,size_constraints\nSizeEstimateRangeGB,size_estimate_range_gb\nSizeFlexEligible,size_flex_eligible\nSizeInBytes,size_in_bytes\nSizeInGB,size_in_gb\nSizeInMBs,size_in_mbs\nSizeInMegabytes,size_in_megabytes\nSizeInMiB,size_in_mib\nSizeLabelOptions,size_label_options\nSizeOnDisk,size_on_disk\nSizePercent,size_percent\nSizeRange,size_range\nSizeUnit,size_unit\nSizes,sizes\nSizingOptions,sizing_options\nSizingPolicy,sizing_policy\nSkewedColumnNames,skewed_column_names\nSkewedColumnValueLocationMaps,skewed_column_value_location_maps\nSkewedColumnValues,skewed_column_values\nSkewedInfo,skewed_info\nSkillDetails,skill_details\nSkillGroup,skill_group\nSkillGroupArn,skill_group_arn\nSkillGroupData,skill_group_data\nSkillGroupName,skill_group_name\nSkillGroups,skill_groups\nSkillId,skill_id\nSkillName,skill_name\nSkillNotLinkedException,skill_not_linked_exception\nSkillSummaries,skill_summaries\nSkillSummary,skill_summary\nSkillType,skill_type\nSkillTypes,skill_types\nSkillsStoreSkill,skills_store_skill\nSkillsStoreSkills,skills_store_skills\nSkipArchive,skip_archive\nSkipCheck,skip_check\nSkipDestinationValidation,skip_destination_validation\nSkipFinalBackup,skip_final_backup\nSkipFinalClusterSnapshot,skip_final_cluster_snapshot\nSkipFinalSnapshot,skip_final_snapshot\nSkipFirst,skip_first\nSkipMatching,skip_matching\nSkipModelValidation,skip_model_validation\nSkipTunnelReplacement,skip_tunnel_replacement\nSkipUnavailable,skip_unavailable\nSkipWaitTimeForInstanceTerminationInput,skip_wait_time_for_instance_termination_input\nSkipped,skipped\nSkippedIPRangeList,skipped_ip_range_list\nSkippedRecordCount,skipped_record_count\nSkippedTermCount,skipped_term_count\nSkippedUsers,skipped_users\nSkippedVolumeDetails,skipped_volume_details\nSku,sku\nSlaMet,sla_met\nSlack,slack\nSlackChannelConfiguration,slack_channel_configuration\nSlackConfiguration,slack_configuration\nSlackConnectorProfileCredentials,slack_connector_profile_credentials\nSlackConnectorProfileProperties,slack_connector_profile_properties\nSlackEntityList,slack_entity_list\nSlackMetadata,slack_metadata\nSlackSourceProperties,slack_source_properties\nSlackWorkspaceConfiguration,slack_workspace_configuration\nSlate,slate\nSlateAdUrl,slate_ad_url\nSlateSource,slate_source\nSlaveInstanceType,slave_instance_type\nSlices,slices\nSlider,slider\nSliderControlDisplayOptions,slider_control_display_options\nSlot,slot\nSlotCaptureSetting,slot_capture_setting\nSlotDateTimeRangeRequest,slot_date_time_range_request\nSlotDefaultValue,slot_default_value\nSlotDefaultValueSpec,slot_default_value_spec\nSlotDefaultValueSpecification,slot_default_value_specification\nSlotDurationInHours,slot_duration_in_hours\nSlotFilter,slot_filter\nSlotMigration,slot_migration\nSlotName,slot_name\nSlotNotAvailableException,slot_not_available_exception\nSlotPriority,slot_priority\nSlotResolutionTestResultItem,slot_resolution_test_result_item\nSlotResolutionTestResultItemCounts,slot_resolution_test_result_item_counts\nSlotSortBy,slot_sort_by\nSlotStartTimeRange,slot_start_time_range\nSlotStartTimeRangeRequest,slot_start_time_range_request\nSlotSuggestions,slot_suggestions\nSlotSummary,slot_summary\nSlotTypeConfiguration,slot_type_configuration\nSlotTypeFilter,slot_type_filter\nSlotTypeMetadata,slot_type_metadata\nSlotTypeRegexConfiguration,slot_type_regex_configuration\nSlotTypeSortBy,slot_type_sort_by\nSlotTypeStatistics,slot_type_statistics\nSlotTypeSummary,slot_type_summary\nSlotTypeValue,slot_type_value\nSlotValue,slot_value\nSlotValueElicitationSetting,slot_value_elicitation_setting\nSlotValueOverride,slot_value_override\nSlotValueRegexFilter,slot_value_regex_filter\nSlotValueSelectionSetting,slot_value_selection_setting\nSlots,slots\nSlowDownException,slow_down_exception\nSlowPal,slow_pal\nSmallImageIconUrl,small_image_icon_url\nSmallMultiples,small_multiples\nSmallMultiplesAxisProperties,small_multiples_axis_properties\nSmallMultiplesLimitConfiguration,small_multiples_limit_configuration\nSmallMultiplesOptions,small_multiples_options\nSmallMultiplesSort,small_multiples_sort\nSmartHomeAppliance,smart_home_appliance\nSmartHomeAppliances,smart_home_appliances\nSmb,smb\nSmbMountOptions,smb_mount_options\nSmile,smile\nSmoothStreaming,smooth_streaming\nSmoothingLatency,smoothing_latency\nSmpte2038DataPreference,smpte2038_data_preference\nSmpteTtDestinationSettings,smpte_tt_destination_settings\nSmsAuthenticationMessage,sms_authentication_message\nSmsConfiguration,sms_configuration\nSmsConfigurationFailure,sms_configuration_failure\nSmsConfigurationType,sms_configuration_type\nSmsMessage,sms_message\nSmsMfaConfigType,sms_mfa_config_type\nSmsMfaConfiguration,sms_mfa_configuration\nSmsSettings,sms_settings\nSmsVerificationMessage,sms_verification_message\nSmtpReplyCode,smtp_reply_code\nSnapShotTimeFilter,snap_shot_time_filter\nSnapStart,snap_start\nSnapStartException,snap_start_exception\nSnapStartNotReadyException,snap_start_not_ready_exception\nSnapStartResponse,snap_start_response\nSnapStartTimeoutException,snap_start_timeout_exception\nSnaplockConfiguration,snaplock_configuration\nSnaplockRetentionPeriod,snaplock_retention_period\nSnaplockType,snaplock_type\nSnappedDeparturePositions,snapped_departure_positions\nSnappedDestinationPositions,snapped_destination_positions\nSnapshot,snapshot\nSnapshotARN,snapshot_arn\nSnapshotAlreadyExistsFault,snapshot_already_exists_fault\nSnapshotAnonymousUser,snapshot_anonymous_user\nSnapshotAnonymousUserRedacted,snapshot_anonymous_user_redacted\nSnapshotArn,snapshot_arn\nSnapshotArns,snapshot_arns\nSnapshotCapacityUsed,snapshot_capacity_used\nSnapshotClusterIdentifier,snapshot_cluster_identifier\nSnapshotConfiguration,snapshot_configuration\nSnapshotCopyAlreadyDisabledFault,snapshot_copy_already_disabled_fault\nSnapshotCopyAlreadyEnabledFault,snapshot_copy_already_enabled_fault\nSnapshotCopyDisabledFault,snapshot_copy_disabled_fault\nSnapshotCopyGrant,snapshot_copy_grant\nSnapshotCopyGrantAlreadyExistsFault,snapshot_copy_grant_already_exists_fault\nSnapshotCopyGrantMessage,snapshot_copy_grant_message\nSnapshotCopyGrantName,snapshot_copy_grant_name\nSnapshotCopyGrantNotFoundFault,snapshot_copy_grant_not_found_fault\nSnapshotCopyGrantQuotaExceededFault,snapshot_copy_grant_quota_exceeded_fault\nSnapshotCopyGrants,snapshot_copy_grants\nSnapshotCreateTime,snapshot_create_time\nSnapshotCreationTime,snapshot_creation_time\nSnapshotCreationTimestamp,snapshot_creation_timestamp\nSnapshotDatabaseTime,snapshot_database_time\nSnapshotDescription,snapshot_description\nSnapshotDestinationConfiguration,snapshot_destination_configuration\nSnapshotDetail,snapshot_detail\nSnapshotDetails,snapshot_details\nSnapshotDiskContainer,snapshot_disk_container\nSnapshotDownloadUrl,snapshot_download_url\nSnapshotErrorMessage,snapshot_error_message\nSnapshotFeatureNotSupportedFault,snapshot_feature_not_supported_fault\nSnapshotFile,snapshot_file\nSnapshotFileGroup,snapshot_file_group\nSnapshotFileSheetSelection,snapshot_file_sheet_selection\nSnapshotFilter,snapshot_filter\nSnapshotId,snapshot_id\nSnapshotIdentifier,snapshot_identifier\nSnapshotIdentifierList,snapshot_identifier_list\nSnapshotIds,snapshot_ids\nSnapshotInfo,snapshot_info\nSnapshotJobErrorInfo,snapshot_job_error_info\nSnapshotJobId,snapshot_job_id\nSnapshotJobResult,snapshot_job_result\nSnapshotJobResultErrorInfo,snapshot_job_result_error_info\nSnapshotJobResultFileGroup,snapshot_job_result_file_group\nSnapshotJobS3Result,snapshot_job_s3_result\nSnapshotLimitExceededException,snapshot_limit_exceeded_exception\nSnapshotLimits,snapshot_limits\nSnapshotMessage,snapshot_message\nSnapshotName,snapshot_name\nSnapshotNotFound,snapshot_not_found\nSnapshotNotFoundFault,snapshot_not_found_fault\nSnapshotOptions,snapshot_options\nSnapshotOptionsStatus,snapshot_options_status\nSnapshotOwner,snapshot_owner\nSnapshotPolicy,snapshot_policy\nSnapshotQuotaExceededFault,snapshot_quota_exceeded_fault\nSnapshotRecycleBinInfo,snapshot_recycle_bin_info\nSnapshotRetentionLimit,snapshot_retention_limit\nSnapshotRetentionStartTime,snapshot_retention_start_time\nSnapshotS3DestinationConfiguration,snapshot_s3_destination_configuration\nSnapshotS3Location,snapshot_s3_location\nSnapshotSchedule,snapshot_schedule\nSnapshotScheduleAlreadyExistsFault,snapshot_schedule_already_exists_fault\nSnapshotScheduleIdentifier,snapshot_schedule_identifier\nSnapshotScheduleNotFoundFault,snapshot_schedule_not_found_fault\nSnapshotScheduleQuotaExceededFault,snapshot_schedule_quota_exceeded_fault\nSnapshotScheduleState,snapshot_schedule_state\nSnapshotScheduleUpdateInProgressFault,snapshot_schedule_update_in_progress_fault\nSnapshotSchedules,snapshot_schedules\nSnapshotSizeInMegaBytes,snapshot_size_in_mega_bytes\nSnapshotSortingEntity,snapshot_sorting_entity\nSnapshotSource,snapshot_source\nSnapshotStatus,snapshot_status\nSnapshotSummaries,snapshot_summaries\nSnapshotSummary,snapshot_summary\nSnapshotTarget,snapshot_target\nSnapshotTaskDetail,snapshot_task_detail\nSnapshotTierStatus,snapshot_tier_status\nSnapshotTierStatuses,snapshot_tier_statuses\nSnapshotTime,snapshot_time\nSnapshotType,snapshot_type\nSnapshotUserConfiguration,snapshot_user_configuration\nSnapshotUserConfigurationRedacted,snapshot_user_configuration_redacted\nSnapshotVersion,snapshot_version\nSnapshotWindow,snapshot_window\nSnapshots,snapshots\nSnapshotsData,snapshots_data\nSnapshotsDataHeader,snapshots_data_header\nSnapshotsEnabled,snapshots_enabled\nSnapshotsEnabledUpdate,snapshots_enabled_update\nSnapshottingClusterId,snapshotting_cluster_id\nSnoozeActionConfiguration,snooze_action_configuration\nSnoozeAlarmActionRequest,snooze_alarm_action_request\nSnowballAmiId,snowball_ami_id\nSnowballCapacityPreference,snowball_capacity_preference\nSnowballId,snowball_id\nSnowballLimit,snowball_limit\nSnowballType,snowball_type\nSnowballsInUse,snowballs_in_use\nSnowconeDeviceConfiguration,snowcone_device_configuration\nSnowflake,snowflake\nSnowflakeConnectorProfileCredentials,snowflake_connector_profile_credentials\nSnowflakeConnectorProfileProperties,snowflake_connector_profile_properties\nSnowflakeDestinationProperties,snowflake_destination_properties\nSnowflakeMetadata,snowflake_metadata\nSnowflakeNodeData,snowflake_node_data\nSnowflakeParameters,snowflake_parameters\nSnowflakeSource,snowflake_source\nSnowflakeTarget,snowflake_target\nSnr,snr\nSns,sns\nSnsAction,sns_action\nSnsCallerArn,sns_caller_arn\nSnsChannelConfig,sns_channel_config\nSnsConfiguration,sns_configuration\nSnsDataSource,sns_data_source\nSnsDestination,sns_destination\nSnsFormat,sns_format\nSnsRegion,sns_region\nSnsRoleName,sns_role_name\nSnsTopic,sns_topic\nSnsTopicARN,sns_topic_arn\nSnsTopicArn,sns_topic_arn\nSnsTopicConfiguration,sns_topic_configuration\nSnsTopicName,sns_topic_name\nSnsTopicSinkConfiguration,sns_topic_sink_configuration\nSnsTopicStatus,sns_topic_status\nSocialProviderSettings,social_provider_settings\nSocketAddress,socket_address\nSocketPath,socket_path\nSockets,sockets\nSoftIRQ,soft_irq\nSoftLimit,soft_limit\nSoftness,softness\nSoftware,software\nSoftwareDetails,software_details\nSoftwareInformation,software_information\nSoftwarePackage,software_package\nSoftwareToUpdate,software_to_update\nSoftwareTokenMFANotFoundException,software_token_mfa_not_found_exception\nSoftwareTokenMfaConfigType,software_token_mfa_config_type\nSoftwareTokenMfaConfiguration,software_token_mfa_configuration\nSoftwareTokenMfaSettings,software_token_mfa_settings\nSoftwareTokenMfaSettingsType,software_token_mfa_settings_type\nSoftwareUpdateOptions,software_update_options\nSoftwareUpdateOptionsStatus,software_update_options_status\nSoftwareUpdatesEndDate,software_updates_end_date\nSoftwareVersion,software_version\nSolid,solid\nSolution,solution\nSolutionConfig,solution_config\nSolutionStackDescription,solution_stack_description\nSolutionStackDetails,solution_stack_details\nSolutionStackName,solution_stack_name\nSolutionStacks,solution_stacks\nSolutionSummary,solution_summary\nSolutionVersion,solution_version\nSolutionVersionSummary,solution_version_summary\nSolveTimestamp,solve_timestamp\nSolverProvider,solver_provider\nSolverType,solver_type\nSolverVersion,solver_version\nSolvers,solvers\nSopRecommendation,sop_recommendation\nSort,sort\nSortAscending,sort_ascending\nSortBy,sort_by\nSortByMetric,sort_by_metric\nSortColumns,sort_columns\nSortCondition,sort_condition\nSortConfiguration,sort_configuration\nSortCriteria,sort_criteria\nSortCriterion,sort_criterion\nSortDefinition,sort_definition\nSortDirection,sort_direction\nSortEnabled,sort_enabled\nSortExpression,sort_expression\nSortIconVisibility,sort_icon_visibility\nSortKey,sort_key\nSortOrder,sort_order\nSortPaths,sort_paths\nSortProperty,sort_property\nSortable,sortable\nSortingConfiguration,sorting_configuration\nSortingEntities,sorting_entities\nSound,sound\nSource,source\nSource608ChannelNumber,source608_channel_number\nSource608TrackNumber,source608_track_number\nSourceARN,source_arn\nSourceAccessConfiguration,source_access_configuration\nSourceAccessConfigurations,source_access_configurations\nSourceAccount,source_account\nSourceAccountId,source_account_id\nSourceAddress,source_address\nSourceAddresses,source_addresses\nSourceAlgorithm,source_algorithm\nSourceAlgorithmSpecification,source_algorithm_specification\nSourceAlgorithms,source_algorithms\nSourceAnalysis,source_analysis\nSourceAncillaryChannelNumber,source_ancillary_channel_number\nSourceAndDestinationAreSameException,source_and_destination_are_same_exception\nSourceApiAssociation,source_api_association\nSourceApiAssociationConfig,source_api_association_config\nSourceApiAssociationSummary,source_api_association_summary\nSourceApplicationName,source_application_name\nSourceApplicationUrl,source_application_url\nSourceArn,source_arn\nSourceArnPrefix,source_arn_prefix\nSourceAuth,source_auth\nSourceBackup,source_backup\nSourceBackupArn,source_backup_arn\nSourceBackupId,source_backup_id\nSourceBackupRegion,source_backup_region\nSourceBackupUnavailable,source_backup_unavailable\nSourceBackupVaultArn,source_backup_vault_arn\nSourceBackupVaultName,source_backup_vault_name\nSourceBranchName,source_branch_name\nSourceBucket,source_bucket\nSourceBucketArn,source_bucket_arn\nSourceBuildInformation,source_build_information\nSourceBundle,source_bundle\nSourceBundleDeletionException,source_bundle_deletion_exception\nSourceCacheNodeId,source_cache_node_id\nSourceCidrBlock,source_cidr_block\nSourceCloudProperties,source_cloud_properties\nSourceCluster,source_cluster\nSourceClusterInfo,source_cluster_info\nSourceClusterNotSupportedFault,source_cluster_not_supported_fault\nSourceCode,source_code\nSourceCodeArchiveUrl,source_code_archive_url\nSourceCodeArtifactsObjectKey,source_code_artifacts_object_key\nSourceCodeRepository,source_code_repository\nSourceCodeType,source_code_type\nSourceCodeUrl,source_code_url\nSourceCodeVersion,source_code_version\nSourceColumn,source_column\nSourceCommit,source_commit\nSourceConfig,source_config\nSourceConfiguration,source_configuration\nSourceConnection,source_connection\nSourceConnectionDetail,source_connection_detail\nSourceConnectionParameters,source_connection_parameters\nSourceConnectorProperties,source_connector_properties\nSourceConnectorType,source_connector_type\nSourceContactId,source_contact_id\nSourceContainer,source_container\nSourceControlDetails,source_control_details\nSourceControls,source_controls\nSourceCredentialsInfo,source_credentials_info\nSourceCustomDbEngineVersionIdentifier,source_custom_db_engine_version_identifier\nSourceDBClusterIdentifier,source_db_cluster_identifier\nSourceDBClusterParameterGroupIdentifier,source_db_cluster_parameter_group_identifier\nSourceDBClusterSnapshotArn,source_db_cluster_snapshot_arn\nSourceDBClusterSnapshotIdentifier,source_db_cluster_snapshot_identifier\nSourceDBInstanceArn,source_db_instance_arn\nSourceDBInstanceAutomatedBackupsArn,source_db_instance_automated_backups_arn\nSourceDBInstanceIdentifier,source_db_instance_identifier\nSourceDBParameterGroupIdentifier,source_db_parameter_group_identifier\nSourceDBSnapshotIdentifier,source_db_snapshot_identifier\nSourceDataColumnProperties,source_data_column_properties\nSourceDataProviderDescriptors,source_data_provider_descriptors\nSourceDatabaseName,source_database_name\nSourceDatabaseNotSupportedFault,source_database_not_supported_fault\nSourceDatasetArn,source_dataset_arn\nSourceDbClusterResourceId,source_db_cluster_resource_id\nSourceDbSnapshotIdentifier,source_db_snapshot_identifier\nSourceDbiResourceId,source_dbi_resource_id\nSourceDescription,source_description\nSourceDestCheck,source_dest_check\nSourceDetail,source_detail\nSourceDetails,source_details\nSourceDirectory,source_directory\nSourceDocument,source_document\nSourceDocuments,source_documents\nSourceDocumentsS3Uri,source_documents_s3_uri\nSourceDomain,source_domain\nSourceDomainInfo,source_domain_info\nSourceEncryptionAlgorithm,source_encryption_algorithm\nSourceEncryptionContext,source_encryption_context\nSourceEndBehavior,source_end_behavior\nSourceEndpointArn,source_endpoint_arn\nSourceEngine,source_engine\nSourceEngineName,source_engine_name\nSourceEngineVersion,source_engine_version\nSourceEntity,source_entity\nSourceEntityArn,source_entity_arn\nSourceEnvironmentId,source_environment_id\nSourceEnvironmentName,source_environment_name\nSourceFailoverConfig,source_failover_config\nSourceField,source_field\nSourceFieldProperties,source_field_properties\nSourceFields,source_fields\nSourceFile,source_file\nSourceFileLocation,source_file_location\nSourceFileOrContentRequiredException,source_file_or_content_required_exception\nSourceFileSpecifier,source_file_specifier\nSourceFileSystemArn,source_file_system_arn\nSourceFileSystemId,source_file_system_id\nSourceFileSystemRegion,source_file_system_region\nSourceFiles,source_files\nSourceFilterId,source_filter_id\nSourceFlowConfig,source_flow_config\nSourceFpgaImageId,source_fpga_image_id\nSourceGroup,source_group\nSourceId,source_id\nSourceIdType,source_id_type\nSourceIdentifier,source_identifier\nSourceIdentity,source_identity\nSourceIds,source_ids\nSourceIdsList,source_ids_list\nSourceImage,source_image\nSourceImageFace,source_image_face\nSourceImageId,source_image_id\nSourceImageName,source_image_name\nSourceImageOrientationCorrection,source_image_orientation_correction\nSourceIp,source_ip\nSourceIpConditionConfig,source_ip_condition_config\nSourceIpConfig,source_ip_config\nSourceIpV4,source_ipv4\nSourceIpV6,source_ipv6\nSourceIpamPoolId,source_ipam_pool_id\nSourceIps,source_ips\nSourceItemsLimit,source_items_limit\nSourceKeyId,source_key_id\nSourceKeyword,source_keyword\nSourceLanguageCode,source_language_code\nSourceLastUpdatedTimestampFormat,source_last_updated_timestamp_format\nSourceLayerArn,source_layer_arn\nSourceLayerHash,source_layer_hash\nSourceLicenseContext,source_license_context\nSourceListenerAddress,source_listener_address\nSourceListenerPort,source_listener_port\nSourceLocation,source_location\nSourceLocationArn,source_location_arn\nSourceLocationName,source_location_name\nSourceMac,source_mac\nSourceMember,source_member\nSourceMetadata,source_metadata\nSourceModelArn,source_model_arn\nSourceModelVariantName,source_model_variant_name\nSourceModelVersionArn,source_model_version_arn\nSourceName,source_name\nSourceNetwork,source_network\nSourceNetworkData,source_network_data\nSourceNetworkInterfaceArns,source_network_interface_arns\nSourceNotFoundFault,source_not_found_fault\nSourceObject,source_object\nSourceObjectReference,source_object_reference\nSourceOptionGroup,source_option_group\nSourceOptionGroupIdentifier,source_option_group_identifier\nSourceParameterName,source_parameter_name\nSourceParameters,source_parameters\nSourceParentId,source_parent_id\nSourceParentNotFoundException,source_parent_not_found_exception\nSourcePath,source_path\nSourcePhoneNumber,source_phone_number\nSourcePipelineExecutionArn,source_pipeline_execution_arn\nSourcePolicyId,source_policy_id\nSourcePolicyType,source_policy_type\nSourcePort,source_port\nSourcePortRange,source_port_range\nSourcePortRanges,source_port_ranges\nSourcePortfolioId,source_portfolio_id\nSourcePorts,source_ports\nSourcePrefix,source_prefix\nSourcePrefixLists,source_prefix_lists\nSourcePriority,source_priority\nSourceProductArn,source_product_arn\nSourceProjectArn,source_project_arn\nSourceProjectVersionArn,source_project_version_arn\nSourceProperties,source_properties\nSourceProvisioningArtifactIdentifiers,source_provisioning_artifact_identifiers\nSourceQueue,source_queue\nSourceRecoveryPointArn,source_recovery_point_arn\nSourceRefContains,source_ref_contains\nSourceRegion,source_region\nSourceRegionMessage,source_region_message\nSourceRegions,source_regions\nSourceRepository,source_repository\nSourceReservedNode,source_reserved_node\nSourceReservedNodeCount,source_reserved_node_count\nSourceReservedNodeId,source_reserved_node_id\nSourceReservedNodeType,source_reserved_node_type\nSourceResourceArn,source_resource_arn\nSourceResourceName,source_resource_name\nSourceResourceType,source_resource_type\nSourceResult,source_result\nSourceRevision,source_revision\nSourceRoleArn,source_role_arn\nSourceS3Location,source_s3_location\nSourceS3Path,source_s3_path\nSourceSchema,source_schema\nSourceSchemaName,source_schema_name\nSourceSecurityGroup,source_security_group\nSourceSecurityGroupName,source_security_group_name\nSourceSecurityGroupOwnerId,source_security_group_owner_id\nSourceSegments,source_segments\nSourceSelectionCriteria,source_selection_criteria\nSourceServer,source_server\nSourceServerActionDocument,source_server_action_document\nSourceServerActionsRequestFilters,source_server_actions_request_filters\nSourceSettings,source_settings\nSourceSheetControlId,source_sheet_control_id\nSourceSnapshotClusterIdentifier,source_snapshot_cluster_identifier\nSourceSnapshotId,source_snapshot_id\nSourceSnapshotIdentifier,source_snapshot_identifier\nSourceSnapshotIds,source_snapshot_ids\nSourceSnapshotName,source_snapshot_name\nSourceStackId,source_stack_id\nSourceTable,source_table\nSourceTableArn,source_table_arn\nSourceTableDetails,source_table_details\nSourceTableFeatureDetails,source_table_feature_details\nSourceTableName,source_table_name\nSourceTemplate,source_template\nSourceText,source_text\nSourceType,source_type\nSourceTypes,source_types\nSourceURI,source_uri\nSourceUpdateToken,source_update_token\nSourceUri,source_uri\nSourceUrl,source_url\nSourceUser,source_user\nSourceUserIdentifier,source_user_identifier\nSourceVersion,source_version\nSourceVolume,source_volume\nSourceVolumeARN,source_volume_arn\nSourceVpc,source_vpc\nSourceWatermarkStatus,source_watermark_status\nSourceWorkspaceId,source_workspace_id\nSources,sources\nSouth,south\nSpace,space\nSpaceArn,space_arn\nSpaceConfiguration,space_configuration\nSpaceDetails,space_details\nSpaceFieldMappings,space_field_mappings\nSpaceName,space_name\nSpaceNameContains,space_name_contains\nSpaceNameEquals,space_name_equals\nSpaceSettings,space_settings\nSpaceSummary,space_summary\nSpaces,spaces\nSpacing,spacing\nSpamCount,spam_count\nSpamPercentage,spam_percentage\nSpamRawCount,spam_raw_count\nSpan,span\nSparkConnectorSource,spark_connector_source\nSparkConnectorTarget,spark_connector_target\nSparkParameters,spark_parameters\nSparkProperties,spark_properties\nSparkSQL,spark_sql\nSparkSqlJobDriver,spark_sql_job_driver\nSparkSubmit,spark_submit\nSparkSubmitJobDriver,spark_submit_job_driver\nSparkline,sparkline\nSparqlData,sparql_data\nSparqlRecord,sparql_record\nSparseTrackType,sparse_track_type\nSpatialAdaptiveQuantization,spatial_adaptive_quantization\nSpatialAq,spatial_aq\nSpatialDataOptionToGeoJsonFunctionName,spatial_data_option_to_geo_json_function_name\nSpatialFilterSettings,spatial_filter_settings\nSpawnRate,spawn_rate\nSpdxLicenseId,spdx_license_id\nSpeaker,speaker\nSpeakerEnrollmentJob,speaker_enrollment_job\nSpeakerEnrollmentJobSummary,speaker_enrollment_job_summary\nSpeakerId,speaker_id\nSpeakerSearchDetails,speaker_search_details\nSpeakerSearchResult,speaker_search_result\nSpeakerSearchStatus,speaker_search_status\nSpeakerSearchTask,speaker_search_task\nSpeakerSearchTaskId,speaker_search_task_id\nSpeakerSearchTaskStatus,speaker_search_task_status\nSpeakerSummaries,speaker_summaries\nSpeakerSummary,speaker_summary\nSpec,spec\nSpecialFeature,special_feature\nSpecialValue,special_value\nSpecialty,specialty\nSpecifedOrder,specifed_order\nSpecification,specification\nSpecifications,specifications\nSpecifiedImage,specified_image\nSpectrumConfig,spectrum_config\nSpeechMarkTypes,speech_mark_types\nSpeechThreshold,speech_threshold\nSpeed,speed\nSpekeKeyProvider,speke_key_provider\nSpekeKeyProviderCmaf,speke_key_provider_cmaf\nSpellCorrectedQueries,spell_corrected_queries\nSpellCorrectedQuery,spell_corrected_query\nSpellCorrectionConfiguration,spell_correction_configuration\nSpend,spend\nSpendCoveredBySavingsPlans,spend_covered_by_savings_plans\nSpendLimit,spend_limit\nSpendLimits,spend_limits\nSpfPercentage,spf_percentage\nSpigot,spigot\nSpliceEventId,splice_event_id\nSpliceInsertMessage,splice_insert_message\nSplit,split\nSplitChargeRules,split_charge_rules\nSplitDocument,split_document\nSplitDocuments,split_documents\nSplitFields,split_fields\nSplitShardInput,split_shard_input\nSplitTunnel,split_tunnel\nSplitType,split_type\nSplunkDestinationConfiguration,splunk_destination_configuration\nSplunkDestinationDescription,splunk_destination_description\nSplunkDestinationUpdate,splunk_destination_update\nSplunkRetryOptions,splunk_retry_options\nSpotAllocationStrategy,spot_allocation_strategy\nSpotCapacityRebalance,spot_capacity_rebalance\nSpotDatafeedSubscription,spot_datafeed_subscription\nSpotFleetLaunchSpecification,spot_fleet_launch_specification\nSpotFleetMonitoring,spot_fleet_monitoring\nSpotFleetRequestConfig,spot_fleet_request_config\nSpotFleetRequestConfigData,spot_fleet_request_config_data\nSpotFleetRequestConfigs,spot_fleet_request_configs\nSpotFleetRequestId,spot_fleet_request_id\nSpotFleetRequestIds,spot_fleet_request_ids\nSpotFleetRequestState,spot_fleet_request_state\nSpotFleetTagSpecification,spot_fleet_tag_specification\nSpotInstancePools,spot_instance_pools\nSpotInstanceRequest,spot_instance_request\nSpotInstanceRequestId,spot_instance_request_id\nSpotInstanceRequestIds,spot_instance_request_ids\nSpotInstanceRequests,spot_instance_requests\nSpotInstanceStateFault,spot_instance_state_fault\nSpotInstanceStatus,spot_instance_status\nSpotInstanceType,spot_instance_type\nSpotMaintenanceStrategies,spot_maintenance_strategies\nSpotMarketOptions,spot_market_options\nSpotMaxPrice,spot_max_price\nSpotMaxPricePercentageOverLowestPrice,spot_max_price_percentage_over_lowest_price\nSpotMaxTotalPrice,spot_max_total_price\nSpotOptions,spot_options\nSpotOptionsRequest,spot_options_request\nSpotPlacement,spot_placement\nSpotPlacementScore,spot_placement_score\nSpotPlacementScores,spot_placement_scores\nSpotPrice,spot_price\nSpotPriceHistory,spot_price_history\nSpotProvisioningSpecification,spot_provisioning_specification\nSpotResizeSpecification,spot_resize_specification\nSpotResizingSpecification,spot_resizing_specification\nSpotSpecification,spot_specification\nSpotTargetCapacity,spot_target_capacity\nSpreadDomain,spread_domain\nSpreadLevel,spread_level\nSql,sql\nSqlAlias,sql_alias\nSqlAliases,sql_aliases\nSqlApplicationConfiguration,sql_application_configuration\nSqlApplicationConfigurationDescription,sql_application_configuration_description\nSqlApplicationConfigurationUpdate,sql_application_configuration_update\nSqlConfiguration,sql_configuration\nSqlEndpointPath,sql_endpoint_path\nSqlInjectionMatchSet,sql_injection_match_set\nSqlInjectionMatchSetId,sql_injection_match_set_id\nSqlInjectionMatchSetSummary,sql_injection_match_set_summary\nSqlInjectionMatchSetUpdate,sql_injection_match_set_update\nSqlInjectionMatchSets,sql_injection_match_sets\nSqlInjectionMatchTuple,sql_injection_match_tuple\nSqlInjectionMatchTuples,sql_injection_match_tuples\nSqlParameter,sql_parameter\nSqlParseException,sql_parse_exception\nSqlQuery,sql_query\nSqlQueryDatasetAction,sql_query_dataset_action\nSqlRunConfiguration,sql_run_configuration\nSqlRunConfigurations,sql_run_configurations\nSqlServerParameters,sql_server_parameters\nSqlStatementResult,sql_statement_result\nSqlType,sql_type\nSqliMatchStatement,sqli_match_statement\nSqls,sqls\nSqsAction,sqs_action\nSqsFailureFeedbackRoleArn,sqs_failure_feedback_role_arn\nSqsParameters,sqs_parameters\nSqsQueueArn,sqs_queue_arn\nSqsQueueConfiguration,sqs_queue_configuration\nSqsQueueParameters,sqs_queue_parameters\nSqsQueueSinkConfiguration,sqs_queue_sink_configuration\nSqsQueueUrl,sqs_queue_url\nSqsSuccessFeedbackRoleArn,sqs_success_feedback_role_arn\nSquash,squash\nSriovNetSupport,sriov_net_support\nSrtDestinationSettings,srt_destination_settings\nSseAwsKmsKeyId,sse_aws_kms_key_id\nSseConfig,sse_config\nSseConfiguration,sse_configuration\nSseDescription,sse_description\nSseKmsEncryptedObjects,sse_kms_encrypted_objects\nSseSpecification,sse_specification\nSseType,sse_type\nSshCiphers,ssh_ciphers\nSshHostDsaKeyFingerprint,ssh_host_dsa_key_fingerprint\nSshHostRsaKeyFingerprint,ssh_host_rsa_key_fingerprint\nSshKexs,ssh_kexs\nSshKey,ssh_key\nSshKeyLastUpdated,ssh_key_last_updated\nSshKeyName,ssh_key_name\nSshMacs,ssh_macs\nSshPublicKey,ssh_public_key\nSshPublicKeyBody,ssh_public_key_body\nSshPublicKeyCount,ssh_public_key_count\nSshPublicKeyId,ssh_public_key_id\nSshPublicKeys,ssh_public_keys\nSshUsername,ssh_username\nSsid,ssid\nSsl,ssl\nSslCaCertificateArn,ssl_ca_certificate_arn\nSslCertificateId,ssl_certificate_id\nSslCertificateS3Path,ssl_certificate_s3_path\nSslClientCertificateArn,ssl_client_certificate_arn\nSslClientKeyArn,ssl_client_key_arn\nSslClientKeyPassword,ssl_client_key_password\nSslConfiguration,ssl_configuration\nSslEndpointIdentificationAlgorithm,ssl_endpoint_identification_algorithm\nSslMode,ssl_mode\nSslPolicies,ssl_policies\nSslPolicy,ssl_policy\nSslProperties,ssl_properties\nSslProtocols,ssl_protocols\nSslSecurityProtocol,ssl_security_protocol\nSslSupportMethod,ssl_support_method\nSsmActionDefinition,ssm_action_definition\nSsmAutomation,ssm_automation\nSsmControls,ssm_controls\nSsmDocument,ssm_document\nSsmOpsItemId,ssm_ops_item_id\nSsmParameterStoreParameter,ssm_parameter_store_parameter\nSsml,ssml\nSsmlList,ssml_list\nSsmlMarksNotSupportedForTextTypeException,ssml_marks_not_supported_for_text_type_exception\nSsoEnabled,sso_enabled\nStable,stable\nStack,stack\nStackArn,stack_arn\nStackConfigInput,stack_config_input\nStackConfigurationManager,stack_configuration_manager\nStackDriftDetectionId,stack_drift_detection_id\nStackDriftInformation,stack_drift_information\nStackDriftInformationSummary,stack_drift_information_summary\nStackDriftStatus,stack_drift_status\nStackError,stack_error\nStackErrors,stack_errors\nStackEvent,stack_event\nStackEvents,stack_events\nStackId,stack_id\nStackIds,stack_ids\nStackIdsUrl,stack_ids_url\nStackInstance,stack_instance\nStackInstanceAccount,stack_instance_account\nStackInstanceComprehensiveStatus,stack_instance_comprehensive_status\nStackInstanceFilter,stack_instance_filter\nStackInstanceNotFoundException,stack_instance_not_found_exception\nStackInstanceRegion,stack_instance_region\nStackInstanceResourceDriftStatuses,stack_instance_resource_drift_statuses\nStackInstanceResourceDriftsSummary,stack_instance_resource_drifts_summary\nStackInstanceStatus,stack_instance_status\nStackInstanceSummary,stack_instance_summary\nStackInstances,stack_instances\nStackName,stack_name\nStackNames,stack_names\nStackNotFoundException,stack_not_found_exception\nStackPolicyBody,stack_policy_body\nStackPolicyDuringUpdateBody,stack_policy_during_update_body\nStackPolicyDuringUpdateURL,stack_policy_during_update_url\nStackPolicyURL,stack_policy_url\nStackResource,stack_resource\nStackResourceDetail,stack_resource_detail\nStackResourceDrift,stack_resource_drift\nStackResourceDriftInformation,stack_resource_drift_information\nStackResourceDriftInformationSummary,stack_resource_drift_information_summary\nStackResourceDriftStatus,stack_resource_drift_status\nStackResourceDriftStatusFilters,stack_resource_drift_status_filters\nStackResourceDrifts,stack_resource_drifts\nStackResourceSummaries,stack_resource_summaries\nStackResourceSummary,stack_resource_summary\nStackResources,stack_resources\nStackSet,stack_set\nStackSetARN,stack_set_arn\nStackSetAccounts,stack_set_accounts\nStackSetDriftDetectionDetails,stack_set_drift_detection_details\nStackSetFailureToleranceCount,stack_set_failure_tolerance_count\nStackSetFailureTolerancePercentage,stack_set_failure_tolerance_percentage\nStackSetId,stack_set_id\nStackSetMaxConcurrencyCount,stack_set_max_concurrency_count\nStackSetMaxConcurrencyPercentage,stack_set_max_concurrency_percentage\nStackSetName,stack_set_name\nStackSetNotEmptyException,stack_set_not_empty_exception\nStackSetNotFoundException,stack_set_not_found_exception\nStackSetOperation,stack_set_operation\nStackSetOperationPreferences,stack_set_operation_preferences\nStackSetOperationResultSummary,stack_set_operation_result_summary\nStackSetOperationStatusDetails,stack_set_operation_status_details\nStackSetOperationSummary,stack_set_operation_summary\nStackSetOperationType,stack_set_operation_type\nStackSetRegions,stack_set_regions\nStackSetSummary,stack_set_summary\nStackStatus,stack_status\nStackStatusFilter,stack_status_filter\nStackStatusReason,stack_status_reason\nStackSummaries,stack_summaries\nStackSummary,stack_summary\nStacks,stacks\nStage,stage\nStageContext,stage_context\nStageDeclaration,stage_declaration\nStageDeployment,stage_deployment\nStageDeploymentDetails,stage_deployment_details\nStageDeploymentSummary,stage_deployment_summary\nStageDeployments,stage_deployments\nStageDetails,stage_details\nStageExecution,stage_execution\nStageId,stage_id\nStageIndex,stage_index\nStageKey,stage_key\nStageLastUpdatedDateTime,stage_last_updated_date_time\nStageName,stage_name\nStageNotFoundException,stage_not_found_exception\nStageNotRetryableException,stage_not_retryable_exception\nStageReason,stage_reason\nStageSession,stage_session\nStageSessionSummary,stage_session_summary\nStageState,stage_state\nStageStatus,stage_status\nStageSummary,stage_summary\nStageVariableOverrides,stage_variable_overrides\nStageVariables,stage_variables\nStages,stages\nStagesAvailable,stages_available\nStaging,staging\nStagingArea,staging_area\nStagingDistributionDnsNames,staging_distribution_dns_names\nStagingDistributionId,staging_distribution_id\nStagingDistributionInUse,staging_distribution_in_use\nStagingSourceServer,staging_source_server\nStagingTable,staging_table\nStairs,stairs\nStaleIpPermission,stale_ip_permission\nStaleIpPermissions,stale_ip_permissions\nStaleIpPermissionsEgress,stale_ip_permissions_egress\nStaleRequestException,stale_request_exception\nStaleSecurityGroup,stale_security_group\nStaleSecurityGroupSet,stale_security_group_set\nStaleTagException,stale_tag_exception\nStandByAvailabilityZoneCount,stand_by_availability_zone_count\nStandard,standard\nStandardErrorContent,standard_error_content\nStandardErrorUrl,standard_error_url\nStandardHlsSettings,standard_hls_settings\nStandardIdentifiers,standard_identifiers\nStandardKnowledgeArticleTypeConfiguration,standard_knowledge_article_type_configuration\nStandardLayout,standard_layout\nStandardMessages,standard_messages\nStandardMetricName,standard_metric_name\nStandardObjectAttachmentConfiguration,standard_object_attachment_configuration\nStandardObjectConfigurations,standard_object_configurations\nStandardOutputContent,standard_output_content\nStandardOutputUrl,standard_output_url\nStandards,standards\nStandardsArn,standards_arn\nStandardsControl,standards_control\nStandardsControlArn,standards_control_arn\nStandardsControlArns,standards_control_arns\nStandardsControlAssociationDetail,standards_control_association_detail\nStandardsControlAssociationDetails,standards_control_association_details\nStandardsControlAssociationId,standards_control_association_id\nStandardsControlAssociationIds,standards_control_association_ids\nStandardsControlAssociationSummaries,standards_control_association_summaries\nStandardsControlAssociationSummary,standards_control_association_summary\nStandardsControlAssociationUpdate,standards_control_association_update\nStandardsControlAssociationUpdates,standards_control_association_updates\nStandardsControlDescription,standards_control_description\nStandardsControlTitle,standards_control_title\nStandardsId,standards_id\nStandardsInput,standards_input\nStandardsManagedBy,standards_managed_by\nStandardsStatus,standards_status\nStandardsStatusReason,standards_status_reason\nStandardsSubscription,standards_subscription\nStandardsSubscriptionArn,standards_subscription_arn\nStandardsSubscriptionArns,standards_subscription_arns\nStandardsSubscriptionRequest,standards_subscription_request\nStandardsSubscriptionRequests,standards_subscription_requests\nStandardsSubscriptions,standards_subscriptions\nStandbyDelayTime,standby_delay_time\nStandbyInstances,standby_instances\nStandbyWorkspace,standby_workspace\nStandbyWorkspaceRequest,standby_workspace_request\nStandbyWorkspaces,standby_workspaces\nStart,start\nStartAccessLoggingInput,start_access_logging_input\nStartActivity,start_activity\nStartActivityStreamRequest,start_activity_stream_request\nStartActivityStreamResponse,start_activity_stream_response\nStartAfter,start_after\nStartAfterDateTime,start_after_date_time\nStartAngle,start_angle\nStartAnnotationImportRequest,start_annotation_import_request\nStartAnnotationImportResponse,start_annotation_import_response\nStartAppAssessmentRequest,start_app_assessment_request\nStartAppAssessmentResponse,start_app_assessment_response\nStartAppBlockBuilderRequest,start_app_block_builder_request\nStartAppBlockBuilderResult,start_app_block_builder_result\nStartAppInput,start_app_input\nStartAppOutput,start_app_output\nStartAppReplicationRequest,start_app_replication_request\nStartApplicationRefreshInput,start_application_refresh_input\nStartApplicationRefreshOutput,start_application_refresh_output\nStartApplicationRequest,start_application_request\nStartArns,start_arns\nStartAssessmentFrameworkShareRequest,start_assessment_framework_share_request\nStartAssessmentFrameworkShareResponse,start_assessment_framework_share_response\nStartAssessmentRequest,start_assessment_request\nStartAssessmentResponse,start_assessment_response\nStartAssessmentRunRequest,start_assessment_run_request\nStartAssessmentRunResponse,start_assessment_run_response\nStartAssetBundleExportJobRequest,start_asset_bundle_export_job_request\nStartAssetBundleExportJobResponse,start_asset_bundle_export_job_response\nStartAssetBundleImportJobRequest,start_asset_bundle_import_job_request\nStartAssetBundleImportJobResponse,start_asset_bundle_import_job_response\nStartAssociationsOnceRequest,start_associations_once_request\nStartAt,start_at\nStartAttachmentUploadRequest,start_attachment_upload_request\nStartAttachmentUploadResponse,start_attachment_upload_response\nStartAuditMitigationActionsTaskRequest,start_audit_mitigation_actions_task_request\nStartAuditMitigationActionsTaskResponse,start_audit_mitigation_actions_task_response\nStartAutomationExecutionRequest,start_automation_execution_request\nStartAutomationExecutionResult,start_automation_execution_result\nStartAvailabilityMonitorTestInput,start_availability_monitor_test_input\nStartAvailabilityMonitorTestOutput,start_availability_monitor_test_output\nStartBackupJobInput,start_backup_job_input\nStartBackupJobOutput,start_backup_job_output\nStartBatchJobRequest,start_batch_job_request\nStartBatchJobResponse,start_batch_job_response\nStartBgpFailoverTestRequest,start_bgp_failover_test_request\nStartBgpFailoverTestResponse,start_bgp_failover_test_response\nStartBillingPeriod,start_billing_period\nStartBlueprintRunRequest,start_blueprint_run_request\nStartBlueprintRunResponse,start_blueprint_run_response\nStartBotRecommendationRequest,start_bot_recommendation_request\nStartBotRecommendationResponse,start_bot_recommendation_response\nStartBuildBatchInput,start_build_batch_input\nStartBuildBatchOutput,start_build_batch_output\nStartBuildInput,start_build_input\nStartBuildOutput,start_build_output\nStartBulkAssociateWirelessDeviceWithMulticastGroupRequest,start_bulk_associate_wireless_device_with_multicast_group_request\nStartBulkDeploymentRequest,start_bulk_deployment_request\nStartBulkDeploymentResponse,start_bulk_deployment_response\nStartBulkDisassociateWirelessDeviceFromMulticastGroupRequest,start_bulk_disassociate_wireless_device_from_multicast_group_request\nStartBy,start_by\nStartCalculationExecutionRequest,start_calculation_execution_request\nStartCalculationExecutionResponse,start_calculation_execution_response\nStartCallAnalyticsJobRequest,start_call_analytics_job_request\nStartCallAnalyticsJobResponse,start_call_analytics_job_response\nStartCallAnalyticsStreamTranscriptionRequest,start_call_analytics_stream_transcription_request\nStartCallAnalyticsStreamTranscriptionResponse,start_call_analytics_stream_transcription_response\nStartCampaignRequest,start_campaign_request\nStartCanaryRequest,start_canary_request\nStartCelebrityRecognitionRequest,start_celebrity_recognition_request\nStartCelebrityRecognitionResponse,start_celebrity_recognition_response\nStartChangeRequestExecutionRequest,start_change_request_execution_request\nStartChangeRequestExecutionResult,start_change_request_execution_result\nStartChangeSetRequest,start_change_set_request\nStartChangeSetResponse,start_change_set_response\nStartChannelRequest,start_channel_request\nStartChannelResponse,start_channel_response\nStartChatContactRequest,start_chat_contact_request\nStartChatContactResponse,start_chat_contact_response\nStartChildWorkflowExecutionDecisionAttributes,start_child_workflow_execution_decision_attributes\nStartChildWorkflowExecutionFailedEventAttributes,start_child_workflow_execution_failed_event_attributes\nStartChildWorkflowExecutionInitiatedEventAttributes,start_child_workflow_execution_initiated_event_attributes\nStartClockInput,start_clock_input\nStartCodegenJobData,start_codegen_job_data\nStartCodegenJobRequest,start_codegen_job_request\nStartCodegenJobResponse,start_codegen_job_response\nStartColumn,start_column\nStartColumnIndex,start_column_index\nStartCommand,start_command\nStartCondition,start_condition\nStartConfigRulesEvaluationRequest,start_config_rules_evaluation_request\nStartConfigurationRecorderRequest,start_configuration_recorder_request\nStartConfigurationSessionRequest,start_configuration_session_request\nStartConfigurationSessionResponse,start_configuration_session_response\nStartConnectionRequest,start_connection_request\nStartConnectionResponse,start_connection_response\nStartContactEvaluationRequest,start_contact_evaluation_request\nStartContactEvaluationResponse,start_contact_evaluation_response\nStartContactRecordingRequest,start_contact_recording_request\nStartContactStreamingRequest,start_contact_streaming_request\nStartContactStreamingResponse,start_contact_streaming_response\nStartContentModerationRequest,start_content_moderation_request\nStartContentModerationResponse,start_content_moderation_response\nStartContentUploadRequest,start_content_upload_request\nStartContentUploadResponse,start_content_upload_response\nStartContinentCode,start_continent_code\nStartContinuousExportResponse,start_continuous_export_response\nStartConversationRequest,start_conversation_request\nStartConversationResponse,start_conversation_response\nStartCopyJobInput,start_copy_job_input\nStartCopyJobOutput,start_copy_job_output\nStartCostEstimationRequest,start_cost_estimation_request\nStartCountryCode,start_country_code\nStartCrawlerRequest,start_crawler_request\nStartCrawlerScheduleRequest,start_crawler_schedule_request\nStartCutoverRequest,start_cutover_request\nStartCutoverResponse,start_cutover_response\nStartDBClusterMessage,start_db_cluster_message\nStartDBClusterResult,start_db_cluster_result\nStartDBInstanceAutomatedBackupsReplicationMessage,start_db_instance_automated_backups_replication_message\nStartDBInstanceAutomatedBackupsReplicationResult,start_db_instance_automated_backups_replication_result\nStartDBInstanceMessage,start_db_instance_message\nStartDBInstanceResult,start_db_instance_result\nStartDICOMImportJobRequest,start_dicom_import_job_request\nStartDICOMImportJobResponse,start_dicom_import_job_response\nStartDashboardSnapshotJobRequest,start_dashboard_snapshot_job_request\nStartDashboardSnapshotJobResponse,start_dashboard_snapshot_job_response\nStartDataCollectionByAgentIdsRequest,start_data_collection_by_agent_ids_request\nStartDataCollectionByAgentIdsResponse,start_data_collection_by_agent_ids_response\nStartDataIngestionJobRequest,start_data_ingestion_job_request\nStartDataIngestionJobResponse,start_data_ingestion_job_response\nStartDataQualityRuleRecommendationRunRequest,start_data_quality_rule_recommendation_run_request\nStartDataQualityRuleRecommendationRunResponse,start_data_quality_rule_recommendation_run_response\nStartDataQualityRulesetEvaluationRunRequest,start_data_quality_ruleset_evaluation_run_request\nStartDataQualityRulesetEvaluationRunResponse,start_data_quality_ruleset_evaluation_run_response\nStartDataSourceSyncJobRequest,start_data_source_sync_job_request\nStartDataSourceSyncJobResponse,start_data_source_sync_job_response\nStartDate,start_date\nStartDateTime,start_date_time\nStartDeliveryStreamEncryptionInput,start_delivery_stream_encryption_input\nStartDeploymentRequest,start_deployment_request\nStartDeploymentResponse,start_deployment_response\nStartDeploymentResult,start_deployment_result\nStartDetectMitigationActionsTaskRequest,start_detect_mitigation_actions_task_request\nStartDetectMitigationActionsTaskResponse,start_detect_mitigation_actions_task_response\nStartDetectorModelAnalysisRequest,start_detector_model_analysis_request\nStartDetectorModelAnalysisResponse,start_detector_model_analysis_response\nStartDevEnvironmentRequest,start_dev_environment_request\nStartDevEnvironmentResponse,start_dev_environment_response\nStartDevEnvironmentSessionRequest,start_dev_environment_session_request\nStartDevEnvironmentSessionResponse,start_dev_environment_session_response\nStartDeviceAuthorizationRequest,start_device_authorization_request\nStartDeviceAuthorizationResponse,start_device_authorization_response\nStartDeviceSyncRequest,start_device_sync_request\nStartDiscovererRequest,start_discoverer_request\nStartDiscovererResponse,start_discoverer_response\nStartDiscoveryJobRequest,start_discovery_job_request\nStartDiscoveryJobResponse,start_discovery_job_response\nStartDocumentAnalysisRequest,start_document_analysis_request\nStartDocumentAnalysisResponse,start_document_analysis_response\nStartDocumentClassificationJobRequest,start_document_classification_job_request\nStartDocumentClassificationJobResponse,start_document_classification_job_response\nStartDocumentTextDetectionRequest,start_document_text_detection_request\nStartDocumentTextDetectionResponse,start_document_text_detection_response\nStartDominantLanguageDetectionJobRequest,start_dominant_language_detection_job_request\nStartDominantLanguageDetectionJobResponse,start_dominant_language_detection_job_response\nStartEarthObservationJobInput,start_earth_observation_job_input\nStartEarthObservationJobOutput,start_earth_observation_job_output\nStartEdgeConfigurationUpdateInput,start_edge_configuration_update_input\nStartEdgeConfigurationUpdateOutput,start_edge_configuration_update_output\nStartEdgeDeploymentStageRequest,start_edge_deployment_stage_request\nStartElasticsearchServiceSoftwareUpdateRequest,start_elasticsearch_service_software_update_request\nStartElasticsearchServiceSoftwareUpdateResponse,start_elasticsearch_service_software_update_response\nStartEngagementRequest,start_engagement_request\nStartEngagementResult,start_engagement_result\nStartEntitiesDetectionJobRequest,start_entities_detection_job_request\nStartEntitiesDetectionJobResponse,start_entities_detection_job_response\nStartEntitiesDetectionV2JobRequest,start_entities_detection_v2_job_request\nStartEntitiesDetectionV2JobResponse,start_entities_detection_v2_job_response\nStartError,start_error\nStartEventDataStoreIngestionRequest,start_event_data_store_ingestion_request\nStartEventTime,start_event_time\nStartEventsDetectionJobRequest,start_events_detection_job_request\nStartEventsDetectionJobResponse,start_events_detection_job_response\nStartExecutionInput,start_execution_input\nStartExecutionOutput,start_execution_output\nStartExpenseAnalysisRequest,start_expense_analysis_request\nStartExpenseAnalysisResponse,start_expense_analysis_response\nStartExperimentRequest,start_experiment_request\nStartExperimentResponse,start_experiment_response\nStartExportLabelsTaskRunRequest,start_export_labels_task_run_request\nStartExportLabelsTaskRunResponse,start_export_labels_task_run_response\nStartExportRequest,start_export_request\nStartExportResponse,start_export_response\nStartExportTaskMessage,start_export_task_message\nStartExportTaskRequest,start_export_task_request\nStartExportTaskResponse,start_export_task_response\nStartExtensionPackAssociationMessage,start_extension_pack_association_message\nStartExtensionPackAssociationResponse,start_extension_pack_association_response\nStartFHIRExportJobRequest,start_fhir_export_job_request\nStartFHIRExportJobResponse,start_fhir_export_job_response\nStartFHIRImportJobRequest,start_fhir_import_job_request\nStartFHIRImportJobResponse,start_fhir_import_job_response\nStartFaceDetectionRequest,start_face_detection_request\nStartFaceDetectionResponse,start_face_detection_response\nStartFaceSearchRequest,start_face_search_request\nStartFaceSearchResponse,start_face_search_response\nStartFailbackLaunchRequest,start_failback_launch_request\nStartFailbackLaunchResponse,start_failback_launch_response\nStartFailed,start_failed\nStartFileTransferRequest,start_file_transfer_request\nStartFileTransferResponse,start_file_transfer_response\nStartFleetActionsInput,start_fleet_actions_input\nStartFleetActionsOutput,start_fleet_actions_output\nStartFleetRequest,start_fleet_request\nStartFlowRequest,start_flow_request\nStartFlowResponse,start_flow_response\nStartFlywheelIterationRequest,start_flywheel_iteration_request\nStartFlywheelIterationResponse,start_flywheel_iteration_response\nStartFrameNumber,start_frame_number\nStartFraudsterRegistrationJobRequest,start_fraudster_registration_job_request\nStartFraudsterRegistrationJobResponse,start_fraudster_registration_job_response\nStartFromRow,start_from_row\nStartFuotaTaskRequest,start_fuota_task_request\nStartGUISessionRequest,start_gui_session_request\nStartGUISessionResult,start_gui_session_result\nStartGameSessionPlacementInput,start_game_session_placement_input\nStartGameSessionPlacementOutput,start_game_session_placement_output\nStartGatewayInput,start_gateway_input\nStartGatewayOutput,start_gateway_output\nStartGeneratedCodeJobRequest,start_generated_code_job_request\nStartGeneratedCodeJobResult,start_generated_code_job_result\nStartHour,start_hour\nStartHourOfDay,start_hour_of_day\nStartHumanLoopRequest,start_human_loop_request\nStartHumanLoopResponse,start_human_loop_response\nStartICD10CMInferenceJobRequest,start_icd10_cm_inference_job_request\nStartICD10CMInferenceJobResponse,start_icd10_cm_inference_job_response\nStartImageBuilderRequest,start_image_builder_request\nStartImageBuilderResult,start_image_builder_result\nStartImagePipelineExecutionRequest,start_image_pipeline_execution_request\nStartImagePipelineExecutionResponse,start_image_pipeline_execution_response\nStartImageScanRequest,start_image_scan_request\nStartImageScanResponse,start_image_scan_response\nStartImportFileTaskRequest,start_import_file_task_request\nStartImportFileTaskResponse,start_import_file_task_response\nStartImportLabelsTaskRunRequest,start_import_labels_task_run_request\nStartImportLabelsTaskRunResponse,start_import_labels_task_run_response\nStartImportRequest,start_import_request\nStartImportResponse,start_import_response\nStartImportTaskRequest,start_import_task_request\nStartImportTaskResponse,start_import_task_response\nStartIncidentInput,start_incident_input\nStartIncidentOutput,start_incident_output\nStartInferenceExperimentRequest,start_inference_experiment_request\nStartInferenceExperimentResponse,start_inference_experiment_response\nStartInferenceSchedulerRequest,start_inference_scheduler_request\nStartInferenceSchedulerResponse,start_inference_scheduler_response\nStartIngestion,start_ingestion\nStartIngestionRequest,start_ingestion_request\nStartInputDeviceMaintenanceWindowRequest,start_input_device_maintenance_window_request\nStartInputDeviceRequest,start_input_device_request\nStartInstanceOnboardingJobRequest,start_instance_onboarding_job_request\nStartInstanceOnboardingJobResponse,start_instance_onboarding_job_response\nStartInstanceRefreshAnswer,start_instance_refresh_answer\nStartInstanceRefreshType,start_instance_refresh_type\nStartInstanceRequest,start_instance_request\nStartInstanceResult,start_instance_result\nStartInstancesRequest,start_instances_request\nStartInstancesResult,start_instances_result\nStartJobRequest,start_job_request\nStartJobResult,start_job_result\nStartJobRunRequest,start_job_run_request\nStartJobRunResponse,start_job_run_response\nStartKeyPhrasesDetectionJobRequest,start_key_phrases_detection_job_request\nStartKeyPhrasesDetectionJobResponse,start_key_phrases_detection_job_response\nStartKeyUsageInput,start_key_usage_input\nStartKeyUsageOutput,start_key_usage_output\nStartLabelDetectionRequest,start_label_detection_request\nStartLabelDetectionResponse,start_label_detection_response\nStartLambdaFunctionFailedEventAttributes,start_lambda_function_failed_event_attributes\nStartLaunchRequest,start_launch_request\nStartLaunchResponse,start_launch_response\nStartLendingAnalysisRequest,start_lending_analysis_request\nStartLendingAnalysisResponse,start_lending_analysis_response\nStartLifecyclePolicyPreviewRequest,start_lifecycle_policy_preview_request\nStartLifecyclePolicyPreviewResponse,start_lifecycle_policy_preview_response\nStartLine,start_line\nStartLoaderJobInput,start_loader_job_input\nStartLoaderJobOutput,start_loader_job_output\nStartLoggingRequest,start_logging_request\nStartLoggingTime,start_logging_time\nStartMLDataProcessingJobInput,start_ml_data_processing_job_input\nStartMLDataProcessingJobOutput,start_ml_data_processing_job_output\nStartMLEvaluationTaskRunRequest,start_ml_evaluation_task_run_request\nStartMLEvaluationTaskRunResponse,start_ml_evaluation_task_run_response\nStartMLLabelingSetGenerationTaskRunRequest,start_ml_labeling_set_generation_task_run_request\nStartMLLabelingSetGenerationTaskRunResponse,start_ml_labeling_set_generation_task_run_response\nStartMLModelTrainingJobInput,start_ml_model_training_job_input\nStartMLModelTrainingJobOutput,start_ml_model_training_job_output\nStartMLModelTransformJobInput,start_ml_model_transform_job_input\nStartMLModelTransformJobOutput,start_ml_model_transform_job_output\nStartMailboxExportJobRequest,start_mailbox_export_job_request\nStartMailboxExportJobResponse,start_mailbox_export_job_response\nStartMaintenanceRequest,start_maintenance_request\nStartMaintenanceResponse,start_maintenance_response\nStartMalwareScanRequest,start_malware_scan_request\nStartMalwareScanResponse,start_malware_scan_response\nStartMatchBackfillInput,start_match_backfill_input\nStartMatchBackfillOutput,start_match_backfill_output\nStartMatchingJobInput,start_matching_job_input\nStartMatchingJobOutput,start_matching_job_output\nStartMatchmakingInput,start_matchmaking_input\nStartMatchmakingOutput,start_matchmaking_output\nStartMedicalStreamTranscriptionRequest,start_medical_stream_transcription_request\nStartMedicalStreamTranscriptionResponse,start_medical_stream_transcription_response\nStartMedicalTranscriptionJobRequest,start_medical_transcription_job_request\nStartMedicalTranscriptionJobResponse,start_medical_transcription_job_response\nStartMeetingTranscriptionRequest,start_meeting_transcription_request\nStartMessageMoveTaskRequest,start_message_move_task_request\nStartMessageMoveTaskResult,start_message_move_task_result\nStartMetadataModelAssessmentMessage,start_metadata_model_assessment_message\nStartMetadataModelAssessmentResponse,start_metadata_model_assessment_response\nStartMetadataModelConversionMessage,start_metadata_model_conversion_message\nStartMetadataModelConversionResponse,start_metadata_model_conversion_response\nStartMetadataModelExportAsScriptMessage,start_metadata_model_export_as_script_message\nStartMetadataModelExportAsScriptResponse,start_metadata_model_export_as_script_response\nStartMetadataModelExportToTargetMessage,start_metadata_model_export_to_target_message\nStartMetadataModelExportToTargetResponse,start_metadata_model_export_to_target_response\nStartMetadataModelImportMessage,start_metadata_model_import_message\nStartMetadataModelImportResponse,start_metadata_model_import_response\nStartMetricStreamsInput,start_metric_streams_input\nStartMigrationMessage,start_migration_message\nStartMigrationRequest,start_migration_request\nStartMigrationResponse,start_migration_response\nStartMigrationWorkflowRequest,start_migration_workflow_request\nStartMigrationWorkflowResponse,start_migration_workflow_response\nStartMinuteOfHour,start_minute_of_hour\nStartMode,start_mode\nStartModelPackagingJobRequest,start_model_packaging_job_request\nStartModelPackagingJobResponse,start_model_packaging_job_response\nStartModelRequest,start_model_request\nStartModelResponse,start_model_response\nStartMonitoringMemberRequest,start_monitoring_member_request\nStartMonitoringMembersRequest,start_monitoring_members_request\nStartMonitoringMembersResponse,start_monitoring_members_response\nStartMonitoringScheduleRequest,start_monitoring_schedule_request\nStartMulticastGroupSessionRequest,start_multicast_group_session_request\nStartMultiplexRequest,start_multiplex_request\nStartMultiplexResponse,start_multiplex_response\nStartNetworkInsightsAccessScopeAnalysisRequest,start_network_insights_access_scope_analysis_request\nStartNetworkInsightsAccessScopeAnalysisResult,start_network_insights_access_scope_analysis_result\nStartNetworkInsightsAnalysisRequest,start_network_insights_analysis_request\nStartNetworkInsightsAnalysisResult,start_network_insights_analysis_result\nStartNetworkResourceUpdateRequest,start_network_resource_update_request\nStartNetworkResourceUpdateResponse,start_network_resource_update_response\nStartNextPendingJobExecutionRequest,start_next_pending_job_execution_request\nStartNextPendingJobExecutionResponse,start_next_pending_job_execution_response\nStartNotebookExecutionInput,start_notebook_execution_input\nStartNotebookExecutionOutput,start_notebook_execution_output\nStartNotebookInstanceInput,start_notebook_instance_input\nStartObjectInput,start_object_input\nStartObjectOutput,start_object_output\nStartOnCreation,start_on_creation\nStartOnDemandAppReplicationRequest,start_on_demand_app_replication_request\nStartOnDemandAuditTaskRequest,start_on_demand_audit_task_request\nStartOnDemandAuditTaskResponse,start_on_demand_audit_task_response\nStartOnDemandReplicationRunRequest,start_on_demand_replication_run_request\nStartOnDemandReplicationRunResponse,start_on_demand_replication_run_response\nStartOrganizationServiceAccessUpdateRequest,start_organization_service_access_update_request\nStartOrganizationServiceAccessUpdateResponse,start_organization_service_access_update_response\nStartOutboundVoiceContactRequest,start_outbound_voice_contact_request\nStartOutboundVoiceContactResponse,start_outbound_voice_contact_response\nStartPHIDetectionJobRequest,start_phi_detection_job_request\nStartPHIDetectionJobResponse,start_phi_detection_job_response\nStartPercentage,start_percentage\nStartPeriod,start_period\nStartPersonTrackingRequest,start_person_tracking_request\nStartPersonTrackingResponse,start_person_tracking_response\nStartPiiEntitiesDetectionJobRequest,start_pii_entities_detection_job_request\nStartPiiEntitiesDetectionJobResponse,start_pii_entities_detection_job_response\nStartPipeRequest,start_pipe_request\nStartPipeResponse,start_pipe_response\nStartPipelineExecutionInput,start_pipeline_execution_input\nStartPipelineExecutionOutput,start_pipeline_execution_output\nStartPipelineExecutionRequest,start_pipeline_execution_request\nStartPipelineExecutionResponse,start_pipeline_execution_response\nStartPipelineReprocessingRequest,start_pipeline_reprocessing_request\nStartPipelineReprocessingResponse,start_pipeline_reprocessing_response\nStartPipelineRequest,start_pipeline_request\nStartPipelineResponse,start_pipeline_response\nStartPolicyGenerationRequest,start_policy_generation_request\nStartPolicyGenerationResponse,start_policy_generation_response\nStartPosition,start_position\nStartProductSubscriptionRequest,start_product_subscription_request\nStartProductSubscriptionResponse,start_product_subscription_response\nStartProjectSessionRequest,start_project_session_request\nStartProjectSessionResponse,start_project_session_response\nStartProjectVersionRequest,start_project_version_request\nStartProjectVersionResponse,start_project_version_response\nStartProtectedQueryInput,start_protected_query_input\nStartProtectedQueryOutput,start_protected_query_output\nStartQueryExecutionInput,start_query_execution_input\nStartQueryExecutionOutput,start_query_execution_output\nStartQueryPlanningRequest,start_query_planning_request\nStartQueryPlanningResponse,start_query_planning_response\nStartQueryRequest,start_query_request\nStartQueryResponse,start_query_response\nStartReadSetActivationJobRequest,start_read_set_activation_job_request\nStartReadSetActivationJobResponse,start_read_set_activation_job_response\nStartReadSetActivationJobSourceItem,start_read_set_activation_job_source_item\nStartReadSetExportJobRequest,start_read_set_export_job_request\nStartReadSetExportJobResponse,start_read_set_export_job_response\nStartReadSetImportJobRequest,start_read_set_import_job_request\nStartReadSetImportJobResponse,start_read_set_import_job_response\nStartReadSetImportJobSourceItem,start_read_set_import_job_source_item\nStartRecommendationReportGenerationRequest,start_recommendation_report_generation_request\nStartRecommendationReportGenerationResponse,start_recommendation_report_generation_response\nStartRecommendationsRequest,start_recommendations_request\nStartRecommendationsRequestEntry,start_recommendations_request_entry\nStartRecommenderRequest,start_recommender_request\nStartRecommenderResponse,start_recommender_response\nStartRecordIdentifier,start_record_identifier\nStartRecordName,start_record_name\nStartRecordType,start_record_type\nStartRecoveryRequest,start_recovery_request\nStartRecoveryRequestSourceServer,start_recovery_request_source_server\nStartRecoveryResponse,start_recovery_response\nStartReferenceImportJobRequest,start_reference_import_job_request\nStartReferenceImportJobResponse,start_reference_import_job_response\nStartReferenceImportJobSourceItem,start_reference_import_job_source_item\nStartRelationalDatabaseRequest,start_relational_database_request\nStartRelationalDatabaseResult,start_relational_database_result\nStartRemediationExecutionRequest,start_remediation_execution_request\nStartRemediationExecutionResponse,start_remediation_execution_response\nStartReplayRequest,start_replay_request\nStartReplayResponse,start_replay_response\nStartReplicationMessage,start_replication_message\nStartReplicationRequest,start_replication_request\nStartReplicationResponse,start_replication_response\nStartReplicationTaskAssessmentMessage,start_replication_task_assessment_message\nStartReplicationTaskAssessmentResponse,start_replication_task_assessment_response\nStartReplicationTaskAssessmentRunMessage,start_replication_task_assessment_run_message\nStartReplicationTaskAssessmentRunResponse,start_replication_task_assessment_run_response\nStartReplicationTaskMessage,start_replication_task_message\nStartReplicationTaskResponse,start_replication_task_response\nStartReplicationTaskType,start_replication_task_type\nStartReplicationType,start_replication_type\nStartReportCreationInput,start_report_creation_input\nStartReportJobInput,start_report_job_input\nStartReportJobOutput,start_report_job_output\nStartRequest,start_request\nStartResourceEvaluationRequest,start_resource_evaluation_request\nStartResourceEvaluationResponse,start_resource_evaluation_response\nStartResourceScanRequest,start_resource_scan_request\nStartRestoreJobInput,start_restore_job_input\nStartRestoreJobOutput,start_restore_job_output\nStartRetrainingSchedulerRequest,start_retraining_scheduler_request\nStartRetrainingSchedulerResponse,start_retraining_scheduler_response\nStartRouteAnalysisRequest,start_route_analysis_request\nStartRouteAnalysisResponse,start_route_analysis_response\nStartRowIndex,start_row_index\nStartRunRequest,start_run_request\nStartRunResponse,start_run_response\nStartRxNormInferenceJobRequest,start_rx_norm_inference_job_request\nStartRxNormInferenceJobResponse,start_rx_norm_inference_job_response\nStartSNOMEDCTInferenceJobRequest,start_snomedct_inference_job_request\nStartSNOMEDCTInferenceJobResponse,start_snomedct_inference_job_response\nStartSavingsPlansPurchaseRecommendationGenerationResponse,start_savings_plans_purchase_recommendation_generation_response\nStartSchemaCreationRequest,start_schema_creation_request\nStartSchemaCreationResponse,start_schema_creation_response\nStartSchemaExtensionRequest,start_schema_extension_request\nStartSchemaExtensionResult,start_schema_extension_result\nStartSchemaMergeRequest,start_schema_merge_request\nStartSchemaMergeResponse,start_schema_merge_response\nStartSegmentDetectionFilters,start_segment_detection_filters\nStartSegmentDetectionRequest,start_segment_detection_request\nStartSegmentDetectionResponse,start_segment_detection_response\nStartSelector,start_selector\nStartSelectorType,start_selector_type\nStartSentimentDetectionJobRequest,start_sentiment_detection_job_request\nStartSentimentDetectionJobResponse,start_sentiment_detection_job_response\nStartServerRequest,start_server_request\nStartServiceSoftwareUpdateRequest,start_service_software_update_request\nStartServiceSoftwareUpdateResponse,start_service_software_update_response\nStartSession,start_session\nStartSessionRequest,start_session_request\nStartSessionResponse,start_session_response\nStartSessionResult,start_session_result\nStartShotDetectionFilter,start_shot_detection_filter\nStartSigningJobParameter,start_signing_job_parameter\nStartSigningJobRequest,start_signing_job_request\nStartSigningJobResponse,start_signing_job_response\nStartSimulationInput,start_simulation_input\nStartSimulationJobBatchRequest,start_simulation_job_batch_request\nStartSimulationJobBatchResponse,start_simulation_job_batch_response\nStartSimulationOutput,start_simulation_output\nStartSingleWirelessDeviceImportTaskRequest,start_single_wireless_device_import_task_request\nStartSingleWirelessDeviceImportTaskResponse,start_single_wireless_device_import_task_response\nStartSmartHomeApplianceDiscoveryRequest,start_smart_home_appliance_discovery_request\nStartSnapshotRequest,start_snapshot_request\nStartSnapshotResponse,start_snapshot_response\nStartSourceNetworkRecoveryRequest,start_source_network_recovery_request\nStartSourceNetworkRecoveryRequestNetworkEntry,start_source_network_recovery_request_network_entry\nStartSourceNetworkRecoveryResponse,start_source_network_recovery_response\nStartSourceNetworkReplicationRequest,start_source_network_replication_request\nStartSourceNetworkReplicationResponse,start_source_network_replication_response\nStartSpeakerEnrollmentJobRequest,start_speaker_enrollment_job_request\nStartSpeakerEnrollmentJobResponse,start_speaker_enrollment_job_response\nStartSpeakerSearchTaskRequest,start_speaker_search_task_request\nStartSpeakerSearchTaskResponse,start_speaker_search_task_response\nStartSpeechSynthesisTaskInput,start_speech_synthesis_task_input\nStartSpeechSynthesisTaskOutput,start_speech_synthesis_task_output\nStartStackRequest,start_stack_request\nStartStageDeploymentRequest,start_stage_deployment_request\nStartStageDeploymentResult,start_stage_deployment_result\nStartStreamEncryptionInput,start_stream_encryption_input\nStartStreamProcessorRequest,start_stream_processor_request\nStartStreamProcessorResponse,start_stream_processor_response\nStartStreamTranscriptionRequest,start_stream_transcription_request\nStartStreamTranscriptionResponse,start_stream_transcription_response\nStartStreamingSessionRequest,start_streaming_session_request\nStartStreamingSessionResponse,start_streaming_session_response\nStartStudioSSOConfigurationRepairRequest,start_studio_sso_configuration_repair_request\nStartStudioSSOConfigurationRepairResponse,start_studio_sso_configuration_repair_response\nStartSubdivisionCode,start_subdivision_code\nStartSuiteRunRequest,start_suite_run_request\nStartSuiteRunResponse,start_suite_run_response\nStartSupportDataExportRequest,start_support_data_export_request\nStartSupportDataExportResult,start_support_data_export_result\nStartSyncExecutionInput,start_sync_execution_input\nStartSyncExecutionOutput,start_sync_execution_output\nStartTableDataImportJobRequest,start_table_data_import_job_request\nStartTableDataImportJobResult,start_table_data_import_job_result\nStartTargetedSentimentDetectionJobRequest,start_targeted_sentiment_detection_job_request\nStartTargetedSentimentDetectionJobResponse,start_targeted_sentiment_detection_job_response\nStartTaskContactRequest,start_task_contact_request\nStartTaskContactResponse,start_task_contact_response\nStartTaskExecutionRequest,start_task_execution_request\nStartTaskExecutionResponse,start_task_execution_response\nStartTaskRequest,start_task_request\nStartTaskResponse,start_task_response\nStartTechnicalCueDetectionFilter,start_technical_cue_detection_filter\nStartTestExecutionRequest,start_test_execution_request\nStartTestExecutionResponse,start_test_execution_response\nStartTestRequest,start_test_request\nStartTestResponse,start_test_response\nStartTestSetGenerationRequest,start_test_set_generation_request\nStartTestSetGenerationResponse,start_test_set_generation_response\nStartTextDetectionFilters,start_text_detection_filters\nStartTextDetectionRequest,start_text_detection_request\nStartTextDetectionResponse,start_text_detection_response\nStartTextTranslationJobRequest,start_text_translation_job_request\nStartTextTranslationJobResponse,start_text_translation_job_response\nStartThingRegistrationTaskRequest,start_thing_registration_task_request\nStartThingRegistrationTaskResponse,start_thing_registration_task_response\nStartTime,start_time\nStartTimeFilter,start_time_filter\nStartTimeInclusive,start_time_inclusive\nStartTimeMillis,start_time_millis\nStartTimeOffset,start_time_offset\nStartTimeRange,start_time_range\nStartTimecode,start_timecode\nStartTimecodeSMPTE,start_timecode_smpte\nStartTimeout,start_timeout\nStartTimerDecisionAttributes,start_timer_decision_attributes\nStartTimerFailedEventAttributes,start_timer_failed_event_attributes\nStartTimestamp,start_timestamp\nStartTimestampMillis,start_timestamp_millis\nStartTopicsDetectionJobRequest,start_topics_detection_job_request\nStartTopicsDetectionJobResponse,start_topics_detection_job_response\nStartTransaction,start_transaction\nStartTransactionRequest,start_transaction_request\nStartTransactionResponse,start_transaction_response\nStartTransactionResult,start_transaction_result\nStartTranscriptionJobRequest,start_transcription_job_request\nStartTranscriptionJobResponse,start_transcription_job_response\nStartTriggerRequest,start_trigger_request\nStartTriggerResponse,start_trigger_response\nStartUrl,start_url\nStartUserAccessTasksRequest,start_user_access_tasks_request\nStartUserAccessTasksResponse,start_user_access_tasks_response\nStartUserImportJobRequest,start_user_import_job_request\nStartUserImportJobResponse,start_user_import_job_response\nStartValue,start_value\nStartVariantImportRequest,start_variant_import_request\nStartVariantImportResponse,start_variant_import_response\nStartVectorEnrichmentJobInput,start_vector_enrichment_job_input\nStartVectorEnrichmentJobOutput,start_vector_enrichment_job_output\nStartViewerSessionRevocationRequest,start_viewer_session_revocation_request\nStartVirtualMachinesMetadataSyncInput,start_virtual_machines_metadata_sync_input\nStartVirtualMachinesMetadataSyncOutput,start_virtual_machines_metadata_sync_output\nStartVoiceToneAnalysisTaskRequest,start_voice_tone_analysis_task_request\nStartVoiceToneAnalysisTaskResponse,start_voice_tone_analysis_task_response\nStartVpcEndpointServicePrivateDnsVerificationRequest,start_vpc_endpoint_service_private_dns_verification_request\nStartVpcEndpointServicePrivateDnsVerificationResult,start_vpc_endpoint_service_private_dns_verification_result\nStartWeekDay,start_week_day\nStartWindowMinutes,start_window_minutes\nStartWirelessDeviceImportTaskRequest,start_wireless_device_import_task_request\nStartWirelessDeviceImportTaskResponse,start_wireless_device_import_task_response\nStartWorkflowExecutionInput,start_workflow_execution_input\nStartWorkflowRunRequest,start_workflow_run_request\nStartWorkflowRunResponse,start_workflow_run_response\nStartWorkspaceRequests,start_workspace_requests\nStartWorkspacesRequest,start_workspaces_request\nStartWorkspacesResult,start_workspaces_result\nStartZonalShiftRequest,start_zonal_shift_request\nStarted,started\nStartedAfter,started_after\nStartedAt,started_at\nStartedBefore,started_before\nStartedBy,started_by\nStartedOn,started_on\nStartedTimestamp,started_timestamp\nStartingAt,starting_at\nStartingBlockIndex,starting_block_index\nStartingEventBatchCondition,starting_event_batch_condition\nStartingHashKey,starting_hash_key\nStartingInstances,starting_instances\nStartingObjectName,starting_object_name\nStartingObjectPrefix,starting_object_prefix\nStartingOffsets,starting_offsets\nStartingPosition,starting_position\nStartingPositionTimestamp,starting_position_timestamp\nStartingSequenceNumber,starting_sequence_number\nStartingTimestamp,starting_timestamp\nStartoverWindowSeconds,startover_window_seconds\nStartsWith,starts_with\nStartupAction,startup_action\nStartupScriptS3ObjectVersion,startup_script_s3_object_version\nStartupScriptS3Path,startup_script_s3_path\nStat,stat\nState,state\nStateChangeConfiguration,state_change_configuration\nStateChangeReason,state_change_reason\nStateDB,state_db\nStateDescription,state_description\nStateEnteredEventDetails,state_entered_event_details\nStateEquals,state_equals\nStateExitedEventDetails,state_exited_event_details\nStateFilter,state_filter\nStateInfo,state_info\nStateLastUpdatedDateTime,state_last_updated_date_time\nStateMachineAliasListItem,state_machine_alias_list_item\nStateMachineAlreadyExists,state_machine_already_exists\nStateMachineArn,state_machine_arn\nStateMachineDeleting,state_machine_deleting\nStateMachineDoesNotExist,state_machine_does_not_exist\nStateMachineLimitExceeded,state_machine_limit_exceeded\nStateMachineListItem,state_machine_list_item\nStateMachineTypeNotSupported,state_machine_type_not_supported\nStateMachineVersionListItem,state_machine_version_list_item\nStateMessage,state_message\nStateOrProvince,state_or_province\nStateOrRegion,state_or_region\nStatePersistence,state_persistence\nStatePersistenceConfigurations,state_persistence_configurations\nStatePersistenceEnabled,state_persistence_enabled\nStateReason,state_reason\nStateReasonCode,state_reason_code\nStateReasonData,state_reason_data\nStateStartTimestamp,state_start_timestamp\nStateTransitionReason,state_transition_reason\nStateTransitionTime,state_transition_time\nStateTransitionedTimestamp,state_transitioned_timestamp\nStateUpdatedTimestamp,state_updated_timestamp\nStateValue,state_value\nStatefulDefaultActions,stateful_default_actions\nStatefulEngineOptions,stateful_engine_options\nStatefulRule,stateful_rule\nStatefulRuleGroup,stateful_rule_group\nStatefulRuleGroupOverride,stateful_rule_group_override\nStatefulRuleGroupReference,stateful_rule_group_reference\nStatefulRuleGroupReferences,stateful_rule_group_references\nStatefulRuleGroups,stateful_rule_groups\nStatefulRuleOptions,stateful_rule_options\nStatefulRules,stateful_rules\nStatelessCustomActionDefinition,stateless_custom_action_definition\nStatelessCustomActions,stateless_custom_actions\nStatelessCustomPublishMetricAction,stateless_custom_publish_metric_action\nStatelessCustomPublishMetricActionDimension,stateless_custom_publish_metric_action_dimension\nStatelessDefaultActions,stateless_default_actions\nStatelessFragmentDefaultActions,stateless_fragment_default_actions\nStatelessRule,stateless_rule\nStatelessRuleGroup,stateless_rule_group\nStatelessRuleGroupReference,stateless_rule_group_reference\nStatelessRuleGroupReferences,stateless_rule_group_references\nStatelessRuleGroups,stateless_rule_groups\nStatelessRules,stateless_rules\nStatelessRulesAndCustomActions,stateless_rules_and_custom_actions\nStatement,statement\nStatementData,statement_data\nStatementId,statement_id\nStatementName,statement_name\nStatementOutput,statement_output\nStatementOutputData,statement_output_data\nStatementTimeoutException,statement_timeout_exception\nStatementType,statement_type\nStatements,statements\nStates,states\nStatesArn,states_arn\nStatesExecutionArn,states_execution_arn\nStatesInput,states_input\nStatesStatus,states_status\nStaticColumn,static_column\nStaticConfiguration,static_configuration\nStaticHyperParameters,static_hyper_parameters\nStaticImageActivateScheduleActionSettings,static_image_activate_schedule_action_settings\nStaticImageActivateSettings,static_image_activate_settings\nStaticImageDeactivateScheduleActionSettings,static_image_deactivate_schedule_action_settings\nStaticImageDeactivateSettings,static_image_deactivate_settings\nStaticIp,static_ip\nStaticIpConnectionInfo,static_ip_connection_info\nStaticKeyProvider,static_key_provider\nStaticKeySettings,static_key_settings\nStaticKeyValue,static_key_value\nStaticMembers,static_members\nStaticPolicyDefinition,static_policy_definition\nStaticPolicyDefinitionDetail,static_policy_definition_detail\nStaticPolicyDefinitionItem,static_policy_definition_item\nStaticRoutesOnly,static_routes_only\nStaticSourcesSupport,static_sources_support\nStaticValue,static_value\nStaticValues,static_values\nStation,station\nStatistic,statistic\nStatisticOverride,statistic_override\nStatisticSet,statistic_set\nStatisticValues,statistic_values\nStatisticalThreshold,statistical_threshold\nStatistics,statistics\nStatisticsConfiguration,statistics_configuration\nStatisticsConfigurations,statistics_configurations\nStatisticsData,statistics_data\nStatisticsNotAvailableException,statistics_not_available_exception\nStatisticsNotReadyYetException,statistics_not_ready_yet_exception\nStatisticsResource,statistics_resource\nStatisticsSummary,statistics_summary\nStatisticsType,statistics_type\nStatmuxSettings,statmux_settings\nStats,stats\nStatsAtAnomaly,stats_at_anomaly\nStatsAtBaseline,stats_at_baseline\nStatsEvent,stats_event\nStatus,status\nStatus2xx,status2xx\nStatus3xx,status3xx\nStatus4xx,status4xx\nStatus5xx,status5xx\nStatusArn,status_arn\nStatusChangeDate,status_change_date\nStatusCode,status_code\nStatusCodes,status_codes\nStatusDescription,status_description\nStatusDetail,status_detail\nStatusDetailFilters,status_detail_filters\nStatusDetails,status_details\nStatusEquals,status_equals\nStatusFilter,status_filter\nStatusFlag,status_flag\nStatusInformation,status_information\nStatusInfos,status_infos\nStatusLastUpdatedDateTime,status_last_updated_date_time\nStatusList,status_list\nStatusMessage,status_message\nStatusMessageCode,status_message_code\nStatusName,status_name\nStatusReason,status_reason\nStatusReasonCode,status_reason_code\nStatusReasons,status_reasons\nStatusReport,status_report\nStatusStartTime,status_start_time\nStatusStartTimestamp,status_start_timestamp\nStatusType,status_type\nStatusUpdateInterval,status_update_interval\nStatusUpdateReason,status_update_reason\nStatuses,statuses\nStdDev,std_dev\nStdErrorS3Uri,std_error_s3_uri\nStdEvent,std_event\nStdOutS3Uri,std_out_s3_uri\nStddev,stddev\nStemmingDictionary,stemming_dictionary\nStep,step\nStepAdjustment,step_adjustment\nStepAdjustments,step_adjustments\nStepAutomationConfiguration,step_automation_configuration\nStepCancellationOption,step_cancellation_option\nStepConcurrencyLevel,step_concurrency_level\nStepConfig,step_config\nStepCount,step_count\nStepDescription,step_description\nStepDetail,step_detail\nStepDetails,step_details\nStepDisplayName,step_display_name\nStepExecution,step_execution\nStepExecutionFilter,step_execution_filter\nStepExecutionId,step_execution_id\nStepExecutionStatusDetail,step_execution_status_detail\nStepExecutions,step_executions\nStepExecutionsTruncated,step_executions_truncated\nStepFunctionStateMachineParameters,step_function_state_machine_parameters\nStepFunctions,step_functions\nStepFunctionsAction,step_functions_action\nStepId,step_id\nStepIds,step_ids\nStepIndex,step_index\nStepInfo,step_info\nStepName,step_name\nStepOutput,step_output\nStepScalingPolicyConfiguration,step_scaling_policy_configuration\nStepSize,step_size\nStepStateChangeReason,step_state_change_reason\nStepStates,step_states\nStepStatus,step_status\nStepSummary,step_summary\nStepTimeline,step_timeline\nStepType,step_type\nSteps,steps\nStepsCompleted,steps_completed\nStepsList,steps_list\nStereoDownmix,stereo_downmix\nStillContainsLinksException,still_contains_links_exception\nStillEstimating,still_estimating\nStillWaitingResponseSpecification,still_waiting_response_specification\nStopAccessLoggingInput,stop_access_logging_input\nStopAction,stop_action\nStopActivityStreamRequest,stop_activity_stream_request\nStopActivityStreamResponse,stop_activity_stream_response\nStopAppBlockBuilderRequest,stop_app_block_builder_request\nStopAppBlockBuilderResult,stop_app_block_builder_result\nStopAppInput,stop_app_input\nStopAppReplicationRequest,stop_app_replication_request\nStopApplicationRequest,stop_application_request\nStopAssessmentRequest,stop_assessment_request\nStopAssessmentRunRequest,stop_assessment_run_request\nStopAutoMLJobRequest,stop_auto_ml_job_request\nStopAutomationExecutionRequest,stop_automation_execution_request\nStopBackupJobInput,stop_backup_job_input\nStopBgpFailoverTestRequest,stop_bgp_failover_test_request\nStopBgpFailoverTestResponse,stop_bgp_failover_test_response\nStopBotRecommendationRequest,stop_bot_recommendation_request\nStopBotRecommendationResponse,stop_bot_recommendation_response\nStopBuildBatchInput,stop_build_batch_input\nStopBuildBatchOutput,stop_build_batch_output\nStopBuildInput,stop_build_input\nStopBuildOutput,stop_build_output\nStopBulkDeploymentRequest,stop_bulk_deployment_request\nStopCalculationExecutionRequest,stop_calculation_execution_request\nStopCalculationExecutionResponse,stop_calculation_execution_response\nStopCampaignRequest,stop_campaign_request\nStopCanaryRequest,stop_canary_request\nStopChannelRequest,stop_channel_request\nStopChannelResponse,stop_channel_response\nStopClockInput,stop_clock_input\nStopCompilationJobRequest,stop_compilation_job_request\nStopConfigurationRecorderRequest,stop_configuration_recorder_request\nStopContactRecordingRequest,stop_contact_recording_request\nStopContactRequest,stop_contact_request\nStopContactStreamingRequest,stop_contact_streaming_request\nStopContinuousExportRequest,stop_continuous_export_request\nStopContinuousExportResponse,stop_continuous_export_response\nStopCrawlerRequest,stop_crawler_request\nStopCrawlerScheduleRequest,stop_crawler_schedule_request\nStopDBClusterMessage,stop_db_cluster_message\nStopDBClusterResult,stop_db_cluster_result\nStopDBInstanceAutomatedBackupsReplicationMessage,stop_db_instance_automated_backups_replication_message\nStopDBInstanceAutomatedBackupsReplicationResult,stop_db_instance_automated_backups_replication_result\nStopDBInstanceMessage,stop_db_instance_message\nStopDBInstanceResult,stop_db_instance_result\nStopDataCollectionByAgentIdsRequest,stop_data_collection_by_agent_ids_request\nStopDataCollectionByAgentIdsResponse,stop_data_collection_by_agent_ids_response\nStopDataSourceSyncJobRequest,stop_data_source_sync_job_request\nStopDate,stop_date\nStopDeliveryStreamEncryptionInput,stop_delivery_stream_encryption_input\nStopDeploymentInput,stop_deployment_input\nStopDeploymentOutput,stop_deployment_output\nStopDeploymentRequest,stop_deployment_request\nStopDevEnvironmentRequest,stop_dev_environment_request\nStopDevEnvironmentResponse,stop_dev_environment_response\nStopDevEnvironmentSessionRequest,stop_dev_environment_session_request\nStopDevEnvironmentSessionResponse,stop_dev_environment_session_response\nStopDiscovererRequest,stop_discoverer_request\nStopDiscovererResponse,stop_discoverer_response\nStopDiscoveryJobRequest,stop_discovery_job_request\nStopDominantLanguageDetectionJobRequest,stop_dominant_language_detection_job_request\nStopDominantLanguageDetectionJobResponse,stop_dominant_language_detection_job_response\nStopEarthObservationJobInput,stop_earth_observation_job_input\nStopEdgeDeploymentStageRequest,stop_edge_deployment_stage_request\nStopEdgePackagingJobRequest,stop_edge_packaging_job_request\nStopEngagementRequest,stop_engagement_request\nStopEntitiesDetectionJobRequest,stop_entities_detection_job_request\nStopEntitiesDetectionJobResponse,stop_entities_detection_job_response\nStopEntitiesDetectionV2JobRequest,stop_entities_detection_v2_job_request\nStopEntitiesDetectionV2JobResponse,stop_entities_detection_v2_job_response\nStopEventDataStoreIngestionRequest,stop_event_data_store_ingestion_request\nStopEventsDetectionJobRequest,stop_events_detection_job_request\nStopEventsDetectionJobResponse,stop_events_detection_job_response\nStopExecutionInput,stop_execution_input\nStopExecutionOutput,stop_execution_output\nStopExecutionTrigger,stop_execution_trigger\nStopExperimentRequest,stop_experiment_request\nStopExperimentResponse,stop_experiment_response\nStopFailbackRequest,stop_failback_request\nStopFailed,stop_failed\nStopFleetActionsInput,stop_fleet_actions_input\nStopFleetActionsOutput,stop_fleet_actions_output\nStopFleetRequest,stop_fleet_request\nStopFlowRequest,stop_flow_request\nStopFlowResponse,stop_flow_response\nStopGUISessionRequest,stop_gui_session_request\nStopGUISessionResult,stop_gui_session_result\nStopGameSessionPlacementInput,stop_game_session_placement_input\nStopGameSessionPlacementOutput,stop_game_session_placement_output\nStopHumanLoopRequest,stop_human_loop_request\nStopHyperParameterTuningJobRequest,stop_hyper_parameter_tuning_job_request\nStopICD10CMInferenceJobRequest,stop_icd10_cm_inference_job_request\nStopICD10CMInferenceJobResponse,stop_icd10_cm_inference_job_response\nStopImageBuilderRequest,stop_image_builder_request\nStopImageBuilderResult,stop_image_builder_result\nStopImportRequest,stop_import_request\nStopImportResponse,stop_import_response\nStopInferenceExperimentRequest,stop_inference_experiment_request\nStopInferenceExperimentResponse,stop_inference_experiment_response\nStopInferenceRecommendationsJobRequest,stop_inference_recommendations_job_request\nStopInferenceSchedulerRequest,stop_inference_scheduler_request\nStopInferenceSchedulerResponse,stop_inference_scheduler_response\nStopIngestionRequest,stop_ingestion_request\nStopInputDeviceRequest,stop_input_device_request\nStopInstanceOnIdleRequest,stop_instance_on_idle_request\nStopInstanceRequest,stop_instance_request\nStopInstanceResult,stop_instance_result\nStopInstancesRequest,stop_instances_request\nStopInstancesResult,stop_instances_result\nStopJobOnFailureOptions,stop_job_on_failure_options\nStopJobOnFailureTiming,stop_job_on_failure_timing\nStopJobRequest,stop_job_request\nStopJobResult,stop_job_result\nStopJobRunRequest,stop_job_run_request\nStopJobRunResponse,stop_job_run_response\nStopKeyPhrasesDetectionJobRequest,stop_key_phrases_detection_job_request\nStopKeyPhrasesDetectionJobResponse,stop_key_phrases_detection_job_response\nStopKeyUsageInput,stop_key_usage_input\nStopKeyUsageOutput,stop_key_usage_output\nStopLabelingJobRequest,stop_labeling_job_request\nStopLaunchRequest,stop_launch_request\nStopLaunchResponse,stop_launch_response\nStopLoggingRequest,stop_logging_request\nStopLoggingTime,stop_logging_time\nStopMatchmakingInput,stop_matchmaking_input\nStopMeetingTranscriptionRequest,stop_meeting_transcription_request\nStopMetricStreamsInput,stop_metric_streams_input\nStopMigrationWorkflowRequest,stop_migration_workflow_request\nStopMigrationWorkflowResponse,stop_migration_workflow_response\nStopModelCustomizationJobRequest,stop_model_customization_job_request\nStopModelRequest,stop_model_request\nStopModelResponse,stop_model_response\nStopMonitoringMembersRequest,stop_monitoring_members_request\nStopMonitoringMembersResponse,stop_monitoring_members_response\nStopMonitoringScheduleRequest,stop_monitoring_schedule_request\nStopMultiplexRequest,stop_multiplex_request\nStopMultiplexResponse,stop_multiplex_response\nStopNotebookExecutionInput,stop_notebook_execution_input\nStopNotebookInstanceInput,stop_notebook_instance_input\nStopPHIDetectionJobRequest,stop_phi_detection_job_request\nStopPHIDetectionJobResponse,stop_phi_detection_job_response\nStopPiiEntitiesDetectionJobRequest,stop_pii_entities_detection_job_request\nStopPiiEntitiesDetectionJobResponse,stop_pii_entities_detection_job_response\nStopPipeRequest,stop_pipe_request\nStopPipeResponse,stop_pipe_response\nStopPipelineExecutionInput,stop_pipeline_execution_input\nStopPipelineExecutionOutput,stop_pipeline_execution_output\nStopPipelineExecutionRequest,stop_pipeline_execution_request\nStopPipelineExecutionResponse,stop_pipeline_execution_response\nStopPipelineRequest,stop_pipeline_request\nStopPipelineResponse,stop_pipeline_response\nStopProcessingJobRequest,stop_processing_job_request\nStopProductSubscriptionRequest,stop_product_subscription_request\nStopProductSubscriptionResponse,stop_product_subscription_response\nStopProjectVersionRequest,stop_project_version_request\nStopProjectVersionResponse,stop_project_version_response\nStopQueryExecutionInput,stop_query_execution_input\nStopQueryRequest,stop_query_request\nStopQueryResponse,stop_query_response\nStopReason,stop_reason\nStopRecommenderRequest,stop_recommender_request\nStopRecommenderResponse,stop_recommender_response\nStopRelationalDatabaseRequest,stop_relational_database_request\nStopRelationalDatabaseResult,stop_relational_database_result\nStopRemoteAccessSessionRequest,stop_remote_access_session_request\nStopRemoteAccessSessionResult,stop_remote_access_session_result\nStopReplicationMessage,stop_replication_message\nStopReplicationRequest,stop_replication_request\nStopReplicationResponse,stop_replication_response\nStopReplicationTaskMessage,stop_replication_task_message\nStopReplicationTaskResponse,stop_replication_task_response\nStopReplicationToReplicaRequest,stop_replication_to_replica_request\nStopReplicationToReplicaResponse,stop_replication_to_replica_response\nStopRequest,stop_request\nStopResourceRequest,stop_resource_request\nStopRetrainingSchedulerRequest,stop_retraining_scheduler_request\nStopRetrainingSchedulerResponse,stop_retraining_scheduler_response\nStopRunRequest,stop_run_request\nStopRunResult,stop_run_result\nStopRxNormInferenceJobRequest,stop_rx_norm_inference_job_request\nStopRxNormInferenceJobResponse,stop_rx_norm_inference_job_response\nStopSNOMEDCTInferenceJobRequest,stop_snomedct_inference_job_request\nStopSNOMEDCTInferenceJobResponse,stop_snomedct_inference_job_response\nStopSelector,stop_selector\nStopSentimentDetectionJobRequest,stop_sentiment_detection_job_request\nStopSentimentDetectionJobResponse,stop_sentiment_detection_job_response\nStopServerRequest,stop_server_request\nStopSessionRequest,stop_session_request\nStopSessionResponse,stop_session_response\nStopSimulationInput,stop_simulation_input\nStopSolutionVersionCreationRequest,stop_solution_version_creation_request\nStopSourceNetworkReplicationRequest,stop_source_network_replication_request\nStopSourceNetworkReplicationResponse,stop_source_network_replication_response\nStopSpeakerSearchTaskRequest,stop_speaker_search_task_request\nStopStackRequest,stop_stack_request\nStopStackSetOperationInput,stop_stack_set_operation_input\nStopStreamEncryptionInput,stop_stream_encryption_input\nStopStreamProcessorRequest,stop_stream_processor_request\nStopStreamRequest,stop_stream_request\nStopStreamingSessionRequest,stop_streaming_session_request\nStopStreamingSessionResponse,stop_streaming_session_response\nStopSuiteRunRequest,stop_suite_run_request\nStopTargetedSentimentDetectionJobRequest,stop_targeted_sentiment_detection_job_request\nStopTargetedSentimentDetectionJobResponse,stop_targeted_sentiment_detection_job_response\nStopTaskRequest,stop_task_request\nStopTaskResponse,stop_task_response\nStopTextTranslationJobRequest,stop_text_translation_job_request\nStopTextTranslationJobResponse,stop_text_translation_job_response\nStopThingRegistrationTaskRequest,stop_thing_registration_task_request\nStopTime,stop_time\nStopTimecode,stop_timecode\nStopTimeout,stop_timeout\nStopTimestamp,stop_timestamp\nStopTrainingDocumentClassifierRequest,stop_training_document_classifier_request\nStopTrainingEntityRecognizerRequest,stop_training_entity_recognizer_request\nStopTrainingJobRequest,stop_training_job_request\nStopTransformJobRequest,stop_transform_job_request\nStopTriggerRequest,stop_trigger_request\nStopTriggerResponse,stop_trigger_response\nStopUserImportJobRequest,stop_user_import_job_request\nStopUserImportJobResponse,stop_user_import_job_response\nStopVectorEnrichmentJobInput,stop_vector_enrichment_job_input\nStopVoiceToneAnalysisTaskRequest,stop_voice_tone_analysis_task_request\nStopWorkflowRunRequest,stop_workflow_run_request\nStopWorkspaceRequests,stop_workspace_requests\nStopWorkspacesRequest,stop_workspaces_request\nStopWorkspacesResult,stop_workspaces_result\nStopped,stopped\nStoppedActions,stopped_actions\nStoppedSince,stopped_since\nStopping,stopping\nStoppingCondition,stopping_condition\nStoppingConditions,stopping_conditions\nStoppingInstances,stopping_instances\nStops,stops\nStopwords,stopwords\nStorage,storage\nStorageAllocatedInBytes,storage_allocated_in_bytes\nStorageCapacity,storage_capacity\nStorageCapacityQuotaGiB,storage_capacity_quota_gib\nStorageCapacityReservationGiB,storage_capacity_reservation_gib\nStorageCapacityUnits,storage_capacity_units\nStorageClass,storage_class\nStorageClassAnalysis,storage_class_analysis\nStorageClassAnalysisDataExport,storage_class_analysis_data_export\nStorageConfig,storage_config\nStorageConfigs,storage_configs\nStorageConfiguration,storage_configuration\nStorageConnector,storage_connector\nStorageConnectors,storage_connectors\nStorageDescriptor,storage_descriptor\nStorageEfficiencyEnabled,storage_efficiency_enabled\nStorageEncrypted,storage_encrypted\nStorageGB,storage_gb\nStorageGatewayError,storage_gateway_error\nStorageInfo,storage_info\nStorageIops,storage_iops\nStorageJobId,storage_job_id\nStorageLensArn,storage_lens_arn\nStorageLensAwsOrg,storage_lens_aws_org\nStorageLensConfiguration,storage_lens_configuration\nStorageLensConfigurationList,storage_lens_configuration_list\nStorageLensDataExport,storage_lens_data_export\nStorageLensDataExportEncryption,storage_lens_data_export_encryption\nStorageLensTag,storage_lens_tag\nStorageLimit,storage_limit\nStorageLimitExceededException,storage_limit_exceeded_exception\nStorageLimitWillExceedException,storage_limit_will_exceed_exception\nStorageLocation,storage_location\nStorageMetrics,storage_metrics\nStorageMode,storage_mode\nStorageOptimizer,storage_optimizer\nStorageOptimizerConfig,storage_optimizer_config\nStorageOptimizerList,storage_optimizer_list\nStorageOptimizerType,storage_optimizer_type\nStorageQuotaExceededFault,storage_quota_exceeded_fault\nStorageResolution,storage_resolution\nStorageRule,storage_rule\nStorageRuleType,storage_rule_type\nStorageSize,storage_size\nStorageSubTypeName,storage_sub_type_name\nStorageSystemArn,storage_system_arn\nStorageSystemListEntry,storage_system_list_entry\nStorageSystems,storage_systems\nStorageThroughput,storage_throughput\nStorageThroughputToIopsRatio,storage_throughput_to_iops_ratio\nStorageTier,storage_tier\nStorageType,storage_type\nStorageTypeLimit,storage_type_limit\nStorageTypeLimits,storage_type_limits\nStorageTypeName,storage_type_name\nStorageTypeNotAvailableFault,storage_type_not_available_fault\nStorageTypeNotSupportedFault,storage_type_not_supported_fault\nStorageTypes,storage_types\nStorageUnit,storage_unit\nStorageUtilizedInBytes,storage_utilized_in_bytes\nStorageVirtualMachine,storage_virtual_machine\nStorageVirtualMachineArn,storage_virtual_machine_arn\nStorageVirtualMachineFilter,storage_virtual_machine_filter\nStorageVirtualMachineId,storage_virtual_machine_id\nStorageVirtualMachineIds,storage_virtual_machine_ids\nStorageVirtualMachineNotFound,storage_virtual_machine_not_found\nStorageVirtualMachineRoot,storage_virtual_machine_root\nStorageVirtualMachines,storage_virtual_machines\nStorageVolumeType,storage_volume_type\nStoreImageTaskResult,store_image_task_result\nStoreImageTaskResults,store_image_task_results\nStoreTaskFailureReason,store_task_failure_reason\nStoreTaskState,store_task_state\nStoredAsSubDirectories,stored_as_sub_directories\nStoredQuery,stored_query\nStoredQueryMetadata,stored_query_metadata\nStorediSCSIVolume,storedi_scsi_volume\nStorediSCSIVolumes,storedi_scsi_volumes\nStrategy,strategy\nStrategyConfig,strategy_config\nStrategyOnFullSize,strategy_on_full_size\nStrategyOption,strategy_option\nStrategySummary,strategy_summary\nStream,stream\nStreamARN,stream_arn\nStreamArn,stream_arn\nStreamChannelDefinition,stream_channel_definition\nStreamConfiguration,stream_configuration\nStreamConfigurationCreate,stream_configuration_create\nStreamConfigurationSessionBackup,stream_configuration_session_backup\nStreamConfigurationSessionStorage,stream_configuration_session_storage\nStreamCreationTimestamp,stream_creation_timestamp\nStreamDescription,stream_description\nStreamDescriptionSummary,stream_description_summary\nStreamEdgeConfigurationNotFoundException,stream_edge_configuration_not_found_exception\nStreamEnabled,stream_enabled\nStreamEncryption,stream_encryption\nStreamEvent,stream_event\nStreamExceptionPolicy,stream_exception_policy\nStreamFile,stream_file\nStreamFilters,stream_filters\nStreamId,stream_id\nStreamInfResolution,stream_inf_resolution\nStreamInfo,stream_info\nStreamInfoList,stream_info_list\nStreamJournalToKinesisRequest,stream_journal_to_kinesis_request\nStreamJournalToKinesisResponse,stream_journal_to_kinesis_response\nStreamKey,stream_key\nStreamKeySummary,stream_key_summary\nStreamLabel,stream_label\nStreamManifestBehavior,stream_manifest_behavior\nStreamMode,stream_mode\nStreamModeDetails,stream_mode_details\nStreamName,stream_name\nStreamNameCondition,stream_name_condition\nStreamNames,stream_names\nStreamOrder,stream_order\nStreamProcessingStartSelector,stream_processing_start_selector\nStreamProcessingStopSelector,stream_processing_stop_selector\nStreamProcessor,stream_processor\nStreamProcessorArn,stream_processor_arn\nStreamProcessorDataSharingPreference,stream_processor_data_sharing_preference\nStreamProcessorInput,stream_processor_input\nStreamProcessorNotificationChannel,stream_processor_notification_channel\nStreamProcessorOutput,stream_processor_output\nStreamProcessorSettings,stream_processor_settings\nStreamProcessorSettingsForUpdate,stream_processor_settings_for_update\nStreamProcessors,stream_processors\nStreamRecord,stream_record\nStreamRecordsNotFoundException,stream_records_not_found_exception\nStreamSelection,stream_selection\nStreamSession,stream_session\nStreamSessionSummary,stream_session_summary\nStreamSpecification,stream_specification\nStreamStatus,stream_status\nStreamSummaries,stream_summaries\nStreamSummary,stream_summary\nStreamType,stream_type\nStreamUnavailable,stream_unavailable\nStreamUrl,stream_url\nStreamView,stream_view\nStreamViewType,stream_view_type\nStreamingConfiguration,streaming_configuration\nStreamingConfigurations,streaming_configurations\nStreamingDataPreviewOptions,streaming_data_preview_options\nStreamingDistribution,streaming_distribution\nStreamingDistributionAlreadyExists,streaming_distribution_already_exists\nStreamingDistributionConfig,streaming_distribution_config\nStreamingDistributionConfigWithTags,streaming_distribution_config_with_tags\nStreamingDistributionList,streaming_distribution_list\nStreamingDistributionNotDisabled,streaming_distribution_not_disabled\nStreamingDistributionSummary,streaming_distribution_summary\nStreamingEndpointArn,streaming_endpoint_arn\nStreamingExperienceSettings,streaming_experience_settings\nStreamingId,streaming_id\nStreamingImage,streaming_image\nStreamingImageEncryptionConfiguration,streaming_image_encryption_configuration\nStreamingLoggingConfig,streaming_logging_config\nStreamingNotificationTarget,streaming_notification_target\nStreamingNotificationTargets,streaming_notification_targets\nStreamingOptions,streaming_options\nStreamingSession,streaming_session\nStreamingSessionBackup,streaming_session_backup\nStreamingSessionStorageRoot,streaming_session_storage_root\nStreamingSessionStream,streaming_session_stream\nStreamingStatus,streaming_status\nStreamingURL,streaming_url\nStreams,streams\nStreet,street\nStreet1,street1\nStreet2,street2\nStreet3,street3\nStreetAddress,street_address\nStreetInfo,street_info\nStreetNumber,street_number\nStrength,strength\nStrictTransportSecurity,strict_transport_security\nStringAttributeConstraints,string_attribute_constraints\nStringAttributeConstraintsType,string_attribute_constraints_type\nStringColumnStatisticsData,string_column_statistics_data\nStringCondition,string_condition\nStringDatasetParameter,string_dataset_parameter\nStringDatasetParameterDefaultValues,string_dataset_parameter_default_values\nStringDefaultValues,string_default_values\nStringEquals,string_equals\nStringFilter,string_filter\nStringFormatConfiguration,string_format_configuration\nStringLike,string_like\nStringListValue,string_list_value\nStringListValues,string_list_values\nStringNotEquals,string_not_equals\nStringNotLike,string_not_like\nStringParameter,string_parameter\nStringParameterDeclaration,string_parameter_declaration\nStringParameters,string_parameters\nStringReference,string_reference\nStringStaticValues,string_static_values\nStringValue,string_value\nStringValueList,string_value_list\nStringValueWhenUnsetConfiguration,string_value_when_unset_configuration\nStringValues,string_values\nStripeSizeBytes,stripe_size_bytes\nStrongKeyProtectionRequired,strong_key_protection_required\nStructValue,struct_value\nStructuredLogDestinations,structured_log_destinations\nStudio,studio\nStudioArn,studio_arn\nStudioComponent,studio_component\nStudioComponentInitializationScript,studio_component_initialization_script\nStudioComponentSummary,studio_component_summary\nStudioEncryptionConfiguration,studio_encryption_configuration\nStudioId,studio_id\nStudioLifecycleConfigAppType,studio_lifecycle_config_app_type\nStudioLifecycleConfigArn,studio_lifecycle_config_arn\nStudioLifecycleConfigContent,studio_lifecycle_config_content\nStudioLifecycleConfigDetails,studio_lifecycle_config_details\nStudioLifecycleConfigName,studio_lifecycle_config_name\nStudioLifecycleConfigs,studio_lifecycle_configs\nStudioMembership,studio_membership\nStudioSummary,studio_summary\nStudios,studios\nStyle,style\nStyleConfiguration,style_configuration\nStyleControl,style_control\nStyleOptions,style_options\nStylePassthrough,style_passthrough\nStyleTargets,style_targets\nSubBands,sub_bands\nSubChannelId,sub_channel_id\nSubChannelSummary,sub_channel_summary\nSubChannels,sub_channels\nSubDomain,sub_domain\nSubDomainSetting,sub_domain_setting\nSubErrorCode,sub_error_code\nSubErrorCodeReason,sub_error_code_reason\nSubExpressions,sub_expressions\nSubJobMetadata,sub_job_metadata\nSubModule,sub_module\nSubRegion,sub_region\nSubResourceSummary,sub_resource_summary\nSubResources,sub_resources\nSubSegmentNum,sub_segment_num\nSubSegmentsExpected,sub_segments_expected\nSubSlotSetting,sub_slot_setting\nSubSlotTypeComposition,sub_slot_type_composition\nSubSlotValueElicitationSetting,sub_slot_value_elicitation_setting\nSubStages,sub_stages\nSubStatementData,sub_statement_data\nSubStatements,sub_statements\nSubType,sub_type\nSubTypeCountLimitExceededException,sub_type_count_limit_exceeded_exception\nSubTypeName,sub_type_name\nSubdirectory,subdirectory\nSubdivision,subdivision\nSubdivisionCode,subdivision_code\nSubdivisionName,subdivision_name\nSubgopLength,subgop_length\nSubject,subject\nSubjectAlternativeNameMatchers,subject_alternative_name_matchers\nSubjectAlternativeNameSummaries,subject_alternative_name_summaries\nSubjectAlternativeNames,subject_alternative_names\nSubjectDetail,subject_detail\nSubjectDetailResponse,subject_detail_response\nSubjectFromWebIdentityToken,subject_from_web_identity_token\nSubjectId,subject_id\nSubjectInformationAccess,subject_information_access\nSubjectKey,subject_key\nSubjectNameFlags,subject_name_flags\nSubjectNameFlagsV2,subject_name_flags_v2\nSubjectNameFlagsV3,subject_name_flags_v3\nSubjectNameFlagsV4,subject_name_flags_v4\nSubjectPart,subject_part\nSubjectStructure,subject_structure\nSubjectSummary,subject_summary\nSubjectType,subject_type\nSubmissionDateTime,submission_date_time\nSubmitAttachmentStateChangesRequest,submit_attachment_state_changes_request\nSubmitAttachmentStateChangesResponse,submit_attachment_state_changes_response\nSubmitContactEvaluationRequest,submit_contact_evaluation_request\nSubmitContactEvaluationResponse,submit_contact_evaluation_response\nSubmitContainerStateChangeRequest,submit_container_state_change_request\nSubmitContainerStateChangeResponse,submit_container_state_change_response\nSubmitFeedbackRequest,submit_feedback_request\nSubmitJobRequest,submit_job_request\nSubmitJobResponse,submit_job_response\nSubmitMultiRegionAccessPointRoutesRequest,submit_multi_region_access_point_routes_request\nSubmitTaskStateChangeRequest,submit_task_state_change_request\nSubmitTaskStateChangeResponse,submit_task_state_change_response\nSubmitTime,submit_time\nSubmitTimeAfter,submit_time_after\nSubmitTimeBefore,submit_time_before\nSubmitTimeMillis,submit_time_millis\nSubmittedAfter,submitted_after\nSubmittedAfterTime,submitted_after_time\nSubmittedAt,submitted_at\nSubmittedBefore,submitted_before\nSubmittedBeforeTime,submitted_before_time\nSubmittedDate,submitted_date\nSubmittedJobsCount,submitted_jobs_count\nSubmittedSince,submitted_since\nSubmittedTime,submitted_time\nSubnet,subnet\nSubnetAlreadyInUse,subnet_already_in_use\nSubnetArn,subnet_arn\nSubnetArns,subnet_arns\nSubnetAssociation,subnet_association\nSubnetAvailabilityZone,subnet_availability_zone\nSubnetAvailabilityZoneId,subnet_availability_zone_id\nSubnetChangeProtection,subnet_change_protection\nSubnetCidrBlockState,subnet_cidr_block_state\nSubnetCidrReservation,subnet_cidr_reservation\nSubnetCidrReservationId,subnet_cidr_reservation_id\nSubnetConfiguration,subnet_configuration\nSubnetConfigurations,subnet_configurations\nSubnetGroup,subnet_group\nSubnetGroupAlreadyExistsFault,subnet_group_already_exists_fault\nSubnetGroupIdentifier,subnet_group_identifier\nSubnetGroupInUseFault,subnet_group_in_use_fault\nSubnetGroupName,subnet_group_name\nSubnetGroupNames,subnet_group_names\nSubnetGroupNotFoundFault,subnet_group_not_found_fault\nSubnetGroupQuotaExceededFault,subnet_group_quota_exceeded_fault\nSubnetGroupStatus,subnet_group_status\nSubnetGroups,subnet_groups\nSubnetIPAddressLimitReachedException,subnet_ip_address_limit_reached_exception\nSubnetId,subnet_id\nSubnetIdList,subnet_id_list\nSubnetIdUpdates,subnet_id_updates\nSubnetIdentifier,subnet_identifier\nSubnetIds,subnet_ids\nSubnetInUse,subnet_in_use\nSubnetIpv4CidrReservations,subnet_ipv4_cidr_reservations\nSubnetIpv6CidrBlockAssociation,subnet_ipv6_cidr_block_association\nSubnetIpv6CidrReservations,subnet_ipv6_cidr_reservations\nSubnetMapping,subnet_mapping\nSubnetMappings,subnet_mappings\nSubnetMask,subnet_mask\nSubnetNotAllowedFault,subnet_not_allowed_fault\nSubnetNotFound,subnet_not_found\nSubnetNotFoundException,subnet_not_found_exception\nSubnetOfMatches,subnet_of_matches\nSubnetOutpost,subnet_outpost\nSubnetOutpostArn,subnet_outpost_arn\nSubnetQuotaExceededFault,subnet_quota_exceeded_fault\nSubnetRouteTable,subnet_route_table\nSubnetStatus,subnet_status\nSubnets,subnets\nSubscribeInput,subscribe_input\nSubscribePattern,subscribe_pattern\nSubscribeRequest,subscribe_request\nSubscribeResponse,subscribe_response\nSubscribeResult,subscribe_result\nSubscribeToDatasetRequest,subscribe_to_dataset_request\nSubscribeToEventRequest,subscribe_to_event_request\nSubscribeToShardEvent,subscribe_to_shard_event\nSubscribeToShardInput,subscribe_to_shard_input\nSubscribeToShardOutput,subscribe_to_shard_output\nSubscribedAt,subscribed_at\nSubscribedDomain,subscribed_domain\nSubscribedDomains,subscribed_domains\nSubscribedRuleGroupSummary,subscribed_rule_group_summary\nSubscribedWorkteam,subscribed_workteam\nSubscribedWorkteams,subscribed_workteams\nSubscriber,subscriber\nSubscriberResource,subscriber_resource\nSubscribers,subscribers\nSubscription,subscription\nSubscriptionAlreadyExistFault,subscription_already_exist_fault\nSubscriptionArn,subscription_arn\nSubscriptionArnList,subscription_arn_list\nSubscriptionCategoryNotFoundFault,subscription_category_not_found_fault\nSubscriptionCreatedDateTime,subscription_created_date_time\nSubscriptionCreationTime,subscription_creation_time\nSubscriptionDefinitionId,subscription_definition_id\nSubscriptionDefinitionVersion,subscription_definition_version\nSubscriptionDefinitionVersionArn,subscription_definition_version_arn\nSubscriptionDefinitionVersionId,subscription_definition_version_id\nSubscriptionEndDate,subscription_end_date\nSubscriptionErrors,subscription_errors\nSubscriptionEventIdNotFoundFault,subscription_event_id_not_found_fault\nSubscriptionExpiryDate,subscription_expiry_date\nSubscriptionFilter,subscription_filter\nSubscriptionId,subscription_id\nSubscriptionLimitExceededException,subscription_limit_exceeded_exception\nSubscriptionLimits,subscription_limits\nSubscriptionName,subscription_name\nSubscriptionNotFoundFault,subscription_not_found_fault\nSubscriptionSeverityNotFoundFault,subscription_severity_not_found_fault\nSubscriptionStartDate,subscription_start_date\nSubscriptionState,subscription_state\nSubscriptionStatus,subscription_status\nSubscriptionType,subscription_type\nSubscriptions,subscriptions\nSubstatementType,substatement_type\nSubstitutionMap,substitution_map\nSubstitutions,substitutions\nSubstring,substring\nSubsystemId,subsystem_id\nSubsystemVendorId,subsystem_vendor_id\nSubtitle,subtitle\nSubtitleFileUris,subtitle_file_uris\nSubtitles,subtitles\nSubtitlesOutput,subtitles_output\nSubtitlingType,subtitling_type\nSubtotalOptions,subtotal_options\nSubtype,subtype\nSucceeded,succeeded\nSucceededActions,succeeded_actions\nSucceededCount,succeeded_count\nSuccess,success\nSuccessCodes,success_codes\nSuccessCount,success_count\nSuccessForeground,success_foreground\nSuccessRedirectionURL,success_redirection_url\nSuccessResponseHandlingConfig,success_response_handling_config\nSuccessRetentionPeriodInDays,success_retention_period_in_days\nSuccessSteps,success_steps\nSuccessStrings,success_strings\nSuccessTopic,success_topic\nSuccessValues,success_values\nSuccesses,successes\nSuccessful,successful\nSuccessfulCampaignStateResponse,successful_campaign_state_response\nSuccessfulEndpointCount,successful_endpoint_count\nSuccessfulFleetCancellations,successful_fleet_cancellations\nSuccessfulFleetDeletions,successful_fleet_deletions\nSuccessfulFleetRequests,successful_fleet_requests\nSuccessfulInstanceCreditSpecificationItem,successful_instance_credit_specification_item\nSuccessfulInstanceCreditSpecifications,successful_instance_credit_specifications\nSuccessfulLoginAttempts,successful_login_attempts\nSuccessfulPackageVersionInfo,successful_package_version_info\nSuccessfulQueuedPurchaseDeletion,successful_queued_purchase_deletion\nSuccessfulQueuedPurchaseDeletions,successful_queued_purchase_deletions\nSuccessfulRequest,successful_request\nSuccessfulResponse,successful_response\nSuccessfulShares,successful_shares\nSuccessfulSubmissions,successful_submissions\nSuccessfullyAssociatedResources,successfully_associated_resources\nSuccessfullyDeletedLaunchTemplateVersions,successfully_deleted_launch_template_versions\nSuccessfullyDisassociatedResources,successfully_disassociated_resources\nSuffix,suffix\nSuggestModel,suggest_model\nSuggestRequest,suggest_request\nSuggestResponse,suggest_response\nSuggestStatus,suggest_status\nSuggestable,suggestable\nSuggestableConfig,suggestable_config\nSuggestableConfigList,suggestable_config_list\nSuggestedAccounts,suggested_accounts\nSuggestedFix,suggested_fix\nSuggestedPresentationDelaySeconds,suggested_presentation_delay_seconds\nSuggestedQueryText,suggested_query_text\nSuggester,suggester\nSuggesterName,suggester_name\nSuggesterNames,suggester_names\nSuggesterStatus,suggester_status\nSuggesters,suggesters\nSuggestion,suggestion\nSuggestionAttributes,suggestion_attributes\nSuggestionCount,suggestion_count\nSuggestionHighlight,suggestion_highlight\nSuggestionMatch,suggestion_match\nSuggestionQuery,suggestion_query\nSuggestionTextWithHighlights,suggestion_text_with_highlights\nSuggestionTypes,suggestion_types\nSuggestionValue,suggestion_value\nSuggestions,suggestions\nSuggestionsList,suggestions_list\nSuite,suite\nSuiteDefinitionConfiguration,suite_definition_configuration\nSuiteDefinitionInformation,suite_definition_information\nSuiteRunConfiguration,suite_run_configuration\nSuiteRunInformation,suite_run_information\nSum,sum\nSumByAccount,sum_by_account\nSumByDataSource,sum_by_data_source\nSumByFeature,sum_by_feature\nSumByResource,sum_by_resource\nSummaries,summaries\nSummarizationAttributes,summarization_attributes\nSummarizedAttackVector,summarized_attack_vector\nSummarizedCounter,summarized_counter\nSummary,summary\nSummaryFields,summary_fields\nSummaryItems,summary_items\nSummaryList,summary_list\nSummaryMap,summary_map\nSummaryStatistics,summary_statistics\nSunday,sunday\nSunglasses,sunglasses\nSupernetOfMatches,supernet_of_matches\nSupersededTemplates,superseded_templates\nSuperuserParameters,superuser_parameters\nSupplementalCategories,supplemental_categories\nSupplementalImps,supplemental_imps\nSupplementalSettings,supplemental_settings\nSupplementaryFeature,supplementary_feature\nSupplementaryFeatures,supplementary_features\nSupportDescription,support_description\nSupportEmail,support_email\nSupportLevel,support_level\nSupportLink,support_link\nSupportLowFramerateInputs,support_low_framerate_inputs\nSupportUrl,support_url\nSupported,supported\nSupportedActivityStreamModes,supported_activity_stream_modes\nSupportedAddonList,supported_addon_list\nSupportedArchitectures,supported_architectures\nSupportedBootModes,supported_boot_modes\nSupportedCACertificateIdentifiers,supported_ca_certificate_identifiers\nSupportedCharacterSets,supported_character_sets\nSupportedCompressionTypes,supported_compression_types\nSupportedContentTypes,supported_content_types\nSupportedDPUSizes,supported_dpu_sizes\nSupportedDeploymentModes,supported_deployment_modes\nSupportedEndpointType,supported_endpoint_type\nSupportedEndpointTypes,supported_endpoint_types\nSupportedEngineModes,supported_engine_modes\nSupportedEngineVersions,supported_engine_versions\nSupportedEngines,supported_engines\nSupportedFeatureNames,supported_feature_names\nSupportedFeatures,supported_features\nSupportedFieldTypeDetails,supported_field_type_details\nSupportedFilters,supported_filters\nSupportedGatewayCapacities,supported_gateway_capacities\nSupportedHardwareType,supported_hardware_type\nSupportedHour,supported_hour\nSupportedHyperParameters,supported_hyper_parameters\nSupportedIdentityProviders,supported_identity_providers\nSupportedInputModes,supported_input_modes\nSupportedInstanceType,supported_instance_type\nSupportedInstanceTypes,supported_instance_types\nSupportedIpAddressTypes,supported_ip_address_types\nSupportedLanguage,supported_language\nSupportedLicenses,supported_licenses\nSupportedLoadBalancerTypes,supported_load_balancer_types\nSupportedLoginProviders,supported_login_providers\nSupportedMajorVersions,supported_major_versions\nSupportedMessagingContentTypes,supported_messaging_content_types\nSupportedNcharCharacterSets,supported_nchar_character_sets\nSupportedNetworkTypes,supported_network_types\nSupportedOperation,supported_operation\nSupportedOperations,supported_operations\nSupportedPermissionTypes,supported_permission_types\nSupportedPhoneNumberTypes,supported_phone_number_types\nSupportedPlatform,supported_platform\nSupportedPlatforms,supported_platforms\nSupportedProductConfig,supported_product_config\nSupportedProducts,supported_products\nSupportedRealtimeInferenceInstanceTypes,supported_realtime_inference_instance_types\nSupportedResourceType,supported_resource_type\nSupportedResponseMIMETypes,supported_response_mime_types\nSupportedRootDeviceTypes,supported_root_device_types\nSupportedStorage,supported_storage\nSupportedStorageFilter,supported_storage_filter\nSupportedStrategies,supported_strategies\nSupportedTierList,supported_tier_list\nSupportedTimezones,supported_timezones\nSupportedTrainingInstanceTypes,supported_training_instance_types\nSupportedTransformInstanceTypes,supported_transform_instance_types\nSupportedTuningJobObjectiveMetrics,supported_tuning_job_objective_metrics\nSupportedUplinkGbps,supported_uplink_gbps\nSupportedUsageClasses,supported_usage_classes\nSupportedVersions,supported_versions\nSupportedVirtualizationTypes,supported_virtualization_types\nSupportingAccessPoint,supporting_access_point\nSupportingInsights,supporting_insights\nSupports32BitFCnt,supports32_bit_f_cnt\nSupportsBabelfish,supports_babelfish\nSupportsCDC,supports_cdc\nSupportsCertificateRotationWithoutRestart,supports_certificate_rotation_without_restart\nSupportsClassB,supports_class_b\nSupportsClassC,supports_class_c\nSupportsClusters,supports_clusters\nSupportsDBInstanceAutomatedBackupsReplication,supports_db_instance_automated_backups_replication\nSupportsDistributedTraining,supports_distributed_training\nSupportsEnhancedMonitoring,supports_enhanced_monitoring\nSupportsGlobalDatabases,supports_global_databases\nSupportsIAMDatabaseAuthentication,supports_iam_database_authentication\nSupportsIops,supports_iops\nSupportsJoin,supports_join\nSupportsKerberosAuthentication,supports_kerberos_authentication\nSupportsLinking,supports_linking\nSupportsLocalWriteForwarding,supports_local_write_forwarding\nSupportsLogExportsToCloudwatchLogs,supports_log_exports_to_cloudwatch_logs\nSupportsOptionVersionDowngrade,supports_option_version_downgrade\nSupportsParallelQuery,supports_parallel_query\nSupportsPerformanceInsights,supports_performance_insights\nSupportsReadReplica,supports_read_replica\nSupportsStorageAutoscaling,supports_storage_autoscaling\nSupportsStorageEncryption,supports_storage_encryption\nSupportsStorageThroughput,supports_storage_throughput\nSuppressDataIdentifier,suppress_data_identifier\nSuppressedDestination,suppressed_destination\nSuppressedDestinationAttributes,suppressed_destination_attributes\nSuppressedDestinationSummaries,suppressed_destination_summaries\nSuppressedDestinationSummary,suppressed_destination_summary\nSuppressedLinesOfCodeCount,suppressed_lines_of_code_count\nSuppressedReasons,suppressed_reasons\nSuppressionAttributes,suppression_attributes\nSuppressionListDestination,suppression_list_destination\nSuppressionListImportAction,suppression_list_import_action\nSuppressionOptions,suppression_options\nSurname,surname\nSurroundExMode,surround_ex_mode\nSurroundMode,surround_mode\nSurroundTrim,surround_trim\nSuspendActions,suspend_actions\nSuspendContactRecordingRequest,suspend_contact_recording_request\nSuspendGameServerGroupInput,suspend_game_server_group_input\nSuspendGameServerGroupOutput,suspend_game_server_group_output\nSuspendedActions,suspended_actions\nSuspendedCause,suspended_cause\nSuspendedDate,suspended_date\nSuspendedProcess,suspended_process\nSuspendedProcesses,suspended_processes\nSuspendedState,suspended_state\nSuspensionReason,suspension_reason\nSustainedClockSpeedInGhz,sustained_clock_speed_in_ghz\nSvmActiveDirectoryConfiguration,svm_active_directory_configuration\nSvmAdminPassword,svm_admin_password\nSvmEndpoint,svm_endpoint\nSvmEndpoints,svm_endpoints\nSvmName,svm_name\nSvmUuid,svm_uuid\nSwapEnvironmentCNAMEsMessage,swap_environment_cnames_message\nSwappiness,swappiness\nSwitchRunningMode,switch_running_mode\nSwitchover,switchover\nSwitchoverBlueGreenDeploymentRequest,switchover_blue_green_deployment_request\nSwitchoverBlueGreenDeploymentResponse,switchover_blue_green_deployment_response\nSwitchoverDetail,switchover_detail\nSwitchoverDetails,switchover_details\nSwitchoverGlobalClusterMessage,switchover_global_cluster_message\nSwitchoverGlobalClusterResult,switchover_global_cluster_result\nSwitchoverReadReplicaMessage,switchover_read_replica_message\nSwitchoverReadReplicaResult,switchover_read_replica_result\nSwitchoverTimeout,switchover_timeout\nSybaseSettings,sybase_settings\nSymbol,symbol\nSymbolicLink,symbolic_link\nSymmetricEncryptionAttributes,symmetric_encryption_attributes\nSyncBlocker,sync_blocker\nSyncBlockerContext,sync_blocker_context\nSyncCompliance,sync_compliance\nSyncConfig,sync_config\nSyncCount,sync_count\nSyncCreatedTime,sync_created_time\nSyncDeploymentJobRequest,sync_deployment_job_request\nSyncDeploymentJobResponse,sync_deployment_job_response\nSyncFormat,sync_format\nSyncJobStatus,sync_job_status\nSyncJobSummary,sync_job_summary\nSyncLastModifiedTime,sync_last_modified_time\nSyncName,sync_name\nSyncResourceRequest,sync_resource_request\nSyncResourceResponse,sync_resource_response\nSyncResourceStatus,sync_resource_status\nSyncResourceSummary,sync_resource_summary\nSyncSessionToken,sync_session_token\nSyncSessionsCount,sync_sessions_count\nSyncShadow,sync_shadow\nSyncSource,sync_source\nSyncState,sync_state\nSyncStates,sync_states\nSyncStatus,sync_status\nSyncThreshold,sync_threshold\nSyncType,sync_type\nSynchronizationStatus,synchronization_status\nSynonymRuleCount,synonym_rule_count\nSynonyms,synonyms\nSyntax,syntax\nSyntaxToken,syntax_token\nSyntaxTokens,syntax_tokens\nSynthesisTask,synthesis_task\nSynthesisTaskNotFoundException,synthesis_task_not_found_exception\nSynthesisTasks,synthesis_tasks\nSynthesizeSpeechInput,synthesize_speech_input\nSynthesizeSpeechOutput,synthesize_speech_output\nSyslogIp,syslog_ip\nSystem,system\nSystemControl,system_control\nSystemControls,system_controls\nSystemEvent,system_event\nSystemId,system_id\nSystemIds,system_ids\nSystemInfo,system_info\nSystemInstanceDescription,system_instance_description\nSystemInstanceFilter,system_instance_filter\nSystemInstanceSummary,system_instance_summary\nSystemResourceLimits,system_resource_limits\nSystemStatus,system_status\nSystemSuggestedValue,system_suggested_value\nSystemTemplateDescription,system_template_description\nSystemTemplateFilter,system_template_filter\nSystemTemplateSummary,system_template_summary\nSystemType,system_type\nSystemsManagerAgent,systems_manager_agent\nTCPFlagField,tcp_flag_field\nTCPFlags,tcp_flags\nTERMINATING,terminating\nTFIMetricDataPoint,tfi_metric_data_point\nTFIModelPerformance,tfi_model_performance\nTFITrainingMetricsValue,tfi_training_metrics_value\nTGWOnDeviceService,tgw_on_device_service\nTGWOnDeviceServiceConfiguration,tgw_on_device_service_configuration\nTLDRulesViolation,tld_rules_violation\nTLEData,tle_data\nTLEEphemeris,tle_ephemeris\nTLSEnabled,tls_enabled\nTLSInspectionConfiguration,tls_inspection_configuration\nTLSInspectionConfigurationArn,tls_inspection_configuration_arn\nTLSInspectionConfigurationId,tls_inspection_configuration_id\nTLSInspectionConfigurationMetadata,tls_inspection_configuration_metadata\nTLSInspectionConfigurationName,tls_inspection_configuration_name\nTLSInspectionConfigurationResponse,tls_inspection_configuration_response\nTLSInspectionConfigurationStatus,tls_inspection_configuration_status\nTLSInspectionConfigurations,tls_inspection_configurations\nTLSSecurityPolicy,tls_security_policy\nTTL,ttl\nTable,table\nTableAggregatedFieldWells,table_aggregated_field_wells\nTableAlreadyExistsException,table_already_exists_exception\nTableArn,table_arn\nTableAutoScalingDescription,table_auto_scaling_description\nTableBorderOptions,table_border_options\nTableCatalogId,table_catalog_id\nTableCell,table_cell\nTableCellConditionalFormatting,table_cell_conditional_formatting\nTableCellImageScalingConfiguration,table_cell_image_scaling_configuration\nTableCellImageSizingConfiguration,table_cell_image_sizing_configuration\nTableCellStyle,table_cell_style\nTableClass,table_class\nTableClassOverride,table_class_override\nTableClassSummary,table_class_summary\nTableColumn,table_column\nTableConditionalFormatting,table_conditional_formatting\nTableConditionalFormattingOption,table_conditional_formatting_option\nTableConfiguration,table_configuration\nTableCount,table_count\nTableCreationDateTime,table_creation_date_time\nTableCreationParameters,table_creation_parameters\nTableData,table_data\nTableDataImportJobMetadata,table_data_import_job_metadata\nTableDescription,table_description\nTableError,table_error\nTableExcerpt,table_excerpt\nTableFieldCustomIconContent,table_field_custom_icon_content\nTableFieldCustomTextContent,table_field_custom_text_content\nTableFieldImageConfiguration,table_field_image_configuration\nTableFieldLinkConfiguration,table_field_link_configuration\nTableFieldLinkContentConfiguration,table_field_link_content_configuration\nTableFieldOption,table_field_option\nTableFieldOptions,table_field_options\nTableFieldURLConfiguration,table_field_url_configuration\nTableFieldWells,table_field_wells\nTableFormat,table_format\nTableId,table_id\nTableIdentifier,table_identifier\nTableInUseException,table_in_use_exception\nTableInlineVisualization,table_inline_visualization\nTableInlineVisualizations,table_inline_visualizations\nTableInput,table_input\nTableLFTagPolicy,table_lf_tag_policy\nTableLFTagPolicyAndPermissions,table_lf_tag_policy_and_permissions\nTableLimitExceededFault,table_limit_exceeded_fault\nTableList,table_list\nTableLocation,table_location\nTableMappings,table_mappings\nTableMaxReadCapacityUnits,table_max_read_capacity_units\nTableMaxWriteCapacityUnits,table_max_write_capacity_units\nTableMember,table_member\nTableMetadata,table_metadata\nTableMetadataList,table_metadata_list\nTableName,table_name\nTableNameUpdate,table_name_update\nTableNames,table_names\nTableNotFoundException,table_not_found_exception\nTableObject,table_object\nTableOptions,table_options\nTablePaginatedReportOptions,table_paginated_report_options\nTablePattern,table_pattern\nTablePinnedFieldOptions,table_pinned_field_options\nTablePrefix,table_prefix\nTableResource,table_resource\nTableRestoreNotFoundFault,table_restore_not_found_fault\nTableRestoreRequestId,table_restore_request_id\nTableRestoreStatus,table_restore_status\nTableRestoreStatusDetails,table_restore_status_details\nTableRestoreStatusMessage,table_restore_status_message\nTableRow,table_row\nTableRowConditionalFormatting,table_row_conditional_formatting\nTableSchema,table_schema\nTableSideBorderOptions,table_side_border_options\nTableSizeBytes,table_size_bytes\nTableSortConfiguration,table_sort_configuration\nTableState,table_state\nTableStatistics,table_statistics\nTableStatus,table_status\nTableStyleTarget,table_style_target\nTableSummary,table_summary\nTableToReload,table_to_reload\nTableType,table_type\nTableUnaggregatedFieldWells,table_unaggregated_field_wells\nTableVersion,table_version\nTableVersionError,table_version_error\nTableVersions,table_versions\nTableVisual,table_visual\nTableWildcard,table_wildcard\nTableWithColumns,table_with_columns\nTableWithColumnsResource,table_with_columns_resource\nTables,tables\nTablesCreated,tables_created\nTablesDeleted,tables_deleted\nTablesErrored,tables_errored\nTablesLoaded,tables_loaded\nTablesLoading,tables_loading\nTablesQueued,tables_queued\nTablesToDelete,tables_to_delete\nTablesToReload,tables_to_reload\nTablesUpdated,tables_updated\nTabularConditions,tabular_conditions\nTabularJobConfig,tabular_job_config\nTabularResolvedAttributes,tabular_resolved_attributes\nTac,tac\nTag,tag\nTagAttendeeRequest,tag_attendee_request\nTagCertificateAuthorityRequest,tag_certificate_authority_request\nTagCollection,tag_collection\nTagCollectionFilter,tag_collection_filter\nTagColumnOperation,tag_column_operation\nTagCondition,tag_condition\nTagCostEstimationResourceCollectionFilter,tag_cost_estimation_resource_collection_filter\nTagCount,tag_count\nTagCriterionForJob,tag_criterion_for_job\nTagCriterionPairForJob,tag_criterion_pair_for_job\nTagDeliveryStreamInput,tag_delivery_stream_input\nTagDescription,tag_description\nTagDescriptions,tag_descriptions\nTagException,tag_exception\nTagFilter,tag_filter\nTagFilters,tag_filters\nTagHealth,tag_health\nTagInfoForResource,tag_info_for_resource\nTagInput,tag_input\nTagInstanceProfileRequest,tag_instance_profile_request\nTagKey,tag_key\nTagKeyFilters,tag_key_filters\nTagKeyList,tag_key_list\nTagKeyOnly,tag_key_only\nTagKeyScope,tag_key_scope\nTagKeys,tag_keys\nTagKeysListRequiredException,tag_keys_list_required_exception\nTagLimitExceededException,tag_limit_exceeded_exception\nTagLimitExceededFault,tag_limit_exceeded_fault\nTagList,tag_list\nTagListEntry,tag_list_entry\nTagListMessage,tag_list_message\nTagLogGroupRequest,tag_log_group_request\nTagMFADeviceRequest,tag_mfa_device_request\nTagMeetingRequest,tag_meeting_request\nTagMultiValueDelimiter,tag_multi_value_delimiter\nTagNames,tag_names\nTagNotFoundFault,tag_not_found_fault\nTagOpenIDConnectProviderRequest,tag_open_id_connect_provider_request\nTagOperationException,tag_operation_exception\nTagOptionDetail,tag_option_detail\nTagOptionDetails,tag_option_details\nTagOptionId,tag_option_id\nTagOptionNotMigratedException,tag_option_not_migrated_exception\nTagOptionSummary,tag_option_summary\nTagOptions,tag_options\nTagOutput,tag_output\nTagPolicyException,tag_policy_exception\nTagPolicyRequest,tag_policy_request\nTagPolicyViolationException,tag_policy_violation_exception\nTagProjectRequest,tag_project_request\nTagProjectResult,tag_project_result\nTagQueryConfiguration,tag_query_configuration\nTagQueueRequest,tag_queue_request\nTagQuotaPerResourceExceeded,tag_quota_per_resource_exceeded\nTagRef,tag_ref\nTagRequiredException,tag_required_exception\nTagResourceInput,tag_resource_input\nTagResourceOutput,tag_resource_output\nTagResourceRequest,tag_resource_request\nTagResourceResponse,tag_resource_response\nTagResourceResult,tag_resource_result\nTagResourcesInput,tag_resources_input\nTagResourcesOutput,tag_resources_output\nTagRestrictedResources,tag_restricted_resources\nTagRoleRequest,tag_role_request\nTagRuleConfigurations,tag_rule_configurations\nTagRules,tag_rules\nTagSAMLProviderRequest,tag_saml_provider_request\nTagScopeTerm,tag_scope_term\nTagSearchCondition,tag_search_condition\nTagServerCertificateRequest,tag_server_certificate_request\nTagSet,tag_set\nTagSetListLimitExceededException,tag_set_list_limit_exceeded_exception\nTagSpecification,tag_specification\nTagSpecifications,tag_specifications\nTagStepDetails,tag_step_details\nTagStreamInput,tag_stream_input\nTagUserRequest,tag_user_request\nTagValue,tag_value\nTagValuePair,tag_value_pair\nTagValueScope,tag_value_scope\nTagValues,tag_values\nTagValuesToAdd,tag_values_to_add\nTagValuesToDelete,tag_values_to_delete\nTaggedDatabase,tagged_database\nTaggedResource,tagged_resource\nTaggedResourceListMessage,tagged_resource_list_message\nTaggedResources,tagged_resources\nTaggedTable,tagged_table\nTagging,tagging\nTaggingDirective,tagging_directive\nTaggingFailedException,tagging_failed_exception\nTags,tags\nTagsAlreadyExistException,tags_already_exist_exception\nTagsLimitExceededException,tags_limit_exceeded_exception\nTagsList,tags_list\nTagsMapRequiredException,tags_map_required_exception\nTagsModel,tags_model\nTagsPerPage,tags_per_page\nTagsPerResourceExceededLimitException,tags_per_resource_exceeded_limit_exception\nTagsToAdd,tags_to_add\nTagsToDelete,tags_to_delete\nTagsToRemove,tags_to_remove\nTagsToUpdate,tags_to_update\nTagsType,tags_type\nTaint,taint\nTape,tape\nTapeARN,tape_arn\nTapeARNs,tape_arns\nTapeArchive,tape_archive\nTapeArchives,tape_archives\nTapeBarcode,tape_barcode\nTapeBarcodePrefix,tape_barcode_prefix\nTapeCreatedDate,tape_created_date\nTapeDriveType,tape_drive_type\nTapeInfo,tape_info\nTapeInfos,tape_infos\nTapeRecoveryPointInfo,tape_recovery_point_info\nTapeRecoveryPointInfos,tape_recovery_point_infos\nTapeRecoveryPointTime,tape_recovery_point_time\nTapeSizeInBytes,tape_size_in_bytes\nTapeStatus,tape_status\nTapeUsedInBytes,tape_used_in_bytes\nTapes,tapes\nTarget,target\nTargetARN,target_arn\nTargetAccounts,target_accounts\nTargetAction,target_action\nTargetActionType,target_action_type\nTargetAddress,target_address\nTargetApplications,target_applications\nTargetArn,target_arn\nTargetAttributeName,target_attribute_name\nTargetBackupVault,target_backup_vault\nTargetBackupVaultName,target_backup_vault_name\nTargetBands,target_bands\nTargetBrokerEBSVolumeInfo,target_broker_ebs_volume_info\nTargetBucket,target_bucket\nTargetCapacity,target_capacity\nTargetCapacitySpecification,target_capacity_specification\nTargetCapacitySpecificationRequest,target_capacity_specification_request\nTargetCapacityUnitType,target_capacity_unit_type\nTargetClusterArn,target_cluster_arn\nTargetClusterInfo,target_cluster_info\nTargetClusterType,target_cluster_type\nTargetColumn,target_column\nTargetConfiguration,target_configuration\nTargetConfigurationRequest,target_configuration_request\nTargetConfigurationValueRollup,target_configuration_value_rollup\nTargetConfigurationValueSet,target_configuration_value_set\nTargetConfigurations,target_configurations\nTargetContainerHostname,target_container_hostname\nTargetContainerRepository,target_container_repository\nTargetControls,target_controls\nTargetCount,target_count\nTargetCpuUtilizationPerCore,target_cpu_utilization_per_core\nTargetCustomAvailabilityZone,target_custom_availability_zone\nTargetCustomerId,target_customer_id\nTargetDBClusterParameterGroupDescription,target_db_cluster_parameter_group_description\nTargetDBClusterParameterGroupIdentifier,target_db_cluster_parameter_group_identifier\nTargetDBClusterParameterGroupName,target_db_cluster_parameter_group_name\nTargetDBClusterSnapshotIdentifier,target_db_cluster_snapshot_identifier\nTargetDBInstanceIdentifier,target_db_instance_identifier\nTargetDBParameterGroupDescription,target_db_parameter_group_description\nTargetDBParameterGroupIdentifier,target_db_parameter_group_identifier\nTargetDBParameterGroupName,target_db_parameter_group_name\nTargetDBSnapshotIdentifier,target_db_snapshot_identifier\nTargetDataProviderDescriptors,target_data_provider_descriptors\nTargetDatabase,target_database\nTargetDatabaseName,target_database_name\nTargetDbClusterIdentifier,target_db_cluster_identifier\nTargetDbType,target_db_type\nTargetDescription,target_description\nTargetDestination,target_destination\nTargetDetails,target_details\nTargetDevice,target_device\nTargetDistributionId,target_distribution_id\nTargetDocumentAttributeKey,target_document_attribute_key\nTargetDocumentAttributeValue,target_document_attribute_value\nTargetDocumentAttributeValueDeletion,target_document_attribute_value_deletion\nTargetDpus,target_dpus\nTargetDurationCompatibilityMode,target_duration_compatibility_mode\nTargetEncryptionType,target_encryption_type\nTargetEndpointArn,target_endpoint_arn\nTargetEngineName,target_engine_name\nTargetEngineVersion,target_engine_version\nTargetEnvironment,target_environment\nTargetEnvironmentName,target_environment_name\nTargetEventTypes,target_event_types\nTargetFacetName,target_facet_name\nTargetFailure,target_failure\nTargetFileSystemValues,target_file_system_values\nTargetGrant,target_grant\nTargetGrants,target_grants\nTargetGroup,target_group\nTargetGroupARNs,target_group_arns\nTargetGroupArn,target_group_arn\nTargetGroupArns,target_group_arns\nTargetGroupAssociationLimitException,target_group_association_limit_exception\nTargetGroupAttribute,target_group_attribute\nTargetGroupConfig,target_group_config\nTargetGroupInfo,target_group_info\nTargetGroupName,target_group_name\nTargetGroupNotFoundException,target_group_not_found_exception\nTargetGroupPairInfo,target_group_pair_info\nTargetGroupStickinessConfig,target_group_stickiness_config\nTargetGroupSummary,target_group_summary\nTargetGroupTuple,target_group_tuple\nTargetGroups,target_groups\nTargetGroupsConfig,target_groups_config\nTargetHealth,target_health\nTargetHealthDescription,target_health_description\nTargetHealthDescriptions,target_health_descriptions\nTargetId,target_id\nTargetIdFilters,target_id_filters\nTargetIdType,target_id_type\nTargetIds,target_ids\nTargetImage,target_image\nTargetImageOrientationCorrection,target_image_orientation_correction\nTargetInUseException,target_in_use_exception\nTargetInstance,target_instance\nTargetInstanceType,target_instance_type\nTargetInstances,target_instances\nTargetIops,target_iops\nTargetIps,target_ips\nTargetKafkaVersion,target_kafka_version\nTargetKeyId,target_key_id\nTargetKeyPrefix,target_key_prefix\nTargetLabelColumn,target_label_column\nTargetLanguageCode,target_language_code\nTargetLanguageCodes,target_language_codes\nTargetLensVersion,target_lens_version\nTargetLkfs,target_lkfs\nTargetLocation,target_location\nTargetLocationAlarmConfiguration,target_location_alarm_configuration\nTargetLocationMaxConcurrency,target_location_max_concurrency\nTargetLocationMaxErrors,target_location_max_errors\nTargetLocations,target_locations\nTargetMaps,target_maps\nTargetMeasureName,target_measure_name\nTargetMember,target_member\nTargetMembershipsPerSubChannel,target_memberships_per_sub_channel\nTargetModel,target_model\nTargetMonitorNits,target_monitor_nits\nTargetMultiAttachEnabled,target_multi_attach_enabled\nTargetMultiMeasureAttributeName,target_multi_measure_attribute_name\nTargetMultiMeasureName,target_multi_measure_name\nTargetName,target_name\nTargetNetwork,target_network\nTargetNetworkCidr,target_network_cidr\nTargetNetworkId,target_network_id\nTargetNodeType,target_node_type\nTargetNotConnected,target_not_connected\nTargetNotConnectedException,target_not_connected_exception\nTargetNotFoundException,target_not_found_exception\nTargetNumberOfBrokerNodes,target_number_of_broker_nodes\nTargetNumberOfNodes,target_number_of_nodes\nTargetObjectReference,target_object_reference\nTargetObjectiveMetricValue,target_objective_metric_value\nTargetOnDemandCapacity,target_on_demand_capacity\nTargetOnDeviceService,target_on_device_service\nTargetOnDeviceServices,target_on_device_services\nTargetOptionGroupDescription,target_option_group_description\nTargetOptionGroupIdentifier,target_option_group_identifier\nTargetOriginId,target_origin_id\nTargetParameter,target_parameter\nTargetParameterName,target_parameter_name\nTargetParameters,target_parameters\nTargetPath,target_path\nTargetPer,target_per\nTargetPlatform,target_platform\nTargetPrefix,target_prefix\nTargetProcess,target_process\nTargetProductId,target_product_id\nTargetProductName,target_product_name\nTargetReference,target_reference\nTargetRegion,target_region\nTargetReplicationInstanceArn,target_replication_instance_arn\nTargetRequiredException,target_required_exception\nTargetReservationValue,target_reservation_value\nTargetReservedNodeCount,target_reserved_node_count\nTargetReservedNodeOffering,target_reserved_node_offering\nTargetReservedNodeOfferingId,target_reserved_node_offering_id\nTargetReservedNodeType,target_reserved_node_type\nTargetResource,target_resource\nTargetResourceCount,target_resource_count\nTargetResourceType,target_resource_type\nTargetResourceTypeParameter,target_resource_type_parameter\nTargetResourceTypeSummary,target_resource_type_summary\nTargetRole,target_role\nTargetRouteTableId,target_route_table_id\nTargetSamplingRate,target_sampling_rate\nTargetSchemaName,target_schema_name\nTargetShardCount,target_shard_count\nTargetSheetId,target_sheet_id\nTargetSize,target_size\nTargetSnapshotIdentifier,target_snapshot_identifier\nTargetSnapshotName,target_snapshot_name\nTargetSnapshotValues,target_snapshot_values\nTargetSpotCapacity,target_spot_capacity\nTargetStatus,target_status\nTargetStores,target_stores\nTargetString,target_string\nTargetSubnet,target_subnet\nTargetSummary,target_summary\nTargetTable,target_table\nTargetTableName,target_table_name\nTargetTags,target_tags\nTargetText,target_text\nTargetThroughput,target_throughput\nTargetTrackingConfiguration,target_tracking_configuration\nTargetTrackingConfigurations,target_tracking_configurations\nTargetTrackingMetric,target_tracking_metric\nTargetTrackingMetricDataQuery,target_tracking_metric_data_query\nTargetTrackingMetricDimension,target_tracking_metric_dimension\nTargetTrackingMetricStat,target_tracking_metric_stat\nTargetTrackingScalingPolicyConfiguration,target_tracking_scaling_policy_configuration\nTargetType,target_type\nTargetTypes,target_types\nTargetUser,target_user\nTargetUsers,target_users\nTargetValue,target_value\nTargetValues,target_values\nTargetVariant,target_variant\nTargetVersion,target_version\nTargetVersions,target_versions\nTargetViolationReason,target_violation_reason\nTargetViolationReasons,target_violation_reasons\nTargetVisualOptions,target_visual_options\nTargetVisuals,target_visuals\nTargetVisualsConfiguration,target_visuals_configuration\nTargetVolumeType,target_volume_type\nTargetVolumeValues,target_volume_values\nTargetVpcSubnetId,target_vpc_subnet_id\nTargetWorkspaceId,target_workspace_id\nTargetedMessages,targeted_messages\nTargetedSentimentDetectionJobFilter,targeted_sentiment_detection_job_filter\nTargetedSentimentDetectionJobProperties,targeted_sentiment_detection_job_properties\nTargetedSentimentDetectionJobPropertiesList,targeted_sentiment_detection_job_properties_list\nTargetedSentimentEntity,targeted_sentiment_entity\nTargetedSentimentMention,targeted_sentiment_mention\nTargets,targets\nTargetsRequiredException,targets_required_exception\nTask,task\nTaskAction,task_action\nTaskActionDefinition,task_action_definition\nTaskAlreadyExistsException,task_already_exists_exception\nTaskArn,task_arn\nTaskAvailabilityLifetimeInSeconds,task_availability_lifetime_in_seconds\nTaskConfig,task_config\nTaskCount,task_count\nTaskCreatedAt,task_created_at\nTaskCredentials,task_credentials\nTaskData,task_data\nTaskDefinition,task_definition\nTaskDefinitionArn,task_definition_arn\nTaskDefinitionPlacementConstraint,task_definition_placement_constraint\nTaskDefinitionType,task_definition_type\nTaskDefinitions,task_definitions\nTaskDescription,task_description\nTaskDetails,task_details\nTaskDoesNotExist,task_does_not_exist\nTaskEndTime,task_end_time\nTaskError,task_error\nTaskExecutionArn,task_execution_arn\nTaskExecutionId,task_execution_id\nTaskExecutionListEntry,task_execution_list_entry\nTaskExecutionResultDetail,task_execution_result_detail\nTaskExecutions,task_executions\nTaskFailedEventDetails,task_failed_event_details\nTaskFieldMappings,task_field_mappings\nTaskFilter,task_filter\nTaskHandle,task_handle\nTaskId,task_id\nTaskIds,task_ids\nTaskInvocationParameters,task_invocation_parameters\nTaskKeywords,task_keywords\nTaskList,task_list\nTaskListEntry,task_list_entry\nTaskListItem,task_list_item\nTaskLogs,task_logs\nTaskNotFoundException,task_not_found_exception\nTaskObject,task_object\nTaskOverride,task_override\nTaskParameters,task_parameters\nTaskProperties,task_properties\nTaskQueueing,task_queueing\nTaskReportConfig,task_report_config\nTaskRoleArn,task_role_arn\nTaskRun,task_run\nTaskRunFilterCriteria,task_run_filter_criteria\nTaskRunId,task_run_id\nTaskRunProperties,task_run_properties\nTaskRunSecurityConfigurationName,task_run_security_configuration_name\nTaskRunSortCriteria,task_run_sort_criteria\nTaskRunType,task_run_type\nTaskRuns,task_runs\nTaskSchedule,task_schedule\nTaskScheduledEventDetails,task_scheduled_event_details\nTaskSet,task_set\nTaskSetNotFoundException,task_set_not_found_exception\nTaskStartFailedEventDetails,task_start_failed_event_details\nTaskStartTime,task_start_time\nTaskStartedEventDetails,task_started_event_details\nTaskState,task_state\nTaskStatistics,task_statistics\nTaskStatisticsForAuditCheck,task_statistics_for_audit_check\nTaskStatus,task_status\nTaskStatusReason,task_status_reason\nTaskSubmitFailedEventDetails,task_submit_failed_event_details\nTaskSubmittedEventDetails,task_submitted_event_details\nTaskSucceededEventDetails,task_succeeded_event_details\nTaskSummary,task_summary\nTaskTemplateConstraints,task_template_constraints\nTaskTemplateDefaultFieldValue,task_template_default_field_value\nTaskTemplateDefaults,task_template_defaults\nTaskTemplateField,task_template_field\nTaskTemplateFieldIdentifier,task_template_field_identifier\nTaskTemplateId,task_template_id\nTaskTemplateMetadata,task_template_metadata\nTaskTemplates,task_templates\nTaskTimeLimitInSeconds,task_time_limit_in_seconds\nTaskTimedOut,task_timed_out\nTaskTimedOutEventDetails,task_timed_out_event_details\nTaskTitle,task_title\nTaskType,task_type\nTasks,tasks\nTaxDocuments,tax_documents\nTcpFlags,tcp_flags\nTcpRoute,tcp_route\nTcpRouteAction,tcp_route_action\nTcpRouteMatch,tcp_route_match\nTcpTimeout,tcp_timeout\nTcs,tcs\nTdeCredentialArn,tde_credential_arn\nTdeCredentialPassword,tde_credential_password\nTdscdma,tdscdma\nTdscdmaLocalId,tdscdma_local_id\nTdscdmaNmr,tdscdma_nmr\nTdscdmaNmrObj,tdscdma_nmr_obj\nTdscdmaObj,tdscdma_obj\nTdscdmaTimingAdvance,tdscdma_timing_advance\nTdtInterval,tdt_interval\nTeam,team\nTeamId,team_id\nTeamMember,team_member\nTeamMemberAlreadyAssociatedException,team_member_already_associated_exception\nTeamMemberNotFoundException,team_member_not_found_exception\nTechContact,tech_contact\nTechPrivacy,tech_privacy\nTechnicalCueFilter,technical_cue_filter\nTechnicalCueSegment,technical_cue_segment\nTelecine,telecine\nTelemetries,telemetries\nTelemetry,telemetry\nTelemetryConfiguration,telemetry_configuration\nTelemetryConfigurationUpdate,telemetry_configuration_update\nTelemetryMetadata,telemetry_metadata\nTelemetryRecord,telemetry_record\nTelemetryRecords,telemetry_records\nTelephone,telephone\nTelephony,telephony\nTelephonyConfig,telephony_config\nTelephonySettings,telephony_settings\nTeletextDestinationSettings,teletext_destination_settings\nTeletextGridControl,teletext_grid_control\nTeletextSourceSettings,teletext_source_settings\nTeletextSpacing,teletext_spacing\nTempDir,temp_dir\nTempDirectory,temp_directory\nTemperatureUnit,temperature_unit\nTemplate,template\nTemplateActionDocument,template_action_document\nTemplateActionsRequestFilters,template_actions_request_filters\nTemplateActiveVersionRequest,template_active_version_request\nTemplateAlias,template_alias\nTemplateAliasList,template_alias_list\nTemplateArn,template_arn\nTemplateBody,template_body\nTemplateConfiguration,template_configuration\nTemplateContent,template_content\nTemplateCreateMessageBody,template_create_message_body\nTemplateData,template_data\nTemplateDescription,template_description\nTemplateDoesNotExistException,template_does_not_exist_exception\nTemplateError,template_error\nTemplateId,template_id\nTemplateInput,template_input\nTemplateLinkedPolicyDefinition,template_linked_policy_definition\nTemplateLinkedPolicyDefinitionDetail,template_linked_policy_definition_detail\nTemplateLinkedPolicyDefinitionItem,template_linked_policy_definition_item\nTemplateLocation,template_location\nTemplateMetadata,template_metadata\nTemplateName,template_name\nTemplateParameter,template_parameter\nTemplateParameterConfiguration,template_parameter_configuration\nTemplateParameters,template_parameters\nTemplateQuestions,template_questions\nTemplateResponse,template_response\nTemplateRevision,template_revision\nTemplateS3Uri,template_s3_uri\nTemplateSSMDocumentDetails,template_ssm_document_details\nTemplateSelectionExpression,template_selection_expression\nTemplateSourceAnalysis,template_source_analysis\nTemplateSourceEntity,template_source_entity\nTemplateSourceTemplate,template_source_template\nTemplateStage,template_stage\nTemplateStepGroupSummary,template_step_group_summary\nTemplateStepSummary,template_step_summary\nTemplateSubject,template_subject\nTemplateSummary,template_summary\nTemplateSummaryConfig,template_summary_config\nTemplateSummaryList,template_summary_list\nTemplateSyncConfig,template_sync_config\nTemplateType,template_type\nTemplateURL,template_url\nTemplateUrl,template_url\nTemplateV2,template_v2\nTemplateV3,template_v3\nTemplateV4,template_v4\nTemplateVersion,template_version\nTemplateVersionDefinition,template_version_definition\nTemplateVersionNumber,template_version_number\nTemplateVersionResponse,template_version_response\nTemplateVersionSummary,template_version_summary\nTemplateVersionSummaryList,template_version_summary_list\nTemplateVersionsResponse,template_versions_response\nTemplatedPathList,templated_path_list\nTemplates,templates\nTemplatesMetadata,templates_metadata\nTemplatesNotAvailableInRegionException,templates_not_available_in_region_exception\nTemplatesResponse,templates_response\nTemporalAdaptiveQuantization,temporal_adaptive_quantization\nTemporalAq,temporal_aq\nTemporalFilterSettings,temporal_filter_settings\nTemporalIds,temporal_ids\nTemporalStatisticsConfigInput,temporal_statistics_config_input\nTemporaryCredential,temporary_credential\nTemporaryPassword,temporary_password\nTemporaryPasswordValidityDays,temporary_password_validity_days\nTemporaryRestoreDays,temporary_restore_days\nTenancy,tenancy\nTenant,tenant\nTenantDomain,tenant_domain\nTenantId,tenant_id\nTenantIds,tenant_ids\nTensorBoardAppSettings,tensor_board_app_settings\nTensorBoardOutputConfig,tensor_board_output_config\nTenthFractionsOfACent,tenth_fractions_of_a_cent\nTeradataParameters,teradata_parameters\nTerm,term\nTermCount,term_count\nTermEndDate,term_end_date\nTermInYears,term_in_years\nTermStartDate,term_start_date\nTerminalRoutingStrategyException,terminal_routing_strategy_exception\nTerminalStateException,terminal_state_exception\nTerminateAppRequest,terminate_app_request\nTerminateCaptions,terminate_captions\nTerminateClientVpnConnectionsRequest,terminate_client_vpn_connections_request\nTerminateClientVpnConnectionsResult,terminate_client_vpn_connections_result\nTerminateConnectionStatus,terminate_connection_status\nTerminateEnvByForce,terminate_env_by_force\nTerminateEnvironmentMessage,terminate_environment_message\nTerminateInstanceInAutoScalingGroupType,terminate_instance_in_auto_scaling_group_type\nTerminateInstances,terminate_instances\nTerminateInstancesRequest,terminate_instances_request\nTerminateInstancesResult,terminate_instances_result\nTerminateInstancesWithExpiration,terminate_instances_with_expiration\nTerminateJobFlowsInput,terminate_job_flows_input\nTerminateJobRequest,terminate_job_request\nTerminateProvisionedProductInput,terminate_provisioned_product_input\nTerminateProvisionedProductOutput,terminate_provisioned_product_output\nTerminateRecommendationDetail,terminate_recommendation_detail\nTerminateRecoveryInstancesRequest,terminate_recovery_instances_request\nTerminateRecoveryInstancesResponse,terminate_recovery_instances_response\nTerminateRequest,terminate_request\nTerminateResources,terminate_resources\nTerminateSessionRequest,terminate_session_request\nTerminateSessionResponse,terminate_session_response\nTerminateSolNetworkInstanceInput,terminate_sol_network_instance_input\nTerminateSolNetworkInstanceOutput,terminate_sol_network_instance_output\nTerminateTargetInstancesRequest,terminate_target_instances_request\nTerminateTargetInstancesResponse,terminate_target_instances_response\nTerminateToken,terminate_token\nTerminateWorkflowExecutionInput,terminate_workflow_execution_input\nTerminateWorkspaceRequests,terminate_workspace_requests\nTerminateWorkspacesRequest,terminate_workspaces_request\nTerminateWorkspacesResult,terminate_workspaces_result\nTerminated,terminated\nTerminatedAt,terminated_at\nTerminating,terminating\nTerminatingInstances,terminating_instances\nTermination,termination\nTerminationDate,termination_date\nTerminationDateTime,termination_date_time\nTerminationDelay,termination_delay\nTerminationHealth,termination_health\nTerminationPolicies,termination_policies\nTerminationPolicyTypes,termination_policy_types\nTerminationProtected,termination_protected\nTerminationProtectionEnabled,termination_protection_enabled\nTerminationTime,termination_time\nTerminationWaitInSeconds,termination_wait_in_seconds\nTerminologyData,terminology_data\nTerminologyDataFormat,terminology_data_format\nTerminologyDataLocation,terminology_data_location\nTerminologyNames,terminology_names\nTerminologyProperties,terminology_properties\nTerminologyPropertiesList,terminology_properties_list\nTerms,terms\nTermsAggregation,terms_aggregation\nTerraformSource,terraform_source\nTest,test\nTestAlarmRequest,test_alarm_request\nTestAlarmResult,test_alarm_result\nTestAuthorizationRequest,test_authorization_request\nTestAuthorizationResponse,test_authorization_response\nTestAvailabilityConfigurationRequest,test_availability_configuration_request\nTestAvailabilityConfigurationResponse,test_availability_configuration_response\nTestCase,test_case\nTestCaseFilter,test_case_filter\nTestCaseRun,test_case_run\nTestCaseScenario,test_case_scenario\nTestConnectionMessage,test_connection_message\nTestConnectionRequest,test_connection_request\nTestConnectionResponse,test_connection_response\nTestCustomDataIdentifierRequest,test_custom_data_identifier_request\nTestCustomDataIdentifierResponse,test_custom_data_identifier_response\nTestDNSAnswerRequest,test_dns_answer_request\nTestDNSAnswerResponse,test_dns_answer_response\nTestDurationInSeconds,test_duration_in_seconds\nTestEventPatternRequest,test_event_pattern_request\nTestEventPatternResponse,test_event_pattern_response\nTestEventType,test_event_type\nTestExecutionResultFilterBy,test_execution_result_filter_by\nTestExecutionResultItems,test_execution_result_items\nTestExecutionSortBy,test_execution_sort_by\nTestExecutionSummary,test_execution_summary\nTestExecutionTarget,test_execution_target\nTestFailoverMessage,test_failover_message\nTestFailoverNotAvailableFault,test_failover_not_available_fault\nTestFailoverResult,test_failover_result\nTestFunctionFailed,test_function_failed\nTestFunctionRequest,test_function_request\nTestFunctionResult,test_function_result\nTestGridProject,test_grid_project\nTestGridSession,test_grid_session\nTestGridSessionAction,test_grid_session_action\nTestGridSessionArtifact,test_grid_session_artifact\nTestGridVpcConfig,test_grid_vpc_config\nTestHypervisorConfigurationInput,test_hypervisor_configuration_input\nTestIdentityProviderRequest,test_identity_provider_request\nTestIdentityProviderResponse,test_identity_provider_response\nTestInvokeAuthorizerRequest,test_invoke_authorizer_request\nTestInvokeAuthorizerResponse,test_invoke_authorizer_response\nTestInvokeMethodRequest,test_invoke_method_request\nTestInvokeMethodResponse,test_invoke_method_response\nTestMetricFilterRequest,test_metric_filter_request\nTestMetricFilterResponse,test_metric_filter_response\nTestMigrationMessage,test_migration_message\nTestMigrationResponse,test_migration_response\nTestMode,test_mode\nTestPassed,test_passed\nTestPhoneNumber,test_phone_number\nTestRecommendation,test_recommendation\nTestRenderEmailTemplateRequest,test_render_email_template_request\nTestRenderEmailTemplateResponse,test_render_email_template_response\nTestRenderTemplateRequest,test_render_template_request\nTestRenderTemplateResponse,test_render_template_response\nTestReportSummary,test_report_summary\nTestRepositoryTriggersInput,test_repository_triggers_input\nTestRepositoryTriggersOutput,test_repository_triggers_output\nTestResult,test_result\nTestRoleRequest,test_role_request\nTestRoleResponse,test_role_response\nTestS3Uri,test_s3_uri\nTestSegmentPatternRequest,test_segment_pattern_request\nTestSegmentPatternResponse,test_segment_pattern_response\nTestSetDiscrepancyErrors,test_set_discrepancy_errors\nTestSetDiscrepancyReportBotAliasTarget,test_set_discrepancy_report_bot_alias_target\nTestSetDiscrepancyReportResourceTarget,test_set_discrepancy_report_resource_target\nTestSetExportSpecification,test_set_export_specification\nTestSetGenerationDataSource,test_set_generation_data_source\nTestSetImportInputLocation,test_set_import_input_location\nTestSetImportResourceSpecification,test_set_import_resource_specification\nTestSetIntentDiscrepancyItem,test_set_intent_discrepancy_item\nTestSetSlotDiscrepancyItem,test_set_slot_discrepancy_item\nTestSetSortBy,test_set_sort_by\nTestSetStorageLocation,test_set_storage_location\nTestSetSummary,test_set_summary\nTestSetTurnRecord,test_set_turn_record\nTestSetTurnResult,test_set_turn_result\nTestTypeInput,test_type_input\nTestTypeOutput,test_type_output\nTestWindowEnd,test_window_end\nTestWindowStart,test_window_start\nTestWindowSummary,test_window_summary\nTestWindows,test_windows\nTestWirelessDeviceRequest,test_wireless_device_request\nTestWirelessDeviceResponse,test_wireless_device_response\nTestingData,testing_data\nTestingDataResult,testing_data_result\nText,text\nTextArea,text_area\nTextAreaControlDisplayOptions,text_area_control_display_options\nTextArrayOptions,text_array_options\nTextBody,text_body\nTextBoxes,text_boxes\nTextClassificationJobConfig,text_classification_job_config\nTextColor,text_color\nTextConditionalFormat,text_conditional_format\nTextConfig,text_config\nTextContent,text_content\nTextContentUpdate,text_content_update\nTextControlPlaceholderOptions,text_control_placeholder_options\nTextDetection,text_detection\nTextDetectionResult,text_detection_result\nTextDetections,text_detections\nTextDocumentStatistics,text_document_statistics\nTextField,text_field\nTextFieldControlDisplayOptions,text_field_control_display_options\nTextFormat,text_format\nTextInputEvent,text_input_event\nTextInputSpecification,text_input_specification\nTextLengthExceededException,text_length_exceeded_exception\nTextList,text_list\nTextLocales,text_locales\nTextLogDestination,text_log_destination\nTextLogSetting,text_log_setting\nTextModelVersion,text_model_version\nTextOptions,text_options\nTextPart,text_part\nTextPlain,text_plain\nTextQualifier,text_qualifier\nTextResponseEvent,text_response_event\nTextSizeLimitExceededException,text_size_limit_exceeded_exception\nTextTransformation,text_transformation\nTextTransformations,text_transformations\nTextTranslationJobFilter,text_translation_job_filter\nTextTranslationJobProperties,text_translation_job_properties\nTextTranslationJobPropertiesList,text_translation_job_properties_list\nTextType,text_type\nTextWithHighlights,text_with_highlights\nTextWithHighlightsValue,text_with_highlights_value\nTextWrap,text_wrap\nTheme,theme\nThemeAlias,theme_alias\nThemeAliasList,theme_alias_list\nThemeArn,theme_arn\nThemeConfiguration,theme_configuration\nThemeError,theme_error\nThemeId,theme_id\nThemeSummary,theme_summary\nThemeSummaryList,theme_summary_list\nThemeValue,theme_value\nThemeValues,theme_values\nThemeVersion,theme_version\nThemeVersionNumber,theme_version_number\nThemeVersionSummary,theme_version_summary\nThemeVersionSummaryList,theme_version_summary_list\nThemes,themes\nThesaurusSummary,thesaurus_summary\nThesaurusSummaryItems,thesaurus_summary_items\nThickness,thickness\nThing,thing\nThingArn,thing_arn\nThingAttribute,thing_attribute\nThingConnectivity,thing_connectivity\nThingDocument,thing_document\nThingGroupDocument,thing_group_document\nThingGroupIndexingConfiguration,thing_group_indexing_configuration\nThingGroupMetadata,thing_group_metadata\nThingGroupProperties,thing_group_properties\nThingIndexingConfiguration,thing_indexing_configuration\nThingName,thing_name\nThingTypeDefinition,thing_type_definition\nThingTypeMetadata,thing_type_metadata\nThingTypeProperties,thing_type_properties\nThirdPartyFirewall,third_party_firewall\nThirdPartyFirewallFirewallPolicies,third_party_firewall_firewall_policies\nThirdPartyFirewallFirewallPolicy,third_party_firewall_firewall_policy\nThirdPartyFirewallMissingExpectedRouteTableViolation,third_party_firewall_missing_expected_route_table_violation\nThirdPartyFirewallMissingFirewallViolation,third_party_firewall_missing_firewall_violation\nThirdPartyFirewallMissingSubnetViolation,third_party_firewall_missing_subnet_violation\nThirdPartyFirewallPolicy,third_party_firewall_policy\nThirdPartyFirewallStatus,third_party_firewall_status\nThirdPartyJob,third_party_job\nThirdPartyJobData,third_party_job_data\nThirdPartyJobDetails,third_party_job_details\nThirdPartySourceRepository,third_party_source_repository\nThousandSeparatorOptions,thousand_separator_options\nThousandsSeparator,thousands_separator\nThreadFieldMappings,thread_field_mappings\nThreadId,thread_id\nThreadsPerCore,threads_per_core\nThreat,threat\nThreatDetectedByName,threat_detected_by_name\nThreatIntelIndicator,threat_intel_indicator\nThreatIntelIndicatorCategory,threat_intel_indicator_category\nThreatIntelIndicatorLastObservedAt,threat_intel_indicator_last_observed_at\nThreatIntelIndicatorSource,threat_intel_indicator_source\nThreatIntelIndicatorSourceUrl,threat_intel_indicator_source_url\nThreatIntelIndicatorType,threat_intel_indicator_type\nThreatIntelIndicatorValue,threat_intel_indicator_value\nThreatIntelIndicators,threat_intel_indicators\nThreatIntelSetId,threat_intel_set_id\nThreatIntelSetIds,threat_intel_set_ids\nThreatIntelligenceDetail,threat_intelligence_detail\nThreatIntelligenceDetails,threat_intelligence_details\nThreatListName,threat_list_name\nThreatName,threat_name\nThreatNames,threat_names\nThreats,threats\nThreatsDetectedItemCount,threats_detected_item_count\nThreshold,threshold\nThresholdComparator,threshold_comparator\nThresholdCount,threshold_count\nThresholdExpression,threshold_expression\nThresholdFraction,threshold_fraction\nThresholdMetricId,threshold_metric_id\nThresholdPercentage,threshold_percentage\nThresholdType,threshold_type\nThresholdV2,threshold_v2\nThresholdValue,threshold_value\nThresholdsWaitTime,thresholds_wait_time\nThrottleCount,throttle_count\nThrottleSettings,throttle_settings\nThrottledClientException,throttled_client_exception\nThrottledException,throttled_exception\nThrottlingBurstLimit,throttling_burst_limit\nThrottlingException,throttling_exception\nThrottlingRateLimit,throttling_rate_limit\nThroughResources,through_resources\nThroughResourcesStatement,through_resources_statement\nThroughResourcesStatementRequest,through_resources_statement_request\nThroughput,throughput\nThroughputCapacity,throughput_capacity\nThroughputLimitExceeded,throughput_limit_exceeded\nThroughputMode,throughput_mode\nThroughputOther,throughput_other\nThroughputRead,throughput_read\nThroughputTotal,throughput_total\nThroughputWrite,throughput_write\nThrowOnDuplicate,throw_on_duplicate\nThumbnail,thumbnail\nThumbnailConfig,thumbnail_config\nThumbnailConfiguration,thumbnail_configuration\nThumbnailDetail,thumbnail_detail\nThumbnailDetails,thumbnail_details\nThumbnailEncryption,thumbnail_encryption\nThumbnailHeight,thumbnail_height\nThumbnailInterval,thumbnail_interval\nThumbnailPattern,thumbnail_pattern\nThumbnailType,thumbnail_type\nThumbnailWidth,thumbnail_width\nThumbnails,thumbnails\nThumbprint,thumbprint\nThumbprintList,thumbprint_list\nThursday,thursday\nTicServerUrl,tic_server_url\nTickLabelOptions,tick_label_options\nTicketId,ticket_id\nTicketIds,ticket_ids\nTicketList,ticket_list\nTier,tier\nTiering,tiering\nTieringPolicy,tiering_policy\nTieringStartTime,tiering_start_time\nTierings,tierings\nTile,tile\nTileAspectRatio,tile_aspect_ratio\nTileCount,tile_count\nTileHeight,tile_height\nTileLayout,tile_layout\nTileLayoutStyle,tile_layout_style\nTileOrder,tile_order\nTilePosition,tile_position\nTileStyle,tile_style\nTileWidth,tile_width\nTiles,tiles\nTime,time\nTimeAlignmentBoundary,time_alignment_boundary\nTimeBasedAutoScalingConfiguration,time_based_auto_scaling_configuration\nTimeBasedAutoScalingConfigurations,time_based_auto_scaling_configurations\nTimeBasedCanary,time_based_canary\nTimeBasedCollectionScheme,time_based_collection_scheme\nTimeBasedForecastProperties,time_based_forecast_properties\nTimeBasedLinear,time_based_linear\nTimeColumn,time_column\nTimeCommitmentInSeconds,time_commitment_in_seconds\nTimeCreated,time_created\nTimeDelaySeconds,time_delay_seconds\nTimeDelta,time_delta\nTimeDeltaUnits,time_delta_units\nTimeEqualityFilter,time_equality_filter\nTimeFormat,time_format\nTimeGranularity,time_granularity\nTimeInNanos,time_in_nanos\nTimeLeftSeconds,time_left_seconds\nTimeLimitExceededException,time_limit_exceeded_exception\nTimeLoggingStarted,time_logging_started\nTimeLoggingStopped,time_logging_stopped\nTimeOfDay,time_of_day\nTimeOfTheDay,time_of_the_day\nTimeOffset,time_offset\nTimePeriod,time_period\nTimePointGranularity,time_point_granularity\nTimeRange,time_range\nTimeRangeDrillDownFilter,time_range_drill_down_filter\nTimeRangeFilter,time_range_filter\nTimeRangeFilterInput,time_range_filter_input\nTimeRangeFilterOutput,time_range_filter_output\nTimeRangeFilterValue,time_range_filter_value\nTimeRangeLowerBound,time_range_lower_bound\nTimeRangeType,time_range_type\nTimeRangeUpperBound,time_range_upper_bound\nTimeRangeValue,time_range_value\nTimeRanges,time_ranges\nTimeSeries,time_series\nTimeSeriesCondition,time_series_condition\nTimeSeriesConditions,time_series_conditions\nTimeSeriesConfig,time_series_config\nTimeSeriesDataPoint,time_series_data_point\nTimeSeriesFeedback,time_series_feedback\nTimeSeriesForecastingJobConfig,time_series_forecasting_job_config\nTimeSeriesForecastingSettings,time_series_forecasting_settings\nTimeSeriesGranularity,time_series_granularity\nTimeSeriesId,time_series_id\nTimeSeriesIdentifiers,time_series_identifiers\nTimeSeriesList,time_series_list\nTimeSeriesMeasureValueColumnInfo,time_series_measure_value_column_info\nTimeSeriesReplacementsDataSource,time_series_replacements_data_source\nTimeSeriesSelector,time_series_selector\nTimeSeriesServiceStatistics,time_series_service_statistics\nTimeSeriesSummaries,time_series_summaries\nTimeSeriesSummary,time_series_summary\nTimeSeriesTransformation,time_series_transformation\nTimeSeriesTransformations,time_series_transformations\nTimeSeriesValue,time_series_value\nTimeSignalMessage,time_signal_message\nTimeSpan,time_span\nTimeStamp,time_stamp\nTimeToLive,time_to_live\nTimeToLiveDescription,time_to_live_description\nTimeToLiveInSeconds,time_to_live_in_seconds\nTimeToLiveSpecification,time_to_live_specification\nTimeToLiveStatus,time_to_live_status\nTimeUnit,time_unit\nTimeWindow,time_window\nTimeZone,time_zone\nTimeZoneId,time_zone_id\nTimecode,timecode\nTimecodeBurnin,timecode_burnin\nTimecodeBurninSettings,timecode_burnin_settings\nTimecodeConfig,timecode_config\nTimecodeInsertion,timecode_insertion\nTimecodeSource,timecode_source\nTimecodeStart,timecode_start\nTimedMetadata,timed_metadata\nTimedMetadataBehavior,timed_metadata_behavior\nTimedMetadataBoxVersion,timed_metadata_box_version\nTimedMetadataId3Frame,timed_metadata_id3_frame\nTimedMetadataId3Period,timed_metadata_id3_period\nTimedMetadataInsertion,timed_metadata_insertion\nTimedMetadataPid,timed_metadata_pid\nTimedMetadataSchemeIdUri,timed_metadata_scheme_id_uri\nTimedMetadataValue,timed_metadata_value\nTimedOutSteps,timed_out_steps\nTimeframeCap,timeframe_cap\nTimeline,timeline\nTimelineEvent,timeline_event\nTimeout,timeout\nTimeoutAction,timeout_action\nTimeoutActions,timeout_actions\nTimeoutConfig,timeout_config\nTimeoutCount,timeout_count\nTimeoutDurationMinutes,timeout_duration_minutes\nTimeoutInMillis,timeout_in_millis\nTimeoutInMinutes,timeout_in_minutes\nTimeoutInSeconds,timeout_in_seconds\nTimeoutSeconds,timeout_seconds\nTimer,timer\nTimerCanceledEventAttributes,timer_canceled_event_attributes\nTimerDefinition,timer_definition\nTimerFiredEventAttributes,timer_fired_event_attributes\nTimerStartedEventAttributes,timer_started_event_attributes\nTimerType,timer_type\nTimerValue,timer_value\nTimers,timers\nTimes,times\nTimestamp,timestamp\nTimestampAttributeName,timestamp_attribute_name\nTimestampColumn,timestamp_column\nTimestampColumnName,timestamp_column_name\nTimestampDeltaMilliseconds,timestamp_delta_milliseconds\nTimestampForCollection,timestamp_for_collection\nTimestampFormat,timestamp_format\nTimestampFormats,timestamp_formats\nTimestampList,timestamp_list\nTimestampMetricValuePair,timestamp_metric_value_pair\nTimestampMetricValuePairList,timestamp_metric_value_pair_list\nTimestampOffset,timestamp_offset\nTimestampOffsetMode,timestamp_offset_mode\nTimestampOutOfBoundsException,timestamp_out_of_bounds_exception\nTimestampPartition,timestamp_partition\nTimestampRange,timestamp_range\nTimestampRanges,timestamp_ranges\nTimestampStructure,timestamp_structure\nTimestampValue,timestamp_value\nTimestamps,timestamps\nTimestreamAction,timestream_action\nTimestreamConfig,timestream_config\nTimestreamConfiguration,timestream_configuration\nTimestreamDestination,timestream_destination\nTimestreamDimension,timestream_dimension\nTimestreamRegistrationResponse,timestream_registration_response\nTimestreamResources,timestream_resources\nTimestreamSettings,timestream_settings\nTimestreamTimestamp,timestream_timestamp\nTimezone,timezone\nTimezoneEstimationMethods,timezone_estimation_methods\nTimezoneName,timezone_name\nTimezoneOffset,timezone_offset\nTimezonesCompletedCount,timezones_completed_count\nTimezonesTotalCount,timezones_total_count\nTiming,timing\nTimingInformation,timing_information\nTipOfSourceReferenceIsDifferentException,tip_of_source_reference_is_different_exception\nTipsDivergenceExceededException,tips_divergence_exceeded_exception\nTitle,title\nTitleAggregation,title_aggregation\nTitleAggregationResponse,title_aggregation_response\nTitleOptions,title_options\nTitleOverride,title_override\nTitleRequiredException,title_required_exception\nTld,tld\nTlogAccessMode,tlog_access_mode\nTls,tls\nTlsCertificate,tls_certificate\nTlsCertificateData,tls_certificate_data\nTlsCiphers,tls_ciphers\nTlsConfig,tls_config\nTlsConfigInput,tls_config_input\nTlsContext,tls_context\nTlsPolicy,tls_policy\nTlsSessionResumptionMode,tls_session_resumption_mode\nTlsValidationContext,tls_validation_context\nTlsValidationContextAcmTrust,tls_validation_context_acm_trust\nTlsValidationContextFileTrust,tls_validation_context_file_trust\nTlsValidationContextSdsTrust,tls_validation_context_sds_trust\nTmpDirIAMRole,tmp_dir_iam_role\nTmpfs,tmpfs\nTo,to\nToAddresses,to_addresses\nToDate,to_date\nToDbClusterArn,to_db_cluster_arn\nToExclusive,to_exclusive\nToKey,to_key\nToPhoneNumber,to_phone_number\nToPort,to_port\nToTime,to_time\nToTimeStamp,to_time_stamp\nToType,to_type\nToggleButtonsVisibility,toggle_buttons_visibility\nToken,token\nTokenAlreadyExistsException,token_already_exists_exception\nTokenBalance,token_balance\nTokenCode,token_code\nTokenData,token_data\nTokenDomains,token_domains\nTokenDuration,token_duration\nTokenEndpoint,token_endpoint\nTokenFilter,token_filter\nTokenId,token_id\nTokenIdentifier,token_identifier\nTokenIds,token_ids\nTokenKey,token_key\nTokenKeyId,token_key_id\nTokenProperties,token_properties\nTokenType,token_type\nTokenValidityUnits,token_validity_units\nTokenValidityUnitsType,token_validity_units_type\nTokenValue,token_value\nTokenizedBody,tokenized_body\nTokenizedTitle,tokenized_title\nTokens,tokens\nTollFreePrefix,toll_free_prefix\nTooLongCSPInResponseHeadersPolicy,too_long_csp_in_response_headers_policy\nTooManyAccessPointsException,too_many_access_points_exception\nTooManyActionsException,too_many_actions_exception\nTooManyApplicationVersionsException,too_many_application_versions_exception\nTooManyApplicationsException,too_many_applications_exception\nTooManyBucketsException,too_many_buckets_exception\nTooManyCacheBehaviors,too_many_cache_behaviors\nTooManyCachePolicies,too_many_cache_policies\nTooManyCertificates,too_many_certificates\nTooManyCertificatesException,too_many_certificates_exception\nTooManyCloudFrontOriginAccessIdentities,too_many_cloud_front_origin_access_identities\nTooManyConfigurationTemplatesException,too_many_configuration_templates_exception\nTooManyContinuousDeploymentPolicies,too_many_continuous_deployment_policies\nTooManyCookieNamesInWhiteList,too_many_cookie_names_in_white_list\nTooManyCookiesInCachePolicy,too_many_cookies_in_cache_policy\nTooManyCookiesInOriginRequestPolicy,too_many_cookies_in_origin_request_policy\nTooManyCustomHeadersInResponseHeadersPolicy,too_many_custom_headers_in_response_headers_policy\nTooManyDistributionCNAMEs,too_many_distribution_cnames\nTooManyDistributions,too_many_distributions\nTooManyDistributionsAssociatedToCachePolicy,too_many_distributions_associated_to_cache_policy\nTooManyDistributionsAssociatedToFieldLevelEncryptionConfig,too_many_distributions_associated_to_field_level_encryption_config\nTooManyDistributionsAssociatedToKeyGroup,too_many_distributions_associated_to_key_group\nTooManyDistributionsAssociatedToOriginAccessControl,too_many_distributions_associated_to_origin_access_control\nTooManyDistributionsAssociatedToOriginRequestPolicy,too_many_distributions_associated_to_origin_request_policy\nTooManyDistributionsAssociatedToResponseHeadersPolicy,too_many_distributions_associated_to_response_headers_policy\nTooManyDistributionsWithFunctionAssociations,too_many_distributions_with_function_associations\nTooManyDistributionsWithLambdaAssociations,too_many_distributions_with_lambda_associations\nTooManyDistributionsWithSingleFunctionARN,too_many_distributions_with_single_function_arn\nTooManyEntriesInBatchRequestException,too_many_entries_in_batch_request_exception\nTooManyEnvironmentsException,too_many_environments_exception\nTooManyFailedAttemptsException,too_many_failed_attempts_exception\nTooManyFieldLevelEncryptionConfigs,too_many_field_level_encryption_configs\nTooManyFieldLevelEncryptionContentTypeProfiles,too_many_field_level_encryption_content_type_profiles\nTooManyFieldLevelEncryptionEncryptionEntities,too_many_field_level_encryption_encryption_entities\nTooManyFieldLevelEncryptionFieldPatterns,too_many_field_level_encryption_field_patterns\nTooManyFieldLevelEncryptionProfiles,too_many_field_level_encryption_profiles\nTooManyFieldLevelEncryptionQueryArgProfiles,too_many_field_level_encryption_query_arg_profiles\nTooManyFunctionAssociations,too_many_function_associations\nTooManyFunctions,too_many_functions\nTooManyHeadersInCachePolicy,too_many_headers_in_cache_policy\nTooManyHeadersInForwardedValues,too_many_headers_in_forwarded_values\nTooManyHeadersInOriginRequestPolicy,too_many_headers_in_origin_request_policy\nTooManyHealthChecks,too_many_health_checks\nTooManyHostedZones,too_many_hosted_zones\nTooManyInvalidationsInProgress,too_many_invalidations_in_progress\nTooManyKeyGroups,too_many_key_groups\nTooManyKeyGroupsAssociatedToDistribution,too_many_key_groups_associated_to_distribution\nTooManyKeySigningKeys,too_many_key_signing_keys\nTooManyLabelsException,too_many_labels_exception\nTooManyLambdaFunctionAssociations,too_many_lambda_function_associations\nTooManyListenersException,too_many_listeners_exception\nTooManyLoadBalancersException,too_many_load_balancers_exception\nTooManyOriginAccessControls,too_many_origin_access_controls\nTooManyOriginCustomHeaders,too_many_origin_custom_headers\nTooManyOriginGroupsPerDistribution,too_many_origin_groups_per_distribution\nTooManyOriginRequestPolicies,too_many_origin_request_policies\nTooManyOrigins,too_many_origins\nTooManyPlatformsException,too_many_platforms_exception\nTooManyPoliciesException,too_many_policies_exception\nTooManyPublicKeys,too_many_public_keys\nTooManyPublicKeysInKeyGroup,too_many_public_keys_in_key_group\nTooManyQueryStringParameters,too_many_query_string_parameters\nTooManyQueryStringsInCachePolicy,too_many_query_strings_in_cache_policy\nTooManyQueryStringsInOriginRequestPolicy,too_many_query_strings_in_origin_request_policy\nTooManyRealtimeLogConfigs,too_many_realtime_log_configs\nTooManyRegistrationsForTargetIdException,too_many_registrations_for_target_id_exception\nTooManyRemoveHeadersInResponseHeadersPolicy,too_many_remove_headers_in_response_headers_policy\nTooManyRequests,too_many_requests\nTooManyRequestsException,too_many_requests_exception\nTooManyResponseHeadersPolicies,too_many_response_headers_policies\nTooManyRulesException,too_many_rules_exception\nTooManyStreamingDistributionCNAMEs,too_many_streaming_distribution_cnames\nTooManyStreamingDistributions,too_many_streaming_distributions\nTooManySubscriptionsException,too_many_subscriptions_exception\nTooManyTagKeysException,too_many_tag_keys_exception\nTooManyTags,too_many_tags\nTooManyTagsException,too_many_tags_exception\nTooManyTagsFault,too_many_tags_fault\nTooManyTargetGroupsException,too_many_target_groups_exception\nTooManyTargetsException,too_many_targets_exception\nTooManyTrafficPolicies,too_many_traffic_policies\nTooManyTrafficPolicyInstances,too_many_traffic_policy_instances\nTooManyTrafficPolicyVersionsForCurrentPolicy,too_many_traffic_policy_versions_for_current_policy\nTooManyTrustedSigners,too_many_trusted_signers\nTooManyUniqueTargetGroupsPerLoadBalancerException,too_many_unique_target_groups_per_load_balancer_exception\nTooManyUpdates,too_many_updates\nTooManyVPCAssociationAuthorizations,too_many_vpc_association_authorizations\nTool,tool\nToolchain,toolchain\nToolchainSource,toolchain_source\nToolsVersion,tools_version\nTooltip,tooltip\nTooltipFields,tooltip_fields\nTooltipItem,tooltip_item\nTooltipOptions,tooltip_options\nTooltipTitleType,tooltip_title_type\nTooltipVisibility,tooltip_visibility\nTop,top\nTopAnomalousServices,top_anomalous_services\nTopAnswer,top_answer\nTopBottomFilter,top_bottom_filter\nTopBottomMovers,top_bottom_movers\nTopBottomMoversComputation,top_bottom_movers_computation\nTopBottomRanked,top_bottom_ranked\nTopBottomRankedComputation,top_bottom_ranked_computation\nTopContributors,top_contributors\nTopOffset,top_offset\nTopResources,top_resources\nTopic,topic\nTopicARN,topic_arn\nTopicArn,topic_arn\nTopicCalculatedField,topic_calculated_field\nTopicCategoryFilter,topic_category_filter\nTopicCategoryFilterConstant,topic_category_filter_constant\nTopicColumn,topic_column\nTopicConfiguration,topic_configuration\nTopicConfigurations,topic_configurations\nTopicDateRangeFilter,topic_date_range_filter\nTopicDefaultPreferences,topic_default_preferences\nTopicDetails,topic_details\nTopicFilter,topic_filter\nTopicId,topic_id\nTopicLimitExceededException,topic_limit_exceeded_exception\nTopicName,topic_name\nTopicNamedEntity,topic_named_entity\nTopicNames,topic_names\nTopicNumericEqualityFilter,topic_numeric_equality_filter\nTopicNumericRangeFilter,topic_numeric_range_filter\nTopicPreference,topic_preference\nTopicPreferences,topic_preferences\nTopicRangeFilterConstant,topic_range_filter_constant\nTopicRefreshDetails,topic_refresh_details\nTopicRefreshSchedule,topic_refresh_schedule\nTopicRefreshScheduleSummary,topic_refresh_schedule_summary\nTopicRelativeDateFilter,topic_relative_date_filter\nTopicRule,topic_rule\nTopicRuleDestination,topic_rule_destination\nTopicRuleDestinationConfiguration,topic_rule_destination_configuration\nTopicRuleDestinationSummary,topic_rule_destination_summary\nTopicRuleListItem,topic_rule_list_item\nTopicRulePayload,topic_rule_payload\nTopicScheduleType,topic_schedule_type\nTopicSingularFilterConstant,topic_singular_filter_constant\nTopicStatus,topic_status\nTopicSummary,topic_summary\nTopics,topics\nTopicsDetectionJobFilter,topics_detection_job_filter\nTopicsDetectionJobProperties,topics_detection_job_properties\nTopicsDetectionJobPropertiesList,topics_detection_job_properties_list\nTopicsSummaries,topics_summaries\nTopk,topk\nToscaOverride,tosca_override\nTotal,total\nTotalActions,total_actions\nTotalActualHours,total_actual_hours\nTotalActualSpend,total_actual_spend\nTotalActualUnits,total_actual_units\nTotalAddressCount,total_address_count\nTotalAggregation,total_aggregation\nTotalAggregationComputation,total_aggregation_computation\nTotalAmortizedCommitment,total_amortized_commitment\nTotalAmortizedFee,total_amortized_fee\nTotalAuthenticatedEntities,total_authenticated_entities\nTotalAvailableAddressCount,total_available_address_count\nTotalBackupSizeInMegaBytes,total_backup_size_in_mega_bytes\nTotalBarLabel,total_bar_label\nTotalBytes,total_bytes\nTotalCap,total_cap\nTotalCapacity,total_capacity\nTotalCapacityProvisioned,total_capacity_provisioned\nTotalCapacityUsed,total_capacity_used\nTotalCellStyle,total_cell_style\nTotalCodeSize,total_code_size\nTotalCommitment,total_commitment\nTotalCost,total_cost\nTotalCount,total_count\nTotalDataInMegaBytes,total_data_in_mega_bytes\nTotalDiscoveredResources,total_discovered_resources\nTotalDuration,total_duration\nTotalEndpointCount,total_endpoint_count\nTotalEntries,total_entries\nTotalEstimatedMonthlySavingsAmount,total_estimated_monthly_savings_amount\nTotalEstimatedMonthlySavingsPercentage,total_estimated_monthly_savings_percentage\nTotalExecutionTimeInMillis,total_execution_time_in_millis\nTotalExpectedSpend,total_expected_spend\nTotalExtractedDataInGB,total_extracted_data_in_gb\nTotalFailures,total_failures\nTotalFilteredCount,total_filtered_count\nTotalFpgaMemoryInMiB,total_fpga_memory_in_mib\nTotalFulfilledCapacity,total_fulfilled_capacity\nTotalGb,total_gb\nTotalGpuMemoryInMiB,total_gpu_memory_in_mib\nTotalHourlyPrice,total_hourly_price\nTotalImpact,total_impact\nTotalImpactFilter,total_impact_filter\nTotalImpactPercentage,total_impact_percentage\nTotalInferenceMemoryInMiB,total_inference_memory_in_mib\nTotalInstanceCount,total_instance_count\nTotalLabeled,total_labeled\nTotalLabels,total_labels\nTotalLocalStorageGB,total_local_storage_gb\nTotalLocalStorageGBRequest,total_local_storage_gb_request\nTotalLogicalCapacityUsed,total_logical_capacity_used\nTotalNodes,total_nodes\nTotalNumRows,total_num_rows\nTotalNumberOfDuplicateTimestamps,total_number_of_duplicate_timestamps\nTotalNumberOfFiles,total_number_of_files\nTotalNumberOfInvalidValues,total_number_of_invalid_values\nTotalNumberOfMissingValues,total_number_of_missing_values\nTotalNumberOfResults,total_number_of_results\nTotalNumberOfRows,total_number_of_rows\nTotalNumberOfStages,total_number_of_stages\nTotalNumberOfTasks,total_number_of_tasks\nTotalNumberOfUnsupportedTimestamps,total_number_of_unsupported_timestamps\nTotalNumberOfUsers,total_number_of_users\nTotalObjects,total_objects\nTotalOptions,total_options\nTotalPartsCount,total_parts_count\nTotalPercentageArea,total_percentage_area\nTotalPieces,total_pieces\nTotalPolicyCount,total_policy_count\nTotalPotentialRISavings,total_potential_ri_savings\nTotalProcessed,total_processed\nTotalProvisionedStorageInMegaBytes,total_provisioned_storage_in_mega_bytes\nTotalRecommendationCount,total_recommendation_count\nTotalRecordCount,total_record_count\nTotalResizeDataInMegaBytes,total_resize_data_in_mega_bytes\nTotalResourceUtilization,total_resource_utilization\nTotalResources,total_resources\nTotalResponseTime,total_response_time\nTotalResultsCount,total_results_count\nTotalRowsInDataset,total_rows_in_dataset\nTotalRuleCount,total_rule_count\nTotalRunningHours,total_running_hours\nTotalRunningHoursInLookbackPeriod,total_running_hours_in_lookback_period\nTotalRunningNormalizedUnits,total_running_normalized_units\nTotalScheduledInstanceHours,total_scheduled_instance_hours\nTotalSegments,total_segments\nTotalShards,total_shards\nTotalSize,total_size\nTotalSizeInGB,total_size_in_gb\nTotalSizeLimitExceededException,total_size_limit_exceeded_exception\nTotalSnapshotCapacityUsed,total_snapshot_capacity_used\nTotalStackInstancesCount,total_stack_instances_count\nTotalSteps,total_steps\nTotalStorageCapacityInMegaBytes,total_storage_capacity_in_mega_bytes\nTotalSuggestionsCount,total_suggestions_count\nTotalTargetCapacity,total_target_capacity\nTotalUnAssignedShards,total_un_assigned_shards\nTotalUpfrontPrice,total_upfront_price\nTotalVCpus,total_v_cpus\nTotalsVisibility,totals_visibility\nToxicityCategories,toxicity_categories\nToxicityDetection,toxicity_detection\nToxicityDetectionSettings,toxicity_detection_settings\nTpmSupport,tpm_support\nTrace,trace\nTraceConfiguration,trace_configuration\nTraceContent,trace_content\nTraceHeader,trace_header\nTraceId,trace_id\nTraceIds,trace_ids\nTraceOutput,trace_output\nTraceSegmentDocuments,trace_segment_documents\nTraceSummaries,trace_summaries\nTraceSummary,trace_summary\nTraceUser,trace_user\nTraceback,traceback\nTraces,traces\nTracesProcessedCount,traces_processed_count\nTracingConfig,tracing_config\nTracingConfigResponse,tracing_config_response\nTracingConfiguration,tracing_configuration\nTracingEnabled,tracing_enabled\nTrack,track\nTrackData,track_data\nTrackListMessage,track_list_message\nTrackNumber,track_number\nTrackSourceSettings,track_source_settings\nTrackedActionLastAccessed,tracked_action_last_accessed\nTrackedActionsLastAccessed,tracked_actions_last_accessed\nTrackedClusterId,tracked_cluster_id\nTrackedIsps,tracked_isps\nTrackerArn,tracker_arn\nTrackerName,tracker_name\nTrackingConfig,tracking_config\nTrackingInformation,tracking_information\nTrackingNumber,tracking_number\nTrackingOptions,tracking_options\nTrackingOptionsAlreadyExistsException,tracking_options_already_exists_exception\nTrackingOptionsDoesNotExistException,tracking_options_does_not_exist_exception\nTracks,tracks\nTrafficConfig,traffic_config\nTrafficDialPercentage,traffic_dial_percentage\nTrafficDirection,traffic_direction\nTrafficDistributionGroup,traffic_distribution_group\nTrafficDistributionGroupId,traffic_distribution_group_id\nTrafficDistributionGroupSummary,traffic_distribution_group_summary\nTrafficDistributionGroupSummaryList,traffic_distribution_group_summary_list\nTrafficDistributionGroupUserSummary,traffic_distribution_group_user_summary\nTrafficDistributionGroupUserSummaryList,traffic_distribution_group_user_summary_list\nTrafficMirrorFilter,traffic_mirror_filter\nTrafficMirrorFilterId,traffic_mirror_filter_id\nTrafficMirrorFilterIds,traffic_mirror_filter_ids\nTrafficMirrorFilterRule,traffic_mirror_filter_rule\nTrafficMirrorFilterRuleId,traffic_mirror_filter_rule_id\nTrafficMirrorFilters,traffic_mirror_filters\nTrafficMirrorPortRange,traffic_mirror_port_range\nTrafficMirrorPortRangeRequest,traffic_mirror_port_range_request\nTrafficMirrorSession,traffic_mirror_session\nTrafficMirrorSessionId,traffic_mirror_session_id\nTrafficMirrorSessionIds,traffic_mirror_session_ids\nTrafficMirrorSessions,traffic_mirror_sessions\nTrafficMirrorTarget,traffic_mirror_target\nTrafficMirrorTargetId,traffic_mirror_target_id\nTrafficMirrorTargetIds,traffic_mirror_target_ids\nTrafficMirrorTargets,traffic_mirror_targets\nTrafficPattern,traffic_pattern\nTrafficPercentageToMonitor,traffic_percentage_to_monitor\nTrafficPolicies,traffic_policies\nTrafficPolicy,traffic_policy\nTrafficPolicyAlreadyExists,traffic_policy_already_exists\nTrafficPolicyCount,traffic_policy_count\nTrafficPolicyId,traffic_policy_id\nTrafficPolicyIdMarker,traffic_policy_id_marker\nTrafficPolicyInUse,traffic_policy_in_use\nTrafficPolicyInstance,traffic_policy_instance\nTrafficPolicyInstanceAlreadyExists,traffic_policy_instance_already_exists\nTrafficPolicyInstanceCount,traffic_policy_instance_count\nTrafficPolicyInstanceId,traffic_policy_instance_id\nTrafficPolicyInstanceNameMarker,traffic_policy_instance_name_marker\nTrafficPolicyInstanceTypeMarker,traffic_policy_instance_type_marker\nTrafficPolicyInstances,traffic_policy_instances\nTrafficPolicySummaries,traffic_policy_summaries\nTrafficPolicySummary,traffic_policy_summary\nTrafficPolicyType,traffic_policy_type\nTrafficPolicyVersion,traffic_policy_version\nTrafficPolicyVersionMarker,traffic_policy_version_marker\nTrafficRoute,traffic_route\nTrafficRoutingConfig,traffic_routing_config\nTrafficRoutingConfiguration,traffic_routing_configuration\nTrafficSource,traffic_source\nTrafficSourceIdentifier,traffic_source_identifier\nTrafficSourceState,traffic_source_state\nTrafficSourceType,traffic_source_type\nTrafficSources,traffic_sources\nTrafficType,traffic_type\nTrail,trail\nTrailARN,trail_arn\nTrailAlreadyExistsException,trail_already_exists_exception\nTrailArn,trail_arn\nTrailInfo,trail_info\nTrailName,trail_name\nTrailNotFoundException,trail_not_found_exception\nTrailNotProvidedException,trail_not_provided_exception\nTrailProperties,trail_properties\nTrails,trails\nTrainedModelArn,trained_model_arn\nTrainedModelMetrics,trained_model_metrics\nTrainingChannels,training_channels\nTrainingData,training_data\nTrainingDataConfig,training_data_config\nTrainingDataEndTime,training_data_end_time\nTrainingDataResult,training_data_result\nTrainingDataSchema,training_data_schema\nTrainingDataSourceId,training_data_source_id\nTrainingDataStartTime,training_data_start_time\nTrainingEndTime,training_end_time\nTrainingEndTimestamp,training_end_timestamp\nTrainingExecutionEndTime,training_execution_end_time\nTrainingExecutionStartTime,training_execution_start_time\nTrainingImage,training_image\nTrainingImageConfig,training_image_config\nTrainingImageDigest,training_image_digest\nTrainingInputMode,training_input_mode\nTrainingJob,training_job\nTrainingJobArn,training_job_arn\nTrainingJobDefinition,training_job_definition\nTrainingJobDefinitionName,training_job_definition_name\nTrainingJobDefinitions,training_job_definitions\nTrainingJobEarlyStoppingType,training_job_early_stopping_type\nTrainingJobName,training_job_name\nTrainingJobStatus,training_job_status\nTrainingJobStatusCounters,training_job_status_counters\nTrainingJobStepMetadata,training_job_step_metadata\nTrainingJobSummaries,training_job_summaries\nTrainingJobSummary,training_job_summary\nTrainingMetrics,training_metrics\nTrainingMetricsV2,training_metrics_v2\nTrainingParameters,training_parameters\nTrainingRepositoryAccessMode,training_repository_access_mode\nTrainingRepositoryAuthConfig,training_repository_auth_config\nTrainingRepositoryCredentialsProviderArn,training_repository_credentials_provider_arn\nTrainingResult,training_result\nTrainingResultV2,training_result_v2\nTrainingSpecification,training_specification\nTrainingStartTime,training_start_time\nTrainingTimeInSeconds,training_time_in_seconds\nTrait,trait\nTraitDiffRule,trait_diff_rule\nTraits,traits\nTransactGetItem,transact_get_item\nTransactGetItemsInput,transact_get_items_input\nTransactGetItemsOutput,transact_get_items_output\nTransactItems,transact_items\nTransactStatements,transact_statements\nTransactWriteItem,transact_write_item\nTransactWriteItemsInput,transact_write_items_input\nTransactWriteItemsOutput,transact_write_items_output\nTransaction,transaction\nTransactionCanceledException,transaction_canceled_exception\nTransactionCommitInProgressException,transaction_commit_in_progress_exception\nTransactionCommittedException,transaction_committed_exception\nTransactionConflictException,transaction_conflict_exception\nTransactionData,transaction_data\nTransactionDescription,transaction_description\nTransactionEndTime,transaction_end_time\nTransactionEvent,transaction_event\nTransactionId,transaction_id\nTransactionInProgressException,transaction_in_progress_exception\nTransactionOutputItem,transaction_output_item\nTransactionStartTime,transaction_start_time\nTransactionStatus,transaction_status\nTransactionType,transaction_type\nTransactionalMessagesPerSecond,transactional_messages_per_second\nTransactions,transactions\nTranscodeProfileName,transcode_profile_name\nTranscript,transcript\nTranscriptEvent,transcript_event\nTranscriptFileUri,transcript_file_uri\nTranscriptFilter,transcript_filter\nTranscriptFilterType,transcript_filter_type\nTranscriptResultStream,transcript_result_stream\nTranscriptSourceSetting,transcript_source_setting\nTranscriptionConfiguration,transcription_configuration\nTranscriptionJob,transcription_job\nTranscriptionJobName,transcription_job_name\nTranscriptionJobStatus,transcription_job_status\nTranscriptionJobSummaries,transcription_job_summaries\nTranscriptionJobSummary,transcription_job_summary\nTranscriptionMessages,transcription_messages\nTranscriptionMessagesConcatenationConfiguration,transcription_messages_concatenation_configuration\nTransferAccountId,transfer_account_id\nTransferAlreadyCompletedException,transfer_already_completed_exception\nTransferCertificateRequest,transfer_certificate_request\nTransferCertificateResponse,transfer_certificate_response\nTransferConflictException,transfer_conflict_exception\nTransferContactRequest,transfer_contact_request\nTransferContactResponse,transfer_contact_response\nTransferData,transfer_data\nTransferDomainRequest,transfer_domain_request\nTransferDomainResponse,transfer_domain_response\nTransferDomainToAnotherAwsAccountRequest,transfer_domain_to_another_aws_account_request\nTransferDomainToAnotherAwsAccountResponse,transfer_domain_to_another_aws_account_response\nTransferDuration,transfer_duration\nTransferId,transfer_id\nTransferInputDeviceRequest,transfer_input_device_request\nTransferLock,transfer_lock\nTransferMessage,transfer_message\nTransferMode,transfer_mode\nTransferOfferAcceptedTimestamp,transfer_offer_accepted_timestamp\nTransferOfferExpirationTimestamp,transfer_offer_expiration_timestamp\nTransferOption,transfer_option\nTransferPrice,transfer_price\nTransferStatus,transfer_status\nTransferType,transfer_type\nTransferability,transferability\nTransferable,transferable\nTransferred,transferred\nTransferringInputDeviceSummary,transferring_input_device_summary\nTransform,transform\nTransformConfigParameter,transform_config_parameter\nTransformDataSource,transform_data_source\nTransformEncryption,transform_encryption\nTransformEndTime,transform_end_time\nTransformFilterCriteria,transform_filter_criteria\nTransformId,transform_id\nTransformIds,transform_ids\nTransformInput,transform_input\nTransformJob,transform_job\nTransformJobArn,transform_job_arn\nTransformJobDefinition,transform_job_definition\nTransformJobName,transform_job_name\nTransformJobStatus,transform_job_status\nTransformJobStepMetadata,transform_job_step_metadata\nTransformJobSummaries,transform_job_summaries\nTransformJobSummary,transform_job_summary\nTransformName,transform_name\nTransformOutput,transform_output\nTransformParameters,transform_parameters\nTransformProcessingConfig,transform_processing_config\nTransformResources,transform_resources\nTransformS3DataSource,transform_s3_data_source\nTransformSchema,transform_schema\nTransformSortCriteria,transform_sort_criteria\nTransformStartTime,transform_start_time\nTransformType,transform_type\nTransformationConfigurations,transformation_configurations\nTransformationRules,transformation_rules\nTransformationTool,transformation_tool\nTransformations,transformations\nTransforms,transforms\nTransitEncryption,transit_encryption\nTransitEncryptionEnabled,transit_encryption_enabled\nTransitEncryptionMode,transit_encryption_mode\nTransitEncryptionPort,transit_encryption_port\nTransitGateway,transit_gateway\nTransitGatewayAddress,transit_gateway_address\nTransitGatewayArn,transit_gateway_arn\nTransitGatewayArns,transit_gateway_arns\nTransitGatewayAsn,transit_gateway_asn\nTransitGatewayAssociation,transit_gateway_association\nTransitGatewayAttachment,transit_gateway_attachment\nTransitGatewayAttachmentArn,transit_gateway_attachment_arn\nTransitGatewayAttachmentAssociation,transit_gateway_attachment_association\nTransitGatewayAttachmentBgpConfiguration,transit_gateway_attachment_bgp_configuration\nTransitGatewayAttachmentId,transit_gateway_attachment_id\nTransitGatewayAttachmentIds,transit_gateway_attachment_ids\nTransitGatewayAttachmentPropagation,transit_gateway_attachment_propagation\nTransitGatewayAttachmentPropagations,transit_gateway_attachment_propagations\nTransitGatewayAttachments,transit_gateway_attachments\nTransitGatewayCidrBlocks,transit_gateway_cidr_blocks\nTransitGatewayConfiguration,transit_gateway_configuration\nTransitGatewayConnect,transit_gateway_connect\nTransitGatewayConnectOptions,transit_gateway_connect_options\nTransitGatewayConnectPeer,transit_gateway_connect_peer\nTransitGatewayConnectPeerArn,transit_gateway_connect_peer_arn\nTransitGatewayConnectPeerArns,transit_gateway_connect_peer_arns\nTransitGatewayConnectPeerAssociation,transit_gateway_connect_peer_association\nTransitGatewayConnectPeerAssociations,transit_gateway_connect_peer_associations\nTransitGatewayConnectPeerConfiguration,transit_gateway_connect_peer_configuration\nTransitGatewayConnectPeerId,transit_gateway_connect_peer_id\nTransitGatewayConnectPeerIds,transit_gateway_connect_peer_ids\nTransitGatewayConnectPeers,transit_gateway_connect_peers\nTransitGatewayConnectRequestBgpOptions,transit_gateway_connect_request_bgp_options\nTransitGatewayConnects,transit_gateway_connects\nTransitGatewayId,transit_gateway_id\nTransitGatewayIds,transit_gateway_ids\nTransitGatewayMulticastDeregisteredGroupMembers,transit_gateway_multicast_deregistered_group_members\nTransitGatewayMulticastDeregisteredGroupSources,transit_gateway_multicast_deregistered_group_sources\nTransitGatewayMulticastDomain,transit_gateway_multicast_domain\nTransitGatewayMulticastDomainArn,transit_gateway_multicast_domain_arn\nTransitGatewayMulticastDomainAssociation,transit_gateway_multicast_domain_association\nTransitGatewayMulticastDomainAssociations,transit_gateway_multicast_domain_associations\nTransitGatewayMulticastDomainId,transit_gateway_multicast_domain_id\nTransitGatewayMulticastDomainIds,transit_gateway_multicast_domain_ids\nTransitGatewayMulticastDomainOptions,transit_gateway_multicast_domain_options\nTransitGatewayMulticastDomains,transit_gateway_multicast_domains\nTransitGatewayMulticastGroup,transit_gateway_multicast_group\nTransitGatewayMulticastRegisteredGroupMembers,transit_gateway_multicast_registered_group_members\nTransitGatewayMulticastRegisteredGroupSources,transit_gateway_multicast_registered_group_sources\nTransitGatewayOptions,transit_gateway_options\nTransitGatewayOwnerId,transit_gateway_owner_id\nTransitGatewayPeering,transit_gateway_peering\nTransitGatewayPeeringAttachment,transit_gateway_peering_attachment\nTransitGatewayPeeringAttachmentId,transit_gateway_peering_attachment_id\nTransitGatewayPeeringAttachmentOptions,transit_gateway_peering_attachment_options\nTransitGatewayPeeringAttachments,transit_gateway_peering_attachments\nTransitGatewayPolicyRule,transit_gateway_policy_rule\nTransitGatewayPolicyRuleMetaData,transit_gateway_policy_rule_meta_data\nTransitGatewayPolicyTable,transit_gateway_policy_table\nTransitGatewayPolicyTableAssociation,transit_gateway_policy_table_association\nTransitGatewayPolicyTableEntries,transit_gateway_policy_table_entries\nTransitGatewayPolicyTableEntry,transit_gateway_policy_table_entry\nTransitGatewayPolicyTableId,transit_gateway_policy_table_id\nTransitGatewayPolicyTableIds,transit_gateway_policy_table_ids\nTransitGatewayPolicyTables,transit_gateway_policy_tables\nTransitGatewayPrefixListAttachment,transit_gateway_prefix_list_attachment\nTransitGatewayPrefixListReference,transit_gateway_prefix_list_reference\nTransitGatewayPrefixListReferences,transit_gateway_prefix_list_references\nTransitGatewayPropagation,transit_gateway_propagation\nTransitGatewayRegistration,transit_gateway_registration\nTransitGatewayRegistrationStateReason,transit_gateway_registration_state_reason\nTransitGatewayRegistrations,transit_gateway_registrations\nTransitGatewayRequestOptions,transit_gateway_request_options\nTransitGatewayRoute,transit_gateway_route\nTransitGatewayRouteAttachment,transit_gateway_route_attachment\nTransitGatewayRouteTable,transit_gateway_route_table\nTransitGatewayRouteTableAnnouncement,transit_gateway_route_table_announcement\nTransitGatewayRouteTableAnnouncementId,transit_gateway_route_table_announcement_id\nTransitGatewayRouteTableAnnouncementIds,transit_gateway_route_table_announcement_ids\nTransitGatewayRouteTableAnnouncements,transit_gateway_route_table_announcements\nTransitGatewayRouteTableArn,transit_gateway_route_table_arn\nTransitGatewayRouteTableAssociation,transit_gateway_route_table_association\nTransitGatewayRouteTableAttachment,transit_gateway_route_table_attachment\nTransitGatewayRouteTableId,transit_gateway_route_table_id\nTransitGatewayRouteTableIds,transit_gateway_route_table_ids\nTransitGatewayRouteTablePropagation,transit_gateway_route_table_propagation\nTransitGatewayRouteTablePropagations,transit_gateway_route_table_propagations\nTransitGatewayRouteTableRoute,transit_gateway_route_table_route\nTransitGatewayRouteTables,transit_gateway_route_tables\nTransitGatewayVpcAttachment,transit_gateway_vpc_attachment\nTransitGatewayVpcAttachmentOptions,transit_gateway_vpc_attachment_options\nTransitGatewayVpcAttachments,transit_gateway_vpc_attachments\nTransitGateways,transit_gateways\nTransition,transition\nTransitionEvent,transition_event\nTransitionState,transition_state\nTransitionToIA,transition_to_ia\nTransitionToPrimaryStorageClass,transition_to_primary_storage_class\nTransitions,transitions\nTransitiveTagKeys,transitive_tag_keys\nTranslateDocumentRequest,translate_document_request\nTranslateDocumentResponse,translate_document_response\nTranslatePinDataInput,translate_pin_data_input\nTranslatePinDataOutput,translate_pin_data_output\nTranslateTextRequest,translate_text_request\nTranslateTextResponse,translate_text_response\nTranslatedDocument,translated_document\nTranslatedDocumentsCount,translated_documents_count\nTranslatedText,translated_text\nTranslationPinDataIsoFormat034,translation_pin_data_iso_format034\nTranslationSettings,translation_settings\nTransmissionInterval,transmission_interval\nTransmitMode,transmit_mode\nTransport,transport\nTransportAttachmentId,transport_attachment_id\nTransportProtocol,transport_protocol\nTransportStreamBitrate,transport_stream_bitrate\nTransportStreamId,transport_stream_id\nTransportStreamReservedBitrate,transport_stream_reserved_bitrate\nTransportTransitGatewayAttachmentId,transport_transit_gateway_attachment_id\nTravelMode,travel_mode\nTreatMissingData,treat_missing_data\nTreatUndefinedSpecifiedValues,treat_undefined_specified_values\nTreatUnrecognizedResourceTypesAsWarnings,treat_unrecognized_resource_types_as_warnings\nTreatment,treatment\nTreatmentConfig,treatment_config\nTreatmentDescription,treatment_description\nTreatmentId,treatment_id\nTreatmentName,treatment_name\nTreatmentOption,treatment_option\nTreatmentResource,treatment_resource\nTreeMapAggregatedFieldWells,tree_map_aggregated_field_wells\nTreeMapConfiguration,tree_map_configuration\nTreeMapFieldWells,tree_map_field_wells\nTreeMapGroupItemsLimitConfiguration,tree_map_group_items_limit_configuration\nTreeMapSort,tree_map_sort\nTreeMapSortConfiguration,tree_map_sort_configuration\nTreeMapVisual,tree_map_visual\nTrendArrowOptions,trend_arrow_options\nTrendArrows,trend_arrows\nTrendGroupSort,trend_group_sort\nTrendGroups,trend_groups\nTrendmicro,trendmicro\nTrendmicroConnectorProfileCredentials,trendmicro_connector_profile_credentials\nTrendmicroSourceProperties,trendmicro_source_properties\nTrial,trial\nTrialArn,trial_arn\nTrialComponent,trial_component\nTrialComponentArn,trial_component_arn\nTrialComponentArtifact,trial_component_artifact\nTrialComponentDisplayName,trial_component_display_name\nTrialComponentMetricSummary,trial_component_metric_summary\nTrialComponentName,trial_component_name\nTrialComponentSimpleSummary,trial_component_simple_summary\nTrialComponentSource,trial_component_source\nTrialComponentSourceDetail,trial_component_source_detail\nTrialComponentStatus,trial_component_status\nTrialComponentSummaries,trial_component_summaries\nTrialComponentSummary,trial_component_summary\nTrialMinutes,trial_minutes\nTrialName,trial_name\nTrialSource,trial_source\nTrialSummaries,trial_summaries\nTrialSummary,trial_summary\nTrigger,trigger\nTriggerConfig,trigger_config\nTriggerDetails,trigger_details\nTriggerEventSource,trigger_event_source\nTriggerFindingId,trigger_finding_id\nTriggerName,trigger_name\nTriggerNames,trigger_names\nTriggerNodeDetails,trigger_node_details\nTriggerProperties,trigger_properties\nTriggerTargetsLimitExceededException,trigger_targets_limit_exceeded_exception\nTriggerTime,trigger_time\nTriggerType,trigger_type\nTriggerUpdate,trigger_update\nTriggerValue,trigger_value\nTriggeredAlarms,triggered_alarms\nTriggeredBy,triggered_by\nTriggeringDataset,triggering_dataset\nTriggers,triggers\nTriggersNotFound,triggers_not_found\nTrimBlanks,trim_blanks\nTrimSpaceInChar,trim_space_in_char\nTrimWhiteSpace,trim_white_space\nTrimmedDataAccessException,trimmed_data_access_exception\nTruckDimensions,truck_dimensions\nTruckModeOptions,truck_mode_options\nTruckWeight,truck_weight\nTrueActivity,true_activity\nTruePeakLimiterThreshold,true_peak_limiter_threshold\nTruncateColumns,truncate_columns\nTruncated,truncated\nTrunkInterfaceAssociation,trunk_interface_association\nTrunkInterfaceId,trunk_interface_id\nTrust,trust\nTrustAnchor,trust_anchor\nTrustAnchorCertificate,trust_anchor_certificate\nTrustAnchorDetail,trust_anchor_detail\nTrustAnchorDetailResponse,trust_anchor_detail_response\nTrustAnchors,trust_anchors\nTrustDirection,trust_direction\nTrustId,trust_id\nTrustIds,trust_ids\nTrustPassword,trust_password\nTrustProviderType,trust_provider_type\nTrustState,trust_state\nTrustStateReason,trust_state_reason\nTrustStore,trust_store\nTrustStoreSummary,trust_store_summary\nTrustType,trust_type\nTrustedAdvisorCategorySpecificSummary,trusted_advisor_category_specific_summary\nTrustedAdvisorCheckDescription,trusted_advisor_check_description\nTrustedAdvisorCheckRefreshStatus,trusted_advisor_check_refresh_status\nTrustedAdvisorCheckResult,trusted_advisor_check_result\nTrustedAdvisorCheckSummary,trusted_advisor_check_summary\nTrustedAdvisorCostOptimizingSummary,trusted_advisor_cost_optimizing_summary\nTrustedAdvisorIntegrationStatus,trusted_advisor_integration_status\nTrustedAdvisorResourceDetail,trusted_advisor_resource_detail\nTrustedAdvisorResourcesSummary,trusted_advisor_resources_summary\nTrustedCertificatePublicKey,trusted_certificate_public_key\nTrustedHostKeys,trusted_host_keys\nTrustedKeyGroupDoesNotExist,trusted_key_group_does_not_exist\nTrustedKeyGroups,trusted_key_groups\nTrustedResourceOwners,trusted_resource_owners\nTrustedSignerDoesNotExist,trusted_signer_does_not_exist\nTrustedSigners,trusted_signers\nTrusts,trusts\nTruststoreUri,truststore_uri\nTruststoreVersion,truststore_version\nTruststoreWarnings,truststore_warnings\nTruthyCellValue,truthy_cell_value\nTruthyCellValueSynonyms,truthy_cell_value_synonyms\nTsEncryptionMethod,ts_encryption_method\nTsFileMode,ts_file_mode\nTsIncludeDvbSubtitles,ts_include_dvb_subtitles\nTsUseAudioRenditionGroup,ts_use_audio_rendition_group\nTsvOptions,tsv_options\nTsvStoreOptions,tsv_store_options\nTsvVersionOptions,tsv_version_options\nTtl,ttl\nTtlDuration,ttl_duration\nTtmlDestinationSettings,ttml_destination_settings\nTuesday,tuesday\nTumblingWindow,tumbling_window\nTumblingWindowInSeconds,tumbling_window_in_seconds\nTunedHPOParams,tuned_hpo_params\nTunedHyperParameters,tuned_hyper_parameters\nTuningDataS3Uri,tuning_data_s3_uri\nTuningJob,tuning_job\nTuningJobArn,tuning_job_arn\nTuningJobCompletionCriteria,tuning_job_completion_criteria\nTuningJobCompletionDetails,tuning_job_completion_details\nTuningJobName,tuning_job_name\nTuningJobStepMetaData,tuning_job_step_meta_data\nTuningObjective,tuning_objective\nTunnel,tunnel\nTunnelInsideCidr,tunnel_inside_cidr\nTunnelInsideIpVersion,tunnel_inside_ip_version\nTunnelInsideIpv6Cidr,tunnel_inside_ipv6_cidr\nTunnelOption,tunnel_option\nTunnelOptions,tunnel_options\nTunnelSummary,tunnel_summary\nTurkErrorCode,turk_error_code\nTurnControlUrl,turn_control_url\nTurnSpecification,turn_specification\nTwitterParameters,twitter_parameters\nTwoWayChannelArn,two_way_channel_arn\nTwoWayEnabled,two_way_enabled\nType,type\nTypeAlreadyExistsFault,type_already_exists_fault\nTypeArn,type_arn\nTypeConfigurationAlias,type_configuration_alias\nTypeConfigurationArn,type_configuration_arn\nTypeConfigurationDetails,type_configuration_details\nTypeConfigurationIdentifier,type_configuration_identifier\nTypeConfigurationIdentifiers,type_configuration_identifiers\nTypeConfigurationNotFoundException,type_configuration_not_found_exception\nTypeConfigurationVersionId,type_configuration_version_id\nTypeConfigurations,type_configurations\nTypeDeprecatedFault,type_deprecated_fault\nTypeFilters,type_filters\nTypeHierarchy,type_hierarchy\nTypeId,type_id\nTypeIdentifier,type_identifier\nTypeName,type_name\nTypeNameAlias,type_name_alias\nTypeNamePrefix,type_name_prefix\nTypeNotFoundException,type_not_found_exception\nTypeParameters,type_parameters\nTypeSummaries,type_summaries\nTypeSummary,type_summary\nTypeTestsStatus,type_tests_status\nTypeTestsStatusDescription,type_tests_status_description\nTypeVersionArn,type_version_arn\nTypeVersionId,type_version_id\nTypeVersionSummaries,type_version_summaries\nTypeVersionSummary,type_version_summary\nTypedAttributeValueRange,typed_attribute_value_range\nTypedLinkAttributeDefinition,typed_link_attribute_definition\nTypedLinkAttributeRange,typed_link_attribute_range\nTypedLinkFacet,typed_link_facet\nTypedLinkFacetAttributeUpdate,typed_link_facet_attribute_update\nTypedLinkName,typed_link_name\nTypedLinkSchemaAndFacetName,typed_link_schema_and_facet_name\nTypedLinkSpecifier,typed_link_specifier\nTypedLinkSpecifiers,typed_link_specifiers\nTypes,types\nTypography,typography\nUIColorPalette,ui_color_palette\nUICustomization,ui_customization\nUICustomizationType,ui_customization_type\nURI,uri\nURL,url\nURLOperation,url_operation\nURLPath,url_path\nURLStyling,url_styling\nURLTarget,url_target\nURLTemplate,url_template\nUSD,usd\nUUID,uuid\nUarfcn,uarfcn\nUarfcndl,uarfcndl\nUdpContainerSettings,udp_container_settings\nUdpGroupSettings,udp_group_settings\nUdpOutputSettings,udp_output_settings\nUefiData,uefi_data\nUhdDeviceSettings,uhd_device_settings\nUiConfig,ui_config\nUiTemplate,ui_template\nUiTemplateInfo,ui_template_info\nUiTemplateS3Uri,ui_template_s3_uri\nUid,uid\nUlBucketSize,ul_bucket_size\nUlRate,ul_rate\nUlRatePolicy,ul_rate_policy\nUlimit,ulimit\nUlimits,ulimits\nUnAuthenticated,un_authenticated\nUnModifiedSinceConstraint,un_modified_since_constraint\nUnableToDetectSchemaException,unable_to_detect_schema_exception\nUnaggregatedField,unaggregated_field\nUnapplyCustomPermissions,unapply_custom_permissions\nUnarchiveApplicationRequest,unarchive_application_request\nUnarchiveFindingsRequest,unarchive_findings_request\nUnarchiveWaveRequest,unarchive_wave_request\nUnassignInstanceRequest,unassign_instance_request\nUnassignIpv6AddressesRequest,unassign_ipv6_addresses_request\nUnassignIpv6AddressesResult,unassign_ipv6_addresses_result\nUnassignPrivateIpAddressesRequest,unassign_private_ip_addresses_request\nUnassignPrivateNatGatewayAddressRequest,unassign_private_nat_gateway_address_request\nUnassignPrivateNatGatewayAddressResult,unassign_private_nat_gateway_address_result\nUnassignVolumeRequest,unassign_volume_request\nUnassignedIpv6Addresses,unassigned_ipv6_addresses\nUnassignedIpv6Prefixes,unassigned_ipv6_prefixes\nUnassigning,unassigning\nUnauthenticated,unauthenticated\nUnauthenticatedException,unauthenticated_exception\nUnauthenticatedLogin,unauthenticated_login\nUnauthorizedCacheControlHeaderStrategy,unauthorized_cache_control_header_strategy\nUnauthorizedClientException,unauthorized_client_exception\nUnauthorizedException,unauthorized_exception\nUnauthorizedOperation,unauthorized_operation\nUnauthorizedOperationException,unauthorized_operation_exception\nUnauthorizedPartnerIntegrationFault,unauthorized_partner_integration_fault\nUnauthorizedResourceAccessException,unauthorized_resource_access_exception\nUnavailablePriorities,unavailable_priorities\nUncertaintyRange,uncertainty_range\nUnclaimDeviceRequest,unclaim_device_request\nUnclaimDeviceResponse,unclaim_device_response\nUndeploy,undeploy\nUndeploySystemInstanceRequest,undeploy_system_instance_request\nUndeploySystemInstanceResponse,undeploy_system_instance_response\nUndeprecateActivityTypeInput,undeprecate_activity_type_input\nUndeprecateDomainInput,undeprecate_domain_input\nUndeprecateWorkflowTypeInput,undeprecate_workflow_type_input\nUnderlayIpAddress,underlay_ip_address\nUndetectedDocumentTypes,undetected_document_types\nUndetectedSignature,undetected_signature\nUndetectedSignatures,undetected_signatures\nUndoRedoDisabled,undo_redo_disabled\nUnexpectedLambdaException,unexpected_lambda_exception\nUnfilteredPartition,unfiltered_partition\nUnfilteredPartitions,unfiltered_partitions\nUngroupResourcesInput,ungroup_resources_input\nUngroupResourcesOutput,ungroup_resources_output\nUnhealthySince,unhealthy_since\nUnhealthyThreshold,unhealthy_threshold\nUnhealthyThresholdCount,unhealthy_threshold_count\nUnicodeIcon,unicode_icon\nUniformBorder,uniform_border\nUniformResourceIdentifier,uniform_resource_identifier\nUnindexedFace,unindexed_face\nUnindexedFaces,unindexed_faces\nUninitializedAccountException,uninitialized_account_exception\nUnion,union\nUnionType,union_type\nUniqueAccountIdentifier,unique_account_identifier\nUniqueAttribute,unique_attribute\nUniqueContributors,unique_contributors\nUniqueId,unique_id\nUniqueKey,unique_key\nUniqueProblem,unique_problem\nUniqueProgramId,unique_program_id\nUniqueRequestToken,unique_request_token\nUniqueTag,unique_tag\nUniqueTagResourceIdentifier,unique_tag_resource_identifier\nUniqueThreatNameCount,unique_threat_name_count\nUniqueTicPerAudioTrack,unique_tic_per_audio_track\nUniqueValues,unique_values\nUniqueValuesComputation,unique_values_computation\nUnit,unit\nUnitCost,unit_cost\nUnitLabel,unit_label\nUnitNumber,unit_number\nUnitScaler,unit_scaler\nUnitType,unit_type\nUnits,units\nUnknown,unknown\nUnknownHostCount,unknown_host_count\nUnknownIpPermissions,unknown_ip_permissions\nUnknownMonitorException,unknown_monitor_exception\nUnknownResourceException,unknown_resource_exception\nUnknownResourceFault,unknown_resource_fault\nUnknownSnapshotCopyRegionFault,unknown_snapshot_copy_region_fault\nUnknownSubscriptionException,unknown_subscription_exception\nUnlabelParameterVersionRequest,unlabel_parameter_version_request\nUnlabelParameterVersionResult,unlabel_parameter_version_result\nUnlabeled,unlabeled\nUnlinkDeveloperIdentityInput,unlink_developer_identity_input\nUnlinkIdentityInput,unlink_identity_input\nUnlockCode,unlock_code\nUnlockDelay,unlock_delay\nUnlockDelayUnit,unlock_delay_unit\nUnlockDelayValue,unlock_delay_value\nUnlockRuleRequest,unlock_rule_request\nUnlockRuleResponse,unlock_rule_response\nUnmappedAttribute,unmapped_attribute\nUnmappedAttributes,unmapped_attributes\nUnmatchedFaces,unmatched_faces\nUnmatchedPolicyPermissionException,unmatched_policy_permission_exception\nUnmodifiableEntityException,unmodifiable_entity_exception\nUnmonitorInstancesRequest,unmonitor_instances_request\nUnmonitorInstancesResult,unmonitor_instances_result\nUnpeerVpcResult,unpeer_vpc_result\nUnpredictableNumber,unpredictable_number\nUnprocessableEntityException,unprocessable_entity_exception\nUnprocessedAccount,unprocessed_account\nUnprocessedAccounts,unprocessed_accounts\nUnprocessedAssociationUpdates,unprocessed_association_updates\nUnprocessedAssociations,unprocessed_associations\nUnprocessedAutomationRule,unprocessed_automation_rule\nUnprocessedAutomationRules,unprocessed_automation_rules\nUnprocessedCluster,unprocessed_cluster\nUnprocessedClusters,unprocessed_clusters\nUnprocessedDataSources,unprocessed_data_sources\nUnprocessedDataSourcesResult,unprocessed_data_sources_result\nUnprocessedFindings,unprocessed_findings\nUnprocessedGraph,unprocessed_graph\nUnprocessedGraphs,unprocessed_graphs\nUnprocessedIdentifiers,unprocessed_identifiers\nUnprocessedIdentityId,unprocessed_identity_id\nUnprocessedIdentityIds,unprocessed_identity_ids\nUnprocessedIds,unprocessed_ids\nUnprocessedItems,unprocessed_items\nUnprocessedKeys,unprocessed_keys\nUnprocessedNamedQueryId,unprocessed_named_query_id\nUnprocessedNamedQueryIds,unprocessed_named_query_ids\nUnprocessedPreparedStatementName,unprocessed_prepared_statement_name\nUnprocessedPreparedStatementNames,unprocessed_prepared_statement_names\nUnprocessedQueryExecutionId,unprocessed_query_execution_id\nUnprocessedQueryExecutionIds,unprocessed_query_execution_ids\nUnprocessedRecords,unprocessed_records\nUnprocessedResourceIdentifiers,unprocessed_resource_identifiers\nUnprocessedScramSecret,unprocessed_scram_secret\nUnprocessedScramSecrets,unprocessed_scram_secrets\nUnprocessedSecurityControl,unprocessed_security_control\nUnprocessedStandardsControlAssociation,unprocessed_standards_control_association\nUnprocessedStandardsControlAssociationUpdate,unprocessed_standards_control_association_update\nUnprocessedStatistics,unprocessed_statistics\nUnprocessedTraceIds,unprocessed_trace_ids\nUnprocessedTraceSegment,unprocessed_trace_segment\nUnprocessedTraceSegments,unprocessed_trace_segments\nUnprocessedTypeConfigurations,unprocessed_type_configurations\nUnprocessedUpdateAction,unprocessed_update_action\nUnprocessedUpdateActions,unprocessed_update_actions\nUnrealizedSavings,unrealized_savings\nUnrecognizedClientException,unrecognized_client_exception\nUnrecognizedFaces,unrecognized_faces\nUnrecognizedPublicKeyEncodingException,unrecognized_public_key_encoding_exception\nUnrecognizedResourceTypes,unrecognized_resource_types\nUnregisterConnectorRequest,unregister_connector_request\nUnregisteredSeiTimecode,unregistered_sei_timecode\nUnreportedNotApplicableCount,unreported_not_applicable_count\nUnreservedConcurrentExecutions,unreserved_concurrent_executions\nUnresolvableUsageUnitException,unresolvable_usage_unit_exception\nUnscaledValue,unscaled_value\nUnsearchedFace,unsearched_face\nUnsearchedFaces,unsearched_faces\nUnshareApplicationRequest,unshare_application_request\nUnshareDirectoryRequest,unshare_directory_request\nUnshareDirectoryResult,unshare_directory_result\nUnshareInterval,unshare_interval\nUnshareIntervalUnit,unshare_interval_unit\nUnshareTarget,unshare_target\nUnspecifiedCount,unspecified_count\nUnsubscribeAll,unsubscribe_all\nUnsubscribeFromDatasetRequest,unsubscribe_from_dataset_request\nUnsubscribeFromEventRequest,unsubscribe_from_event_request\nUnsubscribeInput,unsubscribe_input\nUnsubscribeRequest,unsubscribe_request\nUnsubscribeResult,unsubscribe_result\nUnsuccessful,unsuccessful\nUnsuccessfulFaceAssociation,unsuccessful_face_association\nUnsuccessfulFaceAssociations,unsuccessful_face_associations\nUnsuccessfulFaceDeletion,unsuccessful_face_deletion\nUnsuccessfulFaceDeletions,unsuccessful_face_deletions\nUnsuccessfulFaceDisassociation,unsuccessful_face_disassociation\nUnsuccessfulFaceDisassociations,unsuccessful_face_disassociations\nUnsuccessfulFleetDeletions,unsuccessful_fleet_deletions\nUnsuccessfulFleetRequests,unsuccessful_fleet_requests\nUnsuccessfulInstanceCreditSpecificationItem,unsuccessful_instance_credit_specification_item\nUnsuccessfulInstanceCreditSpecificationItemError,unsuccessful_instance_credit_specification_item_error\nUnsuccessfulInstanceCreditSpecifications,unsuccessful_instance_credit_specifications\nUnsuccessfulItem,unsuccessful_item\nUnsuccessfulItemError,unsuccessful_item_error\nUnsuccessfullyDeletedLaunchTemplateVersions,unsuccessfully_deleted_launch_template_versions\nUnsupportedAPIEndpointException,unsupported_api_endpoint_exception\nUnsupportedActionException,unsupported_action_exception\nUnsupportedActionForDeploymentTypeException,unsupported_action_for_deployment_type_exception\nUnsupportedAddressException,unsupported_address_exception\nUnsupportedAvailabilityZone,unsupported_availability_zone\nUnsupportedAvailabilityZoneException,unsupported_availability_zone_exception\nUnsupportedCalendarException,unsupported_calendar_exception\nUnsupportedCommandException,unsupported_command_exception\nUnsupportedDigitalSignatureMethodException,unsupported_digital_signature_method_exception\nUnsupportedDisplayLanguageCodeException,unsupported_display_language_code_exception\nUnsupportedDocumentEncodingException,unsupported_document_encoding_exception\nUnsupportedDocumentException,unsupported_document_exception\nUnsupportedFeatureException,unsupported_feature_exception\nUnsupportedFeatureRequiredException,unsupported_feature_required_exception\nUnsupportedGrantTypeException,unsupported_grant_type_exception\nUnsupportedIdentityProviderException,unsupported_identity_provider_exception\nUnsupportedImageTypeException,unsupported_image_type_exception\nUnsupportedIndexTypeException,unsupported_index_type_exception\nUnsupportedInventoryItemContextException,unsupported_inventory_item_context_exception\nUnsupportedInventorySchemaVersionException,unsupported_inventory_schema_version_exception\nUnsupportedLanguageException,unsupported_language_exception\nUnsupportedLanguagePairException,unsupported_language_pair_exception\nUnsupportedLocale,unsupported_locale\nUnsupportedMediaTypeException,unsupported_media_type_exception\nUnsupportedNetworkConfigurationException,unsupported_network_configuration_exception\nUnsupportedOperatingSystem,unsupported_operating_system\nUnsupportedOperation,unsupported_operation\nUnsupportedOperationException,unsupported_operation_exception\nUnsupportedOperationFault,unsupported_operation_fault\nUnsupportedOptionFault,unsupported_option_fault\nUnsupportedParameterType,unsupported_parameter_type\nUnsupportedPlatformType,unsupported_platform_type\nUnsupportedPlsAlphabetException,unsupported_pls_alphabet_exception\nUnsupportedPlsLanguageException,unsupported_pls_language_exception\nUnsupportedPricingPlanException,unsupported_pricing_plan_exception\nUnsupportedProtocolException,unsupported_protocol_exception\nUnsupportedRegionException,unsupported_region_exception\nUnsupportedResource,unsupported_resource\nUnsupportedSettingsException,unsupported_settings_exception\nUnsupportedStreamMediaTypeException,unsupported_stream_media_type_exception\nUnsupportedTLD,unsupported_tld\nUnsupportedTimestamps,unsupported_timestamps\nUnsupportedTokenTypeException,unsupported_token_type_exception\nUnsupportedUpstreamRegistryException,unsupported_upstream_registry_exception\nUnsupportedUserEditionException,unsupported_user_edition_exception\nUnsupportedUserStateException,unsupported_user_state_exception\nUnsupportedWorkspaceConfigurationException,unsupported_workspace_configuration_exception\nUntagAttendeeRequest,untag_attendee_request\nUntagCertificateAuthorityRequest,untag_certificate_authority_request\nUntagColumnOperation,untag_column_operation\nUntagDeliveryStreamInput,untag_delivery_stream_input\nUntagInput,untag_input\nUntagInstanceProfileRequest,untag_instance_profile_request\nUntagLogGroupRequest,untag_log_group_request\nUntagMFADeviceRequest,untag_mfa_device_request\nUntagMeetingRequest,untag_meeting_request\nUntagOpenIDConnectProviderRequest,untag_open_id_connect_provider_request\nUntagOutput,untag_output\nUntagPolicyRequest,untag_policy_request\nUntagProjectRequest,untag_project_request\nUntagQueueRequest,untag_queue_request\nUntagResourceInput,untag_resource_input\nUntagResourceOutput,untag_resource_output\nUntagResourceRequest,untag_resource_request\nUntagResourceResponse,untag_resource_response\nUntagResourceResult,untag_resource_result\nUntagResourcesInput,untag_resources_input\nUntagResourcesOutput,untag_resources_output\nUntagRoleRequest,untag_role_request\nUntagSAMLProviderRequest,untag_saml_provider_request\nUntagServerCertificateRequest,untag_server_certificate_request\nUntagStreamInput,untag_stream_input\nUntagUserRequest,untag_user_request\nUntrustedArtifactOnDeployment,untrusted_artifact_on_deployment\nUnusedAccountValidityDays,unused_account_validity_days\nUnusedCommitment,unused_commitment\nUnusedHours,unused_hours\nUnusedUnits,unused_units\nUnwrap,unwrap\nUpScaling,up_scaling\nUpdate,update\nUpdateACLRequest,update_acl_request\nUpdateACLResponse,update_acl_response\nUpdateAbpV1_0_x,update_abp_v1_0_x\nUpdateAbpV1_1,update_abp_v1_1\nUpdateAcceleratorAttributesRequest,update_accelerator_attributes_request\nUpdateAcceleratorAttributesResponse,update_accelerator_attributes_response\nUpdateAcceleratorRequest,update_accelerator_request\nUpdateAcceleratorResponse,update_accelerator_response\nUpdateAccessControlConfigurationRequest,update_access_control_configuration_request\nUpdateAccessKeyRequest,update_access_key_request\nUpdateAccessLogSubscriptionRequest,update_access_log_subscription_request\nUpdateAccessLogSubscriptionResponse,update_access_log_subscription_response\nUpdateAccessPolicyRequest,update_access_policy_request\nUpdateAccessPolicyResponse,update_access_policy_response\nUpdateAccessRequest,update_access_request\nUpdateAccessResponse,update_access_response\nUpdateAccountAuditConfigurationRequest,update_account_audit_configuration_request\nUpdateAccountConfigurationRequest,update_account_configuration_request\nUpdateAccountConfigurationResponse,update_account_configuration_response\nUpdateAccountCustomizationRequest,update_account_customization_request\nUpdateAccountCustomizationResponse,update_account_customization_response\nUpdateAccountPasswordPolicyRequest,update_account_password_policy_request\nUpdateAccountRequest,update_account_request\nUpdateAccountResponse,update_account_response\nUpdateAccountSendingEnabledRequest,update_account_sending_enabled_request\nUpdateAccountSettingsInput,update_account_settings_input\nUpdateAccountSettingsOutput,update_account_settings_output\nUpdateAccountSettingsRequest,update_account_settings_request\nUpdateAccountSettingsResponse,update_account_settings_response\nUpdateAction,update_action\nUpdateActionAvailableDate,update_action_available_date\nUpdateActionRequest,update_action_request\nUpdateActionResponse,update_action_response\nUpdateActionResultsMessage,update_action_results_message\nUpdateActionStatus,update_action_status\nUpdateActionStatusModifiedDate,update_action_status_modified_date\nUpdateActionTargetRequest,update_action_target_request\nUpdateActionTypeInput,update_action_type_input\nUpdateActions,update_actions\nUpdateActionsMessage,update_actions_message\nUpdateActiveModelVersionRequest,update_active_model_version_request\nUpdateActiveModelVersionResponse,update_active_model_version_response\nUpdateActivities,update_activities\nUpdateAddonRequest,update_addon_request\nUpdateAddonResponse,update_addon_response\nUpdateAddress,update_address\nUpdateAddressBookRequest,update_address_book_request\nUpdateAdmChannelRequest,update_adm_channel_request\nUpdateAdmChannelResponse,update_adm_channel_response\nUpdateAgentLogLevel,update_agent_log_level\nUpdateAgentRequest,update_agent_request\nUpdateAgentStatusRequest,update_agent_status_request\nUpdateAgentStatusResponse,update_agent_status_response\nUpdateAgreementRequest,update_agreement_request\nUpdateAgreementResponse,update_agreement_response\nUpdateAlarmModelRequest,update_alarm_model_request\nUpdateAlarmModelResponse,update_alarm_model_response\nUpdateAlertRequest,update_alert_request\nUpdateAlertResponse,update_alert_response\nUpdateAliasInput,update_alias_input\nUpdateAliasOutput,update_alias_output\nUpdateAliasRequest,update_alias_request\nUpdateAllowListRequest,update_allow_list_request\nUpdateAllowListResponse,update_allow_list_response\nUpdateAnalysisPermissionsRequest,update_analysis_permissions_request\nUpdateAnalysisPermissionsResponse,update_analysis_permissions_response\nUpdateAnalysisRequest,update_analysis_request\nUpdateAnalysisResponse,update_analysis_response\nUpdateAnalysisTemplateInput,update_analysis_template_input\nUpdateAnalysisTemplateOutput,update_analysis_template_output\nUpdateAnnotationStoreRequest,update_annotation_store_request\nUpdateAnnotationStoreResponse,update_annotation_store_response\nUpdateAnnotationStoreVersionRequest,update_annotation_store_version_request\nUpdateAnnotationStoreVersionResponse,update_annotation_store_version_response\nUpdateAnomalyDetectorRequest,update_anomaly_detector_request\nUpdateAnomalyDetectorResponse,update_anomaly_detector_response\nUpdateAnomalyMonitorRequest,update_anomaly_monitor_request\nUpdateAnomalyMonitorResponse,update_anomaly_monitor_response\nUpdateAnomalySubscriptionRequest,update_anomaly_subscription_request\nUpdateAnomalySubscriptionResponse,update_anomaly_subscription_response\nUpdateAnswerInput,update_answer_input\nUpdateAnswerOutput,update_answer_output\nUpdateApiCacheRequest,update_api_cache_request\nUpdateApiCacheResponse,update_api_cache_response\nUpdateApiDestinationRequest,update_api_destination_request\nUpdateApiDestinationResponse,update_api_destination_response\nUpdateApiKeyRequest,update_api_key_request\nUpdateApiKeyResponse,update_api_key_response\nUpdateApiMappingRequest,update_api_mapping_request\nUpdateApiMappingResponse,update_api_mapping_response\nUpdateApiRequest,update_api_request\nUpdateApiResponse,update_api_response\nUpdateApnsChannelRequest,update_apns_channel_request\nUpdateApnsChannelResponse,update_apns_channel_response\nUpdateApnsSandboxChannelRequest,update_apns_sandbox_channel_request\nUpdateApnsSandboxChannelResponse,update_apns_sandbox_channel_response\nUpdateApnsVoipChannelRequest,update_apns_voip_channel_request\nUpdateApnsVoipChannelResponse,update_apns_voip_channel_response\nUpdateApnsVoipSandboxChannelRequest,update_apns_voip_sandbox_channel_request\nUpdateApnsVoipSandboxChannelResponse,update_apns_voip_sandbox_channel_response\nUpdateAppAuthorizationRequest,update_app_authorization_request\nUpdateAppAuthorizationResponse,update_app_authorization_response\nUpdateAppBlockBuilderRequest,update_app_block_builder_request\nUpdateAppBlockBuilderResult,update_app_block_builder_result\nUpdateAppImageConfigRequest,update_app_image_config_request\nUpdateAppImageConfigResponse,update_app_image_config_response\nUpdateAppInstanceBotRequest,update_app_instance_bot_request\nUpdateAppInstanceBotResponse,update_app_instance_bot_response\nUpdateAppInstanceRequest,update_app_instance_request\nUpdateAppInstanceResponse,update_app_instance_response\nUpdateAppInstanceUserEndpointRequest,update_app_instance_user_endpoint_request\nUpdateAppInstanceUserEndpointResponse,update_app_instance_user_endpoint_response\nUpdateAppInstanceUserRequest,update_app_instance_user_request\nUpdateAppInstanceUserResponse,update_app_instance_user_response\nUpdateAppMonitorRequest,update_app_monitor_request\nUpdateAppRequest,update_app_request\nUpdateAppResponse,update_app_response\nUpdateAppResult,update_app_result\nUpdateAppVersionAppComponentRequest,update_app_version_app_component_request\nUpdateAppVersionAppComponentResponse,update_app_version_app_component_response\nUpdateAppVersionRequest,update_app_version_request\nUpdateAppVersionResourceRequest,update_app_version_resource_request\nUpdateAppVersionResourceResponse,update_app_version_resource_response\nUpdateAppVersionResponse,update_app_version_response\nUpdateApplicationComponentConfigRequest,update_application_component_config_request\nUpdateApplicationInput,update_application_input\nUpdateApplicationLayerAutomaticResponseRequest,update_application_layer_automatic_response_request\nUpdateApplicationMaintenanceConfigurationRequest,update_application_maintenance_configuration_request\nUpdateApplicationMaintenanceConfigurationResponse,update_application_maintenance_configuration_response\nUpdateApplicationMessage,update_application_message\nUpdateApplicationRequest,update_application_request\nUpdateApplicationResourceLifecycleMessage,update_application_resource_lifecycle_message\nUpdateApplicationResponse,update_application_response\nUpdateApplicationResult,update_application_result\nUpdateApplicationSettingsInput,update_application_settings_input\nUpdateApplicationSettingsOutput,update_application_settings_output\nUpdateApplicationSettingsRequest,update_application_settings_request\nUpdateApplicationSettingsResponse,update_application_settings_response\nUpdateApplicationVersionMessage,update_application_version_message\nUpdateApprovalRuleTemplateContentInput,update_approval_rule_template_content_input\nUpdateApprovalRuleTemplateContentOutput,update_approval_rule_template_content_output\nUpdateApprovalRuleTemplateDescriptionInput,update_approval_rule_template_description_input\nUpdateApprovalRuleTemplateDescriptionOutput,update_approval_rule_template_description_output\nUpdateApprovalRuleTemplateNameInput,update_approval_rule_template_name_input\nUpdateApprovalRuleTemplateNameOutput,update_approval_rule_template_name_output\nUpdateArchiveRequest,update_archive_request\nUpdateArchiveResponse,update_archive_response\nUpdateArchiveRuleRequest,update_archive_rule_request\nUpdateArtifactRequest,update_artifact_request\nUpdateArtifactResponse,update_artifact_response\nUpdateAssessmentControlRequest,update_assessment_control_request\nUpdateAssessmentControlResponse,update_assessment_control_response\nUpdateAssessmentControlSetStatusRequest,update_assessment_control_set_status_request\nUpdateAssessmentControlSetStatusResponse,update_assessment_control_set_status_response\nUpdateAssessmentFrameworkControlSet,update_assessment_framework_control_set\nUpdateAssessmentFrameworkRequest,update_assessment_framework_request\nUpdateAssessmentFrameworkResponse,update_assessment_framework_response\nUpdateAssessmentFrameworkShareRequest,update_assessment_framework_share_request\nUpdateAssessmentFrameworkShareResponse,update_assessment_framework_share_response\nUpdateAssessmentRequest,update_assessment_request\nUpdateAssessmentResponse,update_assessment_response\nUpdateAssessmentStatusRequest,update_assessment_status_request\nUpdateAssessmentStatusResponse,update_assessment_status_response\nUpdateAssessmentTargetRequest,update_assessment_target_request\nUpdateAssetModelRequest,update_asset_model_request\nUpdateAssetModelResponse,update_asset_model_response\nUpdateAssetPropertyRequest,update_asset_property_request\nUpdateAssetRequest,update_asset_request\nUpdateAssetResponse,update_asset_response\nUpdateAssociationRequest,update_association_request\nUpdateAssociationResult,update_association_result\nUpdateAssociationStatusRequest,update_association_status_request\nUpdateAssociationStatusResult,update_association_status_result\nUpdateAssumeRolePolicyRequest,update_assume_role_policy_request\nUpdateAttendeeCapabilitiesRequest,update_attendee_capabilities_request\nUpdateAttendeeCapabilitiesResponse,update_attendee_capabilities_response\nUpdateAttributeGroupRequest,update_attribute_group_request\nUpdateAttributeGroupResponse,update_attribute_group_response\nUpdateAttributesRequest,update_attributes_request\nUpdateAuditStreamConfigurationRequest,update_audit_stream_configuration_request\nUpdateAuditSuppressionRequest,update_audit_suppression_request\nUpdateAuthEventFeedbackRequest,update_auth_event_feedback_request\nUpdateAuthorizerRequest,update_authorizer_request\nUpdateAuthorizerResponse,update_authorizer_response\nUpdateAutoScalingGroupType,update_auto_scaling_group_type\nUpdateAutomatedDiscoveryConfigurationRequest,update_automated_discovery_configuration_request\nUpdateAutomaticTapeCreationPolicyInput,update_automatic_tape_creation_policy_input\nUpdateAutomaticTapeCreationPolicyOutput,update_automatic_tape_creation_policy_output\nUpdateAutomationRulesRequestItem,update_automation_rules_request_item\nUpdateAutomationRulesRequestItems,update_automation_rules_request_items\nUpdateAvailabilityConfigurationRequest,update_availability_configuration_request\nUpdateAvailabilityOptionsRequest,update_availability_options_request\nUpdateAvailabilityOptionsResponse,update_availability_options_response\nUpdateAvailable,update_available\nUpdateBackendAPIRequest,update_backend_api_request\nUpdateBackendAPIResponse,update_backend_api_response\nUpdateBackendAuthForgotPasswordConfig,update_backend_auth_forgot_password_config\nUpdateBackendAuthIdentityPoolConfig,update_backend_auth_identity_pool_config\nUpdateBackendAuthMFAConfig,update_backend_auth_mfa_config\nUpdateBackendAuthOAuthConfig,update_backend_auth_o_auth_config\nUpdateBackendAuthPasswordPolicyConfig,update_backend_auth_password_policy_config\nUpdateBackendAuthRequest,update_backend_auth_request\nUpdateBackendAuthResourceConfig,update_backend_auth_resource_config\nUpdateBackendAuthResponse,update_backend_auth_response\nUpdateBackendAuthUserPoolConfig,update_backend_auth_user_pool_config\nUpdateBackendAuthVerificationMessageConfig,update_backend_auth_verification_message_config\nUpdateBackendConfigRequest,update_backend_config_request\nUpdateBackendConfigResponse,update_backend_config_response\nUpdateBackendJobRequest,update_backend_job_request\nUpdateBackendJobResponse,update_backend_job_response\nUpdateBackendStorageRequest,update_backend_storage_request\nUpdateBackendStorageResourceConfig,update_backend_storage_resource_config\nUpdateBackendStorageResponse,update_backend_storage_response\nUpdateBackupPlanInput,update_backup_plan_input\nUpdateBackupPlanOutput,update_backup_plan_output\nUpdateBaiduChannelRequest,update_baidu_channel_request\nUpdateBaiduChannelResponse,update_baidu_channel_response\nUpdateBandwidthRateLimitInput,update_bandwidth_rate_limit_input\nUpdateBandwidthRateLimitOutput,update_bandwidth_rate_limit_output\nUpdateBandwidthRateLimitScheduleInput,update_bandwidth_rate_limit_schedule_input\nUpdateBandwidthRateLimitScheduleOutput,update_bandwidth_rate_limit_schedule_output\nUpdateBasePathMappingRequest,update_base_path_mapping_request\nUpdateBatchPredictionInput,update_batch_prediction_input\nUpdateBatchPredictionOutput,update_batch_prediction_output\nUpdateBehavior,update_behavior\nUpdateBillingGroupAccountGrouping,update_billing_group_account_grouping\nUpdateBillingGroupInput,update_billing_group_input\nUpdateBillingGroupOutput,update_billing_group_output\nUpdateBillingGroupRequest,update_billing_group_request\nUpdateBillingGroupResponse,update_billing_group_response\nUpdateBlueprintRequest,update_blueprint_request\nUpdateBlueprintResponse,update_blueprint_response\nUpdateBotAliasRequest,update_bot_alias_request\nUpdateBotAliasResponse,update_bot_alias_response\nUpdateBotLocaleRequest,update_bot_locale_request\nUpdateBotLocaleResponse,update_bot_locale_response\nUpdateBotRecommendationRequest,update_bot_recommendation_request\nUpdateBotRecommendationResponse,update_bot_recommendation_response\nUpdateBotRequest,update_bot_request\nUpdateBotResponse,update_bot_response\nUpdateBranchRequest,update_branch_request\nUpdateBranchResult,update_branch_result\nUpdateBridgeFlowSourceRequest,update_bridge_flow_source_request\nUpdateBridgeNetworkOutputRequest,update_bridge_network_output_request\nUpdateBridgeNetworkSourceRequest,update_bridge_network_source_request\nUpdateBridgeOutputRequest,update_bridge_output_request\nUpdateBridgeOutputResponse,update_bridge_output_response\nUpdateBridgeRequest,update_bridge_request\nUpdateBridgeResponse,update_bridge_response\nUpdateBridgeSourceRequest,update_bridge_source_request\nUpdateBridgeSourceResponse,update_bridge_source_response\nUpdateBridgeStateRequest,update_bridge_state_request\nUpdateBridgeStateResponse,update_bridge_state_response\nUpdateBrokerCountRequest,update_broker_count_request\nUpdateBrokerCountResponse,update_broker_count_response\nUpdateBrokerRequest,update_broker_request\nUpdateBrokerResponse,update_broker_response\nUpdateBrokerStorageRequest,update_broker_storage_request\nUpdateBrokerStorageResponse,update_broker_storage_response\nUpdateBrokerTypeRequest,update_broker_type_request\nUpdateBrokerTypeResponse,update_broker_type_response\nUpdateBrowserSettingsRequest,update_browser_settings_request\nUpdateBrowserSettingsResponse,update_browser_settings_response\nUpdateBucketBundleRequest,update_bucket_bundle_request\nUpdateBucketBundleResult,update_bucket_bundle_result\nUpdateBucketRequest,update_bucket_request\nUpdateBucketResult,update_bucket_result\nUpdateBudgetActionRequest,update_budget_action_request\nUpdateBudgetActionResponse,update_budget_action_response\nUpdateBudgetRequest,update_budget_request\nUpdateBuildInput,update_build_input\nUpdateBuildOutput,update_build_output\nUpdateBusinessReportScheduleRequest,update_business_report_schedule_request\nUpdateByteMatchSetRequest,update_byte_match_set_request\nUpdateByteMatchSetResponse,update_byte_match_set_response\nUpdateCACertificateParams,update_ca_certificate_params\nUpdateCACertificateRequest,update_ca_certificate_request\nUpdateCachePolicyRequest,update_cache_policy_request\nUpdateCachePolicyResult,update_cache_policy_result\nUpdateCalculatedAttributeDefinitionRequest,update_calculated_attribute_definition_request\nUpdateCalculatedAttributeDefinitionResponse,update_calculated_attribute_definition_response\nUpdateCallAnalyticsCategoryRequest,update_call_analytics_category_request\nUpdateCallAnalyticsCategoryResponse,update_call_analytics_category_response\nUpdateCampaignDialerConfigRequest,update_campaign_dialer_config_request\nUpdateCampaignNameRequest,update_campaign_name_request\nUpdateCampaignOutboundCallConfigRequest,update_campaign_outbound_call_config_request\nUpdateCampaignRequest,update_campaign_request\nUpdateCampaignResponse,update_campaign_response\nUpdateCanaryRequest,update_canary_request\nUpdateCapacityProviderRequest,update_capacity_provider_request\nUpdateCapacityProviderResponse,update_capacity_provider_response\nUpdateCapacityReservationInput,update_capacity_reservation_input\nUpdateCaseRequest,update_case_request\nUpdateCellRequest,update_cell_request\nUpdateCellResponse,update_cell_response\nUpdateCertificateAuthorityRequest,update_certificate_authority_request\nUpdateCertificateOptionsRequest,update_certificate_options_request\nUpdateCertificateRequest,update_certificate_request\nUpdateCertificateResponse,update_certificate_response\nUpdateChangesetRequest,update_changeset_request\nUpdateChangesetResponse,update_changeset_response\nUpdateChannelClassRequest,update_channel_class_request\nUpdateChannelClassResponse,update_channel_class_response\nUpdateChannelFlowRequest,update_channel_flow_request\nUpdateChannelFlowResponse,update_channel_flow_response\nUpdateChannelGroupRequest,update_channel_group_request\nUpdateChannelGroupResponse,update_channel_group_response\nUpdateChannelMessageRequest,update_channel_message_request\nUpdateChannelMessageResponse,update_channel_message_response\nUpdateChannelReadMarkerRequest,update_channel_read_marker_request\nUpdateChannelReadMarkerResponse,update_channel_read_marker_response\nUpdateChannelRequest,update_channel_request\nUpdateChannelResponse,update_channel_response\nUpdateChapCredentialsInput,update_chap_credentials_input\nUpdateChapCredentialsOutput,update_chap_credentials_output\nUpdateClassificationJobRequest,update_classification_job_request\nUpdateClassificationScopeRequest,update_classification_scope_request\nUpdateClassifierRequest,update_classifier_request\nUpdateClientCertificateRequest,update_client_certificate_request\nUpdateCloudFormationCollectionFilter,update_cloud_formation_collection_filter\nUpdateCloudFrontOriginAccessIdentityRequest,update_cloud_front_origin_access_identity_request\nUpdateCloudFrontOriginAccessIdentityResult,update_cloud_front_origin_access_identity_result\nUpdateClusterConfigRequest,update_cluster_config_request\nUpdateClusterConfigResponse,update_cluster_config_response\nUpdateClusterConfigurationRequest,update_cluster_configuration_request\nUpdateClusterConfigurationResponse,update_cluster_configuration_response\nUpdateClusterInput,update_cluster_input\nUpdateClusterKafkaVersionRequest,update_cluster_kafka_version_request\nUpdateClusterKafkaVersionResponse,update_cluster_kafka_version_response\nUpdateClusterOutput,update_cluster_output\nUpdateClusterRequest,update_cluster_request\nUpdateClusterResponse,update_cluster_response\nUpdateClusterSettingsRequest,update_cluster_settings_request\nUpdateClusterSettingsResponse,update_cluster_settings_response\nUpdateClusterVersionRequest,update_cluster_version_request\nUpdateClusterVersionResponse,update_cluster_version_response\nUpdateCodeRepositoryInput,update_code_repository_input\nUpdateCodeRepositoryOutput,update_code_repository_output\nUpdateCodeSigningConfigRequest,update_code_signing_config_request\nUpdateCodeSigningConfigResponse,update_code_signing_config_response\nUpdateCognitoUserPoolConfiguration,update_cognito_user_pool_configuration\nUpdateCollaborationInput,update_collaboration_input\nUpdateCollaborationOutput,update_collaboration_output\nUpdateCollectionDetail,update_collection_detail\nUpdateCollectionRequest,update_collection_request\nUpdateCollectionResponse,update_collection_response\nUpdateColumnStatisticsForPartitionRequest,update_column_statistics_for_partition_request\nUpdateColumnStatisticsForPartitionResponse,update_column_statistics_for_partition_response\nUpdateColumnStatisticsForTableRequest,update_column_statistics_for_table_request\nUpdateColumnStatisticsForTableResponse,update_column_statistics_for_table_response\nUpdateCommentInput,update_comment_input\nUpdateCommentOutput,update_comment_output\nUpdateCompanyNetworkConfigurationRequest,update_company_network_configuration_request\nUpdateComponentConfigurationRequest,update_component_configuration_request\nUpdateComponentData,update_component_data\nUpdateComponentInput,update_component_input\nUpdateComponentOutput,update_component_output\nUpdateComponentRequest,update_component_request\nUpdateComponentResponse,update_component_response\nUpdateComponentTypeRequest,update_component_type_request\nUpdateComponentTypeResponse,update_component_type_response\nUpdateComputeEnvironmentRequest,update_compute_environment_request\nUpdateComputeEnvironmentResponse,update_compute_environment_response\nUpdateConditionalForwarderRequest,update_conditional_forwarder_request\nUpdateConferenceProviderRequest,update_conference_provider_request\nUpdateConfigRequest,update_config_request\nUpdateConfigurationProfileRequest,update_configuration_profile_request\nUpdateConfigurationRequest,update_configuration_request\nUpdateConfigurationResponse,update_configuration_response\nUpdateConfigurationSetEventDestinationRequest,update_configuration_set_event_destination_request\nUpdateConfigurationSetReputationMetricsEnabledRequest,update_configuration_set_reputation_metrics_enabled_request\nUpdateConfigurationSetSendingEnabledRequest,update_configuration_set_sending_enabled_request\nUpdateConfigurationSetTrackingOptionsRequest,update_configuration_set_tracking_options_request\nUpdateConfigurationTemplateMessage,update_configuration_template_message\nUpdateConfiguredTableAnalysisRuleInput,update_configured_table_analysis_rule_input\nUpdateConfiguredTableAnalysisRuleOutput,update_configured_table_analysis_rule_output\nUpdateConfiguredTableAssociationInput,update_configured_table_association_input\nUpdateConfiguredTableAssociationOutput,update_configured_table_association_output\nUpdateConfiguredTableInput,update_configured_table_input\nUpdateConfiguredTableOutput,update_configured_table_output\nUpdateConnectClientAddInRequest,update_connect_client_add_in_request\nUpdateConnectionAliasPermissionRequest,update_connection_alias_permission_request\nUpdateConnectionApiKeyAuthRequestParameters,update_connection_api_key_auth_request_parameters\nUpdateConnectionAuthRequestParameters,update_connection_auth_request_parameters\nUpdateConnectionBasicAuthRequestParameters,update_connection_basic_auth_request_parameters\nUpdateConnectionOAuthClientRequestParameters,update_connection_o_auth_client_request_parameters\nUpdateConnectionOAuthRequestParameters,update_connection_o_auth_request_parameters\nUpdateConnectionRequest,update_connection_request\nUpdateConnectionResponse,update_connection_response\nUpdateConnectivityInfoRequest,update_connectivity_info_request\nUpdateConnectivityInfoResponse,update_connectivity_info_response\nUpdateConnectivityRequest,update_connectivity_request\nUpdateConnectivityResponse,update_connectivity_response\nUpdateConnectorDefinitionRequest,update_connector_definition_request\nUpdateConnectorProfileRequest,update_connector_profile_request\nUpdateConnectorProfileResponse,update_connector_profile_response\nUpdateConnectorRegistrationRequest,update_connector_registration_request\nUpdateConnectorRegistrationResponse,update_connector_registration_response\nUpdateConnectorRequest,update_connector_request\nUpdateConnectorResponse,update_connector_response\nUpdateConstraintInput,update_constraint_input\nUpdateConstraintOutput,update_constraint_output\nUpdateContactAttributesRequest,update_contact_attributes_request\nUpdateContactChannelRequest,update_contact_channel_request\nUpdateContactEvaluationRequest,update_contact_evaluation_request\nUpdateContactEvaluationResponse,update_contact_evaluation_response\nUpdateContactFlowContentRequest,update_contact_flow_content_request\nUpdateContactFlowMetadataRequest,update_contact_flow_metadata_request\nUpdateContactFlowModuleContentRequest,update_contact_flow_module_content_request\nUpdateContactFlowModuleMetadataRequest,update_contact_flow_module_metadata_request\nUpdateContactFlowNameRequest,update_contact_flow_name_request\nUpdateContactListRequest,update_contact_list_request\nUpdateContactRequest,update_contact_request\nUpdateContactScheduleRequest,update_contact_schedule_request\nUpdateContainerAgentRequest,update_container_agent_request\nUpdateContainerAgentResponse,update_container_agent_response\nUpdateContainerInstancesStateRequest,update_container_instances_state_request\nUpdateContainerInstancesStateResponse,update_container_instances_state_response\nUpdateContainerServiceRequest,update_container_service_request\nUpdateContainerServiceResult,update_container_service_result\nUpdateContentRequest,update_content_request\nUpdateContentResponse,update_content_response\nUpdateContextRequest,update_context_request\nUpdateContextResponse,update_context_response\nUpdateContinuousBackupsInput,update_continuous_backups_input\nUpdateContinuousBackupsOutput,update_continuous_backups_output\nUpdateContinuousDeploymentPolicyRequest,update_continuous_deployment_policy_request\nUpdateContinuousDeploymentPolicyResult,update_continuous_deployment_policy_result\nUpdateContributorInsightsInput,update_contributor_insights_input\nUpdateContributorInsightsOutput,update_contributor_insights_output\nUpdateControlPanelRequest,update_control_panel_request\nUpdateControlPanelResponse,update_control_panel_response\nUpdateControlRequest,update_control_request\nUpdateControlResponse,update_control_response\nUpdateCoreDefinitionRequest,update_core_definition_request\nUpdateCoreNetworkRequest,update_core_network_request\nUpdateCoreNetworkResponse,update_core_network_response\nUpdateCostAllocationTagsStatusError,update_cost_allocation_tags_status_error\nUpdateCostAllocationTagsStatusRequest,update_cost_allocation_tags_status_request\nUpdateCostAllocationTagsStatusResponse,update_cost_allocation_tags_status_response\nUpdateCostCategoryDefinitionRequest,update_cost_category_definition_request\nUpdateCostCategoryDefinitionResponse,update_cost_category_definition_response\nUpdateCount,update_count\nUpdateCrawlerRequest,update_crawler_request\nUpdateCrawlerScheduleRequest,update_crawler_schedule_request\nUpdateCrlRequest,update_crl_request\nUpdateCsvClassifierRequest,update_csv_classifier_request\nUpdateCustomKeyStoreRequest,update_custom_key_store_request\nUpdateCustomLineItemChargeDetails,update_custom_line_item_charge_details\nUpdateCustomLineItemFlatChargeDetails,update_custom_line_item_flat_charge_details\nUpdateCustomLineItemInput,update_custom_line_item_input\nUpdateCustomLineItemOutput,update_custom_line_item_output\nUpdateCustomLineItemPercentageChargeDetails,update_custom_line_item_percentage_charge_details\nUpdateCustomMetricRequest,update_custom_metric_request\nUpdateCustomMetricResponse,update_custom_metric_response\nUpdateCustomRoutingAcceleratorAttributesRequest,update_custom_routing_accelerator_attributes_request\nUpdateCustomRoutingAcceleratorAttributesResponse,update_custom_routing_accelerator_attributes_response\nUpdateCustomRoutingAcceleratorRequest,update_custom_routing_accelerator_request\nUpdateCustomRoutingAcceleratorResponse,update_custom_routing_accelerator_response\nUpdateCustomRoutingListenerRequest,update_custom_routing_listener_request\nUpdateCustomRoutingListenerResponse,update_custom_routing_listener_response\nUpdateCustomVerificationEmailTemplateRequest,update_custom_verification_email_template_request\nUpdateDashboardPermissionsRequest,update_dashboard_permissions_request\nUpdateDashboardPermissionsResponse,update_dashboard_permissions_response\nUpdateDashboardPublishedVersionRequest,update_dashboard_published_version_request\nUpdateDashboardPublishedVersionResponse,update_dashboard_published_version_response\nUpdateDashboardRequest,update_dashboard_request\nUpdateDashboardResponse,update_dashboard_response\nUpdateDataCatalogInput,update_data_catalog_input\nUpdateDataCellsFilterRequest,update_data_cells_filter_request\nUpdateDataIntegrationRequest,update_data_integration_request\nUpdateDataLakeExceptionSubscriptionRequest,update_data_lake_exception_subscription_request\nUpdateDataLakeRequest,update_data_lake_request\nUpdateDataLakeResponse,update_data_lake_response\nUpdateDataQualityRulesetRequest,update_data_quality_ruleset_request\nUpdateDataQualityRulesetResponse,update_data_quality_ruleset_response\nUpdateDataRepositoryAssociationRequest,update_data_repository_association_request\nUpdateDataRepositoryAssociationResponse,update_data_repository_association_response\nUpdateDataRetentionInput,update_data_retention_input\nUpdateDataRole,update_data_role\nUpdateDataSecurityConfig,update_data_security_config\nUpdateDataSetPermissionsRequest,update_data_set_permissions_request\nUpdateDataSetPermissionsResponse,update_data_set_permissions_response\nUpdateDataSetRequest,update_data_set_request\nUpdateDataSetResponse,update_data_set_response\nUpdateDataSource,update_data_source\nUpdateDataSourceInput,update_data_source_input\nUpdateDataSourceOutput,update_data_source_output\nUpdateDataSourcePermissionsRequest,update_data_source_permissions_request\nUpdateDataSourcePermissionsResponse,update_data_source_permissions_response\nUpdateDataSourceRequest,update_data_source_request\nUpdateDataSourceResponse,update_data_source_response\nUpdateDatabaseRequest,update_database_request\nUpdateDatabaseResponse,update_database_response\nUpdateDatasetEntriesRequest,update_dataset_entries_request\nUpdateDatasetEntriesResponse,update_dataset_entries_response\nUpdateDatasetGroupRequest,update_dataset_group_request\nUpdateDatasetRequest,update_dataset_request\nUpdateDatasetResponse,update_dataset_response\nUpdateDatasourcePackagesRequest,update_datasource_packages_request\nUpdateDatastoreRequest,update_datastore_request\nUpdateDate,update_date\nUpdateDateTime,update_date_time\nUpdateDecoderManifestRequest,update_decoder_manifest_request\nUpdateDecoderManifestResponse,update_decoder_manifest_response\nUpdateDefaultAutoScalingConfigurationRequest,update_default_auto_scaling_configuration_request\nUpdateDefaultAutoScalingConfigurationResponse,update_default_auto_scaling_configuration_response\nUpdateDefaultBranchInput,update_default_branch_input\nUpdateDefaultMailDomainRequest,update_default_mail_domain_request\nUpdateDeletionProtectionInput,update_deletion_protection_input\nUpdateDeploymentGroupInput,update_deployment_group_input\nUpdateDeploymentGroupOutput,update_deployment_group_output\nUpdateDeploymentRequest,update_deployment_request\nUpdateDeploymentResponse,update_deployment_response\nUpdateDeploymentStrategyRequest,update_deployment_strategy_request\nUpdateDestinationInput,update_destination_input\nUpdateDestinationRequest,update_destination_request\nUpdateDestinationResponse,update_destination_response\nUpdateDetectorModelRequest,update_detector_model_request\nUpdateDetectorModelResponse,update_detector_model_response\nUpdateDetectorRequest,update_detector_request\nUpdateDetectorVersionMetadataRequest,update_detector_version_metadata_request\nUpdateDetectorVersionRequest,update_detector_version_request\nUpdateDetectorVersionStatusRequest,update_detector_version_status_request\nUpdateDevEndpointRequest,update_dev_endpoint_request\nUpdateDevEnvironmentRequest,update_dev_environment_request\nUpdateDevEnvironmentResponse,update_dev_environment_response\nUpdateDeviceCertificateParams,update_device_certificate_params\nUpdateDeviceDefinitionRequest,update_device_definition_request\nUpdateDeviceFleetRequest,update_device_fleet_request\nUpdateDeviceInstanceRequest,update_device_instance_request\nUpdateDeviceInstanceResult,update_device_instance_result\nUpdateDeviceMetadataRequest,update_device_metadata_request\nUpdateDeviceMetadataResponse,update_device_metadata_response\nUpdateDevicePolicyConfigurationRequest,update_device_policy_configuration_request\nUpdateDevicePoolRequest,update_device_pool_request\nUpdateDevicePoolResult,update_device_pool_result\nUpdateDeviceRequest,update_device_request\nUpdateDeviceResponse,update_device_response\nUpdateDeviceStateRequest,update_device_state_request\nUpdateDeviceStatusRequest,update_device_status_request\nUpdateDevicesRequest,update_devices_request\nUpdateDimensionRequest,update_dimension_request\nUpdateDimensionResponse,update_dimension_response\nUpdateDirectConnectGatewayAssociationRequest,update_direct_connect_gateway_association_request\nUpdateDirectConnectGatewayAssociationResult,update_direct_connect_gateway_association_result\nUpdateDirectConnectGatewayRequest,update_direct_connect_gateway_request\nUpdateDirectConnectGatewayResponse,update_direct_connect_gateway_response\nUpdateDirectoryConfigRequest,update_directory_config_request\nUpdateDirectoryConfigResult,update_directory_config_result\nUpdateDirectorySetupRequest,update_directory_setup_request\nUpdateDiscovererRequest,update_discoverer_request\nUpdateDiscovererResponse,update_discoverer_response\nUpdateDiscoveryJobRequest,update_discovery_job_request\nUpdateDistributionBundleRequest,update_distribution_bundle_request\nUpdateDistributionBundleResult,update_distribution_bundle_result\nUpdateDistributionConfigurationRequest,update_distribution_configuration_request\nUpdateDistributionConfigurationResponse,update_distribution_configuration_response\nUpdateDistributionRequest,update_distribution_request\nUpdateDistributionResult,update_distribution_result\nUpdateDistributionWithStagingConfigRequest,update_distribution_with_staging_config_request\nUpdateDistributionWithStagingConfigResult,update_distribution_with_staging_config_result\nUpdateDocumentDefaultVersionRequest,update_document_default_version_request\nUpdateDocumentDefaultVersionResult,update_document_default_version_result\nUpdateDocumentMetadataRequest,update_document_metadata_request\nUpdateDocumentRequest,update_document_request\nUpdateDocumentResult,update_document_result\nUpdateDocumentVersionRequest,update_document_version_request\nUpdateDocumentationPartRequest,update_documentation_part_request\nUpdateDocumentationVersionRequest,update_documentation_version_request\nUpdateDomainAssociationRequest,update_domain_association_request\nUpdateDomainAssociationResult,update_domain_association_result\nUpdateDomainConfigRequest,update_domain_config_request\nUpdateDomainConfigResponse,update_domain_config_response\nUpdateDomainConfigurationRequest,update_domain_configuration_request\nUpdateDomainConfigurationResponse,update_domain_configuration_response\nUpdateDomainContactPrivacyRequest,update_domain_contact_privacy_request\nUpdateDomainContactPrivacyResponse,update_domain_contact_privacy_response\nUpdateDomainContactRequest,update_domain_contact_request\nUpdateDomainContactResponse,update_domain_contact_response\nUpdateDomainEndpointOptionsRequest,update_domain_endpoint_options_request\nUpdateDomainEndpointOptionsResponse,update_domain_endpoint_options_response\nUpdateDomainEntryRequest,update_domain_entry_request\nUpdateDomainEntryResult,update_domain_entry_result\nUpdateDomainMetadataRequest,update_domain_metadata_request\nUpdateDomainNameRequest,update_domain_name_request\nUpdateDomainNameResponse,update_domain_name_response\nUpdateDomainNameserversRequest,update_domain_nameservers_request\nUpdateDomainNameserversResponse,update_domain_nameservers_response\nUpdateDomainRequest,update_domain_request\nUpdateDomainResponse,update_domain_response\nUpdateDynamicThingGroupRequest,update_dynamic_thing_group_request\nUpdateDynamicThingGroupResponse,update_dynamic_thing_group_response\nUpdateEc2DeepInspectionConfigurationRequest,update_ec2_deep_inspection_configuration_request\nUpdateEc2DeepInspectionConfigurationResponse,update_ec2_deep_inspection_configuration_response\nUpdateEgressGatewayBridgeRequest,update_egress_gateway_bridge_request\nUpdateElasticIpRequest,update_elastic_ip_request\nUpdateElasticsearchDomainConfigRequest,update_elasticsearch_domain_config_request\nUpdateElasticsearchDomainConfigResponse,update_elasticsearch_domain_config_response\nUpdateEmailChannelRequest,update_email_channel_request\nUpdateEmailChannelResponse,update_email_channel_response\nUpdateEmailIdentityPolicyRequest,update_email_identity_policy_request\nUpdateEmailTemplateRequest,update_email_template_request\nUpdateEmailTemplateResponse,update_email_template_response\nUpdateEmergencyContactSettingsRequest,update_emergency_contact_settings_request\nUpdateEncryption,update_encryption\nUpdateEncryptionKeyRequest,update_encryption_key_request\nUpdateEndOfMeetingReminder,update_end_of_meeting_reminder\nUpdateEndpointAccessRequest,update_endpoint_access_request\nUpdateEndpointAccessResponse,update_endpoint_access_response\nUpdateEndpointGroupRequest,update_endpoint_group_request\nUpdateEndpointGroupResponse,update_endpoint_group_response\nUpdateEndpointInput,update_endpoint_input\nUpdateEndpointOutput,update_endpoint_output\nUpdateEndpointRequest,update_endpoint_request\nUpdateEndpointResponse,update_endpoint_response\nUpdateEndpointWeightsAndCapacitiesInput,update_endpoint_weights_and_capacities_input\nUpdateEndpointWeightsAndCapacitiesOutput,update_endpoint_weights_and_capacities_output\nUpdateEndpointsBatchRequest,update_endpoints_batch_request\nUpdateEndpointsBatchResponse,update_endpoints_batch_response\nUpdateEnrollmentStatusRequest,update_enrollment_status_request\nUpdateEnrollmentStatusResponse,update_enrollment_status_response\nUpdateEntitlementRequest,update_entitlement_request\nUpdateEntitlementResult,update_entitlement_result\nUpdateEntityRequest,update_entity_request\nUpdateEntityResponse,update_entity_response\nUpdateEnvironmentAccountConnectionInput,update_environment_account_connection_input\nUpdateEnvironmentAccountConnectionOutput,update_environment_account_connection_output\nUpdateEnvironmentInput,update_environment_input\nUpdateEnvironmentMembershipRequest,update_environment_membership_request\nUpdateEnvironmentMembershipResult,update_environment_membership_result\nUpdateEnvironmentMessage,update_environment_message\nUpdateEnvironmentOutput,update_environment_output\nUpdateEnvironmentRequest,update_environment_request\nUpdateEnvironmentResponse,update_environment_response\nUpdateEnvironmentTemplateInput,update_environment_template_input\nUpdateEnvironmentTemplateOutput,update_environment_template_output\nUpdateEnvironmentTemplateVersionInput,update_environment_template_version_input\nUpdateEnvironmentTemplateVersionOutput,update_environment_template_version_output\nUpdateEphemerisRequest,update_ephemeris_request\nUpdateError,update_error\nUpdateEtlLibraries,update_etl_libraries\nUpdateEvaluationFormRequest,update_evaluation_form_request\nUpdateEvaluationFormResponse,update_evaluation_form_response\nUpdateEvaluationInput,update_evaluation_input\nUpdateEvaluationOutput,update_evaluation_output\nUpdateEventActionRequest,update_event_action_request\nUpdateEventActionResponse,update_event_action_response\nUpdateEventConfigurationByResourceTypesRequest,update_event_configuration_by_resource_types_request\nUpdateEventConfigurationsRequest,update_event_configurations_request\nUpdateEventDataStoreRequest,update_event_data_store_request\nUpdateEventDataStoreResponse,update_event_data_store_response\nUpdateEventDestinationRequest,update_event_destination_request\nUpdateEventDestinationResult,update_event_destination_result\nUpdateEventIntegrationRequest,update_event_integration_request\nUpdateEventLabelRequest,update_event_label_request\nUpdateEventSourceMappingRequest,update_event_source_mapping_request\nUpdateEventSourcesConfigRequest,update_event_sources_config_request\nUpdateExperienceRequest,update_experience_request\nUpdateExperimentRequest,update_experiment_request\nUpdateExperimentResponse,update_experiment_response\nUpdateExperimentTemplateActionInputItem,update_experiment_template_action_input_item\nUpdateExperimentTemplateLogConfigurationInput,update_experiment_template_log_configuration_input\nUpdateExperimentTemplateRequest,update_experiment_template_request\nUpdateExperimentTemplateResponse,update_experiment_template_response\nUpdateExperimentTemplateStopConditionInput,update_experiment_template_stop_condition_input\nUpdateExperimentTemplateTargetInput,update_experiment_template_target_input\nUpdateExpirationForHITRequest,update_expiration_for_hit_request\nUpdateExportRequest,update_export_request\nUpdateExportResponse,update_export_response\nUpdateExpression,update_expression\nUpdateExtensionAssociationRequest,update_extension_association_request\nUpdateExtensionRequest,update_extension_request\nUpdateFPorts,update_f_ports\nUpdateFacetRequest,update_facet_request\nUpdateFailbackReplicationConfigurationRequest,update_failback_replication_configuration_request\nUpdateFailoverConfig,update_failover_config\nUpdateFeatureGroupRequest,update_feature_group_request\nUpdateFeatureGroupResponse,update_feature_group_response\nUpdateFeatureMetadataRequest,update_feature_metadata_request\nUpdateFeatureRequest,update_feature_request\nUpdateFeatureResponse,update_feature_response\nUpdateFeaturedResultsSetRequest,update_featured_results_set_request\nUpdateFeaturedResultsSetResponse,update_featured_results_set_response\nUpdateFieldLevelEncryptionConfigRequest,update_field_level_encryption_config_request\nUpdateFieldLevelEncryptionConfigResult,update_field_level_encryption_config_result\nUpdateFieldLevelEncryptionProfileRequest,update_field_level_encryption_profile_request\nUpdateFieldLevelEncryptionProfileResult,update_field_level_encryption_profile_result\nUpdateFieldRequest,update_field_request\nUpdateFileCacheLustreConfiguration,update_file_cache_lustre_configuration\nUpdateFileCacheRequest,update_file_cache_request\nUpdateFileCacheResponse,update_file_cache_response\nUpdateFileSystemAssociationInput,update_file_system_association_input\nUpdateFileSystemAssociationOutput,update_file_system_association_output\nUpdateFileSystemLustreConfiguration,update_file_system_lustre_configuration\nUpdateFileSystemOntapConfiguration,update_file_system_ontap_configuration\nUpdateFileSystemOpenZFSConfiguration,update_file_system_open_zfs_configuration\nUpdateFileSystemRequest,update_file_system_request\nUpdateFileSystemResponse,update_file_system_response\nUpdateFileSystemWindowsConfiguration,update_file_system_windows_configuration\nUpdateFilterRequest,update_filter_request\nUpdateFilterResponse,update_filter_response\nUpdateFindingAggregatorRequest,update_finding_aggregator_request\nUpdateFindingAggregatorResponse,update_finding_aggregator_response\nUpdateFindingsFeedbackRequest,update_findings_feedback_request\nUpdateFindingsFilterRequest,update_findings_filter_request\nUpdateFindingsFilterResponse,update_findings_filter_response\nUpdateFindingsRequest,update_findings_request\nUpdateFirewallConfigRequest,update_firewall_config_request\nUpdateFirewallConfigResponse,update_firewall_config_response\nUpdateFirewallDeleteProtectionRequest,update_firewall_delete_protection_request\nUpdateFirewallDeleteProtectionResponse,update_firewall_delete_protection_response\nUpdateFirewallDescriptionRequest,update_firewall_description_request\nUpdateFirewallDescriptionResponse,update_firewall_description_response\nUpdateFirewallDomainsRequest,update_firewall_domains_request\nUpdateFirewallDomainsResponse,update_firewall_domains_response\nUpdateFirewallEncryptionConfigurationRequest,update_firewall_encryption_configuration_request\nUpdateFirewallEncryptionConfigurationResponse,update_firewall_encryption_configuration_response\nUpdateFirewallPolicyChangeProtectionRequest,update_firewall_policy_change_protection_request\nUpdateFirewallPolicyChangeProtectionResponse,update_firewall_policy_change_protection_response\nUpdateFirewallPolicyRequest,update_firewall_policy_request\nUpdateFirewallPolicyResponse,update_firewall_policy_response\nUpdateFirewallRuleGroupAssociationRequest,update_firewall_rule_group_association_request\nUpdateFirewallRuleGroupAssociationResponse,update_firewall_rule_group_association_response\nUpdateFirewallRuleRequest,update_firewall_rule_request\nUpdateFirewallRuleResponse,update_firewall_rule_response\nUpdateFleetAttributesInput,update_fleet_attributes_input\nUpdateFleetAttributesOutput,update_fleet_attributes_output\nUpdateFleetCapacityInput,update_fleet_capacity_input\nUpdateFleetCapacityOutput,update_fleet_capacity_output\nUpdateFleetMetadataRequest,update_fleet_metadata_request\nUpdateFleetMetricRequest,update_fleet_metric_request\nUpdateFleetPortSettingsInput,update_fleet_port_settings_input\nUpdateFleetPortSettingsOutput,update_fleet_port_settings_output\nUpdateFleetRequest,update_fleet_request\nUpdateFleetResponse,update_fleet_response\nUpdateFleetResult,update_fleet_result\nUpdateFlowEntitlementRequest,update_flow_entitlement_request\nUpdateFlowEntitlementResponse,update_flow_entitlement_response\nUpdateFlowMediaStreamRequest,update_flow_media_stream_request\nUpdateFlowMediaStreamResponse,update_flow_media_stream_response\nUpdateFlowOutputRequest,update_flow_output_request\nUpdateFlowOutputResponse,update_flow_output_response\nUpdateFlowRequest,update_flow_request\nUpdateFlowResponse,update_flow_response\nUpdateFlowSourceRequest,update_flow_source_request\nUpdateFlowSourceResponse,update_flow_source_response\nUpdateFlowTemplateRequest,update_flow_template_request\nUpdateFlowTemplateResponse,update_flow_template_response\nUpdateFlywheelRequest,update_flywheel_request\nUpdateFlywheelResponse,update_flywheel_response\nUpdateFolderPermissionsRequest,update_folder_permissions_request\nUpdateFolderPermissionsResponse,update_folder_permissions_response\nUpdateFolderRequest,update_folder_request\nUpdateFolderResponse,update_folder_response\nUpdateFormData,update_form_data\nUpdateFormRequest,update_form_request\nUpdateFormResponse,update_form_response\nUpdateFrameworkInput,update_framework_input\nUpdateFrameworkOutput,update_framework_output\nUpdateFreeTierConfig,update_free_tier_config\nUpdateFunctionCodeRequest,update_function_code_request\nUpdateFunctionConfigurationRequest,update_function_configuration_request\nUpdateFunctionDefinitionRequest,update_function_definition_request\nUpdateFunctionEventInvokeConfigRequest,update_function_event_invoke_config_request\nUpdateFunctionRequest,update_function_request\nUpdateFunctionResponse,update_function_response\nUpdateFunctionResult,update_function_result\nUpdateFunctionUrlConfigRequest,update_function_url_config_request\nUpdateFunctionUrlConfigResponse,update_function_url_config_response\nUpdateFuotaTaskRequest,update_fuota_task_request\nUpdateGameConfigurationRequest,update_game_configuration_request\nUpdateGameConfigurationResult,update_game_configuration_result\nUpdateGameRequest,update_game_request\nUpdateGameResult,update_game_result\nUpdateGameServerGroupInput,update_game_server_group_input\nUpdateGameServerGroupOutput,update_game_server_group_output\nUpdateGameServerInput,update_game_server_input\nUpdateGameServerOutput,update_game_server_output\nUpdateGameSessionInput,update_game_session_input\nUpdateGameSessionOutput,update_game_session_output\nUpdateGameSessionQueueInput,update_game_session_queue_input\nUpdateGameSessionQueueOutput,update_game_session_queue_output\nUpdateGatewayBridgeSourceRequest,update_gateway_bridge_source_request\nUpdateGatewayCapabilityConfigurationRequest,update_gateway_capability_configuration_request\nUpdateGatewayCapabilityConfigurationResponse,update_gateway_capability_configuration_response\nUpdateGatewayGroupRequest,update_gateway_group_request\nUpdateGatewayInformationInput,update_gateway_information_input\nUpdateGatewayInformationOutput,update_gateway_information_output\nUpdateGatewayInstanceRequest,update_gateway_instance_request\nUpdateGatewayInstanceResponse,update_gateway_instance_response\nUpdateGatewayRequest,update_gateway_request\nUpdateGatewayResponseRequest,update_gateway_response_request\nUpdateGatewayRouteInput,update_gateway_route_input\nUpdateGatewayRouteOutput,update_gateway_route_output\nUpdateGatewaySoftwareNowInput,update_gateway_software_now_input\nUpdateGatewaySoftwareNowOutput,update_gateway_software_now_output\nUpdateGcmChannelRequest,update_gcm_channel_request\nUpdateGcmChannelResponse,update_gcm_channel_response\nUpdateGeoMatchSetRequest,update_geo_match_set_request\nUpdateGeoMatchSetResponse,update_geo_match_set_response\nUpdateGeofenceCollectionRequest,update_geofence_collection_request\nUpdateGeofenceCollectionResponse,update_geofence_collection_response\nUpdateGlobalNetworkRequest,update_global_network_request\nUpdateGlobalNetworkResponse,update_global_network_response\nUpdateGlobalSecondaryIndexAction,update_global_secondary_index_action\nUpdateGlobalSettingsInput,update_global_settings_input\nUpdateGlobalSettingsRequest,update_global_settings_request\nUpdateGlobalTableInput,update_global_table_input\nUpdateGlobalTableOutput,update_global_table_output\nUpdateGlobalTableSettingsInput,update_global_table_settings_input\nUpdateGlobalTableSettingsOutput,update_global_table_settings_output\nUpdateGraphqlApiRequest,update_graphql_api_request\nUpdateGraphqlApiResponse,update_graphql_api_response\nUpdateGrokClassifierRequest,update_grok_classifier_request\nUpdateGroupCertificateConfigurationRequest,update_group_certificate_configuration_request\nUpdateGroupCertificateConfigurationResponse,update_group_certificate_configuration_response\nUpdateGroupInput,update_group_input\nUpdateGroupOutput,update_group_output\nUpdateGroupQueryInput,update_group_query_input\nUpdateGroupQueryOutput,update_group_query_output\nUpdateGroupRequest,update_group_request\nUpdateGroupResponse,update_group_response\nUpdateGroupResult,update_group_result\nUpdateHITReviewStatusRequest,update_hit_review_status_request\nUpdateHITTypeOfHITRequest,update_hit_type_of_hit_request\nUpdateHealthCheckRequest,update_health_check_request\nUpdateHealthCheckResponse,update_health_check_response\nUpdateHostInput,update_host_input\nUpdateHostKeyRequest,update_host_key_request\nUpdateHostKeyResponse,update_host_key_response\nUpdateHostedZoneCommentRequest,update_hosted_zone_comment_request\nUpdateHostedZoneCommentResponse,update_hosted_zone_comment_response\nUpdateHoursOfOperationRequest,update_hours_of_operation_request\nUpdateHttpNamespaceRequest,update_http_namespace_request\nUpdateHttpNamespaceResponse,update_http_namespace_response\nUpdateHubRequest,update_hub_request\nUpdateHubResponse,update_hub_response\nUpdateHypervisorInput,update_hypervisor_input\nUpdateHypervisorOutput,update_hypervisor_output\nUpdateIAMPolicyAssignmentRequest,update_iam_policy_assignment_request\nUpdateIAMPolicyAssignmentResponse,update_iam_policy_assignment_response\nUpdateIPSetRequest,update_ip_set_request\nUpdateIPSetResponse,update_ip_set_response\nUpdateIdentityProviderConfigurationRequest,update_identity_provider_configuration_request\nUpdateIdentityProviderRequest,update_identity_provider_request\nUpdateIdentityProviderResponse,update_identity_provider_response\nUpdateIdentityProviderSettingsRequest,update_identity_provider_settings_request\nUpdateIdentityProviderSettingsResponse,update_identity_provider_settings_response\nUpdateIdentitySourceInput,update_identity_source_input\nUpdateIdentitySourceOutput,update_identity_source_output\nUpdateImageGenerationConfigurationInput,update_image_generation_configuration_input\nUpdateImagePermissionsRequest,update_image_permissions_request\nUpdateImagePipelineRequest,update_image_pipeline_request\nUpdateImagePipelineResponse,update_image_pipeline_response\nUpdateImageRequest,update_image_request\nUpdateImageResponse,update_image_response\nUpdateImageSetMetadataRequest,update_image_set_metadata_request\nUpdateImageSetMetadataResponse,update_image_set_metadata_response\nUpdateImageVersionRequest,update_image_version_request\nUpdateImageVersionResponse,update_image_version_response\nUpdateImpersonationRoleRequest,update_impersonation_role_request\nUpdateInAppTemplateRequest,update_in_app_template_request\nUpdateInAppTemplateResponse,update_in_app_template_response\nUpdateInProgressException,update_in_progress_exception\nUpdateIncidentRecordInput,update_incident_record_input\nUpdateIndexRequest,update_index_request\nUpdateIndexTypeInput,update_index_type_input\nUpdateIndexTypeOutput,update_index_type_output\nUpdateIndexingConfigurationRequest,update_indexing_configuration_request\nUpdateInferenceExperimentRequest,update_inference_experiment_request\nUpdateInferenceExperimentResponse,update_inference_experiment_response\nUpdateInferenceSchedulerRequest,update_inference_scheduler_request\nUpdateInfoEntry,update_info_entry\nUpdateInfrastructureConfigurationRequest,update_infrastructure_configuration_request\nUpdateInfrastructureConfigurationResponse,update_infrastructure_configuration_response\nUpdateIngestionDestinationRequest,update_ingestion_destination_request\nUpdateIngestionDestinationResponse,update_ingestion_destination_response\nUpdateIngressGatewayBridgeRequest,update_ingress_gateway_bridge_request\nUpdateInputDeviceRequest,update_input_device_request\nUpdateInputDeviceResponse,update_input_device_response\nUpdateInputRequest,update_input_request\nUpdateInputResponse,update_input_response\nUpdateInputSecurityGroupRequest,update_input_security_group_request\nUpdateInputSecurityGroupResponse,update_input_security_group_response\nUpdateInsightRequest,update_insight_request\nUpdateInstanceAccessControlAttributeConfigurationRequest,update_instance_access_control_attribute_configuration_request\nUpdateInstanceAttributeRequest,update_instance_attribute_request\nUpdateInstanceCustomHealthStatusRequest,update_instance_custom_health_status_request\nUpdateInstanceMetadataOptionsRequest,update_instance_metadata_options_request\nUpdateInstanceMetadataOptionsResult,update_instance_metadata_options_result\nUpdateInstanceProfileRequest,update_instance_profile_request\nUpdateInstanceProfileResult,update_instance_profile_result\nUpdateInstanceRequest,update_instance_request\nUpdateInstanceStorageConfigRequest,update_instance_storage_config_request\nUpdateInstantBooking,update_instant_booking\nUpdateInstruction,update_instruction\nUpdateIntegrationRequest,update_integration_request\nUpdateIntegrationResponseRequest,update_integration_response_request\nUpdateIntegrationResponseResponse,update_integration_response_response\nUpdateIntegrationResult,update_integration_result\nUpdateIntentRequest,update_intent_request\nUpdateIntentResponse,update_intent_response\nUpdateIpAccessSettingsRequest,update_ip_access_settings_request\nUpdateIpAccessSettingsResponse,update_ip_access_settings_response\nUpdateIpAddress,update_ip_address\nUpdateIpAddresses,update_ip_addresses\nUpdateIpRestrictionRequest,update_ip_restriction_request\nUpdateIpRestrictionResponse,update_ip_restriction_response\nUpdateItemInput,update_item_input\nUpdateItemOutput,update_item_output\nUpdateJobExecutionRequest,update_job_execution_request\nUpdateJobExecutionResponse,update_job_execution_response\nUpdateJobFromSourceControlRequest,update_job_from_source_control_request\nUpdateJobFromSourceControlResponse,update_job_from_source_control_response\nUpdateJobPriorityRequest,update_job_priority_request\nUpdateJobPriorityResult,update_job_priority_result\nUpdateJobQueueRequest,update_job_queue_request\nUpdateJobQueueResponse,update_job_queue_response\nUpdateJobRequest,update_job_request\nUpdateJobResponse,update_job_response\nUpdateJobShipmentStateRequest,update_job_shipment_state_request\nUpdateJobStatusRequest,update_job_status_request\nUpdateJobStatusResult,update_job_status_result\nUpdateJobTemplateRequest,update_job_template_request\nUpdateJobTemplateResponse,update_job_template_response\nUpdateJourneyRequest,update_journey_request\nUpdateJourneyResponse,update_journey_response\nUpdateJourneyStateRequest,update_journey_state_request\nUpdateJourneyStateResponse,update_journey_state_response\nUpdateJsonClassifierRequest,update_json_classifier_request\nUpdateKeyDescriptionRequest,update_key_description_request\nUpdateKeyGroupRequest,update_key_group_request\nUpdateKeyGroupResult,update_key_group_result\nUpdateKeyRequest,update_key_request\nUpdateKeyResponse,update_key_response\nUpdateKnowledgeBaseTemplateUriRequest,update_knowledge_base_template_uri_request\nUpdateKnowledgeBaseTemplateUriResponse,update_knowledge_base_template_uri_response\nUpdateKxClusterDatabasesRequest,update_kx_cluster_databases_request\nUpdateKxDatabaseRequest,update_kx_database_request\nUpdateKxDatabaseResponse,update_kx_database_response\nUpdateKxEnvironmentNetworkRequest,update_kx_environment_network_request\nUpdateKxEnvironmentNetworkResponse,update_kx_environment_network_response\nUpdateKxEnvironmentRequest,update_kx_environment_request\nUpdateKxEnvironmentResponse,update_kx_environment_response\nUpdateKxUserRequest,update_kx_user_request\nUpdateKxUserResponse,update_kx_user_response\nUpdateLFTagRequest,update_lf_tag_request\nUpdateLabelGroupRequest,update_label_group_request\nUpdateLabelsPayload,update_labels_payload\nUpdateLagRequest,update_lag_request\nUpdateLaunchConfigurationRequest,update_launch_configuration_request\nUpdateLaunchConfigurationTemplateRequest,update_launch_configuration_template_request\nUpdateLaunchConfigurationTemplateResponse,update_launch_configuration_template_response\nUpdateLaunchProfileMemberRequest,update_launch_profile_member_request\nUpdateLaunchProfileMemberResponse,update_launch_profile_member_response\nUpdateLaunchProfileRequest,update_launch_profile_request\nUpdateLaunchProfileResponse,update_launch_profile_response\nUpdateLaunchRequest,update_launch_request\nUpdateLaunchResponse,update_launch_response\nUpdateLayerRequest,update_layer_request\nUpdateLayoutRequest,update_layout_request\nUpdateLedgerPermissionsModeRequest,update_ledger_permissions_mode_request\nUpdateLedgerPermissionsModeResponse,update_ledger_permissions_mode_response\nUpdateLedgerRequest,update_ledger_request\nUpdateLedgerResponse,update_ledger_response\nUpdateLensReviewInput,update_lens_review_input\nUpdateLensReviewOutput,update_lens_review_output\nUpdateLicenseConfigurationRequest,update_license_configuration_request\nUpdateLicenseManagerReportGeneratorRequest,update_license_manager_report_generator_request\nUpdateLicenseSpecificationsForResourceRequest,update_license_specifications_for_resource_request\nUpdateLifecyclePolicyRequest,update_lifecycle_policy_request\nUpdateLinkAttributes,update_link_attributes\nUpdateLinkAttributesRequest,update_link_attributes_request\nUpdateLinkInput,update_link_input\nUpdateLinkOutput,update_link_output\nUpdateLinkRequest,update_link_request\nUpdateLinkResponse,update_link_response\nUpdateListRequest,update_list_request\nUpdateListenerRequest,update_listener_request\nUpdateListenerResponse,update_listener_response\nUpdateLiveSourceRequest,update_live_source_request\nUpdateLiveSourceResponse,update_live_source_response\nUpdateLoadBalancerAttributeRequest,update_load_balancer_attribute_request\nUpdateLoadBalancerAttributeResult,update_load_balancer_attribute_result\nUpdateLocationAzureBlobRequest,update_location_azure_blob_request\nUpdateLocationHdfsRequest,update_location_hdfs_request\nUpdateLocationNfsRequest,update_location_nfs_request\nUpdateLocationObjectStorageRequest,update_location_object_storage_request\nUpdateLocationSmbRequest,update_location_smb_request\nUpdateLogLevelsByResourceTypesRequest,update_log_levels_by_resource_types_request\nUpdateLogPatternRequest,update_log_pattern_request\nUpdateLogPatternResponse,update_log_pattern_response\nUpdateLoggerDefinitionRequest,update_logger_definition_request\nUpdateLoggingConfigurationRequest,update_logging_configuration_request\nUpdateLoggingConfigurationResponse,update_logging_configuration_response\nUpdateLoginProfileRequest,update_login_profile_request\nUpdateLongTermPricingRequest,update_long_term_pricing_request\nUpdateMLModelInput,update_ml_model_input\nUpdateMLModelOutput,update_ml_model_output\nUpdateMLTransformRequest,update_ml_transform_request\nUpdateMLTransformResponse,update_ml_transform_response\nUpdateMacieSessionRequest,update_macie_session_request\nUpdateMailboxQuotaRequest,update_mailbox_quota_request\nUpdateMaintenance,update_maintenance\nUpdateMaintenanceStartTimeInput,update_maintenance_start_time_input\nUpdateMaintenanceStartTimeOutput,update_maintenance_start_time_output\nUpdateMaintenanceWindowRequest,update_maintenance_window_request\nUpdateMaintenanceWindowResult,update_maintenance_window_result\nUpdateMaintenanceWindowTargetRequest,update_maintenance_window_target_request\nUpdateMaintenanceWindowTargetResult,update_maintenance_window_target_result\nUpdateMaintenanceWindowTaskRequest,update_maintenance_window_task_request\nUpdateMaintenanceWindowTaskResult,update_maintenance_window_task_result\nUpdateMalwareScanSettingsRequest,update_malware_scan_settings_request\nUpdateManagedInstanceRoleRequest,update_managed_instance_role_request\nUpdateManagedRuleSetVersionExpiryDateRequest,update_managed_rule_set_version_expiry_date_request\nUpdateManagedRuleSetVersionExpiryDateResponse,update_managed_rule_set_version_expiry_date_response\nUpdateMapRequest,update_map_request\nUpdateMapResponse,update_map_response\nUpdateMapRunInput,update_map_run_input\nUpdateMatchingWorkflowInput,update_matching_workflow_input\nUpdateMatchingWorkflowOutput,update_matching_workflow_output\nUpdateMatchmakingConfigurationInput,update_matchmaking_configuration_input\nUpdateMatchmakingConfigurationOutput,update_matchmaking_configuration_output\nUpdateMediaInsightsPipelineConfigurationRequest,update_media_insights_pipeline_configuration_request\nUpdateMediaInsightsPipelineConfigurationResponse,update_media_insights_pipeline_configuration_response\nUpdateMediaInsightsPipelineStatusRequest,update_media_insights_pipeline_status_request\nUpdateMediaPipelineKinesisVideoStreamPoolRequest,update_media_pipeline_kinesis_video_stream_pool_request\nUpdateMediaPipelineKinesisVideoStreamPoolResponse,update_media_pipeline_kinesis_video_stream_pool_response\nUpdateMediaStorageConfigurationInput,update_media_storage_configuration_input\nUpdateMedicalVocabularyRequest,update_medical_vocabulary_request\nUpdateMedicalVocabularyResponse,update_medical_vocabulary_response\nUpdateMeetingRoomConfiguration,update_meeting_room_configuration\nUpdateMemberDetectorsRequest,update_member_detectors_request\nUpdateMemberDetectorsResponse,update_member_detectors_response\nUpdateMemberInput,update_member_input\nUpdateMemberSessionRequest,update_member_session_request\nUpdateMembershipInput,update_membership_input\nUpdateMembershipOutput,update_membership_output\nUpdateMeshInput,update_mesh_input\nUpdateMeshOutput,update_mesh_output\nUpdateMethodRequest,update_method_request\nUpdateMethodResponseRequest,update_method_response_request\nUpdateMetricAttributionRequest,update_metric_attribution_request\nUpdateMetricAttributionResponse,update_metric_attribution_response\nUpdateMetricSetRequest,update_metric_set_request\nUpdateMetricSetResponse,update_metric_set_response\nUpdateMigrationWorkflowRequest,update_migration_workflow_request\nUpdateMigrationWorkflowResponse,update_migration_workflow_response\nUpdateMissionProfileRequest,update_mission_profile_request\nUpdateMitigationActionRequest,update_mitigation_action_request\nUpdateMitigationActionResponse,update_mitigation_action_response\nUpdateMobileDeviceAccessRuleRequest,update_mobile_device_access_rule_request\nUpdateModelCardRequest,update_model_card_request\nUpdateModelCardResponse,update_model_card_response\nUpdateModelManifestRequest,update_model_manifest_request\nUpdateModelManifestResponse,update_model_manifest_response\nUpdateModelPackageInput,update_model_package_input\nUpdateModelPackageOutput,update_model_package_output\nUpdateModelRequest,update_model_request\nUpdateModelResponse,update_model_response\nUpdateModelVersionRequest,update_model_version_request\nUpdateModelVersionResult,update_model_version_result\nUpdateModelVersionStatusRequest,update_model_version_status_request\nUpdateMonitorInput,update_monitor_input\nUpdateMonitorOutput,update_monitor_output\nUpdateMonitoringAlertRequest,update_monitoring_alert_request\nUpdateMonitoringAlertResponse,update_monitoring_alert_response\nUpdateMonitoringRequest,update_monitoring_request\nUpdateMonitoringResponse,update_monitoring_response\nUpdateMonitoringScheduleRequest,update_monitoring_schedule_request\nUpdateMonitoringScheduleResponse,update_monitoring_schedule_response\nUpdateMulticastGroupRequest,update_multicast_group_request\nUpdateMultiplexProgramRequest,update_multiplex_program_request\nUpdateMultiplexProgramResponse,update_multiplex_program_response\nUpdateMultiplexRequest,update_multiplex_request\nUpdateMultiplexResponse,update_multiplex_response\nUpdateMyUserProfileRequest,update_my_user_profile_request\nUpdateNFSFileShareInput,update_nfs_file_share_input\nUpdateNFSFileShareOutput,update_nfs_file_share_output\nUpdateNamedQueryInput,update_named_query_input\nUpdateNamespaceRequest,update_namespace_request\nUpdateNamespaceResponse,update_namespace_response\nUpdateNetworkAnalyzerConfigurationRequest,update_network_analyzer_configuration_request\nUpdateNetworkConfigurationInput,update_network_configuration_input\nUpdateNetworkProfileRequest,update_network_profile_request\nUpdateNetworkProfileResult,update_network_profile_result\nUpdateNetworkResourceMetadataRequest,update_network_resource_metadata_request\nUpdateNetworkResourceMetadataResponse,update_network_resource_metadata_response\nUpdateNetworkSettingsRequest,update_network_settings_request\nUpdateNetworkSettingsResponse,update_network_settings_response\nUpdateNetworkSitePlanRequest,update_network_site_plan_request\nUpdateNetworkSiteRequest,update_network_site_request\nUpdateNetworkSiteResponse,update_network_site_response\nUpdateNodeInput,update_node_input\nUpdateNodegroupConfigRequest,update_nodegroup_config_request\nUpdateNodegroupConfigResponse,update_nodegroup_config_response\nUpdateNodegroupVersionRequest,update_nodegroup_version_request\nUpdateNodegroupVersionResponse,update_nodegroup_version_response\nUpdateNotebookInput,update_notebook_input\nUpdateNotebookInstanceInput,update_notebook_instance_input\nUpdateNotebookInstanceLifecycleConfigInput,update_notebook_instance_lifecycle_config_input\nUpdateNotebookMetadataInput,update_notebook_metadata_input\nUpdateNotificationConfigurationInput,update_notification_configuration_input\nUpdateNotificationRequest,update_notification_request\nUpdateNotificationRuleRequest,update_notification_rule_request\nUpdateNotificationSettingsRequest,update_notification_settings_request\nUpdateNumberOfDomainControllersRequest,update_number_of_domain_controllers_request\nUpdateObjectAttributes,update_object_attributes\nUpdateObjectAttributesRequest,update_object_attributes_request\nUpdateObjectAttributesResponse,update_object_attributes_response\nUpdateOntapVolumeConfiguration,update_ontap_volume_configuration\nUpdateOpenIDConnectProviderThumbprintRequest,update_open_id_connect_provider_thumbprint_request\nUpdateOpenZFSVolumeConfiguration,update_open_zfs_volume_configuration\nUpdateOpsItemRequest,update_ops_item_request\nUpdateOpsMetadataRequest,update_ops_metadata_request\nUpdateOpsMetadataResult,update_ops_metadata_result\nUpdateOrgEc2DeepInspectionConfigurationRequest,update_org_ec2_deep_inspection_configuration_request\nUpdateOrganizationConfigurationRequest,update_organization_configuration_request\nUpdateOrganizationConfigurationResponse,update_organization_configuration_response\nUpdateOrganizationalUnitRequest,update_organizational_unit_request\nUpdateOrganizationalUnitResponse,update_organizational_unit_response\nUpdateOriginAccessControlRequest,update_origin_access_control_request\nUpdateOriginAccessControlResult,update_origin_access_control_result\nUpdateOriginEndpointRequest,update_origin_endpoint_request\nUpdateOriginEndpointResponse,update_origin_endpoint_response\nUpdateOriginRequestPolicyRequest,update_origin_request_policy_request\nUpdateOriginRequestPolicyResult,update_origin_request_policy_result\nUpdateOutpostInput,update_outpost_input\nUpdateOutpostOutput,update_outpost_output\nUpdateOutpostResolverRequest,update_outpost_resolver_request\nUpdateOutpostResolverResponse,update_outpost_resolver_response\nUpdatePackageConfigurationRequest,update_package_configuration_request\nUpdatePackageRequest,update_package_request\nUpdatePackageResponse,update_package_response\nUpdatePackageVersionRequest,update_package_version_request\nUpdatePackageVersionsStatusRequest,update_package_versions_status_request\nUpdatePackageVersionsStatusResult,update_package_versions_status_result\nUpdatePackagingGroupRequest,update_packaging_group_request\nUpdatePackagingGroupResponse,update_packaging_group_response\nUpdateParallelDataRequest,update_parallel_data_request\nUpdateParallelDataResponse,update_parallel_data_response\nUpdateParam,update_param\nUpdateParameterGroupRequest,update_parameter_group_request\nUpdateParameterGroupResponse,update_parameter_group_response\nUpdateParticipantRoleConfigRequest,update_participant_role_config_request\nUpdatePartitionRequest,update_partition_request\nUpdatePartnerAccountRequest,update_partner_account_request\nUpdatePartnerStatusInputMessage,update_partner_status_input_message\nUpdatePatchBaselineRequest,update_patch_baseline_request\nUpdatePatchBaselineResult,update_patch_baseline_result\nUpdatePermissionGroupRequest,update_permission_group_request\nUpdatePermissionGroupResponse,update_permission_group_response\nUpdatePermissionSetRequest,update_permission_set_request\nUpdatePermissionsRequest,update_permissions_request\nUpdatePermissionsResponse,update_permissions_response\nUpdatePhoneNumberRequest,update_phone_number_request\nUpdatePhoneNumberRequestItem,update_phone_number_request_item\nUpdatePhoneNumberRequestItems,update_phone_number_request_items\nUpdatePhoneNumberResponse,update_phone_number_response\nUpdatePhoneNumberResult,update_phone_number_result\nUpdatePhoneNumberSettingsRequest,update_phone_number_settings_request\nUpdatePipeRequest,update_pipe_request\nUpdatePipeResponse,update_pipe_response\nUpdatePipeSourceActiveMQBrokerParameters,update_pipe_source_active_mq_broker_parameters\nUpdatePipeSourceDynamoDBStreamParameters,update_pipe_source_dynamo_db_stream_parameters\nUpdatePipeSourceKinesisStreamParameters,update_pipe_source_kinesis_stream_parameters\nUpdatePipeSourceManagedStreamingKafkaParameters,update_pipe_source_managed_streaming_kafka_parameters\nUpdatePipeSourceParameters,update_pipe_source_parameters\nUpdatePipeSourceRabbitMQBrokerParameters,update_pipe_source_rabbit_mq_broker_parameters\nUpdatePipeSourceSelfManagedKafkaParameters,update_pipe_source_self_managed_kafka_parameters\nUpdatePipeSourceSqsQueueParameters,update_pipe_source_sqs_queue_parameters\nUpdatePipelineExecutionRequest,update_pipeline_execution_request\nUpdatePipelineExecutionResponse,update_pipeline_execution_response\nUpdatePipelineInput,update_pipeline_input\nUpdatePipelineNotificationsRequest,update_pipeline_notifications_request\nUpdatePipelineNotificationsResponse,update_pipeline_notifications_response\nUpdatePipelineOutput,update_pipeline_output\nUpdatePipelineRequest,update_pipeline_request\nUpdatePipelineResponse,update_pipeline_response\nUpdatePipelineStatusRequest,update_pipeline_status_request\nUpdatePipelineStatusResponse,update_pipeline_status_response\nUpdatePlaceIndexRequest,update_place_index_request\nUpdatePlaceIndexResponse,update_place_index_response\nUpdatePlacementRequest,update_placement_request\nUpdatePolicy,update_policy\nUpdatePolicyInput,update_policy_input\nUpdatePolicyOutput,update_policy_output\nUpdatePolicyRequest,update_policy_request\nUpdatePolicyResponse,update_policy_response\nUpdatePolicyStoreInput,update_policy_store_input\nUpdatePolicyStoreOutput,update_policy_store_output\nUpdatePolicyTemplateInput,update_policy_template_input\nUpdatePolicyTemplateOutput,update_policy_template_output\nUpdatePoolRequest,update_pool_request\nUpdatePoolResult,update_pool_result\nUpdatePortalRequest,update_portal_request\nUpdatePortalResponse,update_portal_response\nUpdatePortfolioInput,update_portfolio_input\nUpdatePortfolioOutput,update_portfolio_output\nUpdatePortfolioShareInput,update_portfolio_share_input\nUpdatePortfolioShareOutput,update_portfolio_share_output\nUpdatePositionRequest,update_position_request\nUpdatePreparedStatementInput,update_prepared_statement_input\nUpdatePresetRequest,update_preset_request\nUpdatePresetResponse,update_preset_response\nUpdatePricingPlanInput,update_pricing_plan_input\nUpdatePricingPlanOutput,update_pricing_plan_output\nUpdatePricingPlanRequest,update_pricing_plan_request\nUpdatePricingPlanResponse,update_pricing_plan_response\nUpdatePricingRuleInput,update_pricing_rule_input\nUpdatePricingRuleOutput,update_pricing_rule_output\nUpdatePrimaryEmailAddressRequest,update_primary_email_address_request\nUpdatePrimaryRegionRequest,update_primary_region_request\nUpdatePrivateDnsNamespaceRequest,update_private_dns_namespace_request\nUpdatePrivateDnsNamespaceResponse,update_private_dns_namespace_response\nUpdateProactiveJoin,update_proactive_join\nUpdateProblemRequest,update_problem_request\nUpdateProductInput,update_product_input\nUpdateProductOutput,update_product_output\nUpdateProfileInput,update_profile_input\nUpdateProfileJobRequest,update_profile_job_request\nUpdateProfileJobResponse,update_profile_job_response\nUpdateProfileOutput,update_profile_output\nUpdateProfileRequest,update_profile_request\nUpdateProfileResponse,update_profile_response\nUpdateProfilingGroupRequest,update_profiling_group_request\nUpdateProfilingGroupResponse,update_profiling_group_response\nUpdateProgramRequest,update_program_request\nUpdateProgramResponse,update_program_response\nUpdateProgramScheduleConfiguration,update_program_schedule_configuration\nUpdateProgramTransition,update_program_transition\nUpdateProjectDataDeliveryRequest,update_project_data_delivery_request\nUpdateProjectDataDeliveryResponse,update_project_data_delivery_response\nUpdateProjectInput,update_project_input\nUpdateProjectOutput,update_project_output\nUpdateProjectRequest,update_project_request\nUpdateProjectResponse,update_project_response\nUpdateProjectResult,update_project_result\nUpdateProjectVisibilityInput,update_project_visibility_input\nUpdateProjectVisibilityOutput,update_project_visibility_output\nUpdatePromptRequest,update_prompt_request\nUpdatePromptResponse,update_prompt_response\nUpdateProtectedQueryInput,update_protected_query_input\nUpdateProtectedQueryOutput,update_protected_query_output\nUpdateProtectionGroupRequest,update_protection_group_request\nUpdateProvisionedModelThroughputRequest,update_provisioned_model_throughput_request\nUpdateProvisionedProductInput,update_provisioned_product_input\nUpdateProvisionedProductOutput,update_provisioned_product_output\nUpdateProvisionedProductPropertiesInput,update_provisioned_product_properties_input\nUpdateProvisionedProductPropertiesOutput,update_provisioned_product_properties_output\nUpdateProvisioningArtifactInput,update_provisioning_artifact_input\nUpdateProvisioningArtifactOutput,update_provisioning_artifact_output\nUpdateProvisioningParameter,update_provisioning_parameter\nUpdateProvisioningPreferences,update_provisioning_preferences\nUpdateProvisioningTemplateRequest,update_provisioning_template_request\nUpdateProxySessionRequest,update_proxy_session_request\nUpdateProxySessionResponse,update_proxy_session_response\nUpdatePublicDnsNamespaceRequest,update_public_dns_namespace_request\nUpdatePublicDnsNamespaceResponse,update_public_dns_namespace_response\nUpdatePublicKeyRequest,update_public_key_request\nUpdatePublicKeyResult,update_public_key_result\nUpdatePublicSharingSettingsRequest,update_public_sharing_settings_request\nUpdatePublicSharingSettingsResponse,update_public_sharing_settings_response\nUpdatePublishingDestinationRequest,update_publishing_destination_request\nUpdatePullRequestApprovalRuleContentInput,update_pull_request_approval_rule_content_input\nUpdatePullRequestApprovalRuleContentOutput,update_pull_request_approval_rule_content_output\nUpdatePullRequestApprovalStateInput,update_pull_request_approval_state_input\nUpdatePullRequestDescriptionInput,update_pull_request_description_input\nUpdatePullRequestDescriptionOutput,update_pull_request_description_output\nUpdatePullRequestStatusInput,update_pull_request_status_input\nUpdatePullRequestStatusOutput,update_pull_request_status_output\nUpdatePullRequestTitleInput,update_pull_request_title_input\nUpdatePullRequestTitleOutput,update_pull_request_title_output\nUpdatePushTemplateRequest,update_push_template_request\nUpdatePushTemplateResponse,update_push_template_response\nUpdateQualificationTypeRequest,update_qualification_type_request\nUpdateQualificationTypeResponse,update_qualification_type_response\nUpdateQuerySuggestionsBlockListRequest,update_query_suggestions_block_list_request\nUpdateQuerySuggestionsConfigRequest,update_query_suggestions_config_request\nUpdateQueueHoursOfOperationRequest,update_queue_hours_of_operation_request\nUpdateQueueMaxContactsRequest,update_queue_max_contacts_request\nUpdateQueueNameRequest,update_queue_name_request\nUpdateQueueOutboundCallerConfigRequest,update_queue_outbound_caller_config_request\nUpdateQueueRequest,update_queue_request\nUpdateQueueResponse,update_queue_response\nUpdateQueueStatusRequest,update_queue_status_request\nUpdateQuickConnectConfigRequest,update_quick_connect_config_request\nUpdateQuickConnectNameRequest,update_quick_connect_name_request\nUpdateRadiusRequest,update_radius_request\nUpdateRateBasedRuleRequest,update_rate_based_rule_request\nUpdateRateBasedRuleResponse,update_rate_based_rule_response\nUpdateRdsDbInstanceRequest,update_rds_db_instance_request\nUpdateReadinessCheckRequest,update_readiness_check_request\nUpdateReadinessCheckResponse,update_readiness_check_response\nUpdateRealtimeLogConfigRequest,update_realtime_log_config_request\nUpdateRealtimeLogConfigResult,update_realtime_log_config_result\nUpdateReceiptRuleRequest,update_receipt_rule_request\nUpdateRecipeJobRequest,update_recipe_job_request\nUpdateRecipeJobResponse,update_recipe_job_response\nUpdateRecipeRequest,update_recipe_request\nUpdateRecipeResponse,update_recipe_response\nUpdateRecommendationStatusItem,update_recommendation_status_item\nUpdateRecommendationStatusRequestEntry,update_recommendation_status_request_entry\nUpdateRecommenderConfiguration,update_recommender_configuration\nUpdateRecommenderConfigurationRequest,update_recommender_configuration_request\nUpdateRecommenderConfigurationResponse,update_recommender_configuration_response\nUpdateRecommenderConfigurationShape,update_recommender_configuration_shape\nUpdateRecommenderRequest,update_recommender_request\nUpdateRecommenderResponse,update_recommender_response\nUpdateRecordsRequest,update_records_request\nUpdateRecordsResponse,update_records_response\nUpdateRecoveryGroupRequest,update_recovery_group_request\nUpdateRecoveryGroupResponse,update_recovery_group_response\nUpdateRecoveryPointLifecycleInput,update_recovery_point_lifecycle_input\nUpdateRecoveryPointLifecycleOutput,update_recovery_point_lifecycle_output\nUpdateRefreshScheduleRequest,update_refresh_schedule_request\nUpdateRefreshScheduleResponse,update_refresh_schedule_response\nUpdateRegexMatchSetRequest,update_regex_match_set_request\nUpdateRegexMatchSetResponse,update_regex_match_set_response\nUpdateRegexPatternSetRequest,update_regex_pattern_set_request\nUpdateRegexPatternSetResponse,update_regex_pattern_set_response\nUpdateRegionSettingsInput,update_region_settings_input\nUpdateRegistryInput,update_registry_input\nUpdateRegistryRequest,update_registry_request\nUpdateRegistryResponse,update_registry_response\nUpdateRelatedItemsInput,update_related_items_input\nUpdateRelationalDatabaseParametersRequest,update_relational_database_parameters_request\nUpdateRelationalDatabaseParametersResult,update_relational_database_parameters_result\nUpdateRelationalDatabaseRequest,update_relational_database_request\nUpdateRelationalDatabaseResult,update_relational_database_result\nUpdateReplicationConfigurationRequest,update_replication_configuration_request\nUpdateReplicationConfigurationTemplateRequest,update_replication_configuration_template_request\nUpdateReplicationGroupMemberAction,update_replication_group_member_action\nUpdateReplicationJobRequest,update_replication_job_request\nUpdateReplicationSetInput,update_replication_set_input\nUpdateReportDefinitionRequest,update_report_definition_request\nUpdateReportDefinitionResult,update_report_definition_result\nUpdateReportGroupInput,update_report_group_input\nUpdateReportGroupOutput,update_report_group_output\nUpdateReportPlanInput,update_report_plan_input\nUpdateReportPlanOutput,update_report_plan_output\nUpdateRepositoryDescriptionInput,update_repository_description_input\nUpdateRepositoryNameInput,update_repository_name_input\nUpdateRepositoryRequest,update_repository_request\nUpdateRepositoryResult,update_repository_result\nUpdateRequestValidatorRequest,update_request_validator_request\nUpdateRequireCheckIn,update_require_check_in\nUpdateRescoreExecutionPlanRequest,update_rescore_execution_plan_request\nUpdateReservationRequest,update_reservation_request\nUpdateReservationResponse,update_reservation_response\nUpdateResiliencyPolicyRequest,update_resiliency_policy_request\nUpdateResiliencyPolicyResponse,update_resiliency_policy_response\nUpdateResolverConfigRequest,update_resolver_config_request\nUpdateResolverConfigResponse,update_resolver_config_response\nUpdateResolverDnssecConfigRequest,update_resolver_dnssec_config_request\nUpdateResolverDnssecConfigResponse,update_resolver_dnssec_config_response\nUpdateResolverEndpointRequest,update_resolver_endpoint_request\nUpdateResolverEndpointResponse,update_resolver_endpoint_response\nUpdateResolverRequest,update_resolver_request\nUpdateResolverResponse,update_resolver_response\nUpdateResolverRuleRequest,update_resolver_rule_request\nUpdateResolverRuleResponse,update_resolver_rule_response\nUpdateResourceCollectionFilter,update_resource_collection_filter\nUpdateResourceCollectionRequest,update_resource_collection_request\nUpdateResourceDataSyncRequest,update_resource_data_sync_request\nUpdateResourceDefinitionRequest,update_resource_definition_request\nUpdateResourceEventConfigurationRequest,update_resource_event_configuration_request\nUpdateResourceInput,update_resource_input\nUpdateResourceOutput,update_resource_output\nUpdateResourcePolicyRequest,update_resource_policy_request\nUpdateResourcePolicyResponse,update_resource_policy_response\nUpdateResourcePositionRequest,update_resource_position_request\nUpdateResourceProfileDetectionsRequest,update_resource_profile_detections_request\nUpdateResourceProfileRequest,update_resource_profile_request\nUpdateResourceRequest,update_resource_request\nUpdateResourceServerRequest,update_resource_server_request\nUpdateResourceServerResponse,update_resource_server_response\nUpdateResourceSetRequest,update_resource_set_request\nUpdateResourceSetResponse,update_resource_set_response\nUpdateResourceShareRequest,update_resource_share_request\nUpdateResourceShareResponse,update_resource_share_response\nUpdateResponseHeadersPolicyRequest,update_response_headers_policy_request\nUpdateResponseHeadersPolicyResult,update_response_headers_policy_result\nUpdateResponsePlanInput,update_response_plan_input\nUpdateRestApiRequest,update_rest_api_request\nUpdateResult,update_result\nUpdateRetrainingSchedulerRequest,update_retraining_scheduler_request\nUpdateRevealConfigurationRequest,update_reveal_configuration_request\nUpdateRevealConfigurationResponse,update_reveal_configuration_response\nUpdateRevisionRequest,update_revision_request\nUpdateRevisionResponse,update_revision_response\nUpdateRobotApplicationRequest,update_robot_application_request\nUpdateRobotApplicationResponse,update_robot_application_response\nUpdateRoleAliasRequest,update_role_alias_request\nUpdateRoleAliasResponse,update_role_alias_response\nUpdateRoleDescriptionRequest,update_role_description_request\nUpdateRoleDescriptionResponse,update_role_description_response\nUpdateRoleRequest,update_role_request\nUpdateRoomMembershipRequest,update_room_membership_request\nUpdateRoomMembershipResponse,update_room_membership_response\nUpdateRoomRequest,update_room_request\nUpdateRoomResponse,update_room_response\nUpdateRotationRequest,update_rotation_request\nUpdateRouteCalculatorRequest,update_route_calculator_request\nUpdateRouteCalculatorResponse,update_route_calculator_response\nUpdateRouteInput,update_route_input\nUpdateRouteOutput,update_route_output\nUpdateRouteRequest,update_route_request\nUpdateRouteResponse,update_route_response\nUpdateRouteResponseRequest,update_route_response_request\nUpdateRouteResponseResponse,update_route_response_response\nUpdateRouteResult,update_route_result\nUpdateRoutingControlRequest,update_routing_control_request\nUpdateRoutingControlResponse,update_routing_control_response\nUpdateRoutingControlStateEntries,update_routing_control_state_entries\nUpdateRoutingControlStateEntry,update_routing_control_state_entry\nUpdateRoutingControlStateRequest,update_routing_control_state_request\nUpdateRoutingControlStatesRequest,update_routing_control_states_request\nUpdateRoutingProfileAgentAvailabilityTimerRequest,update_routing_profile_agent_availability_timer_request\nUpdateRoutingProfileConcurrencyRequest,update_routing_profile_concurrency_request\nUpdateRoutingProfileDefaultOutboundQueueRequest,update_routing_profile_default_outbound_queue_request\nUpdateRoutingProfileNameRequest,update_routing_profile_name_request\nUpdateRoutingProfileQueuesRequest,update_routing_profile_queues_request\nUpdateRowData,update_row_data\nUpdateRuleGroupRequest,update_rule_group_request\nUpdateRuleGroupResponse,update_rule_group_response\nUpdateRuleMetadataRequest,update_rule_metadata_request\nUpdateRuleRequest,update_rule_request\nUpdateRuleResponse,update_rule_response\nUpdateRuleVersionRequest,update_rule_version_request\nUpdateRuleVersionResult,update_rule_version_result\nUpdateRulesOfIpGroupRequest,update_rules_of_ip_group_request\nUpdateRulesetRequest,update_ruleset_request\nUpdateRulesetResponse,update_ruleset_response\nUpdateRumMetricDefinitionRequest,update_rum_metric_definition_request\nUpdateRunGroupRequest,update_run_group_request\nUpdateRuntimeConfigurationInput,update_runtime_configuration_input\nUpdateRuntimeConfigurationOutput,update_runtime_configuration_output\nUpdateRuntimeOn,update_runtime_on\nUpdateS3ResourcesRequest,update_s3_resources_request\nUpdateS3ResourcesResult,update_s3_resources_result\nUpdateSAMLProviderRequest,update_saml_provider_request\nUpdateSAMLProviderResponse,update_saml_provider_response\nUpdateSMBFileShareInput,update_smb_file_share_input\nUpdateSMBFileShareOutput,update_smb_file_share_output\nUpdateSMBFileShareVisibilityInput,update_smb_file_share_visibility_input\nUpdateSMBFileShareVisibilityOutput,update_smb_file_share_visibility_output\nUpdateSMBLocalGroupsInput,update_smb_local_groups_input\nUpdateSMBLocalGroupsOutput,update_smb_local_groups_output\nUpdateSMBSecurityStrategyInput,update_smb_security_strategy_input\nUpdateSMBSecurityStrategyOutput,update_smb_security_strategy_output\nUpdateSSHPublicKeyRequest,update_ssh_public_key_request\nUpdateSafetyRuleRequest,update_safety_rule_request\nUpdateSafetyRuleResponse,update_safety_rule_response\nUpdateSamplingRuleRequest,update_sampling_rule_request\nUpdateSamplingRuleResult,update_sampling_rule_result\nUpdateScalingParametersRequest,update_scaling_parameters_request\nUpdateScalingParametersResponse,update_scaling_parameters_response\nUpdateScalingPlanRequest,update_scaling_plan_request\nUpdateSceneRequest,update_scene_request\nUpdateSceneResponse,update_scene_response\nUpdateScheduleInput,update_schedule_input\nUpdateScheduleOutput,update_schedule_output\nUpdateScheduleRequest,update_schedule_request\nUpdateScheduleResponse,update_schedule_response\nUpdateScheduledActionRequest,update_scheduled_action_request\nUpdateScheduledActionResponse,update_scheduled_action_response\nUpdateScheduledAuditRequest,update_scheduled_audit_request\nUpdateScheduledAuditResponse,update_scheduled_audit_response\nUpdateScheduledQueryRequest,update_scheduled_query_request\nUpdateSchedulingPolicyRequest,update_scheduling_policy_request\nUpdateSchemaInput,update_schema_input\nUpdateSchemaRequest,update_schema_request\nUpdateSchemaResponse,update_schema_response\nUpdateScriptInput,update_script_input\nUpdateScriptOutput,update_script_output\nUpdateSecretRequest,update_secret_request\nUpdateSecretResponse,update_secret_response\nUpdateSecretVersionStageRequest,update_secret_version_stage_request\nUpdateSecretVersionStageResponse,update_secret_version_stage_response\nUpdateSecurityConfigRequest,update_security_config_request\nUpdateSecurityConfigResponse,update_security_config_response\nUpdateSecurityGroupForDirectoryControllers,update_security_group_for_directory_controllers\nUpdateSecurityGroupRuleDescriptionsEgressRequest,update_security_group_rule_descriptions_egress_request\nUpdateSecurityGroupRuleDescriptionsEgressResult,update_security_group_rule_descriptions_egress_result\nUpdateSecurityGroupRuleDescriptionsIngressRequest,update_security_group_rule_descriptions_ingress_request\nUpdateSecurityGroupRuleDescriptionsIngressResult,update_security_group_rule_descriptions_ingress_result\nUpdateSecurityHubConfigurationRequest,update_security_hub_configuration_request\nUpdateSecurityPolicyRequest,update_security_policy_request\nUpdateSecurityPolicyResponse,update_security_policy_response\nUpdateSecurityProfileRequest,update_security_profile_request\nUpdateSecurityProfileResponse,update_security_profile_response\nUpdateSecurityRequest,update_security_request\nUpdateSecurityResponse,update_security_response\nUpdateSegmentRequest,update_segment_request\nUpdateSegmentResponse,update_segment_response\nUpdateSensitivityInspectionTemplateRequest,update_sensitivity_inspection_template_request\nUpdateServerCertificateRequest,update_server_certificate_request\nUpdateServerConfigRequest,update_server_config_request\nUpdateServerEngineAttributesRequest,update_server_engine_attributes_request\nUpdateServerEngineAttributesResponse,update_server_engine_attributes_response\nUpdateServerRequest,update_server_request\nUpdateServerResponse,update_server_response\nUpdateServiceAccessPoliciesRequest,update_service_access_policies_request\nUpdateServiceAccessPoliciesResponse,update_service_access_policies_response\nUpdateServiceActionInput,update_service_action_input\nUpdateServiceActionOutput,update_service_action_output\nUpdateServiceInput,update_service_input\nUpdateServiceInstanceInput,update_service_instance_input\nUpdateServiceInstanceOutput,update_service_instance_output\nUpdateServiceIntegrationConfig,update_service_integration_config\nUpdateServiceIntegrationRequest,update_service_integration_request\nUpdateServiceNetworkRequest,update_service_network_request\nUpdateServiceNetworkResponse,update_service_network_response\nUpdateServiceNetworkVpcAssociationRequest,update_service_network_vpc_association_request\nUpdateServiceNetworkVpcAssociationResponse,update_service_network_vpc_association_response\nUpdateServiceOutput,update_service_output\nUpdateServicePipelineInput,update_service_pipeline_input\nUpdateServicePipelineOutput,update_service_pipeline_output\nUpdateServicePrimaryTaskSetRequest,update_service_primary_task_set_request\nUpdateServicePrimaryTaskSetResponse,update_service_primary_task_set_response\nUpdateServiceRequest,update_service_request\nUpdateServiceResponse,update_service_response\nUpdateServiceSettingRequest,update_service_setting_request\nUpdateServiceSettingsRequest,update_service_settings_request\nUpdateServiceSettingsResponse,update_service_settings_response\nUpdateServiceSpecificCredentialRequest,update_service_specific_credential_request\nUpdateServiceSyncBlockerInput,update_service_sync_blocker_input\nUpdateServiceSyncBlockerOutput,update_service_sync_blocker_output\nUpdateServiceSyncConfigInput,update_service_sync_config_input\nUpdateServiceSyncConfigOutput,update_service_sync_config_output\nUpdateServiceTemplateInput,update_service_template_input\nUpdateServiceTemplateOutput,update_service_template_output\nUpdateServiceTemplateVersionInput,update_service_template_version_input\nUpdateServiceTemplateVersionOutput,update_service_template_version_output\nUpdateSettings,update_settings\nUpdateSettingsRequest,update_settings_request\nUpdateSettingsResponse,update_settings_response\nUpdateSettingsResult,update_settings_result\nUpdateShardCountInput,update_shard_count_input\nUpdateShardCountOutput,update_shard_count_output\nUpdateShareInvitationInput,update_share_invitation_input\nUpdateShareInvitationOutput,update_share_invitation_output\nUpdateSignalCatalogRequest,update_signal_catalog_request\nUpdateSignalCatalogResponse,update_signal_catalog_response\nUpdateSignalingChannelInput,update_signaling_channel_input\nUpdateSignature,update_signature\nUpdateSigningCertificateRequest,update_signing_certificate_request\nUpdateSimulationApplicationRequest,update_simulation_application_request\nUpdateSimulationApplicationResponse,update_simulation_application_response\nUpdateSipMediaApplicationCallRequest,update_sip_media_application_call_request\nUpdateSipMediaApplicationCallResponse,update_sip_media_application_call_response\nUpdateSipMediaApplicationRequest,update_sip_media_application_request\nUpdateSipMediaApplicationResponse,update_sip_media_application_response\nUpdateSipRuleRequest,update_sip_rule_request\nUpdateSipRuleResponse,update_sip_rule_response\nUpdateSiteAddressInput,update_site_address_input\nUpdateSiteAddressOutput,update_site_address_output\nUpdateSiteInput,update_site_input\nUpdateSiteOutput,update_site_output\nUpdateSiteRackPhysicalPropertiesInput,update_site_rack_physical_properties_input\nUpdateSiteRackPhysicalPropertiesOutput,update_site_rack_physical_properties_output\nUpdateSiteRequest,update_site_request\nUpdateSiteResponse,update_site_response\nUpdateSizeConstraintSetRequest,update_size_constraint_set_request\nUpdateSizeConstraintSetResponse,update_size_constraint_set_response\nUpdateSkillGroupRequest,update_skill_group_request\nUpdateSlackChannelConfigurationRequest,update_slack_channel_configuration_request\nUpdateSlackChannelConfigurationResult,update_slack_channel_configuration_result\nUpdateSlotRequest,update_slot_request\nUpdateSlotResponse,update_slot_response\nUpdateSlotTypeRequest,update_slot_type_request\nUpdateSlotTypeResponse,update_slot_type_response\nUpdateSmsChannelRequest,update_sms_channel_request\nUpdateSmsChannelResponse,update_sms_channel_response\nUpdateSmsTemplateRequest,update_sms_template_request\nUpdateSmsTemplateResponse,update_sms_template_response\nUpdateSnaplockConfiguration,update_snaplock_configuration\nUpdateSnapshotRequest,update_snapshot_request\nUpdateSnapshotResponse,update_snapshot_response\nUpdateSnapshotResult,update_snapshot_result\nUpdateSnapshotScheduleInput,update_snapshot_schedule_input\nUpdateSnapshotScheduleOutput,update_snapshot_schedule_output\nUpdateSolFunctionPackageInput,update_sol_function_package_input\nUpdateSolFunctionPackageOutput,update_sol_function_package_output\nUpdateSolNetworkInstanceInput,update_sol_network_instance_input\nUpdateSolNetworkInstanceOutput,update_sol_network_instance_output\nUpdateSolNetworkModify,update_sol_network_modify\nUpdateSolNetworkPackageInput,update_sol_network_package_input\nUpdateSolNetworkPackageOutput,update_sol_network_package_output\nUpdateSource,update_source\nUpdateSourceApiAssociationRequest,update_source_api_association_request\nUpdateSourceApiAssociationResponse,update_source_api_association_response\nUpdateSourceControlFromJobRequest,update_source_control_from_job_request\nUpdateSourceControlFromJobResponse,update_source_control_from_job_response\nUpdateSourceLocationRequest,update_source_location_request\nUpdateSourceLocationResponse,update_source_location_response\nUpdateSourceServerReplicationTypeRequest,update_source_server_replication_type_request\nUpdateSpaceRequest,update_space_request\nUpdateSpaceResponse,update_space_response\nUpdateSqlInjectionMatchSetRequest,update_sql_injection_match_set_request\nUpdateSqlInjectionMatchSetResponse,update_sql_injection_match_set_response\nUpdateStackInput,update_stack_input\nUpdateStackInstancesInput,update_stack_instances_input\nUpdateStackInstancesOutput,update_stack_instances_output\nUpdateStackOutput,update_stack_output\nUpdateStackRequest,update_stack_request\nUpdateStackResult,update_stack_result\nUpdateStackSetInput,update_stack_set_input\nUpdateStackSetOutput,update_stack_set_output\nUpdateStageRequest,update_stage_request\nUpdateStageResponse,update_stage_response\nUpdateStageResult,update_stage_result\nUpdateStandardsControlRequest,update_standards_control_request\nUpdateStateMachineAliasInput,update_state_machine_alias_input\nUpdateStateMachineAliasOutput,update_state_machine_alias_output\nUpdateStateMachineInput,update_state_machine_input\nUpdateStateMachineOutput,update_state_machine_output\nUpdateStaticPolicyDefinition,update_static_policy_definition\nUpdateStatus,update_status\nUpdateStorageRequest,update_storage_request\nUpdateStorageResponse,update_storage_response\nUpdateStorageSystemRequest,update_storage_system_request\nUpdateStorageVirtualMachineRequest,update_storage_virtual_machine_request\nUpdateStorageVirtualMachineResponse,update_storage_virtual_machine_response\nUpdateStreamInput,update_stream_input\nUpdateStreamModeInput,update_stream_mode_input\nUpdateStreamProcessorRequest,update_stream_processor_request\nUpdateStreamRequest,update_stream_request\nUpdateStreamResponse,update_stream_response\nUpdateStreamingDistributionRequest,update_streaming_distribution_request\nUpdateStreamingDistributionResult,update_streaming_distribution_result\nUpdateStreamingImageRequest,update_streaming_image_request\nUpdateStreamingImageResponse,update_streaming_image_response\nUpdateStudioComponentRequest,update_studio_component_request\nUpdateStudioComponentResponse,update_studio_component_response\nUpdateStudioInput,update_studio_input\nUpdateStudioRequest,update_studio_request\nUpdateStudioResponse,update_studio_response\nUpdateStudioSessionMappingInput,update_studio_session_mapping_input\nUpdateSubnetChangeProtectionRequest,update_subnet_change_protection_request\nUpdateSubnetChangeProtectionResponse,update_subnet_change_protection_response\nUpdateSubnetGroupRequest,update_subnet_group_request\nUpdateSubnetGroupResponse,update_subnet_group_response\nUpdateSubscriberNotificationRequest,update_subscriber_notification_request\nUpdateSubscriberNotificationResponse,update_subscriber_notification_response\nUpdateSubscriberRequest,update_subscriber_request\nUpdateSubscriberResponse,update_subscriber_response\nUpdateSubscriptionDefinitionRequest,update_subscription_definition_request\nUpdateSubscriptionRequest,update_subscription_request\nUpdateSubscriptionsToEventBridgeMessage,update_subscriptions_to_event_bridge_message\nUpdateSubscriptionsToEventBridgeResponse,update_subscriptions_to_event_bridge_response\nUpdateSuiteDefinitionRequest,update_suite_definition_request\nUpdateSuiteDefinitionResponse,update_suite_definition_response\nUpdateSvmActiveDirectoryConfiguration,update_svm_active_directory_configuration\nUpdateSystemTemplateRequest,update_system_template_request\nUpdateSystemTemplateResponse,update_system_template_response\nUpdateTLSInspectionConfigurationRequest,update_tls_inspection_configuration_request\nUpdateTLSInspectionConfigurationResponse,update_tls_inspection_configuration_response\nUpdateTableInput,update_table_input\nUpdateTableObjectsRequest,update_table_objects_request\nUpdateTableOutput,update_table_output\nUpdateTableReplicaAutoScalingInput,update_table_replica_auto_scaling_input\nUpdateTableReplicaAutoScalingOutput,update_table_replica_auto_scaling_output\nUpdateTableRequest,update_table_request\nUpdateTableResponse,update_table_response\nUpdateTableStorageOptimizerRequest,update_table_storage_optimizer_request\nUpdateTableStorageOptimizerResponse,update_table_storage_optimizer_response\nUpdateTagCollectionFilter,update_tag_collection_filter\nUpdateTagOptionInput,update_tag_option_input\nUpdateTagOptionOutput,update_tag_option_output\nUpdateTagsForDomainRequest,update_tags_for_domain_request\nUpdateTagsForResourceMessage,update_tags_for_resource_message\nUpdateTaintsPayload,update_taints_payload\nUpdateTarget,update_target\nUpdateTargetGroupRequest,update_target_group_request\nUpdateTargetGroupResponse,update_target_group_response\nUpdateTargets,update_targets\nUpdateTargetsArchitecture,update_targets_architecture\nUpdateTargetsOperatingSystem,update_targets_operating_system\nUpdateTaskExecutionRequest,update_task_execution_request\nUpdateTaskProtectionRequest,update_task_protection_request\nUpdateTaskProtectionResponse,update_task_protection_response\nUpdateTaskRequest,update_task_request\nUpdateTaskSetRequest,update_task_set_request\nUpdateTaskSetResponse,update_task_set_response\nUpdateTaskTemplateRequest,update_task_template_request\nUpdateTaskTemplateResponse,update_task_template_response\nUpdateTeamMemberRequest,update_team_member_request\nUpdateTeamMemberResult,update_team_member_result\nUpdateTemplateActiveVersionRequest,update_template_active_version_request\nUpdateTemplateActiveVersionResponse,update_template_active_version_response\nUpdateTemplateAliasRequest,update_template_alias_request\nUpdateTemplateAliasResponse,update_template_alias_response\nUpdateTemplateGroupAccessControlEntryRequest,update_template_group_access_control_entry_request\nUpdateTemplatePermissionsRequest,update_template_permissions_request\nUpdateTemplatePermissionsResponse,update_template_permissions_response\nUpdateTemplateRequest,update_template_request\nUpdateTemplateResponse,update_template_response\nUpdateTemplateSyncConfigInput,update_template_sync_config_input\nUpdateTemplateSyncConfigOutput,update_template_sync_config_output\nUpdateTerminationProtectionInput,update_termination_protection_input\nUpdateTerminationProtectionOutput,update_termination_protection_output\nUpdateTestGridProjectRequest,update_test_grid_project_request\nUpdateTestGridProjectResult,update_test_grid_project_result\nUpdateTestSetRequest,update_test_set_request\nUpdateTestSetResponse,update_test_set_response\nUpdateThemeAliasRequest,update_theme_alias_request\nUpdateThemeAliasResponse,update_theme_alias_response\nUpdateThemeData,update_theme_data\nUpdateThemePermissionsRequest,update_theme_permissions_request\nUpdateThemePermissionsResponse,update_theme_permissions_response\nUpdateThemeRequest,update_theme_request\nUpdateThemeResponse,update_theme_response\nUpdateThesaurusRequest,update_thesaurus_request\nUpdateThingGroupRequest,update_thing_group_request\nUpdateThingGroupResponse,update_thing_group_response\nUpdateThingGroupsForThingRequest,update_thing_groups_for_thing_request\nUpdateThingRequest,update_thing_request\nUpdateThingRuntimeConfigurationRequest,update_thing_runtime_configuration_request\nUpdateThingShadowRequest,update_thing_shadow_request\nUpdateThingShadowResponse,update_thing_shadow_response\nUpdateThreatIntelSetRequest,update_threat_intel_set_request\nUpdateTieringInput,update_tiering_input\nUpdateTime,update_time\nUpdateTimeToLiveInput,update_time_to_live_input\nUpdateTimeToLiveOutput,update_time_to_live_output\nUpdateTimelineEventInput,update_timeline_event_input\nUpdateToken,update_token\nUpdateTopicPermissionsRequest,update_topic_permissions_request\nUpdateTopicPermissionsResponse,update_topic_permissions_response\nUpdateTopicRefreshScheduleRequest,update_topic_refresh_schedule_request\nUpdateTopicRefreshScheduleResponse,update_topic_refresh_schedule_response\nUpdateTopicRequest,update_topic_request\nUpdateTopicResponse,update_topic_response\nUpdateTopicRuleDestinationRequest,update_topic_rule_destination_request\nUpdateTrackerRequest,update_tracker_request\nUpdateTrackerResponse,update_tracker_response\nUpdateTrafficDistributionRequest,update_traffic_distribution_request\nUpdateTrafficPolicyCommentRequest,update_traffic_policy_comment_request\nUpdateTrafficPolicyCommentResponse,update_traffic_policy_comment_response\nUpdateTrafficPolicyInstanceRequest,update_traffic_policy_instance_request\nUpdateTrafficPolicyInstanceResponse,update_traffic_policy_instance_response\nUpdateTrailRequest,update_trail_request\nUpdateTrailResponse,update_trail_response\nUpdateTrainingJobRequest,update_training_job_request\nUpdateTrainingJobResponse,update_training_job_response\nUpdateTrialComponentRequest,update_trial_component_request\nUpdateTrialComponentResponse,update_trial_component_response\nUpdateTrialRequest,update_trial_request\nUpdateTrialResponse,update_trial_response\nUpdateTriggerRequest,update_trigger_request\nUpdateTriggerResponse,update_trigger_response\nUpdateTrustAnchorRequest,update_trust_anchor_request\nUpdateTrustRequest,update_trust_request\nUpdateTrustResult,update_trust_result\nUpdateTrustStoreRequest,update_trust_store_request\nUpdateTrustStoreResponse,update_trust_store_response\nUpdateType,update_type\nUpdateTypeRequest,update_type_request\nUpdateTypeResponse,update_type_response\nUpdateTypedLinkFacetRequest,update_typed_link_facet_request\nUpdateUploadRequest,update_upload_request\nUpdateUploadResult,update_upload_result\nUpdateUsageLimitRequest,update_usage_limit_request\nUpdateUsageLimitResponse,update_usage_limit_response\nUpdateUsagePlanRequest,update_usage_plan_request\nUpdateUsageRequest,update_usage_request\nUpdateUserAccessLoggingSettingsRequest,update_user_access_logging_settings_request\nUpdateUserAccessLoggingSettingsResponse,update_user_access_logging_settings_response\nUpdateUserAttributesRequest,update_user_attributes_request\nUpdateUserAttributesResponse,update_user_attributes_response\nUpdateUserDefinedFunctionRequest,update_user_defined_function_request\nUpdateUserHierarchyGroupNameRequest,update_user_hierarchy_group_name_request\nUpdateUserHierarchyRequest,update_user_hierarchy_request\nUpdateUserHierarchyStructureRequest,update_user_hierarchy_structure_request\nUpdateUserIdentityInfoRequest,update_user_identity_info_request\nUpdateUserPhoneConfigRequest,update_user_phone_config_request\nUpdateUserPoolClientRequest,update_user_pool_client_request\nUpdateUserPoolClientResponse,update_user_pool_client_response\nUpdateUserPoolDomainRequest,update_user_pool_domain_request\nUpdateUserPoolDomainResponse,update_user_pool_domain_response\nUpdateUserPoolRequest,update_user_pool_request\nUpdateUserProfileRequest,update_user_profile_request\nUpdateUserProfileResponse,update_user_profile_response\nUpdateUserProfileResult,update_user_profile_result\nUpdateUserRequest,update_user_request\nUpdateUserRequestItem,update_user_request_item\nUpdateUserRequestItems,update_user_request_items\nUpdateUserResponse,update_user_response\nUpdateUserRoutingProfileRequest,update_user_routing_profile_request\nUpdateUserSecurityProfilesRequest,update_user_security_profiles_request\nUpdateUserSettingsRequest,update_user_settings_request\nUpdateUserSettingsResponse,update_user_settings_response\nUpdateVPCConnectionRequest,update_vpc_connection_request\nUpdateVPCConnectionResponse,update_vpc_connection_response\nUpdateVPCEConfigurationRequest,update_vpce_configuration_request\nUpdateVPCEConfigurationResult,update_vpce_configuration_result\nUpdateVTLDeviceTypeInput,update_vtl_device_type_input\nUpdateVTLDeviceTypeOutput,update_vtl_device_type_output\nUpdateValue,update_value\nUpdateVariableRequest,update_variable_request\nUpdateVariantStoreRequest,update_variant_store_request\nUpdateVariantStoreResponse,update_variant_store_response\nUpdateVehicleError,update_vehicle_error\nUpdateVehicleRequest,update_vehicle_request\nUpdateVehicleRequestItem,update_vehicle_request_item\nUpdateVehicleResponse,update_vehicle_response\nUpdateVehicleResponseItem,update_vehicle_response_item\nUpdateVersion,update_version\nUpdateViewContentRequest,update_view_content_request\nUpdateViewContentResponse,update_view_content_response\nUpdateViewInput,update_view_input\nUpdateViewMetadataRequest,update_view_metadata_request\nUpdateViewOutput,update_view_output\nUpdateVirtualGatewayInput,update_virtual_gateway_input\nUpdateVirtualGatewayOutput,update_virtual_gateway_output\nUpdateVirtualInterfaceAttributesRequest,update_virtual_interface_attributes_request\nUpdateVirtualNodeInput,update_virtual_node_input\nUpdateVirtualNodeOutput,update_virtual_node_output\nUpdateVirtualRouterInput,update_virtual_router_input\nUpdateVirtualRouterOutput,update_virtual_router_output\nUpdateVirtualServiceInput,update_virtual_service_input\nUpdateVirtualServiceOutput,update_virtual_service_output\nUpdateVocabularyFilterRequest,update_vocabulary_filter_request\nUpdateVocabularyFilterResponse,update_vocabulary_filter_response\nUpdateVocabularyRequest,update_vocabulary_request\nUpdateVocabularyResponse,update_vocabulary_response\nUpdateVodSourceRequest,update_vod_source_request\nUpdateVodSourceResponse,update_vod_source_response\nUpdateVoiceChannelRequest,update_voice_channel_request\nUpdateVoiceChannelResponse,update_voice_channel_response\nUpdateVoiceConnectorGroupRequest,update_voice_connector_group_request\nUpdateVoiceConnectorGroupResponse,update_voice_connector_group_response\nUpdateVoiceConnectorRequest,update_voice_connector_request\nUpdateVoiceConnectorResponse,update_voice_connector_response\nUpdateVoiceProfileDomainRequest,update_voice_profile_domain_request\nUpdateVoiceProfileDomainResponse,update_voice_profile_domain_response\nUpdateVoiceProfileRequest,update_voice_profile_request\nUpdateVoiceProfileResponse,update_voice_profile_response\nUpdateVoiceTemplateRequest,update_voice_template_request\nUpdateVoiceTemplateResponse,update_voice_template_response\nUpdateVolumeRequest,update_volume_request\nUpdateVolumeResponse,update_volume_response\nUpdateVpcAttachmentRequest,update_vpc_attachment_request\nUpdateVpcAttachmentResponse,update_vpc_attachment_response\nUpdateVpcEndpointDetail,update_vpc_endpoint_detail\nUpdateVpcEndpointRequest,update_vpc_endpoint_request\nUpdateVpcEndpointResponse,update_vpc_endpoint_response\nUpdateVpcIngressConnectionRequest,update_vpc_ingress_connection_request\nUpdateVpcIngressConnectionResponse,update_vpc_ingress_connection_response\nUpdateVpcLinkRequest,update_vpc_link_request\nUpdateVpcLinkResponse,update_vpc_link_response\nUpdateWatchlistRequest,update_watchlist_request\nUpdateWatchlistResponse,update_watchlist_response\nUpdateWaveRequest,update_wave_request\nUpdateWebACLRequest,update_web_acl_request\nUpdateWebACLResponse,update_web_acl_response\nUpdateWebhookInput,update_webhook_input\nUpdateWebhookOutput,update_webhook_output\nUpdateWebhookRequest,update_webhook_request\nUpdateWebhookResult,update_webhook_result\nUpdateWirelessDeviceImportTaskRequest,update_wireless_device_import_task_request\nUpdateWirelessDeviceRequest,update_wireless_device_request\nUpdateWirelessGatewayRequest,update_wireless_gateway_request\nUpdateWirelessGatewayTaskCreate,update_wireless_gateway_task_create\nUpdateWirelessGatewayTaskEntry,update_wireless_gateway_task_entry\nUpdateWorkGroupInput,update_work_group_input\nUpdateWorkerFleetRequest,update_worker_fleet_request\nUpdateWorkerFleetResponse,update_worker_fleet_response\nUpdateWorkerRequest,update_worker_request\nUpdateWorkerResponse,update_worker_response\nUpdateWorkflowRequest,update_workflow_request\nUpdateWorkflowResponse,update_workflow_response\nUpdateWorkflowStepGroupRequest,update_workflow_step_group_request\nUpdateWorkflowStepGroupResponse,update_workflow_step_group_response\nUpdateWorkflowStepRequest,update_workflow_step_request\nUpdateWorkflowStepResponse,update_workflow_step_response\nUpdateWorkforceRequest,update_workforce_request\nUpdateWorkforceResponse,update_workforce_response\nUpdateWorkgroupRequest,update_workgroup_request\nUpdateWorkgroupResponse,update_workgroup_response\nUpdateWorkloadInput,update_workload_input\nUpdateWorkloadOutput,update_workload_output\nUpdateWorkloadRequest,update_workload_request\nUpdateWorkloadResponse,update_workload_response\nUpdateWorkloadShareInput,update_workload_share_input\nUpdateWorkloadShareOutput,update_workload_share_output\nUpdateWorkspaceAliasRequest,update_workspace_alias_request\nUpdateWorkspaceAuthenticationRequest,update_workspace_authentication_request\nUpdateWorkspaceAuthenticationResponse,update_workspace_authentication_response\nUpdateWorkspaceBundleRequest,update_workspace_bundle_request\nUpdateWorkspaceConfigurationRequest,update_workspace_configuration_request\nUpdateWorkspaceImagePermissionRequest,update_workspace_image_permission_request\nUpdateWorkspaceRequest,update_workspace_request\nUpdateWorkspaceResponse,update_workspace_response\nUpdateWorkteamRequest,update_workteam_request\nUpdateWorkteamResponse,update_workteam_response\nUpdateWorldTemplateRequest,update_world_template_request\nUpdateWorldTemplateResponse,update_world_template_response\nUpdateXMLClassifierRequest,update_xml_classifier_request\nUpdateXssMatchSetRequest,update_xss_match_set_request\nUpdateXssMatchSetResponse,update_xss_match_set_response\nUpdateZonalShiftRequest,update_zonal_shift_request\nUpdatedAt,updated_at\nUpdatedBy,updated_by\nUpdatedDate,updated_date\nUpdatedField,updated_field\nUpdatedLatestPatchVersion,updated_latest_patch_version\nUpdatedReason,updated_reason\nUpdatedTime,updated_time\nUpdatedTimestamp,updated_timestamp\nUpdatedToken,updated_token\nUpdaterRequestId,updater_request_id\nUpdates,updates\nUpdatesURI,updates_uri\nUpfrontCost,upfront_cost\nUpfrontPrice,upfront_price\nUpgradeAppliedSchemaRequest,upgrade_applied_schema_request\nUpgradeAppliedSchemaResponse,upgrade_applied_schema_response\nUpgradeAvailability,upgrade_availability\nUpgradeDependencyFailureFault,upgrade_dependency_failure_fault\nUpgradeDomainRequest,upgrade_domain_request\nUpgradeDomainResponse,upgrade_domain_response\nUpgradeElasticsearchDomainRequest,upgrade_elasticsearch_domain_request\nUpgradeElasticsearchDomainResponse,upgrade_elasticsearch_domain_response\nUpgradeHistories,upgrade_histories\nUpgradeHistory,upgrade_history\nUpgradeId,upgrade_id\nUpgradeLensReviewInput,upgrade_lens_review_input\nUpgradeName,upgrade_name\nUpgradeProcessing,upgrade_processing\nUpgradeProfileVersionInput,upgrade_profile_version_input\nUpgradePublishedSchemaRequest,upgrade_published_schema_request\nUpgradePublishedSchemaResponse,upgrade_published_schema_response\nUpgradeStatus,upgrade_status\nUpgradeStep,upgrade_step\nUpgradeStepItem,upgrade_step_item\nUpgradeStepStatus,upgrade_step_status\nUpgradeTarget,upgrade_target\nUpgradedSchemaArn,upgraded_schema_arn\nUplinkCount,uplink_count\nUplinkEchoConfig,uplink_echo_config\nUplinkGbps,uplink_gbps\nUplinkSpectrumConfig,uplink_spectrum_config\nUpload,upload\nUploadArchiveInput,upload_archive_input\nUploadAvailability,upload_availability\nUploadBufferAllocatedInBytes,upload_buffer_allocated_in_bytes\nUploadBufferUsedInBytes,upload_buffer_used_in_bytes\nUploadConfiguration,upload_configuration\nUploadCredentials,upload_credentials\nUploadDate,upload_date\nUploadDocumentsRequest,upload_documents_request\nUploadDocumentsResponse,upload_documents_response\nUploadEnd,upload_end\nUploadEntityDefinitionsRequest,upload_entity_definitions_request\nUploadEntityDefinitionsResponse,upload_entity_definitions_response\nUploadId,upload_id\nUploadIdMarker,upload_id_marker\nUploadLayerPartRequest,upload_layer_part_request\nUploadLayerPartResponse,upload_layer_part_response\nUploadListElement,upload_list_element\nUploadMetadata,upload_metadata\nUploadMultipartPartInput,upload_multipart_part_input\nUploadMultipartPartOutput,upload_multipart_part_output\nUploadNotFoundException,upload_not_found_exception\nUploadPartCopyOutput,upload_part_copy_output\nUploadPartCopyRequest,upload_part_copy_request\nUploadPartOutput,upload_part_output\nUploadPartRequest,upload_part_request\nUploadPolicy,upload_policy\nUploadPolicySignature,upload_policy_signature\nUploadReadSetPartRequest,upload_read_set_part_request\nUploadReadSetPartResponse,upload_read_set_part_response\nUploadSSHPublicKeyRequest,upload_ssh_public_key_request\nUploadSSHPublicKeyResponse,upload_ssh_public_key_response\nUploadServerCertificateRequest,upload_server_certificate_request\nUploadServerCertificateResponse,upload_server_certificate_response\nUploadSettings,upload_settings\nUploadSigningCertificateRequest,upload_signing_certificate_request\nUploadSigningCertificateResponse,upload_signing_certificate_response\nUploadSize,upload_size\nUploadSpeed,upload_speed\nUploadStart,upload_start\nUploadType,upload_type\nUploadUrl,upload_url\nUploaderConfig,uploader_config\nUploaderStatus,uploader_status\nUploads,uploads\nUploadsList,uploads_list\nUpperBound,upper_bound\nUpperBoundary,upper_boundary\nUpsert,upsert\nUpsertKeys,upsert_keys\nUpsertRedshiftOptions,upsert_redshift_options\nUpsertRedshiftTargetOptions,upsert_redshift_target_options\nUpsertRowData,upsert_row_data\nUpsertRowsResult,upsert_rows_result\nUpsolver,upsolver\nUpsolverDestinationProperties,upsolver_destination_properties\nUpsolverS3OutputFormatConfig,upsolver_s3_output_format_config\nUpstreamRepository,upstream_repository\nUpstreamRepositoryInfo,upstream_repository_info\nUri,uri\nUriEndpoint,uri_endpoint\nUriPath,uri_path\nUriPathRoute,uri_path_route\nUriPathRouteInput,uri_path_route_input\nUris,uris\nUrl,url\nUrlEndpoint,url_endpoint\nUrlEndpointConfig,url_endpoint_config\nUrlEndpointInput,url_endpoint_input\nUrlEndpointSummary,url_endpoint_summary\nUrlExclusionPatterns,url_exclusion_patterns\nUrlExpiry,url_expiry\nUrlInclusionPatterns,url_inclusion_patterns\nUrlPath,url_path\nUrlReference,url_reference\nUrlType,url_type\nUrls,urls\nUsage,usage\nUsageAccountResult,usage_account_result\nUsageAllocation,usage_allocation\nUsageAllocations,usage_allocations\nUsageByAccount,usage_by_account\nUsageCriteria,usage_criteria\nUsageDataSourceResult,usage_data_source_result\nUsageDimension,usage_dimension\nUsageFeatureResult,usage_feature_result\nUsageFlags,usage_flags\nUsageInstruction,usage_instruction\nUsageInstructions,usage_instructions\nUsageLimit,usage_limit\nUsageLimitAlreadyExistsFault,usage_limit_already_exists_fault\nUsageLimitId,usage_limit_id\nUsageLimitList,usage_limit_list\nUsageLimitNotFoundFault,usage_limit_not_found_fault\nUsageLimits,usage_limits\nUsageMetric,usage_metric\nUsageMetricBasis,usage_metric_basis\nUsageMode,usage_mode\nUsageOperation,usage_operation\nUsageOperationUpdateTime,usage_operation_update_time\nUsagePlan,usage_plan\nUsagePlanKey,usage_plan_key\nUsagePlanKeys,usage_plan_keys\nUsagePlans,usage_plans\nUsagePrice,usage_price\nUsageQuantity,usage_quantity\nUsageRecord,usage_record\nUsageRecordResult,usage_record_result\nUsageRecords,usage_records\nUsageReportSubscription,usage_report_subscription\nUsageReportSubscriptions,usage_report_subscriptions\nUsageResourceResult,usage_resource_result\nUsageStartTimestamp,usage_start_timestamp\nUsageStatisticType,usage_statistic_type\nUsageStatistics,usage_statistics\nUsageStatisticsFilter,usage_statistics_filter\nUsageStatisticsSortBy,usage_statistics_sort_by\nUsageStopTimestamp,usage_stop_timestamp\nUsageStrategy,usage_strategy\nUsageTotal,usage_total\nUsageType,usage_type\nUsbDeviceFilterStrings,usb_device_filter_strings\nUse2DSolver,use2_d_solver\nUseAlternateFolderForOnline,use_alternate_folder_for_online\nUseAmortized,use_amortized\nUseAudioRenditionGroup,use_audio_rendition_group\nUseAwsOwnedKey,use_aws_owned_key\nUseAwsProvidedLatestImage,use_aws_provided_latest_image\nUseBFile,use_b_file\nUseBcpFullLoad,use_bcp_full_load\nUseBlankCellFormat,use_blank_cell_format\nUseBlended,use_blended\nUseCase,use_case\nUseCaseArn,use_case_arn\nUseCaseDescription,use_case_description\nUseCaseId,use_case_id\nUseCaseSummaryList,use_case_summary_list\nUseCaseType,use_case_type\nUseChangeLog,use_change_log\nUseCsvNoSupValue,use_csv_no_sup_value\nUseCustomCookbooks,use_custom_cookbooks\nUseDefaultIfPreferenceUnavailable,use_default_if_preference_unavailable\nUseDefaultProcessorFeatures,use_default_processor_features\nUseDefaults,use_defaults\nUseDirectPathFullLoad,use_direct_path_full_load\nUseEarliestTimeOnPointInTimeUnavailable,use_earliest_time_on_point_in_time_unavailable\nUseEbsOptimizedInstances,use_ebs_optimized_instances\nUseExistingClientSecret,use_existing_client_secret\nUseGeolocationForTimeZone,use_geolocation_for_time_zone\nUseGrouping,use_grouping\nUseLakeFormationCredentials,use_lake_formation_credentials\nUseLatestRestorableTime,use_latest_restorable_time\nUseLegacyProvider,use_legacy_provider\nUseLogit,use_logit\nUseLogminerReader,use_logminer_reader\nUseLongIds,use_long_ids\nUseLongIdsAggregated,use_long_ids_aggregated\nUseMiddleboxes,use_middleboxes\nUseNewMappingType,use_new_mapping_type\nUseOffPeakWindow,use_off_peak_window\nUseOpsworksSecurityGroups,use_opsworks_security_groups\nUseOrdering,use_ordering\nUsePathPrefix,use_path_prefix\nUsePreviousTemplate,use_previous_template\nUsePreviousValue,use_previous_value\nUsePrimaryBackgroundColor,use_primary_background_color\nUseSameUsername,use_same_username\nUseServiceLinkedRole,use_service_linked_role\nUseStageCache,use_stage_cache\nUseTaskStartTimeForFullLoadTimestamp,use_task_start_time_for_full_load_timestamp\nUseThirdPartyBackupDevice,use_third_party_backup_device\nUseUpdateLookUp,use_update_look_up\nUsed,used\nUsedCommitment,used_commitment\nUsedInstanceCount,used_instance_count\nUser,user\nUserAccessLoggingSettings,user_access_logging_settings\nUserAccessLoggingSettingsSummary,user_access_logging_settings_summary\nUserAccessResultItem,user_access_result_item\nUserAccessTaskItem,user_access_task_item\nUserAccessUrl,user_access_url\nUserActivities,user_activities\nUserAgent,user_agent\nUserAlreadyExistsFault,user_already_exists_fault\nUserAndGroupQuotas,user_and_group_quotas\nUserArn,user_arn\nUserArnSession,user_arn_session\nUserAttributeNames,user_attribute_names\nUserAttributeUpdateSettings,user_attribute_update_settings\nUserAttributeUpdateSettingsType,user_attribute_update_settings_type\nUserAttributes,user_attributes\nUserAuthConfig,user_auth_config\nUserAuthConfigInfo,user_auth_config_info\nUserBase,user_base\nUserBucket,user_bucket\nUserBucketDetails,user_bucket_details\nUserByPermissionGroup,user_by_permission_group\nUserCode,user_code\nUserConfig,user_config\nUserConfiguration,user_configuration\nUserConfirmationNecessary,user_confirmation_necessary\nUserConfirmed,user_confirmed\nUserContext,user_context\nUserContextData,user_context_data\nUserContextDataType,user_context_data_type\nUserContextPolicy,user_context_policy\nUserCount,user_count\nUserCreateDate,user_create_date\nUserData,user_data\nUserDataFilters,user_data_filters\nUserDataList,user_data_list\nUserDataShared,user_data_shared\nUserDataValidationParameters,user_data_validation_parameters\nUserDefined,user_defined\nUserDefinedFields,user_defined_fields\nUserDefinedFunction,user_defined_function\nUserDefinedFunctionInput,user_defined_function_input\nUserDefinedFunctions,user_defined_functions\nUserDetail,user_detail\nUserDetailList,user_detail_list\nUserDetails,user_details\nUserDoesNotExistException,user_does_not_exist_exception\nUserEmail,user_email\nUserEmailList,user_email_list\nUserEnabledAsLocalAdministrator,user_enabled_as_local_administrator\nUserError,user_error\nUserErrorException,user_error_exception\nUserErrors,user_errors\nUserFeedback,user_feedback\nUserGroup,user_group\nUserGroupAlreadyExistsFault,user_group_already_exists_fault\nUserGroupId,user_group_id\nUserGroupIds,user_group_ids\nUserGroupIdsToAdd,user_group_ids_to_add\nUserGroupIdsToRemove,user_group_ids_to_remove\nUserGroupNotFoundFault,user_group_not_found_fault\nUserGroupPendingChanges,user_group_pending_changes\nUserGroupQuotaExceededFault,user_group_quota_exceeded_fault\nUserGroupResolutionConfiguration,user_group_resolution_configuration\nUserGroupResolutionMode,user_group_resolution_mode\nUserGroups,user_groups\nUserGroupsUpdateStatus,user_groups_update_status\nUserHierarchyGroupSummaryList,user_hierarchy_group_summary_list\nUserHierarchyGroups,user_hierarchy_groups\nUserId,user_id\nUserIdGroupPair,user_id_group_pair\nUserIdGroupPairs,user_id_group_pairs\nUserIdList,user_id_list\nUserIdentity,user_identity\nUserIdentityConfiguration,user_identity_configuration\nUserIdentityInfo,user_identity_info\nUserIdentityInfoLite,user_identity_info_lite\nUserIdentityRoot,user_identity_root\nUserIds,user_ids\nUserIdsToAdd,user_ids_to_add\nUserIdsToRemove,user_ids_to_remove\nUserImportInProgressException,user_import_in_progress_exception\nUserImportJob,user_import_job\nUserImportJobType,user_import_job_type\nUserImportJobs,user_import_jobs\nUserInfo,user_info\nUserInfoEndpoint,user_info_endpoint\nUserInteractionRequired,user_interaction_required\nUserInvitationStatus,user_invitation_status\nUserInvitationUrl,user_invitation_url\nUserLambdaValidationException,user_lambda_validation_exception\nUserLastModifiedDate,user_last_modified_date\nUserList,user_list\nUserMFASettingList,user_mfa_setting_list\nUserMatch,user_match\nUserMatchThreshold,user_match_threshold\nUserMatches,user_matches\nUserMetadata,user_metadata\nUserMigration,user_migration\nUserName,user_name\nUserNameAttributeField,user_name_attribute_field\nUserNameColumn,user_name_column\nUserNames,user_names\nUserNamesToAdd,user_names_to_add\nUserNamesToRemove,user_names_to_remove\nUserNotConfirmedException,user_not_confirmed_exception\nUserNotFoundException,user_not_found_exception\nUserNotFoundFault,user_not_found_fault\nUserPassword,user_password\nUserPausedDetails,user_paused_details\nUserPendingChanges,user_pending_changes\nUserPhoneConfig,user_phone_config\nUserPolicyList,user_policy_list\nUserPool,user_pool\nUserPoolAddOnNotEnabledException,user_pool_add_on_not_enabled_exception\nUserPoolAddOns,user_pool_add_ons\nUserPoolAddOnsType,user_pool_add_ons_type\nUserPoolArn,user_pool_arn\nUserPoolClient,user_pool_client\nUserPoolClientDescription,user_pool_client_description\nUserPoolClientId,user_pool_client_id\nUserPoolClientType,user_pool_client_type\nUserPoolClients,user_pool_clients\nUserPoolConfig,user_pool_config\nUserPoolConfigs,user_pool_configs\nUserPoolDescriptionType,user_pool_description_type\nUserPoolDomain,user_pool_domain\nUserPoolId,user_pool_id\nUserPoolName,user_pool_name\nUserPoolPolicyType,user_pool_policy_type\nUserPoolTaggingException,user_pool_tagging_exception\nUserPoolTags,user_pool_tags\nUserPoolType,user_pool_type\nUserPools,user_pools\nUserProfile,user_profile\nUserProfileAlreadyExistsException,user_profile_already_exists_exception\nUserProfileArn,user_profile_arn\nUserProfileDetails,user_profile_details\nUserProfileName,user_profile_name\nUserProfileNameContains,user_profile_name_contains\nUserProfileNameEquals,user_profile_name_equals\nUserProfileNotFoundException,user_profile_not_found_exception\nUserProfileSummary,user_profile_summary\nUserProfiles,user_profiles\nUserProperty,user_property\nUserQuickConnectConfig,user_quick_connect_config\nUserQuotaExceededFault,user_quota_exceeded_fault\nUserReference,user_reference\nUserRegistrationStatus,user_registration_status\nUserRole,user_role\nUserRoleName,user_role_name\nUserRules,user_rules\nUserSearchCriteria,user_search_criteria\nUserSearchFilter,user_search_filter\nUserSearchMatching,user_search_matching\nUserSearchSubtree,user_search_subtree\nUserSearchSummary,user_search_summary\nUserSecretId,user_secret_id\nUserSetting,user_setting\nUserSettings,user_settings\nUserSettingsSummary,user_settings_summary\nUserStackAssociation,user_stack_association\nUserStackAssociationError,user_stack_association_error\nUserStackAssociations,user_stack_associations\nUserStatus,user_status\nUserStorage,user_storage\nUserStorageMetadata,user_storage_metadata\nUserSub,user_sub\nUserSummary,user_summary\nUserSummaryList,user_summary_list\nUserTags,user_tags\nUserTokenConfiguration,user_token_configuration\nUserTokenConfigurations,user_token_configurations\nUserTrustProviderType,user_trust_provider_type\nUserTurnInputSpecification,user_turn_input_specification\nUserTurnIntentOutput,user_turn_intent_output\nUserTurnOutputSpecification,user_turn_output_specification\nUserTurnResult,user_turn_result\nUserTurnSlotOutput,user_turn_slot_output\nUserTurnSpecification,user_turn_specification\nUserType,user_type\nUserVolumeEncryptionEnabled,user_volume_encryption_enabled\nUserVolumeSizeGib,user_volume_size_gib\nUsername,username\nUsernameAttributes,username_attributes\nUsernameConfiguration,username_configuration\nUsernameConfigurationType,username_configuration_type\nUsernameExistsException,username_exists_exception\nUsernameField,username_field\nUsernamePassword,username_password\nUsernamePrefix,username_prefix\nUsernames,usernames\nUsers,users\nUsersPerStep,users_per_step\nUtcTiming,utc_timing\nUtcTimingUri,utc_timing_uri\nUtilization,utilization\nUtilizationByTime,utilization_by_time\nUtilizationMetric,utilization_metric\nUtilizationPercentage,utilization_percentage\nUtilizationPercentageInUnits,utilization_percentage_in_units\nUtilizationStatus,utilization_status\nUtilizationsByTime,utilizations_by_time\nUtilizedCIDRCount,utilized_cidr_count\nUtranCid,utran_cid\nUtteranceAggregationDuration,utterance_aggregation_duration\nUtteranceAudioInputSpecification,utterance_audio_input_specification\nUtteranceBotResponse,utterance_bot_response\nUtteranceData,utterance_data\nUtteranceDataSortBy,utterance_data_sort_by\nUtteranceEvent,utterance_event\nUtteranceId,utterance_id\nUtteranceInputSpecification,utterance_input_specification\nUtteranceLevelTestResultItem,utterance_level_test_result_item\nUtteranceLevelTestResults,utterance_level_test_results\nUtteranceList,utterance_list\nUtteranceSpecification,utterance_specification\nUuid,uuid\nVCPU,vcpu\nVCpuCount,v_cpu_count\nVCpuCountRange,v_cpu_count_range\nVCpuCountRangeRequest,v_cpu_count_range_request\nVCpuCountRequest,v_cpu_count_request\nVCpuInfo,v_cpu_info\nVOICE,voice\nVPC,vpc\nVPCAssociationAuthorizationNotFound,vpc_association_authorization_not_found\nVPCAssociationNotFound,vpc_association_not_found\nVPCConfig,vpc_config\nVPCConfigResponse,vpc_config_response\nVPCConnection,vpc_connection\nVPCConnectionId,vpc_connection_id\nVPCConnectionSummaries,vpc_connection_summaries\nVPCConnectionSummary,vpc_connection_summary\nVPCConnections,vpc_connections\nVPCDerivedInfo,vpc_derived_info\nVPCDerivedInfoStatus,vpc_derived_info_status\nVPCEConfiguration,vpce_configuration\nVPCEndpoint,vpc_endpoint\nVPCEndpointDNSName,vpc_endpoint_dns_name\nVPCId,vpc_id\nVPCOptions,vpc_options\nVPCRegion,vpc_region\nVPCSettings,vpc_settings\nVPCZoneIdentifier,vpc_zone_identifier\nVPCs,vpcs\nVTLDevice,vtl_device\nVTLDeviceARN,vtl_device_arn\nVTLDeviceARNs,vtl_device_arns\nVTLDeviceProductIdentifier,vtl_device_product_identifier\nVTLDeviceType,vtl_device_type\nVTLDeviceVendor,vtl_device_vendor\nVTLDevices,vtl_devices\nValid,valid\nValidCores,valid_cores\nValidDBInstanceModificationsMessage,valid_db_instance_modifications_message\nValidForInMinutes,valid_for_in_minutes\nValidFrom,valid_from\nValidFromDate,valid_from_date\nValidNextSteps,valid_next_steps\nValidProcessorFeatures,valid_processor_features\nValidStorageOptions,valid_storage_options\nValidThreadsPerCore,valid_threads_per_core\nValidTill,valid_till\nValidTo,valid_to\nValidToDate,valid_to_date\nValidUntil,valid_until\nValidUpgradeTarget,valid_upgrade_target\nValidUserList,valid_user_list\nValidateAssessmentReportIntegrityRequest,validate_assessment_report_integrity_request\nValidateAssessmentReportIntegrityResponse,validate_assessment_report_integrity_response\nValidateConfigurationRequest,validate_configuration_request\nValidateConfigurationSettingsMessage,validate_configuration_settings_message\nValidateE911AddressRequest,validate_e911_address_request\nValidateE911AddressResponse,validate_e911_address_response\nValidateMatchmakingRuleSetInput,validate_matchmaking_rule_set_input\nValidateMatchmakingRuleSetOutput,validate_matchmaking_rule_set_output\nValidateOnly,validate_only\nValidatePipelineDefinitionInput,validate_pipeline_definition_input\nValidatePipelineDefinitionOutput,validate_pipeline_definition_output\nValidatePipelineRequest,validate_pipeline_request\nValidatePipelineResponse,validate_pipeline_response\nValidatePolicyFinding,validate_policy_finding\nValidatePolicyRequest,validate_policy_request\nValidatePolicyResponse,validate_policy_response\nValidateResourcePolicyRequest,validate_resource_policy_request\nValidateResourcePolicyResponse,validate_resource_policy_response\nValidateSecurityProfileBehaviorsRequest,validate_security_profile_behaviors_request\nValidateSecurityProfileBehaviorsResponse,validate_security_profile_behaviors_response\nValidateSolFunctionPackageContentInput,validate_sol_function_package_content_input\nValidateSolFunctionPackageContentMetadata,validate_sol_function_package_content_metadata\nValidateSolFunctionPackageContentOutput,validate_sol_function_package_content_output\nValidateSolNetworkPackageContentInput,validate_sol_network_package_content_input\nValidateSolNetworkPackageContentMetadata,validate_sol_network_package_content_metadata\nValidateSolNetworkPackageContentOutput,validate_sol_network_package_content_output\nValidateTemplateInput,validate_template_input\nValidateTemplateOutput,validate_template_output\nValidation,validation\nValidationConfiguration,validation_configuration\nValidationConfigurations,validation_configurations\nValidationData,validation_data\nValidationDataConfig,validation_data_config\nValidationDataLength,validation_data_length\nValidationDomain,validation_domain\nValidationEmails,validation_emails\nValidationError,validation_error\nValidationErrors,validation_errors\nValidationErrorsEntry,validation_errors_entry\nValidationException,validation_exception\nValidationExceptionErrorArgument,validation_exception_error_argument\nValidationExceptionField,validation_exception_field\nValidationExceptionType,validation_exception_type\nValidationFailedRecords,validation_failed_records\nValidationFailure,validation_failure\nValidationFailureReason,validation_failure_reason\nValidationFailures,validation_failures\nValidationFraction,validation_fraction\nValidationIssue,validation_issue\nValidationMessage,validation_message\nValidationMethod,validation_method\nValidationMode,validation_mode\nValidationOutput,validation_output\nValidationPendingRecords,validation_pending_records\nValidationProfiles,validation_profiles\nValidationResult,validation_result\nValidationRole,validation_role\nValidationRule,validation_rule\nValidationSettings,validation_settings\nValidationSpecification,validation_specification\nValidationState,validation_state\nValidationStateDetails,validation_state_details\nValidationStatus,validation_status\nValidationStatuses,validation_statuses\nValidationSuspendedRecords,validation_suspended_records\nValidationWarning,validation_warning\nValidator,validator\nValidatorMetric,validator_metric\nValidatorTypes,validator_types\nValidators,validators\nValidity,validity\nValidityEndTime,validity_end_time\nValidityNotBefore,validity_not_before\nValidityPeriod,validity_period\nValidityStartTime,validity_start_time\nValue,value\nValueAsString,value_as_string\nValueAsStringList,value_as_string_list\nValueAxis,value_axis\nValueCellStyle,value_cell_style\nValueDetection,value_detection\nValueDetections,value_detections\nValueForMultipleValues,value_for_multiple_values\nValueFrom,value_from\nValueHint,value_hint\nValueHolder,value_holder\nValueImportanceMap,value_importance_map\nValueInIA,value_in_ia\nValueInMilliseconds,value_in_milliseconds\nValueInStandard,value_in_standard\nValueKey,value_key\nValueLabelConfiguration,value_label_configuration\nValueLabelOptions,value_label_options\nValueList,value_list\nValueMapping,value_mapping\nValueMappings,value_mappings\nValueOptions,value_options\nValueType,value_type\nValueWhenUnset,value_when_unset\nValueWhenUnsetOption,value_when_unset_option\nValueWithServiceIds,value_with_service_ids\nValues,values\nValuesMap,values_map\nValuesToAdd,values_to_add\nValuesToRemove,values_to_remove\nVarCharValue,var_char_value\nVariable,variable\nVariableDefinition,variable_definition\nVariableEntry,variable_entry\nVariableImpactExplanation,variable_impact_explanation\nVariableImportanceMetrics,variable_importance_metrics\nVariableTags,variable_tags\nVariableValue,variable_value\nVariables,variables\nVariant,variant\nVariantImportItemDetail,variant_import_item_detail\nVariantImportItemSource,variant_import_item_source\nVariantImportJobItem,variant_import_job_item\nVariantName,variant_name\nVariantProperty,variant_property\nVariantPropertyType,variant_property_type\nVariantStatus,variant_status\nVariantStoreItem,variant_store_item\nVariation,variation\nVariationConfig,variation_config\nVaultARN,vault_arn\nVaultAccessPolicy,vault_access_policy\nVaultList,vault_list\nVaultLockPolicy,vault_lock_policy\nVaultName,vault_name\nVaultNames,vault_names\nVaultNotificationConfig,vault_notification_config\nVaultState,vault_state\nVaultType,vault_type\nVbrQuality,vbr_quality\nVc3Class,vc3_class\nVc3Settings,vc3_settings\nVcenterBasedRemoteInfo,vcenter_based_remote_info\nVcenterClient,vcenter_client\nVcfOptions,vcf_options\nVchipAction,vchip_action\nVcpu,vcpu\nVdmAttributes,vdm_attributes\nVdmEnabled,vdm_enabled\nVdmOptions,vdm_options\nVectorConfig,vector_config\nVectorCounters,vector_counters\nVectorEnrichmentJobErrorDetails,vector_enrichment_job_error_details\nVectorEnrichmentJobExportErrorDetails,vector_enrichment_job_export_error_details\nVectorEnrichmentJobInputConfig,vector_enrichment_job_input_config\nVectorEnrichmentJobS3Data,vector_enrichment_job_s3_data\nVectorEnrichmentJobSummaries,vector_enrichment_job_summaries\nVectorType,vector_type\nVeeva,veeva\nVeevaConnectorProfileCredentials,veeva_connector_profile_credentials\nVeevaConnectorProfileProperties,veeva_connector_profile_properties\nVeevaSourceProperties,veeva_source_properties\nVehicleStatus,vehicle_status\nVehicleSummary,vehicle_summary\nVendor,vendor\nVendorCreatedAt,vendor_created_at\nVendorGuidance,vendor_guidance\nVendorId,vendor_id\nVendorName,vendor_name\nVendorProperties,vendor_properties\nVendorSeverity,vendor_severity\nVendorUpdatedAt,vendor_updated_at\nVerb,verb\nVerbose,verbose\nVerificationAttributes,verification_attributes\nVerificationException,verification_exception\nVerificationFailedException,verification_failed_exception\nVerificationKeyArn,verification_key_arn\nVerificationKeyCheckValue,verification_key_check_value\nVerificationKeyIdentifier,verification_key_identifier\nVerificationMessage,verification_message\nVerificationMessageTemplate,verification_message_template\nVerificationMessageTemplateType,verification_message_template_type\nVerificationResponse,verification_response\nVerificationState,verification_state\nVerificationStatus,verification_status\nVerificationToken,verification_token\nVerificationValue,verification_value\nVerified,verified\nVerifiedAccessEndpoint,verified_access_endpoint\nVerifiedAccessEndpointEniOptions,verified_access_endpoint_eni_options\nVerifiedAccessEndpointId,verified_access_endpoint_id\nVerifiedAccessEndpointIds,verified_access_endpoint_ids\nVerifiedAccessEndpointLoadBalancerOptions,verified_access_endpoint_load_balancer_options\nVerifiedAccessEndpointStatus,verified_access_endpoint_status\nVerifiedAccessEndpoints,verified_access_endpoints\nVerifiedAccessGroup,verified_access_group\nVerifiedAccessGroupArn,verified_access_group_arn\nVerifiedAccessGroupId,verified_access_group_id\nVerifiedAccessGroupIds,verified_access_group_ids\nVerifiedAccessGroups,verified_access_groups\nVerifiedAccessInstance,verified_access_instance\nVerifiedAccessInstanceId,verified_access_instance_id\nVerifiedAccessInstanceIds,verified_access_instance_ids\nVerifiedAccessInstanceLoggingConfiguration,verified_access_instance_logging_configuration\nVerifiedAccessInstances,verified_access_instances\nVerifiedAccessLogCloudWatchLogsDestination,verified_access_log_cloud_watch_logs_destination\nVerifiedAccessLogCloudWatchLogsDestinationOptions,verified_access_log_cloud_watch_logs_destination_options\nVerifiedAccessLogDeliveryStatus,verified_access_log_delivery_status\nVerifiedAccessLogKinesisDataFirehoseDestination,verified_access_log_kinesis_data_firehose_destination\nVerifiedAccessLogKinesisDataFirehoseDestinationOptions,verified_access_log_kinesis_data_firehose_destination_options\nVerifiedAccessLogOptions,verified_access_log_options\nVerifiedAccessLogS3Destination,verified_access_log_s3_destination\nVerifiedAccessLogS3DestinationOptions,verified_access_log_s3_destination_options\nVerifiedAccessLogs,verified_access_logs\nVerifiedAccessSseSpecificationRequest,verified_access_sse_specification_request\nVerifiedAccessSseSpecificationResponse,verified_access_sse_specification_response\nVerifiedAccessTrustProvider,verified_access_trust_provider\nVerifiedAccessTrustProviderCondensed,verified_access_trust_provider_condensed\nVerifiedAccessTrustProviderId,verified_access_trust_provider_id\nVerifiedAccessTrustProviderIds,verified_access_trust_provider_ids\nVerifiedAccessTrustProviders,verified_access_trust_providers\nVerifiedAuthorUrl,verified_author_url\nVerifiedEmailAddresses,verified_email_addresses\nVerifiedForSendingStatus,verified_for_sending_status\nVerify,verify\nVerifyAuthChallengeResponse,verify_auth_challenge_response\nVerifyAuthRequestCryptogramInput,verify_auth_request_cryptogram_input\nVerifyAuthRequestCryptogramOutput,verify_auth_request_cryptogram_output\nVerifyCardValidationDataInput,verify_card_validation_data_input\nVerifyCardValidationDataOutput,verify_card_validation_data_output\nVerifyDomainDkimRequest,verify_domain_dkim_request\nVerifyDomainDkimResponse,verify_domain_dkim_response\nVerifyDomainIdentityRequest,verify_domain_identity_request\nVerifyDomainIdentityResponse,verify_domain_identity_response\nVerifyDuration,verify_duration\nVerifyEmailAddressRequest,verify_email_address_request\nVerifyEmailIdentityRequest,verify_email_identity_request\nVerifyMacInput,verify_mac_input\nVerifyMacOutput,verify_mac_output\nVerifyMacRequest,verify_mac_request\nVerifyMacResponse,verify_mac_response\nVerifyMode,verify_mode\nVerifyOTPMessageRequest,verify_otp_message_request\nVerifyOTPMessageRequestParameters,verify_otp_message_request_parameters\nVerifyOTPMessageResponse,verify_otp_message_response\nVerifyPinDataInput,verify_pin_data_input\nVerifyPinDataOutput,verify_pin_data_output\nVerifyRequest,verify_request\nVerifyResponse,verify_response\nVerifySMSSandboxPhoneNumberInput,verify_sms_sandbox_phone_number_input\nVerifySessionResponse,verify_session_response\nVerifySoftwareTokenRequest,verify_software_token_request\nVerifySoftwareTokenResponse,verify_software_token_response\nVerifyStatus,verify_status\nVerifyTrustRequest,verify_trust_request\nVerifyTrustResult,verify_trust_result\nVerifyUserAttributeRequest,verify_user_attribute_request\nVersion,version\nVersionArn,version_arn\nVersionBump,version_bump\nVersionConflictException,version_conflict_exception\nVersionControlInfo,version_control_info\nVersionCount,version_count\nVersionCreatedDate,version_created_date\nVersionDate,version_date\nVersionDeleteError,version_delete_error\nVersionDescription,version_description\nVersionDifferences,version_differences\nVersionId,version_id\nVersionIdMarker,version_id_marker\nVersionIds,version_ids\nVersionIdsToStages,version_ids_to_stages\nVersionInfo,version_info\nVersionInformation,version_information\nVersionLabel,version_label\nVersionLabels,version_labels\nVersionLifecycleConfig,version_lifecycle_config\nVersionMismatchException,version_mismatch_exception\nVersionName,version_name\nVersionNames,version_names\nVersionNumber,version_number\nVersionStage,version_stage\nVersionStages,version_stages\nVersionStatus,version_status\nVersionSummary,version_summary\nVersionToExpire,version_to_expire\nVersionToPublish,version_to_publish\nVersionUpdateByJobsConfig,version_update_by_jobs_config\nVersioningConfiguration,versioning_configuration\nVersioningSupported,versioning_supported\nVersions,versions\nVersionsLimitExceededException,versions_limit_exceeded_exception\nVersionsToPublish,versions_to_publish\nVertex,vertex\nVerticalAccuracy,vertical_accuracy\nVerticalAlign,vertical_align\nVerticalLayoutConfiguration,vertical_layout_configuration\nVerticalOffset,vertical_offset\nVerticalOverflowVisibility,vertical_overflow_visibility\nVerticalPosition,vertical_position\nVerticalTextAlignment,vertical_text_alignment\nVertices,vertices\nVgwTelemetry,vgw_telemetry\nVideo,video\nVideoArtifactsConfiguration,video_artifacts_configuration\nVideoAttribute,video_attribute\nVideoBlackFailoverSettings,video_black_failover_settings\nVideoBlackSettings,video_black_settings\nVideoBlackThresholdMsec,video_black_threshold_msec\nVideoCodecSettings,video_codec_settings\nVideoCompositionOffsets,video_composition_offsets\nVideoConcatenationConfiguration,video_concatenation_configuration\nVideoConfiguration,video_configuration\nVideoContentSourceUrl,video_content_source_url\nVideoDescription,video_description\nVideoDescriptionName,video_description_name\nVideoDescriptions,video_descriptions\nVideoDetail,video_detail\nVideoDetails,video_details\nVideoFormat,video_format\nVideoGenerator,video_generator\nVideoMetadata,video_metadata\nVideoParameters,video_parameters\nVideoPid,video_pid\nVideoPreprocessor,video_preprocessor\nVideoPreprocessors,video_preprocessors\nVideoQuality,video_quality\nVideoSelector,video_selector\nVideoSelectorColorSpaceSettings,video_selector_color_space_settings\nVideoSelectorPid,video_selector_pid\nVideoSelectorProgramId,video_selector_program_id\nVideoSelectorSettings,video_selector_settings\nVideoSettings,video_settings\nVideoTooLargeException,video_too_large_exception\nView,view\nViewArn,view_arn\nViewArns,view_arns\nViewBillingRequest,view_billing_request\nViewBillingResponse,view_billing_response\nViewContent,view_content\nViewContentSha256,view_content_sha256\nViewExpandedText,view_expanded_text\nViewFrame,view_frame\nViewId,view_id\nViewInputContent,view_input_content\nViewName,view_name\nViewOffNadir,view_off_nadir\nViewOffNadirInput,view_off_nadir_input\nViewOriginalText,view_original_text\nViewSummary,view_summary\nViewSunAzimuth,view_sun_azimuth\nViewSunAzimuthInput,view_sun_azimuth_input\nViewSunElevation,view_sun_elevation\nViewSunElevationInput,view_sun_elevation_input\nViewToken,view_token\nViewVersion,view_version\nViewVersionSummary,view_version_summary\nViewVersionSummaryList,view_version_summary_list\nViewerCertificate,viewer_certificate\nViewerProtocolPolicy,viewer_protocol_policy\nViews,views\nViewsSummaryList,views_summary_list\nViolatedEntities,violated_entities\nViolatingRoute,violating_route\nViolatingRoutes,violating_routes\nViolatingSecurityGroups,violating_security_groups\nViolationDetail,violation_detail\nViolationEvent,violation_event\nViolationEventAdditionalInfo,violation_event_additional_info\nViolationEventOccurrenceRange,violation_event_occurrence_range\nViolationReason,violation_reason\nViolationReport,violation_report\nViolationTarget,violation_target\nViolationTargetDescription,violation_target_description\nViolatorCount,violator_count\nViolators,violators\nVirtualCluster,virtual_cluster\nVirtualGateway,virtual_gateway\nVirtualGatewayBackendDefaults,virtual_gateway_backend_defaults\nVirtualGatewayClientPolicy,virtual_gateway_client_policy\nVirtualGatewayClientPolicyTls,virtual_gateway_client_policy_tls\nVirtualGatewayData,virtual_gateway_data\nVirtualGatewayFileAccessLog,virtual_gateway_file_access_log\nVirtualGatewayGrpcConnectionPool,virtual_gateway_grpc_connection_pool\nVirtualGatewayHealthCheckPolicy,virtual_gateway_health_check_policy\nVirtualGatewayHttp2ConnectionPool,virtual_gateway_http2_connection_pool\nVirtualGatewayHttpConnectionPool,virtual_gateway_http_connection_pool\nVirtualGatewayListener,virtual_gateway_listener\nVirtualGatewayListenerTls,virtual_gateway_listener_tls\nVirtualGatewayListenerTlsAcmCertificate,virtual_gateway_listener_tls_acm_certificate\nVirtualGatewayListenerTlsFileCertificate,virtual_gateway_listener_tls_file_certificate\nVirtualGatewayListenerTlsSdsCertificate,virtual_gateway_listener_tls_sds_certificate\nVirtualGatewayListenerTlsValidationContext,virtual_gateway_listener_tls_validation_context\nVirtualGatewayLogging,virtual_gateway_logging\nVirtualGatewayPortMapping,virtual_gateway_port_mapping\nVirtualGatewayRef,virtual_gateway_ref\nVirtualGatewaySpec,virtual_gateway_spec\nVirtualGatewayStatus,virtual_gateway_status\nVirtualGatewayTlsValidationContext,virtual_gateway_tls_validation_context\nVirtualGatewayTlsValidationContextAcmTrust,virtual_gateway_tls_validation_context_acm_trust\nVirtualGatewayTlsValidationContextFileTrust,virtual_gateway_tls_validation_context_file_trust\nVirtualGatewayTlsValidationContextSdsTrust,virtual_gateway_tls_validation_context_sds_trust\nVirtualGateways,virtual_gateways\nVirtualHost,virtual_host\nVirtualInterface,virtual_interface\nVirtualInterfaceTestHistory,virtual_interface_test_history\nVirtualInterfaces,virtual_interfaces\nVirtualMFADevice,virtual_mfa_device\nVirtualMFADeviceName,virtual_mfa_device_name\nVirtualMFADevices,virtual_mfa_devices\nVirtualMachine,virtual_machine\nVirtualMachineDetails,virtual_machine_details\nVirtualMachines,virtual_machines\nVirtualName,virtual_name\nVirtualNetworkId,virtual_network_id\nVirtualNodeData,virtual_node_data\nVirtualNodeGrpcConnectionPool,virtual_node_grpc_connection_pool\nVirtualNodeHttp2ConnectionPool,virtual_node_http2_connection_pool\nVirtualNodeHttpConnectionPool,virtual_node_http_connection_pool\nVirtualNodeRef,virtual_node_ref\nVirtualNodeServiceProvider,virtual_node_service_provider\nVirtualNodeSpec,virtual_node_spec\nVirtualNodeStatus,virtual_node_status\nVirtualNodeTcpConnectionPool,virtual_node_tcp_connection_pool\nVirtualObject,virtual_object\nVirtualRouterData,virtual_router_data\nVirtualRouterListener,virtual_router_listener\nVirtualRouterRef,virtual_router_ref\nVirtualRouterServiceProvider,virtual_router_service_provider\nVirtualRouterSpec,virtual_router_spec\nVirtualRouterStatus,virtual_router_status\nVirtualServiceBackend,virtual_service_backend\nVirtualServiceData,virtual_service_data\nVirtualServiceRef,virtual_service_ref\nVirtualServiceSpec,virtual_service_spec\nVirtualServiceStatus,virtual_service_status\nVirtualizationType,virtualization_type\nVirtualizationTypes,virtualization_types\nVisaPin,visa_pin\nVisaPinVerification,visa_pin_verification\nVisaPinVerificationValue,visa_pin_verification_value\nVisibility,visibility\nVisibilityConfig,visibility_config\nVisibilityState,visibility_state\nVisibilityTimeout,visibility_timeout\nVisibleRange,visible_range\nVisibleRangeOptions,visible_range_options\nVisibleToAllUsers,visible_to_all_users\nVisitorId,visitor_id\nVisual,visual\nVisualAxisSortOption,visual_axis_sort_option\nVisualCustomAction,visual_custom_action\nVisualCustomActionOperation,visual_custom_action_operation\nVisualId,visual_id\nVisualIds,visual_ids\nVisualLayoutOptions,visual_layout_options\nVisualMenuOption,visual_menu_option\nVisualPalette,visual_palette\nVisualPublishOptions,visual_publish_options\nVisualReference,visual_reference\nVisualReferenceInput,visual_reference_input\nVisualReferenceOutput,visual_reference_output\nVisualSubtitleLabelOptions,visual_subtitle_label_options\nVisualTitleLabelOptions,visual_title_label_options\nVisuals,visuals\nVlan,vlan\nVlanId,vlan_id\nVmServer,vm_server\nVmServerAddress,vm_server_address\nVmwareCategory,vmware_category\nVmwareTag,vmware_tag\nVmwareTagDescription,vmware_tag_description\nVmwareTagName,vmware_tag_name\nVmwareTags,vmware_tags\nVmwareToAwsTagMapping,vmware_to_aws_tag_mapping\nVmwareToAwsTagMappings,vmware_to_aws_tag_mappings\nVocabularies,vocabularies\nVocabulary,vocabulary\nVocabularyArn,vocabulary_arn\nVocabularyFileUri,vocabulary_file_uri\nVocabularyFilterFileUri,vocabulary_filter_file_uri\nVocabularyFilterInfo,vocabulary_filter_info\nVocabularyFilterMatch,vocabulary_filter_match\nVocabularyFilterMethod,vocabulary_filter_method\nVocabularyFilterName,vocabulary_filter_name\nVocabularyFilterNames,vocabulary_filter_names\nVocabularyFilters,vocabulary_filters\nVocabularyId,vocabulary_id\nVocabularyInfo,vocabulary_info\nVocabularyName,vocabulary_name\nVocabularyNames,vocabulary_names\nVocabularyState,vocabulary_state\nVocabularySummary,vocabulary_summary\nVocabularySummaryList,vocabulary_summary_list\nVodSource,vod_source\nVodSourceName,vod_source_name\nVoice,voice\nVoiceAnalyticsProcessorConfiguration,voice_analytics_processor_configuration\nVoiceChannelRequest,voice_channel_request\nVoiceChannelResponse,voice_channel_response\nVoiceConnector,voice_connector\nVoiceConnectorArn,voice_connector_arn\nVoiceConnectorGroup,voice_connector_group\nVoiceConnectorGroupArn,voice_connector_group_arn\nVoiceConnectorGroupId,voice_connector_group_id\nVoiceConnectorGroups,voice_connector_groups\nVoiceConnectorId,voice_connector_id\nVoiceConnectorItem,voice_connector_item\nVoiceConnectorItems,voice_connector_items\nVoiceConnectorRegions,voice_connector_regions\nVoiceConnectorSettings,voice_connector_settings\nVoiceConnectors,voice_connectors\nVoiceEnhancementSinkConfiguration,voice_enhancement_sink_configuration\nVoiceId,voice_id\nVoiceMessage,voice_message\nVoiceMessageContent,voice_message_content\nVoiceProfile,voice_profile\nVoiceProfileArn,voice_profile_arn\nVoiceProfileDomain,voice_profile_domain\nVoiceProfileDomainArn,voice_profile_domain_arn\nVoiceProfileDomainId,voice_profile_domain_id\nVoiceProfileDomainSummary,voice_profile_domain_summary\nVoiceProfileDomains,voice_profile_domains\nVoiceProfileId,voice_profile_id\nVoiceProfileSummary,voice_profile_summary\nVoiceProfiles,voice_profiles\nVoiceRecordingConfiguration,voice_recording_configuration\nVoiceRecordingTrack,voice_recording_track\nVoiceSettings,voice_settings\nVoiceSpoofingRisk,voice_spoofing_risk\nVoiceTemplate,voice_template\nVoiceTemplateRequest,voice_template_request\nVoiceTemplateResponse,voice_template_response\nVoiceToneAnalysisStatus,voice_tone_analysis_status\nVoiceToneAnalysisTask,voice_tone_analysis_task\nVoiceToneAnalysisTaskId,voice_tone_analysis_task_id\nVoiceToneAnalysisTaskStatus,voice_tone_analysis_task_status\nVoiceprintGenerationStatus,voiceprint_generation_status\nVoices,voices\nVoipDeviceToken,voip_device_token\nVolume,volume\nVolumeARN,volume_arn\nVolumeARNs,volume_arns\nVolumeAppendModeEnabled,volume_append_mode_enabled\nVolumeArn,volume_arn\nVolumeAttachment,volume_attachment\nVolumeAttachmentStatus,volume_attachment_status\nVolumeConfiguration,volume_configuration\nVolumeConfigurations,volume_configurations\nVolumeDetail,volume_detail\nVolumeDiskId,volume_disk_id\nVolumeEncryptionKey,volume_encryption_key\nVolumeFilter,volume_filter\nVolumeFrom,volume_from\nVolumeId,volume_id\nVolumeIds,volume_ids\nVolumeInfo,volume_info\nVolumeInfos,volume_infos\nVolumeKmsKeyId,volume_kms_key_id\nVolumeModification,volume_modification\nVolumeMount,volume_mount\nVolumeMounts,volume_mounts\nVolumeName,volume_name\nVolumeNotFound,volume_not_found\nVolumePath,volume_path\nVolumeProgress,volume_progress\nVolumeRecommendation,volume_recommendation\nVolumeRecommendationOption,volume_recommendation_option\nVolumeRecoveryPointInfo,volume_recovery_point_info\nVolumeRecoveryPointInfos,volume_recovery_point_infos\nVolumeRecoveryPointTime,volume_recovery_point_time\nVolumeScanStatus,volume_scan_status\nVolumeSize,volume_size\nVolumeSizeGB,volume_size_gb\nVolumeSizeInBytes,volume_size_in_bytes\nVolumeSizeInGB,volume_size_in_gb\nVolumeSpecification,volume_specification\nVolumeStatistics,volume_statistics\nVolumeStatus,volume_status\nVolumeStatusAction,volume_status_action\nVolumeStatusAttachmentStatus,volume_status_attachment_status\nVolumeStatusDetails,volume_status_details\nVolumeStatusEvent,volume_status_event\nVolumeStatusInfo,volume_status_info\nVolumeStatusItem,volume_status_item\nVolumeStatuses,volume_statuses\nVolumeThroughput,volume_throughput\nVolumeType,volume_type\nVolumeUsageByDatasourcePackage,volume_usage_by_datasource_package\nVolumeUsageInBytes,volume_usage_in_bytes\nVolumeUsageUpdateTime,volume_usage_update_time\nVolumeUsageUpdatedTime,volume_usage_updated_time\nVolumeUsedInBytes,volume_used_in_bytes\nVolumeiSCSIAttributes,volumei_scsi_attributes\nVolumes,volumes\nVolumesFrom,volumes_from\nVolumesModifications,volumes_modifications\nVolumesPerInstance,volumes_per_instance\nVorbisSettings,vorbis_settings\nVote,vote\nVoteOnProposalInput,vote_on_proposal_input\nVoteSummary,vote_summary\nVoterMemberId,voter_member_id\nVotingPolicy,voting_policy\nVp8Settings,vp8_settings\nVp9Settings,vp9_settings\nVpc,vpc\nVpcArn,vpc_arn\nVpcAttachment,vpc_attachment\nVpcAttachments,vpc_attachments\nVpcCidrBlockAssociation,vpc_cidr_block_association\nVpcCidrBlockState,vpc_cidr_block_state\nVpcClassicLink,vpc_classic_link\nVpcConfig,vpc_config\nVpcConfigInput,vpc_config_input\nVpcConfigOutput,vpc_config_output\nVpcConfigRequest,vpc_config_request\nVpcConfigResponse,vpc_config_response\nVpcConfigs,vpc_configs\nVpcConfiguration,vpc_configuration\nVpcConfigurationDescription,vpc_configuration_description\nVpcConfigurationDescriptions,vpc_configuration_descriptions\nVpcConfigurationId,vpc_configuration_id\nVpcConfigurationUpdate,vpc_configuration_update\nVpcConfigurationUpdates,vpc_configuration_updates\nVpcConfigurations,vpc_configurations\nVpcConnection,vpc_connection\nVpcConnectionArn,vpc_connection_arn\nVpcConnectionInfo,vpc_connection_info\nVpcConnectionInfoServerless,vpc_connection_info_serverless\nVpcConnectionProperties,vpc_connection_properties\nVpcConnections,vpc_connections\nVpcConnectivity,vpc_connectivity\nVpcConnectivityClientAuthentication,vpc_connectivity_client_authentication\nVpcConnectivityIam,vpc_connectivity_iam\nVpcConnectivitySasl,vpc_connectivity_sasl\nVpcConnectivityScram,vpc_connectivity_scram\nVpcConnectivityTls,vpc_connectivity_tls\nVpcConnector,vpc_connector\nVpcConnectorArn,vpc_connector_arn\nVpcConnectorName,vpc_connector_name\nVpcConnectorRevision,vpc_connector_revision\nVpcConnectors,vpc_connectors\nVpcDNSTarget,vpc_dns_target\nVpcDNSTargets,vpc_dns_targets\nVpcDescription,vpc_description\nVpcDestinationConfiguration,vpc_destination_configuration\nVpcDestinationProperties,vpc_destination_properties\nVpcDestinationSummary,vpc_destination_summary\nVpcEndpoint,vpc_endpoint\nVpcEndpointConnection,vpc_endpoint_connection\nVpcEndpointConnectionId,vpc_endpoint_connection_id\nVpcEndpointConnections,vpc_endpoint_connections\nVpcEndpointDetail,vpc_endpoint_detail\nVpcEndpointError,vpc_endpoint_error\nVpcEndpointErrorDetail,vpc_endpoint_error_detail\nVpcEndpointErrors,vpc_endpoint_errors\nVpcEndpointFilters,vpc_endpoint_filters\nVpcEndpointId,vpc_endpoint_id\nVpcEndpointIds,vpc_endpoint_ids\nVpcEndpointOwner,vpc_endpoint_owner\nVpcEndpointPolicySupported,vpc_endpoint_policy_supported\nVpcEndpointService,vpc_endpoint_service\nVpcEndpointServiceName,vpc_endpoint_service_name\nVpcEndpointState,vpc_endpoint_state\nVpcEndpointSummary,vpc_endpoint_summary\nVpcEndpointSummaryList,vpc_endpoint_summary_list\nVpcEndpointType,vpc_endpoint_type\nVpcEndpoints,vpc_endpoints\nVpcId,vpc_id\nVpcIds,vpc_ids\nVpcInfoCidrBlockSetDetails,vpc_info_cidr_block_set_details\nVpcInfoIpv6CidrBlockSetDetails,vpc_info_ipv6_cidr_block_set_details\nVpcInfoPeeringOptionsDetails,vpc_info_peering_options_details\nVpcInformation,vpc_information\nVpcIngressConnection,vpc_ingress_connection\nVpcIngressConnectionArn,vpc_ingress_connection_arn\nVpcIngressConnectionName,vpc_ingress_connection_name\nVpcIngressConnectionSummary,vpc_ingress_connection_summary\nVpcIngressConnectionSummaryList,vpc_ingress_connection_summary_list\nVpcInterface,vpc_interface\nVpcInterfaceAttachment,vpc_interface_attachment\nVpcInterfaceName,vpc_interface_name\nVpcInterfaceRequest,vpc_interface_request\nVpcInterfaces,vpc_interfaces\nVpcIpv6CidrBlockAssociation,vpc_ipv6_cidr_block_association\nVpcLink,vpc_link\nVpcLinkId,vpc_link_id\nVpcLinkStatus,vpc_link_status\nVpcLinkStatusMessage,vpc_link_status_message\nVpcLinkVersion,vpc_link_version\nVpcLinks,vpc_links\nVpcName,vpc_name\nVpcOnly,vpc_only\nVpcOptions,vpc_options\nVpcOutputSettings,vpc_output_settings\nVpcOutputSettingsDescription,vpc_output_settings_description\nVpcOwnerId,vpc_owner_id\nVpcPeeringAuthorization,vpc_peering_authorization\nVpcPeeringAuthorizations,vpc_peering_authorizations\nVpcPeeringConnection,vpc_peering_connection\nVpcPeeringConnectionId,vpc_peering_connection_id\nVpcPeeringConnectionIds,vpc_peering_connection_ids\nVpcPeeringConnectionOptionsDescription,vpc_peering_connection_options_description\nVpcPeeringConnectionStateReason,vpc_peering_connection_state_reason\nVpcPeeringConnectionStatus,vpc_peering_connection_status\nVpcPeeringConnectionVpcInfo,vpc_peering_connection_vpc_info\nVpcPeeringConnections,vpc_peering_connections\nVpcSecurityGroupId,vpc_security_group_id\nVpcSecurityGroupIds,vpc_security_group_ids\nVpcSecurityGroupMembership,vpc_security_group_membership\nVpcSecurityGroupMemberships,vpc_security_group_memberships\nVpcSecurityGroups,vpc_security_groups\nVpcSettings,vpc_settings\nVpcSubnetIds,vpc_subnet_ids\nVpcSubnets,vpc_subnets\nVpceId,vpce_id\nVpcs,vpcs\nVpnConnection,vpn_connection\nVpnConnectionArn,vpn_connection_arn\nVpnConnectionDeviceSampleConfiguration,vpn_connection_device_sample_configuration\nVpnConnectionDeviceType,vpn_connection_device_type\nVpnConnectionDeviceTypeId,vpn_connection_device_type_id\nVpnConnectionDeviceTypes,vpn_connection_device_types\nVpnConnectionId,vpn_connection_id\nVpnConnectionIds,vpn_connection_ids\nVpnConnectionOptions,vpn_connection_options\nVpnConnectionOptionsSpecification,vpn_connection_options_specification\nVpnConnections,vpn_connections\nVpnEcmpSupport,vpn_ecmp_support\nVpnGateway,vpn_gateway\nVpnGatewayId,vpn_gateway_id\nVpnGatewayIds,vpn_gateway_ids\nVpnGateways,vpn_gateways\nVpnPort,vpn_port\nVpnProtocol,vpn_protocol\nVpnStaticRoute,vpn_static_route\nVpnTunnelLogOptions,vpn_tunnel_log_options\nVpnTunnelLogOptionsSpecification,vpn_tunnel_log_options_specification\nVpnTunnelOptionsSpecification,vpn_tunnel_options_specification\nVpnTunnelOutsideIpAddress,vpn_tunnel_outside_ip_address\nVsamAttributes,vsam_attributes\nVsamDetailAttributes,vsam_detail_attributes\nVulnerabilities,vulnerabilities\nVulnerability,vulnerability\nVulnerabilityCodeVulnerabilities,vulnerability_code_vulnerabilities\nVulnerabilityIdAggregation,vulnerability_id_aggregation\nVulnerabilityVendor,vulnerability_vendor\nVulnerablePackage,vulnerable_package\nVulnerablePackages,vulnerable_packages\nWAFAssociatedItemException,waf_associated_item_exception\nWAFBadRequestException,waf_bad_request_exception\nWAFConfigurationWarningException,waf_configuration_warning_exception\nWAFDisallowedNameException,waf_disallowed_name_exception\nWAFDuplicateItemException,waf_duplicate_item_exception\nWAFEntityMigrationException,waf_entity_migration_exception\nWAFExpiredManagedRuleGroupVersionException,waf_expired_managed_rule_group_version_exception\nWAFInternalErrorException,waf_internal_error_exception\nWAFInvalidOperationException,waf_invalid_operation_exception\nWAFInvalidParameterException,waf_invalid_parameter_exception\nWAFInvalidPermissionPolicyException,waf_invalid_permission_policy_exception\nWAFInvalidRegexPatternException,waf_invalid_regex_pattern_exception\nWAFInvalidResourceException,waf_invalid_resource_exception\nWAFLimitsExceededException,waf_limits_exceeded_exception\nWAFLogDestinationPermissionIssueException,waf_log_destination_permission_issue_exception\nWAFNonEmptyEntityException,waf_non_empty_entity_exception\nWAFNonexistentContainerException,waf_nonexistent_container_exception\nWAFNonexistentItemException,waf_nonexistent_item_exception\nWAFOptimisticLockException,waf_optimistic_lock_exception\nWAFReferencedItemException,waf_referenced_item_exception\nWAFServiceLinkedRoleErrorException,waf_service_linked_role_error_exception\nWAFStaleDataException,waf_stale_data_exception\nWAFSubscriptionNotFoundException,waf_subscription_not_found_exception\nWAFTagOperationException,waf_tag_operation_exception\nWAFTagOperationInternalErrorException,waf_tag_operation_internal_error_exception\nWAFUnavailableEntityException,waf_unavailable_entity_exception\nWAFUnsupportedAggregateKeyTypeException,waf_unsupported_aggregate_key_type_exception\nWAPE,wape\nWafAction,waf_action\nWafExcludedRule,waf_excluded_rule\nWafOverrideAction,waf_override_action\nWafWebAclArn,waf_web_acl_arn\nWait,wait\nWaitActivity,wait_activity\nWaitAndContinueSpecification,wait_and_continue_specification\nWaitFor,wait_for\nWaitForQuietTime,wait_for_quiet_time\nWaitIntervalInSeconds,wait_interval_in_seconds\nWaitMinutes,wait_minutes\nWaitPeriodMs,wait_period_ms\nWaitTime,wait_time\nWaitTimeSeconds,wait_time_seconds\nWaitUntil,wait_until\nWaitingActions,waiting_actions\nWaitingOnIngestion,waiting_on_ingestion\nWakeUp,wake_up\nWakeWord,wake_word\nWarehouse,warehouse\nWarmCount,warm_count\nWarmEnabled,warm_enabled\nWarmNodeCount,warm_node_count\nWarmPoolConfiguration,warm_pool_configuration\nWarmPoolProgress,warm_pool_progress\nWarmPoolSize,warm_pool_size\nWarmPoolStatus,warm_pool_status\nWarmPoolStatusEquals,warm_pool_status_equals\nWarmStartConfig,warm_start_config\nWarmStartType,warm_start_type\nWarmType,warm_type\nWarmupPercentage,warmup_percentage\nWarmupStatus,warmup_status\nWarnCode,warn_code\nWarnMessage,warn_message\nWarning,warning\nWarningForeground,warning_foreground\nWarningGroup,warning_group\nWarningMessage,warning_message\nWarnings,warnings\nWarningsListItem,warnings_list_item\nWatchlist,watchlist\nWatchlistDetails,watchlist_details\nWatchlistId,watchlist_id\nWatchlistIds,watchlist_ids\nWatchlistSummaries,watchlist_summaries\nWatchlistSummary,watchlist_summary\nWaterfallChartAggregatedFieldWells,waterfall_chart_aggregated_field_wells\nWaterfallChartConfiguration,waterfall_chart_configuration\nWaterfallChartFieldWells,waterfall_chart_field_wells\nWaterfallChartOptions,waterfall_chart_options\nWaterfallChartSortConfiguration,waterfall_chart_sort_configuration\nWaterfallVisual,waterfall_visual\nWatermarks,watermarks\nWavSettings,wav_settings\nWave,wave\nWaveAggregatedStatus,wave_aggregated_status\nWaypointPositions,waypoint_positions\nWcdma,wcdma\nWcdmaLocalId,wcdma_local_id\nWcdmaNmr,wcdma_nmr\nWcdmaNmrObj,wcdma_nmr_obj\nWcdmaObj,wcdma_obj\nWeb,web\nWebACL,web_acl\nWebACLArn,web_acl_arn\nWebACLId,web_acl_id\nWebACLLockToken,web_acl_lock_token\nWebACLName,web_acl_name\nWebACLSummary,web_acl_summary\nWebACLUpdate,web_acl_update\nWebACLs,web_acls\nWebAclArn,web_acl_arn\nWebAclId,web_acl_id\nWebClientId,web_client_id\nWebCollectorGrantedRoleBasedAccess,web_collector_granted_role_based_access\nWebCollectorS3Access,web_collector_s3_access\nWebCrawlerConfiguration,web_crawler_configuration\nWebCrawlerMode,web_crawler_mode\nWebDeliveryAllowedFlag,web_delivery_allowed_flag\nWebIdentityToken,web_identity_token\nWebLinkFieldMappings,web_link_field_mappings\nWebServerHostname,web_server_hostname\nWebSocketEndpoint,web_socket_endpoint\nWebToken,web_token\nWebUrl,web_url\nWebhook,webhook\nWebhookAuthConfiguration,webhook_auth_configuration\nWebhookDefinition,webhook_definition\nWebhookFilter,webhook_filter\nWebhookFilterRule,webhook_filter_rule\nWebserverAccessMode,webserver_access_mode\nWebserverLogs,webserver_logs\nWebserverUrl,webserver_url\nWebsiteAuthorizationProviderSummary,website_authorization_provider_summary\nWebsiteAuthorizationProviders,website_authorization_providers\nWebsiteCaId,website_ca_id\nWebsiteCaSummary,website_ca_summary\nWebsiteCertificateAuthorities,website_certificate_authorities\nWebsiteConfiguration,website_configuration\nWebsiteRedirectLocation,website_redirect_location\nWebsiteURL,website_url\nWebsiteUrl,website_url\nWebsocket,websocket\nWebvttDestinationSettings,webvtt_destination_settings\nWebvttHlsSourceSettings,webvtt_hls_source_settings\nWednesday,wednesday\nWeeklyAutoScalingSchedule,weekly_auto_scaling_schedule\nWeeklyMaintenanceStartTime,weekly_maintenance_start_time\nWeeklyMaintenanceWindowStart,weekly_maintenance_window_start\nWeeklySchedule,weekly_schedule\nWeeklySetting,weekly_setting\nWeeklySettings,weekly_settings\nWeeklyStartTime,weekly_start_time\nWeight,weight\nWeightLbs,weight_lbs\nWeightSort,weight_sort\nWeightedCapacity,weighted_capacity\nWeightedQuantileLoss,weighted_quantile_loss\nWeightedQuantileLosses,weighted_quantile_losses\nWeightedTarget,weighted_target\nWeightedTargetGroup,weighted_target_group\nWelcomeIntent,welcome_intent\nWest,west\nWhatIfAnalyses,what_if_analyses\nWhatIfAnalysisArn,what_if_analysis_arn\nWhatIfAnalysisName,what_if_analysis_name\nWhatIfAnalysisSummary,what_if_analysis_summary\nWhatIfForecastArn,what_if_forecast_arn\nWhatIfForecastArns,what_if_forecast_arns\nWhatIfForecastExportArn,what_if_forecast_export_arn\nWhatIfForecastExportName,what_if_forecast_export_name\nWhatIfForecastExportSummary,what_if_forecast_export_summary\nWhatIfForecastExports,what_if_forecast_exports\nWhatIfForecastName,what_if_forecast_name\nWhatIfForecastSummary,what_if_forecast_summary\nWhatIfForecasts,what_if_forecasts\nWhatIfPointScenario,what_if_point_scenario\nWhatIfRangeScenario,what_if_range_scenario\nWhitePointX,white_point_x\nWhitePointY,white_point_y\nWhitelist,whitelist\nWhitelistCidr,whitelist_cidr\nWhitelistRules,whitelist_rules\nWhitelistedNames,whitelisted_names\nWhoIsServer,who_is_server\nWiFiAccessPoint,wi_fi_access_point\nWiFiAccessPoints,wi_fi_access_points\nWidth,width\nWidthInPx,width_in_px\nWidthPixels,width_pixels\nWikiFieldMappings,wiki_field_mappings\nWindowEndDatetime,window_end_datetime\nWindowExecutionId,window_execution_id\nWindowExecutionTaskIdentities,window_execution_task_identities\nWindowExecutionTaskInvocationIdentities,window_execution_task_invocation_identities\nWindowExecutions,window_executions\nWindowId,window_id\nWindowIdentities,window_identities\nWindowOptions,window_options\nWindowSize,window_size\nWindowStartDatetime,window_start_datetime\nWindowStartTime,window_start_time\nWindowSummary,window_summary\nWindowTargetId,window_target_id\nWindowTaskId,window_task_id\nWindowsAuditLogConfiguration,windows_audit_log_configuration\nWindowsAuditLogCreateConfiguration,windows_audit_log_create_configuration\nWindowsConfiguration,windows_configuration\nWindowsFileSystemConfiguration,windows_file_system_configuration\nWindowsResponse,windows_response\nWirelessConnection,wireless_connection\nWirelessDeviceEventLogOption,wireless_device_event_log_option\nWirelessDeviceEventTopic,wireless_device_event_topic\nWirelessDeviceFrameInfo,wireless_device_frame_info\nWirelessDeviceId,wireless_device_id\nWirelessDeviceIdEventTopic,wireless_device_id_event_topic\nWirelessDeviceImportTask,wireless_device_import_task\nWirelessDeviceImportTaskList,wireless_device_import_task_list\nWirelessDeviceList,wireless_device_list\nWirelessDeviceLogOption,wireless_device_log_option\nWirelessDeviceLogOptions,wireless_device_log_options\nWirelessDeviceStatistics,wireless_device_statistics\nWirelessDeviceType,wireless_device_type\nWirelessDevices,wireless_devices\nWirelessDevicesToAdd,wireless_devices_to_add\nWirelessDevicesToRemove,wireless_devices_to_remove\nWirelessGatewayEventLogOption,wireless_gateway_event_log_option\nWirelessGatewayEventTopic,wireless_gateway_event_topic\nWirelessGatewayId,wireless_gateway_id\nWirelessGatewayIdEventTopic,wireless_gateway_id_event_topic\nWirelessGatewayList,wireless_gateway_list\nWirelessGatewayLogOption,wireless_gateway_log_option\nWirelessGatewayLogOptions,wireless_gateway_log_options\nWirelessGatewayStatistics,wireless_gateway_statistics\nWirelessGatewayTaskDefinitionId,wireless_gateway_task_definition_id\nWirelessGateways,wireless_gateways\nWirelessGatewaysToAdd,wireless_gateways_to_add\nWirelessGatewaysToRemove,wireless_gateways_to_remove\nWirelessMetadata,wireless_metadata\nWisdomInfo,wisdom_info\nWithDecryption,with_decryption\nWithEvent,with_event\nWithFederation,with_federation\nWithHeader,with_header\nWithdrawByoipCidrRequest,withdraw_byoip_cidr_request\nWithdrawByoipCidrResponse,withdraw_byoip_cidr_response\nWithdrawByoipCidrResult,withdraw_byoip_cidr_result\nWithoutSettings,without_settings\nWordCasing,word_casing\nWordCloudAggregatedFieldWells,word_cloud_aggregated_field_wells\nWordCloudChartConfiguration,word_cloud_chart_configuration\nWordCloudFieldWells,word_cloud_field_wells\nWordCloudOptions,word_cloud_options\nWordCloudSortConfiguration,word_cloud_sort_configuration\nWordCloudVisual,word_cloud_visual\nWordFilter,word_filter\nWordOrientation,word_orientation\nWordPadding,word_padding\nWordScaling,word_scaling\nWords,words\nWorkDocsConfiguration,work_docs_configuration\nWorkGroup,work_group\nWorkGroupConfiguration,work_group_configuration\nWorkGroupConfigurationUpdates,work_group_configuration_updates\nWorkGroupName,work_group_name\nWorkGroupNames,work_group_names\nWorkGroupSummary,work_group_summary\nWorkGroups,work_groups\nWorkLogFieldMappings,work_log_field_mappings\nWorkRequesterAccountId,work_requester_account_id\nWorkUnitId,work_unit_id\nWorkUnitIdMax,work_unit_id_max\nWorkUnitIdMin,work_unit_id_min\nWorkUnitRange,work_unit_range\nWorkUnitRanges,work_unit_ranges\nWorkUnitToken,work_unit_token\nWorkUnitsExecutedCount,work_units_executed_count\nWorkUnitsGeneratedCount,work_units_generated_count\nWorkUnitsNotReadyYetException,work_units_not_ready_yet_exception\nWorker,worker\nWorkerBlock,worker_block\nWorkerBlocks,worker_blocks\nWorkerConfiguration,worker_configuration\nWorkerConfigurationDescription,worker_configuration_description\nWorkerConfigurationRevisionDescription,worker_configuration_revision_description\nWorkerConfigurationRevisionSummary,worker_configuration_revision_summary\nWorkerConfigurationSummary,worker_configuration_summary\nWorkerFleet,worker_fleet\nWorkerId,worker_id\nWorkerIds,worker_ids\nWorkerLogDelivery,worker_log_delivery\nWorkerLogDeliveryDescription,worker_log_delivery_description\nWorkerLogs,worker_logs\nWorkerResourceConfig,worker_resource_config\nWorkerType,worker_type\nWorkerTypeSpecification,worker_type_specification\nWorkerTypeSpecificationInput,worker_type_specification_input\nWorkflow,workflow\nWorkflowAttributes,workflow_attributes\nWorkflowDetail,workflow_detail\nWorkflowDetails,workflow_details\nWorkflowExecution,workflow_execution\nWorkflowExecutionAlreadyStartedFault,workflow_execution_already_started_fault\nWorkflowExecutionCancelRequestedEventAttributes,workflow_execution_cancel_requested_event_attributes\nWorkflowExecutionCanceledEventAttributes,workflow_execution_canceled_event_attributes\nWorkflowExecutionCompletedEventAttributes,workflow_execution_completed_event_attributes\nWorkflowExecutionConfiguration,workflow_execution_configuration\nWorkflowExecutionContinuedAsNewEventAttributes,workflow_execution_continued_as_new_event_attributes\nWorkflowExecutionCount,workflow_execution_count\nWorkflowExecutionDetail,workflow_execution_detail\nWorkflowExecutionFailedEventAttributes,workflow_execution_failed_event_attributes\nWorkflowExecutionFilter,workflow_execution_filter\nWorkflowExecutionInfo,workflow_execution_info\nWorkflowExecutionInfos,workflow_execution_infos\nWorkflowExecutionMetadata,workflow_execution_metadata\nWorkflowExecutionOpenCounts,workflow_execution_open_counts\nWorkflowExecutionSignaledEventAttributes,workflow_execution_signaled_event_attributes\nWorkflowExecutionStartedEventAttributes,workflow_execution_started_event_attributes\nWorkflowExecutionTerminatedEventAttributes,workflow_execution_terminated_event_attributes\nWorkflowExecutionTimedOutEventAttributes,workflow_execution_timed_out_event_attributes\nWorkflowGraph,workflow_graph\nWorkflowId,workflow_id\nWorkflowListItem,workflow_list_item\nWorkflowMetrics,workflow_metrics\nWorkflowName,workflow_name\nWorkflowParameter,workflow_parameter\nWorkflowRun,workflow_run\nWorkflowRunId,workflow_run_id\nWorkflowRunProperties,workflow_run_properties\nWorkflowRunStatistics,workflow_run_statistics\nWorkflowState,workflow_state\nWorkflowStatus,workflow_status\nWorkflowStep,workflow_step\nWorkflowStepAutomationConfiguration,workflow_step_automation_configuration\nWorkflowStepGroupSummary,workflow_step_group_summary\nWorkflowStepItem,workflow_step_item\nWorkflowStepMetadata,workflow_step_metadata\nWorkflowStepOutput,workflow_step_output\nWorkflowStepSummary,workflow_step_summary\nWorkflowToken,workflow_token\nWorkflowType,workflow_type\nWorkflowTypeConfiguration,workflow_type_configuration\nWorkflowTypeDetail,workflow_type_detail\nWorkflowTypeFilter,workflow_type_filter\nWorkflowTypeInfo,workflow_type_info\nWorkflowTypeInfos,workflow_type_infos\nWorkflowUpdate,workflow_update\nWorkflows,workflows\nWorkforce,workforce\nWorkforceArn,workforce_arn\nWorkforceName,workforce_name\nWorkforceVpcConfig,workforce_vpc_config\nWorkforceVpcConfigRequest,workforce_vpc_config_request\nWorkforceVpcConfigResponse,workforce_vpc_config_response\nWorkforces,workforces\nWorkgroup,workgroup\nWorkgroupName,workgroup_name\nWorkingDirectory,working_directory\nWorkingStorageAllocatedInBytes,working_storage_allocated_in_bytes\nWorkingStorageUsedInBytes,working_storage_used_in_bytes\nWorkload,workload\nWorkloadArn,workload_arn\nWorkloadConfiguration,workload_configuration\nWorkloadDiscoveryConfig,workload_discovery_config\nWorkloadId,workload_id\nWorkloadList,workload_list\nWorkloadName,workload_name\nWorkloadNamePrefix,workload_name_prefix\nWorkloadProfile,workload_profile\nWorkloadRemarks,workload_remarks\nWorkloadResourceDefinition,workload_resource_definition\nWorkloadShare,workload_share\nWorkloadShareSummaries,workload_share_summaries\nWorkloadShareSummary,workload_share_summary\nWorkloadSummaries,workload_summaries\nWorkloadSummary,workload_summary\nWorkloadType,workload_type\nWorkmailAction,workmail_action\nWorkspace,workspace\nWorkspaceAccessProperties,workspace_access_properties\nWorkspaceBundle,workspace_bundle\nWorkspaceConnectionStatus,workspace_connection_status\nWorkspaceCreationProperties,workspace_creation_properties\nWorkspaceDescription,workspace_description\nWorkspaceDirectory,workspace_directory\nWorkspaceId,workspace_id\nWorkspaceIds,workspace_ids\nWorkspaceImage,workspace_image\nWorkspaceProperties,workspace_properties\nWorkspaceRequest,workspace_request\nWorkspaceSecurityGroupId,workspace_security_group_id\nWorkspaceSettings,workspace_settings\nWorkspaceState,workspace_state\nWorkspaceStatus,workspace_status\nWorkspaceSummary,workspace_summary\nWorkspaces,workspaces\nWorkspacesConnectionStatus,workspaces_connection_status\nWorkspacesDefaultRoleNotFoundException,workspaces_default_role_not_found_exception\nWorkspacesIpGroup,workspaces_ip_group\nWorkteam,workteam\nWorkteamArn,workteam_arn\nWorkteamName,workteam_name\nWorkteams,workteams\nWorldConfig,world_config\nWorldCount,world_count\nWorldExportJobSummary,world_export_job_summary\nWorldFailure,world_failure\nWorldGenerationJobSummary,world_generation_job_summary\nWorldSummary,world_summary\nWorm,worm\nWrap,wrap\nWrappedKey,wrapped_key\nWrappedKeyBlock,wrapped_key_block\nWrappedKeyMaterialFormat,wrapped_key_material_format\nWrappingAlgorithm,wrapping_algorithm\nWrappingKeyAlgorithm,wrapping_key_algorithm\nWrappingKeyArn,wrapping_key_arn\nWrappingKeyCertificate,wrapping_key_certificate\nWrappingKeyCertificateChain,wrapping_key_certificate_chain\nWrappingKeyIdentifier,wrapping_key_identifier\nWrappingKeySpec,wrapping_key_spec\nWrite,write\nWriteAccessPrincipalArns,write_access_principal_arns\nWriteApplicationSettingsRequest,write_application_settings_request\nWriteAttributes,write_attributes\nWriteBufferSize,write_buffer_size\nWriteCampaignRequest,write_campaign_request\nWriteCapacityUnits,write_capacity_units\nWriteDashManifest,write_dash_manifest\nWriteEventStream,write_event_stream\nWriteGetObjectResponseRequest,write_get_object_response_request\nWriteHeader,write_header\nWriteHlsManifest,write_hls_manifest\nWriteIOs,write_ios\nWriteJourneyRequest,write_journey_request\nWriteManifest,write_manifest\nWriteMp4PackagingType,write_mp4_packaging_type\nWriteOperation,write_operation\nWriteOperations,write_operations\nWriteRecordsRequest,write_records_request\nWriteRecordsResponse,write_records_response\nWriteRequest,write_request\nWriteSegmentRequest,write_segment_request\nWriteSegmentTimelineInRepresentation,write_segment_timeline_in_representation\nWriteTreatmentResource,write_treatment_resource\nWriterVersion,writer_version\nX,x\nXAttributeName,x_attribute_name\nXAxis,x_axis\nXAxisDisplayOptions,x_axis_display_options\nXAxisLabelOptions,x_axis_label_options\nXAxisLocation,x_axis_location\nXMLClassifier,xml_classifier\nXPosition,x_position\nXRayErrorPercent,x_ray_error_percent\nXRayFaultPercent,x_ray_fault_percent\nXRayNodeName,x_ray_node_name\nXRayNodeType,x_ray_node_type\nXRayRequestAverageLatency,x_ray_request_average_latency\nXRayRequestCount,x_ray_request_count\nXRayThrottlePercent,x_ray_throttle_percent\nXSSProtection,xss_protection\nXavc4kIntraCbgProfileSettings,xavc4k_intra_cbg_profile_settings\nXavc4kIntraVbrProfileSettings,xavc4k_intra_vbr_profile_settings\nXavc4kProfileSettings,xavc4k_profile_settings\nXavcClass,xavc_class\nXavcHdIntraCbgProfileSettings,xavc_hd_intra_cbg_profile_settings\nXavcHdProfileSettings,xavc_hd_profile_settings\nXavcProfileSettings,xavc_profile_settings\nXavcSettings,xavc_settings\nXksKeyAlreadyInUseException,xks_key_already_in_use_exception\nXksKeyConfiguration,xks_key_configuration\nXksKeyConfigurationType,xks_key_configuration_type\nXksKeyId,xks_key_id\nXksKeyInvalidConfigurationException,xks_key_invalid_configuration_exception\nXksKeyNotFoundException,xks_key_not_found_exception\nXksProxyAuthenticationCredential,xks_proxy_authentication_credential\nXksProxyAuthenticationCredentialType,xks_proxy_authentication_credential_type\nXksProxyConfiguration,xks_proxy_configuration\nXksProxyConfigurationType,xks_proxy_configuration_type\nXksProxyConnectivity,xks_proxy_connectivity\nXksProxyIncorrectAuthenticationCredentialException,xks_proxy_incorrect_authentication_credential_exception\nXksProxyInvalidConfigurationException,xks_proxy_invalid_configuration_exception\nXksProxyInvalidResponseException,xks_proxy_invalid_response_exception\nXksProxyUriEndpoint,xks_proxy_uri_endpoint\nXksProxyUriEndpointInUseException,xks_proxy_uri_endpoint_in_use_exception\nXksProxyUriInUseException,xks_proxy_uri_in_use_exception\nXksProxyUriPath,xks_proxy_uri_path\nXksProxyUriUnreachableException,xks_proxy_uri_unreachable_exception\nXksProxyVpcEndpointServiceInUseException,xks_proxy_vpc_endpoint_service_in_use_exception\nXksProxyVpcEndpointServiceInvalidConfigurationException,xks_proxy_vpc_endpoint_service_invalid_configuration_exception\nXksProxyVpcEndpointServiceName,xks_proxy_vpc_endpoint_service_name\nXksProxyVpcEndpointServiceNotFoundException,xks_proxy_vpc_endpoint_service_not_found_exception\nXrayEnabled,xray_enabled\nXssMatchSet,xss_match_set\nXssMatchSetId,xss_match_set_id\nXssMatchSetSummary,xss_match_set_summary\nXssMatchSetUpdate,xss_match_set_update\nXssMatchSets,xss_match_sets\nXssMatchStatement,xss_match_statement\nXssMatchTuple,xss_match_tuple\nXssMatchTuples,xss_match_tuples\nY,y\nYAttributeName,y_attribute_name\nYAxis,y_axis\nYAxisDisplayOptions,y_axis_display_options\nYAxisLabelOptions,y_axis_label_options\nYAxisLocation,y_axis_location\nYPosition,y_position\nYarnEndpointAddress,yarn_endpoint_address\nYaw,yaw\nYears,years\nYesVoteCount,yes_vote_count\nZ,z\nZendesk,zendesk\nZendeskConnectorProfileCredentials,zendesk_connector_profile_credentials\nZendeskConnectorProfileProperties,zendesk_connector_profile_properties\nZendeskDestinationProperties,zendesk_destination_properties\nZendeskMetadata,zendesk_metadata\nZendeskSourceProperties,zendesk_source_properties\nZeppelinApplicationConfiguration,zeppelin_application_configuration\nZeppelinApplicationConfigurationDescription,zeppelin_application_configuration_description\nZeppelinApplicationConfigurationUpdate,zeppelin_application_configuration_update\nZeppelinMonitoringConfiguration,zeppelin_monitoring_configuration\nZeppelinMonitoringConfigurationDescription,zeppelin_monitoring_configuration_description\nZeppelinMonitoringConfigurationUpdate,zeppelin_monitoring_configuration_update\nZeppelinRemoteSparkInterpreterPort,zeppelin_remote_spark_interpreter_port\nZipCode,zip_code\nZipFile,zip_file\nZipFileContent,zip_file_content\nZipFileContentUpdate,zip_file_content_update\nZonalShift,zonal_shift\nZonalShiftInResource,zonal_shift_in_resource\nZonalShiftSummary,zonal_shift_summary\nZonalStatisticsConfigInput,zonal_statistics_config_input\nZone,zone\nZoneAwarenessConfig,zone_awareness_config\nZoneAwarenessEnabled,zone_awareness_enabled\nZoneId,zone_id\nZoneIdentity,zone_identity\nZoneIds,zone_ids\nZoneName,zone_name\nZoneNames,zone_names\nZoneS3Path,zone_s3_path\nZoneS3PathKmsKeyId,zone_s3_path_kms_key_id\nZoneStatus,zone_status\nZoneType,zone_type\nZookeeperConnectString,zookeeper_connect_string\nZookeeperConnectStringTls,zookeeper_connect_string_tls\nZookeeperId,zookeeper_id\nZookeeperNodeInfo,zookeeper_node_info\nZookeeperVersion,zookeeper_version\nabandon,abandon\nabilities,abilities\nableToUpdateBundle,able_to_update_bundle\nabortConfig,abort_config\nabortCriteriaList,abort_criteria_list\nabortStatement,abort_statement\naborted,aborted\naboutText,about_text\nabsolutePath,absolute_path\nacceleratorHealth,accelerator_health\nacceleratorId,accelerator_id\nacceleratorIds,accelerator_ids\nacceleratorSet,accelerator_set\nacceleratorType,accelerator_type\nacceleratorTypeName,accelerator_type_name\nacceleratorTypeOfferings,accelerator_type_offerings\nacceleratorTypes,accelerator_types\naccelerators,accelerators\naccept,accept\nacceptDate,accept_date\nacceptRanges,accept_ranges\nacceptedAt,accepted_at\nacceptedBy,accepted_by\nacceptedFileTypes,accepted_file_types\nacceptedMediaTypes,accepted_media_types\nacceptedQueryCount,accepted_query_count\naccepteeId,acceptee_id\naccepts,accepts\naccess,access\naccessControlList,access_control_list\naccessDetails,access_details\naccessDirection,access_direction\naccessFrom,access_from\naccessKey,access_key\naccessKeyId,access_key_id\naccessKeys,access_keys\naccessLevel,access_level\naccessLog,access_log\naccessLogConfig,access_log_config\naccessLogSettings,access_log_settings\naccessLogSubscriptionIdentifier,access_log_subscription_identifier\naccessPoint,access_point\naccessPointAccount,access_point_account\naccessPointArn,access_point_arn\naccessPointId,access_point_id\naccessPointPolicy,access_point_policy\naccessPoints,access_points\naccessPolicy,access_policy\naccessPolicyArn,access_policy_arn\naccessPolicyCreationDate,access_policy_creation_date\naccessPolicyDetail,access_policy_detail\naccessPolicyId,access_policy_id\naccessPolicyIdentity,access_policy_identity\naccessPolicyLastUpdateDate,access_policy_last_update_date\naccessPolicyPermission,access_policy_permission\naccessPolicyResource,access_policy_resource\naccessPolicySummaries,access_policy_summaries\naccessPreview,access_preview\naccessPreviewId,access_preview_id\naccessPreviews,access_previews\naccessRole,access_role\naccessRules,access_rules\naccessToken,access_token\naccessTokenId,access_token_id\naccessType,access_type\naccessTypes,access_types\naccount,account\naccountAccessType,account_access_type\naccountAggregation,account_aggregation\naccountAlias,account_alias\naccountEnrollmentStatuses,account_enrollment_statuses\naccountID,account_id\naccountId,account_id\naccountIdentifiers,account_identifiers\naccountIds,account_ids\naccountLevelBpaSync,account_level_bpa_sync\naccountLevelPermissions,account_level_permissions\naccountList,account_list\naccountName,account_name\naccountPolicies,account_policies\naccountPolicy,account_policy\naccountSettings,account_settings\naccountSettingsDetail,account_settings_detail\naccountStatus,account_status\naccountType,account_type\naccounts,accounts\naccountsCleanup,accounts_cleanup\naccountsWithProvisionedRestoreAccess,accounts_with_provisioned_restore_access\naccountsWithRestoreAccess,accounts_with_restore_access\nachievableRpoInSecs,achievable_rpo_in_secs\nachievableRtoInSecs,achievable_rto_in_secs\nacknowledgeActionConfiguration,acknowledge_action_configuration\nacknowledgeActionRequests,acknowledge_action_requests\nacknowledgeFlow,acknowledge_flow\nacknowledgment,acknowledgment\nacknowledgmentStatus,acknowledgment_status\naction,action\nactionArn,action_arn\nactionCode,action_code\nactionConfiguration,action_configuration\nactionConfigurationProperties,action_configuration_properties\nactionExecutionDetails,action_execution_details\nactionExecutionId,action_execution_id\nactionGroup,action_group\nactionID,action_id\nactionIDs,action_ids\nactionId,action_id\nactionIdentifiers,action_identifiers\nactionIds,action_ids\nactionName,action_name\nactionOnTimeout,action_on_timeout\nactionOwnerFilter,action_owner_filter\nactionParams,action_params\nactionPlanInstructions,action_plan_instructions\nactionPlanTitle,action_plan_title\nactionRevision,action_revision\nactionStates,action_states\nactionStatus,action_status\nactionTaken,action_taken\nactionType,action_type\nactionTypeId,action_type_id\nactionTypes,action_types\nactionVersion,action_version\nactions,actions\nactionsDefinition,actions_definition\nactionsExecuted,actions_executed\nactionsExecutions,actions_executions\nactionsFailed,actions_failed\nactionsSkipped,actions_skipped\nactivateCaseSensitiveIdentifier,activate_case_sensitive_identifier\nactivateDeepInspection,activate_deep_inspection\nactivationCode,activation_code\nactivationExpiry,activation_expiry\nactivationId,activation_id\nactivationJobs,activation_jobs\nactive,active\nactiveAgentlessCollectors,active_agentless_collectors\nactiveAgents,active_agents\nactiveAssessmentsCount,active_assessments_count\nactiveConnectors,active_connectors\nactiveContexts,active_contexts\nactiveDirectory,active_directory\nactiveDirectoryUser,active_directory_user\nactiveExperimentCount,active_experiment_count\nactiveFromTimestamp,active_from_timestamp\nactiveJobId,active_job_id\nactiveLaunchCount,active_launch_count\nactiveMeCollectors,active_me_collectors\nactiveNames,active_names\nactiveServicesCount,active_services_count\nactiveSessionId,active_session_id\nactiveUntilTimestamp,active_until_timestamp\nactiveViolations,active_violations\nactivities,activities\nactivityArn,activity_arn\nactivityFailedEventDetails,activity_failed_event_details\nactivityId,activity_id\nactivityScheduleFailedEventDetails,activity_schedule_failed_event_details\nactivityScheduledEventDetails,activity_scheduled_event_details\nactivityStartedEventDetails,activity_started_event_details\nactivitySucceededEventDetails,activity_succeeded_event_details\nactivityTaskCancelRequestedEventAttributes,activity_task_cancel_requested_event_attributes\nactivityTaskCanceledEventAttributes,activity_task_canceled_event_attributes\nactivityTaskCompletedEventAttributes,activity_task_completed_event_attributes\nactivityTaskFailedEventAttributes,activity_task_failed_event_attributes\nactivityTaskScheduledEventAttributes,activity_task_scheduled_event_attributes\nactivityTaskStartedEventAttributes,activity_task_started_event_attributes\nactivityTaskTimedOutEventAttributes,activity_task_timed_out_event_attributes\nactivityTimedOutEventDetails,activity_timed_out_event_details\nactivityType,activity_type\nactor,actor\nactorArn,actor_arn\nactualAgentPrompt,actual_agent_prompt\nactualCapacity,actual_capacity\nactualElicitedSlot,actual_elicited_slot\nactualIncrementalBackupSizeInMegaBytes,actual_incremental_backup_size_in_mega_bytes\nactualIntent,actual_intent\nactualOutput,actual_output\nactualReferenceId,actual_reference_id\nactualValue,actual_value\nadd,add\naddAllowedPrefixesToDirectConnectGateway,add_allowed_prefixes_to_direct_connect_gateway\naddAttributes,add_attributes\naddColumns,add_columns\naddGroupOwner,add_group_owner\naddMetrics,add_metrics\naddOnRequest,add_on_request\naddOnType,add_on_type\naddOns,add_ons\naddOrUpdateLabels,add_or_update_labels\naddOrUpdateTaints,add_or_update_taints\naddOrUpdateVariations,add_or_update_variations\naddSecurityGroupIds,add_security_group_ids\naddSubnetIds,add_subnet_ids\naddThingsToThingGroupParams,add_things_to_thing_group_params\naddedToServiceDateTime,added_to_service_date_time\nadditionalAllowedHeaders,additional_allowed_headers\nadditionalAttributeNames,additional_attribute_names\nadditionalAuthenticationProviders,additional_authentication_providers\nadditionalContext,additional_context\nadditionalData,additional_data\nadditionalDeploymentStatusInfo,additional_deployment_status_info\nadditionalEncryptionContext,additional_encryption_context\nadditionalExposedHeaders,additional_exposed_headers\nadditionalFixedProperties,additional_fixed_properties\nadditionalInfo,additional_info\nadditionalInstanceConfiguration,additional_instance_configuration\nadditionalMessage,additional_message\nadditionalMetricsToRetain,additional_metrics_to_retain\nadditionalMetricsToRetainV2,additional_metrics_to_retain_v2\nadditionalOccurrences,additional_occurrences\nadditionalParameters,additional_parameters\nadditionalParamsForNs,additional_params_for_ns\nadditionalTransientProperties,additional_transient_properties\naddon,addon\naddonArn,addon_arn\naddonName,addon_name\naddonVersion,addon_version\naddonVersions,addon_versions\naddons,addons\naddress,address\naddressFamily,address_family\nadds,adds\nadjustedCvss,adjusted_cvss\nadjustments,adjustments\nadmin,admin\nadminAccountId,admin_account_id\nadminAccounts,admin_accounts\nadminRoleArn,admin_role_arn\nadminUserName,admin_user_name\nadminUserPassword,admin_user_password\nadminUsername,admin_username\nadministrator,administrator\nadministratorAccount,administrator_account\nadministratorAccountId,administrator_account_id\nadr,adr\nadsApplicationConfigurationId,ads_application_configuration_id\nadsApplicationConfigurationName,ads_application_configuration_name\nadsApplicationName,ads_application_name\nadvancedRecognitionSetting,advanced_recognition_setting\naffectedAccounts,affected_accounts\naffectedImages,affected_images\naffectedInstances,affected_instances\nafterBlob,after_blob\nafterBlobId,after_blob_id\nafterCommitId,after_commit_id\nafterCommitSpecifier,after_commit_specifier\nafterPath,after_path\nafterTime,after_time\nagent,agent\nagentConnected,agent_connected\nagentCpuCores,agent_cpu_cores\nagentDetails,agent_details\nagentHash,agent_hash\nagentHealth,agent_health\nagentHealthCode,agent_health_code\nagentHealthCodes,agent_health_codes\nagentHealthDetails,agent_health_details\nagentHealths,agent_healths\nagentId,agent_id\nagentIds,agent_ids\nagentLastSeenByServiceDateTime,agent_last_seen_by_service_date_time\nagentNetworkInfoList,agent_network_info_list\nagentOrchestrationConfig,agent_orchestration_config\nagentParameters,agent_parameters\nagentPreviews,agent_previews\nagentProfile,agent_profile\nagentPrompt,agent_prompt\nagentStatus,agent_status\nagentSummary,agent_summary\nagentTurn,agent_turn\nagentType,agent_type\nagentUpdateStatus,agent_update_status\nagentVersion,agent_version\nagentlessCollectorSummary,agentless_collector_summary\nagents,agents\nagentsConfigurationStatus,agents_configuration_status\nagentsInfo,agents_info\nagentsTruncated,agents_truncated\naggregateColumns,aggregate_columns\naggregateField,aggregate_field\naggregateStatus,aggregate_status\naggregateTypes,aggregate_types\naggregateValue,aggregate_value\naggregatedUtterancesSummaries,aggregated_utterances_summaries\naggregatedValues,aggregated_values\naggregatedVariablesImpactExplanations,aggregated_variables_impact_explanations\naggregatedVariablesImportance,aggregated_variables_importance\naggregatedVariablesImportanceMetrics,aggregated_variables_importance_metrics\naggregationConfig,aggregation_config\naggregationDuration,aggregation_duration\naggregationField,aggregation_field\naggregationLastRefreshedDateTime,aggregation_last_refreshed_date_time\naggregationRequest,aggregation_request\naggregationType,aggregation_type\naggregationWindowEndTime,aggregation_window_end_time\naggregationWindowStartTime,aggregation_window_start_time\nagreementName,agreement_name\nagreements,agreements\nalarm,alarm\nalarmActions,alarm_actions\nalarmCapabilities,alarm_capabilities\nalarmConfiguration,alarm_configuration\nalarmEventActions,alarm_event_actions\nalarmModelArn,alarm_model_arn\nalarmModelDescription,alarm_model_description\nalarmModelName,alarm_model_name\nalarmModelSummaries,alarm_model_summaries\nalarmModelVersion,alarm_model_version\nalarmModelVersionSummaries,alarm_model_version_summaries\nalarmName,alarm_name\nalarmNames,alarm_names\nalarmNotification,alarm_notification\nalarmRecommendations,alarm_recommendations\nalarmRoleArn,alarm_role_arn\nalarmRule,alarm_rule\nalarmState,alarm_state\nalarmSummaries,alarm_summaries\nalarms,alarms\nalertManagerDefinition,alert_manager_definition\nalertTargetArn,alert_target_arn\nalertTargets,alert_targets\nalerts,alerts\nalgorithm,algorithm\nalgorithmArn,algorithm_arn\nalgorithmHyperParameterRanges,algorithm_hyper_parameter_ranges\nalgorithmHyperParameters,algorithm_hyper_parameters\nalgorithmImage,algorithm_image\nalgorithmSpecification,algorithm_specification\nalias,alias\naliasPrefix,alias_prefix\naliases,aliases\nalignment,alignment\nall,all\nallColumns,all_columns\nallMatchesCount,all_matches_count\nallMatchesSum,all_matches_sum\nallRegions,all_regions\nallSupported,all_supported\nallocationStrategy,allocation_strategy\nallowAudioInput,allow_audio_input\nallowAuthorizerOverride,allow_authorizer_override\nallowAutoRegistration,allow_auto_registration\nallowCleartext,allow_cleartext\nallowConstraintErrors,allow_constraint_errors\nallowDTMFInput,allow_dtmf_input\nallowDuplicates,allow_duplicates\nallowExternalPrincipals,allow_external_principals\nallowFleet,allow_fleet\nallowImageBuilder,allow_image_builder\nallowInterrupt,allow_interrupt\nallowJoinsOnColumnsWithDifferentNames,allow_joins_on_columns_with_different_names\nallowListIds,allow_list_ids\nallowLists,allow_lists\nallowMultipleValues,allow_multiple_values\nallowOrganizationMemberAccount,allow_organization_member_account\nallowOverwrite,allow_overwrite\nallowPublicOverrides,allow_public_overrides\nallowed,allowed\nallowedAccounts,allowed_accounts\nallowedAnalyses,allowed_analyses\nallowedAnalysisProviders,allowed_analysis_providers\nallowedColumns,allowed_columns\nallowedHTTPMethods,allowed_http_methods\nallowedInputTypes,allowed_input_types\nallowedJoinOperators,allowed_join_operators\nallowedOrganizations,allowed_organizations\nallowedPrefixesToDirectConnectGateway,allowed_prefixes_to_direct_connect_gateway\nallowedValues,allowed_values\nallowlist,allowlist\nallowsHostedConnections,allows_hosted_connections\nallowsPublicReadAccess,allows_public_read_access\nallowsPublicWriteAccess,allows_public_write_access\nallowsUnencryptedObjectUploads,allows_unencrypted_object_uploads\nalreadyImplemented,already_implemented\nalternateKeys,alternate_keys\nalternativeDomainNames,alternative_domain_names\nalternativeIntents,alternative_intents\namazonAddress,amazon_address\namazonSideAsn,amazon_side_asn\nami,ami\namiDistributionConfiguration,ami_distribution_configuration\namiId,ami_id\namiLaunchIndex,ami_launch_index\namiTags,ami_tags\namiType,ami_type\namis,amis\namount,amount\namznErrorType,amzn_error_type\nanalysisCompleteTime,analysis_complete_time\nanalysisId,analysis_id\nanalysisMethod,analysis_method\nanalysisParameters,analysis_parameters\nanalysisResults,analysis_results\nanalysisRule,analysis_rule\nanalysisRulePolicy,analysis_rule_policy\nanalysisRuleType,analysis_rule_type\nanalysisRuleTypes,analysis_rule_types\nanalysisStatus,analysis_status\nanalysisTemplate,analysis_template\nanalysisTemplateArn,analysis_template_arn\nanalysisTemplateArns,analysis_template_arns\nanalysisTemplateIdentifier,analysis_template_identifier\nanalysisTemplateSummaries,analysis_template_summaries\nanalysisType,analysis_type\nanalyzedAt,analyzed_at\nanalyzedResources,analyzed_resources\nanalyzer,analyzer\nanalyzerArn,analyzer_arn\nanalyzerName,analyzer_name\nanalyzers,analyzers\nanchor,anchor\nand,and\nandroidPaths,android_paths\nannotationFields,annotation_fields\nannotationImportJobs,annotation_import_jobs\nannotationStoreVersions,annotation_store_versions\nannotationStores,annotation_stores\nannotationType,annotation_type\nanomalies,anomalies\nanomalyInstanceId,anomaly_instance_id\nanswerMachineDetectionConfig,answer_machine_detection_config\nantennaUplinkConfigArn,antenna_uplink_config_arn\nantiPatternReportS3Object,anti_pattern_report_s3_object\nantipatternReportResultList,antipattern_report_result_list\nantipatternReportS3Object,antipattern_report_s3_object\nantipatternReportStatus,antipattern_report_status\nantipatternReportStatusMessage,antipattern_report_status_message\napacheKafkaCluster,apache_kafka_cluster\napi,api\napiAccess,api_access\napiAccessPrincipalArn,api_access_principal_arn\napiAssociation,api_association\napiCache,api_cache\napiCachingBehavior,api_caching_behavior\napiCallDateTime,api_call_date_time\napiCallDetails,api_call_details\napiConfiguration,api_configuration\napiId,api_id\napiKey,api_key\napiKeyRequired,api_key_required\napiKeySource,api_key_source\napiKeyVersion,api_key_version\napiKeys,api_keys\napiMode,api_mode\napiSecretKey,api_secret_key\napiServiceName,api_service_name\napiStages,api_stages\napiSummary,api_summary\napiToken,api_token\napiType,api_type\napiVersion,api_version\napp,app\nappArn,app_arn\nappAuthorization,app_authorization\nappAuthorizationArn,app_authorization_arn\nappAuthorizationIdentifier,app_authorization_identifier\nappAuthorizationSummary,app_authorization_summary\nappAuthorizationSummaryList,app_authorization_summary_list\nappBundle,app_bundle\nappBundleArn,app_bundle_arn\nappBundleIdentifier,app_bundle_identifier\nappBundleSummaryList,app_bundle_summary_list\nappCategory,app_category\nappComponent,app_component\nappComponentName,app_component_name\nappComponentNames,app_component_names\nappComponents,app_components\nappConfigResource,app_config_resource\nappId,app_id\nappIdClientRegex,app_id_client_regex\nappIds,app_ids\nappInputSource,app_input_source\nappInputSources,app_input_sources\nappIntegrationArn,app_integration_arn\nappPackagesCleanup,app_packages_cleanup\nappProtocol,app_protocol\nappRegistryAppName,app_registry_app_name\nappRegistryAppNames,app_registry_app_names\nappSpecContent,app_spec_content\nappSummaries,app_summaries\nappSummary,app_summary\nappTemplateBody,app_template_body\nappType,app_type\nappUnitError,app_unit_error\nappUnitErrorCategory,app_unit_error_category\nappUpload,app_upload\nappValidationConfigurations,app_validation_configurations\nappValidationOutput,app_validation_output\nappValidationStrategy,app_validation_strategy\nappVersion,app_version\nappVersions,app_versions\napplication,application\napplicationAggregatedStatus,application_aggregated_status\napplicationArn,application_arn\napplicationCallBackURL,application_call_back_url\napplicationComponentCriteria,application_component_criteria\napplicationComponentDetail,application_component_detail\napplicationComponentId,application_component_id\napplicationComponentInfos,application_component_infos\napplicationComponentStrategies,application_component_strategies\napplicationComponentStrategySummary,application_component_strategy_summary\napplicationConfiguration,application_configuration\napplicationConfigurationId,application_configuration_id\napplicationCreationDate,application_creation_date\napplicationDescription,application_description\napplicationHostUrl,application_host_url\napplicationID,application_id\napplicationIDs,application_ids\napplicationId,application_id\napplicationImportFailure,application_import_failure\napplicationImportSuccess,application_import_success\napplicationKey,application_key\napplicationLastUpdateDate,application_last_update_date\napplicationMode,application_mode\napplicationName,application_name\napplicationNames,application_names\napplicationPermissions,application_permissions\napplicationPort,application_port\napplicationPreferences,application_preferences\napplicationServicePath,application_service_path\napplicationState,application_state\napplicationSummaries,application_summaries\napplicationType,application_type\napplicationUrl,application_url\napplicationVersion,application_version\napplicationVersions,application_versions\napplications,applications\napplicationsCount,applications_count\napplicationsInfo,applications_info\nappliedRulePriority,applied_rule_priority\nappliedScanFilters,applied_scan_filters\nappliedStatus,applied_status\nappliedWeights,applied_weights\napplyDuringMaintenanceWindow,apply_during_maintenance_window\napplyImmediately,apply_immediately\napplyMethod,apply_method\napplyNormalization,apply_normalization\napplyType,apply_type\napprovalRule,approval_rule\napprovalRuleContent,approval_rule_content\napprovalRuleEventMetadata,approval_rule_event_metadata\napprovalRuleId,approval_rule_id\napprovalRuleName,approval_rule_name\napprovalRuleOverriddenEventMetadata,approval_rule_overridden_event_metadata\napprovalRuleTemplate,approval_rule_template\napprovalRuleTemplateContent,approval_rule_template_content\napprovalRuleTemplateDescription,approval_rule_template_description\napprovalRuleTemplateId,approval_rule_template_id\napprovalRuleTemplateName,approval_rule_template_name\napprovalRuleTemplateNames,approval_rule_template_names\napprovalRules,approval_rules\napprovalRulesNotSatisfied,approval_rules_not_satisfied\napprovalRulesSatisfied,approval_rules_satisfied\napprovalState,approval_state\napprovalStateChangedEventMetadata,approval_state_changed_event_metadata\napprovalStatus,approval_status\napprovals,approvals\napproved,approved\napprovedAt,approved_at\napproximateNumberOfObjectsToProcess,approximate_number_of_objects_to_process\napproximateSecondsBeforeTimedOut,approximate_seconds_before_timed_out\napps,apps\nappsyncDomainName,appsync_domain_name\narch,arch\narchitecture,architecture\narchitectures,architectures\narchiveDescription,archive_description\narchiveId,archive_id\narchiveRule,archive_rule\narchiveRules,archive_rules\narchiveSize,archive_size\narchived,archived\nargs,args\narguments,arguments\narn,arn\narns,arns\narrayBaseColumnType,array_base_column_type\narrayJobId,array_job_id\narrayProperties,array_properties\nartifactCredentials,artifact_credentials\nartifactFileName,artifact_file_name\nartifactId,artifact_id\nartifactIdentifier,artifact_identifier\nartifactMediaType,artifact_media_type\nartifactName,artifact_name\nartifactRevisions,artifact_revisions\nartifactStore,artifact_store\nartifactStores,artifact_stores\nartifactUrl,artifact_url\nartifacts,artifacts\nartifactsOverride,artifacts_override\nartifactsUrl,artifacts_url\nasOfTimestamp,as_of_timestamp\nascendingOrder,ascending_order\nasi,asi\nasn,asn\nasnOrg,asn_org\nassertionAttributes,assertion_attributes\nassessment,assessment\nassessmentArn,assessment_arn\nassessmentControlsCountByNoncompliantEvidence,assessment_controls_count_by_noncompliant_evidence\nassessmentDescription,assessment_description\nassessmentFrameworkShareRequest,assessment_framework_share_request\nassessmentFrameworkShareRequests,assessment_framework_share_requests\nassessmentId,assessment_id\nassessmentMetadata,assessment_metadata\nassessmentName,assessment_name\nassessmentReport,assessment_report\nassessmentReportEvidenceCount,assessment_report_evidence_count\nassessmentReportId,assessment_report_id\nassessmentReportSelection,assessment_report_selection\nassessmentReportSelectionCount,assessment_report_selection_count\nassessmentReports,assessment_reports\nassessmentReportsDestination,assessment_reports_destination\nassessmentRunAgents,assessment_run_agents\nassessmentRunArn,assessment_run_arn\nassessmentRunArns,assessment_run_arns\nassessmentRunArnsTruncated,assessment_run_arns_truncated\nassessmentRunCount,assessment_run_count\nassessmentRunName,assessment_run_name\nassessmentRuns,assessment_runs\nassessmentSchedule,assessment_schedule\nassessmentStatus,assessment_status\nassessmentSummaries,assessment_summaries\nassessmentSummary,assessment_summary\nassessmentTargetArn,assessment_target_arn\nassessmentTargetArns,assessment_target_arns\nassessmentTargetName,assessment_target_name\nassessmentTargetNamePattern,assessment_target_name_pattern\nassessmentTargets,assessment_targets\nassessmentTemplateArn,assessment_template_arn\nassessmentTemplateArns,assessment_template_arns\nassessmentTemplateName,assessment_template_name\nassessmentTemplates,assessment_templates\nasset,asset\nassetArn,asset_arn\nassetAttributes,asset_attributes\nassetCompositeModelId,asset_composite_model_id\nassetCompositeModels,asset_composite_models\nassetContent,asset_content\nassetCreationDate,asset_creation_date\nassetDescription,asset_description\nassetHierarchies,asset_hierarchies\nassetId,asset_id\nassetIds,asset_ids\nassetLastUpdateDate,asset_last_update_date\nassetModelArn,asset_model_arn\nassetModelCompositeModelId,asset_model_composite_model_id\nassetModelCompositeModels,asset_model_composite_models\nassetModelCreationDate,asset_model_creation_date\nassetModelDescription,asset_model_description\nassetModelHierarchies,asset_model_hierarchies\nassetModelId,asset_model_id\nassetModelLastUpdateDate,asset_model_last_update_date\nassetModelName,asset_model_name\nassetModelProperties,asset_model_properties\nassetModelPropertySummaries,asset_model_property_summaries\nassetModelStatus,asset_model_status\nassetModelSummaries,asset_model_summaries\nassetName,asset_name\nassetProperties,asset_properties\nassetProperty,asset_property\nassetPropertySummaries,asset_property_summaries\nassetPropertyValue,asset_property_value\nassetPropertyValueHistory,asset_property_value_history\nassetRelationshipSummaries,asset_relationship_summaries\nassetSHA256,asset_sha256\nassetSizeBytes,asset_size_bytes\nassetStatus,asset_status\nassetSummaries,asset_summaries\nassetType,asset_type\nassets,assets\nassignPublicIp,assign_public_ip\nassignedLabel,assigned_label\nassignedValue,assigned_value\nassistant,assistant\nassistantArn,assistant_arn\nassistantAssociation,assistant_association\nassistantAssociationArn,assistant_association_arn\nassistantAssociationId,assistant_association_id\nassistantAssociationSummaries,assistant_association_summaries\nassistantId,assistant_id\nassistantSummaries,assistant_summaries\nassociateDefaultSecurityGroup,associate_default_security_group\nassociatePublicIpAddress,associate_public_ip_address\nassociatedApplications,associated_applications\nassociatedAt,associated_at\nassociatedClientDevices,associated_client_devices\nassociatedEntity,associated_entity\nassociatedFields,associated_fields\nassociatedGateway,associated_gateway\nassociatedGatewayId,associated_gateway_id\nassociatedGatewayOwnerAccount,associated_gateway_owner_account\nassociatedIntentName,associated_intent_name\nassociatedOn,associated_on\nassociatedPortalArns,associated_portal_arns\nassociatedRepositoryNames,associated_repository_names\nassociatedResourceCount,associated_resource_count\nassociatedResources,associated_resources\nassociatedS3Resources,associated_s3_resources\nassociatedServerId,associated_server_id\nassociatedServerIds,associated_server_ids\nassociatedSlotName,associated_slot_name\nassociatedTranscripts,associated_transcripts\nassociatedTranscriptsPassword,associated_transcripts_password\nassociatedTranscriptsUrl,associated_transcripts_url\nassociatedWithJob,associated_with_job\nassociation,association\nassociationArn,association_arn\nassociationBehavior,association_behavior\nassociationData,association_data\nassociationId,association_id\nassociationState,association_state\nassociationStatus,association_status\nassociationTime,association_time\nassociationTimestamp,association_timestamp\nassociationType,association_type\nassumedRole,assumed_role\natBlockchainInstant,at_blockchain_instant\natRestEncryptionEnabled,at_rest_encryption_enabled\nati,ati\natigData,atig_data\natodr,atodr\nattachTime,attach_time\nattachedDiskMapping,attached_disk_mapping\nattachedObjectIdentifier,attached_object_identifier\nattachedResource,attached_resource\nattachedTo,attached_to\nattachment,attachment\nattachmentArn,attachment_arn\nattachmentId,attachment_id\nattachmentLinkUrl,attachment_link_url\nattachmentNetworkAclConfiguration,attachment_network_acl_configuration\nattachmentSet,attachment_set\nattachmentSetId,attachment_set_id\nattachmentState,attachment_state\nattachmentType,attachment_type\nattachments,attachments\nattachmentsStatus,attachments_status\nattemptDurationSeconds,attempt_duration_seconds\nattemptId,attempt_id\nattempts,attempts\nattribute,attribute\nattributeGroup,attribute_group\nattributeGroupArn,attribute_group_arn\nattributeGroups,attribute_groups\nattributeGroupsDetails,attribute_groups_details\nattributeKeys,attribute_keys\nattributeMap,attribute_map\nattributeMatchingModel,attribute_matching_model\nattributeName,attribute_name\nattributePartition,attribute_partition\nattributePayload,attribute_payload\nattributeResults,attribute_results\nattributeUpdateMode,attribute_update_mode\nattributeValue,attribute_value\nattributes,attributes\nauc,auc\naudio,audio\naudioAndDTMFInputSpecification,audio_and_dtmf_input_specification\naudioChunk,audio_chunk\naudioFileS3Location,audio_file_s3_location\naudioInput,audio_input\naudioLogSettings,audio_log_settings\naudioRecognitionStrategy,audio_recognition_strategy\naudioSpecification,audio_specification\naudioStream,audio_stream\naudioVoiceDurationMillis,audio_voice_duration_millis\nauditCheckConfigurations,audit_check_configurations\nauditCheckToActionsMapping,audit_check_to_actions_mapping\nauditCheckToReasonCodeFilter,audit_check_to_reason_code_filter\nauditDetails,audit_details\nauditEvents,audit_events\nauditNotificationTargetConfigurations,audit_notification_target_configurations\nauditResults,audit_results\nauditTaskId,audit_task_id\nauth,auth\nauthCode,auth_code\nauthCodeUrl,auth_code_url\nauthCodeUrls,auth_code_urls\nauthDecision,auth_decision\nauthDefinition,auth_definition\nauthInfo,auth_info\nauthInfos,auth_infos\nauthKey,auth_key\nauthParameters,auth_parameters\nauthRequest,auth_request\nauthResults,auth_results\nauthTTL,auth_ttl\nauthType,auth_type\nauthUrl,auth_url\nauthentication,authentication\nauthenticationConfig,authentication_config\nauthenticationConfiguration,authentication_configuration\nauthenticationMethod,authentication_method\nauthenticationProviders,authentication_providers\nauthenticationType,authentication_type\nauthor,author\nauthorArn,author_arn\nauthorName,author_name\nauthorization,authorization\nauthorizationApiKeyName,authorization_api_key_name\nauthorizationApiKeyValue,authorization_api_key_value\nauthorizationConfig,authorization_config\nauthorizationData,authorization_data\nauthorizationEndpoint,authorization_endpoint\nauthorizationScopes,authorization_scopes\nauthorizationToken,authorization_token\nauthorizationType,authorization_type\nauthorized,authorized\nauthorizerArn,authorizer_arn\nauthorizerConfig,authorizer_config\nauthorizerCredentials,authorizer_credentials\nauthorizerDescription,authorizer_description\nauthorizerFunctionArn,authorizer_function_arn\nauthorizerId,authorizer_id\nauthorizerName,authorizer_name\nauthorizerResultTtlInSeconds,authorizer_result_ttl_in_seconds\nauthorizerUri,authorizer_uri\nauthorizers,authorizers\nautoBranchCreationConfig,auto_branch_creation_config\nautoBranchCreationPatterns,auto_branch_creation_patterns\nautoCompute,auto_compute\nautoEnable,auto_enable\nautoEnableNewAccount,auto_enable_new_account\nautoGenerateForms,auto_generate_forms\nautoLaunch,auto_launch\nautoMLConfig,auto_ml_config\nautoMLResult,auto_ml_result\nautoMountStatus,auto_mount_status\nautoMounting,auto_mounting\nautoRegistrationStatus,auto_registration_status\nautoReplicateNewDisks,auto_replicate_new_disks\nautoResolve,auto_resolve\nautoRollbackConfiguration,auto_rollback_configuration\nautoRollbackEnabled,auto_rollback_enabled\nautoScaling,auto_scaling\nautoScalingConfiguration,auto_scaling_configuration\nautoScalingGroup,auto_scaling_group\nautoScalingGroupArn,auto_scaling_group_arn\nautoScalingGroupArns,auto_scaling_group_arns\nautoScalingGroupName,auto_scaling_group_name\nautoScalingGroupProvider,auto_scaling_group_provider\nautoScalingGroupRecommendations,auto_scaling_group_recommendations\nautoScalingGroups,auto_scaling_groups\nautoScalingMetric,auto_scaling_metric\nautoSnapshotAddOnRequest,auto_snapshot_add_on_request\nautoSnapshots,auto_snapshots\nautoStartConfiguration,auto_start_configuration\nautoStopConfiguration,auto_stop_configuration\nautoSubDomainCreationPatterns,auto_sub_domain_creation_patterns\nautoSubDomainIAMRole,auto_sub_domain_iam_role\nautoUpdate,auto_update\nautoUpdateOutdatedInstancesDeploymentIds,auto_update_outdated_instances_deployment_ids\nautoUpdateOutdatedInstancesRootDeploymentId,auto_update_outdated_instances_root_deployment_id\nautomatedDiscoveryFreeTrialStartDate,automated_discovery_free_trial_start_date\nautomaticRenewal,automatic_renewal\nautomaticStopTimeMinutes,automatic_stop_time_minutes\nautomaticTerminationMode,automatic_termination_mode\nautomationExecutions,automation_executions\nautoprovision,autoprovision\nautotrack,autotrack\nauxiliaryApps,auxiliary_apps\navailability,availability\navailabilityZone,availability_zone\navailabilityZoneId,availability_zone_id\navailabilityZoneIds,availability_zone_ids\navailabilityZones,availability_zones\navailable,available\navailableMacSecPortSpeeds,available_mac_sec_port_speeds\navailablePlatforms,available_platforms\navailablePortSpeeds,available_port_speeds\navailableProviders,available_providers\navcLevel,avc_level\navcProfile,avc_profile\naverage,average\nawayFrom,away_from\nawsAccount,aws_account\nawsAccountId,aws_account_id\nawsAccountIds,aws_account_ids\nawsAccountName,aws_account_name\nawsAccountNumber,aws_account_number\nawsAccounts,aws_accounts\nawsDevice,aws_device\nawsDeviceV2,aws_device_v2\nawsEc2Instance,aws_ec2_instance\nawsEcrContainerImage,aws_ecr_container_image\nawsGroundStationAgentEndpoint,aws_ground_station_agent_endpoint\nawsIamConfig,aws_iam_config\nawsInstanceID,aws_instance_id\nawsIotJobArn,aws_iot_job_arn\nawsIotJobId,aws_iot_job_id\nawsIotSqlVersion,aws_iot_sql_version\nawsJobAbortConfig,aws_job_abort_config\nawsJobExecutionsRolloutConfig,aws_job_executions_rollout_config\nawsJobPresignedUrlConfig,aws_job_presigned_url_config\nawsJobTimeoutConfig,aws_job_timeout_config\nawsLambdaFunction,aws_lambda_function\nawsLogicalDeviceId,aws_logical_device_id\nawsOrganization,aws_organization\nawsRegion,aws_region\nawsSecretStoreArn,aws_secret_store_arn\nawsService,aws_service\nawsServices,aws_services\nawsSignerJobId,aws_signer_job_id\nawsSso,aws_sso\nawsvpcConfiguration,awsvpc_configuration\nazMode,az_mode\nbackendDefaults,backend_defaults\nbackendEnvironment,backend_environment\nbackendEnvironmentArn,backend_environment_arn\nbackendEnvironments,backend_environments\nbackends,backends\nbackfillStatus,backfill_status\nbackloggedStorageBytes,backlogged_storage_bytes\nbackupId,backup_id\nbackupMode,backup_mode\nbackupProgressInMegaBytes,backup_progress_in_mega_bytes\nbackupRetentionEnabled,backup_retention_enabled\nbadge,badge\nbadgeEnabled,badge_enabled\nbadgeRequestUrl,badge_request_url\nbalance,balance\nbandwidth,bandwidth\nbandwidthAllocation,bandwidth_allocation\nbandwidthThrottling,bandwidth_throttling\nbase,base\nbaseCapacity,base_capacity\nbaseCommitId,base_commit_id\nbaseConfigurationItems,base_configuration_items\nbaseEjectionDuration,base_ejection_duration\nbaseModelArn,base_model_arn\nbaseModelArnEquals,base_model_arn_equals\nbaseModelIdentifier,base_model_identifier\nbaseModelName,base_model_name\nbasePath,base_path\nbaseProcessingInstanceType,base_processing_instance_type\nbaseProcessingInstanceVolumeSizeInGB,base_processing_instance_volume_size_in_gb\nbaseProcessingJob,base_processing_job\nbaseRatePerMinute,base_rate_per_minute\nbaseScore,base_score\nbaseStat,base_stat\nbaseTableTTL,base_table_ttl\nbasic,basic\nbasicAuthCredentials,basic_auth_credentials\nbatch,batch\nbatchDeleteDetectorErrorEntries,batch_delete_detector_error_entries\nbatchImports,batch_imports\nbatchInferenceJob,batch_inference_job\nbatchInferenceJobArn,batch_inference_job_arn\nbatchInferenceJobConfig,batch_inference_job_config\nbatchInferenceJobs,batch_inference_jobs\nbatchItemId,batch_item_id\nbatchJobDefinitions,batch_job_definitions\nbatchJobExecutions,batch_job_executions\nbatchJobIdentifier,batch_job_identifier\nbatchMode,batch_mode\nbatchPolicy,batch_policy\nbatchPredictions,batch_predictions\nbatchPutMessageErrorEntries,batch_put_message_error_entries\nbatchReportMode,batch_report_mode\nbatchSegmentJob,batch_segment_job\nbatchSegmentJobArn,batch_segment_job_arn\nbatchSegmentJobs,batch_segment_jobs\nbatchSize,batch_size\nbatchUpdateDetectorErrorEntries,batch_update_detector_error_entries\nbeforeBlob,before_blob\nbeforeBlobId,before_blob_id\nbeforeCommitId,before_commit_id\nbeforeCommitSpecifier,before_commit_specifier\nbeforePath,before_path\nbeforeTime,before_time\nbegin,begin\nbeginDate,begin_date\nbeginInclusive,begin_inclusive\nbeginOffsetInclusive,begin_offset_inclusive\nbehavior,behavior\nbehaviorCriteriaType,behavior_criteria_type\nbehaviorName,behavior_name\nbehaviors,behaviors\nbehindMajor,behind_major\nbehindMinor,behind_minor\nbelongsToFieldOnRelatedModel,belongs_to_field_on_related_model\nbestRecipeArn,best_recipe_arn\nbgpPeerId,bgp_peer_id\nbgpPeerState,bgp_peer_state\nbgpPeers,bgp_peers\nbgpStatus,bgp_status\nbidPercentage,bid_percentage\nbillableDuration,billable_duration\nbillableEntityCount,billable_entity_count\nbilledDurationInMilliseconds,billed_duration_in_milliseconds\nbilledMemoryUsedInMB,billed_memory_used_in_mb\nbilledResourceUtilization,billed_resource_utilization\nbillingDetails,billing_details\nbillingGroupArn,billing_group_arn\nbillingGroupDescription,billing_group_description\nbillingGroupId,billing_group_id\nbillingGroupMetadata,billing_group_metadata\nbillingGroupName,billing_group_name\nbillingGroupProperties,billing_group_properties\nbillingGroups,billing_groups\nbillingMethod,billing_method\nbillingMinutes,billing_minutes\nbinBy,bin_by\nbinKeys,bin_keys\nbinaryMediaTypes,binary_media_types\nbindIP,bind_ip\nbindingEvent,binding_event\nbindingProperties,binding_properties\nbindings,bindings\nbitMaskLength,bit_mask_length\nbitRightShift,bit_right_shift\nblackListedAgents,black_listed_agents\nblackListedConnectors,black_listed_connectors\nblobId,blob_id\nblockDeviceMappings,block_device_mappings\nblockHash,block_hash\nblockNumber,block_number\nblockPublicAccess,block_public_access\nblockPublicAcls,block_public_acls\nblockPublicPolicy,block_public_policy\nblockers,blockers\nblocklist,blocklist\nblocksize,blocksize\nblueGreenDeploymentConfiguration,blue_green_deployment_configuration\nblueprintId,blueprint_id\nblueprintName,blueprint_name\nblueprints,blueprints\nbluetooth,bluetooth\nbody,body\nbooleanValue,boolean_value\nbootMode,boot_mode\nbootstrapServers,bootstrap_servers\nbotAlias,bot_alias\nbotAliasHistoryEvents,bot_alias_history_events\nbotAliasId,bot_alias_id\nbotAliasLocaleSettings,bot_alias_locale_settings\nbotAliasName,bot_alias_name\nbotAliasStatus,bot_alias_status\nbotAliasSummaries,bot_alias_summaries\nbotAliasTarget,bot_alias_target\nbotChannelAssociations,bot_channel_associations\nbotConfiguration,bot_configuration\nbotExportSpecification,bot_export_specification\nbotId,bot_id\nbotImportSpecification,bot_import_specification\nbotLocaleExportPassword,bot_locale_export_password\nbotLocaleExportSpecification,bot_locale_export_specification\nbotLocaleExportUrl,bot_locale_export_url\nbotLocaleHistoryEvents,bot_locale_history_events\nbotLocaleImportSpecification,bot_locale_import_specification\nbotLocaleStatus,bot_locale_status\nbotLocaleSummaries,bot_locale_summaries\nbotMemberAliasId,bot_member_alias_id\nbotMemberAliasName,bot_member_alias_name\nbotMemberId,bot_member_id\nbotMemberName,bot_member_name\nbotMemberVersion,bot_member_version\nbotMembers,bot_members\nbotName,bot_name\nbotRecommendationId,bot_recommendation_id\nbotRecommendationResults,bot_recommendation_results\nbotRecommendationStatus,bot_recommendation_status\nbotRecommendationSummaries,bot_recommendation_summaries\nbotResponseAudioVoiceId,bot_response_audio_voice_id\nbotResponses,bot_responses\nbotStatus,bot_status\nbotSummaries,bot_summaries\nbotTags,bot_tags\nbotType,bot_type\nbotVersion,bot_version\nbotVersionLocaleSpecification,bot_version_locale_specification\nbotVersionSummaries,bot_version_summaries\nbotVersions,bot_versions\nbots,bots\nbpaImpactsLightsail,bpa_impacts_lightsail\nbranch,branch\nbranchArn,branch_arn\nbranchCoveragePercentage,branch_coverage_percentage\nbranchFilter,branch_filter\nbranchName,branch_name\nbranches,branches\nbranchesCovered,branches_covered\nbranchesMissed,branches_missed\nbreachAction,breach_action\nbreakingChanges,breaking_changes\nbrowserPolicy,browser_policy\nbrowserSettings,browser_settings\nbrowserSettingsArn,browser_settings_arn\nbrowserType,browser_type\nbucket,bucket\nbucketAclGrants,bucket_acl_grants\nbucketArn,bucket_arn\nbucketCount,bucket_count\nbucketCountByEffectivePermission,bucket_count_by_effective_permission\nbucketCountByEncryptionType,bucket_count_by_encryption_type\nbucketCountByObjectEncryptionRequirement,bucket_count_by_object_encryption_requirement\nbucketCountBySharedAccessType,bucket_count_by_shared_access_type\nbucketCreatedAt,bucket_created_at\nbucketCriteria,bucket_criteria\nbucketDefinitions,bucket_definitions\nbucketKey,bucket_key\nbucketLevelPermissions,bucket_level_permissions\nbucketName,bucket_name\nbucketNames,bucket_names\nbucketOwner,bucket_owner\nbucketOwnerAccess,bucket_owner_access\nbucketPolicy,bucket_policy\nbucketPrefix,bucket_prefix\nbucketPublicAccessBlock,bucket_public_access_block\nbucketStatisticsBySensitivity,bucket_statistics_by_sensitivity\nbuckets,buckets\nbucketsAggregationType,buckets_aggregation_type\nbuild,build\nbuildBatch,build_batch\nbuildBatchArn,build_batch_arn\nbuildBatchConfig,build_batch_config\nbuildBatchConfigOverride,build_batch_config_override\nbuildBatchNumber,build_batch_number\nbuildBatchStatus,build_batch_status\nbuildBatches,build_batches\nbuildBatchesNotFound,build_batches_not_found\nbuildComplete,build_complete\nbuildGroups,build_groups\nbuildNumber,build_number\nbuildSpec,build_spec\nbuildStatus,build_status\nbuildStatusConfig,build_status_config\nbuildStatusConfigOverride,build_status_config_override\nbuildTimeoutInMinutes,build_timeout_in_minutes\nbuildTimeoutInMinutesOverride,build_timeout_in_minutes_override\nbuildType,build_type\nbuilds,builds\nbuildsDeleted,builds_deleted\nbuildsNotDeleted,builds_not_deleted\nbuildsNotFound,builds_not_found\nbuildspec,buildspec\nbuildspecOverride,buildspec_override\nbuiltInIntentSummaries,built_in_intent_summaries\nbuiltInSlotTypeSummaries,built_in_slot_type_summaries\nbundleId,bundle_id\nbundleInformation,bundle_information\nbundleList,bundle_list\nbundleNames,bundle_names\nbundleType,bundle_type\nbundles,bundles\nburstLimit,burst_limit\nbusinessGoals,business_goals\nbusinessUnitId,business_unit_id\nbuttons,buttons\nbyCustomizationType,by_customization_type\nbyInferenceType,by_inference_type\nbyName,by_name\nbyOutputModality,by_output_modality\nbyProvider,by_provider\nbyteBuffer,byte_buffer\nbyteLength,byte_length\nbytes,bytes\nbytesProcessed,bytes_processed\nbytesReceived,bytes_received\nbytesScanned,bytes_scanned\nbytesSent,bytes_sent\nbytesWritten,bytes_written\ncaCertificate,ca_certificate\ncaCertificateId,ca_certificate_id\ncaCertificateIdentifier,ca_certificate_identifier\ncaCertificatePem,ca_certificate_pem\ncache,cache\ncacheAtStartup,cache_at_startup\ncacheBehaviorSettings,cache_behavior_settings\ncacheBehaviors,cache_behaviors\ncacheClusterEnabled,cache_cluster_enabled\ncacheClusterSize,cache_cluster_size\ncacheClusterStatus,cache_cluster_status\ncacheConfigurations,cache_configurations\ncacheDataEncrypted,cache_data_encrypted\ncacheKeyParameters,cache_key_parameters\ncacheNamespace,cache_namespace\ncacheOverride,cache_override\ncacheStorageConfigurations,cache_storage_configurations\ncacheTtlInSeconds,cache_ttl_in_seconds\ncacheType,cache_type\ncachedHTTPMethods,cached_http_methods\ncachingConfig,caching_config\ncachingEnabled,caching_enabled\ncachingKeys,caching_keys\ncak,cak\ncallbackOverrides,callback_overrides\ncallerReactions,caller_reactions\ncampaign,campaign\ncampaignArn,campaign_arn\ncampaignConfig,campaign_config\ncampaignId,campaign_id\ncampaignIds,campaign_ids\ncampaignName,campaign_name\ncampaignSummaries,campaign_summaries\ncampaignSummaryList,campaign_summary_list\ncampaigns,campaigns\ncanDbcFiles,can_dbc_files\ncanInterface,can_interface\ncanRetry,can_retry\ncanSignal,can_signal\ncanUnlinkAssociatedModel,can_unlink_associated_model\ncanUpdateImage,can_update_image\ncanUseAsDestination,can_use_as_destination\ncanUseAsSource,can_use_as_source\ncanaryInterval,canary_interval\ncanaryPercentage,canary_percentage\ncanarySettings,canary_settings\ncancel,cancel\ncancelActive,cancel_active\ncancelRequested,cancel_requested\ncancelTimerDecisionAttributes,cancel_timer_decision_attributes\ncancelTimerFailedEventAttributes,cancel_timer_failed_event_attributes\ncancelWorkflowExecutionDecisionAttributes,cancel_workflow_execution_decision_attributes\ncancelWorkflowExecutionFailedEventAttributes,cancel_workflow_execution_failed_event_attributes\ncanceled,canceled\ncanceledChecks,canceled_checks\ncanceledFindingsCount,canceled_findings_count\ncancellationStatus,cancellation_status\ncancelled,cancelled\ncannedAcl,canned_acl\ncapabilities,capabilities\ncapabilityArn,capability_arn\ncapabilityArns,capability_arns\ncapabilityConfiguration,capability_configuration\ncapabilityList,capability_list\ncapabilityNamespace,capability_namespace\ncapabilitySyncStatus,capability_sync_status\ncapacity,capacity\ncapacityConfiguration,capacity_configuration\ncapacityId,capacity_id\ncapacityLimits,capacity_limits\ncapacityProvider,capacity_provider\ncapacityProviderArn,capacity_provider_arn\ncapacityProviderName,capacity_provider_name\ncapacityProviderStrategy,capacity_provider_strategy\ncapacityProviders,capacity_providers\ncapacitySpecification,capacity_specification\ncapacitySpecificationOverride,capacity_specification_override\ncapacityType,capacity_type\ncaptureConditional,capture_conditional\ncaptureNextStep,capture_next_step\ncaptureResponse,capture_response\ncardinality,cardinality\ncarrier,carrier\ncaseArn,case_arn\ncaseData,case_data\ncaseId,case_id\ncaseIdList,case_id_list\ncaseSensitive,case_sensitive\ncases,cases\ncatalogData,catalog_data\ncatalogType,catalog_type\ncategoricalHyperParameterRanges,categorical_hyper_parameter_ranges\ncategories,categories\ncategoriesWithMostFindings,categories_with_most_findings\ncategory,category\ncategoryCode,category_code\ncategoryName,category_name\ncategorySpecificSummary,category_specific_summary\ncause,cause\ncausedBy,caused_by\ncausedByEventId,caused_by_event_id\nccEmailAddresses,cc_email_addresses\ncellReference,cell_reference\ncells,cells\ncellsToCreate,cells_to_create\ncellsToUpdate,cells_to_update\ncenterFrequency,center_frequency\ncertKey,cert_key\ncertificate,certificate\ncertificateAlternativeNames,certificate_alternative_names\ncertificateArn,certificate_arn\ncertificateAuthority,certificate_authority\ncertificateAuthorityArn,certificate_authority_arn\ncertificateAuthorityArns,certificate_authority_arns\ncertificateBody,certificate_body\ncertificateChain,certificate_chain\ncertificateData,certificate_data\ncertificateDescription,certificate_description\ncertificateDetail,certificate_detail\ncertificateDomainName,certificate_domain_name\ncertificateHashes,certificate_hashes\ncertificateId,certificate_id\ncertificateList,certificate_list\ncertificateMode,certificate_mode\ncertificateName,certificate_name\ncertificateOverride,certificate_override\ncertificatePathOnDevice,certificate_path_on_device\ncertificatePem,certificate_pem\ncertificatePrivateKey,certificate_private_key\ncertificateSigningRequest,certificate_signing_request\ncertificateStatuses,certificate_statuses\ncertificateUploadDate,certificate_upload_date\ncertificateVerificationDNSRecord,certificate_verification_dns_record\ncertificates,certificates\ncertificatesToAdd,certificates_to_add\ncertificatesToDelete,certificates_to_delete\ncfnStackName,cfn_stack_name\nchange,change\nchangeDescription,change_description\nchangeIdentifier,change_identifier\nchangeLogs,change_logs\nchangeRequests,change_requests\nchangeType,change_type\nchangesetArn,changeset_arn\nchangesetFormat,changeset_format\nchangesetId,changeset_id\nchangesets,changesets\nchannel,channel\nchannelArn,channel_arn\nchannelId,channel_id\nchannelMessages,channel_messages\nchannelName,channel_name\nchannelRoleArn,channel_role_arn\nchannelStorage,channel_storage\nchannelSummaries,channel_summaries\nchannels,channels\nchatChannel,chat_channel\ncheckCompliant,check_compliant\ncheckId,check_id\ncheckIds,check_ids\ncheckName,check_name\ncheckRunStatus,check_run_status\ncheckpointConfig,checkpoint_config\ncheckpointLabel,checkpoint_label\ncheckpointLabelFilter,checkpoint_label_filter\nchecks,checks\nchecksum,checksum\nchildAssetId,child_asset_id\nchildAssetModelId,child_asset_model_id\nchildConnectionTags,child_connection_tags\nchildDirected,child_directed\nchildPolicy,child_policy\nchildWorkflowExecutionCanceledEventAttributes,child_workflow_execution_canceled_event_attributes\nchildWorkflowExecutionCompletedEventAttributes,child_workflow_execution_completed_event_attributes\nchildWorkflowExecutionFailedEventAttributes,child_workflow_execution_failed_event_attributes\nchildWorkflowExecutionStartedEventAttributes,child_workflow_execution_started_event_attributes\nchildWorkflowExecutionTerminatedEventAttributes,child_workflow_execution_terminated_event_attributes\nchildWorkflowExecutionTimedOutEventAttributes,child_workflow_execution_timed_out_event_attributes\nchildren,children\nchop,chop\nchronologicalOrder,chronological_order\ncidr,cidr\ncidrBlock,cidr_block\ncidrListAliases,cidr_list_aliases\ncidrs,cidrs\nciphers,ciphers\nciphertext,ciphertext\ncisaData,cisa_data\ncity,city\nckn,ckn\nclaims,claims\nclarificationPrompt,clarification_prompt\nclassName,class_name\nclasses,classes\nclassifiableObjectCount,classifiable_object_count\nclassifiableSizeInBytes,classifiable_size_in_bytes\nclassification,classification\nclassificationDetails,classification_details\nclassificationError,classification_error\nclassificationResultStatus,classification_result_status\nclassificationScopeId,classification_scope_id\nclassificationScopes,classification_scopes\nclassificationType,classification_type\nclassificationTypeUpdate,classification_type_update\nclean,clean\nclear,clear\nclearMaxDevices,clear_max_devices\nclearResiliencyPolicyArn,clear_resiliency_policy_arn\nclearTimer,clear_timer\nclientAliases,client_aliases\nclientCertificateId,client_certificate_id\nclientCredentialsArn,client_credentials_arn\nclientId,client_id\nclientIdIssuedAt,client_id_issued_at\nclientIds,client_ids\nclientMode,client_mode\nclientName,client_name\nclientNumber,client_number\nclientPolicy,client_policy\nclientProperties,client_properties\nclientRequestToken,client_request_token\nclientSecret,client_secret\nclientSecretExpiresAt,client_secret_expires_at\nclientSideTimestamps,client_side_timestamps\nclientStatus,client_status\nclientTimestampMillis,client_timestamp_millis\nclientToken,client_token\nclientType,client_type\nclipboardMode,clipboard_mode\nclock,clock\ncloneFrom,clone_from\ncloneUrlHttp,clone_url_http\ncloneUrlSsh,clone_url_ssh\ncloseStatus,close_status\ncloseStatusFilter,close_status_filter\ncloseTimeFilter,close_time_filter\ncloseTimestamp,close_timestamp\nclosedFindings,closed_findings\nclosingResponse,closing_response\ncloudFormationStackRecords,cloud_formation_stack_records\ncloudFormationTarget,cloud_formation_target\ncloudMetricEnabled,cloud_metric_enabled\ncloudTrailArn,cloud_trail_arn\ncloudTrailDetails,cloud_trail_details\ncloudTrailProperties,cloud_trail_properties\ncloudWatch,cloud_watch\ncloudWatchConfig,cloud_watch_config\ncloudWatchEncryptionEnabled,cloud_watch_encryption_enabled\ncloudWatchLogDelivery,cloud_watch_log_delivery\ncloudWatchLogGroupArn,cloud_watch_log_group_arn\ncloudWatchLogGroupName,cloud_watch_log_group_name\ncloudWatchLoggingConfiguration,cloud_watch_logging_configuration\ncloudWatchLogs,cloud_watch_logs\ncloudWatchLogsArn,cloud_watch_logs_arn\ncloudWatchLogsConfiguration,cloud_watch_logs_configuration\ncloudWatchLogsLogGroup,cloud_watch_logs_log_group\ncloudWatchLogsRoleArn,cloud_watch_logs_role_arn\ncloudWatchMonitoringConfiguration,cloud_watch_monitoring_configuration\ncloudwatchAlarm,cloudwatch_alarm\ncloudwatchLogUrl,cloudwatch_log_url\ncloudwatchLogs,cloudwatch_logs\ncloudwatchMetric,cloudwatch_metric\ncloudwatchRoleArn,cloudwatch_role_arn\ncluster,cluster\nclusterArn,cluster_arn\nclusterArns,cluster_arns\nclusterCreationTime,cluster_creation_time\nclusterDescription,cluster_description\nclusterEndpoint,cluster_endpoint\nclusterIdentifier,cluster_identifier\nclusterLogging,cluster_logging\nclusterName,cluster_name\nclusterSecurityGroupId,cluster_security_group_id\nclusterType,cluster_type\nclusterVersion,cluster_version\nclusteringKeys,clustering_keys\nclusters,clusters\ncode,code\ncodeArtifactId,code_artifact_id\ncodeCommit,code_commit\ncodeCoverageSummary,code_coverage_summary\ncodeCoverages,code_coverages\ncodeErrors,code_errors\ncodeHook,code_hook\ncodeHookInterfaceVersion,code_hook_interface_version\ncodeHookSpecification,code_hook_specification\ncodeSha256,code_sha256\ncodeSigning,code_signing\ncodeSnippet,code_snippet\ncodeSnippetResults,code_snippet_results\ncodeVulnerabilityDetails,code_vulnerability_details\ncodeVulnerabilityDetectorName,code_vulnerability_detector_name\ncodeVulnerabilityDetectorTags,code_vulnerability_detector_tags\ncodeVulnerabilityFilePath,code_vulnerability_file_path\ncodebuildRoleArn,codebuild_role_arn\ncodec,codec\ncodegenJobToCreate,codegen_job_to_create\ncognitoIdentityPoolId,cognito_identity_pool_id\ncollaboration,collaboration\ncollaborationAnalysisTemplate,collaboration_analysis_template\ncollaborationAnalysisTemplateSummaries,collaboration_analysis_template_summaries\ncollaborationAnalysisTemplates,collaboration_analysis_templates\ncollaborationArn,collaboration_arn\ncollaborationCreatorAccountId,collaboration_creator_account_id\ncollaborationCreatorDisplayName,collaboration_creator_display_name\ncollaborationId,collaboration_id\ncollaborationIdentifier,collaboration_identifier\ncollaborationList,collaboration_list\ncollaborationName,collaboration_name\ncollectionBindingProperties,collection_binding_properties\ncollectionDetails,collection_details\ncollectionEndpoint,collection_endpoint\ncollectionErrorDetails,collection_error_details\ncollectionFilters,collection_filters\ncollectionProperties,collection_properties\ncollectionScheme,collection_scheme\ncollectionStatus,collection_status\ncollectionSummaries,collection_summaries\ncollectorHealth,collector_health\ncollectorId,collector_id\ncollectorVersion,collector_version\ncolumn,column\ncolumnCount,column_count\ncolumnDefault,column_default\ncolumnDescription,column_description\ncolumnDescriptions,column_descriptions\ncolumnIds,column_ids\ncolumnIndex,column_index\ncolumnMap,column_map\ncolumnMetadata,column_metadata\ncolumnName,column_name\ncolumnNames,column_names\ncolumns,columns\ncombineArtifacts,combine_artifacts\ncommand,command\ncommandLineArguments,command_line_arguments\ncomment,comment\ncommentBody,comment_body\ncommentId,comment_id\ncomments,comments\ncommentsForComparedCommitData,comments_for_compared_commit_data\ncommentsForPullRequestData,comments_for_pull_request_data\ncommit,commit\ncommitId,commit_id\ncommitIds,commit_ids\ncommitMessage,commit_message\ncommitNum,commit_num\ncommitSpecifier,commit_specifier\ncommitTime,commit_time\ncommitTimestampInMillis,commit_timestamp_in_millis\ncommitment,commitment\ncommitmentConfiguration,commitment_configuration\ncommitmentDuration,commitment_duration\ncommitmentExpirationTime,commitment_expiration_time\ncommitmentInformation,commitment_information\ncommitmentLength,commitment_length\ncommits,commits\ncommitter,committer\ncommonName,common_name\ncommunicationBody,communication_body\ncommunicationTypes,communication_types\ncommunications,communications\ncompany,company\ncomparator,comparator\ncomparison,comparison\ncomparisonOperator,comparison_operator\ncompatibilities,compatibilities\ncompatible,compatible\ncompatibleDevices,compatible_devices\ncompatibleEnvironmentTemplates,compatible_environment_templates\ncompatibleNamespaceVersion,compatible_namespace_version\ncomplete,complete\ncompleteTime,complete_time\ncompleteWorkflowExecutionDecisionAttributes,complete_workflow_execution_decision_attributes\ncompleteWorkflowExecutionFailedEventAttributes,complete_workflow_execution_failed_event_attributes\ncompleted,completed\ncompletedAt,completed_at\ncompletedJobs,completed_jobs\ncompletedOn,completed_on\ncompletedSteps,completed_steps\ncompletedTime,completed_time\ncompletionStatus,completion_status\ncompletionTime,completion_time\ncompletionTimeRange,completion_time_range\ncompliance,compliance\ncomplianceCheck,compliance_check\ncomplianceDrifts,compliance_drifts\ncomplianceStatus,compliance_status\ncomplianceType,compliance_type\ncompliantChecks,compliant_checks\ncompliantEvidenceCount,compliant_evidence_count\ncomponent,component\ncomponentArn,component_arn\ncomponentBuildVersionArn,component_build_version_arn\ncomponentCandidates,component_candidates\ncomponentCompliances,component_compliances\ncomponentDependencies,component_dependencies\ncomponentId,component_id\ncomponentLambdaParameters,component_lambda_parameters\ncomponentName,component_name\ncomponentPlatforms,component_platforms\ncomponentRecommendations,component_recommendations\ncomponentRoleArn,component_role_arn\ncomponentState,component_state\ncomponentStatuses,component_statuses\ncomponentSummaryList,component_summary_list\ncomponentToCreate,component_to_create\ncomponentType,component_type\ncomponentTypeId,component_type_id\ncomponentTypeName,component_type_name\ncomponentTypeSummaries,component_type_summaries\ncomponentUpdatePolicy,component_update_policy\ncomponentUpdates,component_updates\ncomponentVersion,component_version\ncomponentVersionArn,component_version_arn\ncomponentVersionList,component_version_list\ncomponentVersions,component_versions\ncomponents,components\ncompositeModel,composite_model\ncompositeSlotTypeSetting,composite_slot_type_setting\ncompressed,compressed\ncompression,compression\ncompressionType,compression_type\ncompute,compute\ncomputeEnvironment,compute_environment\ncomputeEnvironmentArn,compute_environment_arn\ncomputeEnvironmentName,compute_environment_name\ncomputeEnvironmentOrder,compute_environment_order\ncomputeEnvironments,compute_environments\ncomputeLocation,compute_location\ncomputePlatform,compute_platform\ncomputeReservation,compute_reservation\ncomputeResources,compute_resources\ncomputeType,compute_type\ncomputeTypeOverride,compute_type_override\ncomputeTypesAllowed,compute_types_allowed\ncomputedDesiredCount,computed_desired_count\ncomputerAttributes,computer_attributes\nconcat,concat\nconclusionStatement,conclusion_statement\nconcurrentBuildLimit,concurrent_build_limit\nconcurrentDeploymentPercentage,concurrent_deployment_percentage\ncondition,condition\nconditionLanguageVersion,condition_language_version\nconditional,conditional\nconditionalBranches,conditional_branches\nconfidence,confidence\nconfidenceLevel,confidence_level\nconfig,config\nconfigArn,config_arn\nconfigData,config_data\nconfigDetails,config_details\nconfigFileName,config_file_name\nconfigHistoryDeliveryInfo,config_history_delivery_info\nconfigId,config_id\nconfigList,config_list\nconfigParameters,config_parameters\nconfigRecommendations,config_recommendations\nconfigSnapshotDeliveryInfo,config_snapshot_delivery_info\nconfigSnapshotDeliveryProperties,config_snapshot_delivery_properties\nconfigSnapshotId,config_snapshot_id\nconfigStreamDeliveryInfo,config_stream_delivery_info\nconfigType,config_type\nconfigVersion,config_version\nconfiguration,configuration\nconfigurationId,configuration_id\nconfigurationIds,configuration_ids\nconfigurationItemCaptureTime,configuration_item_capture_time\nconfigurationItemMD5Hash,configuration_item_md5_hash\nconfigurationItemStatus,configuration_item_status\nconfigurationItems,configuration_items\nconfigurationOptions,configuration_options\nconfigurationOverrides,configuration_overrides\nconfigurationProfileId,configuration_profile_id\nconfigurationProperties,configuration_properties\nconfigurationSchema,configuration_schema\nconfigurationStateId,configuration_state_id\nconfigurationStatus,configuration_status\nconfigurationSummary,configuration_summary\nconfigurationType,configuration_type\nconfigurationUpdate,configuration_update\nconfigurationUrl,configuration_url\nconfigurationValidationPolicy,configuration_validation_policy\nconfigurationValues,configuration_values\nconfigurations,configurations\nconfigurationsDownloadUrl,configurations_download_url\nconfigureOnly,configure_only\nconfigureScript,configure_script\nconfigureScriptType,configure_script_type\nconfigured,configured\nconfiguredBy,configured_by\nconfiguredTable,configured_table\nconfiguredTableArn,configured_table_arn\nconfiguredTableAssociation,configured_table_association\nconfiguredTableAssociationIdentifier,configured_table_association_identifier\nconfiguredTableAssociationSummaries,configured_table_association_summaries\nconfiguredTableId,configured_table_id\nconfiguredTableIdentifier,configured_table_identifier\nconfiguredTableSummaries,configured_table_summaries\nconfirmationConditional,confirmation_conditional\nconfirmationNextStep,confirmation_next_step\nconfirmationPrompt,confirmation_prompt\nconfirmationResponse,confirmation_response\nconfirmationState,confirmation_state\nconfirmationStatus,confirmation_status\nconfirmationToken,confirmation_token\nconfirmationUrl,confirmation_url\nconflictDetailLevel,conflict_detail_level\nconflictDetection,conflict_detection\nconflictHandler,conflict_handler\nconflictMetadata,conflict_metadata\nconflictMetadataList,conflict_metadata_list\nconflictResolution,conflict_resolution\nconflictResolutionStrategy,conflict_resolution_strategy\nconflicts,conflicts\nconnectContactFlowId,connect_contact_flow_id\nconnectInstanceConfig,connect_instance_config\nconnectInstanceId,connect_instance_id\nconnectInstanceOnboardingJobStatus,connect_instance_onboarding_job_status\nconnectQueueId,connect_queue_id\nconnectSourcePhoneNumber,connect_source_phone_number\nconnected,connected\nconnectedToSystemTime,connected_to_system_time\nconnectionArn,connection_arn\nconnectionId,connection_id\nconnectionMode,connection_mode\nconnectionName,connection_name\nconnectionPool,connection_pool\nconnectionState,connection_state\nconnectionType,connection_type\nconnections,connections\nconnectionsBandwidth,connections_bandwidth\nconnectionsCount,connections_count\nconnectivity,connectivity\nconnectivityAt,connectivity_at\nconnectivityInfo,connectivity_info\nconnectorArn,connector_arn\nconnectorConfig,connector_config\nconnectorConfiguration,connector_configuration\nconnectorConfigurations,connector_configurations\nconnectorDescription,connector_description\nconnectorEntityFields,connector_entity_fields\nconnectorEntityMap,connector_entity_map\nconnectorEntityName,connector_entity_name\nconnectorId,connector_id\nconnectorLabel,connector_label\nconnectorList,connector_list\nconnectorMetadata,connector_metadata\nconnectorModes,connector_modes\nconnectorName,connector_name\nconnectorNamePrefix,connector_name_prefix\nconnectorOperator,connector_operator\nconnectorOwner,connector_owner\nconnectorProfileArn,connector_profile_arn\nconnectorProfileConfig,connector_profile_config\nconnectorProfileCredentials,connector_profile_credentials\nconnectorProfileDetails,connector_profile_details\nconnectorProfileName,connector_profile_name\nconnectorProfileNames,connector_profile_names\nconnectorProfileProperties,connector_profile_properties\nconnectorProvisioningConfig,connector_provisioning_config\nconnectorProvisioningType,connector_provisioning_type\nconnectorRuntimeSettings,connector_runtime_settings\nconnectorState,connector_state\nconnectorSummary,connector_summary\nconnectorSuppliedValueOptions,connector_supplied_value_options\nconnectorSuppliedValues,connector_supplied_values\nconnectorType,connector_type\nconnectorTypes,connector_types\nconnectorVersion,connector_version\nconnectors,connectors\nconsecutiveDatapointsToAlarm,consecutive_datapoints_to_alarm\nconsecutiveDatapointsToClear,consecutive_datapoints_to_clear\nconsoleUrl,console_url\nconstraints,constraints\ncontactArn,contact_arn\ncontactEndpoint,contact_endpoint\ncontactId,contact_id\ncontactList,contact_list\ncontactMethods,contact_methods\ncontactPostPassDurationSeconds,contact_post_pass_duration_seconds\ncontactPrePassDurationSeconds,contact_pre_pass_duration_seconds\ncontactProtocols,contact_protocols\ncontactStatus,contact_status\ncontainer,container\ncontainerAction,container_action\ncontainerArn,container_arn\ncontainerConfigurations,container_configurations\ncontainerDefinitions,container_definitions\ncontainerDistributionConfiguration,container_distribution_configuration\ncontainerImage,container_image\ncontainerImages,container_images\ncontainerInstance,container_instance\ncontainerInstanceArn,container_instance_arn\ncontainerInstanceArns,container_instance_arns\ncontainerInstances,container_instances\ncontainerLogRotationConfiguration,container_log_rotation_configuration\ncontainerName,container_name\ncontainerOrchestrationType,container_orchestration_type\ncontainerOverrides,container_overrides\ncontainerParams,container_params\ncontainerPath,container_path\ncontainerPort,container_port\ncontainerPortRange,container_port_range\ncontainerProperties,container_properties\ncontainerProvider,container_provider\ncontainerProviderId,container_provider_id\ncontainerProviderType,container_provider_type\ncontainerRecipe,container_recipe\ncontainerRecipeArn,container_recipe_arn\ncontainerRecipeSummaryList,container_recipe_summary_list\ncontainerRecommendations,container_recommendations\ncontainerService,container_service\ncontainerServiceName,container_service_name\ncontainerServices,container_services\ncontainerTags,container_tags\ncontainerType,container_type\ncontainers,containers\ncontains,contains\ncontainsDataFromDeletedResources,contains_data_from_deleted_resources\ncontent,content\ncontentArn,content_arn\ncontentConflict,content_conflict\ncontentDeliveryRules,content_delivery_rules\ncontentDisposition,content_disposition\ncontentEncoding,content_encoding\ncontentExpression,content_expression\ncontentHandling,content_handling\ncontentId,content_id\ncontentLength,content_length\ncontentLocation,content_location\ncontentRange,content_range\ncontentReference,content_reference\ncontentSummaries,content_summaries\ncontentSummary,content_summary\ncontentType,content_type\ncontents,contents\ncontext,context\ncontextAttributes,context_attributes\ncontextRowId,context_row_id\ncontexts,contexts\ncontinentCode,continent_code\ncontinuationToken,continuation_token\ncontinueAfterTimeout,continue_after_timeout\ncontinueAsNewWorkflowExecutionDecisionAttributes,continue_as_new_workflow_execution_decision_attributes\ncontinueAsNewWorkflowExecutionFailedEventAttributes,continue_as_new_workflow_execution_failed_event_attributes\ncontinueResponse,continue_response\ncontinuedExecutionRunId,continued_execution_run_id\ncontinuous,continuous\ncontinuousHyperParameterRanges,continuous_hyper_parameter_ranges\ncontractAddress,contract_address\ncontrol,control\ncontrolDomainId,control_domain_id\ncontrolDomainInsights,control_domain_insights\ncontrolId,control_id\ncontrolIdentifier,control_identifier\ncontrolInsightsByAssessment,control_insights_by_assessment\ncontrolInsightsMetadata,control_insights_metadata\ncontrolMappingSources,control_mapping_sources\ncontrolMetadataList,control_metadata_list\ncontrolName,control_name\ncontrolOperation,control_operation\ncontrolPlaneInstanceType,control_plane_instance_type\ncontrolPlanePlacement,control_plane_placement\ncontrolSet,control_set\ncontrolSetId,control_set_id\ncontrolSetName,control_set_name\ncontrolSets,control_sets\ncontrolSetsCount,control_sets_count\ncontrolSources,control_sources\ncontrolStatus,control_status\ncontrolTreatmentName,control_treatment_name\ncontrolType,control_type\ncontrols,controls\ncontrolsCount,controls_count\ncontrolsCountByNoncompliantEvidence,controls_count_by_noncompliant_evidence\nconversationDurationSeconds,conversation_duration_seconds\nconversationEndState,conversation_end_state\nconversationEndTime,conversation_end_time\nconversationId,conversation_id\nconversationLevelResult,conversation_level_result\nconversationLevelTestResults,conversation_level_test_results\nconversationLevelTestResultsFilterBy,conversation_level_test_results_filter_by\nconversationLogSettings,conversation_log_settings\nconversationLogs,conversation_logs\nconversationLogsDataSource,conversation_logs_data_source\nconversationMode,conversation_mode\nconversationStartTime,conversation_start_time\nconversionProperties,conversion_properties\nconversionServerID,conversion_server_id\ncookieSynchronizationConfiguration,cookie_synchronization_configuration\ncookiesAllowList,cookies_allow_list\ncopyAllowed,copy_allowed\ncopyImageSetInformation,copy_image_set_information\ncopyPrivateIp,copy_private_ip\ncopyTags,copy_tags\ncoreCount,core_count\ncoreDeviceExecutionStatus,core_device_execution_status\ncoreDeviceThingName,core_device_thing_name\ncoreDevices,core_devices\ncoreVersion,core_version\ncores,cores\ncorrelationData,correlation_data\ncors,cors\ncost,cost\ncostEstimates,cost_estimates\ncostOptimizing,cost_optimizing\ncount,count\ncounters,counters\ncountersToAggregate,counters_to_aggregate\ncountry,country\ncountryCode,country_code\ncounts,counts\ncountsByGroup,counts_by_group\ncoveredResources,covered_resources\ncpiSecretKey,cpi_secret_key\ncpiUserId,cpi_user_id\ncpiUserPassword,cpi_user_password\ncpiUsername,cpi_username\ncpu,cpu\ncpuArchitecture,cpu_architecture\ncpuCount,cpu_count\ncpuOptions,cpu_options\ncpuPerformanceMetricBasis,cpu_performance_metric_basis\ncpuUtilizationPercentage,cpu_utilization_percentage\ncpuVendorArchitectures,cpu_vendor_architectures\ncpus,cpus\ncr,cr\ncrawlerArn,crawler_arn\ncrawlerConfiguration,crawler_configuration\ncreateCollectionDetail,create_collection_detail\ncreateDate,create_date\ncreateDelegationRequest,create_delegation_request\ncreateDelegationRequests,create_delegation_requests\ncreatePublicIP,create_public_ip\ncreateSimulationJobRequests,create_simulation_job_requests\ncreateStatus,create_status\ncreateTime,create_time\ncreateTimeRange,create_time_range\ncreateTimestamp,create_timestamp\ncreateVersion,create_version\ncreateVpcEndpointDetail,create_vpc_endpoint_detail\ncreated,created\ncreatedAfter,created_after\ncreatedAt,created_at\ncreatedAtAfter,created_at_after\ncreatedAtBefore,created_at_before\ncreatedBefore,created_before\ncreatedBy,created_by\ncreatedCount,created_count\ncreatedDate,created_date\ncreatedOn,created_on\ncreatedReason,created_reason\ncreatedRequestCount,created_request_count\ncreatedRequests,created_requests\ncreatedRows,created_rows\ncreatedTime,created_time\ncreatedTimeStamp,created_time_stamp\ncreatedTimestamp,created_timestamp\ncreationDate,creation_date\ncreationDateTime,creation_date_time\ncreationTime,creation_time\ncreationTimeAfter,creation_time_after\ncreationTimeBefore,creation_time_before\ncreationTimeInMillis,creation_time_in_millis\ncreationTimeRange,creation_time_range\ncreationTimestamp,creation_timestamp\ncreationType,creation_type\ncreator,creator\ncreatorAccountId,creator_account_id\ncreatorDisplayName,creator_display_name\ncreatorId,creator_id\ncreatorMemberAbilities,creator_member_abilities\ncredential,credential\ncredentialDurationSeconds,credential_duration_seconds\ncredentialProvider,credential_provider\ncredentialSpecs,credential_specs\ncredentialType,credential_type\ncredentials,credentials\ncredentialsArn,credentials_arn\ncredentialsMap,credentials_map\ncredentialsParameter,credentials_parameter\ncriteria,criteria\ncriteriaList,criteria_list\ncriterion,criterion\ncritical,critical\ncrl,crl\ncrlArn,crl_arn\ncrlData,crl_data\ncrlId,crl_id\ncrls,crls\ncrossAccountRoleArns,cross_account_role_arns\ncsv,csv\ncsvIndexToVariableMap,csv_index_to_variable_map\ncsvInputTemplate,csv_input_template\ncta,cta\ncumulativeGasUsed,cumulative_gas_used\ncurrencies,currencies\ncurrency,currency\ncurrencyCode,currency_code\ncurrent,current\ncurrentApplicationVersion,current_application_version\ncurrentApplyDate,current_apply_date\ncurrentAttemptCount,current_attempt_count\ncurrentBackupRateInMegaBytesPerSecond,current_backup_rate_in_mega_bytes_per_second\ncurrentBuildSummary,current_build_summary\ncurrentConfiguration,current_configuration\ncurrentDeployment,current_deployment\ncurrentDeploymentGroupName,current_deployment_group_name\ncurrentEphemeris,current_ephemeris\ncurrentInstanceGpuInfo,current_instance_gpu_info\ncurrentInstanceType,current_instance_type\ncurrentLabel,current_label\ncurrentLicenseConfiguration,current_license_configuration\ncurrentMemorySize,current_memory_size\ncurrentPerformanceRisk,current_performance_risk\ncurrentPerformanceRiskRatings,current_performance_risk_ratings\ncurrentPhase,current_phase\ncurrentPlan,current_plan\ncurrentPricingPlan,current_pricing_plan\ncurrentProgress,current_progress\ncurrentRevision,current_revision\ncurrentRevisionId,current_revision_id\ncurrentRpoInSecs,current_rpo_in_secs\ncurrentRtoInSecs,current_rto_in_secs\ncurrentServiceConfiguration,current_service_configuration\ncurrentVersion,current_version\ncursor,cursor\ncustom,custom\ncustomAuthConfigs,custom_auth_configs\ncustomAuthenticationType,custom_authentication_type\ncustomCodeSigning,custom_code_signing\ncustomControlsCount,custom_controls_count\ncustomDNSConfiguration,custom_dns_configuration\ncustomDNSServerIP,custom_dns_server_ip\ncustomDNSServerName,custom_dns_server_name\ncustomData,custom_data\ncustomDataIdentifierId,custom_data_identifier_id\ncustomDataIdentifierIds,custom_data_identifier_ids\ncustomDataIdentifiers,custom_data_identifiers\ncustomDomainName,custom_domain_name\ncustomDomains,custom_domains\ncustomFields,custom_fields\ncustomHeaders,custom_headers\ncustomImageName,custom_image_name\ncustomModelArn,custom_model_arn\ncustomModelKmsKeyId,custom_model_kms_key_id\ncustomModelName,custom_model_name\ncustomModelTags,custom_model_tags\ncustomModelTrainingParameters,custom_model_training_parameters\ncustomModelTransformParameters,custom_model_transform_parameters\ncustomPayload,custom_payload\ncustomPlugin,custom_plugin\ncustomPluginArn,custom_plugin_arn\ncustomPluginState,custom_plugin_state\ncustomPlugins,custom_plugins\ncustomProperties,custom_properties\ncustomRules,custom_rules\ncustomVocabularyExportSpecification,custom_vocabulary_export_specification\ncustomVocabularyImportSpecification,custom_vocabulary_import_specification\ncustomVocabularyItemList,custom_vocabulary_item_list\ncustomVocabularyItems,custom_vocabulary_items\ncustomVocabularyStatus,custom_vocabulary_status\ncustomerAccountId,customer_account_id\ncustomerAction,customer_action\ncustomerAddress,customer_address\ncustomerArtifactPaths,customer_artifact_paths\ncustomerDefinedValues,customer_defined_values\ncustomerId,customer_id\ncustomerManaged,customer_managed\ncustomerManagedKey,customer_managed_key\ncustomerManagedKeyArn,customer_managed_key_arn\ncustomerManagedKeyIdentifier,customer_managed_key_identifier\ncustomerManagedS3,customer_managed_s3\ncustomerManagedS3Storage,customer_managed_s3_storage\ncustomerRouterConfig,customer_router_config\ncustomerVersion,customer_version\ncustomizationsSupported,customizations_supported\ncvss,cvss\ncvss2,cvss2\ncvss3,cvss3\ncvssSource,cvss_source\ncwes,cwes\ndailyReportsOnly,daily_reports_only\ndailySchedule,daily_schedule\ndashboardArn,dashboard_arn\ndashboardCreationDate,dashboard_creation_date\ndashboardDefinition,dashboard_definition\ndashboardDescription,dashboard_description\ndashboardEndpoint,dashboard_endpoint\ndashboardId,dashboard_id\ndashboardLastUpdateDate,dashboard_last_update_date\ndashboardName,dashboard_name\ndashboardSummaries,dashboard_summaries\ndashboardValidationMessages,dashboard_validation_messages\ndata,data\ndataAccessRoleArn,data_access_role_arn\ndataApiRoleArn,data_api_role_arn\ndataBundles,data_bundles\ndataCharacterEncoding,data_character_encoding\ndataCollected,data_collected\ndataCollectionDetails,data_collection_details\ndataCollectionStatus,data_collection_status\ndataDelivery,data_delivery\ndataDestinationConfigs,data_destination_configs\ndataEncryptionMetadata,data_encryption_metadata\ndataExtraDimensions,data_extra_dimensions\ndataFormat,data_format\ndataItems,data_items\ndataLakeArn,data_lake_arn\ndataLakeSources,data_lake_sources\ndataLakes,data_lakes\ndataLocation,data_location\ndataLocationConstraint,data_location_constraint\ndataPlaneRouting,data_plane_routing\ndataPrivacy,data_privacy\ndataProcessingJobId,data_processing_job_id\ndataProtectionStatus,data_protection_status\ndataPullEndTime,data_pull_end_time\ndataPullMode,data_pull_mode\ndataPullStartTime,data_pull_start_time\ndataReplicationError,data_replication_error\ndataReplicationInfo,data_replication_info\ndataReplicationInitiation,data_replication_initiation\ndataReplicationState,data_replication_state\ndataSet,data_set\ndataSetImportTasks,data_set_import_tasks\ndataSetName,data_set_name\ndataSetOrg,data_set_org\ndataSetPublicationDate,data_set_publication_date\ndataSetRequestId,data_set_request_id\ndataSetType,data_set_type\ndataSets,data_sets\ndataSize,data_size\ndataSource,data_source\ndataSourceArn,data_source_arn\ndataSourceConfig,data_source_config\ndataSourceName,data_source_name\ndataSourceNames,data_source_names\ndataSourceType,data_source_type\ndataSourceUrl,data_source_url\ndataSources,data_sources\ndataTimestamp,data_timestamp\ndataTraceEnabled,data_trace_enabled\ndataTransferApi,data_transfer_api\ndataTransferApis,data_transfer_apis\ndataType,data_type\ndataTypeName,data_type_name\ndataTypeSpec,data_type_spec\ndataTypeValue,data_type_value\ndataURI,data_uri\ndataValidationMetrics,data_validation_metrics\ndataViewArn,data_view_arn\ndataViewId,data_view_id\ndataViews,data_views\ndatabase,database\ndatabaseArn,database_arn\ndatabaseConfigDetail,database_config_detail\ndatabaseManagementPreference,database_management_preference\ndatabaseMigrationPreference,database_migration_preference\ndatabaseName,database_name\ndatabasePreferences,database_preferences\ndatabaseUrl,database_url\ndatabases,databases\ndatacenterName,datacenter_name\ndataflowDestinationRegion,dataflow_destination_region\ndataflowEdges,dataflow_edges\ndataflowEndpointGroupArn,dataflow_endpoint_group_arn\ndataflowEndpointGroupId,dataflow_endpoint_group_id\ndataflowEndpointGroupList,dataflow_endpoint_group_list\ndataflowEndpointName,dataflow_endpoint_name\ndataflowEndpointRegion,dataflow_endpoint_region\ndataflowId,dataflow_id\ndataflowList,dataflow_list\ndataflowSourceRegion,dataflow_source_region\ndatakey,datakey\ndatapointsCollectionPercentage,datapoints_collection_percentage\ndatapointsToAlarm,datapoints_to_alarm\ndataset,dataset\ndatasetArn,dataset_arn\ndatasetContentSummaries,dataset_content_summaries\ndatasetContentVersionValue,dataset_content_version_value\ndatasetDescription,dataset_description\ndatasetExportJob,dataset_export_job\ndatasetExportJobArn,dataset_export_job_arn\ndatasetExportJobs,dataset_export_jobs\ndatasetGroup,dataset_group\ndatasetGroupArn,dataset_group_arn\ndatasetGroups,dataset_groups\ndatasetId,dataset_id\ndatasetImportJob,dataset_import_job\ndatasetImportJobArn,dataset_import_job_arn\ndatasetImportJobs,dataset_import_jobs\ndatasetName,dataset_name\ndatasetOrg,dataset_org\ndatasetPermissions,dataset_permissions\ndatasetSummaries,dataset_summaries\ndatasetTitle,dataset_title\ndatasetType,dataset_type\ndatasets,datasets\ndatastore,datastore\ndatastoreArn,datastore_arn\ndatastoreId,datastore_id\ndatastoreName,datastore_name\ndatastorePartitions,datastore_partitions\ndatastoreProperties,datastore_properties\ndatastoreStatus,datastore_status\ndatastoreStorage,datastore_storage\ndatastoreSummaries,datastore_summaries\ndatasyncErrorCode,datasync_error_code\ndate,date\ndateAdded,date_added\ndateCreated,date_created\ndateDue,date_due\ndateLastRun,date_last_run\ndateNextRun,date_next_run\ndateRangeFilter,date_range_filter\ndateUpdated,date_updated\ndatesWithoutSupport,dates_without_support\ndatetimeTypeFieldName,datetime_type_field_name\ndayOfMonth,day_of_month\ndayOfWeek,day_of_week\ndays,days\ndbClusterIdentifier,db_cluster_identifier\ndbClusterOrInstanceArn,db_cluster_or_instance_arn\ndbConnectionId,db_connection_id\ndbEngineVersion,db_engine_version\ndbName,db_name\ndbPassword,db_password\ndbPath,db_path\ndbPaths,db_paths\ndbUser,db_user\ndebugSession,debug_session\ndebugSessionEnabled,debug_session_enabled\ndecimalReturnType,decimal_return_type\ndecision,decision\ndecisionTaskCompletedEventAttributes,decision_task_completed_event_attributes\ndecisionTaskCompletedEventId,decision_task_completed_event_id\ndecisionTaskScheduledEventAttributes,decision_task_scheduled_event_attributes\ndecisionTaskStartedEventAttributes,decision_task_started_event_attributes\ndecisionTaskTimedOutEventAttributes,decision_task_timed_out_event_attributes\ndecisionType,decision_type\ndecisions,decisions\ndeclinationConditional,declination_conditional\ndeclinationNextStep,declination_next_step\ndeclinationResponse,declination_response\ndecodeConfig,decode_config\ndecoderManifestArn,decoder_manifest_arn\ndecryptionError,decryption_error\ndedicatedServiceAccountId,dedicated_service_account_id\ndedupeString,dedupe_string\ndeepLink,deep_link\ndefaultAction,default_action\ndefaultAssessmentReportsDestination,default_assessment_reports_destination\ndefaultAttributes,default_attributes\ndefaultAuthorizerName,default_authorizer_name\ndefaultBranch,default_branch\ndefaultBranchName,default_branch_name\ndefaultCacheBehavior,default_cache_behavior\ndefaultCapacityProviderStrategy,default_capacity_provider_strategy\ndefaultChecked,default_checked\ndefaultChildPolicy,default_child_policy\ndefaultClientId,default_client_id\ndefaultCountryCode,default_country_code\ndefaultDevices,default_devices\ndefaultDisplayVersion,default_display_version\ndefaultDomain,default_domain\ndefaultExecutionStartToCloseTimeout,default_execution_start_to_close_timeout\ndefaultExportDestination,default_export_destination\ndefaultFormat,default_format\ndefaultGateway,default_gateway\ndefaultHyperParameterRanges,default_hyper_parameter_ranges\ndefaultHyperParameters,default_hyper_parameters\ndefaultIamRoleArn,default_iam_role_arn\ndefaultJobTimeoutMinutes,default_job_timeout_minutes\ndefaultLambdaRole,default_lambda_role\ndefaultLargeStagingDiskType,default_large_staging_disk_type\ndefaultLayout,default_layout\ndefaultLogLevel,default_log_level\ndefaultParameters,default_parameters\ndefaultPrefix,default_prefix\ndefaultProcessOwners,default_process_owners\ndefaultRegistryAlias,default_registry_alias\ndefaultResourceConfig,default_resource_config\ndefaultResponse,default_response\ndefaultResultConfiguration,default_result_configuration\ndefaultServerSideEncryption,default_server_side_encryption\ndefaultTTL,default_ttl\ndefaultTargetHostname,default_target_hostname\ndefaultTaskHeartbeatTimeout,default_task_heartbeat_timeout\ndefaultTaskList,default_task_list\ndefaultTaskPriority,default_task_priority\ndefaultTaskScheduleToCloseTimeout,default_task_schedule_to_close_timeout\ndefaultTaskScheduleToStartTimeout,default_task_schedule_to_start_timeout\ndefaultTaskStartToCloseTimeout,default_task_start_to_close_timeout\ndefaultTimeToLive,default_time_to_live\ndefaultValue,default_value\ndefaultValueList,default_value_list\ndefaultValueSpec,default_value_spec\ndefaultValueSpecification,default_value_specification\ndefaultVariation,default_variation\ndefaultVersion,default_version\ndefaultVersionId,default_version_id\ndefaultVersionName,default_version_name\ndefinedIn,defined_in\ndefinition,definition\ndefinitionContent,definition_content\ndefinitionUri,definition_uri\ndefinitionZip,definition_zip\ndelayInSeconds,delay_in_seconds\ndelegatedAdmin,delegated_admin\ndelegatedAdminAccount,delegated_admin_account\ndelegatedAdminAccountId,delegated_admin_account_id\ndelegatedAdminAccounts,delegated_admin_accounts\ndelegationId,delegation_id\ndelegationIds,delegation_ids\ndelegations,delegations\ndelete,delete\ndeleteAdditionalMetricsToRetain,delete_additional_metrics_to_retain\ndeleteAlertTargets,delete_alert_targets\ndeleteAuditHistory,delete_audit_history\ndeleteBehaviors,delete_behaviors\ndeleteCollectionDetail,delete_collection_detail\ndeleteFiles,delete_files\ndeleteOnTermination,delete_on_termination\ndeletePipelineProvisioningRepository,delete_pipeline_provisioning_repository\ndeleteReports,delete_reports\ndeleteResources,delete_resources\ndeleteScheduledAudits,delete_scheduled_audits\ndeleteStack,delete_stack\ndeleteStream,delete_stream\ndeleteVpcEndpointDetail,delete_vpc_endpoint_detail\ndeleted,deleted\ndeletedAt,deleted_at\ndeletedBranch,deleted_branch\ndeletedPackage,deleted_package\ndeletedResources,deleted_resources\ndeletes,deletes\ndeletionCharacter,deletion_character\ndeletionProtected,deletion_protected\ndelimitedTextOptions,delimited_text_options\ndelimiter,delimiter\ndeliveryChannelName,delivery_channel_name\ndeliveryFrequency,delivery_frequency\ndeliveryStream,delivery_stream\ndeliveryStreamName,delivery_stream_name\ndeltaSyncConfig,delta_sync_config\ndeltaSyncTableName,delta_sync_table_name\ndeltaSyncTableTTL,delta_sync_table_ttl\ndeltaTime,delta_time\ndeltaTimeSessionWindowConfiguration,delta_time_session_window_configuration\ndemodulationConfig,demodulation_config\ndenied,denied\ndeniesUnencryptedObjectUploads,denies_unencrypted_object_uploads\ndenyListedAgentlessCollectors,deny_listed_agentless_collectors\ndenyListedMeCollectors,deny_listed_me_collectors\ndependencies,dependencies\ndependencyType,dependency_type\ndependsOn,depends_on\ndependsOnAlarms,depends_on_alarms\ndeployAsNew,deploy_as_new\ndeployed,deployed\ndeployedVersion,deployed_version\ndeployment,deployment\ndeploymentApplicationConfigs,deployment_application_configs\ndeploymentArtifacts,deployment_artifacts\ndeploymentCircuitBreaker,deployment_circuit_breaker\ndeploymentConfig,deployment_config\ndeploymentConfigId,deployment_config_id\ndeploymentConfigInfo,deployment_config_info\ndeploymentConfigName,deployment_config_name\ndeploymentConfigsList,deployment_configs_list\ndeploymentConfiguration,deployment_configuration\ndeploymentController,deployment_controller\ndeploymentDetail,deployment_detail\ndeploymentFinishTime,deployment_finish_time\ndeploymentGroupId,deployment_group_id\ndeploymentGroupInfo,deployment_group_info\ndeploymentGroupName,deployment_group_name\ndeploymentGroupNames,deployment_group_names\ndeploymentGroups,deployment_groups\ndeploymentGroupsInfo,deployment_groups_info\ndeploymentId,deployment_id\ndeploymentIds,deployment_ids\ndeploymentInfo,deployment_info\ndeploymentJobs,deployment_jobs\ndeploymentName,deployment_name\ndeploymentOption,deployment_option\ndeploymentOverview,deployment_overview\ndeploymentPolicies,deployment_policies\ndeploymentReadyOption,deployment_ready_option\ndeploymentStartTime,deployment_start_time\ndeploymentStatus,deployment_status\ndeploymentStatusMessage,deployment_status_message\ndeploymentStatusMessages,deployment_status_messages\ndeploymentStrategy,deployment_strategy\ndeploymentStyle,deployment_style\ndeploymentTarget,deployment_target\ndeploymentTargetType,deployment_target_type\ndeploymentTargets,deployment_targets\ndeploymentType,deployment_type\ndeploymentWaitType,deployment_wait_type\ndeployments,deployments\ndeploymentsInfo,deployments_info\ndeprecateExistingEntities,deprecate_existing_entities\ndeprecated,deprecated\ndeprecationDate,deprecation_date\ndeprecationMessage,deprecation_message\nderegisterTime,deregister_time\nderegisteredAt,deregistered_at\nderegistrationPolicy,deregistration_policy\ndescending,descending\ndescription,description\ndescriptions,descriptions\ndescriptiveText,descriptive_text\ndesiredCapacity,desired_capacity\ndesiredChange,desired_change\ndesiredCount,desired_count\ndesiredModelArn,desired_model_arn\ndesiredModelId,desired_model_id\ndesiredModelUnits,desired_model_units\ndesiredProvisionedModelName,desired_provisioned_model_name\ndesiredSize,desired_size\ndesiredState,desired_state\ndesiredStatus,desired_status\ndesiredvCpus,desiredv_cpus\ndestination,destination\ndestinationAccessToken,destination_access_token\ndestinationAccount,destination_account\ndestinationArn,destination_arn\ndestinationBranch,destination_branch\ndestinationCommit,destination_commit\ndestinationCommitId,destination_commit_id\ndestinationCommitSpecifier,destination_commit_specifier\ndestinationConfig,destination_config\ndestinationConfiguration,destination_configuration\ndestinationConnectionState,destination_connection_state\ndestinationConnectorLabel,destination_connector_label\ndestinationConnectorProperties,destination_connector_properties\ndestinationConnectorType,destination_connector_type\ndestinationField,destination_field\ndestinationFlowConfigList,destination_flow_config_list\ndestinationImageSet,destination_image_set\ndestinationImageSetProperties,destination_image_set_properties\ndestinationInfo,destination_info\ndestinationName,destination_name\ndestinationOptions,destination_options\ndestinationPackageVersions,destination_package_versions\ndestinationPath,destination_path\ndestinationPort,destination_port\ndestinationPrefix,destination_prefix\ndestinationProperties,destination_properties\ndestinationReference,destination_reference\ndestinationRegion,destination_region\ndestinationRepository,destination_repository\ndestinationS3BucketName,destination_s3_bucket_name\ndestinationS3Location,destination_s3_location\ndestinationS3Prefix,destination_s3_prefix\ndestinationServerId,destination_server_id\ndestinationSummaries,destination_summaries\ndestinationTableId,destination_table_id\ndestinationType,destination_type\ndestinationTypeParams,destination_type_params\ndestinationTypeProperties,destination_type_properties\ndestinations,destinations\ndetachedObjectIdentifier,detached_object_identifier\ndetail,detail\ndetailedMessage,detailed_message\ndetailedResultsLocation,detailed_results_location\ndetails,details\ndetailsMap,details_map\ndetectSentiment,detect_sentiment\ndetectionPlatforms,detection_platforms\ndetections,detections\ndetector,detector\ndetectorDebugOptions,detector_debug_options\ndetectorId,detector_id\ndetectorModel,detector_model\ndetectorModelArn,detector_model_arn\ndetectorModelConfiguration,detector_model_configuration\ndetectorModelDefinition,detector_model_definition\ndetectorModelDescription,detector_model_description\ndetectorModelName,detector_model_name\ndetectorModelSummaries,detector_model_summaries\ndetectorModelVersion,detector_model_version\ndetectorModelVersionSummaries,detector_model_version_summaries\ndetectorName,detector_name\ndetectorSummaries,detector_summaries\ndetectorTags,detector_tags\ndetectorVersion,detector_version\ndetectorVersionId,detector_version_id\ndetectorVersionStatus,detector_version_status\ndetectorVersionSummaries,detector_version_summaries\ndetectors,detectors\ndeterminingPolicies,determining_policies\ndevEnvironmentId,dev_environment_id\ndevice,device\ndeviceArn,device_arn\ndeviceCapabilities,device_capabilities\ndeviceCapacities,device_capacities\ndeviceCertificateArn,device_certificate_arn\ndeviceCertificateId,device_certificate_id\ndeviceCode,device_code\ndeviceConfig,device_config\ndeviceDefender,device_defender\ndeviceDefenderIndexingMode,device_defender_indexing_mode\ndeviceHostPaths,device_host_paths\ndeviceId,device_id\ndeviceIdentifier,device_identifier\ndeviceIdentifierArn,device_identifier_arn\ndeviceIdentifiers,device_identifiers\ndeviceInstance,device_instance\ndeviceInstances,device_instances\ndeviceMinutes,device_minutes\ndeviceName,device_name\ndeviceParameters,device_parameters\ndevicePermissionRoleArn,device_permission_role_arn\ndevicePool,device_pool\ndevicePoolArn,device_pool_arn\ndevicePools,device_pools\ndeviceQueueInfo,device_queue_info\ndeviceRegistryEnrich,device_registry_enrich\ndeviceRoleArn,device_role_arn\ndeviceSelectionConfiguration,device_selection_configuration\ndeviceSelectionResult,device_selection_result\ndeviceShadowEnrich,device_shadow_enrich\ndeviceState,device_state\ndeviceStatus,device_status\ndeviceTemplateName,device_template_name\ndeviceTemplates,device_templates\ndeviceType,device_type\ndeviceUdid,device_udid\ndevices,devices\ndfeQueryEngine,dfe_query_engine\ndiagnostics,diagnostics\ndiagnosticsMode,diagnostics_mode\ndialRequests,dial_requests\ndialerConfig,dialer_config\ndialingCapacity,dialing_capacity\ndialogAction,dialog_action\ndialogActionType,dialog_action_type\ndialogCodeHook,dialog_code_hook\ndialogState,dialog_state\ndiffType,diff_type\ndifferences,differences\ndigest,digest\ndimensionColumns,dimension_columns\ndimensionName,dimension_name\ndimensionNames,dimension_names\ndimensionValueOperator,dimension_value_operator\ndimensions,dimensions\ndirectConnectGateway,direct_connect_gateway\ndirectConnectGatewayAssociation,direct_connect_gateway_association\ndirectConnectGatewayAssociationProposal,direct_connect_gateway_association_proposal\ndirectConnectGatewayAssociationProposals,direct_connect_gateway_association_proposals\ndirectConnectGatewayAssociations,direct_connect_gateway_associations\ndirectConnectGatewayAttachments,direct_connect_gateway_attachments\ndirectConnectGatewayId,direct_connect_gateway_id\ndirectConnectGatewayName,direct_connect_gateway_name\ndirectConnectGatewayOwnerAccount,direct_connect_gateway_owner_account\ndirectConnectGatewayState,direct_connect_gateway_state\ndirectConnectGateways,direct_connect_gateways\ndirection,direction\ndirectory,directory\ndirectoryId,directory_id\ndirectoryName,directory_name\ndirectoryType,directory_type\ndisableActionConfiguration,disable_action_configuration\ndisableActionRequests,disable_action_requests\ndisableAllLogs,disable_all_logs\ndisableBackupRetention,disable_backup_retention\ndisableEmailNotification,disable_email_notification\ndisableExecuteApiEndpoint,disable_execute_api_endpoint\ndisableNetworking,disable_networking\ndisablePlayback,disable_playback\ndisableSSO,disable_sso\ndisabledAt,disabled_at\ndisabledOnInitialization,disabled_on_initialization\ndisabledReason,disabled_reason\ndisassociatedAt,disassociated_at\ndisassociatedDataStorage,disassociated_data_storage\ndisassociatedRepositoryNames,disassociated_repository_names\ndisconnectAfterInSeconds,disconnect_after_in_seconds\ndisconnectReason,disconnect_reason\ndisconnectTimeoutInMinutes,disconnect_timeout_in_minutes\ndiscoveredIntentCount,discovered_intent_count\ndiscoveredSlotTypeCount,discovered_slot_type_count\ndiscoveryArn,discovery_arn\ndiscoveryData,discovery_data\ndiscoveryName,discovery_name\ndiscoveryUrl,discovery_url\ndisk,disk\ndiskImageFormat,disk_image_format\ndiskName,disk_name\ndiskPath,disk_path\ndiskSize,disk_size\ndiskSizeInGb,disk_size_in_gb\ndiskSnapshot,disk_snapshot\ndiskSnapshotInfo,disk_snapshot_info\ndiskSnapshotName,disk_snapshot_name\ndiskSnapshots,disk_snapshots\ndisks,disks\ndisplay,display\ndisplayAs,display_as\ndisplayId,display_id\ndisplayName,display_name\ndisplayValue,display_value\ndisruptionScore,disruption_score\ndistinctOutgoingEdgeLabels,distinct_outgoing_edge_labels\ndistinctUsers,distinct_users\ndistribution,distribution\ndistributionConfiguration,distribution_configuration\ndistributionConfigurationArn,distribution_configuration_arn\ndistributionConfigurationSummaryList,distribution_configuration_summary_list\ndistributionDomainName,distribution_domain_name\ndistributionHostedZoneId,distribution_hosted_zone_id\ndistributionName,distribution_name\ndistributions,distributions\ndns,dns\ndnsEntry,dns_entry\ndnsIpAddresses,dns_ip_addresses\ndnsName,dns_name\ndnsPolicy,dns_policy\ndnsRecord,dns_record\ndnsRecordCreationState,dns_record_creation_state\ndnsSearchDomains,dns_search_domains\ndnsServers,dns_servers\ndnsStatus,dns_status\ndockerLabels,docker_labels\ndockerSecurityOptions,docker_security_options\ndockerURI,docker_uri\ndockerVersion,docker_version\ndockerVolumeConfiguration,docker_volume_configuration\ndockerfileTemplateData,dockerfile_template_data\ndockerfileTemplateUri,dockerfile_template_uri\ndocs,docs\ndocument,document\ndocumentIdentifier,document_identifier\ndocumentName,document_name\ndocumentParameters,document_parameters\ndocumentSource,document_source\ndocumentType,document_type\ndocumentVersion,document_version\ndocumentation,documentation\ndocumentationPartId,documentation_part_id\ndocumentationVersion,documentation_version\ndocuments,documents\ndomain,domain\ndomainArn,domain_arn\ndomainAssociation,domain_association\ndomainAssociationArn,domain_association_arn\ndomainAssociations,domain_associations\ndomainConfigurationArn,domain_configuration_arn\ndomainConfigurationName,domain_configuration_name\ndomainConfigurationStatus,domain_configuration_status\ndomainConfigurations,domain_configurations\ndomainDetails,domain_details\ndomainEntries,domain_entries\ndomainEntry,domain_entry\ndomainEntryPoint,domain_entry_point\ndomainId,domain_id\ndomainInfo,domain_info\ndomainInfos,domain_infos\ndomainName,domain_name\ndomainNameConfig,domain_name_config\ndomainNameConfigs,domain_name_configs\ndomainNameStatus,domain_name_status\ndomainNameStatusMessage,domain_name_status_message\ndomainOwner,domain_owner\ndomainStatus,domain_status\ndomainType,domain_type\ndomainValidationOptions,domain_validation_options\ndomainValidationRecords,domain_validation_records\ndomains,domains\ndoubleValue,double_value\ndownlinkBandwidthBits,downlink_bandwidth_bits\ndownlinkDelayMs,downlink_delay_ms\ndownlinkJitterMs,downlink_jitter_ms\ndownlinkLossPercent,downlink_loss_percent\ndownloadAllowed,download_allowed\ndownloadArtifactsUrl,download_artifacts_url\ndownloadConditionFile,download_condition_file\ndownloadUrl,download_url\ndriftStatus,drift_status\ndriftType,drift_type\ndriver,driver\ndriverOpts,driver_opts\ndrop,drop\ndryRun,dry_run\ndtcRequestIntervalSeconds,dtc_request_interval_seconds\ndtmfSpecification,dtmf_specification\nduration,duration\ndurationExpression,duration_expression\ndurationInMinutes,duration_in_minutes\ndurationInNanoSeconds,duration_in_nano_seconds\ndurationInSeconds,duration_in_seconds\ndurationRange,duration_range\ndurationSeconds,duration_seconds\ndurations,durations\ndynamicParameters,dynamic_parameters\ndynamoDB,dynamo_db\ndynamoDBv2,dynamo_dbv2\ndynamodb,dynamodb\ndynamodbConfig,dynamodb_config\neTag,e_tag\nearlierTime,earlier_time\nearliestRestorableTimestamp,earliest_restorable_timestamp\nebs,ebs\nebsEncryption,ebs_encryption\nebsEncryptionKeyArn,ebs_encryption_key_arn\nebsSnapshots,ebs_snapshots\nebsVolumeID,ebs_volume_id\nec2,ec2\nec2Configuration,ec2_configuration\nec2ImageId,ec2_image_id\nec2InstanceFamily,ec2_instance_family\nec2InstanceID,ec2_instance_id\nec2InstanceId,ec2_instance_id\nec2InstanceImageId,ec2_instance_image_id\nec2InstanceState,ec2_instance_state\nec2InstanceSubnetId,ec2_instance_subnet_id\nec2InstanceTags,ec2_instance_tags\nec2InstanceType,ec2_instance_type\nec2InstanceTypes,ec2_instance_types\nec2InstanceVpcId,ec2_instance_vpc_id\nec2KeyName,ec2_key_name\nec2KeyPair,ec2_key_pair\nec2LaunchTemplateID,ec2_launch_template_id\nec2ScanStatus,ec2_scan_status\nec2SecurityGroupIds,ec2_security_group_ids\nec2SshKey,ec2_ssh_key\nec2SubnetIds,ec2_subnet_ids\nec2TagFilters,ec2_tag_filters\nec2TagSet,ec2_tag_set\nec2TagSetList,ec2_tag_set_list\necr,ecr\necrConfiguration,ecr_configuration\necrImage,ecr_image\necrImageArchitecture,ecr_image_architecture\necrImageHash,ecr_image_hash\necrImagePullerRole,ecr_image_puller_role\necrImagePushedAt,ecr_image_pushed_at\necrImageRegistry,ecr_image_registry\necrImageRepositoryName,ecr_image_repository_name\necrImageTags,ecr_image_tags\necrRepository,ecr_repository\necrRepositoryName,ecr_repository_name\necrRepositoryPrefix,ecr_repository_prefix\necrRepositoryPrefixes,ecr_repository_prefixes\necsClusterArn,ecs_cluster_arn\necsServiceRecommendations,ecs_service_recommendations\necsServices,ecs_services\necsTarget,ecs_target\nedgeLabels,edge_labels\nedgeProperties,edge_properties\nedgeStructures,edge_structures\neditContent,edit_content\neditor,editor\neffect,effect\neffectiveDateTime,effective_date_time\neffectiveDeployments,effective_deployments\neffectiveGasPrice,effective_gas_price\neffectiveOn,effective_on\neffectivePermission,effective_permission\neffectivePolicies,effective_policies\neffectiveRecommendationPreferences,effective_recommendation_preferences\neffectiveSettings,effective_settings\neffectiveTime,effective_time\nefsVolumeConfiguration,efs_volume_configuration\negressAddress,egress_address\negressFilter,egress_filter\neksAttempts,eks_attempts\neksClusterArn,eks_cluster_arn\neksConfiguration,eks_configuration\neksProperties,eks_properties\neksPropertiesOverride,eks_properties_override\neksSourceClusterNamespace,eks_source_cluster_namespace\neksSourceName,eks_source_name\neksSourceNames,eks_source_names\neksSources,eks_sources\nelapsed,elapsed\nelapsedReplicationDuration,elapsed_replication_duration\nelapsedTimeInSeconds,elapsed_time_in_seconds\nelasticsearch,elasticsearch\nelasticsearchConfig,elasticsearch_config\nelbInfoList,elb_info_list\nelement,element\nelements,elements\nelevation,elevation\nelevationReference,elevation_reference\nelevationUnit,elevation_unit\nelicitationCodeHook,elicitation_code_hook\neligibleToRenew,eligible_to_renew\nelse,else\nemail,email\nemailAddress,email_address\nemailConfigurations,email_configurations\nembed,embed\nembeddingDataDeliveryEnabled,embedding_data_delivery_enabled\nemoji,emoji\nemptyDir,empty_dir\nenable,enable\nenableActionConfiguration,enable_action_configuration\nenableActionRequests,enable_action_requests\nenableAnswerMachineDetection,enable_answer_machine_detection\nenableAutoBranchCreation,enable_auto_branch_creation\nenableAutoBuild,enable_auto_build\nenableAutoSubDomain,enable_auto_sub_domain\nenableBackupRetention,enable_backup_retention\nenableBasicAuth,enable_basic_auth\nenableBranchAutoBuild,enable_branch_auto_build\nenableBranchAutoDeletion,enable_branch_auto_deletion\nenableCachingForHttp,enable_caching_for_http\nenableCodeHookInvocation,enable_code_hook_invocation\nenableDynamicFieldUpdate,enable_dynamic_field_update\nenableECSManagedTags,enable_ecs_managed_tags\nenableExecuteCommand,enable_execute_command\nenableIoTLoggingParams,enable_io_t_logging_params\nenableManagedSpotTraining,enable_managed_spot_training\nenableMapAutoTagging,enable_map_auto_tagging\nenableModelImprovements,enable_model_improvements\nenableNotification,enable_notification\nenableObjectVersioning,enable_object_versioning\nenableOnPublicIp,enable_on_public_ip\nenablePerformanceMode,enable_performance_mode\nenablePullRequestPreview,enable_pull_request_preview\nenableSiteLink,enable_site_link\nenabled,enabled\nenabledControls,enabled_controls\nenablementStatus,enablement_status\nencodedInputTranscript,encoded_input_transcript\nencodedMessage,encoded_message\nencoder,encoder\nencoding,encoding\nencodings,encodings\nencrypted,encrypted\nencryptionAlgorithm,encryption_algorithm\nencryptionAlgorithmOptions,encryption_algorithm_options\nencryptionConfig,encryption_config\nencryptionConfiguration,encryption_configuration\nencryptionContextEquals,encryption_context_equals\nencryptionContextSubset,encryption_context_subset\nencryptionDisabled,encryption_disabled\nencryptionKey,encryption_key\nencryptionKeyArn,encryption_key_arn\nencryptionKeyOverride,encryption_key_override\nencryptionMode,encryption_mode\nencryptionSetting,encryption_setting\nencryptionSpecification,encryption_specification\nencryptionSpecificationOverride,encryption_specification_override\nencryptionStatus,encryption_status\nencryptionType,encryption_type\nend,end\nendAt,end_at\nendBehavior,end_behavior\nendCharOffset,end_char_offset\nendCharacter,end_character\nendDate,end_date\nendDateTime,end_date_time\nendInclusive,end_inclusive\nendLine,end_line\nendOffsetExclusive,end_offset_exclusive\nendTime,end_time\nendTimeAfter,end_time_after\nendTimeBefore,end_time_before\nendTimeInSeconds,end_time_in_seconds\nendTimeOffsetInNanos,end_time_offset_in_nanos\nendTimeoutMs,end_timeout_ms\nendTimes,end_times\nendToEndResult,end_to_end_result\nendToEndResultCounts,end_to_end_result_counts\nended,ended\nendedAt,ended_at\nendedTime,ended_time\nendpoint,endpoint\nendpointAddress,endpoint_address\nendpointArn,endpoint_arn\nendpointConfig,endpoint_config\nendpointConfiguration,endpoint_configuration\nendpointCreateTime,endpoint_create_time\nendpointDetails,endpoint_details\nendpointIdentifier,endpoint_identifier\nendpointName,endpoint_name\nendpointPrivateAccess,endpoint_private_access\nendpointPublicAccess,endpoint_public_access\nendpointStatus,endpoint_status\nendpointType,endpoint_type\nendpoints,endpoints\nendpointsDetails,endpoints_details\nenforce,enforce\nengagements,engagements\nengine,engine\nengineDescription,engine_description\nengineType,engine_type\nengineVersion,engine_version\nengineVersionDescription,engine_version_description\nengineVersions,engine_versions\nenhancedFindings,enhanced_findings\nenhancedImageMetadataEnabled,enhanced_image_metadata_enabled\nenhancedInfrastructureMetrics,enhanced_infrastructure_metrics\nenhancedVpcRouting,enhanced_vpc_routing\nentities,entities\nentitiesPath,entities_path\nentity,entity\nentityAggregates,entity_aggregates\nentityArn,entity_arn\nentityArns,entity_arns\nentityId,entity_id\nentityIdKey,entity_id_key\nentityName,entity_name\nentityOverrides,entity_overrides\nentityPropertyReference,entity_property_reference\nentitySummaries,entity_summaries\nentityType,entity_type\nentityTypes,entity_types\nentityUrl,entity_url\nentityUrlTemplate,entity_url_template\nentityValue,entity_value\nentityValues,entity_values\nentries,entries\nentry,entry\nentryId,entry_id\nentryName,entry_name\nentryPoint,entry_point\nentryPointArguments,entry_point_arguments\nenumerationValues,enumeration_values\nenums,enums\nenv,env\nenvironment,environment\nenvironmentAccountConnection,environment_account_connection\nenvironmentAccountConnectionId,environment_account_connection_id\nenvironmentAccountConnections,environment_account_connections\nenvironmentAccountId,environment_account_id\nenvironmentArn,environment_arn\nenvironmentFiles,environment_files\nenvironmentId,environment_id\nenvironmentIds,environment_ids\nenvironmentName,environment_name\nenvironmentTemplate,environment_template\nenvironmentTemplateVersion,environment_template_version\nenvironmentTemplates,environment_templates\nenvironmentTypeOverride,environment_type_override\nenvironmentUrl,environment_url\nenvironmentVariables,environment_variables\nenvironmentVariablesOverride,environment_variables_override\nenvironments,environments\nephemeralStorage,ephemeral_storage\nephemerides,ephemerides\nephemeris,ephemeris\nephemerisData,ephemeris_data\nephemerisId,ephemeris_id\nepoch,epoch\nepss,epss\nepssScore,epss_score\neq,eq\neqExactMatch,eq_exact_match\nerror,error\nerrorAction,error_action\nerrorCategory,error_category\nerrorCode,error_code\nerrorData,error_data\nerrorDateTime,error_date_time\nerrorDescription,error_description\nerrorDetails,error_details\nerrorEntries,error_entries\nerrorHandlingConfig,error_handling_config\nerrorId,error_id\nerrorInfo,error_info\nerrorInformation,error_information\nerrorMessage,error_message\nerrorName,error_name\nerrorReason,error_reason\nerrorReportLocation,error_report_location\nerrorStack,error_stack\nerrorStackTrace,error_stack_trace\nerrorTimestamp,error_timestamp\nerrorType,error_type\nerrorTypes,error_types\nerror_description,error_description\nerrored,errored\nerrors,errors\nerrorsAndFailedEntriesZip,errors_and_failed_entries_zip\nerrorsPerPage,errors_per_page\nescape,escape\nescapeQuotes,escape_quotes\nessential,essential\nestimatedCost,estimated_cost\nestimatedCostTier,estimated_cost_tier\nestimatedMinutesRemaining,estimated_minutes_remaining\nestimatedMonthlyCost,estimated_monthly_cost\nestimatedMonthlySavings,estimated_monthly_savings\nestimatedOn,estimated_on\nestimatedPercentMonthlySavings,estimated_percent_monthly_savings\nestimatedSecondsToCompletion,estimated_seconds_to_completion\nestimatedSizeInBytes,estimated_size_in_bytes\nestimatedTimeRemainingSeconds,estimated_time_remaining_seconds\netaDateTime,eta_date_time\netag,etag\neula,eula\neulaAcceptanceId,eula_acceptance_id\neulaAcceptances,eula_acceptances\neulaId,eula_id\neulaIds,eula_ids\neulas,eulas\nevaluateExpressions,evaluate_expressions\nevaluateOnExit,evaluate_on_exit\nevaluated,evaluated\nevaluatedExpression,evaluated_expression\nevaluatedExternalModels,evaluated_external_models\nevaluatedModelVersions,evaluated_model_versions\nevaluation,evaluation\nevaluationContext,evaluation_context\nevaluationMethod,evaluation_method\nevaluationOrder,evaluation_order\nevaluationPeriods,evaluation_periods\nevaluationResult,evaluation_result\nevaluationRules,evaluation_rules\nevaluationScore,evaluation_score\nevaluationStrategy,evaluation_strategy\nevaluations,evaluations\nevent,event\neventAggregates,event_aggregates\neventArn,event_arn\neventArns,event_arns\neventAttributionSource,event_attribution_source\neventBridge,event_bridge\neventBridgeConfig,event_bridge_config\neventBridgeEnabled,event_bridge_enabled\neventBusArn,event_bus_arn\neventCategories,event_categories\neventCategory,event_category\neventClasses,event_classes\neventConfigurations,event_configurations\neventCount,event_count\neventData,event_data\neventDataChecksum,event_data_checksum\neventDataSizeInBytes,event_data_size_in_bytes\neventDataStoreArn,event_data_store_arn\neventDate,event_date\neventDescription,event_description\neventID,event_id\neventId,event_id\neventIngestion,event_ingestion\neventList,event_list\neventMessage,event_message\neventMetadata,event_metadata\neventName,event_name\neventNumber,event_number\neventOrchestration,event_orchestration\neventPattern,event_pattern\neventPredictionSummaries,event_prediction_summaries\neventPublishers,event_publishers\neventReason,event_reason\neventReferences,event_references\neventResourceData,event_resource_data\neventResults,event_results\neventScopeCode,event_scope_code\neventSource,event_source\neventSources,event_sources\neventStatusCodes,event_status_codes\neventSubscriptions,event_subscriptions\neventSummaries,event_summaries\neventTime,event_time\neventTimestamp,event_timestamp\neventTracker,event_tracker\neventTrackerArn,event_tracker_arn\neventTrackers,event_trackers\neventType,event_type\neventTypeCategories,event_type_categories\neventTypeCategory,event_type_category\neventTypeCode,event_type_code\neventTypeCodes,event_type_codes\neventTypeName,event_type_name\neventTypes,event_types\neventUpdatedTime,event_updated_time\neventValue,event_value\neventValueThreshold,event_value_threshold\neventVariableName,event_variable_name\neventVariableNames,event_variable_names\neventVariables,event_variables\neventVersion,event_version\nevents,events\neventsDeletionStatus,events_deletion_status\nevidence,evidence\nevidenceAwsAccountId,evidence_aws_account_id\nevidenceAwsServiceSourceCount,evidence_aws_service_source_count\nevidenceByType,evidence_by_type\nevidenceByTypeComplianceCheckCount,evidence_by_type_compliance_check_count\nevidenceByTypeComplianceCheckIssuesCount,evidence_by_type_compliance_check_issues_count\nevidenceByTypeConfigurationDataCount,evidence_by_type_configuration_data_count\nevidenceByTypeManualCount,evidence_by_type_manual_count\nevidenceByTypeUserActivityCount,evidence_by_type_user_activity_count\nevidenceCount,evidence_count\nevidenceDetail,evidence_detail\nevidenceFileName,evidence_file_name\nevidenceFinderEnabled,evidence_finder_enabled\nevidenceFinderEnablement,evidence_finder_enablement\nevidenceFolder,evidence_folder\nevidenceFolderId,evidence_folder_id\nevidenceFolders,evidence_folders\nevidenceId,evidence_id\nevidenceIds,evidence_ids\nevidenceInsights,evidence_insights\nevidenceResourcesIncludedCount,evidence_resources_included_count\nevidenceRule,evidence_rule\nevidenceSources,evidence_sources\nevidences,evidences\nexact,exact\nexample,example\nexampleReference,example_reference\nexception,exception\nexceptionMessage,exception_message\nexceptionName,exception_name\nexceptionTimeToLive,exception_time_to_live\nexceptions,exceptions\nexcerpt,excerpt\nexcludeAppPackagesFromCleanup,exclude_app_packages_from_cleanup\nexcludeMatchedPattern,exclude_matched_pattern\nexcludeProperties,exclude_properties\nexcludeReason,exclude_reason\nexcludeVerboseContent,exclude_verbose_content\nexcluded,excluded\nexcludedDatasetColumns,excluded_dataset_columns\nexcludedInstanceTypes,excluded_instance_types\nexcludes,excludes\nexclusionArns,exclusion_arns\nexclusionByResourceTypes,exclusion_by_resource_types\nexclusionPreviews,exclusion_previews\nexclusions,exclusions\nexecArgs,exec_args\nexecuteCommandConfiguration,execute_command_configuration\nexecuteCommandSessionConfiguration,execute_command_session_configuration\nexecution,execution\nexecutionAbortedEventDetails,execution_aborted_event_details\nexecutionArn,execution_arn\nexecutionConfiguration,execution_configuration\nexecutionContext,execution_context\nexecutionCounts,execution_counts\nexecutionDetails,execution_details\nexecutionEndDate,execution_end_date\nexecutionFailedEventDetails,execution_failed_event_details\nexecutionFilter,execution_filter\nexecutionID,execution_id\nexecutionId,execution_id\nexecutionIds,execution_ids\nexecutionInfo,execution_info\nexecutionInfos,execution_infos\nexecutionMessage,execution_message\nexecutionNamePrefix,execution_name_prefix\nexecutionNumber,execution_number\nexecutionResult,execution_result\nexecutionRole,execution_role\nexecutionRoleArn,execution_role_arn\nexecutionStartDate,execution_start_date\nexecutionStartToCloseTimeout,execution_start_to_close_timeout\nexecutionStartedEventDetails,execution_started_event_details\nexecutionState,execution_state\nexecutionStatus,execution_status\nexecutionStoppedAt,execution_stopped_at\nexecutionSucceededEventDetails,execution_succeeded_event_details\nexecutionSummaries,execution_summaries\nexecutionTimedOutEventDetails,execution_timed_out_event_details\nexecutionTimeoutMinutes,execution_timeout_minutes\nexecutionTimeoutSeconds,execution_timeout_seconds\nexecutionUrlTemplate,execution_url_template\nexecutions,executions\nexecutor,executor\nexistingAllowedPrefixesToDirectConnectGateway,existing_allowed_prefixes_to_direct_connect_gateway\nexistingFindingId,existing_finding_id\nexistingFindingStatus,existing_finding_status\nexistingImageName,existing_image_name\nexistingRuleContentSha256,existing_rule_content_sha256\nexists,exists\nexitBehavior,exit_behavior\nexitCode,exit_code\nexpected,expected\nexpectedAgentPrompt,expected_agent_prompt\nexpectedComplianceStatus,expected_compliance_status\nexpectedFingerprint,expected_fingerprint\nexpectedOutput,expected_output\nexpectedReferenceId,expected_reference_id\nexpectedRevisionId,expected_revision_id\nexpectedRpoDescription,expected_rpo_description\nexpectedRpoInSecs,expected_rpo_in_secs\nexpectedRtoDescription,expected_rto_description\nexpectedRtoInSecs,expected_rto_in_secs\nexpectedSequenceToken,expected_sequence_token\nexpectedStatus,expected_status\nexpectedTimestamp,expected_timestamp\nexpectedValue,expected_value\nexpectedVersion,expected_version\nexperiment,experiment\nexperimentCount,experiment_count\nexperimentTemplate,experiment_template\nexperimentTemplateId,experiment_template_id\nexperimentTemplates,experiment_templates\nexperiments,experiments\nexpiration,expiration\nexpirationDate,expiration_date\nexpirationInSeconds,expiration_in_seconds\nexpirationTime,expiration_time\nexpired,expired\nexpiredLogEventEndIndex,expired_log_event_end_index\nexpires,expires\nexpiresAt,expires_at\nexpiresIn,expires_in\nexpiresInMinutes,expires_in_minutes\nexpiresInSec,expires_in_sec\nexpiresInSeconds,expires_in_seconds\nexpiresOn,expires_on\nexpiresTime,expires_time\nexpiringImageTotalCount,expiring_image_total_count\nexpiryTime,expiry_time\nexplainMode,explain_mode\nexplicitDeny,explicit_deny\nexploitAvailable,exploit_available\nexploitObserved,exploit_observed\nexploitabilityDetails,exploitability_details\nexponentialRate,exponential_rate\nexport,export\nexportBucketArn,export_bucket_arn\nexportConfig,export_config\nexportConfigType,export_config_type\nexportDataFormat,export_data_format\nexportID,export_id\nexportIDs,export_ids\nexportId,export_id\nexportIds,export_ids\nexportJobs,export_jobs\nexportRequestTime,export_request_time\nexportSnapshotRecords,export_snapshot_records\nexportStatus,export_status\nexportSummaries,export_summaries\nexportTask,export_task\nexportTasks,export_tasks\nexportType,export_type\nexportedEnvironmentVariables,exported_environment_variables\nexportsInfo,exports_info\nexpr,expr\nexpression,expression\nexpressionString,expression_string\nexpressionWithValues,expression_with_values\nexprs,exprs\nextendedKeyUsage,extended_key_usage\nextendsFrom,extends_from\nextension,extension\nexternal,external\nexternalConnection,external_connection\nexternalConnectionName,external_connection_name\nexternalConnections,external_connections\nexternalEventsDetail,external_events_detail\nexternalExecutionId,external_execution_id\nexternalExecutionSummary,external_execution_summary\nexternalExecutionUrl,external_execution_url\nexternalId,external_id\nexternalIdProperty,external_id_property\nexternalInitiatedEventId,external_initiated_event_id\nexternalLocation,external_location\nexternalMetricStatus,external_metric_status\nexternalMetricsPreference,external_metrics_preference\nexternalModel,external_model\nexternalModelEndpointDataBlobs,external_model_endpoint_data_blobs\nexternalModelEndpoints,external_model_endpoints\nexternalModelOutputs,external_model_outputs\nexternalModels,external_models\nexternalParameters,external_parameters\nexternalSourceSetting,external_source_setting\nexternalWorkflowExecution,external_workflow_execution\nexternalWorkflowExecutionCancelRequestedEventAttributes,external_workflow_execution_cancel_requested_event_attributes\nexternalWorkflowExecutionSignaledEventAttributes,external_workflow_execution_signaled_event_attributes\nextraDataPackageArn,extra_data_package_arn\nextraHosts,extra_hosts\nextractedValues,extracted_values\nfacet,facet\nfacets,facets\nfact,fact\nfactor,factor\nfacts,facts\nfailOnError,fail_on_error\nfailOnFirstDestinationError,fail_on_first_destination_error\nfailOnWarnings,fail_on_warnings\nfailWhenMissing,fail_when_missing\nfailWorkflowExecutionDecisionAttributes,fail_workflow_execution_decision_attributes\nfailWorkflowExecutionFailedEventAttributes,fail_workflow_execution_failed_event_attributes\nfailback,failback\nfailbackClientID,failback_client_id\nfailbackClientLastSeenByServiceDateTime,failback_client_last_seen_by_service_date_time\nfailbackInitiationTime,failback_initiation_time\nfailbackJobID,failback_job_id\nfailbackLaunchType,failback_launch_type\nfailbackToOriginalServer,failback_to_original_server\nfailed,failed\nfailedAccountIds,failed_account_ids\nfailedAccounts,failed_accounts\nfailedAt,failed_at\nfailedBatchItems,failed_batch_items\nfailedChecks,failed_checks\nfailedEntries,failed_entries\nfailedEventCount,failed_event_count\nfailedExecutions,failed_executions\nfailedFindings,failed_findings\nfailedFindingsCount,failed_findings_count\nfailedItem,failed_item\nfailedItems,failed_items\nfailedRecordsCount,failed_records_count\nfailedRequestCount,failed_request_count\nfailedRequests,failed_requests\nfailedS3Resources,failed_s3_resources\nfailedSet,failed_set\nfailedTasks,failed_tasks\nfailedVersions,failed_versions\nfailedWorldCount,failed_world_count\nfailure,failure\nfailureBehavior,failure_behavior\nfailureCause,failure_cause\nfailureCode,failure_code\nfailureConditional,failure_conditional\nfailureCount,failure_count\nfailureDetails,failure_details\nfailureHandlingPolicy,failure_handling_policy\nfailureMessage,failure_message\nfailureNextStep,failure_next_step\nfailureReason,failure_reason\nfailureReasons,failure_reasons\nfailureResource,failure_resource\nfailureResponse,failure_response\nfailureSummary,failure_summary\nfailureThresholdPercentage,failure_threshold_percentage\nfailureType,failure_type\nfailures,failures\nfairsharePolicy,fairshare_policy\nfallbackLocation,fallback_location\nfallbackResult,fallback_result\nfamilies,families\nfamily,family\nfamilyPrefix,family_prefix\nfargatePlatformConfiguration,fargate_platform_configuration\nfargateProfile,fargate_profile\nfargateProfileArn,fargate_profile_arn\nfargateProfileName,fargate_profile_name\nfargateProfileNames,fargate_profile_names\nfastLaunchConfigurations,fast_launch_configurations\nfeature,feature\nfeatureCount,feature_count\nfeatureName,feature_name\nfeatureSet,feature_set\nfeatureTransformation,feature_transformation\nfeatureTransformationArn,feature_transformation_arn\nfeatureTransformationParameters,feature_transformation_parameters\nfeatureVariations,feature_variations\nfeatures,features\nfederatedUser,federated_user\nfederationMode,federation_mode\nfederationParameters,federation_parameters\nfederationProviderName,federation_provider_name\nfederationURN,federation_urn\nfetchSubmodules,fetch_submodules\nfield,field\nfieldArn,field_arn\nfieldId,field_id\nfieldLengthRange,field_length_range\nfieldLevelMessages,field_level_messages\nfieldList,field_list\nfieldLogLevel,field_log_level\nfieldName,field_name\nfieldType,field_type\nfieldValueRange,field_value_range\nfields,fields\nfieldsToExport,fields_to_export\nfile,file\nfileContent,file_content\nfileDescription,file_description\nfileExistsBehavior,file_exists_behavior\nfileFormat,file_format\nfileFormatConfiguration,file_format_configuration\nfileFormatType,file_format_type\nfileId,file_id\nfileKey,file_key\nfileLevelMessages,file_level_messages\nfileLocation,file_location\nfileMap,file_map\nfileMd5,file_md5\nfileMode,file_mode\nfileModeConflict,file_mode_conflict\nfileModes,file_modes\nfileName,file_name\nfilePassword,file_password\nfilePath,file_path\nfilePaths,file_paths\nfilePosition,file_position\nfileSize,file_size\nfileSizes,file_sizes\nfileSystemId,file_system_id\nfileSystemLocations,file_system_locations\nfileSystemPolicy,file_system_policy\nfileSystemType,file_system_type\nfileType,file_type\nfileUploadUrls,file_upload_urls\nfileUploaderConfig,file_uploader_config\nfileVersion,file_version\nfilename,filename\nfiles,files\nfilesAdded,files_added\nfilesDeleted,files_deleted\nfilesUpdated,files_updated\nfilter,filter\nfilterArn,filter_arn\nfilterBy,filter_by\nfilterByName,filter_by_name\nfilterByPublished,filter_by_published\nfilterByRecordingConfigurationArn,filter_by_recording_configuration_arn\nfilterByState,filter_by_state\nfilterByUserId,filter_by_user_id\nfilterCriteria,filter_criteria\nfilterExpression,filter_expression\nfilterFormula,filter_formula\nfilterGroups,filter_groups\nfilterName,filter_name\nfilterNamePrefix,filter_name_prefix\nfilterOperators,filter_operators\nfilterPattern,filter_pattern\nfilterQuery,filter_query\nfilterType,filter_type\nfilterValue,filter_value\nfilterValues,filter_values\nfilters,filters\nfinalCaseStatus,final_case_status\nfinalRelationalDatabaseSnapshotName,final_relational_database_snapshot_name\nfinalSnapshotName,final_snapshot_name\nfinalSnapshotRetentionPeriod,final_snapshot_retention_period\nfinalized,finalized\nfinding,finding\nfindingArn,finding_arn\nfindingArns,finding_arns\nfindingCounts,finding_counts\nfindingCriteria,finding_criteria\nfindingDetails,finding_details\nfindingId,finding_id\nfindingIdentifiers,finding_identifiers\nfindingIds,finding_ids\nfindingNumber,finding_number\nfindingPublishingFrequency,finding_publishing_frequency\nfindingReasonCodes,finding_reason_codes\nfindingSeverityCounts,finding_severity_counts\nfindingStatus,finding_status\nfindingTime,finding_time\nfindingType,finding_type\nfindingTypes,finding_types\nfindings,findings\nfindingsFilterListItems,findings_filter_list_items\nfindingsMetrics,findings_metrics\nfindingsReportSummaries,findings_report_summaries\nfingerprint,fingerprint\nfingerprintSHA1,fingerprint_sha1\nfingerprintSHA256,fingerprint_sha256\nfinishedAt,finished_at\nfinishedCount,finished_count\nfinishedWorldsSummary,finished_worlds_summary\nfirehose,firehose\nfirelensConfiguration,firelens_configuration\nfirstBoot,first_boot\nfirstByteDateTime,first_byte_date_time\nfirstEnabledAt,first_enabled_at\nfirstEventTimestamp,first_event_timestamp\nfirstExecutionFrom,first_execution_from\nfirstJoinTime,first_join_time\nfirstName,first_name\nfirstObservedAt,first_observed_at\nfirstSeen,first_seen\nfirstUsedTime,first_used_time\nfirstUtteredDate,first_uttered_date\nfixAvailable,fix_available\nfixedInVersion,fixed_in_version\nflaggedResources,flagged_resources\nflatten,flatten\nfleet,fleet\nfleetArn,fleet_arn\nfleetDetails,fleet_details\nfleetId,fleet_id\nfleetInstanceId,fleet_instance_id\nfleetMetrics,fleet_metrics\nfleetName,fleet_name\nfleetSummaries,fleet_summaries\nfleetType,fleet_type\nfleets,fleets\nfloorplanCount,floorplan_count\nflowActionsRoleArn,flow_actions_role_arn\nflowArn,flow_arn\nflowErrorDeactivationThreshold,flow_error_deactivation_threshold\nflowExecutionId,flow_execution_id\nflowExecutions,flow_executions\nflowName,flow_name\nflowStatus,flow_status\nflowStatusMessage,flow_status_message\nflowTemplateId,flow_template_id\nflows,flows\nfolderPath,folder_path\nfollowUpPrompt,follow_up_prompt\nforce,force\nforceCanceled,force_canceled\nforceDelete,force_delete\nforceDeleteAWSJob,force_delete_aws_job\nforceDeleteAddOns,force_delete_add_ons\nforceNewDeployment,force_new_deployment\nforceStop,force_stop\nforceStopAppReplication,force_stop_app_replication\nforceTerminateApp,force_terminate_app\nforceUefi,force_uefi\nforceUpdate,force_update\nform,form\nformActionType,form_action_type\nformFactor,form_factor\nformToCreate,form_to_create\nformat,format\nformatOptions,format_options\nformatParams,format_params\nformatRecordsAs,format_records_as\nformatToHeader,format_to_header\nformattedRecords,formatted_records\nformattedValue,formatted_value\nformattedValues,formatted_values\nformula,formula\nforwardedCookies,forwarded_cookies\nforwardedHeaders,forwarded_headers\nforwardedQueryStrings,forwarded_query_strings\nforwardingConfig,forwarding_config\nfound,found\nfoundationModelArn,foundation_model_arn\nfoundationModelArnEquals,foundation_model_arn_equals\nfpr,fpr\nfqdn,fqdn\nfqdnForActionFramework,fqdn_for_action_framework\nfragmentsFilePath,fragments_file_path\nframeAddress,frame_address\nframeMetric,frame_metric\nframeMetricData,frame_metric_data\nframeMetrics,frame_metrics\nframeName,frame_name\nframework,framework\nframeworkDescription,framework_description\nframeworkId,framework_id\nframeworkMetadataList,framework_metadata_list\nframeworkName,framework_name\nframeworkType,framework_type\nfreeTrialConsumed,free_trial_consumed\nfreeTrialExpiration,free_trial_expiration\nfreeTrialInfo,free_trial_info\nfreeTrialStartDate,free_trial_start_date\nfrequency,frequency\nfrequencyInSeconds,frequency_in_seconds\nfriendlyName,friendly_name\nfrom,from\nfromAttachedDisks,from_attached_disks\nfromBlockchainInstant,from_blockchain_instant\nfromBlueprintId,from_blueprint_id\nfromBundleId,from_bundle_id\nfromDate,from_date\nfromDateTime,from_date_time\nfromDiskArn,from_disk_arn\nfromDiskInfo,from_disk_info\nfromDiskName,from_disk_name\nfromInstanceArn,from_instance_arn\nfromInstanceName,from_instance_name\nfromPermissionArn,from_permission_arn\nfromPermissionVersion,from_permission_version\nfromPort,from_port\nfromRelationalDatabaseArn,from_relational_database_arn\nfromRelationalDatabaseBlueprintId,from_relational_database_blueprint_id\nfromRelationalDatabaseBundleId,from_relational_database_bundle_id\nfromRelationalDatabaseName,from_relational_database_name\nfromResourceArn,from_resource_arn\nfromResourceName,from_resource_name\nfsxWindowsFileServerVolumeConfiguration,fsx_windows_file_server_volume_configuration\nfulfillmentActivity,fulfillment_activity\nfulfillmentCodeHook,fulfillment_code_hook\nfulfillmentState,fulfillment_state\nfulfillmentUpdatesSpecification,fulfillment_updates_specification\nfullString,full_string\nfullyQualifiedName,fully_qualified_name\nfunction,function\nfunctionAlias,function_alias\nfunctionArn,function_arn\nfunctionArns,function_arns\nfunctionConfiguration,function_configuration\nfunctionId,function_id\nfunctionInstances,function_instances\nfunctionName,function_name\nfunctionNames,function_names\nfunctionPackages,function_packages\nfunctionTags,function_tags\nfunctionVersion,function_version\nfunctions,functions\ngasUsed,gas_used\ngatewayArn,gateway_arn\ngatewayCapabilitySummaries,gateway_capability_summaries\ngatewayId,gateway_id\ngatewayName,gateway_name\ngatewayPlatform,gateway_platform\ngatewayRoute,gateway_route\ngatewayRouteName,gateway_route_name\ngatewayRoutes,gateway_routes\ngatewaySummaries,gateway_summaries\ngbInUse,gb_in_use\ngbPerMonthAllocated,gb_per_month_allocated\ngenerateDistinctId,generate_distinct_id\ngeneratedFields,generated_fields\ngeneratedFrom,generated_from\ngeneratedId,generated_id\ngeneratedPolicies,generated_policies\ngeneratedPolicyResult,generated_policy_result\ngeneratedSceneMetadata,generated_scene_metadata\ngenerationDataSource,generation_data_source\ngenerationId,generation_id\ngenerationJob,generation_job\ngeneratorId,generator_id\ngenericAttachments,generic_attachments\ngenericDataSchema,generic_data_schema\ngenericRevisionInfo,generic_revision_info\ngetObject,get_object\ngetTokenBalanceInputs,get_token_balance_inputs\ngitCloneDepth,git_clone_depth\ngitCloneDepthOverride,git_clone_depth_override\ngitHub,git_hub\ngitHubAccountName,git_hub_account_name\ngitHubLocation,git_hub_location\ngitSubmodulesConfig,git_submodules_config\ngitSubmodulesConfigOverride,git_submodules_config_override\nglobal,global\nglueConfiguration,glue_configuration\nglueDataCatalog,glue_data_catalog\ngps,gps\ngpuCount,gpu_count\ngpuIds,gpu_ids\ngpuMemorySizeInMiB,gpu_memory_size_in_mib\ngpuUnitLimit,gpu_unit_limit\ngpus,gpus\ngrafanaVersion,grafana_version\ngrafanaVersions,grafana_versions\ngrammarSlotTypeSetting,grammar_slot_type_setting\ngrantType,grant_type\ngrantee,grantee\ngranteePrincipal,grantee_principal\ngrants,grants\ngraphSummary,graph_summary\ngraphqlApi,graphql_api\ngraphqlApis,graphql_apis\ngreenFleetProvisioningOption,green_fleet_provisioning_option\ngreenGrassGroupId,green_grass_group_id\ngreengrass,greengrass\ngreengrassDeploymentId,greengrass_deployment_id\ngreengrassGroupId,greengrass_group_id\ngreengrassGroupName,greengrass_group_name\ngreengrassGroupVersionId,greengrass_group_version_id\ngreengrassV2,greengrass_v2\ngremlin,gremlin\ngremlinQuery,gremlin_query\ngroundStation,ground_station\ngroundStationId,ground_station_id\ngroundStationList,ground_station_list\ngroundStationName,ground_station_name\ngroundStations,ground_stations\ngroup,group\ngroupArn,group_arn\ngroupAttribute,group_attribute\ngroupBy,group_by\ngroupByKeys,group_by_keys\ngroupDesc,group_desc\ngroupId,group_id\ngroupIdFilter,group_id_filter\ngroupKey,group_key\ngroupName,group_name\ngroupNumber,group_number\ngroupType,group_type\ngroupWeights,group_weights\ngroups,groups\ngroupsClaim,groups_claim\ngroupsPrefix,groups_prefix\ngrpcRetryEvents,grpc_retry_events\ngrpcRoute,grpc_route\ngt,gt\ngte,gte\nhaArchitecture,ha_architecture\nhardLimit,hard_limit\nhardware,hardware\nhardwareId,hardware_id\nhasChildEntities,has_child_entities\nhasErrorEvent,has_error_event\nhasFlaggedResources,has_flagged_resources\nhasHeaderRow,has_header_row\nhasLogicalRedundancy,has_logical_redundancy\nhasMoreErrors,has_more_errors\nhasMoreResults,has_more_results\nhasNestedEntities,has_nested_entities\nhasTransmissionEcu,has_transmission_ecu\nhashAlgorithm,hash_algorithm\nhashAlgorithmOptions,hash_algorithm_options\nhashKeyField,hash_key_field\nhashKeyType,hash_key_type\nhashKeyValue,hash_key_value\nhashed,hashed\nhashes,hashes\nheadCommitId,head_commit_id\nheader,header\nheaderMatches,header_matches\nheaderName,header_name\nheaderValue,header_value\nheaders,headers\nheadersAllowList,headers_allow_list\nheadersToInclude,headers_to_include\nhealth,health\nhealthCheck,health_check\nhealthCheckGracePeriodSeconds,health_check_grace_period_seconds\nhealthCheckIntervalSeconds,health_check_interval_seconds\nhealthCheckPath,health_check_path\nhealthCheckTimeoutSeconds,health_check_timeout_seconds\nhealthReasons,health_reasons\nhealthServiceAccessStatusForOrganization,health_service_access_status_for_organization\nhealthStatus,health_status\nhealthyAgentlessCollectors,healthy_agentless_collectors\nhealthyAgents,healthy_agents\nhealthyConnectors,healthy_connectors\nhealthyMeCollectors,healthy_me_collectors\nhealthyThreshold,healthy_threshold\nhealthyThresholdCount,healthy_threshold_count\nheapSize,heap_size\nheartbeatInSeconds,heartbeat_in_seconds\nheartbeatTimeout,heartbeat_timeout\nheight,height\nhelmChart,helm_chart\nhierarchies,hierarchies\nhierarchyId,hierarchy_id\nhierarchyInfo,hierarchy_info\nhigh,high\nhighAvailabilityConfig,high_availability_config\nhighlight,highlight\nhighlights,highlights\nhistoryFilter,history_filter\nhit,hit\nhitCount,hit_count\nhits,hits\nhomePage,home_page\nhomeRegion,home_region\nhook,hook\nhooksNotCleanedUp,hooks_not_cleaned_up\nhorizontalGap,horizontal_gap\nhost,host\nhostAddress,host_address\nhostKeys,host_keys\nhostName,host_name\nhostNetwork,host_network\nhostPath,host_path\nhostPort,host_port\nhostPortRange,host_port_range\nhostPrefix,host_prefix\nhostedZoneId,hosted_zone_id\nhostname,hostname\nhpoConfig,hpo_config\nhpoJob,hpo_job\nhpoObjective,hpo_objective\nhpoResourceConfig,hpo_resource_config\nhttp,http\nhttp2Route,http2_route\nhttpApiKeyAuth,http_api_key_auth\nhttpConfig,http_config\nhttpContext,http_context\nhttpEndpoint,http_endpoint\nhttpMethod,http_method\nhttpProtocolIpv6,http_protocol_ipv6\nhttpPutResponseHopLimit,http_put_response_hop_limit\nhttpRetryEvents,http_retry_events\nhttpRoute,http_route\nhttpTokens,http_tokens\nhttpUrlConfiguration,http_url_configuration\nhttpUrlProperties,http_url_properties\nhttpUrlSummary,http_url_summary\nhttps,https\nhttpsRedirectionEnabled,https_redirection_enabled\nhunkContent,hunk_content\nhyperParameters,hyper_parameters\nhyperlinkName,hyperlink_name\niam,iam\niamArn,iam_arn\niamId,iam_id\niamInstanceProfileArn,iam_instance_profile_arn\niamInstanceProfileName,iam_instance_profile_name\niamRegistrationResponse,iam_registration_response\niamResources,iam_resources\niamRole,iam_role\niamRoleArn,iam_role_arn\niamRoles,iam_roles\niamServiceRoleArn,iam_service_role_arn\niamSessionArn,iam_session_arn\niamUser,iam_user\niamUserArn,iam_user_arn\niatTTL,iat_ttl\niccid,iccid\nicmpTypeCode,icmp_type_code\niconUrl,icon_url\nid,id\nidFieldNames,id_field_names\nidRef,id_ref\nidToken,id_token\nidempotencyToken,idempotency_token\nidentifer,identifer\nidentificationHints,identification_hints\nidentifier,identifier\nidentifiers,identifiers\nidentity,identity\nidentityId,identity_id\nidentityProvider,identity_provider\nidentityProviderArn,identity_provider_arn\nidentityProviderConfig,identity_provider_config\nidentityProviderConfigArn,identity_provider_config_arn\nidentityProviderConfigName,identity_provider_config_name\nidentityProviderConfigs,identity_provider_configs\nidentityProviderDetails,identity_provider_details\nidentityProviderName,identity_provider_name\nidentityProviderType,identity_provider_type\nidentityProviders,identity_providers\nidentitySource,identity_source\nidentitySourceId,identity_source_id\nidentitySources,identity_sources\nidentityStoreId,identity_store_id\nidentityToken,identity_token\nidentityType,identity_type\nidentityValidationExpression,identity_validation_expression\nides,ides\nidle,idle\nidleDisconnectTimeoutInMinutes,idle_disconnect_timeout_in_minutes\nidleSessionTTLInSeconds,idle_session_ttl_in_seconds\nidleTimeoutMinutes,idle_timeout_minutes\nidpMetadata,idp_metadata\nids,ids\nignoreApplicationStopFailures,ignore_application_stop_failures\nignoreEmptyRows,ignore_empty_rows\nignoreFailure,ignore_failure\nignoreFilterField,ignore_filter_field\nignoreJobChecks,ignore_job_checks\nignorePollAlarmFailure,ignore_poll_alarm_failure\nignorePublicAcls,ignore_public_acls\nignoreQualField,ignore_qual_field\nignoreWords,ignore_words\nimage,image\nimageAggregation,image_aggregation\nimageArn,image_arn\nimageBuildVersionArn,image_build_version_arn\nimageConfiguration,image_configuration\nimageDataDeliveryEnabled,image_data_delivery_enabled\nimageDetail,image_detail\nimageDetails,image_details\nimageDigest,image_digest\nimageFrameBlob,image_frame_blob\nimageFrameId,image_frame_id\nimageFrameInformation,image_frame_information\nimageHash,image_hash\nimageId,image_id\nimageIdOverride,image_id_override\nimageIds,image_ids\nimageKubernetesVersion,image_kubernetes_version\nimageManifest,image_manifest\nimageManifestMediaType,image_manifest_media_type\nimageOsVersionOverride,image_os_version_override\nimageOverride,image_override\nimagePackageList,image_package_list\nimagePermissions,image_permissions\nimagePipeline,image_pipeline\nimagePipelineAggregation,image_pipeline_aggregation\nimagePipelineArn,image_pipeline_arn\nimagePipelineList,image_pipeline_list\nimagePullCredentialsType,image_pull_credentials_type\nimagePullCredentialsTypeOverride,image_pull_credentials_type_override\nimagePullPolicy,image_pull_policy\nimagePushedAt,image_pushed_at\nimageRecipe,image_recipe\nimageRecipeArn,image_recipe_arn\nimageRecipeSummaryList,image_recipe_summary_list\nimageResponseCard,image_response_card\nimageScanCompletedAt,image_scan_completed_at\nimageScanFindings,image_scan_findings\nimageScanFindingsSummary,image_scan_findings_summary\nimageScanStatus,image_scan_status\nimageScanningConfiguration,image_scanning_configuration\nimageScanningEnabled,image_scanning_enabled\nimageSetArn,image_set_arn\nimageSetId,image_set_id\nimageSetMetadataBlob,image_set_metadata_blob\nimageSetPropertiesList,image_set_properties_list\nimageSetState,image_set_state\nimageSetWorkflowStatus,image_set_workflow_status\nimageSetsMetadataSummaries,image_sets_metadata_summaries\nimageSha,image_sha\nimageShas,image_shas\nimageSizeInBytes,image_size_in_bytes\nimageSource,image_source\nimageSummaryList,image_summary_list\nimageTag,image_tag\nimageTagDetails,image_tag_details\nimageTagMutability,image_tag_mutability\nimageTags,image_tags\nimageTestsConfiguration,image_tests_configuration\nimageTestsEnabled,image_tests_enabled\nimageType,image_type\nimageUri,image_uri\nimageUris,image_uris\nimageUrl,image_url\nimageVersionArn,image_version_arn\nimageVersionList,image_version_list\nimages,images\nimpact,impact\nimplementedBy,implemented_by\nimplicitDeny,implicit_deny\nimportCompletionTime,import_completion_time\nimportConfig,import_config\nimportDeletedTime,import_deleted_time\nimportID,import_id\nimportIDs,import_ids\nimportId,import_id\nimportInputLocation,import_input_location\nimportJobs,import_jobs\nimportMode,import_mode\nimportName,import_name\nimportOptions,import_options\nimportRequestTime,import_request_time\nimportStatus,import_status\nimportStrategy,import_strategy\nimportSummaries,import_summaries\nimportTask,import_task\nimportTaskId,import_task_id\nimportTaskIds,import_task_ids\nimportType,import_type\nimportUrl,import_url\nimportedAppId,imported_app_id\nimportedResourceId,imported_resource_id\nimportedResourceName,imported_resource_name\nimportedResourceType,imported_resource_type\nimportedValue,imported_value\nimpression,impression\nimsi,imsi\nin,in\ninProgress,in_progress\ninProgressChecks,in_progress_checks\ninProgressJobs,in_progress_jobs\ninProgressTimeoutInMinutes,in_progress_timeout_in_minutes\ninReplyTo,in_reply_to\ninUseResourceCount,in_use_resource_count\ninactivityTimeoutMinutes,inactivity_timeout_minutes\ninboundExecution,inbound_execution\ninboundTransitionState,inbound_transition_state\nincidentRecord,incident_record\nincidentRecordArn,incident_record_arn\nincidentRecordSource,incident_record_source\nincidentRecordSummaries,incident_record_summaries\nincidentTags,incident_tags\nincidentTemplate,incident_template\nincidentTemplateDedupeString,incident_template_dedupe_string\nincidentTemplateImpact,incident_template_impact\nincidentTemplateNotificationTargets,incident_template_notification_targets\nincidentTemplateSummary,incident_template_summary\nincidentTemplateTags,incident_template_tags\nincidentTemplateTitle,incident_template_title\ninclude,include\nincludeAllVersions,include_all_versions\nincludeAvailabilityZones,include_availability_zones\nincludeCanceled,include_canceled\nincludeCertificateDetails,include_certificate_details\nincludeCommunications,include_communications\nincludeConnectedResources,include_connected_resources\nincludeContent,include_content\nincludeDefaultKeyPair,include_default_key_pair\nincludeDeletedRecords,include_deleted_records\nincludeDeletedResources,include_deleted_resources\nincludeDeprecated,include_deprecated\nincludeDescription,include_description\nincludeDirectives,include_directives\nincludeExecutionData,include_execution_data\nincludeFromUpstream,include_from_upstream\nincludeGlobalResourceTypes,include_global_resource_types\nincludeInactive,include_inactive\nincludeJobDocument,include_job_document\nincludeJobExecutionState,include_job_execution_state\nincludeLinkedAccounts,include_linked_accounts\nincludeMemberAccounts,include_member_accounts\nincludeOnlyActiveViolations,include_only_active_violations\nincludeOnlyStatuses,include_only_statuses\nincludeQueuedLoads,include_queued_loads\nincludeRelationalDatabaseAvailabilityZones,include_relational_database_availability_zones\nincludeRenditions,include_renditions\nincludeResolvedCases,include_resolved_cases\nincludeResourcePlaceholders,include_resource_placeholders\nincludeResultMetadata,include_result_metadata\nincludeServiceLevelTemplate,include_service_level_template\nincludeShadowTrails,include_shadow_trails\nincludeSourceFiles,include_source_files\nincludeStatistics,include_statistics\nincludeSuppressedAlerts,include_suppressed_alerts\nincludeValue,include_value\nincludeValues,include_values\nincludeWaiting,include_waiting\nincluded,included\nincludedData,included_data\nincludes,includes\ninclusionStatus,inclusion_status\nincompatibilityMessages,incompatibility_messages\nincompatibleDevices,incompatible_devices\ninconclusiveEvidenceCount,inconclusive_evidence_count\nincrementFactor,increment_factor\nincrementalPullConfig,incremental_pull_config\nincrementalRunConfig,incremental_run_config\nincrementalRunType,incremental_run_type\nindex,index\nindexName,index_name\nindexNames,index_names\nindexOps,index_ops\nindexStatus,index_status\nindicatorOfCompromise,indicator_of_compromise\ninferenceAcceleratorOverrides,inference_accelerator_overrides\ninferenceAccelerators,inference_accelerators\ninferenceTypesSupported,inference_types_supported\ninferredWorkloadSavings,inferred_workload_savings\ninferredWorkloadTypes,inferred_workload_types\ninfo,info\ninfrastructureConfiguration,infrastructure_configuration\ninfrastructureConfigurationArn,infrastructure_configuration_arn\ninfrastructureConfigurationSummaryList,infrastructure_configuration_summary_list\ningestConfiguration,ingest_configuration\ningestEndpoint,ingest_endpoint\ningestedEventStatistics,ingested_event_statistics\ningestedEventsDetail,ingested_events_detail\ningestedEventsTimeWindow,ingested_events_time_window\ningestion,ingestion\ningestionArn,ingestion_arn\ningestionDestination,ingestion_destination\ningestionDestinationIdentifier,ingestion_destination_identifier\ningestionDestinations,ingestion_destinations\ningestionIdentifier,ingestion_identifier\ningestionMode,ingestion_mode\ningestionTime,ingestion_time\ningestionType,ingestion_type\ningestions,ingestions\ningressAddress,ingress_address\ningressPortOverride,ingress_port_override\ninheritedProperties,inherited_properties\ninitProcessEnabled,init_process_enabled\ninitQueryFile,init_query_file\ninitialCapacity,initial_capacity\ninitialCaseStatus,initial_case_status\ninitialResponse,initial_response\ninitialResponseSetting,initial_response_setting\ninitialRevision,initial_revision\ninitialRun,initial_run\ninitialState,initial_state\ninitialStateName,initial_state_name\ninitializationConfiguration,initialization_configuration\ninitializationScript,initialization_script\ninitializationScripts,initialization_scripts\ninitiated,initiated\ninitiatedBy,initiated_by\ninitiatedEventId,initiated_event_id\ninitiator,initiator\ninlineDocument,inline_document\ninlineRecipe,inline_recipe\ninlineSourceMap,inline_source_map\ninput,input\ninputArn,input_arn\ninputArtifactDetails,input_artifact_details\ninputArtifacts,input_artifacts\ninputCharacter,input_character\ninputConfiguration,input_configuration\ninputContexts,input_contexts\ninputDataConfig,input_data_config\ninputDataS3Location,input_data_s3_location\ninputDefinition,input_definition\ninputDescription,input_description\ninputDetails,input_details\ninputFileBucket,input_file_bucket\ninputFileKey,input_file_key\ninputIdentifier,input_identifier\ninputList,input_list\ninputModalities,input_modalities\ninputMode,input_mode\ninputName,input_name\ninputParameters,input_parameters\ninputPath,input_path\ninputPayloadEncodingType,input_payload_encoding_type\ninputProperty,input_property\ninputPropertyValue,input_property_value\ninputRecords,input_records\ninputS3Bucket,input_s3_bucket\ninputS3Key,input_s3_key\ninputS3Uri,input_s3_uri\ninputSourceARN,input_source_arn\ninputSourceConfig,input_source_config\ninputStream,input_stream\ninputSummaries,input_summaries\ninputText,input_text\ninputToken,input_token\ninputTranscript,input_transcript\ninputType,input_type\ninputVariables,input_variables\ninputs,inputs\ninsecureIngest,insecure_ingest\ninsecureSkipVerification,insecure_skip_verification\ninsecureSsl,insecure_ssl\ninsecureSslOverride,insecure_ssl_override\ninsights,insights\ninspectorScore,inspector_score\ninspectorScoreDetails,inspector_score_details\ninstallState,install_state\ninstalledComponents,installed_components\ninstalledVersion,installed_version\ninstallingVersion,installing_version\ninstance,instance\ninstanceArn,instance_arn\ninstanceArns,instance_arns\ninstanceConfig,instance_config\ninstanceConfiguration,instance_configuration\ninstanceCount,instance_count\ninstanceGpuInfo,instance_gpu_info\ninstanceHealth,instance_health\ninstanceHealthReason,instance_health_reason\ninstanceHealthSummary,instance_health_summary\ninstanceId,instance_id\ninstanceIdFilter,instance_id_filter\ninstanceIdentity,instance_identity\ninstanceIdentityDocument,instance_identity_document\ninstanceIdentityDocumentSignature,instance_identity_document_signature\ninstanceIds,instance_ids\ninstanceInfo,instance_info\ninstanceInfos,instance_infos\ninstanceLabel,instance_label\ninstanceMetadataOptions,instance_metadata_options\ninstanceName,instance_name\ninstanceNames,instance_names\ninstancePort,instance_port\ninstanceProfile,instance_profile\ninstanceProfileName,instance_profile_name\ninstanceProfiles,instance_profiles\ninstanceProperties,instance_properties\ninstanceRecommendations,instance_recommendations\ninstanceRole,instance_role\ninstanceSnapshot,instance_snapshot\ninstanceSnapshotInfo,instance_snapshot_info\ninstanceSnapshotName,instance_snapshot_name\ninstanceSnapshots,instance_snapshots\ninstanceState,instance_state\ninstanceStatusFilter,instance_status_filter\ninstanceSummary,instance_summary\ninstanceTags,instance_tags\ninstanceTarget,instance_target\ninstanceTerminationWaitTimeStarted,instance_termination_wait_time_started\ninstanceType,instance_type\ninstanceTypeFilter,instance_type_filter\ninstanceTypes,instance_types\ninstanceUrl,instance_url\ninstanceWarmupPeriod,instance_warmup_period\ninstances,instances\ninstancesList,instances_list\ninstancesSummary,instances_summary\ninstantiatedVnfInfo,instantiated_vnf_info\ninstantiationState,instantiation_state\nintegerHyperParameterRanges,integer_hyper_parameter_ranges\nintegerValue,integer_value\nintegrationConfiguration,integration_configuration\nintegrationHttpMethod,integration_http_method\nintegrationResponses,integration_responses\nintegrations,integrations\nintendedForQualification,intended_for_qualification\nintent,intent\nintentClassificationResults,intent_classification_results\nintentClassificationTestResults,intent_classification_test_results\nintentClosingSetting,intent_closing_setting\nintentConfirmationSetting,intent_confirmation_setting\nintentCount,intent_count\nintentDiscrepancies,intent_discrepancies\nintentId,intent_id\nintentLevel,intent_level\nintentLevelSlotResolutionTestResults,intent_level_slot_resolution_test_results\nintentMatchResult,intent_match_result\nintentMatchResultCounts,intent_match_result_counts\nintentName,intent_name\nintentPath,intent_path\nintentSignature,intent_signature\nintentState,intent_state\nintentSummaries,intent_summaries\nintentVersion,intent_version\nintents,intents\nintentsCount,intents_count\ninteractionMode,interaction_mode\ninteractive,interactive\ninterconnectId,interconnect_id\ninterconnectName,interconnect_name\ninterconnectState,interconnect_state\ninterconnects,interconnects\ninterfaceId,interface_id\ninterfaceName,interface_name\ninteriorCountPerFloorplan,interior_count_per_floorplan\ninterleaved,interleaved\nintermediateBucketName,intermediate_bucket_name\ninternal,internal\ninternalDeviceName,internal_device_name\ninterpolatedAssetPropertyValues,interpolated_asset_property_values\ninterpolation,interpolation\ninterpolationType,interpolation_type\ninterpretations,interpretations\ninterpretedValue,interpreted_value\ninterval,interval\nintervalInSeconds,interval_in_seconds\nintervalMillis,interval_millis\nintervalSeconds,interval_seconds\nintervalWindowInSeconds,interval_window_in_seconds\ninvalidExecutions,invalid_executions\ninvalidNetworkInterfaces,invalid_network_interfaces\ninvalidNodes,invalid_nodes\ninvalidReason,invalid_reason\ninvalidSignals,invalid_signals\ninvert,invert\ninvitationId,invitation_id\ninvitationTimestamp,invitation_timestamp\ninvitations,invitations\ninvitationsCount,invitations_count\ninvitedAt,invited_at\ninvocationLabel,invocation_label\ninvokeModelEndpointRoleArn,invoke_model_endpoint_role_arn\ninvokedBy,invoked_by\ninvokedIntentSamples,invoked_intent_samples\ninvoker,invoker\ninvokerRoleName,invoker_role_name\niops,iops\niosPaths,ios_paths\niotAnalytics,iot_analytics\niotEvents,iot_events\niotEventsDestinationConfiguration,iot_events_destination_configuration\niotEventsInputIdentifier,iot_events_input_identifier\niotJobArn,iot_job_arn\niotJobConfiguration,iot_job_configuration\niotJobId,iot_job_id\niotSiteWise,iot_site_wise\niotSiteWiseAssetModelPropertyIdentifier,iot_site_wise_asset_model_property_identifier\niotSiteWiseInputIdentifier,iot_site_wise_input_identifier\niotSiteWiseMultiLayerStorage,iot_site_wise_multi_layer_storage\niotTopicPublish,iot_topic_publish\nipAccessSettings,ip_access_settings\nipAccessSettingsArn,ip_access_settings_arn\nipAddress,ip_address\nipAddressAssignment,ip_address_assignment\nipAddressBasedRemoteInfoList,ip_address_based_remote_info_list\nipAddressConfigurationTimeStamp,ip_address_configuration_time_stamp\nipAddressDetails,ip_address_details\nipAddressType,ip_address_type\nipAddressV4,ip_address_v4\nipCity,ip_city\nipCountry,ip_country\nipFamily,ip_family\nipGeoLocation,ip_geo_location\nipGroupIds,ip_group_ids\nipOwner,ip_owner\nipPreference,ip_preference\nipRange,ip_range\nipRule,ip_rule\nipRules,ip_rules\nipV4Addresses,ipv4_addresses\nipV6Addresses,ipv6_addresses\nipcMode,ipc_mode\nips,ips\nipv4Address,ipv4_address\nipv4Addresses,ipv4_addresses\nipv6Address,ipv6_address\nipv6Addresses,ipv6_addresses\nipv6Cidrs,ipv6_cidrs\nisAbstract,is_abstract\nisActive,is_active\nisAlias,is_alias\nisAlreadyVerified,is_already_verified\nisApiKeyAuthSupported,is_api_key_auth_supported\nisArchived,is_archived\nisArray,is_array\nisAttached,is_attached\nisAuthenticated,is_authenticated\nisAutoIncrement,is_auto_increment\nisAwsOrgEnabled,is_aws_org_enabled\nisBasicAuthSupported,is_basic_auth_supported\nisBigEndian,is_big_endian\nisBinaryFile,is_binary_file\nisBootDisk,is_boot_disk\nisCancelled,is_cancelled\nisCaseSensitive,is_case_sensitive\nisComplete,is_complete\nisConcurrent,is_concurrent\nisConflict,is_conflict\nisCreatable,is_creatable\nisCurrency,is_currency\nisCustomAuthSupported,is_custom_auth_supported\nisDefault,is_default\nisDefaultVersion,is_default_version\nisDefaultedOnCreate,is_defaulted_on_create\nisDefinedInJob,is_defined_in_job\nisDeprecated,is_deprecated\nisDisabled,is_disabled\nisDrill,is_drill\nisEnabled,is_enabled\nisEncrypted,is_encrypted\nisEngineDefault,is_engine_default\nisExternalId,is_external_id\nisFinal,is_final\nisFromAutoSnapshot,is_from_auto_snapshot\nisHasManyIndex,is_has_many_index\nisImported,is_imported\nisInherited,is_inherited\nisJoinTable,is_join_table\nisLastOp,is_last_op\nisLatestForTarget,is_latest_for_target\nisLongDurationTest,is_long_duration_test\nisMainNode,is_main_node\nisMerged,is_merged\nisModifiable,is_modifiable\nisMonitoredByJob,is_monitored_by_job\nisMove,is_move\nisNative,is_native\nisNonModelSupported,is_non_model_supported\nisNullable,is_nullable\nisOAuth2Supported,is_o_auth2_supported\nisOptedOut,is_opted_out\nisPeered,is_peered\nisPreferred,is_preferred\nisPrimary,is_primary\nisPrimaryKey,is_primary_key\nisPrivateLinkEnabled,is_private_link_enabled\nisPrivateLinkEndpointUrlRequired,is_private_link_endpoint_url_required\nisPublic,is_public\nisQueryable,is_queryable\nisRecursive,is_recursive\nisRedshiftServerless,is_redshift_serverless\nisRelationshipSupported,is_relationship_supported\nisRequired,is_required\nisRequiredInEntity,is_required_in_entity\nisReservedMinutesCustomer,is_reserved_minutes_customer\nisResourceTypeDefault,is_resource_type_default\nisResumable,is_resumable\nisRetrievable,is_retrievable\nisRevoked,is_revoked\nisRoot,is_root\nisSandboxEnvironment,is_sandbox_environment\nisSchemaInitialized,is_schema_initialized\nisSemVer,is_sem_ver\nisSensitiveField,is_sensitive_field\nisServiceLimited,is_service_limited\nisSigned,is_signed\nisSingleton,is_singleton\nisStaticIp,is_static_ip\nisStoredExternally,is_stored_externally\nisSuppressed,is_suppressed\nisSystemDisk,is_system_disk\nisTerminal,is_terminal\nisTerminated,is_terminated\nisTimeSeries,is_time_series\nisTimestampFieldForIncrementalQueries,is_timestamp_field_for_incremental_queries\nisTruncated,is_truncated\nisTunable,is_tunable\nisUpdatable,is_updatable\nisUpsertable,is_upsertable\nisValid,is_valid\nisolationMode,isolation_mode\nisp,isp\nissueCode,issue_code\nissueType,issue_type\nissuedAt,issued_at\nissuer,issuer\nissuerCA,issuer_ca\nissuerCertificateIdentifier,issuer_certificate_identifier\nissuerCertificateSerialNumber,issuer_certificate_serial_number\nissuerCertificateSubject,issuer_certificate_subject\nissuerId,issuer_id\nissuerUrl,issuer_url\nissues,issues\nissuesEnabled,issues_enabled\nissuingAccount,issuing_account\nitem,item\nitemAttribute,item_attribute\nitemCount,item_count\nitemCounts,item_counts\nitemExplorationConfig,item_exploration_config\nitemId,item_id\nitemList,item_list\nitems,items\niteratorType,iterator_type\njob,job\njobArn,job_arn\njobConfiguration,job_configuration\njobCreationDate,job_creation_date\njobDefinition,job_definition\njobDefinitionArn,job_definition_arn\njobDefinitionName,job_definition_name\njobDefinitions,job_definitions\njobDetails,job_details\njobDocument,job_document\njobDriver,job_driver\njobError,job_error\njobExecutionSummary,job_execution_summary\njobExecutionTimeoutMinutes,job_execution_timeout_minutes\njobExecutionsRetryConfig,job_executions_retry_config\njobExecutionsRolloutConfig,job_executions_rollout_config\njobExpiresAt,job_expires_at\njobID,job_id\njobIDs,job_ids\njobId,job_id\njobIdentifier,job_identifier\njobIds,job_ids\njobImminentExpirationHealthEventArn,job_imminent_expiration_health_event_arn\njobInput,job_input\njobInvoker,job_invoker\njobLastUpdateDate,job_last_update_date\njobMetadata,job_metadata\njobName,job_name\njobOutput,job_output\njobOutputPath,job_output_path\njobOwner,job_owner\njobParameters,job_parameters\njobParams,job_params\njobPausedAt,job_paused_at\njobPort,job_port\njobProcessDetails,job_process_details\njobProperties,job_properties\njobQueue,job_queue\njobQueueArn,job_queue_arn\njobQueueName,job_queue_name\njobQueues,job_queues\njobReason,job_reason\njobRoleArn,job_role_arn\njobRun,job_run\njobRunId,job_run_id\njobRuns,job_runs\njobStatus,job_status\njobSummaries,job_summaries\njobSummary,job_summary\njobSummaryList,job_summary_list\njobTags,job_tags\njobTemplate,job_template\njobTemplateArn,job_template_arn\njobTemplateData,job_template_data\njobTemplateId,job_template_id\njobTemplateParameters,job_template_parameters\njobTemplates,job_templates\njobTimeout,job_timeout\njobTimeoutMinutes,job_timeout_minutes\njobToken,job_token\njobType,job_type\njobUser,job_user\njobWorkerExecutorConfiguration,job_worker_executor_configuration\njobs,jobs\njoinColumns,join_columns\njoinRequired,join_required\njsonConfiguration,json_configuration\njsonInputTemplate,json_input_template\njsonKeyToVariableMap,json_key_to_variable_map\njsonPath,json_path\njumboFrameCapable,jumbo_frame_capable\njwtToken,jwt_token\nkafka,kafka\nkafkaCluster,kafka_cluster\nkafkaClusterClientAuthentication,kafka_cluster_client_authentication\nkafkaClusterEncryptionInTransit,kafka_cluster_encryption_in_transit\nkafkaConnectVersion,kafka_connect_version\nkeepEmptyFolders,keep_empty_folders\nkendraConfiguration,kendra_configuration\nkendraIndex,kendra_index\nkernelVersion,kernel_version\nkey,key\nkeyAlgorithm,key_algorithm\nkeyArn,key_arn\nkeyId,key_id\nkeyName,key_name\nkeyPair,key_pair\nkeyPairName,key_pair_name\nkeyPairs,key_pairs\nkeyPolicies,key_policies\nkeyPrefix,key_prefix\nkeyRole,key_role\nkeyTemplate,key_template\nkeyType,key_type\nkeyTypes,key_types\nkeyUsage,key_usage\nkeyValue,key_value\nkeyspaceName,keyspace_name\nkeyspaces,keyspaces\nkeyword,keyword\nkeywordInputType,keyword_input_type\nkeywordValue,keyword_value\nkeywords,keywords\nkind,kind\nkinesis,kinesis\nkinesisStreamArn,kinesis_stream_arn\nkmsArn,kms_arn\nkmsEncryptionKeyArn,kms_encryption_key_arn\nkmsError,kms_error\nkmsKey,kms_key\nkmsKeyArn,kms_key_arn\nkmsKeyId,kms_key_id\nkmsKeyIdentifier,kms_key_identifier\nkmsManaged,kms_managed\nkmsMasterKeyId,kms_master_key_id\nknowledgeBase,knowledge_base\nknowledgeBaseArn,knowledge_base_arn\nknowledgeBaseId,knowledge_base_id\nknowledgeBaseSummaries,knowledge_base_summaries\nknowledgeBaseType,knowledge_base_type\nknownDependencyCount,known_dependency_count\nkubernetesNamespace,kubernetes_namespace\nkubernetesNetworkConfig,kubernetes_network_config\nkubernetesVersion,kubernetes_version\nkxChangesets,kx_changesets\nkxClusterSummaries,kx_cluster_summaries\nkxDatabases,kx_databases\nlabMode,lab_mode\nlabel,label\nlabelDecorator,label_decorator\nlabelMapper,label_mapper\nlabelSchema,label_schema\nlabelTimestamp,label_timestamp\nlabels,labels\nlagDuration,lag_duration\nlagId,lag_id\nlagName,lag_name\nlagState,lag_state\nlags,lags\nlambda,lambda\nlambdaARN,lambda_arn\nlambdaAction,lambda_action\nlambdaArn,lambda_arn\nlambdaAuthorizerConfig,lambda_authorizer_config\nlambdaCode,lambda_code\nlambdaCodeHook,lambda_code_hook\nlambdaConfig,lambda_config\nlambdaConflictHandlerArn,lambda_conflict_handler_arn\nlambdaConflictHandlerConfig,lambda_conflict_handler_config\nlambdaEventStructureVersion,lambda_event_structure_version\nlambdaExecutorConfiguration,lambda_executor_configuration\nlambdaFunction,lambda_function\nlambdaFunctionArn,lambda_function_arn\nlambdaFunctionCompletedEventAttributes,lambda_function_completed_event_attributes\nlambdaFunctionExecutionRoleArn,lambda_function_execution_role_arn\nlambdaFunctionFailedEventAttributes,lambda_function_failed_event_attributes\nlambdaFunctionFailedEventDetails,lambda_function_failed_event_details\nlambdaFunctionInfo,lambda_function_info\nlambdaFunctionLastModifiedAt,lambda_function_last_modified_at\nlambdaFunctionLayers,lambda_function_layers\nlambdaFunctionName,lambda_function_name\nlambdaFunctionRecommendations,lambda_function_recommendations\nlambdaFunctionRuntime,lambda_function_runtime\nlambdaFunctionScheduleFailedEventDetails,lambda_function_schedule_failed_event_details\nlambdaFunctionScheduledEventAttributes,lambda_function_scheduled_event_attributes\nlambdaFunctionScheduledEventDetails,lambda_function_scheduled_event_details\nlambdaFunctionStartFailedEventDetails,lambda_function_start_failed_event_details\nlambdaFunctionStartedEventAttributes,lambda_function_started_event_attributes\nlambdaFunctionSucceededEventDetails,lambda_function_succeeded_event_details\nlambdaFunctionTags,lambda_function_tags\nlambdaFunctionTimedOutEventAttributes,lambda_function_timed_out_event_attributes\nlambdaFunctionTimedOutEventDetails,lambda_function_timed_out_event_details\nlambdaName,lambda_name\nlambdaRole,lambda_role\nlambdaTags,lambda_tags\nlambdaTarget,lambda_target\nlanguage,language\nlanguageAvailability,language_availability\nlanguages,languages\nlargeDataDeliveryS3Config,large_data_delivery_s3_config\nlargeVolumeConf,large_volume_conf\nlastAccess,last_access\nlastActivityDate,last_activity_date\nlastActivityTimeStamp,last_activity_time_stamp\nlastAnalyzedTimestamp,last_analyzed_timestamp\nlastAppComplianceEvaluationTime,last_app_compliance_evaluation_time\nlastAssessmentRunArn,last_assessment_run_arn\nlastAttemptTime,last_attempt_time\nlastAttemptedDeployment,last_attempted_deployment\nlastAttemptedDeploymentId,last_attempted_deployment_id\nlastAutomatedDiscoveryTime,last_automated_discovery_time\nlastBuildSubmittedDateTime,last_build_submitted_date_time\nlastByteReceived,last_byte_received\nlastChangedAt,last_changed_at\nlastChangedBy,last_changed_by\nlastClientRequestToken,last_client_request_token\nlastCompletedChangesetId,last_completed_changeset_id\nlastContentModificationTime,last_content_modification_time\nlastCutover,last_cutover\nlastDeployTime,last_deploy_time\nlastDeploymentAttemptedAt,last_deployment_attempted_at\nlastDeploymentJob,last_deployment_job\nlastDeploymentStatus,last_deployment_status\nlastDeploymentSucceededAt,last_deployment_succeeded_at\nlastDeploymentTime,last_deployment_time\nlastDisabledTime,last_disabled_time\nlastDriftEvaluationTime,last_drift_evaluation_time\nlastEnabledTime,last_enabled_time\nlastErrorCode,last_error_code\nlastErrorMessage,last_error_message\nlastEvaluatedAt,last_evaluated_at\nlastEventId,last_event_id\nlastEventTimestamp,last_event_timestamp\nlastHealthPingTime,last_health_ping_time\nlastHeartbeatTime,last_heartbeat_time\nlastIngestionTime,last_ingestion_time\nlastInstallationSource,last_installation_source\nlastJobId,last_job_id\nlastJobRunTime,last_job_run_time\nlastKnownExploitAt,last_known_exploit_at\nlastLaunch,last_launch\nlastLaunchResult,last_launch_result\nlastLoginTime,last_login_time\nlastMessageArrivalTime,last_message_arrival_time\nlastModelRefreshDate,last_model_refresh_date\nlastModificationTime,last_modification_time\nlastModified,last_modified\nlastModifiedAt,last_modified_at\nlastModifiedBy,last_modified_by\nlastModifiedDate,last_modified_date\nlastModifiedDateTime,last_modified_date_time\nlastModifiedOn,last_modified_on\nlastModifiedSecret,last_modified_secret\nlastModifiedTime,last_modified_time\nlastModifiedTimestamp,last_modified_timestamp\nlastModifiedUser,last_modified_user\nlastName,last_name\nlastObservedAt,last_observed_at\nlastReachedOutAt,last_reached_out_at\nlastRecordedPullTime,last_recorded_pull_time\nlastRecovery,last_recovery\nlastRecoveryResult,last_recovery_result\nlastReferencedTime,last_referenced_time\nlastRefreshTimestamp,last_refresh_timestamp\nlastReportedTimestamp,last_reported_timestamp\nlastResiliencyScoreEvaluationTime,last_resiliency_score_evaluation_time\nlastResourceAnalyzed,last_resource_analyzed\nlastResourceAnalyzedAt,last_resource_analyzed_at\nlastRunErrorStatus,last_run_error_status\nlastRunExecutionDetails,last_run_execution_details\nlastRunMetadataCatalogDetails,last_run_metadata_catalog_details\nlastRunTime,last_run_time\nlastScannedAt,last_scanned_at\nlastSeen,last_seen\nlastSeenAt,last_seen_at\nlastSeenByServiceDateTime,last_seen_by_service_date_time\nlastSeenDatetime,last_seen_datetime\nlastSnapshotDateTime,last_snapshot_date_time\nlastStartTime,last_start_time\nlastStartedAt,last_started_at\nlastStatisticsComputationTime,last_statistics_computation_time\nlastStatus,last_status\nlastStatusChange,last_status_change\nlastStatusChangeDate,last_status_change_date\nlastStatusChangeTime,last_status_change_time\nlastStatusChangeTimestamp,last_status_change_timestamp\nlastStatusUpdateTimestamp,last_status_update_timestamp\nlastStopTime,last_stop_time\nlastSucceededDeploymentId,last_succeeded_deployment_id\nlastSuccessfulComponentDeploymentIds,last_successful_component_deployment_ids\nlastSuccessfulDeployment,last_successful_deployment\nlastSuccessfulEnvironmentDeploymentId,last_successful_environment_deployment_id\nlastSuccessfulMergeDate,last_successful_merge_date\nlastSuccessfulServicePipelineDeploymentId,last_successful_service_pipeline_deployment_id\nlastSuccessfulTime,last_successful_time\nlastSyncedAt,last_synced_at\nlastTest,last_test\nlastTriggered,last_triggered\nlastTrxTimestampInMillis,last_trx_timestamp_in_millis\nlastUpdateDate,last_update_date\nlastUpdateDateTime,last_update_date_time\nlastUpdateTime,last_update_time\nlastUpdateToPayPerRequestTimestamp,last_update_to_pay_per_request_timestamp\nlastUpdated,last_updated\nlastUpdatedAt,last_updated_at\nlastUpdatedBy,last_updated_by\nlastUpdatedDataTime,last_updated_data_time\nlastUpdatedDate,last_updated_date\nlastUpdatedDateTime,last_updated_date_time\nlastUpdatedOn,last_updated_on\nlastUpdatedTime,last_updated_time\nlastUpdatedTimes,last_updated_times\nlastUpdatedTimestamp,last_updated_timestamp\nlastUsed,last_used\nlastUsedDate,last_used_date\nlastUsedIntent,last_used_intent\nlastUsedTime,last_used_time\nlastUtteredDate,last_uttered_date\nlastValidByteReceived,last_valid_byte_received\nlastViolationTime,last_violation_time\nlastViolationValue,last_violation_value\nlat,lat\nlateDataRules,late_data_rules\nlatency,latency\nlatencyMode,latency_mode\nlaterTime,later_time\nlatestActivityTaskTimestamp,latest_activity_task_timestamp\nlatestAgentOrchestratedAt,latest_agent_orchestrated_at\nlatestAgentProfileReportedAt,latest_agent_profile_reported_at\nlatestAggregatedProfile,latest_aggregated_profile\nlatestAmiId,latest_ami_id\nlatestBlockers,latest_blockers\nlatestBotVersion,latest_bot_version\nlatestCampaignUpdate,latest_campaign_update\nlatestCancelRequestedEventId,latest_cancel_requested_event_id\nlatestDatasetUpdate,latest_dataset_update\nlatestDate,latest_date\nlatestDescription,latest_description\nlatestExecution,latest_execution\nlatestExecutionContext,latest_execution_context\nlatestLaunchTime,latest_launch_time\nlatestRecommenderUpdate,latest_recommender_update\nlatestReplicationTime,latest_replication_time\nlatestRestorableTime,latest_restorable_time\nlatestRevision,latest_revision\nlatestSolutionVersion,latest_solution_version\nlatestSuccessfulSync,latest_successful_sync\nlatestSync,latest_sync\nlatestValidationTime,latest_validation_time\nlatestVersion,latest_version\nlatestVersionId,latest_version_id\nlatitude,latitude\nlaunch,launch\nlaunchActionsStatus,launch_actions_status\nlaunchConfig,launch_config\nlaunchConfigurationStatus,launch_configuration_status\nlaunchConfigurationTemplate,launch_configuration_template\nlaunchConfigurationTemplateID,launch_configuration_template_id\nlaunchConfigurationTemplateIDs,launch_configuration_template_ids\nlaunchCount,launch_count\nlaunchDetails,launch_details\nlaunchDisposition,launch_disposition\nlaunchFile,launch_file\nlaunchOrder,launch_order\nlaunchPermission,launch_permission\nlaunchProfile,launch_profile\nlaunchProfileId,launch_profile_id\nlaunchProfileInitialization,launch_profile_initialization\nlaunchProfileProtocolVersion,launch_profile_protocol_version\nlaunchProfileProtocolVersions,launch_profile_protocol_versions\nlaunchProfiles,launch_profiles\nlaunchPurpose,launch_purpose\nlaunchStatus,launch_status\nlaunchStatusMessage,launch_status_message\nlaunchTemplate,launch_template\nlaunchTemplateConfigurations,launch_template_configurations\nlaunchTemplateId,launch_template_id\nlaunchTemplateName,launch_template_name\nlaunchTemplateVersion,launch_template_version\nlaunchTime,launch_time\nlaunchType,launch_type\nlaunchedAt,launched_at\nlaunchedEc2InstanceID,launched_ec2_instance_id\nlaunchedInstance,launched_instance\nlaunchedVpcID,launched_vpc_id\nlaunches,launches\nlayerArn,layer_arn\nlayerArns,layer_arns\nlayerAvailability,layer_availability\nlayerDigest,layer_digest\nlayerDigests,layer_digests\nlayerHash,layer_hash\nlayerHashes,layer_hashes\nlayerPartBlob,layer_part_blob\nlayerSize,layer_size\nlayers,layers\nlayoutArn,layout_arn\nlayoutConfiguration,layout_configuration\nlayoutId,layout_id\nlayouts,layouts\nlcmOpInfo,lcm_op_info\nlcmOperationType,lcm_operation_type\nlearnMoreLink,learn_more_link\nleastRecentEvent,least_recent_event\nlength,length\nlevel,level\nlexTranscriptFilter,lex_transcript_filter\nlicenseConfigurationArns,license_configuration_arns\nlicenseCostReduction,license_cost_reduction\nlicenseEdition,license_edition\nlicenseExpiration,license_expiration\nlicenseModel,license_model\nlicenseName,license_name\nlicenseRecommendationOptions,license_recommendation_options\nlicenseRecommendations,license_recommendations\nlicenseType,license_type\nlicenseUrl,license_url\nlicenseVersion,license_version\nlicenses,licenses\nlicensing,licensing\nlifeCycle,life_cycle\nlifeCycleStates,life_cycle_states\nlifecycle,lifecycle\nlifecycleConfiguration,lifecycle_configuration\nlifecycleEventHookExecutionId,lifecycle_event_hook_execution_id\nlifecycleEventName,lifecycle_event_name\nlifecycleEvents,lifecycle_events\nlifecyclePolicyText,lifecycle_policy_text\nlifecycleState,lifecycle_state\nlifecycleStateDetails,lifecycle_state_details\nlifecycleStatusCodes,lifecycle_status_codes\nlimit,limit\nlimitCode,limit_code\nlimits,limits\nline,line\nlineCoveragePercentage,line_coverage_percentage\nlineNumber,line_number\nlineRange,line_range\nlineRanges,line_ranges\nlineSep,line_sep\nlinearInterval,linear_interval\nlinearPercentage,linear_percentage\nlinesCovered,lines_covered\nlinesMissed,lines_missed\nlink,link\nlinkOutUri,link_out_uri\nlinkedToGitHub,linked_to_git_hub\nlinks,links\nlinux,linux\nlinuxMountPoint,linux_mount_point\nlinuxParameters,linux_parameters\nlinuxProcessParams,linux_process_params\nlistAntipatternSeveritySummary,list_antipattern_severity_summary\nlistApplicationComponentStatusSummary,list_application_component_status_summary\nlistApplicationComponentStrategySummary,list_application_component_strategy_summary\nlistApplicationComponentSummary,list_application_component_summary\nlistColumns,list_columns\nlistServerStatusSummary,list_server_status_summary\nlistServerStrategySummary,list_server_strategy_summary\nlistServerSummary,list_server_summary\nlistSuppressedAlerts,list_suppressed_alerts\nlistSuppressedFindings,list_suppressed_findings\nlistValue,list_value\nlistenerArns,listener_arns\nlistenerIdentifier,listener_identifier\nlistenerPorts,listener_ports\nlisteners,listeners\nlists,lists\nloa,loa\nloaContent,loa_content\nloaContentType,loa_content_type\nloaIssueTime,loa_issue_time\nloadBalancer,load_balancer\nloadBalancerArn,load_balancer_arn\nloadBalancerDnsName,load_balancer_dns_name\nloadBalancerInfo,load_balancer_info\nloadBalancerName,load_balancer_name\nloadBalancers,load_balancers\nloadId,load_id\nloadIds,load_ids\nlocalPath,local_path\nlocalTraits,local_traits\nlocale,locale\nlocaleId,locale_id\nlocaleName,locale_name\nlocation,location\nlocationCode,location_code\nlocationName,location_name\nlocationStatus,location_status\nlocationType,location_type\nlocations,locations\nlockId,lock_id\nlog,log\nlogConfig,log_config\nlogConfiguration,log_configuration\nlogContext,log_context\nlogDateTime,log_date_time\nlogDelivery,log_delivery\nlogDriver,log_driver\nlogEventMessages,log_event_messages\nlogEvents,log_events\nlogExports,log_exports\nlogGroup,log_group\nlogGroupArn,log_group_arn\nlogGroupFields,log_group_fields\nlogGroupIdentifier,log_group_identifier\nlogGroupIdentifiers,log_group_identifiers\nlogGroupName,log_group_name\nlogGroupNamePattern,log_group_name_pattern\nlogGroupNamePrefix,log_group_name_prefix\nlogGroupNames,log_group_names\nlogGroups,log_groups\nlogLevel,log_level\nlogOddsImpact,log_odds_impact\nlogOddsMetrics,log_odds_metrics\nlogPrefix,log_prefix\nlogRecord,log_record\nlogRecordPointer,log_record_pointer\nlogResult,log_result\nlogSchemaVersion,log_schema_version\nlogSettings,log_settings\nlogStream,log_stream\nlogStreamName,log_stream_name\nlogStreamNamePrefix,log_stream_name_prefix\nlogStreamNames,log_stream_names\nlogStreams,log_streams\nlogTail,log_tail\nlogTarget,log_target\nlogTargetConfigurations,log_target_configurations\nlogType,log_type\nlogTypes,log_types\nlogUri,log_uri\nlogUrl,log_url\nlogging,logging\nloggingConfig,logging_config\nloggingConfiguration,logging_configuration\nloggingConfigurationIdentifier,logging_configuration_identifier\nloggingConfigurationIdentifiers,logging_configuration_identifiers\nloggingConfigurations,logging_configurations\nloggingLevel,logging_level\nloggingOptions,logging_options\nloggingOptionsPayload,logging_options_payload\nlogicalId,logical_id\nlogicalResourceId,logical_resource_id\nlogicalStackName,logical_stack_name\nlogicalStackNames,logical_stack_names\nlogin,login\nloginValidityDuration,login_validity_duration\nlogo,logo\nlogoImageBlob,logo_image_blob\nlogoURL,logo_url\nlogoUrl,logo_url\nlogonLanguage,logon_language\nlogs,logs\nlogsConfig,logs_config\nlogsConfigOverride,logs_config_override\nlon,lon\nlongReturnType,long_return_type\nlongValue,long_value\nlongitude,longitude\nlookBackPeriodInDays,look_back_period_in_days\nlookbackPeriodInDays,lookback_period_in_days\nlow,low\nlowerBoundValue,lower_bound_value\nlowerBoundValues,lower_bound_values\nlowerInclusive,lower_inclusive\nlt,lt\nlte,lte\nmacAddress,mac_address\nmacSecCapable,mac_sec_capable\nmacSecKeys,mac_sec_keys\nmain,main\nmainNode,main_node\nmaintenanceWindows,maintenance_windows\nmajorVersion,major_version\nmajorVersionNumber,major_version_number\nmanagedAgentName,managed_agent_name\nmanagedAgents,managed_agents\nmanagedCredentialsAction,managed_credentials_action\nmanagedCredentialsStatus,managed_credentials_status\nmanagedDataIdentifierIds,managed_data_identifier_ids\nmanagedDataIdentifierSelector,managed_data_identifier_selector\nmanagedDeviceArn,managed_device_arn\nmanagedDeviceId,managed_device_id\nmanagedFields,managed_fields\nmanagedJobTemplates,managed_job_templates\nmanagedPersistenceMonitoringConfiguration,managed_persistence_monitoring_configuration\nmanagedPolicyArns,managed_policy_arns\nmanagedScaling,managed_scaling\nmanagedTerminationProtection,managed_termination_protection\nmanagementAccountId,management_account_id\nmanagementPreference,management_preference\nmanifest,manifest\nmanualEvidence,manual_evidence\nmanualEvidenceCount,manual_evidence_count\nmanufacturer,manufacturer\nmapAutoTaggingMpeID,map_auto_tagging_mpe_id\nmapIterationAbortedEventDetails,map_iteration_aborted_event_details\nmapIterationFailedEventDetails,map_iteration_failed_event_details\nmapIterationStartedEventDetails,map_iteration_started_event_details\nmapIterationSucceededEventDetails,map_iteration_succeeded_event_details\nmapRunArn,map_run_arn\nmapRunFailedEventDetails,map_run_failed_event_details\nmapRunStartedEventDetails,map_run_started_event_details\nmapRuns,map_runs\nmapStateStartedEventDetails,map_state_started_event_details\nmapValue,map_value\nmappedInputFields,mapped_input_fields\nmappingType,mapping_type\nmarker,marker\nmarkerName,marker_name\nmarkerRecordedEventAttributes,marker_recorded_event_attributes\nmarketplaceCertified,marketplace_certified\nmarketplaceInformation,marketplace_information\nmaster,master\nmasterAccount,master_account\nmasterAccountId,master_account_id\nmasterDatabaseName,master_database_name\nmasterEndpoint,master_endpoint\nmasterUserPassword,master_user_password\nmasterUsername,master_username\nmatch,match\nmatchCount,match_count\nmatchEquals,match_equals\nmatchIDs,match_ids\nmatchId,match_id\nmatchKey,match_key\nmatchResult,match_result\nmatched,matched\nmatchedDevicesCount,matched_devices_count\nmatcher,matcher\nmatches,matches\nmatchingBucket,matching_bucket\nmatchingKeys,matching_keys\nmatchingResources,matching_resources\nmath,math\nmax,max\nmaxAccountLimitReached,max_account_limit_reached\nmaxAge,max_age\nmaxAttempts,max_attempts\nmaxBackupsToRetain,max_backups_to_retain\nmaxBatchSize,max_batch_size\nmaxBuckets,max_buckets\nmaxConcurrency,max_concurrency\nmaxConflictFiles,max_conflict_files\nmaxConnections,max_connections\nmaxCpus,max_cpus\nmaxDepth,max_depth\nmaxDevices,max_devices\nmaxDuration,max_duration\nmaxEjectionPercent,max_ejection_percent\nmaxFileCount,max_file_count\nmaxFilesToKeep,max_files_to_keep\nmaxGpus,max_gpus\nmaxHPONumberOfTrainingJobs,max_hpo_number_of_training_jobs\nmaxHPOParallelTrainingJobs,max_hpo_parallel_training_jobs\nmaxIdleTimeInSeconds,max_idle_time_in_seconds\nmaxIndexingCapacityInOCU,max_indexing_capacity_in_ocu\nmaxInstancesCount,max_instances_count\nmaxItems,max_items\nmaxJobDurationInSeconds,max_job_duration_in_seconds\nmaxJobTimeoutMinutes,max_job_timeout_minutes\nmaxLength,max_length\nmaxLengthMs,max_length_ms\nmaxLifetimeTimeoutMinutes,max_lifetime_timeout_minutes\nmaxLineCoveragePercentage,max_line_coverage_percentage\nmaxMergeHunks,max_merge_hunks\nmaxMessages,max_messages\nmaxNodeCount,max_node_count\nmaxNumberOfTrainingJobs,max_number_of_training_jobs\nmaxPageSize,max_page_size\nmaxParallelLaunches,max_parallel_launches\nmaxParallelTrainingJobs,max_parallel_training_jobs\nmaxParallelism,max_parallelism\nmaxPendingRequests,max_pending_requests\nmaxQueueSize,max_queue_size\nmaxRequests,max_requests\nmaxResult,max_result\nmaxResults,max_results\nmaxRetries,max_retries\nmaxRuns,max_runs\nmaxRuntimeInSeconds,max_runtime_in_seconds\nmaxSampleCount,max_sample_count\nmaxSearchCapacityInOCU,max_search_capacity_in_ocu\nmaxSeconds,max_seconds\nmaxServerErrors,max_server_errors\nmaxSessionLengthInMinutes,max_session_length_in_minutes\nmaxSize,max_size\nmaxSizeInMB,max_size_in_mb\nmaxSlots,max_slots\nmaxStoppedSessionLengthInMinutes,max_stopped_session_length_in_minutes\nmaxSwap,max_swap\nmaxUnavailable,max_unavailable\nmaxUnavailablePercentage,max_unavailable_percentage\nmaxValue,max_value\nmaxVersions,max_versions\nmaxWorkerCount,max_worker_count\nmaximum,maximum\nmaximumBuildsAllowed,maximum_builds_allowed\nmaximumCapacity,maximum_capacity\nmaximumCount,maximum_count\nmaximumElevation,maximum_elevation\nmaximumMatchDistance,maximum_match_distance\nmaximumMessageLength,maximum_message_length\nmaximumMessageRatePerSecond,maximum_message_rate_per_second\nmaximumPageSize,maximum_page_size\nmaximumPerMinute,maximum_per_minute\nmaximumPercent,maximum_percent\nmaximumScalingStepSize,maximum_scaling_step_size\nmaximumTTL,maximum_ttl\nmaxvCpus,maxv_cpus\nmcuCount,mcu_count\nmd5,md5\nmd5sum,md5_sum\nmeCollectorSummary,me_collector_summary\nmean,mean\nmeanTimeToClose,mean_time_to_close\nmeasurement,measurement\nmediaType,media_type\nmedium,medium\nmember,member\nmemberAbilities,member_abilities\nmemberAccountId,member_account_id\nmemberAccounts,member_accounts\nmemberAccountsEnrolled,member_accounts_enrolled\nmemberFileExtensions,member_file_extensions\nmemberStatus,member_status\nmemberSummaries,member_summaries\nmembers,members\nmembership,membership\nmembershipArn,membership_arn\nmembershipId,membership_id\nmembershipIdentifier,membership_identifier\nmembershipStatus,membership_status\nmembershipSummaries,membership_summaries\nmemberships,memberships\nmemory,memory\nmemoryGBHour,memory_gb_hour\nmemoryInfo,memory_info\nmemoryReservation,memory_reservation\nmemorySize,memory_size\nmemorySizeConfiguration,memory_size_configuration\nmemorySizeInKB,memory_size_in_kb\nmemorySizeRecommendationOptions,memory_size_recommendation_options\nmerge,merge\nmergeBase,merge_base\nmergeCommitId,merge_commit_id\nmergeHunks,merge_hunks\nmergeMetadata,merge_metadata\nmergeOperations,merge_operations\nmergeOption,merge_option\nmergeOptions,merge_options\nmergeStrategy,merge_strategy\nmergeType,merge_type\nmergeable,mergeable\nmergedApiArn,merged_api_arn\nmergedApiExecutionRoleArn,merged_api_execution_role_arn\nmergedApiId,merged_api_id\nmergedApiIdentifier,merged_api_identifier\nmergedBy,merged_by\nmergedCommitId,merged_commit_id\nmesh,mesh\nmeshName,mesh_name\nmeshOwner,mesh_owner\nmeshes,meshes\nmessage,message\nmessageContent,message_content\nmessageExpiry,message_expiry\nmessageFormat,message_format\nmessageGroups,message_groups\nmessageId,message_id\nmessageReviewHandler,message_review_handler\nmessageReviewHandlerUri,message_review_handler_uri\nmessageSelectionStrategy,message_selection_strategy\nmessageType,message_type\nmessageVersion,message_version\nmessages,messages\nmeta,meta\nmetaStoreManagerRoleArn,meta_store_manager_role_arn\nmetadata,metadata\nmetadataCatalogConfig,metadata_catalog_config\nmetadataCatalogDetails,metadata_catalog_details\nmetadataKey,metadata_key\nmetadataOptions,metadata_options\nmetered,metered\nmethod,method\nmethodIntegration,method_integration\nmethodName,method_name\nmethodResponses,method_responses\nmethodSettings,method_settings\nmetric,metric\nmetricArn,metric_arn\nmetricAttribution,metric_attribution\nmetricAttributionArn,metric_attribution_arn\nmetricAttributions,metric_attributions\nmetricData,metric_data\nmetricDataPoints,metric_data_points\nmetricDatumList,metric_datum_list\nmetricDefinition,metric_definition\nmetricDimension,metric_dimension\nmetricFilterCount,metric_filter_count\nmetricFilters,metric_filters\nmetricGoals,metric_goals\nmetricMonitors,metric_monitors\nmetricName,metric_name\nmetricNames,metric_names\nmetricNamespace,metric_namespace\nmetricRegex,metric_regex\nmetricRuleRoleArn,metric_rule_role_arn\nmetricTarget,metric_target\nmetricTimestamp,metric_timestamp\nmetricTransformations,metric_transformations\nmetricType,metric_type\nmetricUnit,metric_unit\nmetricValue,metric_value\nmetrics,metrics\nmetricsConfiguration,metrics_configuration\nmetricsEnabled,metrics_enabled\nmetricsOutputConfig,metrics_output_config\nmetricsResults,metrics_results\nmetricsSource,metrics_source\nmetricsSummary,metrics_summary\nmfaAuthenticated,mfa_authenticated\nmigrationEffort,migration_effort\nmigrationId,migration_id\nmigrationStatus,migration_status\nmigrationStatusEquals,migration_status_equals\nmigrationStrategy,migration_strategy\nmigrationSummaries,migration_summaries\nmigrationTimestamp,migration_timestamp\nmigrationWorkflowSummary,migration_workflow_summary\nmillisUntilNextRefreshable,millis_until_next_refreshable\nmimeType,mime_type\nmin,min\nminLineCoveragePercentage,min_line_coverage_percentage\nminNodeCount,min_node_count\nminNumberOfExecutedThings,min_number_of_executed_things\nminPower,min_power\nminProvisionedTPS,min_provisioned_tps\nminRecommendationRequestsPerSecond,min_recommendation_requests_per_second\nminSeconds,min_seconds\nminSize,min_size\nminValue,min_value\nminWorkerCount,min_worker_count\nminimum,minimum\nminimumCompressionSize,minimum_compression_size\nminimumCount,minimum_count\nminimumHealthyHosts,minimum_healthy_hosts\nminimumHealthyPercent,minimum_healthy_percent\nminimumLinks,minimum_links\nminimumSamplingIntervalMs,minimum_sampling_interval_ms\nminimumScalingStepSize,minimum_scaling_step_size\nminimumTTL,minimum_ttl\nminimumTriggerIntervalMs,minimum_trigger_interval_ms\nminimumViableContactDurationSeconds,minimum_viable_contact_duration_seconds\nminorVersion,minor_version\nminvCpus,minv_cpus\nmissedCount,missed_count\nmissing,missing\nmissingContextValues,missing_context_values\nmissionProfileArn,mission_profile_arn\nmissionProfileId,mission_profile_id\nmissionProfileList,mission_profile_list\nmixed,mixed\nmixin,mixin\nmlDetectionConfig,ml_detection_config\nmlModelTrainingJobId,ml_model_training_job_id\nmlModelTransformJobId,ml_model_transform_job_id\nmlModels,ml_models\nmodality,modality\nmode,mode\nmodel,model\nmodelArn,model_arn\nmodelArnEquals,model_arn_equals\nmodelCustomizationJobSummaries,model_customization_job_summaries\nmodelDetails,model_details\nmodelEndpoint,model_endpoint\nmodelEndpointStatus,model_endpoint_status\nmodelId,model_id\nmodelIdentifier,model_identifier\nmodelKmsKeyArn,model_kms_key_arn\nmodelManifestArn,model_manifest_arn\nmodelMetrics,model_metrics\nmodelName,model_name\nmodelPerformance,model_performance\nmodelScores,model_scores\nmodelSource,model_source\nmodelStatus,model_status\nmodelSummaries,model_summaries\nmodelTransformJob,model_transform_job\nmodelTransformOutputS3Location,model_transform_output_s3_location\nmodelType,model_type\nmodelUnits,model_units\nmodelVariables,model_variables\nmodelVersion,model_version\nmodelVersionDetails,model_version_details\nmodelVersionNumber,model_version_number\nmodelVersions,model_versions\nmodels,models\nmodernizeInfrastructureWithCloudNativeTechnologies,modernize_infrastructure_with_cloud_native_technologies\nmodes,modes\nmodified,modified\nmodifiedAt,modified_at\nmodifiedCount,modified_count\nmodifiedTimestamp,modified_timestamp\nmodifyVnfInfoData,modify_vnf_info_data\nmodule,module\nmonitoredResourceInfo,monitored_resource_info\nmonitoredResourceName,monitored_resource_name\nmonitoringConfiguration,monitoring_configuration\nmonth,month\nmonthlySchedule,monthly_schedule\nmonthlyTransfer,monthly_transfer\nmoreApplicationResource,more_application_resource\nmoreInfo,more_info\nmoreServerAssociationExists,more_server_association_exists\nmostRecentEvent,most_recent_event\nmostRecentExecutionMessage,most_recent_execution_message\nmostRecentExecutionStatus,most_recent_execution_status\nmostRecentExecutionTime,most_recent_execution_time\nmountOptions,mount_options\nmountPath,mount_path\nmountPoint,mount_point\nmountPoints,mount_points\nmountROSysfs,mount_ro_sysfs\nmqttContext,mqtt_context\nmqttTopic,mqtt_topic\nmtu,mtu\nmultiLayerStorage,multi_layer_storage\nmultiNodeJobId,multi_node_job_id\nmultiTurnConversation,multi_turn_conversation\nmultiValueHeaders,multi_value_headers\nmultipleValuesSetting,multiple_values_setting\nmustSucceedForCutover,must_succeed_for_cutover\nmutationsFilePath,mutations_file_path\nmutualTlsAuthentication,mutual_tls_authentication\nname,name\nnameContains,name_contains\nnamePattern,name_pattern\nnamePrefixFilter,name_prefix_filter\nnameQuery,name_query\nnameServersUpdateState,name_servers_update_state\nnamedShadowIndexingMode,named_shadow_indexing_mode\nnamedShadowNames,named_shadow_names\nnames,names\nnamespace,namespace\nnamespaceArn,namespace_arn\nnamespaceId,namespace_id\nnamespaceName,namespace_name\nnamespaceType,namespace_type\nnamespaceVersion,namespace_version\nnamespaces,namespaces\nneedsReplacements,needs_replacements\nnegative,negative\nneighborConfigurationIds,neighbor_configuration_ids\nneighbors,neighbors\nneptuneIamRoleArn,neptune_iam_role_arn\nneq,neq\nnestedType,nested_type\nnetMask,net_mask\nnetmask,netmask\nnetwork,network\nnetworkAccessControl,network_access_control\nnetworkArn,network_arn\nnetworkBindings,network_bindings\nnetworkConfiguration,network_configuration\nnetworkFileDefinitions,network_file_definitions\nnetworkFindings,network_findings\nnetworkInfoList,network_info_list\nnetworkInstances,network_instances\nnetworkInterface,network_interface\nnetworkInterfaceId,network_interface_id\nnetworkInterfaces,network_interfaces\nnetworkInterfacesToAdd,network_interfaces_to_add\nnetworkInterfacesToRemove,network_interfaces_to_remove\nnetworkInterfacesToUpdate,network_interfaces_to_update\nnetworkMode,network_mode\nnetworkName,network_name\nnetworkOperations,network_operations\nnetworkOrigin,network_origin\nnetworkPackages,network_packages\nnetworkPath,network_path\nnetworkProfile,network_profile\nnetworkProfileArn,network_profile_arn\nnetworkProfiles,network_profiles\nnetworkProtocol,network_protocol\nnetworkReachabilityDetails,network_reachability_details\nnetworkResource,network_resource\nnetworkResourceArn,network_resource_arn\nnetworkResources,network_resources\nnetworkSettings,network_settings\nnetworkSettingsArn,network_settings_arn\nnetworkSite,network_site\nnetworkSiteArn,network_site_arn\nnetworkSiteName,network_site_name\nnetworkSites,network_sites\nnetworking,networking\nnetworks,networks\nneutral,neutral\nnewApplicationName,new_application_name\nnewApprovalRuleTemplateName,new_approval_rule_template_name\nnewAutoRegistrationStatus,new_auto_registration_status\nnewBGPPeer,new_bgp_peer\nnewDeploymentGroupName,new_deployment_group_name\nnewDirectConnectGatewayName,new_direct_connect_gateway_name\nnewDiskName,new_disk_name\nnewExecutionRunId,new_execution_run_id\nnewFindings,new_findings\nnewImageDescription,new_image_description\nnewImageDisplayName,new_image_display_name\nnewImageName,new_image_name\nnewImageTags,new_image_tags\nnewName,new_name\nnewPrivateVirtualInterface,new_private_virtual_interface\nnewPrivateVirtualInterfaceAllocation,new_private_virtual_interface_allocation\nnewPublicVirtualInterface,new_public_virtual_interface\nnewPublicVirtualInterfaceAllocation,new_public_virtual_interface_allocation\nnewRevision,new_revision\nnewRuleContent,new_rule_content\nnewStatus,new_status\nnewTableName,new_table_name\nnewTransitVirtualInterface,new_transit_virtual_interface\nnewTransitVirtualInterfaceAllocation,new_transit_virtual_interface_allocation\nnewValue,new_value\nnext,next\nnextAttemptDateTime,next_attempt_date_time\nnextBackwardToken,next_backward_token\nnextDeliveryTime,next_delivery_time\nnextDeployment,next_deployment\nnextForwardToken,next_forward_token\nnextIndex,next_index\nnextMarker,next_marker\nnextPageCount,next_page_count\nnextPageToken,next_page_token\nnextPeriod,next_period\nnextRefreshTime,next_refresh_time\nnextReplicationRunStartTime,next_replication_run_start_time\nnextSequenceToken,next_sequence_token\nnextSnapshotTimeOfDay,next_snapshot_time_of_day\nnextState,next_state\nnextStep,next_step\nnextToken,next_token\nnfc,nfc\nnluConfidence,nlu_confidence\nnluIntentConfidence,nlu_intent_confidence\nnluIntentConfidenceThreshold,nlu_intent_confidence_threshold\nnniPartnerType,nni_partner_type\nnoDevice,no_device\nnoEcho,no_echo\nnoInlineDocumentSupport,no_inline_document_support\nnoOfSrvCompleted,no_of_srv_completed\nnoOfSrvFailed,no_of_srv_failed\nnodeCount,node_count\nnodeCounts,node_counts\nnodeDetails,node_details\nnodeGroup,node_group\nnodeId,node_id\nnodeIndex,node_index\nnodeLabels,node_labels\nnodeName,node_name\nnodeOverrides,node_overrides\nnodeProperties,node_properties\nnodePropertyOverrides,node_property_overrides\nnodeRangeProperties,node_range_properties\nnodeRole,node_role\nnodeStructures,node_structures\nnodeSummaries,node_summaries\nnodeType,node_type\nnodegroup,nodegroup\nnodegroupArn,nodegroup_arn\nnodegroupName,nodegroup_name\nnodegroups,nodegroups\nnodes,nodes\nnodesToAdd,nodes_to_add\nnodesToRemove,nodes_to_remove\nnodesToUpdate,nodes_to_update\nnonCompliantChecks,non_compliant_checks\nnonCompliantResource,non_compliant_resource\nnonCompliantResourcesCount,non_compliant_resources_count\nnonModels,non_models\nnonce,nonce\nnoncompliantEvidenceCount,noncompliant_evidence_count\nnoradSatelliteID,norad_satellite_id\nnotAfter,not_after\nnotBefore,not_before\nnotClassified,not_classified\nnotFoundIdentifierIds,not_found_identifier_ids\nnotSensitive,not_sensitive\nnotShared,not_shared\nnotValidAfter,not_valid_after\nnotValidBefore,not_valid_before\nnote,note\nnotification,notification\nnotificationActions,notification_actions\nnotificationConfiguration,notification_configuration\nnotificationContext,notification_context\nnotificationDestinations,notification_destinations\nnotificationEnabled,notification_enabled\nnotificationEndpoint,notification_endpoint\nnotificationLambdaArn,notification_lambda_arn\nnotificationSenderEmail,notification_sender_email\nnotificationSettingKeys,notification_setting_keys\nnotificationSettings,notification_settings\nnotificationTargets,notification_targets\nnotificationTriggers,notification_triggers\nnotifications,notifications\nnotifyOnAddCorrespondenceToCase,notify_on_add_correspondence_to_case\nnotifyOnCaseSeverity,notify_on_case_severity\nnotifyOnCreateOrReopenCase,notify_on_create_or_reopen_case\nnotifyOnResolveCase,notify_on_resolve_case\nnsDescription,ns_description\nnsInstanceDescription,ns_instance_description\nnsInstanceId,ns_instance_id\nnsInstanceName,ns_instance_name\nnsLcmOpOccId,ns_lcm_op_occ_id\nnsName,ns_name\nnsState,ns_state\nnsd,nsd\nnsdContent,nsd_content\nnsdDesigner,nsd_designer\nnsdId,nsd_id\nnsdInfoId,nsd_info_id\nnsdInvariantId,nsd_invariant_id\nnsdName,nsd_name\nnsdOnboardingState,nsd_onboarding_state\nnsdOperationalState,nsd_operational_state\nnsdUsageState,nsd_usage_state\nnsdVersion,nsd_version\nnullable,nullable\nnumBytes,num_bytes\nnumChangesets,num_changesets\nnumClasses,num_classes\nnumDistinctPredicates,num_distinct_predicates\nnumDistinctSubjects,num_distinct_subjects\nnumEdgeLabels,num_edge_labels\nnumEdgeProperties,num_edge_properties\nnumEdges,num_edges\nnumFiles,num_files\nnumNodeLabels,num_node_labels\nnumNodeProperties,num_node_properties\nnumNodes,num_nodes\nnumOfReports,num_of_reports\nnumParallelProcesses,num_parallel_processes\nnumQuads,num_quads\nnumResults,num_results\nnumTurns,num_turns\nnumValues,num_values\nnumVersions,num_versions\nnumber,number\nnumberOfApplicationComponents,number_of_application_components\nnumberOfAssociatedServices,number_of_associated_services\nnumberOfAssociatedVPCs,number_of_associated_vpcs\nnumberOfCanceledThings,number_of_canceled_things\nnumberOfConflicts,number_of_conflicts\nnumberOfConnections,number_of_connections\nnumberOfCores,number_of_cores\nnumberOfDays,number_of_days\nnumberOfEvents,number_of_events\nnumberOfFailedThings,number_of_failed_things\nnumberOfInProgressThings,number_of_in_progress_things\nnumberOfInvocations,number_of_invocations\nnumberOfMemberAccountsOptedIn,number_of_member_accounts_opted_in\nnumberOfNotifiedThings,number_of_notified_things\nnumberOfQueuedThings,number_of_queued_things\nnumberOfRecentAmisToKeep,number_of_recent_amis_to_keep\nnumberOfRecordsFailed,number_of_records_failed\nnumberOfRecordsSuccess,number_of_records_success\nnumberOfRecordsUpdated,number_of_records_updated\nnumberOfRejectedThings,number_of_rejected_things\nnumberOfRemovedThings,number_of_removed_things\nnumberOfRetries,number_of_retries\nnumberOfRevisions,number_of_revisions\nnumberOfRuns,number_of_runs\nnumberOfSucceededThings,number_of_succeeded_things\nnumberOfTimedOutThings,number_of_timed_out_things\nnumberOfTransactions,number_of_transactions\nnumberOfTurns,number_of_turns\nnumbers,numbers\nnumericSeverity,numeric_severity\noAuth2Credentials,o_auth2_credentials\noAuth2Defaults,o_auth2_defaults\noAuth2GrantType,o_auth2_grant_type\noAuth2Properties,o_auth2_properties\noAuthCredentials,o_auth_credentials\noAuthProperties,o_auth_properties\noAuthRequest,o_auth_request\noAuthScopes,o_auth_scopes\noauth2,oauth2\noauth2CustomProperties,oauth2_custom_properties\noauth2GrantTypesSupported,oauth2_grant_types_supported\noauthScopes,oauth_scopes\noauthToken,oauth_token\nobdInterface,obd_interface\nobdSignal,obd_signal\nobdStandard,obd_standard\nobfuscate,obfuscate\nobfuscationSetting,obfuscation_setting\nobfuscationSettingType,obfuscation_setting_type\nobject,object\nobjectCount,object_count\nobjectCountByEncryptionType,object_count_by_encryption_type\nobjectFields,object_fields\nobjectId,object_id\nobjectIds,object_ids\nobjectKey,object_key\nobjectName,object_name\nobjectPath,object_path\nobjectPrefixes,object_prefixes\nobjectType,object_type\nobjectTypeConflict,object_type_conflict\nobjectTypeName,object_type_name\nobjectTypes,object_types\nobjectVersion,object_version\nobjectVersioning,object_versioning\nobjectiveSensitivity,objective_sensitivity\nobjects,objects\noccurrences,occurrences\noccurrencesThreshold,occurrences_threshold\noemData,oem_data\noffering,offering\nofferingClass,offering_class\nofferingId,offering_id\nofferingIds,offering_ids\nofferingPromotionId,offering_promotion_id\nofferingPromotions,offering_promotions\nofferingStatus,offering_status\nofferingTransaction,offering_transaction\nofferingTransactions,offering_transactions\nofferings,offerings\noffset,offset\noffsetInNanos,offset_in_nanos\noffsetRange,offset_range\noffsetRanges,offset_ranges\noffsetSeconds,offset_seconds\nofi,ofi\noidc,oidc\noldApprovalRuleTemplateName,old_approval_rule_template_name\noldName,old_name\noldestDate,oldest_date\nonEnter,on_enter\nonExit,on_exit\nonExitCode,on_exit_code\nonFailure,on_failure\nonInput,on_input\nonPremisesInstanceTagFilters,on_premises_instance_tag_filters\nonPremisesTagSet,on_premises_tag_set\nonPremisesTagSetList,on_premises_tag_set_list\nonReason,on_reason\nonStatusReason,on_status_reason\nonboardingState,onboarding_state\noneTime,one_time\nonlineAbConfig,online_ab_config\nonlineAbDefinition,online_ab_definition\nonlyActiveViolationsIncluded,only_active_violations_included\nonlyAssociated,only_associated\nop,op\nopNum,op_num\nopenActivityTasks,open_activity_tasks\nopenChildWorkflowExecutions,open_child_workflow_executions\nopenCounts,open_counts\nopenCypherQuery,open_cypher_query\nopenDecisionTasks,open_decision_tasks\nopenFindings,open_findings\nopenIDConnectConfig,open_id_connect_config\nopenIdIssuer,open_id_issuer\nopenLambdaFunctions,open_lambda_functions\nopenPortRange,open_port_range\nopenSearch,open_search\nopenSearchServiceConfig,open_search_service_config\nopenTimers,open_timers\nopencypher,opencypher\noperand,operand\noperandType,operand_type\noperatingSystem,operating_system\noperatingSystemFamily,operating_system_family\noperatingSystems,operating_systems\noperation,operation\noperationDetails,operation_details\noperationId,operation_id\noperationIdentifier,operation_identifier\noperationName,operation_name\noperationState,operation_state\noperationSucceeded,operation_succeeded\noperationType,operation_type\noperationalState,operational_state\noperations,operations\noperator,operator\noptimizationObjective,optimization_objective\noptimizationType,optimization_type\noptimizedStagingDiskType,optimized_staging_disk_type\noption,option\noptional,optional\noptions,options\nor,or\norder,order\norderArn,order_arn\norderBy,order_by\norderByTime,order_by_time\norderedResources,ordered_resources\norders,orders\norg,org\norgPackagePaths,org_package_paths\norganizationArns,organization_arns\norganizationEntityAccountFilters,organization_entity_account_filters\norganizationEntityAggregates,organization_entity_aggregates\norganizationEntityFilters,organization_entity_filters\norganizationEventDetailFilters,organization_event_detail_filters\norganizationId,organization_id\norganizationRoleName,organization_role_name\norganizationalUnitArns,organizational_unit_arns\norganizationalUnitDistinguishedName,organizational_unit_distinguished_name\norganizationalUnits,organizational_units\norientation,orientation\norigin,origin\noriginAccountID,origin_account_id\noriginApprovalRuleTemplate,origin_approval_rule_template\noriginAvailabilityZone,origin_availability_zone\noriginConfiguration,origin_configuration\noriginEnvironment,origin_environment\noriginPublicDNS,origin_public_dns\noriginRegion,origin_region\noriginType,origin_type\noriginalDiskPath,original_disk_path\noriginalMessage,original_message\noriginalStatusCode,original_status_code\noriginalValue,original_value\noriginatingRequestId,originating_request_id\norphanedResources,orphaned_resources\nos,os\nosByol,os_byol\nosDriver,os_driver\nosInfo,os_info\nosType,os_type\nosVersion,os_version\notaUpdateArn,ota_update_arn\notaUpdateFiles,ota_update_files\notaUpdateId,ota_update_id\notaUpdateInfo,ota_update_info\notaUpdateStatus,ota_update_status\notaUpdates,ota_updates\noutboundCallConfig,outbound_call_config\noutcomes,outcomes\noutdatedInstancesStrategy,outdated_instances_strategy\nouterPadding,outer_padding\noutgoingCertificates,outgoing_certificates\noutlierDetection,outlier_detection\noutpostArns,outpost_arns\noutpostConfig,outpost_config\noutput,output\noutputArtifactDetails,output_artifact_details\noutputArtifacts,output_artifacts\noutputConfiguration,output_configuration\noutputConstraints,output_constraints\noutputContexts,output_contexts\noutputDataConfig,output_data_config\noutputDetails,output_details\noutputFileUriValue,output_file_uri_value\noutputFormat,output_format\noutputLocation,output_location\noutputModalities,output_modalities\noutputModelArn,output_model_arn\noutputModelKmsKeyArn,output_model_kms_key_arn\noutputModelName,output_model_name\noutputNode,output_node\noutputPath,output_path\noutputResources,output_resources\noutputS3Bucket,output_s3_bucket\noutputS3BucketName,output_s3_bucket_name\noutputS3Directory,output_s3_directory\noutputS3KeyPrefix,output_s3_key_prefix\noutputS3Path,output_s3_path\noutputS3Uri,output_s3_uri\noutputSourceConfig,output_source_config\noutputToken,output_token\noutputType,output_type\noutputUri,output_uri\noutputVariableName,output_variable_name\noutputVariables,output_variables\noutputs,outputs\noverallStatus,overall_status\noverallTestResults,overall_test_results\noverridden,overridden\noverrideAlarmConfiguration,override_alarm_configuration\noverrideAllowedPrefixesToDirectConnectGateway,override_allowed_prefixes_to_direct_connect_gateway\noverrideArtifactName,override_artifact_name\noverrideDynamicGroups,override_dynamic_groups\noverrideFormat,override_format\noverrideLinkOutUri,override_link_out_uri\noverrideStatus,override_status\noverrider,overrider\noverrides,overrides\nownedBy,owned_by\nowner,owner\nownerAccount,owner_account\nownerArn,owner_arn\nownerContact,owner_contact\nownerFilter,owner_filter\nownerId,owner_id\nownerIdentifier,owner_identifier\nownerInfo,owner_info\nowners,owners\nownershipVerificationCertificateArn,ownership_verification_certificate_arn\nowningAccountId,owning_account_id\npackage,package\npackageArn,package_arn\npackageCleanup,package_cleanup\npackageContent,package_content\npackageFormat,package_format\npackageManager,package_manager\npackageName,package_name\npackageNames,package_names\npackagePaths,package_paths\npackagePrefix,package_prefix\npackageSummaries,package_summaries\npackageType,package_type\npackageVersion,package_version\npackageVersionArn,package_version_arn\npackageVersionRevision,package_version_revision\npackageVersionSummaries,package_version_summaries\npackageVulnerabilityDetails,package_vulnerability_details\npackages,packages\npackaging,packaging\npacketsDropped,packets_dropped\npage,page\npageNumber,page_number\npageSize,page_size\npageToken,page_token\npagerDutyIncidentConfiguration,pager_duty_incident_configuration\npages,pages\npaginated,paginated\npaginationConfig,pagination_config\nparallelRun,parallel_run\nparallelism,parallelism\nparallelismConfig,parallelism_config\nparameter,parameter\nparameterApplyStatus,parameter_apply_status\nparameterConfiguration,parameter_configuration\nparameterKey,parameter_key\nparameterName,parameter_name\nparameterObjects,parameter_objects\nparameterSets,parameter_sets\nparameterTemplate,parameter_template\nparameterType,parameter_type\nparameterValue,parameter_value\nparameterValues,parameter_values\nparameters,parameters\nparams,params\nparent,parent\nparentAssetId,parent_asset_id\nparentBotNetworks,parent_bot_networks\nparentCommitId,parent_commit_id\nparentConnectionId,parent_connection_id\nparentEntityId,parent_entity_id\nparentEntityUpdate,parent_entity_update\nparentGroup,parent_group\nparentGroupName,parent_group_name\nparentGroupNames,parent_group_names\nparentId,parent_id\nparentIdentifier,parent_identifier\nparentImage,parent_image\nparentInitiatedEventId,parent_initiated_event_id\nparentIntentSignature,parent_intent_signature\nparentResourceName,parent_resource_name\nparentSlotTypeSignature,parent_slot_type_signature\nparentTargetArn,parent_target_arn\nparentWorkflowExecution,parent_workflow_execution\nparents,parents\nparquetConfiguration,parquet_configuration\nparserConfiguration,parser_configuration\nparsingResultUrl,parsing_result_url\npartFirstByte,part_first_byte\npartLastByte,part_last_byte\npartNumber,part_number\npartSize,part_size\npartSource,part_source\npartial,partial\nparticipant,participant\nparticipantId,participant_id\nparticipantToken,participant_token\nparticipantTokenConfigurations,participant_token_configurations\nparticipantTokens,participant_tokens\nparticipants,participants\nparticipatingResourceID,participating_resource_id\nparticipatingResources,participating_resources\nparticipatingServers,participating_servers\npartition,partition\npartitionColumns,partition_columns\npartitionKey,partition_key\npartitionKeys,partition_keys\npartitionRegistrationOutput,partition_registration_output\npartitions,partitions\npartner,partner\npartnerName,partner_name\nparts,parts\npassed,passed\npassthroughBehavior,passthrough_behavior\npassword,password\npasswordData,password_data\npasswordVersion,password_version\npasteAllowed,paste_allowed\npatchOperations,patch_operations\npath,path\npathFormat,path_format\npathMatch,path_match\npathPart,path_part\npathPrefixHierarchy,path_prefix_hierarchy\npathWithQueryString,path_with_query_string\npattern,pattern\npayload,payload\npayloadField,payload_field\npayloadFormat,payload_format\npayloadFormatIndicator,payload_format_indicator\npayloadSize,payload_size\npayloadUrl,payload_url\npayloadVersion,payload_version\npayloads,payloads\npaymentOption,payment_option\npaymentOptions,payment_options\npemEncodedCertificate,pem_encoded_certificate\npending,pending\npendingCount,pending_count\npendingMaintenance,pending_maintenance\npendingMaintenanceActions,pending_maintenance_actions\npendingModifiedValues,pending_modified_values\npendingPlan,pending_plan\npendingPricingPlan,pending_pricing_plan\npendingRequestCount,pending_request_count\npendingRequests,pending_requests\npendingTasksCount,pending_tasks_count\nperRequest,per_request\nperRetryTimeout,per_retry_timeout\npercent,percent\npercentComplete,percent_complete\npercentDone,percent_done\npercentPromotedItems,percent_promoted_items\npercentTraffic,percent_traffic\npercentageAdjust,percentage_adjust\npercentageComplete,percentage_complete\npercentageProgress,percentage_progress\npercentiles,percentiles\npercents,percents\nperformAutoML,perform_auto_ml\nperformHPO,perform_hpo\nperformanceRisk,performance_risk\nperiod,period\nperiodInSeconds,period_in_seconds\nperiodMs,period_ms\npermission,permission\npermissionArn,permission_arn\npermissionArns,permission_arns\npermissionConfiguration,permission_configuration\npermissionGroup,permission_group\npermissionGroupId,permission_group_id\npermissionGroupParams,permission_group_params\npermissionGroups,permission_groups\npermissionModel,permission_model\npermissionStatus,permission_status\npermissionType,permission_type\npermissionVersion,permission_version\npermissions,permissions\npersistentAppUI,persistent_app_ui\npersistentStorage,persistent_storage\npersona,persona\npersonalizedRanking,personalized_ranking\nphaseStatus,phase_status\nphaseType,phase_type\nphases,phases\nphoneNumber,phone_number\nphoneNumbers,phone_numbers\nphrase,phrase\nphysicalConnectorType,physical_connector_type\nphysicalNetworkInterfaceId,physical_network_interface_id\nphysicalNetworkInterfaces,physical_network_interfaces\nphysicalResource,physical_resource\nphysicalResourceId,physical_resource_id\nphysicalResources,physical_resources\npid,pid\npidMode,pid_mode\npidRequestIntervalSeconds,pid_request_interval_seconds\npidResponseLength,pid_response_length\npinned,pinned\npipeline,pipeline\npipelineActivities,pipeline_activities\npipelineActivity,pipeline_activity\npipelineArn,pipeline_arn\npipelineCodebuildRoleArn,pipeline_codebuild_role_arn\npipelineConfig,pipeline_config\npipelineConfigurationTimeStamp,pipeline_configuration_time_stamp\npipelineContext,pipeline_context\npipelineDescriptionList,pipeline_description_list\npipelineExecution,pipeline_execution\npipelineExecutionId,pipeline_execution_id\npipelineExecutionStartCondition,pipeline_execution_start_condition\npipelineExecutionSummaries,pipeline_execution_summaries\npipelineId,pipeline_id\npipelineIdList,pipeline_id_list\npipelineIds,pipeline_ids\npipelineInfoList,pipeline_info_list\npipelineName,pipeline_name\npipelineObjects,pipeline_objects\npipelineProvisioning,pipeline_provisioning\npipelineProvisioningRepository,pipeline_provisioning_repository\npipelineServiceRoleArn,pipeline_service_role_arn\npipelineSummaries,pipeline_summaries\npipelineType,pipeline_type\npipelineVersion,pipeline_version\npipelines,pipelines\npitPolicy,pit_policy\nplaceholder,placeholder\nplacement,placement\nplacementConstraints,placement_constraints\nplacementGroup,placement_group\nplacementName,placement_name\nplacementStrategy,placement_strategy\nplacementTemplate,placement_template\nplacements,placements\nplainTextMessage,plain_text_message\nplanDescription,plan_description\nplanType,plan_type\nplanTypes,plan_types\nplatform,platform\nplatformCapabilities,platform_capabilities\nplatformDevices,platform_devices\nplatformDifferences,platform_differences\nplatformDisplayName,platform_display_name\nplatformFamily,platform_family\nplatformId,platform_id\nplatformOverride,platform_override\nplatformVersion,platform_version\nplatformVersions,platform_versions\nplatforms,platforms\nplaybackUrl,playback_url\npluginId,plugin_id\nplugins,plugins\npodExecutionRoleArn,pod_execution_role_arn\npodName,pod_name\npodProperties,pod_properties\npointInTimeRecovery,point_in_time_recovery\npointInTimeRecoveryOverride,point_in_time_recovery_override\npointInTimeSnapshotDateTime,point_in_time_snapshot_date_time\npolarization,polarization\npolicies,policies\npolicy,policy\npolicyArn,policy_arn\npolicyDescription,policy_description\npolicyDetails,policy_details\npolicyDocument,policy_document\npolicyDocuments,policy_documents\npolicyGenerationDetails,policy_generation_details\npolicyGenerations,policy_generations\npolicyId,policy_id\npolicyName,policy_name\npolicyNamesToAdd,policy_names_to_add\npolicyNamesToSkip,policy_names_to_skip\npolicyRevision,policy_revision\npolicySizeBytes,policy_size_bytes\npolicyStatementsTemplate,policy_statements_template\npolicyStoreId,policy_store_id\npolicyStores,policy_stores\npolicyTemplate,policy_template\npolicyTemplateId,policy_template_id\npolicyTemplates,policy_templates\npolicyText,policy_text\npolicyType,policy_type\npolicyVersion,policy_version\npolicyVersionId,policy_version_id\npolicyVersionIdentifier,policy_version_identifier\npolicyVersions,policy_versions\npollingAccounts,polling_accounts\npollingDisabledAt,polling_disabled_at\npollingServicePrincipals,polling_service_principals\nport,port\nportEncryptionStatus,port_encryption_status\nportForwardingConfig,port_forwarding_config\nportInfo,port_info\nportInfoSource,port_info_source\nportInformationNeeded,port_information_needed\nportInfos,port_infos\nportMapping,port_mapping\nportMappings,port_mappings\nportName,port_name\nportNumber,port_number\nportRange,port_range\nportStates,port_states\nportal,portal\nportalArn,portal_arn\nportalAuthMode,portal_auth_mode\nportalClientId,portal_client_id\nportalContactEmail,portal_contact_email\nportalCreationDate,portal_creation_date\nportalDescription,portal_description\nportalEndpoint,portal_endpoint\nportalId,portal_id\nportalLastUpdateDate,portal_last_update_date\nportalLogoImage,portal_logo_image\nportalLogoImageFile,portal_logo_image_file\nportalLogoImageLocation,portal_logo_image_location\nportalName,portal_name\nportalStartUrl,portal_start_url\nportalStatus,portal_status\nportalSummaries,portal_summaries\nportals,portals\nports,ports\nposition,position\npositive,positive\nposixUser,posix_user\npostCodeHookSpecification,post_code_hook_specification\npostDirectional,post_directional\npostFulfillmentStatusSpecification,post_fulfillment_status_specification\npostLaunchActions,post_launch_actions\npostLaunchActionsLaunchStatusList,post_launch_actions_launch_status_list\npostLaunchActionsStatus,post_launch_actions_status\npostLaunchEnabled,post_launch_enabled\npostLaunchFile,post_launch_file\npostPassEndTime,post_pass_end_time\npostTriggerCollectionDuration,post_trigger_collection_duration\npostalCode,postal_code\npostalCodePlus4,postal_code_plus4\npostedDate,posted_date\npower,power\npowerId,power_id\npowers,powers\npreDirectional,pre_directional\npreLaunchFile,pre_launch_file\nprePassStartTime,pre_pass_start_time\npreProvisioningHook,pre_provisioning_hook\npreSignedUrl,pre_signed_url\nprecision,precision\npredicate,predicate\npredicateCount,predicate_count\npredicates,predicates\npredictedLabel,predicted_label\npredictedScores,predicted_scores\npredictedValue,predicted_value\npredictionExplanations,prediction_explanations\npredictionTimeRange,prediction_time_range\npredictionTimestamp,prediction_timestamp\npreferences,preferences\npreferredBackupWindow,preferred_backup_window\npreferredMaintenanceWindow,preferred_maintenance_window\npreferredRegion,preferred_region\nprefix,prefix\nprefixConfig,prefix_config\nprefixFormat,prefix_format\nprefixListIds,prefix_list_ids\nprefixType,prefix_type\nprerequisite,prerequisite\npreserve,preserve\npreserveNulls,preserve_nulls\npreserveSourceDataTyping,preserve_source_data_typing\npreset,preset\npresignedUrlConfig,presigned_url_config\npreviewAgentsArn,preview_agents_arn\npreviewResults,preview_results\npreviewStatus,preview_status\npreviewToken,preview_token\nprevious,previous\npreviousDataProcessingJobId,previous_data_processing_job_id\npreviousEventId,previous_event_id\npreviousModelTrainingJobId,previous_model_training_job_id\npreviousOwnedBy,previous_owned_by\npreviousRevision,previous_revision\npreviousStartedEventId,previous_started_event_id\nprice,price\npricingMode,pricing_mode\npricingTier,pricing_tier\npricingUnit,pricing_unit\nprimaryArtifact,primary_artifact\nprimaryDevice,primary_device\nprimaryEmail,primary_email\nprimaryKey,primary_key\nprimaryKeyColumns,primary_key_columns\nprimaryKeys,primary_keys\nprimaryRegistryAlias,primary_registry_alias\nprimaryTaskSet,primary_task_set\nprincipal,principal\nprincipalArn,principal_arn\nprincipalEntityType,principal_entity_type\nprincipalId,principal_id\nprincipalSubscriber,principal_subscriber\nprincipals,principals\nprintAllowed,print_allowed\npriorBuildSummaryList,prior_build_summary_list\nprioritizeBusinessGoals,prioritize_business_goals\npriority,priority\nprivateConnectionProvisioningState,private_connection_provisioning_state\nprivateDnsName,private_dns_name\nprivateDomainName,private_domain_name\nprivateIpAddress,private_ip_address\nprivateIpAddresses,private_ip_addresses\nprivateIpv4Address,private_ipv4_address\nprivateKey,private_key\nprivateKeyBase64,private_key_base64\nprivateLinkServiceName,private_link_service_name\nprivateRegistryAccess,private_registry_access\nprivateRepository,private_repository\nprivileged,privileged\nprivilegedMode,privileged_mode\nprivilegedModeOverride,privileged_mode_override\nproblems,problems\nprocessBehavior,process_behavior\nprocessedDataS3Location,processed_data_s3_location\nprocessedRecordsCount,processed_records_count\nprocessingConfig,processing_config\nprocessingConfiguration,processing_configuration\nprocessingInstanceType,processing_instance_type\nprocessingInstanceVolumeSizeInGB,processing_instance_volume_size_in_gb\nprocessingJob,processing_job\nprocessingTargets,processing_targets\nprocessingTimeOutInSeconds,processing_time_out_in_seconds\nprodTrafficRoute,prod_traffic_route\nproductCode,product_code\nproductId,product_id\nproductType,product_type\nproductTypes,product_types\nproductUrl,product_url\nproductionBranch,production_branch\nproducts,products\nprofile,profile\nprofileArn,profile_arn\nprofileEndTime,profile_end_time\nprofileId,profile_id\nprofileName,profile_name\nprofileOwner,profile_owner\nprofileProperties,profile_properties\nprofileStartTime,profile_start_time\nprofileTimes,profile_times\nprofileToken,profile_token\nprofileUpdatedAt,profile_updated_at\nprofileVersion,profile_version\nprofileVersionArn,profile_version_arn\nprofiles,profiles\nprofilingEnabled,profiling_enabled\nprofilingGroup,profiling_group\nprofilingGroupName,profiling_group_name\nprofilingGroupNames,profiling_group_names\nprofilingGroups,profiling_groups\nprofilingStatus,profiling_status\nprogress,progress\nprogressDetail,progress_detail\nprogressInMegaBytes,progress_in_mega_bytes\nprogressPercentage,progress_percentage\nprogressStatus,progress_status\nproject,project\nprojectArn,project_arn\nprojectCreationDate,project_creation_date\nprojectDescription,project_description\nprojectId,project_id\nprojectInformation,project_information\nprojectLastUpdateDate,project_last_update_date\nprojectName,project_name\nprojectRole,project_role\nprojectSummaries,project_summaries\nprojectTemplateId,project_template_id\nprojectVisibility,project_visibility\nprojectedMetrics,projected_metrics\nprojectedUtilizationMetrics,projected_utilization_metrics\nprojects,projects\nprojectsNotFound,projects_not_found\nprometheusEndpoint,prometheus_endpoint\npromotionName,promotion_name\npromotions,promotions\nprompt,prompt\npromptAttemptsSpecification,prompt_attempts_specification\npromptSpecification,prompt_specification\npropagateTags,propagate_tags\nproperties,properties\npropertiesFileContent,properties_file_content\nproperty,property\npropertyAlias,property_alias\npropertyDefinitions,property_definitions\npropertyFilters,property_filters\npropertyGroupName,property_group_name\npropertyGroupUpdates,property_group_updates\npropertyGroups,property_groups\npropertyId,property_id\npropertyName,property_name\npropertyNames,property_names\npropertyNotificationState,property_notification_state\npropertyReference,property_reference\npropertyUnit,property_unit\npropertyUpdates,property_updates\npropertyValue,property_value\npropertyValues,property_values\nproposalId,proposal_id\nproposalState,proposal_state\nprotectedQueries,protected_queries\nprotectedQuery,protected_query\nprotectedQueryIdentifier,protected_query_identifier\nprotectedTasks,protected_tasks\nprotectionEnabled,protection_enabled\nprotocol,protocol\nprotocolDefinition,protocol_definition\nprotocolName,protocol_name\nprotocolPolicy,protocol_policy\nprotocolVersion,protocol_version\nprotocols,protocols\nprotonServiceRoleArn,proton_service_role_arn\nprovider,provider\nproviderARNs,provider_arns\nproviderArn,provider_arn\nproviderIdentity,provider_identity\nproviderName,provider_name\nproviders,providers\nprovisionedCapacity,provisioned_capacity\nprovisionedModelArn,provisioned_model_arn\nprovisionedModelId,provisioned_model_id\nprovisionedModelName,provisioned_model_name\nprovisionedModelSummaries,provisioned_model_summaries\nprovisionedResources,provisioned_resources\nprovisioning,provisioning\nprovisioningEngine,provisioning_engine\nprovisioningRepository,provisioning_repository\nprovisioningRoleArn,provisioning_role_arn\nproxyConfiguration,proxy_configuration\nproxyEndpoint,proxy_endpoint\npseudoTerminal,pseudo_terminal\npublicAccess,public_access\npublicAccessBlock,public_access_block\npublicAccessCidrs,public_access_cidrs\npublicDnsName,public_dns_name\npublicDomainNames,public_domain_names\npublicEndpoint,public_endpoint\npublicIp,public_ip\npublicIpAddress,public_ip_address\npublicIpAddresses,public_ip_addresses\npublicKey,public_key\npublicKeyBase64,public_key_base64\npublicKeyMaterial,public_key_material\npublicPorts,public_ports\npublicProjectAlias,public_project_alias\npubliclyAccessible,publicly_accessible\npubliclyAccessibleCount,publicly_accessible_count\npubliclyReadable,publicly_readable\npubliclyWritable,publicly_writable\npublish,publish\npublishAttributionMetricsToS3,publish_attribution_metrics_to_s3\npublishClassificationFindings,publish_classification_findings\npublishFindingToSnsParams,publish_finding_to_sns_params\npublishPolicyFindings,publish_policy_findings\npublished,published\npublishedTime,published_time\npublisher,publisher\npublishers,publishers\npullRequest,pull_request\npullRequestCreatedEventMetadata,pull_request_created_event_metadata\npullRequestEnvironmentName,pull_request_environment_name\npullRequestEventType,pull_request_event_type\npullRequestEvents,pull_request_events\npullRequestId,pull_request_id\npullRequestIds,pull_request_ids\npullRequestMergedStateChangedEventMetadata,pull_request_merged_state_changed_event_metadata\npullRequestSourceReferenceUpdatedEventMetadata,pull_request_source_reference_updated_event_metadata\npullRequestStatus,pull_request_status\npullRequestStatusChangedEventMetadata,pull_request_status_changed_event_metadata\npullRequestTargets,pull_request_targets\npullStartedAt,pull_started_at\npullStoppedAt,pull_stopped_at\npullThroughCacheRules,pull_through_cache_rules\npurchaseTime,purchase_time\npurchasingOption,purchasing_option\npushedAt,pushed_at\nputAssetPropertyValueEntries,put_asset_property_value_entries\nputFailuresCount,put_failures_count\nputFiles,put_files\nputItem,put_item\nqos,qos\nqualificationReportDownloadUrl,qualification_report_download_url\nqualities,qualities\nquality,quality\nquantity,quantity\nquantumTaskArn,quantum_task_arn\nquantumTasks,quantum_tasks\nqueries,queries\nqueriesFilePath,queries_file_path\nquery,query\nqueryAction,query_action\nqueryCompileError,query_compile_error\nqueryDefinitionId,query_definition_id\nqueryDefinitionNamePrefix,query_definition_name_prefix\nqueryDefinitions,query_definitions\nqueryEvalStats,query_eval_stats\nqueryFilterString,query_filter_string\nqueryFilterStringEnabled,query_filter_string_enabled\nqueryId,query_id\nqueryLogStatus,query_log_status\nqueryOptions,query_options\nqueryParam,query_param\nqueryParameters,query_parameters\nqueryParser,query_parser\nqueryStatement,query_statement\nqueryString,query_string\nqueryStringsAllowList,query_strings_allow_list\nqueryText,query_text\nqueryVersion,query_version\nqueryable,queryable\nqueue,queue\nqueueInfo,queue_info\nqueuePolicy,queue_policy\nqueuePriority,queue_priority\nqueueRequest,queue_request\nqueueSize,queue_size\nqueueUrl,queue_url\nqueueUrls,queue_urls\nqueuedAt,queued_at\nqueuedJobs,queued_jobs\nqueuedTimeoutInMinutes,queued_timeout_in_minutes\nqueuedTimeoutInMinutesOverride,queued_timeout_in_minutes_override\nquota,quota\nquotaCode,quota_code\nquotaName,quota_name\nquotaValue,quota_value\nquote,quote\nquoteAll,quote_all\nr53HostedZoneDeletionState,r53_hosted_zone_deletion_state\nradio,radio\nradios,radios\nramBytes,ram_bytes\nramPerformanceMetricBasis,ram_performance_metric_basis\nramResourceShareRegion,ram_resource_share_region\nramSizeInGb,ram_size_in_gb\nrandomizationSalt,randomization_salt\nrange,range\nrangeKeyField,range_key_field\nrangeKeyType,range_key_type\nrangeKeyValue,range_key_value\nrank,rank\nrate,rate\nrateIncreaseCriteria,rate_increase_criteria\nrateLimit,rate_limit\nrawData,raw_data\nrawError,raw_error\nrawValue,raw_value\nrdsHttpEndpointConfig,rds_http_endpoint_config\nreaction,reaction\nreactionCounts,reaction_counts\nreactionUserArn,reaction_user_arn\nreactionUsers,reaction_users\nreactionValue,reaction_value\nreactionsForComment,reactions_for_comment\nreactionsFromDeletedUsersCount,reactions_from_deleted_users_count\nreadCapacityUnits,read_capacity_units\nreadOnly,read_only\nreadOnlyRootFilesystem,read_only_root_filesystem\nreadOptions,read_options\nreadSetId,read_set_id\nreadSets,read_sets\nreadme,readme\nreadonlyAccessAccounts,readonly_access_accounts\nreadonlyRootFilesystem,readonly_root_filesystem\nreason,reason\nreasonCode,reason_code\nreasonCodeSummaries,reason_code_summaries\nreasonForNonCompliance,reason_for_non_compliance\nreasonForNonComplianceCode,reason_for_non_compliance_code\nreasons,reasons\nrebootAfterUse,reboot_after_use\nreceiverAccountId,receiver_account_id\nreceiverArn,receiver_arn\nrecentCommunications,recent_communications\nrecentIntentSummaryView,recent_intent_summary_view\nrecipe,recipe\nrecipeArn,recipe_arn\nrecipeList,recipe_list\nrecipeOutputFormat,recipe_output_format\nrecipeProvider,recipe_provider\nrecipeType,recipe_type\nrecipes,recipes\nrecipients,recipients\nrecognizedBotMember,recognized_bot_member\nrecommendation,recommendation\nrecommendationCompliance,recommendation_compliance\nrecommendationExportJobs,recommendation_export_jobs\nrecommendationId,recommendation_id\nrecommendationIds,recommendation_ids\nrecommendationOptions,recommendation_options\nrecommendationPreferenceNames,recommendation_preference_names\nrecommendationPreferences,recommendation_preferences\nrecommendationPreferencesDetails,recommendation_preferences_details\nrecommendationReportDetails,recommendation_report_details\nrecommendationResourceType,recommendation_resource_type\nrecommendationSet,recommendation_set\nrecommendationSourceArn,recommendation_source_arn\nrecommendationSourceType,recommendation_source_type\nrecommendationSources,recommendation_sources\nrecommendationStatus,recommendation_status\nrecommendationSummaries,recommendation_summaries\nrecommendationTemplate,recommendation_template\nrecommendationTemplateArn,recommendation_template_arn\nrecommendationTemplates,recommendation_templates\nrecommendationTypes,recommendation_types\nrecommendations,recommendations\nrecommended,recommended\nrecommendedActions,recommended_actions\nrecommendedCpuUnits,recommended_cpu_units\nrecommendedInstanceType,recommended_instance_type\nrecommendedMemorySize,recommended_memory_size\nrecommendedMinorVersion,recommended_minor_version\nrecommendedOptionProjectedMetrics,recommended_option_projected_metrics\nrecommendedVersion,recommended_version\nrecommender,recommender\nrecommenderArn,recommender_arn\nrecommenderConfig,recommender_config\nrecommenders,recommenders\nrecord,record\nrecordAllRosTopics,record_all_ros_topics\nrecordFormat,record_format\nrecordIndex,record_index\nrecordLength,record_length\nrecordMarkerDecisionAttributes,record_marker_decision_attributes\nrecordMarkerFailedEventAttributes,record_marker_failed_event_attributes\nrecordNumber,record_number\nrecording,recording\nrecordingConfiguration,recording_configuration\nrecordingConfigurationArn,recording_configuration_arn\nrecordingConfigurations,recording_configurations\nrecordingGroup,recording_group\nrecordingMode,recording_mode\nrecordingReconnectWindowSeconds,recording_reconnect_window_seconds\nrecordingStrategy,recording_strategy\nrecords,records\nrecordsMatched,records_matched\nrecordsNotProcessed,records_not_processed\nrecordsProcessed,records_processed\nrecordsScanned,records_scanned\nrecoveryInstanceID,recovery_instance_id\nrecoveryInstanceIDs,recovery_instance_ids\nrecoveryInstanceId,recovery_instance_id\nrecoveryInstanceProperties,recovery_instance_properties\nrecoveryPoint,recovery_point\nrecoveryPointCreateTime,recovery_point_create_time\nrecoveryPointId,recovery_point_id\nrecoveryPoints,recovery_points\nrecoverySnapshotID,recovery_snapshot_id\nrecurringCharges,recurring_charges\nrecurringPaymentAmount,recurring_payment_amount\nrecursive,recursive\nredirectUri,redirect_uri\nreduceOperationalOverheadWithManagedServices,reduce_operational_overhead_with_managed_services\nref,ref\nrefValue,ref_value\nreference,reference\nreferenceArn,reference_arn\nreferenceId,reference_id\nreferenceStoreId,reference_store_id\nreferenceStores,reference_stores\nreferenceType,reference_type\nreferenceURLs,reference_urls\nreferenceUrls,reference_urls\nreferencedBy,referenced_by\nreferencedTables,referenced_tables\nreferences,references\nrefreshAfterInSeconds,refresh_after_in_seconds\nrefreshToken,refresh_token\nrefreshTokenBody,refresh_token_body\nregex,regex\nregexConfiguration,regex_configuration\nregexFilter,regex_filter\nregion,region\nregionFilter,region_filter\nregionList,region_list\nregionMap,region_map\nregionName,region_name\nregionalCertificateArn,regional_certificate_arn\nregionalCertificateName,regional_certificate_name\nregionalDomainName,regional_domain_name\nregionalHostedZoneId,regional_hosted_zone_id\nregions,regions\nregisterAccountStatus,register_account_status\nregisterTime,register_time\nregisteredAt,registered_at\nregisteredBy,registered_by\nregisteredContainerInstancesCount,registered_container_instances_count\nregisteredDomainDelegationInfo,registered_domain_delegation_info\nregisteredResources,registered_resources\nregisteredTime,registered_time\nregisteredTimeStamp,registered_time_stamp\nregistrationCode,registration_code\nregistrationConfig,registration_config\nregistrationStatus,registration_status\nregistries,registries\nregistry,registry\nregistryArn,registry_arn\nregistryCatalogData,registry_catalog_data\nregistryCredential,registry_credential\nregistryCredentialOverride,registry_credential_override\nregistryId,registry_id\nregistryIds,registry_ids\nregistryLogin,registry_login\nregistryScanningConfiguration,registry_scanning_configuration\nregistryUri,registry_uri\nrejectDate,reject_date\nrejectReason,reject_reason\nrejectedLogEventsInfo,rejected_log_events_info\nrejectionStatement,rejection_statement\nrel,rel\nrelatedDeployments,related_deployments\nrelatedEvents,related_events\nrelatedItemArn,related_item_arn\nrelatedItemData,related_item_data\nrelatedItemId,related_item_id\nrelatedItems,related_items\nrelatedItemsUpdate,related_items_update\nrelatedJoinFieldName,related_join_field_name\nrelatedJoinTableName,related_join_table_name\nrelatedModelFields,related_model_fields\nrelatedModelName,related_model_name\nrelatedResources,related_resources\nrelatedVulnerabilities,related_vulnerabilities\nrelationalDatabase,relational_database\nrelationalDatabaseAvailabilityZones,relational_database_availability_zones\nrelationalDatabaseBlueprintId,relational_database_blueprint_id\nrelationalDatabaseBundleId,relational_database_bundle_id\nrelationalDatabaseConfig,relational_database_config\nrelationalDatabaseEvents,relational_database_events\nrelationalDatabaseName,relational_database_name\nrelationalDatabaseSnapshot,relational_database_snapshot\nrelationalDatabaseSnapshotName,relational_database_snapshot_name\nrelationalDatabaseSnapshots,relational_database_snapshots\nrelationalDatabaseSourceType,relational_database_source_type\nrelationalDatabases,relational_databases\nrelationship,relationship\nrelationshipName,relationship_name\nrelationshipStatus,relationship_status\nrelationshipType,relationship_type\nrelationshipValue,relationship_value\nrelationships,relationships\nrelativeAggregationDuration,relative_aggregation_duration\nrelativeFileVersion,relative_file_version\nrelativeImpact,relative_impact\nrelativePath,relative_path\nrelease,release\nreleaseLabel,release_label\nreleaseVersion,release_version\nrelevanceLevel,relevance_level\nrelevanceScore,relevance_score\nremaining,remaining\nremainingResources,remaining_resources\nremediation,remediation\nremoteAccess,remote_access\nremoteAccessAllowed,remote_access_allowed\nremoteAccessEnabled,remote_access_enabled\nremoteAccessSecurityGroup,remote_access_security_group\nremoteAccessSession,remote_access_session\nremoteAccessSessionArn,remote_access_session_arn\nremoteAccessSessions,remote_access_sessions\nremoteDebugEnabled,remote_debug_enabled\nremoteModelTransformJob,remote_model_transform_job\nremoteParticipantId,remote_participant_id\nremoteRecordAppArn,remote_record_app_arn\nremoteRecordEnabled,remote_record_enabled\nremoteSourceCodeAnalysisServerConfigurationTimestamp,remote_source_code_analysis_server_configuration_timestamp\nremoteSourceCodeAnalysisServerInfo,remote_source_code_analysis_server_info\nremovableAttributes,removable_attributes\nremoveAllowedPrefixesToDirectConnectGateway,remove_allowed_prefixes_to_direct_connect_gateway\nremoveAttributes,remove_attributes\nremoveAuthorizerConfig,remove_authorizer_config\nremoveAutoRegistration,remove_auto_registration\nremoveLabels,remove_labels\nremoveMetrics,remove_metrics\nremoveNetworkAccessConfiguration,remove_network_access_configuration\nremoveOverrideLinkOutUri,remove_override_link_out_uri\nremovePreProvisioningHook,remove_pre_provisioning_hook\nremoveSecurityGroupIds,remove_security_group_ids\nremoveSegment,remove_segment\nremoveSubnetIds,remove_subnet_ids\nremoveTaints,remove_taints\nremoveThingType,remove_thing_type\nremoveVariations,remove_variations\nremoveVpcConfiguration,remove_vpc_configuration\nrenderConfig,render_config\nrenderTypeDeclarations,render_type_declarations\nrendererType,renderer_type\nrenderingConfiguration,rendering_configuration\nrenderingEngine,rendering_engine\nrenditionConfiguration,rendition_configuration\nrenditionSelection,rendition_selection\nrenditions,renditions\nrenewalStatus,renewal_status\nrenewalStatusReason,renewal_status_reason\nrenewalSummary,renewal_summary\nreplace,replace\nreplaceContents,replace_contents\nreplaceDefaultPolicyVersionParams,replace_default_policy_version_params\nreplacePermissionAssociationsWork,replace_permission_associations_work\nreplacePermissionAssociationsWorks,replace_permission_associations_works\nreplacementOrderArn,replacement_order_arn\nreplacementType,replacement_type\nreplicated,replicated\nreplicatedDisks,replicated_disks\nreplicatedExternally,replicated_externally\nreplicatedStorageBytes,replicated_storage_bytes\nreplicationAccounts,replication_accounts\nreplicationConfiguration,replication_configuration\nreplicationConfigurationStatus,replication_configuration_status\nreplicationConfigurationTemplateID,replication_configuration_template_id\nreplicationConfigurationTemplateIDs,replication_configuration_template_ids\nreplicationDetails,replication_details\nreplicationDirection,replication_direction\nreplicationJob,replication_job\nreplicationJobId,replication_job_id\nreplicationJobList,replication_job_list\nreplicationJobTerminated,replication_job_terminated\nreplicationRegions,replication_regions\nreplicationRunId,replication_run_id\nreplicationRunList,replication_run_list\nreplicationServerInstanceType,replication_server_instance_type\nreplicationServersSecurityGroupsIDs,replication_servers_security_groups_ids\nreplicationSet,replication_set\nreplicationSetArns,replication_set_arns\nreplicationSpecification,replication_specification\nreplicationStartedDateTime,replication_started_date_time\nreplicationStatus,replication_status\nreplicationStatusDetails,replication_status_details\nreplicationStatusMessage,replication_status_message\nreplicationStatuses,replication_statuses\nreplicationStrategy,replication_strategy\nreplicationType,replication_type\nreplicationTypes,replication_types\nreportARN,report_arn\nreportArn,report_arn\nreportArns,report_arns\nreportBuildBatchStatusOverride,report_build_batch_status_override\nreportBuildStatus,report_build_status\nreportBuildStatusOverride,report_build_status_override\nreportDefinitions,report_definitions\nreportDescription,report_description\nreportFileFormat,report_file_format\nreportFormat,report_format\nreportFrequency,report_frequency\nreportGroup,report_group\nreportGroupArn,report_group_arn\nreportGroupArns,report_group_arns\nreportGroups,report_groups\nreportGroupsNotFound,report_groups_not_found\nreportId,report_id\nreportName,report_name\nreportNames,report_names\nreportSummaries,report_summaries\nreportType,report_type\nreports,reports\nreportsNotFound,reports_not_found\nrepositories,repositories\nrepositoriesNotFound,repositories_not_found\nrepository,repository\nrepositoryArn,repository_arn\nrepositoryCloneMethod,repository_clone_method\nrepositoryConnectionArn,repository_connection_arn\nrepositoryCount,repository_count\nrepositoryCredentials,repository_credentials\nrepositoryDescription,repository_description\nrepositoryEndpoint,repository_endpoint\nrepositoryFilters,repository_filters\nrepositoryId,repository_id\nrepositoryMetadata,repository_metadata\nrepositoryName,repository_name\nrepositoryNames,repository_names\nrepositoryPolicy,repository_policy\nrepositoryPrefix,repository_prefix\nrepositoryProvider,repository_provider\nrepositoryUri,repository_uri\nreprocessingId,reprocessing_id\nreprocessingSummaries,reprocessing_summaries\nrepublish,republish\nrequest,request\nrequestAttributes,request_attributes\nrequestCancelActivityTaskDecisionAttributes,request_cancel_activity_task_decision_attributes\nrequestCancelActivityTaskFailedEventAttributes,request_cancel_activity_task_failed_event_attributes\nrequestCancelExternalWorkflowExecutionDecisionAttributes,request_cancel_external_workflow_execution_decision_attributes\nrequestCancelExternalWorkflowExecutionFailedEventAttributes,request_cancel_external_workflow_execution_failed_event_attributes\nrequestCancelExternalWorkflowExecutionInitiatedEventAttributes,request_cancel_external_workflow_execution_initiated_event_attributes\nrequestCompression,request_compression\nrequestContentType,request_content_type\nrequestEntries,request_entries\nrequestEventStream,request_event_stream\nrequestFailureReason,request_failure_reason\nrequestHeaders,request_headers\nrequestId,request_id\nrequestMACSec,request_mac_sec\nrequestMappingTemplate,request_mapping_template\nrequestMessageId,request_message_id\nrequestMethod,request_method\nrequestModels,request_models\nrequestParameters,request_parameters\nrequestPayload,request_payload\nrequestTemplates,request_templates\nrequestTime,request_time\nrequestType,request_type\nrequestValidatorId,request_validator_id\nrequestedAllowedPrefixesToDirectConnectGateway,requested_allowed_prefixes_to_direct_connect_gateway\nrequestedAt,requested_at\nrequestedBy,requested_by\nrequestedEndTime,requested_end_time\nrequestedOn,requested_on\nrequestedStartTime,requested_start_time\nrequests,requests\nrequireAuthorizationForCacheControl,require_authorization_for_cache_control\nrequireInstanceProperties,require_instance_properties\nrequired,required\nrequiredClaims,required_claims\nrequiredFields,required_fields\nrequiredProperties,required_properties\nrequiresAttributes,requires_attributes\nrequiresCompatibilities,requires_compatibilities\nrequiresConfiguration,requires_configuration\nrescanDuration,rescan_duration\nrescanDurationState,rescan_duration_state\nrescannedStorageBytes,rescanned_storage_bytes\nreservedCpuCores,reserved_cpu_cores\nreservedInstanceOptions,reserved_instance_options\nreset,reset\nresetActionConfiguration,reset_action_configuration\nresetActionRequests,reset_action_requests\nresetTimer,reset_timer\nresiliencyPolicies,resiliency_policies\nresiliencyScore,resiliency_score\nresolution,resolution\nresolutionId,resolution_id\nresolutionSteps,resolution_steps\nresolutionStrategy,resolution_strategy\nresolutionTechniques,resolution_techniques\nresolutionType,resolution_type\nresolveConflicts,resolve_conflicts\nresolvedAt,resolved_at\nresolvedComponentVersions,resolved_component_versions\nresolvedConfiguration,resolved_configuration\nresolvedImageDigest,resolved_image_digest\nresolvedReason,resolved_reason\nresolvedSourceVersion,resolved_source_version\nresolvedTime,resolved_time\nresolvedValues,resolved_values\nresolver,resolver\nresolverArn,resolver_arn\nresolvers,resolvers\nresource,resource\nresourceARN,resource_arn\nresourceAccessRole,resource_access_role\nresourceArn,resource_arn\nresourceArns,resource_arns\nresourceConfiguration,resource_configuration\nresourceCount,resource_count\nresourceCounts,resource_counts\nresourceCreationTime,resource_creation_time\nresourceDefinitions,resource_definitions\nresourceDeletionTime,resource_deletion_time\nresourceDetails,resource_details\nresourceDigests,resource_digests\nresourceErrors,resource_errors\nresourceErrorsDetails,resource_errors_details\nresourceFilterCriteria,resource_filter_criteria\nresourceGroup,resource_group\nresourceGroupArn,resource_group_arn\nresourceGroupArns,resource_group_arns\nresourceGroupName,resource_group_name\nresourceGroupNames,resource_group_names\nresourceGroupTags,resource_group_tags\nresourceGroups,resource_groups\nresourceId,resource_id\nresourceIdentifier,resource_identifier\nresourceIdentifiers,resource_identifiers\nresourceIds,resource_ids\nresourceKeys,resource_keys\nresourceLinks,resource_links\nresourceLogEvents,resource_log_events\nresourceMappings,resource_mappings\nresourceMetadata,resource_metadata\nresourceMethods,resource_methods\nresourceName,resource_name\nresourceNames,resource_names\nresourceOwner,resource_owner\nresourceOwnerAccount,resource_owner_account\nresourcePolicies,resource_policies\nresourcePolicy,resource_policy\nresourcePrefix,resource_prefix\nresourceRecord,resource_record\nresourceRegionScope,resource_region_scope\nresourceRequirements,resource_requirements\nresourceShare,resource_share\nresourceShareArn,resource_share_arn\nresourceShareArns,resource_share_arns\nresourceShareAssociations,resource_share_associations\nresourceShareInvitation,resource_share_invitation\nresourceShareInvitationArn,resource_share_invitation_arn\nresourceShareInvitationArns,resource_share_invitation_arns\nresourceShareInvitations,resource_share_invitations\nresourceShareName,resource_share_name\nresourceShareStatus,resource_share_status\nresourceShares,resource_shares\nresourceSpecification,resource_specification\nresourceState,resource_state\nresourceStatus,resource_status\nresourceSubType,resource_sub_type\nresourceTags,resource_tags\nresourceType,resource_type\nresourceTypes,resource_types\nresources,resources\nresourcesAffected,resources_affected\nresourcesBudgetEstimate,resources_budget_estimate\nresourcesFlagged,resources_flagged\nresourcesIgnored,resources_ignored\nresourcesIncluded,resources_included\nresourcesProcessed,resources_processed\nresourcesReceivingAccess,resources_receiving_access\nresourcesSummary,resources_summary\nresourcesSuppressed,resources_suppressed\nresourcesVpcConfig,resources_vpc_config\nresponse,response\nresponseCard,response_card\nresponseContentType,response_content_type\nresponseEventStream,response_event_stream\nresponseMappingTemplate,response_mapping_template\nresponseModels,response_models\nresponseParameters,response_parameters\nresponsePayload,response_payload\nresponsePlanArn,response_plan_arn\nresponsePlanSummaries,response_plan_summaries\nresponseStreamingSupported,response_streaming_supported\nresponseTemplates,response_templates\nresponseTopic,response_topic\nresponseType,response_type\nresponses,responses\nrestApiId,rest_api_id\nrestoreDate,restore_date\nrestoreTime,restore_time\nrestoreTimestamp,restore_timestamp\nrestoredTableARN,restored_table_arn\nrestrictPublicBuckets,restrict_public_buckets\nrestrictions,restrictions\nresult,result\nresultCode,result_code\nresultConfiguration,result_configuration\nresultCounts,result_counts\nresultFilterBy,result_filter_by\nresultFormat,result_format\nresultFrame,result_frame\nresultId,result_id\nresultList,result_list\nresultSetMetadata,result_set_metadata\nresultSetOptions,result_set_options\nresultStat,result_stat\nresultStats,result_stats\nresultStatus,result_status\nresultTypeFilter,result_type_filter\nresults,results\nresultsByTime,results_by_time\nresultsData,results_data\nresultsWritten,results_written\nretain,retain\nretainedTopics,retained_topics\nretentionDuration,retention_duration\nretentionInDays,retention_in_days\nretentionMode,retention_mode\nretentionPeriod,retention_period\nretiringPrincipal,retiring_principal\nretries,retries\nretryAfter,retry_after\nretryAfterSeconds,retry_after_seconds\nretryAttempt,retry_attempt\nretryMode,retry_mode\nretryPolicy,retry_policy\nretryPolicyConfiguration,retry_policy_configuration\nretryPolicyExecution,retry_policy_execution\nretryStrategy,retry_strategy\nretryType,retry_type\nretryable,retryable\nreturn,return\nreturnCode,return_code\nreturnInformation,return_information\nreturnReason,return_reason\nreturnValue,return_value\nreverseOrder,reverse_order\nreversedDirectionSourceServerArn,reversed_direction_source_server_arn\nreverted,reverted\nrevision,revision\nrevisionChangeId,revision_change_id\nrevisionChangeIdentifier,revision_change_identifier\nrevisionChildren,revision_children\nrevisionDag,revision_dag\nrevisionId,revision_id\nrevisionInfo,revision_info\nrevisionLocation,revision_location\nrevisionNumber,revision_number\nrevisionSummary,revision_summary\nrevisionType,revision_type\nrevisionUrl,revision_url\nrevisionUrlTemplate,revision_url_template\nrevisions,revisions\nrevocationEffectiveFrom,revocation_effective_from\nrevocationReason,revocation_reason\nrevocationRecord,revocation_record\nrevocationSupported,revocation_supported\nrevokedAt,revoked_at\nrevokedBy,revoked_by\nrevokedEntities,revoked_entities\nrewrite,rewrite\nrid,rid\nrisk,risk\nriskScore,risk_score\nrobot,robot\nrobotApplicationNames,robot_application_names\nrobotApplicationSummaries,robot_application_summaries\nrobotApplications,robot_applications\nrobotDeploymentSummary,robot_deployment_summary\nrobotDeploymentTimeoutInSeconds,robot_deployment_timeout_in_seconds\nrobotSoftwareSuite,robot_software_suite\nrobots,robots\nrole,role\nroleARN,role_arn\nroleAlias,role_alias\nroleAliasArn,role_alias_arn\nroleAliasDescription,role_alias_description\nroleAliases,role_aliases\nroleArn,role_arn\nroleArnForLogging,role_arn_for_logging\nroleArns,role_arns\nroleCredentials,role_credentials\nroleList,role_list\nroleName,role_name\nroleNameArn,role_name_arn\nroleType,role_type\nroleValues,role_values\nroles,roles\nrollDisposition,roll_disposition\nrollback,rollback\nrollbackDeploymentId,rollback_deployment_id\nrollbackInfo,rollback_info\nrollbackMessage,rollback_message\nrollbackStatus,rollback_status\nrollbackTriggeringDeploymentId,rollback_triggering_deployment_id\nrollingBackTrxCount,rolling_back_trx_count\nrollingBackTrxEarliestStartTime,rolling_back_trx_earliest_start_time\nrolloutState,rollout_state\nrolloutStateReason,rollout_state_reason\nroomIdentifier,room_identifier\nrooms,rooms\nroot,root\nrootDeviceName,root_device_name\nrootDirectory,root_directory\nrootGroup,root_group\nrootResourceId,root_resource_id\nrootToParentThingGroups,root_to_parent_thing_groups\nrootVolume,root_volume\nrootVolumeName,root_volume_name\nrotateMasterUserPassword,rotate_master_user_password\nrotateSecret,rotate_secret\nrotationSize,rotation_size\nroutableCIDRSpace,routable_cidr_space\nroute,route\nrouteFilterPrefixes,route_filter_prefixes\nrouteName,route_name\nroutedResources,routed_resources\nrouter,router\nrouterTypeIdentifier,router_type_identifier\nroutes,routes\nroutingConfiguration,routing_configuration\nrow,row\nrowData,row_data\nrowId,row_id\nrowIds,row_ids\nrowIdsNotFound,row_ids_not_found\nrowNumber,row_number\nrows,rows\nrowsToCreate,rows_to_create\nrowsToUpdate,rows_to_update\nrowsToUpsert,rows_to_upsert\nrpoDescription,rpo_description\nrpoInSecs,rpo_in_secs\nrpoReferenceId,rpo_reference_id\nrtoDescription,rto_description\nrtoInSecs,rto_in_secs\nrtoReferenceId,rto_reference_id\nrule,rule\nruleAction,rule_action\nruleArn,rule_arn\nruleBasedProperties,rule_based_properties\nruleConfiguration,rule_configuration\nruleContentSha256,rule_content_sha256\nruleDesc,rule_desc\nruleDetails,rule_details\nruleDisabled,rule_disabled\nruleEvaluation,rule_evaluation\nruleExecutionMode,rule_execution_mode\nruleGroupsNamespace,rule_groups_namespace\nruleGroupsNamespaces,rule_groups_namespaces\nruleID,rule_id\nruleId,rule_id\nruleIdentifier,rule_identifier\nruleName,rule_name\nruleNames,rule_names\nruleNumber,rule_number\nruleResults,rule_results\nruleVersion,rule_version\nrules,rules\nrulesPackageArn,rules_package_arn\nrulesPackageArns,rules_package_arns\nrulesPackages,rules_packages\nrun,run\nrunAsGroup,run_as_group\nrunAsNonRoot,run_as_non_root\nrunAsUser,run_as_user\nrunContext,run_context\nrunEnvironment,run_environment\nrunGroupId,run_group_id\nrunId,run_id\nrunLeftNormalization,run_left_normalization\nrunOnce,run_once\nrunOrder,run_order\nrunTimeAssessmentStatus,run_time_assessment_status\nrunWith,run_with\nrunning,running\nrunningCount,running_count\nrunningQueryCount,running_query_count\nrunningTasksCount,running_tasks_count\nruns,runs\nruntime,runtime\nruntimeConfiguration,runtime_configuration\nruntimeHintValues,runtime_hint_values\nruntimeHints,runtime_hints\nruntimeId,runtime_id\nruntimePlatform,runtime_platform\nruntimeRoleArn,runtime_role_arn\nruntimeStatus,runtime_status\nruntimeStatusMessage,runtime_status_message\nruntimeVersion,runtime_version\nruntimes,runtimes\ns3,s3\ns3Bucket,s3_bucket\ns3BucketArn,s3_bucket_arn\ns3BucketName,s3_bucket_name\ns3BucketOwner,s3_bucket_owner\ns3BucketRegion,s3_bucket_region\ns3BucketSource,s3_bucket_source\ns3BucketTranscriptSource,s3_bucket_transcript_source\ns3Config,s3_config\ns3Configuration,s3_configuration\ns3DataDestination,s3_data_destination\ns3DataSource,s3_data_source\ns3DeepLink,s3_deep_link\ns3Destination,s3_destination\ns3DestinationConfig,s3_destination_config\ns3DestinationConfiguration,s3_destination_configuration\ns3DestinationExportFileFormat,s3_destination_export_file_format\ns3DestinationExportFileFormatOptions,s3_destination_export_file_format_options\ns3DestinationUrl,s3_destination_url\ns3EncryptionEnabled,s3_encryption_enabled\ns3Etags,s3_etags\ns3ExportConfiguration,s3_export_configuration\ns3InputFileType,s3_input_file_type\ns3InputFormatConfig,s3_input_format_config\ns3JobDefinition,s3_job_definition\ns3Key,s3_key\ns3KeyPrefix,s3_key_prefix\ns3Keys,s3_keys\ns3KmsKeyArn,s3_kms_key_arn\ns3Location,s3_location\ns3LogBucket,s3_log_bucket\ns3Logs,s3_logs\ns3LogsArn,s3_logs_arn\ns3Managed,s3_managed\ns3MonitoringConfiguration,s3_monitoring_configuration\ns3Object,s3_object\ns3ObjectKey,s3_object_key\ns3ObjectVersion,s3_object_version\ns3OutputEncryptionKMSKey,s3_output_encryption_kms_key\ns3OutputFormatConfig,s3_output_format_config\ns3OutputKeyPrefix,s3_output_key_prefix\ns3Path,s3_path\ns3Paths,s3_paths\ns3Prefix,s3_prefix\ns3Reference,s3_reference\ns3RelativePath,s3_relative_path\ns3ResourceArn,s3_resource_arn\ns3ResourcePath,s3_resource_path\ns3Resources,s3_resources\ns3ResourcesUpdate,s3_resources_update\ns3StateFileUrl,s3_state_file_url\ns3Uri,s3_uri\ns3Url,s3_url\ns3WordsList,s3_words_list\ns3bucketForAnalysisData,s3bucket_for_analysis_data\ns3bucketForReportData,s3bucket_for_report_data\ns3key,s3_key\ns3location,s3_location\nsageMakerStudioDomainUrl,sage_maker_studio_domain_url\nsagemakerIamRoleArn,sagemaker_iam_role_arn\nsalesforce,salesforce\nsaml,saml\nsamlConfiguration,saml_configuration\nsamlConfigurationStatus,saml_configuration_status\nsamlMetadataDocument,saml_metadata_document\nsamlMetadataURL,saml_metadata_url\nsamlOptions,saml_options\nsample,sample\nsampleCount,sample_count\nsampleFailureReason,sample_failure_reason\nsampleId,sample_id\nsampleRate,sample_rate\nsampleText,sample_text\nsampleUtterances,sample_utterances\nsampleUtterancesCount,sample_utterances_count\nsampleValue,sample_value\nsamples,samples\nsamplingPercentage,sampling_percentage\nsamplingRate,sampling_rate\nsatelliteArn,satellite_arn\nsatelliteId,satellite_id\nsatellites,satellites\nsavedownStorageConfiguration,savedown_storage_configuration\nsavingsOpportunity,savings_opportunity\nsavingsOpportunityPercentage,savings_opportunity_percentage\nsavingsPlanArn,savings_plan_arn\nsavingsPlanArns,savings_plan_arns\nsavingsPlanId,savings_plan_id\nsavingsPlanIds,savings_plan_ids\nsavingsPlanOffering,savings_plan_offering\nsavingsPlanOfferingId,savings_plan_offering_id\nsavingsPlanOfferingIds,savings_plan_offering_ids\nsavingsPlanPaymentOptions,savings_plan_payment_options\nsavingsPlanType,savings_plan_type\nsavingsPlanTypes,savings_plan_types\nsavingsPlans,savings_plans\nscalarFunctions,scalar_functions\nscale,scale\nscaleInCooldownSeconds,scale_in_cooldown_seconds\nscaleInPolicy,scale_in_policy\nscaleOutCooldownSeconds,scale_out_cooldown_seconds\nscaleOutPolicy,scale_out_policy\nscaling,scaling\nscalingConfig,scaling_config\nscanAll,scan_all\nscanFrequency,scan_frequency\nscanName,scan_name\nscanNameArn,scan_name_arn\nscanOnPush,scan_on_push\nscanRate,scan_rate\nscanState,scan_state\nscanStatus,scan_status\nscanStatusCode,scan_status_code\nscanStatusReason,scan_status_reason\nscanType,scan_type\nscanningConfiguration,scanning_configuration\nscanningConfigurations,scanning_configurations\nscansWithMostOpenCriticalFindings,scans_with_most_open_critical_findings\nscansWithMostOpenFindings,scans_with_most_open_findings\nsceneId,scene_id\nsceneMetadata,scene_metadata\nsceneSummaries,scene_summaries\nschedule,schedule\nscheduleActivityTaskDecisionAttributes,schedule_activity_task_decision_attributes\nscheduleActivityTaskFailedEventAttributes,schedule_activity_task_failed_event_attributes\nscheduleEndTime,schedule_end_time\nscheduleExpression,schedule_expression\nscheduleFrequency,schedule_frequency\nscheduleLambdaFunctionDecisionAttributes,schedule_lambda_function_decision_attributes\nscheduleLambdaFunctionFailedEventAttributes,schedule_lambda_function_failed_event_attributes\nscheduleOffset,schedule_offset\nscheduleStartTime,schedule_start_time\nscheduleTime,schedule_time\nscheduleToCloseTimeout,schedule_to_close_timeout\nscheduleToStartTimeout,schedule_to_start_timeout\nscheduledAuditArn,scheduled_audit_arn\nscheduledAuditName,scheduled_audit_name\nscheduledAudits,scheduled_audits\nscheduledBefore,scheduled_before\nscheduledEventId,scheduled_event_id\nscheduledJobRollouts,scheduled_job_rollouts\nscheduledOnOrAfter,scheduled_on_or_after\nscheduledSplitsConfig,scheduled_splits_config\nscheduledSplitsDefinition,scheduled_splits_definition\nscheduledStartTime,scheduled_start_time\nschedulingConfig,scheduling_config\nschedulingPolicies,scheduling_policies\nschedulingPolicyArn,scheduling_policy_arn\nschedulingPriority,scheduling_priority\nschedulingPriorityOverride,scheduling_priority_override\nschedulingStrategy,scheduling_strategy\nschema,schema\nschemaArn,schema_arn\nschemaDefinition,schema_definition\nschemaList,schema_list\nschemaName,schema_name\nschemaStorageConfig,schema_storage_config\nschemaSummaries,schema_summaries\nschemaType,schema_type\nschemaVersion,schema_version\nschemas,schemas\nscheme,scheme\nscope,scope\nscopes,scopes\nscoping,scoping\nscore,score\nscoreDetails,score_details\nscoreSource,score_source\nscores,scores\nscoringVector,scoring_vector\nscreenAutomationId,screen_automation_id\nscreenId,screen_id\nscreenshots,screenshots\nscript,script\nscriptLocation,script_location\nscriptLocationS3Bucket,script_location_s3_bucket\nscriptLocationS3Key,script_location_s3_key\nscriptModeConfig,script_mode_config\nscriptName,script_name\nscriptOutputLocation,script_output_location\nscriptParameters,script_parameters\nscriptType,script_type\nsdkType,sdk_type\nsearchCriteria,search_criteria\nsearchExpression,search_expression\nsearchOrder,search_order\nsearchResults,search_results\nsearchTerm,search_term\nsearchableAttributes,searchable_attributes\nsearchedCompletely,searched_completely\nsearchedLogStreams,searched_log_streams\nsecondaryArtifacts,secondary_artifacts\nsecondaryArtifactsOverride,secondary_artifacts_override\nsecondaryAvailabilityZone,secondary_availability_zone\nsecondarySourceVersions,secondary_source_versions\nsecondarySources,secondary_sources\nsecondarySourcesOverride,secondary_sources_override\nsecondarySourcesVersionOverride,secondary_sources_version_override\nseconds,seconds\nsecondsToLive,seconds_to_live\nsecret,secret\nsecretARN,secret_arn\nsecretAccessKey,secret_access_key\nsecretArn,secret_arn\nsecretId,secret_id\nsecretKey,secret_key\nsecretName,secret_name\nsecretOptions,secret_options\nsecretPolicy,secret_policy\nsecrets,secrets\nsecretsManagerKey,secrets_manager_key\nsectionalElements,sectional_elements\nsections,sections\nsecureInitializationRoleArn,secure_initialization_role_arn\nsecurityConfigDetail,security_config_detail\nsecurityConfigSummaries,security_config_summaries\nsecurityContext,security_context\nsecurityDetails,security_details\nsecurityGroup,security_group\nsecurityGroupIds,security_group_ids\nsecurityGroups,security_groups\nsecurityHubConfiguration,security_hub_configuration\nsecurityPolicy,security_policy\nsecurityPolicyDetail,security_policy_detail\nsecurityPolicySummaries,security_policy_summaries\nsecurityProfileArn,security_profile_arn\nsecurityProfileDescription,security_profile_description\nsecurityProfileIdentifier,security_profile_identifier\nsecurityProfileIdentifiers,security_profile_identifiers\nsecurityProfileName,security_profile_name\nsecurityProfileTargetArn,security_profile_target_arn\nsecurityProfileTargetMappings,security_profile_target_mappings\nsecurityProfileTargets,security_profile_targets\nseed,seed\nseedReplicationTime,seed_replication_time\nseedTime,seed_time\nseenAt,seen_at\nsegment,segment\nsegmentOverrides,segment_overrides\nsegments,segments\nselectAttributes,select_attributes\nselectedProperties,selected_properties\nselectedTestList,selected_test_list\nselectionMode,selection_mode\nselectionPattern,selection_pattern\nselector,selector\nselectors,selectors\nseleniumProperties,selenium_properties\nsemanticVersion,semantic_version\nsenderAccountId,sender_account_id\nsenderId,sender_id\nsensitive,sensitive\nsensitiveData,sensitive_data\nsensitiveDataOccurrences,sensitive_data_occurrences\nsensitivityInspectionTemplateId,sensitivity_inspection_template_id\nsensitivityInspectionTemplates,sensitivity_inspection_templates\nsensitivityScore,sensitivity_score\nsensitivityScoreOverridden,sensitivity_score_overridden\nsensitivityScoreOverride,sensitivity_score_override\nsentAt,sent_at\nsentiment,sentiment\nsentimentAnalysisSettings,sentiment_analysis_settings\nsentimentLabel,sentiment_label\nsentimentResponse,sentiment_response\nsentimentScore,sentiment_score\nsep,sep\nseparator,separator\nsequenceInformation,sequence_information\nsequenceStoreId,sequence_store_id\nsequenceStores,sequence_stores\nsequenceToken,sequence_token\nserial,serial\nserialNumber,serial_number\nserializer,serializer\nserver,server\nserverCatalogStatus,server_catalog_status\nserverCertificateArn,server_certificate_arn\nserverCertificateArns,server_certificate_arns\nserverCertificateStatus,server_certificate_status\nserverCertificateStatusDetail,server_certificate_status_detail\nserverCertificates,server_certificates\nserverCriteria,server_criteria\nserverDetail,server_detail\nserverError,server_error\nserverErrorCategory,server_error_category\nserverGroupId,server_group_id\nserverGroupLaunchConfigurations,server_group_launch_configurations\nserverGroupReplicationConfigurations,server_group_replication_configurations\nserverGroupValidationConfigurations,server_group_validation_configurations\nserverGroups,server_groups\nserverId,server_id\nserverImportFailure,server_import_failure\nserverImportSuccess,server_import_success\nserverInfos,server_infos\nserverLaunchConfigurations,server_launch_configurations\nserverList,server_list\nserverName,server_name\nserverReplicationConfigurations,server_replication_configurations\nserverReplicationParameters,server_replication_parameters\nserverSideEncryption,server_side_encryption\nserverSideEncryptionConfiguration,server_side_encryption_configuration\nserverStrategies,server_strategies\nserverType,server_type\nserverUrl,server_url\nserverValidationConfigurations,server_validation_configurations\nserverValidationOutput,server_validation_output\nserverValidationStrategy,server_validation_strategy\nservers,servers\nserversCount,servers_count\nserversMappedToApplications,servers_mapped_to_applications\nserversMappedtoTags,servers_mappedto_tags\nservice,service\nserviceAccountName,service_account_name\nserviceAccountRoleArn,service_account_role_arn\nserviceArn,service_arn\nserviceArns,service_arns\nserviceAttributes,service_attributes\nserviceCode,service_code\nserviceCodeList,service_code_list\nserviceCodes,service_codes\nserviceConnectConfiguration,service_connect_configuration\nserviceConnectDefaults,service_connect_defaults\nserviceConnectEndpoint,service_connect_endpoint\nserviceConnectResources,service_connect_resources\nserviceDiscovery,service_discovery\nserviceDnsName,service_dns_name\nserviceExecutionRoleArn,service_execution_role_arn\nserviceId,service_id\nserviceIdentifier,service_identifier\nserviceInstance,service_instance\nserviceInstanceName,service_instance_name\nserviceInstances,service_instances\nserviceIpv4Cidr,service_ipv4_cidr\nserviceIpv6Cidr,service_ipv6_cidr\nserviceLimit,service_limit\nserviceLinkedRoleArn,service_linked_role_arn\nserviceManagedS3,service_managed_s3\nserviceMetadata,service_metadata\nserviceMode,service_mode\nserviceName,service_name\nserviceNetworkArn,service_network_arn\nserviceNetworkId,service_network_id\nserviceNetworkIdentifier,service_network_identifier\nserviceNetworkName,service_network_name\nserviceNetworkServiceAssociationIdentifier,service_network_service_association_identifier\nserviceNetworkVpcAssociationIdentifier,service_network_vpc_association_identifier\nserviceProviderSamlMetadata,service_provider_saml_metadata\nserviceRecommendationOptions,service_recommendation_options\nserviceRegistries,service_registries\nserviceRole,service_role\nserviceRoleArn,service_role_arn\nserviceRoleOverride,service_role_override\nserviceSpec,service_spec\nserviceSyncBlocker,service_sync_blocker\nserviceSyncBlockerSummary,service_sync_blocker_summary\nserviceSyncConfig,service_sync_config\nserviceTemplate,service_template\nserviceTemplateVersion,service_template_version\nserviceTemplates,service_templates\nserviceType,service_type\nservices,services\nsession,session\nsessionArn,session_arn\nsessionAttributes,session_attributes\nsessionBackup,session_backup\nsessionConfiguration,session_configuration\nsessionContext,session_context\nsessionDurationInMinutes,session_duration_in_minutes\nsessionEnabled,session_enabled\nsessionExpirationTime,session_expiration_time\nsessionId,session_id\nsessionIds,session_ids\nsessionIssuer,session_issuer\nsessionPersistenceMode,session_persistence_mode\nsessionPolicy,session_policy\nsessionState,session_state\nsessionStorage,session_storage\nsessionSummaries,session_summaries\nsessionTarget,session_target\nsessionTimeout,session_timeout\nsessionToken,session_token\nsessionType,session_type\nsessions,sessions\nset,set\nsetAsActive,set_as_active\nsetAsDefault,set_as_default\nsetDefaultVersion,set_default_version\nsetFileModes,set_file_modes\nsetTimer,set_timer\nsetVariable,set_variable\nsetting,setting\nsettings,settings\nseverities,severities\nseverity,severity\nseverityCode,severity_code\nseverityCounts,severity_counts\nseverityLevels,severity_levels\nsha,sha\nsha256,sha256\nsha256sum,sha256_sum\nshadow,shadow\nshadowName,shadow_name\nshape,shape\nshapeId,shape_id\nshardCapacity,shard_capacity\nshardCount,shard_count\nshare,share\nshareDecaySeconds,share_decay_seconds\nshareDistribution,share_distribution\nshareId,share_id\nshareIdentifier,share_identifier\nshareName,share_name\nshareUrl,share_url\nsharedAccess,shared_access\nsharedAccountId,shared_account_id\nsharedMemorySize,shared_memory_size\nsharedVia,shared_via\nshares,shares\nshippingAddress,shipping_address\nshippingLabel,shipping_label\nshortCode,short_code\nshots,shots\nshouldOverwrite,should_overwrite\nshouldProfile,should_profile\nshowThumbnails,show_thumbnails\nshutdownAgentlessCollectors,shutdown_agentless_collectors\nshutdownAgents,shutdown_agents\nshutdownConnectors,shutdown_connectors\nshutdownMeCollectors,shutdown_me_collectors\nsid,sid\nsignalCatalogArn,signal_catalog_arn\nsignalDecoders,signal_decoders\nsignalDecodersToAdd,signal_decoders_to_add\nsignalDecodersToRemove,signal_decoders_to_remove\nsignalDecodersToUpdate,signal_decoders_to_update\nsignalExternalWorkflowExecutionDecisionAttributes,signal_external_workflow_execution_decision_attributes\nsignalExternalWorkflowExecutionFailedEventAttributes,signal_external_workflow_execution_failed_event_attributes\nsignalExternalWorkflowExecutionInitiatedEventAttributes,signal_external_workflow_execution_initiated_event_attributes\nsignalName,signal_name\nsignalsMap,signals_map\nsignalsToCollect,signals_to_collect\nsignature,signature\nsignatureAlgorithm,signature_algorithm\nsignatureContains,signature_contains\nsignatureCount,signature_count\nsignatureDateTime,signature_date_time\nsignatureExpiresAfter,signature_expires_after\nsignatureExpiresAt,signature_expires_at\nsignatureExpiresBefore,signature_expires_before\nsignatureInfo,signature_info\nsignatureKeyId,signature_key_id\nsignatureMap,signature_map\nsignatureR,signature_r\nsignatureS,signature_s\nsignatureTimestamp,signature_timestamp\nsignatureV,signature_v\nsignatureValid,signature_valid\nsignatureValidityPeriod,signature_validity_period\nsignedBiUrl,signed_bi_url\nsignedConnectionString,signed_connection_string\nsignedObject,signed_object\nsigningConfiguration,signing_configuration\nsigningDisabled,signing_disabled\nsigningImageFormat,signing_image_format\nsigningMaterial,signing_material\nsigningParameters,signing_parameters\nsigningProfileName,signing_profile_name\nsigningProfileParameter,signing_profile_parameter\nsigningRegion,signing_region\nsigningServiceName,signing_service_name\nsigv4,sigv4\nsilent,silent\nsimpleCriterion,simple_criterion\nsimpleRule,simple_rule\nsimpleRuleEvaluation,simple_rule_evaluation\nsimpleScopeTerm,simple_scope_term\nsimulationApplicationNames,simulation_application_names\nsimulationApplicationSummaries,simulation_application_summaries\nsimulationApplications,simulation_applications\nsimulationJobBatchSummaries,simulation_job_batch_summaries\nsimulationJobSummaries,simulation_job_summaries\nsimulationSoftwareSuite,simulation_software_suite\nsimulationTimeMillis,simulation_time_millis\nsimulationUnitLimit,simulation_unit_limit\nsince,since\nsite,site\nsiteLinkEnabled,site_link_enabled\nsites,sites\nsize,size\nsizeClassified,size_classified\nsizeInBytes,size_in_bytes\nsizeInBytesCompressed,size_in_bytes_compressed\nsizeInGb,size_in_gb\nsizeInGiB,size_in_gib\nsizeInMiB,size_in_mib\nsizeLimit,size_limit\nskipAppResign,skip_app_resign\nskipFinalSnapshot,skip_final_snapshot\nskipResourceInUseCheck,skip_resource_in_use_check\nskipped,skipped\nskippedEntries,skipped_entries\nskippedFindingsCount,skipped_findings_count\nslackChannelConfigurations,slack_channel_configurations\nslackWorkspaceConfigurations,slack_workspace_configurations\nslotCaptureSetting,slot_capture_setting\nslotConstraint,slot_constraint\nslotDiscrepancies,slot_discrepancies\nslotElicitationStyle,slot_elicitation_style\nslotHints,slot_hints\nslotId,slot_id\nslotMatchResult,slot_match_result\nslotMatchResultCounts,slot_match_result_counts\nslotName,slot_name\nslotPriorities,slot_priorities\nslotResolutionResults,slot_resolution_results\nslotSpecifications,slot_specifications\nslotSummaries,slot_summaries\nslotToElicit,slot_to_elicit\nslotType,slot_type\nslotTypeCategory,slot_type_category\nslotTypeConfigurations,slot_type_configurations\nslotTypeId,slot_type_id\nslotTypeName,slot_type_name\nslotTypeSignature,slot_type_signature\nslotTypeSummaries,slot_type_summaries\nslotTypeValues,slot_type_values\nslotTypeVersion,slot_type_version\nslotTypes,slot_types\nslotTypesCount,slot_types_count\nslots,slots\nslotsFilledInSession,slots_filled_in_session\nsmallVolumeConf,small_volume_conf\nsmallVolumeMaxSize,small_volume_max_size\nsmsConfigurations,sms_configurations\nsnapshot,snapshot\nsnapshotArn,snapshot_arn\nsnapshotConfiguration,snapshot_configuration\nsnapshotCreateTime,snapshot_create_time\nsnapshotCreationTime,snapshot_creation_time\nsnapshotID,snapshot_id\nsnapshotId,snapshot_id\nsnapshotName,snapshot_name\nsnapshotRemainingDays,snapshot_remaining_days\nsnapshotRetentionPeriod,snapshot_retention_period\nsnapshotRetentionStartTime,snapshot_retention_start_time\nsnapshotTimeOfDay,snapshot_time_of_day\nsnapshots,snapshots\nsnoozeActionConfiguration,snooze_action_configuration\nsnoozeActionRequests,snooze_action_requests\nsnoozeDuration,snooze_duration\nsns,sns\nsnsPublishStatusCode,sns_publish_status_code\nsnsTopic,sns_topic\nsnsTopicARN,sns_topic_arn\nsnsTopicArn,sns_topic_arn\nsocketAddress,socket_address\nsoftLimit,soft_limit\nsoftware,software\nsolution,solution\nsolutionArn,solution_arn\nsolutionConfig,solution_config\nsolutionVersion,solution_version\nsolutionVersionArn,solution_version_arn\nsolutionVersions,solution_versions\nsolutions,solutions\nsopRecommendations,sop_recommendations\nsort,sort\nsortBy,sort_by\nsortByAttribute,sort_by_attribute\nsortByOrder,sort_by_order\nsortColumns,sort_columns\nsortCriteria,sort_criteria\nsortOrder,sort_order\nsorts,sorts\nsource,source\nsource1,source1\nsource2,source2\nsourceAccessToken,source_access_token\nsourceAccount,source_account\nsourceAccountID,source_account_id\nsourceApiArn,source_api_arn\nsourceApiAssociation,source_api_association\nsourceApiAssociationConfig,source_api_association_config\nsourceApiAssociationStatus,source_api_association_status\nsourceApiAssociationStatusDetail,source_api_association_status_detail\nsourceApiAssociationSummaries,source_api_association_summaries\nsourceApiId,source_api_id\nsourceApiIdentifier,source_api_identifier\nsourceArn,source_arn\nsourceArns,source_arns\nsourceAuthOverride,source_auth_override\nsourceBotVersion,source_bot_version\nsourceBranch,source_branch\nsourceCloudProperties,source_cloud_properties\nsourceCode,source_code\nsourceCodeList,source_code_list\nsourceCodeRepositories,source_code_repositories\nsourceCodeRepository,source_code_repository\nsourceCommit,source_commit\nsourceCommitId,source_commit_id\nsourceCommitSpecifier,source_commit_specifier\nsourceConfiguration,source_configuration\nsourceConnectionState,source_connection_state\nsourceConnectorLabel,source_connector_label\nsourceConnectorProperties,source_connector_properties\nsourceConnectorType,source_connector_type\nsourceContainer,source_container\nsourceCredentialsInfos,source_credentials_infos\nsourceData,source_data\nsourceDatabaseName,source_database_name\nsourceDescription,source_description\nsourceDiskName,source_disk_name\nsourceFields,source_fields\nsourceFile,source_file\nsourceFileType,source_file_type\nsourceFiles,source_files\nsourceFlowConfig,source_flow_config\nsourceFrequency,source_frequency\nsourceId,source_id\nsourceIdentifier,source_identifier\nsourceImageSet,source_image_set\nsourceImageSetId,source_image_set_id\nsourceImageSetProperties,source_image_set_properties\nsourceInfo,source_info\nsourceInstanceName,source_instance_name\nsourceIpAddress,source_ip_address\nsourceKeyspaceName,source_keyspace_name\nsourceKeyword,source_keyword\nsourceLambdaLayerArn,source_lambda_layer_arn\nsourceLayerHash,source_layer_hash\nsourceLocationOverride,source_location_override\nsourceName,source_name\nsourceNetwork,source_network\nsourceNetworkID,source_network_id\nsourceNetworkIDs,source_network_ids\nsourceNetworks,source_networks\nsourceParams,source_params\nsourcePath,source_path\nsourcePipelineArn,source_pipeline_arn\nsourcePipelineName,source_pipeline_name\nsourceProperties,source_properties\nsourceReference,source_reference\nsourceRegion,source_region\nsourceRelationalDatabaseName,source_relational_database_name\nsourceRepository,source_repository\nsourceRepositoryName,source_repository_name\nsourceResourceName,source_resource_name\nsourceRevisions,source_revisions\nsourceS3DirectoryPath,source_s3_directory_path\nsourceS3Location,source_s3_location\nsourceS3Object,source_s3_object\nsourceSchemaName,source_schema_name\nsourceSecurityGroups,source_security_groups\nsourceServer,source_server\nsourceServerArn,source_server_arn\nsourceServerID,source_server_id\nsourceServerIDs,source_server_ids\nsourceServerId,source_server_id\nsourceServerTags,source_server_tags\nsourceServers,source_servers\nsourceSetUpOption,source_set_up_option\nsourceSnapshotName,source_snapshot_name\nsourceStatuses,source_statuses\nsourceTableName,source_table_name\nsourceType,source_type\nsourceTypeOverride,source_type_override\nsourceUrl,source_url\nsourceVersion,source_version\nsourceVolume,source_volume\nsourceVpc,source_vpc\nsourceVpcID,source_vpc_id\nsources,sources\nspaceName,space_name\nspan,span\nsparkSqlJobDriver,spark_sql_job_driver\nsparkSqlParameters,spark_sql_parameters\nsparkSubmitJobDriver,spark_submit_job_driver\nsparkSubmitParameters,spark_submit_parameters\nsparql,sparql\nspec,spec\nspectrumConfig,spectrum_config\nspeechTranscriptionResult,speech_transcription_result\nspeechTranscriptionResultCounts,speech_transcription_result_counts\nspeedOfMigration,speed_of_migration\nsphere,sphere\nspoolingMode,spooling_mode\nspotIamFleetRole,spot_iam_fleet_role\nsql,sql\nsqlParameters,sql_parameters\nsqlQuery,sql_query\nsqlStatementResults,sql_statement_results\nsqlStatements,sql_statements\nsqs,sqs\nsrcCodeOrDbAnalysisStatus,src_code_or_db_analysis_status\nsseConfig,sse_config\nsseKmsKeyId,sse_kms_key_id\nsshKeyName,ssh_key_name\nsshPublicKey,ssh_public_key\nssmAgentDiscoveryDatetime,ssm_agent_discovery_datetime\nssmDocument,ssm_document\nssmDocumentName,ssm_document_name\nssmDocumentType,ssm_document_type\nssmDocuments,ssm_documents\nssmOutput,ssm_output\nssmValidationParameters,ssm_validation_parameters\nssmlMessage,ssml_message\nssoApplicationId,sso_application_id\nssoClientId,sso_client_id\nssoIdentity,sso_identity\nstabilityStatus,stability_status\nstabilityStatusAt,stability_status_at\nstackId,stack_id\nstackName,stack_name\nstackParameters,stack_parameters\nstackSetName,stack_set_name\nstage,stage\nstageArn,stage_arn\nstageDescription,stage_description\nstageDetails,stage_details\nstageKeys,stage_keys\nstageName,stage_name\nstageProgress,stage_progress\nstageSession,stage_session\nstageSessions,stage_sessions\nstageStates,stage_states\nstageVariableOverrides,stage_variable_overrides\nstageVariables,stage_variables\nstages,stages\nstagingAccountID,staging_account_id\nstagingAccountIDs,staging_account_ids\nstagingArea,staging_area\nstagingAreaSubnetId,staging_area_subnet_id\nstagingAreaTags,staging_area_tags\nstagingAvailabilityZone,staging_availability_zone\nstagingDiskType,staging_disk_type\nstagingSourceServerArn,staging_source_server_arn\nstandardControlsCount,standard_controls_count\nstandardDeviation,standard_deviation\nstart,start\nstartAfter,start_after\nstartAt,start_at\nstartAtPreviousStartedEvent,start_at_previous_started_event\nstartBit,start_bit\nstartByte,start_byte\nstartCharOffset,start_char_offset\nstartChildWorkflowExecutionDecisionAttributes,start_child_workflow_execution_decision_attributes\nstartChildWorkflowExecutionFailedEventAttributes,start_child_workflow_execution_failed_event_attributes\nstartChildWorkflowExecutionInitiatedEventAttributes,start_child_workflow_execution_initiated_event_attributes\nstartColumn,start_column\nstartDate,start_date\nstartDateTime,start_date_time\nstartFromHead,start_from_head\nstartInclusive,start_inclusive\nstartLambdaFunctionFailedEventAttributes,start_lambda_function_failed_event_attributes\nstartLine,start_line\nstartOn,start_on\nstartPeriod,start_period\nstartResponse,start_response\nstartSigningJobParameter,start_signing_job_parameter\nstartTime,start_time\nstartTimeFilter,start_time_filter\nstartTimeInSeconds,start_time_in_seconds\nstartTimeOffsetInNanos,start_time_offset_in_nanos\nstartTimeRange,start_time_range\nstartTimeout,start_timeout\nstartTimeoutMs,start_timeout_ms\nstartTimerDecisionAttributes,start_timer_decision_attributes\nstartTimerFailedEventAttributes,start_timer_failed_event_attributes\nstartTimes,start_times\nstartTimestamp,start_timestamp\nstartToCloseTimeout,start_to_close_timeout\nstartToFireTimeout,start_to_fire_timeout\nstartToken,start_token\nstartUrl,start_url\nstarted,started\nstartedAfter,started_after\nstartedAt,started_at\nstartedBefore,started_before\nstartedBy,started_by\nstartedEventId,started_event_id\nstartedFromBackupId,started_from_backup_id\nstartedOn,started_on\nstartedTime,started_time\nstartingToken,starting_token\nstat,stat\nstate,state\nstateChangeConfiguration,state_change_configuration\nstateChangeError,state_change_error\nstateChangeTimeRange,state_change_time_range\nstateChangedAt,state_changed_at\nstateChanges,state_changes\nstateDescription,state_description\nstateDetail,state_detail\nstateDetails,state_details\nstateEnteredEventDetails,state_entered_event_details\nstateExitedEventDetails,state_exited_event_details\nstateMachineAliasArn,state_machine_alias_arn\nstateMachineAliases,state_machine_aliases\nstateMachineArn,state_machine_arn\nstateMachineName,state_machine_name\nstateMachineVersionArn,state_machine_version_arn\nstateMachineVersions,state_machine_versions\nstateMachines,state_machines\nstateName,state_name\nstateOrProvince,state_or_province\nstateReason,state_reason\nstateValue,state_value\nstatement,statement\nstatementId,statement_id\nstates,states\nstaticColumns,static_columns\nstaticIp,static_ip\nstaticIpName,static_ip_name\nstaticIps,static_ips\nstatistic,statistic\nstatisticalThreshold,statistical_threshold\nstatistics,statistics\nstatisticsId,statistics_id\nstats,stats\nstatus,status\nstatusChangeTime,status_change_time\nstatusChangedAt,status_changed_at\nstatusCode,status_code\nstatusCodes,status_codes\nstatusCounts,status_counts\nstatusDetail,status_detail\nstatusDetails,status_details\nstatusEquals,status_equals\nstatusFilter,status_filter\nstatusList,status_list\nstatusMessage,status_message\nstatusReason,status_reason\nstatusReportS3Bucket,status_report_s3_bucket\nstatusReportS3Key,status_report_s3_key\nstatusSummary,status_summary\nstatusTimeoutInSeconds,status_timeout_in_seconds\nstatusType,status_type\nstatusUpdateDateTime,status_update_date_time\nstatuscode,statuscode\nstatuses,statuses\nstdDeviation,std_deviation\nstddev,stddev\nstep,step\nstepActionType,step_action_type\nstepAutomationConfiguration,step_automation_configuration\nstepExecutionId,step_execution_id\nstepFunctions,step_functions\nstepGroupId,step_group_id\nstepId,step_id\nstepName,step_name\nstepTarget,step_target\nstepTargets,step_targets\nstepTimeoutInMinutes,step_timeout_in_minutes\nsteps,steps\nstillWaitingResponse,still_waiting_response\nstmt,stmt\nstopAction,stop_action\nstopAt,stop_at\nstopCode,stop_code\nstopConditions,stop_conditions\nstopDate,stop_date\nstopInstanceOnIdleRequest,stop_instance_on_idle_request\nstopTime,stop_time\nstopTimeout,stop_timeout\nstopTrigger,stop_trigger\nstopped,stopped\nstoppedAt,stopped_at\nstoppedBy,stopped_by\nstoppedReason,stopped_reason\nstoppingAt,stopping_at\nstoppingCondition,stopping_condition\nstorage,storage\nstorageCapacity,storage_capacity\nstorageClass,storage_class\nstorageCompressionFormat,storage_compression_format\nstorageConfigurations,storage_configurations\nstorageGBHour,storage_gb_hour\nstorageLocation,storage_location\nstoragePerMonthInGb,storage_per_month_in_gb\nstorageType,storage_type\nstoreArn,store_arn\nstoreFormat,store_format\nstoreId,store_id\nstoreName,store_name\nstoreOptions,store_options\nstoreSizeBytes,store_size_bytes\nstoredBytes,stored_bytes\nstrValues,str_values\nstrategy,strategy\nstrategyOption,strategy_option\nstream,stream\nstreamArn,stream_arn\nstreamConfiguration,stream_configuration\nstreamId,stream_id\nstreamInfo,stream_info\nstreamKey,stream_key\nstreamKeys,stream_keys\nstreamName,stream_name\nstreamOutputToCloudWatch,stream_output_to_cloud_watch\nstreamSession,stream_session\nstreamSessions,stream_sessions\nstreamUI,stream_ui\nstreamUrl,stream_url\nstreamVersion,stream_version\nstreamingImage,streaming_image\nstreamingImageId,streaming_image_id\nstreamingImageIds,streaming_image_ids\nstreamingImages,streaming_images\nstreamingSessionBackup,streaming_session_backup\nstreamingSessionBackups,streaming_session_backups\nstreams,streams\nstreamsKmsKey,streams_kms_key\nstreamsKmsRole,streams_kms_role\nstreet1,street1\nstreet2,street2\nstreet3,street3\nstreetInfo,street_info\nstreetName,street_name\nstreetNumber,street_number\nstreetSuffix,street_suffix\nstring,string\nstringSetValue,string_set_value\nstringValue,string_value\nstringValues,string_values\nstrings,strings\nstructurallyExclusive,structurally_exclusive\nstudio,studio\nstudioComponent,studio_component\nstudioComponentId,studio_component_id\nstudioComponentIds,studio_component_ids\nstudioComponentName,studio_component_name\nstudioComponentSummaries,studio_component_summaries\nstudioComponents,studio_components\nstudioEncryptionConfiguration,studio_encryption_configuration\nstudioId,studio_id\nstudioName,studio_name\nstudioUrl,studio_url\nstudios,studios\nstyle,style\nsubDomainSetting,sub_domain_setting\nsubDomainSettings,sub_domain_settings\nsubDomains,sub_domains\nsubFolders,sub_folders\nsubModules,sub_modules\nsubResourceId,sub_resource_id\nsubSlotHints,sub_slot_hints\nsubSlotSetting,sub_slot_setting\nsubSlotToElicit,sub_slot_to_elicit\nsubSlots,sub_slots\nsubTitle,sub_title\nsubdirectory,subdirectory\nsubject,subject\nsubjectAlternativeNames,subject_alternative_names\nsubjectArn,subject_arn\nsubjectId,subject_id\nsubjectStructures,subject_structures\nsubjects,subjects\nsubmit,submit\nsubmitTime,submit_time\nsubmittedAt,submitted_at\nsubmittedBy,submitted_by\nsubmitter,submitter\nsubnet,subnet\nsubnetId,subnet_id\nsubnetIds,subnet_ids\nsubnets,subnets\nsubqueries,subqueries\nsubscribedAt,subscribed_at\nsubscriber,subscriber\nsubscriberArn,subscriber_arn\nsubscriberDescription,subscriber_description\nsubscriberEndpoint,subscriber_endpoint\nsubscriberId,subscriber_id\nsubscriberIdentity,subscriber_identity\nsubscriberName,subscriber_name\nsubscriberStatus,subscriber_status\nsubscribers,subscribers\nsubscriptionFilters,subscription_filters\nsubscriptionProtocol,subscription_protocol\nsubscriptionType,subscription_type\nsubscriptions,subscriptions\nsubscriptionsFilePath,subscriptions_file_path\nsubtitle,subtitle\nsubtype,subtype\nsucceeded,succeeded\nsucceededFindingsCount,succeeded_findings_count\nsucceededWorldCount,succeeded_world_count\nsucceededWorlds,succeeded_worlds\nsuccess,success\nsuccessCodes,success_codes\nsuccessConditional,success_conditional\nsuccessCount,success_count\nsuccessEntries,success_entries\nsuccessNextStep,success_next_step\nsuccessResponse,success_response\nsuccessResponseHandlingConfig,success_response_handling_config\nsuccessful,successful\nsuccessfulEntries,successful_entries\nsuccessfulExecutions,successful_executions\nsuccessfulRequests,successful_requests\nsuccessfulSet,successful_set\nsuccessfulVersions,successful_versions\nsuffix,suffix\nsuggest,suggest\nsuggestedChanges,suggested_changes\nsuggestedFixes,suggested_fixes\nsuggester,suggester\nsuggestion,suggestion\nsuggestions,suggestions\nsuite,suite\nsuiteDefinitionArn,suite_definition_arn\nsuiteDefinitionConfiguration,suite_definition_configuration\nsuiteDefinitionId,suite_definition_id\nsuiteDefinitionInformationList,suite_definition_information_list\nsuiteDefinitionName,suite_definition_name\nsuiteDefinitionVersion,suite_definition_version\nsuiteRunArn,suite_run_arn\nsuiteRunConfiguration,suite_run_configuration\nsuiteRunId,suite_run_id\nsuiteRunsList,suite_runs_list\nsuites,suites\nsum,sum\nsumOfSquares,sum_of_squares\nsummaries,summaries\nsummary,summary\nsummaryList,summary_list\nsuperuserParameters,superuser_parameters\nsupplementaryConfiguration,supplementary_configuration\nsuppliedData,supplied_data\nsupportCode,support_code\nsupportedApiVersions,supported_api_versions\nsupportedAppCategories,supported_app_categories\nsupportedComponentSources,supported_component_sources\nsupportedDataTransferApis,supported_data_transfer_apis\nsupportedDataTransferTypes,supported_data_transfer_types\nsupportedDateFormat,supported_date_format\nsupportedDestinationConnectors,supported_destination_connectors\nsupportedFieldTypeDetails,supported_field_type_details\nsupportedFormats,supported_formats\nsupportedHours,supported_hours\nsupportedLanguages,supported_languages\nsupportedLocales,supported_locales\nsupportedOperators,supported_operators\nsupportedOsVersions,supported_os_versions\nsupportedPlatforms,supported_platforms\nsupportedRegions,supported_regions\nsupportedSchedulingFrequencies,supported_scheduling_frequencies\nsupportedTriggerTypes,supported_trigger_types\nsupportedValues,supported_values\nsupportedVersion,supported_version\nsupportedWriteOperations,supported_write_operations\nsupportsNitroInstances,supports_nitro_instances\nsuppressAlerts,suppress_alerts\nsuppressDataIdentifiers,suppress_data_identifiers\nsuppressIndefinitely,suppress_indefinitely\nsuppressNextMessage,suppress_next_message\nsuppressed,suppressed\nsuppressedAlertsIncluded,suppressed_alerts_included\nsuppressedNonCompliantResourcesCount,suppressed_non_compliant_resources_count\nsuppressions,suppressions\nswappiness,swappiness\nsymbolicLinks,symbolic_links\nsyncConfig,sync_config\nsyncDefinitions,sync_definitions\nsyncFromResources,sync_from_resources\nsyncJobSummaries,sync_job_summaries\nsyncResources,sync_resources\nsyncRole,sync_role\nsyncSource,sync_source\nsyncType,sync_type\nsyncWithPublicNamespace,sync_with_public_namespace\nsynonyms,synonyms\nsystemControls,system_controls\nsystemEvent,system_event\nsystemEvidenceCount,system_evidence_count\nsystemInfo,system_info\nsystemInitializationScripts,system_initialization_scripts\nsystemInstanceId,system_instance_id\nsystemMessage,system_message\nsystemResourceLimits,system_resource_limits\nsystemsManagerAgent,systems_manager_agent\ntableArn,table_arn\ntableColumnId,table_column_id\ntableColumnName,table_column_name\ntableColumns,table_columns\ntableId,table_id\ntableName,table_name\ntablePrefix,table_prefix\ntableReference,table_reference\ntableRegistrationOutput,table_registration_output\ntableRestoreRequestId,table_restore_request_id\ntableRestoreStatus,table_restore_status\ntableRestoreStatuses,table_restore_statuses\ntables,tables\ntabularConditions,tabular_conditions\ntabularPropertyValues,tabular_property_values\ntabularSchemaConfig,tabular_schema_config\ntag,tag\ntagCriterion,tag_criterion\ntagFilter,tag_filter\ntagFilters,tag_filters\ntagKey,tag_key\ntagKeyComparisonType,tag_key_comparison_type\ntagKeys,tag_keys\ntagList,tag_list\ntagQueryConfiguration,tag_query_configuration\ntagScopeTerm,tag_scope_term\ntagStatus,tag_status\ntagValue,tag_value\ntagValueComparisonType,tag_value_comparison_type\ntagValues,tag_values\ntags,tags\ntagsOverride,tags_override\ntaints,taints\ntarget,target\ntargetAccount,target_account\ntargetAccountId,target_account_id\ntargetAccountIds,target_account_ids\ntargetAction,target_action\ntargetArn,target_arn\ntargetArns,target_arns\ntargetAwsAccount,target_aws_account\ntargetBitrate,target_bitrate\ntargetBranch,target_branch\ntargetCapacity,target_capacity\ntargetCheckNames,target_check_names\ntargetComponentName,target_component_name\ntargetComponentTypeId,target_component_type_id\ntargetDatabaseEngine,target_database_engine\ntargetDatabaseName,target_database_name\ntargetDestination,target_destination\ntargetEirp,target_eirp\ntargetEntityId,target_entity_id\ntargetFileSize,target_file_size\ntargetFilters,target_filters\ntargetFramerate,target_framerate\ntargetFrames,target_frames\ntargetFramesIndex,target_frames_index\ntargetGroup,target_group\ntargetGroupArn,target_group_arn\ntargetGroupArns,target_group_arns\ntargetGroupIdentifier,target_group_identifier\ntargetGroupInfoList,target_group_info_list\ntargetGroupPairInfoList,target_group_pair_info_list\ntargetGroupType,target_group_type\ntargetGroups,target_groups\ntargetId,target_id\ntargetIdentifier,target_identifier\ntargetIds,target_ids\ntargetInstanceID,target_instance_id\ntargetInstanceTypeRightSizingMethod,target_instance_type_right_sizing_method\ntargetInstances,target_instances\ntargetIntervalSeconds,target_interval_seconds\ntargetKeyspaceName,target_keyspace_name\ntargetName,target_name\ntargetNodes,target_nodes\ntargetPipeline,target_pipeline\ntargetRegion,target_region\ntargetRepository,target_repository\ntargetResolution,target_resolution\ntargetResource,target_resource\ntargetResourceCount,target_resource_count\ntargetResourceCreatedAt,target_resource_created_at\ntargetResourceType,target_resource_type\ntargetResourceTypes,target_resource_types\ntargetRevision,target_revision\ntargetRoleArn,target_role_arn\ntargetSchemaName,target_schema_name\ntargetSelection,target_selection\ntargetSnapshotName,target_snapshot_name\ntargetState,target_state\ntargetStatus,target_status\ntargetTableName,target_table_name\ntargetType,target_type\ntargetUrl,target_url\ntargetVersion,target_version\ntargetVersionWeight,target_version_weight\ntargetVpc,target_vpc\ntargets,targets\ntask,task\ntaskArn,task_arn\ntaskArns,task_arns\ntaskContext,task_context\ntaskCredentials,task_credentials\ntaskDefinition,task_definition\ntaskDefinitionArn,task_definition_arn\ntaskDefinitionArns,task_definition_arns\ntaskDefinitions,task_definitions\ntaskEndTime,task_end_time\ntaskError,task_error\ntaskErrorDetails,task_error_details\ntaskFailedEventDetails,task_failed_event_details\ntaskId,task_id\ntaskIdList,task_id_list\ntaskIds,task_ids\ntaskInfos,task_infos\ntaskList,task_list\ntaskListScheduleToStartTimeout,task_list_schedule_to_start_timeout\ntaskName,task_name\ntaskObject,task_object\ntaskPriority,task_priority\ntaskProperties,task_properties\ntaskRoleArn,task_role_arn\ntaskScheduledEventDetails,task_scheduled_event_details\ntaskSet,task_set\ntaskSetArn,task_set_arn\ntaskSetLabel,task_set_label\ntaskSets,task_sets\ntaskSetsInfo,task_sets_info\ntaskStartFailedEventDetails,task_start_failed_event_details\ntaskStartTime,task_start_time\ntaskStartToCloseTimeout,task_start_to_close_timeout\ntaskStartedEventDetails,task_started_event_details\ntaskStatistics,task_statistics\ntaskStatus,task_status\ntaskSubmitFailedEventDetails,task_submit_failed_event_details\ntaskSubmittedEventDetails,task_submitted_event_details\ntaskSucceededEventDetails,task_succeeded_event_details\ntaskSummary,task_summary\ntaskTimedOutEventDetails,task_timed_out_event_details\ntaskToken,task_token\ntaskType,task_type\ntaskingDocument,tasking_document\ntaskrunnerId,taskrunner_id\ntasks,tasks\ntcpRetryEvents,tcp_retry_events\ntcpRoute,tcp_route\nteamId,team_id\nteamMembers,team_members\nteamName,team_name\ntelemetryEndpoint,telemetry_endpoint\ntelemetryMetadata,telemetry_metadata\ntemplate,template\ntemplateArn,template_arn\ntemplateBody,template_body\ntemplateFile,template_file\ntemplateFormat,template_format\ntemplateId,template_id\ntemplateLocation,template_location\ntemplateMajorVersion,template_major_version\ntemplateMinorVersion,template_minor_version\ntemplateName,template_name\ntemplateStepGroupSummary,template_step_group_summary\ntemplateStepSummaryList,template_step_summary_list\ntemplateSummaries,template_summaries\ntemplateSummary,template_summary\ntemplateSyncConfig,template_sync_config\ntemplateType,template_type\ntemplateUri,template_uri\ntemplateVersion,template_version\ntemplateVersions,template_versions\ntemplates,templates\ntemplatesLocation,templates_location\ntemporaryPassword,temporary_password\ntenancy,tenancy\ntenant,tenant\ntenantDisplayName,tenant_display_name\ntenantId,tenant_id\ntenantIdentifier,tenant_identifier\ntermDurationInSeconds,term_duration_in_seconds\ntermLength,term_length\nterminate,terminate\nterminateAt,terminate_at\nterminateBlueInstancesOnDeploymentSuccess,terminate_blue_instances_on_deployment_success\nterminateInstanceOnFailure,terminate_instance_on_failure\nterminateJobsOnUpdate,terminate_jobs_on_update\nterminationWaitTimeInMinutes,termination_wait_time_in_minutes\ntermsAggregation,terms_aggregation\nterraformSource,terraform_source\nterraformSourceName,terraform_source_name\nterraformSourceNames,terraform_source_names\nterraformSources,terraform_sources\ntest,test\ntestArtifactsUrl,test_artifacts_url\ntestBotAliasTags,test_bot_alias_tags\ntestCaseDefinitionId,test_case_definition_id\ntestCaseDefinitionName,test_case_definition_name\ntestCaseRunId,test_case_run_id\ntestCaseScenarioId,test_case_scenario_id\ntestCaseScenarioType,test_case_scenario_type\ntestCases,test_cases\ntestConfigUrl,test_config_url\ntestDurationInMinutes,test_duration_in_minutes\ntestExecutionId,test_execution_id\ntestExecutionModality,test_execution_modality\ntestExecutionResults,test_execution_results\ntestExecutionStatus,test_execution_status\ntestExecutions,test_executions\ntestGridProject,test_grid_project\ntestGridProjects,test_grid_projects\ntestGridSession,test_grid_session\ntestGridSessions,test_grid_sessions\ntestId,test_id\ntestPackageArn,test_package_arn\ntestRawDataPath,test_raw_data_path\ntestRecommendations,test_recommendations\ntestResult,test_result\ntestScenarios,test_scenarios\ntestSetDiscrepancyRawOutputUrl,test_set_discrepancy_raw_output_url\ntestSetDiscrepancyReportId,test_set_discrepancy_report_id\ntestSetDiscrepancyReportStatus,test_set_discrepancy_report_status\ntestSetDiscrepancyTopErrors,test_set_discrepancy_top_errors\ntestSetExportSpecification,test_set_export_specification\ntestSetGenerationId,test_set_generation_id\ntestSetGenerationStatus,test_set_generation_status\ntestSetId,test_set_id\ntestSetImportResourceSpecification,test_set_import_resource_specification\ntestSetName,test_set_name\ntestSetRecords,test_set_records\ntestSetTags,test_set_tags\ntestSets,test_sets\ntestSpecArn,test_spec_arn\ntestSummary,test_summary\ntestTrafficRoute,test_traffic_route\ntestType,test_type\ntestingInformation,testing_information\ntests,tests\ntext,text\ntextDataDeliveryEnabled,text_data_delivery_enabled\ntextInput,text_input\ntextInputSpecification,text_input_specification\ntextLogSettings,text_log_settings\ntextResponse,text_response\ntfi,tfi\ntgwStatus,tgw_status\ntheme,theme\nthemeToCreate,theme_to_create\nthen,then\nthingArn,thing_arn\nthingConnectivityIndexingMode,thing_connectivity_indexing_mode\nthingGroupArn,thing_group_arn\nthingGroupDescription,thing_group_description\nthingGroupId,thing_group_id\nthingGroupIndexingConfiguration,thing_group_indexing_configuration\nthingGroupIndexingMode,thing_group_indexing_mode\nthingGroupMetadata,thing_group_metadata\nthingGroupName,thing_group_name\nthingGroupNames,thing_group_names\nthingGroupProperties,thing_group_properties\nthingGroups,thing_groups\nthingGroupsToAdd,thing_groups_to_add\nthingGroupsToRemove,thing_groups_to_remove\nthingId,thing_id\nthingIndexingConfiguration,thing_indexing_configuration\nthingIndexingMode,thing_indexing_mode\nthingName,thing_name\nthingTypeArn,thing_type_arn\nthingTypeDescription,thing_type_description\nthingTypeId,thing_type_id\nthingTypeMetadata,thing_type_metadata\nthingTypeName,thing_type_name\nthingTypeProperties,thing_type_properties\nthingTypes,thing_types\nthings,things\nthirdPartyConfigurationUrl,third_party_configuration_url\nthreadStates,thread_states\nthreadsPerCore,threads_per_core\nthreshold,threshold\nthresholdBreachValue,threshold_breach_value\nthresholdPercent,threshold_percent\nthresholdPercentage,threshold_percentage\nthresholdValue,threshold_value\nthrottle,throttle\nthrottleSettings,throttle_settings\nthrottling,throttling\nthrottlingBurstLimit,throttling_burst_limit\nthrottlingRateLimit,throttling_rate_limit\nthroughput,throughput\nthroughputInfo,throughput_info\nthroughputMode,throughput_mode\nthumbnailConfiguration,thumbnail_configuration\nthumbnailUrl,thumbnail_url\nthumbprint,thumbprint\ntier,tier\ntime,time\ntimeBasedCanary,time_based_canary\ntimeBasedLinear,time_based_linear\ntimeCreated,time_created\ntimeDimension,time_dimension\ntimeExpression,time_expression\ntimeInMillis,time_in_millis\ntimeInSeconds,time_in_seconds\ntimeOfCreation,time_of_creation\ntimeOfEvent,time_of_event\ntimeOrdering,time_ordering\ntimePeriod,time_period\ntimeRange,time_range\ntimeSeriesArn,time_series_arn\ntimeSeriesCreationDate,time_series_creation_date\ntimeSeriesId,time_series_id\ntimeSeriesLastUpdateDate,time_series_last_update_date\ntimeSeriesType,time_series_type\ntimeToLive,time_to_live\ntimeToLiveInSeconds,time_to_live_in_seconds\ntimeValue,time_value\ntimedOut,timed_out\ntimems,timems\ntimeout,timeout\ntimeoutConditional,timeout_conditional\ntimeoutConfig,timeout_config\ntimeoutInMillis,timeout_in_millis\ntimeoutInMins,timeout_in_mins\ntimeoutInMinutes,timeout_in_minutes\ntimeoutInMinutesOverride,timeout_in_minutes_override\ntimeoutInSeconds,timeout_in_seconds\ntimeoutMillis,timeout_millis\ntimeoutMinutes,timeout_minutes\ntimeoutNextStep,timeout_next_step\ntimeoutResponse,timeout_response\ntimeoutSeconds,timeout_seconds\ntimeoutType,timeout_type\ntimerCanceledEventAttributes,timer_canceled_event_attributes\ntimerFiredEventAttributes,timer_fired_event_attributes\ntimerId,timer_id\ntimerName,timer_name\ntimerStartedEventAttributes,timer_started_event_attributes\ntimers,timers\ntimestamp,timestamp\ntimestampFormat,timestamp_format\ntimestampPartition,timestamp_partition\ntimestamps,timestamps\ntimestream,timestream\ntimestreamDatabaseArn,timestream_database_arn\ntimestreamDatabaseName,timestream_database_name\ntimestreamRegistrationResponse,timestream_registration_response\ntimestreamResources,timestream_resources\ntimestreamTableArn,timestream_table_arn\ntimestreamTableName,timestream_table_name\ntimezone,timezone\ntip,tip\ntitle,title\ntitles,titles\ntleData,tle_data\ntleLine1,tle_line1\ntleLine2,tle_line2\ntls,tls\ntlsCertificateSummaries,tls_certificate_summaries\ntlsCertificates,tls_certificates\ntlsConfig,tls_config\ntlsContext,tls_context\ntlsPolicies,tls_policies\ntlsPolicyName,tls_policy_name\ntmpfs,tmpfs\nto,to\ntoBlockchainInstant,to_blockchain_instant\ntoDate,to_date\ntoDateTime,to_date_time\ntoPermissionArn,to_permission_arn\ntoPermissionVersion,to_permission_version\ntoPort,to_port\ntoken,token\ntokenBalances,token_balances\ntokenEndpoint,token_endpoint\ntokenExpirationTime,token_expiration_time\ntokenFilter,token_filter\ntokenId,token_id\ntokenIdentifier,token_identifier\ntokenKeyName,token_key_name\ntokenName,token_name\ntokenNameList,token_name_list\ntokenSignature,token_signature\ntokenSigningPublicKeys,token_signing_public_keys\ntokenType,token_type\ntokenUrl,token_url\ntokenUrlCustomProperties,token_url_custom_properties\ntokenUrls,token_urls\ntokenValue,token_value\ntoleratedFailureCount,tolerated_failure_count\ntoleratedFailurePercentage,tolerated_failure_percentage\ntooNewLogEventStartIndex,too_new_log_event_start_index\ntooOldLogEventEndIndex,too_old_log_event_end_index\ntoolName,tool_name\ntoolchain,toolchain\ntools,tools\ntopMatches,top_matches\ntopPanel,top_panel\ntopic,topic\ntopicArn,topic_arn\ntopicIntegrationArn,topic_integration_arn\ntopicPattern,topic_pattern\ntopicPolicy,topic_policy\ntopicRuleDestination,topic_rule_destination\ntopicRulePayload,topic_rule_payload\ntopologyFilter,topology_filter\ntotal,total\ntotalActuators,total_actuators\ntotalAgentlessCollectors,total_agentless_collectors\ntotalAgents,total_agents\ntotalApplications,total_applications\ntotalAssessmentControlsCount,total_assessment_controls_count\ntotalAttributes,total_attributes\ntotalBackupSizeInMegaBytes,total_backup_size_in_mega_bytes\ntotalBaseCount,total_base_count\ntotalBranches,total_branches\ntotalBytesClassified,total_bytes_classified\ntotalChecks,total_checks\ntotalConnectors,total_connectors\ntotalControlsCount,total_controls_count\ntotalCount,total_count\ntotalCounts,total_counts\ntotalDataInMegaBytes,total_data_in_mega_bytes\ntotalDetections,total_detections\ntotalDetectionsSuppressed,total_detections_suppressed\ntotalDiscoveredResources,total_discovered_resources\ntotalDurationInMillis,total_duration_in_millis\ntotalEdgePropertyValues,total_edge_property_values\ntotalEvidence,total_evidence\ntotalExecutionDurationSeconds,total_execution_duration_seconds\ntotalFailureCount,total_failure_count\ntotalFindingsCount,total_findings_count\ntotalItemsClassified,total_items_classified\ntotalItemsSensitive,total_items_sensitive\ntotalItemsSkipped,total_items_skipped\ntotalItemsSkippedInvalidEncryption,total_items_skipped_invalid_encryption\ntotalItemsSkippedInvalidKms,total_items_skipped_invalid_kms\ntotalItemsSkippedPermissionDenied,total_items_skipped_permission_denied\ntotalJobs,total_jobs\ntotalMeCollectors,total_me_collectors\ntotalNoOfSrv,total_no_of_srv\ntotalNodePropertyValues,total_node_property_values\ntotalNodes,total_nodes\ntotalNumberOfFindings,total_number_of_findings\ntotalNumberOfJobs,total_number_of_jobs\ntotalParts,total_parts\ntotalReadCount,total_read_count\ntotalRecords,total_records\ntotalRecordsCount,total_records_count\ntotalRecordsProcessed,total_records_processed\ntotalReservedMinuteAllocation,total_reserved_minute_allocation\ntotalResourceUtilization,total_resource_utilization\ntotalResources,total_resources\ntotalResourcesCount,total_resources_count\ntotalResultCount,total_result_count\ntotalResults,total_results\ntotalScheduledMinutes,total_scheduled_minutes\ntotalSensors,total_sensors\ntotalServerGroups,total_server_groups\ntotalServers,total_servers\ntotalSizeInBytes,total_size_in_bytes\ntotalSizeInMegaBytes,total_size_in_mega_bytes\ntotalSourceServers,total_source_servers\ntotalStepCount,total_step_count\ntotalSteps,total_steps\ntotalStepsFailed,total_steps_failed\ntotalStepsSkipped,total_steps_skipped\ntotalStepsSucceeded,total_steps_succeeded\ntotalStorageBytes,total_storage_bytes\ntotals,totals\ntpr,tpr\ntraceHeader,trace_header\ntracingConfiguration,tracing_configuration\ntracingEnabled,tracing_enabled\ntrackerName,tracker_name\ntrackingConfigArn,tracking_config_arn\ntrackingId,tracking_id\ntrackingInformation,tracking_information\ntrackingNamespaceName,tracking_namespace_name\ntrackingNamespaceVersion,tracking_namespace_version\ntrackingNumber,tracking_number\ntrafficGroupArn,traffic_group_arn\ntrafficRoutingConfig,traffic_routing_config\ntrafficWeight,traffic_weight\ntrailList,trail_list\ntrailNameList,trail_name_list\ntrailProperties,trail_properties\ntrails,trails\ntrainModelS3Location,train_model_s3_location\ntrainingDataCollectionStartDate,training_data_collection_start_date\ntrainingDataConfig,training_data_config\ntrainingDataSchema,training_data_schema\ntrainingDataSource,training_data_source\ntrainingEntryPointScript,training_entry_point_script\ntrainingHours,training_hours\ntrainingInputMode,training_input_mode\ntrainingInstanceType,training_instance_type\ntrainingInstanceVolumeSizeInGB,training_instance_volume_size_in_gb\ntrainingJobName,training_job_name\ntrainingLoss,training_loss\ntrainingMetrics,training_metrics\ntrainingMetricsV2,training_metrics_v2\ntrainingMode,training_mode\ntrainingResult,training_result\ntrainingResultV2,training_result_v2\ntrainingTimeOutInSeconds,training_time_out_in_seconds\ntrait,trait\ntraits,traits\ntranformationToolInstallationLink,tranformation_tool_installation_link\ntransaction,transaction\ntransactionFee,transaction_fee\ntransactionHash,transaction_hash\ntransactionId,transaction_id\ntransactionIndex,transaction_index\ntransactionStatus,transaction_status\ntransactionTimestamp,transaction_timestamp\ntransactions,transactions\ntranscript,transcript\ntranscriptFilter,transcript_filter\ntranscriptFormat,transcript_format\ntranscriptSourceSetting,transcript_source_setting\ntransferData,transfer_data\ntransferDate,transfer_date\ntransferMessage,transfer_message\ntransferPerMonthInGb,transfer_per_month_in_gb\ntransferredCertificateArn,transferred_certificate_arn\ntransferredTo,transferred_to\ntransform,transform\ntransformEntryPointScript,transform_entry_point_script\ntransformationTool,transformation_tool\ntransitEncryption,transit_encryption\ntransitEncryptionEnabled,transit_encryption_enabled\ntransitEncryptionPort,transit_encryption_port\ntransitGatewayConfiguration,transit_gateway_configuration\ntransitGatewayID,transit_gateway_id\ntransitionEvents,transition_events\ntransitionType,transition_type\ntransitions,transitions\ntransmitDisabled,transmit_disabled\ntransportProtocol,transport_protocol\ntraversalDirection,traversal_direction\ntraversalType,traversal_type\ntreatMissingData,treat_missing_data\ntreatmentName,treatment_name\ntreatmentNames,treatment_names\ntreatmentWeights,treatment_weights\ntreatments,treatments\ntreeId,tree_id\ntrendField,trend_field\ntrialMinutes,trial_minutes\ntrigger,trigger\ntriggerArn,trigger_arn\ntriggerConfig,trigger_config\ntriggerConfigurations,trigger_configurations\ntriggerDetail,trigger_detail\ntriggerDetails,trigger_details\ntriggerEvents,trigger_events\ntriggerMode,trigger_mode\ntriggerName,trigger_name\ntriggerProperties,trigger_properties\ntriggerTargetArn,trigger_target_arn\ntriggerType,trigger_type\ntriggers,triggers\ntroubleshootingText,troubleshooting_text\ntruncated,truncated\ntruncatedEvents,truncated_events\ntrust,trust\ntrustAnchor,trust_anchor\ntrustAnchorArn,trust_anchor_arn\ntrustAnchorId,trust_anchor_id\ntrustAnchors,trust_anchors\ntrustPolicy,trust_policy\ntrustStore,trust_store\ntrustStoreArn,trust_store_arn\ntrustStores,trust_stores\ntruststoreUri,truststore_uri\ntruststoreVersion,truststore_version\ntruststoreWarnings,truststore_warnings\nttl,ttl\nttps,ttps\ntumbling,tumbling\ntunedHPOParams,tuned_hpo_params\ntunnel,tunnel\ntunnelArn,tunnel_arn\ntunnelId,tunnel_id\ntunnelSummaries,tunnel_summaries\nturnNumber,turn_number\nturnResult,turn_result\nturnSpecification,turn_specification\nturnsToLive,turns_to_live\ntype,type\ntypeFilter,type_filter\ntypeHint,type_hint\ntypeInfo,type_info\ntypeInfos,type_infos\ntypeName,type_name\ntypes,types\ntypesFilePath,types_file_path\nudid,udid\nuid,uid\nulimits,ulimits\nunauthorizedCacheControlHeaderStrategy,unauthorized_cache_control_header_strategy\nuncertaintyRange,uncertainty_range\nunclassifiableObjectCount,unclassifiable_object_count\nunclassifiableObjectSizeInBytes,unclassifiable_object_size_in_bytes\nundoDeprecate,undo_deprecate\nunencrypted,unencrypted\nunfinished,unfinished\nunhealthyAgentlessCollectors,unhealthy_agentless_collectors\nunhealthyAgents,unhealthy_agents\nunhealthyConnectors,unhealthy_connectors\nunhealthyMeCollectors,unhealthy_me_collectors\nunhealthyThreshold,unhealthy_threshold\nunhealthyThresholdCount,unhealthy_threshold_count\nunicode,unicode\nuninstallAfterBuild,uninstall_after_build\nuniqueId,unique_id\nuniqueProblems,unique_problems\nunit,unit\nunitLabel,unit_label\nunitOfMeasure,unit_of_measure\nunits,units\nunknown,unknown\nunknownAgentlessCollectors,unknown_agentless_collectors\nunknownAgents,unknown_agents\nunknownConnectors,unknown_connectors\nunknownMeCollectors,unknown_me_collectors\nunlabeledEventsTreatment,unlabeled_events_treatment\nunlimited,unlimited\nunmanagedvCpus,unmanagedv_cpus\nunmask,unmask\nunmetered,unmetered\nunmeteredDevices,unmetered_devices\nunmeteredRemoteAccessDevices,unmetered_remote_access_devices\nunprocessedAccounts,unprocessed_accounts\nunprocessedEndTimes,unprocessed_end_times\nunprocessedJobs,unprocessed_jobs\nunprocessedResourceKeys,unprocessed_resource_keys\nunprocessedWorlds,unprocessed_worlds\nunsetDefaultVersion,unset_default_version\nunsuccessful,unsuccessful\nunsupportedResourceStatus,unsupported_resource_status\nunsupportedResources,unsupported_resources\nunvalidatedJSON,unvalidated_json\nupToDate,up_to_date\nupcomingMinutesScheduled,upcoming_minutes_scheduled\nupdatableAttributes,updatable_attributes\nupdate,update\nupdateCACertificateParams,update_ca_certificate_params\nupdateCollectionDetail,update_collection_detail\nupdateConfig,update_config\nupdateConfiguration,update_configuration\nupdateDate,update_date\nupdateDateTime,update_date_time\nupdateDeviceCertificateParams,update_device_certificate_params\nupdateId,update_id\nupdateIds,update_ids\nupdateImageSetMetadataUpdates,update_image_set_metadata_updates\nupdateInstructionBatch,update_instruction_batch\nupdateMode,update_mode\nupdateOutdatedInstancesOnly,update_outdated_instances_only\nupdatePolicy,update_policy\nupdateReason,update_reason\nupdateResponse,update_response\nupdateResults,update_results\nupdateSingleCardinalityProperties,update_single_cardinality_properties\nupdateStatus,update_status\nupdateStatusReason,update_status_reason\nupdateTime,update_time\nupdateTimestamp,update_timestamp\nupdateToLatestImageVersion,update_to_latest_image_version\nupdateType,update_type\nupdated,updated\nupdatedAt,updated_at\nupdatedBy,updated_by\nupdatedByChangesetId,updated_by_changeset_id\nupdatedComponent,updated_component\nupdatedDate,updated_date\nupdatedForm,updated_form\nupdatedTheme,updated_theme\nupdatedTime,updated_time\nupdatesChangesetId,updates_changeset_id\nupfrontPaymentAmount,upfront_payment_amount\nuplinkBandwidthBits,uplink_bandwidth_bits\nuplinkDelayMs,uplink_delay_ms\nuplinkJitterMs,uplink_jitter_ms\nuplinkLossPercent,uplink_loss_percent\nupload,upload\nuploadAllowed,upload_allowed\nuploadBehavior,upload_behavior\nuploadConfigurations,upload_configurations\nuploadId,upload_id\nuploadSequenceToken,upload_sequence_token\nuploadStatus,upload_status\nuploadUrl,upload_url\nuploads,uploads\nupperBoundValue,upper_bound_value\nupperBoundValues,upper_bound_values\nupperInclusive,upper_inclusive\nupsertAction,upsert_action\nupstream,upstream\nupstreamRegistryUrl,upstream_registry_url\nupstreams,upstreams\nuri,uri\nuris,uris\nurl,url\nurlExpiry,url_expiry\nurls,urls\nusage,usage\nusageCost,usage_cost\nusageLimit,usage_limit\nusageLimitArn,usage_limit_arn\nusageLimitId,usage_limit_id\nusageLimits,usage_limits\nusagePlanId,usage_plan_id\nusageState,usage_state\nusageText,usage_text\nusageTotals,usage_totals\nusageType,usage_type\nusageTypes,usage_types\nuseBase64,use_base64\nuseCallerCredentials,use_caller_credentials\nuseDedicatedReplicationServer,use_dedicated_replication_server\nuseDefaultApplications,use_default_applications\nuseDefaultTools,use_default_tools\nuseDefaultUploadConfigurations,use_default_upload_configurations\nuseEventVariables,use_event_variables\nuseExtendedIds,use_extended_ids\nuseFipsEndpoint,use_fips_endpoint\nuseLatestRestorableAutoSnapshot,use_latest_restorable_auto_snapshot\nuseLatestRestorableTime,use_latest_restorable_time\nuseOnly,use_only\nusePrefixAttributeValue,use_prefix_attribute_value\nusePrivateIP,use_private_ip\nusePrivateLinkForMetadataAndAuthorization,use_private_link_for_metadata_and_authorization\nuseStageCache,use_stage_cache\nused,used\nuser,user\nuserAccessLoggingSettings,user_access_logging_settings\nuserAccessLoggingSettingsArn,user_access_logging_settings_arn\nuserAccessResultsList,user_access_results_list\nuserAccessTasksList,user_access_tasks_list\nuserAgent,user_agent\nuserArn,user_arn\nuserAttribute,user_attribute\nuserAttributes,user_attributes\nuserAttributesForFindings,user_attributes_for_findings\nuserCode,user_code\nuserData,user_data\nuserDataOverride,user_data_override\nuserDataValidationParameters,user_data_validation_parameters\nuserFeedback,user_feedback\nuserFirstName,user_first_name\nuserFullName,user_full_name\nuserGroups,user_groups\nuserId,user_id\nuserIdentity,user_identity\nuserIds,user_ids\nuserInitializationScripts,user_initialization_scripts\nuserLastName,user_last_name\nuserLoginName,user_login_name\nuserName,user_name\nuserPausedDetails,user_paused_details\nuserPoolArn,user_pool_arn\nuserPoolConfig,user_pool_config\nuserPoolId,user_pool_id\nuserProfiles,user_profiles\nuserProperties,user_properties\nuserProvidedEdgeIds,user_provided_edge_ids\nuserProvidedID,user_provided_id\nuserRole,user_role\nuserRoleArn,user_role_arn\nuserRules,user_rules\nuserSettings,user_settings\nuserSettingsArn,user_settings_arn\nuserStatus,user_status\nuserTurn,user_turn\nuserType,user_type\nusername,username\nusernameClaim,username_claim\nusernamePrefix,username_prefix\nusers,users\nutilizationMetrics,utilization_metrics\nutterance,utterance\nutteranceFirstRecordedInAggregationDuration,utterance_first_recorded_in_aggregation_duration\nutteranceInput,utterance_input\nutteranceLastRecordedInAggregationDuration,utterance_last_recorded_in_aggregation_duration\nutteranceLevelTestResults,utterance_level_test_results\nutteranceRequestId,utterance_request_id\nutteranceString,utterance_string\nutteranceTimestamp,utterance_timestamp\nutteranceUnderstood,utterance_understood\nutterances,utterances\nuuid,uuid\nv1,v1\nv1BotLocale,v1_bot_locale\nv1BotName,v1_bot_name\nv1BotNameContains,v1_bot_name_contains\nv1BotVersion,v1_bot_version\nv2BotId,v2_bot_id\nv2BotName,v2_bot_name\nv2BotRole,v2_bot_role\nvCPUHour,v_cpu_hour\nvalid,valid\nvalidTimeRange,valid_time_range\nvalidZones,valid_zones\nvalidatePolicyResourceType,validate_policy_resource_type\nvalidateRequestBody,validate_request_body\nvalidateRequestParameters,validate_request_parameters\nvalidatedDependencyRevisions,validated_dependency_revisions\nvalidatedNamespaceVersion,validated_namespace_version\nvalidation,validation\nvalidationCertificateArn,validation_certificate_arn\nvalidationDataConfig,validation_data_config\nvalidationErrors,validation_errors\nvalidationId,validation_id\nvalidationLoss,validation_loss\nvalidationMessage,validation_message\nvalidationMetrics,validation_metrics\nvalidationOutputList,validation_output_list\nvalidationResults,validation_results\nvalidationSettings,validation_settings\nvalidationStatus,validation_status\nvalidationWarnings,validation_warnings\nvalidations,validations\nvalidators,validators\nvalidity,validity\nvalue,value\nvalueElicitationPrompt,value_elicitation_prompt\nvalueElicitationPromptSpecification,value_elicitation_prompt_specification\nvalueElicitationSetting,value_elicitation_setting\nvalueFrom,value_from\nvalueKey,value_key\nvalueMappings,value_mappings\nvalueRegexPattern,value_regex_pattern\nvalueSelectionSetting,value_selection_setting\nvalueSelectionStrategy,value_selection_strategy\nvalueSet,value_set\nvalueString,value_string\nvalueType,value_type\nvalues,values\nvariableEntries,variable_entries\nvariableImpactExplanations,variable_impact_explanations\nvariableImportance,variable_importance\nvariableImportanceMetrics,variable_importance_metrics\nvariableName,variable_name\nvariableNames,variable_names\nvariableType,variable_type\nvariables,variables\nvariance,variance\nvariantImportJobs,variant_import_jobs\nvariantStores,variant_stores\nvariantValues,variant_values\nvariants,variants\nvariation,variation\nvariations,variations\nvaultName,vault_name\nvaultNotificationConfig,vault_notification_config\nvcenterBasedRemoteInfoList,vcenter_based_remote_info_list\nvcenterClientID,vcenter_client_id\nvcenterConfigurationTimeStamp,vcenter_configuration_time_stamp\nvcenterUUID,vcenter_uuid\nvcpus,vcpus\nvehicleName,vehicle_name\nvehicleSummaries,vehicle_summaries\nvehicles,vehicles\nvendor,vendor\nvendorAdditionalFixedProperties,vendor_additional_fixed_properties\nvendorAdditionalTransientProperties,vendor_additional_transient_properties\nvendorCreatedAt,vendor_created_at\nvendorGuidance,vendor_guidance\nvendorGuidanceMessage,vendor_guidance_message\nvendorProperties,vendor_properties\nvendorSeverity,vendor_severity\nvendorUpdatedAt,vendor_updated_at\nvendorWorkerId,vendor_worker_id\nvendorWorkerIpAddress,vendor_worker_ip_address\nverificationCertificate,verification_certificate\nverificationState,verification_state\nverificationStateDescription,verification_state_description\nverificationUri,verification_uri\nverificationUriComplete,verification_uri_complete\nverified,verified\nversion,version\nversionArn,version_arn\nversionCode,version_code\nversionControl,version_control\nversionControlConfigurationTimeStamp,version_control_configuration_time_stamp\nversionControlInfoList,version_control_info_list\nversionControlType,version_control_type\nversionDescription,version_description\nversionId,version_id\nversionInfo,version_info\nversionName,version_name\nversionNumber,version_number\nversionOptions,version_options\nversionOrAlias,version_or_alias\nversionQualifier,version_qualifier\nversionRequirement,version_requirement\nversionRequirements,version_requirements\nversionRevision,version_revision\nversionRevisions,version_revisions\nversionSizeBytes,version_size_bytes\nversionStatus,version_status\nversionUpdateByJobsConfig,version_update_by_jobs_config\nversioned,versioned\nversioning,versioning\nversioningConfiguration,versioning_configuration\nversions,versions\nverticalGap,vertical_gap\nveryLow,very_low\nvideo,video\nvideoCapture,video_capture\nvideoEndpoint,video_endpoint\nvideoHeight,video_height\nvideoWidth,video_width\nviewerCount,viewer_count\nviewerId,viewer_id\nviewerSessionVersionsLessThanOrEqualTo,viewer_session_versions_less_than_or_equal_to\nviewerSessions,viewer_sessions\nviolationEventAdditionalInfo,violation_event_additional_info\nviolationEventOccurrenceRange,violation_event_occurrence_range\nviolationEventTime,violation_event_time\nviolationEventType,violation_event_type\nviolationEvents,violation_events\nviolationId,violation_id\nviolationIds,violation_ids\nviolationStartTime,violation_start_time\nvirtualCluster,virtual_cluster\nvirtualClusterId,virtual_cluster_id\nvirtualClusterIdentifier,virtual_cluster_identifier\nvirtualClusters,virtual_clusters\nvirtualGateway,virtual_gateway\nvirtualGatewayId,virtual_gateway_id\nvirtualGatewayName,virtual_gateway_name\nvirtualGatewayOwnerAccount,virtual_gateway_owner_account\nvirtualGatewayRegion,virtual_gateway_region\nvirtualGatewayState,virtual_gateway_state\nvirtualGateways,virtual_gateways\nvirtualInterface,virtual_interface\nvirtualInterfaceId,virtual_interface_id\nvirtualInterfaceName,virtual_interface_name\nvirtualInterfaceOwnerAccount,virtual_interface_owner_account\nvirtualInterfaceRegion,virtual_interface_region\nvirtualInterfaceState,virtual_interface_state\nvirtualInterfaceTest,virtual_interface_test\nvirtualInterfaceTestHistory,virtual_interface_test_history\nvirtualInterfaceType,virtual_interface_type\nvirtualInterfaces,virtual_interfaces\nvirtualName,virtual_name\nvirtualNode,virtual_node\nvirtualNodeName,virtual_node_name\nvirtualNodes,virtual_nodes\nvirtualRouter,virtual_router\nvirtualRouterName,virtual_router_name\nvirtualRouters,virtual_routers\nvirtualService,virtual_service\nvirtualServiceName,virtual_service_name\nvirtualServices,virtual_services\nvisibility,visibility\nvlan,vlan\nvmId,vm_id\nvmImportTaskId,vm_import_task_id\nvmManagerId,vm_manager_id\nvmManagerName,vm_manager_name\nvmManagerType,vm_manager_type\nvmName,vm_name\nvmPath,vm_path\nvmServer,vm_server\nvmServerAddress,vm_server_address\nvmServerAddressList,vm_server_address_list\nvmWareUuid,vm_ware_uuid\nvnfConfigurableProperties,vnf_configurable_properties\nvnfInstanceId,vnf_instance_id\nvnfPkgId,vnf_pkg_id\nvnfPkgIds,vnf_pkg_ids\nvnfPkgName,vnf_pkg_name\nvnfProductName,vnf_product_name\nvnfProvider,vnf_provider\nvnfState,vnf_state\nvnfcResourceInfo,vnfc_resource_info\nvnfd,vnfd\nvnfdId,vnfd_id\nvnfdVersion,vnfd_version\nvoiceId,voice_id\nvoiceSettings,voice_settings\nvolumeArn,volume_arn\nvolumeArns,volume_arns\nvolumeBaselineIOPS,volume_baseline_iops\nvolumeBaselineThroughput,volume_baseline_throughput\nvolumeBurstIOPS,volume_burst_iops\nvolumeBurstThroughput,volume_burst_throughput\nvolumeConfiguration,volume_configuration\nvolumeEncryptionKMSKey,volume_encryption_kms_key\nvolumeId,volume_id\nvolumeMounts,volume_mounts\nvolumeRecommendationOptions,volume_recommendation_options\nvolumeRecommendations,volume_recommendations\nvolumeRetentionMode,volume_retention_mode\nvolumeSize,volume_size\nvolumeSizeInGB,volume_size_in_gb\nvolumeSizeInGb,volume_size_in_gb\nvolumeToConversionMap,volume_to_conversion_map\nvolumeToVolumeSize,volume_to_volume_size\nvolumeType,volume_type\nvolumes,volumes\nvolumesFrom,volumes_from\nvoutIndex,vout_index\nvpc,vpc\nvpcConfig,vpc_config\nvpcConfiguration,vpc_configuration\nvpcDestinationSummary,vpc_destination_summary\nvpcEndpoint,vpc_endpoint\nvpcEndpointDetails,vpc_endpoint_details\nvpcEndpointErrorDetails,vpc_endpoint_error_details\nvpcEndpointFilters,vpc_endpoint_filters\nvpcEndpointId,vpc_endpoint_id\nvpcEndpointIds,vpc_endpoint_ids\nvpcEndpointSummaries,vpc_endpoint_summaries\nvpcEndpoints,vpc_endpoints\nvpcID,vpc_id\nvpcId,vpc_id\nvpcIdentifier,vpc_identifier\nvpcLinkId,vpc_link_id\nvpcProperties,vpc_properties\nvpcSecurityGroupId,vpc_security_group_id\nvpcSecurityGroupIds,vpc_security_group_ids\nvpcSecurityGroups,vpc_security_groups\nvpceConfiguration,vpce_configuration\nvpceConfigurationArns,vpce_configuration_arns\nvpceConfigurationDescription,vpce_configuration_description\nvpceConfigurationName,vpce_configuration_name\nvpceConfigurations,vpce_configurations\nvpceIds,vpce_ids\nvpceServiceName,vpce_service_name\nvss,vss\nvulnerabilities,vulnerabilities\nvulnerability,vulnerability\nvulnerabilityId,vulnerability_id\nvulnerabilityIdAggregation,vulnerability_id_aggregation\nvulnerabilityIds,vulnerability_ids\nvulnerabilitySource,vulnerability_source\nvulnerabilitySourceUpdatedAt,vulnerability_source_updated_at\nvulnerablePackages,vulnerable_packages\nwafWebAclArn,waf_web_acl_arn\nwaitAndContinueSpecification,wait_and_continue_specification\nwaitTimeInMinutes,wait_time_in_minutes\nwaitTimeSeconds,wait_time_seconds\nwaited,waited\nwaitingForDataCollectionChecks,waiting_for_data_collection_checks\nwaitingResponse,waiting_response\nwarehouse,warehouse\nwarned,warned\nwarnings,warnings\nwaveAggregatedStatus,wave_aggregated_status\nwaveID,wave_id\nwaveIDs,wave_ids\nwaves,waves\nwavesCount,waves_count\nwebAclArn,web_acl_arn\nwebUrl,web_url\nwebhook,webhook\nwebhookArn,webhook_arn\nwebhookId,webhook_id\nwebhookName,webhook_name\nwebhookUrl,webhook_url\nwebhooks,webhooks\nweeklySchedule,weekly_schedule\nweight,weight\nweightFactor,weight_factor\nweightedTargets,weighted_targets\nweights,weights\nwelcomeMessages,welcome_messages\nwidth,width\nwifi,wifi\nwindow,window\nwindows,windows\nwindowsMountDrive,windows_mount_drive\nwindowsUser,windows_user\nwitnessedAt,witnessed_at\nworkIds,work_ids\nworkbookCursor,workbook_cursor\nworkbookId,workbook_id\nworkerConfiguration,worker_configuration\nworkerConfigurationArn,worker_configuration_arn\nworkerConfigurations,worker_configurations\nworkerCount,worker_count\nworkerFleets,worker_fleets\nworkerGroup,worker_group\nworkerLogDelivery,worker_log_delivery\nworkerName,worker_name\nworkerTypeSpecifications,worker_type_specifications\nworkers,workers\nworkflowArn,workflow_arn\nworkflowBucket,workflow_bucket\nworkflowBuildVersionArn,workflow_build_version_arn\nworkflowExecution,workflow_execution\nworkflowExecutionCancelRequestedEventAttributes,workflow_execution_cancel_requested_event_attributes\nworkflowExecutionCanceledEventAttributes,workflow_execution_canceled_event_attributes\nworkflowExecutionCompletedEventAttributes,workflow_execution_completed_event_attributes\nworkflowExecutionContinuedAsNewEventAttributes,workflow_execution_continued_as_new_event_attributes\nworkflowExecutionFailedEventAttributes,workflow_execution_failed_event_attributes\nworkflowExecutionId,workflow_execution_id\nworkflowExecutionRetentionPeriodInDays,workflow_execution_retention_period_in_days\nworkflowExecutionSignaledEventAttributes,workflow_execution_signaled_event_attributes\nworkflowExecutionStartedEventAttributes,workflow_execution_started_event_attributes\nworkflowExecutionTerminatedEventAttributes,workflow_execution_terminated_event_attributes\nworkflowExecutionTimedOutEventAttributes,workflow_execution_timed_out_event_attributes\nworkflowExecutions,workflow_executions\nworkflowId,workflow_id\nworkflowInputs,workflow_inputs\nworkflowName,workflow_name\nworkflowStepAutomationConfiguration,workflow_step_automation_configuration\nworkflowStepGroupsSummary,workflow_step_groups_summary\nworkflowStepsSummary,workflow_steps_summary\nworkflowSummaries,workflow_summaries\nworkflowType,workflow_type\nworkflowTypeVersion,workflow_type_version\nworkgroup,workgroup\nworkgroupArn,workgroup_arn\nworkgroupId,workgroup_id\nworkgroupName,workgroup_name\nworkgroups,workgroups\nworkingDirectory,working_directory\nworkspace,workspace\nworkspaceDataSources,workspace_data_sources\nworkspaceDescription,workspace_description\nworkspaceId,workspace_id\nworkspaceName,workspace_name\nworkspaceNotificationDestinations,workspace_notification_destinations\nworkspaceOrganizationalUnits,workspace_organizational_units\nworkspaceRoleArn,workspace_role_arn\nworkspaceSummaries,workspace_summaries\nworkspaces,workspaces\nworld,world\nworldConfigs,world_configs\nworldCount,world_count\nworldDescriptionBody,world_description_body\nworldExportJobSummaries,world_export_job_summaries\nworldGenerationJobSummaries,world_generation_job_summaries\nworldSummaries,world_summaries\nworldTags,world_tags\nworlds,worlds\nwriteCapacityUnits,write_capacity_units\nwriteOperationType,write_operation_type\nx,x\nx509CertificateData,x509_certificate_data\nx509Subject,x509_subject\nxAmzErrorType,x_amz_error_type\nxmlNamespace,xml_namespace\nxrayEnabled,xray_enabled\nxsltTemplateName,xslt_template_name\nxsltTemplateNameForMacSec,xslt_template_name_for_mac_sec\ny,y\nyear,year\nz,z\nzipUploadUrl,zip_upload_url\nzonalShiftId,zonal_shift_id\nzonalShifts,zonal_shifts\nzoneName,zone_name\n"
  },
  {
    "path": "codegen-serde/build.gradle.kts",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport org.gradle.api.tasks.testing.logging.TestExceptionFormat\n\nplugins {\n    id(\"smithy-rs.kotlin-conventions\")\n    id(\"smithy-rs.publishing-conventions\")\n}\n\ndescription = \"Plugin to generate `serde` implementations. NOTE: This is separate from generalized serialization.\"\nextra[\"displayName\"] = \"Smithy :: Rust :: Codegen Serde\"\nextra[\"moduleName\"] = \"software.amazon.smithy.rust.codegen.client\"\n\ndependencies {\n    implementation(project(\":codegen-core\"))\n    implementation(project(\":codegen-client\"))\n    implementation(project(\":codegen-server\"))\n\n    testRuntimeOnly(project(\":rust-runtime\"))\n    testImplementation(libs.junit.jupiter)\n    testImplementation(libs.smithy.validation.model)\n    testImplementation(libs.smithy.aws.protocol.tests)\n    testImplementation(libs.kotest.assertions.core.jvm)\n}\n"
  },
  {
    "path": "codegen-serde/src/main/kotlin/software/amazon/smithy/rust/codegen/serde/SerdeDecorator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.serde\n\nimport software.amazon.smithy.model.neighbor.Walker\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.rust.codegen.client.smithy.ClientCodegenContext\nimport software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute\nimport software.amazon.smithy.rust.codegen.core.rustlang.Feature\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustModule\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenContext\nimport software.amazon.smithy.rust.codegen.core.smithy.RustCrate\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenContext\nimport software.amazon.smithy.rust.codegen.server.smithy.customize.ServerCodegenDecorator\n\nval SerdeFeature = Feature(\"serde\", false, listOf(\"dep:serde\"))\nval SerdeModule =\n    RustModule.public(\n        \"serde\",\n        additionalAttributes = listOf(Attribute.featureGate(SerdeFeature.name)),\n        documentationOverride = \"Implementations of `serde` for model types. NOTE: These implementations are NOT used for wire serialization as part of a Smithy protocol and WILL NOT match the wire format. They are provided for convenience only.\",\n    )\n\nclass ClientSerdeDecorator : ClientCodegenDecorator {\n    override val name: String = \"ClientSerdeDecorator\"\n    override val order: Byte = 0\n\n    override fun extras(\n        codegenContext: ClientCodegenContext,\n        rustCrate: RustCrate,\n    ) = extrasCommon(codegenContext, rustCrate)\n}\n\nclass ServerSerdeDecorator : ServerCodegenDecorator {\n    override val name: String = \"ServerSerdeDecorator\"\n    override val order: Byte = 0\n\n    override fun extras(\n        codegenContext: ServerCodegenContext,\n        rustCrate: RustCrate,\n    ) = extrasCommon(codegenContext, rustCrate)\n}\n\n// Just a common function to keep things DRY.\nprivate fun extrasCommon(\n    codegenContext: CodegenContext,\n    rustCrate: RustCrate,\n) {\n    val roots = serializationRoots(codegenContext)\n    if (roots.isNotEmpty()) {\n        rustCrate.mergeFeature(SerdeFeature)\n        val generator = SerializeImplGenerator(codegenContext)\n        rustCrate.withModule(SerdeModule) {\n            roots.forEach {\n                generator.generateRootSerializerForShape(it)(this)\n            }\n            addDependency(SupportStructures.serializeRedacted().toSymbol())\n            addDependency(SupportStructures.serializeUnredacted().toSymbol())\n        }\n    }\n}\n\n/**\n * All entry points for serialization in the service closure.\n */\nfun serializationRoots(ctx: CodegenContext): List<Shape> {\n    val serviceShape = ctx.serviceShape\n    val walker = Walker(ctx.model)\n    return walker.walkShapes(serviceShape).filter { it.hasTrait<SerdeTrait>() }\n}\n"
  },
  {
    "path": "codegen-serde/src/main/kotlin/software/amazon/smithy/rust/codegen/serde/SerializeImplGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.serde\n\nimport software.amazon.smithy.codegen.core.Symbol\nimport software.amazon.smithy.model.knowledge.TopDownIndex\nimport software.amazon.smithy.model.shapes.BlobShape\nimport software.amazon.smithy.model.shapes.BooleanShape\nimport software.amazon.smithy.model.shapes.CollectionShape\nimport software.amazon.smithy.model.shapes.DocumentShape\nimport software.amazon.smithy.model.shapes.DoubleShape\nimport software.amazon.smithy.model.shapes.FloatShape\nimport software.amazon.smithy.model.shapes.MapShape\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.NumberShape\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.ServiceShape\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.shapes.StringShape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.shapes.TimestampShape\nimport software.amazon.smithy.model.shapes.UnionShape\nimport software.amazon.smithy.model.traits.SensitiveTrait\nimport software.amazon.smithy.model.traits.SparseTrait\nimport software.amazon.smithy.model.traits.StreamingTrait\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustModule\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.join\nimport software.amazon.smithy.rust.codegen.core.rustlang.map\nimport software.amazon.smithy.rust.codegen.core.rustlang.plus\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.withBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenContext\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenTarget\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.SimpleShapes\nimport software.amazon.smithy.rust.codegen.core.smithy.contextName\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.UnionGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.renderUnknownVariant\nimport software.amazon.smithy.rust.codegen.core.smithy.isOptional\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.shapeFunctionName\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.shapeModuleName\nimport software.amazon.smithy.rust.codegen.core.smithy.rustType\nimport software.amazon.smithy.rust.codegen.core.smithy.symbolBuilder\nimport software.amazon.smithy.rust.codegen.core.util.PANIC\nimport software.amazon.smithy.rust.codegen.core.util.dq\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\nimport software.amazon.smithy.rust.codegen.core.util.isEventStream\nimport software.amazon.smithy.rust.codegen.core.util.isTargetUnit\nimport software.amazon.smithy.rust.codegen.core.util.letIf\nimport software.amazon.smithy.rust.codegen.core.util.toPascalCase\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerRustSettings\nimport software.amazon.smithy.rust.codegen.server.smithy.hasConstraintTrait\n\nclass SerializeImplGenerator(private val codegenContext: CodegenContext) {\n    private val model = codegenContext.model\n    private val topIndex = TopDownIndex.of(model)\n\n    fun generateRootSerializerForShape(shape: Shape): Writable = serializerFn(shape, null)\n\n    /**\n     * Generates a serializer for a given shape. Collection serializer require using a wrapper structure. To handle this,\n     * `applyTo` allows passing in a `Writable` referring to an input. This returns a writable that wraps the input if necessary,\n     * e.g.\n     *\n     * `&self.map_shape` => `SerializeSomeSpecificMap(&self.map_shape)`\n     *\n     * Even if no wrapping is required, the writable that is returned includes the required serializer as dependencies.\n     */\n    private fun serializerFn(\n        shape: Shape,\n        applyTo: Writable?,\n    ): Writable {\n        if (shape is ServiceShape) {\n            return topIndex.getContainedOperations(shape).map {\n                serializerFn(it, null)\n            }.join(\"\\n\")\n        } else if (shape is OperationShape) {\n            if (shape.isEventStream(model)) {\n                // Don't generate serializers for event streams\n                return writable { }\n            }\n            return writable {\n                serializerFn(model.expectShape(shape.inputShape), null)(this)\n                serializerFn(model.expectShape(shape.outputShape), null)(this)\n            }\n        }\n        val name = codegenContext.symbolProvider.shapeFunctionName(codegenContext.serviceShape, shape) + \"_serde\"\n        val deps =\n            when (shape) {\n                is StructureShape -> RuntimeType.forInlineFun(name, serdeSubmodule(shape), structSerdeImpl(shape))\n                is UnionShape -> RuntimeType.forInlineFun(name, serdeSubmodule(shape), serializeUnionImpl(shape))\n                is TimestampShape -> serializeDateTime(shape)\n                is BlobShape ->\n                    if (shape.hasTrait<StreamingTrait>()) {\n                        serializeByteStream(shape)\n                    } else {\n                        serializeBlob(shape)\n                    }\n\n                is NumberShape -> serializeNumber(shape)\n                is StringShape, is BooleanShape -> directSerde(shape)\n                is DocumentShape -> serializeDocument(shape)\n                else -> null\n            }\n\n        return writable {\n            val wrapper =\n                when {\n                    deps != null -> null\n                    shape is MapShape -> serializeMap(shape)\n                    shape is CollectionShape -> serializeList(shape)\n                    // Need to figure out the best default here.\n                    else -> PANIC(\"No serializer supported for $shape\")\n                }\n            if (wrapper != null && applyTo != null) {\n                rustTemplate(\n                    \"&#{wrapper}(#{applyTo}#{unwrapConstraints})\", \"wrapper\" to wrapper,\n                    \"applyTo\" to applyTo,\n                    \"unwrapConstraints\" to shape.unwrapConstraints(),\n                )\n            } else {\n                deps?.toSymbol().also { addDependency(it) }\n                applyTo?.invoke(this)\n                shape.unwrapConstraints()(this)\n            }\n        }\n    }\n\n    private fun serializeMap(shape: MapShape): RuntimeType =\n        serializeWithWrapper(shape) { value ->\n            val member = serializeMember(shape.value, \"v\")\n            val writeEntry =\n                writable {\n                    when (shape.hasTrait<SparseTrait>()) {\n                        true ->\n                            rust(\n                                \"\"\"\n                                match v {\n                                    Some(v) => map.serialize_entry(k.as_str(), &#T)?,\n                                    None => map.serialize_entry(k, &None::<usize>)?\n                                };\n                                \"\"\",\n                                member,\n                            )\n\n                        false -> rust(\"map.serialize_entry(k.as_str(), &#T)?;\", member)\n                    }\n                }\n            writable {\n                rustTemplate(\n                    \"\"\"\n                    use #{serde}::ser::SerializeMap;\n                    let mut map = serializer.serialize_map(Some(#{value}.len()))?;\n                    for (k, v) in #{value}.iter() {\n                        #{writeEntry}\n                    }\n                    map.end()\n                    \"\"\",\n                    *SupportStructures.codegenScope,\n                    \"value\" to value,\n                    \"writeEntry\" to writeEntry,\n                )\n            }\n        }\n\n    private fun serializeList(shape: CollectionShape): RuntimeType =\n        serializeWithWrapper(shape) { value ->\n            val member = serializeMember(shape.member, \"v\")\n            val serializeElement =\n                writable {\n                    when (shape.hasTrait<SparseTrait>()) {\n                        false -> rust(\"seq.serialize_element(&#T)?;\", member)\n                        true ->\n                            rust(\n                                \"match v { Some(v) => seq.serialize_element(&#T)?, None => seq.serialize_element(&None::<usize>)? };\",\n                                member,\n                            )\n                    }\n                }\n            writable {\n                rustTemplate(\n                    \"\"\"\n                    use #{serde}::ser::SerializeSeq;\n                    let mut seq = serializer.serialize_seq(Some(#{value}.len()))?;\n                    for v in #{value}.iter() {\n                        #{element}\n                    }\n                    seq.end()\n                    \"\"\",\n                    *SupportStructures.codegenScope,\n                    \"element\" to serializeElement,\n                    \"value\" to value,\n                )\n            }\n        }\n\n    private fun serdeSubmodule(shape: Shape) =\n        RustModule.pubCrate(\n            codegenContext.symbolProvider.shapeModuleName(codegenContext.serviceShape, shape),\n            parent = SerdeModule,\n        )\n\n    /**\n     * Serialize a type that already implements `Serialize` directly via `value.serialize(serializer)`\n     * For enums, it adds `as_str()` to convert it into a string directly.\n     */\n    private fun serializeNumber(shape: NumberShape): RuntimeType {\n        val numericType = SimpleShapes.getValue(shape::class)\n        return when (shape) {\n            is FloatShape, is DoubleShape -> serializeFloat(shape)\n            else ->\n                RuntimeType.forInlineFun(\n                    numericType.toString(),\n                    PrimitiveShapesModule,\n                ) {\n                    implSerializeConfigured(symbolBuilder(shape, numericType).build()) {\n                        rustTemplate(\"self.value.serialize(serializer)\")\n                    }\n                }\n        }\n    }\n\n    private fun serializeFloat(shape: NumberShape): RuntimeType {\n        val numericType = SimpleShapes.getValue(shape::class)\n        return RuntimeType.forInlineFun(\n            numericType.toString(),\n            PrimitiveShapesModule,\n        ) {\n            implSerializeConfigured(symbolBuilder(shape, numericType).build()) {\n                rustTemplate(\n                    \"\"\"\n                    if !self.settings.out_of_range_floats_as_strings {\n                        return self.value.serialize(serializer)\n                    }\n                    if self.value.is_nan() {\n                        serializer.serialize_str(\"NaN\")\n                    } else if *self.value == #{ty}::INFINITY {\n                        serializer.serialize_str(\"Infinity\")\n                    } else if *self.value == #{ty}::NEG_INFINITY {\n                        serializer.serialize_str(\"-Infinity\")\n                    } else {\n                        self.value.serialize(serializer)\n                    }\n                    \"\"\",\n                    \"ty\" to numericType,\n                )\n            }\n        }\n    }\n\n    /**\n     * Serialize a type that already implements `Serialize` directly via `value.serialize(serializer)`\n     * For enums, it adds `as_str()` to convert it into a string directly.\n     */\n    private fun directSerde(shape: Shape): RuntimeType {\n        return RuntimeType.forInlineFun(\n            codegenContext.symbolProvider.toSymbol(shape).rustType().toString(),\n            PrimitiveShapesModule,\n        ) {\n            implSerializeConfigured(codegenContext.symbolProvider.toSymbol(shape)) {\n                val baseValue =\n                    writable {\n                        rust(\"self.value\")\n                        shape.unwrapConstraints()(this)\n                        if (shape.isStringShape) {\n                            rust(\".as_str()\")\n                        }\n                    }\n                rustTemplate(\"#{base}.serialize(serializer)\", \"base\" to baseValue)\n            }\n        }\n    }\n\n    /**\n     * Serialize a shape by first generating a wrapper struct:\n     * ```rust\n     * struct WrapperType<'a>(&'a Type);\n     * ```\n     *\n     * Then implementing `Serialize` for `ConfigurableSerdeRef<'a WrapperType>`\n     *\n     * This exists to allow differing implementations for same-shaped-rust types. For example, consider\n     * the following Smithy model:\n     *\n     * ```smithy\n     * list SensitiveList {\n     *   member: SensitiveString\n     * }\n     *\n     * list StringList {\n     *   member: String\n     * }\n     * ```\n     *\n     * These both are `Vec<String>` but must be serialized differently.\n     */\n    private fun serializeWithWrapper(\n        shape: Shape,\n        body: (Writable) -> Writable,\n    ): RuntimeType {\n        val name =\n            \"Serializer\" +\n                codegenContext.symbolProvider.shapeFunctionName(codegenContext.serviceShape, shape)\n                    .toPascalCase()\n        // awkward hack to recover the symbol referring to the type\n        val module = serdeSubmodule(shape)\n        val type = module.toType().resolve(name).toSymbol()\n        val base =\n            writable { rust(\"self.value.0\") }.letIf(shape.hasConstraintTrait() && constraintTraitsEnabled()) {\n                it.plus { rust(\".0\") }\n            }\n        val serialization =\n            implSerializeConfiguredWrapper(type) {\n                body(base)(this)\n            }\n        val wrapperStruct =\n            RuntimeType.forInlineFun(name, module) {\n                rustTemplate(\n                    \"\"\"\n                    pub(crate) struct $name<'a>(pub(crate) &'a #{Shape});\n                    #{serializer}\n                    \"\"\",\n                    \"Shape\" to codegenContext.symbolProvider.toSymbol(shape),\n                    \"serializer\" to serialization,\n                )\n            }\n        return wrapperStruct\n    }\n\n    private fun constraintTraitsEnabled(): Boolean =\n        codegenContext.target == CodegenTarget.SERVER &&\n            (codegenContext.settings as ServerRustSettings).codegenConfig.publicConstrainedTypes\n\n    private fun Shape.unwrapConstraints(): Writable {\n        val shape = this\n        return writable {\n            if (constraintTraitsEnabled() && hasConstraintTrait()) {\n                if (isBlobShape || isTimestampShape || isDocumentShape || shape is NumberShape) {\n                    rust(\".0\")\n                }\n            }\n        }\n    }\n\n    /**\n     * Serialize the field of a structure, union, list or map.\n     *\n     * All actual serialization MUST go through this path as it handles applying the `Sensitive` wrapper.\n     */\n    private fun serializeMember(\n        shape: MemberShape,\n        memberRef: String,\n    ): Writable {\n        val target = codegenContext.model.expectShape(shape.target)\n        return writable {\n            serializerFn(target) {\n                rust(\"$memberRef\")\n            }.plus { rust(\".serialize_ref(self.settings)\") }(this)\n        }.letIf(target.hasTrait<SensitiveTrait>()) { memberSerialization ->\n            memberSerialization.map {\n                rustTemplate(\n                    \"&#{Sensitive}(#{it}).serialize_ref(self.settings)\",\n                    *SupportStructures.codegenScope,\n                    \"it\" to it,\n                )\n            }\n        }\n    }\n\n    private fun structSerdeImpl(shape: StructureShape): Writable {\n        return writable {\n            implSerializeConfigured(codegenContext.symbolProvider.toSymbol(shape)) {\n                rustTemplate(\n                    \"\"\"\n                    use #{serde}::ser::SerializeStruct;\n                    \"\"\",\n                    *SupportStructures.codegenScope,\n                )\n                Attribute.AllowUnusedMut.render(this)\n                rust(\n                    \"let mut s = serializer.serialize_struct(${\n                        shape.contextName(codegenContext.serviceShape).dq()\n                    }, ${shape.members().size})?;\",\n                )\n                if (!shape.members().isEmpty()) {\n                    rust(\"let inner = &self.value;\")\n                    for (member in shape.members()) {\n                        val serializedName = member.memberName.dq()\n                        val fieldName = codegenContext.symbolProvider.toMemberName(member)\n                        val field = safeName(\"member\")\n                        val fieldSerialization =\n                            writable {\n                                rustTemplate(\n                                    \"s.serialize_field($serializedName, &#{member})?;\",\n                                    \"member\" to serializeMember(member, field),\n                                )\n                            }\n                        if (codegenContext.symbolProvider.toSymbol(member).isOptional()) {\n                            rust(\"if let Some($field) = &inner.$fieldName { #T }\", fieldSerialization)\n                        } else {\n                            rust(\"let $field = &inner.$fieldName; #T\", fieldSerialization)\n                        }\n                    }\n                }\n                rust(\"s.end()\")\n            }\n        }\n    }\n\n    private fun serializeUnionImpl(shape: UnionShape): Writable {\n        val unionName = shape.contextName(codegenContext.serviceShape)\n        val symbolProvider = codegenContext.symbolProvider\n        val unionSymbol = symbolProvider.toSymbol(shape)\n\n        return writable {\n            implSerializeConfigured(unionSymbol) {\n                rustBlock(\"match self.value\") {\n                    shape.members().forEachIndexed { index, member ->\n                        val fieldName = member.memberName.dq()\n                        val variantName =\n                            if (member.isTargetUnit()) {\n                                symbolProvider.toMemberName(member)\n                            } else {\n                                \"${symbolProvider.toMemberName(member)}(inner)\"\n                            }\n                        withBlock(\"#T::$variantName => {\", \"},\", symbolProvider.toSymbol(shape)) {\n                            when (member.isTargetUnit()) {\n                                true -> rust(\"serializer.serialize_unit_variant(${unionName.dq()}, $index, $fieldName)\")\n                                false ->\n                                    rustTemplate(\n                                        \"serializer.serialize_newtype_variant(${unionName.dq()}, $index, $fieldName, &#{member})\",\n                                        \"member\" to serializeMember(member, \"inner\"),\n                                    )\n                            }\n                        }\n                    }\n                    if (codegenContext.target.renderUnknownVariant()) {\n                        rustTemplate(\n                            \"#{Union}::${UnionGenerator.UNKNOWN_VARIANT_NAME} => serializer.serialize_str(\\\"unknown variant!\\\")\",\n                            \"Union\" to unionSymbol,\n                        )\n                    }\n                }\n            }\n        }\n    }\n\n    private fun serializeDateTime(shape: TimestampShape): RuntimeType =\n        RuntimeType.forInlineFun(\"SerializeDateTime\", Companion.PrimitiveShapesModule) {\n            implSerializeConfigured(codegenContext.symbolProvider.toSymbol(shape)) {\n                rust(\"serializer.serialize_str(&self.value.to_string())\")\n            }\n        }\n\n    private fun serializeBlob(shape: BlobShape): RuntimeType =\n        RuntimeType.forInlineFun(\"SerializeBlob\", PrimitiveShapesModule) {\n            implSerializeConfigured(RuntimeType.blob(codegenContext.runtimeConfig).toSymbol()) {\n                rustTemplate(\n                    \"\"\"\n                    if serializer.is_human_readable() {\n                        serializer.serialize_str(&#{base64_encode}(self.value.as_ref()))\n                    } else {\n                        serializer.serialize_bytes(self.value.as_ref())\n                    }\n                    \"\"\",\n                    \"base64_encode\" to RuntimeType.base64Encode(codegenContext.runtimeConfig),\n                )\n            }\n        }\n\n    private fun serializeByteStream(shape: BlobShape): RuntimeType =\n        RuntimeType.forInlineFun(\"SerializeByteStream\", PrimitiveShapesModule) {\n            implSerializeConfigured(RuntimeType.byteStream(codegenContext.runtimeConfig).toSymbol()) {\n                // This doesn't work yet—there is no way to get data out of a ByteStream from a sync context\n                rustTemplate(\n                    \"\"\"\n                    let Some(bytes) = self.value.bytes() else {\n                        return serializer.serialize_str(\"streaming data\")\n                    };\n                    if serializer.is_human_readable() {\n                        serializer.serialize_str(&#{base64_encode}(bytes))\n                    } else {\n                        serializer.serialize_bytes(bytes)\n                    }\n                    \"\"\",\n                    \"base64_encode\" to RuntimeType.base64Encode(codegenContext.runtimeConfig),\n                )\n            }\n        }\n\n    private fun serializeDocument(shape: DocumentShape): RuntimeType =\n        RuntimeType.forInlineFun(\"SerializeDocument\", PrimitiveShapesModule) {\n            implSerializeConfigured(codegenContext.symbolProvider.toSymbol(shape)) {\n                rustTemplate(\n                    \"\"\"\n                    match self.value {\n                         #{Document}::String(v) => serializer.serialize_str(v),\n                         #{Document}::Object(v) => {\n                             use #{serde}::ser::SerializeMap;\n                             let mut map = serializer.serialize_map(Some(v.len()))?;\n                             for (k, v) in v {\n                                 map.serialize_entry(k, &v.serialize_ref(self.settings))?;\n                             }\n                             map.end()\n                         },\n                         #{Document}::Array(v) => {\n                             use #{serde}::ser::SerializeSeq;\n                             let mut seq = serializer.serialize_seq(Some(v.len()))?;\n                             for e in v {\n                                 seq.serialize_element(&e.serialize_ref(self.settings))?;\n                             }\n                             seq.end()\n                         },\n                         #{Document}::Number(#{Number}::Float(value)) => value.serialize(serializer),\n                         #{Document}::Number(#{Number}::PosInt(value)) => {\n                             value.serialize(serializer)\n                         },\n                         #{Document}::Number(#{Number}::NegInt(value)) => {\n                             value.serialize(serializer)\n                         },\n                         #{Document}::Bool(b) => b.serialize(serializer),\n                         #{Document}::Null => serializer.serialize_none(),\n                     }\n                    \"\"\",\n                    *SupportStructures.codegenScope,\n                    \"Document\" to RuntimeType.document(codegenContext.runtimeConfig),\n                    \"Number\" to RuntimeType.smithyTypes(codegenContext.runtimeConfig).resolve(\"Number\"),\n                )\n            }\n        }\n\n    private fun RustWriter.implSerializeConfigured(\n        shape: Symbol,\n        block: Writable,\n    ) {\n        rustTemplate(\n            \"\"\"\n            impl #{serde}::Serialize for #{ConfigurableSerdeRef}<'_, #{Shape}> {\n                fn serialize<S>(&self, serializer: S) -> #{Result}<S::Ok, S::Error>\n                where\n                    S: #{serde}::Serializer,\n                {\n                    ##[allow(unused_imports)]\n                    use #{SerializeConfigured};\n                    #{body}\n                }\n            }\n            \"\"\",\n            \"Shape\" to shape, \"body\" to block, *SupportStructures.codegenScope,\n            *RuntimeType.preludeScope,\n        )\n    }\n\n    private fun implSerializeConfiguredWrapper(\n        shape: Symbol,\n        block: Writable,\n    ): Writable {\n        return writable {\n            rustTemplate(\n                \"\"\"\n                impl #{serde}::Serialize for #{ConfigurableSerdeRef}<'_, #{Shape}<'_>> {\n                    fn serialize<S>(&self, serializer: S) -> #{Result}<S::Ok, S::Error>\n                    where\n                        S: #{serde}::Serializer,\n                    {\n                        ##[allow(unused_imports)]\n                        use #{SerializeConfigured};\n                        #{body}\n                    }\n                }\n                \"\"\",\n                \"Shape\" to shape, \"body\" to block, *SupportStructures.codegenScope,\n                *RuntimeType.preludeScope,\n            )\n        }\n    }\n\n    companion object {\n        private val PrimitiveShapesModule = RustModule.pubCrate(\"primitives\", parent = SerdeModule)\n    }\n}\n"
  },
  {
    "path": "codegen-serde/src/main/kotlin/software/amazon/smithy/rust/codegen/serde/SupportStructures.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.serde\n\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.DependencyScope\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\n\nobject SupportStructures {\n    private val supportModule = SerdeModule\n\n    private val serde =\n        CargoDependency.Serde.copy(\n            scope = DependencyScope.Compile,\n            optional = true,\n            // remove `derive`\n            features = setOf(),\n        ).toType()\n\n    val codegenScope =\n        arrayOf(\n            \"ConfigurableSerde\" to configurableSerde(),\n            \"SerializeConfigured\" to serializeConfigured(),\n            \"ConfigurableSerdeRef\" to configurableSerdeRef(),\n            \"SerializationSettings\" to serializationSettings(),\n            \"Sensitive\" to sensitive(),\n            \"serde\" to serde,\n            \"serialize_redacted\" to serializeRedacted(),\n            \"serialize_unredacted\" to serializeUnredacted(),\n        )\n\n    fun serializeRedacted(): RuntimeType =\n        RuntimeType.forInlineFun(\"serialize_redacted\", supportModule) {\n            rustTemplate(\n                \"\"\"\n                /// Serialize a value redacting sensitive fields\n                ///\n                /// This function is intended to be used by `serde(serialize_with = \"serialize_redacted\")`\n                pub fn serialize_redacted<T, S: #{serde}::Serializer>(value: &T, serializer: S) -> #{Result}<S::Ok, S::Error>\n                where\n                    T: #{SerializeConfigured},\n                {\n                    use #{serde}::Serialize;\n                    value\n                        .serialize_ref(&#{SerializationSettings}::redact_sensitive_fields())\n                        .serialize(serializer)\n                }\n                \"\"\",\n                \"serde\" to serde,\n                \"SerializeConfigured\" to serializeConfigured(),\n                \"SerializationSettings\" to serializationSettings(),\n                *RuntimeType.preludeScope,\n            )\n        }\n\n    fun serializeUnredacted(): RuntimeType =\n        RuntimeType.forInlineFun(\"serialize_unredacted\", supportModule) {\n            rustTemplate(\n                \"\"\"\n                /// Serialize a value without redacting sensitive fields\n                ///\n                /// This function is intended to be used by `serde(serialize_with = \"serialize_unredacted\")`\n                pub fn serialize_unredacted<T, S: #{serde}::Serializer>(value: &T, serializer: S) -> #{Result}<S::Ok, S::Error>\n                where\n                    T: #{SerializeConfigured},\n                {\n                    use #{serde}::Serialize;\n                    value\n                        .serialize_ref(&#{SerializationSettings}::leak_sensitive_fields())\n                        .serialize(serializer)\n                }\n                \"\"\",\n                \"serde\" to serde,\n                \"SerializeConfigured\" to serializeConfigured(),\n                \"SerializationSettings\" to serializationSettings(),\n                *RuntimeType.preludeScope,\n            )\n        }\n\n    private fun serializeConfigured(): RuntimeType =\n        RuntimeType.forInlineFun(\"SerializeConfigured\", supportModule) {\n            rustTemplate(\n                \"\"\"\n                /// Trait that allows configuring serialization\n                /// **This trait should not be implemented directly!** Instead, `impl Serialize for ConfigurableSerdeRef<T>`\n                pub trait SerializeConfigured {\n                    /// Return a `Serialize` implementation for this object that owns the object.\n                    ///\n                    /// Use this if you need to create `Arc<dyn Serialize>` or similar.\n                    fn serialize_owned(self, settings: #{SerializationSettings}) -> impl #{serde}::Serialize;\n\n                    /// Return a `Serialize` implementation for this object that borrows from the given object\n                    fn serialize_ref<'a>(&'a self, settings: &'a #{SerializationSettings}) -> impl #{serde}::Serialize + 'a;\n                }\n\n                /// Blanket implementation for all `T` that implement `ConfigurableSerdeRef`\n                impl<T> SerializeConfigured for T\n                where\n                    for<'a> #{ConfigurableSerdeRef}<'a, T>: #{serde}::Serialize,\n                {\n                    fn serialize_owned(\n                        self,\n                        settings: #{SerializationSettings},\n                    ) -> impl #{serde}::Serialize {\n                        #{ConfigurableSerde} {\n                            value: self,\n                            settings,\n                        }\n                    }\n\n                    fn serialize_ref<'a>(\n                        &'a self,\n                        settings: &'a #{SerializationSettings},\n                    ) -> impl #{serde}::Serialize + 'a {\n                        #{ConfigurableSerdeRef} { value: self, settings }\n                    }\n                }\n                \"\"\",\n                \"ConfigurableSerde\" to configurableSerde(),\n                \"ConfigurableSerdeRef\" to configurableSerdeRef(),\n                \"SerializationSettings\" to serializationSettings(),\n                \"serde\" to serde,\n            )\n        }\n\n    private fun sensitive() =\n        RuntimeType.forInlineFun(\"Sensitive\", supportModule) {\n            rustTemplate(\n                \"\"\"\n                pub(crate) struct Sensitive<T>(pub(crate) T);\n\n                impl<T> #{serde}::Serialize for ConfigurableSerdeRef<'_, Sensitive<T>>\n                where\n                T: #{serde}::Serialize,\n                {\n                    fn serialize<S>(&self, serializer: S) -> #{Result}<S::Ok, S::Error>\n                    where\n                    S: serde::Serializer,\n                    {\n                        match self.settings.redact_sensitive_fields {\n                            true => serializer.serialize_str(\"<redacted>\"),\n                            false => self.value.0.serialize(serializer),\n                        }\n                    }\n                }\n                \"\"\",\n                \"serde\" to CargoDependency.Serde.toType(),\n                *RuntimeType.preludeScope,\n            )\n        }\n\n    private fun configurableSerde() =\n        RuntimeType.forInlineFun(\"ConfigurableSerde\", supportModule) {\n            rustTemplate(\n                \"\"\"\n                ##[allow(missing_docs)]\n                pub(crate) struct ConfigurableSerde<T> {\n                    pub(crate) value: T,\n                    pub(crate) settings: #{SerializationSettings}\n                }\n\n                impl<T> #{serde}::Serialize for ConfigurableSerde<T> where for <'a> ConfigurableSerdeRef<'a, T>: #{serde}::Serialize {\n                    fn serialize<S>(&self, serializer: S) -> #{Result}<S::Ok, S::Error>\n                    where\n                        S: #{serde}::Serializer,\n                    {\n                        #{ConfigurableSerdeRef} {\n                            value: &self.value,\n                            settings: &self.settings,\n                        }\n                        .serialize(serializer)\n                    }\n                }\n                impl<T> #{serde}::Serialize for #{ConfigurableSerdeRef}<'_, Option<T>>\n                where\n                    T: #{SerializeConfigured},\n                {\n                    fn serialize<S>(&self, serializer: S) -> #{Result}<S::Ok, S::Error>\n                    where\n                        S: #{serde}::Serializer,\n                    {\n                        match self.value {\n                            Some(value) => serializer.serialize_some(&value.serialize_ref(self.settings)),\n                            None => serializer.serialize_none(),\n                        }\n                    }\n                }\n\n                \"\"\",\n                \"SerializationSettings\" to serializationSettings(),\n                \"ConfigurableSerdeRef\" to configurableSerdeRef(),\n                \"SerializeConfigured\" to serializeConfigured(),\n                \"serde\" to CargoDependency.Serde.toType(),\n                *RuntimeType.preludeScope,\n            )\n        }\n\n    private fun configurableSerdeRef() =\n        RuntimeType.forInlineFun(\"ConfigurableSerdeRef\", supportModule) {\n            rustTemplate(\n                \"\"\"\n                ##[allow(missing_docs)]\n                pub(crate) struct ConfigurableSerdeRef<'a, T> {\n                    pub(crate) value: &'a T,\n                    pub(crate) settings: &'a SerializationSettings\n                }\n                \"\"\",\n            )\n        }\n\n    private fun serializationSettings() =\n        RuntimeType.forInlineFun(\"SerializationSettings\", supportModule) {\n            rustTemplate(\n                \"\"\"\n                /// Settings for use when serializing structures\n                ##[non_exhaustive]\n                ##[derive(Clone, Debug, Default)]\n                pub struct SerializationSettings {\n                    /// Replace all sensitive fields with `<redacted>` during serialization\n                    pub redact_sensitive_fields: bool,\n\n                    /// Serialize Nan, infinity and negative infinity as strings.\n                    ///\n                    /// For protocols like JSON, this avoids the loss-of-information that occurs when these out-of-range values\n                    /// are serialized as null.\n                    pub out_of_range_floats_as_strings: bool,\n                }\n\n                impl SerializationSettings {\n                    /// Replace all `@sensitive` fields with `<redacted>` when serializing.\n                    ///\n                    /// Note: This may alter the type of the serialized output and make it impossible to deserialize as\n                    /// numerical fields will be replaced with strings.\n                    pub const fn redact_sensitive_fields() -> Self { Self { redact_sensitive_fields: true, out_of_range_floats_as_strings: true } }\n\n                    /// Preserve the contents of sensitive fields during serializing\n                    pub const fn leak_sensitive_fields() -> Self { Self { redact_sensitive_fields: false, out_of_range_floats_as_strings: false } }\n                }\n                \"\"\",\n            )\n        }\n}\n"
  },
  {
    "path": "codegen-serde/src/main/kotlin/software/amazon/smithy/rust/codegen/serde/Traits.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.serde\n\nimport software.amazon.smithy.build.SmithyBuildException\nimport software.amazon.smithy.model.SourceLocation\nimport software.amazon.smithy.model.node.Node\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.model.traits.AbstractTrait\nimport software.amazon.smithy.model.traits.Trait\nimport software.amazon.smithy.rust.codegen.core.util.orNull\n\nclass SerdeTrait constructor(\n    private val serialize: Boolean,\n    private val deserialize: Boolean,\n    private val tag: String?,\n    private val content: String?,\n    sourceLocation: SourceLocation,\n) :\n    AbstractTrait(ID, sourceLocation) {\n        override fun createNode(): Node {\n            val builder =\n                Node.objectNodeBuilder()\n                    .sourceLocation(sourceLocation)\n                    .withMember(\"serialize\", serialize)\n                    .withMember(\"deserialize\", deserialize)\n                    .withMember(\"tag\", tag)\n                    .withMember(\"content\", content)\n            return builder.build()\n        }\n\n        class Provider : AbstractTrait.Provider(ID) {\n            override fun createTrait(\n                target: ShapeId,\n                value: Node,\n            ): Trait =\n                with(value.expectObjectNode()) {\n                    val serialize = getBooleanMemberOrDefault(\"serialize\", true)\n                    val deserialize = getBooleanMemberOrDefault(\"deserialize\", false)\n                    val tag = getStringMember(\"tag\").orNull()?.value\n                    val content = getStringMember(\"content\").orNull()?.value\n                    if (deserialize) {\n                        throw SmithyBuildException(\"deserialize is not currently supported.\")\n                    }\n                    val result =\n                        SerdeTrait(\n                            serialize,\n                            deserialize,\n                            tag,\n                            content,\n                            value.sourceLocation,\n                        )\n                    result.setNodeCache(value)\n                    result\n                }\n        }\n\n        companion object {\n            val ID: ShapeId = ShapeId.from(\"smithy.rust#serde\")\n        }\n    }\n"
  },
  {
    "path": "codegen-serde/src/main/resources/META-INF/services/software.amazon.smithy.model.traits.TraitService",
    "content": "software.amazon.smithy.rust.codegen.serde.SerdeTrait$Provider\n"
  },
  {
    "path": "codegen-serde/src/main/resources/META-INF/services/software.amazon.smithy.rust.codegen.client.smithy.customize.ClientCodegenDecorator",
    "content": "# This file lists the names of classes which implement decorators to the `rust-client-codegen` plugin.\n# The source code we are extending is found in https://github.com/smithy-lang/smithy-rs/blob/d5ea2cdd91e9b74232e08bd3137e3cd6aa2c3d01/codegen-client/src/main/kotlin/software/amazon/smithy/rust/codegen/client/smithy/customize/ClientCodegenDecorator.kt\n\nsoftware.amazon.smithy.rust.codegen.serde.ClientSerdeDecorator\n"
  },
  {
    "path": "codegen-serde/src/main/resources/META-INF/services/software.amazon.smithy.rust.codegen.server.smithy.customize.ServerCodegenDecorator",
    "content": "# This file lists the names of classes which implement decorators to the `rust-server-codegen` plugin.\n# The source code we are extending is found in https://github.com/awslabs/smithy-rs/blob/release-2023-04-26/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/customize/ServerCodegenDecorator.kt\n\nsoftware.amazon.smithy.rust.codegen.serde.ServerSerdeDecorator\n"
  },
  {
    "path": "codegen-serde/src/main/resources/META-INF/smithy/manifest",
    "content": "serde.smithy\n"
  },
  {
    "path": "codegen-serde/src/main/resources/META-INF/smithy/serde.smithy",
    "content": "$version: \"2\"\n\nnamespace smithy.rust\n\n@documentation(\n    \"Indicates a shape should support Rust's [serde](https://serde.rs/) library.\n  When a shape is marked with this trait, the generator in this package will auto-generate\n  implementations of the `serde::ser::Serialize` trait. Support for `Deserialize` is currently\n   unsupported. When applied to a service, all shapes in the service closure will implement these traits.\"\n)\n@trait(selector: \":is(structure, union, enum, string, map, service, operation)\")\n@internal\nstructure serde {\n    @documentation(\"Generate support for serde::ser::Serialize\")\n    serialize: Boolean = true\n\n    @documentation(\"Generate support for serde::ser::Deserialize. This is not currently supported.\")\n    deserialize: Boolean = false\n}\n"
  },
  {
    "path": "codegen-serde/src/test/kotlin/software/amazon/smithy/rust/codegen/serde/SerdeDecoratorTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.serde\n\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.model.node.Node\nimport software.amazon.smithy.rust.codegen.client.testutil.clientIntegrationTest\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute.Companion.cfg\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute.Companion.feature\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.CratesIo\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustType\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.testutil.IntegrationTestParams\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.integrationTest\nimport software.amazon.smithy.rust.codegen.core.testutil.unitTest\nimport software.amazon.smithy.rust.codegen.core.util.dq\nimport software.amazon.smithy.rust.codegen.core.util.runCommand\nimport software.amazon.smithy.rust.codegen.server.smithy.testutil.serverIntegrationTest\n\nclass SerdeDecoratorTest {\n    private val params =\n        IntegrationTestParams(cargoCommand = \"cargo test --all-features\", service = \"com.example#HelloService\")\n    private val simpleModel =\n        \"\"\"\n        namespace com.example\n        use smithy.rust#serde\n        use aws.protocols#awsJson1_0\n        use smithy.framework#ValidationException\n        @awsJson1_0\n        service HelloService {\n            operations: [SayHello, SayGoodBye, Streaming],\n            version: \"1\"\n        }\n        operation SayHello {\n            input: TestInput\n            errors: [ValidationException]\n        }\n\n        structure Recursive {\n            inner: RecursiveList\n        }\n\n        list RecursiveList {\n            member: Recursive\n        }\n\n        @serde\n        operation Streaming {\n            input: StreamingInput\n            errors: [ValidationException]\n        }\n\n        structure StreamingInput {\n            @required\n            data: StreamingBlob\n        }\n\n        @streaming\n        blob StreamingBlob\n\n        @serde\n        structure TestInput {\n           foo: SensitiveString,\n           e: TestEnum,\n           nested: Nested,\n           union: U,\n           document: Document,\n           blob: SensitiveBlob,\n           constrained: Constrained,\n           recursive: Recursive,\n           map: EnumKeyedMap,\n           float: Float,\n           double: Double\n        }\n\n        structure Constrained {\n            shortList: ShortList\n            shortMap: ShortMap\n            shortBlob: ShortBlob\n            rangedInt: RangedInteger,\n            rangedLong: RangedLong\n        }\n\n        @range(max: 10)\n        integer RangedInteger\n\n        @range(max: 10)\n        long RangedLong\n\n        @length(max: 10)\n        blob ShortBlob\n\n        @length(max: 10)\n        map ShortMap {\n            key: String,\n            value: Nested\n        }\n\n        @length(max: 10)\n        map EnumKeyedMap {\n            key: TestEnum\n            value: TestEnum\n        }\n\n        @length(max: 10)\n        string ShortString\n\n        @length(max: 10)\n        list ShortList {\n            member: Nested\n        }\n\n        @sensitive\n        blob SensitiveBlob\n\n        @sensitive\n        string SensitiveString\n\n        @sensitive\n        enum TestEnum {\n            A,\n            B,\n            C,\n            D\n        }\n\n        @sensitive\n        union U {\n            nested: Nested,\n            enum: TestEnum,\n            other: Unit\n        }\n\n        structure Nested {\n          @required\n          int: Integer,\n          float: Float,\n          double: Double,\n          sensitive: Timestamps,\n          notSensitive: AlsoTimestamps,\n          manyEnums: TestEnumList,\n          sparse: SparseList\n          map: SparseMap\n        }\n\n        list TestEnumList {\n            member: TestEnum\n        }\n\n        map Timestamps {\n            key: String\n            value: SensitiveTimestamp\n        }\n\n        map AlsoTimestamps {\n            key: String\n            value: Timestamp\n        }\n\n        @sparse\n        map SparseMap {\n            key: String\n            value: Timestamps\n        }\n\n        @sensitive\n        timestamp SensitiveTimestamp\n\n        @sparse\n        list SparseList {\n            member: TestEnum\n        }\n\n        operation SayGoodBye {\n            input: NotSerde\n        }\n        structure NotSerde {}\n        \"\"\".asSmithyModel(smithyVersion = \"2\")\n\n    @Test\n    fun `decorator should traverse resources`() {\n        val model =\n            \"\"\"\n            namespace com.example\n            use smithy.rust#serde\n            use aws.protocols#awsJson1_0\n\n            @awsJson1_0\n            @serde\n            service MyResourceService {\n                resources: [MyResource]\n            }\n\n            resource MyResource {\n                read: ReadMyResource\n            }\n\n            @readonly\n            operation ReadMyResource {\n                input := { }\n            }\n            \"\"\".asSmithyModel(smithyVersion = \"2\")\n\n        val params =\n            IntegrationTestParams(cargoCommand = \"cargo test --all-features\", service = \"com.example#MyResourceService\")\n        serverIntegrationTest(model, params = params) { ctx, crate ->\n            val codegenScope =\n                arrayOf(\n                    \"crate\" to RustType.Opaque(ctx.moduleUseName()),\n                    \"serde_json\" to CargoDependency(\"serde_json\", CratesIo(\"1\")).toDevDependency().toType(),\n                    // we need the derive feature\n                    \"serde\" to CargoDependency.Serde.toDevDependency().toType(),\n                )\n\n            crate.integrationTest(\"test_serde\") {\n                unitTest(\"input_serialized\") {\n                    rustTemplate(\n                        \"\"\"\n                        use #{crate}::input::ReadMyResourceInput;\n                        use #{crate}::serde::*;\n                        let input = ReadMyResourceInput { };\n                        let settings = SerializationSettings::default();\n                        let _serialized = #{serde_json}::to_string(&input.serialize_ref(&settings)).expect(\"failed to serialize\");\n                        \"\"\",\n                        *codegenScope,\n                    )\n                }\n            }\n        }\n    }\n\n    @Test\n    fun `feature should not be added if trait is not used`() {\n        val model =\n            \"\"\"\n            namespace com.example\n            use aws.protocols#awsJson1_0\n\n            @awsJson1_0\n            service MyService {\n                operations: [MyOperation]\n            }\n\n            operation MyOperation { }\n            \"\"\".asSmithyModel(smithyVersion = \"2\")\n\n        val params =\n            IntegrationTestParams(cargoCommand = \"cargo test --all-features\", service = \"com.example#MyService\")\n        serverIntegrationTest(model, params = params) { _, crate ->\n            crate.integrationTest(\"test_serde\") {\n                rust(\"##![allow(unexpected_cfgs)]\")\n                unitTest(\"fails_if_serde_feature_exists\", additionalAttributes = listOf(Attribute(cfg(feature(\"serde\"))))) {\n                    rust(\"assert!(false);\")\n                }\n            }\n        }\n    }\n\n    val onlyConstrained =\n        \"\"\"\n        namespace com.example\n        use smithy.rust#serde\n        use aws.protocols#awsJson1_0\n        use smithy.framework#ValidationException\n        @awsJson1_0\n        service HelloService {\n            operations: [SayHello],\n            version: \"1\"\n        }\n        @serde\n        operation SayHello {\n            input: TestInput\n            errors: [ValidationException]\n        }\n        structure TestInput {\n            @length(max: 10)\n            shortBlob: Blob\n        }\n        \"\"\".asSmithyModel(smithyVersion = \"2\")\n\n    // There is a \"race condition\" where if the first blob shape serialized is constrained, it triggered unexpected\n    // behavior where the constrained shape was used instead. This test verifies the fix.\n    // Fixes https://github.com/smithy-lang/smithy-rs/issues/3890\n    @Test\n    fun compilesOnlyConstrainedModel() {\n        val constrainedShapesSettings =\n            Node.objectNodeBuilder().withMember(\n                \"codegen\",\n                Node.objectNodeBuilder()\n                    .withMember(\"publicConstrainedTypes\", true)\n                    .build(),\n            ).build()\n        serverIntegrationTest(\n            onlyConstrained,\n            params.copy(additionalSettings = constrainedShapesSettings),\n        ) { _codegenContext, _rustCrate ->\n        }\n    }\n\n    @Test\n    fun generateSerializersThatWorkServer() {\n        serverIntegrationTest(simpleModel, params = params) { ctx, crate ->\n            val codegenScope =\n                arrayOf(\n                    \"crate\" to RustType.Opaque(ctx.moduleUseName()),\n                    \"serde_json\" to CargoDependency(\"serde_json\", CratesIo(\"1\")).toDevDependency().toType(),\n                    // we need the derive feature\n                    \"serde\" to CargoDependency.Serde.toDevDependency().toType(),\n                )\n\n            crate.integrationTest(\"test_serde\") {\n                unitTest(\"input_serialized\") {\n                    rustTemplate(\n                        \"\"\"\n                        use #{crate}::model::{Nested, U, TestEnum};\n                        use #{crate}::input::SayHelloInput;\n                        use #{crate}::serde::*;\n                        use std::collections::HashMap;\n                        use std::time::UNIX_EPOCH;\n                        use aws_smithy_types::{DateTime, Document, Blob};\n                        let sensitive_map = HashMap::from([(\"a\".to_string(), DateTime::from(UNIX_EPOCH))]);\n                        let input = SayHelloInput::builder()\n                            .foo(Some(\"foo-value\".to_string()))\n                            .e(Some(TestEnum::A))\n                            .document(Some(Document::String(\"hello!\".into())))\n                            .blob(Some(Blob::new(\"hello\")))\n                            .float(Some(f32::INFINITY))\n                            .double(Some(f64::NAN))\n                            .nested(Some(Nested::builder()\n                                .int(5)\n                                .float(Some(f32::NEG_INFINITY))\n                                .double(Some(f64::NEG_INFINITY))\n                                .sensitive(Some(sensitive_map.clone()))\n                                .not_sensitive(Some(sensitive_map))\n                                .many_enums(Some(vec![TestEnum::A]))\n                                .sparse(Some(vec![None, Some(TestEnum::A), Some(TestEnum::B)]))\n                                .build().unwrap()\n                            ))\n                            .union(Some(U::Enum(TestEnum::B)))\n                            .build()\n                            .unwrap();\n                        let mut settings = SerializationSettings::default();\n                        settings.out_of_range_floats_as_strings = true;\n                        let serialized = #{serde_json}::to_string(&input.serialize_ref(&settings)).expect(\"failed to serialize\");\n                        assert_eq!(serialized, ${expectedNoRedactions.dq()});\n                        settings.redact_sensitive_fields = true;\n                        let serialized = #{serde_json}::to_string(&input.serialize_ref(&settings)).expect(\"failed to serialize\");\n                        assert_eq!(serialized, ${expectedRedacted.dq()});\n                        \"\"\",\n                        *codegenScope,\n                    )\n                }\n\n                unitTest(\"serde_of_bytestream\") {\n                    rustTemplate(\n                        \"\"\"\n                        use #{crate}::input::StreamingInput;\n                        use #{crate}::types::ByteStream;\n                        use #{crate}::serde::*;\n                        let input = StreamingInput::builder().data(ByteStream::from_static(b\"123\")).build().unwrap();\n                        let settings = SerializationSettings::default();\n                        let serialized = #{serde_json}::to_string(&input.serialize_ref(&settings)).expect(\"failed to serialize\");\n                        assert_eq!(serialized, ${expectedStreaming.dq()});\n\n                        \"\"\",\n                        *codegenScope,\n                    )\n                }\n\n                unitTest(\"delegated_serde\") {\n                    rustTemplate(\n                        \"\"\"\n                        use #{crate}::input::SayHelloInput;\n                        use #{crate}::serde::*;\n                        ##[derive(#{serde}::Serialize)]\n                        struct MyRecord {\n                            ##[serde(serialize_with = \"serialize_redacted\")]\n                            redact_field: SayHelloInput,\n                            ##[serde(serialize_with = \"serialize_unredacted\")]\n                            unredacted_field: SayHelloInput\n                        }\n                        let input = SayHelloInput::builder().foo(Some(\"foo-value\".to_string())).build().unwrap();\n\n                        let field = MyRecord {\n                            redact_field: input.clone(),\n                            unredacted_field: input\n                        };\n                        let serialized = #{serde_json}::to_string(&field).expect(\"failed to serialize\");\n                        assert_eq!(serialized, r##\"{\"redact_field\":{\"foo\":\"<redacted>\"},\"unredacted_field\":{\"foo\":\"foo-value\"}}\"##);\n                        \"\"\",\n                        *codegenScope,\n                    )\n                }\n            }\n        }\n    }\n\n    private val expectedNoRedactions =\n        \"\"\"{\n        \"foo\": \"foo-value\",\n        \"e\": \"A\",\n        \"nested\": {\n          \"int\": 5,\n          \"float\": \"-Infinity\",\n          \"double\": \"-Infinity\",\n          \"sensitive\": {\n            \"a\": \"1970-01-01T00:00:00Z\"\n          },\n          \"notSensitive\": {\n            \"a\": \"1970-01-01T00:00:00Z\"\n          },\n          \"manyEnums\": [\n            \"A\"\n          ],\n          \"sparse\": [null, \"A\", \"B\"]\n        },\n        \"union\": {\n          \"enum\": \"B\"\n        },\n        \"document\": \"hello!\",\n        \"blob\": \"aGVsbG8=\",\n        \"float\": \"Infinity\",\n        \"double\": \"NaN\"\n    }\"\"\".replace(\"\\\\s\".toRegex(), \"\")\n\n    private val expectedRedacted =\n        \"\"\"{\n        \"foo\": \"<redacted>\",\n        \"e\": \"<redacted>\",\n        \"nested\": {\n          \"int\": 5,\n          \"float\": \"-Infinity\",\n          \"double\": \"-Infinity\",\n          \"sensitive\": {\n            \"a\": \"<redacted>\"\n          },\n          \"notSensitive\": {\n            \"a\": \"1970-01-01T00:00:00Z\"\n          },\n          \"manyEnums\": [\n            \"<redacted>\"\n          ],\n          \"sparse\": [null, \"<redacted>\", \"<redacted>\"]\n        },\n        \"union\": \"<redacted>\",\n        \"document\": \"hello!\",\n        \"blob\": \"<redacted>\",\n        \"float\": \"Infinity\",\n        \"double\": \"NaN\"\n        }\n        \"\"\".replace(\"\\\\s\".toRegex(), \"\")\n\n    private val expectedStreaming = \"\"\"{\"data\":\"MTIz\"}\"\"\"\n\n    @Test\n    fun generateSerializersThatWorkClient() {\n        val path =\n            clientIntegrationTest(simpleModel, params = params) { ctx, crate ->\n                val codegenScope =\n                    arrayOf(\n                        \"crate\" to RustType.Opaque(ctx.moduleUseName()),\n                        \"serde_json\" to CargoDependency(\"serde_json\", CratesIo(\"1\")).toDevDependency().toType(),\n                        \"ciborium\" to CargoDependency.Ciborium.toType(),\n                        // we need the derive feature\n                        \"serde\" to CargoDependency.Serde.toDevDependency().toType(),\n                    )\n\n                crate.integrationTest(\"test_serde\") {\n                    unitTest(\"input_serialized\") {\n                        rustTemplate(\n                            \"\"\"\n                            use #{crate}::types::{Nested, U, TestEnum};\n                            use #{crate}::serde::*;\n                            use std::time::UNIX_EPOCH;\n                            use aws_smithy_types::{DateTime, Document, Blob};\n                            let input = #{crate}::operation::say_hello::SayHelloInput::builder()\n                                .foo(\"foo-value\")\n                                .e(\"A\".into())\n                                .document(Document::String(\"hello!\".into()))\n                                .blob(Blob::new(\"hello\"))\n                                .float(f32::INFINITY)\n                                .double(f64::NAN)\n                                .nested(Nested::builder()\n                                    .int(5)\n                                    .float(f32::NEG_INFINITY)\n                                    .double(f64::NEG_INFINITY)\n                                    .sensitive(\"a\", DateTime::from(UNIX_EPOCH))\n                                    .not_sensitive(\"a\", DateTime::from(UNIX_EPOCH))\n                                    .many_enums(\"A\".into())\n                                    .sparse(None).sparse(Some(TestEnum::A)).sparse(Some(TestEnum::B))\n                                    .build().unwrap()\n                                )\n                                .union(U::Enum(\"B\".into()))\n                                .build()\n                                .unwrap();\n                            let mut settings = #{crate}::serde::SerializationSettings::default();\n                            settings.out_of_range_floats_as_strings = true;\n                            let serialized = #{serde_json}::to_string(&input.serialize_ref(&settings)).expect(\"failed to serialize\");\n                            assert_eq!(serialized, ${expectedNoRedactions.dq()});\n                            settings.redact_sensitive_fields = true;\n                            let serialized = #{serde_json}::to_string(&input.serialize_ref(&settings)).expect(\"failed to serialize\");\n                            assert_eq!(serialized, ${expectedRedacted.dq()});\n                            settings.out_of_range_floats_as_strings = false;\n                            let serialized = #{serde_json}::to_string(&input.serialize_ref(&settings)).expect(\"failed to serialize\");\n                            assert_ne!(serialized, ${expectedRedacted.dq()});\n                            \"\"\",\n                            *codegenScope,\n                        )\n                    }\n\n                    unitTest(\"serde_of_bytestream\") {\n                        rustTemplate(\n                            \"\"\"\n                            use #{crate}::operation::streaming::StreamingInput;\n                            use #{crate}::primitives::ByteStream;\n                            use #{crate}::serde::*;\n                            let input = StreamingInput::builder().data(ByteStream::from_static(b\"123\")).build().unwrap();\n                            let settings = SerializationSettings::default();\n                            let serialized = #{serde_json}::to_string(&input.serialize_ref(&settings)).expect(\"failed to serialize\");\n                            assert_eq!(serialized, ${expectedStreaming.dq()});\n                            \"\"\",\n                            *codegenScope,\n                        )\n                    }\n\n                    unitTest(\"delegated_serde\") {\n                        rustTemplate(\n                            \"\"\"\n                            use #{crate}::operation::say_hello::SayHelloInput;\n                            use #{crate}::serde::*;\n                            ##[derive(#{serde}::Serialize)]\n                            struct MyRecord {\n                                ##[serde(serialize_with = \"serialize_redacted\")]\n                                redact_field: SayHelloInput,\n                                ##[serde(serialize_with = \"serialize_unredacted\")]\n                                unredacted_field: SayHelloInput\n                            }\n                            let input = SayHelloInput::builder().foo(\"foo-value\").build().unwrap();\n\n                            let field = MyRecord {\n                                redact_field: input.clone(),\n                                unredacted_field: input\n                            };\n                            let serialized = #{serde_json}::to_string(&field).expect(\"failed to serialize\");\n                            assert_eq!(serialized, r##\"{\"redact_field\":{\"foo\":\"<redacted>\"},\"unredacted_field\":{\"foo\":\"foo-value\"}}\"##);\n                            \"\"\",\n                            *codegenScope,\n                        )\n                    }\n\n                    unitTest(\"cbor\") {\n                        rustTemplate(\n                            \"\"\"\n                            use #{crate}::operation::streaming::StreamingInput;\n                            use #{crate}::primitives::ByteStream;\n                            use #{crate}::serde::*;\n                            let input = StreamingInput::builder().data(ByteStream::from_static(b\"123\")).build().unwrap();\n                            let settings = SerializationSettings::default();\n                            let mut serialized = Vec::new();\n                            #{ciborium}::ser::into_writer(&input.serialize_ref(&settings), &mut serialized)\n                                .expect(\"failed to serialize input into CBOR format using `ciborium`\");\n                            assert_eq!(serialized, b\"\\xa1ddataC123\");\n                            \"\"\",\n                            *codegenScope,\n                        )\n                    }\n                }\n            }\n        \"cargo clippy --all-features\".runCommand(path)\n    }\n}\n"
  },
  {
    "path": "codegen-serde/src/test/kotlin/software/amazon/smithy/rust/codegen/serde/SerdeProtocolTestTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.serde\n\nimport org.junit.jupiter.params.ParameterizedTest\nimport org.junit.jupiter.params.provider.ValueSource\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.SourceLocation\nimport software.amazon.smithy.model.node.Node\nimport software.amazon.smithy.model.shapes.ServiceShape\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.model.transform.ModelTransformer\nimport software.amazon.smithy.rust.codegen.core.testutil.IntegrationTestParams\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.util.letIf\nimport software.amazon.smithy.rust.codegen.server.smithy.testutil.serverIntegrationTest\nimport java.io.File\n\nclass SerdeProtocolTestTest {\n    private fun Model.attachSerdeToService(serviceShapeId: ShapeId): Model {\n        val service =\n            this.expectShape(serviceShapeId, ServiceShape::class.java).toBuilder().addTrait(\n                SerdeTrait(true, false, null, null, SourceLocation.NONE),\n            ).build()\n        return ModelTransformer.create().mapShapes(this) { serviceShape ->\n            serviceShape.letIf(serviceShape.id == serviceShapeId) {\n                service\n            }\n        }\n    }\n\n    @ParameterizedTest\n    @ValueSource(booleans = [true, false])\n    fun testConstraintsModel(usePublicConstrainedTypes: Boolean) {\n        val constraintsService = ShapeId.from(\"com.amazonaws.constraints#ConstraintsService\")\n        val filePath = \"../codegen-core/common-test-models/constraints.smithy\"\n        val model = File(filePath).readText().asSmithyModel().attachSerdeToService(constraintsService)\n        val constrainedShapesSettings =\n            Node.objectNodeBuilder().withMember(\n                \"codegen\",\n                Node.objectNodeBuilder()\n                    .withMember(\"publicConstrainedTypes\", usePublicConstrainedTypes)\n                    .build(),\n            ).build()\n        serverIntegrationTest(\n            model,\n            IntegrationTestParams(\n                service = constraintsService.toString(),\n                cargoCommand = \"cargo test --all-features\",\n                additionalSettings = constrainedShapesSettings,\n            ),\n        ) { clientCodegenContext, rustCrate ->\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-server/README.md",
    "content": "# Smithy Rust Server Generator\n\nServer-side Smithy code generator\n\n[Design documentation](https://smithy-lang.github.io/smithy-rs/design/server/overview.html)\n\n## Project Layout\n\n* `codegen-server`: Server-side code generation.\n* `codegen-server-test`: Server-side Smithy test and validation generation.\n  Common commands:\n  * `./gradlew :codegen-server-test:test` Generate code and run tests against it\n"
  },
  {
    "path": "codegen-server/build.gradle.kts",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport org.gradle.api.tasks.testing.logging.TestExceptionFormat\n\nplugins {\n    id(\"smithy-rs.kotlin-conventions\")\n    id(\"smithy-rs.publishing-conventions\")\n}\n\ndescription = \"Generates Rust server-side code from Smithy models\"\nextra[\"displayName\"] = \"Smithy :: Rust :: Codegen :: Server\"\nextra[\"moduleName\"] = \"software.amazon.smithy.rust.codegen.server\"\n\ndependencies {\n    implementation(project(\":codegen-core\"))\n    implementation(project(\":codegen-traits\"))\n    implementation(libs.smithy.aws.traits)\n    implementation(libs.smithy.protocol.test.traits)\n    implementation(libs.smithy.protocol.traits)\n\n    // `smithy.framework#ValidationException` is defined here, which is used in `constraints.smithy`, which is used\n    // in `CustomValidationExceptionWithReasonDecoratorTest`.\n    testImplementation(libs.smithy.validation.model)\n\n    // It's handy to re-use protocol test suite models from Smithy in our Kotlin tests.\n    testImplementation(libs.smithy.protocol.tests)\n\n    testImplementation(libs.junit.jupiter)\n    testImplementation(libs.kotest.assertions.core.jvm)\n}\n"
  },
  {
    "path": "codegen-server/codegen-server-python/build.gradle.kts",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nplugins {\n    id(\"smithy-rs.kotlin-conventions\")\n}\n\ndescription = \"Generates Rust/Python server-side code from Smithy models\"\nextra[\"displayName\"] = \"Smithy :: Rust :: Codegen :: Server :: Python\"\nextra[\"moduleName\"] = \"software.amazon.smithy.rust.codegen.server.python\"\n\ndependencies {\n    implementation(project(\":codegen-core\"))\n    implementation(project(\":codegen-server\"))\n    implementation(libs.smithy.aws.traits)\n    implementation(libs.smithy.protocol.test.traits)\n\n    // `smithy.framework#ValidationException` is defined here, which is used in `PythonServerTypesTest`.\n    testImplementation(libs.smithy.validation.model)\n\n    testImplementation(libs.junit.jupiter)\n    testImplementation(libs.kotest.assertions.core.jvm)\n}\n"
  },
  {
    "path": "codegen-server/codegen-server-python/src/main/kotlin/software/amazon/smithy/rust/codegen/server/python/smithy/PythonEventStreamSymbolProvider.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.python.smithy\n\nimport software.amazon.smithy.codegen.core.Symbol\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustType\nimport software.amazon.smithy.rust.codegen.core.rustlang.stripOuter\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.WrappingSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.rustType\nimport software.amazon.smithy.rust.codegen.core.smithy.traits.SyntheticInputTrait\nimport software.amazon.smithy.rust.codegen.core.smithy.traits.SyntheticOutputTrait\nimport software.amazon.smithy.rust.codegen.core.smithy.transformers.eventStreamErrors\nimport software.amazon.smithy.rust.codegen.core.util.getTrait\nimport software.amazon.smithy.rust.codegen.core.util.isEventStream\nimport software.amazon.smithy.rust.codegen.core.util.isOutputEventStream\nimport software.amazon.smithy.rust.codegen.core.util.toPascalCase\n\n/**\n * Symbol provider for Python that maps event streaming member shapes to their respective Python wrapper types.\n *\n * For example given a model:\n * ```smithy\n * @input\n * structure CapturePokemonInput {\n *     @httpPayload\n *     events: AttemptCapturingPokemonEvent,\n * }\n *\n * @streaming\n * union AttemptCapturingPokemonEvent {\n *     ...\n * }\n * ```\n * for the member shape `CapturePokemonInput$events` it will return a symbol that points to\n * `crate::python_event_stream::CapturePokemonInputEventsReceiver`.\n */\nclass PythonEventStreamSymbolProvider(\n    private val runtimeConfig: RuntimeConfig,\n    base: RustSymbolProvider,\n) : WrappingSymbolProvider(base) {\n    override fun toSymbol(shape: Shape): Symbol {\n        val initial = super.toSymbol(shape)\n\n        // We only want to wrap with Event Stream types when dealing with member shapes\n        if (shape !is MemberShape || !shape.isEventStream(model)) {\n            return initial\n        }\n\n        // We can only wrap the type if it's either an input or an output that used in an operation\n        model.expectShape(shape.container).let { maybeInputOutput ->\n            val operationId =\n                maybeInputOutput.getTrait<SyntheticInputTrait>()?.operation\n                    ?: maybeInputOutput.getTrait<SyntheticOutputTrait>()?.operation\n            operationId?.let { model.expectShape(it, OperationShape::class.java) }\n        } ?: return initial\n\n        val unionShape = model.expectShape(shape.target).asUnionShape().get()\n        val error =\n            if (unionShape.eventStreamErrors().isEmpty()) {\n                RuntimeType.smithyHttp(runtimeConfig).resolve(\"event_stream::MessageStreamError\").toSymbol()\n            } else {\n                symbolForEventStreamError(unionShape)\n            }\n        val inner = initial.rustType().stripOuter<RustType.Option>()\n        val innerSymbol = Symbol.builder().name(inner.name).rustType(inner).build()\n        val containerName = shape.container.name\n        val memberName = shape.memberName.toPascalCase()\n        val outer =\n            when (shape.isOutputEventStream(model)) {\n                true -> \"${containerName}${memberName}EventStreamSender\"\n                else -> \"${containerName}${memberName}Receiver\"\n            }\n        val rustType = RustType.Opaque(outer, PythonServerRustModule.PythonEventStream.fullyQualifiedPath())\n        return Symbol.builder()\n            .name(rustType.name)\n            .rustType(rustType)\n            .addReference(innerSymbol)\n            .addReference(error)\n            .addDependency(CargoDependency.smithyHttp(runtimeConfig).withFeature(\"event-stream\"))\n            .addDependency(PythonServerCargoDependency.TokioStream)\n            .addDependency(PythonServerCargoDependency.PyO3Asyncio.withFeature(\"unstable-streams\"))\n            .build()\n    }\n\n    companion object {\n        data class EventStreamSymbol(val innerT: RustType, val errorT: RustType)\n\n        fun parseSymbol(symbol: Symbol): EventStreamSymbol {\n            check(symbol.references.size >= 2) {\n                \"`PythonEventStreamSymbolProvider` adds inner type and error type as references to resulting symbol\"\n            }\n            val innerT = symbol.references[0].symbol.rustType()\n            val errorT = symbol.references[1].symbol.rustType()\n            return EventStreamSymbol(innerT, errorT)\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-server/codegen-server-python/src/main/kotlin/software/amazon/smithy/rust/codegen/server/python/smithy/PythonServerCargoDependency.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.python.smithy\n\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.CratesIo\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig\n\n/**\n * Object used *exclusively* in the runtime of the Python server, for separation concerns.\n * Analogous to the companion object in [CargoDependency] and [software.amazon.smithy.rust.codegen.server.smithy.ServerCargoDependency]; see its documentation for details.\n * For a dependency that is used in the client, or in both the client and the server, use [CargoDependency] directly.\n */\nobject PythonServerCargoDependency {\n    val PyO3: CargoDependency = CargoDependency(\"pyo3\", CratesIo(\"0.20\"))\n    val PyO3Asyncio: CargoDependency =\n        CargoDependency(\"pyo3-asyncio\", CratesIo(\"0.20\"), features = setOf(\"attributes\", \"tokio-runtime\"))\n    val Tokio: CargoDependency = CargoDependency(\"tokio\", CratesIo(\"1.20.1\"), features = setOf(\"full\"))\n    val TokioStream: CargoDependency = CargoDependency(\"tokio-stream\", CratesIo(\"0.1.12\"))\n    val Tracing: CargoDependency = CargoDependency(\"tracing\", CratesIo(\"0.1\"))\n    val Tower: CargoDependency = CargoDependency(\"tower\", CratesIo(\"0.4\"))\n    val TowerHttp: CargoDependency = CargoDependency(\"tower-http\", CratesIo(\"0.3\"), features = setOf(\"trace\"))\n    val Hyper: CargoDependency =\n        CargoDependency(\"hyper\", CratesIo(\"0.14.12\"), features = setOf(\"server\", \"http1\", \"http2\", \"tcp\", \"stream\"))\n    val NumCpus: CargoDependency = CargoDependency(\"num_cpus\", CratesIo(\"1.13\"))\n    val ParkingLot: CargoDependency = CargoDependency(\"parking_lot\", CratesIo(\"0.12\"))\n\n    fun smithyHttpServer(runtimeConfig: RuntimeConfig) = runtimeConfig.smithyRuntimeCrate(\"smithy-legacy-http-server\")\n\n    fun smithyHttpServerPython(runtimeConfig: RuntimeConfig) =\n        runtimeConfig.smithyRuntimeCrate(\"smithy-http-server-python\")\n}\n"
  },
  {
    "path": "codegen-server/codegen-server-python/src/main/kotlin/software/amazon/smithy/rust/codegen/server/python/smithy/PythonServerCodegenVisitor.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.python.smithy\n\nimport software.amazon.smithy.build.PluginContext\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.knowledge.NullableIndex\nimport software.amazon.smithy.model.shapes.BlobShape\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.ServiceShape\nimport software.amazon.smithy.model.shapes.StringShape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.shapes.UnionShape\nimport software.amazon.smithy.model.traits.EnumTrait\nimport software.amazon.smithy.model.traits.ErrorTrait\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenTarget\nimport software.amazon.smithy.rust.codegen.core.smithy.HttpVersion\nimport software.amazon.smithy.rust.codegen.core.smithy.RustCrate\nimport software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProviderConfig\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.error.ErrorImplGenerator\nimport software.amazon.smithy.rust.codegen.core.util.getTrait\nimport software.amazon.smithy.rust.codegen.core.util.isEventStream\nimport software.amazon.smithy.rust.codegen.server.python.smithy.generators.ConstrainedPythonBlobGenerator\nimport software.amazon.smithy.rust.codegen.server.python.smithy.generators.PythonApplicationGenerator\nimport software.amazon.smithy.rust.codegen.server.python.smithy.generators.PythonServerEnumGenerator\nimport software.amazon.smithy.rust.codegen.server.python.smithy.generators.PythonServerEventStreamErrorGenerator\nimport software.amazon.smithy.rust.codegen.server.python.smithy.generators.PythonServerEventStreamWrapperGenerator\nimport software.amazon.smithy.rust.codegen.server.python.smithy.generators.PythonServerOperationErrorGenerator\nimport software.amazon.smithy.rust.codegen.server.python.smithy.generators.PythonServerOperationHandlerGenerator\nimport software.amazon.smithy.rust.codegen.server.python.smithy.generators.PythonServerStructureGenerator\nimport software.amazon.smithy.rust.codegen.server.python.smithy.generators.PythonServerUnionGenerator\nimport software.amazon.smithy.rust.codegen.server.python.smithy.protocols.PythonServerProtocolLoader\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenContext\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenVisitor\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerModuleDocProvider\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerModuleProvider\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerRustModule\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerRustSettings\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerSymbolProviders\nimport software.amazon.smithy.rust.codegen.server.smithy.canReachConstrainedShape\nimport software.amazon.smithy.rust.codegen.server.smithy.createInlineModuleCreator\nimport software.amazon.smithy.rust.codegen.server.smithy.customize.ServerCodegenDecorator\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.UnconstrainedUnionGenerator\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.protocol.ServerProtocol\nimport software.amazon.smithy.rust.codegen.server.smithy.isDirectlyConstrained\nimport software.amazon.smithy.rust.codegen.server.smithy.traits.isReachableFromOperationInput\nimport software.amazon.smithy.rust.codegen.server.smithy.withModuleOrWithStructureBuilderModule\n\n/**\n * Entrypoint for Python server-side code generation. This class will walk the in-memory model and\n * generate all the needed types by calling the accept() function on the available shapes.\n *\n * This class inherits from [ServerCodegenVisitor] since it uses most of the functionalities of the super class\n * and have to override the symbol provider with [PythonServerSymbolProvider].\n */\nclass PythonServerCodegenVisitor(\n    context: PluginContext,\n    private val codegenDecorator: ServerCodegenDecorator,\n) : ServerCodegenVisitor(context, codegenDecorator) {\n    init {\n        // Python server bindings are only compatible with the legacy HTTP 0.x server.\n        // Force HTTP 0.x regardless of configuration settings.\n        // `publicConstrainedTypes` must always be `false` for the Python server, since Python generates its own\n        // wrapper newtypes.\n        settings =\n            settings.copy(\n                runtimeConfig = settings.runtimeConfig.copy(httpVersion = HttpVersion.Http0x),\n                codegenConfig =\n                    settings.codegenConfig.copy(\n                        publicConstrainedTypes = false,\n                        http1x = false,\n                    ),\n            )\n\n        val rustSymbolProviderConfig =\n            RustSymbolProviderConfig(\n                runtimeConfig = settings.runtimeConfig,\n                renameExceptions = false,\n                nullabilityCheckMode = NullableIndex.CheckMode.SERVER,\n                moduleProvider = ServerModuleProvider,\n            )\n        val baseModel = baselineTransform(context.model)\n        val service = settings.getService(baseModel)\n        val (protocol, generator) =\n            PythonServerProtocolLoader(\n                codegenDecorator.protocols(\n                    service.id,\n                    PythonServerProtocolLoader.defaultProtocols(settings.runtimeConfig),\n                ),\n            )\n                .protocolFor(context.model, service)\n        protocolGeneratorFactory = generator\n\n        model = codegenDecorator.transformModel(service, baseModel, settings)\n\n        fun baseSymbolProviderFactory(\n            settings: ServerRustSettings,\n            model: Model,\n            serviceShape: ServiceShape,\n            rustSymbolProviderConfig: RustSymbolProviderConfig,\n            publicConstrainedTypes: Boolean,\n            includeConstraintShapeProvider: Boolean,\n            codegenDecorator: ServerCodegenDecorator,\n        ) =\n            RustServerCodegenPythonPlugin.baseSymbolProvider(settings, model, serviceShape, rustSymbolProviderConfig, publicConstrainedTypes, includeConstraintShapeProvider, codegenDecorator)\n\n        val serverSymbolProviders =\n            ServerSymbolProviders.from(\n                settings,\n                model,\n                service,\n                rustSymbolProviderConfig,\n                settings.codegenConfig.publicConstrainedTypes,\n                codegenDecorator,\n                ::baseSymbolProviderFactory,\n            )\n\n        // Override `codegenContext` which carries the various symbol providers.\n        val moduleDocProvider =\n            codegenDecorator.moduleDocumentationCustomization(\n                codegenContext,\n                PythonServerModuleDocProvider(ServerModuleDocProvider(codegenContext)),\n            )\n        codegenContext =\n            ServerCodegenContext(\n                model,\n                serverSymbolProviders.symbolProvider,\n                moduleDocProvider,\n                service,\n                protocol,\n                settings,\n                serverSymbolProviders.unconstrainedShapeSymbolProvider,\n                serverSymbolProviders.constrainedShapeSymbolProvider,\n                serverSymbolProviders.constraintViolationSymbolProvider,\n                serverSymbolProviders.pubCrateConstrainedShapeSymbolProvider,\n            )\n\n        // Override `rustCrate` which carries the symbolProvider.\n        rustCrate =\n            RustCrate(\n                context.fileManifest,\n                codegenContext.symbolProvider,\n                settings.codegenConfig,\n                codegenContext.expectModuleDocProvider(),\n            )\n        // Override `protocolGenerator` which carries the symbolProvider.\n        protocolGenerator = protocolGeneratorFactory.buildProtocolGenerator(codegenContext)\n    }\n\n    /**\n     * Structure Shape Visitor\n     *\n     * For each structure shape, generate:\n     * - A Rust structure for the shape ([StructureGenerator]).\n     * - `pyo3::PyClass` trait implementation.\n     * - A builder for the shape.\n     *\n     * This function _does not_ generate any serializers.\n     */\n    override fun structureShape(shape: StructureShape) {\n        logger.info(\"[python-server-codegen] Generating a structure $shape\")\n        rustCrate.useShapeWriter(shape) {\n            // Use Python specific structure generator that adds the #[pyclass] attribute\n            // and #[pymethods] implementation.\n            PythonServerStructureGenerator(model, codegenContext, this, shape).render()\n\n            shape.getTrait<ErrorTrait>()?.also { errorTrait ->\n                ErrorImplGenerator(\n                    model,\n                    codegenContext.symbolProvider,\n                    this,\n                    shape,\n                    errorTrait,\n                    codegenDecorator.errorImplCustomizations(codegenContext, emptyList()),\n                ).render(CodegenTarget.SERVER)\n            }\n\n            renderStructureShapeBuilder(shape, this)\n        }\n    }\n\n    /**\n     * String Shape Visitor\n     *\n     * Although raw strings require no code generation, enums are actually [EnumTrait] applied to string shapes.\n     */\n    override fun stringShape(shape: StringShape) {\n        fun pythonServerEnumGeneratorFactory(\n            codegenContext: ServerCodegenContext,\n            shape: StringShape,\n        ) = PythonServerEnumGenerator(codegenContext, shape, validationExceptionConversionGenerator)\n        stringShape(shape, ::pythonServerEnumGeneratorFactory)\n    }\n\n    /**\n     * Union Shape Visitor\n     *\n     * Generate an `enum` for union shapes.\n     *\n     * Note: this does not generate serializers\n     */\n    override fun unionShape(shape: UnionShape) {\n        logger.info(\"[python-server-codegen] Generating an union shape $shape\")\n        rustCrate.useShapeWriter(shape) {\n            PythonServerUnionGenerator(model, codegenContext, this, shape, renderUnknownVariant = false).render()\n        }\n\n        if (shape.isReachableFromOperationInput() &&\n            shape.canReachConstrainedShape(\n                model,\n                codegenContext.symbolProvider,\n            )\n        ) {\n            logger.info(\"[python-server-codegen] Generating an unconstrained type for union shape $shape\")\n            rustCrate.withModule(ServerRustModule.UnconstrainedModule) modelsModuleWriter@{\n                UnconstrainedUnionGenerator(\n                    codegenContext,\n                    rustCrate.createInlineModuleCreator(),\n                    this@modelsModuleWriter,\n                    shape,\n                    validationExceptionConversionGenerator,\n                ).render()\n            }\n        }\n\n        if (shape.isEventStream()) {\n            rustCrate.withModule(ServerRustModule.Error) {\n                PythonServerEventStreamErrorGenerator(model, codegenContext.symbolProvider, shape).render(this)\n            }\n        }\n    }\n\n    override fun protocolTestsForOperation(\n        writer: RustWriter,\n        operationShape: OperationShape,\n    ) {\n        logger.warning(\"[python-server-codegen] Protocol tests are disabled for this language\")\n    }\n\n    /**\n     * Generate service-specific code for the model:\n     * - Serializers\n     * - Deserializers\n     * - Trait implementations\n     * - Protocol tests\n     * - Operation structures\n     * - Python operation handlers\n     */\n    override fun serviceShape(shape: ServiceShape) {\n        super.serviceShape(shape)\n\n        logger.info(\"[python-server-codegen] Generating a service $shape\")\n\n        val serverProtocol = protocolGeneratorFactory.protocol(codegenContext) as ServerProtocol\n        rustCrate.withModule(PythonServerRustModule.PythonServerApplication) {\n            PythonApplicationGenerator(codegenContext, serverProtocol)\n                .render(this)\n        }\n    }\n\n    override fun operationShape(shape: OperationShape) {\n        super.operationShape(shape)\n\n        rustCrate.withModule(PythonServerRustModule.PythonOperationAdapter) {\n            PythonServerOperationHandlerGenerator(codegenContext, shape).render(this)\n        }\n\n        rustCrate.withModule(ServerRustModule.Error) {\n            PythonServerOperationErrorGenerator(codegenContext.model, codegenContext.symbolProvider, shape).render(this)\n        }\n    }\n\n    override fun memberShape(shape: MemberShape) {\n        super.memberShape(shape)\n\n        if (shape.isEventStream(model)) {\n            rustCrate.withModule(PythonServerRustModule.PythonEventStream) {\n                PythonServerEventStreamWrapperGenerator(codegenContext, shape).render(this)\n            }\n        }\n    }\n\n    override fun blobShape(shape: BlobShape) {\n        logger.info(\"[python-server-codegen] Generating a service $shape\")\n        super.blobShape(shape)\n\n        if (shape.isDirectlyConstrained(codegenContext.symbolProvider)) {\n            rustCrate.withModuleOrWithStructureBuilderModule(ServerRustModule.Model, shape, codegenContext) {\n                ConstrainedPythonBlobGenerator(\n                    codegenContext,\n                    rustCrate.createInlineModuleCreator(),\n                    this,\n                    shape,\n                    validationExceptionConversionGenerator,\n                ).render()\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-server/codegen-server-python/src/main/kotlin/software/amazon/smithy/rust/codegen/server/python/smithy/PythonServerRuntimeType.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.python.smithy\n\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\n\n/**\n * Object used *exclusively* in the runtime of the Python server, for separation concerns.\n * Analogous to the companion object in [RuntimeType] and [software.amazon.smithy.rust.codegen.server.smithy.ServerRuntimeType]; see its documentation for details.\n * For a runtime type that is used in the client, or in both the client and the server, use [RuntimeType] directly.\n */\nobject PythonServerRuntimeType {\n    fun blob(runtimeConfig: RuntimeConfig) =\n        PythonServerCargoDependency.smithyHttpServerPython(runtimeConfig).toType().resolve(\"types::Blob\")\n\n    fun byteStream(runtimeConfig: RuntimeConfig) =\n        PythonServerCargoDependency.smithyHttpServerPython(runtimeConfig).toType().resolve(\"types::ByteStream\")\n\n    fun dateTime(runtimeConfig: RuntimeConfig) =\n        PythonServerCargoDependency.smithyHttpServerPython(runtimeConfig).toType().resolve(\"types::DateTime\")\n\n    fun document(runtimeConfig: RuntimeConfig) =\n        PythonServerCargoDependency.smithyHttpServerPython(runtimeConfig).toType().resolve(\"types::Document\")\n\n    fun bigInteger(runtimeConfig: RuntimeConfig) =\n        PythonServerCargoDependency.smithyHttpServerPython(runtimeConfig).toType().resolve(\"types::BigInteger\")\n\n    fun bigDecimal(runtimeConfig: RuntimeConfig) =\n        PythonServerCargoDependency.smithyHttpServerPython(runtimeConfig).toType().resolve(\"types::BigDecimal\")\n}\n"
  },
  {
    "path": "codegen-server/codegen-server-python/src/main/kotlin/software/amazon/smithy/rust/codegen/server/python/smithy/PythonServerRustModule.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.python.smithy\n\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustModule\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.docs\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.ModuleDocProvider\n\nobject PythonServerRustModule {\n    val PythonModuleExport = RustModule.public(\"python_module_export\")\n    val PythonOperationAdapter = RustModule.public(\"python_operation_adaptor\")\n    val PythonServerApplication = RustModule.public(\"python_server_application\")\n    val PythonEventStream = RustModule.public(\"python_event_stream\")\n}\n\nclass PythonServerModuleDocProvider(private val base: ModuleDocProvider) : ModuleDocProvider {\n    override fun docsWriter(module: RustModule.LeafModule): Writable? {\n        val strDoc: (String) -> Writable = { str -> writable { docs(str) } }\n        return when (module) {\n            PythonServerRustModule.PythonModuleExport -> strDoc(\"Export PyO3 symbols in the shared library\")\n            PythonServerRustModule.PythonServerApplication -> strDoc(\"Python server and application implementation.\")\n            PythonServerRustModule.PythonOperationAdapter -> strDoc(\"Operation adapters that delegate to Python handlers.\")\n            PythonServerRustModule.PythonEventStream -> strDoc(\"Python wrapper types for event streams.\")\n            else -> base.docsWriter(module)\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-server/codegen-server-python/src/main/kotlin/software/amazon/smithy/rust/codegen/server/python/smithy/PythonServerSymbolProvider.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.python.smithy\n\nimport software.amazon.smithy.codegen.core.Symbol\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.BigDecimalShape\nimport software.amazon.smithy.model.shapes.BigIntegerShape\nimport software.amazon.smithy.model.shapes.BlobShape\nimport software.amazon.smithy.model.shapes.DocumentShape\nimport software.amazon.smithy.model.shapes.ListShape\nimport software.amazon.smithy.model.shapes.MapShape\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.NumberShape\nimport software.amazon.smithy.model.shapes.ServiceShape\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.shapes.StringShape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.shapes.TimestampShape\nimport software.amazon.smithy.model.shapes.UnionShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustMetadata\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProviderConfig\nimport software.amazon.smithy.rust.codegen.core.smithy.SymbolMetadataProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.SymbolVisitor\nimport software.amazon.smithy.rust.codegen.core.smithy.expectRustMetadata\nimport software.amazon.smithy.rust.codegen.core.smithy.traits.SyntheticInputTrait\nimport software.amazon.smithy.rust.codegen.core.smithy.traits.SyntheticOutputTrait\nimport software.amazon.smithy.rust.codegen.core.util.hasStreamingMember\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\nimport software.amazon.smithy.rust.codegen.core.util.isStreaming\nimport software.amazon.smithy.rust.codegen.server.smithy.ConstrainedShapeSymbolProvider\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerRustSettings\nimport java.util.logging.Logger\n\n// Returns the Python implementation of the ByteStream shape or the original symbol that is provided in input.\nprivate fun toPythonByteStreamSymbolOrOriginal(\n    model: Model,\n    config: RustSymbolProviderConfig,\n    initial: Symbol,\n    shape: Shape,\n): Symbol {\n    if (shape !is MemberShape) {\n        return initial\n    }\n\n    val target = model.expectShape(shape.target)\n    val container = model.expectShape(shape.container)\n\n    if (!container.hasTrait<SyntheticOutputTrait>() && !container.hasTrait<SyntheticInputTrait>()) {\n        return initial\n    }\n\n    // We are only targeting streaming blobs as the rest of the symbols do not change if streaming is enabled.\n    // For example a TimestampShape doesn't become a different symbol when streaming is involved, but BlobShape\n    // become a ByteStream.\n    return if (target is BlobShape && shape.isStreaming(model)) {\n        PythonServerRuntimeType.byteStream(config.runtimeConfig).toSymbol()\n    } else {\n        initial\n    }\n}\n\n/**\n * Symbol provider that recursively replace symbols in nested shapes.\n *\n * Input / output / error structures can refer to complex types like the ones implemented inside\n * `aws_smithy_types` (a good example is `aws_smithy_types::Blob`).\n * `aws_smithy_http_server_python::types` wraps those types that do not implement directly the\n * `pyo3::PyClass` trait and cannot be shared safely with Python, providing an idiomatic Python / Rust API.\n *\n * This symbol provider ensures types not implementing `pyo3::PyClass` are swapped with their wrappers from\n * `aws_smithy_http_server_python::types`.\n */\nclass PythonServerSymbolVisitor(\n    settings: ServerRustSettings,\n    model: Model,\n    serviceShape: ServiceShape?,\n    config: RustSymbolProviderConfig,\n) : SymbolVisitor(settings, model, serviceShape, config) {\n    private val runtimeConfig = config.runtimeConfig\n    private val logger = Logger.getLogger(javaClass.name)\n\n    override fun toSymbol(shape: Shape): Symbol {\n        val initial = shape.accept(this)\n        return toPythonByteStreamSymbolOrOriginal(model, config, initial, shape)\n    }\n\n    override fun timestampShape(shape: TimestampShape?): Symbol {\n        return PythonServerRuntimeType.dateTime(runtimeConfig).toSymbol()\n    }\n\n    override fun blobShape(shape: BlobShape?): Symbol {\n        return PythonServerRuntimeType.blob(runtimeConfig).toSymbol()\n    }\n\n    override fun documentShape(shape: DocumentShape?): Symbol {\n        return PythonServerRuntimeType.document(runtimeConfig).toSymbol()\n    }\n\n    override fun bigIntegerShape(shape: BigIntegerShape?): Symbol {\n        return PythonServerRuntimeType.bigInteger(runtimeConfig).toSymbol()\n    }\n\n    override fun bigDecimalShape(shape: BigDecimalShape?): Symbol {\n        return PythonServerRuntimeType.bigDecimal(runtimeConfig).toSymbol()\n    }\n}\n\n/**\n * Constrained symbol provider that recursively replace symbols in nested shapes.\n *\n * This symbol provider extends the `ConstrainedShapeSymbolProvider` to ensure constraints are\n * applied properly and swaps out shapes that do not implement `pyo3::PyClass` with their\n * wrappers.\n *\n * See `PythonServerSymbolVisitor` documentation for more info.\n */\nclass PythonConstrainedShapeSymbolProvider(\n    base: RustSymbolProvider,\n    serviceShape: ServiceShape,\n    publicConstrainedTypes: Boolean,\n) : ConstrainedShapeSymbolProvider(base, serviceShape, publicConstrainedTypes) {\n    override fun toSymbol(shape: Shape): Symbol {\n        val initial = super.toSymbol(shape)\n        return toPythonByteStreamSymbolOrOriginal(model, config, initial, shape)\n    }\n}\n\n/**\n * SymbolProvider to drop the PartialEq bounds in streaming shapes\n *\n * Streaming shapes equality cannot be checked without reading the body. Because of this, these shapes\n * do not implement `PartialEq`.\n *\n * Note that since streaming members can only be used on the root shape, this can only impact input and output shapes.\n */\nclass PythonStreamingShapeMetadataProvider(private val base: RustSymbolProvider) : SymbolMetadataProvider(base) {\n    override fun structureMeta(structureShape: StructureShape): RustMetadata {\n        val baseMetadata = base.toSymbol(structureShape).expectRustMetadata()\n        return if (structureShape.hasStreamingMember(model)) {\n            baseMetadata.withoutDerives(RuntimeType.PartialEq)\n        } else {\n            baseMetadata\n        }\n    }\n\n    override fun unionMeta(unionShape: UnionShape): RustMetadata {\n        val baseMetadata = base.toSymbol(unionShape).expectRustMetadata()\n        return if (unionShape.hasStreamingMember(model)) {\n            baseMetadata.withoutDerives(RuntimeType.PartialEq)\n        } else {\n            baseMetadata\n        }\n    }\n\n    override fun memberMeta(memberShape: MemberShape) = base.toSymbol(memberShape).expectRustMetadata()\n\n    override fun enumMeta(stringShape: StringShape) = base.toSymbol(stringShape).expectRustMetadata()\n\n    override fun listMeta(listShape: ListShape) = base.toSymbol(listShape).expectRustMetadata()\n\n    override fun mapMeta(mapShape: MapShape) = base.toSymbol(mapShape).expectRustMetadata()\n\n    override fun stringMeta(stringShape: StringShape) = base.toSymbol(stringShape).expectRustMetadata()\n\n    override fun numberMeta(numberShape: NumberShape) = base.toSymbol(numberShape).expectRustMetadata()\n\n    override fun blobMeta(blobShape: BlobShape) = base.toSymbol(blobShape).expectRustMetadata()\n}\n"
  },
  {
    "path": "codegen-server/codegen-server-python/src/main/kotlin/software/amazon/smithy/rust/codegen/server/python/smithy/PythonType.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.python.smithy\n\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustType\n\n/**\n * A hierarchy of Python types handled by Smithy codegen.\n *\n * Mostly copied from [RustType] and modified for Python accordingly.\n */\nsealed class PythonType {\n    /**\n     * A Python type that contains [member], another [PythonType].\n     * Used to generically operate over shapes that contain other shape.\n     */\n    sealed interface Container {\n        val member: PythonType\n        val namespace: String?\n        val name: String\n    }\n\n    /**\n     * Name refers to the top-level type for import purposes.\n     */\n    abstract val name: String\n\n    open val namespace: String? = null\n\n    object None : PythonType() {\n        override val name: String = \"None\"\n    }\n\n    object Bool : PythonType() {\n        override val name: String = \"bool\"\n    }\n\n    object Int : PythonType() {\n        override val name: String = \"int\"\n    }\n\n    object Float : PythonType() {\n        override val name: String = \"float\"\n    }\n\n    object Str : PythonType() {\n        override val name: String = \"str\"\n    }\n\n    object Any : PythonType() {\n        override val name: String = \"Any\"\n        override val namespace: String = \"typing\"\n    }\n\n    data class List(override val member: PythonType) : PythonType(), Container {\n        override val name: String = \"List\"\n        override val namespace: String = \"typing\"\n    }\n\n    data class Dict(val key: PythonType, override val member: PythonType) : PythonType(), Container {\n        override val name: String = \"Dict\"\n        override val namespace: String = \"typing\"\n    }\n\n    data class Set(override val member: PythonType) : PythonType(), Container {\n        override val name: String = \"Set\"\n        override val namespace: String = \"typing\"\n    }\n\n    data class Optional(override val member: PythonType) : PythonType(), Container {\n        override val name: String = \"Optional\"\n        override val namespace: String = \"typing\"\n    }\n\n    data class Awaitable(override val member: PythonType) : PythonType(), Container {\n        override val name: String = \"Awaitable\"\n        override val namespace: String = \"typing\"\n    }\n\n    data class Callable(val args: kotlin.collections.List<PythonType>, val rtype: PythonType) : PythonType() {\n        override val name: String = \"Callable\"\n        override val namespace: String = \"typing\"\n    }\n\n    data class Union(val args: kotlin.collections.List<PythonType>) : PythonType() {\n        override val name: String = \"Union\"\n        override val namespace: String = \"typing\"\n    }\n\n    data class AsyncIterator(override val member: PythonType) : PythonType(), Container {\n        override val name: String = \"AsyncIterator\"\n        override val namespace: String = \"typing\"\n    }\n\n    data class Application(val type: PythonType, val args: kotlin.collections.List<PythonType>) : PythonType() {\n        override val name = type.name\n        override val namespace = type.namespace\n    }\n\n    data class Opaque(override val name: String, val pythonRootModuleName: String, val rustNamespace: String? = null) : PythonType() {\n        override val namespace: String? =\n            rustNamespace?.split(\"::\")?.joinToString(\".\") {\n                when (it) {\n                    \"crate\" -> pythonRootModuleName\n                    // In Python, we expose submodules from `aws_smithy_http_server_python`\n                    // like `types`, `middleware`, `tls` etc. from Python root module\n                    \"aws_smithy_http_server_python\" -> pythonRootModuleName\n                    else -> it\n                }\n            }\n                // Most opaque types have a leading `::`, so strip that for Python as needed\n                .let {\n                    when (it?.startsWith(\".\")) {\n                        true -> it.substring(1)\n                        else -> it\n                    }\n                }\n    }\n}\n\n/**\n * Return corresponding [PythonType] for a [RustType].\n */\nfun RustType.pythonType(pythonRootModuleName: String): PythonType =\n    when (this) {\n        is RustType.Unit -> PythonType.None\n        is RustType.Bool -> PythonType.Bool\n        is RustType.Float -> PythonType.Float\n        is RustType.Integer -> PythonType.Int\n        is RustType.String -> PythonType.Str\n        is RustType.Vec -> PythonType.List(this.member.pythonType(pythonRootModuleName))\n        is RustType.Slice -> PythonType.List(this.member.pythonType(pythonRootModuleName))\n        is RustType.HashMap -> PythonType.Dict(this.key.pythonType(pythonRootModuleName), this.member.pythonType(pythonRootModuleName))\n        is RustType.HashSet -> PythonType.Set(this.member.pythonType(pythonRootModuleName))\n        is RustType.Reference -> this.member.pythonType(pythonRootModuleName)\n        is RustType.Option -> PythonType.Optional(this.member.pythonType(pythonRootModuleName))\n        is RustType.Box -> this.member.pythonType(pythonRootModuleName)\n        is RustType.Dyn -> this.member.pythonType(pythonRootModuleName)\n        is RustType.Application ->\n            PythonType.Application(\n                this.type.pythonType(pythonRootModuleName),\n                this.args.map {\n                    it.pythonType(pythonRootModuleName)\n                },\n            )\n        is RustType.Opaque -> PythonType.Opaque(this.name, pythonRootModuleName, rustNamespace = this.namespace)\n        is RustType.MaybeConstrained -> this.member.pythonType(pythonRootModuleName)\n    }\n\n/**\n * Render this type, including references and generic parameters.\n * It generates something like `typing.Dict[String, String]`.\n */\nfun PythonType.render(fullyQualified: Boolean = true): String {\n    val namespace =\n        if (fullyQualified) {\n            this.namespace?.let { \"$it.\" } ?: \"\"\n        } else {\n            \"\"\n        }\n    val base =\n        when (this) {\n            is PythonType.None -> this.name\n            is PythonType.Bool -> this.name\n            is PythonType.Float -> this.name\n            is PythonType.Int -> this.name\n            is PythonType.Str -> this.name\n            is PythonType.Any -> this.name\n            is PythonType.Opaque -> this.name\n            is PythonType.List -> \"${this.name}[${this.member.render(fullyQualified)}]\"\n            is PythonType.Dict -> \"${this.name}[${this.key.render(fullyQualified)}, ${this.member.render(fullyQualified)}]\"\n            is PythonType.Set -> \"${this.name}[${this.member.render(fullyQualified)}]\"\n            is PythonType.Awaitable -> \"${this.name}[${this.member.render(fullyQualified)}]\"\n            is PythonType.Optional -> \"${this.name}[${this.member.render(fullyQualified)}]\"\n            is PythonType.AsyncIterator -> \"${this.name}[${this.member.render(fullyQualified)}]\"\n            is PythonType.Application -> {\n                val args = this.args.joinToString(\", \") { it.render(fullyQualified) }\n                \"${this.name}[$args]\"\n            }\n            is PythonType.Callable -> {\n                val args = this.args.joinToString(\", \") { it.render(fullyQualified) }\n                val rtype = this.rtype.render(fullyQualified)\n                \"${this.name}[[$args], $rtype]\"\n            }\n            is PythonType.Union -> {\n                val args = this.args.joinToString(\", \") { it.render(fullyQualified) }\n                \"${this.name}[$args]\"\n            }\n        }\n    return \"$namespace$base\"\n}\n\n/**\n * Renders [PythonType] with proper escaping for Docstrings.\n */\nfun PythonType.renderAsDocstring(): String =\n    this.render()\n        .replace(\"[\", \"\\\\[\")\n        .replace(\"]\", \"\\\\]\")\n"
  },
  {
    "path": "codegen-server/codegen-server-python/src/main/kotlin/software/amazon/smithy/rust/codegen/server/python/smithy/RustServerCodegenPythonPlugin.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.python.smithy\n\nimport software.amazon.smithy.build.PluginContext\nimport software.amazon.smithy.build.SmithyBuildPlugin\nimport software.amazon.smithy.codegen.core.ReservedWordSymbolProvider\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.ServiceShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustReservedWordSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.BaseSymbolMetadataProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProviderConfig\nimport software.amazon.smithy.rust.codegen.server.python.smithy.customizations.DECORATORS\nimport software.amazon.smithy.rust.codegen.server.smithy.ConstrainedShapeSymbolMetadataProvider\nimport software.amazon.smithy.rust.codegen.server.smithy.DeriveEqAndHashSymbolMetadataProvider\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerReservedWords\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerRustSettings\nimport software.amazon.smithy.rust.codegen.server.smithy.customizations.CustomValidationExceptionWithReasonDecorator\nimport software.amazon.smithy.rust.codegen.server.smithy.customizations.ServerRequiredCustomizations\nimport software.amazon.smithy.rust.codegen.server.smithy.customizations.SmithyValidationExceptionDecorator\nimport software.amazon.smithy.rust.codegen.server.smithy.customize.CombinedServerCodegenDecorator\nimport software.amazon.smithy.rust.codegen.server.smithy.customize.ServerCodegenDecorator\nimport java.util.logging.Level\nimport java.util.logging.Logger\n\n/**\n * Rust Server with Python bindings Codegen Plugin.\n *\n * This is the entrypoint for code generation, triggered by the smithy-build plugin.\n * `resources/META-INF.services/software.amazon.smithy.build.SmithyBuildPlugin` refers to this class by name which\n * enables the smithy-build plugin to invoke `execute` with all of the Smithy plugin context + models.\n */\nclass RustServerCodegenPythonPlugin : SmithyBuildPlugin {\n    private val logger = Logger.getLogger(javaClass.name)\n\n    override fun getName(): String = \"rust-server-codegen-python\"\n\n    /**\n     * See [software.amazon.smithy.rust.codegen.server.smithy.RustServerCodegenPlugin].\n     */\n    override fun execute(context: PluginContext) {\n        // Suppress extremely noisy logs about reserved words\n        Logger.getLogger(ReservedWordSymbolProvider::class.java.name).level = Level.OFF\n        // Discover [RustCodegenDecorators] on the classpath. [RustCodegenDecorator] return different types of\n        // customization. A customization is a function of:\n        // - location (e.g. the mutate section of an operation)\n        // - context (e.g. the of the operation)\n        // - writer: The active RustWriter at the given location\n        val codegenDecorator: CombinedServerCodegenDecorator =\n            CombinedServerCodegenDecorator.fromClasspath(\n                context,\n                ServerRequiredCustomizations(),\n                SmithyValidationExceptionDecorator(),\n                CustomValidationExceptionWithReasonDecorator(),\n                *DECORATORS,\n            )\n\n        // PythonServerCodegenVisitor is the main driver of code generation that traverses the model and generates code\n        logger.info(\"Loaded plugin to generate Rust/Python bindings for the server SSDK for projection ${context.projectionName}\")\n        PythonServerCodegenVisitor(context, codegenDecorator).execute()\n    }\n\n    companion object {\n        /**\n         * See [software.amazon.smithy.rust.codegen.server.smithy.RustServerCodegenPlugin].\n         */\n        fun baseSymbolProvider(\n            settings: ServerRustSettings,\n            model: Model,\n            serviceShape: ServiceShape,\n            rustSymbolProviderConfig: RustSymbolProviderConfig,\n            constrainedTypes: Boolean = true,\n            includeConstrainedShapeProvider: Boolean = true,\n            codegenDecorator: ServerCodegenDecorator,\n        ) = // Rename a set of symbols that do not implement `PyClass` and have been wrapped in\n            // `aws_smithy_http_server_python::types`.\n            PythonServerSymbolVisitor(settings, model, serviceShape = serviceShape, config = rustSymbolProviderConfig)\n                // Generate public constrained types for directly constrained shapes.\n                // In the Python server project, this is only done to generate constrained types for simple shapes (e.g.\n                // a `string` shape with the `length` trait), but these always remain `pub(crate)`.\n                .let {\n                    if (includeConstrainedShapeProvider) PythonConstrainedShapeSymbolProvider(it, serviceShape, constrainedTypes) else it\n                }\n                // Generate different types for EventStream shapes (e.g. transcribe streaming)\n                .let { PythonEventStreamSymbolProvider(rustSymbolProviderConfig.runtimeConfig, it) }\n                // Add Rust attributes (like `#[derive(PartialEq)]`) to generated shapes\n                .let { BaseSymbolMetadataProvider(it, additionalAttributes = listOf()) }\n                // Constrained shapes generate newtypes that need the same derives we place on types generated from aggregate shapes.\n                .let { ConstrainedShapeSymbolMetadataProvider(it, constrainedTypes) }\n                // Streaming shapes need different derives (e.g. they cannot derive Eq)\n                .let { PythonStreamingShapeMetadataProvider(it) }\n                // Derive `Eq` and `Hash` if possible.\n                .let { DeriveEqAndHashSymbolMetadataProvider(it) }\n                // Rename shapes that clash with Rust reserved words & and other SDK specific features e.g. `send()` cannot\n                // be the name of an operation input\n                .let { RustReservedWordSymbolProvider(it, ServerReservedWords) }\n                // Allows decorators to inject a custom symbol provider\n                .let { codegenDecorator.symbolProvider(it) }\n    }\n}\n"
  },
  {
    "path": "codegen-server/codegen-server-python/src/main/kotlin/software/amazon/smithy/rust/codegen/server/python/smithy/customizations/PythonServerCodegenDecorator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.python.smithy.customizations\n\nimport com.moandjiezana.toml.TomlWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.Feature\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.docs\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.DirectedWalker\nimport software.amazon.smithy.rust.codegen.core.smithy.RustCrate\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.LibRsCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.LibRsSection\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.ManifestCustomizations\nimport software.amazon.smithy.rust.codegen.core.util.toSnakeCase\nimport software.amazon.smithy.rust.codegen.server.python.smithy.PythonServerRuntimeType\nimport software.amazon.smithy.rust.codegen.server.python.smithy.generators.PythonServerModuleGenerator\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenContext\nimport software.amazon.smithy.rust.codegen.server.smithy.customizations.AddInternalServerErrorToAllOperationsDecorator\nimport software.amazon.smithy.rust.codegen.server.smithy.customize.ServerCodegenDecorator\n\n/**\n * Configure the [lib] section of `Cargo.toml`.\n *\n * [lib]\n * name = \"$CRATE_NAME\"\n * crate-type = [\"cdylib\"]\n */\nclass CdylibManifestDecorator : ServerCodegenDecorator {\n    override val name: String = \"CdylibDecorator\"\n    override val order: Byte = 0\n\n    override fun crateManifestCustomizations(codegenContext: ServerCodegenContext): ManifestCustomizations =\n        mapOf(\n            \"lib\" to\n                mapOf(\n                    // Library target names cannot contain hyphen names.\n                    \"name\" to codegenContext.settings.moduleName.toSnakeCase(),\n                    \"crate-type\" to listOf(\"cdylib\"),\n                ),\n        )\n}\n\n/**\n * Add `pub use aws_smithy_http_server_python::types::$TYPE` to lib.rs.\n */\nclass PubUsePythonTypes(private val codegenContext: ServerCodegenContext) : LibRsCustomization() {\n    override fun section(section: LibRsSection): Writable {\n        return when (section) {\n            is LibRsSection.Body ->\n                writable {\n                    docs(\"Re-exported Python types from supporting crates.\")\n                    rustBlock(\"pub mod python_types\") {\n                        rust(\"pub use #T;\", PythonServerRuntimeType.blob(codegenContext.runtimeConfig).toSymbol())\n                        rust(\"pub use #T;\", PythonServerRuntimeType.dateTime(codegenContext.runtimeConfig).toSymbol())\n                        rust(\"pub use #T;\", PythonServerRuntimeType.document(codegenContext.runtimeConfig).toSymbol())\n                    }\n                }\n            else -> emptySection\n        }\n    }\n}\n\n/**\n * Render the Python shared library module export.\n */\nclass PythonExportModuleDecorator : ServerCodegenDecorator {\n    override val name: String = \"PythonExportModuleDecorator\"\n    override val order: Byte = 0\n\n    override fun extras(\n        codegenContext: ServerCodegenContext,\n        rustCrate: RustCrate,\n    ) {\n        val service = codegenContext.settings.getService(codegenContext.model)\n        val serviceShapes = DirectedWalker(codegenContext.model).walkShapes(service)\n        PythonServerModuleGenerator(codegenContext, rustCrate, serviceShapes).render()\n    }\n}\n\n/**\n * Decorator applying the customization from [PubUsePythonTypes] class.\n */\nclass PubUsePythonTypesDecorator : ServerCodegenDecorator {\n    override val name: String = \"PubUsePythonTypesDecorator\"\n    override val order: Byte = 0\n\n    override fun libRsCustomizations(\n        codegenContext: ServerCodegenContext,\n        baseCustomizations: List<LibRsCustomization>,\n    ): List<LibRsCustomization> {\n        return baseCustomizations + PubUsePythonTypes(codegenContext)\n    }\n}\n\n/**\n * Generates `pyproject.toml` for the crate.\n *  - Configures Maturin as the build system\n *  - Configures Python source directory\n */\nclass PyProjectTomlDecorator : ServerCodegenDecorator {\n    override val name: String = \"PyProjectTomlDecorator\"\n    override val order: Byte = 0\n\n    override fun extras(\n        codegenContext: ServerCodegenContext,\n        rustCrate: RustCrate,\n    ) {\n        rustCrate.withFile(\"pyproject.toml\") {\n            val config =\n                mapOf(\n                    \"build-system\" to\n                        listOfNotNull(\n                            \"requires\" to listOfNotNull(\"maturin>=0.14,<0.15\"),\n                            \"build-backend\" to \"maturin\",\n                        ).toMap(),\n                    \"tool\" to\n                        listOfNotNull(\n                            \"maturin\" to\n                                listOfNotNull(\n                                    \"python-source\" to \"python\",\n                                ).toMap(),\n                        ).toMap(),\n                )\n            writeWithNoFormatting(TomlWriter().write(config))\n        }\n    }\n}\n\n/**\n * Adds `pyo3/extension-module` feature to default features.\n *\n * To be able to run `cargo test` with PyO3 we need two things:\n *  - Make `pyo3/extension-module` optional and default\n *  - Run tests with `cargo test --no-default-features`\n * See: https://pyo3.rs/main/faq#i-cant-run-cargo-test-or-i-cant-build-in-a-cargo-workspace-im-having-linker-issues-like-symbol-not-found-or-undefined-reference-to-_pyexc_systemerror\n */\nclass PyO3ExtensionModuleDecorator : ServerCodegenDecorator {\n    override val name: String = \"PyO3ExtensionModuleDecorator\"\n    override val order: Byte = 0\n\n    override fun extras(\n        codegenContext: ServerCodegenContext,\n        rustCrate: RustCrate,\n    ) {\n        // Add `pyo3/extension-module` to default features.\n        rustCrate.mergeFeature(Feature(\"extension-module\", true, listOf(\"pyo3/extension-module\")))\n    }\n}\n\n/**\n * Generates `__init__.py` for the Python source.\n *\n * This file allows Python module to be imported like:\n * ```\n * import pokemon_service_server_sdk\n * pokemon_service_server_sdk.App()\n * ```\n * instead of:\n * ```\n * from pokemon_service_server_sdk import pokemon_service_server_sdk\n * ```\n */\nclass InitPyDecorator : ServerCodegenDecorator {\n    override val name: String = \"InitPyDecorator\"\n    override val order: Byte = 0\n\n    override fun extras(\n        codegenContext: ServerCodegenContext,\n        rustCrate: RustCrate,\n    ) {\n        val libName = codegenContext.settings.moduleName.toSnakeCase()\n\n        rustCrate.withFile(\"python/$libName/__init__.py\") {\n            writeWithNoFormatting(\n                \"\"\"\n                from .$libName import *\n\n                __doc__ = $libName.__doc__\n                if hasattr($libName, \"__all__\"):\n                    __all__ = $libName.__all__\n                \"\"\".trimIndent(),\n            )\n        }\n    }\n}\n\n/**\n * Generates `py.typed` for the Python source.\n *\n * This marker file is required to be PEP 561 compliant stub package.\n * Type definitions will be ignored by `mypy` if the package is not PEP 561 compliant:\n * https://mypy.readthedocs.io/en/stable/running_mypy.html#missing-library-stubs-or-py-typed-marker\n */\nclass PyTypedMarkerDecorator : ServerCodegenDecorator {\n    override val name: String = \"PyTypedMarkerDecorator\"\n    override val order: Byte = 0\n\n    override fun extras(\n        codegenContext: ServerCodegenContext,\n        rustCrate: RustCrate,\n    ) {\n        val libName = codegenContext.settings.moduleName.toSnakeCase()\n\n        rustCrate.withFile(\"python/$libName/py.typed\") {\n            writeWithNoFormatting(\"\")\n        }\n    }\n}\n\n/**\n * Copies the stubgen scripts to the generated crate root.\n *\n * The shell script `stubgen.sh` runs a quick build and uses `stubgen.py` to generate mypy compatibile\n * types stubs for the project.\n */\nclass AddStubgenScriptDecorator : ServerCodegenDecorator {\n    override val name: String = \"AddStubgenScriptDecorator\"\n    override val order: Byte = 0\n\n    override fun extras(\n        codegenContext: ServerCodegenContext,\n        rustCrate: RustCrate,\n    ) {\n        val stubgenPythonContent = this::class.java.getResource(\"/stubgen.py\").readText()\n        rustCrate.withFile(\"stubgen.py\") {\n            writeWithNoFormatting(\"$stubgenPythonContent\")\n        }\n        val stubgenShellContent = this::class.java.getResource(\"/stubgen.sh\").readText()\n        rustCrate.withFile(\"stubgen.sh\") {\n            writeWithNoFormatting(\"$stubgenShellContent\")\n        }\n    }\n}\n\nval DECORATORS =\n    arrayOf(\n        /*\n         * Add the [InternalServerError] error to all operations.\n         * This is done because the Python interpreter can raise exceptions during execution.\n         */\n        AddInternalServerErrorToAllOperationsDecorator(),\n        // Add the [lib] section to Cargo.toml to configure the generation of the shared library.\n        CdylibManifestDecorator(),\n        // Add `pub use` of `aws_smithy_http_server_python::types`.\n        PubUsePythonTypesDecorator(),\n        // Render the Python shared library export.\n        PythonExportModuleDecorator(),\n        // Generate `pyproject.toml` for the crate.\n        PyProjectTomlDecorator(),\n        // Add PyO3 extension module feature.\n        PyO3ExtensionModuleDecorator(),\n        // Generate `__init__.py` for the Python source.\n        InitPyDecorator(),\n        // Generate `py.typed` for the Python source.\n        PyTypedMarkerDecorator(),\n        // Generate scripts for stub generation.\n        AddStubgenScriptDecorator(),\n    )\n"
  },
  {
    "path": "codegen-server/codegen-server-python/src/main/kotlin/software/amazon/smithy/rust/codegen/server/python/smithy/generators/ConstrainedPythonBlobGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.python.smithy.generators\n\nimport software.amazon.smithy.codegen.core.Symbol\nimport software.amazon.smithy.model.shapes.BlobShape\nimport software.amazon.smithy.model.traits.LengthTrait\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustType\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.join\nimport software.amazon.smithy.rust.codegen.core.rustlang.render\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.makeMaybeConstrained\nimport software.amazon.smithy.rust.codegen.core.smithy.rustType\nimport software.amazon.smithy.rust.codegen.core.util.getTrait\nimport software.amazon.smithy.rust.codegen.core.util.orNull\nimport software.amazon.smithy.rust.codegen.server.python.smithy.PythonServerRuntimeType\nimport software.amazon.smithy.rust.codegen.server.smithy.InlineModuleCreator\nimport software.amazon.smithy.rust.codegen.server.smithy.PubCrateConstraintViolationSymbolProvider\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenContext\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.BlobLength\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.TraitInfo\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.ValidationExceptionConversionGenerator\n\nclass ConstrainedPythonBlobGenerator(\n    val codegenContext: ServerCodegenContext,\n    private val inlineModuleCreator: InlineModuleCreator,\n    val writer: RustWriter,\n    val shape: BlobShape,\n    private val validationExceptionConversionGenerator: ValidationExceptionConversionGenerator,\n) {\n    val constrainedShapeSymbolProvider = codegenContext.constrainedShapeSymbolProvider\n    val publicConstrainedTypes = codegenContext.settings.codegenConfig.publicConstrainedTypes\n    private val constraintViolationSymbolProvider =\n        with(codegenContext.constraintViolationSymbolProvider) {\n            if (publicConstrainedTypes) {\n                this\n            } else {\n                PubCrateConstraintViolationSymbolProvider(this)\n            }\n        }\n    val constraintViolation = constraintViolationSymbolProvider.toSymbol(shape)\n    private val blobConstraintsInfo: List<BlobLength> =\n        listOf(LengthTrait::class.java)\n            .mapNotNull { shape.getTrait(it).orNull() }\n            .map { BlobLength(it) }\n    private val constraintsInfo: List<TraitInfo> = blobConstraintsInfo.map { it.toTraitInfo() }\n\n    fun render() {\n        val symbol = constrainedShapeSymbolProvider.toSymbol(shape)\n        val blobType = PythonServerRuntimeType.blob(codegenContext.runtimeConfig).toSymbol().rustType()\n        renderFrom(symbol, blobType)\n        renderTryFrom(symbol, blobType)\n    }\n\n    fun renderFrom(\n        symbol: Symbol,\n        blobType: RustType,\n    ) {\n        val name = symbol.name\n        val inner = blobType.render()\n        writer.rustTemplate(\n            \"\"\"\n            impl #{From}<$inner> for #{MaybeConstrained} {\n                fn from(value: $inner) -> Self {\n                    Self::Unconstrained(value.into())\n                }\n            }\n\n            impl #{From}<$name> for $inner {\n                fn from(value: $name) -> Self {\n                    value.into_inner().into()\n                }\n            }\n            \"\"\",\n            \"MaybeConstrained\" to symbol.makeMaybeConstrained(),\n            \"From\" to RuntimeType.From,\n        )\n    }\n\n    fun renderTryFrom(\n        symbol: Symbol,\n        blobType: RustType,\n    ) {\n        val name = symbol.name\n        val inner = blobType.render()\n        writer.rustTemplate(\n            \"\"\"\n            impl #{TryFrom}<$inner> for $name {\n                type Error = #{ConstraintViolation};\n\n                fn try_from(value: $inner) -> #{Result}<Self, Self::Error> {\n                    value.try_into()\n                }\n            }\n            \"\"\",\n            \"TryFrom\" to RuntimeType.TryFrom,\n            \"ConstraintViolation\" to constraintViolation,\n            \"TryFromChecks\" to constraintsInfo.map { it.tryFromCheck }.join(\"\\n\"),\n            *RuntimeType.preludeScope,\n        )\n    }\n}\n"
  },
  {
    "path": "codegen-server/codegen-server-python/src/main/kotlin/software/amazon/smithy/rust/codegen/server/python/smithy/generators/PythonApplicationGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.python.smithy.generators\n\nimport software.amazon.smithy.model.knowledge.TopDownIndex\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.traits.DocumentationTrait\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustReservedWords\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlockTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenContext\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.util.getTrait\nimport software.amazon.smithy.rust.codegen.core.util.inputShape\nimport software.amazon.smithy.rust.codegen.core.util.outputShape\nimport software.amazon.smithy.rust.codegen.core.util.toPascalCase\nimport software.amazon.smithy.rust.codegen.core.util.toSnakeCase\nimport software.amazon.smithy.rust.codegen.server.python.smithy.PythonServerCargoDependency\nimport software.amazon.smithy.rust.codegen.server.python.smithy.PythonType\nimport software.amazon.smithy.rust.codegen.server.python.smithy.renderAsDocstring\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerCargoDependency\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.protocol.ServerProtocol\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerRustModule.Error as ErrorModule\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerRustModule.Input as InputModule\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerRustModule.Output as OutputModule\n\n/**\n * Generates a Python compatible application and server that can be configured from Python.\n *\n * Example:\n *     from pool import DatabasePool\n *     from my_library import App, OperationInput, OperationOutput\n *     @dataclass\n *     class Context:\n *         db = DatabasePool()\n *\n *     app = App()\n *     app.context(Context())\n *\n *     @app.operation\n *     def operation(input: OperationInput, ctx: State) -> OperationOutput:\n *        description = await ctx.db.get_description(input.name)\n *        return OperationOutput(description)\n *\n *     app.run()\n *\n * The application holds a mapping between operation names (lowercase, snakecase),\n * the context as defined in Python and some task local with the Python event loop\n * for the current process.\n *\n * The application exposes several methods to Python:\n * * `App()`: constructor to create an instance of `App`.\n * * `run()`: run the application on a number of workers.\n * * `context()`: register the context object that is passed to the Python handlers.\n * * One register method per operation that can be used as decorator. For example if\n *   the model has one operation called `RegisterServer`, it will codegenerate a method\n *   of `App` called `register_service()` that can be used to decorate the Python implementation\n *   of this operation.\n *\n * This class also renders the implementation of the `aws_smithy_http_server_python::PyServer` trait,\n * that abstracts the processes / event loops / workers lifecycles.\n */\nclass PythonApplicationGenerator(\n    codegenContext: CodegenContext,\n    private val protocol: ServerProtocol,\n) {\n    private val index = TopDownIndex.of(codegenContext.model)\n    private val operations =\n        index.getContainedOperations(codegenContext.serviceShape).toSortedSet(\n            compareBy {\n                it.id\n            },\n        ).toList()\n    private val symbolProvider = codegenContext.symbolProvider\n    private val libName = codegenContext.settings.moduleName.toSnakeCase()\n    private val runtimeConfig = codegenContext.runtimeConfig\n    private val service = codegenContext.serviceShape\n    private val serviceName = service.id.name.toPascalCase()\n    private val model = codegenContext.model\n    private val codegenScope =\n        arrayOf(\n            \"SmithyPython\" to PythonServerCargoDependency.smithyHttpServerPython(runtimeConfig).toType(),\n            \"SmithyServer\" to ServerCargoDependency.smithyHttpServer(runtimeConfig).toType(),\n            \"pyo3\" to PythonServerCargoDependency.PyO3.toType(),\n            \"pyo3_asyncio\" to PythonServerCargoDependency.PyO3Asyncio.toType(),\n            \"tokio\" to PythonServerCargoDependency.Tokio.toType(),\n            \"tracing\" to PythonServerCargoDependency.Tracing.toType(),\n            \"tower\" to PythonServerCargoDependency.Tower.toType(),\n            \"tower_http\" to PythonServerCargoDependency.TowerHttp.toType(),\n            \"num_cpus\" to PythonServerCargoDependency.NumCpus.toType(),\n            \"hyper\" to PythonServerCargoDependency.Hyper.toType(),\n            \"HashMap\" to RuntimeType.HashMap,\n            \"parking_lot\" to PythonServerCargoDependency.ParkingLot.toType(),\n            \"http\" to RuntimeType.Http0x,\n        )\n\n    fun render(writer: RustWriter) {\n        renderPyApplicationRustDocs(writer)\n        renderAppStruct(writer)\n        renderAppDefault(writer)\n        renderAppClone(writer)\n        renderPyAppTrait(writer)\n        renderPyMethods(writer)\n    }\n\n    fun renderAppStruct(writer: RustWriter) {\n        writer.rustTemplate(\n            \"\"\"\n            ##[#{pyo3}::pyclass]\n            ##[derive(Debug)]\n            /// :generic Ctx:\n            /// :extends typing.Generic\\[Ctx\\]:\n            /// :rtype None:\n            pub struct App {\n                handlers: #{HashMap}<String, #{SmithyPython}::PyHandler>,\n                middlewares: Vec<#{SmithyPython}::PyMiddlewareHandler>,\n                context: Option<#{pyo3}::PyObject>,\n                workers: #{parking_lot}::Mutex<Vec<#{pyo3}::PyObject>>,\n            }\n            \"\"\",\n            *codegenScope,\n        )\n    }\n\n    private fun renderAppClone(writer: RustWriter) {\n        writer.rustTemplate(\n            \"\"\"\n            impl Clone for App {\n                fn clone(&self) -> Self {\n                    Self {\n                        handlers: self.handlers.clone(),\n                        middlewares: self.middlewares.clone(),\n                        context: self.context.clone(),\n                        workers: #{parking_lot}::Mutex::new(vec![]),\n                    }\n                }\n            }\n            \"\"\",\n            *codegenScope,\n        )\n    }\n\n    private fun renderAppDefault(writer: RustWriter) {\n        writer.rustTemplate(\n            \"\"\"\n            impl Default for App {\n                fn default() -> Self {\n                    Self {\n                        handlers: Default::default(),\n                        middlewares: vec![],\n                        context: None,\n                        workers: #{parking_lot}::Mutex::new(vec![]),\n                    }\n                }\n            }\n            \"\"\",\n            \"Protocol\" to protocol.markerStruct(),\n            *codegenScope,\n        )\n    }\n\n    private fun renderPyAppTrait(writer: RustWriter) {\n        writer.rustBlockTemplate(\n            \"\"\"\n            impl #{SmithyPython}::PyApp for App\n            \"\"\",\n            *codegenScope,\n        ) {\n            rustTemplate(\n                \"\"\"\n                fn workers(&self) -> &#{parking_lot}::Mutex<Vec<#{pyo3}::PyObject>> {\n                    &self.workers\n                }\n                fn context(&self) -> &Option<#{pyo3}::PyObject> {\n                    &self.context\n                }\n                fn handlers(&mut self) -> &mut #{HashMap}<String, #{SmithyPython}::PyHandler> {\n                    &mut self.handlers\n                }\n                \"\"\",\n                *codegenScope,\n            )\n\n            rustBlockTemplate(\n                \"\"\"\n                fn build_service(&mut self, event_loop: &#{pyo3}::PyAny) -> #{pyo3}::PyResult<\n                    #{tower}::util::BoxCloneService<\n                        #{http}::Request<#{SmithyServer}::body::Body>,\n                        #{http}::Response<#{SmithyServer}::body::BoxBody>,\n                        std::convert::Infallible\n                    >\n                >\n                \"\"\",\n                *codegenScope,\n            ) {\n                rustTemplate(\n                    \"\"\"\n                    let builder = crate::service::$serviceName::builder_without_plugins();\n                    \"\"\",\n                    *codegenScope,\n                )\n                for (operation in operations) {\n                    val fnName = RustReservedWords.escapeIfNeeded(symbolProvider.toSymbol(operation).name.toSnakeCase())\n                    rustTemplate(\n                        \"\"\"\n                        let ${fnName}_locals = #{pyo3_asyncio}::TaskLocals::new(event_loop);\n                        let handler = self.handlers.get(\"$fnName\").expect(\"Python handler for operation `$fnName` not found\").clone();\n                        let builder = builder.$fnName(move |input, state| {\n                            #{pyo3_asyncio}::tokio::scope(${fnName}_locals.clone(), crate::python_operation_adaptor::$fnName(input, state, handler.clone()))\n                        });\n                        \"\"\",\n                        *codegenScope,\n                    )\n                }\n                rustTemplate(\n                    \"\"\"\n                    let mut service = #{tower}::util::BoxCloneService::new(builder.build().expect(\"one or more operations do not have a registered handler; this is a bug in the Python code generator, please file a bug report under https://github.com/smithy-lang/smithy-rs/issues\"));\n\n                    {\n                        use #{tower}::Layer;\n                        #{tracing}::trace!(\"adding middlewares to rust python router\");\n                        let mut middlewares = self.middlewares.clone();\n                        // Reverse the middlewares, so they run with same order as they defined\n                        middlewares.reverse();\n                        for handler in middlewares {\n                            #{tracing}::trace!(name = &handler.name, \"adding python middleware\");\n                            let locals = #{pyo3_asyncio}::TaskLocals::new(event_loop);\n                            let layer = #{SmithyPython}::PyMiddlewareLayer::<#{Protocol}>::new(handler, locals);\n                            service = #{tower}::util::BoxCloneService::new(layer.layer(service));\n                        }\n                    }\n                    Ok(service)\n                    \"\"\",\n                    \"Protocol\" to protocol.markerStruct(),\n                    *codegenScope,\n                )\n            }\n        }\n    }\n\n    private fun renderPyMethods(writer: RustWriter) {\n        writer.rustBlockTemplate(\n            \"\"\"\n            ##[#{pyo3}::pymethods]\n            impl App\n            \"\"\",\n            *codegenScope,\n        ) {\n            val middlewareRequest = PythonType.Opaque(\"Request\", libName, rustNamespace = \"crate::middleware\")\n            val middlewareResponse = PythonType.Opaque(\"Response\", libName, rustNamespace = \"crate::middleware\")\n            val middlewareNext = PythonType.Callable(listOf(middlewareRequest), PythonType.Awaitable(middlewareResponse))\n            val middlewareFunc = PythonType.Callable(listOf(middlewareRequest, middlewareNext), PythonType.Awaitable(middlewareResponse))\n            val tlsConfig = PythonType.Opaque(\"TlsConfig\", libName, rustNamespace = \"crate::tls\")\n\n            rustTemplate(\n                \"\"\"\n                /// Create a new [App].\n                ##[new]\n                pub fn new() -> Self {\n                    Self::default()\n                }\n\n                /// Register a context object that will be shared between handlers.\n                ///\n                /// :param context Ctx:\n                /// :rtype ${PythonType.None.renderAsDocstring()}:\n                ##[pyo3(text_signature = \"(${'$'}self, context)\")]\n                pub fn context(&mut self, context: #{pyo3}::PyObject) {\n                   self.context = Some(context);\n                }\n\n                /// Register a Python function to be executed inside a Tower middleware layer.\n                ///\n                /// :param func ${middlewareFunc.renderAsDocstring()}:\n                /// :rtype ${PythonType.None.renderAsDocstring()}:\n                ##[pyo3(text_signature = \"(${'$'}self, func)\")]\n                pub fn middleware(&mut self, py: #{pyo3}::Python, func: #{pyo3}::PyObject) -> #{pyo3}::PyResult<()> {\n                    let handler = #{SmithyPython}::PyMiddlewareHandler::new(py, func)?;\n                    #{tracing}::trace!(\n                        name = &handler.name,\n                        is_coroutine = handler.is_coroutine,\n                        \"registering middleware function\",\n                    );\n                    self.middlewares.push(handler);\n                    Ok(())\n                }\n\n                /// Main entrypoint: start the server on multiple workers.\n                ///\n                /// :param address ${PythonType.Optional(PythonType.Str).renderAsDocstring()}:\n                /// :param port ${PythonType.Optional(PythonType.Int).renderAsDocstring()}:\n                /// :param backlog ${PythonType.Optional(PythonType.Int).renderAsDocstring()}:\n                /// :param workers ${PythonType.Optional(PythonType.Int).renderAsDocstring()}:\n                /// :param tls ${PythonType.Optional(tlsConfig).renderAsDocstring()}:\n                /// :rtype ${PythonType.None.renderAsDocstring()}:\n                ##[pyo3(text_signature = \"(${'$'}self, address=None, port=None, backlog=None, workers=None, tls=None)\")]\n                pub fn run(\n                    &mut self,\n                    py: #{pyo3}::Python,\n                    address: Option<String>,\n                    port: Option<i32>,\n                    backlog: Option<i32>,\n                    workers: Option<usize>,\n                    tls: Option<#{SmithyPython}::tls::PyTlsConfig>,\n                ) -> #{pyo3}::PyResult<()> {\n                    use #{SmithyPython}::PyApp;\n                    self.run_server(py, address, port, backlog, workers, tls)\n                }\n\n                /// Lambda entrypoint: start the server on Lambda.\n                ///\n                /// :rtype ${PythonType.None.renderAsDocstring()}:\n                ##[pyo3(text_signature = \"(${'$'}self)\")]\n                pub fn run_lambda(\n                    &mut self,\n                    py: #{pyo3}::Python,\n                ) -> #{pyo3}::PyResult<()> {\n                    use #{SmithyPython}::PyApp;\n                    self.run_lambda_handler(py)\n                }\n\n                /// Build the service and start a single worker.\n                ##[pyo3(text_signature = \"(${'$'}self, socket, worker_number, tls=None)\")]\n                pub fn start_worker(\n                    &mut self,\n                    py: pyo3::Python,\n                    socket: &pyo3::PyCell<#{SmithyPython}::PySocket>,\n                    worker_number: isize,\n                    tls: Option<#{SmithyPython}::tls::PyTlsConfig>,\n                ) -> pyo3::PyResult<()> {\n                    use #{SmithyPython}::PyApp;\n                    let event_loop = self.configure_python_event_loop(py)?;\n                    let service = self.build_and_configure_service(py, event_loop)?;\n                    self.start_hyper_worker(py, socket, event_loop, service, worker_number, tls)\n                }\n                \"\"\",\n                *codegenScope,\n            )\n            operations.map { operation ->\n                val operationName = symbolProvider.toSymbol(operation).name\n                val fnName = RustReservedWords.escapeIfNeeded(symbolProvider.toSymbol(operation).name.toSnakeCase())\n\n                val input = PythonType.Opaque(\"${operationName}Input\", libName, rustNamespace = \"crate::input\")\n                val output = PythonType.Opaque(\"${operationName}Output\", libName, rustNamespace = \"crate::output\")\n                val context = PythonType.Opaque(\"Ctx\", libName)\n                val returnType = PythonType.Union(listOf(output, PythonType.Awaitable(output)))\n                val handler =\n                    PythonType.Union(\n                        listOf(\n                            PythonType.Callable(\n                                listOf(input, context),\n                                returnType,\n                            ),\n                            PythonType.Callable(\n                                listOf(input),\n                                returnType,\n                            ),\n                        ),\n                    )\n\n                rustTemplate(\n                    \"\"\"\n                    /// Method to register `$fnName` Python implementation inside the handlers map.\n                    /// It can be used as a function decorator in Python.\n                    ///\n                    /// :param func ${handler.renderAsDocstring()}:\n                    /// :rtype ${PythonType.None.renderAsDocstring()}:\n                    ##[pyo3(text_signature = \"(${'$'}self, func)\")]\n                    pub fn $fnName(&mut self, py: #{pyo3}::Python, func: #{pyo3}::PyObject) -> #{pyo3}::PyResult<()> {\n                        use #{SmithyPython}::PyApp;\n                        self.register_operation(py, \"$fnName\", func)\n                    }\n                    \"\"\",\n                    *codegenScope,\n                )\n            }\n        }\n    }\n\n    private fun renderPyApplicationRustDocs(writer: RustWriter) {\n        writer.rust(\n            \"\"\"\n            ##[allow(clippy::tabs_in_doc_comments)]\n            /// Main Python application, used to register operations and context and start multiple\n            /// workers on the same shared socket.\n            ///\n            /// Operations can be registered using the application object as a decorator (`@app.operation_name`).\n            ///\n            /// Here's a full example to get you started:\n            ///\n            /// ```python\n            \"\"\".trimIndent(),\n        )\n        writer.rust(\n            \"\"\"\n            /// from $libName import ${InputModule.name}\n            /// from $libName import ${OutputModule.name}\n            \"\"\".trimIndent(),\n        )\n        if (operations.any { it.errors.isNotEmpty() }) {\n            writer.rust(\"\"\"/// from $libName import ${ErrorModule.name}\"\"\".trimIndent())\n        }\n        writer.rust(\n            \"\"\"\n            /// from $libName import middleware\n            /// from $libName import App\n            ///\n            /// @dataclass\n            /// class Context:\n            ///     counter: int = 0\n            ///\n            /// app = App()\n            /// app.context(Context())\n            ///\n            /// @app.request_middleware\n            /// def request_middleware(request: middleware::Request):\n            ///     if request.get_header(\"x-amzn-id\") != \"secret\":\n            ///         raise middleware.MiddlewareException(\"Unsupported `x-amz-id` header\", 401)\n            ///\n            \"\"\".trimIndent(),\n        )\n        writer.operationImplementationStubs(operations)\n        writer.rust(\n            \"\"\"\n            ///\n            /// app.run()\n            /// ```\n            ///\n            /// Any of operations above can be written as well prepending the `async` keyword and\n            /// the Python application will automatically handle it and schedule it on the event loop for you.\n            \"\"\".trimIndent(),\n        )\n    }\n\n    private fun RustWriter.operationImplementationStubs(operations: List<OperationShape>) =\n        rust(\n            operations.joinToString(\"\\n///\\n\") {\n                val operationDocumentation = it.getTrait<DocumentationTrait>()?.value\n                val ret =\n                    if (!operationDocumentation.isNullOrBlank()) {\n                        operationDocumentation.replace(\"#\", \"##\").prependIndent(\"/// ## \") + \"\\n\"\n                    } else {\n                        \"\"\n                    }\n                ret +\n                    \"\"\"\n                    /// ${it.signature()}:\n                    ///     raise NotImplementedError\n                    \"\"\".trimIndent()\n            },\n        )\n\n    /**\n     * Returns the function signature for an operation handler implementation. Used in the documentation.\n     */\n    private fun OperationShape.signature(): String {\n        val inputSymbol = symbolProvider.toSymbol(inputShape(model))\n        val outputSymbol = symbolProvider.toSymbol(outputShape(model))\n        val inputT = \"${InputModule.name}::${inputSymbol.name}\"\n        val outputT = \"${OutputModule.name}::${outputSymbol.name}\"\n        val operationName = symbolProvider.toSymbol(this).name.toSnakeCase()\n        return \"@app.$operationName\\n/// def $operationName(input: $inputT, ctx: Context) -> $outputT\"\n    }\n}\n"
  },
  {
    "path": "codegen-server/codegen-server-python/src/main/kotlin/software/amazon/smithy/rust/codegen/server/python/smithy/generators/PythonServerEnumGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.python.smithy.generators\n\nimport software.amazon.smithy.model.shapes.StringShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.EnumGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.EnumGeneratorContext\nimport software.amazon.smithy.rust.codegen.core.util.dq\nimport software.amazon.smithy.rust.codegen.server.python.smithy.PythonServerCargoDependency\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenContext\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.ConstrainedEnum\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.ValidationExceptionConversionGenerator\n\n/**\n * To share enums defined in Rust with Python, `pyo3` provides the `PyClass` trait.\n * This class generates enums definitions, implements the `PyClass` trait and adds\n * some utility functions like `__str__()` and `__repr__()`.\n */\nclass PythonConstrainedEnum(\n    codegenContext: ServerCodegenContext,\n    shape: StringShape,\n    validationExceptionConversionGenerator: ValidationExceptionConversionGenerator,\n) : ConstrainedEnum(codegenContext, shape, validationExceptionConversionGenerator) {\n    private val pyO3 = PythonServerCargoDependency.PyO3.toType()\n\n    override fun additionalEnumAttributes(context: EnumGeneratorContext): List<Attribute> =\n        listOf(Attribute(pyO3.resolve(\"pyclass\")))\n\n    override fun additionalEnumImpls(context: EnumGeneratorContext): Writable =\n        writable {\n            // Unnamed enums are generated as constrained newtype structs, not Rust enums,\n            // so PyO3 enum-specific impls (name getter, match arms) don't apply.\n            if (!context.enumTrait.hasNames()) return@writable\n\n            Attribute(pyO3.resolve(\"pymethods\")).render(this)\n            rustTemplate(\n                \"\"\"\n                impl ${context.enumName} {\n                    #{name_method:W}\n                    ##[getter]\n                    pub fn value(&self) -> &str {\n                        self.as_str()\n                    }\n                    fn __repr__(&self) -> String  {\n                        self.as_str().to_owned()\n                    }\n                    fn __str__(&self) -> String {\n                        self.as_str().to_owned()\n                    }\n                }\n                \"\"\",\n                \"name_method\" to pyEnumName(context),\n            )\n        }\n\n    private fun pyEnumName(context: EnumGeneratorContext): Writable =\n        writable {\n            rustBlock(\n                \"\"\"\n                ##[getter]\n                pub fn name(&self) -> &str\n                \"\"\",\n            ) {\n                rustBlock(\"match self\") {\n                    context.sortedMembers.forEach { member ->\n                        val memberName = member.name()?.name\n                        rust(\"\"\"${context.enumName}::$memberName => ${memberName?.dq()},\"\"\")\n                    }\n                }\n            }\n        }\n}\n\nclass PythonServerEnumGenerator(\n    codegenContext: ServerCodegenContext,\n    shape: StringShape,\n    validationExceptionConversionGenerator: ValidationExceptionConversionGenerator,\n) : EnumGenerator(\n        codegenContext.model,\n        codegenContext.symbolProvider,\n        shape,\n        PythonConstrainedEnum(codegenContext, shape, validationExceptionConversionGenerator),\n        emptyList(),\n    )\n"
  },
  {
    "path": "codegen-server/codegen-server-python/src/main/kotlin/software/amazon/smithy/rust/codegen/server/python/smithy/generators/PythonServerEventStreamErrorGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.python.smithy.generators\n\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.shapes.UnionShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlockTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.transformers.eventStreamErrors\nimport software.amazon.smithy.rust.codegen.server.python.smithy.PythonServerCargoDependency\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.ServerOperationErrorGenerator\n\n/**\n * Generates Python compatible error types for event streaming union types.\n * It just uses [ServerOperationErrorGenerator] under the hood to generate pure Rust error types and then adds\n * some implementation to errors to make it possible to moving errors from Rust to Python and vice-versa.\n * It adds following implementations to errors:\n *      - `pyo3::FromPyObject`: To allow extracting Rust errors from Python errors\n *      - `pyo3::IntoPy`: To allow converting Rust errors to Python errors\n *      - `impl From<#{Error}> for pyo3::PyErr`: To allow converting Rust errors to Python exceptions,\n *                                               it uses previous impl to convert errors\n */\nclass PythonServerEventStreamErrorGenerator(\n    private val model: Model,\n    private val symbolProvider: RustSymbolProvider,\n    val shape: UnionShape,\n) : ServerOperationErrorGenerator(\n        model,\n        symbolProvider,\n        shape,\n    ) {\n    private val errorSymbol = symbolProvider.symbolForEventStreamError(shape)\n    private val errors =\n        shape.eventStreamErrors().map {\n            model.expectShape(it.asMemberShape().get().target, StructureShape::class.java)\n        }\n\n    private val pyO3 = PythonServerCargoDependency.PyO3.toType()\n\n    override fun render(writer: RustWriter) {\n        super.render(writer)\n        renderFromPyObjectImpl(writer)\n        renderIntoPyImpl(writer)\n        renderIntoPyErrImpl(writer)\n    }\n\n    private fun renderFromPyObjectImpl(writer: RustWriter) {\n        writer.rustBlockTemplate(\"impl<'source> #{PyO3}::FromPyObject<'source> for ${errorSymbol.name}\", \"PyO3\" to pyO3) {\n            writer.rustBlockTemplate(\"fn extract(obj: &'source #{PyO3}::PyAny) -> #{PyO3}::PyResult<Self>\", \"PyO3\" to pyO3) {\n                errors.forEach {\n                    val symbol = symbolProvider.toSymbol(it)\n                    writer.rust(\n                        \"\"\"\n                        if let Ok(it) = obj.extract::<#T>() {\n                            return Ok(Self::${symbol.name}(it));\n                        }\n                        \"\"\",\n                        symbol,\n                    )\n                }\n                writer.rustTemplate(\n                    \"\"\"\n                    Err(#{PyO3}::exceptions::PyTypeError::new_err(\n                        format!(\n                            \"failed to extract '${errorSymbol.name}' from '{}'\",\n                            obj\n                        )\n                    ))\n                    \"\"\",\n                    \"PyO3\" to pyO3,\n                )\n            }\n        }\n    }\n\n    private fun renderIntoPyImpl(writer: RustWriter) {\n        writer.rustBlockTemplate(\"impl #{PyO3}::IntoPy<#{PyO3}::PyObject> for ${errorSymbol.name}\", \"PyO3\" to pyO3) {\n            writer.rustBlockTemplate(\"fn into_py(self, py: #{PyO3}::Python<'_>) -> #{PyO3}::PyObject\", \"PyO3\" to pyO3) {\n                writer.rustBlock(\"match self\") {\n                    errors.forEach {\n                        val symbol = symbolProvider.toSymbol(it)\n                        writer.rustTemplate(\n                            \"\"\"\n                            Self::${symbol.name}(it) => match #{PyO3}::Py::new(py, it) {\n                                Ok(it) => it.into_py(py),\n                                Err(err) => err.into_py(py),\n                            }\n                            \"\"\",\n                            \"PyO3\" to pyO3,\n                        )\n                    }\n                }\n            }\n        }\n    }\n\n    private fun renderIntoPyErrImpl(writer: RustWriter) {\n        writer.rustBlockTemplate(\"impl #{From}<${errorSymbol.name}> for #{PyO3}::PyErr\", \"PyO3\" to pyO3, \"From\" to RuntimeType.From) {\n            writer.rustBlockTemplate(\"fn from(err: ${errorSymbol.name}) -> #{PyO3}::PyErr\", \"PyO3\" to pyO3) {\n                writer.rustTemplate(\n                    \"\"\"\n                    #{PyO3}::Python::with_gil(|py| {\n                        let py_err = #{PyO3}::IntoPy::into_py(err, py);\n                        #{PyO3}::PyErr::from_value(py_err.as_ref(py))\n                    })\n                    \"\"\",\n                    \"PyO3\" to pyO3,\n                )\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-server/codegen-server-python/src/main/kotlin/software/amazon/smithy/rust/codegen/server/python/smithy/generators/PythonServerEventStreamWrapperGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.python.smithy.generators\n\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenContext\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.expectRustMetadata\nimport software.amazon.smithy.rust.codegen.core.util.isOutputEventStream\nimport software.amazon.smithy.rust.codegen.core.util.toPascalCase\nimport software.amazon.smithy.rust.codegen.server.python.smithy.PythonEventStreamSymbolProvider\nimport software.amazon.smithy.rust.codegen.server.python.smithy.PythonServerCargoDependency\n\n/**\n * Generates Python wrapper types for event streaming members.\n * In pure Rust we use `aws_smithy_http::event_stream::{Receiver,EventStreamSender}<T, E>` for event streaming members,\n * this is not viable for Python because PyO3 expects following for a type to be exposed to Python, but we fail to satisfy:\n *  - It should be `Clone` and `Send`\n *  - It shouldn't have any generic parameters\n *\n *  So we generate wrapper types for every streaming member, that looks like:\n *  ```rust\n *  #[pyo3::pyclass]\n *  #[derive(std::clone::Clone, std::fmt::Debug)]\n *  pub struct CapturePokemonInputEventsReceiver {\n *      // Arc makes it cloneable\n *      inner: std::sync::Arc<\n *          // Mutex makes it sendable\n *          tokio::sync::Mutex<\n *              // Filling generic args with specific impls make outer type non-generic\n *              aws_smithy_http::event_stream::Receiver<\n *                  crate::model::AttemptCapturingPokemonEvent,\n *                  crate::error::AttemptCapturingPokemonEventError,\n *              >,\n *          >,\n *      >,\n *  }\n *  ```\n *\n *  For Receiver and Sender types we also implement:\n *      Receiver: `__anext__` so it can be used in async for loops in Python\n *      Sender: `FromPyObject` that converts an async Python generator to a Rust stream\n */\nclass PythonServerEventStreamWrapperGenerator(\n    codegenContext: CodegenContext,\n    private val shape: MemberShape,\n) {\n    private val runtimeConfig = codegenContext.runtimeConfig\n    private val model = codegenContext.model\n    private val symbolProvider = codegenContext.symbolProvider\n\n    private val symbol = symbolProvider.toSymbol(shape)\n    private val eventStreamSymbol = PythonEventStreamSymbolProvider.parseSymbol(symbol)\n    private val innerT = eventStreamSymbol.innerT\n    private val errorT = eventStreamSymbol.errorT\n    private val containerName = shape.container.name\n    private val memberName = shape.memberName.toPascalCase()\n\n    private val pyO3 = PythonServerCargoDependency.PyO3.toType()\n    private val codegenScope =\n        arrayOf(\n            \"Inner\" to innerT,\n            \"Error\" to errorT,\n            \"SmithyPython\" to PythonServerCargoDependency.smithyHttpServerPython(runtimeConfig).toType(),\n            \"SmithyHttp\" to RuntimeType.smithyHttp(runtimeConfig),\n            \"Tracing\" to PythonServerCargoDependency.Tracing.toType(),\n            \"PyO3\" to pyO3,\n            \"PyO3Asyncio\" to PythonServerCargoDependency.PyO3Asyncio.toType(),\n            \"TokioStream\" to PythonServerCargoDependency.TokioStream.toType(),\n            \"Mutex\" to PythonServerCargoDependency.ParkingLot.toType().resolve(\"Mutex\"),\n            \"AsyncMutex\" to PythonServerCargoDependency.Tokio.toType().resolve(\"sync::Mutex\"),\n            \"Send\" to RuntimeType.Send,\n            \"Sync\" to RuntimeType.Sync,\n            \"Option\" to RuntimeType.Option,\n            \"Arc\" to RuntimeType.Arc,\n            \"Body\" to RuntimeType.sdkBody(runtimeConfig),\n            \"Message\" to RuntimeType.smithyTypes(runtimeConfig).resolve(\"event_stream::Message\"),\n            \"RawMessage\" to RuntimeType.smithyTypes(runtimeConfig).resolve(\"event_stream::RawMessage\"),\n            \"UnmarshallMessage\" to RuntimeType.smithyEventStream(runtimeConfig).resolve(\"frame::UnmarshallMessage\"),\n            \"MarshallMessage\" to RuntimeType.smithyEventStream(runtimeConfig).resolve(\"frame::MarshallMessage\"),\n            \"SignMessage\" to RuntimeType.smithyEventStream(runtimeConfig).resolve(\"frame::SignMessage\"),\n            \"MessageStreamAdapter\" to\n                RuntimeType.smithyHttp(runtimeConfig)\n                    .resolve(\"event_stream::MessageStreamAdapter\"),\n            \"InitialMessageType\" to\n                RuntimeType.smithyHttp(runtimeConfig)\n                    .resolve(\"event_stream::InitialMessageType\"),\n            \"SdkError\" to RuntimeType.sdkError(runtimeConfig),\n        )\n\n    fun render(writer: RustWriter) {\n        if (shape.isOutputEventStream(model)) {\n            renderSender(writer)\n        } else {\n            renderReceiver(writer)\n        }\n    }\n\n    private fun renderSender(writer: RustWriter) {\n        val name = \"${containerName}${memberName}EventStreamSender\"\n        val wrappedT = RuntimeType.eventStreamSender(runtimeConfig)\n        val containerMeta = symbol.expectRustMetadata().withDerives(RuntimeType.Clone, RuntimeType.Debug)\n        containerMeta.render(writer)\n        writer.rustBlock(\"struct $name\") {\n            writer.rustTemplate(\n                \"inner: #{Arc}<#{Mutex}<#{Option}<#{Wrapped}<#{Inner}, #{Error}>>>>\",\n                *codegenScope,\n                \"Wrapped\" to wrappedT,\n            )\n        }\n\n        writer.rustBlock(\"impl $name\") {\n            writer.rustTemplate(\n                \"\"\"\n                pub fn into_body_stream(\n                    self,\n                    marshaller: impl #{MarshallMessage}<Input = #{Inner}> + #{Send} + #{Sync} + 'static,\n                    error_marshaller: impl #{MarshallMessage}<Input = #{Error}> + #{Send} + #{Sync} + 'static,\n                    signer: impl #{SignMessage} + #{Send} + #{Sync} + 'static,\n                ) -> #{MessageStreamAdapter}<#{Inner}, #{Error}> {\n                    let mut inner = self.inner.lock();\n                    let inner = inner.take().expect(\n                        \"attempted to reuse an event stream. \\\n                         that means you kept a reference to an event stream and tried to reuse it in another request, \\\n                         event streams are request scoped and shouldn't be used outside of their bounded request scope\"\n                    );\n                    inner.into_body_stream(marshaller, error_marshaller, signer)\n                }\n                \"\"\",\n                *codegenScope,\n                \"Wrapped\" to wrappedT,\n            )\n        }\n\n        writer.rustTemplate(\n            \"\"\"\n            impl<'source> #{PyO3}::FromPyObject<'source> for $name {\n                fn extract(obj: &'source #{PyO3}::PyAny) -> #{PyO3}::PyResult<Self> {\n                    use #{TokioStream}::StreamExt;\n                    let stream = #{PyO3Asyncio}::tokio::into_stream_v1(obj)?;\n                    let stream = stream.filter_map(|res| {\n                        #{PyO3}::Python::with_gil(|py| {\n                            // TODO(EventStreamImprovements): Add `InternalServerError` variant to all event streaming\n                            //                                errors and return that variant in case of errors here?\n                            match res {\n                                Ok(obj) => {\n                                    match obj.extract::<#{Inner}>(py) {\n                                        Ok(it) => Some(Ok(it)),\n                                        Err(err) => {\n                                            let rich_py_err = #{SmithyPython}::rich_py_err(err);\n                                            #{Tracing}::error!(error = ?rich_py_err, \"could not extract the output type '#{Inner}' from streamed value\");\n                                            None\n                                        },\n                                    }\n                                },\n                                Err(err) => {\n                                    match #{PyO3}::IntoPy::into_py(err, py).extract::<#{Error}>(py) {\n                                        Ok(modelled_error) => Some(Err(modelled_error)),\n                                        Err(err) => {\n                                            let rich_py_err = #{SmithyPython}::rich_py_err(err);\n                                            #{Tracing}::error!(error = ?rich_py_err, \"could not extract the error type '#{Error}' from raised exception\");\n                                            None\n                                        }\n                                    }\n                                }\n                            }\n                        })\n                    });\n\n                    Ok($name { inner: #{Arc}::new(#{Mutex}::new(Some(stream.into()))) })\n                }\n            }\n\n            impl #{PyO3}::IntoPy<#{PyO3}::PyObject> for $name {\n                fn into_py(self, py: #{PyO3}::Python<'_>) -> #{PyO3}::PyObject {\n                    #{PyO3}::exceptions::PyAttributeError::new_err(\"this is a write-only object\").into_py(py)\n                }\n            }\n            \"\"\",\n            *codegenScope,\n        )\n    }\n\n    private fun renderReceiver(writer: RustWriter) {\n        val name = \"${containerName}${memberName}Receiver\"\n        val wrappedT = RuntimeType.eventStreamReceiver(runtimeConfig)\n        val containerMeta = symbol.expectRustMetadata().withDerives(RuntimeType.Clone, RuntimeType.Debug)\n        Attribute(pyO3.resolve(\"pyclass\")).render(writer)\n        containerMeta.render(writer)\n        writer.rustBlock(\"struct $name\") {\n            writer.rustTemplate(\n                \"inner: #{Arc}<#{AsyncMutex}<#{Wrapped}<#{Inner}, #{Error}>>>\",\n                *codegenScope,\n                \"Wrapped\" to wrappedT,\n            )\n        }\n\n        writer.rustBlock(\"impl $name\") {\n            writer.rustTemplate(\n                \"\"\"\n                pub fn new(\n                    unmarshaller: impl #{UnmarshallMessage}<Output = #{Inner}, Error = #{Error}> + #{Send} + #{Sync} + 'static,\n                    body: #{Body}\n                ) -> $name {\n                    let inner = #{Wrapped}::new(unmarshaller, body);\n                    let inner = #{Arc}::new(#{AsyncMutex}::new(inner));\n                    $name { inner }\n                }\n\n                pub async fn try_recv_initial(\n                    &mut self,\n                    message_type: #{InitialMessageType},\n                ) -> Result<#{Option}<#{Message}>, #{SdkError}<#{Error}, #{RawMessage}>> {\n                    let mut inner = self.inner.lock().await;\n                    inner.try_recv_initial(message_type).await\n                }\n                \"\"\",\n                *codegenScope,\n                \"Wrapped\" to wrappedT,\n            )\n        }\n\n        Attribute(pyO3.resolve(\"pymethods\")).render(writer)\n        writer.rustBlock(\"impl $name\") {\n            writer.rustTemplate(\n                \"\"\"\n                pub fn __aiter__(slf: #{PyO3}::PyRef<Self>) -> #{PyO3}::PyRef<Self> {\n                    slf\n                }\n\n                pub fn __anext__(slf: #{PyO3}::PyRefMut<Self>) -> #{PyO3}::PyResult<Option<#{PyO3}::PyObject>> {\n                    let body = slf.inner.clone();\n                    let fut = #{PyO3Asyncio}::tokio::future_into_py(slf.py(), async move {\n                        let mut inner = body.lock().await;\n                        let next = inner.recv().await;\n                        match next {\n                            Ok(Some(data)) => Ok(#{PyO3}::Python::with_gil(|py| #{PyO3}::IntoPy::into_py(data, py))),\n                            Ok(None) => Err(#{PyO3}::exceptions::PyStopAsyncIteration::new_err(\"stream exhausted\")),\n                            Err(#{SdkError}::ServiceError(service_err)) => Err(service_err.into_err().into()),\n                            Err(err) => Err(#{PyO3}::exceptions::PyRuntimeError::new_err(err.to_string())),\n                        }\n                    })?;\n                    Ok(Some(fut.into()))\n                }\n                \"\"\",\n                *codegenScope,\n            )\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-server/codegen-server-python/src/main/kotlin/software/amazon/smithy/rust/codegen/server/python/smithy/generators/PythonServerModuleGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.python.smithy.generators\n\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.ResourceShape\nimport software.amazon.smithy.model.shapes.ServiceShape\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.shapes.UnionShape\nimport software.amazon.smithy.rust.codegen.core.Version\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlockTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.smithy.RustCrate\nimport software.amazon.smithy.rust.codegen.core.util.toPascalCase\nimport software.amazon.smithy.rust.codegen.core.util.toSnakeCase\nimport software.amazon.smithy.rust.codegen.server.python.smithy.PythonServerCargoDependency\nimport software.amazon.smithy.rust.codegen.server.python.smithy.PythonServerRustModule\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenContext\n\nclass PythonServerModuleGenerator(\n    codegenContext: ServerCodegenContext,\n    private val rustCrate: RustCrate,\n    private val serviceShapes: Set<Shape>,\n) {\n    private val codegenScope =\n        arrayOf(\n            \"SmithyPython\" to PythonServerCargoDependency.smithyHttpServerPython(codegenContext.runtimeConfig).toType(),\n            \"pyo3\" to PythonServerCargoDependency.PyO3.toType(),\n        )\n    private val symbolProvider = codegenContext.symbolProvider\n    private val libName = codegenContext.settings.moduleName.toSnakeCase()\n\n    fun render() {\n        rustCrate.withModule(PythonServerRustModule.PythonModuleExport) {\n            rustBlockTemplate(\n                \"\"\"\n                ##[#{pyo3}::pymodule]\n                ##[pyo3(name = \"$libName\")]\n                pub fn python_library(py: #{pyo3}::Python<'_>, m: &#{pyo3}::types::PyModule) -> #{pyo3}::PyResult<()>\n                \"\"\",\n                *codegenScope,\n            ) {\n                renderPyCodegeneratedTypes()\n                renderPyWrapperTypes()\n                renderPySocketType()\n                renderPyLogging()\n                renderPyMiddlewareTypes()\n                renderPyTlsTypes()\n                renderPyLambdaTypes()\n                renderPyApplicationType()\n                renderCodegenVersion()\n                rust(\"Ok(())\")\n            }\n        }\n    }\n\n    // Render codegenerated types that are wrapped with #[pyclass] attribute.\n    private fun RustWriter.renderPyCodegeneratedTypes() {\n        rustTemplate(\n            \"\"\"\n            let input = #{pyo3}::types::PyModule::new(py, \"input\")?;\n            let output = #{pyo3}::types::PyModule::new(py, \"output\")?;\n            let error = #{pyo3}::types::PyModule::new(py, \"error\")?;\n            \"\"\",\n            *codegenScope,\n        )\n        // The `model` type section can be unused in models like `simple`, so we accommodate for it.\n        var visitedModelType = false\n        serviceShapes.forEach { shape ->\n            val moduleType = moduleType(shape)\n            if (moduleType != null) {\n                if (moduleType == \"model\" && !visitedModelType) {\n                    rustTemplate(\n                        \"\"\"\n                        let model = #{pyo3}::types::PyModule::new(py, \"model\")?;\n                        \"\"\",\n                        *codegenScope,\n                    )\n                    visitedModelType = true\n                }\n                when (shape) {\n                    is UnionShape ->\n                        rustTemplate(\n                            \"\"\"\n                            $moduleType.add_class::<crate::$moduleType::PyUnionMarker${shape.id.name.toPascalCase()}>()?;\n                            \"\"\",\n                            *codegenScope,\n                        )\n                    else ->\n                        rustTemplate(\n                            \"\"\"\n                            $moduleType.add_class::<crate::$moduleType::${shape.id.name.toPascalCase()}>()?;\n                            \"\"\",\n                            *codegenScope,\n                        )\n                }\n            }\n        }\n        rustTemplate(\n            \"\"\"\n            #{pyo3}::py_run!(py, input, \"import sys; sys.modules['$libName.input'] = input\");\n            m.add_submodule(input)?;\n            #{pyo3}::py_run!(py, output, \"import sys; sys.modules['$libName.output'] = output\");\n            m.add_submodule(output)?;\n            #{pyo3}::py_run!(py, error, \"import sys; sys.modules['$libName.error'] = error\");\n            m.add_submodule(error)?;\n            \"\"\",\n            *codegenScope,\n        )\n        if (visitedModelType) {\n            rustTemplate(\n                \"\"\"\n                #{pyo3}::py_run!(py, model, \"import sys; sys.modules['$libName.model'] = model\");\n                m.add_submodule(model)?;\n                \"\"\",\n                *codegenScope,\n            )\n        }\n    }\n\n    // Render wrapper types that are substituted to the ones coming from `aws_smithy_types`.\n    private fun RustWriter.renderPyWrapperTypes() {\n        rustTemplate(\n            \"\"\"\n            let types = #{pyo3}::types::PyModule::new(py, \"types\")?;\n            types.add_class::<#{SmithyPython}::types::Blob>()?;\n            types.add_class::<#{SmithyPython}::types::DateTime>()?;\n            types.add_class::<#{SmithyPython}::types::Format>()?;\n            types.add_class::<#{SmithyPython}::types::ByteStream>()?;\n            #{pyo3}::py_run!(\n                py,\n                types,\n                \"import sys; sys.modules['$libName.types'] = types\"\n            );\n            m.add_submodule(types)?;\n            \"\"\",\n            *codegenScope,\n        )\n    }\n\n    // Render Python shared socket type.\n    private fun RustWriter.renderPySocketType() {\n        rustTemplate(\n            \"\"\"\n            let socket = #{pyo3}::types::PyModule::new(py, \"socket\")?;\n            socket.add_class::<#{SmithyPython}::PySocket>()?;\n            #{pyo3}::py_run!(\n                py,\n                socket,\n                \"import sys; sys.modules['$libName.socket'] = socket\"\n            );\n            m.add_submodule(socket)?;\n            \"\"\",\n            *codegenScope,\n        )\n    }\n\n    // Render Python shared socket type.\n    private fun RustWriter.renderPyLogging() {\n        rustTemplate(\n            \"\"\"\n            let logging = #{pyo3}::types::PyModule::new(py, \"logging\")?;\n            logging.add_function(#{pyo3}::wrap_pyfunction!(#{SmithyPython}::py_tracing_event, m)?)?;\n            logging.add_class::<#{SmithyPython}::PyTracingHandler>()?;\n            #{pyo3}::py_run!(\n                py,\n                logging,\n                \"import sys; sys.modules['$libName.logging'] = logging\"\n            );\n            m.add_submodule(logging)?;\n            \"\"\",\n            *codegenScope,\n        )\n    }\n\n    private fun RustWriter.renderPyMiddlewareTypes() {\n        rustTemplate(\n            \"\"\"\n            let middleware = #{pyo3}::types::PyModule::new(py, \"middleware\")?;\n            middleware.add_class::<#{SmithyPython}::PyRequest>()?;\n            middleware.add_class::<#{SmithyPython}::PyResponse>()?;\n            middleware.add_class::<#{SmithyPython}::PyMiddlewareException>()?;\n            pyo3::py_run!(\n                py,\n                middleware,\n                \"import sys; sys.modules['$libName.middleware'] = middleware\"\n            );\n            m.add_submodule(middleware)?;\n            \"\"\",\n            *codegenScope,\n        )\n    }\n\n    private fun RustWriter.renderPyTlsTypes() {\n        rustTemplate(\n            \"\"\"\n            let tls = #{pyo3}::types::PyModule::new(py, \"tls\")?;\n            tls.add_class::<#{SmithyPython}::tls::PyTlsConfig>()?;\n            pyo3::py_run!(\n                py,\n                tls,\n                \"import sys; sys.modules['$libName.tls'] = tls\"\n            );\n            m.add_submodule(tls)?;\n            \"\"\",\n            *codegenScope,\n        )\n    }\n\n    private fun RustWriter.renderPyLambdaTypes() {\n        rustTemplate(\n            \"\"\"\n            let aws_lambda = #{pyo3}::types::PyModule::new(py, \"aws_lambda\")?;\n            aws_lambda.add_class::<#{SmithyPython}::lambda::PyLambdaContext>()?;\n            aws_lambda.add_class::<#{SmithyPython}::lambda::PyClientApplication>()?;\n            aws_lambda.add_class::<#{SmithyPython}::lambda::PyClientContext>()?;\n            aws_lambda.add_class::<#{SmithyPython}::lambda::PyCognitoIdentity>()?;\n            aws_lambda.add_class::<#{SmithyPython}::lambda::PyConfig>()?;\n            pyo3::py_run!(\n                py,\n                aws_lambda,\n                \"import sys; sys.modules['$libName.aws_lambda'] = aws_lambda\"\n            );\n            m.add_submodule(aws_lambda)?;\n            \"\"\",\n            *codegenScope,\n        )\n    }\n\n    // Render Python application type.\n    private fun RustWriter.renderPyApplicationType() {\n        rust(\"\"\"m.add_class::<crate::python_server_application::App>()?;\"\"\")\n    }\n\n    // Render the codegeneration version as module attribute.\n    private fun RustWriter.renderCodegenVersion() {\n        rust(\"\"\"m.add(\"CODEGEN_VERSION\", \"${Version.fromDefaultResource().gitHash}\")?;\"\"\")\n    }\n\n    // Convert to symbol and check the namespace to figure out where they should be imported from.\n    private fun moduleType(shape: Shape): String? {\n        when (shape) {\n            // Shapes that should never be exposed to Python directly\n            is ServiceShape, is ResourceShape, is OperationShape, is MemberShape -> {}\n            else -> {\n                val namespace = symbolProvider.toSymbol(shape).namespace\n                if (!namespace.isEmpty() && namespace.startsWith(\"crate\")) {\n                    return namespace.split(\"::\").last()\n                }\n            }\n        }\n        return null\n    }\n}\n"
  },
  {
    "path": "codegen-server/codegen-server-python/src/main/kotlin/software/amazon/smithy/rust/codegen/server/python/smithy/generators/PythonServerOperationErrorGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.python.smithy.generators\n\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.knowledge.OperationIndex\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider\nimport software.amazon.smithy.rust.codegen.server.python.smithy.PythonServerCargoDependency\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.ServerOperationErrorGenerator\n\n/**\n * Generates a unified error enum for [operation]. It depends on [ServerOperationErrorGenerator]\n * to generate the errors from the model and adds the Rust implementation `From<pyo3::PyErr>`.\n */\nclass PythonServerOperationErrorGenerator(\n    private val model: Model,\n    private val symbolProvider: RustSymbolProvider,\n    private val operation: OperationShape,\n) {\n    private val operationIndex = OperationIndex.of(model)\n    private val errors = operationIndex.getErrors(operation)\n\n    fun render(writer: RustWriter) {\n        renderFromPyErr(writer)\n    }\n\n    private fun renderFromPyErr(writer: RustWriter) {\n        writer.rustTemplate(\n            \"\"\"\n            impl #{From}<#{pyo3}::PyErr> for #{Error} {\n                fn from(variant: #{pyo3}::PyErr) -> #{Error} {\n                    #{pyo3}::Python::with_gil(|py|{\n                        let error = variant.value(py);\n                        #{CastPyErrToRustError:W}\n                        crate::error::InternalServerError { message: error.to_string() }.into()\n                    })\n                }\n            }\n\n            \"\"\",\n            \"pyo3\" to PythonServerCargoDependency.PyO3.toType(),\n            \"Error\" to symbolProvider.symbolForOperationError(operation),\n            \"From\" to RuntimeType.From,\n            \"CastPyErrToRustError\" to castPyErrToRustError(),\n        )\n    }\n\n    private fun castPyErrToRustError(): Writable =\n        writable {\n            errors.forEach { error ->\n                val errorSymbol = symbolProvider.toSymbol(error)\n                if (errorSymbol.toString() != \"crate::error::InternalServerError\") {\n                    rust(\n                        \"\"\"\n                        if let Ok(error) = error.extract::<$errorSymbol>() {\n                            return error.into()\n                        }\n                        \"\"\",\n                    )\n                }\n            }\n        }\n}\n"
  },
  {
    "path": "codegen-server/codegen-server-python/src/main/kotlin/software/amazon/smithy/rust/codegen/server/python/smithy/generators/PythonServerOperationHandlerGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.python.smithy.generators\n\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustReservedWords\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenContext\nimport software.amazon.smithy.rust.codegen.core.util.toPascalCase\nimport software.amazon.smithy.rust.codegen.core.util.toSnakeCase\nimport software.amazon.smithy.rust.codegen.server.python.smithy.PythonServerCargoDependency\n\n/**\n * The Rust code responsible to run the Python business logic on the Python interpreter\n * is implemented in this class, which inherits from [ServerOperationHandlerGenerator].\n *\n * We codegenerate all operations handlers (steps usually left to the developer in a pure\n * Rust application), which are built into a `Router` by [PythonApplicationGenerator].\n *\n * To call a Python function from Rust, anything dealing with Python runs inside an async\n * block that allows to catch stack traces. The handler function is extracted from `PyHandler`\n * and called with the necessary arguments inside a blocking Tokio task.\n * At the end the block is awaited and errors are collected and reported.\n *\n * To call a Python coroutine, the same happens, but scheduled in a `tokio::Future`.\n */\nclass PythonServerOperationHandlerGenerator(\n    codegenContext: CodegenContext,\n    private val operation: OperationShape,\n) {\n    private val symbolProvider = codegenContext.symbolProvider\n    private val runtimeConfig = codegenContext.runtimeConfig\n    private val codegenScope =\n        arrayOf(\n            \"SmithyPython\" to PythonServerCargoDependency.smithyHttpServerPython(runtimeConfig).toType(),\n            \"SmithyServer\" to PythonServerCargoDependency.smithyHttpServer(runtimeConfig).toType(),\n            \"pyo3\" to PythonServerCargoDependency.PyO3.toType(),\n            \"pyo3_asyncio\" to PythonServerCargoDependency.PyO3Asyncio.toType(),\n            \"tokio\" to PythonServerCargoDependency.Tokio.toType(),\n            \"tracing\" to PythonServerCargoDependency.Tracing.toType(),\n        )\n\n    fun render(writer: RustWriter) {\n        renderPythonOperationHandlerImpl(writer)\n    }\n\n    private fun renderPythonOperationHandlerImpl(writer: RustWriter) {\n        val operationName = symbolProvider.toSymbol(operation).name\n        val input = \"crate::input::${operationName.toPascalCase()}Input\"\n        val output = \"crate::output::${operationName.toPascalCase()}Output\"\n        // TODO(https://github.com/smithy-lang/smithy-rs/issues/2552) - Use to pascalCase for error shapes.\n        val error = \"crate::error::${operationName}Error\"\n        val fnName = RustReservedWords.escapeIfNeeded(symbolProvider.toSymbol(operation).name.toSnakeCase())\n\n        writer.rustTemplate(\n            \"\"\"\n            /// Python handler for operation `$operationName`.\n            pub(crate) async fn $fnName(\n                input: $input,\n                state: #{SmithyServer}::Extension<#{SmithyPython}::context::PyContext>,\n                handler: #{SmithyPython}::PyHandler,\n            ) -> std::result::Result<$output, $error> {\n                // Async block used to run the handler and catch any Python error.\n                let result = if handler.is_coroutine {\n                    #{PyCoroutine:W}\n                } else {\n                    #{PyFunction:W}\n                };\n                #{PyError:W}\n            }\n            \"\"\",\n            *codegenScope,\n            \"PyCoroutine\" to renderPyCoroutine(fnName, output),\n            \"PyFunction\" to renderPyFunction(fnName, output),\n            \"PyError\" to renderPyError(),\n        )\n    }\n\n    private fun renderPyFunction(\n        name: String,\n        output: String,\n    ): Writable =\n        writable {\n            rustTemplate(\n                \"\"\"\n                #{tracing}::trace!(name = \"$name\", \"executing python handler function\");\n                #{pyo3}::Python::with_gil(|py| {\n                    let pyhandler: &#{pyo3}::types::PyFunction = handler.extract(py)?;\n                    let output = if handler.args == 1 {\n                        pyhandler.call1((input,))?\n                    } else {\n                        pyhandler.call1((input, #{pyo3}::ToPyObject::to_object(&state.0, py)))?\n                    };\n                    output.extract::<$output>()\n                })\n                \"\"\",\n                *codegenScope,\n            )\n        }\n\n    private fun renderPyCoroutine(\n        name: String,\n        output: String,\n    ): Writable =\n        writable {\n            rustTemplate(\n                \"\"\"\n                #{tracing}::trace!(name = \"$name\", \"executing python handler coroutine\");\n                let result = #{pyo3}::Python::with_gil(|py| {\n                    let pyhandler: &#{pyo3}::types::PyFunction = handler.extract(py)?;\n                    let coroutine = if handler.args == 1 {\n                        pyhandler.call1((input,))?\n                    } else {\n                        pyhandler.call1((input, #{pyo3}::ToPyObject::to_object(&state.0, py)))?\n                    };\n                    #{pyo3_asyncio}::tokio::into_future(coroutine)\n                })?;\n                result.await.and_then(|r| #{pyo3}::Python::with_gil(|py| r.extract::<$output>(py)))\n                \"\"\",\n                *codegenScope,\n            )\n        }\n\n    private fun renderPyError(): Writable =\n        writable {\n            rustTemplate(\n                \"\"\"\n                // Catch and record a Python traceback.\n                result.map_err(|e| {\n                    let rich_py_err = #{SmithyPython}::rich_py_err(#{pyo3}::Python::with_gil(|py| { e.clone_ref(py) }));\n                    #{tracing}::error!(error = ?rich_py_err, \"handler error\");\n                    e.into()\n                })\n                \"\"\",\n                *codegenScope,\n            )\n        }\n}\n"
  },
  {
    "path": "codegen-server/codegen-server-python/src/main/kotlin/software/amazon/smithy/rust/codegen/server/python/smithy/generators/PythonServerStructureGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.python.smithy.generators\n\nimport software.amazon.smithy.codegen.core.Symbol\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.traits.ErrorTrait\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.render\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustInlineTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.StructureGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.isOptional\nimport software.amazon.smithy.rust.codegen.core.smithy.rustType\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\nimport software.amazon.smithy.rust.codegen.core.util.isEventStream\nimport software.amazon.smithy.rust.codegen.core.util.toSnakeCase\nimport software.amazon.smithy.rust.codegen.server.python.smithy.PythonEventStreamSymbolProvider\nimport software.amazon.smithy.rust.codegen.server.python.smithy.PythonServerCargoDependency\nimport software.amazon.smithy.rust.codegen.server.python.smithy.PythonType\nimport software.amazon.smithy.rust.codegen.server.python.smithy.pythonType\nimport software.amazon.smithy.rust.codegen.server.python.smithy.renderAsDocstring\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenContext\n\n/**\n * To share structures defined in Rust with Python, `pyo3` provides the `PyClass` trait.\n * This class generates input / output / error structures definitions and implements the\n * `PyClass` trait.\n */\nclass PythonServerStructureGenerator(\n    model: Model,\n    private val codegenContext: ServerCodegenContext,\n    private val writer: RustWriter,\n    private val shape: StructureShape,\n) : StructureGenerator(model, codegenContext.symbolProvider, writer, shape, emptyList(), codegenContext.structSettings()) {\n    private val symbolProvider = codegenContext.symbolProvider\n    private val libName = codegenContext.settings.moduleName.toSnakeCase()\n    private val pyO3 = PythonServerCargoDependency.PyO3.toType()\n\n    override fun renderStructure() {\n        if (shape.hasTrait<ErrorTrait>()) {\n            Attribute(\n                writable {\n                    rustInlineTemplate(\n                        \"#{pyclass}(extends = #{PyException})\",\n                        \"pyclass\" to pyO3.resolve(\"pyclass\"),\n                        \"PyException\" to pyO3.resolve(\"exceptions::PyException\"),\n                    )\n                },\n            ).render(writer)\n        } else {\n            Attribute(pyO3.resolve(\"pyclass\")).render(writer)\n        }\n        writer.rustTemplate(\"#{ConstructorSignature:W}\", \"ConstructorSignature\" to renderConstructorSignature())\n        super.renderStructure()\n        renderPyO3Methods()\n        if (!shape.hasTrait<ErrorTrait>()) {\n            renderPyBoxTraits()\n        }\n    }\n\n    override fun renderStructureMember(\n        writer: RustWriter,\n        member: MemberShape,\n        memberName: String,\n        memberSymbol: Symbol,\n    ) {\n        writer.addDependency(PythonServerCargoDependency.PyO3)\n        // Above, we manually add dependency since we can't use a `RuntimeType` below\n        Attribute(\"pyo3(get, set)\").render(writer)\n        writer.rustTemplate(\"#{Signature:W}\", \"Signature\" to renderMemberSignature(member, memberSymbol))\n        super.renderStructureMember(writer, member, memberName, memberSymbol)\n    }\n\n    private fun renderPyO3Methods() {\n        Attribute.AllowClippyNewWithoutDefault.render(writer)\n        Attribute.AllowClippyTooManyArguments.render(writer)\n        Attribute(pyO3.resolve(\"pymethods\")).render(writer)\n        writer.rustTemplate(\n            \"\"\"\n            impl $name {\n                ##[new]\n                pub fn new(#{BodySignature:W}) -> Self {\n                    Self {\n                        #{BodyMembers:W}\n                    }\n                }\n                fn __repr__(&self) -> String  {\n                    format!(\"{self:?}\")\n                }\n                fn __str__(&self) -> String {\n                    format!(\"{self:?}\")\n                }\n            }\n            \"\"\",\n            \"BodySignature\" to renderStructSignatureMembers(),\n            \"BodyMembers\" to renderStructBodyMembers(),\n        )\n    }\n\n    private fun renderPyBoxTraits() {\n        writer.rustTemplate(\n            \"\"\"\n            impl<'source> #{pyo3}::FromPyObject<'source> for std::boxed::Box<$name> {\n                fn extract(ob: &'source #{pyo3}::PyAny) -> #{pyo3}::PyResult<Self> {\n                    ob.extract::<$name>().map(Box::new)\n                }\n            }\n\n            impl #{pyo3}::IntoPy<#{pyo3}::PyObject> for std::boxed::Box<$name> {\n                fn into_py(self, py: #{pyo3}::Python<'_>) -> #{pyo3}::PyObject {\n                    (*self).into_py(py)\n                }\n            }\n            \"\"\",\n            \"pyo3\" to pyO3,\n        )\n    }\n\n    // Python function parameters require that all required parameters appear before optional ones.\n    // This function sorts the member fields to ensure required fields precede optional fields.\n    private fun sortedMembers() =\n        members.sortedBy { member ->\n            val memberSymbol = symbolProvider.toSymbol(member)\n            memberSymbol.isOptional()\n        }\n\n    private fun renderStructSignatureMembers(): Writable =\n        writable {\n            forEachMember(sortedMembers()) { _, memberName, memberSymbol ->\n                val memberType = memberSymbol.rustType()\n                rust(\"$memberName: ${memberType.render()},\")\n            }\n        }\n\n    private fun renderStructBodyMembers(): Writable =\n        writable {\n            forEachMember(sortedMembers()) { _, memberName, _ ->\n                rust(\"$memberName,\")\n            }\n        }\n\n    private fun renderConstructorSignature(): Writable =\n        writable {\n            forEachMember(sortedMembers()) { member, memberName, memberSymbol ->\n                val memberType = memberPythonType(member, memberSymbol)\n                rust(\"/// :param $memberName ${memberType.renderAsDocstring()}:\")\n            }\n\n            rust(\"/// :rtype ${PythonType.None.renderAsDocstring()}:\")\n        }\n\n    private fun renderMemberSignature(\n        shape: MemberShape,\n        symbol: Symbol,\n    ): Writable =\n        writable {\n            val pythonType = memberPythonType(shape, symbol)\n            rust(\"/// :type ${pythonType.renderAsDocstring()}:\")\n        }\n\n    private fun memberPythonType(\n        shape: MemberShape,\n        symbol: Symbol,\n    ): PythonType =\n        if (shape.isEventStream(model)) {\n            val eventStreamSymbol = PythonEventStreamSymbolProvider.parseSymbol(symbol)\n            val innerT = eventStreamSymbol.innerT.pythonType(libName)\n            PythonType.AsyncIterator(innerT)\n        } else {\n            symbol.rustType().pythonType(libName)\n        }\n}\n"
  },
  {
    "path": "codegen-server/codegen-server-python/src/main/kotlin/software/amazon/smithy/rust/codegen/server/python/smithy/generators/PythonServerUnionGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.python.smithy.generators\n\nimport software.amazon.smithy.codegen.core.Symbol\nimport software.amazon.smithy.codegen.core.SymbolProvider\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.UnionShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.isCopy\nimport software.amazon.smithy.rust.codegen.core.rustlang.render\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlockTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.smithy.expectRustMetadata\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.UnionGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.rustType\nimport software.amazon.smithy.rust.codegen.core.util.isTargetUnit\nimport software.amazon.smithy.rust.codegen.core.util.toSnakeCase\nimport software.amazon.smithy.rust.codegen.server.python.smithy.PythonServerCargoDependency\nimport software.amazon.smithy.rust.codegen.server.python.smithy.pythonType\nimport software.amazon.smithy.rust.codegen.server.python.smithy.renderAsDocstring\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenContext\n\n/*\n * Generate unions that are compatible with Python by wrapping the Rust implementation into\n * a new structure and implementing `IntoPy` and `FromPyObject` to ensure the ability to extract\n * the union inside the Python context.\n */\nclass PythonServerUnionGenerator(\n    model: Model,\n    private val codegenContext: ServerCodegenContext,\n    private val writer: RustWriter,\n    shape: UnionShape,\n    private val renderUnknownVariant: Boolean = true,\n) : UnionGenerator(model, codegenContext.symbolProvider, writer, shape, renderUnknownVariant) {\n    private val symbolProvider = codegenContext.symbolProvider\n    private val libName = codegenContext.settings.moduleName.toSnakeCase()\n    private val sortedMembers: List<MemberShape> = shape.allMembers.values.sortedBy { symbolProvider.toMemberName(it) }\n    private val unionSymbol = symbolProvider.toSymbol(shape)\n\n    private val pyo3 = PythonServerCargoDependency.PyO3.toType()\n\n    override fun render() {\n        super.render()\n        renderPyUnionStruct()\n        renderPyUnionImpl()\n        renderPyObjectConverters()\n    }\n\n    private fun renderPyUnionStruct() {\n        writer.rust(\"\"\"##[pyo3::pyclass(name = \"${unionSymbol.name}\")]\"\"\")\n        val containerMeta = unionSymbol.expectRustMetadata()\n        containerMeta.render(writer)\n        writer.rust(\"struct PyUnionMarker${unionSymbol.name}(pub ${unionSymbol.name});\")\n    }\n\n    private fun renderPyUnionImpl() {\n        Attribute(pyo3.resolve(\"pymethods\")).render(writer)\n        writer.rustBlock(\"impl PyUnionMarker${unionSymbol.name}\") {\n            sortedMembers.forEach { member ->\n                val funcNamePart = member.memberName.toSnakeCase()\n                val variantName = symbolProvider.toMemberName(member)\n\n                if (sortedMembers.size == 1) {\n                    Attribute.AllowIrrefutableLetPatterns.render(this)\n                }\n                renderNewVariant(writer, model, symbolProvider, member, variantName, funcNamePart, unionSymbol)\n                renderAsVariant(writer, model, symbolProvider, member, variantName, funcNamePart, unionSymbol)\n                rust(\"/// Returns true if this is a [`$variantName`](#T::$variantName).\", unionSymbol)\n                rust(\"/// :rtype bool:\")\n                rustBlock(\"pub fn is_$funcNamePart(&self) -> bool\") {\n                    rust(\"self.0.is_$funcNamePart()\")\n                }\n            }\n            if (renderUnknownVariant) {\n                rust(\"/// Returns true if the union instance is the `Unknown` variant.\")\n                rust(\"/// :rtype bool:\")\n                rustBlock(\"pub fn is_unknown(&self) -> bool\") {\n                    rust(\"self.0.is_unknown()\")\n                }\n            }\n        }\n    }\n\n    private fun renderPyObjectConverters() {\n        writer.rustBlockTemplate(\"impl #{pyo3}::IntoPy<#{pyo3}::PyObject> for ${unionSymbol.name}\", \"pyo3\" to pyo3) {\n            rustBlockTemplate(\"fn into_py(self, py: #{pyo3}::Python<'_>) -> #{pyo3}::PyObject\", \"pyo3\" to pyo3) {\n                rust(\"PyUnionMarker${unionSymbol.name}(self).into_py(py)\")\n            }\n        }\n        writer.rustBlockTemplate(\"impl<'source> #{pyo3}::FromPyObject<'source> for ${unionSymbol.name}\", \"pyo3\" to pyo3) {\n            rustBlockTemplate(\"fn extract(obj: &'source #{pyo3}::PyAny) -> #{pyo3}::PyResult<Self>\", \"pyo3\" to pyo3) {\n                rust(\n                    \"\"\"\n                    let data: PyUnionMarker${unionSymbol.name} = obj.extract()?;\n                    Ok(data.0)\n                    \"\"\",\n                )\n            }\n        }\n    }\n\n    private fun renderNewVariant(\n        writer: RustWriter,\n        model: Model,\n        symbolProvider: SymbolProvider,\n        member: MemberShape,\n        variantName: String,\n        funcNamePart: String,\n        unionSymbol: Symbol,\n    ) {\n        if (member.isTargetUnit()) {\n            Attribute(\"staticmethod\").render(writer)\n            writer.rust(\n                \"/// Creates a new union instance of [`$variantName`](#T::$variantName)\",\n                unionSymbol,\n            )\n            writer.rust(\"/// :rtype ${unionSymbol.name}:\")\n            writer.rustBlock(\"pub fn $funcNamePart() -> Self\") {\n                rust(\"Self(${unionSymbol.name}::$variantName)\")\n            }\n        } else {\n            val memberSymbol = symbolProvider.toSymbol(member)\n            val pythonType = memberSymbol.rustType().pythonType(libName)\n            val targetType = memberSymbol.rustType()\n            Attribute(\"staticmethod\").render(writer)\n            writer.rust(\n                \"/// Creates a new union instance of [`$variantName`](#T::$variantName)\",\n                unionSymbol,\n            )\n            writer.rust(\"/// :param data ${pythonType.renderAsDocstring()}:\")\n            writer.rust(\"/// :rtype ${unionSymbol.name}:\")\n            writer.rustBlock(\"pub fn $funcNamePart(data: ${targetType.render()}) -> Self\") {\n                rust(\"Self(${unionSymbol.name}::$variantName(data))\")\n            }\n        }\n    }\n\n    private fun renderAsVariant(\n        writer: RustWriter,\n        model: Model,\n        symbolProvider: SymbolProvider,\n        member: MemberShape,\n        variantName: String,\n        funcNamePart: String,\n        unionSymbol: Symbol,\n    ) {\n        if (member.isTargetUnit()) {\n            writer.rust(\n                \"/// Tries to convert the enum instance into [`$variantName`](#T::$variantName), extracting the inner `()`.\",\n                unionSymbol,\n            )\n            writer.rust(\"/// :rtype None:\")\n            writer.rustBlockTemplate(\"pub fn as_$funcNamePart(&self) -> #{pyo3}::PyResult<()>\", \"pyo3\" to pyo3) {\n                rustTemplate(\n                    \"\"\"\n                    self.0.as_$funcNamePart().map_err(|_| #{pyo3}::exceptions::PyValueError::new_err(\n                        \"${unionSymbol.name} variant is not None\"\n                    ))\n                    \"\"\",\n                    \"pyo3\" to pyo3,\n                )\n            }\n        } else {\n            val memberSymbol = symbolProvider.toSymbol(member)\n            val pythonType = memberSymbol.rustType().pythonType(libName)\n            val targetSymbol = symbolProvider.toSymbol(model.expectShape(member.target))\n            val rustType = memberSymbol.rustType()\n            writer.rust(\n                \"/// Tries to convert the enum instance into [`$variantName`](#T::$variantName), extracting the inner #D.\",\n                unionSymbol,\n                targetSymbol,\n            )\n            writer.rust(\"/// :rtype ${pythonType.renderAsDocstring()}:\")\n            writer.rustBlockTemplate(\"pub fn as_$funcNamePart(&self) -> #{pyo3}::PyResult<${rustType.render()}>\", \"pyo3\" to pyo3) {\n                val variantType =\n                    if (rustType.isCopy()) {\n                        \"*variant\"\n                    } else {\n                        \"variant.clone()\"\n                    }\n                val errorVariant = memberSymbol.rustType().pythonType(libName).renderAsDocstring()\n                rustTemplate(\n                    \"\"\"\n                    match self.0.as_$funcNamePart() {\n                        Ok(variant) => Ok($variantType),\n                        Err(_) => Err(#{pyo3}::exceptions::PyValueError::new_err(\n                            r\"${unionSymbol.name} variant is not of type $errorVariant\"\n                        )),\n                    }\n                    \"\"\",\n                    \"pyo3\" to pyo3,\n                )\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-server/codegen-server-python/src/main/kotlin/software/amazon/smithy/rust/codegen/server/python/smithy/protocols/PythonServerProtocolLoader.kt",
    "content": "\n/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.python.smithy.protocols\n\nimport software.amazon.smithy.aws.traits.protocols.AwsJson1_0Trait\nimport software.amazon.smithy.aws.traits.protocols.AwsJson1_1Trait\nimport software.amazon.smithy.aws.traits.protocols.RestJson1Trait\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.http.HttpBindingCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.http.HttpBindingSection\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.AwsJsonVersion\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.ProtocolLoader\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.ProtocolMap\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.parse.JsonParserCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.parse.JsonParserSection\nimport software.amazon.smithy.rust.codegen.server.python.smithy.PythonServerRuntimeType\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenContext\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.protocol.ServerProtocolGenerator\nimport software.amazon.smithy.rust.codegen.server.smithy.protocols.ServerAwsJsonFactory\nimport software.amazon.smithy.rust.codegen.server.smithy.protocols.ServerHttpBoundProtocolCustomization\nimport software.amazon.smithy.rust.codegen.server.smithy.protocols.ServerHttpBoundProtocolSection\nimport software.amazon.smithy.rust.codegen.server.smithy.protocols.ServerRestJsonFactory\n\n/**\n * Customization class used to force casting a non primitive type into one overriden by a new symbol provider,\n * by explicitly calling `from()` on it.\n *\n * For example we use this in the server Python implementation, where we override types like [Blob], [DateTime] and [Document]\n * with wrappers compatible with Python, without touching the original implementation coming from `aws-smithy-types`.\n */\nclass PythonServerAfterDeserializedMemberJsonParserCustomization(private val runtimeConfig: RuntimeConfig) :\n    JsonParserCustomization() {\n    override fun section(section: JsonParserSection): Writable =\n        when (section) {\n            is JsonParserSection.AfterTimestampDeserializedMember ->\n                writable {\n                    rust(\".map(#T::from)\", PythonServerRuntimeType.dateTime(runtimeConfig).toSymbol())\n                }\n            is JsonParserSection.AfterBlobDeserializedMember ->\n                writable {\n                    rust(\".map(#T::from)\", PythonServerRuntimeType.blob(runtimeConfig).toSymbol())\n                }\n            is JsonParserSection.AfterDocumentDeserializedMember ->\n                writable {\n                    rust(\".map(#T::from)\", PythonServerRuntimeType.document(runtimeConfig).toSymbol())\n                }\n            else -> emptySection\n        }\n}\n\n/**\n * Customization class used to force casting a non-primitive type into one overridden by a new symbol provider,\n * by explicitly calling `into()` on it.\n */\nclass PythonServerAfterDeserializedMemberServerHttpBoundCustomization :\n    ServerHttpBoundProtocolCustomization() {\n    override fun section(section: ServerHttpBoundProtocolSection): Writable =\n        when (section) {\n            is ServerHttpBoundProtocolSection.AfterTimestampDeserializedMember ->\n                writable {\n                    rust(\".into()\")\n                }\n\n            else -> emptySection\n        }\n}\n\n/**\n * Customization class used to force casting a `Vec<DateTime>` into one a Python `Vec<DateTime>`\n */\nclass PythonServerAfterDeserializedMemberHttpBindingCustomization(private val runtimeConfig: RuntimeConfig) :\n    HttpBindingCustomization() {\n    override fun section(section: HttpBindingSection): Writable =\n        when (section) {\n            is HttpBindingSection.AfterDeserializingIntoADateTimeOfHttpHeaders ->\n                writable {\n                    rust(\".into_iter().map(#T::from).collect()\", PythonServerRuntimeType.dateTime(runtimeConfig).toSymbol())\n                }\n            else -> emptySection\n        }\n}\n\n/**\n * Customization class used to determine how serialized stream payload should be rendered for the Python server.\n *\n * In this customization, we do not need to wrap the payload in a new-type wrapper to enable the\n * `futures_core::stream::Stream` trait since the payload in question has a type\n * `aws_smithy_http_server_python::types::ByteStream` which already implements the `Stream` trait.\n */\nclass PythonServerStreamPayloadSerializerCustomization() : ServerHttpBoundProtocolCustomization() {\n    override fun section(section: ServerHttpBoundProtocolSection): Writable =\n        when (section) {\n            is ServerHttpBoundProtocolSection.WrapStreamPayload ->\n                writable {\n                    section.params.payloadGenerator.generatePayload(this, section.params.shapeName, section.params.shape)\n                }\n\n            else -> emptySection\n        }\n}\n\nclass PythonServerProtocolLoader(\n    private val supportedProtocols: ProtocolMap<ServerProtocolGenerator, ServerCodegenContext>,\n) : ProtocolLoader<ServerProtocolGenerator, ServerCodegenContext>(supportedProtocols) {\n    companion object {\n        fun defaultProtocols(runtimeConfig: RuntimeConfig) =\n            mapOf(\n                RestJson1Trait.ID to\n                    ServerRestJsonFactory(\n                        additionalParserCustomizations =\n                            listOf(\n                                PythonServerAfterDeserializedMemberJsonParserCustomization(runtimeConfig),\n                            ),\n                        additionalServerHttpBoundProtocolCustomizations =\n                            listOf(\n                                PythonServerAfterDeserializedMemberServerHttpBoundCustomization(),\n                                PythonServerStreamPayloadSerializerCustomization(),\n                            ),\n                        additionalHttpBindingCustomizations =\n                            listOf(\n                                PythonServerAfterDeserializedMemberHttpBindingCustomization(runtimeConfig),\n                            ),\n                    ),\n                AwsJson1_0Trait.ID to\n                    ServerAwsJsonFactory(\n                        AwsJsonVersion.Json10,\n                        additionalParserCustomizations =\n                            listOf(\n                                PythonServerAfterDeserializedMemberJsonParserCustomization(runtimeConfig),\n                            ),\n                        additionalServerHttpBoundProtocolCustomizations =\n                            listOf(\n                                PythonServerAfterDeserializedMemberServerHttpBoundCustomization(),\n                                PythonServerStreamPayloadSerializerCustomization(),\n                            ),\n                        additionalHttpBindingCustomizations =\n                            listOf(\n                                PythonServerAfterDeserializedMemberHttpBindingCustomization(runtimeConfig),\n                            ),\n                    ),\n                AwsJson1_1Trait.ID to\n                    ServerAwsJsonFactory(\n                        AwsJsonVersion.Json11,\n                        additionalParserCustomizations =\n                            listOf(\n                                PythonServerAfterDeserializedMemberJsonParserCustomization(runtimeConfig),\n                            ),\n                        additionalServerHttpBoundProtocolCustomizations =\n                            listOf(\n                                PythonServerAfterDeserializedMemberServerHttpBoundCustomization(),\n                                PythonServerStreamPayloadSerializerCustomization(),\n                            ),\n                        additionalHttpBindingCustomizations =\n                            listOf(\n                                PythonServerAfterDeserializedMemberHttpBindingCustomization(runtimeConfig),\n                            ),\n                    ),\n            )\n    }\n}\n"
  },
  {
    "path": "codegen-server/codegen-server-python/src/main/kotlin/software/amazon/smithy/rust/codegen/server/python/smithy/testutil/PythonServerTestHelpers.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.python.smithy.testutil\n\nimport software.amazon.smithy.build.PluginContext\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeCrateLocation\nimport software.amazon.smithy.rust.codegen.core.testutil.generatePluginContext\nimport software.amazon.smithy.rust.codegen.core.util.runCommand\nimport software.amazon.smithy.rust.codegen.server.python.smithy.PythonServerCodegenVisitor\nimport software.amazon.smithy.rust.codegen.server.python.smithy.customizations.DECORATORS\nimport software.amazon.smithy.rust.codegen.server.smithy.customizations.CustomValidationExceptionWithReasonDecorator\nimport software.amazon.smithy.rust.codegen.server.smithy.customizations.ServerRequiredCustomizations\nimport software.amazon.smithy.rust.codegen.server.smithy.customizations.SmithyValidationExceptionDecorator\nimport software.amazon.smithy.rust.codegen.server.smithy.customize.CombinedServerCodegenDecorator\nimport java.io.File\nimport java.nio.file.Path\n\nval TestRuntimeConfig =\n    RuntimeConfig(runtimeCrateLocation = RuntimeCrateLocation.path(File(\"../../rust-runtime\").absolutePath))\n\nfun generatePythonServerPluginContext(model: Model) = generatePluginContext(model, runtimeConfig = TestRuntimeConfig)\n\nfun executePythonServerCodegenVisitor(pluginCtx: PluginContext) {\n    val codegenDecorator =\n        CombinedServerCodegenDecorator.fromClasspath(\n            pluginCtx,\n            *DECORATORS,\n            ServerRequiredCustomizations(),\n            SmithyValidationExceptionDecorator(),\n            CustomValidationExceptionWithReasonDecorator(),\n        )\n    PythonServerCodegenVisitor(pluginCtx, codegenDecorator).execute()\n}\n\nfun cargoTest(workdir: Path) =\n    // `--no-default-features` is required to disable `pyo3/extension-module` which causes linking errors\n    // see `PyO3ExtensionModuleDecorator`'s comments fore more detail.\n    \"cargo test --no-default-features --no-fail-fast\".runCommand(\n        workdir,\n        mapOf(\n            // Those are required to run tests on macOS, see: https://pyo3.rs/main/building_and_distribution#macos\n            \"CARGO_TARGET_X86_64_APPLE_DARWIN_RUSTFLAGS\" to \"-C link-arg=-undefined -C link-arg=dynamic_lookup\",\n            \"CARGO_TARGET_AARCH64_APPLE_DARWIN_RUSTFLAGS\" to \"-C link-arg=-undefined -C link-arg=dynamic_lookup\",\n        ),\n    )\n"
  },
  {
    "path": "codegen-server/codegen-server-python/src/main/resources/META-INF/services/software.amazon.smithy.build.SmithyBuildPlugin",
    "content": "#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\nsoftware.amazon.smithy.rust.codegen.server.python.smithy.RustServerCodegenPythonPlugin\n"
  },
  {
    "path": "codegen-server/codegen-server-python/src/main/resources/stubgen.py",
    "content": "#  Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n#  SPDX-License-Identifier: Apache-2.0\n\nfrom __future__ import annotations\n\nimport inspect\nimport re\nimport textwrap\nfrom pathlib import Path\nfrom typing import Any, Dict, List, Optional, Set, Tuple\n\nROOT_MODULE_NAME_PLACEHOLDER = \"__root_module_name__\"\n\n\nclass Writer:\n    \"\"\"\n    Writer provides utilities for writing Python stubs.\n    \"\"\"\n\n    root_module_name: str\n    path: Path\n    subwriters: List[Writer]\n    imports: Set[str]\n    defs: List[str]\n    generics: Set[str]\n\n    def __init__(self, path: Path, root_module_name: str) -> None:\n        self.path = path\n        self.root_module_name = root_module_name\n        self.subwriters = []\n        self.imports = set([])\n        self.defs = []\n        self.generics = set([])\n\n    def fix_path(self, path: str) -> str:\n        \"\"\"\n        Returns fixed version of given type path.\n        It unescapes `\\\\[` and `\\\\]` and also populates placeholder for root module name.\n        \"\"\"\n        return path.replace(ROOT_MODULE_NAME_PLACEHOLDER, self.root_module_name).replace(\"\\\\[\", \"[\").replace(\"\\\\]\", \"]\")\n\n    def submodule(self, path: Path) -> Writer:\n        w = Writer(path, self.root_module_name)\n        self.subwriters.append(w)\n        return w\n\n    def include(self, path: str) -> str:\n        # `path` might be nested like: typing.Optional[typing.List[pokemon_service_server_sdk.model.GetPokemonSpecies]]\n        # we need to process every subpath in a nested path\n        paths = filter(lambda p: p, re.split(\"\\\\[|\\\\]|,| \", path))\n        for subpath in paths:\n            parts = subpath.rsplit(\".\", maxsplit=1)\n            # add `typing` to imports for a path like `typing.List`\n            # but skip if the path doesn't have any namespace like `str` or `bool`\n            if len(parts) == 2:\n                self.imports.add(parts[0])\n\n        return path\n\n    def fix_and_include(self, path: str) -> str:\n        return self.include(self.fix_path(path))\n\n    def define(self, code: str) -> None:\n        self.defs.append(code)\n\n    def generic(self, name: str) -> None:\n        self.generics.add(name)\n\n    def dump(self) -> None:\n        for w in self.subwriters:\n            w.dump()\n\n        generics = \"\"\n        for g in sorted(self.generics):\n            generics += f\"{g} = {self.include('typing.TypeVar')}('{g}')\\n\"\n\n        self.path.parent.mkdir(parents=True, exist_ok=True)\n        contents = join([f\"import {p}\" for p in sorted(self.imports)])\n        contents += \"\\n\\n\"\n        if generics:\n            contents += generics + \"\\n\"\n        contents += join(self.defs)\n        self.path.write_text(contents)\n\n\nclass DocstringParserResult:\n    def __init__(self) -> None:\n        self.types: List[str] = []\n        self.params: List[Tuple[str, str]] = []\n        self.rtypes: List[str] = []\n        self.generics: List[str] = []\n        self.extends: List[str] = []\n\n\ndef parse_type_directive(line: str, res: DocstringParserResult):\n    parts = line.split(\" \", maxsplit=1)\n    if len(parts) != 2:\n        raise ValueError(f\"Invalid `:type` directive: `{line}` must be in `:type T:` format\")\n    res.types.append(parts[1].rstrip(\":\"))\n\n\ndef parse_rtype_directive(line: str, res: DocstringParserResult):\n    parts = line.split(\" \", maxsplit=1)\n    if len(parts) != 2:\n        raise ValueError(f\"Invalid `:rtype` directive: `{line}` must be in `:rtype T:` format\")\n    res.rtypes.append(parts[1].rstrip(\":\"))\n\n\ndef parse_param_directive(line: str, res: DocstringParserResult):\n    parts = line.split(\" \", maxsplit=2)\n    if len(parts) != 3:\n        raise ValueError(f\"Invalid `:param` directive: `{line}` must be in `:param name T:` format\")\n    name = parts[1]\n    ty = parts[2].rstrip(\":\")\n    res.params.append((name, ty))\n\n\ndef parse_generic_directive(line: str, res: DocstringParserResult):\n    parts = line.split(\" \", maxsplit=1)\n    if len(parts) != 2:\n        raise ValueError(f\"Invalid `:generic` directive: `{line}` must be in `:generic T:` format\")\n    res.generics.append(parts[1].rstrip(\":\"))\n\n\ndef parse_extends_directive(line: str, res: DocstringParserResult):\n    parts = line.split(\" \", maxsplit=1)\n    if len(parts) != 2:\n        raise ValueError(f\"Invalid `:extends` directive: `{line}` must be in `:extends Base[...]:` format\")\n    res.extends.append(parts[1].rstrip(\":\"))\n\n\nDocstringParserDirectives = {\n    \"type\": parse_type_directive,\n    \"param\": parse_param_directive,\n    \"rtype\": parse_rtype_directive,\n    \"generic\": parse_generic_directive,\n    \"extends\": parse_extends_directive,\n}\n\n\nclass DocstringParser:\n    \"\"\"\n    DocstringParser provides utilities for parsing type information from docstring.\n    \"\"\"\n\n    @staticmethod\n    def parse(obj: Any) -> Optional[DocstringParserResult]:\n        doc = inspect.getdoc(obj)\n        if not doc:\n            return None\n\n        res = DocstringParserResult()\n        for line in doc.splitlines():\n            line = line.strip()\n            for d, p in DocstringParserDirectives.items():\n                if line.startswith(f\":{d} \") and line.endswith(\":\"):\n                    p(line, res)\n        return res\n\n    @staticmethod\n    def parse_type(obj: Any) -> str:\n        result = DocstringParser.parse(obj)\n        if not result or len(result.types) == 0:\n            return \"typing.Any\"\n        return result.types[0]\n\n    @staticmethod\n    def parse_function(obj: Any) -> Optional[Tuple[List[Tuple[str, str]], str]]:\n        result = DocstringParser.parse(obj)\n        if not result:\n            return None\n\n        return (\n            result.params,\n            \"None\" if len(result.rtypes) == 0 else result.rtypes[0],\n        )\n\n    @staticmethod\n    def parse_class(obj: Any) -> Tuple[List[str], List[str]]:\n        result = DocstringParser.parse(obj)\n        if not result:\n            return ([], [])\n        return (result.generics, result.extends)\n\n    @staticmethod\n    def clean_doc(obj: Any) -> str:\n        doc = inspect.getdoc(obj)\n        if not doc:\n            return \"\"\n\n        def predicate(line: str) -> bool:\n            for k in DocstringParserDirectives.keys():\n                if line.startswith(f\":{k} \") and line.endswith(\":\"):\n                    return False\n            return True\n\n        return \"\\n\".join([line for line in doc.splitlines() if predicate(line)]).strip()\n\n\ndef indent(code: str, level: int = 4) -> str:\n    return textwrap.indent(code, level * \" \")\n\n\ndef is_fn_like(obj: Any) -> bool:\n    return (\n        inspect.isbuiltin(obj)\n        or inspect.ismethod(obj)\n        or inspect.isfunction(obj)\n        or inspect.ismethoddescriptor(obj)\n        or inspect.iscoroutine(obj)\n        or inspect.iscoroutinefunction(obj)\n    )\n\n\ndef is_scalar(obj: Any) -> bool:\n    return isinstance(obj, (str, float, int, bool))\n\n\ndef join(args: List[str], delim: str = \"\\n\") -> str:\n    return delim.join(filter(lambda x: x, args))\n\n\ndef make_doc(obj: Any) -> str:\n    doc = DocstringParser.clean_doc(obj)\n    doc = textwrap.dedent(doc)\n    if not doc:\n        return \"\"\n\n    return join(['\"\"\"', doc, '\"\"\"'])\n\n\ndef make_field(writer: Writer, name: str, field: Any) -> str:\n    return f\"{name}: {writer.fix_and_include(DocstringParser.parse_type(field))}\"\n\n\ndef make_function(\n    writer: Writer,\n    name: str,\n    obj: Any,\n    include_docs: bool = True,\n    parent: Optional[Any] = None,\n) -> str:\n    is_static_method = False\n    if parent and isinstance(obj, staticmethod):\n        # Get real method instance from `parent` if `obj` is a `staticmethod`\n        is_static_method = True\n        obj = getattr(parent, name)\n\n    res = DocstringParser.parse_function(obj)\n    if not res:\n        # Make it `Any` if we can't parse the docstring\n        return f\"{name}: {writer.include('typing.Any')}\"\n\n    params, rtype = res\n    # We're using signature for getting default values only, currently type hints are not supported\n    # in signatures. We can leverage signatures more if it supports type hints in future.\n    sig: Optional[inspect.Signature] = None\n    try:\n        sig = inspect.signature(obj)\n    except Exception:\n        pass\n\n    def has_default(param: str, ty: str) -> bool:\n        # PyO3 allows omitting `Option<T>` params while calling a Rust function from Python,\n        # we should always mark `typing.Optional[T]` values as they have default values to allow same\n        # flexibiliy as runtime dynamics in type-stubs.\n        if ty.startswith(\"typing.Optional[\"):\n            return True\n\n        if sig is None:\n            return False\n\n        sig_param = sig.parameters.get(param)\n        return sig_param is not None and sig_param.default is not sig_param.empty\n\n    receivers: List[str] = []\n    attrs: List[str] = []\n    if parent:\n        if is_static_method:\n            attrs.append(\"@staticmethod\")\n        else:\n            receivers.append(\"self\")\n\n    def make_param(name: str, ty: str) -> str:\n        fixed_ty = writer.fix_and_include(ty)\n        param = f\"{name}: {fixed_ty}\"\n        if has_default(name, fixed_ty):\n            param += \" = ...\"\n        return param\n\n    params = join(receivers + [make_param(n, t) for n, t in params], delim=\", \")\n    attrs_str = join(attrs)\n    rtype = writer.fix_and_include(rtype)\n    body = \"...\"\n    if include_docs:\n        body = join([make_doc(obj), body])\n\n    return f\"\"\"\n{attrs_str}\ndef {name}({params}) -> {rtype}:\n{indent(body)}\n\"\"\".lstrip()\n\n\ndef make_class(writer: Writer, name: str, klass: Any) -> str:\n    bases = list(filter(lambda n: n != \"object\", map(lambda b: b.__name__, klass.__bases__)))\n    class_sig = DocstringParser.parse_class(klass)\n    if class_sig:\n        (generics, extends) = class_sig\n        bases.extend(map(writer.fix_and_include, extends))\n        for g in generics:\n            writer.generic(g)\n\n    members: List[str] = []\n\n    class_vars: Dict[str, Any] = vars(klass)\n    for member_name, member in sorted(class_vars.items(), key=lambda k: k[0]):\n        if member_name.startswith(\"__\"):\n            continue\n\n        if inspect.isdatadescriptor(member):\n            members.append(\n                join(\n                    [\n                        make_field(writer, member_name, member),\n                        make_doc(member),\n                    ]\n                )\n            )\n        elif is_fn_like(member):\n            members.append(\n                make_function(writer, member_name, member, parent=klass),\n            )\n        elif isinstance(member, klass):\n            # Enum variant\n            members.append(\n                join(\n                    [\n                        f\"{member_name}: {name}\",\n                        make_doc(member),\n                    ]\n                )\n            )\n        else:\n            print(f\"Unknown member type: {member}\")\n\n    if inspect.getdoc(klass) is not None:\n        constructor_sig = DocstringParser.parse(klass)\n        if constructor_sig is not None and (\n            # Make sure to only generate `__init__` if the class has a constructor defined\n            len(constructor_sig.rtypes) > 0\n            or len(constructor_sig.params) > 0\n        ):\n            members.append(\n                make_function(\n                    writer,\n                    \"__init__\",\n                    klass,\n                    include_docs=False,\n                    parent=klass,\n                )\n            )\n\n    bases_str = \"\" if len(bases) == 0 else f\"({join(bases, delim=', ')})\"\n    doc = make_doc(klass)\n    if doc:\n        doc += \"\\n\"\n    body = join([doc, join(members, delim=\"\\n\\n\") or \"...\"])\n    return f\"\"\"\\\nclass {name}{bases_str}:\n{indent(body)}\n\"\"\"\n\n\ndef walk_module(writer: Writer, mod: Any):\n    exported = mod.__all__\n\n    for name, member in inspect.getmembers(mod):\n        if name not in exported:\n            continue\n\n        if inspect.ismodule(member):\n            subpath = writer.path.parent / name / \"__init__.pyi\"\n            walk_module(writer.submodule(subpath), member)\n        elif inspect.isclass(member):\n            writer.define(make_class(writer, name, member))\n        elif is_fn_like(member):\n            writer.define(make_function(writer, name, member))\n        elif is_scalar(member):\n            writer.define(f\"{name}: {type(member).__name__} = ...\")\n        else:\n            print(f\"Unknown type: {member}\")\n\n\ndef generate(module: str, outdir: str):\n    path = Path(outdir) / \"__init__.pyi\"\n    writer = Writer(\n        path,\n        module,\n    )\n    walk_module(\n        writer,\n        importlib.import_module(module),\n    )\n    writer.dump()\n\n\nif __name__ == \"__main__\":\n    import argparse\n    import importlib\n\n    parser = argparse.ArgumentParser()\n    parser.add_argument(\"module\")\n    parser.add_argument(\"outdir\")\n    args = parser.parse_args()\n\n    generate(args.module, args.outdir)\n"
  },
  {
    "path": "codegen-server/codegen-server-python/src/main/resources/stubgen.sh",
    "content": "#!/usr/bin/env bash\n#  Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n#  SPDX-License-Identifier: Apache-2.0\n\nset -x\n\nif [ $# -lt 3 ]; then\n    echo \"usage: $0 package manifest_path output_directory\"\n    exit 1\nfi\n\n# input arguments\npackage=$1\nmanifest=$2\noutput=$3\n\n# the directory of the script\nsource_dir=\"$(git rev-parse --show-toplevel)\"\nscript_dir=\"$(cd \"$(dirname \"${BASH_SOURCE[0]}\")\" && pwd)\"\nif [ -n \"$source_dir\" ]; then\n    CARGO_TARGET_DIR=\"$source_dir/target\"\nelse\n    CARGO_TARGET_DIR=$(mktemp -d)\n    mkdir -p \"$CARGO_TARGET_DIR\"\n    # cleanup temporary directory\n    function cleanup {\n        # shellcheck disable=2317\n        rm -rf \"$CARGO_TARGET_DIR\"\n    }\n    # register the cleanup function to be called on the EXIT signal\n    trap cleanup EXIT\nfi\nexport CARGO_TARGET_DIR\n\nshared_object_extension=\"so\"\n# generate the Python stubs,\nif [ \"$(uname)\" == \"Darwin\" ]; then\n    shared_object_extension=\"dylib\"\n    export CARGO_TARGET_X86_64_APPLE_DARWIN_RUSTFLAGS=\"-C link-arg=-undefined -C link-arg=dynamic_lookup\"\n    export CARGO_TARGET_AARCH64_APPLE_DARWIN_RUSTFLAGS=\"-C link-arg=-undefined -C link-arg=dynamic_lookup\"\nfi\n\ncargo build --manifest-path \"$manifest\"\n# The link target have to end with .so to be sure it is importable by the stubgen.py script.\nln -sf \"$CARGO_TARGET_DIR/debug/lib$package.$shared_object_extension\" \"$CARGO_TARGET_DIR/debug/$package.so\"\nPYTHONPATH=$CARGO_TARGET_DIR/debug:$PYTHONPATH python3 \"$script_dir/stubgen.py\" \"$package\" \"$output\"\n\nexit 0\n"
  },
  {
    "path": "codegen-server/codegen-server-python/src/test/kotlin/software/amazon/smithy/rust/codegen/server/python/smithy/generators/PythonServerRequiredPrecedeOptionalTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.python.smithy.generators\n\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.unitTest\nimport software.amazon.smithy.rust.codegen.server.python.smithy.PythonServerCargoDependency\nimport software.amazon.smithy.rust.codegen.server.python.smithy.testutil.cargoTest\nimport software.amazon.smithy.rust.codegen.server.python.smithy.testutil.executePythonServerCodegenVisitor\nimport software.amazon.smithy.rust.codegen.server.python.smithy.testutil.generatePythonServerPluginContext\nimport kotlin.io.path.appendText\n\ninternal class PythonServerRequiredPrecedeOptionalTest {\n    @Test\n    fun `mandatory fields are reordered to be before optional`() {\n        val model =\n            \"\"\"\n            namespace test\n\n            use aws.protocols#restJson1\n            use smithy.framework#ValidationException\n\n            @restJson1\n            service SampleService {\n                operations: [\n                    OpWithIncorrectOrder, OpWithCorrectOrder, OpWithDefaults\n                ],\n            }\n\n            @http(method: \"POST\", uri: \"/opIncorrect\")\n            operation OpWithIncorrectOrder {\n                input:= {\n                    a: String\n                    @required\n                    b: String\n                    c: String\n                    @required\n                    d: String\n                }\n                output:= {\n                    a: String\n                    @required\n                    b: String\n                    c: String\n                    @required\n                    d: String\n                }\n                errors: [ValidationException]\n            }\n\n            @http(method: \"POST\", uri: \"/opCorrect\")\n            operation OpWithCorrectOrder {\n                input:= {\n                    @required\n                    b: String\n                    @required\n                    d: String\n                    a: String\n                    c: String\n                }\n                output:= {\n                    @required\n                    b: String\n                    @required\n                    d: String\n                    a: String\n                    c: String\n                }\n                errors: [ValidationException]\n            }\n\n            @http(method: \"POST\", uri: \"/opWithDefaults\")\n            operation OpWithDefaults {\n                input:= {\n                    a: String,\n                    b: String = \"hi\"\n                }\n                output:= {\n                    a: String,\n                    b: String = \"hi\"\n                }\n            }\n            \"\"\".asSmithyModel(smithyVersion = \"2\")\n\n        val (pluginCtx, testDir) = generatePythonServerPluginContext(model)\n        executePythonServerCodegenVisitor(pluginCtx)\n\n        val writer = RustWriter.forModule(\"service\")\n        writer.unitTest(\"test_required_fields\") {\n            fun createInstanceWithRequiredFieldsOnly(\n                module: String,\n                typeName: String,\n            ) = writable {\n                rustTemplate(\n                    \"\"\"\n                    py.run(\n                        \"data = $typeName(\\\"b\\\", \\\"d\\\")\",\n                        Some(globals),\n                        Some(locals),\n                    ).unwrap();\n\n                    // Python should have been able to construct input.\n                    let data = locals\n                        .get_item(\"data\")\n                        .expect(\"Python exception occurred during dictionary lookup\")\n                        .unwrap()\n                        .extract::<$module::$typeName>()\n                        .unwrap();\n                    assert_eq!(data.b, \"b\");\n                    assert_eq!(data.d, \"d\");\n                    \"\"\",\n                )\n            }\n\n            fun createInstance(\n                module: String,\n                typeName: String,\n            ) = writable {\n                rustTemplate(\n                    \"\"\"\n                    py.run(\n                        \"data = $typeName(\\\"b\\\", \\\"d\\\", a = \\\"a\\\", c = \\\"c\\\")\",\n                        Some(globals),\n                        Some(locals),\n                    ).unwrap();\n\n                    // Python should have been able to construct input.\n                    let data = locals\n                        .get_item(\"data\")\n                        .expect(\"Python exception occurred during dictionary lookup\")\n                        .unwrap()\n                        .extract::<$module::$typeName>()\n                        .unwrap();\n                    assert_eq!(data.b, \"b\");\n                    assert_eq!(data.d, \"d\");\n                    assert_eq!(data.a, Some(\"a\".to_string()));\n                    assert_eq!(data.c, Some(\"c\".to_string()));\n                    \"\"\",\n                )\n            }\n\n            fun createDefaultInstance(\n                module: String,\n                typeName: String,\n            ) = writable {\n                rustTemplate(\n                    \"\"\"\n                    // Default values are not exported from Rust. However, they\n                    // are marked as non-optional.\n                    py.run(\n                        \"data = $typeName(\\\"b\\\", \\\"a\\\")\",\n                        Some(globals),\n                        Some(locals),\n                    ).unwrap();\n\n                    // Python should have been able to construct input.\n                    let data = locals\n                        .get_item(\"data\")\n                        .expect(\"Python exception occurred during dictionary lookup\")\n                        .unwrap()\n                        .extract::<$module::$typeName>()\n                        .unwrap();\n                    assert_eq!(data.a, Some(\"a\".to_string()));\n                    assert_eq!(data.b, \"b\");\n                    \"\"\",\n                )\n            }\n\n            rustTemplate(\n                \"\"\"\n                use crate::{input, output};\n                use #{pyo3}::{types::IntoPyDict, Python};\n\n                pyo3::prepare_freethreaded_python();\n                Python::with_gil(|py| {\n                    let globals = [\n                        (\"OpWithIncorrectOrderInput\", py.get_type::<input::OpWithIncorrectOrderInput>()),\n                        (\"OpWithCorrectOrderInput\", py.get_type::<input::OpWithCorrectOrderInput>()),\n                        (\"OpWithDefaultsInput\", py.get_type::<input::OpWithDefaultsInput>()),\n                        (\"OpWithIncorrectOrderOutput\", py.get_type::<output::OpWithIncorrectOrderOutput>()),\n                        (\"OpWithCorrectOrderOutput\", py.get_type::<output::OpWithCorrectOrderOutput>()),\n                        (\"OpWithDefaultsOutput\", py.get_type::<output::OpWithDefaultsOutput>())\n                        ]\n                        .into_py_dict(py);\n\n                    let locals = [(\"OpWithIncorrectOrderInput\", py.get_type::<input::OpWithIncorrectOrderInput>())].into_py_dict(py);\n\n                    #{IncorrectOrderInputRequiredOnly}\n                    #{CorrectOrderInputRequiredOnly}\n                    #{IncorrectOrderOutputRequiredOnly}\n                    #{CorrectOrderOutputRequiredOnly}\n                    #{IncorrectOrderInput}\n                    #{CorrectOrderInput}\n                    #{IncorrectOrderOutput}\n                    #{CorrectOrderOutput}\n                    #{DefaultsInput}\n                    #{DefaultsOutput}\n                });\n                \"\"\",\n                \"pyo3\" to PythonServerCargoDependency.PyO3.toDevDependency().toType(),\n                \"IncorrectOrderInputRequiredOnly\" to createInstanceWithRequiredFieldsOnly(\"input\", \"OpWithIncorrectOrderInput\"),\n                \"CorrectOrderInputRequiredOnly\" to createInstanceWithRequiredFieldsOnly(\"input\", \"OpWithCorrectOrderInput\"),\n                \"IncorrectOrderOutputRequiredOnly\" to createInstanceWithRequiredFieldsOnly(\"output\", \"OpWithIncorrectOrderOutput\"),\n                \"CorrectOrderOutputRequiredOnly\" to createInstanceWithRequiredFieldsOnly(\"output\", \"OpWithCorrectOrderOutput\"),\n                \"IncorrectOrderInput\" to createInstance(\"input\", \"OpWithIncorrectOrderInput\"),\n                \"CorrectOrderInput\" to createInstance(\"input\", \"OpWithCorrectOrderInput\"),\n                \"IncorrectOrderOutput\" to createInstance(\"output\", \"OpWithIncorrectOrderOutput\"),\n                \"CorrectOrderOutput\" to createInstance(\"output\", \"OpWithCorrectOrderOutput\"),\n                \"DefaultsInput\" to createDefaultInstance(\"input\", \"OpWithDefaultsInput\"),\n                \"DefaultsOutput\" to createDefaultInstance(\"output\", \"OpWithDefaultsOutput\"),\n            )\n        }\n\n        testDir.resolve(\"src/service.rs\").appendText(writer.toString())\n\n        cargoTest(testDir)\n    }\n}\n"
  },
  {
    "path": "codegen-server/codegen-server-python/src/test/kotlin/software/amazon/smithy/rust/codegen/server/python/smithy/generators/PythonServerSymbolProviderTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.python.smithy.generators\n\nimport io.kotest.matchers.shouldBe\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustType\nimport software.amazon.smithy.rust.codegen.core.smithy.rustType\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.server.python.smithy.PythonServerSymbolVisitor\nimport software.amazon.smithy.rust.codegen.server.smithy.testutil.ServerTestRustSymbolProviderConfig\nimport software.amazon.smithy.rust.codegen.server.smithy.testutil.serverTestRustSettings\n\ninternal class PythonServerSymbolProviderTest {\n    private val pythonBlobType = RustType.Opaque(\"Blob\", \"::aws_smithy_http_server_python::types\")\n    private val pythonTimestampType = RustType.Opaque(\"DateTime\", \"::aws_smithy_http_server_python::types\")\n\n    @Test\n    fun `python symbol provider rewrites timestamp shape symbol`() {\n        val model =\n            \"\"\"\n            namespace test\n\n            structure TimestampStruct {\n                @required\n                inner: Timestamp\n            }\n\n            structure TimestampStructOptional {\n                inner: Timestamp\n            }\n\n            list TimestampList {\n                member: Timestamp\n            }\n\n            set TimestampSet {\n                member: Timestamp\n            }\n\n            map TimestampMap {\n                key: String,\n                value: Timestamp\n            }\n            \"\"\".asSmithyModel()\n        val provider =\n            PythonServerSymbolVisitor(serverTestRustSettings(), model, null, ServerTestRustSymbolProviderConfig)\n\n        // Struct test\n        val timestamp = provider.toSymbol(model.expectShape(ShapeId.from(\"test#TimestampStruct\\$inner\"))).rustType()\n        timestamp shouldBe pythonTimestampType\n\n        // Optional struct test\n        val optionalTimestamp = provider.toSymbol(model.expectShape(ShapeId.from(\"test#TimestampStructOptional\\$inner\"))).rustType()\n        optionalTimestamp shouldBe RustType.Option(pythonTimestampType)\n\n        // List test\n        val timestampList = provider.toSymbol(model.expectShape(ShapeId.from(\"test#TimestampList\"))).rustType()\n        timestampList shouldBe RustType.Vec(pythonTimestampType)\n\n        // Set test\n        val timestampSet = provider.toSymbol(model.expectShape(ShapeId.from(\"test#TimestampSet\"))).rustType()\n        timestampSet shouldBe RustType.Vec(pythonTimestampType)\n\n        // Map test\n        val timestampMap = provider.toSymbol(model.expectShape(ShapeId.from(\"test#TimestampMap\"))).rustType()\n        timestampMap shouldBe RustType.HashMap(RustType.String, pythonTimestampType)\n    }\n\n    @Test\n    fun `python symbol provider rewrites blob shape symbol`() {\n        val model =\n            \"\"\"\n            namespace test\n\n            structure BlobStruct {\n                @required\n                inner: Blob\n            }\n\n            structure BlobStructOptional {\n                inner: Blob\n            }\n\n            list BlobList {\n                member: Blob\n            }\n\n            set BlobSet {\n                member: Blob\n            }\n\n            map BlobMap {\n                key: String,\n                value: Blob\n            }\n            \"\"\".asSmithyModel()\n        val provider =\n            PythonServerSymbolVisitor(serverTestRustSettings(), model, null, ServerTestRustSymbolProviderConfig)\n\n        // Struct test\n        val blob = provider.toSymbol(model.expectShape(ShapeId.from(\"test#BlobStruct\\$inner\"))).rustType()\n        blob shouldBe pythonBlobType\n\n        // Optional struct test\n        val optionalBlob = provider.toSymbol(model.expectShape(ShapeId.from(\"test#BlobStructOptional\\$inner\"))).rustType()\n        optionalBlob shouldBe RustType.Option(pythonBlobType)\n\n        // List test\n        val blobList = provider.toSymbol(model.expectShape(ShapeId.from(\"test#BlobList\"))).rustType()\n        blobList shouldBe RustType.Vec(pythonBlobType)\n\n        // Set test\n        val blobSet = provider.toSymbol(model.expectShape(ShapeId.from(\"test#BlobSet\"))).rustType()\n        blobSet shouldBe RustType.Vec(pythonBlobType)\n\n        // Map test\n        val blobMap = provider.toSymbol(model.expectShape(ShapeId.from(\"test#BlobMap\"))).rustType()\n        blobMap shouldBe RustType.HashMap(RustType.String, pythonBlobType)\n    }\n}\n"
  },
  {
    "path": "codegen-server/codegen-server-python/src/test/kotlin/software/amazon/smithy/rust/codegen/server/python/smithy/generators/PythonServerTypesTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.python.smithy.generators\n\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.tokioTest\nimport software.amazon.smithy.rust.codegen.core.util.dq\nimport software.amazon.smithy.rust.codegen.server.python.smithy.testutil.cargoTest\nimport software.amazon.smithy.rust.codegen.server.python.smithy.testutil.executePythonServerCodegenVisitor\nimport software.amazon.smithy.rust.codegen.server.python.smithy.testutil.generatePythonServerPluginContext\nimport kotlin.io.path.appendText\n\ninternal class PythonServerTypesTest {\n    @Test\n    fun `document type`() {\n        val model =\n            \"\"\"\n            namespace test\n\n            use aws.protocols#restJson1\n\n            @restJson1\n            service Service {\n                operations: [\n                    Echo,\n                ],\n            }\n\n            @http(method: \"POST\", uri: \"/echo\")\n            operation Echo {\n                input: EchoInput,\n                output: EchoOutput,\n            }\n\n            structure EchoInput {\n                value: Document,\n            }\n\n            structure EchoOutput {\n                value: Document,\n            }\n            \"\"\".asSmithyModel()\n\n        val (pluginCtx, testDir) = generatePythonServerPluginContext(model)\n        executePythonServerCodegenVisitor(pluginCtx)\n\n        val testCases =\n            listOf(\n                Pair(\n                    \"\"\" { \"value\": 42 } \"\"\",\n                    \"\"\"\n                    assert input.value == 42\n                    output = EchoOutput(value=input.value)\n                    \"\"\",\n                ),\n                Pair(\n                    \"\"\" { \"value\": \"foobar\" } \"\"\",\n                    \"\"\"\n                    assert input.value == \"foobar\"\n                    output = EchoOutput(value=input.value)\n                    \"\"\",\n                ),\n                Pair(\n                    \"\"\"\n                    {\n                        \"value\": [\n                            true,\n                            false,\n                            42,\n                            42.0,\n                            -42,\n                            {\n                                \"nested\": \"value\"\n                            },\n                            {\n                                \"nested\": [1, 2, 3]\n                            }\n                        ]\n                    }\n                    \"\"\",\n                    \"\"\"\n                    assert input.value == [True, False, 42, 42.0, -42, {\"nested\": \"value\"}, {\"nested\": [1, 2, 3]}]\n                    output = EchoOutput(value=input.value)\n                    \"\"\",\n                ),\n            )\n\n        val writer = RustWriter.forModule(\"service\")\n        writer.tokioTest(\"document_type\") {\n            rust(\n                \"\"\"\n                use tower::Service as _;\n                use pyo3::{types::IntoPyDict, IntoPy, Python};\n                use hyper::{Body, Request, body};\n                use crate::{input, output};\n\n                pyo3::prepare_freethreaded_python();\n                \"\"\".trimIndent(),\n            )\n\n            testCases.forEach {\n                val payload = it.first.replace(\" \", \"\").replace(\"\\n\", \"\")\n                val pythonHandler = it.second.trimIndent()\n                rust(\n                    \"\"\"\n                    let mut service = Service::builder_without_plugins()\n                        .echo(|input: input::EchoInput| async {\n                            Ok(Python::with_gil(|py| {\n                                let globals = [(\"EchoOutput\", py.get_type::<output::EchoOutput>())].into_py_dict(py);\n                                let locals = [(\"input\", input.into_py(py))].into_py_dict(py);\n\n                                py.run(${pythonHandler.dq()}, Some(globals), Some(locals)).unwrap();\n\n                                locals\n                                    .get_item(\"output\")\n                                    .expect(\"Python exception occurred during dictionary lookup\")\n                                    .unwrap()\n                                    .extract::<output::EchoOutput>()\n                                    .unwrap()\n                            }))\n                        })\n                        .build()\n                        .unwrap();\n\n                    let req = Request::builder()\n                        .method(\"POST\")\n                        .uri(\"/echo\")\n                        .header(\"content-type\", \"application/json\")\n                        .body(Body::from(${payload.dq()}))\n                        .unwrap();\n\n                    let res = service.call(req).await.unwrap();\n                    assert!(res.status().is_success());\n                    let body = body::to_bytes(res.into_body()).await.unwrap();\n                    assert_eq!(body, ${payload.dq()});\n                    \"\"\".trimIndent(),\n                )\n            }\n        }\n\n        testDir.resolve(\"src/service.rs\").appendText(writer.toString())\n\n        cargoTest(testDir)\n    }\n\n    @Test\n    fun `timestamp type`() {\n        val model =\n            \"\"\"\n            namespace test\n\n            use aws.protocols#restJson1\n            use smithy.framework#ValidationException\n\n            @restJson1\n            service Service {\n                operations: [\n                    Echo,\n                ],\n            }\n\n            @http(method: \"POST\", uri: \"/echo\")\n            operation Echo {\n                input: EchoInput,\n                output: EchoOutput,\n                errors: [ValidationException],\n            }\n\n            structure EchoInput {\n                @required\n                value: Timestamp,\n                opt_value: Timestamp,\n            }\n\n            structure EchoOutput {\n                @required\n                value: Timestamp,\n                opt_value: Timestamp,\n            }\n            \"\"\".asSmithyModel()\n\n        val (pluginCtx, testDir) = generatePythonServerPluginContext(model)\n        executePythonServerCodegenVisitor(pluginCtx)\n\n        val writer = RustWriter.forModule(\"service\")\n        writer.tokioTest(\"timestamp_type\") {\n            rust(\n                \"\"\"\n                use tower::Service as _;\n                use pyo3::{types::IntoPyDict, IntoPy, Python};\n                use hyper::{Body, Request, body};\n                use crate::{input, output, python_types};\n\n                pyo3::prepare_freethreaded_python();\n\n                let mut service = Service::builder_without_plugins()\n                    .echo(|input: input::EchoInput| async {\n                        Ok(Python::with_gil(|py| {\n                            let globals = [\n                                (\"EchoOutput\", py.get_type::<output::EchoOutput>()),\n                                (\"DateTime\", py.get_type::<python_types::DateTime>()),\n                            ].into_py_dict(py);\n                            let locals = [(\"input\", input.into_py(py))].into_py_dict(py);\n\n                            py.run(\"assert input.value.secs() == 1676298520\", Some(globals), Some(locals)).unwrap();\n                            py.run(\"output = EchoOutput(value=input.value, opt_value=DateTime.from_secs(1677771678))\", Some(globals), Some(locals)).unwrap();\n\n                            locals\n                                .get_item(\"output\")\n                                .expect(\"Python exception occurred during dictionary lookup\")\n                                .unwrap()\n                                .extract::<output::EchoOutput>()\n                                .unwrap()\n                        }))\n                    })\n                    .build()\n                    .unwrap();\n\n                let req = Request::builder()\n                    .method(\"POST\")\n                    .uri(\"/echo\")\n                    .header(\"content-type\", \"application/json\")\n                    .body(Body::from(\"{\\\"value\\\":1676298520}\"))\n                    .unwrap();\n                let res = service.call(req).await.unwrap();\n                assert!(res.status().is_success());\n                let body = body::to_bytes(res.into_body()).await.unwrap();\n                let body = std::str::from_utf8(&body).unwrap();\n                assert!(body.contains(\"\\\"value\\\":1676298520\"));\n                assert!(body.contains(\"\\\"opt_value\\\":1677771678\"));\n                \"\"\".trimIndent(),\n            )\n        }\n\n        testDir.resolve(\"src/service.rs\").appendText(writer.toString())\n\n        cargoTest(testDir)\n    }\n}\n"
  },
  {
    "path": "codegen-server/codegen-server-python/src/test/kotlin/software/amazon/smithy/rust/codegen/server/python/smithy/generators/PythonTypeInformationGenerationTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.python.smithy.generators\n\nimport io.kotest.matchers.string.shouldContain\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.util.lookup\nimport software.amazon.smithy.rust.codegen.server.smithy.testutil.serverTestCodegenContext\n\ninternal class PythonTypeInformationGenerationTest {\n    @Test\n    fun `generates python type information`() {\n        val model =\n            \"\"\"\n            namespace test\n\n            structure Foo {\n                @required\n                bar: String,\n                baz: Integer\n            }\n            \"\"\".asSmithyModel()\n        val foo = model.lookup<StructureShape>(\"test#Foo\")\n\n        val codegenContext = serverTestCodegenContext(model)\n        val writer = RustWriter.forModule(\"model\")\n        PythonServerStructureGenerator(model, codegenContext, writer, foo).render()\n\n        val result = writer.toString()\n\n        // Constructor signature\n        result.shouldContain(\"/// :param bar str:\")\n        result.shouldContain(\"/// :param baz typing.Optional\\\\[int\\\\]:\")\n\n        // Field types\n        result.shouldContain(\"/// :type str:\")\n        result.shouldContain(\"/// :type typing.Optional\\\\[int\\\\]:\")\n    }\n}\n"
  },
  {
    "path": "codegen-server/codegen-server-typescript/build.gradle.kts",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nplugins {\n    id(\"smithy-rs.kotlin-conventions\")\n}\n\ndescription = \"Generates Rust/Node server-side code from Smithy models\"\nextra[\"displayName\"] = \"Smithy :: Rust :: Codegen :: Server :: Typescript\"\nextra[\"moduleName\"] = \"software.amazon.smithy.rust.codegen.server.typescript\"\n\ndependencies {\n    implementation(project(\":codegen-core\"))\n    implementation(project(\":codegen-server\"))\n    implementation(libs.smithy.aws.traits)\n    implementation(libs.smithy.protocol.test.traits)\n\n    testImplementation(libs.junit.jupiter)\n    testImplementation(libs.kotest.assertions.core.jvm)\n}\n"
  },
  {
    "path": "codegen-server/codegen-server-typescript/src/main/kotlin/software/amazon/smithy/rust/codegen/server/typescript/smithy/RustServerCodegenTsPlugin.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.typescript.smithy\n\nimport software.amazon.smithy.build.PluginContext\nimport software.amazon.smithy.build.SmithyBuildPlugin\nimport software.amazon.smithy.codegen.core.ReservedWordSymbolProvider\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.ServiceShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustReservedWordSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.BaseSymbolMetadataProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenTarget\nimport software.amazon.smithy.rust.codegen.core.smithy.EventStreamSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProviderConfig\nimport software.amazon.smithy.rust.codegen.core.smithy.SymbolVisitor\nimport software.amazon.smithy.rust.codegen.server.smithy.ConstrainedShapeSymbolMetadataProvider\nimport software.amazon.smithy.rust.codegen.server.smithy.ConstrainedShapeSymbolProvider\nimport software.amazon.smithy.rust.codegen.server.smithy.DeriveEqAndHashSymbolMetadataProvider\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerReservedWords\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerRustSettings\nimport software.amazon.smithy.rust.codegen.server.smithy.customizations.CustomValidationExceptionWithReasonDecorator\nimport software.amazon.smithy.rust.codegen.server.smithy.customizations.ServerRequiredCustomizations\nimport software.amazon.smithy.rust.codegen.server.smithy.customizations.SmithyValidationExceptionDecorator\nimport software.amazon.smithy.rust.codegen.server.smithy.customize.CombinedServerCodegenDecorator\nimport software.amazon.smithy.rust.codegen.server.smithy.customize.ServerCodegenDecorator\nimport software.amazon.smithy.rust.codegen.server.typescript.smithy.customizations.DECORATORS\nimport java.util.logging.Level\nimport java.util.logging.Logger\n\n/**\n * Rust with Typescript bindings Codegen Plugin.\n * This is the entrypoint for code generation, triggered by the smithy-build plugin.\n * `resources/META-INF.services/software.amazon.smithy.build.SmithyBuildPlugin` refers to this class by name which\n * enables the smithy-build plugin to invoke `execute` with all of the Smithy plugin context + models.\n */\nclass RustServerCodegenTsPlugin : SmithyBuildPlugin {\n    private val logger = Logger.getLogger(javaClass.name)\n\n    override fun getName(): String = \"rust-server-codegen-typescript\"\n\n    override fun execute(context: PluginContext) {\n        // Suppress extremely noisy logs about reserved words\n        Logger.getLogger(ReservedWordSymbolProvider::class.java.name).level = Level.OFF\n        // Discover [RustCodegenDecorators] on the classpath. [RustCodegenDecorator] return different types of\n        // customization. A customization is a function of:\n        // - location (e.g. the mutate section of an operation)\n        // - context (e.g. the of the operation)\n        // - writer: The active RustWriter at the given location\n        val codegenDecorator: CombinedServerCodegenDecorator =\n            CombinedServerCodegenDecorator.fromClasspath(\n                context,\n                ServerRequiredCustomizations(),\n                SmithyValidationExceptionDecorator(),\n                CustomValidationExceptionWithReasonDecorator(),\n                *DECORATORS,\n            )\n\n        // TsServerCodegenVisitor is the main driver of code generation that traverses the model and generates code\n        logger.info(\"Loaded plugin to generate Rust/Node bindings for the server SSDK for projection ${context.projectionName}\")\n        TsServerCodegenVisitor(context, codegenDecorator).execute()\n    }\n\n    companion object {\n        /**\n         * When generating code, smithy types need to be converted into Rust types—that is the core role of the symbol provider\n         *\n         * The Symbol provider is composed of a base [SymbolVisitor] which handles the core functionality, then is layered\n         * with other symbol providers, documented inline, to handle the full scope of Smithy types.\n         */\n        fun baseSymbolProvider(\n            settings: ServerRustSettings,\n            model: Model,\n            serviceShape: ServiceShape,\n            rustSymbolProviderConfig: RustSymbolProviderConfig,\n            constrainedTypes: Boolean = true,\n            includeConstrainedShapeProvider: Boolean = true,\n            codegenDecorator: ServerCodegenDecorator,\n        ) = TsServerSymbolVisitor(settings, model, serviceShape = serviceShape, config = rustSymbolProviderConfig)\n            // Generate public constrained types for directly constrained shapes.\n            // In the Typescript server project, this is only done to generate constrained types for simple shapes (e.g.\n            // a `string` shape with the `length` trait), but these always remain `pub(crate)`.\n            .let {\n                if (includeConstrainedShapeProvider) ConstrainedShapeSymbolProvider(it, serviceShape, constrainedTypes) else it\n            }\n            // Generate different types for EventStream shapes (e.g. transcribe streaming)\n            .let { EventStreamSymbolProvider(rustSymbolProviderConfig.runtimeConfig, it, CodegenTarget.SERVER) }\n            // Add Rust attributes (like `#[derive(PartialEq)]`) to generated shapes\n            .let { BaseSymbolMetadataProvider(it, additionalAttributes = listOf()) }\n            // Constrained shapes generate newtypes that need the same derives we place on types generated from aggregate shapes.\n            .let { ConstrainedShapeSymbolMetadataProvider(it, constrainedTypes) }\n            // Streaming shapes need different derives (e.g. they cannot derive Eq)\n            .let { TsStreamingShapeMetadataProvider(it) }\n            // Derive `Eq` and `Hash` if possible.\n            .let { DeriveEqAndHashSymbolMetadataProvider(it) }\n            // Rename shapes that clash with Rust reserved words & and other SDK specific features e.g. `send()` cannot\n            // be the name of an operation input\n            .let { RustReservedWordSymbolProvider(it, ServerReservedWords) }\n            // Allows decorators to inject a custom symbol provider\n            .let { codegenDecorator.symbolProvider(it) }\n    }\n}\n"
  },
  {
    "path": "codegen-server/codegen-server-typescript/src/main/kotlin/software/amazon/smithy/rust/codegen/server/typescript/smithy/TsServerCargoDependency.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.typescript.smithy\n\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.CratesIo\nimport software.amazon.smithy.rust.codegen.core.rustlang.DependencyScope\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig\n\n/**\n * Object used *exclusively* in the runtime of the Typescript server, for separation concerns.\n * Analogous to the companion object in [CargoDependency] and [software.amazon.smithy.rust.codegen.server.smithy.ServerCargoDependency]; see its documentation for details.\n * For a dependency that is used in the client, or in both the client and the server, use [CargoDependency] directly.\n */\nobject TsServerCargoDependency {\n    val Napi: CargoDependency = CargoDependency(\"napi\", CratesIo(\"2.11\"), features = setOf(\"tokio_rt\", \"napi8\"))\n    val NapiDerive: CargoDependency = CargoDependency(\"napi-derive\", CratesIo(\"2.11\"))\n    val NapiBuild: CargoDependency = CargoDependency(\"napi-build\", CratesIo(\"2.0\"), DependencyScope.Build)\n    val Tokio: CargoDependency = CargoDependency(\"tokio\", CratesIo(\"1.20.1\"), features = setOf(\"full\"))\n    val Tracing: CargoDependency = CargoDependency(\"tracing\", CratesIo(\"0.1\"))\n    val Tower: CargoDependency = CargoDependency(\"tower\", CratesIo(\"0.4\"))\n    val TowerHttp: CargoDependency = CargoDependency(\"tower-http\", CratesIo(\"0.3\"), features = setOf(\"trace\"))\n    val Hyper: CargoDependency =\n        CargoDependency(\"hyper\", CratesIo(\"0.14.12\"), features = setOf(\"server\", \"http1\", \"http2\", \"tcp\", \"stream\"))\n    val NumCpus: CargoDependency = CargoDependency(\"num_cpus\", CratesIo(\"1.13\"))\n    val ParkingLot: CargoDependency = CargoDependency(\"parking_lot\", CratesIo(\"0.12\"))\n    val Socket2: CargoDependency = CargoDependency(\"socket2\", CratesIo(\"0.4\"))\n\n    fun smithyHttpServer(runtimeConfig: RuntimeConfig) = runtimeConfig.smithyRuntimeCrate(\"smithy-http-server\")\n\n    fun smithyHttpServerTs(runtimeConfig: RuntimeConfig) =\n        runtimeConfig.smithyRuntimeCrate(\"smithy-http-server-typescript\")\n}\n"
  },
  {
    "path": "codegen-server/codegen-server-typescript/src/main/kotlin/software/amazon/smithy/rust/codegen/server/typescript/smithy/TsServerCodegenVisitor.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.typescript.smithy\n\nimport software.amazon.smithy.build.PluginContext\nimport software.amazon.smithy.codegen.core.CodegenException\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.knowledge.NullableIndex\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.ServiceShape\nimport software.amazon.smithy.model.shapes.StringShape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.shapes.UnionShape\nimport software.amazon.smithy.model.traits.EnumTrait\nimport software.amazon.smithy.model.traits.ErrorTrait\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenTarget\nimport software.amazon.smithy.rust.codegen.core.smithy.RustCrate\nimport software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProviderConfig\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.error.ErrorImplGenerator\nimport software.amazon.smithy.rust.codegen.core.util.getTrait\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenContext\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenVisitor\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerModuleDocProvider\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerModuleProvider\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerRustModule\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerRustSettings\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerSymbolProviders\nimport software.amazon.smithy.rust.codegen.server.smithy.customize.ServerCodegenDecorator\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.protocol.ServerProtocol\nimport software.amazon.smithy.rust.codegen.server.smithy.protocols.ServerProtocolLoader\nimport software.amazon.smithy.rust.codegen.server.typescript.smithy.generators.TsApplicationGenerator\nimport software.amazon.smithy.rust.codegen.server.typescript.smithy.generators.TsServerEnumGenerator\nimport software.amazon.smithy.rust.codegen.server.typescript.smithy.generators.TsServerOperationErrorGenerator\nimport software.amazon.smithy.rust.codegen.server.typescript.smithy.generators.TsServerOperationHandlerGenerator\nimport software.amazon.smithy.rust.codegen.server.typescript.smithy.generators.TsServerStructureGenerator\n\n/**\n * Entrypoint for Typescript server-side code generation. This class will walk the in-memory model and\n * generate all the needed types by calling the accept() function on the available shapes.\n *\n * This class inherits from [ServerCodegenVisitor] since it uses most of the functionalities of the super class\n * and have to override the symbol provider with [TsServerSymbolProvider].\n */\nclass TsServerCodegenVisitor(\n    context: PluginContext,\n    private val codegenDecorator: ServerCodegenDecorator,\n) : ServerCodegenVisitor(context, codegenDecorator) {\n    init {\n        val symbolVisitorConfig =\n            RustSymbolProviderConfig(\n                runtimeConfig = settings.runtimeConfig,\n                renameExceptions = false,\n                nullabilityCheckMode = NullableIndex.CheckMode.SERVER,\n                moduleProvider = ServerModuleProvider,\n            )\n        val baseModel = baselineTransform(context.model)\n        val service = settings.getService(baseModel)\n        val (protocol, generator) =\n            ServerProtocolLoader(\n                codegenDecorator.protocols(\n                    service.id,\n                    ServerProtocolLoader.defaultProtocols(),\n                ),\n            )\n                .protocolFor(context.model, service)\n        protocolGeneratorFactory = generator\n\n        model = codegenDecorator.transformModel(service, baseModel, settings)\n\n        // `publicConstrainedTypes` must always be `false` for the Typescript server, since Typescript generates its own\n        // wrapper newtypes.\n        settings = settings.copy(codegenConfig = settings.codegenConfig.copy(publicConstrainedTypes = false))\n\n        fun baseSymbolProviderFactory(\n            settings: ServerRustSettings,\n            model: Model,\n            serviceShape: ServiceShape,\n            rustSymbolProviderConfig: RustSymbolProviderConfig,\n            publicConstrainedTypes: Boolean,\n            includeConstraintShapeProvider: Boolean,\n            codegenDecorator: ServerCodegenDecorator,\n        ) = RustServerCodegenTsPlugin.baseSymbolProvider(\n            settings,\n            model,\n            serviceShape,\n            rustSymbolProviderConfig,\n            publicConstrainedTypes,\n            includeConstraintShapeProvider,\n            codegenDecorator,\n        )\n\n        val serverSymbolProviders =\n            ServerSymbolProviders.from(\n                settings,\n                model,\n                service,\n                symbolVisitorConfig,\n                settings.codegenConfig.publicConstrainedTypes,\n                codegenDecorator,\n                ::baseSymbolProviderFactory,\n            )\n\n        // Override `codegenContext` which carries the various symbol providers.\n        codegenContext =\n            ServerCodegenContext(\n                model,\n                serverSymbolProviders.symbolProvider,\n                null,\n                service,\n                protocol,\n                settings,\n                serverSymbolProviders.unconstrainedShapeSymbolProvider,\n                serverSymbolProviders.constrainedShapeSymbolProvider,\n                serverSymbolProviders.constraintViolationSymbolProvider,\n                serverSymbolProviders.pubCrateConstrainedShapeSymbolProvider,\n            )\n\n        codegenContext =\n            codegenContext.copy(\n                moduleDocProvider =\n                    codegenDecorator.moduleDocumentationCustomization(\n                        codegenContext,\n                        TsServerModuleDocProvider(ServerModuleDocProvider(codegenContext)),\n                    ),\n            )\n\n        // Override `rustCrate` which carries the symbolProvider.\n        rustCrate =\n            RustCrate(\n                context.fileManifest, codegenContext.symbolProvider, settings.codegenConfig,\n                codegenContext.expectModuleDocProvider(),\n            )\n        // Override `protocolGenerator` which carries the symbolProvider.\n        protocolGenerator = protocolGeneratorFactory.buildProtocolGenerator(codegenContext)\n    }\n\n    /**\n     * Structure Shape Visitor\n     *\n     * For each structure shape, generate:\n     * - A Rust structure for the shape ([StructureGenerator]).\n     * - A builder for the shape.\n     *\n     * This function _does not_ generate any serializers.\n     */\n    override fun structureShape(shape: StructureShape) {\n        logger.info(\"[js-server-codegen] Generating a structure $shape\")\n        rustCrate.useShapeWriter(shape) {\n            // Use Typescript specific structure generator that adds the #[napi] attribute\n            // and implementation.\n            TsServerStructureGenerator(model, codegenContext.symbolProvider, this, shape).render()\n\n            shape.getTrait<ErrorTrait>()?.also { errorTrait ->\n                ErrorImplGenerator(\n                    model,\n                    codegenContext.symbolProvider,\n                    this,\n                    shape,\n                    errorTrait,\n                    codegenDecorator.errorImplCustomizations(codegenContext, emptyList()),\n                ).render(CodegenTarget.SERVER)\n            }\n\n            renderStructureShapeBuilder(shape, this)\n        }\n    }\n\n    /**\n     * String Shape Visitor\n     *\n     * Although raw strings require no code generation, enums are actually [EnumTrait] applied to string shapes.\n     */\n    override fun stringShape(shape: StringShape) {\n        fun tsServerEnumGeneratorFactory(\n            codegenContext: ServerCodegenContext,\n            shape: StringShape,\n        ) = TsServerEnumGenerator(codegenContext, shape, validationExceptionConversionGenerator, emptyList())\n        stringShape(shape, ::tsServerEnumGeneratorFactory)\n    }\n\n    /**\n     * Union Shape Visitor\n     *\n     * Generate an `enum` for union shapes.\n     *\n     * Note: this does not generate serializers\n     */\n    override fun unionShape(shape: UnionShape) {\n        throw CodegenException(\"Union shapes are not supported in Typescript yet\")\n    }\n\n    /**\n     * Generate service-specific code for the model:\n     * - Serializers\n     * - Deserializers\n     * - Trait implementations\n     * - Protocol tests\n     * - Operation structures\n     * - Typescript operation handlers\n     */\n    override fun serviceShape(shape: ServiceShape) {\n        super.serviceShape(shape)\n\n        logger.info(\"[ts-server-codegen] Generating a service $shape\")\n\n        val serverProtocol = protocolGeneratorFactory.protocol(codegenContext) as ServerProtocol\n        rustCrate.withModule(TsServerRustModule.TsServerApplication) {\n            TsApplicationGenerator(codegenContext, serverProtocol).render(this)\n        }\n    }\n\n    override fun operationShape(shape: OperationShape) {\n        super.operationShape(shape)\n        rustCrate.withModule(TsServerRustModule.TsOperationAdapter) {\n            TsServerOperationHandlerGenerator(codegenContext, shape).render(this)\n        }\n\n        rustCrate.withModule(ServerRustModule.Error) {\n            TsServerOperationErrorGenerator(codegenContext.model, codegenContext.symbolProvider, shape).render(this)\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-server/codegen-server-typescript/src/main/kotlin/software/amazon/smithy/rust/codegen/server/typescript/smithy/TsServerModuleDocProvider.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.typescript.smithy\n\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustModule\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.docs\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.ModuleDocProvider\n\nobject TsServerRustModule {\n    val TsOperationAdapter = RustModule.public(\"ts_operation_adaptor\")\n    val TsServerApplication = RustModule.public(\"ts_server_application\")\n}\n\nclass TsServerModuleDocProvider(private val base: ModuleDocProvider) : ModuleDocProvider {\n    override fun docsWriter(module: RustModule.LeafModule): Writable? {\n        val strDoc: (String) -> Writable = { str -> writable { docs(str) } }\n        return when (module) {\n            TsServerRustModule.TsServerApplication -> strDoc(\"Ts server and application implementation.\")\n            // TODO(ServerTeam): Document this module (I don't have context)\n            TsServerRustModule.TsOperationAdapter -> null\n            else -> base.docsWriter(module)\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-server/codegen-server-typescript/src/main/kotlin/software/amazon/smithy/rust/codegen/server/typescript/smithy/TsServerRuntimeType.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.typescript.smithy\n\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\n\n/**\n * Object used *exclusively* in the runtime of the Node server, for separation concerns.\n * Analogous to the companion object in [RuntimeType] and [software.amazon.smithy.rust.codegen.server.smithy.ServerRuntimeType]; see its documentation for details.\n * For a runtime type that is used in the client, or in both the client and the server, use [RuntimeType] directly.\n */\nobject TsServerRuntimeType {\n    fun blob(runtimeConfig: RuntimeConfig) =\n        TsServerCargoDependency.smithyHttpServerTs(runtimeConfig).toType().resolve(\"types::Blob\")\n\n    fun byteStream(runtimeConfig: RuntimeConfig) =\n        TsServerCargoDependency.smithyHttpServerTs(runtimeConfig).toType().resolve(\"types::ByteStream\")\n\n    fun dateTime(runtimeConfig: RuntimeConfig) =\n        TsServerCargoDependency.smithyHttpServerTs(runtimeConfig).toType().resolve(\"types::DateTime\")\n\n    fun document(runtimeConfig: RuntimeConfig) =\n        TsServerCargoDependency.smithyHttpServerTs(runtimeConfig).toType().resolve(\"types::Document\")\n}\n"
  },
  {
    "path": "codegen-server/codegen-server-typescript/src/main/kotlin/software/amazon/smithy/rust/codegen/server/typescript/smithy/TsServerSymbolProvider.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.typescript.smithy\n\nimport software.amazon.smithy.codegen.core.Symbol\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.BlobShape\nimport software.amazon.smithy.model.shapes.DocumentShape\nimport software.amazon.smithy.model.shapes.ListShape\nimport software.amazon.smithy.model.shapes.MapShape\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.NumberShape\nimport software.amazon.smithy.model.shapes.ServiceShape\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.shapes.StringShape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.shapes.TimestampShape\nimport software.amazon.smithy.model.shapes.UnionShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustMetadata\nimport software.amazon.smithy.rust.codegen.core.rustlang.Visibility\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProviderConfig\nimport software.amazon.smithy.rust.codegen.core.smithy.SymbolMetadataProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.SymbolVisitor\nimport software.amazon.smithy.rust.codegen.core.smithy.expectRustMetadata\nimport software.amazon.smithy.rust.codegen.core.smithy.traits.SyntheticInputTrait\nimport software.amazon.smithy.rust.codegen.core.smithy.traits.SyntheticOutputTrait\nimport software.amazon.smithy.rust.codegen.core.util.hasStreamingMember\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\nimport software.amazon.smithy.rust.codegen.core.util.isStreaming\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerRustSettings\nimport java.util.logging.Logger\n\n/**\n * Symbol visitor  allowing that recursively replace symbols in nested shapes.\n *\n * Input / output / error structures can refer to complex types like the ones implemented inside\n * `aws_smithy_types` (a good example is `aws_smithy_types::Blob`).\n * `aws_smithy_http_server_typescript::types` wraps those types that do not implement directly the\n * `napi` trait and cannot be shared safely with Typescript, providing an idiomatic Typescript / Rust API.\n *\n * This symbol provider ensures types not implementing `pyo3::PyClass` are swapped with their wrappers from\n * `aws_smithy_http_server_typescript::types`.\n */\nclass TsServerSymbolVisitor(\n    settings: ServerRustSettings,\n    model: Model,\n    serviceShape: ServiceShape?,\n    config: RustSymbolProviderConfig,\n) : SymbolVisitor(settings, model, serviceShape, config) {\n    private val runtimeConfig = config.runtimeConfig\n    private val logger = Logger.getLogger(javaClass.name)\n\n    override fun toSymbol(shape: Shape): Symbol {\n        val initial = shape.accept(this)\n\n        if (shape !is MemberShape) {\n            return initial\n        }\n        val target = model.expectShape(shape.target)\n        val container = model.expectShape(shape.container)\n\n        // We are only targeting non-synthetic inputs and outputs.\n        if (!container.hasTrait<SyntheticOutputTrait>() && !container.hasTrait<SyntheticInputTrait>()) {\n            return initial\n        }\n\n        // We are only targeting streaming blobs as the rest of the symbols do not change if streaming is enabled.\n        // For example a TimestampShape doesn't become a different symbol when streaming is involved, but BlobShape\n        // become a ByteStream.\n        return if (target is BlobShape && shape.isStreaming(model)) {\n            TsServerRuntimeType.byteStream(runtimeConfig).toSymbol()\n        } else {\n            initial\n        }\n    }\n\n    override fun timestampShape(shape: TimestampShape?): Symbol {\n        return TsServerRuntimeType.dateTime(runtimeConfig).toSymbol()\n    }\n\n    override fun blobShape(shape: BlobShape?): Symbol {\n        return TsServerRuntimeType.blob(runtimeConfig).toSymbol()\n    }\n\n    override fun documentShape(shape: DocumentShape?): Symbol {\n        return TsServerRuntimeType.document(runtimeConfig).toSymbol()\n    }\n}\n\n/**\n * SymbolProvider to drop the PartialEq bounds in streaming shapes\n *\n * Streaming shapes equality cannot be checked without reading the body. Because of this, these shapes\n * do not implement `PartialEq`.\n *\n * Note that since streaming members can only be used on the root shape, this can only impact input and output shapes.\n */\nclass TsStreamingShapeMetadataProvider(private val base: RustSymbolProvider) : SymbolMetadataProvider(base) {\n    override fun structureMeta(structureShape: StructureShape): RustMetadata {\n        val baseMetadata = base.toSymbol(structureShape).expectRustMetadata()\n        return if (structureShape.hasStreamingMember(model)) {\n            baseMetadata.withoutDerives(RuntimeType.PartialEq)\n        } else {\n            baseMetadata\n        }\n    }\n\n    override fun unionMeta(unionShape: UnionShape): RustMetadata {\n        val baseMetadata = base.toSymbol(unionShape).expectRustMetadata()\n        return if (unionShape.hasStreamingMember(model)) {\n            baseMetadata.withoutDerives(RuntimeType.PartialEq)\n        } else {\n            baseMetadata\n        }\n    }\n\n    override fun memberMeta(memberShape: MemberShape) = base.toSymbol(memberShape).expectRustMetadata()\n\n    override fun enumMeta(stringShape: StringShape): RustMetadata =\n        RustMetadata(\n            setOf(RuntimeType.Eq, RuntimeType.Ord, RuntimeType.PartialEq, RuntimeType.PartialOrd, RuntimeType.Debug),\n            listOf(),\n            Visibility.PUBLIC,\n        )\n\n    override fun listMeta(listShape: ListShape) = base.toSymbol(listShape).expectRustMetadata()\n\n    override fun mapMeta(mapShape: MapShape) = base.toSymbol(mapShape).expectRustMetadata()\n\n    override fun stringMeta(stringShape: StringShape) = base.toSymbol(stringShape).expectRustMetadata()\n\n    override fun numberMeta(numberShape: NumberShape) = base.toSymbol(numberShape).expectRustMetadata()\n\n    override fun blobMeta(blobShape: BlobShape) = base.toSymbol(blobShape).expectRustMetadata()\n}\n"
  },
  {
    "path": "codegen-server/codegen-server-typescript/src/main/kotlin/software/amazon/smithy/rust/codegen/server/typescript/smithy/customizations/TsServerCodegenDecorator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.typescript.smithy.customizations\n\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.smithy.RustCrate\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.ManifestCustomizations\nimport software.amazon.smithy.rust.codegen.core.util.toSnakeCase\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenContext\nimport software.amazon.smithy.rust.codegen.server.smithy.customizations.AddInternalServerErrorToAllOperationsDecorator\nimport software.amazon.smithy.rust.codegen.server.smithy.customize.ServerCodegenDecorator\nimport software.amazon.smithy.rust.codegen.server.typescript.smithy.TsServerCargoDependency\n\n/**\n * Configure the [lib] section of `Cargo.toml`.\n *\n * [lib]\n * name = \"$CRATE_NAME\"\n * crate-type = [\"cdylib\"]\n */\nclass CdylibManifestDecorator : ServerCodegenDecorator {\n    override val name: String = \"CdylibDecorator\"\n    override val order: Byte = 0\n\n    override fun crateManifestCustomizations(codegenContext: ServerCodegenContext): ManifestCustomizations =\n        mapOf(\n            \"lib\" to\n                mapOf(\n                    \"crate-type\" to listOf(\"cdylib\"),\n                ),\n        )\n}\n\nclass NapiBuildRsDecorator : ServerCodegenDecorator {\n    override val name: String = \"NapiBuildRsDecorator\"\n    override val order: Byte = 0\n    private val napi_build = TsServerCargoDependency.NapiBuild.toType()\n\n    override fun extras(\n        codegenContext: ServerCodegenContext,\n        rustCrate: RustCrate,\n    ) {\n        rustCrate.withFile(\"build.rs\") {\n            rustTemplate(\n                \"\"\"\n                fn main() {\n                    #{napi_build}::setup();\n                }\n                \"\"\",\n                \"napi_build\" to napi_build,\n            )\n        }\n    }\n}\n\nclass NapiPackageJsonDecorator : ServerCodegenDecorator {\n    override val name: String = \"NapiPackageJsonDecorator\"\n    override val order: Byte = 0\n\n    override fun extras(\n        codegenContext: ServerCodegenContext,\n        rustCrate: RustCrate,\n    ) {\n        val name = codegenContext.settings.moduleName.toSnakeCase()\n        val version = codegenContext.settings.moduleVersion\n\n        // TODO(https://github.com/smithy-lang/smithy-rs/issues/2317): we should probably use a real JSON writer, but I did not want to add\n        //  other external libraries at this stage.\n        rustCrate.withFile(\"package.json\") {\n            val content = \"\"\"{\n                \"name\": \"@amzn/$name\",\n                \"version\": \"$version\",\n                \"main\": \"index.js\",\n                \"types\": \"index.d.ts\",\n                \"napi\": {\n                    \"name\": \"$name\",\n                    \"triple\": {}\n                },\n                \"devDependencies\": {\n                    \"@napi-rs/cli\": \">=2\",\n                    \"@types/node\": \">=18\"\n                },\n                \"engines\": {\n                    \"node\": \">=18\"\n                },\n                \"scripts\": {\n                    \"artifacts\": \"napi artifacts\",\n                    \"build\": \"napi build --platform --release\",\n                    \"build:debug\": \"napi build --platform\",\n                    \"prepublishOnly\": \"napi prepublish -t npm\",\n                    \"universal\": \"napi universal\",\n                    \"version\": \"napi version\"\n                },\n                \"packageManager\": \"yarn\",\n                \"dependencies\": {\n                    \"yarn\": \">=1\"\n                }\n}\"\"\"\n            this.write(content)\n        }\n    }\n}\n\nval DECORATORS =\n    arrayOf(\n        /*\n         * Add the [InternalServerError] error to all operations.\n         * This is done because the Typescript interpreter can raise eceptions during execution.\n         */\n        AddInternalServerErrorToAllOperationsDecorator(),\n        // Add the [lib] section to Cargo.toml to configure the generation of the shared library.\n        CdylibManifestDecorator(),\n        // Add the build.rs file needed to generate Typescript code.\n        NapiBuildRsDecorator(),\n        // Add the napi package.json.\n        NapiPackageJsonDecorator(),\n    )\n"
  },
  {
    "path": "codegen-server/codegen-server-typescript/src/main/kotlin/software/amazon/smithy/rust/codegen/server/typescript/smithy/generators/TsApplicationGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.typescript.smithy.generators\n\nimport software.amazon.smithy.model.knowledge.TopDownIndex\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute.Companion.derive\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlockTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenContext\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.util.toPascalCase\nimport software.amazon.smithy.rust.codegen.core.util.toSnakeCase\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerCargoDependency\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.protocol.ServerProtocol\nimport software.amazon.smithy.rust.codegen.server.typescript.smithy.TsServerCargoDependency\n\n/**\n * Generates a Typescript compatible application and server that can be configured from Typescript.\n */\nclass TsApplicationGenerator(\n    codegenContext: CodegenContext,\n    private val protocol: ServerProtocol,\n) {\n    private val index = TopDownIndex.of(codegenContext.model)\n    private val operations =\n        index.getContainedOperations(codegenContext.serviceShape).toSortedSet(\n            compareBy {\n                it.id\n            },\n        ).toList()\n    private val symbolProvider = codegenContext.symbolProvider\n    private val libName = codegenContext.settings.moduleName.toSnakeCase()\n    private val runtimeConfig = codegenContext.runtimeConfig\n    private val service = codegenContext.serviceShape\n    private val serviceName = service.id.name.toPascalCase()\n    private val model = codegenContext.model\n    private val codegenScope =\n        arrayOf(\n            \"SmithyServer\" to ServerCargoDependency.smithyHttpServer(runtimeConfig).toType(),\n            \"napi\" to TsServerCargoDependency.Napi.toType(),\n            \"napi_derive\" to TsServerCargoDependency.NapiDerive.toType(),\n            \"tokio\" to TsServerCargoDependency.Tokio.toType(),\n            \"tracing\" to TsServerCargoDependency.Tracing.toType(),\n            \"tower\" to TsServerCargoDependency.Tower.toType(),\n            \"tower_http\" to TsServerCargoDependency.TowerHttp.toType(),\n            \"num_cpus\" to TsServerCargoDependency.NumCpus.toType(),\n            \"hyper\" to TsServerCargoDependency.Hyper.toType(),\n            \"HashMap\" to RuntimeType.HashMap,\n            \"parking_lot\" to TsServerCargoDependency.ParkingLot.toType(),\n            \"http\" to RuntimeType.Http0x,\n            \"socket2\" to TsServerCargoDependency.Socket2.toType(),\n        )\n\n    fun render(writer: RustWriter) {\n        writer.write(\"use napi_derive::napi;\")\n        renderHandlers(writer)\n        renderApp(writer)\n\n        // TODO(https://github.com/napi-rs/napi-rs/issues/1377) Move these to be part of the runtime crate.\n        renderSocket(writer)\n        renderServer(writer)\n    }\n\n    fun renderHandlers(writer: RustWriter) {\n        Attribute(derive(RuntimeType.Clone)).render(writer)\n        writer.rustBlock(\"\"\"pub struct Handlers\"\"\") {\n            operations.map { operation ->\n                val operationName = symbolProvider.toSymbol(operation).name\n                val input = \"crate::input::${operationName}Input\"\n                val fnName = operationName.toSnakeCase()\n                rustTemplate(\n                    \"\"\"\n                    pub(crate) $fnName: #{napi}::threadsafe_function::ThreadsafeFunction<\n                        $input,\n                        #{napi}::threadsafe_function::ErrorStrategy::Fatal\n                    >,\n                    \"\"\",\n                    *codegenScope,\n                )\n            }\n        }\n        Attribute(\"\"\"napi(object)\"\"\").render(writer)\n        writer.rustBlock(\"pub struct TsHandlers\") {\n            operations.map { operation ->\n                val operationName = symbolProvider.toSymbol(operation).name\n                val input = \"${operationName}Input\"\n                val output = \"${operationName}Output\"\n                val fnName = operationName.toSnakeCase()\n                rustTemplate(\n                    \"\"\"\n                    ##[napi(ts_type = \"(input: $input) => Promise<$output>\")]\n                    pub $fnName: #{napi}::JsFunction,\n                    \"\"\",\n                    *codegenScope,\n                )\n            }\n        }\n    }\n\n    private fun renderApp(writer: RustWriter) {\n        Attribute(\"napi\").render(writer)\n        writer.rust(\n            \"\"\"\n            pub struct App {\n                handlers: Handlers,\n            }\n            \"\"\",\n        )\n        Attribute(\"napi\").render(writer)\n        writer.rustBlock(\"impl App\") {\n            renderAppCreate(writer)\n            renderAppStart(writer)\n        }\n    }\n\n    private fun renderAppCreate(writer: RustWriter) {\n        Attribute(\"napi(constructor)\").render(writer)\n        writer.rustBlockTemplate(\n            \"\"\"pub fn create(ts_handlers: TsHandlers) -> #{napi}::Result<Self>\"\"\",\n            *codegenScope,\n        ) {\n            operations.map { operation ->\n                val operationName = symbolProvider.toSymbol(operation).name\n                val input = \"crate::input::${operationName}Input\"\n                val fnName = operationName.toSnakeCase()\n                rustTemplate(\n                    \"\"\"\n                    let $fnName: #{napi}::threadsafe_function::ThreadsafeFunction<\n                        $input, #{napi}::threadsafe_function::ErrorStrategy::Fatal\n                    > = ts_handlers.$fnName.create_threadsafe_function(0, |ctx| Ok(vec![ctx.value]))?;\n                    \"\"\",\n                    *codegenScope,\n                )\n            }\n            rust(\"let handlers = Handlers {\")\n            operations.map { operation ->\n                val operationName = symbolProvider.toSymbol(operation).name.toSnakeCase()\n                rust(\"    $operationName: $operationName.clone(),\")\n            }\n            rust(\"};\")\n            writer.rust(\"Ok(Self{ handlers })\")\n        }\n    }\n\n    private fun renderAppStart(writer: RustWriter) {\n        Attribute(\"napi\").render(writer)\n        writer.rustBlockTemplate(\n            \"\"\"pub fn start(&self, socket: &TsSocket) -> #{napi}::Result<()>\"\"\",\n            *codegenScope,\n        ) {\n            rustTemplate(\n                \"\"\"\n                let plugins = #{SmithyServer}::plugin::PluginPipeline::new();\n                let builder = crate::service::$serviceName::builder_with_plugins(plugins);\n                \"\"\",\n                *codegenScope,\n            )\n            operations.map { operation ->\n                val operationName = symbolProvider.toSymbol(operation).name.toSnakeCase()\n                rust(\"let builder = builder.$operationName(crate::ts_operation_adaptor::$operationName);\")\n            }\n            rustTemplate(\n                \"\"\"\n                let app = builder.build().expect(\"failed to build instance of $serviceName\")\n                    .layer(&#{SmithyServer}::AddExtensionLayer::new(self.handlers.clone()));\n                let service = #{tower}::util::BoxCloneService::new(app);\n                start_hyper_worker(socket, service).expect(\"failed to start the hyper server\");\n                Ok(())\n                \"\"\",\n                *codegenScope,\n            )\n        }\n    }\n\n    private fun renderSocket(writer: RustWriter) {\n        Attribute(\"napi\").render(writer)\n        Attribute(derive(RuntimeType.Debug)).render(writer)\n        writer.rustTemplate(\n            \"\"\"\n            pub struct TsSocket(#{socket2}::Socket);\n            \"\"\",\n            *codegenScope,\n        )\n\n        Attribute(\"napi\").render(writer)\n        writer.rustBlock(\"impl TsSocket\") {\n            writer.rust(\n                \"\"\"\n                /// Create a new UNIX `Socket` from an address, port and backlog.\n                /// If not specified, the backlog defaults to 1024 connections.\n                \"\"\".trimIndent(),\n            )\n            Attribute(\"napi(constructor)\").render(writer)\n            writer.rustBlockTemplate(\n                \"\"\"pub fn new(address: String, port: i32, backlog: Option<i32>) -> #{napi}::Result<Self>\"\"\".trimIndent(),\n                *codegenScope,\n            ) {\n                writer.rustTemplate(\n                    \"\"\"\n                    let socket = Self::new_socket(address, port, backlog)\n                        .map_err(|e| #{napi}::Error::from_reason(e.to_string()))?;\n                    Ok(Self(socket))\n                    \"\"\",\n                    *codegenScope,\n                )\n            }\n            writer.rustBlockTemplate(\n                \"\"\"pub fn new_socket(address: String, port: i32, backlog: Option<i32>) -> Result<#{socket2}::Socket, Box<dyn std::error::Error>> \"\"\".trimIndent(),\n                *codegenScope,\n            ) {\n                writer.rustTemplate(\n                    \"\"\"\n                    let address: std::net::SocketAddr = format!(\"{}:{}\", address, port).parse()?;\n                    let domain = if address.is_ipv6() {\n                        #{socket2}::Domain::IPV6\n                    } else {\n                        #{socket2}::Domain::IPV4\n                    };\n                    let socket = #{socket2}::Socket::new(domain, #{socket2}::Type::STREAM, Some(#{socket2}::Protocol::TCP))?;\n                    // Set value for the `SO_REUSEPORT` and `SO_REUSEADDR` options on this socket.\n                    // This indicates that further calls to `bind` may allow reuse of local\n                    // addresses. For IPv4 sockets this means that a socket may bind even when\n                    // there's a socket already listening on this port.\n                    socket.set_reuse_port(true)?;\n                    socket.set_reuse_address(true)?;\n                    socket.bind(&address.into())?;\n                    socket.listen(backlog.unwrap_or(1024))?;\n                    Ok(socket)\n                    \"\"\".trimIndent(),\n                    *codegenScope,\n                )\n            }\n\n            writer.rust(\n                \"\"\"\n                /// Clone the inner socket allowing it to be shared between multiple\n                /// Nodejs processes.\n                \"\"\".trimIndent(),\n            )\n            Attribute(\"napi\").render(writer)\n            writer.rustBlockTemplate(\n                \"\"\"pub fn try_clone(&self) -> #{napi}::Result<Self>\"\"\".trimIndent(),\n                *codegenScope,\n            ) {\n                writer.rustTemplate(\n                    \"\"\"\n                    Ok(TsSocket(\n                        self.0\n                            .try_clone()\n                            .map_err(|e| #{napi}::Error::from_reason(e.to_string()))?,\n                    ))\n                    \"\"\".trimIndent(),\n                    *codegenScope,\n                )\n            }\n        }\n\n        writer.rustBlock(\"impl TsSocket\") {\n            writer.rustTemplate(\n                \"\"\"\n                pub fn to_raw_socket(&self) -> #{napi}::Result<#{socket2}::Socket> {\n                self.0\n                 .try_clone()\n                 .map_err(|e| #{napi}::Error::from_reason(e.to_string()))\n                }\n\n                \"\"\".trimIndent(),\n                *codegenScope,\n            )\n        }\n    }\n\n    private fun renderServer(writer: RustWriter) {\n        writer.rustBlockTemplate(\n            \"\"\"\n            pub fn start_hyper_worker(\n            socket: &TsSocket,\n            app: #{tower}::util::BoxCloneService<\n                #{http}::Request<#{SmithyServer}::body::Body>,\n                #{http}::Response<#{SmithyServer}::body::BoxBody>,\n                std::convert::Infallible,\n            >,\n                ) -> #{napi}::Result<()>\n            \"\"\".trimIndent(),\n            *codegenScope,\n        ) {\n            writer.rustTemplate(\n                \"\"\"\n                let server = #{hyper}::Server::from_tcp(\n                        socket\n                            .to_raw_socket()?\n                            .try_into()\n                            .expect(\"Unable to convert socket2::Socket into std::net::TcpListener\"),\n                )\n                .expect(\"Unable to create hyper server from shared socket\")\n                .serve(#{SmithyServer}::routing::IntoMakeService::new(app));\n\n                let handle = #{tokio}::runtime::Handle::current();\n                handle.spawn(async move {\n                    // Process each socket concurrently.\n                    server.await\n                });\n\n                Ok(())\n                \"\"\".trimIndent(),\n                *codegenScope,\n            )\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-server/codegen-server-typescript/src/main/kotlin/software/amazon/smithy/rust/codegen/server/typescript/smithy/generators/TsServerEnumGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.typescript.smithy.generators\n\nimport software.amazon.smithy.model.shapes.StringShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.EnumCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.EnumGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.EnumGeneratorContext\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenContext\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.ConstrainedEnum\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.ValidationExceptionConversionGenerator\nimport software.amazon.smithy.rust.codegen.server.typescript.smithy.TsServerCargoDependency\n\n/**\n * To share enums defined in Rust with Typescript, `napi-rs` provides the `napi` trait.\n * This class generates enums definitions and implements the `napi` trait.\n */\nclass TsConstrainedEnum(\n    codegenContext: ServerCodegenContext,\n    shape: StringShape,\n    validationExceptionConversionGenerator: ValidationExceptionConversionGenerator,\n) : ConstrainedEnum(codegenContext, shape, validationExceptionConversionGenerator) {\n    private val napiDerive = TsServerCargoDependency.NapiDerive.toType()\n\n    override fun additionalEnumImpls(context: EnumGeneratorContext): Writable =\n        writable {\n            this.rust(\"use napi::bindgen_prelude::ToNapiValue;\")\n        }\n\n    override fun additionalEnumAttributes(context: EnumGeneratorContext): List<Attribute> =\n        listOf(Attribute(napiDerive.resolve(\"napi\")))\n}\n\nclass TsServerEnumGenerator(\n    codegenContext: ServerCodegenContext,\n    shape: StringShape,\n    validationExceptionConversionGenerator: ValidationExceptionConversionGenerator,\n    customizations: List<EnumCustomization>,\n) : EnumGenerator(\n        codegenContext.model,\n        codegenContext.symbolProvider,\n        shape,\n        TsConstrainedEnum(\n            codegenContext,\n            shape,\n            validationExceptionConversionGenerator,\n        ),\n        customizations,\n    )\n"
  },
  {
    "path": "codegen-server/codegen-server-typescript/src/main/kotlin/software/amazon/smithy/rust/codegen/server/typescript/smithy/generators/TsServerOperationErrorGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.typescript.smithy.generators\n\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.knowledge.OperationIndex\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider\nimport software.amazon.smithy.rust.codegen.server.typescript.smithy.TsServerCargoDependency\n\n/**\n * Generates a unified error enum for [operation] and adds the Rust implementation for `napi` error.\n */\nclass TsServerOperationErrorGenerator(\n    private val model: Model,\n    private val symbolProvider: RustSymbolProvider,\n    private val operation: OperationShape,\n) {\n    private val operationIndex = OperationIndex.of(model)\n    private val errors = operationIndex.getErrors(operation)\n\n    fun render(writer: RustWriter) {\n        renderFromTsErr(writer)\n    }\n\n    // TODO(https://github.com/smithy-lang/smithy-rs/issues/2317): match the Ts error type and return the right one.\n    private fun renderFromTsErr(writer: RustWriter) {\n        writer.rustTemplate(\n            \"\"\"\n            impl #{From}<#{napi}::Error> for #{Error} {\n                fn from(variant: #{napi}::Error) -> #{Error} {\n                    crate::error::InternalServerError { message: variant.to_string() }.into()\n                }\n            }\n\n            \"\"\",\n            \"napi\" to TsServerCargoDependency.Napi.toType(),\n            \"Error\" to symbolProvider.symbolForOperationError(operation),\n            \"From\" to RuntimeType.From,\n        )\n    }\n}\n"
  },
  {
    "path": "codegen-server/codegen-server-typescript/src/main/kotlin/software/amazon/smithy/rust/codegen/server/typescript/smithy/generators/TsServerOperationHandlerGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.typescript.smithy.generators\n\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenContext\nimport software.amazon.smithy.rust.codegen.core.util.toSnakeCase\nimport software.amazon.smithy.rust.codegen.server.typescript.smithy.TsServerCargoDependency\n\n/**\n * The Rust code responsible to run the Typescript business logic is implemented in this class,.\n *\n * We codegenerate all operations handlers (steps usually left to the developer in a pure\n * Rust application), which are built into a `Router` by [TsServerApplicationGenerator].\n */\nclass TsServerOperationHandlerGenerator(\n    codegenContext: CodegenContext,\n    private val operation: OperationShape,\n) {\n    private val symbolProvider = codegenContext.symbolProvider\n    private val runtimeConfig = codegenContext.runtimeConfig\n    private val codegenScope =\n        arrayOf(\n            \"SmithyTs\" to TsServerCargoDependency.smithyHttpServerTs(runtimeConfig).toType(),\n            \"SmithyServer\" to TsServerCargoDependency.smithyHttpServer(runtimeConfig).toType(),\n            \"napi\" to TsServerCargoDependency.Napi.toType(),\n        )\n\n    fun render(writer: RustWriter) {\n        renderTsOperationHandlerImpl(writer)\n    }\n\n    private fun renderTsOperationHandlerImpl(writer: RustWriter) {\n        val operationName = symbolProvider.toSymbol(operation).name\n        val input = \"crate::input::${operationName}Input\"\n        val output = \"crate::output::${operationName}Output\"\n        val error = \"crate::error::${operationName}Error\"\n        val fnName = operationName.toSnakeCase()\n\n        writer.rustTemplate(\n            \"\"\"\n            /// Typescript handler for operation `$operationName`.\n            pub(crate) async fn $fnName(\n                input: $input,\n                handlers: #{SmithyServer}::Extension<crate::ts_server_application::Handlers>,\n            ) -> std::result::Result<$output, $error> {\n                handlers.$fnName.call_async::<#{napi}::bindgen_prelude::Promise<$output>>(input).await?.await.map_err(|e| e.into())\n            }\n            \"\"\",\n            *codegenScope,\n        )\n    }\n}\n"
  },
  {
    "path": "codegen-server/codegen-server-typescript/src/main/kotlin/software/amazon/smithy/rust/codegen/server/typescript/smithy/generators/TsServerStructureGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.typescript.smithy.generators\n\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.traits.ErrorTrait\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustInlineTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.StructSettings\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.StructureGenerator\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\nimport software.amazon.smithy.rust.codegen.server.typescript.smithy.TsServerCargoDependency\n\n/**\n * To share structures defined in Rust with Typescript, `napi-rs` provides the `napi` trait.\n * This class generates input / output / error structures definitions and implements the\n * `napi` trait.\n */\nclass TsServerStructureGenerator(\n    model: Model,\n    private val symbolProvider: RustSymbolProvider,\n    private val writer: RustWriter,\n    private val shape: StructureShape,\n) : StructureGenerator(model, symbolProvider, writer, shape, listOf(), StructSettings(flattenVecAccessors = false)) {\n    private val napiDerive = TsServerCargoDependency.NapiDerive.toType()\n\n    override fun renderStructure() {\n        val flavour =\n            if (shape.hasTrait<ErrorTrait>()) {\n                \"constructor\"\n            } else {\n                \"object\"\n            }\n        Attribute(\n            writable {\n                rustInlineTemplate(\n                    \"#{napi}($flavour)\",\n                    \"napi\" to napiDerive.resolve(\"napi\"),\n                )\n            },\n        ).render(writer)\n        super.renderStructure()\n    }\n}\n"
  },
  {
    "path": "codegen-server/codegen-server-typescript/src/main/resources/META-INF/services/software.amazon.smithy.build.SmithyBuildPlugin",
    "content": "#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\nsoftware.amazon.smithy.rust.codegen.server.typescript.smithy.RustServerCodegenTsPlugin\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ConstrainedShapeSymbolMetadataProvider.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy\n\nimport software.amazon.smithy.model.shapes.BlobShape\nimport software.amazon.smithy.model.shapes.ListShape\nimport software.amazon.smithy.model.shapes.MapShape\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.NumberShape\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.shapes.StringShape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.shapes.UnionShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustMetadata\nimport software.amazon.smithy.rust.codegen.core.rustlang.Visibility\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.SymbolMetadataProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.containerDefaultMetadata\nimport software.amazon.smithy.rust.codegen.core.smithy.expectRustMetadata\n\n/**\n * This symbol metadata provider adds the usual derives on shapes that are constrained and hence generate newtypes.\n *\n * It also makes the newtypes `pub(crate)` when `publicConstrainedTypes` is disabled.\n */\nclass ConstrainedShapeSymbolMetadataProvider(\n    private val base: RustSymbolProvider,\n    private val constrainedTypes: Boolean,\n) : SymbolMetadataProvider(base) {\n    override fun memberMeta(memberShape: MemberShape) = base.toSymbol(memberShape).expectRustMetadata()\n\n    override fun structureMeta(structureShape: StructureShape) = base.toSymbol(structureShape).expectRustMetadata()\n\n    override fun unionMeta(unionShape: UnionShape) = base.toSymbol(unionShape).expectRustMetadata()\n\n    override fun enumMeta(stringShape: StringShape) = base.toSymbol(stringShape).expectRustMetadata()\n\n    private fun addDerivesAndAdjustVisibilityIfConstrained(shape: Shape): RustMetadata {\n        check(shape is ListShape || shape is MapShape || shape is StringShape || shape is NumberShape || shape is BlobShape)\n\n        val baseMetadata = base.toSymbol(shape).expectRustMetadata()\n        val derives = baseMetadata.derives.toMutableSet()\n        val additionalAttributes = baseMetadata.additionalAttributes.toMutableList()\n\n        if (shape.canReachConstrainedShape(model, base)) {\n            derives += containerDefaultMetadata(shape, model).derives\n        }\n\n        // We should _always_ be able to `#[derive(Debug)]`: all constrained shapes' types are simply tuple newtypes\n        // wrapping a single type which always implements `Debug`.\n        // The wrapped type may not _derive_ `Debug` though, hence why this line is required; see https://github.com/smithy-lang/smithy-rs/issues/2582.\n        derives += RuntimeType.Debug\n\n        val visibility = Visibility.publicIf(constrainedTypes, Visibility.PUBCRATE)\n        return RustMetadata(derives, additionalAttributes, visibility)\n    }\n\n    override fun listMeta(listShape: ListShape): RustMetadata = addDerivesAndAdjustVisibilityIfConstrained(listShape)\n\n    override fun mapMeta(mapShape: MapShape): RustMetadata = addDerivesAndAdjustVisibilityIfConstrained(mapShape)\n\n    override fun stringMeta(stringShape: StringShape): RustMetadata =\n        addDerivesAndAdjustVisibilityIfConstrained(stringShape)\n\n    override fun numberMeta(numberShape: NumberShape): RustMetadata =\n        addDerivesAndAdjustVisibilityIfConstrained(numberShape)\n\n    override fun blobMeta(blobShape: BlobShape) = addDerivesAndAdjustVisibilityIfConstrained(blobShape)\n}\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ConstrainedShapeSymbolProvider.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy\n\nimport software.amazon.smithy.codegen.core.Symbol\nimport software.amazon.smithy.model.knowledge.NullableIndex\nimport software.amazon.smithy.model.shapes.BlobShape\nimport software.amazon.smithy.model.shapes.ByteShape\nimport software.amazon.smithy.model.shapes.CollectionShape\nimport software.amazon.smithy.model.shapes.IntegerShape\nimport software.amazon.smithy.model.shapes.LongShape\nimport software.amazon.smithy.model.shapes.MapShape\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.ServiceShape\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.shapes.ShortShape\nimport software.amazon.smithy.model.shapes.StringShape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.traits.LengthTrait\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustModule\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustReservedWords\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustType\nimport software.amazon.smithy.rust.codegen.core.rustlang.Visibility\nimport software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.WrappingSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.contextName\nimport software.amazon.smithy.rust.codegen.core.smithy.handleOptionality\nimport software.amazon.smithy.rust.codegen.core.smithy.handleRustBoxing\nimport software.amazon.smithy.rust.codegen.core.smithy.locatedIn\nimport software.amazon.smithy.rust.codegen.core.smithy.rustType\nimport software.amazon.smithy.rust.codegen.core.smithy.symbolBuilder\nimport software.amazon.smithy.rust.codegen.core.util.getTrait\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\nimport software.amazon.smithy.rust.codegen.core.util.orNull\nimport software.amazon.smithy.rust.codegen.core.util.toPascalCase\nimport software.amazon.smithy.rust.codegen.core.util.toSnakeCase\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.serverBuilderModule\nimport software.amazon.smithy.rust.codegen.server.smithy.traits.SyntheticStructureFromConstrainedMemberTrait\n\n/**\n * The [ConstrainedShapeSymbolProvider] returns, for a given _directly_\n * constrained shape, a symbol whose Rust type can hold the constrained values.\n *\n * For all shapes with supported traits directly attached to them, this type is\n * a [RustType.Opaque] wrapper tuple newtype holding the inner constrained\n * type.\n *\n * The symbols this symbol provider returns are always public and exposed to\n * the end user.\n *\n * This symbol provider is meant to be used \"deep\" within the wrapped symbol\n * providers chain, just above the core base symbol provider, `SymbolVisitor`.\n *\n * If the shape is _transitively but not directly_ constrained, use\n * [PubCrateConstrainedShapeSymbolProvider] instead, which returns symbols\n * whose associated types are `pub(crate)` and thus not exposed to the end\n * user.\n */\nopen class ConstrainedShapeSymbolProvider(\n    private val base: RustSymbolProvider,\n    private val serviceShape: ServiceShape,\n    private val publicConstrainedTypes: Boolean,\n) : WrappingSymbolProvider(base) {\n    private val nullableIndex = NullableIndex.of(model)\n\n    private fun publicConstrainedSymbolForMapOrCollectionShape(shape: Shape): Symbol {\n        check(shape is MapShape || shape is CollectionShape)\n\n        val (name, module) = getMemberNameAndModule(shape, serviceShape, ServerRustModule.Model, !publicConstrainedTypes)\n        val rustType = RustType.Opaque(name)\n        return symbolBuilder(shape, rustType).locatedIn(module).build()\n    }\n\n    override fun toSymbol(shape: Shape): Symbol {\n        return when (shape) {\n            is MemberShape -> {\n                // TODO(https://github.com/smithy-lang/smithy-rs/issues/1401) Member shapes can have constraint traits\n                //  (constraint trait precedence).\n                val target = model.expectShape(shape.target)\n                val targetSymbol = this.toSymbol(target)\n                // Handle boxing first, so we end up with `Option<Box<_>>`, not `Box<Option<_>>`.\n                handleOptionality(\n                    handleRustBoxing(targetSymbol, shape),\n                    shape,\n                    nullableIndex,\n                    base.config.nullabilityCheckMode,\n                )\n            }\n\n            is MapShape -> {\n                if (shape.isDirectlyConstrained(base)) {\n                    check(shape.hasTrait<LengthTrait>()) {\n                        \"Only the `length` constraint trait can be applied to map shapes\"\n                    }\n                    publicConstrainedSymbolForMapOrCollectionShape(shape)\n                } else {\n                    val keySymbol = this.toSymbol(shape.key)\n                    val valueSymbol = this.toSymbol(shape.value)\n                    symbolBuilder(shape, RustType.HashMap(keySymbol.rustType(), valueSymbol.rustType()))\n                        .addReference(keySymbol)\n                        .addReference(valueSymbol)\n                        .build()\n                }\n            }\n\n            is CollectionShape -> {\n                if (shape.isDirectlyConstrained(base)) {\n                    check(constrainedCollectionCheck(shape)) {\n                        \"Only the `length` and `uniqueItems` constraint traits can be applied to list shapes\"\n                    }\n                    publicConstrainedSymbolForMapOrCollectionShape(shape)\n                } else {\n                    val inner = this.toSymbol(shape.member)\n                    symbolBuilder(shape, RustType.Vec(inner.rustType())).addReference(inner).build()\n                }\n            }\n\n            is StringShape, is IntegerShape, is ShortShape, is LongShape, is ByteShape, is BlobShape -> {\n                if (shape.isDirectlyConstrained(base)) {\n                    // A standalone constrained shape goes into `ModelsModule`, but one\n                    // arising from a constrained member shape goes into a module for the container.\n                    val (name, module) = getMemberNameAndModule(shape, serviceShape, ServerRustModule.Model, !publicConstrainedTypes)\n                    val rustType = RustType.Opaque(name)\n                    symbolBuilder(shape, rustType).locatedIn(module).build()\n                } else {\n                    base.toSymbol(shape)\n                }\n            }\n\n            else -> base.toSymbol(shape)\n        }\n    }\n\n    /**\n     * Checks that the collection:\n     *  - Has at least 1 supported constraint applied to it, and\n     *  - That it has no unsupported constraints applied.\n     */\n    private fun constrainedCollectionCheck(shape: CollectionShape): Boolean {\n        val supportedConstraintTraits =\n            supportedCollectionConstraintTraits.mapNotNull { shape.getTrait(it).orNull() }.toSet()\n        val allConstraintTraits = allConstraintTraits.mapNotNull { shape.getTrait(it).orNull() }.toSet()\n\n        return supportedConstraintTraits.isNotEmpty() &&\n            allConstraintTraits.subtract(supportedConstraintTraits)\n                .isEmpty()\n    }\n\n    /**\n     * Returns the pair (Rust Symbol Name, Inline Module) for the shape. At the time of model transformation all\n     * constrained member shapes are extracted and are given a model-wide unique name. However, the generated code\n     * for the new shapes is in a module that is named after the containing shape (structure, list, map or union).\n     * The new shape's Rust Symbol is renamed from `{structureName}{memberName}` to  `{structure_name}::{member_name}`\n     */\n    private fun getMemberNameAndModule(\n        shape: Shape,\n        serviceShape: ServiceShape,\n        defaultModule: RustModule.LeafModule,\n        pubCrateServerBuilder: Boolean,\n    ): Pair<String, RustModule.LeafModule> {\n        val syntheticMemberTrait =\n            shape.getTrait<SyntheticStructureFromConstrainedMemberTrait>()\n                ?: return Pair(shape.contextName(serviceShape), defaultModule)\n\n        return if (syntheticMemberTrait.container is StructureShape) {\n            val builderModule = syntheticMemberTrait.container.serverBuilderModule(base, pubCrateServerBuilder)\n            val renameTo = syntheticMemberTrait.member.memberName ?: syntheticMemberTrait.member.id.name\n            Pair(renameTo.toPascalCase(), builderModule)\n        } else {\n            // For non-structure shapes, the new shape defined for a constrained member shape\n            // needs to be placed in an inline module named `pub {container_name_in_snake_case}`.\n            val moduleName = RustReservedWords.escapeIfNeeded(syntheticMemberTrait.container.id.name.toSnakeCase())\n            val innerModuleName =\n                moduleName +\n                    if (pubCrateServerBuilder) {\n                        \"_internal\"\n                    } else {\n                        \"\"\n                    }\n\n            val innerModule =\n                RustModule.new(\n                    innerModuleName,\n                    visibility = Visibility.publicIf(!pubCrateServerBuilder, Visibility.PUBCRATE),\n                    parent = defaultModule,\n                    inline = true,\n                    documentationOverride = \"\",\n                )\n            val renameTo = syntheticMemberTrait.member.memberName ?: syntheticMemberTrait.member.id.name\n            Pair(renameTo.toPascalCase(), innerModule)\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ConstraintViolationSymbolProvider.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy\n\nimport software.amazon.smithy.codegen.core.Symbol\nimport software.amazon.smithy.model.shapes.BlobShape\nimport software.amazon.smithy.model.shapes.ByteShape\nimport software.amazon.smithy.model.shapes.CollectionShape\nimport software.amazon.smithy.model.shapes.IntegerShape\nimport software.amazon.smithy.model.shapes.LongShape\nimport software.amazon.smithy.model.shapes.MapShape\nimport software.amazon.smithy.model.shapes.ServiceShape\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.shapes.ShortShape\nimport software.amazon.smithy.model.shapes.StringShape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.shapes.UnionShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustModule\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustReservedWords\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustType\nimport software.amazon.smithy.rust.codegen.core.rustlang.Visibility\nimport software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.WrappingSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.contextName\nimport software.amazon.smithy.rust.codegen.core.smithy.locatedIn\nimport software.amazon.smithy.rust.codegen.core.smithy.module\nimport software.amazon.smithy.rust.codegen.core.smithy.rustType\nimport software.amazon.smithy.rust.codegen.core.util.getTrait\nimport software.amazon.smithy.rust.codegen.core.util.toSnakeCase\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.serverBuilderSymbol\nimport software.amazon.smithy.rust.codegen.server.smithy.traits.SyntheticStructureFromConstrainedMemberTrait\n\n/**\n * The [ConstraintViolationSymbolProvider] returns, for a given constrained\n * shape, a symbol whose Rust type can hold information about constraint\n * violations that may occur when building the shape from unconstrained values.\n *\n * So, for example, given the model:\n *\n * ```smithy\n * @pattern(\"\\\\w+\")\n * @length(min: 1, max: 69)\n * string NiceString\n *\n * structure Structure {\n *     @required\n *     niceString: NiceString\n * }\n * ```\n *\n * A `NiceString` built from an arbitrary Rust `String` may give rise to at\n * most two constraint trait violations: one for `pattern`, one for `length`.\n * Similarly, the shape `Structure` can fail to be built when a value for\n * `niceString` is not provided.\n *\n * Said type is always called `ConstraintViolation`, and resides in a bespoke\n * module inside the same module as the _public_ constrained type the user is\n * exposed to. When the user is _not_ exposed to the constrained type, the\n * constraint violation type's module is a child of the `model` module.\n *\n * It is the responsibility of the caller to ensure that the shape is\n * constrained (either directly or transitively) before using this symbol\n * provider. This symbol provider intentionally crashes if the shape is not\n * constrained.\n */\nclass ConstraintViolationSymbolProvider(\n    private val base: RustSymbolProvider,\n    private val publicConstrainedTypes: Boolean,\n    private val serviceShape: ServiceShape,\n) : WrappingSymbolProvider(base) {\n    private val constraintViolationName = \"ConstraintViolation\"\n    private val visibility =\n        when (publicConstrainedTypes) {\n            true -> Visibility.PUBLIC\n            false -> Visibility.PUBCRATE\n        }\n\n    private fun Shape.shapeModule(): RustModule.LeafModule {\n        val documentation =\n            if (publicConstrainedTypes && this.isDirectlyConstrained(base)) {\n                val symbol = base.toSymbol(this)\n                \"See [`${this.contextName(serviceShape)}`]($symbol).\"\n            } else {\n                \"\"\n            }\n\n        val syntheticTrait = getTrait<SyntheticStructureFromConstrainedMemberTrait>()\n\n        val (module, name) =\n            if (syntheticTrait != null) {\n                // For constrained member shapes, the ConstraintViolation code needs to go in an inline rust module\n                // that is a descendant of the module that contains the extracted shape itself.\n                val overriddenMemberModule = this.getParentAndInlineModuleForConstrainedMember(base, publicConstrainedTypes)!!\n                val name = syntheticTrait.member.memberName\n                Pair(overriddenMemberModule.second, RustReservedWords.escapeIfNeeded(name).toSnakeCase())\n            } else {\n                // Need to use the context name so we get the correct name for maps.\n                Pair(ServerRustModule.Model, RustReservedWords.escapeIfNeeded(this.contextName(serviceShape)).toSnakeCase())\n            }\n\n        return RustModule.new(\n            name = name,\n            visibility = visibility,\n            parent = module,\n            inline = true,\n            documentationOverride = documentation,\n        )\n    }\n\n    private fun constraintViolationSymbolForCollectionOrMapOrUnionShape(shape: Shape): Symbol {\n        check(shape is CollectionShape || shape is MapShape || shape is UnionShape)\n\n        val module = shape.shapeModule()\n        val rustType = RustType.Opaque(constraintViolationName, module.fullyQualifiedPath())\n        return Symbol.builder()\n            .rustType(rustType)\n            .name(rustType.name)\n            .locatedIn(module)\n            .build()\n    }\n\n    override fun toSymbol(shape: Shape): Symbol {\n        check(shape.canReachConstrainedShape(model, base)) {\n            \"`ConstraintViolationSymbolProvider` was called on shape that does not reach a constrained shape: $shape\"\n        }\n\n        return when (shape) {\n            is MapShape, is CollectionShape, is UnionShape -> {\n                constraintViolationSymbolForCollectionOrMapOrUnionShape(shape)\n            }\n\n            is StructureShape -> {\n                val builderSymbol = shape.serverBuilderSymbol(base, pubCrate = !publicConstrainedTypes)\n\n                val module = builderSymbol.module()\n                val rustType = RustType.Opaque(constraintViolationName, module.fullyQualifiedPath())\n                Symbol.builder()\n                    .rustType(rustType)\n                    .name(rustType.name)\n                    .locatedIn(module)\n                    .build()\n            }\n\n            is StringShape, is IntegerShape, is ShortShape, is LongShape, is ByteShape, is BlobShape -> {\n                val module = shape.shapeModule()\n                val rustType = RustType.Opaque(constraintViolationName, module.fullyQualifiedPath())\n                Symbol.builder()\n                    .rustType(rustType)\n                    .name(rustType.name)\n                    .locatedIn(module)\n                    .build()\n            }\n\n            else -> TODO(\"Constraint traits on other shapes not implemented yet: $shape\")\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/Constraints.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy\n\nimport software.amazon.smithy.codegen.core.SymbolProvider\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.BlobShape\nimport software.amazon.smithy.model.shapes.ByteShape\nimport software.amazon.smithy.model.shapes.CollectionShape\nimport software.amazon.smithy.model.shapes.EnumShape\nimport software.amazon.smithy.model.shapes.IntEnumShape\nimport software.amazon.smithy.model.shapes.IntegerShape\nimport software.amazon.smithy.model.shapes.LongShape\nimport software.amazon.smithy.model.shapes.MapShape\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.shapes.ShortShape\nimport software.amazon.smithy.model.shapes.SimpleShape\nimport software.amazon.smithy.model.shapes.StringShape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.shapes.UnionShape\nimport software.amazon.smithy.model.traits.EnumTrait\nimport software.amazon.smithy.model.traits.LengthTrait\nimport software.amazon.smithy.model.traits.PatternTrait\nimport software.amazon.smithy.model.traits.RangeTrait\nimport software.amazon.smithy.model.traits.RequiredTrait\nimport software.amazon.smithy.model.traits.UniqueItemsTrait\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustModule\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustReservedWords\nimport software.amazon.smithy.rust.codegen.core.rustlang.Visibility\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenContext\nimport software.amazon.smithy.rust.codegen.core.smithy.DirectedWalker\nimport software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.isOptional\nimport software.amazon.smithy.rust.codegen.core.smithy.module\nimport software.amazon.smithy.rust.codegen.core.util.UNREACHABLE\nimport software.amazon.smithy.rust.codegen.core.util.getTrait\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\nimport software.amazon.smithy.rust.codegen.core.util.toSnakeCase\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.serverBuilderModule\nimport software.amazon.smithy.rust.codegen.server.smithy.traits.SyntheticStructureFromConstrainedMemberTrait\n\n/*\n * This file contains utilities to work with constrained shapes.\n */\n\n/**\n * Whether the shape has any trait that could cause a request to be rejected with a constraint violation, _whether\n * we support it or not_.\n */\nfun Shape.hasConstraintTrait() = allConstraintTraits.any(this::hasTrait)\n\nval allConstraintTraits =\n    setOf(\n        LengthTrait::class.java,\n        PatternTrait::class.java,\n        RangeTrait::class.java,\n        UniqueItemsTrait::class.java,\n        EnumTrait::class.java,\n        RequiredTrait::class.java,\n    )\n\nval supportedStringConstraintTraits = setOf(LengthTrait::class.java, PatternTrait::class.java)\n\n/**\n * Supported constraint traits for the `list` and `set` shapes.\n */\nval supportedCollectionConstraintTraits =\n    setOf(\n        LengthTrait::class.java,\n        UniqueItemsTrait::class.java,\n    )\n\n/**\n * We say a shape is _directly_ constrained if:\n *\n *     - it has a constraint trait, or;\n *     - in the case of it being an aggregate shape, one of its member shapes has a constraint trait.\n *\n * Note that an aggregate shape whose member shapes do not have constraint traits but that has a member whose target is\n * a constrained shape is _not_ directly constrained.\n *\n * At the moment only a subset of constraint traits are implemented on a subset of shapes; that's why we match against\n * a subset of shapes in each arm, and check for a subset of constraint traits attached to the shape in the arm's\n * (with these subsets being smaller than what [the spec] accounts for).\n *\n * [the spec]: https://awslabs.github.io/smithy/2.0/spec/constraint-traits.html\n */\nfun Shape.isDirectlyConstrained(symbolProvider: SymbolProvider): Boolean =\n    when (this) {\n        is StructureShape -> {\n            // TODO(https://github.com/smithy-lang/smithy-rs/issues/1302, https://github.com/awslabs/smithy/issues/1179):\n            //  The only reason why the functions in this file have\n            //  to take in a `SymbolProvider` is because non-`required` blob streaming members are interpreted as\n            //  `required`, so we can't use `member.isOptional` here.\n            this.members().any { !symbolProvider.toSymbol(it).isOptional() && !it.hasNonNullDefault() }\n        }\n\n        else -> this.isDirectlyConstrainedHelper()\n    }\n\n/**\n * Finds shapes that are directly constrained in validation phase, which means the shape is a:\n * - [StructureShape] with a required member that does not have a non-null default\n * - [EnumShape]\n * - [IntEnumShape]\n * - [MemberShape] that is required and does not have a non-null default\n *\n * We use this rather than [Shape.isDirectlyConstrained] to check for constrained shapes in validation phase because\n * the [SymbolProvider] has not yet been created\n */\nfun Shape.isDirectlyConstrainedForValidation(): Boolean =\n    when (this) {\n        is StructureShape -> {\n            // we use `member.isOptional` here because the issue outlined in (https://github.com/smithy-lang/smithy-rs/issues/1302)\n            // should not be relevant in validation phase\n            this.members().any { !it.isOptional && !it.hasNonNullDefault() }\n        }\n\n        // For alignment with\n        // (https://github.com/smithy-lang/smithy-rs/blob/custom-validation-rfc/design/src/rfcs/rfc0047_custom_validation.md#terminology)\n        // TODO(move to [isDirectlyConstrainerHelper] if they can be safely applied to [isDirectlyConstrained] without breaking implications)\n        is EnumShape -> true\n        is IntEnumShape -> true\n        is MemberShape -> !this.isOptional && !this.hasNonNullDefault()\n\n        else -> this.isDirectlyConstrainedHelper()\n    }\n\nprivate fun Shape.isDirectlyConstrainedHelper(): Boolean =\n    when (this) {\n        is MapShape -> this.hasTrait<LengthTrait>()\n        is StringShape -> this.hasTrait<EnumTrait>() || supportedStringConstraintTraits.any { this.hasTrait(it) }\n        is CollectionShape -> supportedCollectionConstraintTraits.any { this.hasTrait(it) }\n        is IntegerShape, is ShortShape, is LongShape, is ByteShape -> this.hasTrait<RangeTrait>()\n        is BlobShape -> this.hasTrait<LengthTrait>()\n        else -> false\n    }\n\nfun MemberShape.hasConstraintTraitOrTargetHasConstraintTrait(\n    model: Model,\n    symbolProvider: SymbolProvider,\n): Boolean =\n    this.isDirectlyConstrained(symbolProvider) || model.expectShape(this.target).isDirectlyConstrained(symbolProvider)\n\nfun Shape.isTransitivelyButNotDirectlyConstrained(\n    model: Model,\n    symbolProvider: SymbolProvider,\n): Boolean = !this.isDirectlyConstrained(symbolProvider) && this.canReachConstrainedShape(model, symbolProvider)\n\nfun Shape.canReachConstrainedShape(\n    model: Model,\n    symbolProvider: SymbolProvider,\n): Boolean =\n    if (this is MemberShape) {\n        // TODO(https://github.com/smithy-lang/smithy-rs/issues/1401) Constraint traits on member shapes are not implemented\n        //  yet. Also, note that a walker over a member shape can, perhaps counterintuitively, reach the _containing_ shape,\n        //  so we can't simply delegate to the `else` branch when we implement them.\n        this.targetCanReachConstrainedShape(model, symbolProvider)\n    } else {\n        DirectedWalker(model).walkShapes(this).toSet().any { it.isDirectlyConstrained(symbolProvider) }\n    }\n\n/**\n * Whether this shape (or the shape's target for [MemberShape]s) can reach constrained shapes for validations.\n *\n * We use this rather than [Shape.canReachConstrainedShape] to check for constrained shapes in validation phase because\n * the [SymbolProvider] has not yet been created\n */\nfun Shape.canReachConstrainedShapeForValidation(model: Model): Boolean =\n    if (this is MemberShape) {\n        this.targetCanReachConstrainedShapeForValidation(model)\n    } else {\n        DirectedWalker(model).walkShapes(this).toSet().any { it.isDirectlyConstrainedForValidation() }\n    }\n\nfun MemberShape.targetCanReachConstrainedShape(\n    model: Model,\n    symbolProvider: SymbolProvider,\n): Boolean = model.expectShape(this.target).canReachConstrainedShape(model, symbolProvider)\n\nfun MemberShape.targetCanReachConstrainedShapeForValidation(model: Model): Boolean =\n    model.expectShape(this.target).canReachConstrainedShapeForValidation(model)\n\nfun Shape.hasPublicConstrainedWrapperTupleType(\n    model: Model,\n    publicConstrainedTypes: Boolean,\n): Boolean =\n    when (this) {\n        is CollectionShape -> publicConstrainedTypes && supportedCollectionConstraintTraits.any(this::hasTrait)\n        is MapShape -> publicConstrainedTypes && this.hasTrait<LengthTrait>()\n        is StringShape -> !this.hasTrait<EnumTrait>() && (publicConstrainedTypes && supportedStringConstraintTraits.any(this::hasTrait))\n        is IntegerShape, is ShortShape, is LongShape, is ByteShape -> publicConstrainedTypes && this.hasTrait<RangeTrait>()\n        is MemberShape -> model.expectShape(this.target).hasPublicConstrainedWrapperTupleType(model, publicConstrainedTypes)\n        is BlobShape -> publicConstrainedTypes && this.hasTrait<LengthTrait>()\n        else -> false\n    }\n\nfun Shape.wouldHaveConstrainedWrapperTupleTypeWerePublicConstrainedTypesEnabled(model: Model): Boolean =\n    hasPublicConstrainedWrapperTupleType(model, true)\n\n/**\n * Helper function to determine whether a shape will map to a _public_ constrained wrapper tuple type.\n *\n * This function is used in core code generators, so it takes in a [CodegenContext] that is downcast\n * to [ServerCodegenContext] when generating servers.\n */\nfun workingWithPublicConstrainedWrapperTupleType(\n    shape: Shape,\n    model: Model,\n    publicConstrainedTypes: Boolean,\n): Boolean = shape.hasPublicConstrainedWrapperTupleType(model, publicConstrainedTypes)\n\n/**\n * Returns whether a shape's type _name_ contains a non-public type when `publicConstrainedTypes` is `false`.\n *\n * For example, a `Vec<crate::model::LengthString>` contains a non-public type, because `crate::model::LengthString`\n * is `pub(crate)` when `publicConstrainedTypes` is `false`\n *\n * Note that a structure shape's type _definition_ may contain non-public types, but its _name_ is always public.\n *\n * Note how we short-circuit on `publicConstrainedTypes = true`, but we still require it to be passed in instead of laying\n * the responsibility on the caller, for API safety usage.\n */\nfun Shape.typeNameContainsNonPublicType(\n    model: Model,\n    symbolProvider: SymbolProvider,\n    publicConstrainedTypes: Boolean,\n): Boolean =\n    !publicConstrainedTypes &&\n        when (this) {\n            is SimpleShape -> wouldHaveConstrainedWrapperTupleTypeWerePublicConstrainedTypesEnabled(model)\n            is MemberShape ->\n                model.expectShape(this.target)\n                    .typeNameContainsNonPublicType(model, symbolProvider, publicConstrainedTypes)\n\n            is CollectionShape -> this.canReachConstrainedShape(model, symbolProvider)\n            is MapShape -> this.canReachConstrainedShape(model, symbolProvider)\n            is StructureShape, is UnionShape -> false\n            else -> UNREACHABLE(\"the above arms should be exhaustive, but we received shape: $this\")\n        }\n\n/**\n * For synthetic shapes that are added to the model because of member constrained shapes, it returns\n * the \"container\" and \"the member shape\" that originally had the constraint trait. For all other\n * shapes, it returns null.\n */\nfun Shape.overriddenConstrainedMemberInfo(): Pair<Shape, MemberShape>? {\n    val trait = getTrait<SyntheticStructureFromConstrainedMemberTrait>() ?: return null\n    return Pair(trait.container, trait.member)\n}\n\n/**\n * Returns the parent and the inline module that this particular shape should go in.\n */\nfun Shape.getParentAndInlineModuleForConstrainedMember(\n    symbolProvider: RustSymbolProvider,\n    publicConstrainedTypes: Boolean,\n): Pair<RustModule.LeafModule, RustModule.LeafModule>? {\n    val overriddenTrait = getTrait<SyntheticStructureFromConstrainedMemberTrait>() ?: return null\n    return if (overriddenTrait.container is StructureShape) {\n        val structureModule = symbolProvider.toSymbol(overriddenTrait.container).module()\n        val builderModule = overriddenTrait.container.serverBuilderModule(symbolProvider, !publicConstrainedTypes)\n        Pair(structureModule, builderModule)\n    } else {\n        // For constrained member shapes, the ConstraintViolation code needs to go in an inline rust module\n        // that is a descendant of the module that contains the extracted shape itself.\n        return if (publicConstrainedTypes) {\n            // Non-structured shape types need to go into their own module.\n            val shapeSymbol = symbolProvider.toSymbol(this)\n            val shapeModule = shapeSymbol.module()\n            check(!shapeModule.parent.isInline()) {\n                \"Parent module of $id should not be an inline module.\"\n            }\n            Pair(shapeModule.parent as RustModule.LeafModule, shapeModule)\n        } else {\n            val name = RustReservedWords.escapeIfNeeded(overriddenTrait.container.id.name).toSnakeCase() + \"_internal\"\n            val innerModule =\n                RustModule.new(\n                    name = name,\n                    visibility = Visibility.PUBCRATE,\n                    parent = ServerRustModule.Model,\n                    inline = true,\n                )\n\n            Pair(ServerRustModule.Model, innerModule)\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/CustomShapeSymbolProvider.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy\n\nimport software.amazon.smithy.codegen.core.Symbol\nimport software.amazon.smithy.model.node.Node\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.model.traits.AnnotationTrait\nimport software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.WrappingSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.util.getTrait\n\nclass SyntheticCustomShapeTrait(val ID: ShapeId, val symbol: Symbol) : AnnotationTrait(ID, Node.objectNode())\n\n/**\n * This SymbolProvider honors [`SyntheticCustomShapeTrait`] and returns this trait's symbol when available.\n */\nclass CustomShapeSymbolProvider(private val base: RustSymbolProvider) : WrappingSymbolProvider(base) {\n    override fun toSymbol(shape: Shape): Symbol {\n        return shape.getTrait<SyntheticCustomShapeTrait>()?.symbol ?: base.toSymbol(shape)\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/DeriveEqAndHashSymbolMetadataProvider.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy\n\nimport software.amazon.smithy.model.shapes.BlobShape\nimport software.amazon.smithy.model.shapes.DocumentShape\nimport software.amazon.smithy.model.shapes.DoubleShape\nimport software.amazon.smithy.model.shapes.FloatShape\nimport software.amazon.smithy.model.shapes.ListShape\nimport software.amazon.smithy.model.shapes.MapShape\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.NumberShape\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.shapes.StringShape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.shapes.UnionShape\nimport software.amazon.smithy.model.traits.StreamingTrait\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustMetadata\nimport software.amazon.smithy.rust.codegen.core.smithy.DirectedWalker\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.SymbolMetadataProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.expectRustMetadata\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\n\n/**\n * This symbol metadata provider adds derives to implement the [`Eq`] and [`Hash`] traits for shapes, whenever\n * possible.\n *\n * These traits can be implemented by any shape _except_ if the shape's closure contains:\n *\n *     1. A `float`, `double`, or `document` shape: floating point types in Rust do not implement `Eq`. Similarly,\n *        [`document` shapes] may contain arbitrary JSON-like data containing floating point values.\n *     2. A [@streaming] shape: all the streaming data would need to be buffered first to compare it.\n *\n * Additionally, the `Hash` trait cannot be implemented by shapes whose closure contains:\n *\n *     1. A `map` shape: we render `map` shapes as `std::collections::HashMap`, which _do not_ implement `Hash`.\n *        See https://github.com/awslabs/smithy/issues/1567.\n *\n * [`Eq`]: https://doc.rust-lang.org/std/cmp/trait.Eq.html\n * [`Hash`]: https://doc.rust-lang.org/std/hash/trait.Hash.html\n * [`document` shapes]: https://smithy.io/2.0/spec/simple-types.html#document\n * [@streaming]: https://smithy.io/2.0/spec/streaming.html\n */\nclass DeriveEqAndHashSymbolMetadataProvider(\n    private val base: RustSymbolProvider,\n) : SymbolMetadataProvider(base) {\n    private val walker = DirectedWalker(model)\n\n    private fun addDeriveEqAndHashIfPossible(shape: Shape): RustMetadata {\n        check(shape !is MemberShape)\n        val baseMetadata = base.toSymbol(shape).expectRustMetadata()\n        // See class-level documentation for why we filter these out.\n        return if (walker.walkShapes(shape)\n                .any { it is FloatShape || it is DoubleShape || it is DocumentShape || it.hasTrait<StreamingTrait>() }\n        ) {\n            baseMetadata\n        } else {\n            var ret = baseMetadata\n            if (ret.derives.contains(RuntimeType.PartialEq)) {\n                // We can only derive `Eq` if the type implements `PartialEq`. Not every shape that does not reach a\n                // floating point or a document shape does; for example, streaming shapes cannot be `PartialEq`, see\n                // [StreamingShapeMetadataProvider]. This is just a defensive check in case other symbol providers\n                // want to remove the `PartialEq` trait, since we've also just checked that we do not reach a streaming\n                // shape.\n                ret = ret.withDerives(RuntimeType.Eq)\n            }\n\n            // `std::collections::HashMap` does not implement `std::hash::Hash`:\n            // https://github.com/awslabs/smithy/issues/1567\n            if (walker.walkShapes(shape).none { it is MapShape }) {\n                ret = ret.withDerives(RuntimeType.Hash)\n            }\n\n            return ret\n        }\n    }\n\n    override fun memberMeta(memberShape: MemberShape) = base.toSymbol(memberShape).expectRustMetadata()\n\n    override fun structureMeta(structureShape: StructureShape) = addDeriveEqAndHashIfPossible(structureShape)\n\n    override fun unionMeta(unionShape: UnionShape) = addDeriveEqAndHashIfPossible(unionShape)\n\n    override fun enumMeta(stringShape: StringShape) = addDeriveEqAndHashIfPossible(stringShape)\n\n    override fun listMeta(listShape: ListShape): RustMetadata = addDeriveEqAndHashIfPossible(listShape)\n\n    override fun mapMeta(mapShape: MapShape): RustMetadata = addDeriveEqAndHashIfPossible(mapShape)\n\n    override fun stringMeta(stringShape: StringShape): RustMetadata = addDeriveEqAndHashIfPossible(stringShape)\n\n    override fun numberMeta(numberShape: NumberShape): RustMetadata = addDeriveEqAndHashIfPossible(numberShape)\n\n    override fun blobMeta(blobShape: BlobShape): RustMetadata = addDeriveEqAndHashIfPossible(blobShape)\n}\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/EnumTraitValidationErrorMessage.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy\n\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.traits.EnumTrait\n\nfun EnumTrait.validationErrorMessage() =\n    \"Value at '{}' failed to satisfy constraint: Member must satisfy enum value set: [${enumValueSet()}]\"\n\nfun EnumTrait.shapeConstraintViolationDisplayMessage(shape: Shape) =\n    \"Value provided for '${shape.id}' failed to satisfy constraint: Member must satisfy enum value set: [${enumValueSet()}]\"\n\nfun EnumTrait.enumValueSet() = this.enumDefinitionValues.joinToString(\", \")\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/LengthTraitValidationErrorMessage.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy\n\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.traits.LengthTrait\n\nfun LengthTrait.validationErrorMessage() =\n    \"Value with length {} at '{}' failed to satisfy constraint: Member must have length ${this.lengthDescription()}\"\n\nfun LengthTrait.shapeConstraintViolationDisplayMessage(shape: Shape) =\n    \"Value with length {} provided for '${shape.id}' failed to satisfy constraint: Member must have length ${this.lengthDescription()}\"\n\nfun LengthTrait.lengthDescription() =\n    if (this.min.isPresent && this.max.isPresent) {\n        \"between ${this.min.get()} and ${this.max.get()}, inclusive\"\n    } else if (this.min.isPresent) {\n        \"greater than or equal to ${this.min.get()}\"\n    } else {\n        check(this.max.isPresent)\n        \"less than or equal to ${this.max.get()}\"\n    }\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/PatternTraitEscapedSpecialCharsValidator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy\n\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.traits.PatternTrait\nimport software.amazon.smithy.model.validation.AbstractValidator\nimport software.amazon.smithy.model.validation.ValidationEvent\nimport software.amazon.smithy.rust.codegen.core.util.dq\nimport software.amazon.smithy.rust.codegen.core.util.expectTrait\n\nclass PatternTraitEscapedSpecialCharsValidator : AbstractValidator() {\n    private val specialCharsWithEscapes =\n        mapOf(\n            '\\b' to \"\\\\b\",\n            '\\u000C' to \"\\\\f\",\n            '\\n' to \"\\\\n\",\n            '\\r' to \"\\\\r\",\n            '\\t' to \"\\\\t\",\n        )\n    private val specialChars = specialCharsWithEscapes.keys\n\n    override fun validate(model: Model): List<ValidationEvent> {\n        val shapes =\n            model.getStringShapesWithTrait(PatternTrait::class.java) +\n                model.getMemberShapesWithTrait(PatternTrait::class.java)\n        return shapes\n            .filter { shape -> checkMisuse(shape) }\n            .map { shape -> makeError(shape) }\n            .toList()\n    }\n\n    private fun makeError(shape: Shape): ValidationEvent {\n        val pattern = shape.expectTrait<PatternTrait>()\n        val replacement =\n            pattern.pattern.toString()\n                .map { specialCharsWithEscapes.getOrElse(it) { it.toString() } }\n                .joinToString(\"\")\n                .dq()\n        val message =\n            \"\"\"\n            Non-escaped special characters used inside `@pattern`.\n            You must escape them: `@pattern($replacement)`.\n            See https://github.com/smithy-lang/smithy-rs/issues/2508 for more details.\n            \"\"\".trimIndent()\n        return error(shape, pattern, message)\n    }\n\n    private fun checkMisuse(shape: Shape): Boolean {\n        val pattern = shape.expectTrait<PatternTrait>().pattern.pattern()\n        return pattern.any(specialChars::contains)\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/PatternTraitValidationErrorMessage.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy\n\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.traits.PatternTrait\n\nfun PatternTrait.validationErrorMessage() =\n    \"Value at '{}' failed to satisfy constraint: Member must satisfy regular expression pattern: {}\"\n\nfun PatternTrait.shapeConstraintViolationDisplayMessage(shape: Shape) =\n    \"Value provided for `${shape.id}` failed to satisfy the constraint: Member must match the regular expression pattern: {}\"\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/PubCrateConstrainedShapeSymbolProvider.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy\n\nimport software.amazon.smithy.codegen.core.Symbol\nimport software.amazon.smithy.model.knowledge.NullableIndex\nimport software.amazon.smithy.model.shapes.CollectionShape\nimport software.amazon.smithy.model.shapes.MapShape\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.ServiceShape\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.shapes.SimpleShape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.shapes.UnionShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustModule\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustReservedWords\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustType\nimport software.amazon.smithy.rust.codegen.core.rustlang.Visibility\nimport software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.WrappingSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.handleOptionality\nimport software.amazon.smithy.rust.codegen.core.smithy.handleRustBoxing\nimport software.amazon.smithy.rust.codegen.core.smithy.locatedIn\nimport software.amazon.smithy.rust.codegen.core.smithy.rustType\nimport software.amazon.smithy.rust.codegen.core.util.PANIC\nimport software.amazon.smithy.rust.codegen.core.util.toPascalCase\nimport software.amazon.smithy.rust.codegen.core.util.toSnakeCase\n\n/**\n * The [PubCrateConstrainedShapeSymbolProvider] returns, for a given\n * _transitively but not directly_ constrained shape, a symbol whose Rust type\n * can hold the constrained values.\n *\n * For collection and map shapes, this type is a [RustType.Opaque] wrapper\n * tuple newtype holding a container over the inner constrained type. For\n * member shapes, it's whatever their target shape resolves to.\n *\n * The class name is prefixed with `PubCrate` because the symbols it returns\n * have associated types that are generated as `pub(crate)`. See the\n * `PubCrate*Generator` classes to see how these types are generated.\n *\n * It is important that this symbol provider does _not_ wrap\n * [ConstrainedShapeSymbolProvider], since otherwise it will eventually\n * delegate to it and generate a symbol with a `pub` type.\n *\n * Note simple shapes cannot be transitively and not directly constrained at\n * the same time, so this symbol provider is only implemented for aggregate shapes.\n * The symbol provider will intentionally crash in such a case to avoid the caller\n * incorrectly using it.\n *\n * Note also that for the purposes of this symbol provider, a member shape is\n * transitively but not directly constrained only in the case where it itself\n * is not directly constrained and its target also is not directly constrained.\n *\n * If the shape is _directly_ constrained, use [ConstrainedShapeSymbolProvider]\n * instead.\n */\nclass PubCrateConstrainedShapeSymbolProvider(\n    private val base: RustSymbolProvider,\n    private val serviceShape: ServiceShape,\n) : WrappingSymbolProvider(base) {\n    private val nullableIndex = NullableIndex.of(model)\n\n    private fun constrainedSymbolForCollectionOrMapShape(shape: Shape): Symbol {\n        check(shape is CollectionShape || shape is MapShape)\n\n        val name = constrainedTypeNameForCollectionOrMapShape(shape, serviceShape)\n        val module =\n            RustModule.new(\n                RustReservedWords.escapeIfNeeded(name.toSnakeCase()),\n                visibility = Visibility.PUBCRATE,\n                parent = ServerRustModule.ConstrainedModule,\n                inline = true,\n            )\n        val rustType = RustType.Opaque(name, module.fullyQualifiedPath())\n        return Symbol.builder()\n            .rustType(rustType)\n            .name(rustType.name)\n            .locatedIn(module)\n            .build()\n    }\n\n    private fun errorMessage(shape: Shape) =\n        \"This symbol provider was called with $shape. However, it can only be called with a shape that is transitively constrained.\"\n\n    override fun toSymbol(shape: Shape): Symbol {\n        require(shape.isTransitivelyButNotDirectlyConstrained(model, base)) { errorMessage(shape) }\n\n        return when (shape) {\n            is CollectionShape, is MapShape -> {\n                constrainedSymbolForCollectionOrMapShape(shape)\n            }\n\n            is MemberShape -> {\n                require(!shape.hasConstraintTraitOrTargetHasConstraintTrait(model, base)) { errorMessage(shape) }\n\n                val targetShape = model.expectShape(shape.target)\n\n                if (targetShape is SimpleShape) {\n                    base.toSymbol(shape)\n                } else {\n                    val targetSymbol = this.toSymbol(targetShape)\n                    // Handle boxing first, so we end up with `Option<Box<_>>`, not `Box<Option<_>>`.\n                    handleOptionality(\n                        handleRustBoxing(targetSymbol, shape),\n                        shape,\n                        nullableIndex,\n                        base.config.nullabilityCheckMode,\n                    )\n                }\n            }\n\n            is StructureShape, is UnionShape -> {\n                // Structure shapes and union shapes always generate a [RustType.Opaque] constrained type.\n                base.toSymbol(shape)\n            }\n\n            else -> {\n                check(shape is SimpleShape)\n                // The rest of the shape types are simple shapes, which are impossible to be transitively but not\n                // directly constrained; directly constrained shapes generate public constrained types.\n                PANIC(errorMessage(shape))\n            }\n        }\n    }\n}\n\nfun constrainedTypeNameForCollectionOrMapShape(\n    shape: Shape,\n    serviceShape: ServiceShape,\n): String {\n    check(shape is CollectionShape || shape is MapShape)\n    return \"${shape.id.getName(serviceShape).toPascalCase()}Constrained\"\n}\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/PubCrateConstraintViolationSymbolProvider.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy\n\nimport software.amazon.smithy.codegen.core.Symbol\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustType\nimport software.amazon.smithy.rust.codegen.core.smithy.WrappingSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.locatedIn\nimport software.amazon.smithy.rust.codegen.core.smithy.module\nimport software.amazon.smithy.rust.codegen.core.smithy.rustType\n\n/**\n * This is only used when `publicConstrainedTypes` is `false`.\n *\n * This must wrap [ConstraintViolationSymbolProvider].\n */\nclass PubCrateConstraintViolationSymbolProvider(\n    private val base: ConstraintViolationSymbolProvider,\n) : WrappingSymbolProvider(base) {\n    override fun toSymbol(shape: Shape): Symbol {\n        val baseSymbol = base.toSymbol(shape)\n        // If the shape is a structure shape, the module where its builder is hosted when `publicConstrainedTypes` is\n        // `false` is already suffixed with `_internal`.\n        if (shape is StructureShape) {\n            return baseSymbol\n        }\n        val baseRustType = baseSymbol.rustType()\n        val oldModule = baseSymbol.module()\n        val newModule = oldModule.copy(name = oldModule.name + \"_internal\")\n        return baseSymbol.toBuilder()\n            .rustType(RustType.Opaque(baseRustType.name, newModule.fullyQualifiedPath()))\n            .locatedIn(newModule)\n            .build()\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/RangeTraitValidationErrorMessage.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy\n\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.traits.RangeTrait\n\nfun RangeTrait.validationErrorMessage() =\n    \"Value at '{}' failed to satisfy constraint: Member must be ${this.rangeDescription()}\"\n\nfun RangeTrait.shapeConstraintViolationDisplayMessage(shape: Shape) =\n    \"Value for `${shape.id}`failed to satisfy constraint: Member must be ${this.rangeDescription()}\"\n\nfun RangeTrait.rangeDescription() =\n    if (this.min.isPresent && this.max.isPresent) {\n        \"between ${this.min.get()} and ${this.max.get()}, inclusive\"\n    } else if (this.min.isPresent) {\n        \"greater than or equal to ${this.min.get()}\"\n    } else {\n        check(this.max.isPresent)\n        \"less than or equal to ${this.max.get()}\"\n    }\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/RustCrateInlineModuleComposingWriter.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy\n\nimport software.amazon.smithy.codegen.core.Symbol\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustModule\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.smithy.ModuleDocProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.RustCrate\nimport software.amazon.smithy.rust.codegen.core.smithy.module\nimport java.util.concurrent.ConcurrentHashMap\n\ntypealias DocWriter = () -> Any\ntypealias InlineModuleCreator = (Symbol, Writable) -> Unit\n\n/**\n * Initializes RustCrate -> InnerModule data structure.\n */\nfun RustCrate.initializeInlineModuleWriter(debugMode: Boolean): InnerModule =\n    crateToInlineModule\n        .getOrPut(this) { InnerModule(moduleDocProvider, debugMode) }\n\n/**\n * Returns the InnerModule for the given RustCrate\n */\nfun RustCrate.getInlineModuleWriter(): InnerModule {\n    return crateToInlineModule.getOrPut(this) { InnerModule(moduleDocProvider, false) }\n}\n\n/**\n * Returns a function that can be used to create an inline module writer.\n */\nfun RustCrate.createInlineModuleCreator(): InlineModuleCreator {\n    return { symbol: Symbol, writable: Writable ->\n        this.getInlineModuleWriter().withInlineModuleHierarchyUsingCrate(this, symbol.module()) {\n            writable()\n        }\n    }\n}\n\n/**\n * If the passed in `shape` is a synthetic extracted shape resulting from a constrained struct member,\n * the `Writable` is called using the structure's builder module. Otherwise, the `Writable` is called\n * using the given `module`.\n */\nfun RustCrate.withModuleOrWithStructureBuilderModule(\n    module: RustModule,\n    shape: Shape,\n    codegenContext: ServerCodegenContext,\n    codeWritable: Writable,\n) {\n    // All structure constrained-member-shapes code is generated inside the structure builder's module.\n    val parentAndInlineModuleInfo =\n        shape.getParentAndInlineModuleForConstrainedMember(codegenContext.symbolProvider, codegenContext.settings.codegenConfig.publicConstrainedTypes)\n    if (parentAndInlineModuleInfo == null) {\n        this.withModule(module, codeWritable)\n    } else {\n        val (parent, inline) = parentAndInlineModuleInfo\n        val inlineWriter = this.getInlineModuleWriter()\n\n        inlineWriter.withInlineModuleHierarchyUsingCrate(this, parent) {\n            inlineWriter.withInlineModuleHierarchy(this, inline) {\n                codeWritable(this)\n            }\n        }\n    }\n}\n\n/**\n * If the passed in `shape` is a synthetic extracted shape resulting from a constrained struct member,\n * the `Writable` is called using the structure's builder module. Otherwise, the `Writable` is called\n * using shape's `module`.\n */\nfun RustCrate.useShapeWriterOrUseWithStructureBuilder(\n    shape: Shape,\n    codegenContext: ServerCodegenContext,\n    docWriter: DocWriter? = null,\n    writable: Writable,\n) {\n    // All structure constrained-member-shapes code is generated inside the structure builder's module.\n    val parentAndInlineModuleInfo =\n        shape.getParentAndInlineModuleForConstrainedMember(codegenContext.symbolProvider, codegenContext.settings.codegenConfig.publicConstrainedTypes)\n    if (parentAndInlineModuleInfo == null) {\n        docWriter?.invoke()\n        this.useShapeWriter(shape, writable)\n    } else {\n        val (parent, inline) = parentAndInlineModuleInfo\n        val inlineWriter = this.getInlineModuleWriter()\n\n        inlineWriter.withInlineModuleHierarchyUsingCrate(this, parent) {\n            inlineWriter.withInlineModuleHierarchy(this, inline) {\n                writable(this)\n            }\n        }\n    }\n}\n\nfun RustCrate.renderInlineMemoryModules() {\n    val inlineModule = crateToInlineModule[this]\n    check(inlineModule != null) {\n        \"InlineModule writer has not been registered for this crate\"\n    }\n    inlineModule.render()\n}\n\n/**\n * Given a `RustWriter` calls the `Writable` using a `RustWriter` for the `inlineModule`\n */\nfun RustCrate.withInMemoryInlineModule(\n    outerWriter: RustWriter,\n    inlineModule: RustModule.LeafModule,\n    docWriter: DocWriter?,\n    codeWritable: Writable,\n) {\n    check(inlineModule.isInline()) {\n        \"Module has to be an inline module for it to be used with the InlineModuleWriter\"\n    }\n    this.getInlineModuleWriter().withInlineModuleHierarchy(outerWriter, inlineModule, docWriter) {\n        codeWritable(this)\n    }\n}\n\nfun RustWriter.createTestInlineModuleCreator(): InlineModuleCreator {\n    return { symbol: Symbol, writable: Writable ->\n        this.withInlineModule(symbol.module(), null) {\n            writable()\n        }\n    }\n}\n\n/**\n * Maintains the `RustWriter` that has been created for a `RustModule.LeafModule`.\n */\nprivate data class InlineModuleWithWriter(val inlineModule: RustModule.LeafModule, val writer: RustWriter)\n\n/**\n * For each RustCrate a separate mapping of inline-module to `RustWriter` is maintained.\n */\nprivate val crateToInlineModule: ConcurrentHashMap<RustCrate, InnerModule> =\n    ConcurrentHashMap()\n\nclass InnerModule(private val moduleDocProvider: ModuleDocProvider, debugMode: Boolean) {\n    // Holds the root modules to start rendering the descendents from.\n    private val topLevelModuleWriters: ConcurrentHashMap<RustWriter, Unit> = ConcurrentHashMap()\n    private val inlineModuleWriters: ConcurrentHashMap<RustWriter, MutableList<InlineModuleWithWriter>> =\n        ConcurrentHashMap()\n    private val docWriters: ConcurrentHashMap<RustModule.LeafModule, MutableList<DocWriter>> = ConcurrentHashMap()\n    private val writerCreator = RustWriter.factory(debugMode)\n\n    // By default, when a RustWriter is rendered, it prints a comment on top\n    // indicating that it contains generated code and should not be manually edited. This comment\n    // appears on each descendent inline module. To remove those comments, each time an inline\n    // module is rendered, first `emptyLineCount` characters are removed from it.\n    private val emptyLineCount: Int =\n        writerCreator\n            .apply(\"lines-it-always-writes.rs\", \"crate\")\n            .toString()\n            .split(\"\\n\")[0]\n            .length\n\n    fun withInlineModule(\n        outerWriter: RustWriter,\n        innerModule: RustModule.LeafModule,\n        docWriter: DocWriter? = null,\n        writable: Writable,\n    ) {\n        if (docWriter != null) {\n            val moduleDocWriterList = docWriters.getOrPut(innerModule) { mutableListOf() }\n            moduleDocWriterList.add(docWriter)\n        }\n        writable(getWriter(outerWriter, innerModule))\n    }\n\n    /**\n     * Given a `RustCrate` and a `RustModule.LeafModule()`, it creates a writer to that module and calls the writable.\n     */\n    fun withInlineModuleHierarchyUsingCrate(\n        rustCrate: RustCrate,\n        inlineModule: RustModule.LeafModule,\n        docWriter: DocWriter? = null,\n        writable: Writable,\n    ) {\n        val hierarchy = getHierarchy(inlineModule).toMutableList()\n        check(!hierarchy.first().isInline()) {\n            \"When adding a `RustModule.LeafModule` to the crate, the topmost module in the hierarchy cannot be an inline module.\"\n        }\n        // The last in the hierarchy is the one we will return the writer for.\n        val bottomMost = hierarchy.removeLast()\n\n        // In case it is a top level module that has been passed (e.g. ModelsModule, OutputsModule) then\n        // register it with the topLevel writers and call the writable on it. Otherwise, go over the\n        // complete hierarchy, registering each of the inner modules and then call the `Writable`\n        // with the bottom most inline module that has been passed.\n        if (hierarchy.isNotEmpty()) {\n            val topMost = hierarchy.removeFirst()\n\n            // Create an intermediate writer for all inner modules in the hierarchy.\n            rustCrate.withModule(topMost) {\n                var writer = this\n                hierarchy.forEach {\n                    writer = getWriter(writer, it)\n                }\n\n                withInlineModule(writer, bottomMost, docWriter, writable)\n            }\n        } else {\n            check(!bottomMost.isInline()) {\n                \"There is only one module in the hierarchy, so it has to be non-inlined.\"\n            }\n            rustCrate.withModule(bottomMost) {\n                registerTopMostWriter(this)\n                writable(this)\n            }\n        }\n    }\n\n    /**\n     * Given a `Writer` to a module and an inline `RustModule.LeafModule()`, it creates a writer to that module and calls the writable.\n     * It registers the complete hierarchy including the `outerWriter` if that is not already registrered.\n     */\n    fun withInlineModuleHierarchy(\n        outerWriter: RustWriter,\n        inlineModule: RustModule.LeafModule,\n        docWriter: DocWriter? = null,\n        writable: Writable,\n    ) {\n        val hierarchy = getHierarchy(inlineModule).toMutableList()\n        if (!hierarchy.first().isInline()) {\n            hierarchy.removeFirst()\n        }\n        check(hierarchy.isNotEmpty()) {\n            \"An inline module should always have one parent besides itself.\"\n        }\n\n        // The last in the hierarchy is the module under which the new inline module resides.\n        val bottomMost = hierarchy.removeLast()\n\n        // Create an entry in the HashMap for all the descendent modules in the hierarchy.\n        var writer = outerWriter\n        hierarchy.forEach {\n            writer = getWriter(writer, it)\n        }\n\n        withInlineModule(writer, bottomMost, docWriter, writable)\n    }\n\n    /**\n     * Creates an in memory writer and registers it with a map of RustWriter -> listOf(Inline descendent modules)\n     */\n    private fun createNewInlineModule(): RustWriter {\n        val writer = writerCreator.apply(\"unknown-module-would-never-be-written.rs\", \"crate\")\n        // Register the new RustWriter in the map to allow further descendent inline modules to be created inside it.\n        inlineModuleWriters[writer] = mutableListOf()\n        return writer\n    }\n\n    /**\n     * Returns the complete hierarchy of a `RustModule.LeafModule` from top to bottom\n     */\n    private fun getHierarchy(module: RustModule.LeafModule): List<RustModule.LeafModule> {\n        var current: RustModule = module\n        var hierarchy = listOf<RustModule.LeafModule>()\n\n        while (current is RustModule.LeafModule) {\n            hierarchy = listOf(current) + hierarchy\n            current = current.parent\n        }\n\n        return hierarchy\n    }\n\n    /**\n     * Writes out each inline module's code (`toString`) to the respective top level `RustWriter`.\n     */\n    fun render() {\n        var writerToAddDependencies: RustWriter? = null\n\n        fun writeInlineCode(\n            rustWriter: RustWriter,\n            code: String,\n        ) {\n            val inlineCode = code.drop(emptyLineCount)\n            rustWriter.writeWithNoFormatting(inlineCode)\n        }\n\n        fun renderDescendents(\n            topLevelWriter: RustWriter,\n            inMemoryWriter: RustWriter,\n        ) {\n            // Traverse all descendent inline modules and render them.\n            inlineModuleWriters[inMemoryWriter]!!.forEach {\n                writeDocs(it.inlineModule)\n\n                topLevelWriter.withInlineModule(it.inlineModule, moduleDocProvider) {\n                    writeInlineCode(this, it.writer.toString())\n                    renderDescendents(this, it.writer)\n                }\n\n                // Add dependencies introduced by the inline module to the top most RustWriter.\n                it.writer.dependencies.forEach { dep -> writerToAddDependencies!!.addDependency(dep) }\n            }\n        }\n\n        // Go over all the top level modules, create an `inlineModule` on the `RustWriter`\n        // and call the descendent hierarchy renderer using the `inlineModule::RustWriter`.\n        topLevelModuleWriters.keys.forEach {\n            writerToAddDependencies = it\n\n            check(inlineModuleWriters[it] != null) {\n                \"There must be a registered RustWriter for this module.\"\n            }\n\n            renderDescendents(it, it)\n        }\n    }\n\n    /**\n     * Given the inline-module returns an existing `RustWriter`, or if that inline module\n     * has never been registered before then a new `RustWriter` is created and returned.\n     */\n    private fun getWriter(\n        outerWriter: RustWriter,\n        inlineModule: RustModule.LeafModule,\n    ): RustWriter {\n        val nestedModuleWriter = inlineModuleWriters[outerWriter]\n        if (nestedModuleWriter != null) {\n            return findOrAddToList(nestedModuleWriter, inlineModule)\n        }\n\n        val inlineWriters = registerTopMostWriter(outerWriter)\n        return findOrAddToList(inlineWriters, inlineModule)\n    }\n\n    /**\n     * Records the root of a dependency graph of inline modules.\n     */\n    private fun registerTopMostWriter(outerWriter: RustWriter): MutableList<InlineModuleWithWriter> {\n        topLevelModuleWriters[outerWriter] = Unit\n        return inlineModuleWriters.getOrPut(outerWriter) { mutableListOf() }\n    }\n\n    /**\n     * Either gets a new `RustWriter` for the inline module or creates a new one and adds it to\n     * the list of inline modules.\n     */\n    private fun findOrAddToList(\n        inlineModuleList: MutableList<InlineModuleWithWriter>,\n        lookForModule: RustModule.LeafModule,\n    ): RustWriter {\n        val index = inlineModuleList.indexOfFirst { it.inlineModule.name == lookForModule.name }\n\n        return if (index == -1) {\n            val inlineWriter = createNewInlineModule()\n            inlineModuleList.add(InlineModuleWithWriter(lookForModule, inlineWriter))\n            inlineWriter\n        } else {\n            val existing = inlineModuleList[index]\n\n            // Verify everything except documentation matches.\n            val existingModule = existing.inlineModule\n            check(\n                existingModule.name == lookForModule.name &&\n                    existingModule.rustMetadata == lookForModule.rustMetadata &&\n                    existingModule.parent == lookForModule.parent &&\n                    existingModule.tests == lookForModule.tests,\n            ) {\n                \"\"\"\n                An inline module with the same name `${lookForModule.name}` was earlier created with different attributes:\n                1) Metadata:\n                    `${existingModule.rustMetadata}`\n                    `${lookForModule.rustMetadata}`\n                2) Parent:\n                    `${existingModule.parent}`\n                    `${lookForModule.parent}`\n                3) Tests:\n                    `${existingModule.tests}`\n                    `${lookForModule.tests}`\n                4) DocumentationOverride:\n                    `${existingModule.documentationOverride}`\n                    `${lookForModule.documentationOverride}`\n                \"\"\"\n            }\n\n            // Merge documentation.\n            val mergedDoc =\n                mergeDocumentation(existingModule.documentationOverride, lookForModule.documentationOverride)\n\n            // Replace the element in the list with merged documentation.\n            inlineModuleList[index] =\n                InlineModuleWithWriter(\n                    existingModule.copy(documentationOverride = mergedDoc),\n                    existing.writer,\n                )\n\n            existing.writer\n        }\n    }\n\n    // @VisibleForTesting\n    internal fun mergeDocumentation(\n        existingModule: String?,\n        lookForModule: String?,\n    ): String? {\n        val mergedDoc =\n            when {\n                existingModule == null && lookForModule == null -> null\n                existingModule == null -> lookForModule\n                lookForModule == null -> existingModule\n                else ->\n                    listOf(\n                        existingModule.trim(),\n                        lookForModule.trim(),\n                    ).joinToString(\"\\n\")\n            }\n        return mergedDoc?.trim()\n    }\n\n    private fun writeDocs(innerModule: RustModule.LeafModule) {\n        docWriters[innerModule]?.forEach {\n            it()\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/RustServerCodegenPlugin.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy\n\nimport software.amazon.smithy.build.PluginContext\nimport software.amazon.smithy.codegen.core.ReservedWordSymbolProvider\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.ServiceShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustReservedWordSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.BaseSymbolMetadataProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenTarget\nimport software.amazon.smithy.rust.codegen.core.smithy.EventStreamSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProviderConfig\nimport software.amazon.smithy.rust.codegen.core.smithy.StreamingShapeMetadataProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.StreamingShapeSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.SymbolVisitor\nimport software.amazon.smithy.rust.codegen.server.smithy.customizations.CustomValidationExceptionWithReasonDecorator\nimport software.amazon.smithy.rust.codegen.server.smithy.customizations.ServerRequiredCustomizations\nimport software.amazon.smithy.rust.codegen.server.smithy.customizations.SigV4EventStreamDecorator\nimport software.amazon.smithy.rust.codegen.server.smithy.customizations.SmithyValidationExceptionDecorator\nimport software.amazon.smithy.rust.codegen.server.smithy.customizations.UserProvidedValidationExceptionDecorator\nimport software.amazon.smithy.rust.codegen.server.smithy.customize.CombinedServerCodegenDecorator\nimport software.amazon.smithy.rust.codegen.server.smithy.customize.ServerCodegenDecorator\nimport software.amazon.smithy.rust.codegen.server.smithy.testutil.ServerDecoratableBuildPlugin\nimport java.util.logging.Level\nimport java.util.logging.Logger\n\n/**\n * Rust Server Codegen Plugin\n *\n * This is the entrypoint for code generation, triggered by the smithy-build plugin.\n * `resources/META-INF.services/software.amazon.smithy.build.SmithyBuildPlugin` refers to this class by name which\n * enables the smithy-build plugin to invoke `execute` with all Smithy plugin context + models.\n */\nclass RustServerCodegenPlugin : ServerDecoratableBuildPlugin() {\n    private val logger = Logger.getLogger(javaClass.name)\n\n    override fun getName(): String = \"rust-server-codegen\"\n\n    /**\n     * See [software.amazon.smithy.rust.codegen.client.smithy.RustClientCodegenPlugin].\n     */\n    override fun executeWithDecorator(\n        context: PluginContext,\n        vararg decorator: ServerCodegenDecorator,\n    ) {\n        Logger.getLogger(ReservedWordSymbolProvider::class.java.name).level = Level.OFF\n        val codegenDecorator =\n            CombinedServerCodegenDecorator.fromClasspath(\n                context,\n                ServerRequiredCustomizations(),\n                UserProvidedValidationExceptionDecorator(),\n                SmithyValidationExceptionDecorator(),\n                CustomValidationExceptionWithReasonDecorator(),\n                SigV4EventStreamDecorator(),\n                *decorator,\n            )\n        logger.info(\"Loaded plugin to generate pure Rust bindings for the server SDK\")\n        ServerCodegenVisitor(context, codegenDecorator).execute()\n    }\n\n    companion object {\n        /**\n         * See [software.amazon.smithy.rust.codegen.client.smithy.RustClientCodegenPlugin].\n         */\n        fun baseSymbolProvider(\n            settings: ServerRustSettings,\n            model: Model,\n            serviceShape: ServiceShape,\n            rustSymbolProviderConfig: RustSymbolProviderConfig,\n            constrainedTypes: Boolean = true,\n            includeConstrainedShapeProvider: Boolean = true,\n            codegenDecorator: ServerCodegenDecorator,\n        ) = SymbolVisitor(settings, model, serviceShape = serviceShape, config = rustSymbolProviderConfig)\n            // Generate public constrained types for directly constrained shapes.\n            .let {\n                if (includeConstrainedShapeProvider) ConstrainedShapeSymbolProvider(it, serviceShape, constrainedTypes) else it\n            }\n            // Generate different types for EventStream shapes (e.g. transcribe streaming)\n            .let { EventStreamSymbolProvider(rustSymbolProviderConfig.runtimeConfig, it, CodegenTarget.SERVER) }\n            // Generate [ByteStream] instead of `Blob` for streaming binary shapes (e.g. S3 GetObject)\n            .let { StreamingShapeSymbolProvider(it) }\n            // Add Rust attributes (like `#[derive(PartialEq)]`) to generated shapes\n            .let { BaseSymbolMetadataProvider(it, additionalAttributes = listOf()) }\n            // Constrained shapes generate newtypes that need the same derives we place on types generated from aggregate shapes.\n            .let { ConstrainedShapeSymbolMetadataProvider(it, constrainedTypes) }\n            // Streaming shapes need different derives (e.g. they cannot derive `PartialEq`)\n            .let { StreamingShapeMetadataProvider(it) }\n            // Derive `Eq` and `Hash` if possible.\n            .let { DeriveEqAndHashSymbolMetadataProvider(it) }\n            // Rename shapes that clash with Rust reserved words & and other SDK specific features e.g. `send()` cannot\n            // be the name of an operation input\n            .let { RustReservedWordSymbolProvider(it, ServerReservedWords) }\n            // Allows decorators to inject a custom symbol provider\n            .let { codegenDecorator.symbolProvider(it) }\n            // Inject custom symbols.\n            .let { CustomShapeSymbolProvider(it) }\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ServerCargoDependency.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy\n\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.CratesIo\nimport software.amazon.smithy.rust.codegen.core.rustlang.DependencyScope\nimport software.amazon.smithy.rust.codegen.core.smithy.HttpVersion\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig\n\n/**\n * Object used *exclusively* in the runtime of the server, for separation concerns.\n * Analogous to the companion object in [CargoDependency]; see its documentation for details.\n * For a dependency that is used in the client, or in both the client and the server, use [CargoDependency] directly.\n */\nobject ServerCargoDependency {\n    val AsyncTrait: CargoDependency = CargoDependency(\"async-trait\", CratesIo(\"0.1.74\"))\n    val Base64SimdDev: CargoDependency =\n        CargoDependency(\"base64-simd\", CratesIo(\"0.8\"), scope = DependencyScope.Dev)\n    val FormUrlEncoded: CargoDependency = CargoDependency(\"form_urlencoded\", CratesIo(\"1\"))\n    val FuturesUtil: CargoDependency = CargoDependency(\"futures-util\", CratesIo(\"0.3\"))\n    val Mime: CargoDependency = CargoDependency(\"mime\", CratesIo(\"0.3\"))\n    val Nom: CargoDependency = CargoDependency(\"nom\", CratesIo(\"7\"))\n    val PinProjectLite: CargoDependency = CargoDependency(\"pin-project-lite\", CratesIo(\"0.2\"))\n    val ThisError: CargoDependency = CargoDependency(\"thiserror\", CratesIo(\"1.0\"))\n    val Tower: CargoDependency = CargoDependency(\"tower\", CratesIo(\"0.4\"))\n    val TokioDev: CargoDependency =\n        CargoDependency(\"tokio\", CratesIo(\"1.23.1\"), scope = DependencyScope.Dev)\n    val Regex: CargoDependency = CargoDependency(\"regex\", CratesIo(\"1.5.5\"))\n\n    /**\n     * Returns the appropriate smithy-http-server dependency based on HTTP version.\n     *\n     * For HTTP 1.x: returns `aws-smithy-http-server` (latest version)\n     * For HTTP 0.x: returns `aws-smithy-legacy-http-server` (forked version supporting http@0.2)\n     */\n    fun smithyHttpServer(runtimeConfig: RuntimeConfig): CargoDependency =\n        when (runtimeConfig.httpVersion) {\n            HttpVersion.Http1x -> runtimeConfig.smithyRuntimeCrate(\"smithy-http-server\")\n            HttpVersion.Http0x -> runtimeConfig.smithyRuntimeCrate(\"smithy-legacy-http-server\")\n        }\n\n    fun hyperDev(runtimeConfig: RuntimeConfig): CargoDependency =\n        CargoDependency.hyper(runtimeConfig).copy(scope = DependencyScope.Dev)\n\n    fun smithyTypes(runtimeConfig: RuntimeConfig) = runtimeConfig.smithyRuntimeCrate(\"smithy-types\")\n}\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ServerCodegenContext.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy\n\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.ServiceShape\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenContext\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenTarget\nimport software.amazon.smithy.rust.codegen.core.smithy.ModuleDocProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.BuilderInstantiator\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.ServerBuilderInstantiator\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.protocol.returnSymbolToParseFn\n\n/**\n * [ServerCodegenContext] contains code-generation context that is _specific_ to the [RustServerCodegenPlugin] plugin\n * from the `rust-codegen-server` subproject.\n *\n * It inherits from [CodegenContext], which contains code-generation context that is common to _all_ smithy-rs plugins.\n *\n * This class has to live in the `codegen` subproject because it is referenced in common generators to both client\n * and server (like [JsonParserGenerator]).\n */\ndata class ServerCodegenContext(\n    override val model: Model,\n    override val symbolProvider: RustSymbolProvider,\n    override val moduleDocProvider: ModuleDocProvider?,\n    override val serviceShape: ServiceShape,\n    override val protocol: ShapeId,\n    override val settings: ServerRustSettings,\n    val unconstrainedShapeSymbolProvider: UnconstrainedShapeSymbolProvider,\n    val constrainedShapeSymbolProvider: RustSymbolProvider,\n    val constraintViolationSymbolProvider: ConstraintViolationSymbolProvider,\n    val pubCrateConstrainedShapeSymbolProvider: PubCrateConstrainedShapeSymbolProvider,\n) : CodegenContext(\n        model, symbolProvider, moduleDocProvider, serviceShape, protocol, settings, CodegenTarget.SERVER,\n    ) {\n    override fun builderInstantiator(): BuilderInstantiator {\n        return ServerBuilderInstantiator(symbolProvider, returnSymbolToParseFn(this))\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ServerCodegenVisitor.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy\n\nimport software.amazon.smithy.build.PluginContext\nimport software.amazon.smithy.codegen.core.CodegenException\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.knowledge.NullableIndex\nimport software.amazon.smithy.model.shapes.BlobShape\nimport software.amazon.smithy.model.shapes.ByteShape\nimport software.amazon.smithy.model.shapes.CollectionShape\nimport software.amazon.smithy.model.shapes.IntegerShape\nimport software.amazon.smithy.model.shapes.ListShape\nimport software.amazon.smithy.model.shapes.LongShape\nimport software.amazon.smithy.model.shapes.MapShape\nimport software.amazon.smithy.model.shapes.NumberShape\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.ServiceShape\nimport software.amazon.smithy.model.shapes.SetShape\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.shapes.ShapeVisitor\nimport software.amazon.smithy.model.shapes.ShortShape\nimport software.amazon.smithy.model.shapes.StringShape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.shapes.UnionShape\nimport software.amazon.smithy.model.traits.EnumTrait\nimport software.amazon.smithy.model.traits.ErrorTrait\nimport software.amazon.smithy.model.traits.LengthTrait\nimport software.amazon.smithy.model.transform.ModelTransformer\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.implBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlock\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenTarget\nimport software.amazon.smithy.rust.codegen.core.smithy.CoreRustSettings\nimport software.amazon.smithy.rust.codegen.core.smithy.DirectedWalker\nimport software.amazon.smithy.rust.codegen.core.smithy.RustCrate\nimport software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProviderConfig\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.EnumGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.StructureGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.UnionGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.error.ErrorImplGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.lifetimeDeclaration\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.ProtocolGeneratorFactory\nimport software.amazon.smithy.rust.codegen.core.smithy.transformers.EventStreamNormalizer\nimport software.amazon.smithy.rust.codegen.core.smithy.transformers.OperationNormalizer\nimport software.amazon.smithy.rust.codegen.core.smithy.transformers.RecursiveShapeBoxer\nimport software.amazon.smithy.rust.codegen.core.util.CommandError\nimport software.amazon.smithy.rust.codegen.core.util.getTrait\nimport software.amazon.smithy.rust.codegen.core.util.hasEventStreamMember\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\nimport software.amazon.smithy.rust.codegen.core.util.isEventStream\nimport software.amazon.smithy.rust.codegen.core.util.runCommand\nimport software.amazon.smithy.rust.codegen.server.smithy.customize.ServerCodegenDecorator\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.CollectionConstraintViolationGenerator\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.CollectionTraitInfo\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.ConstrainedBlobGenerator\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.ConstrainedCollectionGenerator\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.ConstrainedMapGenerator\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.ConstrainedNumberGenerator\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.ConstrainedStringGenerator\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.ConstrainedTraitForEnumGenerator\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.MapConstraintViolationGenerator\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.PubCrateConstrainedCollectionGenerator\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.PubCrateConstrainedMapGenerator\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.ScopeMacroGenerator\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.ServerBuilderGenerator\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.ServerBuilderGeneratorWithoutPublicConstrainedTypes\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.ServerEnumGenerator\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.ServerOperationErrorGenerator\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.ServerOperationGenerator\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.ServerRootGenerator\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.ServerRuntimeTypesReExportsGenerator\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.ServerServiceGenerator\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.ServerStructureConstrainedTraitImpl\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.ServiceConfigGenerator\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.UnconstrainedCollectionGenerator\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.UnconstrainedMapGenerator\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.UnconstrainedUnionGenerator\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.ValidationExceptionConversionGenerator\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.isBuilderFallible\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.protocol.ServerProtocol\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.protocol.ServerProtocolGenerator\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.protocol.ServerProtocolTestGenerator\nimport software.amazon.smithy.rust.codegen.server.smithy.protocols.ServerProtocolLoader\nimport software.amazon.smithy.rust.codegen.server.smithy.traits.isReachableFromOperationInput\nimport software.amazon.smithy.rust.codegen.server.smithy.transformers.AttachValidationExceptionToConstrainedOperationInputs\nimport software.amazon.smithy.rust.codegen.server.smithy.transformers.ConstrainedMemberTransform\nimport software.amazon.smithy.rust.codegen.server.smithy.transformers.RecursiveConstraintViolationBoxer\nimport software.amazon.smithy.rust.codegen.server.smithy.transformers.RemoveEbsModelValidationException\nimport software.amazon.smithy.rust.codegen.server.smithy.transformers.ServerProtocolBasedTransformationFactory\nimport software.amazon.smithy.rust.codegen.server.smithy.transformers.ShapesReachableFromOperationInputTagger\nimport java.util.logging.Logger\n\n/**\n * Entrypoint for server-side code generation. This class will walk the in-memory model and\n * generate all the needed types by calling the accept() function on the available shapes.\n */\nopen class ServerCodegenVisitor(\n    context: PluginContext,\n    private val codegenDecorator: ServerCodegenDecorator,\n) : ShapeVisitor.Default<Unit>() {\n    protected val logger = Logger.getLogger(javaClass.name)\n    protected var settings = ServerRustSettings.from(context.model, context.settings)\n\n    protected var rustCrate: RustCrate\n    private val fileManifest = context.fileManifest\n    protected var model: Model\n    protected var codegenContext: ServerCodegenContext\n    protected var protocolGeneratorFactory: ProtocolGeneratorFactory<ServerProtocolGenerator, ServerCodegenContext>\n    protected var protocolGenerator: ServerProtocolGenerator\n    protected var validationExceptionConversionGenerator: ValidationExceptionConversionGenerator\n\n    init {\n        val rustSymbolProviderConfig =\n            RustSymbolProviderConfig(\n                runtimeConfig = settings.runtimeConfig,\n                renameExceptions = false,\n                nullabilityCheckMode = NullableIndex.CheckMode.SERVER,\n                moduleProvider = ServerModuleProvider,\n            )\n\n        val baseModel = baselineTransform(context.model)\n        val service = settings.getService(baseModel)\n        model = codegenDecorator.transformModel(service, baseModel, settings)\n        val serverSymbolProviders =\n            ServerSymbolProviders.from(\n                settings,\n                model,\n                service,\n                rustSymbolProviderConfig,\n                settings.codegenConfig.publicConstrainedTypes,\n                codegenDecorator,\n                RustServerCodegenPlugin::baseSymbolProvider,\n            )\n        val (protocolShape, protocolGeneratorFactory) =\n            ServerProtocolLoader(\n                codegenDecorator.protocols(\n                    service.id,\n                    ServerProtocolLoader.defaultProtocols { it ->\n                        codegenDecorator.httpCustomizations(\n                            serverSymbolProviders.symbolProvider,\n                            it,\n                        )\n                    },\n                ),\n            )\n                .protocolFor(context.model, service)\n        codegenContext =\n            ServerCodegenContext(\n                model,\n                serverSymbolProviders.symbolProvider,\n                null,\n                service,\n                protocolShape,\n                settings,\n                serverSymbolProviders.unconstrainedShapeSymbolProvider,\n                serverSymbolProviders.constrainedShapeSymbolProvider,\n                serverSymbolProviders.constraintViolationSymbolProvider,\n                serverSymbolProviders.pubCrateConstrainedShapeSymbolProvider,\n            )\n        this.protocolGeneratorFactory = protocolGeneratorFactory\n\n        // We can use a not-null assertion because [CombinedServerCodegenDecorator] returns a not null value.\n        validationExceptionConversionGenerator = codegenDecorator.validationExceptionConversion(codegenContext)!!\n\n        codegenContext =\n            codegenContext.copy(\n                moduleDocProvider =\n                    codegenDecorator.moduleDocumentationCustomization(\n                        codegenContext,\n                        ServerModuleDocProvider(codegenContext),\n                    ),\n            )\n\n        rustCrate =\n            RustCrate(\n                context.fileManifest,\n                codegenContext.symbolProvider,\n                settings.codegenConfig,\n                codegenContext.expectModuleDocProvider(),\n            )\n        protocolGenerator = this.protocolGeneratorFactory.buildProtocolGenerator(codegenContext)\n    }\n\n    /**\n     * Base model transformation applied to all services.\n     * See below for details.\n     */\n    protected fun baselineTransform(model: Model) =\n        model\n            // Flattens mixins out of the model and removes them from the model\n            .let { ModelTransformer.create().flattenAndRemoveMixins(it) }\n            // Add errors attached at the service level to the models\n            .let { ModelTransformer.create().copyServiceErrorsToOperations(it, settings.getService(it)) }\n            // Add `Box<T>` to recursive shapes as necessary\n            .let(RecursiveShapeBoxer()::transform)\n            // Add `Box<T>` to recursive constraint violations as necessary\n            .let(RecursiveConstraintViolationBoxer::transform)\n            // Normalize operations by adding synthetic input and output shapes to every operation\n            .let(OperationNormalizer::transform)\n            // Transforms constrained member shapes into non-constrained member shapes targeting a new shape that\n            // has the member's constraints.\n            .let(ConstrainedMemberTransform::transform)\n            // Remove the EBS model's own `ValidationException`, which collides with `smithy.framework#ValidationException`\n            .let(RemoveEbsModelValidationException::transform)\n            // Attach the `smithy.framework#ValidationException` error to operations whose inputs are constrained,\n            // if either the operation belongs to a service in the allowlist, or the codegen flag to add the exception has been set.\n            .let { AttachValidationExceptionToConstrainedOperationInputs.transform(it, settings) }\n            // Tag aggregate shapes reachable from operation input\n            .let(ShapesReachableFromOperationInputTagger::transform)\n            // Remove traits that are not supported by the chosen protocol.\n            .let { ServerProtocolBasedTransformationFactory.transform(it, settings) }\n            // Normalize event stream operations\n            .let(EventStreamNormalizer::transform)\n\n    /**\n     * Exposure purely for unit test purposes.\n     */\n    internal fun baselineTransformInternalTest(model: Model) = baselineTransform(model)\n\n    /**\n     * Execute code generation\n     *\n     * 1. Load the service from [CoreRustSettings].\n     * 2. Traverse every shape in the closure of the service.\n     * 3. Loop through each shape and visit them (calling the override functions in this class)\n     * 4. Call finalization tasks specified by decorators.\n     * 5. Write the in-memory buffers out to files.\n     *\n     * The main work of code generation (serializers, protocols, etc.) is handled in `fn serviceShape` below.\n     */\n    fun execute() {\n        val service = settings.getService(model)\n        logger.warning(\n            \"[rust-server-codegen] Generating Rust server for service $service, protocol ${codegenContext.protocol}\",\n        )\n\n        val validationExceptionShapeId = validationExceptionConversionGenerator.shapeId\n        for (validationResult in listOf(\n            validateModelHasAtMostOneValidationException(model, service),\n            codegenDecorator.postprocessValidationExceptionNotAttachedErrorMessage(\n                validateOperationsWithConstrainedInputHaveValidationExceptionAttached(\n                    model,\n                    service,\n                    validationExceptionShapeId,\n                ),\n            ),\n            validateUnsupportedConstraints(model, service, codegenContext.settings.codegenConfig),\n            codegenDecorator.postprocessMultipleValidationExceptionsErrorMessage(\n                validateOperationsWithConstrainedInputHaveOneValidationExceptionAttached(\n                    model,\n                    service,\n                    validationExceptionShapeId,\n                ),\n            ),\n        )) {\n            for (logMessage in validationResult.messages) {\n                // TODO(https://github.com/smithy-lang/smithy-rs/issues/1756): These are getting duplicated.\n                logger.log(logMessage.level, logMessage.message)\n            }\n            if (validationResult.shouldAbort) {\n                throw CodegenException(\n                    \"Unsupported constraints feature used; see error messages above for resolution\",\n                    validationResult,\n                )\n            }\n        }\n\n        rustCrate.initializeInlineModuleWriter(codegenContext.settings.codegenConfig.debugMode)\n\n        val serviceShapes = DirectedWalker(model).walkShapes(service)\n        serviceShapes.forEach { it.accept(this) }\n        codegenDecorator.extras(codegenContext, rustCrate)\n\n        rustCrate.getInlineModuleWriter().render()\n\n        rustCrate.finalize(\n            settings,\n            model,\n            codegenDecorator.crateManifestCustomizations(codegenContext),\n            codegenDecorator.libRsCustomizations(codegenContext, listOf()),\n            // TODO(https://github.com/smithy-lang/smithy-rs/issues/1287): Remove once the server codegen is far enough along.\n            requireDocs = false,\n            protocolId = codegenContext.protocol,\n        )\n        try {\n            \"cargo fmt\".runCommand(\n                fileManifest.baseDir,\n                timeout = settings.codegenConfig.formatTimeoutSeconds.toLong(),\n            )\n        } catch (err: CommandError) {\n            logger.info(\n                \"[rust-server-codegen] Failed to run cargo fmt: [${service.id}]\\n${err.output}\",\n            )\n        }\n        logger.info(\"[rust-server-codegen] Rust server generation complete!\")\n    }\n\n    override fun getDefault(shape: Shape?) {}\n\n    /**\n     * Structure Shape Visitor\n     *\n     * For each structure shape, generate:\n     * - A Rust structure for the shape ([StructureGenerator]).\n     * - A builder for the shape.\n     *\n     * This function _does not_ generate any serializers.\n     */\n    override fun structureShape(shape: StructureShape) {\n        logger.info(\"[rust-server-codegen] Generating a structure $shape\")\n        rustCrate.useShapeWriter(shape) {\n            StructureGenerator(\n                model,\n                codegenContext.symbolProvider,\n                this,\n                shape,\n                codegenDecorator.structureCustomizations(codegenContext, emptyList()),\n                structSettings = codegenContext.structSettings(),\n            ).render()\n\n            shape.getTrait<ErrorTrait>()?.also { errorTrait ->\n                ErrorImplGenerator(\n                    model,\n                    codegenContext.symbolProvider,\n                    this,\n                    shape,\n                    errorTrait,\n                    codegenDecorator.errorImplCustomizations(codegenContext, emptyList()),\n                ).render(CodegenTarget.SERVER)\n            }\n\n            renderStructureShapeBuilder(shape, this)\n        }\n    }\n\n    protected fun renderStructureShapeBuilder(\n        shape: StructureShape,\n        writer: RustWriter,\n    ) {\n        if (codegenContext.settings.codegenConfig.publicConstrainedTypes || shape.isReachableFromOperationInput()) {\n            val serverBuilderGenerator =\n                ServerBuilderGenerator(\n                    codegenContext,\n                    shape,\n                    validationExceptionConversionGenerator,\n                    protocolGenerator.protocol,\n                )\n            serverBuilderGenerator.render(rustCrate, writer)\n\n            if (codegenContext.settings.codegenConfig.publicConstrainedTypes) {\n                val lifetimes = shape.lifetimeDeclaration(codegenContext.symbolProvider)\n                writer.rustBlock(\"impl $lifetimes ${codegenContext.symbolProvider.toSymbol(shape).name} $lifetimes\") {\n                    serverBuilderGenerator.renderConvenienceMethod(this)\n                }\n            }\n        }\n\n        if (shape.isReachableFromOperationInput()) {\n            ServerStructureConstrainedTraitImpl(\n                codegenContext.symbolProvider,\n                codegenContext.settings.codegenConfig.publicConstrainedTypes,\n                shape,\n                writer,\n            ).render()\n        }\n\n        if (!codegenContext.settings.codegenConfig.publicConstrainedTypes) {\n            val serverBuilderGeneratorWithoutPublicConstrainedTypes =\n                ServerBuilderGeneratorWithoutPublicConstrainedTypes(\n                    codegenContext,\n                    shape,\n                    validationExceptionConversionGenerator,\n                    protocolGenerator.protocol,\n                )\n            serverBuilderGeneratorWithoutPublicConstrainedTypes.render(rustCrate, writer)\n\n            writer.implBlock(codegenContext.symbolProvider.toSymbol(shape)) {\n                serverBuilderGeneratorWithoutPublicConstrainedTypes.renderConvenienceMethod(this)\n            }\n        }\n    }\n\n    override fun listShape(shape: ListShape) = collectionShape(shape)\n\n    override fun setShape(shape: SetShape) = collectionShape(shape)\n\n    private fun collectionShape(shape: CollectionShape) {\n        val renderUnconstrainedList =\n            shape.isReachableFromOperationInput() &&\n                shape.canReachConstrainedShape(\n                    model,\n                    codegenContext.symbolProvider,\n                )\n        val isDirectlyConstrained = shape.isDirectlyConstrained(codegenContext.symbolProvider)\n\n        if (renderUnconstrainedList) {\n            logger.info(\"[rust-server-codegen] Generating an unconstrained type for collection shape $shape\")\n            rustCrate.withModuleOrWithStructureBuilderModule(\n                ServerRustModule.UnconstrainedModule,\n                shape,\n                codegenContext,\n            ) {\n                UnconstrainedCollectionGenerator(\n                    codegenContext,\n                    rustCrate.createInlineModuleCreator(),\n                    shape,\n                ).render()\n            }\n\n            if (!isDirectlyConstrained) {\n                logger.info(\"[rust-server-codegen] Generating a constrained type for collection shape $shape\")\n                rustCrate.withModuleOrWithStructureBuilderModule(\n                    ServerRustModule.ConstrainedModule,\n                    shape,\n                    codegenContext,\n                ) {\n                    PubCrateConstrainedCollectionGenerator(\n                        codegenContext,\n                        rustCrate.createInlineModuleCreator(),\n                        shape,\n                    ).render()\n                }\n            }\n        }\n\n        val constraintsInfo = CollectionTraitInfo.fromShape(shape, codegenContext.constrainedShapeSymbolProvider)\n        if (isDirectlyConstrained) {\n            rustCrate.withModuleOrWithStructureBuilderModule(ServerRustModule.Model, shape, codegenContext) {\n                ConstrainedCollectionGenerator(\n                    codegenContext,\n                    this,\n                    shape,\n                    constraintsInfo,\n                    if (renderUnconstrainedList) codegenContext.unconstrainedShapeSymbolProvider.toSymbol(shape) else null,\n                ).render()\n            }\n        }\n\n        if (isDirectlyConstrained || renderUnconstrainedList) {\n            rustCrate.withModuleOrWithStructureBuilderModule(ServerRustModule.Model, shape, codegenContext) {\n                CollectionConstraintViolationGenerator(\n                    codegenContext,\n                    rustCrate.createInlineModuleCreator(),\n                    shape, constraintsInfo,\n                    validationExceptionConversionGenerator,\n                ).render()\n            }\n        }\n    }\n\n    override fun mapShape(shape: MapShape) {\n        val renderUnconstrainedMap =\n            shape.isReachableFromOperationInput() &&\n                shape.canReachConstrainedShape(\n                    model,\n                    codegenContext.symbolProvider,\n                )\n        val isDirectlyConstrained = shape.isDirectlyConstrained(codegenContext.symbolProvider)\n\n        if (renderUnconstrainedMap) {\n            logger.info(\"[rust-server-codegen] Generating an unconstrained type for map $shape\")\n            rustCrate.withModuleOrWithStructureBuilderModule(\n                ServerRustModule.UnconstrainedModule,\n                shape,\n                codegenContext,\n            ) {\n                UnconstrainedMapGenerator(\n                    codegenContext,\n                    rustCrate.createInlineModuleCreator(),\n                    shape,\n                ).render()\n            }\n\n            if (!isDirectlyConstrained) {\n                logger.info(\"[rust-server-codegen] Generating a constrained type for map $shape\")\n                rustCrate.withModuleOrWithStructureBuilderModule(\n                    ServerRustModule.ConstrainedModule,\n                    shape,\n                    codegenContext,\n                ) {\n                    PubCrateConstrainedMapGenerator(\n                        codegenContext,\n                        rustCrate.createInlineModuleCreator(),\n                        shape,\n                    ).render()\n                }\n            }\n        }\n\n        if (isDirectlyConstrained) {\n            rustCrate.withModuleOrWithStructureBuilderModule(ServerRustModule.Model, shape, codegenContext) {\n                ConstrainedMapGenerator(\n                    codegenContext,\n                    this,\n                    shape,\n                    if (renderUnconstrainedMap) codegenContext.unconstrainedShapeSymbolProvider.toSymbol(shape) else null,\n                ).render()\n            }\n        }\n\n        if (isDirectlyConstrained || renderUnconstrainedMap) {\n            rustCrate.withModuleOrWithStructureBuilderModule(ServerRustModule.Model, shape, codegenContext) {\n                MapConstraintViolationGenerator(\n                    codegenContext,\n                    rustCrate.createInlineModuleCreator(),\n                    shape,\n                    validationExceptionConversionGenerator,\n                ).render()\n            }\n        }\n    }\n\n    /**\n     * Enum Shape Visitor\n     *\n     * Although raw strings require no code generation, enums are actually [EnumTrait] applied to string shapes.\n     */\n    override fun stringShape(shape: StringShape) {\n        fun serverEnumGeneratorFactory(\n            codegenContext: ServerCodegenContext,\n            shape: StringShape,\n        ) = ServerEnumGenerator(\n            codegenContext,\n            shape,\n            validationExceptionConversionGenerator,\n            codegenDecorator.enumCustomizations(codegenContext, emptyList()),\n        )\n        stringShape(shape, ::serverEnumGeneratorFactory)\n    }\n\n    override fun integerShape(shape: IntegerShape) = integralShape(shape)\n\n    override fun shortShape(shape: ShortShape) = integralShape(shape)\n\n    override fun longShape(shape: LongShape) = integralShape(shape)\n\n    override fun byteShape(shape: ByteShape) = integralShape(shape)\n\n    private fun integralShape(shape: NumberShape) {\n        if (shape.isDirectlyConstrained(codegenContext.symbolProvider)) {\n            logger.info(\"[rust-server-codegen] Generating a constrained integral $shape\")\n            rustCrate.withModuleOrWithStructureBuilderModule(ServerRustModule.Model, shape, codegenContext) {\n                ConstrainedNumberGenerator(\n                    codegenContext, rustCrate.createInlineModuleCreator(),\n                    this,\n                    shape,\n                    validationExceptionConversionGenerator,\n                ).render()\n            }\n        }\n    }\n\n    protected fun stringShape(\n        shape: StringShape,\n        enumShapeGeneratorFactory: (codegenContext: ServerCodegenContext, shape: StringShape) -> EnumGenerator,\n    ) {\n        if (shape.hasTrait<EnumTrait>()) {\n            logger.info(\"[rust-server-codegen] Generating an enum $shape\")\n            rustCrate.useShapeWriterOrUseWithStructureBuilder(shape, codegenContext) {\n                enumShapeGeneratorFactory(codegenContext, shape).render(this)\n                ConstrainedTraitForEnumGenerator(model, codegenContext.symbolProvider, this, shape).render()\n            }\n        }\n\n        if (shape.hasTrait<EnumTrait>() && shape.hasTrait<LengthTrait>()) {\n            logger.warning(\n                \"\"\"\n                String shape $shape has an `enum` trait and the `length` trait. This is valid according to the Smithy\n                IDL v1 spec, but it's unclear what the semantics are. In any case, the Smithy core libraries should enforce the\n                constraints (which it currently does not), not each code generator.\n                See https://github.com/awslabs/smithy/issues/1121f for more information.\n                \"\"\".trimIndent().replace(\"\\n\", \" \"),\n            )\n        } else if (!shape.hasTrait<EnumTrait>() && shape.isDirectlyConstrained(codegenContext.symbolProvider)) {\n            logger.info(\"[rust-server-codegen] Generating a constrained string $shape\")\n            rustCrate.withModuleOrWithStructureBuilderModule(ServerRustModule.Model, shape, codegenContext) {\n                ConstrainedStringGenerator(\n                    codegenContext,\n                    rustCrate.createInlineModuleCreator(),\n                    this,\n                    shape,\n                    validationExceptionConversionGenerator,\n                ).render()\n            }\n        }\n    }\n\n    /**\n     * Union Shape Visitor\n     *\n     * Generate an `enum` for union shapes.\n     *\n     * This function _does not_ generate any serializers.\n     */\n    override fun unionShape(shape: UnionShape) {\n        logger.info(\"[rust-server-codegen] Generating an union shape $shape\")\n        rustCrate.useShapeWriter(shape) {\n            UnionGenerator(model, codegenContext.symbolProvider, this, shape, renderUnknownVariant = false).render()\n        }\n\n        if (shape.isReachableFromOperationInput() &&\n            shape.canReachConstrainedShape(\n                model,\n                codegenContext.symbolProvider,\n            )\n        ) {\n            logger.info(\"[rust-server-codegen] Generating an unconstrained type for union shape $shape\")\n            rustCrate.withModule(ServerRustModule.UnconstrainedModule) modelsModuleWriter@{\n                UnconstrainedUnionGenerator(\n                    codegenContext,\n                    rustCrate.createInlineModuleCreator(),\n                    this@modelsModuleWriter,\n                    shape,\n                    validationExceptionConversionGenerator,\n                ).render()\n            }\n        }\n\n        if (shape.isEventStream()) {\n            rustCrate.withModule(ServerRustModule.Error) {\n                ServerOperationErrorGenerator(model, codegenContext.symbolProvider, shape).render(this)\n            }\n        }\n    }\n\n    /**\n     * Generate protocol tests. This method can be overridden by other languages such as Python.\n     */\n    open fun protocolTestsForOperation(\n        writer: RustWriter,\n        shape: OperationShape,\n    ) {\n        codegenDecorator.protocolTestGenerator(\n            codegenContext,\n            ServerProtocolTestGenerator(\n                codegenContext,\n                protocolGeneratorFactory.support(),\n                shape,\n            ),\n        ).render(writer)\n    }\n\n    /**\n     * Generate service-specific code for the model:\n     * - Serializers\n     * - Deserializers\n     * - Fluent client\n     * - Trait implementations\n     * - Protocol tests\n     * - Operation structures\n     */\n    override fun serviceShape(shape: ServiceShape) {\n        logger.info(\"[rust-server-codegen] Generating a service $shape\")\n        val serverProtocol = protocolGeneratorFactory.protocol(codegenContext) as ServerProtocol\n\n        val configMethods = codegenDecorator.configMethods(codegenContext)\n        val isConfigBuilderFallible = configMethods.isBuilderFallible()\n\n        // Generate root.\n        rustCrate.lib {\n            ServerRootGenerator(\n                serverProtocol,\n                codegenContext,\n                isConfigBuilderFallible,\n            ).render(this)\n        }\n\n        // Generate server re-exports.\n        rustCrate.withModule(ServerRustModule.Server) {\n            ServerRuntimeTypesReExportsGenerator(codegenContext).render(this)\n        }\n\n        // Generate service module.\n        rustCrate.withModule(ServerRustModule.Service) {\n            ServerServiceGenerator(\n                codegenContext,\n                serverProtocol,\n                isConfigBuilderFallible,\n            ).render(this)\n\n            ServiceConfigGenerator(codegenContext, configMethods).render(this)\n\n            ScopeMacroGenerator(codegenContext).render(this)\n        }\n\n        codegenDecorator.postprocessServiceGenerateAdditionalStructures(shape)\n            .forEach { structureShape -> this.structureShape(structureShape) }\n    }\n\n    /**\n     * For each operation shape generate:\n     *  - Operations ser/de\n     *  - Errors via `ServerOperationErrorGenerator`\n     *  - OperationShapes via `ServerOperationGenerator`\n     *  - Additional structure shapes via `postprocessGenerateAdditionalStructures`\n     */\n    override fun operationShape(shape: OperationShape) {\n        // Generate errors.\n        rustCrate.withModule(ServerRustModule.Error) {\n            ServerOperationErrorGenerator(model, codegenContext.symbolProvider, shape).render(this)\n        }\n\n        // Generate operation shapes.\n        rustCrate.withModule(ServerRustModule.OperationShape) {\n            ServerOperationGenerator(shape, codegenContext).render(this)\n        }\n\n        // Generate operations ser/de.\n        rustCrate.withModule(ServerRustModule.Operation) {\n            protocolGenerator.renderOperation(this, shape)\n        }\n\n        codegenDecorator.postprocessOperationGenerateAdditionalStructures(shape)\n            .forEach { structureShape -> this.structureShape(structureShape) }\n\n        // Generate protocol tests.\n        rustCrate.withModule(ServerRustModule.Operation) {\n            protocolTestsForOperation(this, shape)\n        }\n    }\n\n    override fun blobShape(shape: BlobShape) {\n        logger.info(\"[rust-server-codegen] Generating a service $shape\")\n        if (shape.hasEventStreamMember(model)) {\n            return super.blobShape(shape)\n        }\n\n        if (shape.isDirectlyConstrained(codegenContext.symbolProvider)) {\n            rustCrate.withModuleOrWithStructureBuilderModule(ServerRustModule.Model, shape, codegenContext) {\n                ConstrainedBlobGenerator(\n                    codegenContext,\n                    rustCrate.createInlineModuleCreator(),\n                    this,\n                    shape,\n                    validationExceptionConversionGenerator,\n                ).render()\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ServerReservedWords.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy\n\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustReservedWordConfig\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.StructureGenerator\n\nval ServerReservedWords =\n    RustReservedWordConfig(\n        structureMemberMap = StructureGenerator.structureMemberNameMap,\n        unionMemberMap = emptyMap(),\n        enumMemberMap = emptyMap(),\n    )\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ServerRuntimeType.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy\n\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\n\n/**\n * Object used *exclusively* in the runtime of the server, for separation concerns.\n * Analogous to the companion object in [RuntimeType]; see its documentation for details.\n * For a runtime type that is used in the client, or in both the client and the server, use [RuntimeType] directly.\n */\nobject ServerRuntimeType {\n    fun router(runtimeConfig: RuntimeConfig) =\n        ServerCargoDependency.smithyHttpServer(runtimeConfig).toType().resolve(\"routing::Router\")\n\n    fun protocol(\n        name: String,\n        path: String,\n        runtimeConfig: RuntimeConfig,\n    ) = ServerCargoDependency.smithyHttpServer(runtimeConfig).toType().resolve(\"protocol::$path::$name\")\n\n    fun protocol(runtimeConfig: RuntimeConfig) = protocol(\"Protocol\", \"\", runtimeConfig)\n}\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ServerRustModule.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy\n\nimport software.amazon.smithy.codegen.core.Symbol\nimport software.amazon.smithy.model.knowledge.TopDownIndex\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.shapes.UnionShape\nimport software.amazon.smithy.model.traits.ErrorTrait\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustModule\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustReservedWords\nimport software.amazon.smithy.rust.codegen.core.rustlang.Visibility\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.docs\nimport software.amazon.smithy.rust.codegen.core.rustlang.escape\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.ModuleDocProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.ModuleProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.ModuleProviderContext\nimport software.amazon.smithy.rust.codegen.core.smithy.module\nimport software.amazon.smithy.rust.codegen.core.smithy.traits.SyntheticInputTrait\nimport software.amazon.smithy.rust.codegen.core.smithy.traits.SyntheticOutputTrait\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\nimport software.amazon.smithy.rust.codegen.core.util.toSnakeCase\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.DocHandlerGenerator\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.handlerImports\n\nobject ServerRustModule {\n    val root = RustModule.LibRs\n\n    val Error = RustModule.public(\"error\")\n    val Operation = RustModule.public(\"operation\")\n    val OperationShape = RustModule.public(\"operation_shape\")\n    val Model = RustModule.public(\"model\")\n    val Input = RustModule.public(\"input\")\n    val Output = RustModule.public(\"output\")\n    val Types = RustModule.public(\"types\")\n    val Service = RustModule.private(\"service\")\n    val Server = RustModule.public(\"server\", inline = true)\n\n    val UnconstrainedModule =\n        software.amazon.smithy.rust.codegen.core.smithy.UnconstrainedModule\n    val ConstrainedModule =\n        software.amazon.smithy.rust.codegen.core.smithy.ConstrainedModule\n}\n\nclass ServerModuleDocProvider(private val codegenContext: ServerCodegenContext) : ModuleDocProvider {\n    override fun docsWriter(module: RustModule.LeafModule): Writable? {\n        val strDoc: (String) -> Writable = { str -> writable { docs(escape(str)) } }\n        return when (module) {\n            ServerRustModule.Error -> strDoc(\"All error types that operations can return. Documentation on these types is copied from the model.\")\n            ServerRustModule.Operation -> strDoc(\"All operations that this crate can perform.\")\n            ServerRustModule.OperationShape -> operationShapeModuleDoc()\n            ServerRustModule.Model -> strDoc(\"Data structures used by operation inputs/outputs. Documentation on these types is copied from the model.\")\n            ServerRustModule.Input -> strDoc(\"Input structures for operations. Documentation on these types is copied from the model.\")\n            ServerRustModule.Output -> strDoc(\"Output structures for operations. Documentation on these types is copied from the model.\")\n            ServerRustModule.Types -> strDoc(\"Data primitives referenced by other data types.\")\n            ServerRustModule.Server -> strDoc(\"Contains the types that are re-exported from the `aws-smithy-http-server` crate.\")\n            ServerRustModule.UnconstrainedModule -> strDoc(\"Unconstrained types for constrained shapes.\")\n            ServerRustModule.ConstrainedModule -> strDoc(\"Constrained types for constrained shapes.\")\n            else -> TODO(\"Document this module: $module\")\n        }\n    }\n\n    private fun operationShapeModuleDoc(): Writable =\n        writable {\n            val index = TopDownIndex.of(codegenContext.model)\n            val operations = index.getContainedOperations(codegenContext.serviceShape).toSortedSet(compareBy { it.id })\n\n            val firstOperation = operations.first() ?: return@writable\n            val crateName = codegenContext.settings.moduleName.toSnakeCase()\n\n            rustTemplate(\n                \"\"\"\n                /// A collection of types representing each operation defined in the service closure.\n                ///\n                /// The [plugin system](#{SmithyHttpServer}::plugin) makes use of these\n                /// [zero-sized types](https://doc.rust-lang.org/nomicon/exotic-sizes.html##zero-sized-types-zsts) (ZSTs) to\n                /// parameterize [`Plugin`](#{SmithyHttpServer}::plugin::Plugin) implementations. Their traits, such as\n                /// [`OperationShape`](#{SmithyHttpServer}::operation::OperationShape), can be used to provide\n                /// operation specific information to the [`Layer`](#{Tower}::Layer) being applied.\n                \"\"\".trimIndent(),\n                \"SmithyHttpServer\" to\n                    ServerCargoDependency.smithyHttpServer(codegenContext.runtimeConfig).toType(),\n                \"Tower\" to ServerCargoDependency.Tower.toType(),\n                \"Handler\" to DocHandlerGenerator(codegenContext, firstOperation, \"handler\", commentToken = \"///\").docSignature(),\n                \"HandlerImports\" to handlerImports(crateName, operations, commentToken = \"///\"),\n            )\n        }\n}\n\nobject ServerModuleProvider : ModuleProvider {\n    override fun moduleForShape(\n        context: ModuleProviderContext,\n        shape: Shape,\n    ): RustModule.LeafModule =\n        when (shape) {\n            is OperationShape -> ServerRustModule.Operation\n            is StructureShape ->\n                when {\n                    shape.hasTrait<ErrorTrait>() -> ServerRustModule.Error\n                    shape.hasTrait<SyntheticInputTrait>() -> ServerRustModule.Input\n                    shape.hasTrait<SyntheticOutputTrait>() -> ServerRustModule.Output\n                    else -> ServerRustModule.Model\n                }\n            else -> ServerRustModule.Model\n        }\n\n    override fun moduleForOperationError(\n        context: ModuleProviderContext,\n        operation: OperationShape,\n    ): RustModule.LeafModule = ServerRustModule.Error\n\n    override fun moduleForEventStreamError(\n        context: ModuleProviderContext,\n        eventStream: UnionShape,\n    ): RustModule.LeafModule = ServerRustModule.Error\n\n    override fun moduleForBuilder(\n        context: ModuleProviderContext,\n        shape: Shape,\n        symbol: Symbol,\n    ): RustModule.LeafModule {\n        val pubCrate = !(context.settings as ServerRustSettings).codegenConfig.publicConstrainedTypes\n        val builderNamespace =\n            RustReservedWords.escapeIfNeeded(symbol.name.toSnakeCase()) +\n                if (pubCrate) {\n                    \"_internal\"\n                } else {\n                    \"\"\n                }\n        val visibility =\n            when (pubCrate) {\n                true -> Visibility.PUBCRATE\n                false -> Visibility.PUBLIC\n            }\n        return RustModule.new(\n            builderNamespace,\n            visibility,\n            parent = symbol.module(),\n            inline = true,\n            documentationOverride = \"\",\n        )\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ServerRustSettings.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy\n\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.node.ObjectNode\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.rust.codegen.core.smithy.CODEGEN_SETTINGS\nimport software.amazon.smithy.rust.codegen.core.smithy.CoreCodegenConfig\nimport software.amazon.smithy.rust.codegen.core.smithy.CoreRustSettings\nimport software.amazon.smithy.rust.codegen.core.smithy.HttpVersion\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig\nimport java.util.Optional\n\n/*\n * [ServerRustSettings] and [ServerCodegenConfig] classes.\n *\n * These classes are entirely analogous to [ClientRustSettings] and [ClientCodegenConfig]. Refer to the documentation\n * for those.\n *\n * These classes have to live in the `codegen` subproject because they are referenced in [ServerCodegenContext],\n * which is used in common generators to both client and server.\n */\n\n/**\n * Settings used by [RustServerCodegenPlugin].\n */\ndata class ServerRustSettings(\n    override val service: ShapeId,\n    override val moduleName: String,\n    override val moduleVersion: String,\n    override val moduleAuthors: List<String>,\n    override val moduleDescription: String?,\n    override val moduleRepository: String?,\n    override val runtimeConfig: RuntimeConfig,\n    override val codegenConfig: ServerCodegenConfig,\n    override val license: String?,\n    override val examplesUri: String?,\n    override val minimumSupportedRustVersion: String? = null,\n    override val customizationConfig: ObjectNode?,\n) : CoreRustSettings(\n        service,\n        moduleName,\n        moduleVersion,\n        moduleAuthors,\n        moduleDescription,\n        moduleRepository,\n        runtimeConfig,\n        codegenConfig,\n        license,\n        examplesUri,\n        minimumSupportedRustVersion,\n        customizationConfig,\n    ) {\n    companion object {\n        fun from(\n            model: Model,\n            config: ObjectNode,\n        ): ServerRustSettings {\n            val coreRustSettings = CoreRustSettings.from(model, config)\n            val codegenSettingsNode = config.getObjectMember(CODEGEN_SETTINGS)\n            val coreCodegenConfig = CoreCodegenConfig.fromNode(codegenSettingsNode)\n\n            // Create ServerCodegenConfig first to read the http-1x flag\n            val serverCodegenConfig = ServerCodegenConfig.fromCodegenConfigAndNode(coreCodegenConfig, codegenSettingsNode)\n\n            // Use the http1x field from ServerCodegenConfig to set RuntimeConfig httpVersion\n            // This must be done because RuntimeConfig is created in CoreRustSettings.from()\n            // before we have access to the http-1x flag\n            val httpVersion = if (serverCodegenConfig.http1x) HttpVersion.Http1x else HttpVersion.Http0x\n            val runtimeConfig = coreRustSettings.runtimeConfig.copy(httpVersion = httpVersion)\n\n            return ServerRustSettings(\n                service = coreRustSettings.service,\n                moduleName = coreRustSettings.moduleName,\n                moduleVersion = coreRustSettings.moduleVersion,\n                moduleAuthors = coreRustSettings.moduleAuthors,\n                moduleDescription = coreRustSettings.moduleDescription,\n                moduleRepository = coreRustSettings.moduleRepository,\n                runtimeConfig = runtimeConfig,\n                codegenConfig = serverCodegenConfig,\n                license = coreRustSettings.license,\n                examplesUri = coreRustSettings.examplesUri,\n                minimumSupportedRustVersion = coreRustSettings.minimumSupportedRustVersion,\n                customizationConfig = coreRustSettings.customizationConfig,\n            )\n        }\n    }\n}\n\n/**\n * [publicConstrainedTypes]: Generate constrained wrapper newtypes for constrained shapes\n * [ignoreUnsupportedConstraints]: Generate model even though unsupported constraints are present\n * [http1x]: Enable HTTP 1.x support (hyper 1.x and http 1.x types)\n */\ndata class ServerCodegenConfig(\n    override val formatTimeoutSeconds: Int = DEFAULT_FORMAT_TIMEOUT_SECONDS,\n    override val debugMode: Boolean = DEFAULT_DEBUG_MODE,\n    val publicConstrainedTypes: Boolean = DEFAULT_PUBLIC_CONSTRAINED_TYPES,\n    val ignoreUnsupportedConstraints: Boolean = DEFAULT_IGNORE_UNSUPPORTED_CONSTRAINTS,\n    /**\n     * A flag to enable _experimental_ support for custom validation exceptions via the\n     * [CustomValidationExceptionWithReasonDecorator] decorator.\n     * TODO(https://github.com/smithy-lang/smithy-rs/pull/2053): this will go away once we implement the RFC, when users will be\n     *  able to define the converters in their Rust application code.\n     */\n    val experimentalCustomValidationExceptionWithReasonPleaseDoNotUse: String? = defaultExperimentalCustomValidationExceptionWithReasonPleaseDoNotUse,\n    /**\n     * @deprecated This flag is deprecated. `smithy.framework#ValidationException` is now automatically added to operations\n     * with constrained inputs unless a custom validation exception (a structure with the `@validationException`\n     * trait) is defined in the model. Setting this to false will disable the automatic addition, but this\n     * behavior is deprecated and may be removed in a future release.\n     */\n    val addValidationExceptionToConstrainedOperations: Boolean? = null,\n    val alwaysSendEventStreamInitialResponse: Boolean = DEFAULT_SEND_EVENT_STREAM_INITIAL_RESPONSE,\n    val http1x: Boolean = DEFAULT_HTTP_1X,\n) : CoreCodegenConfig(\n        formatTimeoutSeconds, debugMode,\n    ) {\n    companion object {\n        private const val DEFAULT_PUBLIC_CONSTRAINED_TYPES = true\n        private const val DEFAULT_IGNORE_UNSUPPORTED_CONSTRAINTS = false\n        private val defaultExperimentalCustomValidationExceptionWithReasonPleaseDoNotUse = null\n        private const val DEFAULT_SEND_EVENT_STREAM_INITIAL_RESPONSE = false\n        const val DEFAULT_HTTP_1X = false\n\n        /**\n         * Configuration key for the HTTP 1.x flag.\n         *\n         * When set to true in codegen configuration, generates code that uses http@1.x/hyper@1.x\n         * instead of http@0.2.x/hyper@0.14.x.\n         *\n         * **Usage:**\n         * - Use this constant when reading/writing the codegen configuration\n         * - Use this constant in test utilities that set configuration (e.g., ServerCodegenIntegrationTest)\n         *\n         * **Do NOT use this constant for:**\n         * - External crate feature names (e.g., `smithyRuntimeApi.withFeature(\"http-1x\")`)\n         *   Those feature names are defined by the external crates and may change independently\n         * - Cargo.toml feature names unless they are explicitly defined by us to match this value\n         */\n        const val HTTP_1X_CONFIG_KEY = \"http-1x\"\n\n        private val KNOWN_CONFIG_KEYS =\n            setOf(\n                \"formatTimeoutSeconds\",\n                \"debugMode\",\n                \"publicConstrainedTypes\",\n                \"ignoreUnsupportedConstraints\",\n                \"experimentalCustomValidationExceptionWithReasonPleaseDoNotUse\",\n                \"addValidationExceptionToConstrainedOperations\",\n                \"alwaysSendEventStreamInitialResponse\",\n                HTTP_1X_CONFIG_KEY,\n            )\n\n        fun fromCodegenConfigAndNode(\n            coreCodegenConfig: CoreCodegenConfig,\n            node: Optional<ObjectNode>,\n        ) = if (node.isPresent) {\n            // Validate that all config keys are known\n            val configNode = node.get()\n            val unknownKeys = configNode.members.keys.map { it.toString() }.filter { it !in KNOWN_CONFIG_KEYS }\n            if (unknownKeys.isNotEmpty()) {\n                throw IllegalArgumentException(\n                    \"Unknown codegen configuration key(s): ${unknownKeys.joinToString(\", \")}. \" +\n                        \"Known keys are: ${KNOWN_CONFIG_KEYS.joinToString(\", \")}. \",\n                )\n            }\n\n            ServerCodegenConfig(\n                formatTimeoutSeconds = coreCodegenConfig.formatTimeoutSeconds,\n                debugMode = coreCodegenConfig.debugMode,\n                publicConstrainedTypes =\n                    node.get()\n                        .getBooleanMemberOrDefault(\"publicConstrainedTypes\", DEFAULT_PUBLIC_CONSTRAINED_TYPES),\n                ignoreUnsupportedConstraints =\n                    node.get()\n                        .getBooleanMemberOrDefault(\n                            \"ignoreUnsupportedConstraints\",\n                            DEFAULT_IGNORE_UNSUPPORTED_CONSTRAINTS,\n                        ),\n                experimentalCustomValidationExceptionWithReasonPleaseDoNotUse =\n                    node.get().getStringMemberOrDefault(\n                        \"experimentalCustomValidationExceptionWithReasonPleaseDoNotUse\",\n                        defaultExperimentalCustomValidationExceptionWithReasonPleaseDoNotUse,\n                    ),\n                addValidationExceptionToConstrainedOperations =\n                    node.get().getBooleanMember(\n                        \"addValidationExceptionToConstrainedOperations\",\n                    ).orElse(null)?.value,\n                alwaysSendEventStreamInitialResponse =\n                    node.get().getBooleanMemberOrDefault(\n                        \"alwaysSendEventStreamInitialResponse\",\n                        DEFAULT_SEND_EVENT_STREAM_INITIAL_RESPONSE,\n                    ),\n                http1x =\n                    node.get().getBooleanMemberOrDefault(\n                        HTTP_1X_CONFIG_KEY,\n                        DEFAULT_HTTP_1X,\n                    ),\n            )\n        } else {\n            ServerCodegenConfig(\n                formatTimeoutSeconds = coreCodegenConfig.formatTimeoutSeconds,\n                debugMode = coreCodegenConfig.debugMode,\n            )\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ServerSymbolProviders.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy\n\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.ServiceShape\nimport software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProviderConfig\nimport software.amazon.smithy.rust.codegen.server.smithy.customize.ServerCodegenDecorator\n\ntypealias BaseSymbolProviderFactory =\n    (settings: ServerRustSettings, model: Model, service: ServiceShape, rustSymbolProviderConfig: RustSymbolProviderConfig, publicConstrainedTypes: Boolean, includeConstraintShapeProvider: Boolean, codegenDecorator: ServerCodegenDecorator) -> RustSymbolProvider\n\n/**\n * Just a handy class to centralize initialization all the symbol providers required by the server code generators, to\n * make the init blocks of the codegen visitors ([ServerCodegenVisitor] and [PythonServerCodegenVisitor]), and the\n * unit test setup code, shorter and DRYer.\n */\nclass ServerSymbolProviders private constructor(\n    val symbolProvider: RustSymbolProvider,\n    val unconstrainedShapeSymbolProvider: UnconstrainedShapeSymbolProvider,\n    val constrainedShapeSymbolProvider: RustSymbolProvider,\n    val constraintViolationSymbolProvider: ConstraintViolationSymbolProvider,\n    val pubCrateConstrainedShapeSymbolProvider: PubCrateConstrainedShapeSymbolProvider,\n) {\n    companion object {\n        fun from(\n            settings: ServerRustSettings,\n            model: Model,\n            service: ServiceShape,\n            rustSymbolProviderConfig: RustSymbolProviderConfig,\n            publicConstrainedTypes: Boolean,\n            codegenDecorator: ServerCodegenDecorator,\n            baseSymbolProviderFactory: BaseSymbolProviderFactory,\n        ): ServerSymbolProviders {\n            val baseSymbolProvider =\n                baseSymbolProviderFactory(settings, model, service, rustSymbolProviderConfig, publicConstrainedTypes, publicConstrainedTypes, codegenDecorator)\n            return ServerSymbolProviders(\n                symbolProvider = baseSymbolProvider,\n                constrainedShapeSymbolProvider =\n                    baseSymbolProviderFactory(\n                        settings,\n                        model,\n                        service,\n                        rustSymbolProviderConfig,\n                        publicConstrainedTypes,\n                        true,\n                        codegenDecorator,\n                    ),\n                unconstrainedShapeSymbolProvider =\n                    UnconstrainedShapeSymbolProvider(\n                        baseSymbolProviderFactory(\n                            settings,\n                            model,\n                            service,\n                            rustSymbolProviderConfig,\n                            false,\n                            false,\n                            codegenDecorator,\n                        ),\n                        publicConstrainedTypes, service,\n                    ),\n                pubCrateConstrainedShapeSymbolProvider =\n                    PubCrateConstrainedShapeSymbolProvider(\n                        baseSymbolProvider,\n                        service,\n                    ),\n                constraintViolationSymbolProvider =\n                    ConstraintViolationSymbolProvider(\n                        baseSymbolProvider,\n                        publicConstrainedTypes,\n                        service,\n                    ),\n            )\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/UnconstrainedShapeSymbolProvider.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy\n\nimport software.amazon.smithy.codegen.core.Symbol\nimport software.amazon.smithy.model.knowledge.NullableIndex\nimport software.amazon.smithy.model.shapes.CollectionShape\nimport software.amazon.smithy.model.shapes.MapShape\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.ServiceShape\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.shapes.StringShape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.shapes.UnionShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustModule\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustReservedWords\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustType\nimport software.amazon.smithy.rust.codegen.core.rustlang.Visibility\nimport software.amazon.smithy.rust.codegen.core.smithy.Default\nimport software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.WrappingSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.contextName\nimport software.amazon.smithy.rust.codegen.core.smithy.handleOptionality\nimport software.amazon.smithy.rust.codegen.core.smithy.handleRustBoxing\nimport software.amazon.smithy.rust.codegen.core.smithy.locatedIn\nimport software.amazon.smithy.rust.codegen.core.smithy.rustType\nimport software.amazon.smithy.rust.codegen.core.smithy.setDefault\nimport software.amazon.smithy.rust.codegen.core.smithy.symbolBuilder\nimport software.amazon.smithy.rust.codegen.core.util.toPascalCase\nimport software.amazon.smithy.rust.codegen.core.util.toSnakeCase\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.serverBuilderSymbol\n\n/**\n * The [UnconstrainedShapeSymbolProvider] returns, _for a given constrained\n * shape_, a symbol whose Rust type can hold the corresponding unconstrained\n * values.\n *\n * For collection and map shapes, this type is a [RustType.Opaque] wrapper\n * tuple newtype holding a container over the inner unconstrained type. For\n * structure shapes, it's their builder type. For union shapes, it's an enum\n * whose variants are the corresponding unconstrained variants. For simple\n * shapes, it's whatever the regular base symbol provider returns.\n *\n * So, for example, given the following model:\n *\n * ```smithy\n * list ListA {\n *     member: ListB\n * }\n *\n * list ListB {\n *     member: Structure\n * }\n *\n * structure Structure {\n *     @required\n *     string: String\n * }\n * ```\n *\n * `ListB` is not _directly_ constrained, but it is constrained, because it\n * holds `Structure`s, that are constrained. So the corresponding unconstrained\n * symbol has Rust type `struct\n * ListBUnconstrained(std::vec::Vec<crate::model::structure::Builder>)`.\n * Likewise, `ListA` is also constrained. Its unconstrained symbol has Rust\n * type `struct ListAUnconstrained(std::vec::Vec<ListBUnconstrained>)`.\n *\n * For an _unconstrained_ shape and for simple shapes, this symbol provider\n * delegates to the base symbol provider. It is therefore important that this\n * symbol provider _not_ wrap [PublicConstrainedShapeSymbolProvider] (from the\n * `codegen-server` subproject), because that symbol provider will return a\n * constrained type for shapes that have constraint traits attached.\n */\nclass UnconstrainedShapeSymbolProvider(\n    private val base: RustSymbolProvider,\n    private val publicConstrainedTypes: Boolean,\n    private val serviceShape: ServiceShape,\n) : WrappingSymbolProvider(base) {\n    private val nullableIndex = NullableIndex.of(model)\n\n    /**\n     * Unconstrained type names are always suffixed with `Unconstrained` for clarity, even though we could dispense with it\n     * given that they all live inside the `unconstrained` module, so they don't collide with the constrained types.\n     */\n    private fun unconstrainedTypeNameForCollectionOrMapOrUnionShape(shape: Shape): String {\n        check(shape is CollectionShape || shape is MapShape || shape is UnionShape)\n        // Normally, one could use the base symbol provider's name. However, in this case, the name will be `Vec` or\n        // `HashMap` because the symbol provider _does not_ newtype the shapes. However, for unconstrained shapes,\n        // we need to introduce a newtype that preserves the original name of the shape from smithy. To handle that,\n        // we load the name of the shape directly from the model prior to add `Unconstrained`.\n        return RustReservedWords.escapeIfNeeded(shape.contextName(serviceShape).toPascalCase() + \"Unconstrained\")\n    }\n\n    private fun unconstrainedSymbolForCollectionOrMapOrUnionShape(shape: Shape): Symbol {\n        check(shape is CollectionShape || shape is MapShape || shape is UnionShape)\n\n        val name = unconstrainedTypeNameForCollectionOrMapOrUnionShape(shape)\n        val parent = shape.getParentAndInlineModuleForConstrainedMember(this, publicConstrainedTypes)?.second ?: ServerRustModule.UnconstrainedModule\n\n        val module =\n            RustModule.new(\n                RustReservedWords.escapeIfNeeded(name.toSnakeCase()),\n                visibility = Visibility.PUBCRATE,\n                parent = parent,\n                inline = true,\n            )\n        val rustType = RustType.Opaque(name, module.fullyQualifiedPath())\n        return Symbol.builder()\n            .rustType(rustType)\n            .name(rustType.name)\n            .locatedIn(module)\n            .build()\n    }\n\n    override fun toSymbol(shape: Shape): Symbol =\n        when (shape) {\n            is CollectionShape -> {\n                if (shape.canReachConstrainedShape(model, base)) {\n                    unconstrainedSymbolForCollectionOrMapOrUnionShape(shape)\n                } else {\n                    base.toSymbol(shape)\n                }\n            }\n\n            is MapShape -> {\n                if (shape.canReachConstrainedShape(model, base)) {\n                    unconstrainedSymbolForCollectionOrMapOrUnionShape(shape)\n                } else {\n                    base.toSymbol(shape)\n                }\n            }\n\n            is StructureShape -> {\n                if (shape.canReachConstrainedShape(model, base)) {\n                    shape.serverBuilderSymbol(base, !publicConstrainedTypes)\n                } else {\n                    base.toSymbol(shape)\n                }\n            }\n\n            is UnionShape -> {\n                if (shape.canReachConstrainedShape(model, base)) {\n                    unconstrainedSymbolForCollectionOrMapOrUnionShape(shape)\n                } else {\n                    base.toSymbol(shape)\n                }\n            }\n\n            is MemberShape -> {\n                // There are only two cases where we use this symbol provider on a member shape.\n                //\n                // 1. When generating deserializers for HTTP-bound member shapes. See, for example:\n                //     * how [HttpBindingGenerator] generates deserializers for a member shape with the `httpPrefixHeaders`\n                //       trait targeting a map shape of string keys and values; or\n                //     * how [ServerHttpBoundProtocolGenerator] deserializes for a member shape with the `httpQuery`\n                //       trait targeting a collection shape that can reach a constrained shape.\n                //\n                // 2. When generating members for unconstrained unions. See [UnconstrainedUnionGenerator].\n                if (shape.targetCanReachConstrainedShape(model, base)) {\n                    val targetShape = model.expectShape(shape.target)\n                    val targetSymbol = this.toSymbol(targetShape)\n                    // Handle boxing first, so we end up with `Option<Box<_>>`, not `Box<Option<_>>`.\n                    handleOptionality(\n                        handleRustBoxing(targetSymbol, shape),\n                        shape,\n                        nullableIndex,\n                        base.config.nullabilityCheckMode,\n                    )\n                } else {\n                    base.toSymbol(shape)\n                }\n                // TODO(https://github.com/smithy-lang/smithy-rs/issues/1401) Constraint traits on member shapes are not\n                //  implemented yet.\n            }\n\n            is StringShape -> {\n                if (shape.canReachConstrainedShape(model, base)) {\n                    symbolBuilder(shape, RustType.String).setDefault(Default.RustDefault).build()\n                } else {\n                    base.toSymbol(shape)\n                }\n            }\n\n            else -> base.toSymbol(shape)\n        }\n}\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/UniqueItemsTraitValidationErrorMessage.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy\n\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.traits.UniqueItemsTrait\n\nfun UniqueItemsTrait.validationErrorMessage() =\n    // We're using the `Debug` representation of `Vec<usize>` here e.g. `[0, 2, 3]`, which is the exact format we need\n    // to match the expected format of the error message in the protocol tests.\n    \"Value with repeated values at indices {:?} at '{}' failed to satisfy constraint: Member must have unique values\"\n\nfun UniqueItemsTrait.shapeConstraintViolationDisplayMessage(shape: Shape) =\n    \"\"\"\n    Value with repeated values at indices {:?} provided for '${shape.id}' \n    failed to satisfy constraint: Member must have unique values\n    \"\"\".trimIndent().replace(\"\\n\", \"\")\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ValidateUnsupportedConstraints.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy\n\nimport software.amazon.smithy.framework.rust.ValidationExceptionTrait\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.BlobShape\nimport software.amazon.smithy.model.shapes.ByteShape\nimport software.amazon.smithy.model.shapes.EnumShape\nimport software.amazon.smithy.model.shapes.IntegerShape\nimport software.amazon.smithy.model.shapes.ListShape\nimport software.amazon.smithy.model.shapes.LongShape\nimport software.amazon.smithy.model.shapes.MapShape\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.ServiceShape\nimport software.amazon.smithy.model.shapes.SetShape\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.model.shapes.ShortShape\nimport software.amazon.smithy.model.traits.LengthTrait\nimport software.amazon.smithy.model.traits.RangeTrait\nimport software.amazon.smithy.model.traits.StreamingTrait\nimport software.amazon.smithy.model.traits.Trait\nimport software.amazon.smithy.model.traits.UniqueItemsTrait\nimport software.amazon.smithy.rust.codegen.core.smithy.DirectedWalker\nimport software.amazon.smithy.rust.codegen.core.smithy.traits.SyntheticEventStreamUnionTrait\nimport software.amazon.smithy.rust.codegen.core.util.expectTrait\nimport software.amazon.smithy.rust.codegen.core.util.hasEventStreamMember\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\nimport software.amazon.smithy.rust.codegen.core.util.inputShape\nimport software.amazon.smithy.rust.codegen.core.util.orNull\nimport java.util.logging.Level\nimport java.util.stream.Collectors\n\nprivate sealed class UnsupportedConstraintMessageKind {\n    private val constraintTraitsUberIssue = \"https://github.com/smithy-lang/smithy-rs/issues/1401\"\n\n    fun intoLogMessage(ignoreUnsupportedConstraints: Boolean): LogMessage {\n        fun buildMessage(\n            intro: String,\n            willSupport: Boolean,\n            trackingIssue: String? = null,\n            canBeIgnored: Boolean = true,\n        ): String {\n            var msg = \"\"\"\n                $intro\n                    This is not supported in the smithy-rs server SDK.\"\"\"\n            if (willSupport) {\n                msg += \"\"\"\n                    It will be supported in the future.\"\"\"\n            }\n            if (trackingIssue != null) {\n                msg += \"\"\"\n                    For more information, and to report if you're affected by this, please use the tracking issue: $trackingIssue.\"\"\"\n            }\n            if (canBeIgnored) {\n                msg += \"\"\"\n                    If you want to go ahead and generate the server SDK ignoring unsupported constraint traits, set the key `ignoreUnsupportedConstraints`\n                    inside the `runtimeConfig.codegen` JSON object in your `smithy-build.json` to `true`.\"\"\"\n            }\n            return msg.trimIndent().replace(\"\\n\", \" \")\n        }\n\n        fun buildMessageShapeHasUnsupportedConstraintTrait(\n            shape: Shape,\n            constraintTrait: Trait,\n            trackingIssue: String,\n            willSupport: Boolean = true,\n        ) = buildMessage(\n            \"The ${shape.type} shape `${shape.id}` has the constraint trait `${constraintTrait.toShapeId()}` attached.\",\n            willSupport,\n            trackingIssue,\n        )\n\n        val level = if (ignoreUnsupportedConstraints) Level.WARNING else Level.SEVERE\n\n        return when (this) {\n            is UnsupportedConstraintOnMemberShape ->\n                LogMessage(\n                    level,\n                    buildMessageShapeHasUnsupportedConstraintTrait(shape, constraintTrait, constraintTraitsUberIssue),\n                )\n\n            is UnsupportedConstraintOnShapeReachableViaAnEventStream ->\n                LogMessage(\n                    Level.SEVERE,\n                    buildMessage(\n                        \"\"\"\n                        The ${shape.type} shape `${shape.id}` has the constraint trait `${constraintTrait.toShapeId()}` attached.\n                        This shape is also part of an event stream; it is unclear what the semantics for constrained shapes in event streams are.\n                        Please remove the trait from the shape to synthesize your model.\n                        \"\"\".trimIndent().replace(\"\\n\", \" \"),\n                        willSupport = false,\n                        \"https://github.com/awslabs/smithy/issues/1388\",\n                        canBeIgnored = false,\n                    ),\n                )\n\n            is UnsupportedLengthTraitOnStreamingBlobShape ->\n                LogMessage(\n                    level,\n                    buildMessage(\n                        \"\"\"\n                        The ${shape.type} shape `${shape.id}` has both the `${lengthTrait.toShapeId()}` and `${streamingTrait.toShapeId()}` constraint traits attached.\n                        It is unclear what the semantics for streaming blob shapes are.\n                        \"\"\".trimIndent().replace(\"\\n\", \" \"),\n                        willSupport = false,\n                        \"https://github.com/awslabs/smithy/issues/1389\",\n                    ),\n                )\n\n            is UnsupportedRangeTraitOnShape ->\n                LogMessage(\n                    level,\n                    buildMessageShapeHasUnsupportedConstraintTrait(\n                        shape,\n                        rangeTrait,\n                        willSupport = false,\n                        trackingIssue = \"https://github.com/smithy-lang/smithy-rs/issues/2007\",\n                    ),\n                )\n\n            is UnsupportedUniqueItemsTraitOnShape ->\n                LogMessage(\n                    level,\n                    buildMessageShapeHasUnsupportedConstraintTrait(shape, uniqueItemsTrait, constraintTraitsUberIssue),\n                )\n\n            is UnsupportedMapShapeReachableFromUniqueItemsList ->\n                LogMessage(\n                    Level.SEVERE,\n                    buildMessage(\n                        \"\"\"\n                        The map shape `${mapShape.id}` is reachable from the list shape `${listShape.id}`, which has the\n                        `@uniqueItems` trait attached.\n                        \"\"\".trimIndent().replace(\"\\n\", \" \"),\n                        willSupport = false,\n                        trackingIssue = \"https://github.com/awslabs/smithy/issues/1567\",\n                        canBeIgnored = false,\n                    ),\n                )\n        }\n    }\n}\n\nprivate data class OperationWithConstrainedInputWithoutValidationException(\n    val shape: OperationShape,\n)\n\nprivate data class OperationWithConstrainedInputWithMultipleValidationExceptions(\n    val shape: OperationShape,\n)\n\nprivate data class UnsupportedConstraintOnMemberShape(\n    val shape: MemberShape,\n    val constraintTrait: Trait,\n) : UnsupportedConstraintMessageKind()\n\nprivate data class UnsupportedConstraintOnShapeReachableViaAnEventStream(\n    val shape: Shape,\n    val constraintTrait: Trait,\n) : UnsupportedConstraintMessageKind()\n\nprivate data class UnsupportedLengthTraitOnStreamingBlobShape(\n    val shape: BlobShape,\n    val lengthTrait: LengthTrait,\n    val streamingTrait: StreamingTrait,\n) : UnsupportedConstraintMessageKind()\n\nprivate data class UnsupportedRangeTraitOnShape(\n    val shape: Shape,\n    val rangeTrait: RangeTrait,\n) : UnsupportedConstraintMessageKind()\n\nprivate data class UnsupportedUniqueItemsTraitOnShape(\n    val shape: Shape,\n    val uniqueItemsTrait: UniqueItemsTrait,\n) : UnsupportedConstraintMessageKind()\n\nprivate data class UnsupportedMapShapeReachableFromUniqueItemsList(\n    val listShape: ListShape,\n    val uniqueItemsTrait: UniqueItemsTrait,\n    val mapShape: MapShape,\n) : UnsupportedConstraintMessageKind()\n\ndata class LogMessage(\n    val level: Level,\n    val message: String,\n)\n\ndata class ValidationResult(\n    val shouldAbort: Boolean,\n    val messages: List<LogMessage>,\n) : Throwable(message = messages.joinToString(\"\\n\") { it.message })\n\nprivate const val validationExceptionDocsErrorMessage =\n    \"For documentation, see https://smithy-lang.github.io/smithy-rs/design/server/validation_exceptions.html\"\n\n/*\n * Returns the set of operation shapes that must have a supported validation exception shape\n * in their associated errors list.\n */\nfun operationShapesThatMustHaveValidationException(\n    model: Model,\n    service: ServiceShape,\n): Set<OperationShape> {\n    val walker = DirectedWalker(model)\n    return walker\n        .walkShapes(service)\n        .filterIsInstance<OperationShape>()\n        .asSequence()\n        .filter { operationShape ->\n            // Walk the shapes reachable via this operation input.\n            walker\n                .walkShapes(operationShape.inputShape(model))\n                .any { it is SetShape || it is EnumShape || it.hasConstraintTrait() || it.hasEventStreamMember(model) }\n        }.toSet()\n}\n\n/**\n * Validate that all constrained operations have the shape [validationExceptionShapeId] shape attached to their errors.\n */\nfun validateOperationsWithConstrainedInputHaveValidationExceptionAttached(\n    model: Model,\n    service: ServiceShape,\n    validationExceptionShapeId: ShapeId,\n): ValidationResult {\n    // Traverse the model and error out if an operation uses constrained input, but it does not have\n    // `ValidationException` or a structure with the @validationException trait attached in `errors`.\n    // https://github.com/smithy-lang/smithy-rs/pull/1199#discussion_r809424783\n    // TODO(https://github.com/smithy-lang/smithy-rs/issues/1401): This check will go away once we add support for\n    //  `disableDefaultValidation` set to `true`, allowing service owners to map from constraint violations to operation errors.\n    val defaultValidationExceptionShapeId = ShapeId.from(\"smithy.framework#ValidationException\")\n    val operationsWithConstrainedInputWithoutValidationExceptionSet =\n        operationShapesThatMustHaveValidationException(model, service)\n            .filter {\n                val errors = it.getErrors(service)\n                !errors.contains(defaultValidationExceptionShapeId) &&\n                    !errors\n                        .contains(validationExceptionShapeId) &&\n                    errors.none { error ->\n                        model\n                            .expectShape(error)\n                            .hasTrait(ValidationExceptionTrait.ID)\n                    }\n            }.map { OperationWithConstrainedInputWithoutValidationException(it) }\n            .toSet()\n\n    val messages =\n        operationsWithConstrainedInputWithoutValidationExceptionSet.map {\n            LogMessage(\n                Level.SEVERE,\n                \"\"\"\n                Operation ${it.shape.id} takes in input that is constrained\n                (https://awslabs.github.io/smithy/2.0/spec/constraint-traits.html), and as such can fail with a\n                validation exception. You must model this behavior in the operation shape in your model file using\n                the default validation exception shown below, or by defining a custom validation exception.\n                $validationExceptionDocsErrorMessage\n                \"\"\".trimIndent().replace(\"\\n\", \" \") +\n                    \"\"\"\n\n                    ```smithy\n                    use $defaultValidationExceptionShapeId\n\n                    operation ${it.shape.id.name} {\n                        ...\n                        errors: [..., ${defaultValidationExceptionShapeId.name}] // <-- Add this.\n                    }\n                    ```\n                    \"\"\".trimIndent(),\n            )\n        }\n\n    return ValidationResult(shouldAbort = messages.any { it.level == Level.SEVERE }, messages)\n}\n\n/**\n * Validate that all constrained operations have exactly one of: the default smithy.framework#ValidationException or a\n * custom validation exception (shape with @validationException) attached to their errors.\n */\nfun validateOperationsWithConstrainedInputHaveOneValidationExceptionAttached(\n    model: Model,\n    service: ServiceShape,\n    validationExceptionShapeId: ShapeId,\n): ValidationResult {\n    val operationsWithConstrainedInputWithMultipleValidationExceptionSet =\n        operationShapesThatMustHaveValidationException(model, service)\n            .filter {\n                it.errors.count { error ->\n                    val errorShape = model.expectShape(error)\n                    errorShape.hasTrait(ValidationExceptionTrait.ID) || errorShape.id == validationExceptionShapeId\n                } > 1\n            }.map { OperationWithConstrainedInputWithMultipleValidationExceptions(it) }\n            .toSet()\n\n    val messages =\n        operationsWithConstrainedInputWithMultipleValidationExceptionSet.map {\n            LogMessage(\n                Level.SEVERE,\n                \"\"\"\n                Cannot have multiple validation exceptions defined for a constrained operation.\n                Operation ${it.shape.id} takes in input that is constrained (https://awslabs.github.io/smithy/2.0/spec/constraint-traits.html),\n                and as such can fail with a validation exception. This must be modeled with a single validation exception.\n                $validationExceptionDocsErrorMessage\n                \"\"\".trimIndent(),\n            )\n        }\n\n    return ValidationResult(shouldAbort = messages.any { it.level == Level.SEVERE }, messages)\n}\n\nprivate fun Shape.isReachableFromOperationErrors(model: Model): Boolean =\n    model.serviceShapes.any {\n        it.errorsSet.contains(this.id)\n    } || model.operationShapes.any { it.errorsSet.contains(this.id) }\n\n/**\n * Restrict custom validation exceptions to just one and ensure default validation exception is not used if a custom\n * validation exception is defined\n */\nfun validateModelHasAtMostOneValidationException(\n    model: Model,\n    service: ServiceShape,\n): ValidationResult {\n    // Custom validation exception shapes that are defined AND used in input\n    val customValidationExceptionShapes =\n        model\n            .shapes()\n            .filter { it.hasTrait(ValidationExceptionTrait.ID) && it.isReachableFromOperationErrors(model) }\n            .collect(Collectors.toList())\n\n    val messages = mutableListOf<LogMessage>()\n\n    if (customValidationExceptionShapes.isEmpty()) {\n        return ValidationResult(shouldAbort = false, messages)\n    }\n\n    if (customValidationExceptionShapes.size > 1) {\n        messages.add(\n            LogMessage(\n                Level.SEVERE,\n                \"\"\"\n                Using multiple custom validation exceptions is unsupported.\n                Found ${customValidationExceptionShapes.size} validation exception shapes reachable from operation input:\n                ${customValidationExceptionShapes.joinToString(\", \") { it.id.toString() }}\n                $validationExceptionDocsErrorMessage\n                \"\"\".trimIndent(),\n            ),\n        )\n        return ValidationResult(shouldAbort = true, messages)\n    }\n\n    // Traverse the model and error out if the default ValidationException exists in an error closure of a service or operation:\n    val walker = DirectedWalker(model)\n\n    val defaultValidationExceptionId = ShapeId.from(\"smithy.framework#ValidationException\")\n\n    // This is guaranteed to have a single shape due to the above check\n    val customValidationExceptionId = customValidationExceptionShapes.single()!!.id\n\n    val operationsWithDefault =\n        walker\n            .walkShapes(service)\n            .asSequence()\n            .filterIsInstance<OperationShape>()\n            .filter { it.errors.contains(defaultValidationExceptionId) }\n\n    operationsWithDefault.forEach {\n        // This error will typically not be reached anyways because Smithy will error out from collisions\n        messages.add(\n            LogMessage(\n                Level.SEVERE,\n                \"\"\"\n                Operation ${it.id} uses the default ValidationException, but $customValidationExceptionId is also\n                also used in another operation.\n                Remove ValidationException from the operation's errors and use the custom validation exception, or vice versa.\n                $validationExceptionDocsErrorMessage\n                \"\"\".trimIndent(),\n            ),\n        )\n    }\n\n    return ValidationResult(shouldAbort = messages.any { it.level == Level.SEVERE }, messages)\n}\n\nfun validateUnsupportedConstraints(\n    model: Model,\n    service: ServiceShape,\n    codegenConfig: ServerCodegenConfig,\n): ValidationResult {\n    // Traverse the model and error out if:\n    val walker = DirectedWalker(model)\n\n    // 1. Constraint traits on streaming blob shapes are used. Their semantics are unclear.\n    // TODO(https://github.com/awslabs/smithy/issues/1389)\n    val unsupportedLengthTraitOnStreamingBlobShapeSet =\n        walker\n            .walkShapes(service)\n            .asSequence()\n            .filterIsInstance<BlobShape>()\n            .filter { it.hasTrait<LengthTrait>() && it.hasTrait<StreamingTrait>() }\n            .map { UnsupportedLengthTraitOnStreamingBlobShape(it, it.expectTrait(), it.expectTrait()) }\n            .toSet()\n\n    // 2. Constraint traits in event streams are used. Their semantics are unclear.\n    // TODO(https://github.com/awslabs/smithy/issues/1388)\n    val eventStreamShapes =\n        walker\n            .walkShapes(service)\n            .asSequence()\n            .filter { it.hasTrait<SyntheticEventStreamUnionTrait>() }\n    val unsupportedConstraintOnNonErrorShapeReachableViaAnEventStreamSet =\n        eventStreamShapes\n            .flatMap { walker.walkShapes(it) }\n            .filterMapShapesToTraits(allConstraintTraits)\n            .map { (shape, trait) -> UnsupportedConstraintOnShapeReachableViaAnEventStream(shape, trait) }\n            .toSet()\n    val eventStreamErrors =\n        eventStreamShapes\n            .map {\n                it.expectTrait<SyntheticEventStreamUnionTrait>()\n            }.map { it.errorMembers }\n    val unsupportedConstraintErrorShapeReachableViaAnEventStreamSet =\n        eventStreamErrors\n            .flatMap { it }\n            .flatMap { walker.walkShapes(it) }\n            .filterMapShapesToTraits(allConstraintTraits)\n            .map { (shape, trait) -> UnsupportedConstraintOnShapeReachableViaAnEventStream(shape, trait) }\n            .toSet()\n    val unsupportedConstraintShapeReachableViaAnEventStreamSet =\n        unsupportedConstraintOnNonErrorShapeReachableViaAnEventStreamSet + unsupportedConstraintErrorShapeReachableViaAnEventStreamSet\n\n    // 3. Range trait used on unsupported shapes.\n    // TODO(https://github.com/smithy-lang/smithy-rs/issues/2007)\n    val unsupportedRangeTraitOnShapeSet =\n        walker\n            .walkShapes(service)\n            .asSequence()\n            .filterNot { it is IntegerShape || it is ShortShape || it is LongShape || it is ByteShape }\n            .filterMapShapesToTraits(setOf(RangeTrait::class.java))\n            .map { (shape, rangeTrait) -> UnsupportedRangeTraitOnShape(shape, rangeTrait as RangeTrait) }\n            .toSet()\n\n    // 4. `@uniqueItems` cannot reach a map shape.\n    // See https://github.com/awslabs/smithy/issues/1567.\n    val mapShapeReachableFromUniqueItemsListShapeSet =\n        walker\n            .walkShapes(service)\n            .asSequence()\n            .filterMapShapesToTraits(setOf(UniqueItemsTrait::class.java))\n            .flatMap { (listShape, uniqueItemsTrait) ->\n                walker.walkShapes(listShape).filterIsInstance<MapShape>().map { mapShape ->\n                    UnsupportedMapShapeReachableFromUniqueItemsList(\n                        listShape as ListShape,\n                        uniqueItemsTrait as UniqueItemsTrait,\n                        mapShape,\n                    )\n                }\n            }.toSet()\n\n    val messages =\n        (\n            unsupportedLengthTraitOnStreamingBlobShapeSet.map {\n                it.intoLogMessage(codegenConfig.ignoreUnsupportedConstraints)\n            } +\n                unsupportedConstraintShapeReachableViaAnEventStreamSet.map {\n                    it.intoLogMessage(codegenConfig.ignoreUnsupportedConstraints)\n                } +\n                unsupportedRangeTraitOnShapeSet.map { it.intoLogMessage(codegenConfig.ignoreUnsupportedConstraints) } +\n                mapShapeReachableFromUniqueItemsListShapeSet.map {\n                    it.intoLogMessage(codegenConfig.ignoreUnsupportedConstraints)\n                }\n        ).toMutableList()\n\n    if (messages.isEmpty() && codegenConfig.ignoreUnsupportedConstraints) {\n        messages +=\n            LogMessage(\n                Level.SEVERE,\n                \"\"\"\n                The `ignoreUnsupportedConstraints` flag in the `codegen` configuration is set to `true`, but it has no\n                effect. All the constraint traits used in the model are well-supported, please remove this flag.\n                \"\"\".trimIndent().replace(\"\\n\", \" \"),\n            )\n    }\n\n    return ValidationResult(shouldAbort = messages.any { it.level == Level.SEVERE }, messages)\n}\n\n/**\n * Returns a sequence over pairs `(shape, trait)`.\n * The returned sequence contains one pair per shape in the input iterable that has attached a trait contained in  [traits].\n */\nprivate fun Sequence<Shape>.filterMapShapesToTraits(traits: Set<Class<out Trait>>): Sequence<Pair<Shape, Trait>> =\n    this\n        .map { shape -> shape to traits.mapNotNull { shape.getTrait(it).orNull() } }\n        .flatMap { (shape, traits) -> traits.map { shape to it } }\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/customizations/AddTypeFieldToServerErrorsCborCustomization.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.customizations\n\nimport software.amazon.smithy.model.traits.ErrorTrait\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.escape\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.serialize.CborSerializerCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.serialize.CborSerializerSection\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\n\n/**\n * Smithy RPC v2 CBOR requires errors to be serialized in server responses with an additional `__type` field.\n *\n * Note that we apply this customization when serializing _any_ structure with the `@error` trait, regardless if it's\n * an error response or not. Consider this model:\n *\n * ```smithy\n * operation ErrorSerializationOperation {\n *     input: SimpleStruct\n *     output: ErrorSerializationOperationOutput\n *     errors: [ValidationException]\n * }\n *\n * structure ErrorSerializationOperationOutput {\n *     errorShape: ValidationException\n * }\n * ```\n *\n * `ValidationException` is re-used across the operation output and the operation error. The `__type` field will\n * appear when serializing both.\n *\n * Strictly speaking, the spec says we should only add `__type` when serializing an operation error response, but\n * there shouldn't™️ be any harm in always including it, which simplifies the code generator.\n */\nclass AddTypeFieldToServerErrorsCborCustomization : CborSerializerCustomization() {\n    override fun section(section: CborSerializerSection): Writable =\n        when (section) {\n            is CborSerializerSection.BeforeSerializingStructureMembers ->\n                if (section.structContext.shape.hasTrait<ErrorTrait>()) {\n                    writable {\n                        rust(\n                            \"\"\"\n                            ${section.encoderBindingName}\n                                .str(\"__type\")\n                                .str(\"${escape(section.structContext.shape.id.toString())}\");\n                            \"\"\",\n                        )\n                    }\n                } else {\n                    emptySection\n                }\n            else -> emptySection\n        }\n}\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/customizations/AdditionalErrorsDecorator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.customizations\n\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.ServiceShape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.traits.ErrorTrait\nimport software.amazon.smithy.model.traits.RequiredTrait\nimport software.amazon.smithy.model.transform.ModelTransformer\nimport software.amazon.smithy.rust.codegen.core.smithy.transformers.allErrors\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerRustSettings\nimport software.amazon.smithy.rust.codegen.server.smithy.customize.ServerCodegenDecorator\n\n/**\n * Add at least one error to all operations in the model.\n *\n * When this decorator is applied, even operations that do not have a Smithy error attached,\n * will return `Result<OperationOutput, OperationError>`.\n *\n * To enable this decorator write its class name to a resource file like this:\n * ```\n * C=\"software.amazon.smithy.rust.codegen.server.smithy.customizations.AddInternalServerErrorToInfallibleOperationsDecorator\"\n * F=\"software.amazon.smithy.rust.codegen.smithy.customize.RustCodegenDecorator\"\n * D=\"codegen-server/src/main/resources/META-INF/services\"\n * mkdir -p \"$D\" && echo \"$C\" > \"$D/$F\"\n * ```\n */\nclass AddInternalServerErrorToInfallibleOperationsDecorator : ServerCodegenDecorator {\n    override val name: String = \"AddInternalServerErrorToInfallibleOperations\"\n    override val order: Byte = 0\n\n    override fun transformModel(\n        service: ServiceShape,\n        model: Model,\n        settings: ServerRustSettings,\n    ): Model = addErrorShapeToModelOperations(service, model) { shape -> shape.allErrors(model).isEmpty() }\n}\n\n/**\n * Add an internal server error to all operations in the model.\n *\n * When a server for an API is subject to internal errors, for example underlying network problems,\n * and there is no native mapping of these actual errors to the API errors, servers can generate\n * the code with this decorator to add an internal error shape on-the-fly to all the operations.\n *\n * When this decorator is applied, even operations that do not have a Smithy error attached,\n * will return `Result<OperationOutput, OperationError>`.\n *\n * To enable this decorator write its class name to a resource file like this:\n * ```\n * C=\"software.amazon.smithy.rust.codegen.server.smithy.customizations.AddInternalServerErrorToAllOperationsDecorator\"\n * F=\"software.amazon.smithy.rust.codegen.smithy.customize.RustCodegenDecorator\"\n * D=\"codegen-server/src/main/resources/META-INF/services\"\n * mkdir -p \"$D\" && echo \"$C\" > \"$D/$F\"\n * ```\n */\nclass AddInternalServerErrorToAllOperationsDecorator : ServerCodegenDecorator {\n    override val name: String = \"AddInternalServerErrorToAllOperations\"\n    override val order: Byte = 0\n\n    override fun transformModel(\n        service: ServiceShape,\n        model: Model,\n        settings: ServerRustSettings,\n    ): Model = addErrorShapeToModelOperations(service, model) { true }\n}\n\nfun addErrorShapeToModelOperations(\n    service: ServiceShape,\n    model: Model,\n    opSelector: (OperationShape) -> Boolean,\n): Model {\n    val errorShape = internalServerError(service.id.namespace)\n    val modelShapes = model.toBuilder().addShapes(listOf(errorShape)).build()\n    return ModelTransformer.create().mapShapes(modelShapes) { shape ->\n        if (shape is OperationShape && opSelector(shape)) {\n            shape.toBuilder().addError(errorShape).build()\n        } else {\n            shape\n        }\n    }\n}\n\nprivate fun internalServerError(namespace: String): StructureShape =\n    StructureShape.builder().id(\"$namespace#InternalServerError\")\n        .addTrait(ErrorTrait(\"server\"))\n        .addMember(\n            MemberShape.builder()\n                .id(\"$namespace#InternalServerError\\$message\")\n                .target(\"smithy.api#String\")\n                .addTrait(RequiredTrait())\n                .build(),\n        ).build()\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/customizations/BeforeEncodingMapOrCollectionCborCustomization.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.customizations\n\nimport software.amazon.smithy.model.shapes.CollectionShape\nimport software.amazon.smithy.model.shapes.MapShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.serialize.CborSerializerCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.serialize.CborSerializerSection\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.serialize.ValueExpression\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenContext\nimport software.amazon.smithy.rust.codegen.server.smithy.workingWithPublicConstrainedWrapperTupleType\n\n/**\n * A customization to, just before we encode over a _constrained_ map or collection shape in a CBOR serializer,\n * unwrap the wrapper newtype and take a shared reference to the actual value within it.\n * That value will be a `std::collections::HashMap` for map shapes, and a `std::vec::Vec` for collection shapes.\n */\nclass BeforeEncodingMapOrCollectionCborCustomization(private val codegenContext: ServerCodegenContext) : CborSerializerCustomization() {\n    override fun section(section: CborSerializerSection): Writable =\n        when (section) {\n            is CborSerializerSection.BeforeIteratingOverMapOrCollection ->\n                writable {\n                    check(section.shape is CollectionShape || section.shape is MapShape)\n                    if (workingWithPublicConstrainedWrapperTupleType(\n                            section.shape,\n                            codegenContext.model,\n                            codegenContext.settings.codegenConfig.publicConstrainedTypes,\n                        )\n                    ) {\n                        section.context.valueExpression =\n                            ValueExpression.Reference(\"&${section.context.valueExpression.name}.0\")\n                    }\n                }\n            else -> emptySection\n        }\n}\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/customizations/BeforeIteratingOverMapOrCollectionJsonCustomization.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.customizations\n\nimport software.amazon.smithy.model.shapes.CollectionShape\nimport software.amazon.smithy.model.shapes.MapShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.serialize.JsonSerializerCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.serialize.JsonSerializerSection\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.serialize.ValueExpression\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenContext\nimport software.amazon.smithy.rust.codegen.server.smithy.workingWithPublicConstrainedWrapperTupleType\n\n/**\n * A customization to, just before we iterate over a _constrained_ map or collection shape in a JSON serializer,\n * unwrap the wrapper newtype and take a shared reference to the actual value within it.\n * That value will be a `std::collections::HashMap` for map shapes, and a `std::vec::Vec` for collection shapes.\n */\nclass BeforeIteratingOverMapOrCollectionJsonCustomization(private val codegenContext: ServerCodegenContext) : JsonSerializerCustomization() {\n    override fun section(section: JsonSerializerSection): Writable =\n        when (section) {\n            is JsonSerializerSection.BeforeIteratingOverMapOrCollection ->\n                writable {\n                    check(section.shape is CollectionShape || section.shape is MapShape)\n                    if (workingWithPublicConstrainedWrapperTupleType(\n                            section.shape,\n                            codegenContext.model,\n                            codegenContext.settings.codegenConfig.publicConstrainedTypes,\n                        )\n                    ) {\n                        section.context.valueExpression =\n                            ValueExpression.Reference(\"&${section.context.valueExpression.name}.0\")\n                    }\n                }\n            else -> emptySection\n        }\n}\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/customizations/BeforeSerializingMemberCborCustomization.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\npackage software.amazon.smithy.rust.codegen.server.smithy.customizations\n\nimport software.amazon.smithy.model.shapes.BlobShape\nimport software.amazon.smithy.model.shapes.ByteShape\nimport software.amazon.smithy.model.shapes.IntegerShape\nimport software.amazon.smithy.model.shapes.LongShape\nimport software.amazon.smithy.model.shapes.ShortShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.serialize.CborSerializerCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.serialize.CborSerializerSection\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.serialize.ValueExpression\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenContext\nimport software.amazon.smithy.rust.codegen.server.smithy.workingWithPublicConstrainedWrapperTupleType\n\n/**\n * Constrained shapes are wrapped in a Rust tuple struct that implements all necessary checks. However,\n * for serialization purposes, the inner type of the constrained shape is used for serialization.\n *\n * The `BeforeSerializingMemberCborCustomization` class generates a reference to the inner type when the shape being\n * code-generated is constrained and the `publicConstrainedTypes` codegen flag is set.\n */\nclass BeforeSerializingMemberCborCustomization(private val codegenContext: ServerCodegenContext) : CborSerializerCustomization() {\n    override fun section(section: CborSerializerSection): Writable =\n        when (section) {\n            is CborSerializerSection.BeforeSerializingNonNullMember ->\n                writable {\n                    if (workingWithPublicConstrainedWrapperTupleType(\n                            section.shape,\n                            codegenContext.model,\n                            codegenContext.settings.codegenConfig.publicConstrainedTypes,\n                        )\n                    ) {\n                        if (section.shape is IntegerShape || section.shape is ShortShape || section.shape is LongShape || section.shape is ByteShape || section.shape is BlobShape) {\n                            section.context.valueExpression =\n                                ValueExpression.Reference(\"&${section.context.valueExpression.name}.0\")\n                        }\n                    }\n                }\n\n            else -> emptySection\n        }\n}\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/customizations/BeforeSerializingMemberJsonCustomization.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.customizations\n\nimport software.amazon.smithy.model.shapes.BlobShape\nimport software.amazon.smithy.model.shapes.ByteShape\nimport software.amazon.smithy.model.shapes.IntegerShape\nimport software.amazon.smithy.model.shapes.LongShape\nimport software.amazon.smithy.model.shapes.ShortShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.serialize.JsonSerializerCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.serialize.JsonSerializerSection\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.serialize.ValueExpression\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenContext\nimport software.amazon.smithy.rust.codegen.server.smithy.workingWithPublicConstrainedWrapperTupleType\n\n/**\n * A customization to, just before we serialize a _constrained_ shape in a JSON serializer, unwrap the wrapper\n * newtype and take a shared reference to the actual unconstrained value within it.\n */\nclass BeforeSerializingMemberJsonCustomization(private val codegenContext: ServerCodegenContext) :\n    JsonSerializerCustomization() {\n    override fun section(section: JsonSerializerSection): Writable =\n        when (section) {\n            is JsonSerializerSection.BeforeSerializingNonNullMember ->\n                writable {\n                    if (workingWithPublicConstrainedWrapperTupleType(\n                            section.shape,\n                            codegenContext.model,\n                            codegenContext.settings.codegenConfig.publicConstrainedTypes,\n                        )\n                    ) {\n                        if (section.shape is IntegerShape || section.shape is ShortShape || section.shape is LongShape || section.shape is ByteShape || section.shape is BlobShape) {\n                            section.context.valueExpression =\n                                ValueExpression.Reference(\"&${section.context.valueExpression.name}.0\")\n                        }\n                    }\n                }\n\n            else -> emptySection\n        }\n}\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/customizations/CustomValidationExceptionWithReasonDecorator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.customizations\n\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.MapShape\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.model.shapes.StringShape\nimport software.amazon.smithy.model.traits.EnumTrait\nimport software.amazon.smithy.model.traits.LengthTrait\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.join\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlockTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.withBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.util.getTrait\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenContext\nimport software.amazon.smithy.rust.codegen.server.smithy.customize.ServerCodegenDecorator\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.BlobLength\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.CollectionTraitInfo\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.ConstraintViolation\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.Length\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.Pattern\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.Range\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.StringTraitInfo\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.UnionConstraintTraitInfo\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.ValidationExceptionConversionGenerator\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.isKeyConstrained\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.isValueConstrained\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.protocol.ServerProtocol\nimport software.amazon.smithy.rust.codegen.server.smithy.validationErrorMessage\n\n/**\n * A decorator that adds code to convert from constraint violations to a custom `ValidationException` shape that is very\n * similar to `smithy.framework#ValidationException`, with an additional `reason` field.\n *\n * The shape definition is in [CustomValidationExceptionWithReasonDecoratorTest].\n *\n * This is just an example to showcase experimental support for custom validation exceptions.\n * TODO(https://github.com/smithy-lang/smithy-rs/pull/2053): this will go away once we implement the RFC, when users will be\n *  able to define the converters in their Rust application code.\n */\nclass CustomValidationExceptionWithReasonDecorator : ServerCodegenDecorator {\n    override val name: String\n        get() = \"CustomValidationExceptionWithReasonDecorator\"\n    override val order: Byte\n        get() = -69\n\n    override fun validationExceptionConversion(\n        codegenContext: ServerCodegenContext,\n    ): ValidationExceptionConversionGenerator? =\n        if (codegenContext.settings.codegenConfig.experimentalCustomValidationExceptionWithReasonPleaseDoNotUse != null) {\n            ValidationExceptionWithReasonConversionGenerator(codegenContext)\n        } else {\n            null\n        }\n}\n\nclass ValidationExceptionWithReasonConversionGenerator(private val codegenContext: ServerCodegenContext) :\n    ValidationExceptionConversionGenerator {\n    override val shapeId: ShapeId =\n        ShapeId.from(codegenContext.settings.codegenConfig.experimentalCustomValidationExceptionWithReasonPleaseDoNotUse)\n\n    override fun renderImplFromConstraintViolationForRequestRejection(protocol: ServerProtocol): Writable =\n        writable {\n            rustTemplate(\n                \"\"\"\n                impl #{From}<ConstraintViolation> for #{RequestRejection} {\n                    fn from(constraint_violation: ConstraintViolation) -> Self {\n                        let first_validation_exception_field = constraint_violation.as_validation_exception_field(\"\".to_owned());\n                        let validation_exception = crate::error::ValidationException {\n                            message: format!(\"1 validation error detected. {}\", &first_validation_exception_field.message),\n                            reason: crate::model::ValidationExceptionReason::FieldValidationFailed,\n                            fields: Some(vec![first_validation_exception_field]),\n                        };\n                        Self::ConstraintViolation(\n                            crate::protocol_serde::shape_validation_exception::ser_validation_exception_error(&validation_exception)\n                                .expect(\"validation exceptions should never fail to serialize; please file a bug report under https://github.com/smithy-lang/smithy-rs/issues\")\n                        )\n                    }\n                }\n                \"\"\",\n                \"RequestRejection\" to protocol.requestRejection(codegenContext.runtimeConfig),\n                \"From\" to RuntimeType.From,\n            )\n        }\n\n    override fun stringShapeConstraintViolationImplBlock(stringConstraintsInfo: Collection<StringTraitInfo>): Writable =\n        writable {\n            val validationExceptionFields =\n                stringConstraintsInfo.map {\n                    writable {\n                        when (it) {\n                            is Pattern -> {\n                                rustTemplate(\n                                    \"\"\"\n                                    Self::Pattern(_) => crate::model::ValidationExceptionField {\n                                        message: #{MessageWritable:W},\n                                        name: path,\n                                        reason: crate::model::ValidationExceptionFieldReason::PatternNotValid,\n                                    },\n                                    \"\"\",\n                                    \"MessageWritable\" to it.errorMessage(),\n                                )\n                            }\n                            is Length -> {\n                                rust(\n                                    \"\"\"\n                                    Self::Length(length) => crate::model::ValidationExceptionField {\n                                        message: format!(\"${it.lengthTrait.validationErrorMessage()}\", length, &path),\n                                        name: path,\n                                        reason: crate::model::ValidationExceptionFieldReason::LengthNotValid,\n                                    },\n                                    \"\"\",\n                                )\n                            }\n                        }\n                    }\n                }.join(\"\\n\")\n\n            rustTemplate(\n                \"\"\"\n                pub(crate) fn as_validation_exception_field(self, path: #{String}) -> crate::model::ValidationExceptionField {\n                    match self {\n                        #{ValidationExceptionFields:W}\n                    }\n                }\n                \"\"\",\n                \"String\" to RuntimeType.String,\n                \"ValidationExceptionFields\" to validationExceptionFields,\n            )\n        }\n\n    override fun enumShapeConstraintViolationImplBlock(enumTrait: EnumTrait) =\n        writable {\n            val enumValueSet = enumTrait.enumDefinitionValues.joinToString(\", \")\n            val message = \"Value at '{}' failed to satisfy constraint: Member must satisfy enum value set: [$enumValueSet]\"\n            rustTemplate(\n                \"\"\"\n                pub(crate) fn as_validation_exception_field(self, path: #{String}) -> crate::model::ValidationExceptionField {\n                    crate::model::ValidationExceptionField {\n                        message: format!(r##\"$message\"##, &path),\n                        name: path,\n                        reason: crate::model::ValidationExceptionFieldReason::ValueNotValid,\n                    }\n                }\n                \"\"\",\n                \"String\" to RuntimeType.String,\n            )\n        }\n\n    override fun numberShapeConstraintViolationImplBlock(rangeInfo: Range) =\n        writable {\n            rustTemplate(\n                \"\"\"\n                pub(crate) fn as_validation_exception_field(self, path: #{String}) -> crate::model::ValidationExceptionField {\n                    match self {\n                        Self::Range(_) => crate::model::ValidationExceptionField {\n                            message: format!(\"${rangeInfo.rangeTrait.validationErrorMessage()}\", &path),\n                            name: path,\n                            reason: crate::model::ValidationExceptionFieldReason::ValueNotValid,\n                        }\n                    }\n                }\n                \"\"\",\n                \"String\" to RuntimeType.String,\n            )\n        }\n\n    override fun blobShapeConstraintViolationImplBlock(blobConstraintsInfo: Collection<BlobLength>) =\n        writable {\n            val validationExceptionFields =\n                blobConstraintsInfo.map {\n                    writable {\n                        rust(\n                            \"\"\"\n                            Self::Length(length) => crate::model::ValidationExceptionField {\n                                message: format!(\"${it.lengthTrait.validationErrorMessage()}\", length, &path),\n                                name: path,\n                                reason: crate::model::ValidationExceptionFieldReason::LengthNotValid,\n                            },\n                            \"\"\",\n                        )\n                    }\n                }.join(\"\\n\")\n\n            rustTemplate(\n                \"\"\"\n                pub(crate) fn as_validation_exception_field(self, path: #{String}) -> crate::model::ValidationExceptionField {\n                    match self {\n                        #{ValidationExceptionFields:W}\n                    }\n                }\n                \"\"\",\n                \"String\" to RuntimeType.String,\n                \"ValidationExceptionFields\" to validationExceptionFields,\n            )\n        }\n\n    override fun mapShapeConstraintViolationImplBlock(\n        shape: MapShape,\n        keyShape: StringShape,\n        valueShape: Shape,\n        symbolProvider: RustSymbolProvider,\n        model: Model,\n    ) = writable {\n        rustBlockTemplate(\n            \"pub(crate) fn as_validation_exception_field(self, path: #{String}) -> crate::model::ValidationExceptionField\",\n            \"String\" to RuntimeType.String,\n        ) {\n            rustBlock(\"match self\") {\n                shape.getTrait<LengthTrait>()?.also {\n                    rust(\n                        \"\"\"\n                        Self::Length(length) => crate::model::ValidationExceptionField {\n                            message: format!(\"${it.validationErrorMessage()}\", length, &path),\n                            name: path,\n                            reason: crate::model::ValidationExceptionFieldReason::LengthNotValid,\n                        },\n                        \"\"\",\n                    )\n                }\n                if (isKeyConstrained(keyShape, symbolProvider)) {\n                    rust(\"\"\"Self::Key(key_constraint_violation) => key_constraint_violation.as_validation_exception_field(path),\"\"\")\n                }\n                if (isValueConstrained(valueShape, model, symbolProvider)) {\n                    rust(\"\"\"Self::Value(key, value_constraint_violation) => value_constraint_violation.as_validation_exception_field(path + \"/\" + key.as_str()),\"\"\")\n                }\n            }\n        }\n    }\n\n    override fun builderConstraintViolationFn(constraintViolations: Collection<ConstraintViolation>) =\n        writable {\n            rustBlockTemplate(\n                \"pub(crate) fn as_validation_exception_field(self, path: #{String}) -> crate::model::ValidationExceptionField\",\n                \"String\" to RuntimeType.String,\n            ) {\n                rustBlock(\"match self\") {\n                    constraintViolations.forEach {\n                        if (it.hasInner()) {\n                            rust(\"\"\"ConstraintViolation::${it.name()}(inner) => inner.as_validation_exception_field(path + \"/${it.forMember.memberName}\"),\"\"\")\n                        } else {\n                            rust(\n                                \"\"\"\n                                ConstraintViolation::${it.name()} => crate::model::ValidationExceptionField {\n                                    message: format!(\"Value at '{}/${it.forMember.memberName}' failed to satisfy constraint: Member must not be null\", path),\n                                    name: path + \"/${it.forMember.memberName}\",\n                                    reason: crate::model::ValidationExceptionFieldReason::Other,\n                                },\n                                \"\"\",\n                            )\n                        }\n                    }\n                }\n            }\n        }\n\n    override fun collectionShapeConstraintViolationImplBlock(\n        collectionConstraintsInfo: Collection<CollectionTraitInfo>,\n        isMemberConstrained: Boolean,\n    ) = writable {\n        val validationExceptionFields =\n            collectionConstraintsInfo.map {\n                writable {\n                    when (it) {\n                        is CollectionTraitInfo.Length -> {\n                            rust(\n                                \"\"\"\n                                Self::Length(length) => crate::model::ValidationExceptionField {\n                                    message: format!(\"${it.lengthTrait.validationErrorMessage()}\", length, &path),\n                                    name: path,\n                                    reason: crate::model::ValidationExceptionFieldReason::LengthNotValid,\n                                },\n                                \"\"\",\n                            )\n                        }\n                        is CollectionTraitInfo.UniqueItems -> {\n                            rust(\n                                \"\"\"\n                                Self::UniqueItems { duplicate_indices, .. } =>\n                                    crate::model::ValidationExceptionField {\n                                        message: format!(\"${it.uniqueItemsTrait.validationErrorMessage()}\", &duplicate_indices, &path),\n                                        name: path,\n                                        reason: crate::model::ValidationExceptionFieldReason::ValueNotValid,\n                                    },\n                                \"\"\",\n                            )\n                        }\n                    }\n                }\n            }.toMutableList()\n\n        if (isMemberConstrained) {\n            validationExceptionFields += {\n                rust(\n                    \"\"\"\n                    Self::Member(index, member_constraint_violation) =>\n                        member_constraint_violation.as_validation_exception_field(path + \"/\" + &index.to_string())\n                    \"\"\",\n                )\n            }\n        }\n        rustTemplate(\n            \"\"\"\n            pub(crate) fn as_validation_exception_field(self, path: #{String}) -> crate::model::ValidationExceptionField {\n                match self {\n                    #{AsValidationExceptionFields:W}\n                }\n            }\n            \"\"\",\n            \"String\" to RuntimeType.String,\n            \"AsValidationExceptionFields\" to validationExceptionFields.join(\"\\n\"),\n        )\n    }\n\n    override fun unionShapeConstraintViolationImplBlock(\n        unionConstraintTraitInfo: Collection<UnionConstraintTraitInfo>,\n    ) = writable {\n        rustBlockTemplate(\n            \"pub(crate) fn as_validation_exception_field(self, path: #{String}) -> crate::model::ValidationExceptionField\",\n            \"String\" to RuntimeType.String,\n        ) {\n            withBlock(\"match self {\", \"}\") {\n                for (constraintViolation in unionConstraintTraitInfo) {\n                    rust(\"\"\"Self::${constraintViolation.name()}(inner) => inner.as_validation_exception_field(path + \"/${constraintViolation.forMember.memberName}\"),\"\"\")\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/customizations/ServerRequiredCustomizations.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.customizations\n\nimport software.amazon.smithy.rust.codegen.core.rustlang.Feature\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RustCrate\nimport software.amazon.smithy.rust.codegen.core.smithy.customizations.AllowLintsCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.customizations.CrateVersionCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.customizations.pubUseSmithyPrimitives\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.LibRsCustomization\nimport software.amazon.smithy.rust.codegen.core.util.hasEventStreamOperations\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerCargoDependency\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenContext\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerRustModule\nimport software.amazon.smithy.rust.codegen.server.smithy.customize.ServerCodegenDecorator\n\n/**\n * A set of customizations that are included in all protocols.\n *\n * This exists as a convenient place to gather these modifications, these are not true customizations.\n *\n * See [RequiredCustomizations] from the `codegen-client` subproject for the client version of this decorator.\n */\nclass ServerRequiredCustomizations : ServerCodegenDecorator {\n    override val name: String = \"ServerRequired\"\n    override val order: Byte = -1\n\n    override fun libRsCustomizations(\n        codegenContext: ServerCodegenContext,\n        baseCustomizations: List<LibRsCustomization>,\n    ): List<LibRsCustomization> =\n        // TODO(https://github.com/smithy-lang/smithy-rs/issues/4366) Remove additionalClippyLints once the issue is resolved\n        baseCustomizations + AllowLintsCustomization(additionalClippyLints = listOf(\"uninlined_format_args\"))\n\n    override fun extras(\n        codegenContext: ServerCodegenContext,\n        rustCrate: RustCrate,\n    ) {\n        val rc = codegenContext.runtimeConfig\n\n        // Add rt-tokio feature for `ByteStream::from_path`\n        rustCrate.mergeFeature(\n            Feature(\n                \"rt-tokio\",\n                true,\n                listOf(\"aws-smithy-types/rt-tokio\"),\n            ),\n        )\n\n        // Use version-aware smithy-http-server dependency name for features\n        val smithyHttpServerDep = ServerCargoDependency.smithyHttpServer(rc)\n        val smithyHttpServerName = smithyHttpServerDep.name\n\n        rustCrate.mergeFeature(\n            Feature(\n                \"aws-lambda\",\n                false,\n                listOf(\"$smithyHttpServerName/aws-lambda\"),\n            ),\n        )\n\n        rustCrate.mergeFeature(\n            Feature(\n                \"request-id\",\n                true,\n                listOf(\"$smithyHttpServerName/request-id\"),\n            ),\n        )\n\n        rustCrate.withModule(ServerRustModule.Types) {\n            pubUseSmithyPrimitives(codegenContext, codegenContext.model, rustCrate)(this)\n            if (codegenContext.serviceShape.hasEventStreamOperations(codegenContext.model)) {\n                rustTemplate(\n                    \"pub use #{EventStreamSender};\",\n                    \"EventStreamSender\" to RuntimeType.eventStreamSender(rc),\n                )\n            }\n            rustTemplate(\n                \"\"\"\n                pub use #{DisplayErrorContext};\n                \"\"\",\n                \"Response\" to RuntimeType.smithyHttp(rc).resolve(\"operation::Response\"),\n                \"DisplayErrorContext\" to RuntimeType.smithyTypes(rc).resolve(\"error::display::DisplayErrorContext\"),\n            )\n        }\n\n        rustCrate.withModule(ServerRustModule.root) {\n            CrateVersionCustomization.extras(rustCrate, ServerRustModule.root)\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/customizations/SigV4EventStreamDecorator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.customizations\n\nimport software.amazon.smithy.aws.traits.auth.SigV4Trait\nimport software.amazon.smithy.codegen.core.Symbol\nimport software.amazon.smithy.model.knowledge.ServiceIndex\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.WrappingSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.traits.SyntheticInputTrait\nimport software.amazon.smithy.rust.codegen.core.util.getTrait\nimport software.amazon.smithy.rust.codegen.core.util.isEventStream\nimport software.amazon.smithy.rust.codegen.core.util.isInputEventStream\nimport software.amazon.smithy.rust.codegen.server.smithy.customize.ServerCodegenDecorator\n\n/**\n * Decorator that adds SigV4 event stream unsigning support to server code generation.\n */\nclass SigV4EventStreamDecorator : ServerCodegenDecorator {\n    override val name: String = \"SigV4EventStreamDecorator\"\n    override val order: Byte = 0\n\n    override fun symbolProvider(base: RustSymbolProvider): RustSymbolProvider {\n        if (base.usesSigAuth()) {\n            return SigV4EventStreamSymbolProvider(base)\n        } else {\n            return base\n        }\n    }\n}\n\ninternal fun RustSymbolProvider.usesSigAuth(): Boolean =\n    ServiceIndex.of(model).getAuthSchemes(moduleProviderContext.serviceShape!!).containsKey(SigV4Trait.ID)\n\n/**\n * Symbol provider wrapper that modifies event stream types to support SigV4 signed messages.\n */\nclass SigV4EventStreamSymbolProvider(\n    base: RustSymbolProvider,\n) : WrappingSymbolProvider(base) {\n    private val runtimeConfig = base.config.runtimeConfig\n\n    override fun toSymbol(shape: Shape): Symbol {\n        val baseSymbol = super.toSymbol(shape)\n        // We only want to wrap with Event Stream types when dealing with member shapes\n        if (shape is MemberShape && shape.isEventStream(model)) {\n            // Determine if the member has a container that is a synthetic input or output\n            val operationShape =\n                model.expectShape(shape.container).let { maybeInput ->\n                    val operationId =\n                        maybeInput.getTrait<SyntheticInputTrait>()?.operation\n                    operationId?.let { model.expectShape(it, OperationShape::class.java) }\n                }\n            // If we find an operation shape, then we can wrap the type\n            if (operationShape != null) {\n                if (operationShape.isInputEventStream(model)) {\n                    return SigV4EventStreamSupportStructures.wrapInEventStreamSigV4(baseSymbol, runtimeConfig)\n                }\n            }\n        }\n\n        return baseSymbol\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/customizations/SigV4EventStreamSupportStructures.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.customizations\n\nimport software.amazon.smithy.codegen.core.Symbol\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustModule\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustType\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.mapRustType\nimport software.amazon.smithy.rust.codegen.core.smithy.rustType\nimport software.amazon.smithy.rust.codegen.core.util.PANIC\n\nobject SigV4EventStreamSupportStructures {\n    internal val supportModule =\n        RustModule.public(\n            \"sigv4_event_stream\",\n            documentationOverride = \"Support structures for SigV4 signed event streams\",\n        )\n\n    fun codegenScope(runtimeConfig: RuntimeConfig) =\n        arrayOf(\n            \"SignatureInfo\" to signatureInfo(),\n            \"ExtractionError\" to extractionError(runtimeConfig),\n            \"SignedEventError\" to signedEventError(runtimeConfig),\n            \"SignedEvent\" to signedEvent(runtimeConfig),\n            \"SigV4Receiver\" to sigV4Receiver(runtimeConfig),\n            \"SigV4Unmarshaller\" to sigV4Unmarshaller(runtimeConfig),\n            \"extract_signed_message\" to extractSignedMessage(runtimeConfig),\n        )\n\n    /**\n     * Wraps an event stream Receiver type with SigV4Receiver.\n     * Transforms: Receiver<T, E> -> SigV4Receiver<T, E>\n     */\n    fun wrapInEventStreamSigV4(\n        symbol: Symbol,\n        runtimeConfig: RuntimeConfig,\n    ): Symbol {\n        val sigV4Receiver = sigV4Receiver(runtimeConfig)\n        return symbol.mapRustType(sigV4Receiver) { rustType ->\n            // Expect Application(Receiver, [T, E])\n            if (rustType is RustType.Application && rustType.name == \"Receiver\" && rustType.args.size == 2) {\n                val eventType = rustType.args[0]\n                val errorType = rustType.args[1]\n\n                // Create SigV4Receiver<T, E>\n                RustType.Application(\n                    sigV4Receiver.toSymbol().rustType(),\n                    listOf(eventType, errorType),\n                )\n            } else {\n                PANIC(\"Called wrap in EventStreamSigV4 on ${symbol.rustType()} which was not an event stream receiver\")\n            }\n        }\n    }\n\n    private fun signatureInfo(): RuntimeType =\n        RuntimeType.forInlineFun(\"SignatureInfo\", supportModule) {\n            rustTemplate(\n                \"\"\"\n                /// Information extracted from a signed event stream message\n                ##[non_exhaustive]\n                ##[derive(Debug, Clone, PartialEq)]\n                pub struct SignatureInfo {\n                    /// The chunk signature bytes from the `:chunk-signature` header\n                    pub chunk_signature: Vec<u8>,\n                    /// The timestamp from the `:date` header\n                    pub timestamp: #{SystemTime},\n                }\n                \"\"\",\n                \"SystemTime\" to RuntimeType.std.resolve(\"time::SystemTime\"),\n            )\n        }\n\n    private fun extractionError(runtimeConfig: RuntimeConfig): RuntimeType =\n        RuntimeType.forInlineFun(\"ExtractionError\", supportModule) {\n            rustTemplate(\n                \"\"\"\n                /// Error type for signed message extraction operations\n                ##[non_exhaustive]\n                ##[derive(Debug)]\n                pub enum ExtractionError {\n                    /// The payload could not be decoded as a valid message\n                    ##[non_exhaustive]\n                    InvalidPayload {\n                        error: #{EventStreamError},\n                    },\n                    /// The timestamp header is missing or has an invalid format\n                    ##[non_exhaustive]\n                    InvalidTimestamp,\n                }\n\n                impl #{Display} for ExtractionError {\n                    fn fmt(&self, f: &mut #{Formatter}<'_>) -> #{fmt_Result} {\n                        match self {\n                            ExtractionError::InvalidPayload { error } => {\n                                write!(f, \"invalid payload: {}\", error)\n                            }\n                            ExtractionError::InvalidTimestamp => {\n                                write!(f, \"invalid or missing timestamp header\")\n                            }\n                        }\n                    }\n                }\n\n                impl #{Error} for ExtractionError {\n                    fn source(&self) -> #{Option}<&(dyn #{Error} + 'static)> {\n                        match self {\n                            ExtractionError::InvalidPayload { error } => #{Some}(error),\n                            ExtractionError::InvalidTimestamp => #{None},\n                        }\n                    }\n                }\n                \"\"\",\n                \"EventStreamError\" to CargoDependency.smithyEventStream(runtimeConfig).toType().resolve(\"error::Error\"),\n                \"Display\" to RuntimeType.Display,\n                \"Formatter\" to RuntimeType.std.resolve(\"fmt::Formatter\"),\n                \"fmt_Result\" to RuntimeType.std.resolve(\"fmt::Result\"),\n                \"Error\" to RuntimeType.StdError,\n                *RuntimeType.preludeScope,\n            )\n        }\n\n    fun signedEventError(runtimeConfig: RuntimeConfig): RuntimeType =\n        RuntimeType.forInlineFun(\"SignedEventError\", supportModule) {\n            rustTemplate(\n                \"\"\"\n                /// Error wrapper for signed event stream errors\n                ##[derive(Debug)]\n                pub enum SignedEventError<E> {\n                    /// Error from the underlying event stream\n                    Event(E),\n                    /// Error extracting signed message\n                    InvalidSignedEvent(#{ExtractionError}),\n                }\n\n                impl<E> From<E> for SignedEventError<E> {\n                    fn from(err: E) -> Self {\n                        SignedEventError::Event(err)\n                    }\n                }\n                \"\"\",\n                \"ExtractionError\" to extractionError(runtimeConfig),\n            )\n        }\n\n    fun signedEvent(runtimeConfig: RuntimeConfig): RuntimeType =\n        RuntimeType.forInlineFun(\"SignedEvent\", supportModule) {\n            rustTemplate(\n                \"\"\"\n                /// Wrapper for event stream messages that may be signed\n                ##[derive(Debug, Clone)]\n                pub struct SignedEvent<T> {\n                    /// The actual event message\n                    pub message: T,\n                    /// Signature information if the message was signed\n                    pub signature: #{Option}<#{SignatureInfo}>,\n                }\n                \"\"\",\n                \"Option\" to RuntimeType.std.resolve(\"option::Option\"),\n                \"SignatureInfo\" to signatureInfo(),\n            )\n        }\n\n    private fun sigV4Unmarshaller(runtimeConfig: RuntimeConfig): RuntimeType =\n        RuntimeType.forInlineFun(\"SigV4Unmarshaller\", supportModule) {\n            rustTemplate(\n                \"\"\"\n                /// Unmarshaller wrapper that handles SigV4 signed event stream messages\n                ##[derive(Debug)]\n                pub struct SigV4Unmarshaller<T> {\n                    inner: T,\n                }\n\n                impl<T> SigV4Unmarshaller<T> {\n                    pub fn new(inner: T) -> Self {\n                        Self { inner }\n                    }\n                }\n\n                impl<T> #{UnmarshallMessage} for SigV4Unmarshaller<T>\n                where\n                    T: #{UnmarshallMessage},\n                {\n                    type Output = #{SignedEvent}<T::Output>;\n                    type Error = #{SignedEventError}<T::Error>;\n\n                    fn unmarshall(&self, message: &#{Message}) -> #{Result}<#{UnmarshalledMessage}<Self::Output, Self::Error>, #{EventStreamError}> {\n                        // First, try to extract the signed message\n                        match #{extract_signed_message}(message) {\n                            #{Ok}(MaybeSignedMessage::Signed { message: inner_message, signature }) => {\n                                // Process the inner message with the base unmarshaller\n                                match self.inner.unmarshall(&inner_message) {\n                                    #{Ok}(unmarshalled) => match unmarshalled {\n                                        #{UnmarshalledMessage}::Event(event) => {\n                                            #{Ok}(#{UnmarshalledMessage}::Event(#{SignedEvent} {\n                                                message: event,\n                                                signature: #{Some}(signature),\n                                            }))\n                                        }\n                                        #{UnmarshalledMessage}::Error(err) => {\n                                            #{Ok}(#{UnmarshalledMessage}::Error(#{SignedEventError}::Event(err)))\n                                        }\n                                    },\n                                    #{Err}(err) => #{Err}(err),\n                                }\n                            }\n                            #{Ok}(MaybeSignedMessage::Unsigned) => {\n                                // Process unsigned message directly\n                                match self.inner.unmarshall(message) {\n                                    #{Ok}(unmarshalled) => match unmarshalled {\n                                        #{UnmarshalledMessage}::Event(event) => {\n                                            #{Ok}(#{UnmarshalledMessage}::Event(#{SignedEvent} {\n                                                message: event,\n                                                signature: #{None},\n                                            }))\n                                        }\n                                        #{UnmarshalledMessage}::Error(err) => {\n                                            #{Ok}(#{UnmarshalledMessage}::Error(#{SignedEventError}::Event(err)))\n                                        }\n                                    },\n                                    #{Err}(err) => #{Err}(err),\n                                }\n                            }\n                            #{Err}(extraction_err) => #{Ok}(#{UnmarshalledMessage}::Error(#{SignedEventError}::InvalidSignedEvent(extraction_err))),\n                        }\n                    }\n                }\n                \"\"\",\n                \"UnmarshallMessage\" to\n                    CargoDependency.smithyEventStream(runtimeConfig).toType()\n                        .resolve(\"frame::UnmarshallMessage\"),\n                \"UnmarshalledMessage\" to\n                    CargoDependency.smithyEventStream(runtimeConfig).toType()\n                        .resolve(\"frame::UnmarshalledMessage\"),\n                \"Message\" to CargoDependency.smithyTypes(runtimeConfig).toType().resolve(\"event_stream::Message\"),\n                \"EventStreamError\" to CargoDependency.smithyEventStream(runtimeConfig).toType().resolve(\"error::Error\"),\n                \"SignedEvent\" to signedEvent(runtimeConfig),\n                \"SignedEventError\" to signedEventError(runtimeConfig),\n                \"extract_signed_message\" to extractSignedMessage(runtimeConfig),\n                *RuntimeType.preludeScope,\n            )\n        }\n\n    private fun sigV4Receiver(runtimeConfig: RuntimeConfig): RuntimeType =\n        RuntimeType.forInlineFun(\"SigV4Receiver\", supportModule) {\n            rustTemplate(\n                \"\"\"\n                /// Receiver wrapper that handles SigV4 signed event stream messages\n                ##[derive(Debug)]\n                pub struct SigV4Receiver<T, E> {\n                    inner: #{Receiver}<#{SignedEvent}<T>, #{SignedEventError}<E>>,\n                    initial_signature: #{Option}<#{SignatureInfo}>,\n                }\n\n                impl<T, E> SigV4Receiver<T, E> {\n                    pub fn new(\n                        unmarshaller: impl #{UnmarshallMessage}<Output = T, Error = E> + #{Send} + #{Sync} + 'static,\n                        body: #{SdkBody},\n                    ) -> Self {\n                        let sigv4_unmarshaller = #{SigV4Unmarshaller}::new(unmarshaller);\n                        Self {\n                            inner: #{Receiver}::new(sigv4_unmarshaller, body),\n                            initial_signature: #{None},\n                        }\n                    }\n\n                    /// Get the signature from the initial message, if it was signed\n                    pub fn initial_signature(&self) -> #{Option}<&#{SignatureInfo}> {\n                        self.initial_signature.as_ref()\n                    }\n\n                    /// Try to receive an initial message of the given type.\n                    /// Handles SigV4-wrapped messages by extracting the inner message first.\n                    pub async fn try_recv_initial(\n                        &mut self,\n                        message_type: #{event_stream}::InitialMessageType,\n                    ) -> #{Result}<#{Option}<#{Message}>, #{SdkError}<#{SignedEventError}<E>, #{RawMessage}>>\n                    where\n                        E: std::error::Error + 'static,\n                    {\n                        let result = self\n                            .inner\n                            .try_recv_initial_with_preprocessor(message_type, |message| {\n                                match #{extract_signed_message}(&message) {\n                                    #{Ok}(MaybeSignedMessage::Signed { message: inner, signature }) => {\n                                        #{Ok}((inner, #{Some}(signature)))\n                                    }\n                                    #{Ok}(MaybeSignedMessage::Unsigned) => #{Ok}((message, #{None})),\n                                    #{Err}(err) => #{Err}(#{ResponseError}::builder().raw(#{RawMessage}::Decoded(message)).source(err).build()),\n                                }\n                            })\n                            .await?;\n                        match result {\n                            #{Some}((message, signature)) => {\n                                self.initial_signature = signature;\n                                #{Ok}(#{Some}(message))\n                            }\n                            #{None} => #{Ok}(#{None}),\n                        }\n                    }\n\n                    /// Receive the next event from the stream\n                    /// The SigV4Unmarshaller handles unwrapping, so we just pass through\n                    pub async fn recv(&mut self) -> #{Result}<#{Option}<#{SignedEvent}<T>>, #{SdkError}<#{SignedEventError}<E>, #{RawMessage}>>\n                    where\n                        E: std::error::Error + 'static,\n                    {\n                        self.inner.recv().await\n                    }\n                }\n                \"\"\",\n                \"Receiver\" to RuntimeType.eventStreamReceiver(runtimeConfig),\n                \"SigV4Unmarshaller\" to sigV4Unmarshaller(runtimeConfig),\n                \"event_stream\" to RuntimeType.smithyHttp(runtimeConfig).resolve(\"event_stream\"),\n                \"SdkBody\" to RuntimeType.sdkBody(runtimeConfig),\n                \"Message\" to CargoDependency.smithyTypes(runtimeConfig).toType().resolve(\"event_stream::Message\"),\n                \"RawMessage\" to CargoDependency.smithyTypes(runtimeConfig).toType().resolve(\"event_stream::RawMessage\"),\n                \"SdkError\" to RuntimeType.sdkError(runtimeConfig),\n                \"ResponseError\" to\n                    RuntimeType.smithyRuntimeApiClient(runtimeConfig)\n                        .resolve(\"client::result::ResponseError\"),\n                \"UnmarshallMessage\" to\n                    CargoDependency.smithyEventStream(runtimeConfig).toType()\n                        .resolve(\"frame::UnmarshallMessage\"),\n                \"SignedEvent\" to signedEvent(runtimeConfig),\n                \"SignedEventError\" to signedEventError(runtimeConfig),\n                \"SignatureInfo\" to signatureInfo(),\n                \"extract_signed_message\" to extractSignedMessage(runtimeConfig),\n                *RuntimeType.preludeScope,\n            )\n        }\n\n    private fun extractSignedMessage(runtimeConfig: RuntimeConfig): RuntimeType =\n        RuntimeType.forInlineFun(\"extract_signed_message\", supportModule) {\n            rustTemplate(\n                \"\"\"\n                /// Result of extracting a potentially signed message\n                ##[derive(Debug)]\n                pub enum MaybeSignedMessage {\n                    /// Message was signed and has been extracted\n                    Signed {\n                        /// The inner message that was signed\n                        message: #{Message},\n                        /// Signature information from the outer message\n                        signature: #{SignatureInfo},\n                    },\n                    /// Message was not signed (no `:chunk-signature` header present)\n                    Unsigned,\n                }\n\n                /// Extracts the inner message from a potentially signed event stream message.\n                pub fn extract_signed_message(message: &#{Message}) -> #{Result}<MaybeSignedMessage, #{ExtractionError}> {\n                    // Check if message has chunk signature\n                    let mut chunk_signature = None;\n                    let mut timestamp = None;\n\n                    for header in message.headers() {\n                        match header.name().as_str() {\n                            \":chunk-signature\" => {\n                                if let #{HeaderValue}::ByteArray(bytes) = header.value() {\n                                    chunk_signature = Some(bytes.as_ref().to_vec());\n                                }\n                            }\n                            \":date\" => {\n                                if let #{HeaderValue}::Timestamp(ts) = header.value() {\n                                    timestamp = Some(\n                                        #{SystemTime}::try_from(*ts)\n                                            .map_err(|_err| #{ExtractionError}::InvalidTimestamp)?,\n                                    );\n                                } else {\n                                    return Err(#{ExtractionError}::InvalidTimestamp);\n                                }\n                            }\n                            _ => {}\n                        }\n                    }\n\n                    let Some(chunk_signature) = chunk_signature else {\n                        return Ok(MaybeSignedMessage::Unsigned);\n                    };\n\n                    let Some(timestamp) = timestamp else {\n                        return Err(#{ExtractionError}::InvalidTimestamp);\n                    };\n\n                    // Extract inner message\n                    let cursor = #{Cursor}::new(message.payload());\n                    let inner_message = #{read_message_from}(cursor)\n                        .map_err(|err| #{ExtractionError}::InvalidPayload { error: err })?;\n\n                    Ok(MaybeSignedMessage::Signed {\n                        message: inner_message,\n                        signature: #{SignatureInfo} {\n                            chunk_signature,\n                            timestamp,\n                        },\n                    })\n                }\n                \"\"\",\n                \"Message\" to CargoDependency.smithyTypes(runtimeConfig).toType().resolve(\"event_stream::Message\"),\n                \"HeaderValue\" to\n                    CargoDependency.smithyTypes(runtimeConfig).toType()\n                        .resolve(\"event_stream::HeaderValue\"),\n                \"SystemTime\" to RuntimeType.std.resolve(\"time::SystemTime\"),\n                \"Cursor\" to RuntimeType.std.resolve(\"io::Cursor\"),\n                \"read_message_from\" to\n                    CargoDependency.smithyEventStream(runtimeConfig).toType()\n                        .resolve(\"frame::read_message_from\"),\n                \"SignatureInfo\" to signatureInfo(),\n                \"ExtractionError\" to extractionError(runtimeConfig),\n                *RuntimeType.preludeScope,\n            )\n        }\n}\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/customizations/SmithyValidationExceptionDecorator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.customizations\n\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.MapShape\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.model.shapes.StringShape\nimport software.amazon.smithy.model.traits.EnumTrait\nimport software.amazon.smithy.model.traits.LengthTrait\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.join\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlockTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.withBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.util.getTrait\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenContext\nimport software.amazon.smithy.rust.codegen.server.smithy.customize.ServerCodegenDecorator\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.BlobLength\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.CollectionTraitInfo\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.ConstraintViolation\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.Range\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.StringTraitInfo\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.TraitInfo\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.UnionConstraintTraitInfo\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.ValidationExceptionConversionGenerator\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.isKeyConstrained\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.isValueConstrained\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.protocol.ServerProtocol\nimport software.amazon.smithy.rust.codegen.server.smithy.validationErrorMessage\n\n/**\n * A decorator that adds code to convert from constraint violations to Smithy's `smithy.framework#ValidationException`,\n * defined in [0]. This is Smithy's recommended shape to return when validation fails.\n *\n * This decorator is always enabled when using the `rust-server-codegen` plugin.\n *\n * [0]: https://github.com/awslabs/smithy/tree/main/smithy-validation-model\n *\n * TODO(https://github.com/smithy-lang/smithy-rs/pull/2053): once the RFC is implemented, consider moving this back into the\n *  generators.\n */\nclass SmithyValidationExceptionDecorator : ServerCodegenDecorator {\n    override val name: String\n        get() = \"SmithyValidationExceptionDecorator\"\n    override val order: Byte\n        get() = 69\n\n    override fun validationExceptionConversion(\n        codegenContext: ServerCodegenContext,\n    ): ValidationExceptionConversionGenerator = SmithyValidationExceptionConversionGenerator(codegenContext)\n}\n\nclass SmithyValidationExceptionConversionGenerator(private val codegenContext: ServerCodegenContext) :\n    ValidationExceptionConversionGenerator {\n    // Define a companion object so that we can refer to this shape id globally.\n    companion object {\n        val SHAPE_ID: ShapeId = ShapeId.from(\"smithy.framework#ValidationException\")\n    }\n\n    override val shapeId: ShapeId = SHAPE_ID\n\n    override fun renderImplFromConstraintViolationForRequestRejection(protocol: ServerProtocol): Writable =\n        writable {\n            rustTemplate(\n                \"\"\"\n                impl #{From}<ConstraintViolation> for #{RequestRejection} {\n                    fn from(constraint_violation: ConstraintViolation) -> Self {\n                        let first_validation_exception_field = constraint_violation.as_validation_exception_field(\"\".to_owned());\n                        let validation_exception = crate::error::ValidationException {\n                            message: format!(\"1 validation error detected. {}\", &first_validation_exception_field.message),\n                            field_list: Some(vec![first_validation_exception_field]),\n                        };\n                        Self::ConstraintViolation(\n                            crate::protocol_serde::shape_validation_exception::ser_validation_exception_error(&validation_exception)\n                                .expect(\"validation exceptions should never fail to serialize; please file a bug report under https://github.com/smithy-lang/smithy-rs/issues\")\n                        )\n                    }\n                }\n                \"\"\",\n                \"RequestRejection\" to protocol.requestRejection(codegenContext.runtimeConfig),\n                \"From\" to RuntimeType.From,\n            )\n        }\n\n    override fun stringShapeConstraintViolationImplBlock(stringConstraintsInfo: Collection<StringTraitInfo>): Writable =\n        writable {\n            val constraintsInfo: List<TraitInfo> = stringConstraintsInfo.map(StringTraitInfo::toTraitInfo)\n\n            rustTemplate(\n                \"\"\"\n                pub(crate) fn as_validation_exception_field(self, path: #{String}) -> crate::model::ValidationExceptionField {\n                    match self {\n                        #{ValidationExceptionFields:W}\n                    }\n                }\n                \"\"\",\n                \"String\" to RuntimeType.String,\n                \"ValidationExceptionFields\" to constraintsInfo.map { it.asValidationExceptionField }.join(\"\\n\"),\n            )\n        }\n\n    override fun blobShapeConstraintViolationImplBlock(blobConstraintsInfo: Collection<BlobLength>): Writable =\n        writable {\n            val constraintsInfo: List<TraitInfo> = blobConstraintsInfo.map(BlobLength::toTraitInfo)\n\n            rustTemplate(\n                \"\"\"\n                pub(crate) fn as_validation_exception_field(self, path: #{String}) -> crate::model::ValidationExceptionField {\n                    match self {\n                        #{ValidationExceptionFields:W}\n                    }\n                }\n                \"\"\",\n                \"String\" to RuntimeType.String,\n                \"ValidationExceptionFields\" to constraintsInfo.map { it.asValidationExceptionField }.join(\"\\n\"),\n            )\n        }\n\n    override fun mapShapeConstraintViolationImplBlock(\n        shape: MapShape,\n        keyShape: StringShape,\n        valueShape: Shape,\n        symbolProvider: RustSymbolProvider,\n        model: Model,\n    ) = writable {\n        rustBlockTemplate(\n            \"pub(crate) fn as_validation_exception_field(self, path: #{String}) -> crate::model::ValidationExceptionField\",\n            \"String\" to RuntimeType.String,\n        ) {\n            rustBlock(\"match self\") {\n                shape.getTrait<LengthTrait>()?.also {\n                    rust(\n                        \"\"\"\n                        Self::Length(length) => crate::model::ValidationExceptionField {\n                            message: format!(\"${it.validationErrorMessage()}\", length, &path),\n                            path,\n                        },\"\"\",\n                    )\n                }\n                if (isKeyConstrained(keyShape, symbolProvider)) {\n                    // Note how we _do not_ append the key's member name to the path. This is intentional, as\n                    // per the `RestJsonMalformedLengthMapKey` test. Note keys are always strings.\n                    // https://github.com/awslabs/smithy/blob/ee0b4ff90daaaa5101f32da936c25af8c91cc6e9/smithy-aws-protocol-tests/model/restJson1/validation/malformed-length.smithy#L296-L295\n                    rust(\"\"\"Self::Key(key_constraint_violation) => key_constraint_violation.as_validation_exception_field(path),\"\"\")\n                }\n                if (isValueConstrained(valueShape, model, symbolProvider)) {\n                    // `as_str()` works with regular `String`s and constrained string shapes.\n                    rust(\"\"\"Self::Value(key, value_constraint_violation) => value_constraint_violation.as_validation_exception_field(path + \"/\" + key.as_str()),\"\"\")\n                }\n            }\n        }\n    }\n\n    override fun enumShapeConstraintViolationImplBlock(enumTrait: EnumTrait) =\n        writable {\n            // Escape `#` as `##` because `#` is the formatting character in rustTemplate\n            val message = enumTrait.validationErrorMessage().replace(\"#\", \"##\")\n            rustTemplate(\n                \"\"\"\n                pub(crate) fn as_validation_exception_field(self, path: #{String}) -> crate::model::ValidationExceptionField {\n                    crate::model::ValidationExceptionField {\n                        message: format!(r##\"$message\"##, &path),\n                        path,\n                    }\n                }\n                \"\"\",\n                \"String\" to RuntimeType.String,\n            )\n        }\n\n    override fun numberShapeConstraintViolationImplBlock(rangeInfo: Range) =\n        writable {\n            rustTemplate(\n                \"\"\"\n                pub(crate) fn as_validation_exception_field(self, path: #{String}) -> crate::model::ValidationExceptionField {\n                    match self {\n                        #{ValidationExceptionFields:W}\n                    }\n                }\n                \"\"\",\n                \"String\" to RuntimeType.String,\n                \"ValidationExceptionFields\" to rangeInfo.toTraitInfo().asValidationExceptionField,\n            )\n        }\n\n    override fun builderConstraintViolationFn(constraintViolations: Collection<ConstraintViolation>) =\n        writable {\n            rustBlockTemplate(\n                \"pub(crate) fn as_validation_exception_field(self, path: #{String}) -> crate::model::ValidationExceptionField\",\n                \"String\" to RuntimeType.String,\n            ) {\n                rustBlock(\"match self\") {\n                    constraintViolations.forEach {\n                        if (it.hasInner()) {\n                            rust(\"\"\"ConstraintViolation::${it.name()}(inner) => inner.as_validation_exception_field(path + \"/${it.forMember.memberName}\"),\"\"\")\n                        } else {\n                            rust(\n                                \"\"\"\n                                ConstraintViolation::${it.name()} => crate::model::ValidationExceptionField {\n                                    message: format!(\"Value at '{}/${it.forMember.memberName}' failed to satisfy constraint: Member must not be null\", path),\n                                    path: path + \"/${it.forMember.memberName}\",\n                                },\n                                \"\"\",\n                            )\n                        }\n                    }\n                }\n            }\n        }\n\n    override fun collectionShapeConstraintViolationImplBlock(\n        collectionConstraintsInfo: Collection<CollectionTraitInfo>,\n        isMemberConstrained: Boolean,\n    ) = writable {\n        val validationExceptionFields =\n            collectionConstraintsInfo.map {\n                it.toTraitInfo().asValidationExceptionField\n            }.toMutableList()\n        if (isMemberConstrained) {\n            validationExceptionFields += {\n                rust(\n                    \"\"\"Self::Member(index, member_constraint_violation) =>\n                    member_constraint_violation.as_validation_exception_field(path + \"/\" + &index.to_string())\n                    \"\"\",\n                )\n            }\n        }\n        rustTemplate(\n            \"\"\"\n            pub(crate) fn as_validation_exception_field(self, path: #{String}) -> crate::model::ValidationExceptionField {\n                match self {\n                    #{AsValidationExceptionFields:W}\n                }\n            }\n            \"\"\",\n            \"String\" to RuntimeType.String,\n            \"AsValidationExceptionFields\" to validationExceptionFields.join(\"\"),\n        )\n    }\n\n    override fun unionShapeConstraintViolationImplBlock(\n        unionConstraintTraitInfo: Collection<UnionConstraintTraitInfo>,\n    ) = writable {\n        rustBlockTemplate(\n            \"pub(crate) fn as_validation_exception_field(self, path: #{String}) -> crate::model::ValidationExceptionField\",\n            \"String\" to RuntimeType.String,\n        ) {\n            withBlock(\"match self {\", \"}\") {\n                for (constraintViolation in unionConstraintTraitInfo) {\n                    rust(\"\"\"Self::${constraintViolation.name()}(inner) => inner.as_validation_exception_field(path + \"/${constraintViolation.forMember.memberName}\"),\"\"\")\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/customizations/UserProvidedValidationExceptionDecorator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.customizations\n\nimport software.amazon.smithy.codegen.core.CodegenException\nimport software.amazon.smithy.framework.rust.ValidationExceptionTrait\nimport software.amazon.smithy.framework.rust.ValidationFieldListTrait\nimport software.amazon.smithy.framework.rust.ValidationFieldMessageTrait\nimport software.amazon.smithy.framework.rust.ValidationFieldNameTrait\nimport software.amazon.smithy.framework.rust.ValidationMessageTrait\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.SourceLocation\nimport software.amazon.smithy.model.shapes.MapShape\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.ServiceShape\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.model.shapes.StringShape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.traits.EnumTrait\nimport software.amazon.smithy.model.traits.LengthTrait\nimport software.amazon.smithy.model.traits.PatternTrait\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlockTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.withBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\nimport software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.shapeModuleName\nimport software.amazon.smithy.rust.codegen.core.util.dq\nimport software.amazon.smithy.rust.codegen.core.util.getTrait\nimport software.amazon.smithy.rust.codegen.core.util.targetShape\nimport software.amazon.smithy.rust.codegen.core.util.toSnakeCase\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenContext\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerRustSettings\nimport software.amazon.smithy.rust.codegen.server.smithy.customize.ServerCodegenDecorator\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.BlobLength\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.CollectionTraitInfo\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.ConstraintViolation\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.Length\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.Pattern\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.Range\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.StringTraitInfo\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.UnionConstraintTraitInfo\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.ValidationExceptionConversionGenerator\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.isKeyConstrained\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.isValueConstrained\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.protocol.ServerProtocol\nimport software.amazon.smithy.rust.codegen.server.smithy.util.isValidationFieldName\nimport software.amazon.smithy.rust.codegen.server.smithy.util.isValidationMessage\nimport software.amazon.smithy.rust.codegen.server.smithy.validationErrorMessage\nimport java.util.stream.Collectors\n\n/**\n * Decorator for user provided validation exception codegen\n *\n * The order of this is less than that of [SmithyValidationExceptionDecorator] so it takes precedence regardless of the\n * order decorators are passed into the plugin\n */\nclass UserProvidedValidationExceptionDecorator : ServerCodegenDecorator {\n    override val name: String\n        get() = \"UserProvidedValidationExceptionDecorator\"\n    override val order: Byte\n        get() = 68\n\n    override fun validationExceptionConversion(\n        codegenContext: ServerCodegenContext,\n    ): ValidationExceptionConversionGenerator? =\n        firstStructureShapeWithValidationExceptionTrait(codegenContext.model)?.let {\n            UserProvidedValidationExceptionConversionGenerator(\n                codegenContext,\n                it,\n                validationMessageMember(it),\n                maybeValidationFieldList(codegenContext.model, it),\n                additionalFieldMembers(it),\n            )\n        }\n\n    internal fun firstStructureShapeWithValidationExceptionTrait(model: Model): StructureShape? =\n        model\n            .shapes(StructureShape::class.java)\n            .collect(Collectors.toList())\n            // Defining multiple validation exceptions is unsupported. See `ValidateUnsupportedConstraints`\n            .firstOrNull({ it.hasTrait(ValidationExceptionTrait.ID) })\n\n    internal fun validationMessageMember(validationExceptionStructure: StructureShape): MemberShape =\n        validationExceptionStructure\n            .members()\n            .firstOrNull { it.isValidationMessage() }\n            ?: throw CodegenException(\"Expected `$validationExceptionStructure` to contain a member named `message` or annotated with the `@validationMessageTrait`\")\n\n    internal fun additionalFieldMembers(validationExceptionStructure: StructureShape): List<MemberShape> =\n        validationExceptionStructure.members().filter { member ->\n            !member.isValidationMessage() &&\n                !member.hasTrait(\n                    ValidationFieldListTrait.ID,\n                )\n        }\n\n    /**\n     * Returns a [ValidationFieldList] if the following exist:\n     * - A structure type representing the field\n     * - A list type representing the field list with a single member targeting the field type\n     * - A member in the validation exception structure annotated with `@validationFieldList` targeting the list type\n     *\n     * Returns null if there is no member annotated with the `@validationFieldList` trait in the given validation exception structure\n     * Otherwise, throws a [CodegenException] if it exists, but is misconfigured\n     */\n    internal fun maybeValidationFieldList(\n        model: Model,\n        validationExceptionStructure: StructureShape,\n    ): ValidationFieldList? {\n        val validationFieldListMember =\n            validationExceptionStructure\n                .members()\n                .firstOrNull { it.hasTrait(ValidationFieldListTrait.ID) }\n                ?: return null\n\n        val validationFieldListShape =\n            validationFieldListMember\n                .targetShape(model)\n                .asListShape()\n                .orElseThrow {\n                    CodegenException(\"Expected `$validationFieldListMember` to target a list type\")\n                }\n\n        val validationFieldListShapeMember =\n            validationFieldListShape.members().singleOrNull()\n                ?: throw CodegenException(\"Expected `$validationFieldListShape` to have a single member\")\n\n        val validationFieldStructure =\n            validationFieldListShapeMember\n                .targetShape(model)\n                .asStructureShape()\n                .orElseThrow {\n                    CodegenException(\"Expected $validationFieldListShapeMember to target a structure type\")\n                }\n\n        // It is required that a member of the user provided validation field structure has @validationFieldName\n        val validationFieldNameMember =\n            validationFieldStructure\n                .members()\n                .firstOrNull { it.isValidationFieldName() }\n                ?: throw CodegenException(\n                    \"Expected `$validationFieldStructure` to contain a member explicitly\" +\n                        \" annotated with the `@validationFieldName` trait, or with the name \\\"name\\\"\",\n                )\n\n        val maybeValidationFieldMessageMember =\n            validationFieldStructure\n                .members()\n                .firstOrNull { it.hasTrait(ValidationFieldMessageTrait.ID) }\n\n        return ValidationFieldList(\n            validationFieldListMember,\n            validationFieldStructure,\n            validationFieldNameMember,\n            maybeValidationFieldMessageMember,\n        )\n    }\n\n    override fun transformModel(\n        service: ServiceShape,\n        model: Model,\n        settings: ServerRustSettings,\n    ): Model {\n        val validationExceptionStructure = firstStructureShapeWithValidationExceptionTrait(model) ?: return model\n        annotateValidationMessageMember(validationExceptionStructure)\n        maybeValidationFieldList(model, validationExceptionStructure)?.let {\n            annotateValidationFieldName(it)\n        }\n\n        return model\n    }\n\n    /**\n     * Annotates the \"message\" member of the validation exception structure with @validationMessage when there is no\n     * explicitly annotated member\n     */\n    internal fun annotateValidationMessageMember(validationExceptionStructure: StructureShape) {\n        val member = validationMessageMember(validationExceptionStructure)\n        if (!member.hasTrait(ValidationMessageTrait.ID)) {\n            // When there is no field annotated with the @validationMessage trait, we will annotate the field named \"message\"\n            member.toBuilder().addTrait(ValidationMessageTrait(SourceLocation.none()))\n        }\n    }\n\n    /**\n     * Annotates the \"name\" member of the validation field structure with @validationFieldName when there is no\n     * explicitly annotated member\n     */\n    internal fun annotateValidationFieldName(validationFieldList: ValidationFieldList) {\n        val member = validationFieldList.validationFieldNameMember\n        if (!member.hasTrait(ValidationFieldNameTrait.ID)) {\n            // When there is no field annotated with the @validationMessage trait, we will annotate the field named \"name\"\n            member.toBuilder().addTrait(ValidationFieldNameTrait(SourceLocation.none()))\n        }\n    }\n}\n\nclass UserProvidedValidationExceptionConversionGenerator(\n    private val codegenContext: ServerCodegenContext,\n    private val validationExceptionStructure: StructureShape,\n    private val validationMessageMember: MemberShape,\n    private val maybeValidationFieldList: ValidationFieldList?,\n    private val additionalFieldMembers: List<MemberShape>,\n) : ValidationExceptionConversionGenerator {\n    private val codegenScope =\n        listOfNotNull(maybeValidationFieldList?.validationFieldStructure)\n            .map {\n                \"ValidationExceptionField\" to codegenContext.symbolProvider.toSymbol(it)\n            }.toTypedArray()\n\n    companion object {\n        val SHAPE_ID: ShapeId = ShapeId.from(\"smithy.framework#UserProvidedValidationException\")\n    }\n\n    override val shapeId: ShapeId = SHAPE_ID\n\n    override fun renderImplFromConstraintViolationForRequestRejection(protocol: ServerProtocol): Writable =\n        writable {\n            val validationMessageName = codegenContext.symbolProvider.toMemberName(validationMessageMember)\n            // Generate the correct shape module name for the user provided validation exception\n            val shapeModuleName =\n                codegenContext.symbolProvider.shapeModuleName(codegenContext.serviceShape, validationExceptionStructure)\n            val shapeFunctionName = validationExceptionStructure.id.name.toSnakeCase()\n\n            rustTemplate(\n                \"\"\"\n                impl #{From}<ConstraintViolation> for #{RequestRejection} {\n                    fn from(constraint_violation: ConstraintViolation) -> Self {\n                        #{FieldCreation}\n                        let validation_exception = #{ValidationException} {\n                            $validationMessageName: #{ValidationMessage},\n                            #{FieldListAssignment}\n                            #{AdditionalFieldAssignments}\n                        };\n                        Self::ConstraintViolation(\n                            crate::protocol_serde::$shapeModuleName::ser_${shapeFunctionName}_error(&validation_exception)\n                                .expect(\"validation exceptions should never fail to serialize; please file a bug report under https://github.com/smithy-lang/smithy-rs/issues\")\n                        )\n                    }\n                }\n                \"\"\",\n                *preludeScope,\n                \"RequestRejection\" to protocol.requestRejection(codegenContext.runtimeConfig),\n                \"ValidationException\" to codegenContext.symbolProvider.toSymbol(validationExceptionStructure),\n                \"FieldCreation\" to\n                    writable {\n                        if (maybeValidationFieldList != null) {\n                            rust(\"\"\"let first_validation_exception_field = constraint_violation.as_validation_exception_field(\"\".to_owned());\"\"\")\n                        }\n                    },\n                \"ValidationMessage\" to\n                    writable {\n                        val message =\n                            maybeValidationFieldList?.maybeValidationFieldMessageMember?.let {\n                                val validationFieldMessageName =\n                                    codegenContext.symbolProvider.toMemberName(it)\n                                if (it.isOptional) {\n                                    \"\"\"format!(\"validation error detected. {}\", &first_validation_exception_field.$validationFieldMessageName.clone().unwrap_or_default())\"\"\"\n                                } else {\n                                    \"\"\"format!(\"validation error detected. {}\", &first_validation_exception_field.$validationFieldMessageName)\"\"\"\n                                }\n                            } ?: \"\"\"format!(\"validation error detected\")\"\"\"\n                        rust(validationMessageMember.wrapValueIfOptional(message))\n                    },\n                \"FieldListAssignment\" to\n                    writable {\n                        maybeValidationFieldList?.validationFieldListMember?.let {\n                            val fieldName =\n                                codegenContext.symbolProvider.toMemberName(it)\n                            val value = it.wrapValueIfOptional(\"vec![first_validation_exception_field]\")\n                            rust(\"$fieldName: $value,\")\n                        }\n                    },\n                \"AdditionalFieldAssignments\" to\n                    writable {\n                        rust(\n                            additionalFieldMembers.joinToString { member ->\n                                val memberName = codegenContext.symbolProvider.toMemberName(member)!!\n                                \"$memberName: ${defaultFieldAssignment(member)}\"\n                            },\n                        )\n                    },\n            )\n        }\n\n    override fun stringShapeConstraintViolationImplBlock(stringConstraintsInfo: Collection<StringTraitInfo>): Writable {\n        val validationFieldList = maybeValidationFieldList ?: return writable { }\n\n        return writable {\n            val fieldAssignments = generateUserProvidedValidationFieldAssignments(validationFieldList)\n\n            rustTemplate(\n                \"\"\"\n                pub(crate) fn as_validation_exception_field(self, path: #{String}) -> #{ValidationExceptionField} {\n                    match self {\n                        #{ValidationExceptionFields}\n                    }\n                }\n                \"\"\",\n                *preludeScope,\n                *codegenScope,\n                \"ValidationExceptionFields\" to\n                    writable {\n                        stringConstraintsInfo.forEach { stringTraitInfo ->\n                            when (stringTraitInfo) {\n                                is Length -> {\n                                    val lengthTrait =\n                                        stringTraitInfo::class.java\n                                            .getDeclaredField(\"lengthTrait\")\n                                            .apply { isAccessible = true }\n                                            .get(stringTraitInfo) as LengthTrait\n                                    rustTemplate(\n                                        \"\"\"\n                                        ##[allow(unused_variables)]\n                                        Self::Length(length) => #{ValidationExceptionField} {\n                                            #{FieldAssignments}\n                                        },\n                                        \"\"\",\n                                        *codegenScope,\n                                        \"FieldAssignments\" to\n                                            fieldAssignments(\n                                                \"path.clone()\",\n                                                \"format!(${lengthTrait.validationErrorMessage().dq()}, length, &path)\",\n                                            ),\n                                    )\n                                }\n\n                                is Pattern -> {\n                                    val patternTrait =\n                                        stringTraitInfo::class.java\n                                            .getDeclaredField(\"patternTrait\")\n                                            .apply { isAccessible = true }\n                                            .get(stringTraitInfo) as PatternTrait\n                                    rustTemplate(\n                                        \"\"\"\n                                        Self::Pattern(_) => #{ValidationExceptionField} {\n                                            #{FieldAssignments}\n                                        },\n                                        \"\"\",\n                                        *codegenScope,\n                                        \"FieldAssignments\" to\n                                            fieldAssignments(\n                                                \"path.clone()\",\n                                                \"format!(${\n                                                    patternTrait.validationErrorMessage().dq()\n                                                }, &path, ${patternTrait.pattern.toString().dq()})\",\n                                            ),\n                                    )\n                                }\n                            }\n                        }\n                    },\n            )\n        }\n    }\n\n    override fun blobShapeConstraintViolationImplBlock(blobConstraintsInfo: Collection<BlobLength>): Writable {\n        val validationFieldList = maybeValidationFieldList ?: return writable { }\n\n        return writable {\n            rustTemplate(\n                \"\"\"\n                pub(crate) fn as_validation_exception_field(self, path: #{String}) -> #{ValidationExceptionField} {\n                    match self {\n                        #{ValidationExceptionFields}\n                    }\n                }\n                \"\"\",\n                *preludeScope,\n                *codegenScope,\n                \"ValidationExceptionFields\" to\n                    writable {\n                        val fieldAssignments =\n                            generateUserProvidedValidationFieldAssignments(validationFieldList)\n                        blobConstraintsInfo.forEach { blobLength ->\n                            rustTemplate(\n                                \"\"\"\n                                ##[allow(unused_variables)]\n                                Self::Length(length) => #{ValidationExceptionField} {\n                                    #{FieldAssignments}\n                                },\n                                \"\"\",\n                                *codegenScope,\n                                \"FieldAssignments\" to\n                                    fieldAssignments(\n                                        \"path.clone()\",\n                                        \"format!(${\n                                            blobLength.lengthTrait.validationErrorMessage().dq()\n                                        }, length, &path)\",\n                                    ),\n                            )\n                        }\n                    },\n            )\n        }\n    }\n\n    override fun mapShapeConstraintViolationImplBlock(\n        shape: MapShape,\n        keyShape: StringShape,\n        valueShape: Shape,\n        symbolProvider: RustSymbolProvider,\n        model: Model,\n    ): Writable {\n        val validationFieldList = maybeValidationFieldList ?: return writable { }\n\n        return writable {\n            val fieldAssignments = generateUserProvidedValidationFieldAssignments(validationFieldList)\n\n            rustBlockTemplate(\n                \"pub(crate) fn as_validation_exception_field(self, path: #{String}) -> #{ValidationExceptionField}\",\n                *preludeScope,\n                *codegenScope,\n            ) {\n                rustBlock(\"match self\") {\n                    shape.getTrait<LengthTrait>()?.also {\n                        rustTemplate(\n                            \"\"\"\n                            ##[allow(unused_variables)]\n                            Self::Length(length) => #{ValidationExceptionField} {\n                                #{FieldAssignments}\n                            },\"\"\",\n                            *codegenScope,\n                            \"FieldAssignments\" to\n                                fieldAssignments(\n                                    \"path.clone()\",\n                                    \"\"\"format!(${it.validationErrorMessage().dq()}, length, &path)\"\"\",\n                                ),\n                        )\n                    }\n                    if (isKeyConstrained(keyShape, symbolProvider)) {\n                        rust(\"\"\"Self::Key(key_constraint_violation) => key_constraint_violation.as_validation_exception_field(path),\"\"\")\n                    }\n                    if (isValueConstrained(valueShape, model, symbolProvider)) {\n                        rust(\"\"\"Self::Value(key, value_constraint_violation) => value_constraint_violation.as_validation_exception_field(path + \"/\" + key.as_str()),\"\"\")\n                    }\n                }\n            }\n        }\n    }\n\n    override fun enumShapeConstraintViolationImplBlock(enumTrait: EnumTrait): Writable {\n        val validationFieldList = maybeValidationFieldList ?: return writable { }\n\n        return writable {\n            val fieldAssignments = generateUserProvidedValidationFieldAssignments(validationFieldList)\n            val message = enumTrait.validationErrorMessage()\n\n            rustTemplate(\n                \"\"\"\n                pub(crate) fn as_validation_exception_field(self, path: #{String}) -> #{ValidationExceptionField} {\n                    #{ValidationExceptionField} {\n                        #{FieldAssignments}\n                    }\n                }\n                \"\"\",\n                *preludeScope,\n                *codegenScope,\n                \"FieldAssignments\" to fieldAssignments(\"path.clone()\", \"\"\"format!(r##\"$message\"##, &path)\"\"\"),\n            )\n        }\n    }\n\n    override fun numberShapeConstraintViolationImplBlock(rangeInfo: Range): Writable {\n        val validationFieldList = maybeValidationFieldList ?: return writable { }\n\n        return writable {\n            val fieldAssignments = generateUserProvidedValidationFieldAssignments(validationFieldList)\n\n            rustTemplate(\n                \"\"\"\n                pub(crate) fn as_validation_exception_field(self, path: #{String}) -> #{ValidationExceptionField} {\n                    match self {\n                        Self::Range(_) => #{ValidationExceptionField} {\n                            #{FieldAssignments}\n                        },\n                    }\n                }\n                \"\"\",\n                *preludeScope,\n                *codegenScope,\n                \"FieldAssignments\" to\n                    fieldAssignments(\n                        \"path.clone()\",\n                        \"\"\"format!(${rangeInfo.rangeTrait.validationErrorMessage().dq()}, &path)\"\"\",\n                    ),\n            )\n        }\n    }\n\n    override fun builderConstraintViolationFn(constraintViolations: Collection<ConstraintViolation>): Writable {\n        val validationFieldList = maybeValidationFieldList ?: return writable { }\n\n        return writable {\n            val fieldAssignments = generateUserProvidedValidationFieldAssignments(validationFieldList)\n\n            rustBlockTemplate(\n                \"pub(crate) fn as_validation_exception_field(self, path: #{String}) -> #{ValidationExceptionField}\",\n                *preludeScope,\n                *codegenScope,\n            ) {\n                rustBlock(\"match self\") {\n                    constraintViolations.forEach {\n                        if (it.hasInner()) {\n                            rust(\"\"\"ConstraintViolation::${it.name()}(inner) => inner.as_validation_exception_field(path + \"/${it.forMember.memberName}\"),\"\"\")\n                        } else {\n                            rustTemplate(\n                                \"\"\"\n                                ConstraintViolation::${it.name()} => #{ValidationExceptionField} {\n                                    #{FieldAssignments}\n                                },\n                                \"\"\",\n                                *codegenScope,\n                                \"FieldAssignments\" to\n                                    fieldAssignments(\n                                        \"\"\"path.clone() + \"/${it.forMember.memberName}\"\"\"\",\n                                        \"\"\"format!(\"Value at '{}/${it.forMember.memberName}' failed to satisfy constraint: Member must not be null\", path)\"\"\",\n                                    ),\n                            )\n                        }\n                    }\n                }\n            }\n        }\n    }\n\n    override fun collectionShapeConstraintViolationImplBlock(\n        collectionConstraintsInfo: Collection<CollectionTraitInfo>,\n        isMemberConstrained: Boolean,\n    ): Writable {\n        val validationFieldList = maybeValidationFieldList ?: return writable { }\n\n        return writable {\n            val fieldAssignments = generateUserProvidedValidationFieldAssignments(validationFieldList)\n\n            rustTemplate(\n                \"\"\"\n                pub(crate) fn as_validation_exception_field(self, path: #{String}) -> #{ValidationExceptionField} {\n                    match self {\n                        #{ValidationExceptionFields}\n                    }\n                }\n                \"\"\",\n                *preludeScope,\n                *codegenScope,\n                \"ValidationExceptionFields\" to\n                    writable {\n                        collectionConstraintsInfo.forEach { collectionTraitInfo ->\n                            when (collectionTraitInfo) {\n                                is CollectionTraitInfo.Length -> {\n                                    rustTemplate(\n                                        \"\"\"\n                                        ##[allow(unused_variables)]\n                                        Self::Length(length) => #{ValidationExceptionField} {\n                                            #{FieldAssignments}\n                                        },\n                                        \"\"\",\n                                        *codegenScope,\n                                        \"FieldAssignments\" to\n                                            fieldAssignments(\n                                                \"path.clone()\",\n                                                \"format!(${\n                                                    collectionTraitInfo.lengthTrait.validationErrorMessage()\n                                                        .dq()\n                                                }, length, &path)\",\n                                            ),\n                                    )\n                                }\n\n                                is CollectionTraitInfo.UniqueItems -> {\n                                    rustTemplate(\n                                        \"\"\"\n                                        Self::UniqueItems { duplicate_indices, .. } => #{ValidationExceptionField} {\n                                            #{FieldAssignments}\n                                        },\n                                        \"\"\",\n                                        *codegenScope,\n                                        \"FieldAssignments\" to\n                                            fieldAssignments(\n                                                \"path.clone()\",\n                                                \"\"\"\n                                                format!(\n                                                    ${\n                                                    collectionTraitInfo.uniqueItemsTrait.validationErrorMessage().dq()\n                                                },\n                                                    &duplicate_indices,\n                                                    &path\n                                                )\n                                                \"\"\",\n                                            ),\n                                    )\n                                }\n                            }\n                        }\n\n                        if (isMemberConstrained) {\n                            rust(\n                                \"\"\"Self::Member(index, member_constraint_violation) =>\n                                member_constraint_violation.as_validation_exception_field(path + \"/\" + &index.to_string())\n                                \"\"\",\n                            )\n                        }\n                    },\n            )\n        }\n    }\n\n    override fun unionShapeConstraintViolationImplBlock(\n        unionConstraintTraitInfo: Collection<UnionConstraintTraitInfo>,\n    ): Writable {\n        maybeValidationFieldList ?: return writable { }\n\n        return writable {\n            rustBlockTemplate(\n                \"pub(crate) fn as_validation_exception_field(self, path: #{String}) -> #{ValidationExceptionField}\",\n                *preludeScope,\n                *codegenScope,\n            ) {\n                withBlock(\"match self {\", \"}\") {\n                    for (constraintViolation in unionConstraintTraitInfo) {\n                        rust(\"\"\"Self::${constraintViolation.name()}(inner) => inner.as_validation_exception_field(path + \"/${constraintViolation.forMember.memberName}\"),\"\"\")\n                    }\n                }\n            }\n        }\n    }\n\n    /**\n     * Helper function to generate field assignments for user provided validation exception fields\n     */\n    private fun generateUserProvidedValidationFieldAssignments(\n        validationFieldList: ValidationFieldList,\n    ): (String, String) -> Writable =\n        { rawPathExpression: String, rawMessageExpression: String ->\n            writable {\n                rustTemplate(\n                    validationFieldList.validationFieldStructure.members().joinToString(\",\") { member ->\n                        val memberName = codegenContext.symbolProvider.toMemberName(member)\n                        val pathExpression = member.wrapValueIfOptional(rawPathExpression)\n                        val messageExpression = member.wrapValueIfOptional(rawMessageExpression)\n                        when {\n                            member.isValidationFieldName() ->\n                                \"$memberName: $pathExpression\"\n\n                            member.hasTrait(ValidationFieldMessageTrait.ID) ->\n                                \"$memberName: $messageExpression\"\n\n                            else -> {\n                                \"$memberName: ${defaultFieldAssignment(member)}\"\n                            }\n                        }\n                    },\n                )\n            }\n        }\n\n    private fun defaultFieldAssignment(member: MemberShape): String {\n        val targetShape = member.targetShape(codegenContext.model)\n        return member.getTrait<software.amazon.smithy.model.traits.DefaultTrait>()?.toNode()?.let { node ->\n            when {\n                targetShape.isEnumShape && node.isStringNode -> {\n                    val enumShape = targetShape.asEnumShape().get()\n                    val enumSymbol = codegenContext.symbolProvider.toSymbol(targetShape)\n                    val enumValue = node.expectStringNode().value\n                    val enumMember =\n                        enumShape.members().find { enumMember ->\n                            enumMember.getTrait<software.amazon.smithy.model.traits.EnumValueTrait>()?.stringValue?.orElse(\n                                enumMember.memberName,\n                            ) == enumValue\n                        }\n                    val variantName = enumMember?.let { codegenContext.symbolProvider.toMemberName(it) } ?: enumValue\n                    \"$enumSymbol::$variantName\"\n                }\n\n                node.isStringNode -> \"\"\"\"${node.expectStringNode().value}\".to_string()\"\"\"\n                node.isBooleanNode -> node.expectBooleanNode().value.toString()\n                node.isNumberNode -> node.expectNumberNode().value.toString()\n                else -> \"Default::default()\"\n            }\n        } ?: \"Default::default()\"\n    }\n\n    private fun MemberShape.wrapValueIfOptional(valueExpression: String): String =\n        if (this.isOptional) {\n            \"Some($valueExpression)\"\n        } else {\n            valueExpression\n        }\n}\n\n/**\n * Class for encapsulating data related to validation field list\n */\nclass ValidationFieldList(\n    val validationFieldListMember: MemberShape,\n    val validationFieldStructure: StructureShape,\n    val validationFieldNameMember: MemberShape,\n    val maybeValidationFieldMessageMember: MemberShape?,\n)\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/customize/ServerCodegenDecorator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.customize\n\nimport software.amazon.smithy.build.PluginContext\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.ServiceShape\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.CombinedCoreCodegenDecorator\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.CoreCodegenDecorator\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.http.HttpBindingCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.ProtocolMap\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenContext\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerRustSettings\nimport software.amazon.smithy.rust.codegen.server.smithy.ValidationResult\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.ConfigMethod\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.ValidationExceptionConversionGenerator\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.protocol.ServerProtocolGenerator\nimport java.util.logging.Logger\n\ntypealias ServerProtocolMap = ProtocolMap<ServerProtocolGenerator, ServerCodegenContext>\n\n/**\n * [ServerCodegenDecorator] allows downstream users to customize code generation.\n */\ninterface ServerCodegenDecorator : CoreCodegenDecorator<ServerCodegenContext, ServerRustSettings> {\n    fun protocols(\n        serviceId: ShapeId,\n        currentProtocols: ServerProtocolMap,\n    ): ServerProtocolMap = currentProtocols\n\n    fun httpCustomizations(\n        symbolProvider: RustSymbolProvider,\n        protocol: ShapeId,\n    ): List<HttpBindingCustomization> = emptyList()\n\n    fun validationExceptionConversion(codegenContext: ServerCodegenContext): ValidationExceptionConversionGenerator? =\n        null\n\n    /**\n     * Injection point to allow a decorator to postprocess the error message that arises when an operation is\n     * constrained but the `ValidationException` shape is not attached to the operation's errors.\n     */\n    fun postprocessValidationExceptionNotAttachedErrorMessage(validationResult: ValidationResult) = validationResult\n\n    /**\n     * Injection point to allow a decorator to postprocess the error message that arises when an operation is\n     * constrained and there are multiple of: `ValidationException` and/or custom structures with the\n     * @validationException trait attached to the operation's errors.\n     */\n    fun postprocessMultipleValidationExceptionsErrorMessage(validationResult: ValidationResult) = validationResult\n\n    /**\n     * For each operation in the service's closure, this hook allows decorators to return a collection of structure shapes that will additionally be generated.\n     * If a structure shape is in the service's closure, note that returning it here will cause for it to be generated more than once,\n     * making the resulting crate not compile (since it will contain more than one struct with the same name).\n     * Therefore, ensure that all the structure shapes returned by this method are not in the service's closure.\n     */\n    fun postprocessOperationGenerateAdditionalStructures(operationShape: OperationShape): List<StructureShape> =\n        emptyList()\n\n    /**\n     * For each service, this hook allows decorators to return a collection of structure shapes that will additionally be generated.\n     * If a structure shape is in the service's closure, note that returning it here will cause for it to be generated more than once,\n     * making the resulting crate not compile (since it will contain more than one struct with the same name).\n     * Therefore, ensure that all the structure shapes returned by this method are not in the service's closure.\n     */\n    fun postprocessServiceGenerateAdditionalStructures(serviceShape: ServiceShape): List<StructureShape> = emptyList()\n\n    /**\n     * Configuration methods that should be injected into the `${serviceName}Config` struct to allow users to configure\n     * pre-applied layers and plugins.\n     */\n    fun configMethods(codegenContext: ServerCodegenContext): List<ConfigMethod> = emptyList()\n}\n\n/**\n * [CombinedServerCodegenDecorator] merges the results of multiple decorators into a single decorator.\n *\n * This makes the actual concrete codegen simpler by not needing to deal with multiple separate decorators.\n */\nclass CombinedServerCodegenDecorator(decorators: List<ServerCodegenDecorator>) :\n    CombinedCoreCodegenDecorator<ServerCodegenContext, ServerRustSettings, ServerCodegenDecorator>(decorators),\n    ServerCodegenDecorator {\n    private val orderedDecorators = decorators.sortedBy { it.order }\n\n    override val name: String\n        get() = \"CombinedServerCodegenDecorator\"\n    override val order: Byte\n        get() = 0\n\n    override fun protocols(\n        serviceId: ShapeId,\n        currentProtocols: ServerProtocolMap,\n    ): ServerProtocolMap =\n        combineCustomizations(currentProtocols) { decorator, protocolMap ->\n            decorator.protocols(serviceId, protocolMap)\n        }\n\n    override fun httpCustomizations(\n        symbolProvider: RustSymbolProvider,\n        protocol: ShapeId,\n    ): List<HttpBindingCustomization> = orderedDecorators.flatMap { it.httpCustomizations(symbolProvider, protocol) }\n\n    override fun validationExceptionConversion(\n        codegenContext: ServerCodegenContext,\n    ): ValidationExceptionConversionGenerator =\n        // We use `firstNotNullOf` instead of `firstNotNullOfOrNull` because the [SmithyValidationExceptionDecorator]\n        // is registered.\n        orderedDecorators.firstNotNullOf { it.validationExceptionConversion(codegenContext) }\n\n    override fun postprocessValidationExceptionNotAttachedErrorMessage(\n        validationResult: ValidationResult,\n    ): ValidationResult =\n        orderedDecorators.foldRight(validationResult) { decorator, accumulated ->\n            decorator.postprocessValidationExceptionNotAttachedErrorMessage(accumulated)\n        }\n\n    override fun postprocessMultipleValidationExceptionsErrorMessage(\n        validationResult: ValidationResult,\n    ): ValidationResult =\n        orderedDecorators.foldRight(validationResult) { decorator, accumulated ->\n            decorator.postprocessMultipleValidationExceptionsErrorMessage(accumulated)\n        }\n\n    override fun postprocessOperationGenerateAdditionalStructures(\n        operationShape: OperationShape,\n    ): List<StructureShape> =\n        orderedDecorators.flatMap { it.postprocessOperationGenerateAdditionalStructures(operationShape) }\n\n    override fun postprocessServiceGenerateAdditionalStructures(serviceShape: ServiceShape): List<StructureShape> =\n        orderedDecorators.flatMap { it.postprocessServiceGenerateAdditionalStructures(serviceShape) }\n\n    override fun configMethods(codegenContext: ServerCodegenContext): List<ConfigMethod> =\n        orderedDecorators.flatMap { it.configMethods(codegenContext) }\n\n    companion object {\n        fun fromClasspath(\n            context: PluginContext,\n            vararg extras: ServerCodegenDecorator,\n            logger: Logger = Logger.getLogger(\"RustServerCodegenSPILoader\"),\n        ): CombinedServerCodegenDecorator {\n            val decorators = decoratorsFromClasspath(context, ServerCodegenDecorator::class.java, logger, *extras)\n            return CombinedServerCodegenDecorator(decorators)\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/CollectionConstraintViolationGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.generators\n\nimport software.amazon.smithy.model.shapes.CollectionShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.Visibility\nimport software.amazon.smithy.rust.codegen.core.rustlang.join\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.makeRustBoxed\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\nimport software.amazon.smithy.rust.codegen.core.util.letIf\nimport software.amazon.smithy.rust.codegen.server.smithy.InlineModuleCreator\nimport software.amazon.smithy.rust.codegen.server.smithy.PubCrateConstraintViolationSymbolProvider\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenContext\nimport software.amazon.smithy.rust.codegen.server.smithy.canReachConstrainedShape\nimport software.amazon.smithy.rust.codegen.server.smithy.traits.ConstraintViolationRustBoxTrait\nimport software.amazon.smithy.rust.codegen.server.smithy.traits.isReachableFromOperationInput\n\nclass CollectionConstraintViolationGenerator(\n    codegenContext: ServerCodegenContext,\n    private val inlineModuleCreator: InlineModuleCreator,\n    private val shape: CollectionShape,\n    private val collectionConstraintsInfo: List<CollectionTraitInfo>,\n    private val validationExceptionConversionGenerator: ValidationExceptionConversionGenerator,\n) {\n    private val model = codegenContext.model\n    private val symbolProvider = codegenContext.symbolProvider\n    private val publicConstrainedTypes = codegenContext.settings.codegenConfig.publicConstrainedTypes\n    private val constraintViolationSymbolProvider =\n        with(codegenContext.constraintViolationSymbolProvider) {\n            if (publicConstrainedTypes) {\n                this\n            } else {\n                PubCrateConstraintViolationSymbolProvider(this)\n            }\n        }\n    private val constraintsInfo: List<TraitInfo> = collectionConstraintsInfo.map { it.toTraitInfo() }\n\n    fun render() {\n        val targetShape = model.expectShape(shape.member.target)\n        val constraintViolationSymbol = constraintViolationSymbolProvider.toSymbol(shape)\n        val constraintViolationName = constraintViolationSymbol.name\n        val isMemberConstrained = targetShape.canReachConstrainedShape(model, symbolProvider)\n        val constraintViolationVisibility = Visibility.publicIf(publicConstrainedTypes, Visibility.PUBCRATE)\n\n        inlineModuleCreator(constraintViolationSymbol) {\n            val constraintViolationVariants = constraintsInfo.map { it.constraintViolationVariant }.toMutableList()\n            if (shape.isReachableFromOperationInput() && isMemberConstrained) {\n                constraintViolationVariants += {\n                    val memberConstraintViolationSymbol =\n                        constraintViolationSymbolProvider.toSymbol(targetShape).letIf(\n                            shape.member.hasTrait<ConstraintViolationRustBoxTrait>(),\n                        ) {\n                            it.makeRustBoxed()\n                        }\n                    rustTemplate(\n                        \"\"\"\n                        /// Constraint violation error when an element doesn't satisfy its own constraints.\n                        /// The first component of the tuple is the index in the collection where the\n                        /// first constraint violation was found.\n                        ##[doc(hidden)]\n                        Member(usize, #{MemberConstraintViolationSymbol})\n                        \"\"\",\n                        \"MemberConstraintViolationSymbol\" to memberConstraintViolationSymbol,\n                    )\n                }\n            }\n\n            // TODO(https://github.com/smithy-lang/smithy-rs/issues/1401) We should really have two `ConstraintViolation`\n            //  types here. One will just have variants for each constraint trait on the collection shape, for use by the user.\n            //  The other one will have variants if the shape's member is directly or transitively constrained,\n            //  and is for use by the framework.\n            rustTemplate(\n                \"\"\"\n                ##[allow(clippy::enum_variant_names)]\n                ##[derive(Debug, PartialEq)]\n                ${constraintViolationVisibility.toRustQualifier()} enum $constraintViolationName {\n                    #{ConstraintViolationVariants:W}\n                }\n                \n                impl #{Display} for $constraintViolationName {\n                    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n                        let message = match self {\n                            #{VariantDisplayMessages:W}\n                        };\n                        write!(f, \"{message}\")\n                    }\n                }\n                \n                impl #{Error} for $constraintViolationName {}\n                \"\"\",\n                \"ConstraintViolationVariants\" to constraintViolationVariants.join(\",\\n\"),\n                \"Error\" to RuntimeType.StdError,\n                \"Display\" to RuntimeType.Display,\n                \"VariantDisplayMessages\" to generateDisplayMessageForEachVariant(shape.isReachableFromOperationInput() && isMemberConstrained),\n            )\n\n            if (shape.isReachableFromOperationInput()) {\n                rustTemplate(\n                    \"\"\"\n                    impl $constraintViolationName {\n                        #{CollectionShapeConstraintViolationImplBlock}\n                    }\n                    \"\"\",\n                    \"CollectionShapeConstraintViolationImplBlock\" to validationExceptionConversionGenerator.collectionShapeConstraintViolationImplBlock(collectionConstraintsInfo, isMemberConstrained),\n                )\n            }\n        }\n    }\n\n    private fun generateDisplayMessageForEachVariant(memberConstraintVariantPresent: Boolean) =\n        writable {\n            for (constraintsInfo in collectionConstraintsInfo) {\n                constraintsInfo.shapeConstraintViolationDisplayMessage(shape).invoke(this)\n            }\n\n            if (memberConstraintVariantPresent) {\n                rustTemplate(\n                    \"\"\"\n                    Self::Member(index, failing_member) => format!(\"Value at index {index} failed to satisfy constraint. {}\",\n                       failing_member)\n                    \"\"\",\n                )\n            }\n        }\n}\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ConstrainedBlobGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.generators\n\nimport software.amazon.smithy.codegen.core.Symbol\nimport software.amazon.smithy.model.shapes.BlobShape\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.traits.LengthTrait\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.Visibility\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.docs\nimport software.amazon.smithy.rust.codegen.core.rustlang.documentShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.join\nimport software.amazon.smithy.rust.codegen.core.rustlang.render\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\nimport software.amazon.smithy.rust.codegen.core.smithy.expectRustMetadata\nimport software.amazon.smithy.rust.codegen.core.smithy.makeMaybeConstrained\nimport software.amazon.smithy.rust.codegen.core.smithy.rustType\nimport software.amazon.smithy.rust.codegen.core.util.orNull\nimport software.amazon.smithy.rust.codegen.server.smithy.InlineModuleCreator\nimport software.amazon.smithy.rust.codegen.server.smithy.PubCrateConstraintViolationSymbolProvider\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenContext\nimport software.amazon.smithy.rust.codegen.server.smithy.shapeConstraintViolationDisplayMessage\nimport software.amazon.smithy.rust.codegen.server.smithy.traits.isReachableFromOperationInput\nimport software.amazon.smithy.rust.codegen.server.smithy.validationErrorMessage\n\nclass ConstrainedBlobGenerator(\n    val codegenContext: ServerCodegenContext,\n    private val inlineModuleCreator: InlineModuleCreator,\n    val writer: RustWriter,\n    val shape: BlobShape,\n    private val validationExceptionConversionGenerator: ValidationExceptionConversionGenerator,\n) {\n    val model = codegenContext.model\n    val constrainedShapeSymbolProvider = codegenContext.constrainedShapeSymbolProvider\n    val publicConstrainedTypes = codegenContext.settings.codegenConfig.publicConstrainedTypes\n    private val constraintViolationSymbolProvider =\n        with(codegenContext.constraintViolationSymbolProvider) {\n            if (publicConstrainedTypes) {\n                this\n            } else {\n                PubCrateConstraintViolationSymbolProvider(this)\n            }\n        }\n    private val blobConstraintsInfo: List<BlobLength> =\n        listOf(LengthTrait::class.java)\n            .mapNotNull { shape.getTrait(it).orNull() }\n            .map { BlobLength(it) }\n    private val constraintsInfo: List<TraitInfo> = blobConstraintsInfo.map { it.toTraitInfo() }\n\n    fun render() {\n        val symbol = constrainedShapeSymbolProvider.toSymbol(shape)\n        val name = symbol.name\n        val inner = RuntimeType.blob(codegenContext.runtimeConfig).toSymbol().rustType().render()\n        val constraintViolation = constraintViolationSymbolProvider.toSymbol(shape)\n\n        writer.documentShape(shape, model)\n        writer.docs(rustDocsConstrainedTypeEpilogue(name))\n        val metadata = symbol.expectRustMetadata()\n        metadata.render(writer)\n        writer.rust(\"struct $name(pub(crate) $inner);\")\n        writer.rustBlock(\"impl $name\") {\n            if (metadata.visibility == Visibility.PUBLIC) {\n                writer.rust(\n                    \"\"\"\n                    /// ${rustDocsInnerMethod(inner)}\n                    pub fn inner(&self) -> &$inner {\n                        &self.0\n                    }\n                    \"\"\",\n                )\n            }\n            writer.rust(\n                \"\"\"\n                /// ${rustDocsIntoInnerMethod(inner)}\n                pub fn into_inner(self) -> $inner {\n                    self.0\n                }\n                \"\"\",\n            )\n        }\n\n        writer.renderTryFrom(inner, name, constraintViolation, constraintsInfo)\n\n        writer.rustTemplate(\n            \"\"\"\n            impl #{ConstrainedTrait} for $name  {\n                type Unconstrained = $inner;\n            }\n\n            impl #{From}<$inner> for #{MaybeConstrained} {\n                fn from(value: $inner) -> Self {\n                    Self::Unconstrained(value)\n                }\n            }\n\n            impl #{From}<$name> for $inner {\n                fn from(value: $name) -> Self {\n                    value.into_inner()\n                }\n            }\n            \"\"\",\n            \"ConstrainedTrait\" to RuntimeType.ConstrainedTrait,\n            \"ConstraintViolation\" to constraintViolation,\n            \"MaybeConstrained\" to symbol.makeMaybeConstrained(),\n            \"Display\" to RuntimeType.Display,\n            \"From\" to RuntimeType.From,\n        )\n\n        inlineModuleCreator(constraintViolation) {\n            renderConstraintViolationEnum(this, shape, constraintViolation)\n        }\n    }\n\n    private fun renderConstraintViolationEnum(\n        writer: RustWriter,\n        shape: BlobShape,\n        constraintViolation: Symbol,\n    ) {\n        writer.rustTemplate(\n            \"\"\"\n            ##[derive(Debug, PartialEq)]\n            pub enum ${constraintViolation.name} {\n              #{Variants:W}\n            }\n\n            impl #{Display} for ${constraintViolation.name} {\n                fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n                    let message = match self {\n                        #{VariantDisplayMessages:W}\n                    };\n                    write!(f, \"{message}\")\n                }\n            }\n\n            impl #{Error} for ${constraintViolation.name} {}\n            \"\"\",\n            \"Variants\" to constraintsInfo.map { it.constraintViolationVariant }.join(\",\\n\"),\n            \"Error\" to RuntimeType.StdError,\n            \"Display\" to RuntimeType.Display,\n            \"VariantDisplayMessages\" to generateDisplayMessageForEachVariant(),\n        )\n\n        if (shape.isReachableFromOperationInput()) {\n            writer.rustTemplate(\n                \"\"\"\n                impl ${constraintViolation.name} {\n                    #{BlobShapeConstraintViolationImplBlock}\n                }\n                \"\"\",\n                \"BlobShapeConstraintViolationImplBlock\" to validationExceptionConversionGenerator.blobShapeConstraintViolationImplBlock(blobConstraintsInfo),\n            )\n        }\n    }\n\n    private fun generateDisplayMessageForEachVariant() =\n        writable {\n            blobConstraintsInfo.forEach {\n                it.shapeConstraintViolationDisplayMessage(shape).invoke(this)\n            }\n        }\n}\n\n// Each type of constraint that can be put on a Blob must implement the BlobConstraintGenerator\n// interface. This allows the\ninterface BlobConstraintGenerator {\n    fun shapeConstraintViolationDisplayMessage(shape: Shape): Writable\n}\n\ndata class BlobLength(val lengthTrait: LengthTrait) : BlobConstraintGenerator {\n    fun toTraitInfo(): TraitInfo =\n        TraitInfo(\n            { rust(\"Self::check_length(&value)?;\") },\n            {\n                docs(\"Error when a blob doesn't satisfy its `@length` requirements.\")\n                rust(\"Length(usize)\")\n            },\n            {\n                rust(\n                    \"\"\"\n                    Self::Length(length) => crate::model::ValidationExceptionField {\n                        message: format!(\"${lengthTrait.validationErrorMessage()}\", length, &path),\n                        path,\n                    },\n                    \"\"\",\n                )\n            },\n            this::renderValidationFunction,\n        )\n\n    /**\n     * Renders a `check_length` function to validate the blob matches the\n     * required length indicated by the `@length` trait.\n     */\n    private fun renderValidationFunction(\n        constraintViolation: Symbol,\n        unconstrainedTypeName: String,\n    ): Writable =\n        {\n            rustTemplate(\n                \"\"\"\n                fn check_length(blob: &$unconstrainedTypeName) -> #{Result}<(), $constraintViolation> {\n                    let length = blob.as_ref().len();\n\n                    if ${lengthTrait.rustCondition(\"length\")} {\n                        Ok(())\n                    } else {\n                        Err($constraintViolation::Length(length))\n                    }\n                }\n                \"\"\",\n                *preludeScope,\n            )\n        }\n\n    override fun shapeConstraintViolationDisplayMessage(shape: Shape) =\n        writable {\n            rustTemplate(\n                \"\"\"\n                Self::Length(length) => {\n                    format!(\"${lengthTrait.shapeConstraintViolationDisplayMessage(shape).replace(\"#\", \"##\")}\", length)\n                },\n                \"\"\",\n            )\n        }\n}\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ConstrainedCollectionGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.generators\n\nimport software.amazon.smithy.codegen.core.Symbol\nimport software.amazon.smithy.codegen.core.SymbolProvider\nimport software.amazon.smithy.model.shapes.CollectionShape\nimport software.amazon.smithy.model.shapes.EnumShape\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.shapes.UnionShape\nimport software.amazon.smithy.model.traits.LengthTrait\nimport software.amazon.smithy.model.traits.Trait\nimport software.amazon.smithy.model.traits.UniqueItemsTrait\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.Visibility\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.docs\nimport software.amazon.smithy.rust.codegen.core.rustlang.documentShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.join\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.expectRustMetadata\nimport software.amazon.smithy.rust.codegen.core.util.PANIC\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\nimport software.amazon.smithy.rust.codegen.core.util.orNull\nimport software.amazon.smithy.rust.codegen.server.smithy.PubCrateConstraintViolationSymbolProvider\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenContext\nimport software.amazon.smithy.rust.codegen.server.smithy.canReachConstrainedShape\nimport software.amazon.smithy.rust.codegen.server.smithy.shapeConstraintViolationDisplayMessage\nimport software.amazon.smithy.rust.codegen.server.smithy.supportedCollectionConstraintTraits\nimport software.amazon.smithy.rust.codegen.server.smithy.validationErrorMessage\n\n/**\n * [ConstrainedCollectionGenerator] generates a wrapper tuple newtype holding a constrained `std::vec::Vec`.\n * This type can be built from unconstrained values, yielding a `ConstraintViolation` when the input does not satisfy\n * the constraints.\n *\n * The [`length`] and [`uniqueItems`] traits are the only constraint traits applicable to list shapes.\n *\n * If [unconstrainedSymbol] is provided, the `MaybeConstrained` trait is implemented for the constrained type, using the\n * [unconstrainedSymbol]'s associated type as the associated type for the trait.\n *\n * [`length`]: https://smithy.io/2.0/spec/constraint-traits.html#length-trait\n * [`uniqueItems`]: https://smithy.io/2.0/spec/constraint-traits.html#smithy-api-uniqueitems-trait\n */\nclass ConstrainedCollectionGenerator(\n    val codegenContext: ServerCodegenContext,\n    val writer: RustWriter,\n    val shape: CollectionShape,\n    collectionConstraintsInfo: List<CollectionTraitInfo>,\n    private val unconstrainedSymbol: Symbol? = null,\n) {\n    private val model = codegenContext.model\n    private val constrainedShapeSymbolProvider = codegenContext.constrainedShapeSymbolProvider\n    private val publicConstrainedTypes = codegenContext.settings.codegenConfig.publicConstrainedTypes\n    private val constraintViolationSymbolProvider =\n        with(codegenContext.constraintViolationSymbolProvider) {\n            if (publicConstrainedTypes) {\n                this\n            } else {\n                PubCrateConstraintViolationSymbolProvider(this)\n            }\n        }\n    private val symbolProvider = codegenContext.symbolProvider\n    private val constraintsInfo = collectionConstraintsInfo.map { it.toTraitInfo() }\n\n    fun render() {\n        check(constraintsInfo.isNotEmpty()) {\n            \"`ConstrainedCollectionGenerator` can only be invoked for constrained collections, but this shape was not constrained\"\n        }\n\n        val name = constrainedShapeSymbolProvider.toSymbol(shape).name\n        val inner = \"::std::vec::Vec<#{ValueMemberSymbol}>\"\n        val constraintViolation = constraintViolationSymbolProvider.toSymbol(shape)\n        val constrainedSymbol = symbolProvider.toSymbol(shape)\n\n        val codegenScope =\n            arrayOf(\n                \"ValueMemberSymbol\" to constrainedShapeSymbolProvider.toSymbol(shape.member),\n                \"From\" to RuntimeType.From,\n                \"TryFrom\" to RuntimeType.TryFrom,\n                \"ConstraintViolation\" to constraintViolation,\n                *RuntimeType.preludeScope,\n            )\n\n        writer.documentShape(shape, model)\n        writer.docs(rustDocsConstrainedTypeEpilogue(name))\n        val metadata = constrainedSymbol.expectRustMetadata()\n        metadata.render(writer)\n        writer.rustTemplate(\n            \"\"\"\n            struct $name(pub(crate) $inner);\n            \"\"\",\n            *codegenScope,\n        )\n\n        writer.rustBlock(\"impl $name\") {\n            if (metadata.visibility == Visibility.PUBLIC) {\n                writer.rustTemplate(\n                    \"\"\"\n                    /// ${rustDocsInnerMethod(inner)}\n                    pub fn inner(&self) -> &$inner {\n                        &self.0\n                    }\n                    \"\"\",\n                    *codegenScope,\n                )\n            }\n            writer.rustTemplate(\n                \"\"\"\n                /// ${rustDocsIntoInnerMethod(inner)}\n                pub fn into_inner(self) -> $inner {\n                    self.0\n                }\n\n                #{ValidationFunctions:W}\n                \"\"\",\n                *codegenScope,\n                \"ValidationFunctions\" to\n                    constraintsInfo.map {\n                        it.validationFunctionDefinition(constraintViolation, inner)\n                    }.join(\"\\n\"),\n            )\n        }\n\n        writer.rustTemplate(\n            \"\"\"\n            impl #{TryFrom}<$inner> for $name {\n                type Error = #{ConstraintViolation};\n\n                /// ${rustDocsTryFromMethod(name, inner)}\n                fn try_from(value: $inner) -> #{Result}<Self, Self::Error> {\n                    #{ConstraintChecks:W}\n\n                    Ok(Self(value))\n                }\n            }\n\n            impl #{From}<$name> for $inner {\n                fn from(value: $name) -> Self {\n                    value.into_inner()\n                }\n            }\n            \"\"\",\n            *codegenScope,\n            \"ConstraintChecks\" to constraintsInfo.map { it.tryFromCheck }.join(\"\\n\"),\n        )\n\n        val innerShape = model.expectShape(shape.member.target)\n        if (!publicConstrainedTypes &&\n            innerShape.canReachConstrainedShape(model, symbolProvider) &&\n            innerShape !is StructureShape &&\n            innerShape !is UnionShape &&\n            innerShape !is EnumShape\n        ) {\n            writer.rustTemplate(\n                \"\"\"\n                impl #{From}<$name> for #{FullyUnconstrainedSymbol} {\n                    fn from(value: $name) -> Self {\n                        value\n                            .into_inner()\n                            .into_iter()\n                            .map(|v| v.into())\n                            .collect()\n                    }\n                }\n                \"\"\",\n                *codegenScope,\n                \"FullyUnconstrainedSymbol\" to symbolProvider.toSymbol(shape),\n            )\n        }\n\n        if (unconstrainedSymbol != null) {\n            writer.rustTemplate(\n                \"\"\"\n                impl #{ConstrainedTrait} for $name {\n                    type Unconstrained = #{UnconstrainedSymbol};\n                }\n                \"\"\",\n                \"ConstrainedTrait\" to RuntimeType.ConstrainedTrait,\n                \"UnconstrainedSymbol\" to unconstrainedSymbol,\n            )\n        }\n    }\n}\n\nsealed class CollectionTraitInfo {\n    data class UniqueItems(val uniqueItemsTrait: UniqueItemsTrait, val memberSymbol: Symbol) : CollectionTraitInfo() {\n        override fun toTraitInfo(): TraitInfo =\n            TraitInfo(\n                tryFromCheck = {\n                    rust(\"let value = Self::check_unique_items(value)?;\")\n                },\n                constraintViolationVariant = {\n                    docs(\"Constraint violation error when the list does not contain unique items\")\n                    // We can't return a vector of references pointing to the duplicate items in the original vector,\n                    // because that would make the type self-referential. Returning a vector of indices is as efficient\n                    // and more useful to callers.\n                    rustTemplate(\n                        \"\"\"\n                        UniqueItems {\n                            /// A vector of indices into `original` pointing to all duplicate items. This vector has\n                            /// at least two elements.\n                            /// More specifically, for every element `idx_1` in `duplicate_indices`, there exists another\n                            /// distinct element `idx_2` such that `original[idx_1] == original[idx_2]` is `true`.\n                            /// Nothing is guaranteed about the order of the indices.\n                            duplicate_indices: #{Vec}<usize>,\n                            /// The original vector, that contains duplicate items.\n                            original: #{Vec}<#{MemberSymbol}>,\n                        }\n                        \"\"\",\n                        \"Vec\" to RuntimeType.Vec,\n                        \"String\" to RuntimeType.String,\n                        \"MemberSymbol\" to memberSymbol,\n                    )\n                },\n                asValidationExceptionField = {\n                    // smithy-typescript echoes back one instance of each repeated element after sorting them [0]:\n                    //\n                    // I think we shouldn't do this for several reasons:\n                    //\n                    // 1. In Rust we can't sort the elements to provide a stable message because they may not be `Ord`.\n                    // 2. If we return the elements' serialized representation, we'd have to generate serializers\n                    //    for all shapes in the closure of `@uniqueItems` lists just for this use case. These are\n                    //    typically shapes for which we only generate deserializers.\n                    // 3. Getting back one instance of each repeated element is not helpful:\n                    //        - The elements may be big (complex structures); smithy-typescript truncates them [1]. The\n                    //          caller might thus may not even get to see the repeated elements.\n                    //        - The caller does not know how many times each duplicate element occurred.\n                    //        - The caller does not know in which positions each duplicate element occurred.\n                    //\n                    // I think a better error message is to just return the indices of the duplicate elements: so, the\n                    // list:\n                    //\n                    //     [\"a\", \"b\", \"a\", \"b\", \"c\"]\n                    //\n                    // Would return:\n                    //\n                    //     [0, 1, 2, 3]\n                    //\n                    // An even better representation would be to return _groups_ of indices (with size >= 2), one per\n                    // equivalence class:\n                    //\n                    //     [[0, 2], [1, 3]]\n                    //\n                    // However, this latter representation comes at a non-negligible (?) performance cost, namely, the\n                    // allocation of one vector per equivalence class. Judging by how many clients are really interested\n                    // in parsing these (none?), perhaps it's sufficient to just return the \"flattened\" indices.\n                    //\n                    // [0]: https://github.com/awslabs/smithy-typescript/blob/517c85f8baccf0e5334b4e66d8786bdb5791c595/smithy-typescript-ssdk-libs/server-common/src/validation/validators.ts#L310\n                    // [1]: https://github.com/awslabs/smithy-typescript/blob/517c85f8baccf0e5334b4e66d8786bdb5791c595/smithy-typescript-ssdk-libs/server-common/src/validation/index.ts#L106-L111\n                    rust(\n                        \"\"\"\n                        Self::UniqueItems { duplicate_indices, .. } =>\n                            crate::model::ValidationExceptionField {\n                                message: format!(\"${uniqueItemsTrait.validationErrorMessage()}\", &duplicate_indices, &path),\n                                path,\n                            },\n                        \"\"\",\n                    )\n                },\n                validationFunctionDefinition = { constraintViolation, _ ->\n                    {\n                        // This is the fun bit where we enforce the trait.\n                        //\n                        // The algorithm to check for uniqueness is fairly simple: we iterate over the incoming items\n                        // in order and store them in a `HashMap`, with an entry whose key is the item and whose value\n                        // is the most recently seen index where we encountered the item. If we encounter an item we've\n                        // seen before, we add its index to a `duplicate_indices` vector. Lastly, we iterate over the\n                        // `duplicate_indices` and lookup each of them in the seen items hash map, to extend the\n                        // duplicates with those duplicate items that were seen last.\n                        //\n                        // The algorithm has linear time complexity over the list's length. In the worst case,\n                        // when all items have the same value, we'd iterate over all of the items twice and use\n                        // linear memory.\n                        //\n                        // We can use a `HashMap` to store the incoming items because it is guaranteed that all\n                        // shapes in the list shape's closure implement `Hash`; see\n                        // [`DeriveEqAndHashSymbolMetadataProvider`]. Indeed, smithy-rs only allows the `@uniqueItems`\n                        // trait to be applied to a list shape if and only if all the shapes in the list shape's closure\n                        // implement `Eq` and `Hash`.\n                        rustTemplate(\n                            \"\"\"\n                            fn check_unique_items(items: #{Vec}<#{MemberSymbol}>) -> #{Result}<#{Vec}<#{MemberSymbol}>, #{ConstraintViolation}> {\n                                let mut seen = #{HashMap}::new();\n                                let mut duplicate_indices = #{Vec}::new();\n                                for (idx, item) in items.iter().enumerate() {\n                                    if let Some(prev_idx) = seen.insert(item, idx) {\n                                        duplicate_indices.push(prev_idx);\n                                    }\n                                }\n\n                                let mut last_duplicate_indices = #{Vec}::new();\n                                for idx in &duplicate_indices {\n                                    if let Some(prev_idx) = seen.remove(&items[*idx]) {\n                                        last_duplicate_indices.push(prev_idx);\n                                    }\n                                }\n                                duplicate_indices.extend(last_duplicate_indices);\n\n                                if !duplicate_indices.is_empty() {\n                                    debug_assert!(duplicate_indices.len() >= 2);\n                                    Err(#{ConstraintViolation}::UniqueItems { duplicate_indices, original: items })\n                                } else {\n                                    Ok(items)\n                                }\n                            }\n                            \"\"\",\n                            \"Vec\" to RuntimeType.Vec,\n                            \"HashMap\" to RuntimeType.HashMap,\n                            \"MemberSymbol\" to memberSymbol,\n                            \"ConstraintViolation\" to constraintViolation,\n                            *RuntimeType.preludeScope,\n                        )\n                    }\n                },\n            )\n\n        override fun shapeConstraintViolationDisplayMessage(shape: Shape) =\n            writable {\n                rustTemplate(\n                    \"\"\"\n                    Self::UniqueItems { duplicate_indices, .. } =>\n                        format!(\"${uniqueItemsTrait.shapeConstraintViolationDisplayMessage(shape).replace(\"#\", \"##\")}\", &duplicate_indices),\n                    \"\"\",\n                )\n            }\n    }\n\n    data class Length(val lengthTrait: LengthTrait) : CollectionTraitInfo() {\n        override fun toTraitInfo(): TraitInfo =\n            TraitInfo(\n                tryFromCheck = {\n                    rust(\"Self::check_length(value.len())?;\")\n                },\n                constraintViolationVariant = {\n                    docs(\"Constraint violation error when the list doesn't have the required length\")\n                    rust(\"Length(usize)\")\n                },\n                asValidationExceptionField = {\n                    rust(\n                        \"\"\"\n                        Self::Length(length) => crate::model::ValidationExceptionField {\n                            message: format!(\"${lengthTrait.validationErrorMessage()}\", length, &path),\n                            path,\n                        },\n                        \"\"\",\n                    )\n                },\n                validationFunctionDefinition = { constraintViolation, _ ->\n                    {\n                        rustTemplate(\n                            \"\"\"\n                            fn check_length(length: usize) -> #{Result}<(), #{ConstraintViolation}> {\n                                if ${lengthTrait.rustCondition(\"length\")} {\n                                    Ok(())\n                                } else {\n                                    Err(#{ConstraintViolation}::Length(length))\n                                }\n                            }\n                            \"\"\",\n                            \"ConstraintViolation\" to constraintViolation,\n                            *RuntimeType.preludeScope,\n                        )\n                    }\n                },\n            )\n\n        override fun shapeConstraintViolationDisplayMessage(shape: Shape) =\n            writable {\n                rustTemplate(\n                    \"\"\"\n                    Self::Length(length) => {\n                        format!(\"${lengthTrait.shapeConstraintViolationDisplayMessage(shape).replace(\"#\", \"##\")}\", length)\n                    },\n                    \"\"\",\n                )\n            }\n    }\n\n    companion object {\n        private fun fromTrait(\n            trait: Trait,\n            shape: CollectionShape,\n            symbolProvider: SymbolProvider,\n        ): CollectionTraitInfo {\n            check(shape.hasTrait(trait.toShapeId()))\n            return when (trait) {\n                is LengthTrait -> {\n                    Length(trait)\n                }\n                is UniqueItemsTrait -> {\n                    UniqueItems(trait, symbolProvider.toSymbol(shape.member))\n                }\n                else -> {\n                    PANIC(\"CollectionTraitInfo.fromTrait called with unsupported trait $trait\")\n                }\n            }\n        }\n\n        fun fromShape(\n            shape: CollectionShape,\n            symbolProvider: SymbolProvider,\n        ): List<CollectionTraitInfo> =\n            supportedCollectionConstraintTraits\n                .mapNotNull { shape.getTrait(it).orNull() }\n                .map { trait -> fromTrait(trait, shape, symbolProvider) }\n    }\n\n    abstract fun toTraitInfo(): TraitInfo\n\n    abstract fun shapeConstraintViolationDisplayMessage(shape: Shape): Writable\n}\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ConstrainedMapGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.generators\n\nimport software.amazon.smithy.codegen.core.Symbol\nimport software.amazon.smithy.model.shapes.MapShape\nimport software.amazon.smithy.model.shapes.StringShape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.shapes.UnionShape\nimport software.amazon.smithy.model.traits.LengthTrait\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.Visibility\nimport software.amazon.smithy.rust.codegen.core.rustlang.docs\nimport software.amazon.smithy.rust.codegen.core.rustlang.documentShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlockTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.expectRustMetadata\nimport software.amazon.smithy.rust.codegen.core.util.expectTrait\nimport software.amazon.smithy.rust.codegen.server.smithy.PubCrateConstraintViolationSymbolProvider\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenContext\nimport software.amazon.smithy.rust.codegen.server.smithy.typeNameContainsNonPublicType\n\n/**\n * [ConstrainedMapGenerator] generates a wrapper tuple newtype holding a constrained `std::collections::HashMap`.\n * This type can be built from unconstrained values, yielding a `ConstraintViolation` when the input does not satisfy\n * the constraints.\n *\n * The [`length` trait] is the only constraint trait applicable to map shapes.\n *\n * If [unconstrainedSymbol] is provided, the `MaybeConstrained` trait is implemented for the constrained type, using the\n * [unconstrainedSymbol]'s associated type as the associated type for the trait.\n *\n * [`length` trait]: https://smithy.io/2.0/spec/constraint-traits.html#length-trait\n */\nclass ConstrainedMapGenerator(\n    val codegenContext: ServerCodegenContext,\n    val writer: RustWriter,\n    val shape: MapShape,\n    private val unconstrainedSymbol: Symbol? = null,\n) {\n    private val model = codegenContext.model\n    private val constrainedShapeSymbolProvider = codegenContext.constrainedShapeSymbolProvider\n    private val publicConstrainedTypes = codegenContext.settings.codegenConfig.publicConstrainedTypes\n    private val constraintViolationSymbolProvider =\n        with(codegenContext.constraintViolationSymbolProvider) {\n            if (publicConstrainedTypes) {\n                this\n            } else {\n                PubCrateConstraintViolationSymbolProvider(this)\n            }\n        }\n    private val symbolProvider = codegenContext.symbolProvider\n\n    fun render() {\n        // The `length` trait is the only constraint trait applicable to map shapes.\n        val lengthTrait = shape.expectTrait<LengthTrait>()\n\n        val name = constrainedShapeSymbolProvider.toSymbol(shape).name\n        val inner = \"#{HashMap}<#{KeySymbol}, #{ValueMemberSymbol}>\"\n        val constraintViolation = constraintViolationSymbolProvider.toSymbol(shape)\n        val constrainedSymbol = symbolProvider.toSymbol(shape)\n\n        val codegenScope =\n            arrayOf(\n                \"HashMap\" to RuntimeType.HashMap,\n                \"KeySymbol\" to constrainedShapeSymbolProvider.toSymbol(model.expectShape(shape.key.target)),\n                \"ValueMemberSymbol\" to constrainedShapeSymbolProvider.toSymbol(shape.value),\n                \"From\" to RuntimeType.From,\n                \"TryFrom\" to RuntimeType.TryFrom,\n                \"ConstraintViolation\" to constraintViolation,\n                *RuntimeType.preludeScope,\n            )\n\n        writer.documentShape(shape, model)\n        writer.docs(rustDocsConstrainedTypeEpilogue(name))\n        val metadata = constrainedSymbol.expectRustMetadata()\n        metadata.render(writer)\n        writer.rustTemplate(\"struct $name(pub(crate) $inner);\", *codegenScope)\n        writer.rustBlockTemplate(\"impl $name\", *codegenScope) {\n            if (metadata.visibility == Visibility.PUBLIC) {\n                writer.rustTemplate(\n                    \"\"\"\n                    /// ${rustDocsInnerMethod(inner)}\n                    pub fn inner(&self) -> &$inner {\n                        &self.0\n                    }\n                    \"\"\",\n                    *codegenScope,\n                )\n            }\n            writer.rustTemplate(\n                \"\"\"\n                /// ${rustDocsIntoInnerMethod(inner)}\n                pub fn into_inner(self) -> $inner {\n                    self.0\n                }\n                \"\"\",\n                *codegenScope,\n            )\n        }\n\n        writer.rustTemplate(\n            \"\"\"\n            impl #{TryFrom}<$inner> for $name {\n                type Error = #{ConstraintViolation};\n\n                /// ${rustDocsTryFromMethod(name, inner)}\n                fn try_from(value: $inner) -> #{Result}<Self, Self::Error> {\n                    let length = value.len();\n                    if ${lengthTrait.rustCondition(\"length\")} {\n                        Ok(Self(value))\n                    } else {\n                        Err(#{ConstraintViolation}::Length(length))\n                    }\n                }\n            }\n\n            impl #{From}<$name> for $inner {\n                fn from(value: $name) -> Self {\n                    value.into_inner()\n                }\n            }\n            \"\"\",\n            *codegenScope,\n        )\n\n        val valueShape = model.expectShape(shape.value.target)\n        if (!publicConstrainedTypes &&\n            isValueConstrained(valueShape, model, symbolProvider) &&\n            valueShape !is StructureShape &&\n            valueShape !is UnionShape\n        ) {\n            val keyShape = model.expectShape(shape.key.target, StringShape::class.java)\n            val keyNeedsConversion = keyShape.typeNameContainsNonPublicType(model, symbolProvider, publicConstrainedTypes)\n            val key =\n                if (keyNeedsConversion) {\n                    \"k.into()\"\n                } else {\n                    \"k\"\n                }\n\n            writer.rustTemplate(\n                \"\"\"\n                impl #{From}<$name> for #{FullyUnconstrainedSymbol} {\n                    fn from(value: $name) -> Self {\n                        value\n                            .into_inner()\n                            .into_iter()\n                            .map(|(k, v)| ($key, v.into()))\n                            .collect()\n                    }\n                }\n                \"\"\",\n                *codegenScope,\n                \"FullyUnconstrainedSymbol\" to symbolProvider.toSymbol(shape),\n            )\n        }\n\n        if (unconstrainedSymbol != null) {\n            writer.rustTemplate(\n                \"\"\"\n                impl #{ConstrainedTrait} for $name  {\n                    type Unconstrained = #{UnconstrainedSymbol};\n                }\n                \"\"\",\n                *codegenScope,\n                \"ConstrainedTrait\" to RuntimeType.ConstrainedTrait,\n                \"UnconstrainedSymbol\" to unconstrainedSymbol,\n            )\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ConstrainedMapGeneratorCommon.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.generators\n\nimport software.amazon.smithy.codegen.core.SymbolProvider\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.shapes.StringShape\nimport software.amazon.smithy.rust.codegen.server.smithy.canReachConstrainedShape\nimport software.amazon.smithy.rust.codegen.server.smithy.isDirectlyConstrained\n\n/**\n * Common helper functions used in [UnconstrainedMapGenerator] and [MapConstraintViolationGenerator].\n */\n\nfun isKeyConstrained(\n    shape: StringShape,\n    symbolProvider: SymbolProvider,\n) = shape.isDirectlyConstrained(symbolProvider)\n\nfun isValueConstrained(\n    shape: Shape,\n    model: Model,\n    symbolProvider: SymbolProvider,\n): Boolean = shape.canReachConstrainedShape(model, symbolProvider)\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ConstrainedNumberGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.generators\n\nimport software.amazon.smithy.codegen.core.Symbol\nimport software.amazon.smithy.model.shapes.ByteShape\nimport software.amazon.smithy.model.shapes.IntegerShape\nimport software.amazon.smithy.model.shapes.LongShape\nimport software.amazon.smithy.model.shapes.NumberShape\nimport software.amazon.smithy.model.shapes.ShortShape\nimport software.amazon.smithy.model.traits.RangeTrait\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustType\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.Visibility\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.docs\nimport software.amazon.smithy.rust.codegen.core.rustlang.documentShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.render\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.expectRustMetadata\nimport software.amazon.smithy.rust.codegen.core.smithy.makeMaybeConstrained\nimport software.amazon.smithy.rust.codegen.core.util.UNREACHABLE\nimport software.amazon.smithy.rust.codegen.core.util.expectTrait\nimport software.amazon.smithy.rust.codegen.core.util.redactIfNecessary\nimport software.amazon.smithy.rust.codegen.server.smithy.InlineModuleCreator\nimport software.amazon.smithy.rust.codegen.server.smithy.PubCrateConstraintViolationSymbolProvider\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenContext\nimport software.amazon.smithy.rust.codegen.server.smithy.shapeConstraintViolationDisplayMessage\nimport software.amazon.smithy.rust.codegen.server.smithy.traits.isReachableFromOperationInput\nimport software.amazon.smithy.rust.codegen.server.smithy.validationErrorMessage\n\n/**\n * [ConstrainedNumberGenerator] generates a wrapper newtype holding a constrained number primitive.\n * This type can be built from unconstrained values, yielding a `ConstraintViolation` when the input does not satisfy\n * the constraints.\n */\nclass ConstrainedNumberGenerator(\n    val codegenContext: ServerCodegenContext,\n    private val inlineModuleCreator: InlineModuleCreator,\n    private val writer: RustWriter,\n    val shape: NumberShape,\n    private val validationExceptionConversionGenerator: ValidationExceptionConversionGenerator,\n) {\n    val model = codegenContext.model\n    val constrainedShapeSymbolProvider = codegenContext.constrainedShapeSymbolProvider\n    val publicConstrainedTypes = codegenContext.settings.codegenConfig.publicConstrainedTypes\n\n    private val unconstrainedType =\n        when (shape) {\n            is ByteShape -> RustType.Integer(8)\n            is ShortShape -> RustType.Integer(16)\n            is IntegerShape -> RustType.Integer(32)\n            is LongShape -> RustType.Integer(64)\n            else -> UNREACHABLE(\"Trying to generate a constrained number for an unsupported Smithy number shape\")\n        }\n\n    private val constraintViolationSymbolProvider =\n        with(codegenContext.constraintViolationSymbolProvider) {\n            if (publicConstrainedTypes) {\n                this\n            } else {\n                PubCrateConstraintViolationSymbolProvider(this)\n            }\n        }\n\n    fun render() {\n        val rangeTrait = shape.expectTrait<RangeTrait>()\n\n        val symbol = constrainedShapeSymbolProvider.toSymbol(shape)\n        val name = symbol.name\n        val unconstrainedTypeName = unconstrainedType.render()\n        val constraintViolation = constraintViolationSymbolProvider.toSymbol(shape)\n        val rangeInfo = Range(rangeTrait)\n        val constraintsInfo = listOf(rangeInfo.toTraitInfo())\n\n        writer.documentShape(shape, model)\n        writer.docs(rustDocsConstrainedTypeEpilogue(name))\n        val metadata = symbol.expectRustMetadata()\n        metadata.render(writer)\n        writer.rust(\"struct $name(pub(crate) $unconstrainedTypeName);\")\n\n        if (metadata.visibility == Visibility.PUBCRATE) {\n            Attribute.AllowDeadCode.render(writer)\n        }\n        writer.rustTemplate(\n            \"\"\"\n            impl $name {\n                /// ${rustDocsInnerMethod(unconstrainedTypeName)}\n                pub fn inner(&self) -> &$unconstrainedTypeName {\n                    &self.0\n                }\n\n                /// ${rustDocsIntoInnerMethod(unconstrainedTypeName)}\n                pub fn into_inner(self) -> $unconstrainedTypeName {\n                    self.0\n                }\n            }\n\n            impl #{ConstrainedTrait} for $name  {\n                type Unconstrained = $unconstrainedTypeName;\n            }\n\n            impl #{From}<$unconstrainedTypeName> for #{MaybeConstrained} {\n                fn from(value: $unconstrainedTypeName) -> Self {\n                    Self::Unconstrained(value)\n                }\n            }\n\n            impl #{Display} for $name {\n                fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n                   ${shape.redactIfNecessary(model, \"self.0\")}.fmt(f)\n                }\n            }\n\n            impl #{From}<$name> for $unconstrainedTypeName {\n                fn from(value: $name) -> Self {\n                    value.into_inner()\n                }\n            }\n            \"\"\",\n            \"ConstrainedTrait\" to RuntimeType.ConstrainedTrait,\n            \"ConstraintViolation\" to constraintViolation,\n            \"MaybeConstrained\" to symbol.makeMaybeConstrained(),\n            \"Display\" to RuntimeType.Display,\n            \"From\" to RuntimeType.From,\n            \"TryFrom\" to RuntimeType.TryFrom,\n            \"AsRef\" to RuntimeType.AsRef,\n        )\n\n        writer.renderTryFrom(unconstrainedTypeName, name, constraintViolation, constraintsInfo)\n\n        inlineModuleCreator(constraintViolation) {\n            rustTemplate(\n                \"\"\"\n                ##[derive(Debug, PartialEq)]\n                pub enum ${constraintViolation.name} {\n                    Range($unconstrainedTypeName),\n                }\n\n                impl #{Display} for ${constraintViolation.name} {\n                    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n                        write!(f, \"${rangeInfo.rangeTrait.shapeConstraintViolationDisplayMessage(shape).replace(\"#\", \"##\")}\")\n                    }\n                }\n                    \n                impl #{Error} for ${constraintViolation.name} {}\n                \"\"\",\n                \"Error\" to RuntimeType.StdError,\n                \"Display\" to RuntimeType.Display,\n            )\n\n            if (shape.isReachableFromOperationInput()) {\n                rustTemplate(\n                    \"\"\"\n                    impl ${constraintViolation.name} {\n                        #{NumberShapeConstraintViolationImplBlock}\n                    }\n                    \"\"\",\n                    \"NumberShapeConstraintViolationImplBlock\" to validationExceptionConversionGenerator.numberShapeConstraintViolationImplBlock(rangeInfo),\n                )\n            }\n        }\n    }\n}\n\ndata class Range(val rangeTrait: RangeTrait) {\n    fun toTraitInfo(): TraitInfo =\n        TraitInfo(\n            { rust(\"Self::check_range(value)?;\") },\n            { docs(\"Error when a number doesn't satisfy its `@range` requirements.\") },\n            {\n                rust(\n                    \"\"\"\n                    Self::Range(_) => crate::model::ValidationExceptionField {\n                        message: format!(\"${rangeTrait.validationErrorMessage()}\", &path),\n                        path,\n                    },\n                    \"\"\",\n                )\n            },\n            this::renderValidationFunction,\n        )\n\n    /**\n     * Renders a `check_range` function to validate that the value matches the\n     * required range indicated by the `@range` trait.\n     */\n    private fun renderValidationFunction(\n        constraintViolation: Symbol,\n        unconstrainedTypeName: String,\n    ): Writable =\n        {\n            val valueVariableName = \"value\"\n            val condition =\n                if (rangeTrait.min.isPresent && rangeTrait.max.isPresent) {\n                    \"(${rangeTrait.min.get()}..=${rangeTrait.max.get()}).contains(&$valueVariableName)\"\n                } else if (rangeTrait.min.isPresent) {\n                    \"${rangeTrait.min.get()} <= $valueVariableName\"\n                } else {\n                    \"$valueVariableName <= ${rangeTrait.max.get()}\"\n                }\n\n            rustTemplate(\n                \"\"\"\n                fn check_range($valueVariableName: $unconstrainedTypeName) -> #{Result}<(), $constraintViolation> {\n                    if $condition {\n                        Ok(())\n                    } else {\n                        Err($constraintViolation::Range($valueVariableName))\n                    }\n                }\n                \"\"\",\n                *RuntimeType.preludeScope,\n            )\n        }\n}\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ConstrainedShapeGeneratorCommon.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.generators\n\n/**\n * Functions shared amongst the constrained shape generators, to keep them DRY and consistent.\n */\n\nfun rustDocsConstrainedTypeEpilogue(typeName: String) =\n    \"\"\"\n    This is a constrained type because its corresponding modeled Smithy shape has one or more\n    [constraint traits]. Use [`$typeName::try_from`] to construct values of this type.\n\n    [constraint traits]: https://smithy.io/2.0/spec/constraint-traits.html\n    \"\"\"\n\nfun rustDocsTryFromMethod(\n    typeName: String,\n    inner: String,\n) =\n    \"Constructs a `$typeName` from an [`$inner`], failing when the provided value does not satisfy the modeled constraints.\"\n\nfun rustDocsInnerMethod(inner: String) = \"Returns an immutable reference to the underlying [`$inner`].\"\n\nfun rustDocsIntoInnerMethod(inner: String) = \"Consumes the value, returning the underlying [`$inner`].\"\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ConstrainedStringGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.generators\n\nimport software.amazon.smithy.codegen.core.Symbol\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.shapes.StringShape\nimport software.amazon.smithy.model.traits.LengthTrait\nimport software.amazon.smithy.model.traits.PatternTrait\nimport software.amazon.smithy.model.traits.SensitiveTrait\nimport software.amazon.smithy.model.traits.Trait\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustType\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.Visibility\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.docs\nimport software.amazon.smithy.rust.codegen.core.rustlang.documentShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.join\nimport software.amazon.smithy.rust.codegen.core.rustlang.render\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\nimport software.amazon.smithy.rust.codegen.core.smithy.expectRustMetadata\nimport software.amazon.smithy.rust.codegen.core.smithy.makeMaybeConstrained\nimport software.amazon.smithy.rust.codegen.core.smithy.testModuleForShape\nimport software.amazon.smithy.rust.codegen.core.testutil.unitTest\nimport software.amazon.smithy.rust.codegen.core.util.PANIC\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\nimport software.amazon.smithy.rust.codegen.core.util.orNull\nimport software.amazon.smithy.rust.codegen.core.util.redactIfNecessary\nimport software.amazon.smithy.rust.codegen.server.smithy.InlineModuleCreator\nimport software.amazon.smithy.rust.codegen.server.smithy.PubCrateConstraintViolationSymbolProvider\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerCargoDependency\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenContext\nimport software.amazon.smithy.rust.codegen.server.smithy.shapeConstraintViolationDisplayMessage\nimport software.amazon.smithy.rust.codegen.server.smithy.supportedStringConstraintTraits\nimport software.amazon.smithy.rust.codegen.server.smithy.traits.isReachableFromOperationInput\nimport software.amazon.smithy.rust.codegen.server.smithy.validationErrorMessage\n\n/**\n * [ConstrainedStringGenerator] generates a wrapper tuple newtype holding a constrained `String`.\n * This type can be built from unconstrained values, yielding a `ConstraintViolation` when the input does not satisfy\n * the constraints.\n */\nclass ConstrainedStringGenerator(\n    val codegenContext: ServerCodegenContext,\n    private val inlineModuleCreator: InlineModuleCreator,\n    private val writer: RustWriter,\n    val shape: StringShape,\n    private val validationExceptionConversionGenerator: ValidationExceptionConversionGenerator,\n) {\n    val model = codegenContext.model\n    val constrainedShapeSymbolProvider = codegenContext.constrainedShapeSymbolProvider\n    val publicConstrainedTypes = codegenContext.settings.codegenConfig.publicConstrainedTypes\n    private val constraintViolationSymbolProvider =\n        with(codegenContext.constraintViolationSymbolProvider) {\n            if (publicConstrainedTypes) {\n                this\n            } else {\n                PubCrateConstraintViolationSymbolProvider(this)\n            }\n        }\n    private val symbol = constrainedShapeSymbolProvider.toSymbol(shape)\n    private val stringConstraintsInfo: List<StringTraitInfo> =\n        supportedStringConstraintTraits\n            .mapNotNull { shape.getTrait(it).orNull() }\n            .map { StringTraitInfo.fromTrait(symbol, it, isSensitive = shape.hasTrait<SensitiveTrait>()) }\n    private val constraintsInfo: List<TraitInfo> =\n        stringConstraintsInfo.map(StringTraitInfo::toTraitInfo)\n\n    fun render() {\n        val name = symbol.name\n        val inner = RustType.String.render()\n        val constraintViolation = constraintViolationSymbolProvider.toSymbol(shape)\n\n        writer.documentShape(shape, model)\n        writer.docs(rustDocsConstrainedTypeEpilogue(name))\n        val metadata = symbol.expectRustMetadata()\n        metadata.render(writer)\n        writer.rust(\"struct $name(pub(crate) $inner);\")\n        if (metadata.visibility == Visibility.PUBCRATE) {\n            Attribute.AllowDeadCode.render(writer)\n        }\n        writer.rust(\n            \"\"\"\n            impl $name {\n                /// Extracts a string slice containing the entire underlying `String`.\n                pub fn as_str(&self) -> &str {\n                    &self.0\n                }\n\n                /// ${rustDocsInnerMethod(inner)}\n                pub fn inner(&self) -> &$inner {\n                    &self.0\n                }\n\n                /// ${rustDocsIntoInnerMethod(inner)}\n                pub fn into_inner(self) -> $inner {\n                    self.0\n                }\n            }\"\"\",\n        )\n\n        writer.renderTryFrom(inner, name, constraintViolation, constraintsInfo)\n\n        writer.rustTemplate(\n            \"\"\"\n            impl #{ConstrainedTrait} for $name  {\n                type Unconstrained = $inner;\n            }\n\n            impl #{From}<$inner> for #{MaybeConstrained} {\n                fn from(value: $inner) -> Self {\n                    Self::Unconstrained(value)\n                }\n            }\n\n            impl #{Display} for $name {\n                fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n                   ${shape.redactIfNecessary(model, \"self.0\")}.fmt(f)\n                }\n            }\n\n            impl #{From}<$name> for $inner {\n                fn from(value: $name) -> Self {\n                    value.into_inner()\n                }\n            }\n            \"\"\",\n            \"ConstrainedTrait\" to RuntimeType.ConstrainedTrait,\n            \"ConstraintViolation\" to constraintViolation,\n            \"MaybeConstrained\" to symbol.makeMaybeConstrained(),\n            \"Display\" to RuntimeType.Display,\n            \"From\" to RuntimeType.From,\n        )\n\n        inlineModuleCreator(constraintViolation) {\n            renderConstraintViolationEnum(this, shape, constraintViolation)\n        }\n\n        renderTests(shape)\n    }\n\n    private fun renderConstraintViolationEnum(\n        writer: RustWriter,\n        shape: StringShape,\n        constraintViolation: Symbol,\n    ) {\n        writer.rustTemplate(\n            \"\"\"\n            ##[derive(Debug, PartialEq)]\n            pub enum ${constraintViolation.name} {\n                #{Variants:W}\n            }\n\n            impl #{Display} for ${constraintViolation.name} {\n                fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n                    let message = match self {\n                        #{VariantDisplayMessages:W}\n                    };\n                    write!(f, \"{message}\")\n                }\n            }\n\n            impl #{Error} for ${constraintViolation.name} {}\n            \"\"\",\n            \"Variants\" to constraintsInfo.map { it.constraintViolationVariant }.join(\",\\n\"),\n            \"Error\" to RuntimeType.StdError,\n            \"Display\" to RuntimeType.Display,\n            \"VariantDisplayMessages\" to generateDisplayMessageForEachVariant(),\n        )\n\n        if (shape.isReachableFromOperationInput()) {\n            writer.rustTemplate(\n                \"\"\"\n                impl ${constraintViolation.name} {\n                    #{StringShapeConstraintViolationImplBlock:W}\n                }\n                \"\"\",\n                \"StringShapeConstraintViolationImplBlock\" to\n                    validationExceptionConversionGenerator\n                        .stringShapeConstraintViolationImplBlock(stringConstraintsInfo),\n            )\n        }\n    }\n\n    private fun generateDisplayMessageForEachVariant() =\n        writable {\n            stringConstraintsInfo.forEach {\n                it.shapeConstraintViolationDisplayMessage(shape).invoke(this)\n            }\n        }\n\n    private fun renderTests(shape: Shape) {\n        val testCases = TraitInfo.testCases(constraintsInfo)\n\n        if (testCases.isNotEmpty()) {\n            val testModule = constrainedShapeSymbolProvider.testModuleForShape(shape)\n            writer.withInlineModule(testModule, null) {\n                rustTemplate(\n                    \"\"\"\n                    #{TestCases:W}\n                    \"\"\",\n                    \"TestCases\" to testCases.join(\"\\n\"),\n                )\n            }\n        }\n    }\n}\n\ndata class Length(val lengthTrait: LengthTrait) : StringTraitInfo() {\n    override fun toTraitInfo(): TraitInfo =\n        TraitInfo(\n            tryFromCheck = { rust(\"Self::check_length(&value)?;\") },\n            constraintViolationVariant = {\n                docs(\"Error when a string doesn't satisfy its `@length` requirements.\")\n                rust(\"Length(usize)\")\n            },\n            asValidationExceptionField = {\n                rust(\n                    \"\"\"\n                    Self::Length(length) => crate::model::ValidationExceptionField {\n                        message: format!(\"${lengthTrait.validationErrorMessage()}\", length, &path),\n                        path,\n                    },\n                    \"\"\",\n                )\n            },\n            validationFunctionDefinition = this::renderValidationFunction,\n        )\n\n    /**\n     * Renders a `check_length` function to validate the string matches the\n     * required length indicated by the `@length` trait.\n     */\n    @Suppress(\"UNUSED_PARAMETER\")\n    private fun renderValidationFunction(\n        constraintViolation: Symbol,\n        unconstrainedTypeName: String,\n    ): Writable =\n        {\n            // Note that we're using the linear time check `chars().count()` instead of `len()` on the input value, since the\n            // Smithy specification says the `length` trait counts the number of Unicode code points when applied to string shapes.\n            // https://awslabs.github.io/smithy/1.0/spec/core/constraint-traits.html#length-trait\n            rustTemplate(\n                \"\"\"\n                fn check_length(string: &str) -> #{Result}<(), $constraintViolation> {\n                    let length = string.chars().count();\n\n                    if ${lengthTrait.rustCondition(\"length\")} {\n                        Ok(())\n                    } else {\n                        Err($constraintViolation::Length(length))\n                    }\n                }\n                \"\"\",\n                *preludeScope,\n            )\n        }\n\n    override fun shapeConstraintViolationDisplayMessage(shape: Shape) =\n        writable {\n            rustTemplate(\n                \"\"\"\n                Self::Length(length) => {\n                    format!(\"${lengthTrait.shapeConstraintViolationDisplayMessage(shape).replace(\"#\", \"##\")}\", length)\n                },\n                \"\"\",\n            )\n        }\n}\n\ndata class Pattern(val symbol: Symbol, val patternTrait: PatternTrait, val isSensitive: Boolean) :\n    StringTraitInfo() {\n    override fun toTraitInfo(): TraitInfo {\n        return TraitInfo(\n            tryFromCheck = { rust(\"let value = Self::check_pattern(value)?;\") },\n            constraintViolationVariant = {\n                docs(\"Error when a string doesn't satisfy its `@pattern`.\")\n                docs(\"Contains the String that failed the pattern.\")\n                rust(\"Pattern(String)\")\n            },\n            asValidationExceptionField = {\n                Attribute.AllowUnusedVariables.render(this)\n                rustTemplate(\n                    \"\"\"\n                    Self::Pattern(_) => crate::model::ValidationExceptionField {\n                        message: #{ErrorMessage:W},\n                        path\n                    },\n                    \"\"\",\n                    \"ErrorMessage\" to errorMessage(),\n                )\n            },\n            this::renderValidationFunction,\n            testCases =\n                listOf {\n                    unitTest(\"regex_compiles\") {\n                        rustTemplate(\n                            \"\"\"\n                            #{T}::compile_regex();\n                            \"\"\",\n                            \"T\" to symbol,\n                        )\n                    }\n                },\n        )\n    }\n\n    fun errorMessage(): Writable {\n        return writable {\n            val pattern = patternTrait.pattern.toString().replace(\"#\", \"##\")\n            rust(\n                \"\"\"\n                format!(\"${patternTrait.validationErrorMessage()}\", &path, r##\"$pattern\"##)\n                \"\"\",\n            )\n        }\n    }\n\n    /**\n     * Renders a `check_pattern` function to validate the string matches the\n     * supplied regex in the `@pattern` trait.\n     */\n    private fun renderValidationFunction(\n        constraintViolation: Symbol,\n        unconstrainedTypeName: String,\n    ): Writable {\n        val pattern = patternTrait.pattern.toString().replace(\"#\", \"##\")\n        val errorMessageForUnsupportedRegex =\n            \"\"\"The regular expression $pattern is not supported by the `regex` crate; feel free to file an issue under https://github.com/smithy-lang/smithy-rs/issues for support\"\"\"\n\n        return {\n            rustTemplate(\n                \"\"\"\n                fn check_pattern(string: $unconstrainedTypeName) -> #{Result}<$unconstrainedTypeName, $constraintViolation> {\n                    let regex = Self::compile_regex();\n\n                    if regex.is_match(&string) {\n                        Ok(string)\n                    } else {\n                        Err($constraintViolation::Pattern(string))\n                    }\n                }\n\n                /// Attempts to compile the regex for this constrained type's `@pattern`.\n                /// This can fail if the specified regex is not supported by the `#{Regex}` crate.\n                pub fn compile_regex() -> &'static #{Regex}::Regex {\n                    static REGEX: std::sync::LazyLock<#{Regex}::Regex> = std::sync::LazyLock::new(|| #{Regex}::Regex::new(r##\"$pattern\"##).expect(r##\"$errorMessageForUnsupportedRegex\"##));\n\n                    &REGEX\n                }\n                \"\"\",\n                \"Regex\" to ServerCargoDependency.Regex.toType(),\n                *preludeScope,\n            )\n        }\n    }\n\n    override fun shapeConstraintViolationDisplayMessage(shape: Shape) =\n        writable {\n            val errorMessage =\n                patternTrait.shapeConstraintViolationDisplayMessage(shape).replace(\"#\", \"##\")\n            val pattern = patternTrait.pattern.toString().replace(\"#\", \"##\")\n            rustTemplate(\n                \"\"\"\n                Self::Pattern(_) => {\n                    format!(r##\"$errorMessage\"##, r##\"$pattern\"##)\n                },\n                \"\"\",\n            )\n        }\n}\n\nsealed class StringTraitInfo {\n    companion object {\n        fun fromTrait(\n            symbol: Symbol,\n            trait: Trait,\n            isSensitive: Boolean,\n        ) = when (trait) {\n            is PatternTrait -> {\n                Pattern(symbol, trait, isSensitive)\n            }\n            is LengthTrait -> {\n                Length(trait)\n            }\n            else -> PANIC(\"StringTraitInfo.fromTrait called with unsupported trait $trait\")\n        }\n    }\n\n    abstract fun toTraitInfo(): TraitInfo\n\n    abstract fun shapeConstraintViolationDisplayMessage(shape: Shape): Writable\n}\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ConstrainedTraitForEnumGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.generators\n\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.StringShape\nimport software.amazon.smithy.model.traits.EnumTrait\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\nimport software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.makeMaybeConstrained\nimport software.amazon.smithy.rust.codegen.core.util.expectTrait\n\n/**\n * [ConstrainedTraitForEnumGenerator] generates code that implements the [RuntimeType.ConstrainedTrait] trait on an\n * enum shape.\n */\nclass ConstrainedTraitForEnumGenerator(\n    val model: Model,\n    val symbolProvider: RustSymbolProvider,\n    val writer: RustWriter,\n    val shape: StringShape,\n) {\n    fun render() {\n        shape.expectTrait<EnumTrait>()\n\n        val symbol = symbolProvider.toSymbol(shape)\n        val name = symbol.name\n        val unconstrainedType = RuntimeType.String.fullyQualifiedName()\n\n        writer.rustTemplate(\n            \"\"\"\n            impl #{ConstrainedTrait} for $name  {\n                type Unconstrained = $unconstrainedType;\n            }\n\n            impl #{From}<$unconstrainedType> for #{MaybeConstrained} {\n                fn from(value: $unconstrainedType) -> Self {\n                    Self::Unconstrained(value)\n                }\n            }\n            \"\"\",\n            *preludeScope,\n            \"ConstrainedTrait\" to RuntimeType.ConstrainedTrait,\n            \"MaybeConstrained\" to symbol.makeMaybeConstrained(),\n        )\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/DocHandlerGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.generators\n\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenContext\nimport software.amazon.smithy.rust.codegen.core.util.inputShape\nimport software.amazon.smithy.rust.codegen.core.util.outputShape\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerRustModule.Error as ErrorModule\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerRustModule.Input as InputModule\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerRustModule.Output as OutputModule\n\n/**\n * Generates a handler implementation stub for use within documentation.\n */\nclass DocHandlerGenerator(\n    codegenContext: CodegenContext,\n    private val operation: OperationShape,\n    private val handlerName: String,\n    private val commentToken: String = \"//\",\n) {\n    private val model = codegenContext.model\n    private val symbolProvider = codegenContext.symbolProvider\n\n    private val inputSymbol = symbolProvider.toSymbol(operation.inputShape(model))\n    private val outputSymbol = symbolProvider.toSymbol(operation.outputShape(model))\n    private val errorSymbol = symbolProvider.symbolForOperationError(operation)\n\n    /**\n     * Returns the function signature for an operation handler implementation. Used in the documentation.\n     */\n    fun docSignature(): Writable {\n        val outputT =\n            if (operation.errors.isEmpty()) {\n                \"${OutputModule.name}::${outputSymbol.name}\"\n            } else {\n                \"Result<${OutputModule.name}::${outputSymbol.name}, ${ErrorModule.name}::${errorSymbol.name}>\"\n            }\n\n        return writable {\n            rust(\n                \"\"\"\n                $commentToken async fn $handlerName(input: ${InputModule.name}::${inputSymbol.name}) -> $outputT {\n                $commentToken     todo!()\n                $commentToken }\n                \"\"\".trimIndent(),\n            )\n        }\n    }\n\n    /**\n     * Similarly to `docSignature`, returns the function signature of an operation handler implementation, with the\n     * difference that we don't ellide the error for use in `tower::service_fn`.\n     */\n    fun docFixedSignature(): Writable {\n        val errorT =\n            if (operation.errors.isEmpty()) {\n                \"std::convert::Infallible\"\n            } else {\n                \"${ErrorModule.name}::${errorSymbol.name}\"\n            }\n\n        return writable {\n            rust(\n                \"\"\"\n                $commentToken async fn $handlerName(input: ${InputModule.name}::${inputSymbol.name}) -> Result<${OutputModule.name}::${outputSymbol.name}, $errorT> {\n                $commentToken     todo!()\n                $commentToken }\n                \"\"\".trimIndent(),\n            )\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/LenghTraitCommon.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.generators\n\nimport software.amazon.smithy.model.traits.LengthTrait\n\nfun LengthTrait.rustCondition(lengthVariable: String): String {\n    val condition =\n        if (min.isPresent && max.isPresent) {\n            \"(${min.get()}..=${max.get()}).contains(&$lengthVariable)\"\n        } else if (min.isPresent) {\n            \"${min.get()} <= $lengthVariable\"\n        } else {\n            \"$lengthVariable <= ${max.get()}\"\n        }\n\n    return condition\n}\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/MapConstraintViolationGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.generators\n\nimport software.amazon.smithy.model.shapes.MapShape\nimport software.amazon.smithy.model.shapes.StringShape\nimport software.amazon.smithy.model.traits.LengthTrait\nimport software.amazon.smithy.rust.codegen.core.rustlang.Visibility\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.makeRustBoxed\nimport software.amazon.smithy.rust.codegen.core.util.getTrait\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\nimport software.amazon.smithy.rust.codegen.core.util.letIf\nimport software.amazon.smithy.rust.codegen.server.smithy.InlineModuleCreator\nimport software.amazon.smithy.rust.codegen.server.smithy.PubCrateConstraintViolationSymbolProvider\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenContext\nimport software.amazon.smithy.rust.codegen.server.smithy.shapeConstraintViolationDisplayMessage\nimport software.amazon.smithy.rust.codegen.server.smithy.traits.ConstraintViolationRustBoxTrait\nimport software.amazon.smithy.rust.codegen.server.smithy.traits.isReachableFromOperationInput\n\nclass MapConstraintViolationGenerator(\n    codegenContext: ServerCodegenContext,\n    private val inlineModuleCreator: InlineModuleCreator,\n    val shape: MapShape,\n    private val validationExceptionConversionGenerator: ValidationExceptionConversionGenerator,\n) {\n    private val model = codegenContext.model\n    private val constrainedShapeSymbolProvider = codegenContext.constrainedShapeSymbolProvider\n    private val symbolProvider = codegenContext.symbolProvider\n    private val publicConstrainedTypes = codegenContext.settings.codegenConfig.publicConstrainedTypes\n    private val constraintViolationSymbolProvider =\n        with(codegenContext.constraintViolationSymbolProvider) {\n            if (publicConstrainedTypes) {\n                this\n            } else {\n                PubCrateConstraintViolationSymbolProvider(this)\n            }\n        }\n\n    fun render() {\n        val keyShape = model.expectShape(shape.key.target, StringShape::class.java)\n        val valueShape = model.expectShape(shape.value.target)\n        val constraintViolationSymbol = constraintViolationSymbolProvider.toSymbol(shape)\n        val constraintViolationName = constraintViolationSymbol.name\n\n        val constraintViolationCodegenScopeMutableList: MutableList<Pair<String, Any>> = mutableListOf()\n        val keyConstraintViolationExists = shape.isReachableFromOperationInput() && isKeyConstrained(keyShape, symbolProvider)\n        val valueConstraintViolationExists = shape.isReachableFromOperationInput() && isValueConstrained(valueShape, model, symbolProvider)\n        if (keyConstraintViolationExists) {\n            constraintViolationCodegenScopeMutableList.add(\"KeyConstraintViolationSymbol\" to constraintViolationSymbolProvider.toSymbol(keyShape))\n        }\n        if (valueConstraintViolationExists) {\n            constraintViolationCodegenScopeMutableList.add(\n                \"ValueConstraintViolationSymbol\" to\n                    constraintViolationSymbolProvider.toSymbol(valueShape).letIf(\n                        shape.value.hasTrait<ConstraintViolationRustBoxTrait>(),\n                    ) {\n                        it.makeRustBoxed()\n                    },\n            )\n            constraintViolationCodegenScopeMutableList.add(\"KeySymbol\" to constrainedShapeSymbolProvider.toSymbol(keyShape))\n        }\n        val constraintViolationCodegenScope = constraintViolationCodegenScopeMutableList.toTypedArray()\n\n        val constraintViolationVisibility =\n            if (publicConstrainedTypes) {\n                Visibility.PUBLIC\n            } else {\n                Visibility.PUBCRATE\n            }\n\n        inlineModuleCreator(constraintViolationSymbol) {\n            // TODO(https://github.com/smithy-lang/smithy-rs/issues/1401) We should really have two `ConstraintViolation`\n            //  types here. One will just have variants for each constraint trait on the map shape, for use by the user.\n            //  The other one will have variants if the shape's key or value is directly or transitively constrained,\n            //  and is for use by the framework.\n            rustTemplate(\n                \"\"\"\n                ##[allow(clippy::enum_variant_names)]\n                ##[derive(Debug, PartialEq)]\n                pub${ if (constraintViolationVisibility == Visibility.PUBCRATE) \" (crate) \" else \"\" } enum $constraintViolationName {\n                    ${if (shape.hasTrait<LengthTrait>()) \"Length(usize),\" else \"\"}\n                    ${if (keyConstraintViolationExists) \"##[doc(hidden)] Key(#{KeyConstraintViolationSymbol}),\" else \"\"}\n                    ${if (valueConstraintViolationExists) \"##[doc(hidden)] Value(#{KeySymbol}, #{ValueConstraintViolationSymbol}),\" else \"\"}\n                }\n                \n                impl #{Display} for $constraintViolationName {\n                    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n                        match self {\n                            ${if (shape.hasTrait<LengthTrait>()) \"#{LengthMatchingArm}\" else \"\"}\n                            ${if (keyConstraintViolationExists) \"\"\"Self::Key(key_constraint_violation) => write!(f, \"{}\", key_constraint_violation),\"\"\" else \"\"}\n                            ${if (valueConstraintViolationExists) \"\"\"Self::Value(_, value_constraint_violation) => write!(f, \"{}\", value_constraint_violation),\"\"\" else \"\"}\n                        }\n                    }\n                }\n                \n                impl #{Error} for $constraintViolationName {}\n                \"\"\",\n                *constraintViolationCodegenScope,\n                \"LengthMatchingArm\" to lengthMatchingArm(),\n                \"Error\" to RuntimeType.StdError,\n                \"Display\" to RuntimeType.Display,\n            )\n\n            if (shape.isReachableFromOperationInput()) {\n                rustTemplate(\n                    \"\"\"\n                    impl $constraintViolationName {\n                        #{MapShapeConstraintViolationImplBlock}\n                    }\n                    \"\"\",\n                    \"MapShapeConstraintViolationImplBlock\" to\n                        validationExceptionConversionGenerator.mapShapeConstraintViolationImplBlock(\n                            shape,\n                            keyShape,\n                            valueShape,\n                            symbolProvider,\n                            model,\n                        ),\n                )\n            }\n        }\n    }\n\n    private fun lengthMatchingArm() =\n        writable {\n            shape.getTrait<LengthTrait>()?.let {\n                rustTemplate(\n                    \"\"\"\n                    Self::Length(length) => {\n                        write!(f, \"${it.shapeConstraintViolationDisplayMessage(shape).replace(\"#\", \"##\")}\", length)\n                    },\n                    \"\"\",\n                )\n            }\n        }\n}\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/PubCrateConstrainedCollectionGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.generators\n\nimport software.amazon.smithy.model.shapes.CollectionShape\nimport software.amazon.smithy.model.shapes.MapShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.conditionalBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlockTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.withBlock\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.isOptional\nimport software.amazon.smithy.rust.codegen.server.smithy.InlineModuleCreator\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenContext\nimport software.amazon.smithy.rust.codegen.server.smithy.canReachConstrainedShape\nimport software.amazon.smithy.rust.codegen.server.smithy.isDirectlyConstrained\nimport software.amazon.smithy.rust.codegen.server.smithy.isTransitivelyButNotDirectlyConstrained\nimport software.amazon.smithy.rust.codegen.server.smithy.typeNameContainsNonPublicType\n\n/**\n * A generator for a wrapper tuple newtype over a collection shape's symbol\n * type.\n *\n * This newtype is for a collection shape that is _transitively_ constrained,\n * but not directly. That is, the collection shape does not have a constraint\n * trait attached, but the members it holds reach a constrained shape. The\n * generated newtype is therefore `pub(crate)`, as the class name indicates,\n * and is not available to end users. After deserialization, upon constraint\n * traits' enforcement, this type is converted into the regular `Vec` the user\n * sees via the generated converters.\n *\n * TODO(https://github.com/smithy-lang/smithy-rs/issues/1401) If the collection\n *  shape is _directly_ constrained, use [ConstrainedCollectionGenerator]\n *  instead.\n */\nclass PubCrateConstrainedCollectionGenerator(\n    val codegenContext: ServerCodegenContext,\n    private val inlineModuleCreator: InlineModuleCreator,\n    val shape: CollectionShape,\n) {\n    private val model = codegenContext.model\n    private val publicConstrainedTypes = codegenContext.settings.codegenConfig.publicConstrainedTypes\n    private val unconstrainedShapeSymbolProvider = codegenContext.unconstrainedShapeSymbolProvider\n    private val pubCrateConstrainedShapeSymbolProvider = codegenContext.pubCrateConstrainedShapeSymbolProvider\n    private val constrainedShapeSymbolProvider = codegenContext.constrainedShapeSymbolProvider\n    private val symbolProvider = codegenContext.symbolProvider\n\n    fun render() {\n        check(shape.canReachConstrainedShape(model, symbolProvider))\n\n        val symbol = symbolProvider.toSymbol(shape)\n        val constrainedSymbol = pubCrateConstrainedShapeSymbolProvider.toSymbol(shape)\n\n        val unconstrainedSymbol = unconstrainedShapeSymbolProvider.toSymbol(shape)\n        val name = constrainedSymbol.name\n        val innerShape = model.expectShape(shape.member.target)\n        val innerMemberSymbol =\n            if (innerShape.isTransitivelyButNotDirectlyConstrained(model, symbolProvider)) {\n                pubCrateConstrainedShapeSymbolProvider.toSymbol(shape.member)\n            } else {\n                constrainedShapeSymbolProvider.toSymbol(shape.member)\n            }\n\n        val codegenScope =\n            arrayOf(\n                \"InnerMemberSymbol\" to innerMemberSymbol,\n                \"ConstrainedTrait\" to RuntimeType.ConstrainedTrait,\n                \"UnconstrainedSymbol\" to unconstrainedSymbol,\n                \"Symbol\" to symbol,\n                \"From\" to RuntimeType.From,\n            )\n\n        inlineModuleCreator(constrainedSymbol) {\n            rustTemplate(\n                \"\"\"\n                ##[derive(Debug, Clone)]\n                pub(crate) struct $name(pub(crate) std::vec::Vec<#{InnerMemberSymbol}>);\n\n                impl #{ConstrainedTrait} for $name  {\n                    type Unconstrained = #{UnconstrainedSymbol};\n                }\n                \"\"\",\n                *codegenScope,\n            )\n\n            if (publicConstrainedTypes) {\n                // If the target member shape is itself _not_ directly constrained, and is an aggregate non-Structure shape,\n                // then its corresponding constrained type is the `pub(crate)` wrapper tuple type, which needs converting into\n                // the public type the user is exposed to. The two types are isomorphic, and we can convert between them using\n                // `From`. So we track this particular case here in order to iterate over the list's members and convert\n                // each of them.\n                //\n                // Note that we could add the iteration code unconditionally and it would still be correct, but the `into()` calls\n                // would be useless. Clippy flags this as [`useless_conversion`]. We could deactivate the lint, but it's probably\n                // best that we just don't emit a useless iteration, lest the compiler not optimize it away (see [Godbolt]),\n                // and to make the generated code a little bit simpler.\n                //\n                // [`useless_conversion`]: https://rust-lang.github.io/rust-clippy/master/index.html#useless_conversion.\n                // [Godbolt]: https://godbolt.org/z/eheWebWMa\n                val innerNeedsConstraining =\n                    !innerShape.isDirectlyConstrained(symbolProvider) && (innerShape is CollectionShape || innerShape is MapShape)\n\n                rustTemplate(\n                    \"\"\"\n                    impl #{From}<#{Symbol}> for $name {\n                        fn from(v: #{Symbol}) -> Self {\n                            ${\n                        if (innerNeedsConstraining) {\n                            \"Self(v.into_iter().map(|item| item.into()).collect())\"\n                        } else {\n                            \"Self(v)\"\n                        }\n                    }\n                        }\n                    }\n\n                    impl #{From}<$name> for #{Symbol} {\n                        fn from(v: $name) -> Self {\n                            ${\n                        if (innerNeedsConstraining) {\n                            \"v.0.into_iter().map(|item| item.into()).collect()\"\n                        } else {\n                            \"v.0\"\n                        }\n                    }\n                        }\n                    }\n                    \"\"\",\n                    *codegenScope,\n                )\n            } else {\n                val innerNeedsConversion =\n                    innerShape.typeNameContainsNonPublicType(model, symbolProvider, publicConstrainedTypes)\n\n                rustBlockTemplate(\"impl #{From}<$name> for #{Symbol}\", *codegenScope) {\n                    rustBlock(\"fn from(v: $name) -> Self\") {\n                        if (innerNeedsConversion) {\n                            withBlock(\"v.0.into_iter().map(|item| \", \").collect()\") {\n                                conditionalBlock(\"item.map(|item| \", \")\", innerMemberSymbol.isOptional()) {\n                                    rust(\"item.into()\")\n                                }\n                            }\n                        } else {\n                            rust(\"v.0\")\n                        }\n                    }\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/PubCrateConstrainedMapGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.generators\n\nimport software.amazon.smithy.model.shapes.CollectionShape\nimport software.amazon.smithy.model.shapes.MapShape\nimport software.amazon.smithy.model.shapes.StringShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.conditionalBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlockTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.withBlock\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.isOptional\nimport software.amazon.smithy.rust.codegen.server.smithy.InlineModuleCreator\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenContext\nimport software.amazon.smithy.rust.codegen.server.smithy.canReachConstrainedShape\nimport software.amazon.smithy.rust.codegen.server.smithy.isDirectlyConstrained\nimport software.amazon.smithy.rust.codegen.server.smithy.isTransitivelyButNotDirectlyConstrained\nimport software.amazon.smithy.rust.codegen.server.smithy.typeNameContainsNonPublicType\n\n/**\n * A generator for a wrapper tuple newtype over a map shape's symbol type.\n *\n * This newtype is for a map shape that is _transitively_ constrained, but not\n * directly. That is, the map shape does not have a constraint trait attached,\n * but the keys and/or values it holds reach a constrained shape. The generated\n * newtype is therefore `pub(crate)`, as the class name indicates, and is not\n * available to end users. After deserialization, upon constraint traits'\n * enforcement, this type is converted into the regular `HashMap` the user sees\n * via the generated converters.\n *\n * If the map shape is _directly_ constrained, use [ConstrainedMapGenerator]\n * instead.\n */\nclass PubCrateConstrainedMapGenerator(\n    val codegenContext: ServerCodegenContext,\n    private val inlineModuleCreator: InlineModuleCreator,\n    val shape: MapShape,\n) {\n    private val model = codegenContext.model\n    private val publicConstrainedTypes = codegenContext.settings.codegenConfig.publicConstrainedTypes\n    private val unconstrainedShapeSymbolProvider = codegenContext.unconstrainedShapeSymbolProvider\n    private val pubCrateConstrainedShapeSymbolProvider = codegenContext.pubCrateConstrainedShapeSymbolProvider\n    private val constrainedShapeSymbolProvider = codegenContext.constrainedShapeSymbolProvider\n    private val symbolProvider = codegenContext.symbolProvider\n\n    fun render() {\n        check(shape.canReachConstrainedShape(model, symbolProvider))\n\n        val symbol = symbolProvider.toSymbol(shape)\n        val unconstrainedSymbol = unconstrainedShapeSymbolProvider.toSymbol(shape)\n        val constrainedSymbol = pubCrateConstrainedShapeSymbolProvider.toSymbol(shape)\n        val name = constrainedSymbol.name\n        val keyShape = model.expectShape(shape.key.target, StringShape::class.java)\n        val valueShape = model.expectShape(shape.value.target)\n        val keySymbol = constrainedShapeSymbolProvider.toSymbol(keyShape)\n        val valueMemberSymbol =\n            if (valueShape.isTransitivelyButNotDirectlyConstrained(model, symbolProvider)) {\n                pubCrateConstrainedShapeSymbolProvider.toSymbol(shape.value)\n            } else {\n                constrainedShapeSymbolProvider.toSymbol(shape.value)\n            }\n\n        val codegenScope =\n            arrayOf(\n                \"KeySymbol\" to keySymbol,\n                \"ValueMemberSymbol\" to valueMemberSymbol,\n                \"ConstrainedTrait\" to RuntimeType.ConstrainedTrait,\n                \"UnconstrainedSymbol\" to unconstrainedSymbol,\n                \"Symbol\" to symbol,\n                \"From\" to RuntimeType.From,\n            )\n\n        inlineModuleCreator(constrainedSymbol) {\n            rustTemplate(\n                \"\"\"\n                ##[derive(Debug, Clone)]\n                pub(crate) struct $name(pub(crate) std::collections::HashMap<#{KeySymbol}, #{ValueMemberSymbol}>);\n\n                impl #{ConstrainedTrait} for $name  {\n                    type Unconstrained = #{UnconstrainedSymbol};\n                }\n                \"\"\",\n                *codegenScope,\n            )\n\n            if (publicConstrainedTypes) {\n                // Unless the map holds an aggregate shape as its value shape whose symbol's type is _not_ `pub(crate)`, the\n                // `.into()` calls are useless.\n                // See the comment in [ConstrainedCollectionShape] for a more detailed explanation.\n                val innerNeedsConstraining =\n                    !valueShape.isDirectlyConstrained(symbolProvider) && (valueShape is CollectionShape || valueShape is MapShape)\n\n                rustTemplate(\n                    \"\"\"\n                    impl #{From}<#{Symbol}> for $name {\n                        fn from(v: #{Symbol}) -> Self {\n                            ${ if (innerNeedsConstraining) {\n                        \"Self(v.into_iter().map(|(k, v)| (k, v.into())).collect())\"\n                    } else {\n                        \"Self(v)\"\n                    } }\n                        }\n                    }\n\n                    impl #{From}<$name> for #{Symbol} {\n                        fn from(v: $name) -> Self {\n                            ${ if (innerNeedsConstraining) {\n                        \"v.0.into_iter().map(|(k, v)| (k, v.into())).collect()\"\n                    } else {\n                        \"v.0\"\n                    } }\n                        }\n                    }\n                    \"\"\",\n                    *codegenScope,\n                )\n            } else {\n                val keyNeedsConversion = keyShape.typeNameContainsNonPublicType(model, symbolProvider, publicConstrainedTypes)\n                val valueNeedsConversion = valueShape.typeNameContainsNonPublicType(model, symbolProvider, publicConstrainedTypes)\n\n                rustBlockTemplate(\"impl #{From}<$name> for #{Symbol}\", *codegenScope) {\n                    rustBlock(\"fn from(v: $name) -> Self\") {\n                        if (keyNeedsConversion || valueNeedsConversion) {\n                            withBlock(\"v.0.into_iter().map(|(k, v)| {\", \"}).collect()\") {\n                                if (keyNeedsConversion) {\n                                    rust(\"let k = k.into();\")\n                                }\n                                if (valueNeedsConversion) {\n                                    withBlock(\"let v = {\", \"};\") {\n                                        conditionalBlock(\"v.map(|v| \", \")\", valueMemberSymbol.isOptional()) {\n                                            rust(\"v.into()\")\n                                        }\n                                    }\n                                }\n                                rust(\"(k, v)\")\n                            }\n                        } else {\n                            rust(\"v.0\")\n                        }\n                    }\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ScopeMacroGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.generators\n\nimport software.amazon.smithy.model.knowledge.TopDownIndex\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.util.toPascalCase\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenContext\n\nclass ScopeMacroGenerator(\n    private val codegenContext: ServerCodegenContext,\n) {\n    /** Calculate all `operationShape`s contained within the `ServiceShape`. */\n    private val index = TopDownIndex.of(codegenContext.model)\n    private val operations = index.getContainedOperations(codegenContext.serviceShape).toSortedSet(compareBy { it.id })\n\n    private fun macro(): Writable =\n        writable {\n            val firstOperationName = codegenContext.symbolProvider.toSymbol(operations.first()).name.toPascalCase()\n            val operationNames =\n                operations.joinToString(\" \") {\n                    codegenContext.symbolProvider.toSymbol(it).name.toPascalCase()\n                }\n\n            // When writing `macro_rules!` we add whitespace between `$` and the arguments to avoid Kotlin templating.\n\n            // To achieve the desired API we need to calculate the set theoretic complement `B \\ A`.\n            // The macro below, for rules prefixed with `@`, encodes a state machine which performs this.\n            // The initial state is `(A) () (B)`, where `A` and `B` are lists of elements of `A` and `B`.\n            // The rules, in order:\n            // - Terminate on pattern `() (t0, t1, ...) (b0, b1, ...)`, the complement has been calculated as\n            // `{ t0, t1, ..., b0, b1, ...}`.\n            // - Send pattern `(x, a0, a1, ...) (t0, t1, ...) (x, b0, b1, ...)` to\n            // `(a0, a1, ...) (t0, t1, ...) (b0, b1, ...)`, eliminating a matching `x` from `A` and `B`.\n            // - Send pattern `(a0, a1, ...) (t0, t1, ...) ()` to `(a0, a1, ...) () (t0, t1, ...)`, restarting the search.\n            // - Send pattern `(a0, a1, ...) (t0, t1, ...) (b0, b1, ...)` to `(a0, a1, ...) (b0, t0, t1, ...) (b1, ...)`,\n            // iterating through the `B`.\n            val operationBranches =\n                operations\n                    .map { codegenContext.symbolProvider.toSymbol(it).name.toPascalCase() }.joinToString(\"\") {\n                        \"\"\"\n                        // $it match found, pop from both `member` and `not_member`\n                        (@ $ name: ident, $ contains: ident ($it $($ member: ident)*) ($($ temp: ident)*) ($it $($ not_member: ident)*)) => {\n                            scope! { @ $ name, $ contains ($($ member)*) ($($ temp)*) ($($ not_member)*) }\n                        };\n                        // $it match not found, pop from `not_member` into `temp` stack\n                        (@ $ name: ident, $ contains: ident ($it $($ member: ident)*) ($($ temp: ident)*) ($ other: ident $($ not_member: ident)*)) => {\n                            scope! { @ $ name, $ contains ($it $($ member)*) ($ other $($ temp)*) ($($ not_member)*) }\n                        };\n                        \"\"\"\n                    }\n            val crateName = codegenContext.moduleUseName()\n\n            // If we have a second operation we can perform further checks\n            val otherOperationName: String? =\n                operations.toList().getOrNull(1)?.let {\n                    codegenContext.symbolProvider.toSymbol(it).name\n                }\n            val furtherTests =\n                if (otherOperationName != null) {\n                    writable {\n                        rustTemplate(\n                            \"\"\"\n                            /// ## let a = Plugin::<(), $otherOperationName, u64>::apply(&scoped_a, 6);\n                            /// ## let b = Plugin::<(), $otherOperationName, u64>::apply(&scoped_b, 6);\n                            /// ## assert_eq!(a, 6_u64);\n                            /// ## assert_eq!(b, 3_u32);\n                            \"\"\",\n                        )\n                    }\n                } else {\n                    writable {}\n                }\n\n            rustTemplate(\n                \"\"\"\n                /// A macro to help with scoping [plugins](crate::server::plugin) to a subset of all operations.\n                ///\n                /// In contrast to [`crate::server::scope`](crate::server::scope), this macro has knowledge\n                /// of the service and any operations _not_ specified will be placed in the opposing group.\n                ///\n                /// ## Example\n                ///\n                /// ```rust\n                /// scope! {\n                ///     /// Includes [`$firstOperationName`], excluding all other operations.\n                ///     struct ScopeA {\n                ///         includes: [$firstOperationName]\n                ///     }\n                /// }\n                ///\n                /// scope! {\n                ///     /// Excludes [`$firstOperationName`], excluding all other operations.\n                ///     struct ScopeB {\n                ///         excludes: [$firstOperationName]\n                ///     }\n                /// }\n                ///\n                /// ## use $crateName::server::plugin::{Plugin, Scoped};\n                /// ## use $crateName::scope;\n                /// ## struct MockPlugin;\n                /// ## impl<S, Op, T> Plugin<S, Op, T> for MockPlugin { type Output = u32; fn apply(&self, input: T) -> u32 { 3 } }\n                /// ## let scoped_a = Scoped::new::<ScopeA>(MockPlugin);\n                /// ## let scoped_b = Scoped::new::<ScopeB>(MockPlugin);\n                /// ## let a = Plugin::<(), $crateName::operation_shape::$firstOperationName, u64>::apply(&scoped_a, 6);\n                /// ## let b = Plugin::<(), $crateName::operation_shape::$firstOperationName, u64>::apply(&scoped_b, 6);\n                /// ## assert_eq!(a, 3_u32);\n                /// ## assert_eq!(b, 6_u64);\n                /// ```\n                ##[macro_export]\n                macro_rules! scope {\n                    // Completed, render impls\n                    (@ $ name: ident, $ contains: ident () ($($ temp: ident)*) ($($ not_member: ident)*)) => {\n                        $(\n                            impl $ crate::server::plugin::scoped::Membership<$ temp> for $ name {\n                                type Contains = $ crate::server::plugin::scoped::$ contains;\n                            }\n                        )*\n                        $(\n                            impl $ crate::server::plugin::scoped::Membership<$ not_member> for $ name {\n                                type Contains = $ crate::server::plugin::scoped::$ contains;\n                            }\n                        )*\n                    };\n                    // All `not_member`s exhausted, move `temp` into `not_member`\n                    (@ $ name: ident, $ contains: ident ($($ member: ident)*) ($($ temp: ident)*) ()) => {\n                        scope! { @ $ name, $ contains ($($ member)*) () ($($ temp)*) }\n                    };\n                    $operationBranches\n                    (\n                        $(##[$ attrs:meta])*\n                        $ vis:vis struct $ name:ident {\n                            includes: [$($ include:ident),*]\n                        }\n                    ) => {\n                        use $ crate::operation_shape::*;\n                        $ crate::server::scope! {\n                            $(##[$ attrs])*\n                            $ vis struct $ name {\n                                includes: [$($ include),*],\n                                excludes: []\n                            }\n                        }\n                        scope! { @ $ name, False ($($ include)*) () ($operationNames) }\n                    };\n                    (\n                        $(##[$ attrs:meta])*\n                        $ vis:vis struct $ name:ident {\n                            excludes: [$($ exclude:ident),*]\n                        }\n                    ) => {\n                        use $ crate::operation_shape::*;\n\n                        $ crate::server::scope! {\n                            $(##[$ attrs])*\n                            $ vis struct $ name {\n                                includes: [],\n                                excludes: [$($ exclude),*]\n                            }\n                        }\n                        scope! { @ $ name, True ($($ exclude)*) () ($operationNames) }\n                    };\n                }\n                \"\"\",\n                \"FurtherTests\" to furtherTests,\n            )\n        }\n\n    fun render(writer: RustWriter) {\n        macro()(writer)\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderConstraintViolations.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.generators\n\nimport software.amazon.smithy.codegen.core.SymbolProvider\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute.Companion.derive\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.Visibility\nimport software.amazon.smithy.rust.codegen.core.rustlang.docs\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.isOptional\nimport software.amazon.smithy.rust.codegen.core.smithy.makeRustBoxed\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\nimport software.amazon.smithy.rust.codegen.core.util.letIf\nimport software.amazon.smithy.rust.codegen.core.util.toPascalCase\nimport software.amazon.smithy.rust.codegen.server.smithy.PubCrateConstraintViolationSymbolProvider\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenContext\nimport software.amazon.smithy.rust.codegen.server.smithy.targetCanReachConstrainedShape\nimport software.amazon.smithy.rust.codegen.server.smithy.traits.ConstraintViolationRustBoxTrait\n\n/**\n * Renders constraint violation types that arise when building a structure shape builder.\n *\n * Used by [ServerBuilderGenerator] and [ServerBuilderGeneratorWithoutPublicConstrainedTypes].\n */\nclass ServerBuilderConstraintViolations(\n    codegenContext: ServerCodegenContext,\n    private val shape: StructureShape,\n    private val builderTakesInUnconstrainedTypes: Boolean,\n    private val validationExceptionConversionGenerator: ValidationExceptionConversionGenerator,\n) {\n    private val model = codegenContext.model\n    private val symbolProvider = codegenContext.symbolProvider\n    private val constraintViolationSymbolProvider =\n        with(codegenContext.constraintViolationSymbolProvider) {\n            if (codegenContext.settings.codegenConfig.publicConstrainedTypes) {\n                this\n            } else {\n                PubCrateConstraintViolationSymbolProvider(this)\n            }\n        }\n    private val members: List<MemberShape> = shape.allMembers.values.toList()\n    val all =\n        members.flatMap { member ->\n            listOfNotNull(\n                forMember(member),\n                builderConstraintViolationForMember(member),\n            )\n        }\n\n    fun render(\n        writer: RustWriter,\n        visibility: Visibility,\n        nonExhaustive: Boolean,\n        shouldRenderAsValidationExceptionFieldList: Boolean,\n    ) {\n        check(all.isNotEmpty()) {\n            \"Attempted to render constraint violations for the builder for structure shape ${shape.id}, but calculation of the constraint violations resulted in no variants\"\n        }\n\n        Attribute(derive(RuntimeType.Debug, RuntimeType.PartialEq)).render(writer)\n        writer.docs(\"Holds one variant for each of the ways the builder can fail.\")\n        if (nonExhaustive) Attribute.NonExhaustive.render(writer)\n        val constraintViolationSymbolName = constraintViolationSymbolProvider.toSymbol(shape).name\n        writer.rustBlock(\n            \"\"\"##[allow(clippy::enum_variant_names)]\n            pub${if (visibility == Visibility.PUBCRATE) \" (crate) \" else \"\"} enum $constraintViolationSymbolName\"\"\",\n        ) {\n            renderConstraintViolations(writer)\n        }\n\n        renderImplDisplayConstraintViolation(writer)\n        writer.rust(\"impl #T for ConstraintViolation { }\", RuntimeType.StdError)\n\n        if (shouldRenderAsValidationExceptionFieldList) {\n            renderAsValidationExceptionFieldList(writer)\n        }\n    }\n\n    /**\n     * Returns the builder failure associated with the `member` field if its target is constrained.\n     */\n    fun builderConstraintViolationForMember(member: MemberShape) =\n        if (builderTakesInUnconstrainedTypes && member.targetCanReachConstrainedShape(model, symbolProvider)) {\n            ConstraintViolation(member, ConstraintViolationKind.CONSTRAINED_SHAPE_FAILURE)\n        } else {\n            null\n        }\n\n    /**\n     * Returns the builder failure associated with the [member] field if it is `required`.\n     */\n    fun forMember(member: MemberShape): ConstraintViolation? {\n        check(members.contains(member))\n        // TODO(https://github.com/smithy-lang/smithy-rs/issues/1302, https://github.com/awslabs/smithy/issues/1179): See above.\n        return if (symbolProvider.toSymbol(member).isOptional() || member.hasNonNullDefault()) {\n            null\n        } else {\n            ConstraintViolation(member, ConstraintViolationKind.MISSING_MEMBER)\n        }\n    }\n\n    // TODO(https://github.com/smithy-lang/smithy-rs/issues/1401) This impl does not take into account the `sensitive` trait.\n    //   When constraint violation error messages are adjusted to match protocol tests, we should ensure it's honored.\n    private fun renderImplDisplayConstraintViolation(writer: RustWriter) {\n        writer.rustBlock(\"impl #T for ConstraintViolation\", RuntimeType.Display) {\n            rustBlock(\"fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result\") {\n                rustBlock(\"match self\") {\n                    all.forEach {\n                        val arm =\n                            if (it.hasInner()) {\n                                \"ConstraintViolation::${it.name()}(_)\"\n                            } else {\n                                \"ConstraintViolation::${it.name()}\"\n                            }\n                        rust(\"\"\"$arm => write!(f, \"${it.message(symbolProvider, model)}\"),\"\"\")\n                    }\n                }\n            }\n        }\n    }\n\n    private fun renderConstraintViolations(writer: RustWriter) {\n        for (constraintViolation in all) {\n            when (constraintViolation.kind) {\n                ConstraintViolationKind.MISSING_MEMBER -> {\n                    writer.docs(\n                        \"${\n                            constraintViolation.message(symbolProvider, model).replaceFirstChar {\n                                it.uppercaseChar()\n                            }\n                        }.\",\n                    )\n                    writer.rust(\"${constraintViolation.name()},\")\n                }\n\n                ConstraintViolationKind.CONSTRAINED_SHAPE_FAILURE -> {\n                    val targetShape = model.expectShape(constraintViolation.forMember.target)\n\n                    val constraintViolationSymbol =\n                        constraintViolationSymbolProvider.toSymbol(targetShape)\n                            // Box this constraint violation symbol if necessary.\n                            .letIf(constraintViolation.forMember.hasTrait<ConstraintViolationRustBoxTrait>()) {\n                                it.makeRustBoxed()\n                            }\n\n                    // Note we cannot express the inner constraint violation as `<T as TryFrom<T>>::Error`, because `T` might\n                    // be `pub(crate)` and that would leak `T` in a public interface.\n                    writer.docs(\n                        \"${constraintViolation.message(symbolProvider, model)}.\".replaceFirstChar {\n                            it.uppercaseChar()\n                        },\n                    )\n                    Attribute.DocHidden.render(writer)\n                    writer.rust(\"${constraintViolation.name()}(#T),\", constraintViolationSymbol)\n                }\n            }\n        }\n    }\n\n    private fun renderAsValidationExceptionFieldList(writer: RustWriter) {\n        writer.rustTemplate(\n            \"\"\"\n            impl ConstraintViolation {\n                #{ValidationExceptionFnWritable:W}\n            }\n            \"\"\",\n            \"ValidationExceptionFnWritable\" to validationExceptionConversionGenerator.builderConstraintViolationFn((all)),\n            \"String\" to RuntimeType.String,\n        )\n    }\n}\n\n/**\n * The kinds of constraint violations that can occur when building the builder.\n */\nenum class ConstraintViolationKind {\n    // A field is required but was not provided.\n    MISSING_MEMBER,\n\n    // An unconstrained type was provided for a field targeting a constrained shape, but it failed to convert into the constrained type.\n    CONSTRAINED_SHAPE_FAILURE,\n}\n\ndata class ConstraintViolation(val forMember: MemberShape, val kind: ConstraintViolationKind) {\n    fun name() =\n        when (kind) {\n            ConstraintViolationKind.MISSING_MEMBER -> \"Missing${forMember.memberName.toPascalCase()}\"\n            ConstraintViolationKind.CONSTRAINED_SHAPE_FAILURE -> forMember.memberName.toPascalCase()\n        }\n\n    /**\n     * Whether the constraint violation is a Rust tuple struct with one element.\n     */\n    fun hasInner() = kind == ConstraintViolationKind.CONSTRAINED_SHAPE_FAILURE\n\n    /**\n     * A message for a `ConstraintViolation` variant. This is used in both Rust documentation and the `Display` trait implementation.\n     */\n    fun message(\n        symbolProvider: SymbolProvider,\n        model: Model,\n    ): String {\n        val memberName = symbolProvider.toMemberName(forMember)\n        val structureSymbol = symbolProvider.toSymbol(model.expectShape(forMember.container))\n        return when (kind) {\n            ConstraintViolationKind.MISSING_MEMBER -> \"`$memberName` was not provided but it is required when building `${structureSymbol.name}`\"\n            // TODO(https://github.com/smithy-lang/smithy-rs/issues/1401) Nest errors. Adjust message following protocol tests.\n            ConstraintViolationKind.CONSTRAINED_SHAPE_FAILURE -> \"constraint violation occurred building member `$memberName` when building `${structureSymbol.name}`\"\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.generators\n\nimport software.amazon.smithy.codegen.core.Symbol\nimport software.amazon.smithy.codegen.core.SymbolProvider\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.shapes.UnionShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute.Companion.derive\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustType\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.Visibility\nimport software.amazon.smithy.rust.codegen.core.rustlang.conditionalBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.deprecatedShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.docs\nimport software.amazon.smithy.rust.codegen.core.rustlang.documentShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.implInto\nimport software.amazon.smithy.rust.codegen.core.rustlang.render\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlockTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.stripOuter\nimport software.amazon.smithy.rust.codegen.core.rustlang.withBlock\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RustCrate\nimport software.amazon.smithy.rust.codegen.core.smithy.expectRustMetadata\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.lifetimeDeclaration\nimport software.amazon.smithy.rust.codegen.core.smithy.isOptional\nimport software.amazon.smithy.rust.codegen.core.smithy.isRustBoxed\nimport software.amazon.smithy.rust.codegen.core.smithy.makeMaybeConstrained\nimport software.amazon.smithy.rust.codegen.core.smithy.makeOptional\nimport software.amazon.smithy.rust.codegen.core.smithy.makeRustBoxed\nimport software.amazon.smithy.rust.codegen.core.smithy.mapRustType\nimport software.amazon.smithy.rust.codegen.core.smithy.module\nimport software.amazon.smithy.rust.codegen.core.smithy.rustType\nimport software.amazon.smithy.rust.codegen.core.smithy.traits.SyntheticInputTrait\nimport software.amazon.smithy.rust.codegen.core.util.dq\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\nimport software.amazon.smithy.rust.codegen.core.util.letIf\nimport software.amazon.smithy.rust.codegen.core.util.redactIfNecessary\nimport software.amazon.smithy.rust.codegen.core.util.toSnakeCase\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenContext\nimport software.amazon.smithy.rust.codegen.server.smithy.canReachConstrainedShape\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.protocol.ServerProtocol\nimport software.amazon.smithy.rust.codegen.server.smithy.hasConstraintTraitOrTargetHasConstraintTrait\nimport software.amazon.smithy.rust.codegen.server.smithy.targetCanReachConstrainedShape\nimport software.amazon.smithy.rust.codegen.server.smithy.traits.ConstraintViolationRustBoxTrait\nimport software.amazon.smithy.rust.codegen.server.smithy.traits.isReachableFromOperationInput\nimport software.amazon.smithy.rust.codegen.server.smithy.withInMemoryInlineModule\nimport software.amazon.smithy.rust.codegen.server.smithy.wouldHaveConstrainedWrapperTupleTypeWerePublicConstrainedTypesEnabled\n\n/**\n * Generates a builder for the Rust type associated with the [StructureShape].\n *\n * This generator is meant for use by the server project. Clients use the [BuilderGenerator] from the `codegen-client`\n * Gradle subproject instead.\n *\n * This builder is different in that it enforces [constraint traits] upon calling `.build()`. If any constraint\n * violations occur, the `build` method returns them.\n *\n * These are the main differences with the builders generated by the client's [BuilderGenerator]:\n *\n * - The design of this builder is simpler and closely follows what you get when using the [derive_builder] crate:\n *     * The builder has one method per struct member named _exactly_ like the struct member and whose input type\n *       matches _exactly_ the struct's member type. This method is generated by [renderBuilderMemberFn].\n *     * The builder has one _setter_ method (i.e. prefixed with `set_`) per struct member whose input type is the\n *       corresponding _unconstrained type_ for the member. This method is always `pub(crate)` and meant for use for\n *       server deserializers only.\n *     * There are no convenience methods to add items to vector and hash map struct members.\n * - The builder is not `PartialEq`. This is because the builder's members may or may not have been constrained (their\n *   types hold `MaybeConstrained`), and so it doesn't make sense to compare e.g. two builders holding the same data\n *   values, but one builder holds the member in the constrained variant while the other one holds it in the unconstrained\n *   variant.\n * - The builder always implements `TryFrom<Builder> for Structure` or `From<Builder> for Structure`, depending on whether\n *   the structure is constrained (and hence enforcing the constraints might yield an error) or not, respectively.\n *\n * The builder is `pub(crate)` when `publicConstrainedTypes` is `false`, since in this case the user is never exposed\n * to constrained types, and only the server's deserializers need to enforce constraint traits upon receiving a request.\n * The user is exposed to [ServerBuilderGeneratorWithoutPublicConstrainedTypes] in this case instead, which intentionally\n * _does not_ enforce constraints.\n *\n * [constraint traits]: https://awslabs.github.io/smithy/2.0/spec/constraint-traits.html\n * [derive_builder]: https://docs.rs/derive_builder/latest/derive_builder/index.html\n */\nclass ServerBuilderGenerator(\n    val codegenContext: ServerCodegenContext,\n    private val shape: StructureShape,\n    private val customValidationExceptionWithReasonConversionGenerator: ValidationExceptionConversionGenerator,\n    private val protocol: ServerProtocol,\n) {\n    companion object {\n        /**\n         * Returns whether a structure shape, whose builder has been generated with [ServerBuilderGenerator], requires a\n         * fallible builder to be constructed.\n         */\n        fun hasFallibleBuilder(\n            structureShape: StructureShape,\n            model: Model,\n            symbolProvider: SymbolProvider,\n            takeInUnconstrainedTypes: Boolean,\n        ): Boolean {\n            val members = structureShape.members()\n\n            fun isOptional(member: MemberShape) = symbolProvider.toSymbol(member).isOptional()\n\n            fun hasDefault(member: MemberShape) = member.hasNonNullDefault()\n\n            fun isNotConstrained(member: MemberShape) = !member.canReachConstrainedShape(model, symbolProvider)\n\n            val notFallible =\n                members.all {\n                    if (structureShape.isReachableFromOperationInput()) {\n                        // When deserializing an input structure, constraints might not be satisfied by the data in the\n                        // incoming request.\n                        // For this builder not to be fallible, no members must be constrained (constraints in input must\n                        // always be checked) and all members must _either_ be optional (no need to set it; not required)\n                        // or have a default value.\n                        isNotConstrained(it) && (isOptional(it) || hasDefault(it))\n                    } else {\n                        // This structure will be constructed manually by the user.\n                        // Constraints will have to be dealt with before members are set in the builder.\n                        isOptional(it) || hasDefault(it)\n                    }\n                }\n\n            return if (takeInUnconstrainedTypes) {\n                !notFallible && structureShape.canReachConstrainedShape(model, symbolProvider)\n            } else {\n                !notFallible\n            }\n        }\n    }\n\n    private val takeInUnconstrainedTypes = shape.isReachableFromOperationInput()\n    private val model = codegenContext.model\n    private val runtimeConfig = codegenContext.runtimeConfig\n    private val publicConstrainedTypes = codegenContext.settings.codegenConfig.publicConstrainedTypes\n    private val visibility = if (publicConstrainedTypes) Visibility.PUBLIC else Visibility.PUBCRATE\n    private val symbolProvider = codegenContext.symbolProvider\n    private val constrainedShapeSymbolProvider = codegenContext.constrainedShapeSymbolProvider\n    private val pubCrateConstrainedShapeSymbolProvider = codegenContext.pubCrateConstrainedShapeSymbolProvider\n    private val members: List<MemberShape> = shape.allMembers.values.toList()\n    private val structureSymbol = symbolProvider.toSymbol(shape)\n    private val builderSymbol = shape.serverBuilderSymbol(codegenContext)\n    private val isBuilderFallible = hasFallibleBuilder(shape, model, symbolProvider, takeInUnconstrainedTypes)\n    private val serverBuilderConstraintViolations =\n        ServerBuilderConstraintViolations(codegenContext, shape, takeInUnconstrainedTypes, customValidationExceptionWithReasonConversionGenerator)\n    private val lifetime = shape.lifetimeDeclaration(symbolProvider)\n\n    private val codegenScope =\n        arrayOf(\n            \"RequestRejection\" to protocol.requestRejection(codegenContext.runtimeConfig),\n            \"Structure\" to structureSymbol,\n            \"From\" to RuntimeType.From,\n            \"TryFrom\" to RuntimeType.TryFrom,\n            \"MaybeConstrained\" to RuntimeType.MaybeConstrained,\n            *RuntimeType.preludeScope,\n        )\n\n    fun render(\n        rustCrate: RustCrate,\n        writer: RustWriter,\n    ) {\n        val docWriter: () -> Unit = { writer.docs(\"See #D.\", structureSymbol) }\n        rustCrate.withInMemoryInlineModule(writer, builderSymbol.module(), docWriter) {\n            renderBuilder(this)\n        }\n    }\n\n    private fun renderBuilder(writer: RustWriter) {\n        if (isBuilderFallible) {\n            serverBuilderConstraintViolations.render(\n                writer,\n                visibility,\n                nonExhaustive = true,\n                shouldRenderAsValidationExceptionFieldList = shape.isReachableFromOperationInput(),\n            )\n\n            // Only generate converter from `ConstraintViolation` into `RequestRejection` if the structure shape is\n            // an operation input shape.\n            if (shape.hasTrait<SyntheticInputTrait>()) {\n                renderImplFromConstraintViolationForRequestRejection(writer)\n            }\n\n            if (takeInUnconstrainedTypes) {\n                renderImplFromBuilderForMaybeConstrained(writer)\n            }\n\n            renderTryFromBuilderImpl(writer)\n        } else {\n            renderFromBuilderImpl(writer)\n        }\n\n        writer.docs(\"A builder for #D.\", structureSymbol)\n        // Matching derives to the main structure, - `PartialEq` (see class documentation for why), + `Default`\n        // since we are a builder and everything is optional.\n        val baseDerives = structureSymbol.expectRustMetadata().derives\n        // Filter out any derive that isn't Debug or Clone. Then add a Default derive\n        val builderDerives =\n            baseDerives.filter {\n                it == RuntimeType.Debug || it == RuntimeType.Clone\n            } + RuntimeType.Default\n        Attribute(derive(builderDerives)).render(writer)\n        writer.rustBlock(\"${visibility.toRustQualifier()} struct Builder$lifetime\") {\n            members.forEach { renderBuilderMember(this, it) }\n        }\n\n        writer.rustBlock(\"impl $lifetime Builder $lifetime\") {\n            for (member in members) {\n                if (publicConstrainedTypes) {\n                    renderBuilderMemberFn(this, member)\n                }\n\n                if (takeInUnconstrainedTypes) {\n                    renderBuilderMemberSetterFn(this, member)\n                }\n            }\n            renderBuildFn(this)\n        }\n\n        if (!structureSymbol.expectRustMetadata().hasDebugDerive()) {\n            renderImplDebugForBuilder(writer)\n        }\n    }\n\n    private fun renderImplFromConstraintViolationForRequestRejection(writer: RustWriter) {\n        writer.rustTemplate(\n            \"\"\"\n            #{Converter:W}\n            \"\"\",\n            \"Converter\" to\n                customValidationExceptionWithReasonConversionGenerator.renderImplFromConstraintViolationForRequestRejection(protocol),\n        )\n    }\n\n    private fun renderImplFromBuilderForMaybeConstrained(writer: RustWriter) {\n        writer.rustTemplate(\n            \"\"\"\n            impl #{From}<Builder> for #{StructureMaybeConstrained} {\n                fn from(builder: Builder) -> Self {\n                    Self::Unconstrained(builder)\n                }\n            }\n            \"\"\",\n            *codegenScope,\n            \"StructureMaybeConstrained\" to structureSymbol.makeMaybeConstrained(),\n        )\n    }\n\n    private fun renderBuildFn(implBlockWriter: RustWriter) {\n        implBlockWriter.docs(\"\"\"Consumes the builder and constructs a #D.\"\"\", structureSymbol)\n        if (isBuilderFallible) {\n            implBlockWriter.docs(\n                \"\"\"\n                The builder fails to construct a #D if a [`ConstraintViolation`] occurs.\n                \"\"\",\n                structureSymbol,\n            )\n\n            if (serverBuilderConstraintViolations.all.size > 1) {\n                implBlockWriter.docs(\"If the builder fails, it will return the _first_ encountered [`ConstraintViolation`].\")\n            }\n        }\n        implBlockWriter.rustTemplate(\n            \"\"\"\n            pub fn build(self) -> #{ReturnType:W} {\n                self.build_enforcing_all_constraints()\n            }\n            \"\"\",\n            \"ReturnType\" to buildFnReturnType(isBuilderFallible, structureSymbol, lifetime),\n        )\n        renderBuildEnforcingAllConstraintsFn(implBlockWriter)\n    }\n\n    private fun renderBuildEnforcingAllConstraintsFn(implBlockWriter: RustWriter) {\n        implBlockWriter.rustBlockTemplate(\n            \"fn build_enforcing_all_constraints(self) -> #{ReturnType:W}\",\n            \"ReturnType\" to buildFnReturnType(isBuilderFallible, structureSymbol, lifetime),\n        ) {\n            conditionalBlock(\"Ok(\", \")\", conditional = isBuilderFallible) {\n                coreBuilder(this)\n            }\n        }\n    }\n\n    fun renderConvenienceMethod(implBlock: RustWriter) {\n        implBlock.docs(\"Creates a new builder-style object to manufacture #D.\", structureSymbol)\n        implBlock.rustBlock(\"pub fn builder() -> #T $lifetime\", builderSymbol) {\n            write(\"#T::default()\", builderSymbol)\n        }\n    }\n\n    private fun renderBuilderMember(\n        writer: RustWriter,\n        member: MemberShape,\n    ) {\n        val memberSymbol = builderMemberSymbol(member)\n        val memberName = constrainedShapeSymbolProvider.toMemberName(member)\n        // Builder members are crate-public to enable using them directly in serializers/deserializers.\n        // During XML deserialization, `builder.<field>.take` is used to append to lists and maps.\n        writer.write(\"pub(crate) $memberName: #T,\", memberSymbol)\n    }\n\n    /**\n     * Render a `foo` method to set shape member `foo`. The caller must provide a value with the exact same type\n     * as the shape member's type.\n     *\n     * This method is meant for use by the user; it is not used by the generated crate's (de)serializers.\n     *\n     * This method is only generated when `publicConstrainedTypes` is `true`. Otherwise, the user has at their disposal\n     * the method from [ServerBuilderGeneratorWithoutPublicConstrainedTypes].\n     */\n    private fun renderBuilderMemberFn(\n        writer: RustWriter,\n        member: MemberShape,\n    ) {\n        check(publicConstrainedTypes)\n        val symbol = symbolProvider.toSymbol(member)\n        val memberName = symbolProvider.toMemberName(member)\n\n        val hasBox = symbol.mapRustType { it.stripOuter<RustType.Option>() }.isRustBoxed()\n        val wrapInMaybeConstrained = takeInUnconstrainedTypes && member.targetCanReachConstrainedShape(model, symbolProvider)\n\n        writer.documentShape(member, model)\n        writer.deprecatedShape(member)\n\n        if (hasBox && wrapInMaybeConstrained) {\n            // In the case of recursive shapes, the member might be boxed. If so, and the member is also constrained, the\n            // implementation of this function needs to immediately unbox the value to wrap it in `MaybeConstrained`,\n            // and then re-box. Clippy warns us that we could have just taken in an unboxed value to avoid this round-trip\n            // to the heap. However, that will make the builder take in a value whose type does not exactly match the\n            // shape member's type.\n            // We don't want to introduce API asymmetry just for this particular case, so we disable the lint.\n            Attribute.AllowClippyBoxedLocal.render(writer)\n        }\n        writer.rustBlock(\"pub fn $memberName(mut self, input: ${symbol.rustType().render()}) -> Self\") {\n            withBlock(\"self.$memberName = \", \"; self\") {\n                conditionalBlock(\"Some(\", \")\", conditional = !symbol.isOptional()) {\n                    val maybeConstrainedVariant =\n                        \"${symbol.makeMaybeConstrained().rustType().namespace}::MaybeConstrained::Constrained\"\n\n                    var varExpr = if (symbol.isOptional()) \"v\" else \"input\"\n                    var needsTransformation = false\n\n                    if (hasBox) {\n                        varExpr = \"*$varExpr\"\n                        needsTransformation = true\n                    }\n                    if (!constrainedTypeHoldsFinalType(member)) {\n                        varExpr = \"($varExpr).into()\"\n                        needsTransformation = true\n                    }\n\n                    if (wrapInMaybeConstrained) {\n                        if (needsTransformation) {\n                            conditionalBlock(\"input.map(|v| \", \")\", conditional = symbol.isOptional()) {\n                                conditionalBlock(\"Box::new(\", \")\", conditional = hasBox) {\n                                    rust(\"$maybeConstrainedVariant($varExpr)\")\n                                }\n                            }\n                        } else {\n                            if (symbol.isOptional()) {\n                                rust(\"input.map($maybeConstrainedVariant)\")\n                            } else {\n                                rust(\"$maybeConstrainedVariant($varExpr)\")\n                            }\n                        }\n                    } else {\n                        write(\"input\")\n                    }\n                }\n            }\n        }\n    }\n\n    /**\n     * Returns whether the constrained builder member type (the type on which the `Constrained` trait is implemented)\n     * is the final type the user sees when receiving the built struct. This is true when the corresponding constrained\n     * type is public and not `pub(crate)`, which happens when the target is a structure shape, a union shape, or is\n     * directly constrained.\n     *\n     * An example where this returns false is when the member shape targets a list whose members are lists of structures\n     * having at least one `required` member. In this case the member shape is transitively but not directly constrained,\n     * so the generated constrained type is `pub(crate)` and needs converting into the final type the user will be\n     * exposed to.\n     *\n     * See [PubCrateConstrainedShapeSymbolProvider] too.\n     */\n    private fun constrainedTypeHoldsFinalType(member: MemberShape): Boolean {\n        val targetShape = model.expectShape(member.target)\n        return targetShape is StructureShape ||\n            targetShape is UnionShape ||\n            member.hasConstraintTraitOrTargetHasConstraintTrait(model, symbolProvider)\n    }\n\n    /**\n     * Render a `set_foo` method.\n     * This method is able to take in unconstrained types for constrained shapes, like builders of structs in the case\n     * of structure shapes.\n     *\n     * This method is only used by deserializers at the moment and is therefore `pub(crate)`.\n     */\n    private fun renderBuilderMemberSetterFn(\n        writer: RustWriter,\n        member: MemberShape,\n    ) {\n        val builderMemberSymbol = builderMemberSymbol(member)\n        val inputType =\n            builderMemberSymbol.rustType().stripOuter<RustType.Option>().implInto()\n                .letIf(\n                    // TODO(https://github.com/smithy-lang/smithy-rs/issues/1302, https://github.com/awslabs/smithy/issues/1179):\n                    //  The only reason why this condition can't simply be `member.isOptional`\n                    //  is because non-`required` blob streaming members are interpreted as\n                    //  `required`, so we can't use `member.isOptional` here.\n                    symbolProvider.toSymbol(member).isOptional(),\n                ) { \"Option<$it>\" }\n        val memberName = symbolProvider.toMemberName(member)\n\n        writer.documentShape(member, model)\n        // Setter names will never hit a reserved word and therefore never need escaping.\n        writer.rustBlock(\"pub(crate) fn set_${member.memberName.toSnakeCase()}(mut self, input: $inputType) -> Self\") {\n            rust(\n                \"\"\"\n                self.$memberName = ${\n                    // TODO(https://github.com/smithy-lang/smithy-rs/issues/1302, https://github.com/awslabs/smithy/issues/1179): See above.\n                    if (symbolProvider.toSymbol(member).isOptional()) {\n                        \"input.map(|v| v.into())\"\n                    } else {\n                        \"Some(input.into())\"\n                    }\n                };\n                self\n                \"\"\",\n            )\n        }\n    }\n\n    private fun renderTryFromBuilderImpl(writer: RustWriter) {\n        writer.rustTemplate(\n            \"\"\"\n            impl $lifetime #{TryFrom}<Builder $lifetime> for #{Structure}$lifetime {\n                type Error = ConstraintViolation;\n\n                fn try_from(builder: Builder $lifetime) -> #{Result}<Self, Self::Error> {\n                    builder.build()\n                }\n            }\n            \"\"\",\n            *codegenScope,\n        )\n    }\n\n    private fun renderFromBuilderImpl(writer: RustWriter) {\n        writer.rustTemplate(\n            \"\"\"\n            impl$lifetime #{From}<Builder $lifetime> for #{Structure} $lifetime {\n                fn from(builder: Builder$lifetime) -> Self {\n                    builder.build()\n                }\n            }\n            \"\"\",\n            *codegenScope,\n        )\n    }\n\n    private fun renderImplDebugForBuilder(writer: RustWriter) {\n        writer.rustBlock(\"impl #T for Builder\", RuntimeType.Debug) {\n            writer.rustBlock(\"fn fmt(&self, f: &mut #1T::Formatter<'_>) -> #1T::Result\", RuntimeType.stdFmt) {\n                rust(\"\"\"let mut formatter = f.debug_struct(\"Builder\");\"\"\")\n                members.forEach { member ->\n                    val memberName = symbolProvider.toMemberName(member)\n                    val fieldValue = member.redactIfNecessary(model, \"self.$memberName\")\n\n                    rust(\n                        \"formatter.field(${memberName.dq()}, &$fieldValue);\",\n                    )\n                }\n                rust(\"formatter.finish()\")\n            }\n        }\n    }\n\n    /**\n     * Returns the symbol for a builder's member.\n     * All builder members are optional, but only some are `Option<T>`s where `T` needs to be constrained.\n     */\n    private fun builderMemberSymbol(member: MemberShape): Symbol =\n        if (takeInUnconstrainedTypes && member.targetCanReachConstrainedShape(model, symbolProvider)) {\n            val strippedOption =\n                if (member.hasConstraintTraitOrTargetHasConstraintTrait(model, symbolProvider)) {\n                    constrainedShapeSymbolProvider.toSymbol(member)\n                } else {\n                    pubCrateConstrainedShapeSymbolProvider.toSymbol(member)\n                }\n                    // Strip the `Option` in case the member is not `required`.\n                    .mapRustType { it.stripOuter<RustType.Option>() }\n\n            val hadBox = strippedOption.isRustBoxed()\n            strippedOption\n                // Strip the `Box` in case the member can reach itself recursively.\n                .mapRustType { it.stripOuter<RustType.Box>() }\n                // Wrap it in the Cow-like `constrained::MaybeConstrained` type, since we know the target member shape can\n                // reach a constrained shape.\n                .makeMaybeConstrained()\n                // Box it in case the member can reach itself recursively.\n                .letIf(hadBox) { it.makeRustBoxed() }\n                // Ensure we always end up with an `Option`.\n                .makeOptional()\n        } else {\n            constrainedShapeSymbolProvider.toSymbol(member).makeOptional()\n        }\n\n    /**\n     * Writes the code to instantiate the struct the builder builds.\n     *\n     * Builder member types are either:\n     *     1. `Option<MaybeConstrained<U>>`; or\n     *     2. `Option<U>`.\n     *\n     * Where `U` is a constrained type.\n     *\n     * The structs they build have member types:\n     *     a) `Option<T>`; or\n     *     b) `T`.\n     *\n     * `U` is equal to `T` when:\n     *     - the shape for `U` has a constraint trait and `publicConstrainedTypes` is `true`; or\n     *     - the member shape is a structure or union shape.\n     * Otherwise, `U` is always a `pub(crate)` tuple newtype holding `T`.\n     *\n     * For each member, this function first safely unwraps case 1. into 2., then converts `U` into `T` if necessary,\n     * and then converts into b) if necessary.\n     */\n    private fun coreBuilder(writer: RustWriter) {\n        writer.rustBlock(\"#T\", structureSymbol) {\n            for (member in members) {\n                val memberName = symbolProvider.toMemberName(member)\n\n                withBlock(\"$memberName: self.$memberName\", \",\") {\n                    // Write the modifier(s).\n\n                    // 1. Enforce constraint traits of data from incoming requests.\n                    serverBuilderConstraintViolations.builderConstraintViolationForMember(member)?.also { constraintViolation ->\n                        enforceConstraints(this, member, constraintViolation)\n                    }\n\n                    if (member.hasNonNullDefault()) {\n                        // 2a. If a `@default` value is modeled and the user did not set a value, fall back to using the\n                        // default value.\n                        generateFallbackCodeToDefaultValue(\n                            this,\n                            member,\n                            model,\n                            runtimeConfig,\n                            symbolProvider,\n                            publicConstrainedTypes,\n                        )\n                    } else {\n                        // 2b. If the member is `@required` and has no `@default` value, the user must set a value;\n                        // otherwise, we fail with a `ConstraintViolation::Missing*` variant.\n                        serverBuilderConstraintViolations.forMember(member)?.also {\n                            rust(\".ok_or(ConstraintViolation::${it.name()})?\")\n                        }\n                    }\n                }\n            }\n        }\n    }\n\n    private fun enforceConstraints(\n        writer: RustWriter,\n        member: MemberShape,\n        constraintViolation: ConstraintViolation,\n    ) {\n        // This member is constrained. Enforce the constraint traits on the value set in the builder.\n        // The code is slightly different in case the member is recursive, since it will be wrapped in\n        // `std::boxed::Box`.\n        val hasBox =\n            builderMemberSymbol(member)\n                .mapRustType { it.stripOuter<RustType.Option>() }\n                .isRustBoxed()\n        val errHasBox = member.hasTrait<ConstraintViolationRustBoxTrait>()\n\n        if (hasBox) {\n            writer.rustTemplate(\n                \"\"\"\n                .map(|v| match *v {\n                    #{MaybeConstrained}::Constrained(x) => Ok(Box::new(x)),\n                    #{MaybeConstrained}::Unconstrained(x) => Ok(Box::new(x.try_into()?)),\n                })\n                \"\"\",\n                *codegenScope,\n            )\n        } else {\n            writer.rustTemplate(\n                \"\"\"\n                .map(|v| match v {\n                    #{MaybeConstrained}::Constrained(x) => Ok(x),\n                    #{MaybeConstrained}::Unconstrained(x) => x.try_into(),\n                })\n                \"\"\",\n                *codegenScope,\n            )\n        }\n        val mapOk = if (constrainedTypeHoldsFinalType(member)) \"\" else \".map(|v| v.into())\"\n        val mapErr = if (errHasBox) \".map_err(Box::new)\" else \"\"\n        writer.rustTemplate(\n            \"\"\"\n            .map(|res|\n                res$mapOk$mapErr.map_err(ConstraintViolation::${constraintViolation.name()})\n            )\n            .transpose()?\n            \"\"\",\n            *codegenScope,\n        )\n\n        // Constrained types are not public and this is a member shape that would have generated a\n        // public constrained type, were the setting to be enabled.\n        // We've just checked the constraints hold by going through the non-public\n        // constrained type, but the user wants to work with the unconstrained type, so we have to\n        // unwrap it.\n        if (!publicConstrainedTypes && member.wouldHaveConstrainedWrapperTupleTypeWerePublicConstrainedTypesEnabled(model)) {\n            writer.rust(\n                \".map(|v: #T| v.into())\",\n                constrainedShapeSymbolProvider.toSymbol(model.expectShape(member.target)),\n            )\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderGeneratorCommon.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.generators\n\nimport software.amazon.smithy.codegen.core.CodegenException\nimport software.amazon.smithy.codegen.core.Symbol\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.node.ArrayNode\nimport software.amazon.smithy.model.node.BooleanNode\nimport software.amazon.smithy.model.node.NullNode\nimport software.amazon.smithy.model.node.NumberNode\nimport software.amazon.smithy.model.node.ObjectNode\nimport software.amazon.smithy.model.node.StringNode\nimport software.amazon.smithy.model.shapes.BlobShape\nimport software.amazon.smithy.model.shapes.BooleanShape\nimport software.amazon.smithy.model.shapes.ByteShape\nimport software.amazon.smithy.model.shapes.DocumentShape\nimport software.amazon.smithy.model.shapes.DoubleShape\nimport software.amazon.smithy.model.shapes.EnumShape\nimport software.amazon.smithy.model.shapes.FloatShape\nimport software.amazon.smithy.model.shapes.IntegerShape\nimport software.amazon.smithy.model.shapes.ListShape\nimport software.amazon.smithy.model.shapes.LongShape\nimport software.amazon.smithy.model.shapes.MapShape\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.NumberShape\nimport software.amazon.smithy.model.shapes.ShortShape\nimport software.amazon.smithy.model.shapes.StringShape\nimport software.amazon.smithy.model.shapes.TimestampShape\nimport software.amazon.smithy.model.traits.DefaultTrait\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.map\nimport software.amazon.smithy.rust.codegen.core.rustlang.qualifiedName\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\nimport software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.PrimitiveInstantiator\nimport software.amazon.smithy.rust.codegen.core.smithy.rustType\nimport software.amazon.smithy.rust.codegen.core.util.dq\nimport software.amazon.smithy.rust.codegen.core.util.expectTrait\nimport software.amazon.smithy.rust.codegen.core.util.isStreaming\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerCargoDependency\nimport software.amazon.smithy.rust.codegen.server.smithy.hasPublicConstrainedWrapperTupleType\n\n/*\n * Some common freestanding functions shared across:\n *     - [ServerBuilderGenerator]; and\n *     - [ServerBuilderGeneratorWithoutPublicConstrainedTypes],\n * to keep them DRY and consistent.\n */\n\n/**\n * Returns a writable to render the return type of the server builders' `build()` method.\n */\nfun buildFnReturnType(\n    isBuilderFallible: Boolean,\n    structureSymbol: Symbol,\n    lifetime: String,\n) = writable {\n    if (isBuilderFallible) {\n        rust(\"Result<#T $lifetime, ConstraintViolation>\", structureSymbol)\n    } else {\n        rust(\"#T $lifetime\", structureSymbol)\n    }\n}\n\n/**\n * Renders code to fall back to the modeled `@default` value on a [member] shape.\n * The code is expected to be interpolated right after a value of type `Option<T>`, where `T` is the type of the\n * default value.\n */\nfun generateFallbackCodeToDefaultValue(\n    writer: RustWriter,\n    member: MemberShape,\n    model: Model,\n    runtimeConfig: RuntimeConfig,\n    symbolProvider: RustSymbolProvider,\n    publicConstrainedTypes: Boolean,\n) {\n    val node = member.expectTrait<DefaultTrait>().toNode()!!\n    val targetShape = model.expectShape(member.target)\n\n    val useUnwrapOrDefault =\n        (targetShape is ListShape && node is ArrayNode && node.isEmpty) ||\n            (targetShape is MapShape && node is ObjectNode && node.isEmpty)\n\n    if (member.isStreaming(model) || useUnwrapOrDefault) {\n        writer.rust(\".unwrap_or_default()\")\n    } else {\n        // Compute defaultValue only when we actually need it\n        var defaultValue = defaultValue(model, runtimeConfig, symbolProvider, member)\n        val targetSymbol = symbolProvider.toSymbol(targetShape)\n        // We need an .into() conversion to create defaults for the server types. A larger scale refactoring could store this information in the\n        // symbol, however, retrieving it in this manner works for the moment.\n        if (targetSymbol.rustType().qualifiedName().startsWith(\"::aws_smithy_http_server_python\")) {\n            defaultValue = defaultValue.map { rust(\"#T.into()\", it) }\n        }\n\n        if (targetShape.hasPublicConstrainedWrapperTupleType(model, publicConstrainedTypes)) {\n            // TODO(https://github.com/smithy-lang/smithy-rs/issues/2134): Instead of panicking here, which will ungracefully\n            //  shut down the service, perform the `try_into()` check _once_ at service startup time, perhaps\n            //  storing the result in a `OnceCell` that could be reused.\n            writer.rustTemplate(\n                \"\"\"\n                .unwrap_or_else(||\n                    #{DefaultValue:W}\n                        .try_into()\n                        .expect(\"this check should have failed at generation time; please file a bug report under https://github.com/smithy-lang/smithy-rs/issues\")\n                )\n                \"\"\",\n                \"DefaultValue\" to defaultValue,\n            )\n        } else if ((targetShape is DocumentShape && (node is BooleanNode || node is NumberNode)) ||\n            targetShape is BooleanShape ||\n            targetShape is NumberShape ||\n            targetShape is EnumShape\n        ) {\n            writer.rustTemplate(\".unwrap_or(#{DefaultValue:W})\", \"DefaultValue\" to defaultValue)\n        } else {\n            // Values for the Rust types of the rest of the shapes might require heap allocations,\n            // so we calculate them in a (lazily-executed) closure for minimal performance gains.\n            writer.rustTemplate(\".unwrap_or_else(|| #{DefaultValue:W})\", \"DefaultValue\" to defaultValue)\n        }\n    }\n}\n\n/**\n * Returns a writable to construct a Rust value of the correct type holding the modeled `@default` value on the\n * [member] shape.\n */\nprivate fun defaultValue(\n    model: Model,\n    runtimeConfig: RuntimeConfig,\n    symbolProvider: RustSymbolProvider,\n    member: MemberShape,\n) = writable {\n    val node = member.expectTrait<DefaultTrait>().toNode()!!\n    val types = ServerCargoDependency.smithyTypes(runtimeConfig).toType()\n    // Define the exception once for DRYness.\n    val unsupportedDefaultValueException =\n        CodegenException(\"Default value $node for member shape ${member.id} is unsupported or cannot exist; please file a bug report under https://github.com/smithy-lang/smithy-rs/issues\")\n    when (val target = model.expectShape(member.target)) {\n        is EnumShape -> PrimitiveInstantiator(runtimeConfig, symbolProvider).instantiate(target, node)(this)\n\n        is ByteShape -> rust(node.expectNumberNode().value.toString() + \"i8\")\n        is ShortShape -> rust(node.expectNumberNode().value.toString() + \"i16\")\n        is IntegerShape -> rust(node.expectNumberNode().value.toString() + \"i32\")\n        is LongShape -> rust(node.expectNumberNode().value.toString() + \"i64\")\n        is FloatShape -> rust(node.expectNumberNode().value.toFloat().toString() + \"f32\")\n        is DoubleShape -> rust(node.expectNumberNode().value.toDouble().toString() + \"f64\")\n        is BooleanShape -> rust(node.expectBooleanNode().value.toString())\n        is StringShape -> rust(\"String::from(${node.expectStringNode().value.dq()})\")\n        is TimestampShape ->\n            when (node) {\n                is NumberNode -> PrimitiveInstantiator(runtimeConfig, symbolProvider).instantiate(target, node)(this)\n                is StringNode -> {\n                    val value = node.expectStringNode().value\n                    rustTemplate(\n                        \"\"\"\n                        #{SmithyTypes}::DateTime::from_str(\"$value\", #{SmithyTypes}::date_time::Format::DateTime)\n                                .expect(\"default value `$value` cannot be parsed into a valid date time; please file a bug report under https://github.com/smithy-lang/smithy-rs/issues\")\n                        \"\"\",\n                        \"SmithyTypes\" to types,\n                    )\n                }\n                else -> throw unsupportedDefaultValueException\n            }\n        is ListShape -> {\n            check(node is ArrayNode && node.isEmpty)\n            rustTemplate(\"#{Vec}::new()\", *preludeScope)\n        }\n\n        is MapShape -> {\n            check(node is ObjectNode && node.isEmpty)\n            rustTemplate(\"#{HashMap}::new()\", \"HashMap\" to RuntimeType.HashMap)\n        }\n\n        is DocumentShape -> {\n            when (node) {\n                is NullNode ->\n                    rustTemplate(\n                        \"#{SmithyTypes}::Document::Null\",\n                        \"SmithyTypes\" to types,\n                    )\n\n                is BooleanNode ->\n                    rustTemplate(\n                        \"\"\"#{SmithyTypes}::Document::Bool(${node.value})\"\"\",\n                        \"SmithyTypes\" to types,\n                    )\n\n                is StringNode ->\n                    rustTemplate(\n                        \"#{SmithyTypes}::Document::String(#{String}::from(${node.value.dq()}))\",\n                        *preludeScope,\n                        \"SmithyTypes\" to types,\n                    )\n\n                is NumberNode -> {\n                    val value = node.value.toString()\n                    val variant =\n                        when (node.value) {\n                            is Float, is Double -> \"Float\"\n                            else -> if (node.value.toLong() >= 0) \"PosInt\" else \"NegInt\"\n                        }\n                    rustTemplate(\n                        \"#{SmithyTypes}::Document::Number(#{SmithyTypes}::Number::$variant($value))\",\n                        \"SmithyTypes\" to types,\n                    )\n                }\n\n                is ArrayNode -> {\n                    check(node.isEmpty)\n                    rustTemplate(\n                        \"\"\"#{SmithyTypes}::Document::Array(#{Vec}::new())\"\"\",\n                        *preludeScope,\n                        \"SmithyTypes\" to types,\n                    )\n                }\n\n                is ObjectNode -> {\n                    check(node.isEmpty)\n                    rustTemplate(\n                        \"#{SmithyTypes}::Document::Object(#{HashMap}::new())\",\n                        \"SmithyTypes\" to types,\n                        \"HashMap\" to RuntimeType.HashMap,\n                    )\n                }\n\n                else -> throw unsupportedDefaultValueException\n            }\n        }\n\n        is BlobShape -> PrimitiveInstantiator(runtimeConfig, symbolProvider).instantiate(target, node)(this)\n\n        else -> throw unsupportedDefaultValueException\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderGeneratorWithoutPublicConstrainedTypes.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.generators\n\nimport software.amazon.smithy.codegen.core.Symbol\nimport software.amazon.smithy.codegen.core.SymbolProvider\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute.Companion.derive\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.Visibility\nimport software.amazon.smithy.rust.codegen.core.rustlang.conditionalBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.deprecatedShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.docs\nimport software.amazon.smithy.rust.codegen.core.rustlang.documentShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlockTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.withBlock\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RustCrate\nimport software.amazon.smithy.rust.codegen.core.smithy.expectRustMetadata\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.lifetimeDeclaration\nimport software.amazon.smithy.rust.codegen.core.smithy.isOptional\nimport software.amazon.smithy.rust.codegen.core.smithy.makeOptional\nimport software.amazon.smithy.rust.codegen.core.smithy.module\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenContext\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.protocol.ServerProtocol\nimport software.amazon.smithy.rust.codegen.server.smithy.withInMemoryInlineModule\n\n/**\n * Generates a builder for the Rust type associated with the [StructureShape].\n *\n * This builder is similar in design to [ServerBuilderGenerator], so consult its documentation in that regard. However,\n * this builder has a few differences.\n *\n * Unlike [ServerBuilderGenerator], this builder only enforces constraints that are baked into the type system _when\n * `publicConstrainedTypes` is false_. So in terms of honoring the Smithy spec, this builder only enforces enums\n * and the `required` trait.\n *\n * Unlike [ServerBuilderGenerator], this builder is always public. It is the only builder type the user is exposed to\n * when `publicConstrainedTypes` is false.\n */\nclass ServerBuilderGeneratorWithoutPublicConstrainedTypes(\n    private val codegenContext: ServerCodegenContext,\n    shape: StructureShape,\n    validationExceptionConversionGenerator: ValidationExceptionConversionGenerator,\n    protocol: ServerProtocol,\n) {\n    companion object {\n        /**\n         * Returns whether a structure shape, whose builder has been generated with\n         * [ServerBuilderGeneratorWithoutPublicConstrainedTypes], requires a fallible builder to be constructed.\n         *\n         * This builder only enforces the `required` trait.\n         */\n        fun hasFallibleBuilder(\n            structureShape: StructureShape,\n            symbolProvider: SymbolProvider,\n        ): Boolean {\n            val members = structureShape.members()\n\n            fun isOptional(member: MemberShape) = symbolProvider.toSymbol(member).isOptional()\n\n            fun hasDefault(member: MemberShape) = member.hasNonNullDefault()\n\n            val notFallible =\n                members.all {\n                    isOptional(it) || hasDefault(it)\n                }\n\n            return !notFallible\n        }\n    }\n\n    private val model = codegenContext.model\n    private val symbolProvider = codegenContext.symbolProvider\n    private val members: List<MemberShape> = shape.allMembers.values.toList()\n    private val runtimeConfig = codegenContext.runtimeConfig\n    private val structureSymbol = symbolProvider.toSymbol(shape)\n\n    private val builderSymbol = shape.serverBuilderSymbol(symbolProvider, false)\n    private val isBuilderFallible = hasFallibleBuilder(shape, symbolProvider)\n    private val serverBuilderConstraintViolations =\n        ServerBuilderConstraintViolations(codegenContext, shape, builderTakesInUnconstrainedTypes = false, validationExceptionConversionGenerator)\n    private val lifetime = shape.lifetimeDeclaration(symbolProvider)\n\n    private val codegenScope =\n        arrayOf(\n            \"RequestRejection\" to protocol.requestRejection(codegenContext.runtimeConfig),\n            \"Structure\" to structureSymbol,\n            \"From\" to RuntimeType.From,\n            \"TryFrom\" to RuntimeType.TryFrom,\n            \"MaybeConstrained\" to RuntimeType.MaybeConstrained,\n            *RuntimeType.preludeScope,\n        )\n\n    fun render(\n        rustCrate: RustCrate,\n        writer: RustWriter,\n    ) {\n        check(!codegenContext.settings.codegenConfig.publicConstrainedTypes) {\n            \"ServerBuilderGeneratorWithoutPublicConstrainedTypes should only be used when `publicConstrainedTypes` is false\"\n        }\n        val docWriter = { writer.docs(\"See #D.\", structureSymbol) }\n        rustCrate.withInMemoryInlineModule(writer, builderSymbol.module(), docWriter) {\n            renderBuilder(this)\n        }\n    }\n\n    private fun renderBuilder(writer: RustWriter) {\n        if (isBuilderFallible) {\n            serverBuilderConstraintViolations.render(\n                writer,\n                Visibility.PUBLIC,\n                nonExhaustive = false,\n                shouldRenderAsValidationExceptionFieldList = false,\n            )\n\n            renderTryFromBuilderImpl(writer)\n        } else {\n            renderFromBuilderImpl(writer)\n        }\n\n        writer.docs(\"A builder for #D.\", structureSymbol)\n        // Matching derives to the main structure, - `PartialEq` (to be consistent with [ServerBuilderGenerator]), + `Default`\n        // since we are a builder and everything is optional.\n        val baseDerives = structureSymbol.expectRustMetadata().derives\n        // Filter out any derive that isn't Debug or Clone. Then add a Default derive\n        val derives = baseDerives.filter { it == RuntimeType.Debug || it == RuntimeType.Clone } + RuntimeType.Default\n        Attribute(derive(derives)).render(writer)\n        writer.rustBlock(\"pub struct Builder\") {\n            members.forEach { renderBuilderMember(this, it) }\n        }\n\n        writer.rustBlock(\"impl Builder\") {\n            for (member in members) {\n                renderBuilderMemberFn(this, member)\n            }\n            renderBuildFn(this)\n        }\n    }\n\n    private fun renderBuildFn(implBlockWriter: RustWriter) {\n        implBlockWriter.docs(\"\"\"Consumes the builder and constructs a #D.\"\"\", structureSymbol)\n        if (isBuilderFallible) {\n            implBlockWriter.docs(\n                \"\"\"\n                The builder fails to construct a #D if you do not provide a value for all non-`Option`al members.\n                \"\"\",\n                structureSymbol,\n            )\n        }\n        implBlockWriter.rustTemplate(\n            \"\"\"\n            pub fn build(self) -> #{ReturnType:W} {\n                self.build_enforcing_required_and_enum_traits()\n            }\n            \"\"\",\n            \"ReturnType\" to buildFnReturnType(isBuilderFallible, structureSymbol, lifetime),\n        )\n        renderBuildEnforcingRequiredAndEnumTraitsFn(implBlockWriter)\n    }\n\n    private fun renderBuildEnforcingRequiredAndEnumTraitsFn(implBlockWriter: RustWriter) {\n        implBlockWriter.rustBlockTemplate(\n            \"fn build_enforcing_required_and_enum_traits(self) -> #{ReturnType:W}\",\n            \"ReturnType\" to buildFnReturnType(isBuilderFallible, structureSymbol, lifetime),\n        ) {\n            conditionalBlock(\"Ok(\", \")\", conditional = isBuilderFallible) {\n                coreBuilder(this)\n            }\n        }\n    }\n\n    private fun coreBuilder(writer: RustWriter) {\n        writer.rustBlock(\"#T\", structureSymbol) {\n            for (member in members) {\n                val memberName = symbolProvider.toMemberName(member)\n\n                withBlock(\"$memberName: self.$memberName\", \",\") {\n                    if (member.hasNonNullDefault()) {\n                        // 1a. If a `@default` value is modeled and the user did not set a value, fall back to using the\n                        // default value.\n                        generateFallbackCodeToDefaultValue(\n                            this,\n                            member,\n                            model,\n                            runtimeConfig,\n                            symbolProvider,\n                            codegenContext.settings.codegenConfig.publicConstrainedTypes,\n                        )\n                    } else {\n                        // 1b. If the member is `@required` and has no `@default` value, the user must set a value;\n                        // otherwise, we fail with a `ConstraintViolation::Missing*` variant.\n                        serverBuilderConstraintViolations.forMember(member)?.also {\n                            rust(\".ok_or(ConstraintViolation::${it.name()})?\")\n                        }\n                    }\n                }\n            }\n        }\n    }\n\n    fun renderConvenienceMethod(implBlock: RustWriter) {\n        implBlock.docs(\"Creates a new builder-style object to manufacture #D.\", structureSymbol)\n        implBlock.rustBlock(\"pub fn builder() -> #T $lifetime\", builderSymbol) {\n            write(\"#T::default()\", builderSymbol)\n        }\n    }\n\n    private fun renderBuilderMember(\n        writer: RustWriter,\n        member: MemberShape,\n    ) {\n        val memberSymbol = builderMemberSymbol(member)\n        val memberName = symbolProvider.toMemberName(member)\n        // Builder members are crate-public to enable using them directly in serializers/deserializers.\n        // During XML deserialization, `builder.<field>.take` is used to append to lists and maps.\n        writer.write(\"pub(crate) $memberName: #T,\", memberSymbol)\n    }\n\n    /**\n     * Render a `foo` method to set shape member `foo`. The caller must provide a value with the exact same type\n     * as the shape member's type.\n     *\n     * This method is meant for use by the user; it is not used by the generated crate's (de)serializers.\n     */\n    private fun renderBuilderMemberFn(\n        writer: RustWriter,\n        member: MemberShape,\n    ) {\n        val memberSymbol = symbolProvider.toSymbol(member)\n        val memberName = symbolProvider.toMemberName(member)\n\n        writer.documentShape(member, model)\n        writer.deprecatedShape(member)\n\n        writer.rustBlock(\"pub fn $memberName(mut self, input: #T) -> Self\", memberSymbol) {\n            withBlock(\"self.$memberName = \", \"; self\") {\n                conditionalBlock(\"Some(\", \")\", conditional = !memberSymbol.isOptional()) {\n                    rust(\"input\")\n                }\n            }\n        }\n    }\n\n    private fun renderTryFromBuilderImpl(writer: RustWriter) {\n        writer.rustTemplate(\n            \"\"\"\n            impl $lifetime #{TryFrom}<Builder $lifetime> for #{Structure}$lifetime {\n                type Error = ConstraintViolation;\n\n                fn try_from(builder: Builder $lifetime) -> #{Result}<Self, Self::Error> {\n                    builder.build()\n                }\n            }\n            \"\"\",\n            *codegenScope,\n        )\n    }\n\n    private fun renderFromBuilderImpl(writer: RustWriter) {\n        writer.rustTemplate(\n            \"\"\"\n            impl$lifetime #{From}<Builder $lifetime> for #{Structure}$lifetime {\n                fn from(builder: Builder $lifetime) -> Self {\n                    builder.build()\n                }\n            }\n            \"\"\",\n            *codegenScope,\n        )\n    }\n\n    /**\n     * Returns the symbol for a builder's member.\n     */\n    private fun builderMemberSymbol(member: MemberShape): Symbol = symbolProvider.toSymbol(member).makeOptional()\n}\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderSymbol.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\npackage software.amazon.smithy.rust.codegen.server.smithy.generators\n\nimport software.amazon.smithy.codegen.core.Symbol\nimport software.amazon.smithy.codegen.core.SymbolProvider\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustModule\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustReservedWords\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustType\nimport software.amazon.smithy.rust.codegen.core.rustlang.Visibility\nimport software.amazon.smithy.rust.codegen.core.smithy.module\nimport software.amazon.smithy.rust.codegen.core.smithy.rustType\nimport software.amazon.smithy.rust.codegen.core.util.toSnakeCase\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenContext\n\n// TODO(https://github.com/smithy-lang/smithy-rs/issues/2396): Replace this with `RustSymbolProvider.symbolForBuilder`\nfun StructureShape.serverBuilderSymbol(codegenContext: ServerCodegenContext): Symbol =\n    this.serverBuilderSymbol(\n        codegenContext.symbolProvider,\n        !codegenContext.settings.codegenConfig.publicConstrainedTypes,\n    )\n\n// TODO(https://github.com/smithy-lang/smithy-rs/issues/2396): Replace this with `RustSymbolProvider.moduleForBuilder`\nfun StructureShape.serverBuilderModule(\n    symbolProvider: SymbolProvider,\n    pubCrate: Boolean,\n): RustModule.LeafModule {\n    val structureSymbol = symbolProvider.toSymbol(this)\n    val builderNamespace =\n        RustReservedWords.escapeIfNeeded(structureSymbol.name.toSnakeCase()) +\n            if (pubCrate) {\n                \"_internal\"\n            } else {\n                \"\"\n            }\n    val visibility =\n        when (pubCrate) {\n            true -> Visibility.PUBCRATE\n            false -> Visibility.PUBLIC\n        }\n    return RustModule.new(\n        builderNamespace,\n        visibility,\n        parent = structureSymbol.module(),\n        inline = true,\n        documentationOverride = \"\",\n    )\n}\n\n// TODO(https://github.com/smithy-lang/smithy-rs/issues/2396): Replace this with `RustSymbolProvider.symbolForBuilder`\nfun StructureShape.serverBuilderSymbol(\n    symbolProvider: SymbolProvider,\n    pubCrate: Boolean,\n): Symbol {\n    val builderModule = serverBuilderModule(symbolProvider, pubCrate)\n    val rustType = RustType.Opaque(\"Builder\", builderModule.fullyQualifiedPath())\n    return Symbol.builder()\n        .rustType(rustType)\n        .name(rustType.name)\n        .module(builderModule)\n        .build()\n}\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerEnumGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\npackage software.amazon.smithy.rust.codegen.server.smithy.generators\n\nimport software.amazon.smithy.model.shapes.StringShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.rawRust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.EnumCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.EnumGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.EnumGeneratorContext\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.EnumType\nimport software.amazon.smithy.rust.codegen.core.smithy.module\nimport software.amazon.smithy.rust.codegen.core.util.dq\nimport software.amazon.smithy.rust.codegen.server.smithy.PubCrateConstraintViolationSymbolProvider\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenContext\nimport software.amazon.smithy.rust.codegen.server.smithy.shapeConstraintViolationDisplayMessage\nimport software.amazon.smithy.rust.codegen.server.smithy.traits.isReachableFromOperationInput\n\nopen class ConstrainedEnum(\n    private val codegenContext: ServerCodegenContext,\n    private val shape: StringShape,\n    private val validationExceptionConversionGenerator: ValidationExceptionConversionGenerator,\n) : EnumType() {\n    private val publicConstrainedTypes = codegenContext.settings.codegenConfig.publicConstrainedTypes\n    private val constraintViolationSymbolProvider =\n        with(codegenContext.constraintViolationSymbolProvider) {\n            if (publicConstrainedTypes) {\n                this\n            } else {\n                PubCrateConstraintViolationSymbolProvider(this)\n            }\n        }\n    private val constraintViolationSymbol = constraintViolationSymbolProvider.toSymbol(shape)\n    private val constraintViolationName = constraintViolationSymbol.name\n\n    private fun generateConstraintViolation(\n        context: EnumGeneratorContext,\n        generateTryFromStrAndString: RustWriter.(EnumGeneratorContext) -> Unit,\n    ) = writable {\n        withInlineModule(constraintViolationSymbol.module(), codegenContext.moduleDocProvider) {\n            rustTemplate(\n                \"\"\"\n                ##[derive(Debug, PartialEq)]\n                pub struct $constraintViolationName(pub(crate) #{String});\n\n                impl #{Display} for $constraintViolationName {\n                    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n                        write!(f, r##\"${\n                    context.enumTrait.shapeConstraintViolationDisplayMessage(shape).replace(\"#\", \"##\")\n                }\"##)\n                    }\n                }\n\n                impl #{Error} for $constraintViolationName {}\n                \"\"\",\n                *preludeScope,\n                \"Error\" to RuntimeType.StdError,\n                \"Display\" to RuntimeType.Display,\n            )\n\n            if (shape.isReachableFromOperationInput()) {\n                rustTemplate(\n                    \"\"\"\n                    impl $constraintViolationName {\n                        #{EnumShapeConstraintViolationImplBlock:W}\n                    }\n                    \"\"\",\n                    \"EnumShapeConstraintViolationImplBlock\" to\n                        validationExceptionConversionGenerator.enumShapeConstraintViolationImplBlock(\n                            context.enumTrait,\n                        ),\n                )\n            }\n        }\n\n        generateTryFromStrAndString(context)\n    }\n\n    override fun implFromForStr(context: EnumGeneratorContext): Writable =\n        generateConstraintViolation(context) {\n            rustTemplate(\n                \"\"\"\n                impl #{TryFrom}<&str> for ${context.enumName} {\n                    type Error = #{ConstraintViolation};\n                    fn try_from(s: &str) -> #{Result}<Self, <Self as #{TryFrom}<&str>>::Error> {\n                        match s {\n                            #{MatchArms}\n                            _ => Err(#{ConstraintViolation}(s.to_owned()))\n                        }\n                    }\n                }\n                impl #{TryFrom}<#{String}> for ${context.enumName} {\n                    type Error = #{ConstraintViolation};\n                    fn try_from(s: #{String}) -> #{Result}<Self, <Self as #{TryFrom}<#{String}>>::Error> {\n                        s.as_str().try_into()\n                    }\n                }\n                \"\"\",\n                *preludeScope,\n                \"ConstraintViolation\" to constraintViolationSymbol,\n                \"MatchArms\" to\n                    writable {\n                        context.sortedMembers.forEach { member ->\n                            rawRust(\"${member.value.dq()} => Ok(${context.enumName}::${member.derivedName()}),\")\n                        }\n                    },\n            )\n        }\n\n    override fun implFromForStrForUnnamedEnum(context: EnumGeneratorContext): Writable =\n        generateConstraintViolation(context) {\n            rustTemplate(\n                \"\"\"\n                impl #{TryFrom}<&str> for ${context.enumName} {\n                    type Error = #{ConstraintViolation};\n                    fn try_from(s: &str) -> #{Result}<Self, <Self as #{TryFrom}<&str>>::Error> {\n                        s.to_owned().try_into()\n                    }\n                }\n                impl #{TryFrom}<#{String}> for ${context.enumName} {\n                    type Error = #{ConstraintViolation};\n                    fn try_from(s: #{String}) -> #{Result}<Self, <Self as #{TryFrom}<#{String}>>::Error> {\n                        match s.as_str() {\n                            #{Values} => Ok(Self(s)),\n                            _ => Err(#{ConstraintViolation}(s))\n                        }\n                    }\n                }\n                \"\"\",\n                *preludeScope,\n                \"ConstraintViolation\" to constraintViolationSymbol,\n                \"Values\" to\n                    writable {\n                        rawRust(context.sortedMembers.joinToString(\" | \") { it.value.dq() })\n                    },\n            )\n        }\n\n    override fun implFromStr(context: EnumGeneratorContext): Writable =\n        writable {\n            rustTemplate(\n                \"\"\"\n                impl std::str::FromStr for ${context.enumName} {\n                    type Err = #{ConstraintViolation};\n                    fn from_str(s: &str) -> std::result::Result<Self, <Self as std::str::FromStr>::Err> {\n                        Self::try_from(s)\n                    }\n                }\n                \"\"\",\n                \"ConstraintViolation\" to constraintViolationSymbol,\n            )\n        }\n\n    override fun implFromStrForUnnamedEnum(context: EnumGeneratorContext) = implFromStr(context)\n}\n\nclass ServerEnumGenerator(\n    codegenContext: ServerCodegenContext,\n    shape: StringShape,\n    validationExceptionConversionGenerator: ValidationExceptionConversionGenerator,\n    customizations: List<EnumCustomization>,\n) : EnumGenerator(\n        codegenContext.model,\n        codegenContext.symbolProvider,\n        shape,\n        enumType = ConstrainedEnum(codegenContext, shape, validationExceptionConversionGenerator),\n        customizations,\n    )\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerHttpSensitivityGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.generators\n\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.pattern.UriPattern\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.model.traits.HttpHeaderTrait\nimport software.amazon.smithy.model.traits.HttpLabelTrait\nimport software.amazon.smithy.model.traits.HttpPrefixHeadersTrait\nimport software.amazon.smithy.model.traits.HttpQueryParamsTrait\nimport software.amazon.smithy.model.traits.HttpQueryTrait\nimport software.amazon.smithy.model.traits.HttpTrait\nimport software.amazon.smithy.model.traits.SensitiveTrait\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.plus\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.util.dq\nimport software.amazon.smithy.rust.codegen.core.util.getTrait\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\nimport software.amazon.smithy.rust.codegen.core.util.orNull\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerCargoDependency\nimport java.util.Optional\n\n/** Models the ways status codes can be bound and sensitive. */\nclass StatusCodeSensitivity(private val sensitive: Boolean, runtimeConfig: RuntimeConfig) {\n    private val codegenScope =\n        arrayOf(\n            \"SmithyHttpServer\" to ServerCargoDependency.smithyHttpServer(runtimeConfig).toType(),\n        )\n\n    /** Returns the type of the `MakeFmt`. */\n    fun type(): Writable =\n        writable {\n            if (sensitive) {\n                rustTemplate(\"#{SmithyHttpServer}::instrumentation::MakeSensitive\", *codegenScope)\n            } else {\n                rustTemplate(\"#{SmithyHttpServer}::instrumentation::MakeIdentity\", *codegenScope)\n            }\n        }\n\n    /** Returns the setter. */\n    fun setter(): Writable =\n        writable {\n            if (sensitive) {\n                rust(\".status_code()\")\n            }\n        }\n}\n\n/** Represents the information needed to specify the position of a greedy label. */\ndata class GreedyLabel(\n    // The segment index the greedy label.\n    val segmentIndex: Int,\n    // The number of characters from the end of the URI the greedy label terminates.\n    val endOffset: Int,\n)\n\n/** Models the ways labels can be bound and sensitive. */\nclass LabelSensitivity(internal val labelIndexes: List<Int>, internal val greedyLabel: GreedyLabel?, runtimeConfig: RuntimeConfig) {\n    private val codegenScope =\n        arrayOf(\"SmithyHttpServer\" to ServerCargoDependency.smithyHttpServer(runtimeConfig).toType())\n\n    /** Returns the closure used during construction. */\n    fun closure(): Writable =\n        writable {\n            if (labelIndexes.isNotEmpty()) {\n                rustTemplate(\n                    \"\"\"\n                    {\n                        |index: usize| matches!(index, ${labelIndexes.joinToString(\"|\")})\n                    } as fn(usize) -> bool\n                    \"\"\",\n                    *codegenScope,\n                )\n            } else {\n                rust(\"{ |_index: usize| false }  as fn(usize) -> bool\")\n            }\n        }\n\n    private fun hasRedactions(): Boolean = labelIndexes.isNotEmpty() || greedyLabel != null\n\n    /** Returns the type of the `MakeFmt`. */\n    fun type(): Writable =\n        if (hasRedactions()) {\n            writable {\n                rustTemplate(\"#{SmithyHttpServer}::instrumentation::sensitivity::uri::MakeLabel<fn(usize) -> bool>\", *codegenScope)\n            }\n        } else {\n            writable {\n                rustTemplate(\"#{SmithyHttpServer}::instrumentation::MakeIdentity\", *codegenScope)\n            }\n        }\n\n    /** Returns the value of the `GreedyLabel`. */\n    private fun greedyLabelStruct(): Writable =\n        writable {\n            if (greedyLabel != null) {\n                rustTemplate(\n                    \"\"\"\n                Some(#{SmithyHttpServer}::instrumentation::sensitivity::uri::GreedyLabel::new(${greedyLabel.segmentIndex}, ${greedyLabel.endOffset}))\"\"\",\n                    *codegenScope,\n                )\n            } else {\n                rust(\"None\")\n            }\n        }\n\n    /** Returns the setter enclosing the closure or suffix position. */\n    fun setter(): Writable =\n        if (hasRedactions()) {\n            writable {\n                rustTemplate(\".label(#{Closure:W}, #{GreedyLabel:W})\", \"Closure\" to closure(), \"GreedyLabel\" to greedyLabelStruct())\n            }\n        } else {\n            writable { }\n        }\n}\n\n/** Models the ways headers can be bound and sensitive */\nsealed class HeaderSensitivity(\n    /** The values of the sensitive `httpHeaders`. */\n    val headerKeys: List<String>,\n    runtimeConfig: RuntimeConfig,\n) {\n    private val codegenScope =\n        arrayOf(\n            \"SmithyHttpServer\" to ServerCargoDependency.smithyHttpServer(runtimeConfig).toType(),\n            \"Http\" to RuntimeType.http(runtimeConfig),\n        )\n\n    /** The case where `prefixHeaders` value is not sensitive. */\n    class NotSensitiveMapValue(\n        headerKeys: List<String>,\n        /** The value of `prefixHeaders`, null if it's not sensitive. */\n        val prefixHeader: String?,\n        runtimeConfig: RuntimeConfig,\n    ) : HeaderSensitivity(headerKeys, runtimeConfig)\n\n    /** The case where `prefixHeaders` value is sensitive. */\n    class SensitiveMapValue(\n        headerKeys: List<String>,\n        /** Is the `prefixHeaders` key sensitive? */\n        val keySensitive: Boolean,\n        /** The value of `prefixHeaders`. */\n        val prefixHeader: String,\n        runtimeConfig: RuntimeConfig,\n    ) : HeaderSensitivity(headerKeys, runtimeConfig)\n\n    /** Is there anything to redact? */\n    internal fun hasRedactions(): Boolean =\n        headerKeys.isNotEmpty() ||\n            when (this) {\n                is NotSensitiveMapValue -> prefixHeader != null\n                is SensitiveMapValue -> true\n            }\n\n    /** Returns the type of the `MakeDebug`. */\n    fun type(): Writable =\n        writable {\n            if (hasRedactions()) {\n                rustTemplate(\"#{SmithyHttpServer}::instrumentation::sensitivity::headers::MakeHeaders<fn(&#{Http}::header::HeaderName) -> #{SmithyHttpServer}::instrumentation::sensitivity::headers::HeaderMarker>\", *codegenScope)\n            } else {\n                rustTemplate(\"#{SmithyHttpServer}::instrumentation::MakeIdentity\", *codegenScope)\n            }\n        }\n\n    /** Returns the closure used during construction. */\n    internal fun closure(): Writable {\n        val nameMatch =\n            if (headerKeys.isEmpty()) {\n                writable {\n                    rust(\"false\")\n                }\n            } else {\n                writable {\n                    val matches = headerKeys.joinToString(\"|\") { it.dq() }\n                    rust(\"matches!(name.as_str(), $matches)\")\n                }\n            }\n\n        val suffixAndValue =\n            when (this) {\n                is NotSensitiveMapValue ->\n                    writable {\n                        prefixHeader?.let {\n                            rust(\n                                \"\"\"\n                                let starts_with = name.as_str().starts_with(\"$it\");\n                                let key_suffix = if starts_with { Some(${it.length}) } else { None };\n                                \"\"\",\n                            )\n                        } ?: rust(\"let key_suffix = None;\")\n                        rust(\"let value = name_match;\")\n                    }\n                is SensitiveMapValue ->\n                    writable {\n                        rust(\"let starts_with = name.as_str().starts_with(${prefixHeader.dq()});\")\n                        if (keySensitive) {\n                            rust(\"let key_suffix = if starts_with { Some(${prefixHeader.length}) } else { None };\")\n                        } else {\n                            rust(\"let key_suffix = None;\")\n                        }\n                        rust(\"let value = name_match || starts_with;\")\n                    }\n            }\n\n        return writable {\n            rustTemplate(\n                \"\"\"\n                {\n                    |name: &#{Http}::header::HeaderName| {\n                        let name_match = #{NameMatch:W};\n                        #{SuffixAndValue:W}\n                        #{SmithyHttpServer}::instrumentation::sensitivity::headers::HeaderMarker { key_suffix, value }\n                    }\n                } as fn(&_) -> _\n                \"\"\",\n                \"NameMatch\" to nameMatch,\n                \"SuffixAndValue\" to suffixAndValue,\n                *codegenScope,\n            )\n        }\n    }\n\n    /** Returns the setter enclosing the closure. */\n    fun setter(): Writable =\n        writable {\n            if (hasRedactions()) {\n                rustTemplate(\".header(#{Closure:W})\", \"Closure\" to closure())\n            }\n        }\n}\n\n/** Models the ways query strings can be bound and sensitive. */\nsealed class QuerySensitivity(\n    /** Are all keys sensitive? */\n    val allKeysSensitive: Boolean,\n    runtimeConfig: RuntimeConfig,\n) {\n    private val codegenScope =\n        arrayOf(\"SmithyHttpServer\" to ServerCargoDependency.smithyHttpServer(runtimeConfig).toType())\n\n    /** The case where the `httpQueryParams` value is not sensitive. */\n    class NotSensitiveMapValue(\n        /** The values of `httpQuery`. */\n        val queryKeys: List<String>,\n        allKeysSensitive: Boolean, runtimeConfig: RuntimeConfig,\n    ) : QuerySensitivity(allKeysSensitive, runtimeConfig)\n\n    /** The case where `httpQueryParams` value is sensitive. */\n    class SensitiveMapValue(allKeysSensitive: Boolean, runtimeConfig: RuntimeConfig) : QuerySensitivity(allKeysSensitive, runtimeConfig)\n\n    /** Is there anything to redact? */\n    internal fun hasRedactions(): Boolean =\n        when (this) {\n            is NotSensitiveMapValue -> allKeysSensitive || queryKeys.isNotEmpty()\n            is SensitiveMapValue -> true\n        }\n\n    /** Returns the type of the `MakeFmt`. */\n    fun type(): Writable =\n        writable {\n            if (hasRedactions()) {\n                rustTemplate(\"#{SmithyHttpServer}::instrumentation::sensitivity::uri::MakeQuery<fn(&str) -> #{SmithyHttpServer}::instrumentation::sensitivity::uri::QueryMarker>\", *codegenScope)\n            } else {\n                rustTemplate(\"#{SmithyHttpServer}::instrumentation::MakeIdentity\", *codegenScope)\n            }\n        }\n\n    /** Returns the closure used during construction. */\n    internal fun closure(): Writable {\n        val value =\n            when (this) {\n                is SensitiveMapValue ->\n                    writable {\n                        rust(\"true\")\n                    }\n                is NotSensitiveMapValue ->\n                    if (queryKeys.isEmpty()) {\n                        writable {\n                            rust(\"false;\")\n                        }\n                    } else {\n                        writable {\n                            val matches = queryKeys.joinToString(\"|\") { it.dq() }\n                            rust(\"matches!(name, $matches);\")\n                        }\n                    }\n            }\n\n        return writable {\n            rustTemplate(\n                \"\"\"\n                {\n                    |name: &str| {\n                        let key = $allKeysSensitive;\n                        let value = #{Value:W};\n                        #{SmithyHttpServer}::instrumentation::sensitivity::uri::QueryMarker { key, value }\n                    }\n                } as fn(&_) -> _\n                \"\"\",\n                \"Value\" to value,\n                *codegenScope,\n            )\n        }\n    }\n\n    /** Returns the setter enclosing the closure. */\n    fun setters(): Writable =\n        writable {\n            if (hasRedactions()) {\n                rustTemplate(\".query(#{Closure:W})\", \"Closure\" to closure())\n            }\n        }\n}\n\n/** Represents a `RequestFmt` or `ResponseFmt` type and value. */\ndata class MakeFmt(\n    val type: Writable,\n    val value: Writable,\n)\n\n/**\n * A code generator responsible for using a `Model` and a chosen `OperationShape` to produce Rust closures marking\n * parts of the request/response HTTP as sensitive.\n *\n * These closures are provided to `RequestFmt` and `ResponseFmt` constructors, which in turn are provided to\n * `InstrumentedOperation` to configure logging. These structures can be found in `aws_smithy_http_server::instrumentation`.\n *\n * See [Logging in the Presence of Sensitive Data](https://github.com/smithy-lang/smithy-rs/blob/main/design/src/rfcs/rfc0018_logging_sensitive.md)\n * for more details.\n */\nclass ServerHttpSensitivityGenerator(\n    private val model: Model,\n    private val operation: OperationShape,\n    private val runtimeConfig: RuntimeConfig,\n) {\n    private val codegenScope =\n        arrayOf(\n            \"SmithyHttpServer\" to ServerCargoDependency.smithyHttpServer(runtimeConfig).toType(),\n            \"Http\" to RuntimeType.http(runtimeConfig),\n        )\n\n    /** Constructs `StatusCodeSensitivity` of a `Shape` */\n    private fun findStatusCodeSensitivity(rootShape: Shape): StatusCodeSensitivity {\n        // Is root shape sensitive?\n        val rootSensitive = rootShape.hasTrait<SensitiveTrait>()\n\n        // Find all sensitive `httpResponseCode` bindings in the `rootShape`.\n        val isSensitive =\n            rootShape\n                .members()\n                .filter { it.hasTrait<HttpHeaderTrait>() }\n                .any { rootSensitive || it.getMemberTrait(model, SensitiveTrait::class.java).isPresent }\n\n        return StatusCodeSensitivity(isSensitive, runtimeConfig)\n    }\n\n    /** Constructs `HeaderSensitivity` of a `Shape` */\n    internal fun findHeaderSensitivity(rootShape: Shape): HeaderSensitivity {\n        // Find all `httpHeader` bindings in the `rootShape`.\n        val headerKeys = rootShape.members().mapNotNull { member -> member.getTrait<HttpHeaderTrait>()?.let { trait -> Pair(member, trait.value) } }.distinct()\n\n        // Find `httpPrefixHeaders` trait.\n        val prefixHeader = rootShape.members().mapNotNull { member -> member.getTrait<HttpPrefixHeadersTrait>()?.let { trait -> Pair(member, trait.value) } }.singleOrNull()\n\n        // Is `rootShape` sensitive and does `httpPrefixHeaders` exist?\n        val rootSensitive = rootShape.hasTrait<SensitiveTrait>()\n        if (rootSensitive) {\n            if (prefixHeader != null) {\n                return HeaderSensitivity.SensitiveMapValue(\n                    headerKeys.map { it.second }, true,\n                    prefixHeader.second, runtimeConfig,\n                )\n            }\n        }\n\n        // Which headers are sensitive?\n        val sensitiveHeaders =\n            headerKeys\n                .filter { (member, _) -> rootSensitive || member.getMemberTrait(model, SensitiveTrait::class.java).orNull() != null }\n                .map { (_, name) -> name }\n\n        return if (prefixHeader != null) {\n            // Get the `httpPrefixHeader` map.\n            val prefixHeaderMap = model.getShape(prefixHeader.first.target).orNull()?.asMapShape()?.orNull()\n\n            // Check whether key and value are sensitive.\n            val isKeySensitive = prefixHeaderMap?.key?.getMemberTrait(model, SensitiveTrait::class.java)?.orNull() != null\n            val isValueSensitive = prefixHeaderMap?.value?.getMemberTrait(model, SensitiveTrait::class.java)?.orNull() != null\n\n            if (isValueSensitive) {\n                HeaderSensitivity.SensitiveMapValue(sensitiveHeaders, isKeySensitive, prefixHeader.second, runtimeConfig)\n            } else if (isKeySensitive) {\n                HeaderSensitivity.NotSensitiveMapValue(sensitiveHeaders, prefixHeader.second, runtimeConfig)\n            } else {\n                HeaderSensitivity.NotSensitiveMapValue(sensitiveHeaders, null, runtimeConfig)\n            }\n        } else {\n            HeaderSensitivity.NotSensitiveMapValue(sensitiveHeaders, null, runtimeConfig)\n        }\n    }\n\n    /** Constructs `QuerySensitivity` of a `Shape` */\n    internal fun findQuerySensitivity(rootShape: Shape): QuerySensitivity {\n        // Find `httpQueryParams` trait.\n        val queryParams = rootShape.members().singleOrNull { member -> member.hasTrait<HttpQueryParamsTrait>() }\n\n        // Is `rootShape` sensitive and does `httpQueryParams` exist?\n        val rootSensitive = rootShape.hasTrait<SensitiveTrait>()\n        if (rootSensitive) {\n            if (queryParams != null) {\n                return QuerySensitivity.SensitiveMapValue(true, runtimeConfig)\n            }\n        }\n\n        // Find all `httpQuery` bindings in the `rootShape`.\n        val queryKeys = rootShape.members().mapNotNull { member -> member.getTrait<HttpQueryTrait>()?.let { trait -> Pair(member, trait.value) } }.distinct()\n\n        // Which queries are sensitive?\n        val sensitiveQueries =\n            queryKeys\n                .filter { (member, _) -> rootSensitive || member.getMemberTrait(model, SensitiveTrait::class.java).orNull() != null }\n                .map { (_, name) -> name }\n\n        return if (queryParams != null) {\n            // Get the `httpQueryParams` map.\n            val queryParamsMap = model.getShape(queryParams.target).orNull()?.asMapShape()?.orNull()\n\n            // Check whether key and value are sensitive.\n            val isKeySensitive = queryParamsMap?.key?.getMemberTrait(model, SensitiveTrait::class.java)?.orNull() != null\n            val isValueSensitive = queryParamsMap?.value?.getMemberTrait(model, SensitiveTrait::class.java)?.orNull() != null\n\n            if (isValueSensitive) {\n                QuerySensitivity.SensitiveMapValue(isKeySensitive, runtimeConfig)\n            } else {\n                QuerySensitivity.NotSensitiveMapValue(sensitiveQueries, isKeySensitive, runtimeConfig)\n            }\n        } else {\n            QuerySensitivity.NotSensitiveMapValue(sensitiveQueries, false, runtimeConfig)\n        }\n    }\n\n    /** Constructs `LabelSensitivity` of a `Shape` */\n    internal fun findLabelSensitivity(\n        uriPattern: UriPattern,\n        rootShape: Shape,\n    ): LabelSensitivity {\n        // Is root shape sensitive?\n        val rootSensitive = rootShape.hasTrait<SensitiveTrait>()\n\n        // Find `httpLabel` trait which are also sensitive.\n        val httpLabels =\n            rootShape\n                .members()\n                .filter { it.hasTrait<HttpLabelTrait>() }\n                .filter { rootSensitive || it.getMemberTrait(model, SensitiveTrait::class.java).orNull() != null }\n\n        val labelIndexes =\n            httpLabels\n                .mapNotNull { member ->\n                    uriPattern\n                        .segments\n                        .withIndex()\n                        .find { (_, segment) ->\n                            segment.isLabel && !segment.isGreedyLabel && segment.content == member.memberName\n                        }\n                }\n                .map { (index, _) -> index }\n\n        val greedyLabel =\n            httpLabels.mapNotNull { member ->\n                uriPattern\n                    .segments\n                    .withIndex()\n                    .find { (_, segment) -> segment.isGreedyLabel && segment.content == member.memberName }\n            }\n                .singleOrNull()\n                ?.let { (index, _) ->\n                    val remainder =\n                        uriPattern\n                            .segments\n                            .drop(index + 1)\n                            .sumOf { it.content.length + 1 }\n                    GreedyLabel(index, remainder)\n                }\n\n        return LabelSensitivity(labelIndexes, greedyLabel, runtimeConfig)\n    }\n\n    private fun getShape(shape: Optional<ShapeId>): Shape? {\n        return shape.orElse(null)?.let { model.getShape(it).orElse(null) }\n    }\n\n    internal fun input(): Shape? {\n        return getShape(operation.input)\n    }\n\n    internal fun output(): Shape? {\n        return getShape(operation.output)\n    }\n\n    private fun defaultRequestFmt(): MakeFmt {\n        val type =\n            writable {\n                rustTemplate(\"#{SmithyHttpServer}::instrumentation::sensitivity::DefaultRequestFmt\", *codegenScope)\n            }\n        val value =\n            writable {\n                rustTemplate(\"#{SmithyHttpServer}::instrumentation::sensitivity::RequestFmt::new()\", *codegenScope)\n            }\n        return MakeFmt(type, value)\n    }\n\n    fun requestFmt(): MakeFmt {\n        // Sensitivity only applies when http trait is applied to the operation\n        val httpTrait = operation.getTrait<HttpTrait>() ?: return defaultRequestFmt()\n        val inputShape = input() ?: return defaultRequestFmt()\n\n        // httpHeader/httpPrefixHeaders bindings\n        val headerSensitivity = findHeaderSensitivity(inputShape)\n\n        // httpLabel bindings\n        val labelSensitivity = findLabelSensitivity(httpTrait.uri, inputShape)\n\n        // httpQuery/httpQueryParams bindings\n        val querySensitivity = findQuerySensitivity(inputShape)\n\n        val type =\n            writable {\n                rustTemplate(\n                    \"\"\"\n                    #{SmithyHttpServer}::instrumentation::sensitivity::RequestFmt<\n                        #{HeaderType:W},\n                        #{SmithyHttpServer}::instrumentation::sensitivity::uri::MakeUri<\n                            #{LabelType:W},\n                            #{QueryType:W}\n                        >\n                    >\n                    \"\"\",\n                    \"HeaderType\" to headerSensitivity.type(),\n                    \"LabelType\" to labelSensitivity.type(),\n                    \"QueryType\" to querySensitivity.type(),\n                    *codegenScope,\n                )\n            }\n\n        val value =\n            writable {\n                rustTemplate(\"#{SmithyHttpServer}::instrumentation::sensitivity::RequestFmt::new()\", *codegenScope)\n            } + headerSensitivity.setter() + labelSensitivity.setter() + querySensitivity.setters()\n\n        return MakeFmt(type, value)\n    }\n\n    private fun defaultResponseFmt(): MakeFmt {\n        val type =\n            writable {\n                rustTemplate(\"#{SmithyHttpServer}::instrumentation::sensitivity::DefaultResponseFmt\", *codegenScope)\n            }\n\n        val value =\n            writable {\n                rustTemplate(\"#{SmithyHttpServer}::instrumentation::sensitivity::ResponseFmt::new()\", *codegenScope)\n            }\n        return MakeFmt(type, value)\n    }\n\n    fun responseFmt(): MakeFmt {\n        // Sensitivity only applies when HTTP trait is applied to the operation\n        operation.getTrait<HttpTrait>() ?: return defaultResponseFmt()\n        val outputShape = output() ?: return defaultResponseFmt()\n\n        // httpHeader/httpPrefixHeaders bindings\n        val headerSensitivity = findHeaderSensitivity(outputShape)\n\n        // Status code bindings\n        val statusCodeSensitivity = findStatusCodeSensitivity(outputShape)\n\n        val type =\n            writable {\n                rustTemplate(\n                    \"#{SmithyHttpServer}::instrumentation::sensitivity::ResponseFmt<#{HeaderType:W}, #{StatusType:W}>\",\n                    \"HeaderType\" to headerSensitivity.type(),\n                    \"StatusType\" to statusCodeSensitivity.type(),\n                    *codegenScope,\n                )\n            }\n\n        val value =\n            writable {\n                rustTemplate(\"#{SmithyHttpServer}::instrumentation::sensitivity::ResponseFmt::new()\", *codegenScope)\n            } + headerSensitivity.setter() + statusCodeSensitivity.setter()\n\n        return MakeFmt(type, value)\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerInstantiator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.generators\n\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenContext\nimport software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.BuilderInstantiator\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.Instantiator\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.InstantiatorCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.InstantiatorSection\nimport software.amazon.smithy.rust.codegen.core.smithy.isOptional\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.parse.ReturnSymbolToParse\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenContext\nimport software.amazon.smithy.rust.codegen.server.smithy.isDirectlyConstrained\nimport software.amazon.smithy.rust.codegen.server.smithy.traits.isReachableFromOperationInput\n\nclass ServerAfterInstantiatingValueConstrainItIfNecessary(val codegenContext: CodegenContext) :\n    InstantiatorCustomization() {\n    override fun section(section: InstantiatorSection): Writable =\n        when (section) {\n            is InstantiatorSection.AfterInstantiatingValue ->\n                writable {\n                    if (section.shape.isDirectlyConstrained(codegenContext.symbolProvider)) {\n                        rust(\"\"\".try_into().expect(\"this is only used in tests\")\"\"\")\n                    }\n                }\n        }\n}\n\nclass ServerBuilderKindBehavior(val codegenContext: CodegenContext) : Instantiator.BuilderKindBehavior {\n    override fun hasFallibleBuilder(shape: StructureShape): Boolean {\n        // Only operation input builders take in unconstrained types.\n        val takesInUnconstrainedTypes = shape.isReachableFromOperationInput()\n\n        val publicConstrainedTypes =\n            if (codegenContext is ServerCodegenContext) {\n                codegenContext.settings.codegenConfig.publicConstrainedTypes\n            } else {\n                true\n            }\n\n        return if (publicConstrainedTypes) {\n            ServerBuilderGenerator.hasFallibleBuilder(\n                shape,\n                codegenContext.model,\n                codegenContext.symbolProvider,\n                takesInUnconstrainedTypes,\n            )\n        } else {\n            ServerBuilderGeneratorWithoutPublicConstrainedTypes.hasFallibleBuilder(\n                shape,\n                codegenContext.symbolProvider,\n            )\n        }\n    }\n\n    override fun setterName(memberShape: MemberShape): String = codegenContext.symbolProvider.toMemberName(memberShape)\n\n    override fun doesSetterTakeInOption(memberShape: MemberShape): Boolean =\n        codegenContext.symbolProvider.toSymbol(memberShape).isOptional()\n}\n\nclass ServerInstantiator(\n    codegenContext: CodegenContext,\n    customWritable: CustomWritable = NoCustomWritable(),\n    ignoreMissingMembers: Boolean = false,\n    withinTest: Boolean = false,\n) :\n    Instantiator(\n            codegenContext.symbolProvider,\n            codegenContext.model,\n            codegenContext.runtimeConfig,\n            ServerBuilderKindBehavior(codegenContext),\n            defaultsForRequiredFields = true,\n            customizations = listOf(ServerAfterInstantiatingValueConstrainItIfNecessary(codegenContext)),\n            // Construct with direct pattern to more closely replicate actual server customer usage\n            constructPattern = InstantiatorConstructPattern.DIRECT,\n            customWritable = customWritable,\n            ignoreMissingMembers = ignoreMissingMembers,\n            withinTest = withinTest,\n        )\n\nclass ServerBuilderInstantiator(\n    private val symbolProvider: RustSymbolProvider,\n    private val symbolParseFn: (Shape) -> ReturnSymbolToParse,\n) : BuilderInstantiator {\n    override fun setField(\n        builder: String,\n        value: Writable,\n        field: MemberShape,\n    ): Writable {\n        // Server builders have the ability to have non-optional fields. When one of these fields is used,\n        // we need to use `if let(...)` to only set the field when it is present.\n        return if (!symbolProvider.toSymbol(field).isOptional()) {\n            writable {\n                val n = safeName()\n                rustTemplate(\n                    \"\"\"\n                    if let Some($n) = #{value} {\n                        #{setter}\n                    }\n                    \"\"\",\n                    \"value\" to value, \"setter\" to setFieldWithSetter(builder, writable(n), field),\n                )\n            }\n        } else {\n            setFieldWithSetter(builder, value, field)\n        }\n    }\n\n    override fun finalizeBuilder(\n        builder: String,\n        shape: StructureShape,\n        mapErr: Writable?,\n    ): Writable =\n        writable {\n            val returnSymbolToParse = symbolParseFn(shape)\n            if (returnSymbolToParse.isUnconstrained) {\n                rust(builder)\n            } else {\n                rust(\"$builder.build()\")\n            }\n        }\n}\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerOperationErrorGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.generators\n\nimport software.amazon.smithy.codegen.core.Symbol\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.shapes.UnionShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustMetadata\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.Visibility\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.deprecatedShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.documentShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlock\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.transformers.eventStreamErrors\nimport software.amazon.smithy.rust.codegen.core.smithy.transformers.operationErrors\nimport software.amazon.smithy.rust.codegen.core.util.UNREACHABLE\nimport software.amazon.smithy.rust.codegen.core.util.toSnakeCase\n\n/**\n * Generates a unified error enum for [operation]. [ErrorGenerator] handles generating the individual variants,\n * but we must still combine those variants into an enum covering all possible errors for a given operation.\n */\nopen class ServerOperationErrorGenerator(\n    private val model: Model,\n    private val symbolProvider: RustSymbolProvider,\n    private val operationOrEventStream: Shape,\n) {\n    private val symbol = symbolProvider.toSymbol(operationOrEventStream)\n\n    private fun operationErrors(): List<StructureShape> =\n        (operationOrEventStream as OperationShape).operationErrors(model).map { it.asStructureShape().get() }\n\n    private fun eventStreamErrors(): List<StructureShape> =\n        (operationOrEventStream as UnionShape).eventStreamErrors()\n            .map { model.expectShape(it.asMemberShape().get().target, StructureShape::class.java) }\n\n    open fun render(writer: RustWriter) {\n        val (errorSymbol, errors) =\n            when (operationOrEventStream) {\n                is OperationShape -> symbolProvider.symbolForOperationError(operationOrEventStream) to operationErrors()\n                is UnionShape -> symbolProvider.symbolForEventStreamError(operationOrEventStream) to eventStreamErrors()\n                else -> UNREACHABLE(\"OperationErrorGenerator only supports operation or event stream shapes\")\n            }\n        if (errors.isEmpty()) {\n            return\n        }\n        val meta =\n            RustMetadata(\n                derives = setOf(RuntimeType.Debug),\n                visibility = Visibility.PUBLIC,\n            )\n\n        writer.rust(\"/// Error type for the `${symbol.name}` operation.\")\n        writer.rust(\"/// Each variant represents an error that can occur for the `${symbol.name}` operation.\")\n        meta.render(writer)\n        writer.rustBlock(\"enum ${errorSymbol.name}\") {\n            errors.forEach { errorVariant ->\n                documentShape(errorVariant, model)\n                deprecatedShape(errorVariant)\n                val errorVariantSymbol = symbolProvider.toSymbol(errorVariant)\n                write(\"${errorVariantSymbol.name}(#T),\", errorVariantSymbol)\n            }\n        }\n\n        writer.rustBlock(\"impl #T for ${errorSymbol.name}\", RuntimeType.Display) {\n            rustBlock(\"fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result\") {\n                delegateToVariants(errors, errorSymbol) {\n                    rust(\"_inner.fmt(f)\")\n                }\n            }\n        }\n\n        writer.rustBlock(\"impl ${errorSymbol.name}\") {\n            errors.forEach { error ->\n                val errorVariantSymbol = symbolProvider.toSymbol(error)\n                val fnName = errorVariantSymbol.name.toSnakeCase()\n                writer.rust(\"/// Returns `true` if the error kind is `${errorSymbol.name}::${errorVariantSymbol.name}`.\")\n                writer.rustBlock(\"pub fn is_$fnName(&self) -> bool\") {\n                    rust(\"matches!(&self, ${errorSymbol.name}::${errorVariantSymbol.name}(_))\")\n                }\n            }\n            writer.rust(\"/// Returns the error name string by matching the correct variant.\")\n            writer.rustBlock(\"pub fn name(&self) -> &'static str\") {\n                delegateToVariants(errors, errorSymbol) {\n                    rust(\"_inner.name()\")\n                }\n            }\n        }\n\n        writer.rustBlock(\"impl #T for ${errorSymbol.name}\", RuntimeType.StdError) {\n            rustBlock(\"fn source(&self) -> std::option::Option<&(dyn #T + 'static)>\", RuntimeType.StdError) {\n                delegateToVariants(errors, errorSymbol) {\n                    rust(\"Some(_inner)\")\n                }\n            }\n        }\n\n        for (error in errors) {\n            val errorVariantSymbol = symbolProvider.toSymbol(error)\n            writer.rustBlock(\"impl #T<#T> for #T\", RuntimeType.From, errorVariantSymbol, errorSymbol) {\n                rustBlock(\"fn from(variant: #T) -> #T\", errorVariantSymbol, errorSymbol) {\n                    rust(\"Self::${errorVariantSymbol.name}(variant)\")\n                }\n            }\n        }\n    }\n\n    /**\n     * Generates code to delegate behavior to the variants, for example:\n     *\n     * ```rust\n     *  match &self {\n     *      GreetingWithErrorsError::InvalidGreeting(_inner) => inner.fmt(f),\n     *      GreetingWithErrorsError::ComplexError(_inner) => inner.fmt(f),\n     *      GreetingWithErrorsError::FooError(_inner) => inner.fmt(f),\n     *      GreetingWithErrorsError::Unhandled(_inner) => _inner.fmt(f),\n     *  }\n     *  ```\n     *\n     * A [writable] is passed containing the content to be written for each variant.\n     *\n     *  The field will always be bound as `_inner`.\n     */\n    private fun RustWriter.delegateToVariants(\n        errors: List<StructureShape>,\n        symbol: Symbol,\n        writable: Writable,\n    ) {\n        rustBlock(\"match &self\") {\n            errors.forEach {\n                val errorSymbol = symbolProvider.toSymbol(it)\n                rust(\"\"\"${symbol.name}::${errorSymbol.name}(_inner) => \"\"\")\n                writable(this)\n                write(\",\")\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerOperationGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.generators\n\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.documentShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenContext\nimport software.amazon.smithy.rust.codegen.core.util.dq\nimport software.amazon.smithy.rust.codegen.core.util.toPascalCase\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerCargoDependency\n\nclass ServerOperationGenerator(\n    private val operation: OperationShape,\n    codegenContext: CodegenContext,\n) {\n    private val runtimeConfig = codegenContext.runtimeConfig\n    private val codegenScope =\n        arrayOf(\n            \"SmithyHttpServer\" to\n                ServerCargoDependency.smithyHttpServer(runtimeConfig).toType(),\n        )\n    private val symbolProvider = codegenContext.symbolProvider\n    private val model = codegenContext.model\n\n    private val operationName = symbolProvider.toSymbol(operation).name.toPascalCase()\n    private val operationId = operation.id\n\n    /** Returns `std::convert::Infallible` if the model provides no errors. */\n    private fun operationError(): Writable =\n        writable {\n            if (operation.errors.isEmpty()) {\n                rust(\"std::convert::Infallible\")\n            } else {\n                // Name comes from [ServerOperationErrorGenerator].\n                rust(\"crate::error::${symbolProvider.toSymbol(operation).name}Error\")\n            }\n        }\n\n    fun render(writer: RustWriter) {\n        writer.documentShape(operation, model)\n\n        val generator = ServerHttpSensitivityGenerator(model, operation, runtimeConfig)\n        val requestFmt = generator.requestFmt()\n        val responseFmt = generator.responseFmt()\n\n        val operationIdAbsolute = operationId.toString().replace(\"#\", \"##\")\n        writer.rustTemplate(\n            \"\"\"\n            pub struct $operationName;\n\n            impl #{SmithyHttpServer}::operation::OperationShape for $operationName {\n                const ID: #{SmithyHttpServer}::shape_id::ShapeId = #{SmithyHttpServer}::shape_id::ShapeId::new(${operationIdAbsolute.dq()}, ${operationId.namespace.dq()}, ${operationId.name.dq()});\n\n                type Input = crate::input::${operationName}Input;\n                type Output = crate::output::${operationName}Output;\n                type Error = #{Error:W};\n            }\n\n            impl #{SmithyHttpServer}::instrumentation::sensitivity::Sensitivity for $operationName {\n                type RequestFmt = #{RequestType:W};\n                type ResponseFmt = #{ResponseType:W};\n\n                fn request_fmt() -> Self::RequestFmt {\n                    #{RequestValue:W}\n                }\n\n                fn response_fmt() -> Self::ResponseFmt {\n                    #{ResponseValue:W}\n                }\n            }\n            \"\"\",\n            \"Error\" to operationError(),\n            \"RequestValue\" to requestFmt.value,\n            \"RequestType\" to requestFmt.type,\n            \"ResponseValue\" to responseFmt.value,\n            \"ResponseType\" to responseFmt.type,\n            *codegenScope,\n        )\n        // Adds newline to end of render\n        writer.rust(\"\")\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerRootGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.generators\n\nimport software.amazon.smithy.model.knowledge.TopDownIndex\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustReservedWords\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.join\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.HttpVersion\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig\nimport software.amazon.smithy.rust.codegen.core.util.toPascalCase\nimport software.amazon.smithy.rust.codegen.core.util.toSnakeCase\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerCargoDependency\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenContext\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.protocol.ServerProtocol\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerRustModule.Error as ErrorModule\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerRustModule.Input as InputModule\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerRustModule.Output as OutputModule\n\n/**\n * ServerRootGenerator\n *\n * Generates all code within `lib.rs`, this includes:\n *  - Crate documentation\n *  - Re-exports\n */\nopen class ServerRootGenerator(\n    val protocol: ServerProtocol,\n    private val codegenContext: ServerCodegenContext,\n    private val isConfigBuilderFallible: Boolean,\n) {\n    private val index = TopDownIndex.of(codegenContext.model)\n    private val operations =\n        index.getContainedOperations(codegenContext.serviceShape).toSortedSet(\n            compareBy {\n                it.id\n            },\n        ).toList()\n    private val serviceName = codegenContext.serviceShape.id.name.toPascalCase()\n\n    /**\n     * Returns a Writable containing the appropriate Hyper usage example based on HTTP version.\n     * For HTTP 1.x: Uses tokio::net::TcpListener and serve() function\n     * For HTTP 0.x: Uses hyper::Server::bind() API\n     */\n    private fun hyperServeExample(\n        crateName: String,\n        serviceName: String,\n        unwrapConfigBuilder: String,\n    ): Writable =\n        writable {\n            when (codegenContext.settings.runtimeConfig.httpVersion) {\n                HttpVersion.Http1x ->\n                    rustTemplate(\n                        \"\"\"\n                        //! ```rust,no_run\n                        //! ## use std::net::SocketAddr;\n                        //! ## async fn dummy() {\n                        //! use $crateName::{$serviceName, ${serviceName}Config};\n                        //! use $crateName::serve;\n                        //! use #{Tokio}::net::TcpListener;\n                        //!\n                        //! ## let app = $serviceName::builder(\n                        //! ##     ${serviceName}Config::builder()\n                        //! ##         .build()$unwrapConfigBuilder\n                        //! ## ).build_unchecked();\n                        //! let bind: SocketAddr = \"127.0.0.1:6969\".parse()\n                        //!     .expect(\"unable to parse the server bind address and port\");\n                        //! let listener = TcpListener::bind(bind).await\n                        //!     .expect(\"failed to bind TCP listener\");\n                        //! serve(listener, app.into_make_service()).await.unwrap();\n                        //! ## }\n                        //! ```\n                        \"\"\",\n                        \"Tokio\" to ServerCargoDependency.TokioDev.toType(),\n                    )\n\n                HttpVersion.Http0x ->\n                    rustTemplate(\n                        \"\"\"\n                        //! ```rust,no_run\n                        //! ## use std::net::SocketAddr;\n                        //! ## async fn dummy() {\n                        //! use $crateName::{$serviceName, ${serviceName}Config};\n                        //!\n                        //! ## let app = $serviceName::builder(\n                        //! ##     ${serviceName}Config::builder()\n                        //! ##         .build()$unwrapConfigBuilder\n                        //! ## ).build_unchecked();\n                        //! let server = app.into_make_service();\n                        //! let bind: SocketAddr = \"127.0.0.1:6969\".parse()\n                        //!     .expect(\"unable to parse the server bind address and port\");\n                        //! #{Hyper0}::Server::bind(&bind).serve(server).await.unwrap();\n                        //! ## }\n                        //! \n                        //! ```\n                        \"\"\",\n                        \"Hyper0\" to ServerCargoDependency.hyperDev(codegenContext.runtimeConfig).toType(),\n                    )\n            }\n        }\n\n    /**\n     * Returns a Writable containing the appropriate full example code based on HTTP version.\n     * For HTTP 1.x: Uses tokio::net::TcpListener and serve() function\n     * For HTTP 0.x: Uses hyper::Server::bind() API\n     */\n    private fun fullExample(\n        crateName: String,\n        serviceName: String,\n        unwrapConfigBuilder: String,\n        builderFieldNames: Map<*, String>,\n    ): Writable =\n        writable {\n            when (codegenContext.settings.runtimeConfig.httpVersion) {\n                HttpVersion.Http1x ->\n                    rustTemplate(\n                        \"\"\"\n                        //! ```rust,no_run\n                        //! ## use std::net::SocketAddr;\n                        //! use $crateName::{$serviceName, ${serviceName}Config};\n                        //! use $crateName::serve;\n                        //! use #{Tokio}::net::TcpListener;\n                        //!\n                        //! ##[#{Tokio}::main]\n                        //! pub async fn main() {\n                        //!    let config = ${serviceName}Config::builder().build()$unwrapConfigBuilder;\n                        //!    let app = $serviceName::builder(config)\n                        ${builderFieldNames.values.joinToString(\"\\n\") { \"//!        .$it($it)\" }}\n                        //!        .build()\n                        //!        .expect(\"failed to build an instance of $serviceName\");\n                        //!\n                        //!    let bind: SocketAddr = \"127.0.0.1:6969\".parse()\n                        //!        .expect(\"unable to parse the server bind address and port\");\n                        //!    let listener = TcpListener::bind(bind).await\n                        //!        .expect(\"failed to bind TCP listener\");\n                        //!    ## let server = async { Ok::<_, ()>(()) };\n                        //!\n                        //!    // Run your service!\n                        //!    if let Err(err) = serve(listener, app.into_make_service()).await {\n                        //!        eprintln!(\"server error: {:?}\", err);\n                        //!    }\n                        //! }\n                        \"\"\",\n                        \"Tokio\" to ServerCargoDependency.TokioDev.toType(),\n                    )\n\n                HttpVersion.Http0x ->\n                    rustTemplate(\n                        \"\"\"\n                        //! ```rust,no_run\n                        //! ## use std::net::SocketAddr;\n                        //! use $crateName::{$serviceName, ${serviceName}Config};\n                        //!\n                        //! ##[#{Tokio}::main]\n                        //! pub async fn main() {\n                        //!    let config = ${serviceName}Config::builder().build()$unwrapConfigBuilder;\n                        //!    let app = $serviceName::builder(config)\n                        ${builderFieldNames.values.joinToString(\"\\n\") { \"//!        .$it($it)\" }}\n                        //!        .build()\n                        //!        .expect(\"failed to build an instance of $serviceName\");\n                        //!\n                        //!    let bind: SocketAddr = \"127.0.0.1:6969\".parse()\n                        //!        .expect(\"unable to parse the server bind address and port\");\n                        //!    let server = #{Hyper}::Server::bind(&bind).serve(app.into_make_service());\n                        //!    ## let server = async { Ok::<_, ()>(()) };\n                        //!\n                        //!    // Run your service!\n                        //!    if let Err(err) = server.await {\n                        //!        eprintln!(\"server error: {:?}\", err);\n                        //!    }\n                        //! }\n                        \"\"\",\n                        \"Hyper\" to ServerCargoDependency.hyperDev(codegenContext.runtimeConfig).toType(),\n                        \"Tokio\" to ServerCargoDependency.TokioDev.toType(),\n                    )\n            }\n        }\n\n    fun documentation(writer: RustWriter) {\n        val builderFieldNames =\n            operations.associateWith {\n                RustReservedWords.escapeIfNeeded(codegenContext.symbolProvider.toSymbol(it).name.toSnakeCase())\n            }\n                .toSortedMap(\n                    compareBy { it.id },\n                )\n        val crateName = codegenContext.moduleUseName()\n        val builderName = \"${serviceName}Builder\"\n        val hasErrors = operations.any { it.errors.isNotEmpty() }\n        val handlers: Writable =\n            operations\n                .map { operation ->\n                    DocHandlerGenerator(codegenContext, operation, builderFieldNames[operation]!!, \"//!\").docSignature()\n                }\n                .join(\"//!\\n\")\n\n        val unwrapConfigBuilder = if (isConfigBuilderFallible) \".expect(\\\"config failed to build\\\")\" else \"\"\n\n        writer.rustTemplate(\n            \"\"\"\n            //! A fast and customizable Rust implementation of the $serviceName Smithy service.\n            //!\n            //! ## Using $serviceName\n            //!\n            //! The primary entrypoint is [`$serviceName`]: it satisfies the [`Service<http::Request, Response = http::Response>`](#{Tower}::Service)\n            //! trait and therefore can be handed to a [`hyper` server](https://github.com/hyperium/hyper) via [`$serviceName::into_make_service`]\n            //! or used in AWS Lambda\n            ##![cfg_attr(\n                feature = \"aws-lambda\",\n                doc = \" via [`LambdaHandler`](crate::server::routing::LambdaHandler).\")]\n            ##![cfg_attr(\n                not(feature = \"aws-lambda\"),\n                doc = \" by enabling the `aws-lambda` feature flag and utilizing the `LambdaHandler`.\")]\n            //! The [`crate::${InputModule.name}`], ${if (!hasErrors) \"and \" else \"\"}[`crate::${OutputModule.name}`], ${if (hasErrors) \"and [`crate::${ErrorModule.name}`]\" else \"\" }\n            //! modules provide the types used in each operation.\n            //!\n            //! ###### Running on Hyper\n            //!\n            #{HyperServeExample:W}\n            //!\n            //! ###### Running on Lambda\n            //!\n            //! ```rust,ignore\n            //! use $crateName::server::routing::LambdaHandler;\n            //! use $crateName::$serviceName;\n            //!\n            //! ## async fn dummy() {\n            //! ## let app = $serviceName::builder(\n            //! ##     ${serviceName}Config::builder()\n            //! ##         .build()$unwrapConfigBuilder\n            //! ## ).build_unchecked();\n            //! let handler = LambdaHandler::new(app);\n            //! lambda_http::run(handler).await.unwrap();\n            //! ## }\n            //! ```\n            //!\n            //! ## Building the $serviceName\n            //!\n            //! To construct [`$serviceName`] we use [`$builderName`] returned by [`$serviceName::builder`].\n            //!\n            //! #### Plugins\n            //!\n            //! The [`$serviceName::builder`] method, returning [`$builderName`],\n            //! accepts a config object on which plugins can be registered.\n            //! Plugins allow you to build middleware which is aware of the operation it is being applied to.\n            //!\n            //! ```rust,no_run\n            //! ## use $crateName::server::plugin::IdentityPlugin as LoggingPlugin;\n            //! ## use $crateName::server::plugin::IdentityPlugin as MetricsPlugin;\n            //! ## use #{Body};\n            //! use $crateName::server::plugin::HttpPlugins;\n            //! use $crateName::{$serviceName, ${serviceName}Config, $builderName};\n            //!\n            //! let http_plugins = HttpPlugins::new()\n            //!         .push(LoggingPlugin)\n            //!         .push(MetricsPlugin);\n            //! let config = ${serviceName}Config::builder().build()$unwrapConfigBuilder;\n            //! let builder: $builderName<#{Body}, _, _, _> = $serviceName::builder(config);\n            //! ```\n            //!\n            //! Check out [`crate::server::plugin`] to learn more about plugins.\n            //!\n            //! #### Handlers\n            //!\n            //! [`$builderName`] provides a setter method for each operation in your Smithy model. The setter methods expect an async function as input, matching the signature for the corresponding operation in your Smithy model.\n            //! We call these async functions **handlers**. This is where your application business logic lives.\n            //!\n            //! Every handler must take an `Input`, and optional [`extractor arguments`](crate::server::request), while returning:\n            //!\n            //! * A `Result<Output, Error>` if your operation has modeled errors, or\n            //! * An `Output` otherwise.\n            //!\n            //! ```rust,no_run\n            //! ## struct Input;\n            //! ## struct Output;\n            //! ## struct Error;\n            //! async fn infallible_handler(input: Input) -> Output { todo!() }\n            //!\n            //! async fn fallible_handler(input: Input) -> Result<Output, Error> { todo!() }\n            //! ```\n            //!\n            //! Handlers can accept up to 8 extractors:\n            //!\n            //! ```rust,no_run\n            //! ## struct Input;\n            //! ## struct Output;\n            //! ## struct Error;\n            //! ## struct State;\n            //! ## use std::net::SocketAddr;\n            //! use $crateName::server::request::{extension::Extension, connect_info::ConnectInfo};\n            //!\n            //! async fn handler_with_no_extensions(input: Input) -> Output {\n            //!     todo!()\n            //! }\n            //!\n            //! async fn handler_with_one_extractor(input: Input, ext: Extension<State>) -> Output {\n            //!     todo!()\n            //! }\n            //!\n            //! async fn handler_with_two_extractors(\n            //!     input: Input,\n            //!     ext0: Extension<State>,\n            //!     ext1: ConnectInfo<SocketAddr>,\n            //! ) -> Output {\n            //!     todo!()\n            //! }\n            //! ```\n            //!\n            //! See the [`operation module`](crate::operation) for information on precisely what constitutes a handler.\n            //!\n            //! #### Build\n            //!\n            //! You can convert [`$builderName`] into [`$serviceName`] using either [`$builderName::build`] or [`$builderName::build_unchecked`].\n            //!\n            //! [`$builderName::build`] requires you to provide a handler for every single operation in your Smithy model. It will return an error if that is not the case.\n            //!\n            //! [`$builderName::build_unchecked`], instead, does not require exhaustiveness. The server will automatically return 500 Internal Server Error to all requests for operations that do not have a registered handler.\n            //! [`$builderName::build_unchecked`] is particularly useful if you are deploying your Smithy service as a collection of Lambda functions, where each Lambda is only responsible for a subset of the operations in the Smithy service (or even a single one!).\n            //!\n            //! ## Example\n            //!\n            #{FullExample:W}\n            //!\n            #{HandlerImports:W}\n            //!\n            #{Handlers:W}\n            //!\n            //! ```\n            //!\n            #{ServeLink}\n            //! [`tower::make::MakeService`]: https://docs.rs/tower/latest/tower/make/trait.MakeService.html\n            //! [HTTP binding traits]: https://smithy.io/2.0/spec/http-bindings.html\n            //! [operations]: https://smithy.io/2.0/spec/service-types.html##operation\n            //! [Service]: https://docs.rs/tower-service/latest/tower_service/trait.Service.html\n            \"\"\",\n            \"HandlerImports\" to handlerImports(crateName, operations, commentToken = \"//!\"),\n            \"Handlers\" to handlers,\n            \"ExampleHandler\" to operations.take(1).map { operation -> DocHandlerGenerator(codegenContext, operation, builderFieldNames[operation]!!, \"//!\").docSignature() },\n            \"HyperServeExample\" to hyperServeExample(crateName, serviceName, unwrapConfigBuilder),\n            \"FullExample\" to fullExample(crateName, serviceName, unwrapConfigBuilder, builderFieldNames),\n            \"Hyper\" to ServerCargoDependency.hyperDev(codegenContext.runtimeConfig).toType(),\n            \"Tokio\" to ServerCargoDependency.TokioDev.toType(),\n            \"Tower\" to ServerCargoDependency.Tower.toType(),\n            \"Body\" to\n                when (codegenContext.runtimeConfig.httpVersion) {\n                    HttpVersion.Http0x ->\n                        ServerCargoDependency.hyperDev(codegenContext.runtimeConfig).toType().resolve(\"Body\")\n                    HttpVersion.Http1x ->\n                        ServerCargoDependency.hyperDev(codegenContext.runtimeConfig).toType().resolve(\"body::Incoming\")\n                },\n            \"ServeLink\" to serveLink(codegenContext.runtimeConfig, crateName),\n        )\n    }\n\n    private fun serveLink(\n        runtimeConfig: RuntimeConfig,\n        crateName: String,\n    ) = writable {\n        when (runtimeConfig.httpVersion) {\n            HttpVersion.Http0x -> {\n                rustTemplate(\n                    \"\"\"\n                    //! [`serve`]: https://docs.rs/hyper/0.14.16/hyper/server/struct.Builder.html##method.serve\n                    //! [hyper server]: https://docs.rs/hyper/#{Hyper0Version}/hyper/server/index.html\n                    \"\"\",\n                    \"Hyper0Version\" to writable { rust(ServerCargoDependency.hyperDev(codegenContext.runtimeConfig).version()) },\n                )\n            }\n\n            HttpVersion.Http1x -> {\n                rustTemplate(\n                    \"\"\"\n                        //! [`serve`]: crate::serve\n                        //! [hyper server]: https://docs.rs/hyper/latest/hyper/server/index.html\n                        \"\"\",\n                )\n            }\n        }\n    }\n\n    /**\n     * Render Service Specific code. Code will end up in different files via [useShapeWriter]. See `SymbolVisitor.kt`\n     * which assigns a symbol location to each shape.\n     */\n    fun render(rustWriter: RustWriter) {\n        documentation(rustWriter)\n\n        // Only export config builder error if fallible.\n        val configErrorReExport =\n            if (isConfigBuilderFallible) {\n                \"${serviceName}ConfigError,\"\n            } else {\n                \"\"\n            }\n        rustWriter.rust(\n            \"\"\"\n            pub use crate::service::{\n                $serviceName,\n                ${serviceName}Config,\n                ${serviceName}ConfigBuilder,\n                $configErrorReExport\n                ${serviceName}Builder,\n                MissingOperationsError\n            };\n            \"\"\",\n        )\n\n        // Re-export serve function for HTTP 1.x\n        if (codegenContext.settings.runtimeConfig.httpVersion == HttpVersion.Http1x) {\n            rustWriter.rust(\n                \"\"\"\n                pub use crate::server::serve::serve;\n                \"\"\",\n            )\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerRuntimeTypesReExportsGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.generators\n\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenContext\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerCargoDependency\n\nclass ServerRuntimeTypesReExportsGenerator(\n    codegenContext: CodegenContext,\n) {\n    private val runtimeConfig = codegenContext.runtimeConfig\n    private val codegenScope =\n        arrayOf(\n            \"SmithyHttpServer\" to ServerCargoDependency.smithyHttpServer(runtimeConfig).toType(),\n        )\n\n    fun render(writer: RustWriter) {\n        writer.rustTemplate(\n            \"\"\"\n            // Re-export all types from the `aws-smithy-http-server` crate.\n            pub use #{SmithyHttpServer}::*;\n            \"\"\",\n            *codegenScope,\n        )\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerServiceGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.generators\n\nimport software.amazon.smithy.model.knowledge.TopDownIndex\nimport software.amazon.smithy.model.neighbor.Walker\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.StringShape\nimport software.amazon.smithy.model.traits.PatternTrait\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustReservedWords\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.documentShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.join\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\nimport software.amazon.smithy.rust.codegen.core.util.letIf\nimport software.amazon.smithy.rust.codegen.core.util.toPascalCase\nimport software.amazon.smithy.rust.codegen.core.util.toSnakeCase\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerCargoDependency\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenContext\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.protocol.ServerProtocol\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerRustModule.Error as ErrorModule\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerRustModule.Input as InputModule\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerRustModule.Output as OutputModule\n\nclass ServerServiceGenerator(\n    private val codegenContext: ServerCodegenContext,\n    private val protocol: ServerProtocol,\n    private val isConfigBuilderFallible: Boolean,\n) {\n    private val runtimeConfig = codegenContext.runtimeConfig\n    private val smithyHttpServer = ServerCargoDependency.smithyHttpServer(runtimeConfig).toType()\n    private val codegenScope =\n        arrayOf(\n            \"Bytes\" to RuntimeType.Bytes,\n            \"Http\" to RuntimeType.http(runtimeConfig),\n            \"SmithyHttp\" to RuntimeType.smithyHttp(runtimeConfig),\n            \"HttpBody\" to RuntimeType.httpBody(runtimeConfig),\n            \"SmithyHttpServer\" to smithyHttpServer,\n            \"Tower\" to RuntimeType.Tower,\n            *RuntimeType.preludeScope,\n        )\n    private val model = codegenContext.model\n    private val symbolProvider = codegenContext.symbolProvider\n    private val crateName = codegenContext.moduleUseName()\n\n    private val service = codegenContext.serviceShape\n    private val serviceId = service.id\n    private val serviceName = serviceId.name.toPascalCase()\n    private val builderName = \"${serviceName}Builder\"\n\n    /** Calculate all `operationShape`s contained within the `ServiceShape`. */\n    private val index = TopDownIndex.of(codegenContext.model)\n    private val operations = index.getContainedOperations(codegenContext.serviceShape).toSortedSet(compareBy { it.id })\n\n    /** Associate each operation with the corresponding field names in the builder struct. */\n    private val builderFieldNames =\n        operations.associateWith { RustReservedWords.escapeIfNeeded(symbolProvider.toSymbol(it).name.toSnakeCase()) }\n            .toSortedMap(\n                compareBy { it.id },\n            )\n\n    /** Associate each operation with the name of the corresponding Zero-Sized Type (ZST) struct name. */\n    private val operationStructNames = operations.associateWith { symbolProvider.toSymbol(it).name.toPascalCase() }\n\n    /** A `Writable` block of \"field: Type\" for the builder. */\n    private val builderFields =\n        builderFieldNames.values.map { name -> \"$name: Option<#{SmithyHttpServer}::routing::Route<Body>>\" }\n\n    /** The name of the local private module containing the functions that return the request for each operation */\n    private val requestSpecsModuleName = \"request_specs\"\n\n    /** Associate each operation with a function that returns its request spec. */\n    private val requestSpecMap: Map<OperationShape, Pair<String, Writable>> =\n        operations.associateWith { operationShape ->\n            val operationName = symbolProvider.toSymbol(operationShape).name\n            val spec =\n                protocol.serverRouterRequestSpec(\n                    operationShape,\n                    operationName,\n                    serviceId.name,\n                    smithyHttpServer.resolve(\"routing::request_spec\"),\n                )\n            val functionName = RustReservedWords.escapeIfNeeded(operationName.toSnakeCase())\n            val functionBody =\n                writable {\n                    rustTemplate(\n                        \"\"\"\n                        fn $functionName() -> #{SpecType} {\n                            #{Spec:W}\n                        }\n                        \"\"\",\n                        \"Spec\" to spec,\n                        \"SpecType\" to protocol.serverRouterRequestSpecType(smithyHttpServer.resolve(\"routing::request_spec\")),\n                    )\n                }\n            Pair(functionName, functionBody)\n        }\n\n    /** A `Writable` block containing all the `Handler` and `Operation` setters for the builder. */\n    private fun builderSetters(): Writable =\n        writable {\n            for ((operationShape, structName) in operationStructNames) {\n                val fieldName = builderFieldNames[operationShape]\n                val docHandler = DocHandlerGenerator(codegenContext, operationShape, \"handler\", \"///\")\n                val handler = docHandler.docSignature()\n                val handlerFixed = docHandler.docFixedSignature()\n                val unwrapConfigBuilder =\n                    if (isConfigBuilderFallible) {\n                        \".expect(\\\"config failed to build\\\")\"\n                    } else {\n                        \"\"\n                    }\n                rustTemplate(\n                    \"\"\"\n                    /// Sets the [`$structName`](crate::operation_shape::$structName) operation.\n                    ///\n                    /// This should be an async function satisfying the [`Handler`](#{SmithyHttpServer}::operation::Handler) trait.\n                    /// See the [operation module documentation](#{SmithyHttpServer}::operation) for more information.\n                    ///\n                    /// ## Example\n                    ///\n                    /// ```no_run\n                    /// use $crateName::{$serviceName, ${serviceName}Config};\n                    ///\n                    #{HandlerImports:W}\n                    ///\n                    #{Handler:W}\n                    ///\n                    /// let config = ${serviceName}Config::builder().build()$unwrapConfigBuilder;\n                    /// let app = $serviceName::builder(config)\n                    ///     .$fieldName(handler)\n                    ///     /* Set other handlers */\n                    ///     .build()\n                    ///     .unwrap();\n                    /// ## let app: $serviceName<#{SmithyHttpServer}::routing::RoutingService<#{Router}<#{SmithyHttpServer}::routing::Route>, #{Protocol}>> = app;\n                    /// ```\n                    ///\n                    pub fn $fieldName<HandlerType, HandlerExtractors, UpgradeExtractors>(self, handler: HandlerType) -> Self\n                    where\n                        HandlerType: #{SmithyHttpServer}::operation::Handler<crate::operation_shape::$structName, HandlerExtractors>,\n\n                        ModelPl: #{SmithyHttpServer}::plugin::Plugin<\n                            $serviceName<L>,\n                            crate::operation_shape::$structName,\n                            #{SmithyHttpServer}::operation::IntoService<crate::operation_shape::$structName, HandlerType>\n                        >,\n                        #{SmithyHttpServer}::operation::UpgradePlugin::<UpgradeExtractors>: #{SmithyHttpServer}::plugin::Plugin<\n                            $serviceName<L>,\n                            crate::operation_shape::$structName,\n                            ModelPl::Output\n                        >,\n                        HttpPl: #{SmithyHttpServer}::plugin::Plugin<\n                            $serviceName<L>,\n                            crate::operation_shape::$structName,\n                            <\n                                #{SmithyHttpServer}::operation::UpgradePlugin::<UpgradeExtractors>\n                                as #{SmithyHttpServer}::plugin::Plugin<\n                                    $serviceName<L>,\n                                    crate::operation_shape::$structName,\n                                    ModelPl::Output\n                                >\n                            >::Output\n                        >,\n\n                        HttpPl::Output: #{Tower}::Service<#{Http}::Request<Body>, Response = #{Http}::Response<#{SmithyHttpServer}::body::BoxBody>, Error = ::std::convert::Infallible> + Clone + Send + 'static,\n                        <HttpPl::Output as #{Tower}::Service<#{Http}::Request<Body>>>::Future: Send + 'static,\n\n                    {\n                        use #{SmithyHttpServer}::operation::OperationShapeExt;\n                        use #{SmithyHttpServer}::plugin::Plugin;\n                        let svc = crate::operation_shape::$structName::from_handler(handler);\n                        let svc = self.model_plugin.apply(svc);\n                        let svc = #{SmithyHttpServer}::operation::UpgradePlugin::<UpgradeExtractors>::new().apply(svc);\n                        let svc = self.http_plugin.apply(svc);\n                        self.${fieldName}_custom(svc)\n                    }\n\n                    /// Sets the [`$structName`](crate::operation_shape::$structName) operation.\n                    ///\n                    /// This should be an async function satisfying the [`Handler`](#{SmithyHttpServer}::operation::Handler) trait.\n                    /// See the [operation module documentation](#{SmithyHttpServer}::operation) for more information.\n                    ///\n                    /// ## Example\n                    ///\n                    /// ```no_run\n                    /// use $crateName::{$serviceName, ${serviceName}Config};\n                    ///\n                    #{HandlerImports:W}\n                    ///\n                    #{HandlerFixed:W}\n                    ///\n                    /// let config = ${serviceName}Config::builder().build()$unwrapConfigBuilder;\n                    /// let svc = #{Tower}::util::service_fn(handler);\n                    /// let app = $serviceName::builder(config)\n                    ///     .${fieldName}_service(svc)\n                    ///     /* Set other handlers */\n                    ///     .build()\n                    ///     .unwrap();\n                    /// ## let app: $serviceName<#{SmithyHttpServer}::routing::RoutingService<#{Router}<#{SmithyHttpServer}::routing::Route>, #{Protocol}>> = app;\n                    /// ```\n                    ///\n                    pub fn ${fieldName}_service<S, ServiceExtractors, UpgradeExtractors>(self, service: S) -> Self\n                    where\n                        S: #{SmithyHttpServer}::operation::OperationService<crate::operation_shape::$structName, ServiceExtractors>,\n\n                        ModelPl: #{SmithyHttpServer}::plugin::Plugin<\n                            $serviceName<L>,\n                            crate::operation_shape::$structName,\n                            #{SmithyHttpServer}::operation::Normalize<crate::operation_shape::$structName, S>\n                        >,\n                        #{SmithyHttpServer}::operation::UpgradePlugin::<UpgradeExtractors>: #{SmithyHttpServer}::plugin::Plugin<\n                            $serviceName<L>,\n                            crate::operation_shape::$structName,\n                            ModelPl::Output\n                        >,\n                        HttpPl: #{SmithyHttpServer}::plugin::Plugin<\n                            $serviceName<L>,\n                            crate::operation_shape::$structName,\n                            <\n                                #{SmithyHttpServer}::operation::UpgradePlugin::<UpgradeExtractors>\n                                as #{SmithyHttpServer}::plugin::Plugin<\n                                    $serviceName<L>,\n                                    crate::operation_shape::$structName,\n                                    ModelPl::Output\n                                >\n                            >::Output\n                        >,\n\n                        HttpPl::Output: #{Tower}::Service<#{Http}::Request<Body>, Response = #{Http}::Response<#{SmithyHttpServer}::body::BoxBody>, Error = ::std::convert::Infallible> + Clone + Send + 'static,\n                        <HttpPl::Output as #{Tower}::Service<#{Http}::Request<Body>>>::Future: Send + 'static,\n\n                    {\n                        use #{SmithyHttpServer}::operation::OperationShapeExt;\n                        use #{SmithyHttpServer}::plugin::Plugin;\n                        let svc = crate::operation_shape::$structName::from_service(service);\n                        let svc = self.model_plugin.apply(svc);\n                        let svc = #{SmithyHttpServer}::operation::UpgradePlugin::<UpgradeExtractors>::new().apply(svc);\n                        let svc = self.http_plugin.apply(svc);\n                        self.${fieldName}_custom(svc)\n                    }\n\n                    /// Sets the [`$structName`](crate::operation_shape::$structName) to a custom [`Service`](tower::Service).\n                    /// not constrained by the Smithy contract.\n                    fn ${fieldName}_custom<S>(mut self, svc: S) -> Self\n                    where\n                        S: #{Tower}::Service<#{Http}::Request<Body>, Response = #{Http}::Response<#{SmithyHttpServer}::body::BoxBody>, Error = ::std::convert::Infallible> + Clone + Send + 'static,\n                        S::Future: Send + 'static,\n                    {\n                        self.$fieldName = Some(#{SmithyHttpServer}::routing::Route::new(svc));\n                        self\n                    }\n                    \"\"\",\n                    \"Router\" to protocol.routerType(),\n                    \"Protocol\" to protocol.markerStruct(),\n                    \"Handler\" to handler,\n                    \"HandlerFixed\" to handlerFixed,\n                    \"HandlerImports\" to handlerImports(crateName, operations),\n                    *codegenScope,\n                )\n\n                // Adds newline between setters.\n                rust(\"\")\n            }\n        }\n\n    private fun buildMethod(): Writable =\n        writable {\n            val missingOperationsVariableName = \"missing_operation_names\"\n            val expectMessageVariableName = \"unexpected_error_msg\"\n\n            val nullabilityChecks =\n                writable {\n                    for (operationShape in operations) {\n                        val fieldName = builderFieldNames[operationShape]!!\n                        val operationZstTypeName = operationStructNames[operationShape]!!\n                        rust(\n                            \"\"\"\n                            if self.$fieldName.is_none() {\n                                $missingOperationsVariableName.insert(crate::operation_shape::$operationZstTypeName::ID, \".$fieldName()\");\n                            }\n                            \"\"\",\n                        )\n                    }\n                }\n            val routesArrayElements =\n                writable {\n                    for (operationShape in operations) {\n                        val fieldName = builderFieldNames[operationShape]!!\n                        val (specBuilderFunctionName, _) = requestSpecMap.getValue(operationShape)\n                        rust(\n                            \"\"\"\n                            ($requestSpecsModuleName::$specBuilderFunctionName(), self.$fieldName.expect($expectMessageVariableName)),\n                            \"\"\",\n                        )\n                    }\n                }\n\n            rustTemplate(\n                \"\"\"\n                /// Constructs a [`$serviceName`] from the arguments provided to the builder.\n                ///\n                /// Forgetting to register a handler for one or more operations will result in an error.\n                ///\n                /// Check out [`$builderName::build_unchecked`] if you'd prefer the service to return status code 500 when an\n                /// unspecified route is requested.\n                pub fn build(self) -> #{Result}<\n                    $serviceName<\n                        #{SmithyHttpServer}::routing::RoutingService<\n                            #{Router}<L::Service>,\n                            #{Protocol},\n                        >,\n                    >,\n                    MissingOperationsError,\n                >\n                where\n                    L: #{Tower}::Layer<#{SmithyHttpServer}::routing::Route<Body>>,\n                {\n                    let router = {\n                        use #{SmithyHttpServer}::operation::OperationShape;\n                        let mut $missingOperationsVariableName = std::collections::HashMap::new();\n                        #{NullabilityChecks:W}\n                        if !$missingOperationsVariableName.is_empty() {\n                            return Err(MissingOperationsError {\n                                operation_names2setter_methods: $missingOperationsVariableName,\n                            });\n                        }\n                        let $expectMessageVariableName = \"this should never panic since we are supposed to check beforehand that a handler has been registered for this operation; please file a bug report under https://github.com/smithy-lang/smithy-rs/issues\";\n\n                        #{PatternInitializations:W}\n\n                        #{Router}::from_iter([#{RoutesArrayElements:W}])\n                    };\n                    let svc = #{SmithyHttpServer}::routing::RoutingService::new(router);\n                    let svc = svc.map(|s| s.layer(self.layer));\n                    Ok($serviceName { svc })\n                }\n                \"\"\",\n                *codegenScope,\n                \"Protocol\" to protocol.markerStruct(),\n                \"Router\" to protocol.routerType(),\n                \"NullabilityChecks\" to nullabilityChecks,\n                \"RoutesArrayElements\" to routesArrayElements,\n                \"PatternInitializations\" to patternInitializations(),\n                *RuntimeType.preludeScope,\n            )\n        }\n\n    /**\n     * Renders `PatternString::compile_regex()` function calls for every\n     * `@pattern`-constrained string shape in the service closure.\n     */\n    @Suppress(\"DEPRECATION\")\n    private fun patternInitializations(): Writable {\n        val patterns =\n            Walker(model).walkShapes(service)\n                .filter { shape -> shape is StringShape && shape.hasTrait<PatternTrait>() && !shape.hasTrait<software.amazon.smithy.model.traits.EnumTrait>() }\n                .map { shape -> codegenContext.constrainedShapeSymbolProvider.toSymbol(shape) }\n                .map { symbol ->\n                    writable {\n                        rustTemplate(\"#{Type}::compile_regex();\", \"Type\" to symbol)\n                    }\n                }\n\n        patterns.letIf(patterns.isNotEmpty()) {\n            val docs = listOf(writable { rust(\"// Eagerly initialize regexes for `@pattern` strings.\") })\n\n            docs + patterns\n        }\n\n        return patterns.join(\"\")\n    }\n\n    private fun buildUncheckedMethod(): Writable =\n        writable {\n            val pairs =\n                writable {\n                    for (operationShape in operations) {\n                        val fieldName = builderFieldNames[operationShape]!!\n                        val (specBuilderFunctionName, _) = requestSpecMap.getValue(operationShape)\n                        rustTemplate(\n                            \"\"\"\n                            (\n                                $requestSpecsModuleName::$specBuilderFunctionName(),\n                                self.$fieldName.unwrap_or_else(|| {\n                                    let svc = #{SmithyHttpServer}::operation::MissingFailure::<#{Protocol}>::default();\n                                    #{SmithyHttpServer}::routing::Route::new(svc)\n                                })\n                            ),\n                            \"\"\",\n                            \"SmithyHttpServer\" to smithyHttpServer,\n                            \"Protocol\" to protocol.markerStruct(),\n                        )\n                    }\n                }\n            rustTemplate(\n                \"\"\"\n                /// Constructs a [`$serviceName`] from the arguments provided to the builder.\n                /// Operations without a handler default to returning 500 Internal Server Error to the caller.\n                ///\n                /// Check out [`$builderName::build`] if you'd prefer the builder to fail if one or more operations do\n                /// not have a registered handler.\n                pub fn build_unchecked(self) -> $serviceName<L::Service>\n                where\n                    Body: Send + 'static,\n                    L: #{Tower}::Layer<\n                        #{SmithyHttpServer}::routing::RoutingService<#{Router}<#{SmithyHttpServer}::routing::Route<Body>>, #{Protocol}>\n                    >\n                {\n                    let router = #{Router}::from_iter([#{Pairs:W}]);\n                    let svc = self\n                        .layer\n                        .layer(#{SmithyHttpServer}::routing::RoutingService::new(router));\n                    $serviceName { svc }\n                }\n                \"\"\",\n                *codegenScope,\n                \"Protocol\" to protocol.markerStruct(),\n                \"Router\" to protocol.routerType(),\n                \"Pairs\" to pairs,\n            )\n        }\n\n    /** Returns a `Writable` containing the builder struct definition and its implementations. */\n    private fun builder(): Writable =\n        writable {\n            val builderGenerics = listOf(\"Body\", \"L\", \"HttpPl\", \"ModelPl\").joinToString(\", \")\n            rustTemplate(\n                \"\"\"\n                /// The service builder for [`$serviceName`].\n                ///\n                /// Constructed via [`$serviceName::builder`].\n                pub struct $builderName<$builderGenerics> {\n                    ${builderFields.joinToString(\", \")},\n                    layer: L,\n                    http_plugin: HttpPl,\n                    model_plugin: ModelPl\n                }\n\n                impl<$builderGenerics> $builderName<$builderGenerics> {\n                    #{Setters:W}\n                }\n\n                impl<$builderGenerics> $builderName<$builderGenerics> {\n                    #{BuildMethod:W}\n\n                    #{BuildUncheckedMethod:W}\n                }\n                \"\"\",\n                \"Setters\" to builderSetters(),\n                \"BuildMethod\" to buildMethod(),\n                \"BuildUncheckedMethod\" to buildUncheckedMethod(),\n                *codegenScope,\n            )\n        }\n\n    private fun requestSpecsModule(): Writable =\n        writable {\n            val functions =\n                writable {\n                    for ((_, function) in requestSpecMap.values) {\n                        rustTemplate(\n                            \"\"\"\n                            pub(super) #{Function:W}\n                            \"\"\",\n                            \"Function\" to function,\n                        )\n                    }\n                }\n            rustTemplate(\n                \"\"\"\n                mod $requestSpecsModuleName {\n                    #{SpecFunctions:W}\n                }\n                \"\"\",\n                \"SpecFunctions\" to functions,\n            )\n        }\n\n    /** Returns a `Writable` comma delimited sequence of `builder_field: None`. */\n    private fun notSetFields(): Writable =\n        builderFieldNames.values.map {\n            writable {\n                rustTemplate(\n                    \"$it: None\",\n                    *codegenScope,\n                )\n            }\n        }.join(\", \")\n\n    /** Returns a `Writable` containing the service struct definition and its implementations. */\n    private fun serviceStruct(): Writable =\n        writable {\n            documentShape(service, model)\n\n            rustTemplate(\n                \"\"\"\n                ///\n                /// See the [root](crate) documentation for more information.\n                ##[derive(Clone)]\n                pub struct $serviceName<\n                    S = #{SmithyHttpServer}::routing::RoutingService<\n                        #{Router}<\n                            #{SmithyHttpServer}::routing::Route<\n                                #{SmithyHttpServer}::body::BoxBody\n                            >,\n                        >,\n                        #{Protocol},\n                    >\n                > {\n                    // This is the router wrapped by layers.\n                    svc: S,\n                }\n\n                impl $serviceName<()> {\n                    /// Constructs a builder for [`$serviceName`].\n                    /// You must specify a configuration object holding any plugins and layers that should be applied\n                    /// to the operations in this service.\n                    pub fn builder<\n                        Body,\n                        L,\n                        HttpPl: #{SmithyHttpServer}::plugin::HttpMarker,\n                        ModelPl: #{SmithyHttpServer}::plugin::ModelMarker,\n                    >(\n                        config: ${serviceName}Config<L, HttpPl, ModelPl>,\n                    ) -> $builderName<Body, L, HttpPl, ModelPl> {\n                        $builderName {\n                            #{NotSetFields1:W},\n                            layer: config.layers,\n                            http_plugin: config.http_plugins,\n                            model_plugin: config.model_plugins,\n                        }\n                    }\n\n                    /// Constructs a builder for [`$serviceName`].\n                    /// You must specify what plugins should be applied to the operations in this service.\n                    ///\n                    /// Use [`$serviceName::builder_without_plugins`] if you don't need to apply plugins.\n                    ///\n                    /// Check out [`HttpPlugins`](#{SmithyHttpServer}::plugin::HttpPlugins) and\n                    /// [`ModelPlugins`](#{SmithyHttpServer}::plugin::ModelPlugins) if you need to apply\n                    /// multiple plugins.\n                    ##[deprecated(\n                        since = \"0.57.0\",\n                        note = \"please use the `builder` constructor and register plugins on the `${serviceName}Config` object instead; see https://github.com/smithy-lang/smithy-rs/discussions/3096\"\n                    )]\n                    pub fn builder_with_plugins<\n                        Body,\n                        HttpPl: #{SmithyHttpServer}::plugin::HttpMarker,\n                        ModelPl: #{SmithyHttpServer}::plugin::ModelMarker\n                    >(\n                        http_plugin: HttpPl,\n                        model_plugin: ModelPl\n                    ) -> $builderName<Body, #{Tower}::layer::util::Identity, HttpPl, ModelPl> {\n                        $builderName {\n                            #{NotSetFields2:W},\n                            layer: #{Tower}::layer::util::Identity::new(),\n                            http_plugin,\n                            model_plugin\n                        }\n                    }\n\n                    /// Constructs a builder for [`$serviceName`].\n                    ///\n                    /// Use [`$serviceName::builder_with_plugins`] if you need to specify plugins.\n                    ##[deprecated(\n                        since = \"0.57.0\",\n                        note = \"please use the `builder` constructor instead; see https://github.com/smithy-lang/smithy-rs/discussions/3096\"\n                    )]\n                    pub fn builder_without_plugins<Body>() -> $builderName<\n                        Body,\n                        #{Tower}::layer::util::Identity,\n                        #{SmithyHttpServer}::plugin::IdentityPlugin,\n                        #{SmithyHttpServer}::plugin::IdentityPlugin\n                    > {\n                        Self::builder_with_plugins(#{SmithyHttpServer}::plugin::IdentityPlugin, #{SmithyHttpServer}::plugin::IdentityPlugin)\n                    }\n                }\n\n                impl<S> $serviceName<S> {\n                    /// Converts [`$serviceName`] into a [`MakeService`](tower::make::MakeService).\n                    pub fn into_make_service(self) -> #{SmithyHttpServer}::routing::IntoMakeService<Self> {\n                        #{SmithyHttpServer}::routing::IntoMakeService::new(self)\n                    }\n\n\n                    /// Converts [`$serviceName`] into a [`MakeService`](tower::make::MakeService) with [`ConnectInfo`](#{SmithyHttpServer}::request::connect_info::ConnectInfo).\n                    pub fn into_make_service_with_connect_info<C>(self) -> #{SmithyHttpServer}::routing::IntoMakeServiceWithConnectInfo<Self, C> {\n                        #{SmithyHttpServer}::routing::IntoMakeServiceWithConnectInfo::new(self)\n                    }\n                }\n\n                impl<S>\n                    $serviceName<\n                        #{SmithyHttpServer}::routing::RoutingService<\n                            #{Router}<S>,\n                            #{Protocol},\n                        >,\n                    >\n                {\n                    /// Applies a [`Layer`](#{Tower}::Layer) uniformly to all routes.\n                    ##[deprecated(\n                        since = \"0.57.0\",\n                        note = \"please add layers to the `${serviceName}Config` object instead; see https://github.com/smithy-lang/smithy-rs/discussions/3096\"\n                    )]\n                    pub fn layer<L>(\n                        self,\n                        layer: &L,\n                    ) -> $serviceName<\n                        #{SmithyHttpServer}::routing::RoutingService<\n                            #{Router}<L::Service>,\n                            #{Protocol},\n                        >,\n                    >\n                    where\n                        L: #{Tower}::Layer<S>,\n                    {\n                        $serviceName {\n                            svc: self.svc.map(|s| s.layer(layer)),\n                        }\n                    }\n\n                    /// Applies [`Route::new`](#{SmithyHttpServer}::routing::Route::new) to all routes.\n                    ///\n                    /// This has the effect of erasing all types accumulated via layers.\n                    pub fn boxed<B>(\n                        self,\n                    ) -> $serviceName<\n                        #{SmithyHttpServer}::routing::RoutingService<\n                            #{Router}<\n                                #{SmithyHttpServer}::routing::Route<B>,\n                            >,\n                            #{Protocol},\n                        >,\n                    >\n                    where\n                        S: #{Tower}::Service<\n                            #{Http}::Request<B>,\n                            Response = #{Http}::Response<#{SmithyHttpServer}::body::BoxBody>,\n                            Error = std::convert::Infallible,\n                        >,\n                        S: Clone + Send + 'static,\n                        S::Future: Send + 'static,\n                    {\n                        self.layer(&::tower::layer::layer_fn(\n                            #{SmithyHttpServer}::routing::Route::new,\n                        ))\n                    }\n                }\n\n                impl<S, R> #{Tower}::Service<R> for $serviceName<S>\n                where\n                    S: #{Tower}::Service<R>,\n                {\n                    type Response = S::Response;\n                    type Error = S::Error;\n                    type Future = S::Future;\n\n                    fn poll_ready(&mut self, cx: &mut std::task::Context) -> std::task::Poll<#{Result}<(), Self::Error>> {\n                        self.svc.poll_ready(cx)\n                    }\n\n                    fn call(&mut self, request: R) -> Self::Future {\n                        self.svc.call(request)\n                    }\n                }\n                \"\"\",\n                \"NotSetFields1\" to notSetFields(),\n                \"NotSetFields2\" to notSetFields(),\n                \"Router\" to protocol.routerType(),\n                \"Protocol\" to protocol.markerStruct(),\n                *codegenScope,\n            )\n        }\n\n    private fun missingOperationsError(): Writable =\n        writable {\n            rustTemplate(\n                \"\"\"\n                /// The error encountered when calling the [`$builderName::build`] method if one or more operation handlers are not\n                /// specified.\n                ##[derive(Debug)]\n                pub struct MissingOperationsError {\n                    operation_names2setter_methods: std::collections::HashMap<#{SmithyHttpServer}::shape_id::ShapeId, &'static str>,\n                }\n\n                impl std::fmt::Display for MissingOperationsError {\n                    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n                        write!(\n                            f,\n                            \"You must specify a handler for all operations attached to `$serviceName`.\\n\\\n                            We are missing handlers for the following operations:\\n\",\n                        )?;\n                        for operation_name in self.operation_names2setter_methods.keys() {\n                            writeln!(f, \"- {}\", operation_name.absolute())?;\n                        }\n\n                        writeln!(f, \"\\nUse the dedicated methods on `$builderName` to register the missing handlers:\")?;\n                        for setter_name in self.operation_names2setter_methods.values() {\n                            writeln!(f, \"- {}\", setter_name)?;\n                        }\n                        Ok(())\n                    }\n                }\n\n                impl std::error::Error for MissingOperationsError {}\n                \"\"\",\n                *codegenScope,\n            )\n        }\n\n    private fun serviceShapeImpl(): Writable =\n        writable {\n            val namespace = serviceId.namespace\n            val name = serviceId.name\n            val absolute = serviceId.toString().replace(\"#\", \"##\")\n            val version = codegenContext.serviceShape.version?.let { \"Some(\\\"$it\\\")\" } ?: \"None\"\n            rustTemplate(\n                \"\"\"\n                impl<S> #{SmithyHttpServer}::service::ServiceShape for $serviceName<S> {\n                    const ID: #{SmithyHttpServer}::shape_id::ShapeId = #{SmithyHttpServer}::shape_id::ShapeId::new(\"$absolute\", \"$namespace\", \"$name\");\n\n                    const VERSION: Option<&'static str> = $version;\n\n                    type Protocol = #{Protocol};\n\n                    type Operations = Operation;\n                }\n                \"\"\",\n                \"Protocol\" to protocol.markerStruct(),\n                *codegenScope,\n            )\n        }\n\n    private fun operationEnum(): Writable =\n        writable {\n            val operations = operationStructNames.values.joinToString(\",\")\n            val matchArms: Writable =\n                operationStructNames.map {\n                        (shape, name) ->\n                    writable {\n                        val absolute = shape.id.toString().replace(\"#\", \"##\")\n                        rustTemplate(\n                            \"\"\"\n                            Operation::$name => #{SmithyHttpServer}::shape_id::ShapeId::new(\"$absolute\", \"${shape.id.namespace}\", \"${shape.id.name}\")\n                            \"\"\",\n                            *codegenScope,\n                        )\n                    }\n                }.join(\",\")\n            rustTemplate(\n                \"\"\"\n                /// An enumeration of all [operations](https://smithy.io/2.0/spec/service-types.html##operation) in $serviceName.\n                ##[allow(clippy::enum_variant_names)]\n                ##[derive(Debug, PartialEq, Eq, Clone, Copy)]\n                pub enum Operation {\n                    $operations\n                }\n\n                impl Operation {\n                    /// Returns the [operations](https://smithy.io/2.0/spec/service-types.html##operation) [`ShapeId`](#{SmithyHttpServer}::shape_id::ShapeId).\n                    pub fn shape_id(&self) -> #{SmithyHttpServer}::shape_id::ShapeId {\n                        match self {\n                            #{Arms}\n                        }\n                    }\n                }\n                \"\"\",\n                *codegenScope,\n                \"Arms\" to matchArms,\n            )\n\n            for ((_, value) in operationStructNames) {\n                rustTemplate(\n                    \"\"\"\n                    impl<L> #{SmithyHttpServer}::service::ContainsOperation<crate::operation_shape::$value>\n                        for $serviceName<L>\n                    {\n                        const VALUE: Operation = Operation::$value;\n                    }\n                    \"\"\",\n                    *codegenScope,\n                )\n            }\n        }\n\n    fun render(writer: RustWriter) {\n        writer.rustTemplate(\n            \"\"\"\n            #{Builder:W}\n\n            #{MissingOperationsError:W}\n\n            #{RequestSpecs:W}\n\n            #{Struct:W}\n\n            #{Operations}\n\n            #{ServiceImpl}\n            \"\"\",\n            \"Builder\" to builder(),\n            \"MissingOperationsError\" to missingOperationsError(),\n            \"RequestSpecs\" to requestSpecsModule(),\n            \"Struct\" to serviceStruct(),\n            \"Operations\" to operationEnum(),\n            \"ServiceImpl\" to serviceShapeImpl(),\n            *codegenScope,\n        )\n    }\n}\n\n/**\n * Returns a writable to import the necessary modules used by a handler implementation stub.\n *\n * ```rust\n * use my_service::{input, output, error};\n * ```\n */\nfun handlerImports(\n    crateName: String,\n    operations: Collection<OperationShape>,\n    commentToken: String = \"///\",\n) = writable {\n    val hasErrors = operations.any { it.errors.isNotEmpty() }\n    val errorImport = if (hasErrors) \", ${ErrorModule.name}\" else \"\"\n    if (operations.isNotEmpty()) {\n        rust(\"$commentToken use $crateName::{${InputModule.name}, ${OutputModule.name}$errorImport};\")\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerStructureConstrainedTraitImpl.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.generators\n\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider\n\nclass ServerStructureConstrainedTraitImpl(\n    private val symbolProvider: RustSymbolProvider,\n    private val publicConstrainedTypes: Boolean,\n    private val shape: StructureShape,\n    private val writer: RustWriter,\n) {\n    fun render() {\n        writer.rustTemplate(\n            \"\"\"\n            impl #{ConstrainedTrait} for #{Structure} {\n                type Unconstrained = #{Builder};\n            }\n            \"\"\",\n            \"ConstrainedTrait\" to RuntimeType.ConstrainedTrait,\n            \"Structure\" to symbolProvider.toSymbol(shape),\n            \"Builder\" to shape.serverBuilderSymbol(symbolProvider, !publicConstrainedTypes),\n        )\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServiceConfigGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.generators\n\nimport software.amazon.smithy.codegen.core.CodegenException\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.conditionalBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.docs\nimport software.amazon.smithy.rust.codegen.core.rustlang.join\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlockTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTypeParameters\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\nimport software.amazon.smithy.rust.codegen.core.util.toPascalCase\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerCargoDependency\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenContext\n\nfun List<ConfigMethod>.isBuilderFallible() = this.any { it.isRequired }\n\n/**\n * Contains all data necessary to render a method on the config builder object to apply arbitrary layers, HTTP plugins,\n * and model plugins.\n */\ndata class ConfigMethod(\n    /** The name of the method. **/\n    val name: String,\n    /** The Rust docs for the method. **/\n    val docs: String,\n    /** The parameters of the method. **/\n    val params: List<Binding>,\n    /** In case the method is fallible, the concrete error type it returns. **/\n    val errorType: RuntimeType?,\n    /** The code block inside the method. **/\n    val initializer: Initializer,\n    /** Whether the user must invoke the method or not. **/\n    val isRequired: Boolean,\n) {\n    /** The name of the flag on the config builder object that tracks whether the _required_ method has already been invoked or not. **/\n    fun requiredBuilderFlagName(): String {\n        check(isRequired) {\n            \"Config method is not required so it shouldn't need a field in the builder tracking whether it has been configured\"\n        }\n        return \"${name}_configured\"\n    }\n\n    /** The name of the enum variant on the config builder's error struct for a _required_ method. **/\n    fun requiredErrorVariant(): String {\n        check(isRequired) {\n            \"Config method is not required so it shouldn't need an error variant\"\n        }\n        return \"${name.toPascalCase()}NotConfigured\"\n    }\n}\n\n/**\n * Represents the code block inside the method that initializes and configures a set of layers, HTTP plugins, and/or model\n * plugins.\n */\ndata class Initializer(\n    /**\n     * The code itself that initializes and configures the layers, HTTP plugins, and/or model plugins. This should be\n     * a set of [Rust statements] that, after execution, defines one variable binding per layer/HTTP plugin/model plugin\n     * that it has configured and wants to apply. The code may use the method's input arguments (see [params] in\n     * [ConfigMethod]) to perform checks and initialize the bindings.\n     *\n     * For example, the following code performs checks on the `authorizer` and `auth_spec` input arguments, returning\n     * an error (see [errorType] in [ConfigMethod]) in case these checks fail, and leaves two plugins defined in two\n     * variable bindings, `authn_plugin` and `authz_plugin`.\n     *\n     * ```rust\n     * if authorizer != 69 {\n     *     return Err(std::io::Error::new(std::io::ErrorKind::Other, \"failure 1\"));\n     * }\n\n     * if auth_spec.len() != 69 {\n     *     return Err(std::io::Error::new(std::io::ErrorKind::Other, \"failure 2\"));\n     * }\n     * let authn_plugin = #{SmithyHttpServer}::plugin::IdentityPlugin;\n     * let authz_plugin = #{SmithyHttpServer}::plugin::IdentityPlugin;\n     * ```\n     *\n     * [Rust statements]: https://doc.rust-lang.org/reference/statements.html\n     */\n    val code: Writable,\n    /** Ordered list of layers that should be applied. Layers are executed in the order they appear in the list. **/\n    val layerBindings: List<Binding>,\n    /** Ordered list of HTTP plugins that should be applied. Http plugins are executed in the order they appear in the list. **/\n    val httpPluginBindings: List<Binding>,\n    /** Ordered list of model plugins that should be applied. Model plugins are executed in the order they appear in the list. **/\n    val modelPluginBindings: List<Binding>,\n)\n\n/**\n * Represents a variable binding. For example, the following Rust code:\n *\n * ```rust\n * fn foo(bar: String) {\n *     let baz: u64 = 69;\n * }\n *\n * has two variable bindings. The `bar` name is bound to a `String` variable and the `baz` name is bound to a\n * `u64` variable. Both are bindings that use concrete types. Types can also be generic:\n *\n * ```rust\n * fn foo<T>(bar: T) { }\n * ```\n */\nsealed class Binding {\n    data class Generic(\n        /** The name of the variable. The name of the type parameter will be the PascalCased variable name. */\n        val name: String,\n        /** The type of the variable. */\n        val ty: RuntimeType,\n        /**\n         * The generic type parameters contained in `ty`. For example, if `ty` renders to `Vec<T>` with `T` being a\n         * generic type parameter, then `genericTys` should be a singleton set containing `\"T\"`.\n         * You can't use `L`, `H`, or `M` as the names to refer to any generic types.\n         * */\n        val genericTys: Set<String>,\n    ) : Binding()\n\n    data class Concrete(\n        /** The name of the variable. */\n        val name: String,\n        /** The type of the variable. */\n        val ty: RuntimeType,\n    ) : Binding()\n\n    fun name() =\n        when (this) {\n            is Concrete -> this.name\n            is Generic -> this.name\n        }\n\n    fun ty() =\n        when (this) {\n            is Concrete -> this.ty\n            is Generic -> this.ty\n        }\n}\n\nclass ServiceConfigGenerator(\n    codegenContext: ServerCodegenContext,\n    private val configMethods: List<ConfigMethod>,\n) {\n    private val crateName = codegenContext.moduleUseName()\n    private val smithyHttpServer = ServerCargoDependency.smithyHttpServer(codegenContext.runtimeConfig).toType()\n    private val codegenScope =\n        arrayOf(\n            *preludeScope,\n            \"Debug\" to RuntimeType.Debug,\n            \"SmithyHttpServer\" to smithyHttpServer,\n            \"PluginStack\" to smithyHttpServer.resolve(\"plugin::PluginStack\"),\n            \"ModelMarker\" to smithyHttpServer.resolve(\"plugin::ModelMarker\"),\n            \"HttpMarker\" to smithyHttpServer.resolve(\"plugin::HttpMarker\"),\n            \"Tower\" to RuntimeType.Tower,\n            \"Stack\" to RuntimeType.Tower.resolve(\"layer::util::Stack\"),\n        )\n    private val serviceName = codegenContext.serviceShape.id.name.toPascalCase()\n\n    fun render(writer: RustWriter) {\n        val unwrapConfigBuilder =\n            if (isBuilderFallible) {\n                \"\"\"\n                ///    .expect(\"config failed to build\");\n                \"\"\"\n            } else {\n                \";\"\n            }\n\n        writer.rustTemplate(\n            \"\"\"\n            /// Configuration for the [`$serviceName`]. This is the central place where to register and\n            /// configure [`#{Tower}::Layer`]s, HTTP plugins, and model plugins.\n            ///\n            /// ```rust,no_run\n            /// ## use $crateName::${serviceName}Config;\n            /// ## use #{SmithyHttpServer}::plugin::IdentityPlugin;\n            /// ## use #{Tower}::layer::util::Identity;\n            /// ## let authentication_plugin = IdentityPlugin;\n            /// ## let authorization_plugin = IdentityPlugin;\n            /// ## let server_request_id_provider_layer = Identity::new();\n            /// let config = ${serviceName}Config::builder()\n            ///     // Layers get executed first...\n            ///     .layer(server_request_id_provider_layer)\n            ///     // ...then HTTP plugins...\n            ///     .http_plugin(authentication_plugin)\n            ///     // ...and right after deserialization, model plugins.\n            ///     .model_plugin(authorization_plugin)\n            ///     .build()$unwrapConfigBuilder\n            /// ```\n            ///\n            /// See the [`plugin`] system for details.\n            ///\n            /// [`plugin`]: #{SmithyHttpServer}::plugin\n            ##[derive(#{Debug})]\n            pub struct ${serviceName}Config<L, H, M> {\n                layers: L,\n                http_plugins: H,\n                model_plugins: M,\n            }\n\n            impl ${serviceName}Config<(), (), ()> {\n                /// Returns a builder to construct the configuration.\n                pub fn builder() -> ${serviceName}ConfigBuilder<\n                    #{Tower}::layer::util::Identity,\n                    #{SmithyHttpServer}::plugin::IdentityPlugin,\n                    #{SmithyHttpServer}::plugin::IdentityPlugin,\n                > {\n                    ${serviceName}ConfigBuilder {\n                        layers: #{Tower}::layer::util::Identity::new(),\n                        http_plugins: #{SmithyHttpServer}::plugin::IdentityPlugin,\n                        model_plugins: #{SmithyHttpServer}::plugin::IdentityPlugin,\n                        #{BuilderRequiredMethodFlagsInit:W}\n                    }\n                }\n            }\n\n            /// Builder returned by [`${serviceName}Config::builder()`].\n            ##[derive(#{Debug})]\n            pub struct ${serviceName}ConfigBuilder<L, H, M> {\n                pub(crate) layers: L,\n                pub(crate) http_plugins: H,\n                pub(crate) model_plugins: M,\n                #{BuilderRequiredMethodFlagDefinitions:W}\n            }\n\n            #{BuilderRequiredMethodError:W}\n\n            impl<L, H, M> ${serviceName}ConfigBuilder<L, H, M> {\n                #{InjectedMethods:W}\n\n                /// Add a [`#{Tower}::Layer`] to the service.\n                pub fn layer<NewLayer>(self, layer: NewLayer) -> ${serviceName}ConfigBuilder<#{Stack}<NewLayer, L>, H, M> {\n                    ${serviceName}ConfigBuilder {\n                        layers: #{Stack}::new(layer, self.layers),\n                        http_plugins: self.http_plugins,\n                        model_plugins: self.model_plugins,\n                        #{BuilderRequiredMethodFlagsMove1:W}\n                    }\n                }\n\n                /// Add a HTTP [plugin] to the service.\n                ///\n                /// [plugin]: #{SmithyHttpServer}::plugin\n                // We eagerly require `NewPlugin: HttpMarker`, despite not really needing it, because compiler\n                // errors get _substantially_ better if the user makes a mistake.\n                pub fn http_plugin<NewPlugin: #{HttpMarker}>(\n                    self,\n                    http_plugin: NewPlugin,\n                ) -> ${serviceName}ConfigBuilder<L, #{PluginStack}<NewPlugin, H>, M> {\n                    ${serviceName}ConfigBuilder {\n                        layers: self.layers,\n                        http_plugins: #{PluginStack}::new(http_plugin, self.http_plugins),\n                        model_plugins: self.model_plugins,\n                        #{BuilderRequiredMethodFlagsMove2:W}\n                    }\n                }\n\n                /// Add a model [plugin] to the service.\n                ///\n                /// [plugin]: #{SmithyHttpServer}::plugin\n                // We eagerly require `NewPlugin: ModelMarker`, despite not really needing it, because compiler\n                // errors get _substantially_ better if the user makes a mistake.\n                pub fn model_plugin<NewPlugin: #{ModelMarker}>(\n                    self,\n                    model_plugin: NewPlugin,\n                ) -> ${serviceName}ConfigBuilder<L, H, #{PluginStack}<NewPlugin, M>> {\n                    ${serviceName}ConfigBuilder {\n                        layers: self.layers,\n                        http_plugins: self.http_plugins,\n                        model_plugins: #{PluginStack}::new(model_plugin, self.model_plugins),\n                        #{BuilderRequiredMethodFlagsMove3:W}\n                    }\n                }\n\n                #{BuilderBuildMethod:W}\n            }\n            \"\"\",\n            *codegenScope,\n            \"BuilderRequiredMethodFlagsInit\" to builderRequiredMethodFlagsInit(),\n            \"BuilderRequiredMethodFlagDefinitions\" to builderRequiredMethodFlagsDefinitions(),\n            \"BuilderRequiredMethodError\" to builderRequiredMethodError(),\n            \"InjectedMethods\" to injectedMethods(),\n            \"BuilderRequiredMethodFlagsMove1\" to builderRequiredMethodFlagsMove(),\n            \"BuilderRequiredMethodFlagsMove2\" to builderRequiredMethodFlagsMove(),\n            \"BuilderRequiredMethodFlagsMove3\" to builderRequiredMethodFlagsMove(),\n            \"BuilderBuildMethod\" to builderBuildMethod(),\n        )\n    }\n\n    private val isBuilderFallible = configMethods.isBuilderFallible()\n\n    private fun builderBuildRequiredMethodChecks() =\n        configMethods.filter { it.isRequired }.map {\n            writable {\n                rustTemplate(\n                    \"\"\"\n                    if !self.${it.requiredBuilderFlagName()} {\n                        return #{Err}(${serviceName}ConfigError::${it.requiredErrorVariant()});\n                    }\n                    \"\"\",\n                    *codegenScope,\n                )\n            }\n        }.join(\"\\n\")\n\n    private fun builderRequiredMethodFlagsDefinitions() =\n        configMethods.filter { it.isRequired }.map {\n            writable { rust(\"pub(crate) ${it.requiredBuilderFlagName()}: bool,\") }\n        }.join(\"\\n\")\n\n    private fun builderRequiredMethodFlagsInit() =\n        configMethods.filter { it.isRequired }.map {\n            writable { rust(\"${it.requiredBuilderFlagName()}: false,\") }\n        }.join(\"\\n\")\n\n    private fun builderRequiredMethodFlagsMove() =\n        configMethods.filter { it.isRequired }.map {\n            writable { rust(\"${it.requiredBuilderFlagName()}: self.${it.requiredBuilderFlagName()},\") }\n        }.join(\"\\n\")\n\n    private fun builderRequiredMethodError() =\n        writable {\n            if (isBuilderFallible) {\n                val variants =\n                    configMethods.filter { it.isRequired }.map {\n                        writable {\n                            rust(\n                                \"\"\"\n                                ##[error(\"service is not fully configured; invoke `${it.name}` on the config builder\")]\n                                ${it.requiredErrorVariant()},\n                                \"\"\",\n                            )\n                        }\n                    }\n                rustTemplate(\n                    \"\"\"\n                    ##[derive(Debug, #{ThisError}::Error)]\n                    pub enum ${serviceName}ConfigError {\n                        #{Variants:W}\n                    }\n                    \"\"\",\n                    \"ThisError\" to ServerCargoDependency.ThisError.toType(),\n                    \"Variants\" to variants.join(\"\\n\"),\n                )\n            }\n        }\n\n    private fun injectedMethods() =\n        configMethods.map {\n            writable {\n                val paramBindings =\n                    it.params.map { binding ->\n                        writable { rustTemplate(\"${binding.name()}: #{BindingTy},\", \"BindingTy\" to binding.ty()) }\n                    }.join(\"\\n\")\n                val genericBindings = it.params.filterIsInstance<Binding.Generic>()\n                val lhmBindings =\n                    genericBindings.filter {\n                        it.genericTys.contains(\"L\") || it.genericTys.contains(\"H\") || it.genericTys.contains(\"M\")\n                    }\n                if (lhmBindings.isNotEmpty()) {\n                    throw CodegenException(\n                        \"Injected config method `${it.name}` has generic bindings that use `L`, `H`, or `M` to refer to the generic types. This is not allowed. Invalid generic bindings: $lhmBindings\",\n                    )\n                }\n                val paramBindingsGenericTys = genericBindings.flatMap { it.genericTys }.toSet()\n                val paramBindingsGenericsWritable = rustTypeParameters(*paramBindingsGenericTys.toTypedArray())\n\n                // This produces a nested type like: \"S<B, S<A, T>>\", where\n                // - \"S\" denotes a \"stack type\" with two generic type parameters: the first is the \"inner\" part of the stack\n                //   and the second is the \"outer\" part  of the stack. The outer part gets executed first. For an example,\n                //   see `aws_smithy_http_server::plugin::PluginStack`.\n                // - \"A\", \"B\" are the types of the \"things\" that are added.\n                // - \"T\" is the generic type variable name used in the enclosing impl block.\n                fun List<Binding>.stackReturnType(\n                    genericTypeVarName: String,\n                    stackType: RuntimeType,\n                ): Writable =\n                    this.fold(writable { rust(genericTypeVarName) }) { acc, next ->\n                        writable {\n                            rustTemplate(\n                                \"#{StackType}<#{Ty}, #{Acc:W}>\",\n                                \"StackType\" to stackType,\n                                \"Ty\" to next.ty(),\n                                \"Acc\" to acc,\n                            )\n                        }\n                    }\n\n                val layersReturnTy =\n                    it.initializer.layerBindings.stackReturnType(\"L\", RuntimeType.Tower.resolve(\"layer::util::Stack\"))\n                val httpPluginsReturnTy =\n                    it.initializer.httpPluginBindings.stackReturnType(\"H\", smithyHttpServer.resolve(\"plugin::PluginStack\"))\n                val modelPluginsReturnTy =\n                    it.initializer.modelPluginBindings.stackReturnType(\"M\", smithyHttpServer.resolve(\"plugin::PluginStack\"))\n\n                val configBuilderReturnTy =\n                    writable {\n                        rustTemplate(\n                            \"\"\"\n                            ${serviceName}ConfigBuilder<\n                                #{LayersReturnTy:W},\n                                #{HttpPluginsReturnTy:W},\n                                #{ModelPluginsReturnTy:W},\n                            >\n                            \"\"\",\n                            \"LayersReturnTy\" to layersReturnTy,\n                            \"HttpPluginsReturnTy\" to httpPluginsReturnTy,\n                            \"ModelPluginsReturnTy\" to modelPluginsReturnTy,\n                        )\n                    }\n\n                val returnTy =\n                    if (it.errorType != null) {\n                        writable {\n                            rustTemplate(\n                                \"#{Result}<#{T:W}, #{E}>\",\n                                \"T\" to configBuilderReturnTy,\n                                \"E\" to it.errorType,\n                                *codegenScope,\n                            )\n                        }\n                    } else {\n                        configBuilderReturnTy\n                    }\n\n                docs(it.docs)\n                rustBlockTemplate(\n                    \"\"\"\n                    pub fn ${it.name}#{ParamBindingsGenericsWritable}(\n                        ##[allow(unused_mut)]\n                        mut self,\n                        #{ParamBindings:W}\n                    ) -> #{ReturnTy:W}\n                    \"\"\",\n                    \"ReturnTy\" to returnTy,\n                    \"ParamBindings\" to paramBindings,\n                    \"ParamBindingsGenericsWritable\" to paramBindingsGenericsWritable,\n                ) {\n                    rustTemplate(\"#{InitializerCode:W}\", \"InitializerCode\" to it.initializer.code)\n\n                    check(it.initializer.layerBindings.size + it.initializer.httpPluginBindings.size + it.initializer.modelPluginBindings.size > 0) {\n                        \"This method's initializer does not register any layers, HTTP plugins, or model plugins. It must register at least something!\"\n                    }\n\n                    if (it.isRequired) {\n                        rust(\"self.${it.requiredBuilderFlagName()} = true;\")\n                    }\n                    conditionalBlock(\"Ok(\", \")\", conditional = it.errorType != null) {\n                        val registrations =\n                            (\n                                it.initializer.layerBindings.map { \".layer(${it.name()})\" } +\n                                    it.initializer.httpPluginBindings.map { \".http_plugin(${it.name()})\" } +\n                                    it.initializer.modelPluginBindings.map { \".model_plugin(${it.name()})\" }\n                            ).joinToString(\"\")\n                        rust(\"self$registrations\")\n                    }\n                }\n            }\n        }.join(\"\\n\\n\")\n\n    private fun builderBuildReturnType() =\n        writable {\n            val t = \"super::${serviceName}Config<L, H, M>\"\n\n            if (isBuilderFallible) {\n                rustTemplate(\"#{Result}<$t, ${serviceName}ConfigError>\", *codegenScope)\n            } else {\n                rust(t)\n            }\n        }\n\n    private fun builderBuildMethod() =\n        writable {\n            rustBlockTemplate(\n                \"\"\"\n                /// Build the configuration.\n                pub fn build(self) -> #{BuilderBuildReturnTy:W}\n                \"\"\",\n                \"BuilderBuildReturnTy\" to builderBuildReturnType(),\n            ) {\n                rustTemplate(\n                    \"#{BuilderBuildRequiredMethodChecks:W}\",\n                    \"BuilderBuildRequiredMethodChecks\" to builderBuildRequiredMethodChecks(),\n                )\n\n                conditionalBlock(\"Ok(\", \")\", isBuilderFallible) {\n                    rust(\n                        \"\"\"\n                        super::${serviceName}Config {\n                            layers: self.layers,\n                            http_plugins: self.http_plugins,\n                            model_plugins: self.model_plugins,\n                        }\n                        \"\"\",\n                    )\n                }\n            }\n        }\n}\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/TraitInfo.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.generators\n\nimport software.amazon.smithy.codegen.core.Symbol\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.join\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\n\n/**\n * Information needed to render a constraint trait as Rust code.\n */\ndata class TraitInfo(\n    val tryFromCheck: Writable,\n    val constraintViolationVariant: Writable,\n    val asValidationExceptionField: Writable,\n    val validationFunctionDefinition: (constraintViolation: Symbol, unconstrainedTypeName: String) -> Writable,\n    private val testCases: List<Writable> = listOf(),\n) {\n    companion object {\n        fun testCases(constraintsInfo: List<TraitInfo>): List<Writable> {\n            return constraintsInfo.flatMap { it.testCases }\n        }\n    }\n}\n\n/**\n * Render the implementation of `TryFrom` for a constrained type.\n */\nfun RustWriter.renderTryFrom(\n    unconstrainedTypeName: String,\n    constrainedTypeName: String,\n    constraintViolationError: Symbol,\n    constraintsInfo: List<TraitInfo>,\n) {\n    this.rustTemplate(\n        \"\"\"\n        impl $constrainedTypeName {\n            #{ValidationFunctions:W}\n        }\n        \"\"\",\n        \"ValidationFunctions\" to\n            constraintsInfo.map {\n                it.validationFunctionDefinition(\n                    constraintViolationError,\n                    unconstrainedTypeName,\n                )\n            }\n                .join(\"\\n\"),\n    )\n\n    this.rustTemplate(\n        \"\"\"\n        impl #{TryFrom}<$unconstrainedTypeName> for $constrainedTypeName {\n            type Error = #{ConstraintViolation};\n\n            /// ${rustDocsTryFromMethod(constrainedTypeName, unconstrainedTypeName)}\n            fn try_from(value: $unconstrainedTypeName) -> #{Result}<Self, Self::Error> {\n              #{TryFromChecks:W}\n\n              Ok(Self(value))\n            }\n        }\n        \"\"\",\n        \"TryFrom\" to RuntimeType.TryFrom,\n        \"ConstraintViolation\" to constraintViolationError,\n        \"TryFromChecks\" to constraintsInfo.map { it.tryFromCheck }.join(\"\\n\"),\n        *RuntimeType.preludeScope,\n    )\n}\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/UnconstrainedCollectionGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.generators\n\nimport software.amazon.smithy.model.shapes.CollectionShape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.shapes.UnionShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustType\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.conditionalBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.isOptional\nimport software.amazon.smithy.rust.codegen.core.smithy.makeMaybeConstrained\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\nimport software.amazon.smithy.rust.codegen.server.smithy.InlineModuleCreator\nimport software.amazon.smithy.rust.codegen.server.smithy.PubCrateConstraintViolationSymbolProvider\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenContext\nimport software.amazon.smithy.rust.codegen.server.smithy.UnconstrainedShapeSymbolProvider\nimport software.amazon.smithy.rust.codegen.server.smithy.canReachConstrainedShape\nimport software.amazon.smithy.rust.codegen.server.smithy.isDirectlyConstrained\nimport software.amazon.smithy.rust.codegen.server.smithy.traits.ConstraintViolationRustBoxTrait\n\n/**\n * Generates a Rust type for a constrained collection shape that is able to hold values for the corresponding\n * _unconstrained_ shape. This type is a [RustType.Opaque] wrapper tuple newtype holding a `Vec`. Upon request parsing,\n * server deserializers use this type to store the incoming values without enforcing the modeled constraints. Only after\n * the full request has been parsed are constraints enforced, via the `impl TryFrom<UnconstrainedSymbol> for\n * ConstrainedSymbol`.\n *\n * This type is never exposed to the user; it is always `pub(crate)`. Only the deserializers use it.\n *\n * Consult [UnconstrainedShapeSymbolProvider] for more details and for an example.\n */\nclass UnconstrainedCollectionGenerator(\n    val codegenContext: ServerCodegenContext,\n    private val inlineModuleCreator: InlineModuleCreator,\n    val shape: CollectionShape,\n) {\n    private val model = codegenContext.model\n    private val symbolProvider = codegenContext.symbolProvider\n    private val unconstrainedShapeSymbolProvider = codegenContext.unconstrainedShapeSymbolProvider\n    private val pubCrateConstrainedShapeSymbolProvider = codegenContext.pubCrateConstrainedShapeSymbolProvider\n    private val symbol = unconstrainedShapeSymbolProvider.toSymbol(shape)\n    private val name = symbol.name\n    private val publicConstrainedTypes = codegenContext.settings.codegenConfig.publicConstrainedTypes\n    private val constraintViolationSymbolProvider =\n        with(codegenContext.constraintViolationSymbolProvider) {\n            if (publicConstrainedTypes) {\n                this\n            } else {\n                PubCrateConstraintViolationSymbolProvider(this)\n            }\n        }\n    private val constraintViolationSymbol = constraintViolationSymbolProvider.toSymbol(shape)\n    private val constrainedShapeSymbolProvider = codegenContext.constrainedShapeSymbolProvider\n    private val constrainedSymbol =\n        if (shape.isDirectlyConstrained(symbolProvider)) {\n            constrainedShapeSymbolProvider.toSymbol(shape)\n        } else {\n            pubCrateConstrainedShapeSymbolProvider.toSymbol(shape)\n        }\n    private val innerShape = model.expectShape(shape.member.target)\n\n    fun render() {\n        check(shape.canReachConstrainedShape(model, symbolProvider))\n\n        val innerMemberSymbol = unconstrainedShapeSymbolProvider.toSymbol(shape.member)\n\n        inlineModuleCreator(symbol) {\n            rustTemplate(\n                \"\"\"\n                ##[derive(Debug, Clone)]\n                pub(crate) struct $name(pub(crate) std::vec::Vec<#{InnerMemberSymbol}>);\n\n                impl From<$name> for #{MaybeConstrained} {\n                    fn from(value: $name) -> Self {\n                        Self::Unconstrained(value)\n                    }\n                }\n                \"\"\",\n                \"InnerMemberSymbol\" to innerMemberSymbol,\n                \"MaybeConstrained\" to constrainedSymbol.makeMaybeConstrained(),\n            )\n\n            renderTryFromUnconstrainedForConstrained(this)\n        }\n    }\n\n    private fun renderTryFromUnconstrainedForConstrained(writer: RustWriter) {\n        writer.rustBlock(\"impl std::convert::TryFrom<$name> for #{T}\", constrainedSymbol) {\n            rust(\"type Error = #T;\", constraintViolationSymbol)\n\n            rustBlock(\"fn try_from(value: $name) -> std::result::Result<Self, Self::Error>\") {\n                if (innerShape.canReachConstrainedShape(model, symbolProvider)) {\n                    val resolvesToNonPublicConstrainedValueType =\n                        innerShape.canReachConstrainedShape(model, symbolProvider) &&\n                            !innerShape.isDirectlyConstrained(symbolProvider) &&\n                            innerShape !is StructureShape &&\n                            innerShape !is UnionShape\n                    val constrainedMemberSymbol =\n                        if (resolvesToNonPublicConstrainedValueType) {\n                            pubCrateConstrainedShapeSymbolProvider.toSymbol(shape.member)\n                        } else {\n                            constrainedShapeSymbolProvider.toSymbol(shape.member)\n                        }\n                    val innerConstraintViolationSymbol = constraintViolationSymbolProvider.toSymbol(innerShape)\n                    val boxErr =\n                        if (shape.member.hasTrait<ConstraintViolationRustBoxTrait>()) {\n                            \".map_err(|(idx, inner_violation)| (idx, Box::new(inner_violation)))\"\n                        } else {\n                            \"\"\n                        }\n                    val constrainValueWritable =\n                        writable {\n                            conditionalBlock(\"inner.map(|inner| \", \").transpose()\", constrainedMemberSymbol.isOptional()) {\n                                rust(\"inner.try_into().map_err(|inner_violation| (idx, inner_violation))\")\n                            }\n                        }\n\n                    rustTemplate(\n                        \"\"\"\n                        let res: #{Result}<#{Vec}<#{ConstrainedMemberSymbol}>, (usize, #{InnerConstraintViolationSymbol}) > = value\n                            .0\n                            .into_iter()\n                            .enumerate()\n                            .map(|(idx, inner)| {\n                                #{ConstrainValueWritable:W}\n                            })\n                            .collect();\n                        let inner = res\n                            $boxErr\n                            .map_err(|(idx, inner_violation)| Self::Error::Member(idx, inner_violation))?;\n                        \"\"\",\n                        \"Vec\" to RuntimeType.Vec,\n                        \"ConstrainedMemberSymbol\" to constrainedMemberSymbol,\n                        \"InnerConstraintViolationSymbol\" to innerConstraintViolationSymbol,\n                        \"ConstrainValueWritable\" to constrainValueWritable,\n                        *RuntimeType.preludeScope,\n                    )\n\n                    val constrainedValueTypeIsNotFinalType =\n                        resolvesToNonPublicConstrainedValueType && shape.isDirectlyConstrained(symbolProvider)\n                    if (constrainedValueTypeIsNotFinalType) {\n                        // Refer to the comments under `UnconstrainedMapGenerator` for a more in-depth explanation\n                        // of this process. Consider the following Smithy model where a constrained list contains\n                        // an indirectly constrained shape as a member:\n                        //\n                        // ```smithy\n                        // @length(min: 1, max: 100)\n                        // list ItemList {\n                        //     member: Item\n                        // }\n                        //\n                        // list Item {\n                        //     member: ItemName\n                        // }\n                        //\n                        // @length(min: 1, max: 100)\n                        // string ItemName\n                        // ```\n                        //\n                        // The final type exposed to the user is `ItemList<Vec<Vec<ItemName>>>`. However, the\n                        // intermediate representation generated is `Vec<ItemConstrained>`. This needs to be\n                        // transformed into `Vec<Vec<ItemName>>` to satisfy the `TryFrom` implementation and\n                        // successfully construct an `ItemList` instance.\n                        //\n                        // This transformation is necessary due to the nested nature of the constraints and\n                        // the difference between the internal constrained representation and the external\n                        // user-facing type.\n                        rustTemplate(\n                            \"\"\"\n                            let inner: Vec<#{FinalType}> = inner.into_iter().map(|value| value.into()).collect();\n                            \"\"\",\n                            \"FinalType\" to symbolProvider.toSymbol(shape.member),\n                        )\n                    }\n                } else {\n                    rust(\"let inner = value.0;\")\n                }\n\n                if (shape.isDirectlyConstrained(symbolProvider)) {\n                    rust(\"Self::try_from(inner)\")\n                } else {\n                    rust(\"Ok(Self(inner))\")\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/UnconstrainedMapGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.generators\n\nimport software.amazon.smithy.model.shapes.MapShape\nimport software.amazon.smithy.model.shapes.StringShape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.shapes.UnionShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.join\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.withBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.isOptional\nimport software.amazon.smithy.rust.codegen.core.smithy.makeMaybeConstrained\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\nimport software.amazon.smithy.rust.codegen.server.smithy.InlineModuleCreator\nimport software.amazon.smithy.rust.codegen.server.smithy.PubCrateConstraintViolationSymbolProvider\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenContext\nimport software.amazon.smithy.rust.codegen.server.smithy.canReachConstrainedShape\nimport software.amazon.smithy.rust.codegen.server.smithy.isDirectlyConstrained\nimport software.amazon.smithy.rust.codegen.server.smithy.traits.ConstraintViolationRustBoxTrait\n\n/**\n * Generates a Rust type for a constrained map shape that is able to hold values for the corresponding\n * _unconstrained_ shape. This type is a [RustType.Opaque] wrapper tuple newtype holding a `HashMap`. Upon request parsing,\n * server deserializers use this type to store the incoming values without enforcing the modeled constraints. Only after\n * the full request has been parsed are constraints enforced, via the `impl TryFrom<UnconstrainedSymbol> for\n * ConstrainedSymbol`.\n *\n * This type is never exposed to the user; it is always `pub(crate)`. Only the deserializers use it.\n *\n * Consult [UnconstrainedShapeSymbolProvider] for more details and for an example.\n */\nclass UnconstrainedMapGenerator(\n    val codegenContext: ServerCodegenContext,\n    private val inlineModuleCreator: InlineModuleCreator,\n    val shape: MapShape,\n) {\n    private val model = codegenContext.model\n    private val symbolProvider = codegenContext.symbolProvider\n    private val unconstrainedShapeSymbolProvider = codegenContext.unconstrainedShapeSymbolProvider\n    private val pubCrateConstrainedShapeSymbolProvider = codegenContext.pubCrateConstrainedShapeSymbolProvider\n    private val symbol = unconstrainedShapeSymbolProvider.toSymbol(shape)\n    private val name = symbol.name\n    private val publicConstrainedTypes = codegenContext.settings.codegenConfig.publicConstrainedTypes\n    private val constraintViolationSymbolProvider =\n        with(codegenContext.constraintViolationSymbolProvider) {\n            if (publicConstrainedTypes) {\n                this\n            } else {\n                PubCrateConstraintViolationSymbolProvider(this)\n            }\n        }\n    private val constraintViolationSymbol = constraintViolationSymbolProvider.toSymbol(shape)\n    private val constrainedShapeSymbolProvider = codegenContext.constrainedShapeSymbolProvider\n    private val constrainedSymbol =\n        if (shape.isDirectlyConstrained(symbolProvider)) {\n            constrainedShapeSymbolProvider.toSymbol(shape)\n        } else {\n            pubCrateConstrainedShapeSymbolProvider.toSymbol(shape)\n        }\n    private val keyShape = model.expectShape(shape.key.target, StringShape::class.java)\n    private val valueShape = model.expectShape(shape.value.target)\n\n    fun render() {\n        check(shape.canReachConstrainedShape(model, symbolProvider))\n\n        val keySymbol = unconstrainedShapeSymbolProvider.toSymbol(keyShape)\n        val valueMemberSymbol = unconstrainedShapeSymbolProvider.toSymbol(shape.value)\n\n        inlineModuleCreator(symbol) {\n            rustTemplate(\n                \"\"\"\n                ##[derive(Debug, Clone)]\n                pub(crate) struct $name(pub(crate) std::collections::HashMap<#{KeySymbol}, #{ValueMemberSymbol}>);\n\n                impl From<$name> for #{MaybeConstrained} {\n                    fn from(value: $name) -> Self {\n                        Self::Unconstrained(value)\n                    }\n                }\n\n                \"\"\",\n                \"KeySymbol\" to keySymbol,\n                \"ValueMemberSymbol\" to valueMemberSymbol,\n                \"MaybeConstrained\" to constrainedSymbol.makeMaybeConstrained(),\n            )\n\n            renderTryFromUnconstrainedForConstrained(this)\n        }\n    }\n\n    private fun renderTryFromUnconstrainedForConstrained(writer: RustWriter) {\n        writer.rustBlock(\"impl std::convert::TryFrom<$name> for #{T}\", constrainedSymbol) {\n            rust(\"type Error = #T;\", constraintViolationSymbol)\n\n            rustBlock(\"fn try_from(value: $name) -> std::result::Result<Self, Self::Error>\") {\n                if (isKeyConstrained(keyShape, symbolProvider) || isValueConstrained(valueShape, model, symbolProvider)) {\n                    val resolvesToNonPublicConstrainedValueType =\n                        isValueConstrained(valueShape, model, symbolProvider) &&\n                            !valueShape.isDirectlyConstrained(symbolProvider) &&\n                            valueShape !is StructureShape &&\n                            valueShape !is UnionShape\n                    val constrainedMemberValueSymbol =\n                        if (resolvesToNonPublicConstrainedValueType) {\n                            pubCrateConstrainedShapeSymbolProvider.toSymbol(shape.value)\n                        } else {\n                            constrainedShapeSymbolProvider.toSymbol(shape.value)\n                        }\n                    val constrainedValueSymbol =\n                        if (resolvesToNonPublicConstrainedValueType) {\n                            pubCrateConstrainedShapeSymbolProvider.toSymbol(valueShape)\n                        } else {\n                            constrainedShapeSymbolProvider.toSymbol(valueShape)\n                        }\n\n                    val constrainedKeySymbol = constrainedShapeSymbolProvider.toSymbol(keyShape)\n                    val epilogueWritable = writable { rust(\"Ok((k, v))\") }\n                    val constrainKeyWritable =\n                        writable {\n                            rustTemplate(\n                                \"let k: #{ConstrainedKeySymbol} = k.try_into().map_err(Self::Error::Key)?;\",\n                                \"ConstrainedKeySymbol\" to constrainedKeySymbol,\n                            )\n                        }\n                    val constrainValueWritable =\n                        writable {\n                            val boxErr =\n                                if (shape.value.hasTrait<ConstraintViolationRustBoxTrait>()) {\n                                    \".map_err(Box::new)\"\n                                } else {\n                                    \"\"\n                                }\n                            if (constrainedMemberValueSymbol.isOptional()) {\n                                // The map is `@sparse`.\n                                rustBlock(\"match v\") {\n                                    rust(\"None => Ok((k, None)),\")\n                                    withBlock(\"Some(v) =>\", \",\") {\n                                        // DRYing this up with the else branch below would make this less understandable.\n                                        rustTemplate(\n                                            \"\"\"\n                                            match #{ConstrainedValueSymbol}::try_from(v)$boxErr {\n                                                Ok(v) => Ok((k, Some(v))),\n                                                Err(inner_constraint_violation) => Err(Self::Error::Value(k, inner_constraint_violation)),\n                                            }\n                                            \"\"\",\n                                            \"ConstrainedValueSymbol\" to constrainedValueSymbol,\n                                        )\n                                    }\n                                }\n                            } else {\n                                rustTemplate(\n                                    \"\"\"\n                                    match #{ConstrainedValueSymbol}::try_from(v)$boxErr {\n                                        Ok(v) => #{Epilogue:W},\n                                        Err(inner_constraint_violation) => Err(Self::Error::Value(k, inner_constraint_violation)),\n                                    }\n                                    \"\"\",\n                                    \"ConstrainedValueSymbol\" to constrainedValueSymbol,\n                                    \"Epilogue\" to epilogueWritable,\n                                )\n                            }\n                        }\n\n                    val constrainKVWritable =\n                        if (\n                            isKeyConstrained(keyShape, symbolProvider) &&\n                            isValueConstrained(valueShape, model, symbolProvider)\n                        ) {\n                            listOf(constrainKeyWritable, constrainValueWritable).join(\"\\n\")\n                        } else if (isKeyConstrained(keyShape, symbolProvider)) {\n                            listOf(constrainKeyWritable, epilogueWritable).join(\"\\n\")\n                        } else if (isValueConstrained(valueShape, model, symbolProvider)) {\n                            constrainValueWritable\n                        } else {\n                            epilogueWritable\n                        }\n\n                    rustTemplate(\n                        \"\"\"\n                        let res: #{Result}<#{HashMap}<#{ConstrainedKeySymbol}, #{ConstrainedMemberValueSymbol}>, Self::Error> = value.0\n                            .into_iter()\n                            .map(|(k, v)| {\n                                #{ConstrainKVWritable:W}\n                            })\n                            .collect();\n                        let hm = res?;\n                        \"\"\",\n                        \"HashMap\" to RuntimeType.HashMap,\n                        \"ConstrainedKeySymbol\" to constrainedKeySymbol,\n                        \"ConstrainedMemberValueSymbol\" to constrainedMemberValueSymbol,\n                        \"ConstrainKVWritable\" to constrainKVWritable,\n                        *RuntimeType.preludeScope,\n                    )\n\n                    val constrainedValueTypeIsNotFinalType =\n                        resolvesToNonPublicConstrainedValueType && shape.isDirectlyConstrained(symbolProvider)\n                    if (constrainedValueTypeIsNotFinalType) {\n                        // The map is constrained. Its value shape reaches a constrained shape, but the value shape itself\n                        // is not directly constrained. The value shape must be an aggregate shape. But it is not a\n                        // structure shape. So it must be a collection or map shape. In this case the type for the value\n                        // shape that implements the `Constrained` trait _does not_ coincide with the regular type the user\n                        // is exposed to. The former will be the `pub(crate)` wrapper tuple type created by a\n                        // `Constrained*Generator`, whereas the latter will be an stdlib container type. Both types are\n                        // isomorphic though, and we can convert between them using `From`, so that's what we do here.\n                        //\n                        // As a concrete example of this particular case, consider the model:\n                        //\n                        // ```smithy\n                        // @length(min: 1)\n                        // map Map {\n                        //    key: String,\n                        //    value: List,\n                        // }\n                        //\n                        // list List {\n                        //     member: NiceString\n                        // }\n                        //\n                        // @length(min: 1, max: 69)\n                        // string NiceString\n                        // ```\n                        rustTemplate(\n                            \"\"\"\n                            let hm: #{HashMap}<#{KeySymbol}, #{ValueSymbol}> =\n                                hm.into_iter().map(|(k, v)| (k, v.into())).collect();\n                            \"\"\",\n                            \"HashMap\" to RuntimeType.HashMap,\n                            \"KeySymbol\" to symbolProvider.toSymbol(keyShape),\n                            \"ValueSymbol\" to symbolProvider.toSymbol(valueShape),\n                        )\n                    }\n                } else {\n                    rust(\"let hm = value.0;\")\n                }\n\n                if (shape.isDirectlyConstrained(symbolProvider)) {\n                    rust(\"Self::try_from(hm)\")\n                } else {\n                    rust(\"Ok(Self(hm))\")\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/UnconstrainedUnionGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.generators\n\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.shapes.UnionShape\nimport software.amazon.smithy.model.traits.EnumTrait\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute.Companion.derive\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.Visibility\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.withBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.withBlockTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.makeMaybeConstrained\nimport software.amazon.smithy.rust.codegen.core.smithy.makeRustBoxed\nimport software.amazon.smithy.rust.codegen.core.smithy.traits.RustBoxTrait\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\nimport software.amazon.smithy.rust.codegen.core.util.isTargetUnit\nimport software.amazon.smithy.rust.codegen.core.util.letIf\nimport software.amazon.smithy.rust.codegen.core.util.toPascalCase\nimport software.amazon.smithy.rust.codegen.server.smithy.InlineModuleCreator\nimport software.amazon.smithy.rust.codegen.server.smithy.PubCrateConstraintViolationSymbolProvider\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenContext\nimport software.amazon.smithy.rust.codegen.server.smithy.canReachConstrainedShape\nimport software.amazon.smithy.rust.codegen.server.smithy.isDirectlyConstrained\nimport software.amazon.smithy.rust.codegen.server.smithy.targetCanReachConstrainedShape\nimport software.amazon.smithy.rust.codegen.server.smithy.traits.ConstraintViolationRustBoxTrait\nimport software.amazon.smithy.rust.codegen.server.smithy.traits.isReachableFromOperationInput\n\n/**\n * Generates a Rust type for a constrained union shape that is able to hold values for the corresponding _unconstrained_\n * shape. This type is a [RustType.Opaque] enum newtype, with each variant holding the corresponding unconstrained type.\n * Upon request parsing, server deserializers use this type to store the incoming values without enforcing the modeled\n * constraints. Only after the full request has been parsed are constraints enforced, via the `impl\n * TryFrom<UnconstrainedSymbol> for ConstrainedSymbol`.\n *\n * This type is never exposed to the user; it is always `pub(crate)`. Only the deserializers use it.\n *\n * Consult [UnconstrainedShapeSymbolProvider] for more details and for an example.\n */\nclass UnconstrainedUnionGenerator(\n    val codegenContext: ServerCodegenContext,\n    private val inlineModuleCreator: InlineModuleCreator,\n    private val modelsModuleWriter: RustWriter,\n    val shape: UnionShape,\n    private val validationExceptionConversionGenerator: ValidationExceptionConversionGenerator,\n) {\n    private val model = codegenContext.model\n    private val symbolProvider = codegenContext.symbolProvider\n    private val pubCrateConstrainedShapeSymbolProvider = codegenContext.pubCrateConstrainedShapeSymbolProvider\n    private val unconstrainedShapeSymbolProvider = codegenContext.unconstrainedShapeSymbolProvider\n    private val publicConstrainedTypes = codegenContext.settings.codegenConfig.publicConstrainedTypes\n    private val constraintViolationSymbolProvider =\n        with(codegenContext.constraintViolationSymbolProvider) {\n            if (publicConstrainedTypes) {\n                this\n            } else {\n                PubCrateConstraintViolationSymbolProvider(this)\n            }\n        }\n    private val symbol = unconstrainedShapeSymbolProvider.toSymbol(shape)\n    private val sortedMembers: List<MemberShape> = shape.allMembers.values.sortedBy { symbolProvider.toMemberName(it) }\n\n    fun render() {\n        check(shape.canReachConstrainedShape(model, symbolProvider))\n\n        val name = symbol.name\n        val constrainedSymbol = pubCrateConstrainedShapeSymbolProvider.toSymbol(shape)\n        val constraintViolationSymbol = constraintViolationSymbolProvider.toSymbol(shape)\n        val constraintViolationName = constraintViolationSymbol.name\n\n        inlineModuleCreator(symbol) {\n            rustBlock(\n                \"\"\"\n                ##[allow(clippy::enum_variant_names)]\n                ##[derive(Debug, Clone)]\n                pub(crate) enum $name\n                \"\"\",\n            ) {\n                sortedMembers.forEach { member ->\n                    if (member.isTargetUnit()) {\n                        rust(\n                            \"${unconstrainedShapeSymbolProvider.toMemberName(member)},\",\n                        )\n                    } else {\n                        rust(\n                            \"${unconstrainedShapeSymbolProvider.toMemberName(member)}(#T),\",\n                            unconstrainedShapeSymbolProvider.toSymbol(member),\n                        )\n                    }\n                }\n            }\n\n            rustTemplate(\n                \"\"\"\n                impl #{TryFrom}<$name> for #{ConstrainedSymbol} {\n                    type Error = #{ConstraintViolationSymbol};\n\n                    fn try_from(value: $name) -> #{Result}<Self, Self::Error> {\n                        #{body:W}\n                    }\n                }\n                \"\"\",\n                \"TryFrom\" to RuntimeType.TryFrom,\n                \"ConstrainedSymbol\" to constrainedSymbol,\n                \"ConstraintViolationSymbol\" to constraintViolationSymbol,\n                \"body\" to generateTryFromUnconstrainedUnionImpl(),\n                *RuntimeType.preludeScope,\n            )\n        }\n\n        modelsModuleWriter.rustTemplate(\n            \"\"\"\n            impl #{ConstrainedTrait} for #{ConstrainedSymbol}  {\n                type Unconstrained = #{UnconstrainedSymbol};\n            }\n\n            impl From<#{UnconstrainedSymbol}> for #{MaybeConstrained} {\n                fn from(value: #{UnconstrainedSymbol}) -> Self {\n                    Self::Unconstrained(value)\n                }\n            }\n            \"\"\",\n            \"ConstrainedTrait\" to RuntimeType.ConstrainedTrait,\n            \"MaybeConstrained\" to constrainedSymbol.makeMaybeConstrained(),\n            \"ConstrainedSymbol\" to constrainedSymbol,\n            \"UnconstrainedSymbol\" to symbol,\n        )\n\n        val constraintViolationVisibility =\n            if (publicConstrainedTypes) {\n                Visibility.PUBLIC\n            } else {\n                Visibility.PUBCRATE\n            }\n\n        inlineModuleCreator(\n            constraintViolationSymbol,\n        ) {\n            Attribute(derive(RuntimeType.Debug, RuntimeType.PartialEq)).render(this)\n            rustBlock(\n                \"\"\"\n                ##[allow(clippy::enum_variant_names)]\n                pub${if (constraintViolationVisibility == Visibility.PUBCRATE) \" (crate)\" else \"\"} enum $constraintViolationName\"\"\",\n            ) {\n                constraintViolations().forEach { renderConstraintViolation(this, it) }\n            }\n\n            rustTemplate(\n                \"\"\"\n                impl #{Display} for $constraintViolationName {\n                    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n                        match self {\n                            #{ConstraintVariants:W}\n                        }\n                    }\n                }\n\n                impl #{Error} for $constraintViolationName {}\n                \"\"\",\n                \"Error\" to RuntimeType.StdError,\n                \"Display\" to RuntimeType.Display,\n                \"ConstraintVariants\" to generateDisplayMessageForEachVariant(),\n            )\n\n            if (shape.isReachableFromOperationInput()) {\n                rustTemplate(\n                    \"\"\"\n                    impl $constraintViolationName {\n                        #{UnionShapeConstraintViolationImplBlock:W}\n                    }\n                    \"\"\",\n                    \"UnionShapeConstraintViolationImplBlock\" to\n                        validationExceptionConversionGenerator.unionShapeConstraintViolationImplBlock(constraintViolations()),\n                )\n            }\n        }\n    }\n\n    private fun generateDisplayMessageForEachVariant() =\n        writable {\n            constraintViolations().forEach {\n                rustTemplate(\n                    \"\"\"\n                    Self::${it.name()}(inner) => write!(f, \"{inner}\"),\n                    \"\"\",\n                )\n            }\n        }\n\n    private fun constraintViolations() =\n        sortedMembers\n            .filter { it.targetCanReachConstrainedShape(model, symbolProvider) }\n            .map { UnionConstraintTraitInfo(it) }\n\n    private fun renderConstraintViolation(\n        writer: RustWriter,\n        unionConstraintTraitInfo: UnionConstraintTraitInfo,\n    ) {\n        val targetShape = model.expectShape(unionConstraintTraitInfo.forMember.target)\n\n        val constraintViolationSymbol =\n            constraintViolationSymbolProvider.toSymbol(targetShape)\n                // Box this constraint violation symbol if necessary.\n                .letIf(unionConstraintTraitInfo.forMember.hasTrait<ConstraintViolationRustBoxTrait>()) {\n                    it.makeRustBoxed()\n                }\n\n        writer.rust(\n            \"${unionConstraintTraitInfo.name()}(#T),\",\n            constraintViolationSymbol,\n        )\n    }\n\n    private fun generateTryFromUnconstrainedUnionImpl() =\n        writable {\n            withBlock(\"Ok(\", \")\") {\n                withBlock(\"match value {\", \"}\") {\n                    sortedMembers.forEach { member ->\n                        val memberName = unconstrainedShapeSymbolProvider.toMemberName(member)\n                        if (member.isTargetUnit()) {\n                            // Unit type within Unions do not have associated data.\n                            rustTemplate(\n                                \"\"\"\n                                #{UnconstrainedUnion}::$memberName => Self::$memberName,\n                                \"\"\",\n                                \"UnconstrainedUnion\" to symbol,\n                            )\n                        } else {\n                            withBlockTemplate(\n                                \"#{UnconstrainedUnion}::$memberName(unconstrained) => Self::$memberName(\",\n                                \"),\",\n                                \"UnconstrainedUnion\" to symbol,\n                            ) {\n                                if (!member.canReachConstrainedShape(model, symbolProvider)) {\n                                    rust(\"unconstrained\")\n                                } else {\n                                    generateTryFromImplForReachableConstrainedShape(member).invoke(this)\n                                }\n                            }\n                        }\n                    }\n                }\n            }\n        }\n\n    private fun generateTryFromImplForReachableConstrainedShape(member: MemberShape) =\n        writable {\n            val targetShape = model.expectShape(member.target)\n            val resolveToNonPublicConstrainedType =\n                targetShape !is StructureShape && targetShape !is UnionShape && !targetShape.hasTrait<EnumTrait>() &&\n                    (!publicConstrainedTypes || !targetShape.isDirectlyConstrained(symbolProvider))\n\n            val (unconstrainedVar, boxIt) =\n                if (member.hasTrait<RustBoxTrait>()) {\n                    \"(*unconstrained)\" to \".map(Box::new)\"\n                } else {\n                    \"unconstrained\" to \"\"\n                }\n            val boxErr =\n                if (member.hasTrait<ConstraintViolationRustBoxTrait>()) {\n                    \".map_err(Box::new)\"\n                } else {\n                    \"\"\n                }\n\n            if (resolveToNonPublicConstrainedType) {\n                val constrainedSymbol =\n                    if (!publicConstrainedTypes && targetShape.isDirectlyConstrained(symbolProvider)) {\n                        codegenContext.constrainedShapeSymbolProvider.toSymbol(targetShape)\n                    } else {\n                        pubCrateConstrainedShapeSymbolProvider.toSymbol(targetShape)\n                    }\n                rustTemplate(\n                    \"\"\"\n                    {\n                        let constrained: #{ConstrainedSymbol} = $unconstrainedVar\n                            .try_into()$boxIt$boxErr\n                            .map_err(Self::Error::${UnionConstraintTraitInfo(member).name()})?;\n                        constrained.into()\n                    }\n                    \"\"\",\n                    \"ConstrainedSymbol\" to constrainedSymbol,\n                )\n            } else {\n                rust(\n                    \"\"\"\n                    $unconstrainedVar\n                        .try_into()\n                        $boxIt\n                        $boxErr\n                        .map_err(Self::Error::${UnionConstraintTraitInfo(member).name()})?\n                    \"\"\",\n                )\n            }\n        }\n}\n\ndata class UnionConstraintTraitInfo(val forMember: MemberShape) {\n    fun name() = forMember.memberName.toPascalCase()\n}\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ValidationExceptionConversionGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.generators\n\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.MapShape\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.model.shapes.StringShape\nimport software.amazon.smithy.model.traits.EnumTrait\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.protocol.ServerProtocol\n\n/**\n * Collection of methods that will be invoked by the respective generators to generate code to convert constraint\n * violations to validation exceptions.\n * This is only rendered for shapes that lie in a constrained operation's closure.\n */\ninterface ValidationExceptionConversionGenerator {\n    val shapeId: ShapeId\n\n    /**\n     * Convert from a top-level operation input's constraint violation into\n     * `aws_smithy_http_server::rejection::RequestRejection`.\n     */\n    fun renderImplFromConstraintViolationForRequestRejection(protocol: ServerProtocol): Writable\n\n    // Simple shapes.\n    fun stringShapeConstraintViolationImplBlock(stringConstraintsInfo: Collection<StringTraitInfo>): Writable\n\n    fun enumShapeConstraintViolationImplBlock(enumTrait: EnumTrait): Writable\n\n    fun numberShapeConstraintViolationImplBlock(rangeInfo: Range): Writable\n\n    fun blobShapeConstraintViolationImplBlock(blobConstraintsInfo: Collection<BlobLength>): Writable\n\n    // Aggregate shapes.\n    fun mapShapeConstraintViolationImplBlock(\n        shape: MapShape,\n        keyShape: StringShape,\n        valueShape: Shape,\n        symbolProvider: RustSymbolProvider,\n        model: Model,\n    ): Writable\n\n    fun builderConstraintViolationFn(constraintViolations: Collection<ConstraintViolation>): Writable\n\n    fun collectionShapeConstraintViolationImplBlock(\n        collectionConstraintsInfo: Collection<CollectionTraitInfo>,\n        isMemberConstrained: Boolean,\n    ): Writable\n\n    fun unionShapeConstraintViolationImplBlock(\n        unionConstraintTraitInfo: Collection<UnionConstraintTraitInfo>,\n    ): Writable\n}\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/http/RestRequestSpecGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.generators.http\n\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.withBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.HttpBindingResolver\n\n/**\n * [RestRequestSpecGenerator] generates a restJson1 or restXml specific `RequestSpec`. Both protocols are routed the same.\n */\nclass RestRequestSpecGenerator(\n    private val httpBindingResolver: HttpBindingResolver,\n    private val requestSpecModule: RuntimeType,\n    private val runtimeConfig: RuntimeConfig,\n) {\n    fun generate(operationShape: OperationShape): Writable {\n        val httpTrait = httpBindingResolver.httpTrait(operationShape)\n        val extraCodegenScope =\n            arrayOf(\n                \"RequestSpec\",\n                \"UriSpec\",\n                \"PathAndQuerySpec\",\n                \"PathSpec\",\n                \"QuerySpec\",\n                \"PathSegment\",\n                \"QuerySegment\",\n            ).map {\n                it to requestSpecModule.resolve(it)\n            }.toTypedArray()\n\n        // TODO(https://github.com/smithy-lang/smithy-rs/issues/950): Support the `endpoint` trait.\n        val pathSegmentsVec =\n            writable {\n                withBlock(\"vec![\", \"]\") {\n                    for (segment in httpTrait.uri.segments) {\n                        val variant =\n                            when {\n                                segment.isGreedyLabel -> \"Greedy\"\n                                segment.isLabel -> \"Label\"\n                                else -> \"\"\"Literal(String::from(\"${segment.content}\"))\"\"\"\n                            }\n                        rustTemplate(\n                            \"#{PathSegment}::$variant,\",\n                            *extraCodegenScope,\n                        )\n                    }\n                }\n            }\n\n        val querySegmentsVec =\n            writable {\n                withBlock(\"vec![\", \"]\") {\n                    for (queryLiteral in httpTrait.uri.queryLiterals) {\n                        val variant =\n                            if (queryLiteral.value == \"\") {\n                                \"\"\"Key(String::from(\"${queryLiteral.key}\"))\"\"\"\n                            } else {\n                                \"\"\"KeyValue(String::from(\"${queryLiteral.key}\"), String::from(\"${queryLiteral.value}\"))\"\"\"\n                            }\n                        rustTemplate(\"#{QuerySegment}::$variant,\", *extraCodegenScope)\n                    }\n                }\n            }\n\n        return writable {\n            rustTemplate(\n                \"\"\"\n                #{RequestSpec}::new(\n                    #{Method}::${httpTrait.method},\n                    #{UriSpec}::new(\n                        #{PathAndQuerySpec}::new(\n                            #{PathSpec}::from_vector_unchecked(#{PathSegmentsVec:W}),\n                            #{QuerySpec}::from_vector_unchecked(#{QuerySegmentsVec:W})\n                        )\n                    ),\n                )\n                \"\"\",\n                *extraCodegenScope,\n                \"PathSegmentsVec\" to pathSegmentsVec,\n                \"QuerySegmentsVec\" to querySegmentsVec,\n                \"Method\" to RuntimeType.http(runtimeConfig).resolve(\"Method\"),\n            )\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/http/ServerRequestBindingGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.generators.http\n\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustType\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.stripOuter\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.http.HttpBindingCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.http.HttpBindingGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.http.HttpBindingSection\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.http.HttpMessageType\nimport software.amazon.smithy.rust.codegen.core.smithy.mapRustType\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.HttpBindingDescriptor\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenContext\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.protocol.ServerProtocol\nimport software.amazon.smithy.rust.codegen.server.smithy.targetCanReachConstrainedShape\n\nclass ServerRequestBindingGenerator(\n    val protocol: ServerProtocol,\n    codegenContext: ServerCodegenContext,\n    operationShape: OperationShape,\n    additionalHttpBindingCustomizations: List<HttpBindingCustomization> = listOf(),\n) {\n    private val httpBindingGenerator =\n        HttpBindingGenerator(\n            protocol,\n            codegenContext,\n            // Note how we parse the HTTP-bound values into _unconstrained_ types; they will be constrained when\n            // building the builder.\n            codegenContext.unconstrainedShapeSymbolProvider,\n            operationShape,\n            listOf(\n                ServerRequestAfterDeserializingIntoAHashMapOfHttpPrefixHeadersWrapInUnconstrainedMapHttpBindingCustomization(\n                    codegenContext,\n                ),\n            ) + additionalHttpBindingCustomizations,\n        )\n\n    fun generateDeserializeHeaderFn(binding: HttpBindingDescriptor): RuntimeType =\n        httpBindingGenerator.generateDeserializeHeaderFn(binding)\n\n    fun generateDeserializePayloadFn(\n        binding: HttpBindingDescriptor,\n        structuredHandler: RustWriter.(String) -> Unit,\n    ): RuntimeType =\n        httpBindingGenerator.generateDeserializePayloadFn(\n            binding,\n            protocol.deserializePayloadErrorType(binding).toSymbol(),\n            structuredHandler,\n            HttpMessageType.REQUEST,\n        )\n\n    fun generateDeserializePrefixHeadersFn(binding: HttpBindingDescriptor): RuntimeType =\n        httpBindingGenerator.generateDeserializePrefixHeaderFn(binding)\n}\n\n/**\n * A customization to, just after we've deserialized HTTP request headers bound to a map shape via `@httpPrefixHeaders`,\n * wrap the `std::collections::HashMap` in an unconstrained type wrapper newtype.\n */\nclass ServerRequestAfterDeserializingIntoAHashMapOfHttpPrefixHeadersWrapInUnconstrainedMapHttpBindingCustomization(val codegenContext: ServerCodegenContext) :\n    HttpBindingCustomization() {\n    override fun section(section: HttpBindingSection): Writable =\n        when (section) {\n            is HttpBindingSection.BeforeRenderingHeaderValue,\n            is HttpBindingSection.BeforeIteratingOverMapShapeBoundWithHttpPrefixHeaders,\n            -> emptySection\n            is HttpBindingSection.AfterDeserializingIntoAHashMapOfHttpPrefixHeaders ->\n                writable {\n                    if (section.memberShape.targetCanReachConstrainedShape(codegenContext.model, codegenContext.unconstrainedShapeSymbolProvider)) {\n                        rust(\n                            \"let out = out.map(#T);\",\n                            codegenContext.unconstrainedShapeSymbolProvider.toSymbol(section.memberShape).mapRustType {\n                                it.stripOuter<RustType.Option>()\n                            },\n                        )\n                    }\n                }\n            else -> emptySection\n        }\n}\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/http/ServerResponseBindingGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.generators.http\n\nimport software.amazon.smithy.model.shapes.ByteShape\nimport software.amazon.smithy.model.shapes.CollectionShape\nimport software.amazon.smithy.model.shapes.IntegerShape\nimport software.amazon.smithy.model.shapes.LongShape\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.shapes.ShortShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.http.HttpBindingCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.http.HttpBindingGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.http.HttpBindingSection\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.http.HttpMessageType\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.Protocol\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.serialize.ValueExpression\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenContext\nimport software.amazon.smithy.rust.codegen.server.smithy.workingWithPublicConstrainedWrapperTupleType\n\nclass ServerResponseBindingGenerator(\n    protocol: Protocol,\n    private val codegenContext: ServerCodegenContext,\n    operationShape: OperationShape,\n) {\n    private val httpBindingGenerator =\n        HttpBindingGenerator(\n            protocol,\n            codegenContext,\n            codegenContext.symbolProvider,\n            operationShape,\n            listOf(\n                ServerResponseBeforeIteratingOverMapBoundWithHttpPrefixHeadersUnwrapConstrainedMapHttpBindingCustomization(\n                    codegenContext,\n                ),\n                ServerResponseBeforeRenderingHeadersHttpBindingCustomization(\n                    codegenContext,\n                ),\n            ),\n        )\n\n    fun generateAddHeadersFn(shape: Shape): RuntimeType? =\n        httpBindingGenerator.generateAddHeadersFn(shape, HttpMessageType.RESPONSE)\n}\n\n/**\n * A customization to, just before we iterate over a _constrained_ map shape that is bound to HTTP response headers via\n * `@httpPrefixHeaders`, unwrap the wrapper newtype and take a shared reference to the actual `std::collections::HashMap`\n * within it.\n */\nclass ServerResponseBeforeIteratingOverMapBoundWithHttpPrefixHeadersUnwrapConstrainedMapHttpBindingCustomization(val codegenContext: ServerCodegenContext) :\n    HttpBindingCustomization() {\n    override fun section(section: HttpBindingSection): Writable =\n        when (section) {\n            is HttpBindingSection.BeforeIteratingOverMapShapeBoundWithHttpPrefixHeaders ->\n                writable {\n                    if (workingWithPublicConstrainedWrapperTupleType(\n                            section.shape,\n                            codegenContext.model,\n                            codegenContext.settings.codegenConfig.publicConstrainedTypes,\n                        )\n                    ) {\n                        rust(\"let ${section.variableName} = &${section.variableName}.0;\")\n                    }\n                }\n\n            is HttpBindingSection.BeforeRenderingHeaderValue,\n            is HttpBindingSection.AfterDeserializingIntoAHashMapOfHttpPrefixHeaders,\n            is HttpBindingSection.AfterDeserializingIntoADateTimeOfHttpHeaders,\n            is HttpBindingSection.BeforeCreatingEventStreamReceiver,\n            -> emptySection\n        }\n}\n\n/**\n * A customization to, just before we render a _constrained_ member shape to an HTTP response header,\n * unwrap the wrapper newtype and take a shared reference to the actual inner type within it.\n */\nclass ServerResponseBeforeRenderingHeadersHttpBindingCustomization(val codegenContext: ServerCodegenContext) :\n    HttpBindingCustomization() {\n    override fun section(section: HttpBindingSection): Writable =\n        when (section) {\n            is HttpBindingSection.BeforeRenderingHeaderValue ->\n                writable {\n                    val isIntegral =\n                        section.context.shape is ByteShape || section.context.shape is ShortShape || section.context.shape is IntegerShape || section.context.shape is LongShape\n                    val isCollection = section.context.shape is CollectionShape\n\n                    val workingWithPublicWrapper =\n                        workingWithPublicConstrainedWrapperTupleType(\n                            section.context.shape,\n                            codegenContext.model,\n                            codegenContext.settings.codegenConfig.publicConstrainedTypes,\n                        )\n\n                    if (workingWithPublicWrapper && (isIntegral || isCollection)) {\n                        section.context.valueExpression =\n                            ValueExpression.Reference(\"&${section.context.valueExpression.name.removePrefix(\"&\")}.0\")\n                    }\n                }\n\n            is HttpBindingSection.BeforeIteratingOverMapShapeBoundWithHttpPrefixHeaders,\n            is HttpBindingSection.AfterDeserializingIntoAHashMapOfHttpPrefixHeaders,\n            is HttpBindingSection.AfterDeserializingIntoADateTimeOfHttpHeaders,\n            is HttpBindingSection.BeforeCreatingEventStreamReceiver,\n            -> emptySection\n        }\n}\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/protocol/ServerProtocol.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.generators.protocol\n\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.shapes.StringShape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenContext\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.isOptional\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.AwsJson\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.AwsJsonVersion\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.HttpBindingDescriptor\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.HttpBindingResolver\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.HttpLocation\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.Protocol\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.RestJson\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.RestXml\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.RpcV2Cbor\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.awsJsonFieldName\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.parse.CborParserCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.parse.CborParserGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.parse.CborParserSection\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.parse.JsonParserCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.parse.JsonParserGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.parse.JsonParserSection\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.parse.ReturnSymbolToParse\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.parse.StructuredDataParserGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.restJsonFieldName\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.serialize.CborSerializerGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.serialize.StructuredDataSerializerGenerator\nimport software.amazon.smithy.rust.codegen.core.util.dq\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerCargoDependency\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenContext\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerRuntimeType\nimport software.amazon.smithy.rust.codegen.server.smithy.canReachConstrainedShape\nimport software.amazon.smithy.rust.codegen.server.smithy.customizations.AddTypeFieldToServerErrorsCborCustomization\nimport software.amazon.smithy.rust.codegen.server.smithy.customizations.BeforeEncodingMapOrCollectionCborCustomization\nimport software.amazon.smithy.rust.codegen.server.smithy.customizations.BeforeSerializingMemberCborCustomization\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.http.RestRequestSpecGenerator\nimport software.amazon.smithy.rust.codegen.server.smithy.protocols.ServerAwsJsonSerializerGenerator\nimport software.amazon.smithy.rust.codegen.server.smithy.protocols.ServerRestJsonSerializerGenerator\nimport software.amazon.smithy.rust.codegen.server.smithy.targetCanReachConstrainedShape\n\ninterface ServerProtocol : Protocol {\n    /** The path such that `aws_smithy_http_server::protocol::$path` points to the protocol's module. */\n    val protocolModulePath: String\n\n    /** Returns the Rust marker struct enjoying `OperationShape`. */\n    fun markerStruct(): RuntimeType\n\n    /** Returns the Rust router type. */\n    fun routerType(): RuntimeType\n\n    /**\n     * Returns the name of the constructor to be used on the `Router` type, to instantiate a `Router` using this\n     * protocol.\n     */\n    fun serverRouterRuntimeConstructor(): String\n\n    /**\n     * Returns a writable for the `RequestSpec` for an operation.\n     */\n    fun serverRouterRequestSpec(\n        operationShape: OperationShape,\n        operationName: String,\n        serviceName: String,\n        requestSpecModule: RuntimeType,\n    ): Writable\n\n    /**\n     * Returns the Rust type of the `RequestSpec` for an operation.\n     */\n    fun serverRouterRequestSpecType(requestSpecModule: RuntimeType): RuntimeType\n\n    /**\n     * In some protocols, such as `restJson1` and `rpcv2Cbor`,\n     * when there is no modeled body input, `content-type` must not be set and the body must be empty.\n     * Returns a boolean indicating whether to perform this check.\n     */\n    fun serverContentTypeCheckNoModeledInput(): Boolean = false\n\n    /** The protocol-specific `RequestRejection` type. **/\n    fun requestRejection(runtimeConfig: RuntimeConfig): RuntimeType =\n        ServerCargoDependency.smithyHttpServer(runtimeConfig)\n            .toType().resolve(\"protocol::$protocolModulePath::rejection::RequestRejection\")\n\n    /** The protocol-specific `ResponseRejection` type. **/\n    fun responseRejection(runtimeConfig: RuntimeConfig): RuntimeType =\n        ServerCargoDependency.smithyHttpServer(runtimeConfig)\n            .toType().resolve(\"protocol::$protocolModulePath::rejection::ResponseRejection\")\n\n    /** The protocol-specific `RuntimeError` type. **/\n    fun runtimeError(runtimeConfig: RuntimeConfig): RuntimeType =\n        ServerCargoDependency.smithyHttpServer(runtimeConfig)\n            .toType().resolve(\"protocol::$protocolModulePath::runtime_error::RuntimeError\")\n\n    /**\n     * The function that deserializes a payload-bound shape takes as input a byte slab and returns a `Result` holding\n     * the deserialized shape if successful. What error type should we use in case of failure?\n     *\n     * The shape could be payload-bound either because of the `@httpPayload` trait, or because it's part of an event\n     * stream.\n     *\n     * Note that despite the trait (https://smithy.io/2.0/spec/http-bindings.html#httppayload-trait) being able to\n     * target any structure member shape, AWS Protocols only support binding the following shape types to the payload\n     * (and Smithy does indeed enforce this at model build-time): string, blob, structure, union, and document\n     */\n    fun deserializePayloadErrorType(binding: HttpBindingDescriptor): RuntimeType\n}\n\nfun returnSymbolToParseFn(codegenContext: ServerCodegenContext): (Shape) -> ReturnSymbolToParse {\n    fun returnSymbolToParse(shape: Shape): ReturnSymbolToParse =\n        if (shape.canReachConstrainedShape(codegenContext.model, codegenContext.symbolProvider)) {\n            ReturnSymbolToParse(codegenContext.unconstrainedShapeSymbolProvider.toSymbol(shape), true)\n        } else {\n            ReturnSymbolToParse(codegenContext.symbolProvider.toSymbol(shape), false)\n        }\n    return ::returnSymbolToParse\n}\n\nfun jsonParserGenerator(\n    codegenContext: ServerCodegenContext,\n    httpBindingResolver: HttpBindingResolver,\n    jsonName: (MemberShape) -> String,\n    additionalParserCustomizations: List<JsonParserCustomization> = listOf(),\n): JsonParserGenerator =\n    JsonParserGenerator(\n        codegenContext,\n        httpBindingResolver,\n        jsonName,\n        returnSymbolToParseFn(codegenContext),\n        listOf(\n            ServerRequestBeforeBoxingDeserializedMemberConvertToMaybeConstrainedJsonParserCustomization(codegenContext),\n        ) + additionalParserCustomizations,\n    )\n\nclass ServerAwsJsonProtocol(\n    private val serverCodegenContext: ServerCodegenContext,\n    awsJsonVersion: AwsJsonVersion,\n    private val additionalParserCustomizations: List<JsonParserCustomization> = listOf(),\n) : AwsJson(serverCodegenContext, awsJsonVersion), ServerProtocol {\n    private val runtimeConfig = codegenContext.runtimeConfig\n\n    override val protocolModulePath: String\n        get() =\n            when (version) {\n                is AwsJsonVersion.Json10 -> \"aws_json_10\"\n                is AwsJsonVersion.Json11 -> \"aws_json_11\"\n            }\n\n    override fun structuredDataParser(): StructuredDataParserGenerator =\n        jsonParserGenerator(\n            serverCodegenContext,\n            httpBindingResolver,\n            ::awsJsonFieldName,\n            additionalParserCustomizations,\n        )\n\n    override fun structuredDataSerializer(): StructuredDataSerializerGenerator =\n        ServerAwsJsonSerializerGenerator(serverCodegenContext, httpBindingResolver, awsJsonVersion)\n\n    override fun markerStruct(): RuntimeType {\n        return when (version) {\n            is AwsJsonVersion.Json10 -> ServerRuntimeType.protocol(\"AwsJson1_0\", protocolModulePath, runtimeConfig)\n            is AwsJsonVersion.Json11 -> ServerRuntimeType.protocol(\"AwsJson1_1\", protocolModulePath, runtimeConfig)\n        }\n    }\n\n    override fun routerType() =\n        ServerCargoDependency.smithyHttpServer(runtimeConfig).toType()\n            .resolve(\"protocol::aws_json::router::AwsJsonRouter\")\n\n    /**\n     * Returns the operation name as required by the awsJson1.x protocols.\n     */\n    override fun serverRouterRequestSpec(\n        operationShape: OperationShape,\n        operationName: String,\n        serviceName: String,\n        requestSpecModule: RuntimeType,\n    ) = writable {\n        rust(\"\"\"\"$serviceName.$operationName\"\"\"\")\n    }\n\n    override fun serverRouterRequestSpecType(requestSpecModule: RuntimeType): RuntimeType = RuntimeType.StaticStr\n\n    override fun serverRouterRuntimeConstructor() =\n        when (version) {\n            AwsJsonVersion.Json10 -> \"new_aws_json_10_router\"\n            AwsJsonVersion.Json11 -> \"new_aws_json_11_router\"\n        }\n\n    override fun requestRejection(runtimeConfig: RuntimeConfig): RuntimeType =\n        ServerCargoDependency.smithyHttpServer(runtimeConfig)\n            .toType().resolve(\"protocol::aws_json::rejection::RequestRejection\")\n\n    override fun responseRejection(runtimeConfig: RuntimeConfig): RuntimeType =\n        ServerCargoDependency.smithyHttpServer(runtimeConfig)\n            .toType().resolve(\"protocol::aws_json::rejection::ResponseRejection\")\n\n    override fun runtimeError(runtimeConfig: RuntimeConfig): RuntimeType =\n        ServerCargoDependency.smithyHttpServer(runtimeConfig)\n            .toType().resolve(\"protocol::aws_json::runtime_error::RuntimeError\")\n\n    /*\n     * Note that despite the AWS JSON 1.x protocols not supporting the `@httpPayload` trait, event streams are bound\n     * to the payload.\n     */\n    override fun deserializePayloadErrorType(binding: HttpBindingDescriptor): RuntimeType =\n        deserializePayloadErrorType(\n            codegenContext,\n            binding,\n            requestRejection(runtimeConfig),\n            RuntimeType.smithyJson(codegenContext.runtimeConfig).resolve(\"deserialize::error::DeserializeError\"),\n        )\n}\n\nprivate fun restRouterType(runtimeConfig: RuntimeConfig) =\n    ServerCargoDependency.smithyHttpServer(runtimeConfig).toType()\n        .resolve(\"protocol::rest::router::RestRouter\")\n\nclass ServerRestJsonProtocol(\n    private val serverCodegenContext: ServerCodegenContext,\n    private val additionalParserCustomizations: List<JsonParserCustomization> = listOf(),\n) : RestJson(serverCodegenContext), ServerProtocol {\n    val runtimeConfig = codegenContext.runtimeConfig\n\n    override val protocolModulePath: String = \"rest_json_1\"\n\n    override fun structuredDataParser(): StructuredDataParserGenerator =\n        jsonParserGenerator(\n            serverCodegenContext,\n            httpBindingResolver,\n            ::restJsonFieldName,\n            additionalParserCustomizations,\n        )\n\n    override fun structuredDataSerializer(): StructuredDataSerializerGenerator =\n        ServerRestJsonSerializerGenerator(serverCodegenContext, httpBindingResolver)\n\n    override fun markerStruct() = ServerRuntimeType.protocol(\"RestJson1\", protocolModulePath, runtimeConfig)\n\n    override fun routerType() = restRouterType(runtimeConfig)\n\n    override fun serverRouterRequestSpec(\n        operationShape: OperationShape,\n        operationName: String,\n        serviceName: String,\n        requestSpecModule: RuntimeType,\n    ): Writable =\n        RestRequestSpecGenerator(httpBindingResolver, requestSpecModule, runtimeConfig).generate(operationShape)\n\n    override fun serverRouterRequestSpecType(requestSpecModule: RuntimeType): RuntimeType =\n        requestSpecModule.resolve(\"RequestSpec\")\n\n    override fun serverRouterRuntimeConstructor() = \"new_rest_json_router\"\n\n    override fun serverContentTypeCheckNoModeledInput() = true\n\n    override fun deserializePayloadErrorType(binding: HttpBindingDescriptor): RuntimeType =\n        deserializePayloadErrorType(\n            codegenContext,\n            binding,\n            requestRejection(runtimeConfig),\n            RuntimeType.smithyJson(codegenContext.runtimeConfig).resolve(\"deserialize::error::DeserializeError\"),\n        )\n}\n\nclass ServerRestXmlProtocol(\n    codegenContext: CodegenContext,\n) : RestXml(codegenContext), ServerProtocol {\n    val runtimeConfig = codegenContext.runtimeConfig\n    override val protocolModulePath = \"rest_xml\"\n\n    override fun markerStruct() = ServerRuntimeType.protocol(\"RestXml\", protocolModulePath, runtimeConfig)\n\n    override fun routerType() = restRouterType(runtimeConfig)\n\n    override fun serverRouterRequestSpec(\n        operationShape: OperationShape,\n        operationName: String,\n        serviceName: String,\n        requestSpecModule: RuntimeType,\n    ): Writable =\n        RestRequestSpecGenerator(httpBindingResolver, requestSpecModule, runtimeConfig).generate(operationShape)\n\n    override fun serverRouterRequestSpecType(requestSpecModule: RuntimeType): RuntimeType =\n        requestSpecModule.resolve(\"RequestSpec\")\n\n    override fun serverRouterRuntimeConstructor() = \"new_rest_xml_router\"\n\n    override fun serverContentTypeCheckNoModeledInput() = true\n\n    override fun deserializePayloadErrorType(binding: HttpBindingDescriptor): RuntimeType =\n        deserializePayloadErrorType(\n            codegenContext,\n            binding,\n            requestRejection(runtimeConfig),\n            RuntimeType.smithyXml(runtimeConfig).resolve(\"decode::XmlDecodeError\"),\n        )\n}\n\nclass ServerRpcV2CborProtocol(\n    private val serverCodegenContext: ServerCodegenContext,\n) : RpcV2Cbor(serverCodegenContext), ServerProtocol {\n    val runtimeConfig = codegenContext.runtimeConfig\n\n    override val protocolModulePath = \"rpc_v2_cbor\"\n\n    override fun structuredDataParser(): StructuredDataParserGenerator =\n        CborParserGenerator(\n            serverCodegenContext, httpBindingResolver, returnSymbolToParseFn(serverCodegenContext),\n            handleNullForNonSparseCollection = { collectionName: String ->\n                writable {\n                    rustTemplate(\n                        \"\"\"\n                        return #{Err}(#{Error}::custom(\"dense $collectionName cannot contain null values\", decoder.position()))\n                        \"\"\",\n                        *RuntimeType.preludeScope,\n                        \"Error\" to\n                            CargoDependency.smithyCbor(runtimeConfig).toType()\n                                .resolve(\"decode::DeserializeError\"),\n                    )\n                }\n            },\n            shouldWrapBuilderMemberSetterInputWithOption = { member: MemberShape ->\n                codegenContext.symbolProvider.toSymbol(member).isOptional()\n            },\n            listOf(\n                ServerRequestBeforeBoxingDeserializedMemberConvertToMaybeConstrainedCborParserCustomization(\n                    serverCodegenContext,\n                ),\n            ),\n        )\n\n    override fun structuredDataSerializer(): StructuredDataSerializerGenerator {\n        return CborSerializerGenerator(\n            codegenContext,\n            httpBindingResolver,\n            listOf(\n                BeforeEncodingMapOrCollectionCborCustomization(serverCodegenContext),\n                AddTypeFieldToServerErrorsCborCustomization(),\n                BeforeSerializingMemberCborCustomization(serverCodegenContext),\n            ),\n        )\n    }\n\n    override fun markerStruct() = ServerRuntimeType.protocol(\"RpcV2Cbor\", \"rpc_v2_cbor\", runtimeConfig)\n\n    override fun routerType() =\n        ServerCargoDependency.smithyHttpServer(runtimeConfig).toType()\n            .resolve(\"protocol::rpc_v2_cbor::router::RpcV2CborRouter\")\n\n    override fun serverRouterRequestSpec(\n        operationShape: OperationShape,\n        operationName: String,\n        serviceName: String,\n        requestSpecModule: RuntimeType,\n    ) = writable {\n        // This is just the key used by the router's map to store and look up operations, it's completely arbitrary.\n        // We use the same key used by the awsJson1.x routers for simplicity.\n        // The router will extract the service name and the operation name from the URI, build this key, and lookup the\n        // operation stored there.\n        rust(\"$serviceName.$operationName\".dq())\n    }\n\n    override fun serverRouterRequestSpecType(requestSpecModule: RuntimeType): RuntimeType = RuntimeType.StaticStr\n\n    override fun serverRouterRuntimeConstructor() = \"rpc_v2_router\"\n\n    override fun serverContentTypeCheckNoModeledInput() = false\n\n    override fun deserializePayloadErrorType(binding: HttpBindingDescriptor): RuntimeType =\n        deserializePayloadErrorType(\n            codegenContext,\n            binding,\n            requestRejection(runtimeConfig),\n            RuntimeType.smithyCbor(codegenContext.runtimeConfig).resolve(\"decode::DeserializeError\"),\n        )\n}\n\n/** Just a common function to keep things DRY. **/\nfun deserializePayloadErrorType(\n    codegenContext: CodegenContext,\n    binding: HttpBindingDescriptor,\n    requestRejection: RuntimeType,\n    protocolSerializationFormatError: RuntimeType,\n): RuntimeType {\n    check(binding.location == HttpLocation.PAYLOAD)\n\n    if (codegenContext.model.expectShape(binding.member.target) is StringShape) {\n        // The only way deserializing a string can fail is if the HTTP body does not contain valid UTF-8.\n        // TODO(https://github.com/smithy-lang/smithy-rs/issues/3750): we're returning an incorrect `RequestRejection` variant here.\n        return requestRejection\n    }\n\n    return protocolSerializationFormatError\n}\n\n/**\n * A customization to, just before we box a recursive member that we've deserialized from JSON into `Option<T>`, convert\n * it into `MaybeConstrained` if the target shape can reach a constrained shape.\n */\nclass ServerRequestBeforeBoxingDeserializedMemberConvertToMaybeConstrainedJsonParserCustomization(val codegenContext: ServerCodegenContext) :\n    JsonParserCustomization() {\n    override fun section(section: JsonParserSection): Writable =\n        when (section) {\n            is JsonParserSection.BeforeBoxingDeserializedMember ->\n                writable {\n                    // We're only interested in _structure_ member shapes that can reach constrained shapes.\n                    if (\n                        codegenContext.model.expectShape(section.shape.container) is StructureShape &&\n                        section.shape.targetCanReachConstrainedShape(codegenContext.model, codegenContext.symbolProvider)\n                    ) {\n                        rust(\".map(|x| x.into())\")\n                    }\n                }\n\n            else -> emptySection\n        }\n}\n\n/**\n * A customization to, just before we box a recursive member that we've deserialized from CBOR into `T` held in a\n * variable binding `v`, convert it into `MaybeConstrained` if the target shape can reach a constrained shape.\n */\nclass ServerRequestBeforeBoxingDeserializedMemberConvertToMaybeConstrainedCborParserCustomization(val codegenContext: ServerCodegenContext) :\n    CborParserCustomization() {\n    override fun section(section: CborParserSection): Writable =\n        when (section) {\n            is CborParserSection.BeforeBoxingDeserializedMember ->\n                writable {\n                    // We're only interested in _structure_ member shapes that can reach constrained shapes.\n                    if (\n                        codegenContext.model.expectShape(section.shape.container) is StructureShape &&\n                        section.shape.targetCanReachConstrainedShape(codegenContext.model, codegenContext.symbolProvider)\n                    ) {\n                        rust(\"let v = v.into();\")\n                    }\n                }\n            else -> emptySection\n        }\n}\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/protocol/ServerProtocolGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.generators.protocol\n\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.server.smithy.protocols.ServerHttpBoundProtocolTraitImplGenerator\n\nopen class ServerProtocolGenerator(\n    val protocol: ServerProtocol,\n    private val traitGenerator: ServerHttpBoundProtocolTraitImplGenerator,\n) {\n    /**\n     * The server implementation uses this method to generate implementations of the `from_request` and `into_response`\n     * traits for operation input and output shapes, respectively.\n     */\n    fun renderOperation(\n        operationWriter: RustWriter,\n        operationShape: OperationShape,\n    ) {\n        traitGenerator.generateTraitImpls(operationWriter, operationShape)\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/protocol/ServerProtocolTestGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.generators.protocol\n\nimport software.amazon.smithy.codegen.core.Symbol\nimport software.amazon.smithy.model.knowledge.TopDownIndex\nimport software.amazon.smithy.model.node.Node\nimport software.amazon.smithy.model.shapes.DoubleShape\nimport software.amazon.smithy.model.shapes.FloatShape\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.traits.ErrorTrait\nimport software.amazon.smithy.protocoltests.traits.AppliesTo\nimport software.amazon.smithy.protocoltests.traits.HttpMalformedRequestTestCase\nimport software.amazon.smithy.protocoltests.traits.HttpMalformedResponseBodyDefinition\nimport software.amazon.smithy.protocoltests.traits.HttpMalformedResponseDefinition\nimport software.amazon.smithy.protocoltests.traits.HttpRequestTestCase\nimport software.amazon.smithy.protocoltests.traits.HttpResponseTestCase\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustReservedWords\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.escape\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.withBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenContext\nimport software.amazon.smithy.rust.codegen.core.smithy.HttpVersion\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.protocol.BrokenTest\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.protocol.FailingTest\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.protocol.ProtocolSupport\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.protocol.ProtocolTestGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.protocol.ServiceShapeId.AWS_JSON_10\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.protocol.ServiceShapeId.AWS_JSON_11\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.protocol.ServiceShapeId.REST_JSON\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.protocol.ServiceShapeId.REST_JSON_VALIDATION\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.protocol.ServiceShapeId.RPC_V2_CBOR\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.protocol.ServiceShapeId.RPC_V2_CBOR_EXTRAS\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.protocol.TestCase\nimport software.amazon.smithy.rust.codegen.core.smithy.transformers.allErrors\nimport software.amazon.smithy.rust.codegen.core.util.dq\nimport software.amazon.smithy.rust.codegen.core.util.hasStreamingMember\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\nimport software.amazon.smithy.rust.codegen.core.util.inputShape\nimport software.amazon.smithy.rust.codegen.core.util.isStreaming\nimport software.amazon.smithy.rust.codegen.core.util.orNull\nimport software.amazon.smithy.rust.codegen.core.util.outputShape\nimport software.amazon.smithy.rust.codegen.core.util.toPascalCase\nimport software.amazon.smithy.rust.codegen.core.util.toSnakeCase\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerCargoDependency\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.ServerInstantiator\nimport java.util.logging.Logger\n\n/**\n * Generate server protocol tests for an [operationShape].\n */\nclass ServerProtocolTestGenerator(\n    override val codegenContext: CodegenContext,\n    override val protocolSupport: ProtocolSupport,\n    override val operationShape: OperationShape,\n) : ProtocolTestGenerator() {\n    companion object {\n        private val ExpectFail: Set<FailingTest> =\n            setOf(\n                // Endpoint trait is not implemented yet, see https://github.com/smithy-lang/smithy-rs/issues/950.\n                FailingTest.RequestTest(REST_JSON, \"RestJsonEndpointTrait\"),\n                FailingTest.RequestTest(REST_JSON, \"RestJsonEndpointTraitWithHostLabel\"),\n                FailingTest.RequestTest(REST_JSON, \"RestJsonOmitsEmptyListQueryValues\"),\n                FailingTest.ResponseTest(REST_JSON, \"RestJsonNullAndEmptyHeaders\"),\n                FailingTest.ResponseTest(REST_JSON, \"RestJsonHttpPayloadWithStructureAndEmptyResponseBody\"),\n                // Tests involving `@range` on floats.\n                // Pending resolution from the Smithy team, see https://github.com/smithy-lang/smithy-rs/issues/2007.\n                FailingTest.MalformedRequestTest(REST_JSON_VALIDATION, \"RestJsonMalformedRangeFloat_case0\"),\n                FailingTest.MalformedRequestTest(REST_JSON_VALIDATION, \"RestJsonMalformedRangeFloat_case1\"),\n                FailingTest.MalformedRequestTest(REST_JSON_VALIDATION, \"RestJsonMalformedRangeMaxFloat\"),\n                FailingTest.MalformedRequestTest(REST_JSON_VALIDATION, \"RestJsonMalformedRangeMinFloat\"),\n                // Tests involving floating point shapes and the `@range` trait; see https://github.com/smithy-lang/smithy-rs/issues/2007\n                FailingTest.MalformedRequestTest(REST_JSON_VALIDATION, \"RestJsonMalformedRangeFloatOverride_case0\"),\n                FailingTest.MalformedRequestTest(REST_JSON_VALIDATION, \"RestJsonMalformedRangeFloatOverride_case1\"),\n                FailingTest.MalformedRequestTest(REST_JSON_VALIDATION, \"RestJsonMalformedRangeMaxFloatOverride\"),\n                FailingTest.MalformedRequestTest(REST_JSON_VALIDATION, \"RestJsonMalformedRangeMinFloatOverride\"),\n                // Some tests for the S3 service (restXml).\n                FailingTest.ResponseTest(\"com.amazonaws.s3#AmazonS3\", \"GetBucketLocationUnwrappedOutput\"),\n                FailingTest.RequestTest(\"com.amazonaws.s3#AmazonS3\", \"S3DefaultAddressing\"),\n                FailingTest.RequestTest(\"com.amazonaws.s3#AmazonS3\", \"S3VirtualHostAddressing\"),\n                FailingTest.RequestTest(\"com.amazonaws.s3#AmazonS3\", \"S3PathAddressing\"),\n                FailingTest.RequestTest(\"com.amazonaws.s3#AmazonS3\", \"S3VirtualHostDualstackAddressing\"),\n                FailingTest.RequestTest(\"com.amazonaws.s3#AmazonS3\", \"S3VirtualHostAccelerateAddressing\"),\n                FailingTest.RequestTest(\"com.amazonaws.s3#AmazonS3\", \"S3VirtualHostDualstackAccelerateAddressing\"),\n                FailingTest.RequestTest(\"com.amazonaws.s3#AmazonS3\", \"S3OperationAddressingPreferred\"),\n                FailingTest.ResponseTest(\"com.amazonaws.s3#AmazonS3\", \"S3OperationNoErrorWrappingResponse\"),\n                // AwsJson1.0 failing tests.\n                FailingTest.RequestTest(\"aws.protocoltests.json10#JsonRpc10\", \"AwsJson10EndpointTraitWithHostLabel\"),\n                FailingTest.RequestTest(\"aws.protocoltests.json10#JsonRpc10\", \"AwsJson10EndpointTrait\"),\n                // AwsJson1.1 failing tests.\n                FailingTest.RequestTest(AWS_JSON_11, \"AwsJson11EndpointTraitWithHostLabel\"),\n                FailingTest.RequestTest(AWS_JSON_11, \"AwsJson11EndpointTrait\"),\n                FailingTest.ResponseTest(AWS_JSON_11, \"parses_the_request_id_from_the_response\"),\n                // TODO(https://github.com/awslabs/smithy/issues/1683): This has been marked as failing until resolution of said issue\n                FailingTest.MalformedRequestTest(REST_JSON_VALIDATION, \"RestJsonMalformedUniqueItemsBlobList\"),\n                FailingTest.MalformedRequestTest(REST_JSON_VALIDATION, \"RestJsonMalformedUniqueItemsBooleanList_case0\"),\n                FailingTest.MalformedRequestTest(REST_JSON_VALIDATION, \"RestJsonMalformedUniqueItemsBooleanList_case1\"),\n                FailingTest.MalformedRequestTest(REST_JSON_VALIDATION, \"RestJsonMalformedUniqueItemsStringList\"),\n                FailingTest.MalformedRequestTest(REST_JSON_VALIDATION, \"RestJsonMalformedUniqueItemsByteList\"),\n                FailingTest.MalformedRequestTest(REST_JSON_VALIDATION, \"RestJsonMalformedUniqueItemsShortList\"),\n                FailingTest.MalformedRequestTest(REST_JSON_VALIDATION, \"RestJsonMalformedUniqueItemsIntegerList\"),\n                FailingTest.MalformedRequestTest(REST_JSON_VALIDATION, \"RestJsonMalformedUniqueItemsLongList\"),\n                FailingTest.MalformedRequestTest(REST_JSON_VALIDATION, \"RestJsonMalformedUniqueItemsTimestampList\"),\n                FailingTest.MalformedRequestTest(REST_JSON_VALIDATION, \"RestJsonMalformedUniqueItemsDateTimeList\"),\n                FailingTest.MalformedRequestTest(\n                    REST_JSON_VALIDATION,\n                    \"RestJsonMalformedUniqueItemsHttpDateList_case0\",\n                ),\n                FailingTest.MalformedRequestTest(\n                    REST_JSON_VALIDATION,\n                    \"RestJsonMalformedUniqueItemsHttpDateList_case1\",\n                ),\n                FailingTest.MalformedRequestTest(REST_JSON_VALIDATION, \"RestJsonMalformedUniqueItemsEnumList\"),\n                FailingTest.MalformedRequestTest(REST_JSON_VALIDATION, \"RestJsonMalformedUniqueItemsIntEnumList\"),\n                FailingTest.MalformedRequestTest(REST_JSON_VALIDATION, \"RestJsonMalformedUniqueItemsListList\"),\n                FailingTest.MalformedRequestTest(REST_JSON_VALIDATION, \"RestJsonMalformedUniqueItemsStructureList\"),\n                FailingTest.MalformedRequestTest(REST_JSON_VALIDATION, \"RestJsonMalformedUniqueItemsUnionList_case0\"),\n                FailingTest.MalformedRequestTest(REST_JSON_VALIDATION, \"RestJsonMalformedUniqueItemsUnionList_case1\"),\n                // TODO(https://github.com/smithy-lang/smithy-rs/issues/2472): We don't respect the `@internal` trait\n                FailingTest.MalformedRequestTest(REST_JSON_VALIDATION, \"RestJsonMalformedEnumList_case0\"),\n                FailingTest.MalformedRequestTest(REST_JSON_VALIDATION, \"RestJsonMalformedEnumList_case1\"),\n                FailingTest.MalformedRequestTest(REST_JSON_VALIDATION, \"RestJsonMalformedEnumMapKey_case0\"),\n                FailingTest.MalformedRequestTest(REST_JSON_VALIDATION, \"RestJsonMalformedEnumMapKey_case1\"),\n                FailingTest.MalformedRequestTest(REST_JSON_VALIDATION, \"RestJsonMalformedEnumMapValue_case0\"),\n                FailingTest.MalformedRequestTest(REST_JSON_VALIDATION, \"RestJsonMalformedEnumMapValue_case1\"),\n                FailingTest.MalformedRequestTest(REST_JSON_VALIDATION, \"RestJsonMalformedEnumString_case0\"),\n                FailingTest.MalformedRequestTest(REST_JSON_VALIDATION, \"RestJsonMalformedEnumString_case1\"),\n                FailingTest.MalformedRequestTest(REST_JSON_VALIDATION, \"RestJsonMalformedEnumUnion_case0\"),\n                FailingTest.MalformedRequestTest(REST_JSON_VALIDATION, \"RestJsonMalformedEnumUnion_case1\"),\n                // TODO(https://github.com/awslabs/smithy/issues/1737): Specs on @internal, @tags, and enum values need to be clarified\n                FailingTest.MalformedRequestTest(REST_JSON_VALIDATION, \"RestJsonMalformedEnumTraitString_case0\"),\n                FailingTest.MalformedRequestTest(REST_JSON_VALIDATION, \"RestJsonMalformedEnumTraitString_case1\"),\n                FailingTest.MalformedRequestTest(\n                    REST_JSON,\n                    \"RestJsonWithoutBodyEmptyInputExpectsEmptyContentType\",\n                ),\n                // These tests are broken because they are missing a target header.\n                FailingTest.RequestTest(AWS_JSON_10, \"AwsJson10ServerPopulatesNestedDefaultsWhenMissingInRequestBody\"),\n                FailingTest.RequestTest(AWS_JSON_10, \"AwsJson10ServerPopulatesDefaultsWhenMissingInRequestBody\"),\n                FailingTest.ResponseTest(AWS_JSON_11, \"AwsJson11IntEnums\"),\n                // For the following 4 tests, response defaults are not set when builders are not used\n                // https://github.com/smithy-lang/smithy-rs/issues/3339\n                FailingTest.ResponseTest(AWS_JSON_10, \"AwsJson10ServerPopulatesDefaultsInResponseWhenMissingInParams\"),\n                FailingTest.ResponseTest(\n                    AWS_JSON_10,\n                    \"AwsJson10ServerPopulatesNestedDefaultValuesWhenMissingInInResponseParams\",\n                ),\n                // TODO(https://github.com/smithy-lang/smithy-rs/issues/3723): This affects all protocols\n                FailingTest.MalformedRequestTest(RPC_V2_CBOR_EXTRAS, \"AdditionalTokensEmptyStruct\"),\n                // TODO(https://github.com/smithy-lang/smithy-rs/issues/3339)\n                FailingTest.ResponseTest(RPC_V2_CBOR, \"RpcV2CborServerPopulatesDefaultsInResponseWhenMissingInParams\"),\n                FailingTest.ResponseTest(REST_JSON, \"RestJsonServerPopulatesDefaultsInResponseWhenMissingInParams\"),\n                FailingTest.ResponseTest(\n                    REST_JSON,\n                    \"RestJsonServerPopulatesNestedDefaultValuesWhenMissingInInResponseParams\",\n                ),\n                // TODO(https://github.com/smithy-lang/smithy-rs/issues/3743): We need to be able to configure\n                //  instantiator so that it uses default _modeled_ values; `\"\"` is not a valid enum value for `defaultEnum`.\n                FailingTest.RequestTest(RPC_V2_CBOR, \"RpcV2CborServerPopulatesDefaultsWhenMissingInRequestBody\"),\n                // TODO(https://github.com/smithy-lang/smithy-rs/issues/3735): Null `Document` may come through a request even though its shape is `@required`\n                FailingTest.RequestTest(REST_JSON, \"RestJsonServerPopulatesDefaultsWhenMissingInRequestBody\"),\n                // TODO(https://github.com/smithy-lang/smithy-rs/issues/4184): Issue in both Client and Server with httpPrefixHeaders\n                FailingTest.ResponseTest(REST_JSON, \"RestJsonHttpEmptyPrefixHeadersResponseServer\"),\n            )\n\n        private val BrokenTests:\n            Set<BrokenTest> =\n            setOf(\n                BrokenTest.MalformedRequestTest(\n                    REST_JSON_VALIDATION,\n                    \"RestJsonMalformedPatternReDOSString\",\n                    howToFixItFn = ::fixRestJsonMalformedPatternReDOSString,\n                    inAtLeast = setOf(\"1.26.2\", \"1.49.0\"),\n                    trackedIn =\n                        setOf(\n                            // TODO(https://github.com/awslabs/smithy/issues/1506)\n                            \"https://github.com/awslabs/smithy/issues/1506\",\n                            // TODO(https://github.com/smithy-lang/smithy/pull/2340)\n                            \"https://github.com/smithy-lang/smithy/pull/2340\",\n                        ),\n                ),\n            )\n\n        private val DisabledTests =\n            setOf<String>(\n                // TODO(https://github.com/smithy-lang/smithy-rs/issues/2891): Implement support for `@requestCompression`\n                \"SDKAppendedGzipAfterProvidedEncoding_restJson1\",\n                \"SDKAppendedGzipAfterProvidedEncoding_restXml\",\n                \"SDKAppendsGzipAndIgnoresHttpProvidedEncoding_awsJson1_0\",\n                \"SDKAppendsGzipAndIgnoresHttpProvidedEncoding_awsJson1_1\",\n                \"SDKAppendsGzipAndIgnoresHttpProvidedEncoding_awsQuery\",\n                \"SDKAppendsGzipAndIgnoresHttpProvidedEncoding_ec2Query\",\n                \"SDKAppliedContentEncoding_awsJson1_0\",\n                \"SDKAppliedContentEncoding_awsJson1_1\",\n                \"SDKAppliedContentEncoding_awsQuery\",\n                \"SDKAppliedContentEncoding_ec2Query\",\n                \"SDKAppliedContentEncoding_restJson1\",\n                \"SDKAppliedContentEncoding_restXml\",\n                // RestXml S3 tests that fail to compile\n                \"S3EscapeObjectKeyInUriLabel\",\n                \"S3EscapePathObjectKeyInUriLabel\",\n                \"S3PreservesLeadingDotSegmentInUriLabel\",\n                \"S3PreservesEmbeddedDotSegmentInUriLabel\",\n            )\n\n        private fun fixRestJsonMalformedPatternReDOSString(\n            testCase: TestCase.MalformedRequestTest,\n        ): TestCase.MalformedRequestTest {\n            val brokenResponse = testCase.testCase.response\n            val brokenBody = brokenResponse.body.get()\n            val fixedBody =\n                HttpMalformedResponseBodyDefinition.builder()\n                    .mediaType(brokenBody.mediaType)\n                    .contents(\n                        \"\"\"\n                        {\n                            \"message\" : \"1 validation error detected. Value at '/evilString' failed to satisfy constraint: Member must satisfy regular expression pattern: ^([0-9]+)+${'$'}\",\n                            \"fieldList\" : [{\"message\": \"Value at '/evilString' failed to satisfy constraint: Member must satisfy regular expression pattern: ^([0-9]+)+${'$'}\", \"path\": \"/evilString\"}]\n                        }\n                        \"\"\".trimIndent(),\n                    )\n                    .build()\n\n            return TestCase.MalformedRequestTest(\n                testCase.testCase.toBuilder()\n                    .response(brokenResponse.toBuilder().body(fixedBody).build())\n                    .build(),\n            )\n        }\n    }\n\n    override val appliesTo: AppliesTo\n        get() = AppliesTo.SERVER\n    override val expectFail: Set<FailingTest>\n        get() = ExpectFail\n    override val brokenTests: Set<BrokenTest>\n        get() = BrokenTests\n    override val generateOnly: Set<String>\n        get() = emptySet()\n    override val disabledTests: Set<String>\n        get() = DisabledTests\n\n    override val logger: Logger = Logger.getLogger(javaClass.name)\n\n    private val model = codegenContext.model\n    private val symbolProvider = codegenContext.symbolProvider\n    private val operationSymbol = symbolProvider.toSymbol(operationShape)\n\n    private val serviceName = codegenContext.serviceShape.id.name.toPascalCase()\n    private val operations =\n        TopDownIndex.of(codegenContext.model).getContainedOperations(codegenContext.serviceShape).sortedBy { it.id }\n\n    private val operationInputOutputTypes =\n        operations.associateWith {\n            val inputSymbol = symbolProvider.toSymbol(it.inputShape(model))\n            val outputSymbol = symbolProvider.toSymbol(it.outputShape(model))\n            val operationSymbol = symbolProvider.toSymbol(it)\n\n            val inputT = inputSymbol.fullName\n            val t = outputSymbol.fullName\n            val outputT =\n                if (it.errors.isEmpty()) {\n                    t\n                } else {\n                    val errorType = RuntimeType(\"crate::error::${operationSymbol.name}Error\")\n                    val e = errorType.fullyQualifiedName()\n                    \"Result<$t, $e>\"\n                }\n\n            inputT to outputT\n        }\n\n    private val instantiator = ServerInstantiator(codegenContext, withinTest = true)\n\n    /**\n     * Returns the protocol test dependency with the correct HTTP version feature.\n     * For HTTP 0.x: uses http-02x feature (default).\n     * For HTTP 1.x: uses http-1x feature.\n     */\n    private val protocolTestRuntimeType =\n        when (codegenContext.runtimeConfig.httpVersion) {\n            HttpVersion.Http1x ->\n                CargoDependency.smithyProtocolTestHelpers(codegenContext.runtimeConfig)\n                    .withFeature(\"http-1x\")\n                    .toType()\n\n            HttpVersion.Http0x ->\n                CargoDependency.smithyProtocolTestHelpers(codegenContext.runtimeConfig).toType()\n        }\n\n    private val codegenScope =\n        arrayOf(\n            \"AssertEq\" to RuntimeType.PrettyAssertions.resolve(\"assert_eq!\"),\n            \"Base64SimdDev\" to ServerCargoDependency.Base64SimdDev.toType(),\n            \"Bytes\" to RuntimeType.Bytes,\n            \"Http\" to RuntimeType.http(codegenContext.runtimeConfig),\n            \"Hyper\" to RuntimeType.hyper(codegenContext.runtimeConfig),\n            \"MediaType\" to protocolTestRuntimeType.resolve(\"MediaType\"),\n            \"Tokio\" to ServerCargoDependency.TokioDev.toType(),\n            \"Tower\" to RuntimeType.Tower,\n            \"SmithyHttpServer\" to ServerCargoDependency.smithyHttpServer(codegenContext.runtimeConfig).toType(),\n            \"decode_body_data\" to protocolTestRuntimeType.resolve(\"decode_body_data\"),\n        )\n\n    override fun RustWriter.renderAllTestCases(allTests: List<TestCase>) {\n        for (it in allTests) {\n            renderTestCaseBlock(it, this) {\n                when (it) {\n                    is TestCase.RequestTest -> this.renderHttpRequestTestCase(it.testCase)\n                    is TestCase.ResponseTest -> this.renderHttpResponseTestCase(it.testCase, it.targetShape)\n                    is TestCase.MalformedRequestTest -> this.renderHttpMalformedRequestTestCase(it.testCase)\n                }\n            }\n        }\n    }\n\n    /**\n     * Renders an HTTP request test case.\n     * We are given an HTTP request in the test case, and we assert that when we deserialize said HTTP request into\n     * an operation's input shape, the resulting shape is of the form we expect, as defined in the test case.\n     */\n    private fun RustWriter.renderHttpRequestTestCase(httpRequestTestCase: HttpRequestTestCase) {\n        logger.info(\"Generating request test: ${httpRequestTestCase.id}\")\n\n        if (!protocolSupport.requestDeserialization) {\n            rust(\"/* test case disabled for this protocol (not yet supported) */\")\n            return\n        }\n\n        with(httpRequestTestCase) {\n            renderHttpRequest(\n                uri,\n                method,\n                headers,\n                body.orNull(),\n                bodyMediaType.orNull(),\n                queryParams,\n                host.orNull(),\n            )\n        }\n        if (protocolSupport.requestBodyDeserialization) {\n            makeRequest(operationShape, operationSymbol, this, checkRequestHandler(operationShape, httpRequestTestCase))\n            checkHandlerWasEntered(this)\n        }\n\n        // Explicitly warn if the test case defined parameters that we aren't doing anything with.\n        with(httpRequestTestCase) {\n            if (authScheme.isPresent) {\n                logger.warning(\"Test case provided authScheme but this was ignored\")\n            }\n            if (!httpRequestTestCase.vendorParams.isEmpty) {\n                logger.warning(\"Test case provided vendorParams but these were ignored\")\n            }\n        }\n    }\n\n    /**\n     * Renders an HTTP response test case.\n     * We are given an operation output shape or an error shape in the `params` field, and we assert that when we\n     * serialize said shape, the resulting HTTP response is of the form we expect, as defined in the test case.\n     * [shape] is either an operation output shape or an error shape.\n     */\n    private fun RustWriter.renderHttpResponseTestCase(\n        testCase: HttpResponseTestCase,\n        shape: StructureShape,\n    ) {\n        logger.info(\"Generating response test: ${testCase.id}\")\n\n        val operationErrorName = \"crate::error::${operationSymbol.name}Error\"\n\n        if (!protocolSupport.responseSerialization || (\n                !protocolSupport.errorSerialization && shape.hasTrait<ErrorTrait>()\n            )\n        ) {\n            rust(\"/* test case disabled for this protocol (not yet supported) */\")\n            return\n        }\n        writeInline(\"let output =\")\n        instantiator.render(this, shape, testCase.params)\n        rust(\";\")\n        if (operationShape.allErrors(model).isNotEmpty() && shape.hasTrait<ErrorTrait>()) {\n            val variant = symbolProvider.toSymbol(shape).name\n            rust(\"let output = $operationErrorName::$variant(output);\")\n        }\n        rustTemplate(\n            \"\"\"\n            use #{SmithyHttpServer}::response::IntoResponse;\n            let http_response = output.into_response();\n            \"\"\",\n            *codegenScope,\n        )\n        checkResponse(this, testCase)\n    }\n\n    /**\n     * Renders an HTTP malformed request test case.\n     * We are given a request definition and a response definition, and we have to assert that the request is rejected\n     * with the given response.\n     */\n    private fun RustWriter.renderHttpMalformedRequestTestCase(testCase: HttpMalformedRequestTestCase) {\n        logger.info(\"Generating malformed request test: ${testCase.id}\")\n\n        val (_, outputT) = operationInputOutputTypes[operationShape]!!\n\n        val panicMessage = \"request should have been rejected, but we accepted it; we parsed operation input `{:?}`\"\n\n        rustBlock(\"\") {\n            with(testCase.request) {\n                // TODO(https://github.com/awslabs/smithy/issues/1102): `uri` should probably not be an `Optional`.\n                renderHttpRequest(\n                    uri.get(),\n                    method,\n                    headers,\n                    body.orNull(),\n                    bodyMediaType.orNull(),\n                    queryParams,\n                    host.orNull(),\n                )\n            }\n\n            makeRequest(\n                operationShape,\n                operationSymbol,\n                this,\n                writable(\"\"\"panic!(\"$panicMessage\", &input) as $outputT\"\"\"),\n            )\n            checkResponse(this, testCase.response)\n        }\n    }\n\n    private fun RustWriter.renderHttpRequest(\n        uri: String,\n        method: String,\n        headers: Map<String, String>,\n        body: String?,\n        bodyMediaType: String?,\n        queryParams: List<String>,\n        host: String?,\n    ) {\n        rustTemplate(\n            \"\"\"\n            ##[allow(unused_mut)]\n            let mut http_request = #{Http}::Request::builder()\n                .uri(\"$uri\")\n                .method(\"$method\")\n            \"\"\",\n            *codegenScope,\n        )\n        for (header in headers) {\n            rust(\".header(${header.key.dq()}, ${header.value.dq()})\")\n        }\n\n        // Determine if we need Sync bounds for the body (streaming operations)\n        val needsSync = operationShape.inputShape(model).hasStreamingMember(model)\n\n        val bodyCode =\n            if (body != null) {\n                // The `replace` is necessary to fix the malformed request test `RestJsonInvalidJsonBody`.\n                // https://github.com/awslabs/smithy/blob/887ae4f6d118e55937105583a07deb90d8fabe1c/smithy-aws-protocol-tests/model/restJson1/malformedRequests/malformed-request-body.smithy#L47\n                //\n                // Smithy is written in Java, which parses `\\u000c` within a `String` as a single char given by the\n                // corresponding Unicode code point. That is the \"form feed\" 0x0c character. When printing it,\n                // it gets written as \"\\f\", which is an invalid Rust escape sequence: https://static.rust-lang.org/doc/master/reference.html#literals\n                // So we need to write the corresponding Rust Unicode escape sequence to make the program compile.\n                //\n                // We also escape to avoid interactions with templating in the case where the body contains `#`.\n                val sanitizedBody = escape(body.replace(\"\\u000c\", \"\\\\u{000c}\")).dq()\n\n                val encodedBodyTemplate = \"\"\"\n                #{Bytes}::copy_from_slice(\n                    &#{decode_body_data}($sanitizedBody.as_bytes(), #{MediaType}::from(${(bodyMediaType ?: \"unknown\").dq()}))\n                )\n                \"\"\"\n\n                requestBodyConstructor(encodedBodyTemplate, needsSync)\n            } else {\n                requestBodyConstructor(null, needsSync)\n            }\n\n        rustTemplate(\n            \"\"\"\n             .body(#{BodyCode}).unwrap();\n             \"\"\",\n            *codegenScope,\n            \"BodyCode\" to bodyCode,\n        )\n        if (queryParams.isNotEmpty()) {\n            val queryParamsString = queryParams.joinToString(separator = \"&\")\n            rust(\"\"\"*http_request.uri_mut() = \"$uri?$queryParamsString\".parse().unwrap();\"\"\")\n        }\n        if (host != null) {\n            rust(\"\"\"todo!(\"endpoint trait not supported yet\");\"\"\")\n        }\n    }\n\n    /**\n     * Returns code for creating an HTTP request body in protocol tests.\n     * For HTTP 0.x: uses Body::from(bytes) or Body::empty()\n     * For HTTP 1.x: boxes the body since protocol tests need type erasure\n     *               to unify different body implementations (Full, Empty, etc.)\n     *               Note: While hyper::body::Incoming exists for receiving bodies,\n     *               protocol tests construct bodies from test data.\n     *\n     * @param bytesExpr Expression for the bytes to put in the body, or null for empty body\n     * @param needsSync If true, uses boxed_sync for operations that require Sync bounds\n     */\n    private fun requestBodyConstructor(\n        bytesExpr: String?,\n        needsSync: Boolean = false,\n    ) = writable {\n        val runtimeConfig = codegenContext.runtimeConfig\n        val serverCrate = ServerCargoDependency.smithyHttpServer(runtimeConfig).toType()\n\n        if (runtimeConfig.httpVersion == software.amazon.smithy.rust.codegen.core.smithy.HttpVersion.Http1x) {\n            val bodyUtil = software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency.HttpBodyUtil01x.toType()\n\n            val boxFn = if (needsSync) \"boxed_sync\" else \"boxed\"\n            if (bytesExpr != null) {\n                rustTemplate(\n                    \"#{BoxFn}(#{Full}::new($bytesExpr))\",\n                    \"BoxFn\" to serverCrate.resolve(\"body::$boxFn\"),\n                    \"Full\" to bodyUtil.resolve(\"Full\"),\n                    *codegenScope,\n                )\n            } else {\n                rustTemplate(\n                    \"#{BoxFn}(#{Empty}::new())\",\n                    \"BoxFn\" to serverCrate.resolve(\"body::$boxFn\"),\n                    \"Empty\" to bodyUtil.resolve(\"Empty\"),\n                    *codegenScope,\n                )\n            }\n        } else {\n            // HTTP 0.x: use Body::from or Body::empty\n            if (bytesExpr != null) {\n                rustTemplate(\n                    \"#{BodyFrom}($bytesExpr)\",\n                    \"BodyFrom\" to serverCrate.resolve(\"body::Body::from\"),\n                    *codegenScope,\n                )\n            } else {\n                rustTemplate(\n                    \"#{Empty}()\",\n                    \"Empty\" to serverCrate.resolve(\"body::Body::empty\"),\n                    *codegenScope,\n                )\n            }\n        }\n    }\n\n    /** Returns the body of the operation handler in a request test. */\n    private fun checkRequestHandler(\n        operationShape: OperationShape,\n        httpRequestTestCase: HttpRequestTestCase,\n    ) = writable {\n        val inputShape = operationShape.inputShape(codegenContext.model)\n        val outputShape = operationShape.outputShape(codegenContext.model)\n\n        // Construct expected operation input.\n        withBlock(\"let expected = \", \";\") {\n            instantiator.render(this, inputShape, httpRequestTestCase.params, httpRequestTestCase.headers)\n        }\n\n        checkRequestParams(inputShape, this)\n\n        // Construct a dummy response.\n        withBlock(\"let output = \", \";\") {\n            instantiator.render(this, outputShape, Node.objectNode())\n        }\n\n        if (operationShape.errors.isEmpty()) {\n            rust(\"output\")\n        } else {\n            rust(\"Ok(output)\")\n        }\n    }\n\n    /** Checks the request. */\n    private fun makeRequest(\n        operationShape: OperationShape,\n        operationSymbol: Symbol,\n        rustWriter: RustWriter,\n        body: Writable,\n    ) {\n        val (inputT, _) = operationInputOutputTypes[operationShape]!!\n        val operationName = RustReservedWords.escapeIfNeeded(operationSymbol.name.toSnakeCase())\n\n        val inputShape = operationShape.inputShape(model)\n        val needsSync = inputShape.hasStreamingMember(model)\n\n        rustWriter.rustTemplate(\n            \"\"\"\n            ##[allow(unused_mut)]\n            let (sender, mut receiver) = #{Tokio}::sync::mpsc::channel(1);\n            let config = crate::service::${serviceName}Config::builder().build();\n            let service = crate::service::$serviceName::builder::<#{BodyType}, _, _, _>(config)\n                .$operationName(move |input: $inputT| {\n                    let sender = sender.clone();\n                    async move {\n                        let result = { #{Body:W} };\n                        sender.send(()).await.expect(\"receiver dropped early\");\n                        result\n                    }\n                })\n                .build_unchecked();\n            let http_response = #{Tower}::ServiceExt::oneshot(service, http_request)\n                .await\n                .expect(\"unable to make an HTTP request\");\n            \"\"\",\n            \"Body\" to body,\n            \"BodyType\" to serviceBuilderBodyType(needsSync),\n            *codegenScope,\n        )\n    }\n\n    private fun checkHandlerWasEntered(rustWriter: RustWriter) {\n        rustWriter.rust(\n            \"\"\"\n            assert!(receiver.recv().await.is_some(), \"we expected operation handler to be invoked but it was not entered\");\n            \"\"\",\n        )\n    }\n\n    private fun checkRequestParams(\n        inputShape: StructureShape,\n        rustWriter: RustWriter,\n    ) {\n        if (inputShape.hasStreamingMember(model)) {\n            // A streaming shape does not implement `PartialEq`, so we have to iterate over the input shape's members\n            // and handle the equality assertion separately.\n            for (member in inputShape.members()) {\n                val memberName = codegenContext.symbolProvider.toMemberName(member)\n                if (member.isStreaming(codegenContext.model)) {\n                    rustWriter.rustTemplate(\n                        \"\"\"\n                        #{AssertEq}(\n                            input.$memberName.collect().await.unwrap().into_bytes(),\n                            expected.$memberName.collect().await.unwrap().into_bytes()\n                        );\n                        \"\"\",\n                        *codegenScope,\n                    )\n                } else {\n                    rustWriter.rustTemplate(\n                        \"\"\"\n                        #{AssertEq}(input.$memberName, expected.$memberName, \"Unexpected value for `$memberName`\");\n                        \"\"\",\n                        *codegenScope,\n                    )\n                }\n            }\n        } else {\n            val hasFloatingPointMembers =\n                inputShape.members().any {\n                    val target = model.expectShape(it.target)\n                    (target is DoubleShape) || (target is FloatShape)\n                }\n\n            // TODO(https://github.com/smithy-lang/smithy-rs/issues/1147) Handle the case of nested floating point members.\n            if (hasFloatingPointMembers) {\n                for (member in inputShape.members()) {\n                    val memberName = codegenContext.symbolProvider.toMemberName(member)\n                    when (codegenContext.model.expectShape(member.target)) {\n                        is DoubleShape, is FloatShape -> {\n                            rustWriter.addUseImports(\n                                protocolTestRuntimeType.resolve(\"FloatEquals\")\n                                    .toSymbol(),\n                            )\n                            rustWriter.rust(\n                                \"\"\"\n                                assert!(input.$memberName.float_equals(&expected.$memberName),\n                                    \"Unexpected value for `$memberName` {:?} vs. {:?}\", expected.$memberName, input.$memberName);\n                                \"\"\",\n                            )\n                        }\n\n                        else -> {\n                            rustWriter.rustTemplate(\n                                \"\"\"\n                                #{AssertEq}(input.$memberName, expected.$memberName, \"Unexpected value for `$memberName`\");\n                                \"\"\",\n                                *codegenScope,\n                            )\n                        }\n                    }\n                }\n            } else {\n                rustWriter.rustTemplate(\"#{AssertEq}(input, expected);\", *codegenScope)\n            }\n        }\n    }\n\n    private fun checkResponse(\n        rustWriter: RustWriter,\n        testCase: HttpResponseTestCase,\n    ) {\n        checkStatusCode(rustWriter, testCase.code)\n        checkHeaders(rustWriter, \"http_response.headers()\", testCase.headers)\n        checkForbidHeaders(rustWriter, \"http_response.headers()\", testCase.forbidHeaders)\n        checkRequiredHeaders(rustWriter, \"http_response.headers()\", testCase.requireHeaders)\n\n        // We can't check that the `OperationExtension` is set in the response, because it is set in the implementation\n        // of the operation `Handler` trait, a code path that does not get exercised when we don't have a request to\n        // invoke it with (like in the case of an `httpResponseTest` test case).\n        // In https://github.com/smithy-lang/smithy-rs/pull/1708: We did change `httpResponseTest`s generation to `call()`\n        // the operation handler trait implementation instead of directly calling `from_request()`.\n\n        // If no request body is defined, then no assertions are made about the body of the message.\n        if (testCase.body.isPresent) {\n            checkBody(rustWriter, testCase.body.get(), testCase.bodyMediaType.orNull())\n        }\n    }\n\n    private fun checkResponse(\n        rustWriter: RustWriter,\n        testCase: HttpMalformedResponseDefinition,\n    ) {\n        checkStatusCode(rustWriter, testCase.code)\n        checkHeaders(rustWriter, \"http_response.headers()\", testCase.headers)\n\n        // We can't check that the `OperationExtension` is set in the response, because it is set in the implementation\n        // of the operation `Handler` trait, a code path that does not get exercised when we don't have a request to\n        // invoke it with (like in the case of an `httpResponseTest` test case).\n        // In https://github.com/smithy-lang/smithy-rs/pull/1708: We did change `httpResponseTest`s generation to `call()`\n        // the operation handler trait implementation instead of directly calling `from_request()`.\n\n        // If no request body is defined, then no assertions are made about the body of the message.\n        if (testCase.body.isEmpty) return\n\n        val httpMalformedResponseBodyDefinition = testCase.body.get()\n        // From https://smithy.io/2.0/additional-specs/http-protocol-compliance-tests.html#httpmalformedresponsebodyassertion\n        //\n        //     A union describing the assertion to run against the response body. As it is a union, exactly one\n        //     member must be set.\n        //\n        if (httpMalformedResponseBodyDefinition.contents.isPresent) {\n            checkBody(\n                rustWriter,\n                httpMalformedResponseBodyDefinition.contents.get(),\n                httpMalformedResponseBodyDefinition.mediaType,\n            )\n        } else {\n            check(httpMalformedResponseBodyDefinition.messageRegex.isPresent)\n            // There aren't any restJson1 protocol tests that make use of `messageRegex`.\n            TODO(\"`messageRegex` handling not yet implemented\")\n        }\n    }\n\n    /**\n     * Returns the body type to use for service builder in protocol tests.\n     * For HTTP 0.x: uses hyper::body::Body (concrete type).\n     * For HTTP 1.x: uses smithy BoxBody (no Sync requirement for protocol tests).\n     */\n    private fun serviceBuilderBodyType(needsSync: Boolean): RuntimeType =\n        when (codegenContext.runtimeConfig.httpVersion) {\n            HttpVersion.Http1x ->\n                // HTTP 1.x: use BoxBodySync for streaming operations that need Sync\n                if (needsSync) {\n                    ServerCargoDependency.smithyHttpServer(codegenContext.runtimeConfig).toType().resolve(\"body::BoxBodySync\")\n                } else {\n                    ServerCargoDependency.smithyHttpServer(codegenContext.runtimeConfig).toType().resolve(\"body::BoxBody\")\n                }\n\n            HttpVersion.Http0x ->\n                // HTTP 0.x: use hyper::body::Body (concrete type)\n                RuntimeType.Hyper0x.resolve(\"body::Body\")\n        }\n\n    /**\n     * Returns a Writable that generates version-appropriate code for reading HTTP response body to bytes.\n     * For HTTP 1.x: Uses http_body_util::BodyExt::collect()\n     * For HTTP 0.x: Uses hyper::body::to_bytes()\n     *\n     * @param responseVarName The name of the HTTP response variable (e.g., \"http_response\")\n     */\n    private fun httpBodyToBytes(): Writable =\n        writable {\n            when (codegenContext.runtimeConfig.httpVersion) {\n                HttpVersion.Http1x ->\n                    rustTemplate(\n                        \"\"\"\n                        use #{HttpBodyUtil}::BodyExt;\n                        let body = http_response.into_body().collect().await.expect(\"unable to collect body\").to_bytes();\n                        \"\"\",\n                        \"HttpBodyUtil\" to CargoDependency.HttpBodyUtil01x.toType(),\n                    )\n\n                HttpVersion.Http0x ->\n                    rustTemplate(\n                        \"\"\"\n                        let body = #{Hyper}::body::to_bytes(http_response.into_body()).await.expect(\"unable to extract body to bytes\");\n                        \"\"\",\n                        \"Hyper\" to RuntimeType.Hyper0x,\n                    )\n            }\n        }\n\n    private fun checkBody(\n        rustWriter: RustWriter,\n        body: String,\n        mediaType: String?,\n    ) {\n        httpBodyToBytes().invoke(rustWriter)\n        if (body == \"\") {\n            rustWriter.rustTemplate(\n                \"\"\"\n                // No body.\n                #{AssertEq}(&body, &bytes::Bytes::new());\n                \"\"\",\n                *codegenScope,\n            )\n        } else {\n            assertOk(rustWriter) {\n                rust(\n                    \"#T(&body, ${\n                        rustWriter.escape(body).dq()\n                    }, #T::from(${(mediaType ?: \"unknown\").dq()}))\",\n                    protocolTestRuntimeType.resolve(\"validate_body\"),\n                    protocolTestRuntimeType.resolve(\"MediaType\"),\n                )\n            }\n        }\n    }\n\n    private fun checkStatusCode(\n        rustWriter: RustWriter,\n        statusCode: Int,\n    ) {\n        rustWriter.rustTemplate(\n            \"\"\"\n            #{AssertEq}(\n                #{Http}::StatusCode::from_u16($statusCode).expect(\"invalid expected HTTP status code\"),\n                http_response.status()\n            );\n            \"\"\",\n            *codegenScope,\n        )\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/protocols/ServerAwsJson.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.protocols\n\nimport software.amazon.smithy.model.traits.ErrorTrait\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.escape\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.http.HttpBindingCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.protocol.ProtocolSupport\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.AwsJsonVersion\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.HttpBindingResolver\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.ProtocolGeneratorFactory\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.awsJsonFieldName\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.parse.JsonParserCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.serialize.JsonSerializerCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.serialize.JsonSerializerGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.serialize.JsonSerializerSection\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.serialize.StructuredDataSerializerGenerator\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenContext\nimport software.amazon.smithy.rust.codegen.server.smithy.customizations.BeforeIteratingOverMapOrCollectionJsonCustomization\nimport software.amazon.smithy.rust.codegen.server.smithy.customizations.BeforeSerializingMemberJsonCustomization\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.protocol.ServerAwsJsonProtocol\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.protocol.ServerProtocol\n\n/**\n * AwsJson 1.0 and 1.1 server-side protocol factory. This factory creates the [ServerHttpBoundProtocolGenerator]\n * with AwsJson specific configurations.\n */\nclass ServerAwsJsonFactory(\n    private val version: AwsJsonVersion,\n    private val additionalParserCustomizations: List<JsonParserCustomization> = listOf(),\n    private val additionalServerHttpBoundProtocolCustomizations: List<ServerHttpBoundProtocolCustomization> = listOf(),\n    private val additionalHttpBindingCustomizations: List<HttpBindingCustomization> = listOf(),\n) : ProtocolGeneratorFactory<ServerHttpBoundProtocolGenerator, ServerCodegenContext> {\n    override fun protocol(codegenContext: ServerCodegenContext): ServerProtocol =\n        ServerAwsJsonProtocol(codegenContext, version, additionalParserCustomizations)\n\n    override fun buildProtocolGenerator(codegenContext: ServerCodegenContext): ServerHttpBoundProtocolGenerator =\n        ServerHttpBoundProtocolGenerator(\n            codegenContext,\n            protocol(codegenContext),\n            additionalServerHttpBoundProtocolCustomizations,\n            additionalHttpBindingCustomizations,\n        )\n\n    override fun support(): ProtocolSupport {\n        return ProtocolSupport(\n            // Client support\n            requestSerialization = false,\n            requestBodySerialization = false,\n            responseDeserialization = false,\n            errorDeserialization = false,\n            // Server support\n            requestDeserialization = true,\n            requestBodyDeserialization = true,\n            responseSerialization = true,\n            errorSerialization = true,\n        )\n    }\n}\n\n/**\n * AwsJson requires errors to be serialized in server responses with an additional `__type` field. This\n * customization writes the right field depending on the version of the AwsJson protocol.\n *\n * From the specs:\n * - https://smithy.io/2.0/aws/protocols/aws-json-1_0-protocol.html#operation-error-serialization\n * - https://smithy.io/2.0/aws/protocols/aws-json-1_1-protocol.html#operation-error-serialization\n *\n * > Error responses in the <awsJson1_x> protocol are serialized identically to standard responses with one additional\n * > component to distinguish which error is contained. New server-side protocol implementations SHOULD use a body\n * > field named __type\n */\nclass ServerAwsJsonError(private val awsJsonVersion: AwsJsonVersion) : JsonSerializerCustomization() {\n    override fun section(section: JsonSerializerSection): Writable =\n        when (section) {\n            is JsonSerializerSection.ServerError ->\n                writable {\n                    if (section.structureShape.hasTrait<ErrorTrait>()) {\n                        val typeId =\n                            when (awsJsonVersion) {\n                                // AwsJson 1.0 wants the whole shape ID (namespace#Shape).\n                                // https://smithy.io/2.0/aws/protocols/aws-json-1_0-protocol.html#operation-error-serialization\n                                AwsJsonVersion.Json10 -> section.structureShape.id.toString()\n                                // AwsJson 1.1 wants only the shape name (Shape).\n                                // https://smithy.io/2.0/aws/protocols/aws-json-1_1-protocol.html#operation-error-serialization\n                                AwsJsonVersion.Json11 -> section.structureShape.id.name.toString()\n                            }\n                        rust(\"\"\"${section.jsonObject}.key(\"__type\").string(\"${escape(typeId)}\");\"\"\")\n                    }\n                }\n\n            else -> emptySection\n        }\n}\n\n/**\n * AwsJson requires operation errors to be serialized in server response with an additional `__type` field. This class\n * customizes [JsonSerializerGenerator] to add this functionality.\n *\n * https://smithy.io/2.0/aws/protocols/aws-json-1_0-protocol.html#operation-error-serialization\n */\nclass ServerAwsJsonSerializerGenerator(\n    private val codegenContext: ServerCodegenContext,\n    private val httpBindingResolver: HttpBindingResolver,\n    private val awsJsonVersion: AwsJsonVersion,\n    private val jsonSerializerGenerator: JsonSerializerGenerator =\n        JsonSerializerGenerator(\n            codegenContext,\n            httpBindingResolver,\n            ::awsJsonFieldName,\n            customizations =\n                listOf(\n                    ServerAwsJsonError(awsJsonVersion),\n                    BeforeIteratingOverMapOrCollectionJsonCustomization(codegenContext),\n                    BeforeSerializingMemberJsonCustomization(codegenContext),\n                ),\n        ),\n) : StructuredDataSerializerGenerator by jsonSerializerGenerator\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/protocols/ServerHttpBoundProtocolGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.protocols\n\nimport software.amazon.smithy.codegen.core.Symbol\nimport software.amazon.smithy.model.knowledge.HttpBindingIndex\nimport software.amazon.smithy.model.node.ExpectationNotMetException\nimport software.amazon.smithy.model.pattern.UriPattern\nimport software.amazon.smithy.model.shapes.BooleanShape\nimport software.amazon.smithy.model.shapes.CollectionShape\nimport software.amazon.smithy.model.shapes.MapShape\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.NumberShape\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.traits.ErrorTrait\nimport software.amazon.smithy.model.traits.HttpErrorTrait\nimport software.amazon.smithy.model.traits.HttpPayloadTrait\nimport software.amazon.smithy.model.traits.HttpTrait\nimport software.amazon.smithy.model.traits.MediaTypeTrait\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustModule\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustType\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.conditionalBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.escape\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlockTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.stripOuter\nimport software.amazon.smithy.rust.codegen.core.rustlang.withBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.withBlockTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenTarget\nimport software.amazon.smithy.rust.codegen.core.smithy.HttpVersion\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.NamedCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.customize.Section\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.http.HttpBindingCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.http.HttpMessageType\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.protocol.ProtocolPayloadGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.setterName\nimport software.amazon.smithy.rust.codegen.core.smithy.isOptional\nimport software.amazon.smithy.rust.codegen.core.smithy.mapRustType\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.EventStreamBodyParams\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.HttpBindingDescriptor\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.HttpBoundProtocolPayloadGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.HttpLocation\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.ProtocolFunctions\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.parse.StructuredDataParserGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.transformers.OperationNormalizer\nimport software.amazon.smithy.rust.codegen.core.smithy.transformers.operationErrors\nimport software.amazon.smithy.rust.codegen.core.smithy.wrapOptional\nimport software.amazon.smithy.rust.codegen.core.util.dq\nimport software.amazon.smithy.rust.codegen.core.util.expectTrait\nimport software.amazon.smithy.rust.codegen.core.util.findStreamingMember\nimport software.amazon.smithy.rust.codegen.core.util.getTrait\nimport software.amazon.smithy.rust.codegen.core.util.hasStreamingMember\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\nimport software.amazon.smithy.rust.codegen.core.util.inputShape\nimport software.amazon.smithy.rust.codegen.core.util.isEventStream\nimport software.amazon.smithy.rust.codegen.core.util.isStreaming\nimport software.amazon.smithy.rust.codegen.core.util.outputShape\nimport software.amazon.smithy.rust.codegen.core.util.toSnakeCase\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerCargoDependency\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenContext\nimport software.amazon.smithy.rust.codegen.server.smithy.canReachConstrainedShape\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.ServerBuilderGenerator\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.http.ServerRequestBindingGenerator\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.http.ServerResponseBindingGenerator\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.protocol.ServerProtocol\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.protocol.ServerProtocolGenerator\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.serverBuilderSymbol\nimport java.util.logging.Logger\n\ndata class StreamPayloadSerializerParams(\n    val codegenContext: ServerCodegenContext,\n    val payloadGenerator: ServerHttpBoundProtocolPayloadGenerator,\n    val shapeName: String,\n    val shape: OperationShape,\n)\n\n/**\n * Class describing a ServerHttpBoundProtocol section that can be used in a customization.\n */\nsealed class ServerHttpBoundProtocolSection(name: String) : Section(name) {\n    data class AfterTimestampDeserializedMember(val shape: MemberShape) :\n        ServerHttpBoundProtocolSection(\"AfterTimestampDeserializedMember\")\n\n    /**\n     * Represent a section for rendering the serialized stream payload.\n     *\n     * If the payload does not implement the `futures_core::stream::Stream`, which is the case for\n     * `aws_smithy_types::byte_stream::ByteStream`, the section needs to be overridden and renders a new-type wrapper\n     * around the payload to enable the `Stream` trait.\n     */\n    data class WrapStreamPayload(val params: StreamPayloadSerializerParams) :\n        ServerHttpBoundProtocolSection(\"WrapStreamPayload\")\n}\n\n/**\n * Customization for the ServerHttpBoundProtocol generator.\n */\ntypealias ServerHttpBoundProtocolCustomization = NamedCustomization<ServerHttpBoundProtocolSection>\n\n/**\n * Implement operations' input parsing and output serialization. Protocols can plug their own implementations\n * and overrides by creating a protocol factory inheriting from this class and feeding it to the [ServerProtocolLoader].\n * See [ServerRestJsonFactory] for more info.\n */\nclass ServerHttpBoundProtocolGenerator(\n    codegenContext: ServerCodegenContext,\n    protocol: ServerProtocol,\n    customizations: List<ServerHttpBoundProtocolCustomization> = listOf(),\n    additionalHttpBindingCustomizations: List<HttpBindingCustomization> = listOf(),\n) :\n    ServerProtocolGenerator(\n            protocol,\n            ServerHttpBoundProtocolTraitImplGenerator(\n                codegenContext,\n                protocol,\n                customizations,\n                additionalHttpBindingCustomizations,\n            ),\n        )\n\nclass ServerHttpBoundProtocolPayloadGenerator(\n    private val codegenContext: ServerCodegenContext,\n    private val protocol: ServerProtocol,\n) :\n    ProtocolPayloadGenerator by HttpBoundProtocolPayloadGenerator(\n            codegenContext,\n            protocol,\n            HttpMessageType.RESPONSE,\n            renderEventStreamBody = { writer, params ->\n                writer.rustTemplate(\n                    \"\"\"\n                    {\n                        let error_marshaller = #{errorMarshallerConstructorFn}();\n                        let marshaller = #{marshallerConstructorFn}();\n                        let signer = #{NoOpSigner}{};\n                        #{event_stream}\n                    }\n                    \"\"\",\n                    \"aws_smithy_http\" to\n                        RuntimeType.smithyHttp(codegenContext.runtimeConfig),\n                    \"NoOpSigner\" to\n                        RuntimeType.smithyEventStream(codegenContext.runtimeConfig)\n                            .resolve(\"frame::NoOpSigner\"),\n                    \"marshallerConstructorFn\" to\n                        params.eventStreamMarshallerGenerator.render(),\n                    \"errorMarshallerConstructorFn\" to params.errorMarshallerConstructorFn,\n                    \"event_stream\" to eventStreamWithInitialResponse(codegenContext, protocol, params),\n                )\n            },\n        )\n\n/*\n * Generate all operation input parsers and output serializers for streaming and\n * non-streaming types.\n */\nclass ServerHttpBoundProtocolTraitImplGenerator(\n    private val codegenContext: ServerCodegenContext,\n    private val protocol: ServerProtocol,\n    private val customizations: List<ServerHttpBoundProtocolCustomization>,\n    private val additionalHttpBindingCustomizations: List<HttpBindingCustomization>,\n) {\n    private val logger = Logger.getLogger(javaClass.name)\n    private val symbolProvider = codegenContext.symbolProvider\n    private val unconstrainedShapeSymbolProvider = codegenContext.unconstrainedShapeSymbolProvider\n    private val model = codegenContext.model\n    private val runtimeConfig = codegenContext.runtimeConfig\n    private val httpBindingResolver = protocol.httpBindingResolver\n    private val protocolFunctions = ProtocolFunctions(codegenContext)\n\n    fun withHttpBindingCustomizations(\n        customizations: List<HttpBindingCustomization>,\n    ): ServerHttpBoundProtocolTraitImplGenerator {\n        return ServerHttpBoundProtocolTraitImplGenerator(\n            codegenContext, protocol, this.customizations, additionalHttpBindingCustomizations + customizations,\n        )\n    }\n\n    private val codegenScope =\n        arrayOf(\n            \"AsyncTrait\" to ServerCargoDependency.AsyncTrait.toType(),\n            \"Bytes\" to RuntimeType.Bytes,\n            \"Cow\" to RuntimeType.Cow,\n            \"DateTime\" to RuntimeType.dateTime(runtimeConfig),\n            \"FormUrlEncoded\" to ServerCargoDependency.FormUrlEncoded.toType(),\n            \"FuturesUtil\" to ServerCargoDependency.FuturesUtil.toType(),\n            \"HttpBody\" to RuntimeType.httpBody(runtimeConfig),\n            \"header_util\" to RuntimeType.smithyHttp(runtimeConfig).resolve(\"header\"),\n            \"Hyper\" to RuntimeType.hyper(runtimeConfig),\n            \"LazyStatic\" to RuntimeType.LazyStatic,\n            \"Mime\" to ServerCargoDependency.Mime.toType(),\n            \"Nom\" to ServerCargoDependency.Nom.toType(),\n            \"PercentEncoding\" to RuntimeType.PercentEncoding,\n            \"Regex\" to RuntimeType.Regex,\n            \"SmithyHttpServer\" to\n                ServerCargoDependency.smithyHttpServer(runtimeConfig).toType(),\n            \"SmithyTypes\" to RuntimeType.smithyTypes(runtimeConfig),\n            \"RuntimeError\" to protocol.runtimeError(runtimeConfig),\n            \"RequestRejection\" to protocol.requestRejection(runtimeConfig),\n            \"ResponseRejection\" to protocol.responseRejection(runtimeConfig),\n            \"PinProjectLite\" to ServerCargoDependency.PinProjectLite.toType(),\n            \"http\" to RuntimeType.http(runtimeConfig),\n            \"Tracing\" to RuntimeType.Tracing,\n            \"http_body_util\" to CargoDependency.HttpBodyUtil01x.toType(),\n            *preludeScope,\n        )\n\n    fun generateTraitImpls(\n        operationWriter: RustWriter,\n        operationShape: OperationShape,\n    ) {\n        val inputSymbol = symbolProvider.toSymbol(operationShape.inputShape(model))\n        val outputSymbol = symbolProvider.toSymbol(operationShape.outputShape(model))\n\n        operationWriter.renderTraits(inputSymbol, outputSymbol, operationShape)\n    }\n\n    /*\n     * Generation of `from_request` and `into_response`.\n     * For non-streaming request bodies, that is, models without streaming traits\n     * (https://smithy.io/2.0/spec/streaming.html#streaming-trait)\n     * we require the HTTP body to be fully read in memory before parsing or deserialization.\n     * From a server perspective we need a way to parse an HTTP request from `Bytes` and serialize\n     * an HTTP response to `Bytes`.\n     * These traits are the public entrypoint of the ser/de logic of the generated server.\n     */\n    private fun RustWriter.renderTraits(\n        inputSymbol: Symbol,\n        outputSymbol: Symbol,\n        operationShape: OperationShape,\n    ) {\n        val verifyAcceptHeader =\n            writable {\n                httpBindingResolver.responseContentType(operationShape)?.also { contentType ->\n                    val legacyContentType = httpBindingResolver.legacyBackwardsCompatContentType(operationShape)\n                    if (legacyContentType != null) {\n                        // For operations with legacy backwards compatibility, accept both content types\n                        rustTemplate(\n                            \"\"\"\n                            if !#{SmithyHttpServer}::protocol::accept_header_classifier(request.headers(), &#{ContentType}) &&\n                               !#{SmithyHttpServer}::protocol::accept_header_classifier(request.headers(), &#{FallbackContentType}) {\n                                return Err(#{RequestRejection}::NotAcceptable);\n                            }\n                            \"\"\",\n                            \"ContentType\" to mimeType(contentType),\n                            \"FallbackContentType\" to mimeType(legacyContentType),\n                            *codegenScope,\n                        )\n                    } else {\n                        rustTemplate(\n                            \"\"\"\n                            if !#{SmithyHttpServer}::protocol::accept_header_classifier(request.headers(), &#{ContentType}) {\n                                return Err(#{RequestRejection}::NotAcceptable);\n                            }\n                            \"\"\",\n                            \"ContentType\" to mimeType(contentType),\n                            *codegenScope,\n                        )\n                    }\n                }\n            }\n\n        // Implement `from_request` trait for input types.\n        val inputFuture = \"${inputSymbol.name}Future\"\n        // TODO(https://github.com/smithy-lang/smithy-rs/issues/2238): Remove the `Pin<Box<dyn Future>>` and replace with thin wrapper around `Collect`.\n        rustTemplate(\n            \"\"\"\n            #{PinProjectLite}::pin_project! {\n                /// A [`Future`](std::future::Future) aggregating the body bytes of a [`Request`] and constructing the\n                /// [`${inputSymbol.name}`](#{I}) using modelled bindings.\n                pub struct $inputFuture {\n                    inner: std::pin::Pin<Box<dyn std::future::Future<Output = Result<#{I}, #{RuntimeError}>> + Send>>\n                }\n            }\n\n            impl std::future::Future for $inputFuture {\n                type Output = Result<#{I}, #{RuntimeError}>;\n\n                fn poll(self: std::pin::Pin<&mut Self>, cx: &mut std::task::Context<'_>) -> std::task::Poll<Self::Output> {\n                    let this = self.project();\n                    this.inner.as_mut().poll(cx)\n                }\n            }\n\n            impl<B> #{SmithyHttpServer}::request::FromRequest<#{Marker}, B> for #{I}\n            where\n                B: #{SmithyHttpServer}::body::HttpBody + Send,\n                B: 'static,\n                ${streamingBodyTraitBounds(operationShape)}\n                B::Data: Send,\n                #{RequestRejection} : From<<B as #{SmithyHttpServer}::body::HttpBody>::Error>\n            {\n                type Rejection = #{RuntimeError};\n                type Future = $inputFuture;\n\n                fn from_request(request: #{http}::Request<B>) -> Self::Future {\n                    let fut = async move {\n                        #{verifyAcceptHeader:W}\n                        #{parse_request}(request)\n                            .await\n                    };\n                    use #{FuturesUtil}::future::TryFutureExt;\n                    let fut = fut.map_err(|e: #{RequestRejection}| {\n                        #{Tracing}::debug!(error = %e, \"failed to deserialize request\");\n                        #{RuntimeError}::from(e)\n                    });\n                    $inputFuture {\n                        inner: Box::pin(fut)\n                    }\n                }\n            }\n            \"\"\",\n            *codegenScope,\n            \"I\" to inputSymbol,\n            \"Marker\" to protocol.markerStruct(),\n            \"parse_request\" to serverParseRequest(operationShape),\n            \"verifyAcceptHeader\" to verifyAcceptHeader,\n        )\n\n        // Implement `into_response` for output types.\n        val errorSymbol = symbolProvider.symbolForOperationError(operationShape)\n\n        // All `ResponseRejection`s are errors; the service owners are to blame. So we centrally log them here\n        // to let them know.\n        rustTemplate(\n            \"\"\"\n            impl #{SmithyHttpServer}::response::IntoResponse<#{Marker}> for #{O} {\n                fn into_response(self) -> #{SmithyHttpServer}::response::Response {\n                    match #{serialize_response}(self) {\n                        Ok(response) => response,\n                        Err(e) => {\n                            #{Tracing}::error!(error = %e, \"failed to serialize response\");\n                            #{SmithyHttpServer}::response::IntoResponse::<#{Marker}>::into_response(#{RuntimeError}::from(e))\n                        }\n                    }\n                }\n            }\n            \"\"\",\n            *codegenScope,\n            \"O\" to outputSymbol,\n            \"Marker\" to protocol.markerStruct(),\n            \"serialize_response\" to serverSerializeResponse(operationShape),\n        )\n\n        if (operationShape.operationErrors(model).isNotEmpty()) {\n            rustTemplate(\n                \"\"\"\n                impl #{SmithyHttpServer}::response::IntoResponse<#{Marker}> for #{E} {\n                    fn into_response(self) -> #{SmithyHttpServer}::response::Response {\n                        match #{serialize_error}(&self) {\n                            Ok(mut response) => {\n                                response.extensions_mut().insert(#{SmithyHttpServer}::extension::ModeledErrorExtension::new(self.name()));\n                                response\n                            },\n                            Err(e) => {\n                                #{Tracing}::error!(error = %e, \"failed to serialize response\");\n                                #{SmithyHttpServer}::response::IntoResponse::<#{Marker}>::into_response(#{RuntimeError}::from(e))\n                            }\n                        }\n                    }\n                }\n                \"\"\".trimIndent(),\n                *codegenScope,\n                \"E\" to errorSymbol,\n                \"Marker\" to protocol.markerStruct(),\n                \"serialize_error\" to serverSerializeError(operationShape),\n            )\n        }\n    }\n\n    /**\n     * Generates `pub(crate) static CONTENT_TYPE_<MIME_TYPE> = ....\n     *\n     * Usage: In templates, #{MimeType}, \"MimeType\" to mimeType(\"yourDesiredType\")\n     */\n    private fun mimeType(type: String): RuntimeType {\n        val variableName = type.toSnakeCase().uppercase()\n        val typeName = \"CONTENT_TYPE_$variableName\"\n        return RuntimeType.forInlineFun(typeName, RustModule.private(\"mimes\")) {\n            rustTemplate(\n                \"\"\"\n                pub(crate) static $typeName: std::sync::LazyLock<#{Mime}::Mime> = std::sync::LazyLock::new(|| {\n                    ${type.dq()}.parse::<#{Mime}::Mime>().expect(\"BUG: MIME parsing failed, content_type is not valid\")\n                });\n                \"\"\",\n                *codegenScope,\n            )\n        }\n    }\n\n    private fun serverParseRequest(operationShape: OperationShape): RuntimeType {\n        val inputShape = operationShape.inputShape(model)\n        val inputSymbol = symbolProvider.toSymbol(inputShape)\n\n        return protocolFunctions.deserializeFn(operationShape, fnNameSuffix = \"http_request\") { fnName ->\n            Attribute.AllowClippyUnnecessaryWraps.render(this)\n            // The last conversion trait bound is needed by the `hyper::body::to_bytes(body).await?` call.\n            rustBlockTemplate(\n                \"\"\"\n                pub async fn $fnName<B>(\n                    ##[allow(unused_variables)] request: #{http}::Request<B>\n                ) -> std::result::Result<\n                    #{I},\n                    #{RequestRejection}\n                >\n                where\n                    B: #{SmithyHttpServer}::body::HttpBody + Send, ${streamingBodyTraitBounds(operationShape)}\n                    B::Data: Send,\n                    #{RequestRejection}: From<<B as #{SmithyHttpServer}::body::HttpBody>::Error>\n                \"\"\".trimIndent(),\n                *codegenScope,\n                \"I\" to inputSymbol,\n            ) {\n                withBlock(\"Ok({\", \"})\") {\n                    serverRenderShapeParser(\n                        operationShape,\n                        inputShape,\n                        httpBindingResolver.requestBindings(operationShape),\n                    )\n                }\n            }\n        }\n    }\n\n    private fun serverSerializeResponse(operationShape: OperationShape): RuntimeType {\n        val outputShape = operationShape.outputShape(model)\n        val outputSymbol = symbolProvider.toSymbol(outputShape)\n\n        return protocolFunctions.serializeFn(operationShape, fnNameSuffix = \"http_response\") { fnName ->\n            Attribute.AllowClippyUnnecessaryWraps.render(this)\n\n            // Note we only need to take ownership of the output in the case that it contains streaming members.\n            // However, we currently always take ownership here, but worth noting in case in the future we want\n            // to generate different signatures for streaming vs non-streaming for some reason.\n            rustBlockTemplate(\n                \"\"\"\n                pub fn $fnName(\n                    ##[allow(unused_variables)] output: #{O}\n                ) -> std::result::Result<\n                    #{SmithyHttpServer}::response::Response,\n                    #{ResponseRejection}\n                >\n                \"\"\".trimIndent(),\n                *codegenScope,\n                \"O\" to outputSymbol,\n            ) {\n                withBlock(\"Ok({\", \"})\") {\n                    serverRenderOutputShapeResponseSerializer(\n                        operationShape,\n                        httpBindingResolver.responseBindings(operationShape),\n                    )\n                }\n            }\n        }\n    }\n\n    private fun serverSerializeError(operationShape: OperationShape): RuntimeType {\n        val errorSymbol = symbolProvider.symbolForOperationError(operationShape)\n        return protocolFunctions.serializeFn(operationShape, fnNameSuffix = \"http_error\") { fnName ->\n            Attribute.AllowClippyUnnecessaryWraps.render(this)\n            rustBlockTemplate(\n                \"pub fn $fnName(error: &#{E}) -> std::result::Result<#{SmithyHttpServer}::response::Response, #{ResponseRejection}>\",\n                *codegenScope,\n                \"E\" to errorSymbol,\n            ) {\n                withBlock(\"Ok({\", \"})\") {\n                    serverRenderErrorShapeResponseSerializer(\n                        operationShape,\n                        errorSymbol,\n                    )\n                }\n            }\n        }\n    }\n\n    private fun RustWriter.serverRenderErrorShapeResponseSerializer(\n        operationShape: OperationShape,\n        errorSymbol: Symbol,\n    ) {\n        val operationName = symbolProvider.toSymbol(operationShape).name\n        val structuredDataSerializer = protocol.structuredDataSerializer()\n        withBlock(\"match error {\", \"}\") {\n            val errors = operationShape.operationErrors(model)\n            errors.forEach {\n                val variantShape = model.expectShape(it.id, StructureShape::class.java)\n                val errorTrait = variantShape.expectTrait<ErrorTrait>()\n                val variantSymbol = symbolProvider.toSymbol(variantShape)\n                val serializerSymbol = structuredDataSerializer.serverErrorSerializer(it.id)\n\n                rustBlock(\"#T::${variantSymbol.name}(output) =>\", errorSymbol) {\n                    rust(\n                        \"\"\"\n                        let payload = #T(output)?;\n                        \"\"\",\n                        serializerSymbol,\n                    )\n\n                    val bindings = httpBindingResolver.errorResponseBindings(it)\n\n                    Attribute.AllowUnusedMut.render(this)\n                    rustTemplate(\"let mut builder = #{http}::Response::builder();\", *codegenScope)\n                    serverRenderResponseHeaders(operationShape, variantShape)\n\n                    bindings.forEach { binding ->\n                        when (val location = binding.location) {\n                            HttpLocation.RESPONSE_CODE, HttpLocation.DOCUMENT -> {}\n                            else -> {\n                                logger.warning(\"[rust-server-codegen] $operationName: error serialization does not currently support $location bindings\")\n                            }\n                        }\n                    }\n                    val status =\n                        variantShape.getTrait<HttpErrorTrait>()?.code\n                            ?: errorTrait.defaultHttpStatusCode\n\n                    serverRenderContentLengthHeader()\n\n                    rustTemplate(\n                        \"\"\"\n                        builder.status($status).body(#{SmithyHttpServer}::body::to_boxed(payload))?\n                        \"\"\",\n                        *codegenScope,\n                    )\n                }\n            }\n        }\n    }\n\n    /**\n     * Render an HTTP response (headers, response code, body) for an operation's output and the given [bindings].\n     */\n    private fun RustWriter.serverRenderOutputShapeResponseSerializer(\n        operationShape: OperationShape,\n        bindings: List<HttpBindingDescriptor>,\n    ) {\n        Attribute.AllowUnusedMut.render(this)\n        rustTemplate(\"let mut builder = #{http}::Response::builder();\", *codegenScope)\n        serverRenderResponseHeaders(operationShape)\n        // Fallback to the default code of `@http`, which should be 200.\n        val httpTraitDefaultStatusCode =\n            HttpTrait.builder()\n                .method(\"GET\")\n                .uri(UriPattern.parse(\"/\")) // Required to build\n                .build()\n                .code\n        check(httpTraitDefaultStatusCode == 200)\n        val httpTraitStatusCode =\n            operationShape.getTrait<HttpTrait>()?.code ?: httpTraitDefaultStatusCode\n        bindings.find { it.location == HttpLocation.RESPONSE_CODE }?.let {\n            serverRenderResponseCodeBinding(it, httpTraitStatusCode)(this)\n        }\n            // No binding, use `@http`.\n            ?: serverRenderHttpResponseCode(httpTraitStatusCode)(this)\n\n        operationShape.outputShape(model).findStreamingMember(model)?.let { streamingMember ->\n            val payloadGenerator = ServerHttpBoundProtocolPayloadGenerator(codegenContext, protocol)\n\n            // Event streams vs blob streams require different handling in http@1:\n            // - Event streams (MessageStreamAdapter) yield Frame<Bytes> and use StreamBody::new() directly\n            // - Blob streams (FuturesStreamCompatByteStream) yield Bytes and need wrap_stream() to convert to Frame<Bytes>\n            val isEventStream = streamingMember.isEventStream(model)\n            val wrapStreamCall =\n                if (runtimeConfig.httpVersion == HttpVersion.Http1x) {\n                    if (isEventStream) {\n                        // Event streams already yield Frame<Bytes>, use StreamBody::new directly\n                        \"let body = #{SmithyHttpServer}::body::boxed(#{http_body_util}::StreamBody::new(\"\n                    } else {\n                        // Blob streams yield Bytes, use wrap_stream to convert to Frame<Bytes>\n                        \"let body = #{SmithyHttpServer}::body::boxed(#{SmithyHttpServer}::body::wrap_stream(\"\n                    }\n                } else {\n                    \"let body = #{SmithyHttpServer}::body::boxed(#{SmithyHttpServer}::body::Body::wrap_stream(\"\n                }\n\n            withBlockTemplate(\n                wrapStreamCall,\n                \"));\",\n                *codegenScope,\n            ) {\n                for (customization in customizations) {\n                    customization.section(\n                        ServerHttpBoundProtocolSection.WrapStreamPayload(\n                            StreamPayloadSerializerParams(\n                                codegenContext,\n                                payloadGenerator,\n                                \"output\",\n                                operationShape,\n                            ),\n                        ),\n                    )(this)\n                }\n            }\n        }\n            ?: run {\n                val payloadGenerator =\n                    ServerHttpBoundProtocolPayloadGenerator(codegenContext, protocol)\n                withBlockTemplate(\"let payload = \", \";\") {\n                    payloadGenerator.generatePayload(this, \"output\", operationShape)\n                }\n\n                serverRenderContentLengthHeader()\n\n                rustTemplate(\n                    \"\"\"\n                    let body = #{SmithyHttpServer}::body::to_boxed(payload);\n                    \"\"\",\n                    *codegenScope,\n                )\n            }\n\n        rustTemplate(\n            \"\"\"\n            builder.body(body)?\n            \"\"\",\n            *codegenScope,\n        )\n    }\n\n    private fun setResponseHeaderIfAbsent(\n        writer: RustWriter,\n        headerName: String,\n        headerValue: String,\n    ) {\n        // We can be a tad more efficient if there's a `const` `HeaderName` in the `http` crate that matches.\n        // https://docs.rs/http/latest/http/header/index.html#constants\n        val headerNameExpr =\n            if (headerName == \"content-type\") {\n                \"#{http}::header::CONTENT_TYPE\"\n            } else {\n                \"#{http}::header::HeaderName::from_static(\\\"$headerName\\\")\"\n            }\n\n        writer.rustTemplate(\n            \"\"\"\n            builder = #{header_util}::set_response_header_if_absent(\n                builder,\n                $headerNameExpr,\n                \"${writer.escape(headerValue)}\",\n            );\n            \"\"\",\n            *codegenScope,\n        )\n    }\n\n    /**\n     * Sets HTTP response headers for the operation's output shape or the operation's error shape.\n     * It will generate response headers for the operation's output shape, unless [errorShape] is non-null, in which\n     * case it will generate response headers for the given error shape.\n     *\n     * It sets three groups of headers in order. Headers from one group take precedence over headers in a later group.\n     *     1. Headers bound by the `httpHeader` and `httpPrefixHeader` traits.\n     *     2. The protocol-specific `Content-Type` header for the operation.\n     *     3. Additional protocol-specific headers for errors, if [errorShape] is non-null.\n     */\n    private fun RustWriter.serverRenderResponseHeaders(\n        operationShape: OperationShape,\n        errorShape: StructureShape? = null,\n    ) {\n        val bindingGenerator =\n            ServerResponseBindingGenerator(protocol, codegenContext, operationShape)\n        val addHeadersFn = bindingGenerator.generateAddHeadersFn(errorShape ?: operationShape)\n        if (addHeadersFn != null) {\n            // Notice that we need to borrow the output only for output shapes but not for error shapes.\n            val outputOwnedOrBorrowed = if (errorShape == null) \"&output\" else \"output\"\n            rust(\n                \"\"\"\n                builder = #{T}($outputOwnedOrBorrowed, builder)?;\n                \"\"\",\n                addHeadersFn,\n            )\n        }\n\n        // Set the `Content-Type` header *after* the response bindings headers have been set,\n        // to allow operations that bind a member to `Content-Type` (which we set earlier) to take precedence (this is\n        // because we always use `set_response_header_if_absent`, so the _first_ header value we set for a given\n        // header name is the one that takes precedence).\n        httpBindingResolver.responseContentType(operationShape)?.let { contentTypeValue ->\n            setResponseHeaderIfAbsent(this, \"content-type\", contentTypeValue)\n        }\n\n        for ((headerName, headerValue) in protocol.additionalResponseHeaders(operationShape)) {\n            setResponseHeaderIfAbsent(this, headerName, headerValue)\n        }\n\n        if (errorShape != null) {\n            for ((headerName, headerValue) in protocol.additionalErrorResponseHeaders(errorShape)) {\n                setResponseHeaderIfAbsent(this, headerName, headerValue)\n            }\n        }\n    }\n\n    /**\n     * Adds the `Content-Length` header.\n     *\n     * Unlike the headers added in `serverRenderResponseHeaders` the `Content-Length` depends on\n     * the payload post-serialization.\n     */\n    private fun RustWriter.serverRenderContentLengthHeader() {\n        rustTemplate(\n            \"\"\"\n            let content_length = payload.len();\n            builder = #{header_util}::set_response_header_if_absent(builder, #{http}::header::CONTENT_LENGTH, content_length);\n            \"\"\",\n            *codegenScope,\n        )\n    }\n\n    private fun serverRenderHttpResponseCode(defaultCode: Int) =\n        writable {\n            check(defaultCode in 100..999) {\n                \"\"\"\n                Smithy library lied to us. According to https://smithy.io/2.0/spec/http-bindings.html#http-trait,\n                \"The provided value SHOULD be between 100 and 599, and it MUST be between 100 and 999\".\n                \"\"\"\n                    .replace(\"\\n\", \"\")\n                    .trimIndent()\n            }\n            rustTemplate(\n                \"\"\"\n                let http_status: u16 = $defaultCode;\n                builder = builder.status(http_status);\n                \"\"\",\n                *codegenScope,\n            )\n        }\n\n    private fun serverRenderResponseCodeBinding(\n        binding: HttpBindingDescriptor,\n        /** This is the status code to fall back on if the member shape bound with `@httpResponseCode` is not\n         * `@required` and the user did not provide a value for it at runtime. **/\n        fallbackStatusCode: Int,\n    ): Writable {\n        check(binding.location == HttpLocation.RESPONSE_CODE)\n\n        return writable {\n            val memberName = symbolProvider.toMemberName(binding.member)\n            withBlock(\"let status = output.$memberName\", \";\") {\n                if (symbolProvider.toSymbol(binding.member).isOptional()) {\n                    rust(\".unwrap_or($fallbackStatusCode)\")\n                }\n            }\n            rustTemplate(\n                \"\"\"\n                let http_status: u16 = status.try_into().map_err(#{ResponseRejection}::InvalidHttpStatusCode)?;\n                builder = builder.status(http_status);\n                \"\"\",\n                *codegenScope,\n            )\n        }\n    }\n\n    private fun RustWriter.serverRenderShapeParser(\n        operationShape: OperationShape,\n        inputShape: StructureShape,\n        bindings: List<HttpBindingDescriptor>,\n    ) {\n        val structuredDataParser = protocol.structuredDataParser()\n        Attribute.AllowUnusedMut.render(this)\n        rust(\n            \"let mut input = #T::default();\",\n            inputShape.serverBuilderSymbol(codegenContext),\n        )\n        Attribute.AllowUnusedVariables.render(this)\n        rustTemplate(\n            \"\"\"\n            let #{RequestParts} { uri, headers, body, .. } = #{Request}::try_from(request)?.into_parts();\n            \"\"\",\n            *preludeScope,\n            \"ParseError\" to RuntimeType.smithyHttp(runtimeConfig).resolve(\"header::ParseError\"),\n            \"Request\" to RuntimeType.smithyRuntimeApiWithHttpFeature(runtimeConfig).resolve(\"http::Request\"),\n            \"RequestParts\" to\n                RuntimeType.smithyRuntimeApiWithHttpFeature(runtimeConfig).resolve(\"http::RequestParts\"),\n        )\n        val parser = structuredDataParser.serverInputParser(operationShape)\n\n        // Skip body parsing if this operation has an event stream with initial request data\n        // In that case, the non-event-stream members will be parsed from the initial-request message\n        val hasEventStreamWithInitialRequest = httpBindingResolver.handlesEventStreamInitialRequest(operationShape)\n\n        if (parser != null && !hasEventStreamWithInitialRequest) {\n            // `null` is only returned by Smithy when there are no members, but we know there's at least one, since\n            // there's something to parse (i.e. `parser != null`), so `!!` is safe here.\n            val expectedRequestContentType =\n                httpBindingResolver.requestContentType(operationShape)!!\n\n            // Generate different body collection code based on HTTP version\n            if (runtimeConfig.httpVersion == HttpVersion.Http1x) {\n                // For HTTP 1.x: use http-body-util's BodyExt trait\n                rustTemplate(\n                    \"\"\"\n                    let bytes = {\n                        use #{HttpBodyUtil}::BodyExt;\n                        body.collect().await?.to_bytes()\n                    };\n                    \"\"\",\n                    *codegenScope,\n                    \"HttpBodyUtil\" to software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency.HttpBodyUtil01x.toType(),\n                )\n            } else {\n                // For HTTP 0.x: use hyper's to_bytes\n                rustTemplate(\"let bytes = #{Hyper}::body::to_bytes(body).await?;\", *codegenScope)\n            }\n            // Note that the server is being very lenient here. We're accepting an empty body for when there is modeled\n            // operation input; we simply parse it as empty operation input.\n            // This behavior applies to all protocols. This might seem like a bug, but it isn't. There's protocol tests\n            // that assert that the server should be lenient and accept both empty payloads and no payload\n            // when there is modeled input:\n            //\n            // * [restJson1]: clients omit the payload altogether when the input is empty! So services must accept this.\n            // * [rpcv2Cbor]: services must accept no payload or empty CBOR map for operations with modeled input.\n            //\n            // For the AWS JSON 1.x protocols, services are lenient in the case when there is no modeled input:\n            //\n            // * [awsJson1_0]: services must accept no payload or empty JSON document payload for operations with no modeled input\n            // * [awsJson1_1]: services must accept no payload or empty JSON document payload for operations with no modeled input\n            //\n            // However, it's true that there are no tests pinning server behavior when there is _empty_ input. There's\n            // a [consultation with Smithy] to remedy this. Until that gets resolved, in the meantime, we are being lenient.\n            //\n            // [restJson1]: https://github.com/smithy-lang/smithy/blob/main/smithy-aws-protocol-tests/model/restJson1/empty-input-output.smithy#L22\n            // [awsJson1_0]: https://github.com/smithy-lang/smithy/blob/main/smithy-aws-protocol-tests/model/awsJson1_0/empty-input-output.smithy\n            // [awsJson1_1]: https://github.com/smithy-lang/smithy/blob/main/smithy-aws-protocol-tests/model/awsJson1_1/empty-operation.smithy\n            // [rpcv2Cbor]: https://github.com/smithy-lang/smithy/blob/main/smithy-protocol-tests/model/rpcv2Cbor/empty-input-output.smithy\n            // [consultation with Smithy]: https://github.com/smithy-lang/smithy/issues/2327\n            rustBlock(\"if !bytes.is_empty()\") {\n                rustTemplate(\n                    \"\"\"\n                    #{SmithyHttpServer}::protocol::content_type_header_classifier_smithy(\n                        &headers,\n                        Some(\"$expectedRequestContentType\"),\n                    )?;\n                    input = #{parser}(bytes.as_ref(), input)?;\n                    \"\"\",\n                    *codegenScope,\n                    \"parser\" to parser,\n                )\n            }\n        }\n\n        for (binding in bindings) {\n            val member = binding.member\n            val parsedValue =\n                serverRenderBindingParser(\n                    binding,\n                    operationShape,\n                    httpBindingGenerator(operationShape),\n                    structuredDataParser,\n                )\n            val valueToSet =\n                if (symbolProvider.toSymbol(binding.member).isOptional()) {\n                    \"Some(value)\"\n                } else {\n                    \"value\"\n                }\n            if (parsedValue != null) {\n                rustTemplate(\n                    \"\"\"\n                    if let Some(value) = #{ParsedValue:W} {\n                        input = input.${member.setterName()}($valueToSet)\n                    }\n                    \"\"\",\n                    \"ParsedValue\" to parsedValue,\n                )\n            }\n        }\n\n        serverRenderUriPathParser(this, operationShape)\n        serverRenderQueryStringParser(this, operationShape)\n\n        // If there's no modeled operation input, some protocols require that `Content-Type` header not be present.\n        val noInputs = !OperationNormalizer.hadUserModeledOperationInput(operationShape, model)\n        if (noInputs && protocol.serverContentTypeCheckNoModeledInput()) {\n            rustTemplate(\n                \"\"\"\n                #{SmithyHttpServer}::protocol::content_type_header_classifier_smithy(&headers, None)?;\n                \"\"\",\n                *codegenScope,\n            )\n        }\n\n        // TODO(https://github.com/smithy-lang/smithy-rs/issues/3723): we should inject a check here that asserts that\n        //  the body contents are valid when there is empty operation input or no operation input.\n\n        val err =\n            if (ServerBuilderGenerator.hasFallibleBuilder(\n                    inputShape,\n                    model,\n                    symbolProvider,\n                    takeInUnconstrainedTypes = true,\n                )\n            ) {\n                \"?\"\n            } else {\n                \"\"\n            }\n        rustTemplate(\"input.build()$err\", *codegenScope)\n    }\n\n    private fun serverRenderBindingParser(\n        binding: HttpBindingDescriptor,\n        operationShape: OperationShape,\n        httpBindingGenerator: ServerRequestBindingGenerator,\n        structuredDataParser: StructuredDataParserGenerator,\n    ): Writable? {\n        return when (binding.location) {\n            HttpLocation.HEADER ->\n                writable { serverRenderHeaderParser(this, binding, operationShape) }\n\n            HttpLocation.PREFIX_HEADERS ->\n                writable { serverRenderPrefixHeadersParser(this, binding, operationShape) }\n\n            HttpLocation.PAYLOAD -> {\n                val structureShapeHandler: RustWriter.(String) -> Unit = { body ->\n                    rust(\"#T($body)\", structuredDataParser.payloadParser(binding.member))\n                }\n                val deserializer =\n                    httpBindingGenerator.generateDeserializePayloadFn(\n                        binding,\n                        structuredHandler = structureShapeHandler,\n                    )\n                return writable {\n                    if (binding.member.isStreaming(model)) {\n                        if (binding.member.isEventStream(model)) {\n                            val parser = structuredDataParser.serverInputParser(operationShape)\n                            val parseInitialRequest =\n                                if (parser != null &&\n                                    httpBindingResolver.handlesEventStreamInitialRequest(\n                                        operationShape,\n                                    )\n                                ) {\n                                    writable {\n                                        rustTemplate(\n                                            \"\"\"\n                                            input = #{parser}(_initial_event.payload(), input)?;\n                                            \"\"\",\n                                            \"parser\" to parser,\n                                        )\n                                    }\n                                } else {\n                                    writable { }\n                                }\n                            // TODO(https://github.com/smithy-lang/smithy-rs/issues/4343): The error\n                            //   returned below is not actually accessible to the caller because it has\n                            //   already started reading from the event stream at the time the error was sent.\n                            rustTemplate(\n                                \"\"\"\n                                {\n                                    let mut receiver = #{Deserializer}(&mut #{eventStreamBodyInto:W})?;\n                                    if let Some(_initial_event) = receiver\n                                        .try_recv_initial(#{InitialMessageType}::Request)\n                                        .await\n                                        .map_err(\n                                            |ev_error| #{RequestRejection}::ConstraintViolation(\n                                                #{AllowUselessConversion}\n                                                format!(\"{ev_error}\").into()\n                                            )\n                                        )? {\n                                        #{parseInitialRequest}\n                                    }\n                                    Some(receiver)\n                                }\n                                \"\"\",\n                                \"Deserializer\" to deserializer,\n                                \"InitialMessageType\" to\n                                    RuntimeType.smithyHttp(runtimeConfig)\n                                        .resolve(\"event_stream::InitialMessageType\"),\n                                \"parseInitialRequest\" to parseInitialRequest,\n                                \"AllowUselessConversion\" to Attribute.AllowClippyUselessConversion.writable(),\n                                \"eventStreamBodyInto\" to eventStreamBodyInto(),\n                                *codegenScope,\n                            )\n                        } else {\n                            rustTemplate(\n                                \"\"\"\n                                {\n                                    Some(#{Deserializer}(&mut #{eventStreamBodyInto:W})?)\n                                }\n                                \"\"\",\n                                \"Deserializer\" to deserializer,\n                                \"eventStreamBodyInto\" to eventStreamBodyInto(),\n                                *codegenScope,\n                            )\n                        }\n                    } else {\n                        // This checks for the expected `Content-Type` header if the `@httpPayload` trait is present, as dictated by\n                        // the core Smithy library, which _does not_ require deserializing the payload.\n                        // If no members have `@httpPayload`, the expected `Content-Type` header as dictated _by the protocol_ is\n                        // checked later on for non-streaming operations, in `serverRenderShapeParser`.\n                        // Both checks require buffering the entire payload, since the check must only be performed if the payload is\n                        // not empty.\n                        val verifyRequestContentTypeHeader =\n                            writable {\n                                operationShape\n                                    .inputShape(model)\n                                    .members()\n                                    .find { it.hasTrait<HttpPayloadTrait>() }\n                                    ?.let { payload ->\n                                        val target = model.expectShape(payload.target)\n                                        if (!target.isBlobShape || target.hasTrait<MediaTypeTrait>()\n                                        ) {\n                                            // `null` is only returned by Smithy when there are no members, but we know there's at least\n                                            // the one with `@httpPayload`, so `!!` is safe here.\n                                            val expectedRequestContentType =\n                                                httpBindingResolver.requestContentType(operationShape)!!\n                                            rustTemplate(\n                                                \"\"\"\n                                                if !bytes.is_empty() {\n                                                    #{SmithyHttpServer}::protocol::content_type_header_classifier_smithy(\n                                                        &headers,\n                                                        Some(\"$expectedRequestContentType\"),\n                                                    )?;\n                                                }\n                                                \"\"\",\n                                                *codegenScope,\n                                            )\n                                        }\n                                    }\n                            }\n                        // Generate different body collection code based on HTTP version\n                        if (runtimeConfig.httpVersion == HttpVersion.Http1x) {\n                            // For HTTP 1.x: use http-body-util's BodyExt trait\n                            rustTemplate(\n                                \"\"\"\n                                {\n                                    let bytes = {\n                                        use #{HttpBodyUtil}::BodyExt;\n                                        body.collect().await?.to_bytes()\n                                    };\n                                    #{VerifyRequestContentTypeHeader:W}\n                                    #{Deserializer}(&bytes)?\n                                }\n                                \"\"\",\n                                \"Deserializer\" to deserializer,\n                                \"VerifyRequestContentTypeHeader\" to verifyRequestContentTypeHeader,\n                                *codegenScope,\n                                \"HttpBodyUtil\" to software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency.HttpBodyUtil01x.toType(),\n                            )\n                        } else {\n                            // For HTTP 0.x: use hyper's to_bytes\n                            rustTemplate(\n                                \"\"\"\n                                {\n                                    let bytes = #{Hyper}::body::to_bytes(body).await?;\n                                    #{VerifyRequestContentTypeHeader:W}\n                                    #{Deserializer}(&bytes)?\n                                }\n                                \"\"\",\n                                \"Deserializer\" to deserializer,\n                                \"VerifyRequestContentTypeHeader\" to verifyRequestContentTypeHeader,\n                                *codegenScope,\n                            )\n                        }\n                    }\n                }\n            }\n\n            HttpLocation.DOCUMENT, HttpLocation.LABEL, HttpLocation.QUERY, HttpLocation.QUERY_PARAMS -> {\n                // All of these are handled separately.\n                null\n            }\n\n            else -> {\n                logger.warning(\"[rust-server-codegen] ${operationShape.id}: request parsing does not currently support ${binding.location} bindings\")\n                null\n            }\n        }\n    }\n\n    private fun serverRenderUriPathParser(\n        writer: RustWriter,\n        operationShape: OperationShape,\n    ) {\n        val pathBindings =\n            httpBindingResolver.requestBindings(operationShape).filter {\n                it.location == HttpLocation.LABEL\n            }\n        if (pathBindings.isEmpty()) {\n            return\n        }\n        val httpTrait = httpBindingResolver.httpTrait(operationShape)\n        val greedyLabelIndex = httpTrait.uri.segments.indexOfFirst { it.isGreedyLabel }\n        val segments =\n            if (greedyLabelIndex >= 0) {\n                httpTrait.uri.segments.slice(0 until (greedyLabelIndex + 1))\n            } else {\n                httpTrait.uri.segments\n            }\n        val restAfterGreedyLabel =\n            if (greedyLabelIndex >= 0) {\n                httpTrait\n                    .uri\n                    .segments\n                    .slice((greedyLabelIndex + 1) until httpTrait.uri.segments.size)\n                    .joinToString(prefix = \"/\", separator = \"/\")\n            } else {\n                \"\"\n            }\n        val labeledNames =\n            segments\n                .mapIndexed { index, segment ->\n                    if (segment.isLabel) {\n                        \"m$index\"\n                    } else {\n                        \"_\"\n                    }\n                }\n                .joinToString(\n                    prefix = (if (segments.size > 1) \"(\" else \"\"),\n                    separator = \",\",\n                    postfix = (if (segments.size > 1) \")\" else \"\"),\n                )\n        val nomParser =\n            segments\n                .map { segment ->\n                    if (segment.isGreedyLabel) {\n                        \"#{Nom}::combinator::rest::<_, #{Nom}::error::Error<&str>>\"\n                    } else if (segment.isLabel) {\n                        \"\"\"#{Nom}::branch::alt::<_, _, #{Nom}::error::Error<&str>, _>((#{Nom}::bytes::complete::take_until(\"/\"), #{Nom}::combinator::rest))\"\"\"\n                    } else {\n                        \"\"\"#{Nom}::bytes::complete::tag::<_, _, #{Nom}::error::Error<&str>>(\"${segment.content}\")\"\"\"\n                    }\n                }\n                .joinToString(\n                    // TODO(https://github.com/smithy-lang/smithy-rs/issues/1289): Note we're limited to 21 labels because of `tuple`.\n                    prefix = if (segments.size > 1) \"#{Nom}::sequence::tuple::<_, _, #{Nom}::error::Error<&str>, _>((\" else \"\",\n                    postfix = if (segments.size > 1) \"))\" else \"\",\n                    transform = { parser ->\n                        \"\"\"\n                        #{Nom}::sequence::preceded(#{Nom}::bytes::complete::tag(\"/\"),  $parser)\n                        \"\"\".trimIndent()\n                    },\n                )\n        with(writer) {\n            rustTemplate(\"let input_string = uri.path();\")\n            if (greedyLabelIndex >= 0 && greedyLabelIndex + 1 < httpTrait.uri.segments.size) {\n                rustTemplate(\n                    \"\"\"\n                    if !input_string.ends_with(\"$restAfterGreedyLabel\") {\n                        return Err(#{RequestRejection}::UriPatternGreedyLabelPostfixNotFound);\n                    }\n                    let input_string = &input_string[..(input_string.len() - \"$restAfterGreedyLabel\".len())];\n                    \"\"\".trimIndent(),\n                    *codegenScope,\n                )\n            }\n            rustTemplate(\n                \"\"\"\n                let (input_string, $labeledNames) = $nomParser(input_string)?;\n                debug_assert_eq!(\"\", input_string);\n                \"\"\".trimIndent(),\n                *codegenScope,\n            )\n            segments.forEachIndexed { index, segment ->\n                val binding = pathBindings.find { it.memberName == segment.content }\n                if (binding != null && segment.isLabel) {\n                    val deserializer = generateParseStrFn(binding, true)\n                    rustTemplate(\n                        \"\"\"\n                        input = input.${binding.member.setterName()}(\n                            #{deserializer}(m$index)?\n                        );\n                        \"\"\",\n                        *codegenScope,\n                        \"deserializer\" to deserializer,\n                    )\n                }\n            }\n        }\n    }\n\n    // The `httpQueryParams` trait can be applied to structure members that target:\n    //     * a map of string,\n    //     * a map of list of string; or\n    //     * a map of set of string.\n    enum class QueryParamsTargetMapValueType {\n        STRING,\n        LIST,\n        SET,\n    }\n\n    private fun queryParamsTargetMapValueType(targetMapValue: Shape): QueryParamsTargetMapValueType =\n        if (targetMapValue.isStringShape) {\n            QueryParamsTargetMapValueType.STRING\n        } else if (targetMapValue.isListShape) {\n            QueryParamsTargetMapValueType.LIST\n        } else if (targetMapValue.isSetShape) {\n            QueryParamsTargetMapValueType.SET\n        } else {\n            throw ExpectationNotMetException(\n                \"\"\"\n                @httpQueryParams trait applied to non-supported target $targetMapValue of type ${targetMapValue.type}\n                \"\"\".trimIndent(),\n                targetMapValue.sourceLocation,\n            )\n        }\n\n    private fun serverRenderQueryStringParser(\n        writer: RustWriter,\n        operationShape: OperationShape,\n    ) {\n        val queryBindings =\n            httpBindingResolver.requestBindings(operationShape).filter {\n                it.location == HttpLocation.QUERY\n            }\n        // Only a single structure member can be bound to `httpQueryParams`, hence `find`.\n        val queryParamsBinding =\n            httpBindingResolver.requestBindings(operationShape).find {\n                it.location == HttpLocation.QUERY_PARAMS\n            }\n        if (queryBindings.isEmpty() && queryParamsBinding == null) {\n            return\n        }\n\n        fun HttpBindingDescriptor.queryParamsBindingTargetMapValueType(): QueryParamsTargetMapValueType {\n            check(this.location == HttpLocation.QUERY_PARAMS)\n            val queryParamsTarget = model.expectShape(this.member.target, MapShape::class.java)\n            return queryParamsTargetMapValueType(model.expectShape(queryParamsTarget.value.target))\n        }\n\n        with(writer) {\n            rustTemplate(\n                \"\"\"\n                let query_string = uri.query().unwrap_or(\"\");\n                let pairs = #{FormUrlEncoded}::parse(query_string.as_bytes());\n                \"\"\".trimIndent(),\n                *codegenScope,\n            )\n\n            if (queryParamsBinding != null) {\n                val target =\n                    model.expectShape(queryParamsBinding.member.target, MapShape::class.java)\n                val hasConstrainedTarget = target.canReachConstrainedShape(model, symbolProvider)\n                // TODO(https://github.com/smithy-lang/smithy-rs/issues/1401) Here we only check the target shape;\n                //  constraint traits on member shapes are not implemented yet.\n                val targetSymbol = unconstrainedShapeSymbolProvider.toSymbol(target)\n                withBlock(\"let mut query_params: #T = \", \";\", targetSymbol) {\n                    conditionalBlock(\"#T(\", \")\", conditional = hasConstrainedTarget, targetSymbol) {\n                        rust(\"#T::new()\", RuntimeType.HashMap)\n                    }\n                }\n            }\n            val (queryBindingsTargetingCollection, queryBindingsTargetingSimple) =\n                queryBindings.partition {\n                    model.expectShape(it.member.target) is CollectionShape\n                }\n            queryBindingsTargetingSimple.forEach {\n                rust(\"let mut ${symbolProvider.toMemberName(it.member)}_seen = false;\")\n            }\n            queryBindingsTargetingCollection.forEach {\n                rust(\"let mut ${symbolProvider.toMemberName(it.member)} = Vec::new();\")\n            }\n\n            rustBlock(\"for (k, v) in pairs\") {\n                queryBindingsTargetingSimple.forEach {\n                    val deserializer = generateParseStrFn(it, false)\n                    val memberName = symbolProvider.toMemberName(it.member)\n                    rustTemplate(\n                        \"\"\"\n                        if !${memberName}_seen && k == \"${it.locationName}\" {\n                            input = input.${it.member.setterName()}(\n                                #{deserializer}(&v)?\n                            );\n                            ${memberName}_seen = true;\n                        }\n                        \"\"\".trimIndent(),\n                        \"deserializer\" to deserializer,\n                    )\n                }\n                queryBindingsTargetingCollection.forEachIndexed { idx, it ->\n                    rustBlock(\"${if (idx > 0) \"else \" else \"\"}if k == ${it.locationName.dq()}\") {\n                        val targetCollectionShape =\n                            model.expectShape(it.member.target, CollectionShape::class.java)\n                        val memberShape = model.expectShape(targetCollectionShape.member.target)\n\n                        when {\n                            memberShape.isStringShape -> {\n                                if (queryParamsBinding != null) {\n                                    // If there's an `@httpQueryParams` binding, it will want to consume the parsed data\n                                    // too further down, so we need to clone it.\n                                    rust(\"let v = v.clone().into_owned();\")\n                                } else {\n                                    rust(\"let v = v.into_owned();\")\n                                }\n                            }\n\n                            memberShape.isTimestampShape -> {\n                                val index = HttpBindingIndex.of(model)\n                                val timestampFormat =\n                                    index.determineTimestampFormat(\n                                        it.member,\n                                        it.location,\n                                        protocol.defaultTimestampFormat,\n                                    )\n                                val timestampFormatType =\n                                    RuntimeType.parseTimestampFormat(\n                                        CodegenTarget.SERVER,\n                                        runtimeConfig,\n                                        timestampFormat,\n                                    )\n                                rustTemplate(\n                                    \"\"\"\n                                    let v = #{DateTime}::from_str(&v, #{format})?\n                                    \"\"\".trimIndent(),\n                                    *codegenScope,\n                                    \"format\" to timestampFormatType,\n                                )\n                                for (customization in customizations) {\n                                    customization.section(\n                                        ServerHttpBoundProtocolSection.AfterTimestampDeserializedMember(\n                                            it.member,\n                                        ),\n                                    )(this)\n                                }\n                                rust(\";\")\n                            }\n\n                            else -> { // Number or boolean.\n                                rust(\n                                    \"\"\"\n                                    let v = <_ as #T>::parse_smithy_primitive(&v)?;\n                                    \"\"\".trimIndent(),\n                                    RuntimeType.smithyTypes(runtimeConfig)\n                                        .resolve(\"primitive::Parse\"),\n                                )\n                            }\n                        }\n                        rust(\"${symbolProvider.toMemberName(it.member)}.push(v);\")\n                    }\n                }\n\n                if (queryParamsBinding != null) {\n                    val target = model.expectShape(queryParamsBinding.member.target, MapShape::class.java)\n                    // TODO(https://github.com/smithy-lang/smithy-rs/issues/1401) Here we only check the target shape;\n                    //  constraint traits on member shapes are not implemented yet.\n                    val hasConstrainedTarget =\n                        target.canReachConstrainedShape(model, symbolProvider)\n                    when (queryParamsBinding.queryParamsBindingTargetMapValueType()) {\n                        QueryParamsTargetMapValueType.STRING -> {\n                            rust(\"query_params.${if (hasConstrainedTarget) \"0.\" else \"\"}entry(String::from(k)).or_insert_with(|| String::from(v));\")\n                        }\n\n                        QueryParamsTargetMapValueType.LIST, QueryParamsTargetMapValueType.SET -> {\n                            if (hasConstrainedTarget) {\n                                val collectionShape =\n                                    model.expectShape(target.value.target, CollectionShape::class.java)\n                                val collectionSymbol =\n                                    unconstrainedShapeSymbolProvider.toSymbol(collectionShape)\n                                rust(\n                                    // `or_insert_with` instead of `or_insert` to avoid the allocation when the entry is\n                                    // not empty.\n                                    \"\"\"\n                                    let entry = query_params.0.entry(String::from(k)).or_insert_with(|| #T(std::vec::Vec::new()));\n                                    entry.0.push(String::from(v));\n                                    \"\"\",\n                                    collectionSymbol,\n                                )\n                            } else {\n                                rust(\n                                    \"\"\"\n                                    let entry = query_params.entry(String::from(k)).or_default();\n                                    entry.push(String::from(v));\n                                    \"\"\",\n                                )\n                            }\n                        }\n                    }\n                }\n            }\n            if (queryParamsBinding != null) {\n                val isOptional =\n                    unconstrainedShapeSymbolProvider\n                        .toSymbol(queryParamsBinding.member)\n                        .isOptional()\n                withBlock(\"input = input.${queryParamsBinding.member.setterName()}(\", \");\") {\n                    conditionalBlock(\"Some(\", \")\", conditional = isOptional) {\n                        write(\"query_params\")\n                    }\n                }\n            }\n            queryBindingsTargetingCollection.forEach { binding ->\n                // TODO(https://github.com/smithy-lang/smithy-rs/issues/1401) Constraint traits on member shapes are not\n                //  implemented yet.\n                val hasConstrainedTarget =\n                    model.expectShape(binding.member.target, CollectionShape::class.java)\n                        .canReachConstrainedShape(model, symbolProvider)\n                val memberName = unconstrainedShapeSymbolProvider.toMemberName(binding.member)\n                val isOptional =\n                    unconstrainedShapeSymbolProvider.toSymbol(binding.member).isOptional()\n                rustBlock(\"if !$memberName.is_empty()\") {\n                    withBlock(\n                        \"input = input.${\n                            binding.member.setterName()\n                        }(\",\n                        \");\",\n                    ) {\n                        conditionalBlock(\"Some(\", \")\", conditional = isOptional) {\n                            conditionalBlock(\n                                \"#T(\",\n                                \")\",\n                                conditional = hasConstrainedTarget,\n                                unconstrainedShapeSymbolProvider.toSymbol(binding.member).mapRustType {\n                                    it.stripOuter<RustType.Option>()\n                                },\n                            ) {\n                                write(memberName)\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    }\n\n    private fun serverRenderHeaderParser(\n        writer: RustWriter,\n        binding: HttpBindingDescriptor,\n        operationShape: OperationShape,\n    ) {\n        val deserializer = httpBindingGenerator(operationShape).generateDeserializeHeaderFn(binding)\n        writer.rustTemplate(\n            \"\"\"\n            #{deserializer}(&headers)?\n            \"\"\".trimIndent(),\n            \"deserializer\" to deserializer,\n            *codegenScope,\n        )\n    }\n\n    private fun serverRenderPrefixHeadersParser(\n        writer: RustWriter,\n        binding: HttpBindingDescriptor,\n        operationShape: OperationShape,\n    ) {\n        check(binding.location == HttpLocation.PREFIX_HEADERS)\n\n        val deserializer =\n            httpBindingGenerator(operationShape).generateDeserializePrefixHeadersFn(binding)\n        writer.rustTemplate(\n            \"\"\"\n            #{deserializer}(&headers)?\n            \"\"\".trimIndent(),\n            \"deserializer\" to deserializer,\n            *codegenScope,\n        )\n    }\n\n    private fun generateParseStrFn(\n        binding: HttpBindingDescriptor,\n        percentDecoding: Boolean,\n    ): RuntimeType {\n        val output = unconstrainedShapeSymbolProvider.toSymbol(binding.member)\n        return protocolFunctions.deserializeFn(binding.member) { fnName ->\n            rustBlockTemplate(\n                \"pub fn $fnName(value: &str) -> std::result::Result<#{O}, #{RequestRejection}>\",\n                *codegenScope,\n                \"O\" to output,\n            ) {\n                val target = model.expectShape(binding.member.target)\n\n                when {\n                    target.isStringShape -> {\n                        if (percentDecoding) {\n                            rustTemplate(\n                                \"\"\"\n                                let value = #{PercentEncoding}::percent_decode_str(value).decode_utf8()?.into_owned();\n                                \"\"\",\n                                *codegenScope,\n                            )\n                        } else {\n                            rust(\"let value = value.to_owned();\")\n                        }\n                    }\n\n                    target.isTimestampShape -> {\n                        val index = HttpBindingIndex.of(model)\n                        val timestampFormat =\n                            index.determineTimestampFormat(\n                                binding.member,\n                                binding.location,\n                                protocol.defaultTimestampFormat,\n                            )\n                        val timestampFormatType =\n                            RuntimeType.parseTimestampFormat(CodegenTarget.SERVER, runtimeConfig, timestampFormat)\n\n                        if (percentDecoding) {\n                            rustTemplate(\n                                \"\"\"\n                                let value = #{PercentEncoding}::percent_decode_str(value).decode_utf8()?;\n                                let value = #{DateTime}::from_str(value.as_ref(), #{format})?\n                                \"\"\",\n                                *codegenScope,\n                                \"format\" to timestampFormatType,\n                            )\n                        } else {\n                            rustTemplate(\n                                \"\"\"\n                                let value = #{DateTime}::from_str(value, #{format})?\n                                \"\"\",\n                                *codegenScope,\n                                \"format\" to timestampFormatType,\n                            )\n                        }\n                        for (customization in customizations) {\n                            customization.section(\n                                ServerHttpBoundProtocolSection.AfterTimestampDeserializedMember(\n                                    binding.member,\n                                ),\n                            )(this)\n                        }\n                        rust(\";\")\n                    }\n\n                    else -> {\n                        check(target is NumberShape || target is BooleanShape)\n                        rustTemplate(\n                            \"\"\"\n                            let value = <_ as #{PrimitiveParse}>::parse_smithy_primitive(value)?;\n                            \"\"\",\n                            \"PrimitiveParse\" to\n                                RuntimeType.smithyTypes(runtimeConfig)\n                                    .resolve(\"primitive::Parse\"),\n                        )\n                    }\n                }\n                rust(\"Ok(${symbolProvider.wrapOptional(binding.member, \"value\")})\")\n            }\n        }\n    }\n\n    private fun streamingBodyTraitBounds(operationShape: OperationShape) =\n        if (operationShape.inputShape(model).hasStreamingMember(model)) {\n            if (runtimeConfig.httpVersion == HttpVersion.Http1x) {\n                // HTTP/1: No Into<ByteStream> available, must use ByteStream::from_body_1_x() which requires Send + Sync.\n                // HTTP/0.4: Uses Into<ByteStream> conversion without these bounds.\n                \"\"\"\n                B: #{HttpBody}::Body<Data = #{Bytes}> + #{Send} + #{Sync} + 'static,\n                B::Error: Into<::aws_smithy_types::body::Error> + 'static,\n                \"\"\"\n            } else {\n                \"\\n B: Into<#{SmithyTypes}::byte_stream::ByteStream>,\"\n            }\n        } else {\n            \"\"\n        }\n\n    private fun eventStreamBodyInto() =\n        writable {\n            if (runtimeConfig.httpVersion == HttpVersion.Http1x) {\n                rustTemplate(\"#{SmithyTypes}::body::SdkBody::from_body_1_x(body)\", *codegenScope)\n            } else {\n                rust(\"body.into().into_inner()\")\n            }\n        }\n\n    private fun httpBindingGenerator(operationShape: OperationShape) =\n        ServerRequestBindingGenerator(protocol, codegenContext, operationShape, additionalHttpBindingCustomizations)\n}\n\nprivate fun eventStreamWithInitialResponse(\n    codegenContext: ServerCodegenContext,\n    protocol: ServerProtocol,\n    params: EventStreamBodyParams,\n): Writable {\n    return if (codegenContext.settings.codegenConfig.alwaysSendEventStreamInitialResponse) {\n        val initialResponseGenerator =\n            params.eventStreamMarshallerGenerator.renderInitialResponseGenerator(params.payloadContentType)\n\n        writable {\n            rustTemplate(\n                \"\"\"\n                {\n                    use #{futures_util}::StreamExt;\n                    let payload = #{initial_response_payload};\n                    let initial_message = #{initial_response_generator}(payload);\n                    let mut buffer = #{Vec}::new();\n                    #{write_message_to}(&initial_message, &mut buffer)\n                        .expect(\"Failed to write initial message\");\n                    let initial_message_stream = futures_util::stream::iter(vec![#{initial_message_item}]);\n                    let adapter = #{message_stream_adaptor};\n                    initial_message_stream.chain(adapter)\n                }\n                \"\"\",\n                *preludeScope,\n                \"futures_util\" to ServerCargoDependency.FuturesUtil.toType(),\n                \"initial_response_payload\" to initialResponsePayload(codegenContext, protocol, params),\n                \"message_stream_adaptor\" to messageStreamAdaptor(params.outerName, params.memberName),\n                \"initial_response_generator\" to initialResponseGenerator,\n                \"initial_message_item\" to initialMessageItem(codegenContext.settings.runtimeConfig),\n                \"write_message_to\" to\n                    RuntimeType.smithyEventStream(codegenContext.runtimeConfig)\n                        .resolve(\"frame::write_message_to\"),\n            )\n        }\n    } else {\n        messageStreamAdaptor(params.outerName, params.memberName)\n    }\n}\n\nprivate fun initialResponsePayload(\n    codegenContext: ServerCodegenContext,\n    protocol: ServerProtocol,\n    params: EventStreamBodyParams,\n): Writable {\n    return if (protocol.httpBindingResolver.handlesEventStreamInitialResponse(params.operationShape)) {\n        val serializer = protocol.structuredDataSerializer().operationOutputSerializer(params.operationShape)!!\n        writable {\n            rustTemplate(\n                \"#{Bytes}::from(#{serializer}(&output)?)\",\n                \"serializer\" to serializer,\n                \"Bytes\" to RuntimeType.Bytes,\n            )\n        }\n    } else {\n        val outputShape = params.operationShape.outputShape(codegenContext.model)\n        val emptyPayloadFn = protocol.structuredDataSerializer().unsetStructure(outputShape)\n        writable {\n            rustTemplate(\n                \"#{Bytes}::from(#{empty_payload_fn}())\",\n                \"Bytes\" to RuntimeType.Bytes,\n                \"empty_payload_fn\" to emptyPayloadFn,\n            )\n        }\n    }\n}\n\nprivate fun messageStreamAdaptor(\n    outerName: String,\n    memberName: String,\n) = writable {\n    rust(\"$outerName.$memberName.into_body_stream(marshaller, error_marshaller, signer)\")\n}\n\nprivate fun initialMessageItem(runtimeConfig: RuntimeConfig) =\n    writable {\n        if (runtimeConfig.httpVersion == HttpVersion.Http1x) {\n            // http@1: Initial message is chained with MessageStreamAdapter (which yields Frame<Bytes>),\n            // so both streams must have the same Item type for .chain() to work\n            rustTemplate(\n                \"Ok(#{http_body_1x}::Frame::data(buffer.into()))\",\n                \"http_body_1x\" to CargoDependency.HttpBody1x.toType(),\n            )\n        } else {\n            // http@0: MessageStreamAdapter yields Bytes, so initial message must also be Bytes\n            rust(\"Ok(buffer.into())\")\n        }\n    }\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/protocols/ServerProtocolLoader.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.protocols\n\nimport software.amazon.smithy.aws.traits.protocols.AwsJson1_0Trait\nimport software.amazon.smithy.aws.traits.protocols.AwsJson1_1Trait\nimport software.amazon.smithy.aws.traits.protocols.RestJson1Trait\nimport software.amazon.smithy.aws.traits.protocols.RestXmlTrait\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.protocol.traits.Rpcv2CborTrait\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.withBlockTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.http.HttpBindingCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.AwsJsonVersion\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.ProtocolLoader\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.ProtocolMap\nimport software.amazon.smithy.rust.codegen.core.util.isOutputEventStream\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenContext\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.protocol.ServerProtocolGenerator\n\nclass StreamPayloadSerializerCustomization : ServerHttpBoundProtocolCustomization() {\n    override fun section(section: ServerHttpBoundProtocolSection): Writable =\n        when (section) {\n            is ServerHttpBoundProtocolSection.WrapStreamPayload ->\n                writable {\n                    if (section.params.shape.isOutputEventStream(section.params.codegenContext.model)) {\n                        // Event stream payload, of type `aws_smithy_http::event_stream::MessageStreamAdapter`, already\n                        // implements the `Stream` trait, so no need to wrap it in the new-type.\n                        section.params.payloadGenerator.generatePayload(\n                            this,\n                            section.params.shapeName,\n                            section.params.shape,\n                        )\n                    } else {\n                        // Otherwise, the stream payload is `aws_smithy_types::byte_stream::ByteStream`. We wrap it in the\n                        // new-type to enable the `Stream` trait.\n                        withBlockTemplate(\n                            \"#{FuturesStreamCompatByteStream}::new(\",\n                            \")\",\n                            \"FuturesStreamCompatByteStream\" to RuntimeType.futuresStreamCompatByteStream(section.params.codegenContext.runtimeConfig),\n                        ) {\n                            section.params.payloadGenerator.generatePayload(\n                                this,\n                                section.params.shapeName,\n                                section.params.shape,\n                            )\n                        }\n                    }\n                }\n\n            else -> emptySection\n        }\n}\n\nclass ServerProtocolLoader(supportedProtocols: ProtocolMap<ServerProtocolGenerator, ServerCodegenContext>) :\n    ProtocolLoader<ServerProtocolGenerator, ServerCodegenContext>(supportedProtocols) {\n    companion object {\n        fun defaultProtocols(\n            httpBindingCustomizations: (ShapeId) -> List<HttpBindingCustomization> = { _ -> listOf() },\n        ) = mapOf(\n            RestJson1Trait.ID to\n                ServerRestJsonFactory(\n                    additionalServerHttpBoundProtocolCustomizations =\n                        listOf(\n                            StreamPayloadSerializerCustomization(),\n                        ),\n                    additionalHttpBindingCustomizations = httpBindingCustomizations(RestJson1Trait.ID),\n                ),\n            RestXmlTrait.ID to\n                ServerRestXmlFactory(\n                    additionalServerHttpBoundProtocolCustomizations =\n                        listOf(\n                            StreamPayloadSerializerCustomization(),\n                        ),\n                ),\n            AwsJson1_0Trait.ID to\n                ServerAwsJsonFactory(\n                    AwsJsonVersion.Json10,\n                    additionalServerHttpBoundProtocolCustomizations = listOf(StreamPayloadSerializerCustomization()),\n                    additionalHttpBindingCustomizations = httpBindingCustomizations(AwsJson1_0Trait.ID),\n                ),\n            AwsJson1_1Trait.ID to\n                ServerAwsJsonFactory(\n                    AwsJsonVersion.Json11,\n                    additionalServerHttpBoundProtocolCustomizations = listOf(StreamPayloadSerializerCustomization()),\n                    additionalHttpBindingCustomizations = httpBindingCustomizations(AwsJson1_1Trait.ID),\n                ),\n            Rpcv2CborTrait.ID to\n                ServerRpcV2CborFactory(\n                    additionalServerHttpBoundProtocolCustomizations =\n                        listOf(\n                            StreamPayloadSerializerCustomization(),\n                        ),\n                    additionalHttpBindingCustomizations = httpBindingCustomizations(Rpcv2CborTrait.ID),\n                ),\n        )\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/protocols/ServerRestJson.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.protocols\n\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.http.HttpBindingCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.protocol.ProtocolSupport\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.HttpBindingResolver\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.Protocol\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.ProtocolGeneratorFactory\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.parse.JsonParserCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.restJsonFieldName\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.serialize.JsonSerializerGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.serialize.StructuredDataSerializerGenerator\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenContext\nimport software.amazon.smithy.rust.codegen.server.smithy.customizations.BeforeIteratingOverMapOrCollectionJsonCustomization\nimport software.amazon.smithy.rust.codegen.server.smithy.customizations.BeforeSerializingMemberJsonCustomization\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.protocol.ServerRestJsonProtocol\n\n/**\n * RestJson1 server-side protocol factory. This factory creates the [ServerHttpProtocolGenerator]\n * with RestJson1 specific configurations.\n */\nclass ServerRestJsonFactory(\n    private val additionalParserCustomizations: List<JsonParserCustomization> = listOf(),\n    private val additionalServerHttpBoundProtocolCustomizations: List<ServerHttpBoundProtocolCustomization> = listOf(),\n    private val additionalHttpBindingCustomizations: List<HttpBindingCustomization> = listOf(),\n) : ProtocolGeneratorFactory<ServerHttpBoundProtocolGenerator, ServerCodegenContext> {\n    override fun protocol(codegenContext: ServerCodegenContext): Protocol =\n        ServerRestJsonProtocol(codegenContext, additionalParserCustomizations)\n\n    override fun buildProtocolGenerator(codegenContext: ServerCodegenContext): ServerHttpBoundProtocolGenerator =\n        ServerHttpBoundProtocolGenerator(\n            codegenContext,\n            ServerRestJsonProtocol(\n                codegenContext,\n                additionalParserCustomizations,\n            ),\n            additionalServerHttpBoundProtocolCustomizations,\n            additionalHttpBindingCustomizations,\n        )\n\n    override fun support(): ProtocolSupport {\n        return ProtocolSupport(\n            // Client support\n            requestSerialization = false,\n            requestBodySerialization = false,\n            responseDeserialization = false,\n            errorDeserialization = false,\n            // Server support\n            requestDeserialization = true,\n            requestBodyDeserialization = true,\n            responseSerialization = true,\n            errorSerialization = true,\n        )\n    }\n}\n\nclass ServerRestJsonSerializerGenerator(\n    private val codegenContext: ServerCodegenContext,\n    private val httpBindingResolver: HttpBindingResolver,\n    private val jsonSerializerGenerator: JsonSerializerGenerator =\n        JsonSerializerGenerator(\n            codegenContext,\n            httpBindingResolver,\n            ::restJsonFieldName,\n            customizations =\n                listOf(\n                    BeforeIteratingOverMapOrCollectionJsonCustomization(codegenContext),\n                    BeforeSerializingMemberJsonCustomization(codegenContext),\n                ),\n        ),\n) : StructuredDataSerializerGenerator by jsonSerializerGenerator\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/protocols/ServerRestXmlFactory.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.protocols\n\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.protocol.ProtocolSupport\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.Protocol\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.ProtocolGeneratorFactory\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenContext\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.protocol.ServerRestXmlProtocol\n\n/*\n * RestXml server-side protocol factory. This factory creates the [ServerHttpProtocolGenerator]\n * with RestXml specific configurations.\n */\nclass ServerRestXmlFactory(\n    private val additionalServerHttpBoundProtocolCustomizations: List<ServerHttpBoundProtocolCustomization> = listOf(),\n) : ProtocolGeneratorFactory<ServerHttpBoundProtocolGenerator, ServerCodegenContext> {\n    override fun protocol(codegenContext: ServerCodegenContext): Protocol = ServerRestXmlProtocol(codegenContext)\n\n    override fun buildProtocolGenerator(codegenContext: ServerCodegenContext): ServerHttpBoundProtocolGenerator =\n        ServerHttpBoundProtocolGenerator(\n            codegenContext,\n            ServerRestXmlProtocol(codegenContext),\n            additionalServerHttpBoundProtocolCustomizations,\n        )\n\n    override fun support(): ProtocolSupport {\n        return ProtocolSupport(\n            // Client support\n            requestSerialization = false,\n            requestBodySerialization = false,\n            responseDeserialization = false,\n            errorDeserialization = false,\n            // Server support\n            requestDeserialization = true,\n            requestBodyDeserialization = true,\n            responseSerialization = true,\n            errorSerialization = true,\n        )\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/protocols/ServerRpcV2CborFactory.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.protocols\n\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.http.HttpBindingCustomization\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.protocol.ProtocolSupport\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.Protocol\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.ProtocolGeneratorFactory\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenContext\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.protocol.ServerRpcV2CborProtocol\n\nclass ServerRpcV2CborFactory(\n    private val additionalServerHttpBoundProtocolCustomizations: List<ServerHttpBoundProtocolCustomization> =\n        emptyList(),\n    private val additionalHttpBindingCustomizations: List<HttpBindingCustomization> = listOf(),\n) : ProtocolGeneratorFactory<ServerHttpBoundProtocolGenerator, ServerCodegenContext> {\n    override fun protocol(codegenContext: ServerCodegenContext): Protocol = ServerRpcV2CborProtocol(codegenContext)\n\n    override fun buildProtocolGenerator(codegenContext: ServerCodegenContext): ServerHttpBoundProtocolGenerator =\n        ServerHttpBoundProtocolGenerator(\n            codegenContext,\n            ServerRpcV2CborProtocol(codegenContext),\n            additionalServerHttpBoundProtocolCustomizations,\n            additionalHttpBindingCustomizations = additionalHttpBindingCustomizations,\n        )\n\n    override fun support(): ProtocolSupport {\n        return ProtocolSupport(\n            // Client support\n            requestSerialization = false,\n            requestBodySerialization = false,\n            responseDeserialization = false,\n            errorDeserialization = false,\n            // Server support\n            requestDeserialization = true,\n            requestBodyDeserialization = true,\n            responseSerialization = true,\n            errorSerialization = true,\n        )\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/testutil/HttpTestVersion.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.testutil\n\n/**\n * HTTP version identifier for dual-version testing.\n *\n * This enum distinguishes between HTTP 0.x (hyper 0.x) and HTTP 1.x (hyper 1.x)\n * when running integration tests that need to verify behavior across both versions.\n */\nenum class HttpTestVersion(val displayName: String) {\n    /** HTTP 0.x using hyper 0.x */\n    HTTP_0_X(\"HTTP 0.x\"),\n\n    /** HTTP 1.x using hyper 1.x */\n    HTTP_1_X(\"HTTP 1.x\"),\n}\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/testutil/MultiVersionTestFailure.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.testutil\n\nimport kotlin.reflect.KClass\n\n/**\n * Exception thrown when tests fail for one or more HTTP versions in dual-version testing.\n *\n * This exception provides structured access to failures across multiple HTTP versions,\n * allowing tests to programmatically inspect which versions failed and with what exceptions.\n */\nclass MultiVersionTestFailure(\n    val failures: List<HttpVersionFailure>,\n) : AssertionError(buildMessage(failures), failures.firstOrNull()?.exception) {\n    init {\n        // Add remaining exceptions as suppressed for compatibility with existing error reporting\n        failures.drop(1).forEach { addSuppressed(it.exception) }\n    }\n\n    /**\n     * Represents a test failure for a specific HTTP version.\n     */\n    data class HttpVersionFailure(\n        val version: HttpTestVersion,\n        val exception: Throwable,\n    )\n\n    /**\n     * Returns true if all failures are of the specified exception type.\n     */\n    fun allFailuresAreOfType(type: KClass<out Throwable>): Boolean = failures.all { type.isInstance(it.exception) }\n\n    /**\n     * Returns failures that are of the specified exception type.\n     */\n    fun getFailuresOfType(type: KClass<out Throwable>): List<HttpVersionFailure> =\n        failures.filter { type.isInstance(it.exception) }\n\n    /**\n     * Returns true if there is a failure for the specified HTTP version.\n     */\n    fun hasFailureFor(version: HttpTestVersion): Boolean = failures.any { it.version == version }\n\n    /**\n     * Returns the failure for the specified HTTP version, or null if none exists.\n     */\n    fun getFailureFor(version: HttpTestVersion): HttpVersionFailure? = failures.find { it.version == version }\n\n    companion object {\n        private fun buildMessage(failures: List<HttpVersionFailure>): String =\n            buildString {\n                appendLine(\"Test failed for ${failures.size} HTTP version(s):\")\n                failures.forEach { (version, exception) ->\n                    appendLine()\n                    appendLine(\"=== Failure in ${version.displayName} ===\")\n                    appendLine(exception.message ?: exception.toString())\n                }\n            }\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/testutil/ServerCodegenIntegrationTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.testutil\n\nimport software.amazon.smithy.build.PluginContext\nimport software.amazon.smithy.build.SmithyBuildPlugin\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.node.Node\nimport software.amazon.smithy.rust.codegen.core.smithy.RustCrate\nimport software.amazon.smithy.rust.codegen.core.testutil.IntegrationTestParams\nimport software.amazon.smithy.rust.codegen.core.testutil.codegenIntegrationTest\nimport software.amazon.smithy.rust.codegen.server.smithy.RustServerCodegenPlugin\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenConfig\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenContext\nimport software.amazon.smithy.rust.codegen.server.smithy.customize.ServerCodegenDecorator\nimport java.nio.file.Path\n\n/**\n * Specifies which HTTP version(s) to test in [serverIntegrationTest].\n */\nsealed class HttpTestType {\n    /**\n     * Run the test for all HTTP versions: HTTP 0.x and HTTP 1.x.\n     * This is the default to ensure comprehensive coverage across both HTTP versions.\n     */\n    object ALL : HttpTestType()\n\n    /**\n     * Run the test only for a specific HTTP version.\n     * Use this for tests that are specific to either HTTP 0.x or HTTP 1.x behavior.\n     */\n    data class Only(val version: HttpTestVersion) : HttpTestType()\n\n    /**\n     * Run the test once with whatever http-1x value is provided in the params.\n     * The framework will not override the http-1x flag.\n     * Use this when you want to explicitly control the http-1x setting or test default behavior.\n     */\n    object Default : HttpTestType()\n}\n\n/**\n * Represents a generated server with its associated HTTP test version.\n */\ndata class GeneratedServer(\n    val path: Path,\n    val httpVersion: HttpTestVersion,\n)\n\n/**\n * This file is entirely analogous to [software.amazon.smithy.rust.codegen.client.testutil.ClientCodegenIntegrationTest.kt].\n */\n\nfun serverIntegrationTest(\n    model: Model,\n    params: IntegrationTestParams = IntegrationTestParams(),\n    additionalDecorators: List<ServerCodegenDecorator> = listOf(),\n    testCoverage: HttpTestType = HttpTestType.ALL,\n    test: (ServerCodegenContext, RustCrate) -> Unit = { _, _ -> },\n): List<GeneratedServer> {\n    fun invokeRustCodegenPlugin(ctx: PluginContext) {\n        val codegenDecorator =\n            object : ServerCodegenDecorator {\n                override val name: String = \"Add tests\"\n                override val order: Byte = 0\n\n                override fun classpathDiscoverable(): Boolean = false\n\n                override fun extras(\n                    codegenContext: ServerCodegenContext,\n                    rustCrate: RustCrate,\n                ) {\n                    test(codegenContext, rustCrate)\n                }\n            }\n        RustServerCodegenPlugin().executeWithDecorator(ctx, codegenDecorator, *additionalDecorators.toTypedArray())\n    }\n\n    // Handle AS_CONFIGURED case separately - run once without modifying params\n    if (testCoverage is HttpTestType.Default) {\n        val path = codegenIntegrationTest(model, params, invokePlugin = ::invokeRustCodegenPlugin)\n        // Determine version from params - check if http-1x is enabled\n        val http1xNode =\n            params.additionalSettings\n                .expectObjectNode()\n                .getMember(\"codegen\")\n                .orElse(Node.objectNode())\n                .expectObjectNode()\n                .getBooleanMember(ServerCodegenConfig.HTTP_1X_CONFIG_KEY)\n        val http1xEnabled = http1xNode.map { it.value }.orElse(false)\n        val version = if (http1xEnabled) HttpTestVersion.HTTP_1_X else HttpTestVersion.HTTP_0_X\n        return listOf(GeneratedServer(path, version))\n    }\n\n    // Determine which HTTP versions to test\n    val shouldTestHttp0 =\n        when (testCoverage) {\n            is HttpTestType.ALL -> true\n            is HttpTestType.Only -> testCoverage.version == HttpTestVersion.HTTP_0_X\n            is HttpTestType.Default -> false // Already handled above\n        }\n    val shouldTestHttp1 =\n        when (testCoverage) {\n            is HttpTestType.ALL -> true\n            is HttpTestType.Only -> testCoverage.version == HttpTestVersion.HTTP_1_X\n            is HttpTestType.Default -> false // Already handled above\n        }\n\n    val generatedServers = mutableListOf<GeneratedServer>()\n    val errors = mutableListOf<MultiVersionTestFailure.HttpVersionFailure>()\n\n    // Helper function to run test for a specific HTTP version\n    val runTestForVersion: (HttpTestVersion) -> Result<Path> = { version ->\n        try {\n            val http1xEnabled = version == HttpTestVersion.HTTP_1_X\n\n            // Deep merge the codegen settings to preserve existing keys\n            val existingCodegenSettings =\n                params.additionalSettings\n                    .expectObjectNode()\n                    .getMember(\"codegen\")\n                    .orElse(Node.objectNode())\n                    .expectObjectNode()\n\n            val mergedCodegenSettings =\n                existingCodegenSettings.toBuilder()\n                    .withMember(ServerCodegenConfig.HTTP_1X_CONFIG_KEY, http1xEnabled)\n                    .build()\n\n            val versionParams =\n                params.copy(\n                    additionalSettings =\n                        params.additionalSettings.merge(\n                            Node.objectNodeBuilder()\n                                .withMember(\"codegen\", mergedCodegenSettings)\n                                .build(),\n                        ),\n                )\n            Result.success(codegenIntegrationTest(model, versionParams, invokePlugin = ::invokeRustCodegenPlugin))\n        } catch (e: Throwable) {\n            Result.failure(e)\n        }\n    }\n\n    // Helper function to handle test results\n    val handleResult: (HttpTestVersion, Result<Path>) -> Unit = { version, result ->\n        result.onSuccess { generatedServers.add(GeneratedServer(it, version)) }\n            .onFailure { errors.add(MultiVersionTestFailure.HttpVersionFailure(version, it)) }\n    }\n\n    // Run tests sequentially (original behavior)\n    if (shouldTestHttp0) {\n        handleResult(HttpTestVersion.HTTP_0_X, runTestForVersion(HttpTestVersion.HTTP_0_X))\n    }\n\n    if (shouldTestHttp1) {\n        handleResult(HttpTestVersion.HTTP_1_X, runTestForVersion(HttpTestVersion.HTTP_1_X))\n    }\n\n    // If there were any errors, throw a combined exception with clear version information\n    if (errors.isNotEmpty()) {\n        throw MultiVersionTestFailure(errors)\n    }\n\n    return generatedServers.ifEmpty { throw IllegalStateException(\"No tests were run\") }\n}\n\nabstract class ServerDecoratableBuildPlugin : SmithyBuildPlugin {\n    abstract fun executeWithDecorator(\n        context: PluginContext,\n        vararg decorator: ServerCodegenDecorator,\n    )\n\n    override fun execute(context: PluginContext) {\n        executeWithDecorator(context)\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/testutil/ServerTestHelpers.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.testutil\n\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.knowledge.NullableIndex\nimport software.amazon.smithy.model.node.ObjectNode\nimport software.amazon.smithy.model.shapes.ServiceShape\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.implBlock\nimport software.amazon.smithy.rust.codegen.core.smithy.HttpVersion\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig\nimport software.amazon.smithy.rust.codegen.core.smithy.RustCrate\nimport software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProviderConfig\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.StructSettings\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.StructureGenerator\nimport software.amazon.smithy.rust.codegen.core.testutil.TestModuleDocProvider\nimport software.amazon.smithy.rust.codegen.core.testutil.TestRuntimeConfig\nimport software.amazon.smithy.rust.codegen.server.smithy.RustServerCodegenPlugin\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenConfig\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenContext\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerModuleProvider\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerRustSettings\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerSymbolProviders\nimport software.amazon.smithy.rust.codegen.server.smithy.customizations.SmithyValidationExceptionConversionGenerator\nimport software.amazon.smithy.rust.codegen.server.smithy.customize.CombinedServerCodegenDecorator\nimport software.amazon.smithy.rust.codegen.server.smithy.customize.ServerCodegenDecorator\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.ServerBuilderGenerator\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.protocol.ServerProtocol\nimport software.amazon.smithy.rust.codegen.server.smithy.protocols.ServerProtocolLoader\n\n/**\n * Server-specific test RuntimeConfig that uses the same HTTP version default as production server code.\n *\n * This is used for server unit tests to ensure they test the default HTTP version behavior.\n * Integration tests using serverIntegrationTest() can override this via additionalSettings.\n *\n * The HTTP version is derived from ServerCodegenConfig.DEFAULT_HTTP_1X to maintain a single source of truth.\n *\n * Note: Client tests use TestRuntimeConfig which defaults to HTTP 1.x.\n */\nval ServerTestRuntimeConfig =\n    RuntimeConfig(\n        runtimeCrateLocation = TestRuntimeConfig.runtimeCrateLocation,\n        httpVersion = if (ServerCodegenConfig.DEFAULT_HTTP_1X) HttpVersion.Http1x else HttpVersion.Http0x,\n    )\n\n// These are the settings we default to if the user does not override them in their `smithy-build.json`.\nval ServerTestRustSymbolProviderConfig =\n    RustSymbolProviderConfig(\n        runtimeConfig = ServerTestRuntimeConfig,\n        renameExceptions = false,\n        nullabilityCheckMode = NullableIndex.CheckMode.SERVER,\n        moduleProvider = ServerModuleProvider,\n    )\n\nprivate fun testServiceShapeFor(model: Model) =\n    model.serviceShapes.firstOrNull() ?: ServiceShape.builder().version(\"test\").id(\"test#Service\").build()\n\nfun serverTestSymbolProvider(\n    model: Model,\n    serviceShape: ServiceShape? = null,\n) = serverTestSymbolProviders(model, serviceShape).symbolProvider\n\nfun serverTestSymbolProviders(\n    model: Model,\n    serviceShape: ServiceShape? = null,\n    settings: ServerRustSettings? = null,\n    decorators: List<ServerCodegenDecorator> = emptyList(),\n) = ServerSymbolProviders.from(\n    serverTestRustSettings(),\n    model,\n    serviceShape ?: testServiceShapeFor(model),\n    ServerTestRustSymbolProviderConfig,\n    (\n        settings ?: serverTestRustSettings(\n            (serviceShape ?: testServiceShapeFor(model)).id,\n        )\n    ).codegenConfig.publicConstrainedTypes,\n    CombinedServerCodegenDecorator(decorators),\n    RustServerCodegenPlugin::baseSymbolProvider,\n)\n\nfun serverTestRustSettings(\n    service: ShapeId = ShapeId.from(\"notrelevant#notrelevant\"),\n    moduleName: String = \"test-module\",\n    moduleVersion: String = \"0.0.1\",\n    moduleAuthors: List<String> = listOf(\"notrelevant\"),\n    moduleDescription: String = \"not relevant\",\n    moduleRepository: String? = null,\n    runtimeConfig: RuntimeConfig = TestRuntimeConfig,\n    codegenConfig: ServerCodegenConfig = ServerCodegenConfig(),\n    license: String? = null,\n    examplesUri: String? = null,\n    minimumSupportedRustVersion: String? = null,\n    customizationConfig: ObjectNode? = null,\n) = ServerRustSettings(\n    service,\n    moduleName,\n    moduleVersion,\n    moduleAuthors,\n    moduleDescription,\n    moduleRepository,\n    runtimeConfig,\n    codegenConfig,\n    license,\n    examplesUri,\n    minimumSupportedRustVersion,\n    customizationConfig,\n)\n\nfun serverTestCodegenContext(\n    model: Model,\n    serviceShape: ServiceShape? = null,\n    settings: ServerRustSettings = serverTestRustSettings(),\n    protocolShapeId: ShapeId? = null,\n    decorators: List<ServerCodegenDecorator> = emptyList(),\n): ServerCodegenContext {\n    val service = serviceShape ?: testServiceShapeFor(model)\n    val protocol = protocolShapeId ?: ShapeId.from(\"test#Protocol\")\n    val serverSymbolProviders =\n        ServerSymbolProviders.from(\n            settings,\n            model,\n            service,\n            ServerTestRustSymbolProviderConfig,\n            settings.codegenConfig.publicConstrainedTypes,\n            CombinedServerCodegenDecorator(decorators),\n            RustServerCodegenPlugin::baseSymbolProvider,\n        )\n\n    return ServerCodegenContext(\n        model,\n        serverSymbolProviders.symbolProvider,\n        TestModuleDocProvider,\n        service,\n        protocol,\n        settings,\n        serverSymbolProviders.unconstrainedShapeSymbolProvider,\n        serverSymbolProviders.constrainedShapeSymbolProvider,\n        serverSymbolProviders.constraintViolationSymbolProvider,\n        serverSymbolProviders.pubCrateConstrainedShapeSymbolProvider,\n    )\n}\n\nfun loadServerProtocol(model: Model): ServerProtocol {\n    val codegenContext = serverTestCodegenContext(model)\n    val (_, protocolGeneratorFactory) =\n        ServerProtocolLoader(ServerProtocolLoader.defaultProtocols()).protocolFor(model, codegenContext.serviceShape)\n    return protocolGeneratorFactory.buildProtocolGenerator(codegenContext).protocol\n}\n\n/**\n * In tests, we frequently need to generate a struct, a builder, and an impl block to access said builder.\n */\nfun StructureShape.serverRenderWithModelBuilder(\n    rustCrate: RustCrate,\n    model: Model,\n    symbolProvider: RustSymbolProvider,\n    writer: RustWriter,\n    protocol: ServerProtocol? = null,\n) {\n    StructureGenerator(model, symbolProvider, writer, this, emptyList(), StructSettings(false)).render()\n    val serverCodegenContext = serverTestCodegenContext(model)\n    // Note that this always uses `ServerBuilderGenerator` and _not_ `ServerBuilderGeneratorWithoutPublicConstrainedTypes`,\n    // regardless of the `publicConstrainedTypes` setting.\n    val modelBuilder =\n        ServerBuilderGenerator(\n            serverCodegenContext,\n            this,\n            SmithyValidationExceptionConversionGenerator(serverCodegenContext),\n            protocol ?: loadServerProtocol(model),\n        )\n    modelBuilder.render(rustCrate, writer)\n    writer.implBlock(symbolProvider.toSymbol(this)) {\n        modelBuilder.renderConvenienceMethod(this)\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/traits/ConstraintViolationRustBoxTrait.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.traits\n\nimport software.amazon.smithy.model.node.Node\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.model.traits.Trait\n\n/**\n * This shape is analogous to [software.amazon.smithy.rust.codegen.core.smithy.traits.RustBoxTrait], but for the\n * constraint violation graph. The sets of shapes we tag are different, and they are interpreted by the code generator\n * differently, so we need a separate tag.\n *\n * This is used to handle recursive constraint violations.\n * See [software.amazon.smithy.rust.codegen.server.smithy.transformers.RecursiveConstraintViolationBoxer].\n */\nclass ConstraintViolationRustBoxTrait : Trait {\n    val ID = ShapeId.from(\"software.amazon.smithy.rust.codegen.smithy.rust.synthetic#constraintViolationBox\")\n\n    override fun toNode(): Node = Node.objectNode()\n\n    override fun toShapeId(): ShapeId = ID\n}\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/traits/ShapeReachableFromOperationInputTagTrait.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.traits\n\nimport software.amazon.smithy.model.node.Node\nimport software.amazon.smithy.model.shapes.BlobShape\nimport software.amazon.smithy.model.shapes.ByteShape\nimport software.amazon.smithy.model.shapes.CollectionShape\nimport software.amazon.smithy.model.shapes.IntegerShape\nimport software.amazon.smithy.model.shapes.ListShape\nimport software.amazon.smithy.model.shapes.LongShape\nimport software.amazon.smithy.model.shapes.MapShape\nimport software.amazon.smithy.model.shapes.NumberShape\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.model.shapes.ShortShape\nimport software.amazon.smithy.model.shapes.StringShape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.shapes.UnionShape\nimport software.amazon.smithy.model.traits.AnnotationTrait\nimport software.amazon.smithy.rust.codegen.core.util.PANIC\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\n\n/**\n * Tag to indicate that an aggregate shape is reachable from operation input.\n *\n * See the [ShapesReachableFromOperationInputTagger] model transform for how it's used.\n */\nclass ShapeReachableFromOperationInputTagTrait : AnnotationTrait(ID, Node.objectNode()) {\n    companion object {\n        val ID = ShapeId.from(\"smithy.api.internal#syntheticStructureReachableFromOperationInputTag\")\n    }\n}\n\nprivate fun isShapeReachableFromOperationInput(shape: Shape) =\n    when (shape) {\n        is StructureShape, is UnionShape, is MapShape, is ListShape, is StringShape, is IntegerShape, is ShortShape, is LongShape, is ByteShape, is BlobShape -> {\n            shape.hasTrait<ShapeReachableFromOperationInputTagTrait>()\n        }\n\n        else -> PANIC(\"this method does not support shape type ${shape.type}\")\n    }\n\nfun StringShape.isReachableFromOperationInput() = isShapeReachableFromOperationInput(this)\n\nfun StructureShape.isReachableFromOperationInput() = isShapeReachableFromOperationInput(this)\n\nfun CollectionShape.isReachableFromOperationInput() = isShapeReachableFromOperationInput(this)\n\nfun UnionShape.isReachableFromOperationInput() = isShapeReachableFromOperationInput(this)\n\nfun MapShape.isReachableFromOperationInput() = isShapeReachableFromOperationInput(this)\n\nfun IntegerShape.isReachableFromOperationInput() = isShapeReachableFromOperationInput(this)\n\nfun NumberShape.isReachableFromOperationInput() = isShapeReachableFromOperationInput(this)\n\nfun BlobShape.isReachableFromOperationInput() = isShapeReachableFromOperationInput(this)\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/traits/SyntheticStructureFromConstrainedMemberTrait.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.traits\n\nimport software.amazon.smithy.model.node.Node\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.model.traits.AnnotationTrait\n\n/**\n * Trait applied to an overridden shape indicating the member of this new shape type\n */\nclass SyntheticStructureFromConstrainedMemberTrait(val container: Shape, val member: MemberShape) : AnnotationTrait(SyntheticStructureFromConstrainedMemberTrait.ID, Node.objectNode()) {\n    companion object {\n        val ID: ShapeId = ShapeId.from(\"smithy.api.internal#overriddenMember\")\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/transformers/AttachValidationExceptionToConstrainedOperationInputs.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.transformers\n\nimport software.amazon.smithy.framework.rust.ValidationExceptionTrait\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.EnumShape\nimport software.amazon.smithy.model.shapes.ListShape\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.ServiceShape\nimport software.amazon.smithy.model.shapes.SetShape\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.traits.ErrorTrait\nimport software.amazon.smithy.model.traits.RequiredTrait\nimport software.amazon.smithy.model.transform.ModelTransformer\nimport software.amazon.smithy.rust.codegen.core.smithy.DirectedWalker\nimport software.amazon.smithy.rust.codegen.core.util.hasEventStreamMember\nimport software.amazon.smithy.rust.codegen.core.util.inputShape\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerRustSettings\nimport software.amazon.smithy.rust.codegen.server.smithy.customizations.SmithyValidationExceptionConversionGenerator\nimport software.amazon.smithy.rust.codegen.server.smithy.hasConstraintTrait\nimport java.util.logging.Logger\n\nprivate val logger: Logger = Logger.getLogger(\"AttachValidationExceptionToConstrainedOperationInputs\")\n\n/**\n * Checks if the model has a custom validation exception defined.\n * A custom validation exception is a structure with the `@validationException` trait.\n */\nprivate fun hasCustomValidationException(model: Model): Boolean =\n    model.shapes(StructureShape::class.java).anyMatch { it.hasTrait(ValidationExceptionTrait.ID) }\n\n/**\n * Ensures the `smithy.framework#ValidationException` shape and its dependencies exist in the model.\n * The shape is normally provided by the `smithy-validation-model` dependency, but it may not be on\n * the classpath for all consumers, or may be removed by Smithy build projection transforms. If the\n * shape is missing, we add it programmatically so that adding a ShapeId reference to it doesn't\n * result in a dangling reference.\n */\nprivate fun ensureValidationExceptionShapeExists(model: Model): Model {\n    val shapeId = SmithyValidationExceptionConversionGenerator.SHAPE_ID\n    if (model.getShape(shapeId).isPresent) {\n        return model\n    }\n\n    val ns = shapeId.namespace\n    val fieldShape =\n        StructureShape.builder().id(\"$ns#ValidationExceptionField\")\n            .addMember(\n                MemberShape.builder().id(\"$ns#ValidationExceptionField\\$path\")\n                    .target(\"smithy.api#String\").addTrait(RequiredTrait()).build(),\n            )\n            .addMember(\n                MemberShape.builder().id(\"$ns#ValidationExceptionField\\$message\")\n                    .target(\"smithy.api#String\").addTrait(RequiredTrait()).build(),\n            ).build()\n\n    val fieldListShape =\n        ListShape.builder().id(\"$ns#ValidationExceptionFieldList\")\n            .member(ShapeId.from(\"$ns#ValidationExceptionField\"))\n            .build()\n\n    val validationExceptionShape =\n        StructureShape.builder().id(shapeId)\n            .addTrait(ErrorTrait(\"client\"))\n            .addMember(\n                MemberShape.builder().id(\"$ns#ValidationException\\$message\")\n                    .target(\"smithy.api#String\").addTrait(RequiredTrait()).build(),\n            )\n            .addMember(\n                MemberShape.builder().id(\"$ns#ValidationException\\$fieldList\")\n                    .target(\"$ns#ValidationExceptionFieldList\").build(),\n            ).build()\n\n    return model.toBuilder()\n        .addShapes(listOf(fieldShape, fieldListShape, validationExceptionShape))\n        .build()\n}\n\nprivate fun addValidationExceptionToMatchingServiceShapes(\n    model: Model,\n    filterPredicate: (ServiceShape) -> Boolean,\n): Model {\n    val walker = DirectedWalker(model)\n    val operationsWithConstrainedInputWithoutValidationException =\n        model.serviceShapes\n            .filter(filterPredicate)\n            .flatMap { service ->\n                // Walk the entire service closure to find all operations, including those on resources.\n                walker.walkShapes(service).filterIsInstance<OperationShape>()\n            }\n            .filter { operationShape ->\n                walker.walkShapes(operationShape.inputShape(model))\n                    .any { it is SetShape || it is EnumShape || it.hasConstraintTrait() || it.hasEventStreamMember(model) }\n            }\n            .filter { !it.errors.contains(SmithyValidationExceptionConversionGenerator.SHAPE_ID) }\n\n    if (operationsWithConstrainedInputWithoutValidationException.isEmpty()) {\n        return model\n    }\n\n    // Ensure the smithy.framework#ValidationException shape and its dependencies exist in the model\n    // before adding references to it. The shape may be absent if it was not on the classpath or was\n    // removed by Smithy build projection transforms.\n    val modelWithShape = ensureValidationExceptionShapeExists(model)\n\n    return ModelTransformer.create().mapShapes(modelWithShape) { shape ->\n        if (shape is OperationShape && operationsWithConstrainedInputWithoutValidationException.contains(shape)) {\n            shape.toBuilder().addError(SmithyValidationExceptionConversionGenerator.SHAPE_ID).build()\n        } else {\n            shape\n        }\n    }\n}\n\n/**\n * Attach the `smithy.framework#ValidationException` error to operations whose inputs are constrained, if they belong\n * to a service in an allowlist.\n *\n * Some of the models we generate in CI have constrained operation inputs, but the operations don't have\n * `smithy.framework#ValidationException` in their list of errors. This is a codegen error, unless\n * `disableDefaultValidation` is set to `true`, a code generation mode we don't support yet. See [1] for more details.\n * Until we implement said mode, we manually attach the error to build these models, since we don't own them (they're\n * either actual AWS service model excerpts, or they come from the `awslabs/smithy` library.\n *\n * [1]: https://github.com/smithy-lang/smithy-rs/pull/1199#discussion_r809424783\n *\n * TODO(https://github.com/smithy-lang/smithy-rs/issues/1401): This transformer will go away once we add support for\n *  `disableDefaultValidation` set to `true`, allowing service owners to map from constraint violations to operation errors.\n */\nobject AttachValidationExceptionToConstrainedOperationInputsInAllowList {\n    private val serviceShapeIdAllowList =\n        setOf(\n            // These we currently generate server SDKs for.\n            ShapeId.from(\"aws.protocoltests.restjson#RestJson\"),\n            ShapeId.from(\"aws.protocoltests.json10#JsonRpc10\"),\n            ShapeId.from(\"aws.protocoltests.json#JsonProtocol\"),\n            ShapeId.from(\"com.amazonaws.s3#AmazonS3\"),\n            ShapeId.from(\"com.amazonaws.ebs#Ebs\"),\n            // These are only loaded in the classpath and need this model transformer, but we don't generate server\n            // SDKs for them. Here they are for reference.\n            // ShapeId.from(\"aws.protocoltests.restxml#RestXml\"),\n            // ShapeId.from(\"com.amazonaws.glacier#Glacier\"),\n            // ShapeId.from(\"aws.protocoltests.ec2#AwsEc2\"),\n            // ShapeId.from(\"aws.protocoltests.query#AwsQuery\"),\n            // ShapeId.from(\"com.amazonaws.machinelearning#AmazonML_20141212\"),\n        )\n\n    fun transform(model: Model): Model {\n        return addValidationExceptionToMatchingServiceShapes(\n            model,\n        ) { serviceShapeIdAllowList.contains(it.toShapeId()) }\n    }\n}\n\n/**\n * Attach the `smithy.framework#ValidationException` error to operations with constrained inputs.\n *\n * This transformer automatically adds the default ValidationException to operations that have\n * constrained inputs but don't have a validation exception attached. This behavior is skipped\n * if the model defines a custom validation exception (a structure with the @validationException trait),\n * in which case the user is expected to explicitly add their custom exception to operations.\n *\n * The `addValidationExceptionToConstrainedOperations` codegen flag is deprecated. The transformer\n * now automatically determines whether to add ValidationException based on whether a custom\n * validation exception exists in the model.\n */\nobject AttachValidationExceptionToConstrainedOperationInput {\n    fun transform(\n        model: Model,\n        settings: ServerRustSettings,\n    ): Model {\n        // Log deprecation warning if the flag is explicitly set\n        val addExceptionNullableFlag = settings.codegenConfig.addValidationExceptionToConstrainedOperations\n        if (addExceptionNullableFlag == true) {\n            // For backward compatibility, if `addValidationExceptionToConstrainedOperations` is explicitly true,\n            // add `ValidationException` regardless of whether a custom validation exception exists.\n            logger.warning(\n                \"The 'addValidationExceptionToConstrainedOperations' codegen flag is deprecated. \" +\n                    \"`smithy.framework#ValidationException` is now automatically added to operations with constrained inputs \" +\n                    \"unless a custom validation exception is defined in the model.\",\n            )\n        } else if (addExceptionNullableFlag == false ||\n            hasCustomValidationException(model) ||\n            settings.codegenConfig.experimentalCustomValidationExceptionWithReasonPleaseDoNotUse != null\n        ) {\n            // Skip adding `ValidationException` when:\n            // - `addValidationExceptionToConstrainedOperations` is explicitly false (backward compatibility), or\n            // - A custom validation exception exists (users must explicitly add it to operations), or\n            // - A custom validation exception is configured via the experimental codegen setting\n            return model\n        }\n\n        val service = settings.getService(model)\n\n        return addValidationExceptionToMatchingServiceShapes(\n            model,\n        ) { it == service }\n    }\n}\n\n/**\n * Attaches the `smithy.framework#ValidationException` error to operations with constrained inputs\n * if either of the following conditions is met:\n * 1. The operation belongs to a service in the allowlist.\n * 2. The codegen flag `addValidationExceptionToConstrainedOperations` has been set.\n *\n * The error is only attached if the operation does not already have `ValidationException` added.\n */\nobject AttachValidationExceptionToConstrainedOperationInputs {\n    fun transform(\n        model: Model,\n        settings: ServerRustSettings,\n    ): Model {\n        val allowListTransformedModel = AttachValidationExceptionToConstrainedOperationInputsInAllowList.transform(model)\n        return AttachValidationExceptionToConstrainedOperationInput.transform(allowListTransformedModel, settings)\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/transformers/ConstrainedMemberTransform.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.transformers\n\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.AbstractShapeBuilder\nimport software.amazon.smithy.model.shapes.ListShape\nimport software.amazon.smithy.model.shapes.MapShape\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.shapes.UnionShape\nimport software.amazon.smithy.model.traits.RequiredTrait\nimport software.amazon.smithy.model.traits.Trait\nimport software.amazon.smithy.model.transform.ModelTransformer\nimport software.amazon.smithy.rust.codegen.core.smithy.DirectedWalker\nimport software.amazon.smithy.rust.codegen.core.util.UNREACHABLE\nimport software.amazon.smithy.rust.codegen.core.util.orNull\nimport software.amazon.smithy.rust.codegen.server.smithy.allConstraintTraits\nimport software.amazon.smithy.rust.codegen.server.smithy.traits.SyntheticStructureFromConstrainedMemberTrait\nimport software.amazon.smithy.utils.ToSmithyBuilder\nimport java.lang.IllegalStateException\nimport java.util.Locale\n\n/**\n * Transforms all member shapes that have constraints on them into equivalent non-constrained\n * member shapes targeting synthetic constrained structure shapes with the member's constraints.\n *\n * E.g.:\n * ```\n * structure A {\n *   @length(min: 1, max: 69)\n *   string: ConstrainedString\n * }\n *\n * @length(min: 2, max: 10)\n * @pattern(\"^[A-Za-z]+$\")\n * string ConstrainedString\n * ```\n *\n * to\n *\n * ```\n * structure A {\n *   string: OverriddenConstrainedString\n * }\n *\n * @length(min: 1, max: 69)\n * @pattern(\"^[A-Za-z]+$\")\n * OverriddenConstrainedString\n *\n * @length(min: 2, max: 10)\n * @pattern(\"^[A-Za-z]+$\")\n * string ConstrainedString\n * ```\n */\nobject ConstrainedMemberTransform {\n    private data class MemberShapeTransformation(\n        val newShape: Shape,\n        val memberToChange: MemberShape,\n        val traitsToKeep: List<Trait>,\n    )\n\n    private val memberConstraintTraitsToOverride = allConstraintTraits - RequiredTrait::class.java\n\n    private fun Shape.hasMemberConstraintTrait() = memberConstraintTraitsToOverride.any(this::hasTrait)\n\n    fun transform(model: Model): Model {\n        val additionalNames = HashSet<ShapeId>()\n        val walker = DirectedWalker(model)\n\n        // Begin with the operations listed in the service and traverse the inputs, outputs, and errors specified\n        // in each operation. Extract the target shapes of constrained members from structures, lists, maps, and\n        // unions into standalone shapes with constraints. Update the model by incorporating these extracted shapes\n        // and adjust the target shapes of the original constrained members to reference the newly created\n        // constrained types.\n        val transformations =\n            model.operationShapes\n                .flatMap { listOfNotNull(it.input.orNull(), it.output.orNull()) + it.errors }\n                .mapNotNull { model.expectShape(it).asStructureShape().orElse(null) }\n                .flatMap { walker.walkShapes(it) }\n                .filter { it is StructureShape || it is ListShape || it is UnionShape || it is MapShape }\n                .flatMap { it.constrainedMembers() }\n                .mapNotNull {\n                    val transformation = it.makeNonConstrained(model, additionalNames)\n                    // Keep record of new names that have been generated to ensure none of them regenerated.\n                    additionalNames.add(transformation.newShape.id)\n\n                    transformation\n                }\n\n        return applyTransformations(model, transformations)\n    }\n\n    /***\n     * Returns a Model that has all the transformations applied on the original model.\n     */\n    private fun applyTransformations(\n        model: Model,\n        transformations: List<MemberShapeTransformation>,\n    ): Model {\n        val modelBuilder = model.toBuilder()\n\n        val memberShapesToReplace =\n            transformations.map {\n                // Add the new shape to the model.\n                modelBuilder.addShape(it.newShape)\n\n                it.memberToChange.toBuilder()\n                    .target(it.newShape.id)\n                    .traits(it.traitsToKeep)\n                    .build()\n            }\n\n        // Change all original constrained member shapes with the new standalone shapes.\n        return ModelTransformer.create()\n            .replaceShapes(modelBuilder.build(), memberShapesToReplace)\n    }\n\n    /**\n     * Returns a list of members that have constraint traits applied to them\n     */\n    private fun Shape.constrainedMembers(): List<MemberShape> =\n        this.allMembers.values.filter {\n            it.hasMemberConstraintTrait()\n        }\n\n    /**\n     * Returns the unique (within the model) shape ID of the new shape\n     */\n    private fun overriddenShapeId(\n        model: Model,\n        additionalNames: Set<ShapeId>,\n        memberShape: ShapeId,\n    ): ShapeId {\n        val structName = memberShape.name\n        val memberName =\n            memberShape.member.orElse(null)\n                .replaceFirstChar { if (it.isLowerCase()) it.titlecase(Locale.getDefault()) else it.toString() }\n\n        fun makeStructName(suffix: String = \"\") =\n            ShapeId.from(\"${memberShape.namespace}#${structName}${memberName}$suffix\")\n\n        fun structNameIsUnique(newName: ShapeId) = model.getShape(newName).isEmpty && !additionalNames.contains(newName)\n\n        fun generateUniqueName(): ShapeId {\n            // Ensure the name does not already exist in the model, else make it unique\n            // by appending a new number as the suffix.\n            (0..100).forEach {\n                val extractedStructName = if (it == 0) makeStructName(\"\") else makeStructName(\"$it\")\n                if (structNameIsUnique(extractedStructName)) {\n                    return extractedStructName\n                }\n            }\n\n            throw IllegalStateException(\"A unique name for the overridden structure type could not be generated\")\n        }\n\n        return generateUniqueName()\n    }\n\n    /**\n     * Returns the transformation that would be required to turn the given member shape\n     * into a non-constrained member shape.\n     */\n    private fun MemberShape.makeNonConstrained(\n        model: Model,\n        additionalNames: MutableSet<ShapeId>,\n    ): MemberShapeTransformation {\n        val (memberConstraintTraits, otherTraits) =\n            this.allTraits.values\n                .partition {\n                    memberConstraintTraitsToOverride.contains(it.javaClass)\n                }\n\n        check(memberConstraintTraits.isNotEmpty()) {\n            \"There must at least be one member constraint on the shape\"\n        }\n\n        // Build a new shape similar to the target of the constrained member shape. It should\n        // have all of the original constraints that have not been overridden, and the ones\n        // that this member shape overrides.\n        val targetShape = model.expectShape(this.target)\n        if (targetShape !is ToSmithyBuilder<*>) {\n            UNREACHABLE(\"Member target shapes will always be buildable\")\n        }\n\n        return when (val builder = targetShape.toBuilder()) {\n            is AbstractShapeBuilder<*, *> -> {\n                // Use the target builder to create a new standalone shape that would\n                // be added to the model later on. Keep all existing traits on the target\n                // but replace the ones that are overridden on the member shape.\n                val nonOverriddenConstraintTraits =\n                    builder.allTraits.values.filter { existingTrait ->\n                        memberConstraintTraits.none { it.toShapeId() == existingTrait.toShapeId() }\n                    }\n\n                // Add a synthetic constraint on all new shapes being defined, that would link\n                // the new shape to the root structure from which it is reachable.\n                val syntheticTrait =\n                    SyntheticStructureFromConstrainedMemberTrait(model.expectShape(this.container), this)\n\n                // Combine target traits, overridden traits and the synthetic trait\n                val newTraits =\n                    nonOverriddenConstraintTraits + memberConstraintTraits + syntheticTrait\n\n                // Create a new unique standalone shape that will be added to the model later on\n                val shapeId = overriddenShapeId(model, additionalNames, this.id)\n                val standaloneShape =\n                    builder.id(shapeId)\n                        .traits(newTraits)\n                        .build()\n\n                // Since the new shape has not been added to the model as yet, the current\n                // memberShape's target cannot be changed to the new shape.\n                MemberShapeTransformation(standaloneShape, this, otherTraits)\n            }\n\n            else -> UNREACHABLE(\"Constraint traits cannot to applied on ${this.id}\")\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/transformers/RecursiveConstraintViolationBoxer.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.transformers\n\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.rust.codegen.core.smithy.transformers.RecursiveShapeBoxer\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\nimport software.amazon.smithy.rust.codegen.server.smithy.traits.ConstraintViolationRustBoxTrait\n\nobject RecursiveConstraintViolationBoxer {\n    /**\n     * Transform a model which may contain recursive shapes into a model annotated with [ConstraintViolationRustBoxTrait].\n     *\n     * See [RecursiveShapeBoxer] for how the tagging algorithm works.\n     *\n     * The constraint violation graph needs to box types in recursive paths more often. Since we don't collect\n     * constraint violations (yet, see [0]), the constraint violation graph never holds `Vec<T>`s or `HashMap<K, V>`s,\n     * only simple types. Indeed, the following simple recursive model:\n     *\n     * ```smithy\n     * union Recursive {\n     *     list: List\n     * }\n     *\n     * @length(min: 69)\n     * list List {\n     *     member: Recursive\n     * }\n     * ```\n     *\n     * has a cycle that goes through a list shape, so no shapes in it need boxing in the regular shape graph. However,\n     * the constraint violation graph is infinitely recursive if we don't introduce boxing somewhere:\n     *\n     * ```rust\n     * pub mod model {\n     *     pub mod list {\n     *         pub enum ConstraintViolation {\n     *             Length(usize),\n     *             Member(\n     *                 usize,\n     *                 crate::model::recursive::ConstraintViolation,\n     *             ),\n     *         }\n     *     }\n     *\n     *     pub mod recursive {\n     *         pub enum ConstraintViolation {\n     *             List(crate::model::list::ConstraintViolation),\n     *         }\n     *     }\n     * }\n     * ```\n     *\n     * So what we do to fix this is to configure the `RecursiveShapeBoxer` model transform so that the \"cycles through\n     * lists and maps introduce indirection\" assumption can be lifted. This allows this model transform to tag member\n     * shapes along recursive paths with a new trait, `ConstraintViolationRustBoxTrait`, that the constraint violation\n     * type generation then utilizes to ensure that no infinitely recursive constraint violation types get generated.\n     * Places where constraint violations are handled (like where unconstrained types are converted to constrained\n     * types) must account for the scenario where they now are or need to be boxed.\n     *\n     * [0] https://github.com/smithy-lang/smithy-rs/pull/2040\n     */\n    fun transform(model: Model): Model =\n        RecursiveShapeBoxer(\n            containsIndirectionPredicate = ::constraintViolationLoopContainsIndirection,\n            boxShapeFn = ::addConstraintViolationRustBoxTrait,\n        ).transform(model)\n\n    private fun constraintViolationLoopContainsIndirection(loop: Collection<Shape>): Boolean =\n        loop.find { it.hasTrait<ConstraintViolationRustBoxTrait>() } != null\n\n    private fun addConstraintViolationRustBoxTrait(memberShape: MemberShape): MemberShape =\n        memberShape.toBuilder().addTrait(ConstraintViolationRustBoxTrait()).build()\n}\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/transformers/RemoveEbsModelValidationException.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.transformers\n\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.model.transform.ModelTransformer\nimport software.amazon.smithy.rust.codegen.core.util.orNull\n\n/**\n * The Amazon Elastic Block Store (Amazon EBS) model is one model that we generate in CI.\n * Unfortunately, it defines its own `ValidationException` shape, that conflicts with\n * `smithy.framework#ValidationException` [0].\n *\n * So this is a model that a service owner would generate when \"disabling default validation\": in such a code generation\n * mode, the service owner is responsible for mapping an operation input-level constraint violation into a modeled\n * operation error. This mode, as well as what the end goal for validation exception responses looks like, is described\n * in more detail in [1]. We don't support this mode yet.\n *\n * So this transformer simply removes the EBB model's `ValidationException`. A subsequent model transformer,\n * [AttachValidationExceptionToConstrainedOperationInputsInAllowList], ensures that it is replaced by\n * `smithy.framework#ValidationException`.\n *\n * [0]: https://github.com/smithy-lang/smithy-rs/blob/274adf155042cde49251a0e6b8842d6f56cd5b6d/codegen-core/common-test-models/ebs.json#L1270-L1288\n * [1]: https://github.com/smithy-lang/smithy-rs/pull/1199#discussion_r809424783\n *\n * TODO(https://github.com/smithy-lang/smithy-rs/issues/1401): This transformer will go away once we implement\n *  `disableDefaultValidation` set to `true`, allowing service owners to map from constraint violations to operation errors.\n */\nobject RemoveEbsModelValidationException {\n    fun transform(model: Model): Model {\n        val shapeToRemove = model.getShape(ShapeId.from(\"com.amazonaws.ebs#ValidationException\")).orNull()\n        return ModelTransformer.create().removeShapes(model, listOfNotNull(shapeToRemove))\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/transformers/ServerProtocolBasedTransformationFactory.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\npackage software.amazon.smithy.rust.codegen.server.smithy.transformers\n\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.AbstractShapeBuilder\nimport software.amazon.smithy.model.shapes.BlobShape\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.model.traits.HttpLabelTrait\nimport software.amazon.smithy.model.traits.HttpPayloadTrait\nimport software.amazon.smithy.model.traits.HttpTrait\nimport software.amazon.smithy.model.traits.StreamingTrait\nimport software.amazon.smithy.model.transform.ModelTransformer\nimport software.amazon.smithy.protocol.traits.Rpcv2CborTrait\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerRustSettings\nimport software.amazon.smithy.utils.SmithyBuilder\nimport software.amazon.smithy.utils.ToSmithyBuilder\n\n/**\n * Each protocol may not support all of the features that Smithy allows. For instance, `rpcv2Cbor`\n * does not support HTTP bindings other than `@httpError`. `ServerProtocolBasedTransformationFactory` is a factory\n * object that transforms the model and removes specific traits based on the protocol being instantiated.\n *\n * In the long term, this class will be removed, and each protocol should be resilient enough to ignore extra\n * traits that the model is annotated with. This will be addressed when we fix issue\n * [#2979](https://github.com/smithy-lang/smithy-rs/issues/2979).\n */\nobject ServerProtocolBasedTransformationFactory {\n    fun transform(\n        model: Model,\n        settings: ServerRustSettings,\n    ): Model {\n        val service = settings.getService(model)\n        if (!service.hasTrait<Rpcv2CborTrait>()) {\n            return model\n        }\n\n        // `rpcv2Cbor` does not support:\n        // 1. `@httpPayload` trait.\n        // 2. `@httpLabel` trait.\n        // 3. `@streaming` trait applied to a `Blob` (data streaming).\n        return ModelTransformer.create().mapShapes(model) { shape ->\n            when (shape) {\n                is OperationShape -> shape.removeTraitIfPresent(HttpTrait.ID)\n                is MemberShape -> {\n                    shape\n                        .removeTraitIfPresent(HttpLabelTrait.ID)\n                        .removeTraitIfPresent(HttpPayloadTrait.ID)\n                }\n                is BlobShape -> {\n                    shape.removeTraitIfPresent(StreamingTrait.ID)\n                }\n                else -> shape\n            }\n        }\n    }\n\n    fun <T : Shape, B> T.removeTraitIfPresent(\n        traitId: ShapeId,\n    ): T\n        where T : ToSmithyBuilder<T>,\n              B : AbstractShapeBuilder<B, T>,\n              B : SmithyBuilder<T> {\n        return if (this.hasTrait(traitId)) {\n            @Suppress(\"UNCHECKED_CAST\")\n            (this.toBuilder() as B).removeTrait(traitId).build()\n        } else {\n            this\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/transformers/ShapesReachableFromOperationInputTagger.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.transformers\n\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.BlobShape\nimport software.amazon.smithy.model.shapes.ByteShape\nimport software.amazon.smithy.model.shapes.IntegerShape\nimport software.amazon.smithy.model.shapes.ListShape\nimport software.amazon.smithy.model.shapes.LongShape\nimport software.amazon.smithy.model.shapes.MapShape\nimport software.amazon.smithy.model.shapes.ShortShape\nimport software.amazon.smithy.model.shapes.StringShape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.shapes.UnionShape\nimport software.amazon.smithy.model.transform.ModelTransformer\nimport software.amazon.smithy.rust.codegen.core.smithy.DirectedWalker\nimport software.amazon.smithy.rust.codegen.core.util.UNREACHABLE\nimport software.amazon.smithy.rust.codegen.server.smithy.traits.ShapeReachableFromOperationInputTagTrait\n\n/**\n * Tag shapes reachable from operation input with the\n * [ShapeReachableFromOperationInputTagTrait] tag.\n *\n * This is useful to determine whether we need to generate code to\n * enforce constraints upon request deserialization in the server.\n *\n * This needs to be a model transformer; it cannot be lazily calculated\n * when needed. This is because other model transformers may transform\n * the model such that shapes that were reachable from operation\n * input are no longer so. For example, [EventStreamNormalizer] pulls\n * event stream error variants out of the union shape where they are defined.\n * As such, [ShapesReachableFromOperationInputTagger] needs to run\n * before these model transformers.\n *\n * WARNING: This transformer tags _all_ [aggregate shapes], and _some_ [simple shapes],\n * but not all of them. Read the implementation to find out what shape types it\n * currently tags.\n *\n * [simple shapes]: https://awslabs.github.io/smithy/2.0/spec/simple-types.html\n * [aggregate shapes]: https://awslabs.github.io/smithy/2.0/spec/aggregate-types.html#aggregate-types\n */\nobject ShapesReachableFromOperationInputTagger {\n    fun transform(model: Model): Model {\n        val inputShapes =\n            model.operationShapes.map {\n                model.expectShape(it.inputShape, StructureShape::class.java)\n            }\n        val walker = DirectedWalker(model)\n        val shapesReachableFromOperationInputs =\n            inputShapes\n                .flatMap { walker.walkShapes(it) }\n                .toSet()\n\n        return ModelTransformer.create().mapShapes(model) { shape ->\n            when (shape) {\n                is StructureShape, is UnionShape, is ListShape, is MapShape, is StringShape, is IntegerShape, is ShortShape, is LongShape, is ByteShape, is BlobShape -> {\n                    if (shapesReachableFromOperationInputs.contains(shape)) {\n                        val builder =\n                            when (shape) {\n                                is StructureShape -> shape.toBuilder()\n                                is UnionShape -> shape.toBuilder()\n                                is ListShape -> shape.toBuilder()\n                                is MapShape -> shape.toBuilder()\n                                is StringShape -> shape.toBuilder()\n                                is IntegerShape -> shape.toBuilder()\n                                is ShortShape -> shape.toBuilder()\n                                is LongShape -> shape.toBuilder()\n                                is ByteShape -> shape.toBuilder()\n                                is BlobShape -> shape.toBuilder()\n                                else -> UNREACHABLE(\"the `when` is exhaustive\")\n                            }\n                        builder.addTrait(ShapeReachableFromOperationInputTagTrait()).build()\n                    } else {\n                        shape\n                    }\n                }\n                else -> shape\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/util/CustomValidationExceptionUtil.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.util\n\nimport software.amazon.smithy.framework.rust.ValidationFieldNameTrait\nimport software.amazon.smithy.framework.rust.ValidationMessageTrait\nimport software.amazon.smithy.model.shapes.MemberShape\n\n/**\n * Helper function to determine if this [MemberShape] is a validation message either explicitly with the\n * @validationMessage trait or implicitly because it is named \"message\"\n */\nfun MemberShape.isValidationMessage(): Boolean {\n    return this.hasTrait(ValidationMessageTrait.ID) || this.memberName == \"message\"\n}\n\nfun MemberShape.isValidationFieldName(): Boolean {\n    return this.hasTrait(ValidationFieldNameTrait.ID) || this.memberName == \"name\"\n}\n"
  },
  {
    "path": "codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/validators/CustomValidationExceptionValidator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.validators\n\nimport software.amazon.smithy.framework.rust.ValidationExceptionTrait\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.shapes.ShapeType\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.traits.DefaultTrait\nimport software.amazon.smithy.model.traits.ErrorTrait\nimport software.amazon.smithy.model.validation.AbstractValidator\nimport software.amazon.smithy.model.validation.Severity\nimport software.amazon.smithy.model.validation.ValidationEvent\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\nimport software.amazon.smithy.rust.codegen.core.util.targetOrSelf\nimport software.amazon.smithy.rust.codegen.server.smithy.canReachConstrainedShapeForValidation\nimport software.amazon.smithy.rust.codegen.server.smithy.isDirectlyConstrainedForValidation\nimport software.amazon.smithy.rust.codegen.server.smithy.util.isValidationMessage\n\nclass CustomValidationExceptionValidator : AbstractValidator() {\n    override fun validate(model: Model): List<ValidationEvent> {\n        val events = mutableListOf<ValidationEvent>()\n\n        model.shapes(StructureShape::class.java).filter { it.hasTrait(ValidationExceptionTrait.ID) }\n            .forEach { shape ->\n                // Validate that the shape also has @error trait\n                if (!shape.hasTrait(ErrorTrait::class.java)) {\n                    events.add(\n                        ValidationEvent.builder().id(\"CustomValidationException.MissingErrorTrait\")\n                            .severity(Severity.ERROR).shape(shape)\n                            .message(\"@validationException requires @error trait\")\n                            .build(),\n                    )\n                }\n\n                // Validate exactly one member with @validationMessage trait (explicit) or named \"message\" (implicit)\n                val messageFields =\n                    shape.members().filter { it.isValidationMessage() }\n\n                when (messageFields.size) {\n                    0 ->\n                        events.add(\n                            ValidationEvent.builder().id(\"CustomValidationException.MissingMessageField\")\n                                .severity(Severity.ERROR).shape(shape)\n                                .message(\n                                    \"@validationException requires exactly one String member named \" +\n                                        \"\\\"message\\\" or with the @validationMessage trait\",\n                                ).build(),\n                        )\n\n                    1 -> {\n                        val validationMessageField = messageFields.first()\n                        if (!model.expectShape(validationMessageField.target).isStringShape) {\n                            events.add(\n                                ValidationEvent.builder().id(\"CustomValidationException.NonStringMessageField\")\n                                    .severity(Severity.ERROR).shape(shape)\n                                    .message(\"@validationMessage field must be a String\").build(),\n                            )\n                        }\n                    }\n\n                    else ->\n                        events.add(\n                            ValidationEvent.builder().id(\"CustomValidationException.MultipleMessageFields\")\n                                .severity(Severity.ERROR).shape(shape)\n                                .message(\n                                    \"@validationException can have only one member explicitly marked with the\" +\n                                        \"@validationMessage trait or implicitly selected via the \\\"message\\\" field name convention.\",\n                                ).build(),\n                        )\n                }\n\n                // Validate default constructibility if it contains constrained shapes\n                if (shape.canReachConstrainedShapeForValidation(model)) {\n                    shape.members().forEach { member -> member.validateDefaultConstructibility(model, events) }\n                }\n            }\n\n        return events\n    }\n\n    /** Validate default constructibility of the shape\n     * When a validation exception occurs, the framework has to create a Rust type that represents\n     * the ValidationException structure, but if that structure has fields other than 'message' and\n     * 'field list', then it can't instantiate them if they don't have defaults. Later on, we will introduce\n     * a mechanism for service code to be able to participate in construction of a validation exception type.\n     * Until that time, we need to restrict this to default constructibility.\n     */\n    private fun Shape.validateDefaultConstructibility(\n        model: Model,\n        events: MutableList<ValidationEvent>,\n    ) {\n        when (this.type) {\n            ShapeType.STRUCTURE -> {\n                this.members().forEach { member -> member.validateDefaultConstructibility(model, events) }\n            }\n\n            ShapeType.MEMBER -> {\n                // We want to check if the member's target is constrained. If so, we want the default trait to be on the\n                // member.\n                if (this.targetOrSelf(model).isDirectlyConstrainedForValidation() && !this.hasTrait<DefaultTrait>()) {\n                    events.add(\n                        ValidationEvent.builder().id(\"CustomValidationException.MissingDefault\")\n                            .severity(Severity.ERROR)\n                            .message(\"$this must be default constructible\")\n                            .build(),\n                    )\n                }\n            }\n\n            else -> return\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/main/resources/META-INF/services/software.amazon.smithy.build.SmithyBuildPlugin",
    "content": "#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\nsoftware.amazon.smithy.rust.codegen.server.smithy.RustServerCodegenPlugin\n"
  },
  {
    "path": "codegen-server/src/main/resources/META-INF/services/software.amazon.smithy.model.validation.Validator",
    "content": "#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\nsoftware.amazon.smithy.rust.codegen.server.smithy.PatternTraitEscapedSpecialCharsValidator\nsoftware.amazon.smithy.rust.codegen.server.smithy.validators.CustomValidationExceptionValidator\n"
  },
  {
    "path": "codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ConstrainedShapeSymbolProviderTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy\n\nimport io.kotest.matchers.shouldBe\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.params.ParameterizedTest\nimport org.junit.jupiter.params.provider.Arguments\nimport org.junit.jupiter.params.provider.MethodSource\nimport software.amazon.smithy.model.shapes.BlobShape\nimport software.amazon.smithy.model.shapes.ByteShape\nimport software.amazon.smithy.model.shapes.IntegerShape\nimport software.amazon.smithy.model.shapes.LongShape\nimport software.amazon.smithy.model.shapes.MapShape\nimport software.amazon.smithy.model.shapes.ServiceShape\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.shapes.ShortShape\nimport software.amazon.smithy.model.shapes.StringShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustType\nimport software.amazon.smithy.rust.codegen.core.smithy.rustType\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.util.lookup\nimport software.amazon.smithy.rust.codegen.server.smithy.testutil.serverTestSymbolProvider\nimport java.util.stream.Stream\n\nconst val BASE_MODEL_STRING =\n    \"\"\"\n    namespace test\n\n    service TestService {\n        version: \"123\",\n        operations: [TestOperation]\n    }\n\n    operation TestOperation {\n        input: TestInputOutput,\n        output: TestInputOutput,\n    }\n\n    structure TestInputOutput {\n        constrainedString: ConstrainedString,\n        constrainedBlob: ConstrainedBlob,\n        constrainedInteger: ConstrainedInteger,\n        constrainedShort: ConstrainedShort,\n        constrainedMap: ConstrainedMap,\n        unconstrainedMap: TransitivelyConstrainedMap\n    }\n\n    @length(min: 1, max: 69)\n    string ConstrainedString\n\n    @length(min: 1, max: 70)\n    blob ConstrainedBlob\n\n    @range(min: -2, max: 10)\n    short ConstrainedShort\n\n    @range(min: -2, max: 1000)\n    long ConstrainedLong\n\n    @range(min: -2, max: 10)\n    byte ConstrainedByte\n\n    @range(min: 10, max: 29)\n    integer ConstrainedInteger\n\n    string UnconstrainedString\n\n    @length(min: 1, max: 69)\n    map ConstrainedMap {\n        key: String,\n        value: String\n    }\n\n    map TransitivelyConstrainedMap {\n        key: String,\n        value: ConstrainedMap\n    }\n\n    @length(min: 1, max: 69)\n    list ConstrainedCollection {\n        member: String\n    }\n    \"\"\"\n\nclass ConstrainedShapeSymbolProviderTest {\n    private val model = BASE_MODEL_STRING.asSmithyModel()\n    private val serviceShape = model.lookup<ServiceShape>(\"test#TestService\")\n    private val symbolProvider = serverTestSymbolProvider(model, serviceShape)\n    private val constrainedShapeSymbolProvider = ConstrainedShapeSymbolProvider(symbolProvider, serviceShape, true)\n\n    companion object {\n        @JvmStatic\n        fun getConstrainedShapes(): Stream<Arguments> =\n            Stream.of(\n                Arguments.of(\"ConstrainedInteger\", { s: Shape -> s is IntegerShape }),\n                Arguments.of(\"ConstrainedShort\", { s: Shape -> s is ShortShape }),\n                Arguments.of(\"ConstrainedLong\", { s: Shape -> s is LongShape }),\n                Arguments.of(\"ConstrainedByte\", { s: Shape -> s is ByteShape }),\n                Arguments.of(\"ConstrainedString\", { s: Shape -> s is StringShape }),\n                Arguments.of(\"ConstrainedMap\", { s: Shape -> s is MapShape }),\n                Arguments.of(\"ConstrainedBlob\", { s: Shape -> s is BlobShape }),\n            )\n    }\n\n    @ParameterizedTest\n    @MethodSource(\"getConstrainedShapes\")\n    fun `it should return a constrained type for a constrained shape`(\n        shapeName: String,\n        shapeCheck: (Shape) -> Boolean,\n    ) {\n        val constrainedShape = model.lookup<Shape>(\"test#$shapeName\")\n        assert(shapeCheck(constrainedShape))\n        val constrainedType = constrainedShapeSymbolProvider.toSymbol(constrainedShape).rustType()\n\n        constrainedType shouldBe RustType.Opaque(shapeName, \"crate::model\")\n    }\n\n    @Test\n    fun `it should not blindly delegate to the base symbol provider when the shape is an aggregate shape and is not directly constrained`() {\n        val constrainedMapShape = model.lookup<MapShape>(\"test#ConstrainedMap\")\n        val constrainedMapType = constrainedShapeSymbolProvider.toSymbol(constrainedMapShape).rustType()\n        val unconstrainedMapShape = model.lookup<MapShape>(\"test#TransitivelyConstrainedMap\")\n        val unconstrainedMapType = constrainedShapeSymbolProvider.toSymbol(unconstrainedMapShape).rustType()\n\n        unconstrainedMapType shouldBe RustType.HashMap(RustType.String, constrainedMapType)\n    }\n\n    @Test\n    fun `it should delegate to the base symbol provider for unconstrained simple shapes`() {\n        val unconstrainedStringShape = model.lookup<StringShape>(\"test#UnconstrainedString\")\n        val unconstrainedStringSymbol = constrainedShapeSymbolProvider.toSymbol(unconstrainedStringShape)\n\n        unconstrainedStringSymbol shouldBe symbolProvider.toSymbol(unconstrainedStringShape)\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ConstraintsMemberShapeTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy\n\nimport io.kotest.matchers.shouldBe\nimport io.kotest.matchers.shouldNotBe\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.aws.traits.DataTrait\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.SourceLocation\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.model.traits.RequiredTrait\nimport software.amazon.smithy.model.traits.Trait\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustModule\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.smithy.ModuleDocProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.transformers.OperationNormalizer\nimport software.amazon.smithy.rust.codegen.core.testutil.IntegrationTestParams\nimport software.amazon.smithy.rust.codegen.core.testutil.ServerAdditionalSettings\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.testModule\nimport software.amazon.smithy.rust.codegen.core.testutil.unitTest\nimport software.amazon.smithy.rust.codegen.core.util.toPascalCase\nimport software.amazon.smithy.rust.codegen.core.util.toSnakeCase\nimport software.amazon.smithy.rust.codegen.server.smithy.testutil.HttpTestType\nimport software.amazon.smithy.rust.codegen.server.smithy.testutil.serverIntegrationTest\nimport software.amazon.smithy.rust.codegen.server.smithy.transformers.ConstrainedMemberTransform\n\nclass ConstraintsMemberShapeTest {\n    private val sampleModel =\n        \"\"\"\n        namespace constrainedMemberShape\n\n        use smithy.framework#ValidationException\n        use aws.protocols#restJson1\n        use aws.api#data\n\n        @restJson1\n        service ConstrainedService {\n            operations: [SampleOperation]\n        }\n\n        @http(uri: \"/anOperation\", method: \"POST\")\n        operation SampleOperation {\n            output: SampleInputOutput\n            input: SampleInputOutput\n            errors: [ValidationException, ErrorWithMemberConstraint]\n        }\n        structure SampleInputOutput {\n            plainLong : Long\n            plainInteger : Integer\n            plainShort : Short\n            plainByte : Byte\n            plainFloat: Float\n            plainString: String\n\n            @range(min: 1, max:100)\n            constrainedLong : Long\n            @range(min: 2, max:100)\n            constrainedInteger : Integer\n            @range(min: 3, max:100)\n            constrainedShort : Short\n            @range(min: 4, max:100)\n            constrainedByte : Byte\n            @length(max: 100)\n            constrainedString: String\n\n            @required\n            @range(min: 5, max:100)\n            requiredConstrainedLong : Long\n            @required\n            @range(min: 6, max:100)\n            requiredConstrainedInteger : Integer\n            @required\n            @range(min: 7, max:100)\n            requiredConstrainedShort : Short\n            @required\n            @range(min: 8, max:100)\n            requiredConstrainedByte : Byte\n            @required\n            @length(max: 101)\n            requiredConstrainedString: String\n\n            patternString : PatternString\n\n            @data(\"content\")\n            @pattern(\"^[g-m]+${'$'}\")\n            constrainedPatternString : PatternString\n\n            constrainedList : ConstrainedList\n            plainStringList : PlainStringList\n            patternStringList : PatternStringList\n            patternStringListOverride : PatternStringListOverride\n\n            plainStructField : PlainStructWithInteger\n            structWithConstrainedMember : StructWithConstrainedMember\n            structWithConstrainedMemberOverride : StructWithConstrainedMemberOverride\n\n            patternUnion: PatternUnion\n            patternUnionOverride: PatternUnionOverride\n            patternMap : PatternMap\n            patternMapOverride: PatternMapOverride\n            result: Result\n        }\n        structure Result {\n            @documentation(\"Response from the agent\")\n            chat: String\n        }\n        list ListWithIntegerMemberStruct {\n            member: PlainStructWithInteger\n        }\n        structure PlainStructWithInteger {\n            lat : Integer\n            long : Integer\n        }\n        structure StructWithConstrainedMember {\n            @range(min: 100)\n            lat : Integer\n            long : Integer\n        }\n        structure StructWithConstrainedMemberOverride {\n            @range(min: 10)\n            lat : RangedInteger\n            @range(min: 10, max:100)\n            long : RangedInteger\n        }\n        @length(max: 3)\n        list ConstrainedList {\n            @length(max: 8000)\n            member: String\n        }\n        list PlainStringList {\n            member: String\n        }\n        list PatternStringList {\n            member: PatternString\n        }\n        list PatternStringListOverride {\n            @pattern(\"^[g-m]+${'$'}\")\n            member: PatternString\n        }\n        map PatternMap {\n            key: PatternString,\n            value: PatternString\n        }\n        map PatternMapOverride {\n            @pattern(\"^[g-m]+${'$'}\")\n            key: PatternString,\n            @pattern(\"^[g-m]+${'$'}\")\n            value: PatternString\n        }\n        union PatternUnion {\n            first: PatternString,\n            second: PatternString\n        }\n        union PatternUnionOverride {\n            @pattern(\"^[g-m]+${'$'}\")\n            first: PatternString,\n            @pattern(\"^[g-m]+${'$'}\")\n            second: PatternString\n        }\n        @pattern(\"^[a-m]+${'$'}\")\n        string PatternString\n        @range(min: 0, max:1000)\n        integer RangedInteger\n\n        @error(\"server\")\n        structure ErrorWithMemberConstraint {\n            @range(min: 100, max: 999)\n            statusCode: Integer\n        }\n        \"\"\".asSmithyModel()\n\n    private fun loadModel(model: Model): Model =\n        ConstrainedMemberTransform.transform(OperationNormalizer.transform(model))\n\n    @Test\n    fun `non constrained fields should not be changed`() {\n        val transformedModel = loadModel(sampleModel)\n\n        fun checkFieldTargetRemainsSame(fieldName: String) {\n            checkMemberShapeIsSame(\n                transformedModel,\n                sampleModel,\n                \"constrainedMemberShape.synthetic#SampleOperationOutput\\$$fieldName\",\n                \"constrainedMemberShape#SampleInputOutput\\$$fieldName\",\n            ) {\n                \"SampleInputOutput$fieldName has changed whereas it is not constrained and should have remained same\"\n            }\n        }\n\n        setOf(\n            \"plainInteger\",\n            \"plainLong\",\n            \"plainByte\",\n            \"plainShort\",\n            \"plainFloat\",\n            \"patternString\",\n            \"plainStringList\",\n            \"patternStringList\",\n            \"patternStringListOverride\",\n            \"plainStructField\",\n            \"structWithConstrainedMember\",\n            \"structWithConstrainedMemberOverride\",\n            \"patternUnion\",\n            \"patternUnionOverride\",\n            \"patternMap\",\n            \"patternMapOverride\",\n        ).forEach(::checkFieldTargetRemainsSame)\n\n        checkMemberShapeIsSame(\n            transformedModel,\n            sampleModel,\n            \"constrainedMemberShape#StructWithConstrainedMember\\$long\",\n            \"constrainedMemberShape#StructWithConstrainedMember\\$long\",\n        )\n    }\n\n    @Test\n    fun `constrained members should have a different target now`() {\n        val transformedModel = loadModel(sampleModel)\n        checkMemberShapeChanged(\n            transformedModel,\n            sampleModel,\n            \"constrainedMemberShape#PatternStringListOverride\\$member\",\n            \"constrainedMemberShape#PatternStringListOverride\\$member\",\n        )\n\n        fun checkSyntheticFieldTargetChanged(fieldName: String) {\n            checkMemberShapeChanged(\n                transformedModel,\n                sampleModel,\n                \"constrainedMemberShape.synthetic#SampleOperationOutput\\$$fieldName\",\n                \"constrainedMemberShape#SampleInputOutput\\$$fieldName\",\n            ) {\n                \"constrained member $fieldName should have been changed into a new type.\"\n            }\n        }\n\n        fun checkFieldTargetChanged(memberNameWithContainer: String) {\n            checkMemberShapeChanged(\n                transformedModel,\n                sampleModel,\n                \"constrainedMemberShape#$memberNameWithContainer\",\n                \"constrainedMemberShape#$memberNameWithContainer\",\n            ) {\n                \"constrained member $memberNameWithContainer should have been changed into a new type.\"\n            }\n        }\n\n        setOf(\n            \"constrainedLong\",\n            \"constrainedByte\",\n            \"constrainedShort\",\n            \"constrainedInteger\",\n            \"constrainedString\",\n            \"requiredConstrainedString\",\n            \"requiredConstrainedLong\",\n            \"requiredConstrainedByte\",\n            \"requiredConstrainedInteger\",\n            \"requiredConstrainedShort\",\n            \"constrainedPatternString\",\n        ).forEach(::checkSyntheticFieldTargetChanged)\n\n        setOf(\n            \"StructWithConstrainedMember\\$lat\",\n            \"PatternMapOverride\\$key\",\n            \"PatternMapOverride\\$value\",\n            \"PatternStringListOverride\\$member\",\n        ).forEach(::checkFieldTargetChanged)\n    }\n\n    @Test\n    fun `extra trait on a constrained member should remain on it`() {\n        val transformedModel = loadModel(sampleModel)\n        checkShapeHasTrait(\n            transformedModel,\n            sampleModel,\n            \"constrainedMemberShape.synthetic#SampleOperationOutput\\$constrainedPatternString\",\n            \"constrainedMemberShape#SampleInputOutput\\$constrainedPatternString\",\n            DataTrait(\"content\", SourceLocation.NONE),\n        )\n    }\n\n    @Test\n    fun `required remains on constrained member shape`() {\n        val transformedModel = loadModel(sampleModel)\n        checkShapeHasTrait(\n            transformedModel,\n            sampleModel,\n            \"constrainedMemberShape.synthetic#SampleOperationOutput\\$requiredConstrainedString\",\n            \"constrainedMemberShape#SampleInputOutput\\$requiredConstrainedString\",\n            RequiredTrait(),\n        )\n    }\n\n    @Test\n    fun `generate code and check member constrained shapes are in the right modules`() {\n        serverIntegrationTest(\n            sampleModel,\n            IntegrationTestParams(\n                service = \"constrainedMemberShape#ConstrainedService\",\n                additionalSettings = ServerAdditionalSettings.builder().generateCodegenComments(true).toObjectNode(),\n            ),\n            testCoverage = HttpTestType.Default,\n        ) { _, rustCrate ->\n            fun RustWriter.testTypeExistsInBuilderModule(typeName: String) {\n                unitTest(\n                    \"builder_module_has_${typeName.toSnakeCase()}\",\n                    \"\"\"\n                    #[allow(unused_imports)] use crate::output::sample_operation_output::$typeName;\n                    \"\"\",\n                )\n            }\n\n            rustCrate.testModule {\n                // All directly constrained members of the output structure should be in the builder module\n                setOf(\n                    \"ConstrainedLong\",\n                    \"ConstrainedByte\",\n                    \"ConstrainedShort\",\n                    \"ConstrainedInteger\",\n                    \"ConstrainedString\",\n                    \"RequiredConstrainedString\",\n                    \"RequiredConstrainedLong\",\n                    \"RequiredConstrainedByte\",\n                    \"RequiredConstrainedInteger\",\n                    \"RequiredConstrainedShort\",\n                    \"ConstrainedPatternString\",\n                ).forEach(::testTypeExistsInBuilderModule)\n\n                fun Set<String>.generateUseStatements(prefix: String) =\n                    this.joinToString(separator = \"\\n\") {\n                        \"#[allow(unused_imports)] use $prefix::$it;\"\n                    }\n\n                unitTest(\n                    \"map_overridden_enum\",\n                    setOf(\n                        \"Value\",\n                        \"value::ConstraintViolation as ValueCV\",\n                        \"Key\",\n                        \"key::ConstraintViolation as KeyCV\",\n                    ).generateUseStatements(\"crate::model::pattern_map_override\"),\n                )\n\n                unitTest(\n                    \"union_overridden_enum\",\n                    setOf(\n                        \"First\",\n                        \"first::ConstraintViolation as FirstCV\",\n                        \"Second\",\n                        \"second::ConstraintViolation as SecondCV\",\n                    ).generateUseStatements(\"crate::model::pattern_union_override\"),\n                )\n\n                unitTest(\n                    \"list_overridden_enum\",\n                    setOf(\n                        \"Member\",\n                        \"member::ConstraintViolation as MemberCV\",\n                    ).generateUseStatements(\"crate::model::pattern_string_list_override\"),\n                )\n            }\n        }\n    }\n\n    @Test\n    fun `merging docs should not produce extra empty lines`() {\n        val docWriter =\n            object : ModuleDocProvider {\n                override fun docsWriter(module: RustModule.LeafModule): Writable? = null\n            }\n        val innerModule = InnerModule(docWriter, false)\n        innerModule.mergeDocumentation(\"\\n\\n\", \"\") shouldBe \"\"\n        innerModule.mergeDocumentation(null, null) shouldBe null\n        innerModule.mergeDocumentation(null, \"some docs\\n\") shouldBe \"some docs\"\n        innerModule.mergeDocumentation(\"some docs\\n\", null) shouldBe \"some docs\"\n        innerModule.mergeDocumentation(null, \"some docs\") shouldBe \"some docs\"\n        innerModule.mergeDocumentation(\"some docs\", null) shouldBe \"some docs\"\n        innerModule.mergeDocumentation(null, \"some docs\\n\\n\") shouldBe \"some docs\"\n        innerModule.mergeDocumentation(\"some docs\\n\\n\", null) shouldBe \"some docs\"\n        innerModule.mergeDocumentation(null, \"some docs\\n\\n\") shouldBe \"some docs\"\n        innerModule.mergeDocumentation(\"left side\", \"right side\") shouldBe \"left side\\nright side\"\n        innerModule.mergeDocumentation(\"left side\\n\", \"right side\\n\") shouldBe \"left side\\nright side\"\n        innerModule.mergeDocumentation(\"left side\\n\\n\\n\", \"right side\\n\\n\") shouldBe \"left side\\nright side\"\n    }\n\n    /**\n     *  Checks that the given member shape:\n     *  1. Has been changed to a new shape\n     *  2. New shape has the same type as the original shape's target e.g. float Centigrade,\n     *     float newType\n     */\n    private fun checkMemberShapeChanged(\n        model: Model,\n        baseModel: Model,\n        member: String,\n        orgModelMember: String,\n        lazyMessage: () -> Any = ::defaultError,\n    ) {\n        val memberId = ShapeId.from(member)\n        assert(model.getShape(memberId).isPresent) { lazyMessage }\n\n        val memberShape = model.expectShape(memberId).asMemberShape().get()\n        val memberTargetShape = model.expectShape(memberShape.target)\n        val orgMemberId = ShapeId.from(orgModelMember)\n        assert(baseModel.getShape(orgMemberId).isPresent) { lazyMessage }\n\n        val beforeTransformMemberShape = baseModel.expectShape(orgMemberId).asMemberShape().get()\n        val originalTargetShape = model.expectShape(beforeTransformMemberShape.target)\n\n        val extractableConstraintTraits = allConstraintTraits - RequiredTrait::class.java\n\n        // New member shape should not have the overridden constraints on it\n        assert(!extractableConstraintTraits.any(memberShape::hasTrait)) { lazyMessage }\n\n        // Target shape has to be changed to a new shape\n        memberTargetShape.id.name shouldNotBe beforeTransformMemberShape.target.name\n\n        // Target shape's name should match the expected name\n        val expectedName =\n            memberShape.container.name.substringAfter('#') +\n                memberShape.memberName.substringBefore('#').toPascalCase()\n\n        memberTargetShape.id.name shouldBe expectedName\n\n        // New shape should have all the constraint traits that were on the member shape,\n        // and it should also have the traits that the target type contains.\n        val beforeTransformConstraintTraits =\n            beforeTransformMemberShape.allTraits.values.filter { allConstraintTraits.contains(it.javaClass) }.toSet()\n        val newShapeConstrainedTraits =\n            memberTargetShape.allTraits.values.filter { allConstraintTraits.contains(it.javaClass) }.toSet()\n\n        val leftOutConstraintTrait = beforeTransformConstraintTraits - newShapeConstrainedTraits\n        assert(\n            leftOutConstraintTrait.isEmpty() ||\n                leftOutConstraintTrait.all {\n                    it.toShapeId() == RequiredTrait.ID\n                },\n        ) { lazyMessage }\n\n        // In case the target shape has some more constraints, which the member shape did not override,\n        // then those still need to apply on the new standalone shape that has been defined.\n        val leftOverTraits =\n            originalTargetShape.allTraits.values\n                .filter { beforeOverridingTrait ->\n                    beforeTransformConstraintTraits.none {\n                        beforeOverridingTrait.toShapeId() == it.toShapeId()\n                    }\n                }\n        val allNewShapeTraits = memberTargetShape.allTraits.values.toList()\n        assert((leftOverTraits + newShapeConstrainedTraits).all { it in allNewShapeTraits }) { lazyMessage }\n    }\n\n    private fun defaultError() = \"test failed\"\n\n    /**\n     * Checks that the given shape has not changed in the transformed model and is exactly\n     * the same as the original model\n     */\n    private fun checkMemberShapeIsSame(\n        model: Model,\n        baseModel: Model,\n        member: String,\n        orgModelMember: String,\n        lazyMessage: () -> Any = ::defaultError,\n    ) {\n        val memberId = ShapeId.from(member)\n        assert(model.getShape(memberId).isPresent) { lazyMessage }\n\n        val memberShape = model.expectShape(memberId).asMemberShape().get()\n        val memberTargetShape = model.expectShape(memberShape.target)\n        val originalShape = baseModel.expectShape(ShapeId.from(orgModelMember)).asMemberShape().get()\n\n        // Member shape should not have any constraints on it\n        assert(!memberShape.hasConstraintTrait()) { lazyMessage }\n        // Target shape has to be same as the original shape\n        memberTargetShape.id shouldBe originalShape.target\n    }\n\n    private fun checkShapeHasTrait(\n        model: Model,\n        orgModel: Model,\n        member: String,\n        orgModelMember: String,\n        trait: Trait,\n    ) {\n        val memberId = ShapeId.from(member)\n        val memberShape = model.expectShape(memberId).asMemberShape().get()\n        val orgMemberShape = orgModel.expectShape(ShapeId.from(orgModelMember)).asMemberShape().get()\n\n        val newMemberTrait = memberShape.expectTrait(trait::class.java)\n        val oldMemberTrait = orgMemberShape.expectTrait(trait::class.java)\n\n        newMemberTrait shouldBe oldMemberTrait\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ConstraintsTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy\n\nimport io.kotest.inspectors.forAll\nimport io.kotest.matchers.ints.shouldBeGreaterThan\nimport io.kotest.matchers.shouldBe\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.aws.traits.protocols.AwsJson1_0Trait\nimport software.amazon.smithy.aws.traits.protocols.AwsJson1_1Trait\nimport software.amazon.smithy.aws.traits.protocols.RestJson1Trait\nimport software.amazon.smithy.aws.traits.protocols.RestXmlTrait\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.BooleanShape\nimport software.amazon.smithy.model.shapes.ListShape\nimport software.amazon.smithy.model.shapes.MapShape\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.ServiceShape\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.model.shapes.StringShape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.traits.AbstractTrait\nimport software.amazon.smithy.model.transform.ModelTransformer\nimport software.amazon.smithy.protocol.traits.Rpcv2CborTrait\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.smithy.RustCrate\nimport software.amazon.smithy.rust.codegen.core.testutil.IntegrationTestParams\nimport software.amazon.smithy.rust.codegen.core.testutil.ServerAdditionalSettings\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.unitTest\nimport software.amazon.smithy.rust.codegen.core.util.lookup\nimport software.amazon.smithy.rust.codegen.server.smithy.testutil.serverIntegrationTest\nimport software.amazon.smithy.rust.codegen.server.smithy.testutil.serverTestSymbolProvider\nimport java.io.File\n\nenum class ModelProtocol(val trait: AbstractTrait) {\n    AwsJson10(AwsJson1_0Trait.builder().build()),\n    AwsJson11(AwsJson1_1Trait.builder().build()),\n    RestJson(RestJson1Trait.builder().build()),\n    RestXml(RestXmlTrait.builder().build()),\n    Rpcv2Cbor(Rpcv2CborTrait.builder().build()),\n}\n\n/**\n * Returns the Smithy constraints model from the common repository, with the specified protocol\n * applied to the service.\n */\nfun loadSmithyConstraintsModelForProtocol(modelProtocol: ModelProtocol): Pair<Model, ShapeId> {\n    val (model, serviceShapeId) = loadSmithyConstraintsModel()\n    return Pair(model.replaceProtocolTrait(serviceShapeId, modelProtocol), serviceShapeId)\n}\n\n/**\n * Loads the Smithy constraints model defined in the common repository and returns the model along with\n * the service shape defined in it.\n */\nfun loadSmithyConstraintsModel(): Pair<Model, ShapeId> {\n    val filePath = \"../codegen-core/common-test-models/constraints.smithy\"\n    val model =\n        File(filePath).readText().asSmithyModel()\n    val serviceShapeId = model.shapes().filter { it.isServiceShape }.findFirst().orElseThrow().id\n    return Pair(model, serviceShapeId)\n}\n\n/**\n * Removes all existing protocol traits annotated on the given service,\n * then sets the provided `protocol` as the sole protocol trait for the service.\n */\nfun Model.replaceProtocolTrait(\n    serviceShapeId: ShapeId,\n    modelProtocol: ModelProtocol,\n): Model {\n    val serviceBuilder =\n        this.expectShape(serviceShapeId, ServiceShape::class.java).toBuilder()\n    for (p in ModelProtocol.values()) {\n        serviceBuilder.removeTrait(p.trait.toShapeId())\n    }\n    val service = serviceBuilder.addTrait(modelProtocol.trait).build()\n    return ModelTransformer.create().replaceShapes(this, listOf(service))\n}\n\nfun List<ShapeId>.containsAnyShapeId(ids: Collection<ShapeId>): Boolean {\n    return ids.any { id -> this.any { shape -> shape == id } }\n}\n\n/**\n * Removes the given operations from the model.\n */\nfun Model.removeOperations(\n    serviceShapeId: ShapeId,\n    operationsToRemove: List<ShapeId>,\n): Model {\n    val service = this.expectShape(serviceShapeId, ServiceShape::class.java)\n    val serviceBuilder = service.toBuilder()\n    // The operation must exist in the service.\n    service.operations.map { it.toShapeId() }.containsAll(operationsToRemove) shouldBe true\n    // Remove all operations.\n    for (opToRemove in operationsToRemove) {\n        serviceBuilder.removeOperation(opToRemove)\n    }\n    val changedModel = ModelTransformer.create().replaceShapes(this, listOf(serviceBuilder.build()))\n    // The operation must not exist in the updated service.\n    val changedService = changedModel.expectShape(serviceShapeId, ServiceShape::class.java)\n    changedService.operations.size shouldBeGreaterThan 0\n    changedService.operations.map { it.toShapeId() }.containsAnyShapeId(operationsToRemove) shouldBe false\n\n    return changedModel\n}\n\nclass ConstraintsTest {\n    private val model =\n        \"\"\"\n        namespace test\n\n        service TestService {\n            version: \"123\",\n            operations: [TestOperation]\n        }\n\n        operation TestOperation {\n            input: TestInputOutput,\n            output: TestInputOutput,\n        }\n\n        structure TestInputOutput {\n            map: MapA,\n            recursive: RecursiveShape\n        }\n\n        structure RecursiveShape {\n            shape: RecursiveShape,\n            mapB: MapB\n        }\n\n        @length(min: 1, max: 69)\n        map MapA {\n            key: String,\n            value: MapB\n        }\n\n        map MapB {\n            key: String,\n            value: StructureA\n        }\n\n        @uniqueItems\n        list ListA {\n            member: MyString\n        }\n\n        @pattern(\"\\\\w+\")\n        string MyString\n\n        @length(min: 1, max: 69)\n        string LengthString\n\n        structure StructureA {\n            @range(min: 1, max: 69)\n            int: Integer,\n            @required\n            string: String\n        }\n\n        // This shape is not in the service closure.\n        structure StructureB {\n            @pattern(\"\\\\w+\")\n            patternString: String,\n            @required\n            requiredString: String,\n            mapA: MapA,\n            @length(min: 1, max: 5)\n            mapAPrecedence: MapA\n        }\n\n        structure StructWithInnerDefault {\n            @default(false)\n            inner: PrimitiveBoolean\n        }\n        \"\"\".asSmithyModel(smithyVersion = \"2\")\n    private val symbolProvider = serverTestSymbolProvider(model)\n\n    private val testInputOutput = model.lookup<StructureShape>(\"test#TestInputOutput\")\n    private val recursiveShape = model.lookup<StructureShape>(\"test#RecursiveShape\")\n    private val mapA = model.lookup<MapShape>(\"test#MapA\")\n    private val mapB = model.lookup<MapShape>(\"test#MapB\")\n    private val listA = model.lookup<ListShape>(\"test#ListA\")\n    private val lengthString = model.lookup<StringShape>(\"test#LengthString\")\n    private val structA = model.lookup<StructureShape>(\"test#StructureA\")\n    private val structAInt = model.lookup<MemberShape>(\"test#StructureA\\$int\")\n    private val structAString = model.lookup<MemberShape>(\"test#StructureA\\$string\")\n    private val structWithInnerDefault = model.lookup<StructureShape>(\"test#StructWithInnerDefault\")\n    private val primitiveBoolean = model.lookup<BooleanShape>(\"smithy.api#PrimitiveBoolean\")\n\n    @Test\n    fun `it should detect supported constrained traits as constrained`() {\n        listOf(listA, mapA, structA, lengthString).forAll {\n            it.isDirectlyConstrained(symbolProvider) shouldBe true\n        }\n    }\n\n    @Test\n    fun `it should not detect unsupported constrained traits as constrained`() {\n        listOf(structAInt, structAString).forAll {\n            it.isDirectlyConstrained(symbolProvider) shouldBe false\n        }\n    }\n\n    @Test\n    fun `it should evaluate reachability of constrained shapes`() {\n        mapA.canReachConstrainedShape(model, symbolProvider) shouldBe true\n        structAInt.canReachConstrainedShape(model, symbolProvider) shouldBe false\n        listA.canReachConstrainedShape(model, symbolProvider) shouldBe true\n\n        // All of these eventually reach `StructureA`, which is constrained because one of its members is `required`.\n        testInputOutput.canReachConstrainedShape(model, symbolProvider) shouldBe true\n        mapB.canReachConstrainedShape(model, symbolProvider) shouldBe true\n        recursiveShape.canReachConstrainedShape(model, symbolProvider) shouldBe true\n    }\n\n    @Test\n    fun `it should not consider shapes with the default trait as constrained`() {\n        structWithInnerDefault.canReachConstrainedShape(model, symbolProvider) shouldBe false\n        primitiveBoolean.isDirectlyConstrained(symbolProvider) shouldBe false\n    }\n\n    private fun generateAndCompileServer(\n        model: Model,\n        pubConstraints: Boolean = true,\n        dir: File? = null,\n        test: (ServerCodegenContext, RustCrate) -> Unit = { _, _ -> },\n    ) {\n        if (dir?.exists() == true) {\n            dir.deleteRecursively()\n        }\n\n        // Simply compiling the crate is sufficient as a test.\n        serverIntegrationTest(\n            model,\n            IntegrationTestParams(\n                service = \"test#SampleService\",\n                additionalSettings =\n                    ServerAdditionalSettings.builder()\n                        .publicConstrainedTypes(pubConstraints)\n                        .toObjectNode(),\n                overrideTestDir = dir,\n            ),\n            test = test,\n        )\n    }\n\n    @Test\n    fun `unnamed and named enums should validate and have an associated ConstraintViolation error type`() {\n        val model =\n            \"\"\"\n            namespace test\n            use aws.protocols#restJson1\n            use smithy.framework#ValidationException\n\n            @restJson1\n            service SampleService {\n                operations: [SampleOp]\n            }\n\n            @http(uri: \"/dailySummary\", method: \"POST\")\n            operation SampleOp {\n                input := {\n                    unnamedDay: UnnamedDayOfWeek\n                    namedDay: DayOfWeek\n                }\n                errors: [ValidationException]\n            }\n            @enum([\n                { value: \"MONDAY\" },\n                { value: \"TUESDAY\" }\n            ])\n            string UnnamedDayOfWeek\n            @enum([\n                { value: \"MONDAY\", name: \"MONDAY\" },\n                { value: \"TUESDAY\", name: \"TUESDAY\" }\n            ])\n            string DayOfWeek\n            \"\"\".asSmithyModel(smithyVersion = \"2\")\n\n        generateAndCompileServer(model) { _, crate ->\n            crate.unitTest(\"value_should_be_validated\") {\n                rustTemplate(\n                    \"\"\"\n                    let x: Result<crate::model::DayOfWeek, crate::model::day_of_week::ConstraintViolation> =\n                        \"Friday\".try_into();\n                    assert!(x.is_err());\n                    \n                    let x: Result<crate::model::UnnamedDayOfWeek, crate::model::unnamed_day_of_week::ConstraintViolation> =\n                        \"Friday\".try_into();\n                    assert!(x.is_err());\n                \"\"\",\n                )\n            }\n        }\n    }\n\n    private fun createModel(\n        inputMemberShape: String,\n        additionalShapes: () -> String,\n    ) = \"\"\"\n        namespace test\n        use aws.protocols#restJson1\n        use smithy.framework#ValidationException\n\n        @restJson1\n        service SampleService {\n            operations: [SampleOp]\n        }\n\n        @http(uri: \"/sample\", method: \"POST\")\n        operation SampleOp {\n            input := {\n                items : $inputMemberShape\n            }\n            errors: [ValidationException]\n        }\n        @length(min: 0 max: 65535)\n        string ItemName\n        string ItemDescription\n        ${additionalShapes()}\n        \"\"\".asSmithyModel(smithyVersion = \"2\")\n\n    @Test\n    fun `constrained map with an indirectly constrained nested list should compile`() {\n        val model =\n            createModel(\"ItemMap\") {\n                \"\"\"\n                @length(min: 1 max: 100)\n                map ItemMap {\n                    key: ItemName,\n                    value: ItemListA\n                }\n                list ItemListA { \n                    member: ItemListB\n                }\n                list ItemListB {\n                    member: ItemDescription\n                }\n                \"\"\"\n            }\n        generateAndCompileServer(model)\n    }\n\n    // TODO(#3895): Move tests that use `generateAndCompileServer` into `constraints.smithy` once issue is resolved.\n    @Test\n    fun `constrained list with an indirectly constrained map should compile`() {\n        val model =\n            createModel(\"ItemList\") {\n                \"\"\"\n                @length(min: 1 max: 100)\n                list ItemList {\n                    member: Item\n                }\n                map Item {\n                    key: ItemName\n                    value: ItemDescription\n                }\n                \"\"\"\n            }\n        generateAndCompileServer(model)\n    }\n\n    @Test\n    fun `constrained list with an indirectly constrained nested list should compile`() {\n        val model =\n            createModel(\"ItemList\") {\n                \"\"\"\n                @length(min: 1 max: 100)\n                list ItemList {\n                    member: ItemA\n                }\n                list ItemA {\n                    member: ItemB\n                }\n                list ItemB {\n                    member: ItemName\n                }\n                \"\"\"\n            }\n        generateAndCompileServer(model)\n    }\n\n    @Test\n    fun `constrained list with an indirectly constrained list that has an indirectly constrained map should compile`() {\n        val model =\n            createModel(\"ItemList\") {\n                \"\"\"\n                @length(min: 1 max: 100)\n                list ItemList {\n                    member: NestedItemList\n                }\n                list NestedItemList {\n                    member: Item\n                }\n                map Item {\n                    key: ItemName\n                    value: ItemDescription\n                }\n                \"\"\"\n            }\n        generateAndCompileServer(model)\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/CustomShapeSymbolProviderTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy\n\nimport io.kotest.matchers.shouldBe\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.codegen.core.Symbol\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.ServiceShape\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.model.transform.ModelTransformer\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustType\nimport software.amazon.smithy.rust.codegen.core.smithy.rustType\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.util.lookup\nimport software.amazon.smithy.rust.codegen.server.smithy.testutil.serverTestSymbolProvider\n\nclass CustomShapeSymbolProviderTest {\n    private val baseModel =\n        \"\"\"\n        namespace test\n\n        service TestService {\n            version: \"1\"\n            operations: [TestOperation]\n        }\n\n        operation TestOperation {\n            input: TestInputOutput\n            output: TestInputOutput\n        }\n\n        structure TestInputOutput {\n            myString: String,\n        }\n        \"\"\".asSmithyModel(smithyVersion = \"2.0\")\n    private val serviceShape = baseModel.lookup<ServiceShape>(\"test#TestService\")\n    private val rustType = RustType.Opaque(\"fake-type\")\n    private val symbol =\n        Symbol.builder()\n            .name(\"fake-symbol\")\n            .rustType(rustType)\n            .build()\n    private val model =\n        ModelTransformer.create()\n            .mapShapes(baseModel) {\n                if (it is MemberShape) {\n                    it.toBuilder().addTrait(SyntheticCustomShapeTrait(ShapeId.from(\"some#id\"), symbol)).build()\n                } else {\n                    it\n                }\n            }\n    private val symbolProvider =\n        serverTestSymbolProvider(baseModel, serviceShape)\n            .let { CustomShapeSymbolProvider(it) }\n\n    @Test\n    fun `override with custom symbol`() {\n        val shape = model.lookup<Shape>(\"test#TestInputOutput\\$myString\")\n        symbolProvider.toSymbol(shape) shouldBe symbol\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/DeriveEqAndHashSymbolMetadataProviderTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy\n\nimport io.kotest.matchers.collections.shouldContainAll\nimport io.kotest.matchers.collections.shouldNotContain\nimport org.junit.jupiter.params.ParameterizedTest\nimport org.junit.jupiter.params.provider.Arguments\nimport org.junit.jupiter.params.provider.MethodSource\nimport org.junit.jupiter.params.provider.ValueSource\nimport software.amazon.smithy.model.shapes.ServiceShape\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.rust.codegen.core.smithy.BaseSymbolMetadataProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.expectRustMetadata\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.util.lookup\nimport software.amazon.smithy.rust.codegen.server.smithy.testutil.serverTestSymbolProvider\nimport java.util.stream.Stream\n\ninternal class DeriveEqAndHashSymbolMetadataProviderTest {\n    private val model =\n        \"\"\"\n        namespace test\n\n        service TestService {\n            version: \"123\"\n            operations: [TestOperation, StreamingOperation, EventStreamOperation]\n        }\n\n        operation TestOperation {\n            input: TestInputOutput\n            output: TestInputOutput\n        }\n\n        operation StreamingOperation {\n            input: StreamingOperationInputOutput\n            output: StreamingOperationInputOutput\n        }\n\n        operation EventStreamOperation {\n            input: EventStreamOperationInputOutput\n            output: EventStreamOperationInputOutput\n        }\n\n        structure EventStreamOperationInputOutput {\n            @httpPayload\n            @required\n            union: StreamingUnion\n        }\n\n        structure StreamingOperationInputOutput {\n            @httpPayload\n            @required\n            blobStream: BlobStream\n        }\n\n        @streaming\n        blob BlobStream\n\n        structure TestInputOutput {\n            hasFloat: HasFloat\n            hasDouble: HasDouble\n            hasDocument: HasDocument\n            containsFloat: ContainsFloat\n            containsDouble: ContainsDouble\n            containsDocument: ContainsDocument\n\n            hasList: HasList\n            hasListWithMap: HasListWithMap\n            hasMap: HasMap\n\n            eqAndHashStruct: EqAndHashStruct\n        }\n\n        structure EqAndHashStruct {\n            blob: Blob\n            boolean: Boolean\n            string: String\n            byte: Byte\n            short: Short\n            integer: Integer\n            long: Long\n            enum: Enum\n            timestamp: Timestamp\n\n            list: List\n            union: EqAndHashUnion\n\n            // bigInteger: BigInteger\n            // bigDecimal: BigDecimal\n        }\n\n        list List {\n            member: String\n        }\n\n        list ListWithMap {\n            member: Map\n        }\n\n        map Map {\n            key: String\n            value: String\n        }\n\n        union EqAndHashUnion {\n            blob: Blob\n            boolean: Boolean\n            string: String\n            byte: Byte\n            short: Short\n            integer: Integer\n            long: Long\n            enum: Enum\n            timestamp: Timestamp\n\n            list: List\n        }\n\n        @streaming\n        union StreamingUnion {\n            eqAndHashStruct: EqAndHashStruct\n        }\n\n        structure HasFloat {\n            float: Float\n        }\n\n        structure HasDouble {\n            double: Double\n        }\n\n        structure HasDocument {\n            document: Document\n        }\n\n        structure HasList {\n            list: List\n        }\n\n        structure HasListWithMap {\n            list: ListWithMap\n        }\n\n        structure HasMap {\n            map: Map\n        }\n\n        structure ContainsFloat {\n            hasFloat: HasFloat\n        }\n\n        structure ContainsDouble {\n            hasDouble: HasDouble\n        }\n\n        structure ContainsDocument {\n            containsDocument: HasDocument\n        }\n\n        enum Enum {\n            DIAMOND\n            CLUB\n            HEART\n            SPADE\n        }\n        \"\"\".asSmithyModel(smithyVersion = \"2.0\")\n    private val serviceShape = model.lookup<ServiceShape>(\"test#TestService\")\n    private val deriveEqAndHashSymbolMetadataProvider =\n        serverTestSymbolProvider(model, serviceShape)\n            .let { BaseSymbolMetadataProvider(it, additionalAttributes = listOf()) }\n            .let { DeriveEqAndHashSymbolMetadataProvider(it) }\n\n    companion object {\n        @JvmStatic\n        fun getShapes(): Stream<Arguments> {\n            val shapesWithNeitherEqNorHash =\n                listOf(\n                    \"test#StreamingOperationInputOutput\",\n                    \"test#EventStreamOperationInputOutput\",\n                    \"test#StreamingUnion\",\n                    \"test#BlobStream\",\n                    \"test#TestInputOutput\",\n                    \"test#HasFloat\",\n                    \"test#HasDouble\",\n                    \"test#HasDocument\",\n                    \"test#ContainsFloat\",\n                    \"test#ContainsDouble\",\n                    \"test#ContainsDocument\",\n                )\n\n            val shapesWithEqAndHash =\n                listOf(\n                    \"test#EqAndHashStruct\",\n                    \"test#EqAndHashUnion\",\n                    \"test#Enum\",\n                    \"test#HasList\",\n                )\n\n            val shapesWithOnlyEq =\n                listOf(\n                    \"test#HasListWithMap\",\n                    \"test#HasMap\",\n                )\n\n            return (\n                shapesWithNeitherEqNorHash.map { Arguments.of(it, emptyList<RuntimeType>()) } +\n                    shapesWithEqAndHash.map { Arguments.of(it, listOf(RuntimeType.Eq, RuntimeType.Hash)) } +\n                    shapesWithOnlyEq.map { Arguments.of(it, listOf(RuntimeType.Eq)) }\n            ).stream()\n        }\n    }\n\n    @ParameterizedTest(name = \"(#{index}) Derive `Eq` and `Hash` when possible. Params = shape: {0}, expectedTraits: {1}\")\n    @MethodSource(\"getShapes\")\n    fun `it should derive Eq and Hash when possible`(\n        shapeId: String,\n        expectedTraits: Collection<RuntimeType>,\n    ) {\n        val shape = model.lookup<Shape>(shapeId)\n        val derives = deriveEqAndHashSymbolMetadataProvider.toSymbol(shape).expectRustMetadata().derives\n        derives shouldContainAll expectedTraits\n    }\n\n    @ParameterizedTest\n    // These don't implement `PartialEq` because they are not constrained, so they don't generate newtypes. If the\n    // symbol provider wrapped `ConstrainedShapeSymbolProvider` and they were constrained, they would generate\n    // newtypes, and they would hence implement `PartialEq`.\n    @ValueSource(strings = [\"test#List\", \"test#Map\", \"test#ListWithMap\", \"smithy.api#Blob\"])\n    fun `it should not derive Eq if shape does not implement PartialEq`(shapeId: String) {\n        val shape = model.lookup<Shape>(shapeId)\n        val derives = deriveEqAndHashSymbolMetadataProvider.toSymbol(shape).expectRustMetadata().derives\n        derives shouldNotContain RuntimeType.PartialEq\n        derives shouldNotContain RuntimeType.Eq\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/Http1xDependencyTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy\n\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.params.ParameterizedTest\nimport org.junit.jupiter.params.provider.Arguments\nimport org.junit.jupiter.params.provider.MethodSource\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.node.ObjectNode\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.CratesIo\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\nimport software.amazon.smithy.rust.codegen.core.testutil.IntegrationTestParams\nimport software.amazon.smithy.rust.codegen.core.testutil.ServerAdditionalSettings\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.unitTest\nimport software.amazon.smithy.rust.codegen.server.smithy.testutil.HttpTestType\nimport software.amazon.smithy.rust.codegen.server.smithy.testutil.HttpTestVersion\nimport software.amazon.smithy.rust.codegen.server.smithy.testutil.serverIntegrationTest\nimport java.io.File\n\n/**\n * Tests for HTTP dependency selection based on http-1x flag.\n * Verifies that the correct dependencies are included in Cargo.toml and that code compiles.\n * Uses cargo_metadata to parse and validate dependencies instead of string matching.\n */\ninternal class Http1xDependencyTest {\n    private val cargoMetadata = CargoDependency(\"cargo_metadata\", CratesIo(\"0.18\"), features = setOf(\"builder\")).toType()\n    private val semver = CargoDependency(\"semver\", CratesIo(\"1.0\")).toType()\n\n    private fun buildAdditionalSettings(publicConstrainedTypes: Boolean): ObjectNode {\n        val builder = ServerAdditionalSettings.builder()\n        return builder\n            .publicConstrainedTypes(publicConstrainedTypes)\n            .generateCodegenComments(true)\n            .toObjectNode()\n    }\n\n    private fun verify_http0x_dependencies(\n        testName: String,\n        additionalDeps: List<Triple<String, String, List<String>?>> = emptyList(),\n    ) = writable {\n        rustTemplate(\n            \"\"\"\n            let metadata = #{MetadataCommand}::new()\n                .exec()\n                .expect(\"Failed to run cargo metadata\");\n\n            let root_package = metadata.root_package()\n                .expect(\"Failed to get root package\");\n\n            // Check all HTTP 0.x dependencies have minimum versions\n            let http0_crates = parse_crate_min_versions(&[\n                (\"http\", \"0.2.0\", None),\n                (\"aws-smithy-legacy-http-server\", \"0.65.7\", None),\n                (\"aws-smithy-legacy-http\", \"0.62.5\", None),\n                (\"aws-smithy-runtime-api\", \"1.9.1\", Some(&[\"http-02x\"])),\n            ]);\n\n            verify_dependencies(&metadata, root_package, &http0_crates);\n\n            // Verify http crate does NOT accept version 1.x\n            let http_dep = root_package.dependencies.iter()\n                .find(|dep| dep.name == \"http\")\n                .expect(\"Should have http dependency\");\n            let http_req = #{VersionReq}::parse(&http_dep.req.to_string())\n                .expect(\"Failed to parse http version requirement\");\n            let v1 = #{Version}::parse(\"1.0.0\").unwrap();\n            assert!(\n                !http_req.matches(&v1),\n                \"http dependency should NOT accept version 1.x (must be < 1.0), but requirement is: {}\", http_dep.req\n            );\n\n            // Should NOT have HTTP 1.x specific dependencies\n            let http1_only_crates = [\"http-body-util\", \"aws-smithy-http\", \"aws-smithy-http-server\"];\n            for dep_name in http1_only_crates {\n                assert!(\n                    !root_package.dependencies.iter().any(|d| d.name == dep_name),\n                    \"Should NOT have `{}` dependency for HTTP 0.x\", dep_name\n                );\n            }\n            \"\"\",\n            \"MetadataCommand\" to cargoMetadata.resolve(\"MetadataCommand\"),\n            \"VersionReq\" to semver.resolve(\"VersionReq\"),\n            \"Version\" to semver.resolve(\"Version\"),\n            *preludeScope,\n        )\n    }\n\n    private fun define_util_functions() =\n        writable {\n            rustTemplate(\n                \"\"\"\n            ##[cfg(test)]\n            fn extract_min_version(req: &#{VersionReq}) -> #{Version} {\n                // Handle wildcard (*) requirements - empty comparators means \"any version\"\n                if req.comparators.is_empty() {\n                    return #{Version}::new(0, 0, 0);\n                }\n\n                req.comparators.iter()\n                    .filter_map(|c| {\n                        match c.op {\n                            #{Op}::GreaterEq | #{Op}::Exact | #{Op}::Caret | #{Op}::Tilde => {\n                                Some(#{Version} {\n                                    major: c.major,\n                                    minor: c.minor.unwrap_or(0),\n                                    patch: c.patch.unwrap_or(0),\n                                    pre: #{Prerelease}::EMPTY,\n                                    build: #{BuildMetadata}::EMPTY,\n                                })\n                            }\n                            _ => None,\n                        }\n                    })\n                    .min()\n                    .expect(\"Could not determine minimum version from requirement\")\n            }\n\n            ##[cfg(test)]\n            fn get_package_version(metadata: &#{Metadata}, package_name: &str) -> #{Version} {\n                // Find the package in the metadata (works for both path and registry dependencies)\n                metadata.packages.iter()\n                    .find(|pkg| pkg.name == package_name)\n                    .map(|pkg| #{Version}::parse(&pkg.version.to_string()).expect(\"Failed to parse package version\"))\n                    .expect(&format!(\"Could not find package {} in metadata\", package_name))\n            }\n\n            ##[cfg(test)]\n            fn parse_crate_min_versions<'a>(\n                crates: &[(&'a str, &str, #{Option}<&[&str]>)]\n            ) -> #{Vec}<(&'a str, #{Version}, #{Option}<#{Vec}<#{String}>>)> {\n                crates.iter()\n                    .map(|(name, ver_str, features_opt)| {\n                        let version = #{Version}::parse(ver_str)\n                            .expect(&format!(\"Invalid version string '{}' for {}\", ver_str, name));\n                        let features = features_opt.map(|f| {\n                            f.iter().map(|s| s.to_string()).collect::<#{Vec}<#{String}>>()\n                        });\n                        (*name, version, features)\n                    })\n                    .collect()\n            }\n\n            ##[cfg(test)]\n            fn satisfies_minimum_version(actual: &#{Dependency}, expected_min: &#{Version}, metadata: &#{Metadata}) -> bool {\n                let actual_version = if actual.path.is_some() || actual.req.to_string() == \"*\" {\n                    // For path dependencies, get actual version from package metadata\n                    get_package_version(metadata, &actual.name)\n                } else {\n                    // For registry dependencies, extract minimum version from requirement\n                    extract_min_version(&actual.req)\n                };\n\n                actual_version >= *expected_min\n            }\n\n            ##[allow(dead_code)]\n            ##[cfg(test)]\n            fn has_required_features(actual: &#{Dependency}, required: &[#{String}]) -> bool {\n                required.iter().all(|f| actual.features.contains(f))\n            }\n\n            ##[cfg(test)]\n            fn verify_dependencies(\n                metadata: &#{Metadata},\n                root_package: &#{Package},\n                expected: &[(&str, #{Version}, #{Option}<#{Vec}<#{String}>>)]\n            ) {\n                for (dep_name, expected_min, expected_features) in expected {\n                    let dep = root_package.dependencies.iter()\n                        .find(|d| d.name == *dep_name)\n                        .expect(&format!(\"Must have `{}` dependency\", dep_name));\n\n                    // Check version\n                    assert!(\n                        satisfies_minimum_version(dep, expected_min, metadata),\n                        \"{} does not satisfy minimum version >= {}. Actual requirement: {} (path: {:?})\",\n                        dep_name, expected_min, dep.req, dep.path\n                    );\n\n                    // Check features if specified\n                    if let #{Some}(required_features) = expected_features {\n                        assert!(\n                            has_required_features(dep, required_features),\n                            \"{} does not have required features: {:?}. Actual features: {:?}\",\n                            dep_name, required_features, dep.features\n                        );\n                    }\n                }\n            }\n            \"\"\",\n                \"VersionReq\" to semver.resolve(\"VersionReq\"),\n                \"Version\" to semver.resolve(\"Version\"),\n                \"Op\" to semver.resolve(\"Op\"),\n                \"Prerelease\" to semver.resolve(\"Prerelease\"),\n                \"BuildMetadata\" to semver.resolve(\"BuildMetadata\"),\n                \"Metadata\" to cargoMetadata.resolve(\"Metadata\"),\n                \"Package\" to cargoMetadata.resolve(\"Package\"),\n                \"Dependency\" to cargoMetadata.resolve(\"Dependency\"),\n                *preludeScope,\n            )\n        }\n\n    @ParameterizedTest\n    @MethodSource(\"protocolAndConstrainedTypesProvider\")\n    fun `SDK with http-1x enabled compiles and has correct dependencies`(\n        protocol: ModelProtocol,\n        publicConstrainedTypes: Boolean,\n    ) {\n        val (model) = loadSmithyConstraintsModelForProtocol(protocol)\n        serverIntegrationTest(\n            model,\n            IntegrationTestParams(\n                additionalSettings = buildAdditionalSettings(publicConstrainedTypes),\n                cargoCommand = \"cargo test --all-features\",\n            ),\n            testCoverage = HttpTestType.Only(HttpTestVersion.HTTP_1_X),\n        ) { _, rustCrate ->\n            rustCrate.lib {\n                define_util_functions().invoke(this)\n\n                unitTest(\"http_1x_dependencies\") {\n                    rustTemplate(\n                        \"\"\"\n                        let metadata = #{MetadataCommand}::new()\n                            .exec()\n                            .expect(\"Failed to run cargo metadata\");\n\n                        let root_package = metadata.root_package()\n                            .expect(\"Failed to get root package\");\n\n                        // Check all HTTP 1.x dependencies have minimum versions and features\n                        let http1_crates = parse_crate_min_versions(&[\n                            (\"http\", \"1.0.0\", None),\n                            (\"aws-smithy-http\", \"0.63.0\", None),\n                            (\"aws-smithy-http-server\", \"0.66.0\", None),\n                            (\"http-body-util\", \"0.1.3\", None),\n                            (\"aws-smithy-types\", \"1.3.3\", Some(&[\"http-body-1-x\"])),\n                            (\"aws-smithy-runtime-api\", \"1.9.1\", Some(&[\"http-1x\"])),\n                        ]);\n\n                        verify_dependencies(&metadata, root_package, &http1_crates);\n\n                        // Should NOT have legacy dependencies\n                        let legacy = [\"aws-smithy-http-legacy-server\", \"aws-smithy-legacy-http\"];\n                        for legacy_crate in legacy {\n                            assert!(\n                                !root_package.dependencies.iter().any(|dep| dep.name == legacy_crate),\n                                \"Should NOT have {legacy_crate} dependency\"\n                            );\n                        }\n                        \"\"\",\n                        \"MetadataCommand\" to cargoMetadata.resolve(\"MetadataCommand\"),\n                        *preludeScope,\n                    )\n                }\n            }\n        }\n    }\n\n    @ParameterizedTest\n    @MethodSource(\"protocolAndConstrainedTypesProvider\")\n    fun `SDK defaults to http-1x disabled, and dependencies are correct`(protocol: ModelProtocol) {\n        val (model) = loadSmithyConstraintsModelForProtocol(protocol)\n        serverIntegrationTest(\n            model,\n            IntegrationTestParams(\n                additionalSettings = buildAdditionalSettings(publicConstrainedTypes = false),\n                cargoCommand = \"cargo test --all-features\",\n            ),\n            testCoverage = HttpTestType.Default,\n        ) { _, rustCrate ->\n            rustCrate.lib {\n                define_util_functions().invoke(this)\n\n                unitTest(\"http_0x_dependencies\") {\n                    verify_http0x_dependencies(\"http_0x_dependencies\").invoke(this)\n                }\n            }\n        }\n    }\n\n    @Test\n    fun `SDK with http-1x enabled for rpcv2Cbor extras model has correct dependencies`() {\n        val model = loadRpcv2CborExtrasModel()\n        serverIntegrationTest(\n            model,\n            IntegrationTestParams(\n                additionalSettings = buildAdditionalSettings(publicConstrainedTypes = false),\n                cargoCommand = \"cargo test --all-features\",\n            ),\n            testCoverage = HttpTestType.Only(HttpTestVersion.HTTP_1_X),\n        ) { _, rustCrate ->\n            rustCrate.lib {\n                define_util_functions().invoke(this)\n\n                unitTest(\"http_1x_dependencies_rpcv2cbor_extras\") {\n                    rustTemplate(\n                        \"\"\"\n                        let metadata = #{MetadataCommand}::new()\n                            .exec()\n                            .expect(\"Failed to run cargo metadata\");\n\n                        let root_package = metadata.root_package()\n                            .expect(\"Failed to get root package\");\n\n                        // Check all HTTP 1.x dependencies have minimum versions and features\n                        let http1_crates = parse_crate_min_versions(&[\n                            (\"http\", \"1.0.0\", None),\n                            (\"aws-smithy-http\", \"0.63.0\", None),\n                            (\"aws-smithy-http-server\", \"0.66.0\", None),\n                            (\"http-body-util\", \"0.1.3\", None),\n                            (\"aws-smithy-types\", \"1.3.3\", Some(&[\"http-body-1-x\"])),\n                            (\"aws-smithy-runtime-api\", \"1.9.1\", Some(&[\"http-1x\"])),\n                        ]);\n\n                        verify_dependencies(&metadata, root_package, &http1_crates);\n\n                        // Should NOT have legacy dependencies\n                        let legacy = [\"aws-smithy-http-legacy-server\", \"aws-smithy-legacy-http\"];\n                        for legacy_crate in legacy {\n                            assert!(\n                                !root_package.dependencies.iter().any(|dep| dep.name == legacy_crate),\n                                \"Should NOT have {legacy_crate} dependency\"\n                            );\n                        }\n                        \"\"\",\n                        \"MetadataCommand\" to cargoMetadata.resolve(\"MetadataCommand\"),\n                        *preludeScope,\n                    )\n                }\n            }\n        }\n    }\n\n    @Test\n    fun `SDK defaults to http-0x for rpcv2Cbor extras model and dependencies are correct`() {\n        val model = loadRpcv2CborExtrasModel()\n        serverIntegrationTest(\n            model,\n            IntegrationTestParams(\n                additionalSettings = buildAdditionalSettings(publicConstrainedTypes = false),\n                cargoCommand = \"cargo test --all-features\",\n            ),\n            testCoverage = HttpTestType.Default,\n        ) { _, rustCrate ->\n            rustCrate.lib {\n                define_util_functions().invoke(this)\n\n                unitTest(\"http_0x_dependencies_rpcv2cbor_extras\") {\n                    rustTemplate(\n                        \"\"\"\n                        let metadata = #{MetadataCommand}::new()\n                            .exec()\n                            .expect(\"Failed to run cargo metadata\");\n\n                        let root_package = metadata.root_package()\n                            .expect(\"Failed to get root package\");\n\n                        // Check all HTTP 0.x dependencies have minimum versions\n                        let http0_crates = parse_crate_min_versions(&[\n                            (\"http\", \"0.2.0\", None),\n                            (\"aws-smithy-legacy-http-server\", \"0.65.7\", None),\n                            (\"aws-smithy-legacy-http\", \"0.62.5\", Some(&[\"event-stream\"])),\n                            (\"aws-smithy-runtime-api\", \"1.9.1\", Some(&[\"http-02x\"])),\n                        ]);\n\n                        verify_dependencies(&metadata, root_package, &http0_crates);\n\n                        // Verify http crate does NOT accept version 1.x\n                        let http_dep = root_package.dependencies.iter()\n                            .find(|dep| dep.name == \"http\")\n                            .expect(\"Should have http dependency\");\n                        let http_req = #{VersionReq}::parse(&http_dep.req.to_string())\n                            .expect(\"Failed to parse http version requirement\");\n                        let v1 = #{Version}::parse(\"1.0.0\").unwrap();\n                        assert!(\n                            !http_req.matches(&v1),\n                            \"http dependency should NOT accept version 1.x (must be < 1.0), but requirement is: {}\", http_dep.req\n                        );\n\n                        // Should NOT have HTTP 1.x specific dependencies\n                        let http1_only_crates = [\"http-body-util\", \"aws-smithy-http\", \"aws-smithy-http-server\"];\n                        for dep_name in http1_only_crates {\n                            assert!(\n                                !root_package.dependencies.iter().any(|d| d.name == dep_name),\n                                \"Should NOT have `{}` dependency for HTTP 0.x\", dep_name\n                            );\n                        }\n                        \"\"\",\n                        \"MetadataCommand\" to cargoMetadata.resolve(\"MetadataCommand\"),\n                        \"VersionReq\" to semver.resolve(\"VersionReq\"),\n                        \"Version\" to semver.resolve(\"Version\"),\n                        *preludeScope,\n                    )\n                }\n            }\n        }\n    }\n\n    @Test\n    fun `SDK with explicit http-1x disabled has correct dependencies`() {\n        val (model) = loadSmithyConstraintsModelForProtocol(ModelProtocol.RestJson)\n        serverIntegrationTest(\n            model,\n            IntegrationTestParams(\n                additionalSettings = buildAdditionalSettings(publicConstrainedTypes = false),\n                cargoCommand = \"cargo test --all-features\",\n            ),\n            testCoverage = HttpTestType.Only(HttpTestVersion.HTTP_0_X),\n        ) { _, rustCrate ->\n            rustCrate.lib {\n                define_util_functions().invoke(this)\n\n                unitTest(\"explicit_http_0x_disabled\") {\n                    verify_http0x_dependencies(\"explicit_http_0x_disabled\").invoke(this)\n                }\n            }\n        }\n    }\n\n    companion object {\n        @JvmStatic\n        fun protocolAndConstrainedTypesProvider(): List<Arguments> {\n            // Constraints are not implemented for RestXML protocol.\n            val protocols =\n                ModelProtocol.entries.filter {\n                    !it.name.matches(Regex(\"RestXml.*\"))\n                }\n            val constrainedSettings = listOf(true, false)\n\n            return protocols.flatMap { protocol ->\n                constrainedSettings.map { publicConstrained ->\n                    Arguments.of(protocol, publicConstrained)\n                }\n            }\n        }\n    }\n}\n\n/**\n * Loads the rpcv2Cbor-extras model defined in the common repository and returns the model.\n */\nfun loadRpcv2CborExtrasModel(): Model {\n    val filePath = \"../codegen-core/common-test-models/rpcv2Cbor-extras.smithy\"\n    return File(filePath).readText().asSmithyModel()\n}\n"
  },
  {
    "path": "codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/NamingObstacleCourseTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy\n\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.rust.codegen.core.testutil.NamingObstacleCourseTestModels\nimport software.amazon.smithy.rust.codegen.server.smithy.testutil.serverIntegrationTest\n\nclass NamingObstacleCourseTest {\n    @Test\n    fun `test Rust prelude operation names compile`() {\n        serverIntegrationTest(NamingObstacleCourseTestModels.rustPreludeOperationsModel()) { _, _ -> }\n    }\n\n    @Test\n    fun `test Rust prelude structure names compile`() {\n        serverIntegrationTest(NamingObstacleCourseTestModels.rustPreludeStructsModel()) { _, _ -> }\n    }\n\n    @Test\n    fun `test Rust prelude enum names compile`() {\n        serverIntegrationTest(NamingObstacleCourseTestModels.rustPreludeEnumsModel()) { _, _ -> }\n    }\n\n    @Test\n    fun `test Rust prelude enum variant names compile`() {\n        serverIntegrationTest(NamingObstacleCourseTestModels.rustPreludeEnumVariantsModel()) { _, _ -> }\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/PatternTraitEscapedSpecialCharsValidatorTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy\n\nimport io.kotest.assertions.throwables.shouldThrow\nimport io.kotest.matchers.collections.shouldHaveSize\nimport io.kotest.matchers.shouldBe\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.model.validation.Severity\nimport software.amazon.smithy.model.validation.ValidatedResultException\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\n\nclass PatternTraitEscapedSpecialCharsValidatorTest {\n    @Test\n    fun `should error out with a suggestion if non-escaped special chars used inside @pattern`() {\n        val exception =\n            shouldThrow<ValidatedResultException> {\n                \"\"\"\n                namespace test\n\n                @pattern(\"\\t\")\n                string MyString\n                \"\"\".asSmithyModel(smithyVersion = \"2\")\n            }\n        val events = exception.validationEvents.filter { it.severity == Severity.ERROR }\n\n        events shouldHaveSize 1\n        events[0].shapeId.get() shouldBe ShapeId.from(\"test#MyString\")\n        events[0].message shouldBe\n            \"\"\"\n            Non-escaped special characters used inside `@pattern`.\n            You must escape them: `@pattern(\"\\\\t\")`.\n            See https://github.com/smithy-lang/smithy-rs/issues/2508 for more details.\n            \"\"\".trimIndent()\n    }\n\n    @Test\n    fun `should suggest escaping spacial characters properly`() {\n        val exception =\n            shouldThrow<ValidatedResultException> {\n                \"\"\"\n                namespace test\n\n                @pattern(\"[.\\n\\\\r]+\")\n                string MyString\n                \"\"\".asSmithyModel(smithyVersion = \"2\")\n            }\n        val events = exception.validationEvents.filter { it.severity == Severity.ERROR }\n\n        events shouldHaveSize 1\n        events[0].shapeId.get() shouldBe ShapeId.from(\"test#MyString\")\n        events[0].message shouldBe\n            \"\"\"\n            Non-escaped special characters used inside `@pattern`.\n            You must escape them: `@pattern(\"[.\\\\n\\\\r]+\")`.\n            See https://github.com/smithy-lang/smithy-rs/issues/2508 for more details.\n            \"\"\".trimIndent()\n    }\n\n    @Test\n    fun `should report all non-escaped special characters`() {\n        val exception =\n            shouldThrow<ValidatedResultException> {\n                \"\"\"\n                namespace test\n\n                @pattern(\"\\b\")\n                string MyString\n\n                @pattern(\"^\\n$\")\n                string MyString2\n\n                @pattern(\"^[\\n]+$\")\n                string MyString3\n\n                @pattern(\"^[\\r\\t]$\")\n                string MyString4\n                \"\"\".asSmithyModel(smithyVersion = \"2\")\n            }\n        val events = exception.validationEvents.filter { it.severity == Severity.ERROR }\n        events shouldHaveSize 4\n    }\n\n    @Test\n    fun `should report errors on string members`() {\n        val exception =\n            shouldThrow<ValidatedResultException> {\n                \"\"\"\n                namespace test\n\n                @pattern(\"\\t\")\n                string MyString\n\n                structure MyStructure {\n                    @pattern(\"\\b\")\n                    field: String\n                }\n                \"\"\".asSmithyModel(smithyVersion = \"2\")\n            }\n        val events = exception.validationEvents.filter { it.severity == Severity.ERROR }\n\n        events shouldHaveSize 2\n        events[0].shapeId.get() shouldBe ShapeId.from(\"test#MyString\")\n        events[1].shapeId.get() shouldBe ShapeId.from(\"test#MyStructure\\$field\")\n    }\n\n    @Test\n    fun `shouldn't error out if special chars are properly escaped`() {\n        \"\"\"\n        namespace test\n\n        @pattern(\"\\\\t\")\n        string MyString\n\n        @pattern(\"[.\\\\n\\\\r]+\")\n        string MyString2\n\n        @pattern(\"\\\\b\\\\f\\\\n\\\\r\\\\t\")\n        string MyString3\n\n        @pattern(\"\\\\w+\")\n        string MyString4\n        \"\"\".asSmithyModel(smithyVersion = \"2\")\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/PubCrateConstrainedShapeSymbolProviderTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy\n\nimport io.kotest.assertions.throwables.shouldThrow\nimport io.kotest.matchers.shouldBe\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.model.shapes.ListShape\nimport software.amazon.smithy.model.shapes.MapShape\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.StringShape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.shapes.UnionShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustType\nimport software.amazon.smithy.rust.codegen.core.smithy.rustType\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.util.lookup\nimport software.amazon.smithy.rust.codegen.server.smithy.testutil.serverTestSymbolProviders\n\nclass PubCrateConstrainedShapeSymbolProviderTest {\n    private val model =\n        \"\"\"\n        $BASE_MODEL_STRING\n\n        structure NonTransitivelyConstrainedStructureShape {\n            constrainedString: ConstrainedString,\n            constrainedMap: ConstrainedMap,\n            unconstrainedMap: TransitivelyConstrainedMap\n        }\n\n        list TransitivelyConstrainedCollection {\n            member: Structure\n        }\n\n        structure Structure {\n            @required\n            requiredMember: String\n        }\n\n        structure StructureWithMemberTargetingAggregateShape {\n            member: TransitivelyConstrainedCollection\n        }\n\n        union Union {\n            structure: Structure\n        }\n        \"\"\".asSmithyModel()\n\n    private val serverTestSymbolProviders = serverTestSymbolProviders(model)\n    private val symbolProvider = serverTestSymbolProviders.symbolProvider\n    private val pubCrateConstrainedShapeSymbolProvider = serverTestSymbolProviders.pubCrateConstrainedShapeSymbolProvider\n\n    @Test\n    fun `it should crash when provided with a shape that is directly constrained`() {\n        val constrainedStringShape = model.lookup<StringShape>(\"test#ConstrainedString\")\n        shouldThrow<IllegalArgumentException> {\n            pubCrateConstrainedShapeSymbolProvider.toSymbol(constrainedStringShape)\n        }\n    }\n\n    @Test\n    fun `it should crash when provided with a shape that is unconstrained`() {\n        val unconstrainedStringShape = model.lookup<StringShape>(\"test#UnconstrainedString\")\n        shouldThrow<IllegalArgumentException> {\n            pubCrateConstrainedShapeSymbolProvider.toSymbol(unconstrainedStringShape)\n        }\n    }\n\n    @Test\n    fun `it should return an opaque type for transitively constrained collection shapes`() {\n        val transitivelyConstrainedCollectionShape = model.lookup<ListShape>(\"test#TransitivelyConstrainedCollection\")\n        val transitivelyConstrainedCollectionType =\n            pubCrateConstrainedShapeSymbolProvider.toSymbol(transitivelyConstrainedCollectionShape).rustType()\n\n        transitivelyConstrainedCollectionType shouldBe\n            RustType.Opaque(\n                \"TransitivelyConstrainedCollectionConstrained\",\n                \"crate::constrained::transitively_constrained_collection_constrained\",\n            )\n    }\n\n    @Test\n    fun `it should return an opaque type for transitively constrained map shapes`() {\n        val transitivelyConstrainedMapShape = model.lookup<MapShape>(\"test#TransitivelyConstrainedMap\")\n        val transitivelyConstrainedMapType =\n            pubCrateConstrainedShapeSymbolProvider.toSymbol(transitivelyConstrainedMapShape).rustType()\n\n        transitivelyConstrainedMapType shouldBe\n            RustType.Opaque(\n                \"TransitivelyConstrainedMapConstrained\",\n                \"crate::constrained::transitively_constrained_map_constrained\",\n            )\n    }\n\n    @Test\n    fun `it should not blindly delegate to the base symbol provider when provided with a transitively constrained structure member shape targeting an aggregate shape`() {\n        val memberShape = model.lookup<MemberShape>(\"test#StructureWithMemberTargetingAggregateShape\\$member\")\n        val memberType = pubCrateConstrainedShapeSymbolProvider.toSymbol(memberShape).rustType()\n\n        memberType shouldBe\n            RustType.Option(\n                RustType.Opaque(\n                    \"TransitivelyConstrainedCollectionConstrained\",\n                    \"crate::constrained::transitively_constrained_collection_constrained\",\n                ),\n            )\n    }\n\n    @Test\n    fun `it should delegate to the base symbol provider when provided with a structure shape`() {\n        val structureShape = model.lookup<StructureShape>(\"test#NonTransitivelyConstrainedStructureShape\")\n        val structureSymbol = pubCrateConstrainedShapeSymbolProvider.toSymbol(structureShape)\n\n        structureSymbol shouldBe symbolProvider.toSymbol(structureShape)\n    }\n\n    @Test\n    fun `it should delegate to the base symbol provider when provided with a union shape`() {\n        val unionShape = model.lookup<UnionShape>(\"test#Union\")\n        val unionSymbol = pubCrateConstrainedShapeSymbolProvider.toSymbol(unionShape)\n\n        unionSymbol shouldBe symbolProvider.toSymbol(unionShape)\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/RecursiveConstraintViolationsTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy\n\nimport org.junit.jupiter.api.extension.ExtensionContext\nimport org.junit.jupiter.params.ParameterizedTest\nimport org.junit.jupiter.params.provider.Arguments\nimport org.junit.jupiter.params.provider.ArgumentsProvider\nimport org.junit.jupiter.params.provider.ArgumentsSource\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.server.smithy.testutil.serverIntegrationTest\nimport java.util.stream.Stream\n\ninternal class RecursiveConstraintViolationsTest {\n    data class TestCase(\n        /** The test name is only used in the generated report, to easily identify a failing test. **/\n        val testName: String,\n        /** The model to generate **/\n        val model: Model,\n        /** The shape ID of the member shape that should have the marker trait attached. **/\n        val shapeIdWithConstraintViolationRustBoxTrait: String,\n    )\n\n    class RecursiveConstraintViolationsTestProvider : ArgumentsProvider {\n        private val baseModel =\n            \"\"\"\n            namespace com.amazonaws.recursiveconstraintviolations\n\n            use aws.protocols#restJson1\n            use smithy.framework#ValidationException\n\n            @restJson1\n            service RecursiveConstraintViolations {\n                operations: [\n                    Operation\n                ]\n            }\n\n            @http(uri: \"/operation\", method: \"POST\")\n            operation Operation {\n                input: Recursive\n                output: Recursive\n                errors: [ValidationException]\n            }\n            \"\"\"\n\n        private fun recursiveListModel(\n            sparse: Boolean,\n            listPrefix: String = \"\",\n        ): Pair<Model, String> =\n            \"\"\"\n            $baseModel\n\n            structure Recursive {\n                list: ${listPrefix}List\n            }\n\n            ${ if (sparse) {\n                \"@sparse\"\n            } else {\n                \"\"\n            } }\n            @length(min: 69)\n            list ${listPrefix}List {\n                member: Recursive\n            }\n            \"\"\".asSmithyModel() to\n                if (\"${listPrefix}List\" < \"Recursive\") {\n                    \"com.amazonaws.recursiveconstraintviolations#${listPrefix}List\\$member\"\n                } else {\n                    \"com.amazonaws.recursiveconstraintviolations#Recursive\\$list\"\n                }\n\n        private fun recursiveMapModel(\n            sparse: Boolean,\n            mapPrefix: String = \"\",\n        ): Pair<Model, String> =\n            \"\"\"\n            $baseModel\n\n            structure Recursive {\n                map: ${mapPrefix}Map\n            }\n\n            ${ if (sparse) {\n                \"@sparse\"\n            } else {\n                \"\"\n            } }\n            @length(min: 69)\n            map ${mapPrefix}Map {\n                key: String,\n                value: Recursive\n            }\n            \"\"\".asSmithyModel() to\n                if (\"${mapPrefix}Map\" < \"Recursive\") {\n                    \"com.amazonaws.recursiveconstraintviolations#${mapPrefix}Map\\$value\"\n                } else {\n                    \"com.amazonaws.recursiveconstraintviolations#Recursive\\$map\"\n                }\n\n        private fun recursiveUnionModel(unionPrefix: String = \"\"): Pair<Model, String> =\n            \"\"\"\n            $baseModel\n\n            structure Recursive {\n                attributeValue: ${unionPrefix}AttributeValue\n            }\n\n            // Named `${unionPrefix}AttributeValue` in honor of DynamoDB's famous `AttributeValue`.\n            // https://docs.rs/aws-sdk-dynamodb/latest/aws_sdk_dynamodb/model/enum.AttributeValue.html\n            union ${unionPrefix}AttributeValue {\n                set: SetAttribute\n            }\n\n            @uniqueItems\n            list SetAttribute {\n                member: ${unionPrefix}AttributeValue\n            }\n            \"\"\".asSmithyModel() to\n                // The first loop the algorithm picks out to fix turns out to be the `list <-> union` loop:\n                //\n                // ```\n                // [\n                //     ${unionPrefix}AttributeValue,\n                //     ${unionPrefix}AttributeValue$set,\n                //     SetAttribute,\n                //     SetAttribute$member\n                // ]\n                // ```\n                //\n                // Upon which, after fixing it, the other loop (`structure <-> list <-> union`) already contains\n                // indirection, so we disregard it.\n                //\n                // This is hence a good test in that it tests that `RecursiveConstraintViolationBoxer` does not\n                // superfluously add more indirection than strictly necessary.\n                // However, it is a bad test in that if the Smithy library ever returns the recursive paths in a\n                // different order, the (`structure <-> list <-> union`) loop might be fixed first, and this test might\n                // start to fail! So watch out for that. Nonetheless, `RecursiveShapeBoxer` calls out:\n                //\n                //     This function MUST be deterministic (always choose the same shapes to `Box`). If it is not, that is a bug.\n                //\n                // So I think it's fair to write this test under the above assumption.\n                if (\"${unionPrefix}AttributeValue\" < \"SetAttribute\") {\n                    \"com.amazonaws.recursiveconstraintviolations#${unionPrefix}AttributeValue\\$set\"\n                } else {\n                    \"com.amazonaws.recursiveconstraintviolations#SetAttribute\\$member\"\n                }\n\n        override fun provideArguments(context: ExtensionContext?): Stream<out Arguments> {\n            val listModels =\n                listOf(false, true).flatMap { isSparse ->\n                    listOf(\"\", \"ZZZ\").map { listPrefix ->\n                        val (model, shapeIdWithConstraintViolationRustBoxTrait) = recursiveListModel(isSparse, listPrefix)\n                        var testName = \"${ if (isSparse) \"sparse\" else \"non-sparse\" } recursive list\"\n                        if (listPrefix.isNotEmpty()) {\n                            testName += \" with shape name prefix $listPrefix\"\n                        }\n                        TestCase(testName, model, shapeIdWithConstraintViolationRustBoxTrait)\n                    }\n                }\n            val mapModels =\n                listOf(false, true).flatMap { isSparse ->\n                    listOf(\"\", \"ZZZ\").map { mapPrefix ->\n                        val (model, shapeIdWithConstraintViolationRustBoxTrait) = recursiveMapModel(isSparse, mapPrefix)\n                        var testName = \"${ if (isSparse) \"sparse\" else \"non-sparse\" } recursive map\"\n                        if (mapPrefix.isNotEmpty()) {\n                            testName += \" with shape name prefix $mapPrefix\"\n                        }\n                        TestCase(testName, model, shapeIdWithConstraintViolationRustBoxTrait)\n                    }\n                }\n            val unionModels =\n                listOf(\"\", \"ZZZ\").map { unionPrefix ->\n                    val (model, shapeIdWithConstraintViolationRustBoxTrait) = recursiveUnionModel(unionPrefix)\n                    var testName = \"recursive union\"\n                    if (unionPrefix.isNotEmpty()) {\n                        testName += \" with shape name prefix $unionPrefix\"\n                    }\n                    TestCase(testName, model, shapeIdWithConstraintViolationRustBoxTrait)\n                }\n            return listOf(listModels, mapModels, unionModels)\n                .flatten()\n                .map { Arguments.of(it) }.stream()\n        }\n    }\n\n    /**\n     * Ensures the models generate code that compiles.\n     *\n     * Make sure the tests in [software.amazon.smithy.rust.codegen.server.smithy.transformers.RecursiveConstraintViolationBoxerTest]\n     * are all passing before debugging any of these tests, since the former tests test preconditions for these.\n     */\n    @ParameterizedTest\n    @ArgumentsSource(RecursiveConstraintViolationsTestProvider::class)\n    fun `recursive constraint violation code generation test`(testCase: TestCase) {\n        serverIntegrationTest(testCase.model)\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/RustCrateInlineModuleComposingWriterTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy\n\nimport io.kotest.matchers.collections.shouldContain\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustModule\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.Visibility\nimport software.amazon.smithy.rust.codegen.core.rustlang.comment\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlock\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeCrateLocation\nimport software.amazon.smithy.rust.codegen.core.smithy.RustCrate\nimport software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.compileAndTest\nimport software.amazon.smithy.rust.codegen.core.testutil.generatePluginContext\nimport software.amazon.smithy.rust.codegen.core.testutil.unitTest\nimport software.amazon.smithy.rust.codegen.server.smithy.testutil.serverTestCodegenContext\nimport software.amazon.smithy.rust.codegen.server.smithy.testutil.serverTestSymbolProvider\nimport java.io.File\n\nclass RustCrateInlineModuleComposingWriterTest {\n    private val rustCrate: RustCrate\n    private val codegenContext: ServerCodegenContext\n    private val model: Model =\n        \"\"\"\n        ${'$'}version: \"2.0\"\n        namespace test\n\n        use aws.api#data\n        use aws.protocols#restJson1\n\n        @title(\"Weather Service\")\n        @restJson1\n        service WeatherService {\n            operations: [MalformedPatternOverride]\n        }\n\n        @suppress([\"UnstableTrait\"])\n        @http(uri: \"/MalformedPatternOverride\", method: \"GET\")\n        operation MalformedPatternOverride {\n            output: MalformedPatternOverrideInput,\n            errors: []\n        }\n\n        structure MalformedPatternOverrideInput {\n            @pattern(\"^[g-m]+${'$'}\")\n            string: PatternString,\n        }\n\n        @pattern(\"^[a-m]+${'$'}\")\n        string PatternString\n        \"\"\".trimIndent().asSmithyModel()\n\n    init {\n        codegenContext = serverTestCodegenContext(model)\n        val runtimeConfig =\n            RuntimeConfig(runtimeCrateLocation = RuntimeCrateLocation.path(File(\"../rust-runtime\").absolutePath))\n\n        val (context, _) =\n            generatePluginContext(\n                model,\n                runtimeConfig = runtimeConfig,\n            )\n        val settings = ServerRustSettings.from(context.model, context.settings)\n        rustCrate =\n            RustCrate(\n                context.fileManifest,\n                codegenContext.symbolProvider,\n                settings.codegenConfig,\n                codegenContext.expectModuleDocProvider(),\n            )\n    }\n\n    private fun createTestInlineModule(\n        parentModule: RustModule,\n        moduleName: String,\n    ): RustModule.LeafModule =\n        RustModule.new(\n            moduleName,\n            visibility = Visibility.PUBLIC,\n            parent = parentModule,\n            inline = true,\n        )\n\n    private fun createTestOrphanInlineModule(moduleName: String): RustModule.LeafModule =\n        RustModule.new(\n            moduleName,\n            visibility = Visibility.PUBLIC,\n            parent = RustModule.LibRs,\n            inline = true,\n        )\n\n    private fun helloWorld(\n        writer: RustWriter,\n        moduleName: String,\n    ) {\n        writer.rustBlock(\"pub fn hello_world()\") {\n            writer.comment(\"Module $moduleName\")\n        }\n    }\n\n    private fun byeWorld(\n        writer: RustWriter,\n        moduleName: String,\n    ) {\n        writer.rustBlock(\"pub fn bye_world()\") {\n            writer.comment(\"Module $moduleName\")\n            writer.rust(\"\"\"println!(\"from inside $moduleName\");\"\"\")\n        }\n    }\n\n    @Test\n    fun `calling withModule multiple times returns same object on rustModule`() {\n        val testProject = TestWorkspace.testProject(serverTestSymbolProvider(model))\n        val writers: MutableSet<RustWriter> = mutableSetOf()\n        testProject.withModule(ServerRustModule.Model) {\n            writers.add(this)\n        }\n        testProject.withModule(ServerRustModule.Model) {\n            writers shouldContain this\n        }\n    }\n\n    @Test\n    fun `simple inline module works`() {\n        val testProject = TestWorkspace.testProject(serverTestSymbolProvider(model))\n        val moduleA = createTestInlineModule(ServerRustModule.Model, \"a\")\n        testProject.withModule(ServerRustModule.Model) {\n            testProject.getInlineModuleWriter().withInlineModule(this, moduleA) {\n                helloWorld(this, \"a\")\n            }\n        }\n\n        testProject.getInlineModuleWriter().render()\n        testProject.withModule(ServerRustModule.Model) {\n            this.unitTest(\"test_a\") {\n                rust(\"crate::model::a::hello_world();\")\n            }\n        }\n        testProject.compileAndTest()\n    }\n\n    @Test\n    fun `creating nested modules works from different rustWriters`() {\n        // Define the following functions in different inline modules.\n        // crate::model::a::hello_world();\n        // crate::model::a::bye_world();\n        // crate::model::b::hello_world();\n        // crate::model::b::bye_world();\n        // crate::model::b::c::hello_world();\n        // crate::model::b::c::bye_world();\n        // crate::input::e::hello_world();\n        // crate::output::f::hello_world();\n        // crate::output::f::g::hello_world();\n        // crate::output::h::hello_world();\n        // crate::output::h::i::hello_world();\n\n        val testProject = TestWorkspace.testProject(serverTestSymbolProvider(model))\n        val modules =\n            hashMapOf(\n                \"a\" to createTestOrphanInlineModule(\"a\"),\n                \"d\" to createTestOrphanInlineModule(\"d\"),\n                \"e\" to createTestOrphanInlineModule(\"e\"),\n                \"i\" to createTestOrphanInlineModule(\"i\"),\n            )\n\n        modules[\"b\"] = createTestInlineModule(ServerRustModule.Model, \"b\")\n        modules[\"c\"] = createTestInlineModule(modules[\"b\"]!!, \"c\")\n        modules[\"f\"] = createTestInlineModule(ServerRustModule.Output, \"f\")\n        modules[\"g\"] = createTestInlineModule(modules[\"f\"]!!, \"g\")\n        modules[\"h\"] = createTestInlineModule(ServerRustModule.Output, \"h\")\n        // A different kotlin object but would still go in the right place\n\n        testProject.withModule(ServerRustModule.Model) {\n            testProject.getInlineModuleWriter().withInlineModule(this, modules[\"a\"]!!) {\n                helloWorld(this, \"a\")\n            }\n            testProject.getInlineModuleWriter().withInlineModule(this, modules[\"b\"]!!) {\n                helloWorld(this, \"b\")\n                testProject.getInlineModuleWriter().withInlineModule(this, modules[\"c\"]!!) {\n                    byeWorld(this, \"b::c\")\n                }\n            }\n            // Writing to the same module crate::model::a second time should work.\n            testProject.getInlineModuleWriter().withInlineModule(this, modules[\"a\"]!!) {\n                byeWorld(this, \"a\")\n            }\n            // Writing to model::b, when model::b and model::b::c have already been written to\n            // should work.\n            testProject.getInlineModuleWriter().withInlineModule(this, modules[\"b\"]!!) {\n                byeWorld(this, \"b\")\n            }\n        }\n\n        // Write directly to an inline module without specifying the immediate parent. crate::model::b::c\n        // should have a `hello_world` fn in it now.\n        testProject.withModule(ServerRustModule.Model) {\n            testProject.getInlineModuleWriter().withInlineModuleHierarchy(this, modules[\"c\"]!!) {\n                helloWorld(this, \"c\")\n            }\n        }\n        // Write to a different top level module to confirm that works.\n        testProject.withModule(ServerRustModule.Input) {\n            testProject.getInlineModuleWriter().withInlineModuleHierarchy(this, modules[\"e\"]!!) {\n                helloWorld(this, \"e\")\n            }\n        }\n\n        // Create a descendent inner module crate::output::f::g and then try writing to the intermediate inner module\n        // that did not exist before the descendent was dded.\n        testProject.getInlineModuleWriter().withInlineModuleHierarchyUsingCrate(testProject, modules[\"f\"]!!) {\n            testProject.getInlineModuleWriter().withInlineModuleHierarchyUsingCrate(testProject, modules[\"g\"]!!) {\n                helloWorld(this, \"g\")\n            }\n        }\n\n        testProject.getInlineModuleWriter().withInlineModuleHierarchyUsingCrate(testProject, modules[\"f\"]!!) {\n            helloWorld(this, \"f\")\n        }\n\n        // It should work even if the inner descendent module was added using `withInlineModuleHierarchy` and then\n        // code is added to the intermediate module using `withInlineModuleHierarchyUsingCrate`\n        testProject.withModule(ServerRustModule.Output) {\n            testProject.getInlineModuleWriter().withInlineModuleHierarchy(this, modules[\"h\"]!!) {\n                testProject.getInlineModuleWriter().withInlineModuleHierarchy(this, modules[\"i\"]!!) {\n                    helloWorld(this, \"i\")\n                }\n                testProject.withModule(ServerRustModule.Model) {\n                    // While writing to output::h::i, it should be able to a completely different module\n                    testProject.getInlineModuleWriter().withInlineModuleHierarchy(this, modules[\"b\"]!!) {\n                        rustBlock(\"pub fn some_other_writer_wrote_this()\") {\n                            rust(\"\"\"println!(\"from inside crate::model::b::some_other_writer_wrote_this\");\"\"\")\n                        }\n                    }\n                }\n            }\n        }\n        testProject.getInlineModuleWriter().withInlineModuleHierarchyUsingCrate(testProject, modules[\"h\"]!!) {\n            helloWorld(this, \"h\")\n        }\n\n        // Render all of the code.\n        testProject.getInlineModuleWriter().render()\n\n        testProject.withModule(ServerRustModule.Model) {\n            this.unitTest(\"test_a\") {\n                rust(\"crate::model::a::hello_world();\")\n                rust(\"crate::model::a::bye_world();\")\n            }\n            this.unitTest(\"test_b\") {\n                rust(\"crate::model::b::hello_world();\")\n                rust(\"crate::model::b::bye_world();\")\n            }\n            this.unitTest(\"test_someother_writer_wrote\") {\n                rust(\"crate::model::b::some_other_writer_wrote_this();\")\n            }\n            this.unitTest(\"test_b_c\") {\n                rust(\"crate::model::b::c::hello_world();\")\n                rust(\"crate::model::b::c::bye_world();\")\n            }\n            this.unitTest(\"test_e\") {\n                rust(\"crate::input::e::hello_world();\")\n            }\n            this.unitTest(\"test_f\") {\n                rust(\"crate::output::f::hello_world();\")\n            }\n            this.unitTest(\"test_g\") {\n                rust(\"crate::output::f::g::hello_world();\")\n            }\n            this.unitTest(\"test_h\") {\n                rust(\"crate::output::h::hello_world();\")\n            }\n            this.unitTest(\"test_h_i\") {\n                rust(\"crate::output::h::i::hello_world();\")\n            }\n        }\n        testProject.compileAndTest()\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ServerCodegenVisitorTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy\n\nimport io.kotest.matchers.shouldBe\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.generatePluginContext\nimport software.amazon.smithy.rust.codegen.server.smithy.customizations.ServerRequiredCustomizations\nimport software.amazon.smithy.rust.codegen.server.smithy.customizations.SmithyValidationExceptionDecorator\nimport software.amazon.smithy.rust.codegen.server.smithy.customize.CombinedServerCodegenDecorator\nimport kotlin.io.path.writeText\n\nclass ServerCodegenVisitorTest {\n    @Test\n    fun `baseline transform verify mixins removed`() {\n        val model =\n            \"\"\"\n            namespace com.example\n\n            use aws.protocols#awsJson1_0\n\n            @awsJson1_0\n            @aws.api#service(sdkId: \"Test\", endpointPrefix: \"differentPrefix\")\n            service Example {\n                operations: [ BasicOperation ]\n            }\n\n            operation BasicOperation {\n                input: Shape\n            }\n\n            @mixin\n            structure SimpleMixin {\n                name: String\n            }\n\n            structure Shape with [\n                SimpleMixin\n            ] {\n                greeting: String\n            }\n            \"\"\".asSmithyModel(smithyVersion = \"2.0\")\n        val (ctx, testDir) = generatePluginContext(model)\n        testDir.resolve(\"src/main.rs\").writeText(\"fn main() {}\")\n        val codegenDecorator =\n            CombinedServerCodegenDecorator.fromClasspath(\n                ctx,\n                ServerRequiredCustomizations(),\n                SmithyValidationExceptionDecorator(),\n            )\n        val visitor = ServerCodegenVisitor(ctx, codegenDecorator)\n        val baselineModel = visitor.baselineTransformInternalTest(model)\n        baselineModel.getShapesWithTrait(ShapeId.from(\"smithy.api#mixin\")).isEmpty() shouldBe true\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ServerTypesReExportTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\npackage software.amazon.smithy.rust.codegen.server.smithy\n\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.testutil.IntegrationTestParams\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.testModule\nimport software.amazon.smithy.rust.codegen.core.testutil.unitTest\nimport software.amazon.smithy.rust.codegen.server.smithy.testutil.serverIntegrationTest\nimport kotlin.io.path.readText\n\nclass ServerTypesReExportTest {\n    private val sampleModel =\n        \"\"\"\n        namespace amazon\n        use aws.protocols#restJson1\n\n        @restJson1\n        service SampleService {\n            operations: [SampleOperation]\n        }\n        @http(uri: \"/sample\", method: \"GET\")\n        operation SampleOperation {\n            output := {}\n        }\n        \"\"\".asSmithyModel(smithyVersion = \"2\")\n\n    private val eventStreamModel =\n        \"\"\"\n        ${'$'}version: \"2.0\"\n        namespace amazon\n        use smithy.protocols#rpcv2Cbor\n\n        @rpcv2Cbor\n        service EventStreamService {\n            operations: [StreamingOperation]\n        }\n\n        operation StreamingOperation {\n            input := {}\n            output := {\n                events: Events\n            }\n        }\n\n        @streaming\n        union Events {\n            event: Event\n        }\n\n        structure Event {\n            data: String\n        }\n        \"\"\".asSmithyModel()\n\n    @Test\n    fun `ensure types are exported from aws-smithy-http-server`() {\n        serverIntegrationTest(sampleModel, IntegrationTestParams(service = \"amazon#SampleService\")) { _, rustCrate ->\n            rustCrate.testModule {\n                fun Set<String>.generateUseStatements(prefix: String) =\n                    this.joinToString(separator = \"\\n\") {\n                        \"#[allow(unused_imports)] use $prefix::$it;\"\n                    }\n\n                // Ensure all types that were exported before version 0.64 and used\n                // under the `{generated_sdk_crate_name}::server` namespace remain available.\n                // Additionally, include all types requested by customers.\n                unitTest(\n                    \"types_exists_in_server_module\",\n                    setOf(\n                        \"extension::{OperationExtensionExt, OperationExtension}\",\n                        \"plugin::Scoped\",\n                        \"routing::{Route, RoutingService}\",\n                        \"body::boxed\",\n                        \"shape_id::ShapeId\",\n                        \"body::BoxBody\",\n                        \"operation::OperationShape\",\n                        \"plugin::HttpPlugins\",\n                        \"plugin::ModelPlugins\",\n                        \"plugin::HttpMarker\",\n                        \"plugin::ModelMarker\",\n                        \"plugin::Plugin\",\n                        \"plugin::PluginStack\",\n                        \"request::{self, FromParts}\",\n                        \"response::IntoResponse\",\n                        \"routing::IntoMakeService\",\n                        \"routing::IntoMakeServiceWithConnectInfo\",\n                        \"routing::Router\",\n                        \"instrumentation\",\n                        \"protocol\",\n                        \"Extension\",\n                        \"scope\",\n                    ).generateUseStatements(\"crate::server\"),\n                )\n\n                unitTest(\n                    \"request_id_reexports\",\n                    additionalAttributes = listOf(Attribute.featureGate(\"request-id\")),\n                ) {\n                    rustTemplate(\n                        \"\"\"\n                        ##[allow(unused_imports)] use crate::server::request::request_id::ServerRequestId;\n                        \"\"\",\n                    )\n                }\n\n                unitTest(\n                    \"aws_lambda_reexports\",\n                    additionalAttributes = listOf(Attribute.featureGate(\"aws-lambda\")),\n                ) {\n                    rustTemplate(\n                        \"\"\"\n                        ##[allow(unused_imports)] use crate::server::{request::lambda::Context, routing::LambdaHandler};\n                        \"\"\",\n                    )\n                }\n            }\n        }\n    }\n\n    @Test\n    fun `ensure event stream types are re-exported`() {\n        serverIntegrationTest(eventStreamModel, IntegrationTestParams(service = \"amazon#EventStreamService\")) { _, rustCrate ->\n            rustCrate.testModule {\n                unitTest(\"event_stream_sender_reexport\") {\n                    rustTemplate(\n                        \"\"\"\n                        ##[allow(unused_imports)] use crate::types::EventStreamSender;\n                        \"\"\",\n                    )\n                }\n            }\n        }\n    }\n\n    @Test\n    fun `ensure event stream types are not re-exported without event streams`() {\n        val generatedServers =\n            serverIntegrationTest(sampleModel, IntegrationTestParams(service = \"amazon#SampleService\"))\n        generatedServers.forEach { generatedServer ->\n            val typesModule = generatedServer.path.resolve(\"src/types.rs\").readText()\n            assert(!typesModule.contains(\"EventStreamSender\")) {\n                \"EventStreamSender should not be re-exported for a service without event streams\"\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/UnconstrainedShapeSymbolProviderTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy\n\nimport io.kotest.matchers.shouldBe\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.model.shapes.ListShape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustType\nimport software.amazon.smithy.rust.codegen.core.rustlang.render\nimport software.amazon.smithy.rust.codegen.core.smithy.rustType\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.util.lookup\nimport software.amazon.smithy.rust.codegen.server.smithy.testutil.serverTestSymbolProvider\nimport software.amazon.smithy.rust.codegen.server.smithy.testutil.serverTestSymbolProviders\n\n/**\n * While [UnconstrainedShapeSymbolProvider] _must_ be in the `codegen` subproject, these tests need to be in the\n * `codegen-server` subproject, because they use [serverTestSymbolProvider].\n */\nclass UnconstrainedShapeSymbolProviderTest {\n    private val baseModelString =\n        \"\"\"\n        namespace test\n\n        service TestService {\n            version: \"123\",\n            operations: [TestOperation]\n        }\n\n        operation TestOperation {\n            input: TestInputOutput,\n            output: TestInputOutput,\n        }\n\n        structure TestInputOutput {\n            list: ListA\n        }\n        \"\"\"\n\n    @Test\n    fun `it should adjust types for unconstrained shapes`() {\n        val model =\n            \"\"\"\n            $baseModelString\n\n            list ListA {\n                member: ListB\n            }\n\n            list ListB {\n                member: StructureC\n            }\n\n            structure StructureC {\n                @required\n                string: String\n            }\n            \"\"\".asSmithyModel()\n\n        val unconstrainedShapeSymbolProvider = serverTestSymbolProviders(model).unconstrainedShapeSymbolProvider\n\n        val listAShape = model.lookup<ListShape>(\"test#ListA\")\n        val listAType = unconstrainedShapeSymbolProvider.toSymbol(listAShape).rustType()\n\n        val listBShape = model.lookup<ListShape>(\"test#ListB\")\n        val listBType = unconstrainedShapeSymbolProvider.toSymbol(listBShape).rustType()\n\n        val structureCShape = model.lookup<StructureShape>(\"test#StructureC\")\n        val structureCType = unconstrainedShapeSymbolProvider.toSymbol(structureCShape).rustType()\n\n        listAType shouldBe RustType.Opaque(\"ListAUnconstrained\", \"crate::unconstrained::list_a_unconstrained\")\n        listBType shouldBe RustType.Opaque(\"ListBUnconstrained\", \"crate::unconstrained::list_b_unconstrained\")\n        structureCType shouldBe RustType.Opaque(\"Builder\", \"crate::model::structure_c\")\n    }\n\n    @Test\n    fun `it should delegate to the base symbol provider if called with a shape that cannot reach a constrained shape`() {\n        val model =\n            \"\"\"\n            $baseModelString\n\n            list ListA {\n                member: StructureB\n            }\n\n            structure StructureB {\n                string: String\n            }\n            \"\"\".asSmithyModel()\n\n        val unconstrainedShapeSymbolProvider = serverTestSymbolProviders(model).unconstrainedShapeSymbolProvider\n\n        val listAShape = model.lookup<ListShape>(\"test#ListA\")\n        val structureBShape = model.lookup<StructureShape>(\"test#StructureB\")\n\n        unconstrainedShapeSymbolProvider.toSymbol(structureBShape).rustType().render() shouldBe \"crate::model::StructureB\"\n        unconstrainedShapeSymbolProvider.toSymbol(listAShape).rustType().render() shouldBe \"::std::vec::Vec::<crate::model::StructureB>\"\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/UnionWithUnitTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy\n\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.server.smithy.testutil.HttpTestType\nimport software.amazon.smithy.rust.codegen.server.smithy.testutil.serverIntegrationTest\n\nclass UnionWithUnitTest {\n    @Test\n    fun `a constrained union that has a unit member should compile`() {\n        val model =\n            \"\"\"\n            ${'$'}version: \"2\"\n            namespace com.example\n            use aws.protocols#restJson1\n            use smithy.framework#ValidationException\n            \n            @restJson1 @title(\"Test Service\") \n            service TestService { \n                version: \"0.1\", \n                operations: [ \n                    TestOperation\n                    TestSimpleUnionWithUnit\n                ] \n            }\n            \n            @http(uri: \"/testunit\", method: \"POST\")\n            operation TestSimpleUnionWithUnit {\n                input := {\n                    @required\n                    request: SomeUnionWithUnit\n                }\n                output := {\n                    result : SomeUnionWithUnit\n                }\n                errors: [\n                    ValidationException\n                ]\n            }\n            \n            @length(min: 13)\n            string StringRestricted\n            \n            union SomeUnionWithUnit {\n                Option1: Unit\n                Option2: StringRestricted\n            }\n\n            @http(uri: \"/test\", method: \"POST\")\n            operation TestOperation {\n                input := { payload: String }\n                output := {\n                    @httpPayload\n                    events: TestEvent\n                },\n                errors: [ValidationException]\n            }\n            \n            @streaming\n            union TestEvent {\n                KeepAlive: Unit,\n                Response: TestResponseEvent,\n            }\n            \n            structure TestResponseEvent { \n                data: String \n            }            \n            \"\"\".asSmithyModel()\n\n        // Ensure the generated SDK compiles.\n        serverIntegrationTest(model, testCoverage = HttpTestType.Default) { _, _ -> }\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/ValidateUnsupportedConstraintsAreNotUsedTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy\n\nimport io.kotest.inspectors.forOne\nimport io.kotest.inspectors.shouldForAll\nimport io.kotest.matchers.collections.shouldHaveAtLeastSize\nimport io.kotest.matchers.collections.shouldHaveSize\nimport io.kotest.matchers.shouldBe\nimport io.kotest.matchers.string.shouldContain\nimport io.kotest.matchers.string.shouldNotContain\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.ServiceShape\nimport software.amazon.smithy.rust.codegen.core.smithy.transformers.EventStreamNormalizer\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.util.lookup\nimport software.amazon.smithy.rust.codegen.server.smithy.customizations.SmithyValidationExceptionConversionGenerator\nimport java.io.File\nimport java.util.logging.Level\n\ninternal class ValidateUnsupportedConstraintsAreNotUsedTest {\n    private val baseModel =\n        \"\"\"\n        namespace test\n\n        service TestService {\n            operations: [TestOperation]\n        }\n\n        operation TestOperation {\n            input: TestInputOutput,\n            output: TestInputOutput,\n        }\n        \"\"\"\n\n    private fun validateModel(\n        model: Model,\n        serverCodegenConfig: ServerCodegenConfig = ServerCodegenConfig(),\n    ): ValidationResult {\n        val service = model.serviceShapes.first()\n        return validateUnsupportedConstraints(model, service, serverCodegenConfig)\n    }\n\n    @Test\n    fun `it should detect when an operation with constrained input but that does not have ValidationException attached in errors`() {\n        val model =\n            \"\"\"\n            $baseModel\n\n            structure TestInputOutput {\n                @required\n                requiredString: String\n            }\n            \"\"\".asSmithyModel()\n        val service = model.lookup<ServiceShape>(\"test#TestService\")\n        val validationResult =\n            validateOperationsWithConstrainedInputHaveValidationExceptionAttached(\n                model,\n                service,\n                SmithyValidationExceptionConversionGenerator.SHAPE_ID,\n            )\n\n        validationResult.messages shouldHaveSize 1\n\n        // Asserts the exact message, to ensure the formatting is appropriate.\n        validationResult.messages[0].message shouldBe\n            \"\"\"\n            Operation test#TestOperation takes in input that is constrained (https://awslabs.github.io/smithy/2.0/spec/constraint-traits.html), and as such can fail with a validation exception. You must model this behavior in the operation shape in your model file using the default validation exception shown below, or by defining a custom validation exception. For documentation, see https://smithy-lang.github.io/smithy-rs/design/server/validation_exceptions.html\n            ```smithy\n            use smithy.framework#ValidationException\n\n            operation TestOperation {\n                ...\n                errors: [..., ValidationException] // <-- Add this.\n            }\n            ```\n            \"\"\".trimIndent()\n    }\n\n    @Test\n    fun `it should work when an operation with constrained input has a custom validation exception attached in errors`() {\n        val version = \"\\$version: \\\"2\\\"\"\n        val model =\n            \"\"\"\n            $version\n            namespace test\n\n            use smithy.framework.rust#validationException\n            use smithy.framework.rust#validationMessage\n\n            service TestService {\n                operations: [TestOperation]\n            }\n\n            operation TestOperation {\n                input: TestInputOutput,\n                output: TestInputOutput,\n                errors: [\n                    CustomValidationException\n                ]\n            }\n\n            structure TestInputOutput {\n                @required\n                requiredString: String\n            }\n\n            @validationException\n            @error(\"client\")\n            structure CustomValidationException {\n                @validationMessage\n                @default(\"Validation Failed\")\n                @required\n                message: String,\n\n                errorCode: String,\n            }\n            \"\"\".asSmithyModel()\n        val service = model.lookup<ServiceShape>(\"test#TestService\")\n        val validationResult =\n            validateOperationsWithConstrainedInputHaveValidationExceptionAttached(\n                model,\n                service,\n                SmithyValidationExceptionConversionGenerator.SHAPE_ID,\n            )\n\n        validationResult.messages shouldHaveSize 0\n    }\n\n    @Test\n    fun `should detect when event streams are used, even without constraints, as the event member is required`() {\n        val model =\n            \"\"\"\n            $baseModel\n            structure TestInputOutput {\n                eventStream: EventStream\n            }\n            @streaming\n            union EventStream {\n                message: Message,\n                error: Error\n            }\n            structure Message {\n                lengthString: String\n            }\n            structure Error {\n                message: String\n            }\n            \"\"\".asSmithyModel()\n        val service = model.lookup<ServiceShape>(\"test#TestService\")\n        val validationResult =\n            validateOperationsWithConstrainedInputHaveValidationExceptionAttached(\n                model,\n                service,\n                SmithyValidationExceptionConversionGenerator.SHAPE_ID,\n            )\n\n        validationResult.messages shouldHaveSize 1\n\n        // Asserts the exact message, to ensure the formatting is appropriate.\n        validationResult.messages[0].message shouldBe\n            \"\"\"\n            Operation test#TestOperation takes in input that is constrained (https://awslabs.github.io/smithy/2.0/spec/constraint-traits.html), and as such can fail with a validation exception. You must model this behavior in the operation shape in your model file using the default validation exception shown below, or by defining a custom validation exception. For documentation, see https://smithy-lang.github.io/smithy-rs/design/server/validation_exceptions.html\n            ```smithy\n            use smithy.framework#ValidationException\n\n            operation TestOperation {\n                ...\n                errors: [..., ValidationException] // <-- Add this.\n            }\n            ```\n            \"\"\".trimIndent()\n    }\n\n    private val constraintTraitOnStreamingBlobShapeModel =\n        \"\"\"\n        $baseModel\n\n        structure TestInputOutput {\n            @required\n            streamingBlob: StreamingBlob\n        }\n\n        @streaming\n        @length(min: 69)\n        blob StreamingBlob\n        \"\"\".asSmithyModel()\n\n    @Test\n    fun `it should detect when constraint traits on streaming blob shapes are used`() {\n        val validationResult = validateModel(constraintTraitOnStreamingBlobShapeModel)\n\n        validationResult.messages shouldHaveSize 1\n        validationResult.messages[0].message shouldContain\n            \"\"\"\n            The blob shape `test#StreamingBlob` has both the `smithy.api#length` and `smithy.api#streaming` constraint traits attached.\n            It is unclear what the semantics for streaming blob shapes are.\n            \"\"\".trimIndent().replace(\"\\n\", \" \")\n    }\n\n    private val constrainedShapesInEventStreamModel =\n        \"\"\"\n        $baseModel\n\n        structure TestInputOutput {\n            eventStream: EventStream\n        }\n\n        @streaming\n        union EventStream {\n            message: Message,\n            error: Error\n        }\n\n        structure Message {\n            lengthString: LengthString\n        }\n\n        structure Error {\n            @required\n            message: String\n        }\n\n        @length(min: 1)\n        string LengthString\n        \"\"\".asSmithyModel()\n\n    @Test\n    fun `it should detect when constraint traits in event streams are used`() {\n        val validationResult = validateModel(EventStreamNormalizer.transform(constrainedShapesInEventStreamModel))\n\n        validationResult.messages shouldHaveSize 2\n        validationResult.messages.forOne {\n            it.message shouldContain\n                \"\"\"\n                The string shape `test#LengthString` has the constraint trait `smithy.api#length` attached.\n                This shape is also part of an event stream; it is unclear what the semantics for constrained shapes in event streams are.\n                Please remove the trait from the shape to synthesize your model.\n                \"\"\".trimIndent().replace(\"\\n\", \" \")\n            it.message shouldNotContain \"If you want to go ahead and generate the server SDK ignoring unsupported constraint traits\"\n        }\n        validationResult.messages.forOne {\n            it.message shouldContain\n                \"\"\"\n                The member shape `test#Error${\"$\"}message` has the constraint trait `smithy.api#required` attached.\n                This shape is also part of an event stream; it is unclear what the semantics for constrained shapes in event streams are.\n                Please remove the trait from the shape to synthesize your model.\n                \"\"\".trimIndent().replace(\"\\n\", \" \")\n            it.message shouldNotContain \"If you want to go ahead and generate the server SDK ignoring unsupported constraint traits\"\n        }\n    }\n\n    private val mapShapeReachableFromUniqueItemsListShapeModel =\n        \"\"\"\n        $baseModel\n\n        structure TestInputOutput {\n            uniqueItemsList: UniqueItemsList\n        }\n\n        @uniqueItems\n        list UniqueItemsList {\n            member: Map\n        }\n\n        map Map {\n            key: String\n            value: String\n        }\n        \"\"\".asSmithyModel()\n\n    @Test\n    fun `it should detect when a map shape is reachable from a uniqueItems list shape`() {\n        val validationResult = validateModel(mapShapeReachableFromUniqueItemsListShapeModel)\n\n        validationResult.messages shouldHaveSize 1\n        validationResult.shouldAbort shouldBe true\n        validationResult.messages[0].message shouldContain (\n            \"\"\"\n            The map shape `test#Map` is reachable from the list shape `test#UniqueItemsList`, which has the\n            `@uniqueItems` trait attached.\n            \"\"\".trimIndent().replace(\"\\n\", \" \")\n        )\n    }\n\n    @Test\n    fun `it should abort when a map shape is reachable from a uniqueItems list shape, despite opting into ignoreUnsupportedConstraintTraits`() {\n        val validationResult =\n            validateModel(\n                mapShapeReachableFromUniqueItemsListShapeModel,\n                ServerCodegenConfig().copy(ignoreUnsupportedConstraints = true),\n            )\n\n        validationResult.shouldAbort shouldBe true\n    }\n\n    @Test\n    fun `it should abort when constraint traits in event streams are used, despite opting into ignoreUnsupportedConstraintTraits`() {\n        val validationResult =\n            validateModel(\n                EventStreamNormalizer.transform(constrainedShapesInEventStreamModel),\n                ServerCodegenConfig().copy(ignoreUnsupportedConstraints = true),\n            )\n\n        validationResult.shouldAbort shouldBe true\n    }\n\n    @Test\n    fun `it should abort when ignoreUnsupportedConstraints is false and unsupported constraints are used`() {\n        val validationResult = validateModel(constraintTraitOnStreamingBlobShapeModel, ServerCodegenConfig())\n\n        validationResult.messages shouldHaveAtLeastSize 1\n        validationResult.shouldAbort shouldBe true\n    }\n\n    @Test\n    fun `it should not abort when ignoreUnsupportedConstraints is true and unsupported constraints are used`() {\n        val validationResult =\n            validateModel(\n                constraintTraitOnStreamingBlobShapeModel,\n                ServerCodegenConfig().copy(ignoreUnsupportedConstraints = true),\n            )\n\n        validationResult.messages shouldHaveAtLeastSize 1\n        validationResult.shouldAbort shouldBe false\n    }\n\n    @Test\n    fun `it should set log level to error when ignoreUnsupportedConstraints is false and unsupported constraints are used`() {\n        val validationResult = validateModel(constraintTraitOnStreamingBlobShapeModel, ServerCodegenConfig())\n\n        validationResult.messages shouldHaveAtLeastSize 1\n        validationResult.messages.shouldForAll { it.level shouldBe Level.SEVERE }\n    }\n\n    @Test\n    fun `it should set log level to warn when ignoreUnsupportedConstraints is true and unsupported constraints are used`() {\n        val validationResult =\n            validateModel(\n                constraintTraitOnStreamingBlobShapeModel,\n                ServerCodegenConfig().copy(ignoreUnsupportedConstraints = true),\n            )\n\n        validationResult.messages shouldHaveAtLeastSize 1\n        validationResult.messages.shouldForAll { it.level shouldBe Level.WARNING }\n    }\n\n    @Test\n    fun `it should abort when ignoreUnsupportedConstraints is true and all used constraints are supported`() {\n        val allConstraintTraitsAreSupported =\n            File(\"../codegen-core/common-test-models/constraints.smithy\")\n                .readText()\n                .asSmithyModel()\n\n        val validationResult =\n            validateModel(\n                allConstraintTraitsAreSupported,\n                ServerCodegenConfig().copy(ignoreUnsupportedConstraints = true),\n            )\n\n        validationResult.messages shouldHaveSize 1\n        validationResult.shouldAbort shouldBe true\n        validationResult.messages[0].message shouldContain (\n            \"\"\"\n            The `ignoreUnsupportedConstraints` flag in the `codegen` configuration is set to `true`, but it has no\n            effect. All the constraint traits used in the model are well-supported, please remove this flag.\n            \"\"\".trimIndent().replace(\"\\n\", \" \")\n        )\n    }\n\n    @Test\n    fun `it should detect multiple validation exceptions in model`() {\n        val model =\n            \"\"\"\n            namespace test\n\n            use smithy.framework.rust#validationException\n            use smithy.framework.rust#validationMessage\n\n            service TestService {\n                operations: [TestOperation]\n                errors: [\n                    CustomValidationException\n                    AnotherValidationException\n                ]\n            }\n\n            operation TestOperation {\n                input: TestInputOutput,\n                output: TestInputOutput,\n            }\n\n            @validationException\n            @error(\"client\")\n            structure CustomValidationException {\n                @validationMessage\n                message: String,\n            }\n\n            @validationException\n            @error(\"client\")\n            structure AnotherValidationException {\n                @validationMessage\n                message: String,\n            }\n\n            structure TestInputOutput {\n                @length(min: 1, max: 69)\n                lengthString: String,\n            }\n            \"\"\".asSmithyModel()\n        val service = model.serviceShapes.first()\n        val validationResult = validateModelHasAtMostOneValidationException(model, service)\n\n        validationResult.shouldAbort shouldBe true\n        validationResult.messages shouldHaveSize 1\n        validationResult.messages[0].level shouldBe Level.SEVERE\n    }\n\n    @Test\n    fun `it should allow single validation exception in model`() {\n        val model =\n            \"\"\"\n            namespace test\n\n            use smithy.framework.rust#validationException\n            use smithy.framework.rust#validationMessage\n\n            service TestService {\n                operations: [TestOperation]\n            }\n\n            operation TestOperation {\n                input: TestInputOutput,\n                output: TestInputOutput,\n            }\n\n            @validationException\n            @error(\"client\")\n            structure CustomValidationException {\n                @validationMessage\n                message: String,\n            }\n\n            structure TestInputOutput {\n                @length(min: 1, max: 69)\n                lengthString: String,\n            }\n            \"\"\".asSmithyModel()\n        val service = model.serviceShapes.first()\n        val validationResult = validateModelHasAtMostOneValidationException(model, service)\n\n        validationResult.shouldAbort shouldBe false\n        validationResult.messages shouldHaveSize 0\n    }\n\n    @Test\n    fun `it should detect default validation exception in operation when custom validation exception is defined`() {\n        val model =\n            \"\"\"\n            namespace test\n\n            use smithy.framework#ValidationException\n            use smithy.framework.rust#validationException\n            use smithy.framework.rust#validationMessage\n\n            service TestService {\n                operations: [TestOperation]\n            }\n\n            operation TestOperation {\n                input: TestInputOutput,\n                output: TestInputOutput,\n                errors: [\n                    ValidationException\n                    CustomValidationException\n                ]\n            }\n\n            @validationException\n            @error(\"client\")\n            structure CustomValidationException {\n                @validationMessage\n                message: String,\n            }\n\n            structure TestInputOutput {\n                @length(min: 1, max: 69)\n                lengthString: String,\n            }\n            \"\"\".asSmithyModel()\n        val service = model.serviceShapes.first()\n        val validationResult = validateModelHasAtMostOneValidationException(model, service)\n\n        validationResult.shouldAbort shouldBe true\n        validationResult.messages shouldHaveSize 1\n        validationResult.messages[0].level shouldBe Level.SEVERE\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/customizations/AddValidationExceptionToConstrainedOperationsTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.customizations\n\nimport io.kotest.matchers.booleans.shouldBeFalse\nimport io.kotest.matchers.booleans.shouldBeTrue\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.ServiceShape\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.rust.codegen.core.testutil.IntegrationTestParams\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.server.smithy.testutil.HttpTestType\nimport software.amazon.smithy.rust.codegen.server.smithy.testutil.serverIntegrationTest\n\n/**\n * Tests whether the server `codegen` flag `addValidationExceptionToConstrainedOperations` works as expected.\n */\ninternal class AddValidationExceptionToConstrainedOperationsTest {\n    private val validationExceptionShapeId = SmithyValidationExceptionConversionGenerator.SHAPE_ID\n\n    private val testModelWithValidationExceptionImported =\n        \"\"\"\n        namespace test\n\n        use smithy.framework#ValidationException\n        use aws.protocols#restJson1\n        use aws.api#data\n\n        @restJson1\n        service ConstrainedService {\n            operations: [SampleOperationWithValidation, SampleOperationWithoutValidation]\n        }\n\n        @http(uri: \"/anOperationWithValidation\", method: \"POST\")\n        operation SampleOperationWithValidation {\n            output: SampleInputOutput\n            input: SampleInputOutput\n            errors: [ValidationException, ErrorWithMemberConstraint]\n        }\n        @http(uri: \"/anOperationWithoutValidation\", method: \"POST\")\n        operation SampleOperationWithoutValidation {\n            output: SampleInputOutput\n            input: SampleInputOutput\n            errors: []\n        }\n        structure SampleInputOutput {\n            constrainedInteger : RangedInteger\n            @range(min: 2, max:100)\n            constrainedMemberInteger : RangedInteger\n            patternString : PatternString\n        }\n        @pattern(\"^[a-m]+${'$'}\")\n        string PatternString\n        @range(min: 0, max:1000)\n        integer RangedInteger\n\n        @error(\"server\")\n        structure ErrorWithMemberConstraint {\n            @range(min: 100, max: 999)\n            statusCode: Integer\n        }\n        \"\"\".asSmithyModel(smithyVersion = \"2\")\n\n    /**\n     * Verify the test model is set up correctly: `SampleOperationWithoutValidation` and\n     * the service should not have `smithy.framework#ValidationException` in the errors.\n     */\n    private fun verifyTestModelDoesNotHaveValidationException() {\n        val operation =\n            testModelWithValidationExceptionImported.expectShape(\n                ShapeId.from(\"test#SampleOperationWithoutValidation\"),\n                OperationShape::class.java,\n            )\n        operation.errors.contains(validationExceptionShapeId).shouldBeFalse()\n\n        val service =\n            testModelWithValidationExceptionImported.expectShape(\n                ShapeId.from(\"test#ConstrainedService\"),\n                ServiceShape::class.java,\n            )\n        service.errors.contains(validationExceptionShapeId).shouldBeFalse()\n    }\n\n    @Test\n    fun `operations that do not have ValidationException will automatically have one added to them`() {\n        verifyTestModelDoesNotHaveValidationException()\n\n        serverIntegrationTest(\n            testModelWithValidationExceptionImported,\n            testCoverage = HttpTestType.Default,\n        ) { codegenContext, _ ->\n            // Verify the transformed model now has `smithy.framework#ValidationException` on the operation.\n            val transformedOperation =\n                codegenContext.model.expectShape(\n                    ShapeId.from(\"test#SampleOperationWithoutValidation\"),\n                    OperationShape::class.java,\n                )\n            transformedOperation.errors.contains(validationExceptionShapeId).shouldBeTrue()\n        }\n    }\n\n    private val testModelWithCustomValidationException =\n        \"\"\"\n        namespace test\n\n        use smithy.framework.rust#validationException\n        use smithy.framework.rust#validationFieldList\n        use aws.protocols#restJson1\n\n        @restJson1\n        service ConstrainedService {\n            operations: [SampleOperation]\n            errors: [CustomValidationException]\n        }\n\n        @http(uri: \"/sample\", method: \"POST\")\n        operation SampleOperation {\n            input: SampleInput\n            output: SampleOutput\n        }\n\n        structure SampleInput {\n            @range(min: 0, max: 100)\n            constrainedInteger: Integer\n        }\n\n        structure SampleOutput {\n            result: String\n        }\n\n        @error(\"client\")\n        @validationException\n        structure CustomValidationException {\n            message: String\n\n            @validationFieldList\n            fieldList: ValidationFieldList\n        }\n\n        structure ValidationField {\n            name: String\n        }\n\n        list ValidationFieldList {\n            member: ValidationField\n        }\n        \"\"\".asSmithyModel(smithyVersion = \"2\")\n\n    @Test\n    fun `when custom validation exception exists, ValidationException is not automatically added`() {\n        // Verify the operation doesn't have ValidationException in the original model\n        val operation =\n            testModelWithCustomValidationException.expectShape(\n                ShapeId.from(\"test#SampleOperation\"),\n                OperationShape::class.java,\n            )\n        operation.errors.contains(validationExceptionShapeId).shouldBeFalse()\n\n        // The model has a custom validation exception, so the transformer should NOT add\n        // `smithy.framework#ValidationException`.\n        serverIntegrationTest(\n            testModelWithCustomValidationException,\n            IntegrationTestParams(),\n            testCoverage = HttpTestType.Default,\n        ) { codegenContext, _ ->\n            // Verify the transformed model still doesn't have `smithy.framework#ValidationException`\n            // on the operation.\n            val transformedOperation =\n                codegenContext.model.expectShape(\n                    ShapeId.from(\"test#SampleOperation\"),\n                    OperationShape::class.java,\n                )\n            transformedOperation.errors.contains(validationExceptionShapeId).shouldBeFalse()\n        }\n    }\n\n    /**\n     * Model with a constrained operation on a resource (not directly on the service), and without\n     * `smithy.framework#ValidationException` in the model.\n     */\n    private val testModelWithResourceOperationAndNoValidationException =\n        \"\"\"\n        namespace test\n\n        use aws.protocols#restJson1\n\n        @restJson1\n        service ConstrainedService {\n            resources: [MyResource]\n        }\n\n        resource MyResource {\n            operations: [ResourceOperation]\n        }\n\n        @http(uri: \"/resource\", method: \"POST\")\n        operation ResourceOperation {\n            input: ResourceInput\n            output: ResourceOutput\n        }\n\n        structure ResourceInput {\n            @range(min: 0, max: 100)\n            constrainedInteger: Integer\n        }\n\n        structure ResourceOutput {}\n        \"\"\".asSmithyModel(\n            smithyVersion = \"2\",\n            // Exclude smithy-validation-model from discovery so the shape is not in the model,\n            // simulating the removeUnusedShapes projection transform pruning it.\n            additionalDeniedModels = arrayOf(\"smithy-validation-model\"),\n        )\n\n    @Test\n    fun `resource operations get ValidationException even when the shape is not in the model`() {\n        // Verify the shape is missing and the operation has no ValidationException.\n        testModelWithResourceOperationAndNoValidationException\n            .getShape(validationExceptionShapeId).isPresent.shouldBeFalse()\n        testModelWithResourceOperationAndNoValidationException\n            .expectShape(ShapeId.from(\"test#ResourceOperation\"), OperationShape::class.java)\n            .errors.contains(validationExceptionShapeId).shouldBeFalse()\n\n        serverIntegrationTest(\n            testModelWithResourceOperationAndNoValidationException,\n            testCoverage = HttpTestType.Default,\n        ) { codegenContext, _ ->\n            // The shape should have been added and attached to the resource operation.\n            codegenContext.model.getShape(validationExceptionShapeId).isPresent.shouldBeTrue()\n            codegenContext.model\n                .expectShape(ShapeId.from(\"test#ResourceOperation\"), OperationShape::class.java)\n                .errors.contains(validationExceptionShapeId).shouldBeTrue()\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/customizations/AdditionalErrorsDecoratorTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.customizations\n\nimport io.kotest.matchers.shouldBe\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.ServiceShape\nimport software.amazon.smithy.rust.codegen.core.smithy.transformers.OperationNormalizer\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.util.lookup\nimport software.amazon.smithy.rust.codegen.server.smithy.testutil.serverTestRustSettings\n\nclass AdditionalErrorsDecoratorTest {\n    private val baseModel =\n        \"\"\"\n        namespace test\n\n        operation Infallible {\n            input: InputOutput,\n            output: InputOutput\n        }\n\n        operation Fallible {\n            input: InputOutput,\n            output: InputOutput,\n            errors: [AnError]\n        }\n\n        structure InputOutput { }\n\n        @error(\"client\")\n        structure AnError { }\n        \"\"\".asSmithyModel()\n    private val model = OperationNormalizer.transform(baseModel)\n    private val service = ServiceShape.builder().id(\"smithy.test#Test\").build()\n    private val settings = serverTestRustSettings()\n\n    @Test\n    fun `add InternalServerError to infallible operations only`() {\n        model.lookup<OperationShape>(\"test#Infallible\").errors.isEmpty() shouldBe true\n        model.lookup<OperationShape>(\"test#Fallible\").errors.size shouldBe 1\n        val transformedModel = AddInternalServerErrorToInfallibleOperationsDecorator().transformModel(service, model, settings)\n        transformedModel.lookup<OperationShape>(\"test#Infallible\").errors.size shouldBe 1\n        transformedModel.lookup<OperationShape>(\"test#Fallible\").errors.size shouldBe 1\n    }\n\n    @Test\n    fun `add InternalServerError to all model operations`() {\n        model.lookup<OperationShape>(\"test#Infallible\").errors.isEmpty() shouldBe true\n        model.lookup<OperationShape>(\"test#Fallible\").errors.size shouldBe 1\n        val transformedModel = AddInternalServerErrorToAllOperationsDecorator().transformModel(service, model, settings)\n        transformedModel.lookup<OperationShape>(\"test#Infallible\").errors.size shouldBe 1\n        transformedModel.lookup<OperationShape>(\"test#Fallible\").errors.size shouldBe 2\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/customizations/CustomValidationExceptionWithReasonDecoratorTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.customizations\n\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.node.Node\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.model.transform.ModelTransformer\nimport software.amazon.smithy.rust.codegen.core.testutil.IntegrationTestParams\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.server.smithy.testutil.HttpTestType\nimport software.amazon.smithy.rust.codegen.server.smithy.testutil.serverIntegrationTest\nimport java.io.File\nimport kotlin.streams.toList\n\nfun swapOutSmithyValidationExceptionForCustomOne(model: Model): Model {\n    val customValidationExceptionModel =\n        \"\"\"\n        namespace com.amazonaws.constraints\n\n        enum ValidationExceptionFieldReason {\n            LENGTH_NOT_VALID = \"LengthNotValid\"\n            PATTERN_NOT_VALID = \"PatternNotValid\"\n            SYNTAX_NOT_VALID = \"SyntaxNotValid\"\n            VALUE_NOT_VALID = \"ValueNotValid\"\n            OTHER = \"Other\"\n        }\n\n        /// Stores information about a field passed inside a request that resulted in an exception.\n        structure ValidationExceptionField {\n            /// The field name.\n            @required\n            Name: String\n\n            @required\n            Reason: ValidationExceptionFieldReason\n\n            /// Message describing why the field failed validation.\n            @required\n            Message: String\n        }\n\n        /// A list of fields.\n        list ValidationExceptionFieldList {\n            member: ValidationExceptionField\n        }\n\n        enum ValidationExceptionReason {\n            FIELD_VALIDATION_FAILED = \"FieldValidationFailed\"\n            UNKNOWN_OPERATION = \"UnknownOperation\"\n            CANNOT_PARSE = \"CannotParse\"\n            OTHER = \"Other\"\n        }\n\n        /// The input fails to satisfy the constraints specified by an AWS service.\n        @error(\"client\")\n        @httpError(400)\n        structure ValidationException {\n            /// Description of the error.\n            @required\n            Message: String\n\n            /// Reason the request failed validation.\n            @required\n            Reason: ValidationExceptionReason\n\n            /// The field that caused the error, if applicable. If more than one field\n            /// caused the error, pick one and elaborate in the message.\n            Fields: ValidationExceptionFieldList\n        }\n        \"\"\".asSmithyModel(smithyVersion = \"2.0\")\n\n    // Remove Smithy's `ValidationException`.\n    var model =\n        ModelTransformer.create().removeShapes(\n            model,\n            listOf(model.expectShape(SmithyValidationExceptionConversionGenerator.SHAPE_ID)),\n        )\n    // Add our custom one.\n    model = ModelTransformer.create().replaceShapes(model, customValidationExceptionModel.shapes().toList<Shape>())\n    // Make all operations use our custom one.\n    val newOperationShapes =\n        model.operationShapes.map { operationShape ->\n            operationShape.toBuilder().addError(ShapeId.from(\"com.amazonaws.constraints#ValidationException\")).build()\n        }\n    return ModelTransformer.create().replaceShapes(model, newOperationShapes)\n}\n\ninternal class CustomValidationExceptionWithReasonDecoratorTest {\n    @Test\n    fun `constraints model with the CustomValidationExceptionWithReasonDecorator applied compiles`() {\n        var model = File(\"../codegen-core/common-test-models/constraints.smithy\").readText().asSmithyModel()\n        model = swapOutSmithyValidationExceptionForCustomOne(model)\n\n        serverIntegrationTest(\n            model,\n            IntegrationTestParams(\n                additionalSettings =\n                    Node.objectNodeBuilder().withMember(\n                        \"codegen\",\n                        Node.objectNodeBuilder()\n                            .withMember(\"experimentalCustomValidationExceptionWithReasonPleaseDoNotUse\", \"com.amazonaws.constraints#ValidationException\")\n                            .build(),\n                    ).build(),\n            ),\n            testCoverage = HttpTestType.Default,\n        )\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/customizations/PostprocessValidationExceptionNotAttachedErrorMessageDecoratorTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.customizations\n\nimport io.kotest.matchers.shouldBe\nimport io.kotest.matchers.string.shouldContain\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.assertThrows\nimport software.amazon.smithy.codegen.core.CodegenException\nimport software.amazon.smithy.model.node.Node\nimport software.amazon.smithy.rust.codegen.core.testutil.IntegrationTestParams\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.server.smithy.LogMessage\nimport software.amazon.smithy.rust.codegen.server.smithy.ValidationResult\nimport software.amazon.smithy.rust.codegen.server.smithy.customize.ServerCodegenDecorator\nimport software.amazon.smithy.rust.codegen.server.smithy.testutil.HttpTestType\nimport software.amazon.smithy.rust.codegen.server.smithy.testutil.serverIntegrationTest\n\ninternal class PostprocessValidationExceptionNotAttachedErrorMessageDecoratorTest {\n    @Test\n    fun `validation exception not attached error message is postprocessed if decorator is registered`() {\n        val model =\n            \"\"\"\n            namespace test\n            use aws.protocols#restJson1\n\n            @restJson1\n            service TestService {\n                operations: [\"ConstrainedOperation\"],\n            }\n\n            operation ConstrainedOperation {\n                input: ConstrainedOperationInput\n            }\n\n            structure ConstrainedOperationInput {\n                @required\n                requiredString: String\n            }\n            \"\"\".asSmithyModel()\n\n        val validationExceptionNotAttachedErrorMessageDummyPostprocessorDecorator =\n            object : ServerCodegenDecorator {\n                override val name: String\n                    get() = \"ValidationExceptionNotAttachedErrorMessageDummyPostprocessorDecorator\"\n                override val order: Byte\n                    get() = 69\n\n                override fun postprocessValidationExceptionNotAttachedErrorMessage(\n                    validationResult: ValidationResult,\n                ): ValidationResult {\n                    check(validationResult.messages.size == 1)\n\n                    val level = validationResult.messages.first().level\n                    val message =\n                        \"\"\"\n                        ${validationResult.messages.first().message}\n\n                        There are three things all wise men fear: the sea in storm, a night with no moon, and the anger of a gentle man.\n                        \"\"\"\n\n                    return validationResult.copy(messages = listOf(LogMessage(level, message)))\n                }\n            }\n\n        val exception =\n            assertThrows<CodegenException> {\n                serverIntegrationTest(\n                    model,\n                    params =\n                        IntegrationTestParams(\n                            additionalSettings =\n                                Node.objectNodeBuilder().withMember(\n                                    \"codegen\",\n                                    Node.objectNodeBuilder()\n                                        .withMember(\"addValidationExceptionToConstrainedOperations\", false)\n                                        .build(),\n                                ).build(),\n                        ),\n                    additionalDecorators = listOf(validationExceptionNotAttachedErrorMessageDummyPostprocessorDecorator),\n                    testCoverage = HttpTestType.Default,\n                )\n            }\n        val exceptionCause = (exception.cause!! as ValidationResult)\n        exceptionCause.messages.size shouldBe 1\n        exceptionCause.messages.first().message shouldContain \"There are three things all wise men fear: the sea in storm, a night with no moon, and the anger of a gentle man.\"\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/customizations/SigV4EventStreamSupportStructuresTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.customizations\n\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.testutil.TestRuntimeConfig\nimport software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace\nimport software.amazon.smithy.rust.codegen.core.testutil.compileAndTest\nimport software.amazon.smithy.rust.codegen.core.testutil.unitTest\n\nclass SigV4EventStreamSupportStructuresTest {\n    private val runtimeConfig = TestRuntimeConfig\n\n    @Test\n    fun `support structures compile`() {\n        val project = TestWorkspace.testProject()\n        project.lib {\n            val codegenScope = SigV4EventStreamSupportStructures.codegenScope(runtimeConfig)\n\n            // Generate the support structures - RuntimeType.forInlineFun automatically generates the code\n            // when the RuntimeType is used, so we just need to reference them\n            rustTemplate(\n                \"\"\"\n                use std::time::SystemTime;\n\n                // Reference the types to trigger their generation\n                fn _test_types() {\n                    let _info: #{SignatureInfo};\n                    let _error: #{ExtractionError};\n                    let _signed_error: #{SignedEventError}<String>;\n                    let _signed_event: #{SignedEvent}<String>;\n                    let _unmarshaller: #{SigV4Unmarshaller}<String>;\n                }\n                \"\"\",\n                *codegenScope,\n            )\n\n            unitTest(\"test_signature_info_creation\") {\n                rustTemplate(\n                    \"\"\"\n                    let info = #{SignatureInfo} {\n                        chunk_signature: vec![1, 2, 3],\n                        timestamp: SystemTime::now(),\n                    };\n                    assert_eq!(info.chunk_signature, vec![1, 2, 3]);\n                    \"\"\",\n                    *codegenScope,\n                )\n            }\n\n            unitTest(\"test_signed_event_creation\") {\n                rustTemplate(\n                    \"\"\"\n                    let event = #{SignedEvent} {\n                        message: \"test\".to_string(),\n                        signature: None,\n                    };\n                    assert_eq!(event.message, \"test\");\n                    assert!(event.signature.is_none());\n                    \"\"\",\n                    *codegenScope,\n                )\n            }\n        }\n\n        project.compileAndTest()\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/customizations/UserProvidedValidationExceptionDecoratorTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.customizations\n\nimport io.kotest.matchers.shouldBe\nimport io.kotest.matchers.shouldNotBe\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.framework.rust.ValidationExceptionTrait\nimport software.amazon.smithy.framework.rust.ValidationFieldListTrait\nimport software.amazon.smithy.framework.rust.ValidationFieldNameTrait\nimport software.amazon.smithy.framework.rust.ValidationMessageTrait\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.server.smithy.testutil.HttpTestType\nimport software.amazon.smithy.rust.codegen.server.smithy.testutil.serverIntegrationTest\nimport software.amazon.smithy.rust.codegen.server.smithy.testutil.serverTestCodegenContext\n\ninternal class UserProvidedValidationExceptionDecoratorTest {\n    private val modelWithCustomValidation =\n        \"\"\"\n        namespace com.example\n\n        use aws.protocols#restJson1\n        use smithy.framework.rust#validationException\n        use smithy.framework.rust#validationMessage\n        use smithy.framework.rust#validationFieldList\n        use smithy.framework.rust#validationFieldName\n\n        @restJson1\n        service TestService {\n            version: \"1.0.0\"\n        }\n\n        @validationException\n        @error(\"client\")\n        structure MyValidationException {\n            @validationMessage\n            customMessage: String\n\n            @validationFieldList\n            customFieldList: ValidationExceptionFieldList\n        }\n\n        structure ValidationExceptionField {\n            @validationFieldName\n            path: String\n            message: String\n        }\n\n        list ValidationExceptionFieldList {\n            member: ValidationExceptionField\n        }\n        \"\"\".asSmithyModel(smithyVersion = \"2.0\")\n\n    private val modelWithoutFieldList =\n        \"\"\"\n        namespace com.example\n\n        use aws.protocols#restJson1\n        use smithy.framework.rust#validationException\n        use smithy.framework.rust#validationMessage\n\n        @restJson1\n        service TestService {\n            version: \"1.0.0\"\n        }\n\n        @validationException\n        @error(\"client\")\n        structure MyValidationException {\n            @validationMessage\n            message: String\n        }\n        \"\"\".asSmithyModel(smithyVersion = \"2.0\")\n\n    private fun mockValidationException(model: Model): StructureShape {\n        val codegenContext = serverTestCodegenContext(model)\n        val decorator = UserProvidedValidationExceptionDecorator()\n        return decorator.firstStructureShapeWithValidationExceptionTrait(codegenContext.model)!!\n    }\n\n    @Test\n    fun `firstStructureShapeWithValidationExceptionTrait returns correct shape`() {\n        val result = mockValidationException(modelWithCustomValidation)\n\n        result shouldNotBe null\n        result.id shouldBe ShapeId.from(\"com.example#MyValidationException\")\n        result.hasTrait(ValidationExceptionTrait.ID) shouldBe true\n    }\n\n    @Test\n    fun `firstStructureShapeWithValidationExceptionTrait returns null when no validation exception exists`() {\n        val model =\n            \"\"\"\n            namespace com.example\n\n            use aws.protocols#restJson1\n\n            @restJson1\n            service TestService {\n                version: \"1.0.0\"\n            }\n\n            structure RegularException { message: String }\n            \"\"\".asSmithyModel(smithyVersion = \"2.0\")\n\n        val codegenContext = serverTestCodegenContext(model)\n        val decorator = UserProvidedValidationExceptionDecorator()\n\n        val result = decorator.firstStructureShapeWithValidationExceptionTrait(codegenContext.model)\n\n        result shouldBe null\n    }\n\n    @Test\n    fun `validationMessageMember returns correct member shape`() {\n        val model = modelWithCustomValidation\n        val validationExceptionStructure = mockValidationException(model)\n\n        val result = UserProvidedValidationExceptionDecorator().validationMessageMember(validationExceptionStructure)\n\n        result shouldNotBe null\n        result.memberName shouldBe \"customMessage\"\n        result.hasTrait(ValidationMessageTrait.ID) shouldBe true\n    }\n\n    @Test\n    fun `validationFieldListMember returns correct member shape`() {\n        val model = modelWithCustomValidation\n        val validationExceptionStructure = mockValidationException(model)\n        val result =\n            UserProvidedValidationExceptionDecorator().maybeValidationFieldList(\n                model,\n                validationExceptionStructure,\n            )!!.validationFieldListMember\n\n        result shouldNotBe null\n        result.memberName shouldBe \"customFieldList\"\n        result.hasTrait(ValidationFieldListTrait.ID) shouldBe true\n    }\n\n    @Test\n    fun `maybeValidationFieldList returns null when no field list exists`() {\n        val model = modelWithoutFieldList\n        val validationExceptionStructure = mockValidationException(model)\n\n        val result =\n            UserProvidedValidationExceptionDecorator().maybeValidationFieldList(\n                model,\n                validationExceptionStructure,\n            )\n\n        result shouldBe null\n    }\n\n    @Test\n    fun `validationFieldStructure returns correct structure shape`() {\n        val model = modelWithCustomValidation\n        val validationExceptionStructure = mockValidationException(model)\n\n        val result =\n            UserProvidedValidationExceptionDecorator().maybeValidationFieldList(\n                model,\n                validationExceptionStructure,\n            )!!.validationFieldStructure\n\n        result shouldNotBe null\n        result.id shouldBe ShapeId.from(\"com.example#ValidationExceptionField\")\n        result.members().any { it.hasTrait(ValidationFieldNameTrait.ID) } shouldBe true\n    }\n\n    @Test\n    fun `decorator returns null when no custom validation exception exists`() {\n        val model =\n            \"\"\"\n            namespace com.example\n\n            use aws.protocols#restJson1\n\n            @restJson1\n            service TestService {\n                version: \"1.0.0\"\n            }\n\n            structure RegularException { message: String }\n            \"\"\".asSmithyModel(smithyVersion = \"2.0\")\n\n        val codegenContext = serverTestCodegenContext(model)\n        val decorator = UserProvidedValidationExceptionDecorator()\n\n        val generator = decorator.validationExceptionConversion(codegenContext)\n\n        generator shouldBe null\n    }\n\n    private val completeTestModel =\n        \"\"\"\n        namespace com.aws.example\n\n        use aws.protocols#restJson1\n        use smithy.framework.rust#validationException\n        use smithy.framework.rust#validationFieldList\n        use smithy.framework.rust#validationFieldMessage\n        use smithy.framework.rust#validationFieldName\n        use smithy.framework.rust#validationMessage\n\n        @restJson1\n        service CustomValidationExample {\n            version: \"1.0.0\"\n            operations: [\n                TestOperation\n                StreamingOperation\n                PublishMessages\n            ]\n            errors: [\n                MyCustomValidationException\n            ]\n        }\n\n        @http(method: \"POST\", uri: \"/test\")\n        operation TestOperation {\n            input: TestInput\n        }\n\n        @http(method: \"GET\", uri: \"/streaming-operation\")\n        @readonly\n        operation StreamingOperation {\n            input := {}\n            output := {\n                @httpPayload\n                output: StreamingBlob = \"\"\n            }\n        }\n\n        @streaming\n        blob StreamingBlob\n\n        @http(method: \"POST\", uri: \"/publish\")\n        operation PublishMessages {\n            input: PublishMessagesInput\n        }\n\n        @input\n        structure PublishMessagesInput {\n            @httpPayload\n            messages: PublishEvents\n        }\n\n        @streaming\n        union PublishEvents {\n            message: Message\n            leave: LeaveEvent\n        }\n\n        structure Message {\n            message: String\n        }\n\n        structure LeaveEvent {}\n\n        structure TestInput {\n            @required\n            @length(min: 1, max: 10)\n            name: String\n\n            @range(min: 1, max: 100)\n            age: Integer\n        }\n\n        @error(\"client\")\n        @httpError(400)\n        @validationException\n        structure MyCustomValidationException {\n            @required\n            @validationMessage\n            customMessage: String\n\n            @required\n            @default(\"testReason1\")\n            reason: ValidationExceptionReason\n\n            @validationFieldList\n            customFieldList: CustomValidationFieldList\n        }\n\n        enum ValidationExceptionReason {\n            TEST_REASON_0 = \"testReason0\"\n            TEST_REASON_1 = \"testReason1\"\n        }\n\n        structure CustomValidationField {\n            @required\n            @validationFieldName\n            customFieldName: String\n\n            @required\n            @validationFieldMessage\n            customFieldMessage: String\n        }\n\n        list CustomValidationFieldList {\n            member: CustomValidationField\n        }\n        \"\"\".asSmithyModel(smithyVersion = \"2.0\")\n\n    @Test\n    fun `code compiles with custom validation exception`() {\n        serverIntegrationTest(completeTestModel, testCoverage = HttpTestType.Default)\n    }\n\n    private val completeTestModelWithOptionals =\n        \"\"\"\n        namespace com.aws.example\n\n        use aws.protocols#restJson1\n        use smithy.framework.rust#validationException\n        use smithy.framework.rust#validationFieldList\n        use smithy.framework.rust#validationFieldMessage\n        use smithy.framework.rust#validationFieldName\n        use smithy.framework.rust#validationMessage\n\n        @restJson1\n        service CustomValidationExample {\n            version: \"1.0.0\"\n            operations: [\n                TestOperation\n            ]\n            errors: [\n                MyCustomValidationException\n            ]\n        }\n\n        @http(method: \"POST\", uri: \"/test\")\n        operation TestOperation {\n            input: TestInput\n        }\n\n        structure TestInput {\n            @required\n            @length(min: 1, max: 10)\n            name: String\n\n            @range(min: 1, max: 100)\n            age: Integer\n        }\n\n        @error(\"client\")\n        @httpError(400)\n        @validationException\n        structure MyCustomValidationException {\n            @validationMessage\n            customMessage: String\n\n            @default(\"testReason1\")\n            reason: ValidationExceptionReason\n\n            @validationFieldList\n            customFieldList: CustomValidationFieldList\n        }\n\n        enum ValidationExceptionReason {\n            TEST_REASON_0 = \"testReason0\"\n            TEST_REASON_1 = \"testReason1\"\n        }\n\n        structure CustomValidationField {\n            @validationFieldName\n            customFieldName: String\n\n            @validationFieldMessage\n            customFieldMessage: String\n        }\n\n        list CustomValidationFieldList {\n            member: CustomValidationField\n        }\n        \"\"\".asSmithyModel(smithyVersion = \"2.0\")\n\n    @Test\n    fun `code compiles with custom validation exception using optionals`() {\n        serverIntegrationTest(completeTestModelWithOptionals, testCoverage = HttpTestType.Default)\n    }\n\n    private val completeTestModelWithImplicitNamesWithoutFieldMessage =\n        \"\"\"\n        namespace com.aws.example\n\n        use aws.protocols#restJson1\n        use smithy.framework.rust#validationException\n        use smithy.framework.rust#validationFieldList\n\n        @restJson1\n        service CustomValidationExample {\n            version: \"1.0.0\"\n            operations: [\n                TestOperation\n            ]\n            errors: [\n                MyCustomValidationException\n            ]\n        }\n\n        @http(method: \"POST\", uri: \"/test\")\n        operation TestOperation {\n            input: TestInput\n        }\n\n        structure TestInput {\n            @required\n            @length(min: 1, max: 10)\n            name: String\n\n            @range(min: 1, max: 100)\n            age: Integer\n        }\n\n        @error(\"client\")\n        @httpError(400)\n        @validationException\n        structure MyCustomValidationException {\n            message: String\n\n            @validationFieldList\n            customFieldList: CustomValidationFieldList\n        }\n\n        structure CustomValidationField {\n            name: String,\n        }\n\n        list CustomValidationFieldList {\n            member: CustomValidationField\n        }\n        \"\"\".asSmithyModel(smithyVersion = \"2.0\")\n\n    @Test\n    fun `code compiles with implicit message and field name and without field message`() {\n        serverIntegrationTest(completeTestModelWithImplicitNamesWithoutFieldMessage)\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ConstrainedBlobGeneratorTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.generators\n\nimport io.kotest.matchers.string.shouldContain\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.extension.ExtensionContext\nimport org.junit.jupiter.params.ParameterizedTest\nimport org.junit.jupiter.params.provider.Arguments\nimport org.junit.jupiter.params.provider.ArgumentsProvider\nimport org.junit.jupiter.params.provider.ArgumentsSource\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.BlobShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.compileAndTest\nimport software.amazon.smithy.rust.codegen.core.testutil.unitTest\nimport software.amazon.smithy.rust.codegen.core.util.dq\nimport software.amazon.smithy.rust.codegen.core.util.lookup\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerRustModule\nimport software.amazon.smithy.rust.codegen.server.smithy.createTestInlineModuleCreator\nimport software.amazon.smithy.rust.codegen.server.smithy.customizations.SmithyValidationExceptionConversionGenerator\nimport software.amazon.smithy.rust.codegen.server.smithy.testutil.serverTestCodegenContext\nimport java.util.stream.Stream\n\nclass ConstrainedBlobGeneratorTest {\n    data class TestCase(val model: Model, val validBlob: String, val invalidBlob: String)\n\n    class ConstrainedBlobGeneratorTestProvider : ArgumentsProvider {\n        private val testCases =\n            listOf(\n                // Min and max.\n                Triple(\"@length(min: 11, max: 12)\", \"validString\", \"invalidString\"),\n                // Min equal to max.\n                Triple(\"@length(min: 11, max: 11)\", \"validString\", \"invalidString\"),\n                // Only min.\n                Triple(\"@length(min: 11)\", \"validString\", \"\"),\n                // Only max.\n                Triple(\"@length(max: 11)\", \"\", \"invalidString\"),\n            ).map {\n                TestCase(\n                    \"\"\"\n                    namespace test\n\n                    ${it.first}\n                    blob ConstrainedBlob\n                    \"\"\".asSmithyModel(),\n                    \"aws_smithy_types::Blob::new(Vec::from(${it.second.dq()}))\",\n                    \"aws_smithy_types::Blob::new(Vec::from(${it.third.dq()}))\",\n                )\n            }\n\n        override fun provideArguments(context: ExtensionContext?): Stream<out Arguments> =\n            testCases.map { Arguments.of(it) }.stream()\n    }\n\n    @ParameterizedTest\n    @ArgumentsSource(ConstrainedBlobGeneratorTestProvider::class)\n    fun `it should generate constrained blob types`(testCase: TestCase) {\n        val constrainedBlobShape = testCase.model.lookup<BlobShape>(\"test#ConstrainedBlob\")\n\n        val codegenContext = serverTestCodegenContext(testCase.model)\n        val symbolProvider = codegenContext.symbolProvider\n\n        val project = TestWorkspace.testProject(symbolProvider)\n\n        project.withModule(ServerRustModule.Model) {\n            addDependency(RuntimeType.blob(codegenContext.runtimeConfig).toSymbol())\n\n            ConstrainedBlobGenerator(\n                codegenContext,\n                this.createTestInlineModuleCreator(),\n                this,\n                constrainedBlobShape,\n                SmithyValidationExceptionConversionGenerator(codegenContext),\n            ).render()\n\n            unitTest(\n                name = \"try_from_success\",\n                test = \"\"\"\n                    let blob = ${testCase.validBlob};\n                    let _constrained = ConstrainedBlob::try_from(blob).unwrap();\n                \"\"\",\n            )\n            unitTest(\n                name = \"try_from_fail\",\n                test = \"\"\"\n                    let blob = ${testCase.invalidBlob};\n                    ConstrainedBlob::try_from(blob).unwrap_err();\n                \"\"\",\n            )\n            unitTest(\n                name = \"inner\",\n                test = \"\"\"\n                    let blob = ${testCase.validBlob};\n                    let constrained = ConstrainedBlob::try_from(blob).unwrap();\n\n                    assert_eq!(*constrained.inner(), ${testCase.validBlob});\n                \"\"\",\n            )\n            unitTest(\n                name = \"into_inner\",\n                test = \"\"\"\n                    let blob = ${testCase.validBlob};\n                    let constrained = ConstrainedBlob::try_from(blob).unwrap();\n\n                    assert_eq!(constrained.into_inner(), ${testCase.validBlob});\n                \"\"\",\n            )\n        }\n\n        project.compileAndTest()\n    }\n\n    @Test\n    fun `type should not be constructable without using a constructor`() {\n        val model =\n            \"\"\"\n            namespace test\n\n            @length(min: 1, max: 70)\n            blob ConstrainedBlob\n            \"\"\".asSmithyModel()\n        val constrainedBlobShape = model.lookup<BlobShape>(\"test#ConstrainedBlob\")\n\n        val codegenContext = serverTestCodegenContext(model)\n\n        val writer = RustWriter.forModule(ServerRustModule.Model.name)\n\n        ConstrainedBlobGenerator(\n            codegenContext,\n            writer.createTestInlineModuleCreator(),\n            writer,\n            constrainedBlobShape,\n            SmithyValidationExceptionConversionGenerator(codegenContext),\n        ).render()\n\n        // Check that the wrapped type is `pub(crate)`.\n        writer.toString() shouldContain \"pub struct ConstrainedBlob(pub(crate) ::aws_smithy_types::Blob);\"\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ConstrainedCollectionGeneratorTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.generators\n\nimport io.kotest.matchers.string.shouldContain\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.extension.ExtensionContext\nimport org.junit.jupiter.params.ParameterizedTest\nimport org.junit.jupiter.params.provider.Arguments\nimport org.junit.jupiter.params.provider.ArgumentsProvider\nimport org.junit.jupiter.params.provider.ArgumentsSource\nimport software.amazon.smithy.codegen.core.Symbol\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.node.ArrayNode\nimport software.amazon.smithy.model.shapes.CollectionShape\nimport software.amazon.smithy.model.shapes.ListShape\nimport software.amazon.smithy.model.shapes.SetShape\nimport software.amazon.smithy.model.shapes.StringShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.withBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.compileAndTest\nimport software.amazon.smithy.rust.codegen.core.testutil.unitTest\nimport software.amazon.smithy.rust.codegen.core.util.UNREACHABLE\nimport software.amazon.smithy.rust.codegen.core.util.lookup\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenContext\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerRustModule\nimport software.amazon.smithy.rust.codegen.server.smithy.createTestInlineModuleCreator\nimport software.amazon.smithy.rust.codegen.server.smithy.customizations.SmithyValidationExceptionConversionGenerator\nimport software.amazon.smithy.rust.codegen.server.smithy.testutil.serverTestCodegenContext\nimport software.amazon.smithy.rust.codegen.server.smithy.transformers.ShapesReachableFromOperationInputTagger\nimport java.util.stream.Stream\n\n@Suppress(\"DEPRECATION\")\nclass ConstrainedCollectionGeneratorTest {\n    data class TestCase(\n        val model: Model,\n        val validLists: List<ArrayNode>,\n        val invalidLists: List<InvalidList>,\n    )\n\n    data class InvalidList(\n        val node: ArrayNode,\n        // A function returning a writable that renders the expected Rust value that the constructor error should\n        // return.\n        val expectedErrorFn: ((constraintViolation: Symbol, originalValueBindingName: String) -> Writable)?,\n    )\n\n    class ConstrainedListGeneratorTestProvider : ArgumentsProvider {\n        private fun generateModel(trait: String): Model =\n            \"\"\"\n            namespace test\n\n            $trait\n            list ConstrainedList {\n                member: String\n            }\n\n            $trait\n            set ConstrainedSet {\n                member: String\n            }\n            \"\"\".asSmithyModel().let(ShapesReachableFromOperationInputTagger::transform)\n\n        private val lengthTraitTestCases =\n            listOf(\n                // Min and max.\n                Triple(\"@length(min: 11, max: 12)\", 11, 13),\n                // Min equal to max.\n                Triple(\"@length(min: 11, max: 11)\", 11, 12),\n                // Only min.\n                Triple(\"@length(min: 11)\", 15, 10),\n                // Only max.\n                Triple(\"@length(max: 11)\", 11, 12),\n            ).map {\n                // Generate lists of strings of the specified length with consecutive items \"0\", \"1\", ...\n                val validList = List(it.second, Int::toString)\n                val invalidList = List(it.third, Int::toString)\n\n                Triple(it.first, ArrayNode.fromStrings(validList), ArrayNode.fromStrings(invalidList))\n            }.map { (trait, validList, invalidList) ->\n                TestCase(\n                    model = generateModel(trait),\n                    validLists = listOf(validList),\n                    invalidLists = listOf(InvalidList(invalidList, expectedErrorFn = null)),\n                )\n            }\n\n        private fun constraintViolationForDuplicateIndices(\n            duplicateIndices: List<Int>,\n        ): ((constraintViolation: Symbol, originalValueBindingName: String) -> Writable) {\n            fun ret(\n                constraintViolation: Symbol,\n                originalValueBindingName: String,\n            ): Writable =\n                writable {\n                    // Public documentation for the unique items constraint violation states that callers should not\n                    // rely on the order of the elements in `duplicate_indices`. However, the algorithm is deterministic,\n                    // so we can internally assert the order. If the algorithm changes, the test cases will need to be\n                    // adjusted.\n                    rustTemplate(\n                        \"\"\"\n                        #{ConstraintViolation}::UniqueItems {\n                            duplicate_indices: vec![${duplicateIndices.joinToString(\", \")}],\n                            original: $originalValueBindingName,\n                        }\n                        \"\"\",\n                        \"ConstraintViolation\" to constraintViolation,\n                    )\n                }\n\n            return ::ret\n        }\n\n        private val uniqueItemsTraitTestCases =\n            listOf(\n                // We only need one test case, since `@uniqueItems` is not parameterizable.\n                TestCase(\n                    model = generateModel(\"@uniqueItems\"),\n                    validLists =\n                        listOf(\n                            ArrayNode.fromStrings(),\n                            ArrayNode.fromStrings(\"0\", \"1\"),\n                            ArrayNode.fromStrings(\"a\", \"b\", \"a2\"),\n                            ArrayNode.fromStrings((0..69).map(Int::toString).toList()),\n                        ),\n                    invalidLists =\n                        listOf(\n                            // Two elements, both duplicate.\n                            InvalidList(\n                                node = ArrayNode.fromStrings(\"0\", \"0\"),\n                                expectedErrorFn = constraintViolationForDuplicateIndices(listOf(0, 1)),\n                            ),\n                            // Two duplicate items, one at the beginning, one at the end.\n                            InvalidList(\n                                node = ArrayNode.fromStrings(\"0\", \"1\", \"2\", \"3\", \"4\", \"5\", \"0\"),\n                                expectedErrorFn = constraintViolationForDuplicateIndices(listOf(0, 6)),\n                            ),\n                            // Several duplicate items, all the same.\n                            InvalidList(\n                                node = ArrayNode.fromStrings(\"0\", \"1\", \"0\", \"0\", \"4\", \"0\", \"6\", \"7\"),\n                                expectedErrorFn = constraintViolationForDuplicateIndices(listOf(0, 2, 3, 5)),\n                            ),\n                            // Several equivalence classes.\n                            InvalidList(\n                                node = ArrayNode.fromStrings(\"0\", \"1\", \"0\", \"2\", \"1\", \"0\", \"2\", \"7\", \"2\"),\n                                // Note how the duplicate indices are not ordered.\n                                expectedErrorFn = constraintViolationForDuplicateIndices(listOf(0, 1, 2, 3, 6, 5, 4, 8)),\n                            ),\n                            // The worst case: a fairly large number of elements, all duplicate.\n                            InvalidList(\n                                node = ArrayNode.fromStrings(generateSequence { \"69\" }.take(69).toList()),\n                                expectedErrorFn = constraintViolationForDuplicateIndices((0..68).toList()),\n                            ),\n                        ),\n                ),\n            )\n\n        override fun provideArguments(context: ExtensionContext?): Stream<out Arguments> =\n            (lengthTraitTestCases + uniqueItemsTraitTestCases).map { Arguments.of(it) }.stream()\n    }\n\n    @ParameterizedTest\n    @ArgumentsSource(ConstrainedListGeneratorTestProvider::class)\n    fun `it should generate constrained collection types`(testCase: TestCase) {\n        val constrainedListShape = testCase.model.lookup<CollectionShape>(\"test#ConstrainedList\")\n        val constrainedSetShape = testCase.model.lookup<CollectionShape>(\"test#ConstrainedSet\")\n\n        val codegenContext = serverTestCodegenContext(testCase.model)\n\n        val project = TestWorkspace.testProject(codegenContext.symbolProvider)\n        project.withModule(ServerRustModule.Model) {\n            TestUtility.generateIsDisplay().invoke(this)\n            TestUtility.generateIsError().invoke(this)\n        }\n\n        for (shape in listOf(constrainedListShape, constrainedSetShape)) {\n            val shapeName =\n                when (shape) {\n                    is SetShape -> \"set\"\n                    is ListShape -> \"list\"\n                    else -> UNREACHABLE(\"Shape is either list or set.\")\n                }\n\n            project.withModule(ServerRustModule.Model) {\n                render(codegenContext, this, shape)\n\n                val instantiator = ServerInstantiator(codegenContext)\n                for ((idx, validList) in testCase.validLists.withIndex()) {\n                    val shapeNameIdx = \"${shapeName}_$idx\"\n                    val buildValidFnName = \"build_valid_$shapeNameIdx\"\n                    val typeName = \"Constrained${shapeName.replaceFirstChar { it.uppercaseChar() }}\"\n\n                    rustBlock(\"##[cfg(test)] fn $buildValidFnName() -> std::vec::Vec<std::string::String>\") {\n                        instantiator.render(this, shape, validList)\n                    }\n\n                    unitTest(\n                        name = \"${shapeNameIdx}_try_from_success\",\n                        test = \"\"\"\n                            let $shapeNameIdx = $buildValidFnName();\n                            let _constrained: $typeName = $shapeNameIdx.try_into().unwrap();\n                        \"\"\",\n                    )\n                    unitTest(\n                        name = \"${shapeNameIdx}_inner\",\n                        test = \"\"\"\n                            let $shapeNameIdx = $buildValidFnName();\n                            let constrained = $typeName::try_from($shapeNameIdx.clone()).unwrap();\n\n                            assert_eq!(constrained.inner(), &$shapeNameIdx);\n                        \"\"\",\n                    )\n                    unitTest(\n                        name = \"${shapeNameIdx}_into_inner\",\n                        test = \"\"\"\n                            let $shapeNameIdx = $buildValidFnName();\n                            let constrained = $typeName::try_from($shapeNameIdx.clone()).unwrap();\n\n                            assert_eq!(constrained.into_inner(), $shapeNameIdx);\n                        \"\"\",\n                    )\n                }\n\n                for ((idx, invalidList) in testCase.invalidLists.withIndex()) {\n                    val shapeNameIdx = \"${shapeName}_$idx\"\n                    val buildInvalidFnName = \"build_invalid_$shapeNameIdx\"\n                    val typeName = \"Constrained${shapeName.replaceFirstChar { it.uppercaseChar() }}\"\n\n                    rustBlock(\"##[cfg(test)] fn $buildInvalidFnName() -> std::vec::Vec<std::string::String>\") {\n                        instantiator.render(this, shape, invalidList.node)\n                    }\n                    unitTest(\n                        name = \"${shapeNameIdx}_try_from_fail\",\n                        block =\n                            writable {\n                                rust(\n                                    \"\"\"\n                                    let $shapeNameIdx = $buildInvalidFnName();\n                                    let constrained_res: Result <$typeName, _> = $shapeNameIdx.clone().try_into();\n                                    \"\"\",\n                                )\n\n                                invalidList.expectedErrorFn?.also { expectedErrorFn ->\n                                    val expectedErrorWritable =\n                                        expectedErrorFn(\n                                            codegenContext.constraintViolationSymbolProvider.toSymbol(shape),\n                                            shapeNameIdx,\n                                        )\n\n                                    rust(\"let err = constrained_res.unwrap_err();\")\n                                    withBlock(\"let expected_err = \", \";\") {\n                                        rustTemplate(\"#{ExpectedError:W}\", \"ExpectedError\" to expectedErrorWritable)\n                                    }\n                                    rust(\n                                        \"\"\"\n                                        assert_eq!(err, expected_err);\n                                        is_error(&err);\n                                        is_display(&err);\n                                        // Ensure that the `std::fmt::Display` implementation for `ConstraintViolation` error works.\n                                        assert_eq!(err.to_string(), expected_err.to_string());\n                                        \"\"\".trimMargin(),\n                                    )\n                                } ?: run {\n                                    rust(\"constrained_res.unwrap_err();\")\n                                }\n                            },\n                    )\n                }\n            }\n        }\n\n        project.compileAndTest()\n    }\n\n    @Test\n    fun `type should not be constructable without using a constructor`() {\n        val model =\n            \"\"\"\n            namespace test\n\n            @length(min: 1, max: 69)\n            list ConstrainedList {\n                member: String\n            }\n            \"\"\".asSmithyModel().let(ShapesReachableFromOperationInputTagger::transform)\n        val constrainedCollectionShape = model.lookup<CollectionShape>(\"test#ConstrainedList\")\n\n        val writer = RustWriter.forModule(ServerRustModule.Model.name)\n\n        val codegenContext = serverTestCodegenContext(model)\n        render(codegenContext, writer, constrainedCollectionShape)\n\n        // Check that the wrapped type is `pub(crate)`.\n        writer.toString() shouldContain \"pub struct ConstrainedList(pub(crate) ::std::vec::Vec<::std::string::String>);\"\n    }\n\n    @Test\n    fun `error trait implemented for ConstraintViolation should work for constrained member`() {\n        val model =\n            \"\"\"\n            ${'$'}version: \"1.0\"\n            \n            namespace test\n            \n            use aws.protocols#restJson1\n            use smithy.framework#ValidationException\n            \n            // The `ConstraintViolation` code generated for a constrained map that is not reachable from an\n            // operation does not have the `Key`, or `Value` variants. Hence, we need to define a service\n            // and an operation that uses the constrained map.\n            @restJson1\n            service MyService {\n                version: \"2023-04-01\",\n                operations: [\n                    MyOperation,\n                ]\n            }\n            \n            @http(method: \"POST\", uri: \"/echo\")\n            operation MyOperation {\n                input: MyOperationInput\n                errors : [ValidationException]\n            }\n            \n            @input\n            structure MyOperationInput {\n                    member1: ConstrainedList,\n                    member2: ConstrainedSet,\n            }            \n\n            @length(min: 2, max: 69)\n            list ConstrainedList {\n                member: ConstrainedString\n            }\n\n            @length(min: 2, max: 69)\n            set ConstrainedSet {\n                member: ConstrainedString\n            }\n\n            @pattern(\"#\\\\d+\")\n            string ConstrainedString\n            \"\"\".asSmithyModel().let(ShapesReachableFromOperationInputTagger::transform)\n\n        val codegenContext = serverTestCodegenContext(model)\n        val symbolProvider = codegenContext.symbolProvider\n        val project = TestWorkspace.testProject(symbolProvider)\n\n        project.withModule(ServerRustModule.Model) {\n            TestUtility.generateIsDisplay().invoke(this)\n            TestUtility.generateIsError().invoke(this)\n            TestUtility.renderConstrainedString(\n                codegenContext, this,\n                model.lookup<StringShape>(\"test#ConstrainedString\"),\n            )\n\n            rustTemplate(\n                \"\"\"\n                // Define `ValidationExceptionField` since it is required by the `ConstraintViolation` code for constrained maps, \n                // and the complete SDK generation process, which would generate it, is not invoked as part of the test.\n                pub struct ValidationExceptionField {\n                    pub message: String,\n                    pub path: String\n                }\n                \"\"\",\n                *RuntimeType.preludeScope,\n            )\n\n            val constrainedListShape = model.lookup<ListShape>(\"test#ConstrainedList\")\n            val constrainedSetShape = model.lookup<ListShape>(\"test#ConstrainedSet\")\n            render(codegenContext, this, constrainedListShape)\n            render(codegenContext, this, constrainedSetShape)\n\n            unitTest(\n                name = \"try_from_fail_invalid_constrained_list\",\n                test = \"\"\"\n                    let constrained_error = ConstrainedString::try_from(\"one\".to_string()).unwrap_err();\n                    let error = crate::model::constrained_list::ConstraintViolation::Member(0, constrained_error);\n                    is_error(&error);\n                    is_display(&error);\n                    assert_eq!(\"Value at index 0 failed to satisfy constraint. Value provided for `test#ConstrainedString` failed to satisfy the constraint: Member must match the regular expression pattern: #\\\\d+\", \n                        error.to_string());\n                \"\"\",\n            )\n            unitTest(\n                name = \"try_from_fail_invalid_constrained_set\",\n                test = \"\"\"\n                    let constrained_error = ConstrainedString::try_from(\"one\".to_string()).unwrap_err();\n                    let error = crate::model::constrained_set::ConstraintViolation::Member(0, constrained_error);\n                    is_error(&error);\n                    is_display(&error);\n                    assert_eq!(\"Value at index 0 failed to satisfy constraint. Value provided for `test#ConstrainedString` failed to satisfy the constraint: Member must match the regular expression pattern: #\\\\d+\", \n                        error.to_string());\n                \"\"\",\n            )\n        }\n\n        project.compileAndTest()\n    }\n\n    private fun render(\n        codegenContext: ServerCodegenContext,\n        writer: RustWriter,\n        constrainedCollectionShape: CollectionShape,\n    ) {\n        val constraintsInfo = CollectionTraitInfo.fromShape(constrainedCollectionShape, codegenContext.symbolProvider)\n        ConstrainedCollectionGenerator(codegenContext, writer, constrainedCollectionShape, constraintsInfo).render()\n        CollectionConstraintViolationGenerator(\n            codegenContext,\n            writer.createTestInlineModuleCreator(),\n            constrainedCollectionShape,\n            constraintsInfo,\n            SmithyValidationExceptionConversionGenerator(codegenContext),\n        ).render()\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ConstrainedMapGeneratorTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.generators\n\nimport io.kotest.matchers.string.shouldContain\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.extension.ExtensionContext\nimport org.junit.jupiter.params.ParameterizedTest\nimport org.junit.jupiter.params.provider.Arguments\nimport org.junit.jupiter.params.provider.ArgumentsProvider\nimport org.junit.jupiter.params.provider.ArgumentsSource\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.node.ObjectNode\nimport software.amazon.smithy.model.shapes.MapShape\nimport software.amazon.smithy.model.shapes.StringShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.compileAndTest\nimport software.amazon.smithy.rust.codegen.core.testutil.unitTest\nimport software.amazon.smithy.rust.codegen.core.util.lookup\nimport software.amazon.smithy.rust.codegen.core.util.toSnakeCase\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenContext\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerRustModule\nimport software.amazon.smithy.rust.codegen.server.smithy.createTestInlineModuleCreator\nimport software.amazon.smithy.rust.codegen.server.smithy.customizations.SmithyValidationExceptionConversionGenerator\nimport software.amazon.smithy.rust.codegen.server.smithy.testutil.serverTestCodegenContext\nimport software.amazon.smithy.rust.codegen.server.smithy.transformers.ShapesReachableFromOperationInputTagger\nimport java.util.stream.Stream\n\nclass ConstrainedMapGeneratorTest {\n    data class TestCase(val model: Model, val validMap: ObjectNode, val invalidMap: ObjectNode)\n\n    class ConstrainedMapGeneratorTestProvider : ArgumentsProvider {\n        private val testCases =\n            listOf(\n                // Min and max.\n                Triple(\"@length(min: 11, max: 12)\", 11, 13),\n                // Min equal to max.\n                Triple(\"@length(min: 11, max: 11)\", 11, 12),\n                // Only min.\n                Triple(\"@length(min: 11)\", 15, 10),\n                // Only max.\n                Triple(\"@length(max: 11)\", 11, 12),\n            ).map {\n                val validStringMap = List(it.second) { index -> index.toString() to \"value\" }.toMap()\n                val inValidStringMap = List(it.third) { index -> index.toString() to \"value\" }.toMap()\n                Triple(it.first, ObjectNode.fromStringMap(validStringMap), ObjectNode.fromStringMap(inValidStringMap))\n            }.map { (trait, validMap, invalidMap) ->\n                TestCase(\n                    \"\"\"\n                    namespace test\n\n                    $trait\n                    map ConstrainedMap {\n                        key: String,\n                        value: String\n                    }\n                    \"\"\".asSmithyModel().let(ShapesReachableFromOperationInputTagger::transform),\n                    validMap,\n                    invalidMap,\n                )\n            }\n\n        override fun provideArguments(context: ExtensionContext?): Stream<out Arguments> =\n            testCases.map { Arguments.of(it) }.stream()\n    }\n\n    @ParameterizedTest\n    @ArgumentsSource(ConstrainedMapGeneratorTestProvider::class)\n    fun `it should generate constrained map types`(testCase: TestCase) {\n        val constrainedMapShape = testCase.model.lookup<MapShape>(\"test#ConstrainedMap\")\n\n        val codegenContext = serverTestCodegenContext(testCase.model)\n        val symbolProvider = codegenContext.symbolProvider\n\n        val project = TestWorkspace.testProject(symbolProvider)\n\n        project.withModule(ServerRustModule.Model) {\n            TestUtility.generateIsDisplay().invoke(this)\n            TestUtility.generateIsError().invoke(this)\n\n            render(codegenContext, this, constrainedMapShape)\n\n            val instantiator = ServerInstantiator(codegenContext)\n            rustBlock(\"##[cfg(test)] fn build_valid_map() -> std::collections::HashMap<String, String>\") {\n                instantiator.render(this, constrainedMapShape, testCase.validMap)\n            }\n            rustBlock(\"##[cfg(test)] fn build_invalid_map() -> std::collections::HashMap<String, String>\") {\n                instantiator.render(this, constrainedMapShape, testCase.invalidMap)\n            }\n\n            unitTest(\n                name = \"try_from_success\",\n                test = \"\"\"\n                    let map = build_valid_map();\n                    let _constrained: ConstrainedMap = map.try_into().unwrap();\n                \"\"\",\n            )\n            unitTest(\n                name = \"try_from_fail\",\n                test = \"\"\"\n                    let map = build_invalid_map();\n                    let constrained_res: Result<ConstrainedMap, _> = map.try_into();\n                    let error = constrained_res.unwrap_err();\n    \n                    is_display(&error);\n                    is_error(&error);\n                \"\"\",\n            )\n            unitTest(\n                name = \"inner\",\n                test = \"\"\"\n                    let map = build_valid_map();\n                    let constrained = ConstrainedMap::try_from(map.clone()).unwrap();\n\n                    assert_eq!(constrained.inner(), &map);\n                \"\"\",\n            )\n            unitTest(\n                name = \"into_inner\",\n                test = \"\"\"\n                    let map = build_valid_map();\n                    let constrained = ConstrainedMap::try_from(map.clone()).unwrap();\n\n                    assert_eq!(constrained.into_inner(), map);\n                \"\"\",\n            )\n        }\n\n        project.compileAndTest()\n    }\n\n    @Test\n    fun `type should not be constructable without using a constructor`() {\n        val model =\n            \"\"\"\n            namespace test\n\n            @length(min: 1, max: 69)\n            map ConstrainedMap {\n                key: String,\n                value: String\n            }\n            \"\"\".asSmithyModel().let(ShapesReachableFromOperationInputTagger::transform)\n        val constrainedMapShape = model.lookup<MapShape>(\"test#ConstrainedMap\")\n\n        val writer = RustWriter.forModule(ServerRustModule.Model.name)\n\n        val codegenContext = serverTestCodegenContext(model)\n        render(codegenContext, writer, constrainedMapShape)\n\n        // Check that the wrapped type is `pub(crate)`.\n        writer.toString() shouldContain \"pub struct ConstrainedMap(pub(crate) ::std::collections::HashMap<::std::string::String, ::std::string::String>);\"\n    }\n\n    @Test\n    fun `error trait implemented for ConstraintViolation should work for constrained key and value`() {\n        val model =\n            \"\"\"\n            ${'$'}version: \"2\"\n            \n            namespace test\n            \n            use aws.protocols#restJson1\n            use smithy.framework#ValidationException\n            \n            // The `ConstraintViolation` code generated for a constrained map that is not reachable from an\n            // operation does not have the `Key`, or `Value` variants. Hence, we need to define a service\n            // and an operation that uses the constrained map.\n            @restJson1\n            service MyService {\n                version: \"2023-04-01\",\n                operations: [\n                    MyOperation,\n                ]\n            }\n            \n            @http(method: \"POST\", uri: \"/echo\")\n            operation MyOperation {\n                input:= {\n                    member1: ConstrainedMapWithConstrainedKey,\n                    member2: ConstrainedMapWithConstrainedKeyAndValue,\n                    member3: ConstrainedMapWithConstrainedValue,\n                },\n                output:= {},\n                errors : [ValidationException]\n            }\n            \n            @length(min: 2, max: 69)\n            map ConstrainedMapWithConstrainedKey {\n                key: ConstrainedKey,\n                value: String\n            }\n\n            @length(min: 2, max: 69)\n            map ConstrainedMapWithConstrainedValue {\n                key: String,\n                value: ConstrainedValue\n            }\n\n            @length(min: 2, max: 69)\n            map ConstrainedMapWithConstrainedKeyAndValue {\n                key: ConstrainedKey,\n                value: ConstrainedValue,\n            }\n\n            @pattern(\"#\\\\d+\")\n            string ConstrainedKey\n\n            @pattern(\"A-Z\")\n            string ConstrainedValue\n            \"\"\".asSmithyModel().let(ShapesReachableFromOperationInputTagger::transform)\n        val constrainedKeyShape = model.lookup<StringShape>(\"test#ConstrainedKey\")\n        val constrainedValueShape = model.lookup<StringShape>(\"test#ConstrainedValue\")\n\n        val codegenContext = serverTestCodegenContext(model)\n        val symbolProvider = codegenContext.symbolProvider\n        val project = TestWorkspace.testProject(symbolProvider)\n\n        project.withModule(ServerRustModule.Model) {\n            TestUtility.generateIsDisplay().invoke(this)\n            TestUtility.generateIsError().invoke(this)\n            TestUtility.renderConstrainedString(codegenContext, this, constrainedKeyShape)\n            TestUtility.renderConstrainedString(codegenContext, this, constrainedValueShape)\n\n            val mapsToVerify =\n                listOf(\n                    model.lookup<MapShape>(\"test#ConstrainedMapWithConstrainedKey\"),\n                    model.lookup<MapShape>(\"test#ConstrainedMapWithConstrainedKeyAndValue\"),\n                    model.lookup<MapShape>(\"test#ConstrainedMapWithConstrainedValue\"),\n                )\n\n            rustTemplate(\n                \"\"\"\n                fn build_invalid_constrained_map_with_constrained_key() -> #{HashMap}<ConstrainedKey, String> {\n                    let mut m = ::std::collections::HashMap::new();\n                    m.insert(ConstrainedKey(\"1\".to_string()), \"Y\".to_string());\n                    m    \n                }\n                fn build_invalid_constrained_map_with_constrained_key_and_value() -> std::collections::HashMap<ConstrainedKey, ConstrainedValue> {\n                    let mut m = ::std::collections::HashMap::new();\n                    m.insert(ConstrainedKey(\"1\".to_string()), ConstrainedValue(\"Y\".to_string()));\n                    m\n                }\n                fn build_invalid_constrained_map_with_constrained_value() -> std::collections::HashMap<String, ConstrainedValue> {\n                    let mut m = ::std::collections::HashMap::new();\n                    m.insert(\"1\".to_string(), ConstrainedValue(\"Y\".to_string()));\n                    m\n                }\n                \n                // Define `ValidationExceptionField` since it is required by the `ConstraintViolation` code for constrained maps, \n                // and the complete SDK generation process, which would generate it, is not invoked as part of the test.\n                pub struct ValidationExceptionField {\n                    pub message: String,\n                    pub path: String\n                }\n                \"\"\",\n                \"HashMap\" to RuntimeType.HashMap,\n            )\n\n            for (mapToVerify in mapsToVerify) {\n                val rustShapeName = mapToVerify.toShapeId().name\n                val rustShapeSnakeCaseName = rustShapeName.toSnakeCase()\n\n                render(codegenContext, this, mapToVerify)\n\n                unitTest(\n                    name = \"try_from_fail_$rustShapeSnakeCaseName\",\n                    test = \"\"\"\n                        let map = build_invalid_$rustShapeSnakeCaseName();\n                        let constrained_res: Result<$rustShapeName, $rustShapeSnakeCaseName::ConstraintViolation> = map.try_into();\n                        let error = constrained_res.unwrap_err();\n                        is_error(&error);\n                        is_display(&error);\n                        assert_eq!(\"Value with length 1 provided for 'test#$rustShapeName' failed to satisfy constraint: Member must have length between 2 and 69, inclusive\", error.to_string());\n                    \"\"\",\n                )\n            }\n\n            unitTest(\n                name = \"try_constrained_key\",\n                test =\n                    \"\"\"\n                    let error = constrained_map_with_constrained_key::ConstraintViolation::Key(constrained_key::ConstraintViolation::Pattern(\"some error\".to_string()));\n                    assert_eq!(error.to_string(), \"Value provided for `test#ConstrainedKey` failed to satisfy the constraint: Member must match the regular expression pattern: #\\\\d+\");\n                    \"\"\",\n            )\n            unitTest(\n                name = \"try_constrained_value\",\n                test =\n                    \"\"\"\n                    let error = constrained_map_with_constrained_value::ConstraintViolation::Value(\"some_key\".to_string(), constrained_value::ConstraintViolation::Pattern(\"some error\".to_string()));\n                    assert_eq!(error.to_string(), \"Value provided for `test#ConstrainedValue` failed to satisfy the constraint: Member must match the regular expression pattern: A-Z\");\n                    \"\"\",\n            )\n            unitTest(\n                name = \"try_constrained_key_and_value\",\n                test =\n                    \"\"\"\n                    let error = constrained_map_with_constrained_key_and_value::ConstraintViolation::Key(constrained_key::ConstraintViolation::Pattern(\"some error\".to_string()));\n                    assert_eq!(error.to_string(), \"Value provided for `test#ConstrainedKey` failed to satisfy the constraint: Member must match the regular expression pattern: #\\\\d+\");\n                    let error = constrained_map_with_constrained_key_and_value::ConstraintViolation::Value(ConstrainedKey(\"1\".to_string()), constrained_value::ConstraintViolation::Pattern(\"some error\".to_string()));\n                    assert_eq!(error.to_string(), \"Value provided for `test#ConstrainedValue` failed to satisfy the constraint: Member must match the regular expression pattern: A-Z\");\n                    \"\"\",\n            )\n        }\n\n        project.compileAndTest()\n    }\n\n    private fun render(\n        codegenContext: ServerCodegenContext,\n        writer: RustWriter,\n        constrainedMapShape: MapShape,\n    ) {\n        ConstrainedMapGenerator(codegenContext, writer, constrainedMapShape).render()\n        MapConstraintViolationGenerator(\n            codegenContext,\n            writer.createTestInlineModuleCreator(),\n            constrainedMapShape,\n            SmithyValidationExceptionConversionGenerator(codegenContext),\n        ).render()\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ConstrainedNumberGeneratorTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.generators\n\nimport io.kotest.matchers.string.shouldContain\nimport org.junit.jupiter.api.extension.ExtensionContext\nimport org.junit.jupiter.params.ParameterizedTest\nimport org.junit.jupiter.params.provider.Arguments\nimport org.junit.jupiter.params.provider.ArgumentsProvider\nimport org.junit.jupiter.params.provider.ArgumentsSource\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.NumberShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.compileAndTest\nimport software.amazon.smithy.rust.codegen.core.testutil.unitTest\nimport software.amazon.smithy.rust.codegen.core.util.lookup\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerRustModule\nimport software.amazon.smithy.rust.codegen.server.smithy.createTestInlineModuleCreator\nimport software.amazon.smithy.rust.codegen.server.smithy.customizations.SmithyValidationExceptionConversionGenerator\nimport software.amazon.smithy.rust.codegen.server.smithy.testutil.serverTestCodegenContext\nimport java.util.stream.Stream\n\nclass ConstrainedNumberGeneratorTest {\n    data class TestCaseInputs(val constraintAnnotation: String, val validValue: Int, val invalidValue: Int)\n\n    data class TestCase(val model: Model, val validValue: Int, val invalidValue: Int, val shapeName: String)\n\n    class ConstrainedNumberGeneratorTestProvider : ArgumentsProvider {\n        private val testCases = { type: String ->\n            listOf(\n                // Min and max.\n                TestCaseInputs(\"@range(min: 10, max: 12)\", 11, 13),\n                // Min equal to max.\n                TestCaseInputs(\"@range(min: 11, max: 11)\", 11, 12),\n                // Only min.\n                TestCaseInputs(\"@range(min: 11)\", 12, 2),\n                // Only max.\n                TestCaseInputs(\"@range(max: 11)\", 0, 12),\n            ).map {\n                val shapeName = \"Constrained${type.replaceFirstChar { c -> c.uppercaseChar() }}\"\n                TestCase(\n                    \"\"\"\n                    namespace test\n\n                    ${it.constraintAnnotation}\n                    $type $shapeName\n                    \"\"\".asSmithyModel(),\n                    it.validValue,\n                    it.invalidValue,\n                    shapeName,\n                )\n            }\n        }\n\n        override fun provideArguments(context: ExtensionContext?): Stream<out Arguments> =\n            listOf(\"integer\", \"short\", \"long\", \"byte\").map { type -> testCases(type) }.flatten()\n                .map { Arguments.of(it) }.stream()\n    }\n\n    @ParameterizedTest\n    @ArgumentsSource(ConstrainedNumberGeneratorTestProvider::class)\n    fun `it should generate constrained number types`(testCase: TestCase) {\n        val shape = testCase.model.lookup<NumberShape>(\"test#${testCase.shapeName}\")\n\n        val codegenContext = serverTestCodegenContext(testCase.model)\n        val symbolProvider = codegenContext.symbolProvider\n\n        val project = TestWorkspace.testProject(symbolProvider)\n\n        project.withModule(ServerRustModule.Model) {\n            TestUtility.generateIsDisplay().invoke(this)\n            TestUtility.generateIsError().invoke(this)\n\n            ConstrainedNumberGenerator(\n                codegenContext,\n                this.createTestInlineModuleCreator(),\n                this,\n                shape,\n                SmithyValidationExceptionConversionGenerator(codegenContext),\n            ).render()\n\n            unitTest(\n                name = \"try_from_success\",\n                test = \"\"\"\n                    let _constrained: ${testCase.shapeName} = ${testCase.validValue}.try_into().unwrap();\n                \"\"\",\n            )\n            unitTest(\n                name = \"try_from_fail\",\n                test = \"\"\"\n                    let constrained_res: Result<${testCase.shapeName}, _> = ${testCase.invalidValue}.try_into();\n                    let error = constrained_res.unwrap_err();\n                    is_error(&error);\n                    is_display(&error);\n                \"\"\",\n            )\n            unitTest(\n                name = \"inner\",\n                test = \"\"\"\n                    let constrained = ${testCase.shapeName}::try_from(${testCase.validValue}).unwrap();\n                    assert_eq!(constrained.inner(), &${testCase.validValue});\n                \"\"\",\n            )\n            unitTest(\n                name = \"into_inner\",\n                test = \"\"\"\n                    let v = ${testCase.validValue};\n                    let constrained = ${testCase.shapeName}::try_from(v).unwrap();\n\n                    assert_eq!(constrained.into_inner(), v);\n                \"\"\",\n            )\n        }\n\n        project.compileAndTest()\n    }\n\n    class NoStructuralConstructorTestProvider : ArgumentsProvider {\n        override fun provideArguments(context: ExtensionContext?): Stream<out Arguments> =\n            listOf(\n                Triple(\"byte\", \"ConstrainedByte\", \"i8\"),\n                Triple(\"short\", \"ConstrainedShort\", \"i16\"),\n                Triple(\"integer\", \"ConstrainedInteger\", \"i32\"),\n                Triple(\"long\", \"ConstrainedLong\", \"i64\"),\n            ).map { Arguments.of(it) }.stream()\n    }\n\n    @ParameterizedTest\n    @ArgumentsSource(NoStructuralConstructorTestProvider::class)\n    fun `type should not be constructable without using a constructor`(args: Triple<String, String, String>) {\n        val (smithyType, shapeName, rustType) = args\n        val model =\n            \"\"\"\n            namespace test\n\n            @range(min: -1, max: 5)\n            $smithyType $shapeName\n            \"\"\".asSmithyModel()\n        val constrainedShape = model.lookup<NumberShape>(\"test#$shapeName\")\n\n        val codegenContext = serverTestCodegenContext(model)\n\n        val writer = RustWriter.forModule(ServerRustModule.Model.name)\n        ConstrainedNumberGenerator(\n            codegenContext,\n            writer.createTestInlineModuleCreator(),\n            writer,\n            constrainedShape,\n            SmithyValidationExceptionConversionGenerator(codegenContext),\n        ).render()\n\n        // Check that the wrapped type is `pub(crate)`.\n        writer.toString() shouldContain \"pub struct $shapeName(pub(crate) $rustType);\"\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ConstrainedStringGeneratorTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.generators\n\nimport io.kotest.matchers.string.shouldContain\nimport org.junit.jupiter.api.Test\nimport org.junit.jupiter.api.assertThrows\nimport org.junit.jupiter.api.extension.ExtensionContext\nimport org.junit.jupiter.params.ParameterizedTest\nimport org.junit.jupiter.params.provider.Arguments\nimport org.junit.jupiter.params.provider.ArgumentsProvider\nimport org.junit.jupiter.params.provider.ArgumentsSource\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.StringShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.compileAndTest\nimport software.amazon.smithy.rust.codegen.core.testutil.unitTest\nimport software.amazon.smithy.rust.codegen.core.util.CommandError\nimport software.amazon.smithy.rust.codegen.core.util.lookup\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerRustModule\nimport software.amazon.smithy.rust.codegen.server.smithy.createTestInlineModuleCreator\nimport software.amazon.smithy.rust.codegen.server.smithy.customizations.SmithyValidationExceptionConversionGenerator\nimport software.amazon.smithy.rust.codegen.server.smithy.testutil.serverTestCodegenContext\nimport java.util.stream.Stream\n\nclass ConstrainedStringGeneratorTest {\n    data class TestCase(val model: Model, val validString: String, val invalidString: String)\n\n    class ConstrainedStringGeneratorTestProvider : ArgumentsProvider {\n        private val testCases =\n            listOf(\n                // Min and max.\n                Triple(\"@length(min: 11, max: 12)\", \"validString\", \"invalidString\"),\n                // Min equal to max.\n                Triple(\"@length(min: 11, max: 11)\", \"validString\", \"invalidString\"),\n                // Only min.\n                Triple(\"@length(min: 11)\", \"validString\", \"\"),\n                // Only max.\n                Triple(\"@length(max: 11)\", \"\", \"invalidString\"),\n                // Count Unicode scalar values, not `.len()`.\n                Triple(\n                    \"@length(min: 3, max: 3)\",\n                    // These three emojis are three Unicode scalar values.\n                    \"👍👍👍\",\n                    \"👍👍👍👍\",\n                ),\n                Triple(\"@pattern(\\\"^[a-z]+$\\\")\", \"valid\", \"123 invalid\"),\n                Triple(\n                    \"\"\"\n                    @length(min: 3, max: 10)\n                    @pattern(\"^a # string$\")\n                    \"\"\",\n                    \"a # string\", \"an invalid string\",\n                ),\n                Triple(\"@pattern(\\\"123\\\")\", \"some pattern 123 in the middle\", \"no pattern at all\"),\n            ).map {\n                TestCase(\n                    \"\"\"\n                    namespace test\n\n                    ${it.first}\n                    string ConstrainedString\n                    \"\"\".asSmithyModel(),\n                    it.second,\n                    it.third,\n                )\n            }\n\n        override fun provideArguments(context: ExtensionContext?): Stream<out Arguments> =\n            testCases.map { Arguments.of(it) }.stream()\n    }\n\n    @ParameterizedTest\n    @ArgumentsSource(ConstrainedStringGeneratorTestProvider::class)\n    fun `it should generate constrained string types`(testCase: TestCase) {\n        val constrainedStringShape = testCase.model.lookup<StringShape>(\"test#ConstrainedString\")\n\n        val codegenContext = serverTestCodegenContext(testCase.model)\n        val symbolProvider = codegenContext.symbolProvider\n\n        val project = TestWorkspace.testProject(symbolProvider)\n\n        project.withModule(ServerRustModule.Model) {\n            TestUtility.generateIsDisplay().invoke(this)\n            TestUtility.generateIsError().invoke(this)\n\n            ConstrainedStringGenerator(\n                codegenContext,\n                this.createTestInlineModuleCreator(),\n                this,\n                constrainedStringShape,\n                SmithyValidationExceptionConversionGenerator(codegenContext),\n            ).render()\n\n            unitTest(\n                name = \"try_from_success\",\n                test = \"\"\"\n                    let string = \"${testCase.validString}\".to_owned();\n                    let _constrained: ConstrainedString = string.try_into().unwrap();\n                \"\"\",\n            )\n            unitTest(\n                name = \"try_from_fail\",\n                test = \"\"\"\n                    let string = \"${testCase.invalidString}\".to_owned();\n                    let constrained_res: Result<ConstrainedString, _> = string.try_into();\n                    let error = constrained_res.unwrap_err();\n                    is_error(&error);\n                    is_display(&error);\n                \"\"\",\n            )\n            unitTest(\n                name = \"inner\",\n                test = \"\"\"\n                    let string = \"${testCase.validString}\".to_owned();\n                    let constrained = ConstrainedString::try_from(string).unwrap();\n\n                    assert_eq!(constrained.inner(), \"${testCase.validString}\");\n                \"\"\",\n            )\n            unitTest(\n                name = \"into_inner\",\n                test = \"\"\"\n                    let string = \"${testCase.validString}\".to_owned();\n                    let constrained = ConstrainedString::try_from(string.clone()).unwrap();\n\n                    assert_eq!(constrained.into_inner(), string);\n                \"\"\",\n            )\n        }\n\n        project.compileAndTest()\n    }\n\n    @Test\n    fun `type should not be constructable without using a constructor`() {\n        val model =\n            \"\"\"\n            namespace test\n\n            @length(min: 1, max: 69)\n            string ConstrainedString\n            \"\"\".asSmithyModel()\n        val constrainedStringShape = model.lookup<StringShape>(\"test#ConstrainedString\")\n\n        val codegenContext = serverTestCodegenContext(model)\n\n        val writer = RustWriter.forModule(ServerRustModule.Model.name)\n\n        ConstrainedStringGenerator(\n            codegenContext,\n            writer.createTestInlineModuleCreator(),\n            writer,\n            constrainedStringShape,\n            SmithyValidationExceptionConversionGenerator(codegenContext),\n        ).render()\n\n        // Check that the wrapped type is `pub(crate)`.\n        writer.toString() shouldContain \"pub struct ConstrainedString(pub(crate) ::std::string::String);\"\n    }\n\n    @Test\n    fun `Display implementation`() {\n        val model =\n            \"\"\"\n            namespace test\n\n            @length(min: 1, max: 69)\n            string ConstrainedString\n\n            @sensitive\n            @length(min: 1, max: 78)\n            string SensitiveConstrainedString\n            \"\"\".asSmithyModel()\n        val constrainedStringShape = model.lookup<StringShape>(\"test#ConstrainedString\")\n        val sensitiveConstrainedStringShape = model.lookup<StringShape>(\"test#SensitiveConstrainedString\")\n\n        val codegenContext = serverTestCodegenContext(model)\n\n        val project = TestWorkspace.testProject(codegenContext.symbolProvider)\n\n        project.withModule(ServerRustModule.Model) {\n            val validationExceptionConversionGenerator = SmithyValidationExceptionConversionGenerator(codegenContext)\n            ConstrainedStringGenerator(\n                codegenContext,\n                this.createTestInlineModuleCreator(),\n                this,\n                constrainedStringShape,\n                validationExceptionConversionGenerator,\n            ).render()\n            ConstrainedStringGenerator(\n                codegenContext,\n                this.createTestInlineModuleCreator(),\n                this,\n                sensitiveConstrainedStringShape,\n                validationExceptionConversionGenerator,\n            ).render()\n\n            unitTest(\n                name = \"non_sensitive_string_display_implementation\",\n                test = \"\"\"\n                    let string = \"a non-sensitive string\".to_owned();\n                    let constrained = ConstrainedString::try_from(string).unwrap();\n                    assert_eq!(format!(\"{}\", constrained), \"a non-sensitive string\")\n                \"\"\",\n            )\n\n            unitTest(\n                name = \"sensitive_string_display_implementation\",\n                test = \"\"\"\n                    let string = \"That is how heavy a secret can become. It can make blood flow easier than ink.\".to_owned();\n                    let constrained = SensitiveConstrainedString::try_from(string).unwrap();\n                    assert_eq!(format!(\"{}\", constrained), \"*** Sensitive Data Redacted ***\")\n                \"\"\",\n            )\n        }\n\n        project.compileAndTest()\n    }\n\n    @Test\n    fun `A regex that is accepted by Smithy but not by the regex crate causes tests to fail`() {\n        val model =\n            \"\"\"\n            namespace test\n\n            @pattern(\"import (?!static).+\")\n            string PatternStringWithLookahead\n            \"\"\".asSmithyModel()\n\n        val constrainedStringShape = model.lookup<StringShape>(\"test#PatternStringWithLookahead\")\n        val codegenContext = serverTestCodegenContext(model)\n        val project = TestWorkspace.testProject(codegenContext.symbolProvider)\n\n        project.withModule(ServerRustModule.Model) {\n            ConstrainedStringGenerator(\n                codegenContext,\n                this.createTestInlineModuleCreator(),\n                this,\n                constrainedStringShape,\n                SmithyValidationExceptionConversionGenerator(codegenContext),\n            ).render()\n        }\n\n        assertThrows<CommandError> {\n            project.compileAndTest()\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/EventStreamAcceptHeaderTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.generators\n\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.testModule\nimport software.amazon.smithy.rust.codegen.core.testutil.tokioTest\nimport software.amazon.smithy.rust.codegen.core.util.dq\nimport software.amazon.smithy.rust.codegen.core.util.toSnakeCase\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerCargoDependency\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenContext\nimport software.amazon.smithy.rust.codegen.server.smithy.testutil.ServerHttpTestHelpers\nimport software.amazon.smithy.rust.codegen.server.smithy.testutil.serverIntegrationTest\n\ninternal class EventStreamAcceptHeaderTest {\n    private val model =\n        \"\"\"\n        ${'$'}version: \"2.0\"\n        namespace test\n\n        use smithy.protocols#rpcv2Cbor\n        use smithy.framework#ValidationException\n\n        @rpcv2Cbor\n        service TestService {\n            operations: [StreamingOutputOperation]\n        }\n\n        operation StreamingOutputOperation {\n            input: StreamingOutputOperationInput\n            output: StreamingOutputOperationOutput\n            errors: [ValidationException]\n        }\n\n        structure StreamingOutputOperationInput {\n            message: String\n        }\n\n        structure StreamingOutputOperationOutput {\n            events: Events\n        }\n\n        @streaming\n        union Events {\n            event: StreamingEvent\n        }\n\n        structure StreamingEvent {\n            data: String\n        }\n        \"\"\".asSmithyModel()\n\n    @Test\n    fun acceptHeaderTests() {\n        serverIntegrationTest(model) { codegenContext, rustCrate ->\n            rustCrate.testModule {\n                generateAcceptHeaderTest(\n                    acceptHeader = \"application/vnd.amazon.eventstream\",\n                    shouldFail = false,\n                    codegenContext = codegenContext,\n                )\n                generateAcceptHeaderTest(\n                    acceptHeader = \"application/cbor\",\n                    shouldFail = false,\n                    codegenContext = codegenContext,\n                )\n                generateAcceptHeaderTest(\n                    acceptHeader = \"application/invalid\",\n                    shouldFail = true,\n                    codegenContext = codegenContext,\n                )\n                generateAcceptHeaderTest(\n                    acceptHeader = \"application/json, application/cbor\",\n                    shouldFail = false,\n                    codegenContext = codegenContext,\n                    testName = \"combined_header\",\n                )\n            }\n        }\n    }\n\n    private fun RustWriter.generateAcceptHeaderTest(\n        acceptHeader: String,\n        shouldFail: Boolean,\n        codegenContext: ServerCodegenContext,\n        testName: String = acceptHeader.toSnakeCase(),\n    ) {\n        val smithyHttpServer = ServerCargoDependency.smithyHttpServer(codegenContext.runtimeConfig).toType()\n        val httpModule = RuntimeType.http(codegenContext.runtimeConfig)\n        tokioTest(\"test_header_$testName\") {\n            rustTemplate(\n                \"\"\"\n                use #{SmithyHttpServer}::request::FromRequest;\n                let cbor_empty_bytes = #{Bytes}::copy_from_slice(&#{decode_body_data}(\n                    \"oA==\".as_bytes(),\n                    #{MediaType}::from(\"application/cbor\"),\n                ));\n\n                let http_request = #{Http}::Request::builder()\n                    .uri(\"/service/TestService/operation/StreamingOutputOperation\")\n                    .method(\"POST\")\n                    .header(\"Accept\", ${acceptHeader.dq()})\n                    .header(\"Content-Type\", \"application/cbor\")\n                    .header(\"smithy-protocol\", \"rpc-v2-cbor\")\n                    .body(#{BodyFromCborBytes})\n                .unwrap();\n                let parsed = crate::input::StreamingOutputOperationInput::from_request(http_request).await;\n                \"\"\",\n                \"SmithyHttpServer\" to smithyHttpServer,\n                \"Http\" to httpModule,\n                \"Bytes\" to RuntimeType.Bytes,\n                \"MediaType\" to RuntimeType.protocolTest(codegenContext.runtimeConfig, \"MediaType\"),\n                \"decode_body_data\" to\n                    RuntimeType.protocolTest(\n                        codegenContext.runtimeConfig,\n                        \"decode_body_data\",\n                    ),\n                \"BodyFromCborBytes\" to ServerHttpTestHelpers.createBodyFromBytes(codegenContext, \"cbor_empty_bytes\"),\n            )\n\n            if (shouldFail) {\n                rust(\"\"\"parsed.expect_err(\"header should be rejected\");\"\"\")\n            } else {\n                rust(\"\"\"parsed.expect(\"header should be accepted\");\"\"\")\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderConstraintViolationsTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.generators\n\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.server.smithy.testutil.serverIntegrationTest\n\nclass ServerBuilderConstraintViolationsTest {\n    // This test exists not to regress on [this](https://github.com/smithy-lang/smithy-rs/issues/2343) issue.\n    // We generated constraint violation variants, pointing to a structure (StructWithInnerDefault below),\n    // but the structure was not constrained, because the structure's member have a default value\n    // and default values are validated at generation time from the model.\n    @Test\n    fun `it should not generate constraint violations for members with a default value`() {\n        val model =\n            \"\"\"\n            namespace test\n\n            use aws.protocols#restJson1\n            use smithy.framework#ValidationException\n\n            @restJson1\n            service SimpleService {\n                operations: [Operation]\n            }\n\n            @http(uri: \"/operation\", method: \"POST\")\n            operation Operation {\n                input: OperationInput\n                errors: [ValidationException]\n            }\n\n            structure OperationInput {\n                @required\n                requiredStructureWithInnerDefault: StructWithInnerDefault\n            }\n\n            structure StructWithInnerDefault {\n                @default(false)\n                inner: PrimitiveBoolean\n            }\n            \"\"\".asSmithyModel(smithyVersion = \"2\")\n        serverIntegrationTest(model)\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderDefaultValuesTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.generators\n\nimport org.junit.jupiter.api.TestInstance\nimport org.junit.jupiter.params.ParameterizedTest\nimport org.junit.jupiter.params.provider.Arguments\nimport org.junit.jupiter.params.provider.MethodSource\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.EnumShape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustModule\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.conditionalBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.implBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.withBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RustCrate\nimport software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.StructureGenerator\nimport software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.compileAndTest\nimport software.amazon.smithy.rust.codegen.core.testutil.unitTest\nimport software.amazon.smithy.rust.codegen.core.util.dq\nimport software.amazon.smithy.rust.codegen.core.util.lookup\nimport software.amazon.smithy.rust.codegen.core.util.toPascalCase\nimport software.amazon.smithy.rust.codegen.core.util.toSnakeCase\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenConfig\nimport software.amazon.smithy.rust.codegen.server.smithy.customizations.SmithyValidationExceptionConversionGenerator\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.protocol.ServerRestJsonProtocol\nimport software.amazon.smithy.rust.codegen.server.smithy.renderInlineMemoryModules\nimport software.amazon.smithy.rust.codegen.server.smithy.testutil.serverTestCodegenContext\nimport software.amazon.smithy.rust.codegen.server.smithy.testutil.serverTestRustSettings\nimport software.amazon.smithy.rust.codegen.server.smithy.testutil.serverTestSymbolProvider\nimport java.util.stream.Stream\n\n@TestInstance(TestInstance.Lifecycle.PER_CLASS)\nclass ServerBuilderDefaultValuesTest {\n    // When defaults are used, the model will be generated with these in the `@default` trait.\n    private val defaultValues =\n        mapOf(\n            \"Boolean\" to \"true\",\n            \"String\" to \"foo\".dq(),\n            \"Byte\" to \"5\",\n            \"Short\" to \"55\",\n            \"Integer\" to \"555\",\n            \"Long\" to \"5555\",\n            \"Float\" to \"0.5\",\n            \"Double\" to \"0.55\",\n            \"Timestamp\" to \"1985-04-12T23:20:50.52Z\".dq(),\n            // \"BigInteger\" to \"55555\", \"BigDecimal\" to \"0.555\", // TODO(https://github.com/smithy-lang/smithy-rs/issues/312)\n            \"StringList\" to \"[]\",\n            \"IntegerMap\" to \"{}\",\n            \"Language\" to \"en\".dq(),\n            \"DocumentBoolean\" to \"true\",\n            \"DocumentString\" to \"foo\".dq(),\n            \"DocumentNumberPosInt\" to \"100\",\n            \"DocumentNumberNegInt\" to \"-100\",\n            \"DocumentNumberFloat\" to \"0.1\",\n            \"DocumentList\" to \"[]\",\n            \"DocumentMap\" to \"{}\",\n        )\n\n    // When the test applies values to validate we honor custom values, use these (different) values.\n    private val customValues =\n        mapOf(\n            \"Boolean\" to \"false\",\n            \"String\" to \"bar\".dq(),\n            \"Byte\" to \"6\",\n            \"Short\" to \"66\",\n            \"Integer\" to \"666\",\n            \"Long\" to \"6666\",\n            \"Float\" to \"0.6\",\n            \"Double\" to \"0.66\",\n            \"Timestamp\" to \"2022-11-25T17:30:50.00Z\".dq(),\n            // \"BigInteger\" to \"55555\", \"BigDecimal\" to \"0.555\", // TODO(https://github.com/smithy-lang/smithy-rs/issues/312)\n            \"StringList\" to \"[]\",\n            \"IntegerMap\" to \"{}\",\n            \"Language\" to \"fr\".dq(),\n            \"DocumentBoolean\" to \"false\",\n            \"DocumentString\" to \"bar\".dq(),\n            \"DocumentNumberPosInt\" to \"1000\",\n            \"DocumentNumberNegInt\" to \"-1000\",\n            \"DocumentNumberFloat\" to \"0.01\",\n            \"DocumentList\" to \"[]\",\n            \"DocumentMap\" to \"{}\",\n        )\n\n    @ParameterizedTest(name = \"(#{index}) Server builders and default values. Params = requiredTrait: {0}, nullDefault: {1}, applyDefaultValues: {2}, builderGeneratorKind: {3}, assertValues: {4}\")\n    @MethodSource(\"testParameters\")\n    fun `default values are generated and builders respect default and overrides`(\n        requiredTrait: Boolean,\n        nullDefault: Boolean,\n        applyDefaultValues: Boolean,\n        builderGeneratorKind: BuilderGeneratorKind,\n        assertValues: Map<String, String?>,\n    ) {\n        println(\"Running test with params = requiredTrait: $requiredTrait, nullDefault: $nullDefault, applyDefaultValues: $applyDefaultValues, builderGeneratorKind: $builderGeneratorKind, assertValues: $assertValues\")\n        val initialSetValues = this.defaultValues.mapValues { if (nullDefault) null else it.value }\n        val model = generateModel(requiredTrait, applyDefaultValues, nullDefault, initialSetValues)\n        val symbolProvider = serverTestSymbolProvider(model)\n        val project = TestWorkspace.testProject(symbolProvider)\n\n        project.withModule(RustModule.public(\"model\")) {\n            when (builderGeneratorKind) {\n                BuilderGeneratorKind.SERVER_BUILDER_GENERATOR -> {\n                    writeServerBuilderGenerator(project, this, model, symbolProvider)\n                }\n\n                BuilderGeneratorKind.SERVER_BUILDER_GENERATOR_WITHOUT_PUBLIC_CONSTRAINED_TYPES -> {\n                    writeServerBuilderGeneratorWithoutPublicConstrainedTypes(project, this, model, symbolProvider)\n                }\n            }\n\n            val rustValues = setupRustValuesForTest(assertValues)\n            val setters =\n                if (applyDefaultValues) {\n                    structSetters(rustValues, nullDefault && !requiredTrait)\n                } else {\n                    writable { }\n                }\n            val unwrapBuilder = if (nullDefault && requiredTrait && applyDefaultValues) \".unwrap()\" else \"\"\n            unitTest(\n                name = \"generates_default_required_values\",\n                block =\n                    writable {\n                        rustTemplate(\n                            \"\"\"\n                            let my_struct = MyStruct::builder()\n                                #{Setters:W}\n                                .build()\n                                $unwrapBuilder;\n\n                            #{Assertions:W}\n                            \"\"\",\n                            \"Assertions\" to\n                                assertions(\n                                    rustValues,\n                                    applyDefaultValues,\n                                    nullDefault,\n                                    requiredTrait,\n                                    applyDefaultValues,\n                                ),\n                            \"Setters\" to setters,\n                        )\n                    },\n            )\n        }\n\n        project.renderInlineMemoryModules()\n        // Run clippy because the builder's code for handling `@default` is prone to upset it.\n        project.compileAndTest(runClippy = true)\n    }\n\n    private fun setupRustValuesForTest(valuesMap: Map<String, String?>): Map<String, String?> {\n        return valuesMap +\n            mapOf(\n                \"Byte\" to \"${valuesMap[\"Byte\"]}i8\",\n                \"Short\" to \"${valuesMap[\"Short\"]}i16\",\n                \"Integer\" to \"${valuesMap[\"Integer\"]}i32\",\n                \"Long\" to \"${valuesMap[\"Long\"]}i64\",\n                \"Float\" to \"${valuesMap[\"Float\"]}f32\",\n                \"Double\" to \"${valuesMap[\"Double\"]}f64\",\n                \"Language\" to \"crate::model::Language::${valuesMap[\"Language\"]!!.replace(\"\"\"\"\"\"\", \"\").toPascalCase()}\",\n                \"Timestamp\" to \"\"\"aws_smithy_types::DateTime::from_str(${valuesMap[\"Timestamp\"]}, aws_smithy_types::date_time::Format::DateTime).unwrap()\"\"\",\n                // These must be empty\n                \"StringList\" to \"Vec::<String>::new()\",\n                \"IntegerMap\" to \"std::collections::HashMap::<String, i32>::new()\",\n                \"DocumentList\" to \"Vec::<aws_smithy_types::Document>::new()\",\n                \"DocumentMap\" to \"std::collections::HashMap::<String, aws_smithy_types::Document>::new()\",\n            ) +\n            valuesMap\n                .filter { it.value?.startsWith(\"Document\") ?: false }\n                .map { it.key to \"${it.value}.into()\" }\n    }\n\n    private fun writeServerBuilderGeneratorWithoutPublicConstrainedTypes(\n        rustCrate: RustCrate,\n        writer: RustWriter,\n        model: Model,\n        symbolProvider: RustSymbolProvider,\n    ) {\n        val struct = model.lookup<StructureShape>(\"com.test#MyStruct\")\n        val codegenContext =\n            serverTestCodegenContext(\n                model,\n                settings =\n                    serverTestRustSettings(\n                        codegenConfig = ServerCodegenConfig(publicConstrainedTypes = false),\n                    ),\n            )\n        val builderGenerator =\n            ServerBuilderGeneratorWithoutPublicConstrainedTypes(\n                codegenContext,\n                struct,\n                SmithyValidationExceptionConversionGenerator(codegenContext),\n                ServerRestJsonProtocol(codegenContext),\n            )\n\n        writer.implBlock(symbolProvider.toSymbol(struct)) {\n            builderGenerator.renderConvenienceMethod(writer)\n        }\n        builderGenerator.render(rustCrate, writer)\n\n        ServerEnumGenerator(\n            codegenContext,\n            model.lookup<EnumShape>(\"com.test#Language\"),\n            SmithyValidationExceptionConversionGenerator(codegenContext),\n            emptyList(),\n        ).render(writer)\n        StructureGenerator(model, symbolProvider, writer, struct, emptyList(), codegenContext.structSettings()).render()\n    }\n\n    private fun writeServerBuilderGenerator(\n        rustCrate: RustCrate,\n        writer: RustWriter,\n        model: Model,\n        symbolProvider: RustSymbolProvider,\n    ) {\n        val struct = model.lookup<StructureShape>(\"com.test#MyStruct\")\n        val codegenContext = serverTestCodegenContext(model)\n        val builderGenerator =\n            ServerBuilderGenerator(\n                codegenContext,\n                struct,\n                SmithyValidationExceptionConversionGenerator(codegenContext),\n                ServerRestJsonProtocol(codegenContext),\n            )\n\n        writer.implBlock(symbolProvider.toSymbol(struct)) {\n            builderGenerator.renderConvenienceMethod(writer)\n        }\n        builderGenerator.render(rustCrate, writer)\n\n        ServerEnumGenerator(\n            codegenContext,\n            model.lookup<EnumShape>(\"com.test#Language\"),\n            SmithyValidationExceptionConversionGenerator(codegenContext),\n            emptyList(),\n        ).render(writer)\n        StructureGenerator(model, symbolProvider, writer, struct, emptyList(), codegenContext.structSettings()).render()\n    }\n\n    private fun structSetters(\n        values: Map<String, String?>,\n        optional: Boolean,\n    ) = writable {\n        for ((key, value) in values) {\n            withBlock(\".${key.toSnakeCase()}(\", \")\") {\n                conditionalBlock(\"Some(\", \")\", optional) {\n                    when (key) {\n                        \"String\" -> rust(\"$value.into()\")\n                        \"DocumentNull\" -> rust(\"aws_smithy_types::Document::Null\")\n                        \"DocumentString\" -> rust(\"aws_smithy_types::Document::String(String::from($value))\")\n\n                        else -> {\n                            if (key.startsWith(\"DocumentNumber\")) {\n                                val type = key.replace(\"DocumentNumber\", \"\")\n                                rust(\"aws_smithy_types::Document::Number(aws_smithy_types::Number::$type($value))\")\n                            } else {\n                                rust(\"$value.into()\")\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    }\n\n    private fun assertions(\n        values: Map<String, String?>,\n        hasSetValues: Boolean,\n        hasNullValues: Boolean,\n        requiredTrait: Boolean,\n        hasDefaults: Boolean,\n    ) = writable {\n        for ((key, value) in values) {\n            val member = \"my_struct.${key.toSnakeCase()}\"\n\n            if (!hasSetValues) {\n                rust(\"assert!($member.is_none());\")\n            } else {\n                val actual =\n                    writable {\n                        rust(member)\n                        if (!requiredTrait && !(hasDefaults && !hasNullValues)) {\n                            rust(\".unwrap()\")\n                        }\n                    }\n                val expected =\n                    writable {\n                        val expected =\n                            if (key == \"DocumentNull\") {\n                                \"aws_smithy_types::Document::Null\"\n                            } else if (key == \"DocumentString\") {\n                                \"String::from($value).into()\"\n                            } else if (key.startsWith(\"DocumentNumber\")) {\n                                val type = key.replace(\"DocumentNumber\", \"\")\n                                \"aws_smithy_types::Document::Number(aws_smithy_types::Number::$type($value))\"\n                            } else if (key.startsWith(\"Document\")) {\n                                \"$value.into()\"\n                            } else {\n                                \"$value\"\n                            }\n                        rust(expected)\n                    }\n                rustTemplate(\"assert_eq!(#{Actual:W}, #{Expected:W});\", \"Actual\" to actual, \"Expected\" to expected)\n            }\n        }\n    }\n\n    private fun generateModel(\n        requiredTrait: Boolean,\n        applyDefaultValues: Boolean,\n        nullDefault: Boolean,\n        values: Map<String, String?>,\n    ): Model {\n        val requiredOrNot = if (requiredTrait) \"@required\" else \"\"\n\n        val members =\n            values.entries.joinToString(\", \") {\n                val value =\n                    if (applyDefaultValues) {\n                        \"= ${it.value}\"\n                    } else if (nullDefault) {\n                        \"= null\"\n                    } else {\n                        \"\"\n                    }\n                \"\"\"\n                $requiredOrNot\n                ${it.key.toPascalCase()}: ${it.key} $value\n                \"\"\"\n            }\n        val model =\n            \"\"\"\n            namespace com.test\n\n            structure MyStruct {\n                $members\n            }\n\n            enum Language {\n                EN = \"en\",\n                FR = \"fr\",\n            }\n\n            list StringList {\n                member: String\n            }\n\n            map IntegerMap {\n                key: String\n                value: Integer\n            }\n\n            document DocumentNull\n            document DocumentBoolean\n            document DocumentString\n            document DocumentDecimal\n            document DocumentNumberNegInt\n            document DocumentNumberPosInt\n            document DocumentNumberFloat\n            document DocumentList\n            document DocumentMap\n            \"\"\"\n        return model.asSmithyModel(smithyVersion = \"2\")\n    }\n\n    /**\n     * The builder generator we should test.\n     * We use an enum instead of directly passing in the closure so that JUnit can print a helpful string in the test\n     * report.\n     */\n    enum class BuilderGeneratorKind {\n        SERVER_BUILDER_GENERATOR,\n        SERVER_BUILDER_GENERATOR_WITHOUT_PUBLIC_CONSTRAINED_TYPES,\n    }\n\n    private fun testParameters(): Stream<Arguments> {\n        val builderGeneratorKindList =\n            listOf(\n                BuilderGeneratorKind.SERVER_BUILDER_GENERATOR,\n                BuilderGeneratorKind.SERVER_BUILDER_GENERATOR_WITHOUT_PUBLIC_CONSTRAINED_TYPES,\n            )\n        return Stream.of(\n            TestConfig(defaultValues, requiredTrait = false, nullDefault = true, applyDefaultValues = true),\n            TestConfig(defaultValues, requiredTrait = false, nullDefault = true, applyDefaultValues = false),\n            TestConfig(customValues, requiredTrait = false, nullDefault = true, applyDefaultValues = true),\n            TestConfig(customValues, requiredTrait = false, nullDefault = true, applyDefaultValues = false),\n            TestConfig(defaultValues, requiredTrait = true, nullDefault = true, applyDefaultValues = true),\n            TestConfig(customValues, requiredTrait = true, nullDefault = true, applyDefaultValues = true),\n            TestConfig(defaultValues, requiredTrait = false, nullDefault = false, applyDefaultValues = true),\n            TestConfig(defaultValues, requiredTrait = false, nullDefault = false, applyDefaultValues = false),\n            TestConfig(customValues, requiredTrait = false, nullDefault = false, applyDefaultValues = true),\n            TestConfig(customValues, requiredTrait = false, nullDefault = false, applyDefaultValues = false),\n            TestConfig(defaultValues, requiredTrait = true, nullDefault = false, applyDefaultValues = true),\n            TestConfig(customValues, requiredTrait = true, nullDefault = false, applyDefaultValues = true),\n        ).flatMap { (assertValues, requiredTrait, nullDefault, applyDefaultValues) ->\n            builderGeneratorKindList.stream().map { builderGeneratorKind ->\n                Arguments.of(requiredTrait, nullDefault, applyDefaultValues, builderGeneratorKind, assertValues)\n            }\n        }\n    }\n\n    data class TestConfig(\n        // The values in the `assert!()` calls and for the `@default` trait\n        val assertValues: Map<String, String?>,\n        // Whether to apply @required to all members\n        val requiredTrait: Boolean,\n        // Whether to set all members to `null` and force them to be optional\n        val nullDefault: Boolean,\n        // Whether to set `assertValues` in the builder\n        val applyDefaultValues: Boolean,\n    )\n}\n"
  },
  {
    "path": "codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderGeneratorTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.generators\n\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.codegen.core.Symbol\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute\nimport software.amazon.smithy.rust.codegen.core.rustlang.implBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.expectRustMetadata\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.StructureGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.meta\nimport software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.compileAndTest\nimport software.amazon.smithy.rust.codegen.core.testutil.unitTest\nimport software.amazon.smithy.rust.codegen.core.util.lookup\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerRustModule\nimport software.amazon.smithy.rust.codegen.server.smithy.customizations.SmithyValidationExceptionConversionGenerator\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.protocol.ServerRestJsonProtocol\nimport software.amazon.smithy.rust.codegen.server.smithy.renderInlineMemoryModules\nimport software.amazon.smithy.rust.codegen.server.smithy.testutil.serverTestCodegenContext\n\nclass ServerBuilderGeneratorTest {\n    @Test\n    fun `it respects the sensitive trait in Debug impl`() {\n        val model =\n            \"\"\"\n            namespace test\n            @sensitive\n            string SecretKey\n\n            @sensitive\n            string Password\n\n            structure Credentials {\n                username: String,\n                password: Password,\n                secretKey: SecretKey\n            }\n            \"\"\".asSmithyModel()\n\n        val codegenContext = serverTestCodegenContext(model)\n        val project = TestWorkspace.testProject()\n        project.withModule(ServerRustModule.Model) {\n            val writer = this\n            val shape = model.lookup<StructureShape>(\"test#Credentials\")\n\n            StructureGenerator(model, codegenContext.symbolProvider, writer, shape, emptyList(), codegenContext.structSettings()).render()\n            val builderGenerator =\n                ServerBuilderGenerator(\n                    codegenContext,\n                    shape,\n                    SmithyValidationExceptionConversionGenerator(codegenContext),\n                    ServerRestJsonProtocol(codegenContext),\n                )\n\n            builderGenerator.render(project, writer)\n\n            writer.implBlock(codegenContext.symbolProvider.toSymbol(shape)) {\n                builderGenerator.renderConvenienceMethod(this)\n            }\n\n            project.renderInlineMemoryModules()\n        }\n\n        project.unitTest {\n            rust(\n                \"\"\"\n                use super::*;\n                use crate::model::*;\n                let builder = Credentials::builder()\n                    .username(Some(\"admin\".to_owned()))\n                    .password(Some(\"pswd\".to_owned()))\n                    .secret_key(Some(\"12345\".to_owned()));\n                     assert_eq!(format!(\"{:?}\", builder), \"Builder { username: Some(\\\"admin\\\"), password: \\\"*** Sensitive Data Redacted ***\\\", secret_key: \\\"*** Sensitive Data Redacted ***\\\" }\");\n                \"\"\",\n            )\n        }\n        project.compileAndTest()\n    }\n\n    @Test\n    fun `builder doesn't inherit attributes from struct`() {\n        /**\n         * This test checks if the generated Builder doesn't inherit the macro attributes added to the main struct.\n         *\n         * The strategy is to:\n         * 1) mark the `Inner` struct with `#[deprecated]`\n         * 2) deny use of deprecated in the test\n         * 3) allow use of deprecated by the Builder\n         * 4) Ensure that the builder can be instantiated\n         */\n        val model =\n            \"\"\"\n            namespace test\n\n            structure Inner {}\n            \"\"\".asSmithyModel()\n\n        class SymbolProviderWithExtraAnnotation(val base: RustSymbolProvider) : RustSymbolProvider by base {\n            override fun toSymbol(shape: Shape): Symbol {\n                val baseSymbol = base.toSymbol(shape)\n                val name = baseSymbol.name\n                if (name == \"Inner\") {\n                    var metadata = baseSymbol.expectRustMetadata()\n                    val attribute = Attribute.Deprecated\n                    metadata = metadata.copy(additionalAttributes = metadata.additionalAttributes + listOf(attribute))\n                    return baseSymbol.toBuilder().meta(metadata).build()\n                } else {\n                    return baseSymbol\n                }\n            }\n        }\n\n        val codegenContext = serverTestCodegenContext(model)\n        val provider = SymbolProviderWithExtraAnnotation(codegenContext.symbolProvider)\n        val project = TestWorkspace.testProject(provider)\n        project.withModule(ServerRustModule.Model) {\n            val shape = model.lookup<StructureShape>(\"test#Inner\")\n            val writer = this\n\n            rust(\"##![allow(deprecated)]\")\n            StructureGenerator(model, provider, writer, shape, emptyList(), codegenContext.structSettings()).render()\n            val builderGenerator =\n                ServerBuilderGenerator(\n                    codegenContext,\n                    shape,\n                    SmithyValidationExceptionConversionGenerator(codegenContext),\n                    ServerRestJsonProtocol(codegenContext),\n                )\n\n            builderGenerator.render(project, writer)\n\n            writer.implBlock(provider.toSymbol(shape)) {\n                builderGenerator.renderConvenienceMethod(this)\n            }\n\n            project.renderInlineMemoryModules()\n        }\n        project.unitTest(additionalAttributes = listOf(Attribute.DenyDeprecated), test = {\n            rust(\n                // Notice that the builder is instantiated directly, and not through the Inner::builder() method.\n                // This is because Inner is marked with `deprecated`, so any usage of `Inner` inside the test will\n                // fail the compilation.\n                //\n                // This piece of code would fail though if the Builder inherits the attributes from Inner.\n                \"\"\"\n                let _ = crate::model::inner::Builder::default();\n                \"\"\",\n            )\n        })\n        project.compileAndTest()\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerEnumGeneratorTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.generators\n\nimport io.kotest.matchers.string.shouldNotContain\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.model.shapes.StringShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.compileAndTest\nimport software.amazon.smithy.rust.codegen.core.util.lookup\nimport software.amazon.smithy.rust.codegen.server.smithy.customizations.SmithyValidationExceptionConversionGenerator\nimport software.amazon.smithy.rust.codegen.server.smithy.testutil.serverTestCodegenContext\n\nclass ServerEnumGeneratorTest {\n    private val model =\n        \"\"\"\n        namespace test\n        @enum([\n            {\n                value: \"t2.nano\",\n                name: \"T2_NANO\",\n                documentation: \"T2 instances are Burstable Performance Instances.\",\n                tags: [\"ebsOnly\"]\n            },\n            {\n                value: \"t2.micro\",\n                name: \"T2_MICRO\",\n                documentation: \"T2 instances are Burstable Performance Instances.\",\n                tags: [\"ebsOnly\"]\n            },\n        ])\n        string InstanceType\n        \"\"\".asSmithyModel()\n\n    private val codegenContext = serverTestCodegenContext(model)\n    private val writer = RustWriter.forModule(\"model\")\n    private val shape = model.lookup<StringShape>(\"test#InstanceType\")\n\n    @Test\n    fun `it generates TryFrom, FromStr and errors for enums`() {\n        ServerEnumGenerator(\n            codegenContext,\n            shape,\n            SmithyValidationExceptionConversionGenerator(codegenContext),\n            emptyList(),\n        ).render(writer)\n        writer.compileAndTest(\n            \"\"\"\n            use std::str::FromStr;\n            assert_eq!(InstanceType::try_from(\"t2.nano\").unwrap(), InstanceType::T2Nano);\n            assert_eq!(InstanceType::from_str(\"t2.nano\").unwrap(), InstanceType::T2Nano);\n            assert_eq!(InstanceType::try_from(\"unknown\").unwrap_err(), crate::model::instance_type::ConstraintViolation(String::from(\"unknown\")));\n            \"\"\",\n        )\n    }\n\n    @Test\n    fun `it generates enums without the unknown variant`() {\n        ServerEnumGenerator(\n            codegenContext,\n            shape,\n            SmithyValidationExceptionConversionGenerator(codegenContext),\n            emptyList(),\n        ).render(writer)\n        writer.compileAndTest(\n            \"\"\"\n            // Check no `Unknown` variant.\n            let instance = InstanceType::T2Micro;\n            match instance {\n                InstanceType::T2Micro => (),\n                InstanceType::T2Nano => (),\n            }\n            \"\"\",\n        )\n    }\n\n    @Test\n    fun `it generates enums without non_exhaustive`() {\n        ServerEnumGenerator(\n            codegenContext,\n            shape,\n            SmithyValidationExceptionConversionGenerator(codegenContext),\n            emptyList(),\n        ).render(writer)\n        writer.toString() shouldNotContain \"#[non_exhaustive]\"\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerHttpSensitivityGeneratorTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.generators\n\nimport org.junit.jupiter.api.Assertions.assertEquals\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.model.traits.HttpTrait\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.compileAndTest\nimport software.amazon.smithy.rust.codegen.core.testutil.testModule\nimport software.amazon.smithy.rust.codegen.core.testutil.unitTest\nimport software.amazon.smithy.rust.codegen.core.util.getTrait\nimport software.amazon.smithy.rust.codegen.core.util.inputShape\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerCargoDependency\nimport software.amazon.smithy.rust.codegen.server.smithy.testutil.ServerTestRuntimeConfig\nimport software.amazon.smithy.rust.codegen.server.smithy.testutil.serverTestSymbolProvider\n\nclass ServerHttpSensitivityGeneratorTest {\n    private val codegenScope =\n        arrayOf(\n            \"SmithyHttpServer\" to ServerCargoDependency.smithyHttpServer(ServerTestRuntimeConfig).toType(),\n            \"Http\" to CargoDependency.Http0x.toType(),\n        )\n\n    @Test\n    fun `query closure`() {\n        val model =\n            \"\"\"\n            namespace test\n\n            operation Secret {\n                input: Input,\n            }\n\n            @sensitive\n            string SensitiveString\n\n            structure Input {\n                @required\n                @httpQuery(\"query_a\")\n                queryA: String,\n\n                @required\n                @httpQuery(\"query_b\")\n                queryB: SensitiveString\n            }\n            \"\"\".asSmithyModel()\n        val operation = model.operationShapes.toList()[0]\n        val generator = ServerHttpSensitivityGenerator(model, operation, ServerTestRuntimeConfig)\n\n        val input = generator.input()!!\n        val querySensitivity = generator.findQuerySensitivity(input)\n        assert(!querySensitivity.allKeysSensitive)\n        assertEquals(listOf(\"query_b\"), (querySensitivity as QuerySensitivity.NotSensitiveMapValue).queryKeys)\n\n        val testProject = TestWorkspace.testProject(serverTestSymbolProvider(model))\n        testProject.testModule {\n            unitTest(\"query_closure\") {\n                rustTemplate(\n                    \"\"\"\n                    let closure = #{Closure:W};\n                    assert_eq!(closure(\"query_a\"), #{SmithyHttpServer}::instrumentation::sensitivity::uri::QueryMarker { key: false, value: false });\n                    assert_eq!(closure(\"query_b\"), #{SmithyHttpServer}::instrumentation::sensitivity::uri::QueryMarker { key: false, value: true });\n                    \"\"\",\n                    \"Closure\" to querySensitivity.closure(),\n                    *codegenScope,\n                )\n            }\n        }\n\n        testProject.compileAndTest()\n    }\n\n    @Test\n    fun `query params closure`() {\n        val model =\n            \"\"\"\n            namespace test\n\n            operation Secret {\n                input: Input,\n            }\n\n            map StringMap {\n                key: String,\n                value: String\n            }\n\n            @sensitive\n            structure Input {\n                @required\n                @httpQueryParams()\n                params: StringMap,\n            }\n            \"\"\".asSmithyModel()\n        val operation = model.operationShapes.toList()[0]\n        val generator = ServerHttpSensitivityGenerator(model, operation, ServerTestRuntimeConfig)\n\n        val input = generator.input()!!\n        val querySensitivity = generator.findQuerySensitivity(input)\n\n        assert(querySensitivity.allKeysSensitive)\n        querySensitivity as QuerySensitivity.SensitiveMapValue\n\n        val testProject = TestWorkspace.testProject(serverTestSymbolProvider(model))\n        testProject.testModule {\n            unitTest(\"query_params_closure\") {\n                rustTemplate(\n                    \"\"\"\n                    let closure = #{Closure:W};\n                    assert_eq!(closure(\"wildcard\"), #{SmithyHttpServer}::instrumentation::sensitivity::uri::QueryMarker { key: true, value: true });\n                    \"\"\",\n                    \"Closure\" to querySensitivity.closure(),\n                    *codegenScope,\n                )\n            }\n        }\n        testProject.compileAndTest()\n    }\n\n    @Test\n    fun `query params key closure`() {\n        val model =\n            \"\"\"\n            namespace test\n\n            operation Secret {\n                input: Input,\n            }\n\n            structure Input {\n                @required\n                @httpQueryParams()\n                queryMap: QueryMap,\n            }\n\n            @sensitive\n            string SensitiveKey\n\n            map QueryMap {\n                key: SensitiveKey,\n                value: String\n            }\n\n            \"\"\".asSmithyModel()\n        val operation = model.operationShapes.toList()[0]\n        val generator = ServerHttpSensitivityGenerator(model, operation, ServerTestRuntimeConfig)\n\n        val input = generator.input()!!\n        val querySensitivity = generator.findQuerySensitivity(input)\n        assert(querySensitivity.allKeysSensitive)\n        assert((querySensitivity as QuerySensitivity.NotSensitiveMapValue).queryKeys.isEmpty())\n\n        val testProject = TestWorkspace.testProject(serverTestSymbolProvider(model))\n        testProject.testModule {\n            unitTest(\"query_params_special_closure\") {\n                rustTemplate(\n                    \"\"\"\n                    let closure = #{Closure:W};\n                    assert_eq!(closure(\"wildcard\"), #{SmithyHttpServer}::instrumentation::sensitivity::uri::QueryMarker { key: true, value: false });\n                    \"\"\",\n                    \"Closure\" to querySensitivity.closure(),\n                    *codegenScope,\n                )\n            }\n        }\n        testProject.compileAndTest()\n    }\n\n    @Test\n    fun `query params value closure`() {\n        val model =\n            \"\"\"\n            namespace test\n\n            operation Secret {\n                input: Input,\n            }\n\n            structure Input {\n                @required\n                @httpQueryParams()\n                queryMap: QueryMap,\n            }\n\n            @sensitive\n            string SensitiveValue\n\n            map QueryMap {\n                key: String,\n                value: SensitiveValue\n            }\n\n            \"\"\".asSmithyModel()\n        val operation = model.operationShapes.toList()[0]\n        val generator = ServerHttpSensitivityGenerator(model, operation, ServerTestRuntimeConfig)\n\n        val input = generator.input()!!\n        val querySensitivity = generator.findQuerySensitivity(input)\n        assert(!querySensitivity.allKeysSensitive)\n        querySensitivity as QuerySensitivity.SensitiveMapValue\n\n        val testProject = TestWorkspace.testProject(serverTestSymbolProvider(model))\n        testProject.testModule {\n            unitTest(\"query_params_special_closure\") {\n                rustTemplate(\n                    \"\"\"\n                    let closure = #{Closure:W};\n                    assert_eq!(closure(\"wildcard\"), #{SmithyHttpServer}::instrumentation::sensitivity::uri::QueryMarker { key: false, value: true });\n                    \"\"\",\n                    \"Closure\" to querySensitivity.closure(),\n                    *codegenScope,\n                )\n            }\n        }\n        testProject.compileAndTest()\n    }\n\n    @Test\n    fun `query params none`() {\n        val model =\n            \"\"\"\n            namespace test\n\n            operation Secret {\n                input: Input,\n            }\n\n            structure Input {\n                @required\n                @httpQueryParams()\n                queryMap: QueryMap,\n            }\n\n            map QueryMap {\n                key: String,\n                value: String\n            }\n\n            \"\"\".asSmithyModel()\n        val operation = model.operationShapes.toList()[0]\n        val generator = ServerHttpSensitivityGenerator(model, operation, ServerTestRuntimeConfig)\n\n        val input = generator.input()!!\n        val querySensitivity = generator.findQuerySensitivity(input)\n        assert(!querySensitivity.allKeysSensitive)\n        querySensitivity as QuerySensitivity.NotSensitiveMapValue\n        assert(!querySensitivity.hasRedactions())\n    }\n\n    @Test\n    fun `header closure`() {\n        val model =\n            \"\"\"\n            namespace test\n\n            operation Secret {\n                input: Input,\n            }\n\n            @sensitive\n            string SensitiveString\n\n            structure Input {\n                @required\n                @httpHeader(\"header-a\")\n                headerA: String,\n\n                @required\n                @httpHeader(\"header-b\")\n                headerB: SensitiveString\n            }\n            \"\"\".asSmithyModel()\n        val operation = model.operationShapes.toList()[0]\n        val generator = ServerHttpSensitivityGenerator(model, operation, ServerTestRuntimeConfig)\n\n        val inputShape = operation.inputShape(model)\n        val headerData = generator.findHeaderSensitivity(inputShape)\n        assertEquals(listOf(\"header-b\"), headerData.headerKeys)\n        assertEquals(null, (headerData as HeaderSensitivity.NotSensitiveMapValue).prefixHeader)\n\n        val testProject = TestWorkspace.testProject(serverTestSymbolProvider(model))\n        testProject.testModule {\n            unitTest(\"header_closure\") {\n                rustTemplate(\n                    \"\"\"\n                    let closure = #{Closure:W};\n                    let name = #{Http}::header::HeaderName::from_static(\"header-a\");\n                    assert_eq!(closure(&name), #{SmithyHttpServer}::instrumentation::sensitivity::headers::HeaderMarker { value: false, key_suffix: None });\n                    let name = #{Http}::header::HeaderName::from_static(\"header-b\");\n                    assert_eq!(closure(&name), #{SmithyHttpServer}::instrumentation::sensitivity::headers::HeaderMarker { value: true, key_suffix: None });\n                    \"\"\",\n                    \"Closure\" to headerData.closure(),\n                    *codegenScope,\n                )\n            }\n        }\n        testProject.compileAndTest()\n    }\n\n    @Test\n    fun `prefix header closure`() {\n        val model =\n            \"\"\"\n            namespace test\n\n            operation Secret {\n                input: Input,\n            }\n\n            @sensitive\n            structure Input {\n                @required\n                @httpPrefixHeaders(\"prefix-\")\n                prefixMap: PrefixMap,\n            }\n\n            map PrefixMap {\n                key: String,\n                value: String\n            }\n\n            \"\"\".asSmithyModel()\n        val operation = model.operationShapes.toList()[0]\n        val generator = ServerHttpSensitivityGenerator(model, operation, ServerTestRuntimeConfig)\n\n        val inputShape = operation.inputShape(model)\n        val headerData = generator.findHeaderSensitivity(inputShape)\n        assertEquals(\"prefix-\", (headerData as HeaderSensitivity.SensitiveMapValue).prefixHeader)\n\n        val testProject = TestWorkspace.testProject(serverTestSymbolProvider(model))\n        testProject.testModule {\n            unitTest(\"prefix_headers_closure\") {\n                rustTemplate(\n                    \"\"\"\n                    let closure = #{Closure:W};\n                    let name = #{Http}::header::HeaderName::from_static(\"prefix-a\");\n                    assert_eq!(closure(&name), #{SmithyHttpServer}::instrumentation::sensitivity::headers::HeaderMarker { value: true, key_suffix: Some(7) });\n                    let name = #{Http}::header::HeaderName::from_static(\"prefix-b\");\n                    assert_eq!(closure(&name), #{SmithyHttpServer}::instrumentation::sensitivity::headers::HeaderMarker { value: true, key_suffix: Some(7) });\n                    let name = #{Http}::header::HeaderName::from_static(\"other\");\n                    assert_eq!(closure(&name), #{SmithyHttpServer}::instrumentation::sensitivity::headers::HeaderMarker { value: false, key_suffix: None });\n                    \"\"\",\n                    \"Closure\" to headerData.closure(),\n                    *codegenScope,\n                )\n            }\n        }\n        testProject.compileAndTest()\n    }\n\n    @Test\n    fun `prefix header none`() {\n        val model =\n            \"\"\"\n            namespace test\n\n            operation Secret {\n                input: Input,\n            }\n\n            structure Input {\n                @required\n                @httpPrefixHeaders(\"prefix-\")\n                prefixMap: PrefixMap,\n            }\n\n            map PrefixMap {\n                key: String,\n                value: String\n            }\n\n            \"\"\".asSmithyModel()\n        val operation = model.operationShapes.toList()[0]\n        val generator = ServerHttpSensitivityGenerator(model, operation, ServerTestRuntimeConfig)\n\n        val inputShape = operation.inputShape(model)\n        val headerData = generator.findHeaderSensitivity(inputShape)\n        headerData as HeaderSensitivity.NotSensitiveMapValue\n        assert(!headerData.hasRedactions())\n    }\n\n    @Test\n    fun `prefix headers key closure`() {\n        val model =\n            \"\"\"\n            namespace test\n\n            operation Secret {\n                input: Input,\n            }\n\n            structure Input {\n                @required\n                @httpPrefixHeaders(\"prefix-\")\n                prefix_map: PrefixMap,\n            }\n\n            @sensitive\n            string SensitiveKey\n            map PrefixMap {\n                key: SensitiveKey,\n                value: String\n            }\n\n            \"\"\".asSmithyModel()\n        val operation = model.operationShapes.toList()[0]\n        val generator = ServerHttpSensitivityGenerator(model, operation, ServerTestRuntimeConfig)\n\n        val inputShape = operation.inputShape(model)\n        val headerData = generator.findHeaderSensitivity(inputShape)\n        assert(headerData.headerKeys.isEmpty())\n        val asMapValue = (headerData as HeaderSensitivity.NotSensitiveMapValue)\n        assertEquals(\"prefix-\", asMapValue.prefixHeader)\n\n        val testProject = TestWorkspace.testProject(serverTestSymbolProvider(model))\n        testProject.testModule {\n            unitTest(\"prefix_headers_special_closure\") {\n                rustTemplate(\n                    \"\"\"\n                    let closure = #{Closure:W};\n                    let name = #{Http}::header::HeaderName::from_static(\"prefix-a\");\n                    assert_eq!(closure(&name), #{SmithyHttpServer}::instrumentation::sensitivity::headers::HeaderMarker { value: false, key_suffix: Some(7) });\n                    let name = #{Http}::header::HeaderName::from_static(\"prefix-b\");\n                    assert_eq!(closure(&name), #{SmithyHttpServer}::instrumentation::sensitivity::headers::HeaderMarker { value: false, key_suffix: Some(7) });\n                    let name = #{Http}::header::HeaderName::from_static(\"other\");\n                    assert_eq!(closure(&name), #{SmithyHttpServer}::instrumentation::sensitivity::headers::HeaderMarker { value: false, key_suffix: None });\n                    \"\"\",\n                    \"Closure\" to headerData.closure(),\n                    *codegenScope,\n                )\n            }\n        }\n        testProject.compileAndTest()\n    }\n\n    @Test\n    fun `prefix headers value closure`() {\n        val model =\n            \"\"\"\n            namespace test\n\n            operation Secret {\n                input: Input,\n            }\n\n            structure Input {\n                @required\n                @httpPrefixHeaders(\"prefix-\")\n                prefix_map: PrefixMap,\n            }\n\n            @sensitive\n            string SensitiveValue\n\n            map PrefixMap {\n                key: String,\n                value: SensitiveValue\n            }\n            \"\"\".asSmithyModel()\n        val operation = model.operationShapes.toList()[0]\n        val generator = ServerHttpSensitivityGenerator(model, operation, ServerTestRuntimeConfig)\n\n        val inputShape = operation.inputShape(model)\n        val headerData = generator.findHeaderSensitivity(inputShape)\n        assert(headerData.headerKeys.isEmpty())\n        val asSensitiveMapValue = (headerData as HeaderSensitivity.SensitiveMapValue)\n        assertEquals(\"prefix-\", asSensitiveMapValue.prefixHeader)\n        assert(!asSensitiveMapValue.keySensitive)\n\n        val testProject = TestWorkspace.testProject(serverTestSymbolProvider(model))\n        testProject.testModule {\n            unitTest(\"prefix_headers_special_closure\") {\n                rustTemplate(\n                    \"\"\"\n                    let closure = #{Closure:W};\n                    let name = #{Http}::header::HeaderName::from_static(\"prefix-a\");\n                    assert_eq!(closure(&name), #{SmithyHttpServer}::instrumentation::sensitivity::headers::HeaderMarker { value: true, key_suffix: None });\n                    let name = #{Http}::header::HeaderName::from_static(\"prefix-b\");\n                    assert_eq!(closure(&name), #{SmithyHttpServer}::instrumentation::sensitivity::headers::HeaderMarker { value: true, key_suffix: None });\n                    let name = #{Http}::header::HeaderName::from_static(\"other\");\n                    assert_eq!(closure(&name), #{SmithyHttpServer}::instrumentation::sensitivity::headers::HeaderMarker { value: false, key_suffix: None });\n                    \"\"\",\n                    \"Closure\" to headerData.closure(),\n                    *codegenScope,\n                )\n            }\n        }\n        testProject.compileAndTest()\n    }\n\n    @Test\n    fun `uri closure`() {\n        val model =\n            \"\"\"\n            namespace test\n\n            @http(method: \"GET\", uri: \"/secret/{labelA}/{labelB}\")\n            operation Secret {\n                input: Input,\n            }\n\n            @sensitive\n            string SensitiveString\n\n            structure Input {\n                @required\n                @httpLabel\n                labelA: SensitiveString,\n                @required\n                @httpLabel\n                labelB: SensitiveString,\n            }\n            \"\"\".asSmithyModel()\n        val operation = model.operationShapes.toList()[0]\n        val generator = ServerHttpSensitivityGenerator(model, operation, ServerTestRuntimeConfig)\n\n        val input = generator.input()!!\n        val uri = operation.getTrait<HttpTrait>()!!.uri\n        val labelData = generator.findLabelSensitivity(uri, input)\n\n        assertEquals(listOf(1, 2), labelData.labelIndexes)\n\n        val testProject = TestWorkspace.testProject(serverTestSymbolProvider(model))\n        testProject.testModule {\n            unitTest(\"uri_closure\") {\n                rustTemplate(\n                    \"\"\"\n                    let closure = #{Closure:W};\n                    assert_eq!(closure(0), false);\n                    assert_eq!(closure(1), true);\n                    assert_eq!(closure(2), true);\n                    \"\"\",\n                    \"Closure\" to labelData.closure(),\n                    *codegenScope,\n                )\n            }\n        }\n        testProject.compileAndTest()\n    }\n\n    @Test\n    fun `uri greedy`() {\n        val model =\n            \"\"\"\n            namespace test\n\n            @http(method: \"GET\", uri: \"/secret/{labelA}/{labelB+}/labelC\")\n            operation Secret {\n                input: Input,\n            }\n\n            @sensitive\n            string SensitiveString\n\n            structure Input {\n                @required\n                @httpLabel\n                labelA: SensitiveString,\n                @required\n                @httpLabel\n                labelB: SensitiveString,\n            }\n            \"\"\".asSmithyModel()\n        val operation = model.operationShapes.toList()[0]\n        val generator = ServerHttpSensitivityGenerator(model, operation, ServerTestRuntimeConfig)\n\n        val input = generator.input()!!\n        val uri = operation.getTrait<HttpTrait>()!!.uri\n        val labelData = generator.findLabelSensitivity(uri, input)\n\n        assertEquals(listOf(1), labelData.labelIndexes)\n\n        val greedyLabel = labelData.greedyLabel!!\n        assertEquals(greedyLabel.segmentIndex, 2)\n        assertEquals(greedyLabel.endOffset, 7)\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerInstantiatorTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.generators\n\nimport io.kotest.matchers.string.shouldNotContain\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.model.node.Node\nimport software.amazon.smithy.model.node.ObjectNode\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.shapes.StringShape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.shapes.UnionShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustModule\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.withBlock\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.Instantiator\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.UnionGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.transformers.RecursiveShapeBoxer\nimport software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.compileAndTest\nimport software.amazon.smithy.rust.codegen.core.testutil.renderWithModelBuilder\nimport software.amazon.smithy.rust.codegen.core.testutil.unitTest\nimport software.amazon.smithy.rust.codegen.core.util.dq\nimport software.amazon.smithy.rust.codegen.core.util.lookup\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerRustModule\nimport software.amazon.smithy.rust.codegen.server.smithy.customizations.SmithyValidationExceptionConversionGenerator\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.protocol.ServerRestJsonProtocol\nimport software.amazon.smithy.rust.codegen.server.smithy.renderInlineMemoryModules\nimport software.amazon.smithy.rust.codegen.server.smithy.testutil.serverRenderWithModelBuilder\nimport software.amazon.smithy.rust.codegen.server.smithy.testutil.serverTestCodegenContext\n\nclass ServerInstantiatorTest {\n    // This model started off from the one in `InstantiatorTest.kt` from `codegen-core`.\n    private val model =\n        \"\"\"\n        namespace com.test\n\n        use smithy.framework#ValidationException\n\n        @documentation(\"this documents the shape\")\n        structure MyStruct {\n           foo: String,\n           @documentation(\"This *is* documentation about the member.\")\n           bar: PrimitiveInteger,\n           baz: Integer,\n           ts: Timestamp,\n           byteValue: Byte\n        }\n\n        list MyList {\n            member: String\n        }\n\n        @sparse\n        list MySparseList {\n            member: String\n        }\n\n        union MyUnion {\n            stringVariant: String,\n            numVariant: Integer\n        }\n\n        structure Inner {\n            map: NestedMap\n        }\n\n        map NestedMap {\n            key: String,\n            value: Inner\n        }\n\n        structure WithBox {\n            member: WithBox,\n            value: Integer\n        }\n\n        union NestedUnion {\n            struct: NestedStruct,\n            int: Integer\n        }\n\n        integer MyInteger\n\n        structure NestedStruct {\n            @required\n            str: String,\n            @required\n            num: MyInteger\n        }\n\n        structure MyStructRequired {\n            @required\n            str: String,\n            @required\n            primitiveInt: PrimitiveInteger,\n            @required\n            int: Integer,\n            @required\n            ts: Timestamp,\n            @required\n            byte: Byte\n            @required\n            union: NestedUnion,\n            @required\n            structure: NestedStruct,\n            @required\n            list: MyList,\n            @required\n            map: NestedMap,\n            @required\n            doc: Document\n        }\n\n        @enum([\n            { value: \"t2.nano\" },\n            { value: \"t2.micro\" },\n        ])\n        string UnnamedEnum\n\n        @enum([\n            {\n                value: \"t2.nano\",\n                name: \"T2_NANO\",\n            },\n            {\n                value: \"t2.micro\",\n                name: \"T2_MICRO\",\n            },\n        ])\n        string NamedEnum\n        \"\"\".asSmithyModel().let {\n            RecursiveShapeBoxer().transform(it)\n        }\n\n    private val codegenContext = serverTestCodegenContext(model)\n    private val symbolProvider = codegenContext.symbolProvider\n\n    @Test\n    fun `generate struct with missing required members`() {\n        val structure = model.lookup<StructureShape>(\"com.test#MyStructRequired\")\n        val inner = model.lookup<StructureShape>(\"com.test#Inner\")\n        val nestedStruct = model.lookup<StructureShape>(\"com.test#NestedStruct\")\n        val union = model.lookup<UnionShape>(\"com.test#NestedUnion\")\n        val sut = ServerInstantiator(codegenContext)\n        val data = Node.parse(\"{}\")\n\n        val project = TestWorkspace.testProject()\n\n        project.withModule(ServerRustModule.Model) {\n            val protocol = ServerRestJsonProtocol(codegenContext)\n            structure.serverRenderWithModelBuilder(project, model, symbolProvider, this, protocol)\n            inner.serverRenderWithModelBuilder(project, model, symbolProvider, this, protocol)\n            nestedStruct.serverRenderWithModelBuilder(project, model, symbolProvider, this, protocol)\n            UnionGenerator(model, symbolProvider, this, union).render()\n\n            withInlineModule(RustModule.inlineTests(), null) {\n                unitTest(\"server_instantiator_test\") {\n                    withBlock(\"let result = \", \";\") {\n                        sut.render(this, structure, data)\n                    }\n\n                    rust(\n                        \"\"\"\n                        use std::collections::HashMap;\n                        use aws_smithy_types::{DateTime, Document};\n                        use super::*;\n\n                        let expected = MyStructRequired {\n                            str: \"\".to_owned(),\n                            primitive_int: 0,\n                            int: 0,\n                            ts: DateTime::from_secs(0),\n                            byte: 0,\n                            union: NestedUnion::Struct(NestedStruct {\n                                str: \"\".to_owned(),\n                                num: 0,\n                            }),\n                            structure: NestedStruct {\n                                str: \"\".to_owned(),\n                                num: 0,\n                            },\n                            list: Vec::new(),\n                            map: HashMap::new(),\n                            doc: Document::Object(HashMap::new()),\n                        };\n                        assert_eq!(result, expected);\n                        \"\"\",\n                    )\n                }\n            }\n        }\n        project.renderInlineMemoryModules()\n        project.compileAndTest()\n    }\n\n    @Test\n    fun `generate named enums`() {\n        val shape = model.lookup<StringShape>(\"com.test#NamedEnum\")\n        val sut = ServerInstantiator(codegenContext)\n        val data = Node.parse(\"t2.nano\".dq())\n\n        val project = TestWorkspace.testProject()\n        project.withModule(ServerRustModule.Model) {\n            ServerEnumGenerator(\n                codegenContext,\n                shape,\n                SmithyValidationExceptionConversionGenerator(codegenContext),\n                emptyList(),\n            ).render(this)\n            unitTest(\"generate_named_enums\") {\n                withBlock(\"let result = \", \";\") {\n                    sut.render(this, shape, data)\n                }\n                rust(\"assert_eq!(result, NamedEnum::T2Nano);\")\n            }\n        }\n        project.compileAndTest()\n    }\n\n    @Test\n    fun `generate unnamed enums`() {\n        val shape = model.lookup<StringShape>(\"com.test#UnnamedEnum\")\n        val sut = ServerInstantiator(codegenContext)\n        val data = Node.parse(\"t2.nano\".dq())\n\n        val project = TestWorkspace.testProject()\n        project.withModule(ServerRustModule.Model) {\n            ServerEnumGenerator(\n                codegenContext,\n                shape,\n                SmithyValidationExceptionConversionGenerator(codegenContext),\n                emptyList(),\n            ).render(this)\n            unitTest(\"generate_unnamed_enums\") {\n                withBlock(\"let result = \", \";\") {\n                    sut.render(this, shape, data)\n                }\n                rust(\"\"\"assert_eq!(result, UnnamedEnum(\"t2.nano\".to_owned()));\"\"\")\n            }\n        }\n        project.compileAndTest()\n    }\n\n    @Test\n    fun `use direct instantiation and not the builder`() {\n        val shape = model.lookup<StructureShape>(\"com.test#MyStruct\")\n        val sut = ServerInstantiator(codegenContext)\n        val data = Node.parse(\"\"\"{ \"foo\": \"hello\", \"bar\": 1, \"baz\": 42, \"ts\": 0, \"byteValue\": 0 }\"\"\")\n\n        val writer = RustWriter.forModule(ServerRustModule.Model.name)\n        sut.render(writer, shape, data)\n        writer.toString() shouldNotContain \"builder()\"\n    }\n\n    @Test\n    fun `uses writable for shapes`() {\n        val nestedStruct = model.lookup<StructureShape>(\"com.test#NestedStruct\")\n        val inner = model.lookup<StructureShape>(\"com.test#Inner\")\n\n        val project = TestWorkspace.testProject(model)\n        nestedStruct.renderWithModelBuilder(model, symbolProvider, project)\n        inner.renderWithModelBuilder(model, symbolProvider, project)\n        project.moduleFor(nestedStruct) {\n            val nestedUnion = model.lookup<UnionShape>(\"com.test#NestedUnion\")\n            UnionGenerator(model, symbolProvider, this, nestedUnion).render()\n\n            unitTest(\"writable_for_shapes\") {\n                val sut =\n                    ServerInstantiator(\n                        codegenContext,\n                        customWritable =\n                            object : Instantiator.CustomWritable {\n                                override fun generate(shape: Shape): Writable? =\n                                    if (model.lookup<MemberShape>(\"com.test#NestedStruct\\$num\") == shape) {\n                                        writable(\"40 + 2\")\n                                    } else {\n                                        null\n                                    }\n                            },\n                    )\n                val data = Node.parse(\"\"\"{ \"str\": \"hello\", \"num\": 1 }\"\"\")\n                withBlock(\"let result = \", \";\") {\n                    sut.render(this, model.lookup(\"com.test#NestedStruct\"), data as ObjectNode)\n                }\n                rust(\n                    \"\"\"\n                    assert_eq!(result.num, 42);\n                    assert_eq!(result.str, \"hello\");\n                    \"\"\",\n                )\n            }\n\n            unitTest(\"writable_for_nested_inner_members\") {\n                val map = model.lookup<MemberShape>(\"com.test#Inner\\$map\")\n                val sut =\n                    ServerInstantiator(\n                        codegenContext,\n                        customWritable =\n                            object : Instantiator.CustomWritable {\n                                private var n: Int = 0\n\n                                override fun generate(shape: Shape): Writable? =\n                                    if (shape != map) {\n                                        null\n                                    } else if (n != 2) {\n                                        n += 1\n                                        null\n                                    } else {\n                                        n += 1\n                                        writable(\"None\")\n                                    }\n                            },\n                    )\n                val data =\n                    Node.parse(\n                        \"\"\"\n                        {\n                            \"map\": {\n                                \"k1\": {\n                                    \"map\": {\n                                        \"k2\": {\n                                            \"map\": {\n                                                \"never\": {}\n                                            }\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                        \"\"\",\n                    )\n\n                withBlock(\"let result = \", \";\") {\n                    sut.render(this, inner, data as ObjectNode)\n                }\n                rust(\n                    \"\"\"\n                    assert_eq!(result.map().unwrap().get(\"k1\").unwrap().map().unwrap().get(\"k2\").unwrap().map(), None);\n                    \"\"\",\n                )\n            }\n        }\n        project.compileAndTest(runClippy = true)\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerOperationErrorGeneratorTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.generators\n\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.rust.codegen.core.smithy.transformers.OperationNormalizer\nimport software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.compileAndTest\nimport software.amazon.smithy.rust.codegen.core.testutil.unitTest\nimport software.amazon.smithy.rust.codegen.core.util.lookup\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerRustModule\nimport software.amazon.smithy.rust.codegen.server.smithy.renderInlineMemoryModules\nimport software.amazon.smithy.rust.codegen.server.smithy.testutil.serverRenderWithModelBuilder\nimport software.amazon.smithy.rust.codegen.server.smithy.testutil.serverTestSymbolProvider\n\nclass ServerOperationErrorGeneratorTest {\n    private val baseModel =\n        \"\"\"\n        namespace error\n\n        use aws.protocols#restJson1\n\n        @restJson1\n        service MyService {\n            operations: [Greeting]\n        }\n\n        operation Greeting {\n            errors: [InvalidGreeting, ComplexError, FooException, Deprecated]\n        }\n\n        @error(\"client\")\n        @retryable\n        structure InvalidGreeting {\n            @required\n            message: String,\n        }\n\n        @error(\"server\")\n        structure FooException { }\n\n        @error(\"server\")\n        structure ComplexError {\n            abc: String,\n            other: Integer\n        }\n\n        @error(\"server\")\n        @deprecated\n        structure Deprecated { }\n        \"\"\".asSmithyModel()\n    private val model = OperationNormalizer.transform(baseModel)\n    private val symbolProvider = serverTestSymbolProvider(model)\n\n    @Test\n    fun `generates combined error enums`() {\n        val project = TestWorkspace.testProject(symbolProvider)\n        project.withModule(ServerRustModule.Error) {\n            listOf(\"FooException\", \"ComplexError\", \"InvalidGreeting\", \"Deprecated\").forEach {\n                model.lookup<StructureShape>(\"error#$it\").serverRenderWithModelBuilder(project, model, symbolProvider, this)\n            }\n            ServerOperationErrorGenerator(\n                model,\n                symbolProvider,\n                model.lookup(\"error#Greeting\"),\n            ).render(this)\n\n            unitTest(\n                name = \"generates_combined_error_enums\",\n                test = \"\"\"\n                    let variant = InvalidGreeting { message: String::from(\"an error\") };\n                    assert_eq!(format!(\"{}\", variant), \"InvalidGreeting: an error\");\n                    assert_eq!(variant.message(), \"an error\");\n                    assert_eq!(\n                        variant.retryable_error_kind(),\n                        aws_smithy_types::retry::ErrorKind::ClientError\n                    );\n\n                    let error = GreetingError::InvalidGreeting(variant);\n\n                    // Generate is_xyz methods for errors.\n                    assert_eq!(error.is_invalid_greeting(), true);\n                    assert_eq!(error.is_complex_error(), false);\n\n                    // Indicate the original name in the display output.\n                    let error = FooException::builder().build();\n                    assert_eq!(format!(\"{}\", error), \"FooException\");\n\n                    let error = Deprecated::builder().build();\n                    assert_eq!(error.to_string(), \"Deprecated\");\n                \"\"\",\n            )\n\n            unitTest(\n                name = \"generates_converters_into_combined_error_enums\",\n                test = \"\"\"\n                    let variant = InvalidGreeting { message: String::from(\"an error\") };\n                    let error: GreetingError = variant.into();\n                \"\"\",\n            )\n            project.renderInlineMemoryModules()\n            project.compileAndTest()\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerServiceGeneratorTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.generators\n\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.testModule\nimport software.amazon.smithy.rust.codegen.server.smithy.testutil.serverIntegrationTest\nimport java.io.File\nimport kotlin.io.path.readText\n\ninternal class ServerServiceGeneratorTest {\n    /**\n     * See <https://github.com/smithy-lang/smithy-rs/issues/3177>.\n     */\n    @Test\n    fun `one should be able to return a built service from a function`() {\n        val model = File(\"../codegen-core/common-test-models/simple.smithy\").readText().asSmithyModel()\n\n        val testDirs =\n            serverIntegrationTest(model) { _, rustCrate ->\n                rustCrate.testModule {\n                    // No actual tests: we just want to check that this compiles.\n                    rust(\n                        \"\"\"\n                    fn _build_service() -> crate::SimpleService {\n                        let config = crate::SimpleServiceConfig::builder().build();\n                        let service = crate::SimpleService::builder(config).build_unchecked();\n\n                        service.boxed()\n                    }\n                    \"\"\",\n                    )\n                }\n            }\n\n        // test the generated metadata for all generated projects (both HTTP 0.x and HTTP 1.x)\n        testDirs.forEach { generatedServer ->\n            val cargoToml = generatedServer.path.resolve(\"Cargo.toml\").readText()\n            assert(cargoToml.contains(\"codegen-version =\")) { cargoToml }\n            assert(cargoToml.contains(\"protocol = \\\"aws.protocols#restJson1\\\"\")) { cargoToml }\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServiceConfigGeneratorTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.generators\n\nimport io.kotest.assertions.throwables.shouldThrow\nimport io.kotest.matchers.shouldBe\nimport io.kotest.matchers.string.shouldContain\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.codegen.core.CodegenException\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.testModule\nimport software.amazon.smithy.rust.codegen.core.testutil.unitTest\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerCargoDependency\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenContext\nimport software.amazon.smithy.rust.codegen.server.smithy.customize.ServerCodegenDecorator\nimport software.amazon.smithy.rust.codegen.server.smithy.testutil.HttpTestType\nimport software.amazon.smithy.rust.codegen.server.smithy.testutil.HttpTestVersion\nimport software.amazon.smithy.rust.codegen.server.smithy.testutil.MultiVersionTestFailure\nimport software.amazon.smithy.rust.codegen.server.smithy.testutil.serverIntegrationTest\nimport java.io.File\n\ninternal class ServiceConfigGeneratorTest {\n    @Test\n    fun `it should inject an aws_auth method that configures an HTTP plugin and a model plugin`() {\n        val model = File(\"../codegen-core/common-test-models/simple.smithy\").readText().asSmithyModel()\n\n        val decorator =\n            object : ServerCodegenDecorator {\n                override val name: String\n                    get() = \"AWSAuth pre-applied middleware decorator\"\n                override val order: Byte\n                    get() = -69\n\n                override fun configMethods(codegenContext: ServerCodegenContext): List<ConfigMethod> {\n                    val smithyHttpServer = ServerCargoDependency.smithyHttpServer(codegenContext.runtimeConfig).toType()\n                    val codegenScope =\n                        arrayOf(\n                            \"SmithyHttpServer\" to smithyHttpServer,\n                        )\n                    return listOf(\n                        ConfigMethod(\n                            name = \"aws_auth\",\n                            docs = \"Docs\",\n                            params =\n                                listOf(\n                                    Binding.Concrete(\"auth_spec\", RuntimeType.String),\n                                    Binding.Concrete(\"authorizer\", RuntimeType.U64),\n                                    Binding.Generic(\"generic_list\", RuntimeType(\"::std::vec::Vec<T>\"), setOf(\"T\")),\n                                ),\n                            errorType = RuntimeType.std.resolve(\"io::Error\"),\n                            initializer =\n                                Initializer(\n                                    code =\n                                        writable {\n                                            rustTemplate(\n                                                \"\"\"\n                                                if authorizer != 69 {\n                                                    return Err(std::io::Error::new(std::io::ErrorKind::Other, \"failure 1\"));\n                                                }\n\n                                                if auth_spec.len() != 69 && generic_list.len() != 69 {\n                                                    return Err(std::io::Error::new(std::io::ErrorKind::Other, \"failure 2\"));\n                                                }\n                                                let authn_plugin = #{SmithyHttpServer}::plugin::IdentityPlugin;\n                                                let authz_plugin = #{SmithyHttpServer}::plugin::IdentityPlugin;\n                                                \"\"\",\n                                                *codegenScope,\n                                            )\n                                        },\n                                    layerBindings = emptyList(),\n                                    httpPluginBindings =\n                                        listOf(\n                                            Binding.Concrete(\n                                                \"authn_plugin\",\n                                                smithyHttpServer.resolve(\"plugin::IdentityPlugin\"),\n                                            ),\n                                        ),\n                                    modelPluginBindings =\n                                        listOf(\n                                            Binding.Concrete(\n                                                \"authz_plugin\",\n                                                smithyHttpServer.resolve(\"plugin::IdentityPlugin\"),\n                                            ),\n                                        ),\n                                ),\n                            isRequired = true,\n                        ),\n                    )\n                }\n            }\n\n        serverIntegrationTest(\n            model,\n            additionalDecorators = listOf(decorator),\n            testCoverage = HttpTestType.ALL,\n        ) { context, rustCrate ->\n            val smithyServer = ServerCargoDependency.smithyHttpServer(context.runtimeConfig).toType()\n            rustCrate.testModule {\n                rustTemplate(\n                    \"\"\"\n                    use crate::{SimpleServiceConfig, SimpleServiceConfigError};\n                    use #{SmithyHttpServer}::plugin::IdentityPlugin;\n                    use crate::server::plugin::PluginStack;\n                    \"\"\",\n                    \"SmithyHttpServer\" to smithyServer,\n                )\n\n                unitTest(\"successful_config_initialization\") {\n                    rust(\n                        \"\"\"\n                        let _: SimpleServiceConfig<\n                            tower::layer::util::Identity,\n                            // One HTTP plugin has been applied.\n                            PluginStack<IdentityPlugin, IdentityPlugin>,\n                            // One model plugin has been applied.\n                            PluginStack<IdentityPlugin, IdentityPlugin>,\n                        > = SimpleServiceConfig::builder()\n                            .aws_auth(\"a\".repeat(69).to_owned(), 69, vec![69])\n                            .expect(\"failed to configure aws_auth\")\n                            .build()\n                            .unwrap();\n                        \"\"\",\n                    )\n                }\n\n                unitTest(\"wrong_aws_auth_auth_spec\") {\n                    rust(\n                        \"\"\"\n                        let actual_err = SimpleServiceConfig::builder()\n                            .aws_auth(\"a\".to_owned(), 69, vec![69])\n                            .unwrap_err();\n                        let expected = std::io::Error::new(std::io::ErrorKind::Other, \"failure 2\").to_string();\n                        assert_eq!(actual_err.to_string(), expected);\n                        \"\"\",\n                    )\n                }\n\n                unitTest(\"wrong_aws_auth_authorizer\") {\n                    rust(\n                        \"\"\"\n                        let actual_err = SimpleServiceConfig::builder()\n                            .aws_auth(\"a\".repeat(69).to_owned(), 6969, vec![\"69\"])\n                            .unwrap_err();\n                        let expected = std::io::Error::new(std::io::ErrorKind::Other, \"failure 1\").to_string();\n                        assert_eq!(actual_err.to_string(), expected);\n                        \"\"\",\n                    )\n                }\n\n                unitTest(\"aws_auth_not_configured\") {\n                    rust(\n                        \"\"\"\n                        let actual_err = SimpleServiceConfig::builder().build().unwrap_err();\n                        let expected = SimpleServiceConfigError::AwsAuthNotConfigured.to_string();\n                        assert_eq!(actual_err.to_string(), expected);\n                        \"\"\",\n                    )\n                }\n            }\n        }\n    }\n\n    @Test\n    fun `it should inject a method that applies three non-required layers`() {\n        val model = File(\"../codegen-core/common-test-models/simple.smithy\").readText().asSmithyModel()\n\n        val decorator =\n            object : ServerCodegenDecorator {\n                override val name: String\n                    get() = \"ApplyThreeNonRequiredLayers\"\n                override val order: Byte\n                    get() = 69\n\n                override fun configMethods(codegenContext: ServerCodegenContext): List<ConfigMethod> {\n                    val identityLayer = RuntimeType.Tower.resolve(\"layer::util::Identity\")\n                    val codegenScope =\n                        arrayOf(\n                            \"Identity\" to identityLayer,\n                        )\n                    return listOf(\n                        ConfigMethod(\n                            name = \"three_non_required_layers\",\n                            docs = \"Docs\",\n                            params = emptyList(),\n                            errorType = null,\n                            initializer =\n                                Initializer(\n                                    code =\n                                        writable {\n                                            rustTemplate(\n                                                \"\"\"\n                                                let layer1 = #{Identity}::new();\n                                                let layer2 = #{Identity}::new();\n                                                let layer3 = #{Identity}::new();\n                                                \"\"\",\n                                                *codegenScope,\n                                            )\n                                        },\n                                    layerBindings =\n                                        listOf(\n                                            Binding.Concrete(\"layer1\", identityLayer),\n                                            Binding.Concrete(\"layer2\", identityLayer),\n                                            Binding.Concrete(\"layer3\", identityLayer),\n                                        ),\n                                    httpPluginBindings = emptyList(),\n                                    modelPluginBindings = emptyList(),\n                                ),\n                            isRequired = false,\n                        ),\n                    )\n                }\n            }\n\n        serverIntegrationTest(\n            model,\n            additionalDecorators = listOf(decorator),\n            testCoverage = HttpTestType.ALL,\n        ) { context, rustCrate ->\n            val smithyServer = ServerCargoDependency.smithyHttpServer(context.runtimeConfig).toType()\n            rustCrate.testModule {\n                unitTest(\"successful_config_initialization_applying_the_three_layers\") {\n                    rustTemplate(\n                        \"\"\"\n                        let _: crate::SimpleServiceConfig<\n                            // Three Tower layers have been applied.\n                            tower::layer::util::Stack<\n                                tower::layer::util::Identity,\n                                tower::layer::util::Stack<\n                                    tower::layer::util::Identity,\n                                    tower::layer::util::Stack<\n                                        tower::layer::util::Identity,\n                                        tower::layer::util::Identity,\n                                    >,\n                                >,\n                            >,\n                            #{SmithyHttpServer}::plugin::IdentityPlugin,\n                            #{SmithyHttpServer}::plugin::IdentityPlugin,\n                        > = crate::SimpleServiceConfig::builder()\n                            .three_non_required_layers()\n                            .build();\n                        \"\"\",\n                        \"SmithyHttpServer\" to smithyServer,\n                    )\n                }\n\n                unitTest(\"successful_config_initialization_without_applying_the_three_layers\") {\n                    rust(\n                        \"\"\"\n                        crate::SimpleServiceConfig::builder().build();\n                        \"\"\",\n                    )\n                }\n            }\n        }\n    }\n\n    @Test\n    fun `it should throw an exception if a generic binding using L, H, or M is used`() {\n        val model = File(\"../codegen-core/common-test-models/simple.smithy\").readText().asSmithyModel()\n\n        val decorator =\n            object : ServerCodegenDecorator {\n                override val name: String\n                    get() = \"InvalidGenericBindingsDecorator\"\n                override val order: Byte\n                    get() = 69\n\n                override fun configMethods(codegenContext: ServerCodegenContext): List<ConfigMethod> {\n                    val identityLayer = RuntimeType.Tower.resolve(\"layer::util::Identity\")\n                    return listOf(\n                        ConfigMethod(\n                            name = \"invalid_generic_bindings\",\n                            docs = \"Docs\",\n                            params =\n                                listOf(\n                                    Binding.Generic(\"param1_bad\", identityLayer, setOf(\"L\")),\n                                    Binding.Generic(\"param2_bad\", identityLayer, setOf(\"H\")),\n                                    Binding.Generic(\"param3_bad\", identityLayer, setOf(\"M\")),\n                                    Binding.Generic(\"param4_ok\", identityLayer, setOf(\"N\")),\n                                ),\n                            errorType = null,\n                            initializer =\n                                Initializer(\n                                    code = writable {},\n                                    layerBindings = emptyList(),\n                                    httpPluginBindings = emptyList(),\n                                    modelPluginBindings = emptyList(),\n                                ),\n                            isRequired = false,\n                        ),\n                    )\n                }\n            }\n\n        // When running for both HTTP versions, the framework throws MultiVersionTestFailure\n        val failure =\n            shouldThrow<MultiVersionTestFailure> {\n                serverIntegrationTest(\n                    model,\n                    additionalDecorators = listOf(decorator),\n                    testCoverage = HttpTestType.ALL,\n                ) { _, _ -> }\n            }\n\n        // Verify both HTTP versions failed\n        failure.failures.size shouldBe 2\n        failure.hasFailureFor(HttpTestVersion.HTTP_0_X) shouldBe true\n        failure.hasFailureFor(HttpTestVersion.HTTP_1_X) shouldBe true\n\n        // Verify all failures are CodegenExceptions\n        failure.allFailuresAreOfType(CodegenException::class) shouldBe true\n\n        // Verify each failure has the expected error message\n        failure.failures.forEach { (version, exception) ->\n            val codegenException = exception as CodegenException\n            codegenException.message.shouldContain(\n                \"Injected config method `invalid_generic_bindings` has generic bindings that use `L`, `H`, or `M` to refer to the generic types. This is not allowed. Invalid generic bindings:\",\n            )\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/TestUtility.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.generators\n\nimport software.amazon.smithy.model.shapes.StringShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenContext\nimport software.amazon.smithy.rust.codegen.server.smithy.createTestInlineModuleCreator\nimport software.amazon.smithy.rust.codegen.server.smithy.customizations.SmithyValidationExceptionConversionGenerator\n\nobject TestUtility {\n    fun generateIsDisplay() =\n        writable {\n            rustTemplate(\n                \"\"\"\n                pub fn is_display<T : #{Display}>(_t: &T) { }\n                \"\"\",\n                \"Display\" to RuntimeType.Display,\n            )\n        }\n\n    fun generateIsError() =\n        writable {\n            rustTemplate(\n                \"\"\"\n                pub fn is_error<T : #{Error}>(_t: &T) { }\n                \"\"\",\n                \"Error\" to RuntimeType.StdError,\n            )\n        }\n\n    fun renderConstrainedString(\n        codegenContext: ServerCodegenContext,\n        writer: RustWriter,\n        constrainedStringShape: StringShape,\n    ) {\n        val validationExceptionConversionGenerator = SmithyValidationExceptionConversionGenerator(codegenContext)\n        ConstrainedStringGenerator(\n            codegenContext,\n            writer.createTestInlineModuleCreator(),\n            writer,\n            constrainedStringShape,\n            validationExceptionConversionGenerator,\n        ).render()\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/UnconstrainedCollectionGeneratorTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.generators\n\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.testModule\nimport software.amazon.smithy.rust.codegen.core.testutil.unitTest\nimport software.amazon.smithy.rust.codegen.server.smithy.testutil.HttpTestType\nimport software.amazon.smithy.rust.codegen.server.smithy.testutil.serverIntegrationTest\n\nclass UnconstrainedCollectionGeneratorTest {\n    @Test\n    fun `it should generate unconstrained lists`() {\n        val model =\n            \"\"\"\n            namespace test\n\n            use aws.protocols#restJson1\n            use smithy.framework#ValidationException\n\n            @restJson1\n            service TestService {\n                operations: [\"Operation\"]\n            }\n\n            @http(uri: \"/operation\", method: \"POST\")\n            operation Operation {\n                input: OperationInputOutput\n                output: OperationInputOutput\n                errors: [ValidationException]\n            }\n\n            structure OperationInputOutput {\n                list: ListA\n            }\n\n            list ListA {\n                member: ListB\n            }\n\n            list ListB {\n                member: StructureC\n            }\n\n            structure StructureC {\n                @required\n                int: Integer,\n\n                @required\n                string: String\n            }\n            \"\"\".asSmithyModel()\n\n        serverIntegrationTest(model, testCoverage = HttpTestType.Default) { _, rustCrate ->\n            rustCrate.testModule {\n                unitTest(\"list_a_unconstrained_fail_to_constrain_with_first_error\") {\n                    rust(\n                        \"\"\"\n                        let c_builder1 = crate::model::StructureC::builder().int(69);\n                        let c_builder2 = crate::model::StructureC::builder().string(\"david\".to_owned());\n                        let list_b_unconstrained = crate::unconstrained::list_b_unconstrained::ListBUnconstrained(vec![c_builder1, c_builder2]);\n                        let list_a_unconstrained = crate::unconstrained::list_a_unconstrained::ListAUnconstrained(vec![list_b_unconstrained]);\n\n                        let expected_err =\n                            crate::model::list_a::ConstraintViolation::Member(0, crate::model::list_b::ConstraintViolation::Member(\n                                0, crate::model::structure_c::ConstraintViolation::MissingString,\n                            ));\n\n                        assert_eq!(\n                            expected_err,\n                            crate::constrained::list_a_constrained::ListAConstrained::try_from(list_a_unconstrained).unwrap_err()\n                        );\n                        \"\"\",\n                    )\n                }\n\n                unitTest(\"list_a_unconstrained_succeed_to_constrain\") {\n                    rust(\n                        \"\"\"\n                        let c_builder = crate::model::StructureC::builder().int(69).string(String::from(\"david\"));\n                        let list_b_unconstrained = crate::unconstrained::list_b_unconstrained::ListBUnconstrained(vec![c_builder]);\n                        let list_a_unconstrained = crate::unconstrained::list_a_unconstrained::ListAUnconstrained(vec![list_b_unconstrained]);\n\n                        let expected: Vec<Vec<crate::model::StructureC>> = vec![vec![crate::model::StructureC {\n                            string: \"david\".to_owned(),\n                            int: 69\n                        }]];\n                        let actual: Vec<Vec<crate::model::StructureC>> =\n                            crate::constrained::list_a_constrained::ListAConstrained::try_from(list_a_unconstrained).unwrap().into();\n\n                        assert_eq!(expected, actual);\n                        \"\"\",\n                    )\n                }\n\n                unitTest(\"list_a_unconstrained_converts_into_constrained\") {\n                    rust(\n                        \"\"\"\n                        let c_builder = crate::model::StructureC::builder();\n                        let list_b_unconstrained = crate::unconstrained::list_b_unconstrained::ListBUnconstrained(vec![c_builder]);\n                        let list_a_unconstrained = crate::unconstrained::list_a_unconstrained::ListAUnconstrained(vec![list_b_unconstrained]);\n\n                        let _list_a: crate::constrained::MaybeConstrained<crate::constrained::list_a_constrained::ListAConstrained> = list_a_unconstrained.into();\n                        \"\"\",\n                    )\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/UnconstrainedMapGeneratorTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.generators\n\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.model.shapes.MapShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.smithy.CoreCodegenConfig\nimport software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.compileAndTest\nimport software.amazon.smithy.rust.codegen.core.testutil.testModule\nimport software.amazon.smithy.rust.codegen.core.testutil.unitTest\nimport software.amazon.smithy.rust.codegen.core.util.lookup\nimport software.amazon.smithy.rust.codegen.server.smithy.testutil.HttpTestType\nimport software.amazon.smithy.rust.codegen.server.smithy.testutil.serverIntegrationTest\nimport software.amazon.smithy.rust.codegen.server.smithy.testutil.serverTestCodegenContext\n\nclass UnconstrainedMapGeneratorTest {\n    @Test\n    fun `it should generate unconstrained maps`() {\n        val model =\n            \"\"\"\n            namespace test\n\n            use aws.protocols#restJson1\n            use smithy.framework#ValidationException\n\n            @restJson1\n            service TestService {\n                operations: [\"Operation\"]\n            }\n\n            @http(uri: \"/operation\", method: \"POST\")\n            operation Operation {\n                input: OperationInputOutput\n                output: OperationInputOutput\n                errors: [ValidationException]\n            }\n\n            structure OperationInputOutput {\n                map: MapA\n            }\n\n            map MapA {\n                key: String,\n                value: MapB\n            }\n\n            map MapB {\n                key: String,\n                value: StructureC\n            }\n\n            structure StructureC {\n                @required\n                int: Integer,\n\n                @required\n                string: String\n            }\n            \"\"\".asSmithyModel()\n        val codegenContext = serverTestCodegenContext(model)\n        val symbolProvider = codegenContext.symbolProvider\n\n        val mapA = model.lookup<MapShape>(\"test#MapA\")\n        val mapB = model.lookup<MapShape>(\"test#MapB\")\n\n        val project = TestWorkspace.testProject(symbolProvider, CoreCodegenConfig(debugMode = true))\n\n        serverIntegrationTest(model, testCoverage = HttpTestType.Default) { _, rustCrate ->\n            rustCrate.testModule {\n                TestUtility.generateIsDisplay().invoke(this)\n                TestUtility.generateIsError().invoke(this)\n\n                unitTest(\"map_a_unconstrained_fail_to_constrain_with_some_error\") {\n                    rust(\n                        \"\"\"\n                        let c_builder1 = crate::model::StructureC::builder().int(69);\n                        let c_builder2 = crate::model::StructureC::builder().string(String::from(\"david\"));\n                        let map_b_unconstrained = crate::unconstrained::map_b_unconstrained::MapBUnconstrained(\n                            std::collections::HashMap::from([\n                                (String::from(\"KeyB1\"), c_builder1),\n                                (String::from(\"KeyB2\"), c_builder2),\n                            ])\n                        );\n                        let map_a_unconstrained = crate::unconstrained::map_a_unconstrained::MapAUnconstrained(\n                            std::collections::HashMap::from([\n                                (String::from(\"KeyA\"), map_b_unconstrained),\n                            ])\n                        );\n\n                        // Any of these two errors could be returned; it depends on the order in which the maps are visited.\n                        let missing_string_expected_err = crate::model::map_a::ConstraintViolation::Value(\n                            \"KeyA\".to_owned(),\n                            crate::model::map_b::ConstraintViolation::Value(\n                                \"KeyB1\".to_owned(),\n                                crate::model::structure_c::ConstraintViolation::MissingString,\n                            )\n                        );\n                        let missing_int_expected_err = crate::model::map_a::ConstraintViolation::Value(\n                            \"KeyA\".to_owned(),\n                            crate::model::map_b::ConstraintViolation::Value(\n                                \"KeyB2\".to_owned(),\n                                crate::model::structure_c::ConstraintViolation::MissingInt,\n                            )\n                        );\n\n                        let actual_err = crate::constrained::map_a_constrained::MapAConstrained::try_from(map_a_unconstrained).unwrap_err();\n                        assert!(actual_err == missing_string_expected_err || actual_err == missing_int_expected_err);\n                        \n                        is_display(&actual_err);\n                        is_error(&actual_err);\n\n                        let error_str = actual_err.to_string();\n                        assert!(\n                            error_str == \"`string` was not provided but it is required when building `StructureC`\"\n                                || error_str\n                                    == \"`int` was not provided but it is required when building `StructureC`\"\n                        );\n                        \"\"\",\n                    )\n                }\n                unitTest(\"map_a_unconstrained_succeed_to_constrain\") {\n                    rust(\n                        \"\"\"\n                        let c_builder = crate::model::StructureC::builder().int(69).string(String::from(\"david\"));\n                        let map_b_unconstrained = crate::unconstrained::map_b_unconstrained::MapBUnconstrained(\n                            std::collections::HashMap::from([\n                                (String::from(\"KeyB\"), c_builder),\n                            ])\n                        );\n                        let map_a_unconstrained = crate::unconstrained::map_a_unconstrained::MapAUnconstrained(\n                            std::collections::HashMap::from([\n                                (String::from(\"KeyA\"), map_b_unconstrained),\n                            ])\n                        );\n\n                        let expected = std::collections::HashMap::from([\n                            (String::from(\"KeyA\"), std::collections::HashMap::from([\n                                (String::from(\"KeyB\"), crate::model::StructureC {\n                                    int: 69,\n                                    string: String::from(\"david\")\n                                }),\n                            ]))\n                        ]);\n\n                        assert_eq!(\n                            expected,\n                            crate::constrained::map_a_constrained::MapAConstrained::try_from(map_a_unconstrained).unwrap().into()\n                        );\n                        \"\"\",\n                    )\n                }\n                unitTest(\"map_a_unconstrained_converts_into_constrained\") {\n                    rust(\n                        \"\"\"\n                        let c_builder = crate::model::StructureC::builder();\n                        let map_b_unconstrained = crate::unconstrained::map_b_unconstrained::MapBUnconstrained(\n                            std::collections::HashMap::from([\n                                (String::from(\"KeyB\"), c_builder),\n                            ])\n                        );\n                        let map_a_unconstrained = crate::unconstrained::map_a_unconstrained::MapAUnconstrained(\n                            std::collections::HashMap::from([\n                                (String::from(\"KeyA\"), map_b_unconstrained),\n                            ])\n                        );\n\n                        let _map_a: crate::constrained::MaybeConstrained<crate::constrained::map_a_constrained::MapAConstrained> = map_a_unconstrained.into();\n                        \"\"\",\n                    )\n                }\n            }\n        }\n\n        project.compileAndTest()\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/UnconstrainedUnionGeneratorTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.generators\n\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.shapes.UnionShape\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.UnionGenerator\nimport software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.compileAndTest\nimport software.amazon.smithy.rust.codegen.core.testutil.unitTest\nimport software.amazon.smithy.rust.codegen.core.util.lookup\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerRustModule\nimport software.amazon.smithy.rust.codegen.server.smithy.createInlineModuleCreator\nimport software.amazon.smithy.rust.codegen.server.smithy.customizations.SmithyValidationExceptionConversionGenerator\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.protocol.ServerRestJsonProtocol\nimport software.amazon.smithy.rust.codegen.server.smithy.renderInlineMemoryModules\nimport software.amazon.smithy.rust.codegen.server.smithy.testutil.serverRenderWithModelBuilder\nimport software.amazon.smithy.rust.codegen.server.smithy.testutil.serverTestCodegenContext\n\nclass UnconstrainedUnionGeneratorTest {\n    @Test\n    fun `it should generate unconstrained unions`() {\n        val model =\n            \"\"\"\n            namespace test\n\n            union Union {\n                structure: Structure\n            }\n\n            structure Structure {\n                @required\n                requiredMember: String\n            }\n            \"\"\".asSmithyModel()\n        val codegenContext = serverTestCodegenContext(model)\n        val symbolProvider = codegenContext.symbolProvider\n\n        val unionShape = model.lookup<UnionShape>(\"test#Union\")\n\n        val project = TestWorkspace.testProject(symbolProvider)\n\n        project.withModule(ServerRustModule.Model) {\n            model.lookup<StructureShape>(\"test#Structure\").serverRenderWithModelBuilder(\n                project,\n                model,\n                symbolProvider,\n                this,\n                ServerRestJsonProtocol(codegenContext),\n            )\n        }\n\n        project.withModule(ServerRustModule.Model) {\n            UnionGenerator(model, symbolProvider, this, unionShape, renderUnknownVariant = false).render()\n        }\n\n        project.withModule(ServerRustModule.UnconstrainedModule) unconstrainedModuleWriter@{\n            TestUtility.generateIsDisplay().invoke(this)\n            TestUtility.generateIsError().invoke(this)\n\n            project.withModule(ServerRustModule.Model) modelsModuleWriter@{\n                UnconstrainedUnionGenerator(codegenContext, project.createInlineModuleCreator(), this@modelsModuleWriter, unionShape, SmithyValidationExceptionConversionGenerator(codegenContext)).render()\n\n                this@unconstrainedModuleWriter.unitTest(\n                    name = \"unconstrained_union_fail_to_constrain\",\n                    test = \"\"\"\n                        let builder = crate::model::Structure::builder();\n                        let union_unconstrained = union_unconstrained::UnionUnconstrained::Structure(builder);\n\n                        let expected_err = crate::model::union::ConstraintViolation::Structure(\n                            crate::model::structure::ConstraintViolation::MissingRequiredMember,\n                        );\n                        let err = crate::model::Union::try_from(union_unconstrained).unwrap_err();\n                        assert_eq!(\n                            expected_err, err\n                        );\n                        is_display(&err);\n                        is_error(&err);\n                        assert_eq!(err.to_string(), \"`required_member` was not provided but it is required when building `Structure`\");\n                    \"\"\",\n                )\n\n                this@unconstrainedModuleWriter.unitTest(\n                    name = \"unconstrained_union_succeed_to_constrain\",\n                    test = \"\"\"\n                        let builder = crate::model::Structure::builder().required_member(String::from(\"david\"));\n                        let union_unconstrained = union_unconstrained::UnionUnconstrained::Structure(builder);\n\n                        let expected: crate::model::Union = crate::model::Union::Structure(crate::model::Structure {\n                            required_member: String::from(\"david\"),\n                        });\n                        let actual: crate::model::Union = crate::model::Union::try_from(union_unconstrained).unwrap();\n\n                        assert_eq!(expected, actual);\n                    \"\"\",\n                )\n\n                this@unconstrainedModuleWriter.unitTest(\n                    name = \"unconstrained_union_converts_into_constrained\",\n                    test = \"\"\"\n                        let builder = crate::model::Structure::builder();\n                        let union_unconstrained = union_unconstrained::UnionUnconstrained::Structure(builder);\n\n                        let _union: crate::constrained::MaybeConstrained<crate::model::Union> =\n                            union_unconstrained.into();\n                    \"\"\",\n                )\n            }\n        }\n        project.renderInlineMemoryModules()\n        project.compileAndTest()\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/protocols/eventstream/ServerEventStreamMarshallerGeneratorTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.protocols.eventstream\n\nimport org.junit.jupiter.api.extension.ExtensionContext\nimport org.junit.jupiter.params.ParameterizedTest\nimport org.junit.jupiter.params.provider.Arguments\nimport org.junit.jupiter.params.provider.ArgumentsProvider\nimport org.junit.jupiter.params.provider.ArgumentsSource\nimport software.amazon.smithy.rust.codegen.core.testutil.EventStreamMarshallTestCases.writeMarshallTestCases\nimport software.amazon.smithy.rust.codegen.core.testutil.EventStreamTestModels\nimport software.amazon.smithy.rust.codegen.core.testutil.testModule\nimport software.amazon.smithy.rust.codegen.server.smithy.testutil.serverIntegrationTest\nimport java.util.stream.Stream\n\nclass ServerEventStreamMarshallerGeneratorTest {\n    @ParameterizedTest\n    @ArgumentsSource(TestCasesProvider::class)\n    fun test(testCase: TestCase) {\n        serverIntegrationTest(testCase.eventStreamTestCase.model) { codegenContext, rustCrate ->\n            rustCrate.testModule {\n                writeMarshallTestCases(codegenContext, testCase.eventStreamTestCase, optionalBuilderInputs = true)\n            }\n        }\n    }\n}\n\ndata class TestCase(\n    val eventStreamTestCase: EventStreamTestModels.TestCase,\n    val publicConstrainedTypes: Boolean,\n) {\n    override fun toString(): String = \"$eventStreamTestCase, publicConstrainedTypes = $publicConstrainedTypes\"\n}\n\nclass TestCasesProvider : ArgumentsProvider {\n    override fun provideArguments(context: ExtensionContext?): Stream<out Arguments> =\n        EventStreamTestModels.TEST_CASES\n            .flatMap { testCase ->\n                listOf(\n                    TestCase(testCase, publicConstrainedTypes = false),\n                    TestCase(testCase, publicConstrainedTypes = true),\n                )\n            }.map { Arguments.of(it) }.stream()\n}\n"
  },
  {
    "path": "codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/protocols/eventstream/ServerEventStreamUnmarshallerGeneratorTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.protocols.eventstream\n\nimport org.junit.jupiter.params.ParameterizedTest\nimport org.junit.jupiter.params.provider.ArgumentsSource\nimport software.amazon.smithy.rust.codegen.core.testutil.EventStreamUnmarshallTestCases.writeUnmarshallTestCases\nimport software.amazon.smithy.rust.codegen.core.testutil.IntegrationTestParams\nimport software.amazon.smithy.rust.codegen.core.testutil.testModule\nimport software.amazon.smithy.rust.codegen.server.smithy.testutil.serverIntegrationTest\n\nclass ServerEventStreamUnmarshallerGeneratorTest {\n    @ParameterizedTest\n    @ArgumentsSource(TestCasesProvider::class)\n    fun test(testCase: TestCase) {\n        // TODO(https://github.com/smithy-lang/smithy-rs/issues/1442): Enable tests for `publicConstrainedTypes = false`\n        // by deleting this if/return\n        if (!testCase.publicConstrainedTypes) {\n            return\n        }\n\n        serverIntegrationTest(\n            testCase.eventStreamTestCase.model,\n            IntegrationTestParams(service = \"test#TestService\"),\n        ) { codegenContext, rustCrate ->\n            rustCrate.testModule {\n                writeUnmarshallTestCases(\n                    codegenContext,\n                    testCase.eventStreamTestCase,\n                    optionalBuilderInputs = true,\n                )\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/protocols/serialize/CborConstraintsIntegrationTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\npackage software.amazon.smithy.rust.codegen.server.smithy.protocols.serialize\n\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.rust.codegen.core.testutil.IntegrationTestParams\nimport software.amazon.smithy.rust.codegen.core.testutil.ServerAdditionalSettings\nimport software.amazon.smithy.rust.codegen.server.smithy.ModelProtocol\nimport software.amazon.smithy.rust.codegen.server.smithy.loadSmithyConstraintsModelForProtocol\nimport software.amazon.smithy.rust.codegen.server.smithy.testutil.serverIntegrationTest\n\nclass CborConstraintsIntegrationTest {\n    @Test\n    fun `ensure CBOR implementation works for all constraint types`() {\n        val (model, serviceShape) = loadSmithyConstraintsModelForProtocol(ModelProtocol.Rpcv2Cbor)\n        // The test should compile; no further testing is required.\n        serverIntegrationTest(\n            model,\n            IntegrationTestParams(\n                service = serviceShape.toString(),\n                additionalSettings = ServerAdditionalSettings.builder().generateCodegenComments().toObjectNode(),\n            ),\n        ) { _, _ ->\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/protocols/serialize/CborSerializerAndParserGeneratorSerdeRoundTripIntegrationTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.protocols.serialize\n\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.shapes.BlobShape\nimport software.amazon.smithy.model.shapes.CollectionShape\nimport software.amazon.smithy.model.shapes.ListShape\nimport software.amazon.smithy.model.shapes.MapShape\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.NumberShape\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.model.shapes.StringShape\nimport software.amazon.smithy.model.shapes.StructureShape\nimport software.amazon.smithy.model.shapes.TimestampShape\nimport software.amazon.smithy.model.shapes.UnionShape\nimport software.amazon.smithy.model.traits.ErrorTrait\nimport software.amazon.smithy.model.transform.ModelTransformer\nimport software.amazon.smithy.protocoltests.traits.AppliesTo\nimport software.amazon.smithy.rust.codegen.core.rustlang.Attribute\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.DependencyScope\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustMetadata\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustWriter\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.smithy.CodegenContext\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.SymbolMetadataProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.expectRustMetadata\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.protocol.BrokenTest\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.protocol.FailingTest\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.protocol.ProtocolSupport\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.protocol.ProtocolTestGenerator\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.protocol.ServiceShapeId.RPC_V2_CBOR\nimport software.amazon.smithy.rust.codegen.core.smithy.generators.protocol.TestCase\nimport software.amazon.smithy.rust.codegen.core.smithy.protocols.ProtocolFunctions\nimport software.amazon.smithy.rust.codegen.core.testutil.IntegrationTestParams\nimport software.amazon.smithy.rust.codegen.core.testutil.unitTest\nimport software.amazon.smithy.rust.codegen.core.util.UNREACHABLE\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\nimport software.amazon.smithy.rust.codegen.core.util.inputShape\nimport software.amazon.smithy.rust.codegen.core.util.toSnakeCase\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenContext\nimport software.amazon.smithy.rust.codegen.server.smithy.customize.ServerCodegenDecorator\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.ServerBuilderGenerator\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.ServerInstantiator\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.protocol.ServerProtocolTestGenerator\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.protocol.ServerRpcV2CborProtocol\nimport software.amazon.smithy.rust.codegen.server.smithy.generators.serverBuilderSymbol\nimport software.amazon.smithy.rust.codegen.server.smithy.protocols.ServerRpcV2CborFactory\nimport software.amazon.smithy.rust.codegen.server.smithy.testutil.serverIntegrationTest\nimport java.util.function.Predicate\nimport java.util.logging.Logger\n\n/**\n * This lives in `codegen-server` because we want to run a full integration test for convenience,\n * but there's really nothing server-specific here. We're just testing that the CBOR (de)serializers work like\n * the ones generated by `ciborium`. This is a good exhaustive litmus test for correctness, since `ciborium`\n * is battle-tested.\n */\ninternal class CborSerializerAndParserGeneratorSerdeRoundTripIntegrationTest {\n    class DeriveSerdeSerializeDeserializeSymbolMetadataProvider(\n        private val base: RustSymbolProvider,\n    ) : SymbolMetadataProvider(base) {\n        private val serdeDeserialize =\n            CargoDependency.Serde.copy(scope = DependencyScope.Compile).toType().resolve(\"Deserialize\")\n        private val serdeSerialize =\n            CargoDependency.Serde.copy(scope = DependencyScope.Compile).toType().resolve(\"Serialize\")\n\n        private fun addDeriveSerdeSerializeDeserialize(shape: Shape): RustMetadata {\n            check(shape !is MemberShape)\n\n            val baseMetadata = base.toSymbol(shape).expectRustMetadata()\n            return baseMetadata.withDerives(serdeSerialize, serdeDeserialize)\n        }\n\n        override fun memberMeta(memberShape: MemberShape): RustMetadata {\n            val baseMetadata = base.toSymbol(memberShape).expectRustMetadata()\n            return baseMetadata.copy(\n                additionalAttributes =\n                    baseMetadata.additionalAttributes +\n                        Attribute(\n                            \"\"\"serde(rename = \"${memberShape.memberName}\")\"\"\",\n                            isDeriveHelper = true,\n                        ),\n            )\n        }\n\n        override fun structureMeta(structureShape: StructureShape) = addDeriveSerdeSerializeDeserialize(structureShape)\n\n        override fun unionMeta(unionShape: UnionShape) = addDeriveSerdeSerializeDeserialize(unionShape)\n\n        override fun enumMeta(stringShape: StringShape) = addDeriveSerdeSerializeDeserialize(stringShape)\n\n        override fun listMeta(listShape: ListShape): RustMetadata = addDeriveSerdeSerializeDeserialize(listShape)\n\n        override fun mapMeta(mapShape: MapShape): RustMetadata = addDeriveSerdeSerializeDeserialize(mapShape)\n\n        override fun stringMeta(stringShape: StringShape): RustMetadata =\n            addDeriveSerdeSerializeDeserialize(stringShape)\n\n        override fun numberMeta(numberShape: NumberShape): RustMetadata =\n            addDeriveSerdeSerializeDeserialize(numberShape)\n\n        override fun blobMeta(blobShape: BlobShape): RustMetadata = addDeriveSerdeSerializeDeserialize(blobShape)\n    }\n\n    fun prepareRpcV2CborModel(): Model {\n        var model = Model.assembler().discoverModels().assemble().result.get()\n\n        // Filter out `timestamp` and `blob` shapes: those map to runtime types in `aws-smithy-types` on\n        // which we can't `#[derive(serde::Deserialize)]`.\n        // Note we can't use `ModelTransformer.removeShapes` because it will leave the model in an inconsistent state\n        // when removing list/set shape member shapes.\n        val removeTimestampAndBlobShapes: Predicate<Shape> =\n            Predicate { shape ->\n                when (shape) {\n                    is MemberShape -> {\n                        val targetShape = model.expectShape(shape.target)\n                        targetShape is BlobShape || targetShape is TimestampShape\n                    }\n                    is BlobShape, is TimestampShape -> true\n                    is CollectionShape -> {\n                        val targetShape = model.expectShape(shape.member.target)\n                        targetShape is BlobShape || targetShape is TimestampShape\n                    }\n                    else -> false\n                }\n            }\n\n        fun removeShapesByShapeId(shapeIds: Set<ShapeId>): Predicate<Shape> {\n            val predicate: Predicate<Shape> =\n                Predicate { shape ->\n                    when (shape) {\n                        is MemberShape -> {\n                            val targetShape = model.expectShape(shape.target)\n                            shapeIds.contains(targetShape.id)\n                        }\n                        is CollectionShape -> {\n                            val targetShape = model.expectShape(shape.member.target)\n                            shapeIds.contains(targetShape.id)\n                        }\n                        else -> {\n                            shapeIds.contains(shape.id)\n                        }\n                    }\n                }\n            return predicate\n        }\n\n        val modelTransformer = ModelTransformer.create()\n        model =\n            modelTransformer.removeShapesIf(\n                modelTransformer.removeShapesIf(model, removeTimestampAndBlobShapes),\n                // These enums do not serialize their variants using the Rust members' names.\n                // We'd have to tack on `#[serde(rename = \"name\")]` using the proper name defined in the Smithy enum definition.\n                // But we have no way of injecting that attribute on Rust enum variants in the code generator.\n                // So we just remove these problematic shapes.\n                removeShapesByShapeId(\n                    setOf(\n                        ShapeId.from(\"smithy.protocoltests.shared#FooEnum\"),\n                        ShapeId.from(\"smithy.protocoltests.rpcv2Cbor#TestEnum\"),\n                    ),\n                ),\n            )\n\n        return model\n    }\n\n    @Test\n    fun `ciborium round trip`() {\n        val addDeriveSerdeSerializeDeserializeDecorator =\n            object : ServerCodegenDecorator {\n                override val name: String = \"Add `#[derive(serde::Serialize, serde::Deserialize)]`\"\n                override val order: Byte = 0\n\n                override fun symbolProvider(base: RustSymbolProvider): RustSymbolProvider =\n                    DeriveSerdeSerializeDeserializeSymbolMetadataProvider(base)\n            }\n\n        // Don't generate protocol tests, because it'll attempt to pull out `params` for member shapes we'll remove\n        // from the model.\n        val noProtocolTestsDecorator =\n            object : ServerCodegenDecorator {\n                override val name: String = \"Don't generate protocol tests\"\n                override val order: Byte = 0\n\n                override fun protocolTestGenerator(\n                    codegenContext: ServerCodegenContext,\n                    baseGenerator: ProtocolTestGenerator,\n                ): ProtocolTestGenerator {\n                    val noOpProtocolTestsGenerator =\n                        object : ProtocolTestGenerator() {\n                            override val codegenContext: CodegenContext\n                                get() = baseGenerator.codegenContext\n                            override val protocolSupport: ProtocolSupport\n                                get() = baseGenerator.protocolSupport\n                            override val operationShape: OperationShape\n                                get() = baseGenerator.operationShape\n                            override val appliesTo: AppliesTo\n                                get() = baseGenerator.appliesTo\n                            override val logger: Logger\n                                get() = Logger.getLogger(javaClass.name)\n                            override val expectFail: Set<FailingTest>\n                                get() = baseGenerator.expectFail\n                            override val brokenTests: Set<BrokenTest>\n                                get() = emptySet()\n                            override val generateOnly: Set<String>\n                                get() = baseGenerator.generateOnly\n                            override val disabledTests: Set<String>\n                                get() = baseGenerator.disabledTests\n\n                            override fun RustWriter.renderAllTestCases(allTests: List<TestCase>) {\n                                // No-op.\n                            }\n                        }\n                    return noOpProtocolTestsGenerator\n                }\n            }\n\n        val model = prepareRpcV2CborModel()\n        val serviceShape = model.expectShape(ShapeId.from(RPC_V2_CBOR))\n        serverIntegrationTest(\n            model,\n            additionalDecorators = listOf(addDeriveSerdeSerializeDeserializeDecorator, noProtocolTestsDecorator),\n            params = IntegrationTestParams(service = serviceShape.id.toString()),\n        ) { codegenContext, rustCrate ->\n            // TODO(https://github.com/smithy-lang/smithy-rs/issues/1147): NaN != NaN. Ideally we when we address\n            //  this issue, we'd re-use the structure shape comparison code that both client and server protocol test\n            //  generators would use.\n            val expectFail = setOf(\"RpcV2CborSupportsNaNFloatInputs\", \"RpcV2CborSupportsNaNFloatOutputs\")\n\n            val codegenScope =\n                arrayOf(\n                    \"AssertEq\" to RuntimeType.PrettyAssertions.resolve(\"assert_eq!\"),\n                    \"ciborium\" to CargoDependency.Ciborium.toType(),\n                )\n\n            val instantiator = ServerInstantiator(codegenContext, ignoreMissingMembers = true, withinTest = true)\n            val rpcv2Cbor = ServerRpcV2CborProtocol(codegenContext)\n\n            for (operationShape in codegenContext.model.operationShapes) {\n                val serverProtocolTestGenerator =\n                    ServerProtocolTestGenerator(codegenContext, ServerRpcV2CborFactory().support(), operationShape)\n\n                rustCrate.withModule(ProtocolFunctions.serDeModule) {\n                    // The SDK can only serialize operation outputs, so we only ask for response tests.\n                    val responseTests =\n                        serverProtocolTestGenerator.responseTestCases()\n\n                    for (test in responseTests) {\n                        when (test) {\n                            is TestCase.MalformedRequestTest -> UNREACHABLE(\"we did not ask for tests of this kind\")\n                            is TestCase.RequestTest -> UNREACHABLE(\"we did not ask for tests of this kind\")\n                            is TestCase.ResponseTest -> {\n                                val targetShape = test.targetShape\n                                val params = test.testCase.params\n\n                                val serializeFn =\n                                    if (targetShape.hasTrait<ErrorTrait>()) {\n                                        rpcv2Cbor.structuredDataSerializer().serverErrorSerializer(targetShape.id)\n                                    } else {\n                                        rpcv2Cbor.structuredDataSerializer().operationOutputSerializer(operationShape)\n                                    }\n\n                                if (serializeFn == null) {\n                                    // Skip if there's nothing to serialize.\n                                    continue\n                                }\n\n                                if (expectFail.contains(test.id)) {\n                                    writeWithNoFormatting(\"#[should_panic]\")\n                                }\n                                unitTest(\"we_serialize_and_ciborium_deserializes_${test.id.toSnakeCase()}_${test.kind.toString().toSnakeCase()}\") {\n                                    rustTemplate(\n                                        \"\"\"\n                                        let expected = #{InstantiateShape:W};\n                                        let bytes = #{SerializeFn}(&expected)\n                                            .expect(\"our generated CBOR serializer failed\");\n                                        let actual = #{ciborium}::from_reader(::std::io::Cursor::new(&bytes))\n                                           .expect(\"failed to deserialize bytes with `ciborium`\");\n                                        #{AssertEq}(expected, actual);\n                                        \"\"\",\n                                        \"InstantiateShape\" to instantiator.generate(targetShape, params),\n                                        \"SerializeFn\" to serializeFn,\n                                        *codegenScope,\n                                    )\n                                }\n                            }\n                        }\n                    }\n\n                    // The SDK can only deserialize operation inputs, so we only ask for request tests.\n                    val requestTests =\n                        serverProtocolTestGenerator.requestTestCases()\n                    val inputShape = operationShape.inputShape(codegenContext.model)\n                    val err =\n                        if (ServerBuilderGenerator.hasFallibleBuilder(\n                                inputShape,\n                                codegenContext.model,\n                                codegenContext.symbolProvider,\n                                takeInUnconstrainedTypes = true,\n                            )\n                        ) {\n                            \"\"\".expect(\"builder failed to build\")\"\"\"\n                        } else {\n                            \"\"\n                        }\n\n                    for (test in requestTests) {\n                        when (test) {\n                            is TestCase.MalformedRequestTest -> UNREACHABLE(\"we did not ask for tests of this kind\")\n                            is TestCase.ResponseTest -> UNREACHABLE(\"we did not ask for tests of this kind\")\n                            is TestCase.RequestTest -> {\n                                val targetShape = operationShape.inputShape(codegenContext.model)\n                                val params = test.testCase.params\n\n                                val deserializeFn =\n                                    rpcv2Cbor.structuredDataParser().serverInputParser(operationShape)\n                                        ?: // Skip if there's nothing to serialize.\n                                        continue\n\n                                if (expectFail.contains(test.id)) {\n                                    writeWithNoFormatting(\"#[should_panic]\")\n                                }\n                                unitTest(\"ciborium_serializes_and_we_deserialize_${test.id.toSnakeCase()}_${test.kind.toString().toSnakeCase()}\") {\n                                    rustTemplate(\n                                        \"\"\"\n                                        let expected = #{InstantiateShape:W};\n                                        let mut bytes = Vec::new();\n                                        #{ciborium}::into_writer(&expected, &mut bytes)\n                                            .expect(\"failed to serialize to `Vec<u8>` with `ciborium`\");\n                                        let input = #{InputBuilder}::default();\n                                        let input = #{DeserializeFn}(&bytes, input)\n                                           .expect(\"our generated CBOR deserializer failed\");\n                                        let actual = input.build()$err;\n                                        #{AssertEq}(expected, actual);\n                                        \"\"\",\n                                        \"InstantiateShape\" to instantiator.generate(targetShape, params),\n                                        \"DeserializeFn\" to deserializeFn,\n                                        \"InputBuilder\" to inputShape.serverBuilderSymbol(codegenContext),\n                                        *codegenScope,\n                                    )\n                                }\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/protocols/serialize/CborServiceShapePreservesCasing.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\npackage software.amazon.smithy.rust.codegen.server.smithy.protocols.serialize\n\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.testutil.IntegrationTestParams\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.testModule\nimport software.amazon.smithy.rust.codegen.core.testutil.tokioTest\nimport software.amazon.smithy.rust.codegen.server.smithy.testutil.ServerHttpTestHelpers\nimport software.amazon.smithy.rust.codegen.server.smithy.testutil.serverIntegrationTest\n\nclass CborServiceShapePreservesCasing {\n    val model =\n        \"\"\"\n        namespace test\n\n        use smithy.rust#serde\n        use smithy.protocols#rpcv2Cbor\n        use smithy.framework#ValidationException\n\n        @rpcv2Cbor\n        service SampleServiceWITHDifferentCASE {\n            operations: [SampleOP],\n        }\n        operation SampleOP {\n            input:= { x: String }\n            output:= { y: String }\n        }\n        \"\"\".asSmithyModel(smithyVersion = \"2\")\n\n    @Test\n    fun `service shape ID is preserved`() {\n        val serviceShape = model.expectShape(ShapeId.from(\"test#SampleServiceWITHDifferentCASE\"))\n        serverIntegrationTest(\n            model,\n            params = IntegrationTestParams(service = serviceShape.id.toString()),\n        ) { codegenContext, rustCrate ->\n            val codegenScope =\n                arrayOf(\n                    \"SerdeJson\" to CargoDependency.SerdeJson.toDevDependency().toType(),\n                    \"Ciborium\" to CargoDependency.Ciborium.toDevDependency().toType(),\n                    \"Hyper\" to RuntimeType.hyper(codegenContext.runtimeConfig),\n                    \"Http\" to RuntimeType.http(codegenContext.runtimeConfig),\n                    \"Tower\" to RuntimeType.Tower,\n                    \"HashMap\" to RuntimeType.HashMap,\n                    *RuntimeType.preludeScope,\n                )\n\n            rustCrate.testModule {\n                rustTemplate(\n                    \"\"\"\n                    async fn handler(input: crate::input::SampleOpInput) -> crate::output::SampleOpOutput {\n                        assert_eq!(\n                            input.x.expect(\"missing value for x\"),\n                            \"test\",\n                            \"input does not contain the correct data\"\n                        );\n                        crate::output::SampleOpOutput {\n                            y: Some(\"test response\".to_owned()),\n                        }\n                    }\n\n                    fn get_input() -> Vec<u8> {\n                        let json = r##\"{\"x\": \"test\"}\"##;\n                        let value: #{SerdeJson}::Value = #{SerdeJson}::from_str(json).expect(\"cannot parse JSON\");\n                        let mut cbor_data = #{Vec}::new();\n                        #{Ciborium}::ser::into_writer(&value, &mut cbor_data)\n                            .expect(\"cannot write JSON to CBOR\");\n                        cbor_data\n                    }\n                    \"\"\",\n                    *codegenScope,\n                )\n\n                tokioTest(\"success_response\") {\n                    rustTemplate(\n                        \"\"\"\n                        let config = crate::SampleServiceWithDifferentCaseConfig::builder().build();\n                        let service = crate::SampleServiceWithDifferentCase::builder(config)\n                            .sample_op(handler)\n                            .build()\n                            .expect(\"could not build service\");\n\n                        let cbor_data = get_input();\n                        // Create a test request\n                        let request = #{Http}::Request::builder()\n                            .uri(\"/service/SampleServiceWITHDifferentCASE/operation/SampleOP\")\n                            .method(\"POST\")\n                            .header(\"content-type\", \"application/cbor\")\n                            .header(\"Smithy-Protocol\", \"rpc-v2-cbor\")\n                            .body(#{CreateBody:W})\n                            .expect(\"Failed to build request\");\n\n                        let response = #{Tower}::ServiceExt::oneshot(service, request)\n                            .await\n                            .expect(\"Failed to call service\");\n                        assert!(response.status().is_success());\n\n                        #{ReadBodyBytes:W}\n                        let data: #{HashMap}<String, serde_json::Value> =\n                            #{Ciborium}::de::from_reader(body.as_ref()).expect(\"could not convert into BTreeMap\");\n\n                        let value = data.get(\"y\")\n                            .and_then(|y| y.as_str())\n                            .expect(\"y does not exist\");\n                        assert_eq!(value, \"test response\", \"response doesn't contain expected value\");\n                        \"\"\",\n                        *codegenScope,\n                        \"CreateBody\" to ServerHttpTestHelpers.createBodyFromBytes(codegenContext, \"cbor_data\"),\n                        \"ReadBodyBytes\" to ServerHttpTestHelpers.httpBodyToBytes(codegenContext.runtimeConfig, \"body\", \"response\"),\n                    )\n                }\n\n                tokioTest(\"incorrect_case_fails\") {\n                    rustTemplate(\n                        \"\"\"\n                        let config = crate::SampleServiceWithDifferentCaseConfig::builder().build();\n                        let service = crate::SampleServiceWithDifferentCase::builder(config)\n                            .sample_op(handler)\n                            .build()\n                            .expect(\"could not build service\");\n\n                        let cbor_data = get_input();\n                        // Test with incorrect case in service name\n                        let request = #{Http}::Request::builder()\n                            .uri(\"/service/SampleServiceWithDifferentCase/operation/SampleOP\")\n                            .method(\"POST\")\n                            .header(\"content-type\", \"application/cbor\")\n                            .header(\"Smithy-Protocol\", \"rpc-v2-cbor\")\n                            .body(#{CreateBody1:W})\n                            .expect(\"failed to build request\");\n\n                        let response = #{Tower}::ServiceExt::oneshot(service.clone(), request)\n                            .await\n                            .expect(\"failed to call service\");\n\n                        // Should return 404 Not Found\n                        assert_eq!(response.status(), #{Http}::StatusCode::NOT_FOUND);\n\n                        // Test with incorrect case in operation name\n                        let request = #{Http}::Request::builder()\n                            .uri(\"/service/SampleServiceWITHDifferentCASE/operation/sampleop\")  // lowercase operation\n                            .method(\"POST\")\n                            .header(\"content-type\", \"application/cbor\")\n                            .header(\"Smithy-Protocol\", \"rpc-v2-cbor\")\n                            .body(#{CreateBody2:W})\n                            .expect(\"failed to build request\");\n\n                        let response = #{Tower}::ServiceExt::oneshot(service, request)\n                            .await\n                            .expect(\"failed to call service\");\n\n                        // Should return 404 Not Found\n                        assert_eq!(response.status(), #{Http}::StatusCode::NOT_FOUND);\n                        \"\"\",\n                        *codegenScope,\n                        \"CreateBody1\" to ServerHttpTestHelpers.createBodyFromBytes(codegenContext, \"cbor_data.clone()\"),\n                        \"CreateBody2\" to ServerHttpTestHelpers.createBodyFromBytes(codegenContext, \"cbor_data\"),\n                    )\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/testutil/ServerHttpTestHelpers.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.testutil\n\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.HttpVersion\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerCargoDependency\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerCodegenContext\n\n/**\n * Central location for HTTP version-agnostic test helpers.\n * These helpers work with both HTTP 0.x and HTTP 1.x depending on the codegenContext.\n */\nobject ServerHttpTestHelpers {\n    /**\n     * Returns a RuntimeType scope that includes the correct HTTP types for the given context.\n     * This should be used instead of hardcoding RuntimeType.Http, RuntimeType.Hyper, etc.\n     */\n    fun getHttpRuntimeTypeScope(codegenContext: ServerCodegenContext): Array<Pair<String, RuntimeType>> {\n        val httpModule =\n            if (codegenContext.runtimeConfig.httpVersion == HttpVersion.Http0x) {\n                CargoDependency.Http0x\n            } else {\n                CargoDependency.Http1x\n            }\n        return arrayOf(\n            \"Http\" to httpModule.toType(),\n            \"Hyper\" to RuntimeType.hyper(codegenContext.runtimeConfig),\n            \"Tower\" to RuntimeType.Tower,\n            *RuntimeType.preludeScope,\n        )\n    }\n\n    /**\n     * Creates a writable that generates code to create an HTTP body from bytes.\n     *\n     * For HTTP 0.x: `smithy_http_server::body::Body::from(bytes)` (legacy)\n     * For HTTP 1.x: `http_body_util::Full::new(Bytes::from(bytes))`\n     *\n     * Note: The `bytesVariable` should be a variable containing bytes data (Vec<u8>, Bytes, etc.)\n     */\n    fun createBodyFromBytes(\n        codegenContext: ServerCodegenContext,\n        bytesVariable: String,\n    ): Writable =\n        writable {\n            if (codegenContext.runtimeConfig.httpVersion == HttpVersion.Http1x) {\n                rustTemplate(\n                    \"\"\"#{HttpBodyUtilFull}::new(#{Bytes}::from($bytesVariable))\"\"\",\n                    \"HttpBodyUtilFull\" to CargoDependency.HttpBodyUtil01x.toType().resolve(\"Full\"),\n                    \"Bytes\" to RuntimeType.Bytes,\n                )\n            } else {\n                rustTemplate(\n                    \"\"\"#{SmithyHttpServerBody}::from($bytesVariable)\"\"\",\n                    \"SmithyHttpServerBody\" to\n                        ServerCargoDependency.smithyHttpServer(codegenContext.runtimeConfig)\n                            .toType().resolve(\"body\").resolve(\"Body\"),\n                )\n            }\n        }\n\n    /**\n     * Returns a Writable that generates version-appropriate code for reading HTTP response body to bytes.\n     * For HTTP 1.x: Uses http_body_util::BodyExt::collect()\n     * For HTTP 0.x: Uses hyper::body::to_bytes()\n     *\n     * @param responseVarName The name of the HTTP response variable (e.g., \"http_response\")\n     */\n    fun httpBodyToBytes(\n        runtimeConfig: RuntimeConfig,\n        bodyVarName: String,\n        responseVarName: String,\n    ): Writable =\n        writable {\n            when (runtimeConfig.httpVersion) {\n                HttpVersion.Http1x ->\n                    rustTemplate(\n                        \"\"\"\n                        use #{HttpBodyUtil}::BodyExt;\n                        let $bodyVarName = $responseVarName.into_body().collect().await.expect(\"unable to collect body\").to_bytes();\n                        \"\"\",\n                        \"HttpBodyUtil\" to CargoDependency.HttpBodyUtil01x.toType(),\n                    )\n\n                HttpVersion.Http0x ->\n                    rustTemplate(\n                        \"\"\"\n                        let $bodyVarName = #{Hyper}::body::to_bytes($responseVarName.into_body()).await.expect(\"unable to extract body to bytes\");\n                        \"\"\",\n                        \"Hyper\" to RuntimeType.Hyper0x,\n                    )\n            }\n        }\n\n    /**\n     * Creates a writable that generates the proper HTTP request builder code.\n     * Returns a string expression that creates a request with the given body.\n     */\n    fun createHttpRequest(\n        codegenContext: ServerCodegenContext,\n        uri: String,\n        method: String,\n        headers: Map<String, String>,\n        bodyVariable: String,\n    ): Writable =\n        writable {\n            val httpModule =\n                if (codegenContext.runtimeConfig.httpVersion == HttpVersion.Http1x) {\n                    CargoDependency.Http1x.toType()\n                } else {\n                    CargoDependency.Http0x.toType()\n                }\n            rustTemplate(\n                \"\"\"\n            #{Http}::Request::builder()\n                .uri($uri)\n                .method($method)\n                #{Headers:W}\n                .body(#{Body:W})\n                .expect(\"failed to build request\")\n            \"\"\",\n                \"Http\" to httpModule,\n                \"Headers\" to\n                    writable {\n                        headers.forEach { (name, value) ->\n                            rust(\".header(${name.dq()}, ${value.dq()})\")\n                        }\n                    },\n                \"Body\" to createBodyFromBytes(codegenContext, bodyVariable),\n            )\n        }\n}\n\n/**\n * Extension function to get HTTP dependencies scope with correct types.\n */\nfun ServerCodegenContext.getHttpTestScope(): Array<Pair<String, RuntimeType>> {\n    return ServerHttpTestHelpers.getHttpRuntimeTypeScope(this)\n}\n\nprivate fun String.dq() = \"\\\"$this\\\"\"\n"
  },
  {
    "path": "codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/transformers/RecursiveConstraintViolationBoxerTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.transformers\n\nimport io.kotest.matchers.shouldBe\nimport org.junit.jupiter.params.ParameterizedTest\nimport org.junit.jupiter.params.provider.ArgumentsSource\nimport software.amazon.smithy.rust.codegen.core.util.hasTrait\nimport software.amazon.smithy.rust.codegen.core.util.lookup\nimport software.amazon.smithy.rust.codegen.server.smithy.RecursiveConstraintViolationsTest\nimport software.amazon.smithy.rust.codegen.server.smithy.traits.ConstraintViolationRustBoxTrait\nimport kotlin.streams.toList\n\ninternal class RecursiveConstraintViolationBoxerTest {\n    @ParameterizedTest\n    @ArgumentsSource(RecursiveConstraintViolationsTest.RecursiveConstraintViolationsTestProvider::class)\n    fun `recursive constraint violation boxer test`(testCase: RecursiveConstraintViolationsTest.TestCase) {\n        val transformed = RecursiveConstraintViolationBoxer.transform(testCase.model)\n\n        val shapesWithConstraintViolationRustBoxTrait =\n            transformed.shapes().filter {\n                it.hasTrait<ConstraintViolationRustBoxTrait>()\n            }.toList()\n\n        // Only the provided member shape should have the trait attached.\n        shapesWithConstraintViolationRustBoxTrait shouldBe\n            listOf(transformed.lookup(testCase.shapeIdWithConstraintViolationRustBoxTrait))\n    }\n}\n"
  },
  {
    "path": "codegen-server/src/test/kotlin/software/amazon/smithy/rust/codegen/server/smithy/validators/CustomValidationExceptionValidatorTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.server.smithy.validators\n\nimport io.kotest.assertions.throwables.shouldThrow\nimport io.kotest.matchers.collections.shouldHaveSize\nimport io.kotest.matchers.shouldBe\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.model.validation.Severity\nimport software.amazon.smithy.model.validation.ValidatedResultException\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\n\nclass CustomValidationExceptionValidatorTest {\n    @Test\n    fun `should error when validationException lacks error trait`() {\n        val exception =\n            shouldThrow<ValidatedResultException> {\n                \"\"\"\n                namespace test\n                use smithy.framework.rust#validationException\n                use smithy.framework.rust#validationMessage\n\n                @validationException\n                structure ValidationError {\n                    @validationMessage\n                    message: String\n                }\n                \"\"\".asSmithyModel(smithyVersion = \"2\")\n            }\n        val events = exception.validationEvents.filter { it.severity == Severity.ERROR }\n\n        events shouldHaveSize 1\n        events[0].shapeId.get() shouldBe ShapeId.from(\"test#ValidationError\")\n        events[0].id shouldBe \"CustomValidationException.MissingErrorTrait\"\n    }\n\n    @Test\n    fun `should error when validationException has no validationMessage field`() {\n        val exception =\n            shouldThrow<ValidatedResultException> {\n                \"\"\"\n                namespace test\n                use smithy.framework.rust#validationException\n\n                @validationException\n                @error(\"client\")\n                structure ValidationError {\n                    code: String\n                }\n                \"\"\".asSmithyModel(smithyVersion = \"2\")\n            }\n        val events = exception.validationEvents.filter { it.severity == Severity.ERROR }\n\n        events shouldHaveSize 1\n        events[0].shapeId.get() shouldBe ShapeId.from(\"test#ValidationError\")\n        events[0].id shouldBe \"CustomValidationException.MissingMessageField\"\n    }\n\n    @Test\n    fun `should error when validationException has multiple explicit validationMessage fields`() {\n        val exception =\n            shouldThrow<ValidatedResultException> {\n                \"\"\"\n                namespace test\n                use smithy.framework.rust#validationException\n                use smithy.framework.rust#validationMessage\n\n                @validationException\n                @error(\"client\")\n                structure ValidationError {\n                    @validationMessage\n                    message: String,\n                    @validationMessage\n                    details: String\n                }\n                \"\"\".asSmithyModel(smithyVersion = \"2\")\n            }\n        val events = exception.validationEvents.filter { it.severity == Severity.ERROR }\n\n        events shouldHaveSize 1\n        events[0].shapeId.get() shouldBe ShapeId.from(\"test#ValidationError\")\n        events[0].id shouldBe \"CustomValidationException.MultipleMessageFields\"\n    }\n\n    @Test\n    fun `should error when validationException has explicit validationMessage and implicit message fields`() {\n        val exception =\n            shouldThrow<ValidatedResultException> {\n                \"\"\"\n                namespace test\n                use smithy.framework.rust#validationException\n                use smithy.framework.rust#validationMessage\n\n                @validationException\n                @error(\"client\")\n                structure ValidationError {\n                    message: String,\n                    @validationMessage\n                    details: String,\n                }\n                \"\"\".asSmithyModel(smithyVersion = \"2\")\n            }\n        val events = exception.validationEvents.filter { it.severity == Severity.ERROR }\n\n        events shouldHaveSize 1\n        events[0].shapeId.get() shouldBe ShapeId.from(\"test#ValidationError\")\n        events[0].id shouldBe \"CustomValidationException.MultipleMessageFields\"\n    }\n\n    @Test\n    fun `should error when constrained shape lacks default trait`() {\n        val exception =\n            shouldThrow<ValidatedResultException> {\n                \"\"\"\n                namespace test\n                use smithy.framework.rust#validationException\n                use smithy.framework.rust#validationMessage\n\n                @validationException\n                @error(\"client\")\n                structure ValidationError {\n                    @validationMessage\n                    message: String,\n                    constrainedField: ConstrainedString\n                }\n\n                @length(min: 1, max: 10)\n                string ConstrainedString\n                \"\"\".asSmithyModel(smithyVersion = \"2\")\n            }\n        val events = exception.validationEvents.filter { it.severity == Severity.ERROR }\n\n        events shouldHaveSize 1\n        events[0].id shouldBe \"CustomValidationException.MissingDefault\"\n    }\n\n    @Test\n    fun `should pass validation for properly configured validationException`() {\n        \"\"\"\n        namespace test\n        use smithy.framework.rust#validationException\n        use smithy.framework.rust#validationMessage\n\n        @validationException\n        @error(\"client\")\n        structure ValidationError {\n            @validationMessage\n            message: String\n        }\n        \"\"\".asSmithyModel(smithyVersion = \"2\")\n    }\n\n    @Test\n    fun `should pass validation for validationException with constrained shape having default`() {\n        \"\"\"\n        namespace test\n        use smithy.framework.rust#validationException\n        use smithy.framework.rust#validationMessage\n\n        @validationException\n        @error(\"client\")\n        structure ValidationError {\n            @validationMessage\n            message: String,\n            @default(\"default\")\n            constrainedField: ConstrainedString\n        }\n\n        @length(min: 1, max: 10)\n        @default(\"default\")\n        string ConstrainedString\n        \"\"\".asSmithyModel(smithyVersion = \"2\")\n    }\n}\n"
  },
  {
    "path": "codegen-server-test/.gitignore",
    "content": "smithy-build.json\n"
  },
  {
    "path": "codegen-server-test/README.md",
    "content": "# Server Codegen Integration Tests\n\nRefer to `../codegen-client-test/README.md` for documentation on how to use this\nmodule. This module is analogous to the `codegen-client-test` one, but it's named\n`codegen-server-test` and it runs the `rust-server-codegen` Smithy build\nplugin instead.\n"
  },
  {
    "path": "codegen-server-test/build.gradle.kts",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\ndescription = \"Generates Rust code from Smithy models and runs the protocol tests\"\nextra[\"displayName\"] = \"Smithy :: Rust :: Codegen :: Server :: Test\"\nextra[\"moduleName\"] = \"software.amazon.smithy.rust.kotlin.codegen.server.test\"\n\ntasks[\"jar\"].enabled = false\n\nplugins {\n    java\n    alias(libs.plugins.smithy.gradle.base)\n    alias(libs.plugins.smithy.gradle.jar)\n}\n\nval properties = PropertyRetriever(rootProject, project)\n\nval pluginName = \"rust-server-codegen\"\nval workingDirUnderBuildDir = \"smithyprojections/codegen-server-test/\"\n\ndependencies {\n    implementation(project(\":codegen-server\"))\n    implementation(libs.smithy.aws.protocol.tests)\n    implementation(libs.smithy.protocol.tests)\n    implementation(libs.smithy.protocol.test.traits)\n    implementation(libs.smithy.aws.traits)\n    implementation(libs.smithy.validation.model)\n}\n\nsmithy {\n    format.set(false)\n}\n\nval commonCodegenTests = \"../codegen-core/common-test-models\".let { commonModels ->\n    listOf(\n        CodegenTest(\n            \"crate#Config\",\n            \"naming_test_ops\",\n            imports = listOf(\"$commonModels/naming-obstacle-course-ops.smithy\"),\n        ),\n        CodegenTest(\n            \"casing#ACRONYMInside_Service\",\n            \"naming_test_casing\",\n            imports = listOf(\"$commonModels/naming-obstacle-course-casing.smithy\"),\n        ),\n        CodegenTest(\n            \"naming_obs_structs#NamingObstacleCourseStructs\",\n            \"naming_test_structs\",\n            imports = listOf(\"$commonModels/naming-obstacle-course-structs.smithy\"),\n        ),\n        CodegenTest(\n            \"com.amazonaws.simple#SimpleService\",\n            \"simple\",\n            imports = listOf(\"$commonModels/simple.smithy\"),\n        ),\n        // Generate both http@0 and http@1 versions for protocol tests\n        CodegenTest(\n            \"smithy.protocoltests.rpcv2Cbor#RpcV2Protocol\",\n            \"rpcv2Cbor\",\n        ),\n        CodegenTest(\n            \"smithy.protocoltests.rpcv2Cbor#RpcV2CborService\",\n            \"rpcv2Cbor_extras\",\n            imports = listOf(\"$commonModels/rpcv2Cbor-extras.smithy\"),\n            extraCodegenConfig = \"\"\"\"alwaysSendEventStreamInitialResponse\": true\"\"\",\n        ),\n        CodegenTest(\n            \"smithy.protocoltests.rpcv2Cbor#RpcV2CborService\",\n            \"rpcv2Cbor_extras_no_initial_response\",\n            imports = listOf(\"$commonModels/rpcv2Cbor-extras.smithy\"),\n        ),\n        CodegenTest(\n            \"com.amazonaws.constraints#ConstraintsService\",\n            \"constraints_without_public_constrained_types\",\n            imports = listOf(\"$commonModels/constraints.smithy\"),\n            extraCodegenConfig = \"\"\"\"publicConstrainedTypes\": false\"\"\",\n        ),\n        CodegenTest(\n            \"com.amazonaws.constraints#UniqueItemsService\",\n            \"unique_items\",\n            imports = listOf(\"$commonModels/unique-items.smithy\"),\n        ),\n        CodegenTest(\n            \"com.amazonaws.constraints#ConstraintsService\",\n            \"constraints\",\n            imports = listOf(\"$commonModels/constraints.smithy\"),\n        ),\n        CodegenTest(\n            \"aws.protocoltests.restjson#RestJson\",\n            \"rest_json\",\n            extraCodegenConfig = \"\"\"\"debugMode\": true\"\"\",\n        ),\n        CodegenTest(\n            \"aws.protocoltests.restjson#RestJsonExtras\",\n            \"rest_json_extras\",\n            imports = listOf(\"$commonModels/rest-json-extras.smithy\"),\n        ),\n        CodegenTest(\n            \"aws.protocoltests.restjson.validation#RestJsonValidation\",\n            \"rest_json_validation\",\n            // `@range` trait is used on floating point shapes, which we deliberately don't want to support.\n            // See https://github.com/smithy-lang/smithy-rs/issues/1401.\n            extraCodegenConfig = \"\"\"\"ignoreUnsupportedConstraints\": true\"\"\",\n        ),\n        CodegenTest(\n            \"aws.protocoltests.json10#JsonRpc10\",\n            \"json_rpc10\",\n        ),\n        CodegenTest(\n            \"aws.protocoltests.json#JsonProtocol\",\n            \"json_rpc11\",\n        ),\n        CodegenTest(\n            \"aws.protocoltests.misc#MiscService\",\n            \"misc\",\n            imports = listOf(\"$commonModels/misc.smithy\"),\n        ),\n        CodegenTest(\n            \"com.amazonaws.ebs#Ebs\",\n            \"ebs\",\n            imports = listOf(\"$commonModels/ebs.json\"),\n        ),\n        CodegenTest(\n            \"com.amazonaws.s3#AmazonS3\",\n            \"s3\",\n        ),\n        CodegenTest(\n            \"com.aws.example#PokemonService\",\n            \"pokemon-service-server-sdk\",\n            imports = listOf(\"$commonModels/pokemon.smithy\", \"$commonModels/pokemon-common.smithy\"),\n            extraCodegenConfig = \"\"\"\"debugMode\": true\"\"\",\n        ),\n        CodegenTest(\n            \"com.aws.example#PokemonService\",\n            \"pokemon-service-awsjson-server-sdk\",\n            imports = listOf(\"$commonModels/pokemon-awsjson.smithy\", \"$commonModels/pokemon-common.smithy\"),\n        ),\n    ).flatMap { it.bothHttpVersions() }\n}\n// When iterating on protocol tests use this to speed up codegen:\n//    .filter { it.module == \"rpcv2Cbor_extras\" || it.module == \"rpcv2Cbor_extras_no_initial_response\" }\n\nval customCodegenTests = \"custom-test-models\".let { customModels ->\n    CodegenTest(\n        \"com.aws.example#CustomValidationExample\",\n        \"custom-validation-exception-example\",\n        imports = listOf(\"$customModels/custom-validation-exception.smithy\"),\n    ).bothHttpVersions()\n}\n\nval allCodegenTests = commonCodegenTests + customCodegenTests\n\nproject.registerGenerateSmithyBuildTask(rootProject, pluginName, allCodegenTests)\nproject.registerGenerateCargoWorkspaceTask(rootProject, pluginName, allCodegenTests, workingDirUnderBuildDir)\nproject.registerGenerateCargoConfigTomlTask(layout.buildDirectory.dir(workingDirUnderBuildDir).get().asFile)\n\ntasks[\"smithyBuild\"].dependsOn(\"generateSmithyBuild\")\ntasks[\"assemble\"].finalizedBy(\"generateCargoWorkspace\", \"generateCargoConfigToml\")\n\nproject.registerModifyMtimeTask()\nproject.registerCargoCommandsTasks(layout.buildDirectory.dir(workingDirUnderBuildDir).get().asFile)\n\ntasks.register<Exec>(\"cargoTestIntegration\") {\n    dependsOn(\"assemble\")\n    workingDir(projectDir.resolve(\"integration-tests\"))\n    commandLine(\"cargo\", \"test\")\n}\n\ntasks[\"test\"].finalizedBy(cargoCommands(properties).map { it.toString }, \"cargoTestIntegration\")\n\ntasks[\"clean\"].doFirst { delete(\"smithy-build.json\") }\n"
  },
  {
    "path": "codegen-server-test/codegen-server-test-python/build.gradle.kts",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nplugins {\n    java\n    alias(libs.plugins.smithy.gradle.base)\n    alias(libs.plugins.smithy.gradle.jar)\n}\n\ndescription = \"Generates Rust/Python code from Smithy models and runs the protocol tests\"\nextra[\"displayName\"] = \"Smithy :: Rust :: Codegen :: Server :: Python :: Test\"\nextra[\"moduleName\"] = \"software.amazon.smithy.rust.kotlin.codegen.server.python.test\"\n\ntasks.jar.configure {\n    enabled = false\n}\n\nval properties = PropertyRetriever(rootProject, project)\nval buildDir = layout.buildDirectory.get().asFile\n\nval pluginName = \"rust-server-codegen-python\"\nval workingDirUnderBuildDir = \"smithyprojections/codegen-server-test-python/\"\n\nsmithy {\n    outputDirectory = layout.buildDirectory.dir(workingDirUnderBuildDir).get().asFile\n    format = false\n}\n\ndependencies {\n    implementation(project(\":codegen-server:codegen-server-python\"))\n    implementation(libs.smithy.aws.protocol.tests)\n    implementation(libs.smithy.protocol.test.traits)\n    implementation(libs.smithy.aws.traits)\n}\n\nval allCodegenTests = \"../../codegen-core/common-test-models\".let { commonModels ->\n    listOf(\n        CodegenTest(\"com.amazonaws.simple#SimpleService\", \"simple\", imports = listOf(\"$commonModels/simple.smithy\")),\n        CodegenTest(\n            \"com.aws.example#PokemonService\",\n            \"pokemon-service-server-sdk\",\n            imports = listOf(\"$commonModels/pokemon.smithy\", \"$commonModels/pokemon-common.smithy\"),\n        ),\n        CodegenTest(\n            \"com.amazonaws.ebs#Ebs\",\n            \"ebs\",\n            imports = listOf(\"$commonModels/ebs.json\"),\n        ),\n        CodegenTest(\n            \"aws.protocoltests.misc#MiscService\",\n            \"misc\",\n            imports = listOf(\"$commonModels/misc.smithy\"),\n        ),\n        CodegenTest(\n            \"aws.protocoltests.json#JsonProtocol\",\n            \"json_rpc11\",\n        ),\n        CodegenTest(\"aws.protocoltests.json10#JsonRpc10\", \"json_rpc10\"),\n        CodegenTest(\"aws.protocoltests.restjson#RestJson\", \"rest_json\"),\n        CodegenTest(\n            \"aws.protocoltests.restjson#RestJsonExtras\",\n            \"rest_json_extras\",\n            imports = listOf(\"$commonModels/rest-json-extras.smithy\"),\n        ),\n        // TODO(https://github.com/smithy-lang/smithy-rs/issues/2477)\n        // CodegenTest(\n        //     \"aws.protocoltests.restjson.validation#RestJsonValidation\",\n        //     \"rest_json_validation\",\n        //     // `@range` trait is used on floating point shapes, which we deliberately don't want to support.\n        //     // See https://github.com/smithy-lang/smithy-rs/issues/1401.\n        //     extraConfig = \"\"\", \"codegen\": { \"ignoreUnsupportedConstraints\": true } \"\"\",\n        // ),\n        CodegenTest(\n            \"com.amazonaws.constraints#ConstraintsService\",\n            \"constraints\",\n            imports = listOf(\"$commonModels/constraints.smithy\"),\n        ),\n        CodegenTest(\n            \"com.amazonaws.constraints#ConstraintsService\",\n            \"constraints_without_public_constrained_types\",\n            imports = listOf(\"$commonModels/constraints.smithy\"),\n            extraConfig = \"\"\", \"codegen\": { \"publicConstrainedTypes\": false } \"\"\",\n        ),\n        CodegenTest(\n            \"com.amazonaws.constraints#UniqueItemsService\",\n            \"unique_items\",\n            imports = listOf(\"$commonModels/unique-items.smithy\"),\n        ),\n        CodegenTest(\n            \"naming_obs_structs#NamingObstacleCourseStructs\",\n            \"naming_test_structs\",\n            imports = listOf(\"$commonModels/naming-obstacle-course-structs.smithy\"),\n        ),\n        CodegenTest(\"casing#ACRONYMInside_Service\", \"naming_test_casing\", imports = listOf(\"$commonModels/naming-obstacle-course-casing.smithy\")),\n        CodegenTest(\"crate#Config\", \"naming_test_ops\", imports = listOf(\"$commonModels/naming-obstacle-course-ops.smithy\")),\n    )\n}\n\nproject.registerGenerateSmithyBuildTask(rootProject, pluginName, allCodegenTests)\nproject.registerGenerateCargoWorkspaceTask(rootProject, pluginName, allCodegenTests, workingDirUnderBuildDir)\nproject.registerGenerateCargoConfigTomlTask(buildDir.resolve(workingDirUnderBuildDir))\n\ntasks.register(\"stubs\") {\n    description = \"Generate Python stubs for all models\"\n    dependsOn(\"assemble\")\n\n    doLast {\n        allCodegenTests.forEach { test ->\n            val crateDir = layout.buildDirectory.dir(\"$workingDirUnderBuildDir/${test.module}/$pluginName\").get().asFile.path\n            val moduleName = test.module.replace(\"-\", \"_\")\n            exec {\n                commandLine(\"bash\", \"$crateDir/stubgen.sh\", moduleName, \"$crateDir/Cargo.toml\", \"$crateDir/python/$moduleName\")\n            }\n        }\n    }\n}\n\ntasks.smithyBuild.configure {\n    dependsOn(\"generateSmithyBuild\")\n}\ntasks.assemble.configure {\n    finalizedBy(\"generateCargoWorkspace\")\n}\n\nproject.registerModifyMtimeTask()\nproject.registerCargoCommandsTasks(buildDir.resolve(workingDirUnderBuildDir))\n\ntasks.test.configure {\n    finalizedBy(cargoCommands(properties).map { it.toString })\n}\n\ntasks.clean.configure {\n    doFirst {\n        delete(\"smithy-build.json\")\n    }\n}\n"
  },
  {
    "path": "codegen-server-test/codegen-server-test-typescript/build.gradle.kts",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nplugins {\n    java\n    alias(libs.plugins.smithy.gradle.base)\n    alias(libs.plugins.smithy.gradle.jar)\n}\n\ndescription = \"Generates Rust/Typescript code from Smithy models and runs the protocol tests\"\nextra[\"displayName\"] = \"Smithy :: Rust :: Codegen :: Server :: Typescript :: Test\"\nextra[\"moduleName\"] = \"software.amazon.smithy.rust.kotlin.codegen.server.typescript.test\"\n\ntasks.jar.configure {\n    enabled = false\n}\n\nval properties = PropertyRetriever(rootProject, project)\nval buildDir = layout.buildDirectory.get().asFile\n\nval pluginName = \"rust-server-codegen-typescript\"\nval workingDirUnderBuildDir = \"smithyprojections/codegen-server-test-typescript/\"\n\nsmithy {\n    outputDirectory = layout.buildDirectory.dir(workingDirUnderBuildDir).get().asFile\n    format = false\n}\n\ndependencies {\n    implementation(project(\":codegen-server:codegen-server-typescript\"))\n    implementation(libs.smithy.aws.protocol.tests)\n    implementation(libs.smithy.protocol.test.traits)\n    implementation(libs.smithy.aws.traits)\n}\n\nval allCodegenTests = \"../../codegen-core/common-test-models\".let { commonModels ->\n    listOf(\n        CodegenTest(\"com.amazonaws.simple#SimpleService\", \"simple\", imports = listOf(\"$commonModels/simple.smithy\")),\n        CodegenTest(\"com.aws.example.ts#PokemonService\", \"pokemon-service-server-sdk\"),\n    )\n}\n\nproject.registerGenerateSmithyBuildTask(rootProject, pluginName, allCodegenTests)\nproject.registerGenerateCargoWorkspaceTask(rootProject, pluginName, allCodegenTests, workingDirUnderBuildDir)\nproject.registerGenerateCargoConfigTomlTask(buildDir.resolve(workingDirUnderBuildDir))\n\ntasks[\"smithyBuild\"].dependsOn(\"generateSmithyBuild\")\ntasks[\"assemble\"].finalizedBy(\"generateCargoWorkspace\")\n\nproject.registerModifyMtimeTask()\nproject.registerCargoCommandsTasks(buildDir.resolve(workingDirUnderBuildDir))\n\ntasks[\"test\"].finalizedBy(cargoCommands(properties).map { it.toString })\n\ntasks[\"clean\"].doFirst { delete(\"smithy-build.json\") }\n"
  },
  {
    "path": "codegen-server-test/codegen-server-test-typescript/model/pokemon-common.smithy",
    "content": "$version: \"2\"\n\nnamespace com.aws.example\n\nuse smithy.framework#ValidationException\n\n/// A Pokémon species forms the basis for at least one Pokémon.\n@title(\"Pokémon Species\")\nresource PokemonSpecies {\n    identifiers: {\n        name: String\n    }\n    read: GetPokemonSpecies\n}\n\n/// Retrieve information about a Pokémon species.\n@readonly\n@http(uri: \"/pokemon-species/{name}\", method: \"GET\")\noperation GetPokemonSpecies {\n    input := {\n        @required\n        @httpLabel\n        name: String\n    }\n    output := {\n        /// The name for this resource.\n        @required\n        name: String\n\n        /// A list of flavor text entries for this Pokémon species.\n        @required\n        flavorTextEntries: FlavorTextEntries\n    }\n    errors: [\n        ResourceNotFoundException\n        ValidationException\n    ]\n}\n\n/// Retrieve HTTP server statistiscs, such as calls count.\n@readonly\n@http(uri: \"/stats\", method: \"GET\")\noperation GetServerStatistics {\n    input := {}\n    output := {\n        /// The number of calls executed by the server.\n        @required\n        calls_count: Long\n    }\n}\n\nlist FlavorTextEntries {\n    member: FlavorText\n}\n\nstructure FlavorText {\n    /// The localized flavor text for an API resource in a specific language.\n    @required\n    flavorText: String\n\n    /// The language this name is in.\n    @required\n    language: Language\n}\n\n/// Supported languages for FlavorText entries.\nenum Language {\n    /// American English.\n    ENGLISH = \"en\"\n    /// Español.\n    SPANISH = \"es\"\n    /// Italiano.\n    ITALIAN = \"it\"\n    /// 日本語。\n    JAPANESE = \"jp\"\n}\n\n/// DoNothing operation, used to stress test the framework.\n@readonly\n@http(uri: \"/do-nothing\", method: \"GET\")\noperation DoNothing {\n    input := {}\n    output := {}\n}\n\n/// Health check operation, to check the service is up\n/// Not yet a deep check\n@readonly\n@http(uri: \"/ping\", method: \"GET\")\noperation CheckHealth {\n}\n\n@error(\"client\")\n@httpError(404)\nstructure ResourceNotFoundException {\n    @required\n    message: String\n}\n"
  },
  {
    "path": "codegen-server-test/codegen-server-test-typescript/model/pokemon.smithy",
    "content": "// TODO(https://github.com/smithy-lang/smithy-rs/issues/1508)\n// reconcile this model with the main one living inside codegen-server-test/model/pokemon.smithy\n// once the Typescript implementation supports Streaming and Union shapes.\n$version: \"1.0\"\n\nnamespace com.aws.example.ts\n\nuse aws.protocols#restJson1\nuse com.aws.example#CheckHealth\nuse com.aws.example#DoNothing\nuse com.aws.example#GetServerStatistics\nuse com.aws.example#PokemonSpecies\n\n/// The Pokémon Service allows you to retrieve information about Pokémon species.\n@title(\"Pokémon Service\")\n@restJson1\nservice PokemonService {\n    version: \"2021-12-01\"\n    resources: [\n        PokemonSpecies\n    ]\n    operations: [\n        GetServerStatistics\n        DoNothing\n        CheckHealth\n    ]\n}\n"
  },
  {
    "path": "codegen-server-test/custom-test-models/custom-validation-exception.smithy",
    "content": "$version: \"2.0\"\n\nnamespace com.aws.example\n\nuse aws.protocols#restJson1\nuse smithy.framework.rust#validationException\nuse smithy.framework.rust#validationFieldList\nuse smithy.framework.rust#validationFieldMessage\nuse smithy.framework.rust#validationFieldName\nuse smithy.framework.rust#validationMessage\n\n@restJson1\nservice CustomValidationExample {\n    version: \"1.0.0\"\n    operations: [\n        TestOperation\n    ]\n    errors: [\n        MyCustomValidationException\n    ]\n}\n\n@http(method: \"POST\", uri: \"/test\")\noperation TestOperation {\n    input: TestInput\n}\n\nstructure TestInput {\n    @required\n    @length(min: 1, max: 10)\n    name: String\n\n    @range(min: 1, max: 100)\n    age: Integer\n}\n\n@error(\"client\")\n@httpError(400)\n@validationException\nstructure MyCustomValidationException {\n    @required\n    @validationMessage\n    customMessage: String\n\n    @required\n    @default(\"testReason1\")\n    reason: ValidationExceptionReason\n\n    @validationFieldList\n    customFieldList: CustomValidationFieldList\n}\n\nenum ValidationExceptionReason {\n    TEST_REASON_0 = \"testReason0\"\n    TEST_REASON_1 = \"testReason1\"\n}\n\nstructure CustomValidationField {\n    @required\n    @validationFieldName\n    customFieldName: String\n\n    @required\n    @validationFieldMessage\n    customFieldMessage: String\n}\n\nlist CustomValidationFieldList {\n    member: CustomValidationField\n}\n"
  },
  {
    "path": "codegen-server-test/integration-tests/.gitignore",
    "content": "Cargo.lock\n"
  },
  {
    "path": "codegen-server-test/integration-tests/Cargo.toml",
    "content": "[workspace]\nresolver = \"3\"\nmembers = [\"eventstreams-legacy\", \"eventstreams\"]\n\n[workspace.dependencies]\n# http@1 versions\nrpcv2cbor_extras = { path = \"../build/smithyprojections/codegen-server-test/rpcv2Cbor_extras/rust-server-codegen\" }\nrpcv2cbor_extras_no_initial_response = { path = \"../build/smithyprojections/codegen-server-test/rpcv2Cbor_extras_no_initial_response/rust-server-codegen\" }\n# http@0 versions (legacy)\nrpcv2cbor_extras_http0x = { path = \"../build/smithyprojections/codegen-server-test/rpcv2Cbor_extras-http0x/rust-server-codegen\", package = \"rpcv2cbor_extras-http0x\" }\nrpcv2cbor_extras_no_initial_response_http0x = { path = \"../build/smithyprojections/codegen-server-test/rpcv2Cbor_extras_no_initial_response-http0x/rust-server-codegen\", package = \"rpcv2cbor_extras_no_initial_response-http0x\" }\naws-smithy-eventstream = { path = \"../../rust-runtime/aws-smithy-eventstream\", features = [\"test-util\"] }\naws-smithy-http = { path = \"../../rust-runtime/aws-smithy-http\" }\naws-smithy-legacy-http = { path = \"../../rust-runtime/aws-smithy-legacy-http\" }\naws-smithy-runtime = { path = \"../../rust-runtime/aws-smithy-runtime\", features = [\"test-util\"] }\naws-smithy-cbor = { path = \"../../rust-runtime/aws-smithy-cbor\" }\naws-smithy-types = { path = \"../../rust-runtime/aws-smithy-types\" }\n"
  },
  {
    "path": "codegen-server-test/integration-tests/eventstreams/Cargo.toml",
    "content": "[package]\nname = \"eventstreams\"\nversion = \"0.1.0\"\nedition = \"2021\"\n\n[dependencies]\nrpcv2cbor_extras = { workspace = true }\nrpcv2cbor_extras_no_initial_response = { workspace = true }\ntokio = { version = \"1\", features = [\"full\"] }\naws-smithy-eventstream = { workspace = true }\naws-smithy-http = { workspace = true }\naws-smithy-cbor = { workspace = true }\naws-smithy-types = { path = \"../../../rust-runtime/aws-smithy-types\" }\nhyper = { version = \"1\", features = [\"http2\", \"server\"] }\nbytes = \"1.0\"\naws-smithy-runtime = { workspace = true }\nhttp-body-util = \"0.1.3\"\nhyper-util = { version = \"0.1.17\", features = [\"client-legacy\", \"tokio\", \"http2\", \"http1\"] }\ntokio-stream = \"0.1.17\"\nhttp = \"1\"\ntracing = \"0.1.41\"\nrstest = \"0.23\"\n"
  },
  {
    "path": "codegen-server-test/integration-tests/eventstreams/src/lib.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Manual event stream client for testing purposes.\n\nuse crate::RecvError::InvalidEventStreamFrame;\nuse aws_smithy_eventstream::error::Error;\nuse aws_smithy_eventstream::frame::{\n    write_message_to, DecodedFrame, MessageFrameDecoder, SignMessage,\n};\nuse aws_smithy_types::event_stream::Message;\nuse http_body_util::{BodyExt, StreamBody};\nuse hyper::{\n    body::{Bytes, Frame},\n    Request, Uri,\n};\nuse hyper_util::{client::legacy::Client, rt::TokioExecutor};\nuse std::net::SocketAddr;\nuse std::time::Duration;\nuse tokio::sync::mpsc;\nuse tokio::time::timeout;\nuse tokio_stream::wrappers::ReceiverStream;\n\n#[derive(Debug)]\npub enum RecvError {\n    InvalidEventStreamFrame(Error),\n    InvalidHttpFrame(hyper::Error),\n}\n\n/// A manual event stream client that connects to a real service.\npub struct ManualEventStreamClient {\n    message_sender: mpsc::Sender<Message>,\n    response_receiver: mpsc::Receiver<Result<Message, RecvError>>,\n    _handle: tokio::task::JoinHandle<()>,\n}\n\nimpl ManualEventStreamClient {\n    /// Creates a client that connects to a real H2 service on localhost.\n    pub async fn connect_to_service(\n        addr: SocketAddr,\n        path: &str,\n        headers: Vec<(&str, &str)>,\n    ) -> Result<Self, String> {\n        let (message_sender, mut message_receiver) = mpsc::channel(100);\n        let (response_sender, response_receiver) = mpsc::channel(100);\n        let (frame_sender, frame_receiver) = mpsc::channel(100);\n\n        let client = Client::builder(TokioExecutor::new())\n            .http2_only(true)\n            .build_http::<StreamBody<ReceiverStream<Result<Frame<Bytes>, std::io::Error>>>>();\n\n        let uri = format!(\"http://{addr}{path}\");\n\n        // Task to convert messages to frames\n        tokio::spawn(async move {\n            while let Some(message) = message_receiver.recv().await {\n                let mut buffer = Vec::new();\n                if write_message_to(&message, &mut buffer).is_err() {\n                    break;\n                }\n                let _ = frame_sender\n                    .send(Ok(Frame::data(Bytes::from(buffer))))\n                    .await;\n            }\n        });\n        let headers = headers\n            .iter()\n            .map(|s| (s.0.to_string(), s.1.to_string()))\n            .collect::<Vec<_>>();\n\n        let uri: Uri = uri.parse().expect(\"invalid URI\");\n        let mut req = Request::builder()\n            .method(\"POST\")\n            .uri(uri)\n            .header(\"content-type\", \"application/vnd.amazon.eventstream\");\n\n        for (key, value) in &headers {\n            req = req.header(key.to_string(), value.to_string());\n        }\n        let stream = ReceiverStream::new(frame_receiver);\n        let body = StreamBody::new(stream);\n\n        let request = req.body(body).expect(\"failed to construct request\");\n        let handle = tokio::spawn(async move {\n            let response = timeout(Duration::from_secs(1), client.request(request))\n                .await\n                .expect(\"timeout making initial request\")\n                .expect(\"failed to make initial contact with server\");\n            let mut body = response.into_body();\n            let mut decoder = MessageFrameDecoder::new();\n\n            while let Some(frame_result) = body.frame().await {\n                match frame_result {\n                    Ok(frame) => {\n                        if let Some(data) = frame.data_ref() {\n                            let mut data_slice = data.as_ref();\n                            match decoder.decode_frame(&mut data_slice) {\n                                Ok(DecodedFrame::Complete(msg)) => {\n                                    let _ = response_sender.send(Ok(msg)).await;\n                                }\n                                Ok(DecodedFrame::Incomplete) => continue,\n                                Err(e) => {\n                                    let _ =\n                                        response_sender.send(Err(InvalidEventStreamFrame(e))).await;\n                                    break;\n                                }\n                            }\n                        }\n                    }\n                    Err(e) => {\n                        let _ = response_sender\n                            .send(Err(RecvError::InvalidHttpFrame(e)))\n                            .await;\n                        break;\n                    }\n                }\n            }\n        });\n\n        Ok(Self {\n            message_sender,\n            response_receiver,\n            _handle: handle,\n        })\n    }\n\n    /// Sends a message.\n    pub async fn send(&mut self, message: Message) -> Result<(), String> {\n        self.message_sender\n            .send(message)\n            .await\n            .map_err(|e| format!(\"Send failed: {e}\"))\n    }\n\n    /// Receives the next response message.\n    pub async fn recv(&mut self) -> Option<Result<Message, RecvError>> {\n        self.response_receiver.recv().await\n    }\n\n    /// Tries to receive an initial-response message, returns None if the next message isn't initial-response\n    pub async fn try_recv_initial_response(&mut self) -> Option<Result<Message, RecvError>> {\n        if let Some(result) = self.recv().await {\n            match &result {\n                Ok(message) => {\n                    if let Some(event_type) = message\n                        .headers()\n                        .iter()\n                        .find(|h| h.name().as_str() == \":event-type\")\n                        .and_then(|h| h.value().as_string().ok())\n                    {\n                        if event_type.as_str() == \"initial-response\" {\n                            return Some(result);\n                        }\n                    }\n                    // Not an initial-response, we need to buffer this message\n                    // For now, just return None to indicate no initial-response\n                    None\n                }\n                Err(_) => Some(result),\n            }\n        } else {\n            None\n        }\n    }\n}\n\n/// Builder for creating event stream messages with signing support.\npub struct MessageBuilder {\n    signer: Option<Box<dyn SignMessage + Send>>,\n}\n\nimpl MessageBuilder {\n    pub fn new() -> Self {\n        Self { signer: None }\n    }\n\n    pub fn with_signer(mut self, signer: Box<dyn SignMessage + Send>) -> Self {\n        self.signer = Some(signer);\n        self\n    }\n\n    pub fn build_message(\n        &mut self,\n        message: Message,\n    ) -> Result<Message, Box<dyn std::error::Error + Send + Sync>> {\n        match &mut self.signer {\n            Some(signer) => signer.sign(message),\n            None => Ok(message),\n        }\n    }\n}\n\nimpl Default for MessageBuilder {\n    fn default() -> Self {\n        Self::new()\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use aws_smithy_types::event_stream::Message;\n\n    #[tokio::test]\n    async fn test_message_builder() {\n        let mut builder = MessageBuilder::new();\n        let message = Message::new(&b\"test\"[..]);\n\n        let result = builder.build_message(message);\n        assert!(result.is_ok());\n    }\n}\n"
  },
  {
    "path": "codegen-server-test/integration-tests/eventstreams/src/main.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nfn main() {\n    println!(\"Hello, world!\");\n}\n"
  },
  {
    "path": "codegen-server-test/integration-tests/eventstreams/tests/structured_eventstream_tests.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_smithy_http::event_stream::EventStreamSender;\nuse aws_smithy_runtime::test_util::capture_test_logs::show_filtered_test_logs;\nuse aws_smithy_types::event_stream::{Header, HeaderValue, Message};\nuse bytes::Bytes;\nuse eventstreams::{ManualEventStreamClient, RecvError};\nuse rpcv2cbor_extras::model::{Event, Events};\nuse rpcv2cbor_extras::sigv4_event_stream::SignedEvent;\nuse rpcv2cbor_extras::{error, input, output, RpcV2CborService, RpcV2CborServiceConfig};\nuse std::sync::{Arc, Mutex};\nuse tokio::net::TcpListener;\n\n#[derive(Debug, Default, Clone)]\nstruct StreamingOperationState {\n    events: Vec<SignedEvent<Events>>,\n    num_calls: usize,\n    initial_signature: Option<Vec<u8>>,\n}\n\n#[derive(Debug, Default, Clone)]\nstruct StreamingOperationWithInitialDataState {\n    initial_data: Option<String>,\n    events: Vec<SignedEvent<Events>>,\n    #[allow(dead_code)]\n    num_calls: usize,\n    initial_signature: Option<Vec<u8>>,\n}\n\n#[derive(Debug, Default, Clone)]\nstruct StreamingOperationWithOptionalDataState {\n    optional_data: Option<String>,\n    events: Vec<SignedEvent<Events>>,\n    #[allow(dead_code)]\n    num_calls: usize,\n    initial_signature: Option<Vec<u8>>,\n}\n\n#[derive(Debug, Default, Clone)]\nstruct ServerState {\n    streaming_operation: StreamingOperationState,\n    streaming_operation_with_initial_data: StreamingOperationWithInitialDataState,\n    streaming_operation_with_optional_data: StreamingOperationWithOptionalDataState,\n}\n\nstruct TestServer {\n    addr: std::net::SocketAddr,\n    state: Arc<Mutex<ServerState>>,\n}\n\nimpl TestServer {\n    async fn start() -> Self {\n        let state = Arc::new(Mutex::new(ServerState::default()));\n        let handler_state = state.clone();\n        let handler_state2 = state.clone();\n        let handler_state3 = state.clone();\n        let handler_state4 = state.clone();\n\n        let config = RpcV2CborServiceConfig::builder().build();\n        let app = RpcV2CborService::builder(config)\n            .streaming_operation(move |input| {\n                let state = handler_state.clone();\n                streaming_operation_handler(input, state)\n            })\n            .streaming_operation_with_initial_data(move |input| {\n                let state = handler_state2.clone();\n                streaming_operation_with_initial_data_handler(input, state)\n            })\n            .streaming_operation_with_initial_response(move |input| {\n                let state = handler_state3.clone();\n                streaming_operation_with_initial_response_handler(input, state)\n            })\n            .streaming_operation_with_optional_data(move |input| {\n                let state = handler_state4.clone();\n                streaming_operation_with_optional_data_handler(input, state)\n            })\n            .build_unchecked();\n\n        let listener = TcpListener::bind(\"127.0.0.1:0\").await.unwrap();\n        let addr = listener.local_addr().unwrap();\n\n        tokio::spawn(async move {\n            let make_service = app.into_make_service();\n            rpcv2cbor_extras_no_initial_response::serve(listener, make_service)\n                .configure_hyper(|builder| builder.http2_only())\n                .await\n                .unwrap();\n        });\n\n        Self { addr, state }\n    }\n\n    fn streaming_operation_events(&self) -> Vec<SignedEvent<Events>> {\n        self.state\n            .lock()\n            .unwrap()\n            .streaming_operation\n            .events\n            .clone()\n    }\n\n    fn streaming_operation_with_initial_data_events(&self) -> Vec<SignedEvent<Events>> {\n        self.state\n            .lock()\n            .unwrap()\n            .streaming_operation_with_initial_data\n            .events\n            .clone()\n    }\n\n    fn initial_data(&self) -> Option<String> {\n        self.state\n            .lock()\n            .unwrap()\n            .streaming_operation_with_initial_data\n            .initial_data\n            .clone()\n    }\n\n    fn streaming_operation_with_optional_data_events(&self) -> Vec<SignedEvent<Events>> {\n        self.state\n            .lock()\n            .unwrap()\n            .streaming_operation_with_optional_data\n            .events\n            .clone()\n    }\n\n    fn optional_data(&self) -> Option<String> {\n        self.state\n            .lock()\n            .unwrap()\n            .streaming_operation_with_optional_data\n            .optional_data\n            .clone()\n    }\n\n    fn initial_signature(&self) -> Option<Vec<u8>> {\n        self.state\n            .lock()\n            .unwrap()\n            .streaming_operation_with_initial_data\n            .initial_signature\n            .clone()\n    }\n\n    fn streaming_operation_initial_signature(&self) -> Option<Vec<u8>> {\n        self.state\n            .lock()\n            .unwrap()\n            .streaming_operation\n            .initial_signature\n            .clone()\n    }\n}\n\nasync fn streaming_operation_handler(\n    mut input: input::StreamingOperationInput,\n    state: Arc<Mutex<ServerState>>,\n) -> Result<output::StreamingOperationOutput, error::StreamingOperationError> {\n    state.lock().unwrap().streaming_operation.num_calls += 1;\n    state.lock().unwrap().streaming_operation.initial_signature = input\n        .events\n        .initial_signature()\n        .map(|s| s.chunk_signature.to_vec());\n\n    let state_clone = state.clone();\n    tokio::spawn(async move {\n        while let Ok(Some(signed_event)) = input.events.recv().await {\n            tracing::debug!(\n                \"streaming_operation received event: {:?}\",\n                signed_event.message\n            );\n            state_clone\n                .lock()\n                .unwrap()\n                .streaming_operation\n                .events\n                .push(signed_event);\n        }\n    });\n\n    Ok(output::StreamingOperationOutput::builder()\n        .events(EventStreamSender::once(Ok(Events::A(Event {}))))\n        .build()\n        .unwrap())\n}\n\nasync fn streaming_operation_with_initial_data_handler(\n    mut input: input::StreamingOperationWithInitialDataInput,\n    state: Arc<Mutex<ServerState>>,\n) -> Result<\n    output::StreamingOperationWithInitialDataOutput,\n    error::StreamingOperationWithInitialDataError,\n> {\n    state.lock().unwrap().streaming_operation.num_calls += 1;\n    state\n        .lock()\n        .unwrap()\n        .streaming_operation_with_initial_data\n        .initial_data = Some(input.initial_data);\n    state\n        .lock()\n        .unwrap()\n        .streaming_operation_with_initial_data\n        .initial_signature = input\n        .events\n        .initial_signature()\n        .map(|s| s.chunk_signature.to_vec());\n\n    let state_clone = state.clone();\n    tokio::spawn(async move {\n        while let Ok(Some(signed_event)) = input.events.recv().await {\n            tracing::debug!(\n                \"streaming_operation_with_initial_data received event: {:?}\",\n                signed_event.message\n            );\n            state_clone\n                .lock()\n                .unwrap()\n                .streaming_operation_with_initial_data\n                .events\n                .push(signed_event);\n        }\n    });\n\n    Ok(output::StreamingOperationWithInitialDataOutput::builder()\n        .events(EventStreamSender::once(Ok(Events::A(Event {}))))\n        .build()\n        .unwrap())\n}\n\nasync fn streaming_operation_with_initial_response_handler(\n    mut input: input::StreamingOperationWithInitialResponseInput,\n    _state: Arc<Mutex<ServerState>>,\n) -> Result<\n    output::StreamingOperationWithInitialResponseOutput,\n    error::StreamingOperationWithInitialResponseError,\n> {\n    tokio::spawn(async move {\n        while let Ok(Some(event)) = input.events.recv().await {\n            tracing::debug!(\n                \"streaming_operation_with_initial_response received event: {:?}\",\n                event\n            );\n        }\n    });\n\n    Ok(\n        output::StreamingOperationWithInitialResponseOutput::builder()\n            .response_data(\"test response data\".to_string())\n            .events(EventStreamSender::once(Ok(Events::A(Event {}))))\n            .build()\n            .unwrap(),\n    )\n}\n\nasync fn streaming_operation_with_optional_data_handler(\n    mut input: input::StreamingOperationWithOptionalDataInput,\n    state: Arc<Mutex<ServerState>>,\n) -> Result<\n    output::StreamingOperationWithOptionalDataOutput,\n    error::StreamingOperationWithOptionalDataError,\n> {\n    state.lock().unwrap().streaming_operation.num_calls += 1;\n    state\n        .lock()\n        .unwrap()\n        .streaming_operation_with_optional_data\n        .optional_data = input.optional_data;\n    state\n        .lock()\n        .unwrap()\n        .streaming_operation_with_optional_data\n        .initial_signature = input\n        .events\n        .initial_signature()\n        .map(|s| s.chunk_signature.to_vec());\n\n    let state_clone = state.clone();\n    tokio::spawn(async move {\n        while let Ok(Some(event)) = input.events.recv().await {\n            tracing::debug!(\n                \"streaming_operation_with_optional_data received event: {:?}\",\n                event\n            );\n            state_clone\n                .lock()\n                .unwrap()\n                .streaming_operation_with_optional_data\n                .events\n                .push(event);\n        }\n    });\n\n    Ok(output::StreamingOperationWithOptionalDataOutput::builder()\n        .optional_response_data(Some(\"optional response\".to_string()))\n        .events(EventStreamSender::once(Ok(Events::A(Event {}))))\n        .build()\n        .unwrap())\n}\n\n/// TestHarness that launches a server and attaches a client\n///\n/// It allows sending event stream messages and reading the results.\nstruct TestHarness {\n    server: TestServer,\n    client: ManualEventStreamClient,\n    initial_response: Option<Message>,\n}\n\nimpl TestHarness {\n    async fn new(operation: &str) -> Self {\n        let server = TestServer::start().await;\n        let path = format!(\"/service/RpcV2CborService/operation/{operation}\");\n        let client = ManualEventStreamClient::connect_to_service(\n            server.addr,\n            &path,\n            vec![(\"Smithy-Protocol\", \"rpc-v2-cbor\")],\n        )\n        .await\n        .unwrap();\n\n        Self {\n            server,\n            client,\n            initial_response: None,\n        }\n    }\n\n    async fn send_initial_data(&mut self, data: &str) {\n        let msg = build_initial_data_message(data);\n        self.client.send(msg).await.ok();\n    }\n\n    async fn send_event(&mut self, event_type: &str) {\n        let msg = build_event(event_type);\n        self.client.send(msg).await.unwrap();\n    }\n\n    async fn expect_message(&mut self) -> Message {\n        let msg = self.client.recv().await.unwrap().unwrap();\n\n        // If this is an initial-response, store it and get the next message\n        if get_event_type(&msg) == \"initial-response\" {\n            self.initial_response = Some(msg);\n            self.client.recv().await.unwrap().unwrap()\n        } else {\n            msg\n        }\n    }\n\n    async fn recv(&mut self) -> Option<Result<Message, RecvError>> {\n        self.client.recv().await\n    }\n}\n\nfn build_initial_request() -> Message {\n    let headers = vec![\n        Header::new(\":message-type\", HeaderValue::String(\"event\".into())),\n        Header::new(\":event-type\", HeaderValue::String(\"initial-request\".into())),\n        Header::new(\n            \":content-type\",\n            HeaderValue::String(\"application/cbor\".into()),\n        ),\n    ];\n    let empty_cbor = Bytes::from(vec![0xbf, 0xff]);\n    Message::new_from_parts(headers, empty_cbor)\n}\n\nfn build_initial_data_message(data: &str) -> Message {\n    let headers = vec![\n        Header::new(\":message-type\", HeaderValue::String(\"event\".into())),\n        Header::new(\":event-type\", HeaderValue::String(\"initial-request\".into())),\n        Header::new(\n            \":content-type\",\n            HeaderValue::String(\"application/cbor\".into()),\n        ),\n    ];\n\n    // Serialize using CBOR: { \"initialData\": data }\n    let mut encoder = aws_smithy_cbor::Encoder::new(Vec::new());\n    encoder.begin_map();\n    encoder.str(\"initialData\").str(data);\n    encoder.end();\n    let payload = Bytes::from(encoder.into_writer());\n\n    Message::new_from_parts(headers, payload)\n}\n\nfn build_event(event_type: &str) -> Message {\n    let headers = vec![\n        Header::new(\":message-type\", HeaderValue::String(\"event\".into())),\n        Header::new(\n            \":event-type\",\n            HeaderValue::String(event_type.to_string().into()),\n        ),\n        Header::new(\n            \":content-type\",\n            HeaderValue::String(\"application/cbor\".into()),\n        ),\n    ];\n    let empty_cbor = Bytes::from(vec![0xbf, 0xff]);\n    Message::new_from_parts(headers, empty_cbor)\n}\n\nfn sign_message(inner_message: Message, signature: &[u8], timestamp_secs: i64) -> Message {\n    use aws_smithy_eventstream::frame::write_message_to;\n\n    let mut inner_bytes = Vec::new();\n    write_message_to(&inner_message, &mut inner_bytes).unwrap();\n\n    let headers = vec![\n        Header::new(\n            \":chunk-signature\",\n            HeaderValue::ByteArray(Bytes::from(signature.to_vec())),\n        ),\n        Header::new(\n            \":date\",\n            HeaderValue::Timestamp(aws_smithy_types::DateTime::from_secs(timestamp_secs)),\n        ),\n    ];\n\n    Message::new_from_parts(headers, Bytes::from(inner_bytes))\n}\n\nfn build_sigv4_signed_event_with_signature(event_type: &str, signature: &[u8]) -> Message {\n    use std::time::{SystemTime, UNIX_EPOCH};\n\n    let timestamp = SystemTime::now()\n        .duration_since(UNIX_EPOCH)\n        .unwrap()\n        .as_secs();\n\n    sign_message(build_event(event_type), signature, timestamp as i64)\n}\n\nfn build_sigv4_signed_initial_data(data: &str, signature: &[u8], timestamp_secs: i64) -> Message {\n    sign_message(build_initial_data_message(data), signature, timestamp_secs)\n}\n\nfn get_event_type(msg: &Message) -> &str {\n    msg.headers()\n        .iter()\n        .find(|h| h.name().as_str() == \":event-type\")\n        .unwrap()\n        .value()\n        .as_string()\n        .unwrap()\n        .as_str()\n}\n\n#[tokio::test]\nasync fn test_streaming_operation_with_initial_data() {\n    let mut harness = TestHarness::new(\"StreamingOperationWithInitialData\").await;\n    harness.send_initial_data(\"test-data\").await;\n\n    harness.send_event(\"A\").await;\n\n    let resp = harness.expect_message().await;\n    assert_eq!(get_event_type(&resp), \"A\");\n    assert_eq!(\n        harness\n            .server\n            .streaming_operation_with_initial_data_events()\n            .into_iter()\n            .map(|e| e.message)\n            .collect::<Vec<_>>(),\n        vec![Events::A(Event {})]\n    );\n    // verify that we parsed the initial data properly\n    assert_eq!(harness.server.initial_data(), Some(\"test-data\".to_string()));\n}\n\n/// StreamingOperationWithInitialData has a mandatory initial data field.\n/// If we don't send this field, we'll never hit the handler.\n#[tokio::test]\nasync fn test_streaming_operation_with_initial_data_missing() {\n    let _logs = show_filtered_test_logs(\n        \"aws_smithy_http_server=trace,hyper_util=debug,rpcv2cbor_extras=trace\",\n    );\n    let mut harness = TestHarness::new(\"StreamingOperationWithInitialData\").await;\n\n    harness.send_event(\"A\").await;\n\n    assert!(harness.recv().await.is_none());\n\n    // assert the server never received the request\n    assert_eq!(\n        harness\n            .server\n            .streaming_operation_with_initial_data_events()\n            .into_iter()\n            .map(|e| e.message)\n            .collect::<Vec<_>>(),\n        vec![]\n    );\n}\n\n/// Test that when alwaysSendEventStreamInitialResponse is disabled, no initial-response is sent\n#[tokio::test]\nasync fn test_server_no_initial_response_when_disabled() {\n    use rpcv2cbor_extras_no_initial_response::output;\n    use rpcv2cbor_extras_no_initial_response::{RpcV2CborService, RpcV2CborServiceConfig};\n\n    let config = RpcV2CborServiceConfig::builder().build();\n    let app = RpcV2CborService::builder(config)\n        .streaming_operation_with_initial_data(move |mut input: rpcv2cbor_extras_no_initial_response::input::StreamingOperationWithInitialDataInput| async move {\n            let _ev = input.events.recv().await;\n            Ok(output::StreamingOperationWithInitialDataOutput::builder()\n                .events(aws_smithy_http::event_stream::EventStreamSender::once(Ok(rpcv2cbor_extras_no_initial_response::model::Events::A(rpcv2cbor_extras_no_initial_response::model::Event {}))))\n                .build()\n                .unwrap())\n        })\n        .build_unchecked();\n\n    let listener = tokio::net::TcpListener::bind(\"127.0.0.1:0\").await.unwrap();\n    let addr = listener.local_addr().unwrap();\n\n    tokio::spawn(async move {\n        let make_service = app.into_make_service();\n        rpcv2cbor_extras_no_initial_response::serve(listener, make_service)\n            .configure_hyper(|builder| builder.http2_only())\n            .await\n            .unwrap();\n    });\n\n    let path = \"/service/RpcV2CborService/operation/StreamingOperationWithInitialData\";\n    let mut client = ManualEventStreamClient::connect_to_service(\n        addr,\n        path,\n        vec![(\"Smithy-Protocol\", \"rpc-v2-cbor\")],\n    )\n    .await\n    .unwrap();\n\n    // Send initial data and event\n    let msg = build_initial_data_message(\"test-data\");\n    client.send(msg).await.ok();\n    let msg = build_event(\"A\");\n    client.send(msg).await.unwrap();\n\n    // Should receive event directly (no initial-response)\n    let resp = client.recv().await.unwrap().unwrap();\n    assert_eq!(\n        get_event_type(&resp),\n        \"A\",\n        \"Should receive event directly without initial-response\"\n    );\n}\n\n/// Test that server sends initial-response for RPC protocols\n#[tokio::test]\nasync fn test_server_sends_initial_response() {\n    let mut harness = TestHarness::new(\"StreamingOperationWithInitialData\").await;\n    harness.send_initial_data(\"test-data\").await;\n    harness.send_event(\"A\").await;\n\n    // Server should send initial-response before any events\n    let initial_response = harness.client.try_recv_initial_response().await;\n    assert!(\n        initial_response.is_some(),\n        \"Server should send initial-response message\"\n    );\n\n    let initial_msg = initial_response.unwrap().unwrap();\n    assert_eq!(get_event_type(&initial_msg), \"initial-response\");\n\n    // Then we should get the actual event\n    let resp = harness.expect_message().await;\n    assert_eq!(get_event_type(&resp), \"A\");\n}\n\n/// Test that server sends initial-response with actual data for operations that have non-eventstream output members\n#[tokio::test]\nasync fn test_server_sends_initial_response_with_data() {\n    let mut harness = TestHarness::new(\"StreamingOperationWithInitialResponse\").await;\n    harness.send_event(\"A\").await;\n\n    let resp = harness.expect_message().await;\n    assert_eq!(get_event_type(&resp), \"A\");\n\n    // Check that initial-response was received with actual data\n    assert!(harness.initial_response.is_some());\n    let initial_resp = harness.initial_response.as_ref().unwrap();\n    assert_eq!(get_event_type(initial_resp), \"initial-response\");\n\n    // The initial response should contain serialized responseData\n    assert!(!initial_resp.payload().is_empty());\n\n    // Parse the CBOR payload to verify the responseData field\n    let decoder = &mut aws_smithy_cbor::Decoder::new(initial_resp.payload());\n    decoder.map().unwrap(); // Start reading the map\n\n    // Read the key-value pair\n    let key = decoder.str().unwrap();\n    assert_eq!(key, \"responseData\");\n    let value = decoder.string().unwrap();\n    assert_eq!(value, \"test response data\");\n}\n\n/// Test streaming operation with optional data - verifies Smithy spec requirement:\n/// \"Clients and servers MUST NOT fail if an initial-request or initial-response\n/// is not received for an initial message that contains only optional members.\"\n#[tokio::test]\nasync fn test_streaming_operation_with_optional_data() {\n    let mut harness = TestHarness::new(\"StreamingOperationWithOptionalData\").await;\n\n    // Send event without providing optional data - should work\n    harness.send_event(\"A\").await;\n\n    let resp = harness.expect_message().await;\n    assert_eq!(get_event_type(&resp), \"A\");\n    assert_eq!(\n        harness\n            .server\n            .streaming_operation_with_optional_data_events()\n            .into_iter()\n            .map(|e| e.message)\n            .collect::<Vec<_>>(),\n        vec![Events::A(Event {})]\n    );\n    // Verify optional data was not provided\n    assert_eq!(harness.server.optional_data(), None);\n}\n\n/// Test that SigV4-framed initial-request messages are properly handled.\n/// This verifies the fix for issue #4397 where try_recv_initial_request\n/// can now see inside the SigV4 envelope to detect the initial-request event type.\n#[tokio::test]\nasync fn test_sigv4_framed_initial_request_with_data() {\n    let _logs = show_filtered_test_logs(\n        \"aws_smithy_http_server=trace,hyper_util=debug,rpcv2cbor_extras=trace\",\n    );\n    let mut harness = TestHarness::new(\"StreamingOperationWithInitialData\").await;\n\n    // Send a SigV4-framed initial-request with data\n    let signed_initial_request = build_sigv4_signed_initial_data(\n        \"test-data\",\n        b\"example298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\",\n        1700000000,\n    );\n    harness.client.send(signed_initial_request).await.unwrap();\n\n    harness.send_event(\"A\").await;\n\n    // The server should now properly extract the initial-request from the SigV4 envelope\n    let resp = harness.expect_message().await;\n    assert_eq!(get_event_type(&resp), \"A\");\n\n    // Verify the server received and parsed the initial data from inside the SigV4 envelope\n    assert_eq!(harness.server.initial_data(), Some(\"test-data\".to_string()));\n    assert_eq!(\n        harness.server.initial_signature(),\n        Some(b\"example298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\".to_vec())\n    );\n}\n\n#[derive(Debug, Clone, Copy)]\nenum InitialMessage {\n    None,\n    Unsigned,\n    Signed,\n}\n\n#[derive(Debug, Clone)]\nstruct EventStreamTestCase {\n    initial: InitialMessage,\n    events_signed: Vec<bool>,\n}\n\n/// Comprehensive test matrix for SigV4 event stream combinations\n#[rstest::rstest]\n#[case::no_initial_unsigned_events(EventStreamTestCase { initial: InitialMessage::None, events_signed: vec![false, false] })]\n#[case::no_initial_signed_events(EventStreamTestCase { initial: InitialMessage::None, events_signed: vec![true, true] })]\n#[case::no_initial_mixed_events(EventStreamTestCase { initial: InitialMessage::None, events_signed: vec![false, true] })]\n#[case::unsigned_initial_unsigned_events(EventStreamTestCase { initial: InitialMessage::Unsigned, events_signed: vec![false, false] })]\n#[case::unsigned_initial_signed_events(EventStreamTestCase { initial: InitialMessage::Unsigned, events_signed: vec![true, true] })]\n#[case::unsigned_initial_mixed_events(EventStreamTestCase { initial: InitialMessage::Unsigned, events_signed: vec![false, true] })]\n#[case::signed_initial_unsigned_events(EventStreamTestCase { initial: InitialMessage::Signed, events_signed: vec![false, false] })]\n#[case::signed_initial_signed_events(EventStreamTestCase { initial: InitialMessage::Signed, events_signed: vec![true, true] })]\n#[case::signed_initial_mixed_events(EventStreamTestCase { initial: InitialMessage::Signed, events_signed: vec![false, true] })]\n#[case::no_events(EventStreamTestCase { initial: InitialMessage::None, events_signed: vec![] })]\n#[case::many_signed_events(EventStreamTestCase { initial: InitialMessage::Signed, events_signed: vec![true; 100] })]\n#[case::many_unsigned_events(EventStreamTestCase { initial: InitialMessage::None, events_signed: vec![false; 100] })]\n#[tokio::test]\nasync fn test_sigv4_event_stream_matrix(#[case] test_case: EventStreamTestCase) {\n    let mut harness = TestHarness::new(\"StreamingOperation\").await;\n\n    // Send initial message if specified\n    match test_case.initial {\n        InitialMessage::None => {}\n        InitialMessage::Unsigned => {\n            harness.client.send(build_initial_request()).await.unwrap();\n        }\n        InitialMessage::Signed => {\n            let signed_initial = sign_message(build_initial_request(), b\"initial-sig\", 1700000000);\n            harness.client.send(signed_initial).await.unwrap();\n        }\n    }\n\n    // Send events\n    for (i, &signed) in test_case.events_signed.iter().enumerate() {\n        let event_type = if i % 2 == 0 { \"A\" } else { \"B\" };\n        if signed {\n            let sig = format!(\"sig-event-{i}\");\n            let signed_event = build_sigv4_signed_event_with_signature(event_type, sig.as_bytes());\n            harness.client.send(signed_event).await.unwrap();\n        } else {\n            harness.send_event(event_type).await;\n        }\n    }\n\n    // Receive response (only if we sent events)\n    if !test_case.events_signed.is_empty() {\n        let resp = harness.expect_message().await;\n        assert_eq!(get_event_type(&resp), \"A\");\n    }\n\n    // Verify events\n    let events = harness.server.streaming_operation_events();\n    assert_eq!(events.len(), test_case.events_signed.len());\n\n    for (i, &signed) in test_case.events_signed.iter().enumerate() {\n        let expected_event = if i % 2 == 0 {\n            Events::A(Event {})\n        } else {\n            Events::B(Event {})\n        };\n        assert_eq!(events[i].message, expected_event);\n\n        if signed {\n            assert!(\n                events[i].signature.is_some(),\n                \"Event {i} should have signature\"\n            );\n            let expected_sig = format!(\"sig-event-{i}\");\n            assert_eq!(\n                events[i].signature.as_ref().unwrap().chunk_signature,\n                expected_sig.as_bytes()\n            );\n        } else {\n            assert!(\n                events[i].signature.is_none(),\n                \"Event {i} should not have signature\"\n            );\n        }\n    }\n\n    // Verify initial signature\n    match test_case.initial {\n        InitialMessage::Signed => {\n            assert_eq!(\n                harness.server.streaming_operation_initial_signature(),\n                Some(b\"initial-sig\".to_vec())\n            );\n        }\n        InitialMessage::None | InitialMessage::Unsigned => {\n            assert_eq!(harness.server.streaming_operation_initial_signature(), None);\n        }\n    }\n}\n\n/// Test signed initial data with signed events\n#[tokio::test]\nasync fn test_sigv4_signed_initial_data_with_signed_events() {\n    let mut harness = TestHarness::new(\"StreamingOperationWithInitialData\").await;\n\n    // Send signed initial data\n    let signed_initial =\n        build_sigv4_signed_initial_data(\"test-data\", b\"sig-initial-data\", 1700000000);\n    harness.client.send(signed_initial).await.unwrap();\n\n    // Send signed events\n    let signed_event_a = build_sigv4_signed_event_with_signature(\"A\", b\"sig-event-A\");\n    harness.client.send(signed_event_a).await.unwrap();\n\n    let signed_event_b = build_sigv4_signed_event_with_signature(\"B\", b\"sig-event-B\");\n    harness.client.send(signed_event_b).await.unwrap();\n\n    let resp = harness.expect_message().await;\n    assert_eq!(get_event_type(&resp), \"A\");\n\n    // Verify initial data was received\n    assert_eq!(harness.server.initial_data(), Some(\"test-data\".to_string()));\n\n    // Verify initial signature\n    assert_eq!(\n        harness.server.initial_signature(),\n        Some(b\"sig-initial-data\".to_vec())\n    );\n\n    // Verify events with signatures\n    let events = harness\n        .server\n        .streaming_operation_with_initial_data_events();\n    assert_eq!(events.len(), 2);\n\n    assert_eq!(events[0].message, Events::A(Event {}));\n    assert_eq!(\n        events[0].signature.as_ref().unwrap().chunk_signature,\n        b\"sig-event-A\"\n    );\n\n    assert_eq!(events[1].message, Events::B(Event {}));\n    assert_eq!(\n        events[1].signature.as_ref().unwrap().chunk_signature,\n        b\"sig-event-B\"\n    );\n}\n\n/// Test that timestamps are preserved in signatures\n#[tokio::test]\nasync fn test_sigv4_timestamp_preservation() {\n    let mut harness = TestHarness::new(\"StreamingOperation\").await;\n\n    // Send events with specific timestamps\n    let timestamp1 = 1700000000i64;\n    let timestamp2 = 1700000100i64;\n\n    let event1 = sign_message(build_event(\"A\"), b\"sig-1\", timestamp1);\n    harness.client.send(event1).await.unwrap();\n\n    let event2 = sign_message(build_event(\"B\"), b\"sig-2\", timestamp2);\n    harness.client.send(event2).await.unwrap();\n\n    let resp = harness.expect_message().await;\n    assert_eq!(get_event_type(&resp), \"A\");\n\n    let events = harness.server.streaming_operation_events();\n    assert_eq!(events.len(), 2);\n\n    // Verify timestamps are preserved\n    use std::time::UNIX_EPOCH;\n\n    let expected_time1 = UNIX_EPOCH + std::time::Duration::from_secs(timestamp1 as u64);\n    assert_eq!(\n        events[0].signature.as_ref().unwrap().timestamp,\n        expected_time1\n    );\n\n    let expected_time2 = UNIX_EPOCH + std::time::Duration::from_secs(timestamp2 as u64);\n    assert_eq!(\n        events[1].signature.as_ref().unwrap().timestamp,\n        expected_time2\n    );\n}\n"
  },
  {
    "path": "codegen-server-test/integration-tests/eventstreams-legacy/Cargo.toml",
    "content": "[package]\nname = \"eventstreams-legacy\"\nversion = \"0.1.0\"\nedition = \"2021\"\n\n[dependencies]\nrpcv2cbor_extras_http0x = { workspace = true }\nrpcv2cbor_extras_no_initial_response_http0x = { workspace = true }\ntokio = { version = \"1\", features = [\"full\"] }\naws-smithy-eventstream = { workspace = true }\naws-smithy-legacy-http = { workspace = true }\naws-smithy-cbor = { workspace = true }\naws-smithy-types = { path = \"../../../rust-runtime/aws-smithy-types\" }\nhyper = { version = \"1\", features = [\"http2\", \"server\"] }\nhyper0 = { package = \"hyper\", version = \"0.14\", features = [\"http2\", \"server\"] }\nbytes = \"1.0\"\naws-smithy-runtime = { workspace = true }\nhttp-body-util = \"0.1.3\"\nhyper-util = { version = \"0.1.17\", features = [\"client-legacy\", \"tokio\", \"http2\", \"http1\"] }\ntokio-stream = \"0.1.17\"\ntracing = \"0.1.41\"\nrstest = \"0.23\"\n"
  },
  {
    "path": "codegen-server-test/integration-tests/eventstreams-legacy/src/lib.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Manual event stream client for testing purposes.\n\nuse crate::RecvError::InvalidEventStreamFrame;\nuse aws_smithy_eventstream::error::Error;\nuse aws_smithy_eventstream::frame::{\n    write_message_to, DecodedFrame, MessageFrameDecoder, SignMessage,\n};\nuse aws_smithy_types::event_stream::Message;\nuse http_body_util::{BodyExt, StreamBody};\nuse hyper::{\n    body::{Bytes, Frame},\n    Request, Uri,\n};\nuse hyper_util::{client::legacy::Client, rt::TokioExecutor};\nuse std::net::SocketAddr;\nuse std::time::Duration;\nuse tokio::sync::mpsc;\nuse tokio::time::timeout;\nuse tokio_stream::wrappers::ReceiverStream;\n\n#[derive(Debug)]\npub enum RecvError {\n    InvalidEventStreamFrame(Error),\n    InvalidHttpFrame(hyper::Error),\n}\n\n/// A manual event stream client that connects to a real service.\npub struct ManualEventStreamClient {\n    message_sender: mpsc::Sender<Message>,\n    response_receiver: mpsc::Receiver<Result<Message, RecvError>>,\n    _handle: tokio::task::JoinHandle<()>,\n}\n\nimpl ManualEventStreamClient {\n    /// Creates a client that connects to a real H2 service on localhost.\n    pub async fn connect_to_service(\n        addr: SocketAddr,\n        path: &str,\n        headers: Vec<(&str, &str)>,\n    ) -> Result<Self, String> {\n        let (message_sender, mut message_receiver) = mpsc::channel(100);\n        let (response_sender, response_receiver) = mpsc::channel(100);\n        let (frame_sender, frame_receiver) = mpsc::channel(100);\n\n        let client = Client::builder(TokioExecutor::new())\n            .http2_only(true)\n            .build_http::<StreamBody<ReceiverStream<Result<Frame<Bytes>, std::io::Error>>>>();\n\n        let uri = format!(\"http://{addr}{path}\");\n\n        // Task to convert messages to frames\n        tokio::spawn(async move {\n            while let Some(message) = message_receiver.recv().await {\n                let mut buffer = Vec::new();\n                if write_message_to(&message, &mut buffer).is_err() {\n                    break;\n                }\n                let _ = frame_sender\n                    .send(Ok(Frame::data(Bytes::from(buffer))))\n                    .await;\n            }\n        });\n        let headers = headers\n            .iter()\n            .map(|s| (s.0.to_string(), s.1.to_string()))\n            .collect::<Vec<_>>();\n\n        let uri: Uri = uri.parse().expect(\"invalid URI\");\n        let mut req = Request::builder()\n            .method(\"POST\")\n            .uri(uri)\n            .header(\"content-type\", \"application/vnd.amazon.eventstream\");\n\n        for (key, value) in &headers {\n            req = req.header(key.to_string(), value.to_string());\n        }\n        let stream = ReceiverStream::new(frame_receiver);\n        let body = StreamBody::new(stream);\n\n        let request = req.body(body).expect(\"failed to construct request\");\n        let handle = tokio::spawn(async move {\n            let response = timeout(Duration::from_secs(1), client.request(request))\n                .await\n                .expect(\"timeout making initial request\")\n                .expect(\"failed to make initial contact with server\");\n            let mut body = response.into_body();\n            let mut decoder = MessageFrameDecoder::new();\n\n            while let Some(frame_result) = body.frame().await {\n                match frame_result {\n                    Ok(frame) => {\n                        if let Some(data) = frame.data_ref() {\n                            let mut data_slice = data.as_ref();\n                            match decoder.decode_frame(&mut data_slice) {\n                                Ok(DecodedFrame::Complete(msg)) => {\n                                    let _ = response_sender.send(Ok(msg)).await;\n                                }\n                                Ok(DecodedFrame::Incomplete) => continue,\n                                Err(e) => {\n                                    let _ =\n                                        response_sender.send(Err(InvalidEventStreamFrame(e))).await;\n                                    break;\n                                }\n                            }\n                        }\n                    }\n                    Err(e) => {\n                        let _ = response_sender\n                            .send(Err(RecvError::InvalidHttpFrame(e)))\n                            .await;\n                        break;\n                    }\n                }\n            }\n        });\n\n        Ok(Self {\n            message_sender,\n            response_receiver,\n            _handle: handle,\n        })\n    }\n\n    /// Sends a message.\n    pub async fn send(&mut self, message: Message) -> Result<(), String> {\n        self.message_sender\n            .send(message)\n            .await\n            .map_err(|e| format!(\"Send failed: {e}\"))\n    }\n\n    /// Receives the next response message.\n    pub async fn recv(&mut self) -> Option<Result<Message, RecvError>> {\n        self.response_receiver.recv().await\n    }\n\n    /// Tries to receive an initial-response message, returns None if the next message isn't initial-response\n    pub async fn try_recv_initial_response(&mut self) -> Option<Result<Message, RecvError>> {\n        if let Some(result) = self.recv().await {\n            match &result {\n                Ok(message) => {\n                    if let Some(event_type) = message\n                        .headers()\n                        .iter()\n                        .find(|h| h.name().as_str() == \":event-type\")\n                        .and_then(|h| h.value().as_string().ok())\n                    {\n                        if event_type.as_str() == \"initial-response\" {\n                            return Some(result);\n                        }\n                    }\n                    // Not an initial-response, we need to buffer this message\n                    // For now, just return None to indicate no initial-response\n                    None\n                }\n                Err(_) => Some(result),\n            }\n        } else {\n            None\n        }\n    }\n}\n\n/// Builder for creating event stream messages with signing support.\npub struct MessageBuilder {\n    signer: Option<Box<dyn SignMessage + Send>>,\n}\n\nimpl MessageBuilder {\n    pub fn new() -> Self {\n        Self { signer: None }\n    }\n\n    pub fn with_signer(mut self, signer: Box<dyn SignMessage + Send>) -> Self {\n        self.signer = Some(signer);\n        self\n    }\n\n    pub fn build_message(\n        &mut self,\n        message: Message,\n    ) -> Result<Message, Box<dyn std::error::Error + Send + Sync>> {\n        match &mut self.signer {\n            Some(signer) => signer.sign(message),\n            None => Ok(message),\n        }\n    }\n}\n\nimpl Default for MessageBuilder {\n    fn default() -> Self {\n        Self::new()\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use aws_smithy_types::event_stream::Message;\n\n    #[tokio::test]\n    async fn test_message_builder() {\n        let mut builder = MessageBuilder::new();\n        let message = Message::new(&b\"test\"[..]);\n\n        let result = builder.build_message(message);\n        assert!(result.is_ok());\n    }\n}\n"
  },
  {
    "path": "codegen-server-test/integration-tests/eventstreams-legacy/src/main.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nfn main() {\n    println!(\"Hello, world!\");\n}\n"
  },
  {
    "path": "codegen-server-test/integration-tests/eventstreams-legacy/tests/structured_eventstream_tests.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_smithy_legacy_http::event_stream::EventStreamSender;\nuse aws_smithy_runtime::test_util::capture_test_logs::show_filtered_test_logs;\nuse aws_smithy_types::event_stream::{Header, HeaderValue, Message};\nuse bytes::Bytes;\nuse eventstreams_legacy::{ManualEventStreamClient, RecvError};\nuse rpcv2cbor_extras_http0x::model::{Event, Events};\nuse rpcv2cbor_extras_http0x::sigv4_event_stream::SignedEvent;\nuse rpcv2cbor_extras_http0x::{error, input, output, RpcV2CborService, RpcV2CborServiceConfig};\nuse std::sync::{Arc, Mutex};\nuse tokio::net::TcpListener;\n\n#[derive(Debug, Default, Clone)]\nstruct StreamingOperationState {\n    events: Vec<SignedEvent<Events>>,\n    num_calls: usize,\n    initial_signature: Option<Vec<u8>>,\n}\n\n#[derive(Debug, Default, Clone)]\nstruct StreamingOperationWithInitialDataState {\n    initial_data: Option<String>,\n    events: Vec<SignedEvent<Events>>,\n    #[allow(dead_code)]\n    num_calls: usize,\n    initial_signature: Option<Vec<u8>>,\n}\n\n#[derive(Debug, Default, Clone)]\nstruct StreamingOperationWithOptionalDataState {\n    optional_data: Option<String>,\n    events: Vec<SignedEvent<Events>>,\n    #[allow(dead_code)]\n    num_calls: usize,\n    initial_signature: Option<Vec<u8>>,\n}\n\n#[derive(Debug, Default, Clone)]\nstruct ServerState {\n    streaming_operation: StreamingOperationState,\n    streaming_operation_with_initial_data: StreamingOperationWithInitialDataState,\n    streaming_operation_with_optional_data: StreamingOperationWithOptionalDataState,\n}\n\nstruct TestServer {\n    addr: std::net::SocketAddr,\n    state: Arc<Mutex<ServerState>>,\n}\n\nimpl TestServer {\n    async fn start() -> Self {\n        let state = Arc::new(Mutex::new(ServerState::default()));\n        let handler_state = state.clone();\n        let handler_state2 = state.clone();\n        let handler_state3 = state.clone();\n        let handler_state4 = state.clone();\n\n        let config = RpcV2CborServiceConfig::builder().build();\n        let app = RpcV2CborService::builder::<hyper0::Body, _, _, _>(config)\n            .streaming_operation(move |input| {\n                let state = handler_state.clone();\n                streaming_operation_handler(input, state)\n            })\n            .streaming_operation_with_initial_data(move |input| {\n                let state = handler_state2.clone();\n                streaming_operation_with_initial_data_handler(input, state)\n            })\n            .streaming_operation_with_initial_response(move |input| {\n                let state = handler_state3.clone();\n                streaming_operation_with_initial_response_handler(input, state)\n            })\n            .streaming_operation_with_optional_data(move |input| {\n                let state = handler_state4.clone();\n                streaming_operation_with_optional_data_handler(input, state)\n            })\n            .build_unchecked();\n\n        let listener = TcpListener::bind(\"127.0.0.1:0\").await.unwrap();\n        let addr = listener.local_addr().unwrap();\n\n        tokio::spawn(async move {\n            let make_service = app.into_make_service();\n            let server = hyper0::Server::from_tcp(listener.into_std().unwrap())\n                .unwrap()\n                .http2_only(true)\n                .serve(make_service);\n            server.await.unwrap();\n        });\n\n        Self { addr, state }\n    }\n\n    fn streaming_operation_events(&self) -> Vec<SignedEvent<Events>> {\n        self.state\n            .lock()\n            .unwrap()\n            .streaming_operation\n            .events\n            .clone()\n    }\n\n    fn streaming_operation_with_initial_data_events(&self) -> Vec<SignedEvent<Events>> {\n        self.state\n            .lock()\n            .unwrap()\n            .streaming_operation_with_initial_data\n            .events\n            .clone()\n    }\n\n    fn initial_data(&self) -> Option<String> {\n        self.state\n            .lock()\n            .unwrap()\n            .streaming_operation_with_initial_data\n            .initial_data\n            .clone()\n    }\n\n    fn streaming_operation_with_optional_data_events(&self) -> Vec<SignedEvent<Events>> {\n        self.state\n            .lock()\n            .unwrap()\n            .streaming_operation_with_optional_data\n            .events\n            .clone()\n    }\n\n    fn optional_data(&self) -> Option<String> {\n        self.state\n            .lock()\n            .unwrap()\n            .streaming_operation_with_optional_data\n            .optional_data\n            .clone()\n    }\n\n    fn initial_signature(&self) -> Option<Vec<u8>> {\n        self.state\n            .lock()\n            .unwrap()\n            .streaming_operation_with_initial_data\n            .initial_signature\n            .clone()\n    }\n\n    fn streaming_operation_initial_signature(&self) -> Option<Vec<u8>> {\n        self.state\n            .lock()\n            .unwrap()\n            .streaming_operation\n            .initial_signature\n            .clone()\n    }\n}\n\nasync fn streaming_operation_handler(\n    mut input: input::StreamingOperationInput,\n    state: Arc<Mutex<ServerState>>,\n) -> Result<output::StreamingOperationOutput, error::StreamingOperationError> {\n    state.lock().unwrap().streaming_operation.num_calls += 1;\n    state.lock().unwrap().streaming_operation.initial_signature = input\n        .events\n        .initial_signature()\n        .map(|s| s.chunk_signature.to_vec());\n\n    let state_clone = state.clone();\n    tokio::spawn(async move {\n        while let Ok(Some(signed_event)) = input.events.recv().await {\n            tracing::debug!(\n                \"streaming_operation received event: {:?}\",\n                signed_event.message\n            );\n            state_clone\n                .lock()\n                .unwrap()\n                .streaming_operation\n                .events\n                .push(signed_event);\n        }\n    });\n\n    Ok(output::StreamingOperationOutput::builder()\n        .events(EventStreamSender::once(Ok(Events::A(Event {}))))\n        .build()\n        .unwrap())\n}\n\nasync fn streaming_operation_with_initial_data_handler(\n    mut input: input::StreamingOperationWithInitialDataInput,\n    state: Arc<Mutex<ServerState>>,\n) -> Result<\n    output::StreamingOperationWithInitialDataOutput,\n    error::StreamingOperationWithInitialDataError,\n> {\n    state.lock().unwrap().streaming_operation.num_calls += 1;\n    state\n        .lock()\n        .unwrap()\n        .streaming_operation_with_initial_data\n        .initial_data = Some(input.initial_data);\n    state\n        .lock()\n        .unwrap()\n        .streaming_operation_with_initial_data\n        .initial_signature = input\n        .events\n        .initial_signature()\n        .map(|s| s.chunk_signature.to_vec());\n\n    let state_clone = state.clone();\n    tokio::spawn(async move {\n        while let Ok(Some(signed_event)) = input.events.recv().await {\n            tracing::debug!(\n                \"streaming_operation_with_initial_data received event: {:?}\",\n                signed_event.message\n            );\n            state_clone\n                .lock()\n                .unwrap()\n                .streaming_operation_with_initial_data\n                .events\n                .push(signed_event);\n        }\n    });\n\n    Ok(output::StreamingOperationWithInitialDataOutput::builder()\n        .events(EventStreamSender::once(Ok(Events::A(Event {}))))\n        .build()\n        .unwrap())\n}\n\nasync fn streaming_operation_with_initial_response_handler(\n    mut input: input::StreamingOperationWithInitialResponseInput,\n    _state: Arc<Mutex<ServerState>>,\n) -> Result<\n    output::StreamingOperationWithInitialResponseOutput,\n    error::StreamingOperationWithInitialResponseError,\n> {\n    tokio::spawn(async move {\n        while let Ok(Some(event)) = input.events.recv().await {\n            tracing::debug!(\n                \"streaming_operation_with_initial_response received event: {:?}\",\n                event\n            );\n        }\n    });\n\n    Ok(\n        output::StreamingOperationWithInitialResponseOutput::builder()\n            .response_data(\"test response data\".to_string())\n            .events(EventStreamSender::once(Ok(Events::A(Event {}))))\n            .build()\n            .unwrap(),\n    )\n}\n\nasync fn streaming_operation_with_optional_data_handler(\n    mut input: input::StreamingOperationWithOptionalDataInput,\n    state: Arc<Mutex<ServerState>>,\n) -> Result<\n    output::StreamingOperationWithOptionalDataOutput,\n    error::StreamingOperationWithOptionalDataError,\n> {\n    state.lock().unwrap().streaming_operation.num_calls += 1;\n    state\n        .lock()\n        .unwrap()\n        .streaming_operation_with_optional_data\n        .optional_data = input.optional_data;\n    state\n        .lock()\n        .unwrap()\n        .streaming_operation_with_optional_data\n        .initial_signature = input\n        .events\n        .initial_signature()\n        .map(|s| s.chunk_signature.to_vec());\n\n    let state_clone = state.clone();\n    tokio::spawn(async move {\n        while let Ok(Some(event)) = input.events.recv().await {\n            tracing::debug!(\n                \"streaming_operation_with_optional_data received event: {:?}\",\n                event\n            );\n            state_clone\n                .lock()\n                .unwrap()\n                .streaming_operation_with_optional_data\n                .events\n                .push(event);\n        }\n    });\n\n    Ok(output::StreamingOperationWithOptionalDataOutput::builder()\n        .optional_response_data(Some(\"optional response\".to_string()))\n        .events(EventStreamSender::once(Ok(Events::A(Event {}))))\n        .build()\n        .unwrap())\n}\n\n/// TestHarness that launches a server and attaches a client\n///\n/// It allows sending event stream messages and reading the results.\nstruct TestHarness {\n    server: TestServer,\n    client: ManualEventStreamClient,\n    initial_response: Option<Message>,\n}\n\nimpl TestHarness {\n    async fn new(operation: &str) -> Self {\n        let server = TestServer::start().await;\n        let path = format!(\"/service/RpcV2CborService/operation/{operation}\");\n        let client = ManualEventStreamClient::connect_to_service(\n            server.addr,\n            &path,\n            vec![(\"Smithy-Protocol\", \"rpc-v2-cbor\")],\n        )\n        .await\n        .unwrap();\n\n        Self {\n            server,\n            client,\n            initial_response: None,\n        }\n    }\n\n    async fn send_initial_data(&mut self, data: &str) {\n        let msg = build_initial_data_message(data);\n        self.client.send(msg).await.ok();\n    }\n\n    async fn send_event(&mut self, event_type: &str) {\n        let msg = build_event(event_type);\n        self.client.send(msg).await.unwrap();\n    }\n\n    async fn expect_message(&mut self) -> Message {\n        let msg = self.client.recv().await.unwrap().unwrap();\n\n        // If this is an initial-response, store it and get the next message\n        if get_event_type(&msg) == \"initial-response\" {\n            self.initial_response = Some(msg);\n            self.client.recv().await.unwrap().unwrap()\n        } else {\n            msg\n        }\n    }\n\n    async fn recv(&mut self) -> Option<Result<Message, RecvError>> {\n        self.client.recv().await\n    }\n}\n\nfn build_initial_request() -> Message {\n    let headers = vec![\n        Header::new(\":message-type\", HeaderValue::String(\"event\".into())),\n        Header::new(\":event-type\", HeaderValue::String(\"initial-request\".into())),\n        Header::new(\n            \":content-type\",\n            HeaderValue::String(\"application/cbor\".into()),\n        ),\n    ];\n    let empty_cbor = Bytes::from(vec![0xbf, 0xff]);\n    Message::new_from_parts(headers, empty_cbor)\n}\n\nfn build_initial_data_message(data: &str) -> Message {\n    let headers = vec![\n        Header::new(\":message-type\", HeaderValue::String(\"event\".into())),\n        Header::new(\":event-type\", HeaderValue::String(\"initial-request\".into())),\n        Header::new(\n            \":content-type\",\n            HeaderValue::String(\"application/cbor\".into()),\n        ),\n    ];\n\n    // Serialize using CBOR: { \"initialData\": data }\n    let mut encoder = aws_smithy_cbor::Encoder::new(Vec::new());\n    encoder.begin_map();\n    encoder.str(\"initialData\").str(data);\n    encoder.end();\n    let payload = Bytes::from(encoder.into_writer());\n\n    Message::new_from_parts(headers, payload)\n}\n\nfn build_event(event_type: &str) -> Message {\n    let headers = vec![\n        Header::new(\":message-type\", HeaderValue::String(\"event\".into())),\n        Header::new(\n            \":event-type\",\n            HeaderValue::String(event_type.to_string().into()),\n        ),\n        Header::new(\n            \":content-type\",\n            HeaderValue::String(\"application/cbor\".into()),\n        ),\n    ];\n    let empty_cbor = Bytes::from(vec![0xbf, 0xff]);\n    Message::new_from_parts(headers, empty_cbor)\n}\n\nfn sign_message(inner_message: Message, signature: &[u8], timestamp_secs: i64) -> Message {\n    use aws_smithy_eventstream::frame::write_message_to;\n\n    let mut inner_bytes = Vec::new();\n    write_message_to(&inner_message, &mut inner_bytes).unwrap();\n\n    let headers = vec![\n        Header::new(\n            \":chunk-signature\",\n            HeaderValue::ByteArray(Bytes::from(signature.to_vec())),\n        ),\n        Header::new(\n            \":date\",\n            HeaderValue::Timestamp(aws_smithy_types::DateTime::from_secs(timestamp_secs)),\n        ),\n    ];\n\n    Message::new_from_parts(headers, Bytes::from(inner_bytes))\n}\n\nfn build_sigv4_signed_event_with_signature(event_type: &str, signature: &[u8]) -> Message {\n    use std::time::{SystemTime, UNIX_EPOCH};\n\n    let timestamp = SystemTime::now()\n        .duration_since(UNIX_EPOCH)\n        .unwrap()\n        .as_secs();\n\n    sign_message(build_event(event_type), signature, timestamp as i64)\n}\n\nfn build_sigv4_signed_initial_data(data: &str, signature: &[u8], timestamp_secs: i64) -> Message {\n    sign_message(build_initial_data_message(data), signature, timestamp_secs)\n}\n\nfn get_event_type(msg: &Message) -> &str {\n    msg.headers()\n        .iter()\n        .find(|h| h.name().as_str() == \":event-type\")\n        .unwrap()\n        .value()\n        .as_string()\n        .unwrap()\n        .as_str()\n}\n\n#[tokio::test]\nasync fn test_streaming_operation_with_initial_data() {\n    let mut harness = TestHarness::new(\"StreamingOperationWithInitialData\").await;\n    harness.send_initial_data(\"test-data\").await;\n\n    harness.send_event(\"A\").await;\n\n    let resp = harness.expect_message().await;\n    assert_eq!(get_event_type(&resp), \"A\");\n    assert_eq!(\n        harness\n            .server\n            .streaming_operation_with_initial_data_events()\n            .into_iter()\n            .map(|e| e.message)\n            .collect::<Vec<_>>(),\n        vec![Events::A(Event {})]\n    );\n    // verify that we parsed the initial data properly\n    assert_eq!(harness.server.initial_data(), Some(\"test-data\".to_string()));\n}\n\n/// StreamingOperationWithInitialData has a mandatory initial data field.\n/// If we don't send this field, we'll never hit the handler.\n#[tokio::test]\nasync fn test_streaming_operation_with_initial_data_missing() {\n    let _logs = show_filtered_test_logs(\n        \"aws_smithy_legacy_http_server=trace,hyper_util=debug,rpcv2cbor_extras_http0x=trace\",\n    );\n    let mut harness = TestHarness::new(\"StreamingOperationWithInitialData\").await;\n\n    harness.send_event(\"A\").await;\n\n    assert!(harness.recv().await.is_none());\n\n    // assert the server never received the request\n    assert_eq!(\n        harness\n            .server\n            .streaming_operation_with_initial_data_events()\n            .into_iter()\n            .map(|e| e.message)\n            .collect::<Vec<_>>(),\n        vec![]\n    );\n}\n\n/// Test that when alwaysSendEventStreamInitialResponse is disabled, no initial-response is sent\n#[tokio::test]\nasync fn test_server_no_initial_response_when_disabled() {\n    use rpcv2cbor_extras_no_initial_response_http0x::output;\n    use rpcv2cbor_extras_no_initial_response_http0x::{RpcV2CborService, RpcV2CborServiceConfig};\n\n    let config = RpcV2CborServiceConfig::builder().build();\n    let app = RpcV2CborService::builder::<hyper0::Body, _, _, _>(config)\n        .streaming_operation_with_initial_data(move |mut input: rpcv2cbor_extras_no_initial_response_http0x::input::StreamingOperationWithInitialDataInput| async move {\n            let _ev = input.events.recv().await;\n            Ok(output::StreamingOperationWithInitialDataOutput::builder()\n                .events(aws_smithy_legacy_http::event_stream::EventStreamSender::once(Ok(rpcv2cbor_extras_no_initial_response_http0x::model::Events::A(rpcv2cbor_extras_no_initial_response_http0x::model::Event {}))))\n                .build()\n                .unwrap())\n        })\n        .build_unchecked();\n\n    let listener = tokio::net::TcpListener::bind(\"127.0.0.1:0\").await.unwrap();\n    let addr = listener.local_addr().unwrap();\n\n    tokio::spawn(async move {\n        let make_service = app.into_make_service();\n        let server = hyper0::Server::from_tcp(listener.into_std().unwrap())\n            .unwrap()\n            .http2_only(true)\n            .serve(make_service);\n        server.await.unwrap();\n    });\n\n    let path = \"/service/RpcV2CborService/operation/StreamingOperationWithInitialData\";\n    let mut client = ManualEventStreamClient::connect_to_service(\n        addr,\n        path,\n        vec![(\"Smithy-Protocol\", \"rpc-v2-cbor\")],\n    )\n    .await\n    .unwrap();\n\n    // Send initial data and event\n    let msg = build_initial_data_message(\"test-data\");\n    client.send(msg).await.ok();\n    let msg = build_event(\"A\");\n    client.send(msg).await.unwrap();\n\n    // Should receive event directly (no initial-response)\n    let resp = client.recv().await.unwrap().unwrap();\n    assert_eq!(\n        get_event_type(&resp),\n        \"A\",\n        \"Should receive event directly without initial-response\"\n    );\n}\n\n/// Test that server sends initial-response for RPC protocols\n#[tokio::test]\nasync fn test_server_sends_initial_response() {\n    let mut harness = TestHarness::new(\"StreamingOperationWithInitialData\").await;\n    harness.send_initial_data(\"test-data\").await;\n    harness.send_event(\"A\").await;\n\n    // Server should send initial-response before any events\n    let initial_response = harness.client.try_recv_initial_response().await;\n    assert!(\n        initial_response.is_some(),\n        \"Server should send initial-response message\"\n    );\n\n    let initial_msg = initial_response.unwrap().unwrap();\n    assert_eq!(get_event_type(&initial_msg), \"initial-response\");\n\n    // Then we should get the actual event\n    let resp = harness.expect_message().await;\n    assert_eq!(get_event_type(&resp), \"A\");\n}\n\n/// Test that server sends initial-response with actual data for operations that have non-eventstream output members\n#[tokio::test]\nasync fn test_server_sends_initial_response_with_data() {\n    let mut harness = TestHarness::new(\"StreamingOperationWithInitialResponse\").await;\n    harness.send_event(\"A\").await;\n\n    let resp = harness.expect_message().await;\n    assert_eq!(get_event_type(&resp), \"A\");\n\n    // Check that initial-response was received with actual data\n    assert!(harness.initial_response.is_some());\n    let initial_resp = harness.initial_response.as_ref().unwrap();\n    assert_eq!(get_event_type(initial_resp), \"initial-response\");\n\n    // The initial response should contain serialized responseData\n    assert!(!initial_resp.payload().is_empty());\n\n    // Parse the CBOR payload to verify the responseData field\n    let decoder = &mut aws_smithy_cbor::Decoder::new(initial_resp.payload());\n    decoder.map().unwrap(); // Start reading the map\n\n    // Read the key-value pair\n    let key = decoder.str().unwrap();\n    assert_eq!(key, \"responseData\");\n    let value = decoder.string().unwrap();\n    assert_eq!(value, \"test response data\");\n}\n\n/// Test streaming operation with optional data - verifies Smithy spec requirement:\n/// \"Clients and servers MUST NOT fail if an initial-request or initial-response\n/// is not received for an initial message that contains only optional members.\"\n#[tokio::test]\nasync fn test_streaming_operation_with_optional_data() {\n    let mut harness = TestHarness::new(\"StreamingOperationWithOptionalData\").await;\n\n    // Send event without providing optional data - should work\n    harness.send_event(\"A\").await;\n\n    let resp = harness.expect_message().await;\n    assert_eq!(get_event_type(&resp), \"A\");\n    assert_eq!(\n        harness\n            .server\n            .streaming_operation_with_optional_data_events()\n            .into_iter()\n            .map(|e| e.message)\n            .collect::<Vec<_>>(),\n        vec![Events::A(Event {})]\n    );\n    // Verify optional data was not provided\n    assert_eq!(harness.server.optional_data(), None);\n}\n\n/// Test that SigV4-framed initial-request messages are properly handled.\n/// This verifies the fix for issue #4397 where try_recv_initial_request\n/// can now see inside the SigV4 envelope to detect the initial-request event type.\n#[tokio::test]\nasync fn test_sigv4_framed_initial_request_with_data() {\n    let _logs = show_filtered_test_logs(\n        \"aws_smithy_legacy_http_server=trace,hyper_util=debug,rpcv2cbor_extras_http0x=trace\",\n    );\n    let mut harness = TestHarness::new(\"StreamingOperationWithInitialData\").await;\n\n    // Send a SigV4-framed initial-request with data\n    let signed_initial_request = build_sigv4_signed_initial_data(\n        \"test-data\",\n        b\"example298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\",\n        1700000000,\n    );\n    harness.client.send(signed_initial_request).await.unwrap();\n\n    harness.send_event(\"A\").await;\n\n    // The server should now properly extract the initial-request from the SigV4 envelope\n    let resp = harness.expect_message().await;\n    assert_eq!(get_event_type(&resp), \"A\");\n\n    // Verify the server received and parsed the initial data from inside the SigV4 envelope\n    assert_eq!(harness.server.initial_data(), Some(\"test-data\".to_string()));\n    assert_eq!(\n        harness.server.initial_signature(),\n        Some(b\"example298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\".to_vec())\n    );\n}\n\n#[derive(Debug, Clone, Copy)]\nenum InitialMessage {\n    None,\n    Unsigned,\n    Signed,\n}\n\n#[derive(Debug, Clone)]\nstruct EventStreamTestCase {\n    initial: InitialMessage,\n    events_signed: Vec<bool>,\n}\n\n/// Comprehensive test matrix for SigV4 event stream combinations\n#[rstest::rstest]\n#[case::no_initial_unsigned_events(EventStreamTestCase { initial: InitialMessage::None, events_signed: vec![false, false] })]\n#[case::no_initial_signed_events(EventStreamTestCase { initial: InitialMessage::None, events_signed: vec![true, true] })]\n#[case::no_initial_mixed_events(EventStreamTestCase { initial: InitialMessage::None, events_signed: vec![false, true] })]\n#[case::unsigned_initial_unsigned_events(EventStreamTestCase { initial: InitialMessage::Unsigned, events_signed: vec![false, false] })]\n#[case::unsigned_initial_signed_events(EventStreamTestCase { initial: InitialMessage::Unsigned, events_signed: vec![true, true] })]\n#[case::unsigned_initial_mixed_events(EventStreamTestCase { initial: InitialMessage::Unsigned, events_signed: vec![false, true] })]\n#[case::signed_initial_unsigned_events(EventStreamTestCase { initial: InitialMessage::Signed, events_signed: vec![false, false] })]\n#[case::signed_initial_signed_events(EventStreamTestCase { initial: InitialMessage::Signed, events_signed: vec![true, true] })]\n#[case::signed_initial_mixed_events(EventStreamTestCase { initial: InitialMessage::Signed, events_signed: vec![false, true] })]\n#[case::no_events(EventStreamTestCase { initial: InitialMessage::None, events_signed: vec![] })]\n#[case::many_signed_events(EventStreamTestCase { initial: InitialMessage::Signed, events_signed: vec![true; 100] })]\n#[case::many_unsigned_events(EventStreamTestCase { initial: InitialMessage::None, events_signed: vec![false; 100] })]\n#[tokio::test]\nasync fn test_sigv4_event_stream_matrix(#[case] test_case: EventStreamTestCase) {\n    let mut harness = TestHarness::new(\"StreamingOperation\").await;\n\n    // Send initial message if specified\n    match test_case.initial {\n        InitialMessage::None => {}\n        InitialMessage::Unsigned => {\n            harness.client.send(build_initial_request()).await.unwrap();\n        }\n        InitialMessage::Signed => {\n            let signed_initial = sign_message(build_initial_request(), b\"initial-sig\", 1700000000);\n            harness.client.send(signed_initial).await.unwrap();\n        }\n    }\n\n    // Send events\n    for (i, &signed) in test_case.events_signed.iter().enumerate() {\n        let event_type = if i % 2 == 0 { \"A\" } else { \"B\" };\n        if signed {\n            let sig = format!(\"sig-event-{i}\");\n            let signed_event = build_sigv4_signed_event_with_signature(event_type, sig.as_bytes());\n            harness.client.send(signed_event).await.unwrap();\n        } else {\n            harness.send_event(event_type).await;\n        }\n    }\n\n    // Receive response (only if we sent events)\n    if !test_case.events_signed.is_empty() {\n        let resp = harness.expect_message().await;\n        assert_eq!(get_event_type(&resp), \"A\");\n    }\n\n    // Verify events\n    let events = harness.server.streaming_operation_events();\n    assert_eq!(events.len(), test_case.events_signed.len());\n\n    for (i, &signed) in test_case.events_signed.iter().enumerate() {\n        let expected_event = if i % 2 == 0 {\n            Events::A(Event {})\n        } else {\n            Events::B(Event {})\n        };\n        assert_eq!(events[i].message, expected_event);\n\n        if signed {\n            assert!(\n                events[i].signature.is_some(),\n                \"Event {i} should have signature\"\n            );\n            let expected_sig = format!(\"sig-event-{i}\");\n            assert_eq!(\n                events[i].signature.as_ref().unwrap().chunk_signature,\n                expected_sig.as_bytes()\n            );\n        } else {\n            assert!(\n                events[i].signature.is_none(),\n                \"Event {i} should not have signature\"\n            );\n        }\n    }\n\n    // Verify initial signature\n    match test_case.initial {\n        InitialMessage::Signed => {\n            assert_eq!(\n                harness.server.streaming_operation_initial_signature(),\n                Some(b\"initial-sig\".to_vec())\n            );\n        }\n        InitialMessage::None | InitialMessage::Unsigned => {\n            assert_eq!(harness.server.streaming_operation_initial_signature(), None);\n        }\n    }\n}\n\n/// Test signed initial data with signed events\n#[tokio::test]\nasync fn test_sigv4_signed_initial_data_with_signed_events() {\n    let mut harness = TestHarness::new(\"StreamingOperationWithInitialData\").await;\n\n    // Send signed initial data\n    let signed_initial =\n        build_sigv4_signed_initial_data(\"test-data\", b\"sig-initial-data\", 1700000000);\n    harness.client.send(signed_initial).await.unwrap();\n\n    // Send signed events\n    let signed_event_a = build_sigv4_signed_event_with_signature(\"A\", b\"sig-event-A\");\n    harness.client.send(signed_event_a).await.unwrap();\n\n    let signed_event_b = build_sigv4_signed_event_with_signature(\"B\", b\"sig-event-B\");\n    harness.client.send(signed_event_b).await.unwrap();\n\n    let resp = harness.expect_message().await;\n    assert_eq!(get_event_type(&resp), \"A\");\n\n    // Verify initial data was received\n    assert_eq!(harness.server.initial_data(), Some(\"test-data\".to_string()));\n\n    // Verify initial signature\n    assert_eq!(\n        harness.server.initial_signature(),\n        Some(b\"sig-initial-data\".to_vec())\n    );\n\n    // Verify events with signatures\n    let events = harness\n        .server\n        .streaming_operation_with_initial_data_events();\n    assert_eq!(events.len(), 2);\n\n    assert_eq!(events[0].message, Events::A(Event {}));\n    assert_eq!(\n        events[0].signature.as_ref().unwrap().chunk_signature,\n        b\"sig-event-A\"\n    );\n\n    assert_eq!(events[1].message, Events::B(Event {}));\n    assert_eq!(\n        events[1].signature.as_ref().unwrap().chunk_signature,\n        b\"sig-event-B\"\n    );\n}\n\n/// Test that timestamps are preserved in signatures\n#[tokio::test]\nasync fn test_sigv4_timestamp_preservation() {\n    let mut harness = TestHarness::new(\"StreamingOperation\").await;\n\n    // Send events with specific timestamps\n    let timestamp1 = 1700000000i64;\n    let timestamp2 = 1700000100i64;\n\n    let event1 = sign_message(build_event(\"A\"), b\"sig-1\", timestamp1);\n    harness.client.send(event1).await.unwrap();\n\n    let event2 = sign_message(build_event(\"B\"), b\"sig-2\", timestamp2);\n    harness.client.send(event2).await.unwrap();\n\n    let resp = harness.expect_message().await;\n    assert_eq!(get_event_type(&resp), \"A\");\n\n    let events = harness.server.streaming_operation_events();\n    assert_eq!(events.len(), 2);\n\n    // Verify timestamps are preserved\n    use std::time::UNIX_EPOCH;\n\n    let expected_time1 = UNIX_EPOCH + std::time::Duration::from_secs(timestamp1 as u64);\n    assert_eq!(\n        events[0].signature.as_ref().unwrap().timestamp,\n        expected_time1\n    );\n\n    let expected_time2 = UNIX_EPOCH + std::time::Duration::from_secs(timestamp2 as u64);\n    assert_eq!(\n        events[1].signature.as_ref().unwrap().timestamp,\n        expected_time2\n    );\n}\n"
  },
  {
    "path": "codegen-traits/build.gradle.kts",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nplugins {\n    id(\"smithy-rs.kotlin-conventions\")\n    id(\"smithy-rs.publishing-conventions\")\n}\n\ndescription = \"Smithy traits for Rust code generation\"\nextra[\"displayName\"] = \"Smithy :: Rust :: Codegen :: Traits\"\nextra[\"moduleName\"] = \"software.amazon.smithy.framework.rust\"\n\ndependencies {\n    implementation(libs.smithy.model)\n    testImplementation(libs.junit.jupiter)\n}\n"
  },
  {
    "path": "codegen-traits/src/main/kotlin/software/amazon/smithy/framework/rust/ValidationExceptionTrait.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.framework.rust\n\nimport software.amazon.smithy.model.SourceLocation\nimport software.amazon.smithy.model.node.Node\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.model.traits.AbstractTrait\nimport software.amazon.smithy.model.traits.Trait\n\nclass ValidationExceptionTrait(\n    sourceLocation: SourceLocation,\n) : AbstractTrait(ID, sourceLocation) {\n    companion object {\n        val ID: ShapeId = ShapeId.from(\"smithy.framework.rust#validationException\")\n    }\n\n    override fun createNode(): Node = Node.objectNode()\n\n    class Provider : AbstractTrait.Provider(ID) {\n        override fun createTrait(\n            target: ShapeId,\n            value: Node,\n        ): Trait {\n            val result = ValidationExceptionTrait(value.sourceLocation)\n            result.setNodeCache(value)\n            return result\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-traits/src/main/kotlin/software/amazon/smithy/framework/rust/ValidationFieldListTrait.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.framework.rust\n\nimport software.amazon.smithy.model.SourceLocation\nimport software.amazon.smithy.model.node.Node\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.model.traits.AbstractTrait\nimport software.amazon.smithy.model.traits.Trait\n\nclass ValidationFieldListTrait(\n    sourceLocation: SourceLocation,\n) : AbstractTrait(ID, sourceLocation) {\n    companion object {\n        val ID: ShapeId = ShapeId.from(\"smithy.framework.rust#validationFieldList\")\n    }\n\n    override fun createNode(): Node = Node.objectNode()\n\n    class Provider : AbstractTrait.Provider(ID) {\n        override fun createTrait(\n            target: ShapeId,\n            value: Node,\n        ): Trait {\n            val result = ValidationFieldListTrait(value.sourceLocation)\n            result.setNodeCache(value)\n            return result\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-traits/src/main/kotlin/software/amazon/smithy/framework/rust/ValidationFieldMessageTrait.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.framework.rust\n\nimport software.amazon.smithy.model.SourceLocation\nimport software.amazon.smithy.model.node.Node\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.model.traits.AbstractTrait\nimport software.amazon.smithy.model.traits.Trait\n\nclass ValidationFieldMessageTrait(\n    sourceLocation: SourceLocation,\n) : AbstractTrait(ID, sourceLocation) {\n    companion object {\n        val ID: ShapeId = ShapeId.from(\"smithy.framework.rust#validationFieldMessage\")\n    }\n\n    override fun createNode(): Node = Node.objectNode()\n\n    class Provider : AbstractTrait.Provider(ID) {\n        override fun createTrait(\n            target: ShapeId,\n            value: Node,\n        ): Trait {\n            val result = ValidationFieldMessageTrait(value.sourceLocation)\n            result.setNodeCache(value)\n            return result\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-traits/src/main/kotlin/software/amazon/smithy/framework/rust/ValidationFieldNameTrait.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.framework.rust\n\nimport software.amazon.smithy.model.SourceLocation\nimport software.amazon.smithy.model.node.Node\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.model.traits.AbstractTrait\nimport software.amazon.smithy.model.traits.Trait\n\nclass ValidationFieldNameTrait(\n    sourceLocation: SourceLocation,\n) : AbstractTrait(ID, sourceLocation) {\n    companion object {\n        val ID: ShapeId = ShapeId.from(\"smithy.framework.rust#validationFieldName\")\n    }\n\n    override fun createNode(): Node = Node.objectNode()\n\n    class Provider : AbstractTrait.Provider(ID) {\n        override fun createTrait(\n            target: ShapeId,\n            value: Node,\n        ): Trait {\n            val result = ValidationFieldNameTrait(value.sourceLocation)\n            result.setNodeCache(value)\n            return result\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-traits/src/main/kotlin/software/amazon/smithy/framework/rust/ValidationMessageTrait.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.framework.rust\n\nimport software.amazon.smithy.model.SourceLocation\nimport software.amazon.smithy.model.node.Node\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.model.traits.AbstractTrait\nimport software.amazon.smithy.model.traits.Trait\n\nclass ValidationMessageTrait(\n    sourceLocation: SourceLocation,\n) : AbstractTrait(ID, sourceLocation) {\n    companion object {\n        val ID: ShapeId = ShapeId.from(\"smithy.framework.rust#validationMessage\")\n    }\n\n    override fun createNode(): Node = Node.objectNode()\n\n    class Provider : AbstractTrait.Provider(ID) {\n        override fun createTrait(\n            target: ShapeId,\n            value: Node,\n        ): Trait {\n            val result = ValidationMessageTrait(value.sourceLocation)\n            result.setNodeCache(value)\n            return result\n        }\n    }\n}\n"
  },
  {
    "path": "codegen-traits/src/main/resources/META-INF/smithy/manifest",
    "content": "validation-exception.smithy"
  },
  {
    "path": "codegen-traits/src/main/resources/META-INF/smithy/services/software.amazon.smithy.model.traits.TraitService",
    "content": "software.amazon.smithy.rust.codegen.server.smithy.traits.ValidationExceptionTrait$Provider\nsoftware.amazon.smithy.rust.codegen.server.smithy.traits.ValidationMessageTrait$Provider\nsoftware.amazon.smithy.rust.codegen.server.smithy.traits.ValidationFieldListTrait$Provider\nsoftware.amazon.smithy.rust.codegen.server.smithy.traits.ValidationFieldNameTrait$Provider\nsoftware.amazon.smithy.rust.codegen.server.smithy.traits.ValidationFieldMessageTrait$Provider\n"
  },
  {
    "path": "codegen-traits/src/main/resources/META-INF/smithy/validation-exception.smithy",
    "content": "$version: \"2.0\"\n\nnamespace smithy.framework.rust\n\n/// Marks a structure as a custom validation exception that can replace\n/// smithy.framework#ValidationException in operation error lists.\n@internal\n@trait(selector: \"structure\")\nstructure validationException {}\n\n/// Marks a String member as the primary message field for a validation exception.\n/// Exactly one member in a @validationException structure must have this trait.\n@internal\n@trait(selector: \"structure[trait|smithy.framework.rust#validationException] > member\")\nstructure validationMessage {}\n\n/// Marks a member as containing the list of field-level validation errors.\n/// The target shape must be a List<Structure> where\n/// the structure contains validation field information.\n@internal\n@trait(selector: \"structure > member\")\nstructure validationFieldList {}\n\n/// Marks a String member as containing the field name in a validation field structure.\n@internal\n@trait(selector: \"structure > member\")\nstructure validationFieldName {}\n\n/// Marks a String member as containing the field error message in a validation field structure.\n@internal\n@trait(selector: \"structure > member\")\nstructure validationFieldMessage {}\n"
  },
  {
    "path": "codegen-traits/src/test/kotlin/software/amazon/smithy/rust/codegen/traits/ValidationExceptionTraitTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.framework.rust\n\nimport org.junit.jupiter.api.Assertions.assertEquals\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.model.SourceLocation\nimport software.amazon.smithy.model.shapes.ShapeId\n\nclass ValidationExceptionTraitTest {\n    @Test\n    fun testValidationExceptionTrait() {\n        val trait = ValidationExceptionTrait(SourceLocation.NONE)\n        assertEquals(ShapeId.from(\"smithy.framework.rust#validationException\"), trait.toShapeId())\n\n        // Test the Provider\n        val provider = ValidationExceptionTrait.Provider()\n        assertEquals(ShapeId.from(\"smithy.framework.rust#validationException\"), provider.shapeId)\n    }\n}\n"
  },
  {
    "path": "codegen-traits/src/test/kotlin/software/amazon/smithy/rust/codegen/traits/ValidationFieldListTraitTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.framework.rust\n\nimport org.junit.jupiter.api.Assertions.assertEquals\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.model.SourceLocation\nimport software.amazon.smithy.model.shapes.ShapeId\n\nclass ValidationFieldListTraitTest {\n    @Test\n    fun testValidationFieldListTrait() {\n        val trait = ValidationFieldListTrait(SourceLocation.NONE)\n        assertEquals(ShapeId.from(\"smithy.framework.rust#validationFieldList\"), trait.toShapeId())\n\n        // Test the Provider\n        val provider = ValidationFieldListTrait.Provider()\n        assertEquals(ShapeId.from(\"smithy.framework.rust#validationFieldList\"), provider.shapeId)\n    }\n}\n"
  },
  {
    "path": "codegen-traits/src/test/kotlin/software/amazon/smithy/rust/codegen/traits/ValidationFieldMessageTraitTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.framework.rust\n\nimport org.junit.jupiter.api.Assertions.assertEquals\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.model.SourceLocation\nimport software.amazon.smithy.model.shapes.ShapeId\n\nclass ValidationFieldMessageTraitTest {\n    @Test\n    fun testValidationFieldMessageTrait() {\n        val trait = ValidationFieldMessageTrait(SourceLocation.NONE)\n        assertEquals(ShapeId.from(\"smithy.framework.rust#validationFieldMessage\"), trait.toShapeId())\n\n        // Test the Provider\n        val provider = ValidationFieldMessageTrait.Provider()\n        assertEquals(ShapeId.from(\"smithy.framework.rust#validationFieldMessage\"), provider.shapeId)\n    }\n}\n"
  },
  {
    "path": "codegen-traits/src/test/kotlin/software/amazon/smithy/rust/codegen/traits/ValidationFieldNameTraitTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.framework.rust\n\nimport org.junit.jupiter.api.Assertions.assertEquals\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.model.SourceLocation\nimport software.amazon.smithy.model.shapes.ShapeId\n\nclass ValidationFieldNameTraitTest {\n    @Test\n    fun testValidationFieldNameTrait() {\n        val trait = ValidationFieldNameTrait(SourceLocation.NONE)\n        assertEquals(ShapeId.from(\"smithy.framework.rust#validationFieldName\"), trait.toShapeId())\n\n        // Test the Provider\n        val provider = ValidationFieldNameTrait.Provider()\n        assertEquals(ShapeId.from(\"smithy.framework.rust#validationFieldName\"), provider.shapeId)\n    }\n}\n"
  },
  {
    "path": "codegen-traits/src/test/kotlin/software/amazon/smithy/rust/codegen/traits/ValidationMessageTraitTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.framework.rust\n\nimport org.junit.jupiter.api.Assertions.assertEquals\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.model.SourceLocation\nimport software.amazon.smithy.model.shapes.ShapeId\n\nclass ValidationMessageTraitTest {\n    @Test\n    fun testValidationMessageTrait() {\n        val trait = ValidationMessageTrait(SourceLocation.NONE)\n        assertEquals(ShapeId.from(\"smithy.framework.rust#validationMessage\"), trait.toShapeId())\n\n        // Test the Provider\n        val provider = ValidationMessageTrait.Provider()\n        assertEquals(ShapeId.from(\"smithy.framework.rust#validationMessage\"), provider.shapeId)\n    }\n}\n"
  },
  {
    "path": "design/.gitignore",
    "content": "book\n"
  },
  {
    "path": "design/README.md",
    "content": "Design docs are hosted [here](https://smithy-lang.github.io/smithy-rs/design/).\n\nTo render design docs locally:\n```\ncargo install mdbook\ncargo install mdbook-mermaid\nmdbook serve &\nopen http://localhost:3000\n```\n"
  },
  {
    "path": "design/book.toml",
    "content": "[book]\ntitle = \"Smithy Rust\"\nauthors = [\"Russell Cohen\", \"aws-sdk-rust@amazon.com\"]\nlanguage = \"en\"\nmultilingual = false\nsrc = \"src\"\n\n[rust]\nedition = \"2021\"\n\n[preprocessor.mermaid]\ncommand = \"mdbook-mermaid\"\n\n[output.html]\nadditional-js = [\"static/mermaid.min.js\", \"static/mermaid-init.js\"]\n"
  },
  {
    "path": "design/src/SUMMARY.md",
    "content": "# Summary\n\n- [Design Overview](./overview.md)\n- [Tenets](./tenets.md)\n- [Design FAQ](./faq.md)\n\n- [Smithy](./smithy/overview.md)\n  - [Simple Shapes](./smithy/simple_shapes.md)\n  - [Recursive Shapes](./smithy/recursive_shapes.md)\n  - [Aggregate Shapes](./smithy/aggregate_shapes.md)\n  - [Backwards Compatibility](smithy/backwards-compat.md)\n\n- [Client](./client/overview.md)\n  - [What is the 'orchestrator' and why does it exist?](./client/orchestrator.md)\n  - [Identity and Auth](./client/identity_and_auth.md)\n  - [Detailed error explanations](./client/detailed_error_explanations.md)\n\n- [Server](./server/overview.md)\n  - [Middleware](./server/middleware.md)\n  - [Instrumentation](./server/instrumentation.md)\n  - [Accessing Un-modelled Data](./server/from_parts.md)\n  - [The Anatomy of a Service](./server/anatomy.md)\n  - [Generating Common Service Code](./server/code_generation.md)\n\n- [RFCs](./rfcs/overview.md)\n  - [RFC-0001: Sharing configuration between multiple clients](./rfcs/rfc0001_shared_config.md)\n  - [RFC-0002: Supporting multiple HTTP versions for SDKs that use Event Stream](./rfcs/rfc0002_http_versions.md)\n  - [RFC-0003: API for Pre-signed URLs](./rfcs/rfc0003_presigning_api.md)\n  - [RFC-0004: Retry Behavior](./rfcs/rfc0004_retry_behavior.md)\n  - [RFC-0005: Smithy Rust service framework](./rfcs/rfc0005_service_generation.md)\n  - [RFC-0006: Service-specific middleware](./rfcs/rfc0006_service_specific_middleware.md)\n  - [RFC-0007: Split release process](./rfcs/rfc0007_split_release_process.md)\n  - [RFC-0008: Paginators](./rfcs/rfc0008_paginators.md)\n  - [RFC-0009: Example Consolidation](./rfcs/rfc0009_example_consolidation.md)\n  - [RFC-0010: Waiters](./rfcs/rfc0010_waiters.md)\n  - [RFC-0011: Publishing Alpha to Crates.io](./rfcs/rfc0011_crates_io_alpha_publishing.md)\n  - [RFC-0012: Independent Crate Versioning](./rfcs/rfc0012_independent_crate_versioning.md)\n  - [RFC-0013: Body Callback APIs](./rfcs/rfc0013_body_callback_apis.md)\n  - [RFC-0014: Fine-grained timeout configuration](./rfcs/rfc0014_timeout_config.md)\n  - [RFC-0015: How Cargo \"features\" should be used in the SDK and runtime crates](./rfcs/rfc0015_using_features_responsibly.md)\n  - [RFC-0016: Supporting Flexible Checksums](./rfcs/rfc0016_flexible_checksum_support.md)\n  - [RFC-0017: Customizable Client Operations](./rfcs/rfc0017_customizable_client_operations.md)\n  - [RFC-0018: Logging in the Presence of Sensitive Data](./rfcs/rfc0018_logging_sensitive.md)\n  - [RFC-0019: Event Streams Errors](./rfcs/rfc0019_event_streams_errors.md)\n  - [RFC-0020: Service Builder Improvements](./rfcs/rfc0020_service_builder.md)\n  - [RFC-0021: Dependency Versions](./rfcs/rfc0021_dependency_versions.md)\n  - [RFC-0022: Error Context and Compatibility](./rfcs/rfc0022_error_context_and_compatibility.md)\n  - [RFC-0023: Evolving the new service builder API](./rfcs/rfc0023_refine_builder.md)\n  - [RFC-0024: RequestID](./rfcs/rfc0024_request_id.md)\n  - [RFC-0025: Constraint traits](./rfcs/rfc0025_constraint_traits.md)\n  - [RFC-0026: Client Crate Organization](./rfcs/rfc0026_client_crate_organization.md)\n  - [RFC-0027: Endpoints 2.0](./rfcs/rfc0027_endpoints_20.md)\n  - [RFC-0028: SDK Credential Cache Type Safety](./rfcs/rfc0028_sdk_credential_cache_type_safety.md)\n  - [RFC-0029: Finding New Home for Credential Types](./rfcs/rfc0029_new_home_for_cred_types.md)\n  - [RFC-0030: Serialization And Deserialization](./rfcs/rfc0030_serialization_and_deserialization.md)\n  - [RFC-0031: Providing Fallback Credentials on Timeout](./rfcs/rfc0031_providing_fallback_credentials_on_timeout.md)\n  - [RFC-0032: Better Constraint Violations](./rfcs/rfc0032_better_constraint_violations.md)\n  - [RFC-0033: Improving access to request IDs in SDK clients](./rfcs/rfc0033_improve_sdk_request_id_access.md)\n  - [RFC-0034: Smithy Orchestrator](./rfcs/rfc0034_smithy_orchestrator.md)\n  - [RFC-0035: Collection Defaults](./rfcs/rfc0035_collection_defaults.md)\n  - [RFC-0036: HTTP Dependency Exposure](./rfcs/rfc0036_http_dep_elimination.md)\n  - [RFC-0037: The HTTP Wrapper](./rfcs/rfc0037_http_wrapper.md)\n  - [RFC-0038: User-configurable retry classification](./rfcs/rfc0038_retry_classifier_customization.md)\n  - [RFC-0039: Forward Compatible Errors](./rfcs/rfc0039_forward_compatible_errors.md)\n  - [RFC-0040: Behavior Versions](./rfcs/rfc0040_behavior_versions.md)\n  - [RFC-0041: Improve client error ergonomics](./rfcs/rfc0041_improve_client_error_ergonomics.md)\n  - [RFC-0042: File-per-change changelog](./rfcs/rfc0042_file_per_change_changelog.md)\n  - [RFC-0043: Identity Cache Partitions](./rfcs/rfc0043_identity_cache_partitions.md)\n  - [RFC-0044: Environment-defined service configuration](./rfcs/rfc0044_env_defined_service_config.md)\n  - [RFC-0045: Configurable Serde](./rfcs/rfc0045_configurable_serde.md)\n  - [RFC-0046: Server request metrics](./rfcs/rfc0046_server_request_metrics.md)\n- [Contributing](./contributing/overview.md)\n  - [Writing and debugging a low-level feature that relies on HTTP](./contributing/writing_and_debugging_a_low-level_feature_that_relies_on_HTTP.md)\n"
  },
  {
    "path": "design/src/client/detailed_error_explanations.md",
    "content": "# Detailed Error Explanations\n\nThis page collects detailed explanations for some errors. If you encounter an\nerror and are interested in learning more about what it means and why it occurs,\ncheck here.\n\n**If you can't find the explanation on this page, please file an issue asking\nfor it to be added.**\n\n## \"Connection encountered an issue and should not be re-used. Marking it for closure\"\n\nThe SDK clients each maintain their own connection pool (_except when they share\nan `HttpClient`_). By the convention of some services, when a request fails due\nto a [transient error](#transient-errors), that connection should not be re-used\nfor a retry. Instead, it should be dropped and a new connection created instead.\nThis prevents clients from repeatedly sending requests over a failed connection.\n\nThis feature is referred to as \"connection poisoning\" internally.\n\n## Transient Errors\n\nWhen requests to a service time out, or when a service responds with a 500, 502,\n503, or 504 error, it's considered a 'transient error'. Transient errors are\noften resolved by making another request.\n\nWhen retrying transient errors, the SDKs may avoid re-using connections to\noverloaded or otherwise unavailable service endpoints, choosing instead to\nestablish a new connection. This behavior is referred to internally as\n\"connection poisoning\" and is configurable.\n\nTo configure this behavior, set the [reconnect_mode][reconnect-mode] in an SDK\nclient config's [RetryConfig].\n\n[file an issue]: https://github.com/smithy-lang/smithy-rs/issues/new?assignees=&labels=&projects=&template=blank_issue.md\n[RetryConfig]: https://docs.rs/aws-types/latest/aws_types/sdk_config/struct.RetryConfig.html\n[reconnect-mode]: https://docs.rs/aws-types/latest/aws_types/sdk_config/struct.RetryConfig.html#method.with_reconnect_mode\n"
  },
  {
    "path": "design/src/client/identity_and_auth.md",
    "content": "Identity and Auth in Clients\n============================\n\nThe [Smithy specification establishes several auth related modeling traits] that can be applied to\noperation and service shapes. To briefly summarize:\n\n- The auth schemes that are supported by a service are declared on the service shape\n- Operation shapes MAY specify the subset of service-defined auth schemes they support. If none are specified, then all service-defined auth schemes are supported.\n\nA smithy code generator MUST support at least one auth scheme for every modeled operation, but it need not support ALL modeled auth schemes.\n\nThis design document establishes how smithy-rs implements this specification.\n\nTerminology\n-----------\n\n- **Auth:** Either a shorthand that represents both of the authentication and authorization terms below,\nor an ambiguous representation of one of them. In this doc, this term will always refer to both.\n- **Authentication:** The process of proving an entity is who they claim they are, sometimes referred to as AuthN.\n- **Authorization:** The process of granting an authenticated entity the permission to\ndo something, sometimes referred to as AuthZ.\n- **Identity:** The information required for authentication.\n- **Signing:** The process of attaching metadata to a request that allows a server to authenticate that request.\n\nOverview of Smithy Client Auth\n------------------------------\n\nThere are two stages to identity and auth:\n1. Configuration\n2. Execution\n\n### The configuration stage\n\nFirst, let's establish the aspects of auth that can be configured from the model at codegen time.\n\n- **Data**\n    - **AuthSchemeOptionResolverParams:** parameters required to resolve auth scheme options. These parameters are allowed\n      to come from both the client config and the operation input structs.\n    - **AuthSchemes:** a list of auth schemes that can be used to sign HTTP requests. This information\n      comes directly from the service model.\n    - **AuthSchemeProperties:** configuration from the auth scheme for the signer.\n    - **IdentityResolvers:** list of available identity resolvers.\n- **Implementations**\n    - **IdentityResolver:** resolves an identity for use in authentication.\n      There can be multiple identity resolvers that need to be selected from.\n    - **Signer:** a signing implementation that signs a HTTP request.\n    - **ResolveAuthSchemeOptions:** resolves a list of auth scheme options for a given operation and its inputs.\n\nAs it is undocumented (at time of writing), this document assumes that the code generator\ncreates one service-level runtime plugin, and an operation-level runtime plugin per operation, hence\nreferred to as the service runtime plugin and operation runtime plugin.\n\nThe code generator emits code to add identity resolvers and HTTP auth schemes to the config bag\nin the service runtime plugin. It then emits code to register an interceptor in the operation runtime\nplugin that reads the operation input to generate the auth scheme option resolver params (which also get added\nto the config bag).\n\n### The execution stage\n\nAt a high-level, the process of resolving an identity and signing a request looks as follows:\n\n1. Retrieve the `AuthSchemeOptionResolverParams` from the config bag. The `AuthSchemeOptionResolverParams` allow client\nconfig and operation inputs to play a role in which auth scheme option is selected.\n2. Retrieve the `ResolveAuthSchemeOptions` impl from the config bag, and use it to resolve the auth scheme options available\nwith the `AuthSchemeOptionResolverParams`. The returned auth scheme options are in priority order.\n3. Retrieve the `IdentityResolvers` list from the config bag.\n4. For each auth scheme option:\n   1. Attempt to find an HTTP auth scheme for that auth scheme option in the config bag (from the `AuthSchemes` list).\n   2. If an auth scheme is found:\n      1. Use the auth scheme to extract the correct identity resolver from the `IdentityResolvers` list.\n      2. Retrieve the `Signer` implementation from the auth scheme.\n      3. Use the `IdentityResolver` to resolve the identity needed for signing.\n      4. Sign the request with the identity, and break out of the loop from step #4.\n\nIn general, it is assumed that if an HTTP auth scheme exists for an auth scheme option, then an identity resolver\nalso exists for that auth scheme option. Otherwise, the auth option was configured incorrectly during codegen.\n\nHow this looks in Rust\n----------------------\n\nThe client will use trait objects and dynamic dispatch for the `IdentityResolver`,\n`Signer`, and `AuthSchemeOptionResolver` implementations. Generics could potentially be used,\nbut the number of generic arguments and trait bounds in the orchestrator would balloon to\nunmaintainable levels if each configurable implementation in it was made generic.\n\nThese traits look like this:\n\n```rust,ignore\n#[derive(Clone, Debug)]\npub struct AuthSchemeId {\n    scheme_id: &'static str,\n}\n\npub trait ResolveAuthSchemeOptions: Send + Sync + Debug {\n    fn resolve_auth_scheme_options<'a>(\n        &'a self,\n        params: &AuthSchemeOptionResolverParams,\n    ) -> Result<Cow<'a, [AuthSchemeId]>, BoxError>;\n}\n\npub trait IdentityResolver: Send + Sync + Debug {\n    fn resolve_identity(&self, config: &ConfigBag) -> BoxFallibleFut<Identity>;\n}\n\npub trait Signer: Send + Sync + Debug {\n    /// Return a signed version of the given request using the given identity.\n    ///\n    /// If the provided identity is incompatible with this signer, an error must be returned.\n    fn sign_http_request(\n        &self,\n        request: &mut HttpRequest,\n        identity: &Identity,\n        auth_scheme_endpoint_config: AuthSchemeEndpointConfig<'_>,\n        runtime_components: &RuntimeComponents,\n        config_bag: &ConfigBag,\n    ) -> Result<(), BoxError>;\n}\n```\n\n`IdentityResolver` and `Signer` implementations are both given an `Identity`, but\nwill need to understand what the concrete data type underlying that identity is. The `Identity` struct\nuses a `Arc<dyn Any>` to represent the actual identity data so that generics are not needed in\nthe traits:\n\n```rust,ignore\n#[derive(Clone, Debug)]\npub struct Identity {\n    data: Arc<dyn Any + Send + Sync>,\n    expiration: Option<SystemTime>,\n}\n```\n\nIdentities can often be cached and reused across several requests, which is why the `Identity` uses `Arc`\nrather than `Box`. This also reduces the allocations required. The signer implementations\nwill use downcasting to access the identity data types they understand. For example, with AWS SigV4,\nit might look like the following:\n\n```rust,ignore\nfn sign_http_request(\n    &self,\n    request: &mut HttpRequest,\n    identity: &Identity,\n    auth_scheme_endpoint_config: AuthSchemeEndpointConfig<'_>,\n    runtime_components: &RuntimeComponents,\n    config_bag: &ConfigBag,\n) -> Result<(), BoxError> {\n    let aws_credentials = identity.data::<Credentials>()\n        .ok_or_else(|| \"The SigV4 signer requires AWS credentials\")?;\n    let access_key = &aws_credentials.secret_access_key;\n    // -- snip --\n}\n```\n\nAlso note that identity data structs are expected to censor their own sensitive fields, as\n`Identity` implements the automatically derived `Debug` trait.\n\n### Challenges with this `Identity` design\n\nA keen observer would note that there is an `expiration` field on `Identity`, and may ask, \"what about\nnon-expiring identities?\" This is the result of a limitation on `Box<dyn Any>`, where it can only be\ndowncasted to concrete types. There is no way to downcast to a `dyn Trait` since the information required\nto verify that that type is that trait is lost at compile time (a `std::any::TypeId` only encodes information\nabout the concrete type).\n\nIn an ideal world, it would be possible to extract the expiration like this:\n```rust,ignore\npub trait ExpiringIdentity {\n    fn expiration(&self) -> SystemTime;\n}\n\nlet identity: Identity = some_identity();\nif let Some(expiration) = identity.data::<&dyn ExpiringIdentity>().map(ExpiringIdentity::expiration) {\n    // make a decision based on that expiration\n}\n```\n\nTheoretically, you should be able to save off additional type information alongside the `Box<dyn Any>` and use\nunsafe code to transmute to known traits, but it is difficult to implement in practice, and adds unsafe code\nin a security critical piece of code that could otherwise be avoided.\n\nThe `expiration` field is a special case that is allowed onto the `Identity` struct directly since identity\ncache implementations will always need to be aware of this piece of information, and having it as an `Option`\nstill allows for non-expiring identities.\n\nUltimately, this design constrains `Signer` implementations to concrete types. There is no world\nwhere an `Signer` can operate across multiple unknown identity data types via trait, and that\nshould be OK since the signer implementation can always be wrapped with an implementation that is aware\nof the concrete type provided by the identity resolver, and can do any necessary conversions.\n\n[Smithy specification establishes several auth related modeling traits]: https://smithy.io/2.0/spec/authentication-traits.html\n"
  },
  {
    "path": "design/src/client/orchestrator.md",
    "content": "## What is the orchestrator?\n\nAt a very high level, an orchestrator is a process for transforming requests into responses. Please enjoy this fancy chart:\n\n```mermaid\nflowchart TB\n\tA(Orchestrate)-->|Input|B(Request serialization)\n\tB-->|Transmit Request|C(Connection)\n\tC-->|Transmit Response|D(Response deserialization)\n\tD-->|Success|E(\"Ok(Output)\")\n\tD-->|Unretryable Failure|F(\"Err(SdkError)\")\n\tD-->|Retryable Failure|C\n```\n\nThis process is also referred to as the \"request/response lifecycle.\" In this example, the types of \"transmit request\" and \"transmit response\" are protocol-dependent. Typical operations use [HTTP], but we plan to support other protocols like [MQTT] in the future.\n\nIn addition to the above steps, the orchestrator must also handle:\n\n- **Endpoint resolution:** figuring out which URL to send a request to.\n- **Authentication, identity resolution, and request signing:** Figuring out who is sending the request, their credentials, and how we should insert the credentials into a request.\n- **Interceptors**: Running lifecycle hooks at each point in the request/response lifecycle.\n- **Runtime Plugins:** Resolving configuration from config builders.\n- **Retries:** Categorizing responses from services and deciding whether to retry and how long to wait before doing so.\n- **Trace Probes:** A [sink] for events that occur during the request/response lifecycle.\n\n## How is an orchestrator configured?\n\nWhile the structure of an orchestrator is fixed, the actions it takes during its lifecycle are highly configurable. Users have two ways to configure this process:\n\n- **Runtime Plugins**:\n    - **When can these be set?** Any time before calling `orchestrate`.\n    - **When are they called by the orchestrator?** In two batches, at the very beginning of `orchestrate`.\n    - **What can they do?**\n        - They can set configuration to be used by the orchestrator or in interceptors.\n        - They can set interceptors.\n    - **Are they user-definable?** No. At present, only smithy-rs maintainers may define these.\n- **Interceptors**:\n    - **When can these be set?** Any time before calling `orchestrate`.\n    - **When are they called by the orchestrator?** At each step in the request-response lifecycle.\n    - **What can they do?**\n        - They can set configuration to be used by the orchestrator or in interceptors.\n        - They can log information.\n        - Depending on when they're run, they can modify the input, transmit request, transmit response, and the output/error.\n    - **Are they user-definable?** Yes.\n\nConfiguration for a request is constructed by runtime plugins just after calling `orchestrate`. Configuration is stored in a `ConfigBag`: a hash map that's keyed on type's [`TypeId`][TypeId] (an opaque object, managed by the Rust compiler, which references some type.)\n\n## What does the orchestrator do?\n\nThe orchestrator's work is divided into four phases:\n\n*NOTE: If an interceptor fails, then the other interceptors for that lifecycle event are still run. All resulting errors are collected and emitted together.*\n\n0. **Building the `ConfigBag` and mounting interceptors**.\n    - *This phase is fallible.*\n    - An interceptor context is created. This will hold request and response objects, making them available to interceptors.\n    - All runtime plugins set at the client-level are run. These plugins can set config and mount interceptors. Any _\"read before execution\"_ interceptors that have been set get run.\n    - All runtime plugins set at the operation-level are run. These plugins can also set config and mount interceptors. Any new _\"read before execution\"_ interceptors that have been set get run.\n1. **Request Construction**\n    - *This phase is fallible.*\n    - The _\"read before serialization\"_ and _\"modify before serialization\"_ interceptors are called.\n    - The input is serialized into a transmit request.\n    -  The _\"read after serialization\"_ and _\"modify before retry_ loop\" interceptors are called.\n    - Before making an attempt, the retry handler is called to check if an attempt should be made. The retry handler makes this decision for an initial attempt as well as for the retry attempts. If an initial attempt should be made, then the orchestrator enters the Dispatch phase. Otherwise, a throttling error is returned.\n2. **Request Dispatch**\n    - *This phase is fallible. This phase's tasks are performed in a loop. Retryable request failures will be retried, and unretryable failures will end the loop.*\n    - The _\"read before attempt\"_ interceptors are run.\n    - An endpoint is resolved according to an endpoint resolver. The resolved endpoint is then applied to the transmit request.\n    - The _\"read before signing\"_ and _\"modify before signing\"_ interceptors are run.\n    - An identity and a signer are resolved according to an authentication resolver. The signer then signs the transmit request with the identity.\n    - The _\"read after signing\"_, _\"read before transmit\"_, and _\"modify before transmit\"_ interceptors are run.\n    - The transmit request is passed into the connection, and a transmit response is received.\n    - The _\"read after transmit\"_, _\"read before deserialization\"_, and _\"modify before deserialization\"_ interceptors are run.\n    - The transmit response is deserialized.\n    - The _\"read after attempt\"_ and _\"modify before attempt_ completion\" interceptors are run.\n    - The retry strategy is called to check if a retry is necessary. If a retry is required, the Dispatch phase restarts. Otherwise, the orchestrator enters the Response Handling phase.\n3. **Response Handling**\n    - *This phase is fallible.*\n    - The _\"read after deserialization\"_ and _\"modify before completion\"_ interceptors are run.\n    - Events are dispatched to any trace probes that the user has set.\n    - The _\"read after execution\"_ interceptors are run.\n\nAt the end of all this, the response is returned. If an error occurred at any point, then the response will contain one or more errors, depending on what failed. Otherwise, the output will be returned.\n\n## How is the orchestrator implemented in Rust?\n\n### Avoiding generics at all costs\n\nIn designing the orchestrator, we sought to solve the problems we had with the original smithy client. The client made heavy use of generics, allowing for increased performance, but at the cost of increased maintenance burden and [increased compile times][monomorphization]. The Rust compiler, usually very helpful, isn't well-equipped to explain trait errors when bounds are this complex, and so the resulting client was difficult to extend. [Trait aliases] would have helped, but they're not (at the time of writing) available.\n\n*The type signatures for the old client and its `call` method:*\n\n```rust,ignore\nimpl<C, M, R> Client<C, M, R>\nwhere\n    C: bounds::SmithyConnector,\n    M: bounds::SmithyMiddleware<C>,\n    R: retry::NewRequestPolicy,\n{\n    pub async fn call<O, T, E, Retry>(&self, op: Operation<O, Retry>) -> Result<T, SdkError<E>>\n        where\n            O: Send + Sync,\n            E: std::error::Error + Send + Sync + 'static,\n            Retry: Send + Sync,\n            R::Policy: bounds::SmithyRetryPolicy<O, T, E, Retry>,\n            Retry: ClassifyRetry<SdkSuccess<T>, SdkError<E>>,\n            bounds::Parsed<<M as bounds::SmithyMiddleware<C>>::Service, O, Retry>:\n            Service<Operation<O, Retry>, Response=SdkSuccess<T>, Error=SdkError<E>> + Clone,\n    {\n        self.call_raw(op).await.map(|res| res.parsed)\n    }\n\n    pub async fn call_raw<O, T, E, Retry>(\n        &self,\n        op: Operation<O, Retry>,\n    ) -> Result<SdkSuccess<T>, SdkError<E>>\n        where\n            O: Send + Sync,\n            E: std::error::Error + Send + Sync + 'static,\n            Retry: Send + Sync,\n            R::Policy: bounds::SmithyRetryPolicy<O, T, E, Retry>,\n            Retry: ClassifyRetry<SdkSuccess<T>, SdkError<E>>,\n        // This bound is not _technically_ inferred by all the previous bounds, but in practice it\n        // is because _we_ know that there is only implementation of Service for Parsed\n        // (ParsedResponseService), and it will apply as long as the bounds on C, M, and R hold,\n        // and will produce (as expected) Response = SdkSuccess<T>, Error = SdkError<E>. But Rust\n        // doesn't know that -- there _could_ theoretically be other implementations of Service for\n        // Parsed that don't return those same types. So, we must give the bound.\n            bounds::Parsed<<M as bounds::SmithyMiddleware<C>>::Service, O, Retry>:\n            Service<Operation<O, Retry>, Response=SdkSuccess<T>, Error=SdkError<E>> + Clone,\n    {\n        // The request/response lifecycle\n    }\n}\n```\n\n*The type signature for the new `orchestrate` method:*\n\n```rust,ignore\npub async fn orchestrate(\n    input: Input,\n    runtime_plugins: &RuntimePlugins,\n    // Currently, SdkError is HTTP-only. We currently use it for backwards-compatibility purposes.\n    // The `HttpResponse` generic will likely be removed in the future.\n) -> Result<Output, SdkError<Error, HttpResponse>> {\n\t// The request/response lifecycle\n}\n```\n\nWait a second, I hear you ask. \"I see an `Input` and `Output` there, but you're not declaring any generic type arguments. What gives?\"\n\nI'm glad you asked. Generally, when you need traits, but you aren't willing to use generic type arguments, then you must [`Box`][std::boxed]. Polymorphism is achieved through [dynamic dispatch] instead of [static dispatch], and this comes with a small runtime cost.\n\nSo, what are `Input` and `Output`? They're our own special flavor of a boxed trait object.\n\n```rust,ignore\npub type Input = TypeErasedBox;\npub type Output = TypeErasedBox;\npub type Error = TypeErasedBox;\n\n/// A new-type around `Box<dyn Any + Send + Sync>`\n#[derive(Debug)]\npub struct TypeErasedBox {\n    inner: Box<dyn Any + Send + Sync>,\n}\n```\n\nThe orchestrator itself doesn't know about any concrete types. Instead, it passes boxed data between the various components of the request/response lifecycle. Individual components access data in two ways:\n\n1. **From the `ConfigBag`:**\n  - *(with an accessor)* `let retry_strategy = cfg.retry_strategy();`\n  - *(with the get method)* `let retry_strategy = cfg.get::<Box<dyn RetryStrategy>>()`\n2. **From the `InterceptorContext`:**\n  - *(owned)* `let put_object_input: PutObjectInput = ctx.take_input().unwrap().downcast().unwrap()?;`\n  - *(by reference)* `let put_object_input = ctx.input().unwrap().downcast_ref::<PutObjectInput>().unwrap();`\n\nUsers can only call `ConfigBag::get` or [downcast] a `TypeErasedBox` to types they have access to, which allows maintainers to ensure encapsulation. For example: a plugin writer may declare a private type, place it in the config bag, and then later retrieve it. Because the type is private, only code in the same crate/module can ever insert or retrieve it. Therefore, there's less worry that someone will depend on a hidden, internal detail and no worry they'll accidentally overwrite a type in the bag.\n\n> *NOTE: When inserting values into a config bag, using one of the `set_<component>` methods is always preferred, as this prevents mistakes related to inserting similar, but incorrect types.*\n\n### The actual code\n\nThe current implementation of `orchestrate` is defined [here][orchestrate-impl], in the [`aws-smithy-runtime` crate][aws-smithy-runtime]. Related code can be found in the [`aws-smithy-runtime-api` crate][aws-smithy-runtime].\n\n## Frequently asked questions\n\n### Why can't users create and use their own runtime plugins?\n\nWe chose to hide the runtime plugin API from users because we are concerned that exposing it will cause more problems than it solves. Instead, we encourage users to use interceptors. This is because, when setting a runtime plugin, any existing runtime plugin with the same type will be replaced. For example, there can only be one retry strategy or response deserializer. Errors resulting from unintentionally overriding a plugin would be difficult for users to diagnose, and would consume valuable development time.\n\n### Why does the orchestrator exist?\n\nThe orchestrator exists because there is an AWS-internal initiative to bring the architecture of all AWS SDKs closer to one another.\n\n### Why does this document exist when there's already an orchestrator RFC?\n\nBecause RFCs become outdated as designs evolve. It is our intention to keep this document up to date with our current implementation.\n\n[HTTP]: https://en.wikipedia.org/wiki/HTTP\n[MQTT]: https://en.wikipedia.org/wiki/MQTT\n[sink]: https://en.wikipedia.org/wiki/Sink_(computing)\n[trait aliases]: https://github.com/rust-lang/rust/issues/41517\n[std::boxed]: https://doc.rust-lang.org/std/boxed/index.html\n[monomorphization]: https://rustc-dev-guide.rust-lang.org/backend/monomorph.html#polymorphization\n[static dispatch]: https://doc.rust-lang.org/book/ch10-01-syntax.html#performance-of-code-using-generics\n[dynamic dispatch]: https://doc.rust-lang.org/book/ch17-02-trait-objects.html#trait-objects-perform-dynamic-dispatch\n[TypeId]: https://doc.rust-lang.org/stable/std/any/struct.TypeId.html\n[downcast]: https://en.wikipedia.org/wiki/Downcasting\n[orchestrate-impl]: https://github.com/smithy-lang/smithy-rs/blob/8bc93fc04dd8c8d7447bfe3f5196a75cba0b10ba/rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs#L23\n[aws-smithy-runtime]: https://github.com/smithy-lang/smithy-rs/tree/main/rust-runtime/aws-smithy-runtime\n[aws-smithy-runtime-api]: https://github.com/smithy-lang/smithy-rs/tree/main/rust-runtime/aws-smithy-runtime-api\n"
  },
  {
    "path": "design/src/client/overview.md",
    "content": "# Smithy Client\n\n`smithy-rs` provides the ability to generate a client whose operations defined by a smithy model. The documents referenced\nhere explain aspects of the client in greater detail.\n\n- [What is the 'orchestrator' and why does it exist?](./orchestrator.md)\n- [Identity and Auth](./identity_and_auth.md)\n"
  },
  {
    "path": "design/src/contributing/overview.md",
    "content": "# Contributing\n\nThis is a collection of written resources for smithy-rs and SDK contributors.\n\n- [Writing and debugging a low-level feature that relies on HTTP](./contributing/writing_and_debugging_a_low-level_feature_that_relies_on_HTTP.md)\n"
  },
  {
    "path": "design/src/contributing/writing_and_debugging_a_low-level_feature_that_relies_on_HTTP.md",
    "content": "# Writing and debugging a low-level feature that relies on HTTP\n\n## Background\n\nThis article came about as a result of all the difficulties I encountered while developing the request checksums feature\nlaid out in the internal-only Flexible Checksums spec _(the feature is also highlighted in [this public blog post][S3 Flexible Checksums].)_\nI spent much more time developing the feature than I had anticipated. In this article, I'll talk about:\n\n- How the SDK sends requests with a body\n- How the SDK sends requests with a streaming body\n- The various issues I encountered and how I addressed them\n- Key takeaways for contributors developing similar low-level features\n\n## How the SDK sends requests with a body\n\nAll interactions between the SDK and a service are modeled as [\"operations\"][HTTP-based operations]. Operations contain:\n\n- A base HTTP request (with a potentially streaming body)\n- A typed property bag of configuration options\n- A fully generic response handler\n\nUsers create operations piecemeal with a fluent builder. The options set in the builder are then used to create the\ninner HTTP request, becoming headers or triggering specific request-building functionality (In this case, calculating a\nchecksum and attaching it either as a header or a trailer.)\n\nHere's [an example from the QLDB SDK of creating a body] from inputs and inserting it into the request to be sent:\n\n```rust,ignore\nlet body = aws_smithy_http::body::SdkBody::from(\n    crate::operation_ser::serialize_operation_crate_operation_send_command(&self)?,\n);\n\nif let Some(content_length) = body.content_length() {\n    request = aws_smithy_http::header::set_request_header_if_absent(\n        request,\n        http::header::CONTENT_LENGTH,\n        content_length,\n    );\n}\nlet request = request.body(body).expect(\"should be valid request\");\n```\n\nMost all request body creation in the SDKs looks like that. Note how it automatically sets the `Content-Length` header\nwhenever the size of the body is known; It'll be relevant later. The body is read into memory and can be inspected\nbefore the request is sent. This allows for things like calculating a checksum and then inserting it into the request\nas a header.\n\n## How the SDK sends requests with a streaming body\n\nOften, sending a request with a streaming body looks much the same. However, it's not possible to read a streaming\nbody until you've sent the request. Any metadata that needs to be calculated by inspecting the body must be sent as\ntrailers. Additionally, some metadata, like `Content-Length`, can't be sent as a trailer at all.\n[MDN maintains a helpful list] of metadata that can only be sent as a header.\n\n```rust,ignore\n// When trailers are set, we must send an AWS-specific header that lists them named `x-amz-trailer`.\n// For example, when sending a SHA256 checksum as a trailer,\n// we have to send an `x-amz-trailer` header telling the service to watch out for it:\nrequest\n    .headers_mut()\n    .insert(\n        http::header::HeaderName::from_static(\"x-amz-trailer\"),\n        http::header::HeaderValue::from_static(\"x-amz-checksum-sha256\"),\n    );\n```\n\n## The issues I encountered while implementing checksums for streaming request bodies\n\n### `Content-Encoding: aws-chunked`\n\nWhen sending a request body with trailers, we must use an AWS-specific content encoding called `aws-chunked`. To encode\na request body for `aws-chunked` requires us to know the length of each chunk we're going to send before we send it. We\nhave to prefix each chunk with its size in bytes, represented by one or more [hexadecimal] digits. To close the body, we\nsend a final chunk with a zero. For example, the body \"Hello world\" would look like this when encoded:\n\n```text\nB\\r\\n\nHello world\\r\\n\n0\\r\\n\n```\n\nWhen sending a request body encoded in this way, we need to set two length headers:\n\n- `Content-Length` is the length of the entire request body, including the chunk size prefix and zero terminator. In the\n  example above, this would be 19.\n- `x-amz-decoded-content-length` is the length of the decoded request body. In the example above, this would be 11.\n\n_**NOTE:** [`Content-Encoding`][Content-Encoding] is distinct from [`Transfer-Encoding`][Transfer-Encoding]. It's possible to\nconstruct a request with both `Content-Encoding: chunked` AND `Transfer-Encoding: chunked`, although we don't ever need\nto do that for SDK requests._\n\n### S3 requires a `Content-Length` unless you also set `Transfer-Encoding: chunked`\n\nS3 does not require you to send a `Content-Length` header if you set the `Transfer-Encoding: chunked` header. That's\nvery helpful because it's not always possible to know the total length of a stream of bytes if that's what you're\nconstructing your request body from. However, when sending trailers, this part of the spec can be misleading.\n\n1. When sending a streaming request, we must send metadata like checksums as trailers\n2. To send a request body with trailers, we must set the `Content-Encoding: aws-chunked` header\n3. When using `aws-chunked` encoding for a request body, we must set the `x-amz-decoded-content-length` header with the\n   pre-encoding length of the request body.\n\nThis means that we can't actually avoid having to know and specify the length of the request body when sending a request\nto S3. This turns out to not be much of a problem for common use of the SDKs because most streaming request bodies are\nconstructed from files. In these cases we can ask the operating system for the file size before sending the request. So\nlong as that size doesn't change during sending of the request, all is well. In any other case, the request will fail.\n\n### Adding trailers to a request changes the size of that request\n\nHeaders don't count towards the size of a request body, but trailers do. That means we need to take trailers (which\naren't sent until after the body) into account when setting the `Content-Length` header (which are sent before the\nbody.) This means that without setting `Transfer-Encoding: chunked`, the SDKs only support trailers of known length.\nIn the case of checksums, we're lucky because they're always going to be the same size. We must also take into account\nthe fact that checksum values are base64 encoded before being set (this lengthens them.)\n\n### `hyper` supports HTTP request trailers but isn't compatible with `Content-Encoding: aws-chunked`\n\nThis was a big source of confusion for me, and I only figured out what was happening with the help of [@seanmonstar].\nWhen using `aws-chunked` encoding, the trailers have to be appended to the body as part of `poll_data` instead of\nrelying on the `poll_trailers` method. The working `http_body::Body` implementation of an `aws-chunked` encoded body\nlooked like this:\n\n```rust,ignore\nimpl Body for AwsChunkedBody<Inner> {\n    type Data = Bytes;\n    type Error = aws_smithy_http::body::Error;\n\n    fn poll_data(\n        self: Pin<&mut Self>,\n        cx: &mut Context<'_>,\n    ) -> Poll<Option<Result<Self::Data, Self::Error>>> {\n        let this = self.project();\n        if *this.already_wrote_trailers {\n            return Poll::Ready(None);\n        }\n\n        if *this.already_wrote_chunk_terminator {\n            return match this.inner.poll_trailers(cx) {\n                Poll::Ready(Ok(trailers)) => {\n                    *this.already_wrote_trailers = true;\n                    let total_length_of_trailers_in_bytes = this.options.trailer_lens.iter().sum();\n\n                    Poll::Ready(Some(Ok(trailers_as_aws_chunked_bytes(\n                        total_length_of_trailers_in_bytes,\n                        trailers,\n                    ))))\n                }\n                Poll::Pending => Poll::Pending,\n                Poll::Ready(err) => Poll::Ready(Some(err)),\n            };\n        };\n\n        match this.inner.poll_data(cx) {\n            Poll::Ready(Some(Ok(mut data))) => {\n                let bytes = if *this.already_wrote_chunk_size_prefix {\n                    data.copy_to_bytes(data.len())\n                } else {\n                    // A chunk must be prefixed by chunk size in hexadecimal\n                    *this.already_wrote_chunk_size_prefix = true;\n                    let total_chunk_size = this\n                        .options\n                        .chunk_length\n                        .or(this.options.stream_length)\n                        .unwrap_or_default();\n                    prefix_with_total_chunk_size(data, total_chunk_size)\n                };\n\n                Poll::Ready(Some(Ok(bytes)))\n            }\n            Poll::Ready(None) => {\n                *this.already_wrote_chunk_terminator = true;\n                Poll::Ready(Some(Ok(Bytes::from(\"\\r\\n0\\r\\n\"))))\n            }\n            Poll::Ready(Some(Err(e))) => Poll::Ready(Some(Err(e))),\n            Poll::Pending => Poll::Pending,\n        }\n    }\n\n    fn poll_trailers(\n        self: Pin<&mut Self>,\n        _cx: &mut Context<'_>,\n    ) -> Poll<Result<Option<HeaderMap<HeaderValue>>, Self::Error>> {\n        // When using aws-chunked content encoding, trailers have to be appended to the body\n        Poll::Ready(Ok(None))\n    }\n\n    fn is_end_stream(&self) -> bool {\n        self.already_wrote_trailers\n    }\n\n    fn size_hint(&self) -> SizeHint {\n        SizeHint::with_exact(\n            self.encoded_length()\n                .expect(\"Requests made with aws-chunked encoding must have known size\")\n                as u64,\n        )\n    }\n}\n```\n\n### \"The stream is closing early, and I don't know why\"\n\nIn my early implementation of `http_body::Body` for an `aws-chunked` encoded body, the body wasn't being completely read\nout. The problem turned out to be that I was delegating to the `is_end_stream` trait method of the inner body. Because\nthe innermost body had no knowledge of the trailers I needed to send, it was reporting that the stream had ended.\nThe fix was to instead rely on the outermost body's knowledge of its own state in order to determine if all data had\nbeen read.\n\n## What helped me to understand the problems and their solutions\n\n- **Reaching out to others that had specific knowledge of a problem:** Talking to a developer that had tackled this\n  feature for another SDK was a big help. Special thanks is due to [@jasdel] and the Go v2 SDK team.\n  [Their implementation][Go v2 SDK newUnsignedAWSChunkedEncoding] of an `aws-chunked` encoded body was the basis for\n  my own implementation.\n- **Avoiding codegen**: The process of updating codegen code and then running codegen for each new change you make is\n  slow compared to running codegen once at the beginning of development and then just manually editing the generated SDK\n  as necessary. I still needed to run `./gradlew :aws:sdk:relocateAwsRuntime :aws:sdk:relocateRuntime` whenever I made\n  changes to a runtime crate but that was quick because it's just copying the files. Keep as much code out of codegen as\n  possible. It's much easier to modify/debug Rust than it is to write a working codegen module that does the same thing.\n  Whenever possible, write the codegen modules later, once the design has settled.\n- **Using the `Display` impl for errors:** The `Display` impl for an error can ofter contain helpful info that might not\n  be visible when printing with the `Debug` impl. Case in point was an error I was getting because of the\n  `is_end_stream` issue. When `Debug` printed, the error looked like this:\n\n  ```rust,ignore\n  DispatchFailure(ConnectorError { err: hyper::Error(User(Body), hyper::Error(BodyWriteAborted)), kind: User })\n  ```\n\n  That wasn't too helpful for me on its own. I looked into the `hyper` source code and found that the `Display` impl\n  contained a helpful message, so I matched into the error and printed the `hyper::Error` with the `Display` impl:\n\n  ```markdown\n  user body write aborted: early end, expected 2 more bytes'\n  ```\n\n  This helped me understand that I wasn't encoding things correctly and was missing a CRLF.\n\n- **Echo Server**: I first used netcat and then later a small echo server written in Rust to see the raw HTTP request\n  being sent out by the SDK as I was working on it. The Rust SDK supports setting endpoints for request. This is often\n  used to send requests to something like [LocalStack], but I used it to send request to `localhost` instead:\n\n  ```rust,ignore\n  #[tokio::test]\n  async fn test_checksum_on_streaming_request_against_s3() {\n      let sdk_config = aws_config::from_env()\n          .endpoint_resolver(Endpoint::immutable(\"http://localhost:8080\".parse().expect(\"valid URI\")))\n          .load().await;\n      let s3_client = aws_sdk_s3::Client::new(&sdk_config);\n\n      let input_text = b\"Hello world\";\n      let _res = s3_client\n          .put_object()\n          .bucket(\"some-real-bucket\")\n          .key(\"test.txt\")\n          .body(aws_sdk_s3::types::ByteStream::from_static(input_text))\n          .checksum_algorithm(ChecksumAlgorithm::Sha256)\n          .send()\n          .await\n          .unwrap();\n  }\n  ```\n\n  The echo server was based off of an [axum] example and looked like this:\n\n  ```rust,ignore\n  use axum::{\n    body::{Body, Bytes},\n    http::{request::Parts, Request, StatusCode},\n    middleware::{self, Next},\n    response::IntoResponse,\n    routing::put,\n    Router,\n  };\n  use std::net::SocketAddr;\n  use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt};\n\n  #[tokio::main]\n  async fn main() {\n    tracing_subscriber::registry().with(tracing_subscriber::EnvFilter::new(\n      std::env::var(\"RUST_LOG\").unwrap_or_else(|_| \"trace\".into()),\n    ))\n    .with(tracing_subscriber::fmt::layer())\n    .init();\n\n    let app = Router::new()\n        .route(\"/\", put(|| async move { \"200 OK\" }))\n        .layer(middleware::from_fn(print_request_response));\n\n    let addr = SocketAddr::from(([127, 0, 0, 1], 3000));\n    tracing::debug!(\"listening on {}\", addr);\n    axum::Server::bind(&addr)\n        .serve(app.into_make_service())\n        .await\n        .unwrap();\n  }\n\n  async fn print_request_response(\n    req: Request<Body>,\n    next: Next<Body>,\n  ) -> Result<impl IntoResponse, (StatusCode, String)> {\n      let (parts, body) = req.into_parts();\n\n      print_parts(&parts).await;\n      let bytes = buffer_and_print(\"request\", body).await?;\n      let req = Request::from_parts(parts, Body::from(bytes));\n\n      let res = next.run(req).await;\n\n      Ok(res)\n  }\n\n  async fn print_parts(parts: &Parts) {\n      tracing::debug!(\"{:#?}\", parts);\n  }\n\n  async fn buffer_and_print<B>(direction: &str, body: B) -> Result<Bytes, (StatusCode, String)>\n  where\n    B: axum::body::HttpBody<Data = Bytes>,\n    B::Error: std::fmt::Display,\n  {\n      let bytes = match hyper::body::to_bytes(body).await {\n          Ok(bytes) => bytes,\n          Err(err) => {\n              return Err((\n                  StatusCode::BAD_REQUEST,\n                  format!(\"failed to read {} body: {}\", direction, err),\n              ));\n          }\n      };\n\n      if let Ok(body) = std::str::from_utf8(&bytes) {\n          tracing::debug!(\"{} body = {:?}\", direction, body);\n      }\n\n      Ok(bytes)\n  }\n  ```\n  ##\n\n[S3 Flexible Checksums]: https://aws.amazon.com/blogs/aws/new-additional-checksum-algorithms-for-amazon-s3/\n[hyper::error::User::BodyWriteAborted]: https://github.com/hyperium/hyper/blob/740654e55d2bb2f50709f20fb4054a5504d8c2fb/src/error.rs#L98\n[HTTP-based operations]: ../transport/operation.md\n[an example from the QLDB SDK of creating a body]: https://github.com/awslabs/aws-sdk-rust/blob/1bdfba7f53e77a478f60a1a387e4d9d31fd918fc/sdk/qldbsession/src/input.rs#L197\n[MDN maintains a helpful list]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Trailer#directives\n[hexadecimal]: https://en.wikipedia.org/wiki/Hexadecimal\n[Content-Encoding]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Encoding\n[Transfer-Encoding]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Transfer-Encoding\n[Go v2 SDK newUnsignedAWSChunkedEncoding]: https://github.com/aws/aws-sdk-go-v2/blob/c214cb61990441aa165e216a3f7e845c50d21939/service/internal/checksum/aws_chunked_encoding.go#L90\n[@seanmonstar]: https://github.com/seanmonstar\n[@jasdel]: https://github.com/jasdel\n[LocalStack]: https://localstack.cloud/\n[axum]: https://github.com/tokio-rs/axum\n](writing_and_debugging_a_low-level_feature_that_relies_on_HTTP.md)\n"
  },
  {
    "path": "design/src/faq.md",
    "content": "# Design FAQ\n\n## What is Smithy?\n\nSmithy is the interface design language used by AWS services. `smithy-rs` allows users to generate a Rust client for any\nSmithy based service (pending protocol support), including those outside of AWS.\n\n## Why is there one crate per service?\n\n1. **Compilation time:** Although it's possible to use cargo features to conditionally compile individual services, we\n   decided that this added significant complexity to the generated code. In Rust the \"unit of compilation\" is a Crate,\n   so by using smaller crates we can get better compilation parallelism. Furthermore, ecosystem services like `docs.rs`\n   have an upper limit on the maximum amount of time required to build an individual crate—if we packaged the entire SDK\n   as a single crate, we would quickly exceed this limit.\n\n2. **Versioning:** It is expected that over time we may major-version-bump individual services. New updates will be pushed\n   for _some_ AWS service nearly every day. Maintaining separate crates allows us to only increment versions for the\n   relevant pieces that change. See [Independent Crate Versioning](./rfcs/rfc0012_independent_crate_versioning.md) for\n   more info.\n\n## Why don't the SDK service crates implement `serde::Serialize` or `serde::Deserialize` for any types?\n\n1. **Compilation time:** `serde` makes heavy use of [several crates](https://crates.io/crates/serde_derive/1.0.136/dependencies)\n   *(`proc-macro2`, `quote`, and `syn`)* that are very expensive to compile. Several service crates are already quite large\n   and adding a `serde` dependency would increase compile times beyond what we consider acceptable. When we last checked,\n   adding `serde` derives made compilation 23% slower.\n\n2. **Misleading results:** We can't use `serde` for serializing requests to AWS or deserializing responses from AWS because\n   both sides of that process would require too much customization. Adding serialize/deserialize impls for operations has\n   the potential to confuse users when they find it doesn't actually capture all the necessary information (like headers and\n   trailers) sent in a request or received in a response.\n\nIn the future, we may add `serde` support behind a feature gate. However, we would only support this for operation `Input`\nand `Output` structs with the aim of making SDK-related tests easier to set up and run.\n\n## I want to add new request building behavior. Should I add that functionality to the `make_operation` codegen or write a request-altering middleware?\n\nThe main question to ask yourself in this case is _\"is this new behavior relevant to all services or is it only relevant to some services?\"_\n\n- **If the behavior is relevant to all services:** Behavior like this should be defined as a middleware. Behavior like this is often AWS-specific and may not be relevant to non-AWS smithy clients. Middlewares are defined outside of codegen. One example of behavior that should be defined as a middleware is request signing because all requests to AWS services must be signed.\n- **If the behavior is only relevant to some services/depends on service model specifics:** Behavior like this should be defined within `make_operation`. Avoid defining AWS-specific behavior within `make_operation`. One example of behavior that should be defined in `make_operation` is checksum validation because only some AWS services have APIs that support checksum validation.\n\n_\"Wait a second\"_ I hear you say, _\"checksum validation is part of the AWS smithy spec, not the core smithy spec. Why is that behavior defined in `make_operation`?\"_ The answer is that that feature only applies to some operations and we don't want to codegen a middleware that only supports a subset of operations for a service.\n"
  },
  {
    "path": "design/src/overview.md",
    "content": "# Design Overview\n\nThe AWS Rust SDK aims to provide an official, high quality & complete interface to AWS services. We plan to eventually use the CRT to provide signing & credential management. The Rust SDK will provide first-class support for the CRT as well as [Tokio ](https://tokio.rs/) & [Hyper](https://hyper.rs). The Rust SDK empowers advanced customers to bring their own HTTP/IO implementations.\n\nOur design choices are guided by our [Tenets](./tenets.md).\n\n## Acknowledgments\n\nThe design builds on the learnings, ideas, hard work, and GitHub issues of the 142 Rusoto contributors & thousands of users who built this first and learned the hard way.\n\n## External API Overview\n\nThe Rust SDK is \"modular\" meaning that each AWS service is its own crate. Each crate provides two layers to access the service:\n1. The \"fluent\" API. For most use cases, a high level API that ties together connection management and serialization will be the quickest path to success.\n\n```rust,ignore\n#[tokio::main]\nasync fn main() {\n    let client = dynamodb::Client::from_env();\n    let tables = client\n        .list_tables()\n        .limit(10)\n        .send()\n        .await.expect(\"failed to load tables\");\n}\n```\n\n2. The \"low-level\" API: It is also possible for customers to assemble the pieces themselves. This offers more control over operation construction & dispatch semantics:\n\n```rust,ignore\n#[tokio::main]\nasync fn main() {\n    let conf = dynamodb::Config::builder().build();\n    let conn = aws_hyper::Client::https();\n    let operation = dynamodb::ListTables::builder()\n        .limit(10)\n        .build(&conf)\n        .expect(\"invalid operation\");\n    let tables = conn.call(operation).await.expect(\"failed to list tables\");\n}\n```\n\nThe Fluent API is implemented as a thin wrapper around the core API to improve ergonomics.\n\n## Internals\nThe Rust SDK is built on Tower Middleware, Tokio & Hyper. We're continuing to iterate on the internals to enable running the AWS SDK in other executors & HTTP stacks. As an example, you can see a demo of adding `reqwest` as a custom HTTP stack to gain access to its HTTP Proxy support!\n\nFor more details about the SDK internals see [Operation Design](transport/operation.md)\n\n## Code Generation\nThe Rust SDK is code generated from Smithy models, using Smithy codegeneration utilities. The Code generation is written in Kotlin. More details can be found in the [Smithy](./smithy/overview.md) section.\n"
  },
  {
    "path": "design/src/rfcs/overview.md",
    "content": "# RFCs\n\n**What is an RFC?:** An RFC is a document that proposes a change to `smithy-rs` or the AWS Rust SDK. Request for Comments means a request for discussion and oversight about the future of the project from maintainers, contributors and users.\n\n**When should I write an RFC?:** The AWS Rust SDK team proactively decides to write RFCs for major features or complex changes that we feel require extra scrutiny. However, the process can be used to request feedback on any change. Even changes that seem obvious and simple at first glance can be improved once a group of interested and experienced people have a chance to weigh in.\n\n**Who can submit an RFC?:** An RFC can be submitted by anyone. In most cases, RFCs are authored by SDK maintainers, but everyone is welcome to submit RFCs.\n\n**Where do I start?:** If you're ready to write and submit an RFC, please start a GitHub discussion with a summary of what you're trying to accomplish first. That way, the AWS Rust SDK team can ensure they have the bandwidth to review and shepherd the RFC through the whole process before you've expended effort in writing it. Once you've gotten the go-ahead, start with the [RFC template](./rfc_template.md).\n\n## Previously Submitted RFCs\n\n- [RFC-0001: AWS Configuration](./rfc0001_shared_config.md)\n- [RFC-0002: Supporting multiple HTTP versions for SDKs that use Event Stream](./rfc0002_http_versions.md)\n- [RFC-0003: API for Presigned URLs](./rfc0003_presigning_api.md)\n- [RFC-0004: Retry Behavior](./rfc0004_retry_behavior.md)\n- [RFC-0005: Service Generation](./rfc0005_service_generation.md)\n- [RFC-0006: Service-specific middleware](./rfc0006_service_specific_middleware.md)\n- [RFC-0007: Split Release Process](./rfc0007_split_release_process.md)\n- [RFC-0008: Paginators](./rfc0008_paginators.md)\n- [RFC-0009: Example Consolidation](./rfc0009_example_consolidation.md)\n- [RFC-0010: Waiters](./rfc0010_waiters.md)\n- [RFC-0011: Publishing Alpha to Crates.io](./rfc0011_crates_io_alpha_publishing.md)\n- [RFC-0012: Independent Crate Versioning](./rfc0012_independent_crate_versioning.md)\n- [RFC-0013: Body Callback APIs](./rfc0013_body_callback_apis.md)\n- [RFC-0014: Fine-grained timeout configuration](./rfc0014_timeout_config.md)\n- [RFC-0015: How Cargo \"features\" should be used in the SDK and runtime crates](./rfc0015_using_features_responsibly.md)\n- [RFC-0016: Supporting Flexible Checksums](./rfc0016_flexible_checksum_support.md)\n- [RFC-0017: Customizable Client Operations](./rfc0017_customizable_client_operations.md)\n- [RFC-0018: Logging in the Presence of Sensitive Data](./rfc0018_logging_sensitive.md)\n- [RFC-0019: Event Streams Errors](./rfc0019_event_streams_errors.md)\n- [RFC-0020: Service Builder Improvements](./rfc0020_service_builder.md)\n- [RFC-0021: Dependency Versions](./rfc0021_dependency_versions.md)\n- [RFC-0022: Error Context and Compatibility](./rfc0022_error_context_and_compatibility.md)\n- [RFC-0023: Evolving the new service builder API](./rfc0023_refine_builder.md)\n- [RFC-0024: RequestID](./rfc0024_request_id.md)\n- [RFC-0025: Constraint traits](./rfc0025_constraint_traits.md)\n- [RFC-0026: Client Crate Organization](./rfc0026_client_crate_organization.md)\n- [RFC-0027: Endpoints 2.0](./rfc0027_endpoints_20.md)\n- [RFC-0028: SDK Credential Cache Type Safety](./rfc0028_sdk_credential_cache_type_safety.md)\n- [RFC-0029: Finding New Home for Credential Types](./rfc0029_new_home_for_cred_types.md)\n- [RFC-0030: Serialization And Deserialization](./rfc0030_serialization_and_deserialization.md)\n- [RFC-0031: Providing Fallback Credentials on Timeout](./rfc0031_providing_fallback_credentials_on_timeout.md)\n- [RFC-0032: Better Constraint Violations](./rfc0032_better_constraint_violations.md)\n- [RFC-0033: Improving access to request IDs in SDK clients](./rfc0033_improve_sdk_request_id_access.md)\n- [RFC-0034: The Orchestrator Architecture](./rfc0034_smithy_orchestrator.md)\n- [RFC-0035: Sensible Defaults for Collection Values](./rfc0035_collection_defaults.md)\n- [RFC-0036: Enabling HTTP crate upgrades in the future](./rfc0036_http_dep_elimination.md)\n- [RFC-0037: The HTTP wrapper type](./rfc0037_http_wrapper.md)\n- [RFC-0038: Retry Classifier Customization](./rfc0038_retry_classifier_customization.md)\n- [RFC-0039: Forward Compatible Errors](./rfc0039_forward_compatible_errors.md)\n- [RFC-0040: Behavior Versions](./rfc0040_behavior_versions.md)\n- [RFC-0041: Improve client error ergonomics](./rfc0041_improve_client_error_ergonomics.md)\n- [RFC-0042: File-per-change changelog](./rfc0042_file_per_change_changelog.md)\n- [RFC-0043: Identity Cache Partitions](./rfc0043_identity_cache_partitions.md)\n- [RFC-0045: Configurable Serde](./rfc0045_configurable_serde.md)\n\n"
  },
  {
    "path": "design/src/rfcs/rfc0001_shared_config.md",
    "content": "# AWS Configuration RFC\n\n> Status: Implemented. For an ordered list of proposed changes see: [Proposed changes](#changes-checklist).\n\nAn AWS SDK loads configuration from multiple locations. Some of these locations can be loaded synchronously. Some are\nasync. Others may actually use AWS services such as STS or SSO.\n\nThis document proposes an overhaul to the configuration design to facilitate three things:\n\n1. Future-proof: It should be easy to add additional sources of region and credentials, sync and async, from many\n   sources, including code-generated AWS services.\n2. Ergonomic: There should be one obvious way to create an AWS service client. Customers should be able to easily\n   customize the client to make common changes. It should encourage sharing of things that are expensive to create.\n3. Shareable: A config object should be usable to configure multiple AWS services.\n\n## Usage Guide\n\n> The following is an imagined usage guide if this RFC where implemented.\n\n### Getting Started\n\nUsing the SDK requires two crates:\n\n1. `aws-sdk-<someservice>`: The service you want to use (e.g. `dynamodb`, `s3`, `sesv2`)\n2. `aws-config`: AWS metaconfiguration. This crate contains all the of logic to load configuration for the SDK (regions,\n   credentials, retry configuration, etc.)\n\nAdd the following to your Cargo.toml:\n\n```toml\n[dependencies]\naws-sdk-dynamo = \"0.1\"\naws-config = \"0.5\"\n\ntokio = { version = \"1\", features = [\"full\"] }\n```\n\nLet's write a small example project to list tables:\n\n```rust,ignore\nuse aws_sdk_dynamodb as dynamodb;\n\n#[tokio::main]\nasync fn main() -> Result<(), dynamodb::Error> {\n    let config = aws_config::load_from_env().await;\n    let dynamodb = dynamodb::Client::new(&config);\n    let resp = dynamodb.list_tables().send().await;\n    println!(\"my tables: {}\", resp.tables.unwrap_or_default());\n    Ok(())\n}\n```\n\n> Tip: Every AWS service exports a top level `Error` type (e.g. [aws_sdk_dynamodb::Error](https://awslabs.github.io/aws-sdk-rust/aws_sdk_dynamodb/enum.Error.html)).\n> Individual operations return specific error types that contain only the [error variants returned by the operation](https://awslabs.github.io/aws-sdk-rust/aws_sdk_dynamodb/error/struct.ListTablesError.html).\n> Because all the individual errors implement `Into<dynamodb::Error>`, you can use `dynamodb::Error` as the return type along with `?`.\n\nNext, we'll explore some other ways to configure the SDK. Perhaps you want to override the region loaded from the\nenvironment with your region. In this case, we'll want more control over how we load config,\nusing `aws_config::from_env()` directly:\n\n```rust,ignore\nuse aws_sdk_dynamodb as dynamodb;\n\n#[tokio::main]\nasync fn main() -> Result<(), dynamodb::Error> {\n    let region_provider = RegionProviderChain::default_provider().or_else(\"us-west-2\");\n    let config = aws_config::from_env().region(region_provider).load().await;\n    let dynamodb = dynamodb::Client::new(&config);\n    let resp = dynamodb.list_tables().send().await;\n    println!(\"my tables: {}\", resp.tables.unwrap_or_default());\n    Ok(())\n}\n```\n\n### Sharing configuration between multiple services\n\nThe `Config` produced by `aws-config` can be used with any AWS service. If we wanted to read our Dynamodb DB tables\naloud with Polly, we could create a Polly client as well. First, we'll need to add Polly to our `Cargo.toml`:\n\n```toml\n[dependencies]\naws-sdk-dynamo = \"0.1\"\naws-sdk-polly = \"0.1\"\naws-config = \"0.5\"\n\ntokio = { version = \"1\", features = [\"full\"] }\n```\n\nThen, we can use the shared configuration to build both service clients. The region override will apply to both clients:\n\n```rust,ignore\nuse aws_sdk_dynamodb as dynamodb;\nuse aws_sdk_polly as polly;\n\n#[tokio::main]\nasync fn main() -> Result<(), Box<dyn Error>> { // error type changed to `Box<dyn Error>` because we now have dynamo and polly errors\n    let config = aws_config::env_loader().with_region(Region::new(\"us-west-2\")).load().await;\n\n    let dynamodb = dynamodb::Client::new(&config);\n    let polly = polly::Client::new(&config);\n\n    let resp = dynamodb.list_tables().send().await;\n    let tables = resp.tables.unwrap_or_default();\n    let table_sentence = format!(\"my dynamo DB tables are: {}\", tables.join(\", \"));\n    let audio = polly.synthesize_speech()\n        .output_format(OutputFormat::Mp3)\n        .text(table_sentence)\n        .voice_id(VoiceId::Joanna)\n        .send()\n        .await?;\n\n    // Get MP3 data from the response and save it\n    let mut blob = resp\n        .audio_stream\n        .collect()\n        .await\n        .expect(\"failed to read data\");\n\n    let mut file = tokio::fs::File::create(\"tables.mp3\")\n        .await\n        .expect(\"failed to create file\");\n\n    file.write_all_buf(&mut blob)\n        .await\n        .expect(\"failed to write to file\");\n    Ok(())\n}\n```\n\n### Specifying a custom credential provider\n\nIf you have your own source of credentials, you may opt-out of the standard credential provider chain.\n\nTo do this, implement the `ProvideCredentials` trait.\n\n> NOTE: `aws_types::Credentials` already implements `ProvideCredentials`. If you want to use the SDK with static credentials, you're already done!\n\n```rust,ignore\nuse aws_types::credentials::{ProvideCredentials, provide_credentials::future, Result};\n\nstruct MyCustomProvider;\n\nimpl MyCustomProvider {\n    pub async fn load_credentials(&self) -> Result {\n        todo!() // A regular async function\n    }\n}\n\nimpl ProvideCredentials for MyCustomProvider {\n    fn provide_credentials<'a>(&'a self) -> future::ProvideCredentials<'a>\n        where\n            Self: 'a,\n    {\n        future::ProvideCredentials::new(self.load_credentials())\n    }\n}\n```\n\n> Hint: If your credential provider is not asynchronous, you can use `ProvideCredentials::ready` instead to save an allocation.\n\nAfter writing your custom provider, you'll use it in when constructing the configuration:\n\n```rust,ignore\n#[tokio::main]\nasync fn main() {\n    let config = aws_config::from_env().credentials_provider(MyCustomProvider).load().await;\n    let dynamodb = dynamodb::new(&config);\n}\n```\n\n## Proposed Design\n\nAchieving this design consists of three major changes:\n\n1. Add a `Config` struct to `aws-types`. This contains a config, but with no logic to _construct_ it. This represents\n   what configuration SDKS need, but **not** how to load the information from the environment.\n2. Create the `aws-config` crate. `aws-config` contains the logic to load configuration from the environment. No\n   generated service clients will depend on `aws-config`. This is critical to avoid circular dependencies and to\n   allow `aws-config` to depend on other AWS services. `aws-config` contains individual providers as well as a\n   pre-assembled default provider chain for region and credentials. It will also contain crate features to automatically\n   bring in HTTPS and async-sleep implementations.\n3. Remove all \"business logic\" from `aws-types`. `aws-types` should be an interface-only crate that is extremely stable.\n   The ProvideCredentials trait should move into `aws-types`. The region provider trait which only exists to support\n   region-chaining will move out of aws-types into aws-config.\n\nServices will continue to generate their own `Config` structs. These will continue to be customizable as they are today,\nhowever, they won't have any default resolvers built in. Each AWS config will implement `From<&aws_types::SharedConfig>`\n. A convenience method to `new()` a fluent client directly from a shared config will also be generated.\n\n### Shared Config Implementation\n\nThis RFC proposes adding region and credentials providers support to the shared config. A future RFC will propose\nintegration with HTTP settings, HTTPs connectors, and async sleep.\n\n```rust,ignore\nstruct Config {\n    // private fields\n    ...\n}\n\nimpl Config {\n    pub fn region(&self) -> Option<&Region> {\n        self.region.as_ref()\n    }\n\n    pub fn credentials_provider(&self) -> Option<SharedCredentialsProvider> {\n        self.credentials_provider.clone()\n    }\n\n    pub fn builder() -> Builder {\n        Builder::default()\n    }\n}\n\n```\n\nThe `Builder` for `Config` allows customers to provide individual overrides and handles the insertion of the default\nchain for regions and credentials.\n\n### Sleep + Connectors\n\nSleep and Connector are both runtime dependent features. `aws-config` will define `rt-tokio` and `rustls`\nand `native-tls` optional features. **This centralizes the Tokio/Hyper dependency** eventually removing the need for\neach service to maintain their own Tokio/Hyper features.\n\nAlthough not proposed in this RFC, shared config will eventually gain support for creating an HTTPs client from HTTP\nsettings.\n\n## The `.build()` method on <service>::Config\n\nCurrently, the `.build()` method on service config will fill in defaults. As part of this change, `.build()` called on\nthe service config with missing properties will fill in \"empty\" defaults. If no credentials provider is given,\na `NoCredentials` provider will be set, and `Region` will remain as `None`.\n\n## Stability and Versioning\n\nThe introduction of `Config` to aws-types is not without risks. If a customer depends on a version aws-config that\nuses `Config` that is incompatible, they will get confusing compiler errors.\n\nAn example of a problematic set of dependent versions:\n\n```markdown\n┌─────────────────┐                 ┌───────────────┐\n│ aws-types = 0.1 │                 │aws-types= 0.2 │\n└─────────────────┘                 └───────────────┘\n           ▲                                 ▲\n           │                                 │\n           │                                 │\n           │                                 │\n ┌─────────┴─────────────┐          ┌────────┴───────┐\n │aws-sdk-dynamodb = 0.5 │          │aws-config = 0.6│\n └───────────┬───────────┘          └───────┬────────┘\n             │                              │\n             │                              │\n             │                              │\n             │                              │\n             │                              │\n             ├─────────────────────┬────────┘\n             │ my-lambda-function  │\n             └─────────────────────┘\n```\n\nTo mitigate this risk, we will need to make `aws-types` essentially permanently stable. Changes to `aws-types` need to\nbe made with extreme care. This will ensure that two versions of `aws-types` never end up in a customer's dependency\ntree.\n\nWe will dramatically reduce the surface area of `aws-types` to contain only interfaces.\n\nSeveral breaking changes will be made as part of this, notably, the profile file parsing will be moved out of aws-types.\n\nFinally, to mitigate this risk even further, services will `pub use` items from `aws-types` directly which means that\neven if a dependency mismatch exists, it is still possible for customers to work around it.\n\n## Changes Checklist\n\n- [x] ProvideRegion becomes async using a newtype'd future.\n- [x] AsyncProvideCredentials is removed. ProvideCredentials becomes async using a newtype'd future.\n- [x] ProvideCredentials moved into `aws-types`. `Credentials` moved into `aws-types`\n- [x] Create `aws-config`.\n- [x] Profile-file parsing moved into `aws-config`, region chain & region environment loaders moved to `aws-config`.\n- [ ] os_shim_internal moved to ??? `aws-smithy-types`?\n- [x] Add `Config` to `aws-types`. Ensure that it's set up to add new members while remaining backwards\n  compatible.\n- [x] Code generate `From<&SharedConfig> for <everyservice>::Config`\n- [x] Code generate `<everservice>::Client::new(&shared_config)`\n- [x] Remove `<everyservice>::from_env`\n\n## Open Issues\n- [ ] Connector construction needs to be a function of HTTP settings\n- [ ] An AsyncSleep should be added to `aws-types::Config`\n"
  },
  {
    "path": "design/src/rfcs/rfc0002_http_versions.md",
    "content": "RFC: Supporting multiple HTTP versions for SDKs that use Event Stream\n=====================================================================\n\n> Status: Accepted\n\nFor a summarized list of proposed changes, see the [Changes Checklist](#changes-checklist) section.\n\n\nMost AWS SDK operations use HTTP/1.1, but bi-directional streaming operations that use the Event Stream\nmessage framing format need to use HTTP/2 (h2).\n\nSmithy models can also customize which HTTP versions are used in each individual protocol trait.\nFor example,\n[`@restJson1` has attributes `http` and `eventStreamHttp`](https://awslabs.github.io/smithy/1.0/spec/aws/aws-restjson1-protocol.html#aws-protocols-restjson1-trait)\nto list out the versions that should be used in a priority order.\n\nThere are two problems in play that this doc attempts to solve:\n1. **Connector Creation**: Customers need to be able to create connectors with the HTTP settings they desire,\n   and these custom connectors must align with what the Smithy model requires.\n2. **Connector Selection**: The generated code must be able to select the connector that best matches the requirements\n   from the Smithy model.\n\nTerminology\n-----------\n\nToday, there are three layers of `Client` that are easy to confuse, so to make the following easier to follow,\nthe following terms will be used:\n\n- **Connector**: An implementor of Tower's `Service` trait that converts a request into a response. This is typically\n  a thin wrapper around a Hyper client.\n- **Smithy Client**: A `aws_smithy_client::Client<C, M, R>` struct that is responsible for gluing together\n  the connector, middleware, and retry policy. This isn't intended to be used directly.\n- **Fluent Client**: A code generated `Client<C, M, R>` that has methods for each service operation on it.\n  A fluent builder is generated alongside it to make construction easier.\n- **AWS Client**: A specialized Fluent Client that uses a `DynConnector`, `DefaultMiddleware`,\n  and `Standard` retry policy.\n\nAll of these are just called `Client` in code today. This is something that could be clarified in a separate refactor.\n\nHow Clients Work Today\n----------------------\n\nFluent clients currently keep a handle to a single Smithy client, which is a wrapper\naround the underlying connector. When constructing operation builders, this handle is `Arc` cloned and\ngiven to the new builder instances so that their `send()` calls can initiate a request.\n\nThe generated fluent client code ends up looking like this:\n```rust,ignore\nstruct Handle<C, M, R> {\n    client: aws_smithy_client::Client<C, M, R>,\n    conf: crate::Config,\n}\n\npub struct Client<C, M, R = Standard> {\n    handle: Arc<Handle<C, M, R>>,\n}\n```\n\nFunctions are generated per operation on the fluent client to gain access to the individual operation builders.\nFor example:\n\n```rust,ignore\npub fn assume_role(&self) -> fluent_builders::AssumeRole<C, M, R> {\n    fluent_builders::AssumeRole::new(self.handle.clone())\n}\n```\n\nThe fluent operation builders ultimately implement `send()`, which chooses the one and only Smithy client out\nof the handle to make the request with:\n\n```rust,ignore\npub struct AssumeRole<C, M, R> {\n    handle: std::sync::Arc<super::Handle<C, M, R>>,\n    inner: crate::input::assume_role_input::Builder,\n}\n\nimpl<C, M, R> AssumeRole<C, M, R> where ...{\n    pub async fn send(self) -> Result<AssumeRoleOutput, SdkError<AssumeRoleError>> where ... {\n        // Setup code omitted ...\n\n        // Make the actual request\n        self.handle.client.call(op).await\n    }\n}\n```\n\nSmithy clients are constructed from a connector, as shown:\n\n```rust,ignore\nlet connector = Builder::new()\n    .https()\n    .middleware(...)\n    .build();\nlet client = Client::with_config(connector, Config::builder().build());\n```\n\nThe `https()` method on the Builder constructs the actual Hyper client, and is driven off Cargo features to\nselect the correct TLS implementation. For example:\n\n```rust\n#[cfg(feature = \"rustls\")]\npub fn https() -> Https {\n    let https = hyper_rustls::HttpsConnector::with_native_roots();\n    let client = hyper::Client::builder().build::<_, SdkBody>(https);\n    // HyperAdapter is a Tower `Service` request -> response connector that just calls the Hyper client\n    crate::hyper_impls::HyperAdapter::from(client)\n}\n```\n\nSolving the Connector Creation Problem\n--------------------------------------\n\nCustomers need to be able to provide HTTP settings, such as timeouts, for all connectors that the clients use.\nThese should come out of the `SharedConfig` when it is used. Connector creation also needs to be customizable\nso that alternate HTTP implementations can be used, or so that a fake implementation can be used for tests.\n\nTo accomplish this, `SharedConfig` will have a `make_connector` member. A customer would configure\nit as such:\n\n```rust,ignore\nlet config = some_shared_config_loader()\n    .with_http_settings(my_http_settings)\n    .with_make_connector(|reqs: &MakeConnectorRequirements| {\n        Some(MyCustomConnector::new(reqs))\n    })\n    .await;\n```\n\nThe passed in `MakeConnectorRequirements` will hold the customer-provided `HttpSettings` as well\nas any Smithy-modeled requirements, which will just be `HttpVersion` for now. The `MakeConnectorRequirements`\nstruct will be marked `non_exhaustive` so that new requirements can be added to it as the SDK evolves.\n\nA default `make_connector` implementation would be provided that creates a Hyper connector based on the\nCargo feature flags. This might look something like this:\n\n```rust\n#[cfg(feature = \"rustls\")]\npub fn default_connector(reqs: &HttpRequirements) -> HyperAdapter {\n    let https = hyper_rustls::HttpsConnector::with_native_roots();\n    let mut builder = hyper::Client::builder();\n    builder = configure_settings(builder, &reqs.http_settings);\n    if let Http2 = &reqs.http_version {\n        builder = builder.http2_only(true);\n    }\n    HyperAdapter::from(builder.build::<_, SdkBody>(https))\n}\n```\n\nFor any given service, `make_connector` could be called multiple times to create connectors\nfor all required HTTP versions and settings.\n\n**Note:** the `make_connector` returns an `Option` since an HTTP version may not be required, but rather, preferred\naccording to a Smithy model. For operations that list out `[\"h2\", \"HTTP/1.1\"]` as the desired versions,\na customer could choose to provide only an HTTP 1 connector, and the operation should still succeed.\n\nSolving the Connector Selection Problem\n---------------------------------------\n\nEach service operation needs to be able to select a connector that meets its requirements best\nfrom the customer provided connectors. Initially, the only selection criteria will be the HTTP version,\nbut later when per-operation HTTP settings are implemented, the connector will also need to be keyed off of those\nsettings. Since connector creation is not a cheap process, connectors will need to be cached after they are\ncreated.\n\nThis caching is currently handled by the `Handle` in the fluent client, which holds on to the\nSmithy client. This cache needs to be adjusted to:\n- Support multiple connectors, keyed off of the customer provided `HttpSettings`, and also off of the Smithy modeled requirements.\n- Be lazy initialized. Services that have a mix of Event Stream and non-streaming operations shouldn't create\n  an HTTP/2 client if the customer doesn't intend to use the Event Stream operations that require it.\n\nTo accomplish this, the `Handle` will hold a cache that is optimized for many reads and few writes:\n\n```rust,ignore\n#[derive(Debug, Hash, Eq, PartialEq)]\nstruct ConnectorKey {\n    http_settings: HttpSettings,\n    http_version: HttpVersion,\n}\n\nstruct Handle<C, M, R> {\n    clients: RwLock<HashMap<HttpRequirements<'static>, aws_smithy_client::Client<C, M, R>>>,\n    conf: crate::Config,\n}\n\npub struct Client<C, M, R = Standard> {\n    handle: Arc<Handle<C, M, R>>,\n}\n```\n\nWith how the generics are organized, the connector type will have to be the same between HTTP implementations,\nbut this should be fine since it is generally a thin wrapper around a separate HTTP implementor.\nFor cases where it is not, the custom connector type can host its own `dyn Trait` solution.\n\nThe `HttpRequirements` struct will hold `HttpSettings` as copy-on-write so that it can be used\nfor cache lookup without having to clone `HttpSettings`:\n\n```rust,ignore\nstruct HttpRequirements<'a> {\n    http_settings: Cow<'a, HttpSettings>,\n    http_version: HttpVersion,\n}\n\nimpl<'a> HttpRequirements<'a> {\n    // Needed for converting a borrowed HttpRequirements into an owned cache key for cache population\n    pub fn into_owned(self) -> HttpRequirements<'static> {\n        Self {\n            http_settings: Cow::Owned(self.http_settings.into_owned()),\n            http_version: self.http_version,\n        }\n    }\n}\n```\n\nWith the cache established, each operation needs to be aware of its requirements. The code generator will be\nupdated to store a prioritized list of `HttpVersion` in the property bag in an input's `make_operation()` method.\nThis prioritized list will come from the Smithy protocol trait's `http` or `eventStreamHttp` attribute, depending\non the operation. The fluent client will then pull this list out of the property bag so that it can determine which\nconnector to use. This indirection is necessary so that an operation still holds all information\nneeded to make a service call from the Smithy client directly.\n\n**Note:** This may be extended in the future to be more than just `HttpVersion`, for example, when per-operation\nHTTP setting overrides are implemented. This doc is not attempting to solve that problem.\n\nIn the fluent client, this will look as follows:\n\n```rust,ignore\nimpl<C, M, R> AssumeRole<C, M, R> where ... {\n    pub async fn send(self) -> Result<AssumeRoleOutput, SdkError<AssumeRoleError>> where ... {\n        let input = self.create_input()?;\n        let op = input.make_operation(&self.handle.conf)?;\n\n        // Grab the `make_connector` implementation\n        let make_connector = self.config.make_connector();\n\n        // Acquire the prioritized HttpVersion list\n        let http_versions = op.properties().get::<HttpVersionList>();\n\n        // Make the actual request (using default HttpSettings until modifying those is implemented)\n        let client = self.handle\n            .get_or_create_client(make_connector, &default_http_settings(), &http_versions)\n            .await?;\n        client.call(op).await\n    }\n}\n```\n\nIf an operation requires a specific protocol version, and if the `make_connection` implementation can't\nprovide that it, then the `get_or_create_client()` function will return `SdkError::ConstructionFailure`\nindicating the error.\n\nChanges Checklist\n-----------------\n\n- [ ] Create `HttpVersion` in `aws-smithy-http` with `Http1_1` and `Http2`\n- [ ] Refactor existing `https()` connector creation functions to take `HttpVersion`\n- [ ] Add `make_connector` to `SharedConfig`, and wire up the `https()` functions as a default\n- [ ] Create `HttpRequirements` in `aws-smithy-http`\n- [ ] Implement the connector cache on `Handle`\n- [ ] Implement function to calculate a minimum required set of HTTP versions from a Smithy model in the code generator\n- [ ] Update the `make_operation` code gen to put an `HttpVersionList` into the operation property bag\n- [ ] Update the fluent client `send()` function code gen grab the HTTP version list and acquire the correct connector with it\n- [ ] Add required defaulting for models that don't set the optional `http` and `eventStreamHttp` protocol trait attributes\n"
  },
  {
    "path": "design/src/rfcs/rfc0003_presigning_api.md",
    "content": "RFC: API for Presigned URLs\n============================\n\n> Status: Implemented\n\nFor a summarized list of proposed changes, see the [Changes Checklist](#changes-checklist) section.\n\nSeveral AWS services allow for presigned requests in URL form, which is described well by\n[S3's documentation on authenticating requests using query parameters](https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-query-string-auth.html).\n\nThis doc establishes the customer-facing API for creating these presigned URLs and how they will\nbe implemented in a generic fashion in the SDK codegen.\n\nTerminology\n-----------\n\nTo differentiate between the clients that are present in the generated SDK today, the following\nterms will be used throughout this doc:\n\n- **Smithy Client**: A `aws_smithy_client::Client<C, M, R>` struct that is responsible for gluing together\n  the connector, middleware, and retry policy. This is not generated and lives in the `aws-smithy-client` crate.\n- **Fluent Client**: A code-generated `Client<C, M, R>` that has methods for each service operation on it.\n  A fluent builder is generated alongside it to make construction easier.\n\nPresigned URL config\n--------------------\n\nToday, presigned URLs take an expiration time that's not part of the service API.\nThe SDK will make this configurable as a separate struct so that there's no chance of name collisions, and so\nthat additional fields can be added in the future. Fields added later will require defaulting for\nbackwards compatibility.\n\nCustomers should also be able to set a start time on the presigned URL's expiration so that they can\ngenerate URLs that become active in the future. An optional `start_time` option will be available and\ndefault to `SystemTime::now()`.\n\nConstruction `PresigningConfig` can be done with a builder, but a `PresigningConfig::expires_in`\nconvenience function will be provided to bypass the builder for the most frequent use-case.\n\n```rust,ignore\n#[non_exhaustive]\n#[derive(Debug, Clone)]\npub struct PresigningConfig {\n    start_time: SystemTime,\n    expires_in: Duration,\n}\n\n#[non_exhaustive]\n#[derive(Debug)]\npub struct Builder {\n    start_time: Option<SystemTime>,\n    expires_in: Option<Duration>,\n}\n\nimpl Builder {\n    pub fn start_time(self, start_time: SystemTime) -> Self { ... }\n    pub fn set_start_time(&mut self, start_time: Option<SystemTime>) { ... }\n\n    pub fn expires_in(self, expires_in: Duration) -> Self { ... }\n    pub fn set_expires_in(&mut self, expires_in: Option<Duration>) { ... }\n\n    // Validates `expires_in` is no greater than one week\n    pub fn build(self) -> Result<PresigningConfig, Error> { ... }\n}\n\nimpl PresigningConfig {\n    pub fn expires_in(expires_in: Duration) -> PresigningConfig {\n        Self::builder().expires(expires).build().unwrap()\n    }\n\n    pub fn builder() -> Builder { ... }\n}\n```\n\nConstruction of `PresigningConfig` will validate that `expires_in` is no greater than one week, as this\nis the longest supported expiration time for SigV4. This validation will result in a panic.\n\nIt's not inconceivable that `PresigningConfig` will need additional service-specific parameters as customizations,\nso it will be code generated with each service rather than living a shared location.\n\nFluent Presigned URL API\n------------------------\n\nThe generated fluent builders for operations that support presigning will have a `presigned()` method\nin addition to `send()` that will return a presigned URL rather than sending the request. For S3's GetObject,\nthe usage of this will look as follows:\n\n```rust,ignore\nlet config = aws_config::load_config_from_environment().await;\nlet client = s3::Client::new(&config);\nlet presigning_config = PresigningConfig::expires_in(Duration::from_secs(86400));\nlet presigned: PresignedRequest = client.get_object()\n    .bucket(\"example-bucket\")\n    .key(\"example-object\")\n    .presigned(presigning_config)\n    .await?;\n```\n\nThis API requires a client, and for use-cases where no actual service calls need to be made,\ncustomers should be able to create presigned URLs without the overhead of an HTTP client.\nOnce the [HTTP Versions RFC](./rfc0002_http_versions.md) is implemented, the underlying HTTP client\nwon't be created until the first service call, so there will be no HTTP client overhead to\nthis approach.\n\nIn a step away from the general pattern of keeping fluent client capabilities in line with Smithy client capabilities,\ncreating presigned URLs directly from the Smithy client will not be supported. This is for two reasons:\n- The Smithy client is not code generated, so adding a method to do presigning would apply to all operations,\n  but not all operations can be presigned.\n- Presigned URLs are not currently a Smithy concept ([although this may change soon](https://github.com/awslabs/smithy/pull/897)).\n\nThe result of calling `presigned()` is a `PresignedRequest`, which is a wrapper with delegating functions\naround `http::Request<()>` so that the request method and additional signing headers are also made available.\nThis is necessary since there are some presignable POST operations that require the signature to be in the\nheaders rather than the query.\n\n**Note:** Presigning *needs* to be `async` because the underlying credentials provider used to sign the\nrequest *may* need to make service calls to acquire the credentials.\n\nInput Presigned URL API\n------------------------\n\nEven though generating a presigned URL through the fluent client doesn't necessitate an HTTP client,\nit will be clearer that this is the case by allowing the creation of presigned URLs directly from an input.\nThis would look as follows:\n\n```rust,ignore\nlet config = aws_config::load_config_from_environment().await;\nlet presigning_config = PresigningConfig::expires_in(Duration::from_secs(86400));\nlet presigned: PresignedRequest = GetObjectInput::builder()\n    .bucket(\"example-bucket\")\n    .key(\"example-bucket\")\n    .presigned(&config, presigning_config)\n    .await?;\n```\n\nCreating the URL through the input will exercise the same code path as creating it through the client,\nbut it will be more apparent that the overhead of a client isn't present.\n\nBehind the scenes\n-----------------\n\nFrom an SDK's perspective, the following are required to make a presigned URL:\n- Valid request input\n- Endpoint\n- Credentials to sign with\n- Signing implementation\n\nThe AWS middleware provides everything except the request, and the request is provided as part\nof the fluent builder API. The generated code needs to be able to run the middleware to fully populate\na request property bag, but not actually dispatch it.  The `expires_in` value from the presigning config\nneeds to be piped all the way through to the signer. Additionally, the SigV4 signing needs to adjusted\nto do query param signing, which is slightly different than its header signing.\n\nToday, request dispatch looks as follows:\n1. The customer creates a new fluent builder by calling `client.operation_name()`, fills in inputs, and then calls `send()`.\n2. `send()`:\n   1. Builds the final input struct, and then calls its `make_operation()` method with the stored config to create a Smithy `Operation`.\n   2. Calls the underlying Smithy client with the operation.\n3. The Smithy client constructs a Tower Service with AWS middleware and a dispatcher at the bottom, and then executes it.\n4. The middleware acquire and add required signing parameters (region, credentials, endpoint, etc) to the request property bag.\n5. The SigV4 signing middleware signs the request by adding HTTP headers to it.\n6. The dispatcher makes the actual HTTP request and returns the response all the way back up the Tower.\n\nPresigning will take advantage of a lot of these same steps, but will cut out the `Operation` and\nreplace the dispatcher with a presigned URL generator:\n1. The customer creates a new fluent builder by calling `client.operation_name()`, fills in inputs, and then calls `presigned()`.\n2. `presigned()`:\n   1. Builds the final input struct, calls the `make_operation()` method with the stored config, and then extracts\n      the request from the operation (discarding the rest).\n   2. Mutates the `OperationSigningConfig` in the property bag to:\n      - Change the `signature_type` to `HttpRequestQueryParams` so that the signer runs the correct signing logic.\n      - Set `expires_in` to the value given by the customer in the presigning config.\n   3. Constructs a Tower Service with `AwsMiddleware` layered in, and a `PresignedUrlGeneratorLayer` at the bottom.\n   4. Calls the Tower Service and returns its result\n3. The `AwsMiddleware` will sign the request.\n4. The `PresignedUrlGeneratorLayer` directly returns the request since all of the work is done by the middleware.\n\nIt should be noted that the `presigned()` function above is on the generated input struct, so implementing this for\nthe input API is identical to implementing it for the fluent client.\n\nAll the code for the new `make_request()` is already in the existing `make_operation()` and will just need to be split out.\n\n### Modeling Presigning\n\nAWS models don't currently have any information about which operations can be presigned.\nTo work around this, the Rust SDK will create a synthetic trait to model presigning with, and\napply this trait to known presigned operations via customization. The code generator will\nlook for this synthetic trait when creating the fluent builders and inputs to know if a\n`presigned()` method should be added.\n\n### Avoiding name collision\n\nIf a presignable operation input has a member named `presigned`, then there will be a name collision with\nthe function to generate a presigned URL. To mitigate this, `RustReservedWords` will be updated\nto rename the `presigned` member to `presigned_value`\n[similar to how `send` is renamed](https://github.com/smithy-lang/smithy-rs/blob/3d61226b5d446f4cc20bf4969f0e56d106cf478b/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/rustlang/RustReservedWords.kt#L28).\n\nChanges Checklist\n-----------------\n\n- [x] Update `aws-sigv4` to support query param signing\n- [x] Create `PresignedOperationSyntheticTrait`\n- [x] Customize models for known presigned operations\n- [x] Create `PresigningConfig` and its builder\n- [x] Implement `PresignedUrlGeneratorLayer`\n- [x] Create new AWS codegen decorator to:\n  - [x] Add new `presigned()` method to input code generator\n  - [x] Add new `presigned()` method to fluent client generator\n- [x] Update `RustReservedWords` to reserve `presigned()`\n- [x] Add integration test to S3\n- [x] Add integration test to Polly\n- [x] Add examples for using presigning for:\n  - [x] S3 GetObject and PutObject\n  - [x] Polly SynthesizeSpeech\n"
  },
  {
    "path": "design/src/rfcs/rfc0004_retry_behavior.md",
    "content": "RFC: Retry Behavior\n============================\n\n> Status: Implemented\n\nFor a summarized list of proposed changes, see the [Changes Checklist](#changes-checklist) section.\n\nIt is not currently possible for users of the SDK to configure a client's maximum number of retry attempts. This RFC establishes a method for users to set the number of retries to attempt when calling a service and would allow users to disable retries entirely. This RFC would introduce breaking changes to the `retry` module of the `aws-smithy-client` crate.\n\nTerminology\n-----------\n\n- **Smithy Client**: A `aws_smithy_client::Client<C, M, R>` struct that is responsible for gluing together\n  the connector, middleware, and retry policy. This is not generated and lives in the `aws-smithy-client` crate.\n- **Fluent Client**: A code-generated `Client<C, M, R>` that has methods for each service operation on it.\n  A fluent builder is generated alongside it to make construction easier.\n- **AWS Client**: A specialized Fluent Client that defaults to using a `DynConnector`, `AwsMiddleware`,\n  and `Standard` retry policy.\n- **Shared Config**: An `aws_types::Config` struct that is responsible for storing shared configuration data that is used across all services. This is not generated and lives in the `aws-types` crate.\n- **Service-specific Config**: A code-generated `Config` that has methods for setting service-specific configuration. Each `Config` is defined in the `config` module of its parent service. For example, the S3-specific config struct is `use`able from `aws_sdk_s3::config::Config` and re-exported as `aws_sdk_s3::Config`.\n- **Standard retry behavior**: The standard set of retry rules across AWS SDKs. This mode includes a standard set of errors that are retried, and support for retry quotas. The default maximum number of attempts with this mode is three, unless `max_attempts` is explicitly configured.\n- **Adaptive retry behavior**: Adaptive retry mode dynamically limits the rate of AWS requests to maximize success rate. This may be at the expense of request latency. Adaptive retry mode is not recommended when predictable latency is important.\n  - _Note: supporting the \"adaptive\" retry behavior is considered outside the scope of this RFC_\n\nConfiguring the maximum number of retries\n------------\n\nThis RFC will demonstrate _(with examples)_ the following ways that Users can set the maximum number of retry attempts:\n\n- By calling the `Config::retry_config(..)` or `Config::disable_retries()` methods when building a service-specific config\n- By calling the `Config::retry_config(..)` or `Config::disable_retries()` methods when building a shared config\n- By setting the `AWS_MAX_ATTEMPTS` environment variable\n\nThe above list is in order of decreasing precedence e.g. setting maximum retry attempts with the `max_attempts` builder method will override a value set by `AWS_MAX_ATTEMPTS`.\n\n_The default number of retries is 3 as specified in the [AWS SDKs and Tools Reference Guide](https://docs.aws.amazon.com/sdkref/latest/guide/setting-global-max_attempts.html)._\n\n### Setting an environment variable\n\nHere's an example app that logs your AWS user's identity\n\n```rust,ignore\nuse aws_sdk_sts as sts;\n\n#[tokio::main]\nasync fn main() -> Result<(), sts::Error> {\n    let config = aws_config::load_from_env().await;\n\n    let sts = sts::Client::new(&config);\n    let resp = sts.get_caller_identity().send().await?;\n    println!(\"your user id: {}\", resp.user_id.unwrap_or_default());\n    Ok(())\n}\n```\n\nThen, in your terminal:\n\n```sh\n# Set the env var before running the example program\nexport AWS_MAX_ATTEMPTS=5\n# Run the example program\ncargo run\n```\n\n### Calling a method on an AWS shared config\n\nHere's an example app that creates a shared config with custom retry behavior and then logs your AWS user's identity\n\n```rust,ignore\nuse aws_sdk_sts as sts;\nuse aws_types::retry_config::StandardRetryConfig;\n\n#[tokio::main]\nasync fn main() -> Result<(), sts::Error> {\n    let retry_config = StandardRetryConfig::builder().max_attempts(5).build();\n    let config = aws_config::from_env().retry_config(retry_config).load().await;\n\n    let sts = sts::Client::new(&config);\n    let resp = sts.get_caller_identity().send().await?;\n    println!(\"your user id: {}\", resp.user_id.unwrap_or_default());\n    Ok(())\n}\n```\n\n### Calling a method on service-specific config\n\nHere's an example app that creates a service-specific config with custom retry behavior and then logs your AWS user's identity\n\n```rust,ignore\nuse aws_sdk_sts as sts;\nuse aws_types::retry_config::StandardRetryConfig;\n\n#[tokio::main]\nasync fn main() -> Result<(), sts::Error> {\n    let config = aws_config::load_from_env().await;\n    let retry_config = StandardRetryConfig::builder().max_attempts(5).build();\n    let sts_config = sts::config::Config::from(&config).retry_config(retry_config).build();\n\n    let sts = sts::Client::new(&sts_config);\n    let resp = sts.get_caller_identity().send().await?;\n    println!(\"your user id: {}\", resp.user_id.unwrap_or_default());\n    Ok(())\n}\n```\n\n### Disabling retries\n\nHere's an example app that creates a shared config that disables retries and then logs your AWS user's identity\n\n```rust,ignore\nuse aws_sdk_sts as sts;\nuse aws_types::config::Config;\n\n#[tokio::main]\nasync fn main() -> Result<(), sts::Error> {\n    let config = aws_config::from_env().disable_retries().load().await;\n    let sts_config = sts::config::Config::from(&config).build();\n\n    let sts = sts::Client::new(&sts_config);\n    let resp = sts.get_caller_identity().send().await?;\n    println!(\"your user id: {}\", resp.user_id.unwrap_or_default());\n    Ok(())\n}\n```\n\nRetries can also be disabled by explicitly passing the `RetryConfig::NoRetries` enum variant to the `retry_config` builder method:\n\n```rust,ignore\nuse aws_sdk_sts as sts;\nuse aws_types::retry_config::RetryConfig;\n\n#[tokio::main]\nasync fn main() -> Result<(), sts::Error> {\n    let config = aws_config::load_from_env().await;\n    let sts_config = sts::config::Config::from(&config).retry_config(RetryConfig::NoRetries).build();\n\n    let sts = sts::Client::new(&sts_config);\n    let resp = sts.get_caller_identity().send().await?;\n    println!(\"your user id: {}\", resp.user_id.unwrap_or_default());\n    Ok(())\n}\n```\n\nBehind the scenes\n-----------------\n\nCurrently, when users want to send a request, the following occurs:\n\n1. The user creates either a shared config or a service-specific config\n1. The user creates a fluent client for the service they want to interact with and passes the config they created. Internally, this creates an AWS client with a default retry policy\n1. The user calls an operation builder method on the client which constructs a request\n1. The user sends the request by awaiting the `send()` method\n1. The smithy client creates a new `Service` and attaches a copy of its retry policy\n1. The `Service` is `call`ed, sending out the request and retrying it according to the retry policy\n\nAfter this change, the process will work like this:\n\n1. The user creates either a shared config or a service-specific config\n    - If `AWS_MAX_ATTEMPTS` is set to zero, this is invalid and we will log it with `tracing::warn`. However, this will not error until a request is made\n    - If `AWS_MAX_ATTEMPTS` is 1, retries will be disabled\n    - If `AWS_MAX_ATTEMPTS` is greater than 1, retries will be attempted at most as many times as is specified\n    - If the user creates the config with the `.disable_retries` builder method, retries will be disabled\n    - If the user creates the config with the `retry_config` builder method, retry behavior will be set according to the `RetryConfig` they passed\n1. The user creates a fluent client for the service they want to interact with and passes the config they created\n    - Provider precedence will determine what retry behavior is actually set, working like how `Region` is set\n1. The user calls an operation builder method on the client which constructs a request\n1. The user sends the request by awaiting the `send()` method\n1. The smithy client creates a new `Service` and attaches a copy of its retry policy\n1. The `Service` is `call`ed, sending out the request and retrying it according to the retry policy\n\nThese changes will be made in such a way that they enable us to add the \"adaptive\" retry behavior at a later date without introducing a breaking change.\n\nChanges checklist\n-----------------\n\n- [x] Create new Kotlin decorator `RetryConfigDecorator`\n  - Based on [RegionDecorator.kt](https://github.com/smithy-lang/smithy-rs/blob/main/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/RegionDecorator.kt)\n  - This decorator will live in the `codegen` project because it has relevance outside the SDK\n- [x] **Breaking changes:**\n  - [x] Rename `aws_smithy_client::retry::Config` to `StandardRetryConfig`\n  - [x] Rename `aws_smithy_client::retry::Config::with_max_retries` method to `with_max_attempts` in order to follow AWS convention\n  - [x] Passing 0 to `with_max_attempts` will panic with a helpful, descriptive error message\n- [x] Create non-exhaustive `aws_types::retry_config::RetryConfig` enum wrapping structs that represent specific retry behaviors\n  - [x] A `NoRetry` variant that disables retries. Doesn't wrap a struct since it doesn't need to contain any data\n  - [x] A `Standard` variant that enables the standard retry behavior. Wraps a `StandardRetryConfig` struct.\n- [x] Create `aws_config::meta::retry_config::RetryConfigProviderChain`\n- [x] Create `aws_config::meta::retry_config::ProvideRetryConfig`\n- [x] Create `EnvironmentVariableMaxAttemptsProvider` struct\n  - Setting AWS_MAX_ATTEMPTS=0 and trying to load from env will panic with a helpful, descriptive error message\n- [x] Add `retry_config` method to `aws_config::ConfigLoader`\n- [x] Update `AwsFluentClientDecorator` to correctly configure the max retry attempts of its inner `aws_hyper::Client` based on the passed-in `Config`\n- [x] Add tests\n  - [x] Test that setting retry_config to 1 disables retries\n  - [x] Test that setting retry_config to `n` limits retries to `n` where `n` is a non-zero integer\n  - [x] Test that correct precedence is respected when overriding retry behavior in a service-specific config\n  - [x] Test that correct precedence is respected when overriding retry behavior in a shared config\n  - [x] Test that creating a config from env if AWS_MAX_ATTEMPTS=0 will panic with a helpful, descriptive error message\n  - [x] Test that setting invalid `max_attempts=0` with a `StandardRetryConfig` will panic with a helpful, descriptive error message\n"
  },
  {
    "path": "design/src/rfcs/rfc0005_service_generation.md",
    "content": "RFC: Smithy Rust Service Framework\n==================================\n\n> Status: RFC\n\nThe Rust Smithy Framework is a full-fledged service framework whose main\nresponsibility is to handle request lifecycles from beginning to end. It takes\ncare of input de-serialization, operation execution, output serialization,\nerror handling, and provides facilities to fulfill the requirements below.\n\nRequirements\n------------\n\n### Smithy model-driven code generation\n\nServer side code is generated from Smithy models and implements operations,\ninput and output structures, and errors defined in the service model.\n\n### Performance\n\nThis new framework is built with performance in mind. It refrains from\nallocating memory when not needed and tries to use a majority of\n[borrowed](https://doc.rust-lang.org/std/borrow/trait.Borrow.html) types,\nhandling their memory lifetimes so that a request body can be stored in memory\nonly once and not\n[cloned](https://doc.rust-lang.org/std/clone/trait.Clone.html) if possible.\n\nThe code is implemented on solid and widely used foundations. It uses\n[Hyper](https://hyper.rs/) to handle the HTTP requests, the\n[Tokio](https://tokio.rs/) ecosystem for asynchronous (non-blocking) operations\nand [Tower](https://docs.rs/tower/) to implement middleware such as timeouts,\nrate limiting, retries, and more. CPU intensive operations are scheduled on a\nseparated thread-pool to avoid blocking the event loop.\n\nIt uses Tokio [axum](https://tokio.rs/blog/2021-07-announcing-axum), an HTTP\nframework built on top of the technologies mentioned above which handles\nrouting, request extraction, response building, and workers lifecycle. Axum is\na relatively thin layer on top of Hyper and adds very little overhead, so its\n[performance is comparable](https://github.com/programatik29/rust-web-benchmarks/blob/master/results/hello-world.md)\nto Hyper.\n\nThe framework should allow customers to use the built-in HTTP server or\nselect other transport implementations that can be more performant or better\nsuited than HTTP for their use case.\n\n### Extensibility\n\nWe want to deliver an extensible framework that can plugin components possibly\nduring code generation and at runtime for specific scenarios that cannot be\ncovered during generation. These components are developed using a standard\n[interface](https://doc.rust-lang.org/book/ch10-02-traits.html) provided by the\nframework itself.\n\n### Observability\n\nBeing able to report and trace the status of the service is vital for the\nsuccess of any product. The framework is integrated with tracing and allows\nnon-blocking I/O through the asynchronous\n[tracing appender](https://tracing.rs/tracing_appender/index.html#non-blocking-writer).\n\nMetrics and logging are built with extensibility in mind, allowing customers to\nplug their own handlers following a well defined interface provided by the\nframework.\n\n### Client generation\n\nClient generation is deferred to the various Smithy implementations.\n\n### Benchmarking\n\nBenchmarking the framework is key and customers can't use anything that\ncompromises the fundamental business objectives of latency and performance.\n\n### Model validation\n\nThe generated service code is responsible for validating the model constraints of input structures.\n"
  },
  {
    "path": "design/src/rfcs/rfc0006_service_specific_middleware.md",
    "content": "RFC: Service-specific middleware\n================================\n\n> Status: [Implemented](https://github.com/smithy-lang/smithy-rs/pull/959)\n\nFor a summarized list of proposed changes, see the [Changes Checklist](#changes-checklist) section.\n\nCurrently, all services use a centralized `AwsMiddleware` that is defined in the (poorly named) `aws-hyper` crate. This\nposes a number of long term risks and limitations:\n\n1. When creating a Smithy Client directly for a given service, customers are forced to implicitly assume that the\n   service uses stock `AwsMiddleware`. This prevents us from _ever_ changing the middleware stack for a service in the\n   future.\n2. It is impossible / impractical in the current situation to alter the middleware stack for a given service. For\n   services like S3, we will almost certainly want to customize endpoint middleware in a way that is currently\n   impossible.\n\nIn light of these limitations, this RFC proposes moving middleware into each generated service. `aws-inlineable` will be\nused to host and test the middleware stack. Each service will then define a public `middleware` module containing their\nmiddleware stack.\n\nTerminology\n-----------\n\n- **Middleware**: A tower layer that augments `operation::Request -> operation::Response` for things like signing and\n  endpoint resolution.\n- **Aws Middleware**: A specific middleware stack that meets the requirements for AWS services.\n- **Smithy Client**: A `aws_smithy_client::Client<C, M, R>` struct that is responsible for gluing together the\n  connector, middleware, and retry policy. This is not generated and lives in the `aws-smithy-client` crate.\n- **Fluent Client**: A code-generated `Client<C, M, R>` that has methods for each service operation on it. A fluent\n  builder is generated alongside it to make construction easier.\n- **AWS Client**: A specialized Fluent Client that defaults to using a `DynConnector`, `AwsMiddleware`, and `Standard`\n  retry policy.\n- **Shared Config**: An `aws_types::Config` struct that is responsible for storing shared configuration data that is\n  used across all services. This is not generated and lives in the `aws-types` crate.\n- **Service-specific Config**: A code-generated `Config` that has methods for setting service-specific configuration.\n  Each `Config` is defined in the `config` module of its parent service. For example, the S3-specific config struct\n  is `use`able from `aws_sdk_s3::config::Config` and re-exported as `aws_sdk_s3::Config`.\n\n# Detailed Design\n\nCurrently, `AwsMiddleware` is defined in `aws-hyper`. As part of this change, an `aws-inlineable` dependency will be\nadded containing code that is largely identical. This will be exposed in a public `middleware` module in all generated\nservices. At some future point, we could even expose a baseline set of default middleware for whitelabel Smithy services\nto make them easier to use out-of-the-box.\n\nThe `ClientGenerics` parameter of the `AwsFluentClientGenerator` will be updated to become a `RuntimeType`, enabling\nloading the type directly. This has the advantage of making it fairly easy to do per-service middleware stacks since we\ncan easily configure `AwsFluentClientGenerator` to insert different types based on the service id.\n\n# Changes Checklist\n\n- [x] Move aws-hyper into aws-inlineable. Update comments as needed including with a usage example about how customers can augment it.\n- [x] Refactor `ClientGenerics` to contain a RuntimeType instead of a string and configure. Update `AwsFluentClientDecorator`.\n- [x] Update all code and examples that use `aws-hyper` to use service-specific middleware.\n- [x] Push an updated README to aws-hyper deprecating the package, explaining what happened. Do _not_ yank previous versions since those will be relied on by older SDK versions.\n"
  },
  {
    "path": "design/src/rfcs/rfc0007_split_release_process.md",
    "content": "RFC: Split Release Process\n==========================\n\n> Status: Implemented in [smithy-rs#986](https://github.com/smithy-lang/smithy-rs/pull/986) and [aws-sdk-rust#351](https://github.com/awslabs/aws-sdk-rust/pull/351)\n\nAt the time of writing, the `aws-sdk-rust` repository is used exclusively\nfor the entire release process of both the Rust runtime crates from `smithy-rs` as\nwell as the AWS runtime crates and the AWS SDK. This worked well when `smithy-rs` was\nonly used for the AWS SDK, but now that it's also used for server codegen, there\nare issues around publishing the server-specific runtime crates since they don't\nbelong to the SDK.\n\nThis RFC proposes a new split-release process so that the entire `smithy-rs` runtime\ncan be published separately before the AWS SDK is published.\n\nTerminology\n-----------\n\n- **Smithy Runtime Crate**: A crate that gets published to crates.io and supports\n  the code generated by `smithy-rs`. These crates don't provide any SDK-only functionality.\n  These crates can support client and/or server code, and clients or servers may use\n  only a subset of them.\n- **AWS Runtime Crate**: A crate of SDK-specific code that supports the code generated\n  by the `aws/codegen` module in `smithy-rs`. These also get published to crates.io.\n- **Publish-ready Bundle**: A build artifact that is ready to publish to crates.io without\n  additional steps (such as running the publisher tool's `fix-manifests` subcommand). Publishing\n  one group of crates before another is not considered an additional step for this definition.\n- **Releaser**: A developer, automated process, or combination of the two that performs the actual release.\n\nRequirements\n------------\n\nAt a high level, the requirements are: publish from both `smithy-rs` and `aws-sdk-rust`\nwhile preserving our current level of confidence in the quality of the release. This\ncan be enumerated as:\n\n1. All Smithy runtime crates must be published together from `smithy-rs`\n2. AWS runtime crates and the SDK must be published together from `aws-sdk-rust`\n3. CI on `smithy-rs` must give confidence that the Smithy runtime crates,\n   AWS runtime crates, and SDK are all at the right quality bar for publish.\n4. CI on the `aws-sdk-rust` repository must give confidence that the AWS SDK and its\n   runtime crates are at the right quality bar for publish. To do this successfully,\n   it must run against the exact versions of the Smithy runtime crates the code was\n   generated against _both before AND after they have been published to crates.io_.\n\nBackground: How Publishing Worked Before\n----------------------------------------\n\nThe publish process to crates.io relied on copying all the Smithy runtime crates\ninto the final `aws-sdk-rust` repository. Overall, the process looked as follows:\n\n1. `smithy-rs` generates a complete `aws-sdk-rust` source bundle at CI time\n2. The releaser copies the generated bundle over to `aws-sdk-rust`\n3. The releaser runs the `publisher fix-manifests` subcommand to correct the\n   `Cargo.toml` files generated by `smithy-rs`\n4. The `aws-sdk-rust` CI performs one last pass on the code to verify it's sound\n5. The releaser runs the `publisher publish` subcommand to push all the crates up to crates.io\n\nProposed Solution\n-----------------\n\nCI in `smithy-rs` will be revised to generate two separate build artifacts where it generates\njust an SDK artifact previously. Now, it will have two build targets that get executed from CI\nto generate these artifacts:\n\n- `rust-runtime:assemble` - Generates a publish-ready bundle of Smithy runtime crates.\n- `aws:sdk:assemble` - Generates a publish-ready bundle of AWS runtime crates, SDK crates,\n  and just the Smithy runtime crates that are used by the SDK.\n\nThe `aws-sdk-rust` repository will have a new `next` branch that has its own set of CI workflows\nand branch protection rules. The releaser will take the `aws:sdk:assemble` artifact and apply it\ndirectly to this `next` branch as would have previously been done against the `main` branch.\nThe `main` branch will continue to have the same CI as `next`.\n\nWhen it's time to cut a release, the releaser will do the following:\n\n1. Tag `smithy-rs` with the desired version number\n2. Wait for CI to build artifacts for the tagged release\n3. Pull-request the SDK artifacts over to `aws-sdk-rust/next` (this will be automated in the future)\n6. Pull-request merge `aws-sdk-rust/next` into `aws-sdk-rust/main`\n7. Wait for successful CI in `main`\n8. Tag release for `main`\n9. Publish SDK with publisher tool\n\nThe server team can then download the `rust-runtime:assemble` build artifact for the tagged release\nin `smithy-rs`, and publish the `aws-smithy-http-server` crate from there.\n\n### Avoiding mistakes by disallowing creation of publish-ready bundles outside of CI\n\nIt should be difficult to accidentally publish a locally built set of crates. To add friction to this,\nthe `smithy-rs` build process will look for the existence of the `GITHUB_ACTIONS=true` environment variable.\nIf this environment variable is not set, then it will pass a flag to the Rust codegen plugin that tells it to\nemit a `publish = false` under `[package]` in the generated `Cargo.toml`.\n\nThis could be easily circumvented, but the goal is to reduce the chances of accidentally publishing\ncrates rather than making it impossible.\n\nAlternatives Considered\n-----------------------\n\n### Publish Smithy runtime crates from `smithy-rs` build artifacts\n\nThis approach is similar to the proposed solution, except that the SDK would not publish\nthe Smithy runtime crates. The `aws-sdk-rust/main` branch would have a small tweak to its CI\nso that the SDK is tested against the Smithy runtime crates that are published to crates.io\nThis CI process would look as follows:\n\n1. Shallow clone `aws-sdk-rust` with the revision being tested\n2. Run a script to remove the `path` argument for the Smithy runtime crate dependencies for every crate\n   in `aws-sdk-rust`. For example,\n```toml\naws-smithy-types = { version = \"0.33.0\", path = \"../aws-smithy-types\" }\n```\nWould become:\n```toml\naws-smithy-types = { version = \"0.33.0\" }\n```\n3. Run the tests as usual\n\nWhen it's time to cut a release, the releaser will do the following:\n\n1. Tag `smithy-rs` with the desired version number\n2. Wait for CI to build artifacts for the tagged release\n3. Pull-request the SDK artifacts over to `aws-sdk-rust/next`\n4. Wait for successful CI in `aws-sdk-rust/next`\n5. Download the Smithy runtime crates build artifact and publish it to crates.io\n6. Pull-request merge `aws-sdk-rust/next` into `aws-sdk-rust/main`\n7. Wait for successful CI in `main` (this time actually running against the crates.io Smithy runtime crates)\n8. Tag release for `main`\n9. Publish SDK with publisher tool\n\n### Keep Smithy runtime crates in `smithy-rs`\n\nThis approach is similar to the previous alternative, except that the `aws-sdk-rust` repository\nwon't have a snapshot of the Smithy runtime crates, and an additional step needs to be performed\nduring CI for the `next` branch so that it looks as follows:\n\n1. Make a shallow clone of `aws-sdk-rust/next`\n2. Retrieve the `smithy-rs` commit hash that was used to generate the SDK from a file\n   that was generated alongside the rest of the build artifacts from `smithy-rs` and\n   copied into `aws-sdk-rust`.\n3. Make a shallow clone of `smithy-rs` at the correct commit hash\n4. Use a script to add a `[patch]` section to all the AWS SDK crates to point to the\n   Smithy runtime crates from the local clone of `smithy-rs`.\n   For example:\n```toml\n# The dependencies section is left alone, but is here for context\n[dependencies]\n# Some version of aws-smithy-types that isn't on crates.io yet, referred to as `<unreleased>` below\naws-smithy-types = \"<unreleased>\"\n\n# This patch section gets added by the script\n[patch.crates-io]\naws-smithy-types = { version = \"<unreleased>\", path = \"path/to/local/smithy-rs/rust-runtime/aws-smithy-types\"}\n```\n5. Run CI as normal.\n\n**Note:** `smithy-rs` would need to do the same patching in CI as `aws-sdk-rust/next` since the generated\nSDK would not have path dependencies for the Smithy runtime crates (since they are a publish-ready bundle\nintended for landing in `aws-sdk-rust`). The script that does this patching could live in `smithy-rs` and be\nreused by `aws-sdk-rust`.\n\nThe disadvantage of this approach is that a customer having an issue with the current release wouldn't be able\nto get a fix sooner by patching their own project's crate manifest to use the `aws-sdk-rust/next` branch before\na release is cut since their project wouldn't be able to find the unreleased Smithy runtime crates.\n\nChanges Checklist\n-----------------\n\n- In `smithy-rs`:\n  - [x] Move publisher tool from `aws-sdk-rust` into `smithy-rs`\n  - [x] Modify `aws:sdk:assemble` target to run the publisher `fix-manifests` subcommand\n  - [x] Add `rust-runtime:assemble` target that generates publish-ready Smithy runtime crates\n  - [x] Add CI step to create Smithy runtime bundle artifact\n  - [x] Add `GITHUB_ACTIONS=true` env var check for setting the `publish` flag in generated AND runtime manifests\n  - [x] Revise publisher tool to publish from an arbitrary directory\n- In `aws-sdk-rust`:\n  - [x] Implement CI for the `aws-sdk-rust/next` branch\n  - [x] Remove the publisher tool\n- [x] Update release process documentation\n"
  },
  {
    "path": "design/src/rfcs/rfc0008_paginators.md",
    "content": "## Summary\n\n> Status: Implemented\n\nSmithy [models paginated responses](https://awslabs.github.io/smithy/1.0/spec/core/behavior-traits.html#paginated-trait)\n. Customers of Smithy generated code & the Rust SDK will have an improved user experience if code is generated to\nsupport this. Fundamentally, paginators are a way to automatically make a series of requests with the SDK, where subsequent\nrequests automatically forward output from the previous responses. There is nothing a paginator does that a user could not do manually,\nthey merely simplify the common task of interacting with paginated APIs. **Specifically, a paginator will resend the orginal request\nbut with `inputToken` updated to the value of the previous `outputToken`.\n\nIn this RFC, we propose modeling paginated data as\na  [`Stream`](https://docs.rs/tokio-stream/0.1.5/tokio_stream/#traits) of output shapes.\n\n- When an output is paginated, a `paginate()` method will be added to the high level builder\n- An `<OperationName>Paginator` struct will be generated into the `paginator` module.\n- If `items` is modeled, `paginate().items()` will be added to produce the paginated\n  items. `<OperationName>PaginatorItems` will be generated into the `paginator` module.\n\nThe [`Stream`](https://docs.rs/tokio-stream/latest/tokio_stream/index.html) trait enables customers to use a number of\nabstractions including simple looping, and `collect()`ing all data in a single call. A paginator will resend the\noriginal input, but with the field marked `inputToken` to the value of `outputToken` in the previous output.\n\nUsage example:\n\n```rust,ignore\nlet paginator = client\n    .list_tables()\n    .paginate()\n    .items()\n    .page_size(10)\n    .send()\n    .await;\nlet tables: Result<Vec<_ >, _ > = paginator.collect().await;\n```\n\nPaginators are lazy and only retrieve pages when polled by a client.\n\n### Details\n\nPaginators will be generated into the `paginator` module of service crates. Currently, paginators are _not_ feature gated, but this\ncould be considered in the future. A `paginator` struct captures 2 pieces of data:\n\n```rust,ignore\n// dynamodb/src/paginator.rs\nstruct ListTablesPaginator<C, M, R> {\n    // holds the low-level client and configuration\n    handle: Arc<Handle<C, M, R>>,\n\n    // input builder to construct the actual input on demand\n    input: ListTablesInputBuilder\n}\n```\n\nIn addition to the basic usage example above, when `pageSize` is modeled, customers can specify the page size during\npagination:\n\n```rust,ignore\nlet mut tables = vec![];\nlet mut pages = client\n    .list_tables()\n    .paginate()\n    .page_size(20)\n    .send();\nwhile let Some(next_page) = pages.try_next().await? {\n    // pages of 20 items requested from DynamoDb\n    tables.extend(next_page.table_names.unwrap_or_default().into_iter());\n}\n```\n\nPaginators define a public method `send()`. This method\nreturns `impl Stream<Item=Result<OperationOutput, OperationError>`. This uses `FnStream` defined in the `aws-smithy-async` crate which\nenables demand driven execution of a closure. A rendezvous channel is used which will block on `send` until demand exists.\n\nWhen modeled by Smithy, `page_size` which automatically sets the appropriate page_size parameter and `items()` which returns an\nautomatically flattened paginator are also generated. **Note**: `page_size` directly sets the modeled parameter on the internal builder.\nThis means that a value set for page size will override any previously set value for that field.\n```rust,ignore\n// Generated paginator for ListTables\nimpl<C, M, R> ListTablesPaginator<C, M, R>\n{\n  /// Set the page size\n  pub fn page_size(mut self, limit: i32) -> Self {\n    self.builder.limit = Some(limit);\n    self\n  }\n\n  /// Create a flattened paginator\n  ///\n  /// This paginator automatically flattens results using `table_names`. Queries to the underlying service\n  /// are dispatched lazily.\n  pub fn items(self) -> crate::paginator::ListTablesPaginatorItems<C, M, R> {\n    crate::paginator::ListTablesPaginatorItems(self)\n  }\n\n  /// Create the pagination stream\n  ///\n  /// _Note:_ No requests will be dispatched until the stream is used (eg. with [`.next().await`](tokio_stream::StreamExt::next)).\n  pub async fn send(\n    self,\n  ) -> impl tokio_stream::Stream<\n    Item = std::result::Result<\n      crate::output::ListTablesOutput,\n      aws_smithy_http::result::SdkError<crate::error::ListTablesError>,\n    >,\n  > + Unpin\n  {\n    // Move individual fields out of self for the borrow checker\n    let builder = self.builder;\n    let handle = self.handle;\n    fn_stream::FnStream::new(move |tx| {\n      Box::pin(async move {\n        // Build the input for the first time. If required fields are missing, this is where we'll produce an early error.\n        let mut input = match builder.build().map_err(|err| {\n          SdkError::ConstructionFailure(err.into())\n        }) {\n          Ok(input) => input,\n          Err(e) => {\n            let _ = tx.send(Err(e)).await;\n            return;\n          }\n        };\n        loop {\n          let op = match input.make_operation(&handle.conf).await.map_err(|err| {\n            SdkError::ConstructionFailure(err.into())\n          }) {\n            Ok(op) => op,\n            Err(e) => {\n              let _ = tx.send(Err(e)).await;\n              return;\n            }\n          };\n          let resp = handle.client.call(op).await;\n          // If the input member is None or it was an error\n          let done = match resp {\n            Ok(ref resp) => {\n              input.exclusive_start_table_name = crate::lens::reflens_structure_crate_output_list_tables_output_last_evaluated_table_name(resp).cloned();\n              input.exclusive_start_table_name.is_none()\n            }\n            Err(_) => true,\n          };\n          if let Err(_) = tx.send(resp).await {\n            // receiving end was dropped\n            return;\n          }\n          if done {\n            return;\n          }\n        }\n      })\n    })\n  }\n}\n```\n\n**On Box::pin**: The stream returned by `AsyncStream` does not implement `Unpin`. Unfortunately, this makes iteration\nrequire an invocation of `pin_mut!` and generates several hundred lines of compiler errors. Box::pin seems a worthwhile\ntrade off to improve the user experience.\n\n**On the `+ Unpin` bound**: Because auto-traits leak across `impl Trait` boundaries, `+ Unpin` prevents accidental\nregressions in the generated code which would break users.\n\n**On the crate::reflens::...**: We use `LensGenerator.kt` to generate potentially complex accessors to deeply nested fields.\n\n### Updates to ergonomic clients\n\nThe `builders` generated by ergonomic clients will gain the following method, if they represent an operation that implements the `Paginated` trait:\n\n```rust,ignore\n/// Create a paginator for this request\n///\n/// Paginators are used by calling [`send().await`](crate::paginator::ListTablesPaginator::send) which returns a [`Stream`](tokio_stream::Stream).\npub fn paginate(self) -> crate::paginator::ListTablesPaginator<C, M, R> {\n  crate::paginator::ListTablesPaginator::new(self.handle, self.inner)\n}\n```\n\n## Discussion Areas\n### On `send().await`\nCalling `send().await` is not necessary from an API perspective—we could have the paginators impl-stream directly. However,\nit enables using `impl Trait` syntax and also makes the API consistent with other SDK APIs.\n\n### On `tokio_stream::Stream`\nCurrently, the core trait we use is `tokio_stream::Stream`. This is a re-export from futures-util. There are a few other choices:\n1. Re-export `Stream` from tokio_stream.\n2. Use `futures_util` directly\n\n### On Generics\nCurrently, the paginators forward the generics from the client (`C, M, R`) along with their fairly annoying bounds.\nHowever, if we wanted to we _could_ simplify this and erase all the generics when the paginator was created. Since everything\nis code generated, there isn't actually much duplicated code in the generator, just in the generated code.\n\n## Changes Checklist\n- [x] Create and test `FnStream` abstraction\n- [x] Generate page-level paginators\n- [x] Generate `.items()` paginators\n- [x] Generate doc hints pointing people to paginators\n- [x] Integration test using mocked HTTP traffic against a generated paginator for a real service\n- [ ] Integration test using real traffic\n"
  },
  {
    "path": "design/src/rfcs/rfc0009_example_consolidation.md",
    "content": "RFC: Examples Consolidation\n===========================\n\n> Status: Implemented\n\nCurrently, the AWS Rust SDK's examples are duplicated across\n[`awslabs/aws-sdk-rust`](https://github.com/awslabs/aws-sdk-rust),\n[`smithy-lang/smithy-rs`](https://github.com/smithy-lang/smithy-rs),\nand [`awsdocs/aws-doc-sdk-examples`](https://github.com/awsdocs/aws-doc-sdk-examples).\nThe `smithy-rs` repository was formerly the source of truth for examples,\nwith the examples being copied over to `aws-sdk-rust` as part of the release\nprocess, and examples were manually copied over to `aws-doc-sdk-examples` so that\nthey could be included in the developer guide.\n\nNow that the SDK is more stable with less frequent breaking changes,\nthe `aws-doc-sdk-examples` repository can become the source of truth\nso long as the examples are tested against `smithy-rs` and continue to be\ncopied into `aws-sdk-rust`.\n\nRequirements\n------------\n\n1. Examples are authored and maintained in `aws-doc-sdk-examples`\n2. Examples are no longer present in `smithy-rs`\n3. CI in `smithy-rs` checks out examples from `aws-doc-sdk-examples` and\n   builds them against the generated SDK. Success for this CI job is optional for merging\n   since there can be a time lag between identifying that examples are broken and fixing them.\n4. Examples must be copied into `aws-sdk-rust` so that the examples for a specific\n   version of the SDK can be easily referenced.\n5. Examples must be verified in `aws-sdk-rust` prior to merging into the `main` branch.\n\nExample CI in `smithy-rs`\n------------------------\n\nA CI job will be added to `smithy-rs` that:\n\n1. Depends on the CI job that generates the full AWS SDK\n2. Checks out the `aws-doc-sdk-examples` repository\n3. Modifies example **Cargo.toml** files to point to the newly generated AWS SDK crates\n4. Runs `cargo check` on each example\n\nThis job will not be required to pass for branch protection, but will\nlet us know that examples need to be updated before the next release.\n\nAuto-sync to `aws-sdk-rust` from `smithy-rs` changes\n--------------------------------------------------\n\nThe auto-sync job that copies generated code from `smithy-rs` into the\n`aws-sdk-rust/next` branch will be updated to check out the `aws-doc-sdk-examples`\nrepository and copy the examples into `aws-sdk-rust`. The example **Cargo.toml** files\nwill also be updated to point to the local crate paths as part of this process.\n\nThe `aws-sdk-rust` CI already requires examples to compile, so merging `next` into `main`,\nthe step required to perform a release, will be blocked until the examples are fixed.\n\nIn the event the examples don't work on the `next` branch, developers and example writers\nwill need to be able to point the examples in `aws-doc-sdk-examples` to the generated\nSDK in `next` so that they can verify their fixes. This can be done by hand, or a tool\ncan be written to automate it if a significant number of examples need to be fixed.\n\nProcess Risks\n-------------\n\nThere are a couple of risks with this approach:\n\n1. **Risk:** Examples are broken and an urgent fix needs to be released.\n\n   **Possible mitigations:**\n\n     1. Revert the change that broke the examples and then add the urgent fix\n     2. Create a patch branch in `aws-sdk-rust`, apply the fix to that based off an older\n        version of `smithy-rs` with the fix applied, and merge that into `main`.\n\n2. **Risk:** A larger project requires changes to examples prior to GA, but multiple releases\n   need to occur before the project completion.\n\n   **Possible mitigations:**\n\n     1. If the required changes compile against the older SDK, then just make the changes\n        to the examples.\n     2. Feature gate any incremental new functionality in `smithy-rs`, and work on example\n        changes on a branch in `aws-doc-sdk-examples`. When wrapping up the project,\n        remove the feature gating and merge the examples into the `main` branch.\n\nAlternatives\n------------\n\n### `aws-sdk-rust` as the source of truth\n\nAlternatively, the examples could reside in `aws-sdk-rust`, be referenced\nfrom `smithy-rs` CI, and get copied into `aws-doc-sdk-examples` for inclusion\nin the user guide.\n\n**Pros:**\n- Prior to GA, fixing examples after making breaking changes to the SDK would be easier.\n  Otherwise, **Cargo.toml** files have to be temporarily modified to point to the\n  `aws-sdk-rust/next` branch in order to make fixes.\n- If a customer discovers examples via the `aws-sdk-rust` repository rather than via the\n  SDK user guide, then it would be more obvious how to make changes to examples. At time\n  of writing, the examples in the user guide link to the `aws-doc-sdk-examples` repository,\n  so if the examples are discovered that way, then updating them should already be clear.\n\n**Cons:**\n- Tooling would need to be built to sync examples from `aws-sdk-rust` into\n  `aws-doc-sdk-examples` so that they could be incorporated into the user guide.\n- Creates a circular dependency between the `aws-sdk-rust` and `smithy-rs` repositories.\n  CI in `smithy-rs` needs to exercise examples, which would be in `aws-sdk-rust`, and\n  `aws-sdk-rust` has its code generated by `smithy-rs`. This is workable, but may lead\n  to problems later on.\n\nThe tooling to auto-sync from `aws-sdk-rust` into `aws-doc-sdk-examples` will likely cost\nmore than tooling to temporarily update **Cargo.toml** files to make example fixes (if\nthat tooling is even necessary).\n\nChanges Checklist\n-----------------\n\n- [x] Add example CI job to `smithy-rs`\n- [x] Diff examples in `smithy-rs` and `aws-doc-sdk-examples` and move desired differences into `aws-doc-sdk-examples`\n- [x] Apply example fix PRs from `aws-sdk-rust` into `aws-doc-sdk-examples`\n- [x] Update `smithy-rs` CI to copy examples from `aws-doc-sdk-examples` rather than from smithy-rs\n- [x] Delete examples from `smithy-rs`\n"
  },
  {
    "path": "design/src/rfcs/rfc0010_waiters.md",
    "content": "RFC: Waiters\n============\n\n> Status: Accepted\n\nWaiters are a convenient polling mechanism to wait for a resource to become available or to\nbe deleted. For example, a waiter could be used to wait for a S3 bucket to be created after\na call to the `CreateBucket` API, and this would only require a small amount of code rather\nthan building out an entire polling mechanism manually.\n\nAt the highest level, a waiter is a simple polling loop (pseudo-Rust):\n\n```rust,ignore\n// Track state that contains the number of attempts made and the previous delay\nlet mut state = initial_state();\n\nloop {\n    // Poll the service\n    let result = poll_service().await;\n\n    // Classify the action that needs to be taken based on the Smithy model\n    match classify(result) {\n        // If max attempts hasn't been exceeded, then retry after a delay. Otherwise, error.\n        Retry => if state.should_retry() {\n            let delay = state.next_retry();\n            sleep(delay).await;\n        } else {\n            return error_max_attempts();\n        }\n        // Otherwise, if the termination condition was met, return the output\n        Terminate(result) => return result,\n    }\n}\n```\n\nIn the AWS SDK for Rust, waiters can be added without making any backwards breaking changes\nto the current API. This doc outlines the approach to add them in this fashion, but does _NOT_\nexamine code generating response classification from JMESPath expressions, which can be left\nto the implementer without concern for the overall API.\n\nTerminology\n-----------\n\nToday, there are three layers of `Client` that are easy to confuse, so to make the following easier to follow,\nthe following terms will be used:\n\n- **Connector**: An implementor of Tower's `Service` trait that converts a request into a response. This is typically\n  a thin wrapper around a Hyper client.\n- **Smithy Client**: A `aws_smithy_client::Client<C, M, R>` struct that is responsible for gluing together\n  the connector, middleware, and retry policy. This isn't intended to be used directly.\n- **Fluent Client**: A code generated `Client<C, M, R>` that has methods for each service operation on it.\n  A fluent builder is generated alongside it to make construction easier.\n- **AWS Client**: A specialized Fluent Client that uses a `DynConnector`, `DefaultMiddleware`,\n  and `Standard` retry policy.\n\nAll of these are just called `Client` in code today. This is something that could be clarified in a separate refactor.\n\nRequirements\n------------\n\nWaiters must adhere to the [Smithy waiter specification]. To summarize:\n\n1. Waiters are specified by the Smithy `@waitable` trait\n2. Retry during polling must be exponential backoff with jitter, with the min/max delay times and\n   max attempts configured by the `@waitable` trait\n3. The SDK's built-in retry needs to be replaced by the waiter's retry since the Smithy model\n   can specify retry conditions that are contrary to the defaults. For example, an error that\n   would otherwise be retried by default might be the termination condition for the waiter.\n4. Classification of the response must be code generated based on the JMESPath expression in the model.\n\nWaiter API\n----------\n\nTo invoke a waiter, customers will only need to invoke a single function on the AWS Client. For example,\nif waiting for a S3 bucket to exist, it would look like the following:\n\n```rust,ignore\n// Request bucket creation\nclient.create_bucket()\n    .bucket_name(\"my-bucket\")\n    .send()\n    .await()?;\n\n// Wait for it to be created\nclient.wait_until_bucket_exists()\n    .bucket_name(\"my-bucket\")\n    .send()\n    .await?;\n```\n\nThe call to `wait_until_bucket_exists()` will return a waiter-specific fluent builder with a `send()` function\nthat will start the polling and return a future.\n\nTo avoid name conflicts with other API methods, the waiter functions can be added to the client via trait:\n\n```rust,ignore\npub trait WaitUntilBucketExists {\n    fn wait_until_bucket_exists(&self) -> crate::waiter::bucket_exists::Builder;\n}\n```\n\nThis trait would be implemented for the service's fluent client (which will necessitate making the fluent client's\n`handle` field `pub(crate)`).\n\nWaiter Implementation\n---------------------\n\nA waiter trait implementation will merely return a fluent builder:\n\n```rust,ignore\nimpl WaitUntilBucketExists for Client {\n    fn wait_until_bucket_exists(&self) -> crate::waiter::bucket_exists::Builder {\n        crate::waiter::bucket_exists::Builder::new()\n    }\n}\n```\n\nThis builder will have a short `send()` function to kick off the actual waiter implementation:\n\n```rust,ignore\nimpl Builder {\n    // ... existing fluent builder codegen can be reused to create all the setters and constructor\n\n    pub async fn send(self) -> Result<HeadBucketOutput, SdkError<HeadBucketError>> {\n        // Builds an input from this builder\n        let input = self.inner.build().map_err(|err| aws_smithy_http::result::SdkError::ConstructionFailure(err.into()))?;\n        // Passes in the client's handle, which contains a Smithy client and client config\n        crate::waiter::bucket_exists::wait(self.handle, input).await\n    }\n}\n```\n\nThis wait function needs to, in a loop similar to the pseudo-code in the beginning,\nconvert the given input into an operation, replace the default response classifier on it\nwith a no-retry classifier, and then determine what to do next based on that classification:\n\n```rust,ignore\npub async fn wait(\n    handle: Arc<Handle<DynConnector, DynMiddleware<DynConnector>, retry::Standard>>,\n    input: HeadBucketInput,\n) -> Result<HeadBucketOutput, SdkError<HeadBucketError>> {\n    loop {\n        let operation = input\n            .make_operation(&handle.conf)\n            .await\n            .map_err(|err| {\n                aws_smithy_http::result::SdkError::ConstructionFailure(err.into())\n            })?;\n        // Assume `ClassifyRetry` trait is implemented for `NeverRetry` to always return `RetryKind::Unnecessary`\n        let operation = operation.with_retry_classifier(NeverRetry::new());\n\n        let result = handle.client.call(operation).await;\n        match classify_result(&input, result) {\n            AcceptorState::Retry => {\n                // The sleep implementation is available here from `handle.conf.sleep_impl`\n                unimplemented!(\"Check if another attempt should be made and calculate delay time if so\")\n            }\n            AcceptorState::Terminate(output) => return output,\n        }\n    }\n}\n\nfn classify_result(\n    input: &HeadBucketInput,\n    result: Result<HeadBucketOutput, SdkError<HeadBucketError>>,\n) -> AcceptorState<HeadBucketOutput, SdkError<HeadBucketError>> {\n    unimplemented!(\n        \"The Smithy model would dictate conditions to check here to produce an `AcceptorState`\"\n    )\n}\n```\n\nThe retry delay time should be calculated by the same exponential backoff with jitter code that the\n[default `RetryHandler` uses in `aws-smithy-client`]. This function will need to be split up and made\navailable to the waiter implementations so that just the delay can be calculated.\n\nChanges Checklist\n-----------------\n\n- [ ] Codegen fluent builders for waiter input and their `send()` functions\n- [ ] Codegen waiter invocation traits\n- [ ] Commonize exponential backoff with jitter delay calculation\n- [ ] Codegen `wait()` functions with delay and max attempts configuration from Smithy model\n- [ ] Codegen `classify_result()` functions based on JMESPath expressions in Smithy model\n\n[Smithy waiter specification]: https://awslabs.github.io/smithy/1.0/spec/waiters.html\n[default `RetryHandler` uses in `aws-smithy-client`]: https://github.com/smithy-lang/smithy-rs/blob/main/rust-runtime/aws-smithy-client/src/retry.rs#L252-L292\n"
  },
  {
    "path": "design/src/rfcs/rfc0011_crates_io_alpha_publishing.md",
    "content": "RFC: Publishing the Alpha SDK to Crates.io\n==========================================\n\n> Status: Implemented\n\nThe AWS SDK for Rust and its supporting Smithy crates need to be published to [crates.io](https://crates.io/)\nso that customers can include them in their projects and also publish crates of their own that depend on them.\n\nThis doc proposes a short-term solution for publishing to crates.io. This approach is intended to be executed\nmanually by a developer using scripts and an SOP no more than once per week, and should require less than a\ndev week to implement.\n\nTerminology\n-----------\n\n- **AWS SDK Crate**: A crate that provides a client for calling a given AWS service, such as `aws-sdk-s3` for calling S3.\n- **AWS Runtime Crate**: Any runtime crate that the AWS SDK generated code relies on, such as `aws-types`.\n- **Smithy Runtime Crate**: Any runtime crate that the smithy-rs generated code relies on, such as `smithy-types`.\n\nRequirements\n------------\n\n### Versioning\n\nCargo uses [semver](https://github.com/dtolnay/semver#requirements) for versioning,\nwith a `major.minor.patch-pre` format:\n- `major`: Incompatible API changes\n- `minor`: Added functionality in backwards compatible manner\n- `patch`: Backwards compatible bug fixes\n- `pre`: Pre-release version tag (omitted for normal releases)\n\nFor now, AWS SDK crates (including `aws-config`) will maintain a consistent `major` and `minor` version number\nacross all services. The latest version of `aws-sdk-s3` will always have the same `major.minor` version as the\nlatest `aws-sdk-dynamodb`, for example. The `patch` version is allowed to be different between service crates,\nbut it is unlikely that we will make use of `patch` versions throughout alpha and dev preview.\nSmithy runtime crates will have different version numbers from the AWS SDK crates, but will also maintain\na consistent `major.minor`.\n\nThe `pre` version tag will be `alpha` during the Rust SDK alpha, and will be removed once the SDK is in\ndev preview.\n\nDuring alpha, the `major` version will always be 0, and the `minor` will be bumped for all published\ncrates for every release. A later RFC may change the process during dev preview.\n\n### Yanking\n\nMistakes will inevitably be made, and a mechanism is needed to yank packages while keeping the latest version\nof the SDK successfully consumable from crates.io. To keep this simple, the entire published batch of crates\nwill be yanked if any crate in that batch needs to be yanked. For example, if 260 crates were published in a batch,\nand it turns out there's a problem that requires yanking one of them, then all 260 will be yanked. Attempting to do\npartial yanking will require a lot of effort and be difficult to get right. Yanking should be a last resort.\n\nConcrete Scenarios\n------------------\n\nThe following changes will be bundled together as a `minor` version bump during weekly releases:\n\n- AWS model updates\n- New features\n- Bug fixes in runtime crates or codegen\n\nIn exceptional circumstances, a `patch` version will be issued if the fix doesn't require API breaking changes:\n\n- CVE discovered in a runtime crate\n- Buggy update to a runtime crate\n\nIn the event of a CVE being discovered in an external dependency, if the external dependency is\ninternal to a crate, then a `patch` revision can be issued for that crate to correct it. Otherwise if the CVE\nis in a dependency that is part of the public API, a `minor` revision will be issued with an expedited release.\n\nFor a CVE in generated code, a `minor` revision will be issued with an expedited release.\n\nProposal\n--------\n\nThe short-term approach builds off our pre-crates.io weekly release process. That process was the following:\n\n1. Run script to update AWS models\n2. Manually update AWS SDK version in `aws/sdk/gradle.properties` in smithy-rs\n3. Tag smithy-rs\n4. Wait for GitHub actions to generate AWS SDK using newly released smithy-rs\n5. Check out aws-sdk-rust, delete existing SDK code, unzip generated SDK in place, and update readme\n6. Tag aws-sdk-rust\n\nTo keep things simple:\n- The Smithy runtime crates will have the same smithy-rs version\n- All AWS crates will have the same AWS SDK version\n- `patch` revisions are exceptional and will be one-off manually published by a developer\n\nAll runtime crate version numbers in smithy-rs will be locked at `0.0.0-smithy-rs-head`. This is a fake\nversion number that gets replaced when generating the SDK.\n\nThe SDK generator script in smithy-rs will be updated to:\n- Replace Smithy runtime crate versions with the smithy-rs version from `aws/sdk/gradle.properties`\n- Replace AWS runtime crate versions with AWS SDK version from `aws/sdk/gradle.properties`\n- Add correct version numbers to all path dependencies in all the final crates that end up in the build artifacts\n\nThis will result in all the crates having the correct version and manifests when imported into aws-sdk-rust.\nFrom there, a script needs to be written to determine crate dependency order, and publish crates (preferably\nwith throttling and retry) in the correct order. This script needs to be able to recover from an interruption\npart way through publishing all the crates, and it also needs to output a list of all crate versions published\ntogether. This crate list will be commented on the release issue so that yanking the batch can be done if\nnecessary.\n\nThe new release process would be:\n\n1. Run script to update AWS models\n2. Manually update _both_ the AWS SDK version _and_ the smithy-rs version in `aws/sdk/gradle.properties` in smithy-rs\n3. Tag smithy-rs\n4. Wait for automation to sync changes to `aws-sdk-rust/next`\n5. Cut a PR to merge `aws-sdk-rust/next` into `aws-sdk-rust/main`\n6. Tag aws-sdk-rust\n7. Run publish script\n\n### Short-term Changes Checklist\n\n- [x] Prepare runtime crate manifests for publication to crates.io (https://github.com/smithy-lang/smithy-rs/pull/755)\n- [x] Update SDK generator to set correct crate versions (https://github.com/smithy-lang/smithy-rs/pull/755)\n- [x] Write bulk publish script\n- [x] Write bulk yank script\n- [x] Write automation to sync smithy-rs to aws-sdk-rust\n"
  },
  {
    "path": "design/src/rfcs/rfc0012_independent_crate_versioning.md",
    "content": "RFC: Independent Crate Versioning\n=================================\n\n> Status: RFC\n\nDuring its alpha and dev preview releases, the AWS SDK for Rust adopted [a short-term solution\nfor versioning and publishing to crates.io](./rfc0011_crates_io_alpha_publishing.md).\nThis doc proposes a long-term versioning strategy that will carry the SDK from dev preview\ninto general availability.\n\nThis strategy will be implemented in two phases:\n1. __Dev Preview__: The SDK will break with its current version strategy\n   of maintaining consistent `major.minor` version numbers.\n2. __Stability and 1.x__: This phase begins when the SDK becomes generally available. The\n   major version will be bumped to 1, and backwards breaking changes will no longer be allowed\n   without a major version bump to all crates in the SDK.\n\nTerminology\n-----------\n\n- **AWS SDK Crate**: A crate that provides a client for calling a given AWS service, such as `aws-sdk-s3` for calling S3.\n- **AWS Runtime Crate**: Any runtime crate that the AWS SDK generated code relies on, such as `aws-types`.\n- **Smithy Runtime Crate**: Any runtime crate that the [smithy-rs] generated code relies on, such as `smithy-types`.\n\nRequirements\n------------\n\n### Versioning\n\nCargo uses [semver] for versioning, with a `major.minor.patch-pre` format:\n- `major`: Incompatible API changes\n- `minor`: Added functionality in backwards compatible manner\n- `patch`: Backwards compatible bug fixes\n- `pre`: Pre-release version tag (omitted for normal releases)\n\nIn the new versioning strategy, the `minor` version number will no longer be coordinated across\nall SDK and Smithy runtime crates.\n\nDuring phases 1 and 2, the `major` version will always be 0, and the following scheme will be used:\n- `minor`:\n  - New features\n  - Breaking changes\n  - Dependency updates for dependencies that are part of the public API\n  - Model updates with API changes\n  - For code-generated crates: when a newer version of [smithy-rs] is used to generate the crate\n- `patch`:\n  - Bug fixes that do not break backwards compatibility\n  - Model updates that _only_ have documentation changes\n\nDuring phase 3:\n- `major`: Breaking changes\n- `minor`:\n    - Changes that aren't breaking\n    - Dependency updates for dependencies that are part of the public API\n    - Model updates with API changes\n    - For code-generated crates: when a newer version of [smithy-rs] is used to generate the crate\n- `patch`:\n    - Bug fixes that do not break backwards compatibility\n    - Model updates that _only_ have documentation changes\n\nDuring phase 3, bumps to the `major` version must be coordinated across all SDK and runtime crates.\n\n### Release Identification\n\nSince there will no longer be one SDK \"version\", release tags will be dates in `YYYY-MM-DD` format\nrather than version numbers. Additionally, the SDK's user agent string will need to include a separate\nservice version number (this requirement has already been implemented).\n\n### Yanking\n\nIt must be possible to yank an entire release with a single action. The publisher tool must\nbe updated to understand which crate versions were released with a given release tag, and be able to\nyank all the crates published from that tag.\n\nPhase 1: Dev Preview\n--------------------\n\nPhase 1 will address the following challenges introduced by uncoordinating the `major.minor` versions:\n- Tracking of versions associated with a release tag\n- Creation of version bump process for code generated crates\n- Enforcement of version bump process in runtime crates\n- Yanking of versions associated with a release tag\n\n### Version Tracking\n\nA new manifest file will be introduced in the root of [aws-sdk-rust] named `versions.toml` that describes\nall versioning information for any given commit in the repository. In the main branch, the `versions.toml`\nin tagged commits will become the source of truth for which crate versions belong to that release, as well\nas additional metadata that's required for maintaining version process in the future.\n\nThe special `0.0.0-smithy-rs-head` version that is used prior to Phase 1 for maintaining the runtime crate\nversions will no longer be used (as detailed in [Versioning for Runtime Crates](#versioning-for-runtime-crates)).\n\nThis format will look as follows:\n```toml\nsmithy_rs_version = \"<release-tag|commit-hash>\"\n\n[aws-smithy-types]\nversion = \"0.50.1\"\n\n[aws-config]\nversion = \"0.40.0\"\n\n[aws-sdk-s3]\nversion = \"0.89.0\"\nmodel_hash = \"<hash>\"\n\n# ...\n```\n\nThe auto-sync tool is responsible for maintaining this file. When it generates a new SDK, it will take\nthe version numbers from runtime crates directly, and it will use the rules from the next section to determine\nthe version numbers for the generated crates.\n\n### Versioning for Code Generated (SDK Service) Crates\n\nCode generated crates will have their `minor` version bumped when the version of [smithy-rs] used to generate\nthem changes, or when model updates with API changes are made. Three pieces of information are required to\nhandle this process: the previously released version number, the [smithy-rs] version used to generate the code,\nand the level of model updates being applied. For this last one, if there are multiple model updates that\naffect only documentation, but then one model update that affects an API, then as a whole they will be\nconsidered as affecting an API and require a `minor` version bump.\n\nThe previously released version number will be retrieved from crates.io using its API. The [smithy-rs] version\nused during code generation will become a build artifact that is saved to `versions.toml` in [aws-sdk-rust].\nDuring phase 1, the tooling required to know if a model is a documentation-only change will not be available,\nso all model changes will result in a `minor` version bump during this phase.\n\nOverall, determining a generated crate's version number looks as follows:\n\n```mermaid\nflowchart TD\n    start[Generate crate version] --> smithyrschanged{A. smithy-rs changed?}\n    smithyrschanged -- Yes --> minor1[Minor version bump]\n    smithyrschanged -- No --> modelchanged{B. model changed?}\n    modelchanged -- Yes --> minor2[Minor version bump]\n    modelchanged -- No --> keep[Keep current version]\n```\n\n- __A: smithy-rs changed?__: Compare the `smithy_rs_version` in the previous `versions.toml` with the\n  next `versions.toml` file, and if the values are different, consider [smithy-rs] to have changed.\n- __B: model changed?__: Similarly, compare the `model_hash` for the crate in `versions.toml`.\n\n### Versioning for Runtime Crates\n\nThe old scheme of all runtime crates in [smithy-rs] having a fake `0.0.0-smithy-rs-head` version number with\na build step to replace those with a consistent `major.minor` will be removed. These runtime crates will begin\nhaving their actual next version number in the Cargo.toml file in smithy-rs.\n\nThis introduces a new problem where a developer can forget to bump a runtime crate version, so a method of\nprocess enforcement needs to be introduced. This will be done through CI when merging into `smithy-rs/main`\nand repeated when merging into `aws-sdk-rust/main`.\n\nThe following checks need to be run for runtime crates:\n\n```mermaid\nflowchart TD\n    A[Check runtime crate] --> B{A. Crate has changed?}\n    B -- Yes --> C{B. Minor bumped?}\n    B -- No --> H{C. Version changed?}\n    C -- Yes --> K[Pass]\n    C -- No --> E{D. Patch bumped?}\n    E -- Yes --> F{E. Semverver passes?}\n    E -- No --> L[Fail]\n    F -- Yes --> D[Pass]\n    F -- No --> G[Fail]\n    H -- Yes --> I[Fail]\n    H -- No --> J[Pass]\n```\n- __A: Crate has changed?__ The crate's source files and manifest will be hashed for the previous version\n  and the next version. If these hashes match, then the crate is considered unchanged.\n- __B: Minor bumped?__ The previous version is compared against the next version to see if the minor version\n  number was bumped.\n- __C: Version changed?__ The previous version is compared against the next version to see if it changed.\n- __D: Patch bumped?__ The previous version is compared against the next version to see if the patch version\n  number was bumped.\n- __E: Semverver passes?__ Runs [rust-semverver] against the old and new versions of the crate.\n  - If semverver fails to run (for example, if it needs to be updated to the latest nightly to succeed),\n    then fail CI saying that either semverver needs maintenance, or that a minor version bump is required.\n  - If semverver results in errors, fail CI indicating a minor version bump is required.\n  - If semverver passes, then pass CI.\n\nWhen running semverver, the path dependencies of the crate under examination should be updated to be crates.io\nreferences if there were no changes in those crates since the last public to crates.io. Otherwise, the types\nreferenced from those crates in the public API will always result in breaking changes since, as far as the Rust\ncompiler is concerned, they are different types originating from separate path-dependency crates.\n\nFor CI, the `aws-sdk-rust/main` branch's `versions.toml` file is the source of truth for the previous release's\ncrate versions and source code.\n\n### Yanking\n\nThe publisher tool will be updated to read the `versions.toml` to yank all versions published in a release.\nThis process will look as follows:\n1. Take a path to a local clone of the [aws-sdk-rust] repository\n2. Confirm the working tree is currently unmodified and on a release tag.\n3. Read `versions.toml` and print out summary of crates to yank\n4. Confirm with user before proceeding\n5. Yank crates\n\n### Changes Checklist\n\n- [ ] Update `rust-semverver` to a newer nightly that can compile `aws-smithy-client`\n- [ ] Establish initial `versions.toml` in `aws-sdk-rust/main`\n- [ ] Set version numbers in runtime crates in [smithy-rs]\n- [ ] Update the auto-sync tool to generate `versions.toml`\n- [ ] Create CI tool to check runtime crate version\n  - [ ] Integrate with `smithy-rs/main` CI\n  - [ ] Integrate with `aws-sdk-rust/main` CI\n- [ ] Update CI to verify no older runtime crates are used. For example, if `aws-smithy-client` is bumped to\n      `0.50.0`, then verify no crates (generated or runtime) depend on `0.49.0` or lower.\n\n**Estimate:** 2-4 dev weeks\n\nPhase 2: Stability and 1.x\n--------------------------\n\nWhen stabilizing to 1.x, the version process will stay the same, but the minor version bumps caused by version\nbumping runtime crates, updating models, or changing the code generator will be candidate for automatic upgrade\nper semver. At that point, no further API breaking changes can be made without a major version bump.\n\n[aws-sdk-rust]: https://github.com/awslabs/aws-sdk-rust\n[rust-semverver]: https://github.com/rust-lang/rust-semverver\n[semver]: https://semver.org/\n[smithy-rs]: https://github.com/smithy-lang/smithy-rs\n"
  },
  {
    "path": "design/src/rfcs/rfc0013_body_callback_apis.md",
    "content": "RFC: Callback APIs for `ByteStream` and `SdkBody`\n=================================================\n\n> Status: RFC\n\nAdding a callback API to `ByteStream` and `SdkBody` will enable developers using the SDK to implement things like checksum validations and 'read progress' callbacks.\n\n## The Implementation\n\n*Note that comments starting with '//' are not necessarily going to be included in the actual implementation and are intended as clarifying comments for the purposes of this RFC.*\n\n```rust,ignore\n// in aws_smithy_http::callbacks...\n\n/// A callback that, when inserted into a request body, will be called for corresponding lifecycle events.\ntrait BodyCallback: Send {\n   /// This lifecycle function is called for each chunk **successfully** read. If an error occurs while reading a chunk,\n   /// this method will not be called. This method takes `&mut self` so that implementors may modify an implementing\n   /// struct/enum's internal state. Implementors may return an error.\n   fn update(&mut self, #[allow(unused_variables)] bytes: &[u8]) -> Result<(), BoxError> { Ok(()) }\n\n   /// This callback is called once all chunks have been read. If the callback encountered one or more errors\n   /// while running `update`s, this is how those errors are raised. Implementors may return a [`HeaderMap`][HeaderMap]\n   /// that will be appended to the HTTP body as a trailer. This is only useful to do for streaming requests.\n   fn trailers(&self) -> Result<Option<HeaderMap<HeaderValue>>, BoxError> { Ok(None) }\n\n   /// Create a new `BodyCallback` from an existing one. This is called when a `BodyCallback` needs to be\n   /// re-initialized with default state. For example: when a request has a body that needs to be\n   /// rebuilt, all callbacks for that body need to be run again but with a fresh internal state.\n   fn make_new(&self) -> Box<dyn BodyCallback>;\n}\n\nimpl BodyCallback for Box<dyn BodyCallback> {\n   fn update(&mut self, bytes: &[u8]) -> Result<(), BoxError> { BodyCallback::update(self, bytes) }\n   fn trailers(&self) -> Result<Option<HeaderMap<HeaderValue>>, BoxError> { BodyCallback::trailers(self) }\n   fn make_new(&self) -> Box<dyn SendCallback> { BodyCallback::make_new(self) }\n}\n```\n\nThe changes we need to make to `ByteStream`:\n\n*(The current version of `ByteStream` and `Inner` can be seen [here][ByteStream impls].)*\n\n```rust,ignore\n// in `aws_smithy_http::byte_stream`...\n\n// We add a new method to `ByteStream` for inserting callbacks\nimpl ByteStream {\n    // ...other impls omitted\n\n    // A \"builder-style\" method for setting callbacks\n    pub fn with_body_callback(&mut self, body_callback: Box<dyn BodyCallback>) -> &mut Self {\n        self.inner.with_body_callback(body_callback);\n        self\n    }\n}\n\nimpl Inner<SdkBody> {\n    // `Inner` wraps an `SdkBody` which has a \"builder-style\" function for adding callbacks.\n    pub fn with_body_callback(&mut self, body_callback: Box<dyn BodyCallback>) -> &mut Self {\n        self.body.with_body_callback(body_callback);\n        self\n    }\n}\n```\n\nThe changes we need to make to `SdkBody`:\n\n*(The current version of `SdkBody` can be seen [here][SdkBody impls].)*\n\n```rust,ignore\n// In aws_smithy_http::body...\n\n#[pin_project]\npub struct SdkBody {\n    #[pin]\n    inner: Inner,\n    rebuild: Option<Arc<dyn (Fn() -> Inner) + Send + Sync>>,\n    // We add a `Vec` to store the callbacks\n    #[pin]\n    callbacks: Vec<Box<dyn BodyCallback>>,\n}\n\nimpl SdkBody {\n    // We update the various fns that create `SdkBody`s to create an empty `Vec` to store callbacks.\n    // Those updates are very simple so I've omitted them from this code example.\n\n    fn poll_inner(\n        self: Pin<&mut Self>,\n        cx: &mut Context<'_>,\n    ) -> Poll<Option<Result<Bytes, Error>>> {\n        let mut this = self.project();\n        // This block is old. I've included for context.\n        let polling_result = match this.inner.project() {\n            InnerProj::Once(ref mut opt) => {\n                let data = opt.take();\n                match data {\n                    Some(bytes) if bytes.is_empty() => Poll::Ready(None),\n                    Some(bytes) => Poll::Ready(Some(Ok(bytes))),\n                    None => Poll::Ready(None),\n                }\n            }\n            InnerProj::Streaming(body) => body.poll_data(cx).map_err(|e| e.into()),\n            InnerProj::Dyn(box_body) => box_body.poll_data(cx),\n            InnerProj::Taken => {\n                Poll::Ready(Some(Err(\"A `Taken` body should never be polled\".into())))\n            }\n        };\n\n        // This block is new.\n        match &polling_result {\n            // When we get some bytes back from polling, pass those bytes to each callback in turn\n            Poll::Ready(Some(Ok(bytes))) => {\n               for callback in this.callbacks.iter_mut() {\n                  // Callbacks can run into errors when reading bytes. They'll be surfaced here\n                  callback.update(bytes)?;\n               }\n            }\n            // When we're done polling for bytes, run each callback's `trailers()` method. If any calls to\n            // `trailers()` return an error, propagate that error up. Otherwise, continue.\n            Poll::Ready(None) => {\n                for callback_result in this.callbacks.iter().map(BodyCallback::trailers) {\n                    if let Err(e) = callback_result {\n                        return Poll::Ready(Some(Err(e)));\n                    }\n                }\n            }\n            _ => (),\n        }\n\n        // Now that we've inspected the polling result, all that's left to do is to return it.\n        polling_result\n    }\n\n    // This function now has the added responsibility of cloning callback functions (but with fresh state)\n    // in the case that the `SdkBody` needs to be rebuilt.\n    pub fn try_clone(&self) -> Option<Self> {\n        self.rebuild.as_ref().map(|rebuild| {\n            let next = rebuild();\n            let callbacks = self\n                .callbacks\n                .iter()\n                .map(Callback::make_new)\n                .collect();\n\n            Self {\n                inner: next,\n                rebuild: self.rebuild.clone(),\n                callbacks,\n            }\n        })\n    }\n\n    pub fn with_callback(&mut self, callback: BodyCallback) -> &mut Self {\n        self.callbacks.push(callback);\n        self\n    }\n}\n\n/// Given two [`HeaderMap`][HeaderMap]s, merge them together and return the merged `HeaderMap`. If the\n/// two `HeaderMap`s share any keys, values from the right `HeaderMap` be appended to the left `HeaderMap`.\n///\n/// # Example\n///\n/// ```rust\n/// let header_name = HeaderName::from_static(\"some_key\");\n///\n/// let mut left_hand_side_headers = HeaderMap::new();\n/// left_hand_side_headers.insert(\n///     header_name.clone(),\n///     HeaderValue::from_str(\"lhs value\").unwrap(),\n/// );\n///\n/// let mut right_hand_side_headers = HeaderMap::new();\n/// right_hand_side_headers.insert(\n///     header_name.clone(),\n///     HeaderValue::from_str(\"rhs value\").unwrap(),\n/// );\n///\n/// let merged_header_map =\n///     append_merge_header_maps(left_hand_side_headers, right_hand_side_headers);\n/// let merged_values: Vec<_> = merged_header_map\n///     .get_all(header_name.clone())\n///     .into_iter()\n///     .collect();\n///\n/// // Will print 'some_key: [\"lhs value\", \"rhs value\"]'\n/// println!(\"{}: {:?}\", header_name.as_str(), merged_values);\n/// ```\nfn append_merge_header_maps(\n    mut lhs: HeaderMap<HeaderValue>,\n    rhs: HeaderMap<HeaderValue>,\n) -> HeaderMap<HeaderValue> {\n    let mut last_header_name_seen = None;\n    for (header_name, header_value) in rhs.into_iter() {\n        // For each yielded item that has None provided for the `HeaderName`,\n        // then the associated header name is the same as that of the previously\n        // yielded item. The first yielded item will have `HeaderName` set.\n        // https://docs.rs/http/latest/http/header/struct.HeaderMap.html#method.into_iter-2\n        match (&mut last_header_name_seen, header_name) {\n            (_, Some(header_name)) => {\n                lhs.append(header_name.clone(), header_value);\n                last_header_name_seen = Some(header_name);\n            }\n            (Some(header_name), None) => {\n                lhs.append(header_name.clone(), header_value);\n            }\n            (None, None) => unreachable!(),\n        };\n    }\n\n    lhs\n}\n\nimpl http_body::Body for SdkBody {\n    // The other methods have been omitted because they haven't changed\n\n    fn poll_trailers(\n        self: Pin<&mut Self>,\n        _cx: &mut Context<'_>,\n    ) -> Poll<Result<Option<HeaderMap<HeaderValue>>, Self::Error>> {\n        let header_map = self\n            .callbacks\n            .iter()\n            .filter_map(|callback| {\n                match callback.trailers() {\n                    Ok(optional_header_map) => optional_header_map,\n                    // early return if a callback encountered an error\n                    Err(e) => { return e },\n                }\n            })\n            // Merge any `HeaderMap`s from the last step together, one by one.\n            .reduce(append_merge_header_maps);\n\n        Poll::Ready(Ok(header_map))\n    }\n}\n```\n\n## Implementing Checksums\n\nWhat follows is a simplified example of how this API could be used to introduce checksum validation for outgoing request payloads. In this example, the checksum calculation is fallible and no validation takes place. All it does it calculate\nthe checksum of some data and then returns the checksum of that data when `trailers` is called. This is fine because it's\nbeing used to calculate the checksum of a streaming body for a request.\n\n```rust,ignore\n#[derive(Default)]\nstruct Crc32cChecksumCallback {\n    state: Option<u32>,\n}\n\nimpl ReadCallback for Crc32cChecksumCallback {\n    fn update(&mut self, bytes: &[u8]) -> Result<(), BoxError> {\n        self.state = match self.state {\n            Some(crc) => { self.state = Some(crc32c_append(crc, bytes)) }\n            None => { Some(crc32c(&bytes)) }\n        };\n\n       Ok(())\n    }\n\n    fn trailers(&self) ->\n    Result<Option<HeaderMap<HeaderValue>>,\n          Box<dyn std::error::Error + Send + Sync>>\n    {\n        let mut header_map = HeaderMap::new();\n        // This checksum name is an Amazon standard and would be a `const` in the real implementation\n        let key = HeaderName::from_static(\"x-amz-checksum-crc32c\");\n        // If no data was provided to this callback and no CRC was ever calculated, we return zero as the checksum.\n        let crc = self.state.unwrap_or_default();\n        // Convert the CRC to a string, base 64 encode it, and then convert it into a `HeaderValue`.\n        let value = HeaderValue::from_str(&base64::encode(crc.to_string())).expect(\"base64 will always produce valid header values\");\n\n        header_map.insert(key, value);\n\n        Some(header_map)\n    }\n\n    fn make_new(&self) -> Box<dyn ReadCallback> {\n        Box::new(Crc32cChecksumCallback::default())\n    }\n}\n```\n\n*NOTE: If `Crc32cChecksumCallback` needed to validate a response, then we could modify it to check its internal state against a target checksum value and calling `trailers` would produce an error if the values didn't match.*\n\nIn order to use this in a request, we'd modify codegen for that request's service.\n\n1. We'd check if the user had requested validation and also check if they'd pre-calculated a checksum.\n2. If validation was requested but no pre-calculated checksum was given, we'd create a callback similar to the one above\n3. Then, we'd create a new checksum callback and:\n   - (if streaming) we'd set the checksum callback on the request body object\n   - (if non-streaming) we'd immediately read the body and call `BodyCallback::update` manually. Once all data was read, we'd get the checksum by calling `trailers` and insert that data as a request header.\n\n[ByteStream impls]: https://github.com/smithy-lang/smithy-rs/blob/f76bc159bf16510a0873f5fba691cb05816f4192/rust-runtime/aws-smithy-http/src/byte_stream.rs#L205\n[SdkBody impls]: https://github.com/smithy-lang/smithy-rs/blob/f76bc159bf16510a0873f5fba691cb05816f4192/rust-runtime/aws-smithy-http/src/body.rs#L71\n"
  },
  {
    "path": "design/src/rfcs/rfc0014_timeout_config.md",
    "content": "RFC: Fine-grained timeout configuration\n=======================================\n\n> Status: Implemented\n\nFor a summarized list of proposed changes, see the [Changes Checklist](#changes-checklist) section.\n\nWhile it is currently possible for users to implement request timeouts by racing operation send futures against timeout futures, this RFC proposes a more ergonomic solution that would also enable users to set timeouts for things like TLS negotiation and \"time to first byte\".\n\nTerminology\n-----------\n\nThere's a lot of terminology to define, so I've broken it up into three sections.\n\n### General terms\n\n- **Smithy Client**: A `aws_smithy_client::Client<C, M, R>` struct that is responsible for gluing together the connector, middleware, and retry policy. This is not generated and lives in the `aws-smithy-client` crate.\n- **Fluent Client**: A code-generated `Client<C, M, R>` that has methods for each service operation on it. A fluent builder is generated alongside it to make construction easier.\n- **AWS Client**: A specialized Fluent Client that defaults to using a `DynConnector`, `AwsMiddleware`, and `Standard` retry policy.\n- **Shared Config**: An `aws_types::Config` struct that is responsible for storing shared configuration data that is used across all services. This is not generated and lives in the `aws-types` crate.\n- **Service-specific Config**: A code-generated `Config` that has methods for setting service-specific configuration. Each `Config` is defined in the `config` module of its parent service. For example, the S3-specific config struct  is `use`able from `aws_sdk_s3::config::Config` and re-exported as `aws_sdk_s3::Config`. In this case, \"service\" refers to an AWS offering like S3.\n\n### HTTP stack terms\n\n- **Service**: A trait defined in the [`tower-service` crate][tower_service::Service]. The lowest level of abstraction we deal with when making HTTP requests. Services act directly on data to transform and modify that data. A Service is what eventually turns a request into a response.\n- **Layer**: Layers are a higher-order abstraction over services that is used to compose multiple services together, creating a new service from that combination. Nothing prevents us from manually wrapping services within services, but Layers allow us to do it in a flexible and generic manner. Layers don't directly act on data but instead can wrap an existing service with additional functionality, creating a new service. Layers can be thought of as middleware. *NOTE: The use of [Layers can produce compiler errors] that are difficult to interpret and defining a layer requires a large amount of boilerplate code.*\n- **Middleware**: a term with several meanings,\n  - Generically speaking, middleware are similar to Services and Layers in that they modify requests and responses.\n  - In the SDK, \"Middleware\" refers to a layer that can be wrapped around a `DispatchService`. In practice, this means that the resulting `Service` (and the inner service) must meet the bound `T: where T: Service<operation::Request, Response=operation::Response, Error=SendOperationError>`.\n    - _Note: This doesn't apply to the middlewares we use when generating presigned request because those don't wrap a `DispatchService`._\n  - The most notable example of a Middleware is the [AwsMiddleware]. Other notable examples include [MapRequest], [AsyncMapRequest], and [ParseResponse].\n- **DispatchService**: The innermost part of a group of nested services. The Service that actually makes an HTTP call on behalf of a request. Responsible for parsing success and error responses.\n- **Connector**: a term with several meanings,\n  - DynConnectors (a struct that implements [DynConnect]) are Services with their specific type erased so that we can do dynamic dispatch.\n  - A term from `hyper` for any object that implements the [Connect] trait. Really just an alias for [tower_service::Service]. Sometimes referred to as a `Connection`.\n- **Stage**: A form of middleware that's not related to `tower`. These currently function as a way of transforming requests and don't have the ability to transform responses.\n- **Stack**: higher order abstraction over Layers defined in the [tower crate][tower::layer::util::Stack] e.g. Layers wrap services in one another and Stacks wrap layers within one another.\n\n### Timeout terms\n\n- **Connect Timeout**: A limit on the amount of time after making an initial connect attempt on a socket to complete the\n  connect-handshake.\n    - _TODO: the runtime is based on Hyper which reuses connection and doesn't currently have a way of guaranteeing that\n      a fresh connection will be use for a given request._\n- **TLS Negotiation Timeout**: A limit on the amount of time a TLS handshake takes from when the CLIENT HELLO message is\n  sent to the time the client and server have fully negotiated ciphers and exchanged keys.\n- **Time to First Byte Timeout**: _Sometimes referred to as a \"read timeout.\"_ A limit on the amount of time an application takes to attempt to read the first byte over\n  an established, open connection after write request.\n- **HTTP Request Timeout For A Single Attempt**: A limit on the amount of time it takes for the first byte to be sent over\n  an established, open connection and when the last byte is received from the service.\n- **HTTP Request Timeout For Multiple Attempts**: This timeout acts like the previous timeout but constrains the total time\n  it takes to make a request plus any retries.\n    - _NOTE: In a way, this is already possible in that users are free to race requests against timer futures with\n      the [futures::future::select] macro or to use [tokio::time::timeout]. See relevant discussion in [hyper#1097]_\n\nConfiguring timeouts\n--------------------\n\nJust like with [Retry Behavior Configuration], these settings can be configured in several places and have the same\nprecedence rules _(paraphrased here for clarity)_.\n\n1. Service-specific config builders\n2. Shared config builders\n3. Environment variables\n4. Profile config file (e.g., `~/.aws/credentials`)\n\nThe above list is in order of decreasing precedence e.g. configuration set in an app will override values from\nenvironment variables.\n\n### Configuration options\n\nThe table below details the specific ways each timeout can be configured. In all cases, valid values are non-negative floats representing the number of seconds before a timeout is triggered.\n\n| Timeout                       | Environment Variable         | AWS Config Variable      | Builder Method           |\n| ----------------------------- | ---------------------------- | ------------------------ | ------------------------ |\n| Connect                       | AWS_CONNECT_TIMEOUT          | connect_timeout          | connect_timeout          |\n| TLS Negotiation               | AWS_TLS_NEGOTIATION_TIMEOUT  | tls_negotiation_timeout  | tls_negotiation_timeout  |\n| Time To First Byte            | AWS_READ_TIMEOUT             | read_timeout             | read_timeout             |\n| HTTP Request - single attempt | AWS_API_CALL_ATTEMPT_TIMEOUT | api_call_attempt_timeout | api_call_attempt_timeout |\n| HTTP Request - all attempts   | AWS_API_CALL_TIMEOUT         | api_call_timeout         | api_call_timeout         |\n\n### SDK-specific defaults set by AWS service teams\n\n_QUESTION: How does the SDK currently handle these defaults?_\n\nPrior Art\n---------\n\n- [hjr3/hyper-timeout] is a `Connector` for hyper that enables setting connect, read, and write timeouts\n- [sfackler/tokio-io-timeout] provides timeouts for tokio IO operations. Used within `hyper-timeout`.\n- [tokio::time::sleep_until] creates a `Future` that completes after some time has elapsed. Used within `tokio-io-timeout`.\n\nBehind the scenes\n-----------------\n\nTimeouts are achieved by racing a future against a `tokio::time::Sleep` future. The question, then, is \"how can I create a future that represents a condition I want to watch for?\". For example, in the case of a `ConnectTimeout`, how do we watch an ongoing request to see if it's completed the connect-handshake? Our current stack of Middleware acts on requests at different levels of granularity. The timeout Middlewares will be no different.\n\n### Middlewares for AWS Client requests\n\n_View [AwsMiddleware] in GitHub_\n\n```rust,ignore\n#[derive(Debug, Default)]\n#[non_exhaustive]\npub struct AwsMiddleware;\nimpl<S> tower::Layer<S> for AwsMiddleware {\n  type Service = <AwsMiddlewareStack as tower::Layer<S>>::Service;\n\n  fn layer(&self, inner: S) -> Self::Service {\n    let credential_provider = AsyncMapRequestLayer::for_mapper(CredentialsStage::new());\n    let signer = MapRequestLayer::for_mapper(SigV4SigningStage::new(SigV4Signer::new()));\n    let endpoint_resolver = MapRequestLayer::for_mapper(AwsAuthStage);\n    let user_agent = MapRequestLayer::for_mapper(UserAgentStage::new());\n    ServiceBuilder::new()\n            .layer(endpoint_resolver)\n            .layer(user_agent)\n            .layer(credential_provider)\n            .layer(signer)\n            .service(inner)\n  }\n}\n```\n\nThe above code is only included for context. This RFC doesn't define any timeouts specific to AWS so `AwsMiddleware` won't require any changes.\n\n### Middlewares for Smithy Client requests\n\n_View [aws_smithy_client::Client::call_raw] in GitHub_\n\n```rust,ignore\nimpl<C, M, R> Client<C, M, R>\n  where\n          C: bounds::SmithyConnector,\n          M: bounds::SmithyMiddleware<C>,\n          R: retry::NewRequestPolicy,\n{\n  // ...other methods omitted\n  pub async fn call_raw<O, T, E, Retry>(\n    &self,\n    input: Operation<O, Retry>,\n  ) -> Result<SdkSuccess<T>, SdkError<E>>\n    where\n            R::Policy: bounds::SmithyRetryPolicy<O, T, E, Retry>,\n            bounds::Parsed<<M as bounds::SmithyMiddleware<C>>::Service, O, Retry>:\n            Service<Operation<O, Retry>, Response=SdkSuccess<T>, Error=SdkError<E>> + Clone,\n  {\n    let connector = self.connector.clone();\n\n    let mut svc = ServiceBuilder::new()\n            // Create a new request-scoped policy\n            .retry(self.retry_policy.new_request_policy())\n            .layer(ParseResponseLayer::<O, Retry>::new())\n            // These layers can be considered as occurring in order. That is, first invoke the\n            // customer-provided middleware, then dispatch dispatch over the wire.\n            .layer(&self.middleware)\n            .layer(DispatchLayer::new())\n            .service(connector);\n\n    svc.ready().await?.call(input).await\n  }\n}\n```\n\nThe Smithy Client creates a new `Stack` of services to handle each request it sends. Specifically:\n\n- A method `retry` is used set the retry handler. The configuration for this was set during creation of the `Client`.\n- `ParseResponseLayer` inserts a service for transforming responses into operation-specific outputs or errors. The `O` generic parameter of `input` is what decides exactly how the transformation is implemented.\n- A middleware stack that was included during `Client` creation is inserted into the stack. In the case of the AWS SDK, this would be `AwsMiddleware`.\n- `DispatchLayer` inserts a service for transforming an `http::Request` into an `operation::Request`. It's also responsible for re-attaching the property bag from the Operation that triggered the request.\n- The innermost `Service` is a `DynConnector` wrapping a `hyper` client (which one depends on the TLS implementation was enabled by cargo features.)\n\nThe **HTTP Request Timeout For A Single Attempt** and **HTTP Request Timeout For Multiple Attempts** can be implemented at this level. The same `Layer` can be used to create both `TimeoutService`s. The `TimeoutLayer` would require two inputs:\n- `sleep_fn`: A runtime-specific implementation of `sleep`. The SDK is currently `tokio`-based and would default to `tokio::time::sleep` (this default is set in the `aws_smithy_async::rt::sleep` module.)\n- The duration of the timeout as a `std::time::Duration`\n\nThe resulting code would look like this:\n\n```rust,ignore\nimpl<C, M, R> Client<C, M, R>\n  where\n          C: bounds::SmithyConnector,\n          M: bounds::SmithyMiddleware<C>,\n          R: retry::NewRequestPolicy,\n{\n  // ...other methods omitted\n  pub async fn call_raw<O, T, E, Retry>(\n    &self,\n    input: Operation<O, Retry>,\n  ) -> Result<SdkSuccess<T>, SdkError<E>>\n    where\n            R::Policy: bounds::SmithyRetryPolicy<O, T, E, Retry>,\n            bounds::Parsed<<M as bounds::SmithyMiddleware<C>>::Service, O, Retry>:\n            Service<Operation<O, Retry>, Response=SdkSuccess<T>, Error=SdkError<E>> + Clone,\n  {\n    let connector = self.connector.clone();\n    let sleep_fn = aws_smithy_async::rt::sleep::default_async_sleep();\n\n    let mut svc = ServiceBuilder::new()\n            .layer(TimeoutLayer::new(\n              sleep_fn,\n              self.timeout_config.api_call_timeout(),\n            ))\n            // Create a new request-scoped policy\n            .retry(self.retry_policy.new_request_policy())\n            .layer(TimeoutLayer::new(\n              sleep_fn,\n              self.timeout_config.api_call_attempt_timeout(),\n            ))\n            .layer(ParseResponseLayer::<O, Retry>::new())\n            // These layers can be considered as occurring in order. That is, first invoke the\n            // customer-provided middleware, then dispatch dispatch over the wire.\n            .layer(&self.middleware)\n            .layer(DispatchLayer::new())\n            .service(connector);\n\n    svc.ready().await?.call(input).await\n  }\n}\n```\n\n<!-- TODO where should this note live? -->\n_Note: Our HTTP client supports multiple TLS implementations. We'll likely have to implement this feature once per library._\n\nTimeouts will be implemented in the following places:\n\n- HTTP request timeout for multiple requests will be implemented as the outermost Layer in `Client::call_raw`.\n- HTTP request timeout for a single request will be implemented within `RetryHandler::retry`.\n- Time to first byte, TLS negotiation, and connect timeouts will be implemented within the central `hyper` connector.\n\nChanges checklist\n-----------------\n\nChanges are broken into to sections:\n\n- HTTP requests (single or multiple) are implementable as layers within our current stack\n- Other timeouts will require changes to our dependencies and may be slower to implement\n\n### Implementing HTTP request timeouts\n\n- [x] Add `TimeoutConfig` to `smithy-types`\n- [x] Add `TimeoutConfigProvider` to `aws-config`\n  - [x] Add provider that fetches config from environment variables\n  - [x] Add provider that fetches config from profile\n- [x] Add `timeout` method to `aws_types::Config` for setting timeout configuration\n- [x] Add `timeout` method to generated `Config`s too\n- [x] Create a generic `TimeoutService` and accompanying `Layer`\n  - [x] `TimeoutLayer` should accept a `sleep` function so that it doesn't have a hard dependency on `tokio`\n- [x] insert a `TimeoutLayer` before the `RetryPolicy` to handle timeouts for multiple-attempt requests\n- [x] insert a `TimeoutLayer` after the `RetryPolicy` to handle timeouts for single-attempt requests\n- [x] Add tests for timeout behavior\n  - [x] test multi-request timeout triggers after 3 slow retries\n  - [x] test single-request timeout triggers correctly\n  - [x] test single-request timeout doesn't trigger if request completes in time\n\n<!--- Links -->\n\n[tokio::time::timeout]: https://docs.rs/tokio/1.12.0/tokio/time/fn.timeout.html\n[futures::future::select]: https://docs.rs/futures/0.3.17/futures/future/fn.select.html\n[Retry Behavior Configuration]: ./rfc0004_retry_behavior.md\n[hyper#1097]: https://github.com/hyperium/hyper/issues/1097\n[hjr3/hyper-timeout]: https://github.com/hjr3/hyper-timeout\n[sfackler/tokio-io-timeout]: https://github.com/sfackler/tokio-io-timeout\n[tower_service::Service]: https://docs.rs/tower-service/0.3.1/tower_service/trait.Service.html\n[AwsMiddleware]: https://github.com/smithy-lang/smithy-rs/blob/1aa59693eed10713dec0f3774a8a25ca271dbf39/aws/rust-runtime/aws-hyper/src/lib.rs#L29\n[MapRequest]: https://github.com/smithy-lang/smithy-rs/blob/841f51113fb14e2922793951ce16bda3e16cb51f/rust-runtime/aws-smithy-http-tower/src/map_request.rs#L122\n[AsyncMapRequest]: https://github.com/smithy-lang/smithy-rs/blob/841f51113fb14e2922793951ce16bda3e16cb51f/rust-runtime/aws-smithy-http-tower/src/map_request.rs#L42\n[ParseResponse]: https://github.com/smithy-lang/smithy-rs/blob/841f51113fb14e2922793951ce16bda3e16cb51f/rust-runtime/aws-smithy-http-tower/src/parse_response.rs#L27\n[DynConnect]: https://github.com/smithy-lang/smithy-rs/blob/1aa59693eed10713dec0f3774a8a25ca271dbf39/rust-runtime/aws-smithy-client/src/erase.rs#L139\n[Connect]: https://docs.rs/hyper/0.14.14/hyper/client/connect/trait.Connect.html\n[tower::layer::util::Stack]: https://docs.rs/tower/0.4.10/tower/layer/util/struct.Stack.html\n[aws_smithy_client::Client::call_raw]: https://github.com/smithy-lang/smithy-rs/blob/841f51113fb14e2922793951ce16bda3e16cb51f/rust-runtime/aws-smithy-client/src/lib.rs#L175\n[Layers can produce compiler errors]: https://github.com/smithy-lang/smithy-rs/issues/634\n"
  },
  {
    "path": "design/src/rfcs/rfc0015_using_features_responsibly.md",
    "content": "# RFC: How Cargo \"features\" should be used in the SDK and runtime crates\n\n> Status: Accepted\n\n## Some background on features\n\nWhat is a feature? Here's a definition from the [Cargo Book section on features]:\n\n> Cargo \"features\" provide a mechanism to express conditional compilation and optional dependencies. A package defines a set of named features in the `[features]` table of `Cargo.toml`, and each feature can either be enabled or disabled. Features for the package being built can be enabled on the command-line with flags such as `--features`. Features for dependencies can be enabled in the dependency declaration in `Cargo.toml`.\n\nWe use features in a majority of our runtime crates and in all of our SDK crates. For example, [aws-sigv4] uses them to enable event streams. Another common use case is exhibited by [aws-sdk-s3] which uses them to enable the `tokio` runtime and the TLS implementation used when making requests.\n\n### Features should be additive\n\nThe Cargo book has this to say:\n\n> When a dependency is used by multiple packages, Cargo will use the union of all features enabled on that dependency when building it. This helps ensure that only a single copy of the dependency is used.\n\n> A consequence of this is that features should be *additive*. That is, enabling a feature should not disable functionality, and it should usually be safe to enable any combination of features. **A feature should not introduce a [SemVer-incompatible change].**\n\n## What does this mean for the SDK?\n\nDespite the constraints outlined above, we should use features in the SDKs because of the benefits they bring:\n\n- Features enable users to avoid compiling code that they won't be using. Additionally, features allow both general and specific control of compiled code, serving the needs of both novice and expert users.\n- A single feature in a crate can activate or deactivate multiple features exposed by that crate's dependencies, freeing the user from having to specifically activate or deactivate them.\n- Features can help users understand what a crate is capable of in the same way that looking at a graph of a crate's modules can.\n\nWhen using features, we should adhere to the guidelines outlined below.\n\n### Avoid writing code that relies on only activating one feature from a set of mutually exclusive features.\n\nAs noted earlier in an excerpt from the Cargo book:\n\n> enabling a feature should not disable functionality, and it should usually be safe to enable any combination of features. A feature should not introduce a [SemVer-incompatible change].\n\n```rust\n#[cfg(feature = \"rustls\")]\nimpl<M, R> ClientBuilder<(), M, R> {\n    /// Connect to the service over HTTPS using Rustls.\n    pub fn tls_adapter(self) -> ClientBuilder<Adapter<crate::conns::Https>, M, R> {\n        self.connector(Adapter::builder().build(crate::conns::https()))\n    }\n}\n\n#[cfg(feature = \"native-tls\")]\nimpl<M, R> ClientBuilder<(), M, R> {\n    /// Connect to the service over HTTPS using the native TLS library on your platform.\n    pub fn tls_adapter(\n        self,\n    ) -> ClientBuilder<Adapter<hyper_tls::HttpsConnector<hyper::client::HttpConnector>>, M, R> {\n        self.connector(Adapter::builder().build(crate::conns::native_tls()))\n    }\n}\n```\n\nWhen the example code above is compiled with both features enabled, compilation will fail with a \"duplicate definitions with name `tls_adapter`\" error. Also, note that the return type of the function differs between the two versions. This is a SemVer-incompatible change.\n\nHere's an updated version of the example that fixes these issues:\n\n```rust\n#[cfg(feature = \"rustls\")]\nimpl<M, R> ClientBuilder<(), M, R> {\n    /// Connect to the service over HTTPS using Rustls.\n    pub fn rustls(self) -> ClientBuilder<Adapter<crate::conns::Https>, M, R> {\n        self.connector(Adapter::builder().build(crate::conns::https()))\n    }\n}\n\n#[cfg(feature = \"native-tls\")]\nimpl<M, R> ClientBuilder<(), M, R> {\n    /// Connect to the service over HTTPS using the native TLS library on your platform.\n    pub fn native_tls(\n        self,\n    ) -> ClientBuilder<Adapter<hyper_tls::HttpsConnector<hyper::client::HttpConnector>>, M, R> {\n        self.connector(Adapter::builder().build(crate::conns::native_tls()))\n    }\n}\n```\n\nBoth features can now be enabled at once without creating a conflict. Since both methods have different names, it's now Ok for them to have different return types.\n\n[*This is real code, see it in context*](https://github.com/smithy-lang/smithy-rs/blob/2e7ed943513203f1472f2490866dc4fb8a392bd3/rust-runtime/aws-smithy-client/src/hyper_ext.rs#L303)\n\n### We should avoid using `#[cfg(not(feature = \"some-feature\"))]`\n\nAt the risk of seeming repetitive, the Cargo book says:\n\n> enabling a feature should not disable functionality, and it should usually be safe to enable any combination of features\n\nConditionally compiling code when a feature is **not** activated can make it hard for users and maintainers to reason about what will happen when they activate a feature. This is also a sign that a feature may not be \"additive\".\n\n***NOTE***: It's ok to use `#[cfg(not())]` to conditionally compile code based on a user's OS. It's also useful when controlling what code gets rendered when testing or when generating docs.\n\nOne case where using `not` is acceptable is when providing a fallback when no features are set:\n\n```rust,ignore\n#[cfg(feature = \"rt-tokio\")]\npub fn default_async_sleep() -> Option<Arc<dyn AsyncSleep>> {\n    Some(sleep_tokio())\n}\n\n#[cfg(not(feature = \"rt-tokio\"))]\npub fn default_async_sleep() -> Option<Arc<dyn AsyncSleep>> {\n    None\n}\n```\n\n### Don't default to defining \"default features\"\n\nBecause Cargo will use the union of all features enabled on a dependency when building it, we should be wary of marking features as default. Once we do mark features as default, users that want to exclude code and dependencies brought in by those features will have a difficult time doing so. One need look no further than [this issue][remove rustls from crate graph] submitted by a user that wanted to use Native TLS and struggled to make sure that Rustls was actually disabled *(This issue was resolved in [this PR][remove default features from runtime crates] which removed default features from our runtime crates.)* This is not to say that we should never use them, as having defaults for the most common use cases means less work for those users.\n\n#### When a default feature providing some functionality is disabled, active features must not automatically replace that functionality\n\nAs the SDK is currently designed, the TLS implementation in use can change depending on what features are pulled in. Currently, if a user disables `default-features` (which include `rustls`) and activates the `native-tls` feature, then we automatically use `native-tls` when making requests. For an example of what this looks like from the user's perspective, [see this example][native-tls example].\n\nThis RFC proposes that we should have a single default for any configurable functionality and that that functionality depends on a corresponding default feature being active. If `default-features` are disabled, then so is the corresponding default functionality. In its place would be functionality that fails fast with a message describing why it failed *(a default was deactivated but the user didn't set a replacement)*, and what the user should do to fix it *(with links to documentation and examples where necessary)*. We should use [compile-time errors] to communicate failures with users, or `panic`s for cases that can't be evaluated at compile-time.\n\nFor an example: Say you have a crate with features `a`, `b`, `c` that all provide some version of functionality `foo`. Feature `a` is part of `default-features`. When `no-default-features = true` but features `b` and `c` are active, don't automatically fall back to `b` or `c`. Instead, emit an error with a message like this:\n\n> \"When default features are disabled, you must manually set `foo`. Features `b` and `c` active; You can use one of those. See an example of setting a custom `foo` here: *link-to-docs.amazon.com/setting-foo*\"\n\n## Further reading\n\n- [How to tell what \"features\" are available per crate?]\n- [How do I 'pass down' feature flags to subdependencies in Cargo?]\n- A small selection of feature-related GitHub issues submitted for popular crates\n    - [The feature `preserve_order` is not \"purely additive,\" which makes it impossible to use `serde_yaml` 0.5.0 and `clap` in the same program][yaml-rust#44]\n    - [cargo features (verbose-errors may be other?) should be additive][nom#544]\n    - [Mutually exclusive features are present in profiling-procmacros][profiling#32]\n    - [Clang-sys features not additive][clang-sys#128]\n\n[aws-sigv4]: https://github.com/smithy-lang/smithy-rs/blob/5a1990791d727652587df51b77df4d1df9058252/aws/rust-runtime/aws-sigv4/Cargo.toml\n[aws-sdk-s3]: https://github.com/awslabs/aws-sdk-rust/blob/f2b4361b004ee822960ea9791f566fd4eb6d1aba/sdk/s3/Cargo.toml\n[Cargo Book section on features]: https://doc.rust-lang.org/cargo/reference/features.html\n[SemVer-incompatible change]: https://doc.rust-lang.org/cargo/reference/features.html#semver-compatibility\n[remove rustls from crate graph]: https://github.com/awslabs/aws-sdk-rust/issues/304\n[remove default features from runtime crates]: https://github.com/smithy-lang/smithy-rs/pull/935\n[cfg! macro]: https://doc.rust-lang.org/rust-by-example/attribute/cfg.html\n[How to tell what \"features\" are available per crate?]: https://stackoverflow.com/questions/59761045/how-to-tell-what-features-are-available-per-crate\n[How do I 'pass down' feature flags to subdependencies in Cargo?]: https://stackoverflow.com/questions/40021555/how-do-i-pass-down-feature-flags-to-subdependencies-in-cargo\n[yaml-rust#44]: https://github.com/chyh1990/yaml-rust/issues/44\n[nom#544]: https://github.com/Geal/nom/issues/544\n[profiling#32]: https://github.com/aclysma/profiling/issues/32\n[clang-sys#128]: https://github.com/KyleMayes/clang-sys/issues/128\n[compile-time errors]: https://doc.rust-lang.org/stable/std/macro.compile_error.html\n[native-tls example]: https://github.com/smithy-lang/smithy-rs/tree/bc316a0b81b75a00c389f6281a66eb0f5357172a/aws/sdk/examples/using_native_tls_instead_of_rustls\n"
  },
  {
    "path": "design/src/rfcs/rfc0016_flexible_checksum_support.md",
    "content": "RFC: Supporting Flexible Checksums\n==================================\n\n> Status: Implemented\n\nWe can't currently update the S3 SDK because we don't support the new \"Flexible Checksums\" feature. This RFC describes this new feature and details how we should implement it in `smithy-rs`.\n\n## What is the \"Flexible Checksums\" feature?\n\nS3 has previously supported MD5 checksum validation of data. Now, it supports more checksum algorithms like CRC32, CRC32C, SHA-1, and SHA-256. This validation is available when putting objects to S3 and when getting them from S3. For more information, see [this AWS News Blog post][1].\n\n## Implementing Checksums\n\nChecksum callbacks were introduced as a result of the acceptance of [RFC0013] and this RFC proposes a refactor to those callbacks, as well as several new wrappers for `SdkBody` that will provide new functionality.\n\n### Refactoring aws-smithy-checksums\n\nTLDR; This refactor of aws-smithy-checksums:\n- **Removes the \"callback\" terminology:** As a word, \"callback\" doesn't carry any useful information, and doesn't aid in understanding.\n- **Removes support for the `BodyCallback` API:** Instead of adding checksum callbacks to a body, we're going to use a \"body wrapping\" instead. \"Body wrapping\" is demonstrated in the [`ChecksumBody`](#checksumbody), [`AwsChunkedBody`](#awschunkedbody-and-awschunkedbodyoptions), and [`ChecksumValidatedBody`](#checksumvalidatedbody) sections.\n\n  *NOTE: This doesn't remove the `BodyCallback` trait. That will still exist, we just won't use it.*\n- **Updates terminology to focus on \"headers\" instead of \"trailers\":** Because the types we deal with in this module are named for HTTP headers, I chose to use that terminology instead. My hope is that this will be less strange to people reading this code.\n- **Adds `fn checksum_algorithm_to_checksum_header_name`:** a function that's used in generated code to set a checksum request header.\n- **Adds `fn checksum_header_name_to_checksum_algorithm`:** a function that's used in generated code when creating a checksum-validating response body.\n- **Add new checksum-related \"body wrapping\" HTTP body types**: These are defined in the `body` module and will be shown later in this RFC.\n\n```rust,ignore\n// In aws-smithy-checksums/src/lib.rs\n//! Checksum calculation and verification callbacks\n\nuse aws_smithy_types::base64;\n\nuse bytes::Bytes;\nuse http::header::{HeaderMap, HeaderName, HeaderValue};\nuse sha1::Digest;\nuse std::io::Write;\n\npub mod body;\n\n// Valid checksum algorithm names\npub const CRC_32_NAME: &str = \"crc32\";\npub const CRC_32_C_NAME: &str = \"crc32c\";\npub const SHA_1_NAME: &str = \"sha1\";\npub const SHA_256_NAME: &str = \"sha256\";\n\npub const CRC_32_HEADER_NAME: HeaderName = HeaderName::from_static(\"x-amz-checksum-crc32\");\npub const CRC_32_C_HEADER_NAME: HeaderName = HeaderName::from_static(\"x-amz-checksum-crc32c\");\npub const SHA_1_HEADER_NAME: HeaderName = HeaderName::from_static(\"x-amz-checksum-sha1\");\npub const SHA_256_HEADER_NAME: HeaderName = HeaderName::from_static(\"x-amz-checksum-sha256\");\n\n// Preserved for compatibility purposes. This should never be used by users, only within smithy-rs\nconst MD5_NAME: &str = \"md5\";\nconst MD5_HEADER_NAME: HeaderName = HeaderName::from_static(\"content-md5\");\n\n/// Given a `&str` representing a checksum algorithm, return the corresponding `HeaderName`\n/// for that checksum algorithm.\npub fn checksum_algorithm_to_checksum_header_name(checksum_algorithm: &str) -> HeaderName {\n    if checksum_algorithm.eq_ignore_ascii_case(CRC_32_NAME) {\n        CRC_32_HEADER_NAME\n    } else if checksum_algorithm.eq_ignore_ascii_case(CRC_32_C_NAME) {\n        CRC_32_C_HEADER_NAME\n    } else if checksum_algorithm.eq_ignore_ascii_case(SHA_1_NAME) {\n        SHA_1_HEADER_NAME\n    } else if checksum_algorithm.eq_ignore_ascii_case(SHA_256_NAME) {\n        SHA_256_HEADER_NAME\n    } else if checksum_algorithm.eq_ignore_ascii_case(MD5_NAME) {\n        MD5_HEADER_NAME\n    } else {\n        // TODO what's the best way to handle this case?\n        HeaderName::from_static(\"x-amz-checksum-unknown\")\n    }\n}\n\n/// Given a `HeaderName` representing a checksum algorithm, return the name of that algorithm\n/// as a `&'static str`.\npub fn checksum_header_name_to_checksum_algorithm(\n    checksum_header_name: &HeaderName,\n) -> &'static str {\n    if checksum_header_name == CRC_32_HEADER_NAME {\n        CRC_32_NAME\n    } else if checksum_header_name == CRC_32_C_HEADER_NAME {\n        CRC_32_C_NAME\n    } else if checksum_header_name == SHA_1_HEADER_NAME {\n        SHA_1_NAME\n    } else if checksum_header_name == SHA_256_HEADER_NAME {\n        SHA_256_NAME\n    } else if checksum_header_name == MD5_HEADER_NAME {\n        MD5_NAME\n    } else {\n        // TODO what's the best way to handle this case?\n        \"unknown-checksum-algorithm\"\n    }\n}\n\n/// When a response has to be checksum-verified, we have to check possible headers until we find the\n/// header with the precalculated checksum. Because a service may send back multiple headers, we have\n/// to check them in order based on how fast each checksum is to calculate.\npub const CHECKSUM_HEADERS_IN_PRIORITY_ORDER: [HeaderName; 4] = [\n    CRC_32_C_HEADER_NAME,\n    CRC_32_HEADER_NAME,\n    SHA_1_HEADER_NAME,\n    SHA_256_HEADER_NAME,\n];\n\ntype BoxError = Box<dyn std::error::Error + Send + Sync>;\n\n/// Checksum algorithms are use to validate the integrity of data. Structs that implement this trait\n/// can be used as checksum calculators. This trait requires Send + Sync because these checksums are\n/// often used in a threaded context.\npub trait Checksum: Send + Sync {\n    /// Given a slice of bytes, update this checksum's internal state.\n    fn update(&mut self, bytes: &[u8]) -> Result<(), BoxError>;\n    /// Either return this checksum as a `HeaderMap` containing one HTTP header, or return an error\n    /// describing why checksum calculation failed.\n    fn headers(&self) -> Result<Option<HeaderMap<HeaderValue>>, BoxError>;\n    /// Return the `HeaderName` used to represent this checksum algorithm\n    fn header_name(&self) -> HeaderName;\n    /// \"Finalize\" this checksum, returning the calculated value as `Bytes` or an error that\n    /// occurred during checksum calculation. To print this value in a human-readable hexadecimal\n    /// format, you can print it using Rust's builtin [formatter].\n    ///\n    /// _**NOTE:** typically, \"finalizing\" a checksum in Rust will take ownership of the checksum\n    /// struct. In this method, we clone the checksum's state before finalizing because checksums\n    /// may be used in a situation where taking ownership is not possible._\n    ///\n    /// [formatter]: https://doc.rust-lang.org/std/fmt/trait.UpperHex.html\n    fn finalize(&self) -> Result<Bytes, BoxError>;\n    /// Return the size of this checksum algorithms resulting checksum, in bytes. For example, the\n    /// CRC32 checksum algorithm calculates a 32 bit checksum, so a CRC32 checksum struct\n    /// implementing this trait method would return 4.\n    fn size(&self) -> u64;\n}\n\n/// Create a new `Box<dyn Checksum>` from an algorithm name. Valid algorithm names are defined as\n/// `const`s in this module.\npub fn new_checksum(checksum_algorithm: &str) -> Box<dyn Checksum> {\n    if checksum_algorithm.eq_ignore_ascii_case(CRC_32_NAME) {\n        Box::new(Crc32::default())\n    } else if checksum_algorithm.eq_ignore_ascii_case(CRC_32_C_NAME) {\n        Box::new(Crc32c::default())\n    } else if checksum_algorithm.eq_ignore_ascii_case(SHA_1_NAME) {\n        Box::new(Sha1::default())\n    } else if checksum_algorithm.eq_ignore_ascii_case(SHA_256_NAME) {\n        Box::new(Sha256::default())\n    } else if checksum_algorithm.eq_ignore_ascii_case(MD5_NAME) {\n        // It's possible to create an MD5 and we do this in some situations for compatibility.\n        // We deliberately hide this from users so that they don't go using it.\n        Box::new(Md5::default())\n    } else {\n        panic!(\"unsupported checksum algorithm '{}'\", checksum_algorithm)\n    }\n}\n\n#[derive(Debug, Default)]\nstruct Crc32 {\n    hasher: crc32fast::Hasher,\n}\n\nimpl Crc32 {\n    fn update(&mut self, bytes: &[u8]) -> Result<(), BoxError> {\n        self.hasher.update(bytes);\n\n        Ok(())\n    }\n\n    fn headers(&self) -> Result<Option<HeaderMap<HeaderValue>>, BoxError> {\n        let mut header_map = HeaderMap::new();\n        header_map.insert(Self::header_name(), self.header_value());\n\n        Ok(Some(header_map))\n    }\n\n    fn finalize(&self) -> Result<Bytes, BoxError> {\n        Ok(Bytes::copy_from_slice(\n            &self.hasher.clone().finalize().to_be_bytes(),\n        ))\n    }\n\n    // Size of the checksum in bytes\n    fn size() -> u64 {\n        4\n    }\n\n    fn header_name() -> HeaderName {\n        CRC_32_HEADER_NAME\n    }\n\n    fn header_value(&self) -> HeaderValue {\n        // We clone the hasher because `Hasher::finalize` consumes `self`\n        let hash = self.hasher.clone().finalize();\n        HeaderValue::from_str(&base64::encode(u32::to_be_bytes(hash)))\n            .expect(\"will always produce a valid header value from a CRC32 checksum\")\n    }\n}\n\nimpl Checksum for Crc32 {\n    fn update(\n        &mut self,\n        bytes: &[u8],\n    ) -> Result<(), Box<(dyn std::error::Error + Send + Sync + 'static)>> {\n        Self::update(self, bytes)\n    }\n    fn headers(\n        &self,\n    ) -> Result<Option<HeaderMap>, Box<(dyn std::error::Error + Send + Sync + 'static)>> {\n        Self::headers(self)\n    }\n    fn header_name(&self) -> HeaderName {\n        Self::header_name()\n    }\n    fn finalize(&self) -> Result<Bytes, BoxError> {\n        Self::finalize(self)\n    }\n    fn size(&self) -> u64 {\n        Self::size()\n    }\n}\n\n#[derive(Debug, Default)]\nstruct Crc32c {\n    state: Option<u32>,\n}\n\nimpl Crc32c {\n    fn update(&mut self, bytes: &[u8]) -> Result<(), BoxError> {\n        self.state = match self.state {\n            Some(crc) => Some(crc32c::crc32c_append(crc, bytes)),\n            None => Some(crc32c::crc32c(bytes)),\n        };\n\n        Ok(())\n    }\n\n    fn headers(&self) -> Result<Option<HeaderMap<HeaderValue>>, BoxError> {\n        let mut header_map = HeaderMap::new();\n        header_map.insert(Self::header_name(), self.header_value());\n\n        Ok(Some(header_map))\n    }\n\n    fn finalize(&self) -> Result<Bytes, BoxError> {\n        Ok(Bytes::copy_from_slice(\n            &self.state.unwrap_or_default().to_be_bytes(),\n        ))\n    }\n\n    // Size of the checksum in bytes\n    fn size() -> u64 {\n        4\n    }\n\n    fn header_name() -> HeaderName {\n        CRC_32_C_HEADER_NAME\n    }\n\n    fn header_value(&self) -> HeaderValue {\n        // If no data was provided to this callback and no CRC was ever calculated, return zero as the checksum.\n        let hash = self.state.unwrap_or_default();\n        HeaderValue::from_str(&base64::encode(u32::to_be_bytes(hash)))\n            .expect(\"will always produce a valid header value from a CRC32C checksum\")\n    }\n}\n\nimpl Checksum for Crc32c {\n    fn update(\n        &mut self,\n        bytes: &[u8],\n    ) -> Result<(), Box<(dyn std::error::Error + Send + Sync + 'static)>> {\n        Self::update(self, bytes)\n    }\n    fn headers(\n        &self,\n    ) -> Result<Option<HeaderMap>, Box<(dyn std::error::Error + Send + Sync + 'static)>> {\n        Self::headers(self)\n    }\n    fn header_name(&self) -> HeaderName {\n        Self::header_name()\n    }\n    fn finalize(&self) -> Result<Bytes, BoxError> {\n        Self::finalize(self)\n    }\n    fn size(&self) -> u64 {\n        Self::size()\n    }\n}\n\n#[derive(Debug, Default)]\nstruct Sha1 {\n    hasher: sha1::Sha1,\n}\n\nimpl Sha1 {\n    fn update(&mut self, bytes: &[u8]) -> Result<(), BoxError> {\n        self.hasher.write_all(bytes)?;\n\n        Ok(())\n    }\n\n    fn headers(&self) -> Result<Option<HeaderMap<HeaderValue>>, BoxError> {\n        let mut header_map = HeaderMap::new();\n        header_map.insert(Self::header_name(), self.header_value());\n\n        Ok(Some(header_map))\n    }\n\n    fn finalize(&self) -> Result<Bytes, BoxError> {\n        Ok(Bytes::copy_from_slice(\n            self.hasher.clone().finalize().as_slice(),\n        ))\n    }\n\n    // Size of the checksum in bytes\n    fn size() -> u64 {\n        20\n    }\n\n    fn header_name() -> HeaderName {\n        SHA_1_HEADER_NAME\n    }\n\n    fn header_value(&self) -> HeaderValue {\n        // We clone the hasher because `Hasher::finalize` consumes `self`\n        let hash = self.hasher.clone().finalize();\n        HeaderValue::from_str(&base64::encode(&hash[..]))\n            .expect(\"will always produce a valid header value from a SHA-1 checksum\")\n    }\n}\n\nimpl Checksum for Sha1 {\n    fn update(\n        &mut self,\n        bytes: &[u8],\n    ) -> Result<(), Box<(dyn std::error::Error + Send + Sync + 'static)>> {\n        Self::update(self, bytes)\n    }\n    fn headers(\n        &self,\n    ) -> Result<Option<HeaderMap>, Box<(dyn std::error::Error + Send + Sync + 'static)>> {\n        Self::headers(self)\n    }\n    fn header_name(&self) -> HeaderName {\n        Self::header_name()\n    }\n    fn finalize(&self) -> Result<Bytes, BoxError> {\n        Self::finalize(self)\n    }\n    fn size(&self) -> u64 {\n        Self::size()\n    }\n}\n\n#[derive(Debug, Default)]\nstruct Sha256 {\n    hasher: sha2::Sha256,\n}\n\nimpl Sha256 {\n    fn update(&mut self, bytes: &[u8]) -> Result<(), BoxError> {\n        self.hasher.write_all(bytes)?;\n\n        Ok(())\n    }\n\n    fn headers(&self) -> Result<Option<HeaderMap<HeaderValue>>, BoxError> {\n        let mut header_map = HeaderMap::new();\n        header_map.insert(Self::header_name(), self.header_value());\n\n        Ok(Some(header_map))\n    }\n\n    fn finalize(&self) -> Result<Bytes, BoxError> {\n        Ok(Bytes::copy_from_slice(\n            self.hasher.clone().finalize().as_slice(),\n        ))\n    }\n\n    // Size of the checksum in bytes\n    fn size() -> u64 {\n        32\n    }\n\n    fn header_name() -> HeaderName {\n        SHA_256_HEADER_NAME\n    }\n\n    fn header_value(&self) -> HeaderValue {\n        // We clone the hasher because `Hasher::finalize` consumes `self`\n        let hash = self.hasher.clone().finalize();\n        HeaderValue::from_str(&base64::encode(&hash[..]))\n            .expect(\"will always produce a valid header value from a SHA-256 checksum\")\n    }\n}\n\nimpl Checksum for Sha256 {\n    fn update(\n        &mut self,\n        bytes: &[u8],\n    ) -> Result<(), Box<(dyn std::error::Error + Send + Sync + 'static)>> {\n        Self::update(self, bytes)\n    }\n    fn headers(\n        &self,\n    ) -> Result<Option<HeaderMap>, Box<(dyn std::error::Error + Send + Sync + 'static)>> {\n        Self::headers(self)\n    }\n    fn header_name(&self) -> HeaderName {\n        Self::header_name()\n    }\n    fn finalize(&self) -> Result<Bytes, BoxError> {\n        Self::finalize(self)\n    }\n    fn size(&self) -> u64 {\n        Self::size()\n    }\n}\n\n#[derive(Debug, Default)]\nstruct Md5 {\n    hasher: md5::Md5,\n}\n\nimpl Md5 {\n    fn update(&mut self, bytes: &[u8]) -> Result<(), BoxError> {\n        self.hasher.write_all(bytes)?;\n\n        Ok(())\n    }\n\n    fn headers(&self) -> Result<Option<HeaderMap<HeaderValue>>, BoxError> {\n        let mut header_map = HeaderMap::new();\n        header_map.insert(Self::header_name(), self.header_value());\n\n        Ok(Some(header_map))\n    }\n\n    fn finalize(&self) -> Result<Bytes, BoxError> {\n        Ok(Bytes::copy_from_slice(\n            self.hasher.clone().finalize().as_slice(),\n        ))\n    }\n\n    // Size of the checksum in bytes\n    fn size() -> u64 {\n        16\n    }\n\n    fn header_name() -> HeaderName {\n        MD5_HEADER_NAME\n    }\n\n    fn header_value(&self) -> HeaderValue {\n        // We clone the hasher because `Hasher::finalize` consumes `self`\n        let hash = self.hasher.clone().finalize();\n        HeaderValue::from_str(&base64::encode(&hash[..]))\n            .expect(\"will always produce a valid header value from an MD5 checksum\")\n    }\n}\n\nimpl Checksum for Md5 {\n    fn update(\n        &mut self,\n        bytes: &[u8],\n    ) -> Result<(), Box<(dyn std::error::Error + Send + Sync + 'static)>> {\n        Self::update(self, bytes)\n    }\n    fn headers(\n        &self,\n    ) -> Result<Option<HeaderMap>, Box<(dyn std::error::Error + Send + Sync + 'static)>> {\n        Self::headers(self)\n    }\n    fn header_name(&self) -> HeaderName {\n        Self::header_name()\n    }\n    fn finalize(&self) -> Result<Bytes, BoxError> {\n        Self::finalize(self)\n    }\n    fn size(&self) -> u64 {\n        Self::size()\n    }\n}\n\n// We have existing tests for the checksums, those don't require an update\n```\n\n### `ChecksumBody`\n\nWhen creating a checksum-validated request with an in-memory request body, we can read the body, calculate a checksum, and insert the checksum header, all before sending the request. When creating a checksum-validated request with a streaming request body, we don't have that luxury. Instead, we must calculate a checksum while sending the body, and append that checksum as a [trailer][2].\n\nWe will accomplish this by wrapping the `SdkBody` that requires validation within a `ChecksumBody`. Afterwards, we'll need to wrap the `ChecksumBody` in yet another layer which we'll discuss in the [`AwsChunkedBody` and `AwsChunkedBodyOptions`](#awschunkedbody-and-awschunkedbodyoptions) section.\n\n```rust,ignore\n// In aws-smithy-checksums/src/body.rs\nuse crate::{new_checksum, Checksum};\n\nuse aws_smithy_http::body::SdkBody;\nuse aws_smithy_http::header::append_merge_header_maps;\nuse aws_smithy_types::base64;\n\nuse bytes::{Buf, Bytes};\nuse http::header::HeaderName;\nuse http::{HeaderMap, HeaderValue};\nuse http_body::{Body, SizeHint};\nuse pin_project::pin_project;\n\nuse std::fmt::Display;\nuse std::pin::Pin;\nuse std::task::{Context, Poll};\n\n/// A `ChecksumBody` will read and calculate a request body as it's being sent. Once the body has\n/// been completely read, it'll append a trailer with the calculated checksum.\n#[pin_project]\npub struct ChecksumBody<InnerBody> {\n    #[pin]\n    inner: InnerBody,\n    #[pin]\n    checksum: Box<dyn Checksum>,\n}\n\nimpl ChecksumBody<SdkBody> {\n    /// Given an `SdkBody` and the name of a checksum algorithm as a `&str`, create a new\n    /// `ChecksumBody<SdkBody>`. Valid checksum algorithm names are defined in this crate's\n    /// [root module](super).\n    ///\n    /// # Panics\n    ///\n    /// This will panic if the given checksum algorithm is not supported.\n    pub fn new(body: SdkBody, checksum_algorithm: &str) -> Self {\n        Self {\n            checksum: new_checksum(checksum_algorithm),\n            inner: body,\n        }\n    }\n\n    /// Return the name of the trailer that will be emitted by this `ChecksumBody`\n    pub fn trailer_name(&self) -> HeaderName {\n        self.checksum.header_name()\n    }\n\n    /// Calculate and return the sum of the:\n    /// - checksum when base64 encoded\n    /// - trailer name\n    /// - trailer separator\n    ///\n    /// This is necessary for calculating the true size of the request body for certain\n    /// content-encodings.\n    pub fn trailer_length(&self) -> u64 {\n        let trailer_name_size_in_bytes = self.checksum.header_name().as_str().len() as u64;\n        let base64_encoded_checksum_size_in_bytes = base64::encoded_length(self.checksum.size());\n\n        (trailer_name_size_in_bytes\n            // HTTP trailer names and values may be separated by either a single colon or a single\n            // colon and a whitespace. In the AWS Rust SDK, we use a single colon.\n            + \":\".len() as u64\n            + base64_encoded_checksum_size_in_bytes)\n    }\n\n    fn poll_inner(\n        self: Pin<&mut Self>,\n        cx: &mut Context<'_>,\n    ) -> Poll<Option<Result<Bytes, aws_smithy_http::body::Error>>> {\n        let this = self.project();\n        let inner = this.inner;\n        let mut checksum = this.checksum;\n\n        match inner.poll_data(cx) {\n            Poll::Ready(Some(Ok(mut data))) => {\n                let len = data.chunk().len();\n                let bytes = data.copy_to_bytes(len);\n\n                if let Err(e) = checksum.update(&bytes) {\n                    return Poll::Ready(Some(Err(e)));\n                }\n\n                Poll::Ready(Some(Ok(bytes)))\n            }\n            Poll::Ready(None) => Poll::Ready(None),\n            Poll::Ready(Some(Err(e))) => Poll::Ready(Some(Err(e))),\n            Poll::Pending => Poll::Pending,\n        }\n    }\n}\n\nimpl http_body::Body for ChecksumBody<SdkBody> {\n    type Data = Bytes;\n    type Error = aws_smithy_http::body::Error;\n\n    fn poll_data(\n        self: Pin<&mut Self>,\n        cx: &mut Context<'_>,\n    ) -> Poll<Option<Result<Self::Data, Self::Error>>> {\n        self.poll_inner(cx)\n    }\n\n    fn poll_trailers(\n        self: Pin<&mut Self>,\n        cx: &mut Context<'_>,\n    ) -> Poll<Result<Option<HeaderMap<HeaderValue>>, Self::Error>> {\n        let this = self.project();\n        match (\n            this.checksum.headers(),\n            http_body::Body::poll_trailers(this.inner, cx),\n        ) {\n            // If everything is ready, return trailers, merging them if we have more than one map\n            (Ok(outer_trailers), Poll::Ready(Ok(inner_trailers))) => {\n                let trailers = match (outer_trailers, inner_trailers) {\n                    // Values from the inner trailer map take precedent over values from the outer map\n                    (Some(outer), Some(inner)) => Some(append_merge_header_maps(inner, outer)),\n                    // If only one or neither produced trailers, just combine the `Option`s with `or`\n                    (outer, inner) => outer.or(inner),\n                };\n                Poll::Ready(Ok(trailers))\n            }\n            // If the inner poll is Ok but the outer body's checksum callback encountered an error,\n            // return the error\n            (Err(e), Poll::Ready(Ok(_))) => Poll::Ready(Err(e)),\n            // Otherwise return the result of the inner poll.\n            // It may be pending or it may be ready with an error.\n            (_, inner_poll) => inner_poll,\n        }\n    }\n\n    fn is_end_stream(&self) -> bool {\n        self.inner.is_end_stream()\n    }\n\n    fn size_hint(&self) -> SizeHint {\n        let body_size_hint = self.inner.size_hint();\n        match body_size_hint.exact() {\n            Some(size) => {\n                let checksum_size_hint = self.checksum.size();\n                SizeHint::with_exact(size + checksum_size_hint)\n            }\n            // TODO is this the right behavior?\n            None => {\n                let checksum_size_hint = self.checksum.size();\n                let mut summed_size_hint = SizeHint::new();\n                summed_size_hint.set_lower(body_size_hint.lower() + checksum_size_hint);\n\n                if let Some(body_size_hint_upper) = body_size_hint.upper() {\n                    summed_size_hint.set_upper(body_size_hint_upper + checksum_size_hint);\n                }\n\n                summed_size_hint\n            }\n        }\n    }\n}\n\n// The tests I have written are omitted from this RFC for brevity. The request body checksum calculation and trailer size calculations are all tested.\n```\n\n### `ChecksumValidatedBody`\n\nUsers may request checksum validation for response bodies. That capability is provided by `ChecksumValidatedBody`, which will calculate a checksum as the response body is being read. Once all data has been read, the calculated checksum is compared to a precalculated checksum set during body creation. If the checksums don't match, then the body will emit an error.\n\n```rust,ignore\n// In aws-smithy-checksums/src/body.rs\n/// A response body that will calculate a checksum as it is read. If all data is read and the\n/// calculated checksum doesn't match a precalculated checksum, this body will emit an\n/// [asw_smithy_http::body::Error].\n#[pin_project]\npub struct ChecksumValidatedBody<InnerBody> {\n    #[pin]\n    inner: InnerBody,\n    #[pin]\n    checksum: Box<dyn Checksum>,\n    precalculated_checksum: Bytes,\n}\n\nimpl ChecksumValidatedBody<SdkBody> {\n    /// Given an `SdkBody`, the name of a checksum algorithm as a `&str`, and a precalculated\n    /// checksum represented as `Bytes`, create a new `ChecksumValidatedBody<SdkBody>`.\n    /// Valid checksum algorithm names are defined in this crate's [root module](super).\n    ///\n    /// # Panics\n    ///\n    /// This will panic if the given checksum algorithm is not supported.\n    pub fn new(body: SdkBody, checksum_algorithm: &str, precalculated_checksum: Bytes) -> Self {\n        Self {\n            checksum: new_checksum(checksum_algorithm),\n            inner: body,\n            precalculated_checksum,\n        }\n    }\n\n    fn poll_inner(\n        self: Pin<&mut Self>,\n        cx: &mut Context<'_>,\n    ) -> Poll<Option<Result<Bytes, aws_smithy_http::body::Error>>> {\n        let this = self.project();\n        let inner = this.inner;\n        let mut checksum = this.checksum;\n\n        match inner.poll_data(cx) {\n            Poll::Ready(Some(Ok(mut data))) => {\n                let len = data.chunk().len();\n                let bytes = data.copy_to_bytes(len);\n\n                if let Err(e) = checksum.update(&bytes) {\n                    return Poll::Ready(Some(Err(e)));\n                }\n\n                Poll::Ready(Some(Ok(bytes)))\n            }\n            // Once the inner body has stopped returning data, check the checksum\n            // and return an error if it doesn't match.\n            Poll::Ready(None) => {\n                let actual_checksum = {\n                    match checksum.finalize() {\n                        Ok(checksum) => checksum,\n                        Err(err) => {\n                            return Poll::Ready(Some(Err(err)));\n                        }\n                    }\n                };\n                if *this.precalculated_checksum == actual_checksum {\n                    Poll::Ready(None)\n                } else {\n                    // So many parens it's starting to look like LISP\n                    Poll::Ready(Some(Err(Box::new(Error::checksum_mismatch(\n                        this.precalculated_checksum.clone(),\n                        actual_checksum,\n                    )))))\n                }\n            }\n            Poll::Ready(Some(Err(e))) => Poll::Ready(Some(Err(e))),\n            Poll::Pending => Poll::Pending,\n        }\n    }\n}\n\n/// Errors related to checksum calculation and validation\n#[derive(Debug, Eq, PartialEq)]\n#[non_exhaustive]\npub enum Error {\n    /// The actual checksum didn't match the expected checksum. The checksummed data has been\n    /// altered since the expected checksum was calculated.\n    ChecksumMismatch { expected: Bytes, actual: Bytes },\n}\n\nimpl Error {\n    /// Given an expected checksum and an actual checksum in `Bytes` form, create a new\n    /// `Error::ChecksumMismatch`.\n    pub fn checksum_mismatch(expected: Bytes, actual: Bytes) -> Self {\n        Self::ChecksumMismatch { expected, actual }\n    }\n}\n\nimpl Display for Error {\n    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> {\n        match self {\n            Error::ChecksumMismatch { expected, actual } => write!(\n                f,\n                \"body checksum mismatch. expected body checksum to be {:x} but it was {:x}\",\n                expected, actual\n            ),\n        }\n    }\n}\n\nimpl std::error::Error for Error {}\n\nimpl http_body::Body for ChecksumValidatedBody<SdkBody> {\n    type Data = Bytes;\n    type Error = aws_smithy_http::body::Error;\n\n    fn poll_data(\n        self: Pin<&mut Self>,\n        cx: &mut Context<'_>,\n    ) -> Poll<Option<Result<Self::Data, Self::Error>>> {\n        self.poll_inner(cx)\n    }\n\n    fn poll_trailers(\n        self: Pin<&mut Self>,\n        cx: &mut Context<'_>,\n    ) -> Poll<Result<Option<HeaderMap<HeaderValue>>, Self::Error>> {\n        self.project().inner.poll_trailers(cx)\n    }\n\n    // Once the inner body returns true for is_end_stream, we still need to\n    // verify the checksum; Therefore, we always return false here.\n    fn is_end_stream(&self) -> bool {\n        false\n    }\n\n    fn size_hint(&self) -> SizeHint {\n        self.inner.size_hint()\n    }\n}\n\n// The tests I have written are omitted from this RFC for brevity. The response body checksum verification is tested.\n```\n\n### `AwsChunkedBody` and `AwsChunkedBodyOptions`\n\nIn order to send a request with checksum trailers, we must use an AWS-specific content encoding called `aws-chunked`. This encoding requires that we:\n- Divide the original body content into one or more chunks. For our purposes we only ever use one chunk.\n- Append a hexadecimal chunk size header to each chunk.\n- Suffix each chunk with a [CRLF (carriage return line feed)][3].\n- Send a 0 and CRLF to close the original body content section.\n- Send trailers as part of the request body, suffixing each with a CRLF.\n- Send a final CRLF to close the request body.\n\nAs an example, Sending a regular request body with a SHA-256 checksum would look similar to this:\n\n```HTTP\nPUT SOMEURL HTTP/1.1\nx-amz-checksum-sha256: ZOyIygCyaOW6GjVnihtTFtIS9PNmskdyMlNKiuyjfzw=\nContent-Length: 11\n...\n\nHello world\n```\n\nand the `aws-chunked` version would look like this:\n\n```HTTP\nPUT SOMEURL HTTP/1.1\nx-amz-trailer: x-amz-checksum-sha256\nx-amz-decoded-content-length: 11\nContent-Encoding: aws-chunked\nContent-Length: 87\n...\n\nB\\r\\n\nHello world\\r\\n\n0\\r\\n\nx-amz-checksum-sha256:ZOyIygCyaOW6GjVnihtTFtIS9PNmskdyMlNKiuyjfzw=\\r\\n\n\\r\\n\n```\n\n_**NOTES:**_\n- *In the second example, `B` is the hexadecimal representation of 11.*\n- *Authorization and other headers are omitted from the examples above for brevity.*\n- *When using `aws-chunked` content encoding, S3 requires that we send the `x-amz-decoded-content-length` with the length of the original body content.*\n\nThis encoding scheme is performed by `AwsChunkedBody` and configured with `AwsChunkedBodyOptions`.\n\n```rust,ignore\n// In aws-http/src/content_encoding.rs\nuse aws_smithy_checksums::body::ChecksumBody;\nuse aws_smithy_http::body::SdkBody;\n\nuse bytes::{Buf, Bytes, BytesMut};\nuse http::{HeaderMap, HeaderValue};\nuse http_body::{Body, SizeHint};\nuse pin_project::pin_project;\n\nuse std::pin::Pin;\nuse std::task::{Context, Poll};\n\nconst CRLF: &str = \"\\r\\n\";\nconst CHUNK_TERMINATOR: &str = \"0\\r\\n\";\n\n/// Content encoding header value constants\npub mod header_value {\n    /// Header value denoting \"aws-chunked\" encoding\n    pub const AWS_CHUNKED: &str = \"aws-chunked\";\n}\n\n/// Options used when constructing an [`AwsChunkedBody`][AwsChunkedBody].\n#[derive(Debug, Default)]\n#[non_exhaustive]\npub struct AwsChunkedBodyOptions {\n    /// The total size of the stream. For unsigned encoding this implies that\n    /// there will only be a single chunk containing the underlying payload,\n    /// unless ChunkLength is also specified.\n    pub stream_length: Option<u64>,\n    /// The maximum size of each chunk to be sent.\n    ///\n    /// If ChunkLength and stream_length are both specified, the stream will be\n    /// broken up into chunk_length chunks. The encoded length of the aws-chunked\n    /// encoding can still be determined as long as all trailers, if any, have a\n    /// fixed length.\n    pub chunk_length: Option<u64>,\n    /// The length of each trailer sent within an `AwsChunkedBody`. Necessary in\n    /// order to correctly calculate the total size of the body accurately.\n    pub trailer_lens: Vec<u64>,\n}\n\nimpl AwsChunkedBodyOptions {\n    /// Create a new [`AwsChunkedBodyOptions`][AwsChunkedBodyOptions]\n    pub fn new() -> Self {\n        Self::default()\n    }\n\n    /// Set stream length\n    pub fn with_stream_length(mut self, stream_length: u64) -> Self {\n        self.stream_length = Some(stream_length);\n        self\n    }\n\n    /// Set chunk length\n    pub fn with_chunk_length(mut self, chunk_length: u64) -> Self {\n        self.chunk_length = Some(chunk_length);\n        self\n    }\n\n    /// Set a trailer len\n    pub fn with_trailer_len(mut self, trailer_len: u64) -> Self {\n        self.trailer_lens.push(trailer_len);\n        self\n    }\n}\n\n#[derive(Debug, PartialEq, Eq)]\nenum AwsChunkedBodyState {\n    WritingChunkSize,\n    WritingChunk,\n    WritingTrailers,\n    Closed,\n}\n\n/// A request body compatible with `Content-Encoding: aws-chunked`\n///\n/// Chunked-Body grammar is defined in [ABNF] as:\n///\n/// ```txt\n/// Chunked-Body    = *chunk\n///                   last-chunk\n///                   chunked-trailer\n///                   CRLF\n///\n/// chunk           = chunk-size CRLF chunk-data CRLF\n/// chunk-size      = 1*HEXDIG\n/// last-chunk      = 1*(\"0\") CRLF\n/// chunked-trailer = *( entity-header CRLF )\n/// entity-header   = field-name \":\" OWS field-value OWS\n/// ```\n/// For more info on what the abbreviations mean, see https://datatracker.ietf.org/doc/html/rfc7230#section-1.2\n///\n/// [ABNF]:https://en.wikipedia.org/wiki/Augmented_Backus%E2%80%93Naur_form\n#[derive(Debug)]\n#[pin_project]\npub struct AwsChunkedBody<InnerBody> {\n    #[pin]\n    inner: InnerBody,\n    #[pin]\n    state: AwsChunkedBodyState,\n    options: AwsChunkedBodyOptions,\n}\n\n// Currently, we only use this in terms of a streaming request body with checksum trailers\ntype Inner = ChecksumBody<SdkBody>;\n\nimpl AwsChunkedBody<Inner> {\n    /// Wrap the given body in an outer body compatible with `Content-Encoding: aws-chunked`\n    pub fn new(body: Inner, options: AwsChunkedBodyOptions) -> Self {\n        Self {\n            inner: body,\n            state: AwsChunkedBodyState::WritingChunkSize,\n            options,\n        }\n    }\n\n    fn encoded_length(&self) -> Option<u64> {\n        if self.options.chunk_length.is_none() && self.options.stream_length.is_none() {\n            return None;\n        }\n\n        let mut length = 0;\n        let stream_length = self.options.stream_length.unwrap_or_default();\n        if stream_length != 0 {\n            if let Some(chunk_length) = self.options.chunk_length {\n                let num_chunks = stream_length / chunk_length;\n                length += num_chunks * get_unsigned_chunk_bytes_length(chunk_length);\n                let remainder = stream_length % chunk_length;\n                if remainder != 0 {\n                    length += get_unsigned_chunk_bytes_length(remainder);\n                }\n            } else {\n                length += get_unsigned_chunk_bytes_length(stream_length);\n            }\n        }\n\n        // End chunk\n        length += CHUNK_TERMINATOR.len() as u64;\n\n        // Trailers\n        for len in self.options.trailer_lens.iter() {\n            length += len + CRLF.len() as u64;\n        }\n\n        // Encoding terminator\n        length += CRLF.len() as u64;\n\n        Some(length)\n    }\n}\n\nfn prefix_with_chunk_size(data: Bytes, chunk_size: u64) -> Bytes {\n    // Len is the size of the entire chunk as defined in `AwsChunkedBodyOptions`\n    let mut prefixed_data = BytesMut::from(format!(\"{:X?}\\r\\n\", chunk_size).as_bytes());\n    prefixed_data.extend_from_slice(&data);\n\n    prefixed_data.into()\n}\n\nfn get_unsigned_chunk_bytes_length(payload_length: u64) -> u64 {\n    let hex_repr_len = int_log16(payload_length);\n    hex_repr_len + CRLF.len() as u64 + payload_length + CRLF.len() as u64\n}\n\nfn trailers_as_aws_chunked_bytes(\n    total_length_of_trailers_in_bytes: u64,\n    trailer_map: Option<HeaderMap>,\n) -> Bytes {\n    use std::fmt::Write;\n\n    // On 32-bit operating systems, we might not be able to convert the u64 to a usize, so we just\n    // use `String::new` in that case.\n    let mut trailers = match usize::try_from(total_length_of_trailers_in_bytes) {\n        Ok(total_length_of_trailers_in_bytes) => {\n            String::with_capacity(total_length_of_trailers_in_bytes)\n        }\n        Err(_) => String::new(),\n    };\n    let mut already_wrote_first_trailer = false;\n\n    if let Some(trailer_map) = trailer_map {\n        for (header_name, header_value) in trailer_map.into_iter() {\n            match header_name {\n                // New name, new value\n                Some(header_name) => {\n                    if already_wrote_first_trailer {\n                        // First trailer shouldn't have a preceding CRLF, but every trailer after it should\n                        trailers.write_str(CRLF).unwrap();\n                    } else {\n                        already_wrote_first_trailer = true;\n                    }\n\n                    trailers.write_str(header_name.as_str()).unwrap();\n                    trailers.write_char(':').unwrap();\n                }\n                // Same name, new value\n                None => {\n                    trailers.write_char(',').unwrap();\n                }\n            }\n            trailers.write_str(header_value.to_str().unwrap()).unwrap();\n        }\n    }\n\n    // Write CRLF to end the body\n    trailers.write_str(CRLF).unwrap();\n    // If we wrote at least one trailer, we need to write an extra CRLF\n    if total_length_of_trailers_in_bytes != 0 {\n        trailers.write_str(CRLF).unwrap();\n    }\n\n    trailers.into()\n}\n\nimpl Body for AwsChunkedBody<Inner> {\n    type Data = Bytes;\n    type Error = aws_smithy_http::body::Error;\n\n    fn poll_data(\n        self: Pin<&mut Self>,\n        cx: &mut Context<'_>,\n    ) -> Poll<Option<Result<Self::Data, Self::Error>>> {\n        tracing::info!(\"polling AwsChunkedBody\");\n        let mut this = self.project();\n\n        match *this.state {\n            AwsChunkedBodyState::WritingChunkSize => match this.inner.poll_data(cx) {\n                Poll::Ready(Some(Ok(data))) => {\n                    // A chunk must be prefixed by chunk size in hexadecimal\n                    tracing::info!(\"writing chunk size and start of chunk\");\n                    *this.state = AwsChunkedBodyState::WritingChunk;\n                    let total_chunk_size = this\n                        .options\n                        .chunk_length\n                        .or(this.options.stream_length)\n                        .unwrap_or_default();\n                    Poll::Ready(Some(Ok(prefix_with_chunk_size(data, total_chunk_size))))\n                }\n                Poll::Ready(None) => {\n                    tracing::info!(\"chunk was empty, writing last-chunk\");\n                    *this.state = AwsChunkedBodyState::WritingTrailers;\n                    Poll::Ready(Some(Ok(Bytes::from(\"0\\r\\n\"))))\n                }\n                Poll::Ready(Some(Err(e))) => Poll::Ready(Some(Err(e))),\n                Poll::Pending => Poll::Pending,\n            },\n            AwsChunkedBodyState::WritingChunk => match this.inner.poll_data(cx) {\n                Poll::Ready(Some(Ok(mut data))) => {\n                    tracing::info!(\"writing rest of chunk data\");\n                    Poll::Ready(Some(Ok(data.copy_to_bytes(data.len()))))\n                }\n                Poll::Ready(None) => {\n                    tracing::info!(\"no more chunk data, writing CRLF and last-chunk\");\n                    *this.state = AwsChunkedBodyState::WritingTrailers;\n                    Poll::Ready(Some(Ok(Bytes::from(\"\\r\\n0\\r\\n\"))))\n                }\n                Poll::Ready(Some(Err(e))) => Poll::Ready(Some(Err(e))),\n                Poll::Pending => Poll::Pending,\n            },\n            AwsChunkedBodyState::WritingTrailers => {\n                return match this.inner.poll_trailers(cx) {\n                    Poll::Ready(Ok(trailers)) => {\n                        *this.state = AwsChunkedBodyState::Closed;\n                        let total_length_of_trailers_in_bytes =\n                            this.options.trailer_lens.iter().fold(0, |acc, n| acc + n);\n\n                        Poll::Ready(Some(Ok(trailers_as_aws_chunked_bytes(\n                            total_length_of_trailers_in_bytes,\n                            trailers,\n                        ))))\n                    }\n                    Poll::Pending => Poll::Pending,\n                    Poll::Ready(Err(e)) => Poll::Ready(Some(Err(e))),\n                };\n            }\n            AwsChunkedBodyState::Closed => {\n                return Poll::Ready(None);\n            }\n        }\n    }\n\n    fn poll_trailers(\n        self: Pin<&mut Self>,\n        _cx: &mut Context<'_>,\n    ) -> Poll<Result<Option<HeaderMap<HeaderValue>>, Self::Error>> {\n        // Trailers were already appended to the body because of the content encoding scheme\n        Poll::Ready(Ok(None))\n    }\n\n    fn is_end_stream(&self) -> bool {\n        self.state == AwsChunkedBodyState::Closed\n    }\n\n    fn size_hint(&self) -> SizeHint {\n        SizeHint::with_exact(\n            self.encoded_length()\n                .expect(\"Requests made with aws-chunked encoding must have known size\")\n                as u64,\n        )\n    }\n}\n\n// Used for finding how many hexadecimal digits it takes to represent a base 10 integer\nfn int_log16<T>(mut i: T) -> u64\nwhere\n    T: std::ops::DivAssign + PartialOrd + From<u8> + Copy,\n{\n    let mut len = 0;\n    let zero = T::from(0);\n    let sixteen = T::from(16);\n\n    while i > zero {\n        i /= sixteen;\n        len += 1;\n    }\n\n    len\n}\n\n#[cfg(test)]\nmod tests {\n    use super::AwsChunkedBody;\n    use crate::content_encoding::AwsChunkedBodyOptions;\n    use aws_smithy_checksums::body::ChecksumBody;\n    use aws_smithy_http::body::SdkBody;\n    use bytes::Buf;\n    use bytes_utils::SegmentedBuf;\n    use http_body::Body;\n    use std::io::Read;\n\n    #[tokio::test]\n    async fn test_aws_chunked_encoded_body() {\n        let input_text = \"Hello world\";\n        let sdk_body = SdkBody::from(input_text);\n        let checksum_body = ChecksumBody::new(sdk_body, \"sha256\");\n        let aws_chunked_body_options = AwsChunkedBodyOptions {\n            stream_length: Some(input_text.len() as u64),\n            chunk_length: None,\n            trailer_lens: vec![\n                \"x-amz-checksum-sha256:ZOyIygCyaOW6GjVnihtTFtIS9PNmskdyMlNKiuyjfzw=\".len() as u64,\n            ],\n        };\n        let mut aws_chunked_body = AwsChunkedBody::new(checksum_body, aws_chunked_body_options);\n\n        let mut output = SegmentedBuf::new();\n        while let Some(buf) = aws_chunked_body.data().await {\n            output.push(buf.unwrap());\n        }\n\n        let mut actual_output = String::new();\n        output\n            .reader()\n            .read_to_string(&mut actual_output)\n            .expect(\"Doesn't cause IO errors\");\n\n        let expected_output = \"B\\r\\nHello world\\r\\n0\\r\\nx-amz-checksum-sha256:ZOyIygCyaOW6GjVnihtTFtIS9PNmskdyMlNKiuyjfzw=\\r\\n\\r\\n\";\n\n        // Verify data is complete and correctly encoded\n        assert_eq!(expected_output, actual_output);\n\n        assert!(\n            aws_chunked_body\n                .trailers()\n                .await\n                .expect(\"checksum generation was without error\")\n                .is_none(),\n            \"aws-chunked encoded bodies don't have normal HTTP trailers\"\n        );\n    }\n\n    #[tokio::test]\n    async fn test_empty_aws_chunked_encoded_body() {\n        let sdk_body = SdkBody::from(\"\");\n        let checksum_body = ChecksumBody::new(sdk_body, \"sha256\");\n        let aws_chunked_body_options = AwsChunkedBodyOptions {\n            stream_length: Some(0),\n            chunk_length: None,\n            trailer_lens: vec![\n                \"x-amz-checksum-sha256:47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=\".len() as u64,\n            ],\n        };\n        let mut aws_chunked_body = AwsChunkedBody::new(checksum_body, aws_chunked_body_options);\n\n        let mut output = SegmentedBuf::new();\n        while let Some(buf) = aws_chunked_body.data().await {\n            output.push(buf.unwrap());\n        }\n\n        let mut actual_output = String::new();\n        output\n            .reader()\n            .read_to_string(&mut actual_output)\n            .expect(\"Doesn't cause IO errors\");\n\n        let expected_output =\n            \"0\\r\\nx-amz-checksum-sha256:47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=\\r\\n\\r\\n\";\n\n        // Verify data is complete and correctly encoded\n        assert_eq!(expected_output, actual_output);\n\n        assert!(\n            aws_chunked_body\n                .trailers()\n                .await\n                .expect(\"checksum generation was without error\")\n                .is_none(),\n            \"aws-chunked encoded bodies don't have normal HTTP trailers\"\n        );\n    }\n}\n```\n\n### Sigv4 Update\n\nWhen sending checksum-verified requests with a streaming body, we must update the usual signing process. Instead of signing the request based on the request body's checksum, we must sign it with a special header instead:\n\n```HTTP\nAuthorization: <computed authorization header value using \"STREAMING-UNSIGNED-PAYLOAD-TRAILER\">\nx-amz-content-sha256: STREAMING-UNSIGNED-PAYLOAD-TRAILER\n```\n\nSetting `STREAMING-UNSIGNED-PAYLOAD-TRAILER` tells the signer that we're sending an unsigned streaming body that will be followed by trailers.\n\nWe can achieve this by:\n- Adding a new variant to `SignableBody`:\n  ```rust,ignore\n  /// A signable HTTP request body\n  #[derive(Debug, Clone, Eq, PartialEq)]\n  #[non_exhaustive]\n  pub enum SignableBody<'a> {\n      // existing variants have been omitted for brevity...\n\n      /// An unsigned payload with trailers\n      ///\n      /// StreamingUnsignedPayloadTrailer is used for streaming requests where the contents of the\n      /// body cannot be known prior to signing **AND** which include HTTP trailers.\n      StreamingUnsignedPayloadTrailer,\n  }\n  ```\n- Updating the `CanonicalRequest::payload_hash` method to include the new `SignableBody` variant:\n  ```rust,ignore\n  fn payload_hash<'b>(body: &'b SignableBody<'b>) -> Cow<'b, str> {\n      // Payload hash computation\n      //\n      // Based on the input body, set the payload_hash of the canonical request:\n      // Either:\n      // - compute a hash\n      // - use the precomputed hash\n      // - use `UnsignedPayload`\n      // - use `StreamingUnsignedPayloadTrailer`\n      match body {\n          SignableBody::Bytes(data) => Cow::Owned(sha256_hex_string(data)),\n          SignableBody::Precomputed(digest) => Cow::Borrowed(digest.as_str()),\n          SignableBody::UnsignedPayload => Cow::Borrowed(UNSIGNED_PAYLOAD),\n          SignableBody::StreamingUnsignedPayloadTrailer => {\n              Cow::Borrowed(STREAMING_UNSIGNED_PAYLOAD_TRAILER)\n          }\n      }\n  }\n  ```\n- *(in generated code)* Inserting the `SignableBody` into the request property bag when making a checksum-verified streaming request:\n  ```rust,ignore\n  if self.checksum_algorithm.is_some() {\n      request\n          .properties_mut()\n          .insert(aws_sig_auth::signer::SignableBody::StreamingUnsignedPayloadTrailer);\n  }\n  ```\n\nIt's possible to send `aws-chunked` requests where each chunk is signed individually. Because this feature isn't strictly necessary for flexible checksums, I've avoided implementing it.\n\n### Inlineables\n\nIn order to avoid writing lots of Rust in Kotlin, I have implemented request and response building functions as inlineables:\n\n- Building checksum-validated requests with in-memory request bodies:\n  ```rust,ignore\n  // In aws/rust-runtime/aws-inlineable/src/streaming_body_with_checksum.rs\n  /// Given a `&mut http::request::Request`, and checksum algorithm name, calculate a checksum and\n  /// then modify the request to include the checksum as a header.\n  pub fn build_checksum_validated_request(\n      request: &mut http::request::Request<aws_smithy_http::body::SdkBody>,\n      checksum_algorithm: &str,\n  ) -> Result<(), aws_smithy_http::operation::BuildError> {\n      let data = request.body().bytes().unwrap_or_default();\n\n      let mut checksum = aws_smithy_checksums::new_checksum(checksum_algorithm);\n      checksum\n          .update(data)\n          .map_err(|err| aws_smithy_http::operation::BuildError::Other(err))?;\n      let checksum = checksum\n          .finalize()\n          .map_err(|err| aws_smithy_http::operation::BuildError::Other(err))?;\n\n      request.headers_mut().insert(\n          aws_smithy_checksums::checksum_algorithm_to_checksum_header_name(checksum_algorithm),\n          aws_smithy_types::base64::encode(&checksum[..])\n              .parse()\n              .expect(\"base64-encoded checksums are always valid header values\"),\n      );\n\n      Ok(())\n  }\n  ```\n- Building checksum-validated requests with streaming request bodies:\n  ```rust,ignore\n  /// Given an `http::request::Builder`, `SdkBody`, and a checksum algorithm name, return a\n  /// `Request<SdkBody>` with checksum trailers where the content is `aws-chunked` encoded.\n  pub fn build_checksum_validated_request_with_streaming_body(\n      request_builder: http::request::Builder,\n      body: aws_smithy_http::body::SdkBody,\n      checksum_algorithm: &str,\n  ) -> Result<http::Request<aws_smithy_http::body::SdkBody>, aws_smithy_http::operation::BuildError> {\n      use http_body::Body;\n\n      let original_body_size = body\n          .size_hint()\n          .exact()\n          .expect(\"body must be sized if checksum is requested\");\n      let body = aws_smithy_checksums::body::ChecksumBody::new(body, checksum_algorithm);\n      let checksum_trailer_name = body.trailer_name();\n      let aws_chunked_body_options = aws_http::content_encoding::AwsChunkedBodyOptions::new()\n          .with_stream_length(original_body_size as usize)\n          .with_trailer_len(body.trailer_length() as usize);\n\n      let body = aws_http::content_encoding::AwsChunkedBody::new(body, aws_chunked_body_options);\n      let encoded_content_length = body\n          .size_hint()\n          .exact()\n          .expect(\"encoded_length must return known size\");\n      let request_builder = request_builder\n          .header(\n              http::header::CONTENT_LENGTH,\n              http::HeaderValue::from(encoded_content_length),\n          )\n          .header(\n              http::header::HeaderName::from_static(\"x-amz-decoded-content-length\"),\n              http::HeaderValue::from(original_body_size),\n          )\n          .header(\n              http::header::HeaderName::from_static(\"x-amz-trailer\"),\n              checksum_trailer_name,\n          )\n          .header(\n              http::header::CONTENT_ENCODING,\n              aws_http::content_encoding::header_value::AWS_CHUNKED.as_bytes(),\n          );\n\n      let body = aws_smithy_http::body::SdkBody::from_dyn(http_body::combinators::BoxBody::new(body));\n\n      request_builder\n          .body(body)\n          .map_err(|err| aws_smithy_http::operation::BuildError::Other(Box::new(err)))\n  }\n  ```\n- Building checksum-validated responses:\n  ```rust,ignore\n  /// Given a `Response<SdkBody>`, checksum algorithm name, and pre-calculated checksum, return a\n  /// `Response<SdkBody>` where the body will processed with the checksum algorithm and checked\n  /// against the pre-calculated checksum.\n  pub fn build_checksum_validated_sdk_body(\n      body: aws_smithy_http::body::SdkBody,\n      checksum_algorithm: &str,\n      precalculated_checksum: bytes::Bytes,\n  ) -> aws_smithy_http::body::SdkBody {\n      let body = aws_smithy_checksums::body::ChecksumValidatedBody::new(\n          body,\n          checksum_algorithm,\n          precalculated_checksum.clone(),\n      );\n      aws_smithy_http::body::SdkBody::from_dyn(http_body::combinators::BoxBody::new(body))\n  }\n\n  /// Given the name of a checksum algorithm and a `HeaderMap`, extract the checksum value from the\n  /// corresponding header as `Some(Bytes)`. If the header is unset, return `None`.\n  pub fn check_headers_for_precalculated_checksum(\n      headers: &http::HeaderMap<http::HeaderValue>,\n  ) -> Option<(&'static str, bytes::Bytes)> {\n      for header_name in aws_smithy_checksums::CHECKSUM_HEADERS_IN_PRIORITY_ORDER {\n          if let Some(precalculated_checksum) = headers.get(&header_name) {\n              let checksum_algorithm =\n                  aws_smithy_checksums::checksum_header_name_to_checksum_algorithm(&header_name);\n              let precalculated_checksum =\n                  bytes::Bytes::copy_from_slice(precalculated_checksum.as_bytes());\n\n              return Some((checksum_algorithm, precalculated_checksum));\n          }\n      }\n\n      None\n  }\n  ```\n\n## Codegen\n\nCodegen will be updated to insert the appropriate inlineable functions for operations that are tagged with the `@httpchecksum` trait. Some operations will require an MD5 checksum fallback if the user hasn't set a checksum themselves.\n\nUsers also have the option of supplying a precalculated checksum of their own. This is already handled by our current header insertion logic and won't require updating the existing implementation. Because this checksum validation behavior is AWS-specific, it will be defined in SDK codegen.\n\n## Implementation Checklist\n\n- [ ] Implement codegen for building checksum-validated requests:\n  - [ ] In-memory request bodies\n    - [ ] Support MD5 fallback behavior for services that enable it.\n  - [ ] Streaming request bodies\n- [ ] Implement codegen for building checksum-validated responses:\n\n[1]: https://aws.amazon.com/blogs/aws/new-additional-checksum-algorithms-for-amazon-s3/\n[2]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Trailer\n[3]: https://developer.mozilla.org/en-US/docs/Glossary/CRLF\n[RFC0013]: ./rfc0013_body_callback_apis.md\n"
  },
  {
    "path": "design/src/rfcs/rfc0017_customizable_client_operations.md",
    "content": "RFC: Customizable Client Operations\n===================================\n\n> Status: Implemented\n\nFor a summarized list of proposed changes, see the [Changes Checklist](#changes-checklist) section.\n\nSDK customers occasionally need to add additional HTTP headers to requests, and currently,\nthe SDK has no easy way to accomplish this. At time of writing, the lower level Smithy\nclient has to be used to create an operation, and then the HTTP request augmented on\nthat operation type. For example:\n\n```rust,ignore\nlet input = SomeOperationInput::builder().some_value(5).build()?;\n\nlet operation = {\n    let op = input.make_operation(&service_config).await?;\n    let (request, response) = op.into_request_response();\n\n    let request = request.augment(|req, _props| {\n        req.headers_mut().insert(\n            HeaderName::from_static(\"x-some-header\"),\n            HeaderValue::from_static(\"some-value\")\n        );\n        Result::<_, Infallible>::Ok(req)\n    })?;\n\n    Operation::from_parts(request, response)\n};\n\nlet response = smithy_client.call(operation).await?;\n```\n\nThis approach is both difficult to discover and implement since it requires acquiring\na Smithy client rather than the generated fluent client, and it's anything but ergonomic.\n\nThis RFC proposes an easier way to augment requests that is compatible with the fluent\nclient.\n\nTerminology\n-----------\n\n- **Smithy Client**: A `aws_smithy_client::Client<C, M, R>` struct that is responsible for gluing together\n  the connector, middleware, and retry policy.\n- **Fluent Client**: A code generated `Client` that has methods for each service operation on it.\n  A fluent builder is generated alongside it to make construction easier.\n\nProposal\n--------\n\nThe code generated fluent builders returned by the fluent client should have a method added to them,\nsimilar to `send`, but that returns a customizable request. The customer experience should look as\nfollows:\n\n```rust,ignore\nlet response = client.some_operation()\n    .some_value(5)\n    .customize()\n    .await?\n    .mutate_request(|mut req| {\n        req.headers_mut().insert(\n            HeaderName::from_static(\"x-some-header\"),\n            HeaderValue::from_static(\"some-value\")\n        );\n    })\n    .send()\n    .await?;\n```\n\nThis new async `customize` method would return the following:\n\n```rust,ignore\npub struct CustomizableOperation<O, R> {\n    handle: Arc<Handle>,\n    operation: Operation<O, R>,\n}\n\nimpl<O, R> CustomizableOperation<O, R> {\n    // Allows for customizing the operation's request\n    fn map_request<E>(\n        mut self,\n        f: impl FnOnce(Request<SdkBody>) -> Result<Request<SdkBody>, E>,\n    ) -> Result<Self, E> {\n        let (request, response) = self.operation.into_request_response();\n        let request = request.augment(|req, _props| f(req))?;\n        self.operation = Operation::from_parts(request, response);\n        Ok(self)\n    }\n\n    // Convenience for `map_request` where infallible direct mutation of request is acceptable\n    fn mutate_request<E>(\n        mut self,\n        f: impl FnOnce(&mut Request<SdkBody>) -> (),\n    ) -> Self {\n        self.map_request(|mut req| {\n            f(&mut req);\n            Result::<_, Infallible>::Ok(req)\n        }).expect(\"infallible\");\n        Ok(self)\n    }\n\n    // Allows for customizing the entire operation\n    fn map_operation<E>(\n        mut self,\n        f: impl FnOnce(Operation<O, R>) -> Result<Operation<O, R>, E>,\n    ) -> Result<Self, E> {\n        self.operation = f(self.operation)?;\n        Ok(self)\n    }\n\n    // Direct access to read the request\n    fn request(&self) -> &Request<SdkBody> {\n        self.operation.request()\n    }\n\n    // Direct access to mutate the request\n    fn request_mut(&mut self) -> &mut Request<SdkBody> {\n        self.operation.request_mut()\n    }\n\n    // Sends the operation's request\n    async fn send<T, E>(self) -> Result<T, SdkError<E>>\n    where\n        O: ParseHttpResponse<Output = Result<T, E>> + Send + Sync + Clone + 'static,\n        E: std::error::Error,\n        R: ClassifyResponse<SdkSuccess<T>, SdkError<E>> + Send + Sync,\n    {\n        self.handle.client.call(self.operation).await\n    }\n}\n```\n\nAdditionally, for those who want to avoid closures, the `Operation` type will have\n`request` and `request_mut` methods added to it to get direct access to its underlying\nHTTP request.\n\nThe `CustomizableOperation` type will then mirror these functions so that the experience\ncan look as follows:\n\n```rust,ignore\nlet mut operation = client.some_operation()\n    .some_value(5)\n    .customize()\n    .await?;\noperation.request_mut()\n    .headers_mut()\n    .insert(\n        HeaderName::from_static(\"x-some-header\"),\n        HeaderValue::from_static(\"some-value\")\n    );\nlet response = operation.send().await?;\n```\n\n### Why not remove `async` from `customize` to make this more ergonomic?\n\nIn the proposal above, customers must `await` the result of `customize` in order\nto get the `CustomizableOperation`. This is a result of the underlying `map_operation`\nfunction that `customize` needs to call being async, which was made async during\nthe implementation of customizations for Glacier (see #797, #801, and #1474). It\nis possible to move these Glacier customizations into middleware to make `map_operation`\nsync, but keeping it async is much more future-proof since if a future customization\nor feature requires it to be async, it won't be a breaking change in the future.\n\n### Why the name `customize`?\n\nAlternatively, the name `build` could be used, but this increases the odds that\ncustomers won't realize that they can call `send` directly, and then call a longer\n`build`/`send` chain when customization isn't needed:\n\n```rust,ignore\nclient.some_operation()\n    .some_value()\n    .build() // Oops, didn't need to do this\n    .send()\n    .await?;\n```\n\nvs.\n\n```rust,ignore\nclient.some_operation()\n    .some_value()\n    .send()\n    .await?;\n```\n\nAdditionally, no AWS services at time of writing have a member named `customize`\nthat would conflict with the new function, so adding it would not be a breaking change.\n\nChanges Checklist\n-----------------\n\n- [x] Create `CustomizableOperation` as an inlinable, and code generate it into `client` so that it has access to `Handle`\n- [x] Code generate the `customize` method on fluent builders\n- [x] Update the `RustReservedWords` class to include `customize`\n- [x] Add ability to mutate the HTTP request on `Operation`\n- [ ] Add examples for both approaches\n- [ ] Comment on older discussions asking about how to do this with this improved approach\n"
  },
  {
    "path": "design/src/rfcs/rfc0018_logging_sensitive.md",
    "content": "# RFC: Logging in the Presence of Sensitive Data\n\n> Status: Accepted\n\nSmithy provides a [sensitive trait](https://awslabs.github.io/smithy/1.0/spec/core/documentation-traits.html#sensitive-trait) which exists as a `@sensitive` field annotation syntactically and has the following semantics:\n\n> Sensitive data MUST NOT be exposed in things like exception messages or log output. Application of this trait SHOULD NOT affect wire logging (i.e., logging of all data transmitted to and from servers or clients).\n\nThis RFC is concerned with solving the problem of honouring this specification in the context of logging.\n\nProgress has been made towards this goal in the form of the [Sensitive Trait PR](https://github.com/smithy-lang/smithy-rs/pull/229), which uses code generation to remove sensitive fields from `Debug` implementations.\n\nThe problem remains open due to the existence of HTTP binding traits and a lack of clearly defined user guidelines which customers may follow to honour the specification.\n\nThis RFC proposes:\n\n- A new logging middleware is generated and applied to each `OperationHandler` `Service`.\n- A developer guideline is provided on how to avoid violating the specification.\n\n## Terminology\n\n- **Model**: A [Smithy Model](https://awslabs.github.io/smithy/1.0/spec/core/model.html), usually pertaining to the one in use by the customer.\n- **Runtime crate**: A crate existing within the `rust-runtime` folder, used to implement shared functionalities that do not have to be code-generated.\n- **Service**: The [tower::Service](https://docs.rs/tower-service/latest/tower_service/trait.Service.html) trait. The lowest level of abstraction we deal with when making HTTP requests. Services act directly on data to transform and modify that data. A Service is what eventually turns a request into a response.\n- **Middleware**: Broadly speaking, middleware modify requests and responses. Concretely, these are exist as implementations of [Layer](https://docs.rs/tower/latest/tower/layer/trait.Layer.html)/a `Service` wrapping an inner `Service`.\n- **Potentially sensitive**: Data that _could_ be bound to a sensitive field of a structure, for example via the [HTTP Binding Traits](#http-binding-traits).\n\n## Background\n\n### HTTP Binding Traits\n\nSmithy provides various HTTP binding traits. These allow protocols to configure a HTTP request by way of binding fields to parts of the request. For this reason sensitive data might be unintentionally leaked through logging of a bound request.\n\n| Trait                                                                                                        | Configurable     |\n|--------------------------------------------------------------------------------------------------------------|------------------|\n| [httpHeader](https://awslabs.github.io/smithy/1.0/spec/core/http-traits.html#httpheader-trait)               | Headers          |\n| [httpPrefixHeaders](https://awslabs.github.io/smithy/1.0/spec/core/http-traits.html#httpprefixheaders-trait) | Headers          |\n| [httpLabel](https://awslabs.github.io/smithy/1.0/spec/core/http-traits.html#httplabel-trait)                 | URI              |\n| [httpPayload](https://awslabs.github.io/smithy/1.0/spec/core/http-traits.html#httppayload-trait)             | Payload          |\n| [httpQuery](https://awslabs.github.io/smithy/1.0/spec/core/http-traits.html#httpquery-trait)                 | Query Parameters |\n| [httpResponseCode](https://awslabs.github.io/smithy/1.0/spec/core/http-traits.html#httpresponsecode-trait)   | Status Code      |\n\nEach of these configurable parts must therefore be logged cautiously.\n\n### Scope and Guidelines\n\nIt would be unfeasible to forbid the logging of sensitive data all together using the type system. With the current API, the customer will always have an opportunity to log a request containing sensitive data before it enters the `Service<Request<B>>` that we provide to them.\n\n```rust,ignore\n// The API provides us with a `Service<Request<B>>`\nlet app: Router = OperationRegistryBuilder::default().build().expect(\"unable to build operation registry\").into();\n\n// We can `ServiceExt::map_request` log a request with potentially sensitive data\nlet app = app.map_request(|request| {\n        info!(?request);\n        request\n    });\n```\n\nA more subtle violation of the specification may occur when the customer enables verbose logging - a third-party dependency might simply log data marked as sensitive, for example `tokio` or `hyper`.\n\nThese two cases illustrate that `smithy-rs` can only prevent violation of the specification in a restricted scope - logs emitted from generated code and the runtime crates. A `smithy-rs` specific guideline should be available to the customer which outlines how to avoid violating the specification in areas outside of our control.\n\n### Routing\n\nThe sensitivity and HTTP bindings are declared within specific structures/operations. For this reason, in the general case, it's unknowable whether or not any given part of a request is sensitive until we determine which operation is tasked with handling the request and hence which fields are bound. Implementation wise, this means that any middleware applied _before_ routing has taken place cannot log anything potentially sensitive without performing routing logic itself.\n\nNote that:\n\n- We are not required to deserialize the entire request before we can make judgments on what data is sensitive or not - only which operation it has been routed to.\n- We are permitted to emit logs prior to routing when:\n  - they contain no potentially sensitive data, or\n  - the request failed to route, in which case it's not subject to the constraints of an operation.\n\n### Runtime Crates\n\nThe crates existing in `rust-runtime` are not code generated - their source code is agnostic to the specific model in use. For this reason, if such a crate wanted to log potentially sensitive data then there must be a way to conditionally toggle that log without manipulation of the source code. Any proposed solution must acknowledge this concern.\n\n## Proposal\n\nThis proposal serves to honor the sensitivity specification via code generation of a logging middleware which is aware of the sensitivity, together with a developer contract disallowing logging potentially sensitive data in the runtime crates. A developer guideline should be provided in addition to the middleware.\n\nAll data known to be sensitive should be replaced with `\"{redacted}\"` when logged. Implementation wise this means that [tracing::Event](https://docs.rs/tracing/latest/tracing/struct.Event.html)s and [tracing::Span](https://docs.rs/tracing/latest/tracing/struct.Span.html)s of the form `debug!(field = \"sensitive data\")` and `span!(..., field = \"sensitive data\")` must become `debug!(field = \"{redacted}\")` and `span!(..., field = \"{redacted}\")`.\n\n### Debug Logging\n\nDevelopers might want to observe sensitive data for debugging purposes. It should be possible to opt-out of the redactions by enabling a feature flag `unredacted-logging` (which is disabled by default).\n\nTo prevent excessive branches such as\n\n```rust,ignore\nif cfg!(feature = \"unredacted-logging\") {\n    debug!(%data, \"logging here\");\n} else {\n    debug!(data = \"{redacted}\", \"logging here\");\n}\n```\n\nthe following wrapper should be provided from a runtime crate:\n\n```rust,ignore\npub struct Sensitive<T>(T);\n\nimpl<T> Debug for Sensitive<T>\nwhere\n    T: Debug\n{\n    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error> {\n        if cfg!(feature = \"unredacted-logging\") {\n            self.0.fmt(f)\n        } else {\n            \"{redacted}\".fmt(f)\n        }\n    }\n}\n\nimpl<T> Display for Sensitive<T>\nwhere\n    T: Display\n{\n    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error> {\n        if cfg!(feature = \"unredacted-logging\") {\n            self.0.fmt(f)\n        } else {\n            \"{redacted}\".fmt(f)\n        }\n    }\n}\n```\n\nIn which case the branch above becomes\n\n```rust,ignore\ndebug!(sensitive_data = %Sensitive(data));\n```\n\n### Code Generated Logging Middleware\n\nUsing the smithy model, for each operation, a logging middleware should be generated. Through the model, the code generation knows which fields are sensitive and which HTTP bindings exist, therefore the logging middleware can be carefully crafted to avoid leaking sensitive data.\n\nAs a request enters this middleware it should record the method, HTTP headers, status code, and URI in a `tracing::span`. As a response leaves this middleware it should record the HTTP headers and status code in a `tracing::debug`.\n\nThe following model\n\n```smithy\n@readonly\n@http(uri: \"/inventory/{name}\", method: \"GET\")\noperation Inventory {\n    input: Product,\n    output: Stocked\n}\n\n@input\nstructure Product {\n    @required\n    @sensitive\n    @httpLabel\n    name: String\n}\n\n@output\nstructure Stocked {\n    @sensitive\n    @httpResponseCode\n    code: String,\n}\n```\n\nshould generate the following\n\n```rust,ignore\n// NOTE: This code is intended to show behavior - it does not compile\n\npub struct InventoryLogging<S> {\n    inner: S,\n    operation_name: &'static str\n}\n\nimpl<S> InventoryLogging<S> {\n    pub fn new(inner: S) -> Self {\n        Self {\n            inner\n        }\n    }\n}\n\nimpl<B, S> Service<Request<B>> for InventoryLogging<S>\nwhere\n    S: Service<Request<B>>\n{\n    type Response = Response<BoxBody>;\n    type Error = S::Error;\n    type Future = /* Implementation detail */;\n\n    fn call(&mut self, request: Request<B>) -> Self::Future {\n        // Remove sensitive data from parts of the HTTP\n        let uri = /* redact {name} from URI */;\n        let headers = /* no redactions */;\n\n        let fut = async {\n            let response = self.inner.call(request).await;\n            let status_code = /* redact status code */;\n            let headers = /* no redactions */;\n\n            debug!(%status_code, ?headers, \"response\");\n\n            response\n        };\n\n        // Instrument the future with a span\n        let span = debug_span!(\"request\", operation = %self.operation_name, method = %request.method(), %uri, ?headers);\n        fut.instrument(span)\n    }\n}\n```\n\n### HTTP Debug/Display Wrappers\n\nThe `Service::call` path, seen in [Code Generated Logging Middleware](#code-generated-logging-middleware), is latency-sensitive. Careful implementation is required to avoid excess allocations during redaction of sensitive data. Wrapping [Uri](https://docs.rs/http/latest/http/uri/struct.Uri.html) and [HeaderMap](https://docs.rs/http/latest/http/header/struct.HeaderMap.html) then providing a new [Display](https://doc.rust-lang.org/std/fmt/trait.Display.html)/[Debug](https://doc.rust-lang.org/std/fmt/trait.Debug.html) implementation which skips over the sensitive data is preferable over allocating a new `String`/`HeaderMap` and then mutating it.\n\nThese wrappers should be provided alongside the `Sensitive` struct described in [Debug Logging](#debug-logging). If they are implemented on top of `Sensitive`, they will inherit the same behavior - allowing redactions to be toggled using `unredacted-logging` feature flag.\n\n### Middleware Position\n\nThis logging middleware should be applied outside of the [OperationHandler](https://github.com/smithy-lang/smithy-rs/blob/cd0563020abcde866a741fa123e3f2e18e1be1c9/rust-runtime/inlineable/src/server_operation_handler_trait.rs#L17-L21) after its construction in the (generated) `operation_registry.rs` file. The middleware should preserve the associated types of the `OperationHandler` (`Response = Response<BoxBody>`, `Error = Infallible`) to cause minimal disruption.\n\nAn easy position to apply the logging middleware is illustrated below in the form of `Logging{Operation}::new`:\n\n```rust,ignore\nlet empty_operation = LoggingEmptyOperation::new(operation(registry.empty_operation));\nlet get_pokemon_species = LoggingPokemonSpecies::new(operation(registry.get_pokemon_species));\nlet get_server_statistics = LoggingServerStatistics::new(operation(registry.get_server_statistics));\nlet routes = vec![\n    (BoxCloneService::new(empty_operation), empty_operation_request_spec),\n    (BoxCloneService::new(get_pokemon_species), get_pokemon_species_request_spec),\n    (BoxCloneService::new(get_server_statistics), get_server_statistics_request_spec),\n];\nlet router = aws_smithy_http_server::routing::Router::new_rest_json_router(routes);\n```\n\nAlthough an acceptable first step, putting logging middleware here is suboptimal - the `Router` allows a `tower::Layer` to be applied to the operation by using the [Router::layer](https://github.com/smithy-lang/smithy-rs/blob/main/rust-runtime/aws-smithy-http-server/src/routing/mod.rs#L146) method. This middleware will be applied _outside_ of the logging middleware and, as a result, will not be subject to the span of any middleware. Therefore, the `Router` must be changed to allow for middleware to be applied within the logging middleware rather than outside of it.\n\nThis is a general problem, not specific to this proposal. For example, [Use Request Extensions](#use-request-extensions) must also solve this problem.\n\nFortunately, this problem is separable from the actual implementation of the logging middleware and we can get immediate benefit by application of it in the suboptimal position described above.\n\n### Logging within the Router\n\nThere is need for logging within the `Router` implementation - this is a crucial area of business logic. As mentioned in the [Routing](#routing) section, we are permitted to log potentially sensitive data in cases where requests fail to get routed to an operation.\n\nIn the case of AWS JSON 1.0 and 1.1 protocols, the request URI is always `/`, putting it outside of the reach of the `@sensitive` trait. We therefore have the option to log it before routing occurs. We make a choice not to do this in order to remove the special case - relying on the logging layer to log URIs when appropriate.\n\n### Developer Guideline\n\nA guideline should be made available, which includes:\n\n- The [HTTP bindings traits](#http-binding-traits) and why they are of concern in the presence of `@sensitive`.\n- The [Debug implementation](https://github.com/smithy-lang/smithy-rs/pull/229) on structures.\n- How to use the `Sensitive` struct, HTTP wrappers, and the `unredacted-logging` feature flag described in [Debug Logging](#debug-logging) and [HTTP Debug/Display Wrappers](#http-debugdisplay-wrappers).\n- A warning against the two potential leaks described in [Scope and Guidelines](#scope-and-guidelines):\n  - Sensitive data leaking from third-party dependencies.\n  - Sensitive data leaking from middleware applied to the `Router`.\n\n## Alternative Proposals\n\nAll of the following proposals are compatible with, and benefit from, [Debug Logging](#debug-logging), [HTTP Debug/Display Wrappers](#http-debugdisplay-wrappers), and [Developer Guideline](#developer-guideline) portions of the main proposal.\n\nThe main proposal disallows the logging of potentially sensitive data in the runtime crates, instead opting for a dedicated code generated logging middleware. In contrast, the following proposals all seek ways to accommodate logging of potentially sensitive data in the runtime crates.\n\n### Use Request Extensions\n\nRequest extensions can be used to adjoin data to a Request as it passes through the middleware. Concretely, they exist as the type map [http::Extensions](https://docs.rs/http/latest/http/struct.Extensions.html) accessed via [http::extensions](https://docs.rs/http/latest/http/request/struct.Request.html#method.extensions) and [http::extensions_mut](https://docs.rs/http/latest/http/request/struct.Request.html#method.extensions_mut).\n\nThese can be used to provide data to middleware interested in logging potentially sensitive data.\n\n```rust,ignore\nstruct Sensitivity {\n    /* Data concerning which parts of the request are sensitive */\n}\n\nstruct Middleware<S> {\n    inner: S\n}\n\nimpl<B, S> Service<Request<B>> for Middleware<S> {\n    /* ... */\n\n    fn call(&mut self, request: Request<B>) -> Self::Future {\n        if let Some(sensitivity) = request.extensions().get::<Sensitivity>() {\n            if sensitivity.is_method_sensitive() {\n                debug!(method = %request.method());\n            }\n        }\n\n        /* ... */\n\n        self.inner.call(request)\n    }\n}\n```\n\nA middleware layer must be code generated (much in the same way as the logging middleware) which is dedicated to inserting the `Sensitivity` struct into the extensions of each incoming request.\n\n```rust,ignore\nimpl<B, S> Service<Request<B>> for SensitivityInserter<S>\nwhere\n    S: Service<Request<B>>\n{\n    /* ... */\n\n    fn call(&mut self, request: Request<B>) -> Self::Future {\n        let sensitivity = Sensitivity {\n            /* .. */\n        };\n        request.extensions_mut().insert(sensitivity);\n\n        self.inner.call(request)\n    }\n}\n```\n\n#### Advantages\n\n- Applicable to _all_ middleware which takes `http::Request<B>`.\n- Does not pollute the API of the middleware - code internal to middleware simply inspects the request's extensions and performs logic based on its value.\n\n#### Disadvantages\n\n- The sensitivity and HTTP bindings are known at compile time whereas the insertion/retrieval of the extension data is done at runtime.\n  - [http::Extensions](https://docs.rs/http/latest/http/struct.Extensions.html) is approximately a `HashMap<u64, Box<dyn Any>>` so lookup/insertion involves indirection/cache misses/heap allocation.\n\n### Accommodate the Sensitivity in Middleware API\n\nIt is possible that sensitivity is a parameter passed to middleware during construction. This is similar in nature to [Use Request Extensions](#use-request-extensions) except that the `Sensitivity` is passed to middleware during construction.\n\n```rust,ignore\nstruct Middleware<S> {\n    inner: S,\n    sensitivity: Sensitivity\n}\n\nimpl Middleware<S> {\n    pub fn new(inner: S) -> Self { /* ... */ }\n\n    pub fn new_with_sensitivity(inner: S, sensitivity: Sensitivity) -> Self { /* ... */ }\n}\n\nimpl<B, S> Service<Request<B>> for Middleware<S> {\n    /* ... */\n\n    fn call(&mut self, request: Request<B>) -> Self::Future {\n        if self.sensitivity.is_method_sensitive() {\n            debug!(method = %Sensitive(request.method()));\n        }\n\n        /* ... */\n\n        self.inner.call(request)\n    }\n}\n```\n\nIt would then be required that the code generation responsible constructing a `Sensitivity` for each operation. Additionally, if any middleware is being applied to a operation then the code generation would be responsible for passing that middleware the appropriate `Sensitivity` before applying it.\n\n#### Advantages\n\n- Applicable to _all_ middleware.\n- As the `Sensitivity` struct will be known statically, the compiler will remove branches, making it cheap.\n\n#### Disadvantages\n\n- Pollutes the API of middleware.\n\n### Redact values using a tracing Layer\n\nDistinct from `tower::Layer`, a [tracing::Layer](https://docs.rs/tracing-subscriber/latest/tracing_subscriber/layer/trait.Layer.html) is a \"composable handler for `tracing` events\". It would be possible to write an implementation which would filter out events which contain sensitive data.\n\nExamples of filtering `tracing::Layer`s already exist in the form of the [EnvFilter](https://docs.rs/tracing-subscriber/latest/tracing_subscriber/filter/struct.EnvFilter.html) and [Targets](https://docs.rs/tracing-subscriber/latest/tracing_subscriber/filter/targets/struct.Targets.html). It is unlikely that we'll be able to leverage them for our use, but the underlying principle remains the same - the `tracing::Layer` inspects `tracing::Event`s/`tracing::Span`s, filtering them based on some criteria.\n\nCode generation would be need to be used in order to produce the filtering criteria from the models. Internal developers would need to adhere to a common set of field names in order for them to be subject to the filtering. Spans would need to be opened after routing occurs in order for the `tracing::Layer` to know which operation `Event`s are being produced within and hence which filtering rules to apply.\n\n#### Advantages\n\n- Applicable to _all_ middleware.\n- Good separation of concerns:\n  - Does not pollute the API of the middleware\n  - No specific logic required within middleware.\n\n#### Disadvantages\n\n- Complex implementation.\n- Not necessarily fast.\n- `tracing::Layer`s seem to only support filtering entire `Event`s, rather than more fine grained removal of fields.\n\n## Changes Checklist\n\n- [x] Implement and integrate code generated logging middleware.\n  - <https://github.com/smithy-lang/smithy-rs/pull/1550>\n- [x] Add logging to `Router` implementation.\n  - <https://github.com/smithy-lang/smithy-rs/issues/1666>\n- [x] Write developer guideline.\n  - <https://github.com/smithy-lang/smithy-rs/pull/1772>\n- [x] Refactor `Router` to allow for better positioning described in [Middleware Position](#middleware-position).\n  - <https://github.com/smithy-lang/smithy-rs/pull/1620>\n  - <https://github.com/smithy-lang/smithy-rs/pull/1679>\n  - <https://github.com/smithy-lang/smithy-rs/pull/1693>\n"
  },
  {
    "path": "design/src/rfcs/rfc0019_event_streams_errors.md",
    "content": "<!-- Give your RFC a descriptive name saying what it would accomplish or what feature it defines -->\nRFC: Errors for event streams\n=============\n\n<!-- RFCs start with the \"RFC\" status and are then either \"Implemented\" or \"Rejected\".  -->\n> Status: Implemented\n\n<!-- A great RFC will include a list of changes at the bottom so that the implementor can be sure they haven't missed anything -->\nFor a summarized list of proposed changes, see the [Changes Checklist](#changes-checklist) section.\n\n<!-- Insert a short paragraph explaining, at a high level, what this RFC is for -->\nThis RFC defines how client and server will use errors defined in `@streaming` unions (event streams).\n\n<!-- Explain how users will use this new feature and, if necessary, how this compares to the current user experience -->\nThe user experience if this RFC is implemented\n----------------------------------------------\n\nIn the current version of smithy-rs, customers who want to use errors in event streams need to use them as so:\n```rust,ignore\nstream! {\n    yield Ok(EventStreamUnion::ErrorVariant ...)\n}\n```\nFurthermore, there is no support for `@error`s in event streams being terminal; that is, when an error is sent,\nit does not signal termination and thus does not complete the stream.\n\nThis RFC proposes to make changes to:\n* terminate the stream upon receiving a modeled error\n* change the API so that customers will write their business logic in a more Rust-like experience:\n```rust,ignore\nstream! {\n    yield Err(EventStreamUnionError::ErrorKind ...)\n}\n```\nThus any `Err(_)` from the stream is terminal, rather than any `Ok(x)` with `x` being matched against the set of modeled variant errors in the union.\n\n<!-- Explain the implementation of this new feature -->\nHow to actually implement this RFC\n----------------------------------\n\nIn order to implement this feature:\n* Errors modeled in streaming unions are going to be treated like operation errors\n  * They are in the `error::` namespace\n  * They have the same methods operation errors have (`name` on the server, `metadata` on the client and so on)\n  * They are not variants in the corresponding error structure\n* Errors need to be marshalled and unmarshalled\n* `Receiver` must treat any error coming from the other end as terminal\n\nThe code examples below have been generated using the [following model](https://github.com/smithy-lang/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/codegen-server-test/model/pokemon.smithy#L27):\n```smithy\n@http(uri: \"/capture-pokemon-event/{region}\", method: \"POST\")\noperation CapturePokemonOperation {\n    input: CapturePokemonOperationEventsInput,\n    output: CapturePokemonOperationEventsOutput,\n    errors: [UnsupportedRegionError, ThrottlingError]\n}\n\n@input\nstructure CapturePokemonOperationEventsInput {\n    @httpPayload\n    events: AttemptCapturingPokemonEvent,\n\n    @httpLabel\n    @required\n    region: String,\n}\n\n@output\nstructure CapturePokemonOperationEventsOutput {\n    @httpPayload\n    events: CapturePokemonEvents,\n}\n\n@streaming\nunion AttemptCapturingPokemonEvent {\n    event: CapturingEvent,\n    masterball_unsuccessful: MasterBallUnsuccessful,\n}\n\nstructure CapturingEvent {\n    @eventPayload\n    payload: CapturingPayload,\n}\n\nstructure CapturingPayload {\n    name: String,\n    pokeball: String,\n}\n\n@streaming\nunion CapturePokemonEvents {\n    event: CaptureEvent,\n    invalid_pokeball: InvalidPokeballError,\n    throttlingError: ThrottlingError,\n}\n\nstructure CaptureEvent {\n    @eventHeader\n    name: String,\n    @eventHeader\n    captured: Boolean,\n    @eventHeader\n    shiny: Boolean,\n    @eventPayload\n    pokedex_update: Blob,\n}\n\n@error(\"server\")\nstructure UnsupportedRegionError {\n    @required\n    region: String,\n}\n@error(\"client\")\nstructure InvalidPokeballError {\n    @required\n    pokeball: String,\n}\n@error(\"server\")\nstructure MasterBallUnsuccessful {\n    @required\n    message: String,\n}\n@error(\"client\")\nstructure ThrottlingError {}\n```\nWherever irrelevant, documentation and other lines are stripped out from the code examples below.\n\n#### Errors in streaming unions\n\nThe error in `AttemptCapturingPokemonEvent` is modeled as follows.\n\nOn the client,\n```rust,ignore\npub struct AttemptCapturingPokemonEventError {\n    pub kind: AttemptCapturingPokemonEventErrorKind,\n    pub(crate) meta: aws_smithy_types::Error,\n}\npub enum AttemptCapturingPokemonEventErrorKind {\n    MasterBallUnsuccessful(crate::error::MasterBallUnsuccessful),\n    Unhandled(Box<dyn std::error::Error + Send + Sync + 'static>),\n}\n```\n\nOn the server,\n```rust,ignore\npub enum AttemptCapturingPokemonEventError {\n    MasterBallUnsuccessful(crate::error::MasterBallUnsuccessful),\n}\n```\n\nBoth are modeled as normal errors, where the [name](https://github.com/smithy-lang/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/generators/error/CombinedErrorGenerator.kt#L50) comes from `Error` with a prefix of the union's name.\nIn fact, both the [client](https://github.com/smithy-lang/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/generators/error/CombinedErrorGenerator.kt#L71) and [server](https://github.com/smithy-lang/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerCombinedErrorGenerator.kt#L46)\ngenerate operation errors and event stream errors the same way.\n\nEvent stream errors have their own [marshaller](https://github.com/smithy-lang/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/protocols/serialize/EventStreamErrorMarshallerGenerator.kt#L39).\nTo make it work for users to stream errors, `EventStreamSender<>`, in addition to the union type `T`, takes an error type `E`; that is, the `AttemptCapturingPokemonEventError` in the example.\nThis means that an error from the stream is [marshalled and sent](https://github.com/smithy-lang/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/rust-runtime/aws-smithy-http/src/event_stream/sender.rs#L137) as a data structure similarly to the union's non-error members.\n\nOn the other side, the `Receiver<>` needs to terminate the stream upon [receiving any error](https://github.com/smithy-lang/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/rust-runtime/aws-smithy-http/src/event_stream/receiver.rs#L249).\nA terminated stream has [no more data](https://github.com/smithy-lang/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/rust-runtime/aws-smithy-http/src/event_stream/receiver.rs#L38) and will always be a [bug](https://github.com/smithy-lang/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/rust-runtime/aws-smithy-http/src/event_stream/receiver.rs#L54) to use it.\n\nAn example of how errors can be used on clients, extracted from [this test](https://github.com/smithy-lang/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/rust-runtime/aws-smithy-http-server/examples/pokemon_service/tests/simple_integration_test.rs#L100):\n```rust,ignore\nyield Err(AttemptCapturingPokemonEventError::new(\n    AttemptCapturingPokemonEventErrorKind::MasterBallUnsuccessful(MasterBallUnsuccessful::builder().build()),\n    Default::default()\n));\n```\n\nBecause unions can be used in input or output of more than one operation, errors must be generated once as they are in the `error::` namespace.\n\n<!-- Include a checklist of all the things that need to happen for this RFC's implementation to be considered complete -->\nChanges checklist\n-----------------\n\n- [x] Errors are in the `error::` namespace and created as operation errors\n- [x] Errors can be sent to the stream\n- [x] Errors terminate the stream\n- [x] Customers' experience using errors mirrors the Rust way: `Err(error::StreamingError ...)`\n"
  },
  {
    "path": "design/src/rfcs/rfc0020_service_builder.md",
    "content": "# RFC: Service Builder Improvements\n\n> Status: Accepted\n\nOne might characterize `smithy-rs` as a tool for transforming a [Smithy service](https://awslabs.github.io/smithy/1.0/spec/core/model.html#service) into a [tower::Service](https://docs.rs/tower-service/latest/tower_service/trait.Service.html) builder. A Smithy model defines behavior of the generated service partially - handlers must be passed to the builder before the `tower::Service` is fully specified. This builder structure is the primary API surface we provide to the customer, as a result, it is important that it meets their needs.\n\nThis RFC proposes a new builder, deprecating the existing one, which addresses API deficiencies and takes steps to improve performance.\n\n## Terminology\n\n- **Model**: A [Smithy Model](https://awslabs.github.io/smithy/1.0/spec/core/model.html), usually pertaining to the one in use by the customer.\n- **Smithy Service**: The entry point of an API that aggregates [resources](https://awslabs.github.io/smithy/1.0/spec/core/model.html#resource) and [operations](https://awslabs.github.io/smithy/1.0/spec/core/model.html#operation) together within a Smithy model. Described in detail [here](https://awslabs.github.io/smithy/1.0/spec/core/model.html#service).\n- **Service**: The `tower::Service` trait is an interface for writing network applications in a modular and reusable way. `Service`s act on requests to produce responses.\n- **Service Builder**: A `tower::Service` builder, generated from a Smithy service, by `smithy-rs`.\n- **Middleware**: Broadly speaking, middleware modify requests and responses. Concretely, these are exist as implementations of [Layer](https://docs.rs/tower/latest/tower/layer/trait.Layer.html)/a `Service` wrapping an inner `Service`.\n- **Handler**: A closure defining the behavior of a particular request after routing. These are provided to the service builder to complete the description of the service.\n\n## Background\n\nTo provide context for the proposal we perform a survey of the current state of affairs.\n\nThe following is a reference model we will use throughout the RFC:\n\n```smithy\noperation Operation0 {\n    input: Input0,\n    output: Output0\n}\n\noperation Operation1 {\n    input: Input1,\n    output: Output1\n}\n\n@restJson1\nservice Service0 {\n    operations: [\n        Operation0,\n        Operation1,\n    ]\n}\n```\n\nWe have purposely omitted details from the model that are unimportant to describing the proposal. We also omit distracting details from the Rust snippets. Code generation is linear in the sense that, code snippets can be assumed to extend to multiple operations in a predictable way. In the case where we do want to speak generally about an operation and its associated types, we use `{Operation}`, for example `{Operation}Input` is the input type of an unspecified operation.\n\nHere is a quick example of what a customer might write when using the service builder:\n\n```rust,ignore\nasync fn handler0(input: Operation0Input) -> Operation0Output {\n    todo!()\n}\n\nasync fn handler1(input: Operation1Input) -> Operation1Output {\n    todo!()\n}\n\nlet app: Router = OperationRegistryBuilder::default()\n    // Use the setters\n    .operation0(handler0)\n    .operation1(handler1)\n    // Convert to `OperationRegistry`\n    .build()\n    .unwrap()\n    // Convert to `Router`\n    .into();\n```\n\nDuring the survey we touch on the major mechanisms used to achieve this API.\n\n### Handlers\n\nA core concept in the service builder is the `Handler` trait:\n\n```rust,ignore\npub trait Handler<T, Input> {\n    async fn call(self, req: http::Request) -> http::Response;\n}\n```\n\nIts purpose is to provide an even interface over closures of the form `FnOnce({Operation}Input) -> impl Future<Output = {Operation}Output>` and `FnOnce({Operation}Input, State) -> impl Future<Output = {Operation}Output>`. It's this abstraction which allows the customers to supply both `async fn handler(input: {Operation}Input) -> {Operation}Output` and `async fn handler(input: {Operation}Input, state: Extension<S>) -> {Operation}Output` to the service builder.\n\nWe generate `Handler` implementations for said closures in [ServerOperationHandlerGenerator.kt](https://github.com/smithy-lang/smithy-rs/blob/458eeb63b95e6e1e26de0858457adbc0b39cbe4e/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerOperationHandlerGenerator.kt):\n\n```rust,ignore\nimpl<Fun, Fut> Handler<(), Operation0Input> for Fun\nwhere\n    Fun: FnOnce(Operation0Input) -> Fut,\n    Fut: Future<Output = Operation0Output>,\n{\n    async fn call(self, request: http::Request) -> http::Response {\n        let input = /* Create `Operation0Input` from `request: http::Request` */;\n\n        // Use closure on the input\n        let output = self(input).await;\n\n        let response = /* Create `http::Response` from `output: Operation0Output` */\n        response\n    }\n}\n\nimpl<Fun, Fut> Handler<Extension<S>, Operation0Input> for Fun\nwhere\n    Fun: FnOnce(Operation0Input, Extension<S>) -> Fut,\n    Fut: Future<Output = Operation0Output>,\n{\n    async fn call(self, request: http::Request) -> http::Response {\n        let input = /* Create `Operation0Input` from `request: http::Request` */;\n\n        // Use closure on the input and fetched extension data\n        let extension = Extension(request.extensions().get::<T>().clone());\n        let output = self(input, extension).await;\n\n        let response = /* Create `http::Response` from `output: Operation0Output` */\n        response\n    }\n}\n```\n\nCreating `{Operation}Input` from a `http::Request` and `http::Response` from a `{Operation}Output` involves protocol aware serialization/deserialization, for example, it can involve the [HTTP binding traits](https://awslabs.github.io/smithy/1.0/spec/core/http-traits.html). The [RuntimeError](https://github.com/smithy-lang/smithy-rs/blob/458eeb63b95e6e1e26de0858457adbc0b39cbe4e/rust-runtime/aws-smithy-http-server/src/runtime_error.rs#L53-L5) enumerates error cases such as serialization/deserialization failures, `extensions().get::<T>()` failures, etc. We omit error handling in the snippet above, but, in full, it also involves protocol aware conversions from the `RuntimeError` to `http::Response`. The reader should make note of the influence of the model on the different sections of this procedure.\n\nThe `request.extensions().get::<T>()` present in the `Fun: FnOnce(Operation0Input, Extension<S>) -> Fut` implementation is the current approach to injecting state into handlers. The customer is required to apply a [AddExtensionLayer](https://docs.rs/tower-http/latest/tower_http/add_extension/struct.AddExtensionLayer.html) to the output of the service builder so that, when the request reaches the handler, the `extensions().get::<T>()` will succeed.\n\nTo convert the closures described above into a `Service` an `OperationHandler` is used:\n\n```rust,ignore\npub struct OperationHandler<H, T, Input> {\n    handler: H,\n}\n\nimpl<H, T, Input> Service<Request<B>> for OperationHandler<H, T, Input>\nwhere\n    H: Handler<T, I>,\n{\n    type Response = http::Response;\n    type Error = Infallible;\n\n    #[inline]\n    fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {\n        Poll::Ready(Ok(()))\n    }\n\n    async fn call(&mut self, req: Request<B>) -> Result<Self::Response, Self::Error> {\n        self.handler.call(req).await.map(Ok)\n    }\n}\n```\n\n### Builder\n\nThe service builder we provide to the customer is the `OperationRegistryBuilder`, generated from [ServerOperationRegistryGenerator.kt](https://github.com/smithy-lang/smithy-rs/blob/458eeb63b95e6e1e26de0858457adbc0b39cbe4e/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerOperationRegistryGenerator.kt).\n\nCurrently, the reference model would generate the following `OperationRegistryBuilder` and `OperationRegistry`:\n\n```rust,ignore\npub struct OperationRegistryBuilder<Op0, In0, Op1, In1> {\n    operation1: Option<Op0>,\n    operation2: Option<Op1>,\n}\n\npub struct OperationRegistry<Op0, In0, Op1, In1> {\n    operation1: Op0,\n    operation2: Op1,\n}\n```\n\nThe `OperationRegistryBuilder` includes a setter per operation, and a fallible `build` method:\n\n```rust,ignore\nimpl<Op0, In0, Op1, In1> OperationRegistryBuilder<Op0, In0, Op1, In1> {\n    pub fn operation0(mut self, value: Op0) -> Self {\n        self.operation0 = Some(value);\n        self\n    }\n    pub fn operation1(mut self, value: Op1) -> Self {\n        self.operation1 = Some(value);\n        self\n    }\n    pub fn build(\n        self,\n    ) -> Result<OperationRegistry<Op0, In0, Op1, In1>, OperationRegistryBuilderError> {\n        Ok(OperationRegistry {\n            operation0: self.operation0.ok_or(/* OperationRegistryBuilderError */)?,\n            operation1: self.operation1.ok_or(/* OperationRegistryBuilderError */)?,\n        })\n    }\n}\n```\n\nThe `OperationRegistry` does not include any methods of its own, however it does enjoy a `From<OperationRegistry> for Router<B>` implementation:\n\n```rust,ignore\nimpl<B, Op0, In0, Op1, In1> From<OperationRegistry<B, Op0, In0, Op1, In1>> for Router<B>\nwhere\n    Op0: Handler<B, In0, Operation0Input>,\n    Op1: Handler<B, In1, Operation1Input>,\n{\n    fn from(registry: OperationRegistry<B, Op0, In0, Op1, In1>) -> Self {\n        let operation0_request_spec = /* Construct Operation0 routing information */;\n        let operation1_request_spec = /* Construct Operation1 routing information */;\n\n        // Convert handlers into boxed services\n        let operation0_svc = Box::new(OperationHandler::new(registry.operation0));\n        let operation1_svc = Box::new(OperationHandler::new(registry.operation1));\n\n        // Initialize the protocol specific router\n        // We demonstrate it here with `new_rest_json_router`, but note that there is a different router constructor\n        // for each protocol.\n        aws_smithy_http_server::routing::Router::new_rest_json_router(vec![\n            (\n                operation0_request_spec,\n                operation0_svc\n            ),\n            (\n                operation1_request_spec,\n                operation1_svc\n            )\n        ])\n    }\n}\n```\n\n### Router\n\nThe [aws_smithy_http::routing::Router](https://github.com/smithy-lang/smithy-rs/blob/458eeb63b95e6e1e26de0858457adbc0b39cbe4e/rust-runtime/aws-smithy-http-server/src/routing/mod.rs#L58-L60) provides the protocol aware routing of requests to their target , it exists as\n\n```rust,ignore\npub struct Route {\n    service: Box<dyn Service<http::Request, Response = http::Response>>,\n}\n\nenum Routes {\n    RestXml(Vec<(Route, RequestSpec)>),\n    RestJson1(Vec<(Route, RequestSpec)>),\n    AwsJson1_0(TinyMap<String, Route>),\n    AwsJson11(TinyMap<String, Route>),\n}\n\npub struct Router {\n    routes: Routes,\n}\n```\n\nand has the following `Service<http::Request>` implementation:\n\n```rust,ignore\nimpl Service<http::Request> for Router\n{\n    type Response = http::Response;\n    type Error = Infallible;\n\n    fn poll_ready(&mut self, _: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {\n        Poll::Ready(Ok(()))\n    }\n\n    async fn call(&mut self, request: http::Request) -> Result<Self::Response, Self::Error> {\n        match &self.routes {\n            Routes::/* protocol */(routes) => {\n                let route: Result<Route, _> = /* perform route matching logic */;\n                match route {\n                    Ok(ok) => ok.oneshot().await,\n                    Err(err) => /* Convert routing error into http::Response */\n                }\n            }\n        }\n    }\n}\n```\n\nAlong side the protocol specific constructors, `Router` includes a `layer` method. This provides a way for the customer to apply a `tower::Layer` to all routes. For every protocol, `Router::layer` has the approximately the same behavior:\n\n```rust,ignore\nlet new_routes = old_routes\n    .into_iter()\n    // Apply the layer\n    .map(|route| layer.layer(route))\n    // Re-box the service, to restore `Route` type\n    .map(|svc| Box::new(svc))\n    // Collect the iterator back into a collection (`Vec` or `TinyMap`)\n    .collect();\n```\n\n### Comparison to Axum\n\nHistorically, `smithy-rs` has borrowed from [axum](https://github.com/tokio-rs/axum). Despite various divergences the code bases still have much in common:\n\n- Reliance on `Handler` trait to abstract over different closure signatures:\n  - [axum::handler::Handler](https://docs.rs/axum/latest/axum/handler/trait.Handler.html)\n  - [Handlers](#handlers)\n- A mechanism for turning `H: Handler` into a `tower::Service`:\n  - [axum::handler::IntoService](https://docs.rs/axum/latest/axum/handler/struct.IntoService.html)\n  - [OperationHandler](#handlers)\n- A `Router` to route requests to various handlers:\n  - [axum::Router](https://docs.rs/axum/latest/axum/struct.Router.html)\n  - [aws_smithy_http_server::routing::Router](#router)\n\nTo identify where the implementations should differ we should classify in what ways the use cases differ. There are two primary areas which we describe below.\n\n#### Extractors and Responses\n\nIn `axum` there is a notion of [Extractor](https://docs.rs/axum/latest/axum/extract/index.html), which allows the customer to easily define a decomposition of an incoming `http::Request` by specifying the arguments to the handlers. For example,\n\n```rust,ignore\nasync fn request(Json(payload): Json<Value>, Query(params): Query<HashMap<String, String>>, headers: HeaderMap) {\n    todo!()\n}\n```\n\nis a valid handler - each argument satisfies the [axum::extract::FromRequest](https://docs.rs/axum/latest/axum/extract/trait.FromRequest.html) trait, therefore satisfies one of `axum`s blanket `Handler` implementations:\n\n```rust\nmacro_rules! impl_handler {\n    ( $($ty:ident),* $(,)? ) => {\n        impl<F, Fut, Res, $($ty,)*> Handler<($($ty,)*)> for F\n        where\n            F: FnOnce($($ty,)*) -> Fut + Clone + Send + 'static,\n            Fut: Future<Output = Res> + Send,\n            Res: IntoResponse,\n            $( $ty: FromRequest + Send,)*\n        {\n            fn call(self, req: http::Request) -> Self::Future {\n                async {\n                    let mut req = RequestParts::new(req);\n\n                    $(\n                        let $ty = match $ty::from_request(&mut req).await {\n                            Ok(value) => value,\n                            Err(rejection) => return rejection.into_response(),\n                        };\n                    )*\n\n                    let res = self($($ty,)*).await;\n\n                    res.into_response()\n                }\n            }\n        }\n    };\n}\n```\n\nThe implementations of `Handler` in `axum` and `smithy-rs` follow a similar pattern - convert `http::Request` into the closure's input, run the closure, convert the output of the closure to `http::Response`.\n\nIn `smithy-rs` we do not need a general notion of \"extractor\" - the `http::Request` decomposition is specified by the Smithy model, whereas in `axum` it's defined by the handlers signature. Despite the Smithy specification the customer may still want an \"escape hatch\" to allow them access to data outside of the Smithy service inputs, for this reason we should continue to support a restricted notion of extractor. This will help support use cases such as passing [lambda_http::Context](https://docs.rs/lambda_http/latest/lambda_http/struct.Context.html) through to the handler despite it not being modeled in the Smithy model.\n\nDual to `FromRequest` is the [axum::response::IntoResponse](https://docs.rs/axum/latest/axum/response/trait.IntoResponse.html) trait. This plays the role of converting the output of the handler to `http::Response`. Again, the difference between `axum` and `smithy-rs` is that `smithy-rs` has the conversion from `{Operation}Output` to `http::Response` specified by the Smithy model, whereas in `axum` the customer is free to specify a return type which implements `axum::response::IntoResponse`.\n\n#### Routing\n\nThe Smithy model not only specifies the `http::Request` decomposition and `http::Response` composition for a given service, it also determines the routing. The `From<OperationRegistry>` implementation, described in [Builder](#builder), yields a fully formed router based on the protocol and [http traits](https://awslabs.github.io/smithy/1.0/spec/core/http-traits.html#http-trait) specified.\n\nThis is in contrast to `axum`, where the user specifies the routing by use of various combinators included on the `axum::Router`, applied to other `tower::Service`s. In an `axum` application one might encounter the following code:\n\n```rust,ignore\nlet user_routes = Router::new().route(\"/:id\", /* service */);\n\nlet team_routes = Router::new().route(\"/\", /* service */);\n\nlet api_routes = Router::new()\n    .nest(\"/users\", user_routes)\n    .nest(\"/teams\", team_routes);\n\nlet app = Router::new().nest(\"/api\", api_routes);\n```\n\nNote that, in `axum` handlers are eagerly converted to a `tower::Service` (via `IntoService`) before they are passed into the `Router`. In contrast, in `smithy-rs`, handlers are passed into a builder and then the conversion to `tower::Service` is performed (via `OperationHandler`).\n\nIntroducing state to handlers in `axum` is done in the same way as `smithy-rs`, described briefly in [Handlers](#handlers) - a layer is used to insert state into incoming `http::Request`s and the `Handler` implementation pops it out of the type map layer. In `axum`, if a customer wanted to scope state to all routes within `/users/` they are able to do the following:\n\n```rust,ignore\nasync fn handler(Extension(state): Extension</* State */>) -> /* Return Type */ {}\n\nlet api_routes = Router::new()\n    .nest(\"/users\", user_routes.layer(Extension(/* state */)))\n    .nest(\"/teams\", team_routes);\n```\n\nIn `smithy-rs` a customer is only able to apply a layer around the `aws_smithy_http::routing::Router` or around every route via the [layer method](#router) described above.\n\n## Proposal\n\nThe proposal is presented as a series of compatible transforms to the existing service builder, each paired with a motivation. Most of these can be independently implemented, and it is stated in the cases where an interdependency exists.\n\nAlthough presented as a mutation to the existing service builder, the actual implementation should exist as an entirely separate builder, living in a separate namespace, reusing code generation from the old builder, while exposing a new Rust API. Preserving the old API surface will prevent breakage and make it easier to perform comparative benchmarks and testing.\n\n### Remove two-step build procedure\n\nAs described in [Builder](#builder), the customer is required to perform two conversions. One from `OperationRegistryBuilder` via `OperationRegistryBuilder::build`, the second from `OperationRegistryBuilder` to `Router` via the `From<OperationRegistry> for Router` implementation. The intermediary stop at `OperationRegistry` is not required and can be removed.\n\n### Statically check for missing Handlers\n\nAs described in [Builder](#builder), the `OperationRegistryBuilder::build` method is fallible - it yields a runtime error when one of the handlers has not been set.\n\n```rust,ignore\n    pub fn build(\n        self,\n    ) -> Result<OperationRegistry<Op0, In0, Op1, In1>, OperationRegistryBuilderError> {\n        Ok(OperationRegistry {\n            operation0: self.operation0.ok_or(/* OperationRegistryBuilderError */)?,\n            operation1: self.operation1.ok_or(/* OperationRegistryBuilderError */)?,\n        })\n    }\n```\n\nWe can do away with fallibility if we allow for on `Op0`, `Op1` to switch types during build and remove the `Option` from around the fields. The `OperationRegistryBuilder` then becomes\n\n```rust,ignore\nstruct OperationRegistryBuilder<Op0, Op1> {\n    operation_0: Op0,\n    operation_1: Op1\n}\n\nimpl OperationRegistryBuilder<Op0, In0, Op1, In1> {\n    pub fn operation0<NewOp0>(mut self, value: NewOp0) -> OperationRegistryBuilder<NewOp0, In0, Op1, In1> {\n        OperationRegistryBuilder {\n            operation0: value,\n            operation1: self.operation1\n        }\n    }\n    pub fn operation1<NewOp1>(mut self, value: NewOp1) -> OperationRegistryBuilder<Op0, In0, NewOp1, In1> {\n        OperationRegistryBuilder {\n            operation0: self.operation0,\n            operation1: value\n        }\n    }\n}\n\nimpl OperationRegistryBuilder<Op0, In0, Op1, In1>\nwhere\n    Op0: Handler<B, In0, Operation0Input>,\n    Op1: Handler<B, In1, Operation1Input>,\n{\n    pub fn build(self) -> OperationRegistry<Op0, In0, Op1, In1> {\n        OperationRegistry {\n            operation0: self.operation0,\n            operation1: self.operation1,\n        }\n    }\n}\n```\n\nThe customer will now get a compile time error rather than a runtime error when they fail to specify a handler.\n\n### Switch `From<OperationRegistry> for Router` to an `OperationRegistry::build` method\n\nTo construct a `Router`, the customer must either give a type ascription\n\n```rust,ignore\nlet app: Router = /* Service builder */.into();\n```\n\nor be explicit about the `Router` namespace\n\n```rust,ignore\nlet app = Router::from(/* Service builder */);\n```\n\nIf we switch from a `From<OperationRegistry> for Router` to a `build` method on `OperationRegistry` the customer may simply\n\n```rust,ignore\nlet app = /* Service builder */.build();\n```\n\nThere already exists a `build` method taking `OperationRegistryBuilder` to `OperationRegistry`, this is removed in [Remove two-step build procedure](#remove-two-step-build-procedure). These two transforms pair well together for this reason.\n\n### Operations as Middleware Constructors\n\nAs mentioned in [Comparison to Axum: Routing](#routing) and [Handlers](#handlers), the `smithy-rs` service builder accepts handlers and only converts them into a `tower::Service` during the final conversion into a `Router`. There are downsides to this:\n\n1. The customer has no opportunity to apply middleware to a specific operation before they are all collected into `Router`. The `Router` does have a `layer` method, described in [Router](#router), but this applies the middleware uniformly across all operations.\n2. The builder has no way to apply middleware around customer applied middleware. A concrete example of where this would be useful is described in the [Middleware Position](rfc0018_logging_sensitive.md#middleware-position) section of [RFC: Logging in the Presence of Sensitive Data](rfc0018_logging_sensitive.md).\n3. The customer has no way of expressing readiness of the underlying operation - all handlers are converted to services with [Service::poll_ready](https://docs.rs/tower/latest/tower/trait.Service.html#tymethod.poll_ready) returning `Poll::Ready(Ok(()))`.\n\nThe three use cases described above are supported by `axum` by virtue of the [Router::route](https://docs.rs/axum/latest/axum/routing/struct.Router.html#method.route) method accepting a `tower::Service`. The reader should consider a similar approach where the service builder setters accept a `tower::Service<http::Request, Response = http::Response>` rather than the `Handler`.\n\nThroughout this section we purposely ignore the existence of handlers accepting state alongside the `{Operation}Input`, this class of handlers serve as a distraction and can be accommodated with small perturbations from each approach.\n\n#### Approach A: Customer uses `OperationHandler::new`\n\nIt's possible to make progress with a small changeset, by requiring the customer eagerly uses `OperationHandler::new` rather than it being applied internally within `From<OperationRegistry> for Router` (see [Handlers](#handlers)). The setter would then become:\n\n```rust,ignore\npub struct OperationRegistryBuilder<Op0, Op1> {\n    operation1: Option<Op0>,\n    operation2: Option<Op1>\n}\n\nimpl<Op0, Op1> OperationRegistryBuilder<Op0, Op1> {\n    pub fn operation0(self, value: Op0) -> Self {\n        self.operation1 = Some(value);\n        self\n    }\n}\n```\n\nThe API usage would then become\n\n```rust,ignore\nasync fn handler0(input: Operation0Input) -> Operation0Output {\n    todo!()\n}\n\n// Create a `Service<http::Request, Response = http::Response, Error = Infallible>` eagerly\nlet svc = OperationHandler::new(handler0);\n\n// Middleware can be applied at this point\nlet operation0 = /* A HTTP `tower::Layer` */.layer(op1_svc);\n\nOperationRegistryBuilder::default()\n    .operation0(operation0)\n    /* ... */\n```\n\nNote that this requires that the `OperationRegistryBuilder` stores services, rather than `Handler`s. An unintended and superficial benefit of this is that we are able to drop `In{n}` from the `OperationRegistryBuilder<Op0, In0, Op1, In1>` - only `Op{n}` remains and it parametrizes each operation's `tower::Service`.\n\nIt is still possible to retain the original API which accepts `Handler` by introducing the following setters:\n\n```rust,ignore\nimpl<Op1, Op2> OperationRegistryBuilder<Op1, Op2> {\n    fn operation0_handler<H: Handler>(self, handler: H) -> OperationRegistryBuilder<OperationHandler<H>, Op2> {\n        OperationRegistryBuilder {\n            operation0: OperationHandler::new(handler),\n            operation1: self.operation1\n        }\n    }\n}\n```\n\nThere are two points at which the customer might want to apply middleware: around `tower::Service<{Operation}Input, Response = {Operation}Output>` and `tower::Service<http::Request, Response = http::Response>`, that is, before and after the serialization/deserialization is performed. The change described only succeeds in the latter, and therefore is only a partial solution to (1).\n\nThis solves (2), the service builder may apply additional middleware around the service.\n\nThis does not solve (3), as the customer is not able to provide a `tower::Service<{Operation}Input, Response = {Operation}Output>`.\n\n#### Approach B: Operations as Middleware\n\nIn order to achieve all three we model operations as middleware:\n\n```rust,ignore\npub struct Operation0<S> {\n    inner: S,\n}\n\nimpl<S> Service<http::Request> for Operation0<S>\nwhere\n    S: Service<Operation0Input, Response = Operation0Output, Error = Infallible>\n{\n    type Response = http::Response;\n    type Error = Infallible;\n\n    fn poll_ready(&mut self, cx: &mut Context) -> Poll<Result<(), Self::Error>> {\n        // We defer to the inner service for readiness\n        self.inner.poll_ready(cx)\n    }\n\n    async fn call(&mut self, request: http::Request) -> Result<Self::Response, Self::Error> {\n        let input = /* Create `Operation0Input` from `request: http::Request` */;\n\n        self.inner.call(input).await;\n\n        let response = /* Create `http::Response` from `output: Operation0Output` */\n        response\n    }\n}\n```\n\nNotice the similarity between this and the `OperationHandler`, the only real difference being that we hold an inner service rather than a closure. In this way we have separated all model aware serialization/deserialization, we noted in [Handlers](#handlers), into this middleware.\n\nA consequence of this is that the user `Operation0` must have two constructors:\n\n- `from_service`, which takes a `tower::Service<Operation0Input, Response = Operation0Output>`.\n- `from_handler`, which takes an async `Operation0Input -> Operation0Output`.\n\nA brief example of how this might look:\n\n```rust,ignore\nuse tower::util::{ServiceFn, service_fn};\n\nimpl<S> Operation0<S> {\n    pub fn from_service(inner: S) -> Self {\n        Self {\n            inner,\n        }\n    }\n}\n\nimpl<F> Operation0<ServiceFn<F>> {\n    pub fn from_handler(inner: F) -> Self {\n        // Using `service_fn` here isn't strictly correct - there is slight misalignment of closure signatures. This\n        // still serves to illustrate the proposal.\n        Operation0::from_service(service_fn(inner))\n    }\n}\n```\n\nThe API usage then becomes:\n\n```rust,ignore\nasync fn handler(input: Operation0Input) -> Operation0Output {\n    todo!()\n}\n\n// These are both `tower::Service` and hence can have middleware applied to them\nlet operation_0 = Operation0::from_handler(handler);\nlet operation_1 = Operation1::from_service(/* some service */);\n\nOperationRegistryBuilder::default()\n    .operation0(operation_0)\n    .operation1(operation_1)\n    /* ... */\n```\n\n#### Approach C: Operations as Middleware Constructors\n\nWhile [Attempt B](#approach-b-operations-as-middleware) solves all three problems, it fails to adequately model the Smithy semantics. An operation cannot uniquely define a `tower::Service` without reference to a parent Smithy service - information concerning the serialization/deserialization, error modes are all inherited from the Smithy service an operation is used within. In this way, `Operation0` should not be a standalone middleware, but become middleware once accepted by the service builder.\n\nAny solution which provides an `{Operation}` structure and wishes it to be accepted by multiple service builders must deal with this problem. We currently build one library per service and hence have duplicate structures when [service closures](https://awslabs.github.io/smithy/1.0/spec/core/model.html#service-closure) overlap. This means we wouldn't run into this problem today, but it would be a future obstruction if we wanted to reduce the amount of generated code.\n\n```rust,ignore\nuse tower::layer::util::{Stack, Identity};\nuse tower::util::{ServiceFn, service_fn};\n\n// This takes the same form as `Operation0` defined in the previous attempt. The difference being that this is now\n// private.\nstruct Service0Operation0<S> {\n    inner: S\n}\n\nimpl<S> Service<http::Request> for ServiceOperation0<S>\nwhere\n    S: Service<Operation0Input, Response = Operation0Output, Error = Infallible>\n{\n    /* Same as above */\n}\n\npub struct Operation0<S, L> {\n    inner: S,\n    layer: L\n}\n\nimpl<S> Operation0<S, Identity> {\n    pub fn from_service(inner: S) -> Self {\n        Self {\n            inner,\n            layer: Identity\n        }\n    }\n}\n\nimpl<F> Operation0<ServiceFn<F>, Identity> {\n    pub fn from_handler(inner: F) -> Self {\n        Operation0::from_service(service_fn(inner))\n    }\n}\n\nimpl<S, L> Operation0<S, L> {\n    pub fn layer<NewL>(self, layer: L) -> Operation0<S, Stack<L, NewL>> {\n        Operation0 {\n            inner: self.inner,\n            layer: Stack::new(self.layer, layer)\n        }\n    }\n\n    pub fn logging(self, /* args */) -> Operation0<S, Stack<L, LoggingLayer>> {\n        Operation0 {\n            inner: self.inner,\n            layer: Stack::new(self.layer, LoggingLayer::new(/* args */))\n        }\n    }\n\n    pub fn auth(self, /* args */) -> Operation0<S, Stack<L, AuthLayer>> {\n        Operation0 {\n            inner: self.inner,\n            layer: Stack::new(self.layer, /* Construct auth middleware */)\n        }\n\n    }\n}\n\nimpl<Op1, Op2> OperationRegistryBuilder<Op1, Op2> {\n    pub fn operation0<S, L>(self, operation: Operation0<S, L>) -> OperationRegistryBuilder<<L as Layer<Service0Operation0<S>>::Service, Op2>\n    where\n        L: Layer<Service0Operation0<S>>\n    {\n        // Convert `Operation0` to a `tower::Service`.\n        let http_svc = Service0Operation0 { inner: operation.inner };\n        // Apply the layers\n        operation.layer(http_svc)\n    }\n}\n```\n\nNotice that we get some additional type safety here when compared to [Approach A](#approach-a-customer-uses-operationhandlernew) and [Approach B](#approach-b-operations-as-middleware) - `operation0` accepts a `Operation0` rather than a general `tower::Service`. We also get a namespace to include utility methods - notice the `logging` and `auth` methods.\n\nThe RFC favours this approach out of all those presented.\n\n#### Approach D: Add more methods to the Service Builder\n\nAn alternative to [Approach C](#approach-c-operations-as-middleware-constructors) is to simply add more methods to the service builder while internally storing a `tower::Service`:\n\n- `operation0_from_service`, accepts a `tower::Service<Operation0Input, Response = Operation0Output>`.\n- `operation0_from_handler`, accepts an async `Fn(Operation0Input) -> Operation0Output`.\n- `operation0_layer`, accepts a `tower::Layer<Op0>`.\n\nThis is functionally similar to [Attempt C](#approach-c-operations-as-middleware-constructors) except that all composition is done internal to the service builder and the namespace exists in the method name, rather than the `{Operation}` struct.\n\n### Service parameterized Routers\n\nCurrently the `Router` stores `Box<dyn tower::Service<http::Request, Response = http::Response>`. As a result the `Router::layer` method, seen in [Router](#router), must re-box a service after every `tower::Layer` applied. The heap allocation `Box::new` itself is not cause for concern because `Router`s are typically constructed once at startup, however one might expect the indirection to regress performance when the server is running.\n\nHaving the service type parameterized as `Router<S>`, allows us to write:\n\n```rust,ignore\nimpl<S> Router<S> {\n    fn layer<L>(self, layer: &L) -> Router<L::Service>\n    where\n        L: Layer<S>\n    {\n        /* Same internal implementation without boxing */\n    }\n}\n```\n\n### Protocol specific Routers\n\nCurrently there is a single `Router` structure, described in [Router](#router), situated in the `rust-runtime/aws-smithy-http-server` crate, which is output by the service builder. This, roughly, takes the form of an `enum` listing the different protocols.\n\n```rust\n#[derive(Debug)]\nenum Routes {\n    RestXml(/* Container */),\n    RestJson1(/* Container */),\n    AwsJson1_0(/* Container */),\n    AwsJson1_1(/* Container */),\n}\n```\n\nRecall the form of the `Service::call` method, given in [Router](#router), which involved matching on the protocol and then performing protocol specific logic.\n\nTwo downsides of modelling `Router` in this way are:\n\n- `Router` is larger and has more branches than a protocol specific implementation.\n- If a third-party wanted to extend `smithy-rs` to additional protocols `Routes` would have to be extended. A synopsis of this obstruction is presented in [Should we generate the `Router` type](https://github.com/smithy-lang/smithy-rs/issues/1606) issue.\n\nAfter taking the [Switch `From<OperationRegistry> for Router` to an `OperationRegistry::build` method](#switch-fromoperationregistry-for-router-to-an-operationregistrybuild-method) transform, code generation is free to switch between return types based on the model. This allows for a scenario where a `@restJson1` causes the service builder to output a specific `RestJson1Router`.\n\n### Protocol specific Errors\n\nCurrently, protocol specific routing errors are either:\n\n- Converted to `RuntimeError`s and then `http::Response` (see [unknown_operation](https://github.com/smithy-lang/smithy-rs/blob/458eeb63b95e6e1e26de0858457adbc0b39cbe4e/rust-runtime/aws-smithy-http-server/src/routing/mod.rs#L106-L118)).\n- Converted directly to a `http::Response` (see [method_not_allowed](https://github.com/smithy-lang/smithy-rs/blob/458eeb63b95e6e1e26de0858457adbc0b39cbe4e/rust-runtime/aws-smithy-http-server/src/routing/mod.rs#L121-L127)). This is an outlier to the common pattern.\n\nThe `from_request` functions yield protocol specific errors which are converted to `RequestRejection`s then `RuntimeError`s (see [ServerHttpBoundProtocolGenerator.kt](https://github.com/smithy-lang/smithy-rs/blob/458eeb63b95e6e1e26de0858457adbc0b39cbe4e/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/protocols/ServerHttpBoundProtocolGenerator.kt#L194-L210)).\n\nIn these scenarios protocol specific errors are converted into `RuntimeError` before being converted to a `http::Response` via `into_response` method.\n\nTwo downsides of this are:\n\n- `RuntimeError` enumerates all possible errors across all existing protocols, so is larger than modelling the errors for a specific protocol.\n- If a third-party wanted to extend `smithy-rs` to additional protocols with differing failure modes `RuntimeError` would have to be extended. As in [Protocol specific Errors](#protocol-specific-errors), a synopsis of this obstruction is presented in [Should we generate the `Router` type](https://github.com/smithy-lang/smithy-rs/issues/1606) issue.\n\nSwitching from using `RuntimeError` to protocol specific errors which satisfy a common interface, `IntoResponse`, would resolve these problem.\n\n### Type erasure with the name of the Smithy service\n\nCurrently the service builder is named `OperationRegistryBuilder`. Despite the name being model agnostic, the `OperationRegistryBuilder` mutates when the associated service mutates. Renaming `OperationRegistryBuilder` to `{Service}Builder` would reflect the relationship between the builder and the Smithy service and prevent naming conflicts if multiple service builders are to exist in the same namespace.\n\nSimilarly, the output of the service builder is `Router`. This ties the output of the service builder to a structure in `rust-runtime`. Introducing a type erasure here around `Router` using a newtype named `{Service}` would:\n\n- Ensure we are free to change the implementation of `{Service}` without changing the `Router` implementation.\n- Hide the router type, which is determined by the protocol specified in the model.\n- Allow us to put a `builder` method on `{Service}` which returns `{Service}Builder`.\n\nThis is compatible with [Protocol specific Routers](#protocol-specific-routers), we simply newtype the protocol specific router rather than `Router`.\n\nWith both of these changes the API would take the form:\n\n```rust,ignore\nlet service_0: Service0 = Service0::builder()\n    /* use the setters */\n    .build()\n    .unwrap()\n    .into();\n```\n\nWith [Remove two-step build procedure](#remove-two-step-build-procedure), [Switch `From<OperationRegistry> for Router` to a `OperationRegistry::build` method](#switch-fromoperationregistry-for-router-to-an-operationregistrybuild-method), and [Statically check for missing Handlers](#statically-check-for-missing-handlers) we obtain the following API:\n\n```rust,ignore\nlet service_0: Service0 = Service0::builder()\n    /* use the setters */\n    .build();\n```\n\n### Combined Proposal\n\nA combination of all the proposed transformations results in the following API:\n\n```rust,ignore\nstruct Context {\n    /* fields */\n}\n\nasync fn handler(input: Operation0Input) -> Operation0Output {\n    todo!()\n}\n\nasync fn handler_with_ext(input: Operation0Input, extension: Extension<Context>) -> Operation0Output {\n    todo!()\n}\n\nstruct Operation1Service {\n    /* fields */\n}\n\nimpl Service<Operation1Input> for Operation1Service {\n    type Response = Operation1Output;\n\n    /* implementation */\n}\n\nstruct Operation1ServiceWithExt {\n    /* fields */\n}\n\nimpl Service<(Operation1Input, Extension<Context>)> for Operation1Service {\n    type Response = Operation1Output;\n\n    /* implementation */\n}\n\n// Create an operation from a handler\nlet operation_0 = Operation0::from_handler(handler);\n\n// Create an operation from a handler with extension\nlet operation_0 = Operation::from_handler(handler_with_ext);\n\n// Create an operation from a `tower::Service`\nlet operation_1_svc = Operation1Service { /* initialize */ };\nlet operation_1 = Operation::from_service(operation_1_svc);\n\n// Create an operation from a `tower::Service` with extension\nlet operation_1_svc = Operation1ServiceWithExtension { /* initialize */ };\nlet operation_1 = Operation::from_service(operation_1_svc);\n\n// Apply a layer\nlet operation_0 = operation_0.layer(/* layer */);\n\n// Use the service builder\nlet service_0 = Service0::builder()\n    .operation_0(operation_0)\n    .operation_1(operation_1)\n    .build();\n```\n\nA toy implementation of the combined proposal is presented in [this PR](https://github.com/hlbarber/service-builder/pull/1).\n\n## Changes Checklist\n\n- [x] Add protocol specific routers to `rust-runtime/aws-smithy-http-server`.\n  - <https://github.com/smithy-lang/smithy-rs/pull/1666>\n- [x] Add middleware primitives and error types to `rust-runtime/aws-smithy-http-server`.\n  - <https://github.com/smithy-lang/smithy-rs/pull/1679>\n- [x] Add code generation which outputs new service builder.\n  - <https://github.com/smithy-lang/smithy-rs/pull/1693>\n- [x] Deprecate `OperationRegistryBuilder`, `OperationRegistry` and `Router`.\n  - <https://github.com/smithy-lang/smithy-rs/pull/1886>\n  - <https://github.com/smithy-lang/smithy-rs/pull/2161>\n"
  },
  {
    "path": "design/src/rfcs/rfc0021_dependency_versions.md",
    "content": "RFC: Dependency Versions\n========================\n\n> Status: Accepted\n>\n> Applies to: Client and Server\n\nThis RFC outlines how Rust dependency versions are selected for the smithy-rs project, and\nstrives to meet the following semi-conflicting goals:\n\n- Dependencies are secure\n- Vended libraries have dependency ranges that overlap other Rust libraries as much as possible\n\nWhen in conflict, the security goal takes priority over the compatibility goal.\n\nCategorization of Crates\n------------------------\n\nThe Rust crates within smithy-rs can be divided up into two categories:\n\n1. **Library Crates:** Crates that are published to crates.io with the intention that other projects\n   will depend on them via their `Cargo.toml` files. This category does NOT include binaries that\n   are published to crates.io with the intention of being installed with `cargo install`.\n2. **Application Crates:** All examples, binaries, tools, standalone tests, or other crates that are\n   not published to crates.io with the intent of being depended on by other projects.\n\nAll generated crates must be considered library crates even if they're not published since they are intended\nto be pulled into other Rust projects with other dependencies.\n\n### Support crates for Applications\n\nThe `aws-smithy-http-server-python` crate doesn't fit the categorization rules well since\nit is a runtime crate for a generated Rust application with bindings to Python. This RFC\nestablishes this crate as an application crate since it needs to pull in application-specific\ndependencies such as `tracing-subscriber` in order to implement its full feature set.\n\nDependency Version Rules\n------------------------\n\nApplication crates _should_ use the latest versions of dependencies, but _must_ use a version greater than or equal\nto the minimum secure version as determined by the [RUSTSEC advisories database]. Library crates _must_ use the\nminimum secure version. This is illustrated at a high level below:\n\n```mermaid\ngraph TD\n    S[Add Dependency] --> T{Crate Type?}\n    T -->|Application Crate?| A[Use latest version]\n    T -->|Library Crate?| L[Use minimum secure version]\n```\n\n### What is a minimum secure version when there are multiple major versions?\n\nIf a dependency has multiple supported major versions, then the latest major version must be selected unless\nthere is a compelling reason to do otherwise (such as the previous major version having been previously\nexposed in our public API). Choosing newer major versions will reduce the amount of upgrade work that\nneeds to be done at a later date when support for the older version is inevitably dropped.\n\nChanges Checklist\n-----------------\n\nSome work needs to be done to establish these guidelines:\n- [ ] Establish automation for enforcing minimum secure versions for the direct dependencies of library crates\n\n<!-- # Links -->\n\n[RUSTSEC advisories database]: https://rustsec.org/advisories/\n"
  },
  {
    "path": "design/src/rfcs/rfc0022_error_context_and_compatibility.md",
    "content": "RFC: Error Context and Compatibility\n====================================\n\n> Status: Implemented\n>\n> Applies to: Generated clients and shared rust-runtime crates\n\nThis RFC proposes a pattern for writing Rust errors to provide consistent\nerror context AND forwards/backwards compatibility. The goal is to strike\na balance between these four goals:\n\n1. Errors are forwards compatible, and changes to errors are backwards compatible\n2. Errors are idiomatic and ergonomic. It is easy to match on them and extract additional\n   information for cases where that's useful. The type system prevents errors from being used\n   incorrectly (for example, incorrectly retrieving context for a different error variant)\n3. Error messages are easy to debug\n4. Errors implement best practices with Rust's `Error` trait (for example, implementing the optional `source()` function where possible)\n\n_Note:_ This RFC is _not_ about error backwards compatibility when it comes to error serialization/deserialization\nfor transfer over the wire. The Smithy protocols cover that aspect.\n\nPast approaches in smithy-rs\n----------------------------\n\nThis section examines some examples found in `aws-config` that illustrate different problems\nthat this RFC will attempt to solve, and calls out what was done well, and what could be improved upon.\n\n### Case study: `InvalidFullUriError`\n\nTo start, let's examine `InvalidFullUriError` (doc comments omitted):\n```rust,ignore\n#[derive(Debug)]\n#[non_exhaustive]\npub enum InvalidFullUriError {\n    #[non_exhaustive] InvalidUri(InvalidUri),\n    #[non_exhaustive] NoDnsService,\n    #[non_exhaustive] MissingHost,\n    #[non_exhaustive] NotLoopback,\n    DnsLookupFailed(io::Error),\n}\n\nimpl Display for InvalidFullUriError {\n    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {\n        match self {\n            InvalidFullUriError::InvalidUri(err) => write!(f, \"URI was invalid: {}\", err),\n            InvalidFullUriError::MissingHost => write!(f, \"URI did not specify a host\"),\n            // ... omitted ...\n        }\n    }\n}\n\nimpl Error for InvalidFullUriError {\n    fn source(&self) -> Option<&(dyn Error + 'static)> {\n        match self {\n            InvalidFullUriError::InvalidUri(err) => Some(err),\n            InvalidFullUriError::DnsLookupFailed(err) => Some(err),\n            _ => None,\n        }\n    }\n}\n```\n\nThis error does a few things well:\n1. Using `#[non_exhaustive]` on the enum allows new errors to be added in the future.\n2. Breaking out different error types allows for more useful error messages, potentially with error-specific context.\n   Customers can match on these different error variants to change their program flow, although it's not immediately\n   obvious if such use cases exist for this error.\n4. The error cause is available through the `Error::source()` impl for variants that have a cause.\n\nHowever, there are also a number of things that could be improved:\n1. All tuple/struct enum members are public, and `InvalidUri` is an error from the `http` crate.\n   Exposing a type from another crate can potentially lock the GA SDK into a specific crate version\n   if breaking changes are ever made to the exposed types. In this specific case, it prevents\n   using alternate HTTP implementations that don't use the `http` crate.\n2. `DnsLookupFailed` is missing `#[non_exhaustive]`, so new members can never be added to it.\n3. Use of enum tuples, even with `#[non_exhaustive]`, adds friction to evolving the API since the\n   tuple members cannot be named.\n4. Printing the source error in the `Display` impl leads to error repetition by reporters\n   that examine the full source chain.\n5. The `source()` impl has a `_` match arm, which means future implementers could forget to propagate\n   a source when adding new error variants.\n6. The error source can be downcasted to `InvalidUri` type from `http` in customer code. This is\n   a leaky abstraction where customers can start to rely on the underlying library the SDK uses\n   in its implementation, and if that library is replaced/changed, it can silently break the\n   customer's application. _Note:_ later in the RFC, I'll demonstrate why fixing this issue is not practical.\n\n### Case study: `ProfileParseError`\n\nNext, let's look at a much simpler error. The `ProfileParseError` is focused purely on the parsing\nlogic for the SDK config file:\n\n```rust,ignore\n#[derive(Debug, Clone)]\npub struct ProfileParseError {\n    location: Location,\n    message: String,\n}\n\nimpl Display for ProfileParseError {\n    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {\n        write!(\n            f,\n            \"error parsing {} on line {}:\\n  {}\",\n            self.location.path, self.location.line_number, self.message\n        )\n    }\n}\n\nimpl Error for ProfileParseError {}\n```\n\nWhat this error does well:\n- The members are private, so `#[non_exhaustive]` isn't even necessary\n- The error is completely opaque (maximizing compatibility) while still being\n  debuggable thanks to the flexible messaging\n\nWhat could be improved:\n- It needlessly implements `Clone`, which may prevent it from holding\n  an error source in the future since errors are often not `Clone`.\n- In the future, if more error variants are needed, a private inner error\n  kind enum could be added to change messaging, but there's not a _nice_ way to\n  expose new variant-specific information to the customer.\n- Programmatic access to the error `Location` may be desired, but\n  this can be trivially added in the future without a breaking change by\n  adding an accessor method.\n\n### Case study: code generated client errors\n\nThe SDK currently generates errors such as the following (from S3):\n\n```rust,ignore\n#[non_exhaustive]\npub enum Error {\n    BucketAlreadyExists(BucketAlreadyExists),\n    BucketAlreadyOwnedByYou(BucketAlreadyOwnedByYou),\n    InvalidObjectState(InvalidObjectState),\n    NoSuchBucket(NoSuchBucket),\n    NoSuchKey(NoSuchKey),\n    NoSuchUpload(NoSuchUpload),\n    NotFound(NotFound),\n    ObjectAlreadyInActiveTierError(ObjectAlreadyInActiveTierError),\n    ObjectNotInActiveTierError(ObjectNotInActiveTierError),\n    Unhandled(Box<dyn Error + Send + Sync + 'static>),\n}\n```\n\nEach error variant gets its own struct, which can hold error-specific contextual information.\nExcept for the `Unhandled` variant, both the error enum and the details on each variant are extensible.\nThe `Unhandled` variant should move the error source into a struct so that its type can be hidden.\nOtherwise, the code generated errors are already aligned with the goals of this RFC.\n\nApproaches from other projects\n------------------------------\n\n### `std::io::Error`\n\nThe standard library uses an `Error` struct with an accompanying `ErrorKind` enum\nfor its IO error. Roughly:\n\n```rust\n#[derive(Debug)]\n#[non_exhaustive]\npub enum ErrorKind {\n    NotFound,\n    // ... omitted ...\n    Other,\n}\n\n#[derive(Debug)]\npub struct Error {\n    kind: ErrorKind,\n    source: Box<dyn std::error::Error + Send + Sync>,\n}\n```\n\nWhat this error does well:\n- It is extensible since the `ErrorKind` is non-exhaustive\n- It has an `Other` error type that can be instantiated by users in unit tests,\n  making it easier to unit test error handling\n\nWhat could be improved:\n- There isn't an ergonomic way to add programmatically accessible error-specific context\n  to this error in the future\n- The source error can be downcasted, which could be a trap for backwards compatibility.\n\n### Hyper 1.0\n\nHyper has outlined [some problems they want to address with errors](https://github.com/hyperium/hyper/blob/bd7928f3dd6a8461f0f0fdf7ee0fd95c2f156f88/docs/ROADMAP.md#errors)\nfor the coming 1.0 release. To summarize:\n\n- It's difficult to match on specific errors (Hyper 0.x's `Error` relies\n  on `is_x` methods for error matching rather than enum matching).\n- Error reporters duplicate information since the hyper 0.x errors include the display of their error sources\n- `Error::source()` can leak internal dependencies\n\nOpaque Error Sources\n--------------------\n\nThere is [discussion in the errors working group](https://github.com/rust-lang/project-error-handling/issues/53)\nabout how to avoid leaking internal dependency error types through error source downcasting. One option is to\ncreate an opaque error wrapping new-type that removes the ability to downcast to the other library's error.\nThis, however, can be circumvented via unsafe code, and also breaks the ability for error reporters to\nproperly display the error (for example, if the error has backtrace information, that would be\ninaccessible to the reporter).\n\nThis situation might improve if the nightly `request_value`/`request_ref`/`provide` functions on\n`std::error::Error` are stabilized, since then contextual information needed for including things\nsuch as a backtrace could still be retrieved through the opaque error new-type.\n\nThis RFC proposes that error types from other libraries not be directly exposed in the API, but rather,\nbe exposed indirectly through `Error::source` as `&dyn Error + 'static`.\n\nErrors should not require downcasting to be useful. Downcasting the error's source should be\na last resort, and with the understanding that the type could change at a later date with no\ncompile-time guarantees.\n\nError Proposal\n--------------\n\nTaking a customer's perspective, there are two broad categories of errors:\n\n1. **Actionable:** Errors that can/should influence program flow; where it's useful to\n   do different work based on additional error context or error variant information\n2. **Informative:** Errors that inform that something went wrong, but where\n   it's not useful to match on the error to change program flow\n\nThis RFC proposes that a consistent pattern be introduced to cover these two use cases for\nall errors in the public API for the Rust runtime crates and generated client crates.\n\n### Actionable error pattern\n\nActionable errors are represented as enums. If an error variant has an error source or additional contextual\ninformation, it must use a separate context struct that is referenced via tuple in the enum. For example:\n\n```rust,ignore\n// Good: new error types can be added in the future\n#[non_exhaustive]\npub enum Error {\n    // Good: This is exhaustive and uses a tuple, but its sole member is an extensible struct with private fields\n    VariantA(VariantA),\n\n    // Bad: The fields are directly exposed and can't have accessor methods. The error\n    // source type also can't be changed at a later date since.\n    #[non_exhaustive]\n    VariantB {\n        some_additional_info: u32,\n        source: AnotherError // AnotherError is from this crate\n    },\n\n    // Bad: There's no way to add additional contextual information to this error in the future, even\n    // though it is non-exhaustive. Changing it to a tuple or struct later leads to compile errors in existing\n    // match statements.\n    #[non_exhaustive]\n    VariantC,\n\n    // Bad: Not extensible if additional context is added later (unless that context can be added to `AnotherError`)\n    #[non_exhaustive]\n    VariantD(AnotherError),\n\n    // Bad: Not extensible. If new context is added later (for example, a second endpoint), there's no way to name it.\n    #[non_exhaustive]\n    VariantE(Endpoint, AnotherError),\n\n    // Bad: Exposes another library's error type in the public API,\n    // which makes upgrading or replacing that library a breaking change\n    #[non_exhaustive]\n    VariantF {\n        source: http::uri::InvalidUri\n    },\n\n    // Bad: The error source type is public, and even though its a boxed error, it won't\n    // be possible to change it to an opaque error type later (for example, if/when\n    // opaque errors become practical due to standard library stabilizations).\n    #[non_exhaustive]\n    VariantG {\n        source: Box<dyn Error + Send + Sync + 'static>,\n    }\n}\n\npub struct VariantA {\n    some_field: u32,\n    // This is private, so it's fine to reference the external library's error type\n    source: http::uri::InvalidUri\n}\n\nimpl VariantA {\n    fn some_field(&self) -> u32 {\n        self.some_field\n    }\n}\n```\n\nError variants that contain a source must return it from the `Error::source` method.\nThe `source` implementation _should not_ use the catch all (`_`) match arm, as this makes it easy to miss\nadding a new error variant's source at a later date.\n\nThe error `Display` implementation _must not_ include the source in its output:\n\n```rust,ignore\n// Good\nimpl fmt::Display for Error {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        match self {\n            Self::VariantA => write!(f, \"variant a\"),\n            Self::VariantB { some_additional_info, .. } => write!(f, \"variant b ({some_additional_info})\"),\n            // ... and so on\n        }\n    }\n}\n\n// Bad\nimpl fmt::Display for Error {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        match self {\n            Self::VariantA => write!(f, \"variant a\"),\n            // Bad: includes the source in the `Display` output, which leads to duplicate error information\n            Self::VariantB { some_additional_info, source } => write!(f, \"variant b ({some_additional_info}): {source}\"),\n            // ... and so on\n        }\n    }\n}\n```\n\n### Informative error pattern\n\nInformative errors must be represented as structs. If error messaging changes based on an underlying cause, then a\nprivate error kind enum can be used internally for this purpose. For example:\n\n```rust,ignore\n#[derive(Debug)]\npub struct InformativeError {\n    some_additional_info: u32,\n    source: AnotherError,\n}\n\nimpl fmt::Display for InformativeError {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        write!(f, \"some informative message with {}\", self.some_additional_info)\n    }\n}\n\nimpl Error for InformativeError {\n    fn source(&self) -> Option<&(dyn Error + 'static)> {\n        Some(&self.source)\n    }\n}\n```\n\nIn general, informative errors should be referenced by variants in actionable errors since they cannot be converted\nto actionable errors at a later date without a breaking change. This is not a hard rule, however. Use your best judgement\nfor the situation.\n\n### Displaying full error context\n\nIn code where errors are logged rather than returned to the customer, the full error source chain\nmust be displayed. This will be made easy by placing a `DisplayErrorContext` struct in `aws-smithy-types` that\nis used as a wrapper to get the better error formatting:\n\n```rust,ignore\ntracing::warn!(err = %DisplayErrorContext(err), \"some message\");\n```\n\nThis might be implemented as follows:\n\n```rust,ignore\n#[derive(Debug)]\npub struct DisplayErrorContext<E: Error>(pub E);\n\nimpl<E: Error> fmt::Display for DisplayErrorContext<E> {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        write_err(f, &self.0)?;\n        // Also add a debug version of the error at the end\n        write!(f, \" ({:?})\", self)\n    }\n}\n\nfn write_err(f: &mut fmt::Formatter<'_>, err: &dyn Error) -> fmt::Result {\n    write!(f, \"{}\", err)?;\n    if let Some(source) = err.source() {\n        write!(f, \": \")?;\n        write_err(f, source)?;\n    }\n    Ok(())\n}\n```\n\nChanges Checklist\n-----------------\n\n- [x] Update every struct/enum that implements `Error` in all the non-server Rust runtime crates\n- [x] Hide error source type in `Unhandled` variant in code generated errors\n- [x] Remove `Clone` from `ProfileParseError` and any others that have it\n\nError Code Review Checklist\n---------------------------\n\nThis is a checklist meant to aid code review of new errors:\n\n- [ ] The error fits either the actionable or informative pattern\n- [ ] If the error is informative, it's clear that it will never be expanded with additional variants in the future\n- [ ] The `Display` impl does not write the error source to the formatter\n- [ ] The catch all `_` match arm is not used in the `Display` or `Error::source` implementations\n- [ ] Error types from external libraries are not exposed in the public API\n- [ ] Error enums are `#[non_exhaustive]`\n- [ ] Error enum variants that don't have a separate error context struct are `#[non_exhaustive]`\n- [ ] Error context is exposed via accessors rather than by public fields\n- [ ] Actionable errors and their context structs are in an `error` submodule for any given module. They are not mixed with other non-error code\n"
  },
  {
    "path": "design/src/rfcs/rfc0023_refine_builder.md",
    "content": "RFC: Evolving the new service builder API\n========================\n\n> Status: Accepted\n>\n> Applies to: Server\n\n[RFC 20] introduced a new service builder API.\nIt supports fine-grained configuration at multiple levels (per-handler middlewares, router middlewares, plugins) while trying to prevent some misconfiguration issues at compile-time (i.e. missing operation handlers).\nThere is consensus that the new API is an improvement over the pre-existing `OperationRegistryBuilder`/`OperationRegistry`, which is now on its way to deprecation in one of the next releases.\n\nThis RFC builds on top of [RFC 20] to explore an alternative API design prior to its stabilisation.\nThe API proposed in this RFC has been manually implemented for the Pokemon service. You can find the code [here](https://github.com/LukeMathWalker/builder-experiments).\n\n## Overview\n\nType-heavy builders can lead to a poor developer experience when it comes to writing function signatures, conditional branches and clarity of error messages.\nThis RFC provides examples for the issues we are trying to mitigate and showcases an alternative design for the service builder, cutting generic parameters from 2*(N+1) to 2, where `N` is the number of operations on the service.\nWe rely on eagerly upgrading the registered handlers and operations to `Route<B>` to achieve this reduction.\n\nGoals:\n\n- Maximise API ergonomics, with a particular focus on the developer experience for Rust beginners.\n\nStrategy:\n\n- Reduce type complexity, exposing a less generic API;\n- Provide clearer errors when the service builder is misconfigured.\n\nTrade-offs:\n\n- Reduce compile-time safety. Missing handlers will be detected at runtime instead of compile-time.\n\nConstraints:\n\n- There should be no significant degradation in runtime performance (i.e. startup time for applications).\n\n## Handling missing operations\n\nLet's start by reviewing the API proposed in [RFC 20]. We will use the [Pokemon service] as our driving example throughout the RFC.\nThis is what the startup code looks like:\n\n```rust,ignore\n#[tokio::main]\npub async fn main() {\n    // [...]\n    let app = PokemonService::builder()\n        .get_pokemon_species(get_pokemon_species)\n        .get_storage(get_storage)\n        .get_server_statistics(get_server_statistics)\n        .capture_pokemon(capture_pokemon)\n        .do_nothing(do_nothing)\n        .check_health(check_health)\n        .build();\n\n    // Setup shared state and middlewares.\n    let shared_state = Arc::new(State::default());\n    let app = app.layer(&AddExtensionLayer::new(shared_state));\n\n    // Start the [`hyper::Server`].\n    let bind: SocketAddr = /* */;\n    let server = hyper::Server::bind(&bind).serve(app.into_make_service());\n    // [...]\n}\n```\n\nThe builder is infallible: we are able to verify at compile-time that all handlers have been provided using the [typestate builder pattern].\n\n### Compiler errors cannot be tuned\n\nWhat happens if we stray away from the happy path? We might forget, for example, to add the `check_health` handler.\nThe compiler greets us with this error:\n\n```text\nerror[E0277]: the trait bound `MissingOperation: Upgradable<AwsRestJson1, CheckHealth, (), _, IdentityPlugin>` is not satisfied\n  --> pokemon-service/src/bin/pokemon-service.rs:38:10\n   |\n38 |         .build();\n   |          ^^^^^ the trait `Upgradable<AwsRestJson1, CheckHealth, (), _, IdentityPlugin>` is not implemented for `MissingOperation`\n   |\n   = help: the following other types implement trait `Upgradable<Protocol, Operation, Exts, B, Plugin>`:\n             FailOnMissingOperation\n             Operation<S, L>\n```\n\nThe compiler complains that `MissingOperation` does not implement the `Upgradable` trait. Neither `MissingOperation` nor `Upgradable` appear in the startup code we looked at. This is likely to be the first time the developer sees those traits, assuming they haven't spent time getting familiar with `aws-smithy-http-server`'s internals.\nThe `help` section is unhelpful, if not actively misdirecting.\nHow can the developer figure out that the issue lies with `check_health`?\nThey need to inspect the generic parameters attached to `Upgradable` in the code label or the top-level error message - we see, among other things, a `CheckHealth` parameter. That is the hint they need to follow to move forward.\n\nWe unfortunately do not have agency on the compiler error we just examined. Rust does not expose hooks for crate authors to tweak the errors returned when a type does not implement a trait we defined.\nAll implementations of the [typestate builder pattern] accept this shortcoming in exchange for compile-time safety.\n\nIs it a good tradeoff in our case?\n\n### The cost of a runtime error\n\nIf `build` returns an error, the HTTP server is never launched. The application fails to start.\n\nLet's examine the cost of this runtime error along two dimensions:\n- Impact on developer productivity;\n- Impact on end users.\n\nWe'd love for this issue to be caught on the developer machine - it provides the shortest feedback loop.\nThe issue won't be surfaced by a `cargo check` or `cargo build` invocation, as it happens with the typestate builder approach.\nIt should be surfaced by executing the application test suite, assuming that the developer has written at least a single integration test - e.g. a test that passes a request to the `call` method exposed by `PokemonService` or launches a full-blown instance of the application which is then probed via an HTTP client.\n\nIf there are no integration tests, the issue won't be detected on the developer machine nor in CI.\nNonetheless, it is unlikely to cause any end-user impact even if it manages to escape detection and reach production. The deployment will never complete if they are using a progressive rollout strategy: instances of the new version will crash as soon as they are launched, never getting a chance to mark themselves as healthy; all traffic will keep being handled by the old version, with no visible impact on end users of the application.\n\nGiven the above, we think that the impact of a runtime error is low enough to be worth exploring designs that do not guarantee compile-safety for the builder API[^further-dev-productivity-improvements].\n\n### Providing clear feedback\n\nMoving from a compile-time error to a runtime error does not require extensive refactoring.\nThe definition of `PokemonServiceBuilder` goes from:\n\n```rust,ignore\npub struct PokemonServiceBuilder<\n    Op1,\n    Op2,\n    Op3,\n    Op4,\n    Op5,\n    Op6,\n    Exts1 = (),\n    Exts2 = (),\n    Exts3 = (),\n    Exts4 = (),\n    Exts5 = (),\n    Exts6 = (),\n    Pl = aws_smithy_http_server::plugin::IdentityPlugin,\n> {\n    check_health: Op1,\n    do_nothing: Op2,\n    get_pokemon_species: Op3,\n    get_server_statistics: Op4,\n    capture_pokemon: Op5,\n    get_storage: Op6,\n    #[allow(unused_parens)]\n    _exts: std::marker::PhantomData<(Exts1, Exts2, Exts3, Exts4, Exts5, Exts6)>,\n    plugin: Pl,\n}\n```\n\nto:\n\n```rust,ignore\npub struct PokemonServiceBuilder<\n    Op1,\n    Op2,\n    Op3,\n    Op4,\n    Op5,\n    Op6,\n    Exts1 = (),\n    Exts2 = (),\n    Exts3 = (),\n    Exts4 = (),\n    Exts5 = (),\n    Exts6 = (),\n    Pl = aws_smithy_http_server::plugin::IdentityPlugin,\n> {\n    check_health: Option<Op1>,\n    do_nothing: Option<Op2>,\n    get_pokemon_species: Option<Op3>,\n    get_server_statistics: Option<Op4>,\n    capture_pokemon: Option<Op5>,\n    get_storage: Option<Op6>,\n    #[allow(unused_parens)]\n    _exts: std::marker::PhantomData<(Exts1, Exts2, Exts3, Exts4, Exts5, Exts6)>,\n    plugin: Pl,\n}\n```\n\nAll operation fields are now `Option`-wrapped.\nWe introduce a new `MissingOperationsError` error to hold the names of the missing operations and their respective setter methods:\n\n```rust,ignore\n#[derive(Debug)]\npub struct MissingOperationsError {\n    service_name: &'static str,\n    operation_names2setter_methods: HashMap<&'static str, &'static str>,\n}\n\nimpl Display for MissingOperationsError { /* */ }\nimpl std::error::Error for MissingOperationsError {}\n```\n\nwhich is then used in `build` as error type _(not shown here for brevity)_.\nWe can now try again to stray away from the happy path by forgetting to register a handler for the `CheckHealth` operation.\nThe code compiles just fine this time, but the application fails when launched via `cargo run`:\n\n```text\n<timestamp> ERROR pokemon_service: You must specify a handler for all operations attached to the `Pokemon` service.\nWe are missing handlers for the following operations:\n- com.aws.example#CheckHealth\n\nUse the dedicated methods on `PokemonServiceBuilder` to register the missing handlers:\n- PokemonServiceBuilder::check_health\n```\n\nThe error speaks the language of the domain, Smithy's interface definition language: it mentions operations, services, handlers.\nUnderstanding the error requires no familiarity with `smithy-rs`' internal type machinery or advanced trait patterns in Rust.\nWe can also provide actionable suggestions: Rust beginners should be able to easily process the information, rectify the mistake and move on quickly.\n\n## Simplifying `PokemonServiceBuilder`'s signature\n\nLet's take a second look at the (updated) definition of `PokemonServiceBuilder`:\n\n```rust,ignore\npub struct PokemonServiceBuilder<\n    Op1,\n    Op2,\n    Op3,\n    Op4,\n    Op5,\n    Op6,\n    Exts1 = (),\n    Exts2 = (),\n    Exts3 = (),\n    Exts4 = (),\n    Exts5 = (),\n    Exts6 = (),\n    Pl = aws_smithy_http_server::plugin::IdentityPlugin,\n> {\n    check_health: Option<Op1>,\n    do_nothing: Option<Op2>,\n    get_pokemon_species: Option<Op3>,\n    get_server_statistics: Option<Op4>,\n    capture_pokemon: Option<Op5>,\n    get_storage: Option<Op6>,\n    #[allow(unused_parens)]\n    _exts: std::marker::PhantomData<(Exts1, Exts2, Exts3, Exts4, Exts5, Exts6)>,\n    plugin: Pl,\n}\n```\n\nWe have 13 generic parameters:\n- 1 for plugins (`Pl`);\n- 2 for each operation (`OpX` and `ExtsX`);\n\nAll those generic parameters were necessary when we were using the [typestate builder pattern]. They kept track of which operation handlers were missing: if any `OpX` was set to `MissingOperation` when calling `build` -> compilation error!\n\nDo we still need all those generic parameters if we move forward with this RFC?\nYou might be asking yourselves: why do those generics bother us? Is there any harm in keeping them around?\nWe'll look at the impact of those generic parameters on two scenarios:\n- Branching in startup logic;\n- Breaking down a monolithic startup function into multiple smaller functions.\n\n### Branching -> \"Incompatible types\"\n\nConditional statements appear quite often in the startup logic for an application (or in the setup code for its integration tests).\nLet's consider a toy example: if a `check_database` flag is set to `true`, we want to register a different `check_health` handler - one that takes care of pinging the database to make sure it's up.\n\nThe \"obvious\" solution would look somewhat like this:\n\n```rust,ignore\nlet check_database: bool = /* */;\nlet app = if check_database {\n    app.check_health(check_health)\n} else {\n    app.check_health(check_health_with_database)\n};\napp.build();\n```\n\nThe compiler is not pleased:\n\n```text\nerror[E0308]: `if` and `else` have incompatible types\n  --> pokemon-service/src/bin/pokemon-service.rs:39:9\n   |\n36 |       let app = if check_database {\n   |  _______________-\n37 | |         app.check_health(check_health)\n   | |         ------------------------------ expected because of this\n38 | |     } else {\n39 | |         app.check_health(check_health_with_database)\n   | |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected fn item, found a different fn item\n40 | |     };\n   | |_____- `if` and `else` have incompatible types\n   |\n   = note: expected struct `PokemonServiceBuilder<Operation<IntoService<_, fn(CheckHealthInput) -> impl Future<Output =\n    CheckHealthOutput> {check_health}>>, _, _, _, _, _, _, _, _, _, _, _>`\n              found struct `PokemonServiceBuilder<Operation<IntoService<_, fn(CheckHealthInput) -> impl Future<Output =\n    CheckHealthOutput> {check_health_with_database}>>, _, _, _, _, _, _, _, _, _, _, _>`\n```\n\nThe developer must be aware of the following facts to unpack the error message:\n1. The two branches of an `if`/`else` statement need to return the same type.\n2. Each function closure has a new unique type (represented as `fn(CheckHealthInput) -> impl Future<Output =\n    CheckHealthOutput> {check_health}` for `check_health`);\n3. The handler function type becomes part of the overall `PokemonServiceBuilder` type, a cog in the larger `Op1` generic parameter used to hold the handler for the `CheckHealth` operation (i.e. `Operation<IntoService<_, fn(CheckHealthInput) -> impl Future<Output =\n    CheckHealthOutput> {check_health}>>`);\n\nThe second fact requires an intermediate understanding of Rust's closures and opaque types (`impl Trait`). It's quite likely to confuse Rust beginners.\n\nThe developer has three options to move forward:\n1. Convert `check_health` and `check_health_with_database` into a common type that can be passed as a handler to `PokemonServiceBuilder::check_health`;\n2. Invoke the `build` method inside the two branches in order to return a \"plain\" `PokemonService<Route<B>>` from both branches.\n3. Embed the configuration parameter (`check_database`) in the application state, retrieve it inside `check_health` and perform the branching there.\n\nI can't easily see a way to accomplish 1) using the current API. Pursuing 2) is straight-forward with a single conditional:\n\n```rust,ignore\nlet check_database: bool = /* */;\nlet app = if check_database {\n    app.check_health(check_health).build()\n} else {\n    app.check_health(check_health_with_database).build()\n};\n```\n\nIt becomes more cumbersome when we have more than a single conditional:\n\n```rust,ignore\nlet check_database: bool = /* */;\nlet include_cpu_statics: bool = /* */;\nmatch (check_database, include_cpu_statics) {\n    (true, true) => app\n        .check_health(check_health_with_database)\n        .get_server_statistics(get_server_statistics_with_cpu)\n        .build(),\n    (true, false) => app\n        .check_health(check_health_with_database)\n        .get_server_statistics(get_server_statistics)\n        .build(),\n    (false, true) => app\n        .check_health(check_health)\n        .get_server_statistics(get_server_statistics_with_cpu())\n        .build(),\n    (false, false) => app\n        .check_health(check_health)\n        .get_server_statistics(get_server_statistics)\n        .build(),\n}\n```\n\nA lot of repetition compared to the code for the \"obvious\" approach:\n\n```rust,ignore\nlet check_database: bool = /* */;\nlet include_cpu_statics: bool = /* */;\nlet app = if check_database {\n    app.check_health(check_health)\n} else {\n    app.check_health(check_health_with_database)\n};\nlet app = if include_cpu_statistics {\n    app.get_server_statistics(get_server_statistics_with_cpu)\n} else {\n    app.get_server_statistics(get_server_statistics)\n};\napp.build();\n```\n\nThe obvious approach becomes viable if we stop embedding the handler function type in `PokemonServiceBuilder`'s overall type.\n\n### Refactoring into smaller functions -> Prepare for some type juggling!\n\nServices with a high number of routes can lead to fairly long startup routines.\nDevelopers might be tempted to break down the startup routine into smaller functions, grouping together operations with common requirements (similar domain, same middlewares, etc.).\n\nWhat does the signature of those smaller functions look like?\nThe service builder must be one of the arguments if we want to register handlers. We must also return it to allow the orchestrating function to finish the application setup (our setters take ownership of `self`).\n\nA first sketch:\n\n```rust,ignore\nfn partial_setup(builder: PokemonServiceBuilder) -> PokemonServiceBuilder {\n    /* */\n}\n```\n\nThe compiler demands to see those generic parameters in the signature:\n\n```text\nerror[E0107]: missing generics for struct `PokemonServiceBuilder`\n  --> pokemon-service/src/bin/pokemon-service.rs:28:27\n   |\n28 | fn partial_setup(builder: PokemonServiceBuilder) -> PokemonServiceBuilder {\n   |                           ^^^^^^^^^^^^^^^^^^^^^ expected at least 6 generic arguments\n   |\nnote: struct defined here, with at least 6 generic parameters: `Op1`, `Op2`, `Op3`, `Op4`, `Op5`, `Op6`\n\nerror[E0107]: missing generics for struct `PokemonServiceBuilder`\n  --> pokemon-service/src/bin/pokemon-service.rs:28:53\n   |\n28 | fn partial_setup(builder: PokemonServiceBuilder) -> PokemonServiceBuilder {\n   |                                                     ^^^^^^^^^^^^^^^^^^^^^ expected at least 6 generic arguments\n   |\nnote: struct defined here, with at least 6 generic parameters: `Op1`, `Op2`, `Op3`, `Op4`, `Op5`, `Op6`\n```\n\nWe could try to nudge the compiler into inferring them:\n\n```rust,ignore\nfn partial_setup(\n    builder: PokemonServiceBuilder<_, _, _, _, _, _>,\n) -> PokemonServiceBuilder<_, _, _, _, _, _> {\n    /* */\n}\n```\n\nbut that won't fly either:\n\n```text\nerror[E0121]: the placeholder `_` is not allowed within types on item signatures for return types\n  --> pokemon-service/src/bin/pokemon-service.rs:30:28\n   |\n30 | ) -> PokemonServiceBuilder<_, _, _, _, _, _> {\n   |                            ^  ^  ^  ^  ^  ^ not allowed in type signatures\n   |                            |  |  |  |  |\n   |                            |  |  |  |  not allowed in type signatures\n   |                            |  |  |  not allowed in type signatures\n   |                            |  |  not allowed in type signatures\n   |                            |  not allowed in type signatures\n   |                            not allowed in type signatures\n```\n\nWe must type it all out:\n\n```rust,ignore\nfn partial_setup<Op1, Op2, Op3, Op4, Op5, Op6>(\n    builder: PokemonServiceBuilder<Op1, Op2, Op3, Op4, Op5, Op6>,\n) -> PokemonServiceBuilder<Op1, Op2, Op3, Op4, Op5, Op6> {\n    builder\n}\n```\n\nThat compiles, at last.\nLet's try to register an operation handler now:\n\n```rust,ignore\nfn partial_setup<Op1, Op2, Op3, Op4, Op5, Op6>(\n    builder: PokemonServiceBuilder<Op1, Op2, Op3, Op4, Op5, Op6>,\n) -> PokemonServiceBuilder<Op1, Op2, Op3, Op4, Op5, Op6> {\n    builder.get_server_statistics(get_server_statistics)\n}\n```\n\nThat looks innocent, but it doesn't fly:\n\n```text\nerror[E0308]: mismatched types\n  --> pokemon-service/src/bin/pokemon-service.rs:31:5\n   |\n28 | fn partial_setup<Op1, Op2, Op3, Op4, Op5, Op6>(\n   |                                 --- this type parameter\n29 |     builder: PokemonServiceBuilder<Op1, Op2, Op3, Op4, Op5, Op6>,\n30 | ) -> PokemonServiceBuilder<Op1, Op2, Op3, Op4, Op5, Op6> {\n   |      --------------------------------------------------- expected `PokemonServiceBuilder<Op1, Op2, Op3, Op4, Op5, Op6>` because of return type\n31 |     builder.get_server_statistics(get_server_statistics)\n   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected type parameter `Op4`, found struct `Operation`\n   |\n   = note: expected struct `PokemonServiceBuilder<_, _, _, Op4, _, _, _>`\n              found struct `PokemonServiceBuilder<_, _, _, Operation<IntoService<GetServerStatistics, fn(GetServerStatisticsInput, Extension<Arc<State>>) -> impl Future<Output = GetServerStatisticsOutput> {get_server_statistics}>>, _, _, _>\n```\n\nBy registering a handler we have changed the corresponding `OpX` generic parameter.\nFixing this error requires some non-trivial type gymnastic - I gave up after trying for ~15 minutes.\n\n### Cut them down: going from 2N+1 to 2 generic parameters\n\nThe previous two examples should have convinced you that the 2N+1 generic parameters on `PokemonServiceBuilder` harm the ergonomics of our API.\nCan we get rid of them?\n\nYes! Let's look at one possible approach:\n\n```rust,ignore\npub struct PokemonServiceBuilder<Body, Plugin> {\n    check_health: Option<Route<Body>>,\n    do_nothing: Option<Route<Body>>,\n    get_pokemon_species: Option<Route<Body>>,\n    get_server_statistics: Option<Route<Body>>,\n    capture_pokemon: Option<Route<Body>>,\n    get_storage: Option<Route<Body>>,\n    plugin: Plugin,\n}\n```\n\nWe no longer store the raw handlers inside `PokemonServiceBuilder`.\nWe eagerly upgrade the operation handlers to a `Route` instance when they are registered with the builder.\n\n```rust,ignore\nimpl<Body, Plugin> PokemonServiceBuilder<Body, Plugin> {\n    pub fn get_pokemon_species<Handler, Extensions>(mut self, handler: Handler) -> Self\n    /* Complex trait bounds */\n    {\n        let route = Route::new(Operation::from_handler(handler).upgrade(&self.plugin));\n        self.get_pokemon_species = Some(route);\n        self\n    }\n\n    /* other setters and methods */\n}\n```\n\nThe existing API performs the upgrade when `build` is called, forcing `PokemonServiceBuilder` to store the raw handlers and keep two generic parameters around (`OpX` and `ExtsX`) for each operation.\nThe proposed API requires plugins to be specified upfront, when creating an instance of the builder. They cannot be modified after a `PokemonServiceBuilder` instance has been built:\n\n```rust,ignore\nimpl PokemonService<()> {\n    /// Constructs a builder for [`PokemonService`].\n    pub fn builder<Body, Plugin>(plugin: Plugin) -> PokemonServiceBuilder<Body, Plugin> {\n        PokemonServiceBuilder {\n            check_health: None,\n            do_nothing: None,\n            get_pokemon_species: None,\n            get_server_statistics: None,\n            capture_pokemon: None,\n            get_storage: None,\n            plugin,\n        }\n    }\n}\n```\n\nThis constraint guarantees that all operation handlers are upgraded to a `Route` using the same set of plugins.\n\nHaving to specify all plugins upfront is unlikely to have a negative impact on developers currently using `smithy-rs`.\nWe have seen how cumbersome it is to break the startup logic into different functions using the current service builder API. Developers are most likely specifying all plugins and routes in the same function even if the current API allows them to intersperse route registrations and plugin registrations: they would simply have to re-order their registration statements to adopt the API proposed in this RFC.\n\n### Alternatives: allow new plugins to be registered after builder creation\n\nThe new design prohibits the following invocation style:\n\n```rust,ignore\nlet plugin = ColorPlugin::new();\nPokemonService::builder(plugin)\n    // [...]\n    .get_pokemon_species(get_pokemon_species)\n    // Add PrintPlugin\n    .print()\n    .get_storage(get_storage)\n    .build()\n```\n\nWe could choose to remove this limitation and allow handlers to be upgraded using a different set of plugins depending on where they were registered.\nIn the snippet above, for example, we would have:\n\n- `get_pokemon_species` is upgraded using just the `ColorPlugin`;\n- `get_storage` is upgraded using both the `ColorPlugin` and the `PrintPlugin`.\n\nThere are no technical obstacles preventing us from implementing this API, but I believe it could easily lead to confusion and runtime surprises due to a mismatch between what the developer might expect `PrintPlugin` to apply to (all handlers) and what it actually applies to (handlers registered after `.print()`).\n\nWe can provide developers with other mechanisms to register plugins for a single operation or a subset of operations without introducing ambiguity.\nFor attaching additional plugins to a single operation, we could introduce a blanket `Pluggable` implementation for all operations in `aws-smithy-http-server`:\n\n```rust,ignore\nimpl<P, Op, Pl, S, L> Pluggable<Pl> for Operation<S, L> where Pl: Plugin<P, Op, S, L> {\n    type Output = Operation<Pl::Service, Pl::Layer>;\n\n    fn apply(self, new_plugin: Pl) -> Self::Output {\n       new_plugin.map(self)\n   }\n}\n```\n\nwhich would allow developers to invoke `op.apply(MyPlugin)` or call extensions methods such as `op.print()` where `op` is an `Operation`.\nFor attaching additional plugins to a subgroup of operations, instead, we could introduce nested builders:\n\n```rust,ignore\nlet initial_plugins = ColorPlugin;\nlet mut builder = PokemonService::builder(initial_plugins)\n    .get_pokemon_species(get_pokemon_species);\nlet additional_plugins = PrintPlugin;\n// PrintPlugin will be applied to all handlers registered on the scoped builder returned by `scope`.\nlet nested_builder = builder.scoped(additional_plugins)\n    .get_storage(get_storage)\n    .capture_pokemon(capture_pokemon)\n    // Register all the routes on the scoped builder with the parent builder.\n    // API names are definitely provisional and bikesheddable.\n    .attach(builder);\nlet app = builder.build();\n```\n\nBoth proposals are outside the scope of this RFC, but they are shown here for illustrative purposes.\n\n### Alternatives: lazy and eager-on-demand type erasure\n\nA lot of our issues stem from type mismatch errors: we are encoding the type of our handlers into the overall type of the service builder and, as a consequence, we end up modifying that type every time we set a handler or modify its state.\nType erasure is a common approach for mitigating these issues - reduce those generic parameters to a common type to avoid the mismatch errors.\nThis whole RFC can be seen as a type erasure proposal - done eagerly, as soon as the handler is registered, using `Option<Route<B>>` as our \"common type\" after erasure.\n\nWe could try to strike a different balance - i.e. avoid performing type erasure eagerly, but allow developers to erase types on demand.\nBased on my analysis, this could happen in two ways:\n\n1. We cast handlers into a `Box<dyn Upgradable<Protocol, Operation, Exts, Body, Plugin>>` to which we can later apply plugins (lazy type erasure);\n2. We upgrade registered handlers to `Route<B>` and apply plugins in the process (eager type erasure on-demand).\n\nLet's ignore these implementation issues for the time being to focus on what the ergonomics would look like assuming we can actually perform type erasure.\nIn practice, we are going to assume that:\n\n- In approach 1), we can call `.boxed()` on a registered operation and get a `Box<dyn Upgradable>` back;\n- In approach 2), we can call `.erase()` on the entire service builder and convert all registered operations to `Route<B>` while keeping the `MissingOperation` entries as they are. After `erase` has been called, you can no longer register plugins (or, alternatively, the plugins you register will only apply new handlers).\n\nWe are going to explore both approaches under the assumption that we want to preserve compile-time verification for missing handlers. If we are willing to abandon compile-time verification, we get better ergonomics since all `OpX` and `ExtsX` generic parameters can be erased (i.e. we no longer need to worry about `MissingOperation`).\n\n#### On `Box<dyn Upgradable<Protocol, Operation, Exts, Body, Plugin>>`\n\nThis is the current definition of the `Upgradable` trait:\n\n```rust,ignore\n/// Provides an interface to convert a representation of an operation to a HTTP [`Service`](tower::Service) with\n/// canonical associated types.\npub trait Upgradable<Protocol, Operation, Exts, Body, Plugin> {\n    type Service: Service<http::Request<Body>, Response = http::Response<BoxBody>>;\n\n    /// Performs an upgrade from a representation of an operation to a HTTP [`Service`](tower::Service).\n    fn upgrade(self, plugin: &Plugin) -> Self::Service;\n}\n```\n\nIn order to perform type erasure, we need to determine:\n\n- what type parameters we are going to pass as generic arguments to `Upgradable`;\n- what type we are going to use for the associated type `Service`.\n\nWe have:\n\n- there is a single known protocol for a service, therefore we can set `Protocol` to its concrete type (e.g. `AwsRestJson1`);\n- each handler refers to a different operation, therefore we cannot erase the `Operation` and the `Exts` parameters;\n- both `Body` and `Plugin` appear as generic parameters on the service builder itself, therefore we can set them to the same type;\n- we can use `Route<B>` to normalize the `Service` associated type.\n\nThe above leaves us with two unconstrained type parameters, `Operation` and `Exts`, for each operation. Those unconstrained type parameters leak into the type signature of the service builder itself. We therefore find ourselves having, again, 2N+2 type parameters.\n\n#### Branching\n\nGoing back to the branching example:\n\n```rust,ignore\nlet check_database: bool = /* */;\nlet builder = if check_database {\n    builder.check_health(check_health)\n} else {\n    builder.check_health(check_health_with_database)\n};\nlet app = builder.build();\n```\n\nIn approach 1), we could leverage the `.boxed()` method to convert the actual `OpX` type into a `Box<dyn Upgradable>`, thus ensuring that both branches return the same type:\n\n```rust,ignore\nlet check_database: bool = /* */;\nlet builder = if check_database {\n    builder.check_health_operation(Operation::from_handler(check_health).boxed())\n} else {\n    builder.check_health_operation(Operation::from_handler(check_health_with_database).boxed())\n};\nlet app = builder.build();\n```\n\nThe same cannot be done when conditionally registering a route, because on the `else` branch we cannot convert `MissingOperation` into a `Box<dyn Upgradable>` since `MissingOperation` doesn't implement `Upgradable` - the pillar on which we built all our compile-time safety story.\n\n```rust,ignore\n// This won't compile!\nlet builder = if check_database {\n    builder.check_health_operation(Operation::from_handler(check_health).boxed())\n} else {\n    builder\n};\n```\n\nIn approach 2), we can erase the whole builder in both branches when they both register a route:\n\n```rust,ignore\nlet check_database: bool = /* */;\nlet boxed_builder = if check_database {\n    builder.check_health(check_health).erase()\n} else {\n    builder.check_health(check_health_with_database).erase()\n};\nlet app = boxed_builder.build();\n```\n\nbut, like in approach 1), we will still get a type mismatch error if one of the two branches leaves the route unset.\n\n#### Refactoring into smaller functions\n\nDevelopers would still have to spell out all generic parameters when writing a function that takes in a builder as a parameter:\n\n```rust,ignore\nfn partial_setup<Op1, Op2, Op3, Op4, Op5, Op6, Body, Plugin>(\n    builder: PokemonServiceBuilder<Op1, Op2, Op3, Op4, Op5, Op6, Body, Plugin>,\n) -> PokemonServiceBuilder<Op1, Op2, Op3, Op4, Op5, Op6, Body, Plugin> {\n    builder\n}\n```\n\nWriting the signature after having modified the builder becomes easier though.\nIn approach 1), they can explicitly change the touched operation parameters to the boxed variant:\n\n```rust,ignore\nfn partial_setup<Op1, Op2, Op3, Op4, Op5, Op6, Exts4, Body, Plugin>(\n    builder: PokemonServiceBuilder<Op1, Op2, Op3, Op4, Op5, Op6, Body, Plugin, Exts4=Exts4>,\n) -> PokemonServiceBuilder<\n        Op1, Op2, Op3, Box<dyn Upgradable<AwsRestJson1, GetServerStatistics, Exts4, Body, Plugin>>,\n        Op5, Op6, Body, Plugin, Body, Plugin, Exts4=Exts\n    > {\n    builder.get_server_statistics(get_server_statistics)\n}\n```\n\nIt becomes trickier in approach 2), since to retain compile-time safety on the builder we expect `erase` to map `MissingOperation` into `MissingOperation`. Therefore, we can't write something like this:\n\n```rust,ignore\nfn partial_setup<Body, Op1, Op2, Op3, Op4, Op5, Op6>(\n    builder: PokemonServiceBuilder<Op1, Op2, Op3, Op4, Op5, Op6>,\n) -> PokemonServiceBuilder<Route<B>, Route<B>, Route<B>, Route<B>, Route<B>, Route<B>> {\n    builder.get_server_statistics(get_server_statistics).()\n}\n```\n\nThe compiler would reject it since it can't guarantee that all other operations can be erased to a `Route<B>`. This is likely to require something along the lines of:\n\n```rust,ignore\nfn partial_setup<Body, Op1, Op2, Op3, Op4, Op5, Op6>(\n    builder: PokemonServiceBuilder<Op1, Op2, Op3, Op4, Op5, Op6>,\n) -> PokemonServiceBuilder<<Op1 as TypeErase>::Erased, <Op2 as TypeErase>::Erased, <Op3 as TypeErase>::Erased, <Op4 as TypeErase>::Erased, <Op5 as TypeErase>::Erased, <Op6 as TypeErase>::Erased>\nwhere\n    // Omitting a bunch of likely needed additional generic parameters and bounds here\n    Op1: TypeErase,\n    Op2: TypeErase,\n    Op3: TypeErase,\n    Op4: TypeErase,\n    Op5: TypeErase,\n    Op6: TypeErase,\n{\n    builder.get_server_statistics(get_server_statistics).()\n}\n```\n\n#### Summary\n\nBoth approaches force us to have a number of generic parameters that scales linearly with the number of operations on the service, affecting the ergonomics of the resulting API in both the branching and the refactoring scenarios.\nWe believe that the ergonomics advantages of the proposal advanced by this RFC outweigh the limitation of having to specify your plugins upfront, when creating the builder instance.\n\n### Builder extensions: what now?\n\nThe `Pluggable` trait was an interesting development out of [RFC 20]: it allows you to attach methods to a service builder using an extension trait.\n\n```rust,ignore\n/// An extension to service builders to add the `print()` function.\npub trait PrintExt: aws_smithy_http_server::plugin::Pluggable<PrintPlugin> {\n    /// Causes all operations to print the operation name when called.\n    ///\n    /// This works by applying the [`PrintPlugin`].\n    fn print(self) -> Self::Output\n        where\n            Self: Sized,\n    {\n        self.apply(PrintPlugin)\n    }\n}\n```\n\nThis pattern needs to be revisited if we want to move forward with this RFC, since new plugins cannot be registered after the builder has been instantiated.\nMy recommendation would be to implement `Pluggable` for `PluginStack`, providing the same pattern ahead of the creation of the builder:\n\n```rust,ignore\n// Currently you'd have to go for `PluginStack::new(IdentityPlugin, IdentityPlugin)`,\n// but that can be smoothed out even if this RFC isn't approved.\nlet plugin_stack = PluginStack::default()\n    // Use the extension method\n    .print();\nlet app = PokemonService::builder(plugin_stack)\n    .get_pokemon_species(get_pokemon_species)\n    .get_storage(get_storage)\n    .get_server_statistics(get_server_statistics)\n    .capture_pokemon(capture_pokemon)\n    .do_nothing(do_nothing)\n    .build()?;\n```\n\n## Playing around with the design\n\nThe API proposed in this RFC has been manually implemented for the Pokemon service. You can find the code [here](https://github.com/LukeMathWalker/builder-experiments).\n\n## Changes checklist\n\n- [x] Update `codegen-server` to generate the proposed service builder API\n  - <https://github.com/smithy-lang/smithy-rs/pull/1954>\n- [x] Implement `Pluggable` for `PluginStack`\n  - <https://github.com/smithy-lang/smithy-rs/pull/1954>\n- [x] Evaluate the introduction of a `PluginBuilder` as the primary API to compose multiple plugins (instead of `PluginStack::new(IdentityPlugin, IdentityPlugin).apply(...)`)\n  - <https://github.com/smithy-lang/smithy-rs/pull/1971>\n\n[RFC 20]: rfc0020_service_builder.md\n[Pokemon service]: https://github.com/smithy-lang/smithy-rs/blob/c7ddb164b28b920313432789cfe05d8112a035cc/codegen-core/common-test-models/pokemon.smithy\n[typestate builder pattern]: https://www.greyblake.com/blog/builder-with-typestate-in-rust/\n[^further-dev-productivity-improvements]: The impact of a runtime error on developer productivity can be further minimised by encouraging adoption of integration testing; this can be achieved, among other options, by authoring guides that highlight its benefits and provide implementation guidance.\n"
  },
  {
    "path": "design/src/rfcs/rfc0024_request_id.md",
    "content": "RFC: RequestID in business logic handlers\n=============\n\n> Status: Implemented\n>\n> Applies to: server\n\nFor a summarized list of proposed changes, see the [Changes Checklist](#changes-checklist) section.\n\nTerminology\n-----------\n\n- **RequestID**: a service-wide request's unique identifier\n- **UUID**: a universally unique identifier\n\nRequestID is an element that uniquely identifies a client request. RequestID is used by services to map all logs, events and\nspecific data to a single operation. This RFC discusses whether and how smithy-rs can make that value available to customers.\n\nServices use a RequestID to collect logs related to the same request and see its flow through the various operations,\nhelp clients debug requests by sharing this value and, in some cases, use this value to perform their business logic. RequestID is unique across a service at least within a certain timeframe.\n\nThis value for the purposes above must be set by the service.\n\nHaving the client send the value brings the following challenges:\n* The client could repeatedly send the same RequestID\n* The client could send no RequestID\n* The client could send a malformed or malicious RequestID (like in [1](https://en.wikipedia.org/wiki/Shellshock_(software_bug)) and\n[2](https://cwiki.apache.org/confluence/display/WW/S2-045)).\n\nTo minimise the attack surface and provide a uniform experience to customers, servers should generate the value.\nHowever, services should be free to read the ID sent by clients in HTTP headers: it is common for services to\nread the request ID a client sends, record it and send it back upon success. A client may want to send the same value to multiple services.\nServices should still decide to have their own unique request ID per actual call.\n\nRequestIDs are not to be used by multiple services, but only within a single service.\n\n<!-- Explain how users will use this new feature and, if necessary, how this compares to the current user experience -->\nThe user experience if this RFC is implemented\n----------------------------------------------\n\nThe proposal is to implement a `RequestId` type and make it available to middleware and business logic handlers, through [FromParts](../server/from_parts.md) and as a `Service`.\nTo aid customers already relying on clients' request IDs, there will be two types: `ClientRequestId` and `ServerRequestId`.\n\n1. Implementing `FromParts` for `Extension<RequestId>` gives customers the ability to write their handlers:\n\n```rust,ignore\npub async fn handler(\n    input: input::Input,\n    request_id: Extension<ServerRequestId>,\n) -> ...\n```\n```rust,ignore\npub async fn handler(\n    input: input::Input,\n    request_id: Extension<ClientRequestId>,\n) -> ...\n```\n\n`ServerRequestId` and `ClientRequestId` will be injected into the extensions by a layer.\nThis layer can also be used to open a span that will log the request ID: subsequent logs will be in the scope of that span.\n\n2. ServerRequestId format:\n\nCommon formats for RequestIDs are:\n\n* UUID: a random string, represented in hex, of 128 bits from IETF RFC 4122: `7c038a43-e499-4162-8e70-2d4d38595930`\n* The hash of a sequence such as `date+thread+server`: `734678902ea938783a7200d7b2c0b487`\n* A verbose description: `current_ms+hostname+increasing_id`\n\nFor privacy reasons, any format that provides service details should be avoided. A random string is preferred.\nThe proposed format is to use UUID, version 4.\n\nA `Service` that inserts a RequestId in the extensions will be implemented as follows:\n```rust,ignore\nimpl<R, S> Service<http::Request<R>> for ServerRequestIdProvider<S>\nwhere\n    S: Service<http::Request<R>>,\n{\n    type Response = S::Response;\n    type Error = S::Error;\n    type Future = S::Future;\n\n    fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {\n        self.inner.poll_ready(cx)\n    }\n\n    fn call(&mut self, mut req: http::Request<R>) -> Self::Future {\n        req.extensions_mut().insert(ServerRequestId::new());\n        self.inner.call(req)\n    }\n}\n```\n\nFor client request IDs, the process will be, in order:\n* If a header is found matching one of the possible ones, use it\n* Otherwise, None\n\n`Option` is used to distinguish whether a client had provided an ID or not.\n```rust,ignore\nimpl<R, S> Service<http::Request<R>> for ClientRequestIdProvider<S>\nwhere\n    S: Service<http::Request<R>>,\n{\n    type Response = S::Response;\n    type Error = S::Error;\n    type Future = S::Future;\n\n    fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {\n        self.inner.poll_ready(cx)\n    }\n\n    fn call(&mut self, mut req: http::Request<R>) -> Self::Future {\n        for possible_header in self.possible_headers {\n            if let Some(id) = req.headers.get(possible_header) {\n                req.extensions_mut().insert(Some(ClientRequestId::new(id)));\n                return self.inner.call(req)\n            }\n        }\n        req.extensions_mut().insert(None);\n        self.inner.call(req)\n    }\n}\n```\n\nThe string representation of a generated ID will be valid for this regex:\n* For `ServerRequestId`: `/^[A-Za-z0-9_-]{,48}$/`\n* For `ClientRequestId`: see [the spec](https://httpwg.org/specs/rfc9110.html#rfc.section.5.5)\n\nAlthough the generated ID is opaque, this will give guarantees to customers as to what they can expect, if the server ID is ever updated to a different format.\n\nChanges checklist\n-----------------\n\n- [x] Implement `ServerRequestId`: a `new()` function that generates a UUID, with `Display`, `Debug` and `ToStr` implementations\n- [ ] Implement `ClientRequestId`: `new()` that wraps a string (the header value) and the header in which the value could be found, with `Display`, `Debug` and `ToStr` implementations\n- [x] Implement `FromParts` for `Extension<ServerRequestId>`\n- [ ] Implement `FromParts` for `Extension<ClientRequestId>`\n\nChanges since the RFC has been approved\n---------------------------------------\n\nThis RFC has been changed to only implement `ServerRequestId`.\n"
  },
  {
    "path": "design/src/rfcs/rfc0025_constraint_traits.md",
    "content": "RFC: Constraint traits\n======================\n\n> Status: Implemented.\n>\n> See the description of [the PR][builders-of-builders] that laid the\n> foundation for the implementation of constraint traits for a complete\n> reference. See the [Better Constraint Violations] RFC too for subsequent\n> improvements to this design.\n>\n> See the uber [tracking issue] for pending work.\n\n[builders-of-builders]: https://github.com/smithy-lang/smithy-rs/pull/1342\n[tracking issue]: https://github.com/smithy-lang/smithy-rs/issues/1401\n\n[Constraint traits] are used to constrain the values that can be provided for a\nshape.\n\nFor example, given the following Smithy model,\n\n```smithy\n@length(min: 18)\nInteger Age\n```\n\nthe integer `Age` must take values greater than or equal to 18.\n\nConstraint traits are most useful when enforced as part of _input_ model\nvalidation to a service. When a server receives a request whose contents\ndeserialize to input data that violates the modeled constraints, the operation\nexecution's preconditions are not met, and as such rejecting the request\nwithout executing the operation is expected behavior.\n\nConstraint traits can also be applied to operation output member shapes, but\nthe expectation is that service implementations _not fail_ to render a response\nwhen an output value does not meet the specified constraints. From\n[awslabs/smithy#1039]:\n\n> This might seem counterintuitive, but our philosophy is that a change in\n> server-side state should not be hidden from the caller unless absolutely\n> necessary. Refusing to service an invalid request should always prevent\n> server-side state changes, but refusing to send a response will not, as\n> there's generally no reasonable route for a server implementation to unwind\n> state changes due to a response serialization failure.\n\n_In general_, clients should not enforce constraint traits in generated code.\nClients must also never enforce constraint traits when sending requests. This\nis because:\n\n* addition and removal of constraint traits are backwards-compatible from a\n  client's perspective (although this is _not_ documented anywhere in the\n  Smithy specification),\n* the client may have been generated with an older version of the model; and\n* the most recent model version might have lifted some constraints.\n\nOn the other hand, server SDKs constitute _the_ source of truth for the\nservice's behavior, so they interpret the model in all its strictness.\n\nThe Smithy spec defines 8 constraint traits:\n\n* [`enum`],\n* [`idRef`],\n* [`length`],\n* [`pattern`],\n* [`private`],\n* [`range`],\n* [`required`]; and\n* [`uniqueItems`].\n\nThe `idRef` and `private` traits are enforced at SDK generation time by the\n[`awslabs/smithy`] libraries and bear no relation to generated Rust code.\n\nThe only constraint trait enforcement that is generated by smithy-rs clients\nshould be and is the `enum` trait, which renders Rust `enum`s.\n\nThe `required` trait is already and only enforced by smithy-rs servers since\n[#1148](https://github.com/smithy-lang/smithy-rs/pull/1148).\n\nThat leaves 4 traits: `length`, `pattern`, `range`, and `uniqueItems`.\n\n[Constraint traits]: https://awslabs.github.io/smithy/1.0/spec/core/constraint-traits.html\n[awslabs/smithy#1039]: https://github.com/awslabs/smithy/issues/1039\n[`enum`]: https://awslabs.github.io/smithy/1.0/spec/core/constraint-traits.html#enum-trait\n[`idRef`]: https://awslabs.github.io/smithy/1.0/spec/core/constraint-traits.html#idref-trait\n[`length`]: https://awslabs.github.io/smithy/1.0/spec/core/constraint-traits.html#length-trait\n[`pattern`]: https://awslabs.github.io/smithy/1.0/spec/core/constraint-traits.html#pattern-trait\n[`private`]: https://awslabs.github.io/smithy/1.0/spec/core/constraint-traits.html#private-trait\n[`range`]: https://awslabs.github.io/smithy/1.0/spec/core/constraint-traits.html#range-trait\n[`required`]: https://awslabs.github.io/smithy/1.0/spec/core/constraint-traits.html#required-trait\n[`uniqueItems`]: https://awslabs.github.io/smithy/1.0/spec/core/constraint-traits.html#uniqueItems-trait\n[`awslabs/smithy`]: https://github.com/awslabs/smithy\n\nImplementation\n--------------\n\nThis section addresses how to implement and enforce the `length`, `pattern`,\n`range`, and `uniqueItems` traits. We will use the `length` trait applied to a\n`string` shape as a running example. The implementation of this trait mostly\ncarries over to the other three.\n\n### Example implementation for the `length` trait\n\nConsider the following Smithy model:\n\n```smithy\n@length(min: 1, max: 69)\nstring NiceString\n```\n\nThe central idea to the implementation of constraint traits is: [parse, don't\nvalidate]. Instead of code-generating a Rust `String` to represent `NiceString`\nvalues and perform the _validation_ at request deserialization, we can\n[leverage Rust's type system to guarantee domain invariants]. We can generate a\nwrapper [tuple struct] that _parses_ the string's value and is \"tight\" in the\nset of values it can accept:\n\n```rust,ignore\npub struct NiceString(String);\n\nimpl TryFrom<String> for NiceString {\n    type Error = nice_string::ConstraintViolation;\n\n    fn try_from(value: String) -> Result<Self, Self::Error> {\n        let num_code_points = value.chars().count();\n        if 1 <= num_code_points && num_code_points <= 69 {\n            Ok(Self(value))\n        } else {\n            Err(nice_string::ConstraintViolation::Length(num_code_points))\n        }\n    }\n}\n```\n\n(Note that we're using the _linear_ time check `chars().count()` instead of\n`len()` on the input value, since the Smithy specification says the `length`\ntrait counts [the number of _Unicode code points_ when applied to string\nshapes].)\n\nThe goal is to enforce, at the type-system level, that these constrained\nstructs always hold valid data. It should be impossible for the service\nimplementer, without resorting to `unsafe` Rust, to construct a `NiceString`\nthat violates the model. The actual check is performed in the implementation of\n[`TryFrom`]`<InnerType>` for the generated struct, which makes it convenient to use\nthe [`?` operator for error propagation]. Each constrained struct will have a\nrelated `std::error::Error` enum type to signal the _first_ parsing failure,\nwith one enum variant per applied constraint trait:\n\n```rust,ignore\npub mod nice_string {\n    pub enum ConstraintViolation {\n        /// Validation error holding the number of Unicode code points found, when a value between `1` and\n        /// `69` (inclusive) was expected.\n        Length(usize),\n    }\n\n    impl std::error::Error for ConstraintViolation {}\n}\n```\n\n[`std::error::Error`] requires [`Display`] and [`Debug`]. We will\n`#[derive(Debug)]`, unless the shape also has the [`sensitive` trait], in which\ncase we will just print the name of the struct:\n\n```rust,ignore\nimpl std::fmt::Debug for ConstraintViolation {\n    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n        let mut formatter = f.debug_struct(\"ConstraintViolation\");\n        formatter.finish()\n    }\n}\n```\n\n`Display` is used to produce human-friendlier representations. Its\nimplementation might be called when formatting a [400 HTTP response message] in\ncertain protocols, for example.\n\n[parse, don't validate]: https://lexi-lambda.github.io/blog/2019/11/05/parse-don-t-validate/\n[leverage Rust's type system to guarantee domain invariants]: https://www.lpalmieri.com/posts/2020-12-11-zero-to-production-6-domain-modelling/\n[tuple struct]: https://doc.rust-lang.org/1.9.0/book/structs.html#tuple-structs\n[the number of _Unicode code points_ when applied to string shapes]: https://awslabs.github.io/smithy/1.0/spec/core/constraint-traits.html#length-trait\n[`?` operator for error propagation]: https://doc.rust-lang.org/book/ch09-02-recoverable-errors-with-result.html#a-shortcut-for-propagating-errors-the--operator\n[`std::error::Error`]: https://doc.rust-lang.org/nightly/std/error/trait.Error.html\n[`sensitive` trait]: https://awslabs.github.io/smithy/1.0/spec/core/documentation-traits.html#sensitive-trait\n[400 HTTP response message]: https://developer.mozilla.org/en-US/docs/web/http/status/400\n[`TryFrom`]: https://doc.rust-lang.org/std/convert/trait.TryFrom.html\n[`Display`]: https://doc.rust-lang.org/std/fmt/trait.Display.html\n[`Debug`]: https://doc.rust-lang.org/std/fmt/trait.Debug.html\n\n### Request deserialization\n\nWe will continue to deserialize the different parts of the HTTP message into\nthe regular Rust standard library types. However, just before the\ndeserialization function returns, we will convert the type into the wrapper\ntuple struct that will eventually be handed over to the operation handler. This\nis what we're _already_ doing when deserializing strings into `enums`. For\nexample, given the Smithy model:\n\n```smithy\n@enum([\n    { name: \"Spanish\", value: \"es\" },\n    { name: \"English\", value: \"en\" },\n    { name: \"Japanese\", value: \"jp\" },\n])\nstring Language\n```\n\nthe code the client generates when deserializing a string from a JSON document\ninto the `Language` enum is (excerpt):\n\n```rust,ignore\n...\nmatch key.to_unescaped()?.as_ref() {\n    \"language\" => {\n        builder = builder.set_language(\n            aws_smithy_json::deserialize::token::expect_string_or_null(\n                tokens.next(),\n            )?\n            .map(|s| {\n                s.to_unescaped()\n                    .map(|u| crate::model::Language::from(u.as_ref()))\n            })\n            .transpose()?,\n        );\n    }\n    _ => aws_smithy_json::deserialize::token::skip_value(tokens)?,\n}\n...\n```\n\nNote how the `String` gets converted to the enum via `Language::from()`.\n\n```rust,ignore\nimpl std::convert::From<&str> for Language {\n    fn from(s: &str) -> Self {\n        match s {\n            \"es\" => Language::Spanish,\n            \"en\" => Language::English,\n            \"jp\" => Language::Japanese,\n            other => Language::Unknown(other.to_owned()),\n        }\n    }\n}\n```\n\nFor constrained shapes we would do the same to parse the inner deserialized\nvalue into the wrapper tuple struct, except for these differences:\n\n1. For enums, the client generates an `Unknown` variant that \"contains new\n   variants that have been added since this code was generated\". The server\n   does not need such a variant ([#1187]).\n2. Conversions into the tuple struct are fallible (`try_from()` instead of\n   `from()`). These errors will result in a `my_struct::ConstraintViolation`.\n\n`length` trait\n--------------\n\nWe will enforce the length constraint by calling `len()` on Rust's `Vec`\n(`list` and `set` shapes), `HashMap` (`map` shapes) and our\n[`aws_smithy_types::Blob`] (`bytes` shapes).\n\nWe will enforce the length constraint trait on `String` (`string` shapes) by\ncalling `.chars().count()`.\n\n`pattern` trait\n---------------\n\nThe [`pattern` trait]\n\n> restricts string shape values to a specified regular expression.\n\nWe will implement this by using the `regex`'s crate [`is_match`]. We will use\n[`once_cell`] to compile the regex only the first time it is required.\n\n`uniqueItems` trait\n-------------------\n\nThe [`uniqueItems` trait]\n\n> indicates that the items in a [`List`] MUST be unique.\n\nIf the list shape is `sparse`, more than one `null` value violates this\nconstraint.\n\nWe will enforce this by copying _references_ to the `Vec`'s elements into a\n`HashSet` and checking that the sizes of both containers coincide.\n\n[`Eq`]: https://doc.rust-lang.org/std/cmp/trait.Eq.html\n[even if its members are not equipped with an equivalence relation]: https://github.com/awslabs/smithy/issues/1093\n[`List`]: https://awslabs.github.io/smithy/1.0/spec/core/model.html#list\n[`uniqueItems` trait]: https://awslabs.github.io/smithy/1.0/spec/core/constraint-traits.html#uniqueitems-trait\n[`is_match`]: https://docs.rs/regex/latest/regex/struct.Regex.html#method.is_match\n[`pattern` trait]: https://awslabs.github.io/smithy/1.0/spec/core/constraint-traits.html#pattern-trait\n[`aws_smithy_types::Blob`]: https://docs.rs/aws-smithy-types/latest/aws_smithy_types/struct.Blob.html\n[`aws_smithy_http_server::rejection::SmithyRejection`]: https://docs.rs/aws-smithy-http-server/latest/aws_smithy_http_server/rejection/enum.SmithyRejection.html\n[`aws_smithy_http_server::rejection::Deserialize`]: https://docs.rs/aws-smithy-http-server/latest/aws_smithy_http_server/rejection/struct.Deserialize.html\n[#1187]: https://github.com/smithy-lang/smithy-rs/issues/1187\n[`once_cell`]: https://docs.rs/once_cell/latest/once_cell/\n\nTrait precedence and naming of the tuple struct\n-----------------------------------------------\n\nFrom [the spec]:\n\n> Some constraints can be applied to shapes as well as structure members. If a\n> constraint of the same type is applied to a structure member and the shape\n> that the member targets, the trait applied to the member takes precedence.\n\n```smithy\nstructure ShoppingCart {\n    @range(min: 7, max:12)\n    numberOfItems: PositiveInteger\n}\n\n@range(min: 1)\ninteger PositiveInteger\n```\n\nIn the above example,\n\n> the range trait applied to numberOfItems takes precedence over the one\n> applied to PositiveInteger. The resolved minimum will be 7, and the maximum\n> 12.\n\nWhen the constraint trait is applied to a member shape, the tuple struct's name\nwill be the PascalCased name of the member shape, `NumberOfItems`.\n\n[the spec]: https://awslabs.github.io/smithy/1.0/spec/core/constraint-traits.html?highlight=enum#trait-precedence\n\nUnresolved questions\n--------------------\n\n1. Should we code-generate unsigned integer types (`u16`, `u32`, `u64`) when\n   the `range` trait is applied with `min` set to a value greater than or equal\n   to 0?\n    - A user has even suggested to use the `std::num::NonZeroUX` types (e.g.\n      [`NonZeroU64`]) when `range` is applied with `min` set to a value greater\n      than 0.\n    - UPDATE: This requires further design work. There are interoperability\n      concerns: for example, the positive range of a\n      `u32` is strictly greater than that of an `i32`, so clients wouldn't be\n      able to receive values within the non-overlapping range.\n2. In request deserialization, should we fail with the first violation and\n   immediately render a response, or attempt to parse the entire request and\n   provide a complete and structured report?\n    - UPDATE: We will provide a response containing all violations. See the\n      \"Collecting Constraint Violations\" section in the [Better Constraint\n      Violations] RFC.\n3. Should we provide a mechanism for the service implementer to construct a\n   Rust type violating the modeled constraints in their business logic e.g. a\n   `T::new_unchecked()` constructor? This could be useful (1) when the user\n   _knows_ the provided inner value does not violate the constraints and\n   doesn't want to incur the performance penalty of the check; (2) when the\n   struct is in a transient invalid state. However:\n    - (2) is arguably a modelling mistake and a separate struct to represent\n      the transient state would be a better approach,\n    - the user could use `unsafe` Rust to bypass the validation; and\n    - adding this constructor is a backwards-compatible change, so it can\n      always be added later if this feature is requested.\n    - UPDATE: We decided to punt on this until users express interest.\n\n[`NonZeroU64`]: https://doc.rust-lang.org/std/num/struct.NonZeroU64.html\n[Better Constraint Violations]: https://github.com/smithy-lang/smithy-rs/pull/2040\n\nAlternative design\n------------------\n\nAn alternative design with less public API surface would be to perform\nconstraint validation at request deserialization, but hand over a regular\n\"loose\" type (e.g. `String` instead of `NiceString`) that allows for values\nviolating the constraints. If we were to implement this approach, we can\nimplement it by wrapping the incoming value in the aforementioned tuple struct\nto perform the validation, and immediately unwrap it.\n\nComparative advantages:\n\n* Validation remains an internal detail of the framework. If the semantics of a\n  constraint trait change, the behavior of the service is still\n  backwards-incompatibly affected, but user code is not.\n* Less \"invasive\". Baking validation in the generated type might be deemed as\n  the service framework overreaching responsibilities.\n\nComparative disadvantages:\n\n* It becomes _possible_ to send responses with invalid operation outputs. All\n  the service framework could do is log the validation errors.\n* Baking validation at the type-system level gets rid of an entire class of\n  logic errors.\n* Less idiomatic (this is subjective). The pattern of wrapping a more primitive\n  type to guarantee domain invariants is widespread in the Rust ecosystem. The\n  standard library makes use of it extensively.\n\nNote that _both_ designs are backwards incompatible in the sense that you can't\nmigrate from one to the other without breaking user code.\n\nUPDATE: We ended up implementing both designs, adding a flag to opt into the\nalternative design. Refer to the mentions of the `publicConstrainedTypes` flag\nin the description of the [Builders of builders PR][builders-of-builders].\n"
  },
  {
    "path": "design/src/rfcs/rfc0026_client_crate_organization.md",
    "content": "RFC: Client Crate Organization\n==============================\n\n> Status: Implemented\n>\n> Applies to: clients (and may impact servers due to shared codegen)\n\nThis RFC proposes changing the organization structure of the generated client crates to:\n\n1. Make discovery in the crate documentation easier.\n2. Facilitate re-exporting types from runtime crates in related modules without name collisions.\n3. Facilitate feature gating operations for faster compile times in the future.\n\nPrevious Organization\n---------------------\n\nPreviously, crates were organized as such:\n\n```text\n.\n├── client\n|   ├── fluent_builders\n|   |   └── <One fluent builder per operation>\n|   ├── Builder (*)\n|   └── Client\n├── config\n|   ├── retry\n|   |   ├── RetryConfig (*)\n|   |   ├── RetryConfigBuilder (*)\n|   |   └── RetryMode (*)\n|   ├── timeout\n|   |   ├── TimeoutConfig (*)\n|   |   └── TimeoutConfigBuilder (*)\n|   ├── AsyncSleep (*)\n|   ├── Builder\n|   ├── Config\n|   └── Sleep (*)\n├── error\n|   ├── <One module per error to contain a single struct named `Builder`>\n|   ├── <One struct per error named `${error}`>\n|   ├── <One struct per operation named `${operation}Error`>\n|   └── <One enum per operation named `${operation}ErrorKind`>\n├── http_body_checksum (empty)\n├── input\n|   ├── <One module per input to contain a single struct named `Builder`>\n|   └── <One struct per input named `${operation}Input`>\n├── lens (empty)\n├── middleware\n|   └── DefaultMiddleware\n├── model\n|   ├── <One module per shape to contain a single struct named `Builder`>\n|   └── <One struct per shape>\n├── operation\n|   ├── customize\n|   |   ├── ClassifyRetry (*)\n|   |   ├── CustomizableOperation\n|   |   ├── Operation (*)\n|   |   ├── RetryKind (*)\n|   └── <One struct per operation>\n├── output\n|   ├── <One module per output to contain a single struct named `Builder`>\n|   └── <One struct per output named `${operation}Input`>\n├── paginator\n|   ├── <One struct per paginated operation named `${operation}Paginator`>\n|   └── <Zero to one struct(s) per paginated operation named `${operation}PaginatorItems`>\n├── presigning\n|   ├── config\n|   |   ├── Builder\n|   |   ├── Error\n|   |   └── PresigningConfig\n|   └── request\n|       └── PresignedRequest\n├── types\n|   ├── AggregatedBytes (*)\n|   ├── Blob (*)\n|   ├── ByteStream (*)\n|   ├── DateTime (*)\n|   └── SdkError (*)\n├── AppName (*)\n├── Client\n├── Config\n├── Credentials (*)\n├── Endpoint (*)\n├── Error\n├── ErrorExt (for some services)\n├── PKG_VERSION\n└── Region (*)\n```\n\n`(*)` - signifies that a type is re-exported from one of the runtime crates\n\nProposed Changes\n----------------\n\nThis RFC proposes reorganizing types by operation first and foremost, and then rearranging\nother pieces to reduce codegen collision risk.\n\n### Establish a pattern for builder organization\n\nBuilders (distinct from fluent builders) are generated alongside all inputs, outputs, models, and errors.\nThey all follow the same overall pattern (where `shapeType` is `Input`, `Output`, or empty for models/errors):\n\n```text\n.\n└── module\n    ├── <One module per shape to contain a single struct named `Builder`>\n    └── <One struct per shape named `${prefix}${shapeType}`>\n```\n\nThis results in large lists of modules that all have exactly one item in them, which makes browsing\nthe documentation difficult, and introduces the possibility of name collisions when re-exporting modules\nfrom the runtime crates.\n\nBuilders should adopt a prefix and go into a single `builders` module, similar to how the fluent builders\ncurrently work:\n\n```text\n.\n├── module\n|   └── builders\n|       └── <One struct per shape named `${prefix}${shapeType}Builder`>\n└──---- <One struct per shape named `${prefix}${shapeType}`>\n```\n\n### Organize code generated types by operation\n\nAll code generated for an operation that isn't shared between operations will go into\noperation-specific modules. This includes inputs, outputs, errors, parsers, and paginators.\nTypes shared across operations will remain in another module (discussed below), and\nserialization/deserialization logic for those common types will also reside in that\ncommon location for now. If operation feature gating occurs in the future, further\noptimization can be done to track which of these are used by feature, or they can\nbe reorganized (this would be discussed in a future RFC and is out of scope here).\n\nWith code generated operations living in `crate::operation`, there is a high chance of name\ncollision with the `customize` module. To resolve this, `customize` will be moved into\n`crate::client`.\n\nThe new `crate::operation` module will look as follows:\n\n```text\n.\n└── operation\n    └── <One module per operation named after the operation in lower_snake_case>\n        ├── paginator\n        |   ├── `${operation}Paginator`\n        |   └── `${operation}PaginatorItems`\n        ├── builders\n        |   ├── `${operation}FluentBuilder`\n        |   ├── `${operation}InputBuilder`\n        |   └── `${operation}OutputBuilder`\n        ├── `${operation}Error`\n        ├── `${operation}Input`\n        ├── `${operation}Output`\n        └── `${operation}Parser` (private/doc hidden)\n```\n\n### Reorganize the crate root\n\nThe crate root should only host the most frequently used types, or phrased differently,\nthe types that are critical to making a service call with default configuration,\nor that are required for the most frequent config changes (such as setting credentials,\nor changing the region/endpoint).\n\nPreviously, the following were exported in root:\n```text\n.\n├── AppName\n├── Client\n├── Config\n├── Credentials\n├── Endpoint\n├── Error\n├── ErrorExt (for some services)\n├── PKG_VERSION\n└── Region\n```\n\nThe `AppName` is infrequently set, and will be moved into `crate::config`. Customers are encouraged\nto use `aws-config` crate to resolve credentials, region, and endpoint. Thus, these types no longer\nneed to be at the top-level, and will be moved into `crate::config`. `ErrorExt` will be moved into\n`crate::error`, but `Error` will stay in the crate root so that customers that alias the SDK crate\ncan easily reference it in their `Result`s:\n\n```rust,ignore\nuse aws_sdk_s3 as s3;\n\nfn some_function(/* ... */) -> Result<(), s3::Error> {\n    /* ... */\n}\n```\n\nThe `PKG_VERSION` should move into a new `meta` module, which can also include other values in the future\nsuch as the SHA-256 hash of the model used to produce the crate, or the version of smithy-rs that generated it.\n\n### Conditionally remove `Builder` from `crate::client`\n\nPreviously, the Smithy `Client` builder was re-exported alongside the SDK fluent `Client`\nso that non-SDK clients could easily customize the underlying Smithy client by using\nthe fluent client's `Client::with_config` function or `From<aws_smithy_client::client::Client<C, M, R>>`\ntrait implementation.\n\nThis makes sense for non-SDK clients where customization of the connector and middleware types is supported\ngenerically, but less sense for SDKs since the SDK clients are hardcoded to use `DynConnector` and `DynMiddleware`.\n\nThus, the Smithy client `Builder` should not be re-exported for SDKs.\n\n### Create a `primitives` module\n\nPreviously, `crate::types` held re-exported types from `aws-smithy-types` that are used\nby code generated structs/enums.\n\nThis module will be renamed to `crate::primitives` so that the name `types` can be\nrepurposed in the next section.\n\n### Repurpose the `types` module\n\nThe name `model` is meaningless outside the context of code generation (although there is precedent\nsince both the Java V2 and Kotlin SDKs use the term). Previously, this module held all the generated\nstructs/enums that are referenced by inputs, outputs, and errors.\n\nThis RFC proposes that this module be renamed to `types`, and that all code generated types\nfor shapes that are reused between operations (basically anything that is not an input, output,\nor error) be moved here. This would look as follows:\n\n```text\n.\n└── types\n    ├── error\n    |   ├── builders\n    |   |   └── <One struct per error named `${error}Builder`>\n    |   └── <One struct per error named `${error}`>\n    ├── builders\n    |   └── <One struct per shape named `${shape}Builder`>\n    └── <One struct per shape>\n```\n\nCustomers using the fluent builder should be able to just `use ${crate}::types::*;` to immediately\nget access to all the shared types needed by the operations they are calling.\n\nAdditionally, moving the top-level code generated error types into `crate::types` will eliminate a name\ncollision issue in the `crate::error` module.\n\n### Repurpose the original `crate::error` module\n\nThe `error` module is significantly smaller after all the code generated error types\nare moved out of it. This top-level module is now available for re-exports and utilities.\n\nThe following will be re-exported in `crate::error`:\n- `aws_smithy_http::result::SdkError`\n- `aws_smithy_types::error::display::DisplayErrorContext`\n\nFor crates that have an `ErrorExt`, it will also be moved into `crate::error`.\n\n### Flatten the `presigning` module\n\nThe `crate::presigning` module only has four members, so it should be flattened from:\n\n```text\n.\n└── presigning\n    ├── config\n    |   ├── Builder\n    |   ├── Error\n    |   └── PresigningConfig\n    └── request\n        └── PresignedRequest\n```\n\nto:\n\n```text\n.\n└── presigning\n    ├── PresigningConfigBuilder\n    ├── PresigningConfigError\n    ├── PresigningConfig\n    └── PresignedRequest\n```\n\nAt the same time, `Builder` and `Error` will be renamed to `PresigningConfigBuilder` and `PresigningConfigError`\nrespectively since these will rarely be referred to directly (preferring `PresigningConfig::builder()` instead; the\nerror will almost always be unwrapped).\n\n### Remove the empty modules\n\nThe `lens` and `http_body_checksum` modules have nothing inside them,\nand their documentation descriptions are not useful to customers:\n\n> `lens`: Generated accessors for nested fields\n\n> `http_body_checksum`: Functions for modifying requests and responses for the purposes of checksum validation\n\nThese modules hold private functions that are used by other generated code, and should just be made\nprivate or `#[doc(hidden)]` if necessary.\n\nNew Organization\n----------------\n\nAll combined, the following is the new publicly visible organization:\n\n```text\n.\n├── client\n|   ├── customize\n|   |   ├── ClassifyRetry (*)\n|   |   ├── CustomizableOperation\n|   |   ├── Operation (*)\n|   |   └── RetryKind (*)\n|   ├── Builder (only in non-SDK crates) (*)\n|   └── Client\n├── config\n|   ├── retry\n|   |   ├── RetryConfig (*)\n|   |   ├── RetryConfigBuilder (*)\n|   |   └── RetryMode (*)\n|   ├── timeout\n|   |   ├── TimeoutConfig (*)\n|   |   └── TimeoutConfigBuilder (*)\n|   ├── AppName (*)\n|   ├── AsyncSleep (*)\n|   ├── Builder\n|   ├── Config\n|   ├── Credentials (*)\n|   ├── Endpoint (*)\n|   ├── Region (*)\n|   └── Sleep (*)\n├── error\n|   ├── DisplayErrorContext (*)\n|   ├── ErrorExt (for some services)\n|   └── SdkError (*)\n├── meta\n|   └── PKG_VERSION\n├── middleware\n|   └── DefaultMiddleware\n├── operation\n|   └── <One module per operation named after the operation in lower_snake_case>\n|       ├── paginator\n|       |   ├── `${operation}Paginator`\n|       |   └── `${operation}PaginatorItems`\n|       ├── builders\n|       |   ├── `${operation}FluentBuilder`\n|       |   ├── `${operation}InputBuilder`\n|       |   └── `${operation}OutputBuilder`\n|       ├── `${operation}Error`\n|       ├── `${operation}Input`\n|       ├── `${operation}Output`\n|       └── `${operation}Parser` (private/doc hidden)\n├── presigning\n|   ├── PresigningConfigBuilder\n|   ├── PresigningConfigError\n|   ├── PresigningConfig\n|   └── PresignedRequest\n├── primitives\n|   ├── AggregatedBytes (*)\n|   ├── Blob (*)\n|   ├── ByteStream (*)\n|   └── DateTime (*)\n├── types\n|   ├── error\n|   |   ├── builders\n|   |   |   └── <One struct per error named `${error}Builder`>\n|   |   └── <One struct per error named `${error}`>\n|   ├── builders\n|   |   └── <One struct per shape named `${shape}Builder`>\n|   └── <One struct per shape>\n├── Client\n├── Config\n└── Error\n```\n\n`(*)` - signifies that a type is re-exported from one of the runtime crates\n\nChanges Checklist\n-----------------\n\n- [x] Move `crate::AppName` into `crate::config`\n- [x] Move `crate::PKG_VERSION` into a new `crate::meta` module\n- [x] Move `crate::Endpoint` into `crate::config`\n- [x] Move `crate::Credentials` into `crate::config`\n- [x] Move `crate::Region` into `crate::config`\n- [x] Move `crate::operation::customize` into `crate::client`\n- [x] Finish refactor to decouple client/server modules\n- [x] Organize code generated types by operation\n- [x] Reorganize builders\n- [x] Rename `crate::types` to `crate::primitives`\n- [x] Rename `crate::model` to `crate::types`\n- [x] Move `crate::error` into `crate::types`\n- [x] Only re-export `aws_smithy_client::client::Builder` for non-SDK clients (remove from SDK clients)\n- [x] Move `crate::ErrorExt` into `crate::error`\n- [x] Re-export `aws_smithy_types::error::display::DisplayErrorContext` and `aws_smithy_http::result::SdkError` in `crate::error`\n- [x] Move `crate::paginator` into `crate::operation`\n- [x] Flatten `crate::presigning`\n- [x] Hide or remove `crate::lens` and `crate::http_body_checksum`\n- [x] Move fluent builders into `crate::operation::x::builders`\n- [x] Remove/hide operation `ParseResponse` implementations in `crate::operation`\n- [x] Update \"Crate Organization\" top-level section in generated crate docs\n- [x] Update all module docs\n- [x] Break up modules/files so that they're not 30k lines of code\n  - [x] models/types; each struct/enum should probably get its own file with pub-use\n  - [x] models/types::builders: now this needs to get split up\n  - [x] `client.rs`\n- [x] Fix examples\n- [x] Write changelog\n"
  },
  {
    "path": "design/src/rfcs/rfc0027_endpoints_20.md",
    "content": "<!-- Give your RFC a descriptive name saying what it would accomplish or what feature it defines -->\nRFC: Endpoints 2.0\n=============\n\n<!-- RFCs start with the \"RFC\" status and are then either \"Implemented\" or \"Rejected\".  -->\n> Status: RFC\n\n<!-- A great RFC will include a list of changes at the bottom so that the implementor can be sure they haven't missed anything -->\nFor a summarized list of proposed changes, see the [Changes Checklist](#changes-checklist) section.\n\n<!-- Insert a short paragraph explaining, at a high level, what this RFC is for -->\nThis RFC defines how the Rust SDK will integrate with the next generation of endpoint resolution logic (Endpoints 2.0).\nEndpoints 2.0 defines a rules language for resolving endpoints. The Rust SDK will code-generate Rust code from this\nintermediate language and use this to create service-specific endpoint resolvers.\n\nEndpoints 2.0 will be a core feature and be available for generic clients as well as the AWS SDK.\n\n<!-- The \"Terminology\" section is optional but is really useful for defining the technical terms you're using in the RFC -->\nTerminology\n-----------\n\n- **Generic client**: In reference to features/code that is _not_ AWS specific and is supported for all Smithy clients.\n- **Rules language**: A JSON-based rules language used to resolve endpoints\n- [**Smithy Endpoint**](#the-endpoint-struct): An endpoint, as returned from the rules-language. This contains a URI,\n  headers, and configuration map of `String -> Document` (`properties`). This must\n  undergo [another level of transformation](#converting-a-smithy-endpoint-to-an-aws-endpoint) before it\n  can be used as an `AwsEndpoint`.\n- **AWS Endpoint**: An endpoint with explicit signing configuration applied. AWS Endpoints need to contain region &\n  service metadata to control signing.\n- **Middleware**: A transformation applied to a request, prior to request dispatch\n- **Endpoint Parameters**: A code-generated structure for each service which contains service-specific (and general)\n  endpoint parameters.\n\n<!-- Explain how users will use this new feature and, if necessary, how this compares to the current user experience -->\nThe user experience if this RFC is implemented\n----------------------------------------------\n\n### Overview\n\nSDKs will generate a new, public, `endpoint` module. The module will contain a [`Params`](#endpoint-params) structure\nand\na [`DefaultResolver`](#the-default-endpoint-resolver). Supporting these modules, a private `endpoints_impl` module will\nbe generated.\n> **Why generate two modules**?\n>\n> Generating two separate modules, `endpoint` and `endpoint_impl` ensures that we don't have namespace collisions\n> between hand-written and generated\n> code.\n\nSDK middleware will be updated to use the new [`smithy_types::Endpoint`](#the-endpoint-struct). During request\nconstruction in `make_operation`, a [smithy endpoint](#the-endpoint-struct) will be inserted into the property bag. The\nendpoint middleware will be updated to extract the Smithy endpoint from the property bag and set the request endpoint &\nsigning information accordingly (see: [Converting to AWS Endpoint](#converting-a-smithy-endpoint-to-an-aws-endpoint).\n\nThe following flow chart traces the endpoints 2.0 influence on a request via the green boxes.\n\n```mermaid\nflowchart TD\n    globalConfig(\"SDK global configuration (e.g. region provider, UseFIPS, etc.)\")\n\n    serviceConfig(\"Modeled, service specific configuration information (clientContextParams)\")\n\n    operationConfig(\"Operation-specific configuration (S3 Bucket, accountId, etc.)\")\n\n    getObject[\"S3::GetObject\"]\n\n    params[\"Create endpoint parameters\"]\n\n    evaluate[\"Evaluate ruleset\"]\n\n    rules[\"Generated Endpoint Ruleset for S3\"]\n\n    middleware[\"Apply endpoint & properties to request via endpoint middleware\"]\n\n\n\n    style getObject fill:green,stroke:#333,stroke-width:4px\n    style params fill:green,stroke:#333,stroke-width:4px\n    style evaluate fill:green,stroke:#333,stroke-width:4px\n    style middleware fill:green,stroke:#333,stroke-width:4px\n\n    getObject ==> params\n    globalConfig ---> params\n    operationConfig --> params\n    serviceConfig ---> params\n\n    rules --> evaluate\n    params --> evaluate\n    evaluate --> middleware\n```\n\n### Overriding Endpoints\n\nIn the general case, users will not be impacted by Endpoints 2.0 with one exception: today, users can provide a\nglobal endpoint provider that can override different services. There is a single `ResolveAwsEndpoint` trait that\nis shared across all services. However, this isn't the case for `Endpoints 2.0` where the trait actually has a generic\nparameter:\n\n```rust,ignore\npub trait ResolveEndpoint<T>: Send + Sync {\n    fn resolve_endpoint(&self, params: &T) -> Result<Endpoint, BoxError>;\n}\n```\n\nThe trait itself would then be parameterized by service-specific endpoint parameter, eg:\n`aws_sdk_s3::endpoint::Params`. The endpoint parameters we would use for S3 (e.g. including `Bucket`) are different\nfrom the endpoint parameters we might use for a service like DynamoDB which, today, doesn't have any custom endpoint\nbehavior.\n\nGoing forward we will to provide two different avenues for customers to customize endpoints:\n\n1. Configuration driven URL override. This mechanism hasn't been specified, but suppose that the Rust SDK supported\n   an `SDK_ENDPOINT` environment variable. This variable would be an input to the existing endpoint resolver.\n   machinery and would be backwards compatible with other SDKs (e.g. by prefixing the bucket as a host label for S3).\n2. Wholesale endpoint resolver override. In this case, customers would gain access to all endpoint parameters and be\n   able to write their own resolver.\n\nThis RFC proposes making the following changes:\n\n1. For the current _global_ ability to override an endpoint, instead of accepting an `AwsEndpoint`, accept a URI. This\n   will simplify the interface for most customers who don't actually need logic-driven endpoint construction. The\n   Endpoint that can be set will be passed in as the `SDK::Endpoint` built-in. This will be renamed to `endpoint_url`\n   for clarity. **All** AWS services **MUST** accept the `SDK::Endpoint` built-in.\n2. For complex, service-specific behavior, customers will be able to provide a service specific endpoint resolver at\n   client construction time. This resolver will be parameterized with the service-specific parameters type, (\n   eg. `aws_sdk_s3::endpoint::Params`). Finally, customers will be able to access the `default_resolver()` for AWS\n   services directly. This will enable them to utilize the default S3 endpoint resolver in their resolver\n   implementation.\n\n**Example: overriding the endpoint URI globally**\n\n```rust,ignore\nasync fn main() {\n    let sdk_conf = aws_config::from_env().endpoint_url(\"http://localhost:8123\").load().await;\n    let dynamo = aws_sdk_dynamodb::Client::new(&sdk_conf);\n    // snip ...\n}\n```\n\n**Example: overriding the endpoint resolver for a service**\n\n```rust,ignore\n/// Resolve to Localhost when an environment variable is set\nstruct CustomDdbResolver;\n\nimpl ResolveEndpoint<aws_sdk_dynamodb::endpoint::Params> for CustomDdbResolver {\n    fn resolve_endpoint(&self, params: &Params) -> Result<Endpoint, EndpointResolutionError> {\n        // custom resolver to redirect to DDB local if a flag is set\n        let base_endpoint = aws_sdk_dynamodb::endpoint::default_resolver().resolve_endpoint(params).expect(\"valid endpoint should be resolved\");\n        if env::var(\"LOCAL\") == Ok(\"true\") {\n            // update the URI on the returned endpoint to localhost while preserving the other properties\n            Ok(base_endpoint.builder().uri(\"http://localhost:8888\").build())\n        } else {\n            Ok(base_endpoint)\n        }\n    }\n}\n\nasync fn main() {\n    let conf = aws_config::load_from_env().await;\n    let ddb_conf = aws_sdk_dynamodb::config::Builder::from(&conf).endpoint_resolver(CustomDdbResolver);\n    let dynamodb = aws_sdk_dynamodb::Client::from_conf(ddb_conf);\n}\n```\n\nNote: for generic clients, they cannot use `endpoint_url`—this is because `endpoint_url` is dependent on rules and\ngeneric\nclients do not necessarily rules. However, they can use the `impl<T> ResolveEndpoint<T> for &'static str { ... }`\nimplementation.\n\n> **What about alternative S3 implementations? How do we say \"don't put prefix bucket on this?\"**\n>\n> For cases where users want to use the provided URL directly with no modification users will need to rely on service\n> specific configuration, like forcing path style addressing for S3.\n\n_Alternative Design_: [Context Aware Endpoint Trait](#context-aware-endpoint-traits)\n\n> _Optional addition_: We could add an additional `EndpointResolver` parameter to `SdkConfig` that exposed a global\n> trait\n> where `Params` is `&dyn Any` similar to [Context Aware Endpoint Trait](#context-aware-endpoint-traits). If these were\n**both** set, a runtime panic would alert users to the misconfiguration.\n\n### New Endpoint Traits\n\nThe new endpoint resolution trait and `Endpoint` struct will be available for generic clients. AWS endpoint middleware\nwill pull the `Endpoint` out of the property bag and read the properties to determine auth/signing + any other AWS\nmetadata that may be required.\n\nAn example of the `Endpoint` struct is below. This struct will be in `aws-smithy-types`, however, it should initially be\ngated with documentation warning about stability.\n\n#### The Endpoint Struct\n\n```rust,ignore\n// module: `aws_smithy_types::endpoint`\n// potential optimization to reduce / remove allocations for keys which are almost always static\n// this can also just be `String`\ntype MaybeStatic<T> = Cow<'static, T>;\n\n/// Endpoint\n#[derive(Debug, PartialEq)]\npub struct Endpoint {\n    // Note that this allows `Endpoint` to contain an invalid URI. During conversion to an actual endpoint, the\n    // the middleware can fail, returning a `ConstructionFailure` to the user\n    url: MaybeStatic<str>,\n    headers: HashMap<MaybeStatic<str>, Vec<MaybeStatic<str>>>,\n    properties: HashMap<MaybeStatic<str>, aws_smithy_types::Document>,\n}\n\n// not shown:\n// - impl block with standard accessors\n// - builder, designed to be invoked / used by generated code\n```\n\n> **What's an Endpoint property?**\n>\n> Endpoint properties, on their own, have no intrinsic meaning. Endpoint properties have established conventions for AWS\n> SDKs. Other Smithy implementors may choose a different pattern. For AWS SDKs, the `authSchemes` key is an ordered list\n> of authentication/signing schemes supported by the Endpoint that the SDK should use.\n\nTo perform produce an `Endpoint` struct we have a generic `ResolveEndpoint` trait which will be both generic in terms of\nparameters and being \"smithy-generic:\n\n```rust,ignore\n// module: `smithy_types::endpoint` or `aws_smithy_client`??\npub trait ResolveEndpoint<Params>: Send + Sync {\n    /// Resolves an `Endpoint` for `Params`\n    fn resolve_endpoint(&self, params: &Params) -> Result<aws_smithy_types::Endpoint, EndpointResolutionError>;\n}\n```\n\nAll Smithy services that have the `@endpointRuleSet` trait applied to the service shape will code generate a default\nendpoint resolver implementation. The default endpoint resolver **MUST** be public, so that customers can delegate to it\nif they wish to override the endpoint resolver.\n\n### Endpoint Params\n\nWe've mentioned \"service specific endpoint parameters\" a few times. In Endpoints 2.0, we will code generate Endpoint\nParameters for every service based on their rules. **Note**: the endpoint parameters themselves are generated solely\nfrom the ruleset. The Smithy model provides additional information about parameter binding, but that only influences how\nthe parameters are set, *not* how they are generated.\n\n**Example `Params` struct for S3:**\n\n```rust,ignore\n#[non_exhaustive]\n#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]\n/// Configuration parameters for resolving the correct endpoint\npub struct Params {\n    pub(crate) bucket: std::option::Option<std::string::String>,\n    pub(crate) region: std::option::Option<std::string::String>,\n    pub(crate) use_fips: bool,\n    pub(crate) use_dual_stack: bool,\n    pub(crate) endpoint: std::option::Option<std::string::String>,\n    pub(crate) force_path_style: std::option::Option<bool>,\n    pub(crate) accelerate: bool,\n    pub(crate) disable_access_points: std::option::Option<bool>,\n    pub(crate) disable_mrap: std::option::Option<bool>,\n}\n\nimpl Params {\n    /// Create a builder for [`Params`]\n    pub fn builder() -> crate::endpoint_resolver::Builder {\n        crate::endpoint_resolver::Builder::default()\n    }\n    /// Gets the value for bucket\n    pub fn bucket(&self) -> std::option::Option<&str> {\n        self.bucket.as_deref()\n    }\n    /// Gets the value for region\n    pub fn region(&self) -> std::option::Option<&str> {\n        self.region.as_deref()\n    }\n    /// Gets the value for use_fips\n    pub fn use_fips(&self) -> std::option::Option<bool> {\n        Some(self.use_fips)\n    }\n    /// Gets the value for use_dual_stack\n    pub fn use_dual_stack(&self) -> std::option::Option<bool> {\n        Some(self.use_dual_stack)\n    }\n    // ... more accessors\n}\n```\n\n### The default endpoint resolver\n\nWhen an endpoint ruleset is present, Smithy will code generate an endpoint resolver from that ruleset. The endpoint\nresolver\n**MUST** be a struct so that it can store/cache computations (such as a partition resolver that has compiled regexes).\n\n```rust,ignore\npub struct DefaultEndpointResolver {\n    partition_resolver: PartitionResolver\n}\n\nimpl ResolveEndpoint<crate::endpoint::Params> for DefaultEndpointResolver {\n    fn resolve_endpoint(&self, params: &Params) -> Result<aws_smithy_types::Endpoint, EndpointResolutionError> {\n        // delegate to private impl\n        crate::endpoints_impl::resolve_endpoint(params)\n    }\n}\n```\n\n`DefaultEndpointResolver` **MUST** be publicly accessible and offer both a default constructor and the ability to\nconfigure resolution behavior (e.g. by supporting adding additional partitions.)\n\n\nHow to actually implement this RFC\n----------------------------------\nTo describe how this feature will work, let's take a step-by-step path through endpoint resolution.\n\n1. A user defines a service client, possibly with some client specific configuration like region.\n\n   > `@clientContextParams` are code generated onto the client `Config`\n   . [Code generating `@clientContextParams`](#code-generating-client-context-params)\n\n2. A user invokes an operation like `s3::GetObject`. A [params object is created](#creating-params). In the body\n   of `make_operation()`, this is passed to `config.endpoint_resolver` to load a generic endpoint. The `Result` of the\n   of the endpoint resolution is written into the property bag.\n3. The generic smithy middleware (`SmithyEndpointStage`) sets the request endpoint.\n4. The AWS auth middleware (`AwsAuthStage`) reads the endpoint out of the property bag and applies signing overrides.\n5. The request is signed & dispatched\n\nThe other major piece of implementation required is actually implementing the rules engine. To learn more about\nrules-engine internals, skip to [implementing the rules engine](#implementing-the-rules-engine).\n\n### Code generating client context params\n\nWhen a smithy model uses the `@clientContextParams` trait, we need to generate client params onto the Rust SDK. This is\na **Smithy-native** feature. This should be implemented as a \"standard\" config decorator that reads traits from the\ncurrent model.\n\n<details>\n<summary>Kotlin Snippet for Client context params</summary>\n\n```kotlin\nclass ClientContextDecorator(ctx: ClientCodegenContext) : NamedSectionGenerator<ServiceConfig>() {\n    private val contextParams = ctx.serviceShape.getTrait<ClientContextParamsTrait>()?.parameters.orEmpty().toList()\n        .map { (key, value) -> ContextParam.fromClientParam(key, value, ctx.symbolProvider) }\n\n    data class ContextParam(val name: String, val type: Symbol, val docs: String?) {\n        companion object {\n            private fun toSymbol(shapeType: ShapeType, symbolProvider: RustSymbolProvider): Symbol =\n                symbolProvider.toSymbol(\n                    when (shapeType) {\n                        ShapeType.STRING -> StringShape.builder().id(\"smithy.api#String\").build()\n                        ShapeType.BOOLEAN -> BooleanShape.builder().id(\"smithy.api#Boolean\").build()\n                        else -> TODO(\"unsupported type\")\n                    }\n                )\n\n            fun fromClientParam(\n                name: String,\n                definition: ClientContextParamDefinition,\n                symbolProvider: RustSymbolProvider\n            ): ContextParam {\n                return ContextParam(\n                    RustReservedWords.escapeIfNeeded(name.toSnakeCase()),\n                    toSymbol(definition.type, symbolProvider),\n                    definition.documentation.orNull()\n                )\n            }\n        }\n    }\n\n    override fun section(section: ServiceConfig): Writable {\n        return when (section) {\n            is ServiceConfig.ConfigStruct -> writable {\n                contextParams.forEach { param ->\n                    rust(\"pub (crate) ${param.name}: #T,\", param.type.makeOptional())\n                }\n            }\n            ServiceConfig.ConfigImpl -> emptySection\n            ServiceConfig.BuilderStruct -> writable {\n                contextParams.forEach { param ->\n                    rust(\"${param.name}: #T,\", param.type.makeOptional())\n                }\n            }\n            ServiceConfig.BuilderImpl -> writable {\n                contextParams.forEach { param ->\n                    param.docs?.also { docs(it) }\n                    rust(\n                        \"\"\"\n                        pub fn ${param.name}(mut self, ${param.name}: #T) -> Self {\n                            self.${param.name} = Some(${param.name});\n                            self\n                        }\n                        \"\"\",\n                        param.type\n                    )\n                }\n            }\n            ServiceConfig.BuilderBuild -> writable {\n                contextParams.forEach { param ->\n                    rust(\"${param.name}: self.${param.name},\")\n                }\n            }\n            else -> emptySection\n        }\n    }\n}\n```\n\n</details>\n\n### Creating `Params`\n\n`Params` will be created and utilized in generic code generation.\n\n`make_operation()` needs to load the parameters from several configuration sources. These sources have a priority order.\nTo handle this priority order, we will load from all sources in reverse priority order, with lower priority sources\noverriding higher priority ones.\n\n<details>\n<summary>Implementation of operation decorator</summary>\n\n```kotlin\nclass EndpointParamsDecorator(\n    private val ctx: ClientCodegenContext,\n    private val operationShape: OperationShape,\n) : OperationCustomization() {\n    val idx = ContextIndex.of(ctx.model)\n    private val ruleset = EndpointRuleset.fromNode(ctx.serviceShape.expectTrait<EndpointRuleSetTrait>().ruleSet)\n\n    override fun section(section: OperationSection): Writable {\n        return when (section) {\n            is OperationSection.MutateInput -> writable {\n                rustTemplate(\n                    \"\"\"\n                    let params = #{Params}::builder()\n                        #{builder:W}.expect(\"invalid endpoint\");\n                    \"\"\",\n                    \"Params\" to EndpointParamsGenerator(ruleset).paramsStruct(),\n                    \"builder\" to builderFields(section)\n                )\n            }\n            is OperationSection.MutateRequest -> writable {\n                rust(\"// ${section.request}.properties_mut().insert(params);\")\n            }\n            else -> emptySection\n        }\n    }\n\n    private fun builderFields(section: OperationSection.MutateInput) = writable {\n        val memberParams = idx.getContextParams(operationShape)\n        val builtInParams = ruleset.parameters.toList().filter { it.isBuiltIn }\n        // first load builtins and their defaults\n        builtInParams.forEach { param ->\n            val defaultProviders = section.endpointCustomizations.mapNotNull { it.defaultFor(param, section.config) }\n            if (defaultProviders.size > 1) {\n                error(\"Multiple providers provided a value for the builtin $param\")\n            }\n            defaultProviders.firstOrNull()?.also { defaultValue ->\n                rust(\".set_${param.name.rustName()}(#W)\", defaultValue)\n            }\n        }\n        // these can be overridden with client context params\n        idx.getClientContextParams(ctx.serviceShape).forEach { (name, _param) ->\n            rust(\".set_${name.toSnakeCase()}(${section.config}.${name.toSnakeCase()}.as_ref())\")\n        }\n\n        // lastly, allow these to be overridden by members\n        memberParams.forEach { (memberShape, param) ->\n            rust(\".set_${param.name.toSnakeCase()}(${section.input}.${ctx.symbolProvider.toMemberName(memberShape)}.as_ref())\")\n        }\n        rust(\".build()\")\n    }\n}\n```\n\n</details>\n\n#### Loading values for builtIns\n\nThe fundamental point of builtIn values is enabling _other_ code generators to define where these values come from.\nBecause of that, we will need to expose the ability to customize AwsBuiltIns. One way to do this is with a new\ncustomization type, `EndpointCustomization`:\n\n```kotlin\nfun endpointCustomizations(\n    clientCodegenContext: C,\n    operation: OperationShape,\n    baseCustomizations: List<EndpointCustomization>\n): List<EndpointCustomization> = baseCustomizations\n\n\nabstract class EndpointCustomization {\n    abstract fun defaultFor(parameter: Parameter, config: String): Writable?\n}\n```\n\nCustomizations have the ability to specify the default value for a parameter. (Of course, these customizations need to\nbe wired in properly.)\n\n### Converting a Smithy Endpoint to an AWS Endpoint\n\nA Smithy endpoint has an untyped, string->`Document` collection of properties. We need to interpret these properties to\nhandle actually resolving an endpoint. As part of the `AwsAuthStage`, we load authentication schemes from the endpoint\nproperties and use these to configure signing on the request.\n\n**Note**: Authentication schemes are **NOT** required as part of an endpoint. When the auth schemes are not set, the\ndefault\nauthentication should be used. The Rust SDK will set `SigningRegion` and `SigningName` in the property bag by default\nas part of `make_operation`.\n\n### Implementing the rules engine\n\nThe Rust SDK code converts the rules into Rust code that will be compiled.\n\n<!-- Include a checklist of all the things that need to happen for this RFC's implementation to be considered complete -->\nChanges checklist\n-----------------\n**Rules Engine**\n\n- [x] Endpoint rules code generator\n- [x] Endpoint params code generator\n- [x] Endpoint tests code generator\n- [x] Implement ruleset standard library functions as inlineables. Note: pending future refactoring work, the `aws.`\n  functions will need to be integrated into the smithy core endpoint resolver.\n- [x] Implement partition function & ability to customize partitions\n  **SDK Integration**\n- [x] Add a Smithy endpoint resolver to the service config, with a default that loads the default endpoint resolver.\n- [x] Update `SdkConfig` to accept a URI instead of an implementation of `ResolveAwsEndpoint`. This change can be done\n  standalone.\n- [x] Remove/deprecate the `ResolveAwsEndpoint` trait and replace it with the vanilla Smithy trait. Potentially, provide\n  a bridge.\n- [x] Update `make_operation` to write a [`smithy::Endpoint`](#the-endpoint-struct) into the property bag\n- [x] Update AWS Endpoint middleware to work off of a [`smithy::Endpoint`](#the-endpoint-struct)\n- [x] Wire the endpoint override to the `SDK::Endpoint` builtIn parameter\n- [x] Remove the old smithy endpoint\n\nAlternative Designs\n-------------------\n\n### Context Aware Endpoint Traits\n\nAn alternative design that could provide more flexibility is a context-aware endpoint trait where the return type would\ngive context about the endpoint being returned. This would, for example, allow a customer to say explicitly \"don't\nmodify this endpoint\":\n\n```rust,ignore\nenum ContextualEndpoint {\n    /// Just the URI please. Pass it into the default endpoint resolver as a baseline\n    Uri { uri: Uri, immutable: bool },\n\n    /// A fully resolved, ready to rumble endpoint. Don't bother hitting the default endpoint resolver, just use what\n    /// I've got.\n    AwsEndpoint(AwsEndpoint)\n}\n\ntrait ResolveGlobalEndpoint {\n    fn resolve_endpoint(params: &dyn Any) -> Result<ContextualEndpoint, EndpointResolutionError>;\n}\n```\n\nService clients would then use `ResolveGlobalEndpoint`, optional specified from `SdkConfig` to perform routing\ndecisions.\n"
  },
  {
    "path": "design/src/rfcs/rfc0028_sdk_credential_cache_type_safety.md",
    "content": "RFC: SDK Credential Cache Type Safety\n=====================================\n\n> Status: Implemented in [smithy-rs#2122](https://github.com/smithy-lang/smithy-rs/pull/2122)\n>\n> Applies to: AWS SDK for Rust\n\nAt time of writing (2022-10-11), the SDK's credentials provider can be customized by providing:\n\n1. A profile credentials file to modify the default provider chain\n2. An instance of one of the credentials providers implemented in `aws-config`, such as\n   the `AssumeRoleCredentialsProvider`, `ImdsCredentialsProvider`, and so on.\n3. A custom struct that implements the `ProvideCredentials`\n\nThe problem this RFC examines is that when options 2 and 3 above are exercised, the customer\nneeds to be aware of credentials caching and put additional effort to ensure caching is set up\ncorrectly (and that double caching doesn't occur). This is especially difficult to get right\nsince some built-in credentials providers (such as `AssumeRoleCredentialsProvider`) already\nhave caching, while most others do not and need to be wrapped in `LazyCachingCredentialsProvider`.\n\nThe goal of this RFC is to create an API where Rust's type system ensures caching is set up\ncorrectly, or explicitly opted out of.\n\n`CredentialsCache` and `ConfigLoader::credentials_cache`\n--------------------------------------------------------\n\nA new config method named `credentials_cache()` will be added to `ConfigLoader` and the\ngenerated service `Config` builders that takes a `CredentialsCache` instance. This `CredentialsCache`\nwill be a struct with several functions on it to create and configure the cache.\n\nClient creation will ultimately be responsible for taking this `CredentialsCache` instance\nand wrapping the given (or default) credentials provider.\n\nThe `CredentialsCache` would look as follows:\n\n```rust,ignore\nenum Inner {\n    Lazy(LazyConfig),\n    // Eager doesn't exist today, so this is purely for illustration\n    Eager(EagerConfig),\n    // Custom may not be implemented right away\n    // Not naming or specifying the custom cache trait for now since its out of scope\n    Custom(Box<dyn SomeCacheTrait>),\n\n    NoCaching,\n}\npub struct CredentialsCache {\n    inner: Inner,\n}\n\nimpl CredentialsCache {\n    // These methods use default cache settings\n    pub fn lazy() -> Self { /* ... */ }\n    pub fn eager() -> Self { /* ... */ }\n\n    // Unprefixed methods return a builder that can take customizations\n    pub fn lazy_builder() -> LazyBuilder { /* ... */ }\n    pub fn eager_builder() -> EagerBuilder { /* ... */ }\n\n    // Later, when custom implementations are supported\n    pub fn custom(cache_impl: Box<dyn SomeCacheTrait>) -> Self { /* ... */ }\n\n    pub(crate) fn create_cache(\n        self,\n        provider: Box<dyn ProvideCredentials>,\n        sleep_impl: Arc<dyn AsyncSleep>\n    ) -> SharedCredentialsProvider {\n        // Note: SharedCredentialsProvider would get renamed to SharedCredentialsCache.\n        // This code is using the old name to make it clearer that it already exists,\n        // and the rename is called out in the change checklist.\n        SharedCredentialsProvider::new(\n            match self {\n                Self::Lazy(inner) => LazyCachingCredentialsProvider::new(provider, settings.time, /* ... */),\n                Self::Eager(_inner) => unimplemented!(),\n                Self::Custom(_custom) => unimplemented!(),\n                Self::NoCaching => unimplemented!(),\n            }\n        )\n    }\n}\n```\n\nUsing a struct over a trait prevents custom caching implementations, but if customization is desired,\na `Custom` variant could be added to the inner enum that has its own trait that customers implement.\n\nThe `SharedCredentialsProvider` needs to be updated to take a cache implementation in addition to\nthe `impl ProvideCredentials + 'static`. A sealed trait could be added to facilitate this.\n\nCustomers that don't care about credential caching can configure credential providers\nwithout needing to think about it:\n\n```rust,ignore\nlet sdk_config = aws_config::from_env()\n    .credentials_provider(ImdsCredentialsProvider::builder().build())\n    .load()\n    .await;\n```\n\nHowever, if they want to customize the caching, they can do so without modifying\nthe credentials provider at all (in case they want to use the default):\n\n```rust,ignore\nlet sdk_config = aws_config::from_env()\n    .credentials_cache(CredentialsCache::default_eager())\n    .load()\n    .await;\n```\n\nThe `credentials_cache` will default to `CredentialsCache::default_lazy()` if not provided.\n\nChanges Checklist\n-----------------\n\n- [ ] Remove cache from `AssumeRoleProvider`\n- [ ] Implement `CredentialsCache` with its `Lazy` variant and builder\n- [ ] Add `credentials_cache` method to `ConfigLoader`\n- [ ] Refactor `ConfigLoader` to take `CredentialsCache` instead of `impl ProvideCredentials + 'static`\n- [ ] Refactor `SharedCredentialsProvider` to take a cache implementation in addition to an `impl ProvideCredentials + 'static`\n- [ ] Remove `ProvideCredentials` impl from `LazyCachingCredentialsProvider`\n- [ ] Rename `LazyCachingCredentialsProvider` -> `LazyCredentialsCache`\n- [ ] Refactor the SDK `Config` code generator to be consistent with `ConfigLoader`\n- [ ] Write changelog upgrade instructions\n- [ ] Fix examples (if there are any for configuring caching)\n\nAppendix: Alternatives Considered\n---------------------------------\n\n### Alternative A: `ProvideCachedCredentials` trait\n\nIn this alternative, `aws-types` has a `ProvideCachedCredentials` in addition to `ProvideCredentials`.\nAll individual credential providers (such as `ImdsCredentialsProvider`) implement `ProvideCredentials`,\nwhile credential caches (such as `LazyCachingCredentialsProvider`) implement the `ProvideCachedCredentials`.\nThe `ConfigLoader` would only take `impl ProvideCachedCredentials`.\n\nThis allows customers to provide their own caching solution by implementing `ProvideCachedCredentials`,\nwhile requiring that caching be done correctly through the type system since `ProvideCredentials` is\nonly useful inside the implementation of `ProvideCachedCredentials`.\n\nCaching can be opted out by creating a `NoCacheCredentialsProvider` that implements `ProvideCachedCredentials`\nwithout any caching logic, although this wouldn't be recommended and this provider wouldn't be vended\nin `aws-config`.\n\nExample configuration:\n```rust,ignore\n// Compiles\nlet sdk_config = aws_config::from_env()\n    .credentials(\n        LazyCachingCredentialsProvider::builder()\n            .load(ImdsCredentialsProvider::new())\n            .build()\n    )\n    .load()\n    .await;\n\n// Doesn't compile\nlet sdk_config = aws_config::from_env()\n    // Wrong type: doesn't implement `ProvideCachedCredentials`\n    .credentials(ImdsCredentialsProvider::new())\n    .load()\n    .await;\n```\n\nAnother method could be added to `ConfigLoader` that makes it easier to use the default cache:\n\n```rust,ignore\nlet sdk_config = aws_config::from_env()\n    .credentials_with_default_cache(ImdsCredentialsProvider::new())\n    .load()\n    .await;\n```\n\n#### Pros/cons\n\n- :+1: It's flexible, and somewhat enforces correct cache setup through types.\n- :+1: Removes the possibility of double caching since the cache implementations won't\n  implement `ProvideCredentials`.\n- :-1: Customers may unintentionally implement `ProvideCachedCredentials` instead of `ProvideCredentials`\n  for a custom provider, and then not realize they're not benefiting from caching.\n- :-1: The documentation needs to make it very clear what the differences are between `ProvideCredentials`\n  and `ProvideCachedCredentials` since they will look identical.\n- :-1: It's possible to implement both `ProvideCachedCredentials` and `ProvideCredentials`, which\n  breaks the type safety goals.\n\n### Alternative B: `CacheCredentials` trait\n\nThis alternative is similar to alternative A, except that the cache trait is distinct from `ProvideCredentials` so\nthat it's more apparent when mistakenly implementing the wrong trait for a custom credentials provider.\n\nA `CacheCredentials` trait would be added that looks as follows:\n```rust,ignore\npub trait CacheCredentials: Send + Sync + Debug {\n    async fn cached(&self, now: SystemTime) -> Result<Credentials, CredentialsError>;\n}\n```\n\nInstances implementing `CacheCredentials` need to own the `ProvideCredentials` implementation\nto make both lazy and eager credentials caching possible.\n\nThe configuration examples look identical to Option A.\n\n#### Pros/cons\n\n- :+1: It's flexible, and enforces correct cache setup through types slightly better than Option A.\n- :+1: Removes the possibility of double caching since the cache implementations won't\n  implement `ProvideCredentials`.\n- :-1: Customers can still unintentionally implement the wrong trait and miss out on caching when\n  creating custom credentials providers, but it will be more apparent than in Option A.\n- :-1: It's possible to implement both `CacheCredentials` and `ProvideCredentials`, which\n  breaks the type safety goals.\n\n### Alternative C: `CredentialsCache` struct with composition\n\nThe struct approach posits that customers don't need or want to implement custom credential caching,\nbut at the same time, doesn't make it impossible to add custom caching later.\n\nThe idea is that there would be a struct called `CredentialsCache` that specifies the desired\ncaching approach for a given credentials provider:\n\n```rust,ignore\npub struct LazyCache {\n    credentials_provider: Arc<dyn ProvideCredentials>,\n    // ...\n}\n\npub struct EagerCache {\n    credentials_provider: Arc<dyn ProvideCredentials>,\n    // ...\n}\n\npub struct CustomCache {\n    credentials_provider: Arc<dyn ProvideCredentials>,\n    // Not naming or specifying the custom cache trait for now since its out of scope\n    cache: Arc<dyn SomeCacheTrait>\n}\n\nenum CredentialsCacheInner {\n    Lazy(LazyCache),\n    // Eager doesn't exist today, so this is purely for illustration\n    Eager(EagerCache),\n    // Custom may not be implemented right away\n    Custom(CustomCache),\n}\n\npub struct CredentialsCache {\n    inner: CredentialsCacheInner,\n}\n\nimpl CredentialsCache {\n    // Methods prefixed with `default_` just use the default cache settings\n    pub fn default_lazy(provider: impl ProvideCredentials + 'static) -> Self { /* ... */ }\n    pub fn default_eager(provider: impl ProvideCredentials + 'static) -> Self { /* ... */ }\n\n    // Unprefixed methods return a builder that can take customizations\n    pub fn lazy(provider: impl ProvideCredentials + 'static) -> LazyBuilder { /* ... */ }\n    pub fn eager(provider: impl ProvideCredentials + 'static) -> EagerBuilder { /* ... */ }\n\n    pub(crate) fn create_cache(\n        self,\n        sleep_impl: Arc<dyn AsyncSleep>\n    ) -> SharedCredentialsProvider {\n        // ^ Note: SharedCredentialsProvider would get renamed to SharedCredentialsCache.\n        // This code is using the old name to make it clearer that it already exists,\n        // and the rename is called out in the change checklist.\n        SharedCredentialsProvider::new(\n            match self {\n                Self::Lazy(inner) => LazyCachingCredentialsProvider::new(inner.credentials_provider, settings.time, /* ... */),\n                Self::Eager(_inner) => unimplemented!(),\n                Self::Custom(_custom) => unimplemented!(),\n            }\n        )\n    }\n}\n```\n\nUsing a struct over a trait prevents custom caching implementations, but if customization is desired,\na `Custom` variant could be added to the inner enum that has its own trait that customers implement.\n\nThe `SharedCredentialsProvider` needs to be updated to take a cache implementation rather\nthan `impl ProvideCredentials + 'static`. A sealed trait could be added to facilitate this.\n\nConfiguration would look as follows:\n\n```rust,ignore\nlet sdk_config = aws_config::from_env()\n    .credentials(CredentialsCache::default_lazy(ImdsCredentialsProvider::builder().build()))\n    .load()\n    .await;\n```\n\nThe `credentials_provider` method on `ConfigLoader` would only take `CredentialsCache` as an argument\nso that the SDK could not be configured without credentials caching, or if opting out of caching becomes\na use case, then a `CredentialsCache::NoCache` variant could be made.\n\nLike alternative A, a convenience method can be added to make using the default cache easier:\n\n```rust,ignore\nlet sdk_config = aws_config::from_env()\n    .credentials_with_default_cache(ImdsCredentialsProvider::builder().build())\n    .load()\n    .await;\n```\n\nIn the future if custom caching is added, it would look as follows:\n\n```rust,ignore\nlet sdk_config = aws_config::from_env()\n    .credentials(\n        CredentialsCache::custom(ImdsCredentialsProvider::builder().build(), MyCache::new())\n    )\n    .load()\n    .await;\n```\n\nThe `ConfigLoader` wouldn't be able to immediately set its credentials provider since other values\nfrom the config are needed to construct the cache (such as `sleep_impl`). Thus, the `credentials`\nsetter would merely save off the `CredentialsCache` instance, and then when `load` is called,\nthe complete `SharedCredentialsProvider` would be constructed:\n\n```rust,ignore\npub async fn load(self) -> SdkConfig {\n    // ...\n    let credentials_provider = self.credentials_cache.create_cache(sleep_impl);\n    // ...\n}\n```\n\n#### Pros/cons\n\n- :+1: Removes the possibility of missing out on caching when implementing a custom provider.\n- :+1: Removes the possibility of double caching since the cache implementations won't\n  implement `ProvideCredentials`.\n- :-1: Requires thinking about caching when only wanting to customize the credentials provider\n- :-1: Requires a lot of boilerplate in `aws-config` for the builders, enum variant structs, etc.\n"
  },
  {
    "path": "design/src/rfcs/rfc0029_new_home_for_cred_types.md",
    "content": "RFC: Finding New Home for Credential Types\n===================================================\n\n> Status: Implemented in [smithy-rs#2108](https://github.com/smithy-lang/smithy-rs/pull/2108)\n>\n> Applies to: clients\n\nThis RFC supplements [RFC 28](https://github.com/smithy-lang/smithy-rs/blob/main/design/src/rfcs/rfc0028_sdk_credential_cache_type_safety.md) and discusses for the selected design where to place the types for credentials providers, credentials caching, and everything else that comes with them.\n\nIt is assumed that the primary motivation behind the introduction of type safe credentials caching remains the same as the preceding RFC.\n\nAssumptions\n-----------\nThis document assumes that the following items in the changes checklist in the preceding RFC have been implemented:\n- [x] Implement `CredentialsCache` with its `Lazy` variant and builder\n- [x] Add the `credentials_cache` method to `ConfigLoader`\n- [x] Rename `SharedCredentialsProvider` to `SharedCredentialsCache`\n- [x] Remove `ProvideCredentials` impl from `LazyCachingCredentialsProvider`\n- [x] Rename `LazyCachingCredentialsProvider` -> `LazyCredentialsCache`\n- [x] Refactor the SDK `Config` code generator to be consistent with `ConfigLoader`\n\nProblems\n--------\nHere is how our attempt to implement the selected design in the preceding RFC can lead to an obstacle. Consider this code snippet we are planning to support:\n\n```rust,ignore\nlet sdk_config = aws_config::from_env()\n    .credentials_cache(CredentialsCache::lazy())\n    .load()\n    .await;\n\nlet client = aws_sdk_s3::Client::new(&sdk_config);\n```\n\nA `CredentialsCache` created by `CredentialsCache::lazy()` above will internally go through three crates before the variable `client` has been created:\n1. `aws-config`: after it has been passed to `aws_config::ConfigLoader::credentials_cache`\n```rust,ignore\n// in lib.rs\n\nimpl ConfigLoader {\n    // --snip--\n    pub fn credentials_cache(mut self, credentials_cache: CredentialsCache) -> Self {\n        self.credentials_cache = Some(credentials_cache);\n        self\n    }\n    // --snip--\n}\n```\n2. `aws-types`: after `aws_config::ConfigLoader::load` has passed it to `aws_types::sdk_config::Builder::credentials_cache`\n```rust,ignore\n// in sdk_config.rs\n\nimpl Builder {\n    // --snip--\n    pub fn credentials_cache(mut self, cache: CredentialsCache) -> Self {\n        self.set_credentials_cache(Some(cache));\n        self\n    }\n    // --snip--\n}\n```\n3. `aws-sdk-s3`: after `aws_sdk_s3::Client::new` has been called with the variable `sdk_config`\n```rust,ignore\n// in client.rs\n\nimpl Client {\n    // --snip--\n    pub fn new(sdk_config: &aws_types::sdk_config::SdkConfig) -> Self {\n        Self::from_conf(sdk_config.into())\n    }\n    // --snip--\n}\n```\ncalls\n```rust,ignore\n// in config.rs\n\nimpl From<&aws_types::sdk_config::SdkConfig> for Builder {\n    fn from(input: &aws_types::sdk_config::SdkConfig) -> Self {\n        let mut builder = Builder::default();\n        builder = builder.region(input.region().cloned());\n        builder.set_endpoint_resolver(input.endpoint_resolver().clone());\n        builder.set_retry_config(input.retry_config().cloned());\n        builder.set_timeout_config(input.timeout_config().cloned());\n        builder.set_sleep_impl(input.sleep_impl());\n\tbuilder.set_credentials_cache(input.credentials_cache().cloned());\n        builder.set_credentials_provider(input.credentials_provider().cloned());\n        builder.set_app_name(input.app_name().cloned());\n        builder.set_http_connector(input.http_connector().cloned());\n        builder\n    }\n}\n\nimpl From<&aws_types::sdk_config::SdkConfig> for Config {\n    fn from(sdk_config: &aws_types::sdk_config::SdkConfig) -> Self {\n        Builder::from(sdk_config).build()\n    }\n}\n```\nWhat this all means is that `CredentialsCache` needs to be accessible from `aws-config`, `aws-types`, and `aws-sdk-s3` (SDK client crates, to be more generic). We originally assumed that `CredentialsCache` would be defined in `aws-config` along with `LazyCredentialsCache`, but the assumption no longer holds because `aws-types` and `aws-sdk-s3` do not depend upon `aws-config`.\n\nTherefore, we need to find a new place in which to create credentials caches accessible from the aforementioned crates.\n\nProposed Solution\n-----------------\nWe propose to move the following items to a new crate called `aws-credential-types`:\n- All items in `aws_types::credentials` and their dependencies\n- All items in `aws_config::meta::credentials` and their dependencies\n\nFor the first bullet point, we move types and traits associated with credentials out of `aws-types`. Crucially, the `ProvideCredentials` trait now lives in `aws-credential-types`.\n\nFor the second bullet point, we move the items related to credentials caching. `CredentialsCache` with its `Lazy` variant and builder lives in `aws-credential-types` and `CredentialsCache::create_cache` will be marked as `pub`. One area where we make an adjustment, though, is that `LazyCredentialsCache` depends on `aws_types::os_shim_internal::TimeSource` so we need to move `TimeSource` into `aws-credentials-types` as well.\n\nA result of the above arrangement will give us the following module dependencies (only showing what's relevant):\n<p align=\"center\">\n  <img width=\"800\" alt=\"Selected design\" src=\"https://user-images.githubusercontent.com/15333866/207222687-8dd2430c-2865-4161-85bc-ee1410040d38.png\">\n<p>\n\n- :+1: `aws_types::sdk_config::Builder` and a service client `config::Builder` can create a `SharedCredentialsCache` with a concrete type of credentials cache.\n- :+1: It avoids cyclic crate dependencies.\n- :-1: There is one more AWS runtime crate to maintain and version.\n\nRejected Alternative\n--------------\nAn alternative design is to move the following items to a separate crate (tentatively called `aws-XXX`):\n- All items in `aws_types::sdk_config`, i.e. `SdkConfig` and its builder\n- All items in `aws_types::credentials` and their dependencies\n- All items in `aws_config::meta::credentials` and their dependencies\n\nThe reason for the first bullet point is that the builder needs to be somewhere it has access to the credentials caching factory function, `CredentialsCache::create_cache`. The factory function is in `aws-XXX` and if the builder stayed in `aws-types`, it would cause a cyclic dependency between those two crates.\n\nA result of the above arrangement will give us the following module dependencies:\n<p align=\"center\">\n  <img width=\"800\" alt=\"Option A\" src=\"https://user-images.githubusercontent.com/15333866/206587781-6eca3662-5096-408d-a435-d4023929e727.png\">\n</p>\n\nWe have dismissed this design mainly because we try moving out of the `aws-types` create as little as possible. Another downside is that `SdkConfig` sitting together with the items for credentials provider & caching does not give us a coherent mental model for the `aws-XXX` crate, making it difficult to choose the right name for `XXX`.\n\nChanges Checklist\n-----------------\nThe following list does not repeat what is listed in the preceding RFC but does include those new mentioned in the `Assumptions` section:\n\n- [ ] Create `aws-credential-types`\n- [ ] Move all items in `aws_types::credentials` and their dependencies to the `aws-credential-types` crate\n- [ ] Move all items in `aws_config::meta::credentials` and their dependencies to the `aws-credential-types` crate\n- [ ] Update use statements and fully qualified names in the affected places\n"
  },
  {
    "path": "design/src/rfcs/rfc0030_serialization_and_deserialization.md",
    "content": "RFC: Serialization and Deserialization\n=============\n\n> Status: RFC\n>\n> Applies to: Output, Input, and Builder types as well as `DateTime`, `Document`, `Blob`, and `Number` implemented in `aws_smithy_types` crate.\n\n# Terminology\n- Builder\n Refers to data types prefixed with `Builder`, which converts itself into a corresponding data type upon being built. e.g. `aws_sdk_dynamodb::input::PutItemInput`.\n- serde\n  Refers to `serde` crate.\n- `Serialize`\n  Refers to `Serialize` trait avaialble on `serde` crate.\n- `Deserialize`\n  Refers to `Deserialize` trait available on `serde` crate.\n\n\n# Overview\nWe are going to implement Serialize and Deserialize traits from `serde` crate to some data types.\nData types that are going to be affected are;\n- builder data types\n- operation `Input` types\n- operation `Output` types\n- data types that builder types may have on their field(s)\n- `aws_smithy_types::DateTime`\n- `aws_smithy_types::Document`\n- `aws_smithy_types::Blob`\n- `aws_smithy_types::Number`\n\n`DateTime` and `Blob` implements different serialization/deserialization format for human-readable and non-human readable format; We must emphasize that these 2 formats are not compatible with each other. The reason for this is explained in the [Blob](#blob) section and [Date Time](#datetime).\n\nAdditionally, we add `fn set_fields` to fluent builders to allow users to set the data they deserialized to fluent builders.\n\nLastly, we emphasize that this RFC does NOT aim to serialize the entire response or request or implement `serde` traits on data types for server-side code.\n\n# Use Case\nUsers have requested `serde` traits to be implemented on data types implemented in rust SDK.\nWe have created this RFC with the following use cases in mind.\n1. [[request]: Serialize/Deserialize of models for Lambda events #269](https://github.com/awslabs/aws-sdk-rust/issues/269)\n2. [Tests](https://smithy-lang.github.io/smithy-rs/design/faq.html#why-dont-the-sdk-service-crates-implement-serdeserialize-or-serdedeserialize-for-any-types) as suggested in the design FAQ.\n3. Building tools\n\n# Feature Gate\n\n## Enabling Feature\nTo enable any of the features from this RFC, user must pass `--cfg aws-sdk-unstable` to rustc.\n\nYou can do this by specifying it on env-variable or by config.toml.\n\n- specifying it on .cargo/config.toml\n\n```toml\n[build]\nrustflags = [\"--cfg\", \"aws-sdk-unstable\"]\n```\n\n- As an environment variable\n\n```bash\nexport RUSTFLAGS=\"--cfg aws-sdk-unstable\"\ncargo build\n```\n\nWe considered allowing users to enable this feature on a crate-level.\n\ne.g.\n```toml\n[dependencies]\naws_sdk_dynamodb = { version = \"0.22.0\", features = [\"unstable\", \"serialize\"] }\n```\n\nCompared to the cfg approach, it is lot easier for the users to enable this feature.\nHowever, we believe that cfg approach ensure users won't enable this feature by surprise, and communicate to users that features behind this feature gate can be taken-away or exprience breaking changes any time in future.\n\n## Feature Gate for Serialization and De-serialization\n`Serde` traits are implemented behind feature gates.\n`Serialize` is implemented behind `serde-serialize`, while `Deserialize` is implemented behind `serde-deserialize`.\nUsers must enable the `unstable` feature to expose those features.\n\nWe considered giving each feature a dedicated feature gate such as `unstable-serde-serialize`.\nIn this case, we will need to change the name of feature gates entirely once it leaves the unstable status which will cause users to make changes to their code base.\nWe conclude that this brings no benefit to the users.\n\nFurthermore, we considered naming the fature-gate `serialize`/`deserialize`.\nHowever, this way it would be confusing for the users when we add support for different serialization/deserialization framework such as `deser`.\nThus, to emphasize that the traits is from `serde` crate, we decided to name it `serde-serialize`/`serde-deserialize`\n\n## Keeping both features behind the same feature gate\nWe considered keeping both features behind the same feature gate.\nThere is no significant difference in the complexity of implementation.\nWe do not see any benefit in keeping them behind the same feature gate as this will only increase compile time when users do not need one of the features.\n\n## Different feature gates for different data types\nWe considered implementing different feature gates for output, input, and their corresponding data types.\nFor example, output and input types can have `output-serde-*` and `input-serde-*`.\nWe are unable to do this as relevant metadata is not available during the code-gen.\n\n\n# Implementation\n## Smithy Types\n`aws_smithy_types` is a crate that implements smithy's data types.\nThese data types must implement serde traits as well since SDK uses the data types.\n\n### Blob\n`Serialize` and `Deserialize` is not implemented with derive macro.\n\nIn human-readable format, `Blob` is serialized as a base64 encoded string and any data to be deserialized as this data type must be encoded in base 64.\nEncoding must be carried out by `base64::encode` function available from `aws_smithy_types` crate.\nNon-human readable format serializes `Blob` with `fn serialize_bytes`.\n\n- Reason behind the implementation of human-readable format\n\n`aws_smithy_types` crate comes with functions for encoding/decoding base 64, which makes the implementation simpler.\nAdditionally, AWS CLI and AWS SDK for other languages require data to be encoded in base 64 when it requires `Blob` type as input.\n\nWe also considered serializing them with `serialize_bytes`, without encoding them with `serialize_bytes`.\nIn this case, the implementation will depend on the implementation of the library author.\n\nThere are many different crates, so we decided to survey how some of the most popular crates implement this feature.\n\n| library    | version | implementation  | all-time downloads on crate.io as of writing (Dec 2022) |\n| ---------- | ------- | --------------- | -------------------------------------------------------- |\n| serde_json | 1.0     | Array of number | 109,491,713                                              |\n| toml       | 0.5.9   | Array of number | 63,601,994                                               |\n| serde_yaml | 0.9.14  | Unsupported     | 23,767,300                                               |\n\nFirst of all, bytes could have hundreds of elements; reading an array of hundreds of numbers will never be a pleasing experience, and it is especially troubling when you are writing data for test cases.\nAdditionally, it has come to our attention that some crates just doesn't support it, which would hinder users' ability to be productive and tie users' hand.\n\nFor the reasons described above, we believe that it is crucial to encode them to string and base64 is favourable over other encoding schemes such as base 16, 32, or Ascii85.\n\n- Reason behind the implementation of a non-human readable format\nWe considered using the same logic for non-human readable format as well.\nHowever, readable-ness is not necessary for non-human readable format.\nAdditionally, non-human readable format tends to emphasize resource efficiency over human-readable format; Base64 encoded string would take up more space, which is not what the users would want.\n\nThus, we believe that implementing a tailored serialization logic would be beneficial to the users.\n\n\n### DateTime\n`Serialize` and `Deserialize` is not implemented with derive macro.\nFor human-readable format, `DateTime` is serialized in RFC-3339 format;\nIt expects the value to be in RFC-3339 format when it is Deserialized.\n\nNon-human readable implements `DateTime` as a tuple of `u32` and `i64`; the latter corresponds to `seconds` field and the first is the `seubsecond_nanos`.\n\n- Reason behind the implementation of a human-readable format\n\nFor serialization, `DateTime` format already implements a function to encode itself into RFC-3339 format.\nFor deserialization, it is possible to accept other formats, we can add this later if we find it reasonable.\n\n- Reason behind the implementation of a non-human readable format\n\nSerializing them as tuples of two integers results in a smaller data size and requires less computing power than any string-based format.\nTuple will be smaller in size as it does not require tagging like in maps.\n\n### Document\n`Serialize` and `Deserialize` is implemented with derive macro.\nAdditionally, it implements container attribute `#[serde(untagged)]`.\nSerde can distinguish each variant without tagging thanks to the difference in each variant's datatypes.\n\n### Number\n`Serialize` and `Deserialize` is implemented with derive macro.\nAdditionally, it implements container attribute `#[serde(untagged)]`.\n\nSerde can distinguish each variant without a tag as each variant's content is different.\n\n## Builder Types and Non-Builder Types\nBuilder types and non Builder types implement `Serialize` and `Deserialize` with derive macro.\n\nExample:\n```rust,ignore\n#[cfg_attr(\n    all(aws-sdk-unstable, feature = \"serialize\"),\n    derive(serde::Serialize)\n)]\n#[cfg_attr(\n    all(aws-sdk-unstable, feature = \"deserialize\"),\n    derive(serde::Deserialize)\n)]\n#[non_exhaustive]\n#[derive(std::clone::Clone, std::cmp::PartialEq)]\npub struct UploadPartCopyOutput {\n  ...\n}\n```\n\n## Enum Representation\n`serde` allows programmers to use one of four different tagging ([internal, external, adjacent, and untagged](https://serde.rs/enum-representations.html)) when serializing an enum.\n### untagged\n  You cannot deserialize serialized data in some cases.\n  For example, [aws_sdk_dynamodb::model::AttributeValue](https://docs.rs/aws-sdk-dynamodb/latest/aws_sdk_dynamodb/model/enum.AttributeValue.html) has `Null(bool)` and `Bool(bool)`, which you cannot distinguish serialized values without a tag.\n\n\n### internal\n  This results in compile time error.\n  [*Using a #[serde(tag = \"...\")] attribute on an enum containing a tuple variant is an error at compile time*](https://serde.rs/enum-representations.html).\n\n### external and adjacent\nWe are left with `external` and `adjacent` tagging.\nExternal tagging is the default way.\nThis RFC can be achieved either way.\n\nThe resulting size of the serialized data is smaller when tagged externally, as adjacent tagging will require a tag even when a variant has no content.\n\nFor the reasons mentioned above, we implement an enum that is externally tagged.\n\n## Data Types to Skip Serialization/Deserialization\nWe are going to skip serialization and deserialization of fields that have the datatype that corresponds to `@streaming blob` from smithy.\nAny fields with these data types are tagged with `#[serde(skip)]`.\n\nBy skipping, corresponding field's value will be assigned the value generated by `Default` trait.\n\nAs of writing, `aws_smithy_http::byte_stream::ByteStream` is the only data type that is affected by this decision.\n\nHere is an example of data types affected by this decision:\n- `aws_sdk_s3::input::put_object_input::PutObjectInput`\n\nWe considered serializing them as bytes, however, it could take some time for a stream to reach the end, and the resulting serialized data may be too big for itself to fit into the ram.\n\nHere is an example snippet.\n```rust,ignore\n#[allow(missing_docs)]\n#[cfg_attr(\n    all(aws-sdk-unstable, feature = \"serde-serialize\"),\n    derive(serde::Serialize)\n)]\n#[cfg_attr(\n    all(aws-sdk-unstable, feature = \"serde-deserialize\"),\n    derive(serde::Deserialize)\n)]\n#[non_exhaustive]\n#[derive(std::fmt::Debug)]\npub struct PutObjectInput {\n    pub acl: std::option::Option<crate::model::ObjectCannedAcl>,\n    pub body: aws_smithy_http::byte_stream::ByteStream,\n    // ... other fields\n}\n```\n\n## Data types to exclude from ser/de code generation\nFor data types that include `@streaming union` in any of their fields, we do NOT implement `serde` traits.\n\nAs of writing, following Rust data types corresponds to `@streaming union`.\n- `aws_smithy_http::event_stream::Receiver`\n- `aws_smithy_http::event_stream::EventStreamSender`\n\nHere is an example of data type affected by this decision;\n- `aws_sdk_transcribestreaming::client::fluent_builders::StartMedicalStreamTranscription`\n\nWe considered skipping relevant fields on serialization and creating a custom de-serialization function which creates event stream that will always result in error when a user tries to send/receive data.\nHowever, we believe that our decision is justified for following reason.\n- All for operations that feature event streams since the stream is ephemeral (tied to the HTTP connection), and is effectively unusable after serialization and deserialization\n- Most event stream operations don't have fields that go along with them, making the stream the sole component in them, which makes ser/de not so useful\n- SDK that uses event stream, such as `aws-sdk-transcribestreaming` only has just over 5000 all-time downloads with recent downloads of just under 1000 as of writing (2023/01/21); It makes it difficult to justify since the implementation impacts smaller number of people.\n\n\n## `Serde` traits implemented on Builder of Output Types\nOutput data, such as `aws_sdk_dynamodb::output::UpdateTableOutput` has builder types.\nThese builder types are available to users, however, no API requires users to build data types by themselves.\n\nWe considered removing traits from these data types.\n\nRemoving serde traits on these types will help reduce compile time, however, builder type can be useful, for example, for testing.\nWe have prepared examples [here](UseCaseExamples).\n\n## `fn set_fields` to allow users to use externally created `Input`\n\nCurrently, to set the value to fluent builders, users must call setter methods for each field.\nSDK does not have a method that allows users to use deserialized `Input`.\nThus, we add a new method `fn set_fields` to `Client` types.\nThis method accepts inputs and replaces all parameters that `Client` has with the new one.\n\n```rust,ignore\npub fn set_fields(mut self, input_type: path::to::input_type) -> path::to::input_type {\n    self.inner = input_type;\n    self\n}\n```\n\nUsers can use `fn set_fields` to replace the parameters in fluent builders.\nYou can find examples [here](#UseCaseExamples).\n\n# Other Concerns\n## Model evolution\nSDK will introduce new fields and we may see new data types in the future.\n\nWe believe that this will not be a problem.\n\n### Introduction of New Fields\nMost fields are `Option<T>` type.\nWhen the user de-serializes data written for a format before the new fields were introduced, new fields will be assigned with `None` type.\n\nIf a field isn't `Option`, `serde` uses `Default` trait unless a custom de-serialization/serialization is specified to generate data to fill the field.\nIf the new field is not an `Option<T>` type and has no `Default` implementation, we must implement a custom de-serialization logic.\n\nIn the case of serialization, the introduction of new fields will not be an issue unless the data format requires a schema. (e.g. parquet, avro) However, this is outside the scope of this RFC.\n\n## Introduction of New Data Type\nIf a new field introduces a new data type, it will not require any additional work if the data type can derive `serde` traits.\n\nIf the data cannot derive `serde` traits on its own, then we have two options.\nTo clarify, this is the same approach we took on `Data Type to skip` section.\n1. skip\n   We will simply skip serializing/de-serializing. However, we may need to implement custom serialization/de-serialization logic if a value is not wrapped with `Option`.\n2. custom serialization/de-serialization logic\n   We can implement tailored serialization/de-serialization logic.\n\nEither way, we will mention this on the generated docs to avoid surprising users.\n\ne.g.\n```rust,ignore\n#[derive(serde::Serialize, serde::Deserialize)]\nstruct OutputV1 {\n  string_field: Option<String>\n}\n\n#[derive(serde::Serialize, serde::Deserialize)]\nstruct OutputV2 {\n  string_field: Option<String>,\n  // this will always be treated as None value by serde\n  #[serde(skip)]\n  skip_not_serializable: Option<SomeComplexDataType>,\n  // We can implement a custom serialization logic\n  #[serde(serialize_with = \"custom_serilization_logic\", deserialize_with = \"custom_deserilization_logic\")]\n  not_derive_able: SomeComplexDataType,\n  // Serialization will be skipped, and de-serialization will be handled with the function provided on default tag\n  #[serde(skip, default = \"default_value\")]\n  skip_with_custom: DataTypeWithoutDefaultTrait,\n}\n```\n# Discussions\n\n## Sensitive Information\nIf serialized data contains sensitive information, it will not be masked.\nWe mention that fields can compromise such information on every struct field to ensure that users know this.\n\n## Compile Time\nWe ran the following benchmark on C6a.2xlarge instance with 50gb of GP2 SSD.\nThe commit hash of the code is a8e2e19129aead4fbc8cf0e3d34df0188a62de9f.\n\nIt clearly shows an increase in compile time.\nUsers are advised to consider the use of software such as [sccache](https://github.com/mozilla/sccache) or [mold](https://github.com/rui314/mold) to reduce the compile time.\n\n- `aws-sdk-dynamodb`\n\n  - when compiled with debug profile\n\n    | command                                           | real time | user time | sys time  |\n    | ------------------------------------------------- | --------- | --------- | --------- |\n    | cargo build                                       | 0m35.728s | 2m24.243s | 0m11.868s |\n    | cargo build --features unstable-serde-serialize   | 0m38.079s | 2m26.082s | 0m11.631s |\n    | cargo build --features unstable-serde-deserialize | 0m45.689s | 2m34.000s | 0m11.978s |\n    | cargo build --all-features                        | 0m48.959s | 2m45.688s | 0m13.359s |\n\n  - when compiled with release profile\n\n    | command                                                     | real time | user time | sys time  |\n    | ----------------------------------------------------------- | --------- | --------- | --------- |\n    | cargo build --release                                       | 0m52.040s | 5m0.841s  | 0m11.313s |\n    | cargo build --release --features unstable-serde-serialize   | 0m53.153s | 5m4.069s  | 0m11.577s |\n    | cargo build --release --features unstable-serde-deserialize | 1m0.107s  | 5m10.231s | 0m11.699s |\n    | cargo build --release --all-features                        | 1m3.198s  | 5m26.076s | 0m12.311s |\n\n- `aws-sdk-ec2`\n  - when compiled with debug profile\n\n    | command                                           | real time | user time | sys time  |\n    | ------------------------------------------------- | --------- | --------- | --------- |\n    | cargo build                                       | 1m20.041s | 2m14.592s | 0m6.611s  |\n    | cargo build --features unstable-serde-serialize   | 2m0.555s  | 4m24.881s | 0m16.131s |\n    | cargo build --features unstable-serde-deserialize | 3m10.857s | 5m34.246s | 0m18.844s |\n    | cargo build --all-features                        | 3m31.473s | 6m1.052s  | 0m19.681s |\n\n  - when compiled with release profile\n\n    | command                                                     | real time | user time  | sys time  |\n    | ----------------------------------------------------------- | --------- | ---------- | --------- |\n    | cargo build --release                                       | 2m29.480s | 9m19.530s  | 0m15.957s |\n    | cargo build --release --features unstable-serde-serialize   | 2m45.002s | 9m43.098s  | 0m16.886s |\n    | cargo build --release --features unstable-serde-deserialize | 3m47.531s | 10m52.017s | 0m18.404s |\n    | cargo build --release --all-features                        | 3m45.208s | 8m46.168s  | 0m10.211s |\n\n\n## Misleading Results\nSDK team previously expressed concern that serialized data may be misleading.\nWe believe that features implemented as part of this RFC do not produce a misleading result as we focus on builder types and it's corresponding data types which are mapped to serde's data type model with the derive macro.\n\n# Appendix\n## [Use Case Examples](UseCaseExamples)\n```rust,ignore\nuse aws_sdk_dynamodb::{Client, Error};\n\nasync fn example(read_builder: bool) -> Result<(), Error> {\n    // getting the client\n    let shared_config = aws_config::load_from_env().await;\n    let client = Client::new(&shared_config);\n\n    // de-serializing input's builder types and input types from json\n    let deserialized_input = if read_builder {\n      let mut parameter: aws_sdk_dynamodb::input::list_tables_input::Builder = serde_json::from_str(include_str!(\"./builder.json\"));\n      parameter.set_exclusive_start_table_name(\"some_name\").build()\n    } else {\n      let input: aws_sdk_dynamodb::input::ListTablesInput = serde_json::from_str(include_str!(\"./input.json\"));\n      input\n    };\n\n    // sending request using the deserialized input\n    let res = client.list_tables().set_fields(deserialized_input).send().await?;\n    println!(\"DynamoDB tables: {:?}\", res.table_names);\n\n    let out: aws_sdk_dynamodb::output::ListTablesOutput = {\n      // say you want some of the field to have certain values\n      let mut out_builder: aws_sdk_dynamodb::output::list_tables_output::Builder = serde_json::from_str(r#\"\n        {\n          table_names: [ \"table1\", \"table2\" ]\n        }\n      \"#);\n      // but you don't really care about some other values\n      out_builder.set_last_evaluated_table_name(res.last_evaluated_table_name()).build()\n    };\n    assert_eq!(res, out);\n\n    // serializing json output\n    let json_output = serde_json::to_string(res).unwrap();\n    // you can save the serialized input\n    println!(json_output);\n    Ok(())\n}\n```\n\n\nChanges checklist\n-----------------\n- [ ] Implement human-redable serialization for `DateTime` and `Blob` in `aws_smithy_types`\n- [ ] Implement non-human-redable serialization for `DateTime` and `Blob` in `aws_smithy_types`\n- [ ] Implement `Serialize` and `Deserialize` for relevant data types in `aws_smithy_types`\n- [ ] Modify Kotlin's codegen so that generated Builder and non-Builder types implement `Serialize` and `Deserialize`\n- [ ] Add feature gate for `Serialize` and `Deserialize`\n- [ ] Prepare examples\n- [ ] Prepare reproducible compile time benchmark\n"
  },
  {
    "path": "design/src/rfcs/rfc0031_providing_fallback_credentials_on_timeout.md",
    "content": "RFC: Providing fallback credentials on external timeout\n=======================================================\n> Status: Implemented in [smithy-rs#2246](https://github.com/smithy-lang/smithy-rs/pull/2246)\n>\n> Applies to: client\n\nFor a summarized list of proposed changes, see the [Changes Checklist](#changes-checklist) section.\n\nThis RFC proposes a fallback mechanism for credentials providers on external timeout (see the [Terminology](#terminology) section), allowing them to continue serving (possibly expired) credentials for the sake of overall reliability of the intended service; The IMDS credentials provider is an example that must fulfill such a requirement to support static stability.\n\nTerminology\n-----------\n\n- External timeout: The name of the timeout that occurs when a duration elapses before an async call to `provide_credentials` returns. In this case, `provide_credentials` returns no credentials.\n- Internal timeout: The name of the timeout that occurs when a duration elapses before an async call to some function, inside the implementation of `provide_credentials`, returns. Examples include connection timeouts, TLS negotiation timeouts, and HTTP request timeouts. Implementations of `provide_credentials` may handle these failures at their own discretion e.g. by returning _(possibly expired)_ credentials or a `CredentialsError`.\n- Static stability: Continued availability of a service in the face of impaired dependencies.\n\nAssumption\n----------\n\nThis RFC is concerned only with external timeouts, as the cost of poor API design is much higher in this case than for internal timeouts. The former will affect a public trait implemented by all credentials providers whereas the latter can be handled locally by individual credentials providers without affecting one another.\n\nProblem\n-------\n\nWe have mentioned static stability. Supporting it calls for the following functional requirement, among others:\n- REQ 1: Once a credentials provider has served credentials, it should continue serving them in the event of a timeout (whether internal or external) while obtaining refreshed credentials.\n\nToday, we have the following trait method to obtain credentials:\n```rust,ignore\nfn provide_credentials<'a>(&'a self) -> future::ProvideCredentials<'a>\nwhere\n    Self: 'a,\n```\nThis method returns a future, which can be raced against a timeout future as demonstrated by the following code snippet from `LazyCredentialsCache`:\n\n```rust,ignore\nlet timeout_future = self.sleeper.sleep(self.load_timeout); // by default self.load_timeout is 5 seconds.\n// --snip--\nlet future = Timeout::new(provider.provide_credentials(), timeout_future);\nlet result = cache\n   .get_or_load(|| async move {\n        let credentials = future.await.map_err(|_err| {\n            CredentialsError::provider_timed_out(load_timeout)\n        })??;\n        // --snip--\n    }).await;\n// --snip--\n```\nThis creates an external timeout for `provide_credentials`. If `timeout_future` wins the race, a future for `provide_credentials` gets dropped, `timeout_future` returns an error, and the error is mapped to `CredentialsError::ProviderTimedOut` and returned. This makes it impossible for the variable `provider` above to serve credentials as stated in REQ 1.\n\nA more complex use case involves `CredentialsProviderChain`. It is a manifestation of the chain of responsibility pattern and keeps calling the `provide_credentials` method on each credentials provider down the chain until credentials are returned by one of them. In addition to REQ 1, we have the following functional requirement with respect to `CredentialsProviderChain`:\n- REQ 2: Once a credentials provider in the chain has returned credentials, it should continue serving them even in the event of a timeout (whether internal or external) without falling back to another credentials provider.\n\nReferring back to the code snippet above, we analyze two relevant cases (and suppose provider 2 below must meet REQ 1 and REQ 2 in each case):\n\n**Case 1:** Provider 2 successfully loaded credentials but later failed to do so because an external timeout kicked in.\n\n<p align=\"center\">\n<img width=\"750\" alt=\"chain-provider-ext-timeout-1\" src=\"https://user-images.githubusercontent.com/15333866/212421638-d08e4821-2dbe-497f-82c5-c78aab8acbe9.png\">\n</p>\n\nThe figure above illustrates an example. This `CredentialsProviderChain` consists of three credentials providers. When `CredentialsProviderChain::provide_credentials` is called, provider 1's `provide_credentials` is called but does not find credentials so passes the torch to provider 2, which in turn successfully loads credentials and returns them. The next time the method is called, provider 1 does not find credentials but neither does provider 2 this time, because an external timeout by `timeout_future` given to the whole chain kicked in and the future is dropped while provider 2's `provide_credentials` was running. Given the functional requirements, provider 2 should return the previously available credentials but today the code snippet from `LazyCredentialsCache` returns a `CredentialsError::ProviderTimedOut` instead.\n\n**Case 2:** Provider 2 successfully loaded credentials but later was not reached because its preceding provider was still running when an external timeout kicked in.\n\n<p align=\"center\">\n<img width=\"750\" alt=\"chain-provider-ext-timeout-2\" src=\"https://user-images.githubusercontent.com/15333866/212421712-8c6eab11-a0c1-4229-8ba3-67b0bb6056e7.png\">\n</p>\n\nThe figure above illustrates an example with the same setting as the previous figure. Again, when `CredentialsProviderChain::provide_credentials` is called the first time, provider 1 does not find credentials but provider 2 does. The next time the method is called, provider 1 is still executing `provide_credentials` and then an external timeout by `timeout_future` kicked in. Consequently, the execution of `CredentialsProviderChain::provide_credentials` has been terminated. Given the functional requirements, provider 2 should return the previously available credentials but today the code snippet from `LazyCredentialsCache` returns `CredentialsError::ProviderTimedOut` instead.\n\n\nProposal\n--------\nTo address the problem in the previous section, we propose to add a new method to the `ProvideCredentials` trait called `fallback_on_interrupt`. This method allows credentials providers to have a fallback mechanism on an external timeout and to serve credentials to users if needed. There are two options as to how it is implemented, either as a synchronous primitive or as an asynchronous primitive.\n\n#### Option A: Synchronous primitive\n```rust,ignore\npub trait ProvideCredentials: Send + Sync + std::fmt::Debug {\n    // --snip--\n\n    fn fallback_on_interrupt(&self) -> Option<Credentials> {\n        None\n    }\n}\n```\n- :+1: Users can be guided to use only synchronous primitives when implementing `fallback_on_interrupt`.\n- :-1: It cannot support cases where fallback credentials are asynchronously retrieved.\n- :-1: It may turn into a blocking operation if it takes longer than it should.\n\n#### Option B: Asynchronous primitive\n```rust,ignore\nmod future {\n    // --snip--\n\n    // This cannot use `OnlyReady` in place of `BoxFuture` because\n    // when a chain of credentials providers implements its own\n    // `fallback_on_interrupt`, it needs to await fallback credentials\n    // in its inner providers. Thus, `BoxFuture` is required.\n    pub struct FallbackOnInterrupt<'a>(NowOrLater<Option<Credentials>, BoxFuture<'a, Option<Credentials>>>);\n\n    // impls for FallbackOnInterrupt similar to those for the ProvideCredentials future newtype\n}\n\npub trait ProvideCredentials: Send + Sync + std::fmt::Debug {\n    // --snip--\n\n    fn fallback_on_interrupt<'a>(&'a self) -> future::FallbackOnInterrupt<'a> {\n        future::FallbackOnInterrupt::ready(None)\n    }\n}\n```\n- :+1: It is async from the beginning, so less likely to introduce a breaking change.\n- :-1: We may have to consider yet another timeout for `fallback_on_interrupt` itself.\n\nOption A cannot be reversible in the future if we are to support the use case for asynchronously retrieving the fallback credentials, whereas option B allows us to continue supporting both ready and pending futures when retrieving the fallback credentials. However, `fallback_on_interrupt` is supposed to return credentials that have been set aside in case `provide_credentials` is timed out. To express that intent, we choose option A and document that users should NOT go fetch new credentials in `fallback_on_interrupt`.\n\nThe user experience for the code snippet in question will look like this once this proposal is implemented:\n```rust,ignore\nlet timeout_future = self.sleeper.sleep(self.load_timeout); // by default self.load_timeout is 5 seconds.\n// --snip--\nlet future = Timeout::new(provider.provide_credentials(), timeout_future);\nlet result = cache\n    .get_or_load(|| {\n        async move {\n           let credentials = match future.await {\n                Ok(creds) => creds?,\n                Err(_err) => match provider.fallback_on_interrupt() { // can provide fallback credentials\n                    Some(creds) => creds,\n                    None => return Err(CredentialsError::provider_timed_out(load_timeout)),\n                }\n            };\n            // --snip--\n        }\n    }).await;\n// --snip--\n```\n\n\nHow to actually implement this RFC\n----------------------------------\n\nAlmost all credentials providers do not have to implement their own `fallback_on_interrupt` except for `CredentialsProviderChain` (`ImdsCredentialsProvider` also needs to implement `fallback_on_interrupt` when we are adding static stability support to it but that is outside the scope of this RFC).\n\nConsidering the two cases we analyzed above, implementing `CredentialsProviderChain::fallback_on_interrupt` is not so straightforward. Keeping track of whose turn in the chain it is to call `provide_credentials` when an external timeout has occurred is a challenging task. Even if we figured it out, that would still not satisfy `Case 2` above, because it was provider 1 that was actively running when the external timeout kicked in, but the chain should return credentials from provider 2, not from provider 1.\n\nWith that in mind, consider instead the following approach:\n```rust,ignore\nimpl ProvideCredentials for CredentialsProviderChain {\n    // --snip--\n\n    fn fallback_on_interrupt(&self) -> Option<Credentials> { {\n        for (_, provider) in &self.providers {\n            match provider.fallback_on_interrupt() {\n                creds @ Some(_) => return creds,\n                None => {}\n            }\n        }\n        None\n    }\n}\n```\n`CredentialsProviderChain::fallback_on_interrupt` will invoke each provider's `fallback_on_interrupt` method until credentials are returned by one of them. It ensures that the updated code snippet for `LazyCredentialsCache` can return credentials from provider 2 in both `Case 1` and `Case 2`. Even if `timeout_future` wins the race, the execution subsequently calls `provider.fallback_on_interrupt()` to obtain fallback credentials from provider 2, assuming provider 2's `fallback_on_interrupt` is implemented to return fallback credentials accordingly.\n\nThe downside of this simple approach is that the behavior is not clear if more than one credentials provider in the chain can return credentials from their `fallback_on_interrupt`. Note, however, that it is the exception rather than the norm for a provider's `fallback_on_interrupt` to return fallback credentials, at least at the time of writing (01/13/2023). The fact that it returns fallback credentials means that the provider successfully loaded credentials at least once, and it usually continues serving credentials on subsequent calls to `provide_credentials`.\n\nShould we have more than one provider in the chain that can potentially return fallback credentials from `fallback_on_interrupt`, we could configure the behavior of `CredentialsProviderChain` managing in what order and how each `fallback_on_interrupt` should be executed. See the [Possible enhancement\n](#possible-enhancement) section for more details. The use case described there is an extreme edge case, but it's worth exploring what options are available to us with the proposed design.\n\nAlternative\n-----------\n\nIn this section, we will describe an alternative approach that we ended up dismissing as unworkable.\n\nInstead of `fallback_on_interrupt`, we considered the following method to be added to the `ProvideCredentials` trait:\n```rust,ignore\npub trait ProvideCredentials: Send + Sync + std::fmt::Debug {\n    // --snip--\n\n    /// Returns a future that provides credentials within the given `timeout`.\n    ///\n    /// The default implementation races `provide_credentials` against\n    /// a timeout future created from `timeout`.\n    fn provide_credentials_with_timeout<'a>(\n        &'a self,\n        sleeper: Arc<dyn AsyncSleep>,\n        timeout: Duration,\n    ) -> future::ProvideCredentials<'a>\n    where\n        Self: 'a,\n    {\n        let timeout_future = sleeper.sleep(timeout);\n        let future = Timeout::new(self.provide_credentials(), timeout_future);\n        future::ProvideCredentials::new(async move {\n            let credentials = future\n                .await\n                .map_err(|_err| CredentialsError::provider_timed_out(timeout))?;\n            credentials\n        })\n    }\n```\n`provide_credentials_with_timeout` encapsulated the timeout race and allowed users to specify how long the external timeout for `provide_credentials` would be. The code snippet from `LazyCredentialsCache` then looked like\n```rust,ignore\nlet sleeper = Arc::clone(&self.sleeper);\nlet load_timeout = self.load_timeout; // by default self.load_timeout is 5 seconds.\n// --snip--\nlet result = cache\n    .get_or_load(|| {\n        async move {\n            let credentials = provider\n                .provide_credentials_with_timeout(sleeper, load_timeout)\n                .await?;\n            // --snip--\n        }\n    }).await;\n// --snip--\n```\nHowever, implementing `CredentialsProviderChain::provide_credentials_with_timeout` quickly ran into the following problem:\n```rust,ignore\nimpl ProvideCredentials for CredentialsProviderChain {\n    // --snip--\n\n    fn provide_credentials_with_timeout<'a>(\n        &'a self,\n        sleeper: Arc<dyn AsyncSleep>,\n        timeout: Duration,\n    ) -> future::ProvideCredentials<'a>\n    where\n        Self: 'a,\n    {\n        future::ProvideCredentials::new(self.credentials_with_timeout(sleeper, timeout))\n    }\n}\n\nimpl CredentialsProviderChain {\n    // --snip--\n\n    async fn credentials_with_timeout(\n        &self,\n        sleeper: Arc<dyn AsyncSleep>,\n        timeout: Duration,\n    ) -> provider::Result {\n        for (_, provider) in &self.providers {\n            match provider\n                .provide_credentials_with_timeout(Arc::clone(&sleeper), /* how do we calculate timeout for each provider ? */)\n                .await\n            {\n                Ok(credentials) => {\n                    return Ok(credentials);\n                }\n                Err(CredentialsError::ProviderTimedOut(_)) => {\n                    // --snip--\n                }\n                Err(err) => {\n                   // --snip--\n                }\n           }\n        }\n        Err(CredentialsError::provider_timed_out(timeout))\n    }\n```\nThere are mainly two problems with this approach. The first problem is that as shown above, there is no sensible way to calculate a timeout for each provider in the chain. The second problem is that exposing a parameter like `timeout` at a public trait's level is giving too much control to users; delegating overall timeout to the individual provider means each provider has to get it right.\n\nChanges checklist\n-----------------\n\n- [ ] Add `fallback_on_interrupt` method to the `ProvideCredentials` trait with the default implementation\n- [ ] Implement `CredentialsProviderChain::fallback_on_interrupt`\n- [ ] Implement `DefaultCredentialsChain::fallback_on_interrupt`\n- [ ] Add unit tests for `Case 1` and `Case 2`\n\nPossible enhancement\n--------------------\nWe will describe how to customize the behavior for `CredentialsProviderChain::fallback_on_interrupt`. We are only demonstrating how much the proposed design can be extended and currently do not have concrete use cases to implement using what we present in this section.\n\nAs described in the [Proposal](#proposal) section, `CredentialsProviderChain::fallback_on_interrupt` traverses the chain from the head to the tail and returns the first fallback credentials found. This precedence policy works most of the time, but when we have more than one provider in the chain that can potentially return fallback credentials, it could break in the following edge case (we are still basing our discussion on the code snippet from `LazyCredentialsCache` but forget REQ 1 and REQ 2 for the sake of simplicity).\n\n<p align=\"center\">\n<img width=\"800\" alt=\"fallback_on_interrupt_appendix excalidraw\" src=\"https://user-images.githubusercontent.com/15333866/213618808-d19892d8-5c83-4039-9940-280dcd2a8cf1.png\">\n</p>\n\nDuring the first call to `CredentialsProviderChain::provide_credentials`, provider 1 fails to load credentials, maybe due to an internal timeout, and then provider 2 succeeds in loading its credentials (call them credentials 2) and internally stores them for `Provider2::fallback_on_interrupt` to return them subsequently. During the second call, provider 1 succeeds in loading credentials (call them credentials 1) and internally stores them for `Provider1::fallback_on_interrupt` to return them subsequently. Suppose, however, that credentials 1's expiry is earlier than credentials 2's expiry. Finally, during the third call, `CredentialsProviderChain::provide_credentials` did not complete due to an external timeout. `CredentialsProviderChain::fallback_on_interrupt` then returns credentials 1, when it should return credentials 2 whose expiry is later, because of the precedence policy.\n\nThis a case where `CredentialsProviderChain::fallback_on_interrupt` requires the recency policy for fallback credentials found in provider 1 and provider 2, not the precedence policy. The following figure shows how we can set up such a chain:\n\n<p align=\"center\">\n<img width=\"700\" alt=\"heterogeneous_policies_for_fallback_on_interrupt\" src=\"https://user-images.githubusercontent.com/15333866/213755875-ac6fddbc-0f1b-4437-af16-6e0dbe08ae04.png\">\n</p>\n\nThe outermost chain is a `CredentialsProviderChain` and follows the precedence policy for `fallback_on_interrupt`. It contains a sub-chain that, in turn, contains provider 1 and provider 2. This sub-chain implements its own `fallback_on_interrupt` to realize the recency policy for fallback credentials found in provider 1 and provider 2. Conceptually, we have\n```rust,ignore\npub struct FallbackRecencyChain {\n    provider_chain: CredentialsProviderChain,\n}\n\nimpl ProvideCredentials for FallbackRecencyChain {\n    fn provide_credentials<'a>(&'a self) -> future::ProvideCredentials<'a>\n    where\n        Self: 'a,\n    {\n        // Can follow the precedence policy for loading credentials\n        // if it chooses to do so.\n    }\n\n    fn fallback_on_interrupt(&self) -> Option<Credentials> {\n        // Iterate over `self.provider_chain` and return\n        // fallback credentials whose expiry is the most recent.\n    }\n}\n```\nWe can then compose the entire chain like so:\n```rust,ignore\nlet provider_1 = /* ... */\nlet provider_2 = /* ... */\nlet provider_3 = /* ... */\n\nlet sub_chain = CredentialsProviderChain::first_try(\"Provider1\", provider_1)\n    .or_else(\"Provider2\", provider_2);\n\nlet recency_chain = /* Create a FallbackRecencyChain with sub_chain */\n\nlet final_chain = CredentialsProviderChain::first_try(\"fallback_recency\", recency_chain)\n    .or_else(\"Provider3\", provider_3);\n```\nThe `fallback_on_interrupt` method on `final_chain` still traverses from the head to the tail, but once it hits `recency_chain`, `fallback_on_interrupt` on `recency_chain` respects the expiry of fallback credentials found in its inner providers.\n\nWhat we have presented in this section can be generalized thanks to chain composability. We could have different sub-chains, each implementing its own policy for `fallback_on_interrupt`.\n"
  },
  {
    "path": "design/src/rfcs/rfc0032_better_constraint_violations.md",
    "content": "RFC: Better Constraint Violations\n=================================\n\n> Status: Accepted\n>\n> Applies to: server\n\nDuring and after [the design][constraint-traits-rfc] and [the core\nimplementation][builders-of-builders-pr] of [constraint traits] in the server\nSDK, some problems relating to constraint violations were identified. This RFC\nsets out to explain and address three of them: [impossible constraint\nviolations](#impossible-constraint-violations), [collecting constraint\nviolations](#collecting-constraint-violations), and [\"tightness\" of constraint\nviolations](#tightness-of-constraint-violations). The RFC explains each of them\nin turn, solving them in an iterative and pedagogical manner, i.e. the solution\nof a problem depends on the previous ones having been solved with their\nproposed solutions. The three problems are meant to be addressed atomically in\none changeset (see the [Checklist](#checklist)) section.\n\nNote: code snippets from generated SDKs in this document are abridged so as to\nbe didactic and relevant to the point being made. They are accurate with\nregards to commit [`2226fe`].\n\n[constraint-traits-rfc]: https://github.com/smithy-lang/smithy-rs/pull/1199\n[builders-of-builders-pr]: https://github.com/smithy-lang/smithy-rs/pull/1342\n[`2226fe`]: https://github.com/smithy-lang/smithy-rs/tree/2226feff8f7fa884204f81a50d7e016386912acc\n[constraint traits]: https://awslabs.github.io/smithy/2.0/spec/constraint-traits.html\n\nTerminology\n-----------\n\n[The design][constraint-traits-rfc] and the description of [the\nPR][builders-of-builders-pr] where the core implementation of constraint traits\nwas made are recommended prior reading to understand this RFC.\n\n- **Shape closure**: the set of shapes a shape can \"reach\", including itself.\n- **Transitively constrained shape**: a shape whose closure includes:\n    1. a shape with a [constraint trait][constraint traits] attached,\n    2. a (member) shape with a [`required` trait] attached,\n    3. an [`enum` shape]; or\n    4. an [`intEnum` shape].\n- A **directly constrained shape** is any of these:\n    1. a shape with a [constraint trait][constraint traits] attached,\n    2. a (member) shape with a [`required` trait] attached,\n    3. an [`enum` shape],\n    4. an [`intEnum` shape]; or\n    5. a [`structure` shape] with at least one `required` member shape.\n- **Constrained type**: the Rust type a constrained shape gets rendered as. For\n  shapes that are not `structure`, `union`, `enum` or `intEnum` shapes, these\n  are wrapper [newtype]s.\n\n[`required` trait]: https://smithy.io/2.0/spec/type-refinement-traits.html#required-trait\n[`enum` shape]: https://smithy.io/2.0/spec/simple-types.html#enum\n[`intEnum` shape]: https://smithy.io/2.0/spec/simple-types.html#intenum\n[`structure` shape]: https://smithy.io/2.0/spec/aggregate-types.html#structure\n[newtype]: https://doc.rust-lang.org/rust-by-example/generics/new_types.html\n\nIn the absence of a qualifier, \"constrained shape\" should be interpreted as\n\"transitively constrained shape\".\n\nImpossible constraint violations\n--------------------------------\n\n### Background\n\nA constrained type has a fallible constructor by virtue of it implementing the\n[`TryFrom`] trait. The error type this constructor may yield is known as a\n**constraint violation**:\n\n```rust,ignore\nimpl TryFrom<UnconstrainedType> for ConstrainedType {\n    type Error = ConstraintViolation;\n\n    fn try_from(value: UnconstrainedType) -> Result<Self, Self::Error> {\n        ...\n    }\n}\n```\n\nThe `ConstraintViolation` type is a Rust `enum` with one variant per way\n\"constraining\" the input value may fail. So, for example, the following Smithy\nmodel:\n\n```smithy\nstructure A {\n    @required\n    member: String,\n}\n```\n\nYields:\n\n```rust,ignore\n/// See [`A`](crate::model::A).\npub mod a {\n    #[derive(std::cmp::PartialEq, std::fmt::Debug)]\n    /// Holds one variant for each of the ways the builder can fail.\n    pub enum ConstraintViolation {\n        /// `member` was not provided but it is required when building `A`.\n        MissingMember,\n    }\n}\n```\n\nConstraint violations are always Rust `enum`s, even if they only have one\nvariant.\n\nConstraint violations can occur in application code:\n\n```rust,ignore\nuse my_server_sdk::model\n\nlet res = model::a::Builder::default().build(); // We forgot to set `member`.\n\nmatch res {\n    Ok(a) => { ... },\n    Err(e) => {\n        assert_eq!(model::a::ConstraintViolation::MissingMember, e);\n    }\n}\n```\n\n[`TryFrom`]: https://doc.rust-lang.org/std/convert/trait.TryFrom.html\n\n### Problem\n\nCurrently, the constraint violation types we generate are used by _both_:\n\n1. the server framework upon request deserialization; and\n2. by users in application code.\n\nHowever, the kinds of constraint violations that can occur in application code\ncan sometimes be a _strict subset_ of those that can occur during request\ndeserialization.\n\nConsider the following model:\n\n```smithy\n@length(min: 1, max: 69)\nmap LengthMap {\n    key: String,\n    value: LengthString\n}\n\n@length(min: 2, max: 69)\nstring LengthString\n```\n\nThis produces:\n\n```rust,ignore\npub struct LengthMap(\n    pub(crate) std::collections::HashMap<std::string::String, crate::model::LengthString>,\n);\n\nimpl\n    std::convert::TryFrom<\n        std::collections::HashMap<std::string::String, crate::model::LengthString>,\n    > for LengthMap\n{\n    type Error = crate::model::length_map::ConstraintViolation;\n\n    /// Constructs a `LengthMap` from an\n    /// [`std::collections::HashMap<std::string::String,\n    /// crate::model::LengthString>`], failing when the provided value does not\n    /// satisfy the modeled constraints.\n    fn try_from(\n        value: std::collections::HashMap<std::string::String, crate::model::LengthString>,\n    ) -> Result<Self, Self::Error> {\n        let length = value.len();\n        if (1..=69).contains(&length) {\n            Ok(Self(value))\n        } else {\n            Err(crate::model::length_map::ConstraintViolation::Length(length))\n        }\n    }\n}\n\npub mod length_map {\n    pub enum ConstraintViolation {\n        Length(usize),\n        Value(\n            std::string::String,\n            crate::model::length_string::ConstraintViolation,\n        ),\n    }\n    ...\n}\n```\n\nObserve how the `ConstraintViolation::Value` variant is never constructed.\nIndeed, this variant is impossible to be constructed _in application code_: a\nuser has to provide a map whose values are already constrained `LengthString`s\nto the `try_from` constructor, which only enforces the map's `@length` trait.\n\nThe reason why these seemingly \"impossible violations\" are being generated is\nbecause they can arise during request deserialization. Indeed, the server\nframework deserializes requests into **fully unconstrained types**. These are\ntypes holding unconstrained types all the way through their closures. For\ninstance, in the case of structure shapes, builder types (the unconstrained\ntype corresponding to the structure shape) [hold\nbuilders][builders-of-builders-pr] all the way down.\n\nIn the case of the above model, below is the alternate `pub(crate)` constructor\nthe server framework uses upon deserialization. Observe how\n`LengthMapOfLengthStringsUnconstrained` is _fully unconstrained_ and how the\n`try_from` constructor can yield `ConstraintViolation::Value`.\n\n```rust,ignore\npub(crate) mod length_map_of_length_strings_unconstrained {\n    #[derive(Debug, Clone)]\n    pub(crate) struct LengthMapOfLengthStringsUnconstrained(\n        pub(crate) std::collections::HashMap<std::string::String, std::string::String>,\n    );\n\n    impl std::convert::TryFrom<LengthMapOfLengthStringsUnconstrained>\n        for crate::model::LengthMapOfLengthStrings\n    {\n        type Error = crate::model::length_map_of_length_strings::ConstraintViolation;\n        fn try_from(value: LengthMapOfLengthStringsUnconstrained) -> Result<Self, Self::Error> {\n            let res: Result<\n                std::collections::HashMap<std::string::String, crate::model::LengthString>,\n                Self::Error,\n            > = value\n                .0\n                .into_iter()\n                .map(|(k, v)| {\n                    let v: crate::model::LengthString = k.try_into().map_err(Self::Error::Key)?;\n\n                    Ok((k, v))\n                })\n                .collect();\n            let hm = res?;\n            Self::try_from(hm)\n        }\n    }\n}\n```\n\nIn conclusion, the user is currently exposed to an internal detail of how the\nframework operates that has no bearing on their application code. They\nshouldn't be exposed to impossible constraint violation variants in their Rust\ndocs, nor have to `match` on these variants when handling errors.\n\nNote: [this comment] alludes to the problem described above.\n\n[this comment]: https://github.com/smithy-lang/smithy-rs/blob/27020be3421fb93e35692803f9a795f92feb1d19/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/MapConstraintViolationGenerator.kt#L66-L69\n\n### Solution proposal\n\nThe problem can be mitigated by adding `#[doc(hidden)]` to the internal\nvariants and `#[non_exhaustive]` to the enum. We're already doing this in some\nconstraint violation types.\n\nHowever, a \"less leaky\" solution is achieved by _splitting_ the constraint\nviolation type into two types, which this RFC proposes:\n\n1. one for use by the framework, with `pub(crate)` visibility, named\n   `ConstraintViolationException`; and\n2. one for use by user application code, with `pub` visibility, named\n   `ConstraintViolation`.\n\n```rust,ignore\npub mod length_map {\n    pub enum ConstraintViolation {\n        Length(usize),\n    }\n    pub (crate) enum ConstraintViolationException {\n        Length(usize),\n        Value(\n            std::string::String,\n            crate::model::length_string::ConstraintViolation,\n        ),\n    }\n}\n```\n\nNote that, to some extent, the spirit of this approach is [already currently\npresent](https://github.com/smithy-lang/smithy-rs/blob/9a4c1f304f6f5237d480cfb56dad2951d927d424/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderGenerator.kt#L78-L81)\nin the case of builder types when `publicConstrainedTypes` is set to `false`:\n\n1. [`ServerBuilderGenerator.kt`] renders the usual builder type that enforces\n   constraint traits, setting its visibility to `pub (crate)`, for exclusive\n   use by the framework.\n2. [`ServerBuilderGeneratorWithoutPublicConstrainedTypes.kt`] renders the\n   builder type the user is exposed to: this builder does not take in\n   constrained types and does not enforce all modeled constraints.\n\n[`ServerBuilderGenerator.kt`]: https://github.com/smithy-lang/smithy-rs/blob/2226feff8f7fa884204f81a50d7e016386912acc/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderGenerator.kt\n[`ServerBuilderGeneratorWithoutPublicConstrainedTypes.kt`]: https://github.com/smithy-lang/smithy-rs/blob/2226feff8f7fa884204f81a50d7e016386912acc/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerBuilderGeneratorWithoutPublicConstrainedTypes.kt\n\nCollecting constraint violations\n--------------------------------\n\n### Background\n\nConstrained operations are currently required to have\n`smithy.framework#ValidationException` as a member in their [`errors`\nproperty](https://smithy.io/2.0/spec/service-types.html#operation). This is the\nshape that is rendered in responses when a request contains data that violates\nthe modeled constraints.\n\nThe shape is defined in the\n[`smithy-validation-model`](https://search.maven.org/artifact/software.amazon.smithy/smithy-validation-model)\nMaven package, [as\nfollows](https://github.com/awslabs/smithy/blob/main/smithy-validation-model/model/smithy.framework.validation.smithy):\n\n```smithy\n$version: \"2.0\"\n\nnamespace smithy.framework\n\n/// A standard error for input validation failures.\n/// This should be thrown by services when a member of the input structure\n/// falls outside of the modeled or documented constraints.\n@error(\"client\")\nstructure ValidationException {\n\n    /// A summary of the validation failure.\n    @required\n    message: String,\n\n    /// A list of specific failures encountered while validating the input.\n    /// A member can appear in this list more than once if it failed to satisfy multiple constraints.\n    fieldList: ValidationExceptionFieldList\n}\n\n/// Describes one specific validation failure for an input member.\nstructure ValidationExceptionField {\n    /// A JSONPointer expression to the structure member whose value failed to satisfy the modeled constraints.\n    @required\n    path: String,\n\n    /// A detailed description of the validation failure.\n    @required\n    message: String\n}\n\nlist ValidationExceptionFieldList {\n    member: ValidationExceptionField\n}\n```\n\nIt was mentioned in the [constraint traits\nRFC](https://github.com/smithy-lang/smithy-rs/pull/1199#discussion_r809300673), and\nimplicit in the definition of Smithy's\n[`smithy.framework.ValidationException`](https://github.com/awslabs/smithy/blob/main/smithy-validation-model/model/smithy.framework.validation.smithy)\nshape, that server frameworks should respond with a _complete_ collection of\nerrors encountered during constraint trait enforcement to the client.\n\n### Problem\n\nAs of writing, the `TryFrom` constructor of constrained types whose shapes have\nmore than one constraint trait attached can only yield a single error. For\nexample, the following shape:\n\n```smithy\n@pattern(\"[a-f0-5]*\")\n@length(min: 5, max: 10)\nstring LengthPatternString\n```\n\nYields:\n\n```rust,ignore\npub struct LengthPatternString(pub(crate) std::string::String);\n\nimpl LengthPatternString {\n    fn check_length(\n        string: &str,\n    ) -> Result<(), crate::model::length_pattern_string::ConstraintViolation> {\n        let length = string.chars().count();\n\n        if (5..=10).contains(&length) {\n            Ok(())\n        } else {\n            Err(crate::model::length_pattern_string::ConstraintViolation::Length(length))\n        }\n    }\n\n    fn check_pattern(\n        string: String,\n    ) -> Result<String, crate::model::length_pattern_string::ConstraintViolation> {\n        let regex = Self::compile_regex();\n\n        if regex.is_match(&string) {\n            Ok(string)\n        } else {\n            Err(crate::model::length_pattern_string::ConstraintViolation::Pattern(string))\n        }\n    }\n\n    pub fn compile_regex() -> &'static regex::Regex {\n        static REGEX: once_cell::sync::Lazy<regex::Regex> = once_cell::sync::Lazy::new(|| {\n            regex::Regex::new(r#\"[a-f0-5]*\"#).expect(r#\"The regular expression [a-f0-5]* is not supported by the `regex` crate; feel free to file an issue under https://github.com/smithy-lang/smithy-rs/issues for support\"#)\n        });\n\n        &REGEX\n    }\n}\n\nimpl std::convert::TryFrom<std::string::String> for LengthPatternString {\n    type Error = crate::model::length_pattern_string::ConstraintViolation;\n\n    /// Constructs a `LengthPatternString` from an [`std::string::String`],\n    /// failing when the provided value does not satisfy the modeled constraints.\n    fn try_from(value: std::string::String) -> Result<Self, Self::Error> {\n        Self::check_length(&value)?;\n\n        let value = Self::check_pattern(value)?;\n\n        Ok(Self(value))\n    }\n}\n```\n\nObserve how a failure to adhere to the `@length` trait will short-circuit the\nevaluation of the constructor, when the value could technically also not adhere\nwith the `@pattern` trait.\n\nSimilarly, constrained structures fail upon encountering the first member that\nviolates a constraint.\n\nAdditionally, _in framework request deserialization code_:\n\n- collections whose members are constrained fail upon encountering the first\n  member that violates the constraint,\n- maps whose keys and/or values are constrained fail upon encountering the\n  first violation; and\n- structures whose members are constrained fail upon encountering the first\n  member that violates the constraint,\n\nIn summary, any shape that is transitively constrained yields types whose\nconstructors (both the internal one and the user-facing one) currently\nshort-circuit upon encountering the first violation.\n\n### Solution proposal\n\nThe deserializing architecture lends itself to be easily refactored so that we\ncan collect constraint violations before returning them. Indeed, note that\ndeserializers enforce constraint traits in a two-step phase: first, the\n_entirety_ of the unconstrained value is deserialized, _then_ constraint traits\nare enforced by feeding the entire value to the `TryFrom` constructor.\n\nLet's consider a `ConstraintViolations` type (note the plural) that represents\na collection of constraint violations that can occur _within user application\ncode_. Roughly:\n\n```rust,ignore\npub ConstraintViolations<T>(pub(crate) Vec<T>);\n\nimpl<T> IntoIterator<Item = T> for ConstraintViolations<T> { ... }\n\nimpl std::convert::TryFrom<std::string::String> for LengthPatternString {\n    type Error = ConstraintViolations<crate::model::length_pattern_string::ConstraintViolation>;\n\n    fn try_from(value: std::string::String) -> Result<Self, Self::Error> {\n        // Check constraints and collect violations.\n        ...\n    }\n}\n```\n\n- The main reason for wrapping a vector in `ConstraintViolations` as opposed to\n  directly returning the vector is forwards-compatibility: we may want to\n  expand `ConstraintViolations` with conveniences.\n- If the constrained type can only ever yield a single violation, we will\n  dispense with `ConstraintViolations` and keep directly returning the\n  `crate::model::shape_name::ConstraintViolation` type.\n\nWe will analogously introduce a `ConstraintViolationExceptions` type that\nrepresents a collection of constraint violations that can occur _within the\nframework's request deserialization code_. This type will be `pub(crate)` and\nwill be the one the framework will map to Smithy's `ValidationException` that\neventually gets serialized into the response.\n\n#### Collecting constraint violations may constitute a DOS attack vector\n\nThis is a problem that _already_ exists as of writing, but that collecting\nconstraint violations highlights, so it is a good opportunity, from a\npedagogical perspective, to explain it here. Consider the following model:\n\n```smithy\n@length(max: 3)\nlist ListOfPatternStrings {\n    member: PatternString\n}\n\n@pattern(\"expensive regex to evaluate\")\nstring PatternString\n```\n\nOur implementation currently enforces constraints _from the leaf to the root_:\nwhen enforcing the `@length` constraint, the `TryFrom` constructor the server\nframework uses gets a `Vec<String>` and _first_ checks the members adhere to\nthe `@pattern` trait, and only _after_ is the `@length` trait checked. This\nmeans that if a client sends a request with `n >>> 3` list members, the\nexpensive check runs `n` times, when a constant-time check inspecting the\nlength of the input vector would have sufficed to reject the request.\nAdditionally, we may want to avoid serializing `n` `ValidationExceptionField`s\ndue to performance concerns.\n\n1. A possibility to circumvent this is making the `@length` validator special,\n   having it bound the other validators via effectively permuting the order of\n   the checks and thus short-circuiting.\n   * In general, it's unclear what constraint traits should cause\n     short-circuiting. A probably reasonable rule of thumb is to include\n     traits that can be attached directly to aggregate shapes: as of writing,\n     that would be `@uniqueItems` on list shapes and `@length` on list shapes.\n1. Another possiblity is to _do nothing_ and value _complete_ validation\n   exception response messages over trying to mitigate this with special\n   handling. One could argue that these kind of DOS attack vectors should be\n   taken care of with a separate solution e.g. a layer that bounds a request\n   body's size to a reasonable default (see [how Axum added\n   this](https://github.com/tokio-rs/axum/pull/1420)). We will provide a similar\n   request body limiting mechanism regardless.\n\nThis RFC advocates for implementing the first option, arguing that [it's fair\nto say that the framework should return an error that is as informative as\npossible, but it doesn't necessarily have to be\ncomplete](https://github.com/smithy-lang/smithy-rs/pull/2040#discussion_r1036226762).\nHowever, we will also write a layer, applied by default to all server SDKs,\nthat bounds a request body's size to a reasonable (yet high) default. Relying\non users to manually apply the layer is dangerous, since such a configuration\nis [trivially\nexploitable].\nUsers can always manually apply the layer again to their resulting service if\nthey want to further restrict a request's body size.\n\n[trivially exploitable]: https://jfrog.com/blog/watch-out-for-dos-when-using-rusts-popular-hyper-package/\n\n\"Tightness\" of constraint violations\n------------------------------------\n\n### Problem\n\n`ConstraintViolationExceptions` [is not\n\"tight\"](https://www.ecorax.net/tightness/) in that there's nothing in the type\nsystem that indicates to the user, when writing the custom validation error\nmapping function, that the iterator will not return a sequence of\n`ConstraintViolationException`s that is actually impossible to occur in\npractice.\n\nRecall that `ConstraintViolationException`s are `enum`s that model both direct\nconstraint violations as well as transitive ones. For example, given the model:\n\n```smithy\n@length(min: 1, max: 69)\nmap LengthMap {\n    key: String,\n    value: LengthString\n}\n\n@length(min: 2, max: 69)\nstring LengthString\n```\n\nThe corresponding `ConstraintViolationException` Rust type for the `LengthMap`\nshape is:\n\n```rust,ignore\npub mod length_map {\n    pub enum ConstraintViolation {\n        Length(usize),\n    }\n    pub (crate) enum ConstraintViolationException {\n        Length(usize),\n        Value(\n            std::string::String,\n            crate::model::length_string::ConstraintViolationException,\n        ),\n    }\n}\n```\n\n`ConstraintViolationExceptions` is just a container over this type:\n\n```rust,ignore\npub ConstraintViolationExceptions<T>(pub(crate) Vec<T>);\n\nimpl<T> IntoIterator<Item = T> for ConstraintViolationExceptions<T> { ... }\n```\n\nThere might be multiple map values that fail to adhere to the constraints in\n`LengthString`, which would make the iterator yield multiple\n`length_map::ConstraintViolationException::Value`s; however, at most one\n`length_map::ConstraintViolationException::Length` can be yielded _in\npractice_. This might be obvious to the service owner when inspecting the model\nand the Rust docs, but it's not expressed in the type system.\n\nThe above tightness problem has been formulated in terms of\n`ConstraintViolationExceptions`, because the fact that\n`ConstraintViolationExceptions` contain transitive constraint violations\nhighlights the tightness problem. Note, however, that **the tightness problem\nalso afflicts `ConstraintViolations`**.\n\nIndeed, consider the following model:\n\n```smithy\n@pattern(\"[a-f0-5]*\")\n@length(min: 5, max: 10)\nstring LengthPatternString\n```\n\nThis would yield:\n\n```rust,ignore\npub struct ConstraintViolations<T>(pub(crate) Vec<T>);\n\nimpl<T> IntoIterator<Item = T> for ConstraintViolations<T> { ... }\n\npub mod length_pattern_string {\n    pub enum ConstraintViolation {\n        Length(usize),\n        Pattern(String)\n    }\n}\n\nimpl std::convert::TryFrom<std::string::String> for LengthPatternString {\n    type Error = ConstraintViolations<crate::model::length_pattern_string::ConstraintViolation>;\n\n    fn try_from(value: std::string::String) -> Result<Self, Self::Error> {\n        // Check constraints and collect violations.\n        ...\n    }\n}\n```\n\nObserve how the iterator of an instance of\n`ConstraintViolations<crate::model::length_pattern_string::ConstraintViolation>`,\nmay, a priori, yield e.g. the\n`length_pattern_string::ConstraintViolation::Length` variant twice, when it's\nclear that the iterator should contain _at most one_ of each of\n`length_pattern_string::ConstraintViolation`'s variants.\n\n### Final solution proposal\n\nWe propose a tighter API design.\n\n1. We substitute `enum`s for `struct`s whose members are all `Option`al,\n   representing all the constraint violations that can occur.\n1. For list shapes and map shapes:\n    1. we implement `IntoIterator` on an additional `struct` `Members`\n       representing only the violations that can occur on the collection's\n       members.\n    2. we add a _non_ `Option`-al field to the `struct` representing the\n       constraint violations of type `Members`.\n\nLet's walk through an example. Take the last model:\n\n```smithy\n@pattern(\"[a-f0-5]*\")\n@length(min: 5, max: 10)\nstring LengthPatternString\n```\n\nThis would yield, as per the first substitution:\n\n```rust,ignore\npub mod length_pattern_string {\n    pub struct ConstraintViolations {\n        pub length: Option<constraint_violation::Length>,\n        pub pattern: Option<constraint_violation::Pattern>,\n    }\n\n    pub mod constraint_violation {\n        pub struct Length(usize);\n        pub struct Pattern(String);\n    }\n}\n\nimpl std::convert::TryFrom<std::string::String> for LengthPatternString {\n    type Error = length_pattern_string::ConstraintViolations;\n\n    // The error type returned by this constructor, `ConstraintViolations`,\n    // will always have _at least_ one member set.\n    fn try_from(value: std::string::String) -> Result<Self, Self::Error> {\n        // Check constraints and collect violations.\n        ...\n    }\n}\n```\n\nWe now expand the model to highlight the second step of the algorithm:\n\n```smithy\n@length(min: 1, max: 69)\nmap LengthMap {\n    key: String,\n    value: LengthString\n}\n```\n\nThis gives us:\n\n```rust,ignore\npub mod length_map {\n    pub struct ConstraintViolations {\n        pub length: Option<constraint_violation::Length>,\n\n        // Would be `Option<T>` in the case of an aggregate shape that is _not_ a\n        // list shape or a map shape.\n        pub member_violations: constraint_violation::Members,\n    }\n\n    pub mod constraint_violation {\n        // Note that this could now live outside the `length_map` module and be\n        // reused across all `@length`-constrained shapes, if we expanded it with\n        // another `usize` indicating the _modeled_ value in the `@length` trait; by\n        // keeping it inside `length_map` we can hardcode that value in the\n        // implementation of e.g. error messages.\n        pub struct Length(usize);\n\n        pub struct Members {\n            pub(crate) Vec<Member>\n        }\n\n        pub struct Member {\n            // If the map's key shape were constrained, we'd have a `key`\n            // field here too.\n\n            value: Option<Value>\n        }\n\n        pub struct Value(\n            std::string::String,\n            crate::model::length_string::ConstraintViolation,\n        );\n\n        impl IntoIterator<Item = Member> for Members { ... }\n    }\n}\n```\n\n---\n\nThe above examples have featured the tight API design with\n`ConstraintViolation`s. Of course, we will apply the same design in the case of\n`ConstraintViolationException`s. For the sake of completeness, let's expand our\nmodel yet again with a structure shape:\n\n```smithy\nstructure A {\n    @required\n    member: String,\n\n    @required\n    length_map: LengthMap,\n}\n```\n\nAnd this time let's feature _both_ the resulting\n`ConstraintViolationExceptions` and `ConstraintViolations` types:\n\n```rust,ignore\npub mod a {\n    pub struct ConstraintViolationExceptions {\n        // All fields must be `Option`, despite the members being `@required`,\n        // since no violations for their values might have occurred.\n\n        pub missing_member_exception: Option<constraint_violation_exception::MissingMember>,\n        pub missing_length_map_exception: Option<constraint_violation_exception::MissingLengthMap>,\n        pub length_map_exceptions: Option<crate::model::length_map::ConstraintViolationExceptions>,\n    }\n\n    pub mod constraint_violation_exception {\n        pub struct MissingMember;\n        pub struct MissingLengthMap;\n    }\n\n    pub struct ConstraintViolations {\n        pub missing_member: Option<constraint_violation::MissingMember>,\n        pub missing_length_map: Option<constraint_violation::MissingLengthMap>,\n    }\n\n    pub mod constraint_violation {\n        pub struct MissingMember;\n        pub struct MissingLengthMap;\n    }\n}\n```\n\nAs can be intuited, the only differences are that:\n\n* `ConstraintViolationExceptions` hold transitive violations while\n  `ConstraintViolations` only need to expose direct violations (as explained in\n  the [Impossible constraint violations](#impossible-constraint-violations)\n  section),\n* `ConstraintViolationExceptions` have members suffixed with `_exception`, as\n  is the module name.\n\nNote that while the constraint violation (exception) type names are plural, the\nmodule names are always singular.\n\nWe also make a conscious decision of, in this case of structure shapes, making\nthe types of all members `Option`s, for simplicity. Another choice would have\nbeen to make `length_map_exceptions` not `Option`-al, and, in the case where no\nviolations in `LengthMap` values occurred, set\n`length_map::ConstraintViolations::length` to `None` and\n`length_map::ConstraintViolations::member_violations` eventually reach an empty\niterator. However, it's best that we use the expressiveness of `Option`s at the\nearliest (\"highest\" in the shape hierarchy) opportunity: if a member is `Some`,\nit means it (eventually) reaches data.\n\nChecklist\n---------\n\nUnfortunately, while this RFC _could_ be implemented iteratively (i.e. solve\neach of the problems in turn), it would introduce too much churn and throwaway\nwork: solving the tightness problem requires a more or less complete overhaul\nof the constraint violations code generator. It's best that all three problems\nbe solved in the same changeset.\n\n- [ ] Generate `ConstraintViolations` and `ConstraintViolationExceptions` types\n      so as to not reify [impossible constraint\n      violations](#impossible-constraint-violations), add the ability to [collect\n      constraint\n      violations](#collecting-constraint-violations), and solve the [\"tightness\" problem of constraint violations](#tightness-of-constraint-violations).\n- [ ] Special-case generated request deserialization code for operations\n      using `@length` and `@uniqueItems` constrained shapes whose closures reach\n      other constrained shapes so that the validators for these two traits\n      short-circuit upon encountering a number of inner constraint violations\n      above a certain threshold.\n- [ ] Write and expose a layer, applied by default to all generated server SDKs,\n      that bounds a request body's size to a reasonable (yet high) default, to prevent [trivial DoS attacks][trivially exploitable].\n"
  },
  {
    "path": "design/src/rfcs/rfc0033_improve_sdk_request_id_access.md",
    "content": "RFC: Improving access to request IDs in SDK clients\n===================================================\n\n> Status: Implemented in [#2129](https://github.com/smithy-lang/smithy-rs/pull/2129)\n>\n> Applies to: AWS SDK clients\n\nAt time of writing, customers can retrieve a request ID in one of four ways in the Rust SDK:\n\n1. For error cases where the response parsed successfully, the request ID can be retrieved\n   via accessor method on operation error. This also works for unmodeled errors so long as\n   the response parsing succeeds.\n2. For error cases where a response was received but parsing fails, the response headers\n   can be retrieved from the raw response on the error, but customers have to manually extract\n   the request ID from those headers (there's no convenient accessor method).\n3. For all error cases where the request ID header was sent in the response, customers can\n   call `SdkError::into_service_error` to transform the `SdkError` into an operation error,\n   which has a `request_id` accessor on it.\n4. For success cases, the customer can't retrieve the request ID at all if they use the fluent\n   client. Instead, they must manually make the operation and call the underlying Smithy client\n   so that they have access to `SdkSuccess`, which provides the raw response where the request ID\n   can be manually extracted from headers.\n\nOnly one of these mechanisms is convenient and ergonomic. The rest need considerable improvements.\nAdditionally, the request ID should be attached to tracing events where possible so that enabling\ndebug logging reveals the request IDs without any code changes being necessary.\n\nThis RFC proposes changes to make the request ID easier to access.\n\nTerminology\n-----------\n\n- **Request ID:** A unique identifier assigned to and associated with a request to AWS that is\n  sent back in the response headers. This identifier is useful to customers when requesting support.\n- **Operation Error:** Operation errors are code generated for each operation in a Smithy model.\n  They are an enum of every possible modeled error that that operation can respond with, as well\n  as an `Unhandled` variant for any unmodeled or unrecognized errors.\n- **Modeled Errors:** Any error that is represented in a Smithy model with the `@error` trait.\n- **Unmodeled Errors:** Errors that a service responds with that do not appear in the Smithy model.\n- **SDK Clients:** Clients generated for the AWS SDK, including \"adhoc\" or \"one-off\" clients.\n- **Smithy Clients:** Any clients not generated for the AWS SDK, excluding \"adhoc\" or \"one-off\" clients.\n\nSDK/Smithy Purity\n-----------------\n\nBefore proposing any changes, the topic of purity needs to be covered. Request IDs are not\ncurrently a Smithy concept. However, at time of writing, the request ID concept is leaked into\nthe non-SDK rust runtime crates and generated code via the [generic error] struct and the\n`request_id` functions on generated operation errors (e.g., [`GetObjectError` example in S3]).\n\nThis RFC attempts to remove these leaks from Smithy clients.\n\nProposed Changes\n----------------\n\nFirst, we'll explore making it easier to retrieve a request ID from errors,\nand then look at making it possible to retrieve them from successful responses.\nTo see the customer experience of these changes, see the **Example Interactions**\nsection below.\n\n### Make request ID retrieval on errors consistent\n\nOne could argue that customers being able to convert a `SdkError` into an operation error\nthat has a request ID on it is sufficient. However, there's no way to write a function\nthat takes an error from any operation and logs a request ID, so it's still not ideal.\n\nThe `aws-http` crate needs to have a `RequestId` trait on it to facilitate generic\nrequest ID retrieval:\n\n```rust\npub trait RequestId {\n    /// Returns the request ID if it's available.\n    fn request_id(&self) -> Option<&str>;\n}\n```\n\nThis trait will be implemented for `SdkError` in `aws-http` where it is declared,\ncomplete with logic to pull the request ID header out of the raw HTTP responses\n(it will always return `None` for event stream `Message` responses; an additional\ntrait may need to be added to `aws-smithy-http` to facilitate access to the headers).\nThis logic will try different request ID header names in order of probability\nsince AWS services have a couple of header name variations. `x-amzn-requestid` is\nthe most common, with `x-amzn-request-id` being the second most common.\n\n`aws-http` will also implement `RequestId` for `aws_smithy_types::error::Error`,\nand the `request_id` method will be removed from `aws_smithy_types::error::Error`.\nPlaces that construct `Error` will place the request ID into its `extras` field,\nwhere the `RequestId` trait implementation can retrieve it.\n\nA codegen decorator will be added to `sdk-codegen` to implement `RequestId` for\noperation errors, and the existing `request_id` accessors will be removed from\n`CombinedErrorGenerator` in `codegen-core`.\n\nWith these changes, customers can directly access request IDs from `SdkError` and\noperations errors by importing the `RequestId` trait. Additionally, the Smithy/SDK\npurity is improved since both places where request IDs are leaked to Smithy clients\nwill be resolved.\n\n### Implement `RequestId` for outputs\n\nTo make it possible to retrieve request IDs when using the fluent client, the new\n`RequestId` trait can be implemented for outputs.\n\nSome services (e.g., Transcribe Streaming) model the request ID header in their\noutputs, while other services (e.g., Directory Service) model a request ID\nfield on errors. In some cases, services take `RequestId` as a modeled input\n(e.g., IoT Event Data). It follows that it is possible, but unlikely, that\na service could have a field named `RequestId` that is not the same concept\nin the future.\n\nThus, name collisions are going to be a concern for putting a request ID accessor\non output. However, if it is implemented as a trait, then this concern is partially\nresolved. In the vast majority of cases, importing `RequestId` will provide the\naccessor without any confusion. In cases where it is already modeled and is the\nsame concept, customers will likely just use it and not even realize they didn't\nimport the trait. The only concern is future cases where it is modeled as a\nseparate concept, and as long as customers don't import `RequestId` for something\nelse in the same file, that confusion can be avoided.\n\nIn order to implement `RequestId` for outputs, either the original response needs\nto be stored on the output, or the request ID needs to be extracted earlier and\nstored on the output. The latter will lead to a small amount of header lookup\ncode duplication.\n\nIn either case, the `StructureGenerator` needs to be customized in `sdk-codegen`\n(Appendix B outlines an alternative approach to this and why it was dismissed).\nThis will be done by adding customization hooks to `StructureGenerator` similar\nto the ones for `ServiceConfigGenerator` so that a `sdk-codegen` decorator can\nconditionally add fields and functions to any generated structs. A hook will\nalso be needed to additional trait impl blocks.\n\nOnce the hooks are in place, a decorator will be added to store either the original\nresponse or the request ID on outputs, and then the `RequestId` trait will be\nimplemented for them. The `ParseResponse` trait implementation will be customized\nto populate this new field.\n\nNote: To avoid name collisions of the request ID or response on the output struct,\nthese fields can be prefixed with an underscore. It shouldn't be possible for SDK\nfields to code generate with this prefix given the model validation rules in place.\n\n### Implement `RequestId` for `Operation` and `operation::Response`\n\nIn the case that a customer wants to ditch the fluent client, it should still\nbe easy to retrieve a request ID. To do this, `aws-http` will provide `RequestId`\nimplementations for `Operation` and `operation::Response`. These implementations\nwill likely make the other `RequestId` implementations easier to implement as well.\n\n### Implement `RequestId` for `Result`\n\nThe `Result` returned by the SDK should directly implement `RequestId` when both\nits `Ok` and `Err` variants implement `RequestId`. This will make it possible\nfor a customer to feed the return value from `send()` directly to a request ID logger.\n\nExample Interactions\n--------------------\n\n### Generic Handling Case\n\n```rust,ignore\n// A re-export of the RequestId trait\nuse aws_sdk_service::primitives::RequestId;\n\nfn my_request_id_logging_fn(request_id: &dyn RequestId) {\n    println!(\"request ID: {:?}\", request_id.request_id());\n}\n\nlet result = client.some_operation().send().await?;\nmy_request_id_logging_fn(&result);\n```\n\n### Success Case\n\n```rust,ignore\nuse aws_sdk_service::primitives::RequestId;\n\nlet output = client.some_operation().send().await?;\nprintln!(\"request ID: {:?}\", output.request_id());\n```\n\n### Error Case with `SdkError`\n\n```rust,ignore\nuse aws_sdk_service::primitives::RequestId;\n\nmatch client.some_operation().send().await {\n    Ok(_) => { /* handle OK */ }\n    Err(err) => {\n        println!(\"request ID: {:?}\", output.request_id());\n    }\n}\n```\n\n### Error Case with operation error\n\n```rust,ignore\nuse aws_sdk_service::primitives::RequestId;\n\nmatch client.some_operation().send().await {\n    Ok(_) => { /* handle OK */ }\n    Err(err) => match err.into_service_err() {\n        err @ SomeOperationError::SomeError(_) => { println!(\"request ID: {:?}\", err.request_id()); }\n        _ => { /* don't care */ }\n    }\n}\n```\n\nChanges Checklist\n-----------------\n\n- [x] Create the `RequestId` trait in `aws-http`\n- [x] Implement for errors\n  - [x] Implement `RequestId` for `SdkError` in `aws-http`\n  - [x] Remove `request_id` from `aws_smithy_types::error::Error`, and store request IDs in its `extras` instead\n  - [x] Implement `RequestId` for `aws_smithy_types::error::Error` in `aws-http`\n  - [x] Remove generation of `request_id` accessors from `CombinedErrorGenerator` in `codegen-core`\n- [x] Implement for outputs\n  - [x] Add customization hooks to `StructureGenerator`\n  - [x] Add customization hook to `ParseResponse`\n  - [x] Add customization hook to `HttpBoundProtocolGenerator`\n  - [x] Customize output structure code gen in `sdk-codegen` to add either a request ID or a response field\n  - [x] Customize `ParseResponse` in `sdk-codegen` to populate the outputs\n- [x] Implement `RequestId` for `Operation` and `operation::Response`\n- [x] Implement `RequestId` for `Result<O, E>` where `O` and `E` both implement `RequestId`\n- [x] Re-export `RequestId` in generated crates\n- [x] Add integration tests for each request ID access point\n\nAppendix A: Alternate solution for access on successful responses\n-----------------------------------------------------------------\n\nAlternatively, for successful responses, a second `send` method (that is difficult to name)w\nbe added to the fluent client that has a return value that includes both the output and\nthe request ID (or entire response).\n\nThis solution was dismissed due to difficulty naming, and the risk of name collision.\n\nAppendix B: Adding `RequestId` as a string to outputs via model transform\n-------------------------------------------------------------------------\n\nThe request ID could be stored on outputs by doing a model transform in `sdk-codegen` to add a\n`RequestId` member field. However, this causes problems when an output already has a `RequestId` field,\nand requires the addition of a synthetic trait to skip binding the field in the generated\nserializers/deserializers.\n\n[generic error]: https://docs.rs/aws-smithy-types/0.51.0/aws_smithy_types/error/struct.Error.html\n[`GetObjectError` example in S3]: https://docs.rs/aws-sdk-s3/0.21.0/aws_sdk_s3/error/struct.GetObjectError.html#method.request_id\n"
  },
  {
    "path": "design/src/rfcs/rfc0034_smithy_orchestrator.md",
    "content": "# Smithy Orchestrator\n\n> status: implemented\n> applies-to: The smithy client\n\nThis RFC proposes a new process for constructing client requests and handling service responses. This new process is intended to:\n\n- Improve the user experience by\n- Simplifying several aspects of sending a request\n- Adding more extension points to the request/response lifecycle\n- Improve the maintainer experience by\n- Making our SDK more similar in structure to other AWS SDKs\n- Simplifying many aspects of the request/response lifecycle\n- Making room for future changes\n\nAdditionally, functionality that the SDKs currently provide like retries, logging, and auth with be incorporated into this new process in such a way as to make it more configurable and understandable.\n\nThis RFC references but is not the source of truth on:\n\n- Interceptors: To be described in depth in a future RFC.\n- Runtime Plugins: To be described in depth in a future RFC.\n\n## TLDR;\n\nWhen a smithy client communicates with a smithy service, messages are handled by an \"orchestrator.\" The orchestrator runs in two main phases:\n1. Constructing configuration.\n    - This process is user-configurable with \"runtime plugins.\"\n    - Configuration is stored in a typemap.\n1. Transforming a client request into a server response.\n    - This process is user-configurable with \"interceptors.\"\n    - Interceptors are functions that are run by \"hooks\" in the request/response lifecycle.\n\n## Terminology\n\n- **SDK Client**: A high-level abstraction allowing users to make requests to remote services.\n- **Remote Service**: A remote API that a user wants to use. Communication with a remote service usually happens over HTTP. The remote service is usually, but not necessarily, an AWS service.\n- **Operation**: A high-level abstraction representing an interaction between an *SDK Client and a *remote service*.\n- **Input Message**: A modeled request passed into an *SDK client*. For example, S3’s `ListObjectsRequest`.\n- **Transport Request Message**: A message that can be transmitted to a *remote service*. For example, an HTTP request.\n- **Transport Response Message**: A message that can be received from a *remote service*. For example, an HTTP response.\n- **Output Message**: A modeled response or exception returned to an *SDK client* caller. For example, S3’s `ListObjectsResponse` or `NoSuchBucketException`.\n- **The request/response lifecycle**: The process by which an *SDK client* makes requests and receives responses from a *remote service*. This process is enacted and managed by the *orchestrator*.\n- **Orchestrator**: The code within an *SDK client* that handles the process of making requests and receiving responses from *remote services*. The orchestrator is configurable by modifying the *runtime plugins* it's built from. The orchestrator is responsible for calling *interceptors* at the appropriate times in the *request/response lifecycle*.\n- **Interceptor**/**Hook**: A generic extension point within the *orchestrator*. Supports \"anything that someone should be able to do\", NOT \"anything anyone might want to do\". These hooks are:\n    - Either **read-only** or **read/write**.\n    - Able to read and modify the **Input**, **Transport Request**, **Transport Response**, or **Output** messages.\n- **Runtime Plugin**: Runtime plugins are similar to interceptors, but they act on configuration instead of requests and response. Both users and services may define runtime plugins. Smithy also defines several default runtime plugins used by most clients. See the F.A.Q. for a list of plugins with descriptions.\n- **ConfigBag**: A `typemap` that's equivalent to [`http::Extensions`](https://docs.rs/http/latest/http/struct.Extensions.html). Used to store configuration for the orchestrator.\n\n## The user experience if this RFC is implemented\n\nFor many users, the changes described by this RFC will be invisible. Making a request with an orchestrator-based SDK client looks very similar to the way requests were made pre-RFC:\n\n```rust,ignore\nlet sdk_config = aws_config::load_from_env().await;\nlet client = aws_sdk_s3::Client::new(&sdk_config);\nlet res = client.get_object()\n    .bucket(\"a-bucket\")\n    .key(\"a-file.txt\")\n    .send()\n    .await?;\n\nmatch res {\n    Ok(res) => println!(\"success: {:?}\"),\n    Err(err) => eprintln!(\"failure: {:?}\")\n};\n```\n\nUsers may further configure clients and operations with **runtime plugins**, and they can modify requests and responses with **interceptors**. We'll examine each of these concepts in the following sections.\n\n### Service clients and operations are configured with runtime plugins\n\n> The exact implementation of **runtime plugins** is left for another RFC. That other RFC will be linked here once it's written. To get an idea of what they may look like, see the *\"Layered configuration, stored in type maps\"* section of this RFC.\n\nRuntime plugins construct and modify client configuration. Plugin initialization is the first step of sending a request, and plugins set in later steps can override the actions of earlier plugins. Plugin ordering is deterministic and non-customizable.\n\nWhile AWS services define a default set of plugins, users may define their own plugins, and set them by calling the appropriate methods on a service's config, client, or operation. Plugins are specifically meant for constructing service and operation configuration. If a user wants to define behavior that should occur at specific points in the *request/response lifecycle*, then they should instead consider defining an *interceptor*.\n\n### Requests and responses are modified by interceptors\n\nInterceptors are similar to middlewares, in that they are functions that can read and modify request and response state. However, they are more restrictive than middlewares in that they can't modify the \"control flow\" of the request/response lifecycle. This is intentional. Interceptors can be registered on a client or operation, and the orchestrator is responsible for calling interceptors at the appropriate time. Users MUST NOT perform blocking IO within an interceptor. Interceptors are sync, and are not intended to perform large amounts of work. This makes them easier to reason about and use. Depending on when they are called, interceptors may read and modify *input messages*, *transport request messages*, *transport response messages*, and *output messages*. Additionally, all interceptors may write to a context object that is shared between all interceptors.\n\n#### Currently supported hooks\n\n1. **Read Before Execution *(Read-Only)***: Before anything happens. This is the first\n   thing the SDK calls during operation execution.\n1. **Modify Before Serialization *(Read/Write)***: Before the input message given by\n   the customer is marshalled into a transport request message. Allows modifying the\n   input message.\n1. **Read Before Serialization *(Read-Only)***: The last thing the SDK calls before\n   marshaling the input message into a transport message.\n1. **Read After Serialization *(Read-Only)***: The first thing the SDK calls after marshaling the input message into a transport message.\n1. *(Retry Loop)*\n    1. **Modify Before Retry Loop *(Read/Write)***: The last thing the SDK calls before entering the retry look. Allows modifying the transport message.\n    1. **Read Before Attempt *(Read-Only)***: The first thing the SDK calls “inside” of the retry loop.\n    1. **Modify Before Signing *(Read/Write)***: Before the transport request message is signed. Allows modifying the transport message.\n    1. **Read Before Signing *(Read-Only)***: The last thing the SDK calls before signing the transport request message.\n    1. **Read After Signing (Read-Only)****: The first thing the SDK calls after signing the transport request message.\n    1. **Modify Before Transmit *(Read/Write)***: Before the transport request message is sent to the service. Allows modifying the transport message.\n    1. **Read Before Transmit *(Read-Only)***: The last thing the SDK calls before sending the transport request message.\n    1. **Read After Transmit *(Read-Only)***: The last thing the SDK calls after receiving the transport response message.\n    1. **Modify Before Deserialization *(Read/Write)***: Before the transport response message is unmarshaled. Allows modifying the transport response message.\n    1. **Read Before Deserialization *(Read-Only)***: The last thing the SDK calls before unmarshalling the transport response message into an output message.\n    1. **Read After Deserialization *(Read-Only)***: The last thing the SDK calls after unmarshaling the transport response message into an output message.\n    1. **Modify Before Attempt Completion *(Read/Write)***: Before the retry loop ends. Allows modifying the unmarshaled response (output message or error).\n    1. **Read After Attempt *(Read-Only)***: The last thing the SDK calls “inside” of the retry loop.\n1. **Modify Before Execution Completion *(Read/Write)***: Before the execution ends. Allows modifying the unmarshaled response (output message or error).\n1. **Read After Execution *(Read-Only)***: After everything has happened. This is the last thing the SDK calls during operation execution.\n\n### Interceptor context\n\nAs mentioned above, interceptors may read/write a context object that is shared between all interceptors:\n\n```rust,ignore\npub struct InterceptorContext<ModReq, TxReq, TxRes, ModRes> {\n    // a.k.a. the input message\n    modeled_request: ModReq,\n    // a.k.a. the transport request message\n    tx_request: Option<TxReq>,\n    // a.k.a. the output message\n    modeled_response: Option<ModRes>,\n    // a.k.a. the transport response message\n    tx_response: Option<TxRes>,\n    // A type-keyed map\n    properties: SharedPropertyBag,\n}\n```\n\nThe optional request and response types in the interceptor context can only be accessed by interceptors that are run after specific points in the *request/response lifecycle*. Rather than go into depth in this RFC, I leave that to a future \"Interceptors RFC.\"\n\n## How to implement this RFC\n\n### Integrating with the orchestrator\n\nImagine we have some sort of request signer. This signer doesn't refer to any orchestrator types. All it needs is a `HeaderMap` along with two strings, and will return a signature in string form.\n\n```rust,ignore\nstruct Signer;\n\nimpl Signer {\n    fn sign(headers: &http::HeaderMap, signing_name: &str, signing_region: &str) -> String {\n        todo!()\n    }\n}\n```\n\nNow imagine things from the orchestrator's point of view. It requires something that implements an `AuthOrchestrator` which will be responsible for resolving the correct auth\nscheme, identity, and signer for an operation, as well as signing the request\n\n```rust,ignore\npub trait AuthOrchestrator<Req>: Send + Sync + Debug {\n    fn auth_request(&self, req: &mut Req, cfg: &ConfigBag) -> Result<(), BoxError>;\n}\n\n// And it calls that `AuthOrchestrator` like so:\nfn invoke() {\n    // code omitted for brevity\n\n    // Get the request to be signed\n    let tx_req_mut = ctx.tx_request_mut().expect(\"tx_request has been set\");\n    // Fetch the auth orchestrator from the bag\n    let auth_orchestrator = cfg\n        .get::<Box<dyn AuthOrchestrator<Req>>>()\n        .ok_or(\"missing auth orchestrator\")?;\n    // Auth the request\n    auth_orchestrator.auth_request(tx_req_mut, cfg)?;\n\n    // code omitted for brevity\n}\n```\n\nThe specific implementation of the `AuthOrchestrator` is what brings these two things together:\n\n```rust,ignore\nstruct Sigv4AuthOrchestrator;\n\nimpl AuthOrchestrator for Sigv4AuthOrchestrator {\n    fn auth_request(&self, req: &mut http::Request<SdkBody>, cfg: &ConfigBag) -> Result<(), BoxError> {\n        let signer = Signer;\n        let signing_name = cfg.get::<SigningName>().ok_or(Error::MissingSigningName)?;\n        let signing_region = cfg.get::<SigningRegion>().ok_or(Error::MissingSigningRegion)?;\n        let headers = req.headers_mut();\n\n        let signature = signer.sign(headers, signing_name, signing_region);\n        match cfg.get::<SignatureLocation>() {\n            Some(SignatureLocation::Query) => req.query.set(\"sig\", signature),\n            Some(SignatureLocation::Header) => req.headers_mut().insert(\"sig\", signature),\n            None => return Err(Error::MissingSignatureLocation),\n        };\n\n        Ok(())\n    }\n}\n```\n\nThis intermediate code should be free from as much logic as possible. Whenever possible, we must maintain this encapsulation. Doing so will make the Orchestrator more flexible, maintainable, and understandable.\n\n### Layered configuration, stored in type maps\n\n> **Type map**: A data structure where stored values are keyed by their type. Hence, only one value can be stored for a given type.\n>\n> *See [typemap](https://docs.rs/typemap), [type-map](https://docs.rs/crate/type-map), [http::Extensions](https://docs.rs/http/latest/http/struct.Extensions.html), and [actix_http::Extensions](https://docs.rs/actix-http/latest/actix_http/struct.Extensions.html) for examples.*\n\n```rust,ignore\n let conf: ConfigBag = aws_config::from_env()\n    // Configuration can be common to all smithy clients\n    .with(RetryConfig::builder().disable_retries().build())\n    // Or, protocol-specific\n    .with(HttpClient::builder().build())\n    // Or, AWS-specific\n    .with(Region::from(\"us-east-1\"))\n    // Or, service-specific\n    .with(S3Config::builder().force_path_style(false).build())\n    .await;\n\nlet client = aws_sdk_s3::Client::new(&conf);\n\nclient.list_buckets()\n    .customize()\n    // Configuration can be set on operations as well as clients\n    .with(HttpConfig::builder().conn(some_other_conn).build())\n    .send()\n    .await;\n```\n\nSetting configuration that will not be used wastes memory and can make debugging more difficult. Therefore, configuration defaults are only set when they're relevant. For example, if a smithy service doesn't support HTTP, then no HTTP client will be set.\n\n#### What is \"layered\" configuration?\n\nConfiguration has precedence. Configuration set on an operation will override configuration set on a client, and configuration set on a client will override default configuration. However, configuration with a higher precedence can also augment configuration with a lower precedence. For example:\n\n```rust,ignore\nlet conf: ConfigBag = aws_config::from_env()\n    .with(\n        SomeConfig::builder()\n            .option_a(1)\n            .option_b(2)\n            .option_c(3)\n    )\n    .build()\n    .await;\n\nlet client = aws_sdk_s3::Client::new(&conf);\n\nclient.list_buckets()\n    .customize()\n    .with(\n        SomeConfig::builder()\n            .option_a(0)\n            .option_b(Value::Inherit)\n            .option_c(Value::Unset)\n    )\n    .build()\n    .send()\n    .await;\n```\n\nIn the above example, when the `option_a`, `option_b`, `option_c`, values of `SomeConfig` are accessed, they'll return:\n\n- `option_a`: `0`\n- `option_b`: `2`\n- `option_c`: No value\n\nConfig values are wrapped in a special enum called `Value` with three variants:\n\n- `Value::Set`: A set value that will override values from lower layers.\n- `Value::Unset`: An explicitly unset value that will override values from lower layers.\n- `Value::Inherit`: An explicitly unset value that will inherit a value from a lower layer.\n\nBuilders are defined like this:\n\n```rust,ignore\nstruct SomeBuilder {\n    value: Value<T>,\n}\n\nimpl struct SomeBuilder<T> {\n    fn new() -> Self {\n        // By default, config values inherit from lower-layer configs\n        Self { value: Value::Inherit }\n    }\n\n    fn some_field(&mut self, value: impl Into<Value<T>>) -> &mut self {\n        self.value = value.into();\n        self\n    }\n}\n```\n\nBecause of `impl Into<Value<T>>`, users don't need to reference the `Value` enum unless they want to \"unset\" a value.\n\n#### Layer separation and precedence\n\nCodegen defines default sets of interceptors and runtime plugins at various \"levels\":\n\n1. AWS-wide defaults set by codegen.\n1. Service-wide defaults set by codegen.\n1. Operation-specific defaults set by codegen.\n\nLikewise, users may mount their own interceptors and runtime plugins:\n\n1. The AWS config level, e.g. `aws_types::Config`.\n1. The service config level, e.g. `aws_sdk_s3::Config`.\n1. The operation config level, e.g. `aws_sdk_s3::Client::get_object`.\n\nConfiguration is resolved in a fixed manner by reading the \"lowest level\" of config available, falling back to \"higher levels\" only when no value has been set. Therefore, at least 3 separate `ConfigBag`s are necessary, and user configuration has precedence over codegen-defined default configuration. With that in mind, resolution of configuration would look like this:\n\n1. Check user-set operation config.\n1. Check codegen-defined operation config.\n1. Check user-set service config.\n1. Check codegen-defined service config.\n1. Check user-set AWS config.\n1. Check codegen-defined AWS config.\n\n### The `aws-smithy-orchestrator` crate\n\n*I've omitted some of the error conversion to shorten this example and make it easier to understand. The real version will be messier.*\n\n```rust,ignore\n/// `In`: The input message e.g. `ListObjectsRequest`\n/// `Req`: The transport request message e.g. `http::Request<SmithyBody>`\n/// `Res`: The transport response message e.g. `http::Response<SmithyBody>`\n/// `Out`: The output message. A `Result` containing either:\n///     - The 'success' output message e.g. `ListObjectsResponse`\n///     - The 'failure' output message e.g. `NoSuchBucketException`\npub async fn invoke<In, Req, Res, T>(\n    input: In,\n    interceptors: &mut Interceptors<In, Req, Res, Result<T, BoxError>>,\n    runtime_plugins: &RuntimePlugins,\n    cfg: &mut ConfigBag,\n) -> Result<T, BoxError>\n    where\n        // The input must be Clone in case of retries\n        In: Clone + 'static,\n        Req: 'static,\n        Res: 'static,\n        T: 'static,\n{\n    let mut ctx: InterceptorContext<In, Req, Res, Result<T, BoxError>> =\n        InterceptorContext::new(input);\n\n    runtime_plugins.apply_client_configuration(cfg)?;\n    interceptors.client_read_before_execution(&ctx, cfg)?;\n\n    runtime_plugins.apply_operation_configuration(cfg)?;\n    interceptors.operation_read_before_execution(&ctx, cfg)?;\n\n    interceptors.read_before_serialization(&ctx, cfg)?;\n    interceptors.modify_before_serialization(&mut ctx, cfg)?;\n\n    let request_serializer = cfg\n        .get::<Box<dyn RequestSerializer<In, Req>>>()\n        .ok_or(\"missing serializer\")?;\n    let req = request_serializer.serialize_request(ctx.modeled_request_mut(), cfg)?;\n    ctx.set_tx_request(req);\n\n    interceptors.read_after_serialization(&ctx, cfg)?;\n    interceptors.modify_before_retry_loop(&mut ctx, cfg)?;\n\n    loop {\n        make_an_attempt(&mut ctx, cfg, interceptors).await?;\n        interceptors.read_after_attempt(&ctx, cfg)?;\n        interceptors.modify_before_attempt_completion(&mut ctx, cfg)?;\n\n        let retry_strategy = cfg\n            .get::<Box<dyn RetryStrategy<Result<T, BoxError>>>>()\n            .ok_or(\"missing retry strategy\")?;\n        let mod_res = ctx\n            .modeled_response()\n            .expect(\"it's set during 'make_an_attempt'\");\n        if retry_strategy.should_retry(mod_res, cfg)? {\n            continue;\n        }\n\n        interceptors.modify_before_completion(&mut ctx, cfg)?;\n        let trace_probe = cfg\n            .get::<Box<dyn TraceProbe>>()\n            .ok_or(\"missing trace probes\")?;\n        trace_probe.dispatch_events(cfg);\n        interceptors.read_after_execution(&ctx, cfg)?;\n\n        break;\n    }\n\n    let (modeled_response, _) = ctx.into_responses()?;\n    modeled_response\n}\n\n// Making an HTTP request can fail for several reasons, but we still need to\n// call lifecycle events when that happens. Therefore, we define this\n// `make_an_attempt` function to make error handling simpler.\nasync fn make_an_attempt<In, Req, Res, T>(\n    ctx: &mut InterceptorContext<In, Req, Res, Result<T, BoxError>>,\n    cfg: &mut ConfigBag,\n    interceptors: &mut Interceptors<In, Req, Res, Result<T, BoxError>>,\n) -> Result<(), BoxError>\n    where\n        In: Clone + 'static,\n        Req: 'static,\n        Res: 'static,\n        T: 'static,\n{\n    interceptors.read_before_attempt(ctx, cfg)?;\n\n    let tx_req_mut = ctx.tx_request_mut().expect(\"tx_request has been set\");\n    let endpoint_orchestrator = cfg\n        .get::<Box<dyn EndpointOrchestrator<Req>>>()\n        .ok_or(\"missing endpoint orchestrator\")?;\n    endpoint_orchestrator.resolve_and_apply_endpoint(tx_req_mut, cfg)?;\n\n    interceptors.modify_before_signing(ctx, cfg)?;\n    interceptors.read_before_signing(ctx, cfg)?;\n\n    let tx_req_mut = ctx.tx_request_mut().expect(\"tx_request has been set\");\n    let auth_orchestrator = cfg\n        .get::<Box<dyn AuthOrchestrator<Req>>>()\n        .ok_or(\"missing auth orchestrator\")?;\n    auth_orchestrator.auth_request(tx_req_mut, cfg)?;\n\n    interceptors.read_after_signing(ctx, cfg)?;\n    interceptors.modify_before_transmit(ctx, cfg)?;\n    interceptors.read_before_transmit(ctx, cfg)?;\n\n    // The connection consumes the request but we need to keep a copy of it\n    // within the interceptor context, so we clone it here.\n    let res = {\n        let tx_req = ctx.tx_request_mut().expect(\"tx_request has been set\");\n        let connection = cfg\n            .get::<Box<dyn Connection<Req, Res>>>()\n            .ok_or(\"missing connector\")?;\n        connection.call(tx_req, cfg).await?\n    };\n    ctx.set_tx_response(res);\n\n    interceptors.read_after_transmit(ctx, cfg)?;\n    interceptors.modify_before_deserialization(ctx, cfg)?;\n    interceptors.read_before_deserialization(ctx, cfg)?;\n    let tx_res = ctx.tx_response_mut().expect(\"tx_response has been set\");\n    let response_deserializer = cfg\n        .get::<Box<dyn ResponseDeserializer<Res, Result<T, BoxError>>>>()\n        .ok_or(\"missing response deserializer\")?;\n    let res = response_deserializer.deserialize_response(tx_res, cfg)?;\n    ctx.set_modeled_response(res);\n\n    interceptors.read_after_deserialization(ctx, cfg)?;\n\n    Ok(())\n}\n```\n\n#### Traits\n\nAt various points in the execution of `invoke`, trait objects are fetched from the `ConfigBag`. These are preliminary definitions of those traits:\n\n```rust,ignore\npub trait TraceProbe: Send + Sync + Debug {\n    fn dispatch_events(&self, cfg: &ConfigBag) -> BoxFallibleFut<()>;\n}\n\npub trait RequestSerializer<In, TxReq>: Send + Sync + Debug {\n    fn serialize_request(&self, req: &mut In, cfg: &ConfigBag) -> Result<TxReq, BoxError>;\n}\n\npub trait ResponseDeserializer<TxRes, Out>: Send + Sync + Debug {\n    fn deserialize_response(&self, res: &mut TxRes, cfg: &ConfigBag) -> Result<Out, BoxError>;\n}\n\npub trait Connection<TxReq, TxRes>: Send + Sync + Debug {\n    fn call(&self, req: &mut TxReq, cfg: &ConfigBag) -> BoxFallibleFut<TxRes>;\n}\n\npub trait RetryStrategy<Out>: Send + Sync + Debug {\n    fn should_retry(&self, res: &Out, cfg: &ConfigBag) -> Result<bool, BoxError>;\n}\n\npub trait AuthOrchestrator<Req>: Send + Sync + Debug {\n    fn auth_request(&self, req: &mut Req, cfg: &ConfigBag) -> Result<(), BoxError>;\n}\n\npub trait EndpointOrchestrator<Req>: Send + Sync + Debug {\n    fn resolve_and_apply_endpoint(&self, req: &mut Req, cfg: &ConfigBag) -> Result<(), BoxError>;\n    fn resolve_auth_schemes(&self) -> Result<Vec<String>, BoxError>;\n}\n```\n\n## F.A.Q.\n\n- The orchestrator is a large and complex feature, with many moving parts. How can we ensure that multiple people can contribute in parallel?\n  - By defining the entire orchestrator and agreeing on its structure, we can then move on to working on individual runtime plugins and interceptors.\n- What is the precedence of interceptors?\n    - The precedence of interceptors is as follows:\n        - Interceptors registered via Smithy default plugins.\n        - *(AWS Services only)* Interceptors registered via AWS default plugins.\n        - Interceptors registered via service-customization plugins.\n        - Interceptors registered via client-level plugins.\n        - Interceptors registered via client-level configuration.\n        - Interceptors registered via operation-level plugins.\n        - Interceptors registered via operation-level configuration.\n- What runtime plugins will be defined in `smithy-rs`?\n    - `RetryStrategy`: Configures how requests are retried.\n    - `TraceProbes`: Configures locations to which SDK metrics are published.\n    - `EndpointProviders`: Configures which hostname an SDK will call when making a request.\n    - `HTTPClients`: Configures how remote services are called.\n    - `IdentityProviders`: Configures how customers identify themselves to remote services.\n    - `HTTPAuthSchemes` & `AuthSchemeResolvers`: Configures how customers authenticate themselves to remote services.\n    - `Checksum Algorithms`: Configures how an SDK calculates request and response checksums.\n\n## Changes checklist\n\n- [x] Create a new `aws-smithy-runtime` crate.\n  - Add orchestrator implementation\n  - Define the orchestrator/runtime plugin interface traits\n    - `TraceProbe`\n    - `RequestSerializer<In, TxReq>`\n    - `ResponseDeserializer<TxRes, Out>`\n    - `Connection<TxReq, TxRes>`\n    - `RetryStrategy<Out>`\n    - `AuthOrchestrator<Req>`\n    - `EndpointOrchestrator<Req>`\n- [x] Create a new `aws-smithy-runtime-api` crate.\n  - Add `ConfigBag` module\n  - Add `retries` module\n    - Add `rate_limiting` sub-module\n  - Add `interceptors` module\n    - `Interceptor` trait\n    - `InterceptorContext` impl\n  - Add `runtime_plugins` module\n- [x] Create a new integration test that ensures the orchestrator works.\n"
  },
  {
    "path": "design/src/rfcs/rfc0035_collection_defaults.md",
    "content": "<!-- Give your RFC a descriptive name saying what it would accomplish or what feature it defines -->\nRFC: Collection Defaults\n=============\n\n<!-- RFCs start with the \"RFC\" status and are then either \"Implemented\" or \"Rejected\".  -->\n> Status: Implemented\n>\n> Applies to: client\n\n<!-- A great RFC will include a list of changes at the bottom so that the implementor can be sure they haven't missed anything -->\nFor a summarized list of proposed changes, see the [Changes Checklist](#changes-checklist) section.\n\n<!-- Insert a short paragraph explaining, at a high level, what this RFC is for -->\nThis RFC proposes a **breaking change** to how generated clients automatically provide default values for collections. Currently the SDK generated fields for `List` generate optional values:\n```rust,ignore\n    /// <p> Container for elements related to a particular part.\n    pub fn parts(&self) -> Option<&[crate::types::Part]> {\n        self.parts.as_deref()\n    }\n```\nThis is _almost never_ what users want and leads to code noise when using collections:\n```rust,ignore\nasync fn get_builds() {\n    let project = codebuild\n        .list_builds_for_project()\n        .project_name(build_project)\n        .send()\n        .await?;\n    let build_ids = project\n        .ids()\n        .unwrap_or_default();\n    //  ^^^^^^^^^^^^^^^^^^ this is pure noise\n}\n```\n\nThis RFC proposes unwrapping into default values in our accessor methods.\n\n<!-- The \"Terminology\" section is optional but is really useful for defining the technical terms you're using in the RFC -->\nTerminology\n-----------\n\n- **Accessor**: The Rust SDK defines accessor methods on modeled structures for fields to make them more convenient for users\n- **Struct field**: The accessors point to concrete fields on the struct itself.\n\n<!-- Explain how users will use this new feature and, if necessary, how this compares to the current user experience -->\nThe user experience if this RFC is implemented\n----------------------------------------------\n\nIn the current version of the SDK, users must call `.unwrap_or_default()` frequently.\nOnce this RFC is implemented, users will be able to use these accessors directly. In the rare case where users need to\ndistinguish be `None` and `[]`, we will direct users towards `model.<field>.is_some()`.\n\n```rust,ignore\nasync fn get_builds() {\n    let project = codebuild\n        .list_builds_for_project()\n        .project_name(build_project)\n        .send()\n        .await?;\n    let build_ids = project.ids();\n    // Goodbye to this line:\n    //    .unwrap_or_default();\n}\n```\n\n<!-- Explain the implementation of this new feature -->\nHow to actually implement this RFC\n----------------------------------\n\nIn order to implement this feature, we need update the code generate accessors for lists and maps to add `.unwrap_or_default()`. Because we are returning slices `unwrap_or_default()` does not produce any additional allocations for empty collection.\n\n### Could this be implemented for `HashMap`?\nThis works for lists because we are returning a slice (allowing a statically owned `&[]` to be returned.) If we want to support HashMaps in the future this _is_ possible by using `OnceCell` to create empty HashMaps for requisite types. This would allow us to return references to those empty maps.\n\n### Isn't this handled by the default trait?\nNo, many existing APIs don't have the default trait.\n<!-- Include a checklist of all the things that need to happen for this RFC's implementation to be considered complete -->\nChanges checklist\n-----------------\nEstimated total work: 2 days\n- [x] Update accessor method generation to auto flatten lists\n- [x] Update docs for accessors to guide users to `.field.is_some()` if they MUST determine if the field was set.\n"
  },
  {
    "path": "design/src/rfcs/rfc0036_http_dep_elimination.md",
    "content": "<!-- Give your RFC a descriptive name saying what it would accomplish or what feature it defines -->\nRFC: Eliminating Public `http` dependencies\n=============\n\n> Status: Accepted\n>\n> Applies to: client\n\n<!-- A great RFC will include a list of changes at the bottom so that the implementor can be sure they haven't missed anything -->\nFor a summarized list of proposed changes, see the [Changes Checklist](#changes-checklist) section.\n\n<!-- Insert a short paragraph explaining, at a high level, what this RFC is for -->\nThis RFC defines how we plan to refactor the SDK to allow the SDK to consume a `1.0` version of `hyper`, `http-body`,\nand `http` at a later date. Currently, `hyper` is `0.14.x` and a `1.0` release candidate series is in progress. However,\nthere are [open questions](https://github.com/orgs/hyperium/projects/1/views/4) that may significantly delay the launch\nof\nthese three crates. We do not want to tie the `1.0` of the Rust SDK to these crates.\n\n<!-- The \"Terminology\" section is optional but is really useful for defining the technical terms you're using in the RFC -->\nTerminology\n-----------\n\n- **http-body**: A crate (and trait) defining how HTTP bodies work. Notably, the change from `0.*` to `1.0` changes `http-body`\n  to operate on frames instead of having separate methods.\n- `http` (crate): a low level crate of `http` primitives (no logic, just requests and responses)\n- ossified dependency: An ossified dependency describes a dependency that, when a new version is released, cannot be utilized without breaking changes. For example, if the `mutate_request` function on every operation operates on `&mut http::Request` where `http = 0.2`, that dependency is \"ossified.\" Compare this to a function that offers the ability to convert something into an `http = 0.2` request—since http=1 and http=0.2 are largely equivalent, the\n  existence of this function does not prevent us from using http = 1 in the future. In general terms, **functions that operate on references are much more likely to ossify**—There is no practical way for someone to mutate an `http = 0.2` request if you have an `http = 1` request other than a time-consuming clone, and reconversion process.\n\n<!-- Explain how users will use this new feature and, if necessary, how this compares to the current user experience -->\n\n## Why is this important?\n\n**Performance**:\nAt some point in the Future, `hyper = 1`, `http = 1` and `http-body = 1` will be released. It takes ~1-2 microseconds to rebuild an HTTP request. If we assume that `hyper = 1` will only operate on `http = 1` requests, then if we can't use `http = 1` requests internally, our only way of supporting `hyper = 1` will be to convert the HTTP request at dispatch time. Besides pinning us to a potentially unsupported version of the HTTP crate, this will prevent us from directly dispatching requests in an efficient manner. With a total overhead of 20µs for the SDK, 1µs is not insignificant. Furthermore, it grows as the number of request headers grow. A benchmark should be run for a realistic HTTP request e.g. one that we send to S3.\n\n**Hyper Upgrade**:\nHyper 1 is significantly more flexible than Hyper 0.14.x, especially WRT to connection management & pooling. If we don't make these changes, the upgrade to Hyper 1.x could be significantly more challenging.\n\n**Security Fixes**:\nIf we're still on `http = 0.*` and a vulnerability is identified, we may end up needing to manually contribute the patch. The `http` crate is not trivial and contains parsing logic and optimized code (including a non-trivial amount of `unsafe`). [See this GitHub issue](https://github.com/hyperium/http/issues/412). Notable is that one issue may be unsound and result in changing the public API.\n\n**API Friendliness**\nIf we ship with an API that public exposes customers to `http = 0.*`, we have the API forever. We have to consider that we aren't shipping the Rust SDK for this month or even this year but probably the Rust SDK for the next 5-10 years.\n\n**Future CRT Usage**\nIf we make this change, we enable a future where we can use the CRT HTTP request type natively without needing a last minute conversion to the CRT HTTP Request type.\n```rust,ignore\nstruct HttpRequest {\n  inner: Inner\n}\n\nenum Inner {\n  Httpv0(http_0::Request),\n  Httpv1(http_1::Request),\n  Crt(aws_crt_http::Request)\n}\n```\n\nThe user experience if this RFC is implemented\n----------------------------------------------\nCustomers are impacted in 3 main locations:\n1. HTTP types in Interceptors\n2. HTTP types in `customize(...)`\n3. HTTP types in Connectors\n\nIn all three of these cases, users would interact with our `http` wrapper types instead.\n\n\nIn the current version of the SDK, we expose public dependencies on the `http` crate in several key places:\n\n1. The `sigv4` crate. The `sigv4` crate currently operates directly on many types from the `http` crate. This is unnecessary and actually makes the crate more difficult to use. Although `http` may be used internally, `http` will be removed from the public API of this crate.\n2. Interceptor Context: `interceptor`s can mutate the HTTP request through an unshielded interface. This requires creating a [wrapper layer around `http::Request`](#http-request-wrapper) and updating already written interceptors.\n3. `aws-config`: `http::Response` and `uri`\n4. A long tail of exposed requests and responses in the runtime crates. Many of these crates will be removed post-orchestrator so this can be temporarily delayed.\n\n<!-- Explain the implementation of this new feature -->\nHow to actually implement this RFC\n----------------------------------\n\n### Enabling API evolution\nOne key mechanism that we SHOULD use for allowing our APIs to evolve in the future is usage of `~` version bounds for the runtime crates after releasing 1.0.\n\n### Http Request Wrapper\n\nIn order to enable HTTP evolution, we will create a set of wrapper structures around `http::Request` and `http::Response`. These will use `http = 0` internally. Since the HTTP crate itself is quite small, including private dependencies on both versions of the crate is a workable solution. In general, we will aim for an API that is close to drop-in compatible to the HTTP crate while ensuring that a different crate could be used as the backing storage.\n\n```rust,ignore\n// since it's our type, we can default `SdkBody`\npub struct Request<B = SdkBody> {\n    // this uses the http = 0.2 request. In the future, we can make an internal enum to allow storing an http = 1\n    http_0: http::Request<B>\n}\n```\n\n**Conversion to/from `http::Request`**\nOne key property here is that although converting to/from an `http::Request` **can** be expensive, this is *not* ossification of the API. This is because the API can support converting from/to both `http = 0` and `http = 1` in the future—because it offers mutation of the request via a unified interface, the request would only need to be converted once for dispatch if there was a mismatch (instead of repeatedly). At some point in the future, the `http = 0` representation could be deprecated and removed or feature gated.\n\n**Challenges**\n1. Creating an HTTP API which is forwards compatible, idiomatic and \"truthful\" without relying on existing types from Hyper—e.g. when adding a header, we need to account for the possibility that a header is invalid.\n2. Allow for future forwards-compatible evolution in the API—A lot of thought went into the `http` crate API w.r.t method parameters, types, and generics. Although we can aim for a simpler solution in some cases (e.g. accepting `&str` instead of `HeaderName`), we need to be careful that we do so while allowing API evolution.\n\n### Removing the SigV4 HTTP dependency\nThe SigV4 crate signs a number of `HTTP` types directly. We should change it to accept strings, and when appropriate, iterators of strings for headers.\n\n### Removing the HTTP dependency from generated clients\nGenerated clients currently include a public HTTP dependency in `customize`. This should be changed to accept our `HTTP` wrapper type instead or be restricted to a subset of operations (e.g. `add_header`) while forcing users to add an interceptor if they need full control.\n\n\n<!-- Include a checklist of all the things that need to happen for this RFC's implementation to be considered complete -->\nChanges checklist\n-----------------\n\n- [ ] Create the `http::Request` wrapper. Carefully audit for compatibility without breaking changes. 5 Days.\n- [ ] Refactor currently written interceptors to use the wrapper: 2 days.\n- [ ] Refactor the SigV4 crate to remove the HTTP dependency from the public interface: 2 days.\n- [ ] Add / validate support for SdkBody `http-body = 1.0rc.2` either in a PR or behind a feature gate. Test this to\n  ensure it works with Hyper. Some previous work here exists: 1 week\n- [ ] Remove `http::Response` and `Uri` from the public exposed types in `aws-config`: 1-4 days.\n- [ ] Long tail of other usages: 1 week\n- [ ] Implement `~` versions for SDK Crate => runtime crate dependencies: 1 week\n"
  },
  {
    "path": "design/src/rfcs/rfc0037_http_wrapper.md",
    "content": "<!-- Give your RFC a descriptive name saying what it would accomplish or what feature it defines -->\nRFC: The HTTP Wrapper Type\n=============\n\n<!-- RFCs start with the \"RFC\" status and are then either \"Implemented\" or \"Rejected\".  -->\n> Status: RFC\n>\n> Applies to: client\n\n<!-- A great RFC will include a list of changes at the bottom so that the implementor can be sure they haven't missed anything -->\nFor a summarized list of proposed changes, see the [Changes Checklist](#changes-checklist) section.\n\n<!-- Insert a short paragraph explaining, at a high level, what this RFC is for -->\nThis RFC defines the API of our wrapper types around `http::Request` and `http::Response`. For more information about why we are wrapping these types, see [RFC 0036: The HTTP Dependency](./rfc0036_http_dep_elimination.md).\n\n<!-- The \"Terminology\" section is optional but is really useful for defining the technical terms you're using in the RFC -->\nTerminology\n-----------\n- `Extensions` / \"Request Extensions\": The `http` crate Request/Response types include a typed property bag to store additional metadata along with the request.\n\n<!-- Explain how users will use this new feature and, if necessary, how this compares to the current user experience -->\nThe user experience if this RFC is implemented\n----------------------------------------------\n\nIn the current version of the SDK, external customers and internal code interacts directly with the [`http`](https://crates.io/crates/http) crate. Once this RFC is implemented, interactions at the **public** API level will occur with our own `http` types instead.\n\nOur types aim to be nearly drop-in-compatible for types in the `http` crate, however:\n1. We will not expose existing HTTP types in public APIs in ways that are ossified.\n2. When possible, we aim to simplify the APIs to make them easier to use.\n3. We will add SDK specific helper functionality when appropriate, e.g. first-level support for applying an endpoint to a request.\n\n<!-- Explain the implementation of this new feature -->\nHow to actually implement this RFC\n----------------------------------\n\nWe will need to add two types, `HttpRequest` and `HttpResponse`.\n\n#### To string or not to String\nOur header library restricts header names and values to `String`s (UTF-8).\n\nAlthough the `http` library is very precise in its representation—it allows for `HeaderValue`s that are both a super and subset of `String`—a superset because headers support arbitrary binary data but a subset because headers cannot contain control characters like `\\n`.\n\nAlthough technically allowed, headers containing arbitrary binary data are not widely supported. Generally, Smithy protocols will use base-64 encoding when storing binary data in headers.\n\nFinally, it's nicer for users if they can stay in \"string land\". Because of this, HttpRequest and Response expose header names and values as strings. Internally, the current design uses `HeaderName` and `HeaderValue`, however, there is a gate on construction that enforces that values are valid UTF-8.\n\n**This is a one way door because `.as_str()` would panic in the future if we allow non-string values into headers.**\n\n#### Where should these types live?\nThese types will be used by all orchestrator functionality, so they will be housed in `aws-smithy-runtime-api`\n\n#### What's in and what's out?\nAt the onset, these types focus on supporting the most ossified usages: `&mut` modification of HTTP types. They **do not**\nsupport construction of HTTP types, other than `impl From<http::Request>` and `From<http::Response>`. We will also make it\npossible to use `http::HeaderName` / `http::HeaderValue` in a zero-cost way.\n\n#### The `AsHeaderComponent` trait\nAll header insertion methods accept `impl AsHeaderComponent`. This allows us to provide a nice user experience while taking\nadvantage of zero-cost usage of `'static str`. We will seal this trait to prevent external usage. We will have separate implementation for:\n- `&'static str`\n- `String`\n- http02x::HeaderName\n\n#### Additional Functionality\nOur wrapper type will add the following additional functionality:\n\n1. Support for `self.try_clone()`\n2. Support for `&mut self.apply_endpoint(...)`\n\n#### Handling failure\nThere is no stdlib type that cleanly defines what may be placed into headers—String is too broad (even if we restrict to ASCII). This RFC proposes moving fallibility to the APIs:\n```rust,ignore\nimpl HeadersMut<'_> {\n    pub fn try_insert(\n        &mut self,\n        key: impl AsHeaderComponent,\n        value: impl AsHeaderComponent,\n    ) -> Result<Option<String>, BoxError> {\n        // ...\n    }\n}\n```\n\nThis allows us to offer user-friendly types while still avoiding runtime panics. We also offer `insert` and `append` which panic on invalid values.\n\n#### Request Extensions\nThere is ongoing work which MAY restrict HTTP extensions to clone types. We will preempt that by:\n1. Preventing `Extensions` from being present when initially constructing our HTTP request wrapper.\n2. Forbidding non-clone extensions from being inserted into the wrapped request.\n\nThis also enables supporting request extensions for different downstream providers by allowing cloning into different extension types.\n\n#### Proposed Implementation\n<details>\n<summary>Proposed Implementation of `request`</summary>\n\n```rust,ignore\n{{#include ../../../rust-runtime/aws-smithy-runtime-api/src/http/request.rs}}\n```\n</details>\n\n### Future Work\nCurrently, the only way to construct `Request` is from a compatible type (e.g. `http02x::Request`)\n\nChanges checklist\n-----------------\n- [x] Implement initial implementation and test it against the SDK as written\n- [ ] Add test suite of `HTTP` wrapper\n- [ ] External design review\n- [x] Update the SigV4 crate to remove `http` API dependency\n- [ ] Update the SDK to use the new type (breaking change)\n"
  },
  {
    "path": "design/src/rfcs/rfc0038_retry_classifier_customization.md",
    "content": "# RFC: User-configurable retry classification\n\n> Status: Implemented\n>\n> Applies to: client\n\nFor a summarized list of proposed changes, see the [Changes Checklist](#changes-checklist) section.\n\nThis RFC defines the user experience and implementation of user-configurable\nretry classification. Custom retry classifiers enable users to change what\nresponses are retried while still allowing them to rely on defaults set by SDK\nauthors when desired.\n## Terminology\n\n- **Smithy Service**: An HTTP service, whose API is modeled with the [Smithy\n  IDL](https://www.smithy.io).\n- **Smithy Client**: An HTTP client generated by smithy-rs from a `.smithy`\n  model file.\n- **AWS SDK**: A **smithy client** that's specifically configured to work with\n  an AWS service.\n- **Operation**: A modeled interaction with a service, defining the proper input\n  and expected output shapes, as well as important metadata related to request\n  construction. \"Sending\" an operation implies sending one or more HTTP requests\n  to a **Smithy service**, and then receiving an output or error in response.\n- **Orchestrator**: The client code which manages the request/response pipeline.\n  The orchestrator is responsible for:\n    - Constructing, serializing, and sending requests.\n    - Receiving, deserializing, and (optionally) retrying requests.\n    - Running interceptors *(not covered in this RFC)* and handling errors.\n- **Runtime Component**: A part of the orchestrator responsible for a specific\n  function. Runtime components are used by the orchestrator itself, may depend\n  on specific configuration, and must not be changed by interceptors. Examples\n  include the endpoint resolver, retry strategy, and request signer.\n- **Runtime Plugin**: Code responsible for setting and **runtime components**\n  and related configuration. Runtime plugins defined by codegen are responsible\n  for setting default configuration and altering the behavior of **Smithy\n  clients** including the **AWS SDKs**.\n\n## How the orchestrator should model retries\n\nA **Retry Strategy** is the process by which the orchestrator determines when\nand how to retry failed requests. Only one retry strategy may be set at any\ngiven time. During its operation, the retry strategy relies on a series of\n**Retry Classifiers** to determine if and how a failed request should be\nretried. Retry classifiers each have a **Retry Classifier Priority** so that\nregardless of whether they are set during config or operation construction,\nthey'll always run in a consistent order.\n\nClassifiers are each run in turn by the retry strategy:\n\n```rust,ignore\npub fn run_classifiers_on_ctx(\n    classifiers: impl Iterator<Item = SharedRetryClassifier>,\n    ctx: &InterceptorContext,\n) -> RetryAction {\n    // By default, don't retry\n    let mut result = RetryAction::NoActionIndicated;\n\n    for classifier in classifiers {\n        let new_result = classifier.classify_retry(ctx);\n\n        // If the result is `NoActionIndicated`, continue to the next classifier\n        // without overriding any previously-set result.\n        if new_result == RetryAction::NoActionIndicated {\n            continue;\n        }\n\n        // Otherwise, set the result to the new result.\n        tracing::trace!(\n            \"Classifier '{}' set the result of classification to '{}'\",\n            classifier.name(),\n            new_result\n        );\n        result = new_result;\n\n        // If the result is `RetryForbidden`, stop running classifiers.\n        if result == RetryAction::RetryForbidden {\n            tracing::trace!(\"retry classification ending early because a `RetryAction::RetryForbidden` was emitted\",);\n            break;\n        }\n    }\n\n    result\n}\n```\n\n*NOTE: User-defined retry strategies are responsible for calling `run_classifiers_on_ctx`.*\n\nLower-priority classifiers run first, but the retry actions they return may be\noverridden by higher-priority classifiers. Classification stops immediately if\nany classifier returns `RetryAction::RetryForbidden`.\n\n## The user experience if this RFC is implemented\n\nIn the current version of the SDK, users are unable to configure retry\nclassification, except by defining a custom retry strategy. Once this RFC is\nimplemented, users will be able to define and set their own classifiers.\n\n### Defining a custom classifier\n\n```rust,ignore\n#[derive(Debug)]\nstruct CustomRetryClassifier;\n\nimpl ClassifyRetry for CustomRetryClassifier {\n    fn classify_retry(\n        &self,\n        ctx: &InterceptorContext,\n    ) -> Option<RetryAction> {\n        // Check for a result\n        let output_or_error = ctx.output_or_error();\n        // Check for an error\n        let error = match output_or_error {\n            // Typically, when the response is OK or unset\n            // then `RetryAction::NoActionIndicated` is returned.\n            Some(Ok(_)) | None => return RetryAction::NoActionIndicated,\n            Some(Err(err)) => err,\n        };\n\n        todo!(\"inspect the error to determine if a retry attempt should be made.\")\n    }\n\n    fn name(&self) -> &'static str { \"my custom retry classifier\" }\n\n    fn priority(&self) -> RetryClassifierPriority {\n        RetryClassifierPriority::default()\n    }\n}\n```\n\n#### Choosing a retry classifier priority\n\nSticking with the default priority is often the best choice. Classifiers should\nrestrict the number of cases they can handle in order to avoid having to compete\nwith other classifiers. When two classifiers would classify a response in two\ndifferent ways, the priority system gives us the ability to decide which\nclassifier should be respected.\n\nInternally, priority is implemented with a simple numeric system. In order to\ngive the smithy-rs team the flexibility to make future changes, this numeric\nsystem is private and inaccessible to users. Instead, users may set the priority\nof classifiers relative to one another with the `with_lower_priority_than` and\n`with_higher_priority_than` methods:\n\n```rust,ignore\nimpl RetryClassifierPriority {\n    /// Create a new `RetryClassifierPriority` with lower priority than the given priority.\n    pub fn with_lower_priority_than(other: Self) -> Self { ... }\n\n    /// Create a new `RetryClassifierPriority` with higher priority than the given priority.\n    pub fn with_higher_priority_than(other: Self) -> Self { ... }\n}\n```\n\nFor example, if it was important for our `CustomRetryClassifier` in the previous\nexample to run *before* the default `HttpStatusCodeClassifier`, a user would\ndefine the `CustomRetryClassifier` priority like this:\n\n```rust,ignore\nimpl ClassifyRetry for CustomRetryClassifier {\n    fn priority(&self) -> RetryClassifierPriority {\n        RetryClassifierPriority::run_before(RetryClassifierPriority::http_status_code_classifier())\n    }\n}\n```\n\nThe priorities of the three default retry classifiers\n(`HttpStatusCodeClassifier`, `ModeledAsRetryableClassifier`, and\n`TransientErrorClassifier`) are all public for this purpose. Users may **ONLY**\nset a retry priority relative to an existing retry priority.\n\n\n#### `RetryAction` and `RetryReason`\n\nRetry classifiers communicate to the retry strategy by emitting `RetryAction`s:\n\n```rust,ignore\n/// The result of running a [`ClassifyRetry`] on a [`InterceptorContext`].\n#[non_exhaustive]\n#[derive(Clone, Eq, PartialEq, Debug, Default)]\npub enum RetryAction {\n    /// When a classifier can't run or has no opinion, this action is returned.\n    ///\n    /// For example, if a classifier requires a parsed response and response parsing failed,\n    /// this action is returned. If all classifiers return this action, no retry should be\n    /// attempted.\n    #[default]\n    NoActionIndicated,\n    /// When a classifier runs and thinks a response should be retried, this action is returned.\n    RetryIndicated(RetryReason),\n    /// When a classifier runs and decides a response must not be retried, this action is returned.\n    ///\n    /// This action stops retry classification immediately, skipping any following classifiers.\n    RetryForbidden,\n}\n```\n\nWhen a retry is indicated by a classifier, the action will contain a `RetryReason`:\n\n```rust,ignore\n/// The reason for a retry.\n#[non_exhaustive]\n#[derive(Clone, Eq, PartialEq, Debug)]\npub enum RetryReason {\n    /// When an error is received that should be retried, this reason is returned.\n    RetryableError {\n        /// The kind of error.\n        kind: ErrorKind,\n        /// A server may tell us to retry only after a specific time has elapsed.\n        retry_after: Option<Duration>,\n    },\n}\n```\n\n*NOTE: `RetryReason` currently only has a single variant, but it's defined as an `enum` for [forward compatibility] purposes.*\n\n`RetryAction`'s `impl` defines several convenience methods:\n\n```rust,ignore\nimpl RetryAction {\n    /// Create a new `RetryAction` indicating that a retry is necessary.\n    pub fn retryable_error(kind: ErrorKind) -> Self {\n        Self::RetryIndicated(RetryReason::RetryableError {\n            kind,\n            retry_after: None,\n        })\n    }\n\n    /// Create a new `RetryAction` indicating that a retry is necessary after an explicit delay.\n    pub fn retryable_error_with_explicit_delay(kind: ErrorKind, retry_after: Duration) -> Self {\n        Self::RetryIndicated(RetryReason::RetryableError {\n            kind,\n            retry_after: Some(retry_after),\n        })\n    }\n\n    /// Create a new `RetryAction` indicating that a retry is necessary because of a transient error.\n    pub fn transient_error() -> Self {\n        Self::retryable_error(ErrorKind::TransientError)\n    }\n\n    /// Create a new `RetryAction` indicating that a retry is necessary because of a throttling error.\n    pub fn throttling_error() -> Self {\n        Self::retryable_error(ErrorKind::ThrottlingError)\n    }\n\n    /// Create a new `RetryAction` indicating that a retry is necessary because of a server error.\n    pub fn server_error() -> Self {\n        Self::retryable_error(ErrorKind::ServerError)\n    }\n\n    /// Create a new `RetryAction` indicating that a retry is necessary because of a client error.\n    pub fn client_error() -> Self {\n        Self::retryable_error(ErrorKind::ClientError)\n    }\n}\n```\n\n### Setting classifiers\n\nThe interface for setting classifiers is very similar to the interface of\nsettings interceptors:\n\n```rust,ignore\n// All service configs support these setters. Operations support a nearly identical API.\nimpl ServiceConfigBuilder {\n    /// Add type implementing ClassifyRetry that will be used by the RetryStrategy\n    /// to determine what responses should be retried.\n    ///\n    /// A retry classifier configured by this method will run according to its priority.\n    pub fn retry_classifier(mut self, retry_classifier: impl ClassifyRetry + 'static) -> Self {\n        self.push_retry_classifier(SharedRetryClassifier::new(retry_classifier));\n        self\n    }\n\n    /// Add a SharedRetryClassifier that will be used by the RetryStrategy to\n    /// determine what responses should be retried.\n    ///\n    /// A retry classifier configured by this method will run according to its priority.\n    pub fn push_retry_classifier(&mut self, retry_classifier: SharedRetryClassifier) -> &mut Self {\n        self.runtime_components.push_retry_classifier(retry_classifier);\n        self\n    }\n\n    /// Set SharedRetryClassifiers for the builder, replacing any that were\n    /// previously set.\n    pub fn set_retry_classifiers(&mut self, retry_classifiers: impl IntoIterator<Item = SharedRetryClassifier>) -> &mut Self {\n        self.runtime_components.set_retry_classifiers(retry_classifiers.into_iter());\n        self\n    }\n}\n```\n\n### Default classifiers\n\nSmithy clients have three classifiers enabled by default:\n\n- `ModeledAsRetryableClassifier`: Checks for errors that are marked as retryable\n  in the smithy model. If one is encountered, returns\n  `RetryAction::RetryIndicated`. Requires a parsed response.\n- `TransientErrorClassifier`: Checks for timeout, IO, and connector errors. If\n  one is encountered, returns `RetryAction::RetryIndicated`.  Requires a parsed\n  response.\n- `HttpStatusCodeClassifier`: Checks the HTTP response's status code. By\n  default, this classifies `500`, `502`, `503`, and `504` errors as\n  `RetryAction::RetryIndicated`.  The list of retryable status codes may be\n  customized when creating this classifier with the\n  `HttpStatusCodeClassifier::new_from_codes` method.\n\nAWS clients enable the three smithy classifiers as well as one more by default:\n\n- `AwsErrorCodeClassifier`: Checks for errors with AWS error codes marking them\n  as either transient or throttling errors. If one is encountered, returns\n  `RetryAction::RetryIndicated`. Requires a parsed response. This classifier\n  will also check the HTTP response for an `x-amz-retry-after` header. If one is\n  set, then the returned `RetryAction` will include the explicit delay.\n\nThe priority order of these classifiers is as follows:\n\n1. *(highest priority)* `TransientErrorClassifier`\n2. `ModeledAsRetryableClassifier`\n3. `AwsErrorCodeClassifier`\n4. *(lowest priority)* `HttpStatusCodeClassifier`\n\nThe priority order of the default classifiers is not configurable. However, it's\npossible to wrap a default classifier in a newtype and set your desired priority\nwhen implementing the `ClassifyRetry` trait, delegating the `classify_retry` and\n`name` fields to the inner classifier.\n\n#### Disable default classifiers\n\nDisabling the default classifiers is possible, but not easy. They are set at\ndifferent points during config and operation construction, and must be unset at\neach of those places. A far simpler solution is to implement your own classifier\nthat has the highest priority.\n\nStill, if completely removing the other classifiers is desired, use the\n`set_retry_classifiers` method on the config to replace the config-level\ndefaults and then set a config override on the operation that does the same.\n\n## How to actually implement this RFC\n\nIn order to implement this feature, we must:\n- Update the current retry classification system so that individual classifiers\n  as well as collections of classifiers can be easily composed together.\n- Create two new configuration mechanisms for users that allow them to customize\n  retry classification at the service level and at the operation level.\n- Update retry classifiers so that they may 'short-circuit' the chain, ending\n  retry classification immediately.\n\n### The `RetryClassifier` trait\n\n```rust,ignore\n/// The result of running a [`ClassifyRetry`] on a [`InterceptorContext`].\n#[non_exhaustive]\n#[derive(Clone, Eq, PartialEq, Debug)]\npub enum RetryAction {\n    /// When an error is received that should be retried, this action is returned.\n    Retry(ErrorKind),\n    /// When the server tells us to retry after a specific time has elapsed, this action is returned.\n    RetryAfter(Duration),\n    /// When a response should not be retried, this action is returned.\n    NoRetry,\n}\n\n/// Classifies what kind of retry is needed for a given [`InterceptorContext`].\npub trait ClassifyRetry: Send + Sync + fmt::Debug {\n    /// Run this classifier on the [`InterceptorContext`] to determine if the previous request\n    /// should be retried. If the classifier makes a decision, `Some(RetryAction)` is returned.\n    /// Classifiers may also return `None`, signifying that they have no opinion of whether or\n    /// not a request should be retried.\n    fn classify_retry(\n        &self,\n        ctx: &InterceptorContext,\n        preceding_action: Option<RetryAction>,\n    ) -> Option<RetryAction>;\n\n    /// The name of this retry classifier.\n    ///\n    /// Used for debugging purposes.\n    fn name(&self) -> &'static str;\n\n    /// The priority of this retry classifier. Classifiers with a higher priority will run before\n    /// classifiers with a lower priority. Classifiers with equal priorities make no guarantees\n    /// about which will run first.\n    fn priority(&self) -> RetryClassifierPriority {\n        RetryClassifierPriority::default()\n    }\n}\n```\n\n### Resolving the correct order of multiple retry classifiers\n\nBecause each classifier has a defined priority, and because\n`RetryClassifierPriority` implements `PartialOrd` and `Ord`, the standard\nlibrary's [sort] method may be used to correctly arrange classifiers. The\n`RuntimeComponents` struct is responsible for storing classifiers, so it's also\nresponsible for sorting them whenever a new classifier is added. Thus, when a\nretry strategy fetches the list of classifiers, they'll already be in the\nexpected order.\n\n## Questions and answers\n\n- **Q:** Should retry classifiers be fallible?\n  - **A:** I think no, because of the added complexity. If we make them fallible\n    then we'll have to decide what happens when classifiers fail. Do we skip\n    them or does classification end? The retry strategy is responsible for\n    calling the classifiers, so it be responsible for deciding how to handle a\n    classifier error. I don't foresee a use case where an error returned by a\n    classifier would be interpreted either by classifiers following the failed\n    classifier or the retry strategy.\n\n## Changes checklist\n\n- [x] Add retry classifiers field and setters to `RuntimeComponents` and `RuntimeComponentsBuilder`.\n  - [x] Add unit tests ensuring that classifier priority is respected by `RuntimeComponents::retry_classifiers`, especially when multiple layers of config are in play.\n- [x] Add codegen customization allowing users to set retry classifiers on service configs.\n- [x] Add codegen for setting default classifiers at the service level.\n  - [x] Add integration tests for setting classifiers at the service level.\n- [x] Add codegen for settings default classifiers that require knowledge of operation error types at the operation level.\n  - [x] Add integration tests for setting classifiers at the operation level.\n- [x] Implement retry classifier priority.\n  - [x] Add unit tests for retry classifier priority.\n- [x] Update existing tests that would fail for lack of a retry classifier.\n\n<!-- Links -->\n\n[sort]: https://doc.rust-lang.org/stable/std/primitive.slice.html#method.sort\n[forward compatibility]: https://en.wikipedia.org/wiki/Forward_compatibility\n"
  },
  {
    "path": "design/src/rfcs/rfc0039_forward_compatible_errors.md",
    "content": "<!-- Give your RFC a descriptive name saying what it would accomplish or what feature it defines -->\nRFC: Forward Compatible Errors\n=============\n\n<!-- RFCs start with the \"RFC\" status and are then either \"Implemented\" or \"Rejected\".  -->\n> Status: RFC\n>\n> Applies to: client\n\n<!-- A great RFC will include a list of changes at the bottom so that the implementor can be sure they haven't missed anything -->\nFor a summarized list of proposed changes, see the [Changes Checklist](#changes-checklist) section.\n\n<!-- Insert a short paragraph explaining, at a high level, what this RFC is for -->\nThis RFC defines an approach for making it forwards-compatible to convert **unmodeled** `Unhandled` errors into modeled ones. This occurs as servers update their models to include errors that were previously unmodeled.\n\nCurrently, SDK errors are **not** forward compatible in this way. If a customer matches `Unhandled` in addition to the `_` branch and a new variant is added, **they will fail to match the new variant**. We currently handle this issue with enums by prevent useful information from being readable from the `Unknown` variant.\n\nThis is related to ongoing work on the [`non_exhaustive_omitted_patterns` lint](https://github.com/rust-lang/rust/issues/89554) which would produce a compiler warning when a new variant was added even when `_` was used.\n\n<!-- The \"Terminology\" section is optional but is really useful for defining the technical terms you're using in the RFC -->\nTerminology\n-----------\n\nFor purposes of discussion, consider the following error:\n```rust,ignore\n#[non_exhaustive]\npub enum AbortMultipartUploadError {\n    NoSuchUpload(NoSuchUpload),\n    Unhandled(Unhandled),\n}\n```\n\n- **Modeled Error**: An error with an named variant, e.g. `NoSuchUpload` above\n- **Unmodeled Error**: Any other error, e.g. if the server returned `ValidationException` for the above operation.\n- **Error code**: All errors across all protocols provide a `code`, a unique method to identify an error across the service closure.\n\n<!-- Explain how users will use this new feature and, if necessary, how this compares to the current user experience -->\nThe user experience if this RFC is implemented\n----------------------------------------------\n\nIn the current version of the SDK, users match the `Unhandled` variant. They can then read the code from the `Unhandled` variant because [`Unhandled`](https://docs.rs/aws-smithy-types/0.56.1/aws_smithy_types/error/struct.Unhandled.html) implements the `ProvideErrorMetadata` trait as well as the standard-library `std::error::Error` trait.\n\n> Note: It's possible to write correct code today because the operation-level and service-level errors already expose `code()` via `ProvideErrorMetadata`. This RFC describes mechanisms to guide customers to write forward-compatible code.\n\n```rust,ignore\n# fn docs() {\n    match client.get_object().send().await {\n        Ok(obj) => { ... },\n        Err(e) => match e.into_service_error() {\n            GetObjectError::NotFound => { ... },\n            GetObjectError::Unhandled(err) if err.code() == \"ValidationException\" => { ... }\n            other => { /** do something with this variant */ }\n        }\n    }\n# }\n```\n\nWe must instead guide customers into the following pattern:\n```rust,ignore\n# fn docs() {\n    match client.get_object().send().await {\n        Ok(obj) => { ... },\n        Err(e) => match e.into_service_error() {\n            GetObjectError::NotFound => { ... },\n            err if err.code() == \"ValidationException\" => { ... },\n            err => warn!(\"{}\", err.code()),\n        }\n    }\n# }\n```\n\nIn this example, because customers are _not_ matching on the `Unhandled` variant explicitly this code is forward compatible for `ValidationException` being introduced in the future.\n\n**Guiding Customers to this Pattern**\nThere are two areas we need to handle:\n1. Prevent customers from extracting useful information from `Unhandled`\n2. Alert customers _currently_ using unhandled what to use instead. For example, the following code is still problematic:\n    ```rust,ignore\n        match err {\n            GetObjectError::NotFound => { ... },\n            err @ GetObject::Unhandled(_) if err.code() == Some(\"ValidationException\") => { ... }\n        }\n    ```\n\nFor `1`, we need to remove the `ProvideErrorMetadata` trait implementation from `Unhandled`. We would expose this isntead through a layer of indirection to enable code generated to code to still read the data.\n\nFor `2`, we would deprecate the `Unhandled` variants with a message clearly indicating how this code should be written.\n\nHow to actually implement this RFC\n----------------------------------\n\n### Locking down `Unhandled`\nIn order to prevent accidental matching on `Unhandled`, we need to make it hard to extract useful information from `Unhandled` itself. We will do this by removing the `ProvideErrorMetadata` trait implementation and exposing the following method:\n\n```rust,ignore\n#[doc(hidden)]\n/// Introspect the error metadata of this error.\n///\n/// This method should NOT be used from external code because matching on `Unhandled` directly is a backwards-compatibility\n/// hazard. See `RFC-0039` for more information.\npub fn introspect(&self) -> impl ProvideErrorMetadata + '_ {\n   struct Introspected<'a>(&'a Unhandled);\n   impl ProvideErrorMetadata for Introspected { ... }\n   Introspected(self)\n}\n```\n\nGenerated code would this use `introspect` when supporting **top-level** `ErrorMetadata` (e.g. for [`aws_sdk_s3::Error`](https://docs.rs/aws-sdk-s3/latest/aws_sdk_s3/enum.Error.html)).\n\n### Deprecating the Variant\nThe `Unhandled` variant will be deprecated to prevent users from matching on it inadvertently.\n\n```rust,ignore\nenum GetObjectError {\n   NotFound(NotFound),\n   #[deprecated(\"Matching on `Unhandled` directly is a backwards compatibility hazard. Use `err if err.error_code() == ...` instead. See [here](<docs about using errors>) for more information.\")]\n   Unhandled(Unhandled)\n}\n```\n\n###\n\n<!-- Include a checklist of all the things that need to happen for this RFC's implementation to be considered complete -->\nChanges checklist\n-----------------\n\n- [ ] Generate code to deprecate unhandled variants. Determine the best way to allow `Unhandled` to continue to be constructed in client code\n- [ ] Generate code to deprecate the `Unhandled` variant for the service meta-error. Consider how this interacts with non-service errors.\n- [ ] Update `Unhandled` to make it useless on its own and expose information via an `Introspect` doc hidden struct.\n- [ ] Update developer guide to address this issue.\n- [ ] Changelog & Upgrade Guidance\n"
  },
  {
    "path": "design/src/rfcs/rfc0040_behavior_versions.md",
    "content": "<!-- Give your RFC a descriptive name saying what it would accomplish or what feature it defines -->\nRFC: Behavior Versions\n=============\n\n<!-- RFCs start with the \"RFC\" status and are then either \"Implemented\" or \"Rejected\".  -->\n> Status: RFC\n>\n> Applies to: client\n\n<!-- A great RFC will include a list of changes at the bottom so that the implementor can be sure they haven't missed anything -->\nFor a summarized list of proposed changes, see the [Changes Checklist](#changes-checklist) section.\n\n<!-- Insert a short paragraph explaining, at a high level, what this RFC is for -->\nThis RFC describes \"Behavior Versions,\" a mechanism to allow SDKs to ship breaking behavioral changes like a new retry strategy, while allowing customers who rely on extremely consistent behavior to evolve at their own pace.\n\nBy adding behavior major versions (BMV) to the Rust SDK, we will make it possible to ship new secure/recommended defaults to new customers without impacting legacy customers.\n\nThe fundamental issue stems around our inability to communicate and decouple releases of service updates and behavior within a single major version.\n\nBoth legacy and new SDKs have the need to alter their SDKs default. Historically, this caused new customers on legacy SDKs to be subject to legacy defaults, even when a better alternative existed.\n\nFor new SDKs, a GA cutline presents difficult choices around timeline and features that can’t be added later without altering behavior.\n\nBoth of these use cases are addressed by Behavior Versions.\n\n<!-- Explain how users will use this new feature and, if necessary, how this compares to the current user experience -->\nThe user experience if this RFC is implemented\n----------------------------------------------\n\nIn the current version of the SDK, users can construct clients without indicating any sort of behavior major version.\nOnce this RFC is implemented, there will be two ways to set a behavior major version:\n\n1. In code via `aws_config::defaults(BehaviorVersion::latest())` and `<service>::Config::builder().behavior_version(...)`. This will also work for `config_override`.\n2. By enabling `behavior-version-latest` in either `aws-config` (which brings back `from_env`) OR a specific generated SDK crate\n\n```toml\n# Cargo.toml\n[dependencies]\naws-config = { version = \"1\", features = [\"behavior-version-latest\"] }\n# OR\naws-sdk-s3 = { version = \"1\", features = [\"behavior-version-latest\"] }\n```\n\nIf no `BehaviorVersion` is set, the client will panic during construction.\n\n`BehaviorVersion` is an opaque struct with initializers like `::latest()`, `::v2023_11_09()`. Downstream code can check the version by calling methods like `::supports_v1()`\n\nWhen new BMV are added, the previous version constructor will be marked as `deprecated`. This serves as a mechanism to alert customers that a new BMV exists to allow them to upgrade.\n\nHow to actually implement this RFC\n----------------------------------\n\nIn order to implement this feature, we need to create a `BehaviorVersion` struct, add config options to `SdkConfig` and `aws-config`, and wire it throughout the stack.\n```rust\n/// Behavior major-version of the client\n///\n/// Over time, new best-practice behaviors are introduced. However, these behaviors might not be backwards\n/// compatible. For example, a change which introduces new default timeouts or a new retry-mode for\n/// all operations might be the ideal behavior but could break existing applications.\n#[derive(Debug, Clone)]\npub struct BehaviorVersion {\n    // currently there is only 1 MV so we don't actually need anything in here.\n    _private: (),\n}\n```\n\nTo help customers migrate, we are including `from_env` hooks that set `behavior-version-latest` that are _deprecated_. This allows customers to see that they are missing the required cargo feature and add it to remove the deprecation warning.\n\nInternally, `BehaviorVersion` will become an additional field on `<client>::Config`. It is _not_ ever stored in the `ConfigBag` or in `RuntimePlugins`.\n\nWhen constructing the set of \"default runtime plugins,\" the default runtime plugin parameters will be passed the `BehaviorVersion`. This will select the correct runtime plugin. Logging will clearly indicate which plugin was selected.\n\nDesign Alternatives Considered\n------------------------------\n\nAn original design was also considered that made BMV optional and relied on documentation to steer customers in the right direction. This was\ndeemed too weak of a mechanism to ensure that customers aren't broken by unexpected changes.\n\nChanges checklist\n-----------------\n\n- [x] Create `BehaviorVersion` and the BMV runtime plugin\n- [x] Add BMV as a required runtime component\n- [x] Wire up setters throughout the stack\n- [x] Add tests of BMV (set via aws-config, cargo features & code params)\n- [x] ~Remove `aws_config::from_env` deprecation stand-ins~ We decided to persist these deprecations\n- [x] Update generated usage examples\n"
  },
  {
    "path": "design/src/rfcs/rfc0041_improve_client_error_ergonomics.md",
    "content": "RFC: Improve Client Error Ergonomics\n====================================\n\n> Status: Implemented\n>\n> Applies to: clients\n\nThis RFC proposes some changes to code generated errors to make them easier to use for customers.\nWith the SDK and code generated clients, customers have two primary use-cases that should be made\neasy without compromising the compatibility rules established in [RFC-0022]:\n\n1. Checking the error type\n2. Retrieving information specific to that error type\n\nCase Study: Handling an error in S3\n-----------------------------------\n\nThe following is an example of handling errors with S3 with the latest generated (and unreleased)\nSDK as of 2022-12-07:\n\n```rust,ignore\nlet result = client\n    .get_object()\n    .bucket(BUCKET_NAME)\n    .key(\"some-key\")\n    .send()\n    .await;\n    match result {\n        Ok(_output) => { /* Do something with the output */ }\n        Err(err) => match err.into_service_error() {\n            GetObjectError { kind, .. } => match kind {\n                GetObjectErrorKind::InvalidObjectState(value) => println!(\"invalid object state: {:?}\", value),\n                GetObjectErrorKind::NoSuchKey(_) => println!(\"object didn't exist\"),\n            }\n            err @ GetObjectError { .. } if err.code() == Some(\"SomeUnmodeledError\") => {}\n            err @ _ => return Err(err.into()),\n        },\n    }\n```\n\nThe refactor that implemented [RFC-0022] added the `into_service_error()` method on `SdkError` that\ninfallibly converts the `SdkError` into the concrete error type held by the `SdkError::ServiceError` variant.\nThis improvement lets customers discard transient failures and immediately handle modeled errors\nreturned by the service.\n\nDespite this, the code is still quite verbose.\n\nProposal: Combine `Error` and `ErrorKind`\n-----------------------------------------\n\nAt time of writing, each operation has both an `Error` and `ErrorKind` type generated.\nThe `Error` type holds information that is common across all operation errors: message,\nerror code, \"extra\" key/value pairs, and the request ID.\n\nThe `ErrorKind` is always nested inside the `Error`, which results in the verbose\nnested matching shown in the case study above.\n\nTo make error handling more ergonomic, the code generated `Error` and `ErrorKind` types\nshould be combined. Hypothetically, this would allow for the case study above to look as follows:\n\n```rust,ignore\nlet result = client\n    .get_object()\n    .bucket(BUCKET_NAME)\n    .key(\"some-key\")\n    .send()\n    .await;\nmatch result {\n    Ok(_output) => { /* Do something with the output */ }\n    Err(err) => match err.into_service_error() {\n        GetObjectError::InvalidObjectState(value) => {\n            println!(\"invalid object state: {:?}\", value);\n        }\n        err if err.is_no_such_key() => {\n            println!(\"object didn't exist\");\n        }\n        err if err.code() == Some(\"SomeUnmodeledError\") => {}\n        err @ _ => return Err(err.into()),\n    },\n}\n```\n\nIf a customer only cares about checking one specific error type, they can also do:\n\n```rust,ignore\nmatch result {\n    Ok(_output) => { /* Do something with the output */ }\n    Err(err) => {\n        let err = err.into_service_error();\n        if err.is_no_such_key() {\n            println!(\"object didn't exist\");\n        } else {\n            return Err(err);\n        }\n    }\n}\n```\n\nThe downside of this is that combining the error types requires adding the general error\nmetadata to each generated error struct so that it's accessible by the enum error type.\nHowever, this aligns with our tenet of making things easier for customers even if it\nmakes it harder for ourselves.\n\nChanges Checklist\n-----------------\n\n- [x] Merge the `${operation}Error`/`${operation}ErrorKind` code generators to only generate an `${operation}Error` enum:\n  - Preserve the `is_${variant}` methods\n  - Preserve error metadata by adding it to each individual variant's context struct\n- [x] Write upgrade guidance\n- [x] Fix examples\n\n[RFC-0022]: ./rfc0022_error_context_and_compatibility.md\n"
  },
  {
    "path": "design/src/rfcs/rfc0042_file_per_change_changelog.md",
    "content": "RFC: File-per-change changelog\n==============================\n\n> Status: Implemented\n>\n> Applies to: client and server\n\nFor a summarized list of proposed changes, see the [Changes Checklist] section.\n\nHistorically, the smithy-rs and AWS SDK for Rust's changelogs and release notes have been\ngenerated from the `changelogger` tool in `tools/ci-build/changelogger`. This is a tool built\nspecifically for development and release of smithy-rs, and it requires developers to add\nchangelog entries to a root `CHANGELOG.next.toml` file. Upon release, the `[[smithy-rs]]` entries\nin this file go into the smithy-rs release notes, and the `[[aws-sdk-rust]]` entries are associated\nwith a smithy-rs release commit hash, and added to the `aws/SDK_CHANGELOG.next.json` for\nincorporation into the AWS SDK's changelog when it releases.\n\nThis system has gotten us far, but it has always made merging PRs into main more difficult\nsince the central `CHANGELOG.next.toml` file is almost always a merge conflict for two PRs\nwith changelog entries.\n\nThis RFC proposes a new approach to change logging that will remedy the merge conflict issue,\nand explains how this can be done without disrupting the current release process.\n\nThe proposed developer experience\n---------------------------------\n\nThere will be a `changelog/` directory in the smithy-rs root where\ndevelopers can add changelog entry Markdown files. Any file name can be picked\nfor these entries. Suggestions are the development branch name for the\nchange, or the PR number.\n\nThe changelog entry format will change to make it easier to duplicate entries\nacross both smithy-rs and aws-sdk-rust, a common use-case.\n\nThis new format will make use of Markdown front matter in the YAML format.\nThis change in format has a couple benefits:\n- It's easier to write change entries in Markdown than in a TOML string.\n- There's no way to escape special characters (such as quotes) in a TOML string,\n  so the text that can be a part of the message will be expanded.\n\nWhile it would be preferable to use TOML for the front matter (and there are libraries\nthat support that), it will use YAML so that GitHub's Markdown renderer will recognize it.\n\nA changelog entry file will look as follows:\n\n```markdown\n---\n# Adding `aws-sdk-rust` here duplicates this entry into the SDK changelog.\napplies_to: [\"client\", \"server\", \"aws-sdk-rust\"]\nauthors: [\"author1\", \"author2\"]\nreferences: [\"smithy-rs#1234\", \"aws-sdk-rust#1234\"]\n# The previous `meta` section is broken up into its constituents:\nbreaking: false\n# This replaces \"tada\":\nnew_feature: false\nbug_fix: false\n---\n\nSome message for the change.\n```\n\nImplementation\n--------------\n\nWhen a release is performed, the release script will generate the release notes,\nupdate the `CHANGELOG.md` file, copy SDK changelog entries into the SDK,\nand delete all the files in `changelog/`.\n\n### SDK Entries\n\nThe SDK changelog entries currently end up in `aws/SDK_CHANGELOG.next.json`, and each entry\nis given `age` and `since_commit` entries. The age is a number that starts at zero, and gets\nincremented with every smithy-rs release. When it reaches a hardcoded threshold, that entry\nis removed from `aws/SDK_CHANGELOG.next.json`. The SDK release process uses the `since_commit`\nto determine which changelog entries go into the next SDK release's changelog.\n\nThe SDK release process doesn't write back to smithy-rs, and history has shown that it\ncan't since this leads to all sorts of release issues as PRs get merged into smithy-rs\nwhile the release is in progress. Thus, this `age`/`since_commit` dichotomy needs to\nstay in place.\n\nThe `aws/SDK_CHANGELOG.next.json` will stay in place in its current format without changes.\nIts JSON format is capable of escaping characters in the message string, so it will be\ncompatible with the transition from TOML to Markdown with YAML front matter.\n\nThe `SDK_CHANGELOG.next.json` file has had merge conflicts in the past, but this only\nhappened when the release process wasn't followed correctly. If we're consistent with\nour release process, it should never have conflicts.\n\n### Safety requirements\n\nImplementation will be tricky since it needs to be done without disrupting the existing\nrelease process. The biggest area of risk is the SDK sync job that generates individual\ncommits in the aws-sdk-rust repo for each commit in the smithy-rs release. Fortunately,\nthe `changelogger` is invoked a single time at the very end of that process, and only\nthe latest `changelogger` version that is included in the build image. Thus, we can safely\nrefactor the `changelogger` tool so long as the command-line interface for it remains\nbackwards compatible. (We _could_ change the CLI interface as well, but it will\nrequire synchronizing the smithy-rs changes with changes to the SDK release scripts.)\n\nAt a high level, these requirements must be observed to do this refactor safely:\n- The CLI for the `changelogger render` subcommand _MUST_ stay the same, or have minimal\n  backwards compatible changes made to it.\n- The `SDK_CHANGELOG.next.json` format can change, but _MUST_ remain a single JSON file.\n  If it is changed at all, the existing file _MUST_ be transitioned to the new format,\n  and a mechanism _MUST_ be in place for making sure it is the correct format after\n  merging with other PRs. It's probably better to leave this file alone though, or make\n  any changes to it backwards compatible.\n\nFuture Improvements\n-------------------\n\nAfter the initial migration, additional niceties could be added such as pulling authors\nfrom git history rather than needing to explicitly state them (at least by default; there\nshould always be an option to override the author in case a maintainer adds a changelog\nentry on behalf of a contributor).\n\nChanges checklist\n-----------------\n\n- [x] Refactor changelogger and smithy-rs-tool-common to separate the changelog\n      serialization format from the internal representation used for rendering and splitting.\n- [x] Implement deserialization for the new Markdown entry format\n- [x] Incorporate new format into the `changelogger render` subcommand\n- [x] Incorporate new format into the `changelogger split` subcommand\n- [x] Port existing `CHANGELOG.next.toml` to individual entries\n- [x] Update `sdk-lints` to fail if `CHANGELOG.next.toml` exists at all to avoid losing\n      changelog entries during merges.\n- [x] Dry-run test against the smithy-rs release process.\n- [x] Dry-run test against the SDK release process.\n\n[Changes Checklist]: #changes-checklist\n"
  },
  {
    "path": "design/src/rfcs/rfc0043_identity_cache_partitions.md",
    "content": "RFC: Identity Cache Partitions\n===============================\n\n> Status: Implemented\n>\n> Applies to: AWS SDK for Rust\n\nMotivation\n-----------\n\nIn the below example two clients are created from the same shared `SdkConfig` instance and each\ninvoke a fictitious operation. Assume the operations use the same auth scheme relying on the same identity resolver.\n\n```rust,ignore\n#[tokio::main]\nasync fn main() -> Result<(), Box<dyn Error>> {\n\n    let config = aws_config::defaults(BehaviorVersion::latest())\n        .load()\n        .await;\n\n    let c1 = aws_sdk_foo::Client::new(&config);\n    c1.foo_operation().send().await;\n\n    let c2 = aws_sdk_bar::Client::new(&config);\n    c2.bar_operation().send().await;\n\n    Ok(())\n}\n```\n\nThere are two problems with this currently.\n\n\n1. The identity resolvers (e.g. `credentials_provider` for SigV4) are re-used but we end up with a different\n[`IdentityCachePartition`](https://github.com/smithy-lang/smithy-rs/blob/release-2024-03-25/rust-runtime/aws-smithy-runtime-api/src/client/identity.rs#L41)\neach time a client is created.\n    * More specifically this happens every time a `SharedIdentityResolver` is [created](https://github.com/smithy-lang/smithy-rs/blob/release-2024-03-25/rust-runtime/aws-smithy-runtime-api/src/client/identity.rs#L197). The conversion from [`From<SdkConfig>`](https://github.com/awslabs/aws-sdk-rust/blob/release-2024-04-01/sdk/sts/src/config.rs#L1207)\n    sets the credentials provider which [associates](https://github.com/awslabs/aws-sdk-rust/blob/release-2024-04-01/sdk/sts/src/config.rs#L960) it as\n    the identity resolver for the auth scheme. Internally this is [converted](https://github.com/awslabs/aws-sdk-rust/blob/release-2024-04-01/sdk/aws-smithy-runtime-api/src/client/runtime_components.rs#L663) to `SharedIdentityResolver` which creates the new partition (if it were already a `SharedIdentityResolver` this would be detected and a new instance would not be created which means it must be a `SharedCredentialsProvider` or `SharedTokenProvider` that is getting converted). The end result is the credentials\n    provider from shared config is re-used but the cache partition differs so a cache miss occurs the first time\n    any new client created from that shared config needs credentials.\n\n2. The `SdkConfig` does not create an identity cache by default. Even if the partitioning is fixed, any clients created from\na shared config instance will end up with their own identity cache which also results in having to resolve identity\nagain. Only if a user supplies an identity cache explicitly when creating shared config would it be re-used across\ndifferent clients.\n\n### Design intent\n\nIdentity providers and identity caching are intentionally decoupled. This allows caching behavior to be more easily\ncustomized and centrally configured while also removing the need for each identity provider to have to implement\ncaching. There is some fallout from sharing an identity cache though. This is fairly well documented on\n`IdentityCachePartition` itself.\n\n```rust,ignore\n/// ...\n///\n/// Identities need cache partitioning because a single identity cache is used across\n/// multiple identity providers across multiple auth schemes. In addition, a single auth scheme\n/// may have many different identity providers due to operation-level config overrides.\n///\n/// ...\npub struct IdentityCachePartition(...)\n```\n\nCache partitioning allows for different identity types to be stored in the same cache instance as long as they\nare assigned to a different partition. Partitioning also solves the issue of overriding configuration on a per operation\nbasis where it would not be the correct or desired behavior to re-use or overwrite the cache if a different resolver\nis used.\n\nIn other words cache partitioning is effectively tied to a particular instance of an identity resolver. Re-using the\nsame instance of a resolver _SHOULD_ be allowed to share a cache partition. The fact that this isn't the case\ntoday is an oversight in how types are wrapped and threaded through the SDK.\n\n\nThe user experience if this RFC is implemented\n----------------------------------------------\n\nIn the current version of the SDK, users are unable to share cached results of identity resolvers via shared `SdkConfig`\nacross clients.\n\nOnce this RFC is implemented, users that create clients via `SdkConfig` with the latest behavior version will share\na default identity cache. Shared identity resolvers (e.g. `credentials_provider`, `token_provider`, etc) will provide\ntheir own cache partition that is re-used instead of creating a new one each time a provider is converted into a\n`SharedIdentityResolver`.\n\n### Default behavior\n\n```rust,ignore\nlet config = aws_config::defaults(BehaviorVersion::latest())\n    .load()\n    .await;\n\nlet c1 = aws_sdk_foo::Client::new(&config);\nc1.foo_operation().send().await;\n\n\nlet c2 = aws_sdk_bar::Client::new(&config);\n// will re-use credentials/identity resolved via c1\nc2.bar_operation().send().await;\n```\n\nOperations invoked on `c2` will see the results of cached identities resolved by client `c1` (for operations that use\nthe same identity resolvers). The creation of a default identity cache in `SdkConfig` if not provided will be added\nbehind a new behavior version.\n\n### Opting out\n\nUsers can disable the shared identity cache by explicitly setting it to `None`. This will result in each client\ncreating their own identity cache.\n\n```rust,ignore\nlet config = aws_config::defaults(BehaviorVersion::latest())\n    // new method similar to `no_credentials()` to disable default cache setup\n    .no_identity_cache()\n    .load()\n    .await;\n\nlet c1 = aws_sdk_foo::Client::new(&config);\nc1.foo_operation().send().await;\n\n\nlet c2 = aws_sdk_bar::Client::new(&config);\nc2.bar_operation().send().await;\n```\n\nThe same can be achieved by explicitly supplying a new identity cache to a client:\n\n```rust,ignore\n\nlet config = aws_config::defaults(BehaviorVersion::latest())\n    .load()\n    .await;\n\nlet c1 = aws_sdk_foo::Client::new(&config);\nc1.foo_operation().send().await;\n\nlet modified_config = aws_sdk_bar::Config::from(&config)\n    .to_builder()\n    .identity_cache(IdentityCache::lazy().build())\n    .build();\n\n// uses it's own identity cache\nlet c2 = aws_sdk_bar::Client::from_conf(modified_config);\nc2.bar_operation().send().await;\n```\n\n### Interaction with operation config override\n\nHow per/operation configuration override behaves depends on what is provided for an identity resolver.\n\n```rust,ignore\nlet config = aws_config::defaults(BehaviorVersion::latest())\n    .load()\n    .await;\n\nlet c1 = aws_sdk_foo::Client::new(&config);\n\nlet scoped_creds = my_custom_provider();\nlet config_override = c1\n        .config()\n        .to_builder()\n        .credentials_provider(scoped_creds);\n\n// override config for two specific operations\n\nc1.operation1()\n    .customize()\n    .config_override(config_override);\n    .send()\n    .await;\n\nc1.operation2()\n    .customize()\n    .config_override(config_override);\n    .send()\n    .await;\n```\n\nBy default if an identity resolver does not provide it's own cache partition then `operation1` and `operation2` will\nbe wrapped in new `SharedIdentityResolver` instances and get distinct cache partitions. If `my_custom_provider()`\nprovides it's own cache partition then `operation2` will see the cached results.\n\nUsers can control this by wrapping their provider into a `SharedCredentialsProvider` which will claim it's own\ncache partition.\n\n```rust,ignore\n\nlet scoped_creds = SharedCredentialsProvider::new(my_custom_provider());\nlet config_override = c1\n        .config()\n        .to_builder()\n        .set_credentials_provider(Some(scoped_creds));\n...\n```\n\n\nHow to actually implement this RFC\n----------------------------------\n\nIn order to implement this RFC implementations of `ResolveIdentity` need to be allowed to provide their own cache\npartition.\n\n```rust,ignore\npub trait ResolveIdentity: Send + Sync + Debug {\n    ...\n\n    /// Returns the identity cache partition associated with this identity resolver.\n    ///\n    /// By default this returns `None` and cache partitioning is left up to `SharedIdentityResolver`.\n    /// If sharing instances of this type should use the same partition then you should override this\n    /// method and return a claimed partition.\n    fn cache_partition(&self) -> Option<IdentityCachePartition> {\n        None\n    }\n\n}\n```\n\nCrucially cache partitions must remain globally unique so this method returns `IdentityCachePartition` which is\nunique by construction. It doesn't matter if partitions are claimed early by an implementation of `ResolveIdentity`\nor at the time they are wrapped in `SharedIdentityResolver`.\n\nThis is because `SdkConfig` stores instances of `SharedCredentialsProvider` (or `SharedTokenProvider`) rather than\n`SharedIdentityResolver` which is what currently knows about cache partitioning. By allowing implementations of `ResolveIdentity`\nto provide their own partition then `SharedCredentialsProvider` can claim a partition at construction time\nand return that which will re-use the same partition anywhere that the provider is shared.\n\n\n```rust,ignore\n#[derive(Clone, Debug)]\npub struct SharedCredentialsProvider(Arc<dyn ProvideCredentials>, IdentityCachePartition);\n\nimpl SharedCredentialsProvider {\n    pub fn new(provider: impl ProvideCredentials + 'static) -> Self {\n        Self(Arc::new(provider), IdentityCachePartition::new())\n    }\n}\n\nimpl ResolveIdentity for SharedCredentialsProvider {\n    ...\n\n    fn cache_partition(&self) -> Option<IdentityCachePartition> {\n        Some(self.1)\n    }\n}\n\n```\n\nAdditionally a new behavior version must be introduced that conditionally creates a default `IdentityCache` on `SdkConfig`\nif not explicitly configured (similar to how credentials provider works internally).\n\nAlternatives Considered\n-----------------------\n\n`SdkConfig` [internally](https://github.com/smithy-lang/smithy-rs/blob/release-2024-03-25/aws/rust-runtime/aws-types/src/sdk_config.rs#L58-L59)\nstores `SharedCredentialsProvider`/`SharedTokenProvider`. Neither of these types knows anything about cache partitioning.\nOne alternative would be to create and store a `SharedIdentityResolver` for each identity resolver type.\n\n```rust,ignore\npub struct SdkConfig {\n    ...\n    credentials_provider: Option<SharedCredentialsProvider>,\n    credentials_identity_provider: Option<SharedIdentityResolver>,\n    token_provider: Option<SharedTokenProvider>,\n    token_identity_provider: Option<SharedIdentityResolver>,\n}\n```\n\nSetting one of the identity resolver types like `credentials_provider` would also create and set the equivalent\n`SharedIdentityResolver` which would claim a cache partition. When generating the `From<SdkConfig>` implementations\nthe identity resolver type would be favored.\n\nThere are a few downsides to this approach:\n\n1. `SdkConfig` would have to expose accessor methods for the equivalents\n(e.g. `credentials_identity_provider(&self) -> Option<&SharedIdentityResolver>`). This creates additional noise\nand confusion as well as the chance for using the type wrong.\n2. Every new identity type added to `SdkConfig` would have to be sure to use `SharedIdentityResolver`.\n\nThe advantage of the proposed approach of letting `ResolveIdentity` implementations provide a cache partition means\n`SdkConfig` does not need to change. It also gives customers more control over whether an identity resolver implementation\nshares a cache partition or not.\n\nChanges checklist\n-----------------\n\n- [x] Add new `cache_partition()` method to `ResolveIdentity`\n- [x] Update `SharedIdentityResolver::new` to use the new `cache_partition()` method on the `resolver` to determine if a new cache partition should be created or not\n- [x] Claim a cache partition when `SharedCredentialsProvider` is created and override the new `ResolveIdentity` method\n- [x] Claim a cache partition when `SharedTokenProvider` is created and override the new `ResolveIdentity` method\n- [x] Introduce new behavior version\n- [x] Conditionally (gated on behavior version) create a new default `IdentityCache` on `SdkConfig` if not explicitly configured\n- [x] Add a new `no_identity_cache()` method to `ConfigLoader` that marks the identity cache as explicitly unset\n"
  },
  {
    "path": "design/src/rfcs/rfc0044_env_defined_service_config.md",
    "content": "# RFC: Environment-defined service configuration\n\n> Status: RFC\n>\n> Applies to: client\n\nFor a summarized list of proposed changes, see the [Changes\nChecklist](#changes-checklist) section.\n\nIn the AWS SDK for Rust today, customers are limited to setting global\nconfiguration variables in their environment; They cannot set service-specific\nvariables. Other SDKs and the AWS CLI do allow for setting service-specific\nvariables.\n\nThis RFC proposes an implementation that would enable users to set\nservice-specific variables in their environment.\n\n## Terminology\n\n* **Global configuration**: configuration which will be used for requests to any\n  service. May be overridden by service-specific configuration.\n* **Service-specific configuration**: configuration which will be used for\n  requests only to a specific service.\n* **Configuration variable**: A key-value pair that defines configuration e.g.\n  `key = value`, `key: value`, `KEY=VALUE`, etc.\n    * Key and value as used in this RFC refer to each half of a configuration\n      variable.\n* **Sub-properties**: When parsing config variables from a profile file,\n  sub-properties are a newline-delimited list of key-value pairs in an indented\n  block following a `<service name>=\\n` line. _For an example, see the **Profile\n  File Configuration** section of this RFC where sub-properties are declared for\n  two different services._\n\n## The user experience if this RFC is implemented\n\nWhile users can already set global configuration in their environment, this RFC\nproposes two new ways to set service-specific configuration in their\nenvironment.\n\n### Environment Variables\n\nWhen defining service-specific configuration with an environment variable, all\nkeys are formatted like so:\n\n```sh\n\"AWS\" + \"_\" + \"<config key in CONST_CASE>\" + \"_\" + \"<service ID in CONST_CASE>\"\n```\n\nAs an example, setting an endpoint URL for different services would look like\nthis:\n\n```sh\nexport AWS_ENDPOINT_URL=http://localhost:4444\nexport AWS_ENDPOINT_URL_ELASTICBEANSTALK=http://localhost:5555\nexport AWS_ENDPOINT_URL_DYNAMODB=http://localhost:6666\n```\n\nThe first variable sets a global endpoint URL. The second variable overrides the\nfirst variable, but only for the Elastic Beanstalk service. The third variable\noverrides the first variable, but only for the DynamoDB service.\n\n### Profile File Configuration\n\nWhen defining service-specific configuration in a profile file, it looks like\nthis:\n\n```ignore\n[profile dev]\nservices = testing-s3-and-eb\nendpoint_url = http://localhost:9000\n\n[services testing-s3-and-eb]\ns3 =\n  endpoint_url = http://localhost:4567\nelasticbeanstalk =\n  endpoint_url = http://localhost:8000\n```\n\nWhen `dev` is the active profile, all services will use the\n`http://localhost:9000` endpoint URL except where it is overridden. Because the\n`dev` profile references the `testing-s3-and-eb` services, and because two\nservice-specific endpoint URLs are set, those URLs will override the\n`http://localhost:9000` endpoint URL when making requests to S3\n(`http://localhost:4567`) and Elastic Beanstalk (`http://localhost:8000`).\n\n### Configuration Precedence\n\nWhen configuration is set in multiple places, the value used is determined in\nthis order of precedence:\n\n*highest precedence*\n\n1. *EXISTING* Programmatic client configuration\n2. *NEW* Service-specific environment variables\n3. *EXISTING* Global environment variables\n4. *NEW* Service-specific profile file variables in the active profile\n5. *EXISTING* Global profile file variables in the active profile\n\n*lowest precedence*\n\nHow to actually implement this RFC\n----------------------------------\n\nThis RFC may be implemented in several steps which are detailed below.\n\n### Sourcing service-specific config from the environment and profile\n\n`aws_config::profile::parser::ProfileSet` is responsible for storing the active\nprofile and all profile configuration data. Currently, it only tracks\n`sso_session` and `profile` sections, so it must be updated to store arbitrary\nsections, their properties, and sub-properties. These sections will be publicly\naccessible via a new method `ProfileSet::other_sections` which returns a ref to\na `Properties` struct.\n\nThe `Properties` struct is defined as follows:\n\n```rust,ignore\ntype SectionKey = String;\ntype SectionName = String;\ntype PropertyName = String;\ntype SubPropertyName = String;\ntype PropertyValue = String;\n\n/// A key for to a property value.\n///\n/// ```txt\n/// # An example AWS profile config section with properties and sub-properties\n/// [section-key section-name]\n/// property-name = property-value\n/// property-name =\n///   sub-property-name = property-value\n/// ```\n#[derive(Clone, Debug, PartialEq, Eq, Hash)]\npub struct PropertiesKey {\n    section_key: SectionKey,\n    section_name: SectionName,\n    property_name: PropertyName,\n    sub_property_name: Option<SubPropertyName>,\n}\n\nimpl PropertiesKey {\n    /// Create a new builder for a `PropertiesKey`.\n    pub fn builder() -> Builder {\n        Default::default()\n    }\n}\n\n// The builder code is omitted from this RFC. It allows users to set each field\n// individually and then build a PropertiesKey\n\n/// A map of [`PropertiesKey`]s to property values.\n#[derive(Clone, Debug, Default, PartialEq, Eq)]\npub struct Properties {\n    inner: HashMap<PropertiesKey, PropertyValue>,\n}\n\nimpl Properties {\n    /// Create a new empty [`Properties`].\n    pub fn new() -> Self {\n        Default::default()\n    }\n\n    #[cfg(test)]\n    pub(crate) fn new_from_slice(slice: &[(PropertiesKey, PropertyValue)]) -> Self {\n        let mut properties = Self::new();\n        for (key, value) in slice {\n            properties.insert(key.clone(), value.clone());\n        }\n        properties\n    }\n\n    /// Insert a new key/value pair into this map.\n    pub fn insert(&mut self, properties_key: PropertiesKey, value: PropertyValue) {\n        let _ = self\n            .inner\n            // If we don't clone then we don't get to log a useful warning for a value getting overwritten.\n            .entry(properties_key.clone())\n            .and_modify(|v| {\n                tracing::trace!(\"overwriting {properties_key}: was {v}, now {value}\");\n                *v = value.clone();\n            })\n            .or_insert(value);\n    }\n\n    /// Given a [`PropertiesKey`], return the corresponding value, if any.\n    pub fn get(&self, properties_key: &PropertiesKey) -> Option<&PropertyValue> {\n        self.inner.get(properties_key)\n    }\n}\n```\n\nThe `aws_config::env` module remains unchanged. It already provides all the\nnecessary functionality.\n\n### Exposing valid service configuration during `<service>::Config` construction\n\nEnvironment variables *(from `Env`)* and profile variables *(from\n`EnvConfigSections`)* must be available during the conversion of `SdkConfig` to\n`<service>::Config`. To accomplish this, we'll define a new trait\n`LoadServiceConfig` and implement it for `EnvServiceConfig`  which will be\nstored in the `SdkConfig` struct.\n\n```rust,ignore\n/// A struct used with the [`LoadServiceConfig`] trait to extract service config from the user's environment.\n// [profile active-profile]\n// services = dev\n//\n// [services dev]\n// service-id =\n//   config-key = config-value\n#[derive(Clone, Debug, PartialEq, Eq, Hash)]\npub struct ServiceConfigKey<'a> {\n    service_id: &'a str,\n    profile: &'a str,\n    env: &'a str,\n}\n\nimpl<'a> ServiceConfigKey<'a> {\n    /// Create a new [`ServiceConfigKey`] builder struct.\n    pub fn builder() -> builder::Builder<'a> {\n        Default::default()\n    }\n    /// Get the service ID.\n    pub fn service_id(&self) -> &'a str {\n        self.service_id\n    }\n    /// Get the profile key.\n    pub fn profile(&self) -> &'a str {\n        self.profile\n    }\n    /// Get the environment key.\n    pub fn env(&self) -> &'a str {\n        self.env\n    }\n}\n\n/// Implementers of this trait can provide service config defined in a user's environment.\npub trait LoadServiceConfig: fmt::Debug + Send + Sync {\n    /// Given a [`ServiceConfigKey`], return the value associated with it.\n    fn load_config(&self, key: ServiceConfigKey<'_>) -> Option<String>;\n}\n\n#[derive(Debug)]\npub(crate) struct EnvServiceConfig {\n    pub(crate) env: Env,\n    pub(crate) env_config_sections: EnvConfigSections,\n}\n\nimpl LoadServiceConfig for EnvServiceConfig {\n    fn load_config(&self, key: ServiceConfigKey<'_>) -> Option<String> {\n        let (value, _source) = EnvConfigValue::new()\n            .env(key.env())\n            .profile(key.profile())\n            .service_id(key.service_id())\n            .load(&self.env, Some(&self.env_config_sections))?;\n\n        Some(value.to_string())\n    }\n}\n```\n\n### Code generation\n\nWe require two things to check for when constructing the service config:\n\n- The service's ID\n- The service's supported configuration variables\n\nWe **only** have this information once we get to the service level. Because of\nthat, we must use code generation to define:\n\n- What config to look for in the environment\n- How to validate that config\n\nCodegen for configuration must be updated for all config variables that we want\nto support. For an example, here's how we'd update the `RegionDecorator` to check\nfor service-specific regions:\n\n```java\nclass RegionDecorator : ClientCodegenDecorator {\n    // ...\n    override fun extraSections(codegenContext: ClientCodegenContext): List<AdHocCustomization> {\n        return usesRegion(codegenContext).thenSingletonListOf {\n            adhocCustomization<SdkConfigSection.CopySdkConfigToClientConfig> { section ->\n                rust(\n                    \"\"\"\n                    ${section.serviceConfigBuilder}.set_region(\n                        ${section.sdkConfig}\n                            .service_config()\n                            .and_then(|conf| {\n                                conf.load_config(service_config_key($envKey, $profileKey))\n                                    .map(Region::new)\n                            })\n                            .or_else(|| ${section.sdkConfig}.region().cloned()),\n                    );\n                    \"\"\",\n                )\n            }\n        }\n    }\n    // ...\n```\n\nTo construct the keys necessary to locate the service-specific configuration, we\ngenerate a `service_config_key` function for each service crate:\n\n```java\nclass ServiceEnvConfigDecorator : ClientCodegenDecorator {\n    override val name: String = \"ServiceEnvConfigDecorator\"\n    override val order: Byte = 10\n\n    override fun extras(\n        codegenContext: ClientCodegenContext,\n        rustCrate: RustCrate,\n    ) {\n        val rc = codegenContext.runtimeConfig\n        val serviceId = codegenContext.serviceShape.sdkId().toSnakeCase().dq()\n        rustCrate.withModule(ClientRustModule.config) {\n            Attribute.AllowDeadCode.render(this)\n            rustTemplate(\n                \"\"\"\n                fn service_config_key<'a>(\n                    env: &'a str,\n                    profile: &'a str,\n                ) -> aws_types::service_config::ServiceConfigKey<'a> {\n                    #{ServiceConfigKey}::builder()\n                        .service_id($serviceId)\n                        .env(env)\n                        .profile(profile)\n                        .build()\n                        .expect(\"all field sets explicitly, can't fail\")\n                }\n                \"\"\",\n                \"ServiceConfigKey\" to AwsRuntimeType.awsTypes(rc).resolve(\"service_config::ServiceConfigKey\"),\n            )\n        }\n    }\n}\n```\n\n## Changes checklist\n\n- In `aws-types`:\n  - [x] Add new `service_config: Option<Arc<dyn LoadServiceConfig>>` field to `SdkConfig` and builder.\n  - [x] Add setters and getters for the new `service_config` field.\n  - [x] Add a new `service_config` module.\n    - [x] Add new `ServiceConfigKey` struct and builder.\n    - [x] Add new `LoadServiceConfig` trait.\n- In `aws-config`:\n  - [x] Move profile parsing out of `aws-config` into `aws-runtime`.\n  - [x] Deprecate the `aws-config` reëxports and direct users to `aws-runtime`.\n  - [x] Add a new `EnvServiceConfig` struct and implement `LoadServiceConfig` for it.\n  - [x] Update `ConfigLoader` to set the `service_config` field in `SdkConfig`.\n  - [x] Update all default providers to use the new of the `EnvConfigValue::validate` method.\n- In `aws-runtime`:\n  - [x] Rename all profile-related code moved from `aws-config` to `aws-runtime` so that it's easier to understand in light of the API changes we're making.\n  - [x] Add a new struct `PropertiesKey` and `Properties` to store profile data.\n- [x] Add an integration test that ensures service-specific config has the expected precedence.\n- [x] Update codegen to generate a method to easily construct `ServiceConfigKey`s.\n- [x] Update codegen to generate code that loads service-specific config from the environment for a limited initial set of config variables:\n  - Region\n  - Endpoint URL\n  - Endpoint-related \"built-ins\" like `use_arn_region` and `disable_multi_region_access_points`.\n- [x] Write a [guide](https://github.com/smithy-lang/smithy-rs/discussions/3537) for users.\n  - [x] Explain to users how they can determine a service's ID.\n"
  },
  {
    "path": "design/src/rfcs/rfc0045_configurable_serde.md",
    "content": "<!-- Give your RFC a descriptive name saying what it would accomplish or what feature it defines -->\nRFC: Implementing `serde::Serialize`\n=============\n\n<!-- RFCs start with the \"RFC\" status and are then either \"Implemented\" or \"Rejected\".  -->\n> Status: RFC\n>\n> Applies to: client, server\n\n<!-- A great RFC will include a list of changes at the bottom so that the implementor can be sure they haven't missed anything -->\nFor a summarized list of proposed changes, see the [Changes Checklist](#changes-checklist) section.\n\n<!-- Insert a short paragraph explaining, at a high level, what this RFC is for -->\nThis RFC defines how smithy-rs will enable customers to use the [serde](https://serde.rs) library with generated clients & servers. This is a common request\nfor myriad reasons, but as we have written about [before](https://github.com/awslabs/aws-sdk-rust/issues/269#issuecomment-1227518721) this is a challenging design area. This RFC proposes a new approach: **Rather than implement `Serialize` directly, add a method to types that returns a type that implements `Serialize`.** This solves a number of issues:\n\n  1. It is minimally impactful: It doesn't lock us into one `Serialize` implementation. It contains only one public trait, `SerializeConfigured`. This trait will initially be defined on a per-crate basis to avoid the orphan-trait rule. It also doesn't have any impact on shared runtime crates (since no types actually need to implement serialize).\n  2. It allows customers to configure serde to their use case. For example, for testing/replay you probably _don't_ want to redact sensitive fields but for logging or other forms of data storage, you may want to redact those fields.\n3. The entire implementation is isolated to a single module, making it trivial to feature-gate out.\n\n<!-- The \"Terminology\" section is optional but is really useful for defining the technical terms you're using in the RFC -->\nTerminology\n-----------\n\n- **`serde`**: A specific [Rust library](https://serde.rs) that is commonly used for serialization\n- **`Serializer`**: The serde design decouples the serialization format (e.g. JSON) from the serialization structure of a particular piece of data. This allows the same Rust code to be serialized to CBOR, JSON, etc. The serialization protocol, e.g. `serde_json`, is referred to as the `Serializer`.\n- **Decorator**: The interface by which code separated from the core code generator can customize codegen behavior.\n\n<!-- Explain how users will use this new feature and, if necessary, how this compares to the current user experience -->\nThe user experience if this RFC is implemented\n----------------------------------------------\nCurrently, there is no practical way for customers to link Smithy-generated types with `Serialize`.\nCustomers will bring the `SerdeDecorator` into scope by including it on their classpath when generating clients and servers.\n\nCustomers may add a `serde` trait to members of their model:\n```smithy\nuse smithy.rust#serde;\n@serde\nstructure SomeStructure {\n    field: String\n}\n```\n\nThe `serde` trait can be added to all shapes, including operations and services. When it is applied to a service, all shapes in the service closure will support serialization.\n\n**Note: this RFC only describes `Serialize`. A follow-up RFC and implementation will handle `Deserialize`.**\n\nGenerated crates that include at least one `serde` tagged shape will include a `serde` feature. This will feature gate the module containing the serialization logic. This will provide implementations of `SerializeConfigured` which provides two methods:\n\n```rust,ignore\nmy_thing.serialize_ref(&settings); // Returns `impl Serialize + 'a`\nmy_thing.serialize_owned(settings); // Returns `impl Serialize`\n```\n\nOnce a customer has an object that implements `Serialize` they can then use it with any `Serializer` supported by `serde`.\n```rust,ignore\nuse generated_crate::serde::SerializeConfigured;\nlet my_shape = Shape::builder().field(5).build();\nlet settings = SerializationSettings::redact_sensitive_fields();\nlet as_json = serde_json::to_string(&my_shape.serialize_ref(&settings));\n```\n\n### Customer Use Cases\n#### I want to embed a structure into my own types that implement `Serialize`\nThe generated code includes two methods:\n`serialize_redacted` and `serialize_unredacted`.\n\n> Note: There is nothing in these implementations that rely on implementation details—Customers can implement these methods (or variants of them) themselves.\n\nThese have the correct signatures to be used with `serialize_with`:\n```rust,ignore\nuse generated_crate::serde::serialize_redacted;\n\n#[derive(Serialize)]\nstruct MyStruct {\n    #[serde(serialize_with = \"serialize_redacted\")]\n    inner: SayHelloInput,\n}\n```\n#### I want to serialize data for testing\nThis will be supported in the future. Currently `Deserialize` behavior is not covered by this RFC. Customers can take the same serialization settings they used.\n\n\n#### I want to dump a structured form of data into a database/logs/etc.\nThis is possible by using the base APIs. If customers want to delegate another thread or piece of code to actually perform the serialization, they can use `.serialize_owned(..)` along with [erased-serde](https://crates.io/crates/erased-serde) to accomplish this.\n\n<!-- Explain the implementation of this new feature -->\nHow to actually implement this RFC\n----------------------------------\n\nIn order to provide configurable serialization, this defines the crate-local public trait `SerializeConfigured`:\n```rust,ignore\n/// Trait that allows configuring serialization\n/// **This trait should not be implemented directly!** Instead, `impl Serialize for ConfigurableSerdeRef<T>`\npub trait SerializeConfigured {\n    /// Return a `Serialize` implementation for this object that owns the object.\n    ///\n    /// Use this if you need to create `Arc<dyn Serialize>` or similar.\n    fn serialize_owned(self, settings: SerializationSettings) -> impl Serialize;\n\n    /// Return a `Serialize` implementation for this object that borrows from the given object\n    fn serialize_ref<'a>(&'a self, settings: &'a SerializationSettings) -> impl Serialize + 'a;\n}\n```\n\nWe also need to define `SerializationSettings`. The only setting currently exposed is `redact_sensitive_fields`:\n```rust,ignore\n\n#[non_exhaustive]\n#[derive(Copy, Clone, Debug, Default)]\npub struct SerializationSettings {\n    /// Replace all sensitive fields with `<redacted>` during serialization\n    pub redact_sensitive_fields: bool,\n}\n```\n\nWe MAY add additional configuration options in the future, but will keep the default behavior matching current behavior. Future options include:\n- Serialize `null` when a field is unset (the current default is to skip serializing that field)\n- Serialize blobs via a list of numbers instead of via base64 encoding\n- Change the default format for datetimes (current `HttpDate`)\n\nNo objects actually implement `SerializeConfigured`. Instead, the crate defines two private structs:\n```rust,ignore\npub(crate) struct ConfigurableSerde<T> {\n    pub(crate) value: T,\n    pub(crate) settings: SerializationSettings\n}\n\npub(crate) struct ConfigurableSerdeRef<'a, T> {\n    pub(crate) value: &'a T,\n    pub(crate) settings: &'a SerializationSettings\n}\n```\n> **Why two structs?**\n>\n> We need to support two use cases—one where the customer wants to maintain ownership of their data and another where the customer wants to create `Box<dyn Serialize>` or other fat pointer. There is a blanket impl for `Serialize` from `ConfigurableSerde` to `ConfigurableSerdeRef`.\n\nThe `SerializeConfigured` trait has a blanket impl for `ConfigurableSerdeRef`:\n```rust,ignore\n/// Blanket implementation for all `T` such that `ConfigurableSerdeRef<'a, T>` implements `Serialize`.\nimpl<T> SerializeConfigured for T\n    where for<'a> ConfigurableSerdeRef<'a, T>: Serialize {\n    fn serialize_owned(\n        self,\n        settings: SerializationSettings,\n    ) -> impl Serialize {\n        ConfigurableSerde {\n            value: self,\n            settings,\n        }\n    }\n\n    fn serialize_ref<'a>(\n        &'a self,\n        settings: &'a SerializationSettings,\n    ) -> impl Serialize + 'a {\n        ConfigurableSerdeRef {\n            value: self,\n            settings,\n        }\n    }\n}\n```\n\nThe job of the code generator is then to implement `ConfigurableSerdeRef` for all the specific `T` that we wish to serialize.\n\n#### Supporting Sensitive Shapes\nHandling `@sensitive` is done by wrapping memers in `Sensitive<'a T>(&'a T)` during serialization. The `serialize` implementation consults the settings to determine if redaction is required.\n\n```rust,ignore\nif let Some(member_1) = &inner.foo {\n    s.serialize_field(\"foo\",\n        &Sensitive(&member_1.serialize_ref(&self.settings)).serialize_ref(&self.settings),\n    )?;\n}\n```\n\nNote that the exact mechanism for supporting sensitive shapes is crate-private and can be changed in the future.\n\n#### Supporting Maps and Lists\n\nFor Maps and Lists, we need to be able to handle the case where two different `Vec<String>` may be serialized differently. For example, one may target a `Sensitive` string and the other may target a non-sensitive string.\n\nTo handle this case, we generate a wrapper struct for collections:\n\n```rust,ignore\nstruct SomeStructWrapper<'a>(&'a Vec<SomeStruct>);\n```\n\nWe then implement `Serialize` for this wrapper which allows us to control behavior on a collection-by-collection basis without running into conflicts.\n\n> **Note**: This is a potential area where future optimizations could reduce the amount of generated code if we were able to detect that collection serialization implementations were identical and deduplicate them.\n\n#### Supporting `DateTime`, `Blob`, `Document`, etc.\nFor custom types that do not implement `Serialize`, we generate crate-private implementations, only when actually needed:\n```rust,ignore\nimpl<'a> Serialize for ConfigurableSerdeRef<'a, DateTime> {\n    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> where S: Serializer {\n        serializer.serialize_str(&self.value.to_string())\n    }\n}\n```\n\n\nChanges checklist\n-----------------\n\n- [x] Define `SerializeConfigured`\n- [x] Define `ConfigurableSerde`/`SerdeRef`\n- [x] Generate implementations for all types in the service closure\n- [x] Handle sensitive shapes\n- [ ] Implement `Deserialize`\n"
  },
  {
    "path": "design/src/rfcs/rfc0046_server_request_metrics.md",
    "content": "<!-- Give your RFC a descriptive name saying what it would accomplish or what feature it defines -->\nRFC: Server request metrics\n=============\n\n<!-- RFCs start with the \"RFC\" status and are then either \"Implemented\" or \"Rejected\".  -->\n> Status: RFC\n>\n> Applies to: server\n\n<!-- A great RFC will include a list of changes at the bottom so that the implementor can be sure they haven't missed anything -->\nFor a summarized list of proposed changes, see the [Changes Checklist](#changes-checklist) section.\n\n<!-- Insert a short paragraph explaining, at a high level, what this RFC is for -->\nThis RFC defines the spec for metrique metrics integration for smithy generated servers using middleware. It will enable users to have an out-of-the-box experience with a set of default request and response metrics, as well as exposing the ability to define and integrate their own additional metrics using metrique in a turnkey fashion. The design ensures to maintain support for folding metrics from all layers of middleware, from custom outer-level middleware to model-level middleware and operation handlers. It also ensures that configuration options are available and extensible.\n\n<!-- The \"Terminology\" section is optional but is really useful for defining the technical terms you're using in the RFC -->\nTerminology\n-----------\n\n- **metrique**: https://crates.io/crates/metrique\n\n<!-- Explain how users will use this new feature and, if necessary, how this compares to the current user experience -->\nThe user experience if this RFC is implemented\n----------------------------------------------\n\n### In the current version of the SDK\n\nSee [Appendix A](#appendix-a-code-snippet-for-what-users-need-to-do-without-this-change) for a code snippet.\n\nUsers need to define their own metrics middleware. This involves creating a metrics HTTP plugin to support operation-level metrics, as well as a metrics layer if there is a need to fold outer and route level metrics.\n\nTo avoid bloating this RFC, see below for an example of the code the user would need to write to integrate metrics into their smithy-rs service with compatibility with all middleware layers. This is with a barebones example with no imports, a few placeholder metrics, and no further logic for injection of customizations such as initialization settings.\n\n### Once this RFC is implemented\n\nUsers will get default metrics in their service, with the ability to add an outer `MetricsLayer` for further configuration of metrics collection, including defining their own custom metrics that can be set throughout the request/response lifecycle via extensions, which will all be folded together into a single metrics entry emitted at the end of the lifecycle.\n\nFuture scope can elicit a codegen change to add the HTTP plugin for default metrics via declarative opt-in in the `smithy-build.json` to avoid needing code configuration.\n\nAfter the runtime crate is merged and before the codegen changes are made, users can add default metrics by adding the plugin to their service programmatically.\n\n```rust,ignore\nfn main() {\n    let http_plugins = HttpPlugins::new().push(DefaultMetricsPlugin);\n    let config = PokemonServiceConfig::builder().http_plugin(http_plugins).build();\n    let app = PokemonService::builder(config).build()\n}\n```\n\nFor further configuration, a tower layer will be provided that takes an initialization function that gives the user full control over which metrics struct and sink they want to use.\n\nFor metrics control in user-defined operation handlers, the types of fields marked with `#[smithy_metrics(operation)]` will be available to be extracted in operation handlers.\n\nUsers can get these via `Metrics<T>`, which can be added as a parameter in operation handlers:\n\n```rust,ignore\nfn main() {\n    let metrics_layer = MetricsLayer::builder()\n        .init_metrics(|req| MyMetrics::default().append_on_drop(my_sink))\n        .build();\n}\n\n#[smithy_metrics]\n#[metrics]\nstruct MyMetrics {\n    #[smithy_metrics(operation)]\n    #[metrics(flatten)]\n    operation_metrics: PokemonOperationMetrics,\n    custom_metric: Option<String>\n}\n\n#[metrics]\nstruct PokemonOperationMetrics {\n    #[metrics(flatten)]\n    get_pokemon_species_metrics: GetPokemonSpeciesMetrics,\n}\n\n#[metrics]\nstruct GetPokemonSpeciesMetrics {\n    request_pokemon_name: Option<String>,\n}\n\n/// Setting metrics in operation handler\npub async fn get_pokemon_species(\n    input: input::GetPokemonSpeciesInput,\n    state: Extension<Arc<State>>,\n    mut metrics: Metrics<PokemonOperationMetrics>\n) -> Result<output::GetPokemonSpeciesOutput, error::GetPokemonSpeciesError> {\n    metrics.get_pokemon_species_metrics.requested_pokemon_name = Some(input.name.clone());\n}\n```\n\n`new_with_sink` will be a convenience API to use the default metrics with a custom sink.\n\n```rust,ignore\nfn main() {\n    let metrics_layer = MetricsLayer::new_with_sink(my_sink);\n}\n```\n\n<!-- Explain the implementation of this new feature -->\nHow to actually implement this RFC\n----------------------------------\n\nThere will be two new rust-runtime crates `aws-smithy-http-server-metrics` and `aws-smithy-http-server-metrics-macro`, with types re-exported in the generated server.\n\n### `DefaultMetricsPlugin` struct\n\nThe focal struct that users can add to their service as an HTTP plugin which provides the default metrics. If no outer metrics layer exists, it will initialize the metrics from this layer if a sink has been attached to the metrique's application-wide `ServiceMetrics`. If an outer metrics layer was added, it will retrieve the instance from the request/response extensions and add them.\n\nWe can later add this into the codegen as a declarative config option to make it fully batteries-included from the codegen layer. Though, precautions will need to be taken to prevent the possibility of multiple metrics plugins existing and creating duplicate metrics.\n\n#### This will allow users the following construction experiences:\n\n`DefaultMetricsPlugin` (for default)\n\n- For a metrics plugin that uses the application-wide `metrique::ServiceMetrics`.\n\n### `DefaultMetricsPluginService` struct\n\nA tower service for metrics that will contain the logic for setting the default operation-specific metrics.\n\n### Super traits\n\nThese super traits will contain blanket implementations for reducing duplication in trait bounds.\n\n#### `ThreadSafeCloseEntry: CloseEntry + Send + Sync + 'static`\n\n#### `ThreadSafeEntrySink<Entry>: EntrySink<RootEntry<Entry::Closed>> + Send + Sync + 'static`\n\n#### `InitMetrics<Entry, Sink>: Fn() -> AppendAndCloseOnDrop<Entry, Sink> + Clone + Send + Sync + 'static`\n\n#### `ResponseMetrics<Entry>: Fn(&mut Response<ResBody>, &mut Entry) + Clone + Send + Sync + 'static`\n\n### `MetricsLayer` struct\n\nThe focal struct that users can add to their service as a tower `Layer` for metrics, containing a `builder` method.\n\nAny metrics configuration such as altering the sink, using a custom metrique metrics type, etc will go through this metrics layer.\n\nThis gives users the ability to add a metrics tower layer that initializes metrics at the outermost level in order to fold all metrics throughout the request together. Request/response extensions provides a handle to the metrics at every subsequent layer. There will be logic in the `DefaultMetricsPlugin` to use the initialized metrics from the extension if a `MetricsLayer` has been added.\n\n#### Will have following generics and trait bounds:\n\n`Entry: ThreadSafeCloseEntry`\n\n- For the metrique metrics struct (i.e. annotated with #[metrics]).\n\n- Default type parameter of `DefaultMetrics`\n\n`Sink: ThreadSafeEntrySink`\n\n- For the entry sink where entries are stored in an in-memory buffer until they can be written to the destination.\n\n- Default type parameter of `DefaultSink` (BoxEntrySink)\n\n`Init: InitMetrics<Entry, Sink>`\n\n- Closure trait bound for the metrics initialization function. The metrics initialization must be passed down and invoked in the `MetricsLayerService`'s, so that entries are appended and closed after each request when the metrics guard is dropped. In a future version, we may be able to implement manual appending and closing of entries to enable users to pass an instance of the metrics struct itself rather than a function that returns an `AppendAndCloseOnDrop`.\n\n- Default type parameter of `fn() -> AppendAndCloseOnDrop<Entry, Sink>`\n\n`Res: ResponseMetrics<Entry>`\n\n- Closure trait bound to allow users to set metrics however they like from the response object, which will be invoked in the `MetricsLayerService` after the metrics have been initialized.\n\n- Default type parameter of `fn(&Response<ResBody>, &mut Entry)`\n\n#### Will have the following fields:\n\n```rust,ignore\ninit_metrics: Init,\nresponse_metrics: Option<Res>,\ndefault_metrics_extension_fn: fn(\n    &mut Request<ReqBody>,\n    &mut Entry,\n    DefaultRequestMetricsConfig,\n    DefaultResponseMetricsConfig,\n    DefaultMetricsServiceState,\n),\ndefault_req_metrics_config: DefaultRequestMetricsConfig,\ndefault_res_metrics_config: DefaultResponseMetricsConfig,\n_entry_sink: PhantomData<S>,\n```\n\n#### Will have the following implementations:\n\n- A fully generic implementation with a `builder()` method that returns a `MetricsLayerBuilder`.\n\n- Implements the tower `Layer` trait to map to the `MetricsLayerService`\n\n#### This will allow users the following construction experiences:\n\n`MetricsLayer::builder()`\n\n- For a builder with a required metrics initialization and optional configuration for default metrics inclusion, setting custom request/response metrics, etc\n\n### `MetricsLayerBuilder` struct\n\nA typestate builder for `MetricsLayer` containing the same trait bounds. The `build` implementations for custom metrics type will be generated by the proc macro, which will set the `default_metrics_extension_fn` to add the default metrics extensions to the `DefaultMetricsPlugin`.\n\nThe states will be:\n\n`NeedsInitialization`\n\n- Exposes `init_metrics` method so an initialization closure can be provided.\n\n- Exposes `try_init_with_defaults` with default metrics initialization using metrique's application-wide global entry sink [`metrique::ServiceMetrics`], returning an error if a sink has not been attached.\n\n`WithRq`\n\nA state where the field for setting metrics from the req object has been set.\n\n- Exposes methods for disabling any/all of the default metrics.\n\n- Exposes method for taking Fn closures for setting metrics from res objects.\n\n- Exposes build method.\n\n`WithRqAndRs`\n\nA state where both the fields for setting metrics from the req and res object have been set.\n\n- Exposes methods for disabling any/all of the default metrics.\n\n- Exposes build method.\n\nImplementations for each state will be made for metrics structs annotated with the `#[smithy_metrics]` proc macro that exposes a `build` method.\n\nDeclarative macros will be used for the typestate pattern.\n\n### `MetricsLayerService` struct\n\nA tower service for metrics that will contain the core logic for invoking the logic for metrics initialization and setting the metrics from the request/response objects. The `call` implementation will essentially invoke the passed closures.\n\n### `DefaultMetrics` struct\n\nA struct for default metrics. This will use the `#[smithy_metrics]` and be used as the default type parameter for `MetricsLayer`.\n\n### `DefaultRequestMetrics` struct\n\nA struct that will contain fields for the default request metrics, a field for which will be added to a struct containing the `#[smithy_metrics]` annotation.\n\n### `DefaultResponseMetrics` struct\n\nA struct that will contain fields for the default response metrics, a field for which will be added to a struct containing the `#[smithy_metrics]` annotation.\n\n### `DefaultRequestMetricsConfig` struct\n\nA struct that will contain fields for control of toggleability of the default request metrics.\n\n### `DefaultResponseMetricsConfig` struct\n\nA struct that will contain fields for control of toggleability of the default response metrics.\n\n### `DefaultRequestMetricsExtension` struct\n\nA struct that will contain a `DefaultRequestMetrics` and `DefaultRequestMetricsConfig` to be passed through the request extensions from an outer metrics layer to be used in the metrics plugin to set the default metrics with the given configuration. This enables us to fold all metrics together.\n\n### `DefaultResponseMetricsExtension` struct\n\nA struct that will contain a `DefaultResponseMetrics` and `DefaultResponseMetricsConfig` to be passed through the request extensions from an outer metrics layer to be used in the metrics plugin to set the default metrics with the given configuration. This enables us to fold all metrics together.\n\n### `DefaultMetricsExtension` struct\n\nA struct that will contain a `DefaultRequestMetricsExtension` and `DefaultResponseMetricsExtension` to be inserted into the request extensions so that metrics from `MetricsLayer` can be folded with default metrics set in `DefaultMetricsPlugin`.\n\n### `operation::Metrics` struct\n\nA struct that can be extracted from the operation handlers. This will implement `FromParts` to do the extraction of the actual `operation::MetricsExtension` that will be inserted in the request extensions in order to build and return a struct of this type. It will also implement `Deref` and `DerefMut` to allow direct setting of the metrics fields.\n\n### `operation::MetricsExtension` struct\n\nA wrapper struct for extensions that are inserted as a result of the `#[smithy_metrics(operation)]` attribute macro on a struct field. An `Arc<Mutex<SlotGuard<Slot<X>>>>>` will be used to wrap any extensions to be forward compatible with the `Clone` bound introduced in http 1.x's (smithy-rs currently is on http 0.2, but the http 1.x work is underway and soon to be complete). This struct will provide User's an API where they do not have to be exposed to this complicated type. The double slot will provide a better public API via the `operation::Metrics` struct. The outer `SlotGuard` will fold into the root level metrics while the inner is for the operation handler side.\n\nThis struct will need to be public to allow usage in aws-smithy-http-server-metrics-macro, but should have negative guidance in direct usage.\n\n### `#[smithy_metrics]` attribute proc macro\n\nA proc macro that can be placed on a metrique metrics struct for the adding of default metrics fields and the expansion of a `MetricsLayerBuilder` implementation for the annotated struct.\n\nThis will also come with `#[smithy_metrics(operation)]` to mark struct fields for insertion to the request extensions to be used in custom middleware or operation handlers.\n\n<!-- Include a checklist of all the things that need to happen for this RFC's implementation to be considered complete -->\nChanges checklist\n-----------------\n\n- [x] Create `rust-runtime` crates `aws-smithy-http-server-metrics` and `aws-smithy-http-server-metrics-macro`\n\n- [x] Implement struct `MetricsLayer`\n\n    - [x] Define struct with generics, trait bounds, and default type parameters\n\n    - [x] Implementation of `builder()` method\n\n    - [x] Implementation of `new_with_sink()` method to use the `DefaultMetrics` with a custom sink\n\n    - [x] Layer implementation to map to `MetricsLayerService`\n\n- [x] Implement common traits and types\n\n- [x] Implement struct `MetricsLayerBuilder`\n\n    - [x] Define struct with generics and trait bounds for metrics and typestate pattern\n\n    - [x] `NeedsInitialization` state generic implementation with `init_metrics()` method\n\n    - [x] `WithRq` state implementation\n\n    - [x] `WithRqAndRs` state implementation\n\n    - [x] `build()` implementations for each state for `DefaultMetrics` (may be replaced with the proc macro expansion when that is done)\n\n    - [x] Declarative macros to reduce duplication\n\n- [x] Implement struct `MetricsLayerService` to contain the tower service logic\n\n    - [x] Implement `Clone`\n\n    - [x] Implement tower `Service` to contain logic for:\n\n        - [x] Invoking the initialization function\n\n        - [x] Invoking the functions for adding the default request/response metrics extensions\n\n        - [x] Invoking the request/response metrics functions\n\n- [x] Implement struct `DefaultMetricsPlugin`\n\n    - [x] Implement HTTPMarker\n\n    - [x] Implement `Plugin` to map to `MetricsService`\n\n- [x] Implement struct `DefaultMetricsPluginService`\n\n    - [x] Implement `Clone`\n\n    - [x] Implement tower `Service` to contain logic for:\n\n        - [x] Retrieving `DefaultRequestMetricsExtension` from the request extensions when an outer metrics layer was added.\n\n        - [x] In the case where there is no `DefaultRequestMetricsExtension` in the request extensions, it means there was no outer metrics layer added. Therefore, we will initialize default metrics in the plugin defaults if a global sink has been installed.\n\n- [x] Define struct `DefaultMetrics` with a request and response metrics field of the types `DefaultRequestMetrics` and `DefaultResponseMetrics`, respectively\n\n- [x] Define struct `DefaultRequestMetrics` to contain the out-of-the-box request metrics\n\n- [x] Define struct `DefaultResponseMetrics`to contain the out-of-the-box response metrics\n\n- [x] Define struct `DefaultRequestMetricsConfig` for default request metrics configuration\n\n- [x] Define struct `DefaultResponseMetricsConfig` for default response metrics configuration\n\n- [x] Define struct `DefaultRequestMetricsExtension` for passing default request metrics and config instances from an outer metrics layer to the metrics plugin via request extensions to be able to fold them together\n\n- [x] Define struct `DefaultResponseMetricsExtension` for passing default response metrics and config instances from an outer metrics layer to the metrics plugin via response extensions to be able to fold them together\n\n- [x] Define struct `DefaultMetricsExtension`\n\n- [x] Define and implement struct `operation::Metrics`\n    \n    - [x] Implement FromParts, Deref, DerefMut\n\n- [x] Define and implement struct `operation::MetricsExtension`\n\n- [x] Implement proc macro attribute `#[smithy_metrics]`\n\n    - [x] Implement expansion to wrap the types of fields annotated with `#[smithy_metrics(operation)]` with `Slotguard` if the user hasn't explicitly done so, or show an error message telling them to\n\n    - [x] Implement expansion of a `MetricsLayerBuilder` implementation for receiving metrics type containing a `build` method\n\n- [x] Create proc macro attribute `#[smithy_metrics(operation)]` on fields of a metrics struct to give users the ability to annotate the fields they want to be accessible from the request extensions down the line, such as in custom middleware or operation handlers\n\n# Appendix A: Code snippet for what users need to do without this change\n\n```rust,ignore\nfn main() {\n    let metrics_layer = MetricsLayer;\n    let metrics_plugin = MetricsPlugin;\n\n    let http_plugins = HttpPlugins::new()\n        .push(metrics_plugin)\n        .insert_operation_extension();\n\n    let config = PokemonServiceConfig::builder()\n        .http_plugin(http_plugins)\n        .build();\n    \n    let app = PokemonService::builder(config)\n        .get_pokemon_species(get_pokemon_species)\n        .build()\n        .expect(\"failed to build an instance of PokemonService\");\n\n    let service = metrics_layer.layer(app);\n}\n\n/// Operation handler for get_pokemon_species\nasync fn get_pokemon_species(\n    input: input::GetPokemonSpeciesInput,\n    state: Extension<Arc<State>>,\n    Extension(mut metrics): OperationMetricsExtension,\n) -> Result<output::GetPokemonSpeciesOutput, error::GetPokemonSpeciesError> {\n    metrics.get_pokemon_species_metrics = Some(\"Pokemon Species Metrics\".to_string());\n    // ... Business logic\n}\n\n#[metrics(rename_all = \"PascalCase\")]\n#[derive(Default)]\nstruct Metrics {\n    #[metrics(flatten)]\n    request_metrics: RequestMetrics,\n    #[metrics(flatten)]\n    operation_metrics: SlotGuard<OperationMetrics>,\n    #[metrics(flatten)]\n    response_metrics: ResponseMetrics\n    // ... other metrics\n}\nimpl Metrics {\n    pub fn init() -> ApiRequestMetricsGuard<DefaultQueue> {\n        Self {\n            operation,\n            ..Default::default()\n        }\n        .append_on_drop(ServiceMetrics::sink())\n    }\n}\n\n#[metrics]\n#[derive(Default)]\nstruct RequestMetrics {\n    service_name: Option<String>,\n    operation_name: Option<String>,\n    service_version: Option<String>,\n    request_id: Option<String>,\n    #[metrics(timestamp)]\n    start: Timestamp\n    // ... other metrics\n}\n\n#[metrics]\n#[derive(Default)]\nstruct ResponseMetrics {\n    http_status_code: Option<String>\n    // ... other metrics\n}\n\n#[metrics]\n#[derive(Default)]\nstruct OperationMetrics {\n    get_pokemon_species_metrics: Option<String>\n}\n\n#[derive(Debug)]\nstruct MetricsLayer {}\n\nimpl<S> Layer<S> for MetricsLayer {\n    type Service = MetricsService<S, Init, Req, Res, ReqBody, ResBody, CE, ES>;\n\n    fn layer(&self, inner: S) -> Self::Service {\n        MetricsService {\n            inner\n        }\n    }\n}\n\n#[derive(Debug)]\nstruct MetricsLayerService<S> {\n    inner: S\n}\nimpl<S, ReqBody, ResBody> Service<Request<ReqBody>> for MetricsService<S, ReqBody, ResBody> {\n    type Response = S::Response;\n    type Error = S::Error;\n    type Future = std::pin::Pin<\n        Box<dyn Future<Output = Result<Self::Response, Self::Error>> + Send + 'static>,\n    >;\n\n    fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {\n        self.inner.poll_ready(cx)\n    }\n\n    fn call(&mut self, mut req: Request<ReqBody>) -> Self::Future {\n        let mut metrics = Metrics::init();\n        \n        let mut request_metrics = metrics.request_metrics;\n        let mut response_metrics = metrics.response_metrics;\n\n        let api_operation_metrics = metrics.operation_metrics\n            .open(OnParentDrop::Discard)\n            .expect(\"unreachable: the slot was created in this scope and is not opened before this point\");\n        req.extensions_mut().insert(api_operation_metrics);\n        \n        request_metrics.request_id = try_extract_request_id();\n        request_metrics.start = Default::default();\n        // ... set other metrics\n\n        let future = self.inner.call(req);\n\n        futures::FutureExt::boxed(async move {\n            let response = match future.await {\n                Ok(resp) => resp,\n                Err(e) => return Err(e),\n            };\n\n            response_metrics.http_status_code = Some(response.status().as_u16());\n            // ... set other metrics\n\n            Ok(response)\n        })\n    }\n}\n\n#[derive(Debug)]\nstruct MetricsPlugin {}\n\nimpl HttpMarker for MetricsPlugin {}\n\nimpl<Ser, Op, T> Plugin<Ser, Op, T> for MetricsPlugin\nwhere\n    Op: OperationShape,\n    Ser: ServiceShape,\n{\n    type Output = MetricsPluginService<T>;\n\n    fn apply(&self, inner: T) -> Self::Output {\n        return MetricsPluginService {\n            inner,\n            operation_name: None,\n            service_name: None,\n            service_version: None,\n        };\n\n        MetricsPluginService {\n            inner,\n            operation_name: Op::ID.name(),\n            service_name: Ser::ID.name(),\n            service_version: Ser::VERSION,\n        }\n    }\n}\n\n#[derive(Debug)]\npub struct MetricsPluginService<T> {\n    inner: T,\n    operation_name: &'static str,\n    service_name: &'static str,\n    service_version: &'static str,\n}\n\nimpl<T> Clone for MetricsPluginService<T>\nwhere\n    T: Clone,\n{\n    fn clone(&self) -> Self {\n        Self {\n            inner: self.inner.clone(),\n            operation_name: self.operation_name,\n            service_name: self.service_name,\n            service_version: self.service_version,\n        }\n    }\n}\n\nimpl<T, ReqBody, ResBody> Service<Request<ReqBody>> for MetricsPluginService<T>\nwhere\n    T: Service<Request<ReqBody>, Response = Response<ResBody>>,\n    T::Future: Send + 'static,\n{\n    type Response = T::Response;\n    type Error = T::Error;\n    type Future = T::Future;\n\n    fn call(&mut self, mut request: Request<ReqBody>) -> Self::Future {\n        let request_metrics = request\n            .extensions_mut()\n            .get_mut::<SlotGuard<DefaultRequestMetrics>>();\n\n        if let Some(request_metrics) = request_metrics {\n            request_metrics.operation_name = Some(self.operation_name.to_string());\n            request_metrics.service_name = Some(self.service_name.to_string());\n            request_metrics.service_version = Some(self.service_version.to_string());\n        }\n\n        self.inner.call(request)\n    }\n\n    fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {\n        self.inner.poll_ready(cx)\n    }\n}\n\nfn try_extract_request_id<B>(request: &Request<B>) -> Option<String> {\n    request\n        .headers()\n        .get(\"requestid\")?\n        .to_str()\n        .inspect_err(|error| {\n            tracing::warn!(\n                \"requestid header was not representable as string: {:?}\",\n                error\n            );\n        })\n        .ok()\n        .map(Into::into)\n}\n```"
  },
  {
    "path": "design/src/rfcs/rfc_template.md",
    "content": "<!-- Give your RFC a descriptive name saying what it would accomplish or what feature it defines -->\nRFC: Your RFC\n=============\n\n<!-- RFCs start with the \"RFC\" status and are then either \"Implemented\" or \"Rejected\".  -->\n> Status: RFC\n>\n> Applies to: client, server\n\n<!-- A great RFC will include a list of changes at the bottom so that the implementor can be sure they haven't missed anything -->\nFor a summarized list of proposed changes, see the [Changes Checklist](#changes-checklist) section.\n\n<!-- Insert a short paragraph explaining, at a high level, what this RFC is for -->\nThis RFC defines how...\n\n<!-- The \"Terminology\" section is optional but is really useful for defining the technical terms you're using in the RFC -->\nTerminology\n-----------\n\n- **Some Term**: A definition for that term\n\n<!-- Explain how users will use this new feature and, if necessary, how this compares to the current user experience -->\nThe user experience if this RFC is implemented\n----------------------------------------------\n\nIn the current version of the SDK, users do X like this...\nOnce this RFC is implemented, users will do X like this instead...\n\n<!-- Explain the implementation of this new feature -->\nHow to actually implement this RFC\n----------------------------------\n\nIn order to implement this feature, we need to add X and update Y...\n\n<!-- Include a checklist of all the things that need to happen for this RFC's implementation to be considered complete -->\nChanges checklist\n-----------------\n\n- [x] Create new struct `NewFeature`\n"
  },
  {
    "path": "design/src/server/anatomy.md",
    "content": "# The Anatomy of a Service\n\nWhat is [Smithy](https://awslabs.github.io/smithy/2.0/index.html)? At a high-level, it's a grammar for specifying services while leaving the business logic undefined. A [Smithy Service](https://awslabs.github.io/smithy/2.0/spec/service-types.html#service) specifies a collection of function signatures in the form of [Operations](https://awslabs.github.io/smithy/2.0/spec/service-types.html#operation), their purpose is to encapsulate business logic. A Smithy implementation should, for each Smithy Service, provide a builder, which accepts functions conforming to said signatures, and returns a service subject to the semantics specified by the model.\n\nThis survey is disinterested in the actual Kotlin implementation of the code generator, and instead focuses on the structure of the generated Rust code and how it relates to the Smithy model. The intended audience is new contributors and users interested in internal details.\n\nDuring the survey we will use the [`pokemon.smithy`](https://github.com/smithy-lang/smithy-rs/blob/main/codegen-core/common-test-models/pokemon.smithy) model as a reference:\n\n```smithy\n/// A Pokémon species forms the basis for at least one Pokémon.\n@title(\"Pokémon Species\")\nresource PokemonSpecies {\n    identifiers: {\n        name: String\n    },\n    read: GetPokemonSpecies,\n}\n\n/// A users current Pokémon storage.\nresource Storage {\n    identifiers: {\n        user: String\n    },\n    read: GetStorage,\n}\n\n/// The Pokémon Service allows you to retrieve information about Pokémon species.\n@title(\"Pokémon Service\")\n@restJson1\nservice PokemonService {\n    version: \"2021-12-01\",\n    resources: [PokemonSpecies, Storage],\n    operations: [\n        GetServerStatistics,\n        DoNothing,\n        CapturePokemon,\n        CheckHealth\n    ],\n}\n```\n\nSmithy Rust will use this model to produce the following API:\n\n```rust,no_run\n# extern crate pokemon_service_server_sdk;\n# extern crate aws_smithy_http_server;\n# use aws_smithy_http_server::protocol::rest_json_1::{RestJson1, router::RestRouter};\n# use aws_smithy_http_server::routing::{Route, RoutingService};\n# use pokemon_service_server_sdk::{input::*, output::*, error::*, operation_shape::*, PokemonServiceConfig, PokemonService};\n// A handler for the `GetPokemonSpecies` operation (the `PokemonSpecies` resource).\nasync fn get_pokemon_species(input: GetPokemonSpeciesInput) -> Result<GetPokemonSpeciesOutput, GetPokemonSpeciesError> {\n    todo!()\n}\n\nlet config = PokemonServiceConfig::builder().build();\n\n// Use the service builder to create `PokemonService`.\nlet pokemon_service = PokemonService::builder(config)\n    // Pass the handler directly to the service builder...\n    .get_pokemon_species(get_pokemon_species)\n    /* other operation setters */\n    .build()\n    .expect(\"failed to create an instance of the Pokémon service\");\n# let pokemon_service: PokemonService<RoutingService<RestRouter<Route>, RestJson1>>  = pokemon_service;\n```\n\n## Operations\n\nA [Smithy Operation](https://awslabs.github.io/smithy/2.0/spec/service-types.html#operation) specifies the input, output, and possible errors of an API operation. One might characterize a Smithy Operation as syntax for specifying a function type.\n\nWe represent this in Rust using the [`OperationShape`](https://docs.rs/aws-smithy-http-server/latest/aws_smithy_http_server/operation/trait.OperationShape.html) trait:\n\n```rust\n# extern crate aws_smithy_http_server;\n# use aws_smithy_http_server::shape_id::ShapeId;\npub trait OperationShape {\n    /// The name of the operation.\n    const ID: ShapeId;\n\n    /// The operation input.\n    type Input;\n    /// The operation output.\n    type Output;\n    /// The operation error. [`Infallible`](std::convert::Infallible) in the case where no error\n    /// exists.\n    type Error;\n}\n# use aws_smithy_http_server::operation::OperationShape as OpS;\n# impl<T: OpS> OperationShape for T {\n#   const ID: ShapeId = <T as OpS>::ID;\n#   type Input = <T as OpS>::Input;\n#   type Output = <T as OpS>::Output;\n#   type Error = <T as OpS>::Error;\n# }\n```\n\nFor each Smithy Operation shape,\n\n```smithy\n/// Retrieve information about a Pokémon species.\n@readonly\n@http(uri: \"/pokemon-species/{name}\", method: \"GET\")\noperation GetPokemonSpecies {\n    input: GetPokemonSpeciesInput,\n    output: GetPokemonSpeciesOutput,\n    errors: [ResourceNotFoundException],\n}\n```\n\nthe following implementation is generated\n\n```rust\n# extern crate pokemon_service_server_sdk;\n# extern crate aws_smithy_http_server;\n# use aws_smithy_http_server::{operation::OperationShape, shape_id::ShapeId};\n# use pokemon_service_server_sdk::{input::*, output::*, error::*};\n/// Retrieve information about a Pokémon species.\npub struct GetPokemonSpecies;\n\nimpl OperationShape for GetPokemonSpecies {\n    const ID: ShapeId = ShapeId::new(\"com.aws.example#GetPokemonSpecies\", \"com.aws.example\", \"GetPokemonSpecies\");\n\n    type Input = GetPokemonSpeciesInput;\n    type Output = GetPokemonSpeciesOutput;\n    type Error = GetPokemonSpeciesError;\n}\n```\n\nwhere `GetPokemonSpeciesInput`, `GetPokemonSpeciesOutput` are both generated from the Smithy structures and `GetPokemonSpeciesError` is an enum generated from the `errors: [ResourceNotFoundException]`.\n\nNote that the `GetPokemonSpecies` marker structure is a zero-sized type (ZST), and therefore does not exist at runtime - it is a way to attach operation-specific data on an entity within the type system.\n\nThe following nomenclature will aid us in our survey. We describe a `tower::Service` as a \"model service\" if its request and response are Smithy structures, as defined by the `OperationShape` trait - the `GetPokemonSpeciesInput`, `GetPokemonSpeciesOutput`, and `GetPokemonSpeciesError` described above. Similarly, we describe a `tower::Service` as a \"HTTP service\" if its request and response are [`http`](https://github.com/hyperium/http) structures - `http::Request` and `http::Response`.\n\nThe constructors exist on the marker ZSTs as an extension trait to `OperationShape`, namely [`OperationShapeExt`](https://docs.rs/aws-smithy-http-server/latest/aws_smithy_http_server/operation/trait.OperationShapeExt.html):\n\n```rust\n# extern crate aws_smithy_http_server;\n# use aws_smithy_http_server::operation::*;\n/// An extension trait over [`OperationShape`].\npub trait OperationShapeExt: OperationShape {\n    /// Creates a new [`Service`] for well-formed [`Handler`]s.\n    fn from_handler<H, Exts>(handler: H) -> IntoService<Self, H>\n    where\n        H: Handler<Self, Exts>,\n        Self: Sized;\n\n    /// Creates a new [`Service`] for well-formed [`Service`](tower::Service)s.\n    fn from_service<S, Exts>(svc: S) -> Normalize<Self, S>\n    where\n        S: OperationService<Self, Exts>,\n        Self: Sized;\n}\n# use aws_smithy_http_server::operation::OperationShapeExt as OpS;\n# impl<T: OpS> OperationShapeExt for T {\n#   fn from_handler<H, Exts>(handler: H) -> IntoService<Self, H> where H: Handler<Self, Exts>, Self: Sized { <T as OpS>::from_handler(handler) }\n#   fn from_service<S, Exts>(svc: S) -> Normalize<Self, S> where S: OperationService<Self, Exts>, Self: Sized { <T as OpS>::from_service(svc) }\n# }\n```\n\nObserve that there are two constructors provided: `from_handler` which takes a `H: Handler` and `from_service` which takes a `S: OperationService`. In both cases `Self` is passed as a parameter to the traits - this constrains `handler: H` and `svc: S` to the signature given by the implementation of `OperationShape` on `Self`.\n\nThe [`Handler`](https://docs.rs/aws-smithy-http-server/latest/aws_smithy_http_server/operation/trait.Handler.html) and [`OperationService`](https://docs.rs/aws-smithy-http-server/latest/aws_smithy_http_server/operation/trait.OperationService.html) both serve a similar purpose - they provide a common interface for converting to a model service `S`.\n\n- The `Handler<GetPokemonSpecies>` trait covers all async functions taking `GetPokemonSpeciesInput` and asynchronously returning a `Result<GetPokemonSpeciesOutput, GetPokemonSpeciesError>`.\n- The `OperationService<GetPokemonSpecies>` trait covers all `tower::Service`s with request `GetPokemonSpeciesInput`, response `GetPokemonSpeciesOutput` and error `GetPokemonSpeciesOutput`.\n\nThe `from_handler` constructor is used in the following way:\n\n```rust\n# extern crate pokemon_service_server_sdk;\n# extern crate aws_smithy_http_server;\nuse pokemon_service_server_sdk::{\n    input::GetPokemonSpeciesInput,\n    output::GetPokemonSpeciesOutput,\n    error::GetPokemonSpeciesError,\n    operation_shape::GetPokemonSpecies\n};\nuse aws_smithy_http_server::operation::OperationShapeExt;\n\nasync fn get_pokemon_service(input: GetPokemonSpeciesInput) -> Result<GetPokemonSpeciesOutput, GetPokemonSpeciesError> {\n    todo!()\n}\n\nlet operation = GetPokemonSpecies::from_handler(get_pokemon_service);\n```\n\nAlternatively, `from_service` constructor:\n\n```rust\n# extern crate pokemon_service_server_sdk;\n# extern crate aws_smithy_http_server;\n# extern crate tower;\nuse pokemon_service_server_sdk::{\n    input::GetPokemonSpeciesInput,\n    output::GetPokemonSpeciesOutput,\n    error::GetPokemonSpeciesError,\n    operation_shape::GetPokemonSpecies\n};\nuse aws_smithy_http_server::operation::OperationShapeExt;\nuse std::task::{Context, Poll};\nuse tower::Service;\n\nstruct Svc {\n    /* ... */\n}\n\nimpl Service<GetPokemonSpeciesInput> for Svc {\n    type Response = GetPokemonSpeciesOutput;\n    type Error = GetPokemonSpeciesError;\n    type Future = /* Future<Output = Result<Self::Response, Self::Error>> */\n    # std::future::Ready<Result<Self::Response, Self::Error>>;\n\n    fn poll_ready(&mut self, ctx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {\n        todo!()\n    }\n\n    fn call(&mut self, input: GetPokemonSpeciesInput) -> Self::Future {\n        todo!()\n    }\n}\n\nlet svc: Svc = Svc { /* ... */ };\nlet operation = GetPokemonSpecies::from_service(svc);\n```\n\nTo summarize a _model service_ constructed can be constructed from a `Handler` or a `OperationService` subject to the constraints of an `OperationShape`. More detailed information on these conversions is provided in the [Handler and OperationService section](https://docs.rs/aws-smithy-http-server/latest/aws_smithy_http_server/operation/index.html) Rust docs.\n\n## Serialization and Deserialization\n\nA [Smithy protocol](https://awslabs.github.io/smithy/2.0/spec/protocol-traits.html#serialization-and-protocol-traits) specifies the serialization/deserialization scheme - how a HTTP request is transformed into a modelled input and a modelled output to a HTTP response. The is formalized using the [`FromRequest`](https://docs.rs/aws-smithy-http-server/latest/aws_smithy_http_server/request/trait.FromRequest.html) and [`IntoResponse`](https://github.com/smithy-lang/smithy-rs/blob/4c5cbc39384f0d949d7693eb87b5853fe72629cd/rust-runtime/aws-smithy-http-server/src/response.rs#L40-L44) traits:\n\n```rust\n# extern crate aws_smithy_http_server;\n# extern crate http;\n# use aws_smithy_http_server::body::BoxBody;\n# use std::future::Future;\n/// Provides a protocol aware extraction from a [`Request`]. This consumes the\n/// [`Request`], in contrast to [`FromParts`].\npub trait FromRequest<Protocol, B>: Sized {\n    type Rejection: IntoResponse<Protocol>;\n    type Future: Future<Output = Result<Self, Self::Rejection>>;\n\n    /// Extracts `self` from a [`Request`] asynchronously.\n    fn from_request(request: http::Request<B>) -> Self::Future;\n}\n\n/// A protocol aware function taking `self` to [`http::Response`].\npub trait IntoResponse<Protocol> {\n    /// Performs a conversion into a [`http::Response`].\n    fn into_response(self) -> http::Response<BoxBody>;\n}\n# use aws_smithy_http_server::request::FromRequest as FR;\n# impl<P, B, T: FR<P, B>> FromRequest<P, B> for T {\n#   type Rejection = <T as FR<P, B>>::Rejection;\n#   type Future = <T as FR<P, B>>::Future;\n#   fn from_request(request: http::Request<B>) -> Self::Future {\n#       <T as FR<P, B>>::from_request(request)\n#   }\n# }\n# use aws_smithy_http_server::response::IntoResponse as IR;\n# impl<P, T: IR<P>> IntoResponse<P> for T {\n#   fn into_response(self) -> http::Response<BoxBody> { <T as IR<P>>::into_response(self) }\n# }\n```\n\nNote that both traits are parameterized by `Protocol`. These [protocols](https://awslabs.github.io/smithy/2.0/aws/protocols/index.html) exist as ZST marker structs:\n\n```rust\n# extern crate aws_smithy_http_server;\n# use aws_smithy_http_server::protocol::{\n#   aws_json_10::AwsJson1_0 as _,\n#   aws_json_11::AwsJson1_1 as _,\n#   rest_json_1::RestJson1 as _,\n#   rest_xml::RestXml as _,\n# };\n/// [AWS REST JSON 1.0 Protocol](https://awslabs.github.io/smithy/2.0/aws/protocols/aws-restjson1-protocol.html).\npub struct RestJson1;\n\n/// [AWS REST XML Protocol](https://awslabs.github.io/smithy/2.0/aws/protocols/aws-restxml-protocol.html).\npub struct RestXml;\n\n/// [AWS JSON 1.0 Protocol](https://awslabs.github.io/smithy/2.0/aws/protocols/aws-json-1_0-protocol.html).\npub struct AwsJson1_0;\n\n/// [AWS JSON 1.1 Protocol](https://awslabs.github.io/smithy/2.0/aws/protocols/aws-json-1_1-protocol.html).\npub struct AwsJson1_1;\n```\n\n## Upgrading a Model Service\n\nWe can \"upgrade\" a model service to a HTTP service using `FromRequest` and `IntoResponse` described in the prior section:\n\n```mermaid\nstateDiagram-v2\n    direction LR\n    HttpService: HTTP Service\n    [*] --> from_request: HTTP Request\n    state HttpService {\n        direction LR\n        ModelService: Model Service\n        from_request --> ModelService: Model Input\n        ModelService --> into_response: Model Output\n    }\n    into_response --> [*]: HTTP Response\n```\n\nThis is formalized by the [`Upgrade<Protocol, Op, S>`](https://docs.rs/aws-smithy-http-server/latest/aws_smithy_http_server/operation/struct.Upgrade.html) HTTP service. The `tower::Service` implementation is approximately:\n\n```rust,ignore\nimpl<P, Op, S> Service<http::Request> for Upgrade<P, Op, S>\nwhere\n    Input: FromRequest<P, B>,\n    S: Service<Input>,\n    S::Response: IntoResponse<P>,\n    S::Error: IntoResponse<P>,\n{\n    async fn call(&mut self, request: http::Request) -> http::Response {\n        let model_request = match <Op::Input as OperationShape>::from_request(request).await {\n            Ok(ok) => ok,\n            Err(err) => return err.into_response()\n        };\n        let model_response = self.model_service.call(model_request).await;\n        model_response.into_response()\n    }\n}\n```\n\nWhen we `GetPokemonSpecies::from_handler` or `GetPokemonSpecies::from_service`, the model service produced, `S`, will meet the constraints above.\n\nThere is an associated `Plugin`, `UpgradePlugin` which constructs `Upgrade` from a service.\n\nThe upgrade procedure is finalized by the application of the `Layer` `L`, referenced in `Operation<S, L>`. In this way the entire upgrade procedure takes an `Operation<S, L>` and returns a HTTP service.\n\n```mermaid\nstateDiagram-v2\n    direction LR\n    [*] --> UpgradePlugin: HTTP Request\n    state HttpPlugin {\n        state UpgradePlugin {\n            direction LR\n            [*] --> S: Model Input\n            S --> [*] : Model Output\n            state ModelPlugin {\n                S\n            }\n        }\n    }\n    UpgradePlugin --> [*]: HTTP Response\n```\n\nNote that the `S` is specified by logic written, in Rust, by the customer, whereas `UpgradePlugin` is specified entirely by Smithy model via the protocol, [HTTP bindings](https://awslabs.github.io/smithy/2.0/spec/http-bindings.html), etc.\n\n## Routers\n\nDifferent protocols supported by Smithy enjoy different routing mechanisms, for example, [AWS JSON 1.0](https://awslabs.github.io/smithy/2.0/aws/protocols/aws-json-1_0-protocol.html#protocol-behaviors) uses the `X-Amz-Target` header to select an operation, whereas [AWS REST XML](https://awslabs.github.io/smithy/2.0/aws/protocols/aws-restxml-protocol.html) uses the [HTTP label trait](https://awslabs.github.io/smithy/2.0/spec/http-bindings.html#httplabel-trait).\n\nDespite their differences, all routing mechanisms satisfy a common interface. This is formalized using the [Router](https://docs.rs/aws-smithy-http-server/latest/aws_smithy_http_server/routing/trait.Router.html) trait:\n\n```rust\n# extern crate aws_smithy_http_server;\n# extern crate http;\n/// An interface for retrieving an inner [`Service`] given a [`http::Request`].\npub trait Router<B> {\n    type Service;\n    type Error;\n\n    /// Matches a [`http::Request`] to a target [`Service`].\n    fn match_route(&self, request: &http::Request<B>) -> Result<Self::Service, Self::Error>;\n}\n```\n\nwhich provides the ability to determine an inner HTTP service from a collection using a `&http::Request`.\n\nTypes which implement the `Router` trait are converted to a HTTP service via the `RoutingService` struct:\n\n```rust,ignore\n/// A [`Service`] using a [`Router`] `R` to redirect messages to specific routes.\n///\n/// The `Protocol` parameter is used to determine the serialization of errors.\npub struct RoutingService<R, Protocol> {\n    router: R,\n    _protocol: PhantomData<Protocol>,\n}\n\nimpl<R, P> Service<http::Request> for RoutingService<R, P>\nwhere\n    R: Router<B>,\n    R::Service: Service<http::Request, Response = http::Response>,\n    R::Error: IntoResponse<P> + Error,\n{\n    type Response = http::Response;\n    type Error = /* implementation detail */;\n\n    async fn call(&mut self, req: http::Request<B>) -> Result<Self::Response, Self::Error> {\n        match self.router.match_route(&req) {\n            // Successfully routed, use the routes `Service::call`.\n            Ok(ok) => ok.oneshot(req).await,\n            // Failed to route, use the `R::Error`s `IntoResponse<P>`.\n            Err(error) => {\n                debug!(%error, \"failed to route\");\n                Err(Box::new(error.into_response()))\n            }\n        }\n    }\n}\n```\n\nThe `RouterService` is the final piece necessary to form a functioning composition - it is used to aggregate together the HTTP services, created via the upgrade procedure, into a single HTTP service which can be presented to the customer.\n\n```mermaid\nstateDiagram\nstate in <<fork>>\n    direction LR\n    [*] --> in\n    state RouterService {\n        direction LR\n        in -->  ServiceA\n        in --> ServiceB\n        in --> ServiceC\n    }\n    ServiceA --> [*]\n    ServiceB --> [*]\n    ServiceC --> [*]\n```\n\n## Plugins\n<!-- TODO(missing_doc): Link to \"Write a Plugin\" documentation -->\n\nA [`Plugin`](https://docs.rs/aws-smithy-http-server/latest/aws_smithy_http_server/plugin/trait.Plugin.html) is a\n[`tower::Layer`] with two extra type parameters, `Service` and `Operation`, corresponding to [Smithy Service](https://awslabs.github.io/smithy/2.0/spec/service-types.html#service) and [Smithy Operation](https://awslabs.github.io/smithy/2.0/spec/service-types.html#operation). This allows the middleware to be\nparameterized them and change behavior depending on the context in which it's applied.\n\n```rust\n# extern crate aws_smithy_http_server;\npub trait Plugin<Service, Operation, T> {\n    type Output;\n\n    fn apply(&self, input: T) -> Self::Output;\n}\n# use aws_smithy_http_server::plugin::Plugin as Pl;\n# impl<Ser, Op, T, U: Pl<Ser, Op, T>> Plugin<Ser, Op, T> for U {\n#   type Output = <U as Pl<Ser, Op, T>>::Output;\n#   fn apply(&self, input: T) -> Self::Output { <U as Pl<Ser, Op, T>>::apply(self, input) }\n# }\n```\n\nAn example `Plugin` implementation can be found in [/examples/pokemon-service/src/plugin.rs](https://github.com/smithy-lang/smithy-rs/blob/main/examples/pokemon-service/src/plugin.rs).\n\nPlugins can be applied in two places:\n\n- HTTP plugins, which are applied pre-deserialization/post-serialization, acting on HTTP requests/responses.\n- Model plugins, which are applied post-deserialization/pre-serialization, acting on model inputs/outputs/errors.\n\n```mermaid\nstateDiagram-v2\n    direction LR\n    [*] --> S: HTTP Request\n    state HttpPlugin {\n        state UpgradePlugin {\n            state ModelPlugin {\n                S\n            }\n        }\n    }\n    S --> [*]: HTTP Response\n```\n\nThe service builder API requires plugins to be specified upfront - they must be\nregistered in the config object, which is passed as an argument to `builder`.\nPlugins cannot be modified afterwards.\n\nYou might find yourself wanting to apply _multiple_ plugins to your service.\nThis can be accommodated via [`HttpPlugins`] and [`ModelPlugins`].\n\n```rust\n# extern crate aws_smithy_http_server;\nuse aws_smithy_http_server::plugin::HttpPlugins;\n# use aws_smithy_http_server::plugin::IdentityPlugin as LoggingPlugin;\n# use aws_smithy_http_server::plugin::IdentityPlugin as MetricsPlugin;\n\nlet http_plugins = HttpPlugins::new().push(LoggingPlugin).push(MetricsPlugin);\n```\n\nThe plugins' runtime logic is executed in registration order.\nIn the example above, `LoggingPlugin` would run first, while `MetricsPlugin` is executed last.\n\nIf you are vending a plugin, you can leverage `HttpPlugins` or `ModelPlugins` as an extension point: you can add custom methods to it using an extension trait.\nFor example:\n\n```rust\n# extern crate aws_smithy_http_server;\nuse aws_smithy_http_server::plugin::{HttpPlugins, PluginStack};\n# use aws_smithy_http_server::plugin::IdentityPlugin as LoggingPlugin;\n# use aws_smithy_http_server::plugin::IdentityPlugin as AuthPlugin;\n\npub trait AuthPluginExt<CurrentPlugins> {\n    fn with_auth(self) -> HttpPlugins<PluginStack<AuthPlugin, CurrentPlugins>>;\n}\n\nimpl<CurrentPlugins> AuthPluginExt<CurrentPlugins> for HttpPlugins<CurrentPlugins> {\n    fn with_auth(self) -> HttpPlugins<PluginStack<AuthPlugin, CurrentPlugins>> {\n        self.push(AuthPlugin)\n    }\n}\n\nlet http_plugins = HttpPlugins::new()\n    .push(LoggingPlugin)\n    // Our custom method!\n    .with_auth();\n```\n\n## Builders\n\nThe service builder is the primary public API, generated for every [Smithy Service](https://awslabs.github.io/smithy/2.0/spec/service-types.html).\nAt a high-level, the service builder takes as input a function for each Smithy Operation and returns a single HTTP service. The signature of each function, also known as _handlers_, must match the constraints of the corresponding Smithy model.\n\nYou can create an instance of a service builder by calling `builder` on the corresponding service struct.\n\n```rust\n# extern crate aws_smithy_http_server;\n# use aws_smithy_http_server::routing::Route;\n/// The service builder for [`PokemonService`].\n///\n/// Constructed via [`PokemonService::builder`].\npub struct PokemonServiceBuilder<Body, HttpPl, ModelPl> {\n    capture_pokemon_operation: Option<Route<Body>>,\n    empty_operation: Option<Route<Body>>,\n    get_pokemon_species: Option<Route<Body>>,\n    get_server_statistics: Option<Route<Body>>,\n    get_storage: Option<Route<Body>>,\n    health_check_operation: Option<Route<Body>>,\n    http_plugin: HttpPl,\n    model_plugin: ModelPl,\n}\n```\n\nThe builder has two setter methods for each [Smithy Operation](https://awslabs.github.io/smithy/2.0/spec/service-types.html#operation) in the [Smithy Service](https://awslabs.github.io/smithy/2.0/spec/service-types.html#service):\n\n```rust,ignore\n    pub fn get_pokemon_species<HandlerType, HandlerExtractors, UpgradeExtractors>(self, handler: HandlerType) -> Self\n    where\n        HandlerType:Handler<GetPokemonSpecies, HandlerExtractors>,\n\n        ModelPl: Plugin<\n            PokemonService,\n            GetPokemonSpecies,\n            IntoService<GetPokemonSpecies, HandlerType>\n        >,\n        UpgradePlugin::<UpgradeExtractors>: Plugin<\n            PokemonService,\n            GetPokemonSpecies,\n            ModelPlugin::Output\n        >,\n        HttpPl: Plugin<\n            PokemonService,\n            GetPokemonSpecies,\n            UpgradePlugin::<UpgradeExtractors>::Output\n        >,\n    {\n        let svc = GetPokemonSpecies::from_handler(handler);\n        let svc = self.model_plugin.apply(svc);\n        let svc = UpgradePlugin::<UpgradeExtractors>::new()\n            .apply(svc);\n        let svc = self.http_plugin.apply(svc);\n        self.get_pokemon_species_custom(svc)\n    }\n\n    pub fn get_pokemon_species_service<S, ServiceExtractors, UpgradeExtractors>(self, service: S) -> Self\n    where\n        S: OperationService<GetPokemonSpecies, ServiceExtractors>,\n\n        ModelPl: Plugin<\n            PokemonService,\n            GetPokemonSpecies,\n            Normalize<GetPokemonSpecies, S>\n        >,\n        UpgradePlugin::<UpgradeExtractors>: Plugin<\n            PokemonService,\n            GetPokemonSpecies,\n            ModelPlugin::Output\n        >,\n        HttpPl: Plugin<\n            PokemonService,\n            GetPokemonSpecies,\n            UpgradePlugin::<UpgradeExtractors>::Output\n        >,\n    {\n        let svc = GetPokemonSpecies::from_service(service);\n        let svc = self.model_plugin.apply(svc);\n        let svc = UpgradePlugin::<UpgradeExtractors>::new().apply(svc);\n        let svc = self.http_plugin.apply(svc);\n        self.get_pokemon_species_custom(svc)\n    }\n\n    pub fn get_pokemon_species_custom<S>(mut self, svc: S) -> Self\n    where\n        S: Service<Request<Body>, Response = Response<BoxBody>, Error = Infallible>,\n    {\n        self.get_pokemon_species = Some(Route::new(svc));\n        self\n    }\n```\n\nHandlers and operations are upgraded to a [`Route`](https://github.com/smithy-lang/smithy-rs/blob/4c5cbc39384f0d949d7693eb87b5853fe72629cd/rust-runtime/aws-smithy-http-server/src/routing/route.rs#L49-L52) as soon as they are registered against the service builder. You can think of `Route` as a boxing layer in disguise.\n\nYou can transform a builder instance into a complete service (`PokemonService`) using one of the following methods:\n\n- `build`. The transformation fails if one or more operations do not have a registered handler;\n- `build_unchecked`. The transformation never fails, but we return `500`s for all operations that do not have a registered handler.\n\nBoth builder methods take care of:\n\n1. Pair each handler with the routing information for the corresponding operation;\n2. Collect all `(routing_info, handler)` pairs into a `Router`;\n3. Transform the `Router` implementation into a HTTP service via `RouterService`;\n4. Wrap the `RouterService` in a newtype given by the service name, `PokemonService`.\n\nThe final outcome, an instance of `PokemonService`, looks roughly like this:\n\n```rust\n# extern crate aws_smithy_http_server;\n# use aws_smithy_http_server::{routing::RoutingService, protocol::rest_json_1::{router::RestRouter, RestJson1}};\n/// The Pokémon Service allows you to retrieve information about Pokémon species.\n#[derive(Clone)]\npub struct PokemonService<S> {\n    router: RoutingService<RestRouter<S>, RestJson1>,\n}\n```\n\nThe following schematic summarizes the composition:\n\n```mermaid\nstateDiagram-v2\n    state in <<fork>>\n    state \"GetPokemonSpecies\" as C1\n    state \"GetStorage\" as C2\n    state \"DoNothing\" as C3\n    state \"...\" as C4\n    direction LR\n    [*] --> in : HTTP Request\n    UpgradePlugin --> [*]: HTTP Response\n    state PokemonService {\n        state RoutingService {\n            in --> UpgradePlugin: HTTP Request\n            in --> C2: HTTP Request\n            in --> C3: HTTP Request\n            in --> C4: HTTP Request\n            state C1 {\n                state HttpPlugin {\n                    state UpgradePlugin {\n                        direction LR\n                        [*] --> S: Model Input\n                        S --> [*] : Model Output\n                        state ModelPlugin {\n                            S\n                        }\n                    }\n                }\n            }\n            C2\n            C3\n            C4\n        }\n\n    }\n    C2 --> [*]: HTTP Response\n    C3 --> [*]: HTTP Response\n    C4 --> [*]: HTTP Response\n```\n\n## Accessing Unmodelled Data\n\nAn additional omitted detail is that we provide an \"escape hatch\" allowing `Handler`s and `OperationService`s to accept data that isn't modelled. In addition to accepting `Op::Input` they can accept additional arguments which implement the [`FromParts`](https://docs.rs/aws-smithy-http-server/latest/aws_smithy_http_server/request/trait.FromParts.html) trait:\n\n```rust\n# extern crate aws_smithy_http_server;\n# extern crate http;\n# use http::request::Parts;\n# use aws_smithy_http_server::response::IntoResponse;\n/// Provides a protocol aware extraction from a [`Request`]. This borrows the\n/// [`Parts`], in contrast to [`FromRequest`].\npub trait FromParts<Protocol>: Sized {\n    /// The type of the failures yielded extraction attempts.\n    type Rejection: IntoResponse<Protocol>;\n\n    /// Extracts `self` from a [`Parts`] synchronously.\n    fn from_parts(parts: &mut Parts) -> Result<Self, Self::Rejection>;\n}\n# use aws_smithy_http_server::request::FromParts as FP;\n# impl<P, T: FP<P>> FromParts<P> for T {\n#   type Rejection = <T as FP<P>>::Rejection;\n#   fn from_parts(parts: &mut Parts) -> Result<Self, Self::Rejection> { <T as FP<P>>::from_parts(parts) }\n# }\n```\n\nThis differs from `FromRequest` trait, introduced in [Serialization and Deserialization](#serialization-and-deserialization), as it's synchronous and has non-consuming access to [`Parts`](https://docs.rs/http/latest/http/request/struct.Parts.html), rather than the entire [Request](https://docs.rs/http/latest/http/request/struct.Request.html).\n\n```rust,ignore\npub struct Parts {\n    pub method: Method,\n    pub uri: Uri,\n    pub version: Version,\n    pub headers: HeaderMap<HeaderValue>,\n    pub extensions: Extensions,\n    /* private fields */\n}\n```\n\nThis is commonly used to access types stored within [`Extensions`](https://docs.rs/http/0.2.8/http/struct.Extensions.html) which have been inserted by a middleware. An `Extension` struct implements `FromParts` to support this use case:\n\n```rust\n# extern crate aws_smithy_http_server;\n# extern crate http;\n# extern crate thiserror;\n# use aws_smithy_http_server::{body::BoxBody, request::FromParts, response::IntoResponse};\n# use http::status::StatusCode;\n# use thiserror::Error;\n# fn empty() -> BoxBody { todo!() }\n/// Generic extension type stored in and extracted from [request extensions].\n///\n/// This is commonly used to share state across handlers.\n///\n/// If the extension is missing it will reject the request with a `500 Internal\n/// Server Error` response.\n///\n/// [request extensions]: https://docs.rs/http/latest/http/struct.Extensions.html\n#[derive(Debug, Clone)]\npub struct Extension<T>(pub T);\n\nimpl<Protocol, T> FromParts<Protocol> for Extension<T>\nwhere\n    T: Clone + Send + Sync + 'static,\n{\n    type Rejection = MissingExtension;\n\n    fn from_parts(parts: &mut http::request::Parts) -> Result<Self, Self::Rejection> {\n        parts.extensions.remove::<T>().map(Extension).ok_or(MissingExtension)\n    }\n}\n\n/// The extension has not been added to the [`Request`](http::Request) or has been previously removed.\n#[derive(Debug, Error)]\n#[error(\"the `Extension` is not present in the `http::Request`\")]\npub struct MissingExtension;\n\nimpl<Protocol> IntoResponse<Protocol> for MissingExtension {\n    fn into_response(self) -> http::Response<BoxBody> {\n        let mut response = http::Response::new(empty());\n        *response.status_mut() = StatusCode::INTERNAL_SERVER_ERROR;\n        response\n    }\n}\n```\n"
  },
  {
    "path": "design/src/server/code_generation.md",
    "content": "# Generating Common Service Code\n\nThis document introduces the project and how code is being generated. It is written for developers who want to start contributing to `smithy-rs`.\n\n## Folder structure\n\nThe project is divided in:\n\n- `/codegen-core`: contains common code to be used for both client and server code generation\n- `/codegen-client`: client code generation. Depends on `codegen-core`\n- `/codegen-server`: server code generation. Depends on `codegen-core`\n- `/aws`: the AWS Rust SDK, it deals with AWS services specifically. The folder structure reflects the project's, with the `rust-runtime` and the `codegen`\n- `/rust-runtime`: the generated client and server crates may depend on crates in this folder. Crates here are not code generated. The only crate that is not published is `inlineable`,\nwhich contains common functions used by other crates, [copied into][1] the source crate\n\nCrates in `/rust-runtime` (informally referred to as \"runtime crates\") are added to a crate's dependency only when used.\nFor example, if a model uses event streams, the generated crates will depend on [`aws-smithy-eventstream`][2].\n\n## Generating code\n\n`smithy-rs`'s entry points are Smithy code-generation plugins, and is not a command. One entry point is in [RustCodegenPlugin::execute][3] and\ninherits from `SmithyBuildPlugin` in [smithy-build][4]. Code generation is in Kotlin and shared common, non-Rust specific code with the [`smithy` Java repository][5]. They plug into the [Smithy gradle][6] plugin, which is a gradle plugin.\n\nThe comment at the beginning of `execute` describes what a `Decorator` is and uses the following terms:\n\n- Context: contains the model being generated, projection and settings for the build\n- Decorator: (also referred to as customizations) customizes how code is being generated. AWS services are required to sign with the SigV4 protocol, and [a decorator][7] adds Rust code to sign requests and responses.\n  Decorators are applied in reverse order of being added and have a priority order.\n- Writer: creates files and adds content; it supports templating, using `#` for substitutions\n- Location: the file where a symbol will be written to\n\nThe only task of a `RustCodegenPlugin` is to construct a `CodegenVisitor` and call its [execute()][8] method.\n\n`CodegenVisitor::execute()` is given a `Context` and decorators, and calls a [CodegenVisitor][9].\n\nCodegenVisitor, RustCodegenPlugin, and wherever there are different implementations between client and server, such as in generating error types,\nhave corresponding server versions.\n\nObjects used throughout code generation are:\n\n- Symbol: a node in a graph, an abstraction that represents the qualified name of a type; symbols reference and depend on other symbols, and have some common properties among languages (such as a namespace or a definition file). For Rust, we add properties to include more metadata about a symbol, such as its [type][10]\n- [RustType][11]: `Option<T>`, `HashMap`, ... along with their namespaces of origin such as `std::collections`\n- [RuntimeType][12]: the information to locate a type, plus the crates it depends on\n- [ShapeId][13]: an immutable object that identifies a `Shape`\n\nUseful conversions are:\n\n```kotlin\nSymbolProvider.toSymbol(shape)\n```\n\nwhere `SymbolProvider` constructs symbols for shapes. Some symbols require to create other symbols and types;\n[event streams][14] and [other streaming shapes][15] are an example.\nSymbol providers are all [applied][16] in order; if a shape uses a reserved keyword in Rust, its name is converted to a new name by a [symbol provider][17],\nand all other providers will work with this [new][18] symbol.\n\n```kotlin\nModel.expectShape(shapeId)\n```\n\nEach model has a `shapeId` to `shape` map; this method returns the shape associated with this shapeId.\n\nSome objects implement a `transform` [method][19] that only change the input model, so that code generation will work on that new model. This is used to, for example, add a trait to a shape.\n\n`CodegenVisitor` is a `ShapeVisitor`. For all services in the input model, shapes are [converted into Rust][20];\n[here][21] is how a service is constructed,\n[here][22] a structure and so on.\n\nCode generation flows from writer to files and entities are (mostly) generated only on a [need-by-need basis][23].\nThe complete result is a [Rust crate][24],\nin which all dependencies are written into their modules and `lib.rs` is generated ([here][25]).\n`execute()` ends by running [cargo fmt][26],\nto avoid having to format correctly Rust in `Writer`s and to be sure the generated code follows the styling rules.\n\n[1]: https://github.com/smithy-lang/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/rustlang/CargoDependency.kt#L95-L95\n[2]: https://docs.rs/aws-smithy-eventstream\n[3]: https://github.com/smithy-lang/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/RustCodegenPlugin.kt#L34\n[4]: https://github.com/awslabs/smithy/tree/main/smithy-build\n[5]: https://github.com/awslabs/smithy\n[6]: https://awslabs.github.io/smithy/1.0/guides/building-models/gradle-plugin.html\n[7]: https://github.com/smithy-lang/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/aws/sdk-codegen/src/main/kotlin/software/amazon/smithy/rustsdk/SigV4SigningDecorator.kt#L45\n[8]: https://github.com/smithy-lang/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/CodegenVisitor.kt#L115-L115\n[9]: https://github.com/smithy-lang/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/CodegenVisitor.kt#L44\n[10]: https://github.com/smithy-lang/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/SymbolVisitor.kt#L363-L363\n[11]: https://github.com/smithy-lang/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/rustlang/RustTypes.kt#L25-L25\n[12]: https://github.com/smithy-lang/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/RuntimeTypes.kt#L113-L113\n[13]: https://awslabs.github.io/smithy/1.0/spec/core/model.html#shape-id\n[14]: https://github.com/smithy-lang/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/EventStreamSymbolProvider.kt#L65-L65\n[15]: https://github.com/smithy-lang/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/StreamingTraitSymbolProvider.kt#L26-L26\n[16]: https://github.com/smithy-lang/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/RustCodegenPlugin.kt#L62-L62\n[17]: https://github.com/smithy-lang/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/rustlang/RustReservedWords.kt#L26-L26\n[18]: https://github.com/smithy-lang/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/EventStreamSymbolProvider.kt#L38-L38\n[19]: https://github.com/smithy-lang/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/transformers/OperationNormalizer.kt#L52-L52\n[20]: https://github.com/smithy-lang/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/CodegenVisitor.kt#L119-L119\n[21]: https://github.com/smithy-lang/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/CodegenVisitor.kt#L150-L150\n[22]: https://github.com/smithy-lang/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/CodegenVisitor.kt#L172-L172\n[23]: https://github.com/smithy-lang/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/CodegenDelegator.kt#L119-L126\n[24]: https://github.com/smithy-lang/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/CodegenDelegator.kt#L42-L42\n[25]: https://github.com/smithy-lang/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/CodegenDelegator.kt#L96-L107\n[26]: https://github.com/smithy-lang/smithy-rs/blob/db48039065bec890ef387385773b37154b555b14/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/CodegenVisitor.kt#L133-L133\n"
  },
  {
    "path": "design/src/server/from_parts.md",
    "content": "# Accessing Un-modelled Data\n\nFor every [Smithy Operation](https://awslabs.github.io/smithy/2.0/spec/service-types.html#operation) an input, output, and optional error are specified. This in turn constrains the function signature of the handler provided to the service builder - the input to the handler must be the input specified by the operation etc.\n\nBut what if we, the customer, want to access data in the handler which is _not_ modelled by our Smithy model? Smithy Rust provides an escape hatch in the form of the `FromParts` trait. In [`axum`](https://docs.rs/axum/latest/axum/index.html) these are referred to as [\"extractors\"](https://docs.rs/axum/latest/axum/extract/index.html).\n\n<!-- TODO(IntoParts): Dually, what if we want to return data from the handler which is _not_ modelled by our Smithy model? -->\n\n```rust,ignore\n/// Provides a protocol aware extraction from a [`Request`]. This borrows the\n/// [`Parts`], in contrast to [`FromRequest`].\npub trait FromParts<Protocol>: Sized {\n    /// The type of the failures yielded extraction attempts.\n    type Rejection: IntoResponse<Protocol>;\n\n    /// Extracts `self` from a [`Parts`] synchronously.\n    fn from_parts(parts: &mut Parts) -> Result<Self, Self::Rejection>;\n}\n```\n\nHere [`Parts`](https://docs.rs/http/latest/http/request/struct.Parts.html) is the struct containing all items in a [`http::Request`](https://docs.rs/http/latest/http/request/struct.Request.html) except for the HTTP body.\n\nA prolific example of a `FromParts` implementation is `Extension<T>`:\n\n```rust,ignore\n/// Generic extension type stored in and extracted from [request extensions].\n///\n/// This is commonly used to share state across handlers.\n///\n/// If the extension is missing it will reject the request with a `500 Internal\n/// Server Error` response.\n///\n/// [request extensions]: https://docs.rs/http/latest/http/struct.Extensions.html\n#[derive(Debug, Clone)]\npub struct Extension<T>(pub T);\n\n/// The extension has not been added to the [`Request`](http::Request) or has been previously removed.\n#[derive(Debug, Error)]\n#[error(\"the `Extension` is not present in the `http::Request`\")]\npub struct MissingExtension;\n\nimpl<Protocol> IntoResponse<Protocol> for MissingExtension {\n    fn into_response(self) -> http::Response<BoxBody> {\n        let mut response = http::Response::new(empty());\n        *response.status_mut() = StatusCode::INTERNAL_SERVER_ERROR;\n        response\n    }\n}\n\nimpl<Protocol, T> FromParts<Protocol> for Extension<T>\nwhere\n    T: Send + Sync + 'static,\n{\n    type Rejection = MissingExtension;\n\n    fn from_parts(parts: &mut http::request::Parts) -> Result<Self, Self::Rejection> {\n        parts.extensions.remove::<T>().map(Extension).ok_or(MissingExtension)\n    }\n}\n```\n\nThis allows the service builder to accept the following handler\n\n```rust,ignore\nasync fn handler(input: ModelInput, extension: Extension<SomeStruct>) -> ModelOutput {\n    /* ... */\n}\n```\n\nwhere `ModelInput` and `ModelOutput` are specified by the Smithy Operation and `SomeStruct` is a struct which has been inserted, by middleware, into the [`http::Request::extensions`](https://docs.rs/http/latest/http/request/struct.Request.html#method.extensions).\n\nUp to 32 structures implementing `FromParts` can be provided to the handler with the constraint that they _must_ be provided _after_ the `ModelInput`:\n\n```rust,ignore\nasync fn handler(input: ModelInput, ext1: Extension<SomeStruct1>, ext2: Extension<SomeStruct2>, other: Other /* : FromParts */, /* ... */) -> ModelOutput {\n    /* ... */\n}\n```\n\nNote that the `parts.extensions.remove::<T>()` in `Extensions::from_parts` will cause multiple `Extension<SomeStruct>` arguments in the handler to fail. The first extraction failure to occur is serialized via the `IntoResponse` trait (notice `type Error: IntoResponse<Protocol>`) and returned.\n\nThe `FromParts` trait is public so customers have the ability specify their own implementations:\n\n```rust,ignore\nstruct CustomerDefined {\n    /* ... */\n}\n\nimpl<P> FromParts<P> for CustomerDefined {\n    type Error = /* ... */;\n\n    fn from_parts(parts: &mut Parts) -> Result<Self, Self::Error> {\n        // Construct `CustomerDefined` using the request headers.\n        let header_value = parts.headers.get(\"header-name\").ok_or(/* ... */)?;\n        Ok(CustomerDefined { /* ... */ })\n    }\n}\n\nasync fn handler(input: ModelInput, arg: CustomerDefined) -> ModelOutput {\n    /* ... */\n}\n```\n"
  },
  {
    "path": "design/src/server/instrumentation.md",
    "content": "# Instrumentation\n\nA Smithy Rust server uses the [`tracing`](https://github.com/tokio-rs/tracing) crate to provide instrumentation. The customer is responsible for setting up a [`Subscriber`](https://docs.rs/tracing/latest/tracing/subscriber/trait.Subscriber.html) in order to ingest and process [events](https://docs.rs/tracing/latest/tracing/struct.Event.html) - Smithy Rust makes no prescription on the choice of `Subscriber`. Common choices might include:\n\n- [`tracing_subscriber::fmt`](https://docs.rs/tracing-subscriber/latest/tracing_subscriber/fmt/index.html) for printing to `stdout`.\n- [`tracing-log`](https://crates.io/crates/tracing-log) to providing compatibility with the [`log`](https://crates.io/crates/log).\n\nEvents are emitted and [spans](https://docs.rs/tracing/latest/tracing/struct.Span.html) are opened by the `aws-smithy-http-server`, `aws-smithy-http-server-python`, and generated crate. The [default](https://docs.rs/tracing/latest/tracing/struct.Metadata.html) [target](https://docs.rs/tracing/latest/tracing/struct.Metadata.html#method.target) is always used\n\n> The tracing macros default to using the module path where the span or event originated as the target, but it may be overridden.\n\nand therefore spans and events be filtered using the [`EnvFilter`](https://docs.rs/tracing-subscriber/latest/tracing_subscriber/filter/struct.EnvFilter.html) and/or [`Targets`](https://docs.rs/tracing-subscriber/latest/tracing_subscriber/filter/targets/struct.Targets.html) filters with crate and module paths.\n\nFor example,\n\n```bash\nRUST_LOG=aws_smithy_http_server=warn,aws_smithy_http_server_python=error\n```\n\nand\n\n```rust,ignore\n# extern crate tracing_subscriber;\n# extern crate tracing;\n# use tracing_subscriber::filter;\n# use tracing::Level;\nlet filter = filter::Targets::new().with_target(\"aws_smithy_http_server\", Level::DEBUG);\n```\n\nIn general, Smithy Rust is conservative when using high-priority log levels:\n\n- ERROR\n  - Fatal errors, resulting in the termination of the service.\n  - Requires immediate remediation.\n- WARN\n  - Non-fatal errors, resulting in incomplete operation.\n  - Indicates service misconfiguration, transient errors, or future changes in behavior.\n  - Requires inspection and remediation.\n- INFO\n  - Informative events, which occur inside normal operating limits.\n  - Used for large state transitions, e.g. startup/shutdown.\n- DEBUG\n  - Informative and sparse events, which occur inside normal operating limits.\n  - Used to debug coarse-grained progress of service.\n- TRACE\n  - Informative and frequent events, which occur inside normal operating limits.\n  - Used to debug fine-grained progress of service.\n\n## Spans over the Request/Response lifecycle\n\nSmithy Rust is built on top of [`tower`](https://github.com/tower-rs/tower), which means that middleware can be used to encompass different periods of the lifecycle of the request and response and identify them with a span.\n\nAn open-source example of such a middleware is [`TraceLayer`](https://docs.rs/tower-http/latest/tower_http/trace/struct.TraceLayer.html) provided by the [`tower-http`](https://docs.rs/tower-http/latest/tower_http/) crate.\n\nSmithy provides an out-the-box middleware which:\n\n- Opens a DEBUG level span, prior to request handling, including the operation name and request URI and headers.\n- Emits a DEBUG level event, after to request handling, including the response headers and status code.\n\nThis is enabled via the `instrument` method provided by the `aws_smithy_http_server::instrumentation::InstrumentExt` trait.\n\n```rust,no_run\n# extern crate aws_smithy_http_server;\n# extern crate pokemon_service_server_sdk;\n# use pokemon_service_server_sdk::{operation_shape::GetPokemonSpecies, input::*, output::*, error::*};\n# let handler = |req: GetPokemonSpeciesInput| async { Result::<GetPokemonSpeciesOutput, GetPokemonSpeciesError>::Ok(todo!()) };\nuse aws_smithy_http_server::{\n  instrumentation::InstrumentExt,\n  plugin::{IdentityPlugin, HttpPlugins}\n};\n# use aws_smithy_http_server::protocol::rest_json_1::{RestJson1, router::RestRouter};\n# use aws_smithy_http_server::routing::{Route, RoutingService};\nuse pokemon_service_server_sdk::{PokemonServiceConfig, PokemonService};\n\nlet http_plugins = HttpPlugins::new().instrument();\nlet config = PokemonServiceConfig::builder().http_plugin(http_plugins).build();\nlet app = PokemonService::builder(config)\n  .get_pokemon_species(handler)\n  /* ... */\n  .build()\n  .unwrap();\n# let app: PokemonService<RoutingService<RestRouter<Route>, RestJson1>>  = app;\n```\n\n<!-- TODO: Link to it when the logging module is no longer `#[doc(hidden)]` -->\n\n### Example\n\nThe Pokémon service example, located at `/examples/pokemon-service`, sets up a `tracing` `Subscriber` as follows:\n\n```rust,ignore\n# extern crate tracing_subscriber;\nuse tracing_subscriber::{prelude::*, EnvFilter};\n\n/// Setup `tracing::subscriber` to read the log level from RUST_LOG environment variable.\npub fn setup_tracing() {\n    let format = tracing_subscriber::fmt::layer().pretty();\n    let filter = EnvFilter::try_from_default_env()\n        .or_else(|_| EnvFilter::try_new(\"info\"))\n        .unwrap();\n    tracing_subscriber::registry().with(format).with(filter).init();\n}\n```\n\nRunning the Pokémon service example using\n\n```bash\nRUST_LOG=aws_smithy_http_server=debug,pokemon_service=debug cargo r\n```\n\nand then using `cargo t` to run integration tests against the server, yields the following logs:\n\n```text\n  2022-09-27T09:13:35.372517Z DEBUG aws_smithy_http_server::instrumentation::service: response, headers: {\"content-type\": \"application/json\", \"content-length\": \"17\"}, status_code: 200 OK\n    at /smithy-rs/rust-runtime/aws-smithy-http-server/src/logging/service.rs:47\n    in aws_smithy_http_server::instrumentation::service::request with operation: get_server_statistics, method: GET, uri: /stats, headers: {\"host\": \"localhost:13734\"}\n\n  2022-09-27T09:13:35.374104Z DEBUG pokemon_service: attempting to authenticate storage user\n    at pokemon-service/src/lib.rs:184\n    in aws_smithy_http_server::instrumentation::service::request with operation: get_storage, method: GET, uri: /pokedex/{redacted}, headers: {\"passcode\": \"{redacted}\", \"host\": \"localhost:13734\"}\n\n  2022-09-27T09:13:35.374152Z DEBUG pokemon_service: authentication failed\n    at pokemon-service/src/lib.rs:188\n    in aws_smithy_http_server::instrumentation::service::request with operation: get_storage, method: GET, uri: /pokedex/{redacted}, headers: {\"passcode\": \"{redacted}\", \"host\": \"localhost:13734\"}\n\n  2022-09-27T09:13:35.374230Z DEBUG aws_smithy_http_server::instrumentation::service: response, headers: {\"content-type\": \"application/json\", \"x-amzn-errortype\": \"NotAuthorized\", \"content-length\": \"2\"}, status_code: 401 Unauthorized\n    at /smithy-rs/rust-runtime/aws-smithy-http-server/src/logging/service.rs:47\n    in aws_smithy_http_server::instrumentation::service::request with operation: get_storage, method: GET, uri: /pokedex/{redacted}, headers: {\"passcode\": \"{redacted}\", \"host\": \"localhost:13734\"}\n```\n\n## Interactions with Sensitivity\n\nInstrumentation interacts with Smithy's [sensitive trait](https://awslabs.github.io/smithy/2.0/spec/documentation-traits.html#sensitive-trait).\n\n> Sensitive data MUST NOT be exposed in things like exception messages or log output. Application of this trait SHOULD NOT affect wire logging (i.e., logging of all data transmitted to and from servers or clients).\n\nFor this reason, Smithy runtime will never use `tracing` to emit events or open spans that include any sensitive data. This means that the customer can ingest all logs from `aws-smithy-http-server` and `aws-smithy-http-server-*` without fear of violating the sensitive trait.\n\nThe Smithy runtime will not, and cannot, prevent the customer violating the sensitive trait within the operation handlers and custom middleware. It is the responsibility of the customer to not violate the sensitive contract of their own model, care must be taken.\n\nSmithy shapes can be sensitive while being coupled to the HTTP request/responses via the [HTTP binding traits](https://awslabs.github.io/smithy/2.0/spec/http-bindings.html). This poses a risk when ingesting events which naively capture request/response information. The instrumentation middleware provided by Smithy Rust respects the sensitive trait and will replace sensitive data in its span and event with `{redacted}`. This feature can be seen in the [Example](#example) above. For debugging purposes these redactions can be prevented using the `aws-smithy-http-server` feature flag, `unredacted-logging`.\n\nSome examples of inadvertently leaking sensitive information:\n\n- Ingesting tracing events and spans from third-party crates which do not respect sensitivity.\n  - An concrete example of this would be enabling events from `hyper` or `tokio`.\n- Applying middleware which ingests events including HTTP payloads or any other part of the HTTP request/response which can be bound.\n"
  },
  {
    "path": "design/src/server/middleware.md",
    "content": "# Middleware\n\nThe following document provides a brief survey of the various positions middleware can be inserted in Smithy Rust.\n\nWe use the [Pokémon service](https://github.com/smithy-lang/smithy-rs/blob/main/codegen-core/common-test-models/pokemon.smithy) as a reference model throughout.\n\n```smithy\n/// A Pokémon species forms the basis for at least one Pokémon.\n@title(\"Pokémon Species\")\nresource PokemonSpecies {\n    identifiers: {\n        name: String\n    },\n    read: GetPokemonSpecies,\n}\n\n/// A users current Pokémon storage.\nresource Storage {\n    identifiers: {\n        user: String\n    },\n    read: GetStorage,\n}\n\n/// The Pokémon Service allows you to retrieve information about Pokémon species.\n@title(\"Pokémon Service\")\n@restJson1\nservice PokemonService {\n    version: \"2021-12-01\",\n    resources: [PokemonSpecies, Storage],\n    operations: [\n        GetServerStatistics,\n        DoNothing,\n        CapturePokemon,\n        CheckHealth\n    ],\n}\n```\n\n## Introduction to Tower\n\nSmithy Rust is built on top of [`tower`](https://github.com/tower-rs/tower).\n\n> Tower is a library of modular and reusable components for building robust networking clients and servers.\n\nThe `tower` library is centered around two main interfaces, the [`Service`](https://docs.rs/tower/latest/tower/trait.Service.html) trait and the [`Layer`](https://docs.rs/tower/latest/tower/trait.Layer.html) trait.\n\nThe `Service` trait can be thought of as an asynchronous function from a request to a response, `async fn(Request) -> Result<Response, Error>`, coupled with a mechanism to [handle back pressure](https://docs.rs/tower/latest/tower/trait.Service.html#backpressure), while the `Layer` trait can be thought of as a way of decorating a `Service`, transforming either the request or response.\n\nMiddleware in `tower` typically conforms to the following pattern, a `Service` implementation of the form\n\n```rust\npub struct NewService<S> {\n    inner: S,\n    /* auxillary data */\n}\n```\n\nand a complementary\n\n```rust,ignore\n# extern crate tower;\n# pub struct NewService<S> { inner: S }\nuse tower::{Layer, Service};\n\npub struct NewLayer {\n    /* auxiliary data */\n}\n\nimpl<S> Layer<S> for NewLayer {\n    type Service = NewService<S>;\n\n    fn layer(&self, inner: S) -> Self::Service {\n        NewService {\n            inner,\n            /* auxiliary fields */\n        }\n    }\n}\n```\n\nThe `NewService` modifies the behavior of the inner `Service` `S` while the `NewLayer` takes auxiliary data and constructs `NewService<S>` from `S`.\n\nCustomers are then able to stack middleware by composing `Layer`s using combinators such as [`ServiceBuilder::layer`](https://docs.rs/tower/latest/tower/struct.ServiceBuilder.html#method.layer) and [`Stack`](https://docs.rs/tower/latest/tower/layer/util/struct.Stack.html).\n\n<!-- TODO(Update documentation): There's a `Layer` implementation on tuples about to be merged, give it as an example here. -->\n\n## Applying Middleware\n\nOne of the primary goals is to provide configurability and extensibility through the application of middleware. The customer is able to apply `Layer`s in a variety of key places during the request/response lifecycle. The following schematic labels each configurable middleware position from A to D:\n\n```mermaid\nstateDiagram-v2\n    state in <<fork>>\n    state \"GetPokemonSpecies\" as C1\n    state \"GetStorage\" as C2\n    state \"DoNothing\" as C3\n    state \"...\" as C4\n    direction LR\n    [*] --> in : HTTP Request\n    UpgradeLayer --> [*]: HTTP Response\n    state A {\n        state PokemonService {\n            state RoutingService {\n                in --> UpgradeLayer: HTTP Request\n                in --> C2: HTTP Request\n                in --> C3: HTTP Request\n                in --> C4: HTTP Request\n                state B {\n                    state C1 {\n                        state C {\n                            state UpgradeLayer {\n                                direction LR\n                                [*] --> Handler: Model Input\n                                Handler --> [*] : Model Output\n                                state D {\n                                    Handler\n                                }\n                            }\n                        }\n                    }\n                    C2\n                    C3\n                    C4\n                }\n            }\n        }\n    }\n    C2 --> [*]: HTTP Response\n    C3 --> [*]: HTTP Response\n    C4 --> [*]: HTTP Response\n```\n\nwhere `UpgradeLayer` is the `Layer` converting Smithy model structures to HTTP structures and the `RoutingService` is responsible for routing requests to the appropriate operation.\n\n### A. Outer Middleware\n\nThe output of the Smithy service builder provides the user with a `Service<http::Request, Response = http::Response>` implementation. A `Layer` can be applied around the entire `Service`.\n\n```rust,ignore\n# extern crate aws_smithy_http_server;\n# extern crate pokemon_service_server_sdk;\n# extern crate tower;\n# use std::time::Duration;\n# struct TimeoutLayer;\n# impl TimeoutLayer { fn new(t: Duration) -> Self { Self }}\n# impl<S> Layer<S> for TimeoutLayer { type Service = S; fn layer(&self, svc: S) -> Self::Service { svc } }\n# use pokemon_service_server_sdk::{input::*, output::*, error::*};\n# let handler = |req: GetPokemonSpeciesInput| async { Result::<GetPokemonSpeciesOutput, GetPokemonSpeciesError>::Ok(todo!()) };\n# use aws_smithy_http_server::protocol::rest_json_1::{RestJson1, router::RestRouter};\n# use aws_smithy_http_server::routing::{Route, RoutingService};\nuse pokemon_service_server_sdk::{PokemonServiceConfig, PokemonService};\nuse tower::Layer;\n\nlet config = PokemonServiceConfig::builder().build();\n\n// This is a HTTP `Service`.\nlet app = PokemonService::builder(config)\n    .get_pokemon_species(handler)\n    /* ... */\n    .build()\n    .unwrap();\n# let app: PokemonService<RoutingService<RestRouter<Route>, RestJson1>>  = app;\n\n// Construct `TimeoutLayer`.\nlet timeout_layer = TimeoutLayer::new(Duration::from_secs(3));\n\n// Apply a 3 second timeout to all responses.\nlet app = timeout_layer.layer(app);\n```\n\n### B. Route Middleware\n\nA _single_ layer can be applied to _all_ routes inside the `Router`. This\nexists as a method on the `PokemonServiceConfig` builder object, which is passed into the\nservice builder.\n\n```rust,ignore\n# extern crate tower;\n# extern crate pokemon_service_server_sdk;\n# extern crate aws_smithy_http_server;\n# use tower::{util::service_fn, Layer};\n# use std::time::Duration;\n# use aws_smithy_http_server::protocol::rest_json_1::{RestJson1, router::RestRouter};\n# use aws_smithy_http_server::routing::{Route, RoutingService};\n# use pokemon_service_server_sdk::{input::*, output::*, error::*};\n# let handler = |req: GetPokemonSpeciesInput| async { Result::<GetPokemonSpeciesOutput, GetPokemonSpeciesError>::Ok(todo!()) };\n# struct MetricsLayer;\n# impl MetricsLayer { pub fn new() -> Self { Self } }\n# impl<S> Layer<S> for MetricsLayer { type Service = S; fn layer(&self, svc: S) -> Self::Service { svc } }\nuse pokemon_service_server_sdk::{PokemonService, PokemonServiceConfig};\n\n// Construct `MetricsLayer`.\nlet metrics_layer = MetricsLayer::new();\n\nlet config = PokemonServiceConfig::builder().layer(metrics_layer).build();\n\nlet app = PokemonService::builder(config)\n    .get_pokemon_species(handler)\n    /* ... */\n    .build()\n    .unwrap();\n# let app: PokemonService<RoutingService<RestRouter<Route>, RestJson1>>  = app;\n```\n\nNote that requests pass through this middleware immediately _after_ routing succeeds and therefore will _not_ be encountered if routing fails. This means that the [TraceLayer](https://docs.rs/tower-http/latest/tower_http/trace/struct.TraceLayer.html) in the example above does _not_ provide logs unless routing has completed. This contrasts to [middleware A](#a-outer-middleware), which _all_ requests/responses pass through when entering/leaving the service.\n\n### C. Operation Specific HTTP Middleware\n\nA \"HTTP layer\" can be applied to specific operations.\n\n```rust,ignore\n# extern crate tower;\n# extern crate pokemon_service_server_sdk;\n# extern crate aws_smithy_http_server;\n# use tower::{util::service_fn, Layer};\n# use std::time::Duration;\n# use pokemon_service_server_sdk::{operation_shape::GetPokemonSpecies, input::*, output::*, error::*};\n# use aws_smithy_http_server::protocol::rest_json_1::{RestJson1, router::RestRouter};\n# use aws_smithy_http_server::routing::{Route, RoutingService};\n# use aws_smithy_http_server::{operation::OperationShapeExt, plugin::*, operation::*};\n# let handler = |req: GetPokemonSpeciesInput| async { Result::<GetPokemonSpeciesOutput, GetPokemonSpeciesError>::Ok(todo!()) };\n# struct LoggingLayer;\n# impl LoggingLayer { pub fn new() -> Self { Self } }\n# impl<S> Layer<S> for LoggingLayer { type Service = S; fn layer(&self, svc: S) -> Self::Service { svc } }\nuse pokemon_service_server_sdk::{PokemonService, PokemonServiceConfig, scope};\n\nscope! {\n    /// Only log on `GetPokemonSpecies` and `GetStorage`\n    struct LoggingScope {\n        includes: [GetPokemonSpecies, GetStorage]\n    }\n}\n\n// Construct `LoggingLayer`.\nlet logging_plugin = LayerPlugin(LoggingLayer::new());\nlet logging_plugin = Scoped::new::<LoggingScope>(logging_plugin);\nlet http_plugins = HttpPlugins::new().push(logging_plugin);\n\nlet config = PokemonServiceConfig::builder().http_plugin(http_plugins).build();\n\nlet app = PokemonService::builder(config)\n    .get_pokemon_species(handler)\n    /* ... */\n    .build()\n    .unwrap();\n# let app: PokemonService<RoutingService<RestRouter<Route>, RestJson1>>  = app;\n```\n\nThis middleware transforms the operations HTTP requests and responses.\n\n### D. Operation Specific Model Middleware\n\nA \"model layer\" can be applied to specific operations.\n\n```rust,ignore\n# extern crate tower;\n# extern crate pokemon_service_server_sdk;\n# extern crate aws_smithy_http_server;\n# use tower::{util::service_fn, Layer};\n# use pokemon_service_server_sdk::{operation_shape::GetPokemonSpecies, input::*, output::*, error::*};\n# let handler = |req: GetPokemonSpeciesInput| async { Result::<GetPokemonSpeciesOutput, GetPokemonSpeciesError>::Ok(todo!()) };\n# use aws_smithy_http_server::{operation::*, plugin::*};\n# use aws_smithy_http_server::protocol::rest_json_1::{RestJson1, router::RestRouter};\n# use aws_smithy_http_server::routing::{Route, RoutingService};\n# struct BufferLayer;\n# impl BufferLayer { pub fn new(size: usize) -> Self { Self } }\n# impl<S> Layer<S> for BufferLayer { type Service = S; fn layer(&self, svc: S) -> Self::Service { svc } }\nuse pokemon_service_server_sdk::{PokemonService, PokemonServiceConfig, scope};\n\nscope! {\n    /// Only buffer on `GetPokemonSpecies` and `GetStorage`\n    struct BufferScope {\n        includes: [GetPokemonSpecies, GetStorage]\n    }\n}\n\n// Construct `BufferLayer`.\nlet buffer_plugin = LayerPlugin(BufferLayer::new(3));\nlet buffer_plugin = Scoped::new::<BufferScope>(buffer_plugin);\nlet config = PokemonServiceConfig::builder().model_plugin(buffer_plugin).build();\n\nlet app = PokemonService::builder(config)\n    .get_pokemon_species(handler)\n    /* ... */\n    .build()\n    .unwrap();\n# let app: PokemonService<RoutingService<RestRouter<Route>, RestJson1>>  = app;\n```\n\nIn contrast to [position C](#c-operation-specific-http-middleware), this middleware transforms the operations modelled inputs to modelled outputs.\n\n## Plugin System\n\nSuppose we want to apply a different `Layer` to every operation. In this case, position B (`PokemonService::layer`) will not suffice because it applies a single `Layer` to all routes and while position C (`Operation::layer`) would work, it'd require the customer constructs the `Layer` by hand for every operation.\n\nConsider the following middleware:\n\n```rust,ignore\n# extern crate aws_smithy_http_server;\n# extern crate tower;\nuse aws_smithy_http_server::shape_id::ShapeId;\nuse std::task::{Context, Poll};\nuse tower::Service;\n\n/// A [`Service`] that adds a print log.\npub struct PrintService<S> {\n    inner: S,\n    operation_id: ShapeId,\n    service_id: ShapeId\n}\n\nimpl<R, S> Service<R> for PrintService<S>\nwhere\n    S: Service<R>,\n{\n    type Response = S::Response;\n    type Error = S::Error;\n    type Future = S::Future;\n\n    fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {\n        self.inner.poll_ready(cx)\n    }\n\n    fn call(&mut self, req: R) -> Self::Future {\n        println!(\"Hi {} in {}\", self.operation_id.name(), self.service_id.name());\n        self.inner.call(req)\n    }\n}\n```\n\nThe plugin system provides a way to construct then apply `Layer`s in position [C](#c-operation-specific-http-middleware) and [D](#d-operation-specific-model-middleware), using the [protocol](https://awslabs.github.io/smithy/2.0/aws/protocols/index.html) and [operation shape](https://awslabs.github.io/smithy/2.0/spec/service-types.html#service-operations) as parameters.\n\nAn example of a `PrintPlugin` which prints the operation name:\n\n```rust,no_run\n# extern crate aws_smithy_http_server;\n# use aws_smithy_http_server::shape_id::ShapeId;\n# pub struct PrintService<S> { inner: S, operation_id: ShapeId, service_id: ShapeId }\nuse aws_smithy_http_server::{plugin::Plugin, operation::OperationShape, service::ServiceShape};\n\n/// A [`Plugin`] for a service builder to add a [`PrintService`] over operations.\n#[derive(Debug)]\npub struct PrintPlugin;\n\nimpl<Ser, Op, T> Plugin<Ser, Op, T> for PrintPlugin\nwhere\n    Ser: ServiceShape,\n    Op: OperationShape,\n{\n    type Output = PrintService<T>;\n\n    fn apply(&self, inner: T) -> Self::Output {\n        PrintService {\n            inner,\n            operation_id: Op::ID,\n            service_id: Ser::ID,\n        }\n    }\n}\n```\n\nYou can provide a custom method to add your plugin to a collection of  `HttpPlugins` or `ModelPlugins` via an extension trait. For example, for `HttpPlugins`:\n\n```rust,no_run\n# extern crate aws_smithy_http_server;\n# pub struct PrintPlugin;\n# impl aws_smithy_http_server::plugin::HttpMarker for PrintPlugin { }\nuse aws_smithy_http_server::plugin::{HttpPlugins, PluginStack};\n\n/// This provides a [`print`](PrintExt::print) method on [`HttpPlugins`].\npub trait PrintExt<ExistingPlugins> {\n    /// Causes all operations to print the operation name when called.\n    ///\n    /// This works by applying the [`PrintPlugin`].\n    fn print(self) -> HttpPlugins<PluginStack<PrintPlugin, ExistingPlugins>>;\n}\n\nimpl<ExistingPlugins> PrintExt<ExistingPlugins> for HttpPlugins<ExistingPlugins> {\n    fn print(self) -> HttpPlugins<PluginStack<PrintPlugin, ExistingPlugins>> {\n        self.push(PrintPlugin)\n    }\n}\n```\n\nThis allows for:\n\n```rust,no_run\n# extern crate pokemon_service_server_sdk;\n# extern crate aws_smithy_http_server;\n# use aws_smithy_http_server::plugin::{PluginStack, Plugin};\n# struct PrintPlugin;\n# impl<Ser, Op, T> Plugin<Ser, Op, T> for PrintPlugin { type Output = T; fn apply(&self, svc: T) -> Self::Output { svc }}\n# impl aws_smithy_http_server::plugin::HttpMarker for PrintPlugin { }\n# trait PrintExt<EP> { fn print(self) -> HttpPlugins<PluginStack<PrintPlugin, EP>>; }\n# impl<EP> PrintExt<EP> for HttpPlugins<EP> { fn print(self) -> HttpPlugins<PluginStack<PrintPlugin, EP>> { self.push(PrintPlugin) }}\n# use pokemon_service_server_sdk::{operation_shape::GetPokemonSpecies, input::*, output::*, error::*};\n# let handler = |req: GetPokemonSpeciesInput| async { Result::<GetPokemonSpeciesOutput, GetPokemonSpeciesError>::Ok(todo!()) };\n# use aws_smithy_http_server::protocol::rest_json_1::{RestJson1, router::RestRouter};\n# use aws_smithy_http_server::routing::{Route, RoutingService};\nuse aws_smithy_http_server::plugin::{IdentityPlugin, HttpPlugins};\nuse pokemon_service_server_sdk::{PokemonService, PokemonServiceConfig};\n\nlet http_plugins = HttpPlugins::new()\n    // [..other plugins..]\n    // The custom method!\n    .print();\nlet config = PokemonServiceConfig::builder().http_plugin(http_plugins).build();\nlet app /* : PokemonService<Route<B>> */ = PokemonService::builder(config)\n    .get_pokemon_species(handler)\n    /* ... */\n    .build()\n    .unwrap();\n# let app: PokemonService<RoutingService<RestRouter<Route>, RestJson1>>  = app;\n```\n\nThe custom `print` method hides the details of the `Plugin` trait from the average consumer.\nThey interact with the utility methods on `HttpPlugins` and enjoy the self-contained documentation.\n"
  },
  {
    "path": "design/src/server/overview.md",
    "content": "# Smithy Server\n\nSmithy Rust provides the ability to generate a server whose operations are provided by the customer.\n\n- [Middleware](./middleware.md)\n- [Instrumentation](./instrumentation.md)\n- [Accessing Un-modelled Data](./from_parts.md)\n- [The Anatomy of a Service](./anatomy.md)\n- [Generating Common Service Code](./code_generation.md)\n- [Validation Exceptions](./validation_exceptions.md)\n"
  },
  {
    "path": "design/src/server/validation_exceptions.md",
    "content": "# Validation Exceptions\n\n## Terminology\n\n- **Constrained shape**: a shape that is either:\n  - a shape with a [constraint trait](https://smithy.io/2.0/spec/constraint-traits.html) attached\n  - a (member) shape with a [`required` trait](https://smithy.io/2.0/spec/type-refinement-traits.html#required-trait) attached\n  - an [`enum`](https://smithy.io/2.0/spec/simple-types.html#enum) shape\n  - an [`intEnum`](https://smithy.io/2.0/spec/simple-types.html#intenum) shape\n  - a [`structure shape`](https://smithy.io/2.0/spec/aggregate-types.html#structure) with at least one required member shape; or\n  - a shape whose closure includes any of the above.\n- **ValidationException**: A Smithy error shape that is serialized in the response when constraint validation fails during request processing.\n- **Shape closure**: the set of shapes a shape can \"reach\", including itself.\n- **Custom validation exception**: A user-defined error shape marked with validation-specific traits that replaces the standard smithy.framework#ValidationException.\n\nIf an operation takes an input that is constrained, it can fail with a validation exception.\nIn these cases, you must model this behavior in the operation shape in your model file.\n\nIn the example below, the `GetCity` operation takes a required `cityId`. This means it is a constrained shape, so the validation exception behavior must be modeled.\nAs such, attempting to build this model will result in a codegen exception explaining this because.\n\n```smithy\n$version: \"2\"\n\nnamespace example.citylocator\n\nuse aws.protocols#awsJson1_0\n\n@awsJson1_0\nservice CityLocator {\n  version: \"2006-03-01\"\n  resources: [\n    City\n  ]\n}\n\nresource City {\n  identifiers: {\n    cityId: CityId\n  }\n  properties: {\n    coordinates: CityCoordinates\n  }\n  read: GetCity\n}\n\n@pattern(\"^[A-Za-z0-9 ]+$\")\nstring CityId\n\nstructure CityCoordinates {\n  @required\n  latitude: Float\n\n  @required\n  longitude: Float\n}\n\n@readonly\noperation GetCity {\n  input := for City {\n    // \"cityId\" provides the identifier for the resource and\n    // has to be marked as required.\n    @required\n    $cityId\n  }\n\n  output := for City {\n    // \"required\" is used on output to indicate if the service\n    // will always provide a value for the member.\n    // \"notProperty\" indicates that top-level input member \"name\"\n    // is not bound to any resource property.\n    @required\n    @notProperty\n    name: String\n\n    @required\n    $coordinates\n  }\n\n  errors: [\n    NoSuchResource\n  ]\n}\n\n// \"error\" is a trait that is used to specialize\n// a structure as an error.\n@error(\"client\")\nstructure NoSuchResource {\n  @required\n  resourceType: String\n}\n```\n\n## Default validation exception\n\nThe typical way forward is to use Smithy's default validation exception.\n\nThis can go per operation error closure, or in the service's error closure to apply to all operations.\n\ne.g.\n\n```smithy\nuse smithy.framework#ValidationException\n\n...\noperation GetCity {\n  ...\n  errors: [\n    ...\n    ValidationException\n  ]\n}\n```\n\n## Custom validation exception\n\nIn certain cases, you may want to define a custom validation exception. Some reasons for this could be:\n\n- **Backward compatibility**: Migrating existing APIs to Smithy with a requirement of maintaining the existing validation exception format\n- **Published APIs**: Already published a Smithy model with validation exception schemas to external consumers and cannot change the response format without breaking clients\n- **Custom error handling**: General needs for additional fields or different field names for validation errors\n\nThe following five traits are provided for defining custom validation exceptions.\n\n- @validationException\n- @validationMessage\n- @validationFieldList\n- @validationFieldName\n- @validationFieldMessage\n\n### User guide\n\n#### Requirements\n\n**1. Define a custom validation exception shape**\n\nDefine a custom validation exception by applying the `@validationException` trait to any structure shape that is also marked with the `@error` trait.\n```smithy\n@validationException\n@error(\"client\")\nstructure CustomValidationException {\n    // Structure members defined below\n}\n```\n\n**2. Specify the message field (required)**\n\nThe custom validation exception **must** have **exactly one** String member marked with the `@validationMessage` trait to serve as the primary error message.\n```smithy\nuse smithy.framework.rust#validationException\n\n@validationException\n@error(\"client\")\nstructure CustomValidationException {\n  @validationMessage\n  @required\n  message: String\n\n  // <... other fields ...>\n}\n```\n\n**3. Default constructibility requirement**\nThe custom validation exception structure **must** be default constructible. This means the shape either:\n\n1. **Must not** contain any constrained shapes that the framework cannot construct; or\n1. Any constrained shapes **must** have default values specified\n\nFor example, if we have `errorKind` enum member, we must specify the default with `@default()`. Otherwise, the\nmodel will fail to build.\n```smithy\n@validationException\n@error(\"client\")\nstructure CustomValidationException {\n  @validationMessage\n  @required\n  message: String,\n\n  @default(\"errorInValidation\") <------- must be specified\n  errorKind: ErrorKind\n}\n\nenum ErrorKind {\n  ERROR_IN_VALIDATION = \"errorInValidation\",\n  SOME_OTHER_ERROR = \"someOtherError\",\n}\n```\n\n**4. Optional Field List Support**\n\nOptionally, the custom validation exception **may** include a field marked with `@validationFieldList` to provide detailed information about which fields failed validation.\nThis **must** be a list shape where the member is a structure shape with detailed field information:\n\n- **Must** have a String member marked with `@validationFieldName`\n- **May** have a String member marked with `@validationFieldMessage`\n- Regarding additional fields:\n  - The structure may have no additional fields beyond those specified above, or\n  - If additional fields are present, each must be default constructible\n\n```smithy\n@validationException\n@error(\"client\")\nstructure CustomValidationException {\n  @validationMessage\n  @required\n  message: String,\n\n  @validationFieldList\n  fieldErrors: ValidationFieldList\n}\n\nlist ValidationFieldList {\n  member: ValidationField\n}\n\nstructure ValidationField {\n  @validationFieldName\n  @required\n  fieldName: String,\n\n  @validationFieldMessage\n  @required\n  errorMessage: String\n}\n```\n\n**5. Using the custom validation exception in operations**\n\n```smithy\noperation GetCity {\n  ...\n  errors: [\n    ...\n    CustomValidationException\n  ]\n}\n```\n\n### Limitations\n\nIt is unsupported to do the following and will result in an error if modeled:\n\n- Defining multiple custom validation exceptions\n- Including the default Smithy validation exception in an error closure if a custom validation exception is defined\n"
  },
  {
    "path": "design/src/smithy/aggregate_shapes.md",
    "content": "# Aggregate Shapes\n\n| Smithy Type | Rust Type |\n| ----------- | ----------- |\n| [List](#list) | `Vec<Member>` |\n| [Set](#set) | `Vec<Member>` |\n| [Map](#map) | `HashMap<String, Value>` |\n| [Structure](#structure) | `struct` |\n| [Union](#union) | `enum` |\n\nMost generated types are controlled by [SymbolVisitor](https://github.com/smithy-lang/smithy-rs/blob/main/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/SymbolVisitor.kt).\n\n## List\nList objects in Smithy are transformed into vectors in Rust. Based on the output of the [NullableIndex](https://awslabs.github.io/smithy/javadoc/1.5.1/software/amazon/smithy/model/knowledge/NullableIndex.html), the generated list may be `Vec<T>` or `Vec<Option<T>>`.\n\n## Set\nBecause floats are not Hashable in Rust, for simplicity smithy-rs translates all sets to into `Vec<T>` instead of `HashSet<T>`. In the future, a breaking change may be made to introduce a library-provided wrapper type for Sets.\n\n## Map\nBecause `key` MUST be a string in Smithy maps, we avoid the hashibility issue encountered with `Set`. There are optimizations that could be considered (e.g. since these maps will probably never be modified), however, pending customer feedback, Smithy Maps become `HashMap<String, V>` in Rust.\n\n## Structure\n> See `StructureGenerator.kt` for more details\n\nSmithy `structure` becomes a `struct` in Rust. Backwards compatibility & usability concerns lead to a few design choices:\n\n  1. As specified by `NullableIndex`, fields are `Option<T>` when Smithy models them as nullable.\n  2. All structs are marked `#[non_exhaustive]`\n  3. All structs derive `Debug` & `PartialEq`. Structs **do not** derive `Eq` because a `float` member may be added in the future.\n  4. Struct fields are public. Public struct fields allow for [split borrows](https://doc.rust-lang.org/nomicon/borrow-splitting.html). When working with output objects this significantly improves ergonomics, especially with optional fields.\n      ```rust,ignore\n      let out = dynamo::ListTablesOutput::new();\n      out.some_field.unwrap(); // <- partial move, impossible with an accessor\n      ```\n  5. Builders are generated for structs that provide ergonomic and backwards compatible constructors. A builder for a struct is always available via the convenience method `SomeStruct::builder()`\n  6. Structures manually implement debug: In order to support the [sensitive trait](https://awslabs.github.io/smithy/1.0/spec/core/documentation-traits.html#sensitive-trait), a `Debug` implementation for structures is manually generated.\n\n### Example Structure Output\n**Smithy Input**:\n\n```java\n@documentation(\"<p>Contains I/O usage metrics...\")\nstructure IOUsage {\n    @documentation(\"... elided\")\n    ReadIOs: ReadIOs,\n    @documentation(\"... elided\")\n    WriteIOs: WriteIOs\n}\n\nlong ReadIOs\n\nlong WriteIOs\n```\n**Rust Output**:\n```rust,ignore\n/// <p>Contains I/O usage metrics for a command that was invoked.</p>\n#[non_exhaustive]\n#[derive(std::clone::Clone, std::cmp::PartialEq)]\npub struct IoUsage {\n    /// <p>The number of read I/O requests that the command made.</p>\n    pub read_i_os: i64,\n    /// <p>The number of write I/O requests that the command made.</p>\n    pub write_i_os: i64,\n}\nimpl std::fmt::Debug for IoUsage {\n    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n        let mut formatter = f.debug_struct(\"IoUsage\");\n        formatter.field(\"read_i_os\", &self.read_i_os);\n        formatter.field(\"write_i_os\", &self.write_i_os);\n        formatter.finish()\n    }\n}\n/// See [`IoUsage`](crate::model::IoUsage)\npub mod io_usage {\n    /// A builder for [`IoUsage`](crate::model::IoUsage)\n    #[non_exhaustive]\n    #[derive(Debug, Clone, Default)]\n    pub struct Builder {\n        read_i_os: std::option::Option<i64>,\n        write_i_os: std::option::Option<i64>,\n    }\n    impl Builder {\n        /// <p>The number of read I/O requests that the command made.</p>\n        pub fn read_i_os(mut self, inp: i64) -> Self {\n            self.read_i_os = Some(inp);\n            self\n        }\n         /// <p>The number of read I/O requests that the command made.</p>\n        pub fn set_read_i_os(mut self, inp: Option<i64>) -> Self {\n            self.read_i_os = inp;\n            self\n        }\n        /// <p>The number of write I/O requests that the command made.</p>\n        pub fn write_i_os(mut self, inp: i64) -> Self {\n            self.write_i_os = Some(inp);\n            self\n        }\n        /// <p>The number of write I/O requests that the command made.</p>\n        pub fn set_write_i_os(mut self, inp: Option<i64>) -> Self {\n            self.write_i_os = inp;\n            self\n        }\n        /// Consumes the builder and constructs a [`IoUsage`](crate::model::IoUsage)\n        pub fn build(self) -> crate::model::IoUsage {\n            crate::model::IoUsage {\n                read_i_os: self.read_i_os.unwrap_or_default(),\n                write_i_os: self.write_i_os.unwrap_or_default(),\n            }\n        }\n    }\n}\nimpl IoUsage {\n    /// Creates a new builder-style object to manufacture [`IoUsage`](crate::model::IoUsage)\n    pub fn builder() -> crate::model::io_usage::Builder {\n        crate::model::io_usage::Builder::default()\n    }\n}\n```\n\n## Union\nSmithy `Union` is modeled as `enum` in Rust.\n\n1. Generated `enum`s must be marked `#[non_exhaustive]`.\n2. Generated `enum`s must provide an `Unknown` variant. If parsing receives an unknown input that doesn't match any of the given union variants, `Unknown` should be constructed. [Tracking Issue](https://github.com/smithy-lang/smithy-rs/issues/185).\n3. Union members (enum variants) are **not** nullable, because Smithy union members cannot contain null values.\n4. When union members contain references to other shapes, we generate a wrapping variant (see below).\n5. Union members do not require `#[non_exhaustive]`, because changing the shape targeted by a union member is not backwards compatible.\n6. `is_variant` and `as_variant` helper functions are generated to improve ergonomics.\n\n### Generated Union Example\nThe union generated for a simplified `dynamodb::AttributeValue`\n**Smithy**:\n```java\nnamespace test\n\nunion AttributeValue {\n    @documentation(\"A string value\")\n    string: String,\n    bool: Boolean,\n    bools: BoolList,\n    map: ValueMap\n}\n\nmap ValueMap {\n    key: String,\n    value: AttributeValue\n}\n\nlist BoolList {\n    member: Boolean\n}\n```\n**Rust**:\n```rust,ignore\n#[non_exhaustive]\n#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]\npub enum AttributeValue {\n    /// a string value\n    String(std::string::String),\n    Bool(bool),\n    Bools(std::vec::Vec<bool>),\n    Map(std::collections::HashMap<std::string::String, crate::model::AttributeValue>),\n}\n\nimpl AttributeValue {\n    pub fn as_bool(&self) -> Result<&bool, &crate::model::AttributeValue> {\n        if let AttributeValue::Bool(val) = &self { Ok(&val) } else { Err(self) }\n    }\n    pub fn is_bool(&self) -> bool {\n        self.as_bool().is_some()\n    }\n    pub fn as_bools(&self) -> Result<&std::vec::Vec<bool>, &crate::model::AttributeValue> {\n        if let AttributeValue::Bools(val) = &self { Ok(&val) } else { Err(self) }\n    }\n    pub fn is_bools(&self) -> bool {\n        self.as_bools().is_some()\n    }\n    pub fn as_map(&self) -> Result<&std::collections::HashMap<std::string::String, crate::model::AttributeValue>, &crate::model::AttributeValue> {\n        if let AttributeValue::Map(val) = &self { Ok(&val) } else { Err(self) }\n    }\n    pub fn is_map(&self) -> bool {\n        self.as_map().is_some()\n    }\n    pub fn as_string(&self) -> Result<&std::string::String, &crate::model::AttributeValue> {\n        if let AttributeValue::String(val) = &self { Ok(&val) } else { Err(self) }\n    }\n    pub fn is_string(&self) -> bool {\n        self.as_string().is_some()\n    }\n}\n```\n"
  },
  {
    "path": "design/src/smithy/backwards-compat.md",
    "content": "# Backwards Compatibility\n\nAWS SDKs require that clients can evolve in a backwards compatible way as new fields and operations are added. The types\ngenerated by `smithy-rs` are specifically designed to meet these requirements. Specifically, the following\ntransformations must not break compilation when upgrading to a new version:\n\n- [New operation added](#new-operation-added)\n- [New member added to structure](#new-member-added-to-structure)\n- [New union variant added](#new-union-variant-added)\n- New error added (todo)\n- New enum variant added (todo)\n\nHowever, the following changes are _not_ backwards compatible:\n\n- Error **removed** from operation.\n\nIn general, the best tool in Rust to solve these issues in the `#[non_exhaustive]` attribute which will be explored in\ndetail below.\n\n## New Operation Added\n\n**Before**\n\n```smithy\n$version: \"1\"\nnamespace s3\n\nservice S3 {\n    operations: [GetObject]\n}\n```\n\n**After**\n\n```smithy\n$version: \"1\"\nnamespace s3\n\nservice S3 {\n    operations: [GetObject, PutObject]\n}\n```\n\nAdding support for a new operation is backwards compatible because SDKs to not expose any sort of \"service trait\" that\nprovides an interface over an entire service. This _prevents_ clients from inheriting or implementing an interface that\nwould be broken by the addition of a new operation.\n\n## New member added to structure\n\n### Summary\n\n- Structures are marked `#[non_exhaustive]`\n- Structures must be instantiated using builders\n- Structures must not derive `Default` in the event that required fields are added in the future.\n\nIn general, adding a new `public` member to a structure in Rust is not backwards compatible. However, by applying\nthe `#[non_exhaustive]` to the structures generated by the Rust SDK, the Rust compiler will prevent users from using our\nstructs in ways that prevent new fields from being added in the future. **Note**: in this context, the optionality of\nthe fields is irrelevant.\n\nSpecifically, [`#[non_exhaustive]`](https://doc.rust-lang.org/reference/attributes/type_system.html) prohibits the\nfollowing patterns:\n\n1. Direct structure instantiation:\n   ```rust,ignore\n   # fn foo() {\n   let ip_addr = IpAddress { addr: \"192.168.1.1\" };\n   # }\n   ```\n   If a new member `is_local: boolean` was added to the IpAddress structure, this code would not compile. To enable\n   users to still construct\n   our structures while maintaining backwards compatibility, all structures expose a builder, accessible\n   at `SomeStruct::Builder`:\n\n   ```rust,ignore\n   # fn foo() {\n   let ip_addr = IpAddress::builder().addr(\"192.168.1.1\").build();\n   # }\n   ```\n2. Structure destructuring:\n   ```rust,ignore\n   # fn foo() {\n   let IpAddress { addr } = some_ip_addr();\n   # }\n   ```\n   This will also fail to compile if a new member is added, however, by adding `#[non_exhaustive]`, the `..` multifield\n   wildcard MUST be added to support new fields being added in the future:\n   ```rust,ignore\n   # fn foo() {\n   let IpAddress { addr, .. } = some_ip_addr();\n   # }\n   ```\n\n### Validation & Required Members\n\n**Adding a required member to a structure is _not_ considered backwards compatible.** When a required member is added to\na structure:\n\n1. The builder will change to become fallible, meaning that instead of returning `T` it will\n   return `Result<T, BuildError>`.\n2. Previous builder invocations that did not set the new field will still stop compiling if this was the first required\n   field.\n3. Previous builder invocations will now return a `BuildError` because the required field is unset.\n\n## New union variant added\n\nSimilar to structures, `#[non_exhaustive]` also applies to unions. In order to allow new union variants to be added in\nthe future, all unions (`enum` in Rust) generated by the Rust SDK must be marked with `#[non_exhaustive]`. **Note**:\nbecause new fields cannot be added to union variants, the union variants themselves do **not** need\nto be `#[non_exhaustive]`. To support new variants from services, each union contains an `Unknown` variant. By\nmarking `Unknown` as non_exhaustive, we prevent customers from instantiating it directly.\n\n```rust,ignore\n#[non_exhaustive]\n#[derive(std::clone::Clone, std::cmp::PartialEq, std::fmt::Debug)]\npub enum AttributeValue {\n    B(aws_smithy_types::Blob),\n    Bool(bool),\n    Bs(std::vec::Vec<aws_smithy_types::Blob>),\n    L(std::vec::Vec<crate::model::AttributeValue>),\n    M(std::collections::HashMap<std::string::String, crate::model::AttributeValue>),\n    N(std::string::String),\n    Ns(std::vec::Vec<std::string::String>),\n    Null(bool),\n    S(std::string::String),\n    Ss(std::vec::Vec<std::string::String>),\n\n    // By marking `Unknown` as non_exhaustive, we prevent client code from instantiating it directly.\n    #[non_exhaustive]\n    Unknown,\n}\n```\n"
  },
  {
    "path": "design/src/smithy/event_streams.md",
    "content": "Event Streams\n=============\n\nEvent streams are described in [the smithy specification](https://awslabs.github.io/smithy/1.0/spec/core/stream-traits.html#event-streams).\n\nThis document describes:\n* What protocols are supported\n* How the `@streaming union`s are generated\n* How errors are implemented\n* How the output code looks like\n* How users will implement their business logic with the new types\n* How errors and data are sent between client and server\n\nThe user experience\n----------------------------------------------\n\nLet us take [the following model](https://github.com/smithy-lang/smithy-rs/pull/1479/files#diff-ae332acd4a848e840d018d3b8616e40031f9e8f96ed89777dea69eb1f51a89a4R25) as an example:\n```smithy\n@http(uri: \"/capture-pokemon-event/{region}\", method: \"POST\")\noperation CapturePokemonOperation {\n    input: CapturePokemonOperationEventsInput,\n    output: CapturePokemonOperationEventsOutput,\n    errors: [UnsupportedRegionError, ThrottlingError]\n}\n\n@input\nstructure CapturePokemonOperationEventsInput {\n    @httpPayload\n    events: AttemptCapturingPokemonEvent,\n\n    @httpLabel\n    @required\n    region: String,\n}\n\n@output\nstructure CapturePokemonOperationEventsOutput {\n    @httpPayload\n    events: CapturePokemonEvents,\n}\n\n@streaming\nunion AttemptCapturingPokemonEvent {\n    event: CapturingEvent,\n    masterball_unsuccessful: MasterBallUnsuccessful,\n}\n\nstructure CapturingEvent {\n    @eventPayload\n    payload: CapturingPayload,\n}\n\nstructure CapturingPayload {\n    name: String,\n    pokeball: String,\n}\n\n@streaming\nunion CapturePokemonEvents {\n    event: CaptureEvent,\n    invalid_pokeball: InvalidPokeballError,\n    throttlingError: ThrottlingError,\n}\n\nstructure CaptureEvent {\n    @eventHeader\n    name: String,\n    @eventHeader\n    captured: Boolean,\n    @eventHeader\n    shiny: Boolean,\n    @eventPayload\n    pokedex_update: Blob,\n}\n\n@error(\"server\")\nstructure UnsupportedRegionError {\n    @required\n    region: String,\n}\n@error(\"client\")\nstructure InvalidPokeballError {\n    @required\n    pokeball: String,\n}\n@error(\"server\")\nstructure MasterBallUnsuccessful {\n    @required\n    message: String,\n}\n@error(\"client\")\nstructure ThrottlingError {}\n```\n\nClients will write their business logic, for example, as:\n1. Create the stream and...\n```rust\nlet input_stream = stream! {\n```\n2. ...send some union variant\n```rust\nyield Ok(AttemptCapturingPokemonEvent::Event(\n    CapturingEvent::builder()\n    .payload(CapturingPayload::builder()\n        .name(\"Pikachu\")\n        .pokeball(\"Master Ball\")\n        .build())\n    .build()\n));\n```\n3. ...terminate the stream by exhausting the stream or by sending an error variant\n```rust\nyield Err(AttemptCapturingPokemonEventError::new(\n    AttemptCapturingPokemonEventErrorKind::MasterBallUnsuccessful(MasterBallUnsuccessful::builder().build()),\n    Default::default()\n));\n```\n4. Open the stream and start communicating with the server\n```rust\nlet mut output = client\n    .capture_pokemon_operation()\n    .region(\"Kanto\")\n    .events(input_stream.into())\n    .send()\n    .await\n    .unwrap();\nloop {\n    match output.events.recv().await {\n        Ok(Some(capture)) => {...}\n        Err(e) => {... break;} /* terminated with an error */\n        Ok(None) => break, /* terminated cleanly */\n    }\n}\n```\n\nSimilarly, on the server side, the business logic might look like:\n```rust\npub async fn capture_pokemon(\n    mut input: input::CapturePokemonOperationInput,\n) -> Result<output::CapturePokemonOperationOutput, error::CapturePokemonOperationError> {\n    if input.region != \"Kanto\" {\n        /* operation error */\n        return Err(error::CapturePokemonOperationError::UnsupportedRegionError(\n            error::UnsupportedRegionError::builder().build(),\n        ));\n    }\n    /* create the stream, but... */\n    let output_stream = stream! {\n        loop {\n            match input.events.recv().await {\n                Ok(maybe_event) => match maybe_event {\n                    Some(event) => {...} /* handle event */\n                    None => break, /* stream ended cleanly */\n                },\n                Err(e) => {...} /* stream ended by error */\n            }\n        }\n    };\n    /* ...return immediately, and communicate async over the stream, not the current connection */\n    Ok(output::CapturePokemonOperationOutput::builder()\n        .events(output_stream.into())\n        .build()\n        .unwrap())\n}\n```\n\nImplementation\n----------------------------------\n\nIn order to implement this feature for all customers, we need to:\n* Implement a way to transparently stream data, and handle signing and terminate the stream on errors or the termination condition\n* Implement custom marshalling and unmarshalling for errors and streaming union variants\n* Make it easy and obvious to customers to use the generated types, structures and functions\n\nThe Input and Output structures are generated as (lines irrelevant for the discussion are omitted, here and in other examples):\n\n```rust\n// on the client\npub struct CapturePokemonOperationInput {\n    #[allow(missing_docs)] // documentation missing in model\n    pub events: aws_smithy_http::event_stream::EventStreamSender<\n        crate::model::AttemptCapturingPokemonEvent,\n        crate::error::AttemptCapturingPokemonEventError,\n    >,\n    #[allow(missing_docs)] // documentation missing in model\n    pub region: std::option::Option<std::string::String>,\n}\n// on the server\npub struct CapturePokemonOperationInput {\n    #[allow(missing_docs)] // documentation missing in model\n    pub events: aws_smithy_http::event_stream::Receiver<\n        crate::model::AttemptCapturingPokemonEvent,\n        crate::error::AttemptCapturingPokemonEventError,\n    >,\n    #[allow(missing_docs)] // documentation missing in model\n    pub region: std::string::String,\n}\n```\nNote they are similar, but the client uses an `EventStreamSender` (this is an input structure) and the server a `Receiver` (the server receives the input).\nSender is [chosen according](https://github.com/smithy-lang/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/EventStreamSymbolProvider.kt#L58) to if the\ngeneration target is the client and the union is in an input structure; or if this is a server sending from an operation's output.\n\nThe error structs are generated as any operation error, where the union shape is treated as an operation:\n```rust\n// on the client\npub struct AttemptCapturingPokemonEventError {\n   pub kind: AttemptCapturingPokemonEventErrorKind,\n   pub(crate) meta: aws_smithy_types::Error,\n}\npub enum AttemptCapturingPokemonEventErrorKind {\n   MasterBallUnsuccessful(crate::error::MasterBallUnsuccessful),\n   Unhandled(Box<dyn std::error::Error + Send + Sync + 'static>),\n}\n// on the server\npub enum AttemptCapturingPokemonEventError {\n    MasterBallUnsuccessful(crate::error::MasterBallUnsuccessful),\n}\n```\nThe errors are similar to any operation error, but their [name](https://github.com/smithy-lang/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/generators/error/CombinedErrorGenerator.kt#L50) is `Error` prefixed by the name of the union.\nThe reason for splitting up errors and non-errors in the event stream union is to give a more Rust-like experience to customers,\nwhere they can `yield` and `match` on errors `Err(UnionError::Variant)` as a result of the event stream communication,\nrather than matching on the specific variant, `Ok(Union::Variant) => /* handle error */`.\n\nIf there are no modeled errors in the union, because the server does not always generate an error structure unlike the client (which at least has a `Unhandled` variant),\nthe server uses a generic `MessageStreamError` in place of the union error, to be signaled of any error while constructing the stream.\nIf the union were to be:\n```smithy\n@streaming\nunion AttemptCapturingPokemonEvent {\n    event: CapturingEvent,\n}\n```\nThe Receiver would be\n```rust\naws_smithy_http::event_stream::Receiver<\n  crate::model::AttemptCapturingPokemonEvent,\n  aws_smithy_http::event_stream::MessageStreamError>\n```\nand errors propagated as such to terminate the stream.\n\nAn [EventStreamSender](https://github.com/smithy-lang/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/rust-runtime/aws-smithy-http/src/event_stream/sender.rs#L18) wraps an input stream\ninto a [MessageStreamAdapter](https://github.com/smithy-lang/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/rust-runtime/aws-smithy-http/src/event_stream/sender.rs#L132), which implements\nthe [Stream](https://docs.rs/futures-core/0.3.21/futures_core/stream/trait.Stream.html) trait. At a high level, `poll_next` works by:\n1. Polling the customer stream\n2. If there is an event:\n   1. Signal the end of the stream, if the event is `None`\n   2. Marshall either the message or the error, depending on the data coming from the stream\n   3. Sign the marshalled data and return it\n3. Otherwise, signal to poll back later\n\nSimilarly, the [Receiver](https://github.com/smithy-lang/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/rust-runtime/aws-smithy-http/src/event_stream/receiver.rs#L125) handles the receiving side of the stream.\nThe `Receiver` has more logic to handle buffering data and possibly errors.\n\nServer and client serialize similarly. Serializing for `CapturePokemonOperation` on the server, with `serialize_capture_pokemon_operation_response`:\n1. Sets the `content-type` HTTP header to `application/vnd.amazon.eventstream`\n2. Converts the `EventStreamSender` in the event stream structure into a `MessageStreamAdapter` with a marshaller for the error and data types\n   1. [This](https://github.com/smithy-lang/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/protocols/ServerHttpBoundProtocolGenerator.kt#L511) is where it is generated\n3. Gives the body back to hyper\n```rust\nlet body =\n   aws_smithy_http_server::body::boxed(aws_smithy_http_server::body::Body::wrap_stream({\n      let signer = aws_smithy_eventstream::frame::NoOpSigner {};\n      let error_marshaller =\n           crate::event_stream_serde::CapturePokemonOperationErrorMarshaller::new();\n       let marshaller = crate::event_stream_serde::CapturePokemonEventsMarshaller::new();\n       let adapter: aws_smithy_http::event_stream::MessageStreamAdapter<_, _> = output\n           .events\n           .into_body_stream(marshaller, error_marshaller, signer);\n       adapter\n   }));\n```\nThe signer signs the message to be sent. [NoOpSigner](https://github.com/smithy-lang/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/rust-runtime/aws-smithy-eventstream/src/frame.rs#L37) returns the message as is, `SigV4Signer` signs using the AWS SigV4 protocol. SigV4 requires an empty-payload signed message to be sent before effectively terminating the stream; to keep the same interface, `SignMessage::sign_empty` returns an `Option` to signal whether signing this last empty message is required.\n\nThe marshallers set header and payload in a [Message](https://github.com/smithy-lang/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/rust-runtime/aws-smithy-eventstream/src/frame.rs#L368) structure: `Message` is a structure with a vector, the headers; and bytes, the payload.\nThe headers are the values targeted by the `@eventHeader` trait and the payload by `@eventPayload`.\n\nAt the end of the marshalling and signing processes, `MessageStreamAdapter` takes the `Message` built by the marshaller and signer\nand [writes](https://github.com/smithy-lang/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/rust-runtime/aws-smithy-eventstream/src/frame.rs#L224) it as bytes into a `Vec<u8>`,\nin a format of a sequence of bytes: `<type, data>` where `type` indicates if the `data` is a bool, integer and so on for all types.\n\nHeaders that are sent are:\n* `:message-type` (`event` or `exception`) to signal the kind of message being sent\n* `:content-type`, set to `application/octet-stream` for blobs; the protocol-specific type otherwise\n* `:event-type` to communicate the non-error variant (if `:message-type` is `event`); or\n* `:exception-type` to communicate the error variant (if `:message-type` is `exception`)\n\nThe way errors are marshalled, unmarshalled and signed is the same as above.\n\n#### Generating errors\nEvent stream errors in unions are generated in the same way for operation errors:\nIn fact, the implementation uses the same [render](https://github.com/smithy-lang/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/codegen-server/src/main/kotlin/software/amazon/smithy/rust/codegen/server/smithy/generators/ServerCombinedErrorGenerator.kt#L47) functions;\nthe only difference between client and server is that the server does not generate anything unless the structure has errors,\nwhile the client always generates a structure for forward compatibility with at least a `Unhandled` error kind.\nThis is also the reason for the default [MessageStreamError](https://github.com/smithy-lang/smithy-rs/blob/8f7e03ff8a84236955a65dba3d21c4bdbf17a9f4/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/EventStreamSymbolProvider.kt#L52) for servers.\n\nThe main differences between the EventStreamErrorMarshallerGenerator and EventStreamMarshallerGenerator are that the former:\n* takes into account the differences between client and server in how error symbols are laid out (with a `kind` member or `Kind` suffix)\n* sets the `\":message-type\"` to be `exception` and sets `:exception-type` accordingly\n\nCurrently, the only supported protocols are:\n* RestXml\n* RestJSON\n"
  },
  {
    "path": "design/src/smithy/overview.md",
    "content": "# Smithy\nThe Rust SDK uses Smithy models and code generation tooling to generate an SDK. Smithy is an open source IDL (interface design language) developed by Amazon. Although the Rust SDK uses Smithy models for AWS services, smithy-rs and Smithy models in general are not AWS specific.\n\nDesign documentation here covers both our implementation of Smithy Primitives (e.g. simple shape) as well as more complex Smithy traits like `Endpoint`.\n\n## Internals\nSmithy introduces a few concepts that are defined here:\n\n1. Shape: The core Smithy primitive. A smithy model is composed of nested shapes defining an API.\n2. `Symbol`: A Representation of a type including namespaces and any dependencies required to use a type. A shape can be converted into a symbol by a `SymbolVisitor`. A `SymbolVisitor` maps shapes to types in your programming language (e.g. Rust). In the Rust SDK, see [SymbolVisitor.kt](https://github.com/smithy-lang/smithy-rs/blob/c049a37f8cba5f9bec2e96c28db83e7efb2edc53/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/SymbolVisitor.kt). Symbol visitors are composable—many specific behaviors are mixed in via small & focused symbol providers, e.g. support for the streaming trait is mixed in separately.\n3. `Writer`: Writers are code generation primitives that collect code prior to being written to a file. Writers enable language specific helpers to be added to simplify codegen for a given language. For example, `smithy-rs` adds `rustBlock` to [`RustWriter`](https://github.com/smithy-lang/smithy-rs/blob/908dec558e26bbae6fe4b7d9d1c221dd81699b59/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/rustlang/RustWriter.kt) to create a \"Rust block\" of code.\n   ```kotlin\n   writer.rustBlock(\"struct Model\") {\n       model.fields.forEach {\n           write(\"${field.name}: #T\", field.symbol)\n       }\n   }\n   ```\n   This would produce something like:\n   ```rust\n   struct Model {\n      field1: u32,\n      field2: String\n   }\n   ```\n\n4. Generators: A Generator, e.g. `StructureGenerator`, `UnionGenerator` generates more complex Rust code from a Smithy model. Protocol generators pull these individual tools together to generate code for an entire service / protocol.\n\nA developer's view of code generation can be found in [this document](../server/code_generation.md).\n"
  },
  {
    "path": "design/src/smithy/recursive_shapes.md",
    "content": "# Recursive Shapes\n> Note: Throughout this document, the word \"box\" always refers to a Rust [`Box<T>`](https://doc.rust-lang.org/std/boxed/struct.Box.html), a heap allocated pointer to T, and not the Smithy concept of boxed vs. unboxed.\n\nRecursive shapes pose a problem for Rust, because the following Rust code will not compile:\n\n```rust,compile_fail\nstruct TopStructure {\n    intermediate: IntermediateStructure\n}\n\nstruct IntermediateStructure {\n    top: Option<TopStructure>\n}\n```\n\n```text\n  |\n3 | struct TopStructure {\n  | ^^^^^^^^^^^^^^^^^^^ recursive type has infinite size\n4 |     intermediate: IntermediateStructure\n  |     ----------------------------------- recursive without indirection\n  |\n  = help: insert indirection (e.g., a `Box`, `Rc`, or `&`) at some point to make `main::TopStructure` representable\n```\n\nThis occurs because Rust types must be a size known at compile time. The way around this, as the message suggests, is to Box the offending type. `smithy-rs` implements this design in [RecursiveShapeBoxer.kt](https://github.com/smithy-lang/smithy-rs/blob/main/codegen/src/main/kotlin/software/amazon/smithy/rust/codegen/smithy/transformers/RecursiveShapeBoxer.kt)\n\nTo support this, as the message suggests, we must \"`Box`\" the offending type. There is a touch of trickiness—only one element in the cycle needs to be boxed, but we need to select it deterministically such that we always pick the same element between multiple codegen runs. To do this the Rust SDK will:\n\n1. Topologically sort the graph of shapes.\n2. Identify cycles that do not pass through an existing Box<T>, List, Set, or Map\n3. For each cycle, select the earliest shape alphabetically & mark it as Box<T> in the Smithy model by attaching the custom `RustBoxTrait` to the member.\n4. Go back to step 1.\n\nThis would produce valid Rust:\n\n```rust\nstruct TopStructure {\n    intermediate: IntermediateStructure\n}\n\nstruct IntermediateStructure {\n    top: Box<Option<TopStructure>>\n}\n```\n\n**Backwards Compatibility Note!**\n\nBox<T> is not generally compatible with T in Rust. There are several unlikely but valid model changes that will cause the SDK to produce code that may break customers. If these are problematic, all are avoidable with customizations.\n\n1. A recursive link is added to an existing structure. This causes a member that was not boxed before to become Box<T>.\n\n    > **Workaround**: Mark the new member as Box<T> in a customization.\n\n1. A field is removed from a structure that removes the recursive dependency. The SDK would generate T instead of Box<T>.\n\n    > **Workaround**: Mark the member that used to be boxed as Box<T> in a customization. The Box will be unnecessary, but we will keep it for backwards compatibility.\n"
  },
  {
    "path": "design/src/smithy/simple_shapes.md",
    "content": "# Simple Shapes\n| Smithy Type (links to design discussions) | Rust Type (links to Rust documentation)   |\n| ----------- | ----------- |\n| blob | `Vec<u8>` |\n| boolean | [`bool`](https://doc.rust-lang.org/std/primitive.bool.html) |\n| [string](#strings)  | [`String`](https://doc.rust-lang.org/std/string/struct.String.html) |\n| byte   | `i8` |\n| short  | `i16` |\n| integer | `i32` |\n| long | `i64` |\n| float | `f32` |\n| double | `f64` |\n| [bigInteger](#big-numbers) | `BigInteger` (Not implemented yet) |\n| [bigDecimal](#big-numbers) | `BigDecimal` (Not implemented yet) |\n| [timestamp](#timestamps)  | [`DateTime`](https://github.com/smithy-lang/smithy-rs/blob/main/rust-runtime/aws-smithy-types/src/date_time/mod.rs) |\n| [document](#documents) | [`Document`](https://github.com/smithy-lang/smithy-rs/blob/v0.14/rust-runtime/aws-smithy-types/src/lib.rs#L38-L52) |\n\n### Big Numbers\nRust currently has no standard library or universally accepted large-number crate. Until one is stabilized, a string representation is a reasonable compromise:\n\n```rust\npub struct BigInteger(String);\npub struct BigDecimal(String);\n```\n\nThis will enable us to add helpers over time as requested. Users will also be able to define their own conversions into their preferred large-number libraries.\n\nAs of 5/23/2021 BigInteger / BigDecimal are not included in AWS models. Implementation is tracked [here](https://github.com/smithy-lang/smithy-rs/issues/312).\n### Timestamps\n[chrono](https://github.com/chronotope/chrono) is the current de facto library for datetime in Rust, but it is pre-1.0. DateTimes are represented by an SDK defined structure modeled on `std::time::Duration` from the Rust standard library.\n\n```rust\n{{#include ../../../rust-runtime/aws-smithy-types/src/date_time/mod.rs:date_time}}\n```\n\nFunctions in the `aws-smithy-types-convert` crate provide conversions to other crates, such as `time` or `chrono`.\n\n### Strings\nRust has two different String representations:\n* `String`, an owned, heap allocated string.\n* `&str`, a reference to a string, owned elsewhere.\n\nIn ideal world, input shapes, where there is no reason for the strings to be owned would use `&'a str`. Outputs would likely use `String`. However, Smithy does not provide a distinction between input and output shapes.\n\nA third compromise could be storing `Arc<String>`, an atomic reference counted pointer to a `String`. This may be ideal for certain advanced users, but is likely to confuse most users and produces worse ergonomics. _This is an open design area where we will seek user feedback._ Rusoto uses `String` and there has been [one feature request](https://github.com/rusoto/rusoto/issues/1806) to date to change that.\n\nCurrent models represent strings as `String`.\n\n### Document Types\n\nSmithy defines the concept of \"Document Types\":\n> [Documents represent] protocol-agnostic open content that is accessed like JSON data. Open content is useful for modeling unstructured data that has no schema, data that can't be modeled using rigid types, or data that has a schema that evolves outside of the purview of a model. The serialization format of a document is an implementation detail of a protocol and MUST NOT have any effect on the types exposed by tooling to represent a document value.\n\n```rust,ignore\n{{#include ../../../rust-runtime/aws-smithy-types/src/lib.rs:document}}\n```\n\nIndividual protocols define their own document serialization behavior, with some protocols such as AWS and EC2 Query not supporting document types.\n"
  },
  {
    "path": "design/src/tenets.md",
    "content": "# Rust SDK Design Tenets\n> Unless you know better ones! These are our tenets today, but we'd love your thoughts. Do you wish we had different priorities? Let us know by opening and issue or starting a discussion.\n1. [**Batteries included, but replaceable.**](#batteries-included-but-replaceable) The AWS SDK for Rust should provide a best-in-class experience for many use cases, **but**, customers will use the SDK in unique and unexpected ways. **Meet customers where they are;** strive to be compatible with their tools. Provide mechanisms to allow customers make different choices.\n2. [**Make common problems easy to solve.**](#make-common-problems-easy-to-solve) The AWS SDK for Rust should make common problems solvable. Guide customers to patterns that set them up for long-term success.\n3. [**Design for the Future.**](#design-for-the-future) The AWS SDK for Rust should evolve with AWS without breaking existing customers. APIs will evolve in unpredictable directions, new protocols will gain adoption, and new services will be created that we never could have imagined. Don’t simplify or unify code today that prevents evolution tomorrow.\n\n## Details, Justifications, and Ramifications\n\n### Batteries included, but replaceable.\n\nSome customers will use the Rust SDK as their first experience with async Rust, potentially **any** Rust. They may not be familiar with Tokio or the concept of an async executor. We are not afraid to have an opinion about the best solution for most customers.\n\nOther customers will come to the SDK with specific requirements. Perhaps they're integrating the SDK into a much larger project that uses `async_std`. Maybe they need to set custom headers, modify the user agent, or audit every request. They should be able to use the Rust SDK without forking it to meet their needs.\n\n### Make common problems easy to solve\n\nIf solving a common problem isn’t obvious from the API, it should be obvious from the documentation. The SDK should guide users towards the best solutions for common tasks, **first** with well named methods, **second** with documentation, and **third** with real -world usage examples. Provide misuse resistant APIs. Async Rust has the potential to introduce subtle bugs; the Rust SDK should help customers avoid them.\n\n### Design for the Future\n\nAPIs evolve in unpredictable ways, and it's crucial that the SDK can evolve without breaking existing customers. This means designing the SDK so that fundamental changes to the internals can be made without altering the external interface we surface to customers:\n\n* Keeping the shared core as small & opaque as possible.\n* Don’t leak our internal dependencies to customers\n* With every design choice, consider, \"Can I reverse this choice in the future?\"\n\nThis may not result in DRY code, and that’s OK! Code that is auto generated has different goals and tradeoffs than code that has been written by hand.\n"
  },
  {
    "path": "design/static/mermaid-init.js",
    "content": "mermaid.initialize({startOnLoad:true});\n"
  },
  {
    "path": "examples/.gitignore",
    "content": "pokemon-service-client/\npokemon-service-server-sdk/\nCargo.lock\n"
  },
  {
    "path": "examples/BENCHMARKS.md",
    "content": "# Smithy Rust Server SDK benchmarks\n\nThis Pokémon Service has been benchmarked on different type of EC2 instances\nusing [wrk](https://github.com/wg/wrk).\n\n<!-- vim-markdown-toc Marked -->\n\n- [Smithy Rust Server SDK benchmarks](#smithy-rust-server-sdk-benchmarks)\n  - [2022-03-04](#2022-03-04)\n    - [c6i.8xlarge](#c6i8xlarge)\n      - [Full result](#full-result)\n    - [c6g.8xlarge](#c6g8xlarge)\n      - [Full result](#full-result-1)\n\n<!-- vim-markdown-toc -->\n\n## [2022-03-04](https://github.com/smithy-lang/smithy-rs/commit/d823f61156577ab42590709627906d1dc35a5f49)\n\nThe benchmark runs against the `empty_operation()` operation, which is just\nreturning an empty output and can be used to stress test the framework overhead.\n\n### c6i.8xlarge\n\n- 32 cores Intel(R) Xeon(R) Platinum 8375C CPU @ 2.90GHz\n- 64 Gb memory\n- Benchmark:\n  - Duration: 10 minutes\n  - Connections: 1024\n  - Threads: 16\n- Result:\n  - Request/sec: 1_608_742\n  - RSS[^1] memory: 72200 bytes\n\n#### Full result\n\n```text\n❯❯❯ wrk -t16 -c1024 -d10m --latency http://localhost:13734/empty-operation\nRunning 10m test @ http://localhost:13734/empty-operation\n  16 threads and 1024 connections\n  Thread Stats   Avg      Stdev     Max   +/- Stdev\n    Latency     1.03ms    1.84ms 208.10ms   92.16%\n    Req/Sec   101.11k    17.59k  164.78k    70.99%\n  Latency Distribution\n     50%  475.00us\n     75%  784.00us\n     90%    2.12ms\n     99%    9.74ms\n  965396910 requests in 10.00m, 98.00GB read\n  Socket errors: connect 19, read 0, write 0, timeout 0\nRequests/sec: 1608742.65\nTransfer/sec:    167.23MB\n```\n\n### c6g.8xlarge\n\n- 32 cores Amazon Graviton 2 @ 2.50GHz\n- 64 Gb memory\n- Benchmark:\n  - Duration: 10 minutes\n  - Connections: 1024\n  - Threads: 16\n- Result:\n  - Request/sec: 1_379_942\n  - RSS[^1] memory: 70264 bytes\n\n\n#### Full result\n\n```text\n❯❯❯ wrk -t16 -c1024 -d10m --latency http://localhost:13734/empty-operation\nRunning 10m test @ http://localhost:13734/empty-operation\n  16 threads and 1024 connections\n  Thread Stats   Avg      Stdev     Max   +/- Stdev\n    Latency     1.26ms    2.22ms 210.68ms   91.99%\n    Req/Sec    86.76k    16.46k  141.30k    68.81%\n  Latency Distribution\n     50%  560.00us\n     75%    0.93ms\n     90%    2.53ms\n     99%   11.95ms\n  828097344 requests in 10.00m, 84.06GB read\n  Socket errors: connect 19, read 0, write 0, timeout 0\nRequests/sec: 1379942.45\nTransfer/sec:    143.45MB\n```\n\n[^1]: https://en.wikipedia.org/wiki/Resident_set_size\n"
  },
  {
    "path": "examples/Cargo.toml",
    "content": "# Without this configuration, the workspace will be read from `rust-runtime`, causing the build to fail.\n[workspace]\nresolver = \"2\"\nmembers = [\n    \"pokemon-service-common\",\n    \"pokemon-service\",\n    \"pokemon-service-tls\",\n    \"pokemon-service-lambda\",\n    \"pokemon-service-server-sdk\",\n    \"pokemon-service-client\",\n    \"pokemon-service-client-usage\",\n]\n\n[profile.release]\nlto = true\n"
  },
  {
    "path": "examples/Makefile",
    "content": "SRC_DIR := $(shell git rev-parse --show-toplevel)\nCUR_DIR := $(shell pwd)\nGRADLE := $(SRC_DIR)/gradlew\nSERVER_SDK_DST := $(CUR_DIR)/pokemon-service-server-sdk\nCLIENT_SDK_DST := $(CUR_DIR)/pokemon-service-client\nSERVER_SDK_SRC := $(SRC_DIR)/codegen-server-test/build/smithyprojections/codegen-server-test/pokemon-service-server-sdk/rust-server-codegen\nCLIENT_SDK_SRC := $(SRC_DIR)/codegen-client-test/build/smithyprojections/codegen-client-test/pokemon-service-client/rust-client-codegen\n\nall: codegen\n\ncodegen:\n\t$(GRADLE) --project-dir $(SRC_DIR) -P modules='pokemon-service-server-sdk,pokemon-service-client' :codegen-client-test:assemble :codegen-server-test:assemble\n\tmkdir -p $(SERVER_SDK_DST) $(CLIENT_SDK_DST)\n\tcp -av $(SERVER_SDK_SRC)/* $(SERVER_SDK_DST)/\n\tcp -av $(CLIENT_SDK_SRC)/* $(CLIENT_SDK_DST)/\n\nbuild: codegen\n\tcargo build\n\nrun: codegen\n\tcargo run\n\nclippy: codegen\n\tcargo clippy\n\ntest: codegen\n\tcargo test\n\ndoc-open: codegen\n\tcargo doc --no-deps --open\n\nclean:\n\tcargo clean || echo \"Unable to run cargo clean\"\n\nlambda_watch:\n\tcargo lambda watch\n\nlambda_invoke:\n\tcargo lambda invoke pokemon-service-lambda --data-file pokemon-service/tests/fixtures/example-apigw-request.json\n\ndistclean: clean\n\trm -rf $(SERVER_SDK_DST) $(CLIENT_SDK_DST) Cargo.lock\n\n.PHONY: all\n"
  },
  {
    "path": "examples/README.md",
    "content": "# Smithy Rust Server SDK examples\n\nThis folder contains:\n- example services showcasing Smithy Rust Server SDK, also known as the Rust service framework,\n- benchmarking tooling\n\nThree server implementations are available:\n\n- `/pokemon-service`, a HTTP server demonstrating [middleware] and [extractors].\n- `/pokemon-service-tls`, a HTTPS server. This server can do\n   its own TLS negotiation, rather than relying on a load balancer.\n- `/pokemon-service-lambda`, a server that can be deployed onto AWS Lambda.\n\nThese servers, and their clients, are generated using smithy-rs. You're invited\nto benchmark the performance of these servers to see whether smithy-rs might be\na suitable choice for implementing your web service.\n\n[middleware]: https://smithy-lang.github.io/smithy-rs/design/server/middleware.html\n[extractors]: https://smithy-lang.github.io/smithy-rs/design/server/from_parts.html\n\n\n## Pre-requisites\n\nYou will need install Java 17 to run the smithy-rs code generator and an\ninstallation of Rust, including `cargo`, to compile the generated code.\n\n(Optional) The [Cargo Lambda](https://cargo-lambda.info/) sub-command for\n`cargo` is required to support the AWS Lambda integration.\n\n\n## Building\n\nSince these examples require both the server and client SDK to be code-generated\nfrom their [model](/codegen-core/common-test-models/pokemon.smithy), a Makefile is\nprovided to build and run the service. Just run `make` to prepare the first\nbuild.\n\nOnce the example has been built successfully the first time, idiomatic `cargo`\ncan be used directly.\n\n### Make targets:\n\n- `codegen`: generates the Pokémon service crates (default)\n- `build`: compiles the generated client and server\n- `clean`: deletes build artifacts\n- `clippy`: lints the code\n- `distclean`: delete generated code and build artifacts\n- `doc-open`: builds and opens the rustdoc documentation\n- `lambda_invoke`: invokes a running server\n- `lambda_watch`: runs the service on an emulated AWS Lambda environment\n- `run`: runs the Pokémon service\n- `test`: runs integration and unit tests\n\n\n## Running services\n\nTo run one of the three server implementations locally, provide the appropriate\nservice name to the `--bin` flag:\n\n```bash\ncargo run --bin pokemon-service[(-lambda|-tls)]\n```\n\nCLI arguments can be passed to the server binaries by adding them after `--`.\nFor example, to see a service's help information, use the following:\n\n```bash\ncargo run --bin <service> -- --help\n```\n\n## Testing\n\nThe `/pokemon-test*/tests` folders provide integration tests involving the\ngenerated clients.\n\nThey can be invoked with `cargo test`. This will spawn each service in turn\nand run some integration tests against it. Use `-p <package>` to filter by\npackage.\n\nMore info can be found in the `tests` folder of each package.\n\n\n## Benchmarking\n\nServers running locally (see \"Running services\") can be benchmarked with any\nload testing tool, such as Artillery or `wrk`.\n\nPlease see [BENCHMARKS.md](/examples/BENCHMARKS.md) for benchmarking results\nproduced by the smithy-rs team.\n"
  },
  {
    "path": "examples/legacy/.gitignore",
    "content": "pokemon-service-client/\npokemon-service-server-sdk-http0x/\nCargo.lock\n"
  },
  {
    "path": "examples/legacy/Cargo.toml",
    "content": "# Without this configuration, the workspace will be read from `rust-runtime`, causing the build to fail.\n[workspace]\nresolver = \"2\"\nmembers = [\n    \"pokemon-service-common\",\n    \"pokemon-service\",\n    \"pokemon-service-tls\",\n    \"pokemon-service-lambda\",\n    \"pokemon-service-server-sdk-http0x\",\n    \"pokemon-service-client\",\n    \"pokemon-service-client-usage\",\n]\n\n[profile.release]\nlto = true\n"
  },
  {
    "path": "examples/legacy/Makefile",
    "content": "SRC_DIR := $(shell git rev-parse --show-toplevel)\nCUR_DIR := $(shell pwd)\nGRADLE := $(SRC_DIR)/gradlew\nSERVER_SDK_DST := $(CUR_DIR)/pokemon-service-server-sdk-http0x\nCLIENT_SDK_DST := $(CUR_DIR)/pokemon-service-client\nSERVER_SDK_SRC := $(SRC_DIR)/codegen-server-test/build/smithyprojections/codegen-server-test/pokemon-service-server-sdk-http0x/rust-server-codegen\nCLIENT_SDK_SRC := $(SRC_DIR)/codegen-client-test/build/smithyprojections/codegen-client-test/pokemon-service-client/rust-client-codegen\n\nall: codegen\n\ncodegen:\n\t$(GRADLE) --project-dir $(SRC_DIR) -P modules='pokemon-service-server-sdk,pokemon-service-client' :codegen-client-test:assemble :codegen-server-test:assemble\n\tmkdir -p $(SERVER_SDK_DST) $(CLIENT_SDK_DST)\n\tcp -av $(SERVER_SDK_SRC)/* $(SERVER_SDK_DST)/\n\tcp -av $(CLIENT_SDK_SRC)/* $(CLIENT_SDK_DST)/\n\nbuild: codegen\n\tcargo build\n\nrun: codegen\n\tcargo run\n\nclippy: codegen\n\tcargo clippy\n\ntest: codegen\n\tcargo test\n\ndoc-open: codegen\n\tcargo doc --no-deps --open\n\nclean:\n\tcargo clean || echo \"Unable to run cargo clean\"\n\nlambda_watch:\n\tcargo lambda watch\n\nlambda_invoke:\n\tcargo lambda invoke pokemon-service-lambda --data-file pokemon-service/tests/fixtures/example-apigw-request.json\n\ndistclean: clean\n\trm -rf $(SERVER_SDK_DST) $(CLIENT_SDK_DST) Cargo.lock\n\n.PHONY: all\n"
  },
  {
    "path": "examples/legacy/README.md",
    "content": "# Legacy HTTP 0.x Examples\n\nThis directory contains examples for Smithy-rs using HTTP 0.x (hyper 0.14, http 0.2). These examples use the legacy HTTP stack with `aws-smithy-legacy-http` and `aws-smithy-legacy-http-server`.\n\nFor HTTP 1.x examples (hyper 1.x, http 1.x), see the parent [examples](../) directory.\n\n## Building\n\n### 1. Generate the SDKs\n\nFrom this directory, run:\n\n```bash\nmake codegen\n```\n\nThis will generate:\n- `pokemon-service-server-sdk-http0x` - Server SDK using HTTP 0.x\n- `pokemon-service-client` - Client SDK \n\nThe generated SDKs are copied to:\n- `pokemon-service-server-sdk/`\n- `pokemon-service-client/`\n\n### 2. Build all examples\n\n```bash\ncargo build\n```\n\nOr to check without building artifacts:\n\n```bash\ncargo check\n```\n\n## Running the Examples\n\n### Start the Pokemon Service\n\nIn one terminal, start the server:\n\n```bash\ncargo run --bin pokemon-service\n```\n\nThe server will start on `http://localhost:13734`\n\n### Run Client Examples\n\nIn another terminal, from the `pokemon-service-client-usage/` directory:\n\n```bash\ncd pokemon-service-client-usage\ncargo run --example simple-client\n```\n\n#### Available Client Examples\n\n| Example | Description |\n|---------|-------------|\n| `simple-client` | Basic client usage - creates a client and calls an operation |\n| `endpoint-resolver` | Custom endpoint resolver configuration |\n| `handling-errors` | Sending input parameters and handling errors |\n| `custom-header` | Adding custom headers to requests |\n| `custom-header-using-interceptor` | Accessing operation name in an interceptor |\n| `response-header-interceptor` | Getting operation name and accessing response before deserialization |\n| `use-config-bag` | Using the property bag to pass data across interceptors |\n| `retry-customize` | Customizing retry settings |\n| `timeout-config` | Configuring timeouts |\n| `mock-request` | Using custom HttpConnector for mock responses |\n| `trace-serialize` | Tracing request/response during serialization |\n| `client-connector` | Changing TLS configuration |\n\nTo list all available examples:\n\n```bash\ncd pokemon-service-client-usage\ncargo run --example\n```\n\n### Other Services\n\n#### Pokemon Service with TLS\n\n```bash\ncargo run --bin pokemon-service-tls\n```\n\n#### Pokemon Service on AWS Lambda\n\n```bash\ncargo run --bin pokemon-service-lambda\n```\n\n## Project Structure\n\n```\nlegacy/\n├── pokemon-service/              # Main HTTP service implementation\n├── pokemon-service-tls/          # TLS-enabled service\n├── pokemon-service-lambda/       # AWS Lambda service\n├── pokemon-service-common/       # Shared service logic\n├── pokemon-service-client-usage/ # Client usage examples\n├── pokemon-service-server-sdk/   # Generated server SDK (HTTP 0.x)\n└── pokemon-service-client/       # Generated client SDK (HTTP 0.x)\n```\n\n## Key Dependencies (HTTP 0.x)\n\n- `hyper = \"0.14\"`\n- `http = \"0.2\"`\n- `aws-smithy-legacy-http`\n- `aws-smithy-legacy-http-server`\n\n## Regenerating SDKs\n\nIf you need to regenerate the SDKs from scratch:\n\n```bash\nrm -rf pokemon-service-server-sdk pokemon-service-client\nmake codegen\n```\n\n## Testing\n\nRun all tests:\n\n```bash\ncargo test\n```\n\nRun tests for a specific package:\n\n```bash\ncargo test -p pokemon-service\n```\n\n## Troubleshooting\n\n### Port Already in Use\n\nIf port 13734 is already in use, you can specify a different port:\n\n```bash\ncargo run --bin pokemon-service -- --port 8080\n```\n\nThen update the client examples to use the new port by setting the environment variable:\n\n```bash\nPOKEMON_SERVICE_URL=http://localhost:8080 cargo run --example simple-client\n```\n\n### SDK Generation Issues\n\nIf the generated SDKs have issues, try cleaning and regenerating:\n\n```bash\n# Clean generated SDKs\nrm -rf pokemon-service-server-sdk pokemon-service-client\n\n# Clean gradle cache\ncd ../..\n./gradlew clean\n\n# Regenerate\ncd examples/legacy\nmake codegen\n```\n\n## Migration to HTTP 1.x\n\nFor new projects, we recommend using the HTTP 1.x examples in the parent [examples](../) directory. These legacy examples are maintained for backward compatibility and for projects that need to use the HTTP 0.x stack.\n\nThe main differences:\n- HTTP 1.x uses `hyper 1.x`, `http 1.x`\n- HTTP 1.x uses `aws-smithy-http`, `aws-smithy-http-server` (not legacy versions)\n- HTTP 1.x has better performance and modern async runtime support\n"
  },
  {
    "path": "examples/legacy/pokemon-service/Cargo.toml",
    "content": "[package]\nname = \"pokemon-service\"\nversion = \"0.1.0\"\nedition = \"2021\"\npublish = false\nauthors = [\"Smithy-rs Server Team <smithy-rs-server@amazon.com>\"]\ndescription = \"A smithy Rust service to retrieve information about Pokémon.\"\n\n[dependencies]\nclap = { version = \"4\", features = [\"derive\"] }\nhttp = \"0.2\"\nhyper = { version = \"0.14.26\", features = [\"server\"] }\ntokio = \"1.26.0\"\ntower = \"0.4\"\ntracing = \"0.1\"\n\n# Local paths\npokemon-service-server-sdk-http0x = { path = \"../pokemon-service-server-sdk-http0x/\", features = [\"request-id\"]}\npokemon-service-common = { path = \"../pokemon-service-common/\" }\n\n[dev-dependencies]\nassert_cmd = \"2.0\"\nasync-stream = \"0.3\"\nrand = \"0.8.5\"\nserial_test = \"3.1.1\"\n\n# We use hyper client in tests\nhyper = { version = \"0.14.26\", features = [\"server\", \"client\"] }\n\n# This dependency is only required for testing the `pokemon-service-tls` program.\nhyper-rustls = { version = \"0.24\", features = [\"http2\"] }\n\n# Local paths\naws-smithy-legacy-http = { path = \"../../../rust-runtime/aws-smithy-legacy-http/\" }\npokemon-service-client = { path = \"../pokemon-service-client/\", package = \"pokemon-service-client\", features = [\n    \"behavior-version-latest\",\n] }\n"
  },
  {
    "path": "examples/legacy/pokemon-service/src/authz.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! This file showcases a rather minimal model plugin that is agnostic over the operation that it\n//! is applied to.\n//!\n//! It is interesting because it is not trivial to figure out how to write one. As the\n//! documentation for [`aws_smithy_http_server::plugin::ModelMarker`] calls out, most model\n//! plugins' implementation are _operation-specific_, which are simpler.\n\nuse std::{marker::PhantomData, pin::Pin};\n\nuse pokemon_service_server_sdk_http0x::server::{\n    body::BoxBody,\n    operation::OperationShape,\n    plugin::{ModelMarker, Plugin},\n    response::IntoResponse,\n};\nuse tower::Service;\n\npub struct AuthorizationPlugin {\n    // Private so that users are forced to use the `new` constructor.\n    _private: (),\n}\n\nimpl AuthorizationPlugin {\n    pub fn new() -> Self {\n        Self { _private: () }\n    }\n}\n\n/// `T` is the inner service this plugin is applied to.\n/// See the documentation for [`Plugin`] for details.\nimpl<Ser, Op, T> Plugin<Ser, Op, T> for AuthorizationPlugin {\n    type Output = AuthorizeService<Op, T>;\n\n    fn apply(&self, input: T) -> Self::Output {\n        AuthorizeService {\n            inner: input,\n            authorizer: Authorizer::new(),\n        }\n    }\n}\n\nimpl ModelMarker for AuthorizationPlugin {}\n\npub struct AuthorizeService<Op, S> {\n    inner: S,\n    authorizer: Authorizer<Op>,\n}\n\n/// We manually implement `Clone` instead of adding `#[derive(Clone)]` because we don't require\n/// `Op` to be cloneable.\nimpl<Op, S> Clone for AuthorizeService<Op, S>\nwhere\n    S: Clone,\n{\n    fn clone(&self) -> Self {\n        Self {\n            inner: self.inner.clone(),\n            authorizer: self.authorizer.clone(),\n        }\n    }\n}\n\n/// The error returned by [`AuthorizeService`].\npub enum AuthorizeServiceError<E> {\n    /// Authorization was successful, but the inner service yielded an error.\n    InnerServiceError(E),\n    /// Authorization was not successful.\n    AuthorizeError { message: String },\n}\n\n// Only the _outermost_ model plugin needs to apply a `Service` whose error type implements\n// `IntoResponse` for the protocol the service uses (this requirement comes from the `Service`\n// implementation of [`aws_smithy_http_server::operation::Upgrade`]). So if the model plugin is\n// meant to be applied in any position, and to any Smithy service, one should implement\n// `IntoResponse` for all protocols.\n//\n// Having model plugins apply a `Service` that has a `Service::Response` type or a `Service::Error`\n// type that is different from those returned by the inner service hence diminishes the reusability\n// of the plugin because it makes the plugin less composable. Most plugins should instead work with\n// the inner service's types, and _at most_ require that those be `Op::Input` and `Op::Error`, for\n// maximum composability:\n//\n// ```\n// ...\n// where\n//     S: Service<(Op::Input, ($($var,)*)), Error = Op::Error>\n//     ...\n// {\n//     type Response = S::Response;\n//     type Error = S::Error;\n//     type Future = Pin<Box<dyn Future<Output = Result<S::Response, S::Error>> + Send>>;\n// }\n//\n// ```\n//\n// This plugin still exemplifies how changing a type can be done to make it more interesting.\n\nimpl<P, E> IntoResponse<P> for AuthorizeServiceError<E>\nwhere\n    E: IntoResponse<P>,\n{\n    fn into_response(self) -> http::Response<BoxBody> {\n        match self {\n            AuthorizeServiceError::InnerServiceError(e) => e.into_response(),\n            AuthorizeServiceError::AuthorizeError { message } => http::Response::builder()\n                .status(http::StatusCode::UNAUTHORIZED)\n                .body(pokemon_service_server_sdk_http0x::server::body::to_boxed(\n                    message,\n                ))\n                .expect(\"attempted to build an invalid HTTP response; please file a bug report\"),\n        }\n    }\n}\n\nmacro_rules! impl_service {\n    ($($var:ident),*) => {\n        impl<S, Op, $($var,)*> Service<(Op::Input, ($($var,)*))> for AuthorizeService<Op, S>\n        where\n            S: Service<(Op::Input, ($($var,)*)), Error = Op::Error> + Clone + Send + 'static,\n            S::Future: Send,\n            Op: OperationShape + Send + Sync + 'static,\n            Op::Input: Send + Sync + 'static,\n            $($var: Send + 'static,)*\n        {\n            type Response = S::Response;\n            type Error = AuthorizeServiceError<Op::Error>;\n            type Future =\n                Pin<Box<dyn std::future::Future<Output = Result<S::Response, Self::Error>> + Send>>;\n\n            fn poll_ready(\n                &mut self,\n                cx: &mut std::task::Context<'_>,\n            ) -> std::task::Poll<Result<(), Self::Error>> {\n                self.inner\n                    .poll_ready(cx)\n                    .map_err(|e| Self::Error::InnerServiceError(e))\n            }\n\n            fn call(&mut self, req: (Op::Input, ($($var,)*))) -> Self::Future {\n                let (input, exts) = req;\n\n                // Replacing the service is necessary to avoid readiness problems.\n                // https://docs.rs/tower/latest/tower/trait.Service.html#be-careful-when-cloning-inner-services\n                let service = self.inner.clone();\n                let mut service = std::mem::replace(&mut self.inner, service);\n\n                let authorizer = self.authorizer.clone();\n\n                let fut = async move {\n                    let is_authorized = authorizer.authorize(&input).await;\n                    if !is_authorized {\n                        return Err(Self::Error::AuthorizeError {\n                            message: \"Not authorized!\".to_owned(),\n                        });\n                    }\n\n                    service\n                        .call((input, exts))\n                        .await\n                        .map_err(|e| Self::Error::InnerServiceError(e))\n                };\n                Box::pin(fut)\n            }\n        }\n    };\n}\n\nstruct Authorizer<Op> {\n    operation: PhantomData<Op>,\n}\n\n/// We manually implement `Clone` instead of adding `#[derive(Clone)]` because we don't require\n/// `Op` to be cloneable.\nimpl<Op> Clone for Authorizer<Op> {\n    fn clone(&self) -> Self {\n        Self {\n            operation: PhantomData,\n        }\n    }\n}\n\nimpl<Op> Authorizer<Op> {\n    fn new() -> Self {\n        Self {\n            operation: PhantomData,\n        }\n    }\n\n    async fn authorize(&self, _input: &Op::Input) -> bool\n    where\n        Op: OperationShape,\n    {\n        // We'd perform the actual authorization here.\n        // We would likely need to add bounds on `Op::Input`, `Op::Error`, if we wanted to do\n        // anything useful.\n        true\n    }\n}\n\n// If we want our plugin to be as reusable as possible, the service it applies should work with\n// inner services (i.e. operation handlers) that take a variable number of parameters. A Rust macro\n// is helpful in providing those implementations concisely.\n// Each handler function registered must accept the operation's input type (if there is one).\n// Additionally, it can take up to 7 different parameters, each of which must implement the\n// `FromParts` trait. To ensure that this `AuthorizeService` works with any of those inner\n// services, we must implement it to handle up to\n// 7 different types. Therefore, we invoke the `impl_service` macro 8 times.\n\nimpl_service!();\nimpl_service!(T1);\nimpl_service!(T1, T2);\nimpl_service!(T1, T2, T3);\nimpl_service!(T1, T2, T3, T4);\nimpl_service!(T1, T2, T3, T4, T5);\nimpl_service!(T1, T2, T3, T4, T5, T6);\nimpl_service!(T1, T2, T3, T4, T5, T6, T7);\n"
  },
  {
    "path": "examples/legacy/pokemon-service/src/lib.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::net::{IpAddr, SocketAddr};\n\nuse pokemon_service_server_sdk_http0x::{\n    error::{GetStorageError, StorageAccessNotAuthorized},\n    input::{DoNothingInput, GetStorageInput},\n    output::{DoNothingOutput, GetStorageOutput},\n    server::request::{connect_info::ConnectInfo, request_id::ServerRequestId},\n};\n\n// Defaults shared between `main.rs` and `/tests`.\npub const DEFAULT_ADDRESS: &str = \"127.0.0.1\";\npub const DEFAULT_PORT: u16 = 13734;\n\n/// Logs the request IDs to `DoNothing` operation.\npub async fn do_nothing_but_log_request_ids(\n    _input: DoNothingInput,\n    request_id: ServerRequestId,\n) -> DoNothingOutput {\n    tracing::debug!(%request_id, \"do nothing\");\n    DoNothingOutput {}\n}\n\n/// Retrieves the user's storage. No authentication required for locals.\npub async fn get_storage_with_local_approved(\n    input: GetStorageInput,\n    connect_info: ConnectInfo<SocketAddr>,\n) -> Result<GetStorageOutput, GetStorageError> {\n    tracing::debug!(\"attempting to authenticate storage user\");\n\n    if !(input.user == \"ash\" && input.passcode == \"pikachu123\") {\n        tracing::debug!(\"authentication failed\");\n        return Err(GetStorageError::StorageAccessNotAuthorized(\n            StorageAccessNotAuthorized {},\n        ));\n    }\n\n    // We support trainers in our local gym\n    let local = connect_info.0.ip() == \"127.0.0.1\".parse::<IpAddr>().unwrap();\n    if local {\n        tracing::info!(\"welcome back\");\n        return Ok(GetStorageOutput {\n            collection: vec![\n                String::from(\"bulbasaur\"),\n                String::from(\"charmander\"),\n                String::from(\"squirtle\"),\n                String::from(\"pikachu\"),\n            ],\n        });\n    }\n\n    Ok(GetStorageOutput {\n        collection: vec![String::from(\"pikachu\")],\n    })\n}\n"
  },
  {
    "path": "examples/legacy/pokemon-service/src/main.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nmod authz;\nmod plugin;\n\nuse std::{net::SocketAddr, sync::Arc};\n\nuse clap::Parser;\nuse pokemon_service_server_sdk_http0x::server::{\n    extension::OperationExtensionExt,\n    instrumentation::InstrumentExt,\n    layer::alb_health_check::AlbHealthCheckLayer,\n    plugin::{HttpPlugins, ModelPlugins, Scoped},\n    request::request_id::ServerRequestIdProviderLayer,\n    AddExtensionLayer,\n};\n\nuse hyper::StatusCode;\nuse plugin::PrintExt;\n\nuse pokemon_service::{\n    do_nothing_but_log_request_ids, get_storage_with_local_approved, DEFAULT_ADDRESS, DEFAULT_PORT,\n};\nuse pokemon_service_common::{\n    capture_pokemon, check_health, get_pokemon_species, get_server_statistics, setup_tracing,\n    stream_pokemon_radio, State,\n};\nuse pokemon_service_server_sdk_http0x::{scope, PokemonService, PokemonServiceConfig};\n\nuse crate::authz::AuthorizationPlugin;\n\n#[derive(Parser, Debug)]\n#[clap(author, version, about, long_about = None)]\nstruct Args {\n    /// Hyper server bind address.\n    #[clap(short, long, action, default_value = DEFAULT_ADDRESS)]\n    address: String,\n    /// Hyper server bind port.\n    #[clap(short, long, action, default_value_t = DEFAULT_PORT)]\n    port: u16,\n}\n\n#[tokio::main]\npub async fn main() {\n    let args = Args::parse();\n    setup_tracing();\n\n    scope! {\n        /// A scope containing `GetPokemonSpecies` and `GetStorage`.\n        struct PrintScope {\n            includes: [GetPokemonSpecies, GetStorage]\n        }\n    }\n\n    // Scope the `PrintPlugin`, defined in `plugin.rs`, to `PrintScope`.\n    let print_plugin = Scoped::new::<PrintScope>(HttpPlugins::new().print());\n\n    let http_plugins = HttpPlugins::new()\n        // Apply the scoped `PrintPlugin`\n        .push(print_plugin)\n        // Apply the `OperationExtensionPlugin` defined in `aws_smithy_http_server::extension`. This allows other\n        // plugins or tests to access a `aws_smithy_http_server::extension::OperationExtension` from\n        // `Response::extensions`, or infer routing failure when it's missing.\n        .insert_operation_extension()\n        // Adds `tracing` spans and events to the request lifecycle.\n        .instrument();\n\n    let authz_plugin = AuthorizationPlugin::new();\n    let model_plugins = ModelPlugins::new().push(authz_plugin);\n\n    let config = PokemonServiceConfig::builder()\n        // Set up shared state and middlewares.\n        .layer(AddExtensionLayer::new(Arc::new(State::default())))\n        // Handle `/ping` health check requests.\n        .layer(AlbHealthCheckLayer::from_handler(\"/ping\", |_req| async {\n            StatusCode::OK\n        }))\n        // Add server request IDs.\n        .layer(ServerRequestIdProviderLayer::new())\n        .http_plugin(http_plugins)\n        .model_plugin(model_plugins)\n        .build();\n\n    let app = PokemonService::builder(config)\n        // Build a registry containing implementations to all the operations in the service. These\n        // are async functions or async closures that take as input the operation's input and\n        // return the operation's output.\n        .get_pokemon_species(get_pokemon_species)\n        .get_storage(get_storage_with_local_approved)\n        .get_server_statistics(get_server_statistics)\n        .capture_pokemon(capture_pokemon)\n        .do_nothing(do_nothing_but_log_request_ids)\n        .check_health(check_health)\n        .stream_pokemon_radio(stream_pokemon_radio)\n        .build()\n        .expect(\"failed to build an instance of PokemonService\");\n\n    // Using `into_make_service_with_connect_info`, rather than `into_make_service`, to adjoin the `SocketAddr`\n    // connection info.\n    let make_app = app.into_make_service_with_connect_info::<SocketAddr>();\n\n    // Bind the application to a socket.\n    let bind: SocketAddr = format!(\"{}:{}\", args.address, args.port)\n        .parse()\n        .expect(\"unable to parse the server bind address and port\");\n    let server = hyper::Server::bind(&bind).serve(make_app);\n\n    // Run forever-ish...\n    if let Err(err) = server.await {\n        eprintln!(\"server error: {err}\");\n    }\n}\n"
  },
  {
    "path": "examples/legacy/pokemon-service/src/plugin.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Provides an example [`Plugin`] implementation - [`PrintPlugin`].\n\nuse pokemon_service_server_sdk_http0x::server::{\n    operation::OperationShape,\n    plugin::{HttpMarker, HttpPlugins, Plugin, PluginStack},\n    service::ServiceShape,\n    shape_id::ShapeId,\n};\nuse tower::Service;\n\nuse std::task::{Context, Poll};\n\n/// A [`Service`] that prints a given string.\n#[derive(Clone, Debug)]\npub struct PrintService<S> {\n    inner: S,\n    operation_id: ShapeId,\n    service_id: ShapeId,\n}\n\nimpl<R, S> Service<R> for PrintService<S>\nwhere\n    S: Service<R>,\n{\n    type Response = S::Response;\n    type Error = S::Error;\n    type Future = S::Future;\n\n    fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {\n        self.inner.poll_ready(cx)\n    }\n\n    fn call(&mut self, req: R) -> Self::Future {\n        println!(\n            \"Hi {} in {}\",\n            self.operation_id.absolute(),\n            self.service_id.absolute()\n        );\n        self.inner.call(req)\n    }\n}\n/// A [`Plugin`] for a service builder to add a [`PrintLayer`] over operations.\n#[derive(Debug)]\npub struct PrintPlugin;\n\nimpl<Ser, Op, T> Plugin<Ser, Op, T> for PrintPlugin\nwhere\n    Ser: ServiceShape,\n    Op: OperationShape,\n{\n    type Output = PrintService<T>;\n\n    fn apply(&self, inner: T) -> Self::Output {\n        PrintService {\n            inner,\n            operation_id: Op::ID,\n            service_id: Ser::ID,\n        }\n    }\n}\n\nimpl HttpMarker for PrintPlugin {}\n\n/// This provides a [`print`](PrintExt::print) method on [`HttpPlugins`].\npub trait PrintExt<CurrentPlugin> {\n    /// Causes all operations to print the operation name when called.\n    ///\n    /// This works by applying the [`PrintPlugin`].\n    fn print(self) -> HttpPlugins<PluginStack<PrintPlugin, CurrentPlugin>>;\n}\n\nimpl<CurrentPlugin> PrintExt<CurrentPlugin> for HttpPlugins<CurrentPlugin> {\n    fn print(self) -> HttpPlugins<PluginStack<PrintPlugin, CurrentPlugin>> {\n        self.push(PrintPlugin)\n    }\n}\n"
  },
  {
    "path": "examples/legacy/pokemon-service/tests/common/mod.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::{process::Command, time::Duration};\n\nuse assert_cmd::prelude::*;\nuse tokio::time::sleep;\n\nuse pokemon_service::{DEFAULT_ADDRESS, DEFAULT_PORT};\nuse pokemon_service_client::{Client, Config};\nuse pokemon_service_common::ChildDrop;\n\npub async fn run_server() -> ChildDrop {\n    let crate_name = std::env::var(\"CARGO_PKG_NAME\").unwrap();\n    let child = Command::cargo_bin(crate_name).unwrap().spawn().unwrap();\n\n    sleep(Duration::from_millis(500)).await;\n\n    ChildDrop(child)\n}\n\npub fn base_url() -> String {\n    format!(\"http://{DEFAULT_ADDRESS}:{DEFAULT_PORT}\")\n}\n\npub fn client() -> Client {\n    let config = Config::builder()\n        .endpoint_url(format!(\"http://{DEFAULT_ADDRESS}:{DEFAULT_PORT}\"))\n        .build();\n    Client::from_conf(config)\n}\n"
  },
  {
    "path": "examples/legacy/pokemon-service/tests/event_streaming.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npub mod common;\n\nuse async_stream::stream;\nuse rand::Rng;\nuse serial_test::serial;\n\nuse pokemon_service_client::types::{\n    error::{AttemptCapturingPokemonEventError, MasterBallUnsuccessful},\n    AttemptCapturingPokemonEvent, CapturingEvent, CapturingPayload,\n};\n\nfn get_pokemon_to_capture() -> String {\n    let pokemons = vec![\"Charizard\", \"Pikachu\", \"Regieleki\"];\n    pokemons[rand::thread_rng().gen_range(0..pokemons.len())].to_string()\n}\n\nfn get_pokeball() -> String {\n    let random = rand::thread_rng().gen_range(0..100);\n    let pokeball = if random < 5 {\n        \"Master Ball\"\n    } else if random < 30 {\n        \"Great Ball\"\n    } else if random < 80 {\n        \"Fast Ball\"\n    } else {\n        \"Smithy Ball\"\n    };\n    pokeball.to_string()\n}\n\n#[tokio::test]\n#[serial]\nasync fn event_stream_test() {\n    let _child = common::run_server().await;\n    let client = common::client();\n\n    let mut team = vec![];\n    let input_stream = stream! {\n        // Always Pikachu\n        yield Ok(AttemptCapturingPokemonEvent::Event(\n            CapturingEvent::builder()\n            .payload(CapturingPayload::builder()\n                .name(\"Pikachu\")\n                .pokeball(\"Master Ball\")\n                .build())\n            .build()\n        ));\n        yield Ok(AttemptCapturingPokemonEvent::Event(\n            CapturingEvent::builder()\n            .payload(CapturingPayload::builder()\n                .name(\"Regieleki\")\n                .pokeball(\"Fast Ball\")\n                .build())\n            .build()\n        ));\n        yield Err(AttemptCapturingPokemonEventError::MasterBallUnsuccessful(MasterBallUnsuccessful::builder().build()));\n        // The next event should not happen\n        yield Ok(AttemptCapturingPokemonEvent::Event(\n            CapturingEvent::builder()\n            .payload(CapturingPayload::builder()\n                .name(\"Charizard\")\n                .pokeball(\"Great Ball\")\n                .build())\n            .build()\n        ));\n    };\n\n    // Throw many!\n    let mut output = common::client()\n        .capture_pokemon()\n        .region(\"Kanto\")\n        .events(input_stream.into())\n        .send()\n        .await\n        .unwrap();\n    loop {\n        match output.events.recv().await {\n            Ok(Some(capture)) => {\n                let pokemon = capture.as_event().unwrap().name.as_ref().unwrap().clone();\n                let pokedex = capture\n                    .as_event()\n                    .unwrap()\n                    .pokedex_update\n                    .as_ref()\n                    .unwrap()\n                    .clone();\n                let shiny = if *capture.as_event().unwrap().shiny.as_ref().unwrap() {\n                    \"\"\n                } else {\n                    \"not \"\n                };\n                let expected_pokedex: Vec<u8> = (0..255).collect();\n                println!(\"captured {} ({}shiny)\", pokemon, shiny);\n                if expected_pokedex == pokedex.into_inner() {\n                    println!(\"pokedex updated\")\n                }\n                team.push(pokemon);\n            }\n            Err(e) => {\n                println!(\"error from the server: {:?}\", e);\n                break;\n            }\n            Ok(None) => break,\n        }\n    }\n\n    while team.len() < 6 {\n        let pokeball = get_pokeball();\n        let pokemon = get_pokemon_to_capture();\n        let input_stream = stream! {\n            yield Ok(AttemptCapturingPokemonEvent::Event(\n                CapturingEvent::builder()\n                .payload(CapturingPayload::builder()\n                    .name(pokemon)\n                    .pokeball(pokeball)\n                    .build())\n                .build()\n            ))\n        };\n        let mut output = client\n            .capture_pokemon()\n            .region(\"Kanto\")\n            .events(input_stream.into())\n            .send()\n            .await\n            .unwrap();\n        match output.events.recv().await {\n            Ok(Some(capture)) => {\n                let pokemon = capture.as_event().unwrap().name.as_ref().unwrap().clone();\n                let pokedex = capture\n                    .as_event()\n                    .unwrap()\n                    .pokedex_update\n                    .as_ref()\n                    .unwrap()\n                    .clone();\n                let shiny = if *capture.as_event().unwrap().shiny.as_ref().unwrap() {\n                    \"\"\n                } else {\n                    \"not \"\n                };\n                let expected_pokedex: Vec<u8> = (0..255).collect();\n                println!(\"captured {} ({}shiny)\", pokemon, shiny);\n                if expected_pokedex == pokedex.into_inner() {\n                    println!(\"pokedex updated\")\n                }\n                team.push(pokemon);\n            }\n            Err(e) => {\n                println!(\"error from the server: {:?}\", e);\n                break;\n            }\n            Ok(None) => {}\n        }\n    }\n    println!(\"Team: {:?}\", team);\n}\n"
  },
  {
    "path": "examples/legacy/pokemon-service/tests/simple.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse bytes;\nuse http_body_util;\nuse hyper_util::{client::legacy::Client, rt::TokioExecutor};\nuse pokemon_service_client::{\n    error::{DisplayErrorContext, SdkError},\n    operation::get_storage::GetStorageError,\n    types::error::StorageAccessNotAuthorized,\n};\nuse serial_test::serial;\n\npub mod common;\n\n#[tokio::test]\n#[serial]\nasync fn simple_integration_test() {\n    let _child = common::run_server().await;\n    let client = common::client();\n\n    let service_statistics_out = client.get_server_statistics().send().await.unwrap();\n    assert_eq!(0, service_statistics_out.calls_count);\n\n    let pokemon_species_output = client\n        .get_pokemon_species()\n        .name(\"pikachu\")\n        .send()\n        .await\n        .unwrap();\n    assert_eq!(\"pikachu\", pokemon_species_output.name());\n\n    let service_statistics_out = client.get_server_statistics().send().await.unwrap();\n    assert_eq!(1, service_statistics_out.calls_count);\n\n    let storage_err = client\n        .get_storage()\n        .user(\"ash\")\n        .passcode(\"pikachu321\")\n        .send()\n        .await;\n    let has_not_authorized_error = if let Err(SdkError::ServiceError(context)) = storage_err {\n        matches!(\n            context.err(),\n            GetStorageError::StorageAccessNotAuthorized(StorageAccessNotAuthorized { .. }),\n        )\n    } else {\n        false\n    };\n    assert!(has_not_authorized_error, \"expected NotAuthorized error\");\n\n    let storage_out = client\n        .get_storage()\n        .user(\"ash\")\n        .passcode(\"pikachu123\")\n        .send()\n        .await\n        .unwrap();\n    assert_eq!(\n        vec![\n            \"bulbasaur\".to_string(),\n            \"charmander\".to_string(),\n            \"squirtle\".to_string(),\n            \"pikachu\".to_string()\n        ],\n        storage_out.collection\n    );\n\n    let pokemon_species_error = client\n        .get_pokemon_species()\n        .name(\"some_pokémon\")\n        .send()\n        .await\n        .unwrap_err();\n    let message = DisplayErrorContext(pokemon_species_error).to_string();\n    let expected =\n        r#\"ResourceNotFoundError [ResourceNotFoundException]: Requested Pokémon not available\"#;\n    assert!(\n        message.contains(expected),\n        \"expected '{message}' to contain '{expected}'\"\n    );\n\n    let service_statistics_out = client.get_server_statistics().send().await.unwrap();\n    assert_eq!(2, service_statistics_out.calls_count);\n\n    let hyper_client = Client::builder(TokioExecutor::new()).build_http();\n    let health_check_url = format!(\"{}/ping\", common::base_url());\n    let health_check_url = hyper::Uri::try_from(health_check_url).unwrap();\n    let request = hyper::Request::builder()\n        .uri(health_check_url)\n        .body(http_body_util::Empty::<bytes::Bytes>::new())\n        .unwrap();\n    let result = hyper_client.request(request).await.unwrap();\n\n    assert_eq!(result.status(), 200);\n}\n\n#[tokio::test]\n#[serial]\nasync fn health_check() {\n    let _child = common::run_server().await;\n\n    use pokemon_service::{DEFAULT_ADDRESS, DEFAULT_PORT};\n    let url = format!(\"http://{DEFAULT_ADDRESS}:{DEFAULT_PORT}/ping\");\n    let uri = url.parse::<hyper::Uri>().expect(\"invalid URL\");\n\n    // Since the `/ping` route is not modeled in Smithy, we use a regular\n    // Hyper HTTP client to make a request to it.\n    let request = hyper::Request::builder()\n        .uri(uri)\n        .body(http_body_util::Empty::<bytes::Bytes>::new())\n        .expect(\"failed to build request\");\n\n    let client = Client::builder(TokioExecutor::new()).build_http();\n    let response = client\n        .request(request)\n        .await\n        .expect(\"failed to get response\");\n\n    assert_eq!(response.status(), hyper::StatusCode::OK);\n    let body = http_body_util::BodyExt::collect(response.into_body())\n        .await\n        .expect(\"failed to read response body\")\n        .to_bytes();\n    assert!(body.is_empty());\n}\n"
  },
  {
    "path": "examples/legacy/pokemon-service-client-usage/Cargo.toml",
    "content": "[package]\nname = \"pokemon-service-client-usage\"\nversion = \"0.1.0\"\nedition = \"2021\"\npublish = false\n\n[features]\n\n\n[dependencies]\n# The generated client utilizes types defined in other crates, such as `aws_smithy_types`\n# and `aws_smithy_http`. However, most of these types are re-exported by the generated client,\n# eliminating the need to directly depend on the crates that provide them. In rare instances,\n# you may still need to include one of these crates as a dependency. Examples that require this\n# are specifically noted in comments above the corresponding dependency in this file.\npokemon-service-client = { path = \"../pokemon-service-client/\", package = \"pokemon-service-client\", features = [\"behavior-version-latest\"] }\n\n# Required for getting the operation name from the `Metadata`.\naws-smithy-legacy-http = { path = \"../../../rust-runtime/aws-smithy-legacy-http/\" }\n\n# Required for `Storable` and `StoreReplace` in `response-header-interceptor` example.\naws-smithy-types = { path = \"../../../rust-runtime/aws-smithy-types/\" }\n\n# Required for `HyperClientBuilder` in `client-connector` example.\naws-smithy-runtime = { path = \"../../../rust-runtime/aws-smithy-runtime/\", features=[\"test-util\"] }\n\n# Required for `Metadata` in `custom-header-using-interceptor` example.\naws-smithy-runtime-api = { path = \"../../../rust-runtime/aws-smithy-runtime-api/\", features=[\"client\"] }\n\n\nhyper = { version = \"0.14.25\", features = [\"client\", \"full\"] }\ntokio = {version = \"1.26.0\", features=[\"full\"]}\ntracing = \"0.1.37\"\ntracing-subscriber = { version = \"0.3.17\", features = [\"env-filter\"] }\nrustls = \"0.21.8\"\nhyper-rustls = \"0.24.1\"\nhttp = \"0.2.9\"\nuuid = {version=\"1.4.1\", features = [\"v4\"]}\nthiserror = \"1.0.49\"\n"
  },
  {
    "path": "examples/legacy/pokemon-service-client-usage/README.md",
    "content": "# smithy-rs Client Examples\n\nThis package contains some examples on how to use the Smithy Client to communicate\nwith a Smithy-based service.\n\n## Pre-requisites\n\n1. Build the `pokemon-service-client` and `pokemon-service` by invoking `make` in the\n   [examples](https://github.com/smithy-lang/smithy-rs/tree/main/examples) folder.\n\n```console\nmake\n```\n\n2. Run the Pokemon service locally by issuing the following command from the\n   [examples](https://github.com/smithy-lang/smithy-rs/tree/main/examples) folder. This\n   will launch the Smithy-Rs based service on TCP port 13734.\n\n```console\ncargo run --bin pokemon-service\n```\n\n## Running the examples\n\nYou can view a list of examples by running `cargo run --example` from the\n[pokemon-service-client-usage](https://github.com/smithy-lang/smithy-rs/tree/main/examples/pokemon-service-client-usage)\nfolder. To run an example, pass its name to the `cargo run --example` command, e.g.:\n\n```console\ncargo run --example simple-client\n```\n\n## List of examples\n\n| Rust Example                   | Description                                                             |\n|--------------------------------|-------------------------------------------------------------------------|\n| simple-client                  | Creates a Smithy Client and calls an operation on it.                   |\n| endpoint-resolver              | How to set a custom endpoint resolver.                                  |\n| handling-errors                | How to send an input parameter to an operation, and to handle errors.   |\n| custom-header                  | How to add headers to a request.                                        |\n| custom-header-using-interceptor| How to access operation name being called in an interceptor.            |\n| response-header-interceptor    | How to get operation name and access response before it is deserialized.|\n| use-config-bag                 | How to use the property bag to pass data across interceptors.           |\n| retries-customize              | Customize retry settings.                                               |\n| retries-disable                | How to disable retries.                                                 |\n| timeout-config                 | How to configure timeouts.                                              |\n| mock-request                   | Use a custom HttpConnector / Client to generate mock responses.         |\n| trace-serialize                | Trace request and response as they are serialized / deserialized.       |\n| client-connector               | Shows how to change TLS related configuration.                          |\n"
  },
  {
    "path": "examples/legacy/pokemon-service-client-usage/examples/client-connector.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n/// This example demonstrates how to set connector settings. For example, how to set\n/// trusted root certificates to use for HTTPs communication.\n///\n/// The example assumes that the Pokémon service is running on the localhost on TCP port 13734.\n/// Refer to the [README.md](https://github.com/smithy-lang/smithy-rs/tree/main/examples/pokemon-service-client-usage/README.md)\n/// file for instructions on how to launch the service locally.\n///\n/// The example can be run using `cargo run --example client-connector`.\n///\nuse aws_smithy_runtime::client::http::hyper_014::HyperClientBuilder;\nuse hyper_rustls::ConfigBuilderExt;\nuse pokemon_service_client::Client as PokemonClient;\nuse pokemon_service_client_usage::{setup_tracing_subscriber, POKEMON_SERVICE_URL};\n\n/// Creates a new `smithy-rs` client that is configured to communicate with a locally running Pokémon\n/// service on TCP port 13734.\n///\n/// # Examples\n///\n/// Basic usage:\n/// ```\n/// let client = create_client();\n/// ```\nfn create_client() -> PokemonClient {\n    let tls_config = rustls::ClientConfig::builder()\n        .with_safe_defaults()\n        // `with_native_roots()`: Load platform trusted root certificates.\n        // `with_webpki_roots()`: Load Mozilla’s set of trusted roots.\n        .with_native_roots()\n        // To use client side certificates, you can use\n        // `.with_client_auth_cert(client_cert, client_key)` instead of `.with_no_client_auth()`\n        .with_no_client_auth();\n\n    let tls_connector = hyper_rustls::HttpsConnectorBuilder::new()\n        .with_tls_config(tls_config)\n        // This can be changed to `.https_only()` to ensure that the client always uses HTTPs\n        .https_or_http()\n        .enable_http1()\n        .enable_http2()\n        .build();\n\n    // Create a hyper-based HTTP client that uses this TLS connector.\n    let http_client = HyperClientBuilder::new().build(tls_connector);\n\n    // Pass the smithy connector to the Client::ConfigBuilder\n    let config = pokemon_service_client::Config::builder()\n        .endpoint_url(POKEMON_SERVICE_URL)\n        .http_client(http_client)\n        .build();\n\n    // Instantiate a client by applying the configuration.\n    pokemon_service_client::Client::from_conf(config)\n}\n\n#[tokio::main]\nasync fn main() {\n    setup_tracing_subscriber();\n\n    // Create a configured `smithy-rs` client.\n    let client = create_client();\n\n    // Call an operation `get_server_statistics` on the Pokémon service.\n    let response = client\n        .get_server_statistics()\n        .send()\n        .await\n        .expect(\"operation failed\");\n\n    tracing::info!(?response, \"Response from service\")\n}\n"
  },
  {
    "path": "examples/legacy/pokemon-service-client-usage/examples/custom-header-using-interceptor.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n/// In this example, a custom header `x-amzn-client-ttl-seconds` is set for all outgoing requests.\n/// It serves as a demonstration of how an operation name can be retrieved and utilized within\n/// the interceptor.\n///\n/// The example assumes that the Pokémon service is running on the localhost on TCP port 13734.\n/// Refer to the [README.md](https://github.com/smithy-lang/smithy-rs/tree/main/examples/pokemon-service-client-usage/README.md)\n/// file for instructions on how to launch the service locally.\n///\n/// The example can be run using `cargo run --example custom-header-using-interceptor`.\n///\nuse std::{collections::HashMap, time::Duration};\n\nuse aws_smithy_runtime_api::client::orchestrator::Metadata;\nuse pokemon_service_client::config::{ConfigBag, Intercept};\nuse pokemon_service_client::Client as PokemonClient;\nuse pokemon_service_client::{\n    config::{interceptors::BeforeTransmitInterceptorContextMut, RuntimeComponents},\n    error::BoxError,\n};\nuse pokemon_service_client_usage::{setup_tracing_subscriber, POKEMON_SERVICE_URL};\n\n// The `TtlHeaderInterceptor` keeps a map of operation specific value to send\n// in the header for each Request.\n#[derive(Debug)]\npub struct TtlHeaderInterceptor {\n    /// Default time-to-live for an operation.\n    default_ttl: hyper::http::HeaderValue,\n    /// Operation specific time-to-live.\n    operation_ttl: HashMap<&'static str, hyper::http::HeaderValue>,\n}\n\n// Helper function to format duration as fractional seconds.\nfn format_ttl_value(ttl: Duration) -> String {\n    format!(\"{:.2}\", ttl.as_secs_f64())\n}\n\nimpl TtlHeaderInterceptor {\n    fn new(default_ttl: Duration) -> Self {\n        let duration_str = format_ttl_value(default_ttl);\n        let default_ttl_value = hyper::http::HeaderValue::from_str(duration_str.as_str())\n            .expect(\"could not create a header value for the default ttl\");\n\n        Self {\n            default_ttl: default_ttl_value,\n            operation_ttl: Default::default(),\n        }\n    }\n\n    /// Adds an operation name specific timeout value that needs to be set in the header.\n    fn add_operation_ttl(&mut self, operation_name: &'static str, ttl: Duration) {\n        let duration_str = format_ttl_value(ttl);\n\n        self.operation_ttl.insert(\n            operation_name,\n            hyper::http::HeaderValue::from_str(duration_str.as_str())\n                .expect(\"cannot create header value for the given ttl duration\"),\n        );\n    }\n}\n\n/// Appends the header `x-amzn-client-ttl-seconds` using either the default time-to-live value\n/// or an operation-specific value if it was set earlier using `add_operation_ttl`.\n//impl aws_smithy_runtime_api::client::interceptors::Interceptor for TtlHeaderInterceptor {\nimpl Intercept for TtlHeaderInterceptor {\n    fn name(&self) -> &'static str {\n        \"TtlHeaderInterceptor\"\n    }\n\n    /// Before the request is signed, add the header to the outgoing request.\n    fn modify_before_signing(\n        &self,\n        context: &mut BeforeTransmitInterceptorContextMut<'_>,\n        _runtime_components: &RuntimeComponents,\n        cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        // Metadata in the ConfigBag has the operation name.\n        let metadata = cfg.load::<Metadata>().expect(\"metadata should exist\");\n        let operation_name = metadata.name();\n\n        // Get operation specific or default HeaderValue to set for the header key.\n        let ttl = self\n            .operation_ttl\n            .get(operation_name)\n            .unwrap_or(&self.default_ttl);\n\n        context\n            .request_mut()\n            .headers_mut()\n            .insert(\"x-amzn-client-ttl-seconds\", ttl.clone());\n\n        tracing::info!(\"{operation_name} header set to {ttl:?}\");\n\n        Ok(())\n    }\n}\n\n/// Creates a new `smithy-rs` client that is configured to communicate with a locally running Pokémon service on TCP port 13734.\n///\n/// # Examples\n///\n/// Basic usage:\n///\n/// ```\n/// let client = create_client();\n/// ```\nfn create_client() -> PokemonClient {\n    // By default set the value of all operations to 6 seconds.\n    const DEFAULT_TTL: Duration = Duration::from_secs(6);\n\n    // Set up the interceptor to add an operation specific value of 3.5 seconds to be added\n    // for GetStorage operation.\n    let mut ttl_headers_interceptor = TtlHeaderInterceptor::new(DEFAULT_TTL);\n    ttl_headers_interceptor.add_operation_ttl(\"GetStorage\", Duration::from_millis(3500));\n\n    // The generated client has a type `Config::Builder` that can be used to build a `Config`, which\n    // allows configuring endpoint-resolver, timeouts, retries etc.\n    let config = pokemon_service_client::Config::builder()\n        .endpoint_url(POKEMON_SERVICE_URL)\n        .interceptor(ttl_headers_interceptor)\n        .build();\n\n    pokemon_service_client::Client::from_conf(config)\n}\n\n#[tokio::main]\nasync fn main() {\n    setup_tracing_subscriber();\n\n    // Create a configured `smithy-rs` client.\n    let client = create_client();\n\n    // Call an operation `get_server_statistics` on the Pokémon service.\n    let response = client\n        .get_server_statistics()\n        .send()\n        .await\n        .expect(\"operation failed\");\n\n    tracing::info!(%POKEMON_SERVICE_URL, ?response, \"Response for get_server_statistics()\");\n\n    // Call the operation `get_storage` on the Pokémon service. The `TtlHeaderInterceptor`\n    // interceptor will add a specific header name / value pair for this operation.\n    let response = client\n        .get_storage()\n        .user(\"ash\")\n        .passcode(\"pikachu123\")\n        .send()\n        .await\n        .expect(\"operation failed\");\n\n    // Print the response received from the service.\n    tracing::info!(%POKEMON_SERVICE_URL, ?response, \"Response received\");\n}\n"
  },
  {
    "path": "examples/legacy/pokemon-service-client-usage/examples/custom-header.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n/// This example demonstrates how to create a `smithy-rs` client, and call an operation with custom\n/// headers in the request.\n///\n/// The example assumes that the Pokémon service is running on the localhost on TCP port 13734.\n/// Refer to the [README.md](https://github.com/smithy-lang/smithy-rs/tree/main/examples/pokemon-service-client-usage/README.md)\n/// file for instructions on how to launch the service locally.\n///\n/// The example can be run using `cargo run --example custom-header`\n///\nuse pokemon_service_client::Client as PokemonClient;\nuse pokemon_service_client_usage::{setup_tracing_subscriber, POKEMON_SERVICE_URL};\n\n/// Creates a new `smithy-rs` client that is configured to communicate with a locally running Pokémon\n/// service on TCP port 13734.\n///\n/// # Examples\n///\n/// Basic usage:\n///\n/// ```\n/// let client = create_client();\n/// ```\nfn create_client() -> PokemonClient {\n    // The generated client has a type `Config::Builder` that can be used to build a `Config`, which\n    // allows configuring endpoint-resolver, timeouts, retries etc.\n    let config = pokemon_service_client::Config::builder()\n        .endpoint_url(POKEMON_SERVICE_URL)\n        .build();\n\n    // Apply the configuration on the client, and return that.\n    pokemon_service_client::Client::from_conf(config)\n}\n\n#[tokio::main]\nasync fn main() {\n    setup_tracing_subscriber();\n\n    // Create a configured `smithy-rs` client.\n    let client = create_client();\n\n    // Call an operation `get_server_statistics` on the Pokémon service.\n    let response = client\n        .get_server_statistics()\n        .customize()\n        .mutate_request(|req| {\n            // For demonstration purposes, add a header `x-ttl-seconds` to the outgoing request.\n            let headers = req.headers_mut();\n            headers.insert(\n                hyper::header::HeaderName::from_static(\"x-ttl-seconds\"),\n                hyper::header::HeaderValue::from(30),\n            );\n        })\n        .send()\n        .await\n        .expect(\"operation failed\");\n\n    tracing::info!(%POKEMON_SERVICE_URL, ?response, \"Response received\");\n}\n"
  },
  {
    "path": "examples/legacy/pokemon-service-client-usage/examples/endpoint-resolver.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n/// This example demonstrates how a custom `ResolveEndpoint` can be implemented for resolving\n/// endpoint of a request. Additionally, it shows how a header can be added using the endpoint\n/// builder.\n///\n/// The example assumes that the Pokémon service is running on the localhost on TCP port 13734.\n/// Refer to the [README.md](https://github.com/smithy-lang/smithy-rs/tree/main/examples/pokemon-service-client-usage/README.md)\n/// file for instructions on how to launch the service locally.\n///\n/// The example can be run using `cargo run --example endpoint-resolver`.\n///\nuse pokemon_service_client::config::endpoint::{Endpoint, EndpointFuture, Params, ResolveEndpoint};\nuse pokemon_service_client::primitives::{DateTime, DateTimeFormat};\nuse pokemon_service_client::Client as PokemonClient;\nuse pokemon_service_client_usage::setup_tracing_subscriber;\n\nuse std::time::SystemTime;\n\n// This struct, provided as an example, constructs the URL that should be set on each request during initialization.\n// It also implements the `ResolveEndpoint` trait, enabling it to be assigned as the endpoint_resolver in the `Config`.\n#[derive(Debug)]\nstruct RegionalEndpoint {\n    url_to_use: String,\n}\n\nimpl RegionalEndpoint {\n    fn new(regional_url: &str, port: u16) -> Self {\n        let url_to_use = format!(\"{}:{}\", regional_url, port);\n        RegionalEndpoint { url_to_use }\n    }\n}\n\nimpl ResolveEndpoint for RegionalEndpoint {\n    fn resolve_endpoint<'a>(&'a self, _params: &'a Params) -> EndpointFuture<'a> {\n        // Construct an endpoint using the Endpoint::Builder. Set the URL and,\n        // optionally, any headers to be sent with the request. For this example,\n        // we'll set the 'x-amz-date' header to the current date for all outgoing requests.\n        // `DateTime` can be used for formatting an RFC 3339 date time.\n        let now = SystemTime::now();\n        let date_time = DateTime::from(now);\n\n        let endpoint = Endpoint::builder()\n            .url(self.url_to_use.clone())\n            .header(\n                \"x-amz-date\",\n                date_time\n                    .fmt(DateTimeFormat::DateTimeWithOffset)\n                    .expect(\"Could not create a date in UTC format\"),\n            )\n            .build();\n        tracing::info!(?endpoint, \"Resolving endpoint\");\n        EndpointFuture::ready(Ok(endpoint))\n    }\n}\n\n/// Creates a new `smithy-rs` client that is configured to communicate with a locally running Pokémon service on TCP port 13734.\n///\n/// # Examples\n///\n/// Basic usage:\n///\n/// ```\n/// let client = create_client();\n/// ```\nfn create_client() -> PokemonClient {\n    const DEFAULT_PORT: u16 = 13734;\n\n    // Use the environment variable `REGIONAL_URL` for the URL.\n    let resolver = RegionalEndpoint::new(\n        std::env::var(\"REGIONAL_URL\")\n            .as_deref()\n            .unwrap_or(\"http://localhost\"),\n        DEFAULT_PORT,\n    );\n\n    let config = pokemon_service_client::Config::builder()\n        .endpoint_resolver(resolver)\n        .build();\n\n    // Apply the configuration on the client, and return that.\n    PokemonClient::from_conf(config)\n}\n\n#[tokio::main]\nasync fn main() {\n    setup_tracing_subscriber();\n\n    // Create a configured `smithy-rs` client.\n    let client = create_client();\n\n    // Call an operation `get_server_statistics` on the Pokémon service.\n    let response = client\n        .get_server_statistics()\n        .send()\n        .await\n        .expect(\"operation failed\");\n\n    tracing::info!(?response, \"Response received\");\n}\n"
  },
  {
    "path": "examples/legacy/pokemon-service-client-usage/examples/handling-errors.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! This example demonstrates how to handle service generated errors.\n//!\n//! The example assumes that the Pokémon service is running on the localhost on TCP port 13734.\n//! Refer to the [README.md](https://github.com/smithy-lang/smithy-rs/tree/main/examples/pokemon-service-client-usage/README.md)\n//! file for instructions on how to launch the service locally.\n//!\n//! The example can be run using `cargo run --example handling-errors`.\n\nuse pokemon_service_client::error::DisplayErrorContext;\nuse pokemon_service_client::Client as PokemonClient;\nuse pokemon_service_client::{error::SdkError, operation::get_storage::GetStorageError};\nuse pokemon_service_client_usage::{setup_tracing_subscriber, POKEMON_SERVICE_URL};\n\n/// Creates a new `smithy-rs` client that is configured to communicate with a locally running Pokémon service on TCP port 13734.\n///\n/// # Examples\n///\n/// Basic usage:\n///\n/// ```\n/// let client = create_client();\n/// ```\nfn create_client() -> PokemonClient {\n    // The generated client has a type `Config::Builder` that can be used to build a `Config`, which\n    // allows configuring endpoint-resolver, timeouts, retries etc.\n    let config = pokemon_service_client::Config::builder()\n        .endpoint_url(POKEMON_SERVICE_URL)\n        .build();\n\n    // Apply the configuration on the client, and return that.\n    PokemonClient::from_conf(config)\n}\n\n#[tokio::main]\nasync fn main() {\n    setup_tracing_subscriber();\n\n    // Create a configured `smithy-rs` client.\n    let client = create_client();\n\n    // The following example sends an incorrect passcode to the operation `get_storage`,\n    // which will return\n    // [StorageAccessNotAuthorized](https://github.com/smithy-lang/smithy-rs/blob/main/codegen-core/common-test-models/pokemon.smithy#L48)\n    let response_result = client\n        .get_storage()\n        .user(\"ash\")\n        // Give a wrong password to generate a service error.\n        .passcode(\"pkachu123\")\n        .send()\n        .await;\n\n    // All errors are consolidated into an `SdkError<T, R>`\n    match response_result {\n        Ok(response) => {\n            tracing::info!(?response, \"Response from service\")\n        }\n        Err(SdkError::ServiceError(se)) => {\n            // When an error response is received from the service, it is modeled\n            // as a `SdkError::ServiceError`.\n            match se.err() {\n                // Not authorized to access Pokémon storage.\n                GetStorageError::StorageAccessNotAuthorized(_) => {\n                    tracing::error!(\"You do not have access to this resource.\");\n                }\n                GetStorageError::ResourceNotFoundError(rnfe) => {\n                    let message = rnfe.message();\n                    tracing::error!(error = %message,\n                        \"Given Pikachu does not exist on the server.\"\n                    )\n                }\n                GetStorageError::ValidationError(ve) => {\n                    tracing::error!(error = %ve, \"A required field has not been set.\");\n                }\n                // The SdkError is marked as `#[non_exhaustive]`. Therefore, a catch-all pattern is required to handle\n                // potential future variants introduced in SdkError.\n                _ => {\n                    tracing::error!(error = %DisplayErrorContext(se.err()), \"Some other error has occurred on the server\")\n                }\n            }\n        }\n        Err(SdkError::TimeoutError(_)) => {\n            tracing::error!(\"The request timed out and could not be completed\");\n        }\n        Err(SdkError::ResponseError(re)) => {\n            // Raw response received from the service can be retrieved using\n            // the `raw()` method.\n            tracing::error!(\n                \"An unparsable response was received. Raw response: {:?}\",\n                re.raw()\n            );\n        }\n        Err(sdk_error) => {\n            // To retrieve the `source()` of an error within the following match statements,\n            // we work with the parent `SdkError` type, as individual variants don't directly provide it.\n            // Converting the parent error to its source transfers ownership of the variable.\n            match sdk_error {\n                SdkError::DispatchFailure(ref failure) => {\n                    if failure.is_io() {\n                        tracing::error!(\"An I/O error occurred\");\n                    } else if failure.is_timeout() {\n                        tracing::error!(\"Request timed out\");\n                    } else if failure.is_user() {\n                        tracing::error!(\"An invalid HTTP request has been provided\");\n                    } else {\n                        tracing::error!(\"Some other dispatch error occurred.\");\n                    };\n\n                    if let Ok(source) = sdk_error.into_source() {\n                        tracing::error!(%source, \"Error source\");\n                    }\n                }\n                SdkError::ConstructionFailure(_) => {\n                    if let Ok(source) = sdk_error.into_source() {\n                        tracing::error!(%source, \"Request could not be constructed.\");\n                    } else {\n                        tracing::error!(\"Request could not be constructed for unknown reasons\");\n                    }\n                }\n                _ => {\n                    tracing::error!(\"An unknown error has occurred\");\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "examples/legacy/pokemon-service-client-usage/examples/mock-request.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n/// This example demonstrates how to use a mock connector with `capture_request`. This allows for\n/// responding with a static `Response` while capturing the incoming request. The captured request\n/// can later be asserted to verify that the correct headers and body were sent to the server.\n///\n/// The example assumes that the Pokémon service is running on the localhost on TCP port 13734.\n/// Refer to the [README.md](https://github.com/smithy-lang/smithy-rs/tree/main/examples/pokemon-service-client-usage/README.md)\n/// file for instructions on how to launch the service locally.\n///\n/// The example can be run using `cargo run --example mock-request`.\n///\nuse aws_smithy_runtime::client::http::test_util::capture_request;\nuse pokemon_service_client::primitives::SdkBody;\nuse pokemon_service_client::Client as PokemonClient;\nuse pokemon_service_client_usage::{setup_tracing_subscriber, POKEMON_SERVICE_URL};\n\n#[tokio::main]\nasync fn main() {\n    setup_tracing_subscriber();\n\n    // Build a response that should be sent when the operation is called.\n    let response = http::Response::builder()\n        .status(200)\n        .body(SdkBody::from(r#\"{\"calls_count\":100}\"#))\n        .expect(\"response could not be constructed\");\n\n    // Call `capture_request` to obtain a HTTP connector and a request receiver.\n    // The request receiver captures the incoming request, while the connector can be passed\n    // to `Config::builder().http_client`.\n    let (http_client, captured_request) = capture_request(Some(response));\n\n    // Pass the `http_client` connector to `Config::builder`. The connector won't send\n    // the request over the network; instead, it will return the static response provided\n    // during its initialization.\n    let config = pokemon_service_client::Config::builder()\n        .endpoint_url(POKEMON_SERVICE_URL)\n        .http_client(http_client)\n        .build();\n\n    // Instantiate a client by applying the configuration.\n    let client = PokemonClient::from_conf(config);\n\n    // Call an operation `get_server_statistics` on the Pokémon service.\n    let response = client\n        .get_server_statistics()\n        .customize()\n        .mutate_request(|req| {\n            // For demonstration, send an extra header that can be verified to confirm\n            // that the client actually sends it.\n            let headers = req.headers_mut();\n            headers.insert(\n                hyper::header::HeaderName::from_static(\"user-agent\"),\n                hyper::header::HeaderName::from_static(\"sample-client\"),\n            );\n        })\n        .send()\n        .await\n        .expect(\"operation failed\");\n\n    // Print the response received from the service.\n    tracing::info!(%POKEMON_SERVICE_URL, ?response, \"Response received\");\n\n    // The captured request can be verified to have certain headers.\n    let req = captured_request.expect_request();\n    assert_eq!(req.headers().get(\"user-agent\"), Some(\"sample-client\"));\n\n    // As an example, you can verify the URL matches.\n    assert_eq!(req.uri(), \"http://localhost:13734/stats\");\n\n    // You can convert the captured body into a &str and use assert!\n    // on it if you want to verify the contents of the request body.\n    // let str_body = std::str::from_utf8(req.body().bytes().unwrap()).unwrap();\n}\n"
  },
  {
    "path": "examples/legacy/pokemon-service-client-usage/examples/response-header-interceptor.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nuse aws_smithy_runtime_api::client::orchestrator::Metadata;\n/// This example demonstrates how response headers can be examined before they are deserialized\n/// into the output type.\n///\n/// The example assumes that the Pokémon service is running on the localhost on TCP port 13734.\n/// Refer to the [README.md](https://github.com/smithy-lang/smithy-rs/tree/main/examples/pokemon-service-client-usage/README.md)\n/// file for instructions on how to launch the service locally.\n///\n/// The example can be run using `cargo run --example response-header-interceptor`.\n///\nuse aws_smithy_types::config_bag::{Storable, StoreReplace};\nuse pokemon_service_client::{\n    config::{\n        interceptors::{\n            BeforeDeserializationInterceptorContextRef, BeforeTransmitInterceptorContextMut,\n        },\n        ConfigBag, Intercept, RuntimeComponents,\n    },\n    error::BoxError,\n    Client as PokemonClient,\n};\nuse pokemon_service_client_usage::{setup_tracing_subscriber, POKEMON_SERVICE_URL};\nuse uuid::Uuid;\n\n#[derive(Debug, Clone)]\nstruct RequestId {\n    client_id: String,\n    server_id: Option<String>,\n}\n\nimpl Storable for RequestId {\n    type Storer = StoreReplace<Self>;\n}\n\n#[derive(Debug, thiserror::Error)]\nenum RequestIdError {\n    /// Client side\n    #[error(\"Client side request ID has not been set\")]\n    ClientRequestIdMissing(),\n}\n\n#[derive(Debug, Default)]\npub struct ResponseHeaderLoggingInterceptor;\n\nimpl ResponseHeaderLoggingInterceptor {\n    /// Creates a new `ResponseHeaderLoggingInterceptor`\n    pub fn new() -> Self {\n        Self::default()\n    }\n}\n\nimpl Intercept for ResponseHeaderLoggingInterceptor {\n    fn name(&self) -> &'static str {\n        \"ResponseHeaderLoggingInterceptor\"\n    }\n\n    /// Before the request is signed, add the header to the outgoing request.\n    fn modify_before_signing(\n        &self,\n        context: &mut BeforeTransmitInterceptorContextMut<'_>,\n        _runtime_components: &RuntimeComponents,\n        cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        let client_id = Uuid::new_v4().to_string();\n\n        let request_id = hyper::header::HeaderValue::from_str(&client_id)\n            .expect(\"failed to construct a header value from UUID\");\n        context\n            .request_mut()\n            .headers_mut()\n            .insert(\"x-amzn-requestid\", request_id);\n\n        cfg.interceptor_state().store_put(RequestId {\n            client_id,\n            server_id: None,\n        });\n\n        Ok(())\n    }\n\n    fn read_before_deserialization(\n        &self,\n        context: &BeforeDeserializationInterceptorContextRef<'_>,\n        _runtime_components: &RuntimeComponents,\n        cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        // `Metadata` in the `ConfigBag` has the operation name in it.\n        let metadata = cfg.load::<Metadata>().expect(\"metadata should exist\");\n        let operation_name = metadata.name().to_string();\n\n        // Get the server side request ID and set it in the RequestID data type\n        // that is in the ConfigBag. This way any other interceptor that requires the mapping\n        // can easily find it from the bag.\n        let response = context.response();\n        let header_received = response\n            .headers()\n            .iter()\n            .find(|(header_name, _)| *header_name == \"x-request-id\");\n\n        if let Some((_, server_id)) = header_received {\n            let request_details = cfg\n                .get_mut::<RequestId>()\n                .ok_or_else(|| Box::new(RequestIdError::ClientRequestIdMissing()))?;\n\n            tracing::info!(operation = %operation_name,\n                \"RequestID Mapping: {} = {server_id}\",\n                request_details.client_id,\n            );\n\n            request_details.server_id = Some(server_id.into());\n        } else {\n            tracing::info!(operation = %operation_name, \"Server RequestID missing in response\");\n        }\n\n        Ok(())\n    }\n}\n\n/// Creates a new `smithy-rs` client that is configured to communicate with a locally running Pokémon\n/// service on TCP port 13734.\n///\n/// # Examples\n///\n/// Basic usage:\n///\n/// ```\n/// let client = create_client();\n/// ```\nfn create_client() -> PokemonClient {\n    let config = pokemon_service_client::Config::builder()\n        .endpoint_url(POKEMON_SERVICE_URL)\n        .interceptor(ResponseHeaderLoggingInterceptor)\n        .build();\n\n    // Apply the configuration on the client, and return that.\n    PokemonClient::from_conf(config)\n}\n\n#[tokio::main]\nasync fn main() {\n    setup_tracing_subscriber();\n\n    // Create a configured `smithy-rs` client.\n    let client = create_client();\n\n    // Call an operation `get_server_statistics` on the Pokémon service.\n    let response = client\n        .get_server_statistics()\n        .send()\n        .await\n        .expect(\"operation failed\");\n\n    // If you need to access the `RequestIdError` raised by the interceptor,\n    // you can convert `SdkError::DispatchFailure` to a `ConnectorError`\n    // and then use `downcast_ref` on its source to get a `RequestIdError`.\n\n    tracing::info!(%POKEMON_SERVICE_URL, ?response, \"Response received\");\n}\n"
  },
  {
    "path": "examples/legacy/pokemon-service-client-usage/examples/retry-classifier.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n/// This example demonstrates how a custom RetryClassifier can be written to decide\n/// which error conditions should be retried.\n///\n/// The example assumes that the Pokémon service is running on the localhost on TCP port 13734.\n/// Refer to the [README.md](https://github.com/smithy-lang/smithy-rs/tree/main/examples/pokemon-service-client-usage/README.md)\n/// file for instructions on how to launch the service locally.\n///\n/// The example can be run using `cargo run --example retry-classifier`.\n///\nuse http::StatusCode;\nuse pokemon_service_client::{\n    config::{\n        interceptors::InterceptorContext,\n        retry::{ClassifyRetry, RetryAction, RetryConfig},\n    },\n    operation::get_server_statistics::GetServerStatisticsError,\n};\nuse pokemon_service_client_usage::{setup_tracing_subscriber, POKEMON_SERVICE_URL};\nuse std::time::Duration;\n\nuse pokemon_service_client::Client as PokemonClient;\n\n#[derive(Debug)]\nstruct SampleRetryClassifier;\n\n// By default, the generated client uses the `aws_http::retry::AwsResponseRetryClassifier`\n// to determine whether an error should be retried. To use a custom retry classifier,\n// implement the `ClassifyRetry` trait and pass it to the retry_classifier method\n// of the `Config::builder`.\nimpl ClassifyRetry for SampleRetryClassifier {\n    fn name(&self) -> &'static str {\n        \"SampleRetryClassifier\"\n    }\n\n    // For this example, the classifier should retry in case the error is GetServerStatisticsError\n    // and the status code is 503.\n    fn classify_retry(&self, ctx: &InterceptorContext) -> RetryAction {\n        // Get the output or error that has been deserialized from the response.\n        let output_or_error = ctx.output_or_error();\n\n        let error = match output_or_error {\n            Some(Ok(_)) | None => return RetryAction::NoActionIndicated,\n            Some(Err(err)) => err,\n        };\n\n        // Retry in case the error returned is GetServerStatisticsError and StatusCode is 503.\n        if let Some(_err) = error\n            .as_operation_error()\n            .and_then(|err| err.downcast_ref::<GetServerStatisticsError>())\n        {\n            if let Some(response) = ctx.response() {\n                if response.status() == StatusCode::SERVICE_UNAVAILABLE.into() {\n                    return RetryAction::server_error();\n                }\n            }\n        }\n\n        // Let other classifiers run and decide if the request should be retried.\n        // Returning RetryAction::RetryForbidden will forbid any retries.\n        RetryAction::NoActionIndicated\n    }\n}\n\n/// Creates a new `smithy-rs` client that is configured to communicate with a locally running Pokémon service on TCP port 13734.\n///\n/// # Examples\n///\n/// Basic usage:\n///\n/// ```\n/// let client = create_client();\n/// ```\nfn create_client() -> PokemonClient {\n    // By default the Smithy client uses RetryConfig::standard() strategy, with 3 retries, and\n    // an initial exponential back off of 1 second. To turn it off use RetryConfig::disabled().\n    let retry_config = RetryConfig::standard()\n        .with_initial_backoff(Duration::from_secs(3))\n        .with_max_attempts(5);\n\n    // The generated client has a type `Config::Builder` that can be used to build a `Config`, which\n    // allows configuring endpoint-resolver, timeouts, retries etc.\n    let config = pokemon_service_client::Config::builder()\n        .endpoint_url(POKEMON_SERVICE_URL)\n        .retry_config(retry_config)\n        // Add the retry classifier.\n        .retry_classifier(SampleRetryClassifier {})\n        .build();\n\n    // Apply the configuration on the client, and return that.\n    PokemonClient::from_conf(config)\n}\n\n#[tokio::main]\nasync fn main() {\n    setup_tracing_subscriber();\n\n    // Create a configured `smithy-rs` client.\n    let client = create_client();\n\n    // Call an operation `get_server_statistics` on the Pokémon service.\n    let response = client\n        .get_server_statistics()\n        .send()\n        .await\n        .expect(\"operation failed\");\n\n    tracing::info!(%POKEMON_SERVICE_URL, ?response, \"Response received\");\n}\n"
  },
  {
    "path": "examples/legacy/pokemon-service-client-usage/examples/retry-customize.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n/// This example demonstrates how to customize retry settings on a Smithy client.\n///\n/// The example assumes that the Pokémon service is running on the localhost on TCP port 13734.\n/// Refer to the [README.md](https://github.com/smithy-lang/smithy-rs/tree/main/examples/pokemon-service-client-usage/README.md)\n/// file for instructions on how to launch the service locally.\n///\n/// The example can be run using `cargo run --example retry-customize`.\n///\nuse pokemon_service_client_usage::{setup_tracing_subscriber, POKEMON_SERVICE_URL};\nuse std::time::Duration;\n\nuse pokemon_service_client::{config::retry::RetryConfig, Client as PokemonClient};\n\n/// Creates a new `smithy-rs` client that is configured to communicate with a locally running Pokémon service on TCP port 13734.\n///\n/// # Examples\n///\n/// Basic usage:\n///\n/// ```\n/// let client = create_client();\n/// ```\nfn create_client() -> PokemonClient {\n    // By default the Smithy client uses `RetryConfig::standard()` strategy, with 3 retries, and\n    // an initial exponential back off of 1 second. To turn it off use `RetryConfig::disabled()`.\n    let retry_config = RetryConfig::standard()\n        .with_initial_backoff(Duration::from_secs(3))\n        .with_max_attempts(5);\n\n    // The generated client has a type `Config::Builder` that can be used to build a `Config`, which\n    // allows configuring endpoint-resolver, timeouts, retries etc.\n    let config = pokemon_service_client::Config::builder()\n        .endpoint_url(POKEMON_SERVICE_URL)\n        .retry_config(retry_config)\n        .build();\n\n    // Apply the configuration on the client, and return that.\n    PokemonClient::from_conf(config)\n}\n\n#[tokio::main]\nasync fn main() {\n    setup_tracing_subscriber();\n\n    // Create a configured `smithy-rs` client.\n    let client = create_client();\n\n    // Call an operation `get_server_statistics` on the Pokémon service.\n    let response = client\n        .get_server_statistics()\n        .send()\n        .await\n        .expect(\"operation failed\");\n\n    tracing::info!(%POKEMON_SERVICE_URL, ?response, \"Response received\");\n}\n"
  },
  {
    "path": "examples/legacy/pokemon-service-client-usage/examples/simple-client.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n/// This example demonstrates how to create a `smithy-rs` Client and call an\n/// [operation](https://smithy.io/2.0/spec/idl.html?highlight=operation#operation-shape).\n///\n/// The example assumes that the Pokémon service is running on the localhost on TCP port 13734.\n/// Refer to the [README.md](https://github.com/smithy-lang/smithy-rs/tree/main/examples/pokemon-service-client-usage/README.md)\n/// file for instructions on how to launch the service locally.\n///\n/// The example can be run using `cargo run --example simple-client`.\n///\nuse pokemon_service_client::Client as PokemonClient;\nuse pokemon_service_client_usage::{setup_tracing_subscriber, POKEMON_SERVICE_URL};\n\n/// Creates a new `smithy-rs` client that is configured to communicate with a locally running Pokémon\n/// service on TCP port 13734.\n///\n/// # Examples\n///\n/// Basic usage:\n/// ```\n/// let client = create_client();\n/// ```\nfn create_client() -> PokemonClient {\n    // The generated client contains a type `config::Builder` for constructing a `Config` instance.\n    // This enables configuration of endpoint resolvers, timeouts, retries, etc.\n    let config = pokemon_service_client::Config::builder()\n        .endpoint_url(POKEMON_SERVICE_URL)\n        .build();\n\n    // Instantiate a client by applying the configuration.\n    PokemonClient::from_conf(config)\n}\n\n#[tokio::main]\nasync fn main() {\n    setup_tracing_subscriber();\n\n    // Create a configured `smithy-rs` client.\n    let client = create_client();\n\n    // Call an operation `get_server_statistics` on the Pokémon service.\n    let response = client\n        .get_server_statistics()\n        .send()\n        .await\n        .expect(\"operation failed\");\n\n    // Print the response received from the service.\n    tracing::info!(%POKEMON_SERVICE_URL, ?response, \"Response received\");\n}\n"
  },
  {
    "path": "examples/legacy/pokemon-service-client-usage/examples/timeout-config.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n/// This example demonstrates how to create a `smithy-rs` Client and set connection\n/// and operation related timeouts on the client.\n///\n/// The example assumes that the Pokémon service is running on the localhost on TCP port 13734.\n/// Refer to the [README.md](https://github.com/smithy-lang/smithy-rs/tree/main/examples/pokemon-service-client-usage/README.md)\n/// file for instructions on how to launch the service locally.\n///\n/// The example can be run using `cargo run --example timeout-config`\n///\nuse std::time::Duration;\n\nuse pokemon_service_client::{config::timeout::TimeoutConfig, Client as PokemonClient};\nuse pokemon_service_client_usage::{setup_tracing_subscriber, POKEMON_SERVICE_URL};\n\n/// Creates a new `smithy-rs` client that is configured to communicate with a locally running Pokémon service on TCP port 13734.\n///\n/// # Examples\n///\n/// Basic usage:\n///\n/// ```\n/// let client = create_client();\n/// ```\nfn create_client() -> PokemonClient {\n    // Different type of timeouts can be set on the client. These are:\n    // operation_attempt_timeout - If retries are enabled, this represents the timeout\n    //    for each individual operation attempt.\n    // operation_timeout - Overall timeout for the operation to complete.\n    // connect timeout - The amount of time allowed for a connection to be established.\n    let timeout_config = TimeoutConfig::builder()\n        .operation_attempt_timeout(Duration::from_secs(1))\n        .operation_timeout(Duration::from_secs(5))\n        .connect_timeout(Duration::from_millis(500))\n        .build();\n\n    let config = pokemon_service_client::Config::builder()\n        .endpoint_url(POKEMON_SERVICE_URL)\n        .timeout_config(timeout_config)\n        .build();\n\n    // Apply the configuration on the client, and return that.\n    PokemonClient::from_conf(config)\n}\n\n#[tokio::main]\nasync fn main() {\n    setup_tracing_subscriber();\n\n    // Create a configured `smithy-rs` client.\n    let client = create_client();\n\n    // Call an operation `get_server_statistics` on the Pokémon service.\n    let response = client\n        .get_server_statistics()\n        .send()\n        .await\n        .expect(\"Pokemon service does not seem to be running on localhost:13734\");\n\n    tracing::info!(%POKEMON_SERVICE_URL, ?response, \"Response received\");\n}\n"
  },
  {
    "path": "examples/legacy/pokemon-service-client-usage/examples/trace-serialize.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nuse aws_smithy_runtime::client::http::connection_poisoning::CaptureSmithyConnection;\n/// This example demonstrates how an interceptor can be written to trace what is being\n/// serialized / deserialized on the wire.\n///\n/// Please beware that this may log sensitive information! This example is meant for pedagogical\n/// purposes and may be useful in debugging scenarios. Please don't use this as-is in production.\n///\n/// The example assumes that the Pokémon service is running on the localhost on TCP port 13734.\n/// Refer to the [README.md](https://github.com/smithy-lang/smithy-rs/tree/main/examples/pokemon-service-client-usage/README.md)\n/// file for instructions on how to launch the service locally.\n///\n/// The example can be run using `cargo run --example trace-serialize`.\n///\nuse http::StatusCode;\nuse pokemon_service_client_usage::{setup_tracing_subscriber, POKEMON_SERVICE_URL};\nuse std::str;\n\nuse pokemon_service_client::{\n    config::{\n        interceptors::{\n            BeforeDeserializationInterceptorContextRef, BeforeTransmitInterceptorContextRef,\n        },\n        ConfigBag, Intercept, RuntimeComponents,\n    },\n    error::BoxError,\n    Client as PokemonClient,\n};\n\n/// An example interceptor that logs the request and response as they're sent and received.\n#[derive(Debug, Default)]\npub struct WireFormatInterceptor;\n\nimpl Intercept for WireFormatInterceptor {\n    fn name(&self) -> &'static str {\n        \"WireFormatInterceptor\"\n    }\n\n    // Called after the operation input has been serialized but before it's dispatched over the wire.\n    fn read_after_serialization(\n        &self,\n        context: &BeforeTransmitInterceptorContextRef<'_>,\n        _runtime_components: &RuntimeComponents,\n        _cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        // Get the request type from the context.\n        let request = context.request();\n        // Print the request to the debug tracing log.\n        tracing::debug!(?request);\n\n        Ok(())\n    }\n\n    // Called after the operation's response has been received but before it's deserialized into the\n    // operation's output type.\n    fn read_before_deserialization(\n        &self,\n        context: &BeforeDeserializationInterceptorContextRef<'_>,\n        _runtime_components: &RuntimeComponents,\n        cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        // Get the response type from the context.\n        let response = context.response();\n        // Print the response.\n        if response.status().as_u16() == StatusCode::OK.as_u16() {\n            tracing::info!(?response, \"Response received:\");\n        } else {\n            tracing::error!(?response);\n        }\n\n        // Print the connection information\n        let captured_connection = cfg.load::<CaptureSmithyConnection>().cloned();\n        if let Some(captured_connection) = captured_connection.and_then(|conn| conn.get()) {\n            tracing::info!(\n                remote_addr = ?captured_connection.remote_addr(),\n                local_addr = ?captured_connection.local_addr(),\n                \"Captured connection info\"\n            );\n        } else {\n            tracing::warn!(\"Connection info is missing!\");\n        }\n\n        Ok(())\n    }\n}\n\n/// Creates a new `smithy-rs` client that is configured to communicate with a locally running Pokémon service on TCP port 13734.\n///\n/// # Examples\n///\n/// Basic usage:\n///\n/// ```\n/// let client = create_client();\n/// ```\nfn create_client() -> PokemonClient {\n    // The generated client has a type `Config::Builder` that can be used to build a `Config`, which\n    // allows configuring endpoint-resolver, timeouts, retries etc.\n    let config = pokemon_service_client::Config::builder()\n        .endpoint_url(POKEMON_SERVICE_URL)\n        .interceptor(WireFormatInterceptor {})\n        .build();\n\n    // Apply the configuration on the client, and return that.\n    PokemonClient::from_conf(config)\n}\n\n#[tokio::main]\nasync fn main() {\n    setup_tracing_subscriber();\n\n    // Create a configured `smithy-rs` client.\n    let client = create_client();\n\n    // Call an operation `get_server_statistics` on the Pokémon service.\n    let response = client\n        .get_server_statistics()\n        .send()\n        .await\n        .expect(\"operation failed\");\n\n    tracing::info!(%POKEMON_SERVICE_URL, ?response, \"Response received\");\n}\n"
  },
  {
    "path": "examples/legacy/pokemon-service-client-usage/examples/use-config-bag.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n/// This example demonstrates how different interceptor can use a property bag to pass\n/// state from one interceptor to the next.\n///\n/// The example assumes that the Pokémon service is running on the localhost on TCP port 13734.\n/// Refer to the [README.md](https://github.com/smithy-lang/smithy-rs/tree/main/examples/pokemon-service-client-usage/README.md)\n/// file for instructions on how to launch the service locally.\n///\n/// The example can be run using `cargo run --example use-config-bag`.\n///\nuse aws_smithy_types::config_bag::{Storable, StoreReplace};\nuse pokemon_service_client_usage::{setup_tracing_subscriber, POKEMON_SERVICE_URL};\nuse std::time::Instant;\n\nuse pokemon_service_client::{\n    config::{\n        interceptors::{\n            BeforeDeserializationInterceptorContextRef, FinalizerInterceptorContextRef,\n        },\n        ConfigBag, Intercept, RuntimeComponents,\n    },\n    error::BoxError,\n    Client as PokemonClient,\n};\n\n#[derive(Debug)]\nstruct RequestTimestamp(Instant);\n\nimpl Storable for RequestTimestamp {\n    type Storer = StoreReplace<Self>;\n}\n\n#[derive(Debug, Default)]\npub struct SetTimeInterceptor;\n\n/// Note: This is merely an example demonstrating how state can\n/// be shared between two different interceptors. In a practical\n/// scenario, there wouldn't be a need to write two interceptors\n/// merely to display the duration from the start of the lifecycle\n/// to the receipt of the response. This task can be accomplished\n/// within a single interceptor by overriding both\n/// read_before_execution and read_before_deserialization.\nimpl Intercept for SetTimeInterceptor {\n    fn name(&self) -> &'static str {\n        \"SetTimeInterceptor\"\n    }\n\n    fn read_before_execution(\n        &self,\n        _context: &pokemon_service_client::config::interceptors::BeforeSerializationInterceptorContextRef<'_>,\n        cfg: &mut aws_smithy_types::config_bag::ConfigBag,\n    ) -> Result<(), pokemon_service_client::error::BoxError> {\n        cfg.interceptor_state()\n            .store_put(RequestTimestamp(Instant::now()));\n        Ok(())\n    }\n}\n\n#[derive(Debug, Default)]\npub struct GetTimeInterceptor;\n\nimpl Intercept for GetTimeInterceptor {\n    fn name(&self) -> &'static str {\n        \"GetTimeInterceptor\"\n    }\n\n    fn read_before_deserialization(\n        &self,\n        _context: &BeforeDeserializationInterceptorContextRef<'_>,\n        _runtime_components: &RuntimeComponents,\n        cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        let stop_watch = cfg\n            .load::<RequestTimestamp>()\n            .expect(\"StopWatch not found in the ConfigBag\");\n\n        let time_taken = stop_watch.0.elapsed();\n        tracing::info!(time_taken = %time_taken.as_micros(), \"Microseconds:\");\n\n        Ok(())\n    }\n\n    fn read_after_execution(\n        &self,\n        _context: &FinalizerInterceptorContextRef<'_>,\n        _runtime_components: &RuntimeComponents,\n        cfg: &mut ConfigBag,\n    ) -> Result<(), pokemon_service_client::error::BoxError> {\n        let timestamp = cfg\n            .load::<RequestTimestamp>()\n            .expect(\"RequestTimeStamp not found in the ConfigBag\");\n\n        let time_taken = timestamp.0.elapsed();\n        tracing::info!(time_taken = %time_taken.as_micros(), \"Microseconds:\");\n\n        Ok(())\n    }\n}\n\n/// Creates a new `smithy-rs` client that is configured to communicate with a locally running Pokémon service on TCP port 13734.\n///\n/// # Examples\n///\n/// Basic usage:\n///\n/// ```\n/// let client = create_client();\n/// ```\nfn create_client() -> PokemonClient {\n    // The generated client has a type `Config::Builder` that can be used to build a `Config`, which\n    // allows configuring endpoint-resolver, timeouts, retries etc.\n    let config = pokemon_service_client::Config::builder()\n        .endpoint_url(POKEMON_SERVICE_URL)\n        .interceptor(SetTimeInterceptor)\n        .interceptor(GetTimeInterceptor)\n        .build();\n\n    // Apply the configuration on the client, and return that.\n    PokemonClient::from_conf(config)\n}\n\n#[tokio::main]\nasync fn main() {\n    setup_tracing_subscriber();\n\n    // Create a configured `smithy-rs` client.\n    let client = create_client();\n\n    // Call an operation `get_server_statistics` on the Pokémon service.\n    let response = client\n        .get_server_statistics()\n        .send()\n        .await\n        .expect(\"Pokemon service does not seem to be running on localhost:13734\");\n\n    tracing::info!(%POKEMON_SERVICE_URL, ?response, \"Response received\");\n}\n"
  },
  {
    "path": "examples/legacy/pokemon-service-client-usage/src/lib.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\npub static POKEMON_SERVICE_URL: &str = \"http://localhost:13734\";\n\n/// Sets up the tracing subscriber to print `tracing::info!` and `tracing::error!` messages on the console.\npub fn setup_tracing_subscriber() {\n    // Add a tracing subscriber that uses the environment variable RUST_LOG\n    // to figure out which log level should be emitted. By default use `tracing::info!`\n    // as the logging level.\n    let filter = tracing_subscriber::EnvFilter::builder()\n        .with_default_directive(tracing_subscriber::filter::LevelFilter::INFO.into())\n        .from_env_lossy();\n\n    tracing_subscriber::fmt::fmt()\n        .with_env_filter(filter)\n        .init();\n}\n"
  },
  {
    "path": "examples/legacy/pokemon-service-common/Cargo.toml",
    "content": "[package]\nname = \"pokemon-service-common\"\nversion = \"0.1.0\"\nedition = \"2021\"\npublish = false\nauthors = [\"Smithy-rs Server Team <smithy-rs-server@amazon.com>\"]\ndescription = \"A smithy Rust service to retrieve information about Pokémon.\"\n\n[dependencies]\nasync-stream = \"0.3\"\nhttp = \"0.2.9\"\nrand = \"0.8\"\ntracing = \"0.1\"\ntracing-subscriber = { version = \"0.3.16\", features = [\"env-filter\", \"json\"] }\ntokio = { version = \"1\", default-features = false, features = [\"time\"] }\ntower = \"0.4\"\n\n# Local paths\naws-smithy-runtime = { path = \"../../../rust-runtime/aws-smithy-runtime\", features = [\"client\", \"connector-hyper-0-14-x\", \"tls-rustls\"] }\naws-smithy-runtime-api = { path = \"../../../rust-runtime/aws-smithy-runtime-api\", features = [\"client\"] }\npokemon-service-client = { path = \"../pokemon-service-client/\", package = \"pokemon-service-client\", features = [\n    \"behavior-version-latest\",\n] }\npokemon-service-server-sdk-http0x = { path = \"../pokemon-service-server-sdk-http0x\" }\n\n[dev-dependencies]\naws-smithy-runtime = { path = \"../../../rust-runtime/aws-smithy-runtime\", features = [\"test-util\"] }\n"
  },
  {
    "path": "examples/legacy/pokemon-service-common/src/lib.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Pokémon Service\n//!\n//! This crate implements the Pokémon Service.\n#![warn(missing_docs, missing_debug_implementations, rust_2018_idioms)]\nuse std::{\n    collections::HashMap,\n    convert::TryInto,\n    process::Child,\n    sync::{atomic::AtomicUsize, Arc},\n};\n\nuse async_stream::stream;\nuse aws_smithy_runtime::client::http::hyper_014::HyperConnector;\nuse aws_smithy_runtime_api::client::http::HttpConnector;\nuse http::Uri;\nuse pokemon_service_server_sdk_http0x::{\n    error, input, model,\n    model::CapturingPayload,\n    output,\n    server::Extension,\n    types::{Blob, ByteStream, SdkBody},\n};\nuse rand::{seq::SliceRandom, Rng};\nuse tracing_subscriber::{prelude::*, EnvFilter};\n\nconst PIKACHU_ENGLISH_FLAVOR_TEXT: &str =\n    \"When several of these Pokémon gather, their electricity could build and cause lightning storms.\";\nconst PIKACHU_SPANISH_FLAVOR_TEXT: &str =\n    \"Cuando varios de estos Pokémon se juntan, su energía puede causar fuertes tormentas.\";\nconst PIKACHU_ITALIAN_FLAVOR_TEXT: &str =\n    \"Quando vari Pokémon di questo tipo si radunano, la loro energia può causare forti tempeste.\";\nconst PIKACHU_JAPANESE_FLAVOR_TEXT: &str =\n    \"ほっぺたの りょうがわに ちいさい でんきぶくろを もつ。ピンチのときに ほうでんする。\";\n\n/// Kills [`Child`] process when dropped.\n#[derive(Debug)]\n#[must_use]\npub struct ChildDrop(pub Child);\n\nimpl Drop for ChildDrop {\n    fn drop(&mut self) {\n        self.0.kill().expect(\"failed to kill process\")\n    }\n}\n\n/// Setup `tracing::subscriber` to read the log level from RUST_LOG environment variable.\npub fn setup_tracing() {\n    let format = tracing_subscriber::fmt::layer().json();\n    let filter = EnvFilter::try_from_default_env()\n        .or_else(|_| EnvFilter::try_new(\"info\"))\n        .unwrap();\n    tracing_subscriber::registry()\n        .with(format)\n        .with(filter)\n        .init();\n}\n\n/// Structure holding the translations for a Pokémon description.\n#[derive(Debug)]\nstruct PokemonTranslations {\n    en: String,\n    es: String,\n    it: String,\n    jp: String,\n}\n\n/// PokémonService shared state.\n///\n/// Some applications may want to manage state between handlers. Imagine having a database connection pool\n/// that can be shared between different handlers and operation implementations.\n/// State management can be expressed in a struct where the attributes hold the shared entities.\n///\n/// **NOTE: It is up to the implementation of the state structure to handle concurrency by protecting**\n/// **its attributes using synchronization mechanisms.**\n///\n/// The framework stores the `Arc<T>` inside an `http::Extensions` and conveniently passes it to\n/// the operation's implementation, making it able to handle operations with two different async signatures:\n/// * `FnOnce(InputType) -> Future<OutputType>`\n/// * `FnOnce(InputType, Extension<Arc<T>>) -> Future<OutputType>`\n///\n/// Wrapping the service with a [`tower::Layer`] will allow to have operations' signatures with and without shared state:\n///\n/// ```compile_fail\n/// use std::sync::Arc;\n/// use aws_smithy_http_server::{AddExtensionLayer, Extension, Router};\n/// use tower::ServiceBuilder;\n/// use tokio::sync::RwLock;\n///\n/// // Shared state,\n/// #[derive(Debug, State)]\n/// pub struct State {\n///     pub count: RwLock<u64>\n/// }\n///\n/// // Operation implementation with shared state.\n/// async fn operation_with_state(input: Input, state: Extension<Arc<State>>) -> Output {\n///     let mut count = state.0.write().await;\n///     *count += 1;\n///     Ok(Output::new())\n/// }\n///\n/// // Operation implementation without shared state.\n/// async fn operation_without_state(input: Input) -> Output {\n///     Ok(Output::new())\n/// }\n///\n/// let app: Router = OperationRegistryBuilder::default()\n///     .operation_with_state(operation_with_state)\n///     .operation_without_state(operation_without_state)\n///     .build()\n///     .unwrap()\n///     .into();\n/// let shared_state = Arc::new(State::default());\n/// let app = app.layer(ServiceBuilder::new().layer(AddExtensionLayer::new(shared_state)));\n/// let server = hyper::Server::bind(&\"0.0.0.0:13734\".parse().unwrap()).serve(app.into_make_service());\n/// ...\n/// ```\n///\n/// Without the middleware layer, the framework will require operations' signatures without\n/// the shared state.\n///\n/// [`middleware`]: [`aws_smithy_http_server::AddExtensionLayer`]\n#[derive(Debug)]\npub struct State {\n    pokemons_translations: HashMap<String, PokemonTranslations>,\n    call_count: AtomicUsize,\n}\n\nimpl Default for State {\n    fn default() -> Self {\n        let mut pokemons_translations = HashMap::new();\n        pokemons_translations.insert(\n            String::from(\"pikachu\"),\n            PokemonTranslations {\n                en: String::from(PIKACHU_ENGLISH_FLAVOR_TEXT),\n                es: String::from(PIKACHU_SPANISH_FLAVOR_TEXT),\n                it: String::from(PIKACHU_ITALIAN_FLAVOR_TEXT),\n                jp: String::from(PIKACHU_JAPANESE_FLAVOR_TEXT),\n            },\n        );\n        Self {\n            pokemons_translations,\n            call_count: Default::default(),\n        }\n    }\n}\n\n/// Retrieves information about a Pokémon species.\npub async fn get_pokemon_species(\n    input: input::GetPokemonSpeciesInput,\n    state: Extension<Arc<State>>,\n) -> Result<output::GetPokemonSpeciesOutput, error::GetPokemonSpeciesError> {\n    state\n        .0\n        .call_count\n        .fetch_add(1, std::sync::atomic::Ordering::SeqCst);\n    // We only support retrieving information about Pikachu.\n    let pokemon = state.0.pokemons_translations.get(&input.name);\n    match pokemon.as_ref() {\n        Some(pokemon) => {\n            tracing::debug!(\"Requested Pokémon is {}\", input.name);\n            let flavor_text_entries = vec![\n                model::FlavorText {\n                    flavor_text: pokemon.en.to_owned(),\n                    language: model::Language::English,\n                },\n                model::FlavorText {\n                    flavor_text: pokemon.es.to_owned(),\n                    language: model::Language::Spanish,\n                },\n                model::FlavorText {\n                    flavor_text: pokemon.it.to_owned(),\n                    language: model::Language::Italian,\n                },\n                model::FlavorText {\n                    flavor_text: pokemon.jp.to_owned(),\n                    language: model::Language::Japanese,\n                },\n            ];\n            let output = output::GetPokemonSpeciesOutput {\n                name: String::from(\"pikachu\"),\n                flavor_text_entries,\n            };\n            Ok(output)\n        }\n        None => {\n            tracing::error!(\"Requested Pokémon {} not available\", input.name);\n            Err(error::GetPokemonSpeciesError::ResourceNotFoundException(\n                error::ResourceNotFoundException {\n                    message: String::from(\"Requested Pokémon not available\"),\n                },\n            ))\n        }\n    }\n}\n\n/// Retrieves the user's storage.\npub async fn get_storage(\n    input: input::GetStorageInput,\n    _state: Extension<Arc<State>>,\n) -> Result<output::GetStorageOutput, error::GetStorageError> {\n    tracing::debug!(\"attempting to authenticate storage user\");\n\n    // We currently only support Ash and he has nothing stored\n    if !(input.user == \"ash\" && input.passcode == \"pikachu123\") {\n        tracing::debug!(\"authentication failed\");\n        return Err(error::GetStorageError::StorageAccessNotAuthorized(\n            error::StorageAccessNotAuthorized {},\n        ));\n    }\n    Ok(output::GetStorageOutput { collection: vec![] })\n}\n\n/// Calculates and reports metrics about this server instance.\npub async fn get_server_statistics(\n    _input: input::GetServerStatisticsInput,\n    state: Extension<Arc<State>>,\n) -> output::GetServerStatisticsOutput {\n    // Read the current calls count.\n    let counter = state.0.call_count.load(std::sync::atomic::Ordering::SeqCst);\n    let calls_count = counter\n        .try_into()\n        .map_err(|e| {\n            tracing::error!(\"Unable to convert u64 to i64: {}\", e);\n        })\n        .unwrap_or(0);\n    tracing::debug!(\"This instance served {} requests\", counter);\n    output::GetServerStatisticsOutput { calls_count }\n}\n\n/// Attempts to capture a Pokémon.\npub async fn capture_pokemon(\n    mut input: input::CapturePokemonInput,\n) -> Result<output::CapturePokemonOutput, error::CapturePokemonError> {\n    if input.region != \"Kanto\" {\n        return Err(error::CapturePokemonError::UnsupportedRegionError(\n            error::UnsupportedRegionError {\n                region: input.region,\n            },\n        ));\n    }\n    let output_stream = stream! {\n        loop {\n            use std::time::Duration;\n            match input.events.recv().await {\n                Ok(maybe_event) => match maybe_event {\n                    Some(event) => {\n                        let capturing_event = event.as_event();\n                        if let Ok(attempt) = capturing_event {\n                            let payload = attempt.payload.clone().unwrap_or_else(|| CapturingPayload::builder().build());\n                            let pokeball = payload.pokeball().unwrap_or(\"\");\n                            if ! matches!(pokeball, \"Master Ball\" | \"Great Ball\" | \"Fast Ball\") {\n                                yield Err(\n                                    crate::error::CapturePokemonEventsError::InvalidPokeballError(\n                                        crate::error::InvalidPokeballError {\n                                            pokeball: pokeball.to_owned()\n                                        }\n                                    )\n                                );\n                            } else {\n                                let captured = match pokeball {\n                                    \"Master Ball\" => true,\n                                    \"Great Ball\" => rand::thread_rng().gen_range(0..100) > 33,\n                                    \"Fast Ball\" => rand::thread_rng().gen_range(0..100) > 66,\n                                    _ => unreachable!(\"invalid pokeball\"),\n                                };\n                                // Only support Kanto\n                                tokio::time::sleep(Duration::from_millis(1000)).await;\n                                // Will it capture the Pokémon?\n                                if captured {\n                                    let shiny = rand::thread_rng().gen_range(0..4096) == 0;\n                                    let pokemon = payload\n                                        .name()\n                                        .unwrap_or(\"\")\n                                        .to_string();\n                                    let pokedex: Vec<u8> = (0..255).collect();\n                                    yield Ok(crate::model::CapturePokemonEvents::Event(\n                                        crate::model::CaptureEvent {\n                                            name: Some(pokemon),\n                                            shiny: Some(shiny),\n                                            pokedex_update: Some(Blob::new(pokedex)),\n                                            captured: Some(true),\n                                        }\n                                    ));\n                                }\n                            }\n                        }\n                    }\n                    None => break,\n                },\n                Err(e) => println!(\"{e:?}\"),\n            }\n        }\n    };\n    Ok(output::CapturePokemonOutput::builder()\n        .events(output_stream.into())\n        .build()\n        .unwrap())\n}\n\n/// Empty operation used to benchmark the service.\npub async fn do_nothing(_input: input::DoNothingInput) -> output::DoNothingOutput {\n    output::DoNothingOutput {}\n}\n\n/// Operation used to show the service is running.\npub async fn check_health(_input: input::CheckHealthInput) -> output::CheckHealthOutput {\n    output::CheckHealthOutput {}\n}\n\nconst RADIO_STREAMS: [&str; 2] = [\n    \"https://ia800107.us.archive.org/33/items/299SoundEffectCollection/102%20Palette%20Town%20Theme.mp3\",\n    \"https://ia600408.us.archive.org/29/items/PocketMonstersGreenBetaLavenderTownMusicwwwFlvtoCom/Pocket%20Monsters%20Green%20Beta-%20Lavender%20Town%20Music-%5Bwww_flvto_com%5D.mp3\",\n];\n\n/// Streams a random Pokémon song.\npub async fn stream_pokemon_radio(\n    _input: input::StreamPokemonRadioInput,\n) -> output::StreamPokemonRadioOutput {\n    let radio_stream_url = RADIO_STREAMS\n        .choose(&mut rand::thread_rng())\n        .expect(\"`RADIO_STREAMS` is empty\")\n        .parse::<Uri>()\n        .expect(\"Invalid url in `RADIO_STREAMS`\");\n\n    let connector = HyperConnector::builder().build_https();\n    let result = connector\n        .call(\n            http::Request::builder()\n                .uri(radio_stream_url)\n                .body(SdkBody::empty())\n                .unwrap()\n                .try_into()\n                .unwrap(),\n        )\n        .await\n        .unwrap();\n\n    output::StreamPokemonRadioOutput {\n        data: ByteStream::new(result.into_body()),\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n\n    #[tokio::test]\n    async fn get_pokemon_species_pikachu_spanish_flavor_text() {\n        let input = input::GetPokemonSpeciesInput {\n            name: String::from(\"pikachu\"),\n        };\n\n        let state = Arc::new(State::default());\n\n        let actual_spanish_flavor_text = get_pokemon_species(input, Extension(state.clone()))\n            .await\n            .unwrap()\n            .flavor_text_entries\n            .into_iter()\n            .find(|flavor_text| flavor_text.language == model::Language::Spanish)\n            .unwrap();\n\n        assert_eq!(\n            PIKACHU_SPANISH_FLAVOR_TEXT,\n            actual_spanish_flavor_text.flavor_text()\n        );\n\n        let input = input::GetServerStatisticsInput {};\n        let stats = get_server_statistics(input, Extension(state.clone())).await;\n        assert_eq!(1, stats.calls_count);\n    }\n}\n"
  },
  {
    "path": "examples/legacy/pokemon-service-common/tests/plugins_execution_order.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::{\n    ops::Deref,\n    sync::Arc,\n    sync::Mutex,\n    task::{Context, Poll},\n};\n\nuse pokemon_service_server_sdk_http0x::{\n    server::plugin::{HttpMarker, HttpPlugins, Plugin},\n    PokemonService, PokemonServiceConfig,\n};\nuse tower::{Layer, Service};\n\nuse aws_smithy_runtime::client::http::test_util::capture_request;\nuse pokemon_service_client::{Client, Config};\nuse pokemon_service_common::do_nothing;\n\n#[tokio::test]\nasync fn plugin_layers_are_executed_in_registration_order() {\n    // Each plugin layer will push its name into this vector when it gets invoked.\n    // We can then check the vector content to verify the invocation order\n    let output = Arc::new(Mutex::new(Vec::new()));\n\n    let http_plugins = HttpPlugins::new()\n        .push(SentinelPlugin::new(\"first\", output.clone()))\n        .push(SentinelPlugin::new(\"second\", output.clone()));\n    let config = PokemonServiceConfig::builder()\n        .http_plugin(http_plugins)\n        .build();\n    let mut app = PokemonService::builder(config)\n        .do_nothing(do_nothing)\n        .build_unchecked();\n\n    let request = {\n        let (http_client, rcvr) = capture_request(None);\n        let config = Config::builder()\n            .http_client(http_client)\n            .endpoint_url(\"http://localhost:1234\")\n            .build();\n        Client::from_conf(config).do_nothing().send().await.unwrap();\n        rcvr.expect_request()\n    };\n\n    app.call(request.try_into().unwrap()).await.unwrap();\n\n    let output_guard = output.lock().unwrap();\n    assert_eq!(output_guard.deref(), &vec![\"first\", \"second\"]);\n}\n\nstruct SentinelPlugin {\n    name: &'static str,\n    output: Arc<Mutex<Vec<&'static str>>>,\n}\n\nimpl SentinelPlugin {\n    pub fn new(name: &'static str, output: Arc<Mutex<Vec<&'static str>>>) -> Self {\n        Self { name, output }\n    }\n}\n\nimpl<Ser, Op, T> Plugin<Ser, Op, T> for SentinelPlugin {\n    type Output = SentinelService<T>;\n\n    fn apply(&self, inner: T) -> Self::Output {\n        SentinelService {\n            inner,\n            name: self.name,\n            output: self.output.clone(),\n        }\n    }\n}\n\nimpl HttpMarker for SentinelPlugin {}\n\n#[derive(Clone, Debug)]\npub struct SentinelService<S> {\n    inner: S,\n    output: Arc<Mutex<Vec<&'static str>>>,\n    name: &'static str,\n}\n\nimpl<R, S> Service<R> for SentinelService<S>\nwhere\n    S: Service<R>,\n{\n    type Response = S::Response;\n    type Error = S::Error;\n    type Future = S::Future;\n\n    fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {\n        self.inner.poll_ready(cx)\n    }\n\n    fn call(&mut self, req: R) -> Self::Future {\n        self.output.lock().unwrap().push(self.name);\n        self.inner.call(req)\n    }\n}\n\n#[derive(Debug)]\npub struct SentinelLayer {\n    name: &'static str,\n    output: Arc<Mutex<Vec<&'static str>>>,\n}\n\nimpl<S> Layer<S> for SentinelLayer {\n    type Service = SentinelService<S>;\n\n    fn layer(&self, service: S) -> Self::Service {\n        SentinelService {\n            inner: service,\n            output: self.output.clone(),\n            name: self.name,\n        }\n    }\n}\n"
  },
  {
    "path": "examples/legacy/pokemon-service-lambda/Cargo.toml",
    "content": "[package]\nname = \"pokemon-service-lambda\"\nversion = \"0.1.0\"\nedition = \"2021\"\npublish = false\nauthors = [\"Smithy-rs Server Team <smithy-rs-server@amazon.com>\"]\ndescription = \"A smithy Rust service to retrieve information about Pokémon via Lambda.\"\n\n[dependencies]\nasync-stream = \"0.3.4\"\nclap = { version = \"4.1.11\", features = [\"derive\"] }\nhyper = {version = \"0.14.26\", features = [\"server\"] }\ntokio = \"1.26.0\"\ntracing = \"0.1\"\n\n# `aws-smithy-legacy-http-server` is only guaranteed to be compatible with this\n# version of `lambda_http`, or semver-compatible versions of this version.\n# Depending on other versions of `lambda_http` may not work.\nlambda_http = \"0.8.0\"\n\n# Local paths\npokemon-service-server-sdk-http0x = { path = \"../pokemon-service-server-sdk-http0x/\", features = [\"aws-lambda\"] }\npokemon-service-common = { path = \"../pokemon-service-common/\" }\n"
  },
  {
    "path": "examples/legacy/pokemon-service-lambda/src/lib.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::sync::Arc;\n\nuse pokemon_service_common::State;\nuse pokemon_service_server_sdk_http0x::{\n    error::{GetStorageError, StorageAccessNotAuthorized},\n    input::GetStorageInput,\n    output::GetStorageOutput,\n    server::{request::lambda::Context, Extension},\n};\n\n/// Retrieves the user's storage and logs the lambda request ID.\npub async fn get_storage_lambda(\n    input: GetStorageInput,\n    _state: Extension<Arc<State>>,\n    context: Context,\n) -> Result<GetStorageOutput, GetStorageError> {\n    tracing::debug!(request_id = %context.request_id, \"attempting to authenticate storage user\");\n\n    // We currently only support Ash and he has nothing stored\n    if !(input.user == \"ash\" && input.passcode == \"pikachu123\") {\n        tracing::debug!(\"authentication failed\");\n        return Err(GetStorageError::StorageAccessNotAuthorized(\n            StorageAccessNotAuthorized {},\n        ));\n    }\n    Ok(GetStorageOutput { collection: vec![] })\n}\n"
  },
  {
    "path": "examples/legacy/pokemon-service-lambda/src/main.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::sync::Arc;\n\nuse pokemon_service_common::{\n    capture_pokemon, check_health, do_nothing, get_pokemon_species, get_server_statistics,\n    setup_tracing, stream_pokemon_radio, State,\n};\nuse pokemon_service_lambda::get_storage_lambda;\nuse pokemon_service_server_sdk_http0x::{\n    server::{routing::LambdaHandler, AddExtensionLayer},\n    PokemonService, PokemonServiceConfig,\n};\n\n#[tokio::main]\npub async fn main() {\n    setup_tracing();\n\n    let config = PokemonServiceConfig::builder()\n        // Set up shared state and middlewares.\n        .layer(AddExtensionLayer::new(Arc::new(State::default())))\n        .build();\n    let app = PokemonService::builder(config)\n        // Build a registry containing implementations to all the operations in the service. These\n        // are async functions or async closures that take as input the operation's input and\n        // return the operation's output.\n        .get_pokemon_species(get_pokemon_species)\n        .get_storage(get_storage_lambda)\n        .get_server_statistics(get_server_statistics)\n        .capture_pokemon(capture_pokemon)\n        .do_nothing(do_nothing)\n        .check_health(check_health)\n        .stream_pokemon_radio(stream_pokemon_radio)\n        .build()\n        .expect(\"failed to build an instance of PokemonService\");\n\n    let handler = LambdaHandler::new(app);\n    let lambda = lambda_http::run(handler);\n\n    if let Err(err) = lambda.await {\n        eprintln!(\"lambda error: {err}\");\n    }\n}\n"
  },
  {
    "path": "examples/legacy/pokemon-service-lambda/tests/fixtures/example-apigw-request.json",
    "content": "{\n  \"body\": null,\n  \"headers\": {\n    \"Accept\": \"application/json\",\n    \"Accept-Encoding\": \"gzip, deflate\",\n    \"cache-control\": \"no-cache\",\n    \"CloudFront-Forwarded-Proto\": \"https\",\n    \"CloudFront-Is-Desktop-Viewer\": \"true\",\n    \"CloudFront-Is-Mobile-Viewer\": \"false\",\n    \"CloudFront-Is-SmartTV-Viewer\": \"false\",\n    \"CloudFront-Is-Tablet-Viewer\": \"false\",\n    \"CloudFront-Viewer-Country\": \"US\",\n    \"Content-Type\": \"application/json\",\n    \"headerName\": \"headerValue\",\n    \"Host\": \"gy415nuibc.execute-api.us-east-1.amazonaws.com\",\n    \"Postman-Token\": \"9f583ef0-ed83-4a38-aef3-eb9ce3f7a57f\",\n    \"User-Agent\": \"PostmanRuntime/2.4.5\",\n    \"Via\": \"1.1 d98420743a69852491bbdea73f7680bd.cloudfront.net (CloudFront)\",\n    \"X-Amz-Cf-Id\": \"pn-PWIJc6thYnZm5P0NMgOUglL1DYtl0gdeJky8tqsg8iS_sgsKD1A==\",\n    \"X-Forwarded-For\": \"54.240.196.186, 54.182.214.83\",\n    \"X-Forwarded-Port\": \"443\",\n    \"X-Forwarded-Proto\": \"https\"\n  },\n  \"httpMethod\": \"GET\",\n  \"isBase64Encoded\": false,\n  \"multiValueHeaders\": {\n    \"Accept\": [\"application/json\"],\n    \"Accept-Encoding\": [\"gzip, deflate\"],\n    \"cache-control\": [\"no-cache\"],\n    \"CloudFront-Forwarded-Proto\": [\"https\"],\n    \"CloudFront-Is-Desktop-Viewer\": [\"true\"],\n    \"CloudFront-Is-Mobile-Viewer\": [\"false\"],\n    \"CloudFront-Is-SmartTV-Viewer\": [\"false\"],\n    \"CloudFront-Is-Tablet-Viewer\": [\"false\"],\n    \"CloudFront-Viewer-Country\": [\"US\"],\n    \"Content-Type\": [\"application/json\"],\n    \"headerName\": [\"headerValue\"],\n    \"Host\": [\"gy415nuibc.execute-api.us-east-1.amazonaws.com\"],\n    \"Postman-Token\": [\"9f583ef0-ed83-4a38-aef3-eb9ce3f7a57f\"],\n    \"User-Agent\": [\"PostmanRuntime/2.4.5\"],\n    \"Via\": [\"1.1 d98420743a69852491bbdea73f7680bd.cloudfront.net (CloudFront)\"],\n    \"X-Amz-Cf-Id\": [\"pn-PWIJc6thYnZm5P0NMgOUglL1DYtl0gdeJky8tqsg8iS_sgsKD1A==\"],\n    \"X-Forwarded-For\": [\"54.240.196.186, 54.182.214.83\"],\n    \"X-Forwarded-Port\": [\"443\"],\n    \"X-Forwarded-Proto\": [\"https\"]\n  },\n  \"multiValueQueryStringParameters\": {\n    \"key\": [\"value\"]\n  },\n  \"path\": \"/stats\",\n  \"pathParameters\": null,\n  \"queryStringParameters\": {\n    \"key\": \"value\"\n  },\n  \"requestContext\": {\n    \"accountId\": \"xxxxx\",\n    \"apiId\": \"xxxxx\",\n    \"domainName\": \"testPrefix.testDomainName\",\n    \"domainPrefix\": \"testPrefix\",\n    \"extendedRequestId\": \"NvWWKEZbliAFliA=\",\n    \"httpMethod\": \"GET\",\n    \"identity\": {\n      \"accessKey\": \"xxxxx\",\n      \"accountId\": \"xxxxx\",\n      \"apiKey\": \"test-invoke-api-key\",\n      \"apiKeyId\": \"test-invoke-api-key-id\",\n      \"caller\": \"xxxxx:xxxxx\",\n      \"cognitoAuthenticationProvider\": null,\n      \"cognitoAuthenticationType\": null,\n      \"cognitoIdentityId\": null,\n      \"cognitoIdentityPoolId\": null,\n      \"principalOrgId\": null,\n      \"sourceIp\": \"test-invoke-source-ip\",\n      \"user\": \"xxxxx:xxxxx\",\n      \"userAgent\": \"aws-internal/3 aws-sdk-java/1.12.154 Linux/5.4.156-94.273.amzn2int.x86_64 OpenJDK_64-Bit_Server_VM/25.322-b06 java/1.8.0_322 vendor/Oracle_Corporation cfg/retry-mode/standard\",\n      \"userArn\": \"arn:aws:sts::xxxxx:assumed-role/xxxxx/xxxxx\"\n    },\n    \"path\": \"/stats\",\n    \"protocol\": \"HTTP/1.1\",\n    \"requestId\": \"e5488776-afe4-4e5e-92b1-37bd23f234d6\",\n    \"requestTime\": \"18/Feb/2022:13:23:12 +0000\",\n    \"requestTimeEpoch\": 1645190592806,\n    \"resourceId\": \"ddw8yd\",\n    \"resourcePath\": \"/stats\",\n    \"stage\": \"test-invoke-stage\"\n  },\n  \"resource\": \"/stats\",\n  \"stageVariables\": null\n}\n"
  },
  {
    "path": "examples/legacy/pokemon-service-tls/Cargo.toml",
    "content": "[package]\nname = \"pokemon-service-tls\"\nversion = \"0.1.0\"\nedition = \"2021\"\npublish = false\nauthors = [\"Smithy-rs Server Team <smithy-rs-server@amazon.com>\"]\ndescription = \"A smithy Rust service to retrieve information about Pokémon.\"\n\n[dependencies]\nclap = { version = \"4.1.11\", features = [\"derive\"] }\nhyper = { version = \"0.14.26\", features = [\"server\"] }\ntokio = \"1.26.0\"\ntracing = \"0.1\"\n\n# These dependencies are only required for the `pokemon-service-tls` program.\n\n# Latest version supporting hyper 0.x\ntls-listener = { version = \"0.8\", features = [\"rustls\", \"hyper-h2\"] }\ntokio-rustls = \"0.24\"\nrustls-pemfile = \"1\"\nfutures-util = { version = \"0.3.29\", default-features = false }\n\n# Local paths\npokemon-service-server-sdk-http0x = { path = \"../pokemon-service-server-sdk-http0x/\" }\npokemon-service-common = { path = \"../pokemon-service-common/\" }\n\n[dev-dependencies]\nassert_cmd = \"2.0\"\nserial_test = \"3.1.1\"\n\n# These dependencies are only required for testing the `pokemon-service-tls` program.\nhyper-rustls = { version = \"0.24\", features = [\"http2\"] }\nhyper-tls = { version = \"0.5\" }\n\n# Local paths\naws-smithy-legacy-http = { path = \"../../../rust-runtime/aws-smithy-legacy-http/\" }\naws-smithy-runtime = { path = \"../../../rust-runtime/aws-smithy-runtime\", features = [\"client\", \"connector-hyper-0-14-x\"] }\naws-smithy-types = { path = \"../../../rust-runtime/aws-smithy-types/\" }\npokemon-service-client = { path = \"../pokemon-service-client/\", package = \"pokemon-service-client\", features = [\n    \"behavior-version-latest\",\n] }\n"
  },
  {
    "path": "examples/legacy/pokemon-service-tls/src/lib.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n// Defaults shared between `main.rs` and `/tests`.\npub const DEFAULT_TEST_KEY: &str =\n    concat!(env!(\"CARGO_MANIFEST_DIR\"), \"/tests/testdata/localhost.key\");\npub const DEFAULT_TEST_CERT: &str =\n    concat!(env!(\"CARGO_MANIFEST_DIR\"), \"/tests/testdata/localhost.crt\");\npub const DEFAULT_ADDRESS: &str = \"127.0.0.1\";\npub const DEFAULT_PORT: u16 = 13734;\npub const DEFAULT_DOMAIN: &str = \"localhost\";\n"
  },
  {
    "path": "examples/legacy/pokemon-service-tls/src/main.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n// This program is exported as a binary named `pokemon-service-tls`.\n// It uses `tls-listener`, `tokio-rustls` (and `rustls-pemfile` to parse PEM files)\n// to serve TLS connections. It also enables h2 ALPN protocol,\n// without this clients by default don't upgrade to http2.\n//\n// You can use `mkcert` (https://github.com/FiloSottile/mkcert) to create certificates for testing:\n// `$ mkcert localhost`\n// it should create `./localhost.pem` and `./localhost-key.pem`,\n// then you can run TLS server via:\n// `$ cargo run --bin pokemon-service-tls -- --tls-cert-path ./localhost.pem --tls-key-path ./localhost-key.pem`\n// and test it:\n// ```bash\n// $ curl -k -D- -H \"Accept: application/json\" https://localhost:13734/pokemon-species/pikachu\n// HTTP/2 200\n// # ...\n// ```\n// note that by default created certificates will be unknown and you should use `-k|--insecure`\n// flag while making requests with cURL or you can run `mkcert -install` to trust certificates created by `mkcert`.\n\nuse std::{fs::File, future, io::BufReader, net::SocketAddr, sync::Arc};\n\nuse clap::Parser;\nuse futures_util::stream::StreamExt;\nuse tokio_rustls::{\n    rustls::{Certificate, PrivateKey, ServerConfig},\n    TlsAcceptor,\n};\n\nuse pokemon_service_common::{\n    capture_pokemon, check_health, get_pokemon_species, get_server_statistics, get_storage,\n    setup_tracing, stream_pokemon_radio, State,\n};\nuse pokemon_service_server_sdk_http0x::{\n    input, output,\n    server::{request::connect_info::ConnectInfo, routing::Connected, AddExtensionLayer},\n    PokemonService, PokemonServiceConfig,\n};\nuse pokemon_service_tls::{DEFAULT_ADDRESS, DEFAULT_PORT, DEFAULT_TEST_CERT, DEFAULT_TEST_KEY};\n\n#[derive(Parser, Debug)]\n#[clap(author, version, about, long_about = None)]\nstruct Args {\n    /// Hyper server bind address.\n    #[clap(short, long, action, default_value = DEFAULT_ADDRESS)]\n    address: String,\n    /// Hyper server bind port.\n    #[clap(short, long, action, default_value_t = DEFAULT_PORT)]\n    port: u16,\n    /// Hyper server TLS certificate path. Must be a PEM file.\n    #[clap(long, default_value = DEFAULT_TEST_CERT)]\n    tls_cert_path: String,\n    /// Hyper server TLS private key path. Must be a PEM file.\n    #[clap(long, default_value = DEFAULT_TEST_KEY)]\n    tls_key_path: String,\n}\n\n/// Information derived from the TLS connection.\n#[derive(Debug, Clone)]\npub struct TlsConnectInfo {\n    /// The remote peer address of this connection.\n    pub socket_addr: SocketAddr,\n\n    /// The set of TLS certificates presented by the peer in this connection.\n    pub certs: Option<Arc<Vec<Certificate>>>,\n}\n\nimpl Connected<&tokio_rustls::server::TlsStream<hyper::server::conn::AddrStream>>\n    for TlsConnectInfo\n{\n    fn connect_info(\n        target: &tokio_rustls::server::TlsStream<hyper::server::conn::AddrStream>,\n    ) -> Self {\n        let (addr_stream, session) = target.get_ref();\n        let socket_addr = addr_stream.remote_addr();\n\n        let certs = session\n            .peer_certificates()\n            .map(|certs| Arc::new(certs.to_vec()));\n\n        TlsConnectInfo { socket_addr, certs }\n    }\n}\n\n/// Empty operation used to showcase how we can get access to information derived from the TLS\n/// connection in.\npub async fn do_nothing_with_tls_connect_info(\n    _input: input::DoNothingInput,\n    ConnectInfo(tls_connect_info): ConnectInfo<TlsConnectInfo>,\n) -> output::DoNothingOutput {\n    // Logging these might pose a security concern! You probably don't want to do this in\n    // production.\n    tracing::debug!(?tls_connect_info.certs, \"peer TLS certificates\");\n\n    output::DoNothingOutput {}\n}\n\n#[tokio::main]\npub async fn main() {\n    let args = Args::parse();\n    setup_tracing();\n\n    let config = PokemonServiceConfig::builder()\n        // Set up shared state and middlewares.\n        .layer(AddExtensionLayer::new(Arc::new(State::default())))\n        .build();\n    let app = PokemonService::builder(config)\n        // Build a registry containing implementations to all the operations in the service. These\n        // are async functions or async closures that take as input the operation's input and\n        // return the operation's output.\n        .get_pokemon_species(get_pokemon_species)\n        .get_storage(get_storage)\n        .get_server_statistics(get_server_statistics)\n        .capture_pokemon(capture_pokemon)\n        .do_nothing(do_nothing_with_tls_connect_info)\n        .check_health(check_health)\n        .stream_pokemon_radio(stream_pokemon_radio)\n        .build()\n        .expect(\"failed to build an instance of PokemonService\");\n\n    let addr: SocketAddr = format!(\"{}:{}\", args.address, args.port)\n        .parse()\n        .expect(\"unable to parse the server bind address and port\");\n\n    let acceptor = acceptor(&args.tls_cert_path, &args.tls_key_path);\n    let listener = tls_listener::TlsListener::new(\n        acceptor,\n        hyper::server::conn::AddrIncoming::bind(&addr).expect(\"could not bind\"),\n    )\n    .connections()\n    .filter(|conn| {\n        if let Err(err) = conn {\n            eprintln!(\"connection error: {err:?}\");\n            future::ready(false)\n        } else {\n            future::ready(true)\n        }\n    });\n    // Using `into_make_service_with_connect_info`, rather than `into_make_service`, to adjoin the `TlsConnectInfo`\n    // connection info.\n    let make_app = app.into_make_service_with_connect_info::<TlsConnectInfo>();\n    let server =\n        hyper::Server::builder(hyper::server::accept::from_stream(listener)).serve(make_app);\n    if let Err(err) = server.await {\n        eprintln!(\"server error: {err}\");\n    }\n}\n\n// Returns a `TlsAcceptor` that can be used to create `TlsListener`\n// which then can be used with Hyper.\npub fn acceptor(cert_path: &str, key_path: &str) -> TlsAcceptor {\n    let certs = load_certs(cert_path);\n    let key = load_key(key_path);\n    let mut server_config = ServerConfig::builder()\n        .with_safe_defaults()\n        .with_no_client_auth()\n        .with_single_cert(certs, key)\n        .expect(\"could not create server config\");\n\n    // If we don't state we are accepting \"h2\", clients by default don't negotiate way up to http2.\n    server_config.alpn_protocols = vec![\"h2\".into(), \"http/1.1\".into()];\n\n    TlsAcceptor::from(Arc::new(server_config))\n}\n\nfn load_certs(path: &str) -> Vec<Certificate> {\n    let mut reader = BufReader::new(File::open(path).expect(\"could not open certificate\"));\n    rustls_pemfile::certs(&mut reader)\n        .expect(\"could not parse certificate\")\n        .into_iter()\n        .map(Certificate)\n        .collect()\n}\n\nfn load_key(path: &str) -> PrivateKey {\n    let mut reader = BufReader::new(File::open(path).expect(\"could not open private key\"));\n    loop {\n        match rustls_pemfile::read_one(&mut reader).expect(\"could not parse private key\") {\n            Some(rustls_pemfile::Item::RSAKey(key)) => return PrivateKey(key),\n            Some(rustls_pemfile::Item::PKCS8Key(key)) => return PrivateKey(key),\n            Some(rustls_pemfile::Item::ECKey(key)) => return PrivateKey(key),\n            None => break,\n            _ => {}\n        }\n    }\n    panic!(\"invalid private key\")\n}\n"
  },
  {
    "path": "examples/legacy/pokemon-service-tls/tests/common/mod.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::{fs::File, io::BufReader, process::Command, time::Duration};\n\nuse assert_cmd::prelude::*;\nuse aws_smithy_runtime::client::http::hyper_014::HyperClientBuilder;\nuse tokio::time::sleep;\n\nuse pokemon_service_client::{Client, Config};\nuse pokemon_service_common::ChildDrop;\nuse pokemon_service_tls::{DEFAULT_DOMAIN, DEFAULT_PORT, DEFAULT_TEST_CERT};\n\npub async fn run_server() -> ChildDrop {\n    let crate_name = std::env::var(\"CARGO_PKG_NAME\").unwrap();\n    let child = Command::cargo_bin(crate_name).unwrap().spawn().unwrap();\n\n    sleep(Duration::from_millis(500)).await;\n\n    ChildDrop(child)\n}\n\n// Returns a client that only talks through https and http2 connections.\n// It is useful in testing whether our server can talk to http2.\npub fn client_http2_only() -> Client {\n    // Create custom cert store and add our test certificate to prevent unknown cert issues.\n    let mut reader =\n        BufReader::new(File::open(DEFAULT_TEST_CERT).expect(\"could not open certificate\"));\n    let certs = rustls_pemfile::certs(&mut reader).expect(\"could not parse certificate\");\n    let mut roots = tokio_rustls::rustls::RootCertStore::empty();\n    roots.add_parsable_certificates(&certs);\n\n    let connector = hyper_rustls::HttpsConnectorBuilder::new()\n        .with_tls_config(\n            tokio_rustls::rustls::ClientConfig::builder()\n                .with_safe_defaults()\n                .with_root_certificates(roots)\n                .with_no_client_auth(),\n        )\n        .https_only()\n        .enable_http2()\n        .build();\n\n    let config = Config::builder()\n        .http_client(HyperClientBuilder::new().build(connector))\n        .endpoint_url(format!(\"https://{DEFAULT_DOMAIN}:{DEFAULT_PORT}\"))\n        .build();\n    Client::from_conf(config)\n}\n\n/// A `hyper` connector that uses the `native-tls` crate for TLS. To use this in a Smithy client,\n/// wrap with a [`HyperClientBuilder`].\npub type NativeTlsConnector = hyper_tls::HttpsConnector<hyper::client::HttpConnector>;\n\nfn native_tls_connector() -> NativeTlsConnector {\n    let cert = hyper_tls::native_tls::Certificate::from_pem(\n        std::fs::read_to_string(DEFAULT_TEST_CERT)\n            .expect(\"could not open certificate\")\n            .as_bytes(),\n    )\n    .expect(\"could not parse certificate\");\n\n    let tls_connector = hyper_tls::native_tls::TlsConnector::builder()\n        .min_protocol_version(Some(hyper_tls::native_tls::Protocol::Tlsv12))\n        .add_root_certificate(cert)\n        .build()\n        .unwrap_or_else(|e| panic!(\"error while creating TLS connector: {}\", e));\n    let mut http_connector = hyper::client::HttpConnector::new();\n    http_connector.enforce_http(false);\n    hyper_tls::HttpsConnector::from((http_connector, tls_connector.into()))\n}\n\npub fn native_tls_client() -> Client {\n    let config = Config::builder()\n        .http_client(HyperClientBuilder::new().build(native_tls_connector()))\n        .endpoint_url(format!(\"https://{DEFAULT_DOMAIN}:{DEFAULT_PORT}\"))\n        .build();\n    Client::from_conf(config)\n}\n"
  },
  {
    "path": "examples/legacy/pokemon-service-tls/tests/custom_connectors.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npub mod common;\n\nuse serial_test::serial;\n\n// This test invokes an operation with a client that can only send HTTP2 requests and whose TLS\n// implementation is backed by `rustls`.\n#[tokio::test]\n#[serial]\nasync fn test_do_nothing_http2_rustls_connector() {\n    let _child = common::run_server().await;\n    let client = common::client_http2_only();\n\n    let _check_health = client.do_nothing().send().await.unwrap();\n}\n\n// This test invokes an operation with a client whose TLS implementation is backed by `native_tls`.\n#[tokio::test]\n#[serial]\nasync fn test_do_nothing_native_tls_connector() {\n    let _child = common::run_server().await;\n    let client = common::native_tls_client();\n\n    let _check_health = client.do_nothing().send().await.unwrap();\n}\n"
  },
  {
    "path": "examples/legacy/pokemon-service-tls/tests/testdata/localhost.crt",
    "content": "-----BEGIN CERTIFICATE-----\nMIIFGTCCAwGgAwIBAgIUN/FD3OayKwJt9hXNKo4JKxqFSK4wDQYJKoZIhvcNAQEL\nBQAwFDESMBAGA1UEAwwJbG9jYWxob3N0MB4XDTIyMDgxNzE1MjQzMFoXDTMyMDgx\nNDE1MjQzMFowFDESMBAGA1UEAwwJbG9jYWxob3N0MIICIjANBgkqhkiG9w0BAQEF\nAAOCAg8AMIICCgKCAgEAulMGcyA69ioNMT8Kz0CdP2QP5elLNnltBykoqoJwbvKS\n94+l5XA//29M4NpLphHcDxNXx3qB318bixUIPBtu66OiIsTGX8yrYPA4IO3Xt5/2\nwp2z1lNLouyW1+gPaPjKzcrjnHmqHS90CFDQqxdv9I0rIFIQ+U5hm5T9Hjr5xs36\n43l2FXAjeigoEuwtVBDt44yhEyeLSDwFJES3sH73AvpruMdxGv2KDVN4whuajWll\nRLTqpqBvVSM6JbaV/VD2simpZeolSl8yKIenM2PWPdLIHSMEBg6IaYgpSpzoyvmh\n089peAaiJfVrN53QjqDVyaN5os9ST03ZEzXQUI38lpvWGmV9Tcs5WfidLA1EbPjv\nyE1zBbZh0SrP/+EALwkoIRslI8DXvz/9U5Cq7q9U4OHjWB+yjE5/BX6o6hfrqfJ1\nLdg2fTp/TYEudmefM8eRzx6sdYtTPZBrSpkRgvmxd+6k3QUtsAQhtBTMpvJpWsgs\nsD7Uo6G2JRag53oT/2cxG03Qy5HqySZUK1bpFW03W5FL3Pq6AkpGy1hnSxlifkHp\nsi61dbjCV5uRdxRCLyH9fD3HImecet+vnuZlvsP0MAzh0vbli/dcFZ7xUoSqFWnj\negnPohdOmF6C8kXvWBt51N4jjW+eLxPAr9H0mJtdIvEHWBNNW9iitzGz5Gw0g4sC\nAwEAAaNjMGEwHQYDVR0OBBYEFEoLkB78Z6jgPPmOyf0XnWo/LjA9MB8GA1UdIwQY\nMBaAFEoLkB78Z6jgPPmOyf0XnWo/LjA9MBQGA1UdEQQNMAuCCWxvY2FsaG9zdDAJ\nBgNVHRMEAjAAMA0GCSqGSIb3DQEBCwUAA4ICAQC17OljBEEVYefzk2mwg20AXDtL\nPUJ46hLrUM7BcNBjd8AbtrLH/pdCRCexnv7tzYbwMhDNdqHiIcXDHEMNP3gXryB2\nckU5ms/LzfKADM2/hrDZiR03XYSL4thjFkQNVfYnk9k7LTv9pKW0b+J2OrMun7+w\nbdXcNw+igvnYiBgNJRo0IC9O5nejqLGWwBfveAJPetxjy6PvBkLqgIw2glivmTrh\nKdoq/I2/ZcxT0GyhEVIHP9W8Hh5goNm+RbsB/hDYhK+5s2+rL1lwJrwhNBrHhG1u\nCtYmd2rD0J/mGf1cAw7t+hmwW0O7J9BVZw4YL/m4vDAsTO4zaeoAvDwsgQwPzPF1\nrmRtV+7jJHyIP/b021XIdIZU5KsXCCA3+B31mHJF1GLreG7WI+wClRsiNSbP7Zuw\nOnUOTDZc77Y4oaDKl0UL8tz1GNwX5G9U5h+FciTPKCtg1gGiqSkB/3BOON2WaVOb\n6Di9iAoH+dIjvWR/7ez7DAk/ITpGvBXS5RqaIXfB9pSJlVYsGp03ikgng1eJdXy4\n57XZnd47upHH88NTvIH9G/iOXQQCzF3MQXOqrJ/gem3ICeelvOoyNseHLvi8ZEqa\ns693CJWaQAK/jD1mhka7yQzmb/Y1I53crc2UqSxX4FqFYP8xymza4Cg/E6pPJerG\nLE/drJtbrIHTUlJB2Q==\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "examples/legacy/pokemon-service-tls/tests/testdata/localhost.key",
    "content": "-----BEGIN PRIVATE KEY-----\nMIIJQgIBADANBgkqhkiG9w0BAQEFAASCCSwwggkoAgEAAoICAQC6UwZzIDr2Kg0x\nPwrPQJ0/ZA/l6Us2eW0HKSiqgnBu8pL3j6XlcD//b0zg2kumEdwPE1fHeoHfXxuL\nFQg8G27ro6IixMZfzKtg8Dgg7de3n/bCnbPWU0ui7JbX6A9o+MrNyuOceaodL3QI\nUNCrF2/0jSsgUhD5TmGblP0eOvnGzfrjeXYVcCN6KCgS7C1UEO3jjKETJ4tIPAUk\nRLewfvcC+mu4x3Ea/YoNU3jCG5qNaWVEtOqmoG9VIzoltpX9UPayKall6iVKXzIo\nh6czY9Y90sgdIwQGDohpiClKnOjK+aHTz2l4BqIl9Ws3ndCOoNXJo3miz1JPTdkT\nNdBQjfyWm9YaZX1NyzlZ+J0sDURs+O/ITXMFtmHRKs//4QAvCSghGyUjwNe/P/1T\nkKrur1Tg4eNYH7KMTn8FfqjqF+up8nUt2DZ9On9NgS52Z58zx5HPHqx1i1M9kGtK\nmRGC+bF37qTdBS2wBCG0FMym8mlayCywPtSjobYlFqDnehP/ZzEbTdDLkerJJlQr\nVukVbTdbkUvc+roCSkbLWGdLGWJ+QemyLrV1uMJXm5F3FEIvIf18PcciZ5x636+e\n5mW+w/QwDOHS9uWL91wVnvFShKoVaeN6Cc+iF06YXoLyRe9YG3nU3iONb54vE8Cv\n0fSYm10i8QdYE01b2KK3MbPkbDSDiwIDAQABAoICAAvSJaLF2jJw44pgILGaZ1Tf\nZnTPKBLqLDpxPYpny8tLf3sjoBeeLKk/ffChWNL4khiwwPe/tB/1muaS1zASYNH5\nUoQt2L9jhEHvq5fx5FGFiAm700OB4Fa9939LfTgghKP+vxGtKazqrEwKGIWqRH45\nkJFfM4LQRWKyAUcFiyrg5DhspcsMD2wkwmTE8Bvua7FCjvDgqDZVJycFvGOprRvW\nwwvON2+fbek/hktGULgFBkQ6zXefI8ESgudj80Bxfl06RcGDU99T38zwzPD2i1/m\nZgTB38j562Sf8K1c/BXt4CWdzz1VVRHfGptvheJD85xJz0yUJk7atllrfMOyO7fp\n4nj6M4EGZGfqqM6CFULkspVSoza/nLN3sOkcZqG+EJ9x6bo/MfUudJ50+cq2BhlQ\njM43j+wtm9DYPnJNXIC5FCze41N5MSDfK9h2oC16E6H6/VG9Y+AMMVrEDvsXXuOi\nI0G8rcVanBdS3+nmmbTt4n0EVBLujB/ZJ/Qhsz/7QEeWn/xQNT4i00yRGG1mYJG0\nPs0cy6t6jVrRoZmf7aYcUat97vHEP/ddo2V6ANRiZR3wVjhhoX1lVC8T0llzjxr4\nFEIDDuS+fnFqK1uHGBxS4lPHy/57gpdpYskoQtykpXURh4k39Fc28mzxKsrBhX6V\nqY07bpgMNqYPC7SpkzO1AoIBAQDxEsGrZl0gNPhkXUwRSFvQxQDh0jqZAnEHdqOA\nnO49z7ym7e/LELtq7y/HP9sZxoVsAcOryGL0qUpFrQozXMnSzWwqkxwOIABpQ4gq\nmSJIZAUFVnV7m5h5xdln2jJ+xhvKv2vnXyuP3wRkiKrQPMqe6jE93cJb4YcMTK2V\nxgxcUTZjT5LoMUCZguT1LCT/xR66epfombhGEweeTHJKEwPbwq1HbOECsB8vjZ8G\nnwlm/Dt1fJXIo/+dvnfM+v79ebxKzC3t900Nj2eSCsX0bIU76zc1dqj+V/PD4+6h\nNojOFrAusVaaOj5ssTTzebBqsmHiOs1a4YR5MOYidPpqvZ+9AoIBAQDF3HHwiiUp\nzit5oIUkz1EkN7+jgEfrLNd9Kt3kNz3rTwXWoCE8tE4ctxBdn61RD3CHaT6PThNg\n6naENyTFcjrP4F0O0K76ErlYxNSoV7w/OyrRmRu21U4gTF9nWidxOSTOo1qGJdKI\nbaAk4tSFsjsdysx9xcLueqDQdGOobzeSBr6tJSq8cvEvW39E6cNHDxVk5CEg0Ffq\n7XA8+l+LfoP+6YL2du5jEe0K+/dTt2vYch8/9DloRezga21kV7Jea68Mqcxb5xsB\nCoh5pe3OipUtaAWe6G+J1pRuz9OldacI36VuHQa/YBI7Ws7dt3IhPQoHnh0qujYp\niasxJQLH5ODnAoIBAEYBE1pJfGt41lSWvxsZrwfd3Va2LKv4CIiJTAtyBsDOTVMQ\nLx0Bu9reoDo08dP3URE/JeoBY7L2Ygn/qMGnhTgAzRND6tazNkta//SWyVzKJqcZ\nJz6AvXNHH83Hj/g+YR2sHpJukYDS2zyybx/PN2uUSD5V4jW6NPQ+Y/3lJ/u63ZdT\nKS7h9oddek0zx366aCTwqqIx2VAIAKNYQav+/5TWYGkoVeLo7/VoI7DRh/Ju9nk0\nd25vKTBOeg19KYTD0AjMZ939fVOdvA6tsDQ9OydeM4cD8SkCs1fEHayU4H8wGXNF\nrgdVOIFpqB23zaH+MOx39OAaMtTafUmuPHW4oOUCggEAe/jm70cvh+UlOl0Ib4ry\nlVXU3nYXGdSL5GJCi6bNRi3KQ7MrgCSdOMK/H1pYNw0MfdvElffejn/56FfA03IC\nRZOX2xuINyoaNfOGJ0Bps9i3uIJNah52iCgyMsi7I+chF9QkeR8jrdW6XMI/VNHa\n1ozl2fxaaiAtuM7kTnn5AKb3O/eoslD2q6yRrrUlZNWfmwqRc0T3gTxqcdqSmQ2Z\nWNQo+ZKFRU/LDXHYgvzPNtwylljIy3vcsrS84v1LxnuEP9P4NrE0K0/VORttSFdu\npvehZfLPSDdJ47CWNPrlwNqYhcjsHGbupX/9U9CIUykyqpk4PzhTjW0z9WPyPRs8\niwKCAQEAsQRYdefBm/lYil70rlHvgxOvoCf8wTy6kiUTHFMZWUcbPB9+5C8HRRVu\nkg+QTFn502H6gZhs3VkzpE4y1tClOe0s0HAfdBNfjP1Kk8i54hYOUzu0RAlOg4t+\nDcUBSmeXgXbYtzKLb2WqifTjOtuBYD515vOtcIM/19EaAMeccH0yWcvWDwFJu0jN\n6DXUPTwIetMnmui5X1oFVgu9XDdXmhC7mFvMtaADHhh37hNqDlKDYpHQMMEJT/cT\nWJvTCDK6nLkAYltPwehV74v2BEVknk0GHP1IcCLOjv6v3c1kt0TPZtnUr8pIfZGi\nM8nPgza9amAhHxA8xPQgBs3l8d6k3w==\n-----END PRIVATE KEY-----\n"
  },
  {
    "path": "examples/pokemon-service/Cargo.toml",
    "content": "[package]\nname = \"pokemon-service\"\nversion = \"0.1.0\"\nedition = \"2021\"\npublish = false\nauthors = [\"Smithy-rs Server Team <smithy-rs-server@amazon.com>\"]\ndescription = \"A smithy Rust service to retrieve information about Pokémon.\"\nrust-version = \"1.88\"\n\n[dependencies]\nclap = { version = \"4\", features = [\"derive\"] }\nhttp = \"1\"\nhyper = { version = \"1\", features = [\"server\"] }\nhyper-util = { version = \"0.1\", features = [\n    \"tokio\",\n    \"server\",\n    \"server-auto\",\n    \"service\",\n] }\ntokio = { version = \"1.26.0\", features = [\"rt-multi-thread\", \"macros\"] }\ntower = \"0.4\"\ntracing = \"0.1\"\ntracing-appender = \"0.2\"\n\n# Pinning to MSRV 1.88.0 supported versions\nmetrique = { version = \"0.1.17\", features = [\"emf\"] }\nmetrique-writer = \"0.1.17\"\n\n# Local paths\npokemon-service-server-sdk = { path = \"../pokemon-service-server-sdk/\", features = [\n    \"request-id\",\n] }\npokemon-service-common = { path = \"../pokemon-service-common/\" }\naws-smithy-http-server-metrics = { path = \"../../rust-runtime/aws-smithy-http-server-metrics\" }\naws-smithy-http-server = { path = \"../../rust-runtime/aws-smithy-http-server\" }\n\n[dev-dependencies]\nassert_cmd = \"2.0\"\nasync-stream = \"0.3\"\nbytes = \"1\"\nhttp-body-util = \"0.1\"\ninsta = { version = \"1\", features = [\"filters\"] }\nmetrique = { version = \"0.1\", features = [\"test-util\"] }\nrand = \"0.8.5\"\nserial_test = \"3.1.1\"\nfutures-util = \"0.3\"\n\n# We use hyper client in tests\nhyper = { version = \"1\", features = [\"server\", \"client\"] }\nhyper-util = { version = \"0.1\", features = [\n    \"client\",\n    \"client-legacy\",\n    \"http1\",\n    \"http2\",\n] }\n\n# This dependency is only required for testing the `pokemon-service-tls` program.\nhyper-rustls = { version = \"0.27\", features = [\"http2\"] }\n\n# Local paths\naws-smithy-runtime = { path = \"../../rust-runtime/aws-smithy-runtime\" }\naws-smithy-http = { path = \"../../rust-runtime/aws-smithy-http/\" }\npokemon-service-client = { path = \"../pokemon-service-client/\", features = [\n    \"behavior-version-latest\",\n] }\n"
  },
  {
    "path": "examples/pokemon-service/cargo",
    "content": ""
  },
  {
    "path": "examples/pokemon-service/src/authz.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! This file showcases a rather minimal model plugin that is agnostic over the operation that it\n//! is applied to.\n//!\n//! It is interesting because it is not trivial to figure out how to write one. As the\n//! documentation for [`aws_smithy_http_server::plugin::ModelMarker`] calls out, most model\n//! plugins' implementation are _operation-specific_, which are simpler.\n\nuse std::{marker::PhantomData, pin::Pin};\n\nuse pokemon_service_server_sdk::server::{\n    body::BoxBody,\n    operation::OperationShape,\n    plugin::{ModelMarker, Plugin},\n    response::IntoResponse,\n};\nuse tower::Service;\n\npub struct AuthorizationPlugin {\n    // Private so that users are forced to use the `new` constructor.\n    _private: (),\n}\n\nimpl AuthorizationPlugin {\n    pub fn new() -> Self {\n        Self { _private: () }\n    }\n}\n\n/// `T` is the inner service this plugin is applied to.\n/// See the documentation for [`Plugin`] for details.\nimpl<Ser, Op, T> Plugin<Ser, Op, T> for AuthorizationPlugin {\n    type Output = AuthorizeService<Op, T>;\n\n    fn apply(&self, input: T) -> Self::Output {\n        AuthorizeService {\n            inner: input,\n            authorizer: Authorizer::new(),\n        }\n    }\n}\n\nimpl ModelMarker for AuthorizationPlugin {}\n\npub struct AuthorizeService<Op, S> {\n    inner: S,\n    authorizer: Authorizer<Op>,\n}\n\n/// We manually implement `Clone` instead of adding `#[derive(Clone)]` because we don't require\n/// `Op` to be cloneable.\nimpl<Op, S> Clone for AuthorizeService<Op, S>\nwhere\n    S: Clone,\n{\n    fn clone(&self) -> Self {\n        Self {\n            inner: self.inner.clone(),\n            authorizer: self.authorizer.clone(),\n        }\n    }\n}\n\n/// The error returned by [`AuthorizeService`].\npub enum AuthorizeServiceError<E> {\n    /// Authorization was successful, but the inner service yielded an error.\n    InnerServiceError(E),\n    /// Authorization was not successful.\n    AuthorizeError { message: String },\n}\n\n// Only the _outermost_ model plugin needs to apply a `Service` whose error type implements\n// `IntoResponse` for the protocol the service uses (this requirement comes from the `Service`\n// implementation of [`aws_smithy_http_server::operation::Upgrade`]). So if the model plugin is\n// meant to be applied in any position, and to any Smithy service, one should implement\n// `IntoResponse` for all protocols.\n//\n// Having model plugins apply a `Service` that has a `Service::Response` type or a `Service::Error`\n// type that is different from those returned by the inner service hence diminishes the reusability\n// of the plugin because it makes the plugin less composable. Most plugins should instead work with\n// the inner service's types, and _at most_ require that those be `Op::Input` and `Op::Error`, for\n// maximum composability:\n//\n// ```\n// ...\n// where\n//     S: Service<(Op::Input, ($($var,)*)), Error = Op::Error>\n//     ...\n// {\n//     type Response = S::Response;\n//     type Error = S::Error;\n//     type Future = Pin<Box<dyn Future<Output = Result<S::Response, S::Error>> + Send>>;\n// }\n//\n// ```\n//\n// This plugin still exemplifies how changing a type can be done to make it more interesting.\n\nimpl<P, E> IntoResponse<P> for AuthorizeServiceError<E>\nwhere\n    E: IntoResponse<P>,\n{\n    fn into_response(self) -> http::Response<BoxBody> {\n        match self {\n            AuthorizeServiceError::InnerServiceError(e) => e.into_response(),\n            AuthorizeServiceError::AuthorizeError { message } => http::Response::builder()\n                .status(http::StatusCode::UNAUTHORIZED)\n                .body(pokemon_service_server_sdk::server::body::to_boxed(message))\n                .expect(\"attempted to build an invalid HTTP response; please file a bug report\"),\n        }\n    }\n}\n\nmacro_rules! impl_service {\n    ($($var:ident),*) => {\n        impl<S, Op, $($var,)*> Service<(Op::Input, ($($var,)*))> for AuthorizeService<Op, S>\n        where\n            S: Service<(Op::Input, ($($var,)*)), Error = Op::Error> + Clone + Send + 'static,\n            S::Future: Send,\n            Op: OperationShape + Send + Sync + 'static,\n            Op::Input: Send + Sync + 'static,\n            $($var: Send + 'static,)*\n        {\n            type Response = S::Response;\n            type Error = AuthorizeServiceError<Op::Error>;\n            type Future =\n                Pin<Box<dyn std::future::Future<Output = Result<S::Response, Self::Error>> + Send>>;\n\n            fn poll_ready(\n                &mut self,\n                cx: &mut std::task::Context<'_>,\n            ) -> std::task::Poll<Result<(), Self::Error>> {\n                self.inner\n                    .poll_ready(cx)\n                    .map_err(|e| Self::Error::InnerServiceError(e))\n            }\n\n            fn call(&mut self, req: (Op::Input, ($($var,)*))) -> Self::Future {\n                let (input, exts) = req;\n\n                // Replacing the service is necessary to avoid readiness problems.\n                // https://docs.rs/tower/latest/tower/trait.Service.html#be-careful-when-cloning-inner-services\n                let service = self.inner.clone();\n                let mut service = std::mem::replace(&mut self.inner, service);\n\n                let authorizer = self.authorizer.clone();\n\n                let fut = async move {\n                    let is_authorized = authorizer.authorize(&input).await;\n                    if !is_authorized {\n                        return Err(Self::Error::AuthorizeError {\n                            message: \"Not authorized!\".to_owned(),\n                        });\n                    }\n\n                    service\n                        .call((input, exts))\n                        .await\n                        .map_err(|e| Self::Error::InnerServiceError(e))\n                };\n                Box::pin(fut)\n            }\n        }\n    };\n}\n\nstruct Authorizer<Op> {\n    operation: PhantomData<Op>,\n}\n\n/// We manually implement `Clone` instead of adding `#[derive(Clone)]` because we don't require\n/// `Op` to be cloneable.\nimpl<Op> Clone for Authorizer<Op> {\n    fn clone(&self) -> Self {\n        Self {\n            operation: PhantomData,\n        }\n    }\n}\n\nimpl<Op> Authorizer<Op> {\n    fn new() -> Self {\n        Self {\n            operation: PhantomData,\n        }\n    }\n\n    async fn authorize(&self, _input: &Op::Input) -> bool\n    where\n        Op: OperationShape,\n    {\n        // We'd perform the actual authorization here.\n        // We would likely need to add bounds on `Op::Input`, `Op::Error`, if we wanted to do\n        // anything useful.\n        true\n    }\n}\n\n// If we want our plugin to be as reusable as possible, the service it applies should work with\n// inner services (i.e. operation handlers) that take a variable number of parameters. A Rust macro\n// is helpful in providing those implementations concisely.\n// Each handler function registered must accept the operation's input type (if there is one).\n// Additionally, it can take up to 7 different parameters, each of which must implement the\n// `FromParts` trait. To ensure that this `AuthorizeService` works with any of those inner\n// services, we must implement it to handle up to\n// 7 different types. Therefore, we invoke the `impl_service` macro 8 times.\n\nimpl_service!();\nimpl_service!(T1);\nimpl_service!(T1, T2);\nimpl_service!(T1, T2, T3);\nimpl_service!(T1, T2, T3, T4);\nimpl_service!(T1, T2, T3, T4, T5);\nimpl_service!(T1, T2, T3, T4, T5, T6);\nimpl_service!(T1, T2, T3, T4, T5, T6, T7);\n"
  },
  {
    "path": "examples/pokemon-service/src/lib.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::net::IpAddr;\nuse std::net::SocketAddr;\n\nuse aws_smithy_http_server_metrics::operation::Metrics;\nuse pokemon_service_common::metrics::PokemonOperationMetrics;\nuse pokemon_service_server_sdk::error::GetStorageError;\nuse pokemon_service_server_sdk::error::StorageAccessNotAuthorized;\nuse pokemon_service_server_sdk::input::DoNothingInput;\nuse pokemon_service_server_sdk::input::GetStorageInput;\nuse pokemon_service_server_sdk::output::DoNothingOutput;\nuse pokemon_service_server_sdk::output::GetStorageOutput;\nuse pokemon_service_server_sdk::server::request::connect_info::ConnectInfo;\nuse pokemon_service_server_sdk::server::request::request_id::ServerRequestId;\n\n// Defaults shared between `main.rs` and `/tests`.\npub const DEFAULT_ADDRESS: &str = \"127.0.0.1\";\npub const DEFAULT_PORT: u16 = 13734;\n\n/// Logs the request IDs to `DoNothing` operation.\npub async fn do_nothing_but_log_request_ids(\n    _input: DoNothingInput,\n    request_id: ServerRequestId,\n) -> DoNothingOutput {\n    tracing::debug!(%request_id, \"do nothing\");\n    DoNothingOutput {}\n}\n\n/// Retrieves the user's storage. No authentication required for locals.\npub async fn get_storage_with_local_approved(\n    input: GetStorageInput,\n    connect_info: ConnectInfo<SocketAddr>,\n    mut metrics: Metrics<PokemonOperationMetrics>,\n) -> Result<GetStorageOutput, GetStorageError> {\n    tracing::debug!(\"attempting to authenticate storage user\");\n\n    let authenticated = input.user == \"ash\" && input.passcode == \"pikachu123\";\n    metrics.get_storage_metrics.user = Some(input.user.clone());\n    metrics.get_storage_metrics.authenticated = Some(authenticated);\n\n    if !authenticated {\n        tracing::debug!(\"authentication failed\");\n        return Err(GetStorageError::StorageAccessNotAuthorized(\n            StorageAccessNotAuthorized {},\n        ));\n    }\n\n    // We support trainers in our local gym\n    let local = connect_info.0.ip() == \"127.0.0.1\".parse::<IpAddr>().unwrap();\n    if local {\n        tracing::info!(\"welcome back\");\n        return Ok(GetStorageOutput {\n            collection: vec![\n                String::from(\"bulbasaur\"),\n                String::from(\"charmander\"),\n                String::from(\"squirtle\"),\n                String::from(\"pikachu\"),\n            ],\n        });\n    }\n\n    Ok(GetStorageOutput {\n        collection: vec![String::from(\"pikachu\")],\n    })\n}\n"
  },
  {
    "path": "examples/pokemon-service/src/main.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nmod authz;\nmod plugin;\n\nuse std::net::SocketAddr;\nuse std::sync::Arc;\n\nuse aws_smithy_http_server_metrics::DefaultMetricsPlugin;\nuse aws_smithy_http_server_metrics::MetricsLayer;\nuse clap::Parser;\n\nuse metrique_writer::stream::tee;\nuse metrique_writer::GlobalEntrySink;\nuse pokemon_service_server_sdk::serve;\nuse pokemon_service_server_sdk::server::extension::OperationExtensionExt;\nuse pokemon_service_server_sdk::server::instrumentation::InstrumentExt;\nuse pokemon_service_server_sdk::server::layer::alb_health_check::AlbHealthCheckLayer;\nuse pokemon_service_server_sdk::server::plugin::HttpPlugins;\nuse pokemon_service_server_sdk::server::plugin::ModelPlugins;\nuse pokemon_service_server_sdk::server::plugin::Scoped;\nuse pokemon_service_server_sdk::server::request::request_id::ServerRequestIdProviderLayer;\nuse pokemon_service_server_sdk::server::routing::IntoMakeServiceWithConnectInfo;\nuse pokemon_service_server_sdk::server::AddExtensionLayer;\nuse tokio::net::TcpListener;\n\nuse http::StatusCode;\nuse plugin::PrintExt;\n\nuse metrique::emf::Emf;\nuse metrique::writer::sink::AttachHandle;\nuse metrique::writer::AttachGlobalEntrySinkExt;\nuse metrique::writer::FormatExt;\nuse metrique::ServiceMetrics;\nuse pokemon_service::do_nothing_but_log_request_ids;\nuse pokemon_service::get_storage_with_local_approved;\nuse pokemon_service::DEFAULT_ADDRESS;\nuse pokemon_service::DEFAULT_PORT;\nuse pokemon_service_common::capture_pokemon;\nuse pokemon_service_common::check_health;\nuse pokemon_service_common::get_pokemon_species;\nuse pokemon_service_common::get_server_statistics;\nuse pokemon_service_common::metrics::PokemonMetrics;\nuse pokemon_service_common::metrics::PokemonMetricsBuildExt;\nuse pokemon_service_common::setup_tracing;\nuse pokemon_service_common::stream_pokemon_radio;\nuse pokemon_service_common::State;\nuse pokemon_service_server_sdk::scope;\nuse pokemon_service_server_sdk::PokemonService;\nuse pokemon_service_server_sdk::PokemonServiceConfig;\nuse tower::Layer;\n\nuse crate::authz::AuthorizationPlugin;\n\n#[derive(Parser, Debug)]\n#[clap(author, version, about, long_about = None)]\nstruct Args {\n    /// Hyper server bind address.\n    #[clap(short, long, action, default_value = DEFAULT_ADDRESS)]\n    address: String,\n    /// Hyper server bind port.\n    #[clap(short, long, action, default_value_t = DEFAULT_PORT)]\n    port: u16,\n    /// Optional TCP address to send metrics to (for testing)\n    #[clap(long)]\n    metrics_tcp: Option<String>,\n}\n\n#[tokio::main]\npub async fn main() {\n    let args = Args::parse();\n    setup_tracing();\n\n    let _metrics_handle = setup_metrics(args.metrics_tcp.as_deref());\n\n    scope! {\n        /// A scope containing `GetPokemonSpecies` and `GetStorage`.\n        struct PrintScope {\n            includes: [GetPokemonSpecies, GetStorage]\n        }\n    }\n\n    // Scope the `PrintPlugin`, defined in `plugin.rs`, to `PrintScope`.\n    let print_plugin = Scoped::new::<PrintScope>(HttpPlugins::new().print());\n\n    let http_plugins = HttpPlugins::new()\n        // Apply the `DefaultMetricsPlugin` first\n        .push(DefaultMetricsPlugin)\n        // Apply the scoped `PrintPlugin`\n        .push(print_plugin)\n        // Apply the `OperationExtensionPlugin` defined in `aws_smithy_http_server::extension`. This allows other\n        // plugins or tests to access a `aws_smithy_http_server::extension::OperationExtension` from\n        // `Response::extensions`, or infer routing failure when it's missing.\n        .insert_operation_extension()\n        // Adds `tracing` spans and events to the request lifecycle.\n        .instrument();\n\n    let authz_plugin = AuthorizationPlugin::new();\n    let model_plugins = ModelPlugins::new().push(authz_plugin);\n\n    let config = PokemonServiceConfig::builder()\n        // Set up shared state and middlewares.\n        .layer(AddExtensionLayer::new(Arc::new(State::default())))\n        // Handle `/ping` health check requests.\n        .layer(AlbHealthCheckLayer::from_handler(\"/ping\", |_req| async {\n            StatusCode::OK\n        }))\n        // Add server request IDs.\n        .layer(ServerRequestIdProviderLayer::new())\n        .http_plugin(http_plugins)\n        .model_plugin(model_plugins)\n        .build();\n\n    let app = PokemonService::builder(config)\n        // Build a registry containing implementations to all the operations in the service. These\n        // are async functions or async closures that take as input the operation's input and\n        // return the operation's output.\n        .get_pokemon_species(get_pokemon_species)\n        .get_storage(get_storage_with_local_approved)\n        .get_server_statistics(get_server_statistics)\n        .capture_pokemon(capture_pokemon)\n        .do_nothing(do_nothing_but_log_request_ids)\n        .check_health(check_health)\n        .stream_pokemon_radio(stream_pokemon_radio)\n        .build()\n        .expect(\"failed to build an instance of PokemonService\");\n\n    let metrics_layer = MetricsLayer::builder()\n        .init_metrics(|_req| {\n            let mut metrics = PokemonMetrics::default();\n            metrics.request_metrics.test_request_metric = Some(\"test request metric\".to_string());\n\n            metrics.append_on_drop(ServiceMetrics::sink())\n        })\n        .response_metrics(|_res, metrics| {\n            metrics.response_metrics.test_response_metric =\n                Some(\"test response metric\".to_string());\n        })\n        .build();\n\n    let service = metrics_layer.layer(app);\n\n    // Using `IntoMakeServiceWithConnectInfo`, rather than `into_make_service`, to adjoin the `SocketAddr`\n    // connection info.\n    let make_app = IntoMakeServiceWithConnectInfo::<_, SocketAddr>::new(service);\n\n    // Bind the application to a socket.\n    let bind: SocketAddr = format!(\"{}:{}\", args.address, args.port)\n        .parse()\n        .expect(\"unable to parse the server bind address and port\");\n    let listener = TcpListener::bind(bind)\n        .await\n        .expect(\"failed to bind TCP listener\");\n\n    // Get the actual bound address (important when port 0 is used for random port)\n    let actual_addr = listener.local_addr().expect(\"failed to get local address\");\n\n    // Signal that the server is ready to accept connections, including the actual port\n    eprintln!(\"SERVER_READY:{}\", actual_addr.port());\n\n    // Run forever-ish...\n    if let Err(err) = serve(listener, make_app).await {\n        eprintln!(\"server error: {err}\");\n    }\n}\n\npub(crate) fn setup_metrics(metrics_tcp: Option<&str>) -> AttachHandle {\n    let std_out_emf = Emf::builder(\"Ns\".to_string(), vec![vec![]])\n        .build()\n        .output_to_makewriter(|| std::io::stdout().lock());\n\n    if let Some(addr) = metrics_tcp {\n        let stream =\n            std::net::TcpStream::connect(addr).expect(\"Failed to connect to metrics TCP address\");\n        let tcp_emf = Emf::builder(\"Ns\".to_string(), vec![vec![]])\n            .build()\n            .output_to(stream);\n        ServiceMetrics::attach_to_stream(tee(std_out_emf, tcp_emf))\n    } else {\n        ServiceMetrics::attach_to_stream(std_out_emf)\n    }\n}\n"
  },
  {
    "path": "examples/pokemon-service/src/plugin.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Provides an example [`Plugin`] implementation - [`PrintPlugin`].\n\nuse pokemon_service_server_sdk::server::{\n    operation::OperationShape,\n    plugin::{HttpMarker, HttpPlugins, Plugin, PluginStack},\n    service::ServiceShape,\n    shape_id::ShapeId,\n};\nuse tower::Service;\n\nuse std::task::{Context, Poll};\n\n/// A [`Service`] that prints a given string.\n#[derive(Clone, Debug)]\npub struct PrintService<S> {\n    inner: S,\n    operation_id: ShapeId,\n    service_id: ShapeId,\n}\n\nimpl<R, S> Service<R> for PrintService<S>\nwhere\n    S: Service<R>,\n{\n    type Response = S::Response;\n    type Error = S::Error;\n    type Future = S::Future;\n\n    fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {\n        self.inner.poll_ready(cx)\n    }\n\n    fn call(&mut self, req: R) -> Self::Future {\n        println!(\n            \"Hi {} in {}\",\n            self.operation_id.absolute(),\n            self.service_id.absolute()\n        );\n        self.inner.call(req)\n    }\n}\n/// A [`Plugin`] for a service builder to add a [`PrintLayer`] over operations.\n#[derive(Debug)]\npub struct PrintPlugin;\n\nimpl<Ser, Op, T> Plugin<Ser, Op, T> for PrintPlugin\nwhere\n    Ser: ServiceShape,\n    Op: OperationShape,\n{\n    type Output = PrintService<T>;\n\n    fn apply(&self, inner: T) -> Self::Output {\n        PrintService {\n            inner,\n            operation_id: Op::ID,\n            service_id: Ser::ID,\n        }\n    }\n}\n\nimpl HttpMarker for PrintPlugin {}\n\n/// This provides a [`print`](PrintExt::print) method on [`HttpPlugins`].\npub trait PrintExt<CurrentPlugin> {\n    /// Causes all operations to print the operation name when called.\n    ///\n    /// This works by applying the [`PrintPlugin`].\n    fn print(self) -> HttpPlugins<PluginStack<PrintPlugin, CurrentPlugin>>;\n}\n\nimpl<CurrentPlugin> PrintExt<CurrentPlugin> for HttpPlugins<CurrentPlugin> {\n    fn print(self) -> HttpPlugins<PluginStack<PrintPlugin, CurrentPlugin>> {\n        self.push(PrintPlugin)\n    }\n}\n"
  },
  {
    "path": "examples/pokemon-service/tests/common/mod.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::io::BufRead;\nuse std::io::BufReader;\nuse std::process::Command;\nuse std::process::Stdio;\nuse std::time::Duration;\n\nuse tokio::time::timeout;\n\nuse pokemon_service::DEFAULT_ADDRESS;\nuse pokemon_service_client::Client;\nuse pokemon_service_client::Config;\nuse pokemon_service_common::ChildDrop;\n\npub struct ServerHandle {\n    pub child: ChildDrop,\n    pub port: u16,\n}\n\npub async fn run_server() -> ServerHandle {\n    let mut child = Command::new(assert_cmd::cargo::cargo_bin!(\"pokemon-service\"))\n        .args([\"--port\", \"0\"]) // Use port 0 for random available port\n        .stderr(Stdio::piped())\n        .spawn()\n        .unwrap();\n\n    // Wait for the server to signal it's ready by reading stderr\n    let stderr = child.stderr.take().unwrap();\n    let ready_signal = tokio::task::spawn_blocking(move || {\n        let reader = BufReader::new(stderr);\n        for line in reader.lines() {\n            if let Ok(line) = line {\n                if let Some(port_str) = line.strip_prefix(\"SERVER_READY:\") {\n                    if let Ok(port) = port_str.parse::<u16>() {\n                        return Some(port);\n                    }\n                }\n            }\n        }\n        None\n    });\n\n    // Wait for the ready signal with a timeout\n    let port = match timeout(Duration::from_secs(5), ready_signal).await {\n        Ok(Ok(Some(port))) => port,\n        _ => {\n            panic!(\"Server did not become ready within 5 seconds\");\n        }\n    };\n\n    ServerHandle {\n        child: ChildDrop(child),\n        port,\n    }\n}\n\npub async fn run_server_with_metrics_tcp(tcp_addr: &str) -> ServerHandle {\n    let mut child = Command::new(assert_cmd::cargo::cargo_bin!(\"pokemon-service\"))\n        .args([\"--port\", \"0\", \"--metrics-tcp\", tcp_addr])\n        .stderr(Stdio::piped())\n        .spawn()\n        .unwrap();\n\n    // Wait for the server to signal it's ready by reading stderr\n    let stderr = child.stderr.take().unwrap();\n    let ready_signal = tokio::task::spawn_blocking(move || {\n        let reader = BufReader::new(stderr);\n        for line in reader.lines() {\n            if let Ok(line) = line {\n                if let Some(port_str) = line.strip_prefix(\"SERVER_READY:\") {\n                    if let Ok(port) = port_str.parse::<u16>() {\n                        return Some(port);\n                    }\n                }\n            }\n        }\n        None\n    });\n\n    // Wait for the ready signal with a timeout\n    let port = match timeout(Duration::from_secs(5), ready_signal).await {\n        Ok(Ok(Some(port))) => port,\n        _ => {\n            panic!(\"Server did not become ready within 5 seconds\");\n        }\n    };\n\n    ServerHandle {\n        child: ChildDrop(child),\n        port,\n    }\n}\n\npub fn base_url(port: u16) -> String {\n    format!(\"http://{DEFAULT_ADDRESS}:{port}\")\n}\n\npub fn client(port: u16) -> Client {\n    let config = Config::builder()\n        .endpoint_url(format!(\"http://{DEFAULT_ADDRESS}:{port}\"))\n        .build();\n    Client::from_conf(config)\n}\n"
  },
  {
    "path": "examples/pokemon-service/tests/event_streaming.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npub mod common;\n\nuse async_stream::stream;\nuse rand::Rng;\n\nuse pokemon_service_client::types::{\n    error::{AttemptCapturingPokemonEventError, MasterBallUnsuccessful},\n    AttemptCapturingPokemonEvent, CapturingEvent, CapturingPayload,\n};\n\nfn get_pokemon_to_capture() -> String {\n    let pokemons = vec![\"Charizard\", \"Pikachu\", \"Regieleki\"];\n    pokemons[rand::thread_rng().gen_range(0..pokemons.len())].to_string()\n}\n\nfn get_pokeball() -> String {\n    let random = rand::thread_rng().gen_range(0..100);\n    let pokeball = if random < 5 {\n        \"Master Ball\"\n    } else if random < 30 {\n        \"Great Ball\"\n    } else if random < 80 {\n        \"Fast Ball\"\n    } else {\n        \"Smithy Ball\"\n    };\n    pokeball.to_string()\n}\n\n#[tokio::test]\nasync fn event_stream_test() {\n    let server = common::run_server().await;\n    let client = common::client(server.port);\n\n    let mut team = vec![];\n    let input_stream = stream! {\n        // Always Pikachu\n        yield Ok(AttemptCapturingPokemonEvent::Event(\n            CapturingEvent::builder()\n            .payload(CapturingPayload::builder()\n                .name(\"Pikachu\")\n                .pokeball(\"Master Ball\")\n                .build())\n            .build()\n        ));\n        yield Ok(AttemptCapturingPokemonEvent::Event(\n            CapturingEvent::builder()\n            .payload(CapturingPayload::builder()\n                .name(\"Regieleki\")\n                .pokeball(\"Fast Ball\")\n                .build())\n            .build()\n        ));\n        yield Err(AttemptCapturingPokemonEventError::MasterBallUnsuccessful(MasterBallUnsuccessful::builder().build()));\n        // The next event should not happen\n        yield Ok(AttemptCapturingPokemonEvent::Event(\n            CapturingEvent::builder()\n            .payload(CapturingPayload::builder()\n                .name(\"Charizard\")\n                .pokeball(\"Great Ball\")\n                .build())\n            .build()\n        ));\n    };\n\n    // Throw many!\n    let mut output = common::client(server.port)\n        .capture_pokemon()\n        .region(\"Kanto\")\n        .events(input_stream.into())\n        .send()\n        .await\n        .unwrap();\n    loop {\n        match output.events.recv().await {\n            Ok(Some(capture)) => {\n                let pokemon = capture.as_event().unwrap().name.as_ref().unwrap().clone();\n                let pokedex = capture\n                    .as_event()\n                    .unwrap()\n                    .pokedex_update\n                    .as_ref()\n                    .unwrap()\n                    .clone();\n                let shiny = if *capture.as_event().unwrap().shiny.as_ref().unwrap() {\n                    \"\"\n                } else {\n                    \"not \"\n                };\n                let expected_pokedex: Vec<u8> = (0..255).collect();\n                println!(\"captured {} ({}shiny)\", pokemon, shiny);\n                if expected_pokedex == pokedex.into_inner() {\n                    println!(\"pokedex updated\")\n                }\n                team.push(pokemon);\n            }\n            Err(e) => {\n                println!(\"error from the server: {:?}\", e);\n                break;\n            }\n            Ok(None) => break,\n        }\n    }\n\n    while team.len() < 6 {\n        let pokeball = get_pokeball();\n        let pokemon = get_pokemon_to_capture();\n        let input_stream = stream! {\n            yield Ok(AttemptCapturingPokemonEvent::Event(\n                CapturingEvent::builder()\n                .payload(CapturingPayload::builder()\n                    .name(pokemon)\n                    .pokeball(pokeball)\n                    .build())\n                .build()\n            ))\n        };\n        let mut output = client\n            .capture_pokemon()\n            .region(\"Kanto\")\n            .events(input_stream.into())\n            .send()\n            .await\n            .unwrap();\n        match output.events.recv().await {\n            Ok(Some(capture)) => {\n                let pokemon = capture.as_event().unwrap().name.as_ref().unwrap().clone();\n                let pokedex = capture\n                    .as_event()\n                    .unwrap()\n                    .pokedex_update\n                    .as_ref()\n                    .unwrap()\n                    .clone();\n                let shiny = if *capture.as_event().unwrap().shiny.as_ref().unwrap() {\n                    \"\"\n                } else {\n                    \"not \"\n                };\n                let expected_pokedex: Vec<u8> = (0..255).collect();\n                println!(\"captured {} ({}shiny)\", pokemon, shiny);\n                if expected_pokedex == pokedex.into_inner() {\n                    println!(\"pokedex updated\")\n                }\n                team.push(pokemon);\n            }\n            Err(e) => {\n                println!(\"error from the server: {:?}\", e);\n                break;\n            }\n            Ok(None) => {}\n        }\n    }\n    println!(\"Team: {:?}\", team);\n}\n"
  },
  {
    "path": "examples/pokemon-service/tests/metrics_test.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse pokemon_service_client::Client;\nuse serial_test::serial;\nuse std::sync::Arc;\nuse std::sync::Mutex;\nuse tokio::io::AsyncReadExt;\nuse tokio::net::TcpListener;\nuse tokio::time::Duration;\n\npub mod common;\n\n/// E2E integration tests for aws_smithy_http_server_metrics using the pokemon service\n#[tokio::test]\n#[serial]\nasync fn test_metrics_content_via_tcp() {\n    // Start TCP listener to receive metrics\n    let listener = tokio::net::TcpListener::bind(\"127.0.0.1:0\").await.unwrap();\n    let addr = listener.local_addr().unwrap();\n\n    // Spawn a task to collect metrics into the buffer\n    let metrics_buffer = Arc::new(Mutex::new(Vec::new()));\n    spawn_metrics_collection_task(listener, Arc::clone(&metrics_buffer)).await;\n\n    // Start server with metrics TCP address\n    let server = common::run_server_with_metrics_tcp(&addr.to_string()).await;\n    let client = common::client(server.port);\n\n    send_requests(client).await;\n\n    // Poll for the metrics with a timeout of 5 seconds\n    let expected_metrics_count = 3;\n    let timeout = Duration::from_secs(5);\n    let metrics_output = poll_for_metrics(metrics_buffer, expected_metrics_count, timeout).await;\n\n    assert!(\n        !metrics_output.is_empty(),\n        \"Expected metrics to be captured\"\n    );\n\n    insta::with_settings!({filters => vec![\n        (r#\"\"Timestamp\":\\d+\"#, r#\"\"Timestamp\":\"[timestamp]\"#),\n        (r#\"\"operation_time\":[\\d.]+\"#, r#\"\"operation_time\":\"[operation_time]\"#),\n        (r#\"\"request_id\":\"[0-9a-f-]+\"\"#, r#\"\"request_id\":\"[request_id]\"#),\n    ]}, {\n        insta::assert_snapshot!(metrics_output);\n    });\n}\n\nasync fn spawn_metrics_collection_task(listener: TcpListener, metrics_buffer: Arc<Mutex<Vec<u8>>>) {\n    tokio::spawn(async move {\n        while let Ok((mut socket, _)) = listener.accept().await {\n            let mut buf = vec![0u8; 8192];\n            while let Ok(n) = socket.read(&mut buf).await {\n                if n == 0 {\n                    break;\n                }\n                metrics_buffer.lock().unwrap().extend_from_slice(&buf[..n]);\n            }\n        }\n    });\n}\n\nasync fn send_requests(client: Client) {\n    // Send a successful request\n    let _ = client.get_pokemon_species().name(\"pikachu\").send().await;\n\n    // Send a request with an invalid password to get a 400 level error\n    let _ = client\n        .get_storage()\n        .user(\"ash\")\n        .passcode(\"pkachu123\")\n        .send()\n        .await;\n\n    // Send a request with an invalid region to get 500 level error\n    let events =\n        aws_smithy_http::event_stream::EventStreamSender::from(futures_util::stream::empty());\n    let _ = client\n        .capture_pokemon()\n        .region(\"trigger500\")\n        .events(events)\n        .send()\n        .await;\n}\n\nasync fn poll_for_metrics(\n    metrics_buffer: Arc<Mutex<Vec<u8>>>,\n    expected_metrics_count: usize,\n    timeout: Duration,\n) -> String {\n    let start = tokio::time::Instant::now();\n\n    let mut found_metrics_count = 0;\n    loop {\n        let buffer_data = metrics_buffer.lock().unwrap().clone();\n        if !buffer_data.is_empty() {\n            let output = String::from_utf8_lossy(&buffer_data);\n            found_metrics_count = output.lines().filter(|l| !l.is_empty()).count();\n            if found_metrics_count == expected_metrics_count {\n                break;\n            } else if found_metrics_count > expected_metrics_count {\n                panic!(\"Found more metrics entries than expected, found {found_metrics_count}, expected {expected_metrics_count}\");\n            }\n        }\n\n        if start.elapsed() > timeout {\n            panic!(\"Timeout waiting for expected number of metrics entries, found {found_metrics_count} after {} seconds, expected {expected_metrics_count}\", timeout.as_secs());\n        }\n\n        tokio::time::sleep(tokio::time::Duration::from_millis(50)).await;\n    }\n\n    // Parse metrics as JSON lines (EMF format)\n    String::from_utf8(metrics_buffer.lock().unwrap().clone()).unwrap()\n}\n"
  },
  {
    "path": "examples/pokemon-service/tests/simple.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse bytes;\nuse http_body_util;\nuse hyper_util::{client::legacy::Client, rt::TokioExecutor};\nuse pokemon_service_client::{\n    error::{DisplayErrorContext, SdkError},\n    operation::get_storage::GetStorageError,\n    types::error::StorageAccessNotAuthorized,\n};\n\npub mod common;\n\n#[tokio::test]\nasync fn simple_integration_test() {\n    let server = common::run_server().await;\n    let client = common::client(server.port);\n\n    let service_statistics_out = client.get_server_statistics().send().await.unwrap();\n    assert_eq!(0, service_statistics_out.calls_count);\n\n    let pokemon_species_output = client\n        .get_pokemon_species()\n        .name(\"pikachu\")\n        .send()\n        .await\n        .unwrap();\n    assert_eq!(\"pikachu\", pokemon_species_output.name());\n\n    let service_statistics_out = client.get_server_statistics().send().await.unwrap();\n    assert_eq!(1, service_statistics_out.calls_count);\n\n    let storage_err = client\n        .get_storage()\n        .user(\"ash\")\n        .passcode(\"pikachu321\")\n        .send()\n        .await;\n    let has_not_authorized_error = if let Err(SdkError::ServiceError(context)) = storage_err {\n        matches!(\n            context.err(),\n            GetStorageError::StorageAccessNotAuthorized(StorageAccessNotAuthorized { .. }),\n        )\n    } else {\n        false\n    };\n    assert!(has_not_authorized_error, \"expected NotAuthorized error\");\n\n    let storage_out = client\n        .get_storage()\n        .user(\"ash\")\n        .passcode(\"pikachu123\")\n        .send()\n        .await\n        .unwrap();\n    assert_eq!(\n        vec![\n            \"bulbasaur\".to_string(),\n            \"charmander\".to_string(),\n            \"squirtle\".to_string(),\n            \"pikachu\".to_string()\n        ],\n        storage_out.collection\n    );\n\n    let pokemon_species_error = client\n        .get_pokemon_species()\n        .name(\"some_pokémon\")\n        .send()\n        .await\n        .unwrap_err();\n    let message = DisplayErrorContext(pokemon_species_error).to_string();\n    let expected =\n        r#\"ResourceNotFoundError [ResourceNotFoundException]: Requested Pokémon not available\"#;\n    assert!(\n        message.contains(expected),\n        \"expected '{message}' to contain '{expected}'\"\n    );\n\n    let service_statistics_out = client.get_server_statistics().send().await.unwrap();\n    assert_eq!(2, service_statistics_out.calls_count);\n\n    let hyper_client = Client::builder(TokioExecutor::new()).build_http();\n    let health_check_url = format!(\"{}/ping\", common::base_url(server.port));\n    let health_check_url = hyper::Uri::try_from(health_check_url).unwrap();\n    let request = hyper::Request::builder()\n        .uri(health_check_url)\n        .body(http_body_util::Empty::<bytes::Bytes>::new())\n        .unwrap();\n    let result = hyper_client.request(request).await.unwrap();\n\n    assert_eq!(result.status(), 200);\n}\n\n#[tokio::test]\nasync fn health_check() {\n    let server = common::run_server().await;\n\n    let url = common::base_url(server.port) + \"/ping\";\n    let uri = url.parse::<hyper::Uri>().expect(\"invalid URL\");\n\n    // Since the `/ping` route is not modeled in Smithy, we use a regular\n    // Hyper HTTP client to make a request to it.\n    let request = hyper::Request::builder()\n        .uri(uri)\n        .body(http_body_util::Empty::<bytes::Bytes>::new())\n        .expect(\"failed to build request\");\n\n    let client = Client::builder(TokioExecutor::new()).build_http();\n    let response = client\n        .request(request)\n        .await\n        .expect(\"failed to get response\");\n\n    assert_eq!(response.status(), hyper::StatusCode::OK);\n    let body = http_body_util::BodyExt::collect(response.into_body())\n        .await\n        .expect(\"failed to read response body\")\n        .to_bytes();\n    assert!(body.is_empty());\n}\n"
  },
  {
    "path": "examples/pokemon-service/tests/snapshots/metrics_test__metrics_content_via_tcp.snap",
    "content": "---\nsource: pokemon-service/tests/metrics_test.rs\nexpression: metrics_output\n---\n{\"_aws\":{\"CloudWatchMetrics\":[{\"Namespace\":\"Ns\",\"Dimensions\":[[]],\"Metrics\":[{\"Name\":\"found\"},{\"Name\":\"outstanding_requests\"},{\"Name\":\"success\"},{\"Name\":\"client_error\"},{\"Name\":\"server_error\"},{\"Name\":\"operation_time\",\"Unit\":\"Milliseconds\"}]}],\"Timestamp\":\"[timestamp]},\"found\":1,\"outstanding_requests\":1,\"success\":1,\"client_error\":0,\"server_error\":0,\"operation_time\":\"[operation_time],\"test_request_metric\":\"test request metric\",\"test_response_metric\":\"test response metric\",\"requested_pokemon_name\":\"pikachu\",\"service\":\"PokemonService\",\"service_version\":\"2024-03-18\",\"operation\":\"GetPokemonSpecies\",\"request_id\":\"[request_id],\"http_status_code\":\"200\"}\n{\"_aws\":{\"CloudWatchMetrics\":[{\"Namespace\":\"Ns\",\"Dimensions\":[[]],\"Metrics\":[{\"Name\":\"authenticated\"},{\"Name\":\"outstanding_requests\"},{\"Name\":\"success\"},{\"Name\":\"client_error\"},{\"Name\":\"server_error\"},{\"Name\":\"operation_time\",\"Unit\":\"Milliseconds\"}]}],\"Timestamp\":\"[timestamp]},\"authenticated\":0,\"outstanding_requests\":1,\"success\":0,\"client_error\":1,\"server_error\":0,\"operation_time\":\"[operation_time],\"test_request_metric\":\"test request metric\",\"test_response_metric\":\"test response metric\",\"user\":\"ash\",\"service\":\"PokemonService\",\"service_version\":\"2024-03-18\",\"operation\":\"GetStorage\",\"request_id\":\"[request_id],\"http_status_code\":\"401\"}\n{\"_aws\":{\"CloudWatchMetrics\":[{\"Namespace\":\"Ns\",\"Dimensions\":[[]],\"Metrics\":[{\"Name\":\"supported_region\"},{\"Name\":\"outstanding_requests\"},{\"Name\":\"success\"},{\"Name\":\"client_error\"},{\"Name\":\"server_error\"},{\"Name\":\"operation_time\",\"Unit\":\"Milliseconds\"}]}],\"Timestamp\":\"[timestamp]},\"supported_region\":0,\"outstanding_requests\":1,\"success\":0,\"client_error\":0,\"server_error\":1,\"operation_time\":\"[operation_time],\"test_request_metric\":\"test request metric\",\"test_response_metric\":\"test response metric\",\"requested_region\":\"trigger500\",\"service\":\"PokemonService\",\"service_version\":\"2024-03-18\",\"operation\":\"CapturePokemon\",\"request_id\":\"[request_id],\"http_status_code\":\"500\"}\n"
  },
  {
    "path": "examples/pokemon-service-client-usage/Cargo.toml",
    "content": "[package]\nname = \"pokemon-service-client-usage\"\nversion = \"0.1.0\"\nedition = \"2021\"\npublish = false\n\n[features]\n\n\n[dependencies]\n# The generated client utilizes types defined in other crates, such as `aws_smithy_types`\n# and `aws_smithy_http`. However, most of these types are re-exported by the generated client,\n# eliminating the need to directly depend on the crates that provide them. In rare instances,\n# you may still need to include one of these crates as a dependency. Examples that require this\n# are specifically noted in comments above the corresponding dependency in this file.\npokemon-service-client = { path = \"../pokemon-service-client/\", features = [\"behavior-version-latest\"] }\n\n# Required for `Storable` and `StoreReplace` in `response-header-interceptor` example.\naws-smithy-types = { path = \"../../rust-runtime/aws-smithy-types/\" }\n\n# Required for `Builder` in `client-connector` example.\naws-smithy-http-client = { path = \"../../rust-runtime/aws-smithy-http-client/\", features=[\"default-client\", \"rustls-aws-lc\"] }\n\n# Required for test utilities in examples.\naws-smithy-runtime = { path = \"../../rust-runtime/aws-smithy-runtime/\", features=[\"test-util\"] }\n\n# Required for `Metadata` in `custom-header-using-interceptor` example.\naws-smithy-runtime-api = { path = \"../../rust-runtime/aws-smithy-runtime-api/\", features=[\"client\"] }\n\n\nhyper = { version = \"1\", features = [\"client\", \"http1\", \"http2\"] }\nhyper-util = { version = \"0.1\", features = [\"client\", \"client-legacy\", \"http1\", \"http2\"] }\ntokio = {version = \"1.26.0\", features=[\"full\"]}\ntracing = \"0.1.37\"\ntracing-subscriber = { version = \"0.3.17\", features = [\"env-filter\"] }\nrustls = \"0.23\"\nhyper-rustls = \"0.27\"\nhttp = \"1\"\nuuid = {version=\"1.4.1\", features = [\"v4\"]}\nthiserror = \"1.0.49\"\n"
  },
  {
    "path": "examples/pokemon-service-client-usage/README.md",
    "content": "# smithy-rs Client Examples\n\nThis package contains some examples on how to use the Smithy Client to communicate\nwith a Smithy-based service.\n\n## Pre-requisites\n\n1. Build the `pokemon-service-client` and `pokemon-service` by invoking `make` in the\n   [examples](https://github.com/smithy-lang/smithy-rs/tree/main/examples) folder.\n\n```console\nmake\n```\n\n2. Run the Pokemon service locally by issuing the following command from the\n   [examples](https://github.com/smithy-lang/smithy-rs/tree/main/examples) folder. This\n   will launch the Smithy-Rs based service on TCP port 13734.\n\n```console\ncargo run --bin pokemon-service\n```\n\n## Running the examples\n\nYou can view a list of examples by running `cargo run --example` from the\n[pokemon-service-client-usage](https://github.com/smithy-lang/smithy-rs/tree/main/examples/pokemon-service-client-usage)\nfolder. To run an example, pass its name to the `cargo run --example` command, e.g.:\n\n```console\ncargo run --example simple-client\n```\n\n## List of examples\n\n| Rust Example                   | Description                                                             |\n|--------------------------------|-------------------------------------------------------------------------|\n| simple-client                  | Creates a Smithy Client and calls an operation on it.                   |\n| endpoint-resolver              | How to set a custom endpoint resolver.                                  |\n| handling-errors                | How to send an input parameter to an operation, and to handle errors.   |\n| custom-header                  | How to add headers to a request.                                        |\n| custom-header-using-interceptor| How to access operation name being called in an interceptor.            |\n| response-header-interceptor    | How to get operation name and access response before it is deserialized.|\n| use-config-bag                 | How to use the property bag to pass data across interceptors.           |\n| retries-customize              | Customize retry settings.                                               |\n| retries-disable                | How to disable retries.                                                 |\n| timeout-config                 | How to configure timeouts.                                              |\n| mock-request                   | Use a custom HttpConnector / Client to generate mock responses.         |\n| trace-serialize                | Trace request and response as they are serialized / deserialized.       |\n| client-connector               | Shows how to change TLS related configuration.                          |\n"
  },
  {
    "path": "examples/pokemon-service-client-usage/examples/client-connector.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n/// This example demonstrates how to set connector settings. For example, how to set\n/// trusted root certificates to use for HTTPs communication.\n///\n/// The example assumes that the Pokémon service is running on the localhost on TCP port 13734.\n/// Refer to the [README.md](https://github.com/smithy-lang/smithy-rs/tree/main/examples/pokemon-service-client-usage/README.md)\n/// file for instructions on how to launch the service locally.\n///\n/// The example can be run using `cargo run --example client-connector`.\n///\nuse aws_smithy_http_client::{tls, Builder};\nuse pokemon_service_client::Client as PokemonClient;\nuse pokemon_service_client_usage::{setup_tracing_subscriber, POKEMON_SERVICE_URL};\n\n/// Creates a new `smithy-rs` client that is configured to communicate with a locally running Pokémon\n/// service on TCP port 13734.\n///\n/// # Examples\n///\n/// Basic usage:\n/// ```\n/// let client = create_client();\n/// ```\nfn create_client() -> PokemonClient {\n    // Create a TLS context that loads platform trusted root certificates.\n    // The TrustStore::default() enables native roots by default.\n    let tls_context = tls::TlsContext::builder()\n        .with_trust_store(tls::TrustStore::default())\n        .build()\n        .expect(\"failed to build TLS context\");\n\n    // Create an HTTP client using rustls with AWS-LC crypto provider.\n    // To use client side certificates, you would need to customize the TLS config further.\n    let http_client = Builder::new()\n        .tls_provider(tls::Provider::Rustls(\n            tls::rustls_provider::CryptoMode::AwsLc,\n        ))\n        .tls_context(tls_context)\n        .build_https();\n\n    // Pass the smithy connector to the Client::ConfigBuilder\n    let config = pokemon_service_client::Config::builder()\n        .endpoint_url(POKEMON_SERVICE_URL)\n        .http_client(http_client)\n        .build();\n\n    // Instantiate a client by applying the configuration.\n    pokemon_service_client::Client::from_conf(config)\n}\n\n#[tokio::main]\nasync fn main() {\n    setup_tracing_subscriber();\n\n    // Create a configured `smithy-rs` client.\n    let client = create_client();\n\n    // Call an operation `get_server_statistics` on the Pokémon service.\n    let response = client\n        .get_server_statistics()\n        .send()\n        .await\n        .expect(\"operation failed\");\n\n    tracing::info!(?response, \"Response from service\")\n}\n"
  },
  {
    "path": "examples/pokemon-service-client-usage/examples/custom-header-using-interceptor.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n/// In this example, a custom header `x-amzn-client-ttl-seconds` is set for all outgoing requests.\n/// It serves as a demonstration of how an operation name can be retrieved and utilized within\n/// the interceptor.\n///\n/// The example assumes that the Pokémon service is running on the localhost on TCP port 13734.\n/// Refer to the [README.md](https://github.com/smithy-lang/smithy-rs/tree/main/examples/pokemon-service-client-usage/README.md)\n/// file for instructions on how to launch the service locally.\n///\n/// The example can be run using `cargo run --example custom-header-using-interceptor`.\n///\nuse std::{collections::HashMap, time::Duration};\n\nuse aws_smithy_runtime_api::client::orchestrator::Metadata;\nuse pokemon_service_client::config::{ConfigBag, Intercept};\nuse pokemon_service_client::Client as PokemonClient;\nuse pokemon_service_client::{\n    config::{interceptors::BeforeTransmitInterceptorContextMut, RuntimeComponents},\n    error::BoxError,\n};\nuse pokemon_service_client_usage::{setup_tracing_subscriber, POKEMON_SERVICE_URL};\n\n// The `TtlHeaderInterceptor` keeps a map of operation specific value to send\n// in the header for each Request.\n#[derive(Debug)]\npub struct TtlHeaderInterceptor {\n    /// Default time-to-live for an operation.\n    default_ttl: hyper::http::HeaderValue,\n    /// Operation specific time-to-live.\n    operation_ttl: HashMap<&'static str, hyper::http::HeaderValue>,\n}\n\n// Helper function to format duration as fractional seconds.\nfn format_ttl_value(ttl: Duration) -> String {\n    format!(\"{:.2}\", ttl.as_secs_f64())\n}\n\nimpl TtlHeaderInterceptor {\n    fn new(default_ttl: Duration) -> Self {\n        let duration_str = format_ttl_value(default_ttl);\n        let default_ttl_value = hyper::http::HeaderValue::from_str(duration_str.as_str())\n            .expect(\"could not create a header value for the default ttl\");\n\n        Self {\n            default_ttl: default_ttl_value,\n            operation_ttl: Default::default(),\n        }\n    }\n\n    /// Adds an operation name specific timeout value that needs to be set in the header.\n    fn add_operation_ttl(&mut self, operation_name: &'static str, ttl: Duration) {\n        let duration_str = format_ttl_value(ttl);\n\n        self.operation_ttl.insert(\n            operation_name,\n            hyper::http::HeaderValue::from_str(duration_str.as_str())\n                .expect(\"cannot create header value for the given ttl duration\"),\n        );\n    }\n}\n\n/// Appends the header `x-amzn-client-ttl-seconds` using either the default time-to-live value\n/// or an operation-specific value if it was set earlier using `add_operation_ttl`.\n//impl aws_smithy_runtime_api::client::interceptors::Interceptor for TtlHeaderInterceptor {\nimpl Intercept for TtlHeaderInterceptor {\n    fn name(&self) -> &'static str {\n        \"TtlHeaderInterceptor\"\n    }\n\n    /// Before the request is signed, add the header to the outgoing request.\n    fn modify_before_signing(\n        &self,\n        context: &mut BeforeTransmitInterceptorContextMut<'_>,\n        _runtime_components: &RuntimeComponents,\n        cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        // Metadata in the ConfigBag has the operation name.\n        let metadata = cfg.load::<Metadata>().expect(\"metadata should exist\");\n        let operation_name = metadata.name();\n\n        // Get operation specific or default HeaderValue to set for the header key.\n        let ttl = self\n            .operation_ttl\n            .get(operation_name)\n            .unwrap_or(&self.default_ttl);\n\n        context\n            .request_mut()\n            .headers_mut()\n            .insert(\"x-amzn-client-ttl-seconds\", ttl.clone());\n\n        tracing::info!(\"{operation_name} header set to {ttl:?}\");\n\n        Ok(())\n    }\n}\n\n/// Creates a new `smithy-rs` client that is configured to communicate with a locally running Pokémon service on TCP port 13734.\n///\n/// # Examples\n///\n/// Basic usage:\n///\n/// ```\n/// let client = create_client();\n/// ```\nfn create_client() -> PokemonClient {\n    // By default set the value of all operations to 6 seconds.\n    const DEFAULT_TTL: Duration = Duration::from_secs(6);\n\n    // Set up the interceptor to add an operation specific value of 3.5 seconds to be added\n    // for GetStorage operation.\n    let mut ttl_headers_interceptor = TtlHeaderInterceptor::new(DEFAULT_TTL);\n    ttl_headers_interceptor.add_operation_ttl(\"GetStorage\", Duration::from_millis(3500));\n\n    // The generated client has a type `Config::Builder` that can be used to build a `Config`, which\n    // allows configuring endpoint-resolver, timeouts, retries etc.\n    let config = pokemon_service_client::Config::builder()\n        .endpoint_url(POKEMON_SERVICE_URL)\n        .interceptor(ttl_headers_interceptor)\n        .build();\n\n    pokemon_service_client::Client::from_conf(config)\n}\n\n#[tokio::main]\nasync fn main() {\n    setup_tracing_subscriber();\n\n    // Create a configured `smithy-rs` client.\n    let client = create_client();\n\n    // Call an operation `get_server_statistics` on the Pokémon service.\n    let response = client\n        .get_server_statistics()\n        .send()\n        .await\n        .expect(\"operation failed\");\n\n    tracing::info!(%POKEMON_SERVICE_URL, ?response, \"Response for get_server_statistics()\");\n\n    // Call the operation `get_storage` on the Pokémon service. The `TtlHeaderInterceptor`\n    // interceptor will add a specific header name / value pair for this operation.\n    let response = client\n        .get_storage()\n        .user(\"ash\")\n        .passcode(\"pikachu123\")\n        .send()\n        .await\n        .expect(\"operation failed\");\n\n    // Print the response received from the service.\n    tracing::info!(%POKEMON_SERVICE_URL, ?response, \"Response received\");\n}\n"
  },
  {
    "path": "examples/pokemon-service-client-usage/examples/custom-header.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n/// This example demonstrates how to create a `smithy-rs` client, and call an operation with custom\n/// headers in the request.\n///\n/// The example assumes that the Pokémon service is running on the localhost on TCP port 13734.\n/// Refer to the [README.md](https://github.com/smithy-lang/smithy-rs/tree/main/examples/pokemon-service-client-usage/README.md)\n/// file for instructions on how to launch the service locally.\n///\n/// The example can be run using `cargo run --example custom-header`\n///\nuse pokemon_service_client::Client as PokemonClient;\nuse pokemon_service_client_usage::{setup_tracing_subscriber, POKEMON_SERVICE_URL};\n\n/// Creates a new `smithy-rs` client that is configured to communicate with a locally running Pokémon\n/// service on TCP port 13734.\n///\n/// # Examples\n///\n/// Basic usage:\n///\n/// ```\n/// let client = create_client();\n/// ```\nfn create_client() -> PokemonClient {\n    // The generated client has a type `Config::Builder` that can be used to build a `Config`, which\n    // allows configuring endpoint-resolver, timeouts, retries etc.\n    let config = pokemon_service_client::Config::builder()\n        .endpoint_url(POKEMON_SERVICE_URL)\n        .build();\n\n    // Apply the configuration on the client, and return that.\n    pokemon_service_client::Client::from_conf(config)\n}\n\n#[tokio::main]\nasync fn main() {\n    setup_tracing_subscriber();\n\n    // Create a configured `smithy-rs` client.\n    let client = create_client();\n\n    // Call an operation `get_server_statistics` on the Pokémon service.\n    let response = client\n        .get_server_statistics()\n        .customize()\n        .mutate_request(|req| {\n            // For demonstration purposes, add a header `x-ttl-seconds` to the outgoing request.\n            let headers = req.headers_mut();\n            headers.insert(\n                hyper::header::HeaderName::from_static(\"x-ttl-seconds\"),\n                hyper::header::HeaderValue::from(30),\n            );\n        })\n        .send()\n        .await\n        .expect(\"operation failed\");\n\n    tracing::info!(%POKEMON_SERVICE_URL, ?response, \"Response received\");\n}\n"
  },
  {
    "path": "examples/pokemon-service-client-usage/examples/endpoint-resolver.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n/// This example demonstrates how a custom `ResolveEndpoint` can be implemented for resolving\n/// endpoint of a request. Additionally, it shows how a header can be added using the endpoint\n/// builder.\n///\n/// The example assumes that the Pokémon service is running on the localhost on TCP port 13734.\n/// Refer to the [README.md](https://github.com/smithy-lang/smithy-rs/tree/main/examples/pokemon-service-client-usage/README.md)\n/// file for instructions on how to launch the service locally.\n///\n/// The example can be run using `cargo run --example endpoint-resolver`.\n///\nuse pokemon_service_client::config::endpoint::{Endpoint, EndpointFuture, Params, ResolveEndpoint};\nuse pokemon_service_client::primitives::{DateTime, DateTimeFormat};\nuse pokemon_service_client::Client as PokemonClient;\nuse pokemon_service_client_usage::setup_tracing_subscriber;\n\nuse std::time::SystemTime;\n\n// This struct, provided as an example, constructs the URL that should be set on each request during initialization.\n// It also implements the `ResolveEndpoint` trait, enabling it to be assigned as the endpoint_resolver in the `Config`.\n#[derive(Debug)]\nstruct RegionalEndpoint {\n    url_to_use: String,\n}\n\nimpl RegionalEndpoint {\n    fn new(regional_url: &str, port: u16) -> Self {\n        let url_to_use = format!(\"{}:{}\", regional_url, port);\n        RegionalEndpoint { url_to_use }\n    }\n}\n\nimpl ResolveEndpoint for RegionalEndpoint {\n    fn resolve_endpoint<'a>(&'a self, _params: &'a Params) -> EndpointFuture<'a> {\n        // Construct an endpoint using the Endpoint::Builder. Set the URL and,\n        // optionally, any headers to be sent with the request. For this example,\n        // we'll set the 'x-amz-date' header to the current date for all outgoing requests.\n        // `DateTime` can be used for formatting an RFC 3339 date time.\n        let now = SystemTime::now();\n        let date_time = DateTime::from(now);\n\n        let endpoint = Endpoint::builder()\n            .url(self.url_to_use.clone())\n            .header(\n                \"x-amz-date\",\n                date_time\n                    .fmt(DateTimeFormat::DateTimeWithOffset)\n                    .expect(\"Could not create a date in UTC format\"),\n            )\n            .build();\n        tracing::info!(?endpoint, \"Resolving endpoint\");\n        EndpointFuture::ready(Ok(endpoint))\n    }\n}\n\n/// Creates a new `smithy-rs` client that is configured to communicate with a locally running Pokémon service on TCP port 13734.\n///\n/// # Examples\n///\n/// Basic usage:\n///\n/// ```\n/// let client = create_client();\n/// ```\nfn create_client() -> PokemonClient {\n    const DEFAULT_PORT: u16 = 13734;\n\n    // Use the environment variable `REGIONAL_URL` for the URL.\n    let resolver = RegionalEndpoint::new(\n        std::env::var(\"REGIONAL_URL\")\n            .as_deref()\n            .unwrap_or(\"http://localhost\"),\n        DEFAULT_PORT,\n    );\n\n    let config = pokemon_service_client::Config::builder()\n        .endpoint_resolver(resolver)\n        .build();\n\n    // Apply the configuration on the client, and return that.\n    PokemonClient::from_conf(config)\n}\n\n#[tokio::main]\nasync fn main() {\n    setup_tracing_subscriber();\n\n    // Create a configured `smithy-rs` client.\n    let client = create_client();\n\n    // Call an operation `get_server_statistics` on the Pokémon service.\n    let response = client\n        .get_server_statistics()\n        .send()\n        .await\n        .expect(\"operation failed\");\n\n    tracing::info!(?response, \"Response received\");\n}\n"
  },
  {
    "path": "examples/pokemon-service-client-usage/examples/handling-errors.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! This example demonstrates how to handle service generated errors.\n//!\n//! The example assumes that the Pokémon service is running on the localhost on TCP port 13734.\n//! Refer to the [README.md](https://github.com/smithy-lang/smithy-rs/tree/main/examples/pokemon-service-client-usage/README.md)\n//! file for instructions on how to launch the service locally.\n//!\n//! The example can be run using `cargo run --example handling-errors`.\n\nuse pokemon_service_client::error::DisplayErrorContext;\nuse pokemon_service_client::Client as PokemonClient;\nuse pokemon_service_client::{error::SdkError, operation::get_storage::GetStorageError};\nuse pokemon_service_client_usage::{setup_tracing_subscriber, POKEMON_SERVICE_URL};\n\n/// Creates a new `smithy-rs` client that is configured to communicate with a locally running Pokémon service on TCP port 13734.\n///\n/// # Examples\n///\n/// Basic usage:\n///\n/// ```\n/// let client = create_client();\n/// ```\nfn create_client() -> PokemonClient {\n    // The generated client has a type `Config::Builder` that can be used to build a `Config`, which\n    // allows configuring endpoint-resolver, timeouts, retries etc.\n    let config = pokemon_service_client::Config::builder()\n        .endpoint_url(POKEMON_SERVICE_URL)\n        .build();\n\n    // Apply the configuration on the client, and return that.\n    PokemonClient::from_conf(config)\n}\n\n#[tokio::main]\nasync fn main() {\n    setup_tracing_subscriber();\n\n    // Create a configured `smithy-rs` client.\n    let client = create_client();\n\n    // The following example sends an incorrect passcode to the operation `get_storage`,\n    // which will return\n    // [StorageAccessNotAuthorized](https://github.com/smithy-lang/smithy-rs/blob/main/codegen-core/common-test-models/pokemon.smithy#L48)\n    let response_result = client\n        .get_storage()\n        .user(\"ash\")\n        // Give a wrong password to generate a service error.\n        .passcode(\"pkachu123\")\n        .send()\n        .await;\n\n    // All errors are consolidated into an `SdkError<T, R>`\n    match response_result {\n        Ok(response) => {\n            tracing::info!(?response, \"Response from service\")\n        }\n        Err(SdkError::ServiceError(se)) => {\n            // When an error response is received from the service, it is modeled\n            // as a `SdkError::ServiceError`.\n            match se.err() {\n                // Not authorized to access Pokémon storage.\n                GetStorageError::StorageAccessNotAuthorized(_) => {\n                    tracing::error!(\"You do not have access to this resource.\");\n                }\n                GetStorageError::ResourceNotFoundError(rnfe) => {\n                    let message = rnfe.message();\n                    tracing::error!(error = %message,\n                        \"Given Pikachu does not exist on the server.\"\n                    )\n                }\n                GetStorageError::ValidationError(ve) => {\n                    tracing::error!(error = %ve, \"A required field has not been set.\");\n                }\n                // The SdkError is marked as `#[non_exhaustive]`. Therefore, a catch-all pattern is required to handle\n                // potential future variants introduced in SdkError.\n                _ => {\n                    tracing::error!(error = %DisplayErrorContext(se.err()), \"Some other error has occurred on the server\")\n                }\n            }\n        }\n        Err(SdkError::TimeoutError(_)) => {\n            tracing::error!(\"The request timed out and could not be completed\");\n        }\n        Err(SdkError::ResponseError(re)) => {\n            // Raw response received from the service can be retrieved using\n            // the `raw()` method.\n            tracing::error!(\n                \"An unparsable response was received. Raw response: {:?}\",\n                re.raw()\n            );\n        }\n        Err(sdk_error) => {\n            // To retrieve the `source()` of an error within the following match statements,\n            // we work with the parent `SdkError` type, as individual variants don't directly provide it.\n            // Converting the parent error to its source transfers ownership of the variable.\n            match sdk_error {\n                SdkError::DispatchFailure(ref failure) => {\n                    if failure.is_io() {\n                        tracing::error!(\"An I/O error occurred\");\n                    } else if failure.is_timeout() {\n                        tracing::error!(\"Request timed out\");\n                    } else if failure.is_user() {\n                        tracing::error!(\"An invalid HTTP request has been provided\");\n                    } else {\n                        tracing::error!(\"Some other dispatch error occurred.\");\n                    };\n\n                    if let Ok(source) = sdk_error.into_source() {\n                        tracing::error!(%source, \"Error source\");\n                    }\n                }\n                SdkError::ConstructionFailure(_) => {\n                    if let Ok(source) = sdk_error.into_source() {\n                        tracing::error!(%source, \"Request could not be constructed.\");\n                    } else {\n                        tracing::error!(\"Request could not be constructed for unknown reasons\");\n                    }\n                }\n                _ => {\n                    tracing::error!(\"An unknown error has occurred\");\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "examples/pokemon-service-client-usage/examples/mock-request.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n/// This example demonstrates how to use a mock connector with `capture_request`. This allows for\n/// responding with a static `Response` while capturing the incoming request. The captured request\n/// can later be asserted to verify that the correct headers and body were sent to the server.\n///\n/// The example assumes that the Pokémon service is running on the localhost on TCP port 13734.\n/// Refer to the [README.md](https://github.com/smithy-lang/smithy-rs/tree/main/examples/pokemon-service-client-usage/README.md)\n/// file for instructions on how to launch the service locally.\n///\n/// The example can be run using `cargo run --example mock-request`.\n///\nuse aws_smithy_http_client::test_util::capture_request;\nuse pokemon_service_client::primitives::SdkBody;\nuse pokemon_service_client::Client as PokemonClient;\nuse pokemon_service_client_usage::{setup_tracing_subscriber, POKEMON_SERVICE_URL};\n\n#[tokio::main]\nasync fn main() {\n    setup_tracing_subscriber();\n\n    // Build a response that should be sent when the operation is called.\n    let response = http::Response::builder()\n        .status(200)\n        .body(SdkBody::from(r#\"{\"calls_count\":100}\"#))\n        .expect(\"response could not be constructed\");\n\n    // Call `capture_request` to obtain a HTTP connector and a request receiver.\n    // The request receiver captures the incoming request, while the connector can be passed\n    // to `Config::builder().http_client`.\n    let (http_client, captured_request) = capture_request(Some(response));\n\n    // Pass the `http_client` connector to `Config::builder`. The connector won't send\n    // the request over the network; instead, it will return the static response provided\n    // during its initialization.\n    let config = pokemon_service_client::Config::builder()\n        .endpoint_url(POKEMON_SERVICE_URL)\n        .http_client(http_client)\n        .build();\n\n    // Instantiate a client by applying the configuration.\n    let client = PokemonClient::from_conf(config);\n\n    // Call an operation `get_server_statistics` on the Pokémon service.\n    let response = client\n        .get_server_statistics()\n        .customize()\n        .mutate_request(|req| {\n            // For demonstration, send an extra header that can be verified to confirm\n            // that the client actually sends it.\n            let headers = req.headers_mut();\n            headers.insert(\n                hyper::header::HeaderName::from_static(\"user-agent\"),\n                hyper::header::HeaderName::from_static(\"sample-client\"),\n            );\n        })\n        .send()\n        .await\n        .expect(\"operation failed\");\n\n    // Print the response received from the service.\n    tracing::info!(%POKEMON_SERVICE_URL, ?response, \"Response received\");\n\n    // The captured request can be verified to have certain headers.\n    let req = captured_request.expect_request();\n    assert_eq!(req.headers().get(\"user-agent\"), Some(\"sample-client\"));\n\n    // As an example, you can verify the URL matches.\n    assert_eq!(req.uri(), \"http://localhost:13734/stats\");\n\n    // You can convert the captured body into a &str and use assert!\n    // on it if you want to verify the contents of the request body.\n    // let str_body = std::str::from_utf8(req.body().bytes().unwrap()).unwrap();\n}\n"
  },
  {
    "path": "examples/pokemon-service-client-usage/examples/response-header-interceptor.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nuse aws_smithy_runtime_api::client::orchestrator::Metadata;\n/// This example demonstrates how response headers can be examined before they are deserialized\n/// into the output type.\n///\n/// The example assumes that the Pokémon service is running on the localhost on TCP port 13734.\n/// Refer to the [README.md](https://github.com/smithy-lang/smithy-rs/tree/main/examples/pokemon-service-client-usage/README.md)\n/// file for instructions on how to launch the service locally.\n///\n/// The example can be run using `cargo run --example response-header-interceptor`.\n///\nuse aws_smithy_types::config_bag::{Storable, StoreReplace};\nuse pokemon_service_client::{\n    config::{\n        interceptors::{\n            BeforeDeserializationInterceptorContextRef, BeforeTransmitInterceptorContextMut,\n        },\n        ConfigBag, Intercept, RuntimeComponents,\n    },\n    error::BoxError,\n    Client as PokemonClient,\n};\nuse pokemon_service_client_usage::{setup_tracing_subscriber, POKEMON_SERVICE_URL};\nuse uuid::Uuid;\n\n#[derive(Debug, Clone)]\nstruct RequestId {\n    client_id: String,\n    server_id: Option<String>,\n}\n\nimpl Storable for RequestId {\n    type Storer = StoreReplace<Self>;\n}\n\n#[derive(Debug, thiserror::Error)]\nenum RequestIdError {\n    /// Client side\n    #[error(\"Client side request ID has not been set\")]\n    ClientRequestIdMissing(),\n}\n\n#[derive(Debug, Default)]\npub struct ResponseHeaderLoggingInterceptor;\n\nimpl ResponseHeaderLoggingInterceptor {\n    /// Creates a new `ResponseHeaderLoggingInterceptor`\n    pub fn new() -> Self {\n        Self::default()\n    }\n}\n\nimpl Intercept for ResponseHeaderLoggingInterceptor {\n    fn name(&self) -> &'static str {\n        \"ResponseHeaderLoggingInterceptor\"\n    }\n\n    /// Before the request is signed, add the header to the outgoing request.\n    fn modify_before_signing(\n        &self,\n        context: &mut BeforeTransmitInterceptorContextMut<'_>,\n        _runtime_components: &RuntimeComponents,\n        cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        let client_id = Uuid::new_v4().to_string();\n\n        let request_id = hyper::header::HeaderValue::from_str(&client_id)\n            .expect(\"failed to construct a header value from UUID\");\n        context\n            .request_mut()\n            .headers_mut()\n            .insert(\"x-amzn-requestid\", request_id);\n\n        cfg.interceptor_state().store_put(RequestId {\n            client_id,\n            server_id: None,\n        });\n\n        Ok(())\n    }\n\n    fn read_before_deserialization(\n        &self,\n        context: &BeforeDeserializationInterceptorContextRef<'_>,\n        _runtime_components: &RuntimeComponents,\n        cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        // `Metadata` in the `ConfigBag` has the operation name in it.\n        let metadata = cfg.load::<Metadata>().expect(\"metadata should exist\");\n        let operation_name = metadata.name().to_string();\n\n        // Get the server side request ID and set it in the RequestID data type\n        // that is in the ConfigBag. This way any other interceptor that requires the mapping\n        // can easily find it from the bag.\n        let response = context.response();\n        let header_received = response\n            .headers()\n            .iter()\n            .find(|(header_name, _)| *header_name == \"x-request-id\");\n\n        if let Some((_, server_id)) = header_received {\n            let request_details = cfg\n                .get_mut::<RequestId>()\n                .ok_or_else(|| Box::new(RequestIdError::ClientRequestIdMissing()))?;\n\n            tracing::info!(operation = %operation_name,\n                \"RequestID Mapping: {} = {server_id}\",\n                request_details.client_id,\n            );\n\n            request_details.server_id = Some(server_id.into());\n        } else {\n            tracing::info!(operation = %operation_name, \"Server RequestID missing in response\");\n        }\n\n        Ok(())\n    }\n}\n\n/// Creates a new `smithy-rs` client that is configured to communicate with a locally running Pokémon\n/// service on TCP port 13734.\n///\n/// # Examples\n///\n/// Basic usage:\n///\n/// ```\n/// let client = create_client();\n/// ```\nfn create_client() -> PokemonClient {\n    let config = pokemon_service_client::Config::builder()\n        .endpoint_url(POKEMON_SERVICE_URL)\n        .interceptor(ResponseHeaderLoggingInterceptor)\n        .build();\n\n    // Apply the configuration on the client, and return that.\n    PokemonClient::from_conf(config)\n}\n\n#[tokio::main]\nasync fn main() {\n    setup_tracing_subscriber();\n\n    // Create a configured `smithy-rs` client.\n    let client = create_client();\n\n    // Call an operation `get_server_statistics` on the Pokémon service.\n    let response = client\n        .get_server_statistics()\n        .send()\n        .await\n        .expect(\"operation failed\");\n\n    // If you need to access the `RequestIdError` raised by the interceptor,\n    // you can convert `SdkError::DispatchFailure` to a `ConnectorError`\n    // and then use `downcast_ref` on its source to get a `RequestIdError`.\n\n    tracing::info!(%POKEMON_SERVICE_URL, ?response, \"Response received\");\n}\n"
  },
  {
    "path": "examples/pokemon-service-client-usage/examples/retry-classifier.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n/// This example demonstrates how a custom RetryClassifier can be written to decide\n/// which error conditions should be retried.\n///\n/// The example assumes that the Pokémon service is running on the localhost on TCP port 13734.\n/// Refer to the [README.md](https://github.com/smithy-lang/smithy-rs/tree/main/examples/pokemon-service-client-usage/README.md)\n/// file for instructions on how to launch the service locally.\n///\n/// The example can be run using `cargo run --example retry-classifier`.\n///\nuse http::StatusCode;\nuse pokemon_service_client::{\n    config::{\n        interceptors::InterceptorContext,\n        retry::{ClassifyRetry, RetryAction, RetryConfig},\n    },\n    operation::get_server_statistics::GetServerStatisticsError,\n};\nuse pokemon_service_client_usage::{setup_tracing_subscriber, POKEMON_SERVICE_URL};\nuse std::time::Duration;\n\nuse pokemon_service_client::Client as PokemonClient;\n\n#[derive(Debug)]\nstruct SampleRetryClassifier;\n\n// By default, the generated client uses the `aws_http::retry::AwsResponseRetryClassifier`\n// to determine whether an error should be retried. To use a custom retry classifier,\n// implement the `ClassifyRetry` trait and pass it to the retry_classifier method\n// of the `Config::builder`.\nimpl ClassifyRetry for SampleRetryClassifier {\n    fn name(&self) -> &'static str {\n        \"SampleRetryClassifier\"\n    }\n\n    // For this example, the classifier should retry in case the error is GetServerStatisticsError\n    // and the status code is 503.\n    fn classify_retry(&self, ctx: &InterceptorContext) -> RetryAction {\n        // Get the output or error that has been deserialized from the response.\n        let output_or_error = ctx.output_or_error();\n\n        let error = match output_or_error {\n            Some(Ok(_)) | None => return RetryAction::NoActionIndicated,\n            Some(Err(err)) => err,\n        };\n\n        // Retry in case the error returned is GetServerStatisticsError and StatusCode is 503.\n        if let Some(_err) = error\n            .as_operation_error()\n            .and_then(|err| err.downcast_ref::<GetServerStatisticsError>())\n        {\n            if let Some(response) = ctx.response() {\n                if response.status() == StatusCode::SERVICE_UNAVAILABLE.into() {\n                    return RetryAction::server_error();\n                }\n            }\n        }\n\n        // Let other classifiers run and decide if the request should be retried.\n        // Returning RetryAction::RetryForbidden will forbid any retries.\n        RetryAction::NoActionIndicated\n    }\n}\n\n/// Creates a new `smithy-rs` client that is configured to communicate with a locally running Pokémon service on TCP port 13734.\n///\n/// # Examples\n///\n/// Basic usage:\n///\n/// ```\n/// let client = create_client();\n/// ```\nfn create_client() -> PokemonClient {\n    // By default the Smithy client uses RetryConfig::standard() strategy, with 3 retries, and\n    // an initial exponential back off of 1 second. To turn it off use RetryConfig::disabled().\n    let retry_config = RetryConfig::standard()\n        .with_initial_backoff(Duration::from_secs(3))\n        .with_max_attempts(5);\n\n    // The generated client has a type `Config::Builder` that can be used to build a `Config`, which\n    // allows configuring endpoint-resolver, timeouts, retries etc.\n    let config = pokemon_service_client::Config::builder()\n        .endpoint_url(POKEMON_SERVICE_URL)\n        .retry_config(retry_config)\n        // Add the retry classifier.\n        .retry_classifier(SampleRetryClassifier {})\n        .build();\n\n    // Apply the configuration on the client, and return that.\n    PokemonClient::from_conf(config)\n}\n\n#[tokio::main]\nasync fn main() {\n    setup_tracing_subscriber();\n\n    // Create a configured `smithy-rs` client.\n    let client = create_client();\n\n    // Call an operation `get_server_statistics` on the Pokémon service.\n    let response = client\n        .get_server_statistics()\n        .send()\n        .await\n        .expect(\"operation failed\");\n\n    tracing::info!(%POKEMON_SERVICE_URL, ?response, \"Response received\");\n}\n"
  },
  {
    "path": "examples/pokemon-service-client-usage/examples/retry-customize.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n/// This example demonstrates how to customize retry settings on a Smithy client.\n///\n/// The example assumes that the Pokémon service is running on the localhost on TCP port 13734.\n/// Refer to the [README.md](https://github.com/smithy-lang/smithy-rs/tree/main/examples/pokemon-service-client-usage/README.md)\n/// file for instructions on how to launch the service locally.\n///\n/// The example can be run using `cargo run --example retry-customize`.\n///\nuse pokemon_service_client_usage::{setup_tracing_subscriber, POKEMON_SERVICE_URL};\nuse std::time::Duration;\n\nuse pokemon_service_client::{config::retry::RetryConfig, Client as PokemonClient};\n\n/// Creates a new `smithy-rs` client that is configured to communicate with a locally running Pokémon service on TCP port 13734.\n///\n/// # Examples\n///\n/// Basic usage:\n///\n/// ```\n/// let client = create_client();\n/// ```\nfn create_client() -> PokemonClient {\n    // By default the Smithy client uses `RetryConfig::standard()` strategy, with 3 retries, and\n    // an initial exponential back off of 1 second. To turn it off use `RetryConfig::disabled()`.\n    let retry_config = RetryConfig::standard()\n        .with_initial_backoff(Duration::from_secs(3))\n        .with_max_attempts(5);\n\n    // The generated client has a type `Config::Builder` that can be used to build a `Config`, which\n    // allows configuring endpoint-resolver, timeouts, retries etc.\n    let config = pokemon_service_client::Config::builder()\n        .endpoint_url(POKEMON_SERVICE_URL)\n        .retry_config(retry_config)\n        .build();\n\n    // Apply the configuration on the client, and return that.\n    PokemonClient::from_conf(config)\n}\n\n#[tokio::main]\nasync fn main() {\n    setup_tracing_subscriber();\n\n    // Create a configured `smithy-rs` client.\n    let client = create_client();\n\n    // Call an operation `get_server_statistics` on the Pokémon service.\n    let response = client\n        .get_server_statistics()\n        .send()\n        .await\n        .expect(\"operation failed\");\n\n    tracing::info!(%POKEMON_SERVICE_URL, ?response, \"Response received\");\n}\n"
  },
  {
    "path": "examples/pokemon-service-client-usage/examples/simple-client.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n/// This example demonstrates how to create a `smithy-rs` Client and call an\n/// [operation](https://smithy.io/2.0/spec/idl.html?highlight=operation#operation-shape).\n///\n/// The example assumes that the Pokémon service is running on the localhost on TCP port 13734.\n/// Refer to the [README.md](https://github.com/smithy-lang/smithy-rs/tree/main/examples/pokemon-service-client-usage/README.md)\n/// file for instructions on how to launch the service locally.\n///\n/// The example can be run using `cargo run --example simple-client`.\n///\nuse pokemon_service_client::Client as PokemonClient;\nuse pokemon_service_client_usage::{setup_tracing_subscriber, POKEMON_SERVICE_URL};\n\n/// Creates a new `smithy-rs` client that is configured to communicate with a locally running Pokémon\n/// service on TCP port 13734.\n///\n/// # Examples\n///\n/// Basic usage:\n/// ```\n/// let client = create_client();\n/// ```\nfn create_client() -> PokemonClient {\n    // The generated client contains a type `config::Builder` for constructing a `Config` instance.\n    // This enables configuration of endpoint resolvers, timeouts, retries, etc.\n    let config = pokemon_service_client::Config::builder()\n        .endpoint_url(POKEMON_SERVICE_URL)\n        .build();\n\n    // Instantiate a client by applying the configuration.\n    PokemonClient::from_conf(config)\n}\n\n#[tokio::main]\nasync fn main() {\n    setup_tracing_subscriber();\n\n    // Create a configured `smithy-rs` client.\n    let client = create_client();\n\n    // Call an operation `get_server_statistics` on the Pokémon service.\n    let response = client\n        .get_server_statistics()\n        .send()\n        .await\n        .expect(\"operation failed\");\n\n    // Print the response received from the service.\n    tracing::info!(%POKEMON_SERVICE_URL, ?response, \"Response received\");\n}\n"
  },
  {
    "path": "examples/pokemon-service-client-usage/examples/timeout-config.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n/// This example demonstrates how to create a `smithy-rs` Client and set connection\n/// and operation related timeouts on the client.\n///\n/// The example assumes that the Pokémon service is running on the localhost on TCP port 13734.\n/// Refer to the [README.md](https://github.com/smithy-lang/smithy-rs/tree/main/examples/pokemon-service-client-usage/README.md)\n/// file for instructions on how to launch the service locally.\n///\n/// The example can be run using `cargo run --example timeout-config`\n///\nuse std::time::Duration;\n\nuse pokemon_service_client::{config::timeout::TimeoutConfig, Client as PokemonClient};\nuse pokemon_service_client_usage::{setup_tracing_subscriber, POKEMON_SERVICE_URL};\n\n/// Creates a new `smithy-rs` client that is configured to communicate with a locally running Pokémon service on TCP port 13734.\n///\n/// # Examples\n///\n/// Basic usage:\n///\n/// ```\n/// let client = create_client();\n/// ```\nfn create_client() -> PokemonClient {\n    // Different type of timeouts can be set on the client. These are:\n    // operation_attempt_timeout - If retries are enabled, this represents the timeout\n    //    for each individual operation attempt.\n    // operation_timeout - Overall timeout for the operation to complete.\n    // connect timeout - The amount of time allowed for a connection to be established.\n    let timeout_config = TimeoutConfig::builder()\n        .operation_attempt_timeout(Duration::from_secs(1))\n        .operation_timeout(Duration::from_secs(5))\n        .connect_timeout(Duration::from_millis(500))\n        .build();\n\n    let config = pokemon_service_client::Config::builder()\n        .endpoint_url(POKEMON_SERVICE_URL)\n        .timeout_config(timeout_config)\n        .build();\n\n    // Apply the configuration on the client, and return that.\n    PokemonClient::from_conf(config)\n}\n\n#[tokio::main]\nasync fn main() {\n    setup_tracing_subscriber();\n\n    // Create a configured `smithy-rs` client.\n    let client = create_client();\n\n    // Call an operation `get_server_statistics` on the Pokémon service.\n    let response = client\n        .get_server_statistics()\n        .send()\n        .await\n        .expect(\"Pokemon service does not seem to be running on localhost:13734\");\n\n    tracing::info!(%POKEMON_SERVICE_URL, ?response, \"Response received\");\n}\n"
  },
  {
    "path": "examples/pokemon-service-client-usage/examples/trace-serialize.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nuse aws_smithy_runtime::client::http::connection_poisoning::CaptureSmithyConnection;\n/// This example demonstrates how an interceptor can be written to trace what is being\n/// serialized / deserialized on the wire.\n///\n/// Please beware that this may log sensitive information! This example is meant for pedagogical\n/// purposes and may be useful in debugging scenarios. Please don't use this as-is in production.\n///\n/// The example assumes that the Pokémon service is running on the localhost on TCP port 13734.\n/// Refer to the [README.md](https://github.com/smithy-lang/smithy-rs/tree/main/examples/pokemon-service-client-usage/README.md)\n/// file for instructions on how to launch the service locally.\n///\n/// The example can be run using `cargo run --example trace-serialize`.\n///\nuse http::StatusCode;\nuse pokemon_service_client_usage::{setup_tracing_subscriber, POKEMON_SERVICE_URL};\nuse std::str;\n\nuse pokemon_service_client::{\n    config::{\n        interceptors::{\n            BeforeDeserializationInterceptorContextRef, BeforeTransmitInterceptorContextRef,\n        },\n        ConfigBag, Intercept, RuntimeComponents,\n    },\n    error::BoxError,\n    Client as PokemonClient,\n};\n\n/// An example interceptor that logs the request and response as they're sent and received.\n#[derive(Debug, Default)]\npub struct WireFormatInterceptor;\n\nimpl Intercept for WireFormatInterceptor {\n    fn name(&self) -> &'static str {\n        \"WireFormatInterceptor\"\n    }\n\n    // Called after the operation input has been serialized but before it's dispatched over the wire.\n    fn read_after_serialization(\n        &self,\n        context: &BeforeTransmitInterceptorContextRef<'_>,\n        _runtime_components: &RuntimeComponents,\n        _cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        // Get the request type from the context.\n        let request = context.request();\n        // Print the request to the debug tracing log.\n        tracing::debug!(?request);\n\n        Ok(())\n    }\n\n    // Called after the operation's response has been received but before it's deserialized into the\n    // operation's output type.\n    fn read_before_deserialization(\n        &self,\n        context: &BeforeDeserializationInterceptorContextRef<'_>,\n        _runtime_components: &RuntimeComponents,\n        cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        // Get the response type from the context.\n        let response = context.response();\n        // Print the response.\n        if response.status().as_u16() == StatusCode::OK.as_u16() {\n            tracing::info!(?response, \"Response received:\");\n        } else {\n            tracing::error!(?response);\n        }\n\n        // Print the connection information\n        let captured_connection = cfg.load::<CaptureSmithyConnection>().cloned();\n        if let Some(captured_connection) = captured_connection.and_then(|conn| conn.get()) {\n            tracing::info!(\n                remote_addr = ?captured_connection.remote_addr(),\n                local_addr = ?captured_connection.local_addr(),\n                \"Captured connection info\"\n            );\n        } else {\n            tracing::warn!(\"Connection info is missing!\");\n        }\n\n        Ok(())\n    }\n}\n\n/// Creates a new `smithy-rs` client that is configured to communicate with a locally running Pokémon service on TCP port 13734.\n///\n/// # Examples\n///\n/// Basic usage:\n///\n/// ```\n/// let client = create_client();\n/// ```\nfn create_client() -> PokemonClient {\n    // The generated client has a type `Config::Builder` that can be used to build a `Config`, which\n    // allows configuring endpoint-resolver, timeouts, retries etc.\n    let config = pokemon_service_client::Config::builder()\n        .endpoint_url(POKEMON_SERVICE_URL)\n        .interceptor(WireFormatInterceptor {})\n        .build();\n\n    // Apply the configuration on the client, and return that.\n    PokemonClient::from_conf(config)\n}\n\n#[tokio::main]\nasync fn main() {\n    setup_tracing_subscriber();\n\n    // Create a configured `smithy-rs` client.\n    let client = create_client();\n\n    // Call an operation `get_server_statistics` on the Pokémon service.\n    let response = client\n        .get_server_statistics()\n        .send()\n        .await\n        .expect(\"operation failed\");\n\n    tracing::info!(%POKEMON_SERVICE_URL, ?response, \"Response received\");\n}\n"
  },
  {
    "path": "examples/pokemon-service-client-usage/examples/use-config-bag.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n/// This example demonstrates how different interceptor can use a property bag to pass\n/// state from one interceptor to the next.\n///\n/// The example assumes that the Pokémon service is running on the localhost on TCP port 13734.\n/// Refer to the [README.md](https://github.com/smithy-lang/smithy-rs/tree/main/examples/pokemon-service-client-usage/README.md)\n/// file for instructions on how to launch the service locally.\n///\n/// The example can be run using `cargo run --example use-config-bag`.\n///\nuse aws_smithy_types::config_bag::{Storable, StoreReplace};\nuse pokemon_service_client_usage::{setup_tracing_subscriber, POKEMON_SERVICE_URL};\nuse std::time::Instant;\n\nuse pokemon_service_client::{\n    config::{\n        interceptors::{\n            BeforeDeserializationInterceptorContextRef, FinalizerInterceptorContextRef,\n        },\n        ConfigBag, Intercept, RuntimeComponents,\n    },\n    error::BoxError,\n    Client as PokemonClient,\n};\n\n#[derive(Debug)]\nstruct RequestTimestamp(Instant);\n\nimpl Storable for RequestTimestamp {\n    type Storer = StoreReplace<Self>;\n}\n\n#[derive(Debug, Default)]\npub struct SetTimeInterceptor;\n\n/// Note: This is merely an example demonstrating how state can\n/// be shared between two different interceptors. In a practical\n/// scenario, there wouldn't be a need to write two interceptors\n/// merely to display the duration from the start of the lifecycle\n/// to the receipt of the response. This task can be accomplished\n/// within a single interceptor by overriding both\n/// read_before_execution and read_before_deserialization.\nimpl Intercept for SetTimeInterceptor {\n    fn name(&self) -> &'static str {\n        \"SetTimeInterceptor\"\n    }\n\n    fn read_before_execution(\n        &self,\n        _context: &pokemon_service_client::config::interceptors::BeforeSerializationInterceptorContextRef<'_>,\n        cfg: &mut aws_smithy_types::config_bag::ConfigBag,\n    ) -> Result<(), pokemon_service_client::error::BoxError> {\n        cfg.interceptor_state()\n            .store_put(RequestTimestamp(Instant::now()));\n        Ok(())\n    }\n}\n\n#[derive(Debug, Default)]\npub struct GetTimeInterceptor;\n\nimpl Intercept for GetTimeInterceptor {\n    fn name(&self) -> &'static str {\n        \"GetTimeInterceptor\"\n    }\n\n    fn read_before_deserialization(\n        &self,\n        _context: &BeforeDeserializationInterceptorContextRef<'_>,\n        _runtime_components: &RuntimeComponents,\n        cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        let stop_watch = cfg\n            .load::<RequestTimestamp>()\n            .expect(\"StopWatch not found in the ConfigBag\");\n\n        let time_taken = stop_watch.0.elapsed();\n        tracing::info!(time_taken = %time_taken.as_micros(), \"Microseconds:\");\n\n        Ok(())\n    }\n\n    fn read_after_execution(\n        &self,\n        _context: &FinalizerInterceptorContextRef<'_>,\n        _runtime_components: &RuntimeComponents,\n        cfg: &mut ConfigBag,\n    ) -> Result<(), pokemon_service_client::error::BoxError> {\n        let timestamp = cfg\n            .load::<RequestTimestamp>()\n            .expect(\"RequestTimeStamp not found in the ConfigBag\");\n\n        let time_taken = timestamp.0.elapsed();\n        tracing::info!(time_taken = %time_taken.as_micros(), \"Microseconds:\");\n\n        Ok(())\n    }\n}\n\n/// Creates a new `smithy-rs` client that is configured to communicate with a locally running Pokémon service on TCP port 13734.\n///\n/// # Examples\n///\n/// Basic usage:\n///\n/// ```\n/// let client = create_client();\n/// ```\nfn create_client() -> PokemonClient {\n    // The generated client has a type `Config::Builder` that can be used to build a `Config`, which\n    // allows configuring endpoint-resolver, timeouts, retries etc.\n    let config = pokemon_service_client::Config::builder()\n        .endpoint_url(POKEMON_SERVICE_URL)\n        .interceptor(SetTimeInterceptor)\n        .interceptor(GetTimeInterceptor)\n        .build();\n\n    // Apply the configuration on the client, and return that.\n    PokemonClient::from_conf(config)\n}\n\n#[tokio::main]\nasync fn main() {\n    setup_tracing_subscriber();\n\n    // Create a configured `smithy-rs` client.\n    let client = create_client();\n\n    // Call an operation `get_server_statistics` on the Pokémon service.\n    let response = client\n        .get_server_statistics()\n        .send()\n        .await\n        .expect(\"Pokemon service does not seem to be running on localhost:13734\");\n\n    tracing::info!(%POKEMON_SERVICE_URL, ?response, \"Response received\");\n}\n"
  },
  {
    "path": "examples/pokemon-service-client-usage/src/lib.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\npub static POKEMON_SERVICE_URL: &str = \"http://localhost:13734\";\n\n/// Sets up the tracing subscriber to print `tracing::info!` and `tracing::error!` messages on the console.\npub fn setup_tracing_subscriber() {\n    // Add a tracing subscriber that uses the environment variable RUST_LOG\n    // to figure out which log level should be emitted. By default use `tracing::info!`\n    // as the logging level.\n    let filter = tracing_subscriber::EnvFilter::builder()\n        .with_default_directive(tracing_subscriber::filter::LevelFilter::INFO.into())\n        .from_env_lossy();\n\n    tracing_subscriber::fmt::fmt()\n        .with_env_filter(filter)\n        .init();\n}\n"
  },
  {
    "path": "examples/pokemon-service-common/Cargo.toml",
    "content": "[package]\nname = \"pokemon-service-common\"\nversion = \"0.1.0\"\nedition = \"2021\"\npublish = false\nauthors = [\"Smithy-rs Server Team <smithy-rs-server@amazon.com>\"]\ndescription = \"A smithy Rust service to retrieve information about Pokémon.\"\n\n[dependencies]\nasync-stream = \"0.3\"\nhttp = \"1\"\nrand = \"0.8\"\ntracing = \"0.1\"\ntracing-subscriber = { version = \"0.3.16\", features = [\"env-filter\", \"json\"] }\ntokio = { version = \"1\", default-features = false, features = [\"time\"] }\ntower = \"0.4\"\nmetrique = \"0.1.17\"\n\n# Local paths\naws-smithy-http-client = { path = \"../../rust-runtime/aws-smithy-http-client\", features = [\"rustls-aws-lc\"] }\naws-smithy-runtime = { path = \"../../rust-runtime/aws-smithy-runtime\", features = [\"client\", \"default-https-client\"] }\naws-smithy-http-server-metrics = { path = \"../../rust-runtime/aws-smithy-http-server-metrics\" }\naws-smithy-runtime-api = { path = \"../../rust-runtime/aws-smithy-runtime-api\", features = [\"client\"] }\npokemon-service-client = { path = \"../pokemon-service-client/\", features = [\n    \"behavior-version-latest\",\n] }\npokemon-service-server-sdk = { path = \"../pokemon-service-server-sdk\" }\n\n[dev-dependencies]\naws-smithy-runtime = { path = \"../../rust-runtime/aws-smithy-runtime\", features = [\"test-util\"] }\n"
  },
  {
    "path": "examples/pokemon-service-common/src/lib.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Pokémon Service\n//!\n//! This crate implements the Pokémon Service.\n#![warn(missing_docs, missing_debug_implementations, rust_2018_idioms)]\nuse std::{\n    collections::HashMap,\n    convert::TryInto,\n    process::Child,\n    sync::{atomic::AtomicUsize, Arc},\n};\n\nuse async_stream::stream;\nuse aws_smithy_http_client::{tls, Connector};\nuse aws_smithy_http_server_metrics::operation::Metrics;\nuse aws_smithy_runtime_api::client::http::HttpConnector;\nuse http::Uri;\nuse pokemon_service_server_sdk::{\n    error, input,\n    model::{self, CapturingPayload},\n    output,\n    server::Extension,\n    types::{Blob, ByteStream, SdkBody},\n};\nuse rand::{seq::SliceRandom, Rng};\nuse tracing_subscriber::{prelude::*, EnvFilter};\n\nuse crate::metrics::PokemonOperationMetrics;\n\npub mod metrics;\n\nconst PIKACHU_ENGLISH_FLAVOR_TEXT: &str =\n    \"When several of these Pokémon gather, their electricity could build and cause lightning storms.\";\nconst PIKACHU_SPANISH_FLAVOR_TEXT: &str =\n    \"Cuando varios de estos Pokémon se juntan, su energía puede causar fuertes tormentas.\";\nconst PIKACHU_ITALIAN_FLAVOR_TEXT: &str =\n    \"Quando vari Pokémon di questo tipo si radunano, la loro energia può causare forti tempeste.\";\nconst PIKACHU_JAPANESE_FLAVOR_TEXT: &str =\n    \"ほっぺたの りょうがわに ちいさい でんきぶくろを もつ。ピンチのときに ほうでんする。\";\n\n/// Kills [`Child`] process when dropped.\n#[derive(Debug)]\n#[must_use]\npub struct ChildDrop(pub Child);\n\nimpl Drop for ChildDrop {\n    fn drop(&mut self) {\n        self.0.kill().expect(\"failed to kill process\")\n    }\n}\n\n/// Setup `tracing::subscriber` to read the log level from RUST_LOG environment variable.\npub fn setup_tracing() {\n    let format = tracing_subscriber::fmt::layer().json();\n    let filter = EnvFilter::try_from_default_env()\n        .or_else(|_| EnvFilter::try_new(\"info\"))\n        .unwrap();\n    tracing_subscriber::registry()\n        .with(format)\n        .with(filter)\n        .init();\n}\n\n/// Structure holding the translations for a Pokémon description.\n#[derive(Debug)]\nstruct PokemonTranslations {\n    en: String,\n    es: String,\n    it: String,\n    jp: String,\n}\n\n/// PokémonService shared state.\n///\n/// Some applications may want to manage state between handlers. Imagine having a database connection pool\n/// that can be shared between different handlers and operation implementations.\n/// State management can be expressed in a struct where the attributes hold the shared entities.\n///\n/// **NOTE: It is up to the implementation of the state structure to handle concurrency by protecting**\n/// **its attributes using synchronization mechanisms.**\n///\n/// The framework stores the `Arc<T>` inside an `http::Extensions` and conveniently passes it to\n/// the operation's implementation, making it able to handle operations with two different async signatures:\n/// * `FnOnce(InputType) -> Future<OutputType>`\n/// * `FnOnce(InputType, Extension<Arc<T>>) -> Future<OutputType>`\n///\n/// Wrapping the service with a [`tower::Layer`] will allow to have operations' signatures with and without shared state:\n///\n/// ```compile_fail\n/// use std::sync::Arc;\n/// use aws_smithy_http_server::{AddExtensionLayer, Extension, Router};\n/// use tower::ServiceBuilder;\n/// use tokio::sync::RwLock;\n///\n/// // Shared state,\n/// #[derive(Debug, State)]\n/// pub struct State {\n///     pub count: RwLock<u64>\n/// }\n///\n/// // Operation implementation with shared state.\n/// async fn operation_with_state(input: Input, state: Extension<Arc<State>>) -> Output {\n///     let mut count = state.0.write().await;\n///     *count += 1;\n///     Ok(Output::new())\n/// }\n///\n/// // Operation implementation without shared state.\n/// async fn operation_without_state(input: Input) -> Output {\n///     Ok(Output::new())\n/// }\n///\n/// let app: Router = OperationRegistryBuilder::default()\n///     .operation_with_state(operation_with_state)\n///     .operation_without_state(operation_without_state)\n///     .build()\n///     .unwrap()\n///     .into();\n/// let shared_state = Arc::new(State::default());\n/// let app = app.layer(ServiceBuilder::new().layer(AddExtensionLayer::new(shared_state)));\n/// let server = hyper::Server::bind(&\"0.0.0.0:13734\".parse().unwrap()).serve(app.into_make_service());\n/// ...\n/// ```\n///\n/// Without the middleware layer, the framework will require operations' signatures without\n/// the shared state.\n///\n/// [`middleware`]: [`aws_smithy_http_server::AddExtensionLayer`]\n#[derive(Debug)]\npub struct State {\n    pokemons_translations: HashMap<String, PokemonTranslations>,\n    call_count: AtomicUsize,\n}\n\nimpl Default for State {\n    fn default() -> Self {\n        let mut pokemons_translations = HashMap::new();\n        pokemons_translations.insert(\n            String::from(\"pikachu\"),\n            PokemonTranslations {\n                en: String::from(PIKACHU_ENGLISH_FLAVOR_TEXT),\n                es: String::from(PIKACHU_SPANISH_FLAVOR_TEXT),\n                it: String::from(PIKACHU_ITALIAN_FLAVOR_TEXT),\n                jp: String::from(PIKACHU_JAPANESE_FLAVOR_TEXT),\n            },\n        );\n        Self {\n            pokemons_translations,\n            call_count: Default::default(),\n        }\n    }\n}\n\n/// Retrieves information about a Pokémon species.\npub async fn get_pokemon_species(\n    input: input::GetPokemonSpeciesInput,\n    state: Extension<Arc<State>>,\n    mut metrics: Metrics<PokemonOperationMetrics>,\n) -> Result<output::GetPokemonSpeciesOutput, error::GetPokemonSpeciesError> {\n    state\n        .0\n        .call_count\n        .fetch_add(1, std::sync::atomic::Ordering::SeqCst);\n\n    let pokemon = state.0.pokemons_translations.get(&input.name);\n\n    metrics.get_pokemon_species_metrics.requested_pokemon_name = Some(input.name.clone());\n    metrics.get_pokemon_species_metrics.found = Some(pokemon.is_some());\n\n    match pokemon.as_ref() {\n        Some(pokemon) => {\n            tracing::debug!(\"Requested Pokémon is {}\", input.name);\n            let flavor_text_entries = vec![\n                model::FlavorText {\n                    flavor_text: pokemon.en.to_owned(),\n                    language: model::Language::English,\n                },\n                model::FlavorText {\n                    flavor_text: pokemon.es.to_owned(),\n                    language: model::Language::Spanish,\n                },\n                model::FlavorText {\n                    flavor_text: pokemon.it.to_owned(),\n                    language: model::Language::Italian,\n                },\n                model::FlavorText {\n                    flavor_text: pokemon.jp.to_owned(),\n                    language: model::Language::Japanese,\n                },\n            ];\n            let output = output::GetPokemonSpeciesOutput {\n                name: String::from(\"pikachu\"),\n                flavor_text_entries,\n            };\n            Ok(output)\n        }\n        None => {\n            tracing::error!(\"Requested Pokémon {} not available\", input.name);\n            Err(error::GetPokemonSpeciesError::ResourceNotFoundException(\n                error::ResourceNotFoundException {\n                    message: String::from(\"Requested Pokémon not available\"),\n                },\n            ))\n        }\n    }\n}\n\n/// Retrieves the user's storage.\npub async fn get_storage(\n    input: input::GetStorageInput,\n    _state: Extension<Arc<State>>,\n    mut metrics: Metrics<PokemonOperationMetrics>,\n) -> Result<output::GetStorageOutput, error::GetStorageError> {\n    tracing::debug!(\"attempting to authenticate storage user\");\n\n    // We currently only support Ash and he has nothing stored\n    let authenticated = input.user == \"ash\" && input.passcode == \"pikachu123\";\n\n    metrics.get_storage_metrics.user = Some(input.user.clone());\n    metrics.get_storage_metrics.authenticated = Some(authenticated);\n\n    if !authenticated {\n        tracing::debug!(\"authentication failed\");\n        return Err(error::GetStorageError::StorageAccessNotAuthorized(\n            error::StorageAccessNotAuthorized {},\n        ));\n    }\n    Ok(output::GetStorageOutput { collection: vec![] })\n}\n\n/// Calculates and reports metrics about this server instance.\npub async fn get_server_statistics(\n    _input: input::GetServerStatisticsInput,\n    state: Extension<Arc<State>>,\n    mut metrics: Metrics<PokemonOperationMetrics>,\n) -> output::GetServerStatisticsOutput {\n    // Read the current calls count.\n    let counter = state.0.call_count.load(std::sync::atomic::Ordering::SeqCst);\n    let calls_count = counter\n        .try_into()\n        .map_err(|e| {\n            tracing::error!(\"Unable to convert u64 to i64: {}\", e);\n        })\n        .unwrap_or(0);\n\n    metrics.get_server_statistics_metrics.total_calls = Some(calls_count.to_string());\n\n    tracing::debug!(\"This instance served {} requests\", counter);\n    output::GetServerStatisticsOutput { calls_count }\n}\n\n/// Attempts to capture a Pokémon.\npub async fn capture_pokemon(\n    mut input: input::CapturePokemonInput,\n    mut metrics: Metrics<PokemonOperationMetrics>,\n) -> Result<output::CapturePokemonOutput, error::CapturePokemonError> {\n    let is_supported_region = input.region == \"Kanto\";\n\n    metrics.capture_pokemon_metrics.requested_region = Some(input.region.clone());\n    metrics.capture_pokemon_metrics.supported_region = Some(is_supported_region);\n\n    if !is_supported_region {\n        return Err(error::CapturePokemonError::UnsupportedRegionError(\n            error::UnsupportedRegionError {\n                region: input.region,\n            },\n        ));\n    }\n\n    let output_stream = stream! {\n        loop {\n            use std::time::Duration;\n            match input.events.recv().await {\n                Ok(maybe_event) => match maybe_event {\n                    Some(event) => {\n                        let capturing_event = event.as_event();\n                        if let Ok(attempt) = capturing_event {\n                            let payload = attempt.payload.clone().unwrap_or_else(|| CapturingPayload::builder().build());\n                            let pokeball = payload.pokeball().unwrap_or(\"\");\n\n                            if ! matches!(pokeball, \"Master Ball\" | \"Great Ball\" | \"Fast Ball\") {\n                                yield Err(\n                                    crate::error::CapturePokemonEventsError::InvalidPokeballError(\n                                        crate::error::InvalidPokeballError {\n                                            pokeball: pokeball.to_owned()\n                                        }\n                                    )\n                                );\n                            } else {\n                                let captured = match pokeball {\n                                    \"Master Ball\" => true,\n                                    \"Great Ball\" => rand::thread_rng().gen_range(0..100) > 33,\n                                    \"Fast Ball\" => rand::thread_rng().gen_range(0..100) > 66,\n                                    _ => unreachable!(\"invalid pokeball\"),\n                                };\n                                tokio::time::sleep(Duration::from_millis(1000)).await;\n\n                                if captured {\n                                    let shiny = rand::thread_rng().gen_range(0..4096) == 0;\n                                    let pokemon = payload.name().unwrap_or(\"\").to_string();\n                                    let pokedex: Vec<u8> = (0..255).collect();\n\n                                    yield Ok(crate::model::CapturePokemonEvents::Event(\n                                        crate::model::CaptureEvent {\n                                            name: Some(pokemon),\n                                            shiny: Some(shiny),\n                                            pokedex_update: Some(Blob::new(pokedex)),\n                                            captured: Some(true),\n                                        }\n                                    ));\n                                }\n                            }\n                        }\n                    }\n                    None => break,\n                },\n                Err(e) => println!(\"{e:?}\"),\n            }\n        }\n    };\n\n    Ok(output::CapturePokemonOutput::builder()\n        .events(output_stream.into())\n        .build()\n        .unwrap())\n}\n\n/// Empty operation used to benchmark the service.\n///\n/// Does not contain metrics to show that it is an optional parameter\npub async fn do_nothing(_input: input::DoNothingInput) -> output::DoNothingOutput {\n    output::DoNothingOutput {}\n}\n\n/// Operation used to show the service is running.\npub async fn check_health(\n    _input: input::CheckHealthInput,\n    mut metrics: Metrics<PokemonOperationMetrics>,\n) -> output::CheckHealthOutput {\n    metrics.check_health_metrics.health_check_count = Some(1);\n\n    output::CheckHealthOutput {}\n}\n\nconst RADIO_STREAMS: [&str; 2] = [\n    \"https://ia800107.us.archive.org/33/items/299SoundEffectCollection/102%20Palette%20Town%20Theme.mp3\",\n    \"https://ia600408.us.archive.org/29/items/PocketMonstersGreenBetaLavenderTownMusicwwwFlvtoCom/Pocket%20Monsters%20Green%20Beta-%20Lavender%20Town%20Music-%5Bwww_flvto_com%5D.mp3\",\n];\n\n/// Streams a random Pokémon song.\npub async fn stream_pokemon_radio(\n    _input: input::StreamPokemonRadioInput,\n    mut metrics: Metrics<PokemonOperationMetrics>,\n) -> output::StreamPokemonRadioOutput {\n    let radio_stream_url = RADIO_STREAMS\n        .choose(&mut rand::thread_rng())\n        .expect(\"`RADIO_STREAMS` is empty\")\n        .parse::<Uri>()\n        .expect(\"Invalid url in `RADIO_STREAMS`\");\n\n    metrics.stream_pokemon_radio_metrics.stream_url = Some(radio_stream_url.to_string());\n\n    let connector = Connector::builder()\n        .tls_provider(tls::Provider::Rustls(\n            tls::rustls_provider::CryptoMode::AwsLc,\n        ))\n        .build();\n    let result = connector\n        .call(\n            http::Request::builder()\n                .uri(radio_stream_url)\n                .body(SdkBody::empty())\n                .unwrap()\n                .try_into()\n                .unwrap(),\n        )\n        .await\n        .unwrap();\n\n    output::StreamPokemonRadioOutput {\n        data: ByteStream::new(result.into_body()),\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n\n    #[tokio::test]\n    async fn get_pokemon_species_pikachu_spanish_flavor_text() {\n        let input = input::GetPokemonSpeciesInput {\n            name: String::from(\"pikachu\"),\n        };\n\n        let state = Arc::new(State::default());\n\n        let actual_spanish_flavor_text =\n            get_pokemon_species(input, Extension(state.clone()), Metrics::test())\n                .await\n                .unwrap()\n                .flavor_text_entries\n                .into_iter()\n                .find(|flavor_text| flavor_text.language == model::Language::Spanish)\n                .unwrap();\n\n        assert_eq!(\n            PIKACHU_SPANISH_FLAVOR_TEXT,\n            actual_spanish_flavor_text.flavor_text()\n        );\n\n        let input = input::GetServerStatisticsInput {};\n        let stats = get_server_statistics(input, Extension(state.clone()), Metrics::test()).await;\n        assert_eq!(1, stats.calls_count);\n    }\n}\n"
  },
  {
    "path": "examples/pokemon-service-common/src/metrics.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n#![allow(missing_docs)]\n\nuse aws_smithy_http_server_metrics::smithy_metrics;\nuse metrique::unit_of_work::metrics;\n\n#[smithy_metrics]\n#[metrics]\n#[derive(Default)]\npub struct PokemonMetrics {\n    #[metrics(flatten)]\n    pub request_metrics: PokemonRequestMetrics,\n    #[metrics(flatten)]\n    pub response_metrics: PokemonResponseMetrics,\n    #[metrics(flatten)]\n    #[smithy_metrics(operation)]\n    pub operation_metrics: PokemonOperationMetrics,\n}\n\n#[metrics]\n#[derive(Default, Clone)]\npub struct PokemonOperationMetrics {\n    #[metrics(flatten)]\n    pub get_pokemon_species_metrics: GetPokemonSpeciesMetrics,\n    #[metrics(flatten)]\n    pub get_storage_metrics: GetStorageMetrics,\n    #[metrics(flatten)]\n    pub get_server_statistics_metrics: GetServerStatisticsMetrics,\n    #[metrics(flatten)]\n    pub capture_pokemon_metrics: CapturePokemonMetrics,\n    #[metrics(flatten)]\n    pub check_health_metrics: CheckHealthMetrics,\n    #[metrics(flatten)]\n    pub stream_pokemon_radio_metrics: StreamPokemonRadioMetrics,\n}\n\n#[metrics]\n#[derive(Default, Clone)]\npub struct GetPokemonSpeciesMetrics {\n    pub requested_pokemon_name: Option<String>,\n    pub found: Option<bool>,\n}\n\n#[metrics]\n#[derive(Default, Clone)]\npub struct GetStorageMetrics {\n    pub user: Option<String>,\n    pub authenticated: Option<bool>,\n}\n\n#[metrics]\n#[derive(Default, Clone)]\npub struct GetServerStatisticsMetrics {\n    pub total_calls: Option<String>,\n}\n\n#[metrics]\n#[derive(Default, Clone)]\npub struct CapturePokemonMetrics {\n    pub requested_region: Option<String>,\n    pub supported_region: Option<bool>,\n}\n\n#[metrics]\n#[derive(Default, Clone)]\npub struct CheckHealthMetrics {\n    pub health_check_count: Option<usize>,\n}\n\n#[metrics]\n#[derive(Default, Clone)]\npub struct StreamPokemonRadioMetrics {\n    pub stream_url: Option<String>,\n}\n\n#[metrics]\n#[derive(Default, Clone)]\npub struct PokemonRequestMetrics {\n    pub test_request_metric: Option<String>,\n}\n\n#[metrics]\n#[derive(Default, Clone)]\npub struct PokemonResponseMetrics {\n    pub test_response_metric: Option<String>,\n}\n"
  },
  {
    "path": "examples/pokemon-service-common/tests/plugins_execution_order.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::{\n    ops::Deref,\n    sync::Arc,\n    sync::Mutex,\n    task::{Context, Poll},\n};\n\nuse pokemon_service_server_sdk::{\n    server::plugin::{HttpMarker, HttpPlugins, Plugin},\n    PokemonService, PokemonServiceConfig,\n};\nuse tower::{Layer, Service};\n\nuse aws_smithy_runtime::client::http::test_util::capture_request;\nuse pokemon_service_client::{Client, Config};\nuse pokemon_service_common::do_nothing;\n\n#[tokio::test]\nasync fn plugin_layers_are_executed_in_registration_order() {\n    // Each plugin layer will push its name into this vector when it gets invoked.\n    // We can then check the vector content to verify the invocation order\n    let output = Arc::new(Mutex::new(Vec::new()));\n\n    let http_plugins = HttpPlugins::new()\n        .push(SentinelPlugin::new(\"first\", output.clone()))\n        .push(SentinelPlugin::new(\"second\", output.clone()));\n    let config = PokemonServiceConfig::builder()\n        .http_plugin(http_plugins)\n        .build();\n    let mut app = PokemonService::builder(config)\n        .do_nothing(do_nothing)\n        .build_unchecked();\n\n    let request = {\n        let (http_client, rcvr) = capture_request(None);\n        let config = Config::builder()\n            .http_client(http_client)\n            .endpoint_url(\"http://localhost:1234\")\n            .build();\n        Client::from_conf(config).do_nothing().send().await.unwrap();\n        rcvr.expect_request()\n    };\n\n    app.call(request.try_into().unwrap()).await.unwrap();\n\n    let output_guard = output.lock().unwrap();\n    assert_eq!(output_guard.deref(), &vec![\"first\", \"second\"]);\n}\n\nstruct SentinelPlugin {\n    name: &'static str,\n    output: Arc<Mutex<Vec<&'static str>>>,\n}\n\nimpl SentinelPlugin {\n    pub fn new(name: &'static str, output: Arc<Mutex<Vec<&'static str>>>) -> Self {\n        Self { name, output }\n    }\n}\n\nimpl<Ser, Op, T> Plugin<Ser, Op, T> for SentinelPlugin {\n    type Output = SentinelService<T>;\n\n    fn apply(&self, inner: T) -> Self::Output {\n        SentinelService {\n            inner,\n            name: self.name,\n            output: self.output.clone(),\n        }\n    }\n}\n\nimpl HttpMarker for SentinelPlugin {}\n\n#[derive(Clone, Debug)]\npub struct SentinelService<S> {\n    inner: S,\n    output: Arc<Mutex<Vec<&'static str>>>,\n    name: &'static str,\n}\n\nimpl<R, S> Service<R> for SentinelService<S>\nwhere\n    S: Service<R>,\n{\n    type Response = S::Response;\n    type Error = S::Error;\n    type Future = S::Future;\n\n    fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {\n        self.inner.poll_ready(cx)\n    }\n\n    fn call(&mut self, req: R) -> Self::Future {\n        self.output.lock().unwrap().push(self.name);\n        self.inner.call(req)\n    }\n}\n\n#[derive(Debug)]\npub struct SentinelLayer {\n    name: &'static str,\n    output: Arc<Mutex<Vec<&'static str>>>,\n}\n\nimpl<S> Layer<S> for SentinelLayer {\n    type Service = SentinelService<S>;\n\n    fn layer(&self, service: S) -> Self::Service {\n        SentinelService {\n            inner: service,\n            output: self.output.clone(),\n            name: self.name,\n        }\n    }\n}\n"
  },
  {
    "path": "examples/pokemon-service-lambda/Cargo.toml",
    "content": "[package]\nname = \"pokemon-service-lambda\"\nversion = \"0.1.0\"\nedition = \"2021\"\npublish = false\nauthors = [\"Smithy-rs Server Team <smithy-rs-server@amazon.com>\"]\ndescription = \"A smithy Rust service to retrieve information about Pokémon via Lambda.\"\n\n[dependencies]\nasync-stream = \"0.3.4\"\nclap = { version = \"4.1.11\", features = [\"derive\"] }\nhttp = \"1\"\nhyper = {version = \"1\", features = [\"server\"] }\ntokio = \"1.26.0\"\ntracing = \"0.1\"\n\nlambda_http = \"1\"\n\n# Local paths\npokemon-service-server-sdk = { path = \"../pokemon-service-server-sdk/\", features = [\"aws-lambda\"] }\npokemon-service-common = { path = \"../pokemon-service-common/\" }\n"
  },
  {
    "path": "examples/pokemon-service-lambda/src/lib.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::sync::Arc;\n\nuse pokemon_service_common::State;\nuse pokemon_service_server_sdk::{\n    error::{GetStorageError, StorageAccessNotAuthorized},\n    input::GetStorageInput,\n    output::GetStorageOutput,\n    server::{request::lambda::Context, Extension},\n};\n\n/// Retrieves the user's storage and logs the lambda request ID.\npub async fn get_storage_lambda(\n    input: GetStorageInput,\n    _state: Extension<Arc<State>>,\n    context: Context,\n) -> Result<GetStorageOutput, GetStorageError> {\n    tracing::debug!(request_id = %context.request_id, \"attempting to authenticate storage user\");\n\n    // We currently only support Ash and he has nothing stored\n    if !(input.user == \"ash\" && input.passcode == \"pikachu123\") {\n        tracing::debug!(\"authentication failed\");\n        return Err(GetStorageError::StorageAccessNotAuthorized(\n            StorageAccessNotAuthorized {},\n        ));\n    }\n    Ok(GetStorageOutput { collection: vec![] })\n}\n"
  },
  {
    "path": "examples/pokemon-service-lambda/src/main.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::sync::Arc;\n\nuse pokemon_service_common::{\n    capture_pokemon, check_health, do_nothing, get_pokemon_species, get_server_statistics,\n    setup_tracing, stream_pokemon_radio, State,\n};\nuse pokemon_service_lambda::get_storage_lambda;\nuse pokemon_service_server_sdk::{\n    server::{routing::LambdaHandler, AddExtensionLayer},\n    PokemonService, PokemonServiceConfig,\n};\n\n#[tokio::main]\npub async fn main() {\n    setup_tracing();\n\n    let config = PokemonServiceConfig::builder()\n        // Set up shared state and middlewares.\n        .layer(AddExtensionLayer::new(Arc::new(State::default())))\n        .build();\n    let app = PokemonService::builder(config)\n        // Build a registry containing implementations to all the operations in the service. These\n        // are async functions or async closures that take as input the operation's input and\n        // return the operation's output.\n        .get_pokemon_species(get_pokemon_species)\n        .get_storage(get_storage_lambda)\n        .get_server_statistics(get_server_statistics)\n        .capture_pokemon(capture_pokemon)\n        .do_nothing(do_nothing)\n        .check_health(check_health)\n        .stream_pokemon_radio(stream_pokemon_radio)\n        .build()\n        .expect(\"failed to build an instance of PokemonService\");\n\n    let handler = LambdaHandler::new(app);\n    let lambda = lambda_http::run(handler);\n\n    if let Err(err) = lambda.await {\n        eprintln!(\"lambda error: {err}\");\n    }\n}\n"
  },
  {
    "path": "examples/pokemon-service-lambda/tests/fixtures/example-apigw-request.json",
    "content": "{\n  \"body\": null,\n  \"headers\": {\n    \"Accept\": \"application/json\",\n    \"Accept-Encoding\": \"gzip, deflate\",\n    \"cache-control\": \"no-cache\",\n    \"CloudFront-Forwarded-Proto\": \"https\",\n    \"CloudFront-Is-Desktop-Viewer\": \"true\",\n    \"CloudFront-Is-Mobile-Viewer\": \"false\",\n    \"CloudFront-Is-SmartTV-Viewer\": \"false\",\n    \"CloudFront-Is-Tablet-Viewer\": \"false\",\n    \"CloudFront-Viewer-Country\": \"US\",\n    \"Content-Type\": \"application/json\",\n    \"headerName\": \"headerValue\",\n    \"Host\": \"gy415nuibc.execute-api.us-east-1.amazonaws.com\",\n    \"Postman-Token\": \"9f583ef0-ed83-4a38-aef3-eb9ce3f7a57f\",\n    \"User-Agent\": \"PostmanRuntime/2.4.5\",\n    \"Via\": \"1.1 d98420743a69852491bbdea73f7680bd.cloudfront.net (CloudFront)\",\n    \"X-Amz-Cf-Id\": \"pn-PWIJc6thYnZm5P0NMgOUglL1DYtl0gdeJky8tqsg8iS_sgsKD1A==\",\n    \"X-Forwarded-For\": \"54.240.196.186, 54.182.214.83\",\n    \"X-Forwarded-Port\": \"443\",\n    \"X-Forwarded-Proto\": \"https\"\n  },\n  \"httpMethod\": \"GET\",\n  \"isBase64Encoded\": false,\n  \"multiValueHeaders\": {\n    \"Accept\": [\"application/json\"],\n    \"Accept-Encoding\": [\"gzip, deflate\"],\n    \"cache-control\": [\"no-cache\"],\n    \"CloudFront-Forwarded-Proto\": [\"https\"],\n    \"CloudFront-Is-Desktop-Viewer\": [\"true\"],\n    \"CloudFront-Is-Mobile-Viewer\": [\"false\"],\n    \"CloudFront-Is-SmartTV-Viewer\": [\"false\"],\n    \"CloudFront-Is-Tablet-Viewer\": [\"false\"],\n    \"CloudFront-Viewer-Country\": [\"US\"],\n    \"Content-Type\": [\"application/json\"],\n    \"headerName\": [\"headerValue\"],\n    \"Host\": [\"gy415nuibc.execute-api.us-east-1.amazonaws.com\"],\n    \"Postman-Token\": [\"9f583ef0-ed83-4a38-aef3-eb9ce3f7a57f\"],\n    \"User-Agent\": [\"PostmanRuntime/2.4.5\"],\n    \"Via\": [\"1.1 d98420743a69852491bbdea73f7680bd.cloudfront.net (CloudFront)\"],\n    \"X-Amz-Cf-Id\": [\"pn-PWIJc6thYnZm5P0NMgOUglL1DYtl0gdeJky8tqsg8iS_sgsKD1A==\"],\n    \"X-Forwarded-For\": [\"54.240.196.186, 54.182.214.83\"],\n    \"X-Forwarded-Port\": [\"443\"],\n    \"X-Forwarded-Proto\": [\"https\"]\n  },\n  \"multiValueQueryStringParameters\": {\n    \"key\": [\"value\"]\n  },\n  \"path\": \"/stats\",\n  \"pathParameters\": null,\n  \"queryStringParameters\": {\n    \"key\": \"value\"\n  },\n  \"requestContext\": {\n    \"accountId\": \"xxxxx\",\n    \"apiId\": \"xxxxx\",\n    \"domainName\": \"testPrefix.testDomainName\",\n    \"domainPrefix\": \"testPrefix\",\n    \"extendedRequestId\": \"NvWWKEZbliAFliA=\",\n    \"httpMethod\": \"GET\",\n    \"identity\": {\n      \"accessKey\": \"xxxxx\",\n      \"accountId\": \"xxxxx\",\n      \"apiKey\": \"test-invoke-api-key\",\n      \"apiKeyId\": \"test-invoke-api-key-id\",\n      \"caller\": \"xxxxx:xxxxx\",\n      \"cognitoAuthenticationProvider\": null,\n      \"cognitoAuthenticationType\": null,\n      \"cognitoIdentityId\": null,\n      \"cognitoIdentityPoolId\": null,\n      \"principalOrgId\": null,\n      \"sourceIp\": \"test-invoke-source-ip\",\n      \"user\": \"xxxxx:xxxxx\",\n      \"userAgent\": \"aws-internal/3 aws-sdk-java/1.12.154 Linux/5.4.156-94.273.amzn2int.x86_64 OpenJDK_64-Bit_Server_VM/25.322-b06 java/1.8.0_322 vendor/Oracle_Corporation cfg/retry-mode/standard\",\n      \"userArn\": \"arn:aws:sts::xxxxx:assumed-role/xxxxx/xxxxx\"\n    },\n    \"path\": \"/stats\",\n    \"protocol\": \"HTTP/1.1\",\n    \"requestId\": \"e5488776-afe4-4e5e-92b1-37bd23f234d6\",\n    \"requestTime\": \"18/Feb/2022:13:23:12 +0000\",\n    \"requestTimeEpoch\": 1645190592806,\n    \"resourceId\": \"ddw8yd\",\n    \"resourcePath\": \"/stats\",\n    \"stage\": \"test-invoke-stage\"\n  },\n  \"resource\": \"/stats\",\n  \"stageVariables\": null\n}\n"
  },
  {
    "path": "examples/pokemon-service-tls/Cargo.toml",
    "content": "[package]\nname = \"pokemon-service-tls\"\nversion = \"0.1.0\"\nedition = \"2021\"\npublish = false\nauthors = [\"Smithy-rs Server Team <smithy-rs-server@amazon.com>\"]\ndescription = \"A smithy Rust service to retrieve information about Pokémon.\"\n\n[dependencies]\nclap = { version = \"4.1.11\", features = [\"derive\"] }\nhttp = \"1\"\nhyper = { version = \"1\", features = [\"server\"] }\nhyper-util = { version = \"0.1\", features = [\"tokio\", \"server\", \"server-auto\", \"service\"] }\ntokio = { version = \"1.26.0\", features = [\"rt-multi-thread\", \"macros\"] }\ntracing = \"0.1\"\ntower = \"0.4\"\n\n# These dependencies are only required for the `pokemon-service-tls` program.\ntokio-rustls = \"0.26\"\nrustls = \"0.23\"\nrustls-pemfile = \"2\"\nfutures-util = { version = \"0.3.29\", default-features = false }\n\n# Local paths\npokemon-service-server-sdk = { path = \"../pokemon-service-server-sdk/\" }\npokemon-service-common = { path = \"../pokemon-service-common/\" }\n\n[dev-dependencies]\nassert_cmd = \"2.0\"\nserial_test = \"3.1.1\"\n\n# These dependencies are only required for testing the `pokemon-service-tls` program.\nhyper-rustls = { version = \"0.27\", features = [\"http2\"] }\n\n# Local paths\naws-smithy-http-client = { path = \"../../rust-runtime/aws-smithy-http-client\", features = [\"default-client\", \"rustls-aws-lc\"] }\naws-smithy-runtime = { path = \"../../rust-runtime/aws-smithy-runtime\", features = [\"client\", \"default-https-client\"] }\naws-smithy-types = { path = \"../../rust-runtime/aws-smithy-types/\" }\npokemon-service-client = { path = \"../pokemon-service-client/\", features = [\n    \"behavior-version-latest\",\n] }\n"
  },
  {
    "path": "examples/pokemon-service-tls/src/lib.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n// Defaults shared between `main.rs` and `/tests`.\npub const DEFAULT_TEST_KEY: &str =\n    concat!(env!(\"CARGO_MANIFEST_DIR\"), \"/tests/testdata/localhost.key\");\npub const DEFAULT_TEST_CERT: &str =\n    concat!(env!(\"CARGO_MANIFEST_DIR\"), \"/tests/testdata/localhost.crt\");\npub const DEFAULT_ADDRESS: &str = \"127.0.0.1\";\npub const DEFAULT_PORT: u16 = 13734;\npub const DEFAULT_DOMAIN: &str = \"localhost\";\n"
  },
  {
    "path": "examples/pokemon-service-tls/src/main.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n// This program is exported as a binary named `pokemon-service-tls`.\n// It uses `tls-listener`, `tokio-rustls` (and `rustls-pemfile` to parse PEM files)\n// to serve TLS connections. It also enables h2 ALPN protocol,\n// without this clients by default don't upgrade to http2.\n//\n// You can use `mkcert` (https://github.com/FiloSottile/mkcert) to create certificates for testing:\n// `$ mkcert localhost`\n// it should create `./localhost.pem` and `./localhost-key.pem`,\n// then you can run TLS server via:\n// `$ cargo run --bin pokemon-service-tls -- --tls-cert-path ./localhost.pem --tls-key-path ./localhost-key.pem`\n// and test it:\n// ```bash\n// $ curl -k -D- -H \"Accept: application/json\" https://localhost:13734/pokemon-species/pikachu\n// HTTP/2 200\n// # ...\n// ```\n// note that by default created certificates will be unknown and you should use `-k|--insecure`\n// flag while making requests with cURL or you can run `mkcert -install` to trust certificates created by `mkcert`.\n\nuse std::{\n    fs::File,\n    io::{self, BufReader},\n    net::SocketAddr,\n    sync::Arc,\n};\n\nuse clap::Parser;\nuse tokio::net::TcpListener;\nuse tokio_rustls::{\n    rustls::{\n        pki_types::{CertificateDer, PrivateKeyDer},\n        ServerConfig,\n    },\n    TlsAcceptor,\n};\n\nuse pokemon_service_common::{\n    capture_pokemon, check_health, get_pokemon_species, get_server_statistics, get_storage,\n    setup_tracing, stream_pokemon_radio, State,\n};\nuse pokemon_service_server_sdk::{\n    input, output,\n    server::{\n        request::connect_info::ConnectInfo,\n        routing::Connected,\n        serve::{serve, Listener},\n        AddExtensionLayer,\n    },\n    PokemonService, PokemonServiceConfig,\n};\nuse pokemon_service_tls::{DEFAULT_ADDRESS, DEFAULT_PORT, DEFAULT_TEST_CERT, DEFAULT_TEST_KEY};\nuse tokio::net::TcpStream;\n\n#[derive(Parser, Debug)]\n#[clap(author, version, about, long_about = None)]\nstruct Args {\n    /// Hyper server bind address.\n    #[clap(short, long, action, default_value = DEFAULT_ADDRESS)]\n    address: String,\n    /// Hyper server bind port.\n    #[clap(short, long, action, default_value_t = DEFAULT_PORT)]\n    port: u16,\n    /// Hyper server TLS certificate path. Must be a PEM file.\n    #[clap(long, default_value = DEFAULT_TEST_CERT)]\n    tls_cert_path: String,\n    /// Hyper server TLS private key path. Must be a PEM file.\n    #[clap(long, default_value = DEFAULT_TEST_KEY)]\n    tls_key_path: String,\n}\n\n/// A TLS listener that wraps TcpListener and TlsAcceptor\npub struct TlsListener {\n    tcp_listener: TcpListener,\n    tls_acceptor: TlsAcceptor,\n}\n\nimpl TlsListener {\n    pub fn new(tcp_listener: TcpListener, tls_acceptor: TlsAcceptor) -> Self {\n        Self {\n            tcp_listener,\n            tls_acceptor,\n        }\n    }\n}\n\nimpl Listener for TlsListener {\n    type Io = tokio_rustls::server::TlsStream<TcpStream>;\n    type Addr = SocketAddr;\n\n    async fn accept(&mut self) -> (Self::Io, Self::Addr) {\n        loop {\n            match self.tcp_listener.accept().await {\n                Ok((tcp_stream, remote_addr)) => match self.tls_acceptor.accept(tcp_stream).await {\n                    Ok(tls_stream) => return (tls_stream, remote_addr),\n                    Err(err) => {\n                        eprintln!(\"TLS handshake failed: {err}\");\n                        continue;\n                    }\n                },\n                Err(err) => {\n                    eprintln!(\"Failed to accept TCP connection: {err}\");\n                    tokio::time::sleep(std::time::Duration::from_millis(100)).await;\n                }\n            }\n        }\n    }\n\n    fn local_addr(&self) -> io::Result<Self::Addr> {\n        self.tcp_listener.local_addr()\n    }\n}\n\n/// Information derived from the TLS connection.\n#[derive(Debug, Clone)]\npub struct TlsConnectInfo {\n    /// The remote peer address of this connection.\n    pub socket_addr: SocketAddr,\n\n    /// The set of TLS certificates presented by the peer in this connection.\n    pub certs: Option<Arc<Vec<CertificateDer<'static>>>>,\n}\n\nimpl<'a> Connected<pokemon_service_server_sdk::server::serve::IncomingStream<'a, TlsListener>>\n    for TlsConnectInfo\n{\n    fn connect_info(\n        target: pokemon_service_server_sdk::server::serve::IncomingStream<'a, TlsListener>,\n    ) -> Self {\n        let tls_stream = target.io();\n        let socket_addr = *target.remote_addr();\n\n        let certs = tls_stream\n            .get_ref()\n            .1\n            .peer_certificates()\n            .map(|certs| Arc::new(certs.to_vec()));\n\n        TlsConnectInfo { socket_addr, certs }\n    }\n}\n\n/// Empty operation used to showcase how we can get access to information derived from the TLS\n/// connection in.\npub async fn do_nothing_with_tls_connect_info(\n    _input: input::DoNothingInput,\n    ConnectInfo(tls_connect_info): ConnectInfo<TlsConnectInfo>,\n) -> output::DoNothingOutput {\n    // Logging these might pose a security concern! You probably don't want to do this in\n    // production.\n    tracing::debug!(?tls_connect_info.certs, \"peer TLS certificates\");\n\n    output::DoNothingOutput {}\n}\n\n#[tokio::main]\npub async fn main() {\n    let args = Args::parse();\n    setup_tracing();\n\n    let config = PokemonServiceConfig::builder()\n        // Set up shared state and middlewares.\n        .layer(AddExtensionLayer::new(Arc::new(State::default())))\n        .build();\n    let app = PokemonService::builder(config)\n        // Build a registry containing implementations to all the operations in the service. These\n        // are async functions or async closures that take as input the operation's input and\n        // return the operation's output.\n        .get_pokemon_species(get_pokemon_species)\n        .get_storage(get_storage)\n        .get_server_statistics(get_server_statistics)\n        .capture_pokemon(capture_pokemon)\n        .do_nothing(do_nothing_with_tls_connect_info)\n        .check_health(check_health)\n        .stream_pokemon_radio(stream_pokemon_radio)\n        .build()\n        .expect(\"failed to build an instance of PokemonService\");\n\n    let addr: SocketAddr = format!(\"{}:{}\", args.address, args.port)\n        .parse()\n        .expect(\"unable to parse the server bind address and port\");\n\n    let tls_acceptor = acceptor(&args.tls_cert_path, &args.tls_key_path);\n    let tcp_listener = TcpListener::bind(addr)\n        .await\n        .expect(\"failed to bind TCP listener\");\n\n    // Get the actual bound address (important when port 0 is used for random port)\n    let actual_addr = tcp_listener\n        .local_addr()\n        .expect(\"failed to get local address\");\n\n    let tls_listener = TlsListener::new(tcp_listener, tls_acceptor);\n\n    // Signal that the server is ready to accept connections, including the actual port\n    eprintln!(\"SERVER_READY:{}\", actual_addr.port());\n\n    // Using `into_make_service_with_connect_info`, rather than `into_make_service`, to adjoin the `TlsConnectInfo`\n    // connection info.\n    let make_app = app.into_make_service_with_connect_info::<TlsConnectInfo>();\n\n    // Run the server using the serve function\n    if let Err(err) = serve(tls_listener, make_app).await {\n        eprintln!(\"server error: {err}\");\n    }\n}\n\n// Returns a `TlsAcceptor` that can be used to create `TlsListener`\n// which then can be used with Hyper.\npub fn acceptor(cert_path: &str, key_path: &str) -> TlsAcceptor {\n    let certs = load_certs(cert_path);\n    let key = load_key(key_path);\n    let mut server_config = ServerConfig::builder()\n        .with_no_client_auth()\n        .with_single_cert(certs, key)\n        .expect(\"could not create server config\");\n\n    // If we don't state we are accepting \"h2\", clients by default don't negotiate way up to http2.\n    server_config.alpn_protocols = vec![\"h2\".into(), \"http/1.1\".into()];\n\n    TlsAcceptor::from(Arc::new(server_config))\n}\n\nfn load_certs(path: &str) -> Vec<CertificateDer<'static>> {\n    let mut reader = BufReader::new(File::open(path).expect(\"could not open certificate\"));\n    rustls_pemfile::certs(&mut reader)\n        .collect::<Result<Vec<_>, _>>()\n        .expect(\"could not parse certificate\")\n}\n\nfn load_key(path: &str) -> PrivateKeyDer<'static> {\n    let mut reader = BufReader::new(File::open(path).expect(\"could not open private key\"));\n    loop {\n        match rustls_pemfile::read_one(&mut reader).expect(\"could not parse private key\") {\n            Some(rustls_pemfile::Item::Pkcs1Key(key)) => return key.into(),\n            Some(rustls_pemfile::Item::Pkcs8Key(key)) => return key.into(),\n            Some(rustls_pemfile::Item::Sec1Key(key)) => return key.into(),\n            None => break,\n            _ => {}\n        }\n    }\n    panic!(\"invalid private key\")\n}\n"
  },
  {
    "path": "examples/pokemon-service-tls/tests/common/mod.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::{\n    io::{BufRead, BufReader},\n    process::{Command, Stdio},\n    time::Duration,\n};\n\nuse aws_smithy_http_client::{tls, Builder};\nuse tokio::time::timeout;\n\nuse pokemon_service_client::{Client, Config};\nuse pokemon_service_common::ChildDrop;\nuse pokemon_service_tls::{DEFAULT_DOMAIN, DEFAULT_TEST_CERT};\n\npub struct ServerHandle {\n    pub child: ChildDrop,\n    pub port: u16,\n}\n\npub async fn run_server() -> ServerHandle {\n    let mut child = Command::new(assert_cmd::cargo::cargo_bin!(\"pokemon-service-tls\"))\n        .args([\"--port\", \"0\"]) // Use port 0 for random available port\n        .stderr(Stdio::piped())\n        .spawn()\n        .unwrap();\n\n    // Wait for the server to signal it's ready by reading stderr\n    let stderr = child.stderr.take().unwrap();\n    let ready_signal = tokio::task::spawn_blocking(move || {\n        let reader = BufReader::new(stderr);\n        for line in reader.lines() {\n            if let Ok(line) = line {\n                if let Some(port_str) = line.strip_prefix(\"SERVER_READY:\") {\n                    if let Ok(port) = port_str.parse::<u16>() {\n                        return Some(port);\n                    }\n                }\n            }\n        }\n        None\n    });\n\n    // Wait for the ready signal with a timeout\n    let port = match timeout(Duration::from_secs(5), ready_signal).await {\n        Ok(Ok(Some(port))) => port,\n        _ => {\n            panic!(\"Server did not become ready within 5 seconds\");\n        }\n    };\n\n    ServerHandle {\n        child: ChildDrop(child),\n        port,\n    }\n}\n\n// Returns a client that only talks through https and http2 connections.\n// It is useful in testing whether our server can talk to http2.\npub fn client_http2_only(port: u16) -> Client {\n    // Create custom cert store and add our test certificate to prevent unknown cert issues.\n    let cert_pem = std::fs::read(DEFAULT_TEST_CERT).expect(\"could not open certificate\");\n\n    let trust_store = tls::TrustStore::empty()\n        .with_native_roots(false)\n        .with_pem_certificate(cert_pem);\n\n    let tls_context = tls::TlsContext::builder()\n        .with_trust_store(trust_store)\n        .build()\n        .expect(\"failed to build TLS context\");\n\n    let http_client = Builder::new()\n        .tls_provider(tls::Provider::Rustls(\n            tls::rustls_provider::CryptoMode::AwsLc,\n        ))\n        .tls_context(tls_context)\n        .build_https();\n\n    let config = Config::builder()\n        .http_client(http_client)\n        .endpoint_url(format!(\"https://{DEFAULT_DOMAIN}:{port}\"))\n        .build();\n    Client::from_conf(config)\n}\n"
  },
  {
    "path": "examples/pokemon-service-tls/tests/custom_connectors.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npub mod common;\n\n// This test invokes an operation with a client that can only send HTTP2 requests and whose TLS\n// implementation is backed by `rustls`.\n#[tokio::test]\nasync fn test_do_nothing_http2_rustls_connector() {\n    let server = common::run_server().await;\n    let client = common::client_http2_only(server.port);\n\n    let _check_health = client.do_nothing().send().await.unwrap();\n}\n"
  },
  {
    "path": "examples/pokemon-service-tls/tests/testdata/localhost.crt",
    "content": "-----BEGIN CERTIFICATE-----\nMIIFGTCCAwGgAwIBAgIUN/FD3OayKwJt9hXNKo4JKxqFSK4wDQYJKoZIhvcNAQEL\nBQAwFDESMBAGA1UEAwwJbG9jYWxob3N0MB4XDTIyMDgxNzE1MjQzMFoXDTMyMDgx\nNDE1MjQzMFowFDESMBAGA1UEAwwJbG9jYWxob3N0MIICIjANBgkqhkiG9w0BAQEF\nAAOCAg8AMIICCgKCAgEAulMGcyA69ioNMT8Kz0CdP2QP5elLNnltBykoqoJwbvKS\n94+l5XA//29M4NpLphHcDxNXx3qB318bixUIPBtu66OiIsTGX8yrYPA4IO3Xt5/2\nwp2z1lNLouyW1+gPaPjKzcrjnHmqHS90CFDQqxdv9I0rIFIQ+U5hm5T9Hjr5xs36\n43l2FXAjeigoEuwtVBDt44yhEyeLSDwFJES3sH73AvpruMdxGv2KDVN4whuajWll\nRLTqpqBvVSM6JbaV/VD2simpZeolSl8yKIenM2PWPdLIHSMEBg6IaYgpSpzoyvmh\n089peAaiJfVrN53QjqDVyaN5os9ST03ZEzXQUI38lpvWGmV9Tcs5WfidLA1EbPjv\nyE1zBbZh0SrP/+EALwkoIRslI8DXvz/9U5Cq7q9U4OHjWB+yjE5/BX6o6hfrqfJ1\nLdg2fTp/TYEudmefM8eRzx6sdYtTPZBrSpkRgvmxd+6k3QUtsAQhtBTMpvJpWsgs\nsD7Uo6G2JRag53oT/2cxG03Qy5HqySZUK1bpFW03W5FL3Pq6AkpGy1hnSxlifkHp\nsi61dbjCV5uRdxRCLyH9fD3HImecet+vnuZlvsP0MAzh0vbli/dcFZ7xUoSqFWnj\negnPohdOmF6C8kXvWBt51N4jjW+eLxPAr9H0mJtdIvEHWBNNW9iitzGz5Gw0g4sC\nAwEAAaNjMGEwHQYDVR0OBBYEFEoLkB78Z6jgPPmOyf0XnWo/LjA9MB8GA1UdIwQY\nMBaAFEoLkB78Z6jgPPmOyf0XnWo/LjA9MBQGA1UdEQQNMAuCCWxvY2FsaG9zdDAJ\nBgNVHRMEAjAAMA0GCSqGSIb3DQEBCwUAA4ICAQC17OljBEEVYefzk2mwg20AXDtL\nPUJ46hLrUM7BcNBjd8AbtrLH/pdCRCexnv7tzYbwMhDNdqHiIcXDHEMNP3gXryB2\nckU5ms/LzfKADM2/hrDZiR03XYSL4thjFkQNVfYnk9k7LTv9pKW0b+J2OrMun7+w\nbdXcNw+igvnYiBgNJRo0IC9O5nejqLGWwBfveAJPetxjy6PvBkLqgIw2glivmTrh\nKdoq/I2/ZcxT0GyhEVIHP9W8Hh5goNm+RbsB/hDYhK+5s2+rL1lwJrwhNBrHhG1u\nCtYmd2rD0J/mGf1cAw7t+hmwW0O7J9BVZw4YL/m4vDAsTO4zaeoAvDwsgQwPzPF1\nrmRtV+7jJHyIP/b021XIdIZU5KsXCCA3+B31mHJF1GLreG7WI+wClRsiNSbP7Zuw\nOnUOTDZc77Y4oaDKl0UL8tz1GNwX5G9U5h+FciTPKCtg1gGiqSkB/3BOON2WaVOb\n6Di9iAoH+dIjvWR/7ez7DAk/ITpGvBXS5RqaIXfB9pSJlVYsGp03ikgng1eJdXy4\n57XZnd47upHH88NTvIH9G/iOXQQCzF3MQXOqrJ/gem3ICeelvOoyNseHLvi8ZEqa\ns693CJWaQAK/jD1mhka7yQzmb/Y1I53crc2UqSxX4FqFYP8xymza4Cg/E6pPJerG\nLE/drJtbrIHTUlJB2Q==\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "examples/pokemon-service-tls/tests/testdata/localhost.key",
    "content": "-----BEGIN PRIVATE KEY-----\nMIIJQgIBADANBgkqhkiG9w0BAQEFAASCCSwwggkoAgEAAoICAQC6UwZzIDr2Kg0x\nPwrPQJ0/ZA/l6Us2eW0HKSiqgnBu8pL3j6XlcD//b0zg2kumEdwPE1fHeoHfXxuL\nFQg8G27ro6IixMZfzKtg8Dgg7de3n/bCnbPWU0ui7JbX6A9o+MrNyuOceaodL3QI\nUNCrF2/0jSsgUhD5TmGblP0eOvnGzfrjeXYVcCN6KCgS7C1UEO3jjKETJ4tIPAUk\nRLewfvcC+mu4x3Ea/YoNU3jCG5qNaWVEtOqmoG9VIzoltpX9UPayKall6iVKXzIo\nh6czY9Y90sgdIwQGDohpiClKnOjK+aHTz2l4BqIl9Ws3ndCOoNXJo3miz1JPTdkT\nNdBQjfyWm9YaZX1NyzlZ+J0sDURs+O/ITXMFtmHRKs//4QAvCSghGyUjwNe/P/1T\nkKrur1Tg4eNYH7KMTn8FfqjqF+up8nUt2DZ9On9NgS52Z58zx5HPHqx1i1M9kGtK\nmRGC+bF37qTdBS2wBCG0FMym8mlayCywPtSjobYlFqDnehP/ZzEbTdDLkerJJlQr\nVukVbTdbkUvc+roCSkbLWGdLGWJ+QemyLrV1uMJXm5F3FEIvIf18PcciZ5x636+e\n5mW+w/QwDOHS9uWL91wVnvFShKoVaeN6Cc+iF06YXoLyRe9YG3nU3iONb54vE8Cv\n0fSYm10i8QdYE01b2KK3MbPkbDSDiwIDAQABAoICAAvSJaLF2jJw44pgILGaZ1Tf\nZnTPKBLqLDpxPYpny8tLf3sjoBeeLKk/ffChWNL4khiwwPe/tB/1muaS1zASYNH5\nUoQt2L9jhEHvq5fx5FGFiAm700OB4Fa9939LfTgghKP+vxGtKazqrEwKGIWqRH45\nkJFfM4LQRWKyAUcFiyrg5DhspcsMD2wkwmTE8Bvua7FCjvDgqDZVJycFvGOprRvW\nwwvON2+fbek/hktGULgFBkQ6zXefI8ESgudj80Bxfl06RcGDU99T38zwzPD2i1/m\nZgTB38j562Sf8K1c/BXt4CWdzz1VVRHfGptvheJD85xJz0yUJk7atllrfMOyO7fp\n4nj6M4EGZGfqqM6CFULkspVSoza/nLN3sOkcZqG+EJ9x6bo/MfUudJ50+cq2BhlQ\njM43j+wtm9DYPnJNXIC5FCze41N5MSDfK9h2oC16E6H6/VG9Y+AMMVrEDvsXXuOi\nI0G8rcVanBdS3+nmmbTt4n0EVBLujB/ZJ/Qhsz/7QEeWn/xQNT4i00yRGG1mYJG0\nPs0cy6t6jVrRoZmf7aYcUat97vHEP/ddo2V6ANRiZR3wVjhhoX1lVC8T0llzjxr4\nFEIDDuS+fnFqK1uHGBxS4lPHy/57gpdpYskoQtykpXURh4k39Fc28mzxKsrBhX6V\nqY07bpgMNqYPC7SpkzO1AoIBAQDxEsGrZl0gNPhkXUwRSFvQxQDh0jqZAnEHdqOA\nnO49z7ym7e/LELtq7y/HP9sZxoVsAcOryGL0qUpFrQozXMnSzWwqkxwOIABpQ4gq\nmSJIZAUFVnV7m5h5xdln2jJ+xhvKv2vnXyuP3wRkiKrQPMqe6jE93cJb4YcMTK2V\nxgxcUTZjT5LoMUCZguT1LCT/xR66epfombhGEweeTHJKEwPbwq1HbOECsB8vjZ8G\nnwlm/Dt1fJXIo/+dvnfM+v79ebxKzC3t900Nj2eSCsX0bIU76zc1dqj+V/PD4+6h\nNojOFrAusVaaOj5ssTTzebBqsmHiOs1a4YR5MOYidPpqvZ+9AoIBAQDF3HHwiiUp\nzit5oIUkz1EkN7+jgEfrLNd9Kt3kNz3rTwXWoCE8tE4ctxBdn61RD3CHaT6PThNg\n6naENyTFcjrP4F0O0K76ErlYxNSoV7w/OyrRmRu21U4gTF9nWidxOSTOo1qGJdKI\nbaAk4tSFsjsdysx9xcLueqDQdGOobzeSBr6tJSq8cvEvW39E6cNHDxVk5CEg0Ffq\n7XA8+l+LfoP+6YL2du5jEe0K+/dTt2vYch8/9DloRezga21kV7Jea68Mqcxb5xsB\nCoh5pe3OipUtaAWe6G+J1pRuz9OldacI36VuHQa/YBI7Ws7dt3IhPQoHnh0qujYp\niasxJQLH5ODnAoIBAEYBE1pJfGt41lSWvxsZrwfd3Va2LKv4CIiJTAtyBsDOTVMQ\nLx0Bu9reoDo08dP3URE/JeoBY7L2Ygn/qMGnhTgAzRND6tazNkta//SWyVzKJqcZ\nJz6AvXNHH83Hj/g+YR2sHpJukYDS2zyybx/PN2uUSD5V4jW6NPQ+Y/3lJ/u63ZdT\nKS7h9oddek0zx366aCTwqqIx2VAIAKNYQav+/5TWYGkoVeLo7/VoI7DRh/Ju9nk0\nd25vKTBOeg19KYTD0AjMZ939fVOdvA6tsDQ9OydeM4cD8SkCs1fEHayU4H8wGXNF\nrgdVOIFpqB23zaH+MOx39OAaMtTafUmuPHW4oOUCggEAe/jm70cvh+UlOl0Ib4ry\nlVXU3nYXGdSL5GJCi6bNRi3KQ7MrgCSdOMK/H1pYNw0MfdvElffejn/56FfA03IC\nRZOX2xuINyoaNfOGJ0Bps9i3uIJNah52iCgyMsi7I+chF9QkeR8jrdW6XMI/VNHa\n1ozl2fxaaiAtuM7kTnn5AKb3O/eoslD2q6yRrrUlZNWfmwqRc0T3gTxqcdqSmQ2Z\nWNQo+ZKFRU/LDXHYgvzPNtwylljIy3vcsrS84v1LxnuEP9P4NrE0K0/VORttSFdu\npvehZfLPSDdJ47CWNPrlwNqYhcjsHGbupX/9U9CIUykyqpk4PzhTjW0z9WPyPRs8\niwKCAQEAsQRYdefBm/lYil70rlHvgxOvoCf8wTy6kiUTHFMZWUcbPB9+5C8HRRVu\nkg+QTFn502H6gZhs3VkzpE4y1tClOe0s0HAfdBNfjP1Kk8i54hYOUzu0RAlOg4t+\nDcUBSmeXgXbYtzKLb2WqifTjOtuBYD515vOtcIM/19EaAMeccH0yWcvWDwFJu0jN\n6DXUPTwIetMnmui5X1oFVgu9XDdXmhC7mFvMtaADHhh37hNqDlKDYpHQMMEJT/cT\nWJvTCDK6nLkAYltPwehV74v2BEVknk0GHP1IcCLOjv6v3c1kt0TPZtnUr8pIfZGi\nM8nPgza9amAhHxA8xPQgBs3l8d6k3w==\n-----END PRIVATE KEY-----\n"
  },
  {
    "path": "examples/python/.gitignore",
    "content": "pokemon-service-client/\npokemon-service-server-sdk/\nwheels/\n__pycache__\n"
  },
  {
    "path": "examples/python/Cargo.toml",
    "content": "# Without this configuration, the workspace will be read from `rust-runtime`, causing the build to fail.\n[workspace]\nmembers = [\n    \"pokemon-service-test\",\n    \"pokemon-service-server-sdk\",\n    \"pokemon-service-client\"\n]\n\n[profile.release]\nlto = true\n"
  },
  {
    "path": "examples/python/Makefile",
    "content": "SRC_DIR := $(shell git rev-parse --show-toplevel)\nCUR_DIR := $(shell pwd)\nGRADLE := $(SRC_DIR)/gradlew\nWHEELS := $(CUR_DIR)/wheels\nSERVER_SDK_DST := $(CUR_DIR)/pokemon-service-server-sdk\nCLIENT_SDK_DST := $(CUR_DIR)/pokemon-service-client\nSERVER_SDK_SRC := $(SRC_DIR)/codegen-server-test/codegen-server-test-python/build/smithyprojections/codegen-server-test-python/pokemon-service-server-sdk/rust-server-codegen-python\nCLIENT_SDK_SRC := $(SRC_DIR)/codegen-client-test/build/smithyprojections/codegen-client-test/pokemon-service-client/rust-client-codegen\n\nHAS_MATURIN := $(shell command -v maturin 2> /dev/null)\n\nall: codegen\n\ncodegen:\n\t$(GRADLE) --project-dir $(SRC_DIR) -P modules='pokemon-service-server-sdk,pokemon-service-client' :codegen-client-test:assemble :codegen-server-test:codegen-server-test-python:assemble\n\tmkdir -p $(SERVER_SDK_DST) $(CLIENT_SDK_DST) $(WHEELS)\n\tcp -av $(SERVER_SDK_SRC)/* $(SERVER_SDK_DST)/\n\tcp -av $(CLIENT_SDK_SRC)/* $(CLIENT_SDK_DST)/\n\nensure-maturin:\nifndef HAS_MATURIN\n    $(error \"maturin is not available; please install it via 'pip install maturin' or 'cargo install maturin'\")\nendif\n\n# Note on `--compatibility linux`: Maturin by default uses `manylinux_x_y` but it is not supported\n# by our current CI version (3.7.10), we can drop `--compatibility linux` when we switch to higher Python version.\n# For more detail: https://github.com/pypa/manylinux\nbuild-wheel: ensure-maturin\n\tcd $(SERVER_SDK_DST) && maturin build --out $(WHEELS) --compatibility linux\n\nbuild-wheel-release: ensure-maturin\n\tcd $(SERVER_SDK_DST) && maturin build --out $(WHEELS) --compatibility linux --release\n\ninstall-wheel:\n\tfind $(WHEELS) -type f -name '*.whl' | xargs python3 -m pip install --user --force-reinstall\n\ngenerate-stubs:\n\tbash $(SERVER_SDK_DST)/stubgen.sh pokemon_service_server_sdk $(SERVER_SDK_DST)/Cargo.toml $(SERVER_SDK_DST)/python/pokemon_service_server_sdk\n\nbuild: codegen\n\t$(MAKE) generate-stubs\n\t$(MAKE) build-wheel\n\nrelease: codegen\n\t$(MAKE) generate-stubs\n\t$(MAKE) build-wheel-release\n\nrun: build install-wheel\n\tpython3 $(CUR_DIR)/pokemon_service.py\n\nrun-release: release install-wheel\n\tpython3 $(CUR_DIR)/pokemon_service.py\n\npy-check: install-wheel\n\tpython3 -m mypy pokemon_service.py\n\ntest: build py-check\n\tcargo test\n\nclippy: codegen\n\tcargo clippy\n\ndoc-open: codegen\n\tcargo doc --no-deps --open\n\nclean:\n\tcargo clean || echo \"Unable to run cargo clean\"\n\ndistclean: clean\n\trm -rf $(SERVER_SDK_DST) $(SERVER_SDK_SRC) $(CLIENT_SDK_DST) $(CLIENT_SDK_SRC) $(WHEELS) $(CUR_DIR)/Cargo.lock\n\n.PHONY: all\n"
  },
  {
    "path": "examples/python/README.md",
    "content": "# Smithy Rust/Python Server SDK example\n\nThis folder contains an example service called Pokémon Service used to showcase\nthe service framework Python bindings capabilities and to run benchmarks.\n\nThe Python implementation of the service can be found inside\n[pokemon_service.py](./pokemon_service.py).\n\n* [Build](#build)\n    * [Build dependencies](#build-dependencies)\n    * [Makefile](#makefile)\n    * [Python stub generation](#python-stub-generation)\n* [Run](#run)\n* [Test](#test)\n* [MacOs](#macos)\n* [Running servers on AWS Lambda](#running-servers-on-aws-lambda)\n\n## Build\n\nSince this example requires both the server and client SDK to be code-generated\nfrom their [model](/codegen-server-test/model/pokemon.smithy), a Makefile is\nprovided to build and run the service. Just run `make build` to prepare the first\nbuild.\n\n### Build dependencies\n\nEnsure these dependencies are installed.\n\n```bash\npip install maturin uvloop aiohttp mypy\n```\n\nThe server can depend on [uvloop](https://pypi.org/project/uvloop/) for a faster\nevent loop implementation and it will be automatically used instead of the standard\nlibrary event loop if it is found in the dependencies' closure.\n\n### Makefile\n\nThe build logic is drive by the Makefile:\n\n* `make codegen`: run the codegenerator.\n* `make build`: build the Maturin package in debug mode (includes type stubs\n  generation).\n* `make release`: build the Maturin package in release mode (includes type stubs\n  generation).\n* `make install-wheel`: install the latest release or debug wheel using `pip`.\n* `make run`: run the example server.\n* `make test`: run the end-to-end integration test.\n* `make clean`: clean the Cargo artefacts.\n* `make dist-clean`: clean the Cargo artefacts and generated folders.\n\n### Python stub generation\n\nWe support the generation of mypy python stubs and every SDK crate ships with\na script called `stubgen.sh`. **Note that the script is not called\nautomatically as part of the build**. We suggest users to call it after code generation.\nIt will do first compilation of the crate, generate the types and exit.\n\nThe script takes some command line arguments:\n\n```bash\n./stubgen.sh module_name manifest_path output_directory\n```\n\n* module_name: name of the Python module to generate stubs for, IE `pokemon_service_server_sdk`.\n* manifest_path: path for the crate manifest used to build the types.\n* output_directory: directory where to generate the stub hierarchy. **This\n  directory should be a folder `python/$module_name` in the root of the Maturin package.**\n\n## Run\n\n`make run` can be used to start the Pokémon service on `http://localhost:13734`.\n\n## Test\n\n`make test` can be used to spawn the Python service and run some simple integration\ntests against it.\n\nMore info can be found in the `tests` folder of `pokemon-service-test` package.\n\n## MacOs\n\nTo compile and test on MacOs, please follow the official PyO3 guidelines on how\nto [configure your linker](https://pyo3.rs/latest/building_and_distribution.html?highlight=rustflags#macos).\n\nPlease note that the `.cargo/config.toml` with linkers override can be local to\nyour project.\n\n## Running servers on AWS Lambda\n\n`aws-smithy-http-server-python` supports running your services on [AWS Lambda](https://aws.amazon.com/lambda/).\n\nYou need to use `run_lambda` method instead of `run` method to start\nthe [custom runtime](https://docs.aws.amazon.com/lambda/latest/dg/runtimes-custom.html)\ninstead of the [Hyper](https://hyper.rs/) HTTP server.\n\nIn your `app.py`:\n\n```diff\nfrom pokemon_service_server_sdk import App\nfrom pokemon_service_server_sdk.error import ResourceNotFoundException\n\n# ...\n\n# Get the number of requests served by this server.\n@app.get_server_statistics\ndef get_server_statistics(\n    _: GetServerStatisticsInput, context: Context\n) -> GetServerStatisticsOutput:\n    calls_count = context.get_calls_count()\n    logging.debug(\"The service handled %d requests\", calls_count)\n    return GetServerStatisticsOutput(calls_count=calls_count)\n\n# ...\n\n-app.run()\n+app.run_lambda()\n```\n\n`aws-smithy-http-server-python` comes with a\n[custom runtime](https://docs.aws.amazon.com/lambda/latest/dg/runtimes-custom.html)\nso you should run your service without any provided runtimes.\nYou can achieve that with a `Dockerfile` similar to this:\n\n```dockerfile\n# You can use any image that has your desired Python version\nFROM public.ecr.aws/lambda/python:3.8-x86_64\n\n# Copy your application code to `LAMBDA_TASK_ROOT`\nCOPY app.py ${LAMBDA_TASK_ROOT}\n\n# When you build your Server SDK for your service, you will get a Python wheel.\n# You just need to copy that wheel and install it via `pip` inside your image.\n# Note that you need to build your library for Linux, and Python version used to\n# build your SDK should match with your image's Python version.\n# For cross compiling, you can consult to:\n# https://pyo3.rs/latest/building_and_distribution.html#cross-compiling\nCOPY wheels/ ${LAMBDA_TASK_ROOT}/wheels\nRUN pip3 install ${LAMBDA_TASK_ROOT}/wheels/*.whl\n\n# You can install your application's other dependencies listed in `requirements.txt`.\nCOPY requirements.txt .\nRUN pip3 install -r requirements.txt --target \"${LAMBDA_TASK_ROOT}\"\n\n# Create a symlink for your application's entrypoint,\n# so we can use `/app.py` to refer it\nRUN ln -s ${LAMBDA_TASK_ROOT}/app.py /app.py\n\n# By default `public.ecr.aws/lambda/python` images comes with Python runtime,\n# we need to override `ENTRYPOINT` and `CMD` to not call that runtime and\n# instead run directly your service and it will start our custom runtime.\nENTRYPOINT [ \"/var/lang/bin/python3.8\" ]\nCMD [ \"/app.py\" ]\n```\n\nSee [https://docs.aws.amazon.com/lambda/latest/dg/images-create.html#images-create-from-base](https://docs.aws.amazon.com/lambda/latest/dg/images-create.html#images-create-from-base)\nfor more details on building your custom image.\n"
  },
  {
    "path": "examples/python/mypy.ini",
    "content": "#  Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n#  SPDX-License-Identifier: Apache-2.0\n\n[mypy]\nstrict = True\n\n[mypy-aiohttp.*]\nignore_missing_imports = True\n"
  },
  {
    "path": "examples/python/pokemon-service-test/Cargo.toml",
    "content": "[package]\nname = \"pokemon-service-test\"\nversion = \"0.1.0\"\nedition = \"2021\"\npublish = false\nauthors = [\"Smithy-rs Server Team <smithy-rs-server@amazon.com>\"]\ndescription = \"Run tests against the Python server implementation\"\n\n[dev-dependencies]\nrand = \"0.8\"\nasync-stream = \"0.3\"\ncommand-group = \"2.1.0\"\ntokio = { version = \"1.20.1\", features = [\"full\"] }\nserial_test = \"3.1.1\"\nrustls-pemfile = \"1.0.1\"\ntokio-rustls = \"0.24.0\"\nhyper-rustls = { version = \"0.24\", features = [\"http2\"] }\n\n# Local paths\naws-smithy-runtime  = { path = \"../../../rust-runtime/aws-smithy-runtime/\", features = [\"client\", \"connector-hyper-0-14-x\"] }\naws-smithy-http = { path = \"../../../rust-runtime/aws-smithy-http/\" }\naws-smithy-types  = { path = \"../../../rust-runtime/aws-smithy-types/\" }\npokemon-service-client = { path = \"../pokemon-service-client/\", features = [\"behavior-version-latest\"] }\n"
  },
  {
    "path": "examples/python/pokemon-service-test/tests/helpers.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::fs::File;\nuse std::io::BufReader;\nuse std::process::Command;\nuse std::time::Duration;\n\nuse aws_smithy_runtime::client::http::hyper_014::HyperClientBuilder;\nuse command_group::{CommandGroup, GroupChild};\nuse pokemon_service_client::{Client, Config};\nuse tokio::time;\n\nconst TEST_KEY: &str = concat!(env!(\"CARGO_MANIFEST_DIR\"), \"/tests/testdata/localhost.key\");\nconst TEST_CERT: &str = concat!(env!(\"CARGO_MANIFEST_DIR\"), \"/tests/testdata/localhost.crt\");\n\npub type PokemonClient = Client;\n\nenum PokemonServiceVariant {\n    Http,\n    Http2,\n}\n\nimpl PokemonServiceVariant {\n    async fn run_process(&self) -> GroupChild {\n        let mut args = vec![\"../pokemon_service.py\".to_string()];\n\n        match self {\n            PokemonServiceVariant::Http => {}\n            PokemonServiceVariant::Http2 => {\n                args.push(\"--enable-tls\".to_string());\n                args.push(format!(\"--tls-key-path={TEST_KEY}\"));\n                args.push(format!(\"--tls-cert-path={TEST_CERT}\"));\n            }\n        }\n\n        let process = Command::new(\"python3\")\n            .args(args)\n            .group_spawn()\n            .expect(\"failed to spawn the Pokémon Service program\");\n\n        // The Python interpreter takes a little to startup.\n        time::sleep(Duration::from_secs(2)).await;\n\n        process\n    }\n\n    fn base_url(&self) -> &'static str {\n        match self {\n            PokemonServiceVariant::Http => \"http://localhost:13734\",\n            PokemonServiceVariant::Http2 => \"https://localhost:13734\",\n        }\n    }\n}\n\npub(crate) struct PokemonService {\n    // We need to ensure all processes forked by the Python interpreter\n    // are on the same process group, otherwise only the main process\n    // will be killed during drop, leaving the test worker alive.\n    child_process: GroupChild,\n}\n\nimpl PokemonService {\n    #[allow(dead_code)]\n    pub(crate) async fn run() -> Self {\n        Self {\n            child_process: PokemonServiceVariant::Http.run_process().await,\n        }\n    }\n\n    #[allow(dead_code)]\n    pub(crate) async fn run_http2() -> Self {\n        Self {\n            child_process: PokemonServiceVariant::Http2.run_process().await,\n        }\n    }\n}\n\nimpl Drop for PokemonService {\n    fn drop(&mut self) {\n        self.child_process\n            .kill()\n            .expect(\"failed to kill Pokémon Service program\");\n        self.child_process.wait().ok();\n    }\n}\n\n#[allow(dead_code)]\npub fn client() -> PokemonClient {\n    let base_url = PokemonServiceVariant::Http.base_url();\n    let config = Config::builder().endpoint_url(base_url).build();\n    Client::from_conf(config)\n}\n\n#[allow(dead_code)]\npub fn http2_client() -> PokemonClient {\n    // Create custom cert store and add our test certificate to prevent unknown cert issues.\n    let mut reader = BufReader::new(File::open(TEST_CERT).expect(\"could not open certificate\"));\n    let certs = rustls_pemfile::certs(&mut reader).expect(\"could not parse certificate\");\n    let mut roots = tokio_rustls::rustls::RootCertStore::empty();\n    roots.add_parsable_certificates(&certs);\n\n    let tls_connector = hyper_rustls::HttpsConnectorBuilder::new()\n        .with_tls_config(\n            tokio_rustls::rustls::ClientConfig::builder()\n                .with_safe_defaults()\n                .with_root_certificates(roots)\n                .with_no_client_auth(),\n        )\n        .https_only()\n        .enable_http2()\n        .build();\n\n    let base_url = PokemonServiceVariant::Http2.base_url();\n    let config = Config::builder()\n        .http_client(HyperClientBuilder::new().build(tls_connector))\n        .endpoint_url(base_url)\n        .build();\n    Client::from_conf(config)\n}\n"
  },
  {
    "path": "examples/python/pokemon-service-test/tests/simple_integration_test.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n// Files here are for running integration tests.\n// These tests only have access to your crate's public API.\n// See: https://doc.rust-lang.org/book/ch11-03-test-organization.html#integration-tests\n\nuse async_stream::stream;\nuse aws_smithy_types::error::display::DisplayErrorContext;\nuse rand::Rng;\nuse serial_test::serial;\n\nuse crate::helpers::{client, http2_client, PokemonClient, PokemonService};\nuse pokemon_service_client::{\n    types::error::{AttemptCapturingPokemonEventError, MasterBallUnsuccessful},\n    types::{AttemptCapturingPokemonEvent, CapturingEvent, CapturingPayload},\n};\n\nmod helpers;\n\n#[tokio::test]\n#[serial]\nasync fn simple_integration_test() {\n    let _program = PokemonService::run().await;\n    simple_integration_test_with_client(client()).await;\n}\n\n#[tokio::test]\n#[serial]\nasync fn simple_integration_test_http2() {\n    let _program = PokemonService::run_http2().await;\n    simple_integration_test_with_client(http2_client()).await;\n}\n\nasync fn simple_integration_test_with_client(client: PokemonClient) {\n    let service_statistics_out = client.get_server_statistics().send().await.unwrap();\n    assert_eq!(0, service_statistics_out.calls_count);\n\n    let pokemon_species_output = client\n        .get_pokemon_species()\n        .name(\"pikachu\")\n        .send()\n        .await\n        .unwrap();\n    assert_eq!(\"pikachu\", pokemon_species_output.name());\n\n    let service_statistics_out = client.get_server_statistics().send().await.unwrap();\n    assert_eq!(1, service_statistics_out.calls_count);\n\n    let pokemon_species_error = client\n        .get_pokemon_species()\n        .name(\"some_pokémon\")\n        .send()\n        .await\n        .unwrap_err();\n    let message = DisplayErrorContext(pokemon_species_error).to_string();\n    let expected =\n        r#\"ResourceNotFoundError [ResourceNotFoundException]: Requested Pokémon not available\"#;\n    assert!(\n        message.contains(expected),\n        \"expected '{message}' to contain '{expected}'\"\n    );\n\n    let service_statistics_out = client.get_server_statistics().send().await.unwrap();\n    assert_eq!(2, service_statistics_out.calls_count);\n\n    let _health_check = client.check_health().send().await.unwrap();\n}\n\n#[tokio::test]\n#[serial]\nasync fn event_stream_test() {\n    let _program = PokemonService::run().await;\n\n    let mut team = vec![];\n    let input_stream = stream! {\n        // Always Pikachu\n        yield Ok(AttemptCapturingPokemonEvent::Event(\n            CapturingEvent::builder()\n            .payload(CapturingPayload::builder()\n                .name(\"Pikachu\")\n                .pokeball(\"Master Ball\")\n                .build())\n            .build()\n        ));\n        yield Ok(AttemptCapturingPokemonEvent::Event(\n            CapturingEvent::builder()\n            .payload(CapturingPayload::builder()\n                .name(\"Regieleki\")\n                .pokeball(\"Fast Ball\")\n                .build())\n            .build()\n        ));\n        yield Err(AttemptCapturingPokemonEventError::MasterBallUnsuccessful(MasterBallUnsuccessful::builder().build()));\n        // The next event should not happen\n        yield Ok(AttemptCapturingPokemonEvent::Event(\n            CapturingEvent::builder()\n            .payload(CapturingPayload::builder()\n                .name(\"Charizard\")\n                .pokeball(\"Great Ball\")\n                .build())\n            .build()\n        ));\n    };\n\n    // Throw many!\n    let mut output = client()\n        .capture_pokemon()\n        .region(\"Kanto\")\n        .events(input_stream.into())\n        .send()\n        .await\n        .unwrap();\n    loop {\n        match output.events.recv().await {\n            Ok(Some(capture)) => {\n                let pokemon = capture.as_event().unwrap().name.as_ref().unwrap().clone();\n                let pokedex = capture\n                    .as_event()\n                    .unwrap()\n                    .pokedex_update\n                    .as_ref()\n                    .unwrap()\n                    .clone();\n                let shiny = if *capture.as_event().unwrap().shiny.as_ref().unwrap() {\n                    \"\"\n                } else {\n                    \"not \"\n                };\n                let expected_pokedex: Vec<u8> = (0..255).collect();\n                println!(\"captured {} ({}shiny)\", pokemon, shiny);\n                if expected_pokedex == pokedex.into_inner() {\n                    println!(\"pokedex updated\")\n                }\n                team.push(pokemon);\n            }\n            Err(e) => {\n                println!(\"error from the server: {:?}\", e);\n                break;\n            }\n            Ok(None) => break,\n        }\n    }\n\n    while team.len() < 6 {\n        let pokeball = get_pokeball();\n        let pokemon = get_pokemon_to_capture();\n        let input_stream = stream! {\n            yield Ok(AttemptCapturingPokemonEvent::Event(\n                CapturingEvent::builder()\n                .payload(CapturingPayload::builder()\n                    .name(pokemon)\n                    .pokeball(pokeball)\n                    .build())\n                .build()\n            ))\n        };\n        let mut output = client()\n            .capture_pokemon()\n            .region(\"Kanto\")\n            .events(input_stream.into())\n            .send()\n            .await\n            .unwrap();\n        match output.events.recv().await {\n            Ok(Some(capture)) => {\n                let pokemon = capture.as_event().unwrap().name.as_ref().unwrap().clone();\n                let pokedex = capture\n                    .as_event()\n                    .unwrap()\n                    .pokedex_update\n                    .as_ref()\n                    .unwrap()\n                    .clone();\n                let shiny = if *capture.as_event().unwrap().shiny.as_ref().unwrap() {\n                    \"\"\n                } else {\n                    \"not \"\n                };\n                let expected_pokedex: Vec<u8> = (0..255).collect();\n                println!(\"captured {} ({}shiny)\", pokemon, shiny);\n                if expected_pokedex == pokedex.into_inner() {\n                    println!(\"pokedex updated\")\n                }\n                team.push(pokemon);\n            }\n            Err(e) => {\n                println!(\"error from the server: {:?}\", e);\n                break;\n            }\n            Ok(None) => {}\n        }\n    }\n    println!(\"Team: {:?}\", team);\n}\n\nfn get_pokeball() -> String {\n    let random = rand::thread_rng().gen_range(0..100);\n    let pokeball = if random < 5 {\n        \"Master Ball\"\n    } else if random < 30 {\n        \"Great Ball\"\n    } else if random < 80 {\n        \"Fast Ball\"\n    } else {\n        \"Smithy Ball\"\n    };\n    pokeball.to_string()\n}\n\nfn get_pokemon_to_capture() -> String {\n    let pokemons = vec![\"Charizard\", \"Pikachu\", \"Regieleki\"];\n    pokemons[rand::thread_rng().gen_range(0..pokemons.len())].to_string()\n}\n"
  },
  {
    "path": "examples/python/pokemon-service-test/tests/testdata/localhost.crt",
    "content": "-----BEGIN CERTIFICATE-----\nMIIFGTCCAwGgAwIBAgIUN/FD3OayKwJt9hXNKo4JKxqFSK4wDQYJKoZIhvcNAQEL\nBQAwFDESMBAGA1UEAwwJbG9jYWxob3N0MB4XDTIyMDgxNzE1MjQzMFoXDTMyMDgx\nNDE1MjQzMFowFDESMBAGA1UEAwwJbG9jYWxob3N0MIICIjANBgkqhkiG9w0BAQEF\nAAOCAg8AMIICCgKCAgEAulMGcyA69ioNMT8Kz0CdP2QP5elLNnltBykoqoJwbvKS\n94+l5XA//29M4NpLphHcDxNXx3qB318bixUIPBtu66OiIsTGX8yrYPA4IO3Xt5/2\nwp2z1lNLouyW1+gPaPjKzcrjnHmqHS90CFDQqxdv9I0rIFIQ+U5hm5T9Hjr5xs36\n43l2FXAjeigoEuwtVBDt44yhEyeLSDwFJES3sH73AvpruMdxGv2KDVN4whuajWll\nRLTqpqBvVSM6JbaV/VD2simpZeolSl8yKIenM2PWPdLIHSMEBg6IaYgpSpzoyvmh\n089peAaiJfVrN53QjqDVyaN5os9ST03ZEzXQUI38lpvWGmV9Tcs5WfidLA1EbPjv\nyE1zBbZh0SrP/+EALwkoIRslI8DXvz/9U5Cq7q9U4OHjWB+yjE5/BX6o6hfrqfJ1\nLdg2fTp/TYEudmefM8eRzx6sdYtTPZBrSpkRgvmxd+6k3QUtsAQhtBTMpvJpWsgs\nsD7Uo6G2JRag53oT/2cxG03Qy5HqySZUK1bpFW03W5FL3Pq6AkpGy1hnSxlifkHp\nsi61dbjCV5uRdxRCLyH9fD3HImecet+vnuZlvsP0MAzh0vbli/dcFZ7xUoSqFWnj\negnPohdOmF6C8kXvWBt51N4jjW+eLxPAr9H0mJtdIvEHWBNNW9iitzGz5Gw0g4sC\nAwEAAaNjMGEwHQYDVR0OBBYEFEoLkB78Z6jgPPmOyf0XnWo/LjA9MB8GA1UdIwQY\nMBaAFEoLkB78Z6jgPPmOyf0XnWo/LjA9MBQGA1UdEQQNMAuCCWxvY2FsaG9zdDAJ\nBgNVHRMEAjAAMA0GCSqGSIb3DQEBCwUAA4ICAQC17OljBEEVYefzk2mwg20AXDtL\nPUJ46hLrUM7BcNBjd8AbtrLH/pdCRCexnv7tzYbwMhDNdqHiIcXDHEMNP3gXryB2\nckU5ms/LzfKADM2/hrDZiR03XYSL4thjFkQNVfYnk9k7LTv9pKW0b+J2OrMun7+w\nbdXcNw+igvnYiBgNJRo0IC9O5nejqLGWwBfveAJPetxjy6PvBkLqgIw2glivmTrh\nKdoq/I2/ZcxT0GyhEVIHP9W8Hh5goNm+RbsB/hDYhK+5s2+rL1lwJrwhNBrHhG1u\nCtYmd2rD0J/mGf1cAw7t+hmwW0O7J9BVZw4YL/m4vDAsTO4zaeoAvDwsgQwPzPF1\nrmRtV+7jJHyIP/b021XIdIZU5KsXCCA3+B31mHJF1GLreG7WI+wClRsiNSbP7Zuw\nOnUOTDZc77Y4oaDKl0UL8tz1GNwX5G9U5h+FciTPKCtg1gGiqSkB/3BOON2WaVOb\n6Di9iAoH+dIjvWR/7ez7DAk/ITpGvBXS5RqaIXfB9pSJlVYsGp03ikgng1eJdXy4\n57XZnd47upHH88NTvIH9G/iOXQQCzF3MQXOqrJ/gem3ICeelvOoyNseHLvi8ZEqa\ns693CJWaQAK/jD1mhka7yQzmb/Y1I53crc2UqSxX4FqFYP8xymza4Cg/E6pPJerG\nLE/drJtbrIHTUlJB2Q==\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "examples/python/pokemon-service-test/tests/testdata/localhost.key",
    "content": "-----BEGIN PRIVATE KEY-----\nMIIJQgIBADANBgkqhkiG9w0BAQEFAASCCSwwggkoAgEAAoICAQC6UwZzIDr2Kg0x\nPwrPQJ0/ZA/l6Us2eW0HKSiqgnBu8pL3j6XlcD//b0zg2kumEdwPE1fHeoHfXxuL\nFQg8G27ro6IixMZfzKtg8Dgg7de3n/bCnbPWU0ui7JbX6A9o+MrNyuOceaodL3QI\nUNCrF2/0jSsgUhD5TmGblP0eOvnGzfrjeXYVcCN6KCgS7C1UEO3jjKETJ4tIPAUk\nRLewfvcC+mu4x3Ea/YoNU3jCG5qNaWVEtOqmoG9VIzoltpX9UPayKall6iVKXzIo\nh6czY9Y90sgdIwQGDohpiClKnOjK+aHTz2l4BqIl9Ws3ndCOoNXJo3miz1JPTdkT\nNdBQjfyWm9YaZX1NyzlZ+J0sDURs+O/ITXMFtmHRKs//4QAvCSghGyUjwNe/P/1T\nkKrur1Tg4eNYH7KMTn8FfqjqF+up8nUt2DZ9On9NgS52Z58zx5HPHqx1i1M9kGtK\nmRGC+bF37qTdBS2wBCG0FMym8mlayCywPtSjobYlFqDnehP/ZzEbTdDLkerJJlQr\nVukVbTdbkUvc+roCSkbLWGdLGWJ+QemyLrV1uMJXm5F3FEIvIf18PcciZ5x636+e\n5mW+w/QwDOHS9uWL91wVnvFShKoVaeN6Cc+iF06YXoLyRe9YG3nU3iONb54vE8Cv\n0fSYm10i8QdYE01b2KK3MbPkbDSDiwIDAQABAoICAAvSJaLF2jJw44pgILGaZ1Tf\nZnTPKBLqLDpxPYpny8tLf3sjoBeeLKk/ffChWNL4khiwwPe/tB/1muaS1zASYNH5\nUoQt2L9jhEHvq5fx5FGFiAm700OB4Fa9939LfTgghKP+vxGtKazqrEwKGIWqRH45\nkJFfM4LQRWKyAUcFiyrg5DhspcsMD2wkwmTE8Bvua7FCjvDgqDZVJycFvGOprRvW\nwwvON2+fbek/hktGULgFBkQ6zXefI8ESgudj80Bxfl06RcGDU99T38zwzPD2i1/m\nZgTB38j562Sf8K1c/BXt4CWdzz1VVRHfGptvheJD85xJz0yUJk7atllrfMOyO7fp\n4nj6M4EGZGfqqM6CFULkspVSoza/nLN3sOkcZqG+EJ9x6bo/MfUudJ50+cq2BhlQ\njM43j+wtm9DYPnJNXIC5FCze41N5MSDfK9h2oC16E6H6/VG9Y+AMMVrEDvsXXuOi\nI0G8rcVanBdS3+nmmbTt4n0EVBLujB/ZJ/Qhsz/7QEeWn/xQNT4i00yRGG1mYJG0\nPs0cy6t6jVrRoZmf7aYcUat97vHEP/ddo2V6ANRiZR3wVjhhoX1lVC8T0llzjxr4\nFEIDDuS+fnFqK1uHGBxS4lPHy/57gpdpYskoQtykpXURh4k39Fc28mzxKsrBhX6V\nqY07bpgMNqYPC7SpkzO1AoIBAQDxEsGrZl0gNPhkXUwRSFvQxQDh0jqZAnEHdqOA\nnO49z7ym7e/LELtq7y/HP9sZxoVsAcOryGL0qUpFrQozXMnSzWwqkxwOIABpQ4gq\nmSJIZAUFVnV7m5h5xdln2jJ+xhvKv2vnXyuP3wRkiKrQPMqe6jE93cJb4YcMTK2V\nxgxcUTZjT5LoMUCZguT1LCT/xR66epfombhGEweeTHJKEwPbwq1HbOECsB8vjZ8G\nnwlm/Dt1fJXIo/+dvnfM+v79ebxKzC3t900Nj2eSCsX0bIU76zc1dqj+V/PD4+6h\nNojOFrAusVaaOj5ssTTzebBqsmHiOs1a4YR5MOYidPpqvZ+9AoIBAQDF3HHwiiUp\nzit5oIUkz1EkN7+jgEfrLNd9Kt3kNz3rTwXWoCE8tE4ctxBdn61RD3CHaT6PThNg\n6naENyTFcjrP4F0O0K76ErlYxNSoV7w/OyrRmRu21U4gTF9nWidxOSTOo1qGJdKI\nbaAk4tSFsjsdysx9xcLueqDQdGOobzeSBr6tJSq8cvEvW39E6cNHDxVk5CEg0Ffq\n7XA8+l+LfoP+6YL2du5jEe0K+/dTt2vYch8/9DloRezga21kV7Jea68Mqcxb5xsB\nCoh5pe3OipUtaAWe6G+J1pRuz9OldacI36VuHQa/YBI7Ws7dt3IhPQoHnh0qujYp\niasxJQLH5ODnAoIBAEYBE1pJfGt41lSWvxsZrwfd3Va2LKv4CIiJTAtyBsDOTVMQ\nLx0Bu9reoDo08dP3URE/JeoBY7L2Ygn/qMGnhTgAzRND6tazNkta//SWyVzKJqcZ\nJz6AvXNHH83Hj/g+YR2sHpJukYDS2zyybx/PN2uUSD5V4jW6NPQ+Y/3lJ/u63ZdT\nKS7h9oddek0zx366aCTwqqIx2VAIAKNYQav+/5TWYGkoVeLo7/VoI7DRh/Ju9nk0\nd25vKTBOeg19KYTD0AjMZ939fVOdvA6tsDQ9OydeM4cD8SkCs1fEHayU4H8wGXNF\nrgdVOIFpqB23zaH+MOx39OAaMtTafUmuPHW4oOUCggEAe/jm70cvh+UlOl0Ib4ry\nlVXU3nYXGdSL5GJCi6bNRi3KQ7MrgCSdOMK/H1pYNw0MfdvElffejn/56FfA03IC\nRZOX2xuINyoaNfOGJ0Bps9i3uIJNah52iCgyMsi7I+chF9QkeR8jrdW6XMI/VNHa\n1ozl2fxaaiAtuM7kTnn5AKb3O/eoslD2q6yRrrUlZNWfmwqRc0T3gTxqcdqSmQ2Z\nWNQo+ZKFRU/LDXHYgvzPNtwylljIy3vcsrS84v1LxnuEP9P4NrE0K0/VORttSFdu\npvehZfLPSDdJ47CWNPrlwNqYhcjsHGbupX/9U9CIUykyqpk4PzhTjW0z9WPyPRs8\niwKCAQEAsQRYdefBm/lYil70rlHvgxOvoCf8wTy6kiUTHFMZWUcbPB9+5C8HRRVu\nkg+QTFn502H6gZhs3VkzpE4y1tClOe0s0HAfdBNfjP1Kk8i54hYOUzu0RAlOg4t+\nDcUBSmeXgXbYtzKLb2WqifTjOtuBYD515vOtcIM/19EaAMeccH0yWcvWDwFJu0jN\n6DXUPTwIetMnmui5X1oFVgu9XDdXmhC7mFvMtaADHhh37hNqDlKDYpHQMMEJT/cT\nWJvTCDK6nLkAYltPwehV74v2BEVknk0GHP1IcCLOjv6v3c1kt0TPZtnUr8pIfZGi\nM8nPgza9amAhHxA8xPQgBs3l8d6k3w==\n-----END PRIVATE KEY-----\n"
  },
  {
    "path": "examples/python/pokemon_service.py",
    "content": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n#  Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n#  SPDX-License-Identifier: Apache-2.0\n\nimport argparse\nimport logging\nimport random\nfrom dataclasses import dataclass\nfrom threading import Lock\nfrom typing import Any, AsyncIterator, Awaitable, Callable, Dict, List, Optional\n\nfrom pokemon_service_server_sdk import App\nfrom pokemon_service_server_sdk.aws_lambda import LambdaContext\nfrom pokemon_service_server_sdk.error import (\n    InvalidPokeballError,\n    MasterBallUnsuccessful,\n    ResourceNotFoundException,\n    UnsupportedRegionError,\n    StorageAccessNotAuthorized,\n)\nfrom pokemon_service_server_sdk.input import (\n    GetStorageInput,\n    CapturePokemonInput,\n    CheckHealthInput,\n    DoNothingInput,\n    GetPokemonSpeciesInput,\n    GetServerStatisticsInput,\n    StreamPokemonRadioInput,\n)\nfrom pokemon_service_server_sdk.logging import TracingHandler\nfrom pokemon_service_server_sdk.middleware import MiddlewareException, Request, Response\nfrom pokemon_service_server_sdk.model import (\n    CaptureEvent,\n    CapturePokemonEvents,\n    FlavorText,\n    Language,\n)\nfrom pokemon_service_server_sdk.output import (\n    GetStorageOutput,\n    CapturePokemonOutput,\n    CheckHealthOutput,\n    DoNothingOutput,\n    GetPokemonSpeciesOutput,\n    GetServerStatisticsOutput,\n    StreamPokemonRadioOutput,\n)\nfrom pokemon_service_server_sdk.tls import TlsConfig\nfrom pokemon_service_server_sdk.types import ByteStream\n\n# Logging can bee setup using standard Python tooling. We provide\n# fast logging handler, Tracingandler based on Rust tracing crate.\nlogging.basicConfig(\n    handlers=[\n        TracingHandler(\n            level=logging.DEBUG,\n            format=\"pretty\",  # You can also use \"json\" or \"compact\" (default)\n        ).handler()\n    ]\n)\n\n\nclass SafeCounter:\n    def __init__(self) -> None:\n        self._val = 0\n        self._lock = Lock()\n\n    def increment(self) -> None:\n        with self._lock:\n            self._val += 1\n\n    def value(self) -> int:\n        with self._lock:\n            return self._val\n\n\n###########################################################\n# State management\n###########################################################\n# This context class is used to share data between handlers. It is automatically injected\n# inside the `State` object that can be imported from the shared library.\n# The `State` object will allow to access to the context class defined below via the `context`\n# attribute as well as other information and helpers for the current request such has the\n# operation name.\n#\n# We force the operation handlers to be defined as syncronous or asyncronous functions, taking in\n# input the input structure and the state from the shared library and returning the output structure\n# or raising one error from the the shared library.\n#\n# Examples:\n#   * def operation(input: OperationInput, state: State) -> OperationOutput\n#   * async def operation(input: OperationInput, state: State) -> OperationOutput\n#\n# Synchronization:\n#   Instance of `Context` class will be cloned for every worker and all state kept in `Context`\n#   will be specific to that process. There is no protection provided by default,\n#   it is up to you to have synchronization between processes.\n#   If you really want to share state between different processes you need to use `multiprocessing` primitives:\n#   https://docs.python.org/3/library/multiprocessing.html#sharing-state-between-processes\n@dataclass\nclass Context:\n    # Inject Lambda context if service is running on Lambda\n    # NOTE: All the values that will be injected by the framework should be wrapped with `Optional`\n    lambda_ctx: Optional[LambdaContext] = None\n\n    # In our case it simulates an in-memory database containing the description of Pikachu in multiple\n    # languages.\n    _pokemon_database = {\n        \"pikachu\": [\n            FlavorText(\n                flavor_text=\"\"\"When several of these Pokémon gather, their electricity could build and cause lightning storms.\"\"\",\n                language=Language.English,\n            ),\n            FlavorText(\n                flavor_text=\"\"\"Quando vari Pokémon di questo tipo si radunano, la loro energia può causare forti tempeste.\"\"\",\n                language=Language.Italian,\n            ),\n            FlavorText(\n                flavor_text=\"\"\"Cuando varios de estos Pokémon se juntan, su energía puede causar fuertes tormentas.\"\"\",\n                language=Language.Spanish,\n            ),\n            FlavorText(\n                flavor_text=\"ほっぺたの りょうがわに ちいさい でんきぶくろを もつ。ピンチのときに ほうでんする。\",\n                language=Language.Japanese,\n            ),\n        ]\n    }\n    _calls_count = SafeCounter()\n    _radio_database = [\n        \"https://ia800107.us.archive.org/33/items/299SoundEffectCollection/102%20Palette%20Town%20Theme.mp3\",\n        \"https://ia600408.us.archive.org/29/items/PocketMonstersGreenBetaLavenderTownMusicwwwFlvtoCom/Pocket%20Monsters%20Green%20Beta-%20Lavender%20Town%20Music-%5Bwww_flvto_com%5D.mp3\",\n    ]\n\n    def get_pokemon_description(self, name: str) -> Optional[List[FlavorText]]:\n        return self._pokemon_database.get(name)\n\n    def increment_calls_count(self) -> None:\n        self._calls_count.increment()\n        return None\n\n    def get_calls_count(self) -> int:\n        return self._calls_count.value()\n\n    def get_random_radio_stream(self) -> str:\n        return random.choice(self._radio_database)\n\n\n###########################################################\n# Entrypoint\n###########################################################\n# Get an App instance.\napp: \"App[Context]\" = App()\n# Register the context.\napp.context(Context())\n\n\n###########################################################\n# Middleware\n############################################################\n# Middlewares are sync or async function decorated by `@app.middleware`.\n# They are executed in order and take as input the HTTP request object and\n# the handler or the next middleware in the stack.\n# A middleware should return a `Response`, either by calling `next` with `Request`\n# to get `Response` from the handler or by constructing `Response` by itself.\n# It can also modify the `Request` before calling `next` or it can also modify\n# the `Response` returned by the handler.\n# It can also raise an `MiddlewareException` with custom error message and HTTP status code,\n# any other raised exceptions will cause an internal server error response to be returned.\n\n# Next is either the next middleware in the stack or the handler.\nNext = Callable[[Request], Awaitable[Response]]\n\n\n# This middleware checks the `Content-Type` from the request header,\n# logs some information depending on that and then calls `next`.\n@app.middleware\nasync def check_content_type_header(request: Request, next: Next) -> Response:\n    content_type = request.headers.get(\"content-type\")\n    if content_type in [\"application/json\", \"application/vnd.amazon.eventstream\"]:\n        logging.debug(\"found valid `%s` content type\", content_type)\n    else:\n        # Note that dumping all headers may log sensitive information! You\n        # probably don't want to do this in production.\n        logging.warning(\n            \"invalid content type %s, dumping headers: %s\",\n            content_type,\n            request.headers.items(),\n        )\n    return await next(request)\n\n\n# This middleware adds a new header called `x-amzn-answer` to the\n# request. We expect to see this header to be populated in the next\n# middleware.\n@app.middleware\nasync def add_x_amzn_answer_header(request: Request, next: Next) -> Response:\n    request.headers[\"x-amzn-answer\"] = \"42\"\n    logging.debug(\"setting `x-amzn-answer` header to 42\")\n    return await next(request)\n\n\n# This middleware checks if the header `x-amzn-answer` is correctly set\n# to 42, otherwise it returns an exception with a set status code.\n@app.middleware\nasync def check_x_amzn_answer_header(request: Request, next: Next) -> Response:\n    # Check that `x-amzn-answer` is 42.\n    if request.headers.get(\"x-amzn-answer\") != \"42\":\n        # Return an HTTP 401 Unauthorized.\n        raise MiddlewareException(\"Invalid answer\", 401)\n    return await next(request)\n\n\n###########################################################\n# App handlers definition\n###########################################################\n# DoNothing operation used for raw benchmarking.\n@app.do_nothing\ndef do_nothing(_: DoNothingInput) -> DoNothingOutput:\n    return DoNothingOutput()\n\n\n# Retrieves the user's storage.\n@app.get_storage\ndef get_storage(input: GetStorageInput) -> GetStorageOutput:\n    logging.debug(\"attempting to authenticate storage user\")\n\n    # We currently only support Ash and he has nothing stored\n    if input.user != \"ash\" or input.passcode != \"pikachu123\":\n        logging.debug(\"authentication failed\")\n        raise StorageAccessNotAuthorized()\n\n    return GetStorageOutput([])\n\n\n# Get the translation of a Pokémon specie or an error.\n@app.get_pokemon_species\ndef get_pokemon_species(\n    input: GetPokemonSpeciesInput, context: Context\n) -> GetPokemonSpeciesOutput:\n    if context.lambda_ctx is not None:\n        logging.debug(\n            \"lambda Context: %s\",\n            dict(\n                request_id=context.lambda_ctx.request_id,\n                deadline=context.lambda_ctx.deadline,\n                invoked_function_arn=context.lambda_ctx.invoked_function_arn,\n                function_name=context.lambda_ctx.env_config.function_name,\n                memory=context.lambda_ctx.env_config.memory,\n                version=context.lambda_ctx.env_config.version,\n            ),\n        )\n    context.increment_calls_count()\n    flavor_text_entries = context.get_pokemon_description(input.name)\n    if flavor_text_entries:\n        logging.debug(\"total requests executed: %s\", context.get_calls_count())\n        logging.info(\"found description for Pokémon %s\", input.name)\n        return GetPokemonSpeciesOutput(\n            name=input.name, flavor_text_entries=flavor_text_entries\n        )\n    else:\n        logging.warning(\"description for Pokémon %s not in the database\", input.name)\n        raise ResourceNotFoundException(\"Requested Pokémon not available\")\n\n\n# Get the number of requests served by this server.\n@app.get_server_statistics\ndef get_server_statistics(\n    _: GetServerStatisticsInput, context: Context\n) -> GetServerStatisticsOutput:\n    calls_count = context.get_calls_count()\n    logging.debug(\"the service handled %d requests\", calls_count)\n    return GetServerStatisticsOutput(calls_count=calls_count)\n\n\n# Run a shallow health check of the service.\n@app.check_health\ndef check_health(_: CheckHealthInput) -> CheckHealthOutput:\n    return CheckHealthOutput()\n\n\n###########################################################\n# Event streams\n############################################################\n# An event stream is an abstraction that allows multiple messages to be sent asynchronously\n# between a client and server. Event streams support both duplex and simplex streaming.\n# You can find more details about event streaming in Smithy Spec:\n# https://smithy.io/2.0/spec/streaming.html#event-streams\n#\n# Event streams modeled as asynchronous Python generators, that means:\n# For receiving, you can use `async for` to iterate incoming events from the client and you can\n# `break` from the loop if you want to stop receiving events.\n# For sending, you can use `yield` to sent an event to the client and you can `return` from your\n# generator function to stop `yield`ing events.\n#\n# Event streams also has a concept of \"Modeled Errors\" and those events are considered as\n# terminal errors and they stop the event stream. They are modeled as exceptions in Python.\n# Incoming event streams can raise modeled exceptions to terminate the event stream and you can\n# catch those errors by wrapping incoming streams in a `try-except` block, and you can also raise\n# a modeled error to terminate event stream.\n# See Smithy Spec for more information about modeled errors:\n# https://smithy.io/2.0/spec/streaming.html#modeled-errors-in-event-streams\n#\n# Depending on your use case, your functions usually should look like:\n#\n# Receiving only:\n# ```python\n# def receiving(input: Input) -> Output:\n#     # Initial message handling...\n#\n#     async def events(input):\n#         try:\n#             async for event in input.events:\n#                 # Handle incoming `event`...\n#                 # `input.events` will gracefully stop if client stops sending events,\n#                 # you can also `break` if you want to stop receiving\n#         except YourModeledError as err:\n#             # Handle modeled error...\n#             # The stream is terminated\n#\n#     # Return immediately and let your generator run in background,\n#     # you can also have initial messages and send them here\n#     return Output(events=events(input), initial=\"value\")\n# ```\n#\n# Sending only:\n# ```python\n# def sending(input: Input) -> Output:\n#     # Initial message handling...\n#\n#     async def events(input):\n#         while True:\n#             # You can send values by `yield`ing them...\n#             yield some_value\n#\n#             # You can just `break` the loop to stop sending events gracefully\n#             if some_cond:\n#                 break\n#\n#             # You can also stop sending events by raising modeled errors\n#             if some_other_cond:\n#                 raise YourModeledError(...)\n#\n#     # Return immediately and let your generator run in background,\n#     # you can also have initial messages and send them here\n#     return Output(events=events(input), initial=\"value\")\n# ```\n#\n# Both receiving and sending:\n# ```python\n# def bidirectional(input: Input) -> Output:\n#     # Initial message handling...\n#\n#     async def events(input):\n#         try:\n#             async for event in input.events:\n#                 # Handle incoming `event`...\n#                 # `input.events` will gracefully stop if client stops sending events,\n#                 # you can also `break` if you want to stop receiving\n#\n#                 # Send some event to the client by `yield`ing them, or stop sending events\n#                 # by `break`ing the loop or raising modeled errors\n#                 yield outgoing\n#         except YourModeledError as err:\n#             # Handle modeled error...\n#             # The stream is terminated\n#\n#     # Return immediately and let your generator run in background,\n#     # you can also have initial messages and send them here\n#     return Output(events=events(input), initial=\"value\")\n# ```\n#\n# You can see an example implementation of a duplex streaming for capturing a Pokemon,\n# you can find Smithy model in `codegen-server-test/python/model/pokemon.smithy`.\n@app.capture_pokemon\ndef capture_pokemon(input: CapturePokemonInput) -> CapturePokemonOutput:\n    # You can have initial messages that provides an opportunity for a client or server to\n    # provide metadata about an event stream before transmitting events.\n    # See Smithy spec for more details: https://smithy.io/2.0/spec/streaming.html#initial-messages\n    if input.region != \"Kanto\":\n        raise UnsupportedRegionError(input.region)\n\n    # Here is your event stream, which is an `async` Python function that can `await` on incoming\n    # events and `yield` to sent an event\n    async def events(input: CapturePokemonInput) -> AsyncIterator[CapturePokemonEvents]:\n        # We're wrapping incoming event stream with a `try-catch` block to catch modeled errors\n        try:\n            # Asynchronously iterate through incoming events\n            async for incoming in input.events:\n                # `incoming` is an union of all possible non-error types from your Smithy model.\n                # You can use `is_{variant}` and `as_{variant}` methods to inspect incoming message\n                if incoming.is_event():\n                    event = incoming.as_event()\n                    payload = event.payload\n                    # You can ignore incoming messages just by `continue`ing the loop\n                    if not payload:\n                        logging.debug(\"no payload provided, ignoring the event\")\n                        continue\n\n                    name = payload.name or \"<unknown>\"\n                    pokeball = payload.pokeball or \"<unknown>\"\n                    # You can terminate the stream by raising modeled errors\n                    if pokeball not in [\"Master Ball\", \"Fast Ball\"]:\n                        raise InvalidPokeballError(pokeball)\n\n                    # Outgoing type is also an union of all possible non-error types from\n                    # your Smithy model. You can construct the variant you want by calling\n                    # constructor functions for your variant:\n                    outgoing_event = CapturePokemonEvents.event(\n                        CaptureEvent(\n                            name=name,\n                            captured=random.choice([True, False]),\n                            shiny=random.choice([True, False]),\n                        )\n                    )\n                    # You can `yield` your outgoing type to sent an event to the client\n                    yield outgoing_event\n                else:\n                    # You can stop receiving incoming events by just `break`ing the loop\n                    logging.error(\"unknown event\")\n                    break\n        # You can catch modeled errors and act accordingly, they will terminate the event stream\n        except MasterBallUnsuccessful as err:\n            logging.error(\"masterball unsuccessful: %s\", err)\n\n        # Here event stream is going to be completed because we stopped receiving events and we'll\n        # no longer `yield` new values and this asynchronous Python generator will end here\n        logging.debug(\"done\")\n\n    # You should immediately return your output here, your asynchronous Python generator will\n    # run in background without blocking your threads.\n    return CapturePokemonOutput(events=events(input))\n\n\n# Stream a random Pokémon song.\n@app.stream_pokemon_radio\nasync def stream_pokemon_radio(\n    _: StreamPokemonRadioInput, context: Context\n) -> StreamPokemonRadioOutput:\n    import aiohttp\n\n    radio_url = context.get_random_radio_stream()\n    logging.info(\"random radio URL for this stream is %s\", radio_url)\n    async with aiohttp.ClientSession() as session:\n        async with session.get(radio_url) as response:\n            data = ByteStream(await response.read())\n        logging.debug(\"successfully fetched radio url %s\", radio_url)\n    return StreamPokemonRadioOutput(data=data)\n\n\n###########################################################\n# Run the server.\n###########################################################\ndef main() -> None:\n    parser = argparse.ArgumentParser(description=\"PokémonService\")\n    parser.add_argument(\"--enable-tls\", action=\"store_true\")\n    parser.add_argument(\"--tls-key-path\")\n    parser.add_argument(\"--tls-cert-path\")\n    args = parser.parse_args()\n\n    config: Dict[str, Any] = dict(workers=1)\n    if args.enable_tls:\n        config[\"tls\"] = TlsConfig(\n            key_path=args.tls_key_path,\n            cert_path=args.tls_cert_path,\n        )\n\n    app.run(**config)\n\n\nif __name__ == \"__main__\":\n    main()\n"
  },
  {
    "path": "fuzzgen/build.gradle.kts",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport org.gradle.api.tasks.testing.logging.TestExceptionFormat\n\nplugins {\n    id(\"smithy-rs.kotlin-conventions\")\n}\n\ndescription = \"Plugin to generate a fuzz harness\"\nextra[\"displayName\"] = \"Smithy :: Rust :: Fuzzer Generation\"\nextra[\"moduleName\"] = \"software.amazon.smithy.rust.codegen.client\"\n\ndependencies {\n    implementation(project(\":codegen-core\"))\n    implementation(project(\":codegen-client\"))\n    implementation(project(\":codegen-server\"))\n    implementation(libs.smithy.protocol.test.traits)\n\n\n    testRuntimeOnly(project(\":rust-runtime\"))\n    testImplementation(libs.junit.jupiter)\n    testImplementation(libs.smithy.validation.model)\n    testImplementation(libs.smithy.aws.protocol.tests)\n    testImplementation(libs.kotest.assertions.core.jvm)\n}\n\n\ntasks.register(\"generateClasspath\") {\n    doLast {\n        // Get the runtime classpath\n        val runtimeClasspath = sourceSets[\"main\"].runtimeClasspath\n\n        // Add the 'libs' directory to the classpath\n        val libsDir = file(layout.buildDirectory.dir(\"libs\"))\n        val fullClasspath = runtimeClasspath + files(libsDir.listFiles())\n\n        // Convert to classpath string\n        val classpath = fullClasspath.asPath\n    }\n}\n"
  },
  {
    "path": "fuzzgen/src/main/kotlin/software/amazon/smithy/rust/codegen/fuzz/FuzzHarnessBuildPlugin.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.fuzz\n\nimport software.amazon.smithy.build.FileManifest\nimport software.amazon.smithy.build.PluginContext\nimport software.amazon.smithy.build.SmithyBuildPlugin\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.knowledge.TopDownIndex\nimport software.amazon.smithy.model.neighbor.Walker\nimport software.amazon.smithy.model.node.ArrayNode\nimport software.amazon.smithy.model.node.Node\nimport software.amazon.smithy.model.node.NumberNode\nimport software.amazon.smithy.model.node.ObjectNode\nimport software.amazon.smithy.model.node.StringNode\nimport software.amazon.smithy.model.shapes.MemberShape\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.Shape\nimport software.amazon.smithy.model.shapes.ShapeId\nimport software.amazon.smithy.model.traits.HttpPrefixHeadersTrait\nimport software.amazon.smithy.model.traits.HttpQueryTrait\nimport software.amazon.smithy.model.traits.HttpTrait\nimport software.amazon.smithy.model.traits.JsonNameTrait\nimport software.amazon.smithy.model.traits.XmlNameTrait\nimport software.amazon.smithy.protocoltests.traits.HttpRequestTestsTrait\nimport software.amazon.smithy.rust.codegen.core.generated.BuildEnvironment\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustModule\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.smithy.ModuleDocProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeConfig\nimport software.amazon.smithy.rust.codegen.core.smithy.transformers.OperationNormalizer\nimport software.amazon.smithy.rust.codegen.core.util.getTrait\nimport software.amazon.smithy.rust.codegen.core.util.orNull\nimport software.amazon.smithy.rust.codegen.server.smithy.transformers.AttachValidationExceptionToConstrainedOperationInputsInAllowList\nimport java.io.File\nimport java.nio.file.Path\nimport java.util.Base64\nimport kotlin.streams.toList\n\n/**\n * Metadata for a TargetCrate: A code generated smithy-rs server for a given model\n */\ndata class TargetCrate(\n    /** The name of the Fuzz target */\n    val name: String,\n    /** Where the server implementation of this target is */\n    val relativePath: String,\n) {\n    companion object {\n        fun fromNode(node: ObjectNode): TargetCrate {\n            val name = node.expectStringMember(\"name\").value\n            val relativePath = node.expectStringMember(\"relativePath\").value\n            return TargetCrate(name, relativePath)\n        }\n    }\n\n    /** The name of the actual `package` from Cargo's perspective.\n     *\n     *  We need this to make a dependency on it\n     * */\n    fun targetPackage(): String {\n        val path = Path.of(relativePath)\n        val cargoToml = path.resolve(\"Cargo.toml\").toFile()\n        val packageSection = cargoToml.readLines().dropWhile { it.trim() != \"[package]\" }\n        return packageSection.firstOrNull { it.startsWith(\"name =\") }?.let { it.split(\"=\")[1].trim() }?.trim('\"')\n            ?: throw Exception(\"no package name\")\n    }\n}\n\ndata class FuzzSettings(\n    val targetServers: List<TargetCrate>,\n    val service: ShapeId,\n    val runtimeConfig: RuntimeConfig,\n) {\n    companion object {\n        fun fromNode(node: ObjectNode): FuzzSettings {\n            val targetCrates =\n                node.expectArrayMember(\"targetCrates\")\n                    .map { TargetCrate.fromNode(it.expectObjectNode()) }\n            val service = ShapeId.fromNode(node.expectStringMember(\"service\"))\n            val runtimeConfig = RuntimeConfig.fromNode(node.getObjectMember(\"runtimeConfig\"))\n            return FuzzSettings(targetCrates, service, runtimeConfig)\n        }\n    }\n}\n\n/**\n * Build plugin for generating a fuzz harness and lexicon from a smithy model and a set of smithy-rs versions\n *\n * This is used by `aws-smithy-fuzz` which contains most of the usage docs\n */\nclass FuzzHarnessBuildPlugin : SmithyBuildPlugin {\n    // `aws-smithy-fuzz` is not part of the `rust-runtime` workspace,\n    // and its dependencies may not be included in the SDK lockfile.\n    // This plugin needs to use the lockfile from `aws-smithy-fuzz`.\n    private val cargoLock: File by lazy {\n        File(BuildEnvironment.PROJECT_DIR).resolve(\"rust-runtime/aws-smithy-fuzz/Cargo.lock\")\n    }\n\n    override fun getName(): String = \"fuzz-harness\"\n\n    override fun execute(context: PluginContext) {\n        val fuzzSettings = FuzzSettings.fromNode(context.settings)\n\n        val model =\n            context.model.let(OperationNormalizer::transform)\n                .let(AttachValidationExceptionToConstrainedOperationInputsInAllowList::transform)\n        val targets =\n            fuzzSettings.targetServers.map { target ->\n                val targetContext = createFuzzTarget(target, context.fileManifest, fuzzSettings, model)\n                println(\"Creating a fuzz targret for $targetContext\")\n                FuzzTargetGenerator(targetContext).generateFuzzTarget()\n                targetContext\n            }\n\n        println(\"creating the driver...\")\n        createDriver(model, context.fileManifest, fuzzSettings)\n\n        targets.forEach {\n            val manifest = it.finalize()\n            context.fileManifest.addAllFiles(manifest)\n            // A fuzz target crate exists in a nested structure like:\n            // smithy-test-workspace/smithy-test4510328876569901367/a\n            //\n            // Each fuzz target is its own workspace with `[workspace]\\n_ignored _ignored`.\n            // As a result, placing the lockfile from `aws-smithy-fuzz` in `TestWorkspace`\n            // has no effect; it must be copied directly into the fuzz target.\n            cargoLock.copyTo(manifest.baseDir.resolve(\"Cargo.lock\").toFile(), true)\n        }\n    }\n}\n\n/**\n * Generate a corpus of words used within the model to seed the dictionary\n */\nfun corpus(\n    model: Model,\n    fuzzSettings: FuzzSettings,\n): ArrayNode {\n    val operations = TopDownIndex.of(model).getContainedOperations(fuzzSettings.service)\n    val protocolTests = operations.flatMap { it.getTrait<HttpRequestTestsTrait>()?.testCases ?: listOf() }\n    val out = ArrayNode.builder()\n    protocolTests.forEach { testCase ->\n        val body: List<NumberNode> =\n            when (testCase.bodyMediaType.orNull()) {\n                \"application/cbor\" -> {\n                    println(\"base64 decoding first (v2)\")\n                    Base64.getDecoder().decode(testCase.body.orNull())?.map { NumberNode.from(it.toUByte().toInt()) }\n                }\n\n                else -> testCase.body.orNull()?.chars()?.toList()?.map { c -> NumberNode.from(c) }\n            } ?: listOf()\n        out.withValue(\n            ObjectNode.objectNode()\n                .withMember(\"uri\", testCase.uri)\n                .withMember(\"method\", testCase.method)\n                .withMember(\n                    \"headers\",\n                    ObjectNode.objectNode(\n                        testCase.headers.map { (k, v) ->\n                            (StringNode.from(k) to ArrayNode.fromStrings(v))\n                        }.toMap(),\n                    ),\n                )\n                .withMember(\"trailers\", ObjectNode.objectNode())\n                .withMember(\n                    \"body\",\n                    ArrayNode.fromNodes(body),\n                ),\n        )\n    }\n    return out.build()\n}\n\nfun createDriver(\n    model: Model,\n    baseManifest: FileManifest,\n    fuzzSettings: FuzzSettings,\n) {\n    val fuzzLexicon =\n        ObjectNode.objectNode()\n            .withMember(\"corpus\", corpus(model, fuzzSettings))\n            .withMember(\"dictionary\", dictionary(model, fuzzSettings))\n    baseManifest.writeFile(\"lexicon.json\", Node.prettyPrintJson(fuzzLexicon))\n}\n\nfun dictionary(\n    model: Model,\n    fuzzSettings: FuzzSettings,\n): ArrayNode {\n    val operations = TopDownIndex.of(model).getContainedOperations(fuzzSettings.service)\n    val walker = Walker(model)\n    val dictionary = mutableSetOf<String>()\n    operations.forEach {\n        walker.iterateShapes(it).forEach { shape ->\n            dictionary.addAll(getTraitBasedNames(shape))\n            dictionary.add(shape.id.name)\n            when (shape) {\n                is MemberShape -> dictionary.add(shape.memberName)\n                is OperationShape -> dictionary.add(shape.id.toString())\n                else -> {}\n            }\n        }\n    }\n    return ArrayNode.fromStrings(dictionary.toList().sorted())\n}\n\nfun getTraitBasedNames(shape: Shape): List<String> {\n    return listOfNotNull(\n        shape.getTrait<JsonNameTrait>()?.value,\n        shape.getTrait<XmlNameTrait>()?.value,\n        shape.getTrait<HttpQueryTrait>()?.value,\n        shape.getTrait<HttpTrait>()?.method,\n        *(\n            shape.getTrait<HttpTrait>()?.uri?.queryLiterals?.flatMap { (k, v) -> listOf(k, v) }\n                ?: listOf()\n        ).toTypedArray(),\n        shape.getTrait<HttpPrefixHeadersTrait>()?.value,\n    )\n}\n\nclass NoOpDocProvider : ModuleDocProvider {\n    override fun docsWriter(module: RustModule.LeafModule): Writable? {\n        return null\n    }\n}\n"
  },
  {
    "path": "fuzzgen/src/main/kotlin/software/amazon/smithy/rust/codegen/fuzz/FuzzTargetGenerator.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage software.amazon.smithy.rust.codegen.fuzz\n\nimport software.amazon.smithy.build.FileManifest\nimport software.amazon.smithy.model.Model\nimport software.amazon.smithy.model.knowledge.NullableIndex\nimport software.amazon.smithy.model.knowledge.TopDownIndex\nimport software.amazon.smithy.model.shapes.OperationShape\nimport software.amazon.smithy.model.shapes.ServiceShape\nimport software.amazon.smithy.rust.codegen.core.rustlang.CargoDependency\nimport software.amazon.smithy.rust.codegen.core.rustlang.Local\nimport software.amazon.smithy.rust.codegen.core.rustlang.RustReservedWords\nimport software.amazon.smithy.rust.codegen.core.rustlang.Writable\nimport software.amazon.smithy.rust.codegen.core.rustlang.rust\nimport software.amazon.smithy.rust.codegen.core.rustlang.rustTemplate\nimport software.amazon.smithy.rust.codegen.core.rustlang.writable\nimport software.amazon.smithy.rust.codegen.core.smithy.CoreCodegenConfig\nimport software.amazon.smithy.rust.codegen.core.smithy.CoreRustSettings\nimport software.amazon.smithy.rust.codegen.core.smithy.PublicImportSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType\nimport software.amazon.smithy.rust.codegen.core.smithy.RuntimeType.Companion.preludeScope\nimport software.amazon.smithy.rust.codegen.core.smithy.RustCrate\nimport software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProvider\nimport software.amazon.smithy.rust.codegen.core.smithy.RustSymbolProviderConfig\nimport software.amazon.smithy.rust.codegen.core.smithy.SymbolVisitor\nimport software.amazon.smithy.rust.codegen.core.smithy.contextName\nimport software.amazon.smithy.rust.codegen.core.util.hasStreamingMember\nimport software.amazon.smithy.rust.codegen.core.util.inputShape\nimport software.amazon.smithy.rust.codegen.core.util.isEventStream\nimport software.amazon.smithy.rust.codegen.core.util.outputShape\nimport software.amazon.smithy.rust.codegen.core.util.toPascalCase\nimport software.amazon.smithy.rust.codegen.core.util.toSnakeCase\nimport software.amazon.smithy.rust.codegen.server.smithy.ServerModuleProvider\nimport software.amazon.smithy.rust.codegen.server.smithy.isDirectlyConstrained\nimport java.nio.file.Path\nimport kotlin.io.path.name\n\nprivate fun rustSettings(\n    fuzzSettings: FuzzSettings,\n    target: TargetCrate,\n) = CoreRustSettings(\n    fuzzSettings.service,\n    moduleVersion = \"0.1.0\",\n    moduleName = \"fuzz-target-${target.name}\",\n    moduleAuthors = listOf(),\n    codegenConfig = CoreCodegenConfig(),\n    license = null,\n    runtimeConfig = fuzzSettings.runtimeConfig,\n    moduleDescription = null,\n    moduleRepository = null,\n)\n\ndata class FuzzTargetContext(\n    val target: TargetCrate,\n    val fuzzSettings: FuzzSettings,\n    val rustCrate: RustCrate,\n    val model: Model,\n    val symbolProvider: RustSymbolProvider,\n    private val manifest: FileManifest,\n) {\n    fun finalize(): FileManifest {\n        val forceWorkspace =\n            mapOf(\n                \"workspace\" to listOf(\"_ignored\" to \"_ignored\").toMap(),\n                \"lib\" to mapOf(\"crate-type\" to listOf(\"cdylib\")),\n            )\n        val rustSettings = rustSettings(fuzzSettings, target)\n        rustCrate.finalize(rustSettings, model, forceWorkspace, listOf(), requireDocs = false)\n        return manifest\n    }\n}\n\nclass FuzzTargetGenerator(private val context: FuzzTargetContext) {\n    private val model = context.model\n    private val serviceShape = context.model.expectShape(context.fuzzSettings.service, ServiceShape::class.java)\n    private val symbolProvider = PublicImportSymbolProvider(context.symbolProvider, targetCrate().name)\n\n    private fun targetCrate(): RuntimeType {\n        val path = Path.of(context.target.relativePath).toAbsolutePath()\n        return CargoDependency(\n            name = path.name,\n            location = Local(path.parent?.toString() ?: \"\"),\n            `package` = context.target.targetPackage(),\n        ).toType()\n    }\n\n    private val smithyFuzz = context.fuzzSettings.runtimeConfig.smithyRuntimeCrate(\"smithy-fuzz\").toType()\n    private val ctx =\n        arrayOf(\n            \"fuzz_harness\" to smithyFuzz.resolve(\"fuzz_harness\"),\n            \"fuzz_service\" to smithyFuzz.resolve(\"fuzz_service\"),\n            \"FuzzResult\" to smithyFuzz.resolve(\"FuzzResult\"),\n            \"Body\" to smithyFuzz.resolve(\"Body\"),\n            \"http\" to CargoDependency.Http1x.toType(),\n            \"target\" to targetCrate(),\n        )\n\n    private val serviceName = context.fuzzSettings.service.name.toPascalCase()\n\n    fun generateFuzzTarget() {\n        context.rustCrate.lib {\n            rustTemplate(\n                \"\"\"\n                #{fuzz_harness}!(|tx| {\n                    let config = #{target}::${serviceName}Config::builder().build();\n                    #{tx_clones}\n                    #{target}::$serviceName::builder::<#{Body}, _, _, _>(config)#{all_operations}.build_unchecked()\n                });\n\n                \"\"\",\n                *ctx,\n                \"all_operations\" to allOperations(),\n                \"tx_clones\" to allTxs(),\n                *preludeScope,\n            )\n        }\n    }\n\n    private fun operationsToImplement(): List<OperationShape> {\n        val index = TopDownIndex.of(model)\n        return index.getContainedOperations(serviceShape).filter { operationShape ->\n            // TODO(fuzzing): consider if it is possible to support event streams\n            !operationShape.isEventStream(model) &&\n                // TODO(fuzzing): it should be possible to support normal streaming operations\n                !(\n                    operationShape.inputShape(model).hasStreamingMember(model) ||\n                        operationShape.outputShape(model)\n                            .hasStreamingMember(model)\n                ) &&\n                // TODO(fuzzing): it should be possible to work backwards from constraints to satisfy them in most cases.\n                !(operationShape.outputShape(model).isDirectlyConstrained(symbolProvider))\n        }.toList()\n    }\n\n    private fun allTxs(): Writable =\n        writable {\n            operationsToImplement().forEach { op ->\n                val operationName =\n                    op.contextName(serviceShape).toSnakeCase().let { RustReservedWords.escapeIfNeeded(it) }\n                rust(\"let tx_$operationName = tx.clone();\")\n            }\n        }\n\n    private fun allOperations(): Writable =\n        writable {\n            val operations = operationsToImplement()\n            operations.forEach { op ->\n                val operationName =\n                    op.contextName(serviceShape).toSnakeCase().let { RustReservedWords.escapeIfNeeded(it) }\n                val output =\n                    writable {\n                        val outputSymbol = symbolProvider.toSymbol(op.outputShape(model))\n                        if (op.errors.isEmpty()) {\n                            rust(\"#T::builder().build()\", outputSymbol)\n                        } else {\n                            rust(\"Ok(#T::builder().build())\", outputSymbol)\n                        }\n                    }\n                rustTemplate(\n                    \"\"\"\n                    .$operationName(move |input: #{Input}| {\n                        let tx = tx_$operationName.clone();\n                        async move {\n                            tx.send(format!(\"{:?}\", input)).await.unwrap();\n                            #{output}\n                        }\n                })\"\"\",\n                    \"Input\" to symbolProvider.toSymbol(op.inputShape(model)),\n                    \"output\" to output,\n                    *preludeScope,\n                )\n            }\n        }\n}\n\nfun createFuzzTarget(\n    target: TargetCrate,\n    baseManifest: FileManifest,\n    fuzzSettings: FuzzSettings,\n    model: Model,\n): FuzzTargetContext {\n    val newManifest = FileManifest.create(baseManifest.resolvePath(Path.of(target.name)))\n    val codegenConfig = CoreCodegenConfig()\n    val symbolProvider =\n        SymbolVisitor(\n            rustSettings(fuzzSettings, target),\n            model,\n            model.expectShape(fuzzSettings.service, ServiceShape::class.java),\n            RustSymbolProviderConfig(\n                fuzzSettings.runtimeConfig,\n                renameExceptions = false,\n                NullableIndex.CheckMode.SERVER,\n                ServerModuleProvider,\n            ),\n        )\n    val crate =\n        RustCrate(\n            newManifest,\n            symbolProvider,\n            codegenConfig,\n            NoOpDocProvider(),\n        )\n    return FuzzTargetContext(\n        target = target,\n        fuzzSettings = fuzzSettings,\n        rustCrate = crate,\n        model = model,\n        manifest = newManifest,\n        symbolProvider = symbolProvider,\n    )\n}\n"
  },
  {
    "path": "fuzzgen/src/main/resources/META-INF/services/software.amazon.smithy.build.SmithyBuildPlugin",
    "content": "#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\nsoftware.amazon.smithy.rust.codegen.fuzz.FuzzHarnessBuildPlugin\n"
  },
  {
    "path": "fuzzgen/src/test/kotlin/software/amazon/smithy/rust/codegen/fuzz/FuzzHarnessBuildPluginTest.kt",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\npackage software.amazon.smithy.rust.codegen.fuzz\n\nimport io.kotest.matchers.collections.shouldContain\nimport org.junit.jupiter.api.Test\nimport software.amazon.smithy.build.FileManifest\nimport software.amazon.smithy.build.PluginContext\nimport software.amazon.smithy.model.node.ArrayNode\nimport software.amazon.smithy.model.node.Node\nimport software.amazon.smithy.model.node.ObjectNode\nimport software.amazon.smithy.rust.codegen.core.testutil.IntegrationTestParams\nimport software.amazon.smithy.rust.codegen.core.testutil.TestRuntimeConfig\nimport software.amazon.smithy.rust.codegen.core.testutil.TestWorkspace\nimport software.amazon.smithy.rust.codegen.core.testutil.asSmithyModel\nimport software.amazon.smithy.rust.codegen.core.testutil.printGeneratedFiles\nimport software.amazon.smithy.rust.codegen.core.util.runCommand\nimport software.amazon.smithy.rust.codegen.server.smithy.testutil.HttpTestType\nimport software.amazon.smithy.rust.codegen.server.smithy.testutil.HttpTestVersion\nimport software.amazon.smithy.rust.codegen.server.smithy.testutil.serverIntegrationTest\n\nclass FuzzHarnessBuildPluginTest() {\n    private val minimalModel =\n        \"\"\"\n        namespace com.example\n        use aws.protocols#awsJson1_0\n        @awsJson1_0\n        service HelloService {\n            operations: [SayHello],\n            version: \"1\"\n        }\n        operation SayHello { input: TestInput }\n        structure TestInput {\n           foo: String,\n        }\n        \"\"\".asSmithyModel()\n\n    /**\n     * Smoke test that generates a lexicon and target crate for the trivial service above\n     */\n    @Test\n    fun smokeTest() {\n        val testDir = TestWorkspace.subproject()\n        val testPath = testDir.toPath()\n        val manifest = FileManifest.create(testPath)\n        val service = \"com.example#HelloService\"\n        // Only generate server for http@1 as `aws-smithy-fuzz` only supports http@1.\n        val generatedServers =\n            serverIntegrationTest(\n                minimalModel,\n                IntegrationTestParams(service = service, command = { dir -> println(\"generated $dir\") }),\n                testCoverage =\n                    HttpTestType.Only(\n                        HttpTestVersion.HTTP_1_X,\n                    ),\n            ) { _, _ ->\n            }\n\n        // Create target crates for each generated server (only HTTP 1.x for fuzz testing)\n        val targetCrates =\n            generatedServers.map { server ->\n                ObjectNode.objectNode()\n                    .withMember(\"relativePath\", server.path.toString())\n                    .withMember(\"name\", \"a\")\n            }\n\n        val context =\n            PluginContext.builder()\n                .model(minimalModel)\n                .fileManifest(manifest)\n                .settings(\n                    ObjectNode.objectNode()\n                        .withMember(\"service\", \"com.example#HelloService\")\n                        .withMember(\n                            \"targetCrates\",\n                            ArrayNode.fromNodes(targetCrates),\n                        )\n                        .withMember(\n                            \"runtimeConfig\",\n                            Node.objectNode().withMember(\n                                \"relativePath\",\n                                Node.from(((TestRuntimeConfig).runtimeCrateLocation).path),\n                            ),\n                        ),\n                ).build()\n        FuzzHarnessBuildPlugin().execute(context)\n        context.fileManifest.printGeneratedFiles()\n        context.fileManifest.files.map { it.fileName.toString() } shouldContain \"lexicon.json\"\n        \"cargo check\".runCommand(context.fileManifest.baseDir.resolve(\"a\"))\n    }\n}\n"
  },
  {
    "path": "gradle/libs.versions.toml",
    "content": "[versions]\nkotlin-version = \"2.1.0\"\nktlint-version = \"1.0.1\"\n\n# codegen\nsmithy-version = \"1.67.0\"\nsmithy-gradle-plugin-version = \"1.3.0\"\n\n# publishing\njreleaser = \"1.19.0\"\n\n# testing\njunit-version = \"5.10.5\"\njsoup-version = \"1.16.2\"\njackson-dataformat-cbor-version = \"2.13.0\"\nkotest-version = \"5.9.1\"\ntoml4j-version = \"0.7.2\"\n\n[libraries]\nktlint-cli = { module = \"com.pinterest.ktlint:ktlint-cli\", version.ref = \"ktlint-version\" }\nkotlin-gradle-plugin = { module = \"org.jetbrains.kotlin:kotlin-gradle-plugin\", version.ref = \"kotlin-version\" }\nkotest-assertions-core-jvm = { module = \"io.kotest:kotest-assertions-core-jvm\", version.ref = \"kotest-version\" }\njackson-dataformat-cbor = { module = \"com.fasterxml.jackson.dataformat:jackson-dataformat-cbor\", version.ref = \"jackson-dataformat-cbor-version\" }\njunit-jupiter = { module = \"org.junit.jupiter:junit-jupiter\", version.ref = \"junit-version\" }\njsoup = { module = \"org.jsoup:jsoup\", version.ref = \"jsoup-version\"}\ntoml4j = { module = \"com.moandjiezana.toml:toml4j\", version.ref = \"toml4j-version\" }\n\n\nsmithy-codegen-core = { module = \"software.amazon.smithy:smithy-codegen-core\", version.ref = \"smithy-version\" }\nsmithy-cli = { module = \"software.amazon.smithy:smithy-cli\", version.ref = \"smithy-version\" }\nsmithy-model = { module = \"software.amazon.smithy:smithy-model\", version.ref = \"smithy-version\" }\nsmithy-waiters = { module = \"software.amazon.smithy:smithy-waiters\", version.ref = \"smithy-version\" }\nsmithy-protocol-traits = { module = \"software.amazon.smithy:smithy-protocol-traits\", version.ref = \"smithy-version\" }\nsmithy-protocol-tests = { module = \"software.amazon.smithy:smithy-protocol-tests\", version.ref = \"smithy-version\" }\nsmithy-protocol-test-traits = { module = \"software.amazon.smithy:smithy-protocol-test-traits\", version.ref = \"smithy-version\" }\nsmithy-aws-traits = { module = \"software.amazon.smithy:smithy-aws-traits\", version.ref = \"smithy-version\" }\nsmithy-rules-engine = { module = \"software.amazon.smithy:smithy-rules-engine\", version.ref = \"smithy-version\" }\nsmithy-rules-engine-tests = { module = \"software.amazon.smithy:smithy-rules-engine-tests\", version.ref = \"smithy-version\" }\nsmithy-aws-endpoints = { module = \"software.amazon.smithy:smithy-aws-endpoints\", version.ref = \"smithy-version\" }\nsmithy-validation-model = { module = \"software.amazon.smithy:smithy-validation-model\", version.ref = \"smithy-version\" }\nsmithy-aws-protocol-tests = { module = \"software.amazon.smithy:smithy-aws-protocol-tests\", version.ref = \"smithy-version\" }\nsmithy-aws-smoke-test-model = { module = \"software.amazon.smithy:smithy-aws-smoke-test-model\", version.ref = \"smithy-version\" }\nsmithy-aws-iam-traits = { module = \"software.amazon.smithy:smithy-aws-iam-traits\", version.ref = \"smithy-version\" }\nsmithy-aws-cloudformation-traits = { module = \"software.amazon.smithy:smithy-aws-cloudformation-traits\", version.ref = \"smithy-version\" }\nsmithy-smoke-test-traits = { module = \"software.amazon.smithy:smithy-smoke-test-traits\", version.ref = \"smithy-version\" }\nsmithy-utils = { module = \"software.amazon.smithy:smithy-utils\", version.ref = \"smithy-version\" }\n\n\n\n[plugins]\nkotlin-jvm = { id = \"org.jetbrains.kotlin.jvm\", version.ref = \"kotlin-version\" }\nsmithy-gradle-base = { id = \"software.amazon.smithy.gradle.smithy-base\", version.ref = \"smithy-gradle-plugin-version\" }\nsmithy-gradle-jar = { id = \"software.amazon.smithy.gradle.smithy-jar\", version.ref = \"smithy-gradle-plugin-version\" }\njreleaser = { id = \"org.jreleaser\", version.ref = \"jreleaser\" }\n"
  },
  {
    "path": "gradle/wrapper/gradle-wrapper.properties",
    "content": "distributionBase=GRADLE_USER_HOME\ndistributionPath=wrapper/dists\ndistributionUrl=https\\://services.gradle.org/distributions/gradle-8.14.3-bin.zip\nnetworkTimeout=10000\nvalidateDistributionUrl=true\nzipStoreBase=GRADLE_USER_HOME\nzipStorePath=wrapper/dists\n"
  },
  {
    "path": "gradle.properties",
    "content": "#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\n# Rust MSRV (entered into the generated README)\nrust.msrv=1.91.1\n# To enable debug, swap out the two lines below.\n# When changing this value, be sure to run `./gradlew --stop` to kill the Gradle daemon.\n# org.gradle.jvmargs=-Xmx1024M -agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=localhost:5006\norg.gradle.jvmargs=-Xmx1024M\n# Version number to use for the generated stable runtime crates\nsmithy.rs.runtime.crate.stable.version=1.1.7\n# Version number to use for the generated unstable runtime crates\nsmithy.rs.runtime.crate.unstable.version=0.60.6\nkotlin.code.style=official\nallowLocalDeps=false\n# Avoid registering dependencies/plugins/tasks that are only used for testing purposes\nisTestingEnabled=true\n# codegen publication version\ncodegenVersion=0.1.16\n"
  },
  {
    "path": "gradlew",
    "content": "#!/bin/sh\n\n#\n# Copyright © 2015-2021 the original authors.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      https://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\n\n##############################################################################\n#\n#   Gradle start up script for POSIX generated by Gradle.\n#\n#   Important for running:\n#\n#   (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is\n#       noncompliant, but you have some other compliant shell such as ksh or\n#       bash, then to run this script, type that shell name before the whole\n#       command line, like:\n#\n#           ksh Gradle\n#\n#       Busybox and similar reduced shells will NOT work, because this script\n#       requires all of these POSIX shell features:\n#         * functions;\n#         * expansions «$var», «${var}», «${var:-default}», «${var+SET}»,\n#           «${var#prefix}», «${var%suffix}», and «$( cmd )»;\n#         * compound commands having a testable exit status, especially «case»;\n#         * various built-in commands including «command», «set», and «ulimit».\n#\n#   Important for patching:\n#\n#   (2) This script targets any POSIX shell, so it avoids extensions provided\n#       by Bash, Ksh, etc; in particular arrays are avoided.\n#\n#       The \"traditional\" practice of packing multiple parameters into a\n#       space-separated string is a well documented source of bugs and security\n#       problems, so this is (mostly) avoided, by progressively accumulating\n#       options in \"$@\", and eventually passing that to Java.\n#\n#       Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS,\n#       and GRADLE_OPTS) rely on word-splitting, this is performed explicitly;\n#       see the in-line comments for details.\n#\n#       There are tweaks for specific operating systems such as AIX, CygWin,\n#       Darwin, MinGW, and NonStop.\n#\n#   (3) This script is generated from the Groovy template\n#       https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt\n#       within the Gradle project.\n#\n#       You can find Gradle at https://github.com/gradle/gradle/.\n#\n##############################################################################\n\n# Attempt to set APP_HOME\n\n# Resolve links: $0 may be a link\napp_path=$0\n\n# Need this for daisy-chained symlinks.\nwhile\n    APP_HOME=${app_path%\"${app_path##*/}\"}  # leaves a trailing /; empty if no leading path\n    [ -h \"$app_path\" ]\ndo\n    ls=$( ls -ld \"$app_path\" )\n    link=${ls#*' -> '}\n    case $link in             #(\n      /*)   app_path=$link ;; #(\n      *)    app_path=$APP_HOME$link ;;\n    esac\ndone\n\n# This is normally unused\n# shellcheck disable=SC2034\nAPP_BASE_NAME=${0##*/}\n# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)\nAPP_HOME=$( cd \"${APP_HOME:-./}\" > /dev/null && pwd -P ) || exit\n\n# Use the maximum available, or set MAX_FD != -1 to use that value.\nMAX_FD=maximum\n\nwarn () {\n    echo \"$*\"\n} >&2\n\ndie () {\n    echo\n    echo \"$*\"\n    echo\n    exit 1\n} >&2\n\n# OS specific support (must be 'true' or 'false').\ncygwin=false\nmsys=false\ndarwin=false\nnonstop=false\ncase \"$( uname )\" in                #(\n  CYGWIN* )         cygwin=true  ;; #(\n  Darwin* )         darwin=true  ;; #(\n  MSYS* | MINGW* )  msys=true    ;; #(\n  NONSTOP* )        nonstop=true ;;\nesac\n\nCLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar\n\n\n# Determine the Java command to use to start the JVM.\nif [ -n \"$JAVA_HOME\" ] ; then\n    if [ -x \"$JAVA_HOME/jre/sh/java\" ] ; then\n        # IBM's JDK on AIX uses strange locations for the executables\n        JAVACMD=$JAVA_HOME/jre/sh/java\n    else\n        JAVACMD=$JAVA_HOME/bin/java\n    fi\n    if [ ! -x \"$JAVACMD\" ] ; then\n        die \"ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nelse\n    JAVACMD=java\n    if ! command -v java >/dev/null 2>&1\n    then\n        die \"ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\n\nPlease set the JAVA_HOME variable in your environment to match the\nlocation of your Java installation.\"\n    fi\nfi\n\n# Increase the maximum file descriptors if we can.\nif ! \"$cygwin\" && ! \"$darwin\" && ! \"$nonstop\" ; then\n    case $MAX_FD in #(\n      max*)\n        # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked.\n        # shellcheck disable=SC3045\n        MAX_FD=$( ulimit -H -n ) ||\n            warn \"Could not query maximum file descriptor limit\"\n    esac\n    case $MAX_FD in  #(\n      '' | soft) :;; #(\n      *)\n        # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked.\n        # shellcheck disable=SC3045\n        ulimit -n \"$MAX_FD\" ||\n            warn \"Could not set maximum file descriptor limit to $MAX_FD\"\n    esac\nfi\n\n# Collect all arguments for the java command, stacking in reverse order:\n#   * args from the command line\n#   * the main class name\n#   * -classpath\n#   * -D...appname settings\n#   * --module-path (only if needed)\n#   * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables.\n\n# For Cygwin or MSYS, switch paths to Windows format before running java\nif \"$cygwin\" || \"$msys\" ; then\n    APP_HOME=$( cygpath --path --mixed \"$APP_HOME\" )\n    CLASSPATH=$( cygpath --path --mixed \"$CLASSPATH\" )\n\n    JAVACMD=$( cygpath --unix \"$JAVACMD\" )\n\n    # Now convert the arguments - kludge to limit ourselves to /bin/sh\n    for arg do\n        if\n            case $arg in                                #(\n              -*)   false ;;                            # don't mess with options #(\n              /?*)  t=${arg#/} t=/${t%%/*}              # looks like a POSIX filepath\n                    [ -e \"$t\" ] ;;                      #(\n              *)    false ;;\n            esac\n        then\n            arg=$( cygpath --path --ignore --mixed \"$arg\" )\n        fi\n        # Roll the args list around exactly as many times as the number of\n        # args, so each arg winds up back in the position where it started, but\n        # possibly modified.\n        #\n        # NB: a `for` loop captures its iteration list before it begins, so\n        # changing the positional parameters here affects neither the number of\n        # iterations, nor the values presented in `arg`.\n        shift                   # remove old arg\n        set -- \"$@\" \"$arg\"      # push replacement arg\n    done\nfi\n\n\n# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\nDEFAULT_JVM_OPTS='\"-Xmx64m\" \"-Xms64m\"'\n\n# Collect all arguments for the java command;\n#   * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of\n#     shell script including quotes and variable substitutions, so put them in\n#     double quotes to make sure that they get re-expanded; and\n#   * put everything else in single quotes, so that it's not re-expanded.\n\nset -- \\\n        \"-Dorg.gradle.appname=$APP_BASE_NAME\" \\\n        -classpath \"$CLASSPATH\" \\\n        org.gradle.wrapper.GradleWrapperMain \\\n        \"$@\"\n\n# Stop when \"xargs\" is not available.\nif ! command -v xargs >/dev/null 2>&1\nthen\n    die \"xargs is not available\"\nfi\n\n# Use \"xargs\" to parse quoted args.\n#\n# With -n1 it outputs one arg per line, with the quotes and backslashes removed.\n#\n# In Bash we could simply go:\n#\n#   readarray ARGS < <( xargs -n1 <<<\"$var\" ) &&\n#   set -- \"${ARGS[@]}\" \"$@\"\n#\n# but POSIX shell has neither arrays nor command substitution, so instead we\n# post-process each arg (as a line of input to sed) to backslash-escape any\n# character that might be a shell metacharacter, then use eval to reverse\n# that process (while maintaining the separation between arguments), and wrap\n# the whole thing up as a single \"set\" statement.\n#\n# This will of course break if any of these variables contains a newline or\n# an unmatched quote.\n#\n\neval \"set -- $(\n        printf '%s\\n' \"$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS\" |\n        xargs -n1 |\n        sed ' s~[^-[:alnum:]+,./:=@_]~\\\\&~g; ' |\n        tr '\\n' ' '\n    )\" '\"$@\"'\n\nexec \"$JAVACMD\" \"$@\"\n"
  },
  {
    "path": "gradlew.bat",
    "content": "@rem\r\n@rem Copyright 2015 the original author or authors.\r\n@rem\r\n@rem Licensed under the Apache License, Version 2.0 (the \"License\");\r\n@rem you may not use this file except in compliance with the License.\r\n@rem You may obtain a copy of the License at\r\n@rem\r\n@rem      https://www.apache.org/licenses/LICENSE-2.0\r\n@rem\r\n@rem Unless required by applicable law or agreed to in writing, software\r\n@rem distributed under the License is distributed on an \"AS IS\" BASIS,\r\n@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n@rem See the License for the specific language governing permissions and\r\n@rem limitations under the License.\r\n@rem\r\n\r\n@if \"%DEBUG%\"==\"\" @echo off\r\n@rem ##########################################################################\r\n@rem\r\n@rem  Gradle startup script for Windows\r\n@rem\r\n@rem ##########################################################################\r\n\r\n@rem Set local scope for the variables with windows NT shell\r\nif \"%OS%\"==\"Windows_NT\" setlocal\r\n\r\nset DIRNAME=%~dp0\r\nif \"%DIRNAME%\"==\"\" set DIRNAME=.\r\n@rem This is normally unused\r\nset APP_BASE_NAME=%~n0\r\nset APP_HOME=%DIRNAME%\r\n\r\n@rem Resolve any \".\" and \"..\" in APP_HOME to make it shorter.\r\nfor %%i in (\"%APP_HOME%\") do set APP_HOME=%%~fi\r\n\r\n@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.\r\nset DEFAULT_JVM_OPTS=\"-Xmx64m\" \"-Xms64m\"\r\n\r\n@rem Find java.exe\r\nif defined JAVA_HOME goto findJavaFromJavaHome\r\n\r\nset JAVA_EXE=java.exe\r\n%JAVA_EXE% -version >NUL 2>&1\r\nif %ERRORLEVEL% equ 0 goto execute\r\n\r\necho.\r\necho ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.\r\necho.\r\necho Please set the JAVA_HOME variable in your environment to match the\r\necho location of your Java installation.\r\n\r\ngoto fail\r\n\r\n:findJavaFromJavaHome\r\nset JAVA_HOME=%JAVA_HOME:\"=%\r\nset JAVA_EXE=%JAVA_HOME%/bin/java.exe\r\n\r\nif exist \"%JAVA_EXE%\" goto execute\r\n\r\necho.\r\necho ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%\r\necho.\r\necho Please set the JAVA_HOME variable in your environment to match the\r\necho location of your Java installation.\r\n\r\ngoto fail\r\n\r\n:execute\r\n@rem Setup the command line\r\n\r\nset CLASSPATH=%APP_HOME%\\gradle\\wrapper\\gradle-wrapper.jar\r\n\r\n\r\n@rem Execute Gradle\r\n\"%JAVA_EXE%\" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% \"-Dorg.gradle.appname=%APP_BASE_NAME%\" -classpath \"%CLASSPATH%\" org.gradle.wrapper.GradleWrapperMain %*\r\n\r\n:end\r\n@rem End local scope for the variables with windows NT shell\r\nif %ERRORLEVEL% equ 0 goto mainEnd\r\n\r\n:fail\r\nrem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of\r\nrem the _cmd.exe /c_ return code!\r\nset EXIT_CODE=%ERRORLEVEL%\r\nif %EXIT_CODE% equ 0 set EXIT_CODE=1\r\nif not \"\"==\"%GRADLE_EXIT_CONSOLE%\" exit %EXIT_CODE%\r\nexit /b %EXIT_CODE%\r\n\r\n:mainEnd\r\nif \"%OS%\"==\"Windows_NT\" endlocal\r\n\r\n:omega\r\n"
  },
  {
    "path": "rust-runtime/.gitignore",
    "content": "target/\n"
  },
  {
    "path": "rust-runtime/Cargo.toml",
    "content": "[workspace]\nresolver = \"3\"\nmembers = [\n    \"inlineable\",\n    \"aws-smithy-async\",\n    \"aws-smithy-cbor\",\n    \"aws-smithy-checksums\",\n    \"aws-smithy-compression\",\n    \"aws-smithy-dns\",\n    \"aws-smithy-eventstream\",\n    \"aws-smithy-http\",\n    \"aws-smithy-http-client\",\n    \"aws-smithy-http-server\",\n    \"aws-smithy-legacy-http\",\n    \"aws-smithy-legacy-http-server\",\n    \"aws-smithy-http-server-python\",\n    \"aws-smithy-json\",\n    \"aws-smithy-protocol-test\",\n    \"aws-smithy-query\",\n    \"aws-smithy-runtime\",\n    \"aws-smithy-runtime-api\",\n    \"aws-smithy-runtime-api-macros\",\n    \"aws-smithy-types\",\n    \"aws-smithy-types-convert\",\n    \"aws-smithy-wasm\",\n    \"aws-smithy-mocks\",\n    \"aws-smithy-experimental\",\n    \"aws-smithy-xml\",\n    \"aws-smithy-observability\",\n    \"aws-smithy-observability-otel\",\n    \"aws-smithy-http-server-metrics\",\n    \"aws-smithy-http-server-metrics-macro\",\n]\n"
  },
  {
    "path": "rust-runtime/aws-smithy-async/Cargo.toml",
    "content": "[package]\nname = \"aws-smithy-async\"\nversion = \"1.2.14\"\nauthors = [\"AWS Rust SDK Team <aws-sdk-rust@amazon.com>\", \"John DiSanti <jdisanti@amazon.com>\"]\ndescription = \"Async runtime agnostic abstractions for smithy-rs.\"\nedition = \"2021\"\nlicense = \"Apache-2.0\"\nrepository = \"https://github.com/smithy-lang/smithy-rs\"\nrust-version = \"1.91.1\"\n\n[features]\nrt-tokio = [\"tokio/time\"]\ntest-util = [\"rt-tokio\", \"tokio/rt\"]\n\n[dependencies]\npin-project-lite = \"0.2.14\"\ntokio = { version = \"1.49.0\", features = [\"sync\"] }\nfutures-util = { version = \"0.3.29\", default-features = false }\n\n[dev-dependencies]\npin-utils = \"0.1\"\ntokio = { version = \"1.49.0\", features = [\"rt\", \"macros\", \"test-util\"] }\ntokio-test = \"0.4.2\"\n\n# futures-util is used by `now_or_later`, for instance, but the tooling\n# reports a false positive, saying it is unused.\n[package.metadata.cargo-udeps.ignore]\nnormal = [\"futures-util\"]\n\n[package.metadata.docs.rs]\nall-features = true\ntargets = [\"x86_64-unknown-linux-gnu\"]\ncargo-args = [\"-Zunstable-options\", \"-Zrustdoc-scrape-examples\"]\nrustdoc-args = [\"--cfg\", \"docsrs\"]\n# End of docs.rs metadata\n\n# make sure to keep crate stability in sync with the second element of the following tuple in\n# buildSrc/src/main/kotlin/CrateSet.kt:\n#  Crate(\"aws-smithy-async\", STABLE_VERSION_PROP_NAME),\n[package.metadata.smithy-rs-release-tooling]\nstable = true\n"
  },
  {
    "path": "rust-runtime/aws-smithy-async/LICENSE",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n"
  },
  {
    "path": "rust-runtime/aws-smithy-async/README.md",
    "content": "# aws-smithy-async\n\nRuntime-agnostic abstractions and utilities for asynchronous code in smithy-rs.\n\nAsync runtime specific code is abstracted behind async traits, and implementations are provided via feature flag. For\nnow, only Tokio runtime implementations are provided.\n\n<!-- anchor_start:footer -->\nThis crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly.\n<!-- anchor_end:footer -->\n"
  },
  {
    "path": "rust-runtime/aws-smithy-async/additional-ci",
    "content": "#!/bin/bash\n#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\n\n# This script contains additional CI checks to run for this specific package\n\nset -e\n\necho '### Checking compilation under WASM'\ncargo check --target wasm32-unknown-unknown\n\necho \"### Checking for duplicate dependency versions in the normal dependency graph with all features enabled\"\ncargo tree -d --edges normal --all-features\n\necho \"### Testing every combination of features (excluding --all-features)\"\ncargo hack test --feature-powerset --exclude-all-features\n"
  },
  {
    "path": "rust-runtime/aws-smithy-async/external-types.toml",
    "content": "allowed_external_types = [\n    \"aws_smithy_types::config_bag::storable::Storable\",\n    \"aws_smithy_types::config_bag::storable::StoreReplace\",\n    \"aws_smithy_types::config_bag::storable::Storer\",\n]\n"
  },
  {
    "path": "rust-runtime/aws-smithy-async/src/future/mod.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Useful runtime-agnostic future implementations.\n\nuse futures_util::Future;\nuse std::pin::Pin;\n\npub mod never;\npub mod now_or_later;\npub mod pagination_stream;\npub mod rendezvous;\npub mod timeout;\n\n/// A boxed future that outputs a `Result<T, E>`.\npub type BoxFuture<'a, T, E> = Pin<Box<dyn Future<Output = Result<T, E>> + Send + 'a>>;\n"
  },
  {
    "path": "rust-runtime/aws-smithy-async/src/future/never.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Provides the [`Never`] future that never completes.\n\nuse std::future::Future;\nuse std::pin::Pin;\nuse std::task::{Context, Poll};\n\n/// Future that never completes.\n#[non_exhaustive]\n#[derive(Default, Debug)]\npub struct Never;\n\nimpl Never {\n    /// Create a new `Never` future that never resolves\n    pub fn new() -> Never {\n        Default::default()\n    }\n}\n\nimpl Future for Never {\n    type Output = ();\n\n    fn poll(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll<Self::Output> {\n        Poll::Pending\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-async/src/future/now_or_later.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Provides the [`NowOrLater`] future with an explicit `Now` variant\n//!\n//! When a future is immediately, ready, this enables avoiding an unnecessary allocation.\n//! This is intended to be used with `Pin<Box<dyn Future>>` or similar as the future variant. For\n//! convenience, [`BoxFuture`] is provided for this use case.\n//!\n//! Typically, this is used when creating a manual async trait. In this case, it's critical that the\n//! lifetime is captured to enable interop with the async-trait macro.\n//!\n//! # Examples\n//!\n//! ```rust\n//! mod future {\n//!   use aws_smithy_async::future::now_or_later::{NowOrLater, BoxFuture};\n//!   use std::future::Future;\n//!   pub struct ProvideRegion<'a>(NowOrLater<Option<String>, BoxFuture<'a, Option<String>>>);\n//!   impl<'a> ProvideRegion<'a> {\n//!       pub fn new(f: impl Future<Output = Option<String>> + Send + 'a) -> Self {\n//!           Self(NowOrLater::new(Box::pin(f)))\n//!       }\n//!\n//!       pub fn ready(region: Option<String>) -> Self {\n//!           Self(NowOrLater::ready(region))\n//!       }\n//!   }\n//! }\n//!\n//! pub trait ProvideRegion {\n//!     fn provide_region<'a>(&'a self) -> future::ProvideRegion<'a> where Self: 'a;\n//! }\n//!\n//! struct AsyncRegionProvider;\n//! impl AsyncRegionProvider {\n//!     async fn region(&self) -> Option<String> {\n//!         todo!()\n//!     }\n//! }\n//!\n//! impl ProvideRegion for AsyncRegionProvider {\n//!     fn provide_region<'a>(&'a self) -> future::ProvideRegion<'a> where Self: 'a {\n//!       future::ProvideRegion::new(self.region())\n//!     }\n//! }\n//! ```\n\nuse std::fmt;\nuse std::future::Future;\nuse std::pin::Pin;\nuse std::task::{Context, Poll};\n\nuse pin_project_lite::pin_project;\n\n/// Boxed future type alias\npub type BoxFuture<'a, T> = Pin<Box<dyn Future<Output = T> + Send + 'a>>;\n\n#[derive(Debug)]\n/// Zero sized type for using NowOrLater when no future variant exists.\npub enum OnlyReady {}\n\npin_project! {\n    /// Future with an explicit `Now` variant\n    ///\n    /// See the [module documentation](crate::future::now_or_later) for more information.\n    pub struct NowOrLater<T, F> {\n        #[pin]\n        inner: Inner<T, F>\n    }\n}\n\nimpl<T, F> fmt::Debug for NowOrLater<T, F>\nwhere\n    T: fmt::Debug,\n{\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        f.debug_struct(\"NowOrLater\")\n            .field(\"inner\", &self.inner)\n            .finish()\n    }\n}\n\npin_project! {\n    #[project = NowOrLaterProj]\n    enum Inner<T, F> {\n        #[non_exhaustive]\n        Now { value: Option<T> },\n        #[non_exhaustive]\n        Later { #[pin] future: F },\n    }\n}\n\nimpl<T, F> fmt::Debug for Inner<T, F>\nwhere\n    T: fmt::Debug,\n{\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        match self {\n            Self::Now { value } => f.debug_struct(\"Now\").field(\"value\", value).finish(),\n            Self::Later { .. } => f\n                .debug_struct(\"Later\")\n                .field(\"future\", &\"<future>\")\n                .finish(),\n        }\n    }\n}\n\nimpl<T, F> NowOrLater<T, F> {\n    /// Creates a future that will resolve when `future` resolves\n    pub fn new(future: F) -> Self {\n        Self {\n            inner: Inner::Later { future },\n        }\n    }\n\n    /// Creates a future that immediately resolves to `value`\n    pub fn ready(value: T) -> NowOrLater<T, F> {\n        let value = Some(value);\n        Self {\n            inner: Inner::Now { value },\n        }\n    }\n}\n\nimpl<T, F> Future for NowOrLater<T, F>\nwhere\n    F: Future<Output = T>,\n{\n    type Output = T;\n\n    fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {\n        match self.project().inner.project() {\n            NowOrLaterProj::Now { value } => {\n                Poll::Ready(value.take().expect(\"cannot be called twice\"))\n            }\n            NowOrLaterProj::Later { future } => future.poll(cx),\n        }\n    }\n}\n\nimpl<T> Future for NowOrLater<T, OnlyReady> {\n    type Output = T;\n\n    fn poll(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll<Self::Output> {\n        match self.project().inner.project() {\n            NowOrLaterProj::Now { value } => {\n                Poll::Ready(value.take().expect(\"cannot be called twice\"))\n            }\n            NowOrLaterProj::Later { .. } => unreachable!(),\n        }\n    }\n}\n\n#[cfg(test)]\nmod test {\n    use crate::future::now_or_later::{NowOrLater, OnlyReady};\n    use futures_util::FutureExt;\n\n    #[test]\n    fn ready_future_immediately_returns() {\n        let a = true;\n        let f = if a {\n            NowOrLater::ready(5)\n        } else {\n            NowOrLater::new(async { 5 })\n        };\n        use futures_util::FutureExt;\n        assert_eq!(f.now_or_never().expect(\"future was ready\"), 5);\n    }\n\n    #[test]\n    fn only_ready_instantiation() {\n        assert_eq!(\n            NowOrLater::<i32, OnlyReady>::ready(5)\n                .now_or_never()\n                .expect(\"ready\"),\n            5\n        );\n    }\n\n    #[tokio::test]\n    async fn box_dyn_future() {\n        let f = async { 5 };\n        let f = Box::pin(f);\n        let wrapped = NowOrLater::new(f);\n        assert_eq!(wrapped.await, 5);\n    }\n\n    #[tokio::test]\n    async fn async_fn_future() {\n        let wrapped = NowOrLater::new(async { 5 });\n        assert_eq!(wrapped.await, 5);\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-async/src/future/pagination_stream/collect.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Module to extend the functionality of types in `patination_stream` module to allow for\n//! collecting elements of the stream into collection.\n//!\n//! Majority of the code is borrowed from\n//! <https://github.com/tokio-rs/tokio/blob/fc9518b62714daac9a38b46c698b94ac5d5b1ca2/tokio-stream/src/stream_ext/collect.rs>\n\npub(crate) mod sealed {\n    /// A trait that signifies that elements can be collected into `T`.\n    ///\n    /// Currently the trait may not be implemented by clients so we can make changes in the future\n    /// without breaking code depending on it.\n    pub trait Collectable<T> {\n        type Collection;\n\n        fn initialize() -> Self::Collection;\n\n        fn extend(collection: &mut Self::Collection, item: T) -> bool;\n\n        fn finalize(collection: Self::Collection) -> Self;\n    }\n}\n\nimpl<T> sealed::Collectable<T> for Vec<T> {\n    type Collection = Self;\n\n    fn initialize() -> Self::Collection {\n        Vec::default()\n    }\n\n    fn extend(collection: &mut Self::Collection, item: T) -> bool {\n        collection.push(item);\n        true\n    }\n\n    fn finalize(collection: Self::Collection) -> Self {\n        collection\n    }\n}\n\nimpl<T, U, E> sealed::Collectable<Result<T, E>> for Result<U, E>\nwhere\n    U: sealed::Collectable<T>,\n{\n    type Collection = Result<U::Collection, E>;\n\n    fn initialize() -> Self::Collection {\n        Ok(U::initialize())\n    }\n\n    fn extend(collection: &mut Self::Collection, item: Result<T, E>) -> bool {\n        match item {\n            Ok(item) => {\n                let collection = collection.as_mut().ok().expect(\"invalid state\");\n                U::extend(collection, item)\n            }\n            Err(e) => {\n                *collection = Err(e);\n                false\n            }\n        }\n    }\n\n    fn finalize(collection: Self::Collection) -> Self {\n        match collection {\n            Ok(collection) => Ok(U::finalize(collection)),\n            err @ Err(_) => Err(err.map(drop).unwrap_err()),\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-async/src/future/pagination_stream/fn_stream.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Module to define utility to drive a stream with an async function and a channel.\n\nuse crate::future::pagination_stream::collect::sealed::Collectable;\nuse crate::future::rendezvous;\nuse pin_project_lite::pin_project;\nuse std::fmt;\nuse std::future::poll_fn;\nuse std::future::Future;\nuse std::pin::Pin;\nuse std::task::{Context, Poll};\n\npin_project! {\n    /// The closure is passed a reference to a `Sender` which acts as a rendezvous channel. Messages\n    /// sent to the sender will be emitted to the stream. Because the stream is 1-bounded, the function\n    /// will not proceed until the stream is read.\n    ///\n    /// This utility is used by generated paginators to generate a stream of paginated results.\n    ///\n    /// If `tx.send` returns an error, the function MUST return immediately.\n    ///\n    /// Note `FnStream` is only `Send` but not `Sync` because `generator` is a boxed future that\n    /// is `Send` and returns `()` as output when it is done.\n    ///\n    /// # Examples\n    /// ```no_run\n    /// # async fn docs() {\n    /// use aws_smithy_async::future::pagination_stream::fn_stream::FnStream;\n    /// let mut stream = FnStream::new(|tx| Box::pin(async move {\n    ///     if let Err(_) = tx.send(\"Hello!\").await {\n    ///         return;\n    ///     }\n    ///     if let Err(_) = tx.send(\"Goodbye!\").await {\n    ///         return;\n    ///     }\n    /// }));\n    /// assert_eq!(stream.collect::<Vec<_>>().await, vec![\"Hello!\", \"Goodbye!\"]);\n    /// # }\n    pub struct FnStream<Item> {\n        #[pin]\n        rx: rendezvous::Receiver<Item>,\n        generator: Option<Pin<Box<dyn Future<Output = ()> + Send + 'static>>>,\n    }\n}\n\nimpl<Item> fmt::Debug for FnStream<Item> {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        let item_typename = std::any::type_name::<Item>();\n        write!(f, \"FnStream<{item_typename}>\")\n    }\n}\n\nimpl<Item> FnStream<Item> {\n    /// Creates a new function based stream driven by `generator`.\n    ///\n    /// For examples, see the documentation for [`FnStream`]\n    pub fn new<T>(generator: T) -> Self\n    where\n        T: FnOnce(rendezvous::Sender<Item>) -> Pin<Box<dyn Future<Output = ()> + Send + 'static>>,\n    {\n        let (tx, rx) = rendezvous::channel::<Item>();\n        Self {\n            rx,\n            generator: Some(Box::pin(generator(tx))),\n        }\n    }\n\n    /// Consumes and returns the next `Item` from this stream.\n    pub async fn next(&mut self) -> Option<Item>\n    where\n        Self: Unpin,\n    {\n        let mut me = Pin::new(self);\n        poll_fn(|cx| me.as_mut().poll_next(cx)).await\n    }\n\n    /// Attempts to pull out the next value of this stream, returning `None` if the stream is\n    /// exhausted.\n    pub(crate) fn poll_next(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Option<Item>> {\n        let mut me = self.project();\n        match me.rx.poll_recv(cx) {\n            Poll::Ready(item) => Poll::Ready(item),\n            Poll::Pending => {\n                if let Some(generator) = me.generator {\n                    if generator.as_mut().poll(cx).is_ready() {\n                        // `generator` keeps writing items to `tx` and will not be `Poll::Ready`\n                        // until it is done writing to `tx`. Once it is done, it returns `()`\n                        // as output and is `Poll::Ready`, at which point we MUST NOT poll it again\n                        // since doing so will cause a panic.\n                        *me.generator = None;\n                    }\n                }\n                Poll::Pending\n            }\n        }\n    }\n\n    /// Consumes this stream and gathers elements into a collection.\n    pub async fn collect<T: Collectable<Item>>(mut self) -> T {\n        let mut collection = T::initialize();\n        while let Some(item) = self.next().await {\n            if !T::extend(&mut collection, item) {\n                break;\n            }\n        }\n        T::finalize(collection)\n    }\n}\n\nimpl<T, E> FnStream<Result<T, E>> {\n    /// Yields the next item in the stream or returns an error if an error is encountered.\n    pub async fn try_next(&mut self) -> Result<Option<T>, E> {\n        self.next().await.transpose()\n    }\n\n    /// Convenience method for `.collect::<Result<Vec<_>, _>()`.\n    pub async fn try_collect(self) -> Result<Vec<T>, E> {\n        self.collect::<Result<Vec<T>, E>>().await\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-async/src/future/pagination_stream.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Provides types to support stream-like operations for paginators.\n\nuse crate::future::pagination_stream::collect::sealed::Collectable;\nuse std::future::Future;\nuse std::pin::Pin;\nuse std::task::{Context, Poll};\n\npub mod collect;\npub mod fn_stream;\nuse fn_stream::FnStream;\n\n/// Stream specifically made to support paginators.\n///\n/// `PaginationStream` provides two primary mechanisms for accessing stream of data.\n/// 1. With [`.next()`](PaginationStream::next) (or [`try_next()`](PaginationStream::try_next)):\n///\n/// ```no_run\n/// # async fn docs() {\n/// # use aws_smithy_async::future::pagination_stream::PaginationStream;\n/// # fn operation_to_yield_paginator<T>() -> PaginationStream<T> {\n/// #     todo!()\n/// # }\n/// # struct Page;\n/// let mut stream: PaginationStream<Page> = operation_to_yield_paginator();\n/// while let Some(page) = stream.next().await {\n///     // process `page`\n/// }\n/// # }\n/// ```\n/// 2. With [`.collect()`](PaginationStream::collect) (or [`try_collect()`](PaginationStream::try_collect)):\n///\n/// ```no_run\n/// # async fn docs() {\n/// # use aws_smithy_async::future::pagination_stream::PaginationStream;\n/// # fn operation_to_yield_paginator<T>() -> PaginationStream<T> {\n/// #     todo!()\n/// # }\n/// # struct Page;\n/// let mut stream: PaginationStream<Page> = operation_to_yield_paginator();\n/// let result = stream.collect::<Vec<Page>>().await;\n/// # }\n/// ```\n///\n/// [`PaginationStream`] is implemented in terms of [`FnStream`], but the latter is meant to be\n/// used internally and not by external users.\n#[derive(Debug)]\npub struct PaginationStream<Item>(FnStream<Item>);\n\nimpl<Item> PaginationStream<Item> {\n    /// Creates a `PaginationStream` from the given [`FnStream`].\n    pub fn new(stream: FnStream<Item>) -> Self {\n        Self(stream)\n    }\n\n    /// Consumes and returns the next `Item` from this stream.\n    pub async fn next(&mut self) -> Option<Item> {\n        self.0.next().await\n    }\n\n    /// Poll an item from the stream\n    pub fn poll_next(&mut self, cx: &mut Context<'_>) -> Poll<Option<Item>> {\n        Pin::new(&mut self.0).poll_next(cx)\n    }\n\n    /// Consumes this stream and gathers elements into a collection.\n    pub async fn collect<T: Collectable<Item>>(self) -> T {\n        self.0.collect().await\n    }\n}\n\nimpl<T, E> PaginationStream<Result<T, E>> {\n    /// Yields the next item in the stream or returns an error if an error is encountered.\n    pub async fn try_next(&mut self) -> Result<Option<T>, E> {\n        self.next().await.transpose()\n    }\n\n    /// Convenience method for `.collect::<Result<Vec<_>, _>()`.\n    pub async fn try_collect(self) -> Result<Vec<T>, E> {\n        self.collect::<Result<Vec<T>, E>>().await\n    }\n}\n\n/// Utility wrapper to flatten paginated results\n///\n/// When flattening paginated results, it's most convenient to produce an iterator where the `Result`\n/// is present in each item. This provides `items()` which can wrap an stream of `Result<Page, Err>`\n/// and produce a stream of `Result<Item, Err>`.\n#[derive(Debug)]\npub struct TryFlatMap<Page, Err>(PaginationStream<Result<Page, Err>>);\n\nimpl<Page, Err> TryFlatMap<Page, Err> {\n    /// Creates a `TryFlatMap` that wraps the input.\n    pub fn new(stream: PaginationStream<Result<Page, Err>>) -> Self {\n        Self(stream)\n    }\n\n    /// Produces a new [`PaginationStream`] by mapping this stream with `map` then flattening the result.\n    pub fn flat_map<M, Item, Iter>(mut self, map: M) -> PaginationStream<Result<Item, Err>>\n    where\n        Page: Send + 'static,\n        Err: Send + 'static,\n        M: Fn(Page) -> Iter + Send + 'static,\n        Item: Send + 'static,\n        Iter: IntoIterator<Item = Item> + Send,\n        <Iter as IntoIterator>::IntoIter: Send,\n    {\n        PaginationStream::new(FnStream::new(|tx| {\n            Box::pin(async move {\n                while let Some(page) = self.0.next().await {\n                    match page {\n                        Ok(page) => {\n                            let mapped = map(page);\n                            for item in mapped.into_iter() {\n                                let _ = tx.send(Ok(item)).await;\n                            }\n                        }\n                        Err(e) => {\n                            let _ = tx.send(Err(e)).await;\n                            break;\n                        }\n                    }\n                }\n            }) as Pin<Box<dyn Future<Output = ()> + Send>>\n        }))\n    }\n}\n\n#[cfg(test)]\nmod test {\n    use crate::future::pagination_stream::{FnStream, PaginationStream, TryFlatMap};\n    use std::sync::{Arc, Mutex};\n    use std::time::Duration;\n\n    /// basic test of FnStream functionality\n    #[tokio::test]\n    async fn fn_stream_returns_results() {\n        tokio::time::pause();\n        let mut stream = FnStream::new(|tx| {\n            Box::pin(async move {\n                tx.send(\"1\").await.expect(\"failed to send\");\n                tokio::time::sleep(Duration::from_secs(1)).await;\n                tokio::time::sleep(Duration::from_secs(1)).await;\n                tx.send(\"2\").await.expect(\"failed to send\");\n                tokio::time::sleep(Duration::from_secs(1)).await;\n                tx.send(\"3\").await.expect(\"failed to send\");\n            })\n        });\n        let mut out = vec![];\n        while let Some(value) = stream.next().await {\n            out.push(value);\n        }\n        assert_eq!(vec![\"1\", \"2\", \"3\"], out);\n    }\n\n    #[tokio::test]\n    async fn fn_stream_try_next() {\n        tokio::time::pause();\n        let mut stream = FnStream::new(|tx| {\n            Box::pin(async move {\n                tx.send(Ok(1)).await.unwrap();\n                tx.send(Ok(2)).await.unwrap();\n                tx.send(Err(\"err\")).await.unwrap();\n            })\n        });\n        let mut out = vec![];\n        while let Ok(value) = stream.try_next().await {\n            out.push(value);\n        }\n        assert_eq!(vec![Some(1), Some(2)], out);\n    }\n\n    // smithy-rs#1902: there was a bug where we could continue to poll the generator after it\n    // had returned Poll::Ready. This test case leaks the tx half so that the channel stays open\n    // but the send side generator completes. By calling `poll` multiple times on the resulting future,\n    // we can trigger the bug and validate the fix.\n    #[tokio::test]\n    async fn fn_stream_doesnt_poll_after_done() {\n        let mut stream = FnStream::new(|tx| {\n            Box::pin(async move {\n                assert!(tx.send(\"blah\").await.is_ok());\n                Box::leak(Box::new(tx));\n            })\n        });\n        assert_eq!(Some(\"blah\"), stream.next().await);\n        let mut test_stream = tokio_test::task::spawn(stream);\n        // `tokio_test::task::Spawn::poll_next` can only be invoked when the wrapped\n        // type implements the `Stream` trait. Here, `FnStream` does not implement it,\n        // so we work around it by using the `enter` method.\n        test_stream.enter(|ctx, pin| {\n            let polled = pin.poll_next(ctx);\n            assert!(polled.is_pending());\n        });\n        test_stream.enter(|ctx, pin| {\n            let polled = pin.poll_next(ctx);\n            assert!(polled.is_pending());\n        });\n    }\n\n    /// Tests that the generator will not advance until demand exists\n    #[tokio::test]\n    async fn waits_for_reader() {\n        let progress = Arc::new(Mutex::new(0));\n        let mut stream = FnStream::new(|tx| {\n            let progress = progress.clone();\n            Box::pin(async move {\n                *progress.lock().unwrap() = 1;\n                tx.send(\"1\").await.expect(\"failed to send\");\n                *progress.lock().unwrap() = 2;\n                tx.send(\"2\").await.expect(\"failed to send\");\n                *progress.lock().unwrap() = 3;\n                tx.send(\"3\").await.expect(\"failed to send\");\n                *progress.lock().unwrap() = 4;\n            })\n        });\n        assert_eq!(*progress.lock().unwrap(), 0);\n        stream.next().await.expect(\"ready\");\n        assert_eq!(*progress.lock().unwrap(), 1);\n\n        assert_eq!(\"2\", stream.next().await.expect(\"ready\"));\n        assert_eq!(2, *progress.lock().unwrap());\n\n        let _ = stream.next().await.expect(\"ready\");\n        assert_eq!(3, *progress.lock().unwrap());\n        assert_eq!(None, stream.next().await);\n        assert_eq!(4, *progress.lock().unwrap());\n    }\n\n    #[tokio::test]\n    async fn generator_with_errors() {\n        let mut stream = FnStream::new(|tx| {\n            Box::pin(async move {\n                for i in 0..5 {\n                    if i != 2 {\n                        if tx.send(Ok(i)).await.is_err() {\n                            return;\n                        }\n                    } else {\n                        tx.send(Err(i)).await.unwrap();\n                        return;\n                    }\n                }\n            })\n        });\n        let mut out = vec![];\n        while let Some(Ok(value)) = stream.next().await {\n            out.push(value);\n        }\n        assert_eq!(vec![0, 1], out);\n    }\n\n    #[tokio::test]\n    async fn flatten_items_ok() {\n        #[derive(Debug)]\n        struct Output {\n            items: Vec<u8>,\n        }\n        let stream: FnStream<Result<_, &str>> = FnStream::new(|tx| {\n            Box::pin(async move {\n                tx.send(Ok(Output {\n                    items: vec![1, 2, 3],\n                }))\n                .await\n                .unwrap();\n                tx.send(Ok(Output {\n                    items: vec![4, 5, 6],\n                }))\n                .await\n                .unwrap();\n            })\n        });\n        assert_eq!(\n            Ok(vec![1, 2, 3, 4, 5, 6]),\n            TryFlatMap::new(PaginationStream::new(stream))\n                .flat_map(|output| output.items.into_iter())\n                .try_collect()\n                .await,\n        );\n    }\n\n    #[tokio::test]\n    async fn flatten_items_error() {\n        #[derive(Debug)]\n        struct Output {\n            items: Vec<u8>,\n        }\n        let stream = FnStream::new(|tx| {\n            Box::pin(async move {\n                tx.send(Ok(Output {\n                    items: vec![1, 2, 3],\n                }))\n                .await\n                .unwrap();\n                tx.send(Err(\"bummer\")).await.unwrap();\n            })\n        });\n        assert_eq!(\n            Err(\"bummer\"),\n            TryFlatMap::new(PaginationStream::new(stream))\n                .flat_map(|output| output.items.into_iter())\n                .try_collect()\n                .await\n        )\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-async/src/future/rendezvous.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Rendezvous channel implementation\n//!\n//! Rendezvous channels are equivalent to a channel with a 0-sized buffer: A sender cannot send\n//! until there is an active receiver waiting. This implementation uses a Semaphore to record demand\n//! and coordinate with the receiver.\n//!\n//! Rendezvous channels should be used with care—it's inherently easy to deadlock unless they're being\n//! used from separate tasks or an a coroutine setup (e.g. [`crate::future::pagination_stream::fn_stream::FnStream`])\n\nuse std::future::poll_fn;\nuse std::sync::Arc;\nuse std::task::{Context, Poll};\nuse tokio::sync::Semaphore;\n\n/// Create a new rendezvous channel\n///\n/// Rendezvous channels are equivalent to a channel with a 0-sized buffer: A sender cannot send\n/// until this is an active receiver waiting. This implementation uses a semaphore to record demand\n/// and coordinate with the receiver.\npub fn channel<T>() -> (Sender<T>, Receiver<T>) {\n    let (tx, rx) = tokio::sync::mpsc::channel(1);\n    let semaphore = Arc::new(Semaphore::new(0));\n    (\n        Sender {\n            semaphore: semaphore.clone(),\n            chan: tx,\n        },\n        Receiver {\n            semaphore,\n            chan: rx,\n            needs_permit: false,\n        },\n    )\n}\n\n/// Errors for rendezvous channel\npub mod error {\n    use std::fmt;\n    use tokio::sync::mpsc::error::SendError as TokioSendError;\n\n    /// Error when [crate::future::rendezvous::Sender] fails to send a value to the associated `Receiver`\n    #[derive(Debug)]\n    pub struct SendError<T> {\n        source: TokioSendError<T>,\n    }\n\n    impl<T> SendError<T> {\n        pub(crate) fn tokio_send_error(source: TokioSendError<T>) -> Self {\n            Self { source }\n        }\n    }\n\n    impl<T> fmt::Display for SendError<T> {\n        fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n            write!(f, \"failed to send value to the receiver\")\n        }\n    }\n\n    impl<T: fmt::Debug + 'static> std::error::Error for SendError<T> {\n        fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {\n            Some(&self.source)\n        }\n    }\n}\n\n#[derive(Debug)]\n/// Sender-half of a channel\npub struct Sender<T> {\n    semaphore: Arc<Semaphore>,\n    chan: tokio::sync::mpsc::Sender<T>,\n}\n\nimpl<T> Sender<T> {\n    /// Send `item` into the channel waiting until there is matching demand\n    ///\n    /// Unlike something like `tokio::sync::mpsc::Channel` where sending a value will be buffered until\n    /// demand exists, a rendezvous sender will wait until matching demand exists before this function will return.\n    pub async fn send(&self, item: T) -> Result<(), error::SendError<T>> {\n        let result = self.chan.send(item).await;\n        // If this is an error, the rx half has been dropped. We will never get demand.\n        if result.is_ok() {\n            // The key here is that we block _after_ the send until more demand exists\n            self.semaphore\n                .acquire()\n                .await\n                .expect(\"semaphore is never closed\")\n                .forget();\n        }\n        result.map_err(error::SendError::tokio_send_error)\n    }\n}\n\n#[derive(Debug)]\n/// Receiver half of the rendezvous channel\npub struct Receiver<T> {\n    semaphore: Arc<Semaphore>,\n    chan: tokio::sync::mpsc::Receiver<T>,\n    needs_permit: bool,\n}\n\nimpl<T> Receiver<T> {\n    /// Polls to receive an item from the channel\n    pub async fn recv(&mut self) -> Option<T> {\n        poll_fn(|cx| self.poll_recv(cx)).await\n    }\n\n    pub(crate) fn poll_recv(&mut self, cx: &mut Context<'_>) -> Poll<Option<T>> {\n        // This uses `needs_permit` to track whether this is the first poll since we last returned an item.\n        // If it is, we will grant a permit to the semaphore. Otherwise, we'll just forward the response through.\n        let resp = self.chan.poll_recv(cx);\n        // If there is no data on the channel, but we are reading, then give a permit so we can load data\n        if self.needs_permit && matches!(resp, Poll::Pending) {\n            self.needs_permit = false;\n            self.semaphore.add_permits(1);\n        }\n\n        if matches!(resp, Poll::Ready(_)) {\n            // we returned an item, no need to provide another permit until we fail to read from the channel again\n            self.needs_permit = true;\n        }\n        resp\n    }\n}\n\n#[cfg(test)]\nmod test {\n    use crate::future::rendezvous::channel;\n    use std::sync::{Arc, Mutex};\n\n    #[tokio::test]\n    async fn send_blocks_caller() {\n        let (tx, mut rx) = channel::<u8>();\n        let done = Arc::new(Mutex::new(0));\n        let idone = done.clone();\n        let send = tokio::spawn(async move {\n            *idone.lock().unwrap() = 1;\n            tx.send(0).await.unwrap();\n            *idone.lock().unwrap() = 2;\n            tx.send(1).await.unwrap();\n            *idone.lock().unwrap() = 3;\n        });\n        assert_eq!(*done.lock().unwrap(), 0);\n        assert_eq!(rx.recv().await, Some(0));\n        assert_eq!(*done.lock().unwrap(), 1);\n        assert_eq!(rx.recv().await, Some(1));\n        assert_eq!(*done.lock().unwrap(), 2);\n        assert_eq!(rx.recv().await, None);\n        assert_eq!(*done.lock().unwrap(), 3);\n        let _ = send.await;\n    }\n\n    #[tokio::test]\n    async fn send_errors_when_rx_dropped() {\n        let (tx, rx) = channel::<u8>();\n        drop(rx);\n        tx.send(0).await.expect_err(\"rx half dropped\");\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-async/src/future/timeout.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n// This code was copied and then modified from Tokio.\n\n/*\n * Copyright (c) 2021 Tokio Contributors\n *\n * Permission is hereby granted, free of charge, to any\n * person obtaining a copy of this software and associated\n * documentation files (the \"Software\"), to deal in the\n * Software without restriction, including without\n * limitation the rights to use, copy, modify, merge,\n * publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software\n * is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice\n * shall be included in all copies or substantial portions\n * of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF\n * ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED\n * TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A\n * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT\n * SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR\n * IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\n * DEALINGS IN THE SOFTWARE.\n */\n\n//! Provides the [`Timeout`] future for adding a timeout to another future.\n\nuse pin_project_lite::pin_project;\nuse std::error::Error;\nuse std::fmt;\nuse std::future::Future;\nuse std::pin::Pin;\nuse std::task::{Context, Poll};\n\n/// Error returned when [`Timeout`] times out\n#[derive(Debug)]\npub struct TimedOutError;\n\nimpl Error for TimedOutError {}\n\nimpl fmt::Display for TimedOutError {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        write!(f, \"timed out\")\n    }\n}\n\npin_project! {\n    /// Timeout Future\n    #[non_exhaustive]\n    #[must_use = \"futures do nothing unless you `.await` or poll them\"]\n    #[derive(Debug)]\n    pub struct Timeout<T, S> {\n        #[pin]\n        value: T,\n        #[pin]\n        sleep: S,\n    }\n}\n\nimpl<T, S> Timeout<T, S> {\n    /// Create a new future that will race `value` and `sleep`.\n    ///\n    /// If `sleep` resolves first, a timeout error is returned. Otherwise, the value is returned.\n    pub fn new(value: T, sleep: S) -> Timeout<T, S> {\n        Timeout { value, sleep }\n    }\n}\n\nimpl<T, S> Future for Timeout<T, S>\nwhere\n    T: Future,\n    S: Future,\n{\n    type Output = Result<T::Output, TimedOutError>;\n\n    fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {\n        let me = self.project();\n\n        // First, try polling the future\n        if let Poll::Ready(v) = me.value.poll(cx) {\n            return Poll::Ready(Ok(v));\n        }\n\n        // Now check the timer\n        match me.sleep.poll(cx) {\n            Poll::Ready(_) => Poll::Ready(Err(TimedOutError)),\n            Poll::Pending => Poll::Pending,\n        }\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::{TimedOutError, Timeout};\n    use crate::future::never::Never;\n\n    #[tokio::test]\n    async fn success() {\n        assert!(matches!(\n            Timeout::new(async { Ok::<isize, isize>(5) }, Never).await,\n            Ok(Ok(5))\n        ));\n    }\n\n    #[tokio::test]\n    async fn failure() {\n        assert!(matches!(\n            Timeout::new(async { Err::<isize, isize>(0) }, Never).await,\n            Ok(Err(0))\n        ));\n    }\n\n    #[tokio::test]\n    async fn timeout() {\n        assert!(matches!(\n            Timeout::new(Never, async {}).await,\n            Err(TimedOutError)\n        ));\n    }\n\n    // If the value is available at the same time as the timeout, then return the value\n    #[tokio::test]\n    async fn prefer_value_to_timeout() {\n        assert!(matches!(Timeout::new(async { 5 }, async {}).await, Ok(5)));\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-async/src/lib.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/* Automatically managed default lints */\n#![cfg_attr(docsrs, feature(doc_cfg))]\n/* End of automatically managed default lints */\n#![allow(clippy::derive_partial_eq_without_eq)]\n#![warn(\n    missing_docs,\n    rustdoc::missing_crate_level_docs,\n    unreachable_pub,\n    rust_2018_idioms\n)]\n\n//! Future utilities and runtime-agnostic abstractions for smithy-rs.\n//!\n//! Async runtime specific code is abstracted behind async traits, and implementations are\n//! provided via feature flag. For now, only Tokio runtime implementations are provided.\n\npub mod future;\npub mod rt;\n#[cfg(feature = \"test-util\")]\npub mod test_util;\npub mod time;\n\n/// Given an `Instant` and a `Duration`, assert time elapsed since `Instant` is equal to `Duration`.\n/// This macro allows for a 5ms margin of error.\n///\n/// # Example\n///\n/// ```rust,ignore\n/// let now = std::time::Instant::now();\n/// let _ = some_function_that_always_takes_five_seconds_to_run().await;\n/// assert_elapsed!(now, std::time::Duration::from_secs(5));\n/// ```\n#[macro_export]\nmacro_rules! assert_elapsed {\n    ($start:expr, $dur:expr) => {\n        assert_elapsed!($start, $dur, std::time::Duration::from_millis(5));\n    };\n    ($start:expr, $dur:expr, $margin_of_error:expr) => {{\n        let elapsed = $start.elapsed();\n        // type ascription improves compiler error when wrong type is passed\n        let margin_of_error: std::time::Duration = $margin_of_error;\n        let lower: std::time::Duration = $dur - margin_of_error;\n        let upper: std::time::Duration = $dur + margin_of_error;\n\n        // Handles ms rounding\n        assert!(\n            elapsed >= lower && elapsed <= upper,\n            \"actual = {:?}, expected = {:?}\",\n            elapsed,\n            lower\n        );\n    }};\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-async/src/rt/mod.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Async runtime agnostic traits and implementations.\n\npub mod sleep;\n"
  },
  {
    "path": "rust-runtime/aws-smithy-async/src/rt/sleep.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Provides an [`AsyncSleep`] trait that returns a future that sleeps for a given duration,\n//! and implementations of `AsyncSleep` for different async runtimes.\n\nuse std::fmt::{Debug, Formatter};\nuse std::future::Future;\nuse std::pin::Pin;\nuse std::sync::Arc;\nuse std::task::{Context, Poll};\nuse std::time::Duration;\n\n/// Async trait with a `sleep` function.\npub trait AsyncSleep: Debug + Send + Sync {\n    /// Returns a future that sleeps for the given `duration` of time.\n    fn sleep(&self, duration: Duration) -> Sleep;\n}\n\nimpl<T> AsyncSleep for Box<T>\nwhere\n    T: AsyncSleep,\n    T: ?Sized,\n{\n    fn sleep(&self, duration: Duration) -> Sleep {\n        T::sleep(self, duration)\n    }\n}\n\nimpl<T> AsyncSleep for Arc<T>\nwhere\n    T: AsyncSleep,\n    T: ?Sized,\n{\n    fn sleep(&self, duration: Duration) -> Sleep {\n        T::sleep(self, duration)\n    }\n}\n\n/// Wrapper type for sharable `AsyncSleep`\n#[derive(Clone, Debug)]\npub struct SharedAsyncSleep(Arc<dyn AsyncSleep>);\n\nimpl SharedAsyncSleep {\n    /// Create a new `SharedAsyncSleep` from `AsyncSleep`\n    pub fn new(sleep: impl AsyncSleep + 'static) -> Self {\n        Self(Arc::new(sleep))\n    }\n}\n\nimpl AsRef<dyn AsyncSleep> for SharedAsyncSleep {\n    fn as_ref(&self) -> &(dyn AsyncSleep + 'static) {\n        self.0.as_ref()\n    }\n}\n\nimpl From<Arc<dyn AsyncSleep>> for SharedAsyncSleep {\n    fn from(sleep: Arc<dyn AsyncSleep>) -> Self {\n        SharedAsyncSleep(sleep)\n    }\n}\n\nimpl AsyncSleep for SharedAsyncSleep {\n    fn sleep(&self, duration: Duration) -> Sleep {\n        self.0.sleep(duration)\n    }\n}\n\n#[cfg(feature = \"rt-tokio\")]\n/// Returns a default sleep implementation based on the features enabled\npub fn default_async_sleep() -> Option<SharedAsyncSleep> {\n    Some(SharedAsyncSleep::from(sleep_tokio()))\n}\n\n#[cfg(not(feature = \"rt-tokio\"))]\n/// Returns a default sleep implementation based on the features enabled\npub fn default_async_sleep() -> Option<SharedAsyncSleep> {\n    None\n}\n\n/// Future returned by [`AsyncSleep`].\n#[non_exhaustive]\n#[must_use]\npub struct Sleep(Pin<Box<dyn Future<Output = ()> + Send + Sync + 'static>>);\n\nimpl Debug for Sleep {\n    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {\n        write!(f, \"Sleep\")\n    }\n}\n\nimpl Sleep {\n    /// Create a new [`Sleep`] future\n    ///\n    /// The provided future will be Boxed.\n    pub fn new(future: impl Future<Output = ()> + Send + Sync + 'static) -> Sleep {\n        Sleep(Box::pin(future))\n    }\n}\n\nimpl Future for Sleep {\n    type Output = ();\n\n    fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {\n        self.0.as_mut().poll(cx)\n    }\n}\n\n/// Implementation of [`AsyncSleep`] for Tokio.\n#[non_exhaustive]\n#[cfg(feature = \"rt-tokio\")]\n#[derive(Debug, Default)]\npub struct TokioSleep;\n\n#[cfg(feature = \"rt-tokio\")]\nimpl TokioSleep {\n    /// Create a new [`AsyncSleep`] implementation using the Tokio hashed wheel sleep implementation\n    pub fn new() -> TokioSleep {\n        Default::default()\n    }\n}\n\n#[cfg(feature = \"rt-tokio\")]\nimpl AsyncSleep for TokioSleep {\n    fn sleep(&self, duration: Duration) -> Sleep {\n        Sleep::new(tokio::time::sleep(duration))\n    }\n}\n\n#[cfg(feature = \"rt-tokio\")]\nfn sleep_tokio() -> Arc<dyn AsyncSleep> {\n    Arc::new(TokioSleep::new())\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-async/src/test_util/controlled_sleep.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::{\n    rt::sleep::{AsyncSleep, Sleep},\n    test_util::ManualTimeSource,\n};\nuse std::time::{Duration, SystemTime};\nuse std::{\n    collections::VecDeque,\n    sync::{Arc, Mutex},\n};\nuse tokio::sync::oneshot;\nuse tokio::sync::Barrier;\nuse tokio::time::timeout;\n\n/// A sleep implementation where calls to [`AsyncSleep::sleep`] block until [`SleepGate::expect_sleep`] is called\n///\n/// Create a [`ControlledSleep`] with [`controlled_time_and_sleep`]\n#[derive(Debug, Clone)]\npub struct ControlledSleep {\n    barrier: Arc<Barrier>,\n    log: Arc<Mutex<Vec<Duration>>>,\n    duration: Arc<Mutex<VecDeque<Duration>>>,\n    advance_guard: Arc<Mutex<Option<oneshot::Sender<()>>>>,\n}\n\nimpl ControlledSleep {\n    fn new(log: Arc<Mutex<Vec<Duration>>>) -> (ControlledSleep, SleepGate) {\n        let gate = Arc::new(Barrier::new(2));\n        let pending = Arc::new(Mutex::new(VecDeque::new()));\n        let advance_guard: Arc<Mutex<Option<oneshot::Sender<()>>>> = Default::default();\n        (\n            ControlledSleep {\n                barrier: gate.clone(),\n                log,\n                duration: pending.clone(),\n                advance_guard: advance_guard.clone(),\n            },\n            SleepGate {\n                gate,\n                pending,\n                advance_guard,\n            },\n        )\n    }\n}\n\n/// Guard returned from [`SleepGate::expect_sleep`]\n///\n/// # Examples\n/// ```rust\n/// # use std::sync::Arc;\n/// use std::sync::atomic::{AtomicUsize, Ordering};\n/// # async {\n/// use std::time::{Duration, UNIX_EPOCH};\n/// use aws_smithy_async::rt::sleep::AsyncSleep;\n/// use aws_smithy_async::test_util::controlled_time_and_sleep;\n/// let (time, sleep, mut gate) = controlled_time_and_sleep(UNIX_EPOCH);\n/// let progress = Arc::new(AtomicUsize::new(0));\n/// let task_progress = progress.clone();\n/// let task = tokio::spawn(async move {\n///     let progress = task_progress;\n///     progress.store(1, Ordering::Release);\n///     sleep.sleep(Duration::from_secs(1)).await;\n///     progress.store(2, Ordering::Release);\n///     sleep.sleep(Duration::from_secs(2)).await;\n/// });\n/// while progress.load(Ordering::Acquire) != 1 {}\n/// let guard = gate.expect_sleep().await;\n/// assert_eq!(guard.duration(), Duration::from_secs(1));\n/// assert_eq!(progress.load(Ordering::Acquire), 1);\n/// guard.allow_progress();\n///\n/// let guard = gate.expect_sleep().await;\n/// assert_eq!(progress.load(Ordering::Acquire), 2);\n/// assert_eq!(task.is_finished(), false);\n/// guard.allow_progress();\n/// task.await.expect(\"successful completion\");\n/// # };\n/// ```\n#[allow(dead_code)] // unused fields retained for their `Drop` impls\npub struct CapturedSleep<'a>(oneshot::Sender<()>, &'a SleepGate, Duration);\nimpl CapturedSleep<'_> {\n    /// Allow the calling code to advance past the call to [`AsyncSleep::sleep`]\n    ///\n    /// In order to facilitate testing with no flakiness, the future returned by the call to `sleep`\n    /// will not resolve until [`CapturedSleep`] is dropped or this method is called.\n    ///\n    /// ```rust\n    /// use std::time::Duration;\n    /// use aws_smithy_async::rt::sleep::AsyncSleep;\n    /// async fn do_something(sleep: &dyn AsyncSleep) {\n    ///   println!(\"before sleep\");\n    ///   sleep.sleep(Duration::from_secs(1)).await;\n    ///   println!(\"after sleep\");\n    /// }\n    /// ```\n    ///\n    /// To be specific, when `do_something` is called, the code will advance to `sleep.sleep`.\n    /// When [`SleepGate::expect_sleep`] is called, the 1 second sleep will be captured, but `after sleep`\n    /// WILL NOT be printed, until `allow_progress` is called.\n    pub fn allow_progress(self) {\n        drop(self)\n    }\n\n    /// Duration in the call to [`AsyncSleep::sleep`]\n    pub fn duration(&self) -> Duration {\n        self.2\n    }\n}\n\nimpl AsRef<Duration> for CapturedSleep<'_> {\n    fn as_ref(&self) -> &Duration {\n        &self.2\n    }\n}\n\n/// Gate that allows [`ControlledSleep`] to advance.\n///\n/// See [`controlled_time_and_sleep`] for more details\npub struct SleepGate {\n    gate: Arc<Barrier>,\n    pending: Arc<Mutex<VecDeque<Duration>>>,\n    advance_guard: Arc<Mutex<Option<oneshot::Sender<()>>>>,\n}\n\nimpl SleepGate {\n    /// Expect the time source to sleep\n    ///\n    /// This returns the duration that was slept and a [`CapturedSleep`]. The drop guard is used\n    /// to precisely control\n    pub async fn expect_sleep(&mut self) -> CapturedSleep<'_> {\n        timeout(Duration::from_secs(1), self.gate.wait())\n            .await\n            .expect(\"timeout\");\n        let dur = self\n            .pending\n            .lock()\n            .unwrap()\n            .pop_front()\n            .unwrap_or(Duration::from_secs(123456));\n        let guard = CapturedSleep(\n            self.advance_guard.lock().unwrap().take().unwrap(),\n            self,\n            dur,\n        );\n        guard\n    }\n\n    /// Skips any sleep that may be queued up, returning its duration\n    pub async fn skip_sleep(&mut self) -> Option<Duration> {\n        if timeout(Duration::from_millis(1), self.gate.wait())\n            .await\n            .is_ok()\n        {\n            let _ = self.advance_guard.lock().unwrap().take();\n            self.pending.lock().unwrap().pop_front()\n        } else {\n            None\n        }\n    }\n}\n\nimpl AsyncSleep for ControlledSleep {\n    fn sleep(&self, duration: Duration) -> Sleep {\n        let barrier = self.barrier.clone();\n        let log = self.log.clone();\n        let pending = self.duration.clone();\n        let drop_guard = self.advance_guard.clone();\n        Sleep::new(async move {\n            // 1. write the duration into the shared mutex\n            pending.lock().unwrap().push_back(duration);\n            let (tx, rx) = oneshot::channel();\n            *drop_guard.lock().unwrap() = Some(tx);\n            // 2. first wait on the barrier—this is how we wait for an invocation of `expect_sleep`\n            barrier.wait().await;\n            log.lock().unwrap().push(duration);\n            let _ = rx.await;\n        })\n    }\n}\n\n/// Returns a trio of tools to test interactions with time\n///\n/// 1. [`ManualTimeSource`] which starts at a specific time and only advances when `sleep` is called.\n///    It MUST be paired with [`ControlledSleep`] in order to function.\npub fn controlled_time_and_sleep(\n    start_time: SystemTime,\n) -> (ManualTimeSource, ControlledSleep, SleepGate) {\n    let log = Arc::new(Mutex::new(vec![]));\n    let (sleep, gate) = ControlledSleep::new(log.clone());\n    (ManualTimeSource { start_time, log }, sleep, gate)\n}\n\n#[cfg(test)]\nmod test {\n    use crate::rt::sleep::AsyncSleep;\n    use crate::test_util::controlled_time_and_sleep;\n    use crate::time::TimeSource;\n    use std::sync::atomic::{AtomicUsize, Ordering};\n    use std::sync::Arc;\n    use std::time::{Duration, UNIX_EPOCH};\n    use tokio::task::yield_now;\n    use tokio::time::timeout;\n\n    #[tokio::test]\n    async fn test_sleep_gate() {\n        let start = UNIX_EPOCH;\n        let (time, sleep, mut gate) = controlled_time_and_sleep(UNIX_EPOCH);\n        let progress = Arc::new(AtomicUsize::new(0));\n        let task_progress = progress.clone();\n        let task = tokio::spawn(async move {\n            assert_eq!(time.now(), start);\n            let progress = task_progress;\n            progress.store(1, Ordering::Release);\n            sleep.sleep(Duration::from_secs(1)).await;\n            assert_eq!(time.now(), start + Duration::from_secs(1));\n            progress.store(2, Ordering::Release);\n            sleep.sleep(Duration::from_secs(2)).await;\n            assert_eq!(time.now(), start + Duration::from_secs(3));\n        });\n        while progress.load(Ordering::Acquire) != 1 {\n            yield_now().await\n        }\n        let guard = gate.expect_sleep().await;\n        assert_eq!(guard.duration(), Duration::from_secs(1));\n        assert_eq!(progress.load(Ordering::Acquire), 1);\n        guard.allow_progress();\n\n        let guard = gate.expect_sleep().await;\n        assert_eq!(progress.load(Ordering::Acquire), 2);\n        assert!(!task.is_finished(), \"task should not be finished\");\n        guard.allow_progress();\n        timeout(Duration::from_secs(1), task)\n            .await\n            .expect(\"no timeout\")\n            .expect(\"successful completion\");\n    }\n\n    #[tokio::test]\n    async fn sleep_gate_multiple_sleeps() {\n        let (time, sleep, mut gate) = controlled_time_and_sleep(UNIX_EPOCH);\n        let one = sleep.sleep(Duration::from_secs(1));\n        let two = sleep.sleep(Duration::from_secs(2));\n        let three = sleep.sleep(Duration::from_secs(3));\n\n        let spawn = tokio::spawn(async move {\n            let _ = (one.await, two.await, three.await);\n        });\n\n        assert_eq!(Duration::from_secs(1), gate.expect_sleep().await.duration());\n        gate.skip_sleep().await;\n        assert_eq!(Duration::from_secs(3), gate.expect_sleep().await.duration());\n\n        let _ = spawn.await;\n\n        assert_eq!(UNIX_EPOCH + Duration::from_secs(6), time.now());\n    }\n\n    #[tokio::test]\n    async fn sleep_gate_skipping_a_sleep_doesnt_blow_up_if_no_sleep() {\n        let (time, sleep, mut gate) = controlled_time_and_sleep(UNIX_EPOCH);\n\n        let some_sleep = sleep.sleep(Duration::from_secs(1));\n        let spawn = tokio::spawn(async move {\n            let _ = some_sleep.await;\n        });\n\n        assert_eq!(Some(Duration::from_secs(1)), gate.skip_sleep().await);\n        assert_eq!(None, gate.skip_sleep().await);\n\n        let _ = spawn.await;\n\n        assert_eq!(UNIX_EPOCH + Duration::from_secs(1), time.now());\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-async/src/test_util/instant_sleep.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::time::{SharedTimeSource, TimeSource};\nuse crate::{\n    rt::sleep::{AsyncSleep, Sleep},\n    test_util::ManualTimeSource,\n};\nuse std::sync::{Arc, Mutex};\nuse std::time::{Duration, SystemTime};\n\n/// A sleep implementation where calls to [`AsyncSleep::sleep`] will complete instantly.\n///\n/// Create a [`InstantSleep`] with [`instant_time_and_sleep`]\n#[derive(Debug, Clone)]\npub struct InstantSleep {\n    log: Arc<Mutex<Vec<Duration>>>,\n}\n\nimpl AsyncSleep for InstantSleep {\n    fn sleep(&self, duration: Duration) -> Sleep {\n        let log = self.log.clone();\n        Sleep::new(async move {\n            log.lock().unwrap().push(duration);\n        })\n    }\n}\n\nimpl InstantSleep {\n    /// Given a shared log for sleep durations, create a new `InstantSleep`.\n    pub fn new(log: Arc<Mutex<Vec<Duration>>>) -> Self {\n        Self { log }\n    }\n\n    /// Create an `InstantSleep` without passing in a shared log.\n    pub fn unlogged() -> Self {\n        Self {\n            log: Default::default(),\n        }\n    }\n\n    /// Return the sleep durations that were logged by this `InstantSleep`.\n    pub fn logs(&self) -> Vec<Duration> {\n        self.log.lock().unwrap().iter().cloned().collect()\n    }\n\n    /// Return the total sleep duration that was logged by this `InstantSleep`.\n    pub fn total_duration(&self) -> Duration {\n        self.log.lock().unwrap().iter().sum()\n    }\n}\n\n/// Returns a duo of tools to test interactions with time. Sleeps will end instantly, but the\n/// desired length of the sleeps will be recorded for later verification.\npub fn instant_time_and_sleep(start_time: SystemTime) -> (ManualTimeSource, InstantSleep) {\n    let log = Arc::new(Mutex::new(vec![]));\n    let sleep = InstantSleep::new(log.clone());\n    (ManualTimeSource { start_time, log }, sleep)\n}\n\nimpl TimeSource for SystemTime {\n    fn now(&self) -> SystemTime {\n        *self\n    }\n}\n\nimpl From<SystemTime> for SharedTimeSource {\n    fn from(value: SystemTime) -> Self {\n        SharedTimeSource::new(value)\n    }\n}\n\nimpl From<ManualTimeSource> for SharedTimeSource {\n    fn from(value: ManualTimeSource) -> Self {\n        SharedTimeSource::new(value)\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-async/src/test_util/manual_time.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::time::TimeSource;\nuse std::sync::{Arc, Mutex};\nuse std::time::{Duration, SystemTime};\n\n/// Manually controlled time source\n#[derive(Debug, Clone)]\npub struct ManualTimeSource {\n    pub(super) start_time: SystemTime,\n    pub(super) log: Arc<Mutex<Vec<Duration>>>,\n}\n\nimpl ManualTimeSource {\n    /// Get the number of seconds since the UNIX Epoch as an f64.\n    ///\n    /// ## Panics\n    ///\n    /// This will panic if `self.now()` returns a time that's before the UNIX Epoch.\n    pub fn seconds_since_unix_epoch(&self) -> f64 {\n        self.now()\n            .duration_since(SystemTime::UNIX_EPOCH)\n            .unwrap()\n            .as_secs_f64()\n    }\n\n    /// Creates a new [`ManualTimeSource`]\n    pub fn new(start_time: SystemTime) -> ManualTimeSource {\n        Self {\n            start_time,\n            log: Default::default(),\n        }\n    }\n\n    /// Advances the time of this time source by `duration`.\n    pub fn advance(&self, duration: Duration) -> SystemTime {\n        let mut log = self.log.lock().unwrap();\n        log.push(duration);\n        self._now(&log)\n    }\n\n    fn _now(&self, log: &[Duration]) -> SystemTime {\n        self.start_time + log.iter().sum::<Duration>()\n    }\n\n    /// Sets the `time` of this manual time source.\n    ///\n    /// # Panics\n    /// This function panics if `time` < `now()`\n    pub fn set_time(&self, time: SystemTime) {\n        let mut log = self.log.lock().unwrap();\n        let now = self._now(&log);\n        if time < now {\n            panic!(\"Cannot move time backwards!\");\n        }\n        log.push(time.duration_since(now).unwrap());\n    }\n}\n\nimpl TimeSource for ManualTimeSource {\n    fn now(&self) -> SystemTime {\n        self._now(&self.log.lock().unwrap())\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-async/src/test_util/tick_advance_sleep.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Test time/sleep implementations that work by manually advancing time with a `tick()`\n//!\n//! # Examples\n//!\n//! Spawning a task that creates new sleep tasks and waits for them sequentially,\n//! and advancing passed all of them with a single call to `tick()`.\n//!\n//! ```rust,no_run\n//! use std::time::{Duration, SystemTime};\n//! use aws_smithy_async::test_util::tick_advance_sleep::tick_advance_time_and_sleep;\n//! use aws_smithy_async::time::TimeSource;\n//! use aws_smithy_async::rt::sleep::AsyncSleep;\n//!\n//! # async fn example() {\n//! // Create the test time/sleep implementations.\n//! // They will start at SystemTime::UNIX_EPOCH.\n//! let (time, sleep) = tick_advance_time_and_sleep();\n//!\n//! // Spawn the task that sequentially sleeps\n//! let task = tokio::spawn(async move {\n//!     sleep.sleep(Duration::from_secs(1)).await;\n//!     sleep.sleep(Duration::from_secs(2)).await;\n//!     sleep.sleep(Duration::from_secs(3)).await;\n//! });\n//! // Verify that task hasn't done anything yet since we haven't called `tick`\n//! tokio::task::yield_now().await;\n//! assert!(!task.is_finished());\n//! assert_eq!(SystemTime::UNIX_EPOCH, time.now());\n//!\n//! // Tick 6 seconds, which is long enough to go passed all the sequential sleeps\n//! time.tick(Duration::from_secs(6)).await;\n//! assert_eq!(SystemTime::UNIX_EPOCH + Duration::from_secs(6), time.now());\n//!\n//! // Verify the task joins, indicating all the sleeps are done\n//! task.await.unwrap();\n//! # }\n//! ```\n\nuse crate::{\n    rt::sleep::{AsyncSleep, Sleep},\n    time::TimeSource,\n};\nuse std::{\n    future::IntoFuture,\n    ops::{Deref, DerefMut},\n    sync::{Arc, Mutex},\n    time::{Duration, SystemTime},\n};\nuse tokio::sync::oneshot::Sender;\n\n#[derive(Debug)]\nstruct QueuedSleep {\n    /// Duration since `UNIX_EPOCH` at which point the sleep is finished.\n    presents_at: Duration,\n    notify: Option<Sender<()>>,\n}\n\n#[derive(Default, Debug)]\nstruct Inner {\n    // Need to use a Vec since VecDeque doesn't have sort functions,\n    // and BTreeSet doesn't fit since we could have more than one sleep presenting\n    // at the same time (and there's no way to compare the notify channels).\n    sleeps: Vec<QueuedSleep>,\n    /// Duration since `UNIX_EPOCH` that represents \"now\".\n    now: Duration,\n}\n\nimpl Inner {\n    fn push(&mut self, sleep: QueuedSleep) {\n        self.sleeps.push(sleep);\n        self.sleeps.sort_by_key(|s| s.presents_at);\n    }\n\n    fn next_presenting(&mut self, time: Duration) -> Option<QueuedSleep> {\n        if self\n            .sleeps\n            .first()\n            .map(|f| f.presents_at <= time)\n            .unwrap_or(false)\n        {\n            Some(self.sleeps.remove(0))\n        } else {\n            None\n        }\n    }\n}\n\n#[derive(Clone, Default, Debug)]\nstruct SharedInner {\n    inner: Arc<Mutex<Inner>>,\n}\nimpl SharedInner {\n    fn get(&self) -> impl Deref<Target = Inner> + '_ {\n        self.inner.lock().unwrap()\n    }\n    fn get_mut(&self) -> impl DerefMut<Target = Inner> + '_ {\n        self.inner.lock().unwrap()\n    }\n}\n\n/// Tick-advancing test sleep implementation.\n///\n/// See [module docs](crate::test_util::tick_advance_sleep) for more information.\n#[derive(Clone, Debug)]\npub struct TickAdvanceSleep {\n    inner: SharedInner,\n}\n\nimpl AsyncSleep for TickAdvanceSleep {\n    fn sleep(&self, duration: Duration) -> Sleep {\n        // Use a one-shot channel to block the sleep future until `TickAdvanceTime::tick`\n        // chooses to complete it by sending with the receiver.\n        let (tx, rx) = tokio::sync::oneshot::channel::<()>();\n\n        let mut inner = self.inner.get_mut();\n        let now = inner.now;\n\n        // Add the sleep to the queue, which `TickAdvanceTime` will examine when ticking.\n        inner.push(QueuedSleep {\n            presents_at: now + duration,\n            notify: Some(tx),\n        });\n\n        Sleep::new(async move {\n            let _ = rx.into_future().await;\n        })\n    }\n}\n\n/// Tick-advancing test time source implementation.\n///\n/// See [module docs](crate::test_util::tick_advance_sleep) for more information.\n#[derive(Clone, Debug)]\npub struct TickAdvanceTime {\n    inner: SharedInner,\n}\n\nimpl TickAdvanceTime {\n    /// Advance time by `duration`.\n    ///\n    /// This will yield the async runtime after each sleep that presents between\n    /// the previous current time and the time after the given duration. This allows\n    /// for async tasks pending one of those sleeps to do some work and also create\n    /// additional sleep tasks. Created sleep tasks may also complete during this\n    /// call to `tick()` if they present before the given time duration.\n    pub async fn tick(&self, duration: Duration) {\n        let time = self.inner.get().now + duration;\n\n        // Tick to each individual sleep time and yield the runtime so that any\n        // futures waiting on a sleep run before futures waiting on a later sleep.\n        //\n        // We also need to recheck the list of queued sleeps every iteration since\n        // unblocked tasks could have queued up more sleeps, and these sleeps may also\n        // need to present before ones that were previously queued.\n        loop {\n            // Can't do `while let` since that holds the lock open\n            let Some(mut presenting) = self.inner.get_mut().next_presenting(time) else {\n                break;\n            };\n\n            // Make sure the time is always accurate for async code that runs\n            // after completing the sleep.\n            self.inner.get_mut().now = presenting.presents_at;\n\n            // Notify the sleep, and then yield to let work blocked on that sleep to proceed\n            let _ = presenting.notify.take().unwrap().send(());\n            tokio::task::yield_now().await;\n        }\n\n        // Set the final time.\n        self.inner.get_mut().now = time;\n    }\n}\n\nimpl TimeSource for TickAdvanceTime {\n    fn now(&self) -> SystemTime {\n        SystemTime::UNIX_EPOCH + self.inner.get().now\n    }\n}\n\n/// Creates tick-advancing test time/sleep implementations.\n///\n/// See [module docs](crate::test_util::tick_advance_sleep) for more information.\npub fn tick_advance_time_and_sleep() -> (TickAdvanceTime, TickAdvanceSleep) {\n    let inner = SharedInner::default();\n    (\n        TickAdvanceTime {\n            inner: inner.clone(),\n        },\n        TickAdvanceSleep {\n            inner: inner.clone(),\n        },\n    )\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use futures_util::FutureExt;\n\n    #[tokio::test]\n    async fn tick_advances() {\n        let (time, sleep) = tick_advance_time_and_sleep();\n\n        assert_eq!(SystemTime::UNIX_EPOCH, time.now());\n        time.tick(Duration::from_secs(1)).await;\n        assert_eq!(SystemTime::UNIX_EPOCH + Duration::from_secs(1), time.now());\n\n        let sleeps = vec![\n            tokio::spawn(sleep.sleep(Duration::from_millis(500))),\n            tokio::spawn(sleep.sleep(Duration::from_secs(1))),\n            tokio::spawn(sleep.sleep(Duration::from_secs(2))),\n            tokio::spawn(sleep.sleep(Duration::from_secs(3))),\n            tokio::spawn(sleep.sleep(Duration::from_secs(4))),\n        ];\n\n        tokio::task::yield_now().await;\n        for sleep in &sleeps {\n            assert!(!sleep.is_finished());\n        }\n\n        time.tick(Duration::from_secs(1)).await;\n        assert_eq!(SystemTime::UNIX_EPOCH + Duration::from_secs(2), time.now());\n        assert!(sleeps[0].is_finished());\n        assert!(sleeps[1].is_finished());\n        assert!(!sleeps[2].is_finished());\n        assert!(!sleeps[3].is_finished());\n        assert!(!sleeps[4].is_finished());\n\n        time.tick(Duration::from_secs(2)).await;\n        assert_eq!(SystemTime::UNIX_EPOCH + Duration::from_secs(4), time.now());\n        assert!(sleeps[2].is_finished());\n        assert!(sleeps[3].is_finished());\n        assert!(!sleeps[4].is_finished());\n\n        time.tick(Duration::from_secs(1)).await;\n        assert_eq!(SystemTime::UNIX_EPOCH + Duration::from_secs(5), time.now());\n        assert!(sleeps[4].is_finished());\n    }\n\n    #[tokio::test]\n    async fn sleep_leading_to_sleep() {\n        let (time, sleep) = tick_advance_time_and_sleep();\n\n        let task = tokio::spawn(async move {\n            sleep.sleep(Duration::from_secs(1)).await;\n            sleep.sleep(Duration::from_secs(2)).await;\n            sleep.sleep(Duration::from_secs(3)).await;\n        });\n        tokio::task::yield_now().await;\n        assert!(!task.is_finished());\n        assert_eq!(SystemTime::UNIX_EPOCH, time.now());\n\n        time.tick(Duration::from_secs(6)).await;\n        assert_eq!(SystemTime::UNIX_EPOCH + Duration::from_secs(6), time.now());\n        task.await.unwrap();\n    }\n\n    #[tokio::test]\n    async fn racing_sleeps() {\n        let (time, sleep) = tick_advance_time_and_sleep();\n\n        let task = tokio::spawn(async move {\n            let sleep1 = sleep.sleep(Duration::from_secs(1)).then({\n                let sleep = sleep.clone();\n                move |_| async move {\n                    sleep.sleep(Duration::from_secs(1)).await;\n                }\n            });\n            let sleep2 = sleep.sleep(Duration::from_secs(3));\n            tokio::select! {\n                _ = sleep1 => { /* good */}\n                _ = sleep2 => { panic!(\"sleep2 should not complete before sleep1\") }\n            }\n        });\n        tokio::task::yield_now().await;\n        assert!(!task.is_finished());\n        assert_eq!(SystemTime::UNIX_EPOCH, time.now());\n\n        time.tick(Duration::from_secs(6)).await;\n        assert_eq!(SystemTime::UNIX_EPOCH + Duration::from_secs(6), time.now());\n        task.await.unwrap();\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-async/src/test_util.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Test utilities for time and sleep\n\nmod controlled_sleep;\npub use controlled_sleep::{controlled_time_and_sleep, CapturedSleep, ControlledSleep, SleepGate};\n\nmod instant_sleep;\npub use instant_sleep::{instant_time_and_sleep, InstantSleep};\n\nmod manual_time;\npub use manual_time::ManualTimeSource;\n\npub mod tick_advance_sleep;\n"
  },
  {
    "path": "rust-runtime/aws-smithy-async/src/time.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Time source abstraction to support WASM and testing\nuse std::fmt::Debug;\nuse std::sync::Arc;\nuse std::time::{Duration, SystemTime, UNIX_EPOCH};\n\n/// Trait with a `now()` function returning the current time\npub trait TimeSource: Debug + Send + Sync {\n    /// Returns the current time\n    fn now(&self) -> SystemTime;\n}\n\n/// Time source that delegates to [`SystemTime::now`]\n#[non_exhaustive]\n#[derive(Debug, Default)]\npub struct SystemTimeSource;\n\nimpl SystemTimeSource {\n    /// Creates a new SystemTimeSource\n    pub fn new() -> Self {\n        SystemTimeSource\n    }\n}\n\nimpl TimeSource for SystemTimeSource {\n    fn now(&self) -> SystemTime {\n        // this is the one OK usage\n        #[allow(clippy::disallowed_methods)]\n        SystemTime::now()\n    }\n}\n\nimpl Default for SharedTimeSource {\n    fn default() -> Self {\n        SharedTimeSource(Arc::new(SystemTimeSource))\n    }\n}\n\n/// Time source that always returns the same time\n#[derive(Debug)]\npub struct StaticTimeSource {\n    time: SystemTime,\n}\n\nimpl StaticTimeSource {\n    /// Creates a new static time source that always returns the same time\n    pub fn new(time: SystemTime) -> Self {\n        Self { time }\n    }\n\n    /// Creates a new static time source from the provided number of seconds since the UNIX epoch\n    pub fn from_secs(epoch_secs: u64) -> Self {\n        Self::new(UNIX_EPOCH + Duration::from_secs(epoch_secs))\n    }\n}\n\nimpl TimeSource for StaticTimeSource {\n    fn now(&self) -> SystemTime {\n        self.time\n    }\n}\n\nimpl From<StaticTimeSource> for SharedTimeSource {\n    fn from(value: StaticTimeSource) -> Self {\n        SharedTimeSource::new(value)\n    }\n}\n\n#[derive(Debug, Clone)]\n/// Time source structure used inside SDK\n///\n/// This implements Default—the default implementation will use `SystemTime::now()`\npub struct SharedTimeSource(Arc<dyn TimeSource>);\n\nimpl SharedTimeSource {\n    /// Returns the current time\n    pub fn now(&self) -> SystemTime {\n        self.0.now()\n    }\n\n    /// Creates a new shared time source\n    pub fn new(source: impl TimeSource + 'static) -> Self {\n        Self(Arc::new(source))\n    }\n}\n\nimpl TimeSource for SharedTimeSource {\n    fn now(&self) -> SystemTime {\n        self.0.now()\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-cbor/Cargo.toml",
    "content": "[package]\nname = \"aws-smithy-cbor\"\nversion = \"0.61.7\"\nauthors = [\n    \"AWS Rust SDK Team <aws-sdk-rust@amazon.com>\",\n    \"David Pérez <d@vidp.dev>\",\n]\ndescription = \"CBOR utilities for smithy-rs.\"\nedition = \"2021\"\nlicense = \"Apache-2.0\"\nrepository = \"https://github.com/awslabs/smithy-rs\"\nrust-version = \"1.91.1\"\n\n[dependencies.minicbor]\nversion = \"0.24.2\"\nfeatures = [\n    # To write to a `Vec<u8>`: https://docs.rs/minicbor/latest/minicbor/encode/write/trait.Write.html#impl-Write-for-Vec%3Cu8%3E\n    \"alloc\",\n    # To support reading `f16` to accomodate fewer bytes transmitted that fit the value.\n    \"half\",\n]\n\n[dependencies]\naws-smithy-types = { path = \"../aws-smithy-types\" }\n\n[dev-dependencies]\ncriterion = \"0.5.1\"\n\n[[bench]]\nname = \"string\"\nharness = false\n\n[[bench]]\nname = \"blob\"\nharness = false\n\n[package.metadata.docs.rs]\nall-features = true\ntargets = [\"x86_64-unknown-linux-gnu\"]\ncargo-args = [\"-Zunstable-options\", \"-Zrustdoc-scrape-examples\"]\nrustdoc-args = [\"--cfg\", \"docsrs\"]\n# End of docs.rs metadata\n"
  },
  {
    "path": "rust-runtime/aws-smithy-cbor/LICENSE",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n"
  },
  {
    "path": "rust-runtime/aws-smithy-cbor/README.md",
    "content": "# aws-smithy-cbor\n\nCBOR serialization and deserialization primitives for clients and servers\ngenerated by [smithy-rs](https://github.com/smithy-lang/smithy-rs).\n\n<!-- anchor_start:footer -->\nThis crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly.\n<!-- anchor_end:footer -->\n"
  },
  {
    "path": "rust-runtime/aws-smithy-cbor/benches/blob.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_smithy_cbor::decode::Decoder;\nuse criterion::{black_box, criterion_group, criterion_main, Criterion};\n\npub fn blob_benchmark(c: &mut Criterion) {\n    // Indefinite length blob containing bytes corresponding to `indefinite-byte, chunked, on each comma`.\n    let blob_indefinite_bytes = [\n        0x5f, 0x50, 0x69, 0x6e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x65, 0x2d, 0x62, 0x79,\n        0x74, 0x65, 0x2c, 0x49, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x65, 0x64, 0x2c, 0x4e, 0x20,\n        0x6f, 0x6e, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0xff,\n    ];\n\n    c.bench_function(\"blob\", |b| {\n        b.iter(|| {\n            let mut decoder = Decoder::new(&blob_indefinite_bytes);\n            let _ = black_box(decoder.blob());\n        })\n    });\n}\n\ncriterion_group!(benches, blob_benchmark);\ncriterion_main!(benches);\n"
  },
  {
    "path": "rust-runtime/aws-smithy-cbor/benches/string.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::borrow::Cow;\n\nuse aws_smithy_cbor::decode::Decoder;\nuse criterion::{black_box, criterion_group, criterion_main, Criterion};\n\npub fn str_benchmark(c: &mut Criterion) {\n    // Definite length key `thisIsAKey`.\n    let definite_bytes = [\n        0x6a, 0x74, 0x68, 0x69, 0x73, 0x49, 0x73, 0x41, 0x4b, 0x65, 0x79,\n    ];\n\n    // Indefinite length key `this`, `Is`, `A` and `Key`.\n    let indefinite_bytes = [\n        0x7f, 0x64, 0x74, 0x68, 0x69, 0x73, 0x62, 0x49, 0x73, 0x61, 0x41, 0x63, 0x4b, 0x65, 0x79,\n        0xff,\n    ];\n\n    c.bench_function(\"definite str()\", |b| {\n        b.iter(|| {\n            let mut decoder = Decoder::new(&definite_bytes);\n            let x = black_box(decoder.str());\n            assert!(matches!(x.unwrap().as_ref(), \"thisIsAKey\"));\n        })\n    });\n\n    c.bench_function(\"definite str_alt\", |b| {\n        b.iter(|| {\n            let mut decoder = minicbor::decode::Decoder::new(&indefinite_bytes);\n            let x = black_box(str_alt(&mut decoder));\n            assert!(matches!(x.unwrap().as_ref(), \"thisIsAKey\"));\n        })\n    });\n\n    c.bench_function(\"indefinite str()\", |b| {\n        b.iter(|| {\n            let mut decoder = Decoder::new(&indefinite_bytes);\n            let x = black_box(decoder.str());\n            assert!(matches!(x.unwrap().as_ref(), \"thisIsAKey\"));\n        })\n    });\n\n    c.bench_function(\"indefinite str_alt\", |b| {\n        b.iter(|| {\n            let mut decoder = minicbor::decode::Decoder::new(&indefinite_bytes);\n            let x = black_box(str_alt(&mut decoder));\n            assert!(matches!(x.unwrap().as_ref(), \"thisIsAKey\"));\n        })\n    });\n}\n\n// The following seems to be a bit slower than the implementation that we have\n// kept in the `aws_smithy_cbor::Decoder`.\npub fn string_alt<'b>(\n    decoder: &'b mut minicbor::Decoder<'b>,\n) -> Result<String, minicbor::decode::Error> {\n    decoder.str_iter()?.collect()\n}\n\n// The following seems to be a bit slower than the implementation that we have\n// kept in the `aws_smithy_cbor::Decoder`.\nfn str_alt<'b>(\n    decoder: &'b mut minicbor::Decoder<'b>,\n) -> Result<Cow<'b, str>, minicbor::decode::Error> {\n    // This implementation uses `next` twice to see if there is\n    // another str chunk. If there is, it returns a owned `String`.\n    let mut chunks_iter = decoder.str_iter()?;\n    let head = match chunks_iter.next() {\n        Some(Ok(head)) => head,\n        None => return Ok(Cow::Borrowed(\"\")),\n        Some(Err(e)) => return Err(e),\n    };\n\n    match chunks_iter.next() {\n        None => Ok(Cow::Borrowed(head)),\n        Some(Err(e)) => Err(e),\n        Some(Ok(next)) => {\n            let mut concatenated_string = String::from(head);\n            concatenated_string.push_str(next);\n            for chunk in chunks_iter {\n                concatenated_string.push_str(chunk?);\n            }\n            Ok(Cow::Owned(concatenated_string))\n        }\n    }\n}\n\n// We have two `string` implementations. One uses `collect` the other\n// uses `String::new` followed by `string::push`.\npub fn string_benchmark(c: &mut Criterion) {\n    // Definite length key `thisIsAKey`.\n    let definite_bytes = [\n        0x6a, 0x74, 0x68, 0x69, 0x73, 0x49, 0x73, 0x41, 0x4b, 0x65, 0x79,\n    ];\n\n    // Indefinite length key `this`, `Is`, `A` and `Key`.\n    let indefinite_bytes = [\n        0x7f, 0x64, 0x74, 0x68, 0x69, 0x73, 0x62, 0x49, 0x73, 0x61, 0x41, 0x63, 0x4b, 0x65, 0x79,\n        0xff,\n    ];\n\n    c.bench_function(\"definite string()\", |b| {\n        b.iter(|| {\n            let mut decoder = Decoder::new(&definite_bytes);\n            let _ = black_box(decoder.string());\n        })\n    });\n\n    c.bench_function(\"definite string_alt()\", |b| {\n        b.iter(|| {\n            let mut decoder = minicbor::decode::Decoder::new(&indefinite_bytes);\n            let _ = black_box(string_alt(&mut decoder));\n        })\n    });\n\n    c.bench_function(\"indefinite string()\", |b| {\n        b.iter(|| {\n            let mut decoder = Decoder::new(&indefinite_bytes);\n            let _ = black_box(decoder.string());\n        })\n    });\n\n    c.bench_function(\"indefinite string_alt()\", |b| {\n        b.iter(|| {\n            let mut decoder = minicbor::decode::Decoder::new(&indefinite_bytes);\n            let _ = black_box(string_alt(&mut decoder));\n        })\n    });\n}\n\ncriterion_group!(benches, string_benchmark, str_benchmark,);\ncriterion_main!(benches);\n"
  },
  {
    "path": "rust-runtime/aws-smithy-cbor/src/data.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n#[derive(Clone, Copy, PartialEq, PartialOrd, Eq, Ord, Debug, Hash)]\npub enum Type {\n    Bool,\n    Null,\n    Undefined,\n    U8,\n    U16,\n    U32,\n    U64,\n    I8,\n    I16,\n    I32,\n    I64,\n    Int,\n    F16,\n    F32,\n    F64,\n    Simple,\n    Bytes,\n    BytesIndef,\n    String,\n    StringIndef,\n    Array,\n    ArrayIndef,\n    Map,\n    MapIndef,\n    Tag,\n    Break,\n    Unknown(u8),\n}\n\nimpl Type {\n    pub(crate) fn new(ty: minicbor::data::Type) -> Self {\n        match ty {\n            minicbor::data::Type::Bool => Self::Bool,\n            minicbor::data::Type::Null => Self::Null,\n            minicbor::data::Type::Undefined => Self::Undefined,\n            minicbor::data::Type::U8 => Self::U8,\n            minicbor::data::Type::U16 => Self::U16,\n            minicbor::data::Type::U32 => Self::U32,\n            minicbor::data::Type::U64 => Self::U64,\n            minicbor::data::Type::I8 => Self::I8,\n            minicbor::data::Type::I16 => Self::I16,\n            minicbor::data::Type::I32 => Self::I32,\n            minicbor::data::Type::I64 => Self::I64,\n            minicbor::data::Type::Int => Self::Int,\n            minicbor::data::Type::F16 => Self::F16,\n            minicbor::data::Type::F32 => Self::F32,\n            minicbor::data::Type::F64 => Self::F64,\n            minicbor::data::Type::Simple => Self::Simple,\n            minicbor::data::Type::Bytes => Self::Bytes,\n            minicbor::data::Type::BytesIndef => Self::BytesIndef,\n            minicbor::data::Type::String => Self::String,\n            minicbor::data::Type::StringIndef => Self::StringIndef,\n            minicbor::data::Type::Array => Self::Array,\n            minicbor::data::Type::ArrayIndef => Self::ArrayIndef,\n            minicbor::data::Type::Map => Self::Map,\n            minicbor::data::Type::MapIndef => Self::MapIndef,\n            minicbor::data::Type::Tag => Self::Tag,\n            minicbor::data::Type::Break => Self::Break,\n            minicbor::data::Type::Unknown(byte) => Self::Unknown(byte),\n        }\n    }\n\n    // This is just the reverse mapping of `new`.\n    pub(crate) fn into_minicbor_type(self) -> minicbor::data::Type {\n        match self {\n            Type::Bool => minicbor::data::Type::Bool,\n            Type::Null => minicbor::data::Type::Null,\n            Type::Undefined => minicbor::data::Type::Undefined,\n            Type::U8 => minicbor::data::Type::U8,\n            Type::U16 => minicbor::data::Type::U16,\n            Type::U32 => minicbor::data::Type::U32,\n            Type::U64 => minicbor::data::Type::U64,\n            Type::I8 => minicbor::data::Type::I8,\n            Type::I16 => minicbor::data::Type::I16,\n            Type::I32 => minicbor::data::Type::I32,\n            Type::I64 => minicbor::data::Type::I64,\n            Type::Int => minicbor::data::Type::Int,\n            Type::F16 => minicbor::data::Type::F16,\n            Type::F32 => minicbor::data::Type::F32,\n            Type::F64 => minicbor::data::Type::F64,\n            Type::Simple => minicbor::data::Type::Simple,\n            Type::Bytes => minicbor::data::Type::Bytes,\n            Type::BytesIndef => minicbor::data::Type::BytesIndef,\n            Type::String => minicbor::data::Type::String,\n            Type::StringIndef => minicbor::data::Type::StringIndef,\n            Type::Array => minicbor::data::Type::Array,\n            Type::ArrayIndef => minicbor::data::Type::ArrayIndef,\n            Type::Map => minicbor::data::Type::Map,\n            Type::MapIndef => minicbor::data::Type::MapIndef,\n            Type::Tag => minicbor::data::Type::Tag,\n            Type::Break => minicbor::data::Type::Break,\n            Type::Unknown(byte) => minicbor::data::Type::Unknown(byte),\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-cbor/src/decode.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::borrow::Cow;\n\nuse aws_smithy_types::{Blob, DateTime};\nuse minicbor::decode::Error;\n\nuse crate::data::Type;\n\n/// Provides functions for decoding a CBOR object with a known schema.\n///\n/// Although CBOR is a self-describing format, this decoder is tailored for cases where the schema\n/// is known in advance. Therefore, the caller can determine which object key exists at the current\n/// position by calling `str` method, and call the relevant function based on the predetermined schema\n/// for that key. If an unexpected key is encountered, the caller can use the `skip` method to skip\n/// over the element.\n#[derive(Debug, Clone)]\npub struct Decoder<'b> {\n    decoder: minicbor::Decoder<'b>,\n}\n\n/// When any of the decode methods are called they look for that particular data type at the current\n/// position. If the CBOR data tag does not match the type, a `DeserializeError` is returned.\n#[derive(Debug)]\npub struct DeserializeError {\n    #[allow(dead_code)]\n    _inner: Error,\n}\n\nimpl std::fmt::Display for DeserializeError {\n    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n        self._inner.fmt(f)\n    }\n}\n\nimpl std::error::Error for DeserializeError {}\n\nimpl DeserializeError {\n    pub(crate) fn new(inner: Error) -> Self {\n        Self { _inner: inner }\n    }\n\n    /// More than one union variant was detected: `unexpected_type` was unexpected.\n    pub fn unexpected_union_variant(unexpected_type: Type, at: usize) -> Self {\n        Self {\n            _inner: Error::type_mismatch(unexpected_type.into_minicbor_type())\n                .with_message(\"encountered unexpected union variant; expected end of union\")\n                .at(at),\n        }\n    }\n\n    /// Unknown union variant was detected. Servers reject unknown union varaints.\n    pub fn unknown_union_variant(variant_name: &str, at: usize) -> Self {\n        Self {\n            _inner: Error::message(format!(\"encountered unknown union variant {variant_name}\"))\n                .at(at),\n        }\n    }\n\n    /// More than one union variant was detected, but we never even got to parse the first one.\n    /// We immediately raise this error when detecting a union serialized as a fixed-length CBOR\n    /// map whose length (specified upfront) is a value different than 1.\n    pub fn mixed_union_variants(at: usize) -> Self {\n        Self {\n            _inner: Error::message(\n                \"encountered mixed variants in union; expected a single union variant to be set\",\n            )\n            .at(at),\n        }\n    }\n\n    /// Expected end of stream but more data is available.\n    pub fn expected_end_of_stream(at: usize) -> Self {\n        Self {\n            _inner: Error::message(\"encountered additional data; expected end of stream\").at(at),\n        }\n    }\n\n    /// Returns a custom error with an offset.\n    pub fn custom(message: impl Into<Cow<'static, str>>, at: usize) -> Self {\n        Self {\n            _inner: Error::message(message.into()).at(at),\n        }\n    }\n\n    /// An unexpected type was encountered.\n    // We handle this one when decoding sparse collections: we have to expect either a `null` or an\n    // item, so we try decoding both.\n    pub fn is_type_mismatch(&self) -> bool {\n        self._inner.is_type_mismatch()\n    }\n}\n\n/// Macro for delegating method calls to the decoder.\n///\n/// This macro generates wrapper methods for calling specific methods on the decoder and returning\n/// the result with error handling.\n///\n/// # Example\n///\n/// ```ignore\n/// delegate_method! {\n///     /// Wrapper method for encoding method `encode_str` on the decoder.\n///     encode_str_wrapper => encode_str(String);\n///     /// Wrapper method for encoding method `encode_int` on the decoder.\n///     encode_int_wrapper => encode_int(i32);\n/// }\n/// ```\nmacro_rules! delegate_method {\n    ($($(#[$meta:meta])* $wrapper_name:ident => $encoder_name:ident($result_type:ty);)+) => {\n        $(\n            pub fn $wrapper_name(&mut self) -> Result<$result_type, DeserializeError> {\n                self.decoder.$encoder_name().map_err(DeserializeError::new)\n            }\n        )+\n    };\n}\n\nimpl<'b> Decoder<'b> {\n    pub fn new(bytes: &'b [u8]) -> Self {\n        Self {\n            decoder: minicbor::Decoder::new(bytes),\n        }\n    }\n\n    pub fn datatype(&self) -> Result<Type, DeserializeError> {\n        self.decoder\n            .datatype()\n            .map(Type::new)\n            .map_err(DeserializeError::new)\n    }\n\n    delegate_method! {\n        /// Skips the current CBOR element.\n        skip => skip(());\n        /// Reads a boolean at the current position.\n        boolean => bool(bool);\n        /// Reads a byte at the current position.\n        byte => i8(i8);\n        /// Reads a short at the current position.\n        short => i16(i16);\n        /// Reads a integer at the current position.\n        integer => i32(i32);\n        /// Reads a long at the current position.\n        long => i64(i64);\n        /// Reads a float at the current position.\n        float => f32(f32);\n        /// Reads a double at the current position.\n        double => f64(f64);\n        /// Reads a null CBOR element at the current position.\n        null => null(());\n        /// Returns the number of elements in a definite list. For indefinite lists it returns a `None`.\n        list => array(Option<u64>);\n        /// Returns the number of elements in a definite map. For indefinite map it returns a `None`.\n        map => map(Option<u64>);\n    }\n\n    /// Returns the current position of the buffer, which will be decoded when any of the methods is called.\n    pub fn position(&self) -> usize {\n        self.decoder.position()\n    }\n\n    /// Set the current decode position.\n    pub fn set_position(&mut self, pos: usize) {\n        self.decoder.set_position(pos)\n    }\n\n    /// Returns a `Cow::Borrowed(&str)` if the element at the current position in the buffer is a definite\n    /// length string. Otherwise, it returns a `Cow::Owned(String)` if the element at the current position is an\n    /// indefinite-length string. An error is returned if the element is neither a definite length nor an\n    /// indefinite-length string.\n    pub fn str(&mut self) -> Result<Cow<'b, str>, DeserializeError> {\n        let bookmark = self.decoder.position();\n        match self.decoder.str() {\n            Ok(str_value) => Ok(Cow::Borrowed(str_value)),\n            Err(e) if e.is_type_mismatch() => {\n                // Move the position back to the start of the CBOR element and then try\n                // decoding it as an indefinite length string.\n                self.decoder.set_position(bookmark);\n                Ok(Cow::Owned(self.string()?))\n            }\n            Err(e) => Err(DeserializeError::new(e)),\n        }\n    }\n\n    /// Allocates and returns a `String` if the element at the current position in the buffer is either a\n    /// definite-length or an indefinite-length string. Otherwise, an error is returned if the element is not a string type.\n    pub fn string(&mut self) -> Result<String, DeserializeError> {\n        let mut iter = self.decoder.str_iter().map_err(DeserializeError::new)?;\n        let head = iter.next();\n\n        let decoded_string = match head {\n            None => String::new(),\n            Some(head) => {\n                let mut combined_chunks = String::from(head.map_err(DeserializeError::new)?);\n                for chunk in iter {\n                    combined_chunks.push_str(chunk.map_err(DeserializeError::new)?);\n                }\n                combined_chunks\n            }\n        };\n\n        Ok(decoded_string)\n    }\n\n    /// Returns a `blob` if the element at the current position in the buffer is a byte string. Otherwise,\n    /// a `DeserializeError` error is returned.\n    pub fn blob(&mut self) -> Result<Blob, DeserializeError> {\n        let iter = self.decoder.bytes_iter().map_err(DeserializeError::new)?;\n        let parts: Vec<&[u8]> = iter\n            .collect::<Result<_, _>>()\n            .map_err(DeserializeError::new)?;\n\n        Ok(if parts.len() == 1 {\n            Blob::new(parts[0]) // Directly convert &[u8] to Blob if there's only one part.\n        } else {\n            Blob::new(parts.concat()) // Concatenate all parts into a single Blob.\n        })\n    }\n\n    /// Returns a `DateTime` if the element at the current position in the buffer is a `timestamp`. Otherwise,\n    /// a `DeserializeError` error is returned.\n    pub fn timestamp(&mut self) -> Result<DateTime, DeserializeError> {\n        let tag = self.decoder.tag().map_err(DeserializeError::new)?;\n        let timestamp_tag = minicbor::data::Tag::from(minicbor::data::IanaTag::Timestamp);\n\n        if tag != timestamp_tag {\n            Err(DeserializeError::new(Error::message(\n                \"expected timestamp tag\",\n            )))\n        } else {\n            // Values that are more granular than millisecond precision SHOULD be truncated to fit\n            // millisecond precision for epoch-seconds:\n            // https://smithy.io/2.0/spec/protocol-traits.html#timestamp-formats\n            //\n            // Without truncation, the `RpcV2CborDateTimeWithFractionalSeconds` protocol test would\n            // fail since the upstream test expect `123000000` in subsec but the decoded actual\n            // subsec would be `123000025`.\n            // https://github.com/smithy-lang/smithy/blob/6466fe77c65b8a17b219f0b0a60c767915205f95/smithy-protocol-tests/model/rpcv2Cbor/fractional-seconds.smithy#L17\n            let epoch_seconds = self.decoder.f64().map_err(DeserializeError::new)?;\n            let mut result = DateTime::from_secs_f64(epoch_seconds);\n            let subsec_nanos = result.subsec_nanos();\n            result.set_subsec_nanos((subsec_nanos / 1_000_000) * 1_000_000);\n            Ok(result)\n        }\n    }\n}\n\n#[allow(dead_code)] // to avoid `never constructed` warning\n#[derive(Debug)]\npub struct ArrayIter<'a, 'b, T> {\n    inner: minicbor::decode::ArrayIter<'a, 'b, T>,\n}\n\nimpl<'b, T: minicbor::Decode<'b, ()>> Iterator for ArrayIter<'_, 'b, T> {\n    type Item = Result<T, DeserializeError>;\n\n    fn next(&mut self) -> Option<Self::Item> {\n        self.inner\n            .next()\n            .map(|opt| opt.map_err(DeserializeError::new))\n    }\n}\n\n#[allow(dead_code)] // to avoid `never constructed` warning\n#[derive(Debug)]\npub struct MapIter<'a, 'b, K, V> {\n    inner: minicbor::decode::MapIter<'a, 'b, K, V>,\n}\n\nimpl<'b, K, V> Iterator for MapIter<'_, 'b, K, V>\nwhere\n    K: minicbor::Decode<'b, ()>,\n    V: minicbor::Decode<'b, ()>,\n{\n    type Item = Result<(K, V), DeserializeError>;\n\n    fn next(&mut self) -> Option<Self::Item> {\n        self.inner\n            .next()\n            .map(|opt| opt.map_err(DeserializeError::new))\n    }\n}\n\npub fn set_optional<B, F>(builder: B, decoder: &mut Decoder, f: F) -> Result<B, DeserializeError>\nwhere\n    F: Fn(B, &mut Decoder) -> Result<B, DeserializeError>,\n{\n    match decoder.datatype()? {\n        crate::data::Type::Null => {\n            decoder.null()?;\n            Ok(builder)\n        }\n        _ => f(builder, decoder),\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use crate::Decoder;\n    use aws_smithy_types::date_time::Format;\n\n    #[test]\n    fn test_definite_str_is_cow_borrowed() {\n        // Definite length key `thisIsAKey`.\n        let definite_bytes = [\n            0x6a, 0x74, 0x68, 0x69, 0x73, 0x49, 0x73, 0x41, 0x4b, 0x65, 0x79,\n        ];\n        let mut decoder = Decoder::new(&definite_bytes);\n        let member = decoder.str().expect(\"could not decode str\");\n        assert_eq!(member, \"thisIsAKey\");\n        assert!(matches!(member, std::borrow::Cow::Borrowed(_)));\n    }\n\n    #[test]\n    fn test_indefinite_str_is_cow_owned() {\n        // Indefinite length key `this`, `Is`, `A` and `Key`.\n        let indefinite_bytes = [\n            0x7f, 0x64, 0x74, 0x68, 0x69, 0x73, 0x62, 0x49, 0x73, 0x61, 0x41, 0x63, 0x4b, 0x65,\n            0x79, 0xff,\n        ];\n        let mut decoder = Decoder::new(&indefinite_bytes);\n        let member = decoder.str().expect(\"could not decode str\");\n        assert_eq!(member, \"thisIsAKey\");\n        assert!(matches!(member, std::borrow::Cow::Owned(_)));\n    }\n\n    #[test]\n    fn test_empty_str_works() {\n        let bytes = [0x60];\n        let mut decoder = Decoder::new(&bytes);\n        let member = decoder.str().expect(\"could not decode empty str\");\n        assert_eq!(member, \"\");\n    }\n\n    #[test]\n    fn test_empty_blob_works() {\n        let bytes = [0x40];\n        let mut decoder = Decoder::new(&bytes);\n        let member = decoder.blob().expect(\"could not decode an empty blob\");\n        assert_eq!(member, aws_smithy_types::Blob::new([]));\n    }\n\n    #[test]\n    fn test_indefinite_length_blob() {\n        // Indefinite length blob containing bytes corresponding to `indefinite-byte, chunked, on each comma`.\n        // https://cbor.nemo157.com/#type=hex&value=bf69626c6f6256616c75655f50696e646566696e6974652d627974652c49206368756e6b65642c4e206f6e206561636820636f6d6d61ffff\n        let indefinite_bytes = [\n            0x5f, 0x50, 0x69, 0x6e, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x65, 0x2d, 0x62,\n            0x79, 0x74, 0x65, 0x2c, 0x49, 0x20, 0x63, 0x68, 0x75, 0x6e, 0x6b, 0x65, 0x64, 0x2c,\n            0x4e, 0x20, 0x6f, 0x6e, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x63, 0x6f, 0x6d, 0x6d,\n            0x61, 0xff,\n        ];\n        let mut decoder = Decoder::new(&indefinite_bytes);\n        let member = decoder.blob().expect(\"could not decode blob\");\n        assert_eq!(\n            member,\n            aws_smithy_types::Blob::new(\"indefinite-byte, chunked, on each comma\".as_bytes())\n        );\n    }\n\n    #[test]\n    fn test_timestamp_should_be_truncated_to_fit_millisecond_precision() {\n        // Input bytes are derived from the `RpcV2CborDateTimeWithFractionalSeconds` protocol test,\n        // extracting portion representing a timestamp value.\n        let bytes = [\n            0xc1, 0xfb, 0x41, 0xcc, 0x37, 0xdb, 0x38, 0x0f, 0xbe, 0x77, 0xff,\n        ];\n        let mut decoder = Decoder::new(&bytes);\n        let timestamp = decoder.timestamp().expect(\"should decode timestamp\");\n        assert_eq!(\n            timestamp,\n            aws_smithy_types::date_time::DateTime::from_str(\n                \"2000-01-02T20:34:56.123Z\",\n                Format::DateTime\n            )\n            .unwrap()\n        );\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-cbor/src/encode.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_smithy_types::{Blob, DateTime};\n\n/// Macro for delegating method calls to the encoder.\n///\n/// This macro generates wrapper methods for calling specific encoder methods on the encoder\n/// and returning a mutable reference to self for method chaining.\n///\n/// # Example\n///\n/// ```ignore\n/// delegate_method! {\n///     /// Wrapper method for encoding method `encode_str` on the encoder.\n///     encode_str_wrapper => encode_str(data: &str);\n///     /// Wrapper method for encoding method `encode_int` on the encoder.\n///     encode_int_wrapper => encode_int(value: i32);\n/// }\n/// ```\nmacro_rules! delegate_method {\n    ($($(#[$meta:meta])* $wrapper_name:ident => $encoder_name:ident($($param_name:ident : $param_type:ty),*);)+) => {\n        $(\n            pub fn $wrapper_name(&mut self, $($param_name: $param_type),*) -> &mut Self {\n                self.encoder.$encoder_name($($param_name)*).expect(INFALLIBLE_WRITE);\n                self\n            }\n        )+\n    };\n}\n\n#[derive(Debug, Clone)]\npub struct Encoder {\n    encoder: minicbor::Encoder<Vec<u8>>,\n}\n\n/// We always write to a `Vec<u8>`, which is infallible in `minicbor`.\n/// <https://docs.rs/minicbor/latest/minicbor/encode/write/trait.Write.html#impl-Write-for-Vec%3Cu8%3E>\nconst INFALLIBLE_WRITE: &str = \"write failed\";\n\nimpl Encoder {\n    pub fn new(writer: Vec<u8>) -> Self {\n        Self {\n            encoder: minicbor::Encoder::new(writer),\n        }\n    }\n\n    delegate_method! {\n        /// Used when it's not cheap to calculate the size, i.e. when the struct has one or more\n        /// `Option`al members.\n        begin_map => begin_map();\n        /// Writes a boolean value.\n        boolean => bool(x: bool);\n        /// Writes a byte value.\n        byte => i8(x: i8);\n        /// Writes a short value.\n        short => i16(x: i16);\n        /// Writes an integer value.\n        integer => i32(x: i32);\n        /// Writes an long value.\n        long => i64(x: i64);\n        /// Writes an float value.\n        float => f32(x: f32);\n        /// Writes an double value.\n        double => f64(x: f64);\n        /// Writes a null tag.\n        null => null();\n        /// Writes an end tag.\n        end => end();\n    }\n\n    /// Maximum size of a CBOR type+length header: 1 byte major type + up to 8 bytes for the length.\n    const MAX_HEADER_LEN: usize = 9;\n\n    /// Writes a CBOR type+length header directly to the writer.\n    ///\n    /// Encodes the \"additional information\" field per RFC 8949 §3:\n    /// - 0..=23: length is stored directly in the low 5 bits of the initial byte.\n    /// - 24: one-byte uint follows (value 24..=0xff).\n    /// - 25: two-byte big-endian uint follows (value 0x100..=0xffff).\n    /// - 26: four-byte big-endian uint follows (value 0x1_0000..=0xffff_ffff).\n    /// - 27: eight-byte big-endian uint follows (larger values).\n    #[inline]\n    fn write_type_len(writer: &mut Vec<u8>, major: u8, len: usize) {\n        let mut buf = [0u8; Self::MAX_HEADER_LEN];\n        let n = match len {\n            0..=23 => {\n                buf[0] = major | len as u8;\n                1\n            }\n            24..=0xff => {\n                buf[0] = major | 24;\n                buf[1] = len as u8;\n                2\n            }\n            0x100..=0xffff => {\n                buf[0] = major | 25;\n                buf[1..3].copy_from_slice(&(len as u16).to_be_bytes());\n                3\n            }\n            0x1_0000..=0xffff_ffff => {\n                buf[0] = major | 26;\n                buf[1..5].copy_from_slice(&(len as u32).to_be_bytes());\n                5\n            }\n            _ => {\n                buf[0] = major | 27;\n                buf[1..9].copy_from_slice(&(len as u64).to_be_bytes());\n                9\n            }\n        };\n        writer.extend_from_slice(&buf[..n]);\n    }\n\n    /// Writes a definite length string. Collapses header+data into a single reserve+write.\n    pub fn str(&mut self, x: &str) -> &mut Self {\n        let writer = self.encoder.writer_mut();\n        let len = x.len();\n        writer.reserve(Self::MAX_HEADER_LEN + len);\n        Self::write_type_len(writer, 0x60, len);\n        writer.extend_from_slice(x.as_bytes());\n        self\n    }\n\n    /// Writes a blob. Collapses header+data into a single reserve+write.\n    pub fn blob(&mut self, x: &Blob) -> &mut Self {\n        let data = x.as_ref();\n        let writer = self.encoder.writer_mut();\n        let len = data.len();\n        writer.reserve(Self::MAX_HEADER_LEN + len);\n        Self::write_type_len(writer, 0x40, len);\n        writer.extend_from_slice(data);\n        self\n    }\n\n    /// Writes a fixed length array of given length.\n    pub fn array(&mut self, len: usize) -> &mut Self {\n        Self::write_type_len(self.encoder.writer_mut(), 0x80, len);\n        self\n    }\n\n    /// Writes a fixed length map of given length.\n    /// Used when we know the size in advance, i.e.:\n    /// - when a struct has all non-`Option`al members.\n    /// - when serializing `union` shapes (they can only have one member set).\n    /// - when serializing a `map` shape.\n    pub fn map(&mut self, len: usize) -> &mut Self {\n        Self::write_type_len(self.encoder.writer_mut(), 0xa0, len);\n        self\n    }\n\n    pub fn timestamp(&mut self, x: &DateTime) -> &mut Self {\n        self.encoder\n            .tag(minicbor::data::Tag::from(\n                minicbor::data::IanaTag::Timestamp,\n            ))\n            .expect(INFALLIBLE_WRITE);\n        self.encoder.f64(x.as_secs_f64()).expect(INFALLIBLE_WRITE);\n        self\n    }\n\n    pub fn into_writer(self) -> Vec<u8> {\n        self.encoder.into_writer()\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::Encoder;\n    use aws_smithy_types::Blob;\n\n    /// Verify our `str()` produces byte-identical output to minicbor's.\n    #[test]\n    fn str_matches_minicbor() {\n        let cases = [\n            \"\",                        // len 0\n            \"a\",                       // len 1 (in 0..=23 range)\n            \"hello world!! test str\",  // len 22 (still 0..=23)\n            \"this is exactly 24 char\", // len 24 (0x18, first 1-byte length)\n            &\"x\".repeat(0xff),         // len 255 (max 1-byte length)\n            &\"y\".repeat(0x100),        // len 256 (first 2-byte length)\n            &\"z\".repeat(0x1_0000),     // len 65536 (first 4-byte length)\n        ];\n        for input in &cases {\n            let mut ours = Encoder::new(Vec::new());\n            ours.str(input);\n\n            let mut theirs = minicbor::Encoder::new(Vec::new());\n            theirs.str(input).unwrap();\n\n            assert_eq!(\n                ours.into_writer(),\n                theirs.into_writer(),\n                \"str mismatch for input len={}\",\n                input.len()\n            );\n        }\n    }\n\n    /// Verify our `blob()` produces byte-identical output to minicbor's.\n    #[test]\n    fn blob_matches_minicbor() {\n        let cases: Vec<Vec<u8>> = vec![\n            vec![],               // empty\n            vec![0x42],           // 1 byte\n            vec![0xAB; 23],       // max inline length\n            vec![0xCD; 24],       // first 1-byte length\n            vec![0xEF; 0xff],     // max 1-byte length\n            vec![0x01; 0x100],    // first 2-byte length\n            vec![0x02; 0x1_0000], // first 4-byte length\n        ];\n        for input in &cases {\n            let mut ours = Encoder::new(Vec::new());\n            ours.blob(&Blob::new(input.clone()));\n\n            let mut theirs = minicbor::Encoder::new(Vec::new());\n            theirs.bytes(input).unwrap();\n\n            assert_eq!(\n                ours.into_writer(),\n                theirs.into_writer(),\n                \"blob mismatch for input len={}\",\n                input.len()\n            );\n        }\n    }\n\n    /// Verify chained `str()` calls don't corrupt encoder state for subsequent writes.\n    #[test]\n    fn str_chained_matches_minicbor() {\n        let mut ours = Encoder::new(Vec::new());\n        ours.str(\"key1\").str(\"value1\").str(\"key2\").str(\"value2\");\n\n        let mut theirs = minicbor::Encoder::new(Vec::new());\n        theirs\n            .str(\"key1\")\n            .unwrap()\n            .str(\"value1\")\n            .unwrap()\n            .str(\"key2\")\n            .unwrap()\n            .str(\"value2\")\n            .unwrap();\n\n        assert_eq!(ours.into_writer(), theirs.into_writer());\n    }\n\n    /// Verify `str()` works correctly inside a map structure (the real-world hot path).\n    #[test]\n    fn str_inside_map_matches_minicbor() {\n        let mut ours = Encoder::new(Vec::new());\n        ours.begin_map().str(\"TableName\").str(\"my-table\").end();\n\n        let mut theirs = minicbor::Encoder::new(Vec::new());\n        theirs\n            .begin_map()\n            .unwrap()\n            .str(\"TableName\")\n            .unwrap()\n            .str(\"my-table\")\n            .unwrap()\n            .end()\n            .unwrap();\n\n        assert_eq!(ours.into_writer(), theirs.into_writer());\n    }\n\n    /// Verify `str()` handles multi-byte UTF-8 correctly (CBOR text strings must be valid UTF-8).\n    #[test]\n    fn str_utf8_matches_minicbor() {\n        let cases = [\n            \"café\",          // 2-byte UTF-8\n            \"日本語\",        // 3-byte UTF-8\n            \"🦀🔥\",          // 4-byte UTF-8 (emoji)\n            \"mixed: aé日🦀\", // all byte widths\n        ];\n        for input in &cases {\n            let mut ours = Encoder::new(Vec::new());\n            ours.str(input);\n\n            let mut theirs = minicbor::Encoder::new(Vec::new());\n            theirs.str(input).unwrap();\n\n            assert_eq!(\n                ours.into_writer(),\n                theirs.into_writer(),\n                \"str UTF-8 mismatch for {:?}\",\n                input\n            );\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-cbor/src/lib.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! CBOR abstractions for Smithy.\n\n/* Automatically managed default lints */\n#![cfg_attr(docsrs, feature(doc_cfg))]\n/* End of automatically managed default lints */\n\npub mod data;\npub mod decode;\npub mod encode;\n\npub use decode::Decoder;\npub use encode::Encoder;\n"
  },
  {
    "path": "rust-runtime/aws-smithy-checksums/Cargo.toml",
    "content": "[package]\nname = \"aws-smithy-checksums\"\nversion = \"0.64.7\"\nauthors = [\n    \"AWS Rust SDK Team <aws-sdk-rust@amazon.com>\",\n    \"Zelda Hessler <zhessler@amazon.com>\",\n]\ndescription = \"Checksum calculation and verification callbacks\"\nedition = \"2021\"\nlicense = \"Apache-2.0\"\nrepository = \"https://github.com/smithy-lang/smithy-rs\"\nrust-version = \"1.91.1\"\n\n# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html\n\n[dependencies]\naws-smithy-http = { path = \"../aws-smithy-http\" }\naws-smithy-types = { path = \"../aws-smithy-types\", features = [\"http-body-1-x\"]}\nbytes = \"1.11.1\"\n# FIXME(https://github.com/smithy-lang/smithy-rs/issues/3981): Keep pinned until we have more comprehensive testing in place\ncrc-fast = \"~1.9.0\"\nhex = \"0.4.3\"\nhttp-1x = {package = \"http\", version = \"1.3.1\"}\nhttp-body-1x = {package = \"http-body\", version = \"1.0.1\"}\nhttp-body-util = \"0.1.3\"\nmd-5 = \"0.11\"\npin-project-lite = \"0.2.14\"\nsha1 = \"0.11\"\nsha2 = \"0.11\"\ntracing = \"0.1.44\"\n\n[dev-dependencies]\nbytes-utils = \"0.1.2\"\npretty_assertions = \"1.3\"\ntokio = { version = \"1.49.0\", features = [\"macros\", \"rt\"] }\ntracing-test = \"0.2.1\"\n\n[package.metadata.docs.rs]\nall-features = true\ntargets = [\"x86_64-unknown-linux-gnu\"]\ncargo-args = [\"-Zunstable-options\", \"-Zrustdoc-scrape-examples\"]\nrustdoc-args = [\"--cfg\", \"docsrs\"]\n# End of docs.rs metadata\n"
  },
  {
    "path": "rust-runtime/aws-smithy-checksums/LICENSE",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n"
  },
  {
    "path": "rust-runtime/aws-smithy-checksums/README.md",
    "content": "# aws-smithy-checksums\n\nChecksum calculation and verification callbacks for HTTP request and response bodies sent by service clients generated by [smithy-rs](https://github.com/smithy-lang/smithy-rs).\n\n<!-- anchor_start:footer -->\nThis crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly.\n<!-- anchor_end:footer -->\n"
  },
  {
    "path": "rust-runtime/aws-smithy-checksums/external-types.toml",
    "content": "allowed_external_types = [\n    \"aws_smithy_types::body::SdkBody\",\n    \"bytes::bytes::Bytes\",\n    \"http::header::map::HeaderMap\",\n    \"http::header::name::HeaderName\",\n    \"http::header::value::HeaderValue\",\n    \"http_body::Body\",\n]\n"
  },
  {
    "path": "rust-runtime/aws-smithy-checksums/src/body/cache.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Checksum caching functionality.\n\nuse http_1x::HeaderMap;\nuse std::sync::{Arc, Mutex};\n\n/// A cache for storing previously calculated checksums.\n#[derive(Debug, Clone)]\npub struct ChecksumCache {\n    inner: Arc<Mutex<Option<HeaderMap>>>,\n}\n\nimpl ChecksumCache {\n    /// Create a new empty checksum cache.\n    pub fn new() -> Self {\n        Self {\n            inner: Arc::new(Mutex::new(None)),\n        }\n    }\n\n    /// Get a cached checksum if previously calculated\n    pub fn get(&self) -> Option<HeaderMap> {\n        self.inner.lock().unwrap().clone()\n    }\n\n    /// Store a checksum in the cache.\n    pub fn set(&self, headers: HeaderMap) {\n        let mut inner = self.inner.lock().unwrap();\n        *inner = Some(headers);\n    }\n}\n\nimpl Default for ChecksumCache {\n    fn default() -> Self {\n        Self::new()\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-checksums/src/body/calculate.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Functionality for calculating the checksum of an HTTP body and emitting it as trailers.\n\nuse super::ChecksumCache;\nuse crate::http::HttpChecksum;\n\nuse aws_smithy_http::header::append_merge_header_maps_http_1x;\nuse aws_smithy_types::body::SdkBody;\nuse pin_project_lite::pin_project;\nuse std::pin::Pin;\nuse std::task::{Context, Poll};\nuse tracing::warn;\n\npin_project! {\n    /// A body-wrapper that will calculate the `InnerBody`'s checksum and emit it as a trailer.\n    pub struct ChecksumBody<InnerBody> {\n            #[pin]\n            body: InnerBody,\n            checksum: Option<Box<dyn HttpChecksum>>,\n            written_trailers: bool,\n            cache: Option<ChecksumCache>\n    }\n}\n\nimpl ChecksumBody<SdkBody> {\n    /// Given an `SdkBody` and a `Box<dyn HttpChecksum>`, create a new `ChecksumBody<SdkBody>`.\n    pub fn new(body: SdkBody, checksum: Box<dyn HttpChecksum>) -> Self {\n        Self {\n            body,\n            checksum: Some(checksum),\n            written_trailers: false,\n            cache: None,\n        }\n    }\n\n    /// Configure a cache for this body.\n    ///\n    /// When used across multiple requests (e.g. retries) a cached checksum previously\n    /// calculated will be favored if available.\n    pub fn with_cache(self, cache: ChecksumCache) -> Self {\n        Self {\n            body: self.body,\n            checksum: self.checksum,\n            written_trailers: false,\n            cache: Some(cache),\n        }\n    }\n\n    // It would be nicer if this could take &self, but I couldn't make that\n    // work out with the Pin/Projection types, so its a static method for now\n    fn extract_or_set_cached_headers(\n        maybe_cache: &Option<ChecksumCache>,\n        checksum: Box<dyn HttpChecksum>,\n    ) -> http_1x::HeaderMap {\n        let calculated_headers = checksum.headers();\n        if let Some(cache) = maybe_cache {\n            if let Some(cached_headers) = cache.get() {\n                if cached_headers != calculated_headers {\n                    warn!(cached = ?cached_headers, calculated = ?calculated_headers, \"calculated checksum differs from cached checksum!\");\n                }\n                cached_headers\n            } else {\n                cache.set(calculated_headers.clone());\n                calculated_headers\n            }\n        } else {\n            calculated_headers\n        }\n    }\n}\n\nimpl http_body_1x::Body for ChecksumBody<SdkBody> {\n    type Data = bytes::Bytes;\n    type Error = aws_smithy_types::body::Error;\n\n    fn poll_frame(\n        self: Pin<&mut Self>,\n        cx: &mut Context<'_>,\n    ) -> Poll<Option<Result<http_body_1x::Frame<Self::Data>, Self::Error>>> {\n        let this = self.project();\n        let poll_res = this.body.poll_frame(cx);\n\n        match &poll_res {\n            Poll::Ready(Some(Ok(frame))) => {\n                // Update checksum for data frames\n                if frame.is_data() {\n                    if let Some(checksum) = this.checksum {\n                        checksum.update(frame.data_ref().expect(\"Data frame has data\"));\n                    }\n                } else {\n                    // Add checksum trailer to other trailers if necessary\n                    let checksum_headers = if let Some(checksum) = this.checksum.take() {\n                        ChecksumBody::extract_or_set_cached_headers(this.cache, checksum)\n                    } else {\n                        return Poll::Ready(None);\n                    };\n                    let trailers = frame\n                        .trailers_ref()\n                        .expect(\"Trailers frame has trailers\")\n                        .clone();\n                    *this.written_trailers = true;\n                    return Poll::Ready(Some(Ok(http_body_1x::Frame::trailers(\n                        append_merge_header_maps_http_1x(trailers, checksum_headers),\n                    ))));\n                }\n            }\n            Poll::Ready(None) => {\n                // If the trailers have not already been written (because there were no existing\n                // trailers on the body) we write them here\n                if !*this.written_trailers {\n                    let checksum_headers = if let Some(checksum) = this.checksum.take() {\n                        ChecksumBody::extract_or_set_cached_headers(this.cache, checksum)\n                    } else {\n                        return Poll::Ready(None);\n                    };\n                    let trailers = http_1x::HeaderMap::new();\n                    return Poll::Ready(Some(Ok(http_body_1x::Frame::trailers(\n                        append_merge_header_maps_http_1x(trailers, checksum_headers),\n                    ))));\n                }\n            }\n            _ => {}\n        };\n        poll_res\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::ChecksumBody;\n    use crate::{http::CRC_32_HEADER_NAME, ChecksumAlgorithm, CRC_32_NAME};\n    use aws_smithy_types::base64;\n    use aws_smithy_types::body::SdkBody;\n    use bytes::Buf;\n    use bytes_utils::SegmentedBuf;\n    use http_1x::HeaderMap;\n    use http_body_util::BodyExt;\n    use std::fmt::Write;\n    use std::io::Read;\n\n    fn header_value_as_checksum_string(header_value: &http_1x::HeaderValue) -> String {\n        let decoded_checksum = base64::decode(header_value.to_str().unwrap()).unwrap();\n        let decoded_checksum = decoded_checksum\n            .into_iter()\n            .fold(String::new(), |mut acc, byte| {\n                write!(acc, \"{byte:02X?}\").expect(\"string will always be writeable\");\n                acc\n            });\n\n        format!(\"0x{decoded_checksum}\")\n    }\n\n    #[tokio::test]\n    async fn test_checksum_body() {\n        let input_text = \"This is some test text for an SdkBody\";\n        let body = SdkBody::from(input_text);\n        let checksum = CRC_32_NAME\n            .parse::<ChecksumAlgorithm>()\n            .unwrap()\n            .into_impl();\n        let mut body = ChecksumBody::new(body, checksum);\n\n        let mut output_data = SegmentedBuf::new();\n        let mut trailers = HeaderMap::new();\n        while let Some(buf) = body.frame().await {\n            let buf = buf.unwrap();\n            if buf.is_data() {\n                output_data.push(buf.into_data().unwrap());\n            } else if buf.is_trailers() {\n                let map = buf.into_trailers().unwrap();\n                map.into_iter().for_each(|(k, v)| {\n                    trailers.insert(k.unwrap(), v);\n                });\n            }\n        }\n\n        let mut output_text = String::new();\n        output_data\n            .reader()\n            .read_to_string(&mut output_text)\n            .expect(\"Doesn't cause IO errors\");\n        // Verify data is complete and unaltered\n        assert_eq!(input_text, output_text);\n\n        let checksum_trailer = trailers\n            .get(CRC_32_HEADER_NAME)\n            .expect(\"trailers contain crc32 checksum\");\n        let checksum_trailer = header_value_as_checksum_string(checksum_trailer);\n\n        // Known correct checksum for the input \"This is some test text for an SdkBody\"\n        assert_eq!(\"0x99B01F72\", checksum_trailer);\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-checksums/src/body/validate.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Functionality for validating an HTTP body against a given precalculated checksum and emitting an\n//! error if it doesn't match.\n\nuse crate::http::HttpChecksum;\n\nuse aws_smithy_types::body::SdkBody;\n\nuse bytes::Bytes;\nuse pin_project_lite::pin_project;\n\nuse std::fmt::Display;\nuse std::pin::Pin;\nuse std::task::{Context, Poll};\n\npin_project! {\n    /// A body-wrapper that will calculate the `InnerBody`'s checksum and emit an error if it\n    /// doesn't match the precalculated checksum.\n    pub struct ChecksumBody<InnerBody> {\n        #[pin]\n        inner: InnerBody,\n        checksum: Option<Box<dyn HttpChecksum>>,\n        precalculated_checksum: Bytes,\n    }\n}\n\nimpl ChecksumBody<SdkBody> {\n    /// Given an `SdkBody`, a `Box<dyn HttpChecksum>`, and a precalculated checksum represented\n    /// as `Bytes`, create a new `ChecksumBody<SdkBody>`.\n    pub fn new(\n        body: SdkBody,\n        checksum: Box<dyn HttpChecksum>,\n        precalculated_checksum: Bytes,\n    ) -> Self {\n        Self {\n            inner: body,\n            checksum: Some(checksum),\n            precalculated_checksum,\n        }\n    }\n\n    fn poll_inner(\n        self: Pin<&mut Self>,\n        cx: &mut Context<'_>,\n    ) -> Poll<Option<Result<http_body_1x::Frame<Bytes>, aws_smithy_types::body::Error>>> {\n        use http_body_1x::Body;\n\n        let this = self.project();\n        let checksum = this.checksum;\n\n        match this.inner.poll_frame(cx) {\n            Poll::Ready(Some(Ok(frame))) => {\n                let data = frame.data_ref().expect(\"Data frame should have data\");\n                tracing::trace!(\n                    \"reading {} bytes from the body and updating the checksum calculation\",\n                    data.len()\n                );\n                let checksum = match checksum.as_mut() {\n                    Some(checksum) => checksum,\n                    None => {\n                        unreachable!(\"The checksum must exist because it's only taken out once the inner body has been completely polled.\");\n                    }\n                };\n\n                checksum.update(data);\n                Poll::Ready(Some(Ok(frame)))\n            }\n            // Once the inner body has stopped returning data, check the checksum\n            // and return an error if it doesn't match.\n            Poll::Ready(None) => {\n                tracing::trace!(\"finished reading from body, calculating final checksum\");\n                let checksum = match checksum.take() {\n                    Some(checksum) => checksum,\n                    None => {\n                        // If the checksum was already taken and this was polled again anyways,\n                        // then return nothing\n                        return Poll::Ready(None);\n                    }\n                };\n\n                let actual_checksum = checksum.finalize();\n                if *this.precalculated_checksum == actual_checksum {\n                    Poll::Ready(None)\n                } else {\n                    // So many parens it's starting to look like LISP\n                    Poll::Ready(Some(Err(Box::new(Error::ChecksumMismatch {\n                        expected: this.precalculated_checksum.clone(),\n                        actual: actual_checksum,\n                    }))))\n                }\n            }\n            Poll::Ready(Some(Err(e))) => Poll::Ready(Some(Err(e))),\n            Poll::Pending => Poll::Pending,\n        }\n    }\n}\n\n/// Errors related to checksum calculation and validation\n#[derive(Debug, Eq, PartialEq)]\n#[non_exhaustive]\npub enum Error {\n    /// The actual checksum didn't match the expected checksum. The checksummed data has been\n    /// altered since the expected checksum was calculated.\n    ChecksumMismatch { expected: Bytes, actual: Bytes },\n}\n\nimpl Display for Error {\n    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error> {\n        match self {\n            Error::ChecksumMismatch { expected, actual } => write!(\n                f,\n                \"body checksum mismatch. expected body checksum to be {} but it was {}\",\n                hex::encode(expected),\n                hex::encode(actual)\n            ),\n        }\n    }\n}\n\nimpl std::error::Error for Error {}\n\nimpl http_body_1x::Body for ChecksumBody<SdkBody> {\n    type Data = Bytes;\n    type Error = aws_smithy_types::body::Error;\n\n    fn poll_frame(\n        self: Pin<&mut Self>,\n        cx: &mut Context<'_>,\n    ) -> Poll<Option<Result<http_body_1x::Frame<Self::Data>, Self::Error>>> {\n        self.poll_inner(cx)\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use crate::body::validate::{ChecksumBody, Error};\n    use crate::ChecksumAlgorithm;\n    use aws_smithy_types::body::SdkBody;\n    use bytes::{Buf, Bytes};\n    use bytes_utils::SegmentedBuf;\n    use http_body_util::BodyExt;\n    use std::io::Read;\n\n    fn calculate_crc32_checksum(input: &str) -> Bytes {\n        let checksum =\n            crc_fast::checksum(crc_fast::CrcAlgorithm::Crc32IsoHdlc, input.as_bytes()) as u32;\n\n        Bytes::copy_from_slice(&checksum.to_be_bytes())\n    }\n\n    #[tokio::test]\n    async fn test_checksum_validated_body_errors_on_mismatch() {\n        let input_text = \"This is some test text for an SdkBody\";\n        let actual_checksum = calculate_crc32_checksum(input_text);\n        let body = SdkBody::from(input_text);\n        let non_matching_checksum = Bytes::copy_from_slice(&[0x00, 0x00, 0x00, 0x00]);\n        let mut body = ChecksumBody::new(\n            body,\n            \"crc32\".parse::<ChecksumAlgorithm>().unwrap().into_impl(),\n            non_matching_checksum.clone(),\n        );\n\n        while let Some(data) = body.frame().await {\n            match data {\n                Ok(_) => { /* Do nothing */ }\n                Err(e) => {\n                    match e.downcast_ref::<Error>().unwrap() {\n                        Error::ChecksumMismatch { expected, actual } => {\n                            assert_eq!(expected, &non_matching_checksum);\n                            assert_eq!(actual, &actual_checksum);\n                        }\n                    }\n\n                    return;\n                }\n            }\n        }\n\n        panic!(\"didn't hit expected error condition\");\n    }\n\n    #[tokio::test]\n    async fn test_checksum_validated_body_succeeds_on_match() {\n        let input_text = \"This is some test text for an SdkBody\";\n        let actual_checksum = calculate_crc32_checksum(input_text);\n        let body = SdkBody::from(input_text);\n        let http_checksum = \"crc32\".parse::<ChecksumAlgorithm>().unwrap().into_impl();\n        let mut body = ChecksumBody::new(body, http_checksum, actual_checksum);\n\n        let mut output = SegmentedBuf::new();\n        while let Some(buf) = body.frame().await {\n            let data = buf.unwrap().into_data().unwrap();\n            output.push(data);\n        }\n\n        let mut output_text = String::new();\n        output\n            .reader()\n            .read_to_string(&mut output_text)\n            .expect(\"Doesn't cause IO errors\");\n        // Verify data is complete and unaltered\n        assert_eq!(input_text, output_text);\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-checksums/src/body.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! HTTP body-wrappers that calculate and validate checksums.\n\npub mod cache;\npub mod calculate;\npub mod validate;\n\npub use cache::ChecksumCache;\n"
  },
  {
    "path": "rust-runtime/aws-smithy-checksums/src/error.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::error::Error;\nuse std::fmt;\n\n/// A checksum algorithm was unknown\n#[derive(Debug)]\npub struct UnknownChecksumAlgorithmError {\n    checksum_algorithm: String,\n}\n\nimpl UnknownChecksumAlgorithmError {\n    pub(crate) fn new(checksum_algorithm: impl Into<String>) -> Self {\n        Self {\n            checksum_algorithm: checksum_algorithm.into(),\n        }\n    }\n\n    /// The checksum algorithm that is unknown\n    pub fn checksum_algorithm(&self) -> &str {\n        &self.checksum_algorithm\n    }\n}\n\nimpl fmt::Display for UnknownChecksumAlgorithmError {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        write!(\n            f,\n            r#\"unknown checksum algorithm \"{}\", please pass a known algorithm name (\"crc32\", \"crc32c\", \"sha1\", \"sha256\", \"md5\")\"#,\n            self.checksum_algorithm\n        )\n    }\n}\n\nimpl Error for UnknownChecksumAlgorithmError {}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-checksums/src/http.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Checksum support for HTTP requests and responses.\n\nuse aws_smithy_types::base64;\n\nuse crate::Crc64Nvme;\nuse crate::{\n    Checksum, Crc32, Crc32c, Md5, Sha1, Sha256, CRC_32_C_NAME, CRC_32_NAME, CRC_64_NVME_NAME,\n    SHA_1_NAME, SHA_256_NAME,\n};\n\npub const CRC_32_HEADER_NAME: &str = \"x-amz-checksum-crc32\";\npub const CRC_32_C_HEADER_NAME: &str = \"x-amz-checksum-crc32c\";\npub const SHA_1_HEADER_NAME: &str = \"x-amz-checksum-sha1\";\npub const SHA_256_HEADER_NAME: &str = \"x-amz-checksum-sha256\";\npub const CRC_64_NVME_HEADER_NAME: &str = \"x-amz-checksum-crc64nvme\";\n\n// Preserved for compatibility purposes. This should never be used by users, only within smithy-rs\n#[warn(dead_code)]\npub(crate) static MD5_HEADER_NAME: &str = \"content-md5\";\n\n/// When a response has to be checksum-verified, we have to check possible headers until we find the\n/// header with the precalculated checksum. Because a service may send back multiple headers, we have\n/// to check them in order based on how fast each checksum is to calculate.\npub const CHECKSUM_ALGORITHMS_IN_PRIORITY_ORDER: [&str; 5] = [\n    CRC_64_NVME_NAME,\n    CRC_32_C_NAME,\n    CRC_32_NAME,\n    SHA_1_NAME,\n    SHA_256_NAME,\n];\n\n/// Checksum algorithms are use to validate the integrity of data. Structs that implement this trait\n/// can be used as checksum calculators. This trait requires Send + Sync because these checksums are\n/// often used in a threaded context.\npub trait HttpChecksum: Checksum + Send + Sync {\n    /// Either return this checksum as a http-02x `HeaderMap` containing one HTTP header, or return an error\n    /// describing why checksum calculation failed.\n    fn headers(self: Box<Self>) -> http_1x::HeaderMap<http_1x::HeaderValue> {\n        let mut header_map = http_1x::HeaderMap::new();\n        header_map.insert(self.header_name(), self.header_value());\n\n        header_map\n    }\n\n    /// Return the `HeaderName` used to represent this checksum algorithm\n    fn header_name(&self) -> &'static str;\n\n    /// Return the calculated checksum as a base64-encoded http-02x `HeaderValue`\n    fn header_value(self: Box<Self>) -> http_1x::HeaderValue {\n        let hash = self.finalize();\n        http_1x::HeaderValue::from_str(&base64::encode(&hash[..]))\n            .expect(\"base64 encoded bytes are always valid header values\")\n    }\n\n    /// Return the total size of\n    /// - The `HeaderName`\n    /// - The header name/value separator\n    /// - The base64-encoded `HeaderValue`\n    fn size(&self) -> u64 {\n        let trailer_name_size_in_bytes = self.header_name().len();\n        let base64_encoded_checksum_size_in_bytes =\n            base64::encoded_length(Checksum::size(self) as usize);\n\n        let size = trailer_name_size_in_bytes\n            // HTTP trailer names and values may be separated by either a single colon or a single\n            // colon and a whitespace. In the AWS Rust SDK, we use a single colon.\n            + \":\".len()\n            + base64_encoded_checksum_size_in_bytes;\n\n        size as u64\n    }\n}\n\nimpl HttpChecksum for Crc32 {\n    fn header_name(&self) -> &'static str {\n        CRC_32_HEADER_NAME\n    }\n}\n\nimpl HttpChecksum for Crc32c {\n    fn header_name(&self) -> &'static str {\n        CRC_32_C_HEADER_NAME\n    }\n}\n\nimpl HttpChecksum for Crc64Nvme {\n    fn header_name(&self) -> &'static str {\n        CRC_64_NVME_HEADER_NAME\n    }\n}\n\nimpl HttpChecksum for Sha1 {\n    fn header_name(&self) -> &'static str {\n        SHA_1_HEADER_NAME\n    }\n}\n\nimpl HttpChecksum for Sha256 {\n    fn header_name(&self) -> &'static str {\n        SHA_256_HEADER_NAME\n    }\n}\n\nimpl HttpChecksum for Md5 {\n    fn header_name(&self) -> &'static str {\n        MD5_HEADER_NAME\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use aws_smithy_types::base64;\n    use bytes::Bytes;\n\n    use crate::{\n        ChecksumAlgorithm, CRC_32_C_NAME, CRC_32_NAME, CRC_64_NVME_NAME, SHA_1_NAME, SHA_256_NAME,\n    };\n\n    use super::HttpChecksum;\n\n    #[test]\n    fn test_trailer_length_of_crc32_checksum_body() {\n        let checksum = CRC_32_NAME\n            .parse::<ChecksumAlgorithm>()\n            .unwrap()\n            .into_impl();\n        let expected_size = 29;\n        let actual_size = HttpChecksum::size(&*checksum);\n        assert_eq!(expected_size, actual_size)\n    }\n\n    #[test]\n    fn test_trailer_value_of_crc32_checksum_body() {\n        let checksum = CRC_32_NAME\n            .parse::<ChecksumAlgorithm>()\n            .unwrap()\n            .into_impl();\n        // The CRC32 of an empty string is all zeroes\n        let expected_value = Bytes::from_static(b\"\\0\\0\\0\\0\");\n        let expected_value = base64::encode(&expected_value);\n        let actual_value = checksum.header_value();\n        assert_eq!(expected_value, actual_value)\n    }\n\n    #[test]\n    fn test_trailer_length_of_crc32c_checksum_body() {\n        let checksum = CRC_32_C_NAME\n            .parse::<ChecksumAlgorithm>()\n            .unwrap()\n            .into_impl();\n        let expected_size = 30;\n        let actual_size = HttpChecksum::size(&*checksum);\n        assert_eq!(expected_size, actual_size)\n    }\n\n    #[test]\n    fn test_trailer_value_of_crc32c_checksum_body() {\n        let checksum = CRC_32_C_NAME\n            .parse::<ChecksumAlgorithm>()\n            .unwrap()\n            .into_impl();\n        // The CRC32C of an empty string is all zeroes\n        let expected_value = Bytes::from_static(b\"\\0\\0\\0\\0\");\n        let expected_value = base64::encode(&expected_value);\n        let actual_value = checksum.header_value();\n        assert_eq!(expected_value, actual_value)\n    }\n\n    #[test]\n    fn test_trailer_length_of_crc64nvme_checksum_body() {\n        let checksum = CRC_64_NVME_NAME\n            .parse::<ChecksumAlgorithm>()\n            .unwrap()\n            .into_impl();\n        let expected_size = 37;\n        let actual_size = HttpChecksum::size(&*checksum);\n        assert_eq!(expected_size, actual_size)\n    }\n\n    #[test]\n    fn test_trailer_value_of_crc64nvme_checksum_body() {\n        let checksum = CRC_64_NVME_NAME\n            .parse::<ChecksumAlgorithm>()\n            .unwrap()\n            .into_impl();\n        // The CRC64NVME of an empty string is all zeroes\n        let expected_value = Bytes::from_static(b\"\\0\\0\\0\\0\\0\\0\\0\\0\");\n        let expected_value = base64::encode(&expected_value);\n        let actual_value = checksum.header_value();\n        assert_eq!(expected_value, actual_value)\n    }\n\n    #[test]\n    fn test_trailer_length_of_sha1_checksum_body() {\n        let checksum = SHA_1_NAME.parse::<ChecksumAlgorithm>().unwrap().into_impl();\n        let expected_size = 48;\n        let actual_size = HttpChecksum::size(&*checksum);\n        assert_eq!(expected_size, actual_size)\n    }\n\n    #[test]\n    fn test_trailer_value_of_sha1_checksum_body() {\n        let checksum = SHA_1_NAME.parse::<ChecksumAlgorithm>().unwrap().into_impl();\n        // The SHA1 of an empty string is da39a3ee5e6b4b0d3255bfef95601890afd80709\n        let expected_value = Bytes::from_static(&[\n            0xda, 0x39, 0xa3, 0xee, 0x5e, 0x6b, 0x4b, 0x0d, 0x32, 0x55, 0xbf, 0xef, 0x95, 0x60,\n            0x18, 0x90, 0xaf, 0xd8, 0x07, 0x09,\n        ]);\n        let expected_value = base64::encode(&expected_value);\n        let actual_value = checksum.header_value();\n        assert_eq!(expected_value, actual_value)\n    }\n\n    #[test]\n    fn test_trailer_length_of_sha256_checksum_body() {\n        let checksum = SHA_256_NAME\n            .parse::<ChecksumAlgorithm>()\n            .unwrap()\n            .into_impl();\n        let expected_size = 66;\n        let actual_size = HttpChecksum::size(&*checksum);\n        assert_eq!(expected_size, actual_size)\n    }\n\n    #[test]\n    fn test_trailer_value_of_sha256_checksum_body() {\n        let checksum = SHA_256_NAME\n            .parse::<ChecksumAlgorithm>()\n            .unwrap()\n            .into_impl();\n        // The SHA256 of an empty string is e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\n        let expected_value = Bytes::from_static(&[\n            0xe3, 0xb0, 0xc4, 0x42, 0x98, 0xfc, 0x1c, 0x14, 0x9a, 0xfb, 0xf4, 0xc8, 0x99, 0x6f,\n            0xb9, 0x24, 0x27, 0xae, 0x41, 0xe4, 0x64, 0x9b, 0x93, 0x4c, 0xa4, 0x95, 0x99, 0x1b,\n            0x78, 0x52, 0xb8, 0x55,\n        ]);\n        let expected_value = base64::encode(&expected_value);\n        let actual_value = checksum.header_value();\n        assert_eq!(expected_value, actual_value)\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-checksums/src/lib.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/* Automatically managed default lints */\n#![cfg_attr(docsrs, feature(doc_cfg))]\n/* End of automatically managed default lints */\n#![allow(clippy::derive_partial_eq_without_eq)]\n#![warn(\n    // missing_docs,\n    rustdoc::missing_crate_level_docs,\n    unreachable_pub,\n    rust_2018_idioms\n)]\n\n//! Checksum calculation and verification callbacks.\n\nuse crate::error::UnknownChecksumAlgorithmError;\n\nuse bytes::Bytes;\nuse std::{fmt::Debug, str::FromStr};\n\npub mod body;\npub mod error;\npub mod http;\n\n// Valid checksum algorithm names\npub const CRC_32_NAME: &str = \"crc32\";\npub const CRC_32_C_NAME: &str = \"crc32c\";\npub const CRC_64_NVME_NAME: &str = \"crc64nvme\";\npub const SHA_1_NAME: &str = \"sha1\";\npub const SHA_256_NAME: &str = \"sha256\";\npub const MD5_NAME: &str = \"md5\";\n\n/// We only support checksum calculation and validation for these checksum algorithms.\n#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]\n#[non_exhaustive]\npub enum ChecksumAlgorithm {\n    #[default]\n    Crc32,\n    Crc32c,\n    #[deprecated]\n    Md5,\n    Sha1,\n    Sha256,\n    Crc64Nvme,\n}\n\nimpl FromStr for ChecksumAlgorithm {\n    type Err = UnknownChecksumAlgorithmError;\n\n    /// Create a new `ChecksumAlgorithm` from an algorithm name. Valid algorithm names are:\n    /// - \"crc32\"\n    /// - \"crc32c\"\n    /// - \"crc64nvme\"\n    /// - \"sha1\"\n    /// - \"sha256\"\n    ///\n    /// Passing an invalid name will return an error.\n    fn from_str(checksum_algorithm: &str) -> Result<Self, Self::Err> {\n        if checksum_algorithm.eq_ignore_ascii_case(CRC_32_NAME) {\n            Ok(Self::Crc32)\n        } else if checksum_algorithm.eq_ignore_ascii_case(CRC_32_C_NAME) {\n            Ok(Self::Crc32c)\n        } else if checksum_algorithm.eq_ignore_ascii_case(SHA_1_NAME) {\n            Ok(Self::Sha1)\n        } else if checksum_algorithm.eq_ignore_ascii_case(SHA_256_NAME) {\n            Ok(Self::Sha256)\n        } else if checksum_algorithm.eq_ignore_ascii_case(MD5_NAME) {\n            // MD5 is now an alias for the default Crc32 since it is deprecated\n            Ok(Self::Crc32)\n        } else if checksum_algorithm.eq_ignore_ascii_case(CRC_64_NVME_NAME) {\n            Ok(Self::Crc64Nvme)\n        } else {\n            Err(UnknownChecksumAlgorithmError::new(checksum_algorithm))\n        }\n    }\n}\n\nimpl ChecksumAlgorithm {\n    /// Return the `HttpChecksum` implementor for this algorithm\n    pub fn into_impl(self) -> Box<dyn http::HttpChecksum> {\n        match self {\n            Self::Crc32 => Box::<Crc32>::default(),\n            Self::Crc32c => Box::<Crc32c>::default(),\n            Self::Crc64Nvme => Box::<Crc64Nvme>::default(),\n            #[allow(deprecated)]\n            Self::Md5 => Box::<Crc32>::default(),\n            Self::Sha1 => Box::<Sha1>::default(),\n            Self::Sha256 => Box::<Sha256>::default(),\n        }\n    }\n\n    /// Return the name of this algorithm in string form\n    pub fn as_str(&self) -> &'static str {\n        match self {\n            Self::Crc32 => CRC_32_NAME,\n            Self::Crc32c => CRC_32_C_NAME,\n            Self::Crc64Nvme => CRC_64_NVME_NAME,\n            #[allow(deprecated)]\n            Self::Md5 => MD5_NAME,\n            Self::Sha1 => SHA_1_NAME,\n            Self::Sha256 => SHA_256_NAME,\n        }\n    }\n}\n\n/// Types implementing this trait can calculate checksums.\n///\n/// Checksum algorithms are used to validate the integrity of data. Structs that implement this trait\n/// can be used as checksum calculators. This trait requires Send + Sync because these checksums are\n/// often used in a threaded context.\npub trait Checksum: Send + Sync {\n    /// Given a slice of bytes, update this checksum's internal state.\n    fn update(&mut self, bytes: &[u8]);\n    /// \"Finalize\" this checksum, returning the calculated value as `Bytes` or an error that\n    /// occurred during checksum calculation.\n    ///\n    /// _HINT: To print this value in a human-readable hexadecimal format, you can use Rust's\n    /// builtin [formatter]._\n    ///\n    /// [formatter]: https://doc.rust-lang.org/std/fmt/trait.UpperHex.html\n    fn finalize(self: Box<Self>) -> Bytes;\n    /// Return the size of this checksum algorithms resulting checksum, in bytes.\n    ///\n    /// For example, the CRC32 checksum algorithm calculates a 32 bit checksum, so a CRC32 checksum\n    /// struct implementing this trait method would return `4`.\n    fn size(&self) -> u64;\n}\n\n#[derive(Debug)]\nstruct Crc32 {\n    hasher: crc_fast::Digest,\n}\n\nimpl Default for Crc32 {\n    fn default() -> Self {\n        Self {\n            hasher: crc_fast::Digest::new(crc_fast::CrcAlgorithm::Crc32IsoHdlc),\n        }\n    }\n}\n\nimpl Crc32 {\n    fn update(&mut self, bytes: &[u8]) {\n        self.hasher.update(bytes);\n    }\n\n    fn finalize(self) -> Bytes {\n        let checksum = self.hasher.finalize() as u32;\n\n        Bytes::copy_from_slice(checksum.to_be_bytes().as_slice())\n    }\n\n    // Size of the checksum in bytes\n    fn size() -> u64 {\n        4\n    }\n}\n\nimpl Checksum for Crc32 {\n    fn update(&mut self, bytes: &[u8]) {\n        Self::update(self, bytes)\n    }\n    fn finalize(self: Box<Self>) -> Bytes {\n        Self::finalize(*self)\n    }\n    fn size(&self) -> u64 {\n        Self::size()\n    }\n}\n\n#[derive(Debug)]\nstruct Crc32c {\n    hasher: crc_fast::Digest,\n}\n\nimpl Default for Crc32c {\n    fn default() -> Self {\n        Self {\n            hasher: crc_fast::Digest::new(crc_fast::CrcAlgorithm::Crc32Iscsi),\n        }\n    }\n}\n\nimpl Crc32c {\n    fn update(&mut self, bytes: &[u8]) {\n        self.hasher.update(bytes);\n    }\n\n    fn finalize(self) -> Bytes {\n        let checksum = self.hasher.finalize() as u32;\n\n        Bytes::copy_from_slice(checksum.to_be_bytes().as_slice())\n    }\n\n    // Size of the checksum in bytes\n    fn size() -> u64 {\n        4\n    }\n}\n\nimpl Checksum for Crc32c {\n    fn update(&mut self, bytes: &[u8]) {\n        Self::update(self, bytes)\n    }\n    fn finalize(self: Box<Self>) -> Bytes {\n        Self::finalize(*self)\n    }\n    fn size(&self) -> u64 {\n        Self::size()\n    }\n}\n\n#[derive(Debug)]\nstruct Crc64Nvme {\n    hasher: crc_fast::Digest,\n}\n\nimpl Default for Crc64Nvme {\n    fn default() -> Self {\n        Self {\n            hasher: crc_fast::Digest::new(crc_fast::CrcAlgorithm::Crc64Nvme),\n        }\n    }\n}\n\nimpl Crc64Nvme {\n    fn update(&mut self, bytes: &[u8]) {\n        self.hasher.update(bytes);\n    }\n\n    fn finalize(self) -> Bytes {\n        Bytes::copy_from_slice(self.hasher.finalize().to_be_bytes().as_slice())\n    }\n\n    // Size of the checksum in bytes\n    fn size() -> u64 {\n        8\n    }\n}\n\nimpl Checksum for Crc64Nvme {\n    fn update(&mut self, bytes: &[u8]) {\n        Self::update(self, bytes)\n    }\n    fn finalize(self: Box<Self>) -> Bytes {\n        Self::finalize(*self)\n    }\n    fn size(&self) -> u64 {\n        Self::size()\n    }\n}\n\n#[derive(Debug, Default)]\nstruct Sha1 {\n    hasher: sha1::Sha1,\n}\n\nimpl Sha1 {\n    fn update(&mut self, bytes: &[u8]) {\n        use sha1::Digest;\n        self.hasher.update(bytes);\n    }\n\n    fn finalize(self) -> Bytes {\n        use sha1::Digest;\n        Bytes::copy_from_slice(self.hasher.finalize().as_ref())\n    }\n\n    // Size of the checksum in bytes\n    fn size() -> u64 {\n        use sha1::Digest;\n        sha1::Sha1::output_size() as u64\n    }\n}\n\nimpl Checksum for Sha1 {\n    fn update(&mut self, bytes: &[u8]) {\n        Self::update(self, bytes)\n    }\n\n    fn finalize(self: Box<Self>) -> Bytes {\n        Self::finalize(*self)\n    }\n    fn size(&self) -> u64 {\n        Self::size()\n    }\n}\n\n#[derive(Debug, Default)]\nstruct Sha256 {\n    hasher: sha2::Sha256,\n}\n\nimpl Sha256 {\n    fn update(&mut self, bytes: &[u8]) {\n        use sha2::Digest;\n        self.hasher.update(bytes);\n    }\n\n    fn finalize(self) -> Bytes {\n        use sha2::Digest;\n        Bytes::copy_from_slice(self.hasher.finalize().as_ref())\n    }\n\n    // Size of the checksum in bytes\n    fn size() -> u64 {\n        use sha2::Digest;\n        sha2::Sha256::output_size() as u64\n    }\n}\n\nimpl Checksum for Sha256 {\n    fn update(&mut self, bytes: &[u8]) {\n        Self::update(self, bytes);\n    }\n    fn finalize(self: Box<Self>) -> Bytes {\n        Self::finalize(*self)\n    }\n    fn size(&self) -> u64 {\n        Self::size()\n    }\n}\n\n#[allow(dead_code)]\n#[derive(Debug, Default)]\nstruct Md5 {\n    hasher: md5::Md5,\n}\n\nimpl Md5 {\n    #[warn(dead_code)]\n    fn update(&mut self, bytes: &[u8]) {\n        use md5::Digest;\n        self.hasher.update(bytes);\n    }\n\n    #[warn(dead_code)]\n    fn finalize(self) -> Bytes {\n        use md5::Digest;\n        Bytes::copy_from_slice(self.hasher.finalize().as_ref())\n    }\n\n    // Size of the checksum in bytes\n    #[warn(dead_code)]\n    fn size() -> u64 {\n        use md5::Digest;\n        md5::Md5::output_size() as u64\n    }\n}\n\nimpl Checksum for Md5 {\n    fn update(&mut self, bytes: &[u8]) {\n        Self::update(self, bytes)\n    }\n    fn finalize(self: Box<Self>) -> Bytes {\n        Self::finalize(*self)\n    }\n    fn size(&self) -> u64 {\n        Self::size()\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::{\n        http::{\n            CRC_32_C_HEADER_NAME, CRC_32_HEADER_NAME, MD5_HEADER_NAME, SHA_1_HEADER_NAME,\n            SHA_256_HEADER_NAME,\n        },\n        Crc32, Crc32c, Md5, Sha1, Sha256,\n    };\n\n    use crate::http::HttpChecksum;\n    use crate::ChecksumAlgorithm;\n\n    use aws_smithy_types::base64;\n    use http_1x::HeaderValue;\n    use pretty_assertions::assert_eq;\n    use std::fmt::Write;\n\n    const TEST_DATA: &str = r#\"test data\"#;\n\n    fn base64_encoded_checksum_to_hex_string(header_value: &HeaderValue) -> String {\n        let decoded_checksum = base64::decode(header_value.to_str().unwrap()).unwrap();\n        let decoded_checksum = decoded_checksum\n            .into_iter()\n            .fold(String::new(), |mut acc, byte| {\n                write!(acc, \"{byte:02X?}\").expect(\"string will always be writeable\");\n                acc\n            });\n\n        format!(\"0x{decoded_checksum}\")\n    }\n\n    #[test]\n    fn test_crc32_checksum() {\n        let mut checksum = Crc32::default();\n        checksum.update(TEST_DATA.as_bytes());\n        let checksum_result = Box::new(checksum).headers();\n        let encoded_checksum = checksum_result.get(CRC_32_HEADER_NAME).unwrap();\n        let decoded_checksum = base64_encoded_checksum_to_hex_string(encoded_checksum);\n\n        let expected_checksum = \"0xD308AEB2\";\n\n        assert_eq!(decoded_checksum, expected_checksum);\n    }\n\n    // TODO(https://github.com/zowens/crc32c/issues/34)\n    // TODO(https://github.com/smithy-lang/smithy-rs/issues/1857)\n    #[cfg(not(any(target_arch = \"powerpc\", target_arch = \"powerpc64\")))]\n    #[test]\n    fn test_crc32c_checksum() {\n        let mut checksum = Crc32c::default();\n        checksum.update(TEST_DATA.as_bytes());\n        let checksum_result = Box::new(checksum).headers();\n        let encoded_checksum = checksum_result.get(CRC_32_C_HEADER_NAME).unwrap();\n        let decoded_checksum = base64_encoded_checksum_to_hex_string(encoded_checksum);\n\n        let expected_checksum = \"0x3379B4CA\";\n\n        assert_eq!(decoded_checksum, expected_checksum);\n    }\n\n    #[test]\n    fn test_crc64nvme_checksum() {\n        use crate::{http::CRC_64_NVME_HEADER_NAME, Crc64Nvme};\n        let mut checksum = Crc64Nvme::default();\n        checksum.update(TEST_DATA.as_bytes());\n        let checksum_result = Box::new(checksum).headers();\n        let encoded_checksum = checksum_result.get(CRC_64_NVME_HEADER_NAME).unwrap();\n        let decoded_checksum = base64_encoded_checksum_to_hex_string(encoded_checksum);\n\n        let expected_checksum = \"0xAECAF3AF9C98A855\";\n\n        assert_eq!(decoded_checksum, expected_checksum);\n    }\n\n    #[test]\n    fn test_sha1_checksum() {\n        let mut checksum = Sha1::default();\n        checksum.update(TEST_DATA.as_bytes());\n        let checksum_result = Box::new(checksum).headers();\n        let encoded_checksum = checksum_result.get(SHA_1_HEADER_NAME).unwrap();\n        let decoded_checksum = base64_encoded_checksum_to_hex_string(encoded_checksum);\n\n        let expected_checksum = \"0xF48DD853820860816C75D54D0F584DC863327A7C\";\n\n        assert_eq!(decoded_checksum, expected_checksum);\n    }\n\n    #[test]\n    fn test_sha256_checksum() {\n        let mut checksum = Sha256::default();\n        checksum.update(TEST_DATA.as_bytes());\n        let checksum_result = Box::new(checksum).headers();\n        let encoded_checksum = checksum_result.get(SHA_256_HEADER_NAME).unwrap();\n        let decoded_checksum = base64_encoded_checksum_to_hex_string(encoded_checksum);\n\n        let expected_checksum =\n            \"0x916F0027A575074CE72A331777C3478D6513F786A591BD892DA1A577BF2335F9\";\n\n        assert_eq!(decoded_checksum, expected_checksum);\n    }\n\n    #[test]\n    fn test_md5_checksum() {\n        let mut checksum = Md5::default();\n        checksum.update(TEST_DATA.as_bytes());\n        let checksum_result = Box::new(checksum).headers();\n        let encoded_checksum = checksum_result.get(MD5_HEADER_NAME).unwrap();\n        let decoded_checksum = base64_encoded_checksum_to_hex_string(encoded_checksum);\n\n        let expected_checksum = \"0xEB733A00C0C9D336E65691A37AB54293\";\n\n        assert_eq!(decoded_checksum, expected_checksum);\n    }\n\n    #[test]\n    fn test_checksum_algorithm_returns_error_for_unknown() {\n        let error = \"some invalid checksum algorithm\"\n            .parse::<ChecksumAlgorithm>()\n            .expect_err(\"it should error\");\n        assert_eq!(\n            \"some invalid checksum algorithm\",\n            error.checksum_algorithm()\n        );\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-compression/Cargo.toml",
    "content": "[package]\nname = \"aws-smithy-compression\"\nversion = \"0.1.6\"\nauthors = [\n  \"AWS Rust SDK Team <aws-sdk-rust@amazon.com>\",\n  \"Zelda Hessler <zhessler@amazon.com>\",\n]\ndescription = \"Request compression for smithy clients.\"\nedition = \"2021\"\nlicense = \"Apache-2.0\"\nrepository = \"https://github.com/smithy-lang/smithy-rs\"\nrust-version = \"1.91.1\"\n\n# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html\n\n[features]\n\n[dependencies]\naws-smithy-types = { path = \"../aws-smithy-types\" }\naws-smithy-runtime-api = { path = \"../aws-smithy-runtime-api\" }\nbytes = \"1.11.1\"\nflate2 = \"1.0.30\"\nfutures-util = \"0.3\"\nhttp-1x = { package = \"http\", version = \"1.3.1\" }\nhttp-body-1x = { package = \"http-body\", version = \"1.0.1\"}\nhttp-body-util = { version = \"0.1.3\" }\npin-project-lite = \"0.2.14\"\ntracing = \"0.1.44\"\n\n[dev-dependencies]\nbytes-utils = \"0.1.2\"\npretty_assertions = \"1.3\"\ntokio = { version = \"1.49.0\", features = [\"macros\", \"rt\"] }\n\n[package.metadata.docs.rs]\nall-features = true\ntargets = [\"x86_64-unknown-linux-gnu\"]\ncargo-args = [\"-Zunstable-options\", \"-Zrustdoc-scrape-examples\"]\nrustdoc-args = [\"--cfg\", \"docsrs\"]\n# End of docs.rs metadata\n"
  },
  {
    "path": "rust-runtime/aws-smithy-compression/LICENSE",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n"
  },
  {
    "path": "rust-runtime/aws-smithy-compression/README.md",
    "content": "# aws-smithy-compression\n\nCompression for HTTP request and response bodies.\n\n<!-- anchor_start:footer -->\nThis crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly.\n<!-- anchor_end:footer -->\n"
  },
  {
    "path": "rust-runtime/aws-smithy-compression/external-types.toml",
    "content": "allowed_external_types = [\n    \"aws_smithy_types::body::SdkBody\",\n    \"aws_smithy_types::config_bag::storable::StoreReplace\",\n    \"aws_smithy_types::config_bag::storable::Storable\",\n    \"aws_smithy_runtime_api::box_error::BoxError\",\n    \"bytes::bytes::Bytes\",\n    \"http::header::map::HeaderMap\",\n    \"http::header::name::HeaderName\",\n    \"http::header::value::HeaderValue\",\n    \"http_body::Body\",\n]\n"
  },
  {
    "path": "rust-runtime/aws-smithy-compression/src/body.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! HTTP body-wrappers that perform request compression\n\n// Putting this in a `mod` since I expect we'll have to handle response\n// decompression some day.\n/// Functionality for compressing an HTTP request body.\npub mod compress {\n    use aws_smithy_types::body::SdkBody;\n    use pin_project_lite::pin_project;\n\n    pin_project! {\n        /// A `Body` that may compress its data with a `CompressRequest` implementor.\n        ///\n        /// Compression options may disable request compression for small data payload, or entirely.\n        /// Additionally, some services may not support compression.\n        pub struct CompressedBody<InnerBody, CompressionImpl> {\n            #[pin]\n            body: InnerBody,\n            compress_request: CompressionImpl,\n            is_end_stream: bool,\n        }\n    }\n\n    impl<CR> CompressedBody<SdkBody, CR> {\n        /// Given an [`SdkBody`] and a `Box<dyn CompressRequest>`, create a new `CompressedBody<SdkBody, CR>`.\n        pub fn new(body: SdkBody, compress_request: CR) -> Self {\n            Self {\n                body,\n                compress_request,\n                is_end_stream: false,\n            }\n        }\n    }\n\n    /// Support for the `http-body-1-0` and `http-1-0` crates.\n    pub mod http_body_1_x {\n        use crate::body::compress::CompressedBody;\n        use crate::http::CompressRequest;\n        use aws_smithy_runtime_api::box_error::BoxError;\n        use aws_smithy_types::body::SdkBody;\n        use http_body_1x::{Body, Frame, SizeHint};\n        use std::pin::Pin;\n        use std::task::{ready, Context, Poll};\n\n        impl Body for CompressedBody<SdkBody, Box<dyn CompressRequest>> {\n            type Data = bytes::Bytes;\n            type Error = aws_smithy_types::body::Error;\n\n            fn poll_frame(\n                mut self: Pin<&mut Self>,\n                cx: &mut Context<'_>,\n            ) -> Poll<Option<Result<Frame<Self::Data>, Self::Error>>> {\n                let this = self.as_mut().project();\n                Poll::Ready(match ready!(this.body.poll_frame(cx)) {\n                    Some(Ok(f)) => {\n                        if f.is_data() {\n                            let d = f.into_data().expect(\"we checked for data first\");\n                            let mut out = Vec::new();\n                            this.compress_request.compress_bytes(&d, &mut out)?;\n                            Some(Ok(Frame::data(out.into())))\n                        } else if f.is_trailers() {\n                            // Trailers don't get compressed.\n                            Some(Ok(f))\n                        } else {\n                            unreachable!(\"Frame is either data or trailers\")\n                        }\n                    }\n                    None => {\n                        *this.is_end_stream = true;\n                        None\n                    }\n                    other => other,\n                })\n            }\n\n            fn is_end_stream(&self) -> bool {\n                self.is_end_stream\n            }\n\n            fn size_hint(&self) -> SizeHint {\n                // We can't return a hint because we don't know exactly how\n                // compression will affect the content length\n                SizeHint::default()\n            }\n        }\n        impl CompressedBody<SdkBody, Box<dyn CompressRequest>> {\n            /// Consumes this `CompressedBody` and returns an [`SdkBody`] containing the compressed data.\n            ///\n            /// This *requires* that the inner `SdkBody` is in-memory (i.e. not streaming). Otherwise, an error is returned.\n            /// If compression fails, an error is returned.\n            pub fn into_compressed_sdk_body(mut self) -> Result<SdkBody, BoxError> {\n                let mut compressed_body = Vec::new();\n                let bytes = self.body.bytes().ok_or_else(|| \"`into_compressed_sdk_body` requires that the inner body is 'in-memory', but it was streaming\".to_string())?;\n\n                self.compress_request\n                    .compress_bytes(bytes, &mut compressed_body)?;\n                Ok(SdkBody::from(compressed_body))\n            }\n        }\n    }\n}\n\n#[cfg(test)]\nmod test {\n    use crate::body::compress::CompressedBody;\n    use crate::{CompressionAlgorithm, CompressionOptions};\n    use aws_smithy_types::body::SdkBody;\n    use bytes::Buf;\n    use bytes_utils::SegmentedBuf;\n    use std::io::Read;\n    const UNCOMPRESSED_INPUT: &[u8] = b\"hello world\";\n    const COMPRESSED_OUTPUT: &[u8] = &[\n        31, 139, 8, 0, 0, 0, 0, 0, 0, 255, 203, 72, 205, 201, 201, 87, 40, 207, 47, 202, 73, 1, 0,\n        133, 17, 74, 13, 11, 0, 0, 0,\n    ];\n\n    use http_body_util::BodyExt;\n\n    #[tokio::test]\n    async fn test_body_is_compressed() {\n        let compression_options = CompressionOptions::default()\n            .with_min_compression_size_bytes(0)\n            .unwrap();\n        let compress_request =\n            CompressionAlgorithm::Gzip.into_impl_http_body_1_x(&compression_options);\n        let body = SdkBody::from(UNCOMPRESSED_INPUT);\n        let mut compressed_body = CompressedBody::new(body, compress_request);\n\n        let mut output = SegmentedBuf::new();\n\n        loop {\n            let data = match compressed_body.frame().await {\n                Some(Ok(frame)) => frame.into_data(),\n                Some(Err(e)) => panic!(\"Error: {}\", e),\n                // No more frames, break out of loop\n                None => break,\n            }\n            .expect(\"frame is OK\");\n            output.push(data);\n        }\n\n        let mut actual_output = Vec::new();\n        output\n            .reader()\n            .read_to_end(&mut actual_output)\n            .expect(\"Doesn't cause IO errors\");\n        // Verify data is compressed as expected\n        assert_eq!(COMPRESSED_OUTPUT, actual_output);\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-compression/src/gzip.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::http::CompressRequest;\nuse crate::{Compress, CompressionOptions};\nuse aws_smithy_runtime_api::box_error::BoxError;\nuse flate2::write::GzEncoder;\nuse std::io::prelude::*;\n\n#[derive(Debug, Default, Clone, PartialEq, Eq)]\npub(crate) struct Gzip {\n    compression: flate2::Compression,\n}\n\nimpl Gzip {\n    fn compress_bytes(&self, bytes: &[u8], writer: impl Write) -> Result<(), BoxError> {\n        let mut encoder = GzEncoder::new(writer, self.compression);\n        encoder.write_all(bytes)?;\n        encoder.try_finish()?;\n\n        Ok(())\n    }\n}\n\nimpl Compress for Gzip {\n    fn compress_bytes(&mut self, bytes: &[u8], writer: &mut dyn Write) -> Result<(), BoxError> {\n        Gzip::compress_bytes(self, bytes, writer)\n    }\n}\n\nimpl CompressRequest for Gzip {\n    fn header_value(&self) -> http_1x::HeaderValue {\n        http_1x::HeaderValue::from_static(\"gzip\")\n    }\n}\n\nimpl From<&CompressionOptions> for Gzip {\n    fn from(options: &CompressionOptions) -> Self {\n        Gzip {\n            compression: flate2::Compression::new(options.level),\n        }\n    }\n}\n\nimpl From<CompressionOptions> for Gzip {\n    fn from(options: CompressionOptions) -> Self {\n        Gzip {\n            compression: flate2::Compression::new(options.level),\n        }\n    }\n}\n\n// Windows line-endings will cause the compression test to fail.\n#[cfg(all(test, not(windows)))]\nmod tests {\n    use super::Gzip;\n    use crate::CompressionOptions;\n    use flate2::read::GzDecoder;\n    use pretty_assertions::assert_eq;\n    use std::io::Read;\n\n    fn gettysburg_address() -> &'static [u8] {\n        include_bytes!(\"../test-data/gettysburg_address.txt\")\n    }\n\n    fn gzip_compressed_gettysburg_address() -> &'static [u8] {\n        // This file was compressed using Apple gzip with the following command:\n        // `gzip -k gettysburg_address.txt -6`\n        include_bytes!(\"../test-data/gettysburg_address.txt.gz\")\n    }\n\n    #[test]\n    fn test_gzip_compression() {\n        let gzip = Gzip::from(&CompressionOptions::default());\n        let mut compressed_output = Vec::new();\n        gzip.compress_bytes(gettysburg_address(), &mut compressed_output)\n            .expect(\"compression succeeds\");\n\n        let uncompressed_expected = {\n            let mut s = String::new();\n            GzDecoder::new(gzip_compressed_gettysburg_address())\n                .read_to_string(&mut s)\n                .unwrap();\n            s\n        };\n        let uncompressed_actual = {\n            let mut s = String::new();\n            GzDecoder::new(&compressed_output[..])\n                .read_to_string(&mut s)\n                .unwrap();\n            s\n        };\n\n        assert_eq!(uncompressed_expected, uncompressed_actual);\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-compression/src/http.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Checksum support for HTTP requests and responses.\n\n/// Support for the `http-body-1-0` and `http-1-0` crates.\nuse crate::Compress;\nuse http_1x::header::{HeaderName, HeaderValue};\n\n/// Implementors of this trait can be used to compress HTTP requests.\npub trait CompressRequest: Compress + CloneCompressRequest {\n    /// Return the header name for the content-encoding header.\n    fn header_name(&self) -> HeaderName {\n        HeaderName::from_static(\"content-encoding\")\n    }\n\n    /// Return the header value for the content-encoding header.\n    fn header_value(&self) -> HeaderValue;\n}\n\n/// Enables CompressRequest implementors to be cloned.\npub trait CloneCompressRequest {\n    /// Clone this request compressor.\n    fn clone_request_compressor(&self) -> Box<dyn CompressRequest>;\n}\n\nimpl<T> CloneCompressRequest for T\nwhere\n    T: CompressRequest + Clone + 'static,\n{\n    fn clone_request_compressor(&self) -> Box<dyn CompressRequest> {\n        Box::new(self.clone())\n    }\n}\n\nimpl Clone for Box<dyn CompressRequest> {\n    fn clone(&self) -> Self {\n        self.clone_request_compressor()\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-compression/src/lib.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/* Automatically managed default lints */\n#![cfg_attr(docsrs, feature(doc_cfg))]\n/* End of automatically managed default lints */\n#![allow(clippy::derive_partial_eq_without_eq)]\n#![warn(\n    missing_docs,\n    rustdoc::missing_crate_level_docs,\n    unreachable_pub,\n    rust_2018_idioms\n)]\n\n//! Compression-related code.\n\nuse aws_smithy_runtime_api::box_error::BoxError;\nuse aws_smithy_types::config_bag::{Storable, StoreReplace};\nuse std::io::Write;\nuse std::str::FromStr;\n\npub mod body;\nmod gzip;\npub mod http;\n\n// Valid compression algorithm names\n/// The name of the `gzip` algorithm.\npub const GZIP_NAME: &str = \"gzip\";\n\n/// The maximum-allowable value per internal standards is 10 Megabytes.\nconst MAX_MIN_COMPRESSION_SIZE_BYTES: u32 = 10_485_760;\n\n/// Types implementing this trait can compress data.\n///\n/// Compression algorithms are used reduce the size of data. This trait\n/// requires Send + Sync because trait implementors are often used in an\n/// async context.\npub trait Compress: Send + Sync {\n    /// Given a slice of bytes, and a [Write] implementor, compress and write\n    /// bytes to the writer until done.\n    // I wanted to use `impl Write` but that's not object-safe\n    fn compress_bytes(&mut self, bytes: &[u8], writer: &mut dyn Write) -> Result<(), BoxError>;\n}\n\n/// Options for configuring request compression.\n#[derive(Debug, Clone, PartialEq, Eq)]\n#[non_exhaustive]\npub struct CompressionOptions {\n    /// Valid values are 0-9 with lower values configuring less (but faster) compression\n    level: u32,\n    min_compression_size_bytes: u32,\n    enabled: bool,\n}\n\nimpl Default for CompressionOptions {\n    fn default() -> Self {\n        Self {\n            level: 6,\n            min_compression_size_bytes: 10240,\n            enabled: true,\n        }\n    }\n}\n\nimpl CompressionOptions {\n    /// The compression level to use.\n    pub fn level(&self) -> u32 {\n        self.level\n    }\n\n    /// The minimum size of data to compress.\n    ///\n    /// Data smaller than this will not be compressed.\n    pub fn min_compression_size_bytes(&self) -> u32 {\n        self.min_compression_size_bytes\n    }\n\n    /// Whether compression is enabled.\n    pub fn is_enabled(&self) -> bool {\n        self.enabled\n    }\n\n    /// Set whether compression is enabled.\n    pub fn with_enabled(self, enabled: bool) -> Self {\n        Self { enabled, ..self }\n    }\n\n    /// Set the compression level.\n    ///\n    /// Valid values are `0..=9` with lower values configuring less _(but faster)_ compression\n    pub fn with_level(self, level: u32) -> Result<Self, BoxError> {\n        Self::validate_level(level)?;\n        Ok(Self { level, ..self })\n    }\n\n    /// Set the minimum size of data to compress.\n    ///\n    /// Data smaller than this will not be compressed.\n    /// Valid values are `0..=10_485_760`. The default is `10_240`.\n    pub fn with_min_compression_size_bytes(\n        self,\n        min_compression_size_bytes: u32,\n    ) -> Result<Self, BoxError> {\n        Self::validate_min_compression_size_bytes(min_compression_size_bytes)?;\n        Ok(Self {\n            min_compression_size_bytes,\n            ..self\n        })\n    }\n\n    fn validate_level(level: u32) -> Result<(), BoxError> {\n        if level > 9 {\n            return Err(\n                format!(\"compression level `{level}` is invalid, valid values are 0..=9\").into(),\n            );\n        };\n        Ok(())\n    }\n\n    fn validate_min_compression_size_bytes(\n        min_compression_size_bytes: u32,\n    ) -> Result<(), BoxError> {\n        if min_compression_size_bytes > MAX_MIN_COMPRESSION_SIZE_BYTES {\n            return Err(format!(\n                \"min compression size `{min_compression_size_bytes}` is invalid, valid values are 0..=10_485_760\"\n            )\n            .into());\n        };\n        Ok(())\n    }\n}\n\nimpl Storable for CompressionOptions {\n    type Storer = StoreReplace<Self>;\n}\n\n/// An enum encompassing all supported compression algorithms.\n#[derive(Debug, Copy, Clone, PartialEq, Eq)]\n#[non_exhaustive]\npub enum CompressionAlgorithm {\n    /// The [gzip](https://en.wikipedia.org/wiki/Gzip) compression algorithm\n    Gzip,\n}\n\nimpl FromStr for CompressionAlgorithm {\n    type Err = BoxError;\n\n    /// Create a new `CompressionAlgorithm` from an algorithm name.\n    ///\n    /// Valid algorithm names are:\n    /// - \"gzip\"\n    ///\n    /// Passing an invalid name will return an error.\n    fn from_str(compression_algorithm: &str) -> Result<Self, Self::Err> {\n        if compression_algorithm.eq_ignore_ascii_case(GZIP_NAME) {\n            Ok(Self::Gzip)\n        } else {\n            Err(format!(\"unknown compression algorithm `{compression_algorithm}`\").into())\n        }\n    }\n}\n\nimpl CompressionAlgorithm {\n    /// Return the `HttpChecksum` implementor for this algorithm.\n    pub fn into_impl_http_body_1_x(\n        self,\n        options: &CompressionOptions,\n    ) -> Box<dyn http::CompressRequest> {\n        match self {\n            Self::Gzip => Box::new(gzip::Gzip::from(options)),\n        }\n    }\n\n    /// Return the name of this algorithm in string form\n    pub fn as_str(&self) -> &'static str {\n        match self {\n            Self::Gzip { .. } => GZIP_NAME,\n        }\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use crate::CompressionAlgorithm;\n    use pretty_assertions::assert_eq;\n\n    #[test]\n    fn test_compression_algorithm_from_str_unknown() {\n        let error = \"some unknown compression algorithm\"\n            .parse::<CompressionAlgorithm>()\n            .expect_err(\"it should error\");\n        assert_eq!(\n            \"unknown compression algorithm `some unknown compression algorithm`\",\n            error.to_string()\n        );\n    }\n\n    #[test]\n    fn test_compression_algorithm_from_str_gzip() {\n        let algo = \"gzip\".parse::<CompressionAlgorithm>().unwrap();\n        assert_eq!(\"gzip\", algo.as_str());\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-compression/test-data/gettysburg_address.txt",
    "content": "Four score and seven years ago our fathers brought forth on this continent, a new nation, conceived in Liberty, and dedicated to the proposition that all men are created equal.\n\nNow we are engaged in a great civil war, testing whether that nation, or any nation so conceived and so dedicated, can long endure. We are met on a great battle-field of that war. We have come to dedicate a portion of that field, as a final resting place for those who here gave their lives that that nation might live. It is altogether fitting and proper that we should do this.\n\nBut, in a larger sense, we can not dedicate—we can not consecrate—we can not hallow—this ground. The brave men, living and dead, who struggled here, have consecrated it, far above our poor power to add or detract. The world will little note, nor long remember what we say here, but it can never forget what they did here. It is for us the living, rather, to be dedicated here to the unfinished work which they who fought here have thus far so nobly advanced. It is rather for us to be here dedicated to the great task remaining before us—that from these honored dead we take increased devotion to that cause for which they gave the last full measure of devotion—that we here highly resolve that these dead shall not have died in vain—that this nation, under God, shall have a new birth of freedom—and that government of the people, by the people, for the people, shall not perish from the earth.\n"
  },
  {
    "path": "rust-runtime/aws-smithy-dns/Cargo.toml",
    "content": "[package]\nname = \"aws-smithy-dns\"\nversion = \"0.1.12\"\nauthors = [\n    \"AWS Rust SDK Team <aws-sdk-rust@amazon.com>\",\n]\ndescription = \"DNS resolvers for smithy-rs\"\nedition = \"2021\"\nlicense = \"Apache-2.0\"\nrepository = \"https://github.com/awslabs/smithy-rs\"\nrust-version = \"1.91.1\"\n\n\n[features]\nhickory-dns = [\"dep:hickory-resolver\", \"dep:tokio\", \"tokio/rt\"]\n\n\n[dependencies]\naws-smithy-runtime-api = { path = \"../aws-smithy-runtime-api\", features = [\"client\"]}\ntokio = { version = \"1.49.0\", features = [], optional = true}\n\n\n# hickory-resolver enables some tokio features that break in wasm\n[target.'cfg(not(target_family = \"wasm\"))'.dependencies]\nhickory-resolver = {version = \"0.25.2\", optional = true}\n\n\n[dev-dependencies]\ncriterion = \"0.5.1\"\n\n\n\n[package.metadata.docs.rs]\nall-features = true\ntargets = [\"x86_64-unknown-linux-gnu\"]\ncargo-args = [\"-Zunstable-options\", \"-Zrustdoc-scrape-examples\"]\nrustdoc-args = [\"--cfg\", \"docsrs\"]\n# End of docs.rs metadata\n"
  },
  {
    "path": "rust-runtime/aws-smithy-dns/LICENSE",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n"
  },
  {
    "path": "rust-runtime/aws-smithy-dns/README.md",
    "content": "# aws-smithy-dns\n\nBuilt-in DNS resolver implementations for smithy-rs clients.\n\n<!-- anchor_start:footer -->\nThis crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly.\n<!-- anchor_end:footer -->\n"
  },
  {
    "path": "rust-runtime/aws-smithy-dns/src/hickory.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::{io::Error as IoError, net::IpAddr, time::Duration};\n\nuse aws_smithy_runtime_api::client::dns::{DnsFuture, ResolveDns, ResolveDnsError};\nuse hickory_resolver::{\n    config::{NameServerConfigGroup, ResolverConfig},\n    name_server::TokioConnectionProvider,\n    Resolver,\n};\n\n/// DNS resolver that uses [hickory_resolver] and caches DNS entries in memory.\n///\n/// This resolver requires a [tokio] runtime to function and isn't available for WASM targets.\n#[non_exhaustive]\n#[derive(Debug, Clone)]\npub struct HickoryDnsResolver {\n    resolver: Resolver<TokioConnectionProvider>,\n}\n\nimpl Default for HickoryDnsResolver {\n    /// Constructs a new Tokio based [ResolveDns] with the system configuration.\n    /// This uses `/etc/resolv.conf` on Unix OSes and registry settings on Windows.\n    fn default() -> Self {\n        Self {\n            resolver: Resolver::builder_tokio().expect(\"In tokio runtime\").build(),\n        }\n    }\n}\n\nimpl HickoryDnsResolver {\n    /// Creates a new DNS resolver that caches IP addresses in memory.\n    pub fn builder() -> HickoryDnsResolverBuilder {\n        HickoryDnsResolverBuilder {\n            nameservers: None,\n            timeout: None,\n            attempts: None,\n            cache_size: None,\n            num_concurrent_reqs: None,\n        }\n    }\n\n    /// Flush the cache\n    pub fn clear_cache(&self) {\n        self.resolver.clear_cache();\n    }\n}\n\nimpl ResolveDns for HickoryDnsResolver {\n    fn resolve_dns<'a>(&'a self, name: &'a str) -> DnsFuture<'a> {\n        DnsFuture::new(async move {\n            let result = self.resolver.lookup_ip(name).await;\n\n            match result {\n                Ok(ips) => Ok(ips.into_iter().collect()),\n                Err(failure) => Err(ResolveDnsError::new(IoError::other(failure))),\n            }\n        })\n    }\n}\n\n/// Builder for [HickoryDnsResolver]\npub struct HickoryDnsResolverBuilder {\n    nameservers: Option<Nameservers>,\n    timeout: Option<Duration>,\n    attempts: Option<usize>,\n    cache_size: Option<usize>,\n    num_concurrent_reqs: Option<usize>,\n}\n\nstruct Nameservers {\n    ips: Vec<IpAddr>,\n    port: u16,\n}\n\nimpl HickoryDnsResolverBuilder {\n    /// Configure upstream nameservers and the port to use for resolution. Defaults to the system\n    /// configuration.\n    pub fn nameservers(mut self, ips: &[IpAddr], port: u16) -> Self {\n        self.nameservers = Some(Nameservers {\n            ips: ips.to_vec(),\n            port,\n        });\n        self\n    }\n\n    /// Specify the timeout for a request. Defaults to 5 seconds.\n    pub fn timeout(mut self, timeout: Duration) -> Self {\n        self.timeout = Some(timeout);\n        self\n    }\n\n    /// Number of retries after lookup failure before giving up. Defaults to 2.\n    pub fn attempts(mut self, attempts: usize) -> Self {\n        self.attempts = Some(attempts);\n        self\n    }\n\n    /// Cache size is in number of records (some records can be large). Defaults to 32.\n    pub fn cache_size(mut self, cache_size: usize) -> Self {\n        self.cache_size = Some(cache_size);\n        self\n    }\n\n    /// Number of concurrent requests per query.\n    ///\n    /// Where more than one nameserver is configured, this configures the resolver\n    /// to send queries to a number of servers in parallel. Defaults to 2. Setting\n    /// to 0 or 1 will execute requests serially.\n    pub fn num_concurrent_reqs(mut self, num_concurrent_reqs: usize) -> Self {\n        self.num_concurrent_reqs = Some(num_concurrent_reqs);\n        self\n    }\n\n    /// Build a [HickoryDnsResolver]\n    pub fn build(self) -> HickoryDnsResolver {\n        let mut builder = if let Some(nameservers) = self.nameservers {\n            let nameserver_config =\n                NameServerConfigGroup::from_ips_clear(&nameservers.ips, nameservers.port, true);\n            let resolver_config = ResolverConfig::from_parts(None, vec![], nameserver_config);\n\n            Resolver::builder_with_config(resolver_config, TokioConnectionProvider::default())\n        } else {\n            Resolver::builder_tokio().expect(\"Successfully read system config\")\n        };\n\n        let opts = builder.options_mut();\n\n        if let Some(timeout) = self.timeout {\n            opts.timeout = timeout;\n        }\n\n        if let Some(attempts) = self.attempts {\n            opts.attempts = attempts;\n        }\n\n        if let Some(cache_size) = self.cache_size {\n            opts.cache_size = cache_size;\n        }\n\n        if let Some(num_concurrent_reqs) = self.num_concurrent_reqs {\n            opts.num_concurrent_reqs = num_concurrent_reqs;\n        }\n\n        HickoryDnsResolver {\n            resolver: builder.build(),\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-dns/src/lib.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/* Automatically managed default lints */\n#![cfg_attr(docsrs, feature(doc_cfg))]\n/* End of automatically managed default lints */\n\n//! Built-in DNS resolver implementations for smithy-rs clients.\n\n#[cfg(all(feature = \"hickory-dns\", not(target_family = \"wasm\")))]\npub mod hickory;\n\n#[cfg(all(feature = \"hickory-dns\", not(target_family = \"wasm\")))]\npub use hickory::HickoryDnsResolver;\n"
  },
  {
    "path": "rust-runtime/aws-smithy-dns/tests/hickory.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n#![cfg(all(feature = \"hickory-dns\", not(target_family = \"wasm\")))]\n\nuse aws_smithy_dns::HickoryDnsResolver;\nuse aws_smithy_runtime_api::client::dns::ResolveDns;\nuse std::{\n    net::{IpAddr, Ipv4Addr},\n    time::Duration,\n};\nuse tokio::test;\n\n#[test]\nasync fn test_dns_caching() {\n    let dns_server = test_dns_server::setup_dns_server().await;\n    let (dns_ip, dns_port) = dns_server.addr();\n\n    let resolver = HickoryDnsResolver::builder()\n        .nameservers(&[dns_ip], dns_port)\n        .cache_size(1)\n        .build();\n\n    let hostname = \"example.com\";\n\n    // First resolution should hit the server\n    let first_result = resolver.resolve_dns(hostname).await;\n    let first_ips = first_result.unwrap();\n\n    // Verify correct IP returned and server hit to get it\n    assert_eq!(vec![IpAddr::V4(Ipv4Addr::new(1, 2, 3, 4))], first_ips);\n    assert!(dns_server.query_count() == 1);\n\n    // Second resolution should hit the cache\n    let second_result = resolver.resolve_dns(hostname).await;\n    let second_ips = second_result.unwrap();\n\n    // Verify second resolution hit cache, not server\n    assert!(dns_server.query_count() == 1);\n\n    // Verify same IPs returned\n    assert_eq!(first_ips, second_ips);\n}\n\n#[test]\nasync fn test_dns_cache_size_limit() {\n    let dns_server = test_dns_server::setup_dns_server().await;\n    let (dns_ip, dns_port) = dns_server.addr();\n\n    let resolver = HickoryDnsResolver::builder()\n        .nameservers(&[dns_ip], dns_port)\n        .cache_size(1)\n        .build();\n\n    // First resolution should hit the server\n    let _first_result = resolver.resolve_dns(\"example.com\").await;\n\n    // Verify server hit\n    assert!(dns_server.query_count() == 1);\n\n    // Second resolution should hit the server\n    let _second_result = resolver.resolve_dns(\"aws.com\").await;\n\n    // Verify server hit\n    assert!(dns_server.query_count() == 2);\n\n    // Third resolution should hit the server\n    let _third_result = resolver.resolve_dns(\"foo.com\").await;\n\n    // Verify server hit\n    assert!(dns_server.query_count() == 3);\n\n    // Third result should now be in cache\n    let _third_result = resolver.resolve_dns(\"foo.com\").await;\n\n    // Verify server not hit in favor of the cache\n    assert!(dns_server.query_count() == 3);\n\n    // First result should have been removed from the cache, so querying it again should hit server\n    let _first_result_again = resolver.resolve_dns(\"example.com\").await;\n\n    // Verify server hit\n    assert!(dns_server.query_count() == 4);\n}\n\n#[test]\nasync fn test_dns_error_handling() {\n    let dns_server = test_dns_server::setup_dns_server().await;\n    let (dns_ip, dns_port) = dns_server.addr();\n\n    let resolver = HickoryDnsResolver::builder()\n        .nameservers(&[dns_ip], dns_port)\n        .timeout(Duration::from_millis(100))\n        .attempts(1)\n        .build();\n\n    // Try to resolve an invalid hostname\n    let result = resolver\n        .resolve_dns(\"invalid.nonexistent.domain.test\")\n        .await;\n    assert!(result.is_err());\n}\n\n// Kind of janky minimal test utility for creating a local DNS server\n#[cfg(test)]\nmod test_dns_server {\n    use std::{\n        collections::HashMap,\n        net::{IpAddr, Ipv4Addr, SocketAddr},\n        sync::{atomic::AtomicUsize, Arc},\n        time::Duration,\n    };\n    use tokio::{net::UdpSocket, sync::Notify, task::JoinHandle};\n\n    pub async fn setup_dns_server() -> TestDnsServer {\n        let mut records = HashMap::new();\n        records.insert(\n            \"example.com\".to_string(),\n            IpAddr::V4(Ipv4Addr::new(1, 2, 3, 4)),\n        );\n        records.insert(\"aws.com\".to_string(), IpAddr::V4(Ipv4Addr::new(5, 6, 7, 8)));\n        records.insert(\n            \"foo.com\".to_string(),\n            IpAddr::V4(Ipv4Addr::new(9, 10, 11, 12)),\n        );\n\n        TestDnsServer::start(records).await.unwrap()\n    }\n\n    pub struct TestDnsServer {\n        handle: JoinHandle<()>,\n        addr: SocketAddr,\n        shutdown: Arc<Notify>,\n        query_count: Arc<AtomicUsize>,\n    }\n\n    impl TestDnsServer {\n        pub async fn start(\n            records: HashMap<String, IpAddr>,\n        ) -> Result<Self, Box<dyn std::error::Error + Send + Sync>> {\n            // localhost, random port\n            let socket = UdpSocket::bind(\"127.0.0.1:0\").await?;\n            let addr = socket.local_addr()?;\n\n            let shutdown = Arc::new(Notify::new());\n            let shutdown_clone = shutdown.clone();\n            let query_count = Arc::new(AtomicUsize::new(0));\n            let query_count_clone = query_count.clone();\n\n            let handle = tokio::spawn(async move {\n                let mut buf = [0; 512];\n                loop {\n                    tokio::select! {\n                        _ = shutdown_clone.notified() => break,\n                        result = socket.recv_from(&mut buf) => {\n                            if let Ok((len, src)) = result {\n                                query_count_clone.fetch_add(1, std::sync::atomic::Ordering::Relaxed);\n                                // Short sleep before returning DNS response to simulate network latency\n                                tokio::time::sleep(Duration::from_millis(1000)).await;\n                                let response = create_dns_response(&buf[..len], &records);\n                                let _ = socket.send_to(&response, src).await;\n                            }\n                        }\n                    }\n                }\n            });\n\n            Ok(TestDnsServer {\n                handle,\n                addr,\n                shutdown,\n                query_count,\n            })\n        }\n\n        pub fn addr(&self) -> (IpAddr, u16) {\n            (self.addr.ip(), self.addr.port())\n        }\n\n        pub fn query_count(&self) -> usize {\n            self.query_count.load(std::sync::atomic::Ordering::Relaxed)\n        }\n    }\n\n    impl Drop for TestDnsServer {\n        fn drop(&mut self) {\n            self.shutdown.notify_one();\n            self.handle.abort();\n        }\n    }\n\n    fn create_dns_response(query: &[u8], records: &HashMap<String, IpAddr>) -> Vec<u8> {\n        let parsed = DnsQuery::parse(query).unwrap_or_default();\n        let ip = records.get(&parsed.domain).copied().unwrap();\n\n        let response = DnsResponse {\n            id: parsed.id,\n            flags: 0x8180, // Standard response flags\n            question: parsed.domain,\n            answer_ip: ip,\n            ttl: 300,\n        };\n\n        response.to_bytes()\n    }\n\n    #[derive(Debug, Default)]\n    #[allow(dead_code)]\n    struct DnsQuery {\n        id: u16,\n        flags: u16,\n        question_count: u16,\n        domain: String,\n        query_type: u16,\n        query_class: u16,\n    }\n\n    impl DnsQuery {\n        fn parse(data: &[u8]) -> Option<Self> {\n            if data.len() < 12 {\n                return None;\n            }\n\n            let id = u16::from_be_bytes([data[0], data[1]]);\n            let flags = u16::from_be_bytes([data[2], data[3]]);\n            let question_count = u16::from_be_bytes([data[4], data[5]]);\n\n            if question_count == 0 {\n                return None;\n            }\n\n            // Parse domain name starting at byte 12\n            let mut pos = 12;\n            let mut domain = String::new();\n\n            while pos < data.len() {\n                let len = data[pos] as usize;\n                if len == 0 {\n                    pos += 1;\n                    break;\n                }\n\n                if !domain.is_empty() {\n                    domain.push('.');\n                }\n\n                pos += 1;\n                if pos + len > data.len() {\n                    return None;\n                }\n\n                if let Ok(label) = std::str::from_utf8(&data[pos..pos + len]) {\n                    domain.push_str(label);\n                }\n                pos += len;\n            }\n\n            if pos + 4 > data.len() {\n                return None;\n            }\n\n            let query_type = u16::from_be_bytes([data[pos], data[pos + 1]]);\n            let query_class = u16::from_be_bytes([data[pos + 2], data[pos + 3]]);\n\n            Some(DnsQuery {\n                id,\n                flags,\n                question_count,\n                domain,\n                query_type,\n                query_class,\n            })\n        }\n    }\n\n    #[derive(Debug)]\n    #[allow(dead_code)]\n    struct DnsResponse {\n        id: u16,\n        flags: u16,\n        question: String,\n        answer_ip: IpAddr,\n        ttl: u32,\n    }\n\n    impl DnsResponse {\n        fn to_bytes(&self) -> Vec<u8> {\n            // 30ish required bytes, 11 more added for the question section\n            // since the longest domain we currently use is 11 bytes long\n            let mut response = Vec::with_capacity(41);\n\n            // Header (12 bytes) all values besides id/flags hardcoded\n            response.extend_from_slice(&self.id.to_be_bytes());\n            response.extend_from_slice(&self.flags.to_be_bytes());\n            response.extend_from_slice(&1u16.to_be_bytes()); // Questions: 1\n            response.extend_from_slice(&1u16.to_be_bytes()); // Answers: 1\n            response.extend_from_slice(&0u16.to_be_bytes()); // Authority: 0\n            response.extend_from_slice(&0u16.to_be_bytes()); // Additional: 0\n\n            // Question section\n            // In a more ideal world the DnsResponse would contain a ref to the\n            // DnsQuery that triggered this response and recreate the question section\n            // from that\n            for label in self.question.split('.') {\n                response.push(label.len() as u8);\n                response.extend_from_slice(label.as_bytes());\n            }\n            response.push(0); // End of name\n            response.extend_from_slice(&1u16.to_be_bytes()); // Type A\n            response.extend_from_slice(&1u16.to_be_bytes()); // Class IN\n\n            // Answer section\n            response.extend_from_slice(&[0xc0, 0x0c]); // Name pointer\n            response.extend_from_slice(&1u16.to_be_bytes()); // Type A\n            response.extend_from_slice(&1u16.to_be_bytes()); // Class IN\n            response.extend_from_slice(&self.ttl.to_be_bytes()); // TTL\n\n            match self.answer_ip {\n                IpAddr::V4(ipv4) => {\n                    response.extend_from_slice(&4u16.to_be_bytes()); // Data length\n                    response.extend_from_slice(&ipv4.octets());\n                }\n                IpAddr::V6(_) => {\n                    // Unsupported, fallback to IPv4\n                    response.extend_from_slice(&4u16.to_be_bytes());\n                    response.extend_from_slice(&[127, 0, 0, 1]);\n                }\n            }\n\n            response\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-eventstream/Cargo.toml",
    "content": "[package]\nname = \"aws-smithy-eventstream\"\n# <IMPORTANT> Only patch releases can be made to this runtime crate until https://github.com/smithy-lang/smithy-rs/issues/3370 is resolved\nversion = \"0.60.20\"\n# </IMPORTANT>\nauthors = [\"AWS Rust SDK Team <aws-sdk-rust@amazon.com>\", \"John DiSanti <jdisanti@amazon.com>\"]\ndescription = \"Event stream logic for smithy-rs.\"\nedition = \"2021\"\nlicense = \"Apache-2.0\"\nrepository = \"https://github.com/smithy-lang/smithy-rs\"\nrust-version = \"1.91.1\"\n\n[features]\nderive-arbitrary = [\"dep:arbitrary\", \"dep:derive_arbitrary\", \"arbitrary?/derive\"]\ntest-util = []\n__bench-jemalloc = []\n__bench-mimalloc = []\n\n[dependencies]\narbitrary = { version = \"1.3\", optional = true }\naws-smithy-types = { path = \"../aws-smithy-types\", features = [\"http-body-1-x\"] }\nbytes = \"1.11.1\"\ncrc32fast = \"1.3\"\nderive_arbitrary = { version = \"1.3\", optional = true }\n\n[dev-dependencies]\nbytes-utils = \"0.1\"\ncriterion = { version = \"0.5\", features = [\"html_reports\"] }\nmimalloc = { version = \"0.1.43\" }\n\n# jemalloc doesn't work on windows, this breaks windows CI\n[target.'cfg(not(target_os = \"windows\"))'.dev-dependencies]\njemallocator = { version = \"0.5\" }\n\n[[bench]]\nname = \"write_message_performance\"\nharness = false\n\n[package.metadata.docs.rs]\nall-features = true\ntargets = [\"x86_64-unknown-linux-gnu\"]\ncargo-args = [\"-Zunstable-options\", \"-Zrustdoc-scrape-examples\"]\nrustdoc-args = [\"--cfg\", \"docsrs\"]\n# End of docs.rs metadata\n"
  },
  {
    "path": "rust-runtime/aws-smithy-eventstream/LICENSE",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n"
  },
  {
    "path": "rust-runtime/aws-smithy-eventstream/README.md",
    "content": "# aws-smithy-eventstream\n\nAWS Event Stream frame serialization/deserialization implementation.\n\n<!-- anchor_start:footer -->\nThis crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly.\n<!-- anchor_end:footer -->\n"
  },
  {
    "path": "rust-runtime/aws-smithy-eventstream/additional-ci",
    "content": "#!/bin/bash\n#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\n\n# This script contains additional CI checks to run for this specific package\n\nset -e\n\necho \"### Checking for duplicate dependency versions in the normal dependency graph with all features enabled\"\ncargo tree -d --edges normal --all-features\n\necho \"### Testing every combination of features (excluding --all-features)\"\ncargo hack test --feature-powerset --exclude-all-features\n"
  },
  {
    "path": "rust-runtime/aws-smithy-eventstream/benches/write_message_performance.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_smithy_eventstream::frame::write_message_to;\nuse aws_smithy_eventstream::message_size_hint::MessageSizeHint;\nuse aws_smithy_types::event_stream::{Header, HeaderValue, Message};\nuse bytes::{BufMut, Bytes};\nuse crc32fast::Hasher;\nuse criterion::{black_box, criterion_group, criterion_main, Criterion};\nuse std::mem::size_of;\n\n/// Configuration for buffer allocation strategies in benchmarks\n#[derive(Debug, Clone)]\npub enum BufferConfig {\n    /// Start with an empty buffer (Vec::new() - zero capacity)\n    Empty,\n    /// Pre-allocate buffer with exact message size\n    ExactSize(usize),\n    /// Pre-allocate buffer smaller than message size (factor < 1.0)\n    Undersized(f32),\n    /// Pre-allocate buffer larger than message size (factor > 1.0)\n    Oversized(f32),\n}\n\nimpl BufferConfig {\n    /// Get a description of the buffer configuration for benchmark naming\n    pub fn description(&self) -> &'static str {\n        match self {\n            BufferConfig::Empty => \"empty\",\n            BufferConfig::ExactSize(_) => \"exact\",\n            BufferConfig::Undersized(_) => \"undersized\",\n            BufferConfig::Oversized(_) => \"oversized\",\n        }\n    }\n}\n\n/// Get the actual serialized size of a message by running serialization once\npub fn get_message_size(message: &Message) -> usize {\n    let mut buffer = Vec::new();\n    write_message_to(message, &mut buffer).expect(\"Failed to serialize message\");\n    buffer.len()\n}\n\n/// Create a buffer based on the configuration and actual message size\npub fn create_buffer(config: &BufferConfig, message_size: usize) -> Vec<u8> {\n    match config {\n        BufferConfig::Empty => Vec::new(),\n        BufferConfig::ExactSize(_) => Vec::with_capacity(message_size),\n        BufferConfig::Undersized(factor) => {\n            let capacity = ((message_size as f32) * factor) as usize;\n            Vec::with_capacity(capacity.max(1)) // Ensure at least 1 byte capacity\n        }\n        BufferConfig::Oversized(factor) => {\n            let capacity = ((message_size as f32) * factor) as usize;\n            Vec::with_capacity(capacity)\n        }\n    }\n}\n\n// Global allocator configuration for different allocators\n#[cfg(all(feature = \"__bench-jemalloc\", not(feature = \"__bench-mimalloc\")))]\n#[global_allocator]\nstatic GLOBAL: jemallocator::Jemalloc = jemallocator::Jemalloc;\n\n#[cfg(all(feature = \"__bench-mimalloc\", not(feature = \"__bench-jemalloc\")))]\n#[global_allocator]\nstatic GLOBAL: mimalloc::MiMalloc = mimalloc::MiMalloc;\n\n// Constants from the frame module\nconst PRELUDE_LENGTH_BYTES: u32 = 3 * size_of::<u32>() as u32;\nconst MESSAGE_CRC_LENGTH_BYTES: u32 = size_of::<u32>() as u32;\nconst MAX_HEADER_NAME_LEN: usize = 255;\n\nconst TYPE_TRUE: u8 = 0;\nconst TYPE_FALSE: u8 = 1;\nconst TYPE_BYTE: u8 = 2;\nconst TYPE_INT16: u8 = 3;\nconst TYPE_INT32: u8 = 4;\nconst TYPE_INT64: u8 = 5;\nconst TYPE_BYTE_ARRAY: u8 = 6;\nconst TYPE_STRING: u8 = 7;\nconst TYPE_TIMESTAMP: u8 = 8;\nconst TYPE_UUID: u8 = 9;\n\n/// Optimized version of write_message to remove inline buffer. Stashing this here—this implemenetation\n/// is about 10% faster but needs more testing.\npub fn write_message_to_optimized_v1(\n    message: &Message,\n    buffer: &mut Vec<u8>,\n) -> Result<(), Box<dyn std::error::Error>> {\n    // Pre-calculate header size without allocating\n    let mut headers_len = 0u32;\n    for header in message.headers() {\n        headers_len += calculate_header_size(header)?;\n    }\n\n    let payload_len = message.payload().len() as u32;\n    let message_len = PRELUDE_LENGTH_BYTES + headers_len + payload_len + MESSAGE_CRC_LENGTH_BYTES;\n\n    // Reserve space upfront\n    buffer.reserve(message_len as usize);\n\n    // Write prelude with CRC\n    let mut crc = Hasher::new();\n\n    // Write message length\n    buffer.put_u32(message_len);\n    crc.update(&message_len.to_be_bytes());\n\n    // Write headers length\n    buffer.put_u32(headers_len);\n    crc.update(&headers_len.to_be_bytes());\n\n    // Write prelude CRC and include it in the ongoing CRC calculation\n    let prelude_crc = crc.clone().finalize();\n    buffer.put_u32(prelude_crc);\n    crc.update(&prelude_crc.to_be_bytes());\n\n    // Write headers directly to buffer\n    for header in message.headers() {\n        write_header_to_optimized(header, buffer, &mut crc)?;\n    }\n\n    // Write payload\n    buffer.put_slice(message.payload());\n    crc.update(message.payload());\n\n    // Write message CRC\n    buffer.put_u32(crc.finalize());\n\n    Ok(())\n}\n\n/// Calculate the size a header will take when serialized\nfn calculate_header_size(header: &Header) -> Result<u32, Box<dyn std::error::Error>> {\n    let name_len = header.name().as_bytes().len();\n    if name_len > MAX_HEADER_NAME_LEN {\n        return Err(\"Header name too long\".into());\n    }\n\n    let mut size = 1 + name_len; // name length byte + name bytes\n\n    use HeaderValue::*;\n    match header.value() {\n        Bool(_) => size += 1,                            // type byte only\n        Byte(_) => size += 2,                            // type + value\n        Int16(_) => size += 3,                           // type + value\n        Int32(_) => size += 5,                           // type + value\n        Int64(_) => size += 9,                           // type + value\n        ByteArray(val) => size += 3 + val.len(),         // type + length + data\n        String(val) => size += 3 + val.as_bytes().len(), // type + length + data\n        Timestamp(_) => size += 9,                       // type + value\n        Uuid(_) => size += 17,                           // type + value\n        _ => return Err(\"Unsupported header value type\".into()),\n    }\n\n    Ok(size as u32)\n}\n\n/// Write header directly to buffer with CRC update\nfn write_header_to_optimized(\n    header: &Header,\n    buffer: &mut Vec<u8>,\n    crc: &mut Hasher,\n) -> Result<(), Box<dyn std::error::Error>> {\n    let name_bytes = header.name().as_bytes();\n    if name_bytes.len() > MAX_HEADER_NAME_LEN {\n        return Err(\"Header name too long\".into());\n    }\n\n    // Write name length\n    let name_len = name_bytes.len() as u8;\n    buffer.put_u8(name_len);\n    crc.update(&[name_len]);\n\n    // Write name\n    buffer.put_slice(name_bytes);\n    crc.update(name_bytes);\n\n    // Write value\n    write_header_value_to_optimized(header.value(), buffer, crc)?;\n\n    Ok(())\n}\n\n/// Get the name of the current allocator for benchmark naming\nfn get_allocator_name() -> &'static str {\n    #[cfg(all(feature = \"__bench-jemalloc\", not(feature = \"__bench-mimalloc\")))]\n    return \"jemalloc\";\n\n    #[cfg(all(feature = \"__bench-mimalloc\", not(feature = \"__bench-jemalloc\")))]\n    return \"mimalloc\";\n\n    #[cfg(not(any(feature = \"__bench-jemalloc\", feature = \"__bench-mimalloc\")))]\n    return \"system\";\n\n    #[cfg(all(feature = \"__bench-jemalloc\", feature = \"__bench-mimalloc\"))]\n    return \"system\"; // When both features are enabled, default to system allocator\n}\n\n/// Write header value directly to buffer with CRC update\nfn write_header_value_to_optimized(\n    value: &HeaderValue,\n    buffer: &mut Vec<u8>,\n    crc: &mut Hasher,\n) -> Result<(), Box<dyn std::error::Error>> {\n    use HeaderValue::*;\n    match value {\n        Bool(val) => {\n            let type_byte = if *val { TYPE_TRUE } else { TYPE_FALSE };\n            buffer.put_u8(type_byte);\n            crc.update(&[type_byte]);\n        }\n        Byte(val) => {\n            buffer.put_u8(TYPE_BYTE);\n            buffer.put_i8(*val);\n            crc.update(&[TYPE_BYTE]);\n            crc.update(&val.to_be_bytes());\n        }\n        Int16(val) => {\n            buffer.put_u8(TYPE_INT16);\n            buffer.put_i16(*val);\n            crc.update(&[TYPE_INT16]);\n            crc.update(&val.to_be_bytes());\n        }\n        Int32(val) => {\n            buffer.put_u8(TYPE_INT32);\n            buffer.put_i32(*val);\n            crc.update(&[TYPE_INT32]);\n            crc.update(&val.to_be_bytes());\n        }\n        Int64(val) => {\n            buffer.put_u8(TYPE_INT64);\n            buffer.put_i64(*val);\n            crc.update(&[TYPE_INT64]);\n            crc.update(&val.to_be_bytes());\n        }\n        ByteArray(val) => {\n            if val.len() > u16::MAX as usize {\n                return Err(\"Byte array too long\".into());\n            }\n            buffer.put_u8(TYPE_BYTE_ARRAY);\n            buffer.put_u16(val.len() as u16);\n            buffer.put_slice(val);\n            crc.update(&[TYPE_BYTE_ARRAY]);\n            crc.update(&(val.len() as u16).to_be_bytes());\n            crc.update(val);\n        }\n        String(val) => {\n            let bytes = val.as_bytes();\n            if bytes.len() > u16::MAX as usize {\n                return Err(\"String too long\".into());\n            }\n            buffer.put_u8(TYPE_STRING);\n            buffer.put_u16(bytes.len() as u16);\n            buffer.put_slice(bytes);\n            crc.update(&[TYPE_STRING]);\n            crc.update(&(bytes.len() as u16).to_be_bytes());\n            crc.update(bytes);\n        }\n        Timestamp(time) => {\n            let millis = time.to_millis().map_err(|_| \"Timestamp too large\")?;\n            buffer.put_u8(TYPE_TIMESTAMP);\n            buffer.put_i64(millis);\n            crc.update(&[TYPE_TIMESTAMP]);\n            crc.update(&millis.to_be_bytes());\n        }\n        Uuid(val) => {\n            buffer.put_u8(TYPE_UUID);\n            buffer.put_u128(*val);\n            crc.update(&[TYPE_UUID]);\n            crc.update(&val.to_be_bytes());\n        }\n        _ => return Err(\"Unsupported header value type\".into()),\n    }\n    Ok(())\n}\n\n/// Optimized version 2: Just pre-allocate buffer size, keep everything else simple\npub fn write_message_preallocate(\n    message: &Message,\n    buffer: &mut Vec<u8>,\n) -> Result<(), Box<dyn std::error::Error>> {\n    // Simple size estimation: headers are typically small, so just estimate\n    let estimated_size = message.size_hint(); // rough estimate for headers + overhead\n    buffer.reserve(estimated_size);\n\n    // Use the original implementation but with Vec<u8> instead of dyn BufMut\n    write_message_to(message, buffer).map_err(|e| e.into())\n}\n\nfn benchmark_write_message_to(c: &mut Criterion) {\n    let allocator = get_allocator_name();\n    // Create a simple test message with 1KB payload\n    let payload = Bytes::from(vec![0u8; 1024]);\n    let message = Message::new(payload).add_header(Header::new(\n        \"content-type\",\n        HeaderValue::String(\"application/json\".into()),\n    ));\n\n    // Test different buffer configurations\n    let buffer_configs = vec![\n        BufferConfig::Empty,\n        BufferConfig::Undersized(0.5),\n        BufferConfig::ExactSize(0), // Will be calculated\n        BufferConfig::Oversized(2.0),\n    ];\n\n    let actual_size = message.size_hint();\n\n    // Original implementation benchmarks\n    for buffer_config in &buffer_configs {\n        let bench_name = format!(\n            \"original_write_message_to_1kb_{}_buffer_{allocator}\",\n            buffer_config.description()\n        );\n\n        c.bench_function(&bench_name, |b| {\n            b.iter(|| {\n                let mut buffer = create_buffer(buffer_config, actual_size);\n                write_message_to(&message, &mut buffer).unwrap();\n                black_box(buffer);\n            });\n        });\n    }\n\n    // Optimized v1 implementation benchmarks (complex but fastest)\n    for buffer_config in &buffer_configs {\n        let bench_name = format!(\n            \"optimized_v1_write_message_to_1kb_{}_buffer_{allocator}\",\n            buffer_config.description()\n        );\n\n        c.bench_function(&bench_name, |b| {\n            b.iter(|| {\n                let mut buffer = create_buffer(buffer_config, actual_size);\n                write_message_to_optimized_v1(&message, &mut buffer).unwrap();\n                black_box(buffer);\n            });\n        });\n    }\n\n    // Optimized v2 implementation benchmarks (simple pre-allocation)\n    for buffer_config in &buffer_configs {\n        let bench_name = format!(\n            \"optimized_v2_write_message_to_1kb_{}_buffer_{allocator}\",\n            buffer_config.description()\n        );\n\n        c.bench_function(&bench_name, |b| {\n            b.iter(|| {\n                let mut buffer = create_buffer(buffer_config, actual_size);\n                write_message_preallocate(&message, &mut buffer).unwrap();\n                black_box(buffer);\n            });\n        });\n    }\n}\n\n/// Verification test to ensure both implementations produce identical output\n#[cfg(test)]\nfn verify_implementations_match() {\n    use bytes::Bytes;\n\n    // Test cases with different message configurations\n    let test_cases = vec![\n        // Simple message with 1KB payload\n        Message::new(Bytes::from(vec![0u8; 1024])).add_header(Header::new(\n            \"content-type\",\n            HeaderValue::String(\"application/json\".into()),\n        )),\n        // Empty payload\n        Message::new(Bytes::new()),\n        // Message with multiple headers and different value types\n        Message::new(Bytes::from(b\"test payload\".to_vec()))\n            .add_header(Header::new(\"bool-true\", HeaderValue::Bool(true)))\n            .add_header(Header::new(\"bool-false\", HeaderValue::Bool(false)))\n            .add_header(Header::new(\"byte-val\", HeaderValue::Byte(42)))\n            .add_header(Header::new(\"int16-val\", HeaderValue::Int16(12345)))\n            .add_header(Header::new(\"int32-val\", HeaderValue::Int32(987654321)))\n            .add_header(Header::new(\n                \"int64-val\",\n                HeaderValue::Int64(1234567890123456789),\n            ))\n            .add_header(Header::new(\n                \"string-val\",\n                HeaderValue::String(\"hello world\".into()),\n            ))\n            .add_header(Header::new(\n                \"bytes-val\",\n                HeaderValue::ByteArray(Bytes::from(b\"binary data\".to_vec())),\n            )),\n        // Large payload\n        Message::new(Bytes::from(vec![0xAB; 4096])).add_header(Header::new(\n            \"large-content\",\n            HeaderValue::String(\"large payload test\".into()),\n        )),\n        // Message with long header name (near limit)\n        Message::new(Bytes::from(b\"payload\".to_vec())).add_header(Header::new(\n            \"x\".repeat(200), // Long but valid header name\n            HeaderValue::String(\"long header name test\".into()),\n        )),\n    ];\n\n    for (i, message) in test_cases.iter().enumerate() {\n        println!(\"Testing case {}: {:?}\", i, message.headers().len());\n\n        // Test original implementation\n        let mut original_buffer = Vec::new();\n        write_message_to(message, &mut original_buffer)\n            .unwrap_or_else(|_| panic!(\"Original implementation failed for test case {i}\"));\n\n        // Test all optimized implementations\n        let mut optimized_v1_buffer = Vec::new();\n        write_message_to_optimized_v1(message, &mut optimized_v1_buffer)\n            .unwrap_or_else(|_| panic!(\"Optimized v1 implementation failed for test case {i}\"));\n\n        let mut optimized_v2_buffer = Vec::new();\n        write_message_preallocate(message, &mut optimized_v2_buffer)\n            .unwrap_or_else(|_| panic!(\"Optimized v2 implementation failed for test case {i}\"));\n\n        // Compare results\n        assert_eq!(\n            original_buffer, optimized_v1_buffer,\n            \"V1 implementation produces different output for test case {}\\nOriginal length: {}, V1 length: {}\",\n            i, original_buffer.len(), optimized_v1_buffer.len()\n        );\n\n        assert_eq!(\n            original_buffer, optimized_v2_buffer,\n            \"V2 implementation produces different output for test case {}\\nOriginal length: {}, V2 length: {}\",\n            i, original_buffer.len(), optimized_v2_buffer.len()\n        );\n\n        // Verify the output can be read back correctly\n        let parsed_message = aws_smithy_eventstream::frame::read_message_from(&mut Bytes::from(\n            original_buffer.clone(),\n        ))\n        .unwrap_or_else(|_| panic!(\"Failed to parse original output for test case {i}\"));\n\n        // Verify headers match\n        assert_eq!(\n            message.headers(),\n            parsed_message.headers(),\n            \"Headers don't match after round-trip for test case {i}\"\n        );\n\n        // Verify payload matches\n        assert_eq!(\n            message.payload().as_ref(),\n            parsed_message.payload().as_ref(),\n            \"Payload doesn't match after round-trip for test case {i}\"\n        );\n\n        println!(\"✓ Test case {} passed - {} bytes\", i, original_buffer.len());\n    }\n\n    println!(\"All verification tests passed!\");\n}\n\n/// Run verification during benchmarks\nfn benchmark_write_message_to_with_verification(c: &mut Criterion) {\n    // First run verification\n    verify_implementations_match();\n\n    // Then run the actual benchmarks\n    benchmark_write_message_to(c);\n}\n\ncriterion_group!(benches, benchmark_write_message_to_with_verification);\ncriterion_main!(benches);\n"
  },
  {
    "path": "rust-runtime/aws-smithy-eventstream/external-types.toml",
    "content": "allowed_external_types = [\n    \"aws_smithy_types::*\",\n    \"bytes::buf::buf_impl::Buf\",\n    \"bytes::buf::buf_mut::BufMut\",\n    \"bytes::bytes::Bytes\",\n\n    # TODO(https://github.com/smithy-lang/smithy-rs/issues/1193): Once tooling permits it, only allow the following types in the `derive-arbitrary` feature\n    \"arbitrary::Arbitrary\",\n]\n"
  },
  {
    "path": "rust-runtime/aws-smithy-eventstream/fuzz/.gitignore",
    "content": "\ntarget\ncorpus\nartifacts\n"
  },
  {
    "path": "rust-runtime/aws-smithy-eventstream/fuzz/Cargo.toml",
    "content": "[package]\nname = \"aws-smithy-eventstream-fuzz\"\nversion = \"0.1.0\"\nauthors = [\"AWS Rust SDK Team <aws-sdk-rust@amazon.com>\", \"John DiSanti <jdisanti@amazon.com>\"]\npublish = false\nedition = \"2021\"\n\n[package.metadata]\ncargo-fuzz = true\n\n[dependencies]\narbitrary = \"1.3\"\naws-smithy-types = { path = \"../../aws-smithy-types\" }\nbytes = \"1\"\ncrc32fast = \"1\"\nderive_arbitrary = \"1.3\"\n# Version pinned due to https://github.com/rust-fuzz/libfuzzer/issues/126\nlibfuzzer-sys = \"=0.4.7\"\n\n[dependencies.aws-smithy-eventstream]\nfeatures = [\"derive-arbitrary\"]\npath = \"..\"\n\n# Prevent this from interfering with workspaces\n[workspace]\nmembers = [\".\"]\n\n[[bin]]\nname = \"raw_bytes\"\npath = \"fuzz_targets/raw_bytes.rs\"\ntest = false\ndoc = false\n\n[[bin]]\nname = \"round_trip\"\npath = \"fuzz_targets/round_trip.rs\"\ntest = false\ndoc = false\n\n[[bin]]\nname = \"corrected_prelude_crc\"\npath = \"fuzz_targets/corrected_prelude_crc.rs\"\ntest = false\ndoc = false\n\n[[bin]]\nname = \"mutated_headers\"\npath = \"fuzz_targets/mutated_headers.rs\"\ntest = false\ndoc = false\n\n[[bin]]\nname = \"prelude\"\npath = \"fuzz_targets/prelude.rs\"\ntest = false\ndoc = false\n"
  },
  {
    "path": "rust-runtime/aws-smithy-eventstream/fuzz/fuzz_targets/corrected_prelude_crc.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n#![no_main]\n\nuse aws_smithy_eventstream::frame::read_message_from;\nuse bytes::BufMut;\nuse crc32fast::Hasher as Crc;\nuse libfuzzer_sys::fuzz_target;\n\n#[derive(derive_arbitrary::Arbitrary, Debug)]\nstruct Input {\n    headers: Vec<u8>,\n    payload: Vec<u8>,\n}\n\n// This fuzz test assists the fuzzer by creating a well formed prelude and message CRC\nfuzz_target!(|input: Input| {\n    let total_len = (12 + input.headers.len() + input.payload.len() + 4) as u32;\n    let header_len = input.headers.len() as u32;\n\n    let mut message = Vec::<u8>::new();\n    message.put_u32(total_len);\n    message.put_u32(header_len);\n    message.put_u32(crc(&message));\n    message.put_slice(&input.headers);\n    message.put_slice(&input.payload);\n    message.put_u32(crc(&message));\n\n    let mut data = &mut &message[..];\n    let _ = read_message_from(&mut data);\n});\n\nfn crc(input: &[u8]) -> u32 {\n    let mut crc = Crc::new();\n    crc.update(input);\n    crc.finalize()\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-eventstream/fuzz/fuzz_targets/mutated_headers.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n#![no_main]\n\nuse aws_smithy_eventstream::frame::{read_message_from, write_message_to};\nuse aws_smithy_types::event_stream::{Header, HeaderValue, Message};\nuse aws_smithy_types::DateTime;\nuse bytes::{Buf, BufMut};\nuse crc32fast::Hasher as Crc;\nuse libfuzzer_sys::{fuzz_mutator, fuzz_target};\n\n// This fuzz test uses a custom mutator to manipulate the headers.\n// If it fails to parse a message from the unmutated input, it will create a message\n// with every single possible header type to give the fuzzer a leg up.\n// After the headers are mutated, a new valid prelude and valid message CRC are generated\n// so that the fuzzer can actually explore the header parsing logic.\nfn mutate(data: &mut [u8], size: usize, max_size: usize) -> usize {\n    let input = &mut &data[..size];\n    let message = if let Ok(message) = read_message_from(input) {\n        message\n    } else {\n        Message::new(&b\"some payload\"[..])\n            .add_header(Header::new(\"true\", HeaderValue::Bool(true)))\n            .add_header(Header::new(\"false\", HeaderValue::Bool(false)))\n            .add_header(Header::new(\"byte\", HeaderValue::Byte(50)))\n            .add_header(Header::new(\"short\", HeaderValue::Int16(20_000)))\n            .add_header(Header::new(\"int\", HeaderValue::Int32(500_000)))\n            .add_header(Header::new(\"long\", HeaderValue::Int64(50_000_000_000)))\n            .add_header(Header::new(\n                \"bytes\",\n                HeaderValue::ByteArray((&b\"some bytes\"[..]).into()),\n            ))\n            .add_header(Header::new(\"str\", HeaderValue::String(\"some str\".into())))\n            .add_header(Header::new(\n                \"time\",\n                HeaderValue::Timestamp(DateTime::from_secs(5_000_000_000)),\n            ))\n            .add_header(Header::new(\n                \"uuid\",\n                HeaderValue::Uuid(0xb79bc914_de21_4e13_b8b2_bc47e85b7f0b),\n            ))\n    };\n\n    let mut bytes = Vec::new();\n    write_message_to(&message, &mut bytes).unwrap();\n\n    let headers_len = (&bytes[4..8]).get_u32();\n    let non_header_len = bytes.len() - headers_len as usize;\n    let max_header_len = max_size - non_header_len;\n    let mut headers = (&bytes[12..(12 + headers_len as usize)]).to_vec();\n    headers.resize(max_header_len, 0);\n    let new_header_len =\n        libfuzzer_sys::fuzzer_mutate(&mut headers, headers_len as usize, max_header_len);\n\n    let mut mutated = Vec::<u8>::new();\n    mutated.put_u32((new_header_len + non_header_len) as u32);\n    mutated.put_u32(new_header_len as u32);\n    mutated.put_u32(crc(&mutated));\n    mutated.put_slice(&headers[..new_header_len]);\n    mutated.put_slice(message.payload());\n    mutated.put_u32(crc(&mutated));\n\n    data[..mutated.len()].copy_from_slice(&mutated);\n    mutated.len()\n}\n\nfuzz_mutator!(\n    |data: &mut [u8], size: usize, max_size: usize, _seed: u32| { mutate(data, size, max_size) }\n);\n\nfuzz_target!(|data: &[u8]| {\n    let mut message = data;\n    let _ = read_message_from(&mut message);\n});\n\nfn crc(input: &[u8]) -> u32 {\n    let mut crc = Crc::new();\n    crc.update(input);\n    crc.finalize()\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-eventstream/fuzz/fuzz_targets/prelude.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n#![no_main]\n\nuse aws_smithy_eventstream::frame::{read_message_from, write_message_to};\nuse aws_smithy_types::event_stream::{Header, HeaderValue, Message};\nuse bytes::{Buf, BufMut};\nuse crc32fast::Hasher as Crc;\nuse libfuzzer_sys::fuzz_target;\n\n#[derive(derive_arbitrary::Arbitrary, Debug)]\nstruct Input {\n    total_len: u32,\n    header_len: u32,\n}\n\n// This fuzz test exclusively fuzzes the message prelude while keeping the CRCs valid.\nfuzz_target!(|input: Input| {\n    let message = Message::new(&b\"some payload\"[..])\n        .add_header(Header::new(\"str\", HeaderValue::String(\"some str\".into())));\n\n    let mut bytes = Vec::new();\n    write_message_to(&message, &mut bytes).unwrap();\n\n    let headers_len = (&bytes[4..8]).get_u32();\n    let headers = &bytes[12..(12 + headers_len as usize)];\n\n    let mut mutated = Vec::<u8>::new();\n    mutated.put_u32(input.total_len);\n    mutated.put_u32(input.header_len);\n    mutated.put_u32(crc(&mutated));\n    mutated.put_slice(headers);\n    mutated.put_slice(message.payload());\n    mutated.put_u32(crc(&mutated));\n\n    let _ = read_message_from(&mut &mutated[..]);\n});\n\nfn crc(input: &[u8]) -> u32 {\n    let mut crc = Crc::new();\n    crc.update(input);\n    crc.finalize()\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-eventstream/fuzz/fuzz_targets/raw_bytes.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n#![no_main]\n\nuse aws_smithy_eventstream::frame::read_message_from;\nuse libfuzzer_sys::fuzz_target;\n\nfuzz_target!(|data: &[u8]| {\n    let mut message = data;\n    let _ = read_message_from(&mut message);\n});\n"
  },
  {
    "path": "rust-runtime/aws-smithy-eventstream/fuzz/fuzz_targets/round_trip.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n#![no_main]\nuse aws_smithy_eventstream::arbitrary::ArbMessage;\nuse aws_smithy_eventstream::frame::{read_message_from, write_message_to};\nuse libfuzzer_sys::fuzz_target;\n\nfuzz_target!(|message: ArbMessage| {\n    let message = message.into();\n    let mut buffer = Vec::new();\n    match write_message_to(&message, &mut buffer) {\n        Ok(_) => {\n            let mut data = &buffer[..];\n            let parsed = read_message_from(&mut data).unwrap();\n            assert_eq!(message, parsed);\n        }\n        Err(err) => {\n            if !err.is_invalid_message() {\n                panic!(\"unexpected error on write: {}\", err),\n            }\n        }\n    }\n});\n"
  },
  {
    "path": "rust-runtime/aws-smithy-eventstream/src/arbitrary.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Defines new-types wrapping inner types from `aws_smithy_types` to enable the `Arbitrary` trait\n//! for fuzz testing.\n\nuse aws_smithy_types::event_stream::{Header, HeaderValue, Message};\nuse aws_smithy_types::str_bytes::StrBytes;\nuse aws_smithy_types::DateTime;\nuse bytes::Bytes;\n\n#[derive(Clone, Debug, PartialEq)]\npub struct ArbHeaderValue(HeaderValue);\n\nimpl<'a> arbitrary::Arbitrary<'a> for ArbHeaderValue {\n    fn arbitrary(unstruct: &mut arbitrary::Unstructured<'a>) -> arbitrary::Result<Self> {\n        let value_type: u8 = unstruct.int_in_range(0..=9)?;\n        let header_value = match value_type {\n            crate::frame::TYPE_TRUE => HeaderValue::Bool(true),\n            crate::frame::TYPE_FALSE => HeaderValue::Bool(false),\n            crate::frame::TYPE_BYTE => HeaderValue::Byte(i8::arbitrary(unstruct)?),\n            crate::frame::TYPE_INT16 => HeaderValue::Int16(i16::arbitrary(unstruct)?),\n            crate::frame::TYPE_INT32 => HeaderValue::Int32(i32::arbitrary(unstruct)?),\n            crate::frame::TYPE_INT64 => HeaderValue::Int64(i64::arbitrary(unstruct)?),\n            crate::frame::TYPE_BYTE_ARRAY => {\n                HeaderValue::ByteArray(Bytes::from(Vec::<u8>::arbitrary(unstruct)?))\n            }\n            crate::frame::TYPE_STRING => {\n                HeaderValue::String(StrBytes::from(String::arbitrary(unstruct)?))\n            }\n            crate::frame::TYPE_TIMESTAMP => {\n                HeaderValue::Timestamp(DateTime::from_secs(i64::arbitrary(unstruct)?))\n            }\n            crate::frame::TYPE_UUID => HeaderValue::Uuid(u128::arbitrary(unstruct)?),\n            _ => unreachable!(),\n        };\n        Ok(ArbHeaderValue(header_value))\n    }\n}\n\nimpl From<ArbHeaderValue> for HeaderValue {\n    fn from(header_value: ArbHeaderValue) -> Self {\n        header_value.0\n    }\n}\n\n#[derive(Clone, Debug, PartialEq, Eq)]\npub struct ArbStrBytes(StrBytes);\n\n#[cfg(feature = \"derive-arbitrary\")]\nimpl<'a> arbitrary::Arbitrary<'a> for ArbStrBytes {\n    fn arbitrary(unstruct: &mut arbitrary::Unstructured<'a>) -> arbitrary::Result<Self> {\n        Ok(ArbStrBytes(String::arbitrary(unstruct)?.into()))\n    }\n}\n\nimpl From<ArbStrBytes> for StrBytes {\n    fn from(str_bytes: ArbStrBytes) -> Self {\n        str_bytes.0\n    }\n}\n\n#[derive(Clone, Debug, PartialEq, derive_arbitrary::Arbitrary)]\npub struct ArbHeader {\n    name: ArbStrBytes,\n    value: ArbHeaderValue,\n}\n\nimpl From<ArbHeader> for Header {\n    fn from(header: ArbHeader) -> Self {\n        Self::new(header.name, header.value)\n    }\n}\n\n#[derive(Clone, Debug, PartialEq)]\npub struct ArbMessage(Message);\n\nimpl<'a> arbitrary::Arbitrary<'a> for ArbMessage {\n    fn arbitrary(unstruct: &mut arbitrary::Unstructured<'a>) -> arbitrary::Result<Self> {\n        let headers: Vec<ArbHeader> = unstruct\n            .arbitrary_iter()?\n            .collect::<arbitrary::Result<_>>()?;\n        let message = Message::new_from_parts(\n            headers.into_iter().map(Into::into).collect(),\n            Bytes::from(Vec::<u8>::arbitrary(unstruct)?),\n        );\n        Ok(ArbMessage(message))\n    }\n}\n\nimpl From<ArbMessage> for Message {\n    fn from(message: ArbMessage) -> Self {\n        message.0\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-eventstream/src/buf/count.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! A [`Buf`] implementation that counts bytes read.\n\nuse bytes::Buf;\n\n/// A [`Buf`] implementation that counts bytes read.\npub(crate) struct CountBuf<'a, B>\nwhere\n    B: Buf,\n{\n    buffer: &'a mut B,\n    count: usize,\n}\n\nimpl<'a, B> CountBuf<'a, B>\nwhere\n    B: Buf,\n{\n    /// Creates a new `CountBuf` by wrapping the given `buffer`.\n    pub(crate) fn new(buffer: &'a mut B) -> Self {\n        CountBuf { buffer, count: 0 }\n    }\n\n    /// Consumes the `CountBuf` and returns the number of bytes read.\n    pub(crate) fn into_count(self) -> usize {\n        self.count\n    }\n}\n\nimpl<B> Buf for CountBuf<'_, B>\nwhere\n    B: Buf,\n{\n    fn remaining(&self) -> usize {\n        self.buffer.remaining()\n    }\n\n    fn chunk(&self) -> &[u8] {\n        self.buffer.chunk()\n    }\n\n    fn advance(&mut self, cnt: usize) {\n        self.count += cnt;\n        self.buffer.advance(cnt);\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::CountBuf;\n    use bytes::Buf;\n\n    #[test]\n    fn count_no_data_read() {\n        let mut data: &[u8] = &[];\n        let buf = CountBuf::new(&mut data);\n        assert_eq!(0, buf.into_count());\n    }\n\n    #[test]\n    fn count_data_read() {\n        let mut data: &[u8] = &[0, 0, 0, 5, 0, 10u8];\n        let mut buf = CountBuf::new(&mut data);\n        assert_eq!(5, buf.get_i32());\n        assert_eq!(4, buf.into_count());\n\n        let mut data: &[u8] = &[0, 0, 0, 5, 0, 10u8];\n        let mut buf = CountBuf::new(&mut data);\n        assert_eq!(5, buf.get_i32());\n        assert_eq!(10, buf.get_i16());\n        assert_eq!(6, buf.into_count());\n    }\n\n    #[test]\n    fn chunk_called_multiple_times_before_advance() {\n        let mut data: &[u8] = &[0, 0, 0, 5, 0, 10u8];\n        let mut buf = CountBuf::new(&mut data);\n        for _ in 0..3 {\n            buf.chunk();\n        }\n        buf.advance(4);\n        assert_eq!(10, buf.get_i16());\n        assert_eq!(6, buf.into_count());\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-eventstream/src/buf/crc.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Utilities for calculating CRC-32 while reading from a [`Buf`] or writing to a [`BufMut`].\n\nuse bytes::buf::UninitSlice;\nuse bytes::{Buf, BufMut};\nuse crc32fast::Hasher;\n\n/// Implementation of [`Buf`] that calculates a CRC-32 checksum of the data\n/// being read from an underlying `Buf` instance.\npub(crate) struct CrcBuf<'a, B>\nwhere\n    B: Buf,\n{\n    buffer: &'a mut B,\n    crc: Hasher,\n}\n\nimpl<'a, B> CrcBuf<'a, B>\nwhere\n    B: Buf,\n{\n    /// Creates a new `CrcBuf` by wrapping the given `buffer`.\n    pub(crate) fn new(buffer: &'a mut B) -> Self {\n        CrcBuf {\n            buffer,\n            crc: Hasher::new(),\n        }\n    }\n\n    /// Consumes the `CrcBuf` and returns the calculated checksum.\n    pub(crate) fn into_crc(self) -> u32 {\n        self.crc.finalize()\n    }\n}\n\nimpl<B> Buf for CrcBuf<'_, B>\nwhere\n    B: Buf,\n{\n    fn remaining(&self) -> usize {\n        self.buffer.remaining()\n    }\n\n    fn chunk(&self) -> &[u8] {\n        self.buffer.chunk()\n    }\n\n    fn advance(&mut self, cnt: usize) {\n        let chunk = self.buffer.chunk();\n        self.crc.update(&chunk[0..cnt]);\n        self.buffer.advance(cnt);\n    }\n}\n\n#[cfg(test)]\nmod crc_buf_tests {\n    use super::CrcBuf;\n    use bytes::Buf;\n\n    #[test]\n    fn crc_no_data_read() {\n        let mut data: &[u8] = &[];\n        let buf = CrcBuf::new(&mut data);\n        assert_eq!(0, buf.into_crc());\n    }\n\n    #[test]\n    fn crc_data_read() {\n        let mut data: &[u8] = &[0, 0, 0, 5, 0, 10u8];\n        let mut buf = CrcBuf::new(&mut data);\n        assert_eq!(5, buf.get_i32());\n        assert_eq!(0x512E2B93, buf.into_crc());\n\n        let mut data: &[u8] = &[0, 0, 0, 5, 0, 10u8];\n        let mut buf = CrcBuf::new(&mut data);\n        assert_eq!(5, buf.get_i32());\n        assert_eq!(10, buf.get_i16());\n        assert_eq!(0x57DC8A56, buf.into_crc());\n    }\n\n    #[test]\n    fn chunk_called_multiple_times_before_advance() {\n        let mut data: &[u8] = &[0, 0, 0, 5, 0, 10u8];\n        let mut buf = CrcBuf::new(&mut data);\n        for _ in 0..3 {\n            buf.chunk();\n        }\n        buf.advance(4);\n        assert_eq!(10, buf.get_i16());\n        assert_eq!(0x57DC8A56, buf.into_crc());\n    }\n}\n\n/// Implementation of [`BufMut`] that calculates a CRC-32 checksum of the data\n/// being written to an underlying `Buf` instance, with a function to then write\n/// the calculated CRC-32 to the buffer.\npub(crate) struct CrcBufMut<'a> {\n    buffer: &'a mut dyn BufMut,\n    crc: Hasher,\n}\n\nimpl<'a> CrcBufMut<'a> {\n    /// Creates a new `CrcBufMut` by wrapping the given `buffer`.\n    pub(crate) fn new(buffer: &'a mut dyn BufMut) -> Self {\n        CrcBufMut {\n            buffer,\n            crc: Hasher::new(),\n        }\n    }\n\n    /// Puts the calculated CRC-32 to the buffer as a Big Endian 32-bit integer.\n    /// This can be called multiple times, and each successive call will include\n    /// the previously written checksum in its new checksum.\n    pub(crate) fn put_crc(&mut self) {\n        self.put_u32(self.crc.clone().finalize());\n    }\n}\n\nunsafe impl BufMut for CrcBufMut<'_> {\n    fn remaining_mut(&self) -> usize {\n        self.buffer.remaining_mut()\n    }\n\n    unsafe fn advance_mut(&mut self, cnt: usize) {\n        // Safety: There is no guarantee the bytes being advanced are initialized, which is why\n        // this trait method is unsafe. The best we can do is assume they have been initialized\n        // by the caller before `advance_mut` was called.\n        let written = std::slice::from_raw_parts_mut(self.chunk_mut().as_mut_ptr(), cnt);\n        self.crc.update(written);\n        self.buffer.advance_mut(cnt);\n    }\n\n    fn chunk_mut(&mut self) -> &mut UninitSlice {\n        self.buffer.chunk_mut()\n    }\n}\n\n#[cfg(test)]\nmod crc_buf_mut_tests {\n    use super::CrcBufMut;\n    use bytes::BufMut;\n\n    #[test]\n    fn crc_no_bytes_written() {\n        let mut buffer: Vec<u8> = Vec::new();\n        let mut crc_buf = CrcBufMut::new(&mut buffer);\n        crc_buf.put_crc();\n        crc_buf.put_crc();\n        assert_eq!(vec![0, 0, 0, 0u8, 0x21, 0x44, 0xDF, 0x1C], buffer);\n    }\n\n    #[test]\n    fn crc_bytes_written() {\n        let mut buffer: Vec<u8> = Vec::new();\n        let mut crc_buf = CrcBufMut::new(&mut buffer);\n        crc_buf.put_u32(5);\n        crc_buf.put_crc();\n        assert_eq!(vec![0, 0, 0, 5, 0x51, 0x2E, 0x2B, 0x93], buffer);\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-eventstream/src/buf.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npub(crate) mod count;\npub(crate) mod crc;\n"
  },
  {
    "path": "rust-runtime/aws-smithy-eventstream/src/error.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_smithy_types::DateTime;\nuse std::error::Error as StdError;\nuse std::fmt;\n\n#[derive(Debug)]\npub(crate) enum ErrorKind {\n    HeadersTooLong,\n    HeaderValueTooLong,\n    InvalidHeaderNameLength,\n    InvalidHeaderValue,\n    InvalidHeaderValueType(u8),\n    InvalidHeadersLength,\n    InvalidMessageLength,\n    InvalidUtf8String,\n    MessageChecksumMismatch(u32, u32),\n    MessageTooLong,\n    PayloadTooLong,\n    PreludeChecksumMismatch(u32, u32),\n    TimestampValueTooLarge(DateTime),\n    Marshalling(String),\n    Unmarshalling(String),\n}\n\n#[derive(Debug)]\npub struct Error {\n    kind: ErrorKind,\n}\n\nimpl Error {\n    // Used in tests to match on the underlying error kind\n    #[cfg(test)]\n    pub(crate) fn kind(&self) -> &ErrorKind {\n        &self.kind\n    }\n\n    /// Create an `Error` for failure to marshall a message from a Smithy shape\n    pub fn marshalling(message: impl Into<String>) -> Self {\n        Self {\n            kind: ErrorKind::Marshalling(message.into()),\n        }\n    }\n\n    /// Create an `Error` for failure to unmarshall a message into a Smithy shape\n    pub fn unmarshalling(message: impl Into<String>) -> Self {\n        Self {\n            kind: ErrorKind::Unmarshalling(message.into()),\n        }\n    }\n\n    /// Returns true if the error is one generated during serialization\n    pub fn is_invalid_message(&self) -> bool {\n        use ErrorKind::*;\n        matches!(\n            self.kind,\n            HeadersTooLong\n                | PayloadTooLong\n                | MessageTooLong\n                | InvalidHeaderNameLength\n                | TimestampValueTooLarge(_)\n                | Marshalling(_)\n        )\n    }\n}\n\nimpl From<ErrorKind> for Error {\n    fn from(kind: ErrorKind) -> Self {\n        Error { kind }\n    }\n}\n\nimpl StdError for Error {}\n\nimpl fmt::Display for Error {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        use ErrorKind::*;\n        match &self.kind {\n            HeadersTooLong => write!(f, \"headers too long to fit in event stream frame\"),\n            HeaderValueTooLong => write!(f, \"header value too long to fit in event stream frame\"),\n            InvalidHeaderNameLength => write!(f, \"invalid header name length\"),\n            InvalidHeaderValue => write!(f, \"invalid header value\"),\n            InvalidHeaderValueType(val) => write!(f, \"invalid header value type: {val}\"),\n            InvalidHeadersLength => write!(f, \"invalid headers length\"),\n            InvalidMessageLength => write!(f, \"invalid message length\"),\n            InvalidUtf8String => write!(f, \"encountered invalid UTF-8 string\"),\n            MessageChecksumMismatch(expected, actual) => write!(\n                f,\n                \"message checksum 0x{actual:X} didn't match expected checksum 0x{expected:X}\"\n            ),\n            MessageTooLong => write!(f, \"message too long to fit in event stream frame\"),\n            PayloadTooLong => write!(f, \"message payload too long to fit in event stream frame\"),\n            PreludeChecksumMismatch(expected, actual) => write!(\n                f,\n                \"prelude checksum 0x{actual:X} didn't match expected checksum 0x{expected:X}\"\n            ),\n            TimestampValueTooLarge(time) => write!(\n                f,\n                \"timestamp value {time:?} is too large to fit into an i64\"\n            ),\n            Marshalling(error) => write!(f, \"failed to marshall message: {error}\"),\n            Unmarshalling(error) => write!(f, \"failed to unmarshall message: {error}\"),\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-eventstream/src/frame.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Event Stream message frame types and serialization/deserialization logic.\n\nuse crate::buf::count::CountBuf;\nuse crate::buf::crc::{CrcBuf, CrcBufMut};\nuse crate::error::{Error, ErrorKind};\nuse aws_smithy_types::config_bag::{Storable, StoreReplace};\nuse aws_smithy_types::event_stream::{Header, HeaderValue, Message};\nuse aws_smithy_types::str_bytes::StrBytes;\nuse aws_smithy_types::DateTime;\nuse bytes::{Buf, BufMut};\nuse std::error::Error as StdError;\nuse std::fmt;\nuse std::mem::size_of;\nuse std::sync::{mpsc, Mutex};\n\nconst PRELUDE_LENGTH_BYTES: u32 = 3 * size_of::<u32>() as u32;\nconst PRELUDE_LENGTH_BYTES_USIZE: usize = PRELUDE_LENGTH_BYTES as usize;\nconst MESSAGE_CRC_LENGTH_BYTES: u32 = size_of::<u32>() as u32;\nconst MAX_HEADER_NAME_LEN: usize = 255;\nconst MIN_HEADER_LEN: usize = 2;\n\npub(crate) const TYPE_TRUE: u8 = 0;\npub(crate) const TYPE_FALSE: u8 = 1;\npub(crate) const TYPE_BYTE: u8 = 2;\npub(crate) const TYPE_INT16: u8 = 3;\npub(crate) const TYPE_INT32: u8 = 4;\npub(crate) const TYPE_INT64: u8 = 5;\npub(crate) const TYPE_BYTE_ARRAY: u8 = 6;\npub(crate) const TYPE_STRING: u8 = 7;\npub(crate) const TYPE_TIMESTAMP: u8 = 8;\npub(crate) const TYPE_UUID: u8 = 9;\n\npub type SignMessageError = Box<dyn StdError + Send + Sync + 'static>;\n\n/// Signs an Event Stream message.\npub trait SignMessage: fmt::Debug {\n    fn sign(&mut self, message: Message) -> Result<Message, SignMessageError>;\n\n    /// SigV4 requires an empty last signed message to be sent.\n    /// Other protocols do not require one.\n    /// Return `Some(_)` to send a signed last empty message, before completing the stream.\n    /// Return `None` to not send one and terminate the stream immediately.\n    fn sign_empty(&mut self) -> Option<Result<Message, SignMessageError>>;\n}\n\n/// A sender that gets placed in the request config to wire up an event stream signer after signing.\n#[derive(Debug)]\n#[non_exhaustive]\npub struct DeferredSignerSender(Mutex<mpsc::Sender<Box<dyn SignMessage + Send + Sync>>>);\n\nimpl DeferredSignerSender {\n    /// Creates a new `DeferredSignerSender`\n    fn new(tx: mpsc::Sender<Box<dyn SignMessage + Send + Sync>>) -> Self {\n        Self(Mutex::new(tx))\n    }\n\n    /// Sends a signer on the channel\n    pub fn send(\n        &self,\n        signer: Box<dyn SignMessage + Send + Sync>,\n    ) -> Result<(), mpsc::SendError<Box<dyn SignMessage + Send + Sync>>> {\n        self.0.lock().unwrap().send(signer)\n    }\n}\n\nimpl Storable for DeferredSignerSender {\n    type Storer = StoreReplace<Self>;\n}\n\n/// Deferred event stream signer to allow a signer to be wired up later.\n///\n/// HTTP request signing takes place after serialization, and the event stream\n/// message stream body is established during serialization. Since event stream\n/// signing may need context from the initial HTTP signing operation, this\n/// [`DeferredSigner`] is needed to wire up the signer later in the request lifecycle.\n///\n/// This signer basically just establishes a MPSC channel so that the sender can\n/// be placed in the request's config. Then the HTTP signer implementation can\n/// retrieve the sender from that config and send an actual signing implementation\n/// with all the context needed.\n///\n/// When an event stream implementation needs to sign a message, the first call to\n/// sign will acquire a signing implementation off of the channel and cache it\n/// for the remainder of the operation.\n#[derive(Debug)]\npub struct DeferredSigner {\n    rx: Option<Mutex<mpsc::Receiver<Box<dyn SignMessage + Send + Sync>>>>,\n    signer: Option<Box<dyn SignMessage + Send + Sync>>,\n}\n\nimpl DeferredSigner {\n    pub fn new() -> (Self, DeferredSignerSender) {\n        let (tx, rx) = mpsc::channel();\n        (\n            Self {\n                rx: Some(Mutex::new(rx)),\n                signer: None,\n            },\n            DeferredSignerSender::new(tx),\n        )\n    }\n\n    fn acquire(&mut self) -> &mut (dyn SignMessage + Send + Sync) {\n        // Can't use `if let Some(signer) = &mut self.signer` because the borrow checker isn't smart enough\n        if self.signer.is_some() {\n            self.signer.as_mut().unwrap().as_mut()\n        } else {\n            self.signer = Some(\n                self.rx\n                    .take()\n                    .expect(\"only taken once\")\n                    .lock()\n                    .unwrap()\n                    .try_recv()\n                    .ok()\n                    // TODO(enableNewSmithyRuntimeCleanup): When the middleware implementation is removed,\n                    // this should panic rather than default to the `NoOpSigner`. The reason it defaults\n                    // is because middleware-based generic clients don't have any default middleware,\n                    // so there is no way to send a `NoOpSigner` by default when there is no other\n                    // auth scheme. The orchestrator auth setup is a lot more robust and will make\n                    // this problem trivial.\n                    .unwrap_or_else(|| Box::new(NoOpSigner {}) as _),\n            );\n            self.acquire()\n        }\n    }\n}\n\nimpl SignMessage for DeferredSigner {\n    fn sign(&mut self, message: Message) -> Result<Message, SignMessageError> {\n        self.acquire().sign(message)\n    }\n\n    fn sign_empty(&mut self) -> Option<Result<Message, SignMessageError>> {\n        self.acquire().sign_empty()\n    }\n}\n\n#[derive(Debug)]\npub struct NoOpSigner {}\nimpl SignMessage for NoOpSigner {\n    fn sign(&mut self, message: Message) -> Result<Message, SignMessageError> {\n        Ok(message)\n    }\n\n    fn sign_empty(&mut self) -> Option<Result<Message, SignMessageError>> {\n        None\n    }\n}\n\n/// Converts a Smithy modeled Event Stream type into a [`Message`].\npub trait MarshallMessage: fmt::Debug {\n    /// Smithy modeled input type to convert from.\n    type Input;\n\n    fn marshall(&self, input: Self::Input) -> Result<Message, Error>;\n}\n\n/// A successfully unmarshalled message that is either an `Event` or an `Error`.\n#[derive(Debug)]\npub enum UnmarshalledMessage<T, E> {\n    Event(T),\n    Error(E),\n}\n\n/// Converts an Event Stream [`Message`] into a Smithy modeled type.\npub trait UnmarshallMessage: fmt::Debug {\n    /// Smithy modeled type to convert into.\n    type Output;\n    /// Smithy modeled error to convert into.\n    type Error;\n\n    fn unmarshall(\n        &self,\n        message: &Message,\n    ) -> Result<UnmarshalledMessage<Self::Output, Self::Error>, Error>;\n}\n\nmacro_rules! read_value {\n    ($buf:ident, $typ:ident, $size_typ:ident, $read_fn:ident) => {\n        if $buf.remaining() >= size_of::<$size_typ>() {\n            Ok(HeaderValue::$typ($buf.$read_fn()))\n        } else {\n            Err(ErrorKind::InvalidHeaderValue.into())\n        }\n    };\n}\n\nfn read_header_value_from<B: Buf>(mut buffer: B) -> Result<HeaderValue, Error> {\n    let value_type = buffer.get_u8();\n    match value_type {\n        TYPE_TRUE => Ok(HeaderValue::Bool(true)),\n        TYPE_FALSE => Ok(HeaderValue::Bool(false)),\n        TYPE_BYTE => read_value!(buffer, Byte, i8, get_i8),\n        TYPE_INT16 => read_value!(buffer, Int16, i16, get_i16),\n        TYPE_INT32 => read_value!(buffer, Int32, i32, get_i32),\n        TYPE_INT64 => read_value!(buffer, Int64, i64, get_i64),\n        TYPE_BYTE_ARRAY | TYPE_STRING => {\n            if buffer.remaining() > size_of::<u16>() {\n                let len = buffer.get_u16() as usize;\n                if buffer.remaining() < len {\n                    return Err(ErrorKind::InvalidHeaderValue.into());\n                }\n                let bytes = buffer.copy_to_bytes(len);\n                if value_type == TYPE_STRING {\n                    Ok(HeaderValue::String(\n                        bytes.try_into().map_err(|_| ErrorKind::InvalidUtf8String)?,\n                    ))\n                } else {\n                    Ok(HeaderValue::ByteArray(bytes))\n                }\n            } else {\n                Err(ErrorKind::InvalidHeaderValue.into())\n            }\n        }\n        TYPE_TIMESTAMP => {\n            if buffer.remaining() >= size_of::<i64>() {\n                let epoch_millis = buffer.get_i64();\n                Ok(HeaderValue::Timestamp(DateTime::from_millis(epoch_millis)))\n            } else {\n                Err(ErrorKind::InvalidHeaderValue.into())\n            }\n        }\n        TYPE_UUID => read_value!(buffer, Uuid, u128, get_u128),\n        _ => Err(ErrorKind::InvalidHeaderValueType(value_type).into()),\n    }\n}\n\nfn write_header_value_to<B: BufMut>(value: &HeaderValue, mut buffer: B) -> Result<(), Error> {\n    use HeaderValue::*;\n    match value {\n        Bool(val) => buffer.put_u8(if *val { TYPE_TRUE } else { TYPE_FALSE }),\n        Byte(val) => {\n            buffer.put_u8(TYPE_BYTE);\n            buffer.put_i8(*val);\n        }\n        Int16(val) => {\n            buffer.put_u8(TYPE_INT16);\n            buffer.put_i16(*val);\n        }\n        Int32(val) => {\n            buffer.put_u8(TYPE_INT32);\n            buffer.put_i32(*val);\n        }\n        Int64(val) => {\n            buffer.put_u8(TYPE_INT64);\n            buffer.put_i64(*val);\n        }\n        ByteArray(val) => {\n            buffer.put_u8(TYPE_BYTE_ARRAY);\n            buffer.put_u16(checked(val.len(), ErrorKind::HeaderValueTooLong.into())?);\n            buffer.put_slice(&val[..]);\n        }\n        String(val) => {\n            buffer.put_u8(TYPE_STRING);\n            buffer.put_u16(checked(\n                val.as_bytes().len(),\n                ErrorKind::HeaderValueTooLong.into(),\n            )?);\n            buffer.put_slice(&val.as_bytes()[..]);\n        }\n        Timestamp(time) => {\n            buffer.put_u8(TYPE_TIMESTAMP);\n            buffer.put_i64(\n                time.to_millis()\n                    .map_err(|_| ErrorKind::TimestampValueTooLarge(*time))?,\n            );\n        }\n        Uuid(val) => {\n            buffer.put_u8(TYPE_UUID);\n            buffer.put_u128(*val);\n        }\n        _ => {\n            panic!(\"matched on unexpected variant in `aws_smithy_types::event_stream::HeaderValue`\")\n        }\n    }\n    Ok(())\n}\n\n/// Reads a header from the given `buffer`.\nfn read_header_from<B: Buf>(mut buffer: B) -> Result<(Header, usize), Error> {\n    if buffer.remaining() < MIN_HEADER_LEN {\n        return Err(ErrorKind::InvalidHeadersLength.into());\n    }\n\n    let mut counting_buf = CountBuf::new(&mut buffer);\n    let name_len = counting_buf.get_u8();\n    if name_len as usize >= counting_buf.remaining() {\n        return Err(ErrorKind::InvalidHeaderNameLength.into());\n    }\n\n    let name: StrBytes = counting_buf\n        .copy_to_bytes(name_len as usize)\n        .try_into()\n        .map_err(|_| ErrorKind::InvalidUtf8String)?;\n    let value = read_header_value_from(&mut counting_buf)?;\n    Ok((Header::new(name, value), counting_buf.into_count()))\n}\n\n/// Writes the header to the given `buffer`.\nfn write_header_to<B: BufMut>(header: &Header, mut buffer: B) -> Result<(), Error> {\n    if header.name().as_bytes().len() > MAX_HEADER_NAME_LEN {\n        return Err(ErrorKind::InvalidHeaderNameLength.into());\n    }\n\n    buffer.put_u8(u8::try_from(header.name().as_bytes().len()).expect(\"bounds check above\"));\n    buffer.put_slice(&header.name().as_bytes()[..]);\n    write_header_value_to(header.value(), buffer)\n}\n\n/// Writes the given `headers` to a `buffer`.\npub fn write_headers_to<B: BufMut>(headers: &[Header], mut buffer: B) -> Result<(), Error> {\n    for header in headers {\n        write_header_to(header, &mut buffer)?;\n    }\n    Ok(())\n}\n\n// Returns (total_len, header_len)\nfn read_prelude_from<B: Buf>(mut buffer: B) -> Result<(u32, u32), Error> {\n    let mut crc_buffer = CrcBuf::new(&mut buffer);\n\n    // If the buffer doesn't have the entire, then error\n    let total_len = crc_buffer.get_u32();\n    if crc_buffer.remaining() + size_of::<u32>() < total_len as usize {\n        return Err(ErrorKind::InvalidMessageLength.into());\n    }\n\n    // Validate the prelude\n    let header_len = crc_buffer.get_u32();\n    let (expected_crc, prelude_crc) = (crc_buffer.into_crc(), buffer.get_u32());\n    if expected_crc != prelude_crc {\n        return Err(ErrorKind::PreludeChecksumMismatch(expected_crc, prelude_crc).into());\n    }\n    // The header length can be 0 or >= 2, but must fit within the frame size\n    if header_len == 1 || header_len > max_header_len(total_len)? {\n        return Err(ErrorKind::InvalidHeadersLength.into());\n    }\n    Ok((total_len, header_len))\n}\n\n/// Reads a message from the given `buffer`. For streaming use cases, use\n/// the [`MessageFrameDecoder`] instead of this.\npub fn read_message_from<B: Buf>(mut buffer: B) -> Result<Message, Error> {\n    if buffer.remaining() < PRELUDE_LENGTH_BYTES_USIZE {\n        return Err(ErrorKind::InvalidMessageLength.into());\n    }\n\n    // Calculate a CRC as we go and read the prelude\n    let mut crc_buffer = CrcBuf::new(&mut buffer);\n    let (total_len, header_len) = read_prelude_from(&mut crc_buffer)?;\n\n    // Verify we have the full frame before continuing\n    let remaining_len = total_len\n        .checked_sub(PRELUDE_LENGTH_BYTES)\n        .ok_or_else(|| Error::from(ErrorKind::InvalidMessageLength))?;\n    if crc_buffer.remaining() < remaining_len as usize {\n        return Err(ErrorKind::InvalidMessageLength.into());\n    }\n\n    // Read headers\n    let mut header_bytes_read = 0;\n    let mut headers = Vec::new();\n    while header_bytes_read < header_len as usize {\n        let (header, bytes_read) = read_header_from(&mut crc_buffer)?;\n        header_bytes_read += bytes_read;\n        if header_bytes_read > header_len as usize {\n            return Err(ErrorKind::InvalidHeaderValue.into());\n        }\n        headers.push(header);\n    }\n\n    // Read payload\n    let payload_len = payload_len(total_len, header_len)?;\n    let payload = crc_buffer.copy_to_bytes(payload_len as usize);\n\n    let expected_crc = crc_buffer.into_crc();\n    let message_crc = buffer.get_u32();\n    if expected_crc != message_crc {\n        return Err(ErrorKind::MessageChecksumMismatch(expected_crc, message_crc).into());\n    }\n\n    Ok(Message::new_from_parts(headers, payload))\n}\n\n/// Writes the `message` to the given `buffer`.\npub fn write_message_to(message: &Message, buffer: &mut dyn BufMut) -> Result<(), Error> {\n    let mut headers = Vec::new();\n    for header in message.headers() {\n        write_header_to(header, &mut headers)?;\n    }\n\n    let headers_len = checked(headers.len(), ErrorKind::HeadersTooLong.into())?;\n    let payload_len = checked(message.payload().len(), ErrorKind::PayloadTooLong.into())?;\n    let message_len = [\n        PRELUDE_LENGTH_BYTES,\n        headers_len,\n        payload_len,\n        MESSAGE_CRC_LENGTH_BYTES,\n    ]\n    .iter()\n    .try_fold(0u32, |acc, v| {\n        acc.checked_add(*v)\n            .ok_or_else(|| Error::from(ErrorKind::MessageTooLong))\n    })?;\n\n    let mut crc_buffer = CrcBufMut::new(buffer);\n    crc_buffer.put_u32(message_len);\n    crc_buffer.put_u32(headers_len);\n    crc_buffer.put_crc();\n    crc_buffer.put(&headers[..]);\n    crc_buffer.put(&message.payload()[..]);\n    crc_buffer.put_crc();\n    Ok(())\n}\n\nfn checked<T: TryFrom<U>, U>(from: U, err: Error) -> Result<T, Error> {\n    T::try_from(from).map_err(|_| err)\n}\n\nfn max_header_len(total_len: u32) -> Result<u32, Error> {\n    total_len\n        .checked_sub(PRELUDE_LENGTH_BYTES + MESSAGE_CRC_LENGTH_BYTES)\n        .ok_or_else(|| Error::from(ErrorKind::InvalidMessageLength))\n}\n\nfn payload_len(total_len: u32, header_len: u32) -> Result<u32, Error> {\n    total_len\n        .checked_sub(\n            header_len\n                .checked_add(PRELUDE_LENGTH_BYTES + MESSAGE_CRC_LENGTH_BYTES)\n                .ok_or_else(|| Error::from(ErrorKind::InvalidHeadersLength))?,\n        )\n        .ok_or_else(|| Error::from(ErrorKind::InvalidMessageLength))\n}\n\n#[cfg(test)]\nmod message_tests {\n    use super::read_message_from;\n    use crate::error::ErrorKind;\n    use crate::frame::{write_message_to, Header, HeaderValue, Message};\n    use aws_smithy_types::DateTime;\n    use bytes::Bytes;\n\n    macro_rules! read_message_expect_err {\n        ($bytes:expr, $err:pat) => {\n            let result = read_message_from(&mut Bytes::from_static($bytes));\n            let result = result.as_ref();\n            assert!(result.is_err(), \"Expected error, got {:?}\", result);\n            assert!(\n                matches!(result.err().unwrap().kind(), $err),\n                \"Expected {}, got {:?}\",\n                stringify!($err),\n                result\n            );\n        };\n    }\n\n    #[test]\n    fn invalid_messages() {\n        read_message_expect_err!(\n            include_bytes!(\"../test_data/invalid_header_string_value_length\"),\n            ErrorKind::InvalidHeaderValue\n        );\n        read_message_expect_err!(\n            include_bytes!(\"../test_data/invalid_header_string_length_cut_off\"),\n            ErrorKind::InvalidHeaderValue\n        );\n        read_message_expect_err!(\n            include_bytes!(\"../test_data/invalid_header_value_type\"),\n            ErrorKind::InvalidHeaderValueType(0x60)\n        );\n        read_message_expect_err!(\n            include_bytes!(\"../test_data/invalid_header_name_length\"),\n            ErrorKind::InvalidHeaderNameLength\n        );\n        read_message_expect_err!(\n            include_bytes!(\"../test_data/invalid_headers_length\"),\n            ErrorKind::InvalidHeadersLength\n        );\n        read_message_expect_err!(\n            include_bytes!(\"../test_data/invalid_prelude_checksum\"),\n            ErrorKind::PreludeChecksumMismatch(0x8BB495FB, 0xDEADBEEF)\n        );\n        read_message_expect_err!(\n            include_bytes!(\"../test_data/invalid_message_checksum\"),\n            ErrorKind::MessageChecksumMismatch(0x01a05860, 0xDEADBEEF)\n        );\n        read_message_expect_err!(\n            include_bytes!(\"../test_data/invalid_header_name_length_too_long\"),\n            ErrorKind::InvalidUtf8String\n        );\n    }\n\n    #[test]\n    fn read_message_no_headers() {\n        // Test message taken from the CRT:\n        // https://github.com/awslabs/aws-c-event-stream/blob/main/tests/message_deserializer_test.c\n        let data: &'static [u8] = &[\n            0x00, 0x00, 0x00, 0x1D, 0x00, 0x00, 0x00, 0x00, 0xfd, 0x52, 0x8c, 0x5a, 0x7b, 0x27,\n            0x66, 0x6f, 0x6f, 0x27, 0x3a, 0x27, 0x62, 0x61, 0x72, 0x27, 0x7d, 0xc3, 0x65, 0x39,\n            0x36,\n        ];\n\n        let result = read_message_from(&mut Bytes::from_static(data)).unwrap();\n        assert_eq!(result.headers(), Vec::new());\n\n        let expected_payload = b\"{'foo':'bar'}\";\n        assert_eq!(expected_payload, result.payload().as_ref());\n    }\n\n    #[test]\n    fn read_message_one_header() {\n        // Test message taken from the CRT:\n        // https://github.com/awslabs/aws-c-event-stream/blob/main/tests/message_deserializer_test.c\n        let data: &'static [u8] = &[\n            0x00, 0x00, 0x00, 0x3D, 0x00, 0x00, 0x00, 0x20, 0x07, 0xFD, 0x83, 0x96, 0x0C, b'c',\n            b'o', b'n', b't', b'e', b'n', b't', b'-', b't', b'y', b'p', b'e', 0x07, 0x00, 0x10,\n            b'a', b'p', b'p', b'l', b'i', b'c', b'a', b't', b'i', b'o', b'n', b'/', b'j', b's',\n            b'o', b'n', 0x7b, 0x27, 0x66, 0x6f, 0x6f, 0x27, 0x3a, 0x27, 0x62, 0x61, 0x72, 0x27,\n            0x7d, 0x8D, 0x9C, 0x08, 0xB1,\n        ];\n\n        let result = read_message_from(&mut Bytes::from_static(data)).unwrap();\n        assert_eq!(\n            result.headers(),\n            vec![Header::new(\n                \"content-type\",\n                HeaderValue::String(\"application/json\".into())\n            )]\n        );\n\n        let expected_payload = b\"{'foo':'bar'}\";\n        assert_eq!(expected_payload, result.payload().as_ref());\n    }\n\n    #[test]\n    fn read_all_headers_and_payload() {\n        let message = include_bytes!(\"../test_data/valid_with_all_headers_and_payload\");\n        let result = read_message_from(&mut Bytes::from_static(message)).unwrap();\n        assert_eq!(\n            result.headers(),\n            vec![\n                Header::new(\"true\", HeaderValue::Bool(true)),\n                Header::new(\"false\", HeaderValue::Bool(false)),\n                Header::new(\"byte\", HeaderValue::Byte(50)),\n                Header::new(\"short\", HeaderValue::Int16(20_000)),\n                Header::new(\"int\", HeaderValue::Int32(500_000)),\n                Header::new(\"long\", HeaderValue::Int64(50_000_000_000)),\n                Header::new(\n                    \"bytes\",\n                    HeaderValue::ByteArray(Bytes::from(&b\"some bytes\"[..]))\n                ),\n                Header::new(\"str\", HeaderValue::String(\"some str\".into())),\n                Header::new(\n                    \"time\",\n                    HeaderValue::Timestamp(DateTime::from_secs(5_000_000))\n                ),\n                Header::new(\n                    \"uuid\",\n                    HeaderValue::Uuid(0xb79bc914_de21_4e13_b8b2_bc47e85b7f0b)\n                ),\n            ]\n        );\n\n        assert_eq!(b\"some payload\", result.payload().as_ref());\n    }\n\n    #[test]\n    fn round_trip_all_headers_payload() {\n        let message = Message::new(&b\"some payload\"[..])\n            .add_header(Header::new(\"true\", HeaderValue::Bool(true)))\n            .add_header(Header::new(\"false\", HeaderValue::Bool(false)))\n            .add_header(Header::new(\"byte\", HeaderValue::Byte(50)))\n            .add_header(Header::new(\"short\", HeaderValue::Int16(20_000)))\n            .add_header(Header::new(\"int\", HeaderValue::Int32(500_000)))\n            .add_header(Header::new(\"long\", HeaderValue::Int64(50_000_000_000)))\n            .add_header(Header::new(\n                \"bytes\",\n                HeaderValue::ByteArray((&b\"some bytes\"[..]).into()),\n            ))\n            .add_header(Header::new(\"str\", HeaderValue::String(\"some str\".into())))\n            .add_header(Header::new(\n                \"time\",\n                HeaderValue::Timestamp(DateTime::from_secs(5_000_000)),\n            ))\n            .add_header(Header::new(\n                \"uuid\",\n                HeaderValue::Uuid(0xb79bc914_de21_4e13_b8b2_bc47e85b7f0b),\n            ));\n\n        let mut actual = Vec::new();\n        write_message_to(&message, &mut actual).unwrap();\n\n        let expected = include_bytes!(\"../test_data/valid_with_all_headers_and_payload\").to_vec();\n        assert_eq!(expected, actual);\n\n        let result = read_message_from(&mut Bytes::from(actual)).unwrap();\n        assert_eq!(message.headers(), result.headers());\n        assert_eq!(message.payload().as_ref(), result.payload().as_ref());\n    }\n}\n\n/// Return value from [`MessageFrameDecoder`].\n#[derive(Debug)]\npub enum DecodedFrame {\n    /// There wasn't enough data in the buffer to decode a full message.\n    Incomplete,\n    /// There was enough data in the buffer to decode.\n    Complete(Message),\n}\n\n/// Streaming decoder for decoding a [`Message`] from a stream.\n#[non_exhaustive]\n#[derive(Default, Debug)]\npub struct MessageFrameDecoder {\n    prelude: [u8; PRELUDE_LENGTH_BYTES_USIZE],\n    prelude_read: bool,\n}\n\nimpl MessageFrameDecoder {\n    /// Returns a new `MessageFrameDecoder`.\n    pub fn new() -> Self {\n        Default::default()\n    }\n\n    /// Determines if the `buffer` has enough data in it to read a full frame.\n    /// Returns `Ok(None)` if there's not enough data, or `Some(remaining)` where\n    /// `remaining` is the number of bytes after the prelude that belong to the\n    /// message that's in the buffer.\n    fn remaining_bytes_if_frame_available<B: Buf>(\n        &self,\n        buffer: &B,\n    ) -> Result<Option<usize>, Error> {\n        if self.prelude_read {\n            let remaining_len = (&self.prelude[..])\n                .get_u32()\n                .checked_sub(PRELUDE_LENGTH_BYTES)\n                .ok_or_else(|| Error::from(ErrorKind::InvalidMessageLength))?;\n            if buffer.remaining() >= remaining_len as usize {\n                return Ok(Some(remaining_len as usize));\n            }\n        }\n        Ok(None)\n    }\n\n    /// Resets the decoder.\n    fn reset(&mut self) {\n        self.prelude_read = false;\n        self.prelude = [0u8; PRELUDE_LENGTH_BYTES_USIZE];\n    }\n\n    /// Attempts to decode a [`Message`] from the given `buffer`. This function expects\n    /// to be called over and over again with more data in the buffer each time its called.\n    /// When there's not enough data to decode a message, it returns `Ok(None)`.\n    ///\n    /// Once there is enough data to read a message prelude, then it will mutate the `Buf`\n    /// position. The state from the reading of the prelude is stored in the decoder so that\n    /// the next call will be able to decode the entire message, even though the prelude\n    /// is no longer available in the `Buf`.\n    pub fn decode_frame<B: Buf>(&mut self, mut buffer: B) -> Result<DecodedFrame, Error> {\n        if !self.prelude_read && buffer.remaining() >= PRELUDE_LENGTH_BYTES_USIZE {\n            buffer.copy_to_slice(&mut self.prelude);\n            self.prelude_read = true;\n        }\n\n        if let Some(remaining_len) = self.remaining_bytes_if_frame_available(&buffer)? {\n            let mut message_buf = (&self.prelude[..]).chain(buffer.take(remaining_len));\n            let result = read_message_from(&mut message_buf).map(DecodedFrame::Complete);\n            self.reset();\n            return result;\n        }\n\n        Ok(DecodedFrame::Incomplete)\n    }\n}\n\n#[cfg(test)]\nmod message_frame_decoder_tests {\n    use super::{DecodedFrame, MessageFrameDecoder};\n    use crate::frame::read_message_from;\n    use bytes::Bytes;\n    use bytes_utils::SegmentedBuf;\n\n    #[test]\n    fn single_streaming_message() {\n        let message = include_bytes!(\"../test_data/valid_with_all_headers_and_payload\");\n\n        let mut decoder = MessageFrameDecoder::new();\n        let mut segmented = SegmentedBuf::new();\n        for i in 0..(message.len() - 1) {\n            segmented.push(&message[i..(i + 1)]);\n            if let DecodedFrame::Complete(_) = decoder.decode_frame(&mut segmented).unwrap() {\n                panic!(\"incomplete frame shouldn't result in message\");\n            }\n        }\n\n        segmented.push(&message[(message.len() - 1)..]);\n        match decoder.decode_frame(&mut segmented).unwrap() {\n            DecodedFrame::Incomplete => panic!(\"frame should be complete now\"),\n            DecodedFrame::Complete(actual) => {\n                let expected = read_message_from(&mut Bytes::from_static(message)).unwrap();\n                assert_eq!(expected, actual);\n            }\n        }\n    }\n\n    fn multiple_streaming_messages_chunk_size(chunk_size: usize) {\n        let message1 = include_bytes!(\"../test_data/valid_with_all_headers_and_payload\");\n        let message2 = include_bytes!(\"../test_data/valid_empty_payload\");\n        let message3 = include_bytes!(\"../test_data/valid_no_headers\");\n        let mut repeated = message1.to_vec();\n        repeated.extend_from_slice(message2);\n        repeated.extend_from_slice(message3);\n\n        let mut decoder = MessageFrameDecoder::new();\n        let mut segmented = SegmentedBuf::new();\n        let mut decoded = Vec::new();\n        for window in repeated.chunks(chunk_size) {\n            segmented.push(window);\n            match dbg!(decoder.decode_frame(&mut segmented)).unwrap() {\n                DecodedFrame::Incomplete => {}\n                DecodedFrame::Complete(message) => {\n                    decoded.push(message);\n                }\n            }\n        }\n\n        let expected1 = read_message_from(&mut Bytes::from_static(message1)).unwrap();\n        let expected2 = read_message_from(&mut Bytes::from_static(message2)).unwrap();\n        let expected3 = read_message_from(&mut Bytes::from_static(message3)).unwrap();\n        assert_eq!(3, decoded.len());\n        assert_eq!(expected1, decoded[0]);\n        assert_eq!(expected2, decoded[1]);\n        assert_eq!(expected3, decoded[2]);\n    }\n\n    #[test]\n    fn multiple_streaming_messages() {\n        for chunk_size in 1..=11 {\n            println!(\"chunk size: {chunk_size}\");\n            multiple_streaming_messages_chunk_size(chunk_size);\n        }\n    }\n}\n\n#[cfg(test)]\nmod deferred_signer_tests {\n    use crate::frame::{DeferredSigner, Header, HeaderValue, Message, SignMessage};\n    use bytes::Bytes;\n\n    fn check_send_sync<T: Send + Sync>(value: T) -> T {\n        value\n    }\n\n    #[test]\n    fn deferred_signer() {\n        #[derive(Default, Debug)]\n        struct TestSigner {\n            call_num: i32,\n        }\n        impl SignMessage for TestSigner {\n            fn sign(\n                &mut self,\n                message: Message,\n            ) -> Result<Message, crate::frame::SignMessageError> {\n                self.call_num += 1;\n                Ok(message.add_header(Header::new(\"call_num\", HeaderValue::Int32(self.call_num))))\n            }\n\n            fn sign_empty(&mut self) -> Option<Result<Message, crate::frame::SignMessageError>> {\n                None\n            }\n        }\n\n        let (mut signer, sender) = check_send_sync(DeferredSigner::new());\n\n        sender.send(Box::<TestSigner>::default()).expect(\"success\");\n\n        let message = signer.sign(Message::new(Bytes::new())).expect(\"success\");\n        assert_eq!(1, message.headers()[0].value().as_int32().unwrap());\n\n        let message = signer.sign(Message::new(Bytes::new())).expect(\"success\");\n        assert_eq!(2, message.headers()[0].value().as_int32().unwrap());\n\n        assert!(signer.sign_empty().is_none());\n    }\n\n    #[test]\n    fn deferred_signer_defaults_to_noop_signer() {\n        let (mut signer, _sender) = DeferredSigner::new();\n        assert_eq!(\n            Message::new(Bytes::new()),\n            signer.sign(Message::new(Bytes::new())).unwrap()\n        );\n        assert!(signer.sign_empty().is_none());\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-eventstream/src/lib.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/* Automatically managed default lints */\n#![cfg_attr(docsrs, feature(doc_cfg))]\n/* End of automatically managed default lints */\n#![allow(clippy::derive_partial_eq_without_eq)]\n#![warn(\n    // missing_docs,\n    rustdoc::missing_crate_level_docs,\n    unreachable_pub,\n    rust_2018_idioms\n)]\n\n//! AWS Event Stream frame serialization/deserialization implementation.\n\n#[cfg(feature = \"derive-arbitrary\")]\npub mod arbitrary;\nmod buf;\npub mod error;\npub mod frame;\npub mod message_size_hint;\npub mod smithy;\n#[cfg(feature = \"test-util\")]\npub mod test_util;\n"
  },
  {
    "path": "rust-runtime/aws-smithy-eventstream/src/message_size_hint.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Provides size hint functionality for Event Stream messages to optimize buffer allocation.\n\nuse aws_smithy_types::event_stream::{HeaderValue, Message};\nuse std::mem::size_of;\n\n/// Extension trait that provides size hint functionality for Event Stream messages.\n///\n/// This trait allows callers to get an accurate estimate of the serialized size\n/// of a message before serialization, enabling optimal buffer pre-allocation.\npub trait MessageSizeHint {\n    /// Returns an estimate of the serialized size of this message in bytes.\n    ///\n    /// This provides a hint for buffer allocation to improve performance when\n    /// serializing the message. The estimate includes the message prelude,\n    /// headers, payload, and CRC checksums.\n    ///\n    /// # Examples\n    ///\n    /// ```\n    /// use aws_smithy_types::event_stream::{Header, HeaderValue, Message};\n    /// use aws_smithy_eventstream::message_size_hint::MessageSizeHint;\n    /// use bytes::Bytes;\n    ///\n    /// let message = Message::new(Bytes::from(b\"hello world\".to_vec()))\n    ///     .add_header(Header::new(\"content-type\", HeaderValue::String(\"text/plain\".into())));\n    ///\n    /// let size_hint = message.size_hint();\n    /// // Use the size hint to pre-allocate a buffer\n    /// let mut buffer: Vec<u8> = Vec::with_capacity(size_hint);\n    /// ```\n    fn size_hint(&self) -> usize;\n}\n\nimpl MessageSizeHint for Message {\n    fn size_hint(&self) -> usize {\n        // Constants from the frame format\n        const PRELUDE_LENGTH_BYTES: usize = 3 * size_of::<u32>();\n        const MESSAGE_CRC_LENGTH_BYTES: usize = size_of::<u32>();\n        const MAX_HEADER_NAME_LEN: usize = 255;\n\n        // Calculate headers size\n        let mut headers_len = 0;\n        for header in self.headers() {\n            let name_len = header.name().as_bytes().len().min(MAX_HEADER_NAME_LEN);\n            headers_len += 1 + name_len; // name length byte + name bytes\n\n            // Add header value size based on type\n            headers_len += match header.value() {\n                HeaderValue::Bool(_) => 1,                            // type byte only\n                HeaderValue::Byte(_) => 2,                            // type + value\n                HeaderValue::Int16(_) => 3,                           // type + value\n                HeaderValue::Int32(_) => 5,                           // type + value\n                HeaderValue::Int64(_) => 9,                           // type + value\n                HeaderValue::ByteArray(val) => 3 + val.len(),         // type + length + data\n                HeaderValue::String(val) => 3 + val.as_bytes().len(), // type + length + data\n                HeaderValue::Timestamp(_) => 9,                       // type + value\n                HeaderValue::Uuid(_) => 17,                           // type + value\n                _ => 0, // Handle any future header value types conservatively\n            };\n        }\n\n        let payload_len = self.payload().len();\n\n        // Total message size: prelude + headers + payload + message CRC\n        PRELUDE_LENGTH_BYTES + headers_len + payload_len + MESSAGE_CRC_LENGTH_BYTES\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use crate::frame::write_message_to;\n    use aws_smithy_types::event_stream::{Header, HeaderValue, Message};\n    use bytes::Bytes;\n\n    #[test]\n    fn test_size_hint_accuracy() {\n        // Test cases with different message configurations\n        let test_cases = vec![\n            // Simple message with small payload\n            Message::new(Bytes::from(b\"hello world\".to_vec())),\n            // Message with headers\n            Message::new(Bytes::from(b\"test payload\".to_vec())).add_header(Header::new(\n                \"content-type\",\n                HeaderValue::String(\"application/json\".into()),\n            )),\n            // Message with multiple headers and different value types\n            Message::new(Bytes::from(b\"complex test\".to_vec()))\n                .add_header(Header::new(\"bool-true\", HeaderValue::Bool(true)))\n                .add_header(Header::new(\"bool-false\", HeaderValue::Bool(false)))\n                .add_header(Header::new(\"byte-val\", HeaderValue::Byte(42)))\n                .add_header(Header::new(\"int16-val\", HeaderValue::Int16(12345)))\n                .add_header(Header::new(\"int32-val\", HeaderValue::Int32(987654321)))\n                .add_header(Header::new(\n                    \"int64-val\",\n                    HeaderValue::Int64(1234567890123456789),\n                ))\n                .add_header(Header::new(\n                    \"string-val\",\n                    HeaderValue::String(\"hello world\".into()),\n                ))\n                .add_header(Header::new(\n                    \"bytes-val\",\n                    HeaderValue::ByteArray(Bytes::from(b\"binary data\".to_vec())),\n                )),\n            // Empty payload\n            Message::new(Bytes::new()),\n            // Large payload (1KB)\n            Message::new(Bytes::from(vec![0u8; 1024])).add_header(Header::new(\n                \"large-content\",\n                HeaderValue::String(\"large payload test\".into()),\n            )),\n        ];\n\n        for (i, message) in test_cases.iter().enumerate() {\n            let size_hint = message.size_hint();\n\n            // Get actual serialized size\n            let mut buffer = Vec::new();\n            write_message_to(message, &mut buffer)\n                .unwrap_or_else(|_| panic!(\"Failed to serialize test case {i}\"));\n            let actual_size = buffer.len();\n\n            // The size hint should exactly match the actual serialized size\n            assert_eq!(\n                size_hint, actual_size,\n                \"Size hint mismatch for test case {i}: hint={size_hint}, actual={actual_size}\"\n            );\n        }\n    }\n\n    #[test]\n    fn test_size_hint_with_long_header_name() {\n        // Test with a header name that's near the maximum length\n        let long_name = \"x\".repeat(200); // Long but valid header name\n        let message = Message::new(Bytes::from(b\"payload\".to_vec())).add_header(Header::new(\n            long_name,\n            HeaderValue::String(\"long header name test\".into()),\n        ));\n\n        let size_hint = message.size_hint();\n\n        let mut buffer = Vec::new();\n        write_message_to(&message, &mut buffer)\n            .expect(\"Failed to serialize message with long header name\");\n        let actual_size = buffer.len();\n\n        assert_eq!(\n            size_hint, actual_size,\n            \"Size hint should match actual size for long header names\"\n        );\n    }\n\n    #[test]\n    fn test_size_hint_performance_benefit() {\n        // Create a message with 1KB payload\n        let message = Message::new(Bytes::from(vec![0u8; 1024])).add_header(Header::new(\n            \"content-type\",\n            HeaderValue::String(\"application/json\".into()),\n        ));\n\n        let size_hint = message.size_hint();\n\n        // Verify that using size hint for pre-allocation works\n        let mut buffer = Vec::with_capacity(size_hint);\n        write_message_to(&message, &mut buffer).expect(\"Failed to serialize message\");\n\n        // The buffer should not have needed to reallocate\n        assert!(\n            buffer.capacity() >= buffer.len(),\n            \"Buffer should have sufficient capacity\"\n        );\n\n        // The size hint should be reasonably close to actual size\n        assert_eq!(\n            size_hint,\n            buffer.len(),\n            \"Size hint should exactly match serialized size\"\n        );\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-eventstream/src/smithy.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::error::{Error, ErrorKind};\nuse aws_smithy_types::event_stream::{Header, HeaderValue, Message};\nuse aws_smithy_types::str_bytes::StrBytes;\nuse aws_smithy_types::{Blob, DateTime};\n\nmacro_rules! expect_shape_fn {\n    (fn $fn_name:ident[$val_typ:ident] -> $result_typ:ident { $val_name:ident -> $val_expr:expr }) => {\n        #[doc = \"Expects that `header` is a `\"]\n        #[doc = stringify!($result_typ)]\n        #[doc = \"`.\"]\n        pub fn $fn_name(header: &Header) -> Result<$result_typ, Error> {\n            match header.value() {\n                HeaderValue::$val_typ($val_name) => Ok($val_expr),\n                _ => Err(ErrorKind::Unmarshalling(format!(\n                    \"expected '{}' header value to be {}\",\n                    header.name().as_str(),\n                    stringify!($val_typ)\n                ))\n                .into()),\n            }\n        }\n    };\n}\n\nexpect_shape_fn!(fn expect_bool[Bool] -> bool { value -> *value });\nexpect_shape_fn!(fn expect_byte[Byte] -> i8 { value -> *value });\nexpect_shape_fn!(fn expect_int16[Int16] -> i16 { value -> *value });\nexpect_shape_fn!(fn expect_int32[Int32] -> i32 { value -> *value });\nexpect_shape_fn!(fn expect_int64[Int64] -> i64 { value -> *value });\nexpect_shape_fn!(fn expect_byte_array[ByteArray] -> Blob { bytes -> Blob::new(bytes.as_ref()) });\nexpect_shape_fn!(fn expect_string[String] -> String { value -> value.as_str().into() });\nexpect_shape_fn!(fn expect_timestamp[Timestamp] -> DateTime { value -> *value });\n\n/// Structured header data from a [`Message`]\n#[derive(Debug)]\npub struct ResponseHeaders<'a> {\n    /// Content Type of the message\n    ///\n    /// This can be a number of things depending on the protocol. For example, if the protocol is\n    /// AwsJson1, then this could be `application/json`, or `application/xml` for RestXml.\n    ///\n    /// It will be `application/octet-stream` if there is a Blob payload shape, and `text/plain` if\n    /// there is a String payload shape.\n    pub content_type: Option<&'a StrBytes>,\n\n    /// Message Type field\n    ///\n    /// This field is used to distinguish between events where the value is `event` and errors where\n    /// the value is `exception`\n    pub message_type: &'a StrBytes,\n\n    /// Smithy Type field\n    ///\n    /// This field is used to determine which of the possible union variants that this message represents\n    pub smithy_type: &'a StrBytes,\n}\n\nimpl ResponseHeaders<'_> {\n    /// Content-Type for this message\n    pub fn content_type(&self) -> Option<&str> {\n        self.content_type.map(|ct| ct.as_str())\n    }\n}\n\nfn expect_header_str_value<'a>(\n    header: Option<&'a Header>,\n    name: &str,\n) -> Result<&'a StrBytes, Error> {\n    match header {\n        Some(header) => Ok(header.value().as_string().map_err(|value| {\n            Error::from(ErrorKind::Unmarshalling(format!(\n                \"expected response {name} header to be string, received {value:?}\"\n            )))\n        })?),\n        None => Err(ErrorKind::Unmarshalling(format!(\n            \"expected response to include {name} header, but it was missing\"\n        ))\n        .into()),\n    }\n}\n\n/// Parse headers from [`Message`]\n///\n/// `:content-type`, `:message-type`, `:event-type`, and `:exception-type` headers will be parsed.\n/// If any headers are invalid or missing, an error will be returned.\npub fn parse_response_headers(message: &Message) -> Result<ResponseHeaders<'_>, Error> {\n    let (mut content_type, mut message_type, mut event_type, mut exception_type) =\n        (None, None, None, None);\n    for header in message.headers() {\n        match header.name().as_str() {\n            \":content-type\" => content_type = Some(header),\n            \":message-type\" => message_type = Some(header),\n            \":event-type\" => event_type = Some(header),\n            \":exception-type\" => exception_type = Some(header),\n            _ => {}\n        }\n    }\n    let message_type = expect_header_str_value(message_type, \":message-type\")?;\n    Ok(ResponseHeaders {\n        content_type: content_type\n            .map(|ct| expect_header_str_value(Some(ct), \":content-type\"))\n            .transpose()?,\n        message_type,\n        smithy_type: if message_type.as_str() == \"event\" {\n            expect_header_str_value(event_type, \":event-type\")?\n        } else if message_type.as_str() == \"exception\" {\n            expect_header_str_value(exception_type, \":exception-type\")?\n        } else {\n            return Err(ErrorKind::Unmarshalling(format!(\n                \"unrecognized `:message-type`: {}\",\n                message_type.as_str()\n            ))\n            .into());\n        },\n    })\n}\n\n#[cfg(test)]\nmod tests {\n    use super::parse_response_headers;\n    use aws_smithy_types::event_stream::{Header, HeaderValue, Message};\n\n    #[test]\n    fn normal_message() {\n        let message = Message::new(&b\"test\"[..])\n            .add_header(Header::new(\n                \":event-type\",\n                HeaderValue::String(\"Foo\".into()),\n            ))\n            .add_header(Header::new(\n                \":content-type\",\n                HeaderValue::String(\"application/json\".into()),\n            ))\n            .add_header(Header::new(\n                \":message-type\",\n                HeaderValue::String(\"event\".into()),\n            ));\n        let parsed = parse_response_headers(&message).unwrap();\n        assert_eq!(\"Foo\", parsed.smithy_type.as_str());\n        assert_eq!(Some(\"application/json\"), parsed.content_type());\n        assert_eq!(\"event\", parsed.message_type.as_str());\n    }\n\n    #[test]\n    fn error_message() {\n        let message = Message::new(&b\"test\"[..])\n            .add_header(Header::new(\n                \":exception-type\",\n                HeaderValue::String(\"BadRequestException\".into()),\n            ))\n            .add_header(Header::new(\n                \":content-type\",\n                HeaderValue::String(\"application/json\".into()),\n            ))\n            .add_header(Header::new(\n                \":message-type\",\n                HeaderValue::String(\"exception\".into()),\n            ));\n        let parsed = parse_response_headers(&message).unwrap();\n        assert_eq!(\"BadRequestException\", parsed.smithy_type.as_str());\n        assert_eq!(Some(\"application/json\"), parsed.content_type());\n        assert_eq!(\"exception\", parsed.message_type.as_str());\n    }\n\n    #[test]\n    fn missing_exception_type() {\n        let message = Message::new(&b\"test\"[..])\n            .add_header(Header::new(\n                \":content-type\",\n                HeaderValue::String(\"application/json\".into()),\n            ))\n            .add_header(Header::new(\n                \":message-type\",\n                HeaderValue::String(\"exception\".into()),\n            ));\n        let error = parse_response_headers(&message).err().unwrap().to_string();\n        assert_eq!(\n            \"failed to unmarshall message: expected response to include :exception-type \\\n             header, but it was missing\",\n            error\n        );\n    }\n\n    #[test]\n    fn missing_event_type() {\n        let message = Message::new(&b\"test\"[..])\n            .add_header(Header::new(\n                \":content-type\",\n                HeaderValue::String(\"application/json\".into()),\n            ))\n            .add_header(Header::new(\n                \":message-type\",\n                HeaderValue::String(\"event\".into()),\n            ));\n        let error = parse_response_headers(&message).err().unwrap().to_string();\n        assert_eq!(\n            \"failed to unmarshall message: expected response to include :event-type \\\n             header, but it was missing\",\n            error\n        );\n    }\n\n    #[test]\n    fn missing_content_type() {\n        let message = Message::new(&b\"test\"[..])\n            .add_header(Header::new(\n                \":event-type\",\n                HeaderValue::String(\"Foo\".into()),\n            ))\n            .add_header(Header::new(\n                \":message-type\",\n                HeaderValue::String(\"event\".into()),\n            ));\n        let parsed = parse_response_headers(&message).ok().unwrap();\n        assert_eq!(None, parsed.content_type);\n        assert_eq!(\"Foo\", parsed.smithy_type.as_str());\n        assert_eq!(\"event\", parsed.message_type.as_str());\n    }\n\n    #[test]\n    fn content_type_wrong_type() {\n        let message = Message::new(&b\"test\"[..])\n            .add_header(Header::new(\n                \":event-type\",\n                HeaderValue::String(\"Foo\".into()),\n            ))\n            .add_header(Header::new(\":content-type\", HeaderValue::Int32(16)))\n            .add_header(Header::new(\n                \":message-type\",\n                HeaderValue::String(\"event\".into()),\n            ));\n        let error = parse_response_headers(&message).err().unwrap().to_string();\n        assert_eq!(\n            \"failed to unmarshall message: expected response :content-type \\\n             header to be string, received Int32(16)\",\n            error\n        );\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-eventstream/src/test_util.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::frame::{read_message_from, DecodedFrame, MessageFrameDecoder};\nuse aws_smithy_types::event_stream::{HeaderValue, Message};\nuse std::collections::{BTreeMap, BTreeSet};\nuse std::error::Error as StdError;\n\n/// Validate that the bodies match, which includes headers and messages\n///\n/// When `full_stream` is true, it also verifies the length of frames\npub fn validate_body(\n    expected_body: &[u8],\n    actual_body: &[u8],\n    full_stream: bool,\n) -> Result<(), Box<dyn StdError>> {\n    let expected_frames = decode_frames(expected_body);\n    let actual_frames = decode_frames(actual_body);\n\n    if full_stream {\n        assert_eq!(\n            expected_frames.len(),\n            actual_frames.len(),\n            \"Frame count didn't match.\\n\\\n        Expected: {expected_frames:?}\\n\\\n        Actual:   {actual_frames:?}\",\n        );\n    }\n\n    for ((expected_wrapper, expected_message), (actual_wrapper, actual_message)) in\n        expected_frames.into_iter().zip(actual_frames.into_iter())\n    {\n        assert_eq!(\n            header_names(&expected_wrapper),\n            header_names(&actual_wrapper)\n        );\n        if let Some(expected_message) = expected_message {\n            let actual_message = actual_message.unwrap();\n            assert_eq!(header_map(&expected_message), header_map(&actual_message));\n            assert_eq!(expected_message.payload(), actual_message.payload());\n        }\n    }\n    Ok(())\n}\n\n// Returned tuples are (SignedWrapperMessage, WrappedMessage).\n// Some signed messages don't have payloads, so in those cases, the wrapped message will be None.\nfn decode_frames(mut body: &[u8]) -> Vec<(Message, Option<Message>)> {\n    let mut result = Vec::new();\n    let mut decoder = MessageFrameDecoder::new();\n    while let DecodedFrame::Complete(msg) = decoder.decode_frame(&mut body).unwrap() {\n        let inner_msg = if msg.payload().is_empty() {\n            None\n        } else {\n            Some(read_message_from(msg.payload().as_ref()).unwrap())\n        };\n        result.push((msg, inner_msg));\n    }\n    result\n}\n\nfn header_names(msg: &Message) -> BTreeSet<String> {\n    msg.headers()\n        .iter()\n        .map(|h| h.name().as_str().into())\n        .collect()\n}\nfn header_map(msg: &Message) -> BTreeMap<String, &HeaderValue> {\n    msg.headers()\n        .iter()\n        .map(|h| (h.name().as_str().to_string(), h.value()))\n        .collect()\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-experimental/Cargo.toml",
    "content": "[package]\nname = \"aws-smithy-experimental\"\nversion = \"0.2.4\"\nauthors = [\"AWS Rust SDK Team <aws-sdk-rust@amazon.com>\"]\ndescription = \"Experiments for the smithy-rs ecosystem\"\nedition = \"2021\"\nlicense = \"Apache-2.0\"\nrepository = \"https://github.com/smithy-lang/smithy-rs\"\nrust-version = \"1.91.1\"\n\n[features]\ncrypto-ring = []\n\n[dependencies]\n\n[dev-dependencies]\n\n[package.metadata.docs.rs]\nall-features = true\ntargets = [\"x86_64-unknown-linux-gnu\"]\ncargo-args = [\"-Zunstable-options\", \"-Zrustdoc-scrape-examples\"]\nrustdoc-args = [\"--cfg\", \"docsrs\"]\n# End of docs.rs metadata\n"
  },
  {
    "path": "rust-runtime/aws-smithy-experimental/LICENSE",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n"
  },
  {
    "path": "rust-runtime/aws-smithy-experimental/README.md",
    "content": "# aws-smithy-experimental\n\nStaging ground for experimental new features in the smithy-rs ecosystem.\n\n### Hyper 1.0 Support\nThis crate allows customers to use Hyper 1.0. A valuable consequence of this is access to aws-lc-rs and its `FIPS` compliant crypto. This is available behind the `crypto-aws-lc-fips` feature. **Note**: FIPS support has somewhat [complex build requirements](https://github.com/aws/aws-lc/blob/main/BUILDING.md), namely CMake and Go.\n\n## Crate Stabilization\n\nThis crate adds support for Hyper 1.0 (see [examples](./examples)). There a few blockers before stablization:\n1. Expose an API for providing a custom connector. Currently, that API is not exposed because a shim layer is needed to avoid taking a hard dependency on hyper-util.\n2. Add support for poisoning connections in the connection pool. This API needs to be either backported into hyper-util or we need to establish our own client.\n\n<!-- anchor_start:footer -->\nThis crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator.\n<!-- anchor_end:footer -->\n"
  },
  {
    "path": "rust-runtime/aws-smithy-experimental/src/lib.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/* Automatically managed default lints */\n#![cfg_attr(docsrs, feature(doc_cfg))]\n/* End of automatically managed default lints */\n\n#[deprecated(\n    since = \"0.2.0\",\n    note = \"support for hyper-1.x is now enabled by the `aws-smithy-http-client` crate\"\n)]\npub mod hyper_1_0 {}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-fuzz/Cargo.toml",
    "content": "[workspace]\n[package]\nname = \"aws-smithy-fuzz\"\nversion = \"0.1.3\"\nauthors = [\"AWS Rust SDK Team <aws-sdk-rust@amazon.com>\"]\ndescription = \"Fuzzing utilities for smithy-rs servers\"\nedition = \"2021\"\nlicense = \"Apache-2.0\"\nrepository = \"https://github.com/smithy-lang/smithy-rs\"\nrust-version = \"1.91.1\"\n\n[dependencies]\nafl = \"0.15.10\"\narbitrary = { version = \"1.3.2\", features = [\"derive\"] }\nbincode = \"1\"\nbytes = \"1.11.1\"\ncargo_toml = \"0.20.4\"\ncbor-diag = \"0.1.12\"\nclap = { version = \"4.5.15\", features = [\"derive\"] }\nffi-support = \"0.4.4\"\nfutures = \"0.3.30\"\nglob = \"0.3.1\"\nhomedir = \"0.3\"\nhttp = \"1.3.1\"\nhttp-body = \"1.0.1\"\nhttp-body-util = \"0.1.3\"\nlazy_static = \"1.5.0\"\nlibloading = \"0.8.5\"\nserde = { version = \"1.0.228\", features = [\"derive\"] }\nserde_json = \"1.0.146\"\ntera = \"1.20.0\"\ntermcolor = \"1.4.1\"\ntokio = { version = \"1.49.0\", features = [\"sync\", \"rt\", \"rt-multi-thread\"] }\ntower = { version = \"0.4.13\", features = [\"util\"] }\ntracing = \"0.1.44\"\ntracing-subscriber = \"0.3.22\"\n\n[profile.release]\ndebug = true\n\n[package.metadata.docs.rs]\nall-features = true\ntargets = [\"x86_64-unknown-linux-gnu\"]\ncargo-args = [\"-Zunstable-options\", \"-Zrustdoc-scrape-examples\"]\nrustdoc-args = [\"--cfg\", \"docsrs\"]\n# End of docs.rs metadata\n"
  },
  {
    "path": "rust-runtime/aws-smithy-fuzz/LICENSE",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n"
  },
  {
    "path": "rust-runtime/aws-smithy-fuzz/README.md",
    "content": "# aws-smithy-fuzz\n\nAWS Smithy fuzz contains a set of utilities for writing fuzz tests against smithy-rs servers. This is part of our tooling to perform differential fuzzing against different versions of smithy-rs servers.\n\n## Installation\n1. Install `cargo afl`: `cargo install cargo-afl`\n2. Install the AFL runtime: `cargo afl config --build`\n2. Install the smithy CLI:\n2. Install `aws-smithy-fuzz`:\n    - Locally: `cargo afl install --path .`\n    - From crates.io: cargo afl install aws-smithy-fuzz\n   > **IMPORTANT**: This package MUST be installed with `cargo afl install` (instead of `cargo install`). If you do not use `afl`,\n   > you will get linking errors.\n\n## Usage\nThis contains a library + a CLI tool to fuzz smithy-rs servers. The library allows setting up a given smithy-rs server implementation as a `cdylib`. This allows two different versions two by dynamically linked at runtime and executed by the fuzzer.\n\nEach of these components are meant to be usable independently:\n1. The public APIs of `aws-smithy-fuzz` can be used to write your own fuzz targets without code generation.\n2. The `lexicon.json` can be used outside of this project to seed a fuzzer from a Smithy model.\n3. The fuzz driver can be used on other fuzz targets.\n\n### Setup\nFirst, you'll need to generate the 1 (or more) versions of a smithy-rs server to test against. The best way to do this is by using the smithy CLI. **This process is fully automated with the `aws-smithy-fuzz setup-smithy`. The following docs are in place in case you want to alter the behavior.**\n\nThere is nothing magic about what `setup-smithy` does, but it does save you some tedious setup.\n\n```bash\naws-smithy-fuzz setup-smithy --revision fix-timestamp-from-f64 --service smithy.protocoltests.rpcv2Cbor#RpcV2Protocol --workdir fuzz-workspace-cbor2 --fuzz-runner-local-path smithy-rs --dependency software.amazon.smithy:smithy-protocol-tests:1.50.0 --rebuild-local-targets\n```\n<details>\n<summary>\nDetails of functionality of `setup-smithy`. This can be helpful if you need to do something slightly different.\n</summary>\n\n```bash\n# Create a workspace just to keep track of everything\nmkdir workspace && cd workspace\nREVISION_1=main\nREVISION_2=76d5afb42d545ca2f5cbe90a089681135da935d3\nrm -rf maven-locals && mkdir maven-locals\n# Build two different versions of smithy-rs and publish them to two separate local directories\ngit clone https://github.com/smithy-lang/smithy-rs.git smithy-rs1 && (cd smithy-rs1 && git checkout $REVISION_1 && ./gradlew publishToMavenLocal -Dmaven.repo.local=$(cd ../maven-locals && pwd)/$REVISION_1)\ngit clone https://github.com/smithy-lang/smithy-rs.git smithy-rs2 && (cd smithy-rs2 && git checkout $REVISION_2 && ./gradlew publishToMavenLocal -Dmaven.repo.local=$(cd ../maven-locals && pwd)/$REVISION_2)\n```\n\nFor each of these, use the smithy CLI to generate a server implementation using something like this:\n```\n{\n    \"version\": \"1.0\",\n    \"maven\": {\n        \"dependencies\": [\n            \"software.amazon.smithy.rust.codegen.server.smithy:codegen-server:0.1.0\",\n            \"software.amazon.smithy:smithy-aws-protocol-tests:1.50.0\"\n        ],\n        \"repositories\": [\n            {\n                \"url\": \"file://maven-locals/<INSERT REVISION>\"\n            },\n            {\n                \"url\": \"https://repo1.maven.org/maven2\"\n            }\n        ]\n    },\n    \"projections\": {\n        \"server\": {\n            \"imports\": [\n            ],\n            \"plugins\": {\n                \"rust-server-codegen\": {\n                    \"runtimeConfig\": {\n                        \"relativePath\": \"/Users/rcoh/code/smithy-rs/rust-runtime\"\n                    },\n                    \"codegen\": {},\n                    // PICK YOUR SERVICE\n                    \"service\": \"aws.protocoltests.restjson#RestJson\",\n                    \"module\": \"rest_json\",\n                    \"moduleVersion\": \"0.0.1\",\n                    \"moduleDescription\": \"test\",\n                    \"moduleAuthors\": [\n                        \"protocoltest@example.com\"\n                    ]\n                }\n            }\n        }\n    }\n}\n```\n\nNext, you'll use the `fuzzgen` target to generate two things based on your target crates:\n1. A `lexicon.json` file: This uses information from the smithy model to seed the fuzzer with some initial inputs and helps it get better code coverage.\n2. Fuzz target shims for your generated servers. These each implement most of the operations available in the smithy model and wire up each target crate with the correct bindings to create a cdylib crate that can be used by the fuzzer.\n\nThe easiest way to use `fuzzgen` is with the Smithy CLI:\n\n```json\n{\n  \"version\": \"1.0\",\n  \"maven\": {\n    \"dependencies\": [\n      \"software.amazon.smithy.rust.codegen.serde:fuzzgen:0.1.0\",\n      \"software.amazon.smithy:smithy-aws-protocol-tests:1.50.0\"\n    ]\n  },\n  \"projections\": {\n    \"harness\": {\n      \"imports\": [],\n      \"plugins\": {\n        \"fuzz-harness\": {\n          \"service\": \"aws.protocoltests.restjson#RestJson\",\n          \"runtimeConfig\": {\n            \"relativePath\": \"/Users/rcoh/code/smithy-rs/rust-runtime\"\n          },\n          \"targetCrates\": [\n            {\n              \"relativePath\": \"target-mainline/build/smithy/server/rust-server-codegen/\",\n              \"name\": \"mainline\"\n            },\n            {\n              \"relativePath\": \"target-previous-release/build/smithy/server/rust-server-codegen/\",\n              \"name\": \"previous-release\"\n            }\n          ]\n        }\n      }\n    }\n  }\n}\n```\n</details>\n\n### Initialization and Fuzzing\nAfter `setup-smithy` creates the target shims, use `aws-smithy initialize` to setup ceremony required for `AFL` to function:\n```\naws-smithy-fuzz initialize --lexicon <path to lexicon> --target-crate <path-to-target-b> --target-crate <path-to-target-a>\n```\n\n> **Important**: These are the crates generated by `fuzzgen`, not the crates you generated for the different smithy versions.\n\nThis may take a couple of minutes as it builds each crate.\n\nTo start the fuzz test use:\n```\naws-smithy-fuzz fuzz\n```\n\nThe fuzz session should start (although AFL may prompt you to run some configuration commands.)\n\nYou should see something like this:\n```\n   AFL ++4.21c {default} (/Users/rcoh/.cargo/bin/aws-smithy-fuzz) [explore]\n┌─ process timing ────────────────────────────────────┬─ overall results ────┐\n│        run time : 0 days, 0 hrs, 36 min, 18 sec     │  cycles done : 78    │\n│   last new find : 0 days, 0 hrs, 0 min, 17 sec      │ corpus count : 1714  │\n│last saved crash : 0 days, 0 hrs, 19 min, 25 sec     │saved crashes : 3     │\n│ last saved hang : none seen yet                     │  saved hangs : 0     │\n├─ cycle progress ─────────────────────┬─ map coverage┴──────────────────────┤\n│  now processing : 145.173 (8.5%)     │    map density : 0.07% / 29.11%     │\n│  runs timed out : 0 (0.00%)          │ count coverage : 1.52 bits/tuple    │\n├─ stage progress ─────────────────────┼─ findings in depth ─────────────────┤\n│  now trying : splice 12              │ favored items : 615 (35.88%)        │\n│ stage execs : 11/12 (91.67%)         │  new edges on : 802 (46.79%)        │\n│ total execs : 38.3M                  │ total crashes : 6 (3 saved)         │\n│  exec speed : 16.0k/sec              │  total tmouts : 39 (0 saved)        │\n├─ fuzzing strategy yields ────────────┴─────────────┬─ item geometry ───────┤\n│   bit flips : 4/47.6k, 1/47.5k, 2/47.5k            │    levels : 27        │\n│  byte flips : 0/5945, 0/5927, 0/5891               │   pending : 2         │\n│ arithmetics : 14/415k, 0/826k, 0/821k              │  pend fav : 0         │\n│  known ints : 0/53.4k, 3/224k, 0/329k              │ own finds : 1572      │\n│  dictionary : 4/4.38M, 0/4.40M, 4/1.48M, 0/1.48M   │  imported : 0         │\n│havoc/splice : 756/13.1M, 184/24.5M                 │ stability : 96.92%    │\n│py/custom/rq : unused, unused, 581/381k, 1/183      ├───────────────────────┘\n│    trim/eff : 32.14%/274k, 99.65%                  │             [cpu: 62%]\n└─ strategy: explore ────────── state: in progress ──┘\n```\n(but with more pretty colors).\n\n## Replaying Crashes\n\nRun `aws-smithy-fuzz replay`. This will rerun all the crashes in the crashes folder. Other options exist, see: `aws-smithy-fuzz replay --help`.\n\n**You can run replay from another terminal while fuzzing is in process.**\n\n<!-- anchor_start:footer -->\nThis crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly.\n<!-- anchor_end:footer -->\n"
  },
  {
    "path": "rust-runtime/aws-smithy-fuzz/src/lib.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/* Automatically managed default lints */\n#![cfg_attr(docsrs, feature(doc_cfg))]\n/* End of automatically managed default lints */\n#![cfg(not(windows))]\nuse libloading::{os, Library, Symbol};\nuse std::error::Error;\nuse tokio::sync::mpsc::Sender;\n\nuse futures::task::noop_waker;\nuse std::future::Future;\nuse std::path::Path;\nuse std::pin::pin;\nuse std::sync::Mutex;\nuse std::task::{Context, Poll};\nuse tower::ServiceExt;\nmod types;\npub use lazy_static;\npub use types::{Body, FuzzResult, HttpRequest, HttpResponse};\n\n#[macro_export]\n/// Defines an extern `process_request` method that can be invoked as a shared library\nmacro_rules! fuzz_harness {\n    ($test_function: expr) => {\n        $crate::lazy_static::lazy_static! {\n            static ref TARGET: std::sync::Mutex<$crate::LocalFuzzTarget> = $crate::make_target($test_function);\n        }\n\n        #[no_mangle]\n        pub extern \"C\" fn process_request(input: *const u8, len: usize) -> $crate::ByteBuffer {\n            let slice = unsafe { std::slice::from_raw_parts(input, len) };\n            let request = $crate::HttpRequest::from_bytes(slice);\n            let response = TARGET.lock().unwrap().invoke(\n                request\n                    .into_http_request_04x()\n                    .expect(\"input was not a valid HTTP request. Bug in driver.\"),\n            );\n            $crate::ByteBuffer::from_vec(response.into_bytes())\n        }\n    };\n}\n\npub use ::ffi_support::ByteBuffer;\nuse bytes::Buf;\nuse tokio::runtime::{Builder, Handle};\nuse tower::util::BoxService;\n\n#[derive(Clone)]\npub struct FuzzTarget(os::unix::Symbol<unsafe extern \"C\" fn(*const u8, usize) -> ByteBuffer>);\nimpl FuzzTarget {\n    pub fn from_path(path: impl AsRef<Path>) -> Self {\n        let path = path.as_ref();\n        eprintln!(\"loading library from {}\", path.display());\n        let library = unsafe { Library::new(path).expect(\"could not load library\") };\n        let func: Symbol<unsafe extern \"C\" fn(*const u8, usize) -> ByteBuffer> =\n            unsafe { library.get(b\"process_request\").unwrap() };\n        // ensure we never unload the library\n        let func = unsafe { func.into_raw() };\n        std::mem::forget(library);\n\n        Self(func)\n    }\n\n    pub fn invoke_bytes(&self, input: &[u8]) -> FuzzResult {\n        let buffer = unsafe { (self.0)(input.as_ptr(), input.len()) };\n        let data = buffer.destroy_into_vec();\n        FuzzResult::from_bytes(&data)\n    }\n\n    pub fn invoke(&self, request: &HttpRequest) -> FuzzResult {\n        let input = request.as_bytes();\n        self.invoke_bytes(&input)\n    }\n}\n\npub struct LocalFuzzTarget {\n    service: BoxService<http::Request<Body>, http::Response<Vec<u8>>, Box<dyn Error + Send + Sync>>,\n    rx: tokio::sync::mpsc::Receiver<String>,\n}\n\nimpl LocalFuzzTarget {\n    pub fn invoke(&mut self, request: http::Request<Body>) -> FuzzResult {\n        assert_ready(async move {\n            let result = ServiceExt::oneshot(&mut self.service, request)\n                .await\n                .unwrap();\n            let debug = self.rx.try_recv().ok();\n            if result.status().is_success() && debug.is_none() {\n                panic!(\"success but no debug data received\");\n            }\n            let (parts, body) = result.into_parts();\n            FuzzResult {\n                input: debug,\n                response: HttpResponse {\n                    status: parts.status.as_u16(),\n                    headers: parts\n                        .headers\n                        .iter()\n                        .map(|(key, value)| (key.to_string(), value.to_str().unwrap().to_string()))\n                        .collect(),\n                    body,\n                },\n            }\n        })\n    }\n}\n\n/// Create a target from a tower service.\n///\n/// A `Sender<String>` is passed in. The service should send a deterministic string\n/// based on the parsed input.\npub fn make_target<\n    D: Send + Buf,\n    B: http_body::Body<Data = D> + Send + 'static,\n    F: Send + 'static,\n    E: Into<Box<dyn Error + Send + Sync>>,\n    T: tower::Service<http::Request<Body>, Response = http::Response<B>, Future = F, Error = E>\n        + Send\n        + 'static,\n>(\n    service: impl Fn(Sender<String>) -> T,\n) -> Mutex<LocalFuzzTarget> {\n    use http_body_util::BodyExt;\n    let (tx, rx) = tokio::sync::mpsc::channel(1);\n    let service =\n        service(tx)\n            .map_err(|e| e.into())\n            .and_then(|resp: http::Response<B>| async move {\n                let (parts, body) = resp.into_parts();\n                let body = body.collect().await.ok().unwrap().to_bytes().to_vec();\n                Ok::<_, Box<dyn Error + Send + Sync>>(http::Response::from_parts(parts, body))\n            });\n    let service = BoxService::new(service);\n    Mutex::new(LocalFuzzTarget { service, rx })\n}\n\n#[allow(unused)]\nfn assert_ready_tokio<F: Future>(future: F) -> F::Output {\n    match Handle::try_current() {\n        Ok(handle) => handle.block_on(future),\n        Err(_) => {\n            let handle = Builder::new_multi_thread().build().unwrap();\n            handle.block_on(future)\n        }\n    }\n}\n\n/// Polls a future and panics if it isn't already ready.\nfn assert_ready<F: Future>(future: F) -> F::Output {\n    // Create a waker that does nothing.\n    let waker = noop_waker();\n    // Create a context from the waker.\n    let mut cx = Context::from_waker(&waker);\n    let mut future = pin!(future);\n    match future.as_mut().poll(&mut cx) {\n        Poll::Ready(output) => output,\n        Poll::Pending => {\n            panic!(\"poll pending...\")\n        }\n    }\n}\n\n#[cfg(test)]\nmod test {\n    use crate::{make_target, Body};\n    use http::Request;\n    use std::error::Error;\n    use std::future::Future;\n    use std::pin::Pin;\n    use std::task::{Context, Poll};\n    use tokio::sync::mpsc::Sender;\n\n    fuzz_harness!(|_tx| { TestService });\n\n    fn make_service(_sender: Sender<String>) -> TestService {\n        TestService\n    }\n\n    #[test]\n    fn test() {\n        make_target(make_service);\n    }\n\n    struct TestService;\n\n    impl tower::Service<http::Request<Body>> for TestService {\n        type Response = http::Response<Body>;\n        type Error = Box<dyn Error + Send + Sync>;\n        type Future =\n            Pin<Box<dyn Future<Output = Result<Self::Response, Self::Error>> + Send + Sync>>;\n\n        fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {\n            todo!()\n        }\n\n        fn call(&mut self, _req: Request<Body>) -> Self::Future {\n            todo!()\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-fuzz/src/main.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n#![cfg(not(windows))]\n\nuse aws_smithy_fuzz::{FuzzResult, FuzzTarget, HttpRequest};\nuse serde::{Deserialize, Serialize};\nuse serde_json::Value;\nuse std::collections::{HashMap, HashSet};\nuse std::fmt::Display;\nuse std::io::{BufRead, BufWriter};\nuse std::path::{Path, PathBuf};\nuse std::process::{Child, Command, Stdio};\nuse std::time::SystemTime;\nuse std::{env, fs};\n\nuse clap::{Parser, Subcommand};\nuse tera::{Context, Tera};\nuse termcolor::{Color, ColorChoice, ColorSpec, StandardStream, WriteColor};\n\n#[derive(Parser)]\n#[command(author, version, about, long_about = None)]\nstruct Cli {\n    #[command(subcommand)]\n    command: Commands,\n}\n\n#[derive(Subcommand)]\nenum Commands {\n    /// Invoke the fuzz driver\n    Fuzz(FuzzArgs),\n\n    /// Initialize the fuzz configuration\n    ///\n    /// This command will compile cdylib shared libraries and create a\n    Initialize(InitializeArgs),\n\n    /// Replay subcommand\n    Replay(ReplayArgs),\n\n    /// Setup smithy-rs targets\n    ///\n    /// This does all of the schlep of setting of smithy-rs copies at different revisions for fuzz testing\n    /// This command is not strictly necessary—It's pretty easy to wire this up yourself. But\n    /// this removes a lot of boilerplate.\n    SetupSmithy(SetupSmithyArgs),\n\n    /// Invoke Testcase\n    ///\n    /// Directly invoke a test case against a given shared library target. Generally, replay will\n    /// be easier to use.\n    ///\n    /// This exists to facilitate invoking a cdylib that may panic without crashing the main\n    /// process\n    InvokeTestCase(InvokeArgs),\n}\n\n#[derive(Parser)]\nstruct InvokeArgs {\n    #[arg(short, long)]\n    shared_library_path: PathBuf,\n\n    #[arg(short, long)]\n    test_case: PathBuf,\n}\n\n#[derive(Parser)]\nstruct SetupSmithyArgs {\n    #[arg(short, long)]\n    revision: Vec<String>,\n    #[arg(short, long)]\n    service: String,\n    #[arg(short, long)]\n    workdir: Option<PathBuf>,\n\n    #[arg(short, long)]\n    fuzz_runner_local_path: PathBuf,\n\n    /// Rebuild the local clones of smithy-rs\n    #[arg(long)]\n    rebuild_local_targets: bool,\n\n    /// Additional dependencies to use. Usually, these provide the model.\n    ///\n    /// Dependencies should be in the following format: `software.amazon.smithy:smithy-aws-protocol-tests:1.50.0`\n    #[arg(long)]\n    dependency: Vec<String>,\n}\n\n#[derive(Parser)]\nstruct FuzzArgs {\n    /// Custom path to the configuration file.\n    #[arg(\n        short,\n        long,\n        value_name = \"PATH\",\n        default_value = \"smithy-fuzz-config.json\"\n    )]\n    config_path: String,\n\n    #[arg(long)]\n    enter_fuzzing_loop: bool,\n\n    /// The number of parallel fuzzers to run\n    #[arg(short, long)]\n    num_fuzzers: Option<usize>,\n}\n\n#[derive(Parser)]\nstruct InitializeArgs {\n    /// Path to the target crates to fuzz (repeat for multiple crates)\n    #[arg(short, long, value_name = \"PATH\")]\n    target_crate: Vec<PathBuf>,\n\n    /// Path to the `lexicon.json` defining the dictionary and corpus\n    ///\n    /// This file is typically produced by the fuzzgen smithy plugin.\n    #[arg(short, long, value_name = \"PATH\")]\n    lexicon: PathBuf,\n\n    /// Custom path to the configuration file.\n    #[arg(\n        short,\n        long,\n        value_name = \"PATH\",\n        default_value = \"smithy-fuzz-config.json\"\n    )]\n    config_path: String,\n\n    /// Force a rebuild of target artifacts.\n    ///\n    /// **NOTE**: You must use this if you change the target artifacts\n    #[arg(short, long)]\n    force_rebuild: bool,\n\n    /// Compile the target artifacts in release mode\n    #[arg(short, long)]\n    release: bool,\n}\n\n/// Replay crashes from a fuzz run\n///\n/// By default, this will automatically discover all crashes during fuzzing sessions and rerun them.\n/// To rerun a single crash, use `--invoke-only`.\n#[derive(Parser)]\nstruct ReplayArgs {\n    /// Custom path to the configuration file.\n    #[arg(\n        short,\n        long,\n        value_name = \"PATH\",\n        default_value = \"smithy-fuzz-config.json\"\n    )]\n    config_path: String,\n\n    /// Invoke only the specified path.\n    #[arg(short, long)]\n    invoke_only: Option<String>,\n\n    /// Output results in JSON\n    #[arg(short, long)]\n    json: bool,\n\n    /// Run against the input corpus instead of running against crashes\n    ///\n    /// This is helpful for sanity checking that everything is working properly\n    #[arg(long)]\n    corpus: bool,\n}\n\n#[derive(Deserialize)]\nstruct Lexicon {\n    corpus: Vec<HttpRequest>,\n    dictionary: Vec<String>,\n}\n\n#[derive(Serialize, Deserialize, Debug)]\nstruct FuzzConfig {\n    seed: PathBuf,\n    targets: Vec<Target>,\n    afl_input_dir: PathBuf,\n    afl_output_dir: PathBuf,\n    dictionaries: Vec<PathBuf>,\n    lexicon: PathBuf,\n}\n\n#[derive(Serialize, Deserialize, Debug)]\nstruct Target {\n    package_name: String,\n    source: PathBuf,\n    shared_library: Option<PathBuf>,\n}\n\nimpl Target {\n    fn human_name(&self) -> String {\n        determine_package_name(&self.source.join(\"Cargo.toml\"))\n    }\n}\n\nfn main() {\n    tracing_subscriber::fmt::init();\n    let cli = Cli::parse();\n    match cli.command {\n        Commands::Fuzz(args) => fuzz(args),\n        Commands::Initialize(args) => initialize(args),\n        Commands::Replay(args) => replay(args),\n        Commands::SetupSmithy(args) => setup_smithy(args),\n        Commands::InvokeTestCase(InvokeArgs {\n            test_case,\n            shared_library_path,\n        }) => invoke_testcase(test_case, shared_library_path),\n    }\n}\n\nfn setup_smithy(args: SetupSmithyArgs) {\n    let current_dir = env::current_dir().unwrap();\n    let workdir = match &args.workdir {\n        Some(relative_workdir) => current_dir.join(relative_workdir),\n        None => current_dir.clone(),\n    };\n    let maven_locals = workdir.join(\"maven-locals\");\n    fs::create_dir_all(&maven_locals).unwrap();\n\n    let fuzz_driver_path = maven_locals.join(\"fuzz-driver\");\n    let local_path = current_dir.join(&args.fuzz_runner_local_path);\n    build_revision(&fuzz_driver_path, &local_path);\n\n    let rust_runtime_for_fuzzer = local_path.join(\"rust-runtime\");\n\n    let fuzzgen_smithy_build =\n        generate_smithy_build_json_for_fuzzer(&args, &fuzz_driver_path, &rust_runtime_for_fuzzer);\n    let fuzzgen_smithy_build_path = workdir.join(\"smithy-build-fuzzgen.json\");\n    fs::write(&fuzzgen_smithy_build_path, &fuzzgen_smithy_build).unwrap();\n\n    for revision in &args.revision {\n        let revision_dir = clone_smithyrs(&workdir, &revision, args.rebuild_local_targets);\n\n        let maven_local_subpath = maven_locals.join(&revision);\n        build_revision(&maven_local_subpath, &revision_dir);\n        let fuzzgen_smithy_build =\n            generate_smithy_build_for_target(&maven_local_subpath, &args, &revision, &revision_dir);\n        let smithy_build_path = workdir.join(format!(\"smithy-build-{revision}.json\"));\n        fs::write(&smithy_build_path, assert_valid_json(&fuzzgen_smithy_build)).unwrap();\n        smithy_build(&workdir, &smithy_build_path);\n    }\n    println!(\"running smithy build for fuzz harness\");\n    smithy_build(&workdir, &fuzzgen_smithy_build_path);\n}\n\nfn generate_smithy_build_for_target(\n    maven_local_subpath: &Path,\n    args: &SetupSmithyArgs,\n    revision: &str,\n    revision_dir: &Path,\n) -> String {\n    let mut context = Context::new();\n    context.insert(\"maven_local\", &maven_local_subpath);\n    context.insert(\"service\", &args.service);\n    context.insert(\"revision\", revision);\n    context.insert(\"rust_runtime\", &revision_dir.join(\"rust-runtime\"));\n    context.insert(\"dependencies\", &args.dependency);\n\n    let fuzzgen_smithy_build = Tera::one_off(\n        include_str!(\"../templates/smithy-build-targetcrate.jinja2\"),\n        &context,\n        false,\n    )\n    .unwrap();\n    assert_valid_json(fuzzgen_smithy_build)\n}\n\nfn generate_smithy_build_json_for_fuzzer(\n    args: &SetupSmithyArgs,\n    fuzz_driver_path: &Path,\n    rust_runtime_for_fuzzer: &Path,\n) -> String {\n    let mut context = Context::new();\n    context.insert(\"service\", &args.service);\n    context.insert(\"revisions\", &args.revision);\n    context.insert(\"maven_local\", &fuzz_driver_path);\n    context.insert(\"rust_runtime\", &rust_runtime_for_fuzzer);\n    context.insert(\"dependencies\", &args.dependency);\n\n    let fuzzgen_smithy_build = Tera::one_off(\n        include_str!(\"../templates/smithy-build-fuzzer.jinja2\"),\n        &context,\n        false,\n    )\n    .unwrap();\n    assert_valid_json(fuzzgen_smithy_build)\n}\n\n/// Run smithy build for a given file\n///\n/// # Arguments\n///\n/// * `workdir`: Path to the working directory (this is where the `build` directory) will be created / used\n/// * `smithy_build_json`: Path to the smithy-build.json file\nfn smithy_build(workdir: impl AsRef<Path>, smithy_build_json: impl AsRef<Path>) {\n    println!(\n        \"running smithy build for {}\",\n        smithy_build_json.as_ref().display()\n    );\n    // Need to delete classpath.json if it exists to work around small bug in smithy CLI:\n    // https://github.com/smithy-lang/smithy/issues/2376\n    let _ = fs::remove_file(workdir.as_ref().join(\"build/smithy\").join(\"classpath.json\"));\n\n    let home_dir = homedir::my_home().unwrap().unwrap();\n    exec(\n        Command::new(\"rm\")\n            .arg(\"-r\")\n            .arg(format!(\"{}/.m2\", home_dir.display()))\n            .current_dir(&workdir),\n    );\n    exec(\n        Command::new(\"smithy\")\n            .arg(\"build\")\n            .arg(\"-c\")\n            .arg(smithy_build_json.as_ref())\n            .current_dir(workdir),\n    );\n}\n\n/// Creates a copy of the smithy-rs repository at a specific revision.\n///\n/// - If it does not already exist, it will create a local clone of the entire repo.\n/// - After that, it will make a local clone of that repo to facilitate checking out a specific\n/// revision\n///\n/// # Arguments\n///\n/// * `workdir`: Working directory to clone into\n/// * `revision`: Revision to check out\n/// * `maven_local`: Path to a revisione-specific maven-local directory to build into\n///\n/// returns: Path to the cloned directory\nfn clone_smithyrs(workdir: impl AsRef<Path>, revision: &str, recreate: bool) -> PathBuf {\n    let smithy_dir = workdir.as_ref().join(\"smithy-rs-src\");\n    if !smithy_dir.exists() {\n        exec(\n            Command::new(\"git\")\n                .args([\"clone\", \"https://github.com/smithy-lang/smithy-rs.git\"])\n                .arg(&smithy_dir)\n                .current_dir(&workdir),\n        );\n    }\n    let copies_dir = workdir.as_ref().join(\"smithy-rs-copies\");\n    fs::create_dir_all(&copies_dir).unwrap();\n\n    let revision_dir = copies_dir.join(revision);\n    if revision_dir.exists() && !recreate {\n        return revision_dir;\n    }\n    exec(\n        Command::new(\"rm\")\n            .arg(\"-rf\")\n            .arg(&revision_dir)\n            .current_dir(&workdir),\n    );\n\n    exec(\n        Command::new(\"git\")\n            .arg(\"clone\")\n            .arg(smithy_dir)\n            .arg(&revision_dir)\n            .current_dir(&workdir),\n    );\n\n    exec(\n        Command::new(\"git\")\n            .args([\"checkout\", &revision])\n            .current_dir(&revision_dir),\n    );\n    revision_dir\n}\n\nfn exec(command: &mut Command) {\n    match command.get_current_dir() {\n        None => panic!(\"BUG: all commands should set a working directory\"),\n        Some(dir) if !dir.is_absolute() => panic!(\"bug: absolute directory should be set\"),\n        _ => {}\n    };\n    let status = match command.spawn().unwrap().wait() {\n        Ok(status) => status,\n        Err(e) => {\n            panic!(\"{:?} failed: {}\", command, e)\n        }\n    };\n    if !status.success() {\n        panic!(\"command failed: {:?}\", command);\n    }\n}\n\n/// Runs `./gradlew publishToMavenLocal` on a given smithy-rs directory\n///\n/// # Arguments\n///\n/// * `maven_local`: mavenLocal directory to publish into\n/// * `smithy_dir`: smithy-rs source directory to use\nfn build_revision(maven_local: impl AsRef<Path>, smithy_dir: impl AsRef<Path>) {\n    tracing::info!(\"building revision from {}\", smithy_dir.as_ref().display());\n    exec(\n        Command::new(\"./gradlew\")\n            .args([\n                \"publishToMavenLocal\",\n                &format!(\"-Dmaven.repo.local={}\", maven_local.as_ref().display()),\n            ])\n            .current_dir(&smithy_dir),\n    )\n}\n\nfn assert_valid_json<T: AsRef<str>>(data: T) -> T {\n    match serde_json::from_str::<Value>(data.as_ref()) {\n        Err(e) => panic!(\n            \"failed to generate valid JSON. this is a bug. {}\\n\\n{}\",\n            e,\n            data.as_ref()\n        ),\n        Ok(_) => {}\n    };\n    data\n}\n\nfn force_load_libraries(libraries: &[Target]) -> Vec<FuzzTarget> {\n    libraries\n        .iter()\n        .map(|t| {\n            t.shared_library\n                .as_ref()\n                .expect(\"shared library must be built! run `aws-smithy-fuzz initialize`\")\n        })\n        .map(FuzzTarget::from_path)\n        .collect::<Vec<_>>()\n}\n\n/// Starts a fuzz session\n///\n/// This function is a little bit of an snake eating its tail. When it is initially run,\n/// it ensures everything is set up properly, then it invokes AFL, passing through\n/// all the relevant flags. AFL is actually going to come right back in here—(but with `enter_fuzzing_loop`)\n/// set to true. In that case, we just prepare to start actually fuzzing the targets.\nfn fuzz(args: FuzzArgs) {\n    let config = fs::read_to_string(&args.config_path).unwrap();\n    let config: FuzzConfig = serde_json::from_str(&config).unwrap();\n    if args.enter_fuzzing_loop {\n        let libraries = force_load_libraries(&config.targets);\n        enter_fuzz_loop(libraries, None)\n    } else {\n        eprintln!(\n            \"Preparing to start fuzzing... {} targets.\",\n            config.targets.len()\n        );\n        let base_command = || {\n            let mut cmd = Command::new(\"cargo\");\n            cmd.args([\"afl\", \"fuzz\"])\n                .arg(\"-i\")\n                .arg(&config.lexicon)\n                .arg(\"-o\")\n                .arg(&config.afl_output_dir);\n\n            for dict in &config.dictionaries {\n                cmd.arg(\"-x\").arg(dict);\n            }\n            cmd\n        };\n\n        let apply_target = |mut cmd: Command| {\n            let current_binary =\n                std::env::current_exe().expect(\"could not determine current target\");\n            cmd.arg(current_binary)\n                .arg(\"fuzz\")\n                .arg(\"--config-path\")\n                .arg(&args.config_path)\n                .arg(\"--enter-fuzzing-loop\");\n            cmd\n        };\n        let mut main_runner = base_command();\n        main_runner.arg(\"-M\").arg(\"fuzzer0\");\n\n        eprintln!(\n            \"Switching to AFL with the following command:\\n{:?}\",\n            main_runner\n        );\n        let mut main = apply_target(main_runner).spawn().unwrap();\n        let mut children = vec![];\n        for idx in 1..args.num_fuzzers.unwrap_or_default() {\n            let mut runner = base_command();\n            runner.arg(\"-S\").arg(format!(\"fuzzer{}\", idx));\n            runner.stderr(Stdio::null()).stdout(Stdio::null());\n            children.push(KillOnDrop(apply_target(runner).spawn().unwrap()));\n        }\n        main.wait().unwrap();\n    }\n}\nstruct KillOnDrop(Child);\nimpl Drop for KillOnDrop {\n    fn drop(&mut self) {\n        self.0.kill().unwrap();\n    }\n}\n\nfn yellow(text: impl Display) {\n    let mut stdout = StandardStream::stderr(ColorChoice::Auto);\n    use std::io::Write;\n    stdout\n        .set_color(ColorSpec::new().set_fg(Some(Color::Yellow)))\n        .unwrap();\n    writeln!(&mut stdout, \"{}\", text).unwrap();\n    stdout.reset().unwrap();\n}\n\nfn initialize(\n    InitializeArgs {\n        target_crate,\n        lexicon,\n        config_path,\n        force_rebuild,\n        release,\n    }: InitializeArgs,\n) {\n    let mode = match release {\n        true => Mode::Release,\n        false => Mode::Debug,\n    };\n    let current_config = if Path::new(&config_path).exists() {\n        let config_data = fs::read_to_string(&config_path).unwrap();\n        let config: FuzzConfig = serde_json::from_str(&config_data).unwrap();\n        Some(config)\n    } else {\n        None\n    };\n    let current_targets = current_config.map(|c| c.targets).unwrap_or_default();\n    let targets = if current_targets\n        .iter()\n        .map(|t| &t.source)\n        .collect::<HashSet<_>>()\n        != target_crate.iter().collect::<HashSet<_>>()\n    {\n        yellow(\"The target crates specified in the configuration file do not match the current target crates.\");\n        eprintln!(\n            \"Initializing the fuzzer with {} target crates.\",\n            target_crate.len()\n        );\n        target_crate\n            .into_iter()\n            .map(initialize_target)\n            .collect::<Vec<_>>()\n    } else {\n        current_targets\n    };\n    if targets.is_empty() {\n        yellow(\"No target crates specified, nothing to do.\");\n    }\n\n    let afl_input_dir = Path::new(\"afl-input\");\n    let afl_output_dir = Path::new(\"afl-output\");\n\n    let mut config = FuzzConfig {\n        seed: lexicon,\n        targets,\n        afl_input_dir: afl_input_dir.into(),\n        afl_output_dir: afl_output_dir.into(),\n        lexicon: afl_input_dir.join(\"corpus\"),\n        dictionaries: vec![afl_input_dir.join(\"dictionary\")],\n    };\n\n    let seed_request = fs::read_to_string(&config.seed).unwrap();\n    let seed: Lexicon = serde_json::from_str(&seed_request).unwrap();\n    write_seed(&config.afl_input_dir, &seed);\n\n    for target in &mut config.targets {\n        if target.shared_library.is_none() || force_rebuild {\n            build_target(target, mode);\n        }\n        check_library_health(&FuzzTarget::from_path(\n            target.shared_library.as_ref().unwrap(),\n        ));\n    }\n    eprintln!(\"Writing settings to {}\", config_path);\n    fs::write(&config_path, serde_json::to_string_pretty(&config).unwrap()).unwrap();\n}\n\nfn initialize_target(source: PathBuf) -> Target {\n    let package_id = determine_package_id(source.as_ref());\n    Target {\n        package_name: package_id,\n        source,\n        shared_library: None,\n    }\n}\n\nfn load_all_crashes(output_dir: &Path) -> Vec<PathBuf> {\n    let pattern = output_dir.join(\"fuzzer*/crashes*\");\n    load_inputs_at_pattern(&pattern)\n}\n\nfn load_corpus(input_dir: &Path) -> Vec<PathBuf> {\n    let pattern = input_dir.join(\"corpus\");\n    load_inputs_at_pattern(&pattern)\n}\n\nfn load_inputs_at_pattern(pattern: &Path) -> Vec<PathBuf> {\n    eprintln!(\"searching for test cases in {}\", pattern.display());\n    let pattern = format!(\"{}\", pattern.display());\n    let mut crash_directories = glob::glob(&pattern).unwrap();\n    let mut crashes = vec![];\n    while let Some(Ok(crash_dir)) = crash_directories.next() {\n        for entry in fs::read_dir(crash_dir).unwrap() {\n            let entry = entry.unwrap().path();\n            match entry.file_name().and_then(|f| f.to_str()) {\n                None | Some(\"README.txt\") => {}\n                Some(_other) => crashes.push(entry),\n            }\n        }\n    }\n    crashes\n}\n\n/// Replay crashes\nfn replay(\n    ReplayArgs {\n        config_path,\n        invoke_only,\n        json,\n        corpus,\n    }: ReplayArgs,\n) {\n    let config = fs::read_to_string(config_path).unwrap();\n    let config: FuzzConfig = serde_json::from_str(&config).unwrap();\n    let crashes = if let Some(path) = invoke_only {\n        vec![path.into()]\n    } else {\n        match corpus {\n            true => load_corpus(&config.afl_input_dir),\n            false => load_all_crashes(&config.afl_output_dir),\n        }\n    };\n    eprintln!(\"Replaying {} crashes.\", crashes.len());\n    for crash in crashes {\n        eprintln!(\"{}\", crash.display());\n        let data = fs::read(&crash).unwrap();\n        let http_request = HttpRequest::from_unknown_bytes(&data);\n        let mut results: HashMap<String, CrashResult> = HashMap::new();\n        #[derive(Debug, Serialize)]\n        #[serde(tag = \"type\")]\n        enum CrashResult {\n            Panic { message: String },\n            FuzzResult { result: String },\n        }\n\n        impl Display for CrashResult {\n            fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n                match self {\n                    CrashResult::Panic { message } => {\n                        f.pad(\"The process paniced!\\n\")?;\n                        for line in message.lines() {\n                            write!(f, \" {}\\n\", line)?;\n                        }\n                        Ok(())\n                    }\n                    CrashResult::FuzzResult { result } => f.pad(result),\n                }\n            }\n        }\n\n        for library in &config.targets {\n            let result = Command::new(env::current_exe().unwrap())\n                .arg(\"invoke-test-case\")\n                .arg(\"--shared-library-path\")\n                .arg(library.shared_library.as_deref().unwrap())\n                .arg(\"--test-case\")\n                .arg(&crash)\n                .output()\n                .unwrap();\n            let result = match serde_json::from_slice::<FuzzResult>(&result.stdout) {\n                Ok(result) => CrashResult::FuzzResult {\n                    result: format!(\"{:?}\", result),\n                },\n                Err(_err) => CrashResult::Panic {\n                    message: String::from_utf8_lossy(&result.stderr).to_string(),\n                },\n            };\n            results.insert(library.human_name(), result);\n        }\n        #[derive(Serialize)]\n        struct Results {\n            test_case: String,\n            results: HashMap<String, CrashResult>,\n        }\n        impl Display for Results {\n            fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n                let test_case = &self.test_case;\n                write!(f, \"Test case: {test_case}\\n\")?;\n                for (target, result) in &self.results {\n                    write!(f, \" target: {target}\\n{:>2}\", result)?;\n                }\n                Ok(())\n            }\n        }\n        let results = Results {\n            test_case: format!(\"{:#?}\", http_request.unwrap()),\n            results,\n        };\n        if json {\n            println!(\"{}\", serde_json::to_string(&results).unwrap());\n        } else {\n            println!(\"{}\\n----\", results);\n        }\n    }\n}\n\nfn invoke_testcase(test_case: impl AsRef<Path>, shared_library_path: impl AsRef<Path>) {\n    let data = fs::read(test_case).unwrap();\n    let library = FuzzTarget::from_path(shared_library_path);\n    let data = data.clone();\n    let result = library.invoke_bytes(&data.clone());\n    println!(\"{}\", serde_json::to_string(&result).unwrap());\n}\n\n/// Enters the fuzzing loop. This method should only be entered when `afl` is driving the binary\nfn enter_fuzz_loop(libraries: Vec<FuzzTarget>, mut log: Option<BufWriter<fs::File>>) {\n    afl::fuzz(true, |data: &[u8]| {\n        use std::io::Write;\n        #[allow(clippy::disallowed_methods)]\n        let start = SystemTime::now();\n\n        let http_request = HttpRequest::from_unknown_bytes(data);\n        if let Some(request) = http_request {\n            if request.into_http_request_04x().is_some() {\n                let mut results = vec![];\n                for library in &libraries {\n                    results.push(library.invoke_bytes(data));\n                }\n                log.iter_mut().for_each(|log| {\n                    log.write_all(\n                        #[allow(clippy::disallowed_methods)]\n                        format!(\n                            \"[{:?}ms] {:?} {:?}\\n\",\n                            start.elapsed().unwrap().as_millis(),\n                            request,\n                            &results[0]\n                        )\n                        .as_bytes(),\n                    )\n                    .unwrap();\n                });\n                for result in &results {\n                    if result.response != results[0].response {\n                        if check_for_nondeterminism(data, &libraries) {\n                            break;\n                        }\n                        panic!(\"inconsistent results: {:#?}\", results);\n                    }\n                }\n            }\n        }\n    });\n}\n\nfn check_for_nondeterminism(data: &[u8], libraries: &[FuzzTarget]) -> bool {\n    for lib in libraries {\n        let sample = (0..10)\n            .map(|_idx| lib.invoke_bytes(&data))\n            .collect::<Vec<_>>();\n        if sample.iter().any(|result| result != &sample[0]) {\n            return true;\n        }\n    }\n    return false;\n}\n\n/// Converts a JSON formatted seed to the format expected by AFL\n///\n/// - Dictionary items are written out into a file\n/// - Corpus items are bincode serialized so that the format matches\nfn write_seed(target_directory: &Path, seed: &Lexicon) {\n    fs::create_dir_all(target_directory.join(\"corpus\")).unwrap();\n    for (id, request) in seed.corpus.iter().enumerate() {\n        std::fs::write(\n            target_directory.join(\"corpus\").join(&format!(\"{}\", id)),\n            request.as_bytes(),\n        )\n        .unwrap();\n    }\n    use std::fmt::Write;\n    let mut dictionary = String::new();\n    for word in &seed.dictionary {\n        writeln!(dictionary, \"\\\"{word}\\\"\").unwrap();\n    }\n    std::fs::write(target_directory.join(\"dictionary\"), dictionary.as_bytes()).unwrap();\n}\n\nfn check_library_health(library: &FuzzTarget) {\n    let input = HttpRequest {\n        uri: \"/NoInputAndNoOutput\".to_string(),\n        method: \"POST\".to_string(),\n        headers: [(\"Accept\".to_string(), vec![\"application/json\".to_string()])]\n            .into_iter()\n            .collect::<HashMap<_, _>>(),\n        trailers: Default::default(),\n        body: \"{}\".into(),\n    };\n    library.invoke(&input);\n}\n\n#[derive(Debug, Eq, PartialEq, Clone, Copy)]\nenum Mode {\n    Release,\n    Debug,\n}\n\nimpl AsRef<Path> for Mode {\n    fn as_ref(&self) -> &Path {\n        match self {\n            Mode::Release => Path::new(\"release\"),\n            Mode::Debug => Path::new(\"debug\"),\n        }\n    }\n}\n\nfn determine_package_name(path: &Path) -> String {\n    let cargo_toml_file = cargo_toml::Manifest::from_path(path).expect(\"invalid manifest\");\n    cargo_toml_file.package.unwrap().name\n}\n\nfn determine_package_id(path: &Path) -> String {\n    let metadata = Command::new(\"cargo\")\n        .args([\"metadata\", \"--format-version\", \"1\"])\n        .current_dir(path)\n        .output()\n        .unwrap();\n    let metadata: Value = match serde_json::from_slice(&metadata.stdout) {\n        Ok(v) => v,\n        Err(e) => panic!(\n            \"failed to parse metadata: {}\\n{}\",\n            e,\n            String::from_utf8_lossy(&metadata.stderr)\n        ),\n    };\n    let package_name = &metadata[\"workspace_members\"][0].as_str().unwrap();\n    package_name.to_string()\n}\n\nfn build_target(target: &mut Target, mode: Mode) {\n    let mut cmd = Command::new(\"cargo\");\n    cmd.env(\n        \"CARGO_TARGET_DIR\",\n        env::current_dir()\n            .unwrap()\n            .join(\"target/fuzz-target-target\"),\n    );\n    cmd.args([\"afl\", \"build\", \"--message-format\", \"json\"]);\n    cmd.stdout(Stdio::piped());\n    if mode == Mode::Release {\n        cmd.arg(\"--release\");\n    }\n    let json_output = cmd\n        .current_dir(&target.source)\n        .spawn()\n        .unwrap()\n        .wait_with_output()\n        .unwrap();\n\n    let shared_library = json_output\n        .stdout\n        .lines()\n        .filter_map(|line| cargo_output::find_shared_library(&line.unwrap(), target))\n        .next()\n        .expect(\"failed to find shared library\");\n    target.shared_library = Some(PathBuf::from(shared_library))\n}\n\nmod cargo_output {\n    use crate::Target;\n    use serde::Deserialize;\n\n    #[derive(Deserialize, Debug)]\n    struct DylibOutput {\n        reason: String,\n        package_id: String,\n        target: DyLibTarget,\n        filenames: Vec<String>,\n    }\n\n    #[derive(Deserialize, Debug)]\n    struct DyLibTarget {\n        kind: Vec<String>,\n    }\n\n    /// Reads a line of cargo output and look for the dylib\n    pub(super) fn find_shared_library(line: &str, target: &Target) -> Option<String> {\n        tracing::trace!(\"{}\", line);\n        let output: DylibOutput = match serde_json::from_str(line) {\n            Ok(output) => output,\n            Err(_e) => {\n                tracing::debug!(\"line does not match: {}\", line);\n                return None;\n            }\n        };\n        if output.reason != \"compiler-artifact\" {\n            return None;\n        }\n        if output.package_id != target.package_name {\n            tracing::debug!(expected = %target.package_name, actual = %output.package_id, \"ignoring line—package was wrong\");\n            return None;\n        }\n        if output.target.kind != [\"cdylib\"] {\n            return None;\n        }\n        Some(\n            output\n                .filenames\n                .into_iter()\n                .next()\n                .expect(\"should be one dylib target\"),\n        )\n    }\n}\n\n#[cfg(test)]\nmod test {\n    use std::{env::temp_dir, path::PathBuf};\n\n    use crate::{\n        generate_smithy_build_for_target, generate_smithy_build_json_for_fuzzer, SetupSmithyArgs,\n    };\n\n    #[test]\n    fn does_this_work() {\n        let path = PathBuf::new();\n        let args = SetupSmithyArgs {\n            revision: vec![\"main\".into()],\n            service: \"test-service\".to_string(),\n            workdir: Some(temp_dir()),\n            fuzz_runner_local_path: \"../\".into(),\n            rebuild_local_targets: true,\n            dependency: vec![],\n        };\n        generate_smithy_build_json_for_fuzzer(&args, &path, &path);\n        generate_smithy_build_for_target(&path, &args, \"revision\", &path);\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-fuzz/src/types.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse arbitrary::Arbitrary;\nuse std::convert::Infallible;\nuse std::pin::Pin;\nuse std::task::{Context, Poll};\nuse std::{collections::HashMap, fmt::Debug};\n\nuse bytes::Bytes;\nuse http::{HeaderMap, HeaderName, Method};\nuse serde::{Deserialize, Serialize};\n\npub struct Body {\n    body: Option<Vec<u8>>,\n    trailers: Option<HeaderMap>,\n}\n\nimpl Body {\n    pub fn from_bytes(bytes: Vec<u8>) -> Self {\n        Self {\n            body: Some(bytes),\n            trailers: None,\n        }\n    }\n    pub fn from_static(bytes: &'static [u8]) -> Self {\n        Self {\n            body: Some(bytes.into()),\n            trailers: None,\n        }\n    }\n}\n\nimpl http_body::Body for Body {\n    type Data = Bytes;\n    type Error = Infallible;\n\n    fn poll_frame(\n        mut self: Pin<&mut Self>,\n        _cx: &mut Context<'_>,\n    ) -> Poll<Option<Result<http_body::Frame<Self::Data>, Self::Error>>> {\n        match self.as_mut().body.take() {\n            Some(data) => Poll::Ready(Some(Ok(http_body::Frame::data(data.into())))),\n            None => match self.as_mut().trailers.take() {\n                Some(trailers) => Poll::Ready(Some(Ok(http_body::Frame::trailers(trailers)))),\n                None => Poll::Ready(None),\n            },\n        }\n    }\n}\n\n#[derive(Serialize, Deserialize, Default, Clone, PartialEq, Eq, Arbitrary)]\npub struct HttpRequest {\n    pub uri: String,\n    pub method: String,\n    pub headers: HashMap<String, Vec<String>>,\n    pub trailers: HashMap<String, Vec<String>>,\n    pub body: Vec<u8>,\n}\n\n#[derive(Serialize, Deserialize, Default, Clone, PartialEq, Eq)]\npub struct HttpResponse {\n    pub status: u16,\n    pub headers: HashMap<String, String>,\n    pub body: Vec<u8>,\n}\n\nimpl Debug for HttpResponse {\n    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n        f.debug_struct(\"HttpResponse\")\n            .field(\"status\", &self.status)\n            .field(\"headers\", &self.headers)\n            .field(\"body\", &TryString(&self.body))\n            .finish()\n    }\n}\n\nimpl Debug for HttpRequest {\n    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n        f.debug_struct(\"HttpRequest\")\n            .field(\"uri\", &self.uri)\n            .field(\"method\", &self.method)\n            .field(\"headers\", &self.headers)\n            .field(\"body\", &TryString(&self.body))\n            .finish()\n    }\n}\n\nstruct TryString<'a>(&'a [u8]);\nimpl Debug for TryString<'_> {\n    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n        let try_cbor = cbor_diag::parse_bytes(self.0);\n        let str_rep = match try_cbor {\n            Ok(repr) => repr.to_diag_pretty(),\n            Err(_e) => String::from_utf8_lossy(self.0).to_string(),\n        };\n        write!(f, \"\\\"{}\\\"\", str_rep)\n    }\n}\n\n#[derive(Serialize, Deserialize, Default, Clone, Debug, PartialEq, Eq)]\npub struct FuzzResult {\n    pub response: HttpResponse,\n    pub input: Option<String>,\n}\n\nimpl FuzzResult {\n    pub fn into_bytes(self) -> Vec<u8> {\n        bincode::serialize(&self).unwrap()\n    }\n\n    pub fn from_bytes(bytes: &[u8]) -> Self {\n        bincode::deserialize(bytes).unwrap()\n    }\n}\n\nimpl HttpRequest {\n    pub fn into_http_request_04x(&self) -> Option<http::Request<Body>> {\n        let mut builder = http::Request::builder()\n            .uri(&self.uri)\n            .method(Method::from_bytes(self.method.as_bytes()).ok()?);\n        for (key, values) in &self.headers {\n            for value in values {\n                builder = builder.header(key, value);\n            }\n        }\n        let mut trailers = HeaderMap::new();\n        for (k, v) in &self.trailers {\n            let header_name: HeaderName = k.parse().ok()?;\n            for v in v {\n                trailers.append(header_name.clone(), v.parse().ok()?);\n            }\n        }\n        builder\n            .body(Body {\n                body: Some(self.body.clone()),\n                trailers: Some(trailers),\n            })\n            .ok()\n    }\n\n    pub fn as_bytes(&self) -> Vec<u8> {\n        bincode::serialize(self).unwrap()\n    }\n\n    pub fn from_bytes(bytes: &[u8]) -> Self {\n        bincode::deserialize(bytes).unwrap()\n    }\n\n    pub fn from_unknown_bytes(bytes: &[u8]) -> Option<Self> {\n        bincode::deserialize(bytes).ok()\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-fuzz/templates/smithy-build-fuzzer.jinja2",
    "content": "{\n  \"version\": \"1.0\",\n  \"maven\": {\n    \"dependencies\": [\n      {% for dependency in dependencies -%}\n      \"{{ dependency }}\",\n      {% endfor %}\n      \"software.amazon.smithy.rust.codegen.serde:fuzzgen:0.1.0\"\n    ],\n    \"repositories\": [\n      {\n        \"url\": \"file://{{ maven_local }}\"\n      },\n      {\n        \"url\": \"https://repo1.maven.org/maven2\"\n      }\n    ]\n  },\n  \"projections\": {\n    \"harness\": {\n      \"imports\": [ ],\n      \"plugins\": {\n        \"fuzz-harness\": {\n          \"service\": \"{{ service }}\",\n          \"runtimeConfig\": {\n            \"relativePath\": \"{{ rust_runtime }}\"\n          },\n          \"targetCrates\": [\n            {% for revision in revisions -%}\n            {\n              \"relativePath\": \"build/smithy/{{ revision }}/rust-server-codegen/\",\n              \"name\": \"{{ revision }}\"\n            }\n            {% if not loop.last %}, {% endif %}\n            {% endfor %}\n          ]\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-fuzz/templates/smithy-build-targetcrate.jinja2",
    "content": "{\n  \"version\": \"1.0\",\n  \"maven\": {\n    \"dependencies\": [\n      {% for dependency in dependencies -%} \"{{ dependency }}\", {% endfor %}\n      \"software.amazon.smithy.rust.codegen.server.smithy:codegen-server:0.1.0\"\n    ],\n    \"repositories\": [\n      {\n        \"url\": \"file://{{ maven_local }}\"\n      },\n      {\n        \"url\": \"https://repo1.maven.org/maven2\"\n      }\n    ]\n  },\n  \"projections\": {\n    \"{{ revision }}\": {\n      \"imports\": [ ],\n      \"plugins\": {\n        \"rust-server-codegen\": {\n          \"runtimeConfig\": {\n            \"relativePath\": \"{{ rust_runtime }}\"\n          },\n          \"codegen\": {},\n          \"service\": \"{{ service }}\",\n          \"module\": \"test_target\",\n          \"moduleVersion\": \"0.0.1\",\n          \"moduleDescription\": \"test-{{ revision }}\",\n          \"moduleAuthors\": [\n            \"protocoltest@example.com\"\n          ]\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http/Cargo.toml",
    "content": "[package]\nname = \"aws-smithy-http\"\nversion = \"0.63.6\"\nauthors = [\n    \"AWS Rust SDK Team <aws-sdk-rust@amazon.com>\",\n    \"Russell Cohen <rcoh@amazon.com>\",\n]\ndescription = \"Smithy HTTP logic for smithy-rs.\"\nedition = \"2021\"\nlicense = \"Apache-2.0\"\nrepository = \"https://github.com/smithy-lang/smithy-rs\"\nrust-version = \"1.91.1\"\n\n[features]\nevent-stream = [\"aws-smithy-eventstream\"]\nrt-tokio = [\"aws-smithy-types/rt-tokio\"]\n\n[dependencies]\naws-smithy-eventstream = { path = \"../aws-smithy-eventstream\", optional = true }\naws-smithy-runtime-api = { path = \"../aws-smithy-runtime-api\", features = [\"client\", \"http-1x\"] }\naws-smithy-types = { path = \"../aws-smithy-types\", features = [\"byte-stream-poll-next\", \"http-body-1-x\"] }\nbytes = \"1.11.1\"\nbytes-utils = \"0.1\"\nhttp-1x = { package = \"http\", version = \"1.3.1\" }\nhttp-body-1x = { package = \"http-body\", version = \"1.0.1\" }\nhttp-body-util = \"0.1.3\"\npercent-encoding = \"2.3.1\"\npin-project-lite = \"0.2.14\"\npin-utils = \"0.1.0\"\ntracing = \"0.1.44\"\n\n# For an adapter to enable the `Stream` trait for `aws_smithy_types::byte_stream::ByteStream`\nfutures-core = \"0.3.31\"\nfutures-util = { version = \"0.3.29\", default-features = false }\n\n[dev-dependencies]\nasync-stream = \"0.3\"\nfutures-util = { version = \"0.3.29\", default-features = false }\nhyper = { version = \"1\" }\nproptest = \"1\"\ntokio = { version = \"1.49.0\", features = [\n    \"macros\",\n    \"rt\",\n    \"rt-multi-thread\",\n] }\n\n[package.metadata.docs.rs]\nall-features = true\ntargets = [\"x86_64-unknown-linux-gnu\"]\ncargo-args = [\"-Zunstable-options\", \"-Zrustdoc-scrape-examples\"]\nrustdoc-args = [\"--cfg\", \"docsrs\"]\n# End of docs.rs metadata\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http/LICENSE",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http/README.md",
    "content": "# aws-smithy-http\n\nCore HTTP primitives for service clients generated by [smithy-rs](https://github.com/smithy-lang/smithy-rs) including:\n- HTTP Body implementation\n- Endpoint support\n- HTTP header deserialization\n- Event streams\n- `ByteStream`: _(supported on crate feature `rt-tokio` only)_ a misuse-resistant abstraction for streaming binary data\n\n<!-- anchor_start:footer -->\nThis crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly.\n<!-- anchor_end:footer -->\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http/additional-ci",
    "content": "#!/bin/bash\n#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\n\n# This script contains additional CI checks to run for this specific package\n\nset -e\n\necho \"### Testing every combination of features (excluding --all-features)\"\ncargo hack test --feature-powerset --exclude-all-features\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http/external-types.toml",
    "content": "allowed_external_types = [\n    \"aws_smithy_runtime_api::*\",\n    \"aws_smithy_types::*\",\n    \"bytes::bytes::Bytes\",\n    \"http::error::Error\",\n    \"http::header::map::HeaderMap\",\n    \"http::header::map::ValueIter\",\n    \"http::header::name::HeaderName\",\n    \"http::header::value::HeaderValue\",\n    \"http::request::Builder\",\n    \"http::request::Request\",\n    \"http::response::Builder\",\n    \"http::response::Response\",\n    \"http::uri::Uri\",\n    \"http_body::frame::Frame\",\n\n    # TODO(https://github.com/smithy-lang/smithy-rs/issues/1193): Once tooling permits it, only allow the following types in the `event-stream` feature\n    \"futures_core::stream::Stream\",\n\n    # TODO(https://github.com/smithy-lang/smithy-rs/issues/1193): Once tooling permits it, only allow the following types in the `event-stream` feature\n    \"aws_smithy_eventstream::*\",\n]\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http/fuzz/.gitignore",
    "content": "target\ncorpus\nartifacts\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http/fuzz/Cargo.toml",
    "content": "[package]\nname = \"aws-smithy-http-fuzz\"\nversion = \"0.0.0\"\nauthors = [\"Automatically generated\"]\npublish = false\nedition = \"2021\"\n\n[package.metadata]\ncargo-fuzz = true\n\n[dependencies]\n# Version pinned due to https://github.com/rust-fuzz/libfuzzer/issues/126\nlibfuzzer-sys = \"=0.4.7\"\nhttp = \"0.2.3\"\n\n[dependencies.aws-smithy-http]\npath = \"..\"\n\n# Prevent this from interfering with workspaces\n[workspace]\nmembers = [\".\"]\n\n[[bin]]\nname = \"read_many_from_str\"\npath = \"fuzz_targets/read_many_from_str.rs\"\ntest = false\ndoc = false\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http/fuzz/fuzz_targets/read_many_from_str.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n#![no_main]\nuse libfuzzer_sys::fuzz_target;\n\nuse aws_smithy_http::header::read_many_from_str;\nuse http;\n\nfuzz_target!(|data: &[u8]| {\n    if let Ok(s) = std::str::from_utf8(data) {\n        if let Ok(req) = http::Request::builder().header(\"test\", s).body(()) {\n            // Shouldn't panic\n            let _ = read_many_from_str::<String>(req.headers().get_all(\"test\").iter());\n        }\n    }\n});\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http/proptest-regressions/event_stream/receiver.txt",
    "content": "# Seeds for failure cases proptest has generated in the past. It is\n# automatically read and these particular cases re-run before any\n# novel cases are generated.\n#\n# It is recommended to check this file in to source control so that\n# everyone who runs the test benefits from these saved cases.\ncc 037f145ed8bf49e5fd7dcb7d631fb5f3901746135dc93d929a6fb6bb6e7f5d02 # shrinks to b1 = 0, b2 = 0\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http/proptest-regressions/label.txt",
    "content": "# Seeds for failure cases proptest has generated in the past. It is\n# automatically read and these particular cases re-run before any\n# novel cases are generated.\n#\n# It is recommended to check this file in to source control so that\n# everyone who runs the test benefits from these saved cases.\ncc dfac816a3fc3fff8523f1a1707da0065b72fc3c0d70fce001627a8e2e7ee5e0e # shrinks to s = \">\"\ncc 22bce3cd581f5f5a55e6ba18b1fb027481a496f6b35fee6dc4ef84659b99ddca # shrinks to s = \"`\"\ncc be619cccfee48e3bf642cf0f82e98e00dceccbe10963fbaf3a622a68a55a3227 # shrinks to s = \"?\\\"\"\ncc 3e0b2e6f64642d7c58e5d2fe9223f75238a874bd8c3812dcb3ecc721d9aa0243 # shrinks to s = \" \"\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http/proptest-regressions/query.txt",
    "content": "# Seeds for failure cases proptest has generated in the past. It is\n# automatically read and these particular cases re-run before any\n# novel cases are generated.\n#\n# It is recommended to check this file in to source control so that\n# everyone who runs the test benefits from these saved cases.\ncc b8ff8401495a7e4b4604f4438d8fc6b0ba63a58ddf58273ddcb3bb511e5cf91a # shrinks to s = \"<\"\ncc 59ee40f6a097f80254a91d0ee7d6cde97a353f7ccdf83eddd1d437781019431f # shrinks to s = \"\\\"\"\ncc 65e6e5f9082c6cbebf599af889721d30d8ee2388f2f7be372520aa86526c8379 # shrinks to s = \">\"\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http/src/endpoint/error.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Errors related to endpoint resolution and validation\n\nuse std::error::Error;\nuse std::fmt;\n\n/// Endpoint resolution failed\n#[derive(Debug)]\npub struct ResolveEndpointError {\n    message: String,\n    source: Option<Box<dyn Error + Send + Sync>>,\n}\n\nimpl ResolveEndpointError {\n    /// Create an [`ResolveEndpointError`] with a message\n    pub fn message(message: impl Into<String>) -> Self {\n        Self {\n            message: message.into(),\n            source: None,\n        }\n    }\n\n    /// Add a source to the error\n    pub fn with_source(self, source: Option<Box<dyn Error + Send + Sync>>) -> Self {\n        Self { source, ..self }\n    }\n\n    /// Create a [`ResolveEndpointError`] from a message and a source\n    pub fn from_source(\n        message: impl Into<String>,\n        source: impl Into<Box<dyn Error + Send + Sync>>,\n    ) -> Self {\n        Self::message(message).with_source(Some(source.into()))\n    }\n}\n\nimpl fmt::Display for ResolveEndpointError {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        write!(f, \"{}\", self.message)\n    }\n}\n\nimpl Error for ResolveEndpointError {\n    fn source(&self) -> Option<&(dyn Error + 'static)> {\n        self.source.as_ref().map(|err| err.as_ref() as _)\n    }\n}\n\n#[derive(Debug)]\npub(super) enum InvalidEndpointErrorKind {\n    EndpointMustHaveScheme,\n    FailedToConstructAuthority {\n        authority: String,\n        source: Box<dyn Error + Send + Sync + 'static>,\n    },\n    FailedToConstructUri {\n        source: Box<dyn Error + Send + Sync + 'static>,\n    },\n}\n\n/// An error that occurs when an endpoint is found to be invalid. This usually occurs due to an\n/// incomplete URI.\n#[derive(Debug)]\npub struct InvalidEndpointError {\n    pub(super) kind: InvalidEndpointErrorKind,\n}\n\nimpl InvalidEndpointError {\n    /// Construct a build error for a missing scheme\n    pub fn endpoint_must_have_scheme() -> Self {\n        Self {\n            kind: InvalidEndpointErrorKind::EndpointMustHaveScheme,\n        }\n    }\n\n    /// Construct a build error for an invalid authority\n    pub fn failed_to_construct_authority(\n        authority: impl Into<String>,\n        source: impl Into<Box<dyn Error + Send + Sync + 'static>>,\n    ) -> Self {\n        Self {\n            kind: InvalidEndpointErrorKind::FailedToConstructAuthority {\n                authority: authority.into(),\n                source: source.into(),\n            },\n        }\n    }\n\n    /// Construct a build error for an invalid URI\n    pub fn failed_to_construct_uri(\n        source: impl Into<Box<dyn Error + Send + Sync + 'static>>,\n    ) -> Self {\n        Self {\n            kind: InvalidEndpointErrorKind::FailedToConstructUri {\n                source: source.into(),\n            },\n        }\n    }\n}\n\nimpl From<InvalidEndpointErrorKind> for InvalidEndpointError {\n    fn from(kind: InvalidEndpointErrorKind) -> Self {\n        Self { kind }\n    }\n}\n\nimpl fmt::Display for InvalidEndpointError {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        use InvalidEndpointErrorKind as ErrorKind;\n        match &self.kind {\n            ErrorKind::EndpointMustHaveScheme => write!(f, \"endpoint must contain a valid scheme\"),\n            ErrorKind::FailedToConstructAuthority { authority, source: _ } => write!(\n                f,\n                \"endpoint must contain a valid authority when combined with endpoint prefix: {authority}\"\n            ),\n            ErrorKind::FailedToConstructUri { .. } => write!(f, \"failed to construct URI\"),\n        }\n    }\n}\n\nimpl Error for InvalidEndpointError {\n    fn source(&self) -> Option<&(dyn Error + 'static)> {\n        use InvalidEndpointErrorKind as ErrorKind;\n        match &self.kind {\n            ErrorKind::FailedToConstructUri { source } => Some(source.as_ref()),\n            ErrorKind::FailedToConstructAuthority {\n                authority: _,\n                source,\n            } => Some(source.as_ref()),\n            ErrorKind::EndpointMustHaveScheme => None,\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http/src/endpoint.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Code for resolving an endpoint (URI) that a request should be sent to\n\nuse aws_smithy_runtime_api::client::endpoint::{error::InvalidEndpointError, EndpointPrefix};\nuse std::borrow::Cow;\nuse std::result::Result as StdResult;\nuse std::str::FromStr;\n\npub mod error;\npub use error::ResolveEndpointError;\n\n/// An endpoint-resolution-specific Result. Contains either an [`Endpoint`](aws_smithy_types::endpoint::Endpoint) or a [`ResolveEndpointError`].\n#[deprecated(since = \"0.60.1\", note = \"Was never used.\")]\npub type Result = std::result::Result<aws_smithy_types::endpoint::Endpoint, ResolveEndpointError>;\n\n/// Apply `endpoint` to `uri`\n///\n/// This method mutates `uri` by setting the `endpoint` on it\npub fn apply_endpoint(\n    uri: &mut http_1x::Uri,\n    endpoint: &http_1x::Uri,\n    prefix: Option<&EndpointPrefix>,\n) -> StdResult<(), InvalidEndpointError> {\n    let prefix = prefix.map(EndpointPrefix::as_str).unwrap_or(\"\");\n    let authority = endpoint\n        .authority()\n        .as_ref()\n        .map(|auth| auth.as_str())\n        .unwrap_or(\"\");\n    let authority = if !prefix.is_empty() {\n        Cow::Owned(format!(\"{prefix}{authority}\"))\n    } else {\n        Cow::Borrowed(authority)\n    };\n    let authority = http_1x::uri::Authority::from_str(&authority).map_err(|err| {\n        InvalidEndpointError::failed_to_construct_authority(authority.into_owned(), err)\n    })?;\n    let scheme = *endpoint\n        .scheme()\n        .as_ref()\n        .ok_or_else(InvalidEndpointError::endpoint_must_have_scheme)?;\n    let new_uri = http_1x::Uri::builder()\n        .authority(authority)\n        .scheme(scheme.clone())\n        .path_and_query(merge_paths(endpoint, uri).as_ref())\n        .build()\n        .map_err(InvalidEndpointError::failed_to_construct_uri)?;\n    *uri = new_uri;\n    Ok(())\n}\n\nfn merge_paths<'a>(endpoint: &'a http_1x::Uri, uri: &'a http_1x::Uri) -> Cow<'a, str> {\n    if let Some(query) = endpoint.path_and_query().and_then(|pq| pq.query()) {\n        tracing::warn!(query = %query, \"query specified in endpoint will be ignored during endpoint resolution\");\n    }\n    let endpoint_path = endpoint.path();\n    let uri_path_and_query = uri.path_and_query().map(|pq| pq.as_str()).unwrap_or(\"\");\n    if endpoint_path.is_empty() {\n        Cow::Borrowed(uri_path_and_query)\n    } else {\n        let ep_no_slash = endpoint_path.strip_suffix('/').unwrap_or(endpoint_path);\n        let uri_path_no_slash = uri_path_and_query\n            .strip_prefix('/')\n            .unwrap_or(uri_path_and_query);\n        Cow::Owned(format!(\"{ep_no_slash}/{uri_path_no_slash}\"))\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http/src/event_stream/receiver.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_smithy_eventstream::frame::{\n    DecodedFrame, MessageFrameDecoder, UnmarshallMessage, UnmarshalledMessage,\n};\nuse aws_smithy_runtime_api::client::result::{ConnectorError, ResponseError, SdkError};\nuse aws_smithy_types::body::SdkBody;\nuse aws_smithy_types::event_stream::{Message, RawMessage};\nuse bytes::Buf;\nuse bytes::Bytes;\nuse bytes_utils::SegmentedBuf;\nuse std::error::Error as StdError;\nuse std::fmt;\nuse std::marker::PhantomData;\nuse std::mem;\nuse tracing::trace;\n\n/// Wrapper around SegmentedBuf that tracks the state of the stream.\n#[derive(Debug)]\nenum RecvBuf {\n    /// Nothing has been buffered yet.\n    Empty,\n    /// Some data has been buffered.\n    /// The SegmentedBuf will automatically purge when it reads off the end of a chunk boundary.\n    Partial(SegmentedBuf<Bytes>),\n    /// The end of the stream has been reached, but there may still be some buffered data.\n    EosPartial(SegmentedBuf<Bytes>),\n    /// An exception terminated this stream.\n    Terminated,\n}\n\nimpl RecvBuf {\n    /// Returns true if there's more buffered data.\n    fn has_data(&self) -> bool {\n        match self {\n            RecvBuf::Empty | RecvBuf::Terminated => false,\n            RecvBuf::Partial(segments) | RecvBuf::EosPartial(segments) => segments.remaining() > 0,\n        }\n    }\n\n    /// Returns true if the stream has ended.\n    fn is_eos(&self) -> bool {\n        matches!(self, RecvBuf::EosPartial(_) | RecvBuf::Terminated)\n    }\n\n    /// Returns a mutable reference to the underlying buffered data.\n    fn buffered(&mut self) -> &mut SegmentedBuf<Bytes> {\n        match self {\n            RecvBuf::Empty => panic!(\"buffer must be populated before reading; this is a bug\"),\n            RecvBuf::Partial(segmented) => segmented,\n            RecvBuf::EosPartial(segmented) => segmented,\n            RecvBuf::Terminated => panic!(\"buffer has been terminated; this is a bug\"),\n        }\n    }\n\n    /// Returns a new `RecvBuf` with additional data buffered. This will only allocate\n    /// if the `RecvBuf` was previously empty.\n    fn with_partial(self, partial: Bytes) -> Self {\n        match self {\n            RecvBuf::Empty => {\n                let mut segmented = SegmentedBuf::new();\n                segmented.push(partial);\n                RecvBuf::Partial(segmented)\n            }\n            RecvBuf::Partial(mut segmented) => {\n                segmented.push(partial);\n                RecvBuf::Partial(segmented)\n            }\n            RecvBuf::EosPartial(_) | RecvBuf::Terminated => {\n                panic!(\"cannot buffer more data after the stream has ended or been terminated; this is a bug\")\n            }\n        }\n    }\n\n    /// Returns a `RecvBuf` that has reached end of stream.\n    fn ended(self) -> Self {\n        match self {\n            RecvBuf::Empty => RecvBuf::EosPartial(SegmentedBuf::new()),\n            RecvBuf::Partial(segmented) => RecvBuf::EosPartial(segmented),\n            RecvBuf::EosPartial(_) => panic!(\"already end of stream; this is a bug\"),\n            RecvBuf::Terminated => panic!(\"stream terminated; this is a bug\"),\n        }\n    }\n}\n\n#[derive(Debug)]\nenum ReceiverErrorKind {\n    /// The stream ended before a complete message frame was received.\n    UnexpectedEndOfStream,\n}\n\n/// An error that occurs within an event stream receiver.\n#[derive(Debug)]\npub struct ReceiverError {\n    kind: ReceiverErrorKind,\n}\n\nimpl fmt::Display for ReceiverError {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        match self.kind {\n            ReceiverErrorKind::UnexpectedEndOfStream => write!(f, \"unexpected end of stream\"),\n        }\n    }\n}\n\nimpl StdError for ReceiverError {}\n\n/// Receives Smithy-modeled messages out of an Event Stream.\n#[derive(Debug)]\npub struct Receiver<T, E> {\n    unmarshaller: Box<dyn UnmarshallMessage<Output = T, Error = E> + Send + Sync>,\n    decoder: MessageFrameDecoder,\n    buffer: RecvBuf,\n    body: SdkBody,\n    /// Event Stream has optional initial response frames an with `:message-type` of\n    /// `initial-response`. If `try_recv_initial()` is called and the next message isn't an\n    /// initial response, then the message will be stored in `buffered_message` so that it can\n    /// be returned with the next call of `recv()`.\n    buffered_message: Option<Message>,\n    _phantom: PhantomData<E>,\n}\n\n// Used by `Receiver::try_recv_initial`, hence this enum is also doc hidden\n#[doc(hidden)]\n#[non_exhaustive]\npub enum InitialMessageType {\n    Request,\n    Response,\n}\n\nimpl InitialMessageType {\n    fn as_str(&self) -> &'static str {\n        match self {\n            InitialMessageType::Request => \"initial-request\",\n            InitialMessageType::Response => \"initial-response\",\n        }\n    }\n}\n\nimpl<T, E> Receiver<T, E> {\n    /// Creates a new `Receiver` with the given message unmarshaller and SDK body.\n    pub fn new(\n        unmarshaller: impl UnmarshallMessage<Output = T, Error = E> + Send + Sync + 'static,\n        body: SdkBody,\n    ) -> Self {\n        Receiver {\n            unmarshaller: Box::new(unmarshaller),\n            decoder: MessageFrameDecoder::new(),\n            buffer: RecvBuf::Empty,\n            body,\n            buffered_message: None,\n            _phantom: Default::default(),\n        }\n    }\n\n    fn unmarshall(&self, message: Message) -> Result<Option<T>, SdkError<E, RawMessage>> {\n        match self.unmarshaller.unmarshall(&message) {\n            Ok(unmarshalled) => match unmarshalled {\n                UnmarshalledMessage::Event(event) => Ok(Some(event)),\n                UnmarshalledMessage::Error(err) => {\n                    Err(SdkError::service_error(err, RawMessage::Decoded(message)))\n                }\n            },\n            Err(err) => Err(SdkError::response_error(err, RawMessage::Decoded(message))),\n        }\n    }\n\n    async fn buffer_next_chunk(&mut self) -> Result<(), SdkError<E, RawMessage>> {\n        use http_body_util::BodyExt;\n\n        if !self.buffer.is_eos() {\n            let next_chunk = self\n                .body\n                .frame()\n                .await\n                .transpose()\n                .map_err(|err| SdkError::dispatch_failure(ConnectorError::io(err)))?;\n            let buffer = mem::replace(&mut self.buffer, RecvBuf::Empty);\n            if let Some(chunk) = next_chunk {\n                // Ignoring the possibility of trailers here since event_streams don't have them\n                if let Ok(data) = chunk.into_data() {\n                    self.buffer = buffer.with_partial(data);\n                }\n            } else {\n                self.buffer = buffer.ended();\n            }\n        }\n        Ok(())\n    }\n\n    async fn next_message(&mut self) -> Result<Option<Message>, SdkError<E, RawMessage>> {\n        while !self.buffer.is_eos() {\n            if self.buffer.has_data() {\n                if let DecodedFrame::Complete(message) = self\n                    .decoder\n                    .decode_frame(self.buffer.buffered())\n                    .map_err(|err| {\n                        SdkError::response_error(\n                            err,\n                            // the buffer has been consumed\n                            RawMessage::Invalid(None),\n                        )\n                    })?\n                {\n                    trace!(message = ?message, \"received complete event stream message\");\n                    return Ok(Some(message));\n                }\n            }\n\n            self.buffer_next_chunk().await?;\n        }\n        if self.buffer.has_data() {\n            trace!(remaining_data = ?self.buffer, \"data left over in the event stream response stream\");\n            let buf = self.buffer.buffered();\n            return Err(SdkError::response_error(\n                ReceiverError {\n                    kind: ReceiverErrorKind::UnexpectedEndOfStream,\n                },\n                RawMessage::invalid(Some(buf.copy_to_bytes(buf.remaining()))),\n            ));\n        }\n        Ok(None)\n    }\n\n    /// Tries to receive the initial response message that has `:event-type` of a given `message_type`.\n    /// If a different event type is received, then it is buffered and `Ok(None)` is returned.\n    #[doc(hidden)]\n    pub async fn try_recv_initial(\n        &mut self,\n        message_type: InitialMessageType,\n    ) -> Result<Option<Message>, SdkError<E, RawMessage>> {\n        self.try_recv_initial_with_preprocessor(message_type, |msg| Ok((msg, ())))\n            .await\n            .map(|opt| opt.map(|(msg, _)| msg))\n    }\n\n    /// Tries to receive the initial response message with preprocessing support.\n    ///\n    /// The preprocessor function can transform the raw message (e.g., unwrap envelopes)\n    /// and return metadata alongside the transformed message. If the transformed message\n    /// matches the expected `message_type`, both the message and metadata are returned.\n    /// Otherwise, the transformed message is buffered and `Ok(None)` is returned.\n    #[doc(hidden)]\n    pub async fn try_recv_initial_with_preprocessor<F, M>(\n        &mut self,\n        message_type: InitialMessageType,\n        preprocessor: F,\n    ) -> Result<Option<(Message, M)>, SdkError<E, RawMessage>>\n    where\n        F: FnOnce(Message) -> Result<(Message, M), ResponseError<RawMessage>>,\n    {\n        if let Some(message) = self.next_message().await? {\n            let (processed_message, metadata) =\n                preprocessor(message.clone()).map_err(|err| SdkError::ResponseError(err))?;\n\n            if let Some(event_type) = processed_message\n                .headers()\n                .iter()\n                .find(|h| h.name().as_str() == \":event-type\")\n            {\n                if event_type\n                    .value()\n                    .as_string()\n                    .map(|s| s.as_str() == message_type.as_str())\n                    .unwrap_or(false)\n                {\n                    return Ok(Some((processed_message, metadata)));\n                }\n            }\n            // Buffer the processed message so that it can be returned by the next call to `recv()`\n            self.buffered_message = Some(message);\n        }\n        Ok(None)\n    }\n\n    /// Asynchronously tries to receive a message from the stream. If the stream has ended,\n    /// it returns an `Ok(None)`. If there is a transport layer error, it will return\n    /// `Err(SdkError::DispatchFailure)`. Service-modeled errors will be a part of the returned\n    /// messages.\n    pub async fn recv(&mut self) -> Result<Option<T>, SdkError<E, RawMessage>> {\n        if let Some(buffered) = self.buffered_message.take() {\n            return match self.unmarshall(buffered) {\n                Ok(message) => Ok(message),\n                Err(error) => {\n                    self.buffer = RecvBuf::Terminated;\n                    Err(error)\n                }\n            };\n        }\n        if let Some(message) = self.next_message().await? {\n            match self.unmarshall(message) {\n                Ok(message) => Ok(message),\n                Err(error) => {\n                    self.buffer = RecvBuf::Terminated;\n                    Err(error)\n                }\n            }\n        } else {\n            Ok(None)\n        }\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::{InitialMessageType, Receiver, UnmarshallMessage};\n    use aws_smithy_eventstream::error::Error as EventStreamError;\n    use aws_smithy_eventstream::frame::{write_message_to, UnmarshalledMessage};\n    use aws_smithy_runtime_api::client::result::SdkError;\n    use aws_smithy_types::body::SdkBody;\n    use aws_smithy_types::event_stream::{Header, HeaderValue, Message};\n    use bytes::Bytes;\n    use http_body_1x::Frame;\n    use std::error::Error as StdError;\n    use std::io::{Error as IOError, ErrorKind};\n\n    fn encode_initial_response() -> Bytes {\n        let mut buffer = Vec::new();\n        let message = Message::new(Bytes::new())\n            .add_header(Header::new(\n                \":message-type\",\n                HeaderValue::String(\"event\".into()),\n            ))\n            .add_header(Header::new(\n                \":event-type\",\n                HeaderValue::String(\"initial-response\".into()),\n            ));\n        write_message_to(&message, &mut buffer).unwrap();\n        buffer.into()\n    }\n\n    fn encode_message(message: &str) -> Bytes {\n        let mut buffer = Vec::new();\n        let message = Message::new(Bytes::copy_from_slice(message.as_bytes()));\n        write_message_to(&message, &mut buffer).unwrap();\n        buffer.into()\n    }\n\n    fn map_to_frame(stream: Vec<Result<Bytes, IOError>>) -> Vec<Result<Frame<Bytes>, IOError>> {\n        stream\n            .into_iter()\n            .map(|chunk| chunk.map(Frame::data))\n            .collect()\n    }\n\n    #[derive(Debug)]\n    struct FakeError;\n    impl std::fmt::Display for FakeError {\n        fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n            write!(f, \"FakeError\")\n        }\n    }\n    impl StdError for FakeError {}\n\n    #[derive(Debug, Eq, PartialEq)]\n    struct TestMessage(String);\n\n    #[derive(Debug)]\n    struct Unmarshaller;\n    impl UnmarshallMessage for Unmarshaller {\n        type Output = TestMessage;\n        type Error = EventStreamError;\n\n        fn unmarshall(\n            &self,\n            message: &Message,\n        ) -> Result<UnmarshalledMessage<Self::Output, Self::Error>, EventStreamError> {\n            Ok(UnmarshalledMessage::Event(TestMessage(\n                std::str::from_utf8(&message.payload()[..]).unwrap().into(),\n            )))\n        }\n    }\n\n    #[tokio::test]\n    async fn receive_success() {\n        let chunks: Vec<Result<_, IOError>> =\n            map_to_frame(vec![Ok(encode_message(\"one\")), Ok(encode_message(\"two\"))]);\n        let chunk_stream = futures_util::stream::iter(chunks);\n        let stream_body = http_body_util::StreamBody::new(chunk_stream);\n        let body = SdkBody::from_body_1_x(stream_body);\n\n        let mut receiver = Receiver::<TestMessage, EventStreamError>::new(Unmarshaller, body);\n\n        assert_eq!(\n            TestMessage(\"one\".into()),\n            receiver.recv().await.unwrap().unwrap()\n        );\n        assert_eq!(\n            TestMessage(\"two\".into()),\n            receiver.recv().await.unwrap().unwrap()\n        );\n        assert_eq!(None, receiver.recv().await.unwrap());\n    }\n\n    #[tokio::test]\n    async fn receive_last_chunk_empty() {\n        let chunks: Vec<Result<_, IOError>> = map_to_frame(vec![\n            Ok(encode_message(\"one\")),\n            Ok(encode_message(\"two\")),\n            Ok(Bytes::from_static(&[])),\n        ]);\n        let chunk_stream = futures_util::stream::iter(chunks);\n        let stream_body = http_body_util::StreamBody::new(chunk_stream);\n        let body = SdkBody::from_body_1_x(stream_body);\n        let mut receiver = Receiver::<TestMessage, EventStreamError>::new(Unmarshaller, body);\n        assert_eq!(\n            TestMessage(\"one\".into()),\n            receiver.recv().await.unwrap().unwrap()\n        );\n        assert_eq!(\n            TestMessage(\"two\".into()),\n            receiver.recv().await.unwrap().unwrap()\n        );\n        assert_eq!(None, receiver.recv().await.unwrap());\n    }\n\n    #[tokio::test]\n    async fn receive_last_chunk_not_full_message() {\n        let chunks: Vec<Result<_, IOError>> = map_to_frame(vec![\n            Ok(encode_message(\"one\")),\n            Ok(encode_message(\"two\")),\n            Ok(encode_message(\"three\").split_to(10)),\n        ]);\n        let chunk_stream = futures_util::stream::iter(chunks);\n        let stream_body = http_body_util::StreamBody::new(chunk_stream);\n        let body = SdkBody::from_body_1_x(stream_body);\n        let mut receiver = Receiver::<TestMessage, EventStreamError>::new(Unmarshaller, body);\n        assert_eq!(\n            TestMessage(\"one\".into()),\n            receiver.recv().await.unwrap().unwrap()\n        );\n        assert_eq!(\n            TestMessage(\"two\".into()),\n            receiver.recv().await.unwrap().unwrap()\n        );\n        assert!(matches!(\n            receiver.recv().await,\n            Err(SdkError::ResponseError { .. }),\n        ));\n    }\n\n    #[tokio::test]\n    async fn receive_last_chunk_has_multiple_messages() {\n        let chunks: Vec<Result<_, IOError>> = map_to_frame(vec![\n            Ok(encode_message(\"one\")),\n            Ok(encode_message(\"two\")),\n            Ok(Bytes::from(\n                [encode_message(\"three\"), encode_message(\"four\")].concat(),\n            )),\n        ]);\n        let chunk_stream = futures_util::stream::iter(chunks);\n        let stream_body = http_body_util::StreamBody::new(chunk_stream);\n        let body = SdkBody::from_body_1_x(stream_body);\n        let mut receiver = Receiver::<TestMessage, EventStreamError>::new(Unmarshaller, body);\n        assert_eq!(\n            TestMessage(\"one\".into()),\n            receiver.recv().await.unwrap().unwrap()\n        );\n        assert_eq!(\n            TestMessage(\"two\".into()),\n            receiver.recv().await.unwrap().unwrap()\n        );\n        assert_eq!(\n            TestMessage(\"three\".into()),\n            receiver.recv().await.unwrap().unwrap()\n        );\n        assert_eq!(\n            TestMessage(\"four\".into()),\n            receiver.recv().await.unwrap().unwrap()\n        );\n        assert_eq!(None, receiver.recv().await.unwrap());\n    }\n\n    proptest::proptest! {\n        #[test]\n        fn receive_multiple_messages_split_unevenly_across_chunks(b1: usize, b2: usize) {\n            let combined = Bytes::from([\n                encode_message(\"one\"),\n                encode_message(\"two\"),\n                encode_message(\"three\"),\n                encode_message(\"four\"),\n                encode_message(\"five\"),\n                encode_message(\"six\"),\n                encode_message(\"seven\"),\n                encode_message(\"eight\"),\n            ].concat());\n\n            let midpoint = combined.len() / 2;\n            let (start, boundary1, boundary2, end) = (\n                0,\n                b1 % midpoint,\n                midpoint + b2 % midpoint,\n                combined.len()\n            );\n            println!(\"[{start}, {boundary1}], [{boundary1}, {boundary2}], [{boundary2}, {end}]\");\n\n            let rt = tokio::runtime::Runtime::new().unwrap();\n            rt.block_on(async move {\n                let chunks: Vec<Result<_, IOError>> = map_to_frame(vec![\n                    Ok(Bytes::copy_from_slice(&combined[start..boundary1])),\n                    Ok(Bytes::copy_from_slice(&combined[boundary1..boundary2])),\n                    Ok(Bytes::copy_from_slice(&combined[boundary2..end])),\n                ]);\n\n                let chunk_stream = futures_util::stream::iter(chunks);\n                let stream_body = http_body_util::StreamBody::new(chunk_stream);\n                let body = SdkBody::from_body_1_x(stream_body);\n                let mut receiver = Receiver::<TestMessage, EventStreamError>::new(Unmarshaller, body);\n                for payload in &[\"one\", \"two\", \"three\", \"four\", \"five\", \"six\", \"seven\", \"eight\"] {\n                    assert_eq!(\n                        TestMessage((*payload).into()),\n                        receiver.recv().await.unwrap().unwrap()\n                    );\n                }\n                assert_eq!(None, receiver.recv().await.unwrap());\n            });\n        }\n    }\n\n    #[tokio::test]\n    async fn receive_network_failure() {\n        let chunks: Vec<Result<_, IOError>> = map_to_frame(vec![\n            Ok(encode_message(\"one\")),\n            Err(IOError::new(ErrorKind::ConnectionReset, FakeError)),\n        ]);\n        let chunk_stream = futures_util::stream::iter(chunks);\n        let stream_body = http_body_util::StreamBody::new(chunk_stream);\n        let body = SdkBody::from_body_1_x(stream_body);\n        let mut receiver = Receiver::<TestMessage, EventStreamError>::new(Unmarshaller, body);\n        assert_eq!(\n            TestMessage(\"one\".into()),\n            receiver.recv().await.unwrap().unwrap()\n        );\n        assert!(matches!(\n            receiver.recv().await,\n            Err(SdkError::DispatchFailure(_))\n        ));\n    }\n\n    #[tokio::test]\n    async fn receive_message_parse_failure() {\n        let chunks: Vec<Result<_, IOError>> = map_to_frame(vec![\n            Ok(encode_message(\"one\")),\n            // A zero length message will be invalid. We need to provide a minimum of 12 bytes\n            // for the MessageFrameDecoder to actually start parsing it.\n            Ok(Bytes::from_static(&[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])),\n        ]);\n        let chunk_stream = futures_util::stream::iter(chunks);\n        let stream_body = http_body_util::StreamBody::new(chunk_stream);\n        let body = SdkBody::from_body_1_x(stream_body);\n        let mut receiver = Receiver::<TestMessage, EventStreamError>::new(Unmarshaller, body);\n        assert_eq!(\n            TestMessage(\"one\".into()),\n            receiver.recv().await.unwrap().unwrap()\n        );\n        assert!(matches!(\n            receiver.recv().await,\n            Err(SdkError::ResponseError { .. })\n        ));\n    }\n\n    #[tokio::test]\n    async fn receive_initial_response() {\n        let chunks: Vec<Result<_, IOError>> = map_to_frame(vec![\n            Ok(encode_initial_response()),\n            Ok(encode_message(\"one\")),\n        ]);\n        let chunk_stream = futures_util::stream::iter(chunks);\n        let stream_body = http_body_util::StreamBody::new(chunk_stream);\n        let body = SdkBody::from_body_1_x(stream_body);\n        let mut receiver = Receiver::<TestMessage, EventStreamError>::new(Unmarshaller, body);\n        assert!(receiver\n            .try_recv_initial(InitialMessageType::Response)\n            .await\n            .unwrap()\n            .is_some());\n        assert_eq!(\n            TestMessage(\"one\".into()),\n            receiver.recv().await.unwrap().unwrap()\n        );\n    }\n\n    #[tokio::test]\n    async fn receive_no_initial_response() {\n        let chunks: Vec<Result<_, IOError>> =\n            map_to_frame(vec![Ok(encode_message(\"one\")), Ok(encode_message(\"two\"))]);\n        let chunk_stream = futures_util::stream::iter(chunks);\n        let stream_body = http_body_util::StreamBody::new(chunk_stream);\n\n        let body = SdkBody::from_body_1_x(stream_body);\n        let mut receiver = Receiver::<TestMessage, EventStreamError>::new(Unmarshaller, body);\n        assert!(receiver\n            .try_recv_initial(InitialMessageType::Response)\n            .await\n            .unwrap()\n            .is_none());\n        assert_eq!(\n            TestMessage(\"one\".into()),\n            receiver.recv().await.unwrap().unwrap()\n        );\n        assert_eq!(\n            TestMessage(\"two\".into()),\n            receiver.recv().await.unwrap().unwrap()\n        );\n    }\n\n    fn assert_send_and_sync<T: Send + Sync>() {}\n\n    #[tokio::test]\n    async fn receiver_is_send_and_sync() {\n        assert_send_and_sync::<Receiver<(), ()>>();\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http/src/event_stream/sender.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_smithy_eventstream::frame::{write_message_to, MarshallMessage, SignMessage};\nuse aws_smithy_eventstream::message_size_hint::MessageSizeHint;\nuse aws_smithy_runtime_api::client::result::SdkError;\nuse aws_smithy_types::error::ErrorMetadata;\nuse aws_smithy_types::event_stream::Message;\nuse bytes::Bytes;\nuse futures_core::Stream;\nuse std::error::Error as StdError;\nuse std::fmt;\nuse std::fmt::Debug;\nuse std::marker::PhantomData;\nuse std::pin::Pin;\nuse std::task::{Context, Poll};\nuse tracing::trace;\n\n/// Wrapper for event stream items that may include an initial-request message.\n/// This is used internally to allow initial messages to flow through the signing pipeline.\n#[doc(hidden)]\n#[derive(Debug)]\npub enum EventOrInitial<T> {\n    /// A regular event that needs marshalling and signing\n    Event(T),\n    /// An initial-request message that's already marshalled, just needs signing\n    InitialMessage(Message),\n}\n\n/// Input type for Event Streams.\npub struct EventStreamSender<T, E> {\n    input_stream: Pin<Box<dyn Stream<Item = Result<T, E>> + Send + Sync>>,\n}\n\nimpl<T, E> Debug for EventStreamSender<T, E> {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        let name_t = std::any::type_name::<T>();\n        let name_e = std::any::type_name::<E>();\n        write!(f, \"EventStreamSender<{name_t}, {name_e}>\")\n    }\n}\n\nimpl<T: Send + Sync + 'static, E: StdError + Send + Sync + 'static> EventStreamSender<T, E> {\n    /// Creates an `EventStreamSender` from a single item.\n    pub fn once(item: Result<T, E>) -> Self {\n        Self::from(futures_util::stream::once(async move { item }))\n    }\n}\n\nimpl<T: Send + Sync, E: StdError + Send + Sync + 'static> EventStreamSender<T, E> {\n    #[doc(hidden)]\n    pub fn into_body_stream(\n        self,\n        marshaller: impl MarshallMessage<Input = T> + Send + Sync + 'static,\n        error_marshaller: impl MarshallMessage<Input = E> + Send + Sync + 'static,\n        signer: impl SignMessage + Send + Sync + 'static,\n    ) -> MessageStreamAdapter<T, E> {\n        MessageStreamAdapter::new(marshaller, error_marshaller, signer, self.input_stream)\n    }\n\n    /// Extract the inner stream. This is used internally for composing streams.\n    #[doc(hidden)]\n    pub fn into_inner(self) -> Pin<Box<dyn Stream<Item = Result<T, E>> + Send + Sync>> {\n        self.input_stream\n    }\n}\n\nimpl<T, E, S> From<S> for EventStreamSender<T, E>\nwhere\n    S: Stream<Item = Result<T, E>> + Send + Sync + 'static,\n{\n    fn from(stream: S) -> Self {\n        EventStreamSender {\n            input_stream: Box::pin(stream),\n        }\n    }\n}\n\n/// An error that occurs within a message stream.\n#[derive(Debug)]\npub struct MessageStreamError {\n    kind: MessageStreamErrorKind,\n    pub(crate) meta: ErrorMetadata,\n}\n\n#[derive(Debug)]\nenum MessageStreamErrorKind {\n    Unhandled(Box<dyn std::error::Error + Send + Sync + 'static>),\n}\n\nimpl MessageStreamError {\n    /// Creates the `MessageStreamError::Unhandled` variant from any error type.\n    pub fn unhandled(err: impl Into<Box<dyn std::error::Error + Send + Sync + 'static>>) -> Self {\n        Self {\n            meta: Default::default(),\n            kind: MessageStreamErrorKind::Unhandled(err.into()),\n        }\n    }\n\n    /// Creates the `MessageStreamError::Unhandled` variant from an [`ErrorMetadata`].\n    pub fn generic(err: ErrorMetadata) -> Self {\n        Self {\n            meta: err.clone(),\n            kind: MessageStreamErrorKind::Unhandled(err.into()),\n        }\n    }\n\n    /// Returns error metadata, which includes the error code, message,\n    /// request ID, and potentially additional information.\n    pub fn meta(&self) -> &ErrorMetadata {\n        &self.meta\n    }\n}\n\nimpl StdError for MessageStreamError {\n    fn source(&self) -> Option<&(dyn StdError + 'static)> {\n        match &self.kind {\n            MessageStreamErrorKind::Unhandled(source) => Some(source.as_ref() as _),\n        }\n    }\n}\n\nimpl fmt::Display for MessageStreamError {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        match &self.kind {\n            MessageStreamErrorKind::Unhandled(_) => write!(f, \"message stream error\"),\n        }\n    }\n}\n\n/// Adapts a `Stream<SmithyMessageType>` to a signed `Stream<Bytes>` by using the provided\n/// message marshaller and signer implementations.\n///\n/// This will yield an `Err(SdkError::ConstructionFailure)` if a message can't be\n/// marshalled into an Event Stream frame, (e.g., if the message payload was too large).\n#[allow(missing_debug_implementations)]\npub struct MessageStreamAdapter<T: Send + Sync, E: StdError + Send + Sync + 'static> {\n    marshaller: Box<dyn MarshallMessage<Input = T> + Send + Sync>,\n    error_marshaller: Box<dyn MarshallMessage<Input = E> + Send + Sync>,\n    signer: Box<dyn SignMessage + Send + Sync>,\n    stream: Pin<Box<dyn Stream<Item = Result<T, E>> + Send + Sync>>,\n    end_signal_sent: bool,\n    _phantom: PhantomData<E>,\n}\n\nimpl<T: Send + Sync, E: StdError + Send + Sync + 'static> Unpin for MessageStreamAdapter<T, E> {}\n\nimpl<T: Send + Sync, E: StdError + Send + Sync + 'static> MessageStreamAdapter<T, E> {\n    /// Create a new `MessageStreamAdapter`.\n    pub fn new(\n        marshaller: impl MarshallMessage<Input = T> + Send + Sync + 'static,\n        error_marshaller: impl MarshallMessage<Input = E> + Send + Sync + 'static,\n        signer: impl SignMessage + Send + Sync + 'static,\n        stream: Pin<Box<dyn Stream<Item = Result<T, E>> + Send + Sync>>,\n    ) -> Self {\n        MessageStreamAdapter {\n            marshaller: Box::new(marshaller),\n            error_marshaller: Box::new(error_marshaller),\n            signer: Box::new(signer),\n            stream,\n            end_signal_sent: false,\n            _phantom: Default::default(),\n        }\n    }\n}\n\nimpl<T: Send + Sync, E: StdError + Send + Sync + 'static> Stream for MessageStreamAdapter<T, E> {\n    type Item = Result<\n        http_body_1x::Frame<Bytes>,\n        SdkError<E, aws_smithy_runtime_api::client::orchestrator::HttpResponse>,\n    >;\n\n    fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Option<Self::Item>> {\n        match self.stream.as_mut().poll_next(cx) {\n            Poll::Ready(message_option) => {\n                if let Some(message_result) = message_option {\n                    let message = match message_result {\n                        Ok(message) => self\n                            .marshaller\n                            .marshall(message)\n                            .map_err(SdkError::construction_failure)?,\n                        Err(message) => self\n                            .error_marshaller\n                            .marshall(message)\n                            .map_err(SdkError::construction_failure)?,\n                    };\n\n                    trace!(unsigned_message = ?message, \"signing event stream message\");\n                    let message = self\n                        .signer\n                        .sign(message)\n                        .map_err(SdkError::construction_failure)?;\n\n                    let mut buffer = Vec::with_capacity(message.size_hint());\n                    write_message_to(&message, &mut buffer)\n                        .map_err(SdkError::construction_failure)?;\n                    trace!(signed_message = ?buffer, \"sending signed event stream message\");\n                    Poll::Ready(Some(Ok(http_body_1x::Frame::data(Bytes::from(buffer)))))\n                } else if !self.end_signal_sent {\n                    self.end_signal_sent = true;\n                    match self.signer.sign_empty() {\n                        Some(sign) => {\n                            let message = sign.map_err(SdkError::construction_failure)?;\n                            let mut buffer = Vec::with_capacity(message.size_hint());\n                            write_message_to(&message, &mut buffer)\n                                .map_err(SdkError::construction_failure)?;\n                            trace!(signed_message = ?buffer, \"sending signed empty message to terminate the event stream\");\n                            Poll::Ready(Some(Ok(http_body_1x::Frame::data(Bytes::from(buffer)))))\n                        }\n                        None => Poll::Ready(None),\n                    }\n                } else {\n                    Poll::Ready(None)\n                }\n            }\n            Poll::Pending => Poll::Pending,\n        }\n    }\n}\n\n/// Marshaller wrapper that handles both regular events and initial messages.\n/// This is used internally to support initial-request messages in event streams.\n#[doc(hidden)]\n#[derive(Debug)]\npub struct EventOrInitialMarshaller<M> {\n    inner: M,\n}\n\nimpl<M> EventOrInitialMarshaller<M> {\n    #[doc(hidden)]\n    pub fn new(inner: M) -> Self {\n        Self { inner }\n    }\n}\n\nimpl<M, T> MarshallMessage for EventOrInitialMarshaller<M>\nwhere\n    M: MarshallMessage<Input = T>,\n{\n    type Input = EventOrInitial<T>;\n\n    fn marshall(\n        &self,\n        input: Self::Input,\n    ) -> Result<Message, aws_smithy_eventstream::error::Error> {\n        match input {\n            EventOrInitial::Event(event) => self.inner.marshall(event),\n            EventOrInitial::InitialMessage(message) => Ok(message),\n        }\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::MarshallMessage;\n    use crate::event_stream::{EventStreamSender, MessageStreamAdapter};\n    use async_stream::stream;\n    use aws_smithy_eventstream::error::Error as EventStreamError;\n    use aws_smithy_eventstream::frame::{\n        read_message_from, write_message_to, NoOpSigner, SignMessage, SignMessageError,\n    };\n    use aws_smithy_runtime_api::client::result::SdkError;\n    use aws_smithy_types::event_stream::{Header, HeaderValue, Message};\n    use futures_util::stream::StreamExt;\n    use std::error::Error as StdError;\n\n    #[derive(Debug, Eq, PartialEq)]\n    struct TestMessage(String);\n\n    #[derive(Debug)]\n    struct Marshaller;\n    impl MarshallMessage for Marshaller {\n        type Input = TestMessage;\n\n        fn marshall(&self, input: Self::Input) -> Result<Message, EventStreamError> {\n            Ok(Message::new(input.0.as_bytes().to_vec()))\n        }\n    }\n    #[derive(Debug)]\n    struct ErrorMarshaller;\n    impl MarshallMessage for ErrorMarshaller {\n        type Input = TestServiceError;\n\n        fn marshall(&self, _input: Self::Input) -> Result<Message, EventStreamError> {\n            Err(read_message_from(&b\"\"[..]).expect_err(\"this should always fail\"))\n        }\n    }\n\n    #[derive(Debug)]\n    struct TestServiceError;\n    impl std::fmt::Display for TestServiceError {\n        fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n            write!(f, \"TestServiceError\")\n        }\n    }\n    impl StdError for TestServiceError {}\n\n    #[derive(Debug)]\n    struct TestSigner;\n    impl SignMessage for TestSigner {\n        fn sign(&mut self, message: Message) -> Result<Message, SignMessageError> {\n            let mut buffer = Vec::new();\n            write_message_to(&message, &mut buffer).unwrap();\n            Ok(Message::new(buffer).add_header(Header::new(\"signed\", HeaderValue::Bool(true))))\n        }\n\n        fn sign_empty(&mut self) -> Option<Result<Message, SignMessageError>> {\n            Some(Ok(\n                Message::new(&b\"\"[..]).add_header(Header::new(\"signed\", HeaderValue::Bool(true)))\n            ))\n        }\n    }\n\n    fn check_send_sync<T: Send + Sync>(value: T) -> T {\n        value\n    }\n\n    #[test]\n    fn event_stream_sender_send_sync() {\n        check_send_sync(EventStreamSender::from(stream! {\n            yield Result::<_, SignMessageError>::Ok(TestMessage(\"test\".into()));\n        }));\n    }\n\n    #[tokio::test]\n    async fn message_stream_adapter_success() {\n        let stream = stream! {\n            yield Ok(TestMessage(\"test\".into()));\n        };\n        let mut adapter = MessageStreamAdapter::<TestMessage, TestServiceError>::new(\n            Marshaller,\n            ErrorMarshaller,\n            TestSigner,\n            Box::pin(stream),\n        );\n\n        let sent_bytes = adapter.next().await.unwrap().unwrap();\n        let sent = read_message_from(&mut sent_bytes.into_data().unwrap()).unwrap();\n        assert_eq!(\"signed\", sent.headers()[0].name().as_str());\n        assert_eq!(&HeaderValue::Bool(true), sent.headers()[0].value());\n        let inner = read_message_from(&mut (&sent.payload()[..])).unwrap();\n        assert_eq!(&b\"test\"[..], &inner.payload()[..]);\n\n        let end_signal_bytes = adapter.next().await.unwrap().unwrap();\n        let end_signal = read_message_from(&mut end_signal_bytes.into_data().unwrap()).unwrap();\n        assert_eq!(\"signed\", end_signal.headers()[0].name().as_str());\n        assert_eq!(&HeaderValue::Bool(true), end_signal.headers()[0].value());\n        assert_eq!(0, end_signal.payload().len());\n    }\n\n    #[tokio::test]\n    async fn message_stream_adapter_construction_failure() {\n        let stream = stream! {\n            yield Err(TestServiceError);\n        };\n        let mut adapter = MessageStreamAdapter::<TestMessage, TestServiceError>::new(\n            Marshaller,\n            ErrorMarshaller,\n            NoOpSigner {},\n            Box::pin(stream),\n        );\n\n        let result = adapter.next().await.unwrap();\n        assert!(result.is_err());\n        assert!(matches!(\n            result.err().unwrap(),\n            SdkError::ConstructionFailure(_)\n        ));\n    }\n\n    #[tokio::test]\n    async fn event_stream_sender_once() {\n        let sender = EventStreamSender::once(Ok(TestMessage(\"test\".into())));\n        let mut adapter = MessageStreamAdapter::<TestMessage, TestServiceError>::new(\n            Marshaller,\n            ErrorMarshaller,\n            TestSigner,\n            sender.input_stream,\n        );\n\n        let sent_bytes = adapter.next().await.unwrap().unwrap();\n        let sent = read_message_from(&mut sent_bytes.into_data().unwrap()).unwrap();\n        assert_eq!(\"signed\", sent.headers()[0].name().as_str());\n        let inner = read_message_from(&mut (&sent.payload()[..])).unwrap();\n        assert_eq!(&b\"test\"[..], &inner.payload()[..]);\n\n        // Should get end signal next\n        let end_signal_bytes = adapter.next().await.unwrap().unwrap();\n        let end_signal = read_message_from(&mut end_signal_bytes.into_data().unwrap()).unwrap();\n        assert_eq!(\"signed\", end_signal.headers()[0].name().as_str());\n        assert_eq!(0, end_signal.payload().len());\n\n        // Stream should be exhausted\n        assert!(adapter.next().await.is_none());\n    }\n\n    // Verify the developer experience for this compiles\n    #[allow(unused)]\n    fn event_stream_input_ergonomics() {\n        fn check(input: impl Into<EventStreamSender<TestMessage, TestServiceError>>) {\n            let _: EventStreamSender<TestMessage, TestServiceError> = input.into();\n        }\n        check(stream! {\n            yield Ok(TestMessage(\"test\".into()));\n        });\n        check(stream! {\n            yield Err(TestServiceError);\n        });\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http/src/event_stream.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Provides Sender/Receiver implementations for Event Stream codegen.\n\nuse std::error::Error as StdError;\n\nmod receiver;\nmod sender;\n\n/// A generic, boxed error that's `Send`, `Sync`, and `'static`.\npub type BoxError = Box<dyn StdError + Send + Sync + 'static>;\n\n#[doc(inline)]\npub use sender::{\n    EventOrInitial, EventOrInitialMarshaller, EventStreamSender, MessageStreamAdapter,\n    MessageStreamError,\n};\n\n#[doc(inline)]\npub use receiver::{InitialMessageType, Receiver, ReceiverError};\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http/src/futures_stream_adapter.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_smithy_types::body::SdkBody;\nuse aws_smithy_types::byte_stream::error::Error as ByteStreamError;\nuse aws_smithy_types::byte_stream::ByteStream;\nuse bytes::Bytes;\nuse futures_core::stream::Stream;\nuse std::pin::Pin;\nuse std::task::{Context, Poll};\n\n/// A new-type wrapper to enable the impl of the `futures_core::stream::Stream` trait\n///\n/// [`ByteStream`] no longer implements `futures_core::stream::Stream` so we wrap it in the\n/// new-type to enable the trait when it is required.\n///\n/// This is meant to be used by codegen code, and users should not need to use it directly.\n#[derive(Debug)]\npub struct FuturesStreamCompatByteStream(ByteStream);\n\nimpl FuturesStreamCompatByteStream {\n    /// Creates a new `FuturesStreamCompatByteStream` by wrapping `stream`.\n    pub fn new(stream: ByteStream) -> Self {\n        Self(stream)\n    }\n\n    /// Returns [`SdkBody`] of the wrapped [`ByteStream`].\n    pub fn into_inner(self) -> SdkBody {\n        self.0.into_inner()\n    }\n}\n\nimpl Stream for FuturesStreamCompatByteStream {\n    type Item = Result<Bytes, ByteStreamError>;\n\n    fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Option<Self::Item>> {\n        Pin::new(&mut self.0).poll_next(cx)\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use futures_core::stream::Stream;\n\n    fn check_compatible_with_hyper_wrap_stream<S, O, E>(stream: S) -> S\n    where\n        S: Stream<Item = Result<O, E>> + Send + 'static,\n        O: Into<Bytes> + 'static,\n        E: Into<Box<dyn std::error::Error + Send + Sync + 'static>> + 'static,\n    {\n        stream\n    }\n\n    #[test]\n    fn test_byte_stream_stream_can_be_made_compatible_with_hyper_wrap_stream() {\n        let stream = ByteStream::from_static(b\"Hello world\");\n        check_compatible_with_hyper_wrap_stream(FuturesStreamCompatByteStream::new(stream));\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http/src/header.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Utilities for parsing information from headers\n\nuse aws_smithy_types::date_time::Format;\nuse aws_smithy_types::primitive::Parse;\nuse aws_smithy_types::DateTime;\nuse http_1x::header::{HeaderMap, HeaderName, HeaderValue};\nuse std::borrow::Cow;\nuse std::error::Error;\nuse std::fmt;\nuse std::str::FromStr;\n\n/// An error was encountered while parsing a header\n#[derive(Debug)]\npub struct ParseError {\n    message: Cow<'static, str>,\n    source: Option<Box<dyn Error + Send + Sync + 'static>>,\n}\n\nimpl ParseError {\n    /// Create a new parse error with the given `message`\n    pub fn new(message: impl Into<Cow<'static, str>>) -> Self {\n        Self {\n            message: message.into(),\n            source: None,\n        }\n    }\n\n    /// Attach a source to this error.\n    pub fn with_source(self, source: impl Into<Box<dyn Error + Send + Sync + 'static>>) -> Self {\n        Self {\n            source: Some(source.into()),\n            ..self\n        }\n    }\n}\n\nimpl fmt::Display for ParseError {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        write!(f, \"output failed to parse in headers: {}\", self.message)\n    }\n}\n\nimpl Error for ParseError {\n    fn source(&self) -> Option<&(dyn Error + 'static)> {\n        self.source.as_ref().map(|err| err.as_ref() as _)\n    }\n}\n\n/// Read all the dates from the header map at `key` according the `format`\n///\n/// This is separate from `read_many` below because we need to invoke `DateTime::read` to take advantage\n/// of comma-aware parsing\npub fn many_dates<'a>(\n    values: impl Iterator<Item = &'a str>,\n    format: Format,\n) -> Result<Vec<DateTime>, ParseError> {\n    let mut out = vec![];\n    for header in values {\n        let mut header = header;\n        while !header.is_empty() {\n            let (v, next) = DateTime::read(header, format, ',').map_err(|err| {\n                ParseError::new(format!(\"header could not be parsed as date: {err}\"))\n            })?;\n            out.push(v);\n            header = next;\n        }\n    }\n    Ok(out)\n}\n\n/// Returns an iterator over pairs where the first element is the unprefixed header name that\n/// starts with the input `key` prefix, and the second element is the full header name.\npub fn headers_for_prefix<'a>(\n    header_names: impl Iterator<Item = &'a str>,\n    key: &'a str,\n) -> impl Iterator<Item = (&'a str, &'a str)> {\n    let lower_key = key.to_ascii_lowercase();\n    header_names\n        .filter(move |k| k.starts_with(&lower_key))\n        .map(move |k| (&k[key.len()..], k))\n}\n\n/// Convert a `HeaderValue` into a `Vec<T>` where `T: FromStr`\npub fn read_many_from_str<'a, T: FromStr>(\n    values: impl Iterator<Item = &'a str>,\n) -> Result<Vec<T>, ParseError>\nwhere\n    T::Err: Error + Send + Sync + 'static,\n{\n    read_many(values, |v: &str| {\n        v.parse().map_err(|err| {\n            ParseError::new(\"failed during `FromString` conversion\").with_source(err)\n        })\n    })\n}\n\n/// Convert a `HeaderValue` into a `Vec<T>` where `T: Parse`\npub fn read_many_primitive<'a, T: Parse>(\n    values: impl Iterator<Item = &'a str>,\n) -> Result<Vec<T>, ParseError> {\n    read_many(values, |v: &str| {\n        T::parse_smithy_primitive(v)\n            .map_err(|err| ParseError::new(\"failed reading a list of primitives\").with_source(err))\n    })\n}\n\n/// Read many comma / header delimited values from HTTP headers for `FromStr` types\nfn read_many<'a, T>(\n    values: impl Iterator<Item = &'a str>,\n    f: impl Fn(&str) -> Result<T, ParseError>,\n) -> Result<Vec<T>, ParseError> {\n    let mut out = vec![];\n    for header in values {\n        let mut header = header.as_bytes();\n        while !header.is_empty() {\n            let (v, next) = read_one(header, &f)?;\n            out.push(v);\n            header = next;\n        }\n    }\n    Ok(out)\n}\n\n/// Read exactly one or none from a headers iterator\n///\n/// This function does not perform comma splitting like `read_many`\npub fn one_or_none<'a, T: FromStr>(\n    mut values: impl Iterator<Item = &'a str>,\n) -> Result<Option<T>, ParseError>\nwhere\n    T::Err: Error + Send + Sync + 'static,\n{\n    let first = match values.next() {\n        Some(v) => v,\n        None => return Ok(None),\n    };\n    match values.next() {\n        None => T::from_str(first.trim())\n            .map_err(|err| ParseError::new(\"failed to parse string\").with_source(err))\n            .map(Some),\n        Some(_) => Err(ParseError::new(\n            \"expected a single value but found multiple\",\n        )),\n    }\n}\n\n/// Given an HTTP request, set a request header if that header was not already set.\npub fn set_request_header_if_absent<V>(\n    request: http_1x::request::Builder,\n    key: HeaderName,\n    value: V,\n) -> http_1x::request::Builder\nwhere\n    HeaderValue: TryFrom<V>,\n    <HeaderValue as TryFrom<V>>::Error: Into<http_1x::Error>,\n{\n    if !request\n        .headers_ref()\n        .map(|map| map.contains_key(&key))\n        .unwrap_or(false)\n    {\n        request.header(key, value)\n    } else {\n        request\n    }\n}\n\n/// Given an HTTP response, set a response header if that header was not already set.\npub fn set_response_header_if_absent<V>(\n    response: http_1x::response::Builder,\n    key: HeaderName,\n    value: V,\n) -> http_1x::response::Builder\nwhere\n    HeaderValue: TryFrom<V>,\n    <HeaderValue as TryFrom<V>>::Error: Into<http_1x::Error>,\n{\n    if !response\n        .headers_ref()\n        .map(|map| map.contains_key(&key))\n        .unwrap_or(false)\n    {\n        response.header(key, value)\n    } else {\n        response\n    }\n}\n\n/// Functions for parsing multiple comma-delimited header values out of a\n/// single header. This parsing adheres to\n/// [RFC-7230's specification of header values](https://datatracker.ietf.org/doc/html/rfc7230#section-3.2.6).\nmod parse_multi_header {\n    use super::ParseError;\n    use std::borrow::Cow;\n\n    fn trim(s: Cow<'_, str>) -> Cow<'_, str> {\n        match s {\n            Cow::Owned(s) => Cow::Owned(s.trim().into()),\n            Cow::Borrowed(s) => Cow::Borrowed(s.trim()),\n        }\n    }\n\n    fn replace<'a>(value: Cow<'a, str>, pattern: &str, replacement: &str) -> Cow<'a, str> {\n        if value.contains(pattern) {\n            Cow::Owned(value.replace(pattern, replacement))\n        } else {\n            value\n        }\n    }\n\n    /// Reads a single value out of the given input, and returns a tuple containing\n    /// the parsed value and the remainder of the slice that can be used to parse\n    /// more values.\n    pub(crate) fn read_value(input: &[u8]) -> Result<(Cow<'_, str>, &[u8]), ParseError> {\n        for (index, &byte) in input.iter().enumerate() {\n            let current_slice = &input[index..];\n            match byte {\n                b' ' | b'\\t' => { /* skip whitespace */ }\n                b'\"' => return read_quoted_value(&current_slice[1..]),\n                _ => {\n                    let (value, rest) = read_unquoted_value(current_slice)?;\n                    return Ok((trim(value), rest));\n                }\n            }\n        }\n\n        // We only end up here if the entire header value was whitespace or empty\n        Ok((Cow::Borrowed(\"\"), &[]))\n    }\n\n    fn read_unquoted_value(input: &[u8]) -> Result<(Cow<'_, str>, &[u8]), ParseError> {\n        let next_delim = input.iter().position(|&b| b == b',').unwrap_or(input.len());\n        let (first, next) = input.split_at(next_delim);\n        let first = std::str::from_utf8(first)\n            .map_err(|_| ParseError::new(\"header was not valid utf-8\"))?;\n        Ok((Cow::Borrowed(first), then_comma(next).unwrap()))\n    }\n\n    /// Reads a header value that is surrounded by quotation marks and may have escaped\n    /// quotes inside of it.\n    fn read_quoted_value(input: &[u8]) -> Result<(Cow<'_, str>, &[u8]), ParseError> {\n        for index in 0..input.len() {\n            match input[index] {\n                b'\"' if index == 0 || input[index - 1] != b'\\\\' => {\n                    let mut inner = Cow::Borrowed(\n                        std::str::from_utf8(&input[0..index])\n                            .map_err(|_| ParseError::new(\"header was not valid utf-8\"))?,\n                    );\n                    inner = replace(inner, \"\\\\\\\"\", \"\\\"\");\n                    inner = replace(inner, \"\\\\\\\\\", \"\\\\\");\n                    let rest = then_comma(&input[(index + 1)..])?;\n                    return Ok((inner, rest));\n                }\n                _ => {}\n            }\n        }\n        Err(ParseError::new(\n            \"header value had quoted value without end quote\",\n        ))\n    }\n\n    fn then_comma(s: &[u8]) -> Result<&[u8], ParseError> {\n        if s.is_empty() {\n            Ok(s)\n        } else if s.starts_with(b\",\") {\n            Ok(&s[1..])\n        } else {\n            Err(ParseError::new(\"expected delimiter `,`\"))\n        }\n    }\n}\n\n/// Read one comma delimited value for `FromStr` types\nfn read_one<'a, T>(\n    s: &'a [u8],\n    f: &impl Fn(&str) -> Result<T, ParseError>,\n) -> Result<(T, &'a [u8]), ParseError> {\n    let (value, rest) = parse_multi_header::read_value(s)?;\n    Ok((f(&value)?, rest))\n}\n\n/// Conditionally quotes and escapes a header value if the header value contains a comma or quote.\npub fn quote_header_value<'a>(value: impl Into<Cow<'a, str>>) -> Cow<'a, str> {\n    let value = value.into();\n    if value.trim().len() != value.len()\n        || value.contains('\"')\n        || value.contains(',')\n        || value.contains('(')\n        || value.contains(')')\n    {\n        Cow::Owned(format!(\n            \"\\\"{}\\\"\",\n            value.replace('\\\\', \"\\\\\\\\\").replace('\"', \"\\\\\\\"\")\n        ))\n    } else {\n        value\n    }\n}\n\n/// Given two http-02x [`HeaderMap`]s, merge them together and return the merged `HeaderMap`. If the\n/// two `HeaderMap`s share any keys, values from the right `HeaderMap` be appended to the left `HeaderMap`.\npub fn append_merge_header_maps(\n    mut lhs: HeaderMap<HeaderValue>,\n    rhs: HeaderMap<HeaderValue>,\n) -> HeaderMap<HeaderValue> {\n    let mut last_header_name_seen = None;\n    for (header_name, header_value) in rhs.into_iter() {\n        // For each yielded item that has None provided for the `HeaderName`,\n        // then the associated header name is the same as that of the previously\n        // yielded item. The first yielded item will have `HeaderName` set.\n        // https://docs.rs/http/latest/http/header/struct.HeaderMap.html#method.into_iter-2\n        match (&mut last_header_name_seen, header_name) {\n            (_, Some(header_name)) => {\n                lhs.append(header_name.clone(), header_value);\n                last_header_name_seen = Some(header_name);\n            }\n            (Some(header_name), None) => {\n                lhs.append(header_name.clone(), header_value);\n            }\n            (None, None) => unreachable!(),\n        };\n    }\n\n    lhs\n}\n\n/// Given two http-1x [`HeaderMap`]s, merge them together and return the merged `HeaderMap`. If the\n/// two `HeaderMap`s share any keys, values from the right `HeaderMap` be appended to the left `HeaderMap`.\npub fn append_merge_header_maps_http_1x(\n    mut lhs: http_1x::HeaderMap<http_1x::HeaderValue>,\n    rhs: http_1x::HeaderMap<http_1x::HeaderValue>,\n) -> http_1x::HeaderMap<http_1x::HeaderValue> {\n    let mut last_header_name_seen = None;\n    for (header_name, header_value) in rhs.into_iter() {\n        // For each yielded item that has None provided for the `HeaderName`,\n        // then the associated header name is the same as that of the previously\n        // yielded item. The first yielded item will have `HeaderName` set.\n        // https://docs.rs/http/latest/http/header/struct.HeaderMap.html#method.into_iter-2\n        match (&mut last_header_name_seen, header_name) {\n            (_, Some(header_name)) => {\n                lhs.append(header_name.clone(), header_value);\n                last_header_name_seen = Some(header_name);\n            }\n            (Some(header_name), None) => {\n                lhs.append(header_name.clone(), header_value);\n            }\n            (None, None) => unreachable!(),\n        };\n    }\n\n    lhs\n}\n\n#[cfg(test)]\nmod test {\n    use super::quote_header_value;\n    use crate::header::{\n        append_merge_header_maps, headers_for_prefix, many_dates, read_many_from_str,\n        read_many_primitive, set_request_header_if_absent, set_response_header_if_absent,\n        ParseError,\n    };\n    use aws_smithy_runtime_api::http::Request;\n    use aws_smithy_types::error::display::DisplayErrorContext;\n    use aws_smithy_types::{date_time::Format, DateTime};\n    use http_1x::header::{HeaderMap, HeaderName, HeaderValue};\n    use std::collections::HashMap;\n\n    #[test]\n    fn put_on_request_if_absent() {\n        let builder = http_1x::Request::builder().header(\"foo\", \"bar\");\n        let builder = set_request_header_if_absent(builder, HeaderName::from_static(\"foo\"), \"baz\");\n        let builder =\n            set_request_header_if_absent(builder, HeaderName::from_static(\"other\"), \"value\");\n        let req = builder.body(()).expect(\"valid request\");\n        assert_eq!(\n            req.headers().get_all(\"foo\").iter().collect::<Vec<_>>(),\n            vec![\"bar\"]\n        );\n        assert_eq!(\n            req.headers().get_all(\"other\").iter().collect::<Vec<_>>(),\n            vec![\"value\"]\n        );\n    }\n\n    #[test]\n    fn put_on_response_if_absent() {\n        let builder = http_1x::Response::builder().header(\"foo\", \"bar\");\n        let builder = set_response_header_if_absent(builder, HeaderName::from_static(\"foo\"), \"baz\");\n        let builder =\n            set_response_header_if_absent(builder, HeaderName::from_static(\"other\"), \"value\");\n        let response = builder.body(()).expect(\"valid response\");\n        assert_eq!(\n            response.headers().get_all(\"foo\").iter().collect::<Vec<_>>(),\n            vec![\"bar\"]\n        );\n        assert_eq!(\n            response\n                .headers()\n                .get_all(\"other\")\n                .iter()\n                .collect::<Vec<_>>(),\n            vec![\"value\"]\n        );\n    }\n\n    #[test]\n    fn parse_floats() {\n        let test_request = http_1x::Request::builder()\n            .header(\"X-Float-Multi\", \"0.0,Infinity,-Infinity,5555.5\")\n            .header(\"X-Float-Error\", \"notafloat\")\n            .body(())\n            .unwrap();\n        assert_eq!(\n            read_many_primitive::<f32>(\n                test_request\n                    .headers()\n                    .get_all(\"X-Float-Multi\")\n                    .iter()\n                    .map(|v| v.to_str().unwrap())\n            )\n            .expect(\"valid\"),\n            vec![0.0, f32::INFINITY, f32::NEG_INFINITY, 5555.5]\n        );\n        let message = format!(\n            \"{}\",\n            DisplayErrorContext(\n                read_many_primitive::<f32>(\n                    test_request\n                        .headers()\n                        .get_all(\"X-Float-Error\")\n                        .iter()\n                        .map(|v| v.to_str().unwrap())\n                )\n                .expect_err(\"invalid\")\n            )\n        );\n        let expected = \"output failed to parse in headers: failed reading a list of primitives: failed to parse input as f32\";\n        assert!(\n            message.starts_with(expected),\n            \"expected '{message}' to start with '{expected}'\"\n        );\n    }\n\n    #[test]\n    fn test_many_dates() {\n        let test_request = http_1x::Request::builder()\n            .header(\"Empty\", \"\")\n            .header(\"SingleHttpDate\", \"Wed, 21 Oct 2015 07:28:00 GMT\")\n            .header(\n                \"MultipleHttpDates\",\n                \"Wed, 21 Oct 2015 07:28:00 GMT,Thu, 22 Oct 2015 07:28:00 GMT\",\n            )\n            .header(\"SingleEpochSeconds\", \"1234.5678\")\n            .header(\"MultipleEpochSeconds\", \"1234.5678,9012.3456\")\n            .body(())\n            .unwrap();\n        let read = |name: &str, format: Format| {\n            many_dates(\n                test_request\n                    .headers()\n                    .get_all(name)\n                    .iter()\n                    .map(|v| v.to_str().unwrap()),\n                format,\n            )\n        };\n        let read_valid = |name: &str, format: Format| read(name, format).expect(\"valid\");\n        assert_eq!(\n            read_valid(\"Empty\", Format::DateTime),\n            Vec::<DateTime>::new()\n        );\n        assert_eq!(\n            read_valid(\"SingleHttpDate\", Format::HttpDate),\n            vec![DateTime::from_secs_and_nanos(1445412480, 0)]\n        );\n        assert_eq!(\n            read_valid(\"MultipleHttpDates\", Format::HttpDate),\n            vec![\n                DateTime::from_secs_and_nanos(1445412480, 0),\n                DateTime::from_secs_and_nanos(1445498880, 0)\n            ]\n        );\n        assert_eq!(\n            read_valid(\"SingleEpochSeconds\", Format::EpochSeconds),\n            vec![DateTime::from_secs_and_nanos(1234, 567_800_000)]\n        );\n        assert_eq!(\n            read_valid(\"MultipleEpochSeconds\", Format::EpochSeconds),\n            vec![\n                DateTime::from_secs_and_nanos(1234, 567_800_000),\n                DateTime::from_secs_and_nanos(9012, 345_600_000)\n            ]\n        );\n    }\n\n    #[test]\n    fn read_many_strings() {\n        let test_request = http_1x::Request::builder()\n            .header(\"Empty\", \"\")\n            .header(\"Foo\", \"  foo\")\n            .header(\"FooTrailing\", \"foo   \")\n            .header(\"FooInQuotes\", \"\\\"  foo  \\\"\")\n            .header(\"CommaInQuotes\", \"\\\"foo,bar\\\",baz\")\n            .header(\"CommaInQuotesTrailing\", \"\\\"foo,bar\\\",baz  \")\n            .header(\"QuoteInQuotes\", \"\\\"foo\\\\\\\",bar\\\",\\\"\\\\\\\"asdf\\\\\\\"\\\",baz\")\n            .header(\n                \"QuoteInQuotesWithSpaces\",\n                \"\\\"foo\\\\\\\",bar\\\", \\\"\\\\\\\"asdf\\\\\\\"\\\", baz\",\n            )\n            .header(\"JunkFollowingQuotes\", \"\\\"\\\\\\\"asdf\\\\\\\"\\\"baz\")\n            .header(\"EmptyQuotes\", \"\\\"\\\",baz\")\n            .header(\"EscapedSlashesInQuotes\", \"foo, \\\"(foo\\\\\\\\bar)\\\"\")\n            .body(())\n            .unwrap();\n        let read = |name: &str| {\n            read_many_from_str::<String>(\n                test_request\n                    .headers()\n                    .get_all(name)\n                    .iter()\n                    .map(|v| v.to_str().unwrap()),\n            )\n        };\n        let read_valid = |name: &str| read(name).expect(\"valid\");\n        assert_eq!(read_valid(\"Empty\"), Vec::<String>::new());\n        assert_eq!(read_valid(\"Foo\"), vec![\"foo\"]);\n        assert_eq!(read_valid(\"FooTrailing\"), vec![\"foo\"]);\n        assert_eq!(read_valid(\"FooInQuotes\"), vec![\"  foo  \"]);\n        assert_eq!(read_valid(\"CommaInQuotes\"), vec![\"foo,bar\", \"baz\"]);\n        assert_eq!(read_valid(\"CommaInQuotesTrailing\"), vec![\"foo,bar\", \"baz\"]);\n        assert_eq!(\n            read_valid(\"QuoteInQuotes\"),\n            vec![\"foo\\\",bar\", \"\\\"asdf\\\"\", \"baz\"]\n        );\n        assert_eq!(\n            read_valid(\"QuoteInQuotesWithSpaces\"),\n            vec![\"foo\\\",bar\", \"\\\"asdf\\\"\", \"baz\"]\n        );\n        assert!(read(\"JunkFollowingQuotes\").is_err());\n        assert_eq!(read_valid(\"EmptyQuotes\"), vec![\"\", \"baz\"]);\n        assert_eq!(\n            read_valid(\"EscapedSlashesInQuotes\"),\n            vec![\"foo\", \"(foo\\\\bar)\"]\n        );\n    }\n\n    #[test]\n    fn read_many_bools() {\n        let test_request = http_1x::Request::builder()\n            .header(\"X-Bool-Multi\", \"true,false\")\n            .header(\"X-Bool-Multi\", \"true\")\n            .header(\"X-Bool\", \"true\")\n            .header(\"X-Bool-Invalid\", \"truth,falsy\")\n            .header(\"X-Bool-Single\", \"true,false,true,true\")\n            .header(\"X-Bool-Quoted\", \"true,\\\"false\\\",true,true\")\n            .body(())\n            .unwrap();\n        assert_eq!(\n            read_many_primitive::<bool>(\n                test_request\n                    .headers()\n                    .get_all(\"X-Bool-Multi\")\n                    .iter()\n                    .map(|v| v.to_str().unwrap())\n            )\n            .expect(\"valid\"),\n            vec![true, false, true]\n        );\n\n        assert_eq!(\n            read_many_primitive::<bool>(\n                test_request\n                    .headers()\n                    .get_all(\"X-Bool\")\n                    .iter()\n                    .map(|v| v.to_str().unwrap())\n            )\n            .unwrap(),\n            vec![true]\n        );\n        assert_eq!(\n            read_many_primitive::<bool>(\n                test_request\n                    .headers()\n                    .get_all(\"X-Bool-Single\")\n                    .iter()\n                    .map(|v| v.to_str().unwrap())\n            )\n            .unwrap(),\n            vec![true, false, true, true]\n        );\n        assert_eq!(\n            read_many_primitive::<bool>(\n                test_request\n                    .headers()\n                    .get_all(\"X-Bool-Quoted\")\n                    .iter()\n                    .map(|v| v.to_str().unwrap())\n            )\n            .unwrap(),\n            vec![true, false, true, true]\n        );\n        read_many_primitive::<bool>(\n            test_request\n                .headers()\n                .get_all(\"X-Bool-Invalid\")\n                .iter()\n                .map(|v| v.to_str().unwrap()),\n        )\n        .expect_err(\"invalid\");\n    }\n\n    #[test]\n    fn check_read_many_i16() {\n        let test_request = http_1x::Request::builder()\n            .header(\"X-Multi\", \"123,456\")\n            .header(\"X-Multi\", \"789\")\n            .header(\"X-Num\", \"777\")\n            .header(\"X-Num-Invalid\", \"12ef3\")\n            .header(\"X-Num-Single\", \"1,2,3,-4,5\")\n            .header(\"X-Num-Quoted\", \"1, \\\"2\\\",3,\\\"-4\\\",5\")\n            .body(())\n            .unwrap();\n        assert_eq!(\n            read_many_primitive::<i16>(\n                test_request\n                    .headers()\n                    .get_all(\"X-Multi\")\n                    .iter()\n                    .map(|v| v.to_str().unwrap())\n            )\n            .expect(\"valid\"),\n            vec![123, 456, 789]\n        );\n\n        assert_eq!(\n            read_many_primitive::<i16>(\n                test_request\n                    .headers()\n                    .get_all(\"X-Num\")\n                    .iter()\n                    .map(|v| v.to_str().unwrap())\n            )\n            .unwrap(),\n            vec![777]\n        );\n        assert_eq!(\n            read_many_primitive::<i16>(\n                test_request\n                    .headers()\n                    .get_all(\"X-Num-Single\")\n                    .iter()\n                    .map(|v| v.to_str().unwrap())\n            )\n            .unwrap(),\n            vec![1, 2, 3, -4, 5]\n        );\n        assert_eq!(\n            read_many_primitive::<i16>(\n                test_request\n                    .headers()\n                    .get_all(\"X-Num-Quoted\")\n                    .iter()\n                    .map(|v| v.to_str().unwrap())\n            )\n            .unwrap(),\n            vec![1, 2, 3, -4, 5]\n        );\n        read_many_primitive::<i16>(\n            test_request\n                .headers()\n                .get_all(\"X-Num-Invalid\")\n                .iter()\n                .map(|v| v.to_str().unwrap()),\n        )\n        .expect_err(\"invalid\");\n    }\n\n    #[test]\n    fn test_prefix_headers() {\n        let test_request = Request::try_from(\n            http_1x::Request::builder()\n                .header(\"X-Prefix-A\", \"123,456\")\n                .header(\"X-Prefix-B\", \"789\")\n                .header(\"X-Prefix-C\", \"777\")\n                .header(\"X-Prefix-C\", \"777\")\n                .body(())\n                .unwrap(),\n        )\n        .unwrap();\n        let resp: Result<HashMap<String, Vec<i16>>, ParseError> =\n            headers_for_prefix(test_request.headers().iter().map(|h| h.0), \"X-Prefix-\")\n                .map(|(key, header_name)| {\n                    let values = test_request.headers().get_all(header_name);\n                    read_many_primitive(values).map(|v| (key.to_string(), v))\n                })\n                .collect();\n        let resp = resp.expect(\"valid\");\n        assert_eq!(resp.get(\"a\"), Some(&vec![123_i16, 456_i16]));\n    }\n\n    #[test]\n    fn test_quote_header_value() {\n        assert_eq!(\"\", &quote_header_value(\"\"));\n        assert_eq!(\"foo\", &quote_header_value(\"foo\"));\n        assert_eq!(\"\\\"  foo\\\"\", &quote_header_value(\"  foo\"));\n        assert_eq!(\"foo bar\", &quote_header_value(\"foo bar\"));\n        assert_eq!(\"\\\"foo,bar\\\"\", &quote_header_value(\"foo,bar\"));\n        assert_eq!(\"\\\",\\\"\", &quote_header_value(\",\"));\n        assert_eq!(\"\\\"\\\\\\\"foo\\\\\\\"\\\"\", &quote_header_value(\"\\\"foo\\\"\"));\n        assert_eq!(\"\\\"\\\\\\\"f\\\\\\\\oo\\\\\\\"\\\"\", &quote_header_value(\"\\\"f\\\\oo\\\"\"));\n        assert_eq!(\"\\\"(\\\"\", &quote_header_value(\"(\"));\n        assert_eq!(\"\\\")\\\"\", &quote_header_value(\")\"));\n    }\n\n    #[test]\n    fn test_append_merge_header_maps_with_shared_key() {\n        let header_name = HeaderName::from_static(\"some_key\");\n        let left_header_value = HeaderValue::from_static(\"lhs value\");\n        let right_header_value = HeaderValue::from_static(\"rhs value\");\n\n        let mut left_hand_side_headers = HeaderMap::new();\n        left_hand_side_headers.insert(header_name.clone(), left_header_value.clone());\n\n        let mut right_hand_side_headers = HeaderMap::new();\n        right_hand_side_headers.insert(header_name.clone(), right_header_value.clone());\n\n        let merged_header_map =\n            append_merge_header_maps(left_hand_side_headers, right_hand_side_headers);\n        let actual_merged_values: Vec<_> =\n            merged_header_map.get_all(header_name).into_iter().collect();\n\n        let expected_merged_values = vec![left_header_value, right_header_value];\n\n        assert_eq!(actual_merged_values, expected_merged_values);\n    }\n\n    #[test]\n    fn test_append_merge_header_maps_with_multiple_values_in_left_hand_map() {\n        let header_name = HeaderName::from_static(\"some_key\");\n        let left_header_value_1 = HeaderValue::from_static(\"lhs value 1\");\n        let left_header_value_2 = HeaderValue::from_static(\"lhs_value 2\");\n        let right_header_value = HeaderValue::from_static(\"rhs value\");\n\n        let mut left_hand_side_headers = HeaderMap::new();\n        left_hand_side_headers.insert(header_name.clone(), left_header_value_1.clone());\n        left_hand_side_headers.append(header_name.clone(), left_header_value_2.clone());\n\n        let mut right_hand_side_headers = HeaderMap::new();\n        right_hand_side_headers.insert(header_name.clone(), right_header_value.clone());\n\n        let merged_header_map =\n            append_merge_header_maps(left_hand_side_headers, right_hand_side_headers);\n        let actual_merged_values: Vec<_> =\n            merged_header_map.get_all(header_name).into_iter().collect();\n\n        let expected_merged_values =\n            vec![left_header_value_1, left_header_value_2, right_header_value];\n\n        assert_eq!(actual_merged_values, expected_merged_values);\n    }\n\n    #[test]\n    fn test_append_merge_header_maps_with_empty_left_hand_map() {\n        let header_name = HeaderName::from_static(\"some_key\");\n        let right_header_value_1 = HeaderValue::from_static(\"rhs value 1\");\n        let right_header_value_2 = HeaderValue::from_static(\"rhs_value 2\");\n\n        let left_hand_side_headers = HeaderMap::new();\n\n        let mut right_hand_side_headers = HeaderMap::new();\n        right_hand_side_headers.insert(header_name.clone(), right_header_value_1.clone());\n        right_hand_side_headers.append(header_name.clone(), right_header_value_2.clone());\n\n        let merged_header_map =\n            append_merge_header_maps(left_hand_side_headers, right_hand_side_headers);\n        let actual_merged_values: Vec<_> =\n            merged_header_map.get_all(header_name).into_iter().collect();\n\n        let expected_merged_values = vec![right_header_value_1, right_header_value_2];\n\n        assert_eq!(actual_merged_values, expected_merged_values);\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http/src/label.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Formatting values as Smithy\n//! [httpLabel](https://smithy.io/2.0/spec/http-bindings.html#httplabel-trait)\n\nuse crate::urlencode::BASE_SET;\nuse aws_smithy_types::date_time::{DateTimeFormatError, Format};\nuse aws_smithy_types::DateTime;\nuse percent_encoding::AsciiSet;\n\nconst GREEDY: &AsciiSet = &BASE_SET.remove(b'/');\n\n/// The encoding strategy used when parsing an `httpLabel`.\n#[non_exhaustive]\n#[derive(Clone, Debug, Eq, PartialEq)]\npub enum EncodingStrategy {\n    /// The default strategy when parsing an `httpLabel`. Only one path segment will be matched.\n    Default,\n    /// When parsing an `httpLabel`, this strategy will attempt to parse as many path segments as possible.\n    Greedy,\n}\n\n/// Format a given `httpLabel` as a string according to an [`EncodingStrategy`]\npub fn fmt_string<T: AsRef<str>>(t: T, strategy: EncodingStrategy) -> String {\n    let uri_set = if strategy == EncodingStrategy::Greedy {\n        GREEDY\n    } else {\n        BASE_SET\n    };\n    percent_encoding::utf8_percent_encode(t.as_ref(), uri_set).to_string()\n}\n\n/// Format a given [`DateTime`] as a string according to an [`EncodingStrategy`]\npub fn fmt_timestamp(t: &DateTime, format: Format) -> Result<String, DateTimeFormatError> {\n    Ok(fmt_string(t.fmt(format)?, EncodingStrategy::Default))\n}\n\n#[cfg(test)]\nmod test {\n    use crate::label::{fmt_string, EncodingStrategy};\n    use http_1x::Uri;\n    use proptest::proptest;\n\n    #[test]\n    fn greedy_params() {\n        assert_eq!(fmt_string(\"a/b\", EncodingStrategy::Default), \"a%2Fb\");\n        assert_eq!(fmt_string(\"a/b\", EncodingStrategy::Greedy), \"a/b\");\n    }\n\n    proptest! {\n        #[test]\n        fn test_encode_request(s: String) {\n            let _: Uri = format!(\"http://host.example.com/{}\", fmt_string(&s, EncodingStrategy::Default))\n                .parse()\n                .expect(\"all strings should be encoded properly\");\n            let _: Uri = format!(\"http://host.example.com/{}\", fmt_string(&s, EncodingStrategy::Greedy))\n                .parse()\n                .expect(\"all strings should be encoded properly\");\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http/src/lib.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/* Automatically managed default lints */\n#![cfg_attr(docsrs, feature(doc_cfg))]\n/* End of automatically managed default lints */\n#![warn(\n    missing_docs,\n    rustdoc::missing_crate_level_docs,\n    unreachable_pub,\n    rust_2018_idioms\n)]\n\n//! Core HTTP primitives for service clients generated by [smithy-rs](https://github.com/smithy-lang/smithy-rs) including:\n//! - HTTP Body implementation\n//! - Endpoint support\n//! - HTTP header deserialization\n//! - Event streams\n//!\n//! | Feature        | Description |\n//! |----------------|-------------|\n//! | `rt-tokio`     | Provides features that are dependent on `tokio` including the `ByteStream::from_path` util |\n//! | `event-stream` | Provides Sender/Receiver implementations for Event Stream codegen. |\n\n#![allow(clippy::derive_partial_eq_without_eq)]\n\npub mod endpoint;\n// Marked as `doc(hidden)` because a type in the module is used both by this crate and by the code\n// generator, but not by external users. Also, by the module being `doc(hidden)` instead of it being\n// in `rust-runtime/inlineable`, each user won't have to pay the cost of running the module's tests\n// when compiling their generated SDK.\n#[doc(hidden)]\npub mod futures_stream_adapter;\npub mod header;\npub mod label;\npub mod operation;\npub mod query;\n#[doc(hidden)]\npub mod query_writer;\n\n#[cfg(feature = \"event-stream\")]\npub mod event_stream;\n\nmod urlencode;\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http/src/operation.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Deprecated metadata type.\n\n/// Metadata added to the [`ConfigBag`](aws_smithy_types::config_bag::ConfigBag) that identifies the API being called.\n#[deprecated(\n    since = \"0.60.2\",\n    note = \"Use aws_smithy_runtime_api::client::orchestrator::Metadata instead.\"\n)]\npub type Metadata = aws_smithy_runtime_api::client::orchestrator::Metadata;\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http/src/query.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Utilities for writing Smithy values into a query string.\n//!\n//! Formatting values into the query string as specified in\n//! [httpQuery](https://smithy.io/2.0/spec/http-bindings.html#httpquery-trait)\n\nuse crate::urlencode::BASE_SET;\nuse aws_smithy_types::date_time::{DateTimeFormatError, Format};\nuse aws_smithy_types::DateTime;\nuse percent_encoding::utf8_percent_encode;\n\n/// Format a given string as a query string.\npub fn fmt_string<T: AsRef<str>>(t: T) -> String {\n    utf8_percent_encode(t.as_ref(), BASE_SET).to_string()\n}\n\n/// Format a given [`DateTime`] as a query string.\npub fn fmt_timestamp(t: &DateTime, format: Format) -> Result<String, DateTimeFormatError> {\n    Ok(fmt_string(t.fmt(format)?))\n}\n\n/// Simple abstraction to enable appending params to a string as query params.\n///\n/// ```rust\n/// use aws_smithy_http::query::Writer;\n/// let mut s = String::from(\"www.example.com\");\n/// let mut q = Writer::new(&mut s);\n/// q.push_kv(\"key\", \"value\");\n/// q.push_v(\"another_value\");\n/// assert_eq!(s, \"www.example.com?key=value&another_value\");\n/// ```\n#[allow(missing_debug_implementations)]\npub struct Writer<'a> {\n    out: &'a mut String,\n    prefix: char,\n}\n\nimpl<'a> Writer<'a> {\n    /// Create a new query string writer.\n    pub fn new(out: &'a mut String) -> Self {\n        Writer { out, prefix: '?' }\n    }\n\n    /// Add a new key and value pair to this writer.\n    pub fn push_kv(&mut self, k: &str, v: &str) {\n        self.out.push(self.prefix);\n        self.out.push_str(k);\n        self.out.push('=');\n        self.out.push_str(v);\n        self.prefix = '&';\n    }\n\n    /// Add a new value (which is its own key) to this writer.\n    pub fn push_v(&mut self, v: &str) {\n        self.out.push(self.prefix);\n        self.out.push_str(v);\n        self.prefix = '&';\n    }\n}\n\n#[cfg(test)]\nmod test {\n    use crate::query::{fmt_string, Writer};\n    use http_1x::Uri;\n    use proptest::proptest;\n\n    #[test]\n    fn url_encode() {\n        assert_eq!(fmt_string(\"y̆\").as_str(), \"y%CC%86\");\n        assert_eq!(fmt_string(\" \").as_str(), \"%20\");\n        assert_eq!(fmt_string(\"foo/baz%20\").as_str(), \"foo%2Fbaz%2520\");\n        assert_eq!(fmt_string(\"&=\").as_str(), \"%26%3D\");\n        assert_eq!(fmt_string(\"🐱\").as_str(), \"%F0%9F%90%B1\");\n        // `:` needs to be encoded, but only for AWS services\n        assert_eq!(fmt_string(\"a:b\"), \"a%3Ab\")\n    }\n\n    #[test]\n    fn writer_sets_prefix_properly() {\n        let mut out = String::new();\n        let mut writer = Writer::new(&mut out);\n        writer.push_v(\"a\");\n        writer.push_kv(\"b\", \"c\");\n        assert_eq!(out, \"?a&b=c\");\n    }\n\n    proptest! {\n        #[test]\n        fn test_encode_request(s: String) {\n            let _: Uri = format!(\"http://host.example.com/?{}\", fmt_string(s)).parse().expect(\"all strings should be encoded properly\");\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http/src/query_writer.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::query::fmt_string as percent_encode_query;\nuse http_1x::uri::InvalidUri;\nuse http_1x::Uri;\n\n/// Utility for updating the query string in a [`Uri`].\n#[allow(missing_debug_implementations)]\npub struct QueryWriter {\n    base_uri: Uri,\n    new_path_and_query: String,\n    prefix: Option<char>,\n}\n\nimpl QueryWriter {\n    /// Creates a new `QueryWriter` from a string\n    pub fn new_from_string(uri: &str) -> Result<Self, InvalidUri> {\n        Ok(Self::new(&Uri::try_from(uri)?))\n    }\n\n    /// Creates a new `QueryWriter` based off the given `uri`.\n    pub fn new(uri: &Uri) -> Self {\n        let new_path_and_query = uri\n            .path_and_query()\n            .map(|pq| pq.to_string())\n            .unwrap_or_default();\n        let prefix = if uri.query().is_none() {\n            Some('?')\n        } else if !uri.query().unwrap_or_default().is_empty() {\n            Some('&')\n        } else {\n            None\n        };\n        QueryWriter {\n            base_uri: uri.clone(),\n            new_path_and_query,\n            prefix,\n        }\n    }\n\n    /// Clears all query parameters.\n    pub fn clear_params(&mut self) {\n        if let Some(index) = self.new_path_and_query.find('?') {\n            self.new_path_and_query.truncate(index);\n            self.prefix = Some('?');\n        }\n    }\n\n    /// Inserts a new query parameter. The key and value are percent encoded\n    /// by `QueryWriter`. Passing in percent encoded values will result in double encoding.\n    pub fn insert(&mut self, k: &str, v: &str) {\n        self.insert_encoded(&percent_encode_query(k), &percent_encode_query(v));\n    }\n\n    /// Inserts a new already encoded query parameter. The key and value will be inserted\n    /// as is.\n    pub fn insert_encoded(&mut self, encoded_k: &str, encoded_v: &str) {\n        if let Some(prefix) = self.prefix {\n            self.new_path_and_query.push(prefix);\n        }\n        self.prefix = Some('&');\n        self.new_path_and_query.push_str(encoded_k);\n        self.new_path_and_query.push('=');\n        self.new_path_and_query.push_str(encoded_v)\n    }\n\n    /// Returns just the built query string.\n    pub fn build_query(self) -> String {\n        self.build_uri().query().unwrap_or_default().to_string()\n    }\n\n    /// Returns a full [`Uri`] with the query string updated.\n    pub fn build_uri(self) -> Uri {\n        let mut parts = self.base_uri.into_parts();\n        parts.path_and_query = Some(\n            self.new_path_and_query\n                .parse()\n                .expect(\"adding query should not invalidate URI\"),\n        );\n        Uri::from_parts(parts).expect(\"a valid URL in should always produce a valid URL out\")\n    }\n}\n\n#[cfg(test)]\nmod test {\n    use super::QueryWriter;\n    use http_1x::Uri;\n\n    #[test]\n    fn empty_uri() {\n        let uri = Uri::from_static(\"http://www.example.com\");\n        let mut query_writer = QueryWriter::new(&uri);\n        query_writer.insert(\"key\", \"val%ue\");\n        query_writer.insert(\"another\", \"value\");\n        assert_eq!(\n            query_writer.build_uri(),\n            Uri::from_static(\"http://www.example.com?key=val%25ue&another=value\")\n        );\n    }\n\n    #[test]\n    fn uri_with_path() {\n        let uri = Uri::from_static(\"http://www.example.com/path\");\n        let mut query_writer = QueryWriter::new(&uri);\n        query_writer.insert(\"key\", \"val%ue\");\n        query_writer.insert(\"another\", \"value\");\n        assert_eq!(\n            query_writer.build_uri(),\n            Uri::from_static(\"http://www.example.com/path?key=val%25ue&another=value\")\n        );\n    }\n\n    #[test]\n    fn uri_with_path_and_query() {\n        let uri = Uri::from_static(\"http://www.example.com/path?original=here\");\n        let mut query_writer = QueryWriter::new(&uri);\n        query_writer.insert(\"key\", \"val%ue\");\n        query_writer.insert(\"another\", \"value\");\n        assert_eq!(\n            query_writer.build_uri(),\n            Uri::from_static(\n                \"http://www.example.com/path?original=here&key=val%25ue&another=value\"\n            )\n        );\n    }\n\n    #[test]\n    fn build_query() {\n        let uri = Uri::from_static(\"http://www.example.com\");\n        let mut query_writer = QueryWriter::new(&uri);\n        query_writer.insert(\"key\", \"val%ue\");\n        query_writer.insert(\"ano%ther\", \"value\");\n        assert_eq!(\"key=val%25ue&ano%25ther=value\", query_writer.build_query());\n    }\n\n    #[test]\n    // This test ensures that the percent encoding applied to queries always produces a valid URI if\n    // the starting URI is valid\n    fn doesnt_panic_when_adding_query_to_valid_uri() {\n        let uri = Uri::from_static(\"http://www.example.com\");\n\n        let mut problematic_chars = Vec::new();\n\n        for byte in u8::MIN..=u8::MAX {\n            match std::str::from_utf8(&[byte]) {\n                // If we can't make a str from the byte then we certainly can't make a URL from it\n                Err(_) => {\n                    continue;\n                }\n                Ok(value) => {\n                    let mut query_writer = QueryWriter::new(&uri);\n                    query_writer.insert(\"key\", value);\n\n                    if std::panic::catch_unwind(|| query_writer.build_uri()).is_err() {\n                        problematic_chars.push(char::from(byte));\n                    };\n                }\n            }\n        }\n\n        if !problematic_chars.is_empty() {\n            panic!(\"we got some bad bytes here: {problematic_chars:#?}\")\n        }\n    }\n\n    #[test]\n    fn clear_params() {\n        let uri = Uri::from_static(\"http://www.example.com/path?original=here&foo=1\");\n        let mut query_writer = QueryWriter::new(&uri);\n        query_writer.clear_params();\n        query_writer.insert(\"new\", \"value\");\n        assert_eq!(\"new=value\", query_writer.build_query());\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http/src/urlencode.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse percent_encoding::{AsciiSet, CONTROLS};\n\n/// base set of characters that must be URL encoded\npub(crate) const BASE_SET: &AsciiSet = &CONTROLS\n    .add(b' ')\n    .add(b'/')\n    // RFC-3986 §3.3 allows sub-delims (defined in section2.2) to be in the path component.\n    // This includes both colon ':' and comma ',' characters.\n    // Smithy protocol tests & AWS services percent encode these expected values. Signing\n    // will fail if these values are not percent encoded\n    .add(b':')\n    .add(b',')\n    .add(b'?')\n    .add(b'#')\n    .add(b'[')\n    .add(b']')\n    .add(b'{')\n    .add(b'}')\n    .add(b'|')\n    .add(b'@')\n    .add(b'!')\n    .add(b'$')\n    .add(b'&')\n    .add(b'\\'')\n    .add(b'(')\n    .add(b')')\n    .add(b'*')\n    .add(b'+')\n    .add(b';')\n    .add(b'=')\n    .add(b'%')\n    .add(b'<')\n    .add(b'>')\n    .add(b'\"')\n    .add(b'^')\n    .add(b'`')\n    .add(b'\\\\');\n\n#[cfg(test)]\nmod test {\n    use crate::urlencode::BASE_SET;\n    use percent_encoding::utf8_percent_encode;\n\n    #[test]\n    fn set_includes_mandatory_characters() {\n        let chars = \":/?#[]@!$&'()*+,;=%\";\n        let escaped = utf8_percent_encode(chars, BASE_SET).to_string();\n        assert_eq!(\n            escaped,\n            \"%3A%2F%3F%23%5B%5D%40%21%24%26%27%28%29%2A%2B%2C%3B%3D%25\"\n        );\n\n        // sanity check that every character is escaped\n        assert_eq!(escaped.len(), chars.len() * 3);\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-client/Cargo.toml",
    "content": "[package]\nname = \"aws-smithy-http-client\"\nauthors = [\"AWS Rust SDK Team <aws-sdk-rust@amazon.com>\"]\ndescription = \"HTTP client abstractions for generated smithy clients\"\nversion = \"1.1.12\"\nlicense = \"Apache-2.0\"\nedition = \"2021\"\nrepository = \"https://github.com/smithy-lang/smithy-rs\"\nrust-version = \"1.91.1\"\n\n[features]\nhyper-014 = [\n    \"aws-smithy-runtime-api/http-02x\",\n    \"aws-smithy-types/http-body-0-4-x\",\n    \"dep:http-02x\",\n    \"dep:http-body-04x\",\n    \"dep:hyper-0-14\",\n    \"dep:h2-0-3\"\n]\n\ndefault-client = [\n    \"aws-smithy-runtime-api/http-1x\",\n    \"aws-smithy-types/http-body-1-x\",\n    \"dep:hyper\",\n    \"dep:hyper-util\",\n    \"hyper-util?/client-legacy\",\n    \"hyper-util?/client-proxy\",\n    \"dep:http-1x\",\n    \"dep:tower\",\n    \"dep:rustls-pki-types\",\n    \"dep:rustls-native-certs\"\n]\n\nwire-mock = [\n    \"test-util\",\n    \"default-client\",\n    \"hyper-util?/server\",\n    \"hyper-util?/server-auto\",\n    \"hyper-util?/service\",\n    \"hyper-util?/server-graceful\",\n    \"tokio/macros\",\n    \"dep:http-body-util\",\n]\n\ntest-util = [\n    \"dep:aws-smithy-protocol-test\",\n    \"dep:serde\",\n    \"dep:serde_json\",\n    \"dep:indexmap\",\n    \"dep:bytes\",\n    # for capture_request\n    \"dep:http-1x\",\n    \"aws-smithy-runtime-api/http-1x\",\n    # for dvr\n    \"dep:http-body-1x\",\n    \"aws-smithy-types/http-body-1-x\",\n    # for replay\n    \"tokio/rt\"\n]\n\nlegacy-test-util = [\n    \"test-util\",\n    \"dep:http-02x\",\n    \"aws-smithy-runtime-api/http-02x\",\n    \"aws-smithy-types/http-body-0-4-x\",\n]\n\nlegacy-rustls-ring = [\"dep:legacy-hyper-rustls\", \"dep:legacy-rustls\", \"dep:rustls-native-certs\", \"hyper-014\"]\n\nrustls-ring = [\"dep:rustls\", \"rustls?/ring\", \"dep:hyper-rustls\", \"dep:tokio-rustls\", \"default-client\"]\nrustls-aws-lc = [\"dep:rustls\", \"rustls?/aws_lc_rs\", \"rustls?/prefer-post-quantum\", \"dep:hyper-rustls\", \"dep:tokio-rustls\", \"default-client\"]\nrustls-aws-lc-fips = [\"dep:rustls\", \"rustls?/fips\", \"rustls?/prefer-post-quantum\", \"dep:hyper-rustls\", \"dep:tokio-rustls\",\"default-client\"]\ns2n-tls = [\"dep:s2n-tls\", \"dep:s2n-tls-hyper\", \"dep:s2n-tls-tokio\", \"default-client\"]\n\n[dependencies]\naws-smithy-async = { path = \"../aws-smithy-async\" }\naws-smithy-runtime-api = { path = \"../aws-smithy-runtime-api\", features = [\"client\"] }\naws-smithy-types = { path = \"../aws-smithy-types\" }\naws-smithy-protocol-test = { path = \"../aws-smithy-protocol-test\", optional = true }\nh2 = { version = \"0.4.11\", default-features = false }\ntokio = { version = \"1.49\", features = [] }\npin-project-lite = \"0.2.14\"\ntracing = \"0.1.44\"\n\n# hyper 1.x stack\nhyper = { version = \"1.6.0\", features = [\"client\", \"http1\", \"http2\"], optional = true }\nhyper-util = { version = \"0.1.16\", features = [\"http1\", \"http2\"], optional = true }\nhttp-1x = { package = \"http\", version = \"1.3.1\" , optional = true }\nhttp-body-1x = { package = \"http-body\", version = \"1.0.1\", optional = true}\nhyper-rustls = { version = \"0.27\", features = [\"http2\", \"http1\", \"native-tokio\", \"tls12\"], default-features = false, optional = true }\nrustls = { version = \"0.23.31\", default-features = false, optional = true }\ntokio-rustls = {  version = \"0.26.2\", default-features = false, optional = true}\n# TODO(hyper1): add a way to enable the fips feature flag in s2n-tls\ns2n-tls-hyper = { version = \"0.1.0\", optional = true }\ns2n-tls = { version = \"0.3.33\", optional = true }\ns2n-tls-tokio = { version = \"0.3.33\", optional = true}\ntower = { version = \"0.5.2\", optional = true }\nrustls-pki-types = { version = \"1.12.0\", features = [\"std\"], optional = true }\nrustls-native-certs = { version = \"0.8.1\", optional = true }\n# end hyper 1.x stack deps\n\n# legacy hyper-0.14.x stack the SDK/runtime GA'd with\nhttp-02x = { package = \"http\", version = \"0.2.12\", optional = true}\nhttp-body-04x = { package = \"http-body\", version = \"0.4.6\" , optional = true}\nhyper-0-14 = { package = \"hyper\", version = \"0.14.26\", default-features = false, features = [\"client\", \"http1\", \"http2\", \"tcp\", \"stream\"], optional = true }\nlegacy-hyper-rustls = { package = \"hyper-rustls\", version = \"0.24.2\", default-features = false, features = [\"http1\", \"tls12\", \"logging\", \"acceptor\", \"tokio-runtime\", \"http2\"], optional = true }\nlegacy-rustls = { package = \"rustls\", version = \"0.21.8\", optional = true }\nh2-0-3 = { package = \"h2\", version = \"0.3.24\", optional = true }\n# end legacy stack deps\n\n# test util stack\nbytes = { version = \"1.11.1\", optional = true }\nserde = { version = \"1.0.228\", features = [\"derive\"], optional = true }\nserde_json = { version = \"1.0.146\", features = [\"preserve_order\"], optional = true }\nindexmap = { version = \"2.10.0\", features = [\"serde\"], optional = true }\nhttp-body-util = { version = \"0.1.3\", optional = true }\n# end test util stack\n\n[dev-dependencies]\naws-smithy-async = { path = \"../aws-smithy-async\", features = [\"rt-tokio\", \"test-util\"] }\naws-smithy-runtime-api = { path = \"../aws-smithy-runtime-api\", features = [\"test-util\"] }\naws-smithy-types = { path = \"../aws-smithy-types\", features = [\"http-body-0-4-x\", \"test-util\"] }\nhttp-body-util = { version = \"0.1.3\" }\nserial_test = \"3.2\"\nhyper-util = { version = \"0.1.16\", features = [\"full\"] }\nbase64 = \"0.22\"\nrustls-pemfile = \"2.2.0\"\nrustls-pki-types = { version = \"1.12.0\", features = [\"std\"] }\ntokio = { version = \"1.49.0\", features = [\"macros\", \"rt\", \"rt-multi-thread\", \"test-util\", \"full\"] }\ntokio-rustls = \"0.26.2\"\n\n\n[[example]]\nname = \"client-ring\"\nrequired-features = [\"rustls-ring\"]\ndoc-scrape-examples = true\n\n[[example]]\nname = \"client-aws-lc\"\nrequired-features = [\"rustls-aws-lc\", \"rustls-aws-lc-fips\"]\ndoc-scrape-examples = true\n\n[[example]]\nname = \"client-s2n-tls\"\nrequired-features = [\"s2n-tls\"]\ndoc-scrape-examples = true\n\n[[example]]\nname = \"custom-dns\"\nrequired-features = [\"rustls-ring\"]\ndoc-scrape-examples = true\n\n[package.metadata.smithy-rs-release-tooling]\nstable = true\n\n[package.metadata.docs.rs]\nall-features = false\nfeatures = [\n    \"default-client \",\n    \"wire-mock\",\n    \"test-util\",\n    \"rustls-ring\",\n    \"rustls-aws-lc\",\n]\n\ntargets = [\"x86_64-unknown-linux-gnu\"]\ncargo-args = [\"-Zunstable-options\", \"-Zrustdoc-scrape-examples\"]\nrustdoc-args = [\"--cfg\", \"docsrs\"]\n# End of docs.rs metadata\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-client/LICENSE",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-client/README.md",
    "content": "# aws-smithy-http-client\n\nHTTP client abstractions for generated smithy clients.\n\n<!-- anchor_start:footer -->\nThis crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly.\n<!-- anchor_end:footer -->\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-client/examples/client-aws-lc.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_smithy_http_client::{\n    tls::{self, rustls_provider::CryptoMode},\n    Builder,\n};\n\n#[tokio::main]\nasync fn main() {\n    // feature = rustls-aws-lc\n    let _client = Builder::new()\n        .tls_provider(tls::Provider::Rustls(CryptoMode::AwsLc))\n        .build_https();\n\n    // feature = rustls-aws-lc-fips\n    // A FIPS client can also be created. Note that this has a more complex build environment required.\n    let _client = Builder::new()\n        .tls_provider(tls::Provider::Rustls(CryptoMode::AwsLcFips))\n        .build_https();\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-client/examples/client-ring.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_smithy_http_client::{\n    tls::{self, rustls_provider::CryptoMode},\n    Builder,\n};\n\nfn main() {\n    let _client = Builder::new()\n        .tls_provider(tls::Provider::Rustls(CryptoMode::Ring))\n        .build_https();\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-client/examples/client-s2n-tls.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_smithy_http_client::{tls, Builder};\n\nfn main() {\n    let _client = Builder::new()\n        .tls_provider(tls::Provider::S2nTls)\n        .build_https();\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-client/examples/custom-dns.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_smithy_http_client::{\n    tls::{self, rustls_provider::CryptoMode},\n    Builder,\n};\nuse aws_smithy_runtime_api::client::dns::{DnsFuture, ResolveDns};\nuse std::net::{IpAddr, Ipv4Addr};\n\n#[derive(Debug, Clone)]\nstruct StaticResolver;\n\nimpl ResolveDns for StaticResolver {\n    fn resolve_dns<'a>(&'a self, _name: &'a str) -> DnsFuture<'a> {\n        DnsFuture::ready(Ok(vec![IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1))]))\n    }\n}\n\nfn main() {\n    let _client = Builder::new()\n        .tls_provider(tls::Provider::Rustls(CryptoMode::Ring))\n        .build_with_resolver(StaticResolver);\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-client/external-types.toml",
    "content": "allowed_external_types = [\n    \"aws_smithy_runtime_api::*\",\n    \"aws_smithy_async::*\",\n    \"aws_smithy_types::*\",\n\n    # TODO(https://github.com/smithy-lang/smithy-rs/issues/1193): Once tooling permits it, only allow the following types based on the feature that exposes them\n    \"hyper::client::client::Builder\",\n    \"hyper::client::connect::Connection\",\n    \"tokio::io::async_read::AsyncRead\",\n    \"tokio::io::async_write::AsyncWrite\",\n    \"http::uri::Uri\",\n    # Used in trait bounds for legacy hyper connector build method\n    \"tower_service::Service\",\n\n    \"bytes::bytes::Bytes\",\n    \"serde::ser::Serialize\",\n    \"serde::de::Deserialize\",\n    \"serde_core::de::Deserialize\",\n    \"serde_core::ser::Serialize\",\n    \"hyper::client::connect::dns::Name\",\n    \"http::request::Request\",\n    \"http::response::Response\",\n    \"tokio::net::tcp::stream::TcpStream\",\n    \"hyper_util::rt::tokio::TokioIo\",\n\n]\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-client/src/client/connect.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nuse crate::client::connect;\nuse crate::proxy;\nuse aws_smithy_runtime_api::box_error::BoxError;\nuse http_1x::Uri;\nuse hyper::rt::{Read, ReadBufCursor, Write};\nuse hyper_util::client::legacy::connect::{Connected, Connection};\nuse pin_project_lite::pin_project;\nuse std::future::Future;\nuse std::io;\nuse std::io::IoSlice;\nuse std::pin::Pin;\nuse std::task::{Context, Poll};\n\npub(crate) trait AsyncConn:\n    Read + Write + Connection + Send + Sync + Unpin + 'static\n{\n}\n\nimpl<T: Read + Write + Connection + Send + Sync + Unpin + 'static> AsyncConn for T {}\n\npub(crate) type BoxConn = Box<dyn AsyncConn>;\n\n// Future for connecting\npub(crate) type Connecting = Pin<Box<dyn Future<Output = Result<Conn, BoxError>> + Send>>;\n\npin_project! {\n    pub(crate) struct Conn {\n        #[pin]\n        pub(super)inner: BoxConn,\n        pub(super) is_proxy: bool,\n    }\n}\n\nimpl Connection for Conn {\n    fn connected(&self) -> Connected {\n        self.inner.connected().proxy(self.is_proxy)\n    }\n}\n\nimpl Read for Conn {\n    fn poll_read(\n        self: Pin<&mut Self>,\n        cx: &mut Context<'_>,\n        buf: ReadBufCursor<'_>,\n    ) -> Poll<io::Result<()>> {\n        let this = self.project();\n        Read::poll_read(this.inner, cx, buf)\n    }\n}\n\nimpl Write for Conn {\n    fn poll_write(\n        self: Pin<&mut Self>,\n        cx: &mut Context<'_>,\n        buf: &[u8],\n    ) -> Poll<Result<usize, io::Error>> {\n        let this = self.project();\n        Write::poll_write(this.inner, cx, buf)\n    }\n\n    fn poll_write_vectored(\n        self: Pin<&mut Self>,\n        cx: &mut Context<'_>,\n        bufs: &[IoSlice<'_>],\n    ) -> Poll<Result<usize, io::Error>> {\n        let this = self.project();\n        Write::poll_write_vectored(this.inner, cx, bufs)\n    }\n\n    fn is_write_vectored(&self) -> bool {\n        self.inner.is_write_vectored()\n    }\n\n    fn poll_flush(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Result<(), io::Error>> {\n        let this = self.project();\n        Write::poll_flush(this.inner, cx)\n    }\n\n    fn poll_shutdown(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Result<(), io::Error>> {\n        let this = self.project();\n        Write::poll_shutdown(this.inner, cx)\n    }\n}\n\n/// HTTP-only proxy connector for handling HTTP requests through HTTP proxies\n///\n/// This connector handles the HTTP proxy logic when no TLS provider is selected,\n/// including request URL modification and proxy authentication.\n#[derive(Debug, Clone)]\npub(crate) struct HttpProxyConnector<C> {\n    inner: C,\n    proxy_config: proxy::ProxyConfig,\n}\n\nimpl<C> HttpProxyConnector<C> {\n    pub(crate) fn new(inner: C, proxy_config: proxy::ProxyConfig) -> Self {\n        Self {\n            inner,\n            proxy_config,\n        }\n    }\n}\n\nimpl<C> tower::Service<Uri> for HttpProxyConnector<C>\nwhere\n    C: tower::Service<Uri> + Clone + Send + 'static,\n    C::Response: hyper::rt::Read\n        + hyper::rt::Write\n        + hyper_util::client::legacy::connect::Connection\n        + Send\n        + Sync\n        + Unpin\n        + 'static,\n    C::Future: Send + 'static,\n    C::Error: Into<BoxError>,\n{\n    type Response = connect::Conn;\n    type Error = BoxError;\n    type Future = connect::Connecting;\n\n    fn poll_ready(\n        &mut self,\n        cx: &mut std::task::Context<'_>,\n    ) -> std::task::Poll<Result<(), Self::Error>> {\n        self.inner.poll_ready(cx).map_err(Into::into)\n    }\n\n    fn call(&mut self, dst: Uri) -> Self::Future {\n        // Check if this request should be proxied\n        let proxy_intercept = if !self.proxy_config.is_disabled() {\n            let matcher = self.proxy_config.clone().into_hyper_util_matcher();\n            matcher.intercept(&dst)\n        } else {\n            None\n        };\n\n        if let Some(intercept) = proxy_intercept {\n            // HTTP through proxy: Connect to proxy server\n            let proxy_uri = intercept.uri().clone();\n            let fut = self.inner.call(proxy_uri);\n            Box::pin(async move {\n                let conn = fut.await.map_err(Into::into)?;\n                Ok(connect::Conn {\n                    inner: Box::new(conn),\n                    is_proxy: true,\n                })\n            })\n        } else {\n            // Direct connection\n            let fut = self.inner.call(dst);\n            Box::pin(async move {\n                let conn = fut.await.map_err(Into::into)?;\n                Ok(connect::Conn {\n                    inner: Box::new(conn),\n                    is_proxy: false,\n                })\n            })\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-client/src/client/dns.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nuse aws_smithy_runtime_api::client::dns::ResolveDns;\nuse hyper_util::client::legacy::connect::dns::Name;\nuse std::error::Error;\nuse std::future::Future;\nuse std::net::SocketAddr;\nuse std::pin::Pin;\nuse std::task::{Context, Poll};\nuse std::vec;\n\n/// A bridge that allows our `ResolveDns` trait to work with Hyper's `Resolver` interface (based on tower)\n#[derive(Clone)]\n#[allow(dead_code)]\npub(crate) struct HyperUtilResolver<R> {\n    pub(crate) resolver: R,\n}\n\nimpl<R: ResolveDns + Clone + 'static> tower::Service<Name> for HyperUtilResolver<R> {\n    type Response = vec::IntoIter<SocketAddr>;\n    type Error = Box<dyn Error + Send + Sync>;\n    type Future = Pin<Box<dyn Future<Output = Result<Self::Response, Self::Error>> + Send>>;\n\n    fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {\n        Poll::Ready(Ok(()))\n    }\n\n    fn call(&mut self, req: Name) -> Self::Future {\n        let resolver = self.resolver.clone();\n        Box::pin(async move {\n            let dns_entries = resolver.resolve_dns(req.as_str()).await?;\n            Ok(dns_entries\n                .into_iter()\n                .map(|ip_addr| SocketAddr::new(ip_addr, 0))\n                .collect::<Vec<_>>()\n                .into_iter())\n        })\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-client/src/client/proxy.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Proxy configuration for HTTP clients\n//!\n//! This module provides types and utilities for configuring HTTP and HTTPS proxies,\n//! including support for environment variable detection, authentication, and bypass rules.\n\nuse http_1x::Uri;\nuse hyper_util::client::proxy::matcher::Matcher;\nuse std::fmt;\n\n/// Proxy configuration for HTTP clients\n///\n/// Supports HTTP and HTTPS proxy configuration with authentication and bypass rules.\n/// Can be configured programmatically or automatically detected from environment variables.\n///\n/// # Examples\n///\n/// ```rust\n/// use aws_smithy_http_client::proxy::ProxyConfig;\n///\n/// // HTTP proxy for all traffic\n/// let config = ProxyConfig::http(\"http://proxy.example.com:8080\")?;\n///\n/// // HTTPS traffic through HTTP proxy (common case - no TLS needed for proxy connection)\n/// let config = ProxyConfig::https(\"http://proxy.example.com:8080\")?\n///     .with_basic_auth(\"username\", \"password\")\n///     .no_proxy(\"localhost,*.internal\");\n///\n/// // Detect from environment variables\n/// let config = ProxyConfig::from_env();\n/// # Ok::<(), Box<dyn std::error::Error>>(())\n/// ```\n#[derive(Debug, Clone)]\npub struct ProxyConfig {\n    inner: ProxyConfigInner,\n}\n\n/// Internal configuration representation\n#[derive(Debug, Clone)]\nenum ProxyConfigInner {\n    /// Use environment variable detection\n    FromEnvironment,\n    /// Explicit HTTP proxy\n    Http {\n        uri: Uri,\n        auth: Option<ProxyAuth>,\n        no_proxy: Option<String>,\n    },\n    /// Explicit HTTPS proxy\n    Https {\n        uri: Uri,\n        auth: Option<ProxyAuth>,\n        no_proxy: Option<String>,\n    },\n    /// Proxy for all traffic\n    All {\n        uri: Uri,\n        auth: Option<ProxyAuth>,\n        no_proxy: Option<String>,\n    },\n    /// Explicitly disabled\n    Disabled,\n}\n\n/// Proxy authentication configuration\n///\n/// Stored for later conversion to hyper-util format.\n#[derive(Debug, Clone)]\nstruct ProxyAuth {\n    /// Username for authentication\n    username: String,\n    /// Password for authentication\n    password: String,\n}\n\n/// Errors that can occur during proxy configuration\n#[derive(Debug)]\npub struct ProxyError {\n    kind: ErrorKind,\n}\n\n#[derive(Debug)]\nenum ErrorKind {\n    InvalidUrl(String),\n}\n\nimpl From<ErrorKind> for ProxyError {\n    fn from(value: ErrorKind) -> Self {\n        Self { kind: value }\n    }\n}\n\nimpl fmt::Display for ProxyError {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        match &self.kind {\n            ErrorKind::InvalidUrl(url) => write!(f, \"invalid proxy URL: {url}\"),\n        }\n    }\n}\n\nimpl std::error::Error for ProxyError {}\n\nimpl ProxyConfig {\n    /// Create a new proxy configuration for HTTP traffic only\n    ///\n    /// # Arguments\n    /// * `proxy_url` - The HTTP proxy URL\n    ///\n    /// # Examples\n    /// ```rust\n    /// use aws_smithy_http_client::proxy::ProxyConfig;\n    ///\n    /// let config = ProxyConfig::http(\"http://proxy.example.com:8080\")?;\n    /// # Ok::<(), Box<dyn std::error::Error>>(())\n    /// ```\n    pub fn http<U>(proxy_url: U) -> Result<Self, ProxyError>\n    where\n        U: TryInto<Uri>,\n        U::Error: fmt::Display,\n    {\n        let uri = proxy_url\n            .try_into()\n            .map_err(|e| ErrorKind::InvalidUrl(e.to_string()))?;\n\n        Self::validate_proxy_uri(&uri)?;\n\n        Ok(ProxyConfig {\n            inner: ProxyConfigInner::Http {\n                uri,\n                auth: None,\n                no_proxy: None,\n            },\n        })\n    }\n\n    /// Create a new proxy configuration for HTTPS traffic only\n    ///\n    /// This proxy will only be used for `https://` requests. HTTP requests\n    /// will connect directly unless a separate HTTP proxy is configured.\n    ///\n    /// The proxy URL itself can use either HTTP or HTTPS scheme:\n    /// - `http://proxy.example.com:8080` - Connect to proxy using HTTP (no TLS needed)\n    /// - `https://proxy.example.com:8080` - Connect to proxy using HTTPS (TLS required)\n    ///\n    /// **Note**: If the proxy URL itself uses HTTPS scheme, TLS support must be\n    /// available when building the connector, otherwise connections will fail.\n    ///\n    /// # Arguments\n    /// * `proxy_url` - The proxy URL\n    ///\n    /// # Examples\n    /// ```rust\n    /// use aws_smithy_http_client::proxy::ProxyConfig;\n    ///\n    /// // HTTPS traffic through HTTP proxy (no TLS needed for proxy connection)\n    /// let config = ProxyConfig::https(\"http://proxy.example.com:8080\")?;\n    ///\n    /// // HTTPS traffic through HTTPS proxy (TLS needed for proxy connection)\n    /// let config = ProxyConfig::https(\"https://secure-proxy.example.com:8080\")?;\n    /// # Ok::<(), Box<dyn std::error::Error>>(())\n    /// ```\n    pub fn https<U>(proxy_url: U) -> Result<Self, ProxyError>\n    where\n        U: TryInto<Uri>,\n        U::Error: fmt::Display,\n    {\n        let uri = proxy_url\n            .try_into()\n            .map_err(|e| ErrorKind::InvalidUrl(e.to_string()))?;\n\n        Self::validate_proxy_uri(&uri)?;\n\n        Ok(ProxyConfig {\n            inner: ProxyConfigInner::Https {\n                uri,\n                auth: None,\n                no_proxy: None,\n            },\n        })\n    }\n\n    /// Create a new proxy configuration for all HTTP and HTTPS traffic\n    ///\n    /// This proxy will be used for both `http://` and `https://` requests.\n    /// This is equivalent to setting both HTTP and HTTPS proxies to the same URL.\n    ///\n    /// **Note**: If the proxy URL itself uses HTTPS scheme, TLS support must be\n    /// available when building the connector, otherwise connections will fail.\n    ///\n    /// # Arguments\n    /// * `proxy_url` - The proxy URL\n    ///\n    /// # Examples\n    /// ```rust\n    /// use aws_smithy_http_client::proxy::ProxyConfig;\n    ///\n    /// let config = ProxyConfig::all(\"http://proxy.example.com:8080\")?;\n    /// # Ok::<(), Box<dyn std::error::Error>>(())\n    /// ```\n    pub fn all<U>(proxy_url: U) -> Result<Self, ProxyError>\n    where\n        U: TryInto<Uri>,\n        U::Error: fmt::Display,\n    {\n        let uri = proxy_url\n            .try_into()\n            .map_err(|e| ErrorKind::InvalidUrl(e.to_string()))?;\n\n        Self::validate_proxy_uri(&uri)?;\n\n        Ok(ProxyConfig {\n            inner: ProxyConfigInner::All {\n                uri,\n                auth: None,\n                no_proxy: None,\n            },\n        })\n    }\n\n    /// Create a proxy configuration that disables all proxy usage\n    ///\n    /// This is useful for explicitly disabling proxy support even when\n    /// environment variables are set.\n    ///\n    /// # Examples\n    /// ```rust\n    /// use aws_smithy_http_client::proxy::ProxyConfig;\n    ///\n    /// let config = ProxyConfig::disabled();\n    /// ```\n    pub fn disabled() -> Self {\n        ProxyConfig {\n            inner: ProxyConfigInner::Disabled,\n        }\n    }\n\n    /// Add basic authentication to this proxy configuration\n    ///\n    /// # Arguments\n    /// * `username` - Username for proxy authentication\n    /// * `password` - Password for proxy authentication\n    ///\n    /// # Examples\n    /// ```rust\n    /// use aws_smithy_http_client::proxy::ProxyConfig;\n    ///\n    /// let config = ProxyConfig::http(\"http://proxy.example.com:8080\")?\n    ///     .with_basic_auth(\"username\", \"password\");\n    /// # Ok::<(), Box<dyn std::error::Error>>(())\n    /// ```\n    pub fn with_basic_auth<U, P>(mut self, username: U, password: P) -> Self\n    where\n        U: Into<String>,\n        P: Into<String>,\n    {\n        let auth = ProxyAuth {\n            username: username.into(),\n            password: password.into(),\n        };\n\n        match &mut self.inner {\n            ProxyConfigInner::Http {\n                auth: ref mut a, ..\n            } => *a = Some(auth),\n            ProxyConfigInner::Https {\n                auth: ref mut a, ..\n            } => *a = Some(auth),\n            ProxyConfigInner::All {\n                auth: ref mut a, ..\n            } => *a = Some(auth),\n            ProxyConfigInner::FromEnvironment | ProxyConfigInner::Disabled => {\n                // Cannot add auth to environment or disabled configs\n            }\n        }\n\n        self\n    }\n\n    /// Add NO_PROXY rules to this configuration\n    ///\n    /// NO_PROXY rules specify hosts that should bypass the proxy and connect directly.\n    ///\n    /// # Arguments\n    /// * `rules` - Comma-separated list of bypass rules\n    ///\n    /// # Examples\n    /// ```rust\n    /// use aws_smithy_http_client::proxy::ProxyConfig;\n    ///\n    /// let config = ProxyConfig::http(\"http://proxy.example.com:8080\")?\n    ///     .no_proxy(\"localhost,127.0.0.1,*.internal,10.0.0.0/8\");\n    /// # Ok::<(), Box<dyn std::error::Error>>(())\n    /// ```\n    pub fn no_proxy<S: AsRef<str>>(mut self, rules: S) -> Self {\n        let rules_str = rules.as_ref().to_string();\n\n        match &mut self.inner {\n            ProxyConfigInner::Http {\n                no_proxy: ref mut n,\n                ..\n            } => *n = Some(rules_str),\n            ProxyConfigInner::Https {\n                no_proxy: ref mut n,\n                ..\n            } => *n = Some(rules_str),\n            ProxyConfigInner::All {\n                no_proxy: ref mut n,\n                ..\n            } => *n = Some(rules_str),\n            ProxyConfigInner::FromEnvironment | ProxyConfigInner::Disabled => {\n                // Cannot add no_proxy to environment or disabled configs\n                // Environment configs will use NO_PROXY env var\n                // FIXME - is this what we want?\n            }\n        }\n\n        self\n    }\n\n    /// Create proxy configuration from environment variables\n    ///\n    /// Reads standard proxy environment variables:\n    /// - `HTTP_PROXY` / `http_proxy`: HTTP proxy URL\n    /// - `HTTPS_PROXY` / `https_proxy`: HTTPS proxy URL\n    /// - `ALL_PROXY` / `all_proxy`: Proxy for all protocols (fallback)\n    /// - `NO_PROXY` / `no_proxy`: Comma-separated bypass rules\n    ///\n    /// If no proxy environment variables are set, this returns a configuration\n    /// that won't intercept any requests (equivalent to no proxy).\n    ///\n    /// # Examples\n    /// ```rust\n    /// use aws_smithy_http_client::proxy::ProxyConfig;\n    ///\n    /// // Always succeeds, even if no environment variables are set\n    /// let config = ProxyConfig::from_env();\n    /// ```\n    pub fn from_env() -> Self {\n        // Delegate to environment variable parsing\n        // If no env vars are set, creates a matcher that doesn't intercept anything\n        ProxyConfig {\n            inner: ProxyConfigInner::FromEnvironment,\n        }\n    }\n\n    /// Check if proxy is disabled (no proxy configuration)\n    pub fn is_disabled(&self) -> bool {\n        matches!(self.inner, ProxyConfigInner::Disabled)\n    }\n\n    /// Check if this configuration uses environment variables\n    pub fn is_from_env(&self) -> bool {\n        matches!(self.inner, ProxyConfigInner::FromEnvironment)\n    }\n\n    /// Convert this configuration to internal proxy matcher\n    ///\n    /// This method converts the user-friendly configuration to the internal\n    /// proxy matching implementation used by the HTTP client.\n    pub(crate) fn into_hyper_util_matcher(self) -> Matcher {\n        match self.inner {\n            ProxyConfigInner::FromEnvironment => Matcher::from_env(),\n            ProxyConfigInner::Http {\n                uri,\n                auth,\n                no_proxy,\n            } => {\n                let mut builder = Matcher::builder();\n\n                // Set HTTP proxy with authentication embedded in URL if present\n                let proxy_url = Self::build_proxy_url(uri, auth);\n                builder = builder.http(proxy_url);\n\n                // Add NO_PROXY rules if present\n                if let Some(no_proxy_rules) = no_proxy {\n                    builder = builder.no(no_proxy_rules);\n                }\n\n                builder.build()\n            }\n            ProxyConfigInner::Https {\n                uri,\n                auth,\n                no_proxy,\n            } => {\n                let mut builder = Matcher::builder();\n\n                // Set HTTPS proxy with authentication embedded in URL if present\n                let proxy_url = Self::build_proxy_url(uri, auth);\n                builder = builder.https(proxy_url);\n\n                // Add NO_PROXY rules if present\n                if let Some(no_proxy_rules) = no_proxy {\n                    builder = builder.no(no_proxy_rules);\n                }\n\n                builder.build()\n            }\n            ProxyConfigInner::All {\n                uri,\n                auth,\n                no_proxy,\n            } => {\n                let mut builder = Matcher::builder();\n\n                // Set proxy for all traffic with authentication embedded in URL if present\n                let proxy_url = Self::build_proxy_url(uri, auth);\n                builder = builder.all(proxy_url);\n\n                // Add NO_PROXY rules if present\n                if let Some(no_proxy_rules) = no_proxy {\n                    builder = builder.no(no_proxy_rules);\n                }\n\n                builder.build()\n            }\n            ProxyConfigInner::Disabled => {\n                // Create an empty matcher that won't intercept anything\n                Matcher::builder().build()\n            }\n        }\n    }\n\n    /// Check if this proxy configuration requires TLS support\n    ///\n    /// Returns true if any of the configured proxy URLs use HTTPS scheme,\n    /// which requires TLS to establish the connection to the proxy server.\n    pub(crate) fn requires_tls(&self) -> bool {\n        match &self.inner {\n            ProxyConfigInner::Http { uri, .. } => uri.scheme_str() == Some(\"https\"),\n            ProxyConfigInner::Https { uri, .. } => uri.scheme_str() == Some(\"https\"),\n            ProxyConfigInner::All { uri, .. } => uri.scheme_str() == Some(\"https\"),\n            ProxyConfigInner::FromEnvironment => {\n                // Check environment variables for HTTPS proxy URLs\n                Self::env_vars_require_tls()\n            }\n            ProxyConfigInner::Disabled => false,\n        }\n    }\n\n    /// Check if any environment proxy variables contain HTTPS URLs\n    fn env_vars_require_tls() -> bool {\n        let proxy_vars = [\n            \"HTTP_PROXY\",\n            \"http_proxy\",\n            \"HTTPS_PROXY\",\n            \"https_proxy\",\n            \"ALL_PROXY\",\n            \"all_proxy\",\n        ];\n\n        for var in &proxy_vars {\n            if let Ok(proxy_url) = std::env::var(var) {\n                if !proxy_url.is_empty() {\n                    // Simple check for https:// scheme\n                    if proxy_url.starts_with(\"https://\") {\n                        return true;\n                    }\n                }\n            }\n        }\n        false\n    }\n\n    fn validate_proxy_uri(uri: &Uri) -> Result<(), ProxyError> {\n        // Validate scheme\n        match uri.scheme_str() {\n            Some(\"http\") | Some(\"https\") => {}\n            Some(scheme) => {\n                return Err(\n                    ErrorKind::InvalidUrl(format!(\"unsupported proxy scheme: {scheme}\")).into(),\n                );\n            }\n            None => {\n                return Err(ErrorKind::InvalidUrl(\n                    \"proxy URL must include scheme (http:// or https://)\".to_string(),\n                )\n                .into());\n            }\n        }\n\n        // Validate host\n        if uri.host().is_none() {\n            return Err(ErrorKind::InvalidUrl(\"proxy URL must include host\".to_string()).into());\n        }\n\n        Ok(())\n    }\n\n    fn build_proxy_url(uri: Uri, auth: Option<ProxyAuth>) -> String {\n        let uri_str = uri.to_string();\n\n        if let Some(auth) = auth {\n            // Embed authentication in the URL: scheme://username:password@host:port/path\n            if let Some(scheme_end) = uri_str.find(\"://\") {\n                let scheme = &uri_str[..scheme_end + 3];\n                let rest = &uri_str[scheme_end + 3..];\n\n                // Check if auth is already present in the URI\n                if rest.contains('@') {\n                    // Auth already present, return as-is\n                    uri_str\n                } else {\n                    // Add auth to the URI\n                    format!(\"{}{}:{}@{}\", scheme, auth.username, auth.password, rest)\n                }\n            } else {\n                // Invalid URI format, return as-is\n                uri_str\n            }\n        } else {\n            // No authentication, return URI as-is\n            uri_str\n        }\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use std::env;\n\n    #[test]\n    fn test_proxy_config_http() {\n        let config = ProxyConfig::http(\"http://proxy.example.com:8080\").unwrap();\n        assert!(!config.is_disabled());\n        assert!(!config.is_from_env());\n    }\n\n    #[test]\n    fn test_proxy_config_https() {\n        let config = ProxyConfig::https(\"http://proxy.example.com:8080\").unwrap();\n        assert!(!config.is_disabled());\n        assert!(!config.is_from_env());\n    }\n\n    #[test]\n    fn test_proxy_config_all() {\n        let config = ProxyConfig::all(\"http://proxy.example.com:8080\").unwrap();\n        assert!(!config.is_disabled());\n        assert!(!config.is_from_env());\n    }\n\n    #[test]\n    fn test_proxy_config_disabled() {\n        let config = ProxyConfig::disabled();\n        assert!(config.is_disabled());\n        assert!(!config.is_from_env());\n    }\n\n    #[test]\n    fn test_proxy_config_with_auth() {\n        let config = ProxyConfig::http(\"http://proxy.example.com:8080\")\n            .unwrap()\n            .with_basic_auth(\"user\", \"pass\");\n\n        // Auth is stored internally\n        assert!(!config.is_disabled());\n    }\n\n    #[test]\n    fn test_proxy_config_with_no_proxy() {\n        let config = ProxyConfig::http(\"http://proxy.example.com:8080\")\n            .unwrap()\n            .no_proxy(\"localhost,*.internal\");\n\n        // NO_PROXY rules are stored internally\n        assert!(!config.is_disabled());\n    }\n\n    #[test]\n    fn test_proxy_config_invalid_url() {\n        let result = ProxyConfig::http(\"not-a-url\");\n        assert!(result.is_err());\n    }\n\n    #[test]\n    fn test_proxy_config_invalid_scheme() {\n        let result = ProxyConfig::http(\"ftp://proxy.example.com:8080\");\n        assert!(result.is_err());\n    }\n\n    #[test]\n    #[serial_test::serial]\n    fn test_proxy_config_from_env_with_vars() {\n        // Save original environment\n        let original_http = env::var(\"HTTP_PROXY\");\n\n        // Set test environment\n        env::set_var(\"HTTP_PROXY\", \"http://test-proxy:8080\");\n\n        let config = ProxyConfig::from_env();\n        assert!(config.is_from_env());\n\n        // Restore original environment\n        match original_http {\n            Ok(val) => env::set_var(\"HTTP_PROXY\", val),\n            Err(_) => env::remove_var(\"HTTP_PROXY\"),\n        }\n    }\n\n    #[test]\n    #[serial_test::serial]\n    fn test_proxy_config_from_env_without_vars() {\n        // Save original environment\n        let original_vars: Vec<_> = [\n            \"HTTP_PROXY\",\n            \"http_proxy\",\n            \"HTTPS_PROXY\",\n            \"https_proxy\",\n            \"ALL_PROXY\",\n            \"all_proxy\",\n        ]\n        .iter()\n        .map(|var| (*var, env::var(var)))\n        .collect();\n\n        // Clear all proxy environment variables\n        for (var, _) in &original_vars {\n            env::remove_var(var);\n        }\n\n        let config = ProxyConfig::from_env();\n        assert!(config.is_from_env());\n\n        // Restore original environment\n        for (var, original_value) in original_vars {\n            match original_value {\n                Ok(val) => env::set_var(var, val),\n                Err(_) => env::remove_var(var),\n            }\n        }\n    }\n\n    #[test]\n    #[serial_test::serial]\n    fn test_auth_cannot_be_added_to_env_config() {\n        // Save original environment\n        let original_http = env::var(\"HTTP_PROXY\");\n        env::set_var(\"HTTP_PROXY\", \"http://test-proxy:8080\");\n\n        let config = ProxyConfig::from_env().with_basic_auth(\"user\", \"pass\"); // This should be ignored\n\n        assert!(config.is_from_env());\n\n        // Restore original environment\n        match original_http {\n            Ok(val) => env::set_var(\"HTTP_PROXY\", val),\n            Err(_) => env::remove_var(\"HTTP_PROXY\"),\n        }\n    }\n\n    #[test]\n    #[serial_test::serial]\n    fn test_no_proxy_cannot_be_added_to_env_config() {\n        // Save original environment\n        let original_http = env::var(\"HTTP_PROXY\");\n        env::set_var(\"HTTP_PROXY\", \"http://test-proxy:8080\");\n\n        let config = ProxyConfig::from_env().no_proxy(\"localhost\"); // This should be ignored\n\n        assert!(config.is_from_env());\n\n        // Restore original environment\n        match original_http {\n            Ok(val) => env::set_var(\"HTTP_PROXY\", val),\n            Err(_) => env::remove_var(\"HTTP_PROXY\"),\n        }\n    }\n\n    #[test]\n    fn test_build_proxy_url_without_auth() {\n        let uri = \"http://proxy.example.com:8080\".parse().unwrap();\n        let url = ProxyConfig::build_proxy_url(uri, None);\n        assert_eq!(url, \"http://proxy.example.com:8080/\");\n    }\n\n    #[test]\n    fn test_build_proxy_url_with_auth() {\n        let uri = \"http://proxy.example.com:8080\".parse().unwrap();\n        let auth = ProxyAuth {\n            username: \"user\".to_string(),\n            password: \"pass\".to_string(),\n        };\n        let url = ProxyConfig::build_proxy_url(uri, Some(auth));\n        assert_eq!(url, \"http://user:pass@proxy.example.com:8080/\");\n    }\n\n    #[test]\n    fn test_build_proxy_url_with_existing_auth() {\n        let uri = \"http://existing:creds@proxy.example.com:8080\"\n            .parse()\n            .unwrap();\n        let auth = ProxyAuth {\n            username: \"user\".to_string(),\n            password: \"pass\".to_string(),\n        };\n        let url = ProxyConfig::build_proxy_url(uri, Some(auth));\n        // Should not override existing auth\n        assert_eq!(url, \"http://existing:creds@proxy.example.com:8080/\");\n    }\n\n    #[test]\n    #[serial_test::serial]\n    fn test_into_hyper_util_matcher_from_env() {\n        // Save original environment\n        let original_http = env::var(\"HTTP_PROXY\");\n        env::set_var(\"HTTP_PROXY\", \"http://test-proxy:8080\");\n\n        let config = ProxyConfig::from_env();\n        let matcher = config.into_hyper_util_matcher();\n\n        // Test that the matcher intercepts HTTP requests\n        let test_uri = \"http://example.com\".parse().unwrap();\n        let intercept = matcher.intercept(&test_uri);\n        assert!(intercept.is_some());\n\n        // Restore original environment\n        match original_http {\n            Ok(val) => env::set_var(\"HTTP_PROXY\", val),\n            Err(_) => env::remove_var(\"HTTP_PROXY\"),\n        }\n    }\n\n    #[test]\n    fn test_into_hyper_util_matcher_http() {\n        let config = ProxyConfig::http(\"http://proxy.example.com:8080\").unwrap();\n        let matcher = config.into_hyper_util_matcher();\n\n        // Test that the matcher intercepts HTTP requests\n        let test_uri = \"http://example.com\".parse().unwrap();\n        let intercept = matcher.intercept(&test_uri);\n        assert!(intercept.is_some());\n        // The intercept URI might be normalized\n        assert!(intercept\n            .unwrap()\n            .uri()\n            .to_string()\n            .starts_with(\"http://proxy.example.com:8080\"));\n\n        // Test that it doesn't intercept HTTPS requests\n        let https_uri = \"https://example.com\".parse().unwrap();\n        let https_intercept = matcher.intercept(&https_uri);\n        assert!(https_intercept.is_none());\n    }\n\n    #[test]\n    fn test_into_hyper_util_matcher_with_auth() {\n        let config = ProxyConfig::http(\"http://proxy.example.com:8080\")\n            .unwrap()\n            .with_basic_auth(\"user\", \"pass\");\n        let matcher = config.into_hyper_util_matcher();\n\n        // Test that the matcher intercepts HTTP requests\n        let test_uri = \"http://example.com\".parse().unwrap();\n        let intercept = matcher.intercept(&test_uri);\n        assert!(intercept.is_some());\n\n        let intercept = intercept.unwrap();\n        // The proxy URI should contain the host (auth is handled separately)\n        assert!(intercept\n            .uri()\n            .to_string()\n            .contains(\"proxy.example.com:8080\"));\n\n        // Test that basic auth is available\n        assert!(intercept.basic_auth().is_some());\n    }\n\n    #[test]\n    fn test_into_hyper_util_matcher_disabled() {\n        let config = ProxyConfig::disabled();\n        let matcher = config.into_hyper_util_matcher();\n\n        // Test that the matcher doesn't intercept any requests\n        let test_uri = \"http://example.com\".parse().unwrap();\n        let intercept = matcher.intercept(&test_uri);\n        assert!(intercept.is_none());\n    }\n\n    #[test]\n    #[serial_test::serial]\n    fn test_requires_tls_detection() {\n        // HTTP proxy should not require TLS\n        let http_config = ProxyConfig::http(\"http://proxy.example.com:8080\").unwrap();\n        assert!(!http_config.requires_tls());\n\n        // HTTPS proxy URL should require TLS\n        let https_config = ProxyConfig::http(\"https://proxy.example.com:8080\").unwrap();\n        assert!(https_config.requires_tls());\n\n        // All proxy with HTTP URL should not require TLS\n        let all_http_config = ProxyConfig::all(\"http://proxy.example.com:8080\").unwrap();\n        assert!(!all_http_config.requires_tls());\n\n        // Environment config with HTTPS proxy should require TLS\n        env::set_var(\"HTTP_PROXY\", \"https://proxy.example.com:8080\");\n        let env_config = ProxyConfig::from_env();\n        assert!(env_config.requires_tls()); // Now detects HTTPS in env vars\n        env::remove_var(\"HTTP_PROXY\");\n\n        // Environment config with HTTP proxy should not require TLS\n        env::set_var(\"HTTP_PROXY\", \"http://proxy.example.com:8080\");\n        let env_config = ProxyConfig::from_env();\n        assert!(!env_config.requires_tls());\n        env::remove_var(\"HTTP_PROXY\");\n\n        // Disabled config should not require TLS\n        let disabled_config = ProxyConfig::disabled();\n        assert!(!disabled_config.requires_tls());\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-client/src/client/timeout.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::error::Error;\nuse std::fmt::Formatter;\nuse std::future::Future;\nuse std::pin::Pin;\nuse std::task::{Context, Poll};\nuse std::time::Duration;\n\nuse http_1x::Uri;\nuse pin_project_lite::pin_project;\n\nuse aws_smithy_async::future::timeout::{TimedOutError, Timeout};\nuse aws_smithy_async::rt::sleep::Sleep;\nuse aws_smithy_async::rt::sleep::{AsyncSleep, SharedAsyncSleep};\nuse aws_smithy_runtime_api::box_error::BoxError;\n\n#[derive(Debug)]\npub(crate) struct HttpTimeoutError {\n    kind: &'static str,\n    duration: Duration,\n}\n\nimpl std::fmt::Display for HttpTimeoutError {\n    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {\n        write!(\n            f,\n            \"{} timeout occurred after {:?}\",\n            self.kind, self.duration\n        )\n    }\n}\n\nimpl Error for HttpTimeoutError {\n    // We implement the `source` function as returning a `TimedOutError` because when `downcast_error`\n    // or `find_source` is called with an `HttpTimeoutError` (or another error wrapping an `HttpTimeoutError`)\n    // this method will be checked to determine if it's a timeout-related error.\n    fn source(&self) -> Option<&(dyn Error + 'static)> {\n        Some(&TimedOutError)\n    }\n}\n\n/// Timeout wrapper that will timeout on the initial TCP connection\n///\n/// # Stability\n/// This interface is unstable.\n#[derive(Clone, Debug)]\npub(crate) struct ConnectTimeout<I> {\n    inner: I,\n    timeout: Option<(SharedAsyncSleep, Duration)>,\n}\n\nimpl<I> ConnectTimeout<I> {\n    /// Create a new `ConnectTimeout` around `inner`.\n    ///\n    /// Typically, `I` will implement [`hyper_util::client::legacy::connect::Connect`].\n    pub(crate) fn new(inner: I, sleep: SharedAsyncSleep, timeout: Duration) -> Self {\n        Self {\n            inner,\n            timeout: Some((sleep, timeout)),\n        }\n    }\n\n    pub(crate) fn no_timeout(inner: I) -> Self {\n        Self {\n            inner,\n            timeout: None,\n        }\n    }\n}\n\n#[derive(Clone, Debug)]\npub(crate) struct HttpReadTimeout<I> {\n    inner: I,\n    timeout: Option<(SharedAsyncSleep, Duration)>,\n}\n\nimpl<I> HttpReadTimeout<I> {\n    /// Create a new `HttpReadTimeout` around `inner`.\n    ///\n    /// Typically, `I` will implement [`tower::Service<http::Request<SdkBody>>`].\n    pub(crate) fn new(inner: I, sleep: SharedAsyncSleep, timeout: Duration) -> Self {\n        Self {\n            inner,\n            timeout: Some((sleep, timeout)),\n        }\n    }\n\n    pub(crate) fn no_timeout(inner: I) -> Self {\n        Self {\n            inner,\n            timeout: None,\n        }\n    }\n}\n\npin_project! {\n    /// Timeout future for Tower services\n    ///\n    /// Timeout future to handle timing out, mapping errors, and the possibility of not timing out\n    /// without incurring an additional allocation for each timeout layer.\n    #[project = MaybeTimeoutFutureProj]\n    pub enum MaybeTimeoutFuture<F> {\n        Timeout {\n            #[pin]\n            timeout: Timeout<F, Sleep>,\n            error_type: &'static str,\n            duration: Duration,\n        },\n        NoTimeout {\n            #[pin]\n            future: F\n        }\n    }\n}\n\nimpl<F, T, E> Future for MaybeTimeoutFuture<F>\nwhere\n    F: Future<Output = Result<T, E>>,\n    E: Into<BoxError>,\n{\n    type Output = Result<T, BoxError>;\n\n    fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {\n        let (timeout_future, kind, &mut duration) = match self.project() {\n            MaybeTimeoutFutureProj::NoTimeout { future } => {\n                return future.poll(cx).map_err(|err| err.into());\n            }\n            MaybeTimeoutFutureProj::Timeout {\n                timeout,\n                error_type,\n                duration,\n            } => (timeout, error_type, duration),\n        };\n        match timeout_future.poll(cx) {\n            Poll::Ready(Ok(response)) => Poll::Ready(response.map_err(|err| err.into())),\n            Poll::Ready(Err(_timeout)) => {\n                Poll::Ready(Err(HttpTimeoutError { kind, duration }.into()))\n            }\n            Poll::Pending => Poll::Pending,\n        }\n    }\n}\n\nimpl<I> tower::Service<Uri> for ConnectTimeout<I>\nwhere\n    I: tower::Service<Uri>,\n    I::Error: Into<BoxError>,\n{\n    type Response = I::Response;\n    type Error = BoxError;\n    type Future = MaybeTimeoutFuture<I::Future>;\n\n    fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {\n        self.inner.poll_ready(cx).map_err(|err| err.into())\n    }\n\n    fn call(&mut self, req: Uri) -> Self::Future {\n        match &self.timeout {\n            Some((sleep, duration)) => {\n                let sleep = sleep.sleep(*duration);\n                MaybeTimeoutFuture::Timeout {\n                    timeout: Timeout::new(self.inner.call(req), sleep),\n                    error_type: \"HTTP connect\",\n                    duration: *duration,\n                }\n            }\n            None => MaybeTimeoutFuture::NoTimeout {\n                future: self.inner.call(req),\n            },\n        }\n    }\n}\n\nimpl<I, B> tower::Service<http_1x::Request<B>> for HttpReadTimeout<I>\nwhere\n    I: tower::Service<http_1x::Request<B>>,\n    I::Error: Send + Sync + Error + 'static,\n{\n    type Response = I::Response;\n    type Error = BoxError;\n    type Future = MaybeTimeoutFuture<I::Future>;\n\n    fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {\n        self.inner.poll_ready(cx).map_err(|err| err.into())\n    }\n\n    fn call(&mut self, req: http_1x::Request<B>) -> Self::Future {\n        match &self.timeout {\n            Some((sleep, duration)) => {\n                let sleep = sleep.sleep(*duration);\n                MaybeTimeoutFuture::Timeout {\n                    timeout: Timeout::new(self.inner.call(req), sleep),\n                    error_type: \"HTTP read\",\n                    duration: *duration,\n                }\n            }\n            None => MaybeTimeoutFuture::NoTimeout {\n                future: self.inner.call(req),\n            },\n        }\n    }\n}\n\n#[cfg(test)]\npub(crate) mod test {\n    use hyper::rt::ReadBufCursor;\n    use hyper_util::client::legacy::connect::{Connected, Connection};\n    use hyper_util::rt::TokioIo;\n    use tokio::net::TcpStream;\n\n    use aws_smithy_async::future::never::Never;\n\n    use aws_smithy_runtime_api::box_error::BoxError;\n    use aws_smithy_runtime_api::client::result::ConnectorError;\n    use http::Uri;\n    use hyper::http;\n    use hyper::rt::{Read, Write};\n    use std::future::Future;\n    use std::pin::Pin;\n    use std::task::{Context, Poll};\n\n    #[allow(unused)]\n    fn connect_timeout_is_correct<T: Send + Sync + Clone + 'static>() {\n        is_send_sync::<super::ConnectTimeout<T>>();\n    }\n\n    #[allow(unused)]\n    fn is_send_sync<T: Send + Sync>() {}\n\n    /// A service that will never return whatever it is you want\n    ///\n    /// Returned futures will return Pending forever\n    #[non_exhaustive]\n    #[derive(Clone, Default, Debug)]\n    pub(crate) struct NeverConnects;\n    impl tower::Service<Uri> for NeverConnects {\n        type Response = TokioIo<TcpStream>;\n        type Error = ConnectorError;\n        type Future = Pin<Box<dyn Future<Output = Result<Self::Response, Self::Error>> + Send>>;\n\n        fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {\n            Poll::Ready(Ok(()))\n        }\n\n        fn call(&mut self, _uri: Uri) -> Self::Future {\n            Box::pin(async move {\n                Never::new().await;\n                unreachable!()\n            })\n        }\n    }\n\n    /// A service that will connect but never send any data\n    #[derive(Clone, Debug, Default)]\n    pub(crate) struct NeverReplies;\n    impl tower::Service<Uri> for NeverReplies {\n        type Response = EmptyStream;\n        type Error = BoxError;\n        type Future = std::future::Ready<Result<Self::Response, Self::Error>>;\n\n        fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {\n            Poll::Ready(Ok(()))\n        }\n\n        fn call(&mut self, _req: Uri) -> Self::Future {\n            std::future::ready(Ok(EmptyStream))\n        }\n    }\n\n    /// A stream that will never return or accept any data\n    #[non_exhaustive]\n    #[derive(Debug, Default)]\n    pub(crate) struct EmptyStream;\n    impl Read for EmptyStream {\n        fn poll_read(\n            self: Pin<&mut Self>,\n            _cx: &mut Context<'_>,\n            _buf: ReadBufCursor<'_>,\n        ) -> Poll<Result<(), std::io::Error>> {\n            Poll::Pending\n        }\n    }\n    impl Write for EmptyStream {\n        fn poll_write(\n            self: Pin<&mut Self>,\n            _cx: &mut Context<'_>,\n            _buf: &[u8],\n        ) -> Poll<Result<usize, std::io::Error>> {\n            Poll::Pending\n        }\n\n        fn poll_flush(\n            self: Pin<&mut Self>,\n            _cx: &mut Context<'_>,\n        ) -> Poll<Result<(), std::io::Error>> {\n            Poll::Pending\n        }\n\n        fn poll_shutdown(\n            self: Pin<&mut Self>,\n            _cx: &mut Context<'_>,\n        ) -> Poll<Result<(), std::io::Error>> {\n            Poll::Pending\n        }\n    }\n\n    impl Connection for EmptyStream {\n        fn connected(&self) -> Connected {\n            Connected::new()\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-client/src/client/tls/rustls_provider.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nuse crate::client::tls::Provider;\nuse rustls::crypto::CryptoProvider;\n\n/// Choice of underlying cryptography library (this only applies to rustls)\n#[derive(Debug, Eq, PartialEq, Clone)]\n#[non_exhaustive]\npub enum CryptoMode {\n    /// Crypto based on [ring](https://github.com/briansmith/ring)\n    #[cfg(feature = \"rustls-ring\")]\n    Ring,\n    /// Crypto based on [aws-lc](https://github.com/aws/aws-lc-rs)\n    #[cfg(feature = \"rustls-aws-lc\")]\n    AwsLc,\n    /// FIPS compliant variant of [aws-lc](https://github.com/aws/aws-lc-rs)\n    #[cfg(feature = \"rustls-aws-lc-fips\")]\n    AwsLcFips,\n}\n\nimpl CryptoMode {\n    fn provider(self) -> CryptoProvider {\n        match self {\n            #[cfg(feature = \"rustls-aws-lc\")]\n            CryptoMode::AwsLc => rustls::crypto::aws_lc_rs::default_provider(),\n\n            #[cfg(feature = \"rustls-ring\")]\n            CryptoMode::Ring => rustls::crypto::ring::default_provider(),\n\n            #[cfg(feature = \"rustls-aws-lc-fips\")]\n            CryptoMode::AwsLcFips => {\n                let provider = rustls::crypto::default_fips_provider();\n                assert!(\n                    provider.fips(),\n                    \"FIPS was requested but the provider did not support FIPS\"\n                );\n                provider\n            }\n        }\n    }\n}\n\nimpl Provider {\n    /// Create a TLS provider based on [rustls](https://github.com/rustls/rustls)\n    /// and the given [`CryptoMode`]\n    pub fn rustls(mode: CryptoMode) -> Provider {\n        Provider::Rustls(mode)\n    }\n}\n\npub(crate) mod build_connector {\n    use crate::client::tls::rustls_provider::CryptoMode;\n    use crate::tls::TlsContext;\n    use client::connect::HttpConnector;\n    use hyper_util::client::legacy as client;\n    use rustls::crypto::CryptoProvider;\n    use rustls_native_certs::CertificateResult;\n    use rustls_pki_types::pem::PemObject;\n    use rustls_pki_types::CertificateDer;\n    use std::sync::Arc;\n    use std::sync::LazyLock;\n\n    /// Cached native certificates\n    ///\n    /// Creating a `with_native_roots()` hyper_rustls client re-loads system certs\n    /// each invocation (which can take 300ms on OSx). Cache the loaded certs\n    /// to avoid repeatedly incurring that cost.\n    pub(crate) static NATIVE_ROOTS: LazyLock<Vec<CertificateDer<'static>>> = LazyLock::new(|| {\n        let CertificateResult { certs, errors, .. } = rustls_native_certs::load_native_certs();\n        if !errors.is_empty() {\n            tracing::warn!(\"native root CA certificate loading errors: {errors:?}\")\n        }\n\n        if certs.is_empty() {\n            tracing::warn!(\"no native root CA certificates found!\");\n        }\n\n        // NOTE: unlike hyper-rustls::with_native_roots we don't validate here, we'll do that later\n        // for now we have a collection of certs that may or may not be valid.\n        certs\n    });\n\n    pub(crate) fn restrict_ciphers(base: CryptoProvider) -> CryptoProvider {\n        let suites = &[\n            rustls::CipherSuite::TLS13_AES_256_GCM_SHA384,\n            rustls::CipherSuite::TLS13_AES_128_GCM_SHA256,\n            // TLS1.2 suites\n            rustls::CipherSuite::TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,\n            rustls::CipherSuite::TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,\n            rustls::CipherSuite::TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,\n            rustls::CipherSuite::TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,\n            rustls::CipherSuite::TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256,\n        ];\n        let supported_suites = suites\n            .iter()\n            .flat_map(|suite| {\n                base.cipher_suites\n                    .iter()\n                    .find(|s| &s.suite() == suite)\n                    .cloned()\n            })\n            .collect::<Vec<_>>();\n        CryptoProvider {\n            cipher_suites: supported_suites,\n            ..base\n        }\n    }\n\n    impl TlsContext {\n        pub(crate) fn rustls_root_certs(&self) -> rustls::RootCertStore {\n            let mut roots = rustls::RootCertStore::empty();\n            if self.trust_store.enable_native_roots {\n                let (valid, _invalid) = roots.add_parsable_certificates(NATIVE_ROOTS.clone());\n                debug_assert!(valid > 0, \"TrustStore configured to enable native roots but no valid root certificates parsed!\");\n            }\n\n            for pem_cert in &self.trust_store.custom_certs {\n                let ders = CertificateDer::pem_slice_iter(&pem_cert.0)\n                    .collect::<Result<Vec<_>, _>>()\n                    .expect(\"valid PEM certificate\");\n                for cert in ders {\n                    roots.add(cert).expect(\"cert parsable\")\n                }\n            }\n\n            roots\n        }\n    }\n\n    /// Create a rustls ClientConfig with smithy-rs defaults\n    ///\n    /// This centralizes the rustls ClientConfig creation logic to ensure\n    /// consistency between the main HTTPS connector and tunnel handlers.\n    pub(crate) fn create_rustls_client_config(\n        crypto_mode: CryptoMode,\n        tls_context: &TlsContext,\n    ) -> rustls::ClientConfig {\n        let root_certs = tls_context.rustls_root_certs();\n        rustls::ClientConfig::builder_with_provider(Arc::new(restrict_ciphers(crypto_mode.provider())))\n            .with_safe_default_protocol_versions()\n            .expect(\"Error with the TLS configuration. Please file a bug report under https://github.com/smithy-lang/smithy-rs/issues.\")\n            .with_root_certificates(root_certs)\n            .with_no_client_auth()\n    }\n\n    pub(crate) fn wrap_connector<R>(\n        mut conn: HttpConnector<R>,\n        crypto_mode: CryptoMode,\n        tls_context: &TlsContext,\n        proxy_config: crate::client::proxy::ProxyConfig,\n    ) -> super::connect::RustTlsConnector<R> {\n        let client_config = create_rustls_client_config(crypto_mode, tls_context);\n        conn.enforce_http(false);\n        let https_connector = hyper_rustls::HttpsConnectorBuilder::new()\n            .with_tls_config(client_config.clone())\n            .https_or_http()\n            .enable_http1()\n            .enable_http2()\n            .wrap_connector(conn);\n\n        super::connect::RustTlsConnector::new(https_connector, client_config, proxy_config)\n    }\n}\n\npub(crate) mod connect {\n    use crate::client::connect::{Conn, Connecting};\n    use crate::client::proxy::ProxyConfig;\n    use aws_smithy_runtime_api::box_error::BoxError;\n    use http_1x::uri::Scheme;\n    use http_1x::Uri;\n    use hyper::rt::{Read, ReadBufCursor, Write};\n    use hyper_rustls::MaybeHttpsStream;\n    use hyper_util::client::legacy::connect::{Connected, Connection, HttpConnector};\n    use hyper_util::client::proxy::matcher::Matcher;\n    use hyper_util::rt::TokioIo;\n    use pin_project_lite::pin_project;\n    use std::error::Error;\n    use std::sync::Arc;\n    use std::{\n        io::{self, IoSlice},\n        pin::Pin,\n        task::{Context, Poll},\n    };\n    use tokio::io::{AsyncRead, AsyncWrite};\n    use tokio::net::TcpStream;\n    use tokio_rustls::client::TlsStream;\n    use tower::Service;\n\n    #[derive(Debug, Clone)]\n    pub(crate) struct RustTlsConnector<R> {\n        https: hyper_rustls::HttpsConnector<HttpConnector<R>>,\n        tls_config: Arc<rustls::ClientConfig>,\n        proxy_matcher: Option<Arc<Matcher>>, // Pre-computed for performance\n    }\n\n    impl<R> RustTlsConnector<R> {\n        pub(super) fn new(\n            https: hyper_rustls::HttpsConnector<HttpConnector<R>>,\n            tls_config: rustls::ClientConfig,\n            proxy_config: ProxyConfig,\n        ) -> Self {\n            // Pre-compute the proxy matcher once during construction\n            let proxy_matcher = if proxy_config.is_disabled() {\n                None\n            } else {\n                Some(Arc::new(proxy_config.into_hyper_util_matcher()))\n            };\n\n            Self {\n                https,\n                tls_config: Arc::new(tls_config),\n                proxy_matcher,\n            }\n        }\n    }\n\n    impl<R> Service<Uri> for RustTlsConnector<R>\n    where\n        R: Clone + Send + Sync + 'static,\n        R: Service<hyper_util::client::legacy::connect::dns::Name>,\n        R::Response: Iterator<Item = std::net::SocketAddr>,\n        R::Future: Send,\n        R::Error: Into<Box<dyn Error + Send + Sync>>,\n    {\n        type Response = Conn;\n        type Error = BoxError;\n        type Future = Connecting;\n\n        fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {\n            self.https.poll_ready(cx).map_err(Into::into)\n        }\n\n        fn call(&mut self, dst: Uri) -> Self::Future {\n            // Check if this request should be proxied using pre-computed matcher\n            let proxy_intercept = if let Some(ref matcher) = self.proxy_matcher {\n                matcher.intercept(&dst)\n            } else {\n                None\n            };\n\n            if let Some(intercept) = proxy_intercept {\n                if dst.scheme() == Some(&Scheme::HTTPS) {\n                    // HTTPS through HTTP proxy: Use CONNECT tunneling + manual TLS\n                    self.handle_https_through_proxy(dst, intercept)\n                } else {\n                    // HTTP through proxy: Direct connection to proxy\n                    self.handle_http_through_proxy(dst, intercept)\n                }\n            } else {\n                // Direct connection: Use the existing HTTPS connector\n                self.handle_direct_connection(dst)\n            }\n        }\n    }\n\n    impl<R> RustTlsConnector<R>\n    where\n        R: Clone + Send + Sync + 'static,\n        R: Service<hyper_util::client::legacy::connect::dns::Name>,\n        R::Response: Iterator<Item = std::net::SocketAddr>,\n        R::Future: Send,\n        R::Error: Into<Box<dyn Error + Send + Sync>>,\n    {\n        fn handle_direct_connection(&mut self, dst: Uri) -> Connecting {\n            let fut = self.https.call(dst);\n            Box::pin(async move {\n                let conn = fut.await?;\n                Ok(Conn {\n                    inner: Box::new(conn),\n                    is_proxy: false,\n                })\n            })\n        }\n\n        fn handle_http_through_proxy(\n            &mut self,\n            _dst: Uri,\n            intercept: hyper_util::client::proxy::matcher::Intercept,\n        ) -> Connecting {\n            // For HTTP through proxy, connect to the proxy and let it handle the request\n            let proxy_uri = intercept.uri().clone();\n            let fut = self.https.call(proxy_uri);\n            Box::pin(async move {\n                let conn = fut.await?;\n                Ok(Conn {\n                    inner: Box::new(conn),\n                    is_proxy: true,\n                })\n            })\n        }\n\n        fn handle_https_through_proxy(\n            &mut self,\n            dst: Uri,\n            intercept: hyper_util::client::proxy::matcher::Intercept,\n        ) -> Connecting {\n            use rustls_pki_types::ServerName;\n            // For HTTPS through HTTP proxy, we need to:\n            // 1. Establish CONNECT tunnel using the HTTPS connector\n            // 2. Perform manual TLS handshake over the tunneled stream\n\n            let tunnel = hyper_util::client::legacy::connect::proxy::Tunnel::new(\n                intercept.uri().clone(),\n                self.https.clone(),\n            );\n\n            // Configure tunnel with authentication if present\n            let mut tunnel = if let Some(auth) = intercept.basic_auth() {\n                tunnel.with_auth(auth.clone())\n            } else {\n                tunnel\n            };\n\n            let tls_config = self.tls_config.clone();\n            let dst_clone = dst.clone();\n\n            Box::pin(async move {\n                // Establish CONNECT tunnel\n                tracing::trace!(\"tunneling HTTPS over proxy\");\n                let tunneled = tunnel\n                    .call(dst_clone.clone())\n                    .await\n                    .map_err(|e| BoxError::from(format!(\"CONNECT tunnel failed: {e}\")))?;\n\n                // Stage 2: Manual TLS handshake over tunneled stream\n                let host = dst_clone\n                    .host()\n                    .ok_or(\"missing host in URI for TLS handshake\")?;\n\n                let server_name = ServerName::try_from(host.to_owned()).map_err(|e| {\n                    BoxError::from(format!(\"invalid server name for TLS handshake: {e}\"))\n                })?;\n\n                let tls_connector = tokio_rustls::TlsConnector::from(tls_config)\n                    .connect(server_name, TokioIo::new(tunneled))\n                    .await?;\n\n                Ok(Conn {\n                    inner: Box::new(RustTlsConn {\n                        inner: TokioIo::new(tls_connector),\n                    }),\n                    is_proxy: true,\n                })\n            })\n        }\n    }\n\n    pin_project! {\n        pub(crate) struct RustTlsConn<T> {\n            #[pin] pub(super) inner: TokioIo<TlsStream<T>>\n        }\n    }\n\n    impl Connection for RustTlsConn<TokioIo<TokioIo<TcpStream>>> {\n        fn connected(&self) -> Connected {\n            if self.inner.inner().get_ref().1.alpn_protocol() == Some(b\"h2\") {\n                self.inner\n                    .inner()\n                    .get_ref()\n                    .0\n                    .inner()\n                    .connected()\n                    .negotiated_h2()\n            } else {\n                self.inner.inner().get_ref().0.inner().connected()\n            }\n        }\n    }\n\n    impl Connection for RustTlsConn<TokioIo<MaybeHttpsStream<TokioIo<TcpStream>>>> {\n        fn connected(&self) -> Connected {\n            if self.inner.inner().get_ref().1.alpn_protocol() == Some(b\"h2\") {\n                self.inner\n                    .inner()\n                    .get_ref()\n                    .0\n                    .inner()\n                    .connected()\n                    .negotiated_h2()\n            } else {\n                self.inner.inner().get_ref().0.inner().connected()\n            }\n        }\n    }\n    impl<T: AsyncRead + AsyncWrite + Unpin> Read for RustTlsConn<T> {\n        fn poll_read(\n            self: Pin<&mut Self>,\n            cx: &mut Context<'_>,\n            buf: ReadBufCursor<'_>,\n        ) -> Poll<tokio::io::Result<()>> {\n            let this = self.project();\n            Read::poll_read(this.inner, cx, buf)\n        }\n    }\n\n    impl<T: AsyncRead + AsyncWrite + Unpin> Write for RustTlsConn<T> {\n        fn poll_write(\n            self: Pin<&mut Self>,\n            cx: &mut Context<'_>,\n            buf: &[u8],\n        ) -> Poll<Result<usize, tokio::io::Error>> {\n            let this = self.project();\n            Write::poll_write(this.inner, cx, buf)\n        }\n\n        fn poll_write_vectored(\n            self: Pin<&mut Self>,\n            cx: &mut Context<'_>,\n            bufs: &[IoSlice<'_>],\n        ) -> Poll<Result<usize, io::Error>> {\n            let this = self.project();\n            Write::poll_write_vectored(this.inner, cx, bufs)\n        }\n\n        fn is_write_vectored(&self) -> bool {\n            self.inner.is_write_vectored()\n        }\n\n        fn poll_flush(\n            self: Pin<&mut Self>,\n            cx: &mut Context<'_>,\n        ) -> Poll<Result<(), tokio::io::Error>> {\n            let this = self.project();\n            Write::poll_flush(this.inner, cx)\n        }\n\n        fn poll_shutdown(\n            self: Pin<&mut Self>,\n            cx: &mut Context<'_>,\n        ) -> Poll<Result<(), tokio::io::Error>> {\n            let this = self.project();\n            Write::poll_shutdown(this.inner, cx)\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-client/src/client/tls/s2n_tls_provider.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npub(crate) mod build_connector {\n    use crate::tls::TlsContext;\n    use client::connect::HttpConnector;\n    use hyper_util::client::legacy as client;\n    use s2n_tls::security::Policy;\n    use std::sync::LazyLock;\n\n    // Default S2N security policy which sets protocol versions and cipher suites\n    //  See https://aws.github.io/s2n-tls/usage-guide/ch06-security-policies.html\n    const S2N_POLICY_VERSION: &str = \"20230317\";\n\n    fn base_config() -> s2n_tls::config::Builder {\n        let mut builder = s2n_tls::config::Config::builder();\n        let policy = Policy::from_version(S2N_POLICY_VERSION).unwrap();\n        builder\n            .set_security_policy(&policy)\n            .expect(\"valid s2n security policy\");\n        // default is true\n        builder.with_system_certs(false).unwrap();\n        builder\n    }\n\n    static CACHED_CONFIG: LazyLock<s2n_tls::config::Config> = LazyLock::new(|| {\n        let mut config = base_config();\n        config.with_system_certs(true).unwrap();\n        // actually loads the system certs\n        config.build().expect(\"valid s2n config\")\n    });\n\n    impl TlsContext {\n        fn s2n_config(&self) -> s2n_tls::config::Config {\n            // TODO(s2n-tls): s2n does not support turning a config back into a builder or a way to load a trust store and re-use it\n            // instead if we are only using the defaults then use a cached config, otherwise pay the cost to build a new one\n            if self.trust_store.enable_native_roots && self.trust_store.custom_certs.is_empty() {\n                CACHED_CONFIG.clone()\n            } else {\n                let mut config = base_config();\n                config\n                    .with_system_certs(self.trust_store.enable_native_roots)\n                    .unwrap();\n                for pem_cert in &self.trust_store.custom_certs {\n                    config\n                        .trust_pem(pem_cert.0.as_slice())\n                        .expect(\"valid certificate\");\n                }\n                config.build().expect(\"valid s2n config\")\n            }\n        }\n    }\n\n    pub(crate) fn wrap_connector<R>(\n        mut http_connector: HttpConnector<R>,\n        tls_context: &TlsContext,\n        proxy_config: crate::client::proxy::ProxyConfig,\n    ) -> super::connect::S2nTlsConnector<R> {\n        let config = tls_context.s2n_config();\n        http_connector.enforce_http(false);\n        let mut builder = s2n_tls_hyper::connector::HttpsConnector::builder_with_http(\n            http_connector,\n            config.clone(),\n        );\n        builder.with_plaintext_http(true);\n        let https_connector = builder.build();\n\n        super::connect::S2nTlsConnector::new(https_connector, config, proxy_config)\n    }\n}\n\npub(crate) mod connect {\n    use crate::client::connect::{Conn, Connecting};\n    use crate::client::proxy::ProxyConfig;\n    use aws_smithy_runtime_api::box_error::BoxError;\n    use http_1x::uri::Scheme;\n    use http_1x::Uri;\n    use hyper_util::client::legacy::connect::{Connected, Connection, HttpConnector};\n    use hyper_util::client::proxy::matcher::Matcher;\n    use hyper_util::rt::TokioIo;\n    use std::error::Error;\n    use std::sync::Arc;\n    use std::{\n        io::IoSlice,\n        pin::Pin,\n        task::{Context, Poll},\n    };\n    use tower::Service;\n\n    #[derive(Clone)]\n    pub(crate) struct S2nTlsConnector<R> {\n        https: s2n_tls_hyper::connector::HttpsConnector<HttpConnector<R>>,\n        tls_config: s2n_tls::config::Config,\n        proxy_matcher: Option<Arc<Matcher>>, // Pre-computed for performance\n    }\n\n    impl<R> S2nTlsConnector<R> {\n        pub(super) fn new(\n            https: s2n_tls_hyper::connector::HttpsConnector<HttpConnector<R>>,\n            tls_config: s2n_tls::config::Config,\n            proxy_config: ProxyConfig,\n        ) -> Self {\n            // Pre-compute the proxy matcher once during construction\n            let proxy_matcher = if proxy_config.is_disabled() {\n                None\n            } else {\n                Some(Arc::new(proxy_config.into_hyper_util_matcher()))\n            };\n\n            Self {\n                https,\n                tls_config,\n                proxy_matcher,\n            }\n        }\n    }\n\n    impl<R> Service<Uri> for S2nTlsConnector<R>\n    where\n        R: Clone + Send + Sync + 'static,\n        R: Service<hyper_util::client::legacy::connect::dns::Name>,\n        R::Response: Iterator<Item = std::net::SocketAddr>,\n        R::Future: Send,\n        R::Error: Into<Box<dyn Error + Send + Sync>>,\n    {\n        type Response = Conn;\n        type Error = BoxError;\n        type Future = Connecting;\n\n        fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {\n            self.https.poll_ready(cx).map_err(Into::into)\n        }\n\n        fn call(&mut self, dst: Uri) -> Self::Future {\n            // Check if this request should be proxied using pre-computed matcher\n            let proxy_intercept = if let Some(ref matcher) = self.proxy_matcher {\n                matcher.intercept(&dst)\n            } else {\n                None\n            };\n\n            if let Some(intercept) = proxy_intercept {\n                if dst.scheme() == Some(&Scheme::HTTPS) {\n                    // HTTPS through HTTP proxy: Use CONNECT tunneling + manual TLS\n                    self.handle_https_through_proxy(dst, intercept)\n                } else {\n                    // HTTP through proxy: Direct connection to proxy\n                    self.handle_http_through_proxy(dst, intercept)\n                }\n            } else {\n                // Direct connection: Use the existing HTTPS connector\n                self.handle_direct_connection(dst)\n            }\n        }\n    }\n\n    impl<R> S2nTlsConnector<R>\n    where\n        R: Clone + Send + Sync + 'static,\n        R: Service<hyper_util::client::legacy::connect::dns::Name>,\n        R::Response: Iterator<Item = std::net::SocketAddr>,\n        R::Future: Send,\n        R::Error: Into<Box<dyn Error + Send + Sync>>,\n    {\n        fn handle_direct_connection(&mut self, dst: Uri) -> Connecting {\n            let fut = self.https.call(dst);\n            Box::pin(async move {\n                let conn = fut.await?;\n                Ok(Conn {\n                    inner: Box::new(conn),\n                    is_proxy: false,\n                })\n            })\n        }\n\n        fn handle_http_through_proxy(\n            &mut self,\n            _dst: Uri,\n            intercept: hyper_util::client::proxy::matcher::Intercept,\n        ) -> Connecting {\n            // For HTTP through proxy, connect to the proxy and let it handle the request\n            let proxy_uri = intercept.uri().clone();\n            let fut = self.https.call(proxy_uri);\n            Box::pin(async move {\n                let conn = fut.await?;\n                Ok(Conn {\n                    inner: Box::new(conn),\n                    is_proxy: true,\n                })\n            })\n        }\n\n        fn handle_https_through_proxy(\n            &mut self,\n            dst: Uri,\n            intercept: hyper_util::client::proxy::matcher::Intercept,\n        ) -> Connecting {\n            // For HTTPS through HTTP proxy, we need to:\n            // 1. Establish CONNECT tunnel using the HTTPS connector\n            // 2. Perform manual TLS handshake over the tunneled stream\n\n            let tunnel = hyper_util::client::legacy::connect::proxy::Tunnel::new(\n                intercept.uri().clone(),\n                self.https.clone(),\n            );\n\n            // Configure tunnel with authentication if present\n            let mut tunnel = if let Some(auth) = intercept.basic_auth() {\n                tunnel.with_auth(auth.clone())\n            } else {\n                tunnel\n            };\n\n            let tls_config = self.tls_config.clone();\n            let dst_clone = dst.clone();\n\n            Box::pin(async move {\n                // Stage 1: Establish CONNECT tunnel\n                tracing::trace!(\"tunneling HTTPS over proxy using s2n-tls\");\n                let tunneled = tunnel\n                    .call(dst_clone.clone())\n                    .await\n                    .map_err(|e| BoxError::from(format!(\"CONNECT tunnel failed: {e}\")))?;\n\n                // Stage 2: Manual TLS handshake over tunneled stream\n                let host = dst_clone\n                    .host()\n                    .ok_or(\"missing host in URI for TLS handshake\")?;\n\n                // s2n-tls uses string server names (simpler than rustls ServerName)\n                let tls_connector = s2n_tls_tokio::TlsConnector::new(tls_config);\n                let tls_stream = tls_connector\n                    .connect(host, TokioIo::new(tunneled))\n                    .await\n                    .map_err(|e| BoxError::from(format!(\"s2n-tls handshake failed: {e}\")))?;\n\n                Ok(Conn {\n                    inner: Box::new(S2nTlsConn {\n                        inner: TokioIo::new(tls_stream),\n                    }),\n                    is_proxy: true,\n                })\n            })\n        }\n    }\n\n    // Simple wrapper that implements Connection for s2n-tls streams\n    struct S2nTlsConn<T>\n    where\n        T: tokio::io::AsyncRead + tokio::io::AsyncWrite + Unpin,\n    {\n        inner: TokioIo<s2n_tls_tokio::TlsStream<T>>,\n    }\n\n    impl<T> Connection for S2nTlsConn<T>\n    where\n        T: Connection + tokio::io::AsyncRead + tokio::io::AsyncWrite + Unpin,\n    {\n        fn connected(&self) -> Connected {\n            // For tunneled connections, we can't easily access the underlying connection info\n            // from s2n-tls, so we'll return a basic Connected instance\n            Connected::new()\n        }\n    }\n\n    impl<T> hyper::rt::Read for S2nTlsConn<T>\n    where\n        T: tokio::io::AsyncRead + tokio::io::AsyncWrite + Unpin,\n    {\n        fn poll_read(\n            self: Pin<&mut Self>,\n            cx: &mut Context<'_>,\n            buf: hyper::rt::ReadBufCursor<'_>,\n        ) -> Poll<tokio::io::Result<()>> {\n            Pin::new(&mut self.get_mut().inner).poll_read(cx, buf)\n        }\n    }\n\n    impl<T> hyper::rt::Write for S2nTlsConn<T>\n    where\n        T: tokio::io::AsyncRead + tokio::io::AsyncWrite + Unpin,\n    {\n        fn poll_write(\n            self: Pin<&mut Self>,\n            cx: &mut Context<'_>,\n            buf: &[u8],\n        ) -> Poll<Result<usize, tokio::io::Error>> {\n            Pin::new(&mut self.get_mut().inner).poll_write(cx, buf)\n        }\n\n        fn poll_flush(\n            self: Pin<&mut Self>,\n            cx: &mut Context<'_>,\n        ) -> Poll<Result<(), tokio::io::Error>> {\n            Pin::new(&mut self.get_mut().inner).poll_flush(cx)\n        }\n\n        fn poll_shutdown(\n            self: Pin<&mut Self>,\n            cx: &mut Context<'_>,\n        ) -> Poll<Result<(), tokio::io::Error>> {\n            Pin::new(&mut self.get_mut().inner).poll_shutdown(cx)\n        }\n\n        fn poll_write_vectored(\n            self: Pin<&mut Self>,\n            cx: &mut Context<'_>,\n            bufs: &[IoSlice<'_>],\n        ) -> Poll<Result<usize, tokio::io::Error>> {\n            Pin::new(&mut self.get_mut().inner).poll_write_vectored(cx, bufs)\n        }\n\n        fn is_write_vectored(&self) -> bool {\n            self.inner.is_write_vectored()\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-client/src/client/tls.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nuse crate::cfg::{cfg_rustls, cfg_s2n_tls};\nuse crate::HttpClientError;\n\n/// Choice of underlying cryptography library\n#[derive(Debug, Eq, PartialEq, Clone)]\n#[non_exhaustive]\npub enum Provider {\n    #[cfg(any(\n        feature = \"rustls-aws-lc\",\n        feature = \"rustls-aws-lc-fips\",\n        feature = \"rustls-ring\"\n    ))]\n    /// TLS provider based on [rustls](https://github.com/rustls/rustls)\n    Rustls(rustls_provider::CryptoMode),\n    /// TLS provider based on [s2n-tls](https://github.com/aws/s2n-tls)\n    #[cfg(feature = \"s2n-tls\")]\n    S2nTls,\n}\n\n/// TLS related configuration object\n#[derive(Debug, Clone)]\npub struct TlsContext {\n    #[allow(unused)]\n    trust_store: TrustStore,\n}\n\nimpl TlsContext {\n    /// Create a new [TlsContext] builder\n    pub fn builder() -> TlsContextBuilder {\n        TlsContextBuilder::new()\n    }\n}\n\nimpl Default for TlsContext {\n    fn default() -> Self {\n        TlsContext::builder().build().expect(\"valid default config\")\n    }\n}\n\n/// Builder for TLS related configuration\n#[derive(Debug)]\npub struct TlsContextBuilder {\n    trust_store: TrustStore,\n}\n\nimpl TlsContextBuilder {\n    fn new() -> Self {\n        TlsContextBuilder {\n            trust_store: TrustStore::default(),\n        }\n    }\n\n    /// Configure the trust store to use for the TLS context\n    pub fn with_trust_store(mut self, trust_store: TrustStore) -> Self {\n        self.trust_store = trust_store;\n        self\n    }\n\n    /// Build a new [TlsContext]\n    pub fn build(self) -> Result<TlsContext, HttpClientError> {\n        Ok(TlsContext {\n            trust_store: self.trust_store,\n        })\n    }\n}\n\n/// PEM encoded certificate\n#[allow(unused)]\n#[derive(Debug, Clone)]\nstruct CertificatePEM(Vec<u8>);\n\nimpl From<&[u8]> for CertificatePEM {\n    fn from(value: &[u8]) -> Self {\n        CertificatePEM(value.to_vec())\n    }\n}\n\n/// Container for root certificates able to provide a root-of-trust for connection authentication\n///\n/// Platform native root certificates are enabled by default. To start with a clean trust\n/// store use [TrustStore::empty]\n#[derive(Debug, Clone)]\npub struct TrustStore {\n    enable_native_roots: bool,\n    custom_certs: Vec<CertificatePEM>,\n}\n\nimpl TrustStore {\n    /// Create a new empty trust store\n    pub fn empty() -> Self {\n        Self {\n            enable_native_roots: false,\n            custom_certs: Vec::new(),\n        }\n    }\n\n    /// Enable or disable using the platform's native trusted root certificate store\n    ///\n    /// Default: true\n    pub fn with_native_roots(mut self, enable_native_roots: bool) -> Self {\n        self.enable_native_roots = enable_native_roots;\n        self\n    }\n\n    /// Add the PEM encoded certificate to the trust store\n    ///\n    /// This may be called more than once to add multiple certificates.\n    /// NOTE: PEM certificate contents are not validated until passed to the configured\n    /// TLS provider.\n    pub fn with_pem_certificate(mut self, pem_bytes: impl Into<Vec<u8>>) -> Self {\n        // ideally we'd validate here but rustls-pki-types converts to DER when loading and S2N\n        // still expects PEM encoding. Store the raw bytes and let the TLS implementation validate\n        self.custom_certs.push(CertificatePEM(pem_bytes.into()));\n        self\n    }\n\n    /// Add the PEM encoded certificate to the trust store\n    ///\n    /// This may be called more than once to add multiple certificates.\n    /// NOTE: PEM certificate contents are not validated until passed to the configured\n    /// TLS provider.\n    pub fn add_pem_certificate(&mut self, pem_bytes: impl Into<Vec<u8>>) -> &mut Self {\n        self.custom_certs.push(CertificatePEM(pem_bytes.into()));\n        self\n    }\n}\n\nimpl Default for TrustStore {\n    fn default() -> Self {\n        Self {\n            enable_native_roots: true,\n            custom_certs: Vec::new(),\n        }\n    }\n}\n\ncfg_rustls! {\n    /// rustls based support and adapters\n    pub mod rustls_provider;\n}\n\ncfg_s2n_tls! {\n    /// s2n-tls based support and adapters\n    pub(crate) mod s2n_tls_provider;\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-client/src/client.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nmod dns;\n/// Proxy configuration\npub mod proxy;\nmod timeout;\n/// TLS connector(s)\npub mod tls;\n\npub(crate) mod connect;\n\nuse crate::cfg::cfg_tls;\nuse crate::tls::TlsContext;\nuse aws_smithy_async::future::timeout::TimedOutError;\nuse aws_smithy_async::rt::sleep::{default_async_sleep, AsyncSleep, SharedAsyncSleep};\nuse aws_smithy_runtime_api::box_error::BoxError;\nuse aws_smithy_runtime_api::client::connection::CaptureSmithyConnection;\nuse aws_smithy_runtime_api::client::connection::ConnectionMetadata;\nuse aws_smithy_runtime_api::client::connector_metadata::ConnectorMetadata;\nuse aws_smithy_runtime_api::client::http::{\n    HttpClient, HttpConnector, HttpConnectorFuture, HttpConnectorSettings, SharedHttpClient,\n    SharedHttpConnector,\n};\nuse aws_smithy_runtime_api::client::orchestrator::{HttpRequest, HttpResponse};\nuse aws_smithy_runtime_api::client::result::ConnectorError;\nuse aws_smithy_runtime_api::client::runtime_components::{\n    RuntimeComponents, RuntimeComponentsBuilder,\n};\nuse aws_smithy_runtime_api::shared::IntoShared;\nuse aws_smithy_types::body::SdkBody;\nuse aws_smithy_types::config_bag::ConfigBag;\nuse aws_smithy_types::error::display::DisplayErrorContext;\nuse aws_smithy_types::retry::ErrorKind;\nuse client::connect::Connection;\nuse h2::Reason;\nuse http_1x::{Extensions, Uri};\nuse hyper::rt::{Read, Write};\nuse hyper_util::client::legacy as client;\nuse hyper_util::client::legacy::connect::dns::GaiResolver;\nuse hyper_util::client::legacy::connect::{\n    capture_connection, CaptureConnection, Connect, HttpConnector as HyperHttpConnector, HttpInfo,\n};\nuse hyper_util::client::proxy::matcher::Matcher;\nuse hyper_util::rt::{TokioExecutor, TokioTimer};\nuse std::borrow::Cow;\nuse std::collections::HashMap;\nuse std::error::Error;\nuse std::fmt;\nuse std::sync::RwLock;\nuse std::time::Duration;\n\n/// Given `HttpConnectorSettings` and an `SharedAsyncSleep`, create a `SharedHttpConnector` from defaults depending on what cargo features are activated.\npub fn default_connector(\n    settings: &HttpConnectorSettings,\n    sleep: Option<SharedAsyncSleep>,\n) -> Option<SharedHttpConnector> {\n    #[cfg(feature = \"rustls-aws-lc\")]\n    {\n        tracing::trace!(settings = ?settings, sleep = ?sleep, \"creating a new default connector\");\n        let mut conn_builder = Connector::builder().connector_settings(settings.clone());\n\n        if let Some(sleep) = sleep {\n            conn_builder = conn_builder.sleep_impl(sleep);\n        }\n\n        let conn = conn_builder\n            .tls_provider(tls::Provider::Rustls(\n                tls::rustls_provider::CryptoMode::AwsLc,\n            ))\n            .build();\n        Some(SharedHttpConnector::new(conn))\n    }\n    #[cfg(not(feature = \"rustls-aws-lc\"))]\n    {\n        tracing::trace!(settings = ?settings, sleep = ?sleep, \"no default connector available\");\n        None\n    }\n}\n\n/// [`HttpConnector`] used to make HTTP requests.\n///\n/// This connector also implements socket connect and read timeouts.\n///\n/// This shouldn't be used directly in most cases.\n/// See the docs on [`Builder`] for examples of how to customize the HTTP client.\n#[derive(Debug)]\npub struct Connector {\n    adapter: Box<dyn HttpConnector>,\n}\n\nimpl Connector {\n    /// Builder for an HTTP connector.\n    pub fn builder() -> ConnectorBuilder {\n        ConnectorBuilder {\n            enable_tcp_nodelay: true,\n            ..Default::default()\n        }\n    }\n}\n\nimpl HttpConnector for Connector {\n    fn call(&self, request: HttpRequest) -> HttpConnectorFuture {\n        self.adapter.call(request)\n    }\n}\n\n/// Builder for [`Connector`].\n#[derive(Default, Debug, Clone)]\npub struct ConnectorBuilder<Tls = TlsUnset> {\n    connector_settings: Option<HttpConnectorSettings>,\n    sleep_impl: Option<SharedAsyncSleep>,\n    client_builder: Option<hyper_util::client::legacy::Builder>,\n    pool_idle_timeout: Option<Option<Duration>>,\n    enable_tcp_nodelay: bool,\n    interface: Option<String>,\n    proxy_config: Option<proxy::ProxyConfig>,\n    #[allow(unused)]\n    tls: Tls,\n}\n\n/// Initial builder state, `TlsProvider` choice required\n#[derive(Default, Debug, Clone)]\n#[non_exhaustive]\npub struct TlsUnset {}\n\n/// TLS implementation selected\n#[derive(Debug, Clone)]\npub struct TlsProviderSelected {\n    #[allow(unused)]\n    provider: tls::Provider,\n    #[allow(unused)]\n    context: TlsContext,\n}\n\nimpl ConnectorBuilder<TlsUnset> {\n    /// Set the TLS implementation to use for this connector\n    pub fn tls_provider(self, provider: tls::Provider) -> ConnectorBuilder<TlsProviderSelected> {\n        ConnectorBuilder {\n            connector_settings: self.connector_settings,\n            sleep_impl: self.sleep_impl,\n            client_builder: self.client_builder,\n            enable_tcp_nodelay: self.enable_tcp_nodelay,\n            interface: self.interface,\n            proxy_config: self.proxy_config,\n            pool_idle_timeout: self.pool_idle_timeout,\n            tls: TlsProviderSelected {\n                provider,\n                context: TlsContext::default(),\n            },\n        }\n    }\n\n    /// Build an HTTP connector sans TLS\n    #[doc(hidden)]\n    pub fn build_http(self) -> Connector {\n        if let Some(ref proxy_config) = self.proxy_config {\n            if proxy_config.requires_tls() {\n                tracing::warn!(\n                    \"HTTPS proxy configured but no TLS provider set. \\\n                     Connections to HTTPS proxy servers will fail. \\\n                     Consider configuring a TLS provider to enable TLS support.\"\n                );\n            }\n        }\n\n        let base = self.base_connector();\n\n        // Wrap with HTTP proxy support if proxy is configured\n        let proxy_config = self\n            .proxy_config\n            .clone()\n            .unwrap_or_else(proxy::ProxyConfig::disabled);\n\n        if !proxy_config.is_disabled() {\n            let http_proxy_connector = connect::HttpProxyConnector::new(base, proxy_config);\n            self.wrap_connector(http_proxy_connector)\n        } else {\n            self.wrap_connector(base)\n        }\n    }\n}\n\nimpl<Any> ConnectorBuilder<Any> {\n    /// Create a [`Connector`] from this builder and a given connector.\n    pub(crate) fn wrap_connector<C>(self, tcp_connector: C) -> Connector\n    where\n        C: Send + Sync + 'static,\n        C: Clone,\n        C: tower::Service<Uri>,\n        C::Response: Read + Write + Connection + Send + Sync + Unpin,\n        C: Connect,\n        C::Future: Unpin + Send + 'static,\n        C::Error: Into<BoxError>,\n    {\n        let client_builder = self\n            .client_builder\n            .unwrap_or_else(|| new_tokio_hyper_builder(self.pool_idle_timeout));\n        let sleep_impl = self.sleep_impl.or_else(default_async_sleep);\n        let (connect_timeout, read_timeout) = self\n            .connector_settings\n            .map(|c| (c.connect_timeout(), c.read_timeout()))\n            .unwrap_or((None, None));\n\n        let connector = match connect_timeout {\n            Some(duration) => timeout::ConnectTimeout::new(\n                tcp_connector,\n                sleep_impl\n                    .clone()\n                    .expect(\"a sleep impl must be provided in order to have a connect timeout\"),\n                duration,\n            ),\n            None => timeout::ConnectTimeout::no_timeout(tcp_connector),\n        };\n        let base = client_builder.build(connector);\n        let read_timeout = match read_timeout {\n            Some(duration) => timeout::HttpReadTimeout::new(\n                base,\n                sleep_impl.expect(\"a sleep impl must be provided in order to have a read timeout\"),\n                duration,\n            ),\n            None => timeout::HttpReadTimeout::no_timeout(base),\n        };\n\n        let proxy_matcher = self\n            .proxy_config\n            .as_ref()\n            .map(|config| config.clone().into_hyper_util_matcher());\n\n        Connector {\n            adapter: Box::new(Adapter {\n                client: read_timeout,\n                proxy_matcher,\n            }),\n        }\n    }\n\n    /// Get the base TCP connector by mapping our config to the underlying `HttpConnector` from hyper\n    /// (which is a base TCP connector with no TLS or any wrapping)\n    fn base_connector(&self) -> HyperHttpConnector {\n        self.base_connector_with_resolver(GaiResolver::new())\n    }\n\n    /// Get the base TCP connector by mapping our config to the underlying `HttpConnector` from hyper\n    /// using the given resolver `R`\n    fn base_connector_with_resolver<R>(&self, resolver: R) -> HyperHttpConnector<R> {\n        let mut conn = HyperHttpConnector::new_with_resolver(resolver);\n        conn.set_nodelay(self.enable_tcp_nodelay);\n        #[cfg(any(target_os = \"android\", target_os = \"fuchsia\", target_os = \"linux\"))]\n        if let Some(interface) = &self.interface {\n            conn.set_interface(interface);\n        }\n        conn\n    }\n\n    /// Set the async sleep implementation used for timeouts\n    ///\n    /// Calling this is only necessary for testing or to use something other than\n    /// [`default_async_sleep`].\n    pub fn sleep_impl(mut self, sleep_impl: impl AsyncSleep + 'static) -> Self {\n        self.sleep_impl = Some(sleep_impl.into_shared());\n        self\n    }\n\n    /// Set the async sleep implementation used for timeouts\n    ///\n    /// Calling this is only necessary for testing or to use something other than\n    /// [`default_async_sleep`].\n    pub fn set_sleep_impl(&mut self, sleep_impl: Option<SharedAsyncSleep>) -> &mut Self {\n        self.sleep_impl = sleep_impl;\n        self\n    }\n\n    /// Configure the HTTP settings for the `HyperAdapter`\n    pub fn connector_settings(mut self, connector_settings: HttpConnectorSettings) -> Self {\n        self.connector_settings = Some(connector_settings);\n        self\n    }\n\n    /// Configure the HTTP settings for the `HyperAdapter`\n    pub fn set_connector_settings(\n        &mut self,\n        connector_settings: Option<HttpConnectorSettings>,\n    ) -> &mut Self {\n        self.connector_settings = connector_settings;\n        self\n    }\n\n    /// Configure `SO_NODELAY` for all sockets to the supplied value `nodelay`\n    pub fn enable_tcp_nodelay(mut self, nodelay: bool) -> Self {\n        self.enable_tcp_nodelay = nodelay;\n        self\n    }\n\n    /// Configure `SO_NODELAY` for all sockets to the supplied value `nodelay`\n    pub fn set_enable_tcp_nodelay(&mut self, nodelay: bool) -> &mut Self {\n        self.enable_tcp_nodelay = nodelay;\n        self\n    }\n\n    /// Sets the value for the `SO_BINDTODEVICE` option on this socket.\n    ///\n    /// If a socket is bound to an interface, only packets received from that particular\n    /// interface are processed by the socket. Note that this only works for some socket\n    /// types (e.g. `AF_INET` sockets).\n    ///\n    /// On Linux it can be used to specify a [VRF], but the binary needs to either have\n    /// `CAP_NET_RAW` capability set or be run as root.\n    ///\n    /// This function is only available on Android, Fuchsia, and Linux.\n    ///\n    /// [VRF]: https://www.kernel.org/doc/Documentation/networking/vrf.txt\n    #[cfg(any(target_os = \"android\", target_os = \"fuchsia\", target_os = \"linux\"))]\n    pub fn set_interface<S: Into<String>>(&mut self, interface: S) -> &mut Self {\n        self.interface = Some(interface.into());\n        self\n    }\n\n    /// Configure proxy settings for this connector\n    ///\n    /// This method allows you to set explicit proxy configuration for the HTTP client.\n    /// The proxy configuration will be used to determine whether requests should be\n    /// routed through a proxy server or connect directly.\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # #[cfg(feature = \"rustls-aws-lc\")]\n    /// # {\n    /// use aws_smithy_http_client::{Connector, proxy::ProxyConfig, tls};\n    ///\n    /// let proxy_config = ProxyConfig::http(\"http://proxy.example.com:8080\")?;\n    /// let connector = Connector::builder()\n    ///     .proxy_config(proxy_config)\n    ///     .tls_provider(tls::Provider::Rustls(tls::rustls_provider::CryptoMode::AwsLc))\n    ///     .build();\n    /// # }\n    /// # Ok::<(), Box<dyn std::error::Error>>(())\n    /// ```\n    pub fn proxy_config(mut self, config: proxy::ProxyConfig) -> Self {\n        self.proxy_config = Some(config);\n        self\n    }\n\n    /// Configure proxy settings for this connector\n    ///\n    /// This is the mutable version of [`proxy_config`](Self::proxy_config).\n    pub fn set_proxy_config(&mut self, config: Option<proxy::ProxyConfig>) -> &mut Self {\n        self.proxy_config = config;\n        self\n    }\n\n    /// Set an optional timeout for idle sockets being kept-alive.\n    ///\n    /// Pass `None` to disable timeout.\n    ///\n    /// Defaults to Hyper's default timeout, which is currently 90 seconds - see\n    /// [hyper_util::client::legacy::Builder::pool_idle_timeout],\n    /// but unlike that function, there is no need to call `pool_timer` yourself.\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # #[cfg(feature = \"rustls-aws-lc\")]\n    /// # {\n    /// use aws_smithy_http_client::{Connector, tls};\n    /// use std::time::Duration;\n    ///\n    /// let connector = Connector::builder()\n    ///     .pool_idle_timeout(Duration::from_secs(30))\n    ///     .tls_provider(tls::Provider::Rustls(tls::rustls_provider::CryptoMode::AwsLc))\n    ///     .build();\n    /// # }\n    /// # Ok::<(), Box<dyn std::error::Error>>(())\n    /// ```\n    pub fn pool_idle_timeout<D>(mut self, val: D) -> Self\n    where\n        D: Into<Option<Duration>>,\n    {\n        self.pool_idle_timeout = Some(val.into());\n        self\n    }\n\n    /// Set an optional timeout for idle sockets being kept-alive.\n    ///\n    /// Pass `None` to use Hyper's default timeout, `Some(None)` to disable timeouts.\n    ///\n    /// This is the mutable version of [`pool_idle_timeout`](Self::pool_idle_timeout).\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # #[cfg(feature = \"rustls-aws-lc\")]\n    /// # {\n    /// use aws_smithy_http_client::{Connector, tls};\n    /// use std::time::Duration;\n    ///\n    /// let mut connector = Connector::builder();\n    /// connector\n    ///     .set_pool_idle_timeout(Some(Some(Duration::from_secs(30))));\n    /// connector\n    ///     .tls_provider(tls::Provider::Rustls(tls::rustls_provider::CryptoMode::AwsLc))\n    ///     .build();\n    /// # }\n    /// # Ok::<(), Box<dyn std::error::Error>>(())\n    /// ```\n    pub fn set_pool_idle_timeout(&mut self, val: Option<Option<Duration>>) -> &mut Self {\n        self.pool_idle_timeout = val;\n        self\n    }\n\n    /// Override the Hyper client [`Builder`](hyper_util::client::legacy::Builder) used to construct this client.\n    ///\n    /// This enables changing settings like forcing HTTP2 and modifying other default client behavior.\n    pub(crate) fn hyper_builder(\n        mut self,\n        hyper_builder: hyper_util::client::legacy::Builder,\n    ) -> Self {\n        self.set_hyper_builder(Some(hyper_builder));\n        self\n    }\n\n    /// Override the Hyper client [`Builder`](hyper_util::client::legacy::Builder) used to construct this client.\n    ///\n    /// This enables changing settings like forcing HTTP2 and modifying other default client behavior.\n    pub(crate) fn set_hyper_builder(\n        &mut self,\n        hyper_builder: Option<hyper_util::client::legacy::Builder>,\n    ) -> &mut Self {\n        self.client_builder = hyper_builder;\n        self\n    }\n}\n\n/// Adapter to use a Hyper 1.0-based Client as an `HttpConnector`\n///\n/// This adapter also enables TCP `CONNECT` and HTTP `READ` timeouts via [`Connector::builder`].\nstruct Adapter<C> {\n    client: timeout::HttpReadTimeout<\n        hyper_util::client::legacy::Client<timeout::ConnectTimeout<C>, SdkBody>,\n    >,\n    proxy_matcher: Option<Matcher>,\n}\n\nimpl<C> fmt::Debug for Adapter<C> {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        f.debug_struct(\"Adapter\")\n            .field(\"client\", &\"** hyper client **\")\n            .field(\"proxy_matcher\", &self.proxy_matcher.is_some())\n            .finish()\n    }\n}\n\n/// Extract a smithy connection from a hyper CaptureConnection\nfn extract_smithy_connection(capture_conn: &CaptureConnection) -> Option<ConnectionMetadata> {\n    let capture_conn = capture_conn.clone();\n    if let Some(conn) = capture_conn.clone().connection_metadata().as_ref() {\n        let mut extensions = Extensions::new();\n        conn.get_extras(&mut extensions);\n        let http_info = extensions.get::<HttpInfo>();\n        let mut builder = ConnectionMetadata::builder()\n            .proxied(conn.is_proxied())\n            .poison_fn(move || match capture_conn.connection_metadata().as_ref() {\n                Some(conn) => conn.poison(),\n                None => tracing::trace!(\"no connection existed to poison\"),\n            });\n\n        builder\n            .set_local_addr(http_info.map(|info| info.local_addr()))\n            .set_remote_addr(http_info.map(|info| info.remote_addr()));\n\n        let smithy_connection = builder.build();\n\n        Some(smithy_connection)\n    } else {\n        None\n    }\n}\n\nfn new_tokio_hyper_builder(\n    pool_idle_timeout: Option<Option<Duration>>,\n) -> hyper_util::client::legacy::Builder {\n    let mut builder = hyper_util::client::legacy::Builder::new(TokioExecutor::new());\n    // Explicitly setting the pool_timer is required for connection timeouts to work.\n    builder.pool_timer(TokioTimer::new());\n\n    if let Some(pool_idle_timeout) = pool_idle_timeout {\n        builder.pool_idle_timeout(pool_idle_timeout);\n    }\n\n    builder\n}\n\nimpl<C> Adapter<C> {\n    /// Add proxy authentication header to the request if needed\n    fn add_proxy_auth_header(&self, request: &mut http_1x::Request<SdkBody>) {\n        // Only add auth for HTTP requests (not HTTPS which uses CONNECT tunneling)\n        if request.uri().scheme() != Some(&http_1x::uri::Scheme::HTTP) {\n            return;\n        }\n\n        // Don't override existing proxy authorization header\n        if request\n            .headers()\n            .contains_key(http_1x::header::PROXY_AUTHORIZATION)\n        {\n            return;\n        }\n\n        if let Some(ref matcher) = self.proxy_matcher {\n            if let Some(intercept) = matcher.intercept(request.uri()) {\n                // Add basic auth header if available\n                if let Some(auth_header) = intercept.basic_auth() {\n                    request\n                        .headers_mut()\n                        .insert(http_1x::header::PROXY_AUTHORIZATION, auth_header.clone());\n                    tracing::debug!(\"added proxy authentication header for {}\", request.uri());\n                }\n            }\n        }\n    }\n}\n\nimpl<C> HttpConnector for Adapter<C>\nwhere\n    C: Clone + Send + Sync + 'static,\n    C: tower::Service<Uri>,\n    C::Response: Connection + Read + Write + Unpin + 'static,\n    timeout::ConnectTimeout<C>: Connect,\n    C::Future: Unpin + Send + 'static,\n    C::Error: Into<BoxError>,\n{\n    fn call(&self, request: HttpRequest) -> HttpConnectorFuture {\n        let mut request = match request.try_into_http1x() {\n            Ok(request) => request,\n            Err(err) => {\n                return HttpConnectorFuture::ready(Err(ConnectorError::user(err.into())));\n            }\n        };\n\n        self.add_proxy_auth_header(&mut request);\n\n        let capture_connection = capture_connection(&mut request);\n        if let Some(capture_smithy_connection) =\n            request.extensions().get::<CaptureSmithyConnection>()\n        {\n            capture_smithy_connection\n                .set_connection_retriever(move || extract_smithy_connection(&capture_connection));\n        }\n        let mut client = self.client.clone();\n        use tower::Service;\n        let fut = client.call(request);\n        HttpConnectorFuture::new(async move {\n            let response = fut\n                .await\n                .map_err(downcast_error)?\n                .map(SdkBody::from_body_1_x);\n            match HttpResponse::try_from(response) {\n                Ok(response) => Ok(response),\n                Err(err) => Err(ConnectorError::other(err.into(), None)),\n            }\n        })\n    }\n}\n\n/// Downcast errors coming out of hyper into an appropriate `ConnectorError`\nfn downcast_error(err: BoxError) -> ConnectorError {\n    // is a `TimedOutError` (from aws_smithy_async::timeout) in the chain? if it is, this is a timeout\n    if find_source::<TimedOutError>(err.as_ref()).is_some() {\n        return ConnectorError::timeout(err);\n    }\n    // is the top of chain error actually already a `ConnectorError`? return that directly\n    let err = match err.downcast::<ConnectorError>() {\n        Ok(connector_error) => return *connector_error,\n        Err(box_error) => box_error,\n    };\n    // generally, the top of chain will probably be a hyper error. Go through a set of hyper specific\n    // error classifications\n    let err = match find_source::<hyper::Error>(err.as_ref()) {\n        Some(hyper_error) => return to_connector_error(hyper_error)(err),\n        None => match find_source::<hyper_util::client::legacy::Error>(err.as_ref()) {\n            Some(hyper_util_err) => {\n                if hyper_util_err.is_connect()\n                    || find_source::<std::io::Error>(hyper_util_err).is_some()\n                {\n                    return ConnectorError::io(err);\n                }\n                err\n            }\n            None => err,\n        },\n    };\n\n    // otherwise, we have no idea!\n    ConnectorError::other(err, None)\n}\n\n/// Convert a [`hyper::Error`] into a [`ConnectorError`]\nfn to_connector_error(err: &hyper::Error) -> fn(BoxError) -> ConnectorError {\n    if err.is_timeout() || find_source::<timeout::HttpTimeoutError>(err).is_some() {\n        return ConnectorError::timeout;\n    }\n    if err.is_user() {\n        return ConnectorError::user;\n    }\n    if err.is_closed() || err.is_canceled() || find_source::<std::io::Error>(err).is_some() {\n        return ConnectorError::io;\n    }\n    // We sometimes receive this from S3: hyper::Error(IncompleteMessage)\n    if err.is_incomplete_message() {\n        return |err: BoxError| ConnectorError::other(err, Some(ErrorKind::TransientError));\n    }\n\n    if let Some(h2_err) = find_source::<h2::Error>(err) {\n        if h2_err.is_go_away()\n            || (h2_err.is_reset() && h2_err.reason() == Some(Reason::REFUSED_STREAM))\n        {\n            return ConnectorError::io;\n        }\n    }\n\n    tracing::warn!(err = %DisplayErrorContext(&err), \"unrecognized error from Hyper. If this error should be retried, please file an issue.\");\n    |err: BoxError| ConnectorError::other(err, None)\n}\n\nfn find_source<'a, E: Error + 'static>(err: &'a (dyn Error + 'static)) -> Option<&'a E> {\n    let mut next = Some(err);\n    while let Some(err) = next {\n        if let Some(matching_err) = err.downcast_ref::<E>() {\n            return Some(matching_err);\n        }\n        next = err.source();\n    }\n    None\n}\n\n// TODO(https://github.com/awslabs/aws-sdk-rust/issues/1090): CacheKey must also include ptr equality to any\n// runtime components that are used—sleep_impl as a base (unless we prohibit overriding sleep impl)\n// If we decide to put a DnsResolver in RuntimeComponents, then we'll need to handle that as well.\n#[derive(Clone, Debug, Eq, PartialEq, Hash)]\nstruct CacheKey {\n    connect_timeout: Option<Duration>,\n    read_timeout: Option<Duration>,\n}\n\nimpl From<&HttpConnectorSettings> for CacheKey {\n    fn from(value: &HttpConnectorSettings) -> Self {\n        Self {\n            connect_timeout: value.connect_timeout(),\n            read_timeout: value.read_timeout(),\n        }\n    }\n}\n\nstruct HyperClient<F> {\n    connector_cache: RwLock<HashMap<CacheKey, SharedHttpConnector>>,\n    client_builder: hyper_util::client::legacy::Builder,\n    connector_fn: F,\n}\n\nimpl<F> fmt::Debug for HyperClient<F> {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        f.debug_struct(\"HyperClient\")\n            .field(\"connector_cache\", &self.connector_cache)\n            .field(\"client_builder\", &self.client_builder)\n            .finish()\n    }\n}\n\nimpl<F> HttpClient for HyperClient<F>\nwhere\n    F: Fn(\n            hyper_util::client::legacy::Builder,\n            Option<&HttpConnectorSettings>,\n            Option<&RuntimeComponents>,\n        ) -> Connector\n        + Send\n        + Sync\n        + 'static,\n{\n    fn http_connector(\n        &self,\n        settings: &HttpConnectorSettings,\n        components: &RuntimeComponents,\n    ) -> SharedHttpConnector {\n        let key = CacheKey::from(settings);\n        let mut connector = self.connector_cache.read().unwrap().get(&key).cloned();\n        if connector.is_none() {\n            let mut cache = self.connector_cache.write().unwrap();\n            // Short-circuit if another thread already wrote a connector to the cache for this key\n            if !cache.contains_key(&key) {\n                let start = components.time_source().map(|ts| ts.now());\n                let connector = (self.connector_fn)(\n                    self.client_builder.clone(),\n                    Some(settings),\n                    Some(components),\n                );\n                let end = components.time_source().map(|ts| ts.now());\n                if let (Some(start), Some(end)) = (start, end) {\n                    if let Ok(elapsed) = end.duration_since(start) {\n                        tracing::debug!(\"new connector created in {:?}\", elapsed);\n                    }\n                }\n                let connector = SharedHttpConnector::new(connector);\n                cache.insert(key.clone(), connector);\n            }\n            connector = cache.get(&key).cloned();\n        }\n\n        connector.expect(\"cache populated above\")\n    }\n\n    fn validate_base_client_config(\n        &self,\n        _: &RuntimeComponentsBuilder,\n        _: &ConfigBag,\n    ) -> Result<(), BoxError> {\n        // Initialize the TCP connector at this point so that native certs load\n        // at client initialization time instead of upon first request. We do it\n        // here rather than at construction so that it won't run if this is not\n        // the selected HTTP client for the base config (for example, if this was\n        // the default HTTP client, and it was overridden by a later plugin).\n        let _ = (self.connector_fn)(self.client_builder.clone(), None, None);\n        Ok(())\n    }\n\n    fn connector_metadata(&self) -> Option<ConnectorMetadata> {\n        Some(ConnectorMetadata::new(\"hyper\", Some(Cow::Borrowed(\"1.x\"))))\n    }\n}\n\n/// Builder for a hyper-backed [`HttpClient`] implementation.\n///\n/// This builder can be used to customize the underlying TCP connector used, as well as\n/// hyper client configuration.\n///\n/// # Examples\n///\n/// Construct a Hyper client with the RusTLS TLS implementation.\n/// This can be useful when you want to share a Hyper connector between multiple\n/// generated Smithy clients.\n#[derive(Clone, Default, Debug)]\npub struct Builder<Tls = TlsUnset> {\n    client_builder: Option<hyper_util::client::legacy::Builder>,\n    pool_idle_timeout: Option<Option<Duration>>,\n    #[allow(unused)]\n    tls_provider: Tls,\n}\n\ncfg_tls! {\n    use aws_smithy_runtime_api::client::dns::ResolveDns;\n\n    impl ConnectorBuilder<TlsProviderSelected> {\n        /// Build a [`Connector`] that will use the default DNS resolver implementation.\n        pub fn build(self) -> Connector {\n            let http_connector = self.base_connector();\n            self.build_https(http_connector)\n        }\n\n        /// Configure the TLS context\n        pub fn tls_context(mut self, ctx: TlsContext) -> Self {\n            self.tls.context = ctx;\n            self\n        }\n\n        /// Configure the TLS context\n        pub fn set_tls_context(&mut self, ctx: TlsContext) -> &mut Self {\n            self.tls.context = ctx;\n            self\n        }\n\n        /// Build a [`Connector`] that will use the given DNS resolver implementation.\n        pub fn build_with_resolver<R: ResolveDns + Clone + 'static>(self, resolver: R) -> Connector {\n            use crate::client::dns::HyperUtilResolver;\n            let http_connector = self.base_connector_with_resolver(HyperUtilResolver { resolver });\n            self.build_https(http_connector)\n        }\n\n        fn build_https<R>(self, http_connector: HyperHttpConnector<R>) -> Connector\n        where\n            R: Clone + Send + Sync + 'static,\n            R: tower::Service<hyper_util::client::legacy::connect::dns::Name>,\n            R::Response: Iterator<Item = std::net::SocketAddr>,\n            R::Future: Send,\n            R::Error: Into<Box<dyn Error + Send + Sync>>,\n        {\n            match &self.tls.provider {\n                // TODO(hyper1) - fix cfg_rustls! to allow matching on patterns so we can re-use it and not duplicate these cfg matches everywhere\n                #[cfg(any(\n                    feature = \"rustls-aws-lc\",\n                    feature = \"rustls-aws-lc-fips\",\n                    feature = \"rustls-ring\"\n                ))]\n                tls::Provider::Rustls(crypto_mode) => {\n                    let proxy_config = self.proxy_config.clone()\n                        .unwrap_or_else(proxy::ProxyConfig::disabled);\n\n                    let https_connector = tls::rustls_provider::build_connector::wrap_connector(\n                        http_connector,\n                        crypto_mode.clone(),\n                        &self.tls.context,\n                        proxy_config,\n                    );\n                    self.wrap_connector(https_connector)\n                },\n                #[cfg(feature = \"s2n-tls\")]\n                tls::Provider::S2nTls  => {\n                    let proxy_config = self.proxy_config.clone()\n                        .unwrap_or_else(proxy::ProxyConfig::disabled);\n\n                    let https_connector = tls::s2n_tls_provider::build_connector::wrap_connector(\n                        http_connector,\n                        &self.tls.context,\n                        proxy_config,\n                    );\n                    self.wrap_connector(https_connector)\n                }\n            }\n        }\n    }\n\n    impl Builder<TlsProviderSelected> {\n        /// Create an HTTPS client with the selected TLS provider.\n        ///\n        /// The trusted certificates will be loaded later when this becomes the selected\n        /// HTTP client for a Smithy client.\n        pub fn build_https(self) -> SharedHttpClient {\n            build_with_conn_fn(\n                self.client_builder,\n                self.pool_idle_timeout,\n                move |client_builder, settings, runtime_components| {\n                    let builder = new_conn_builder(client_builder, settings, runtime_components)\n                        .tls_provider(self.tls_provider.provider.clone())\n                        .tls_context(self.tls_provider.context.clone());\n                    builder.build()\n                },\n            )\n        }\n\n        /// Create an HTTPS client using a custom DNS resolver\n        pub fn build_with_resolver(\n            self,\n            resolver: impl ResolveDns + Clone + 'static,\n        ) -> SharedHttpClient {\n            build_with_conn_fn(\n                self.client_builder,\n                self.pool_idle_timeout,\n                move |client_builder, settings, runtime_components| {\n                    let builder = new_conn_builder(client_builder, settings, runtime_components)\n                        .tls_provider(self.tls_provider.provider.clone())\n                        .tls_context(self.tls_provider.context.clone());\n                    builder.build_with_resolver(resolver.clone())\n                },\n            )\n        }\n\n        /// Configure the TLS context\n        pub fn tls_context(mut self, ctx: TlsContext) -> Self {\n            self.tls_provider.context = ctx;\n            self\n        }\n    }\n}\n\nimpl<Any> Builder<Any> {\n    /// Set an optional timeout for idle sockets being kept-alive.\n    ///\n    /// Pass `None` to disable timeout.\n    ///\n    /// Defaults to Hyper's default timeout, which is currently 90 seconds - see\n    /// [hyper_util::client::legacy::Builder::pool_idle_timeout],\n    /// but unlike that function, there is no need to call `pool_timer` yourself.\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # #[cfg(feature = \"rustls-aws-lc\")]\n    /// # {\n    /// use aws_smithy_http_client::{Builder, tls};\n    /// use std::time::Duration;\n    ///\n    /// let client = Builder::new()\n    ///     .pool_idle_timeout(Duration::from_secs(30))\n    ///     .tls_provider(tls::Provider::Rustls(tls::rustls_provider::CryptoMode::AwsLc))\n    ///     .build_https();\n    /// # }\n    /// # Ok::<(), Box<dyn std::error::Error>>(())\n    /// ```\n    pub fn pool_idle_timeout<D>(mut self, val: D) -> Self\n    where\n        D: Into<Option<Duration>>,\n    {\n        self.pool_idle_timeout = Some(val.into());\n        self\n    }\n\n    /// Set an optional timeout for idle sockets being kept-alive.\n    ///\n    /// Pass `None` to use Hyper's default timeout, `Some(None)` to disable timeouts.\n    ///\n    /// This is the mutable version of [`pool_idle_timeout`](Self::pool_idle_timeout).\n    ///\n    /// # Examples\n    ///\n    /// ```rust\n    /// # #[cfg(feature = \"rustls-aws-lc\")]\n    /// # {\n    /// use std::time::Duration;\n    /// use aws_smithy_http_client::{Builder, tls};\n    ///\n    /// let mut client = Builder::new();\n    /// client.set_pool_idle_timeout(Some(Some(Duration::from_secs(30))));\n    /// client\n    ///     .tls_provider(tls::Provider::Rustls(tls::rustls_provider::CryptoMode::AwsLc))\n    ///     .build_https();\n    /// # }\n    /// # Ok::<(), Box<dyn std::error::Error>>(())\n    /// ```\n    pub fn set_pool_idle_timeout(&mut self, val: Option<Option<Duration>>) -> &mut Self {\n        self.pool_idle_timeout = val;\n        self\n    }\n}\n\nimpl Builder<TlsUnset> {\n    /// Creates a new builder.\n    pub fn new() -> Self {\n        Self::default()\n    }\n\n    /// Returns a [`SharedHttpClient`] that calls the given `connector` function to select an HTTP(S) connector.\n    #[doc(hidden)]\n    pub fn build_with_connector_fn<F>(self, connector_fn: F) -> SharedHttpClient\n    where\n        F: Fn(Option<&HttpConnectorSettings>, Option<&RuntimeComponents>) -> Connector\n            + Send\n            + Sync\n            + 'static,\n    {\n        build_with_conn_fn(\n            self.client_builder,\n            self.pool_idle_timeout,\n            move |_builder, settings, runtime_components| {\n                connector_fn(settings, runtime_components)\n            },\n        )\n    }\n\n    /// Build a new HTTP client without TLS enabled\n    #[doc(hidden)]\n    pub fn build_http(self) -> SharedHttpClient {\n        build_with_conn_fn(\n            self.client_builder,\n            self.pool_idle_timeout,\n            move |client_builder, settings, runtime_components| {\n                let builder = new_conn_builder(client_builder, settings, runtime_components);\n                builder.build_http()\n            },\n        )\n    }\n\n    /// Set the TLS implementation to use\n    pub fn tls_provider(self, provider: tls::Provider) -> Builder<TlsProviderSelected> {\n        Builder {\n            client_builder: self.client_builder,\n            pool_idle_timeout: self.pool_idle_timeout,\n            tls_provider: TlsProviderSelected {\n                provider,\n                context: TlsContext::default(),\n            },\n        }\n    }\n}\n\npub(crate) fn build_with_conn_fn<F>(\n    client_builder: Option<hyper_util::client::legacy::Builder>,\n    pool_idle_timeout: Option<Option<Duration>>,\n    connector_fn: F,\n) -> SharedHttpClient\nwhere\n    F: Fn(\n            hyper_util::client::legacy::Builder,\n            Option<&HttpConnectorSettings>,\n            Option<&RuntimeComponents>,\n        ) -> Connector\n        + Send\n        + Sync\n        + 'static,\n{\n    let client_builder =\n        client_builder.unwrap_or_else(|| new_tokio_hyper_builder(pool_idle_timeout));\n    SharedHttpClient::new(HyperClient {\n        connector_cache: RwLock::new(HashMap::new()),\n        client_builder,\n        connector_fn,\n    })\n}\n\n#[allow(dead_code)]\npub(crate) fn build_with_tcp_conn_fn<C, F>(\n    client_builder: Option<hyper_util::client::legacy::Builder>,\n    pool_idle_timeout: Option<Option<Duration>>,\n    tcp_connector_fn: F,\n) -> SharedHttpClient\nwhere\n    F: Fn() -> C + Send + Sync + 'static,\n    C: Clone + Send + Sync + 'static,\n    C: tower::Service<Uri>,\n    C::Response: Connection + Read + Write + Send + Sync + Unpin + 'static,\n    C::Future: Unpin + Send + 'static,\n    C::Error: Into<BoxError>,\n    C: Connect,\n{\n    build_with_conn_fn(\n        client_builder,\n        pool_idle_timeout,\n        move |client_builder, settings, runtime_components| {\n            let builder = new_conn_builder(client_builder, settings, runtime_components);\n            builder.wrap_connector(tcp_connector_fn())\n        },\n    )\n}\n\nfn new_conn_builder(\n    client_builder: hyper_util::client::legacy::Builder,\n    settings: Option<&HttpConnectorSettings>,\n    runtime_components: Option<&RuntimeComponents>,\n) -> ConnectorBuilder {\n    let mut builder = Connector::builder().hyper_builder(client_builder);\n    builder.set_connector_settings(settings.cloned());\n    if let Some(components) = runtime_components {\n        builder.set_sleep_impl(components.sleep_impl());\n    }\n    builder\n}\n\n#[cfg(test)]\nmod test {\n    use std::io::{Error, ErrorKind};\n    use std::pin::Pin;\n    use std::sync::atomic::{AtomicU32, Ordering};\n    use std::sync::Arc;\n    use std::task::{Context, Poll};\n\n    use crate::client::timeout::test::NeverConnects;\n    use aws_smithy_async::assert_elapsed;\n    use aws_smithy_async::rt::sleep::TokioSleep;\n    use aws_smithy_async::time::SystemTimeSource;\n    use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder;\n    use http_1x::Uri;\n    use hyper::rt::ReadBufCursor;\n    use hyper_util::client::legacy::connect::Connected;\n\n    use super::*;\n\n    #[tokio::test]\n    async fn connector_selection() {\n        // Create a client that increments a count every time it creates a new Connector\n        let creation_count = Arc::new(AtomicU32::new(0));\n        let http_client = build_with_tcp_conn_fn(None, None, {\n            let count = creation_count.clone();\n            move || {\n                count.fetch_add(1, Ordering::Relaxed);\n                NeverConnects\n            }\n        });\n\n        // This configuration should result in 4 separate connectors with different timeout settings\n        let settings = [\n            HttpConnectorSettings::builder()\n                .connect_timeout(Duration::from_secs(3))\n                .build(),\n            HttpConnectorSettings::builder()\n                .read_timeout(Duration::from_secs(3))\n                .build(),\n            HttpConnectorSettings::builder()\n                .connect_timeout(Duration::from_secs(3))\n                .read_timeout(Duration::from_secs(3))\n                .build(),\n            HttpConnectorSettings::builder()\n                .connect_timeout(Duration::from_secs(5))\n                .read_timeout(Duration::from_secs(3))\n                .build(),\n        ];\n\n        // Kick off thousands of parallel tasks that will try to create a connector\n        let components = RuntimeComponentsBuilder::for_tests()\n            .with_time_source(Some(SystemTimeSource::new()))\n            .build()\n            .unwrap();\n        let mut handles = Vec::new();\n        for setting in &settings {\n            for _ in 0..1000 {\n                let client = http_client.clone();\n                handles.push(tokio::spawn({\n                    let setting = setting.clone();\n                    let components = components.clone();\n                    async move {\n                        let _ = client.http_connector(&setting, &components);\n                    }\n                }));\n            }\n        }\n        for handle in handles {\n            handle.await.unwrap();\n        }\n\n        // Verify only 4 connectors were created amidst the chaos\n        assert_eq!(4, creation_count.load(Ordering::Relaxed));\n    }\n\n    #[tokio::test]\n    async fn hyper_io_error() {\n        let connector = TestConnection {\n            inner: HangupStream,\n        };\n        let adapter = Connector::builder().wrap_connector(connector).adapter;\n        let err = adapter\n            .call(HttpRequest::get(\"https://socket-hangup.com\").unwrap())\n            .await\n            .expect_err(\"socket hangup\");\n        assert!(err.is_io(), \"unexpected error type: {:?}\", err);\n    }\n\n    // ---- machinery to make a Hyper connector that responds with an IO Error\n    #[derive(Clone)]\n    struct HangupStream;\n\n    impl Connection for HangupStream {\n        fn connected(&self) -> Connected {\n            Connected::new()\n        }\n    }\n\n    impl Read for HangupStream {\n        fn poll_read(\n            self: Pin<&mut Self>,\n            _cx: &mut Context<'_>,\n            _buf: ReadBufCursor<'_>,\n        ) -> Poll<std::io::Result<()>> {\n            Poll::Ready(Err(Error::new(\n                ErrorKind::ConnectionReset,\n                \"connection reset\",\n            )))\n        }\n    }\n\n    impl Write for HangupStream {\n        fn poll_write(\n            self: Pin<&mut Self>,\n            _cx: &mut Context<'_>,\n            _buf: &[u8],\n        ) -> Poll<Result<usize, Error>> {\n            Poll::Pending\n        }\n\n        fn poll_flush(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll<Result<(), Error>> {\n            Poll::Pending\n        }\n\n        fn poll_shutdown(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll<Result<(), Error>> {\n            Poll::Pending\n        }\n    }\n\n    #[derive(Clone)]\n    struct TestConnection<T> {\n        inner: T,\n    }\n\n    impl<T> tower::Service<Uri> for TestConnection<T>\n    where\n        T: Clone + Connection,\n    {\n        type Response = T;\n        type Error = BoxError;\n        type Future = std::future::Ready<Result<Self::Response, Self::Error>>;\n\n        fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {\n            Poll::Ready(Ok(()))\n        }\n\n        fn call(&mut self, _req: Uri) -> Self::Future {\n            std::future::ready(Ok(self.inner.clone()))\n        }\n    }\n\n    #[tokio::test]\n    async fn http_connect_timeout_works() {\n        let tcp_connector = NeverConnects::default();\n        let connector_settings = HttpConnectorSettings::builder()\n            .connect_timeout(Duration::from_secs(1))\n            .build();\n        let hyper = Connector::builder()\n            .connector_settings(connector_settings)\n            .sleep_impl(SharedAsyncSleep::new(TokioSleep::new()))\n            .wrap_connector(tcp_connector)\n            .adapter;\n        let now = tokio::time::Instant::now();\n        tokio::time::pause();\n        let resp = hyper\n            .call(HttpRequest::get(\"https://static-uri.com\").unwrap())\n            .await\n            .unwrap_err();\n        assert!(\n            resp.is_timeout(),\n            \"expected resp.is_timeout() to be true but it was false, resp == {:?}\",\n            resp\n        );\n        let message = DisplayErrorContext(&resp).to_string();\n        let expected = \"timeout: client error (Connect): HTTP connect timeout occurred after 1s\";\n        assert!(\n            message.contains(expected),\n            \"expected '{message}' to contain '{expected}'\"\n        );\n        assert_elapsed!(now, Duration::from_secs(1));\n    }\n\n    #[tokio::test]\n    async fn http_read_timeout_works() {\n        let tcp_connector = crate::client::timeout::test::NeverReplies;\n        let connector_settings = HttpConnectorSettings::builder()\n            .connect_timeout(Duration::from_secs(1))\n            .read_timeout(Duration::from_secs(2))\n            .build();\n        let hyper = Connector::builder()\n            .connector_settings(connector_settings)\n            .sleep_impl(SharedAsyncSleep::new(TokioSleep::new()))\n            .wrap_connector(tcp_connector)\n            .adapter;\n        let now = tokio::time::Instant::now();\n        tokio::time::pause();\n        let err = hyper\n            .call(HttpRequest::get(\"https://fake-uri.com\").unwrap())\n            .await\n            .unwrap_err();\n        assert!(\n            err.is_timeout(),\n            \"expected err.is_timeout() to be true but it was false, err == {err:?}\",\n        );\n        let message = format!(\"{}\", DisplayErrorContext(&err));\n        let expected = \"timeout: HTTP read timeout occurred after 2s\";\n        assert!(\n            message.contains(expected),\n            \"expected '{message}' to contain '{expected}'\"\n        );\n        assert_elapsed!(now, Duration::from_secs(2));\n    }\n\n    #[cfg(not(windows))]\n    #[tokio::test]\n    async fn connection_refused_works() {\n        use crate::client::dns::HyperUtilResolver;\n        use aws_smithy_runtime_api::client::dns::{DnsFuture, ResolveDns};\n        use std::net::{IpAddr, Ipv4Addr};\n\n        #[derive(Debug, Clone, Default)]\n        struct TestResolver;\n        impl ResolveDns for TestResolver {\n            fn resolve_dns<'a>(&'a self, _name: &'a str) -> DnsFuture<'a> {\n                let localhost_v4 = IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1));\n                DnsFuture::ready(Ok(vec![localhost_v4]))\n            }\n        }\n\n        let connector_settings = HttpConnectorSettings::builder()\n            .connect_timeout(Duration::from_secs(20))\n            .build();\n\n        let resolver = HyperUtilResolver {\n            resolver: TestResolver,\n        };\n        let connector = Connector::builder().base_connector_with_resolver(resolver);\n\n        let hyper = Connector::builder()\n            .connector_settings(connector_settings)\n            .sleep_impl(SharedAsyncSleep::new(TokioSleep::new()))\n            .wrap_connector(connector)\n            .adapter;\n\n        let resp = hyper\n            .call(HttpRequest::get(\"http://static-uri:50227.com\").unwrap())\n            .await\n            .unwrap_err();\n        assert!(\n            resp.is_io(),\n            \"expected resp.is_io() to be true but it was false, resp == {:?}\",\n            resp\n        );\n        let message = DisplayErrorContext(&resp).to_string();\n        let expected = \"Connection refused\";\n        assert!(\n            message.contains(expected),\n            \"expected '{message}' to contain '{expected}'\"\n        );\n    }\n\n    #[cfg(feature = \"s2n-tls\")]\n    #[tokio::test]\n    async fn s2n_tls_provider() {\n        // Create an HttpConnector with the s2n-tls provider.\n        let client = Builder::new()\n            .tls_provider(tls::Provider::S2nTls)\n            .build_https();\n        let connector_settings = HttpConnectorSettings::builder().build();\n\n        // HyperClient::http_connector invokes TimeSource::now to determine how long it takes to\n        // create new HttpConnectors. As such, a real time source must be provided.\n        let runtime_components = RuntimeComponentsBuilder::for_tests()\n            .with_time_source(Some(SystemTimeSource::new()))\n            .build()\n            .unwrap();\n\n        let connector = client.http_connector(&connector_settings, &runtime_components);\n\n        // Ensure that s2n-tls is used as the underlying TLS provider when selected.\n        //\n        // s2n-tls-hyper will error when given an invalid scheme. Ensure that this error is produced\n        // from s2n-tls-hyper, and not another TLS provider.\n        let error = connector\n            .call(HttpRequest::get(\"notascheme://amazon.com\").unwrap())\n            .await\n            .unwrap_err();\n        let error = error.into_source();\n        let s2n_error = error\n            .source()\n            .unwrap()\n            .downcast_ref::<s2n_tls_hyper::error::Error>()\n            .unwrap();\n        assert!(matches!(\n            s2n_error,\n            s2n_tls_hyper::error::Error::InvalidScheme\n        ));\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-client/src/error.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nuse aws_smithy_runtime_api::box_error::BoxError;\nuse std::fmt;\n\n/// HTTP client errors\n///\n/// This is normally due to configuration issues, internal SDK bugs, or other user error.\n#[derive(Debug)]\npub struct HttpClientError {\n    source: Option<BoxError>,\n}\n\nimpl fmt::Display for HttpClientError {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        write!(f, \"unknown HTTP client error\")\n    }\n}\n\nimpl std::error::Error for HttpClientError {\n    fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {\n        self.source.as_ref().map(|err| err.as_ref() as _)\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-client/src/hyper_legacy.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::hyper_legacy::timeout_middleware::HttpTimeoutError;\nuse aws_smithy_async::future::timeout::TimedOutError;\nuse aws_smithy_async::rt::sleep::{default_async_sleep, AsyncSleep, SharedAsyncSleep};\nuse aws_smithy_runtime_api::box_error::BoxError;\nuse aws_smithy_runtime_api::client::connection::CaptureSmithyConnection;\nuse aws_smithy_runtime_api::client::connection::ConnectionMetadata;\nuse aws_smithy_runtime_api::client::connector_metadata::ConnectorMetadata;\nuse aws_smithy_runtime_api::client::http::{\n    HttpClient, HttpConnector, HttpConnectorFuture, HttpConnectorSettings, SharedHttpClient,\n    SharedHttpConnector,\n};\nuse aws_smithy_runtime_api::client::orchestrator::{HttpRequest, HttpResponse};\nuse aws_smithy_runtime_api::client::result::ConnectorError;\nuse aws_smithy_runtime_api::client::runtime_components::{\n    RuntimeComponents, RuntimeComponentsBuilder,\n};\nuse aws_smithy_runtime_api::shared::IntoShared;\nuse aws_smithy_types::body::SdkBody;\nuse aws_smithy_types::config_bag::ConfigBag;\nuse aws_smithy_types::error::display::DisplayErrorContext;\nuse aws_smithy_types::retry::ErrorKind;\nuse h2_0_3::Reason;\nuse hyper_0_14::client::connect::{capture_connection, CaptureConnection, Connection, HttpInfo};\nuse std::borrow::Cow;\nuse std::collections::HashMap;\nuse std::error::Error;\nuse std::fmt;\nuse std::sync::RwLock;\nuse std::time::Duration;\nuse tokio::io::{AsyncRead, AsyncWrite};\n\n#[cfg(feature = \"legacy-rustls-ring\")]\nmod default_connector {\n    use aws_smithy_async::rt::sleep::SharedAsyncSleep;\n    use aws_smithy_runtime_api::client::http::HttpConnectorSettings;\n    use legacy_hyper_rustls as hyper_rustls;\n    use legacy_rustls as rustls;\n    use std::sync::LazyLock;\n\n    // Creating a `with_native_roots` HTTP client takes 300ms on OS X. Cache this so that we\n    // don't need to repeatedly incur that cost.\n    pub(crate) static HTTPS_NATIVE_ROOTS: LazyLock<\n        hyper_rustls::HttpsConnector<hyper_0_14::client::HttpConnector>,\n    > = LazyLock::new(default_tls);\n\n    fn default_tls() -> hyper_rustls::HttpsConnector<hyper_0_14::client::HttpConnector> {\n        use legacy_rustls::client::WantsTransparencyPolicyOrClientCert;\n        use legacy_rustls::{ClientConfig, ConfigBuilder, WantsVerifier};\n        use rustls_native_certs;\n        // polyfill with_native_roots from https://docs.rs/hyper-rustls/0.24.2/src/hyper_rustls/config.rs.html#22-70\n        // to use the new rustls_native_certs, since rustls_native_certs 0.6 depends on rustls-pemfile which is deprecated\n        fn with_native_roots(\n            this: ConfigBuilder<ClientConfig, WantsVerifier>,\n        ) -> ConfigBuilder<ClientConfig, WantsTransparencyPolicyOrClientCert> {\n            let mut roots = rustls::RootCertStore::empty();\n            let mut valid_count = 0;\n            let mut invalid_count = 0;\n\n            for cert in\n                rustls_native_certs::load_native_certs().expect(\"could not load platform certs\")\n            {\n                let cert = rustls::Certificate(cert.to_vec());\n                match roots.add(&cert) {\n                    Ok(_) => valid_count += 1,\n                    Err(err) => {\n                        tracing::trace!(\"invalid cert der {:?}\", cert.0);\n                        tracing::debug!(\"certificate parsing failed: {:?}\", err);\n                        invalid_count += 1\n                    }\n                }\n            }\n            tracing::debug!(\n                \"with_native_roots processed {} valid and {} invalid certs\",\n                valid_count,\n                invalid_count\n            );\n            assert!(!roots.is_empty(), \"no CA certificates found\");\n\n            this.with_root_certificates(roots)\n        }\n        hyper_rustls::HttpsConnectorBuilder::new()\n               .with_tls_config(\n                with_native_roots(rustls::ClientConfig::builder()\n                    .with_cipher_suites(&[\n                        // TLS1.3 suites\n                        rustls::cipher_suite::TLS13_AES_256_GCM_SHA384,\n                        rustls::cipher_suite::TLS13_AES_128_GCM_SHA256,\n                        // TLS1.2 suites\n                        rustls::cipher_suite::TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,\n                        rustls::cipher_suite::TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,\n                        rustls::cipher_suite::TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,\n                        rustls::cipher_suite::TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,\n                        rustls::cipher_suite::TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256,\n                    ])\n                    .with_safe_default_kx_groups()\n                    .with_safe_default_protocol_versions()\n                    .expect(\"Error with the TLS configuration. Please file a bug report under https://github.com/smithy-lang/smithy-rs/issues.\"))\n                    .with_no_client_auth()\n            )\n            .https_or_http()\n            .enable_http1()\n            .enable_http2()\n            .build()\n    }\n\n    pub(super) fn base(\n        settings: &HttpConnectorSettings,\n        sleep: Option<SharedAsyncSleep>,\n    ) -> super::HyperConnectorBuilder {\n        let mut hyper = super::HyperConnector::builder().connector_settings(settings.clone());\n        if let Some(sleep) = sleep {\n            hyper = hyper.sleep_impl(sleep);\n        }\n        hyper\n    }\n\n    /// Return a default HTTPS connector backed by the `rustls` crate.\n    ///\n    /// It requires a minimum TLS version of 1.2.\n    /// It allows you to connect to both `http` and `https` URLs.\n    pub(super) fn https() -> hyper_rustls::HttpsConnector<hyper_0_14::client::HttpConnector> {\n        HTTPS_NATIVE_ROOTS.clone()\n    }\n}\n\n/// Given `HttpConnectorSettings` and an `SharedAsyncSleep`, create a `SharedHttpConnector` from defaults depending on what cargo features are activated.\npub fn default_connector(\n    settings: &HttpConnectorSettings,\n    sleep: Option<SharedAsyncSleep>,\n) -> Option<SharedHttpConnector> {\n    #[cfg(feature = \"legacy-rustls-ring\")]\n    {\n        tracing::trace!(settings = ?settings, sleep = ?sleep, \"creating a new default connector\");\n        let hyper = default_connector::base(settings, sleep).build_https();\n        Some(SharedHttpConnector::new(hyper))\n    }\n    #[cfg(not(feature = \"legacy-rustls-ring\"))]\n    {\n        tracing::trace!(settings = ?settings, sleep = ?sleep, \"no default connector available\");\n        None\n    }\n}\n\n/// Creates a hyper-backed HTTPS client from defaults depending on what cargo features are activated.\npub fn default_client() -> Option<SharedHttpClient> {\n    #[cfg(feature = \"legacy-rustls-ring\")]\n    {\n        tracing::trace!(\"creating a new default hyper 0.14.x client\");\n        Some(HyperClientBuilder::new().build_https())\n    }\n    #[cfg(not(feature = \"legacy-rustls-ring\"))]\n    {\n        tracing::trace!(\"no default connector available\");\n        None\n    }\n}\n\n/// [`HttpConnector`] that uses [`hyper_0_14`] to make HTTP requests.\n///\n/// This connector also implements socket connect and read timeouts.\n///\n/// This shouldn't be used directly in most cases.\n/// See the docs on [`HyperClientBuilder`] for examples of how\n/// to customize the Hyper client.\n#[derive(Debug)]\npub struct HyperConnector {\n    adapter: Box<dyn HttpConnector>,\n}\n\nimpl HyperConnector {\n    /// Builder for a Hyper connector.\n    pub fn builder() -> HyperConnectorBuilder {\n        Default::default()\n    }\n}\n\nimpl HttpConnector for HyperConnector {\n    fn call(&self, request: HttpRequest) -> HttpConnectorFuture {\n        self.adapter.call(request)\n    }\n}\n\n/// Builder for [`HyperConnector`].\n#[derive(Default, Debug)]\npub struct HyperConnectorBuilder {\n    connector_settings: Option<HttpConnectorSettings>,\n    sleep_impl: Option<SharedAsyncSleep>,\n    client_builder: Option<hyper_0_14::client::Builder>,\n}\n\nimpl HyperConnectorBuilder {\n    /// Create a [`HyperConnector`] from this builder and a given connector.\n    pub fn build<C>(self, tcp_connector: C) -> HyperConnector\n    where\n        C: Clone + Send + Sync + 'static,\n        C: hyper_0_14::service::Service<http_02x::Uri>,\n        C::Response: Connection + AsyncRead + AsyncWrite + Send + Unpin + 'static,\n        C::Future: Unpin + Send + 'static,\n        C::Error: Into<BoxError>,\n    {\n        let client_builder = self.client_builder.unwrap_or_default();\n        let sleep_impl = self.sleep_impl.or_else(default_async_sleep);\n        let (connect_timeout, read_timeout) = self\n            .connector_settings\n            .map(|c| (c.connect_timeout(), c.read_timeout()))\n            .unwrap_or((None, None));\n\n        let connector = match connect_timeout {\n            Some(duration) => timeout_middleware::ConnectTimeout::new(\n                tcp_connector,\n                sleep_impl\n                    .clone()\n                    .expect(\"a sleep impl must be provided in order to have a connect timeout\"),\n                duration,\n            ),\n            None => timeout_middleware::ConnectTimeout::no_timeout(tcp_connector),\n        };\n        let base = client_builder.build(connector);\n        let read_timeout = match read_timeout {\n            Some(duration) => timeout_middleware::HttpReadTimeout::new(\n                base,\n                sleep_impl.expect(\"a sleep impl must be provided in order to have a read timeout\"),\n                duration,\n            ),\n            None => timeout_middleware::HttpReadTimeout::no_timeout(base),\n        };\n        HyperConnector {\n            adapter: Box::new(Adapter {\n                client: read_timeout,\n            }),\n        }\n    }\n\n    /// Create a [`HyperConnector`] with the default rustls HTTPS implementation.\n    #[cfg(feature = \"legacy-rustls-ring\")]\n    pub fn build_https(self) -> HyperConnector {\n        self.build(default_connector::https())\n    }\n\n    /// Set the async sleep implementation used for timeouts\n    ///\n    /// Calling this is only necessary for testing or to use something other than\n    /// [`default_async_sleep`].\n    pub fn sleep_impl(mut self, sleep_impl: impl AsyncSleep + 'static) -> Self {\n        self.sleep_impl = Some(sleep_impl.into_shared());\n        self\n    }\n\n    /// Set the async sleep implementation used for timeouts\n    ///\n    /// Calling this is only necessary for testing or to use something other than\n    /// [`default_async_sleep`].\n    pub fn set_sleep_impl(&mut self, sleep_impl: Option<SharedAsyncSleep>) -> &mut Self {\n        self.sleep_impl = sleep_impl;\n        self\n    }\n\n    /// Configure the HTTP settings for the `HyperAdapter`\n    pub fn connector_settings(mut self, connector_settings: HttpConnectorSettings) -> Self {\n        self.connector_settings = Some(connector_settings);\n        self\n    }\n\n    /// Configure the HTTP settings for the `HyperAdapter`\n    pub fn set_connector_settings(\n        &mut self,\n        connector_settings: Option<HttpConnectorSettings>,\n    ) -> &mut Self {\n        self.connector_settings = connector_settings;\n        self\n    }\n\n    /// Override the Hyper client [`Builder`](hyper_0_14::client::Builder) used to construct this client.\n    ///\n    /// This enables changing settings like forcing HTTP2 and modifying other default client behavior.\n    pub fn hyper_builder(mut self, hyper_builder: hyper_0_14::client::Builder) -> Self {\n        self.client_builder = Some(hyper_builder);\n        self\n    }\n\n    /// Override the Hyper client [`Builder`](hyper_0_14::client::Builder) used to construct this client.\n    ///\n    /// This enables changing settings like forcing HTTP2 and modifying other default client behavior.\n    pub fn set_hyper_builder(\n        &mut self,\n        hyper_builder: Option<hyper_0_14::client::Builder>,\n    ) -> &mut Self {\n        self.client_builder = hyper_builder;\n        self\n    }\n}\n\n/// Adapter from a [`hyper_0_14::Client`] to [`HttpConnector`].\n///\n/// This adapter also enables TCP `CONNECT` and HTTP `READ` timeouts via [`HyperConnector::builder`].\nstruct Adapter<C> {\n    client: timeout_middleware::HttpReadTimeout<\n        hyper_0_14::Client<timeout_middleware::ConnectTimeout<C>, SdkBody>,\n    >,\n}\n\nimpl<C> fmt::Debug for Adapter<C> {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        f.debug_struct(\"Adapter\")\n            .field(\"client\", &\"** hyper client **\")\n            .finish()\n    }\n}\n\n/// Extract a smithy connection from a hyper CaptureConnection\nfn extract_smithy_connection(capture_conn: &CaptureConnection) -> Option<ConnectionMetadata> {\n    let capture_conn = capture_conn.clone();\n    if let Some(conn) = capture_conn.clone().connection_metadata().as_ref() {\n        let mut extensions = http_02x::Extensions::new();\n        conn.get_extras(&mut extensions);\n        let http_info = extensions.get::<HttpInfo>();\n        let mut builder = ConnectionMetadata::builder()\n            .proxied(conn.is_proxied())\n            .poison_fn(move || match capture_conn.connection_metadata().as_ref() {\n                Some(conn) => conn.poison(),\n                None => tracing::trace!(\"no connection existed to poison\"),\n            });\n\n        builder\n            .set_local_addr(http_info.map(|info| info.local_addr()))\n            .set_remote_addr(http_info.map(|info| info.remote_addr()));\n\n        let smithy_connection = builder.build();\n\n        Some(smithy_connection)\n    } else {\n        None\n    }\n}\n\nimpl<C> HttpConnector for Adapter<C>\nwhere\n    C: Clone + Send + Sync + 'static,\n    C: hyper_0_14::service::Service<http_02x::Uri>,\n    C::Response: Connection + AsyncRead + AsyncWrite + Send + Unpin + 'static,\n    C::Future: Unpin + Send + 'static,\n    C::Error: Into<BoxError>,\n{\n    fn call(&self, request: HttpRequest) -> HttpConnectorFuture {\n        use hyper_0_14::service::Service;\n\n        let mut request = match request.try_into_http02x() {\n            Ok(request) => request,\n            Err(err) => {\n                return HttpConnectorFuture::ready(Err(ConnectorError::other(err.into(), None)));\n            }\n        };\n        let capture_connection = capture_connection(&mut request);\n        if let Some(capture_smithy_connection) =\n            request.extensions().get::<CaptureSmithyConnection>()\n        {\n            capture_smithy_connection\n                .set_connection_retriever(move || extract_smithy_connection(&capture_connection));\n        }\n        let mut client = self.client.clone();\n        let fut = client.call(request);\n        HttpConnectorFuture::new(async move {\n            let response = fut\n                .await\n                .map_err(downcast_error)?\n                .map(SdkBody::from_body_0_4);\n            match HttpResponse::try_from(response) {\n                Ok(response) => Ok(response),\n                Err(err) => Err(ConnectorError::other(err.into(), None)),\n            }\n        })\n    }\n}\n\n/// Downcast errors coming out of hyper into an appropriate `ConnectorError`\nfn downcast_error(err: BoxError) -> ConnectorError {\n    // is a `TimedOutError` (from aws_smithy_async::timeout) in the chain? if it is, this is a timeout\n    if find_source::<TimedOutError>(err.as_ref()).is_some() {\n        return ConnectorError::timeout(err);\n    }\n    // is the top of chain error actually already a `ConnectorError`? return that directly\n    let err = match err.downcast::<ConnectorError>() {\n        Ok(connector_error) => return *connector_error,\n        Err(box_error) => box_error,\n    };\n    // generally, the top of chain will probably be a hyper error. Go through a set of hyper specific\n    // error classifications\n    let err = match err.downcast::<hyper_0_14::Error>() {\n        Ok(hyper_error) => return to_connector_error(*hyper_error),\n        Err(box_error) => box_error,\n    };\n\n    // otherwise, we have no idea!\n    ConnectorError::other(err, None)\n}\n\n/// Convert a [`hyper_0_14::Error`] into a [`ConnectorError`]\nfn to_connector_error(err: hyper_0_14::Error) -> ConnectorError {\n    if err.is_timeout() || find_source::<HttpTimeoutError>(&err).is_some() {\n        return ConnectorError::timeout(err.into());\n    }\n    if err.is_user() {\n        return ConnectorError::user(err.into());\n    }\n    if err.is_closed() || err.is_canceled() || find_source::<std::io::Error>(&err).is_some() {\n        return ConnectorError::io(err.into());\n    }\n    // We sometimes receive this from S3: hyper::Error(IncompleteMessage)\n    if err.is_incomplete_message() {\n        return ConnectorError::other(err.into(), Some(ErrorKind::TransientError));\n    }\n    if let Some(h2_err) = find_source::<h2_0_3::Error>(&err) {\n        if h2_err.is_go_away()\n            || (h2_err.is_reset() && h2_err.reason() == Some(Reason::REFUSED_STREAM))\n        {\n            return ConnectorError::io(err.into());\n        }\n    }\n\n    tracing::warn!(err = %DisplayErrorContext(&err), \"unrecognized error from Hyper. If this error should be retried, please file an issue.\");\n    ConnectorError::other(err.into(), None)\n}\n\nfn find_source<'a, E: Error + 'static>(err: &'a (dyn Error + 'static)) -> Option<&'a E> {\n    let mut next = Some(err);\n    while let Some(err) = next {\n        if let Some(matching_err) = err.downcast_ref::<E>() {\n            return Some(matching_err);\n        }\n        next = err.source();\n    }\n    None\n}\n\n#[derive(Clone, Debug, Eq, PartialEq, Hash)]\nstruct CacheKey {\n    connect_timeout: Option<Duration>,\n    read_timeout: Option<Duration>,\n}\n\nimpl From<&HttpConnectorSettings> for CacheKey {\n    fn from(value: &HttpConnectorSettings) -> Self {\n        Self {\n            connect_timeout: value.connect_timeout(),\n            read_timeout: value.read_timeout(),\n        }\n    }\n}\n\nstruct HyperClient<F> {\n    connector_cache: RwLock<HashMap<CacheKey, SharedHttpConnector>>,\n    client_builder: hyper_0_14::client::Builder,\n    tcp_connector_fn: F,\n}\n\nimpl<F> fmt::Debug for HyperClient<F> {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        f.debug_struct(\"HyperClient\")\n            .field(\"connector_cache\", &self.connector_cache)\n            .field(\"client_builder\", &self.client_builder)\n            .finish()\n    }\n}\n\nimpl<C, F> HttpClient for HyperClient<F>\nwhere\n    F: Fn() -> C + Send + Sync,\n    C: Clone + Send + Sync + 'static,\n    C: hyper_0_14::service::Service<http_02x::Uri>,\n    C::Response: Connection + AsyncRead + AsyncWrite + Send + Unpin + 'static,\n    C::Future: Unpin + Send + 'static,\n    C::Error: Into<BoxError>,\n{\n    fn http_connector(\n        &self,\n        settings: &HttpConnectorSettings,\n        components: &RuntimeComponents,\n    ) -> SharedHttpConnector {\n        let key = CacheKey::from(settings);\n        let mut connector = self.connector_cache.read().unwrap().get(&key).cloned();\n        if connector.is_none() {\n            let mut cache = self.connector_cache.write().unwrap();\n            // Short-circuit if another thread already wrote a connector to the cache for this key\n            if !cache.contains_key(&key) {\n                let mut builder = HyperConnector::builder()\n                    .hyper_builder(self.client_builder.clone())\n                    .connector_settings(settings.clone());\n                builder.set_sleep_impl(components.sleep_impl());\n\n                let start = components.time_source().map(|ts| ts.now());\n                let tcp_connector = (self.tcp_connector_fn)();\n                let end = components.time_source().map(|ts| ts.now());\n                if let (Some(start), Some(end)) = (start, end) {\n                    if let Ok(elapsed) = end.duration_since(start) {\n                        tracing::debug!(\"new TCP connector created in {:?}\", elapsed);\n                    }\n                }\n                let connector = SharedHttpConnector::new(builder.build(tcp_connector));\n                cache.insert(key.clone(), connector);\n            }\n            connector = cache.get(&key).cloned();\n        }\n\n        connector.expect(\"cache populated above\")\n    }\n\n    fn validate_base_client_config(\n        &self,\n        _: &RuntimeComponentsBuilder,\n        _: &ConfigBag,\n    ) -> Result<(), BoxError> {\n        // Initialize the TCP connector at this point so that native certs load\n        // at client initialization time instead of upon first request. We do it\n        // here rather than at construction so that it won't run if this is not\n        // the selected HTTP client for the base config (for example, if this was\n        // the default HTTP client, and it was overridden by a later plugin).\n        let _ = (self.tcp_connector_fn)();\n        Ok(())\n    }\n\n    fn connector_metadata(&self) -> Option<ConnectorMetadata> {\n        Some(ConnectorMetadata::new(\"hyper\", Some(Cow::Borrowed(\"0.x\"))))\n    }\n}\n\n/// Builder for a hyper-backed [`HttpClient`] implementation.\n///\n/// This builder can be used to customize the underlying TCP connector used, as well as\n/// hyper client configuration.\n///\n/// # Examples\n///\n/// Construct a Hyper client with the default TLS implementation (rustls).\n/// This can be useful when you want to share a Hyper connector between multiple\n/// generated Smithy clients.\n///\n/// ```no_run,ignore\n/// use aws_smithy_http_client::hyper_014::HyperClientBuilder;\n///\n/// let http_client = HyperClientBuilder::new().build_https();\n///\n/// // This connector can then be given to a generated service Config\n/// let config = my_service_client::Config::builder()\n///     .endpoint_url(\"http://localhost:1234\")\n///     .http_client(http_client)\n///     .build();\n/// let client = my_service_client::Client::from_conf(config);\n/// ```\n///\n/// ## Use a Hyper client with WebPKI roots\n///\n/// A use case for where you may want to use the [`HyperClientBuilder`] is when\n/// setting Hyper client settings that aren't otherwise exposed by the `Config`\n/// builder interface. Some examples include changing:\n///\n/// - Hyper client settings\n/// - Allowed TLS cipher suites\n/// - Using an alternative TLS connector library (not the default, rustls)\n/// - CA trust root certificates (illustrated using WebPKI below)\n///\n/// ```no_run,ignore\n/// use aws_smithy_http_client::hyper_014::HyperClientBuilder;\n///\n/// let https_connector = hyper_rustls::HttpsConnectorBuilder::new()\n///     .with_webpki_roots()\n///     .https_only()\n///     .enable_http1()\n///     .enable_http2()\n///     .build();\n/// let http_client = HyperClientBuilder::new().build(https_connector);\n///\n/// // This connector can then be given to a generated service Config\n/// let config = my_service_client::Config::builder()\n///     .endpoint_url(\"https://example.com\")\n///     .http_client(http_client)\n///     .build();\n/// let client = my_service_client::Client::from_conf(config);\n/// ```\n#[derive(Clone, Default, Debug)]\npub struct HyperClientBuilder {\n    client_builder: Option<hyper_0_14::client::Builder>,\n}\n\nimpl HyperClientBuilder {\n    /// Creates a new builder.\n    pub fn new() -> Self {\n        Self::default()\n    }\n\n    /// Override the Hyper client [`Builder`](hyper_0_14::client::Builder) used to construct this client.\n    ///\n    /// This enables changing settings like forcing HTTP2 and modifying other default client behavior.\n    pub fn hyper_builder(mut self, hyper_builder: hyper_0_14::client::Builder) -> Self {\n        self.client_builder = Some(hyper_builder);\n        self\n    }\n\n    /// Override the Hyper client [`Builder`](hyper_0_14::client::Builder) used to construct this client.\n    ///\n    /// This enables changing settings like forcing HTTP2 and modifying other default client behavior.\n    pub fn set_hyper_builder(\n        &mut self,\n        hyper_builder: Option<hyper_0_14::client::Builder>,\n    ) -> &mut Self {\n        self.client_builder = hyper_builder;\n        self\n    }\n\n    /// Create a hyper client with the default rustls HTTPS implementation.\n    ///\n    /// The trusted certificates will be loaded later when this becomes the selected\n    /// HTTP client for a Smithy client.\n    #[cfg(feature = \"legacy-rustls-ring\")]\n    pub fn build_https(self) -> SharedHttpClient {\n        self.build_with_fn(default_connector::https)\n    }\n\n    /// Create a [`SharedHttpClient`] from this builder and a given connector.\n    ///\n    #[cfg_attr(\n        feature = \"legacy-rustls-ring\",\n        doc = \"Use [`build_https`](HyperClientBuilder::build_https) if you don't want to provide a custom TCP connector.\"\n    )]\n    pub fn build<C>(self, tcp_connector: C) -> SharedHttpClient\n    where\n        C: Clone + Send + Sync + 'static,\n        C: hyper_0_14::service::Service<http_02x::Uri>,\n        C::Response: Connection + AsyncRead + AsyncWrite + Send + Unpin + 'static,\n        C::Future: Unpin + Send + 'static,\n        C::Error: Into<BoxError>,\n    {\n        self.build_with_fn(move || tcp_connector.clone())\n    }\n\n    fn build_with_fn<C, F>(self, tcp_connector_fn: F) -> SharedHttpClient\n    where\n        F: Fn() -> C + Send + Sync + 'static,\n        C: Clone + Send + Sync + 'static,\n        C: hyper_0_14::service::Service<http_02x::Uri>,\n        C::Response: Connection + AsyncRead + AsyncWrite + Send + Unpin + 'static,\n        C::Future: Unpin + Send + 'static,\n        C::Error: Into<BoxError>,\n    {\n        SharedHttpClient::new(HyperClient {\n            connector_cache: RwLock::new(HashMap::new()),\n            client_builder: self.client_builder.unwrap_or_default(),\n            tcp_connector_fn,\n        })\n    }\n}\n\nmod timeout_middleware {\n    use aws_smithy_async::future::timeout::{TimedOutError, Timeout};\n    use aws_smithy_async::rt::sleep::Sleep;\n    use aws_smithy_async::rt::sleep::{AsyncSleep, SharedAsyncSleep};\n    use aws_smithy_runtime_api::box_error::BoxError;\n    use pin_project_lite::pin_project;\n    use std::error::Error;\n    use std::fmt::Formatter;\n    use std::future::Future;\n    use std::pin::Pin;\n    use std::task::{Context, Poll};\n    use std::time::Duration;\n\n    #[derive(Debug)]\n    pub(crate) struct HttpTimeoutError {\n        kind: &'static str,\n        duration: Duration,\n    }\n\n    impl std::fmt::Display for HttpTimeoutError {\n        fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {\n            write!(\n                f,\n                \"{} timeout occurred after {:?}\",\n                self.kind, self.duration\n            )\n        }\n    }\n\n    impl Error for HttpTimeoutError {\n        // We implement the `source` function as returning a `TimedOutError` because when `downcast_error`\n        // or `find_source` is called with an `HttpTimeoutError` (or another error wrapping an `HttpTimeoutError`)\n        // this method will be checked to determine if it's a timeout-related error.\n        fn source(&self) -> Option<&(dyn Error + 'static)> {\n            Some(&TimedOutError)\n        }\n    }\n\n    /// Timeout wrapper that will timeout on the initial TCP connection\n    ///\n    /// # Stability\n    /// This interface is unstable.\n    #[derive(Clone, Debug)]\n    pub(super) struct ConnectTimeout<I> {\n        inner: I,\n        timeout: Option<(SharedAsyncSleep, Duration)>,\n    }\n\n    impl<I> ConnectTimeout<I> {\n        /// Create a new `ConnectTimeout` around `inner`.\n        ///\n        /// Typically, `I` will implement [`hyper_0_14::client::connect::Connect`].\n        pub(crate) fn new(inner: I, sleep: SharedAsyncSleep, timeout: Duration) -> Self {\n            Self {\n                inner,\n                timeout: Some((sleep, timeout)),\n            }\n        }\n\n        pub(crate) fn no_timeout(inner: I) -> Self {\n            Self {\n                inner,\n                timeout: None,\n            }\n        }\n    }\n\n    #[derive(Clone, Debug)]\n    pub(crate) struct HttpReadTimeout<I> {\n        inner: I,\n        timeout: Option<(SharedAsyncSleep, Duration)>,\n    }\n\n    impl<I> HttpReadTimeout<I> {\n        /// Create a new `HttpReadTimeout` around `inner`.\n        ///\n        /// Typically, `I` will implement [`hyper_0_14::service::Service<http::Request<SdkBody>>`].\n        pub(crate) fn new(inner: I, sleep: SharedAsyncSleep, timeout: Duration) -> Self {\n            Self {\n                inner,\n                timeout: Some((sleep, timeout)),\n            }\n        }\n\n        pub(crate) fn no_timeout(inner: I) -> Self {\n            Self {\n                inner,\n                timeout: None,\n            }\n        }\n    }\n\n    pin_project! {\n        /// Timeout future for Tower services\n        ///\n        /// Timeout future to handle timing out, mapping errors, and the possibility of not timing out\n        /// without incurring an additional allocation for each timeout layer.\n        #[project = MaybeTimeoutFutureProj]\n        pub enum MaybeTimeoutFuture<F> {\n            Timeout {\n                #[pin]\n                timeout: Timeout<F, Sleep>,\n                error_type: &'static str,\n                duration: Duration,\n            },\n            NoTimeout {\n                #[pin]\n                future: F\n            }\n        }\n    }\n\n    impl<F, T, E> Future for MaybeTimeoutFuture<F>\n    where\n        F: Future<Output = Result<T, E>>,\n        E: Into<BoxError>,\n    {\n        type Output = Result<T, BoxError>;\n\n        fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {\n            let (timeout_future, kind, &mut duration) = match self.project() {\n                MaybeTimeoutFutureProj::NoTimeout { future } => {\n                    return future.poll(cx).map_err(|err| err.into());\n                }\n                MaybeTimeoutFutureProj::Timeout {\n                    timeout,\n                    error_type,\n                    duration,\n                } => (timeout, error_type, duration),\n            };\n            match timeout_future.poll(cx) {\n                Poll::Ready(Ok(response)) => Poll::Ready(response.map_err(|err| err.into())),\n                Poll::Ready(Err(_timeout)) => {\n                    Poll::Ready(Err(HttpTimeoutError { kind, duration }.into()))\n                }\n                Poll::Pending => Poll::Pending,\n            }\n        }\n    }\n\n    impl<I> hyper_0_14::service::Service<http_02x::Uri> for ConnectTimeout<I>\n    where\n        I: hyper_0_14::service::Service<http_02x::Uri>,\n        I::Error: Into<BoxError>,\n    {\n        type Response = I::Response;\n        type Error = BoxError;\n        type Future = MaybeTimeoutFuture<I::Future>;\n\n        fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {\n            self.inner.poll_ready(cx).map_err(|err| err.into())\n        }\n\n        fn call(&mut self, req: http_02x::Uri) -> Self::Future {\n            match &self.timeout {\n                Some((sleep, duration)) => {\n                    let sleep = sleep.sleep(*duration);\n                    MaybeTimeoutFuture::Timeout {\n                        timeout: Timeout::new(self.inner.call(req), sleep),\n                        error_type: \"HTTP connect\",\n                        duration: *duration,\n                    }\n                }\n                None => MaybeTimeoutFuture::NoTimeout {\n                    future: self.inner.call(req),\n                },\n            }\n        }\n    }\n\n    impl<I, B> hyper_0_14::service::Service<http_02x::Request<B>> for HttpReadTimeout<I>\n    where\n        I: hyper_0_14::service::Service<http_02x::Request<B>, Error = hyper_0_14::Error>,\n    {\n        type Response = I::Response;\n        type Error = BoxError;\n        type Future = MaybeTimeoutFuture<I::Future>;\n\n        fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {\n            self.inner.poll_ready(cx).map_err(|err| err.into())\n        }\n\n        fn call(&mut self, req: http_02x::Request<B>) -> Self::Future {\n            match &self.timeout {\n                Some((sleep, duration)) => {\n                    let sleep = sleep.sleep(*duration);\n                    MaybeTimeoutFuture::Timeout {\n                        timeout: Timeout::new(self.inner.call(req), sleep),\n                        error_type: \"HTTP read\",\n                        duration: *duration,\n                    }\n                }\n                None => MaybeTimeoutFuture::NoTimeout {\n                    future: self.inner.call(req),\n                },\n            }\n        }\n    }\n\n    #[cfg(test)]\n    pub(crate) mod test {\n        use crate::hyper_014::HyperConnector;\n        use aws_smithy_async::assert_elapsed;\n        use aws_smithy_async::future::never::Never;\n        use aws_smithy_async::rt::sleep::{SharedAsyncSleep, TokioSleep};\n        use aws_smithy_runtime_api::box_error::BoxError;\n        use aws_smithy_runtime_api::client::http::HttpConnectorSettings;\n        use aws_smithy_runtime_api::client::orchestrator::HttpRequest;\n        use aws_smithy_runtime_api::client::result::ConnectorError;\n        use aws_smithy_types::error::display::DisplayErrorContext;\n        use hyper_0_14::client::connect::{Connected, Connection};\n        use std::future::Future;\n        use std::pin::Pin;\n        use std::task::{Context, Poll};\n        use std::time::Duration;\n        use tokio::io::ReadBuf;\n        use tokio::io::{AsyncRead, AsyncWrite};\n        use tokio::net::TcpStream;\n\n        #[allow(unused)]\n        fn connect_timeout_is_correct<T: Send + Sync + Clone + 'static>() {\n            is_send_sync::<super::ConnectTimeout<T>>();\n        }\n\n        #[allow(unused)]\n        fn is_send_sync<T: Send + Sync>() {}\n\n        /// A service that will never return whatever it is you want\n        ///\n        /// Returned futures will return Pending forever\n        #[non_exhaustive]\n        #[derive(Clone, Default, Debug)]\n        pub(crate) struct NeverConnects;\n        impl hyper_0_14::service::Service<http_02x::Uri> for NeverConnects {\n            type Response = TcpStream;\n            type Error = ConnectorError;\n            type Future = Pin<Box<dyn Future<Output = Result<Self::Response, Self::Error>> + Send>>;\n\n            fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {\n                Poll::Ready(Ok(()))\n            }\n\n            fn call(&mut self, _uri: http_02x::Uri) -> Self::Future {\n                Box::pin(async move {\n                    Never::new().await;\n                    unreachable!()\n                })\n            }\n        }\n\n        /// A service that will connect but never send any data\n        #[derive(Clone, Debug, Default)]\n        struct NeverReplies;\n        impl hyper_0_14::service::Service<http_02x::Uri> for NeverReplies {\n            type Response = EmptyStream;\n            type Error = BoxError;\n            type Future = std::future::Ready<Result<Self::Response, Self::Error>>;\n\n            fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {\n                Poll::Ready(Ok(()))\n            }\n\n            fn call(&mut self, _req: http_02x::Uri) -> Self::Future {\n                std::future::ready(Ok(EmptyStream))\n            }\n        }\n\n        /// A stream that will never return or accept any data\n        #[non_exhaustive]\n        #[derive(Debug, Default)]\n        struct EmptyStream;\n        impl AsyncRead for EmptyStream {\n            fn poll_read(\n                self: Pin<&mut Self>,\n                _cx: &mut Context<'_>,\n                _buf: &mut ReadBuf<'_>,\n            ) -> Poll<std::io::Result<()>> {\n                Poll::Pending\n            }\n        }\n        impl AsyncWrite for EmptyStream {\n            fn poll_write(\n                self: Pin<&mut Self>,\n                _cx: &mut Context<'_>,\n                _buf: &[u8],\n            ) -> Poll<Result<usize, std::io::Error>> {\n                Poll::Pending\n            }\n\n            fn poll_flush(\n                self: Pin<&mut Self>,\n                _cx: &mut Context<'_>,\n            ) -> Poll<Result<(), std::io::Error>> {\n                Poll::Pending\n            }\n\n            fn poll_shutdown(\n                self: Pin<&mut Self>,\n                _cx: &mut Context<'_>,\n            ) -> Poll<Result<(), std::io::Error>> {\n                Poll::Pending\n            }\n        }\n        impl Connection for EmptyStream {\n            fn connected(&self) -> Connected {\n                Connected::new()\n            }\n        }\n\n        #[tokio::test]\n        async fn http_connect_timeout_works() {\n            let tcp_connector = NeverConnects::default();\n            let connector_settings = HttpConnectorSettings::builder()\n                .connect_timeout(Duration::from_secs(1))\n                .build();\n            let hyper = HyperConnector::builder()\n                .connector_settings(connector_settings)\n                .sleep_impl(SharedAsyncSleep::new(TokioSleep::new()))\n                .build(tcp_connector)\n                .adapter;\n            let now = tokio::time::Instant::now();\n            tokio::time::pause();\n            let resp = hyper\n                .call(HttpRequest::get(\"https://static-uri.com\").unwrap())\n                .await\n                .unwrap_err();\n            assert!(\n                resp.is_timeout(),\n                \"expected resp.is_timeout() to be true but it was false, resp == {:?}\",\n                resp\n            );\n            let message = DisplayErrorContext(&resp).to_string();\n            let expected =\n                \"timeout: error trying to connect: HTTP connect timeout occurred after 1s\";\n            assert!(\n                message.contains(expected),\n                \"expected '{message}' to contain '{expected}'\"\n            );\n            assert_elapsed!(now, Duration::from_secs(1));\n        }\n\n        #[tokio::test]\n        async fn http_read_timeout_works() {\n            let tcp_connector = NeverReplies;\n            let connector_settings = HttpConnectorSettings::builder()\n                .connect_timeout(Duration::from_secs(1))\n                .read_timeout(Duration::from_secs(2))\n                .build();\n            let hyper = HyperConnector::builder()\n                .connector_settings(connector_settings)\n                .sleep_impl(SharedAsyncSleep::new(TokioSleep::new()))\n                .build(tcp_connector)\n                .adapter;\n            let now = tokio::time::Instant::now();\n            tokio::time::pause();\n            let err = hyper\n                .call(HttpRequest::get(\"https://fake-uri.com\").unwrap())\n                .await\n                .unwrap_err();\n            assert!(\n                err.is_timeout(),\n                \"expected err.is_timeout() to be true but it was false, err == {err:?}\",\n            );\n            let message = format!(\"{}\", DisplayErrorContext(&err));\n            let expected = \"timeout: HTTP read timeout occurred after 2s\";\n            assert!(\n                message.contains(expected),\n                \"expected '{message}' to contain '{expected}'\"\n            );\n            assert_elapsed!(now, Duration::from_secs(2));\n        }\n    }\n}\n\n#[cfg(test)]\nmod test {\n    use crate::hyper_legacy::timeout_middleware::test::NeverConnects;\n    use crate::hyper_legacy::{HyperClientBuilder, HyperConnector};\n    use aws_smithy_async::time::SystemTimeSource;\n    use aws_smithy_runtime_api::box_error::BoxError;\n    use aws_smithy_runtime_api::client::http::{HttpClient, HttpConnectorSettings};\n    use aws_smithy_runtime_api::client::orchestrator::HttpRequest;\n    use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder;\n    use hyper_0_14::client::connect::{Connected, Connection};\n    use std::io::{Error, ErrorKind};\n    use std::pin::Pin;\n    use std::sync::atomic::{AtomicU32, Ordering};\n    use std::sync::Arc;\n    use std::task::{Context, Poll};\n    use std::time::Duration;\n    use tokio::io::{AsyncRead, AsyncWrite, ReadBuf};\n\n    #[tokio::test]\n    async fn connector_selection() {\n        // Create a client that increments a count every time it creates a new HyperConnector\n        let creation_count = Arc::new(AtomicU32::new(0));\n        let http_client = HyperClientBuilder::new().build_with_fn({\n            let count = creation_count.clone();\n            move || {\n                count.fetch_add(1, Ordering::Relaxed);\n                NeverConnects::default()\n            }\n        });\n\n        // This configuration should result in 4 separate connectors with different timeout settings\n        let settings = [\n            HttpConnectorSettings::builder()\n                .connect_timeout(Duration::from_secs(3))\n                .build(),\n            HttpConnectorSettings::builder()\n                .read_timeout(Duration::from_secs(3))\n                .build(),\n            HttpConnectorSettings::builder()\n                .connect_timeout(Duration::from_secs(3))\n                .read_timeout(Duration::from_secs(3))\n                .build(),\n            HttpConnectorSettings::builder()\n                .connect_timeout(Duration::from_secs(5))\n                .read_timeout(Duration::from_secs(3))\n                .build(),\n        ];\n\n        // Kick off thousands of parallel tasks that will try to create a connector\n        let components = RuntimeComponentsBuilder::for_tests()\n            .with_time_source(Some(SystemTimeSource::new()))\n            .build()\n            .unwrap();\n        let mut handles = Vec::new();\n        for setting in &settings {\n            for _ in 0..1000 {\n                let client = http_client.clone();\n                handles.push(tokio::spawn({\n                    let setting = setting.clone();\n                    let components = components.clone();\n                    async move {\n                        let _ = client.http_connector(&setting, &components);\n                    }\n                }));\n            }\n        }\n        for handle in handles {\n            handle.await.unwrap();\n        }\n\n        // Verify only 4 connectors were created amidst the chaos\n        assert_eq!(4, creation_count.load(Ordering::Relaxed));\n    }\n\n    #[tokio::test]\n    async fn hyper_io_error() {\n        let connector = TestConnection {\n            inner: HangupStream,\n        };\n        let adapter = HyperConnector::builder().build(connector).adapter;\n        let err = adapter\n            .call(HttpRequest::get(\"https://socket-hangup.com\").unwrap())\n            .await\n            .expect_err(\"socket hangup\");\n        assert!(err.is_io(), \"{:?}\", err);\n    }\n\n    // ---- machinery to make a Hyper connector that responds with an IO Error\n    #[derive(Clone)]\n    struct HangupStream;\n\n    impl Connection for HangupStream {\n        fn connected(&self) -> Connected {\n            Connected::new()\n        }\n    }\n\n    impl AsyncRead for HangupStream {\n        fn poll_read(\n            self: Pin<&mut Self>,\n            _cx: &mut Context<'_>,\n            _buf: &mut ReadBuf<'_>,\n        ) -> Poll<std::io::Result<()>> {\n            Poll::Ready(Err(Error::new(\n                ErrorKind::ConnectionReset,\n                \"connection reset\",\n            )))\n        }\n    }\n\n    impl AsyncWrite for HangupStream {\n        fn poll_write(\n            self: Pin<&mut Self>,\n            _cx: &mut Context<'_>,\n            _buf: &[u8],\n        ) -> Poll<Result<usize, Error>> {\n            Poll::Pending\n        }\n\n        fn poll_flush(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll<Result<(), Error>> {\n            Poll::Pending\n        }\n\n        fn poll_shutdown(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll<Result<(), Error>> {\n            Poll::Pending\n        }\n    }\n\n    #[derive(Clone)]\n    struct TestConnection<T> {\n        inner: T,\n    }\n\n    impl<T> hyper_0_14::service::Service<http_02x::Uri> for TestConnection<T>\n    where\n        T: Clone + Connection,\n    {\n        type Response = T;\n        type Error = BoxError;\n        type Future = std::future::Ready<Result<Self::Response, Self::Error>>;\n\n        fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {\n            Poll::Ready(Ok(()))\n        }\n\n        fn call(&mut self, _req: http_02x::Uri) -> Self::Future {\n            std::future::ready(Ok(self.inner.clone()))\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-client/src/lib.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/* Automatically managed default lints */\n#![cfg_attr(docsrs, feature(doc_cfg))]\n/* End of automatically managed default lints */\n\n//! HTTP client implementation for smithy-rs generated code.\n//!\n//! # Crate Features\n//!\n//! - `default-client`: Enable default HTTP client implementation (based on hyper 1.x).\n//! - `rustls-ring`: Enable TLS provider based on `rustls` using `ring` as the crypto provider\n//! - `rustls-aws-lc`: Enable TLS provider based on `rustls` using `aws-lc` as the crypto provider\n//! - `rustls-aws-lc-fips`: Same as `rustls-aws-lc` feature but using a FIPS compliant version of `aws-lc`\n//! - `s2n-tls`: Enable TLS provider based on `s2n-tls` using `aws-lc` as the crypto provider.\n//! - `hyper-014`: (Deprecated) HTTP client implementation based on hyper-0.14.x.\n//! - `test-util`: Enables utilities for unit tests. DO NOT ENABLE IN PRODUCTION.\n\n#![warn(\n    missing_docs,\n    rustdoc::missing_crate_level_docs,\n    unreachable_pub,\n    rust_2018_idioms\n)]\n\n// ideally hyper_014 would just be exposed as is but due to\n// https://github.com/rust-lang/rust/issues/47238 we get clippy warnings we can't suppress\n#[cfg(feature = \"hyper-014\")]\npub(crate) mod hyper_legacy;\n\n/// Legacy HTTP and TLS connectors that use hyper 0.14.x and rustls.\n#[cfg(feature = \"hyper-014\")]\n#[deprecated = \"hyper 0.14.x support is deprecated, please migrate to 1.x client\"]\npub mod hyper_014 {\n    pub use crate::hyper_legacy::*;\n}\n\n/// Default HTTP and TLS connectors\n#[cfg(feature = \"default-client\")]\npub(crate) mod client;\n#[cfg(feature = \"default-client\")]\npub use client::{default_connector, proxy, tls, Builder, Connector, ConnectorBuilder};\n\n#[cfg(feature = \"test-util\")]\npub mod test_util;\n\nmod error;\npub use error::HttpClientError;\n\n#[allow(unused_macros, unused_imports)]\n#[macro_use]\npub(crate) mod cfg {\n    /// Any TLS provider enabled\n    macro_rules! cfg_tls {\n        ($($item:item)*) => {\n            $(\n                #[cfg(any(\n                    feature = \"rustls-aws-lc\",\n                    feature = \"rustls-aws-lc-fips\",\n                    feature = \"rustls-ring\",\n                    feature = \"s2n-tls\",\n                ))]\n                #[cfg_attr(docsrs, doc(cfg(any(\n                    feature = \"rustls-aws-lc\",\n                    feature = \"rustls-aws-lc-fips\",\n                    feature = \"rustls-ring\",\n                    feature = \"s2n-tls\",\n                ))))]\n                $item\n            )*\n        }\n    }\n\n    /// Any rustls provider enabled\n    macro_rules! cfg_rustls {\n        ($($item:item)*) => {\n            $(\n                #[cfg(any(\n                    feature = \"rustls-aws-lc\",\n                    feature = \"rustls-aws-lc-fips\",\n                    feature = \"rustls-ring\"\n                ))]\n                #[cfg_attr(docsrs, doc(cfg(any(feature = \"rustls-aws-lc\", feature = \"rustls-aws-lc-fips\", feature = \"rustls-ring\"))))]\n                $item\n            )*\n        }\n    }\n\n    macro_rules! cfg_s2n_tls {\n        ($($item:item)*) => {\n            $(\n                #[cfg(feature = \"s2n-tls\")]\n                #[cfg_attr(docsrs, doc(cfg(feature = \"s2n-tls\")))]\n                $item\n            )*\n        }\n    }\n\n    pub(crate) use cfg_rustls;\n    pub(crate) use cfg_s2n_tls;\n    pub(crate) use cfg_tls;\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-client/src/test_util/body.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_smithy_runtime_api::box_error::BoxError;\nuse aws_smithy_types::body::SdkBody;\nuse bytes::Bytes;\nuse http_body_1x::{Frame, SizeHint};\nuse pin_project_lite::pin_project;\nuse std::future::poll_fn;\nuse std::pin::{pin, Pin};\nuse std::task::{Context, Poll};\nuse tokio::sync::mpsc;\n\n/// Create a `SdkBody` with an associated sender half.\n///\n/// Useful for sending data from another thread/task and test scenarios.\npub(crate) fn channel_body() -> (Sender, SdkBody) {\n    let (tx, rx) = mpsc::channel(1);\n    let sender = Sender { tx };\n    let ch_body = ChannelBody { rx };\n    (sender, SdkBody::from_body_1_x(ch_body))\n}\n\n/// Sender half of channel based `SdkBody` implementation useful for testing.\n///\n/// Roughly a replacement for hyper 0.14.x `Sender` body.\n///\n/// ## Body Closing\n///\n/// The request body will always be closed normally when the sender is dropped. If you\n/// want to close the connection with an incomplete response, call [`Sender::abort()`] method to\n/// abort the body in an abnormal fashion.\n#[derive(Debug)]\npub(crate) struct Sender {\n    tx: mpsc::Sender<Result<Frame<Bytes>, BoxError>>,\n}\n\nimpl Sender {\n    /// Send data on data channel when it's ready\n    pub(crate) async fn send_data(&mut self, chunk: Bytes) -> Result<(), BoxError> {\n        let frame = Frame::data(chunk);\n        self.tx.send(Ok(frame)).await.map_err(|e| e.into())\n    }\n\n    // TODO(test-utils): we can add support for trailers if needed in the future\n\n    /// Abort the body in an abnormal fashion\n    pub(crate) fn abort(self) {\n        let _ = self.tx.clone().try_send(Err(\"body write aborted\".into()));\n    }\n}\n\npin_project! {\n    struct ChannelBody {\n        rx: mpsc::Receiver<Result<Frame<Bytes>, BoxError>>\n    }\n}\n\nimpl http_body_1x::Body for ChannelBody {\n    type Data = Bytes;\n    type Error = BoxError;\n\n    fn poll_frame(\n        self: Pin<&mut Self>,\n        cx: &mut Context<'_>,\n    ) -> Poll<Option<Result<Frame<Self::Data>, Self::Error>>> {\n        let this = self.project();\n        this.rx.poll_recv(cx)\n    }\n\n    fn is_end_stream(&self) -> bool {\n        self.rx.is_closed()\n    }\n\n    fn size_hint(&self) -> SizeHint {\n        SizeHint::default()\n    }\n}\n\npub(crate) async fn next_data_frame(body: &mut SdkBody) -> Option<Result<Bytes, BoxError>> {\n    use http_body_1x::Body;\n    let mut pinned = pin!(body);\n    match poll_fn(|cx| pinned.as_mut().poll_frame(cx)).await? {\n        Ok(frame) => {\n            if frame.is_data() {\n                Some(Ok(frame.into_data().unwrap()))\n            } else {\n                None\n            }\n        }\n        Err(err) => Some(Err(err)),\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-client/src/test_util/capture_request.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_smithy_runtime_api::client::connector_metadata::ConnectorMetadata;\nuse aws_smithy_runtime_api::client::http::{\n    HttpClient, HttpConnector, HttpConnectorFuture, HttpConnectorSettings, SharedHttpConnector,\n};\nuse aws_smithy_runtime_api::client::orchestrator::{HttpRequest, HttpResponse};\nuse aws_smithy_runtime_api::client::runtime_components::RuntimeComponents;\nuse aws_smithy_runtime_api::http::HttpError;\nuse aws_smithy_runtime_api::shared::IntoShared;\nuse aws_smithy_types::body::SdkBody;\nuse std::fmt::Debug;\nuse std::sync::{Arc, Mutex};\nuse tokio::sync::oneshot;\n\n#[derive(Debug)]\nstruct Inner {\n    response: Option<HttpResponse>,\n    sender: Option<oneshot::Sender<HttpRequest>>,\n}\n\n/// Test Connection to capture a single request\n#[derive(Debug, Clone)]\npub struct CaptureRequestHandler(Arc<Mutex<Inner>>);\n\nimpl HttpConnector for CaptureRequestHandler {\n    fn call(&self, request: HttpRequest) -> HttpConnectorFuture {\n        let mut inner = self.0.lock().unwrap();\n        if let Err(_e) = inner.sender.take().expect(\"already sent\").send(request) {\n            tracing::trace!(\"The receiver was already dropped\");\n        }\n        HttpConnectorFuture::ready(Ok(inner\n            .response\n            .take()\n            .expect(\"could not handle second request\")))\n    }\n}\n\nimpl HttpClient for CaptureRequestHandler {\n    fn http_connector(\n        &self,\n        _: &HttpConnectorSettings,\n        _: &RuntimeComponents,\n    ) -> SharedHttpConnector {\n        self.clone().into_shared()\n    }\n\n    fn connector_metadata(&self) -> Option<ConnectorMetadata> {\n        Some(ConnectorMetadata::new(\"capture-request-handler\", None))\n    }\n}\n\n/// Receiver for [`CaptureRequestHandler`].\n#[derive(Debug)]\npub struct CaptureRequestReceiver {\n    receiver: oneshot::Receiver<HttpRequest>,\n}\n\nimpl CaptureRequestReceiver {\n    /// Expect that a request was sent. Returns the captured request.\n    ///\n    /// # Panics\n    /// If no request was received\n    #[track_caller]\n    pub fn expect_request(mut self) -> HttpRequest {\n        self.receiver.try_recv().expect(\"no request was received\")\n    }\n\n    /// Expect that no request was captured. Panics if a request was received.\n    ///\n    /// # Panics\n    /// If a request was received\n    #[track_caller]\n    pub fn expect_no_request(mut self) {\n        self.receiver\n            .try_recv()\n            .expect_err(\"expected no request to be received!\");\n    }\n}\n\n/// Test connection used to capture a single request\n///\n/// If response is `None`, it will reply with a 200 response with an empty body\n///\n/// Example:\n/// ```compile_fail\n/// let (capture_client, request) = capture_request(None);\n/// let conf = aws_sdk_sts::Config::builder()\n///     .http_client(capture_client)\n///     .build();\n/// let client = aws_sdk_sts::Client::from_conf(conf);\n/// let _ = client.assume_role_with_saml().send().await;\n/// // web identity should be unsigned\n/// assert_eq!(\n///     request.expect_request().headers().get(\"AUTHORIZATION\"),\n///     None\n/// );\n/// ```\npub fn capture_request(\n    response: Option<http_1x::Response<SdkBody>>,\n) -> (CaptureRequestHandler, CaptureRequestReceiver) {\n    capture_request_inner(response)\n}\n\nfn capture_request_inner(\n    response: Option<impl TryInto<HttpResponse, Error = HttpError>>,\n) -> (CaptureRequestHandler, CaptureRequestReceiver) {\n    let (tx, rx) = oneshot::channel();\n    let http_resp: HttpResponse = match response {\n        Some(resp) => resp.try_into().expect(\"valid HttpResponse\"),\n        None => http_1x::Response::builder()\n            .status(200)\n            .body(SdkBody::empty())\n            .expect(\"unreachable\")\n            .try_into()\n            .expect(\"unreachable\"),\n    };\n    (\n        CaptureRequestHandler(Arc::new(Mutex::new(Inner {\n            response: Some(http_resp),\n            sender: Some(tx),\n        }))),\n        CaptureRequestReceiver { receiver: rx },\n    )\n}\n\n#[allow(missing_docs)]\n#[cfg(feature = \"legacy-test-util\")]\npub fn legacy_capture_request(\n    response: Option<http_02x::Response<SdkBody>>,\n) -> (CaptureRequestHandler, CaptureRequestReceiver) {\n    capture_request_inner(response)\n}\n\n#[cfg(test)]\nmod test {\n    use aws_smithy_runtime_api::client::http::HttpConnector;\n    use aws_smithy_runtime_api::client::orchestrator::HttpRequest;\n    use aws_smithy_types::body::SdkBody;\n\n    #[cfg(feature = \"legacy-test-util\")]\n    #[tokio::test]\n    async fn test_can_plug_in_http_02x() {\n        use super::legacy_capture_request;\n        let (capture_client, _request) = legacy_capture_request(Some(\n            http_02x::Response::builder()\n                .status(202)\n                .body(SdkBody::empty())\n                .expect(\"unreachable\"),\n        ));\n\n        let resp = capture_client.call(HttpRequest::empty()).await.unwrap();\n        assert_eq!(202, resp.status().as_u16());\n    }\n\n    #[tokio::test]\n    async fn test_can_plug_in_http_1x() {\n        use super::capture_request;\n        let (capture_client, _request) = capture_request(Some(\n            http_1x::Response::builder()\n                .status(202)\n                .body(SdkBody::empty())\n                .expect(\"unreachable\"),\n        ));\n\n        let resp = capture_client.call(HttpRequest::empty()).await.unwrap();\n        assert_eq!(202, resp.status().as_u16());\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-client/src/test_util/dvr/record.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse super::{\n    Action, BodyData, ConnectionId, Direction, Error, Event, NetworkTraffic, Request, Response,\n    Version,\n};\nuse aws_smithy_runtime_api::client::connector_metadata::ConnectorMetadata;\nuse aws_smithy_runtime_api::client::http::{\n    HttpClient, HttpConnector, HttpConnectorFuture, HttpConnectorSettings, SharedHttpConnector,\n};\nuse aws_smithy_runtime_api::client::orchestrator::HttpRequest;\nuse aws_smithy_runtime_api::client::runtime_components::RuntimeComponents;\nuse aws_smithy_runtime_api::shared::IntoShared;\nuse aws_smithy_types::body::SdkBody;\nuse std::path::Path;\nuse std::sync::atomic::{AtomicUsize, Ordering};\nuse std::sync::{Arc, Mutex, MutexGuard};\nuse std::{fs, io};\nuse tokio::task::JoinHandle;\n\n/// Recording client\n///\n/// `RecordingClient` wraps an inner connection and records all traffic, enabling traffic replay.\n///\n/// # Example\n///\n/// ```rust,ignore\n/// use aws_smithy_async::rt::sleep::default_async_sleep;\n/// use aws_smithy_runtime::client::http::hyper_014::default_connector;\n/// use aws_smithy_http_client::test_util::dvr::RecordingClient;\n/// use aws_smithy_runtime_api::client::http::HttpConnectorSettingsBuilder;\n/// use aws_sdk_s3::{Client, Config};\n///\n/// #[tokio::test]\n/// async fn test_content_length_enforcement_is_not_applied_to_head_request() {\n///     let settings = HttpConnectorSettingsBuilder::default().build();\n///     let http_client = default_connector(&settings, default_async_sleep()).unwrap();\n///     let http_client = RecordingClient::new(http_client);\n///\n///     // Since we need to send a real request for this,\n///     // you'll need to use your real credentials.\n///     let config = aws_config::load_defaults(BehaviorVersion::latest()).await;\n///     let config = Config::from(&config).to_builder()\n///         .http_client(http_client.clone())\n///         .region(Region::new(\"us-east-1\"))\n///         .build();\n///\n///     let client = Client::from_conf(config);\n///     let _resp = client\n///         .head_object()\n///         .key(\"some-test-file.txt\")\n///         .bucket(\"your-test-bucket\")\n///         .send()\n///         .await\n///         .unwrap();\n///\n///     // If the request you want to record has a body, don't forget to poll\n///     // the body to completion BEFORE calling `dump_to_file`. Otherwise, your\n///     // test json won't include the body.\n///     // let _body = _resp.body.collect().await.unwrap();\n///\n///     // This path is relative to your project or workspace `Cargo.toml` file.\n///     http_client.dump_to_file(\"tests/data/content-length-enforcement/head-object.json\").unwrap();\n/// }\n/// ```\n#[derive(Clone, Debug)]\npub struct RecordingClient {\n    pub(crate) data: Arc<Mutex<Vec<Event>>>,\n    pub(crate) num_events: Arc<AtomicUsize>,\n    pub(crate) inner: SharedHttpConnector,\n}\n\n#[cfg(feature = \"legacy-rustls-ring\")]\nimpl RecordingClient {\n    /// Construct a recording connection wrapping a default HTTPS implementation without any timeouts.\n    pub fn https() -> Self {\n        #[allow(deprecated)]\n        use crate::hyper_014::HyperConnector;\n        Self {\n            data: Default::default(),\n            num_events: Arc::new(AtomicUsize::new(0)),\n            #[allow(deprecated)]\n            inner: SharedHttpConnector::new(HyperConnector::builder().build_https()),\n        }\n    }\n}\n\nimpl RecordingClient {\n    /// Create a new recording connection from a connection\n    pub fn new(underlying_connector: impl HttpConnector + 'static) -> Self {\n        Self {\n            data: Default::default(),\n            num_events: Arc::new(AtomicUsize::new(0)),\n            inner: underlying_connector.into_shared(),\n        }\n    }\n\n    /// Return the traffic recorded by this connection\n    pub fn events(&self) -> MutexGuard<'_, Vec<Event>> {\n        self.data.lock().unwrap()\n    }\n\n    /// NetworkTraffic struct suitable for serialization\n    pub fn network_traffic(&self) -> NetworkTraffic {\n        NetworkTraffic {\n            events: self.events().clone(),\n            docs: Some(\"todo docs\".into()),\n            version: Version::V0,\n        }\n    }\n\n    /// Dump the network traffic to a file\n    pub fn dump_to_file(&self, path: impl AsRef<Path>) -> Result<(), io::Error> {\n        fs::write(\n            path,\n            serde_json::to_string(&self.network_traffic()).unwrap(),\n        )\n    }\n\n    fn next_id(&self) -> ConnectionId {\n        ConnectionId(self.num_events.fetch_add(1, Ordering::Relaxed))\n    }\n}\n\nfn record_body(\n    body: &mut SdkBody,\n    event_id: ConnectionId,\n    direction: Direction,\n    event_bus: Arc<Mutex<Vec<Event>>>,\n) -> JoinHandle<()> {\n    let (sender, output_body) = crate::test_util::body::channel_body();\n    let real_body = std::mem::replace(body, output_body);\n    tokio::spawn(async move {\n        let mut real_body = real_body;\n        let mut sender = sender;\n        loop {\n            let data = crate::test_util::body::next_data_frame(&mut real_body).await;\n            match data {\n                Some(Ok(data)) => {\n                    event_bus.lock().unwrap().push(Event {\n                        connection_id: event_id,\n                        action: Action::Data {\n                            data: BodyData::from(data.clone()),\n                            direction,\n                        },\n                    });\n                    // This happens if the real connection is closed during recording.\n                    // Need to think more carefully if this is the correct thing to log in this\n                    // case.\n                    if sender.send_data(data).await.is_err() {\n                        event_bus.lock().unwrap().push(Event {\n                            connection_id: event_id,\n                            action: Action::Eof {\n                                direction: direction.opposite(),\n                                ok: false,\n                            },\n                        })\n                    };\n                }\n                None => {\n                    event_bus.lock().unwrap().push(Event {\n                        connection_id: event_id,\n                        action: Action::Eof {\n                            ok: true,\n                            direction,\n                        },\n                    });\n                    drop(sender);\n                    break;\n                }\n                Some(Err(_err)) => {\n                    event_bus.lock().unwrap().push(Event {\n                        connection_id: event_id,\n                        action: Action::Eof {\n                            ok: false,\n                            direction,\n                        },\n                    });\n                    sender.abort();\n                    break;\n                }\n            }\n        }\n    })\n}\n\nimpl HttpConnector for RecordingClient {\n    fn call(&self, mut request: HttpRequest) -> HttpConnectorFuture {\n        let event_id = self.next_id();\n        // A request has three phases:\n        // 1. A \"Request\" phase. This is initial HTTP request, headers, & URI\n        // 2. A body phase. This may contain multiple data segments.\n        // 3. A finalization phase. An EOF of some sort is sent on the body to indicate that\n        // the channel should be closed.\n\n        // Phase 1: the initial http request\n        self.data.lock().unwrap().push(Event {\n            connection_id: event_id,\n            action: Action::Request {\n                request: Request::from(&request),\n            },\n        });\n\n        // Phase 2: Swap out the real request body for one that will log all traffic that passes\n        // through it\n        // This will also handle phase three when the request body runs out of data.\n        record_body(\n            request.body_mut(),\n            event_id,\n            Direction::Request,\n            self.data.clone(),\n        );\n        let events = self.data.clone();\n        // create a channel we'll use to stream the data while reading it\n        let resp_fut = self.inner.call(request);\n        let fut = async move {\n            let resp = resp_fut.await;\n            match resp {\n                Ok(mut resp) => {\n                    // push the initial response event\n                    events.lock().unwrap().push(Event {\n                        connection_id: event_id,\n                        action: Action::Response {\n                            response: Ok(Response::from(&resp)),\n                        },\n                    });\n\n                    // instrument the body and record traffic\n                    record_body(resp.body_mut(), event_id, Direction::Response, events);\n                    Ok(resp)\n                }\n                Err(e) => {\n                    events.lock().unwrap().push(Event {\n                        connection_id: event_id,\n                        action: Action::Response {\n                            response: Err(Error(format!(\"{}\", &e))),\n                        },\n                    });\n                    Err(e)\n                }\n            }\n        };\n        HttpConnectorFuture::new(fut)\n    }\n}\n\nimpl HttpClient for RecordingClient {\n    fn http_connector(\n        &self,\n        _: &HttpConnectorSettings,\n        _: &RuntimeComponents,\n    ) -> SharedHttpConnector {\n        self.clone().into_shared()\n    }\n\n    fn connector_metadata(&self) -> Option<ConnectorMetadata> {\n        Some(ConnectorMetadata::new(\"recording-client\", None))\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-client/src/test_util/dvr/replay.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse super::{Action, ConnectionId, Direction, Event, NetworkTraffic};\nuse crate::test_util::replay::DEFAULT_RELAXED_HEADERS;\nuse aws_smithy_protocol_test::MediaType;\nuse aws_smithy_runtime_api::client::connector_metadata::ConnectorMetadata;\nuse aws_smithy_runtime_api::client::http::{\n    HttpClient, HttpConnector, HttpConnectorFuture, HttpConnectorSettings, SharedHttpConnector,\n};\nuse aws_smithy_runtime_api::client::orchestrator::{HttpRequest, HttpResponse};\nuse aws_smithy_runtime_api::client::result::ConnectorError;\nuse aws_smithy_runtime_api::client::runtime_components::RuntimeComponents;\nuse aws_smithy_runtime_api::shared::IntoShared;\nuse aws_smithy_types::body::SdkBody;\nuse aws_smithy_types::error::display::DisplayErrorContext;\nuse bytes::{Bytes, BytesMut};\nuse std::collections::{HashMap, VecDeque};\nuse std::error::Error;\nuse std::fmt;\nuse std::ops::DerefMut;\nuse std::path::Path;\nuse std::sync::atomic::{AtomicUsize, Ordering};\nuse std::sync::{Arc, Mutex};\nuse tokio::task::JoinHandle;\n\n/// Wrapper type to enable optionally waiting for a future to complete\n#[derive(Debug)]\nenum Waitable<T> {\n    Loading(JoinHandle<T>),\n    Value(T),\n}\n\nimpl<T> Waitable<T> {\n    /// Consumes the future and returns the value\n    async fn take(self) -> T {\n        match self {\n            Waitable::Loading(f) => f.await.expect(\"join failed\"),\n            Waitable::Value(value) => value,\n        }\n    }\n\n    /// Waits for the future to be ready\n    async fn wait(&mut self) {\n        match self {\n            Waitable::Loading(f) => *self = Waitable::Value(f.await.expect(\"join failed\")),\n            Waitable::Value(_) => {}\n        }\n    }\n}\n\n/// Replay traffic recorded by a [`RecordingClient`](super::RecordingClient)\n#[derive(Clone)]\npub struct ReplayingClient {\n    live_events: Arc<Mutex<HashMap<ConnectionId, VecDeque<Event>>>>,\n    verifiable_events: Arc<HashMap<ConnectionId, http_1x::Request<Bytes>>>,\n    num_events: Arc<AtomicUsize>,\n    recorded_requests: Arc<Mutex<HashMap<ConnectionId, Waitable<http_1x::Request<Bytes>>>>>,\n}\n\n// Ideally, this would just derive Debug, but that makes the tests in aws-config think they found AWS secrets\n// when really it's just the test response data they're seeing from the Debug impl of this client.\n// This is just a quick workaround. A better fix can be considered later.\nimpl fmt::Debug for ReplayingClient {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        f.write_str(\"test_util::dvr::ReplayingClient\")\n    }\n}\n\nenum HeadersToCheck<'a> {\n    Include(&'a [&'a str]),\n    Exclude(Option<&'a [&'a str]>),\n}\n\nimpl ReplayingClient {\n    fn next_id(&self) -> ConnectionId {\n        ConnectionId(self.num_events.fetch_add(1, Ordering::Relaxed))\n    }\n\n    /// Validate all headers and bodies\n    pub async fn full_validate(self, media_type: &str) -> Result<(), Box<dyn Error>> {\n        self.validate_body_and_headers(None, media_type).await\n    }\n\n    /// Convenience method to validate that the bodies match, using a given [`MediaType`] for\n    /// comparison, and that the headers are also match excluding the default relaxed headers\n    ///\n    /// The current default relaxed headers:\n    /// - x-amz-user-agent\n    /// - authorization\n    pub async fn relaxed_validate(self, media_type: &str) -> Result<(), Box<dyn Error>> {\n        self.validate_body_and_headers_except(DEFAULT_RELAXED_HEADERS, media_type)\n            .await\n    }\n\n    /// Validate actual requests against expected requests\n    pub async fn validate(\n        self,\n        checked_headers: &[&str],\n        body_comparer: impl Fn(&[u8], &[u8]) -> Result<(), Box<dyn Error>>,\n    ) -> Result<(), Box<dyn Error>> {\n        self.validate_base(HeadersToCheck::Include(checked_headers), body_comparer)\n            .await\n    }\n\n    /// Validate that the bodies match, using a given [`MediaType`] for comparison\n    ///\n    /// The specified headers are also validated. If `checked_headers` is a `None`, it means\n    /// checking all headers.\n    pub async fn validate_body_and_headers(\n        self,\n        checked_headers: Option<&[&str]>,\n        media_type: &str,\n    ) -> Result<(), Box<dyn Error>> {\n        let headers_to_check = match checked_headers {\n            Some(headers) => HeadersToCheck::Include(headers),\n            None => HeadersToCheck::Exclude(None),\n        };\n        self.validate_base(headers_to_check, |b1, b2| {\n            aws_smithy_protocol_test::validate_body(\n                b1,\n                std::str::from_utf8(b2).unwrap(),\n                MediaType::from(media_type),\n            )\n            .map_err(|e| Box::new(e) as _)\n        })\n        .await\n    }\n\n    /// Validate that the bodies match, using a given [`MediaType`] for comparison\n    ///\n    /// The headers are also validated unless listed in `excluded_headers`\n    pub async fn validate_body_and_headers_except(\n        self,\n        excluded_headers: &[&str],\n        media_type: &str,\n    ) -> Result<(), Box<dyn Error>> {\n        self.validate_base(HeadersToCheck::Exclude(Some(excluded_headers)), |b1, b2| {\n            aws_smithy_protocol_test::validate_body(\n                b1,\n                std::str::from_utf8(b2).unwrap(),\n                MediaType::from(media_type),\n            )\n            .map_err(|e| Box::new(e) as _)\n        })\n        .await\n    }\n\n    async fn validate_base(\n        self,\n        checked_headers: HeadersToCheck<'_>,\n        body_comparer: impl Fn(&[u8], &[u8]) -> Result<(), Box<dyn Error>>,\n    ) -> Result<(), Box<dyn Error>> {\n        let mut actual_requests =\n            std::mem::take(self.recorded_requests.lock().unwrap().deref_mut());\n        for conn_id in 0..self.verifiable_events.len() {\n            let conn_id = ConnectionId(conn_id);\n            let expected = self.verifiable_events.get(&conn_id).unwrap();\n            let actual = actual_requests\n                .remove(&conn_id)\n                .ok_or(format!(\n                    \"expected connection {conn_id:?} but request was never sent\"\n                ))?\n                .take()\n                .await;\n            body_comparer(expected.body().as_ref(), actual.body().as_ref())?;\n            let actual: HttpRequest = actual.map(SdkBody::from).try_into()?;\n            aws_smithy_protocol_test::assert_uris_match(expected.uri().to_string(), actual.uri());\n            let expected_headers = expected\n                .headers()\n                .keys()\n                .map(|k| k.as_str())\n                .filter(|k| match checked_headers {\n                    HeadersToCheck::Include(headers) => headers.contains(k),\n                    HeadersToCheck::Exclude(excluded) => match excluded {\n                        Some(headers) => !headers.contains(k),\n                        None => true,\n                    },\n                })\n                .flat_map(|key| {\n                    let _ = expected.headers().get(key)?;\n                    Some((\n                        key,\n                        expected\n                            .headers()\n                            .get_all(key)\n                            .iter()\n                            .map(|h| h.to_str().unwrap())\n                            .collect::<Vec<_>>()\n                            .join(\", \"),\n                    ))\n                })\n                .collect::<Vec<_>>();\n            aws_smithy_protocol_test::validate_headers(actual.headers(), expected_headers)\n                .map_err(|err| {\n                    format!(\n                        \"event {} validation failed with: {}\",\n                        conn_id.0,\n                        DisplayErrorContext(&err)\n                    )\n                })?;\n        }\n        Ok(())\n    }\n\n    /// Return all the recorded requests for further analysis\n    #[cfg(feature = \"legacy-test-util\")]\n    pub async fn take_requests(self) -> Vec<http_02x::Request<Bytes>> {\n        let mut recorded_requests =\n            std::mem::take(self.recorded_requests.lock().unwrap().deref_mut());\n        let mut out = Vec::with_capacity(recorded_requests.len());\n        for conn_id in 0..recorded_requests.len() {\n            out.push(\n                recorded_requests\n                    .remove(&ConnectionId(conn_id))\n                    .expect(\"should exist\")\n                    .take()\n                    .await,\n            )\n        }\n        out.into_iter()\n            .map(|v1r| {\n                let mut builder = http_02x::Request::builder()\n                    .uri(v1r.uri().to_string())\n                    .method(v1r.method().as_str());\n                for (k, v) in v1r.headers().iter() {\n                    builder = builder.header(k.as_str(), v.as_bytes())\n                }\n                builder.body(v1r.into_body()).expect(\"valid conversion\")\n            })\n            .collect()\n    }\n\n    /// Build a replay connection from a JSON file\n    pub fn from_file(path: impl AsRef<Path>) -> Result<Self, Box<dyn Error>> {\n        let events: NetworkTraffic =\n            serde_json::from_str(&std::fs::read_to_string(path.as_ref())?)?;\n        Ok(Self::new(events.events))\n    }\n\n    /// Build a replay connection from a sequence of events\n    pub fn new(events: Vec<Event>) -> Self {\n        let mut event_map: HashMap<_, VecDeque<_>> = HashMap::new();\n        for event in events {\n            let event_buffer = event_map.entry(event.connection_id).or_default();\n            event_buffer.push_back(event);\n        }\n        let verifiable_events = event_map\n            .iter()\n            .map(|(id, events)| {\n                let mut body = BytesMut::new();\n                for event in events {\n                    if let Action::Data {\n                        direction: Direction::Request,\n                        data,\n                    } = &event.action\n                    {\n                        body.extend_from_slice(&data.copy_to_vec());\n                    }\n                }\n                let initial_request = events.iter().next().expect(\"must have one event\");\n                let request = match &initial_request.action {\n                    Action::Request { request } => {\n                        http_1x::Request::from(request).map(|_| Bytes::from(body))\n                    }\n                    _ => panic!(\"invalid first event\"),\n                };\n                (*id, request)\n            })\n            .collect();\n        let verifiable_events = Arc::new(verifiable_events);\n\n        ReplayingClient {\n            live_events: Arc::new(Mutex::new(event_map)),\n            num_events: Arc::new(AtomicUsize::new(0)),\n            recorded_requests: Default::default(),\n            verifiable_events,\n        }\n    }\n}\n\nasync fn replay_body(events: VecDeque<Event>, mut sender: crate::test_util::body::Sender) {\n    for event in events {\n        match event.action {\n            Action::Request { .. } => panic!(),\n            Action::Response { .. } => panic!(),\n            Action::Data {\n                data,\n                direction: Direction::Response,\n            } => {\n                sender\n                    .send_data(Bytes::from(data.into_bytes()))\n                    .await\n                    .expect(\"this is in memory traffic that should not fail to send\");\n            }\n            Action::Data {\n                data: _data,\n                direction: Direction::Request,\n            } => {}\n            Action::Eof {\n                direction: Direction::Request,\n                ..\n            } => {}\n            Action::Eof {\n                direction: Direction::Response,\n                ok: true,\n                ..\n            } => {\n                drop(sender);\n                break;\n            }\n            Action::Eof {\n                direction: Direction::Response,\n                ok: false,\n                ..\n            } => {\n                sender.abort();\n                break;\n            }\n        }\n    }\n}\n\nimpl HttpConnector for ReplayingClient {\n    fn call(&self, mut request: HttpRequest) -> HttpConnectorFuture {\n        let event_id = self.next_id();\n        tracing::debug!(\"received event {}: {request:?}\", event_id.0);\n        let mut events = match self.live_events.lock().unwrap().remove(&event_id) {\n            Some(traffic) => traffic,\n            None => {\n                return HttpConnectorFuture::ready(Err(ConnectorError::other(\n                    format!(\"no data for event {}. request: {:?}\", event_id.0, request).into(),\n                    None,\n                )));\n            }\n        };\n\n        let _initial_request = events.pop_front().unwrap();\n        let (sender, body) = crate::test_util::body::channel_body();\n        let recording = self.recorded_requests.clone();\n        let recorded_request = tokio::spawn(async move {\n            let mut data_read = vec![];\n            while let Some(data) = crate::test_util::body::next_data_frame(request.body_mut()).await\n            {\n                data_read\n                    .extend_from_slice(data.expect(\"in memory request should not fail\").as_ref())\n            }\n            request\n                .try_into_http1x()\n                .unwrap()\n                .map(|_body| Bytes::from(data_read))\n        });\n        let mut recorded_request = Waitable::Loading(recorded_request);\n        let fut = async move {\n            let resp: Result<_, ConnectorError> = loop {\n                let event = events\n                    .pop_front()\n                    .expect(\"no events, needed a response event\");\n                match event.action {\n                    // to ensure deterministic behavior if the request EOF happens first in the log,\n                    // wait for the request body to be done before returning a response.\n                    Action::Eof {\n                        direction: Direction::Request,\n                        ..\n                    } => {\n                        recorded_request.wait().await;\n                    }\n                    Action::Request { .. } => panic!(\"invalid\"),\n                    Action::Response {\n                        response: Err(error),\n                    } => break Err(ConnectorError::other(error.0.into(), None)),\n                    Action::Response {\n                        response: Ok(response),\n                    } => {\n                        let mut builder = http_1x::Response::builder().status(response.status);\n                        for (name, values) in response.headers {\n                            for value in values {\n                                builder = builder.header(&name, &value);\n                            }\n                        }\n                        tokio::spawn(async move {\n                            replay_body(events, sender).await;\n                            // insert the finalized body into\n                        });\n                        break Ok(HttpResponse::try_from(\n                            builder.body(body).expect(\"valid builder\"),\n                        )\n                        .unwrap());\n                    }\n\n                    Action::Data {\n                        direction: Direction::Request,\n                        data: _data,\n                    } => {\n                        tracing::info!(\"get request data\");\n                    }\n                    Action::Eof {\n                        direction: Direction::Response,\n                        ..\n                    } => panic!(\"got eof before response\"),\n\n                    Action::Data {\n                        data: _,\n                        direction: Direction::Response,\n                    } => panic!(\"got response data before response\"),\n                }\n            };\n            recording.lock().unwrap().insert(event_id, recorded_request);\n            resp\n        };\n        HttpConnectorFuture::new(fut)\n    }\n}\n\nimpl HttpClient for ReplayingClient {\n    fn http_connector(\n        &self,\n        _: &HttpConnectorSettings,\n        _: &RuntimeComponents,\n    ) -> SharedHttpConnector {\n        self.clone().into_shared()\n    }\n\n    fn connector_metadata(&self) -> Option<ConnectorMetadata> {\n        Some(ConnectorMetadata::new(\"replaying-client\", None))\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-client/src/test_util/dvr.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Extremely Experimental Test Connection\n//!\n//! Warning: Extremely experimental, API likely to change.\n//!\n//! DVR is an extremely experimental record & replay framework that supports multi-frame HTTP request / response traffic.\n\nuse aws_smithy_runtime_api::client::orchestrator::{HttpRequest, HttpResponse};\nuse aws_smithy_runtime_api::http::Headers;\nuse aws_smithy_types::base64;\nuse bytes::Bytes;\nuse indexmap::IndexMap;\nuse serde::{Deserialize, Serialize};\nuse std::collections::HashMap;\nuse std::path::Path;\n\nmod record;\nmod replay;\n\npub use record::RecordingClient;\npub use replay::ReplayingClient;\n\n/// A complete traffic recording\n///\n/// A traffic recording can be replayed with [`RecordingClient`].\n#[derive(Debug, Serialize, Deserialize)]\npub struct NetworkTraffic {\n    events: Vec<Event>,\n    docs: Option<String>,\n    version: Version,\n}\n\nimpl NetworkTraffic {\n    /// Network events\n    pub fn events(&self) -> &Vec<Event> {\n        &self.events\n    }\n\n    /// Create a NetworkTraffic instance from a file\n    pub fn from_file(path: impl AsRef<Path>) -> Result<Self, Box<dyn std::error::Error>> {\n        let contents = std::fs::read_to_string(path)?;\n        Ok(serde_json::from_str(&contents)?)\n    }\n\n    /// Create a NetworkTraffic instance from a file\n    pub fn write_to_file(&self, path: impl AsRef<Path>) -> Result<(), Box<dyn std::error::Error>> {\n        let serialized = serde_json::to_string_pretty(&self)?;\n        Ok(std::fs::write(path, serialized)?)\n    }\n\n    /// Update the network traffic with all `content-length` fields fixed to match the contents\n    pub fn correct_content_lengths(&mut self) {\n        let mut content_lengths: HashMap<(ConnectionId, Direction), usize> = HashMap::new();\n        for event in &self.events {\n            if let Action::Data { data, direction } = &event.action {\n                let entry = content_lengths.entry((event.connection_id, *direction));\n                *entry.or_default() += data.copy_to_vec().len();\n            }\n        }\n        for event in &mut self.events {\n            let (headers, direction) = match &mut event.action {\n                Action::Request {\n                    request: Request { headers, .. },\n                } => (headers, Direction::Request),\n                Action::Response {\n                    response: Ok(Response { headers, .. }),\n                } => (headers, Direction::Response),\n                _ => continue,\n            };\n            let Some(computed_content_length) =\n                content_lengths.get(&(event.connection_id, direction))\n            else {\n                continue;\n            };\n            if headers.contains_key(\"content-length\") {\n                headers.insert(\n                    \"content-length\".to_string(),\n                    vec![computed_content_length.to_string()],\n                );\n            }\n        }\n    }\n}\n\n/// Serialization version of DVR data\n#[derive(Copy, Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]\npub enum Version {\n    /// Initial network traffic version\n    V0,\n}\n\n/// A network traffic recording may contain multiple different connections occurring simultaneously\n#[derive(Copy, Clone, Debug, Serialize, Deserialize, Hash, PartialEq, Eq)]\npub struct ConnectionId(usize);\n\n/// A network event\n///\n/// Network events consist of a connection identifier and an action. An event is sufficient to\n/// reproduce traffic later during replay\n#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq)]\npub struct Event {\n    connection_id: ConnectionId,\n    action: Action,\n}\n\n/// An initial HTTP request, roughly equivalent to `http::Request<()>`\n///\n/// The initial request phase of an HTTP request. The body will be\n/// sent later as a separate action.\n#[derive(Debug, Serialize, Deserialize, Clone, Eq, PartialEq)]\npub struct Request {\n    uri: String,\n    headers: IndexMap<String, Vec<String>>,\n    method: String,\n}\n\n/// An initial HTTP response roughly equivalent to `http::Response<()>`\n///\n/// The initial response phase of an HTTP request. The body will be\n/// sent later as a separate action.\n#[derive(Debug, Serialize, Deserialize, Clone, Eq, PartialEq)]\npub struct Response {\n    status: u16,\n    headers: IndexMap<String, Vec<String>>,\n}\n\n#[cfg(feature = \"legacy-test-util\")]\nimpl From<&Request> for http_02x::Request<()> {\n    fn from(request: &Request) -> Self {\n        let mut builder = http_02x::Request::builder().uri(request.uri.as_str());\n        for (k, values) in request.headers.iter() {\n            for v in values {\n                builder = builder.header(k, v);\n            }\n        }\n        builder.method(request.method.as_str()).body(()).unwrap()\n    }\n}\n\nimpl From<&Request> for http_1x::Request<()> {\n    fn from(request: &Request) -> Self {\n        let mut builder = http_1x::Request::builder().uri(request.uri.as_str());\n        for (k, values) in request.headers.iter() {\n            for v in values {\n                builder = builder.header(k, v);\n            }\n        }\n        builder.method(request.method.as_str()).body(()).unwrap()\n    }\n}\n\nimpl<'a> From<&'a HttpRequest> for Request {\n    fn from(req: &'a HttpRequest) -> Self {\n        let uri = req.uri().to_string();\n        let headers = headers_to_map_http(req.headers());\n        let method = req.method().to_string();\n        Self {\n            uri,\n            headers,\n            method,\n        }\n    }\n}\n\nfn headers_to_map_http(headers: &Headers) -> IndexMap<String, Vec<String>> {\n    let mut out: IndexMap<_, Vec<_>> = IndexMap::new();\n    for (header_name, header_value) in headers.iter() {\n        let entry = out.entry(header_name.to_string()).or_default();\n        entry.push(header_value.to_string());\n    }\n    out\n}\n\nfn headers_to_map(headers: &Headers) -> IndexMap<String, Vec<String>> {\n    let mut out: IndexMap<_, Vec<_>> = IndexMap::new();\n    for (header_name, header_value) in headers.iter() {\n        let entry = out.entry(header_name.to_string()).or_default();\n        entry.push(\n            std::str::from_utf8(header_value.as_ref())\n                .unwrap()\n                .to_string(),\n        );\n    }\n    out\n}\n\n#[cfg(feature = \"legacy-test-util\")]\nfn headers_to_map_02x(headers: &http_02x::HeaderMap) -> IndexMap<String, Vec<String>> {\n    let mut out: IndexMap<_, Vec<_>> = IndexMap::new();\n    for (header_name, header_value) in headers.iter() {\n        let entry = out.entry(header_name.to_string()).or_default();\n        entry.push(\n            std::str::from_utf8(header_value.as_ref())\n                .unwrap()\n                .to_string(),\n        );\n    }\n    out\n}\n\n#[cfg(feature = \"legacy-test-util\")]\nimpl<'a, B> From<&'a http_02x::Response<B>> for Response {\n    fn from(resp: &'a http_02x::Response<B>) -> Self {\n        let status = resp.status().as_u16();\n        let headers = headers_to_map_02x(resp.headers());\n        Self { status, headers }\n    }\n}\n\nfn headers_to_map_1x(headers: &http_1x::HeaderMap) -> IndexMap<String, Vec<String>> {\n    let mut out: IndexMap<_, Vec<_>> = IndexMap::new();\n    for (header_name, header_value) in headers.iter() {\n        let entry = out.entry(header_name.to_string()).or_default();\n        entry.push(\n            std::str::from_utf8(header_value.as_ref())\n                .unwrap()\n                .to_string(),\n        );\n    }\n    out\n}\n\nimpl<'a, B> From<&'a http_1x::Response<B>> for Response {\n    fn from(resp: &'a http_1x::Response<B>) -> Self {\n        let status = resp.status().as_u16();\n        let headers = headers_to_map_1x(resp.headers());\n        Self { status, headers }\n    }\n}\n\nimpl From<&HttpResponse> for Response {\n    fn from(resp: &HttpResponse) -> Self {\n        Self {\n            status: resp.status().into(),\n            headers: headers_to_map(resp.headers()),\n        }\n    }\n}\n\n/// Error response wrapper\n#[derive(Debug, Serialize, Deserialize, Clone, Eq, PartialEq)]\npub struct Error(String);\n\n/// Network Action\n#[derive(Debug, Serialize, Deserialize, Clone, Eq, PartialEq)]\n#[non_exhaustive]\npub enum Action {\n    /// Initial HTTP Request\n    Request {\n        /// HTTP Request headers, method, and URI\n        request: Request,\n    },\n\n    /// Initial HTTP response or failure\n    Response {\n        /// HTTP response or failure\n        response: Result<Response, Error>,\n    },\n\n    /// Data segment\n    Data {\n        /// Body Data\n        data: BodyData,\n        /// Direction: request vs. response\n        direction: Direction,\n    },\n\n    /// End of data\n    Eof {\n        /// Succesful vs. failed termination\n        ok: bool,\n        /// Direction: request vs. response\n        direction: Direction,\n    },\n}\n\n/// Event direction\n///\n/// During replay, this is used to replay data in the right direction\n#[derive(Copy, Clone, Debug, Serialize, Deserialize, Eq, PartialEq, Hash)]\npub enum Direction {\n    /// Request phase\n    Request,\n    /// Response phase\n    Response,\n}\n\nimpl Direction {\n    /// The opposite of a given direction\n    pub fn opposite(self) -> Self {\n        match self {\n            Direction::Request => Direction::Response,\n            Direction::Response => Direction::Request,\n        }\n    }\n}\n\n/// HTTP Body Data Abstraction\n///\n/// When the data is a UTF-8 encoded string, it will be serialized as a string for readability.\n/// Otherwise, it will be base64 encoded.\n#[derive(Clone, Debug, Serialize, Deserialize, Eq, PartialEq)]\n#[non_exhaustive]\npub enum BodyData {\n    /// UTF-8 encoded data\n    Utf8(String),\n\n    /// Base64 encoded binary data\n    Base64(String),\n}\n\nimpl BodyData {\n    /// Convert [`BodyData`] into Bytes.\n    pub fn into_bytes(self) -> Vec<u8> {\n        match self {\n            BodyData::Utf8(string) => string.into_bytes(),\n            BodyData::Base64(string) => base64::decode(string).unwrap(),\n        }\n    }\n\n    /// Copy [`BodyData`] into a `Vec<u8>`.\n    pub fn copy_to_vec(&self) -> Vec<u8> {\n        match self {\n            BodyData::Utf8(string) => string.as_bytes().into(),\n            BodyData::Base64(string) => base64::decode(string).unwrap(),\n        }\n    }\n}\n\nimpl From<Bytes> for BodyData {\n    fn from(data: Bytes) -> Self {\n        match std::str::from_utf8(data.as_ref()) {\n            Ok(string) => BodyData::Utf8(string.to_string()),\n            Err(_) => BodyData::Base64(base64::encode(data)),\n        }\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n\n    use std::error::Error;\n    use std::fs;\n\n    use aws_smithy_runtime_api::client::http::HttpConnector;\n    use aws_smithy_runtime_api::client::http::SharedHttpConnector;\n    use aws_smithy_types::body::SdkBody;\n    use aws_smithy_types::byte_stream::ByteStream;\n\n    #[tokio::test]\n    async fn correctly_fixes_content_lengths() -> Result<(), Box<dyn Error>> {\n        let network_traffic = fs::read_to_string(\"test-data/example.com.json\")?;\n        let mut network_traffic: NetworkTraffic = serde_json::from_str(&network_traffic)?;\n        network_traffic.correct_content_lengths();\n        let Action::Request {\n            request: Request { headers, .. },\n        } = &network_traffic.events[0].action\n        else {\n            panic!(\"unexpected event\")\n        };\n        // content length is not added when it wasn't initially present\n        assert_eq!(headers.get(\"content-length\"), None);\n\n        let Action::Response {\n            response: Ok(Response { headers, .. }),\n        } = &network_traffic.events[3].action\n        else {\n            panic!(\"unexpected event: {:?}\", network_traffic.events[3].action);\n        };\n        // content length is not added when it wasn't initially present\n        let expected_length = \"hello from example.com\".len();\n        assert_eq!(\n            headers.get(\"content-length\"),\n            Some(&vec![expected_length.to_string()])\n        );\n        Ok(())\n    }\n\n    #[cfg(feature = \"legacy-test-util\")]\n    #[tokio::test]\n    async fn turtles_all_the_way_down() -> Result<(), Box<dyn Error>> {\n        // create a replaying connection from a recording, wrap a recording connection around it,\n        // make a request, then verify that the same traffic was recorded.\n        let network_traffic = fs::read_to_string(\"test-data/example.com.json\")?;\n        let mut network_traffic: NetworkTraffic = serde_json::from_str(&network_traffic)?;\n        network_traffic.correct_content_lengths();\n        let inner = ReplayingClient::new(network_traffic.events.clone());\n        let connection = RecordingClient::new(SharedHttpConnector::new(inner.clone()));\n        let req = http_02x::Request::post(\"https://www.example.com\")\n            .body(SdkBody::from(\"hello world\"))\n            .unwrap();\n        let mut resp = connection.call(req.try_into().unwrap()).await.expect(\"ok\");\n        let body = std::mem::replace(resp.body_mut(), SdkBody::taken());\n        let data = ByteStream::new(body).collect().await.unwrap().into_bytes();\n        assert_eq!(\n            String::from_utf8(data.to_vec()).unwrap(),\n            \"hello from example.com\"\n        );\n        assert_eq!(\n            connection.events().as_slice(),\n            network_traffic.events.as_slice()\n        );\n        let requests = inner.take_requests().await;\n        assert_eq!(\n            requests[0].uri(),\n            &http_02x::Uri::from_static(\"https://www.example.com\")\n        );\n        assert_eq!(\n            requests[0].body(),\n            &Bytes::from_static(\"hello world\".as_bytes())\n        );\n        Ok(())\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-client/src/test_util/infallible.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_smithy_runtime_api::client::connector_metadata::ConnectorMetadata;\nuse aws_smithy_runtime_api::client::http::{\n    HttpClient, HttpConnector, HttpConnectorFuture, HttpConnectorSettings, SharedHttpClient,\n    SharedHttpConnector,\n};\nuse aws_smithy_runtime_api::client::orchestrator::{HttpRequest, HttpResponse};\nuse aws_smithy_runtime_api::client::result::ConnectorError;\nuse aws_smithy_runtime_api::client::runtime_components::RuntimeComponents;\nuse aws_smithy_runtime_api::shared::IntoShared;\nuse aws_smithy_types::body::SdkBody;\nuse std::fmt;\nuse std::sync::Arc;\n\n/// Create a [`SharedHttpClient`] from `Fn(http:Request) -> http::Response`\n///\n/// # Examples\n///\n/// ```rust\n/// # use http_1x as http;\n/// use aws_smithy_http_client::test_util::infallible_client_fn;\n/// let http_client = infallible_client_fn(|_req| http::Response::builder().status(200).body(\"OK!\").unwrap());\n/// ```\npub fn infallible_client_fn<B>(\n    f: impl Fn(http_1x::Request<SdkBody>) -> http_1x::Response<B> + Send + Sync + 'static,\n) -> SharedHttpClient\nwhere\n    B: Into<SdkBody>,\n{\n    InfallibleClientFn::new(f).into_shared()\n}\n\n#[derive(Clone)]\nstruct InfallibleClientFn {\n    #[allow(clippy::type_complexity)]\n    response: Arc<\n        dyn Fn(http_1x::Request<SdkBody>) -> Result<http_1x::Response<SdkBody>, ConnectorError>\n            + Send\n            + Sync,\n    >,\n}\n\nimpl fmt::Debug for InfallibleClientFn {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        f.debug_struct(\"InfallibleClientFn\").finish()\n    }\n}\n\nimpl InfallibleClientFn {\n    fn new<B: Into<SdkBody>>(\n        f: impl Fn(http_1x::Request<SdkBody>) -> http_1x::Response<B> + Send + Sync + 'static,\n    ) -> Self {\n        Self {\n            response: Arc::new(move |request| Ok(f(request).map(|b| b.into()))),\n        }\n    }\n}\n\nimpl HttpConnector for InfallibleClientFn {\n    fn call(&self, request: HttpRequest) -> HttpConnectorFuture {\n        HttpConnectorFuture::ready(\n            (self.response)(request.try_into_http1x().unwrap())\n                .map(|res| HttpResponse::try_from(res).unwrap()),\n        )\n    }\n}\n\nimpl HttpClient for InfallibleClientFn {\n    fn http_connector(\n        &self,\n        _: &HttpConnectorSettings,\n        _: &RuntimeComponents,\n    ) -> SharedHttpConnector {\n        self.clone().into_shared()\n    }\n\n    fn connector_metadata(&self) -> Option<ConnectorMetadata> {\n        Some(ConnectorMetadata::new(\"infallible-client\", None))\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-client/src/test_util/legacy_infallible.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_smithy_runtime_api::client::connector_metadata::ConnectorMetadata;\nuse aws_smithy_runtime_api::client::http::{\n    HttpClient, HttpConnector, HttpConnectorFuture, HttpConnectorSettings, SharedHttpClient,\n    SharedHttpConnector,\n};\nuse aws_smithy_runtime_api::client::orchestrator::{HttpRequest, HttpResponse};\nuse aws_smithy_runtime_api::client::result::ConnectorError;\nuse aws_smithy_runtime_api::client::runtime_components::RuntimeComponents;\nuse aws_smithy_runtime_api::shared::IntoShared;\nuse aws_smithy_types::body::SdkBody;\nuse std::fmt;\nuse std::sync::Arc;\n\n/// Create a [`SharedHttpClient`] from `Fn(http:Request) -> http::Response`\n///\n/// # Examples\n///\n/// ```rust\n/// use aws_smithy_http_client::test_util::legacy_infallible::infallible_client_fn;\n/// let http_client = infallible_client_fn(|_req| http_02x::Response::builder().status(200).body(\"OK!\").unwrap());\n/// ```\npub fn infallible_client_fn<B>(\n    f: impl Fn(http_02x::Request<SdkBody>) -> http_02x::Response<B> + Send + Sync + 'static,\n) -> SharedHttpClient\nwhere\n    B: Into<SdkBody>,\n{\n    InfallibleClientFn::new(f).into_shared()\n}\n\n#[derive(Clone)]\nstruct InfallibleClientFn {\n    #[allow(clippy::type_complexity)]\n    response: Arc<\n        dyn Fn(http_02x::Request<SdkBody>) -> Result<http_02x::Response<SdkBody>, ConnectorError>\n            + Send\n            + Sync,\n    >,\n}\n\nimpl fmt::Debug for InfallibleClientFn {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        f.debug_struct(\"InfallibleClientFn\").finish()\n    }\n}\n\nimpl InfallibleClientFn {\n    fn new<B: Into<SdkBody>>(\n        f: impl Fn(http_02x::Request<SdkBody>) -> http_02x::Response<B> + Send + Sync + 'static,\n    ) -> Self {\n        Self {\n            response: Arc::new(move |request| Ok(f(request).map(|b| b.into()))),\n        }\n    }\n}\n\nimpl HttpConnector for InfallibleClientFn {\n    fn call(&self, request: HttpRequest) -> HttpConnectorFuture {\n        HttpConnectorFuture::ready(\n            (self.response)(request.try_into_http02x().unwrap())\n                .map(|res| HttpResponse::try_from(res).unwrap()),\n        )\n    }\n}\n\nimpl HttpClient for InfallibleClientFn {\n    fn http_connector(\n        &self,\n        _: &HttpConnectorSettings,\n        _: &RuntimeComponents,\n    ) -> SharedHttpConnector {\n        self.clone().into_shared()\n    }\n\n    fn connector_metadata(&self) -> Option<ConnectorMetadata> {\n        Some(ConnectorMetadata::new(\"infallible-client\", None))\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-client/src/test_util/never.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Test connectors that never return data\n\nuse aws_smithy_async::future::never::Never;\nuse aws_smithy_runtime_api::client::connector_metadata::ConnectorMetadata;\nuse aws_smithy_runtime_api::client::http::{\n    HttpClient, HttpConnector, HttpConnectorFuture, HttpConnectorSettings, SharedHttpConnector,\n};\nuse aws_smithy_runtime_api::client::orchestrator::HttpRequest;\nuse aws_smithy_runtime_api::client::runtime_components::RuntimeComponents;\nuse aws_smithy_runtime_api::shared::IntoShared;\nuse std::sync::atomic::{AtomicUsize, Ordering};\nuse std::sync::Arc;\n\n/// A client that will never respond.\n///\n/// Returned futures will return `Pending` forever\n#[derive(Clone, Debug, Default)]\npub struct NeverClient {\n    invocations: Arc<AtomicUsize>,\n}\n\nimpl NeverClient {\n    /// Create a new never connector.\n    pub fn new() -> Self {\n        Default::default()\n    }\n\n    /// Returns the number of invocations made to this connector.\n    pub fn num_calls(&self) -> usize {\n        self.invocations.load(Ordering::SeqCst)\n    }\n}\n\nimpl HttpConnector for NeverClient {\n    fn call(&self, _request: HttpRequest) -> HttpConnectorFuture {\n        self.invocations.fetch_add(1, Ordering::SeqCst);\n        HttpConnectorFuture::new(async move {\n            Never::new().await;\n            unreachable!()\n        })\n    }\n}\n\nimpl HttpClient for NeverClient {\n    fn http_connector(\n        &self,\n        _: &HttpConnectorSettings,\n        _: &RuntimeComponents,\n    ) -> SharedHttpConnector {\n        self.clone().into_shared()\n    }\n\n    fn connector_metadata(&self) -> Option<ConnectorMetadata> {\n        Some(ConnectorMetadata::new(\"never-client\", None))\n    }\n}\n\n/// A TCP connector that never connects.\n// In the future, this can be available for multiple hyper version feature flags, with the impls gated between individual features\n#[cfg(any(feature = \"hyper-014\", feature = \"default-client\"))]\n#[derive(Clone, Debug, Default)]\npub struct NeverTcpConnector;\n\n#[cfg(any(feature = \"hyper-014\", feature = \"default-client\"))]\nimpl NeverTcpConnector {\n    /// Creates a new `NeverTcpConnector`.\n    pub fn new() -> Self {\n        Self\n    }\n}\n\n#[cfg(feature = \"hyper-014\")]\nimpl hyper_0_14::service::Service<http_02x::Uri> for NeverTcpConnector {\n    type Response = hyper_014_support::NeverTcpConnection;\n    type Error = aws_smithy_runtime_api::box_error::BoxError;\n    type Future = std::pin::Pin<\n        Box<dyn std::future::Future<Output = Result<Self::Response, Self::Error>> + Send + Sync>,\n    >;\n\n    fn poll_ready(\n        &mut self,\n        _: &mut std::task::Context<'_>,\n    ) -> std::task::Poll<Result<(), Self::Error>> {\n        std::task::Poll::Ready(Ok(()))\n    }\n\n    fn call(&mut self, _: http_02x::Uri) -> Self::Future {\n        Box::pin(async {\n            Never::new().await;\n            unreachable!()\n        })\n    }\n}\n\n#[cfg(feature = \"default-client\")]\nmod hyper1_support {\n    use super::NeverTcpConnector;\n    use aws_smithy_async::future::never::Never;\n    use aws_smithy_runtime_api::client::http::SharedHttpClient;\n    use aws_smithy_runtime_api::client::result::ConnectorError;\n    use http_1x::Uri;\n    use hyper_util::rt::TokioIo;\n    use std::future::Future;\n    use std::pin::Pin;\n    use std::task::{Context, Poll};\n    use tokio::net::TcpStream;\n\n    impl tower::Service<Uri> for NeverTcpConnector {\n        type Response = TokioIo<TcpStream>;\n        type Error = ConnectorError;\n        type Future = Pin<Box<dyn Future<Output = Result<Self::Response, Self::Error>> + Send>>;\n\n        fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {\n            Poll::Ready(Ok(()))\n        }\n\n        fn call(&mut self, _uri: Uri) -> Self::Future {\n            Box::pin(async move {\n                Never::new().await;\n                unreachable!()\n            })\n        }\n    }\n\n    impl NeverTcpConnector {\n        /// Convert this connector into a usable HTTP client for testing\n        #[doc(hidden)]\n        pub fn into_client(self) -> SharedHttpClient {\n            crate::client::build_with_tcp_conn_fn(None, None, NeverTcpConnector::new)\n        }\n    }\n}\n\n#[cfg(feature = \"hyper-014\")]\nmod hyper_014_support {\n    use hyper_0_14::client::connect::{Connected, Connection};\n    use std::io::Error;\n    use std::pin::Pin;\n    use std::task::{Context, Poll};\n    use tokio::io::{AsyncRead, AsyncWrite, ReadBuf};\n\n    /// A connection type that appeases hyper's trait bounds for a TCP connector, but will panic if any of its traits are used.\n    #[non_exhaustive]\n    #[derive(Debug, Default)]\n    pub struct NeverTcpConnection;\n\n    impl Connection for NeverTcpConnection {\n        fn connected(&self) -> Connected {\n            unreachable!()\n        }\n    }\n\n    impl AsyncRead for NeverTcpConnection {\n        fn poll_read(\n            self: Pin<&mut Self>,\n            _cx: &mut Context<'_>,\n            _buf: &mut ReadBuf<'_>,\n        ) -> Poll<std::io::Result<()>> {\n            unreachable!()\n        }\n    }\n\n    impl AsyncWrite for NeverTcpConnection {\n        fn poll_write(\n            self: Pin<&mut Self>,\n            _cx: &mut Context<'_>,\n            _buf: &[u8],\n        ) -> Poll<Result<usize, Error>> {\n            unreachable!()\n        }\n\n        fn poll_flush(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll<Result<(), Error>> {\n            unreachable!()\n        }\n\n        fn poll_shutdown(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll<Result<(), Error>> {\n            unreachable!()\n        }\n    }\n}\n\n#[cfg(test)]\nmod test {\n\n    use super::*;\n\n    use aws_smithy_async::rt::sleep::TokioSleep;\n    use aws_smithy_async::time::SystemTimeSource;\n    use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder;\n    use tokio::time::Duration;\n\n    #[cfg(feature = \"hyper-014\")]\n    #[tokio::test]\n    async fn never_tcp_connector_plugs_into_hyper_014() {\n        use super::NeverTcpConnector;\n        use crate::hyper_014::HyperClientBuilder;\n\n        // it should compile\n        let client = HyperClientBuilder::new().build(NeverTcpConnector::new());\n        let components = RuntimeComponentsBuilder::for_tests()\n            .with_sleep_impl(Some(TokioSleep::new()))\n            .with_time_source(Some(SystemTimeSource::new()))\n            .build()\n            .unwrap();\n        let http_connector = client.http_connector(\n            &HttpConnectorSettings::builder()\n                .connect_timeout(Duration::from_millis(100))\n                .build(),\n            &components,\n        );\n\n        let err = http_connector\n            .call(HttpRequest::get(\"http://fakeuri.com\").unwrap())\n            .await\n            .expect_err(\"it should time out\");\n        assert!(dbg!(err).is_timeout());\n    }\n\n    #[cfg(feature = \"default-client\")]\n    #[tokio::test]\n    async fn never_tcp_connector_plugs_into_hyper_1() {\n        use super::NeverTcpConnector;\n        let client = NeverTcpConnector::new().into_client();\n        let components = RuntimeComponentsBuilder::for_tests()\n            .with_sleep_impl(Some(TokioSleep::new()))\n            .with_time_source(Some(SystemTimeSource::new()))\n            .build()\n            .unwrap();\n        let http_connector = client.http_connector(\n            &HttpConnectorSettings::builder()\n                .connect_timeout(Duration::from_millis(100))\n                .build(),\n            &components,\n        );\n\n        let err = http_connector\n            .call(HttpRequest::get(\"http://fakeuri.com\").unwrap())\n            .await\n            .expect_err(\"it should time out\");\n        assert!(dbg!(err).is_timeout());\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-client/src/test_util/replay.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_smithy_protocol_test::{assert_ok, validate_body, MediaType};\nuse aws_smithy_runtime_api::client::connector_metadata::ConnectorMetadata;\nuse aws_smithy_runtime_api::client::http::{\n    HttpClient, HttpConnector, HttpConnectorFuture, HttpConnectorSettings, SharedHttpConnector,\n};\nuse aws_smithy_runtime_api::client::orchestrator::{HttpRequest, HttpResponse};\nuse aws_smithy_runtime_api::client::result::ConnectorError;\nuse aws_smithy_runtime_api::client::runtime_components::RuntimeComponents;\nuse aws_smithy_runtime_api::shared::IntoShared;\nuse http_1x::header::CONTENT_TYPE;\nuse std::ops::Deref;\nuse std::sync::{Arc, Mutex, MutexGuard};\n\ntype ReplayEvents = Vec<ReplayEvent>;\n\npub(crate) const DEFAULT_RELAXED_HEADERS: &[&str] = &[\"x-amz-user-agent\", \"authorization\"];\n\n/// Test data for the [`StaticReplayClient`].\n///\n/// Each `ReplayEvent` represents one HTTP request and response\n/// through the connector.\n#[derive(Debug)]\npub struct ReplayEvent {\n    request: HttpRequest,\n    response: HttpResponse,\n}\n\nimpl ReplayEvent {\n    /// Creates a new `ReplayEvent`.\n    pub fn new(request: impl TryInto<HttpRequest>, response: impl TryInto<HttpResponse>) -> Self {\n        Self {\n            request: request.try_into().ok().expect(\"invalid request\"),\n            response: response.try_into().ok().expect(\"invalid response\"),\n        }\n    }\n\n    /// Returns the test request.\n    pub fn request(&self) -> &HttpRequest {\n        &self.request\n    }\n\n    /// Returns the test response.\n    pub fn response(&self) -> &HttpResponse {\n        &self.response\n    }\n}\n\nimpl From<(HttpRequest, HttpResponse)> for ReplayEvent {\n    fn from((request, response): (HttpRequest, HttpResponse)) -> Self {\n        Self::new(request, response)\n    }\n}\n\n#[derive(Debug)]\nstruct ValidateRequest {\n    expected: HttpRequest,\n    actual: HttpRequest,\n}\n\nimpl ValidateRequest {\n    fn assert_matches(&self, index: usize, ignore_headers: &[&str]) {\n        let (actual, expected) = (&self.actual, &self.expected);\n        assert_eq!(\n            expected.uri(),\n            actual.uri(),\n            \"request[{index}] - URI doesn't match expected value\"\n        );\n        for (name, value) in expected.headers() {\n            if !ignore_headers.contains(&name) {\n                let actual_header = actual\n                    .headers()\n                    .get(name)\n                    .unwrap_or_else(|| panic!(\"Request #{index} - Header {name:?} is missing\"));\n                assert_eq!(\n                    value, actual_header,\n                    \"request[{index}] - Header {name:?} doesn't match expected value\",\n                );\n            }\n        }\n        let actual_str = std::str::from_utf8(actual.body().bytes().unwrap_or(&[]));\n        let expected_str = std::str::from_utf8(expected.body().bytes().unwrap_or(&[]));\n        let media_type = if actual\n            .headers()\n            .get(CONTENT_TYPE)\n            .map(|v| v.contains(\"json\"))\n            .unwrap_or(false)\n        {\n            MediaType::Json\n        } else {\n            MediaType::Other(\"unknown\".to_string())\n        };\n        match (actual_str, expected_str) {\n            (Ok(actual), Ok(expected)) => assert_ok(validate_body(actual, expected, media_type)),\n            _ => assert_eq!(\n                expected.body().bytes(),\n                actual.body().bytes(),\n                \"request[{index}] - Body contents didn't match expected value\"\n            ),\n        };\n    }\n}\n\n/// Request/response replaying client for use in tests.\n///\n/// This mock client takes a list of request/response pairs named [`ReplayEvent`]. While the client\n/// is in use, the responses will be given in the order they appear in the list regardless of what\n/// the actual request was. The actual request is recorded, but otherwise not validated against what\n/// is in the [`ReplayEvent`]. Later, after the client is finished being used, the\n/// [`assert_requests_match`] method can be used to validate the requests.\n///\n/// This utility is simpler than [DVR], and thus, is good for tests that don't need\n/// to record and replay real traffic.\n///\n/// # Example\n///\n/// ```no_run\n/// # use http_1x as http;\n/// use aws_smithy_http_client::test_util::{ReplayEvent, StaticReplayClient};\n/// use aws_smithy_types::body::SdkBody;\n///\n/// let http_client = StaticReplayClient::new(vec![\n///     // Event that covers the first request/response\n///     ReplayEvent::new(\n///         // If `assert_requests_match` is called later, then this request will be matched\n///         // against the actual request that was made.\n///         http::Request::builder().uri(\"http://localhost:1234/foo\").body(SdkBody::empty()).unwrap(),\n///         // This response will be given to the first request regardless of whether it matches the request above.\n///         http::Response::builder().status(200).body(SdkBody::empty()).unwrap(),\n///     ),\n///     // The next ReplayEvent covers the second request/response pair...\n/// ]);\n///\n/// # /*\n/// let config = my_generated_client::Config::builder()\n///     .http_client(http_client.clone())\n///     .build();\n/// let client = my_generated_client::Client::from_conf(config);\n/// # */\n///\n/// // Do stuff with client...\n///\n/// // When you're done, assert the requests match what you expected\n/// http_client.assert_requests_match(&[]);\n/// ```\n///\n/// [`assert_requests_match`]: StaticReplayClient::assert_requests_match\n/// [DVR]: crate::test_util::dvr\n#[derive(Clone, Debug)]\npub struct StaticReplayClient {\n    data: Arc<Mutex<ReplayEvents>>,\n    requests: Arc<Mutex<Vec<ValidateRequest>>>,\n}\n\nimpl StaticReplayClient {\n    /// Creates a new event connector.\n    pub fn new(mut data: ReplayEvents) -> Self {\n        data.reverse();\n        StaticReplayClient {\n            data: Arc::new(Mutex::new(data)),\n            requests: Default::default(),\n        }\n    }\n\n    /// Returns an iterator over the actual requests that were made.\n    pub fn actual_requests(&self) -> impl Iterator<Item = &HttpRequest> + '_ {\n        // The iterator trait doesn't allow us to specify a lifetime on `self` in the `next()` method,\n        // so we have to do some unsafe code in order to actually implement this iterator without\n        // angering the borrow checker.\n        struct Iter<'a> {\n            // We store an exclusive lock to the data so that the data is completely immutable\n            _guard: MutexGuard<'a, Vec<ValidateRequest>>,\n            // We store a pointer into the immutable data for accessing it later\n            values: *const ValidateRequest,\n            len: usize,\n            next_index: usize,\n        }\n        impl<'a> Iterator for Iter<'a> {\n            type Item = &'a HttpRequest;\n\n            fn next(&mut self) -> Option<Self::Item> {\n                // Safety: check the next index is in bounds\n                if self.next_index >= self.len {\n                    None\n                } else {\n                    // Safety: It is OK to offset into the pointer and dereference since we did a bounds check.\n                    // It is OK to assign lifetime 'a to the reference since we hold the mutex guard for all of lifetime 'a.\n                    let next = unsafe {\n                        let offset = self.values.add(self.next_index);\n                        &*offset\n                    };\n                    self.next_index += 1;\n                    Some(&next.actual)\n                }\n            }\n        }\n\n        let guard = self.requests.lock().unwrap();\n        Iter {\n            values: guard.as_ptr(),\n            len: guard.len(),\n            _guard: guard,\n            next_index: 0,\n        }\n    }\n\n    fn requests(&self) -> impl Deref<Target = Vec<ValidateRequest>> + '_ {\n        self.requests.lock().unwrap()\n    }\n\n    /// Asserts the expected requests match the actual requests.\n    ///\n    /// The expected requests are given as the connection events when the `EventConnector`\n    /// is created. The `EventConnector` will record the actual requests and assert that\n    /// they match the expected requests.\n    ///\n    /// A list of headers that should be ignored when comparing requests can be passed\n    /// for cases where headers are non-deterministic or are irrelevant to the test.\n    #[track_caller]\n    pub fn assert_requests_match(&self, ignore_headers: &[&str]) {\n        for (i, req) in self.requests().iter().enumerate() {\n            req.assert_matches(i, ignore_headers)\n        }\n        let remaining_requests = self.data.lock().unwrap();\n        assert!(\n            remaining_requests.is_empty(),\n            \"Expected {} additional requests (only {} sent)\",\n            remaining_requests.len(),\n            self.requests().len()\n        );\n    }\n\n    /// Convenience method for `assert_requests_match` that excludes the pre-defined headers to\n    /// be ignored\n    ///\n    /// The pre-defined headers to be ignored:\n    /// - x-amz-user-agent\n    /// - authorization\n    #[track_caller]\n    pub fn relaxed_requests_match(&self) {\n        self.assert_requests_match(DEFAULT_RELAXED_HEADERS)\n    }\n}\n\nimpl HttpConnector for StaticReplayClient {\n    fn call(&self, request: HttpRequest) -> HttpConnectorFuture {\n        let res = if let Some(event) = self.data.lock().unwrap().pop() {\n            self.requests.lock().unwrap().push(ValidateRequest {\n                expected: event.request,\n                actual: request,\n            });\n\n            Ok(event.response)\n        } else {\n            Err(ConnectorError::other(\n                \"StaticReplayClient: no more test data available to respond with\".into(),\n                None,\n            ))\n        };\n\n        HttpConnectorFuture::new(async move { res })\n    }\n}\n\nimpl HttpClient for StaticReplayClient {\n    fn http_connector(\n        &self,\n        _: &HttpConnectorSettings,\n        _: &RuntimeComponents,\n    ) -> SharedHttpConnector {\n        self.clone().into_shared()\n    }\n\n    fn connector_metadata(&self) -> Option<ConnectorMetadata> {\n        Some(ConnectorMetadata::new(\"static-replay-client\", None))\n    }\n}\n\n#[cfg(test)]\nmod test {\n    use crate::test_util::{ReplayEvent, StaticReplayClient};\n    use aws_smithy_types::body::SdkBody;\n\n    #[test]\n    fn create_from_either_http_type() {\n        let _client = StaticReplayClient::new(vec![ReplayEvent::new(\n            http_1x::Request::builder()\n                .uri(\"test\")\n                .body(SdkBody::from(\"hello\"))\n                .unwrap(),\n            http_1x::Response::builder()\n                .status(200)\n                .body(SdkBody::from(\"hello\"))\n                .unwrap(),\n        )]);\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-client/src/test_util/wire.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Utilities for mocking at the socket level\n//!\n//! Other tools in this module actually operate at the `http::Request` / `http::Response` level. This\n//! is useful, but it shortcuts the HTTP implementation (e.g. Hyper). [`WireMockServer`] binds\n//! to an actual socket on the host.\n//!\n//! # Examples\n//! ```no_run\n//! use aws_smithy_runtime_api::client::http::HttpConnectorSettings;\n//! use aws_smithy_http_client::test_util::wire::{check_matches, ReplayedEvent, WireMockServer};\n//! use aws_smithy_http_client::{match_events, ev};\n//! # async fn example() {\n//!\n//! // This connection binds to a local address\n//! let mock = WireMockServer::start(vec![\n//!     ReplayedEvent::status(503),\n//!     ReplayedEvent::status(200)\n//! ]).await;\n//!\n//! # /*\n//! // Create a client using the wire mock\n//! let config = my_generated_client::Config::builder()\n//!     .http_client(mock.http_client())\n//!     .build();\n//! let client = Client::from_conf(config);\n//!\n//! // ... do something with <client>\n//! # */\n//!\n//! // assert that you got the events you expected\n//! match_events!(ev!(dns), ev!(connect), ev!(http(200)))(&mock.events());\n//! # }\n//! ```\n\n#![allow(missing_docs)]\n\nuse aws_smithy_async::future::never::Never;\nuse aws_smithy_async::future::BoxFuture;\nuse aws_smithy_runtime_api::client::http::SharedHttpClient;\nuse bytes::Bytes;\nuse http_body_util::Full;\nuse hyper::service::service_fn;\nuse hyper_util::client::legacy::connect::dns::Name;\nuse hyper_util::rt::{TokioExecutor, TokioIo};\nuse hyper_util::server::graceful::{GracefulConnection, GracefulShutdown};\nuse std::collections::HashSet;\nuse std::convert::Infallible;\nuse std::error::Error;\nuse std::future::Future;\nuse std::iter::Once;\nuse std::net::SocketAddr;\nuse std::sync::{Arc, Mutex};\nuse std::task::{Context, Poll};\nuse tokio::net::TcpListener;\nuse tokio::sync::oneshot;\n\n/// An event recorded by [`WireMockServer`].\n#[non_exhaustive]\n#[derive(Debug, Clone)]\npub enum RecordedEvent {\n    DnsLookup(String),\n    NewConnection,\n    Response(ReplayedEvent),\n}\n\ntype Matcher = (\n    Box<dyn Fn(&RecordedEvent) -> Result<(), Box<dyn Error>>>,\n    &'static str,\n);\n\n/// This method should only be used by the macro\npub fn check_matches(events: &[RecordedEvent], matchers: &[Matcher]) {\n    let mut events_iter = events.iter();\n    let mut matcher_iter = matchers.iter();\n    let mut idx = -1;\n    loop {\n        idx += 1;\n        let bail = |err: Box<dyn Error>| {\n            panic!(\"failed on event {idx}:\\n  {err}\\n  actual recorded events: {events:?}\")\n        };\n        match (events_iter.next(), matcher_iter.next()) {\n            (Some(event), Some((matcher, _msg))) => matcher(event).unwrap_or_else(bail),\n            (None, None) => return,\n            (Some(event), None) => {\n                bail(format!(\"got {event:?} but no more events were expected\").into())\n            }\n            (None, Some((_expect, msg))) => {\n                bail(format!(\"expected {msg:?} but no more events were expected\").into())\n            }\n        }\n    }\n}\n\n#[macro_export]\nmacro_rules! matcher {\n    ($expect:tt) => {\n        (\n            Box::new(|event: &$crate::test_util::wire::RecordedEvent| {\n                if !matches!(event, $expect) {\n                    return Err(\n                        format!(\"expected `{}` but got {:?}\", stringify!($expect), event).into(),\n                    );\n                }\n                Ok(())\n            }),\n            stringify!($expect),\n        )\n    };\n}\n\n/// Helper macro to generate a series of test expectations\n#[macro_export]\nmacro_rules! match_events {\n        ($( $expect:pat),*) => {\n            |events| {\n                $crate::test_util::wire::check_matches(events, &[$( $crate::matcher!($expect) ),*]);\n            }\n        };\n    }\n\n/// Helper to generate match expressions for events\n#[macro_export]\nmacro_rules! ev {\n    (http($status:expr)) => {\n        $crate::test_util::wire::RecordedEvent::Response(\n            $crate::test_util::wire::ReplayedEvent::HttpResponse {\n                status: $status,\n                ..\n            },\n        )\n    };\n    (dns) => {\n        $crate::test_util::wire::RecordedEvent::DnsLookup(_)\n    };\n    (connect) => {\n        $crate::test_util::wire::RecordedEvent::NewConnection\n    };\n    (timeout) => {\n        $crate::test_util::wire::RecordedEvent::Response(\n            $crate::test_util::wire::ReplayedEvent::Timeout,\n        )\n    };\n}\n\npub use {ev, match_events, matcher};\n\n#[non_exhaustive]\n#[derive(Clone, Debug, PartialEq, Eq)]\npub enum ReplayedEvent {\n    Timeout,\n    HttpResponse { status: u16, body: Bytes },\n}\n\nimpl ReplayedEvent {\n    pub fn ok() -> Self {\n        Self::HttpResponse {\n            status: 200,\n            body: Bytes::new(),\n        }\n    }\n\n    pub fn with_body(body: impl AsRef<[u8]>) -> Self {\n        Self::HttpResponse {\n            status: 200,\n            body: Bytes::copy_from_slice(body.as_ref()),\n        }\n    }\n\n    pub fn status(status: u16) -> Self {\n        Self::HttpResponse {\n            status,\n            body: Bytes::new(),\n        }\n    }\n}\n\n/// Test server that binds to 127.0.0.1:0\n///\n/// See the [module docs](crate::test_util::wire) for a usage example.\n///\n/// Usage:\n/// - Call [`WireMockServer::start`] to start the server\n/// - Use [`WireMockServer::http_client`] or [`dns_resolver`](WireMockServer::dns_resolver) to configure your client.\n/// - Make requests to [`endpoint_url`](WireMockServer::endpoint_url).\n/// - Once the test is complete, retrieve a list of events from [`WireMockServer::events`]\n#[derive(Debug)]\npub struct WireMockServer {\n    event_log: Arc<Mutex<Vec<RecordedEvent>>>,\n    bind_addr: SocketAddr,\n    // when the sender is dropped, that stops the server\n    shutdown_hook: oneshot::Sender<()>,\n}\n\n#[derive(Debug, Clone)]\nstruct SharedGraceful {\n    graceful: Arc<Mutex<Option<hyper_util::server::graceful::GracefulShutdown>>>,\n}\n\nimpl SharedGraceful {\n    fn new() -> Self {\n        Self {\n            graceful: Arc::new(Mutex::new(Some(GracefulShutdown::new()))),\n        }\n    }\n\n    fn watch<C: GracefulConnection>(&self, conn: C) -> impl Future<Output = C::Output> {\n        let graceful = self.graceful.lock().unwrap();\n        graceful\n            .as_ref()\n            .expect(\"graceful not shutdown\")\n            .watch(conn)\n    }\n\n    async fn shutdown(&self) {\n        let graceful = { self.graceful.lock().unwrap().take() };\n\n        if let Some(graceful) = graceful {\n            graceful.shutdown().await;\n        }\n    }\n}\n\nimpl WireMockServer {\n    /// Start a wire mock server with the given events to replay.\n    pub async fn start(mut response_events: Vec<ReplayedEvent>) -> Self {\n        let listener = TcpListener::bind(\"127.0.0.1:0\").await.unwrap();\n        let (tx, mut rx) = oneshot::channel();\n        let listener_addr = listener.local_addr().unwrap();\n        response_events.reverse();\n        let response_events = Arc::new(Mutex::new(response_events));\n        let handler_events = response_events;\n        let wire_events = Arc::new(Mutex::new(vec![]));\n        let wire_log_for_service = wire_events.clone();\n        let poisoned_conns: Arc<Mutex<HashSet<SocketAddr>>> = Default::default();\n        let graceful = SharedGraceful::new();\n        let conn_builder = Arc::new(hyper_util::server::conn::auto::Builder::new(\n            TokioExecutor::new(),\n        ));\n\n        let server = async move {\n            let poisoned_conns = poisoned_conns.clone();\n            let events = handler_events.clone();\n            let wire_log = wire_log_for_service.clone();\n            loop {\n                tokio::select! {\n                    Ok((stream, remote_addr)) = listener.accept() => {\n                        tracing::info!(\"established connection: {:?}\", remote_addr);\n                        let poisoned_conns = poisoned_conns.clone();\n                        let events = events.clone();\n                        let wire_log = wire_log.clone();\n                        wire_log.lock().unwrap().push(RecordedEvent::NewConnection);\n                        let io = TokioIo::new(stream);\n\n                        let svc = service_fn(move |_req| {\n                            let poisoned_conns = poisoned_conns.clone();\n                            let events = events.clone();\n                            let wire_log = wire_log.clone();\n                            if poisoned_conns.lock().unwrap().contains(&remote_addr) {\n                                tracing::error!(\"poisoned connection {:?} was reused!\", &remote_addr);\n                                panic!(\"poisoned connection was reused!\");\n                            }\n                            let next_event = events.clone().lock().unwrap().pop();\n                            async move {\n                                let next_event = next_event\n                                    .unwrap_or_else(|| panic!(\"no more events! Log: {wire_log:?}\"));\n\n                                wire_log\n                                    .lock()\n                                    .unwrap()\n                                    .push(RecordedEvent::Response(next_event.clone()));\n\n                                if next_event == ReplayedEvent::Timeout {\n                                    tracing::info!(\"{} is poisoned\", remote_addr);\n                                    poisoned_conns.lock().unwrap().insert(remote_addr);\n                                }\n                                tracing::debug!(\"replying with {:?}\", next_event);\n                                let event = generate_response_event(next_event).await;\n                                dbg!(event)\n                            }\n                        });\n\n                        let conn_builder = conn_builder.clone();\n                        let graceful = graceful.clone();\n                        tokio::spawn(async move {\n                            let conn = conn_builder.serve_connection(io, svc);\n                            let fut = graceful.watch(conn);\n                            if let Err(e) = fut.await {\n                                panic!(\"Error serving connection: {e:?}\");\n                            }\n                        });\n                    },\n                    _ = &mut rx => {\n                        tracing::info!(\"wire server: shutdown signalled\");\n                        graceful.shutdown().await;\n                        tracing::info!(\"wire server: shutdown complete!\");\n                        break;\n                    }\n                }\n            }\n        };\n\n        tokio::spawn(server);\n        Self {\n            event_log: wire_events,\n            bind_addr: listener_addr,\n            shutdown_hook: tx,\n        }\n    }\n\n    /// Retrieve the events recorded by this connection\n    pub fn events(&self) -> Vec<RecordedEvent> {\n        self.event_log.lock().unwrap().clone()\n    }\n\n    fn bind_addr(&self) -> SocketAddr {\n        self.bind_addr\n    }\n\n    pub fn dns_resolver(&self) -> LoggingDnsResolver {\n        let event_log = self.event_log.clone();\n        let bind_addr = self.bind_addr;\n        LoggingDnsResolver(InnerDnsResolver {\n            log: event_log,\n            socket_addr: bind_addr,\n        })\n    }\n\n    /// Prebuilt [`HttpClient`](aws_smithy_runtime_api::client::http::HttpClient) with correctly wired DNS resolver.\n    ///\n    /// **Note**: This must be used in tandem with [`Self::dns_resolver`]\n    pub fn http_client(&self) -> SharedHttpClient {\n        let resolver = self.dns_resolver();\n        crate::client::build_with_tcp_conn_fn(None, None, move || {\n            hyper_util::client::legacy::connect::HttpConnector::new_with_resolver(\n                resolver.clone().0,\n            )\n        })\n    }\n\n    /// Endpoint to use when connecting\n    ///\n    /// This works in tandem with the [`Self::dns_resolver`] to bind to the correct local IP Address\n    pub fn endpoint_url(&self) -> String {\n        format!(\n            \"http://this-url-is-converted-to-localhost.com:{}\",\n            self.bind_addr().port()\n        )\n    }\n\n    /// Shuts down the mock server.\n    pub fn shutdown(self) {\n        let _ = self.shutdown_hook.send(());\n    }\n}\n\nasync fn generate_response_event(\n    event: ReplayedEvent,\n) -> Result<http_1x::Response<Full<Bytes>>, Infallible> {\n    let resp = match event {\n        ReplayedEvent::HttpResponse { status, body } => http_1x::Response::builder()\n            .status(status)\n            .body(Full::new(body))\n            .unwrap(),\n        ReplayedEvent::Timeout => {\n            Never::new().await;\n            unreachable!()\n        }\n    };\n    Ok::<_, Infallible>(resp)\n}\n\n/// DNS resolver that keeps a log of all lookups\n///\n/// Regardless of what hostname is requested, it will always return the same socket address.\n#[derive(Clone, Debug)]\npub struct LoggingDnsResolver(InnerDnsResolver);\n\n// internal implementation so we don't have to expose hyper_util\n#[derive(Clone, Debug)]\nstruct InnerDnsResolver {\n    log: Arc<Mutex<Vec<RecordedEvent>>>,\n    socket_addr: SocketAddr,\n}\n\nimpl tower::Service<Name> for InnerDnsResolver {\n    type Response = Once<SocketAddr>;\n    type Error = Infallible;\n    type Future = BoxFuture<'static, Self::Response, Self::Error>;\n\n    fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {\n        Poll::Ready(Ok(()))\n    }\n\n    fn call(&mut self, req: Name) -> Self::Future {\n        let socket_addr = self.socket_addr;\n        let log = self.log.clone();\n        Box::pin(async move {\n            println!(\"looking up {req:?}, replying with {socket_addr:?}\");\n            log.lock()\n                .unwrap()\n                .push(RecordedEvent::DnsLookup(req.to_string()));\n            Ok(std::iter::once(socket_addr))\n        })\n    }\n}\n\n#[cfg(all(feature = \"legacy-test-util\", feature = \"hyper-014\"))]\nimpl hyper_0_14::service::Service<hyper_0_14::client::connect::dns::Name> for LoggingDnsResolver {\n    type Response = Once<SocketAddr>;\n    type Error = Infallible;\n    type Future = BoxFuture<'static, Self::Response, Self::Error>;\n\n    fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {\n        self.0.poll_ready(cx)\n    }\n\n    fn call(&mut self, req: hyper_0_14::client::connect::dns::Name) -> Self::Future {\n        use std::str::FromStr;\n        let adapter = Name::from_str(req.as_str()).expect(\"valid conversion\");\n        self.0.call(adapter)\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-client/src/test_util.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Various fake/mock clients for testing.\n//!\n//! Each test client is useful for different test use cases:\n//! - [`capture_request()`]: If you don't care what the response is, but just want to\n//!   check that the serialized request is what you expect, then use `capture_request`.\n//!   Or, alternatively, if you don't care what the request is, but want to always\n//!   respond with a given response, then capture request can also be useful since\n//!   you can optionally give it a response to return.\n#![cfg_attr(\n    feature = \"default-client\",\n    doc = \"- [`dvr`]: If you want to record real-world traffic and then replay it later, then DVR's\"\n)]\n//!   [`RecordingClient`](dvr::RecordingClient) and [`ReplayingClient`](dvr::ReplayingClient)\n//!   can accomplish this, and the recorded traffic can be saved to JSON and checked in. Note: if\n//!   the traffic recording has sensitive information in it, such as signatures or authorization,\n//!   you will need to manually scrub this out if you intend to store the recording alongside\n//!   your tests.\n//! - [`StaticReplayClient`]: If you want to have a set list of requests and their responses in a test,\n//!   then the static replay client will be useful. On construction, it takes a list of request/response\n//!   pairs that represent each expected request and the response for that test. At the end of the test,\n//!   you can ask the client to verify that the requests matched the expectations.\n//! - [`infallible_client_fn`]: Allows you to create a client from an infallible function\n//!   that takes a request and returns a response.\n//! - [`NeverClient`]: Useful for testing timeouts, where you want the client to never respond.\n//!\n#![cfg_attr(\n    any(feature = \"hyper-014\", feature = \"default-client\"),\n    doc = \"\nThere is also the [`NeverTcpConnector`], which makes it easy to test connect/read timeouts.\n\nFinally, for socket-level mocking, see the [`wire`] module.\n\"\n)]\n\nmod capture_request;\npub use capture_request::{capture_request, CaptureRequestHandler, CaptureRequestReceiver};\n\n#[cfg(feature = \"legacy-test-util\")]\npub use capture_request::legacy_capture_request;\n\npub mod dvr;\n\nmod replay;\npub use replay::{ReplayEvent, StaticReplayClient};\n\nmod infallible;\npub use infallible::infallible_client_fn;\n\n// infallible based on http_02x stack had to be duplicated to avoid breaking API changes\n#[allow(missing_docs)]\n#[cfg(feature = \"legacy-test-util\")]\npub mod legacy_infallible;\n\nmod never;\npub use never::NeverClient;\n\n#[cfg(any(feature = \"hyper-014\", feature = \"default-client\"))]\npub use never::NeverTcpConnector;\n\nmod body;\n#[cfg(all(feature = \"default-client\", feature = \"wire-mock\"))]\npub mod wire;\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-client/test-data/example.com.json",
    "content": "{\n  \"events\": [\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Request\": {\n          \"request\": {\n            \"uri\": \"https://www.example.com/\",\n            \"headers\": {},\n            \"method\": \"POST\"\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"hello world\"\n          },\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Request\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Response\": {\n          \"response\": {\n            \"Ok\": {\n              \"status\": 200,\n              \"version\": \"HTTP/2.0\",\n              \"headers\": {\n                \"etag\": [\n                  \"\\\"3147526947+ident\\\"\"\n                ],\n                \"vary\": [\n                  \"Accept-Encoding\"\n                ],\n                \"server\": [\n                  \"ECS (bsa/EB20)\"\n                ],\n                \"x-cache\": [\n                  \"HIT\"\n                ],\n                \"age\": [\n                  \"355292\"\n                ],\n                \"content-length\": [\n                  \"1256\"\n                ],\n                \"cache-control\": [\n                  \"max-age=604800\"\n                ],\n                \"expires\": [\n                  \"Mon, 16 Aug 2021 18:51:30 GMT\"\n                ],\n                \"content-type\": [\n                  \"text/html; charset=UTF-8\"\n                ],\n                \"date\": [\n                  \"Mon, 09 Aug 2021 18:51:30 GMT\"\n                ],\n                \"last-modified\": [\n                  \"Thu, 17 Oct 2019 07:18:26 GMT\"\n                ]\n              }\n            }\n          }\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Data\": {\n          \"data\": {\n            \"Utf8\": \"hello from example.com\"\n          },\n          \"direction\": \"Response\"\n        }\n      }\n    },\n    {\n      \"connection_id\": 0,\n      \"action\": {\n        \"Eof\": {\n          \"ok\": true,\n          \"direction\": \"Response\"\n        }\n      }\n    }\n  ],\n  \"docs\": \"test of example.com. response body has been manually changed\",\n  \"version\": \"V0\"\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-client/tests/openssl.cnf",
    "content": "[ v3_end ]\nbasicConstraints = critical,CA:false\nkeyUsage = nonRepudiation, digitalSignature\nsubjectKeyIdentifier = hash\nauthorityKeyIdentifier = keyid:always,issuer:always\nsubjectAltName = @alt_names\n\n[ v3_client ]\nbasicConstraints = critical,CA:false\nkeyUsage = nonRepudiation, digitalSignature\nextendedKeyUsage = critical, clientAuth\nsubjectKeyIdentifier = hash\nauthorityKeyIdentifier = keyid:always,issuer:always\n\n[ v3_inter ]\nsubjectKeyIdentifier = hash\nextendedKeyUsage = critical, serverAuth, clientAuth\nbasicConstraints = CA:true\nkeyUsage = cRLSign, keyCertSign, digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment, keyAgreement, keyCertSign, cRLSign\n\n[ alt_names ]\nDNS.1 = sdktest.com\nDNS.2 = localhost\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-client/tests/proxy_tests.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Integration tests for proxy functionality\n//!\n//! These tests verify that proxy configuration works end-to-end with real HTTP requests\n//! using mock proxy servers.\n#![cfg(feature = \"default-client\")]\n\nuse aws_smithy_async::time::SystemTimeSource;\nuse aws_smithy_http_client::{proxy::ProxyConfig, tls, Connector};\nuse aws_smithy_runtime_api::client::http::{\n    http_client_fn, HttpClient, HttpConnector, HttpConnectorSettings, SharedHttpConnector,\n};\nuse aws_smithy_runtime_api::client::orchestrator::HttpRequest;\nuse aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder;\nuse base64::Engine;\nuse http_1x::{Request, Response, StatusCode};\nuse http_body_util::BodyExt;\nuse hyper::body::Incoming;\nuse hyper::service::service_fn;\nuse hyper_util::rt::TokioIo;\nuse std::collections::HashMap;\nuse std::convert::Infallible;\nuse std::net::SocketAddr;\nuse std::sync::{Arc, Mutex};\nuse std::time::Duration;\nuse tokio::net::TcpListener;\nuse tokio::sync::oneshot;\n\n// ================================================================================================\n// Test Utilities (Mock Proxy Server)\n// ================================================================================================\n\n/// Mock HTTP server that acts as a proxy endpoint for testing\n#[derive(Debug)]\nstruct MockProxyServer {\n    conn_count: Arc<()>,\n    addr: SocketAddr,\n    shutdown_tx: Option<oneshot::Sender<()>>,\n    request_log: Arc<Mutex<Vec<RecordedRequest>>>,\n}\n\n/// A recorded request received by the mock proxy server\n#[derive(Debug, Clone)]\nstruct RecordedRequest {\n    method: String,\n    uri: String,\n    headers: HashMap<String, String>,\n}\n\nimpl MockProxyServer {\n    /// Create a new mock proxy server with a custom request handler\n    async fn new<F>(handler: F) -> Self\n    where\n        F: Fn(RecordedRequest) -> Response<String> + Send + Sync + 'static,\n    {\n        let listener = TcpListener::bind(\"127.0.0.1:0\").await.unwrap();\n        let addr = listener.local_addr().unwrap();\n        let (shutdown_tx, shutdown_rx) = oneshot::channel();\n        let request_log = Arc::new(Mutex::new(Vec::new()));\n        let request_log_clone = request_log.clone();\n        let conn_count = Arc::new(());\n        let server_conn_count = conn_count.clone();\n\n        let handler = Arc::new(handler);\n\n        tokio::spawn(async move {\n            let mut shutdown_rx = shutdown_rx;\n\n            loop {\n                tokio::select! {\n                    result = listener.accept() => {\n                        match result {\n                            Ok((stream, _)) => {\n                                let io = TokioIo::new(stream);\n                                let handler = handler.clone();\n                                let request_log = request_log_clone.clone();\n\n                                let stream_conn_count = server_conn_count.clone();\n                                tokio::spawn(async move {\n                                    let _stream_conn_count = stream_conn_count;\n                                    let service = service_fn(move |req: Request<Incoming>| {\n                                        let handler = handler.clone();\n                                        let request_log = request_log.clone();\n\n                                        async move {\n                                            // Record the request\n                                            let recorded = RecordedRequest {\n                                                method: req.method().to_string(),\n                                                uri: req.uri().to_string(),\n                                                headers: req.headers().iter()\n                                                    .map(|(k, v)| (k.to_string(), v.to_str().unwrap_or(\"\").to_string()))\n                                                    .collect(),\n                                            };\n\n                                            request_log.lock().unwrap().push(recorded.clone());\n\n                                            // Call the handler\n                                            let response = handler(recorded);\n\n                                            // Convert to hyper response\n                                            let (parts, body) = response.into_parts();\n                                            let hyper_response = Response::from_parts(parts, body);\n\n                                            Ok::<_, Infallible>(hyper_response)\n                                        }\n                                    });\n\n                                    if let Err(err) = hyper::server::conn::http1::Builder::new()\n                                        .serve_connection(io, service)\n                                        .await\n                                    {\n                                        eprintln!(\"Mock proxy server connection error: {}\", err);\n                                    }\n                                });\n                            }\n                            Err(_) => break,\n                        }\n                    }\n                    _ = &mut shutdown_rx => {\n                        break;\n                    }\n                }\n            }\n        });\n\n        Self {\n            addr,\n            shutdown_tx: Some(shutdown_tx),\n            request_log,\n            conn_count,\n        }\n    }\n\n    /// Return the number of active connections to this server\n    fn conn_count(&self) -> usize {\n        // 1 reference for the struct MockProxyServer, 1 reference for the\n        // socket task.\n        Arc::strong_count(&self.conn_count)\n            .checked_sub(2)\n            .expect(\"de-count 2 refs\")\n    }\n\n    /// Create a simple mock proxy that returns a fixed response\n    async fn with_response(status: StatusCode, body: &str) -> Self {\n        let body = body.to_string();\n        Self::new(move |_req| {\n            Response::builder()\n                .status(status)\n                .body(body.clone())\n                .unwrap()\n        })\n        .await\n    }\n\n    /// Create a mock proxy that validates basic authentication\n    async fn with_auth_validation(expected_user: &str, expected_pass: &str) -> Self {\n        let expected_auth = format!(\n            \"Basic {}\",\n            base64::prelude::BASE64_STANDARD.encode(format!(\"{}:{}\", expected_user, expected_pass))\n        );\n\n        Self::new(move |req| {\n            if let Some(auth_header) = req.headers.get(\"proxy-authorization\") {\n                if auth_header == &expected_auth {\n                    Response::builder()\n                        .status(StatusCode::OK)\n                        .body(\"authenticated\".to_string())\n                        .unwrap()\n                } else {\n                    Response::builder()\n                        .status(StatusCode::PROXY_AUTHENTICATION_REQUIRED)\n                        .body(\"invalid credentials\".to_string())\n                        .unwrap()\n                }\n            } else {\n                Response::builder()\n                    .status(StatusCode::PROXY_AUTHENTICATION_REQUIRED)\n                    .header(\"proxy-authenticate\", \"Basic realm=\\\"proxy\\\"\")\n                    .body(\"authentication required\".to_string())\n                    .unwrap()\n            }\n        })\n        .await\n    }\n\n    /// Get the address this server is listening on\n    fn addr(&self) -> SocketAddr {\n        self.addr\n    }\n\n    /// Get all requests received by this server\n    fn requests(&self) -> Vec<RecordedRequest> {\n        self.request_log.lock().unwrap().clone()\n    }\n}\n\nimpl Drop for MockProxyServer {\n    fn drop(&mut self) {\n        if let Some(tx) = self.shutdown_tx.take() {\n            let _ = tx.send(());\n        }\n    }\n}\n\n/// Utility for running tests with specific environment variables\n#[allow(clippy::await_holding_lock)]\nasync fn with_env_vars<F, Fut, R>(vars: &[(&str, &str)], test: F) -> R\nwhere\n    F: FnOnce() -> Fut,\n    Fut: std::future::Future<Output = R>,\n{\n    // Use a static mutex to serialize environment variable tests\n    static ENV_MUTEX: std::sync::Mutex<()> = std::sync::Mutex::new(());\n    let _guard = ENV_MUTEX.lock().unwrap();\n\n    // Save original environment\n    let original_vars: Vec<_> = vars\n        .iter()\n        .map(|(key, _)| (*key, std::env::var(key)))\n        .collect();\n\n    // Set test environment variables\n    for (key, value) in vars {\n        std::env::set_var(key, value);\n    }\n\n    // Run the test\n    let result = test().await;\n\n    // Restore original environment\n    for (key, original_value) in original_vars {\n        match original_value {\n            Ok(val) => std::env::set_var(key, val),\n            Err(_) => std::env::remove_var(key),\n        }\n    }\n\n    result\n}\n\n/// Helper function to make HTTP requests through a proxy-configured connector\nasync fn make_http_request_through_proxy(\n    proxy_config: ProxyConfig,\n    target_url: &str,\n) -> Result<(StatusCode, String), Box<dyn std::error::Error + Send + Sync>> {\n    make_http_request_through_proxy_with_pool_timeout(\n        proxy_config,\n        Some(Duration::from_secs(90)),\n        target_url,\n    )\n    .await\n    .map(|(status, res, _client)| (status, res))\n}\n\n/// Helper function to make HTTP requests through a proxy-configured connector\nasync fn make_http_request_through_proxy_with_pool_timeout(\n    proxy_config: ProxyConfig,\n    pool_idle_timeout: Option<Duration>,\n    target_url: &str,\n) -> Result<(StatusCode, String, SharedHttpConnector), Box<dyn std::error::Error + Send + Sync>> {\n    // Create an HttpClient using http_client_fn with proxy-configured connector\n    let http_client = http_client_fn(move |settings, _components| {\n        let connector = Connector::builder()\n            .proxy_config(proxy_config.clone())\n            .pool_idle_timeout(pool_idle_timeout)\n            .connector_settings(settings.clone())\n            .build_http();\n\n        aws_smithy_runtime_api::client::http::SharedHttpConnector::new(connector)\n    });\n\n    // Set up runtime components (following smoke_test_client pattern)\n    let connector_settings = HttpConnectorSettings::builder().build();\n    let runtime_components = RuntimeComponentsBuilder::for_tests()\n        .with_time_source(Some(SystemTimeSource::new()))\n        .build()\n        .unwrap();\n\n    // Get the HTTP connector from the client\n    let http_connector = http_client.http_connector(&connector_settings, &runtime_components);\n\n    // Create and make the HTTP request\n    let request = HttpRequest::get(target_url)\n        .map_err(|e| Box::new(e) as Box<dyn std::error::Error + Send + Sync>)?;\n\n    let response = http_connector.call(request).await?;\n\n    // Extract status and body\n    let status = response.status();\n    let body_bytes = response.into_body().collect().await?.to_bytes();\n    let body_string = String::from_utf8(body_bytes.to_vec())?;\n\n    Ok((status.into(), body_string, http_connector))\n}\n\n// test the pool idle timeout. The test is in this file because it has a convenient\n// infrastructure for making a server that answers smithy requests.\n#[tokio::test(start_paused = false)]\n// can't set start_paused due to <https://github.com/hyperium/hyper/issues/3950>\nasync fn test_http_proxy_connection_pool_timeout() {\n    const TIMEOUT: Duration = Duration::from_secs(10);\n\n    // Create a mock proxy server that validates the request was routed through it\n    let mock_proxy = MockProxyServer::new(|req| {\n        // Validate that this looks like a proxy request\n        assert_eq!(req.method, \"GET\");\n        // For HTTP proxy, the URI should be the full target URL\n        assert_eq!(req.uri, \"http://aws.amazon.com/api/data\");\n\n        // Return a successful response that we can identify\n        Response::builder()\n            .status(StatusCode::OK)\n            .body(\"proxied response from mock server\".to_string())\n            .unwrap()\n    })\n    .await;\n    // make sure that conn_count for an empty proxy is 0\n    assert_eq!(mock_proxy.conn_count(), 0);\n    tracing::info!(\"Start!\");\n\n    // Configure connector with HTTP proxy\n    let proxy_config = ProxyConfig::http(format!(\"http://{}\", mock_proxy.addr())).unwrap();\n\n    // Make an HTTP request through the proxy - use safe domain\n    let target_url = \"http://aws.amazon.com/api/data\";\n    let start = tokio::time::Instant::now();\n    let result =\n        make_http_request_through_proxy_with_pool_timeout(proxy_config, Some(TIMEOUT), target_url)\n            .await;\n    // hold _connector to avoid the timer being dropped\n    let (status, body, _connector) = result.expect(\"HTTP request through proxy should succeed\");\n    assert_eq!(status, StatusCode::OK);\n    assert_eq!(body, \"proxied response from mock server\");\n\n    // Verify the mock proxy received the expected request\n    let requests = mock_proxy.requests();\n    assert_eq!(requests.len(), 1);\n    assert_eq!(requests[0].method, \"GET\");\n    assert_eq!(requests[0].uri, target_url);\n\n    // after making a request, conn count is 1\n    assert_eq!(mock_proxy.conn_count(), 1);\n\n    // sleep 1 second below the idle timeout, conn count is still 1\n    tokio::time::sleep_until(start + TIMEOUT - Duration::from_secs(1)).await;\n    assert_eq!(mock_proxy.conn_count(), 1);\n\n    // sleep 2 more seconds, the connection should be disconnected, conn count should be 0\n    tokio::time::sleep(Duration::from_secs(3)).await;\n    assert_eq!(mock_proxy.conn_count(), 0);\n}\n\n#[tokio::test]\nasync fn test_http_proxy_basic_request() {\n    // Create a mock proxy server that validates the request was routed through it\n    let mock_proxy = MockProxyServer::new(|req| {\n        // Validate that this looks like a proxy request\n        assert_eq!(req.method, \"GET\");\n        // For HTTP proxy, the URI should be the full target URL\n        assert_eq!(req.uri, \"http://aws.amazon.com/api/data\");\n\n        // Return a successful response that we can identify\n        Response::builder()\n            .status(StatusCode::OK)\n            .body(\"proxied response from mock server\".to_string())\n            .unwrap()\n    })\n    .await;\n\n    // Configure connector with HTTP proxy\n    let proxy_config = ProxyConfig::http(format!(\"http://{}\", mock_proxy.addr())).unwrap();\n\n    // Make an HTTP request through the proxy - use safe domain\n    let target_url = \"http://aws.amazon.com/api/data\";\n    let result = make_http_request_through_proxy(proxy_config, target_url).await;\n\n    let (status, body) = result.expect(\"HTTP request through proxy should succeed\");\n\n    assert_eq!(status, StatusCode::OK);\n    assert_eq!(body, \"proxied response from mock server\");\n\n    // Verify the mock proxy received the expected request\n    let requests = mock_proxy.requests();\n    assert_eq!(requests.len(), 1);\n    assert_eq!(requests[0].method, \"GET\");\n    assert_eq!(requests[0].uri, target_url);\n}\n\n#[tokio::test]\nasync fn test_proxy_authentication() {\n    // Create a mock proxy that requires authentication\n    let mock_proxy = MockProxyServer::with_auth_validation(\"testuser\", \"testpass\").await;\n\n    // Configure connector with authenticated proxy\n    let proxy_config = ProxyConfig::http(format!(\"http://{}\", mock_proxy.addr()))\n        .unwrap()\n        .with_basic_auth(\"testuser\", \"testpass\");\n\n    // Make request through authenticated proxy - use safe domain\n    let target_url = \"http://aws.amazon.com/protected/resource\";\n    let result = make_http_request_through_proxy(proxy_config, target_url).await;\n\n    let (status, body) = result.expect(\"Authenticated proxy request should succeed\");\n\n    assert_eq!(status, StatusCode::OK);\n    assert_eq!(body, \"authenticated\");\n\n    // Verify the proxy received the request with correct auth\n    let requests = mock_proxy.requests();\n    assert_eq!(requests.len(), 1);\n\n    let expected_auth = format!(\n        \"Basic {}\",\n        base64::prelude::BASE64_STANDARD.encode(\"testuser:testpass\")\n    );\n    assert_eq!(\n        requests[0].headers.get(\"proxy-authorization\"),\n        Some(&expected_auth)\n    );\n}\n\n/// Tests URL-embedded proxy authentication (http://user:pass@proxy.com format)\n/// Verifies that credentials in the proxy URL are properly extracted and used\n#[tokio::test]\nasync fn test_proxy_url_embedded_auth() {\n    let mock_proxy = MockProxyServer::with_auth_validation(\"urluser\", \"urlpass\").await;\n\n    // Configure proxy with credentials embedded in URL\n    let proxy_url = format!(\"http://urluser:urlpass@{}\", mock_proxy.addr());\n    let proxy_config = ProxyConfig::http(proxy_url).unwrap();\n\n    // Make request through proxy with URL-embedded auth\n    let target_url = \"http://aws.amazon.com/api/test\";\n    let result = make_http_request_through_proxy(proxy_config, target_url).await;\n\n    let (status, body) = result.expect(\"URL-embedded auth proxy request should succeed\");\n    assert_eq!(status, StatusCode::OK);\n    assert_eq!(body, \"authenticated\");\n\n    // Verify the proxy received the request with correct auth\n    let requests = mock_proxy.requests();\n    assert_eq!(requests.len(), 1);\n\n    let expected_auth = format!(\n        \"Basic {}\",\n        base64::prelude::BASE64_STANDARD.encode(\"urluser:urlpass\")\n    );\n    assert_eq!(\n        requests[0].headers.get(\"proxy-authorization\"),\n        Some(&expected_auth)\n    );\n}\n\n/// Tests authentication precedence: URL-embedded credentials should take precedence over programmatic auth\n/// Verifies that when both URL auth and with_basic_auth() are provided, URL auth wins\n#[tokio::test]\nasync fn test_proxy_auth_precedence() {\n    let mock_proxy = MockProxyServer::with_auth_validation(\"urluser\", \"urlpass\").await;\n\n    // Configure proxy with URL-embedded auth AND programmatic auth\n    // URL auth should take precedence\n    let proxy_url = format!(\"http://urluser:urlpass@{}\", mock_proxy.addr());\n    let proxy_config = ProxyConfig::http(proxy_url)\n        .unwrap()\n        .with_basic_auth(\"programmatic\", \"auth\"); // This should be ignored\n\n    // Make request - should use URL-embedded auth, not programmatic auth\n    let target_url = \"http://aws.amazon.com/precedence/test\";\n    let result = make_http_request_through_proxy(proxy_config, target_url).await;\n\n    let (status, body) = result.expect(\"Auth precedence test should succeed\");\n    assert_eq!(status, StatusCode::OK);\n    assert_eq!(body, \"authenticated\");\n\n    // Verify the proxy received the request with URL-embedded auth (not programmatic)\n    let requests = mock_proxy.requests();\n    assert_eq!(requests.len(), 1);\n\n    let expected_auth = format!(\n        \"Basic {}\",\n        base64::prelude::BASE64_STANDARD.encode(\"urluser:urlpass\")\n    );\n    assert_eq!(\n        requests[0].headers.get(\"proxy-authorization\"),\n        Some(&expected_auth)\n    );\n}\n\n#[tokio::test]\nasync fn test_proxy_from_environment_variables() {\n    let mock_proxy = MockProxyServer::with_response(StatusCode::OK, \"env proxy response\").await;\n\n    with_env_vars(\n        &[\n            (\"HTTP_PROXY\", &format!(\"http://{}\", mock_proxy.addr())),\n            (\"NO_PROXY\", \"localhost,127.0.0.1\"),\n        ],\n        || async {\n            // Create connector with environment-based proxy config\n            let proxy_config = ProxyConfig::from_env();\n\n            // Make request through environment-configured proxy\n            let target_url = \"http://aws.amazon.com/v1/data\";\n            let result = make_http_request_through_proxy(proxy_config, target_url).await;\n\n            let (status, body) = result.expect(\"Environment proxy request should succeed\");\n\n            assert_eq!(status, StatusCode::OK);\n            assert_eq!(body, \"env proxy response\");\n\n            // Verify the proxy received the request\n            let requests = mock_proxy.requests();\n            assert_eq!(requests.len(), 1);\n            assert_eq!(requests[0].uri, target_url);\n        },\n    )\n    .await;\n}\n\n/// Tests that NO_PROXY bypass rules work correctly\n/// Verifies that requests to bypassed hosts do not go through the proxy\n#[tokio::test]\nasync fn test_no_proxy_bypass_rules() {\n    let mock_proxy = MockProxyServer::with_response(StatusCode::OK, \"should not reach here\").await;\n\n    // Create a second mock server that will act as the \"direct\" target\n    let direct_server = MockProxyServer::with_response(StatusCode::OK, \"direct connection\").await;\n\n    // Configure proxy with NO_PROXY rules that include the direct server's address\n    // Use just the IP address for the NO_PROXY rule\n    let direct_ip = \"127.0.0.1\";\n    let proxy_config = ProxyConfig::http(format!(\"http://{}\", mock_proxy.addr()))\n        .unwrap()\n        .no_proxy(direct_ip);\n\n    // Make request to the direct server (should bypass proxy due to NO_PROXY rule)\n    let result = make_http_request_through_proxy(\n        proxy_config,\n        &format!(\"http://{}/test\", direct_server.addr()),\n    )\n    .await;\n\n    let (status, body) = result.expect(\"Direct connection should succeed\");\n    assert_eq!(status, StatusCode::OK);\n    assert_eq!(body, \"direct connection\");\n\n    // Verify the mock proxy received no requests (bypassed)\n    let proxy_requests = mock_proxy.requests();\n    assert_eq!(\n        proxy_requests.len(),\n        0,\n        \"Proxy should not have received any requests due to NO_PROXY bypass\"\n    );\n\n    // Verify the direct server received the request\n    let direct_requests = direct_server.requests();\n    assert_eq!(\n        direct_requests.len(),\n        1,\n        \"Direct server should have received the request\"\n    );\n}\n\n/// Tests that disabled proxy configuration results in direct connections\n/// Verifies that ProxyConfig::disabled() bypasses all proxy logic\n#[tokio::test]\nasync fn test_proxy_disabled() {\n    // Create a direct target server\n    let direct_server = MockProxyServer::with_response(StatusCode::OK, \"direct connection\").await;\n\n    // Create a disabled proxy configuration\n    let proxy_config = ProxyConfig::disabled();\n\n    // Make request with disabled proxy (should go direct to our mock server)\n    let result = make_http_request_through_proxy(\n        proxy_config,\n        &format!(\"http://{}/get\", direct_server.addr()),\n    )\n    .await;\n\n    let (status, body) = result.expect(\"Direct connection should succeed\");\n    assert_eq!(status, StatusCode::OK);\n    assert_eq!(body, \"direct connection\");\n\n    // Verify the direct server received the request\n    let requests = direct_server.requests();\n    assert_eq!(\n        requests.len(),\n        1,\n        \"Direct server should have received the request\"\n    );\n    assert_eq!(requests[0].method, \"GET\");\n    // For direct connections, the URI might be just the path part\n    assert!(\n        requests[0].uri == format!(\"http://{}/get\", direct_server.addr())\n            || requests[0].uri == \"/get\",\n        \"URI should be either full URL or path, got: {}\",\n        requests[0].uri\n    );\n}\n\n/// Tests HTTPS-only proxy configuration\n/// Verifies that HTTP requests bypass HTTPS-only proxies\n#[tokio::test]\nasync fn test_https_proxy_configuration() {\n    let mock_proxy = MockProxyServer::with_response(StatusCode::OK, \"https proxy response\").await;\n\n    // Create a direct target server for HTTP requests\n    let direct_server =\n        MockProxyServer::with_response(StatusCode::OK, \"direct http connection\").await;\n\n    // Configure HTTPS-only proxy\n    let proxy_config = ProxyConfig::https(format!(\"http://{}\", mock_proxy.addr())).unwrap();\n\n    // Test: HTTP request should NOT go through HTTPS-only proxy, should go direct\n    let target_url = format!(\"http://{}/api\", direct_server.addr());\n    let result = make_http_request_through_proxy(proxy_config.clone(), &target_url).await;\n\n    // The HTTP request should succeed by going directly to our mock server\n    let (status, body) = result.expect(\"HTTP request should succeed via direct connection\");\n    assert_eq!(status, StatusCode::OK);\n    assert_eq!(body, \"direct http connection\");\n\n    // Verify the HTTPS-only proxy received no requests\n    let proxy_requests = mock_proxy.requests();\n    assert_eq!(\n        proxy_requests.len(),\n        0,\n        \"HTTP request should not go through HTTPS-only proxy\"\n    );\n\n    // Verify the direct server received the request\n    let direct_requests = direct_server.requests();\n    assert_eq!(\n        direct_requests.len(),\n        1,\n        \"Direct server should have received the HTTP request\"\n    );\n}\n\n/// Tests all-traffic proxy configuration\n/// Verifies that both HTTP and HTTPS requests go through all-traffic proxies\n#[tokio::test]\nasync fn test_all_traffic_proxy() {\n    let mock_proxy = MockProxyServer::with_response(StatusCode::OK, \"all traffic proxy\").await;\n\n    // Configure proxy for all traffic\n    let proxy_config = ProxyConfig::all(format!(\"http://{}\", mock_proxy.addr())).unwrap();\n\n    // HTTP request should go through the proxy\n    let target_url = \"http://aws.amazon.com/api/endpoint\";\n    let result = make_http_request_through_proxy(proxy_config.clone(), target_url).await;\n\n    let (status, body) = result.expect(\"HTTP request through all-traffic proxy should succeed\");\n    assert_eq!(status, StatusCode::OK);\n    assert_eq!(body, \"all traffic proxy\");\n\n    // Verify the proxy received the HTTP request\n    let requests = mock_proxy.requests();\n    assert_eq!(\n        requests.len(),\n        1,\n        \"Proxy should have received exactly one request\"\n    );\n    assert_eq!(requests[0].method, \"GET\");\n    assert_eq!(requests[0].uri, target_url);\n}\n\n/// Tests proxy connection failure handling\n/// Verifies that unreachable proxy servers result in appropriate connection errors\n#[tokio::test]\nasync fn test_proxy_connection_failure() {\n    // Configure proxy pointing to non-existent server\n    let proxy_config = ProxyConfig::http(\"http://127.0.0.1:1\").unwrap(); // Port 1 should be unavailable\n\n    // Make request through non-existent proxy - use a safe domain that won't cause issues\n    let target_url = \"http://aws.amazon.com/api/test\";\n    let result = make_http_request_through_proxy(proxy_config, target_url).await;\n\n    // The request should fail with a connection error\n    assert!(\n        result.is_err(),\n        \"Request should fail when proxy is unreachable\"\n    );\n\n    let error = result.unwrap_err();\n    let error_msg = error.to_string().to_lowercase();\n\n    // Verify it's a connection-related error (not a different kind of error)\n    assert!(\n        error_msg.contains(\"connection\")\n            || error_msg.contains(\"refused\")\n            || error_msg.contains(\"unreachable\")\n            || error_msg.contains(\"timeout\")\n            || error_msg.contains(\"connect\")\n            || error_msg.contains(\"io error\"), // Include generic IO errors\n        \"Error should be connection-related, got: {}\",\n        error\n    );\n}\n\n/// Tests proxy authentication failure handling\n/// Verifies that incorrect proxy credentials result in 407 Proxy Authentication Required\n#[tokio::test]\nasync fn test_proxy_authentication_failure() {\n    let mock_proxy = MockProxyServer::with_auth_validation(\"correct\", \"password\").await;\n\n    // Configure proxy with wrong credentials\n    let proxy_config = ProxyConfig::http(format!(\"http://{}\", mock_proxy.addr()))\n        .unwrap()\n        .with_basic_auth(\"wrong\", \"credentials\");\n\n    // Make request with wrong credentials - use safe domain\n    let target_url = \"http://aws.amazon.com/secure/api\";\n    let result = make_http_request_through_proxy(proxy_config, target_url).await;\n\n    // The request should return 407 Proxy Authentication Required\n    let (status, _body) = result.expect(\"Request should complete (even with auth failure)\");\n    assert_eq!(status, StatusCode::PROXY_AUTHENTICATION_REQUIRED);\n\n    // Verify the proxy received the request (even though auth failed)\n    let requests = mock_proxy.requests();\n    assert_eq!(requests.len(), 1, \"Proxy should have received the request\");\n\n    // Verify the wrong credentials were sent\n    let expected_wrong_auth = format!(\n        \"Basic {}\",\n        base64::prelude::BASE64_STANDARD.encode(\"wrong:credentials\")\n    );\n    assert_eq!(\n        requests[0].headers.get(\"proxy-authorization\"),\n        Some(&expected_wrong_auth)\n    );\n}\n\n/// Tests that ProxyConfig::disabled() overrides environment proxy settings\n/// Verifies that explicit proxy disabling takes precedence over environment variables\n#[tokio::test]\nasync fn test_explicit_proxy_disable_overrides_environment() {\n    let mock_proxy = MockProxyServer::new(|_req| {\n        panic!(\"Request should not reach proxy when explicitly disabled\");\n    })\n    .await;\n\n    // Create a direct target server\n    let direct_server = MockProxyServer::with_response(StatusCode::OK, \"direct connection\").await;\n\n    with_env_vars(\n        &[(\"HTTP_PROXY\", &format!(\"http://{}\", mock_proxy.addr()))],\n        || async {\n            // Create connector with explicitly disabled proxy (should override environment)\n            let proxy_config = ProxyConfig::disabled();\n\n            // Make request - should go direct despite HTTP_PROXY environment variable\n            let target_url = format!(\"http://{}/test\", direct_server.addr());\n            let result = make_http_request_through_proxy(proxy_config, &target_url).await;\n\n            let (status, body) = result.expect(\"Direct connection should succeed\");\n            assert_eq!(status, StatusCode::OK);\n            assert_eq!(body, \"direct connection\");\n\n            // Verify the proxy received no requests (disabled)\n            let proxy_requests = mock_proxy.requests();\n            assert_eq!(\n                proxy_requests.len(),\n                0,\n                \"Proxy should not receive requests when explicitly disabled\"\n            );\n\n            // Verify the direct server received the request\n            let direct_requests = direct_server.requests();\n            assert_eq!(\n                direct_requests.len(),\n                1,\n                \"Direct server should have received the request\"\n            );\n        },\n    )\n    .await;\n}\n\n// ================================================================================================\n// HTTPS/CONNECT Tunneling Tests\n// ================================================================================================\n//\n// These tests are for HTTPS tunneling through HTTP proxies using the CONNECT method.\n\n/// Helper function to make HTTPS requests through proxy using TLS providers\n/// This is similar to make_http_request_through_proxy but uses TLS-enabled connectors\nasync fn make_https_request_through_proxy(\n    proxy_config: ProxyConfig,\n    target_url: &str,\n    tls_provider: tls::Provider,\n) -> Result<(StatusCode, String), Box<dyn std::error::Error + Send + Sync>> {\n    let http_client = http_client_fn(move |settings, _components| {\n        let connector = Connector::builder()\n            .proxy_config(proxy_config.clone())\n            .connector_settings(settings.clone())\n            .tls_provider(tls_provider.clone())\n            .build();\n\n        aws_smithy_runtime_api::client::http::SharedHttpConnector::new(connector)\n    });\n\n    let connector_settings = HttpConnectorSettings::builder().build();\n    let runtime_components = RuntimeComponentsBuilder::for_tests()\n        .with_time_source(Some(SystemTimeSource::new()))\n        .build()\n        .unwrap();\n\n    let http_connector = http_client.http_connector(&connector_settings, &runtime_components);\n\n    let request = HttpRequest::get(target_url)\n        .map_err(|e| Box::new(e) as Box<dyn std::error::Error + Send + Sync>)?;\n\n    let response = http_connector.call(request).await?;\n\n    let status = response.status();\n    let body_bytes = response.into_body().collect().await?.to_bytes();\n    let body_string = String::from_utf8(body_bytes.to_vec())?;\n\n    Ok((status.into(), body_string))\n}\n\n/// Generic test function for HTTPS CONNECT with authentication\n/// Tests that HTTPS requests through HTTP proxy use CONNECT method with proper auth headers\nasync fn run_https_connect_with_auth_test(tls_provider: tls::Provider, provider_name: &str) {\n    let mock_proxy = MockProxyServer::new(|req| {\n        // For HTTPS through HTTP proxy, we should see a CONNECT request\n        assert_eq!(req.method, \"CONNECT\");\n        assert_eq!(req.uri, \"secure.aws.amazon.com:443\");\n\n        // Verify authentication header is present\n        let expected_auth = format!(\n            \"Basic {}\",\n            base64::prelude::BASE64_STANDARD.encode(\"connectuser:connectpass\")\n        );\n        assert_eq!(req.headers.get(\"proxy-authorization\"), Some(&expected_auth));\n\n        // Return 400 to avoid dealing with actual TLS tunneling\n        // The important part is that we got the CONNECT request with correct auth\n        Response::builder()\n            .status(StatusCode::BAD_REQUEST)\n            .body(\"CONNECT tunnel setup failed\".to_string())\n            .unwrap()\n    })\n    .await;\n\n    // Configure proxy with authentication\n    let proxy_config = ProxyConfig::all(format!(\"http://{}\", mock_proxy.addr()))\n        .unwrap()\n        .with_basic_auth(\"connectuser\", \"connectpass\");\n\n    // Make HTTPS request - should trigger CONNECT method\n    let target_url = \"https://secure.aws.amazon.com/api/secure\";\n    let result = make_https_request_through_proxy(proxy_config, target_url, tls_provider).await;\n\n    // We expect this to fail with a connection error since we returned 400\n    // The important thing is that the CONNECT request was made correctly\n    assert!(\n        result.is_err(),\n        \"CONNECT tunnel should fail with 400 response for {}\",\n        provider_name\n    );\n\n    // Verify the proxy received the CONNECT request\n    let requests = mock_proxy.requests();\n    assert_eq!(\n        requests.len(),\n        1,\n        \"Proxy should have received exactly one CONNECT request for {}\",\n        provider_name\n    );\n}\n\n/// Generic test function for CONNECT without authentication (should get 407)\n/// Tests that HTTPS requests without auth get proper 407 response\nasync fn run_https_connect_auth_required_test(tls_provider: tls::Provider, provider_name: &str) {\n    let mock_proxy = MockProxyServer::new(|req| {\n        // For HTTPS through HTTP proxy, we should see a CONNECT request\n        assert_eq!(req.method, \"CONNECT\");\n        assert_eq!(req.uri, \"secure.aws.amazon.com:443\");\n\n        // No auth header should be present\n        assert!(!req.headers.contains_key(\"proxy-authorization\"));\n\n        // Return 407 Proxy Authentication Required\n        Response::builder()\n            .status(StatusCode::PROXY_AUTHENTICATION_REQUIRED)\n            .body(\"Proxy authentication required for CONNECT\".to_string())\n            .unwrap()\n    })\n    .await;\n\n    // Configure proxy without authentication\n    let proxy_config = ProxyConfig::all(format!(\"http://{}\", mock_proxy.addr())).unwrap();\n\n    // Make HTTPS request - should trigger CONNECT method and get 407\n    let target_url = \"https://secure.aws.amazon.com/api/secure\";\n    let result = make_https_request_through_proxy(proxy_config, target_url, tls_provider).await;\n\n    // We expect this to fail with a connection error since we returned 407\n    assert!(\n        result.is_err(),\n        \"CONNECT tunnel should fail with 407 response for {}\",\n        provider_name\n    );\n\n    let error_msg = result.unwrap_err().to_string();\n    let error_msg_lower = error_msg.to_lowercase();\n\n    // The important thing is that the request failed (which means CONNECT was attempted)\n    // The specific error message format is less critical for this test\n    // We accept either specific proxy auth errors OR generic connection errors\n    // since both indicate the CONNECT tunnel attempt was made\n    assert!(\n        error_msg_lower.contains(\"407\")\n            || error_msg_lower.contains(\"proxy\")\n            || error_msg_lower.contains(\"auth\")\n            || error_msg_lower.contains(\"io error\")\n            || error_msg_lower.contains(\"connection\"),\n        \"Error should be connection-related (indicating CONNECT was attempted) for {}, got: {}\",\n        provider_name,\n        error_msg\n    );\n\n    // Verify the proxy received the CONNECT request\n    let requests = mock_proxy.requests();\n    assert_eq!(\n        requests.len(),\n        1,\n        \"Proxy should have received exactly one CONNECT request for {}\",\n        provider_name\n    );\n}\n\n/// Tests HTTPS tunneling through HTTP proxy with CONNECT method (rustls provider)\n/// Verifies that HTTPS requests through HTTP proxy use CONNECT method with authentication\n#[cfg(feature = \"rustls-ring\")]\n#[tokio::test]\nasync fn test_https_connect_with_auth_rustls() {\n    run_https_connect_with_auth_test(\n        tls::Provider::rustls(tls::rustls_provider::CryptoMode::Ring),\n        \"rustls\",\n    )\n    .await;\n}\n\n/// Tests CONNECT method without authentication (should get 407) - rustls provider\n/// Verifies that HTTPS requests without auth get proper 407 response\n#[cfg(feature = \"rustls-ring\")]\n#[tokio::test]\nasync fn test_https_connect_auth_required_rustls() {\n    run_https_connect_auth_required_test(\n        tls::Provider::rustls(tls::rustls_provider::CryptoMode::Ring),\n        \"rustls\",\n    )\n    .await;\n}\n\n/// Tests HTTPS tunneling through HTTP proxy with CONNECT method (s2n-tls provider)\n/// Verifies that HTTPS requests through HTTP proxy use CONNECT method with authentication\n#[cfg(feature = \"s2n-tls\")]\n#[tokio::test]\nasync fn test_https_connect_with_auth_s2n_tls() {\n    run_https_connect_with_auth_test(tls::Provider::S2nTls, \"s2n-tls\").await;\n}\n\n/// Tests CONNECT method without authentication (should get 407) - s2n-tls provider\n/// Verifies that HTTPS requests without auth get proper 407 response\n#[cfg(feature = \"s2n-tls\")]\n#[tokio::test]\nasync fn test_https_connect_auth_required_s2n_tls() {\n    run_https_connect_auth_required_test(tls::Provider::S2nTls, \"s2n-tls\").await;\n}\n\n/// Tests that HTTP requests through proxy use absolute URI form\n/// Verifies that the full URL (including hostname) is sent to the proxy\n#[tokio::test]\nasync fn test_http_proxy_absolute_uri_form() {\n    let target_host = \"api.example.com\";\n    let target_path = \"/v1/data\";\n    let expected_absolute_uri = format!(\"http://{}{}\", target_host, target_path);\n\n    // Clone for use in closure\n    let expected_uri_clone = expected_absolute_uri.clone();\n    let target_host_clone = target_host.to_string();\n\n    let mock_proxy = MockProxyServer::new(move |req| {\n        // For HTTP through proxy, we should see the full absolute URI\n        assert_eq!(req.method, \"GET\");\n        assert_eq!(req.uri, expected_uri_clone);\n\n        // Host header should still be present\n        assert_eq!(req.headers.get(\"host\"), Some(&target_host_clone));\n\n        Response::builder()\n            .status(StatusCode::OK)\n            .body(\"proxied response\".to_string())\n            .unwrap()\n    })\n    .await;\n\n    let proxy_config = ProxyConfig::http(format!(\"http://{}\", mock_proxy.addr())).unwrap();\n\n    let result = make_http_request_through_proxy(proxy_config, &expected_absolute_uri).await;\n\n    let (status, body) = result.expect(\"HTTP request through proxy should succeed\");\n    assert_eq!(status, StatusCode::OK);\n    assert_eq!(body, \"proxied response\");\n\n    // Verify the proxy received the request with absolute URI\n    let requests = mock_proxy.requests();\n    assert_eq!(requests.len(), 1);\n    assert_eq!(requests[0].uri, expected_absolute_uri);\n}\n\n/// Tests that direct HTTP requests (no proxy) use origin form URI\n/// Verifies that only the path is sent when connecting directly\n#[tokio::test]\nasync fn test_direct_http_origin_uri_form() {\n    let target_path = \"/v1/data\";\n\n    // Create a direct target server (no proxy)\n    let direct_server = MockProxyServer::new(move |req| {\n        // For direct connections, we should see only the path (origin form)\n        assert_eq!(req.method, \"GET\");\n        // The URI should be just the path part, not the full URL\n        assert!(\n            req.uri == target_path || req.uri.ends_with(target_path),\n            \"Expected origin form URI ending with '{}', got '{}'\",\n            target_path,\n            req.uri\n        );\n\n        Response::builder()\n            .status(StatusCode::OK)\n            .body(\"direct response\".to_string())\n            .unwrap()\n    })\n    .await;\n\n    // Use disabled proxy to ensure direct connection\n    let proxy_config = ProxyConfig::disabled();\n\n    let target_url = format!(\"http://{}{}\", direct_server.addr(), target_path);\n    let result = make_http_request_through_proxy(proxy_config, &target_url).await;\n\n    let (status, body) = result.expect(\"Direct HTTP request should succeed\");\n    assert_eq!(status, StatusCode::OK);\n    assert_eq!(body, \"direct response\");\n\n    // Verify the server received the request\n    let requests = direct_server.requests();\n    assert_eq!(requests.len(), 1);\n}\n\n/// Tests URI form handling with different proxy configurations\n/// Verifies that URI form changes based on proxy vs direct connection\n#[tokio::test]\nasync fn test_uri_form_proxy_vs_direct() {\n    let target_host = \"test.example.com\";\n    let target_path = \"/api/test\";\n    let full_url = format!(\"http://{}{}\", target_host, target_path);\n\n    // Test 1: Through proxy - should use absolute form\n    {\n        // Clone for use in closure\n        let target_host_clone = target_host.to_string();\n        let target_path_clone = target_path.to_string();\n\n        let mock_proxy = MockProxyServer::new(move |req| {\n            // Should receive absolute URI\n            assert!(req.uri.starts_with(\"http://\"));\n            assert!(req.uri.contains(&target_host_clone));\n            assert!(req.uri.contains(&target_path_clone));\n\n            Response::builder()\n                .status(StatusCode::OK)\n                .body(\"proxy response\".to_string())\n                .unwrap()\n        })\n        .await;\n\n        let proxy_config = ProxyConfig::http(format!(\"http://{}\", mock_proxy.addr())).unwrap();\n        let result = make_http_request_through_proxy(proxy_config, &full_url).await;\n\n        assert!(result.is_ok(), \"Proxy request should succeed\");\n        let requests = mock_proxy.requests();\n        assert_eq!(requests.len(), 1);\n        assert_eq!(requests[0].uri, full_url);\n    }\n\n    // Test 2: Direct connection - should use origin form\n    {\n        let target_path_clone = target_path.to_string();\n\n        let direct_server = MockProxyServer::new(move |req| {\n            // Should receive only the path part\n            assert!(!req.uri.starts_with(\"http://\"));\n            assert!(req.uri == target_path_clone || req.uri.ends_with(&target_path_clone));\n\n            Response::builder()\n                .status(StatusCode::OK)\n                .body(\"direct response\".to_string())\n                .unwrap()\n        })\n        .await;\n\n        let proxy_config = ProxyConfig::disabled();\n        let direct_url = format!(\"http://{}{}\", direct_server.addr(), target_path);\n        let result = make_http_request_through_proxy(proxy_config, &direct_url).await;\n\n        assert!(result.is_ok(), \"Direct request should succeed\");\n        let requests = direct_server.requests();\n        assert_eq!(requests.len(), 1);\n    }\n}\n\n/// Generic test function for CONNECT URI form validation\n/// Tests that CONNECT requests use the correct host:port format\nasync fn run_connect_uri_form_test(tls_provider: tls::Provider, provider_name: &str) {\n    let target_host = \"secure.example.com\";\n    let target_port = 443;\n    let expected_connect_uri = format!(\"{}:{}\", target_host, target_port);\n\n    // Clone for use in closure\n    let expected_uri_clone = expected_connect_uri.clone();\n\n    let mock_proxy = MockProxyServer::new(move |req| {\n        if req.method == \"CONNECT\" {\n            // CONNECT should use host:port format\n            assert_eq!(req.uri, expected_uri_clone);\n\n            // CONNECT requests should not have a Host header in the CONNECT line\n            // (the Host header is for the tunneled HTTP request, not the CONNECT)\n\n            Response::builder()\n                .status(StatusCode::OK)\n                .body(\"Connection established\".to_string())\n                .unwrap()\n        } else {\n            // This shouldn't happen in our test, but handle it gracefully\n            Response::builder()\n                .status(StatusCode::BAD_REQUEST)\n                .body(\"Unexpected non-CONNECT request\".to_string())\n                .unwrap()\n        }\n    })\n    .await;\n\n    let proxy_config = ProxyConfig::all(format!(\"http://{}\", mock_proxy.addr())).unwrap();\n\n    // Try to make an HTTPS request - this should trigger CONNECT\n    let target_url = format!(\"https://{}/api/secure\", target_host);\n\n    let _result = make_https_request_through_proxy(proxy_config, &target_url, tls_provider).await;\n\n    // The request will likely fail due to our mock setup, but that's OK\n    // The important thing is that the CONNECT request was made with correct URI\n    let requests = mock_proxy.requests();\n    assert_eq!(\n        requests.len(),\n        1,\n        \"Should have received exactly one CONNECT request for {}\",\n        provider_name\n    );\n    assert_eq!(requests[0].method, \"CONNECT\");\n    assert_eq!(requests[0].uri, expected_connect_uri);\n}\n\n/// Tests CONNECT method URI form for HTTPS tunneling - rustls provider\n/// Verifies that CONNECT requests use the correct host:port format\n#[cfg(feature = \"rustls-ring\")]\n#[tokio::test]\nasync fn test_connect_uri_form_rustls() {\n    run_connect_uri_form_test(\n        tls::Provider::rustls(tls::rustls_provider::CryptoMode::Ring),\n        \"rustls\",\n    )\n    .await;\n}\n\n/// Tests CONNECT method URI form for HTTPS tunneling - s2n-tls provider\n/// Verifies that CONNECT requests use the correct host:port format\n#[cfg(feature = \"s2n-tls\")]\n#[tokio::test]\nasync fn test_connect_uri_form_s2n_tls() {\n    run_connect_uri_form_test(tls::Provider::S2nTls, \"s2n-tls\").await;\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-client/tests/regen-certificates.sh",
    "content": "#!/bin/bash\n#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\nset -xe\n\n# The files generated by this script are used in unit tests that create TLS\n# connections between a localhost server and client. Run this script if any\n# certificates used for tests are expired.\n\n# Files generated by this script:\n# server.rsa - private RSA server key\n# server.pem - certificate chain containing certificates [server, intermediate, CA]\n\n# generate the root CA certificate and key\nopenssl req -nodes \\\n          -x509 \\\n          -days 3650 \\\n          -newkey rsa:4096 \\\n          -keyout ca.key \\\n          -out ca.cert \\\n          -sha256 \\\n          -batch \\\n          -subj \"/CN=SDK RSA CA\"\n\n# generate intermediate authority cert and key\nopenssl req -nodes \\\n          -newkey rsa:3072 \\\n          -keyout inter.key \\\n          -out inter.req \\\n          -sha256 \\\n          -batch \\\n          -subj \"/CN=SDK RSA level 2 intermediate\"\n\n# generate key and signing request for server\nopenssl req -nodes \\\n          -newkey rsa:2048 \\\n          -keyout server.key \\\n          -out server.req \\\n          -sha256 \\\n          -batch \\\n          -subj \"/CN=sdktest.com\"\n\nopenssl rsa \\\n          -in server.key \\\n          -out server.rsa\n\n# sign intermediate cert with CA root\nopenssl x509 -req \\\n            -in inter.req \\\n            -out inter.cert \\\n            -CA ca.cert \\\n            -CAkey ca.key \\\n            -sha256 \\\n            -days 3650 \\\n            -set_serial 123 \\\n            -extensions v3_inter -extfile openssl.cnf\n\n# sign server cert with intermediate\nopenssl x509 -req \\\n            -in server.req \\\n            -out server.cert \\\n            -CA inter.cert \\\n            -CAkey inter.key \\\n            -sha256 \\\n            -days 2000 \\\n            -set_serial 456 \\\n            -extensions v3_end -extfile openssl.cnf\n\ncat server.cert inter.cert ca.cert > server.pem\nrm *.key *.cert *.req\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-client/tests/server.pem",
    "content": "-----BEGIN CERTIFICATE-----\nMIID2TCCAkGgAwIBAgICAcgwDQYJKoZIhvcNAQELBQAwJzElMCMGA1UEAwwcU0RL\nIFJTQSBsZXZlbCAyIGludGVybWVkaWF0ZTAeFw0yNTAyMTkxNDUzMDJaFw0zMDA4\nMTIxNDUzMDJaMBYxFDASBgNVBAMMC3Nka3Rlc3QuY29tMIIBIjANBgkqhkiG9w0B\nAQEFAAOCAQ8AMIIBCgKCAQEAq0qAhLP/7uVfR5zv8d41eciCEco2kKjqoN9NlUy8\nxt8fNUFvFdSqEsrPMyycyfPg9HBhJHhCBtVQSxmr/y/IEkvbf5P5aq2CnVKKMjGm\nxlqUm+mHmtDYZkJp/2nnK3ZFm9/b1oqs6XvfEJ3R2eqFf454a8SRHX1gVdj+LFnm\nEVfUkVBSZCMJm9EOL9HL2I6tDPzXvJpEZMzu/pHouMNeSBBeQDGQN7vZo36cb2wG\nPCTwHCh/DjZpKtJK8eKRDipIbjQr3upNbLxva36/V70xM6rTy9ac+GT/IUh0Dh0q\nnXgjntez5grtlz4DrQBBhNhGAAliOTGvk74kPjzHYFy8FQIDAQABo4GfMIGcMAwG\nA1UdEwEB/wQCMAAwCwYDVR0PBAQDAgbAMB0GA1UdDgQWBBTF0O0/x6KcdOoqlv0T\n//HVFq2RODA9BgNVHSMENjA0gBQFk2G/rf1Iob6rw0H6lQ/uzbfLaKEZpBcwFTET\nMBEGA1UEAwwKU0RLIFJTQSBDQYIBezAhBgNVHREEGjAYggtzZGt0ZXN0LmNvbYIJ\nbG9jYWxob3N0MA0GCSqGSIb3DQEBCwUAA4IBgQAHDCVmgHAuUkJCyNJefN+GLj9s\nhCzoSScWSSuyUTOP+N2cT9SOIyjdBb0uLaj4E/Casf/fEvqd/qSz2pBZtXXG3udP\nNOfO7ZXOuAW/DqMKL7B/JYvybr2ugJefB7+fVqEdJ/lKZ6DT517nO+V9BRZRrcyR\nvx5gM4j46p2qkN9yiAvimE37hBUIkjKCdejXA4IVr90Z6kG2yGo1XIFp8fDAEoSm\nu5h5ftuyGvy3kXg8e1quVs38yeh3Vcxk60g8MpFrbUBZjYd3mBN0wnQAOmsK592k\n3mEJIDN5NfFvuap/Tl0SAqsP7vfIy7t3Wu5aJoH5VlepmKOhHVnbwhd61pd2ZeHs\nzvo8dLsfgowGiSItvdw+pg0PUsozXG0JH7o8igzEfIiRJ237pX8U1/Lr1v5fKYhL\npfZoGVfpH2oK6uUE4TzAK7bf9tGCKkvqx0MhvQ1Y6tjbp3l/+vxDTSgoo5Oh4XJ+\ngRxRIoosMVJffwwy+sbfMs5rqCTC7DrqHoFb+3I=\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIEtjCCAp6gAwIBAgIBezANBgkqhkiG9w0BAQsFADAVMRMwEQYDVQQDDApTREsg\nUlNBIENBMB4XDTI1MDIxOTE0NTMwMloXDTM1MDIxNzE0NTMwMlowJzElMCMGA1UE\nAwwcU0RLIFJTQSBsZXZlbCAyIGludGVybWVkaWF0ZTCCAaIwDQYJKoZIhvcNAQEB\nBQADggGPADCCAYoCggGBALpfp+sVFpcJxmK7v/aCL5R5sjWzfkwUABhYNWsk+26x\nioayPUZ3IMnKYvzGXmX2a6pjPJeP5HpFIvFnezac/tHHEk8zgATVGGbC1gO6aKT+\no1UYKICcwHuhwG6BZ3hoFqjuBY8wk+zIgV9pd+907E0oZOy+TutCtk3dHPBYYbJO\nNS8pQDw804ckKpEa34NQcLN9D3FBsgMXX6/pYyvzpD2fDgo6X6lDOWVZ31mtgmwP\njV6Be/y2r7Z/aA9fePfSTxSZnsNpwS5tkVwVG8v42ph7rVNJ/zaBsfXfCbbRV0q8\nHjJAzWGtXbPH4Ojj6MEOSjGK+rusIOZmqQAbvJ0fMH4soW5FjYWsngEuDYOrWRlB\nbkv4ixeMfaz8rwC0fkLIJWFOZnHt0nmVtEVsGRc0ndTrQDlaqIJq87cL0cYkqYZE\nvn2I0lmkIgna9OTCDbvBUaglYrxLe8e41OSvvcVrFmSxvx1GcWjuU1Q08P3JcBmP\n9uhhjW53TYoarFhKjrO+WQIDAQABo38wfTAdBgNVHQ4EFgQUBZNhv639SKG+q8NB\n+pUP7s23y2gwIAYDVR0lAQH/BBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMAwGA1Ud\nEwQFMAMBAf8wCwYDVR0PBAQDAgH+MB8GA1UdIwQYMBaAFOCtnMCd873GJzp4HbZs\nuuxho+wIMA0GCSqGSIb3DQEBCwUAA4ICAQBvCShvDdnp+pSRzK4sJS/AgElhIDVR\nQrFfnhOxElVWxXSYEXVegwj1qKhgM+de9k9eKH/dM7mr5Ry9N6GfTjtRuf4fDp8W\nZj6bnqQoNz1vTPmX5ymnEipRwg5BeQtfmHVf++uor4Ch6Xx5lp9mlyCkZqEgHKkz\nUietQNkZjalnIex/nBr+2kHD1dh2ZTefsTOHofnz+gsg3tNjjvzf+YMOw7aifQvI\n2uoQVDjb2FBq24LSpBAc9r2sU2CKHD4/4Ei11QRI29gNgOJiiUArAV6P13mdCVMY\nue92chdLg3/AYctAUXE7NXMXeqZdOlST65GgEg36tays3l7JqlF+FaPqzuJnB+kt\npzYDdt1pFxV0Ep8RsyWm7TbYsRVqzx0eueReVKQQBBjM2+8uD8X3bZB/0QtPknBo\n6x0S90g32BL4dPn/mHLLbKTNWPQ9dGmIBHvZocw5UxRYhiFLx+Wurw+V8CWmoU2g\nkEiTAaA/5jiZNR02sz6H7CC70FN0vHYREiivqvNMhLbmWxORrCL/TdmwdwfEMCT4\nozEzyGHFUVatCTUeiWxI2YXg1oNHLQU5gfy8gxfygNjG8r3A/L1SOoCsS2Cw/FcW\nLJXtCyJoVzM1oLSzPbvUpe4fbnhQ/5hcM2+Tfm2DsNb9RVLjbl5t6EUTuVwKP8us\ny0Qg67cAE/Grlw==\n-----END CERTIFICATE-----\n-----BEGIN CERTIFICATE-----\nMIIFCzCCAvOgAwIBAgIUbOKEL90YNxD9QGi6wIP6zs5AzCMwDQYJKoZIhvcNAQEL\nBQAwFTETMBEGA1UEAwwKU0RLIFJTQSBDQTAeFw0yNTAyMTkxNDUzMDFaFw0zNTAy\nMTcxNDUzMDFaMBUxEzARBgNVBAMMClNESyBSU0EgQ0EwggIiMA0GCSqGSIb3DQEB\nAQUAA4ICDwAwggIKAoICAQDKHnrAedyOnngswWm1oeOgcfjUHo4EMHMgTn6b6vnj\nKRV5idN9iIl0rI/QuyZeGcvEkarSZZMnkme1cnhOpLvelPEgCRqMI+02VodEpVer\n7i2QIxqpCzf2VfZMAQ5cNyuBeN+IS+FDViPge71eypmBnF1CHu5d9lfI8y8PVVfJ\nQRsP1M/bWCLIgGs7ZjHNt+cA+ZBTBHID66aXx4egW59MPBCq9SH9FC0PfvJqJjkU\nQNfiSCpn4XKYRraucQ9LChNlaJqu58HPnCMX+B9/g3MuQ9qCNUq7m/p4ILre0rcJ\nmz30RMGFXhyp+94DRwJBDUsWVny9fVhbMtSQKcGd51nBrrn1xcWC0+NNEWkf4VLt\nsp3OPOGw/b+njgshxOdi2oPmSumRhHmMC98nl7iWT41Hy/uvLuTpd8KStN/2VIFt\n7lsCRnPoIUezM34oZvsIiMsEm93AFPfQtWaKm/8GvSzGBHZ0ba8op9ZVL879yaSN\nB1oHrR6OzgpfiekB8Jg3OLFSxwtgDuKJeAiorFXMiSIfqZxBfzsOQCU4UhlY38xR\nSVYZMRxmHq06Mi9tVGak60RHV4opu9ixlm5sUbv0NliIzHbOHjry85z+iNSttjqu\nWv3w6jVeIHJcZeYHXZYNx8nGMWEI3JpVBNaF9ycvVpvV1hC5GM/Egn5qggpAjiL+\nuwIDAQABo1MwUTAdBgNVHQ4EFgQU4K2cwJ3zvcYnOngdtmy67GGj7AgwHwYDVR0j\nBBgwFoAU4K2cwJ3zvcYnOngdtmy67GGj7AgwDwYDVR0TAQH/BAUwAwEB/zANBgkq\nhkiG9w0BAQsFAAOCAgEAifwXv/ezBA8BbdV+7IcdA9R5Yz/fENQ8n5u8U0Mmpu2v\nmcGpuqJOQlH6Yr5cs0zS9BRmNaMYlVWNnJxMz/3m+uaqohiFf98SgxhT+RGFRohx\njSPI6jE19vKbi1RMvv8yf8DLIjnc8d5e8kOEWNleOarVtkpAhze5nyKVyYkIyyER\nzL2RKslmWzxsG0ae0HZ5T5U1voIUG5Y8WyE662egR7INLE3HMUklYljIUJNXClqe\nsMfDyvl735z8S93r7sRFv3x+2YZpIzJZGk0ZbyWxfpwAVfr+ktf01BZ+lASXCmDX\n94TPHswhoC4HQyxziyf2CLHvpnRczS57/bSVgatYELN4oU2sPicHqPTntrSA6Yhq\n+qswrShiF47MXZeiXrddjcWTRQZOs30dmBvTj7CufAYek7r+9KeK0j+ETs/yr5Q4\nNQd7/7kkS/4GIKx0uf/+WJJhMDD8qJfWlZDV4kZ+laz49ksjES19IPKoalugst06\nSquAqOCKiOQxWeD+QQvdUu9Yac8jNEt3th1z29MoJ02QHSrKe1CmFu7jXcgvWTVI\n1dhO2YJ4UNvGaFK3rWU8sDvgFnV6Hpw7y1YAgVYtterSPMAyAGdSFDvZKuo2Bq2N\njuj9U9BUS1Xrl1cj8RjpZ0g0gYYF+BX2qwDCqi9qkxHel/oCzG80QAY0dnM+JT4=\n-----END CERTIFICATE-----\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-client/tests/server.rsa",
    "content": "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCrSoCEs//u5V9H\nnO/x3jV5yIIRyjaQqOqg302VTLzG3x81QW8V1KoSys8zLJzJ8+D0cGEkeEIG1VBL\nGav/L8gSS9t/k/lqrYKdUooyMabGWpSb6Yea0NhmQmn/aecrdkWb39vWiqzpe98Q\nndHZ6oV/jnhrxJEdfWBV2P4sWeYRV9SRUFJkIwmb0Q4v0cvYjq0M/Ne8mkRkzO7+\nkei4w15IEF5AMZA3u9mjfpxvbAY8JPAcKH8ONmkq0krx4pEOKkhuNCve6k1svG9r\nfr9XvTEzqtPL1pz4ZP8hSHQOHSqdeCOe17PmCu2XPgOtAEGE2EYACWI5Ma+TviQ+\nPMdgXLwVAgMBAAECggEAIRG6myQXIpuE2BIL3vGr+E2GEwIro6UA2zsRQuQ0Q966\nqzDtTdUnWoZuFy6jPHgJc5eooX5YHPKc1ErqAlPKuAGOKGS8j+RcpZvUU1lznbLK\nIwmkZPax+JgU17st5p2oVa4TxqkyNcd06sPVSlF1IYmzZPbnnz5f1WMVuyFGAg3W\nCsFevfTtdpzgN8fWE6EnpSO1OY9Sa0xc+k94U6b1Coi2i6loUfKXP/iFStsGlDW3\nDkl2egptPHi4oDcUuobJrOFr61XgOrTrYlFOrzZOgykgzAEyKN/nF3q2vAIbZSPq\nMkJTw+TFGypVkMBmMTBb83CnaBWDmsicY1WJ4DjXAQKBgQDo8wgCNzNGDaqcFR2F\nZSYdqsGeSQzxjBnxnyMp/1ewb5cYFrE86ORXND7TfmJECJNEIhNLv5ytu8Z/cDsm\nenvwlotj8J+u0cVp3t916GEWyNBZaZM/40ivDxMCAWTeryleGbQ0ytmnDPOdPS93\n6tIImk6vKiyae3iM4eKx3o/hgQKBgQC8PZHcWrXt1OYOn/VrMeYfGp57HNeHddrA\nnoVIL5Ysx0pnAMhyZi69orJUYX9n1d0DwiXbagS1mTuqJK2t+0EUe5tKHalUY3Ew\nCL0XGskN3526l1CKzD/vFfx28Q3lGdpxwFSNIil+85hk8BMDAu6nvzVTWd0ol/Ll\nFmhIj2R8lQKBgQCMPsTzkIguBMxSa+P6C4uHEObAhPpl8hMshMKG5lPExWoR9pd+\nNDhEyA+LBOvkScVfn6Q+Vn3dms9GqiryX4t+rSP+Zz+74E8aDjQ6qEzLitrk+crN\nC+kWe9zVuEEiUBJ3tMHphrbC++kvIUcSyyzoQP5eNuXjm7JYHyZ8L6IwAQKBgCir\nKKsx0eJrP7TjLDOXmT8ZEipJBeuXM8avuN3qoghUmid8zNGib/C6iMqgMdVuKAza\n0jEAS7osO+67c+aFxP624cr2c5Hu1hJpoOiv+cYMjNg2Pslt7VYrKttLoxPfLQms\nYtgHDG4IFOGh2ImrBYKqVcwHOze89FY4LBmZGT2tAoGADKA9beP/o5vXu2BmdEPF\nc4XUb5gvbI7Zv7xhF6CGOsryBkz8yF5WaAreNcG1uwPzqAyV6kk6Fgaa7XDa9Mhf\n3QMe/ncGWI3NjQaB6E+7rJMQ/UDIr4Cs5ThZMkXvrR9GPhpULQi3iPepcIT79Jvn\no40e3/lYe5+59N2kVfwac0U=\n-----END PRIVATE KEY-----\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-client/tests/smoke_test_clients.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n#![cfg(any(\n    feature = \"rustls-ring\",\n    feature = \"rustls-aws-lc\",\n    feature = \"rustls-aws-lc-fips\",\n    feature = \"s2n-tls\",\n))]\n\nuse aws_smithy_async::time::SystemTimeSource;\nuse aws_smithy_http_client::{tls, Builder};\nuse aws_smithy_runtime_api::client::dns::{DnsFuture, ResolveDns, ResolveDnsError};\nuse aws_smithy_runtime_api::client::http::{HttpClient, HttpConnector, HttpConnectorSettings};\nuse aws_smithy_runtime_api::client::orchestrator::HttpRequest;\nuse aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder;\nuse hyper_util::client::legacy::connect::dns::{GaiResolver, Name};\nuse std::error::Error;\nuse std::str::FromStr;\nuse std::sync::Arc;\nuse tower::Service;\n\n#[cfg(feature = \"rustls-ring\")]\n#[tokio::test]\nasync fn ring_client() {\n    let client = Builder::new()\n        .tls_provider(tls::Provider::Rustls(\n            tls::rustls_provider::CryptoMode::Ring,\n        ))\n        .build_https();\n    smoke_test_client(&client).await.unwrap();\n}\n\n#[cfg(feature = \"rustls-aws-lc-fips\")]\n#[tokio::test]\nasync fn aws_lc_fips_client() {\n    let client = Builder::new()\n        .tls_provider(tls::Provider::Rustls(\n            tls::rustls_provider::CryptoMode::AwsLcFips,\n        ))\n        .build_https();\n    smoke_test_client(&client).await.unwrap();\n}\n\n#[cfg(feature = \"rustls-aws-lc\")]\n#[tokio::test]\nasync fn aws_lc_client() {\n    let client = Builder::new()\n        .tls_provider(tls::Provider::Rustls(\n            tls::rustls_provider::CryptoMode::AwsLc,\n        ))\n        .build_https();\n    smoke_test_client(&client).await.unwrap();\n}\n\n#[cfg(feature = \"s2n-tls\")]\n#[tokio::test]\nasync fn s2n_tls_client() {\n    let client = Builder::new()\n        .tls_provider(tls::Provider::S2nTls)\n        .build_https();\n    smoke_test_client(&client).await.unwrap();\n}\n\n#[cfg(any(feature = \"rustls-ring\", feature = \"s2n-tls\"))]\n#[tokio::test]\nasync fn custom_dns_client() {\n    use std::sync::atomic::{AtomicUsize, Ordering};\n    #[derive(Debug, Clone)]\n    struct PassThroughResolver {\n        inner: GaiResolver,\n        count: Arc<AtomicUsize>,\n    }\n    impl ResolveDns for PassThroughResolver {\n        fn resolve_dns<'a>(&'a self, _name: &'a str) -> DnsFuture<'a> {\n            let mut inner = self.inner.clone();\n            let name = Name::from_str(_name).unwrap();\n            let count = self.count.clone();\n            DnsFuture::new(async move {\n                count.fetch_add(1, Ordering::Relaxed);\n                let result = inner.call(name).await.map_err(ResolveDnsError::new)?;\n                Ok(result.map(|addr| addr.ip()).collect::<Vec<_>>())\n            })\n        }\n    }\n\n    let providers = [\n        #[cfg(feature = \"rustls-ring\")]\n        tls::Provider::Rustls(tls::rustls_provider::CryptoMode::Ring),\n        #[cfg(feature = \"s2n-tls\")]\n        tls::Provider::S2nTls,\n    ];\n\n    for provider in providers {\n        let resolver = PassThroughResolver {\n            inner: GaiResolver::new(),\n            count: Default::default(),\n        };\n        let client = Builder::new()\n            .tls_provider(provider)\n            .build_with_resolver(resolver.clone());\n        smoke_test_client(&client).await.unwrap();\n        assert_eq!(resolver.count.load(Ordering::Relaxed), 1);\n    }\n}\n\nasync fn smoke_test_client(client: &dyn HttpClient) -> Result<(), Box<dyn Error>> {\n    let connector_settings = HttpConnectorSettings::builder().build();\n    let runtime_components = RuntimeComponentsBuilder::for_tests()\n        .with_time_source(Some(SystemTimeSource::new()))\n        .build()\n        .unwrap();\n    let connector = client.http_connector(&connector_settings, &runtime_components);\n    let _response = connector\n        .call(HttpRequest::get(\"https://amazon.com\").unwrap())\n        .await?;\n    Ok(())\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-client/tests/tls.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n#![cfg(any(\n    feature = \"rustls-ring\",\n    feature = \"rustls-aws-lc\",\n    feature = \"rustls-aws-lc-fips\",\n    feature = \"s2n-tls\",\n))]\n\nuse aws_smithy_async::time::SystemTimeSource;\nuse aws_smithy_http_client::tls;\nuse aws_smithy_http_client::tls::{TlsContext, TrustStore};\nuse aws_smithy_runtime_api::box_error::BoxError;\nuse aws_smithy_runtime_api::client::http::{HttpClient, HttpConnector, HttpConnectorSettings};\nuse aws_smithy_runtime_api::client::orchestrator::HttpRequest;\nuse aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder;\nuse aws_smithy_types::byte_stream::ByteStream;\nuse http_1x::{Method, Request, Response, StatusCode};\nuse http_body_util::{BodyExt, Full};\nuse hyper::body::{Bytes, Incoming};\nuse hyper::service::service_fn;\nuse hyper_util::rt::{TokioExecutor, TokioIo};\nuse hyper_util::server::conn::auto::Builder;\nuse rustls::ServerConfig;\nuse rustls_pki_types::{CertificateDer, PrivateKeyDer};\nuse std::net::SocketAddr;\nuse std::sync::Arc;\nuse std::time::Duration;\nuse std::{fs, io};\nuse tokio::net::TcpListener;\nuse tokio::task::JoinHandle;\nuse tokio_rustls::TlsAcceptor;\nuse tracing::{debug, error};\n\nstruct TestServer {\n    _handle: JoinHandle<()>,\n    listen_addr: SocketAddr,\n    conn_count: Arc<()>,\n}\n\nimpl TestServer {\n    /// Return the number of active connections to this server\n    fn conn_count(&self) -> usize {\n        // 1 reference for the struct MockProxyServer, 1 reference for the\n        // socket task.\n        Arc::strong_count(&self.conn_count)\n            .checked_sub(2)\n            .expect(\"de-count 2 refs\")\n    }\n}\n\nasync fn server() -> Result<TestServer, BoxError> {\n    // Set process wide crypto provider\n    let _ = rustls::crypto::aws_lc_rs::default_provider().install_default();\n\n    let listener = TcpListener::bind(\"127.0.0.1:0\").await.unwrap();\n    let addr = listener.local_addr().unwrap();\n\n    // load public certificate.\n    let certs = load_certs(\"tests/server.pem\")?;\n\n    // load private key.\n    let key = load_private_key(\"tests/server.rsa\")?;\n\n    debug!(\"Starting to serve on https://{}\", addr);\n\n    // TLS config\n    let mut server_config = ServerConfig::builder()\n        .with_no_client_auth()\n        .with_single_cert(certs, key)\n        .map_err(|e| error(e.to_string()))?;\n\n    server_config.alpn_protocols = vec![b\"h2\".to_vec(), b\"http/1.1\".to_vec(), b\"http/1.0\".to_vec()];\n    let tls_acceptor = TlsAcceptor::from(Arc::new(server_config));\n    let service = service_fn(echo);\n\n    let conn_count = Arc::new(());\n    let server_conn_count = conn_count.clone();\n\n    let server = async move {\n        loop {\n            let (tcp_stream, remote_addr) = listener.accept().await.unwrap();\n            debug!(\"accepted connection from: {}\", remote_addr);\n\n            let tls_acceptor = tls_acceptor.clone();\n            let connection_conn_count = server_conn_count.clone();\n            tokio::spawn(async move {\n                let _connection_conn_count = connection_conn_count;\n                let tls_stream = match tls_acceptor.accept(tcp_stream).await {\n                    Ok(tls_stream) => tls_stream,\n                    Err(err) => {\n                        error!(\"failed to perform tls handshake: {err:#}\");\n                        return;\n                    }\n                };\n                if let Err(err) = Builder::new(TokioExecutor::new())\n                    .serve_connection(TokioIo::new(tls_stream), service)\n                    .await\n                {\n                    error!(\"failed to serve connection: {err:#}\");\n                }\n            });\n        }\n    };\n\n    let server_task = tokio::spawn(server);\n\n    Ok(TestServer {\n        _handle: server_task,\n        listen_addr: addr,\n        conn_count,\n    })\n}\n\n// Custom echo service, handling two different routes and a\n// catch-all 404 responder.\nasync fn echo(req: Request<Incoming>) -> Result<Response<Full<Bytes>>, hyper::Error> {\n    let mut response = Response::new(Full::default());\n    match (req.method(), req.uri().path()) {\n        // default route.\n        (&Method::GET, \"/\") => {\n            *response.body_mut() = Full::from(\"Hello TLS!\");\n        }\n        // echo service route.\n        (&Method::POST, \"/echo\") => {\n            *response.body_mut() = Full::from(req.into_body().collect().await?.to_bytes());\n        }\n        // Catch-all 404.\n        _ => {\n            *response.status_mut() = StatusCode::NOT_FOUND;\n        }\n    };\n    Ok(response)\n}\n\nfn error(err: String) -> io::Error {\n    io::Error::new(io::ErrorKind::Other, err)\n}\n\n// Load public certificate from file.\nfn load_certs(filename: &str) -> io::Result<Vec<CertificateDer<'static>>> {\n    let certfile = fs::File::open(filename)\n        .map_err(|e| error(format!(\"failed to open {}: {}\", filename, e)))?;\n    let mut reader = io::BufReader::new(certfile);\n    rustls_pemfile::certs(&mut reader).collect()\n}\n\n// Load private key from file.\nfn load_private_key(filename: &str) -> io::Result<PrivateKeyDer<'static>> {\n    // Open keyfile.\n    let keyfile = fs::File::open(filename)\n        .map_err(|e| error(format!(\"failed to open {}: {}\", filename, e)))?;\n    let mut reader = io::BufReader::new(keyfile);\n\n    // Load and return a single private key.\n    rustls_pemfile::private_key(&mut reader).map(|key| key.unwrap())\n}\n\nfn tls_context_from_pem(filename: &str) -> TlsContext {\n    let pem_contents = fs::read(filename).unwrap();\n    let trust_store = TrustStore::empty().with_pem_certificate(pem_contents);\n    TlsContext::builder()\n        .with_trust_store(trust_store)\n        .build()\n        .unwrap()\n}\n\n#[cfg(feature = \"rustls-aws-lc\")]\n#[should_panic(expected = \"InvalidCertificate(UnknownIssuer)\")]\n#[tokio::test]\nasync fn test_rustls_aws_lc_native_ca() {\n    let client = aws_smithy_http_client::Builder::new()\n        .tls_provider(tls::Provider::Rustls(\n            tls::rustls_provider::CryptoMode::AwsLc,\n        ))\n        .build_https();\n\n    run_tls_test(&client).await.unwrap()\n}\n\n#[cfg(feature = \"rustls-aws-lc\")]\n#[tokio::test]\nasync fn test_rustls_aws_lc_custom_ca() {\n    let client = aws_smithy_http_client::Builder::new()\n        .tls_provider(tls::Provider::Rustls(\n            tls::rustls_provider::CryptoMode::AwsLc,\n        ))\n        .tls_context(tls_context_from_pem(\"tests/server.pem\"))\n        .build_https();\n\n    run_tls_test(&client).await.unwrap()\n}\n\n#[cfg(feature = \"rustls-aws-lc\")]\n#[tokio::test(start_paused = false)]\n// can't have paused clock due to <https://github.com/hyperium/hyper/issues/3950>\nasync fn test_rustls_aws_lc_custom_ca_with_timeout() {\n    const TIMEOUT: Duration = Duration::from_secs(10);\n    let client = aws_smithy_http_client::Builder::new()\n        .pool_idle_timeout(TIMEOUT)\n        .tls_provider(tls::Provider::Rustls(\n            tls::rustls_provider::CryptoMode::AwsLc,\n        ))\n        .tls_context(tls_context_from_pem(\"tests/server.pem\"))\n        .build_https();\n\n    run_tls_test_with_idle_timeout(&client, Some(TIMEOUT))\n        .await\n        .unwrap()\n}\n\n#[cfg(feature = \"rustls-aws-lc-fips\")]\n#[should_panic(expected = \"InvalidCertificate(UnknownIssuer)\")]\n#[tokio::test]\nasync fn test_rustls_aws_lc_fips_native_ca() {\n    let client = aws_smithy_http_client::Builder::new()\n        .tls_provider(tls::Provider::Rustls(\n            tls::rustls_provider::CryptoMode::AwsLcFips,\n        ))\n        .build_https();\n\n    run_tls_test(&client).await.unwrap()\n}\n\n#[cfg(feature = \"rustls-aws-lc-fips\")]\n#[tokio::test]\nasync fn test_rustls_aws_lc_fips_custom_ca() {\n    let client = aws_smithy_http_client::Builder::new()\n        .tls_provider(tls::Provider::Rustls(\n            tls::rustls_provider::CryptoMode::AwsLcFips,\n        ))\n        .tls_context(tls_context_from_pem(\"tests/server.pem\"))\n        .build_https();\n\n    run_tls_test(&client).await.unwrap()\n}\n\n#[cfg(feature = \"rustls-ring\")]\n#[should_panic(expected = \"InvalidCertificate(UnknownIssuer)\")]\n#[tokio::test]\nasync fn test_rustls_ring_native_ca() {\n    let client = aws_smithy_http_client::Builder::new()\n        .tls_provider(tls::Provider::Rustls(\n            tls::rustls_provider::CryptoMode::Ring,\n        ))\n        .build_https();\n\n    run_tls_test(&client).await.unwrap()\n}\n\n#[cfg(feature = \"rustls-ring\")]\n#[tokio::test]\nasync fn test_rustls_ring_custom_ca() {\n    let client = aws_smithy_http_client::Builder::new()\n        .tls_provider(tls::Provider::Rustls(\n            tls::rustls_provider::CryptoMode::Ring,\n        ))\n        .tls_context(tls_context_from_pem(\"tests/server.pem\"))\n        .build_https();\n\n    run_tls_test(&client).await.unwrap()\n}\n\n#[cfg(feature = \"s2n-tls\")]\n#[should_panic(expected = \"Certificate is untrusted\")]\n#[tokio::test]\nasync fn test_s2n_native_ca() {\n    let client = aws_smithy_http_client::Builder::new()\n        .tls_provider(tls::Provider::S2nTls)\n        .build_https();\n\n    run_tls_test(&client).await.unwrap()\n}\n\n#[cfg(feature = \"s2n-tls\")]\n#[tokio::test]\nasync fn test_s2n_tls_custom_ca() {\n    let client = aws_smithy_http_client::Builder::new()\n        .tls_provider(tls::Provider::S2nTls)\n        .tls_context(tls_context_from_pem(\"tests/server.pem\"))\n        .build_https();\n    run_tls_test(&client).await.unwrap()\n}\n\nasync fn run_tls_test(client: &dyn HttpClient) -> Result<(), BoxError> {\n    run_tls_test_with_idle_timeout(client, None).await\n}\n\nasync fn run_tls_test_with_idle_timeout(\n    client: &dyn HttpClient,\n    pool_timeout: Option<Duration>,\n) -> Result<(), BoxError> {\n    let server = server().await?;\n    let start = tokio::time::Instant::now();\n    assert_eq!(server.conn_count(), 0); // calibrate conn_count\n    let endpoint = format!(\"https://localhost:{}/\", server.listen_addr.port());\n\n    let connector_settings = HttpConnectorSettings::builder().build();\n    let runtime_components = RuntimeComponentsBuilder::for_tests()\n        .with_time_source(Some(SystemTimeSource::new()))\n        .build()\n        .unwrap();\n    let connector = client.http_connector(&connector_settings, &runtime_components);\n    let mut response = connector.call(HttpRequest::get(endpoint).unwrap()).await?;\n\n    let sdk_body = response.take_body();\n    let body_stream = ByteStream::new(sdk_body);\n    let resp_bytes = body_stream.collect().await?.into_bytes();\n    assert_eq!(b\"Hello TLS!\", &resp_bytes[..]);\n\n    if let Some(pool_timeout) = pool_timeout {\n        assert_eq!(server.conn_count(), 1);\n        tokio::time::sleep_until(start + pool_timeout - Duration::from_secs(1)).await;\n        assert_eq!(server.conn_count(), 1);\n        tokio::time::sleep(Duration::from_secs(2)).await;\n        assert_eq!(server.conn_count(), 0);\n    }\n    Ok(())\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/Cargo.toml",
    "content": "[package]\nname = \"aws-smithy-http-server\"\nversion = \"0.66.4\"\nauthors = [\"Smithy Rust Server <smithy-rs-server@amazon.com>\"]\nedition = \"2021\"\nlicense = \"Apache-2.0\"\nrepository = \"https://github.com/smithy-lang/smithy-rs\"\nkeywords = [\"smithy\", \"framework\", \"web\", \"api\", \"aws\"]\ncategories = [\"asynchronous\", \"web-programming\", \"api-bindings\"]\ndescription = \"\"\"\nServer runtime for Smithy Rust Server Framework.\n\"\"\"\npublish = true\nrust-version = \"1.91.1\"\n\n[features]\ndefault = []\nunredacted-logging = []\nrequest-id = [\"dep:uuid\"]\naws-lambda = [\"dep:lambda_http\"]\n\n[dependencies]\naws-smithy-cbor = { path = \"../aws-smithy-cbor\" }\naws-smithy-http = { path = \"../aws-smithy-http\", features = [\"rt-tokio\"] }\naws-smithy-json = { path = \"../aws-smithy-json\" }\naws-smithy-runtime-api = { path = \"../aws-smithy-runtime-api\" }\naws-smithy-types = { path = \"../aws-smithy-types\", features = [\n    \"http-body-1-x\",\n] }\naws-smithy-xml = { path = \"../aws-smithy-xml\" }\n\nbytes = \"1.11.1\"\nfutures-util = { version = \"0.3.29\", default-features = false }\n\nhttp = \"1.3.1\"\nhttp-body = \"1.0.1\"\nhyper = { version = \"1.6\", features = [\"server\", \"http1\", \"http2\"] }\nhyper-util = { version = \"0.1.16\", features = [\n    \"tokio\",\n    \"server\",\n    \"server-auto\",\n    \"server-graceful\",\n    \"service\",\n    \"http1\",\n    \"http2\",\n] }\nhttp-body-util = \"0.1.3\"\n\nlambda_http = { version = \"1\", optional = true }\n\nmime = \"0.3.17\"\nnom = \"7.1.3\"\npin-project-lite = \"0.2.14\"\nregex = \"1.12.2\"\nserde_urlencoded = \"0.7\"\nthiserror = \"2\"\ntokio = { version = \"1.49.0\", features = [\"full\"] }\ntower = { version = \"0.4.13\", features = [\n    \"util\",\n    \"make\",\n], default-features = false }\ntower-http = { version = \"0.6\", features = [\n    \"add-extension\",\n    \"map-response-body\",\n] }\ntracing = \"0.1.44\"\nuuid = { version = \"1.1.2\", features = [\"v4\", \"fast-rng\"], optional = true }\n\n[dev-dependencies]\npretty_assertions = \"1\"\nhyper-util = { version = \"0.1\", features = [\n    \"tokio\",\n    \"client\",\n    \"client-legacy\",\n    \"http1\",\n    \"http2\",\n] }\ntracing-subscriber = { version = \"0.3\", features = [\"fmt\"] }\ntower = { version = \"0.4.13\", features = [\"util\", \"make\", \"limit\"] }\ntower-http = { version = \"0.6\", features = [\"timeout\"] }\n\n[package.metadata.docs.rs]\nall-features = true\ntargets = [\"x86_64-unknown-linux-gnu\"]\ncargo-args = [\"-Zunstable-options\", \"-Zrustdoc-scrape-examples\"]\nrustdoc-args = [\"--cfg\", \"docsrs\"]\n# End of docs.rs metadata\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/LICENSE",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/README.md",
    "content": "# aws-smithy-http-server\n\nServer libraries for smithy-rs generated servers.\n\n<!-- anchor_start:footer -->\nThis crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly.\n<!-- anchor_end:footer -->\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/additional-ci",
    "content": "#!/bin/bash\n#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\n\n# This script contains additional CI checks to run for this specific package\n\nset -e\n\necho \"### Testing unredacted-logging logging feature\"\ncargo test logging:: --features unredacted-logging\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/examples/basic_server.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Basic HTTP server example using `aws_smithy_http_server::serve()`.\n//!\n//! **This is the recommended way to run an HTTP server** for most use cases.\n//! It provides a batteries-included experience with sensible defaults.\n//!\n//! This example demonstrates:\n//! - Using the `serve()` function for connection handling\n//! - Configuring the Hyper builder with `.configure_hyper()`\n//! - Graceful shutdown with `.with_graceful_shutdown()`\n//!\n//! For more control (e.g., custom connection duration limits, connection limiting),\n//! see the `custom_accept_loop` example.\n//!\n//! Run with:\n//! ```\n//! cargo run --example basic_server\n//! ```\n//!\n//! Test with curl:\n//! ```\n//! curl http://localhost:3000/\n//! curl -X POST -d \"Hello!\" http://localhost:3000/echo\n//! ```\n\nuse aws_smithy_http_server::{routing::IntoMakeService, serve::serve};\nuse http::{Request, Response};\nuse http_body_util::{BodyExt, Full};\nuse hyper::body::{Bytes, Incoming};\nuse std::{convert::Infallible, time::Duration};\nuse tokio::net::TcpListener;\nuse tower::service_fn;\nuse tracing::{info, warn};\n\n/// Simple handler that responds immediately\nasync fn hello_handler(_req: Request<Incoming>) -> Result<Response<Full<Bytes>>, Infallible> {\n    Ok(Response::new(Full::new(Bytes::from(\"Hello, World!\\n\"))))\n}\n\n/// Handler that echoes the request body\nasync fn echo_handler(req: Request<Incoming>) -> Result<Response<Full<Bytes>>, Infallible> {\n    let body = req.into_body();\n\n    // Collect all body frames into bytes\n    let bytes = match body.collect().await {\n        Ok(collected) => collected.to_bytes(),\n        Err(e) => {\n            warn!(\"echo handler: error reading body: {}\", e);\n            return Ok(Response::new(Full::new(Bytes::from(\"Error reading body\\n\"))));\n        }\n    };\n\n    info!(\"echo handler: received {} bytes\", bytes.len());\n\n    // Echo back the body, or send a default message if empty\n    if bytes.is_empty() {\n        Ok(Response::new(Full::new(Bytes::from(\"No body provided\\n\"))))\n    } else {\n        Ok(Response::new(Full::new(bytes)))\n    }\n}\n\n/// Router that dispatches to handlers based on path\nasync fn router(req: Request<Incoming>) -> Result<Response<Full<Bytes>>, Infallible> {\n    match req.uri().path() {\n        \"/echo\" => echo_handler(req).await,\n        _ => hello_handler(req).await,\n    }\n}\n\n#[tokio::main]\nasync fn main() -> Result<(), Box<dyn std::error::Error>> {\n    tracing_subscriber::fmt::init();\n\n    info!(\"Starting server with aws_smithy_http_server::serve()...\");\n\n    let listener = TcpListener::bind(\"0.0.0.0:3000\").await?;\n    let local_addr = listener.local_addr()?;\n\n    info!(\"Server listening on http://{}\", local_addr);\n    info!(\"Press Ctrl+C to shutdown gracefully\");\n\n    // Build the service\n    let app = service_fn(router);\n\n    // Use aws_smithy_http_server::serve with:\n    // - Hyper configuration (HTTP/2 keep-alive settings)\n    // - Graceful shutdown (wait for in-flight requests)\n    serve(listener, IntoMakeService::new(app))\n        .configure_hyper(|mut builder| {\n            // Configure HTTP/2 keep-alive to detect stale connections\n            builder\n                .http2()\n                .keep_alive_interval(Duration::from_secs(60))\n                .keep_alive_timeout(Duration::from_secs(20));\n            builder\n        })\n        .with_graceful_shutdown(async {\n            tokio::signal::ctrl_c().await.expect(\"failed to listen for Ctrl+C\");\n            info!(\"Received Ctrl+C, shutting down gracefully...\");\n        })\n        .await?;\n\n    Ok(())\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/examples/custom_accept_loop.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Example demonstrating a custom accept loop with connection-level timeouts.\n//!\n//! **NOTE: This is a demonstration example only, not production-ready code.**\n//! For most use cases, use the built-in `serve()` function instead.\n//!\n//! This example shows how to implement your own custom accept loop if you need\n//! control over:\n//! - Overall connection duration limits\n//! - Connection-level configuration\n//! - Per-connection decision making\n//!\n//! Run with:\n//! ```\n//! cargo run --example custom_accept_loop\n//! ```\n//!\n//! Test with curl:\n//! ```\n//! curl http://localhost:3000/\n//! curl -X POST -d \"Hello from client!\" http://localhost:3000/slow\n//! ```\n\nuse aws_smithy_http_server::{routing::IntoMakeService, serve::IncomingStream};\nuse http::{Request, Response, StatusCode};\nuse http_body_util::{BodyExt, Full};\nuse hyper::body::{Bytes, Incoming};\nuse hyper_util::{\n    rt::{TokioExecutor, TokioIo, TokioTimer},\n    server::conn::auto::Builder,\n    service::TowerToHyperService,\n};\nuse std::{convert::Infallible, sync::Arc, time::Duration};\nuse tokio::{net::TcpListener, sync::Semaphore};\nuse tower::{service_fn, ServiceBuilder, ServiceExt};\nuse tower_http::timeout::TimeoutLayer;\nuse tracing::{info, warn};\n\n/// Simple handler that responds immediately\nasync fn hello_handler(_req: Request<Incoming>) -> Result<Response<Full<Bytes>>, Infallible> {\n    Ok(Response::new(Full::new(Bytes::from(\"Hello, World!\\n\"))))\n}\n\n/// Handler that simulates a slow response and echoes the request body\nasync fn slow_handler(req: Request<Incoming>) -> Result<Response<Full<Bytes>>, Infallible> {\n    let body = req.into_body();\n\n    // Collect all body frames into bytes\n    let bytes = match body.collect().await {\n        Ok(collected) => collected.to_bytes(),\n        Err(e) => {\n            warn!(\"slow handler: error reading body: {}\", e);\n            return Ok(Response::new(Full::new(Bytes::from(\"Error reading body\\n\"))));\n        }\n    };\n\n    info!(\"slow handler: received {} bytes, sleeping for 45 seconds\", bytes.len());\n    tokio::time::sleep(Duration::from_secs(45)).await;\n\n    // Echo back the body, or send a completion message if empty\n    if bytes.is_empty() {\n        Ok(Response::new(Full::new(Bytes::from(\"Completed after 45 seconds\\n\"))))\n    } else {\n        Ok(Response::new(Full::new(bytes)))\n    }\n}\n\n/// Router that dispatches to handlers based on path\nasync fn router(req: Request<Incoming>) -> Result<Response<Full<Bytes>>, Infallible> {\n    match req.uri().path() {\n        \"/slow\" => slow_handler(req).await,\n        _ => hello_handler(req).await,\n    }\n}\n\n#[tokio::main]\nasync fn main() -> Result<(), Box<dyn std::error::Error>> {\n    tracing_subscriber::fmt::init();\n\n    let listener = TcpListener::bind(\"0.0.0.0:3000\").await?;\n    let local_addr = listener.local_addr()?;\n\n    info!(\"Server listening on http://{}\", local_addr);\n    info!(\"Configuration:\");\n    info!(\"  - Header read timeout: 10 seconds\");\n    info!(\"  - Request timeout: 30 seconds\");\n    info!(\"  - Connection duration limit: 5 minutes\");\n    info!(\"  - Max concurrent connections: 1000\");\n    info!(\"  - HTTP/2 keep-alive: 60s interval, 20s timeout\");\n\n    // Connection limiting with semaphore\n    let connection_semaphore = Arc::new(Semaphore::new(1000));\n\n    // Build the service with request timeout layer\n    let base_service = ServiceBuilder::new()\n        .layer(TimeoutLayer::with_status_code(\n            StatusCode::REQUEST_TIMEOUT,\n            Duration::from_secs(30),\n        ))\n        .service(service_fn(router));\n\n    let make_service = IntoMakeService::new(base_service);\n\n    loop {\n        // Accept new connection\n        let (stream, remote_addr) = listener.accept().await?;\n\n        // Try to acquire connection permit\n        let permit = match connection_semaphore.clone().try_acquire_owned() {\n            Ok(permit) => permit,\n            Err(_) => {\n                warn!(\"connection limit reached, rejecting connection from {}\", remote_addr);\n                drop(stream);\n                continue;\n            }\n        };\n\n        info!(\"accepted connection from {}\", remote_addr);\n\n        let make_service = make_service.clone();\n\n        tokio::spawn(async move {\n            // The permit will be dropped when this task ends, freeing up a connection slot\n            let _permit = permit;\n\n            let io = TokioIo::new(stream);\n\n            // Create service for this connection\n            let tower_service =\n                match ServiceExt::oneshot(make_service, IncomingStream::<TcpListener> { io: &io, remote_addr }).await {\n                    Ok(svc) => svc,\n                    Err(_) => {\n                        warn!(\"failed to create service for connection from {}\", remote_addr);\n                        return;\n                    }\n                };\n\n            let hyper_service = TowerToHyperService::new(tower_service);\n\n            // Configure Hyper builder with timer for timeouts\n            let mut builder = Builder::new(TokioExecutor::new());\n            builder\n                .http1()\n                .timer(TokioTimer::new())\n                .header_read_timeout(Duration::from_secs(10))\n                .keep_alive(true);\n            builder\n                .http2()\n                .timer(TokioTimer::new())\n                .keep_alive_interval(Duration::from_secs(60))\n                .keep_alive_timeout(Duration::from_secs(20));\n\n            // Serve the connection with overall duration timeout\n            let conn = builder.serve_connection(io, hyper_service);\n\n            // Wrap the entire connection in a timeout.\n            // The connection will be closed after 5 minutes regardless of activity.\n            match tokio::time::timeout(Duration::from_secs(300), conn).await {\n                Ok(Ok(())) => {\n                    info!(\"connection from {} closed normally\", remote_addr);\n                }\n                Ok(Err(e)) => {\n                    warn!(\"error serving connection from {}: {:?}\", remote_addr, e);\n                }\n                Err(_) => {\n                    info!(\"connection from {} exceeded 5 minutes duration limit\", remote_addr);\n                }\n            }\n        });\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/examples/request_id.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n#![cfg_attr(not(feature = \"request-id\"), allow(unused_imports, dead_code, unreachable_code))]\n\n//! Example showing how to use request IDs for tracing and observability.\n//!\n//! This demonstrates using `ServerRequestIdProviderLayer` to generate unique\n//! request IDs for each incoming request. The ID can be:\n//! - Accessed in your handler for logging/tracing\n//! - Added to response headers so clients can reference it for support\n//!\n//! The `request-id` feature must be enabled in your Cargo.toml:\n//! ```toml\n//! aws-smithy-http-server = { version = \"*\", features = [\"request-id\"] }\n//! ```\n//!\n//! Run with:\n//! ```\n//! cargo run --example request_id --features request-id\n//! ```\n//!\n//! Test with:\n//! ```\n//! curl -v http://localhost:3000/\n//! ```\n//!\n//! Look for the `x-request-id` header in the response.\n\nuse aws_smithy_http_server::{\n    body::{boxed, BoxBody},\n    routing::IntoMakeService,\n    serve::serve,\n};\n\n#[cfg(feature = \"request-id\")]\nuse aws_smithy_http_server::request::request_id::{ServerRequestId, ServerRequestIdProviderLayer};\n\nuse http::{header::HeaderName, Request, Response};\nuse http_body_util::Full;\nuse hyper::body::{Bytes, Incoming};\nuse std::convert::Infallible;\nuse tokio::net::TcpListener;\nuse tower::{service_fn, ServiceBuilder};\nuse tracing::info;\n\n#[cfg(feature = \"request-id\")]\nasync fn handler(req: Request<Incoming>) -> Result<Response<BoxBody>, Infallible> {\n    // Extract the request ID from extensions (added by the layer)\n    let request_id = req\n        .extensions()\n        .get::<ServerRequestId>()\n        .expect(\"ServerRequestId should be present\");\n\n    // Use the request ID in your logs/traces\n    info!(request_id = %request_id, \"Handling request\");\n\n    let body = boxed(Full::new(Bytes::from(format!(\n        \"Request processed with ID: {request_id}\\n\"\n    ))));\n\n    Ok(Response::new(body))\n}\n\n#[tokio::main]\nasync fn main() -> Result<(), Box<dyn std::error::Error>> {\n    #[cfg(not(feature = \"request-id\"))]\n    {\n        eprintln!(\"ERROR: This example requires the 'request-id' feature.\");\n        eprintln!();\n        eprintln!(\"Please run:\");\n        eprintln!(\"  cargo run --example request_id --features request-id\");\n        std::process::exit(1);\n    }\n\n    #[cfg(feature = \"request-id\")]\n    {\n        tracing_subscriber::fmt::init();\n\n        info!(\"Starting server with request ID tracking...\");\n\n        let listener = TcpListener::bind(\"0.0.0.0:3000\").await?;\n\n        // Add ServerRequestIdProviderLayer to generate IDs and add them to response headers\n        let app = ServiceBuilder::new()\n            .layer(ServerRequestIdProviderLayer::new_with_response_header(\n                HeaderName::from_static(\"x-request-id\"),\n            ))\n            .service(service_fn(handler));\n\n        info!(\"Server listening on http://0.0.0.0:3000\");\n        info!(\"Each request will receive a unique x-request-id header\");\n        info!(\"\");\n        info!(\"Try:\");\n        info!(\"  curl -v http://localhost:3000/\");\n        info!(\"  # Check the x-request-id header in the response\");\n\n        serve(listener, IntoMakeService::new(app)).await?;\n    }\n\n    Ok(())\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/rustfmt.toml",
    "content": "edition = \"2021\"\nmax_width = 120\n# Prevent carriage returns\nnewline_style = \"Unix\"\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/src/body.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! HTTP body utilities.\n//!\n//! This module provides body handling utilities for HTTP 1.x using the\n//! `http-body` and `http-body-util` crates.\n\nuse crate::error::{BoxError, Error};\nuse bytes::Bytes;\n\n// Used in the codegen in trait bounds.\n#[doc(hidden)]\npub use http_body::Body as HttpBody;\n\n// ============================================================================\n// BoxBody - Type-Erased Body\n// ============================================================================\n\n/// The primary body type returned by the generated `smithy-rs` service.\n///\n/// This is a type-erased body that wraps `UnsyncBoxBody` from `http-body-util`.\n/// It is `Send` but not `Sync`, making it suitable for most HTTP handlers.\npub type BoxBody = http_body_util::combinators::UnsyncBoxBody<Bytes, Error>;\n\n/// A thread-safe body type for operations that require `Sync`.\n///\n/// This is used specifically for event streaming operations and lambda handlers\n/// that need thread safety guarantees.\npub type BoxBodySync = http_body_util::combinators::BoxBody<Bytes, Error>;\n\n// ============================================================================\n// Body Construction Functions\n// ============================================================================\n\n// `boxed` is used in the codegen of the implementation of the operation `Handler` trait.\n/// Convert an HTTP body implementing [`http_body::Body`] into a [`BoxBody`].\npub fn boxed<B>(body: B) -> BoxBody\nwhere\n    B: http_body::Body<Data = Bytes> + Send + 'static,\n    B::Error: Into<BoxError>,\n{\n    use http_body_util::BodyExt;\n\n    try_downcast(body).unwrap_or_else(|body| body.map_err(Error::new).boxed_unsync())\n}\n\n/// Convert an HTTP body implementing [`http_body::Body`] into a [`BoxBodySync`].\npub fn boxed_sync<B>(body: B) -> BoxBodySync\nwhere\n    B: http_body::Body<Data = Bytes> + Send + Sync + 'static,\n    B::Error: Into<BoxError>,\n{\n    use http_body_util::BodyExt;\n    body.map_err(Error::new).boxed()\n}\n\n#[doc(hidden)]\npub(crate) fn try_downcast<T, K>(k: K) -> Result<T, K>\nwhere\n    T: 'static,\n    K: Send + 'static,\n{\n    let mut k = Some(k);\n    if let Some(k) = <dyn std::any::Any>::downcast_mut::<Option<T>>(&mut k) {\n        Ok(k.take().unwrap())\n    } else {\n        Err(k.unwrap())\n    }\n}\n\n/// Create an empty body.\npub fn empty() -> BoxBody {\n    boxed(http_body_util::Empty::<Bytes>::new())\n}\n\n/// Create an empty sync body.\npub fn empty_sync() -> BoxBodySync {\n    boxed_sync(http_body_util::Empty::<Bytes>::new())\n}\n\n/// Convert bytes or similar types into a [`BoxBody`].\n///\n/// This simplifies codegen a little bit.\n#[doc(hidden)]\npub fn to_boxed<B>(body: B) -> BoxBody\nwhere\n    B: Into<Bytes>,\n{\n    boxed(http_body_util::Full::new(body.into()))\n}\n\n/// Convert bytes or similar types into a [`BoxBodySync`].\n///\n/// This simplifies codegen a little bit.\n#[doc(hidden)]\npub fn to_boxed_sync<B>(body: B) -> BoxBodySync\nwhere\n    B: Into<Bytes>,\n{\n    boxed_sync(http_body_util::Full::new(body.into()))\n}\n\n/// Create a body from bytes.\npub fn from_bytes(bytes: Bytes) -> BoxBody {\n    boxed(http_body_util::Full::new(bytes))\n}\n\n// ============================================================================\n// Stream Wrapping for Event Streaming\n// ============================================================================\n\n/// Wrap a stream of byte chunks into a BoxBody.\n///\n/// This is used for event streaming support. The stream should produce `Result<O, E>`\n/// where `O` can be converted into `Bytes` and `E` can be converted into an error.\n///\n/// In hyper 0.x, `Body::wrap_stream` was available directly on the body type.\n/// In hyper 1.x, the `stream` feature was removed, and the official approach is to use\n/// `http_body_util::StreamBody` to convert streams into bodies, which is what this\n/// function provides as a convenient wrapper.\n///\n/// For scenarios requiring `Sync` (e.g., lambda handlers), use [`wrap_stream_sync`] instead.\npub fn wrap_stream<S, O, E>(stream: S) -> BoxBody\nwhere\n    S: futures_util::Stream<Item = Result<O, E>> + Send + 'static,\n    O: Into<Bytes> + 'static,\n    E: Into<BoxError> + 'static,\n{\n    use futures_util::TryStreamExt;\n    use http_body_util::StreamBody;\n\n    // Convert the stream of Result<O, E> into a stream of Result<Frame<Bytes>, Error>\n    let frame_stream = stream\n        .map_ok(|chunk| http_body::Frame::data(chunk.into()))\n        .map_err(|e| Error::new(e.into()));\n\n    boxed(StreamBody::new(frame_stream))\n}\n\n/// Wrap a stream of byte chunks into a BoxBodySync.\n///\n/// This is the thread-safe variant of [`wrap_stream`], used for event streaming operations\n/// that require `Sync` bounds, such as lambda handlers.\n///\n/// The stream should produce `Result<O, E>` where `O` can be converted into `Bytes` and\n/// `E` can be converted into an error.\npub fn wrap_stream_sync<S, O, E>(stream: S) -> BoxBodySync\nwhere\n    S: futures_util::Stream<Item = Result<O, E>> + Send + Sync + 'static,\n    O: Into<Bytes> + 'static,\n    E: Into<BoxError> + 'static,\n{\n    use futures_util::TryStreamExt;\n    use http_body_util::StreamBody;\n\n    // Convert the stream of Result<O, E> into a stream of Result<Frame<Bytes>, Error>\n    let frame_stream = stream\n        .map_ok(|chunk| http_body::Frame::data(chunk.into()))\n        .map_err(|e| Error::new(e.into()));\n\n    boxed_sync(StreamBody::new(frame_stream))\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n\n    /// Collect all bytes from a body (test utility).\n    ///\n    /// This uses `http_body_util::BodyExt::collect()` to read all body chunks\n    /// into a single `Bytes` buffer.\n    async fn collect_bytes<B>(body: B) -> Result<Bytes, Error>\n    where\n        B: HttpBody,\n        B::Error: Into<BoxError>,\n    {\n        use http_body_util::BodyExt;\n\n        let collected = body.collect().await.map_err(Error::new)?;\n        Ok(collected.to_bytes())\n    }\n\n    #[tokio::test]\n    async fn test_empty_body() {\n        let body = empty();\n        let bytes = collect_bytes(body).await.unwrap();\n        assert_eq!(bytes.len(), 0);\n    }\n\n    #[tokio::test]\n    async fn test_from_bytes() {\n        let data = Bytes::from(\"hello world\");\n        let body = from_bytes(data.clone());\n        let collected = collect_bytes(body).await.unwrap();\n        assert_eq!(collected, data);\n    }\n\n    #[tokio::test]\n    async fn test_to_boxed_string() {\n        let s = \"hello world\";\n        let body = to_boxed(s);\n        let collected = collect_bytes(body).await.unwrap();\n        assert_eq!(collected, Bytes::from(s));\n    }\n\n    #[tokio::test]\n    async fn test_to_boxed_vec() {\n        let vec = vec![1u8, 2, 3, 4, 5];\n        let body = to_boxed(vec.clone());\n        let collected = collect_bytes(body).await.unwrap();\n        assert_eq!(collected.as_ref(), vec.as_slice());\n    }\n\n    #[tokio::test]\n    async fn test_boxed() {\n        use http_body_util::Full;\n        let full_body = Full::new(Bytes::from(\"test data\"));\n        let boxed_body: BoxBody = boxed(full_body);\n        let collected = collect_bytes(boxed_body).await.unwrap();\n        assert_eq!(collected, Bytes::from(\"test data\"));\n    }\n\n    #[tokio::test]\n    async fn test_boxed_sync() {\n        use http_body_util::Full;\n        let full_body = Full::new(Bytes::from(\"sync test\"));\n        let boxed_body: BoxBodySync = boxed_sync(full_body);\n        let collected = collect_bytes(boxed_body).await.unwrap();\n        assert_eq!(collected, Bytes::from(\"sync test\"));\n    }\n\n    #[tokio::test]\n    async fn test_wrap_stream_single_chunk() {\n        use futures_util::stream;\n\n        let data = Bytes::from(\"single chunk\");\n        let stream = stream::iter(vec![Ok::<_, std::io::Error>(data.clone())]);\n\n        let body = wrap_stream(stream);\n        let collected = collect_bytes(body).await.unwrap();\n        assert_eq!(collected, data);\n    }\n\n    #[tokio::test]\n    async fn test_wrap_stream_multiple_chunks() {\n        use futures_util::stream;\n\n        let chunks = vec![\n            Ok::<_, std::io::Error>(Bytes::from(\"chunk1\")),\n            Ok(Bytes::from(\"chunk2\")),\n            Ok(Bytes::from(\"chunk3\")),\n        ];\n        let expected = Bytes::from(\"chunk1chunk2chunk3\");\n\n        let stream = stream::iter(chunks);\n        let body = wrap_stream(stream);\n        let collected = collect_bytes(body).await.unwrap();\n        assert_eq!(collected, expected);\n    }\n\n    #[tokio::test]\n    async fn test_wrap_stream_empty() {\n        use futures_util::stream;\n\n        let stream = stream::iter(vec![Ok::<_, std::io::Error>(Bytes::new())]);\n\n        let body = wrap_stream(stream);\n        let collected = collect_bytes(body).await.unwrap();\n        assert_eq!(collected.len(), 0);\n    }\n\n    #[tokio::test]\n    async fn test_wrap_stream_error() {\n        use futures_util::stream;\n\n        let chunks = vec![\n            Ok::<_, std::io::Error>(Bytes::from(\"chunk1\")),\n            Err(std::io::Error::other(\"test error\")),\n        ];\n\n        let stream = stream::iter(chunks);\n        let body = wrap_stream(stream);\n        let result = collect_bytes(body).await;\n        assert!(result.is_err());\n    }\n\n    #[tokio::test]\n    async fn test_wrap_stream_various_types() {\n        use futures_util::stream;\n\n        // Test that Into<Bytes> works for various types\n\n        // Test with &str\n        let chunks = vec![Ok::<_, std::io::Error>(\"string slice\"), Ok(\"another string\")];\n        let stream = stream::iter(chunks);\n        let body = wrap_stream(stream);\n        let collected = collect_bytes(body).await.unwrap();\n        assert_eq!(collected, Bytes::from(\"string sliceanother string\"));\n\n        // Test with String\n        let chunks = vec![\n            Ok::<_, std::io::Error>(String::from(\"owned \")),\n            Ok(String::from(\"strings\")),\n        ];\n        let stream = stream::iter(chunks);\n        let body = wrap_stream(stream);\n        let collected = collect_bytes(body).await.unwrap();\n        assert_eq!(collected, Bytes::from(\"owned strings\"));\n\n        // Test with Vec<u8>\n        let chunks = vec![\n            Ok::<_, std::io::Error>(vec![72u8, 101, 108, 108, 111]), // \"Hello\"\n            Ok(vec![32u8, 87, 111, 114, 108, 100]),                  // \" World\"\n        ];\n        let stream = stream::iter(chunks);\n        let body = wrap_stream(stream);\n        let collected = collect_bytes(body).await.unwrap();\n        assert_eq!(collected, Bytes::from(\"Hello World\"));\n\n        // Test with &[u8]\n        let chunks = vec![\n            Ok::<_, std::io::Error>(&[98u8, 121, 116, 101] as &[u8]), // \"byte\"\n            Ok(&[115u8, 33] as &[u8]),                                // \"s!\"\n        ];\n        let stream = stream::iter(chunks);\n        let body = wrap_stream(stream);\n        let collected = collect_bytes(body).await.unwrap();\n        assert_eq!(collected, Bytes::from(\"bytes!\"));\n\n        // Test with custom struct implementing Into<Bytes>\n        struct CustomChunk {\n            data: String,\n        }\n\n        impl From<CustomChunk> for Bytes {\n            fn from(chunk: CustomChunk) -> Bytes {\n                Bytes::from(chunk.data)\n            }\n        }\n\n        let chunks = vec![\n            Ok::<_, std::io::Error>(CustomChunk { data: \"custom \".into() }),\n            Ok(CustomChunk { data: \"struct\".into() }),\n        ];\n        let stream = stream::iter(chunks);\n        let body = wrap_stream(stream);\n        let collected = collect_bytes(body).await.unwrap();\n        assert_eq!(collected, Bytes::from(\"custom struct\"));\n    }\n\n    #[tokio::test]\n    async fn test_wrap_stream_custom_stream_type() {\n        use bytes::Bytes;\n        use std::pin::Pin;\n        use std::task::{Context, Poll};\n\n        // Custom stream type that implements futures_util::Stream\n        struct CustomStream {\n            chunks: Vec<Result<Bytes, std::io::Error>>,\n        }\n\n        impl CustomStream {\n            fn new(chunks: Vec<Result<Bytes, std::io::Error>>) -> Self {\n                Self { chunks }\n            }\n        }\n\n        impl futures_util::Stream for CustomStream {\n            type Item = Result<Bytes, std::io::Error>;\n\n            fn poll_next(mut self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll<Option<Self::Item>> {\n                if self.chunks.is_empty() {\n                    Poll::Ready(None)\n                } else {\n                    Poll::Ready(Some(self.chunks.remove(0)))\n                }\n            }\n        }\n\n        let stream = CustomStream::new(vec![Ok(Bytes::from(\"custom \")), Ok(Bytes::from(\"stream\"))]);\n\n        let body = wrap_stream(stream);\n        let collected = collect_bytes(body).await.unwrap();\n        assert_eq!(collected, Bytes::from(\"custom stream\"));\n    }\n\n    #[tokio::test]\n    async fn test_wrap_stream_custom_error_type() {\n        use bytes::Bytes;\n        use futures_util::stream;\n\n        // Custom error type that implements Into<BoxError>\n        #[derive(Debug, Clone)]\n        struct CustomError {\n            message: String,\n        }\n\n        impl std::fmt::Display for CustomError {\n            fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n                write!(f, \"CustomError: {}\", self.message)\n            }\n        }\n\n        impl std::error::Error for CustomError {}\n\n        // Test successful case with custom error type\n        let chunks = vec![\n            Ok::<_, CustomError>(Bytes::from(\"custom \")),\n            Ok(Bytes::from(\"error type\")),\n        ];\n        let stream = stream::iter(chunks);\n        let body = wrap_stream(stream);\n        let collected = collect_bytes(body).await.unwrap();\n        assert_eq!(collected, Bytes::from(\"custom error type\"));\n\n        // Test error case with custom error type\n        let chunks = vec![\n            Ok::<_, CustomError>(Bytes::from(\"data\")),\n            Err(CustomError {\n                message: \"custom error\".into(),\n            }),\n        ];\n        let stream = stream::iter(chunks);\n        let body = wrap_stream(stream);\n        let result = collect_bytes(body).await;\n        assert!(result.is_err());\n    }\n\n    #[tokio::test]\n    async fn test_wrap_stream_incremental_consumption() {\n        use bytes::Bytes;\n        use http_body_util::BodyExt;\n        use std::pin::Pin;\n        use std::task::{Context, Poll};\n\n        struct IncrementalStream {\n            chunks: Vec<Result<Bytes, std::io::Error>>,\n        }\n\n        impl IncrementalStream {\n            fn new(chunks: Vec<Result<Bytes, std::io::Error>>) -> Self {\n                Self { chunks }\n            }\n        }\n\n        impl futures_util::Stream for IncrementalStream {\n            type Item = Result<Bytes, std::io::Error>;\n\n            fn poll_next(mut self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll<Option<Self::Item>> {\n                if self.chunks.is_empty() {\n                    Poll::Ready(None)\n                } else {\n                    Poll::Ready(Some(self.chunks.remove(0)))\n                }\n            }\n        }\n\n        let stream = IncrementalStream::new(vec![\n            Ok(Bytes::from(\"chunk1\")),\n            Ok(Bytes::from(\"chunk2\")),\n            Ok(Bytes::from(\"chunk3\")),\n        ]);\n\n        let mut body = wrap_stream(stream);\n\n        let frame1 = body.frame().await.unwrap().unwrap();\n        assert!(frame1.is_data());\n        assert_eq!(frame1.into_data().unwrap(), Bytes::from(\"chunk1\"));\n\n        let frame2 = body.frame().await.unwrap().unwrap();\n        assert!(frame2.is_data());\n        assert_eq!(frame2.into_data().unwrap(), Bytes::from(\"chunk2\"));\n\n        let frame3 = body.frame().await.unwrap().unwrap();\n        assert!(frame3.is_data());\n        assert_eq!(frame3.into_data().unwrap(), Bytes::from(\"chunk3\"));\n\n        let frame4 = body.frame().await;\n        assert!(frame4.is_none());\n    }\n\n    #[tokio::test]\n    async fn test_wrap_stream_sync_single_chunk() {\n        use futures_util::stream;\n\n        let data = Bytes::from(\"sync single chunk\");\n        let stream = stream::iter(vec![Ok::<_, std::io::Error>(data.clone())]);\n\n        let body = wrap_stream_sync(stream);\n        let collected = collect_bytes(body).await.unwrap();\n        assert_eq!(collected, data);\n    }\n\n    #[tokio::test]\n    async fn test_wrap_stream_sync_multiple_chunks() {\n        use futures_util::stream;\n\n        let chunks = vec![\n            Ok::<_, std::io::Error>(Bytes::from(\"sync1\")),\n            Ok(Bytes::from(\"sync2\")),\n            Ok(Bytes::from(\"sync3\")),\n        ];\n        let expected = Bytes::from(\"sync1sync2sync3\");\n\n        let stream = stream::iter(chunks);\n        let body = wrap_stream_sync(stream);\n        let collected = collect_bytes(body).await.unwrap();\n        assert_eq!(collected, expected);\n    }\n\n    #[tokio::test]\n    async fn test_empty_sync_body() {\n        let body = empty_sync();\n        let bytes = collect_bytes(body).await.unwrap();\n        assert_eq!(bytes.len(), 0);\n    }\n\n    #[tokio::test]\n    async fn test_to_boxed_sync() {\n        let data = Bytes::from(\"sync boxed data\");\n        let body = to_boxed_sync(data.clone());\n        let collected = collect_bytes(body).await.unwrap();\n        assert_eq!(collected, data);\n    }\n\n    // Compile-time tests to ensure Send/Sync bounds are correct\n    // Following the pattern used by hyper and axum\n    fn _assert_send<T: Send>() {}\n    fn _assert_sync<T: Sync>() {}\n\n    fn _assert_send_sync_bounds() {\n        // BoxBodySync must be both Send and Sync\n        _assert_send::<BoxBodySync>();\n        _assert_sync::<BoxBodySync>();\n\n        // BoxBody must be Send (but is intentionally NOT Sync - it's UnsyncBoxBody)\n        _assert_send::<BoxBody>();\n    }\n\n    #[tokio::test]\n    async fn test_wrap_stream_sync_produces_sync_body() {\n        use futures_util::stream;\n\n        let data = Bytes::from(\"test sync\");\n        let stream = stream::iter(vec![Ok::<_, std::io::Error>(data.clone())]);\n\n        let body = wrap_stream_sync(stream);\n\n        // Compile-time check: ensure the body is Sync\n        fn check_sync<T: Sync>(_: &T) {}\n        check_sync(&body);\n\n        let collected = collect_bytes(body).await.unwrap();\n        assert_eq!(collected, data);\n    }\n\n    #[test]\n    fn test_empty_sync_is_sync() {\n        let body = empty_sync();\n        fn check_sync<T: Sync>(_: &T) {}\n        check_sync(&body);\n    }\n\n    #[test]\n    fn test_boxed_sync_is_sync() {\n        use http_body_util::Full;\n        let body = boxed_sync(Full::new(Bytes::from(\"test\")));\n        fn check_sync<T: Sync>(_: &T) {}\n        check_sync(&body);\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/src/error.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n// This code was copied and then modified from Tokio's Axum.\n\n/* Copyright (c) 2021 Tower Contributors\n *\n * Permission is hereby granted, free of charge, to any\n * person obtaining a copy of this software and associated\n * documentation files (the \"Software\"), to deal in the\n * Software without restriction, including without\n * limitation the rights to use, copy, modify, merge,\n * publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software\n * is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice\n * shall be included in all copies or substantial portions\n * of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF\n * ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED\n * TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A\n * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT\n * SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR\n * IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\n * DEALINGS IN THE SOFTWARE.\n */\n\n//! Error definition.\n\nuse std::{error::Error as StdError, fmt};\n\n/// Errors that can happen when using this crate.\n#[derive(Debug)]\npub struct Error {\n    inner: BoxError,\n}\n\n/// A boxed error type that can be used in trait bounds for body error conversion.\n///\n/// This type alias is used by generated code to specify trait bounds for body types.\npub type BoxError = Box<dyn StdError + Send + Sync>;\n\nimpl Error {\n    /// Create a new `Error` from a boxable error.\n    pub(crate) fn new(error: impl Into<BoxError>) -> Self {\n        Self { inner: error.into() }\n    }\n}\n\nimpl fmt::Display for Error {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        self.inner.fmt(f)\n    }\n}\n\nimpl StdError for Error {\n    fn source(&self) -> Option<&(dyn StdError + 'static)> {\n        Some(&*self.inner)\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/src/extension.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Extension types.\n//!\n//! Extension types are types that are stored in and extracted from _both_ requests and\n//! responses.\n//!\n//! There is only one _generic_ extension type _for requests_, [`Extension`].\n//!\n//! On the other hand, the server SDK uses multiple concrete extension types for responses in order\n//! to store a variety of information, like the operation that was executed, the operation error\n//! that got returned, or the runtime error that happened, among others. The information stored in\n//! these types may be useful to [`tower::Layer`]s that post-process the response: for instance, a\n//! particular metrics layer implementation might want to emit metrics about the number of times an\n//! an operation got executed.\n//!\n//! [extensions]: https://docs.rs/http/latest/http/struct.Extensions.html\n\nuse std::hash::Hash;\nuse std::{fmt, fmt::Debug, future::Future, ops::Deref, pin::Pin, task::Context, task::Poll};\n\nuse futures_util::ready;\nuse futures_util::TryFuture;\nuse thiserror::Error;\nuse tower::Service;\n\nuse crate::operation::OperationShape;\nuse crate::plugin::{HttpMarker, HttpPlugins, Plugin, PluginStack};\nuse crate::shape_id::ShapeId;\n\npub use crate::request::extension::{Extension, MissingExtension};\n\n/// Extension type used to store information about Smithy operations in HTTP responses.\n/// This extension type is inserted, via the [`OperationExtensionPlugin`], whenever it has been correctly determined\n/// that the request should be routed to a particular operation. The operation handler might not even get invoked\n/// because the request fails to deserialize into the modeled operation input.\n#[derive(Debug, Clone, PartialEq, Eq, Hash)]\npub struct OperationExtension(pub ShapeId);\n\n/// An error occurred when parsing an absolute operation shape ID.\n#[derive(Debug, Clone, Error, PartialEq, Eq)]\n#[non_exhaustive]\npub enum ParseError {\n    #[error(\"# was not found - missing namespace\")]\n    MissingNamespace,\n}\n\npin_project_lite::pin_project! {\n    /// The [`Service::Future`] of [`OperationExtensionService`] - inserts an [`OperationExtension`] into the\n    /// [`http::Response]`.\n    pub struct OperationExtensionFuture<Fut> {\n        #[pin]\n        inner: Fut,\n        operation_extension: Option<OperationExtension>\n    }\n}\n\nimpl<Fut, RespB> Future for OperationExtensionFuture<Fut>\nwhere\n    Fut: TryFuture<Ok = http::Response<RespB>>,\n{\n    type Output = Result<http::Response<RespB>, Fut::Error>;\n\n    fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {\n        let this = self.project();\n        let resp = ready!(this.inner.try_poll(cx));\n        let ext = this\n            .operation_extension\n            .take()\n            .expect(\"futures cannot be polled after completion\");\n        Poll::Ready(resp.map(|mut resp| {\n            resp.extensions_mut().insert(ext);\n            resp\n        }))\n    }\n}\n\n/// Inserts a [`OperationExtension`] into the extensions of the [`http::Response`].\n#[derive(Debug, Clone)]\npub struct OperationExtensionService<S> {\n    inner: S,\n    operation_extension: OperationExtension,\n}\n\nimpl<S, B, RespBody> Service<http::Request<B>> for OperationExtensionService<S>\nwhere\n    S: Service<http::Request<B>, Response = http::Response<RespBody>>,\n{\n    type Response = http::Response<RespBody>;\n    type Error = S::Error;\n    type Future = OperationExtensionFuture<S::Future>;\n\n    fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {\n        self.inner.poll_ready(cx)\n    }\n\n    fn call(&mut self, req: http::Request<B>) -> Self::Future {\n        OperationExtensionFuture {\n            inner: self.inner.call(req),\n            operation_extension: Some(self.operation_extension.clone()),\n        }\n    }\n}\n\n/// A [`Plugin`] which applies [`OperationExtensionService`] to every operation.\npub struct OperationExtensionPlugin;\n\nimpl fmt::Debug for OperationExtensionPlugin {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        f.debug_tuple(\"OperationExtensionPlugin\").field(&\"...\").finish()\n    }\n}\n\nimpl<Ser, Op, T> Plugin<Ser, Op, T> for OperationExtensionPlugin\nwhere\n    Op: OperationShape,\n{\n    type Output = OperationExtensionService<T>;\n\n    fn apply(&self, inner: T) -> Self::Output {\n        OperationExtensionService {\n            inner,\n            operation_extension: OperationExtension(Op::ID),\n        }\n    }\n}\n\nimpl HttpMarker for OperationExtensionPlugin {}\n\n/// An extension trait on [`HttpPlugins`] allowing the application of [`OperationExtensionPlugin`].\n///\n/// See [`module`](crate::extension) documentation for more info.\npub trait OperationExtensionExt<CurrentPlugin> {\n    /// Apply the [`OperationExtensionPlugin`], which inserts the [`OperationExtension`] into every [`http::Response`].\n    fn insert_operation_extension(self) -> HttpPlugins<PluginStack<OperationExtensionPlugin, CurrentPlugin>>;\n}\n\nimpl<CurrentPlugin> OperationExtensionExt<CurrentPlugin> for HttpPlugins<CurrentPlugin> {\n    fn insert_operation_extension(self) -> HttpPlugins<PluginStack<OperationExtensionPlugin, CurrentPlugin>> {\n        self.push(OperationExtensionPlugin)\n    }\n}\n\n/// Extension type used to store the type of user-modeled error returned by an operation handler.\n/// These are modeled errors, defined in the Smithy model.\n#[derive(Debug, Clone)]\npub struct ModeledErrorExtension(&'static str);\n\nimpl ModeledErrorExtension {\n    /// Creates a new `ModeledErrorExtension`.\n    pub fn new(value: &'static str) -> ModeledErrorExtension {\n        ModeledErrorExtension(value)\n    }\n}\n\nimpl Deref for ModeledErrorExtension {\n    type Target = &'static str;\n\n    fn deref(&self) -> &Self::Target {\n        &self.0\n    }\n}\n\n/// Extension type used to store the _name_ of the possible runtime errors.\n/// These are _unmodeled_ errors; the operation handler was not invoked.\n#[derive(Debug, Clone)]\npub struct RuntimeErrorExtension(String);\n\nimpl RuntimeErrorExtension {\n    /// Creates a new `RuntimeErrorExtension`.\n    pub fn new(value: String) -> RuntimeErrorExtension {\n        RuntimeErrorExtension(value)\n    }\n}\n\nimpl Deref for RuntimeErrorExtension {\n    type Target = String;\n\n    fn deref(&self) -> &Self::Target {\n        &self.0\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use tower::{service_fn, Layer, ServiceExt};\n\n    use crate::{plugin::PluginLayer, protocol::rest_json_1::RestJson1};\n\n    use super::*;\n\n    #[test]\n    fn ext_accept() {\n        let value = \"com.amazonaws.ebs#CompleteSnapshot\";\n        let ext = ShapeId::new(\n            \"com.amazonaws.ebs#CompleteSnapshot\",\n            \"com.amazonaws.ebs\",\n            \"CompleteSnapshot\",\n        );\n\n        assert_eq!(ext.absolute(), value);\n        assert_eq!(ext.namespace(), \"com.amazonaws.ebs\");\n        assert_eq!(ext.name(), \"CompleteSnapshot\");\n    }\n\n    #[tokio::test]\n    async fn plugin() {\n        struct DummyOp;\n\n        impl OperationShape for DummyOp {\n            const ID: ShapeId = ShapeId::new(\n                \"com.amazonaws.ebs#CompleteSnapshot\",\n                \"com.amazonaws.ebs\",\n                \"CompleteSnapshot\",\n            );\n\n            type Input = ();\n            type Output = ();\n            type Error = ();\n        }\n\n        // Apply `Plugin`.\n        let plugins = HttpPlugins::new().insert_operation_extension();\n\n        // Apply `Plugin`s `Layer`.\n        let layer = PluginLayer::new::<RestJson1, DummyOp>(plugins);\n        let svc = service_fn(|_: http::Request<()>| async { Ok::<_, ()>(http::Response::new(())) });\n        let svc = layer.layer(svc);\n\n        // Check for `OperationExtension`.\n        let response = svc.oneshot(http::Request::new(())).await.unwrap();\n        let expected = DummyOp::ID;\n        let actual = response.extensions().get::<OperationExtension>().unwrap();\n        assert_eq!(actual.0, expected);\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/src/instrumentation/mod.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n#![deny(missing_docs, missing_debug_implementations)]\n\n//! Provides [`InstrumentOperation`] and a variety of helpers structures for dealing with sensitive data. Together they\n//! allow compliance with the [sensitive trait].\n//!\n//! # Example\n//!\n//! ```\n//! # use std::convert::Infallible;\n//! # use aws_smithy_http_server::instrumentation::{*, sensitivity::{*, headers::*, uri::*}};\n//! # use aws_smithy_http_server::shape_id::ShapeId;\n//! # use http::{Request, Response};\n//! # use tower::{util::service_fn, Service};\n//! # async fn service(request: Request<()>) -> Result<Response<()>, Infallible> {\n//! #   Ok(Response::new(()))\n//! # }\n//! # async fn example() {\n//! # let service = service_fn(service);\n//! # const ID: ShapeId = ShapeId::new(\"namespace#foo-operation\", \"namespace\", \"foo-operation\");\n//! let request = Request::get(\"http://localhost/a/b/c/d?bar=hidden\")\n//!     .header(\"header-name-a\", \"hidden\")\n//!     .body(())\n//!     .unwrap();\n//!\n//! let request_fmt = RequestFmt::new()\n//!     .header(|name| HeaderMarker {\n//!        value: name == \"header-name-a\",\n//!        key_suffix: None,\n//!     })\n//!     .query(|name| QueryMarker { key: false, value: name == \"bar\" })\n//!     .label(|index| index % 2 == 0, None);\n//! let response_fmt = ResponseFmt::new()\n//!     .header(|name| {\n//!         if name.as_str().starts_with(\"prefix-\") {\n//!             HeaderMarker {\n//!                 value: true,\n//!                 key_suffix: Some(\"prefix-\".len()),\n//!             }\n//!         } else {\n//!             HeaderMarker {\n//!                 value: name == \"header-name-b\",\n//!                 key_suffix: None,\n//!             }\n//!         }\n//!     })\n//!     .status_code();\n//! let mut service = InstrumentOperation::new(service, ID)\n//!     .request_fmt(request_fmt)\n//!     .response_fmt(response_fmt);\n//!\n//! let _ = service.call(request).await.unwrap();\n//! # }\n//! ```\n//!\n//! [sensitive trait]: https://smithy.io/2.0/spec/documentation-traits.html#sensitive-trait\n\nmod plugin;\npub mod sensitivity;\nmod service;\n\nuse std::fmt::{Debug, Display};\n\npub use plugin::*;\npub use service::*;\n\n/// A standard interface for taking some component of the HTTP request/response and transforming it into new struct\n/// which supports [`Debug`] or [`Display`]. This allows for polymorphism over formatting approaches.\npub trait MakeFmt<T> {\n    /// Target of the `fmt` transformation.\n    type Target;\n\n    /// Transforms a source into a target, altering it's [`Display`] or [`Debug`] implementation.\n    fn make(&self, source: T) -> Self::Target;\n}\n\nimpl<T, U> MakeFmt<T> for &U\nwhere\n    U: MakeFmt<T>,\n{\n    type Target = U::Target;\n\n    fn make(&self, source: T) -> Self::Target {\n        U::make(self, source)\n    }\n}\n\n/// Identical to [`MakeFmt`] but with a [`Display`] bound on the associated type.\npub trait MakeDisplay<T> {\n    /// Mirrors [`MakeFmt::Target`].\n    type Target: Display;\n\n    /// Mirrors [`MakeFmt::make`].\n    fn make_display(&self, source: T) -> Self::Target;\n}\n\nimpl<T, U> MakeDisplay<T> for U\nwhere\n    U: MakeFmt<T>,\n    U::Target: Display,\n{\n    type Target = U::Target;\n\n    fn make_display(&self, source: T) -> Self::Target {\n        U::make(self, source)\n    }\n}\n\n/// Identical to [`MakeFmt`] but with a [`Debug`] bound on the associated type.\npub trait MakeDebug<T> {\n    /// Mirrors [`MakeFmt::Target`].\n    type Target: Debug;\n\n    /// Mirrors [`MakeFmt::make`].\n    fn make_debug(&self, source: T) -> Self::Target;\n}\n\nimpl<T, U> MakeDebug<T> for U\nwhere\n    U: MakeFmt<T>,\n    U::Target: Debug,\n{\n    type Target = U::Target;\n\n    fn make_debug(&self, source: T) -> Self::Target {\n        U::make(self, source)\n    }\n}\n\n/// A blanket, identity, [`MakeFmt`] implementation. Applies no changes to the [`Display`]/[`Debug`] implementation.\n#[derive(Debug, Clone, Default)]\npub struct MakeIdentity;\n\nimpl<T> MakeFmt<T> for MakeIdentity {\n    type Target = T;\n\n    fn make(&self, source: T) -> Self::Target {\n        source\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/src/instrumentation/plugin.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::plugin::{HttpMarker, HttpPlugins, PluginStack};\nuse crate::{operation::OperationShape, plugin::Plugin};\n\nuse super::sensitivity::Sensitivity;\nuse super::InstrumentOperation;\n\n/// A [`Plugin`] which applies [`InstrumentOperation`] to every operation.\n#[derive(Debug)]\npub struct InstrumentPlugin;\n\nimpl<Ser, Op, T> Plugin<Ser, Op, T> for InstrumentPlugin\nwhere\n    Op: OperationShape,\n    Op: Sensitivity,\n{\n    type Output = InstrumentOperation<T, Op::RequestFmt, Op::ResponseFmt>;\n\n    fn apply(&self, input: T) -> Self::Output {\n        InstrumentOperation::new(input, Op::ID)\n            .request_fmt(Op::request_fmt())\n            .response_fmt(Op::response_fmt())\n    }\n}\n\nimpl HttpMarker for InstrumentPlugin {}\n\n/// An extension trait for applying [`InstrumentPlugin`].\npub trait InstrumentExt<CurrentPlugin> {\n    /// Applies an [`InstrumentOperation`] to every operation, respecting the [@sensitive] trait given on the input and\n    /// output models. See [`InstrumentOperation`] for more information.\n    ///\n    /// [@sensitive]: https://smithy.io/2.0/spec/documentation-traits.html#sensitive-trait\n    fn instrument(self) -> HttpPlugins<PluginStack<InstrumentPlugin, CurrentPlugin>>;\n}\n\nimpl<CurrentPlugin> InstrumentExt<CurrentPlugin> for HttpPlugins<CurrentPlugin> {\n    fn instrument(self) -> HttpPlugins<PluginStack<InstrumentPlugin, CurrentPlugin>> {\n        self.push(InstrumentPlugin)\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/src/instrumentation/sensitivity/headers.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! A wrapper around [`HeaderMap`] to allow for sensitivity.\n\nuse std::fmt::{Debug, Display, Error, Formatter};\n\nuse http::{header::HeaderName, HeaderMap};\n\nuse crate::instrumentation::MakeFmt;\n\nuse super::Sensitive;\n\n/// Marks the sensitive data of a header pair.\n#[derive(Debug, Default, PartialEq, Eq)]\npub struct HeaderMarker {\n    /// Set to `true` to mark the value as sensitive.\n    pub value: bool,\n    /// Set to `Some(x)` to mark `key[x..]` as sensitive.\n    pub key_suffix: Option<usize>,\n}\n\n/// A wrapper around [`&HeaderMap`](HeaderMap) which modifies the behavior of [`Debug`]. Specific parts of the\n/// [`HeaderMap`] are marked as sensitive using a closure. This accommodates the [httpPrefixHeaders trait] and\n/// [httpHeader trait].\n///\n/// The [`Debug`] implementation will respect the `unredacted-logging` flag.\n///\n/// # Example\n///\n/// ```\n/// # use aws_smithy_http_server::instrumentation::sensitivity::headers::{SensitiveHeaders, HeaderMarker};\n/// # use http::header::HeaderMap;\n/// # let headers = HeaderMap::new();\n/// // Headers with keys equal to \"header-name\" are sensitive\n/// let marker = |key|\n///     HeaderMarker {\n///         value: key == \"header-name\",\n///         key_suffix: None\n///     };\n/// let headers = SensitiveHeaders::new(&headers, marker);\n/// println!(\"{headers:?}\");\n/// ```\n///\n/// [httpPrefixHeaders trait]: https://smithy.io/2.0/spec/http-bindings.html#httpprefixheaders-trait\n/// [httpHeader trait]: https://smithy.io/2.0/spec/http-bindings.html#httpheader-trait\npub struct SensitiveHeaders<'a, F> {\n    headers: &'a HeaderMap,\n    marker: F,\n}\n\nimpl<'a, F> SensitiveHeaders<'a, F> {\n    /// Constructs a new [`SensitiveHeaders`].\n    pub fn new(headers: &'a HeaderMap, marker: F) -> Self {\n        Self { headers, marker }\n    }\n}\n\n/// Concatenates the [`Debug`] of [`&str`](str) and ['Sensitive<&str>`](Sensitive).\nstruct ThenDebug<'a>(&'a str, Sensitive<&'a str>);\n\nimpl Debug for ThenDebug<'_> {\n    #[inline]\n    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error> {\n        write!(f, \"\\\"{}{}\\\"\", self.0, self.1)\n    }\n}\n\n/// Allows for formatting of `Left` or `Right` variants.\nenum OrFmt<Left, Right> {\n    Left(Left),\n    Right(Right),\n}\n\nimpl<Left, Right> Debug for OrFmt<Left, Right>\nwhere\n    Left: Debug,\n    Right: Debug,\n{\n    #[inline]\n    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {\n        match self {\n            Self::Left(left) => left.fmt(f),\n            Self::Right(right) => right.fmt(f),\n        }\n    }\n}\n\nimpl<Left, Right> Display for OrFmt<Left, Right>\nwhere\n    Left: Display,\n    Right: Display,\n{\n    #[inline]\n    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error> {\n        match self {\n            Self::Left(left) => left.fmt(f),\n            Self::Right(right) => right.fmt(f),\n        }\n    }\n}\n\nimpl<'a, F> Debug for SensitiveHeaders<'a, F>\nwhere\n    F: Fn(&'a HeaderName) -> HeaderMarker,\n{\n    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error> {\n        let iter = self.headers.iter().map(|(key, value)| {\n            let HeaderMarker {\n                value: value_sensitive,\n                key_suffix,\n            } = (self.marker)(key);\n\n            let key = if let Some(key_suffix) = key_suffix {\n                let key_str = key.as_str();\n                OrFmt::Left(ThenDebug(&key_str[..key_suffix], Sensitive(&key_str[key_suffix..])))\n            } else {\n                OrFmt::Right(key)\n            };\n\n            let value = if value_sensitive {\n                OrFmt::Left(Sensitive(value))\n            } else {\n                OrFmt::Right(value)\n            };\n\n            (key, value)\n        });\n\n        f.debug_map().entries(iter).finish()\n    }\n}\n\n/// A [`MakeFmt`] producing [`SensitiveHeaders`].\n#[derive(Clone)]\npub struct MakeHeaders<F>(pub(crate) F);\n\nimpl<F> Debug for MakeHeaders<F> {\n    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {\n        f.debug_tuple(\"MakeHeaders\").field(&\"...\").finish()\n    }\n}\n\nimpl<'a, F> MakeFmt<&'a HeaderMap> for MakeHeaders<F>\nwhere\n    F: Clone,\n{\n    type Target = SensitiveHeaders<'a, F>;\n\n    fn make(&self, source: &'a HeaderMap) -> Self::Target {\n        SensitiveHeaders::new(source, self.0.clone())\n    }\n}\n#[cfg(test)]\nmod tests {\n    use http::{header::HeaderName, HeaderMap, HeaderValue};\n\n    use super::*;\n\n    // This is needed because we header maps with \"{redacted}\" are disallowed.\n    struct TestDebugMap([(&'static str, &'static str); 4]);\n\n    impl Debug for TestDebugMap {\n        fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error> {\n            f.debug_map().entries(self.0).finish()\n        }\n    }\n\n    const HEADER_MAP: [(&str, &str); 4] = [\n        (\"name-a\", \"value-a\"),\n        (\"name-b\", \"value-b\"),\n        (\"prefix-a-x\", \"value-c\"),\n        (\"prefix-b-y\", \"value-d\"),\n    ];\n\n    fn to_header_map<I>(values: I) -> HeaderMap\n    where\n        I: IntoIterator<Item = (&'static str, &'static str)>,\n    {\n        values\n            .into_iter()\n            .map(|(key, value)| (HeaderName::from_static(key), HeaderValue::from_static(value)))\n            .collect()\n    }\n\n    #[test]\n    fn mark_none() {\n        let original: HeaderMap = to_header_map(HEADER_MAP);\n\n        let output = SensitiveHeaders::new(&original, |_| HeaderMarker::default());\n        assert_eq!(format!(\"{output:?}\"), format!(\"{original:?}\"));\n    }\n\n    #[cfg(not(feature = \"unredacted-logging\"))]\n    const ALL_VALUES_HEADER_MAP: [(&str, &str); 4] = [\n        (\"name-a\", \"{redacted}\"),\n        (\"name-b\", \"{redacted}\"),\n        (\"prefix-a-x\", \"{redacted}\"),\n        (\"prefix-b-y\", \"{redacted}\"),\n    ];\n    #[cfg(feature = \"unredacted-logging\")]\n    const ALL_VALUES_HEADER_MAP: [(&str, &str); 4] = HEADER_MAP;\n\n    #[test]\n    fn mark_all_values() {\n        let original: HeaderMap = to_header_map(HEADER_MAP);\n        let expected = TestDebugMap(ALL_VALUES_HEADER_MAP);\n\n        let output = SensitiveHeaders::new(&original, |_| HeaderMarker {\n            value: true,\n            key_suffix: None,\n        });\n        assert_eq!(format!(\"{output:?}\"), format!(\"{expected:?}\"));\n    }\n\n    #[cfg(not(feature = \"unredacted-logging\"))]\n    const NAME_A_HEADER_MAP: [(&str, &str); 4] = [\n        (\"name-a\", \"{redacted}\"),\n        (\"name-b\", \"value-b\"),\n        (\"prefix-a-x\", \"value-c\"),\n        (\"prefix-b-y\", \"value-d\"),\n    ];\n    #[cfg(feature = \"unredacted-logging\")]\n    const NAME_A_HEADER_MAP: [(&str, &str); 4] = HEADER_MAP;\n\n    #[test]\n    fn mark_name_a_values() {\n        let original: HeaderMap = to_header_map(HEADER_MAP);\n        let expected = TestDebugMap(NAME_A_HEADER_MAP);\n\n        let output = SensitiveHeaders::new(&original, |name| HeaderMarker {\n            value: name == \"name-a\",\n            key_suffix: None,\n        });\n        assert_eq!(format!(\"{output:?}\"), format!(\"{expected:?}\"));\n    }\n\n    #[cfg(not(feature = \"unredacted-logging\"))]\n    const PREFIX_A_HEADER_MAP: [(&str, &str); 4] = [\n        (\"name-a\", \"value-a\"),\n        (\"name-b\", \"value-b\"),\n        (\"prefix-a{redacted}\", \"value-c\"),\n        (\"prefix-b-y\", \"value-d\"),\n    ];\n    #[cfg(feature = \"unredacted-logging\")]\n    const PREFIX_A_HEADER_MAP: [(&str, &str); 4] = HEADER_MAP;\n\n    #[test]\n    fn mark_prefix_a_values() {\n        let original: HeaderMap = to_header_map(HEADER_MAP);\n        let expected = TestDebugMap(PREFIX_A_HEADER_MAP);\n\n        let prefix = \"prefix-a\";\n        let output = SensitiveHeaders::new(&original, |name: &HeaderName| HeaderMarker {\n            value: false,\n            key_suffix: if name.as_str().starts_with(prefix) {\n                Some(prefix.len())\n            } else {\n                None\n            },\n        });\n        assert_eq!(format!(\"{output:?}\"), format!(\"{:?}\", expected));\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/src/instrumentation/sensitivity/mod.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! The combination of [HTTP binding traits] and the [sensitive trait] require us to redact\n//! portions of the HTTP requests/responses during logging.\n//!\n//! [HTTP binding traits]: https://smithy.io/2.0/spec/http-bindings.html\n//! [sensitive trait]: https://smithy.io/2.0/spec/documentation-traits.html#sensitive-trait\n\npub mod headers;\nmod request;\nmod response;\nmod sensitive;\npub mod uri;\n\nuse http::{HeaderMap, StatusCode, Uri};\npub use request::*;\npub use response::*;\npub use sensitive::*;\n\nuse super::{MakeDebug, MakeDisplay};\n\n/// The string placeholder for redacted data.\npub const REDACTED: &str = \"{redacted}\";\n\n/// An interface for providing [`MakeDebug`] and [`MakeDisplay`] for [`Request`](http::Request) and\n/// [`Response`](http::Response).\npub trait Sensitivity {\n    /// The [`MakeDebug`] and [`MakeDisplay`] for the request [`HeaderMap`] and [`Uri`].\n    type RequestFmt: for<'a> MakeDebug<&'a HeaderMap> + for<'a> MakeDisplay<&'a Uri>;\n    /// The [`MakeDebug`] and [`MakeDisplay`] for the response [`HeaderMap`] and [`StatusCode`].\n    type ResponseFmt: for<'a> MakeDebug<&'a HeaderMap> + MakeDisplay<StatusCode>;\n\n    /// Returns the [`RequestFmt`](Sensitivity::RequestFmt).\n    fn request_fmt() -> Self::RequestFmt;\n\n    /// Returns the [`ResponseFmt`](Sensitivity::ResponseFmt).\n    fn response_fmt() -> Self::ResponseFmt;\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/src/instrumentation/sensitivity/request.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! A builder whose methods allow for configuration of [`MakeFmt`] implementations over parts of [`http::Request`].\n\nuse std::fmt::{Debug, Error, Formatter};\n\nuse http::{header::HeaderName, HeaderMap};\n\nuse crate::instrumentation::{MakeFmt, MakeIdentity};\n\nuse super::{\n    headers::{HeaderMarker, MakeHeaders},\n    uri::{GreedyLabel, MakeLabel, MakeQuery, MakeUri, QueryMarker},\n};\n\n/// Allows the modification the requests URIs [`Display`](std::fmt::Display) and headers\n/// [`Debug`] to accommodate sensitivity.\n///\n/// This provides [`MakeFmt`] for [`&HeaderMap`](HeaderMap) and [`&Uri`](http::Uri).\n#[derive(Clone)]\npub struct RequestFmt<Headers, Uri> {\n    headers: Headers,\n    uri: Uri,\n}\n\nimpl<Headers, Uri> Debug for RequestFmt<Headers, Uri> {\n    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error> {\n        f.debug_struct(\"RequestFmt\").finish_non_exhaustive()\n    }\n}\n\n/// Default [`RequestFmt`].\npub type DefaultRequestFmt = RequestFmt<MakeIdentity, MakeUri<MakeIdentity, MakeIdentity>>;\n\nimpl Default for DefaultRequestFmt {\n    fn default() -> Self {\n        Self {\n            headers: MakeIdentity,\n            uri: MakeUri::default(),\n        }\n    }\n}\n\nimpl DefaultRequestFmt {\n    /// Constructs a new [`RequestFmt`] with no redactions.\n    pub fn new() -> Self {\n        Self::default()\n    }\n}\n\nimpl<Header, Uri> RequestFmt<Header, Uri> {\n    /// Marks parts of headers as sensitive using a closure.\n    ///\n    /// See [`SensitiveHeaders`](super::headers::SensitiveHeaders) for more info.\n    pub fn header<F>(self, headers: F) -> RequestFmt<MakeHeaders<F>, Uri>\n    where\n        F: Fn(&HeaderName) -> HeaderMarker,\n    {\n        RequestFmt {\n            headers: MakeHeaders(headers),\n            uri: self.uri,\n        }\n    }\n}\n\nimpl<Header, P, Q> RequestFmt<Header, MakeUri<P, Q>> {\n    /// Marks parts of the URI as sensitive.\n    ///\n    /// See [`Label`](super::uri::Label) for more info.\n    pub fn label<F>(\n        self,\n        label_marker: F,\n        greedy_label: Option<GreedyLabel>,\n    ) -> RequestFmt<Header, MakeUri<MakeLabel<F>, Q>>\n    where\n        F: Fn(usize) -> bool,\n    {\n        RequestFmt {\n            headers: self.headers,\n            uri: MakeUri {\n                make_path: MakeLabel {\n                    label_marker,\n                    greedy_label,\n                },\n                make_query: self.uri.make_query,\n            },\n        }\n    }\n\n    /// Marks parts of the query as sensitive.\n    ///\n    /// See [`Query`](super::uri::Query) for more info.\n    pub fn query<F>(self, query: F) -> RequestFmt<Header, MakeUri<P, MakeQuery<F>>>\n    where\n        F: Fn(&str) -> QueryMarker,\n    {\n        RequestFmt {\n            headers: self.headers,\n            uri: MakeUri {\n                make_path: self.uri.make_path,\n                make_query: MakeQuery(query),\n            },\n        }\n    }\n}\n\nimpl<'a, Headers, Uri> MakeFmt<&'a HeaderMap> for RequestFmt<Headers, Uri>\nwhere\n    Headers: MakeFmt<&'a HeaderMap>,\n{\n    type Target = Headers::Target;\n\n    fn make(&self, source: &'a HeaderMap) -> Self::Target {\n        self.headers.make(source)\n    }\n}\n\nimpl<'a, Headers, Uri> MakeFmt<&'a http::Uri> for RequestFmt<Headers, Uri>\nwhere\n    Uri: MakeFmt<&'a http::Uri>,\n{\n    type Target = Uri::Target;\n\n    fn make(&self, source: &'a http::Uri) -> Self::Target {\n        self.uri.make(source)\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/src/instrumentation/sensitivity/response.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! A builder whose methods allow for configuration of [`MakeFmt`] implementations over parts of [`http::Response`].\n\nuse std::fmt::{Debug, Error, Formatter};\n\nuse http::{header::HeaderName, HeaderMap};\n\nuse crate::instrumentation::{MakeFmt, MakeIdentity};\n\nuse super::{\n    headers::{HeaderMarker, MakeHeaders},\n    MakeSensitive,\n};\n\n/// Allows the modification the responses status code [`Display`](std::fmt::Display) and headers\n/// [`Debug`] to accommodate sensitivity.\n///\n/// This provides [`MakeFmt`] for [`&HeaderMap`](HeaderMap) and [`StatusCode`](http::StatusCode).\n#[derive(Clone)]\npub struct ResponseFmt<Headers, StatusCode> {\n    headers: Headers,\n    status_code: StatusCode,\n}\n\nimpl<Headers, StatusCode> Debug for ResponseFmt<Headers, StatusCode> {\n    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error> {\n        f.debug_struct(\"ResponseFmt\").finish_non_exhaustive()\n    }\n}\n\n/// Default [`ResponseFmt`].\npub type DefaultResponseFmt = ResponseFmt<MakeIdentity, MakeIdentity>;\n\nimpl Default for DefaultResponseFmt {\n    fn default() -> Self {\n        Self {\n            headers: MakeIdentity,\n            status_code: MakeIdentity,\n        }\n    }\n}\n\nimpl DefaultResponseFmt {\n    /// Constructs a new [`ResponseFmt`] with no redactions.\n    pub fn new() -> Self {\n        Self::default()\n    }\n}\n\nimpl<Header, StatusCode> ResponseFmt<Header, StatusCode> {\n    /// Marks headers as sensitive using a closure.\n    ///\n    /// See [`SensitiveHeaders`](super::headers::SensitiveHeaders) for more info.\n    pub fn header<F>(self, header: F) -> ResponseFmt<MakeHeaders<F>, StatusCode>\n    where\n        F: Fn(&HeaderName) -> HeaderMarker,\n    {\n        ResponseFmt {\n            headers: MakeHeaders(header),\n            status_code: self.status_code,\n        }\n    }\n\n    /// Marks request status code as sensitive.\n    pub fn status_code(self) -> ResponseFmt<Header, MakeSensitive> {\n        ResponseFmt {\n            headers: self.headers,\n            status_code: MakeSensitive,\n        }\n    }\n}\n\nimpl<'a, Headers, StatusCode> MakeFmt<&'a HeaderMap> for ResponseFmt<Headers, StatusCode>\nwhere\n    Headers: MakeFmt<&'a HeaderMap>,\n{\n    type Target = Headers::Target;\n\n    fn make(&self, source: &'a HeaderMap) -> Self::Target {\n        self.headers.make(source)\n    }\n}\n\nimpl<Headers, StatusCode> MakeFmt<http::StatusCode> for ResponseFmt<Headers, StatusCode>\nwhere\n    StatusCode: MakeFmt<http::StatusCode>,\n{\n    type Target = StatusCode::Target;\n\n    fn make(&self, source: http::StatusCode) -> Self::Target {\n        self.status_code.make(source)\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/src/instrumentation/sensitivity/sensitive.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! A general wrapper to allow for feature flagged redactions.\n\nuse std::fmt::{Debug, Display, Error, Formatter};\n\nuse crate::instrumentation::MakeFmt;\n\nuse super::REDACTED;\n\n/// A wrapper used to modify the [`Display`] and [`Debug`] implementation of the inner structure\n/// based on the feature flag `unredacted-logging`. When the `unredacted-logging` feature is enabled, the\n/// implementations will defer to those on `T`, when disabled they will defer to [`REDACTED`].\n///\n/// Note that there are [`Display`] and [`Debug`] implementations for `&T` where `T: Display`\n/// and `T: Debug` respectively - wrapping references is allowed for the cases when consuming the\n/// inner struct is not desired.\n///\n/// # Example\n///\n/// ```\n/// # use aws_smithy_http_server::instrumentation::sensitivity::Sensitive;\n/// # let address = \"\";\n/// tracing::debug!(\n///     name = %Sensitive(\"Alice\"),\n///     friends = ?Sensitive([\"Bob\"]),\n///     address = ?Sensitive(&address)\n/// );\n/// ```\npub struct Sensitive<T>(pub T);\n\nimpl<T> Debug for Sensitive<T>\nwhere\n    T: Debug,\n{\n    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error> {\n        if cfg!(feature = \"unredacted-logging\") {\n            self.0.fmt(f)\n        } else {\n            Debug::fmt(&REDACTED, f)\n        }\n    }\n}\n\nimpl<T> Display for Sensitive<T>\nwhere\n    T: Display,\n{\n    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error> {\n        if cfg!(feature = \"unredacted-logging\") {\n            self.0.fmt(f)\n        } else {\n            Display::fmt(&REDACTED, f)\n        }\n    }\n}\n\n/// A [`MakeFmt`] producing [`Sensitive`].\n#[derive(Debug, Clone)]\npub struct MakeSensitive;\n\nimpl<T> MakeFmt<T> for MakeSensitive {\n    type Target = Sensitive<T>;\n\n    fn make(&self, source: T) -> Self::Target {\n        Sensitive(source)\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n\n    #[test]\n    fn debug() {\n        let inner = \"hello world\";\n        let sensitive = Sensitive(inner);\n        let actual = format!(\"{sensitive:?}\");\n        let expected = if cfg!(feature = \"unredacted-logging\") {\n            format!(\"{inner:?}\")\n        } else {\n            format!(\"{REDACTED:?}\")\n        };\n        assert_eq!(actual, expected)\n    }\n\n    #[test]\n    fn display() {\n        let inner = \"hello world\";\n        let sensitive = Sensitive(inner);\n        let actual = format!(\"{sensitive}\");\n        let expected = if cfg!(feature = \"unredacted-logging\") {\n            inner.to_string()\n        } else {\n            REDACTED.to_string()\n        };\n        assert_eq!(actual, expected)\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/src/instrumentation/sensitivity/uri/label.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! A wrapper around a path [`&str`](str) to allow for sensitivity.\n\nuse std::fmt::{Debug, Display, Error, Formatter};\n\nuse crate::instrumentation::{sensitivity::Sensitive, MakeFmt};\n\n/// A wrapper around a path [`&str`](str) which modifies the behavior of [`Display`]. Specific path segments are marked\n/// as sensitive by providing predicate over the segment index. This accommodates the [httpLabel trait] with\n/// non-greedy labels.\n///\n/// The [`Display`] implementation will respect the `unredacted-logging` flag.\n///\n/// # Example\n///\n/// ```\n/// # use aws_smithy_http_server::instrumentation::sensitivity::uri::Label;\n/// # use http::Uri;\n/// # let path = \"\";\n/// // Path segment 2 is redacted and a trailing greedy label\n/// let uri = Label::new(&path, |x| x == 2, None);\n/// println!(\"{uri}\");\n/// ```\n///\n/// [httpLabel trait]: https://smithy.io/2.0/spec/http-bindings.html#httplabel-trait\n#[allow(missing_debug_implementations)]\n#[derive(Clone)]\npub struct Label<'a, F> {\n    path: &'a str,\n    label_marker: F,\n    greedy_label: Option<GreedyLabel>,\n}\n\n/// Marks a segment as a greedy label up until a char offset from the end.\n///\n/// # Example\n///\n/// The pattern, `/alpha/beta/{greedy+}/trail`, has segment index 2 and offset from the end of 6.\n///\n/// ```rust\n/// # use aws_smithy_http_server::instrumentation::sensitivity::uri::GreedyLabel;\n/// let greedy_label = GreedyLabel::new(2, 6);\n/// ```\n#[derive(Clone, Debug)]\npub struct GreedyLabel {\n    segment_index: usize,\n    end_offset: usize,\n}\n\nimpl GreedyLabel {\n    /// Constructs a new [`GreedyLabel`] from a segment index and an offset from the end of the URI.\n    pub fn new(segment_index: usize, end_offset: usize) -> Self {\n        Self {\n            segment_index,\n            end_offset,\n        }\n    }\n}\n\nimpl<'a, F> Label<'a, F> {\n    /// Constructs a new [`Label`].\n    pub fn new(path: &'a str, label_marker: F, greedy_label: Option<GreedyLabel>) -> Self {\n        Self {\n            path,\n            label_marker,\n            greedy_label,\n        }\n    }\n}\n\nimpl<F> Display for Label<'_, F>\nwhere\n    F: Fn(usize) -> bool,\n{\n    #[inline]\n    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error> {\n        if let Some(greedy_label) = &self.greedy_label {\n            // Calculate the byte index of the start of the greedy label and whether it was reached while writing the\n            // normal labels.\n            // TODO(clippy): Switch from fold to try_fold\n            #[allow(clippy::manual_try_fold)]\n            let (greedy_start, greedy_hit) = self\n                .path\n                .split('/')\n                // Skip the first segment which will always be empty.\n                .skip(1)\n                // Iterate up to the segment index given in the `GreedyLabel`.\n                .take(greedy_label.segment_index + 1)\n                .enumerate()\n                .fold(Ok((0, false)), |acc: Result<_, std::fmt::Error>, (index, segment)| {\n                    acc.and_then(|(greedy_start, _)| {\n                        if index == greedy_label.segment_index {\n                            // We've hit the greedy label, set `hit_greedy` to `true`.\n                            Ok((greedy_start, true))\n                        } else {\n                            // Prior to greedy segment, use `label_marker` to redact segments.\n                            if (self.label_marker)(index) {\n                                write!(f, \"/{}\", Sensitive(segment))?;\n                            } else {\n                                write!(f, \"/{segment}\")?;\n                            }\n                            // Add the segment length and the separator to the `greedy_start`.\n                            let greedy_start = greedy_start + segment.len() + 1;\n                            Ok((greedy_start, false))\n                        }\n                    })\n                })?;\n\n            // If we reached the greedy label segment then use the `end_offset` to redact the interval\n            // and print the remainder.\n            if greedy_hit {\n                if let Some(end_index) = self.path.len().checked_sub(greedy_label.end_offset) {\n                    if greedy_start < end_index {\n                        // [greedy_start + 1 .. end_index] is a non-empty slice - redact it.\n                        let greedy_redaction = Sensitive(&self.path[greedy_start + 1..end_index]);\n                        let remainder = &self.path[end_index..];\n                        write!(f, \"/{greedy_redaction}{remainder}\")?;\n                    } else {\n                        // [greedy_start + 1 .. end_index] is an empty slice - don't redact it.\n                        // NOTE: This is unreachable if the greedy label is valid.\n                        write!(f, \"{}\", &self.path[greedy_start..])?;\n                    }\n                }\n            } else {\n                // NOTE: This is unreachable if the greedy label is valid.\n            }\n        } else {\n            // Use `label_marker` to redact segments.\n            for (index, segment) in self\n                .path\n                .split('/')\n                // Skip the first segment which will always be empty.\n                .skip(1)\n                .enumerate()\n            {\n                if (self.label_marker)(index) {\n                    write!(f, \"/{}\", Sensitive(segment))?;\n                } else {\n                    write!(f, \"/{segment}\")?;\n                }\n            }\n        }\n\n        Ok(())\n    }\n}\n\n/// A [`MakeFmt`] producing [`Label`].\n#[derive(Clone)]\npub struct MakeLabel<F> {\n    pub(crate) label_marker: F,\n    pub(crate) greedy_label: Option<GreedyLabel>,\n}\n\nimpl<F> Debug for MakeLabel<F> {\n    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error> {\n        f.debug_struct(\"MakeLabel\")\n            .field(\"greedy_label\", &self.greedy_label)\n            .finish_non_exhaustive()\n    }\n}\n\nimpl<'a, F> MakeFmt<&'a str> for MakeLabel<F>\nwhere\n    F: Clone,\n{\n    type Target = Label<'a, F>;\n\n    fn make(&self, path: &'a str) -> Self::Target {\n        Label::new(path, self.label_marker.clone(), self.greedy_label.clone())\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use http::Uri;\n\n    use crate::instrumentation::sensitivity::uri::{tests::EXAMPLES, GreedyLabel};\n\n    use super::Label;\n\n    #[test]\n    fn mark_none() {\n        let originals = EXAMPLES.into_iter().map(Uri::from_static);\n        for original in originals {\n            let expected = original.path().to_string();\n            let output = Label::new(original.path(), |_| false, None).to_string();\n            assert_eq!(output, expected, \"original = {original}\");\n        }\n    }\n\n    #[cfg(not(feature = \"unredacted-logging\"))]\n    const ALL_EXAMPLES: [&str; 19] = [\n        \"g:h\",\n        \"http://a/{redacted}/{redacted}/{redacted}\",\n        \"http://a/{redacted}/{redacted}/{redacted}/{redacted}\",\n        \"http://a/{redacted}\",\n        \"http://a/{redacted}\",\n        \"http://a/{redacted}/{redacted}/{redacted}\",\n        \"http://a/{redacted}/{redacted}/{redacted}\",\n        \"http://a/{redacted}/{redacted}/{redacted}\",\n        \"http://a/{redacted}/{redacted}/{redacted}\",\n        \"http://a/{redacted}/{redacted}/{redacted}\",\n        \"http://a/{redacted}/{redacted}/{redacted}\",\n        \"http://a/{redacted}/{redacted}/{redacted}\",\n        \"http://a/{redacted}/{redacted}/{redacted}\",\n        \"http://a/{redacted}/{redacted}/{redacted}\",\n        \"http://a/{redacted}/{redacted}/{redacted}\",\n        \"http://a/{redacted}/{redacted}/{redacted}\",\n        \"http://a/{redacted}/{redacted}\",\n        \"http://a/{redacted}/{redacted}\",\n        \"http://a/{redacted}\",\n    ];\n\n    #[cfg(feature = \"unredacted-logging\")]\n    pub const ALL_EXAMPLES: [&str; 19] = EXAMPLES;\n\n    #[test]\n    fn mark_all() {\n        let originals = EXAMPLES.into_iter().map(Uri::from_static);\n        let expecteds = ALL_EXAMPLES.into_iter().map(Uri::from_static);\n        for (original, expected) in originals.zip(expecteds) {\n            let output = Label::new(original.path(), |_| true, None).to_string();\n            assert_eq!(output, expected.path(), \"original = {original}\");\n        }\n    }\n\n    #[cfg(not(feature = \"unredacted-logging\"))]\n    pub const GREEDY_EXAMPLES: [&str; 19] = [\n        \"g:h\",\n        \"http://a/b/{redacted}\",\n        \"http://a/b/{redacted}\",\n        \"http://a/g\",\n        \"http://g\",\n        \"http://a/b/{redacted}?y\",\n        \"http://a/b/{redacted}?y\",\n        \"http://a/b/{redacted}?q#s\",\n        \"http://a/b/{redacted}\",\n        \"http://a/b/{redacted}?y#s\",\n        \"http://a/b/{redacted}\",\n        \"http://a/b/{redacted}\",\n        \"http://a/b/{redacted}?y#s\",\n        \"http://a/b/{redacted}?q\",\n        \"http://a/b/{redacted}\",\n        \"http://a/b/{redacted}\",\n        \"http://a/b/{redacted}\",\n        \"http://a/b/{redacted}\",\n        \"http://a/\",\n    ];\n\n    #[cfg(feature = \"unredacted-logging\")]\n    pub const GREEDY_EXAMPLES: [&str; 19] = EXAMPLES;\n\n    #[test]\n    fn greedy() {\n        let originals = EXAMPLES.into_iter().map(Uri::from_static);\n        let expecteds = GREEDY_EXAMPLES.into_iter().map(Uri::from_static);\n        for (original, expected) in originals.zip(expecteds) {\n            let output = Label::new(original.path(), |_| false, Some(GreedyLabel::new(1, 0))).to_string();\n            assert_eq!(output, expected.path(), \"original = {original}\");\n        }\n    }\n\n    #[cfg(not(feature = \"unredacted-logging\"))]\n    pub const GREEDY_EXAMPLES_OFFSET: [&str; 19] = [\n        \"g:h\",\n        \"http://a/b/{redacted}g\",\n        \"http://a/b/{redacted}/\",\n        \"http://a/g\",\n        \"http://g\",\n        \"http://a/b/{redacted}p?y\",\n        \"http://a/b/{redacted}g?y\",\n        \"http://a/b/{redacted}p?q#s\",\n        \"http://a/b/{redacted}g\",\n        \"http://a/b/{redacted}g?y#s\",\n        \"http://a/b/{redacted}x\",\n        \"http://a/b/{redacted}x\",\n        \"http://a/b/{redacted}x?y#s\",\n        \"http://a/b/{redacted}p?q\",\n        \"http://a/b/{redacted}/\",\n        \"http://a/b/{redacted}/\",\n        \"http://a/b/\",\n        \"http://a/b/{redacted}g\",\n        \"http://a/\",\n    ];\n\n    #[cfg(feature = \"unredacted-logging\")]\n    pub const GREEDY_EXAMPLES_OFFSET: [&str; 19] = EXAMPLES;\n\n    #[test]\n    fn greedy_offset_a() {\n        let originals = EXAMPLES.into_iter().map(Uri::from_static);\n        let expecteds = GREEDY_EXAMPLES_OFFSET.into_iter().map(Uri::from_static);\n        for (original, expected) in originals.zip(expecteds) {\n            let output = Label::new(original.path(), |_| false, Some(GreedyLabel::new(1, 1))).to_string();\n            assert_eq!(output, expected.path(), \"original = {original}\");\n        }\n    }\n\n    const EXTRA_EXAMPLES_UNREDACTED: [&str; 4] = [\n        \"http://base/a/b/hello_world\",\n        \"http://base/a/b/c/hello_world\",\n        \"http://base/a\",\n        \"http://base/a/b/c\",\n    ];\n\n    #[cfg(feature = \"unredacted-logging\")]\n    const EXTRA_EXAMPLES_REDACTED: [&str; 4] = EXTRA_EXAMPLES_UNREDACTED;\n    #[cfg(not(feature = \"unredacted-logging\"))]\n    const EXTRA_EXAMPLES_REDACTED: [&str; 4] = [\n        \"http://base/a/b/{redacted}world\",\n        \"http://base/a/b/{redacted}world\",\n        \"http://base/a\",\n        \"http://base/a/b/c\",\n    ];\n\n    #[test]\n    fn greedy_offset_b() {\n        let originals = EXTRA_EXAMPLES_UNREDACTED.into_iter().map(Uri::from_static);\n        let expecteds = EXTRA_EXAMPLES_REDACTED.into_iter().map(Uri::from_static);\n        for (original, expected) in originals.zip(expecteds) {\n            let output = Label::new(original.path(), |_| false, Some(GreedyLabel::new(2, 5))).to_string();\n            assert_eq!(output, expected.path(), \"original = {original}\");\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/src/instrumentation/sensitivity/uri/mod.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Wrappers around [`Uri`] and it's constituents to allow for sensitivity.\n\nmod label;\nmod query;\n\nuse std::fmt::{Debug, Display, Error, Formatter};\n\nuse http::Uri;\n\npub use label::*;\npub use query::*;\n\nuse crate::instrumentation::{MakeDisplay, MakeFmt, MakeIdentity};\n\n/// A wrapper around [`&Uri`](Uri) which modifies the behavior of [`Display`]. Specific parts of the [`Uri`] as are\n/// marked as sensitive using the methods provided.\n///\n/// The [`Display`] implementation will respect the `unredacted-logging` flag.\n#[allow(missing_debug_implementations)]\npub struct SensitiveUri<'a, P, Q> {\n    uri: &'a Uri,\n    make_path: P,\n    make_query: Q,\n}\n\nimpl<'a> SensitiveUri<'a, MakeIdentity, MakeIdentity> {\n    /// Constructs a new [`SensitiveUri`] with nothing marked as sensitive.\n    pub fn new(uri: &'a Uri) -> Self {\n        Self {\n            uri,\n            make_path: MakeIdentity,\n            make_query: MakeIdentity,\n        }\n    }\n}\n\nimpl<'a, P, Q> SensitiveUri<'a, P, Q> {\n    pub(crate) fn make_path<M>(self, make_path: M) -> SensitiveUri<'a, M, Q> {\n        SensitiveUri {\n            uri: self.uri,\n            make_path,\n            make_query: self.make_query,\n        }\n    }\n\n    pub(crate) fn make_query<M>(self, make_query: M) -> SensitiveUri<'a, P, M> {\n        SensitiveUri {\n            uri: self.uri,\n            make_path: self.make_path,\n            make_query,\n        }\n    }\n\n    /// Marks path segments as sensitive by providing predicate over the segment index.\n    ///\n    /// See [`Label`] for more info.\n    pub fn label<F>(self, label_marker: F, greedy_label: Option<GreedyLabel>) -> SensitiveUri<'a, MakeLabel<F>, Q> {\n        self.make_path(MakeLabel {\n            label_marker,\n            greedy_label,\n        })\n    }\n\n    /// Marks specific query string values as sensitive by supplying a predicate over the query string keys.\n    ///\n    /// See [`Query`] for more info.\n    pub fn query<F>(self, marker: F) -> SensitiveUri<'a, P, MakeQuery<F>> {\n        self.make_query(MakeQuery(marker))\n    }\n}\n\nimpl<'a, P, Q> Display for SensitiveUri<'a, P, Q>\nwhere\n    P: MakeDisplay<&'a str>,\n    Q: MakeDisplay<&'a str>,\n{\n    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error> {\n        if let Some(scheme) = self.uri.scheme() {\n            write!(f, \"{scheme}://\")?;\n        }\n\n        if let Some(authority) = self.uri.authority() {\n            write!(f, \"{authority}\")?;\n        }\n\n        let path = self.uri.path();\n        let path = self.make_path.make_display(path);\n        write!(f, \"{path}\")?;\n\n        if let Some(query) = self.uri.query() {\n            let query = self.make_query.make_display(query);\n            write!(f, \"?{query}\")?;\n        }\n\n        Ok(())\n    }\n}\n\n/// A [`MakeFmt`] producing [`SensitiveUri`].\n#[derive(Clone)]\npub struct MakeUri<P, Q> {\n    pub(crate) make_path: P,\n    pub(crate) make_query: Q,\n}\n\nimpl<P, Q> Debug for MakeUri<P, Q> {\n    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error> {\n        f.debug_struct(\"MakeUri\").finish_non_exhaustive()\n    }\n}\n\nimpl<'a, P, Q> MakeFmt<&'a http::Uri> for MakeUri<P, Q>\nwhere\n    Q: Clone,\n    P: Clone,\n{\n    type Target = SensitiveUri<'a, P, Q>;\n\n    fn make(&self, source: &'a http::Uri) -> Self::Target {\n        SensitiveUri::new(source)\n            .make_query(self.make_query.clone())\n            .make_path(self.make_path.clone())\n    }\n}\n\nimpl Default for MakeUri<MakeIdentity, MakeIdentity> {\n    fn default() -> Self {\n        Self {\n            make_path: MakeIdentity,\n            make_query: MakeIdentity,\n        }\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use http::Uri;\n\n    use super::{QueryMarker, SensitiveUri};\n\n    // https://www.w3.org/2004/04/uri-rel-test.html\n    // NOTE: http::Uri's `Display` implementation trims the fragment, we mirror this behavior\n    pub const EXAMPLES: [&str; 19] = [\n        \"g:h\",\n        \"http://a/b/c/g\",\n        \"http://a/b/c/g/\",\n        \"http://a/g\",\n        \"http://g\",\n        \"http://a/b/c/d;p?y\",\n        \"http://a/b/c/g?y\",\n        \"http://a/b/c/d;p?q#s\",\n        \"http://a/b/c/g#s\",\n        \"http://a/b/c/g?y#s\",\n        \"http://a/b/c/;x\",\n        \"http://a/b/c/g;x\",\n        \"http://a/b/c/g;x?y#s\",\n        \"http://a/b/c/d;p?q\",\n        \"http://a/b/c/\",\n        \"http://a/b/c/\",\n        \"http://a/b/\",\n        \"http://a/b/g\",\n        \"http://a/\",\n    ];\n\n    pub const QUERY_STRING_EXAMPLES: [&str; 11] = [\n        \"http://a/b/c/g?&\",\n        \"http://a/b/c/g?x\",\n        \"http://a/b/c/g?x&y\",\n        \"http://a/b/c/g?x&y&\",\n        \"http://a/b/c/g?x&y&z\",\n        \"http://a/b/c/g?x=y&x=z\",\n        \"http://a/b/c/g?x=y&z\",\n        \"http://a/b/c/g?x=y&\",\n        \"http://a/b/c/g?x=y&y=z\",\n        \"http://a/b/c/g?&x=z\",\n        \"http://a/b/c/g?x&x=y\",\n    ];\n\n    #[test]\n    fn path_mark_none() {\n        let originals = EXAMPLES.into_iter().map(Uri::from_static);\n        for original in originals {\n            let output = SensitiveUri::new(&original).to_string();\n            assert_eq!(output, original.to_string());\n        }\n    }\n\n    #[cfg(not(feature = \"unredacted-logging\"))]\n    const FIRST_PATH_EXAMPLES: [&str; 19] = [\n        \"g:h\",\n        \"http://a/{redacted}/c/g\",\n        \"http://a/{redacted}/c/g/\",\n        \"http://a/{redacted}\",\n        \"http://g/{redacted}\",\n        \"http://a/{redacted}/c/d;p?y\",\n        \"http://a/{redacted}/c/g?y\",\n        \"http://a/{redacted}/c/d;p?q#s\",\n        \"http://a/{redacted}/c/g#s\",\n        \"http://a/{redacted}/c/g?y#s\",\n        \"http://a/{redacted}/c/;x\",\n        \"http://a/{redacted}/c/g;x\",\n        \"http://a/{redacted}/c/g;x?y#s\",\n        \"http://a/{redacted}/c/d;p?q\",\n        \"http://a/{redacted}/c/\",\n        \"http://a/{redacted}/c/\",\n        \"http://a/{redacted}/\",\n        \"http://a/{redacted}/g\",\n        \"http://a/{redacted}\",\n    ];\n    #[cfg(feature = \"unredacted-logging\")]\n    const FIRST_PATH_EXAMPLES: [&str; 19] = EXAMPLES;\n\n    #[test]\n    fn path_mark_first_segment() {\n        let originals = EXAMPLES.into_iter().map(Uri::from_static);\n        let expecteds = FIRST_PATH_EXAMPLES.into_iter().map(Uri::from_static);\n        for (original, expected) in originals.zip(expecteds) {\n            let output = SensitiveUri::new(&original).label(|x| x == 0, None).to_string();\n            assert_eq!(output, expected.to_string(), \"original = {original}\");\n        }\n    }\n\n    #[cfg(not(feature = \"unredacted-logging\"))]\n    const LAST_PATH_EXAMPLES: [&str; 19] = [\n        \"g:h\",\n        \"http://a/b/c/{redacted}\",\n        \"http://a/b/c/g/{redacted}\",\n        \"http://a/{redacted}\",\n        \"http://g/{redacted}\",\n        \"http://a/b/c/{redacted}?y\",\n        \"http://a/b/c/{redacted}?y\",\n        \"http://a/b/c/{redacted}?q#s\",\n        \"http://a/b/c/{redacted}#s\",\n        \"http://a/b/c/{redacted}?y#s\",\n        \"http://a/b/c/{redacted}\",\n        \"http://a/b/c/{redacted}\",\n        \"http://a/b/c/{redacted}?y#s\",\n        \"http://a/b/c/{redacted}?q\",\n        \"http://a/b/c/{redacted}\",\n        \"http://a/b/c/{redacted}\",\n        \"http://a/b/{redacted}\",\n        \"http://a/b/{redacted}\",\n        \"http://a/{redacted}\",\n    ];\n    #[cfg(feature = \"unredacted-logging\")]\n    const LAST_PATH_EXAMPLES: [&str; 19] = EXAMPLES;\n\n    #[test]\n    fn path_mark_last_segment() {\n        let originals = EXAMPLES.into_iter().map(Uri::from_static);\n        let expecteds = LAST_PATH_EXAMPLES.into_iter().map(Uri::from_static);\n        for (original, expected) in originals.zip(expecteds) {\n            let path_len = original.path().split('/').skip(1).count();\n            let output = SensitiveUri::new(&original)\n                .label(|x| x + 1 == path_len, None)\n                .to_string();\n            assert_eq!(output, expected.to_string(), \"original = {original}\");\n        }\n    }\n\n    #[cfg(not(feature = \"unredacted-logging\"))]\n    pub const ALL_KEYS_QUERY_STRING_EXAMPLES: [&str; 11] = [\n        \"http://a/b/c/g?&\",\n        \"http://a/b/c/g?x\",\n        \"http://a/b/c/g?x&y\",\n        \"http://a/b/c/g?x&y&\",\n        \"http://a/b/c/g?x&y&z\",\n        \"http://a/b/c/g?{redacted}=y&{redacted}=z\",\n        \"http://a/b/c/g?{redacted}=y&z\",\n        \"http://a/b/c/g?{redacted}=y&\",\n        \"http://a/b/c/g?{redacted}=y&{redacted}=z\",\n        \"http://a/b/c/g?&{redacted}=z\",\n        \"http://a/b/c/g?x&{redacted}=y\",\n    ];\n    #[cfg(feature = \"unredacted-logging\")]\n    pub const ALL_KEYS_QUERY_STRING_EXAMPLES: [&str; 11] = QUERY_STRING_EXAMPLES;\n\n    #[test]\n    fn query_mark_all_keys() {\n        let originals = QUERY_STRING_EXAMPLES.into_iter().map(Uri::from_static);\n        let expecteds = ALL_KEYS_QUERY_STRING_EXAMPLES.into_iter().map(Uri::from_static);\n        for (original, expected) in originals.zip(expecteds) {\n            let output = SensitiveUri::new(&original)\n                .query(|_| QueryMarker {\n                    key: true,\n                    value: false,\n                })\n                .to_string();\n            assert_eq!(output, expected.to_string(), \"original = {original}\");\n        }\n    }\n\n    #[cfg(not(feature = \"unredacted-logging\"))]\n    pub const ALL_VALUES_QUERY_STRING_EXAMPLES: [&str; 11] = [\n        \"http://a/b/c/g?&\",\n        \"http://a/b/c/g?x\",\n        \"http://a/b/c/g?x&y\",\n        \"http://a/b/c/g?x&y&\",\n        \"http://a/b/c/g?x&y&z\",\n        \"http://a/b/c/g?x={redacted}&x={redacted}\",\n        \"http://a/b/c/g?x={redacted}&z\",\n        \"http://a/b/c/g?x={redacted}&\",\n        \"http://a/b/c/g?x={redacted}&y={redacted}\",\n        \"http://a/b/c/g?&x={redacted}\",\n        \"http://a/b/c/g?x&x={redacted}\",\n    ];\n    #[cfg(feature = \"unredacted-logging\")]\n    pub const ALL_VALUES_QUERY_STRING_EXAMPLES: [&str; 11] = QUERY_STRING_EXAMPLES;\n\n    #[test]\n    fn query_mark_all_values() {\n        let originals = QUERY_STRING_EXAMPLES.into_iter().map(Uri::from_static);\n        let expecteds = ALL_VALUES_QUERY_STRING_EXAMPLES.into_iter().map(Uri::from_static);\n        for (original, expected) in originals.zip(expecteds) {\n            let output = SensitiveUri::new(&original)\n                .query(|_| QueryMarker {\n                    key: false,\n                    value: true,\n                })\n                .to_string();\n            assert_eq!(output, expected.to_string(), \"original = {original}\");\n        }\n    }\n\n    #[cfg(not(feature = \"unredacted-logging\"))]\n    pub const ALL_PAIRS_QUERY_STRING_EXAMPLES: [&str; 11] = [\n        \"http://a/b/c/g?&\",\n        \"http://a/b/c/g?x\",\n        \"http://a/b/c/g?x&y\",\n        \"http://a/b/c/g?x&y&\",\n        \"http://a/b/c/g?x&y&z\",\n        \"http://a/b/c/g?{redacted}={redacted}&{redacted}={redacted}\",\n        \"http://a/b/c/g?{redacted}={redacted}&z\",\n        \"http://a/b/c/g?{redacted}={redacted}&\",\n        \"http://a/b/c/g?{redacted}={redacted}&{redacted}={redacted}\",\n        \"http://a/b/c/g?&{redacted}={redacted}\",\n        \"http://a/b/c/g?x&{redacted}={redacted}\",\n    ];\n    #[cfg(feature = \"unredacted-logging\")]\n    pub const ALL_PAIRS_QUERY_STRING_EXAMPLES: [&str; 11] = QUERY_STRING_EXAMPLES;\n\n    #[test]\n    fn query_mark_all_pairs() {\n        let originals = QUERY_STRING_EXAMPLES.into_iter().map(Uri::from_static);\n        let expecteds = ALL_PAIRS_QUERY_STRING_EXAMPLES.into_iter().map(Uri::from_static);\n        for (original, expected) in originals.zip(expecteds) {\n            let output = SensitiveUri::new(&original)\n                .query(|_| QueryMarker { key: true, value: true })\n                .to_string();\n            assert_eq!(output, expected.to_string(), \"original = {original}\");\n        }\n    }\n\n    #[cfg(not(feature = \"unredacted-logging\"))]\n    pub const X_QUERY_STRING_EXAMPLES: [&str; 11] = [\n        \"http://a/b/c/g?&\",\n        \"http://a/b/c/g?x\",\n        \"http://a/b/c/g?x&y\",\n        \"http://a/b/c/g?x&y&\",\n        \"http://a/b/c/g?x&y&z\",\n        \"http://a/b/c/g?x={redacted}&x={redacted}\",\n        \"http://a/b/c/g?x={redacted}&z\",\n        \"http://a/b/c/g?x={redacted}&\",\n        \"http://a/b/c/g?x={redacted}&y=z\",\n        \"http://a/b/c/g?&x={redacted}\",\n        \"http://a/b/c/g?x&x={redacted}\",\n    ];\n    #[cfg(feature = \"unredacted-logging\")]\n    pub const X_QUERY_STRING_EXAMPLES: [&str; 11] = QUERY_STRING_EXAMPLES;\n\n    #[test]\n    fn query_mark_x() {\n        let originals = QUERY_STRING_EXAMPLES.into_iter().map(Uri::from_static);\n        let expecteds = X_QUERY_STRING_EXAMPLES.into_iter().map(Uri::from_static);\n        for (original, expected) in originals.zip(expecteds) {\n            let output = SensitiveUri::new(&original)\n                .query(|key| QueryMarker {\n                    key: false,\n                    value: key == \"x\",\n                })\n                .to_string();\n            assert_eq!(output, expected.to_string(), \"original = {original}\");\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/src/instrumentation/sensitivity/uri/query.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! A wrapper around a query string [`&str`](str) to allow for sensitivity.\n\nuse std::fmt::{Debug, Display, Error, Formatter};\n\nuse crate::instrumentation::{sensitivity::Sensitive, MakeFmt};\n\n/// Marks the sensitive data of a query string pair.\n#[derive(Debug, Default, PartialEq, Eq)]\npub struct QueryMarker {\n    /// Set to `true` to mark the key as sensitive.\n    pub key: bool,\n    /// Set to `true` to mark the value as sensitive.\n    pub value: bool,\n}\n\n/// A wrapper around a query string [`&str`](str) which modifies the behavior of [`Display`]. Specific query string\n/// values are marked as sensitive by providing predicate over the keys. This accommodates the [httpQuery trait] and\n/// the [httpQueryParams trait].\n///\n/// The [`Display`] implementation will respect the `unredacted-logging` flag.\n///\n/// # Example\n///\n/// ```\n/// # use aws_smithy_http_server::instrumentation::sensitivity::uri::{Query, QueryMarker};\n/// # let uri = \"\";\n/// // Query string value with key \"name\" is redacted\n/// let uri = Query::new(&uri, |x| QueryMarker { key: false, value: x == \"name\" } );\n/// println!(\"{uri}\");\n/// ```\n///\n/// [httpQuery trait]: https://smithy.io/2.0/spec/http-bindings.html#httpquery-trait\n/// [httpQueryParams trait]: https://smithy.io/2.0/spec/http-bindings.html#httpqueryparams-trait\n#[allow(missing_debug_implementations)]\npub struct Query<'a, F> {\n    query: &'a str,\n    marker: F,\n}\n\nimpl<'a, F> Query<'a, F> {\n    /// Constructs a new [`Query`].\n    pub fn new(query: &'a str, marker: F) -> Self {\n        Self { query, marker }\n    }\n}\n\n#[inline]\nfn write_pair<'a, F>(section: &'a str, marker: F, f: &mut Formatter<'_>) -> Result<(), Error>\nwhere\n    F: Fn(&'a str) -> QueryMarker,\n{\n    if let Some((key, value)) = section.split_once('=') {\n        match (marker)(key) {\n            QueryMarker { key: true, value: true } => write!(f, \"{}={}\", Sensitive(key), Sensitive(value)),\n            QueryMarker {\n                key: true,\n                value: false,\n            } => write!(f, \"{}={value}\", Sensitive(key)),\n            QueryMarker {\n                key: false,\n                value: true,\n            } => write!(f, \"{key}={}\", Sensitive(value)),\n            QueryMarker {\n                key: false,\n                value: false,\n            } => write!(f, \"{key}={value}\"),\n        }\n    } else {\n        write!(f, \"{section}\")\n    }\n}\n\nimpl<'a, F> Display for Query<'a, F>\nwhere\n    F: Fn(&'a str) -> QueryMarker,\n{\n    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error> {\n        let mut it = self.query.split('&');\n\n        if let Some(section) = it.next() {\n            write_pair(section, &self.marker, f)?;\n        }\n\n        for section in it {\n            write!(f, \"&\")?;\n            write_pair(section, &self.marker, f)?;\n        }\n\n        Ok(())\n    }\n}\n\n/// A [`MakeFmt`] producing [`Query`].\n#[derive(Clone)]\npub struct MakeQuery<F>(pub(crate) F);\n\nimpl<F> Debug for MakeQuery<F> {\n    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error> {\n        f.debug_tuple(\"MakeQuery\").field(&\"...\").finish()\n    }\n}\nimpl<'a, F> MakeFmt<&'a str> for MakeQuery<F>\nwhere\n    F: Clone,\n{\n    type Target = Query<'a, F>;\n\n    fn make(&self, path: &'a str) -> Self::Target {\n        Query::new(path, self.0.clone())\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use http::Uri;\n\n    use crate::instrumentation::sensitivity::uri::tests::{\n        ALL_KEYS_QUERY_STRING_EXAMPLES, ALL_PAIRS_QUERY_STRING_EXAMPLES, ALL_VALUES_QUERY_STRING_EXAMPLES, EXAMPLES,\n        QUERY_STRING_EXAMPLES, X_QUERY_STRING_EXAMPLES,\n    };\n\n    use super::*;\n\n    #[test]\n    fn mark_none() {\n        let originals = EXAMPLES.into_iter().chain(QUERY_STRING_EXAMPLES).map(Uri::from_static);\n        for original in originals {\n            if let Some(query) = original.query() {\n                let output = Query::new(query, |_| QueryMarker::default()).to_string();\n                assert_eq!(output, query, \"original = {original}\");\n            }\n        }\n    }\n\n    #[test]\n    fn mark_all_keys() {\n        let originals = QUERY_STRING_EXAMPLES.into_iter().map(Uri::from_static);\n        let expecteds = ALL_KEYS_QUERY_STRING_EXAMPLES.into_iter().map(Uri::from_static);\n        for (original, expected) in originals.zip(expecteds) {\n            let output = Query::new(original.query().unwrap(), |_| QueryMarker {\n                key: true,\n                value: false,\n            })\n            .to_string();\n            assert_eq!(output, expected.query().unwrap(), \"original = {original}\");\n        }\n    }\n\n    #[test]\n    fn mark_all_values() {\n        let originals = QUERY_STRING_EXAMPLES.into_iter().map(Uri::from_static);\n        let expecteds = ALL_VALUES_QUERY_STRING_EXAMPLES.into_iter().map(Uri::from_static);\n        for (original, expected) in originals.zip(expecteds) {\n            let output = Query::new(original.query().unwrap(), |_| QueryMarker {\n                key: false,\n                value: true,\n            })\n            .to_string();\n            assert_eq!(output, expected.query().unwrap(), \"original = {original}\");\n        }\n    }\n\n    #[test]\n    fn mark_all_pairs() {\n        let originals = QUERY_STRING_EXAMPLES.into_iter().map(Uri::from_static);\n        let expecteds = ALL_PAIRS_QUERY_STRING_EXAMPLES.into_iter().map(Uri::from_static);\n        for (original, expected) in originals.zip(expecteds) {\n            let output = Query::new(original.query().unwrap(), |_| QueryMarker { key: true, value: true }).to_string();\n            assert_eq!(output, expected.query().unwrap(), \"original = {original}\");\n        }\n    }\n\n    #[test]\n    fn mark_x() {\n        let originals = QUERY_STRING_EXAMPLES.into_iter().map(Uri::from_static);\n        let expecteds = X_QUERY_STRING_EXAMPLES.into_iter().map(Uri::from_static);\n        for (original, expected) in originals.zip(expecteds) {\n            let output = Query::new(original.query().unwrap(), |key| QueryMarker {\n                key: false,\n                value: key == \"x\",\n            })\n            .to_string();\n            assert_eq!(output, expected.query().unwrap(), \"original = {original}\");\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/src/instrumentation/service.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! A [`Service`] and it's associated [`Future`] providing sensitivity aware logging.\n\nuse std::{\n    future::Future,\n    pin::Pin,\n    task::{Context, Poll},\n};\n\nuse futures_util::{ready, TryFuture};\nuse http::{HeaderMap, Request, Response, StatusCode, Uri};\nuse tower::Service;\nuse tracing::{debug, debug_span, instrument::Instrumented, Instrument};\n\nuse crate::shape_id::ShapeId;\n\nuse super::{MakeDebug, MakeDisplay, MakeIdentity};\n\npin_project_lite::pin_project! {\n    /// A [`Future`] responsible for logging the response status code and headers.\n    struct InnerFuture<Fut, ResponseMakeFmt> {\n        #[pin]\n        inner: Fut,\n        make: ResponseMakeFmt\n    }\n}\n\nimpl<Fut, ResponseMakeFmt, T> Future for InnerFuture<Fut, ResponseMakeFmt>\nwhere\n    Fut: TryFuture<Ok = Response<T>>,\n    Fut: Future<Output = Result<Fut::Ok, Fut::Error>>,\n\n    for<'a> ResponseMakeFmt: MakeDebug<&'a HeaderMap>,\n    for<'a> ResponseMakeFmt: MakeDisplay<StatusCode>,\n{\n    type Output = Fut::Output;\n\n    fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {\n        let this = self.project();\n        let response = ready!(this.inner.poll(cx))?;\n\n        {\n            let headers = this.make.make_debug(response.headers());\n            let status_code = this.make.make_display(response.status());\n            debug!(?headers, %status_code, \"response\");\n        }\n\n        Poll::Ready(Ok(response))\n    }\n}\n\n// This is to provide type erasure.\npin_project_lite::pin_project! {\n    /// An instrumented [`Future`] responsible for logging the response status code and headers.\n    pub struct InstrumentedFuture<Fut, ResponseMakeFmt> {\n        #[pin]\n        inner: Instrumented<InnerFuture<Fut, ResponseMakeFmt>>\n    }\n}\n\nimpl<Fut, ResponseMakeFmt, T> Future for InstrumentedFuture<Fut, ResponseMakeFmt>\nwhere\n    Fut: TryFuture<Ok = Response<T>>,\n    Fut: Future<Output = Result<Fut::Ok, Fut::Error>>,\n\n    for<'a> ResponseMakeFmt: MakeDebug<&'a HeaderMap>,\n    for<'a> ResponseMakeFmt: MakeDisplay<StatusCode>,\n{\n    type Output = Fut::Output;\n\n    fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {\n        self.project().inner.poll(cx)\n    }\n}\n\n/// A middleware [`Service`] responsible for:\n///   - Opening a [`tracing::debug_span`] for the lifetime of the request, which includes the operation name, the\n///     [`Uri`], and the request headers.\n///   - A [`tracing::debug`] during response, which includes the response status code and headers.\n///\n/// The [`Display`](std::fmt::Display) and [`Debug`] of the request and response components can be modified using\n/// [`request_fmt`](InstrumentOperation::request_fmt) and [`response_fmt`](InstrumentOperation::response_fmt).\n///\n/// # Example\n///\n/// ```\n/// # use aws_smithy_http_server::instrumentation::{sensitivity::{*, uri::*, headers::*}, *};\n/// # use aws_smithy_http_server::shape_id::ShapeId;\n/// # use tower::{Service, service_fn};\n/// # use http::{Request, Response};\n/// # async fn f(request: Request<()>) -> Result<Response<()>, ()> { Ok(Response::new(())) }\n/// # let mut svc = service_fn(f);\n/// # const ID: ShapeId = ShapeId::new(\"namespace#foo-operation\", \"namespace\", \"foo-operation\");\n/// let request_fmt = RequestFmt::new()\n///     .label(|index| index == 1, None)\n///     .query(|_| QueryMarker { key: false, value: true });\n/// let response_fmt = ResponseFmt::new().status_code();\n/// let mut svc = InstrumentOperation::new(svc, ID)\n///     .request_fmt(request_fmt)\n///     .response_fmt(response_fmt);\n/// # svc.call(Request::new(()));\n/// ```\n#[derive(Debug, Clone)]\npub struct InstrumentOperation<S, RequestMakeFmt = MakeIdentity, ResponseMakeFmt = MakeIdentity> {\n    inner: S,\n    operation_id: ShapeId,\n    make_request: RequestMakeFmt,\n    make_response: ResponseMakeFmt,\n}\n\nimpl<S> InstrumentOperation<S> {\n    /// Constructs a new [`InstrumentOperation`] with no data redacted.\n    pub fn new(inner: S, operation_id: ShapeId) -> Self {\n        Self {\n            inner,\n            operation_id,\n            make_request: MakeIdentity,\n            make_response: MakeIdentity,\n        }\n    }\n}\n\nimpl<S, RequestMakeFmt, ResponseMakeFmt> InstrumentOperation<S, RequestMakeFmt, ResponseMakeFmt> {\n    /// Configures the request format.\n    ///\n    /// The argument is typically [`RequestFmt`](super::sensitivity::RequestFmt).\n    pub fn request_fmt<R>(self, make_request: R) -> InstrumentOperation<S, R, ResponseMakeFmt> {\n        InstrumentOperation {\n            inner: self.inner,\n            operation_id: self.operation_id,\n            make_request,\n            make_response: self.make_response,\n        }\n    }\n\n    /// Configures the response format.\n    ///\n    /// The argument is typically [`ResponseFmt`](super::sensitivity::ResponseFmt).\n    pub fn response_fmt<R>(self, make_response: R) -> InstrumentOperation<S, RequestMakeFmt, R> {\n        InstrumentOperation {\n            inner: self.inner,\n            operation_id: self.operation_id,\n            make_request: self.make_request,\n            make_response,\n        }\n    }\n}\n\nimpl<S, U, V, RequestMakeFmt, ResponseMakeFmt> Service<Request<U>>\n    for InstrumentOperation<S, RequestMakeFmt, ResponseMakeFmt>\nwhere\n    S: Service<Request<U>, Response = Response<V>>,\n\n    for<'a> RequestMakeFmt: MakeDebug<&'a HeaderMap>,\n    for<'a> RequestMakeFmt: MakeDisplay<&'a Uri>,\n\n    ResponseMakeFmt: Clone,\n    for<'a> ResponseMakeFmt: MakeDebug<&'a HeaderMap>,\n    for<'a> ResponseMakeFmt: MakeDisplay<StatusCode>,\n{\n    type Response = S::Response;\n    type Error = S::Error;\n    type Future = InstrumentedFuture<S::Future, ResponseMakeFmt>;\n\n    fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {\n        self.inner.poll_ready(cx)\n    }\n\n    fn call(&mut self, request: Request<U>) -> Self::Future {\n        let span = {\n            let headers = self.make_request.make_debug(request.headers());\n            let uri = self.make_request.make_display(request.uri());\n            debug_span!(\"request\", operation = %self.operation_id.absolute(), method = %request.method(), %uri, ?headers)\n        };\n\n        InstrumentedFuture {\n            inner: InnerFuture {\n                inner: self.inner.call(request),\n                make: self.make_response.clone(),\n            }\n            .instrument(span),\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/src/layer/alb_health_check.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Middleware for handling [ALB health\n//! checks](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/target-group-health-checks.html).\n//!\n//! # Example\n//!\n//! ```no_run\n//! use aws_smithy_http_server::layer::alb_health_check::AlbHealthCheckLayer;\n//! use http::StatusCode;\n//! use tower::Layer;\n//!\n//! // Handle all `/ping` health check requests by returning a `200 OK`.\n//! let ping_layer = AlbHealthCheckLayer::from_handler(\"/ping\", |_req: hyper::Request<hyper::body::Incoming>| async {\n//!     StatusCode::OK\n//! });\n//! # async fn handle() { }\n//! let app = tower::service_fn(handle);\n//! let app = ping_layer.layer(app);\n//! ```\n\nuse std::borrow::Cow;\nuse std::convert::Infallible;\nuse std::task::{Context, Poll};\n\nuse futures_util::{Future, FutureExt};\nuse http::StatusCode;\nuse hyper::{Request, Response};\nuse pin_project_lite::pin_project;\nuse tower::{service_fn, util::Oneshot, Layer, Service, ServiceExt};\n\nuse crate::body::BoxBody;\n\nuse crate::plugin::either::Either;\nuse crate::plugin::either::EitherProj;\n\n/// A [`tower::Layer`] used to apply [`AlbHealthCheckService`].\n#[derive(Clone, Debug)]\npub struct AlbHealthCheckLayer<HealthCheckHandler> {\n    health_check_uri: Cow<'static, str>,\n    health_check_handler: HealthCheckHandler,\n}\n\nimpl AlbHealthCheckLayer<()> {\n    /// Handle health check requests at `health_check_uri` with the specified handler.\n    pub fn from_handler<\n        B: http_body::Body,\n        HandlerFuture: Future<Output = StatusCode>,\n        H: Fn(Request<B>) -> HandlerFuture + Clone,\n    >(\n        health_check_uri: impl Into<Cow<'static, str>>,\n        health_check_handler: H,\n    ) -> AlbHealthCheckLayer<\n        impl Service<\n                Request<B>,\n                Response = StatusCode,\n                Error = Infallible,\n                Future = impl Future<Output = Result<StatusCode, Infallible>>,\n            > + Clone,\n    > {\n        let service = service_fn(move |req| health_check_handler(req).map(Ok));\n\n        AlbHealthCheckLayer::new(health_check_uri, service)\n    }\n\n    /// Handle health check requests at `health_check_uri` with the specified service.\n    pub fn new<B, H: Service<Request<B>, Response = StatusCode>>(\n        health_check_uri: impl Into<Cow<'static, str>>,\n        health_check_handler: H,\n    ) -> AlbHealthCheckLayer<H> {\n        AlbHealthCheckLayer {\n            health_check_uri: health_check_uri.into(),\n            health_check_handler,\n        }\n    }\n}\n\nimpl<S, H: Clone> Layer<S> for AlbHealthCheckLayer<H> {\n    type Service = AlbHealthCheckService<H, S>;\n\n    fn layer(&self, inner: S) -> Self::Service {\n        AlbHealthCheckService {\n            inner,\n            layer: self.clone(),\n        }\n    }\n}\n\n/// A middleware [`Service`] responsible for handling health check requests.\n#[derive(Clone, Debug)]\npub struct AlbHealthCheckService<H, S> {\n    inner: S,\n    layer: AlbHealthCheckLayer<H>,\n}\n\nimpl<B, H, S> Service<Request<B>> for AlbHealthCheckService<H, S>\nwhere\n    S: Service<Request<B>, Response = Response<BoxBody>> + Clone,\n    S::Future: Send + 'static,\n    H: Service<Request<B>, Response = StatusCode, Error = Infallible> + Clone,\n{\n    type Response = S::Response;\n    type Error = S::Error;\n    type Future = AlbHealthCheckFuture<B, H, S>;\n\n    fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {\n        // The check that the service is ready is done by `Oneshot` below.\n        Poll::Ready(Ok(()))\n    }\n\n    fn call(&mut self, req: Request<B>) -> Self::Future {\n        if req.uri() == self.layer.health_check_uri.as_ref() {\n            let clone = self.layer.health_check_handler.clone();\n            let service = std::mem::replace(&mut self.layer.health_check_handler, clone);\n            let handler_future = service.oneshot(req);\n\n            AlbHealthCheckFuture::handler_future(handler_future)\n        } else {\n            let clone = self.inner.clone();\n            let service = std::mem::replace(&mut self.inner, clone);\n            let service_future = service.oneshot(req);\n\n            AlbHealthCheckFuture::service_future(service_future)\n        }\n    }\n}\n\ntype HealthCheckFutureInner<B, H, S> = Either<Oneshot<H, Request<B>>, Oneshot<S, Request<B>>>;\n\npin_project! {\n    /// Future for [`AlbHealthCheckService`].\n    pub struct AlbHealthCheckFuture<B, H: Service<Request<B>, Response = StatusCode>, S: Service<Request<B>>> {\n        #[pin]\n        inner: HealthCheckFutureInner<B, H, S>\n    }\n}\n\nimpl<B, H, S> AlbHealthCheckFuture<B, H, S>\nwhere\n    H: Service<Request<B>, Response = StatusCode>,\n    S: Service<Request<B>>,\n{\n    fn handler_future(handler_future: Oneshot<H, Request<B>>) -> Self {\n        Self {\n            inner: Either::Left { value: handler_future },\n        }\n    }\n\n    fn service_future(service_future: Oneshot<S, Request<B>>) -> Self {\n        Self {\n            inner: Either::Right { value: service_future },\n        }\n    }\n}\n\nimpl<B, H, S> Future for AlbHealthCheckFuture<B, H, S>\nwhere\n    H: Service<Request<B>, Response = StatusCode, Error = Infallible>,\n    S: Service<Request<B>, Response = Response<BoxBody>>,\n{\n    type Output = Result<S::Response, S::Error>;\n\n    fn poll(self: std::pin::Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {\n        let either_proj = self.project().inner.project();\n\n        match either_proj {\n            EitherProj::Left { value } => {\n                let polled: Poll<Self::Output> = value.poll(cx).map(|res| {\n                    res.map(|status_code| {\n                        Response::builder()\n                            .status(status_code)\n                            .body(crate::body::empty())\n                            .unwrap()\n                    })\n                    .map_err(|never| match never {})\n                });\n                polled\n            }\n            EitherProj::Right { value } => value.poll(cx),\n        }\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use http::Method;\n    use tower::{service_fn, ServiceExt};\n\n    #[tokio::test]\n    async fn test_health_check_handler_responds_to_matching_uri() {\n        let layer = AlbHealthCheckLayer::from_handler(\"/health\", |_req| async { StatusCode::OK });\n        let inner_service = service_fn(|_req| async { Ok::<_, Infallible>(Response::new(crate::body::empty())) });\n        let service = layer.layer(inner_service);\n\n        let request = Request::builder()\n            .method(Method::GET)\n            .uri(\"/health\")\n            .body(crate::body::empty())\n            .unwrap();\n\n        let response = service.oneshot(request).await.unwrap();\n        assert_eq!(response.status(), StatusCode::OK);\n    }\n\n    #[tokio::test]\n    async fn test_non_health_check_requests_pass_through() {\n        let layer = AlbHealthCheckLayer::from_handler(\"/health\", |_req| async { StatusCode::OK });\n        let inner_service = service_fn(|_req| async {\n            Ok::<_, Infallible>(\n                Response::builder()\n                    .status(StatusCode::ACCEPTED)\n                    .body(crate::body::empty())\n                    .unwrap(),\n            )\n        });\n        let service = layer.layer(inner_service);\n\n        let request = Request::builder()\n            .method(Method::GET)\n            .uri(\"/api/data\")\n            .body(crate::body::empty())\n            .unwrap();\n\n        let response = service.oneshot(request).await.unwrap();\n        assert_eq!(response.status(), StatusCode::ACCEPTED);\n    }\n\n    #[tokio::test]\n    async fn test_handler_can_read_request_headers() {\n        let layer = AlbHealthCheckLayer::from_handler(\"/ping\", |req| async move {\n            if req.headers().get(\"x-health-check\").is_some() {\n                StatusCode::OK\n            } else {\n                StatusCode::SERVICE_UNAVAILABLE\n            }\n        });\n        let inner_service = service_fn(|_req| async { Ok::<_, Infallible>(Response::new(crate::body::empty())) });\n        let service = layer.layer(inner_service);\n\n        // Test with header present\n        let request = Request::builder()\n            .uri(\"/ping\")\n            .header(\"x-health-check\", \"true\")\n            .body(crate::body::empty())\n            .unwrap();\n\n        let response = service.clone().oneshot(request).await.unwrap();\n        assert_eq!(response.status(), StatusCode::OK);\n\n        // Test without header\n        let request = Request::builder().uri(\"/ping\").body(crate::body::empty()).unwrap();\n\n        let response = service.oneshot(request).await.unwrap();\n        assert_eq!(response.status(), StatusCode::SERVICE_UNAVAILABLE);\n    }\n\n    #[tokio::test]\n    async fn test_works_with_any_body_type() {\n        use bytes::Bytes;\n        use http_body_util::Full;\n\n        let layer = AlbHealthCheckLayer::from_handler(\"/health\", |_req: Request<Full<Bytes>>| async { StatusCode::OK });\n        let inner_service =\n            service_fn(|_req: Request<Full<Bytes>>| async { Ok::<_, Infallible>(Response::new(crate::body::empty())) });\n        let service = layer.layer(inner_service);\n\n        let request = Request::builder()\n            .uri(\"/health\")\n            .body(Full::new(Bytes::from(\"test body\")))\n            .unwrap();\n\n        let response = service.oneshot(request).await.unwrap();\n        assert_eq!(response.status(), StatusCode::OK);\n    }\n\n    #[tokio::test]\n    async fn test_works_with_custom_body_type() {\n        use bytes::Bytes;\n        use http_body::Frame;\n        use std::pin::Pin;\n        use std::task::{Context, Poll};\n\n        // Custom body type that implements http_body::Body\n        struct CustomBody {\n            data: Option<Bytes>,\n        }\n\n        impl CustomBody {\n            fn new(data: Bytes) -> Self {\n                Self { data: Some(data) }\n            }\n        }\n\n        impl http_body::Body for CustomBody {\n            type Data = Bytes;\n            type Error = std::io::Error;\n\n            fn poll_frame(\n                mut self: Pin<&mut Self>,\n                _cx: &mut Context<'_>,\n            ) -> Poll<Option<Result<Frame<Self::Data>, Self::Error>>> {\n                if let Some(data) = self.data.take() {\n                    Poll::Ready(Some(Ok(Frame::data(data))))\n                } else {\n                    Poll::Ready(None)\n                }\n            }\n        }\n\n        let layer = AlbHealthCheckLayer::from_handler(\"/health\", |_req: Request<CustomBody>| async { StatusCode::OK });\n        let inner_service =\n            service_fn(|_req: Request<CustomBody>| async { Ok::<_, Infallible>(Response::new(crate::body::empty())) });\n        let service = layer.layer(inner_service);\n\n        let request = Request::builder()\n            .uri(\"/health\")\n            .body(CustomBody::new(Bytes::from(\"custom body\")))\n            .unwrap();\n\n        let response = service.oneshot(request).await.unwrap();\n        assert_eq!(response.status(), StatusCode::OK);\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/src/layer/mod.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! This module hosts [`Layer`](tower::Layer)s that are generally meant to be applied _around_ the\n//! [`Router`](crate::routing::Router), so they are enacted before a request is routed.\n\npub mod alb_health_check;\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/src/lib.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/* Automatically managed default lints */\n#![cfg_attr(docsrs, feature(doc_cfg))]\n/* End of automatically managed default lints */\n#![allow(clippy::derive_partial_eq_without_eq)]\n\n//! HTTP server runtime and utilities, loosely based on [axum].\n//!\n//! [axum]: https://docs.rs/axum/latest/axum/\n#[macro_use]\npub(crate) mod macros;\n\npub mod body;\npub(crate) mod error;\npub mod extension;\npub mod instrumentation;\npub mod layer;\npub mod operation;\npub mod plugin;\n#[doc(hidden)]\npub mod protocol;\n#[doc(hidden)]\npub mod rejection;\npub mod request;\n#[doc(hidden)]\npub mod response;\npub mod routing;\n#[doc(hidden)]\npub mod runtime_error;\npub mod serve;\npub mod service;\npub mod shape_id;\n\n#[doc(inline)]\npub(crate) use self::error::Error;\n#[doc(inline)]\npub use self::request::extension::Extension;\n#[doc(inline)]\npub use tower_http::add_extension::{AddExtension, AddExtensionLayer};\n\n#[cfg(test)]\nmod test_helpers;\n\n#[doc(no_inline)]\npub use http;\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/src/macros.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n// This code was copied and then modified from Tokio's Axum.\n\n/* Copyright (c) 2021 Tower Contributors\n *\n * Permission is hereby granted, free of charge, to any\n * person obtaining a copy of this software and associated\n * documentation files (the \"Software\"), to deal in the\n * Software without restriction, including without\n * limitation the rights to use, copy, modify, merge,\n * publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software\n * is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice\n * shall be included in all copies or substantial portions\n * of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF\n * ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED\n * TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A\n * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT\n * SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR\n * IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\n * DEALINGS IN THE SOFTWARE.\n */\n\n//! Macros implementation.\n\n/// Define a type that implements [`std::future::Future`].\n#[doc(hidden)]\n#[macro_export]\nmacro_rules! opaque_future {\n    ($(#[$m:meta])* pub type $name:ident = $actual:ty;) => {\n        opaque_future! {\n            $(#[$m])*\n            #[allow(clippy::type_complexity)]\n            pub type $name<> = $actual;\n        }\n    };\n\n    ($(#[$m:meta])* pub type $name:ident<$($param:ident),*> = $actual:ty;) => {\n            pin_project_lite::pin_project! {\n                $(#[$m])*\n                pub struct $name<$($param),*> {\n                    #[pin] future: $actual,\n                }\n            }\n\n        impl<$($param),*> $name<$($param),*> {\n            pub(crate) fn new(future: $actual) -> Self {\n                Self { future }\n            }\n        }\n\n        impl<$($param),*> std::fmt::Debug for $name<$($param),*> {\n            fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n                f.debug_tuple(stringify!($name)).field(&format_args!(\"...\")).finish()\n            }\n        }\n\n        impl<$($param),*> std::future::Future for $name<$($param),*>\n        where\n            $actual: std::future::Future,\n        {\n            type Output = <$actual as std::future::Future>::Output;\n\n            #[inline]\n            fn poll(\n                self: std::pin::Pin<&mut Self>,\n                cx: &mut std::task::Context<'_>,\n            ) -> std::task::Poll<Self::Output> {\n                self.project().future.poll(cx)\n            }\n        }\n    };\n}\n\nmacro_rules! convert_to_request_rejection {\n    ($from:ty, $to:ident) => {\n        impl From<$from> for RequestRejection {\n            fn from(err: $from) -> Self {\n                Self::$to(crate::Error::new(err))\n            }\n        }\n    };\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/src/operation/handler.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::{\n    convert::Infallible,\n    future::Future,\n    marker::PhantomData,\n    task::{Context, Poll},\n};\n\nuse futures_util::{future::Map, FutureExt};\nuse tower::Service;\n\nuse super::OperationShape;\n\n/// A utility trait used to provide an even interface for all operation handlers.\n///\n/// See [`operation`](crate::operation) documentation for more info.\npub trait Handler<Op, Exts>\nwhere\n    Op: OperationShape,\n{\n    type Future: Future<Output = Result<Op::Output, Op::Error>>;\n\n    fn call(&mut self, input: Op::Input, exts: Exts) -> Self::Future;\n}\n\n/// A utility trait used to provide an even interface over return types `Result<Ok, Error>`/`Ok`.\ntrait IntoResult<Ok, Error> {\n    fn into_result(self) -> Result<Ok, Error>;\n}\n\n// We can convert from `Result<Ok, Error>` to `Result<Ok, Error>`.\nimpl<Ok, Error> IntoResult<Ok, Error> for Result<Ok, Error> {\n    fn into_result(self) -> Result<Ok, Error> {\n        self\n    }\n}\n\n// We can convert from `T` to `Result<T, Infallible>`.\nimpl<Ok> IntoResult<Ok, Infallible> for Ok {\n    fn into_result(self) -> Result<Ok, Infallible> {\n        Ok(self)\n    }\n}\n\n// fn(Input) -> Output\nimpl<Op, F, Fut> Handler<Op, ()> for F\nwhere\n    Op: OperationShape,\n    F: Fn(Op::Input) -> Fut,\n    Fut: Future,\n    Fut::Output: IntoResult<Op::Output, Op::Error>,\n{\n    type Future = Map<Fut, fn(Fut::Output) -> Result<Op::Output, Op::Error>>;\n\n    fn call(&mut self, input: Op::Input, _exts: ()) -> Self::Future {\n        (self)(input).map(IntoResult::into_result)\n    }\n}\n\n// fn(Input, Ext_i) -> Output\nmacro_rules! impl_handler {\n    ($($var:ident),+) => (\n        impl<Op, F, Fut, $($var,)*> Handler<Op, ($($var,)*)> for F\n        where\n            Op: OperationShape,\n            F: Fn(Op::Input, $($var,)*) -> Fut,\n            Fut: Future,\n            Fut::Output: IntoResult<Op::Output, Op::Error>,\n        {\n            type Future = Map<Fut, fn(Fut::Output) -> Result<Op::Output, Op::Error>>;\n\n            fn call(&mut self, input: Op::Input, exts: ($($var,)*)) -> Self::Future {\n                #[allow(non_snake_case)]\n                let ($($var,)*) = exts;\n                (self)(input, $($var,)*).map(IntoResult::into_result)\n            }\n        }\n    )\n}\n\nimpl_handler!(Exts0);\nimpl_handler!(Exts0, Exts1);\nimpl_handler!(Exts0, Exts1, Exts2);\nimpl_handler!(Exts0, Exts1, Exts2, Exts3);\nimpl_handler!(Exts0, Exts1, Exts2, Exts3, Exts4);\nimpl_handler!(Exts0, Exts1, Exts2, Exts3, Exts4, Exts5);\nimpl_handler!(Exts0, Exts1, Exts2, Exts3, Exts4, Exts5, Exts6);\nimpl_handler!(Exts0, Exts1, Exts2, Exts3, Exts4, Exts5, Exts6, Exts7);\nimpl_handler!(Exts0, Exts1, Exts2, Exts3, Exts4, Exts5, Exts6, Exts7, Exts8);\n\n/// An extension trait for [`Handler`].\npub trait HandlerExt<Op, Exts>: Handler<Op, Exts>\nwhere\n    Op: OperationShape,\n{\n    /// Convert the [`Handler`] into a [`Service`].\n    fn into_service(self) -> IntoService<Op, Self>\n    where\n        Self: Sized,\n    {\n        IntoService {\n            handler: self,\n            _operation: PhantomData,\n        }\n    }\n}\n\nimpl<Op, Exts, H> HandlerExt<Op, Exts> for H\nwhere\n    Op: OperationShape,\n    H: Handler<Op, Exts>,\n{\n}\n\n/// A [`Service`] provided for every [`Handler`].\npub struct IntoService<Op, H> {\n    pub(crate) handler: H,\n    pub(crate) _operation: PhantomData<Op>,\n}\n\nimpl<Op, H> Clone for IntoService<Op, H>\nwhere\n    H: Clone,\n{\n    fn clone(&self) -> Self {\n        Self {\n            handler: self.handler.clone(),\n            _operation: PhantomData,\n        }\n    }\n}\n\nimpl<Op, Exts, H> Service<(Op::Input, Exts)> for IntoService<Op, H>\nwhere\n    Op: OperationShape,\n    H: Handler<Op, Exts>,\n{\n    type Response = Op::Output;\n    type Error = Op::Error;\n    type Future = H::Future;\n\n    fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {\n        Poll::Ready(Ok(()))\n    }\n\n    fn call(&mut self, (input, exts): (Op::Input, Exts)) -> Self::Future {\n        self.handler.call(input, exts)\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/src/operation/mod.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! The shape of a [Smithy operation] is modelled by the [`OperationShape`] trait. Its associated types\n//! [`OperationShape::Input`], [`OperationShape::Output`], and [`OperationShape::Error`] map to the structures\n//! representing the Smithy inputs, outputs, and errors respectively. When an operation error is not specified\n//! [`OperationShape::Error`] is [`Infallible`](std::convert::Infallible).\n//!\n//! We generate a marker struct for each Smithy operation and implement [`OperationShape`] on them. This\n//! is used as a helper - providing static methods and parameterizing other traits.\n//!\n//! The model\n//!\n//! ```smithy\n//! operation GetShopping {\n//!    input: CartIdentifier,\n//!    output: ShoppingCart,\n//!    errors: [...]\n//! }\n//! ```\n//!\n//! is identified with the implementation\n//!\n//! ```rust,no_run\n//! # use aws_smithy_http_server::shape_id::ShapeId;\n//! # use aws_smithy_http_server::operation::OperationShape;\n//! # pub struct CartIdentifier;\n//! # pub struct ShoppingCart;\n//! # pub enum GetShoppingError {}\n//! pub struct GetShopping;\n//!\n//! impl OperationShape for GetShopping {\n//!     const ID: ShapeId = ShapeId::new(\"namespace#GetShopping\", \"namespace\", \"GetShopping\");\n//!\n//!     type Input = CartIdentifier;\n//!     type Output = ShoppingCart;\n//!     type Error = GetShoppingError;\n//! }\n//! ```\n//!\n//! The behavior of a Smithy operation is encoded by a [`Service`](tower::Service). The [`OperationShape`] types can\n//! be used to construct specific operations using [`OperationShapeExt::from_handler`] and\n//! [`OperationShapeExt::from_service`] methods. The [from_handler](OperationShapeExt::from_handler) constructor takes\n//! a [`Handler`] whereas the [from_service](OperationShapeExt::from_service) takes a [`OperationService`]. Both traits\n//! serve a similar purpose - they provide a common interface over a class of structures.\n//!\n//! ## [`Handler`]\n//!\n//! The [`Handler`] trait is implemented by all async functions which accept [`OperationShape::Input`] as their first\n//! argument, the remaining arguments implement [`FromParts`](crate::request::FromParts), and return either\n//! [`OperationShape::Output`] when [`OperationShape::Error`] is [`Infallible`](std::convert::Infallible) or\n//! [`Result`]<[`OperationShape::Output`],[`OperationShape::Error`]>. The following are examples of async functions which\n//! implement [`Handler`]:\n//!\n//! ```rust,no_run\n//! # use aws_smithy_http_server::Extension;\n//! # pub struct CartIdentifier;\n//! # pub struct ShoppingCart;\n//! # pub enum GetShoppingError {}\n//! # pub struct Context;\n//! # pub struct ExtraContext;\n//! // Simple handler where no error is modelled.\n//! async fn handler_a(input: CartIdentifier) -> ShoppingCart {\n//!     todo!()\n//! }\n//!\n//! // Handler with an extension where no error is modelled.\n//! async fn handler_b(input: CartIdentifier, ext: Extension<Context>) -> ShoppingCart {\n//!     todo!()\n//! }\n//!\n//! // More than one extension can be provided.\n//! async fn handler_c(input: CartIdentifier, ext_1: Extension<Context>, ext_2: Extension<ExtraContext>) -> ShoppingCart {\n//!     todo!()\n//! }\n//!\n//! // When an error is modelled we must return a `Result`.\n//! async fn handler_d(input: CartIdentifier, ext: Extension<Context>) -> Result<ShoppingCart, GetShoppingError> {\n//!     todo!()\n//! }\n//! ```\n//!\n//! ## [`OperationService`]\n//!\n//! Similarly, the [`OperationService`] trait is implemented by all `Service<(Op::Input, ...)>` with\n//! `Response = Op::Output`, and `Error = Op::Error`.\n//!\n//! The following are examples of [`Service`](tower::Service)s which implement [`OperationService`]:\n//!\n//! - `Service<CartIdentifier, Response = ShoppingCart, Error = Infallible>`.\n//! - `Service<(CartIdentifier, Extension<Context>), Response = ShoppingCart, Error = GetShoppingCartError>`.\n//! - `Service<(CartIdentifier, Extension<Context>, Extension<ExtraContext>), Response = ShoppingCart, Error = GetShoppingCartError)`.\n//!\n//! Notice the parallels between [`OperationService`] and [`Handler`].\n//!\n//! ## Constructing an Operation\n//!\n//! The following is an example of using both construction approaches:\n//!\n//! ```rust,no_run\n//! # use std::task::{Poll, Context};\n//! # use aws_smithy_http_server::operation::*;\n//! # use tower::Service;\n//! # use aws_smithy_http_server::shape_id::ShapeId;\n//! # pub struct CartIdentifier;\n//! # pub struct ShoppingCart;\n//! # pub enum GetShoppingError {}\n//! # pub struct GetShopping;\n//! # impl OperationShape for GetShopping {\n//! #    const ID: ShapeId = ShapeId::new(\"namespace#GetShopping\", \"namespace\", \"GetShopping\");\n//! #\n//! #    type Input = CartIdentifier;\n//! #    type Output = ShoppingCart;\n//! #    type Error = GetShoppingError;\n//! # }\n//! # type OpFuture = std::future::Ready<Result<ShoppingCart, GetShoppingError>>;\n//! // Construction of an `Operation` from a `Handler`.\n//!\n//! async fn op_handler(input: CartIdentifier) -> Result<ShoppingCart, GetShoppingError> {\n//!     todo!()\n//! }\n//!\n//! let operation = GetShopping::from_handler(op_handler);\n//!\n//! // Construction of an `Operation` from a `Service`.\n//!\n//! pub struct OpService;\n//!\n//! impl Service<CartIdentifier> for OpService {\n//!     type Response = ShoppingCart;\n//!     type Error = GetShoppingError;\n//!     type Future = OpFuture;\n//!\n//!     fn poll_ready(&mut self, cx: &mut Context) -> Poll<Result<(), Self::Error>> {\n//!         todo!()\n//!     }\n//!\n//!     fn call(&mut self, request: CartIdentifier) -> Self::Future {\n//!         todo!()\n//!     }\n//! }\n//!\n//! let operation = GetShopping::from_service(OpService);\n//!\n//! ```\n//!\n//! ## Upgrading Smithy services to HTTP services\n//!\n//! Both [`Handler`] and [`OperationService`] accept and return Smithy model structures. They are converted to a\n//! canonical form `Service<(Op::Input, Exts), Response = Op::Output, Error = Op::Error>`. The\n//! [`UpgradePlugin`] acts upon such services by converting them to\n//! `Service<http::Request, Response = http::Response, Error = Infallible>` by applying serialization/deserialization\n//! and validation specified by the Smithy contract.\n//!\n//!\n//! The [`UpgradePlugin`], being a [`Plugin`](crate::plugin::Plugin), is parameterized by a protocol. This allows for\n//! upgrading to `Service<http::Request, Response = http::Response, Error = Infallible>` to be protocol dependent.\n//!\n//! [Smithy operation]: https://smithy.io/2.0/spec/service-types.html#operation\n\nmod handler;\nmod operation_service;\nmod shape;\nmod upgrade;\n\npub use handler::*;\npub use operation_service::*;\npub use shape::*;\npub use upgrade::*;\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/src/operation/operation_service.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::{\n    marker::PhantomData,\n    task::{Context, Poll},\n};\n\nuse tower::Service;\n\nuse super::OperationShape;\n\n/// A utility trait used to provide an even interface for all operation services.\n///\n/// This serves to take [`Service`]s of the form `Service<(Op::Input, Ext0, Ext1, ...)>` to the canonical\n/// representation of `Service<(Input, (Ext0, Ext1, ...))>` inline with\n/// [`IntoService`](super::IntoService).\n///\n/// See [`operation`](crate::operation) documentation for more info.\npub trait OperationService<Op, Exts>: Service<Self::Normalized, Response = Op::Output, Error = Op::Error>\nwhere\n    Op: OperationShape,\n{\n    type Normalized;\n\n    // Normalize the request type.\n    fn normalize(input: Op::Input, exts: Exts) -> Self::Normalized;\n}\n\n// `Service<Op::Input>`\nimpl<Op, S> OperationService<Op, ()> for S\nwhere\n    Op: OperationShape,\n    S: Service<Op::Input, Response = Op::Output, Error = Op::Error>,\n{\n    type Normalized = Op::Input;\n\n    fn normalize(input: Op::Input, _exts: ()) -> Self::Normalized {\n        input\n    }\n}\n\n// `Service<(Op::Input, Ext0)>`\nimpl<Op, Ext0, S> OperationService<Op, (Ext0,)> for S\nwhere\n    Op: OperationShape,\n    S: Service<(Op::Input, Ext0), Response = Op::Output, Error = Op::Error>,\n{\n    type Normalized = (Op::Input, Ext0);\n\n    fn normalize(input: Op::Input, exts: (Ext0,)) -> Self::Normalized {\n        (input, exts.0)\n    }\n}\n\n// `Service<(Op::Input, Ext0, Ext1)>`\nimpl<Op, Ext0, Ext1, S> OperationService<Op, (Ext0, Ext1)> for S\nwhere\n    Op: OperationShape,\n    S: Service<(Op::Input, Ext0, Ext1), Response = Op::Output, Error = Op::Error>,\n{\n    type Normalized = (Op::Input, Ext0, Ext1);\n\n    fn normalize(input: Op::Input, exts: (Ext0, Ext1)) -> Self::Normalized {\n        (input, exts.0, exts.1)\n    }\n}\n\n/// An extension trait of [`OperationService`].\npub trait OperationServiceExt<Op, Exts>: OperationService<Op, Exts>\nwhere\n    Op: OperationShape,\n{\n    /// Convert the [`OperationService`] into a canonicalized [`Service`].\n    fn normalize(self) -> Normalize<Op, Self>\n    where\n        Self: Sized,\n    {\n        Normalize {\n            inner: self,\n            _operation: PhantomData,\n        }\n    }\n}\n\nimpl<F, Op, Exts> OperationServiceExt<Op, Exts> for F\nwhere\n    Op: OperationShape,\n    F: OperationService<Op, Exts>,\n{\n}\n\n/// A [`Service`] normalizing the request type of a [`OperationService`].\n#[derive(Debug)]\npub struct Normalize<Op, S> {\n    pub(crate) inner: S,\n    pub(crate) _operation: PhantomData<Op>,\n}\n\nimpl<Op, S> Clone for Normalize<Op, S>\nwhere\n    S: Clone,\n{\n    fn clone(&self) -> Self {\n        Self {\n            inner: self.inner.clone(),\n            _operation: PhantomData,\n        }\n    }\n}\n\nimpl<Op, S, Exts> Service<(Op::Input, Exts)> for Normalize<Op, S>\nwhere\n    Op: OperationShape,\n    S: OperationService<Op, Exts>,\n{\n    type Response = S::Response;\n    type Error = S::Error;\n    type Future = <S as Service<S::Normalized>>::Future;\n\n    fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {\n        self.inner.poll_ready(cx)\n    }\n\n    fn call(&mut self, (input, exts): (Op::Input, Exts)) -> Self::Future {\n        let req = S::normalize(input, exts);\n        self.inner.call(req)\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/src/operation/shape.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::marker::PhantomData;\n\nuse super::{Handler, IntoService, Normalize, OperationService};\nuse crate::shape_id::ShapeId;\n\n/// Models the [Smithy Operation shape].\n///\n/// [Smithy Operation shape]: https://smithy.io/2.0/spec/service-types.html#operation\npub trait OperationShape {\n    /// The ID of the operation.\n    const ID: ShapeId;\n\n    /// The operation input.\n    type Input;\n    /// The operation output.\n    type Output;\n    /// The operation error. [`Infallible`](std::convert::Infallible) in the case where no error\n    /// exists.\n    type Error;\n}\n\n/// An extension trait over [`OperationShape`].\npub trait OperationShapeExt: OperationShape {\n    /// Creates a new [`Service`](tower::Service), [`IntoService`], for well-formed [`Handler`]s.\n    fn from_handler<H, Exts>(handler: H) -> IntoService<Self, H>\n    where\n        H: Handler<Self, Exts>,\n        Self: Sized,\n    {\n        IntoService {\n            handler,\n            _operation: PhantomData,\n        }\n    }\n\n    /// Creates a new normalized [`Service`](tower::Service), [`Normalize`], for well-formed\n    /// [`Service`](tower::Service)s.\n    fn from_service<S, Exts>(svc: S) -> Normalize<Self, S>\n    where\n        S: OperationService<Self, Exts>,\n        Self: Sized,\n    {\n        Normalize {\n            inner: svc,\n            _operation: PhantomData,\n        }\n    }\n}\n\nimpl<S> OperationShapeExt for S where S: OperationShape {}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/src/operation/upgrade.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::{\n    convert::Infallible,\n    future::{Future, Ready},\n    marker::PhantomData,\n    pin::Pin,\n    task::{Context, Poll},\n};\n\nuse futures_util::ready;\nuse pin_project_lite::pin_project;\nuse tower::{util::Oneshot, Service, ServiceExt};\nuse tracing::error;\n\nuse crate::{\n    body::BoxBody, plugin::Plugin, request::FromRequest, response::IntoResponse,\n    runtime_error::InternalFailureException, service::ServiceShape,\n};\n\nuse super::OperationShape;\n\n/// A [`Plugin`] responsible for taking an operation [`Service`], accepting and returning Smithy\n/// types and converting it into a [`Service`] taking and returning [`http`] types.\n///\n/// See [`Upgrade`].\n#[derive(Debug, Clone)]\npub struct UpgradePlugin<Extractors> {\n    _extractors: PhantomData<Extractors>,\n}\n\nimpl<Extractors> Default for UpgradePlugin<Extractors> {\n    fn default() -> Self {\n        Self {\n            _extractors: PhantomData,\n        }\n    }\n}\n\nimpl<Extractors> UpgradePlugin<Extractors> {\n    /// Creates a new [`UpgradePlugin`].\n    pub fn new() -> Self {\n        Self::default()\n    }\n}\n\nimpl<Ser, Op, T, Extractors> Plugin<Ser, Op, T> for UpgradePlugin<Extractors>\nwhere\n    Ser: ServiceShape,\n    Op: OperationShape,\n{\n    type Output = Upgrade<Ser::Protocol, (Op::Input, Extractors), T>;\n\n    fn apply(&self, inner: T) -> Self::Output {\n        Upgrade {\n            _protocol: PhantomData,\n            _input: PhantomData,\n            inner,\n        }\n    }\n}\n\n/// A [`Service`] responsible for wrapping an operation [`Service`] accepting and returning Smithy\n/// types, and converting it into a [`Service`] accepting and returning [`http`] types.\npub struct Upgrade<Protocol, Input, S> {\n    _protocol: PhantomData<Protocol>,\n    _input: PhantomData<Input>,\n    inner: S,\n}\n\nimpl<P, Input, S> Clone for Upgrade<P, Input, S>\nwhere\n    S: Clone,\n{\n    fn clone(&self) -> Self {\n        Self {\n            _protocol: PhantomData,\n            _input: PhantomData,\n            inner: self.inner.clone(),\n        }\n    }\n}\n\npin_project! {\n    #[project = InnerProj]\n    #[project_replace = InnerProjReplace]\n    enum Inner<FromFut, HandlerFut> {\n        FromRequest {\n            #[pin]\n            inner: FromFut\n        },\n        Inner {\n            #[pin]\n            call: HandlerFut\n        }\n    }\n}\n\ntype InnerAlias<Input, Protocol, B, S> = Inner<<Input as FromRequest<Protocol, B>>::Future, Oneshot<S, Input>>;\n\npin_project! {\n    /// The [`Service::Future`] of [`Upgrade`].\n    pub struct UpgradeFuture<Protocol, Input, B, S>\n    where\n        Input: FromRequest<Protocol, B>,\n        S: Service<Input>,\n    {\n        service: Option<S>,\n        #[pin]\n        inner: InnerAlias<Input, Protocol, B, S>\n    }\n}\n\nimpl<P, Input, B, S> Future for UpgradeFuture<P, Input, B, S>\nwhere\n    Input: FromRequest<P, B>,\n    <Input as FromRequest<P, B>>::Rejection: std::fmt::Display,\n    S: Service<Input>,\n    S::Response: IntoResponse<P>,\n    S::Error: IntoResponse<P>,\n{\n    type Output = Result<http::Response<crate::body::BoxBody>, Infallible>;\n\n    fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {\n        loop {\n            let mut this = self.as_mut().project();\n            let this2 = this.inner.as_mut().project();\n\n            let call = match this2 {\n                InnerProj::FromRequest { inner } => {\n                    let result = ready!(inner.poll(cx));\n                    match result {\n                        Ok(ok) => this\n                            .service\n                            .take()\n                            .expect(\"futures cannot be polled after completion\")\n                            .oneshot(ok),\n                        Err(err) => {\n                            // The error may arise either from a `FromRequest` failure for any user-defined\n                            // handler's additional input parameters, or from a de-serialization failure\n                            // of an input parameter specific to the operation.\n                            tracing::trace!(error = %err, \"parameter for the handler cannot be constructed\");\n                            return Poll::Ready(Ok(err.into_response()));\n                        }\n                    }\n                }\n                InnerProj::Inner { call } => {\n                    let result = ready!(call.poll(cx));\n                    let output = match result {\n                        Ok(ok) => ok.into_response(),\n                        Err(err) => err.into_response(),\n                    };\n                    return Poll::Ready(Ok(output));\n                }\n            };\n\n            this.inner.as_mut().project_replace(Inner::Inner { call });\n        }\n    }\n}\n\nimpl<P, Input, B, S> Service<http::Request<B>> for Upgrade<P, Input, S>\nwhere\n    Input: FromRequest<P, B>,\n    <Input as FromRequest<P, B>>::Rejection: std::fmt::Display,\n    S: Service<Input> + Clone,\n    S::Response: IntoResponse<P>,\n    S::Error: IntoResponse<P>,\n{\n    type Response = http::Response<crate::body::BoxBody>;\n    type Error = Infallible;\n    type Future = UpgradeFuture<P, Input, B, S>;\n\n    fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {\n        // The check that the inner service is ready is done by `Oneshot` in `UpgradeFuture`'s\n        // implementation.\n        Poll::Ready(Ok(()))\n    }\n\n    fn call(&mut self, req: http::Request<B>) -> Self::Future {\n        let clone = self.inner.clone();\n        let service = std::mem::replace(&mut self.inner, clone);\n        UpgradeFuture {\n            service: Some(service),\n            inner: Inner::FromRequest {\n                inner: <Input as FromRequest<P, B>>::from_request(req),\n            },\n        }\n    }\n}\n\n/// A [`Service`] which always returns an internal failure message and logs an error.\n#[derive(Copy)]\npub struct MissingFailure<P> {\n    _protocol: PhantomData<fn(P)>,\n}\n\nimpl<P> Default for MissingFailure<P> {\n    fn default() -> Self {\n        Self { _protocol: PhantomData }\n    }\n}\n\nimpl<P> Clone for MissingFailure<P> {\n    fn clone(&self) -> Self {\n        MissingFailure { _protocol: PhantomData }\n    }\n}\n\nimpl<R, P> Service<R> for MissingFailure<P>\nwhere\n    InternalFailureException: IntoResponse<P>,\n{\n    type Response = http::Response<BoxBody>;\n    type Error = Infallible;\n    type Future = Ready<Result<Self::Response, Self::Error>>;\n\n    fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {\n        Poll::Ready(Ok(()))\n    }\n\n    fn call(&mut self, _request: R) -> Self::Future {\n        error!(\"the operation has not been set\");\n        std::future::ready(Ok(InternalFailureException.into_response()))\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/src/plugin/closure.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::service::ContainsOperation;\n\nuse super::Plugin;\n\n/// An adapter to convert a `Fn(ShapeId, T) -> Service` closure into a [`Plugin`]. See [`plugin_from_operation_fn`] for more details.\npub struct OperationFn<F> {\n    f: F,\n}\n\nimpl<Ser, Op, T, NewService, F> Plugin<Ser, Op, T> for OperationFn<F>\nwhere\n    Ser: ContainsOperation<Op>,\n    F: Fn(Ser::Operations, T) -> NewService,\n{\n    type Output = NewService;\n\n    fn apply(&self, input: T) -> Self::Output {\n        (self.f)(Ser::VALUE, input)\n    }\n}\n\n/// Constructs a [`Plugin`] using a closure over the [`ServiceShape::] `F: Fn(ShapeId, T) -> Service`.\n///\n/// # Example\n///\n/// ```rust\n/// # use aws_smithy_http_server::{service::*, operation::OperationShape, plugin::Plugin, shape_id::ShapeId};\n/// # pub enum Operation { CheckHealth, GetPokemonSpecies }\n/// # impl Operation { fn shape_id(&self) -> ShapeId { ShapeId::new(\"\", \"\", \"\") }}\n/// # pub struct CheckHealth;\n/// # pub struct GetPokemonSpecies;\n/// # pub struct PokemonService;\n/// # impl ServiceShape for PokemonService {\n/// #   const ID: ShapeId = ShapeId::new(\"\", \"\", \"\");\n/// #   const VERSION: Option<&'static str> = None;\n/// #   type Protocol = ();\n/// #   type Operations = Operation;\n/// # }\n/// # impl OperationShape for CheckHealth { const ID: ShapeId = ShapeId::new(\"\", \"\", \"\"); type Input = (); type Output = (); type Error = (); }\n/// # impl OperationShape for GetPokemonSpecies { const ID: ShapeId = ShapeId::new(\"\", \"\", \"\"); type Input = (); type Output = (); type Error = (); }\n/// # impl ContainsOperation<CheckHealth> for PokemonService { const VALUE: Operation = Operation::CheckHealth; }\n/// # impl ContainsOperation<GetPokemonSpecies> for PokemonService { const VALUE: Operation = Operation::GetPokemonSpecies; }\n/// use aws_smithy_http_server::plugin::plugin_from_operation_fn;\n/// use tower::layer::layer_fn;\n///\n/// struct FooService<S> {\n///     info: String,\n///     inner: S\n/// }\n///\n/// fn map<S>(op: Operation, inner: S) -> FooService<S> {\n///     match op {\n///         Operation::CheckHealth => FooService { info: op.shape_id().name().to_string(), inner },\n///         Operation::GetPokemonSpecies => FooService { info: \"bar\".to_string(), inner },\n///         _ => todo!()\n///     }\n/// }\n///\n/// // This plugin applies the `FooService` middleware around every operation.\n/// let plugin = plugin_from_operation_fn(map);\n/// # let _ = Plugin::<PokemonService, CheckHealth, ()>::apply(&plugin, ());\n/// # let _ = Plugin::<PokemonService, GetPokemonSpecies, ()>::apply(&plugin, ());\n/// ```\npub fn plugin_from_operation_fn<F>(f: F) -> OperationFn<F> {\n    OperationFn { f }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/src/plugin/either.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Contains the [`Either`] enum.\n\nuse pin_project_lite::pin_project;\nuse std::{\n    future::Future,\n    pin::Pin,\n    task::{Context, Poll},\n};\nuse tower::{Layer, Service};\n\nuse super::Plugin;\n\n// TODO(https://github.com/smithy-lang/smithy-rs/pull/2441#pullrequestreview-1331345692): Seems like\n// this type should land in `tower-0.5`.\npin_project! {\n    /// Combine two different [`Futures`](std::future::Future)/[`Services`](tower::Service)/\n    /// [`Layers`](tower::Layer)/[`Plugins`](super::Plugin) into a single type.\n    ///\n    /// # Notes on [`Future`](std::future::Future)\n    ///\n    /// The [`Future::Output`] must be identical.\n    ///\n    /// # Notes on [`Service`](tower::Service)\n    ///\n    /// The [`Service::Response`] and [`Service::Error`] must be identical.\n    #[derive(Clone, Debug)]\n    #[project = EitherProj]\n    pub enum Either<L, R> {\n        /// One type of backing [`Service`].\n        Left { #[pin] value: L },\n        /// The other type of backing [`Service`].\n        Right { #[pin] value: R },\n    }\n}\n\nimpl<L, R> Future for Either<L, R>\nwhere\n    L: Future,\n    R: Future<Output = L::Output>,\n{\n    type Output = L::Output;\n\n    fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {\n        match self.project() {\n            EitherProj::Left { value } => value.poll(cx),\n            EitherProj::Right { value } => value.poll(cx),\n        }\n    }\n}\n\nimpl<L, R, Request> Service<Request> for Either<L, R>\nwhere\n    L: Service<Request>,\n    R: Service<Request, Response = L::Response, Error = L::Error>,\n{\n    type Response = L::Response;\n    type Error = L::Error;\n    type Future = Either<L::Future, R::Future>;\n\n    fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {\n        use self::Either::*;\n\n        match self {\n            Left { value } => value.poll_ready(cx),\n            Right { value } => value.poll_ready(cx),\n        }\n    }\n\n    fn call(&mut self, request: Request) -> Self::Future {\n        use self::Either::*;\n\n        match self {\n            Left { value } => Either::Left {\n                value: value.call(request),\n            },\n            Right { value } => Either::Right {\n                value: value.call(request),\n            },\n        }\n    }\n}\n\nimpl<S, L, R> Layer<S> for Either<L, R>\nwhere\n    L: Layer<S>,\n    R: Layer<S>,\n{\n    type Service = Either<L::Service, R::Service>;\n\n    fn layer(&self, inner: S) -> Self::Service {\n        match self {\n            Either::Left { value } => Either::Left {\n                value: value.layer(inner),\n            },\n            Either::Right { value } => Either::Right {\n                value: value.layer(inner),\n            },\n        }\n    }\n}\n\nimpl<Ser, Op, T, Le, Ri> Plugin<Ser, Op, T> for Either<Le, Ri>\nwhere\n    Le: Plugin<Ser, Op, T>,\n    Ri: Plugin<Ser, Op, T>,\n{\n    type Output = Either<Le::Output, Ri::Output>;\n\n    fn apply(&self, input: T) -> Self::Output {\n        match self {\n            Either::Left { value } => Either::Left {\n                value: value.apply(input),\n            },\n            Either::Right { value } => Either::Right {\n                value: value.apply(input),\n            },\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/src/plugin/filter.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse super::{either::Either, IdentityPlugin, ModelMarker};\n\nuse crate::operation::OperationShape;\nuse crate::service::ContainsOperation;\n\nuse super::{HttpMarker, Plugin};\n\n/// Filters the application of an inner [`Plugin`] using a predicate over the\n/// [`ServiceShape::Operations`](crate::service::ServiceShape::Operations).\n///\n/// This contrasts with [`Scoped`](crate::plugin::Scoped) which can be used to selectively apply a [`Plugin`] to a\n/// subset of operations at _compile time_.\n///\n/// See [`filter_by_operation`] for more details.\npub struct FilterByOperation<Inner, F> {\n    inner: Inner,\n    predicate: F,\n}\n\nimpl<Ser, Op, T, Inner, F> Plugin<Ser, Op, T> for FilterByOperation<Inner, F>\nwhere\n    Ser: ContainsOperation<Op>,\n    F: Fn(Ser::Operations) -> bool,\n    Inner: Plugin<Ser, Op, T>,\n    Op: OperationShape,\n{\n    type Output = Either<Inner::Output, T>;\n\n    fn apply(&self, input: T) -> Self::Output {\n        let either_plugin = if (self.predicate)(<Ser as ContainsOperation<Op>>::VALUE) {\n            Either::Left { value: &self.inner }\n        } else {\n            Either::Right { value: IdentityPlugin }\n        };\n        either_plugin.apply(input)\n    }\n}\n\nimpl<Inner, F> HttpMarker for FilterByOperation<Inner, F> where Inner: HttpMarker {}\nimpl<Inner, F> ModelMarker for FilterByOperation<Inner, F> where Inner: ModelMarker {}\n\n/// Filters the application of an inner [`Plugin`] using a predicate over the\n/// [`ServiceShape::Operations`](crate::service::ServiceShape::Operations).\n///\n/// Users should prefer [`Scoped`](crate::plugin::Scoped) and fallback to [`filter_by_operation`]\n/// in cases where [`Plugin`] application must be decided at runtime.\n///\n/// # Example\n///\n/// ```rust\n/// use aws_smithy_http_server::plugin::filter_by_operation;\n/// # use aws_smithy_http_server::{plugin::Plugin, operation::OperationShape, shape_id::ShapeId, service::{ServiceShape, ContainsOperation}};\n/// # struct Pl;\n/// # struct PokemonService;\n/// # #[derive(PartialEq, Eq)]\n/// # enum Operation { CheckHealth }\n/// # impl ServiceShape for PokemonService { const VERSION: Option<&'static str> = None; const ID: ShapeId = ShapeId::new(\"\", \"\", \"\"); type Operations = Operation; type Protocol = (); }\n/// # impl ContainsOperation<CheckHealth> for PokemonService { const VALUE: Operation = Operation::CheckHealth; }\n/// # struct CheckHealth;\n/// # impl OperationShape for CheckHealth { const ID: ShapeId = ShapeId::new(\"\", \"\", \"\"); type Input = (); type Output = (); type Error = (); }\n/// # impl Plugin<PokemonService, CheckHealth, ()> for Pl { type Output = (); fn apply(&self, input: ()) -> Self::Output { input }}\n/// # let plugin = Pl;\n/// # let svc = ();\n/// // Prevents `plugin` from being applied to the `CheckHealth` operation.\n/// let filtered_plugin = filter_by_operation(plugin, |name| name != Operation::CheckHealth);\n/// let new_operation = filtered_plugin.apply(svc);\n/// ```\npub fn filter_by_operation<Inner, F>(plugins: Inner, predicate: F) -> FilterByOperation<Inner, F> {\n    FilterByOperation {\n        inner: plugins,\n        predicate,\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/src/plugin/http_plugins.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n// If you make any updates to this file (including Rust docs), make sure you make them to\n// `model_plugins.rs` too!\n\nuse crate::plugin::{IdentityPlugin, Plugin, PluginStack};\n\nuse super::{HttpMarker, LayerPlugin};\n\n/// A wrapper struct for composing HTTP plugins.\n///\n/// ## Applying plugins in a sequence\n///\n/// You can use the [`push`](HttpPlugins::push) method to apply a new HTTP plugin after the ones that\n/// have already been registered.\n///\n/// ```rust\n/// use aws_smithy_http_server::plugin::HttpPlugins;\n/// # use aws_smithy_http_server::plugin::IdentityPlugin as LoggingPlugin;\n/// # use aws_smithy_http_server::plugin::IdentityPlugin as MetricsPlugin;\n///\n/// let http_plugins = HttpPlugins::new().push(LoggingPlugin).push(MetricsPlugin);\n/// ```\n///\n/// The plugins' runtime logic is executed in registration order.\n/// In our example above, `LoggingPlugin` would run first, while `MetricsPlugin` is executed last.\n///\n/// ## Wrapping the current plugin pipeline\n///\n/// From time to time, you might have a need to transform the entire pipeline that has been built\n/// so far - e.g. you only want to apply those plugins for a specific operation.\n///\n/// `HttpPlugins` is itself a [`Plugin`]: you can apply any transformation that expects a\n/// [`Plugin`] to an entire pipeline. In this case, we could use a [scoped\n/// plugin](crate::plugin::Scoped) to limit the scope of the logging and metrics plugins to the\n/// `CheckHealth` operation:\n///\n/// ```rust\n/// use aws_smithy_http_server::scope;\n/// use aws_smithy_http_server::plugin::{HttpPlugins, Scoped};\n/// # use aws_smithy_http_server::plugin::IdentityPlugin as LoggingPlugin;\n/// # use aws_smithy_http_server::plugin::IdentityPlugin as MetricsPlugin;\n/// # use aws_smithy_http_server::plugin::IdentityPlugin as AuthPlugin;\n/// use aws_smithy_http_server::shape_id::ShapeId;\n/// # #[derive(PartialEq)]\n/// # enum Operation { CheckHealth }\n/// # struct CheckHealth;\n/// # impl CheckHealth { const ID: ShapeId = ShapeId::new(\"namespace#MyName\", \"namespace\", \"MyName\"); }\n///\n/// // The logging and metrics plugins will only be applied to the `CheckHealth` operation.\n/// let plugin = HttpPlugins::new()\n///     .push(LoggingPlugin)\n///     .push(MetricsPlugin);\n///\n/// scope! {\n///     struct OnlyCheckHealth {\n///         includes: [CheckHealth],\n///         excludes: [/* The rest of the operations go here */]\n///     }\n/// }\n///\n/// let filtered_plugin = Scoped::new::<OnlyCheckHealth>(&plugin);\n/// let http_plugins = HttpPlugins::new()\n///     .push(filtered_plugin)\n///     // The auth plugin will be applied to all operations.\n///     .push(AuthPlugin);\n/// ```\n///\n/// ## Concatenating two collections of HTTP plugins\n///\n/// `HttpPlugins` is a good way to bundle together multiple plugins, ensuring they are all\n/// registered in the correct order.\n///\n/// Since `HttpPlugins` is itself a HTTP plugin (it implements the `HttpMarker` trait), you can use\n/// the [`push`](HttpPlugins::push) to append, at once, all the HTTP plugins in another\n/// `HttpPlugins` to the current `HttpPlugins`:\n///\n/// ```rust\n/// use aws_smithy_http_server::plugin::{IdentityPlugin, HttpPlugins, PluginStack};\n/// # use aws_smithy_http_server::plugin::IdentityPlugin as LoggingPlugin;\n/// # use aws_smithy_http_server::plugin::IdentityPlugin as MetricsPlugin;\n/// # use aws_smithy_http_server::plugin::IdentityPlugin as AuthPlugin;\n///\n/// pub fn get_bundled_http_plugins() -> HttpPlugins<PluginStack<MetricsPlugin, PluginStack<LoggingPlugin, IdentityPlugin>>> {\n///     HttpPlugins::new().push(LoggingPlugin).push(MetricsPlugin)\n/// }\n///\n/// let http_plugins = HttpPlugins::new()\n///     .push(AuthPlugin)\n///     .push(get_bundled_http_plugins());\n/// ```\n///\n/// ## Providing custom methods on `HttpPlugins`\n///\n/// You use an **extension trait** to add custom methods on `HttpPlugins`.\n///\n/// This is a simple example using `AuthPlugin`:\n///\n/// ```rust\n/// use aws_smithy_http_server::plugin::{HttpPlugins, PluginStack};\n/// # use aws_smithy_http_server::plugin::IdentityPlugin as LoggingPlugin;\n/// # use aws_smithy_http_server::plugin::IdentityPlugin as AuthPlugin;\n///\n/// pub trait AuthPluginExt<CurrentPlugins> {\n///     fn with_auth(self) -> HttpPlugins<PluginStack<AuthPlugin, CurrentPlugins>>;\n/// }\n///\n/// impl<CurrentPlugins> AuthPluginExt<CurrentPlugins> for HttpPlugins<CurrentPlugins> {\n///     fn with_auth(self) -> HttpPlugins<PluginStack<AuthPlugin, CurrentPlugins>> {\n///         self.push(AuthPlugin)\n///     }\n/// }\n///\n/// let http_plugins = HttpPlugins::new()\n///     .push(LoggingPlugin)\n///     // Our custom method!\n///     .with_auth();\n/// ```\n#[derive(Debug)]\npub struct HttpPlugins<P>(pub(crate) P);\n\nimpl Default for HttpPlugins<IdentityPlugin> {\n    fn default() -> Self {\n        Self(IdentityPlugin)\n    }\n}\n\nimpl HttpPlugins<IdentityPlugin> {\n    /// Create an empty [`HttpPlugins`].\n    ///\n    /// You can use [`HttpPlugins::push`] to add plugins to it.\n    pub fn new() -> Self {\n        Self::default()\n    }\n}\n\nimpl<P> HttpPlugins<P> {\n    /// Apply a new HTTP plugin after the ones that have already been registered.\n    ///\n    /// ```rust\n    /// use aws_smithy_http_server::plugin::HttpPlugins;\n    /// # use aws_smithy_http_server::plugin::IdentityPlugin as LoggingPlugin;\n    /// # use aws_smithy_http_server::plugin::IdentityPlugin as MetricsPlugin;\n    ///\n    /// let http_plugins = HttpPlugins::new().push(LoggingPlugin).push(MetricsPlugin);\n    /// ```\n    ///\n    /// The plugins' runtime logic is executed in registration order.\n    /// In our example above, `LoggingPlugin` would run first, while `MetricsPlugin` is executed last.\n    ///\n    /// ## Implementation notes\n    ///\n    /// Plugins are applied to the underlying [`Service`](tower::Service) in opposite order compared\n    /// to their registration order.\n    ///\n    /// As an example:\n    ///\n    /// ```rust,compile_fail\n    /// #[derive(Debug)]\n    /// pub struct PrintPlugin;\n    ///\n    /// impl<Ser, Op, S> Plugin<Ser, Op, T> for PrintPlugin\n    /// // [...]\n    /// {\n    ///     // [...]\n    ///     fn apply(&self, inner: T) -> Self::Service {\n    ///         PrintService {\n    ///             inner,\n    ///             service_id: Ser::ID,\n    ///             operation_id: Op::ID\n    ///         }\n    ///     }\n    /// }\n    /// ```\n    // We eagerly require `NewPlugin: HttpMarker`, despite not really needing it, because compiler\n    // errors get _substantially_ better if the user makes a mistake.\n    pub fn push<NewPlugin: HttpMarker>(self, new_plugin: NewPlugin) -> HttpPlugins<PluginStack<NewPlugin, P>> {\n        HttpPlugins(PluginStack::new(new_plugin, self.0))\n    }\n\n    /// Applies a single [`tower::Layer`] to all operations _before_ they are deserialized.\n    pub fn layer<L>(self, layer: L) -> HttpPlugins<PluginStack<LayerPlugin<L>, P>> {\n        HttpPlugins(PluginStack::new(LayerPlugin(layer), self.0))\n    }\n}\n\nimpl<Ser, Op, T, InnerPlugin> Plugin<Ser, Op, T> for HttpPlugins<InnerPlugin>\nwhere\n    InnerPlugin: Plugin<Ser, Op, T>,\n{\n    type Output = InnerPlugin::Output;\n\n    fn apply(&self, input: T) -> Self::Output {\n        self.0.apply(input)\n    }\n}\n\nimpl<InnerPlugin> HttpMarker for HttpPlugins<InnerPlugin> where InnerPlugin: HttpMarker {}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/src/plugin/identity.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse super::{HttpMarker, ModelMarker, Plugin};\n\n/// A [`Plugin`] that maps a service to itself.\n#[derive(Debug)]\npub struct IdentityPlugin;\n\nimpl<Ser, Op, S> Plugin<Ser, Op, S> for IdentityPlugin {\n    type Output = S;\n\n    fn apply(&self, svc: S) -> S {\n        svc\n    }\n}\n\nimpl ModelMarker for IdentityPlugin {}\nimpl HttpMarker for IdentityPlugin {}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/src/plugin/layer.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::marker::PhantomData;\n\nuse tower::Layer;\n\nuse super::{HttpMarker, ModelMarker, Plugin};\n\n/// A [`Plugin`] which acts as a [`Layer`] `L`.\npub struct LayerPlugin<L>(pub L);\n\nimpl<Ser, Op, S, L> Plugin<Ser, Op, S> for LayerPlugin<L>\nwhere\n    L: Layer<S>,\n{\n    type Output = L::Service;\n\n    fn apply(&self, svc: S) -> Self::Output {\n        self.0.layer(svc)\n    }\n}\n\n// Without more information about what the layer `L` does, we can't know whether it's appropriate\n// to run this plugin as a HTTP plugin or a model plugin, so we implement both marker traits.\n\nimpl<L> HttpMarker for LayerPlugin<L> {}\nimpl<L> ModelMarker for LayerPlugin<L> {}\n\n/// A [`Layer`] which acts as a [`Plugin`] `Pl` for specific protocol `P` and operation `Op`.\npub struct PluginLayer<Ser, Op, Pl> {\n    plugin: Pl,\n    _ser: PhantomData<Ser>,\n    _op: PhantomData<Op>,\n}\n\nimpl<S, Ser, Op, Pl> Layer<S> for PluginLayer<Ser, Op, Pl>\nwhere\n    Pl: Plugin<Ser, Op, S>,\n{\n    type Service = Pl::Output;\n\n    fn layer(&self, inner: S) -> Self::Service {\n        self.plugin.apply(inner)\n    }\n}\n\nimpl<Pl> PluginLayer<(), (), Pl> {\n    pub fn new<Ser, Op>(plugin: Pl) -> PluginLayer<Ser, Op, Pl> {\n        PluginLayer {\n            plugin,\n            _ser: PhantomData,\n            _op: PhantomData,\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/src/plugin/mod.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! The plugin system allows you to build middleware with an awareness of the operation it is applied to.\n//!\n//! The system centers around the [`Plugin`], [`HttpMarker`], and [`ModelMarker`] traits. In\n//! addition, this module provides helpers for composing and combining [`Plugin`]s.\n//!\n//! # HTTP plugins vs model plugins\n//!\n//! Plugins come in two flavors: _HTTP_ plugins and _model_ plugins. The key difference between\n//! them is _when_ they run:\n//!\n//! - A HTTP plugin acts on the HTTP request before it is deserialized, and acts on the HTTP response\n//!   after it is serialized.\n//! - A model plugin acts on the modeled operation input after it is deserialized, and acts on the\n//!   modeled operation output or the modeled operation error before it is serialized.\n//!\n//! See the relevant section in [the book], which contains an illustrative diagram.\n//!\n//! Both kinds of plugins implement the [`Plugin`] trait, but only HTTP plugins implement the\n//! [`HttpMarker`] trait and only model plugins implement the [`ModelMarker`] trait. There is no\n//! difference in how an HTTP plugin or a model plugin is applied, so both the [`HttpMarker`] trait\n//! and the [`ModelMarker`] trait are _marker traits_, they carry no behavior. Their only purpose\n//! is to mark a plugin, at the type system leve, as allowed to run at a certain time. A plugin can be\n//! _both_ a HTTP plugin and a model plugin by implementing both traits; in this case, when the\n//! plugin runs is decided by you when you register it in your application. [`IdentityPlugin`],\n//! [`Scoped`], and [`LayerPlugin`] are examples of plugins that implement both traits.\n//!\n//! In practice, most plugins are HTTP plugins. Since HTTP plugins run before a request has been\n//! correctly deserialized, HTTP plugins should be fast and lightweight. Only use model plugins if\n//! you absolutely require your middleware to run after deserialization, or to act on particular\n//! fields of your deserialized operation's input/output/errors.\n//!\n//! [the book]: https://smithy-lang.github.io/smithy-rs/design/server/anatomy.html\n//!\n//! # Filtered application of a HTTP [`Layer`](tower::Layer)\n//!\n//! ```\n//! # use aws_smithy_http_server::plugin::*;\n//! # use aws_smithy_http_server::scope;\n//! # use aws_smithy_http_server::shape_id::ShapeId;\n//! # let layer = ();\n//! # #[derive(PartialEq)]\n//! # enum Operation { GetPokemonSpecies }\n//! # struct GetPokemonSpecies;\n//! # impl GetPokemonSpecies { const ID: ShapeId = ShapeId::new(\"namespace#name\", \"namespace\", \"name\"); };\n//! // Create a `Plugin` from a HTTP `Layer`\n//! let plugin = LayerPlugin(layer);\n//!\n//! scope! {\n//!     struct OnlyGetPokemonSpecies {\n//!         includes: [GetPokemonSpecies],\n//!         excludes: [/* The rest of the operations go here */]\n//!     }\n//! }\n//!\n//! // Only apply the layer to operations with name \"GetPokemonSpecies\".\n//! let filtered_plugin = Scoped::new::<OnlyGetPokemonSpecies>(&plugin);\n//!\n//! // The same effect can be achieved at runtime.\n//! let filtered_plugin = filter_by_operation(&plugin, |operation: Operation| operation == Operation::GetPokemonSpecies);\n//! ```\n//!\n//! # Construct a [`Plugin`] from a closure that takes as input the operation name\n//!\n//! ```rust\n//! # use aws_smithy_http_server::{service::*, operation::OperationShape, plugin::Plugin, shape_id::ShapeId};\n//! # pub enum Operation { CheckHealth, GetPokemonSpecies }\n//! # impl Operation { fn shape_id(&self) -> ShapeId { ShapeId::new(\"\", \"\", \"\") }}\n//! # pub struct CheckHealth;\n//! # pub struct GetPokemonSpecies;\n//! # pub struct PokemonService;\n//! # impl ServiceShape for PokemonService {\n//! #   const ID: ShapeId = ShapeId::new(\"\", \"\", \"\");\n//! #   const VERSION: Option<&'static str> = None;\n//! #   type Protocol = ();\n//! #   type Operations = Operation;\n//! # }\n//! # impl OperationShape for CheckHealth { const ID: ShapeId = ShapeId::new(\"\", \"\", \"\"); type Input = (); type Output = (); type Error = (); }\n//! # impl OperationShape for GetPokemonSpecies { const ID: ShapeId = ShapeId::new(\"\", \"\", \"\"); type Input = (); type Output = (); type Error = (); }\n//! # impl ContainsOperation<CheckHealth> for PokemonService { const VALUE: Operation = Operation::CheckHealth; }\n//! # impl ContainsOperation<GetPokemonSpecies> for PokemonService { const VALUE: Operation = Operation::GetPokemonSpecies; }\n//! use aws_smithy_http_server::plugin::plugin_from_operation_fn;\n//! use tower::layer::layer_fn;\n//!\n//! struct FooService<S> {\n//!     info: String,\n//!     inner: S\n//! }\n//!\n//! fn map<S>(op: Operation, inner: S) -> FooService<S> {\n//!     match op {\n//!         Operation::CheckHealth => FooService { info: op.shape_id().name().to_string(), inner },\n//!         Operation::GetPokemonSpecies => FooService { info: \"bar\".to_string(), inner },\n//!         _ => todo!()\n//!     }\n//! }\n//!\n//! // This plugin applies the `FooService` middleware around every operation.\n//! let plugin = plugin_from_operation_fn(map);\n//! # let _ = Plugin::<PokemonService, CheckHealth, ()>::apply(&plugin, ());\n//! # let _ = Plugin::<PokemonService, GetPokemonSpecies, ()>::apply(&plugin, ());\n//! ```\n//!\n//! # Combine [`Plugin`]s\n//!\n//! ```no_run\n//! # use aws_smithy_http_server::plugin::*;\n//! # struct Foo;\n//! # impl HttpMarker for Foo { }\n//! # let a = Foo; let b = Foo;\n//! // Combine `Plugin`s `a` and `b`. Both need to implement `HttpMarker`.\n//! let plugin = HttpPlugins::new()\n//!     .push(a)\n//!     .push(b);\n//! ```\n//!\n//! As noted in the [`HttpPlugins`] documentation, the plugins' runtime logic is executed in registration order,\n//! meaning that `a` is run _before_ `b` in the example above.\n//!\n//! Similarly, you can use [`ModelPlugins`] to combine model plugins.\n//!\n//! # Example implementation of a [`Plugin`]\n//!\n//! The following is an example implementation of a [`Plugin`] that prints out the service's name\n//! and the name of the operation that was hit every time it runs. Since it doesn't act on the HTTP\n//! request nor the modeled operation input/output/errors, this plugin can be both an HTTP plugin\n//! and a model plugin. In practice, however, you'd only want to register it once, as either an\n//! HTTP plugin or a model plugin.\n//!\n//! ```no_run\n//! use aws_smithy_http_server::{\n//!     operation::OperationShape,\n//!     service::ServiceShape,\n//!     plugin::{Plugin, HttpMarker, HttpPlugins, ModelMarker},\n//!     shape_id::ShapeId,\n//! };\n//! # use tower::{layer::util::Stack, Layer, Service};\n//! # use std::task::{Context, Poll};\n//!\n//! /// A [`Service`] that adds a print log.\n//! #[derive(Clone, Debug)]\n//! pub struct PrintService<S> {\n//!     inner: S,\n//!     service_id: ShapeId,\n//!     operation_id: ShapeId\n//! }\n//!\n//! impl<R, S> Service<R> for PrintService<S>\n//! where\n//!     S: Service<R>,\n//! {\n//!     type Response = S::Response;\n//!     type Error = S::Error;\n//!     type Future = S::Future;\n//!\n//!     fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {\n//!         self.inner.poll_ready(cx)\n//!     }\n//!\n//!     fn call(&mut self, req: R) -> Self::Future {\n//!         println!(\"Hi {} in {}\", self.operation_id.absolute(), self.service_id.absolute());\n//!         self.inner.call(req)\n//!     }\n//! }\n//!\n//! /// A [`Plugin`] for a service builder to add a [`PrintLayer`] over operations.\n//! #[derive(Debug)]\n//! pub struct PrintPlugin;\n//!\n//! impl<Ser, Op, T> Plugin<Ser, Op, T> for PrintPlugin\n//! where\n//!     Ser: ServiceShape,\n//!     Op: OperationShape,\n//! {\n//!     type Output = PrintService<T>;\n//!\n//!     fn apply(&self, inner: T) -> Self::Output {\n//!         PrintService {\n//!             inner,\n//!             service_id: Op::ID,\n//!             operation_id: Ser::ID,\n//!         }\n//!     }\n//! }\n//!\n//! // This plugin could be registered as an HTTP plugin and a model plugin, so we implement both\n//! // marker traits.\n//!\n//! impl HttpMarker for PrintPlugin { }\n//! impl ModelMarker for PrintPlugin { }\n//! ```\n\nmod closure;\npub(crate) mod either;\nmod filter;\nmod http_plugins;\nmod identity;\nmod layer;\nmod model_plugins;\n#[doc(hidden)]\npub mod scoped;\nmod stack;\n\npub use closure::{plugin_from_operation_fn, OperationFn};\npub use either::Either;\npub use filter::{filter_by_operation, FilterByOperation};\npub use http_plugins::HttpPlugins;\npub use identity::IdentityPlugin;\npub use layer::{LayerPlugin, PluginLayer};\npub use model_plugins::ModelPlugins;\npub use scoped::Scoped;\npub use stack::PluginStack;\n\n/// A mapping from one [`Service`](tower::Service) to another. This should be viewed as a\n/// [`Layer`](tower::Layer) parameterized by the protocol and operation.\n///\n/// The generics `Ser` and `Op` allow the behavior to be parameterized by the [Smithy service] and\n/// [operation] it's applied to.\n///\n/// See [module](crate::plugin) documentation for more information.\n///\n/// [Smithy service]: https://smithy.io/2.0/spec/service-types.html#service\n/// [operation]: https://smithy.io/2.0/spec/service-types.html#operation\npub trait Plugin<Ser, Op, T> {\n    /// The type of the new [`Service`](tower::Service).\n    type Output;\n\n    /// Maps a [`Service`](tower::Service) to another.\n    fn apply(&self, input: T) -> Self::Output;\n}\n\nimpl<Ser, Op, T, Pl> Plugin<Ser, Op, T> for &Pl\nwhere\n    Pl: Plugin<Ser, Op, T>,\n{\n    type Output = Pl::Output;\n\n    fn apply(&self, inner: T) -> Self::Output {\n        <Pl as Plugin<Ser, Op, T>>::apply(self, inner)\n    }\n}\n\n/// A HTTP plugin is a plugin that acts on the HTTP request before it is deserialized, and acts on\n/// the HTTP response after it is serialized.\n///\n/// This trait is a _marker_ trait to indicate that a plugin can be registered as an HTTP plugin.\n///\n/// Compare with [`ModelMarker`] in the [module](crate::plugin) documentation, which contains an\n/// example implementation too.\npub trait HttpMarker {}\nimpl<Pl> HttpMarker for &Pl where Pl: HttpMarker {}\n\n/// A model plugin is a plugin that acts on the modeled operation input after it is deserialized,\n/// and acts on the modeled operation output or the modeled operation error before it is\n/// serialized.\n///\n/// This trait is a _marker_ trait to indicate that a plugin can be registered as a model plugin.\n///\n/// Compare with [`HttpMarker`] in the [module](crate::plugin) documentation.\n///\n/// # Example implementation of a model plugin\n///\n/// Model plugins are most useful when you really need to rely on the actual shape of your modeled\n/// operation input, operation output, and/or operation errors. For this reason, most (but not all)\n/// model plugins are _operation-specific_: somewhere in the type signature of their definition,\n/// they'll rely on a particular operation shape's types. It is therefore important that you scope\n/// application of model plugins to the operations they are meant to work on, via\n/// [`Scoped`] or [`filter_by_operation`].\n///\n/// Below is an example implementation of a model plugin that can only be applied to the\n/// `CheckHealth` operation: note how in the `Service` trait implementation, we require access to\n/// the operation's input, where we log the `health_info` field.\n///\n/// ```no_run\n/// use std::marker::PhantomData;\n///\n/// use aws_smithy_http_server::{operation::OperationShape, plugin::{ModelMarker, Plugin}};\n/// use tower::Service;\n/// # pub struct SimpleService;\n/// # pub struct CheckHealth;\n/// # pub struct CheckHealthInput {\n/// #     health_info: (),\n/// # }\n/// # pub struct CheckHealthOutput;\n/// # impl aws_smithy_http_server::operation::OperationShape for CheckHealth {\n/// #     const ID: aws_smithy_http_server::shape_id::ShapeId = aws_smithy_http_server::shape_id::ShapeId::new(\n/// #         \"com.amazonaws.simple#CheckHealth\",\n/// #         \"com.amazonaws.simple\",\n/// #         \"CheckHealth\",\n/// #     );\n/// #     type Input = CheckHealthInput;\n/// #     type Output = CheckHealthOutput;\n/// #     type Error = std::convert::Infallible;\n/// # }\n///\n/// /// A model plugin that can only be applied to the `CheckHealth` operation.\n/// pub struct CheckHealthPlugin<Exts> {\n///     pub _exts: PhantomData<Exts>,\n/// }\n///\n/// impl<Exts> CheckHealthPlugin<Exts> {\n///     pub fn new() -> Self {\n///         Self { _exts: PhantomData }\n///     }\n/// }\n///\n/// impl<T, Exts> Plugin<SimpleService, CheckHealth, T> for CheckHealthPlugin<Exts> {\n///     type Output = CheckHealthService<T, Exts>;\n///\n///     fn apply(&self, input: T) -> Self::Output {\n///         CheckHealthService {\n///             inner: input,\n///             _exts: PhantomData,\n///         }\n///     }\n/// }\n///\n/// impl<Exts> ModelMarker for CheckHealthPlugin<Exts> { }\n///\n/// #[derive(Clone)]\n/// pub struct CheckHealthService<S, Exts> {\n///     inner: S,\n///     _exts: PhantomData<Exts>,\n/// }\n///\n/// impl<S, Exts> Service<(<CheckHealth as OperationShape>::Input, Exts)> for CheckHealthService<S, Exts>\n/// where\n///     S: Service<(<CheckHealth as OperationShape>::Input, Exts)>,\n/// {\n///     type Response = S::Response;\n///     type Error = S::Error;\n///     type Future = S::Future;\n///\n///     fn poll_ready(&mut self, cx: &mut std::task::Context<'_>) -> std::task::Poll<Result<(), Self::Error>> {\n///         self.inner.poll_ready(cx)\n///     }\n///\n///     fn call(&mut self, req: (<CheckHealth as OperationShape>::Input, Exts)) -> Self::Future {\n///         let (input, _exts) = &req;\n///\n///         // We have access to `CheckHealth`'s modeled operation input!\n///         dbg!(&input.health_info);\n///\n///         self.inner.call(req)\n///     }\n/// }\n///\n/// // In `main.rs` or wherever we register plugins, we have to make sure we only apply this plugin\n/// // to the the only operation it can be applied to, the `CheckHealth` operation. If we apply the\n/// // plugin to other operations, we will get a compilation error.\n///\n/// use aws_smithy_http_server::plugin::Scoped;\n/// use aws_smithy_http_server::scope;\n///\n/// pub fn main() {\n///     scope! {\n///         struct OnlyCheckHealth {\n///             includes: [CheckHealth],\n///             excludes: [/* The rest of the operations go here */]\n///         }\n///     }\n///\n///     let model_plugin = CheckHealthPlugin::new();\n///     # _foo(&model_plugin);\n///\n///     // Scope the plugin to the `CheckHealth` operation.\n///     let scoped_plugin = Scoped::new::<OnlyCheckHealth>(model_plugin);\n///     # fn _foo(model_plugin: &CheckHealthPlugin<()>) {}\n/// }\n/// ```\n///\n/// If you are a service owner and don't care about giving a name to the model plugin, you can\n/// simplify this down to:\n///\n/// ```no_run\n/// use std::marker::PhantomData;\n///\n/// use aws_smithy_http_server::operation::OperationShape;\n/// use tower::Service;\n/// # pub struct SimpleService;\n/// # pub struct CheckHealth;\n/// # pub struct CheckHealthInput {\n/// #     health_info: (),\n/// # }\n/// # pub struct CheckHealthOutput;\n/// # impl aws_smithy_http_server::operation::OperationShape for CheckHealth {\n/// #     const ID: aws_smithy_http_server::shape_id::ShapeId = aws_smithy_http_server::shape_id::ShapeId::new(\n/// #         \"com.amazonaws.simple#CheckHealth\",\n/// #         \"com.amazonaws.simple\",\n/// #         \"CheckHealth\",\n/// #     );\n/// #     type Input = CheckHealthInput;\n/// #     type Output = CheckHealthOutput;\n/// #     type Error = std::convert::Infallible;\n/// # }\n///\n/// #[derive(Clone)]\n/// pub struct CheckHealthService<S, Exts> {\n///     inner: S,\n///     _exts: PhantomData<Exts>,\n/// }\n///\n/// impl<S, Exts> Service<(<CheckHealth as OperationShape>::Input, Exts)> for CheckHealthService<S, Exts>\n/// where\n///     S: Service<(<CheckHealth as OperationShape>::Input, Exts)>,\n/// {\n///     type Response = S::Response;\n///     type Error = S::Error;\n///     type Future = S::Future;\n///\n///     fn poll_ready(&mut self, cx: &mut std::task::Context<'_>) -> std::task::Poll<Result<(), Self::Error>> {\n///         self.inner.poll_ready(cx)\n///     }\n///\n///     fn call(&mut self, req: (<CheckHealth as OperationShape>::Input, Exts)) -> Self::Future {\n///         let (input, _exts) = &req;\n///\n///         // We have access to `CheckHealth`'s modeled operation input!\n///         dbg!(&input.health_info);\n///\n///         self.inner.call(req)\n///     }\n/// }\n///\n/// // In `main.rs`:\n///\n/// use aws_smithy_http_server::plugin::LayerPlugin;\n/// use aws_smithy_http_server::plugin::Scoped;\n/// use aws_smithy_http_server::scope;\n///\n/// fn new_check_health_service<S, Ext>(inner: S) -> CheckHealthService<S, Ext> {\n///     CheckHealthService {\n///         inner,\n///         _exts: PhantomData,\n///     }\n/// }\n///\n/// pub fn main() {\n///     scope! {\n///         struct OnlyCheckHealth {\n///             includes: [CheckHealth],\n///             excludes: [/* The rest of the operations go here */]\n///         }\n///     }\n///\n///     # fn new_check_health_service(inner: ()) -> CheckHealthService<(), ()> {\n///     #     CheckHealthService {\n///     #         inner,\n///     #         _exts: PhantomData,\n///     #     }\n///     # }\n///     let layer = tower::layer::layer_fn(new_check_health_service);\n///     let model_plugin = LayerPlugin(layer);\n///\n///     // Scope the plugin to the `CheckHealth` operation.\n///     let scoped_plugin = Scoped::new::<OnlyCheckHealth>(model_plugin);\n/// }\n/// ```\npub trait ModelMarker {}\nimpl<Pl> ModelMarker for &Pl where Pl: ModelMarker {}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/src/plugin/model_plugins.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n// If you make any updates to this file (including Rust docs), make sure you make them to\n// `http_plugins.rs` too!\n\nuse crate::plugin::{IdentityPlugin, Plugin, PluginStack};\n\nuse super::{LayerPlugin, ModelMarker};\n\n/// A wrapper struct for composing model plugins.\n/// It operates identically to [`HttpPlugins`](crate::plugin::HttpPlugins); see its documentation.\n#[derive(Debug)]\npub struct ModelPlugins<P>(pub(crate) P);\n\nimpl Default for ModelPlugins<IdentityPlugin> {\n    fn default() -> Self {\n        Self(IdentityPlugin)\n    }\n}\n\nimpl ModelPlugins<IdentityPlugin> {\n    /// Create an empty [`ModelPlugins`].\n    ///\n    /// You can use [`ModelPlugins::push`] to add plugins to it.\n    pub fn new() -> Self {\n        Self::default()\n    }\n}\n\nimpl<P> ModelPlugins<P> {\n    /// Apply a new model plugin after the ones that have already been registered.\n    ///\n    /// ```rust\n    /// use aws_smithy_http_server::plugin::ModelPlugins;\n    /// # use aws_smithy_http_server::plugin::IdentityPlugin as LoggingPlugin;\n    /// # use aws_smithy_http_server::plugin::IdentityPlugin as MetricsPlugin;\n    ///\n    /// let model_plugins = ModelPlugins::new().push(LoggingPlugin).push(MetricsPlugin);\n    /// ```\n    ///\n    /// The plugins' runtime logic is executed in registration order.\n    /// In our example above, `LoggingPlugin` would run first, while `MetricsPlugin` is executed last.\n    ///\n    /// ## Implementation notes\n    ///\n    /// Plugins are applied to the underlying [`Service`](tower::Service) in opposite order compared\n    /// to their registration order.\n    ///\n    /// As an example:\n    ///\n    /// ```rust,compile_fail\n    /// #[derive(Debug)]\n    /// pub struct PrintPlugin;\n    ///\n    /// impl<Ser, Op, S> Plugin<Ser, Op, T> for PrintPlugin\n    /// // [...]\n    /// {\n    ///     // [...]\n    ///     fn apply(&self, inner: T) -> Self::Service {\n    ///         PrintService {\n    ///             inner,\n    ///             service_id: Ser::ID,\n    ///             operation_id: Op::ID\n    ///         }\n    ///     }\n    /// }\n    /// ```\n    // We eagerly require `NewPlugin: ModelMarker`, despite not really needing it, because compiler\n    // errors get _substantially_ better if the user makes a mistake.\n    pub fn push<NewPlugin: ModelMarker>(self, new_plugin: NewPlugin) -> ModelPlugins<PluginStack<NewPlugin, P>> {\n        ModelPlugins(PluginStack::new(new_plugin, self.0))\n    }\n\n    /// Applies a single [`tower::Layer`] to all operations _before_ they are deserialized.\n    pub fn layer<L>(self, layer: L) -> ModelPlugins<PluginStack<LayerPlugin<L>, P>> {\n        ModelPlugins(PluginStack::new(LayerPlugin(layer), self.0))\n    }\n}\n\nimpl<Ser, Op, T, InnerPlugin> Plugin<Ser, Op, T> for ModelPlugins<InnerPlugin>\nwhere\n    InnerPlugin: Plugin<Ser, Op, T>,\n{\n    type Output = InnerPlugin::Output;\n\n    fn apply(&self, input: T) -> Self::Output {\n        self.0.apply(input)\n    }\n}\n\nimpl<InnerPlugin> ModelMarker for ModelPlugins<InnerPlugin> where InnerPlugin: ModelMarker {}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/src/plugin/scoped.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::marker::PhantomData;\n\nuse super::{HttpMarker, ModelMarker, Plugin};\n\n/// Marker struct for `true`.\n///\n/// Implements [`ConditionalApply`] which applies the [`Plugin`].\npub struct True;\n\n/// Marker struct for `false`.\n///\n/// Implements [`ConditionalApply`] which does nothing.\npub struct False;\n\n/// Conditionally applies a [`Plugin`] `Pl` to some service `S`.\n///\n/// See [`True`] and [`False`].\npub trait ConditionalApply<Ser, Op, Pl, T> {\n    type Service;\n\n    fn apply(plugin: &Pl, svc: T) -> Self::Service;\n}\n\nimpl<Ser, Op, Pl, T> ConditionalApply<Ser, Op, Pl, T> for True\nwhere\n    Pl: Plugin<Ser, Op, T>,\n{\n    type Service = Pl::Output;\n\n    fn apply(plugin: &Pl, input: T) -> Self::Service {\n        plugin.apply(input)\n    }\n}\n\nimpl<P, Op, Pl, T> ConditionalApply<P, Op, Pl, T> for False {\n    type Service = T;\n\n    fn apply(_plugin: &Pl, input: T) -> Self::Service {\n        input\n    }\n}\n\n/// A [`Plugin`] which scopes the application of an inner [`Plugin`].\n///\n/// In cases where operation selection must be performed at runtime [`filter_by_operation`](crate::plugin::filter_by_operation)\n/// can be used.\n///\n/// Operations within the scope will have the inner [`Plugin`] applied.\n///\n/// # Example\n///\n/// ```rust\n/// # use aws_smithy_http_server::{scope, plugin::Scoped};\n/// # struct OperationA; struct OperationB; struct OperationC;\n/// # let plugin = ();\n///\n/// // Define a scope over a service with 3 operations\n/// scope! {\n///     struct OnlyAB {\n///         includes: [OperationA, OperationB],\n///         excludes: [OperationC]\n///     }\n/// }\n///\n/// // Create a scoped plugin\n/// let scoped_plugin = Scoped::new::<OnlyAB>(plugin);\n/// ```\npub struct Scoped<Scope, Pl> {\n    scope: PhantomData<Scope>,\n    plugin: Pl,\n}\n\nimpl<Pl> Scoped<(), Pl> {\n    /// Creates a new [`Scoped`] from a `Scope` and [`Plugin`].\n    pub fn new<Scope>(plugin: Pl) -> Scoped<Scope, Pl> {\n        Scoped {\n            scope: PhantomData,\n            plugin,\n        }\n    }\n}\n\n/// A trait marking which operations are in scope via the associated type [`Membership::Contains`].\npub trait Membership<Op> {\n    type Contains;\n}\n\nimpl<Ser, Op, T, Scope, Pl> Plugin<Ser, Op, T> for Scoped<Scope, Pl>\nwhere\n    Scope: Membership<Op>,\n    Scope::Contains: ConditionalApply<Ser, Op, Pl, T>,\n{\n    type Output = <Scope::Contains as ConditionalApply<Ser, Op, Pl, T>>::Service;\n\n    fn apply(&self, input: T) -> Self::Output {\n        <Scope::Contains as ConditionalApply<Ser, Op, Pl, T>>::apply(&self.plugin, input)\n    }\n}\n\nimpl<Scope, Pl> HttpMarker for Scoped<Scope, Pl> where Pl: HttpMarker {}\nimpl<Scope, Pl> ModelMarker for Scoped<Scope, Pl> where Pl: ModelMarker {}\n\n/// A macro to help with scoping [plugins](crate::plugin) to a subset of all operations.\n///\n/// The scope must partition _all_ operations, that is, each and every operation must be included or excluded, but not\n/// both.\n///\n/// The generated server SDK exports a similar `scope` macro which is aware of a service's operations and can complete\n/// underspecified scopes automatically.\n///\n/// # Example\n///\n/// For a service with three operations: `OperationA`, `OperationB`, `OperationC`.\n///\n/// ```rust\n/// # use aws_smithy_http_server::scope;\n/// # struct OperationA; struct OperationB; struct OperationC;\n/// scope! {\n///     struct OnlyAB {\n///         includes: [OperationA, OperationB],\n///         excludes: [OperationC]\n///     }\n/// }\n/// ```\n#[macro_export]\nmacro_rules! scope {\n    (\n        $(#[$attrs:meta])*\n        $vis:vis struct $name:ident {\n            includes: [$($include:ty),*],\n            excludes: [$($exclude:ty),*]\n        }\n    ) => {\n        $(#[$attrs])*\n        $vis struct $name;\n\n        $(\n            impl $crate::plugin::scoped::Membership<$include> for $name {\n                type Contains = $crate::plugin::scoped::True;\n            }\n        )*\n        $(\n            impl $crate::plugin::scoped::Membership<$exclude> for $name {\n                type Contains = $crate::plugin::scoped::False;\n            }\n        )*\n    };\n}\n\n#[cfg(test)]\nmod tests {\n    use crate::plugin::Plugin;\n\n    use super::Scoped;\n\n    struct OperationA;\n    struct OperationB;\n\n    scope! {\n        /// Includes A, not B.\n        pub struct AuthScope {\n            includes: [OperationA],\n            excludes: [OperationB]\n        }\n    }\n\n    struct MockPlugin;\n\n    impl<P, Op> Plugin<P, Op, u32> for MockPlugin {\n        type Output = String;\n\n        fn apply(&self, svc: u32) -> Self::Output {\n            svc.to_string()\n        }\n    }\n\n    #[test]\n    fn scope() {\n        let plugin = MockPlugin;\n        let scoped_plugin = Scoped::new::<AuthScope>(plugin);\n\n        let out: String = Plugin::<(), OperationA, _>::apply(&scoped_plugin, 3_u32);\n        assert_eq!(out, \"3\".to_string());\n        let out: u32 = Plugin::<(), OperationB, _>::apply(&scoped_plugin, 3_u32);\n        assert_eq!(out, 3);\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/src/plugin/stack.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse super::{HttpMarker, ModelMarker, Plugin};\nuse std::fmt::Debug;\n\n/// A wrapper struct which composes an `Inner` and an `Outer` [`Plugin`].\n///\n/// The `Inner::map` is run _then_ the `Outer::map`.\n///\n/// Note that the primary tool for composing HTTP plugins is\n/// [`HttpPlugins`](crate::plugin::HttpPlugins), and the primary tool for composing HTTP plugins is\n/// [`ModelPlugins`](crate::plugin::ModelPlugins); if you are an application writer, you should\n/// prefer composing plugins using these.\n#[derive(Debug)]\npub struct PluginStack<Inner, Outer> {\n    inner: Inner,\n    outer: Outer,\n}\n\nimpl<Inner, Outer> PluginStack<Inner, Outer> {\n    /// Creates a new [`PluginStack`].\n    pub fn new(inner: Inner, outer: Outer) -> Self {\n        PluginStack { inner, outer }\n    }\n}\n\nimpl<Ser, Op, T, Inner, Outer> Plugin<Ser, Op, T> for PluginStack<Inner, Outer>\nwhere\n    Inner: Plugin<Ser, Op, T>,\n    Outer: Plugin<Ser, Op, Inner::Output>,\n{\n    type Output = Outer::Output;\n\n    fn apply(&self, input: T) -> Self::Output {\n        let svc = self.inner.apply(input);\n        self.outer.apply(svc)\n    }\n}\n\nimpl<Inner, Outer> HttpMarker for PluginStack<Inner, Outer>\nwhere\n    Inner: HttpMarker,\n    Outer: HttpMarker,\n{\n}\n\nimpl<Inner, Outer> ModelMarker for PluginStack<Inner, Outer>\nwhere\n    Inner: ModelMarker,\n    Outer: ModelMarker,\n{\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/src/protocol/aws_json/mod.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npub mod rejection;\npub mod router;\npub mod runtime_error;\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/src/protocol/aws_json/rejection.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::rejection::MissingContentTypeReason;\nuse aws_smithy_runtime_api::http::HttpError;\nuse thiserror::Error;\n\n#[derive(Debug, Error)]\npub enum ResponseRejection {\n    #[error(\"error building HTTP response: {0}\")]\n    Build(#[from] aws_smithy_types::error::operation::BuildError),\n    #[error(\"error serializing JSON-encoded body: {0}\")]\n    Serialization(#[from] aws_smithy_types::error::operation::SerializationError),\n    #[error(\"error building HTTP response: {0}\")]\n    HttpBuild(#[from] http::Error),\n}\n\n#[derive(Debug, Error)]\npub enum RequestRejection {\n    #[error(\"error converting non-streaming body to bytes: {0}\")]\n    BufferHttpBodyBytes(crate::Error),\n    #[error(\"request contains invalid value for `Accept` header\")]\n    NotAcceptable,\n    #[error(\"expected `Content-Type` header not found: {0}\")]\n    MissingContentType(#[from] MissingContentTypeReason),\n    #[error(\"error deserializing request HTTP body as JSON: {0}\")]\n    JsonDeserialize(#[from] aws_smithy_json::deserialize::error::DeserializeError),\n    #[error(\"request does not adhere to modeled constraints: {0}\")]\n    ConstraintViolation(String),\n\n    /// Typically happens when the request has headers that are not valid UTF-8.\n    #[error(\"failed to convert request: {0}\")]\n    HttpConversion(#[from] HttpError),\n}\n\nimpl From<std::convert::Infallible> for RequestRejection {\n    fn from(_err: std::convert::Infallible) -> Self {\n        match _err {}\n    }\n}\n\n// Conversion from crate::Error is needed for custom body types and testing scenarios.\n// When using BoxBody or custom body implementations, errors are crate::Error, not hyper::Error.\nimpl From<crate::Error> for RequestRejection {\n    fn from(err: crate::Error) -> Self {\n        Self::BufferHttpBodyBytes(err)\n    }\n}\n\n// Hyper's HTTP server provides requests with `hyper::body::Incoming`, which has error type\n// `hyper::Error`. During request deserialization (FromRequest), body operations can produce\n// this error, so we need this conversion to handle it within the framework.\nconvert_to_request_rejection!(hyper::Error, BufferHttpBodyBytes);\n\nconvert_to_request_rejection!(Box<dyn std::error::Error + Send + Sync + 'static>, BufferHttpBodyBytes);\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/src/protocol/aws_json/router.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::convert::Infallible;\n\nuse tower::Layer;\nuse tower::Service;\n\nuse crate::body::BoxBody;\nuse crate::routing::tiny_map::TinyMap;\nuse crate::routing::Route;\nuse crate::routing::Router;\n\nuse http::header::ToStrError;\nuse thiserror::Error;\n\n/// An AWS JSON routing error.\n#[derive(Debug, Error)]\npub enum Error {\n    /// Relative URI was not \"/\".\n    #[error(\"relative URI is not \\\"/\\\"\")]\n    NotRootUrl,\n    /// Method was not `POST`.\n    #[error(\"method not POST\")]\n    MethodNotAllowed,\n    /// Missing the `x-amz-target` header.\n    #[error(\"missing the \\\"x-amz-target\\\" header\")]\n    MissingHeader,\n    /// Unable to parse header into UTF-8.\n    #[error(\"failed to parse header: {0}\")]\n    InvalidHeader(ToStrError),\n    /// Operation not found.\n    #[error(\"operation not found\")]\n    NotFound,\n}\n\n// This constant determines when the `TinyMap` implementation switches from being a `Vec` to a\n// `HashMap`. This is chosen to be 15 as a result of the discussion around\n// https://github.com/smithy-lang/smithy-rs/pull/1429#issuecomment-1147516546\npub(crate) const ROUTE_CUTOFF: usize = 15;\n\n/// A [`Router`] supporting [AWS JSON 1.0] and [AWS JSON 1.1] protocols.\n///\n/// [AWS JSON 1.0]: https://smithy.io/2.0/aws/protocols/aws-json-1_0-protocol.html\n/// [AWS JSON 1.1]: https://smithy.io/2.0/aws/protocols/aws-json-1_1-protocol.html\n#[derive(Debug, Clone)]\npub struct AwsJsonRouter<S> {\n    routes: TinyMap<&'static str, S, ROUTE_CUTOFF>,\n}\n\nimpl<S> AwsJsonRouter<S> {\n    /// Applies a [`Layer`] uniformly to all routes.\n    pub fn layer<L>(self, layer: L) -> AwsJsonRouter<L::Service>\n    where\n        L: Layer<S>,\n    {\n        AwsJsonRouter {\n            routes: self\n                .routes\n                .into_iter()\n                .map(|(key, route)| (key, layer.layer(route)))\n                .collect(),\n        }\n    }\n\n    /// Applies type erasure to the inner route using [`Route::new`].\n    pub fn boxed<B>(self) -> AwsJsonRouter<Route<B>>\n    where\n        S: Service<http::Request<B>, Response = http::Response<BoxBody>, Error = Infallible>,\n        S: Send + Clone + 'static,\n        S::Future: Send + 'static,\n    {\n        AwsJsonRouter {\n            routes: self.routes.into_iter().map(|(key, s)| (key, Route::new(s))).collect(),\n        }\n    }\n}\n\nimpl<B, S> Router<B> for AwsJsonRouter<S>\nwhere\n    S: Clone,\n{\n    type Service = S;\n    type Error = Error;\n\n    fn match_route(&self, request: &http::Request<B>) -> Result<S, Self::Error> {\n        // The URI must be root,\n        if request.uri() != \"/\" {\n            return Err(Error::NotRootUrl);\n        }\n\n        // Only `Method::POST` is allowed.\n        if request.method() != http::Method::POST {\n            return Err(Error::MethodNotAllowed);\n        }\n\n        // Find the `x-amz-target` header.\n        let target = request.headers().get(\"x-amz-target\").ok_or(Error::MissingHeader)?;\n        let target = target.to_str().map_err(Error::InvalidHeader)?;\n\n        // Lookup in the `TinyMap` for a route for the target.\n        let route = self.routes.get(target).ok_or(Error::NotFound)?;\n        Ok(route.clone())\n    }\n}\n\nimpl<S> FromIterator<(&'static str, S)> for AwsJsonRouter<S> {\n    #[inline]\n    fn from_iter<T: IntoIterator<Item = (&'static str, S)>>(iter: T) -> Self {\n        Self {\n            routes: iter.into_iter().collect(),\n        }\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use crate::{protocol::test_helpers::req, routing::Router};\n\n    use http::{HeaderMap, HeaderValue, Method};\n    use pretty_assertions::assert_eq;\n\n    #[tokio::test]\n    async fn simple_routing() {\n        let routes = vec![(\"Service.Operation\")];\n        let router: AwsJsonRouter<_> = routes.clone().into_iter().map(|operation| (operation, ())).collect();\n\n        let mut headers = HeaderMap::new();\n        headers.insert(\"x-amz-target\", HeaderValue::from_static(\"Service.Operation\"));\n\n        // Valid request, should match.\n        router\n            .match_route(&req(&Method::POST, \"/\", Some(headers.clone())))\n            .unwrap();\n\n        // No headers, should return `MissingHeader`.\n        let res = router.match_route(&req(&Method::POST, \"/\", None));\n        assert_eq!(res.unwrap_err().to_string(), Error::MissingHeader.to_string());\n\n        // Wrong HTTP method, should return `MethodNotAllowed`.\n        let res = router.match_route(&req(&Method::GET, \"/\", Some(headers.clone())));\n        assert_eq!(res.unwrap_err().to_string(), Error::MethodNotAllowed.to_string());\n\n        // Wrong URI, should return `NotRootUrl`.\n        let res = router.match_route(&req(&Method::POST, \"/something\", Some(headers)));\n        assert_eq!(res.unwrap_err().to_string(), Error::NotRootUrl.to_string());\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/src/protocol/aws_json/runtime_error.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::protocol::aws_json_11::AwsJson1_1;\nuse crate::response::IntoResponse;\nuse crate::runtime_error::{InternalFailureException, INVALID_HTTP_RESPONSE_FOR_RUNTIME_ERROR_PANIC_MESSAGE};\nuse crate::{extension::RuntimeErrorExtension, protocol::aws_json_10::AwsJson1_0};\nuse http::StatusCode;\n\nuse super::rejection::{RequestRejection, ResponseRejection};\n\n#[derive(Debug, thiserror::Error)]\npub enum RuntimeError {\n    /// See: [`crate::protocol::rest_json_1::runtime_error::RuntimeError::Serialization`]\n    #[error(\"request failed to deserialize or response failed to serialize: {0}\")]\n    Serialization(crate::Error),\n    /// See: [`crate::protocol::rest_json_1::runtime_error::RuntimeError::InternalFailure`]\n    #[error(\"internal failure: {0}\")]\n    InternalFailure(crate::Error),\n    /// See: [`crate::protocol::rest_json_1::runtime_error::RuntimeError::NotAcceptable`]\n    #[error(\"not acceptable request: request contains an `Accept` header with a MIME type, and the server cannot return a response body adhering to that MIME type\")]\n    NotAcceptable,\n    /// See: [`crate::protocol::rest_json_1::runtime_error::RuntimeError::UnsupportedMediaType`]\n    #[error(\"unsupported media type: request does not contain the expected `Content-Type` header value\")]\n    UnsupportedMediaType,\n    /// See: [`crate::protocol::rest_json_1::runtime_error::RuntimeError::Validation`]\n    #[error(\"validation failure: operation input contains data that does not adhere to the modeled constraints: {0}\")]\n    Validation(String),\n}\n\nimpl RuntimeError {\n    pub fn name(&self) -> &'static str {\n        match self {\n            Self::Serialization(_) => \"SerializationException\",\n            Self::InternalFailure(_) => \"InternalFailureException\",\n            Self::NotAcceptable => \"NotAcceptableException\",\n            Self::UnsupportedMediaType => \"UnsupportedMediaTypeException\",\n            Self::Validation(_) => \"ValidationException\",\n        }\n    }\n\n    pub fn status_code(&self) -> StatusCode {\n        match self {\n            Self::Serialization(_) => StatusCode::BAD_REQUEST,\n            Self::InternalFailure(_) => StatusCode::INTERNAL_SERVER_ERROR,\n            Self::NotAcceptable => StatusCode::NOT_ACCEPTABLE,\n            Self::UnsupportedMediaType => StatusCode::UNSUPPORTED_MEDIA_TYPE,\n            Self::Validation(_) => StatusCode::BAD_REQUEST,\n        }\n    }\n}\n\nimpl IntoResponse<AwsJson1_0> for InternalFailureException {\n    fn into_response(self) -> http::Response<crate::body::BoxBody> {\n        IntoResponse::<AwsJson1_0>::into_response(RuntimeError::InternalFailure(crate::Error::new(String::new())))\n    }\n}\n\nimpl IntoResponse<AwsJson1_1> for InternalFailureException {\n    fn into_response(self) -> http::Response<crate::body::BoxBody> {\n        IntoResponse::<AwsJson1_1>::into_response(RuntimeError::InternalFailure(crate::Error::new(String::new())))\n    }\n}\n\nimpl IntoResponse<AwsJson1_0> for RuntimeError {\n    fn into_response(self) -> http::Response<crate::body::BoxBody> {\n        let res = http::Response::builder()\n            .status(self.status_code())\n            .header(\"Content-Type\", \"application/x-amz-json-1.0\")\n            .extension(RuntimeErrorExtension::new(self.name().to_string()));\n\n        let body = match self {\n            RuntimeError::Validation(reason) => crate::body::to_boxed(reason),\n            // See https://awslabs.github.io/smithy/2.0/aws/protocols/aws-json-1_0-protocol.html#empty-body-serialization\n            _ => crate::body::to_boxed(\"{}\"),\n        };\n\n        res.body(body)\n            .expect(INVALID_HTTP_RESPONSE_FOR_RUNTIME_ERROR_PANIC_MESSAGE)\n    }\n}\n\nimpl IntoResponse<AwsJson1_1> for RuntimeError {\n    fn into_response(self) -> http::Response<crate::body::BoxBody> {\n        let res = http::Response::builder()\n            .status(self.status_code())\n            .header(\"Content-Type\", \"application/x-amz-json-1.1\")\n            .extension(RuntimeErrorExtension::new(self.name().to_string()));\n\n        let body = match self {\n            RuntimeError::Validation(reason) => crate::body::to_boxed(reason),\n            _ => crate::body::to_boxed(\"\"),\n        };\n\n        res.body(body)\n            .expect(INVALID_HTTP_RESPONSE_FOR_RUNTIME_ERROR_PANIC_MESSAGE)\n    }\n}\n\nimpl From<ResponseRejection> for RuntimeError {\n    fn from(err: ResponseRejection) -> Self {\n        Self::Serialization(crate::Error::new(err))\n    }\n}\n\nimpl From<RequestRejection> for RuntimeError {\n    fn from(err: RequestRejection) -> Self {\n        match err {\n            RequestRejection::ConstraintViolation(reason) => Self::Validation(reason),\n            _ => Self::Serialization(crate::Error::new(err)),\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/src/protocol/aws_json_10/mod.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npub mod router;\n\n/// [AWS JSON 1.0](https://smithy.io/2.0/aws/protocols/aws-json-1_0-protocol.html) protocol.\npub struct AwsJson1_0;\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/src/protocol/aws_json_10/router.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::body::{empty, BoxBody};\nuse crate::extension::RuntimeErrorExtension;\nuse crate::response::IntoResponse;\nuse crate::routing::{method_disallowed, UNKNOWN_OPERATION_EXCEPTION};\n\nuse super::AwsJson1_0;\n\npub use crate::protocol::aws_json::router::*;\n\n// TODO(https://github.com/smithy-lang/smithy/issues/2348): We're probably non-compliant here, but\n// we have no tests to pin our implemenation against!\nimpl IntoResponse<AwsJson1_0> for Error {\n    fn into_response(self) -> http::Response<BoxBody> {\n        match self {\n            Error::MethodNotAllowed => method_disallowed(),\n            _ => http::Response::builder()\n                .status(http::StatusCode::NOT_FOUND)\n                .header(http::header::CONTENT_TYPE, \"application/x-amz-json-1.0\")\n                .extension(RuntimeErrorExtension::new(\n                    UNKNOWN_OPERATION_EXCEPTION.to_string(),\n                ))\n                .body(empty())\n                .expect(\"invalid HTTP response for AWS JSON 1.0 routing error; please file a bug report under https://github.com/smithy-lang/smithy-rs/issues\"),\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/src/protocol/aws_json_11/mod.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npub mod router;\n\n/// [AWS JSON 1.1](https://smithy.io/2.0/aws/protocols/aws-json-1_1-protocol.html) protocol.\npub struct AwsJson1_1;\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/src/protocol/aws_json_11/router.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::body::{empty, BoxBody};\nuse crate::extension::RuntimeErrorExtension;\nuse crate::response::IntoResponse;\nuse crate::routing::{method_disallowed, UNKNOWN_OPERATION_EXCEPTION};\n\nuse super::AwsJson1_1;\n\npub use crate::protocol::aws_json::router::*;\n\n// TODO(https://github.com/smithy-lang/smithy/issues/2348): We're probably non-compliant here, but\n// we have no tests to pin our implemenation against!\nimpl IntoResponse<AwsJson1_1> for Error {\n    fn into_response(self) -> http::Response<BoxBody> {\n        match self {\n            Error::MethodNotAllowed => method_disallowed(),\n            _ => http::Response::builder()\n                .status(http::StatusCode::NOT_FOUND)\n                .header(http::header::CONTENT_TYPE, \"application/x-amz-json-1.1\")\n                .extension(RuntimeErrorExtension::new(\n                    UNKNOWN_OPERATION_EXCEPTION.to_string(),\n                ))\n                .body(empty())\n                .expect(\"invalid HTTP response for AWS JSON 1.1 routing error; please file a bug report under https://github.com/smithy-lang/smithy-rs/issues\"),\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/src/protocol/mod.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npub mod aws_json;\npub mod aws_json_10;\npub mod aws_json_11;\npub mod rest;\npub mod rest_json_1;\npub mod rest_xml;\npub mod rpc_v2_cbor;\n\nuse crate::rejection::MissingContentTypeReason;\nuse aws_smithy_runtime_api::http::Headers as SmithyHeaders;\nuse http::header::CONTENT_TYPE;\nuse http::HeaderMap;\n\n#[cfg(test)]\npub mod test_helpers {\n    use http::{HeaderMap, Method, Request};\n\n    /// Helper function to build a `Request`. Used in other test modules.\n    pub fn req(method: &Method, uri: &str, headers: Option<HeaderMap>) -> Request<()> {\n        let mut r = Request::builder().method(method).uri(uri).body(()).unwrap();\n        if let Some(headers) = headers {\n            *r.headers_mut() = headers\n        }\n        r\n    }\n\n    // Returns a `Response`'s body as a `String`, without consuming the response.\n    pub async fn get_body_as_string<B>(body: B) -> String\n    where\n        B: http_body::Body + std::marker::Unpin,\n        B::Error: std::fmt::Debug,\n    {\n        use http_body_util::BodyExt;\n        let body_bytes = body.collect().await.unwrap().to_bytes();\n        String::from(std::str::from_utf8(&body_bytes).unwrap())\n    }\n}\n\n#[allow(clippy::result_large_err)]\nfn parse_mime(content_type: &str) -> Result<mime::Mime, MissingContentTypeReason> {\n    content_type\n        .parse::<mime::Mime>()\n        .map_err(MissingContentTypeReason::MimeParseError)\n}\n\n/// Checks that the `content-type` header from a `SmithyHeaders` matches what we expect.\n#[allow(clippy::result_large_err)]\npub fn content_type_header_classifier_smithy(\n    headers: &SmithyHeaders,\n    expected_content_type: Option<&'static str>,\n) -> Result<(), MissingContentTypeReason> {\n    let actual_content_type = headers.get(CONTENT_TYPE);\n    content_type_header_classifier(actual_content_type, expected_content_type)\n}\n\n/// Checks that the `content-type` header matches what we expect.\n#[allow(clippy::result_large_err)]\nfn content_type_header_classifier(\n    actual_content_type: Option<&str>,\n    expected_content_type: Option<&'static str>,\n) -> Result<(), MissingContentTypeReason> {\n    fn parse_expected_mime(expected_content_type: &str) -> mime::Mime {\n        let mime = expected_content_type\n                .parse::<mime::Mime>()\n                // `expected_content_type` comes from the codegen.\n                .expect(\"BUG: MIME parsing failed, `expected_content_type` is not valid; please file a bug report under https://github.com/smithy-lang/smithy-rs/issues\");\n        debug_assert_eq!(\n            mime, expected_content_type,\n            \"BUG: expected `content-type` header value we own from codegen should coincide with its mime type; please file a bug report under https://github.com/smithy-lang/smithy-rs/issues\",\n        );\n        mime\n    }\n\n    match (actual_content_type, expected_content_type) {\n        (None, None) => Ok(()),\n        (None, Some(expected_content_type)) => {\n            let expected_mime = parse_expected_mime(expected_content_type);\n            Err(MissingContentTypeReason::UnexpectedMimeType {\n                expected_mime: Some(expected_mime),\n                found_mime: None,\n            })\n        }\n        (Some(actual_content_type), None) => {\n            let found_mime = parse_mime(actual_content_type)?;\n            Err(MissingContentTypeReason::UnexpectedMimeType {\n                expected_mime: None,\n                found_mime: Some(found_mime),\n            })\n        }\n        (Some(actual_content_type), Some(expected_content_type)) => {\n            let expected_mime = parse_expected_mime(expected_content_type);\n            let found_mime = parse_mime(actual_content_type)?;\n            if expected_mime != found_mime.essence_str() {\n                Err(MissingContentTypeReason::UnexpectedMimeType {\n                    expected_mime: Some(expected_mime),\n                    found_mime: Some(found_mime),\n                })\n            } else {\n                Ok(())\n            }\n        }\n    }\n}\n\npub fn accept_header_classifier(headers: &HeaderMap, content_type: &mime::Mime) -> bool {\n    if !headers.contains_key(http::header::ACCEPT) {\n        return true;\n    }\n    headers\n        .get_all(http::header::ACCEPT)\n        .into_iter()\n        .flat_map(|header| {\n            header\n                .to_str()\n                .ok()\n                .into_iter()\n                /*\n                 * Turn a header value of: \"type0/subtype0, type1/subtype1, ...\"\n                 * into: [\"type0/subtype0\", \"type1/subtype1\", ...]\n                 * and remove the optional \"; q=x\" parameters\n                 * NOTE: the `unwrap`() is safe, because it takes the first element (if there's nothing to split, returns the string)\n                 */\n                .flat_map(|s| s.split(',').map(|typ| typ.split(';').next().unwrap().trim()))\n        })\n        .filter_map(|h| h.parse::<mime::Mime>().ok())\n        .any(|mim| {\n            let typ = content_type.type_();\n            let subtype = content_type.subtype();\n            // Accept: */*, type/*, type/subtype\n            match (mim.type_(), mim.subtype()) {\n                (t, s) if t == typ && s == subtype => true,\n                (t, mime::STAR) if t == typ => true,\n                (mime::STAR, mime::STAR) => true,\n                _ => false,\n            }\n        })\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use http::header::{HeaderValue, ACCEPT, CONTENT_TYPE};\n\n    fn req_content_type_smithy(content_type: &'static str) -> SmithyHeaders {\n        let mut headers = SmithyHeaders::new();\n        headers.insert(CONTENT_TYPE, HeaderValue::from_str(content_type).unwrap());\n        headers\n    }\n\n    fn req_accept(accept: &'static str) -> HeaderMap {\n        let mut headers = HeaderMap::new();\n        headers.insert(ACCEPT, HeaderValue::from_static(accept));\n        headers\n    }\n\n    const APPLICATION_JSON: Option<&'static str> = Some(\"application/json\");\n\n    // Validates the rejection type since we cannot implement `PartialEq`\n    // for `MissingContentTypeReason`.\n    fn assert_unexpected_mime_type(\n        result: Result<(), MissingContentTypeReason>,\n        actually_expected_mime: Option<mime::Mime>,\n        actually_found_mime: Option<mime::Mime>,\n    ) {\n        match result {\n            Ok(()) => panic!(\"content-type validation is expected to fail\"),\n            Err(e) => match e {\n                MissingContentTypeReason::UnexpectedMimeType {\n                    expected_mime,\n                    found_mime,\n                } => {\n                    assert_eq!(actually_expected_mime, expected_mime);\n                    assert_eq!(actually_found_mime, found_mime);\n                }\n                _ => panic!(\"unexpected `MissingContentTypeReason`: {e}\"),\n            },\n        }\n    }\n\n    #[test]\n    fn check_valid_content_type() {\n        let headers = req_content_type_smithy(\"application/json\");\n        assert!(content_type_header_classifier_smithy(&headers, APPLICATION_JSON,).is_ok());\n    }\n\n    #[test]\n    fn check_invalid_content_type() {\n        let invalid = vec![\"application/jason\", \"text/xml\"];\n        for invalid_mime in invalid {\n            let headers = req_content_type_smithy(invalid_mime);\n            let results = vec![content_type_header_classifier_smithy(&headers, APPLICATION_JSON)];\n\n            let actually_expected_mime = Some(parse_mime(APPLICATION_JSON.unwrap()).unwrap());\n            for result in results {\n                let actually_found_mime = invalid_mime.parse::<mime::Mime>().ok();\n                assert_unexpected_mime_type(result, actually_expected_mime.clone(), actually_found_mime);\n            }\n        }\n    }\n\n    #[test]\n    fn check_missing_content_type_is_not_allowed() {\n        let actually_expected_mime = Some(parse_mime(APPLICATION_JSON.unwrap()).unwrap());\n        let result = content_type_header_classifier_smithy(&SmithyHeaders::new(), APPLICATION_JSON);\n        assert_unexpected_mime_type(result, actually_expected_mime, None);\n    }\n\n    #[test]\n    fn check_missing_content_type_is_expected() {\n        let headers = req_content_type_smithy(APPLICATION_JSON.unwrap());\n        let actually_found_mime = Some(parse_mime(APPLICATION_JSON.unwrap()).unwrap());\n        let actually_expected_mime = None;\n\n        let result = content_type_header_classifier_smithy(&headers, None);\n        assert_unexpected_mime_type(result, actually_expected_mime, actually_found_mime);\n    }\n\n    #[test]\n    fn check_not_parsable_content_type() {\n        let request = req_content_type_smithy(\"123\");\n        let result = content_type_header_classifier_smithy(&request, APPLICATION_JSON);\n        assert!(matches!(\n            result.unwrap_err(),\n            MissingContentTypeReason::MimeParseError(_)\n        ));\n    }\n\n    #[test]\n    fn check_non_ascii_visible_characters_content_type() {\n        // Note that for Smithy headers, validation fails when attempting to parse the mime type,\n        // unlike with `http`'s `HeaderMap`, that would fail when checking the header value is\n        // valid (~ASCII string).\n        let request = req_content_type_smithy(\"application/💩\");\n        let result = content_type_header_classifier_smithy(&request, APPLICATION_JSON);\n        assert!(matches!(\n            result.unwrap_err(),\n            MissingContentTypeReason::MimeParseError(_)\n        ));\n    }\n\n    #[test]\n    fn valid_content_type_header_classifier_http_params() {\n        let request = req_content_type_smithy(\"application/json; charset=utf-8\");\n        let result = content_type_header_classifier_smithy(&request, APPLICATION_JSON);\n        assert!(result.is_ok());\n    }\n\n    #[test]\n    fn valid_accept_header_classifier_multiple_values() {\n        let valid_request = req_accept(\"text/strings, application/json, invalid\");\n        assert!(accept_header_classifier(\n            &valid_request,\n            &\"application/json\".parse().unwrap()\n        ));\n    }\n\n    #[test]\n    fn invalid_accept_header_classifier() {\n        let invalid_request = req_accept(\"text/invalid, invalid, invalid/invalid\");\n        assert!(!accept_header_classifier(\n            &invalid_request,\n            &\"application/json\".parse().unwrap()\n        ));\n    }\n\n    #[test]\n    fn valid_accept_header_classifier_star() {\n        let valid_request = req_accept(\"application/*\");\n        assert!(accept_header_classifier(\n            &valid_request,\n            &\"application/json\".parse().unwrap()\n        ));\n    }\n\n    #[test]\n    fn valid_accept_header_classifier_star_star() {\n        let valid_request = req_accept(\"*/*\");\n        assert!(accept_header_classifier(\n            &valid_request,\n            &\"application/json\".parse().unwrap()\n        ));\n    }\n\n    #[test]\n    fn valid_empty_accept_header_classifier() {\n        assert!(accept_header_classifier(\n            &HeaderMap::new(),\n            &\"application/json\".parse().unwrap()\n        ));\n    }\n\n    #[test]\n    fn valid_accept_header_classifier_with_params() {\n        let valid_request = req_accept(\"application/json; q=30, */*\");\n        assert!(accept_header_classifier(\n            &valid_request,\n            &\"application/json\".parse().unwrap()\n        ));\n    }\n\n    #[test]\n    fn valid_accept_header_classifier() {\n        let valid_request = req_accept(\"application/json\");\n        assert!(accept_header_classifier(\n            &valid_request,\n            &\"application/json\".parse().unwrap()\n        ));\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/src/protocol/rest/mod.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npub mod router;\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/src/protocol/rest/router.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::convert::Infallible;\n\nuse crate::body::BoxBody;\nuse crate::routing::request_spec::Match;\nuse crate::routing::request_spec::RequestSpec;\nuse crate::routing::Route;\nuse crate::routing::Router;\nuse tower::Layer;\nuse tower::Service;\n\nuse thiserror::Error;\n\n/// An AWS REST routing error.\n#[derive(Debug, Error, PartialEq)]\npub enum Error {\n    /// Operation not found.\n    #[error(\"operation not found\")]\n    NotFound,\n    /// Method was not allowed.\n    #[error(\"method was not allowed\")]\n    MethodNotAllowed,\n}\n\n/// A [`Router`] supporting [AWS restJson1] and [AWS restXml] protocols.\n///\n/// [AWS restJson1]: https://awslabs.github.io/smithy/2.0/aws/protocols/aws-restjson1-protocol.html\n/// [AWS restXml]: https://awslabs.github.io/smithy/2.0/aws/protocols/aws-restxml-protocol.html\n#[derive(Debug, Clone)]\npub struct RestRouter<S> {\n    routes: Vec<(RequestSpec, S)>,\n}\n\nimpl<S> RestRouter<S> {\n    /// Applies a [`Layer`] uniformly to all routes.\n    pub fn layer<L>(self, layer: L) -> RestRouter<L::Service>\n    where\n        L: Layer<S>,\n    {\n        RestRouter {\n            routes: self\n                .routes\n                .into_iter()\n                .map(|(request_spec, route)| (request_spec, layer.layer(route)))\n                .collect(),\n        }\n    }\n\n    /// Applies type erasure to the inner route using [`Route::new`].\n    pub fn boxed<B>(self) -> RestRouter<Route<B>>\n    where\n        S: Service<http::Request<B>, Response = http::Response<BoxBody>, Error = Infallible>,\n        S: Send + Clone + 'static,\n        S::Future: Send + 'static,\n    {\n        RestRouter {\n            routes: self.routes.into_iter().map(|(spec, s)| (spec, Route::new(s))).collect(),\n        }\n    }\n}\n\nimpl<B, S> Router<B> for RestRouter<S>\nwhere\n    S: Clone,\n{\n    type Service = S;\n    type Error = Error;\n\n    fn match_route(&self, request: &http::Request<B>) -> Result<S, Self::Error> {\n        let mut method_allowed = true;\n\n        for (request_spec, route) in &self.routes {\n            match request_spec.matches(request) {\n                // Match found.\n                Match::Yes => return Ok(route.clone()),\n                // Match found, but method disallowed.\n                Match::MethodNotAllowed => method_allowed = false,\n                // Continue looping to see if another route matches.\n                Match::No => continue,\n            }\n        }\n\n        if method_allowed {\n            Err(Error::NotFound)\n        } else {\n            Err(Error::MethodNotAllowed)\n        }\n    }\n}\n\nimpl<S> FromIterator<(RequestSpec, S)> for RestRouter<S> {\n    #[inline]\n    fn from_iter<T: IntoIterator<Item = (RequestSpec, S)>>(iter: T) -> Self {\n        let mut routes: Vec<(RequestSpec, S)> = iter.into_iter().collect();\n\n        // Sort them once by specificity, with the more specific routes sorted before the less\n        // specific ones, so that when routing a request we can simply iterate through the routes\n        // and pick the first one that matches.\n        routes.sort_by_key(|(request_spec, _route)| std::cmp::Reverse(request_spec.rank()));\n\n        Self { routes }\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use crate::{protocol::test_helpers::req, routing::request_spec::*};\n\n    use http::Method;\n\n    // This test is a rewrite of `mux.spec.ts`.\n    // https://github.com/awslabs/smithy-typescript/blob/fbf97a9bf4c1d8cf7f285ea7c24e1f0ef280142a/smithy-typescript-ssdk-libs/server-common/src/httpbinding/mux.spec.ts\n    #[test]\n    fn simple_routing() {\n        let request_specs: Vec<(RequestSpec, &'static str)> = vec![\n            (\n                RequestSpec::from_parts(\n                    Method::GET,\n                    vec![\n                        PathSegment::Literal(String::from(\"a\")),\n                        PathSegment::Label,\n                        PathSegment::Label,\n                    ],\n                    Vec::new(),\n                ),\n                \"A\",\n            ),\n            (\n                RequestSpec::from_parts(\n                    Method::GET,\n                    vec![\n                        PathSegment::Literal(String::from(\"mg\")),\n                        PathSegment::Greedy,\n                        PathSegment::Literal(String::from(\"z\")),\n                    ],\n                    Vec::new(),\n                ),\n                \"MiddleGreedy\",\n            ),\n            (\n                RequestSpec::from_parts(\n                    Method::DELETE,\n                    Vec::new(),\n                    vec![\n                        QuerySegment::KeyValue(String::from(\"foo\"), String::from(\"bar\")),\n                        QuerySegment::Key(String::from(\"baz\")),\n                    ],\n                ),\n                \"Delete\",\n            ),\n            (\n                RequestSpec::from_parts(\n                    Method::POST,\n                    vec![PathSegment::Literal(String::from(\"query_key_only\"))],\n                    vec![QuerySegment::Key(String::from(\"foo\"))],\n                ),\n                \"QueryKeyOnly\",\n            ),\n        ];\n\n        // Test both RestJson1 and RestXml routers.\n        let router: RestRouter<_> = request_specs.into_iter().collect();\n\n        let hits = vec![\n            (\"A\", Method::GET, \"/a/b/c\"),\n            (\"MiddleGreedy\", Method::GET, \"/mg/a/z\"),\n            (\"MiddleGreedy\", Method::GET, \"/mg/a/b/c/d/z?abc=def\"),\n            (\"Delete\", Method::DELETE, \"/?foo=bar&baz=quux\"),\n            (\"Delete\", Method::DELETE, \"/?foo=bar&baz\"),\n            (\"Delete\", Method::DELETE, \"/?foo=bar&baz=&\"),\n            (\"Delete\", Method::DELETE, \"/?foo=bar&baz=quux&baz=grault\"),\n            (\"QueryKeyOnly\", Method::POST, \"/query_key_only?foo=bar\"),\n            (\"QueryKeyOnly\", Method::POST, \"/query_key_only?foo\"),\n            (\"QueryKeyOnly\", Method::POST, \"/query_key_only?foo=\"),\n            (\"QueryKeyOnly\", Method::POST, \"/query_key_only?foo=&\"),\n        ];\n        for (svc_name, method, uri) in &hits {\n            assert_eq!(router.match_route(&req(method, uri, None)).unwrap(), *svc_name);\n        }\n\n        for (_, _, uri) in hits {\n            let res = router.match_route(&req(&Method::PATCH, uri, None));\n            assert_eq!(res.unwrap_err(), Error::MethodNotAllowed);\n        }\n\n        let misses = vec![\n            (Method::GET, \"/a\"),\n            (Method::GET, \"/a/b\"),\n            (Method::GET, \"/mg\"),\n            (Method::GET, \"/mg/q\"),\n            (Method::GET, \"/mg/z\"),\n            (Method::GET, \"/mg/a/b/z/c\"),\n            (Method::DELETE, \"/?foo=bar\"),\n            (Method::DELETE, \"/?foo=bar\"),\n            (Method::DELETE, \"/?baz=quux\"),\n            (Method::POST, \"/query_key_only?baz=quux\"),\n            (Method::GET, \"/\"),\n            (Method::POST, \"/\"),\n        ];\n        for (method, miss) in misses {\n            let res = router.match_route(&req(&method, miss, None));\n            assert_eq!(res.unwrap_err(), Error::NotFound);\n        }\n    }\n\n    #[tokio::test]\n    async fn basic_pattern_conflict_avoidance() {\n        let request_specs: Vec<(RequestSpec, &'static str)> = vec![\n            (\n                RequestSpec::from_parts(\n                    Method::GET,\n                    vec![PathSegment::Literal(String::from(\"a\")), PathSegment::Label],\n                    Vec::new(),\n                ),\n                \"A1\",\n            ),\n            (\n                RequestSpec::from_parts(\n                    Method::GET,\n                    vec![\n                        PathSegment::Literal(String::from(\"a\")),\n                        PathSegment::Label,\n                        PathSegment::Literal(String::from(\"a\")),\n                    ],\n                    Vec::new(),\n                ),\n                \"A2\",\n            ),\n            (\n                RequestSpec::from_parts(\n                    Method::GET,\n                    vec![PathSegment::Literal(String::from(\"b\")), PathSegment::Greedy],\n                    Vec::new(),\n                ),\n                \"B1\",\n            ),\n            (\n                RequestSpec::from_parts(\n                    Method::GET,\n                    vec![PathSegment::Literal(String::from(\"b\")), PathSegment::Greedy],\n                    vec![QuerySegment::Key(String::from(\"q\"))],\n                ),\n                \"B2\",\n            ),\n        ];\n\n        let router: RestRouter<_> = request_specs.into_iter().collect();\n\n        let hits = vec![\n            (\"A1\", Method::GET, \"/a/foo\"),\n            (\"A2\", Method::GET, \"/a/foo/a\"),\n            (\"B1\", Method::GET, \"/b/foo/bar/baz\"),\n            (\"B2\", Method::GET, \"/b/foo?q=baz\"),\n        ];\n        for (svc_name, method, uri) in hits {\n            assert_eq!(router.match_route(&req(&method, uri, None)).unwrap(), svc_name);\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/src/protocol/rest_json_1/mod.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npub mod rejection;\npub mod router;\npub mod runtime_error;\n\n/// [AWS restJson1](https://smithy.io/2.0/aws/protocols/aws-restjson1-protocol.html) protocol.\npub struct RestJson1;\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/src/protocol/rest_json_1/rejection.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Rejection types.\n//!\n//! This module contains types that are commonly used as the `E` error type in functions that\n//! handle requests and responses that return `Result<T, E>` throughout the framework. These\n//! include functions to deserialize incoming requests and serialize outgoing responses.\n//!\n//! All types end with `Rejection`. There are two types:\n//!\n//! 1. [`RequestRejection`]s are used when the framework fails to deserialize the request into the\n//!    corresponding operation input.\n//! 2. [`ResponseRejection`]s are used when the framework fails to serialize the operation\n//!    output into a response.\n//!\n//! They are called _rejection_ types and not _error_ types to signal that the input was _rejected_\n//! (as opposed to it causing a recoverable error that would need to be handled, or an\n//! unrecoverable error). For example, a [`RequestRejection`] simply means that the request was\n//! rejected; there isn't really anything wrong with the service itself that the service\n//! implementer would need to handle.\n//!\n//! Rejection types are an _internal_ detail about the framework: they can be added, removed, and\n//! modified at any time without causing breaking changes. They are not surfaced to clients or the\n//! service implementer in any way (including this documentation): indeed, they can't be converted\n//! into responses. They serve as a mechanism to keep track of all the possible errors that can\n//! occur when processing a request or a response, in far more detail than what AWS protocols need\n//! to. This is why they are so granular: other (possibly protocol-specific) error types (like\n//! [`crate::protocol::rest_json_1::runtime_error::RuntimeError`]) can \"group\" them when exposing\n//! errors to clients while the framework does not need to sacrifice fidelity in private error\n//! handling routines, and future-proofing itself at the same time (for example, we might want to\n//! record metrics about rejection types).\n//!\n//! Rejection types implement [`std::error::Error`], and some take in type-erased boxed errors\n//! (`crate::Error`) to represent their underlying causes, so they can be composed with other types\n//! that take in (possibly type-erased) [`std::error::Error`]s, like\n//! [`crate::protocol::rest_json_1::runtime_error::RuntimeError`], thus allowing us to represent the\n//! full error chain.\n//!\n//! This module hosts rejection types _specific_ to the [`crate::protocol::rest_json_1`] protocol, but\n//! the paragraphs above apply to _all_ protocol-specific rejection types.\n//!\n//! Similarly, rejection type variants are exhaustively documented solely in this module if they have\n//! direct counterparts in other protocols. This is to avoid documentation getting out of date.\n//!\n//! Consult `crate::protocol::$protocolName::rejection` for rejection types for other protocols.\n\nuse crate::rejection::MissingContentTypeReason;\nuse aws_smithy_runtime_api::http::HttpError;\nuse std::num::TryFromIntError;\nuse thiserror::Error;\n\n/// Errors that can occur when serializing the operation output provided by the service implementer\n/// into an HTTP response.\n#[derive(Debug, Error)]\npub enum ResponseRejection {\n    /// Used when the service implementer provides an integer outside the 100-999 range for a\n    /// member targeted by `httpResponseCode`.\n    /// See <https://github.com/awslabs/smithy/issues/1116>.\n    #[error(\"invalid bound HTTP status code; status codes must be inside the 100-999 range: {0}\")]\n    InvalidHttpStatusCode(TryFromIntError),\n\n    /// Used when an invalid HTTP header name (a value that cannot be parsed as an\n    /// [`http::header::HeaderName`]) or HTTP header value (a value that cannot be parsed as an\n    /// [`http::header::HeaderValue`]) is provided for a shape member bound to an HTTP header with\n    /// `httpHeader` or `httpPrefixHeaders`.\n    /// Used when failing to serialize an `httpPayload`-bound struct into an HTTP response body.\n    #[error(\"error building HTTP response: {0}\")]\n    Build(#[from] aws_smithy_types::error::operation::BuildError),\n\n    /// Used when failing to serialize a struct into a `String` for the JSON-encoded HTTP response\n    /// body.\n    /// Fun fact: as of writing, this can only happen when date formatting\n    /// (`aws_smithy_types::date_time::DateTime:fmt`) fails, which can only happen if the\n    /// supplied timestamp is outside of the valid range when formatting using RFC-3339, i.e. a\n    /// date outside the `0001-01-01T00:00:00.000Z`-`9999-12-31T23:59:59.999Z` range is supplied.\n    #[error(\"error serializing JSON-encoded body: {0}\")]\n    Serialization(#[from] aws_smithy_types::error::operation::SerializationError),\n\n    /// Used when consuming an [`http::response::Builder`] into the constructed [`http::Response`]\n    /// when calling [`http::response::Builder::body`].\n    /// This error can happen if an invalid HTTP header value (a value that cannot be parsed as an\n    /// `[http::header::HeaderValue]`) is used for the protocol-specific response `Content-Type`\n    /// header, or for additional protocol-specific headers (like `X-Amzn-Errortype` to signal\n    /// errors in RestJson1).\n    #[error(\"error building HTTP response: {0}\")]\n    HttpBuild(#[from] http::Error),\n}\n\n/// Errors that can occur when deserializing an HTTP request into an _operation input_, the input\n/// that is passed as the first argument to operation handlers.\n///\n/// This type allows us to easily keep track of all the possible errors that can occur in the\n/// lifecycle of an incoming HTTP request.\n///\n/// Many inner code-generated and runtime deserialization functions use this as their error type,\n/// when they can only instantiate a subset of the variants (most likely a single one). This is a\n/// deliberate design choice to keep code generation simple. After all, this type is an inner\n/// detail of the framework the service implementer does not interact with.\n///\n/// If a variant takes in a value, it represents the underlying cause of the error.\n///\n/// The variants are _roughly_ sorted in the order in which the HTTP request is processed.\n#[derive(Debug, Error)]\npub enum RequestRejection {\n    /// Used when failing to convert non-streaming requests into a byte slab with\n    /// `hyper::body::to_bytes`.\n    #[error(\"error converting non-streaming body to bytes: {0}\")]\n    BufferHttpBodyBytes(crate::Error),\n\n    /// Used when the request contained an `Accept` header with a MIME type, and the server cannot\n    /// return a response body adhering to that MIME type.\n    #[error(\"request contains invalid value for `Accept` header\")]\n    NotAcceptable,\n\n    /// Used when checking the `Content-Type` header.\n    /// This is bubbled up in the generated SDK when calling\n    /// [`crate::protocol::content_type_header_classifier_smithy`] in `from_request`.\n    #[error(\"expected `Content-Type` header not found: {0}\")]\n    MissingContentType(#[from] MissingContentTypeReason),\n\n    /// Used when failing to deserialize the HTTP body's bytes into a JSON document conforming to\n    /// the modeled input it should represent.\n    #[error(\"error deserializing request HTTP body as JSON: {0}\")]\n    JsonDeserialize(#[from] aws_smithy_json::deserialize::error::DeserializeError),\n\n    /// Used when failing to parse HTTP headers that are bound to input members with the `httpHeader`\n    /// or the `httpPrefixHeaders` traits.\n    #[error(\"error binding request HTTP headers: {0}\")]\n    HeaderParse(#[from] aws_smithy_http::header::ParseError),\n\n    // In theory, the next two errors should never happen because the router should have already\n    // rejected the request.\n    /// Used when the URI pattern has a literal after the greedy label, and it is not found in the\n    /// request's URL.\n    #[error(\"request URI does not match pattern because of literal suffix after greedy label was not found\")]\n    UriPatternGreedyLabelPostfixNotFound,\n    /// Used when the `nom` parser's input does not match the URI pattern.\n    #[error(\"request URI does not match `@http` URI pattern: {0}\")]\n    UriPatternMismatch(crate::Error),\n\n    /// Used when percent-decoding URL query string.\n    /// Used when percent-decoding URI path label.\n    /// This is caused when calling\n    /// [`percent_encoding::percent_decode_str`](https://docs.rs/percent-encoding/latest/percent_encoding/fn.percent_decode_str.html).\n    /// This can happen when the percent-encoded data decodes to bytes that are\n    /// not a well-formed UTF-8 string.\n    #[error(\"request URI cannot be percent decoded into valid UTF-8\")]\n    PercentEncodedUriNotValidUtf8(#[from] core::str::Utf8Error),\n\n    /// Used when failing to deserialize strings from a URL query string and from URI path labels\n    /// into an [`aws_smithy_types::DateTime`].\n    #[error(\"error parsing timestamp from request URI: {0}\")]\n    DateTimeParse(#[from] aws_smithy_types::date_time::DateTimeParseError),\n\n    /// Used when failing to deserialize strings from a URL query string and from URI path labels\n    /// into \"primitive\" types.\n    #[error(\"error parsing primitive type from request URI: {0}\")]\n    PrimitiveParse(#[from] aws_smithy_types::primitive::PrimitiveParseError),\n\n    /// Used when consuming the input struct builder, and constraint violations occur.\n    // This rejection is constructed directly in the code-generated SDK instead of in this crate.\n    #[error(\"request does not adhere to modeled constraints: {0}\")]\n    ConstraintViolation(String),\n\n    /// Typically happens when the request has headers that are not valid UTF-8.\n    #[error(\"failed to convert request: {0}\")]\n    HttpConversion(#[from] HttpError),\n}\n\n// Consider a conversion between `T` and `U` followed by a bubbling up of the conversion error\n// through `Result<_, RequestRejection>`. This [`From`] implementation accomodates the special case\n// where `T` and `U` are equal, in such cases `T`/`U` a enjoy `TryFrom<T>` with\n// `Err = std::convert::Infallible`.\n//\n// Note that when `!` stabilizes `std::convert::Infallible` will become an alias for `!` and there\n// will be a blanket `impl From<!> for T`. This will remove the need for this implementation.\n//\n// More details on this can be found in the following links:\n// - https://doc.rust-lang.org/std/primitive.never.html\n// - https://doc.rust-lang.org/std/convert/enum.Infallible.html#future-compatibility\nimpl From<std::convert::Infallible> for RequestRejection {\n    fn from(_err: std::convert::Infallible) -> Self {\n        // We opt for this `match` here rather than [`unreachable`] to assure the reader that this\n        // code path is dead.\n        match _err {}\n    }\n}\n\n// Conversion from crate::Error is needed for custom body types and testing scenarios.\n// When using BoxBody or custom body implementations, errors are crate::Error, not hyper::Error.\nimpl From<crate::Error> for RequestRejection {\n    fn from(err: crate::Error) -> Self {\n        Self::BufferHttpBodyBytes(err)\n    }\n}\n\n// These converters are solely to make code-generation simpler. They convert from a specific error\n// type (from a runtime/third-party crate or the standard library) into a variant of the\n// [`crate::rejection::RequestRejection`] enum holding the type-erased boxed [`crate::Error`]\n// type. Generated functions that use [crate::rejection::RequestRejection] can thus use `?` to\n// bubble up instead of having to sprinkle things like [`Result::map_err`] everywhere.\n\nimpl From<nom::Err<nom::error::Error<&str>>> for RequestRejection {\n    fn from(err: nom::Err<nom::error::Error<&str>>) -> Self {\n        Self::UriPatternMismatch(crate::Error::new(err.to_owned()))\n    }\n}\n\n// Hyper's HTTP server provides requests with `hyper::body::Incoming`, which has error type\n// `hyper::Error`. During request deserialization (FromRequest), body operations can produce\n// this error, so we need this conversion to handle it within the framework.\nconvert_to_request_rejection!(hyper::Error, BufferHttpBodyBytes);\n\n// Useful in general, but it also required in order to accept Lambda HTTP requests using\n// `Router<lambda_http::Body>` since `lambda_http::Error` is a type alias for `Box<dyn Error + ..>`.\nconvert_to_request_rejection!(Box<dyn std::error::Error + Send + Sync + 'static>, BufferHttpBodyBytes);\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/src/protocol/rest_json_1/router.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::body::BoxBody;\nuse crate::extension::RuntimeErrorExtension;\nuse crate::response::IntoResponse;\nuse crate::routing::{method_disallowed, UNKNOWN_OPERATION_EXCEPTION};\n\nuse super::RestJson1;\n\npub use crate::protocol::rest::router::*;\n\n// TODO(https://github.com/smithy-lang/smithy/issues/2348): We're probably non-compliant here, but\n// we have no tests to pin our implemenation against!\nimpl IntoResponse<RestJson1> for Error {\n    fn into_response(self) -> http::Response<BoxBody> {\n        match self {\n            Error::NotFound => http::Response::builder()\n                .status(http::StatusCode::NOT_FOUND)\n                .header(http::header::CONTENT_TYPE, \"application/json\")\n                .header(\"X-Amzn-Errortype\", UNKNOWN_OPERATION_EXCEPTION)\n                .extension(RuntimeErrorExtension::new(\n                    UNKNOWN_OPERATION_EXCEPTION.to_string(),\n                ))\n                .body(crate::body::to_boxed(\"{}\"))\n                .expect(\"invalid HTTP response for REST JSON 1 routing error; please file a bug report under https://github.com/smithy-lang/smithy-rs/issues\"),\n            Error::MethodNotAllowed => method_disallowed(),\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/src/protocol/rest_json_1/runtime_error.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Runtime error type.\n//!\n//! This module contains the [`RuntimeError`] type.\n//!\n//! As opposed to rejection types (see [`crate::protocol::rest_json_1::rejection`]), which are an internal detail about\n//! the framework, `RuntimeError` is surfaced to clients in HTTP responses: indeed, it implements\n//! [`RuntimeError::into_response`]. Rejections can be \"grouped\" and converted into a\n//! specific `RuntimeError` kind: for example, all request rejections due to serialization issues\n//! can be conflated under the [`RuntimeError::Serialization`] enum variant.\n//!\n//! The HTTP response representation of the specific `RuntimeError` is protocol-specific: for\n//! example, the runtime error in the [`crate::protocol::rest_json_1`] protocol sets the `X-Amzn-Errortype` header.\n//!\n//! Generated code works always works with [`crate::rejection`] types when deserializing requests\n//! and serializing response. Just before a response needs to be sent, the generated code looks up\n//! and converts into the corresponding `RuntimeError`, and then it uses the its\n//! [`RuntimeError::into_response`] method to render and send a response.\n//!\n//! This module hosts the `RuntimeError` type _specific_ to the [`crate::protocol::rest_json_1`] protocol, but\n//! the paragraphs above apply to _all_ protocol-specific rejection types.\n//!\n//! Similarly, `RuntimeError` variants are exhaustively documented solely in this module if they have\n//! direct counterparts in other protocols. This is to avoid documentation getting out of date.\n//!\n//! Consult `crate::protocol::$protocolName::runtime_error` for the `RuntimeError` type for other protocols.\n\nuse super::rejection::RequestRejection;\nuse super::rejection::ResponseRejection;\nuse super::RestJson1;\nuse crate::extension::RuntimeErrorExtension;\nuse crate::response::IntoResponse;\nuse crate::runtime_error::InternalFailureException;\nuse crate::runtime_error::INVALID_HTTP_RESPONSE_FOR_RUNTIME_ERROR_PANIC_MESSAGE;\nuse http::StatusCode;\n\n#[derive(Debug, thiserror::Error)]\npub enum RuntimeError {\n    /// Request failed to deserialize or response failed to serialize.\n    #[error(\"request failed to deserialize or response failed to serialize: {0}\")]\n    Serialization(crate::Error),\n    /// As of writing, this variant can only occur upon failure to extract an\n    /// [`crate::extension::Extension`] from the request.\n    #[error(\"internal failure: {0}\")]\n    InternalFailure(crate::Error),\n    /// Request contains an `Accept` header with a MIME type, and the server cannot return a response\n    /// body adhering to that MIME type.\n    // This is returned directly (i.e. without going through a [`RequestRejection`] first) in the\n    // generated SDK when calling [`crate::protocol::accept_header_classifier`] in\n    // `from_request`.\n    #[error(\"not acceptable request: request contains an `Accept` header with a MIME type, and the server cannot return a response body adhering to that MIME type\")]\n    NotAcceptable,\n    /// The request does not contain the expected `Content-Type` header value.\n    #[error(\"unsupported media type: request does not contain the expected `Content-Type` header value\")]\n    UnsupportedMediaType,\n    /// Operation input contains data that does not adhere to the modeled [constraint traits].\n    /// [constraint traits]: <https://awslabs.github.io/smithy/2.0/spec/constraint-traits.html>\n    #[error(\"validation failure: operation input contains data that does not adhere to the modeled constraints: {0}\")]\n    Validation(String),\n}\n\nimpl RuntimeError {\n    /// String representation of the `RuntimeError` kind.\n    /// Used as the value passed to construct an [`crate::extension::RuntimeErrorExtension`].\n    /// Used as the value of the `X-Amzn-Errortype` header.\n    pub fn name(&self) -> &'static str {\n        match self {\n            Self::Serialization(_) => \"SerializationException\",\n            Self::InternalFailure(_) => \"InternalFailureException\",\n            Self::NotAcceptable => \"NotAcceptableException\",\n            Self::UnsupportedMediaType => \"UnsupportedMediaTypeException\",\n            Self::Validation(_) => \"ValidationException\",\n        }\n    }\n\n    pub fn status_code(&self) -> StatusCode {\n        match self {\n            Self::Serialization(_) => StatusCode::BAD_REQUEST,\n            Self::InternalFailure(_) => StatusCode::INTERNAL_SERVER_ERROR,\n            Self::NotAcceptable => StatusCode::NOT_ACCEPTABLE,\n            Self::UnsupportedMediaType => StatusCode::UNSUPPORTED_MEDIA_TYPE,\n            Self::Validation(_) => StatusCode::BAD_REQUEST,\n        }\n    }\n}\n\nimpl IntoResponse<RestJson1> for InternalFailureException {\n    fn into_response(self) -> http::Response<crate::body::BoxBody> {\n        IntoResponse::<RestJson1>::into_response(RuntimeError::InternalFailure(crate::Error::new(String::new())))\n    }\n}\n\nimpl IntoResponse<RestJson1> for RuntimeError {\n    fn into_response(self) -> http::Response<crate::body::BoxBody> {\n        let res = http::Response::builder()\n            .status(self.status_code())\n            .header(\"Content-Type\", \"application/json\")\n            .header(\"X-Amzn-Errortype\", self.name())\n            .extension(RuntimeErrorExtension::new(self.name().to_string()));\n\n        let body = match self {\n            RuntimeError::Validation(reason) => crate::body::to_boxed(reason),\n            _ => crate::body::to_boxed(\"{}\"),\n        };\n\n        res.body(body)\n            .expect(INVALID_HTTP_RESPONSE_FOR_RUNTIME_ERROR_PANIC_MESSAGE)\n    }\n}\n\nimpl From<ResponseRejection> for RuntimeError {\n    fn from(err: ResponseRejection) -> Self {\n        Self::Serialization(crate::Error::new(err))\n    }\n}\n\nimpl From<RequestRejection> for RuntimeError {\n    fn from(err: RequestRejection) -> Self {\n        match err {\n            RequestRejection::MissingContentType(_reason) => Self::UnsupportedMediaType,\n            RequestRejection::ConstraintViolation(reason) => Self::Validation(reason),\n            RequestRejection::NotAcceptable => Self::NotAcceptable,\n            _ => Self::Serialization(crate::Error::new(err)),\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/src/protocol/rest_xml/mod.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npub mod rejection;\npub mod router;\npub mod runtime_error;\n\n/// [AWS restXml](https://smithy.io/2.0/aws/protocols/aws-restxml-protocol.html) protocol.\npub struct RestXml;\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/src/protocol/rest_xml/rejection.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! This module hosts _exactly_ the same as [`crate::protocol::rest_json_1::rejection`], except that\n//! [`crate::protocol::rest_json_1::rejection::RequestRejection::JsonDeserialize`] is swapped for\n//! [`RequestRejection::XmlDeserialize`].\n\nuse crate::rejection::MissingContentTypeReason;\nuse aws_smithy_runtime_api::http::HttpError;\nuse std::num::TryFromIntError;\nuse thiserror::Error;\n\n#[derive(Debug, Error)]\npub enum ResponseRejection {\n    #[error(\"invalid bound HTTP status code; status codes must be inside the 100-999 range: {0}\")]\n    InvalidHttpStatusCode(TryFromIntError),\n    #[error(\"error building HTTP response: {0}\")]\n    Build(#[from] aws_smithy_types::error::operation::BuildError),\n    #[error(\"error serializing XML-encoded body: {0}\")]\n    Serialization(#[from] aws_smithy_types::error::operation::SerializationError),\n    #[error(\"error building HTTP response: {0}\")]\n    HttpBuild(#[from] http::Error),\n}\n\n#[derive(Debug, Error)]\npub enum RequestRejection {\n    #[error(\"error converting non-streaming body to bytes: {0}\")]\n    BufferHttpBodyBytes(crate::Error),\n\n    #[error(\"request contains invalid value for `Accept` header\")]\n    NotAcceptable,\n\n    #[error(\"expected `Content-Type` header not found: {0}\")]\n    MissingContentType(#[from] MissingContentTypeReason),\n\n    /// Used when failing to deserialize the HTTP body's bytes into a XML conforming to the modeled\n    /// input it should represent.\n    #[error(\"error deserializing request HTTP body as XML: {0}\")]\n    XmlDeserialize(#[from] aws_smithy_xml::decode::XmlDecodeError),\n\n    #[error(\"error binding request HTTP headers: {0}\")]\n    HeaderParse(#[from] aws_smithy_http::header::ParseError),\n\n    #[error(\"request URI does not match pattern because of literal suffix after greedy label was not found\")]\n    UriPatternGreedyLabelPostfixNotFound,\n    #[error(\"request URI does not match `@http` URI pattern: {0}\")]\n    UriPatternMismatch(crate::Error),\n\n    #[error(\"request URI cannot be percent decoded into valid UTF-8\")]\n    PercentEncodedUriNotValidUtf8(#[from] core::str::Utf8Error),\n\n    #[error(\"error parsing timestamp from request URI: {0}\")]\n    DateTimeParse(#[from] aws_smithy_types::date_time::DateTimeParseError),\n\n    #[error(\"error parsing primitive type from request URI: {0}\")]\n    PrimitiveParse(#[from] aws_smithy_types::primitive::PrimitiveParseError),\n\n    #[error(\"request does not adhere to modeled constraints: {0}\")]\n    ConstraintViolation(String),\n\n    /// Typically happens when the request has headers that are not valid UTF-8.\n    #[error(\"failed to convert request: {0}\")]\n    HttpConversion(#[from] HttpError),\n}\n\nimpl From<std::convert::Infallible> for RequestRejection {\n    fn from(_err: std::convert::Infallible) -> Self {\n        match _err {}\n    }\n}\n\n// Conversion from crate::Error is needed for custom body types and testing scenarios.\n// When using BoxBody or custom body implementations, errors are crate::Error, not hyper::Error.\nimpl From<crate::Error> for RequestRejection {\n    fn from(err: crate::Error) -> Self {\n        Self::BufferHttpBodyBytes(err)\n    }\n}\n\nimpl From<nom::Err<nom::error::Error<&str>>> for RequestRejection {\n    fn from(err: nom::Err<nom::error::Error<&str>>) -> Self {\n        Self::UriPatternMismatch(crate::Error::new(err.to_owned()))\n    }\n}\n\n// Hyper's HTTP server provides requests with `hyper::body::Incoming`, which has error type\n// `hyper::Error`. During request deserialization (FromRequest), body operations can produce\n// this error, so we need this conversion to handle it within the framework.\nconvert_to_request_rejection!(hyper::Error, BufferHttpBodyBytes);\n\nconvert_to_request_rejection!(Box<dyn std::error::Error + Send + Sync + 'static>, BufferHttpBodyBytes);\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/src/protocol/rest_xml/router.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::body::empty;\nuse crate::body::BoxBody;\nuse crate::extension::RuntimeErrorExtension;\nuse crate::response::IntoResponse;\nuse crate::routing::{method_disallowed, UNKNOWN_OPERATION_EXCEPTION};\n\nuse super::RestXml;\n\npub use crate::protocol::rest::router::*;\n\n// TODO(https://github.com/smithy-lang/smithy/issues/2348): We're probably non-compliant here, but\n// we have no tests to pin our implemenation against!\nimpl IntoResponse<RestXml> for Error {\n    fn into_response(self) -> http::Response<BoxBody> {\n        match self {\n            Error::NotFound => http::Response::builder()\n                .status(http::StatusCode::NOT_FOUND)\n                .header(http::header::CONTENT_TYPE, \"application/xml\")\n                .extension(RuntimeErrorExtension::new(\n                    UNKNOWN_OPERATION_EXCEPTION.to_string(),\n                ))\n                .body(empty())\n                .expect(\"invalid HTTP response for REST XML routing error; please file a bug report under https://github.com/smithy-lang/smithy-rs/issues\"),\n            Error::MethodNotAllowed => method_disallowed(),\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/src/protocol/rest_xml/runtime_error.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::protocol::rest_xml::RestXml;\nuse crate::response::IntoResponse;\nuse crate::runtime_error::InternalFailureException;\nuse crate::{extension::RuntimeErrorExtension, runtime_error::INVALID_HTTP_RESPONSE_FOR_RUNTIME_ERROR_PANIC_MESSAGE};\nuse http::StatusCode;\n\nuse super::rejection::{RequestRejection, ResponseRejection};\n\n#[derive(Debug, thiserror::Error)]\npub enum RuntimeError {\n    /// See: [`crate::protocol::rest_json_1::runtime_error::RuntimeError::Serialization`]\n    #[error(\"request failed to deserialize or response failed to serialize: {0}\")]\n    Serialization(crate::Error),\n    /// See: [`crate::protocol::rest_json_1::runtime_error::RuntimeError::InternalFailure`]\n    #[error(\"internal failure: {0}\")]\n    InternalFailure(crate::Error),\n    /// See: [`crate::protocol::rest_json_1::runtime_error::RuntimeError::NotAcceptable`]\n    #[error(\"not acceptable request: request contains an `Accept` header with a MIME type, and the server cannot return a response body adhering to that MIME type\")]\n    NotAcceptable,\n    /// See: [`crate::protocol::rest_json_1::runtime_error::RuntimeError::UnsupportedMediaType`]\n    #[error(\"unsupported media type: request does not contain the expected `Content-Type` header value\")]\n    UnsupportedMediaType,\n    /// See: [`crate::protocol::rest_json_1::runtime_error::RuntimeError::Validation`]\n    #[error(\"validation failure: operation input contains data that does not adhere to the modeled constraints: {0}\")]\n    Validation(String),\n}\n\nimpl RuntimeError {\n    pub fn name(&self) -> &'static str {\n        match self {\n            Self::Serialization(_) => \"SerializationException\",\n            Self::InternalFailure(_) => \"InternalFailureException\",\n            Self::NotAcceptable => \"NotAcceptableException\",\n            Self::UnsupportedMediaType => \"UnsupportedMediaTypeException\",\n            Self::Validation(_) => \"ValidationException\",\n        }\n    }\n\n    pub fn status_code(&self) -> StatusCode {\n        match self {\n            Self::Serialization(_) => StatusCode::BAD_REQUEST,\n            Self::InternalFailure(_) => StatusCode::INTERNAL_SERVER_ERROR,\n            Self::NotAcceptable => StatusCode::NOT_ACCEPTABLE,\n            Self::UnsupportedMediaType => StatusCode::UNSUPPORTED_MEDIA_TYPE,\n            Self::Validation(_) => StatusCode::BAD_REQUEST,\n        }\n    }\n}\n\nimpl IntoResponse<RestXml> for InternalFailureException {\n    fn into_response(self) -> http::Response<crate::body::BoxBody> {\n        IntoResponse::<RestXml>::into_response(RuntimeError::InternalFailure(crate::Error::new(String::new())))\n    }\n}\n\nimpl IntoResponse<RestXml> for RuntimeError {\n    fn into_response(self) -> http::Response<crate::body::BoxBody> {\n        let res = http::Response::builder()\n            .status(self.status_code())\n            .header(\"Content-Type\", \"application/xml\")\n            .extension(RuntimeErrorExtension::new(self.name().to_string()));\n\n        let body = crate::body::to_boxed(\"{}\");\n\n        res.body(body)\n            .expect(INVALID_HTTP_RESPONSE_FOR_RUNTIME_ERROR_PANIC_MESSAGE)\n    }\n}\n\nimpl From<ResponseRejection> for RuntimeError {\n    fn from(err: ResponseRejection) -> Self {\n        Self::Serialization(crate::Error::new(err))\n    }\n}\n\nimpl From<RequestRejection> for RuntimeError {\n    fn from(err: RequestRejection) -> Self {\n        match err {\n            RequestRejection::MissingContentType(_reason) => Self::UnsupportedMediaType,\n            RequestRejection::ConstraintViolation(reason) => Self::Validation(reason),\n            _ => Self::Serialization(crate::Error::new(err)),\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/src/protocol/rpc_v2_cbor/mod.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npub mod rejection;\npub mod router;\npub mod runtime_error;\n\n/// [Smithy RPC v2 CBOR](https://smithy.io/2.0/additional-specs/protocols/smithy-rpc-v2.html)\n/// protocol.\npub struct RpcV2Cbor;\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/src/protocol/rpc_v2_cbor/rejection.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::num::TryFromIntError;\n\nuse crate::rejection::MissingContentTypeReason;\nuse aws_smithy_runtime_api::http::HttpError;\nuse thiserror::Error;\n\n#[derive(Debug, Error)]\npub enum ResponseRejection {\n    #[error(\"invalid bound HTTP status code; status codes must be inside the 100-999 range: {0}\")]\n    InvalidHttpStatusCode(TryFromIntError),\n    #[error(\"error serializing CBOR-encoded body: {0}\")]\n    Serialization(#[from] aws_smithy_types::error::operation::SerializationError),\n    #[error(\"error building HTTP response: {0}\")]\n    HttpBuild(#[from] http::Error),\n}\n\n#[derive(Debug, Error)]\npub enum RequestRejection {\n    #[error(\"error converting non-streaming body to bytes: {0}\")]\n    BufferHttpBodyBytes(crate::Error),\n    #[error(\"request contains invalid value for `Accept` header\")]\n    NotAcceptable,\n    #[error(\"expected `Content-Type` header not found: {0}\")]\n    MissingContentType(#[from] MissingContentTypeReason),\n    #[error(\"error deserializing request HTTP body as CBOR: {0}\")]\n    CborDeserialize(#[from] aws_smithy_cbor::decode::DeserializeError),\n    // Unlike the other protocols, RPC v2 uses CBOR, a binary serialization format, so we take in a\n    // `Vec<u8>` here instead of `String`.\n    #[error(\"request does not adhere to modeled constraints\")]\n    ConstraintViolation(Vec<u8>),\n\n    /// Typically happens when the request has headers that are not valid UTF-8.\n    #[error(\"failed to convert request: {0}\")]\n    HttpConversion(#[from] HttpError),\n}\n\nimpl From<std::convert::Infallible> for RequestRejection {\n    fn from(_err: std::convert::Infallible) -> Self {\n        match _err {}\n    }\n}\n\n// Conversion from crate::Error is needed for custom body types and testing scenarios.\n// When using BoxBody or custom body implementations, errors are crate::Error, not hyper::Error.\nimpl From<crate::Error> for RequestRejection {\n    fn from(err: crate::Error) -> Self {\n        Self::BufferHttpBodyBytes(err)\n    }\n}\n\n// Hyper's HTTP server provides requests with `hyper::body::Incoming`, which has error type\n// `hyper::Error`. During request deserialization (FromRequest), body operations can produce\n// this error, so we need this conversion to handle it within the framework.\nconvert_to_request_rejection!(hyper::Error, BufferHttpBodyBytes);\n\nconvert_to_request_rejection!(Box<dyn std::error::Error + Send + Sync + 'static>, BufferHttpBodyBytes);\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/src/protocol/rpc_v2_cbor/router.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::convert::Infallible;\nuse std::str::FromStr;\nuse std::sync::LazyLock;\n\nuse http::header::ToStrError;\nuse http::HeaderMap;\nuse regex::Regex;\nuse thiserror::Error;\nuse tower::Layer;\nuse tower::Service;\n\nuse crate::body::empty;\nuse crate::body::BoxBody;\nuse crate::extension::RuntimeErrorExtension;\nuse crate::protocol::aws_json_11::router::ROUTE_CUTOFF;\nuse crate::response::IntoResponse;\nuse crate::routing::tiny_map::TinyMap;\nuse crate::routing::Route;\nuse crate::routing::Router;\nuse crate::routing::{method_disallowed, UNKNOWN_OPERATION_EXCEPTION};\n\nuse super::RpcV2Cbor;\n\npub use crate::protocol::rest::router::*;\n\n/// An RPC v2 CBOR routing error.\n#[derive(Debug, Error)]\npub enum Error {\n    /// Method was not `POST`.\n    #[error(\"method not POST\")]\n    MethodNotAllowed,\n    /// Requests for the `rpcv2Cbor` protocol MUST NOT contain an `x-amz-target` or `x-amzn-target`\n    /// header.\n    #[error(\"contains forbidden headers\")]\n    ForbiddenHeaders,\n    /// Unable to parse `smithy-protocol` header into a valid wire format value.\n    #[error(\"failed to parse `smithy-protocol` header into a valid wire format value\")]\n    InvalidWireFormatHeader(#[from] WireFormatError),\n    /// Operation not found.\n    #[error(\"operation not found\")]\n    NotFound,\n}\n\n/// A [`Router`] supporting the [Smithy RPC v2 CBOR] protocol.\n///\n/// [Smithy RPC v2 CBOR]: https://smithy.io/2.0/additional-specs/protocols/smithy-rpc-v2.html\n#[derive(Debug, Clone)]\npub struct RpcV2CborRouter<S> {\n    routes: TinyMap<&'static str, S, ROUTE_CUTOFF>,\n}\n\n/// Requests for the `rpcv2Cbor` protocol MUST NOT contain an `x-amz-target` or `x-amzn-target`\n/// header. An `rpcv2Cbor` request is malformed if it contains either of these headers. Server-side\n/// implementations MUST reject such requests for security reasons.\nconst FORBIDDEN_HEADERS: &[&str] = &[\"x-amz-target\", \"x-amzn-target\"];\n\n/// Matches the `Identifier` ABNF rule in\n/// <https://smithy.io/2.0/spec/model.html#shape-id-abnf>.\nconst IDENTIFIER_PATTERN: &str = r#\"((_+([A-Za-z]|[0-9]))|[A-Za-z])[A-Za-z0-9_]*\"#;\n\nimpl<S> RpcV2CborRouter<S> {\n    // TODO(https://github.com/smithy-lang/smithy-rs/issues/3748) Consider building a nom parser.\n    fn uri_path_regex() -> &'static Regex {\n        // Every request for the `rpcv2Cbor` protocol MUST be sent to a URL with the\n        // following form: `{prefix?}/service/{serviceName}/operation/{operationName}`\n        //\n        // * The optional `prefix` segment may span multiple path segments and is not\n        //   utilized by the Smithy RPC v2 CBOR protocol. For example, a service could\n        //   use a `v1` prefix for the following URL path: `v1/service/FooService/operation/BarOperation`\n        // * The `serviceName` segment MUST be replaced by the [`shape\n        //   name`](https://smithy.io/2.0/spec/model.html#grammar-token-smithy-Identifier)\n        //   of the service's [Shape ID](https://smithy.io/2.0/spec/model.html#shape-id)\n        //   in the Smithy model. The `serviceName` produced by client implementations\n        //   MUST NOT contain the namespace of the `service` shape. Service\n        //   implementations SHOULD accept an absolute shape ID as the content of this\n        //   segment with the `#` character replaced with a `.` character, routing it\n        //   the same as if only the name was specified. For example, if the `service`'s\n        //   absolute shape ID is `com.example#TheService`, a service should accept both\n        //   `TheService` and `com.example.TheService` as values for the `serviceName`\n        //   segment.\n        static PATH_REGEX: LazyLock<Regex> = LazyLock::new(|| {\n            Regex::new(&format!(\n                r#\"/service/({IDENTIFIER_PATTERN}\\.)*(?P<service>{IDENTIFIER_PATTERN})/operation/(?P<operation>{IDENTIFIER_PATTERN})$\"#,\n            ))\n            .unwrap()\n        });\n\n        &PATH_REGEX\n    }\n\n    pub fn wire_format_regex() -> &'static Regex {\n        static SMITHY_PROTOCOL_REGEX: LazyLock<Regex> =\n            LazyLock::new(|| Regex::new(r#\"^rpc-v2-(?P<format>\\w+)$\"#).unwrap());\n\n        &SMITHY_PROTOCOL_REGEX\n    }\n\n    pub fn boxed<B>(self) -> RpcV2CborRouter<Route<B>>\n    where\n        S: Service<http::Request<B>, Response = http::Response<BoxBody>, Error = Infallible>,\n        S: Send + Clone + 'static,\n        S::Future: Send + 'static,\n    {\n        RpcV2CborRouter {\n            routes: self.routes.into_iter().map(|(key, s)| (key, Route::new(s))).collect(),\n        }\n    }\n\n    /// Applies a [`Layer`] uniformly to all routes.\n    pub fn layer<L>(self, layer: L) -> RpcV2CborRouter<L::Service>\n    where\n        L: Layer<S>,\n    {\n        RpcV2CborRouter {\n            routes: self\n                .routes\n                .into_iter()\n                .map(|(key, route)| (key, layer.layer(route)))\n                .collect(),\n        }\n    }\n}\n\n// TODO(https://github.com/smithy-lang/smithy/issues/2348): We're probably non-compliant here, but\n// we have no tests to pin our implemenation against!\nimpl IntoResponse<RpcV2Cbor> for Error {\n    fn into_response(self) -> http::Response<BoxBody> {\n        match self {\n            Error::MethodNotAllowed => method_disallowed(),\n            _ => http::Response::builder()\n                .status(http::StatusCode::NOT_FOUND)\n                .header(http::header::CONTENT_TYPE, \"application/cbor\")\n                .extension(RuntimeErrorExtension::new(\n                    UNKNOWN_OPERATION_EXCEPTION.to_string(),\n                ))\n                .body(empty())\n                .expect(\"invalid HTTP response for RPCv2 CBOR routing error; please file a bug report under https://github.com/awslabs/smithy-rs/issues\"),\n        }\n    }\n}\n\n/// Errors that can happen when parsing the wire format from the `smithy-protocol` header.\n#[derive(Debug, Error)]\npub enum WireFormatError {\n    /// Header not found.\n    #[error(\"`smithy-protocol` header not found\")]\n    HeaderNotFound,\n    /// Header value is not visible ASCII.\n    #[error(\"`smithy-protocol` header not visible ASCII\")]\n    HeaderValueNotVisibleAscii(ToStrError),\n    /// Header value does not match the `rpc-v2-{format}` pattern. The actual parsed header value\n    /// is stored in the tuple struct.\n    // https://doc.rust-lang.org/std/fmt/index.html#escaping\n    #[error(\"`smithy-protocol` header does not match the `rpc-v2-{{format}}` pattern: `{0}`\")]\n    HeaderValueNotValid(String),\n    /// Header value matches the `rpc-v2-{format}` pattern, but the `format` is not supported. The\n    /// actual parsed header value is stored in the tuple struct.\n    #[error(\"found unsupported `smithy-protocol` wire format: `{0}`\")]\n    WireFormatNotSupported(String),\n}\n\n/// Smithy RPC V2 requests have a `smithy-protocol` header with the value\n/// `\"rpc-v2-{format}\"`, where `format` is one of the supported wire formats\n/// by the protocol (see [`WireFormat`]).\nfn parse_wire_format_from_header(headers: &HeaderMap) -> Result<WireFormat, WireFormatError> {\n    let header = headers.get(\"smithy-protocol\").ok_or(WireFormatError::HeaderNotFound)?;\n    let header = header.to_str().map_err(WireFormatError::HeaderValueNotVisibleAscii)?;\n    let captures = RpcV2CborRouter::<()>::wire_format_regex()\n        .captures(header)\n        .ok_or_else(|| WireFormatError::HeaderValueNotValid(header.to_owned()))?;\n\n    let format = captures\n        .name(\"format\")\n        .ok_or_else(|| WireFormatError::HeaderValueNotValid(header.to_owned()))?;\n\n    let wire_format_parse_res: Result<WireFormat, WireFormatFromStrError> = format.as_str().parse();\n    wire_format_parse_res.map_err(|_| WireFormatError::WireFormatNotSupported(header.to_owned()))\n}\n\n/// Supported wire formats by RPC V2.\nenum WireFormat {\n    Cbor,\n}\n\nstruct WireFormatFromStrError;\n\nimpl FromStr for WireFormat {\n    type Err = WireFormatFromStrError;\n\n    fn from_str(format: &str) -> Result<Self, Self::Err> {\n        match format {\n            \"cbor\" => Ok(Self::Cbor),\n            _ => Err(WireFormatFromStrError),\n        }\n    }\n}\n\nimpl<S: Clone, B> Router<B> for RpcV2CborRouter<S> {\n    type Service = S;\n\n    type Error = Error;\n\n    fn match_route(&self, request: &http::Request<B>) -> Result<Self::Service, Self::Error> {\n        // Only `Method::POST` is allowed.\n        if request.method() != http::Method::POST {\n            return Err(Error::MethodNotAllowed);\n        }\n\n        // Some headers are not allowed.\n        let request_has_forbidden_header = FORBIDDEN_HEADERS\n            .iter()\n            .any(|&forbidden_header| request.headers().contains_key(forbidden_header));\n        if request_has_forbidden_header {\n            return Err(Error::ForbiddenHeaders);\n        }\n\n        // Wire format has to be specified and supported.\n        let _wire_format = parse_wire_format_from_header(request.headers())?;\n\n        // Extract the service name and the operation name from the request URI.\n        let request_path = request.uri().path();\n        let regex = Self::uri_path_regex();\n\n        tracing::trace!(%request_path, \"capturing service and operation from URI\");\n        let captures = regex.captures(request_path).ok_or(Error::NotFound)?;\n        let (service, operation) = (&captures[\"service\"], &captures[\"operation\"]);\n        tracing::trace!(%service, %operation, \"captured service and operation from URI\");\n\n        // Lookup in the `TinyMap` for a route for the target.\n        let route = self\n            .routes\n            .get((format!(\"{service}.{operation}\")).as_str())\n            .ok_or(Error::NotFound)?;\n        Ok(route.clone())\n    }\n}\n\nimpl<S> FromIterator<(&'static str, S)> for RpcV2CborRouter<S> {\n    #[inline]\n    fn from_iter<T: IntoIterator<Item = (&'static str, S)>>(iter: T) -> Self {\n        Self {\n            routes: iter.into_iter().collect(),\n        }\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use http::{HeaderMap, HeaderValue, Method};\n    use regex::Regex;\n\n    use crate::protocol::test_helpers::req;\n\n    use super::{Error, Router, RpcV2CborRouter};\n\n    fn identifier_regex() -> Regex {\n        Regex::new(&format!(\"^{}$\", super::IDENTIFIER_PATTERN)).unwrap()\n    }\n\n    #[test]\n    fn valid_identifiers() {\n        let valid_identifiers = vec![\"a\", \"_a\", \"_0\", \"__0\", \"variable123\", \"_underscored_variable\"];\n\n        for id in &valid_identifiers {\n            assert!(identifier_regex().is_match(id), \"'{id}' is incorrectly rejected\");\n        }\n    }\n\n    #[test]\n    fn invalid_identifiers() {\n        let invalid_identifiers = vec![\n            \"0\",\n            \"123starts_with_digit\",\n            \"@invalid_start_character\",\n            \" space_in_identifier\",\n            \"invalid-character\",\n            \"invalid@character\",\n            \"no#hashes\",\n        ];\n\n        for id in &invalid_identifiers {\n            assert!(!identifier_regex().is_match(id), \"'{id}' is incorrectly accepted\");\n        }\n    }\n\n    #[test]\n    fn uri_regex_works_accepts() {\n        let regex = RpcV2CborRouter::<()>::uri_path_regex();\n\n        for uri in [\n            \"/service/Service/operation/Operation\",\n            \"prefix/69/service/Service/operation/Operation\",\n            // Here the prefix is up to the last occurrence of the string `/service`.\n            \"prefix/69/service/Service/operation/Operation/service/Service/operation/Operation\",\n            // Service implementations SHOULD accept an absolute shape ID as the content of this\n            // segment with the `#` character replaced with a `.` character, routing it the same as\n            // if only the name was specified. For example, if the `service`'s absolute shape ID is\n            // `com.example#TheService`, a service should accept both `TheService` and\n            // `com.example.TheService` as values for the `serviceName` segment.\n            \"/service/aws.protocoltests.rpcv2Cbor.Service/operation/Operation\",\n            \"/service/namespace.Service/operation/Operation\",\n        ] {\n            let captures = regex.captures(uri).unwrap();\n            assert_eq!(\"Service\", &captures[\"service\"], \"uri: {uri}\");\n            assert_eq!(\"Operation\", &captures[\"operation\"], \"uri: {uri}\");\n        }\n    }\n\n    #[test]\n    fn uri_regex_works_rejects() {\n        let regex = RpcV2CborRouter::<()>::uri_path_regex();\n\n        for uri in [\n            \"\",\n            \"foo\",\n            \"/servicee/Service/operation/Operation\",\n            \"/service/Service\",\n            \"/service/Service/operation/\",\n            \"/service/Service/operation/Operation/\",\n            \"/service/Service/operation/Operation/invalid-suffix\",\n            \"/service/namespace.foo#Service/operation/Operation\",\n            \"/service/namespace-Service/operation/Operation\",\n            \"/service/.Service/operation/Operation\",\n        ] {\n            assert!(regex.captures(uri).is_none(), \"uri: {uri}\");\n        }\n    }\n\n    #[test]\n    fn wire_format_regex_works() {\n        let regex = RpcV2CborRouter::<()>::wire_format_regex();\n\n        let captures = regex.captures(\"rpc-v2-something\").unwrap();\n        assert_eq!(\"something\", &captures[\"format\"]);\n\n        let captures = regex.captures(\"rpc-v2-SomethingElse\").unwrap();\n        assert_eq!(\"SomethingElse\", &captures[\"format\"]);\n\n        let invalid = regex.captures(\"rpc-v1-something\");\n        assert!(invalid.is_none());\n    }\n\n    /// Helper function returning the only strictly required header.\n    fn headers() -> HeaderMap {\n        let mut headers = HeaderMap::new();\n        headers.insert(\"smithy-protocol\", HeaderValue::from_static(\"rpc-v2-cbor\"));\n        headers\n    }\n\n    #[test]\n    fn simple_routing() {\n        let router: RpcV2CborRouter<_> = [\"Service.Operation\"].into_iter().map(|op| (op, ())).collect();\n        let good_uri = \"/prefix/service/Service/operation/Operation\";\n\n        // The request should match.\n        let routing_result = router.match_route(&req(&Method::POST, good_uri, Some(headers())));\n        assert!(routing_result.is_ok());\n\n        // The request would be valid if it used `Method::POST`.\n        let invalid_request = req(&Method::GET, good_uri, Some(headers()));\n        assert!(matches!(\n            router.match_route(&invalid_request),\n            Err(Error::MethodNotAllowed)\n        ));\n\n        // The request would be valid if it did not have forbidden headers.\n        for forbidden_header_name in [\"x-amz-target\", \"x-amzn-target\"] {\n            let mut headers = headers();\n            headers.insert(forbidden_header_name, HeaderValue::from_static(\"Service.Operation\"));\n            let invalid_request = req(&Method::POST, good_uri, Some(headers));\n            assert!(matches!(\n                router.match_route(&invalid_request),\n                Err(Error::ForbiddenHeaders)\n            ));\n        }\n\n        for bad_uri in [\n            // These requests would be valid if they used correct URIs.\n            \"/prefix/Service/Service/operation/Operation\",\n            \"/prefix/service/Service/operation/Operation/suffix\",\n            // These requests would be valid if their URI matched an existing operation.\n            \"/prefix/service/ThisServiceDoesNotExist/operation/Operation\",\n            \"/prefix/service/Service/operation/ThisOperationDoesNotExist\",\n        ] {\n            let invalid_request = &req(&Method::POST, bad_uri, Some(headers()));\n            assert!(matches!(router.match_route(invalid_request), Err(Error::NotFound)));\n        }\n\n        // The request would be valid if it specified a supported wire format in the\n        // `smithy-protocol` header.\n        for header_name in [\"bad-header\", \"rpc-v2-json\", \"foo-rpc-v2-cbor\", \"rpc-v2-cbor-foo\"] {\n            let mut headers = HeaderMap::new();\n            headers.insert(\"smithy-protocol\", HeaderValue::from_static(header_name));\n            let invalid_request = &req(&Method::POST, good_uri, Some(headers));\n            assert!(matches!(\n                router.match_route(invalid_request),\n                Err(Error::InvalidWireFormatHeader(_))\n            ));\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/src/protocol/rpc_v2_cbor/runtime_error.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::response::IntoResponse;\nuse crate::runtime_error::{InternalFailureException, INVALID_HTTP_RESPONSE_FOR_RUNTIME_ERROR_PANIC_MESSAGE};\nuse crate::{extension::RuntimeErrorExtension, protocol::rpc_v2_cbor::RpcV2Cbor};\nuse bytes::Bytes;\nuse http::StatusCode;\n\nuse super::rejection::{RequestRejection, ResponseRejection};\n\n#[derive(Debug, thiserror::Error)]\npub enum RuntimeError {\n    /// See: [`crate::protocol::rest_json_1::runtime_error::RuntimeError::Serialization`]\n    #[error(\"request failed to deserialize or response failed to serialize: {0}\")]\n    Serialization(crate::Error),\n    /// See: [`crate::protocol::rest_json_1::runtime_error::RuntimeError::InternalFailure`]\n    #[error(\"internal failure: {0}\")]\n    InternalFailure(crate::Error),\n    /// See: [`crate::protocol::rest_json_1::runtime_error::RuntimeError::NotAcceptable`]\n    #[error(\"not acceptable request: request contains an `Accept` header with a MIME type, and the server cannot return a response body adhering to that MIME type\")]\n    NotAcceptable,\n    /// See: [`crate::protocol::rest_json_1::runtime_error::RuntimeError::UnsupportedMediaType`]\n    #[error(\"unsupported media type: request does not contain the expected `Content-Type` header value\")]\n    UnsupportedMediaType,\n    /// See: [`crate::protocol::rest_json_1::runtime_error::RuntimeError::Validation`]\n    #[error(\n        \"validation failure: operation input contains data that does not adhere to the modeled constraints: {0:?}\"\n    )]\n    Validation(Vec<u8>),\n}\n\nimpl RuntimeError {\n    pub fn name(&self) -> &'static str {\n        match self {\n            Self::Serialization(_) => \"SerializationException\",\n            Self::InternalFailure(_) => \"InternalFailureException\",\n            Self::NotAcceptable => \"NotAcceptableException\",\n            Self::UnsupportedMediaType => \"UnsupportedMediaTypeException\",\n            Self::Validation(_) => \"ValidationException\",\n        }\n    }\n\n    pub fn status_code(&self) -> StatusCode {\n        match self {\n            Self::Serialization(_) => StatusCode::BAD_REQUEST,\n            Self::InternalFailure(_) => StatusCode::INTERNAL_SERVER_ERROR,\n            Self::NotAcceptable => StatusCode::NOT_ACCEPTABLE,\n            Self::UnsupportedMediaType => StatusCode::UNSUPPORTED_MEDIA_TYPE,\n            Self::Validation(_) => StatusCode::BAD_REQUEST,\n        }\n    }\n}\n\nimpl IntoResponse<RpcV2Cbor> for InternalFailureException {\n    fn into_response(self) -> http::Response<crate::body::BoxBody> {\n        IntoResponse::<RpcV2Cbor>::into_response(RuntimeError::InternalFailure(crate::Error::new(String::new())))\n    }\n}\n\nimpl IntoResponse<RpcV2Cbor> for RuntimeError {\n    fn into_response(self) -> http::Response<crate::body::BoxBody> {\n        let res = http::Response::builder()\n            .status(self.status_code())\n            .header(\"Content-Type\", \"application/cbor\")\n            .extension(RuntimeErrorExtension::new(self.name().to_string()));\n\n        // https://cbor.nemo157.com/#type=hex&value=a0\n        const EMPTY_CBOR_MAP: Bytes = Bytes::from_static(&[0xa0]);\n\n        // TODO(https://github.com/smithy-lang/smithy-rs/issues/3716): we're not serializing\n        // `__type`.\n        let body = match self {\n            RuntimeError::Validation(reason) => crate::body::to_boxed(reason),\n            _ => crate::body::to_boxed(EMPTY_CBOR_MAP),\n        };\n\n        res.body(body)\n            .expect(INVALID_HTTP_RESPONSE_FOR_RUNTIME_ERROR_PANIC_MESSAGE)\n    }\n}\n\nimpl From<ResponseRejection> for RuntimeError {\n    fn from(err: ResponseRejection) -> Self {\n        Self::Serialization(crate::Error::new(err))\n    }\n}\n\nimpl From<RequestRejection> for RuntimeError {\n    fn from(err: RequestRejection) -> Self {\n        match err {\n            RequestRejection::ConstraintViolation(reason) => Self::Validation(reason),\n            _ => Self::Serialization(crate::Error::new(err)),\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/src/rejection.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::response::IntoResponse;\nuse thiserror::Error;\n\n// This is used across different protocol-specific `rejection` modules.\n#[derive(Debug, Error)]\npub enum MissingContentTypeReason {\n    #[error(\"headers taken by another extractor\")]\n    HeadersTakenByAnotherExtractor,\n    #[error(\"invalid `Content-Type` header value mime type: {0}\")]\n    MimeParseError(mime::FromStrError),\n    #[error(\"unexpected `Content-Type` header value; expected mime {expected_mime:?}, found mime {found_mime:?}\")]\n    UnexpectedMimeType {\n        expected_mime: Option<mime::Mime>,\n        found_mime: Option<mime::Mime>,\n    },\n}\n\npub mod any_rejections {\n    //! This module hosts enums, up to size 8, which implement [`IntoResponse`] when their variants implement\n    //! [`IntoResponse`].\n\n    use super::IntoResponse;\n    use thiserror::Error;\n\n    macro_rules! any_rejection {\n        ($name:ident, $($var:ident),+) => (\n            #[derive(Debug, Error)]\n            pub enum $name<$($var),*> {\n                $(\n                    #[error(\"{0}\")]\n                    $var($var),\n                )*\n            }\n\n            impl<P, $($var,)*> IntoResponse<P> for $name<$($var),*>\n            where\n                $($var: IntoResponse<P>,)*\n            {\n                #[allow(non_snake_case)]\n                fn into_response(self) -> http::Response<crate::body::BoxBody> {\n                    match self {\n                        $($name::$var ($var) => $var.into_response(),)*\n                    }\n                }\n            }\n        )\n    }\n\n    // any_rejection!(One, A);\n    any_rejection!(Two, A, B);\n    any_rejection!(Three, A, B, C);\n    any_rejection!(Four, A, B, C, D);\n    any_rejection!(Five, A, B, C, D, E);\n    any_rejection!(Six, A, B, C, D, E, F);\n    any_rejection!(Seven, A, B, C, D, E, F, G);\n    any_rejection!(Eight, A, B, C, D, E, F, G, H);\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/src/request/connect_info.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! The [`ConnectInfo`] struct is included in [`http::Request`]s when\n//! [`IntoMakeServiceWithConnectInfo`](crate::routing::IntoMakeServiceWithConnectInfo) is used. [`ConnectInfo`]'s\n//! [`FromParts`] implementation allows it to be extracted from the [`http::Request`].\n//!\n//! The [`example service`](https://github.com/smithy-lang/smithy-rs/blob/main/examples/pokemon-service/src/main.rs)\n//! illustrates the use of [`IntoMakeServiceWithConnectInfo`](crate::routing::IntoMakeServiceWithConnectInfo)\n//! and [`ConnectInfo`] with a service builder.\n\nuse http::request::Parts;\nuse thiserror::Error;\n\nuse crate::{body::BoxBody, response::IntoResponse};\n\nuse super::{internal_server_error, FromParts};\n\n/// The [`ConnectInfo`] was not found in the [`http::Request`] extensions.\n///\n/// Use [`IntoMakeServiceWithConnectInfo`](crate::routing::IntoMakeServiceWithConnectInfo) to ensure it's present.\n#[non_exhaustive]\n#[derive(Debug, Error)]\n#[error(\n    \"`ConnectInfo` is not present in the `http::Request` extensions - consider using `aws_smithy_http_server::routing::IntoMakeServiceWithConnectInfo`\"\n)]\npub struct MissingConnectInfo;\n\nimpl<Protocol> IntoResponse<Protocol> for MissingConnectInfo {\n    fn into_response(self) -> http::Response<BoxBody> {\n        internal_server_error()\n    }\n}\n\n/// Extractor for getting connection information produced by a [`Connected`](crate::routing::Connected).\n///\n/// Note this extractor requires the existence of [`ConnectInfo<T>`] in the [`http::Extensions`]. This is\n/// automatically inserted by the [`IntoMakeServiceWithConnectInfo`](crate::routing::IntoMakeServiceWithConnectInfo)\n/// middleware, which can be applied using the `into_make_service_with_connect_info` method on your generated service.\n#[derive(Clone, Debug)]\npub struct ConnectInfo<T>(\n    /// The type produced via [`Connected`](crate::routing::Connected).\n    pub T,\n);\n\nimpl<P, T> FromParts<P> for ConnectInfo<T>\nwhere\n    T: Send + Sync + 'static,\n{\n    type Rejection = MissingConnectInfo;\n\n    fn from_parts(parts: &mut Parts) -> Result<Self, Self::Rejection> {\n        parts.extensions.remove().ok_or(MissingConnectInfo)\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/src/request/extension.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n// This code was copied and then modified from Tokio's Axum.\n\n/* Copyright (c) 2021 Tower Contributors\n *\n * Permission is hereby granted, free of charge, to any\n * person obtaining a copy of this software and associated\n * documentation files (the \"Software\"), to deal in the\n * Software without restriction, including without\n * limitation the rights to use, copy, modify, merge,\n * publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software\n * is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice\n * shall be included in all copies or substantial portions\n * of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF\n * ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED\n * TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A\n * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT\n * SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR\n * IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\n * DEALINGS IN THE SOFTWARE.\n */\n\n//! Extension types.\n//!\n//! Extension types are types that are stored in and extracted from _both_ requests and\n//! responses.\n//!\n//! There is only one _generic_ extension type _for requests_, [`Extension`].\n//!\n//! On the other hand, the server SDK uses multiple concrete extension types for responses in order\n//! to store a variety of information, like the operation that was executed, the operation error\n//! that got returned, or the runtime error that happened, among others. The information stored in\n//! these types may be useful to [`tower::Layer`]s that post-process the response: for instance, a\n//! particular metrics layer implementation might want to emit metrics about the number of times an\n//! an operation got executed.\n//!\n//! [extensions]: https://docs.rs/http/latest/http/struct.Extensions.html\n\nuse std::ops::Deref;\n\nuse thiserror::Error;\n\nuse crate::{body::BoxBody, request::FromParts, response::IntoResponse};\n\nuse super::internal_server_error;\n\n/// Generic extension type stored in and extracted from [request extensions].\n///\n/// This is commonly used to share state across handlers.\n///\n/// If the extension is missing it will reject the request with a `500 Internal\n/// Server Error` response.\n///\n/// [request extensions]: https://docs.rs/http/latest/http/struct.Extensions.html\n#[derive(Debug, Clone)]\npub struct Extension<T>(pub T);\n\nimpl<T> Deref for Extension<T> {\n    type Target = T;\n\n    fn deref(&self) -> &Self::Target {\n        &self.0\n    }\n}\n\n/// The extension has not been added to the [`Request`](http::Request) or has been previously removed.\n#[non_exhaustive]\n#[derive(Debug, Error)]\n#[error(\"the `Extension` is not present in the `http::Request`\")]\npub struct MissingExtension;\n\nimpl<Protocol> IntoResponse<Protocol> for MissingExtension {\n    fn into_response(self) -> http::Response<BoxBody> {\n        internal_server_error()\n    }\n}\n\nimpl<Protocol, T> FromParts<Protocol> for Extension<T>\nwhere\n    T: Send + Sync + 'static,\n{\n    type Rejection = MissingExtension;\n\n    fn from_parts(parts: &mut http::request::Parts) -> Result<Self, Self::Rejection> {\n        parts.extensions.remove::<T>().map(Extension).ok_or(MissingExtension)\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/src/request/lambda.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! The [`lambda_http`] types included in [`http::Request`]s when [`LambdaHandler`](crate::routing::LambdaHandler) is\n//! used. Each are given a [`FromParts`] implementation for easy use within handlers.\n\nuse lambda_http::request::RequestContext;\n#[doc(inline)]\npub use lambda_http::{\n    aws_lambda_events::apigw::{ApiGatewayProxyRequestContext, ApiGatewayV2httpRequestContext},\n    Context,\n};\nuse thiserror::Error;\n\nuse super::{internal_server_error, FromParts};\nuse crate::{body::BoxBody, response::IntoResponse};\n\n/// The [`Context`] was not found in the [`http::Request`] extensions.\n///\n/// Use [`LambdaHandler`](crate::routing::LambdaHandler) to ensure it's present.\n#[non_exhaustive]\n#[derive(Debug, Error)]\n#[error(\"`Context` is not present in the `http::Request` extensions - consider using `aws_smithy_http_server::routing::LambdaHandler`\")]\npub struct MissingContext;\n\nimpl<Protocol> IntoResponse<Protocol> for MissingContext {\n    fn into_response(self) -> http::Response<BoxBody> {\n        internal_server_error()\n    }\n}\n\nimpl<P> FromParts<P> for Context {\n    type Rejection = MissingContext;\n\n    fn from_parts(parts: &mut http::request::Parts) -> Result<Self, Self::Rejection> {\n        parts.extensions.remove().ok_or(MissingContext)\n    }\n}\n\n#[derive(Debug, Error)]\nenum MissingGatewayContextTypeV1 {\n    #[error(\"`RequestContext` is not present in the `http::Request` extensions - consider using `aws_smithy_http_server::routing::LambdaHandler`\")]\n    MissingRequestContext,\n    #[error(\"`RequestContext::ApiGatewayV2` is present in the `http::Request` extensions - consider using the `aws_smithy_http_server::request::lambda::ApiGatewayV2httpRequestContext` extractor\")]\n    VersionMismatch,\n}\n\n/// The [`RequestContext::ApiGatewayV1`] was not found in the [`http::Request`] extensions.\n///\n/// Use [`LambdaHandler`](crate::routing::LambdaHandler) to ensure it's present and ensure that you're using \"ApiGatewayV1\".\n#[derive(Debug, Error)]\n#[error(\"{inner}\")]\npub struct MissingGatewayContextV1 {\n    inner: MissingGatewayContextTypeV1,\n}\n\nimpl<Protocol> IntoResponse<Protocol> for MissingGatewayContextV1 {\n    fn into_response(self) -> http::Response<BoxBody> {\n        internal_server_error()\n    }\n}\n\nimpl<P> FromParts<P> for ApiGatewayProxyRequestContext {\n    type Rejection = MissingGatewayContextV1;\n\n    fn from_parts(parts: &mut http::request::Parts) -> Result<Self, Self::Rejection> {\n        let context = parts.extensions.remove().ok_or(MissingGatewayContextV1 {\n            inner: MissingGatewayContextTypeV1::MissingRequestContext,\n        })?;\n        if let RequestContext::ApiGatewayV1(context) = context {\n            Ok(context)\n        } else {\n            Err(MissingGatewayContextV1 {\n                inner: MissingGatewayContextTypeV1::VersionMismatch,\n            })\n        }\n    }\n}\n\n#[derive(Debug, Error)]\nenum MissingGatewayContextTypeV2 {\n    #[error(\"`RequestContext` is not present in the `http::Request` extensions - consider using `aws_smithy_http_server::routing::LambdaHandler`\")]\n    MissingRequestContext,\n    #[error(\"`RequestContext::ApiGatewayV1` is present in the `http::Request` extensions - consider using the `aws_smithy_http_server::request::lambda::ApiGatewayProxyRequestContext` extractor\")]\n    VersionMismatch,\n}\n\n/// The [`RequestContext::ApiGatewayV2`] was not found in the [`http::Request`] extensions.\n///\n/// Use [`LambdaHandler`](crate::routing::LambdaHandler) to ensure it's present and ensure that you're using \"ApiGatewayV2\".\n#[derive(Debug, Error)]\n#[error(\"{inner}\")]\npub struct MissingGatewayContextV2 {\n    inner: MissingGatewayContextTypeV2,\n}\n\nimpl<Protocol> IntoResponse<Protocol> for MissingGatewayContextV2 {\n    fn into_response(self) -> http::Response<BoxBody> {\n        internal_server_error()\n    }\n}\n\nimpl<P> FromParts<P> for ApiGatewayV2httpRequestContext {\n    type Rejection = MissingGatewayContextV2;\n\n    fn from_parts(parts: &mut http::request::Parts) -> Result<Self, Self::Rejection> {\n        let context = parts.extensions.remove().ok_or(MissingGatewayContextV2 {\n            inner: MissingGatewayContextTypeV2::MissingRequestContext,\n        })?;\n        if let RequestContext::ApiGatewayV2(context) = context {\n            Ok(context)\n        } else {\n            Err(MissingGatewayContextV2 {\n                inner: MissingGatewayContextTypeV2::VersionMismatch,\n            })\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/src/request/mod.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n// This code was copied and then modified from Tokio's Axum.\n\n/* Copyright (c) 2022 Tower Contributors\n *\n * Permission is hereby granted, free of charge, to any\n * person obtaining a copy of this software and associated\n * documentation files (the \"Software\"), to deal in the\n * Software without restriction, including without\n * limitation the rights to use, copy, modify, merge,\n * publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software\n * is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice\n * shall be included in all copies or substantial portions\n * of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF\n * ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED\n * TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A\n * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT\n * SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR\n * IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\n * DEALINGS IN THE SOFTWARE.\n */\n\n//! Types and traits for extracting data from requests.\n//!\n//! See [Accessing Un-modelled data](https://github.com/smithy-lang/smithy-rs/blob/main/design/src/server/from_parts.md)\n//! a comprehensive overview.\n//!\n//! The following implementations exist:\n//! * Tuples up to size 8, extracting each component.\n//! * `Option<T>`: `Some(T)` if extracting `T` is successful, `None` otherwise.\n//! * `Result<T, T::Rejection>`: `Ok(T)` if extracting `T` is successful, `Err(T::Rejection)` otherwise.\n//!\n//! when `T: FromParts`.\n//!\n\nuse std::{\n    convert::Infallible,\n    future::{ready, Future, Ready},\n};\n\nuse futures_util::{\n    future::{try_join, MapErr, MapOk, TryJoin},\n    TryFutureExt,\n};\nuse http::{request::Parts, Request, StatusCode};\n\nuse crate::{\n    body::{empty, BoxBody},\n    rejection::any_rejections,\n    response::IntoResponse,\n};\n\npub mod connect_info;\npub mod extension;\n#[cfg(feature = \"aws-lambda\")]\n#[cfg_attr(docsrs, doc(cfg(feature = \"aws-lambda\")))]\npub mod lambda;\n#[cfg(feature = \"request-id\")]\n#[cfg_attr(docsrs, doc(cfg(feature = \"request-id\")))]\npub mod request_id;\n\nfn internal_server_error() -> http::Response<BoxBody> {\n    let mut response = http::Response::new(empty());\n    *response.status_mut() = StatusCode::INTERNAL_SERVER_ERROR;\n    response\n}\n\n/// Provides a protocol aware extraction from a [`Request`]. This borrows the [`Parts`], in contrast to\n/// [`FromRequest`] which consumes the entire [`http::Request`] including the body.\npub trait FromParts<Protocol>: Sized {\n    /// The type of the extraction failures.\n    type Rejection: IntoResponse<Protocol>;\n\n    /// Extracts `self` from a [`Parts`] synchronously.\n    fn from_parts(parts: &mut Parts) -> Result<Self, Self::Rejection>;\n}\n\nimpl<P> FromParts<P> for () {\n    type Rejection = Infallible;\n\n    fn from_parts(_parts: &mut Parts) -> Result<Self, Self::Rejection> {\n        Ok(())\n    }\n}\n\nimpl<P, T> FromParts<P> for (T,)\nwhere\n    T: FromParts<P>,\n{\n    type Rejection = T::Rejection;\n\n    fn from_parts(parts: &mut Parts) -> Result<Self, Self::Rejection> {\n        Ok((T::from_parts(parts)?,))\n    }\n}\n\nmacro_rules! impl_from_parts {\n    ($error_name:ident, $($var:ident),+) => (\n        impl<P, $($var,)*> FromParts<P> for ($($var),*)\n        where\n            $($var: FromParts<P>,)*\n        {\n            type Rejection = any_rejections::$error_name<$($var::Rejection),*>;\n\n            fn from_parts(parts: &mut Parts) -> Result<Self, Self::Rejection> {\n                let tuple = (\n                    $($var::from_parts(parts).map_err(any_rejections::$error_name::$var)?,)*\n                );\n                Ok(tuple)\n            }\n        }\n    )\n}\n\nimpl_from_parts!(Two, A, B);\nimpl_from_parts!(Three, A, B, C);\nimpl_from_parts!(Four, A, B, C, D);\nimpl_from_parts!(Five, A, B, C, D, E);\nimpl_from_parts!(Six, A, B, C, D, E, F);\nimpl_from_parts!(Seven, A, B, C, D, E, F, G);\nimpl_from_parts!(Eight, A, B, C, D, E, F, G, H);\n\n/// Provides a protocol aware extraction from a [`Request`]. This consumes the\n/// [`Request`], including the body, in contrast to [`FromParts`] which borrows the [`Parts`].\n///\n/// This should not be implemented by hand. Code generation should implement this for your operations input. To extract\n/// items from a HTTP request [`FromParts`] should be used.\npub trait FromRequest<Protocol, B>: Sized {\n    /// The type of the extraction failures.\n    type Rejection: IntoResponse<Protocol>;\n    /// The type of the extraction [`Future`].\n    type Future: Future<Output = Result<Self, Self::Rejection>>;\n\n    /// Extracts `self` from a [`Request`] asynchronously.\n    fn from_request(request: Request<B>) -> Self::Future;\n}\n\nimpl<P, B, T1> FromRequest<P, B> for (T1,)\nwhere\n    T1: FromRequest<P, B>,\n{\n    type Rejection = T1::Rejection;\n    type Future = MapOk<T1::Future, fn(T1) -> (T1,)>;\n\n    fn from_request(request: Request<B>) -> Self::Future {\n        T1::from_request(request).map_ok(|t1| (t1,))\n    }\n}\n\nimpl<P, B, T1, T2> FromRequest<P, B> for (T1, T2)\nwhere\n    T1: FromRequest<P, B>,\n    T2: FromParts<P>,\n    T1::Rejection: std::fmt::Display,\n    T2::Rejection: std::fmt::Display,\n{\n    type Rejection = any_rejections::Two<T1::Rejection, T2::Rejection>;\n    type Future = TryJoin<MapErr<T1::Future, fn(T1::Rejection) -> Self::Rejection>, Ready<Result<T2, Self::Rejection>>>;\n\n    fn from_request(request: Request<B>) -> Self::Future {\n        let (mut parts, body) = request.into_parts();\n        let t2_result: Result<T2, any_rejections::Two<T1::Rejection, T2::Rejection>> = T2::from_parts(&mut parts)\n            .map_err(|e| {\n                // The error is likely caused by a failure to construct a parameter from the\n                // `Request` required by the user handler. This typically occurs when the\n                // user handler expects a specific type, such as `Extension<State>`, but\n                // either the `ExtensionLayer` has not been added, or it adds a different\n                // type to the extension bag, such as `Extension<Arc<State>>`.\n                tracing::error!(\n                    error = %e,\n                    \"additional parameter for the handler function could not be constructed\");\n                any_rejections::Two::B(e)\n            });\n        try_join(\n            T1::from_request(Request::from_parts(parts, body)).map_err(|e| {\n                // `T1`, the first parameter of a handler function, represents the input parameter\n                // defined in the Smithy model. An error at this stage suggests that `T1` could not\n                // be constructed from the `Request`.\n                tracing::debug!(error = %e, \"failed to deserialize request into operation's input\");\n                any_rejections::Two::A(e)\n            }),\n            ready(t2_result),\n        )\n    }\n}\n\nimpl<P, T> FromParts<P> for Option<T>\nwhere\n    T: FromParts<P>,\n{\n    type Rejection = Infallible;\n\n    fn from_parts(parts: &mut Parts) -> Result<Self, Self::Rejection> {\n        Ok(T::from_parts(parts).ok())\n    }\n}\n\nimpl<P, T> FromParts<P> for Result<T, T::Rejection>\nwhere\n    T: FromParts<P>,\n{\n    type Rejection = Infallible;\n\n    fn from_parts(parts: &mut Parts) -> Result<Self, Self::Rejection> {\n        Ok(T::from_parts(parts))\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/src/request/request_id.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! # Request IDs\n//!\n//! `aws-smithy-http-server` provides the [`ServerRequestId`].\n//!\n//! ## `ServerRequestId`\n//!\n//! A [`ServerRequestId`] is an opaque random identifier generated by the server every time it receives a request.\n//! It uniquely identifies the request within that service instance. It can be used to collate all logs, events and\n//! data related to a single operation.\n//! Use [`ServerRequestIdProviderLayer::new`] to use [`ServerRequestId`] in your handler.\n//!\n//! The [`ServerRequestId`] can be returned to the caller, who can in turn share the [`ServerRequestId`] to help the service owner in troubleshooting issues related to their usage of the service.\n//! Use [`ServerRequestIdProviderLayer::new_with_response_header`] to use [`ServerRequestId`] in your handler and add it to the response headers.\n//!\n//! The [`ServerRequestId`] is not meant to be propagated to downstream dependencies of the service. You should rely on a distributed tracing implementation for correlation purposes (e.g. OpenTelemetry).\n//!\n//! ## Examples\n//!\n//! Your handler can now optionally take as input a [`ServerRequestId`].\n//!\n//! ```rust,ignore\n//! pub async fn handler(\n//!     _input: Input,\n//!     server_request_id: ServerRequestId,\n//! ) -> Output {\n//!     /* Use server_request_id */\n//!     todo!()\n//! }\n//!\n//! let config = ServiceConfig::builder()\n//!     // Generate a server request ID and add it to the response header.\n//!     .layer(ServerRequestIdProviderLayer::new_with_response_header(HeaderName::from_static(\"x-request-id\")))\n//!     .build();\n//! let app = Service::builder(config)\n//!     .operation(handler)\n//!     .build().unwrap();\n//!\n//! let bind: std::net::SocketAddr = format!(\"{}:{}\", args.address, args.port)\n//!     .parse()\n//!     .expect(\"unable to parse the server bind address and port\");\n//! let server = hyper::Server::bind(&bind).serve(app.into_make_service());\n//! ```\n\nuse std::future::Future;\nuse std::{\n    fmt::Display,\n    task::{Context, Poll},\n};\n\nuse futures_util::TryFuture;\nuse http::request::Parts;\nuse http::{header::HeaderName, HeaderValue, Response};\nuse thiserror::Error;\nuse tower::{Layer, Service};\nuse uuid::Uuid;\n\nuse crate::{body::BoxBody, response::IntoResponse};\n\nuse super::{internal_server_error, FromParts};\n\n/// Opaque type for Server Request IDs.\n///\n/// If it is missing, the request will be rejected with a `500 Internal Server Error` response.\n#[derive(Clone, Debug)]\npub struct ServerRequestId {\n    id: Uuid,\n}\n\n/// The server request ID has not been added to the [`Request`](http::Request) or has been previously removed.\n#[non_exhaustive]\n#[derive(Debug, Error)]\n#[error(\"the `ServerRequestId` is not present in the `http::Request`\")]\npub struct MissingServerRequestId;\n\nimpl ServerRequestId {\n    pub fn new() -> Self {\n        Self { id: Uuid::new_v4() }\n    }\n\n    pub(crate) fn to_header(&self) -> HeaderValue {\n        HeaderValue::from_str(&self.id.to_string()).expect(\"This string contains only valid ASCII\")\n    }\n}\n\nimpl Display for ServerRequestId {\n    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n        self.id.fmt(f)\n    }\n}\n\nimpl<P> FromParts<P> for ServerRequestId {\n    type Rejection = MissingServerRequestId;\n\n    fn from_parts(parts: &mut Parts) -> Result<Self, Self::Rejection> {\n        parts.extensions.remove().ok_or(MissingServerRequestId)\n    }\n}\n\nimpl Default for ServerRequestId {\n    fn default() -> Self {\n        Self::new()\n    }\n}\n\n#[derive(Clone)]\npub struct ServerRequestIdProvider<S> {\n    inner: S,\n    header_key: Option<HeaderName>,\n}\n\n/// A layer that provides services with a unique request ID instance\n#[derive(Debug)]\n#[non_exhaustive]\npub struct ServerRequestIdProviderLayer {\n    header_key: Option<HeaderName>,\n}\n\nimpl ServerRequestIdProviderLayer {\n    /// Generate a new unique request ID and do not add it as a response header\n    /// Use [`ServerRequestIdProviderLayer::new_with_response_header`] to also add it as a response header\n    pub fn new() -> Self {\n        Self { header_key: None }\n    }\n\n    /// Generate a new unique request ID and add it as a response header\n    pub fn new_with_response_header(header_key: HeaderName) -> Self {\n        Self {\n            header_key: Some(header_key),\n        }\n    }\n}\n\nimpl Default for ServerRequestIdProviderLayer {\n    fn default() -> Self {\n        Self::new()\n    }\n}\n\nimpl<S> Layer<S> for ServerRequestIdProviderLayer {\n    type Service = ServerRequestIdProvider<S>;\n\n    fn layer(&self, inner: S) -> Self::Service {\n        ServerRequestIdProvider {\n            inner,\n            header_key: self.header_key.clone(),\n        }\n    }\n}\n\nimpl<Body, S> Service<http::Request<Body>> for ServerRequestIdProvider<S>\nwhere\n    S: Service<http::Request<Body>, Response = Response<crate::body::BoxBody>>,\n    S::Future: std::marker::Send + 'static,\n{\n    type Response = S::Response;\n    type Error = S::Error;\n    type Future = ServerRequestIdResponseFuture<S::Future>;\n\n    fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {\n        self.inner.poll_ready(cx)\n    }\n\n    fn call(&mut self, mut req: http::Request<Body>) -> Self::Future {\n        let request_id = ServerRequestId::new();\n        match &self.header_key {\n            Some(header_key) => {\n                req.extensions_mut().insert(request_id.clone());\n                ServerRequestIdResponseFuture {\n                    response_package: Some(ResponsePackage {\n                        request_id,\n                        header_key: header_key.clone(),\n                    }),\n                    fut: self.inner.call(req),\n                }\n            }\n            None => {\n                req.extensions_mut().insert(request_id);\n                ServerRequestIdResponseFuture {\n                    response_package: None,\n                    fut: self.inner.call(req),\n                }\n            }\n        }\n    }\n}\n\nimpl<Protocol> IntoResponse<Protocol> for MissingServerRequestId {\n    fn into_response(self) -> http::Response<BoxBody> {\n        internal_server_error()\n    }\n}\n\nstruct ResponsePackage {\n    request_id: ServerRequestId,\n    header_key: HeaderName,\n}\n\npin_project_lite::pin_project! {\n    pub struct ServerRequestIdResponseFuture<Fut> {\n        response_package: Option<ResponsePackage>,\n        #[pin]\n        fut: Fut,\n    }\n}\n\nimpl<Fut> Future for ServerRequestIdResponseFuture<Fut>\nwhere\n    Fut: TryFuture<Ok = Response<crate::body::BoxBody>>,\n{\n    type Output = Result<Fut::Ok, Fut::Error>;\n\n    fn poll(self: std::pin::Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {\n        let this = self.project();\n        let fut = this.fut;\n        let response_package = this.response_package;\n        fut.try_poll(cx).map_ok(|mut res| {\n            if let Some(response_package) = response_package.take() {\n                res.headers_mut()\n                    .insert(response_package.header_key, response_package.request_id.to_header());\n            }\n            res\n        })\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use crate::request::Request;\n    use http::HeaderValue;\n    use std::convert::Infallible;\n    use tower::{service_fn, ServiceBuilder, ServiceExt};\n\n    #[test]\n    fn test_request_id_parsed_by_header_value_infallible() {\n        ServerRequestId::new().to_header();\n    }\n\n    #[tokio::test]\n    async fn test_request_id_in_response_header() {\n        let svc = ServiceBuilder::new()\n            .layer(&ServerRequestIdProviderLayer::new_with_response_header(\n                HeaderName::from_static(\"x-request-id\"),\n            ))\n            .service(service_fn(|_req: Request<BoxBody>| async move {\n                Ok::<_, Infallible>(Response::new(BoxBody::default()))\n            }));\n\n        let req = Request::new(crate::body::empty());\n\n        let res = svc.oneshot(req).await.unwrap();\n        let request_id = res.headers().get(\"x-request-id\").unwrap().to_str().unwrap();\n\n        assert!(HeaderValue::from_str(request_id).is_ok());\n    }\n\n    #[tokio::test]\n    async fn test_request_id_not_in_response_header() {\n        let svc = ServiceBuilder::new()\n            .layer(&ServerRequestIdProviderLayer::new())\n            .service(service_fn(|_req: Request<BoxBody>| async move {\n                Ok::<_, Infallible>(Response::new(BoxBody::default()))\n            }));\n\n        let req = Request::new(crate::body::empty());\n\n        let res = svc.oneshot(req).await.unwrap();\n\n        assert!(res.headers().is_empty());\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/src/response.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n// This code was copied and then modified from Tokio's Axum.\n\n/* Copyright (c) 2022 Tower Contributors\n *\n * Permission is hereby granted, free of charge, to any\n * person obtaining a copy of this software and associated\n * documentation files (the \"Software\"), to deal in the\n * Software without restriction, including without\n * limitation the rights to use, copy, modify, merge,\n * publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software\n * is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice\n * shall be included in all copies or substantial portions\n * of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF\n * ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED\n * TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A\n * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT\n * SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR\n * IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\n * DEALINGS IN THE SOFTWARE.\n */\n\nuse crate::body::BoxBody;\n\npub type Response<T = BoxBody> = http::Response<T>;\n\n/// A protocol aware function taking `self` to [`http::Response`].\npub trait IntoResponse<Protocol> {\n    /// Performs a conversion into a [`http::Response`].\n    fn into_response(self) -> http::Response<BoxBody>;\n}\n\nimpl<P> IntoResponse<P> for std::convert::Infallible {\n    fn into_response(self) -> http::Response<BoxBody> {\n        match self {}\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/src/routing/into_make_service.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n// This code was copied and then modified from Tokio's Axum.\n\n/* Copyright (c) 2021 Tower Contributors\n *\n * Permission is hereby granted, free of charge, to any\n * person obtaining a copy of this software and associated\n * documentation files (the \"Software\"), to deal in the\n * Software without restriction, including without\n * limitation the rights to use, copy, modify, merge,\n * publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software\n * is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice\n * shall be included in all copies or substantial portions\n * of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF\n * ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED\n * TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A\n * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT\n * SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR\n * IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\n * DEALINGS IN THE SOFTWARE.\n */\n\nuse std::{\n    convert::Infallible,\n    future::ready,\n    task::{Context, Poll},\n};\nuse tower::Service;\n\n/// A [`MakeService`] that produces router services.\n///\n/// [`MakeService`]: tower::make::MakeService\n#[derive(Debug, Clone)]\npub struct IntoMakeService<S> {\n    service: S,\n}\n\nimpl<S> IntoMakeService<S> {\n    pub fn new(service: S) -> Self {\n        Self { service }\n    }\n}\n\nimpl<S, T> Service<T> for IntoMakeService<S>\nwhere\n    S: Clone,\n{\n    type Response = S;\n    type Error = Infallible;\n    type Future = MakeRouteServiceFuture<S>;\n\n    #[inline]\n    fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {\n        Poll::Ready(Ok(()))\n    }\n\n    fn call(&mut self, _target: T) -> Self::Future {\n        MakeRouteServiceFuture::new(ready(Ok(self.service.clone())))\n    }\n}\n\nopaque_future! {\n    /// Response future for [`IntoMakeService`] services.\n    pub type MakeRouteServiceFuture<S> =\n        std::future::Ready<Result<S, Infallible>>;\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n\n    #[test]\n    fn traits() {\n        use crate::test_helpers::*;\n\n        assert_send::<IntoMakeService<()>>();\n        assert_sync::<IntoMakeService<()>>();\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/src/routing/into_make_service_with_connect_info.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n// This code was copied and then modified from Tokio's Axum.\n\n/* Copyright (c) 2021 Tower Contributors\n *\n * Permission is hereby granted, free of charge, to any\n * person obtaining a copy of this software and associated\n * documentation files (the \"Software\"), to deal in the\n * Software without restriction, including without\n * limitation the rights to use, copy, modify, merge,\n * publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software\n * is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice\n * shall be included in all copies or substantial portions\n * of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF\n * ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED\n * TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A\n * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT\n * SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR\n * IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\n * DEALINGS IN THE SOFTWARE.\n */\n\n//! The [`IntoMakeServiceWithConnectInfo`] is a service factory which adjoins [`ConnectInfo`] to the requests.\n\nuse std::{\n    convert::Infallible,\n    fmt,\n    future::ready,\n    marker::PhantomData,\n    net::SocketAddr,\n    task::{Context, Poll},\n};\n\nuse tower::{Layer, Service};\nuse tower_http::add_extension::{AddExtension, AddExtensionLayer};\n\nuse crate::request::connect_info::ConnectInfo;\n\n/// A [`MakeService`] used to insert [`ConnectInfo<T>`] into [`Request`](http::Request)s.\n///\n/// The `T` must be derivable from the underlying IO resource using the [`Connected`] trait.\n///\n/// [`MakeService`]: tower::make::MakeService\npub struct IntoMakeServiceWithConnectInfo<S, C> {\n    inner: S,\n    _connect_info: PhantomData<fn() -> C>,\n}\n\nimpl<S, C> IntoMakeServiceWithConnectInfo<S, C> {\n    pub fn new(svc: S) -> Self {\n        Self {\n            inner: svc,\n            _connect_info: PhantomData,\n        }\n    }\n}\n\nimpl<S, C> fmt::Debug for IntoMakeServiceWithConnectInfo<S, C>\nwhere\n    S: fmt::Debug,\n{\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        f.debug_struct(\"IntoMakeServiceWithConnectInfo\")\n            .field(\"inner\", &self.inner)\n            .finish()\n    }\n}\n\nimpl<S, C> Clone for IntoMakeServiceWithConnectInfo<S, C>\nwhere\n    S: Clone,\n{\n    fn clone(&self) -> Self {\n        Self {\n            inner: self.inner.clone(),\n            _connect_info: PhantomData,\n        }\n    }\n}\n\n/// Trait that connected IO resources implement and use to produce information\n/// about the connection.\n///\n/// The goal for this trait is to allow users to implement custom IO types that\n/// can still provide the same connection metadata.\npub trait Connected<T>: Clone {\n    /// Create type holding information about the connection.\n    fn connect_info(target: T) -> Self;\n}\n\nimpl Connected<SocketAddr> for SocketAddr {\n    fn connect_info(target: SocketAddr) -> Self {\n        target\n    }\n}\n\nimpl<'a, L> Connected<crate::serve::IncomingStream<'a, L>> for SocketAddr\nwhere\n    L: crate::serve::Listener<Addr = SocketAddr>,\n{\n    fn connect_info(target: crate::serve::IncomingStream<'a, L>) -> Self {\n        *target.remote_addr()\n    }\n}\n\nimpl<S, C, T> Service<T> for IntoMakeServiceWithConnectInfo<S, C>\nwhere\n    S: Clone,\n    C: Connected<T>,\n{\n    type Response = AddExtension<S, ConnectInfo<C>>;\n    type Error = Infallible;\n    type Future = ResponseFuture<S, C>;\n\n    #[inline]\n    fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {\n        Poll::Ready(Ok(()))\n    }\n\n    fn call(&mut self, target: T) -> Self::Future {\n        let connect_info = ConnectInfo(C::connect_info(target));\n        let svc = AddExtensionLayer::new(connect_info).layer(self.inner.clone());\n        ResponseFuture::new(ready(Ok(svc)))\n    }\n}\n\nopaque_future! {\n    /// Response future for [`IntoMakeServiceWithConnectInfo`].\n    pub type ResponseFuture<S, C> =\n        std::future::Ready<Result<AddExtension<S, ConnectInfo<C>>, Infallible>>;\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/src/routing/lambda_handler.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse http::uri;\nuse lambda_http::{Request, RequestExt};\nuse std::{\n    fmt::Debug,\n    task::{Context, Poll},\n};\nuse tower::Service;\n\ntype ServiceRequest = http::Request<crate::body::BoxBodySync>;\n\n/// A [`Service`] that takes a `lambda_http::Request` and converts\n/// it to `http::Request<BoxBody>`.\n///\n/// **This version is only guaranteed to be compatible with\n/// [`lambda_http`](https://docs.rs/lambda_http) ^1.** Please ensure that your service crate's\n/// `Cargo.toml` depends on a compatible version.\n///\n/// [`Service`]: tower::Service\n#[derive(Debug, Clone)]\npub struct LambdaHandler<S> {\n    service: S,\n}\n\nimpl<S> LambdaHandler<S> {\n    pub fn new(service: S) -> Self {\n        Self { service }\n    }\n}\n\nimpl<S> Service<Request> for LambdaHandler<S>\nwhere\n    S: Service<ServiceRequest>,\n{\n    type Error = S::Error;\n    type Response = S::Response;\n    type Future = S::Future;\n\n    #[inline]\n    fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {\n        self.service.poll_ready(cx)\n    }\n\n    fn call(&mut self, event: Request) -> Self::Future {\n        self.service.call(convert_event(event))\n    }\n}\n\n/// Converts a `lambda_http::Request` into a `http::Request<crate::body::BoxBodySync>`\n/// Issue: <https://github.com/smithy-lang/smithy-rs/issues/1125>\n///\n/// While converting the event the [API Gateway Stage] portion of the URI\n/// is removed from the uri that gets returned as a new `http::Request`.\n///\n/// [API Gateway Stage]: https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-stages.html\nfn convert_event(request: Request) -> ServiceRequest {\n    let raw_path: &str = request.extensions().raw_http_path();\n    let path: &str = request.uri().path();\n\n    let (parts, body) = if !raw_path.is_empty() && raw_path != path {\n        let mut path = raw_path.to_owned(); // Clone only when we need to strip out the stage.\n        let (mut parts, body) = request.into_parts();\n\n        let uri_parts: uri::Parts = parts.uri.into();\n        let path_and_query = uri_parts\n            .path_and_query\n            .expect(\"request URI does not have `PathAndQuery`\");\n\n        if let Some(query) = path_and_query.query() {\n            path.push('?');\n            path.push_str(query);\n        }\n\n        parts.uri = uri::Uri::builder()\n            .authority(uri_parts.authority.expect(\"request URI does not have authority set\"))\n            .scheme(uri_parts.scheme.expect(\"request URI does not have scheme set\"))\n            .path_and_query(path)\n            .build()\n            .expect(\"unable to construct new URI\");\n\n        (parts, body)\n    } else {\n        request.into_parts()\n    };\n\n    let body = match body {\n        lambda_http::Body::Empty => crate::body::empty_sync(),\n        lambda_http::Body::Text(s) => crate::body::to_boxed_sync(s),\n        lambda_http::Body::Binary(v) => crate::body::to_boxed_sync(v),\n        _ => {\n            tracing::error!(\"Unknown `lambda_http::Body` variant encountered, falling back to empty body\");\n            crate::body::empty_sync()\n        }\n    };\n\n    http::Request::from_parts(parts, body)\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use bytes::Bytes;\n    use lambda_http::RequestExt;\n\n    /// Test utility to collect all bytes from a body.\n    async fn collect_bytes<B>(body: B) -> Result<Bytes, crate::Error>\n    where\n        B: http_body::Body,\n        B::Error: Into<crate::error::BoxError>,\n    {\n        use http_body_util::BodyExt;\n        let collected = body.collect().await.map_err(crate::Error::new)?;\n        Ok(collected.to_bytes())\n    }\n\n    #[test]\n    fn traits() {\n        use crate::test_helpers::*;\n\n        assert_send::<LambdaHandler<()>>();\n        assert_sync::<LambdaHandler<()>>();\n    }\n\n    #[test]\n    fn raw_http_path() {\n        // lambda_http::Request doesn't have a fn `builder`\n        let event = http::Request::builder()\n            .uri(\"https://id.execute-api.us-east-1.amazonaws.com/prod/resources/1\")\n            .body(())\n            .expect(\"unable to build Request\");\n        let (parts, _) = event.into_parts();\n\n        // the lambda event will have a raw path which is the path without stage name in it\n        let event =\n            lambda_http::Request::from_parts(parts, lambda_http::Body::Empty).with_raw_http_path(\"/resources/1\");\n        let request = convert_event(event);\n\n        assert_eq!(request.uri().path(), \"/resources/1\");\n    }\n\n    #[tokio::test]\n    async fn body_conversion_empty() {\n        let event = http::Request::builder()\n            .uri(\"https://id.execute-api.us-east-1.amazonaws.com/test\")\n            .body(())\n            .expect(\"unable to build Request\");\n        let (parts, _) = event.into_parts();\n        let event = lambda_http::Request::from_parts(parts, lambda_http::Body::Empty);\n        let request = convert_event(event);\n        let bytes = collect_bytes(request.into_body()).await.unwrap();\n        assert_eq!(bytes.len(), 0);\n    }\n\n    #[tokio::test]\n    async fn body_conversion_text() {\n        let event = http::Request::builder()\n            .uri(\"https://id.execute-api.us-east-1.amazonaws.com/test\")\n            .body(())\n            .expect(\"unable to build Request\");\n        let (parts, _) = event.into_parts();\n        let event = lambda_http::Request::from_parts(parts, lambda_http::Body::Text(\"hello world\".to_string()));\n        let request = convert_event(event);\n        let bytes = collect_bytes(request.into_body()).await.unwrap();\n        assert_eq!(bytes, \"hello world\");\n    }\n\n    #[tokio::test]\n    async fn body_conversion_binary() {\n        let event = http::Request::builder()\n            .uri(\"https://id.execute-api.us-east-1.amazonaws.com/test\")\n            .body(())\n            .expect(\"unable to build Request\");\n        let (parts, _) = event.into_parts();\n        let event = lambda_http::Request::from_parts(parts, lambda_http::Body::Binary(vec![1, 2, 3, 4, 5]));\n        let request = convert_event(event);\n        let bytes = collect_bytes(request.into_body()).await.unwrap();\n        assert_eq!(bytes.as_ref(), &[1, 2, 3, 4, 5]);\n    }\n\n    #[test]\n    fn uri_with_query_string() {\n        let event = http::Request::builder()\n            .uri(\"https://id.execute-api.us-east-1.amazonaws.com/prod/resources/1?foo=bar&baz=qux\")\n            .body(())\n            .expect(\"unable to build Request\");\n        let (parts, _) = event.into_parts();\n        let event =\n            lambda_http::Request::from_parts(parts, lambda_http::Body::Empty).with_raw_http_path(\"/resources/1\");\n        let request = convert_event(event);\n\n        assert_eq!(request.uri().path(), \"/resources/1\");\n        assert_eq!(request.uri().query(), Some(\"foo=bar&baz=qux\"));\n    }\n\n    #[test]\n    fn uri_without_stage_stripping() {\n        // When raw_http_path is empty or matches the path, no stripping should occur\n        let event = http::Request::builder()\n            .uri(\"https://id.execute-api.us-east-1.amazonaws.com/resources/1\")\n            .body(())\n            .expect(\"unable to build Request\");\n        let (parts, _) = event.into_parts();\n        let event = lambda_http::Request::from_parts(parts, lambda_http::Body::Empty);\n        let request = convert_event(event);\n\n        assert_eq!(request.uri().path(), \"/resources/1\");\n    }\n\n    #[test]\n    fn headers_are_preserved() {\n        let event = http::Request::builder()\n            .uri(\"https://id.execute-api.us-east-1.amazonaws.com/test\")\n            .header(\"content-type\", \"application/json\")\n            .header(\"x-custom-header\", \"custom-value\")\n            .body(())\n            .expect(\"unable to build Request\");\n        let (parts, _) = event.into_parts();\n        let event = lambda_http::Request::from_parts(parts, lambda_http::Body::Empty);\n        let request = convert_event(event);\n\n        assert_eq!(request.headers().get(\"content-type\").unwrap(), \"application/json\");\n        assert_eq!(request.headers().get(\"x-custom-header\").unwrap(), \"custom-value\");\n    }\n\n    #[test]\n    fn extensions_are_preserved() {\n        let event = http::Request::builder()\n            .uri(\"https://id.execute-api.us-east-1.amazonaws.com/test\")\n            .body(())\n            .expect(\"unable to build Request\");\n        let (mut parts, _) = event.into_parts();\n\n        // Add a test extension\n        #[derive(Debug, Clone, PartialEq)]\n        struct TestExtension(String);\n        parts.extensions.insert(TestExtension(\"test-value\".to_string()));\n\n        let event = lambda_http::Request::from_parts(parts, lambda_http::Body::Empty);\n        let request = convert_event(event);\n\n        let ext = request.extensions().get::<TestExtension>();\n        assert!(ext.is_some());\n        assert_eq!(ext.unwrap(), &TestExtension(\"test-value\".to_string()));\n    }\n\n    #[test]\n    fn method_is_preserved() {\n        let event = http::Request::builder()\n            .method(\"POST\")\n            .uri(\"https://id.execute-api.us-east-1.amazonaws.com/test\")\n            .body(())\n            .expect(\"unable to build Request\");\n        let (parts, _) = event.into_parts();\n        let event = lambda_http::Request::from_parts(parts, lambda_http::Body::Empty);\n        let request = convert_event(event);\n\n        assert_eq!(request.method(), http::Method::POST);\n    }\n\n    #[tokio::test]\n    async fn lambda_handler_service_integration() {\n        use tower::ServiceExt;\n\n        // Create a simple service that echoes the URI path\n        let inner_service = tower::service_fn(|req: ServiceRequest| async move {\n            let path = req.uri().path().to_string();\n            let response = http::Response::builder()\n                .status(200)\n                .body(crate::body::to_boxed(path))\n                .unwrap();\n            Ok::<_, std::convert::Infallible>(response)\n        });\n\n        let mut lambda_handler = LambdaHandler::new(inner_service);\n\n        // Create a lambda request\n        let event = http::Request::builder()\n            .uri(\"https://id.execute-api.us-east-1.amazonaws.com/prod/test/path\")\n            .body(())\n            .expect(\"unable to build Request\");\n        let (parts, _) = event.into_parts();\n        let event = lambda_http::Request::from_parts(parts, lambda_http::Body::Empty).with_raw_http_path(\"/test/path\");\n\n        // Call the service\n        let response = lambda_handler.ready().await.unwrap().call(event).await.unwrap();\n\n        // Verify response\n        assert_eq!(response.status(), 200);\n        let body_bytes = collect_bytes(response.into_body()).await.unwrap();\n        assert_eq!(body_bytes, \"/test/path\");\n    }\n\n    #[tokio::test]\n    async fn lambda_handler_with_request_body() {\n        use tower::ServiceExt;\n\n        // Create a service that processes the request body\n        let inner_service = tower::service_fn(|req: ServiceRequest| async move {\n            let body_bytes = collect_bytes(req.into_body()).await.unwrap();\n            let body_str = String::from_utf8(body_bytes.to_vec()).unwrap();\n\n            let response_body = format!(\"Received: {body_str}\");\n            let response = http::Response::builder()\n                .status(200)\n                .header(\"content-type\", \"text/plain\")\n                .body(crate::body::to_boxed(response_body))\n                .unwrap();\n            Ok::<_, std::convert::Infallible>(response)\n        });\n\n        let mut lambda_handler = LambdaHandler::new(inner_service);\n\n        // Create a lambda request with JSON body\n        let event = http::Request::builder()\n            .method(\"POST\")\n            .uri(\"https://id.execute-api.us-east-1.amazonaws.com/api/process\")\n            .header(\"content-type\", \"application/json\")\n            .body(())\n            .expect(\"unable to build Request\");\n        let (parts, _) = event.into_parts();\n        let event = lambda_http::Request::from_parts(parts, lambda_http::Body::Text(r#\"{\"key\":\"value\"}\"#.to_string()));\n\n        // Call the service\n        let response = lambda_handler.ready().await.unwrap().call(event).await.unwrap();\n\n        // Verify response\n        assert_eq!(response.status(), 200);\n        assert_eq!(response.headers().get(\"content-type\").unwrap(), \"text/plain\");\n        let body_bytes = collect_bytes(response.into_body()).await.unwrap();\n        assert_eq!(body_bytes, r#\"Received: {\"key\":\"value\"}\"#);\n    }\n\n    #[tokio::test]\n    async fn lambda_handler_response_headers() {\n        use tower::ServiceExt;\n\n        // Create a service that returns custom headers\n        let inner_service = tower::service_fn(|_req: ServiceRequest| async move {\n            let response = http::Response::builder()\n                .status(201)\n                .header(\"x-custom-header\", \"custom-value\")\n                .header(\"content-type\", \"application/json\")\n                .header(\"x-request-id\", \"12345\")\n                .body(crate::body::to_boxed(r#\"{\"status\":\"created\"}\"#))\n                .unwrap();\n            Ok::<_, std::convert::Infallible>(response)\n        });\n\n        let mut lambda_handler = LambdaHandler::new(inner_service);\n\n        let event = http::Request::builder()\n            .uri(\"https://id.execute-api.us-east-1.amazonaws.com/api/create\")\n            .body(())\n            .expect(\"unable to build Request\");\n        let (parts, _) = event.into_parts();\n        let event = lambda_http::Request::from_parts(parts, lambda_http::Body::Empty);\n\n        // Call the service\n        let response = lambda_handler.ready().await.unwrap().call(event).await.unwrap();\n\n        // Verify all response components\n        assert_eq!(response.status(), 201);\n        assert_eq!(response.headers().get(\"x-custom-header\").unwrap(), \"custom-value\");\n        assert_eq!(response.headers().get(\"content-type\").unwrap(), \"application/json\");\n        assert_eq!(response.headers().get(\"x-request-id\").unwrap(), \"12345\");\n\n        let body_bytes = collect_bytes(response.into_body()).await.unwrap();\n        assert_eq!(body_bytes, r#\"{\"status\":\"created\"}\"#);\n    }\n\n    #[tokio::test]\n    async fn lambda_handler_error_response() {\n        use tower::ServiceExt;\n\n        // Create a service that returns an error status\n        let inner_service = tower::service_fn(|_req: ServiceRequest| async move {\n            let response = http::Response::builder()\n                .status(404)\n                .header(\"content-type\", \"application/json\")\n                .body(crate::body::to_boxed(r#\"{\"error\":\"not found\"}\"#))\n                .unwrap();\n            Ok::<_, std::convert::Infallible>(response)\n        });\n\n        let mut lambda_handler = LambdaHandler::new(inner_service);\n\n        let event = http::Request::builder()\n            .uri(\"https://id.execute-api.us-east-1.amazonaws.com/api/missing\")\n            .body(())\n            .expect(\"unable to build Request\");\n        let (parts, _) = event.into_parts();\n        let event = lambda_http::Request::from_parts(parts, lambda_http::Body::Empty);\n\n        // Call the service\n        let response = lambda_handler.ready().await.unwrap().call(event).await.unwrap();\n\n        // Verify error response\n        assert_eq!(response.status(), 404);\n        let body_bytes = collect_bytes(response.into_body()).await.unwrap();\n        assert_eq!(body_bytes, r#\"{\"error\":\"not found\"}\"#);\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/src/routing/mod.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! HTTP routing that adheres to the [Smithy specification].\n//!\n//! [Smithy specification]: https://smithy.io/2.0/spec/http-bindings.html\n\nmod into_make_service;\nmod into_make_service_with_connect_info;\n#[cfg(feature = \"aws-lambda\")]\n#[cfg_attr(docsrs, doc(cfg(feature = \"aws-lambda\")))]\nmod lambda_handler;\n\n#[doc(hidden)]\npub mod request_spec;\n\nmod route;\n\npub(crate) mod tiny_map;\n\nuse std::{\n    error::Error,\n    fmt,\n    future::{ready, Future, Ready},\n    marker::PhantomData,\n    pin::Pin,\n    task::{Context, Poll},\n};\n\nuse bytes::Bytes;\nuse futures_util::{\n    future::{Either, MapOk},\n    TryFutureExt,\n};\nuse http::Response;\nuse http_body::Body as HttpBody;\nuse tower::{util::Oneshot, Service, ServiceExt};\n\nuse crate::{\n    body::{boxed, BoxBody},\n    error::BoxError,\n    response::IntoResponse,\n};\n\n#[cfg(feature = \"aws-lambda\")]\n#[cfg_attr(docsrs, doc(cfg(feature = \"aws-lambda\")))]\npub use self::lambda_handler::LambdaHandler;\n\n#[allow(deprecated)]\npub use self::{\n    into_make_service::IntoMakeService,\n    into_make_service_with_connect_info::{Connected, IntoMakeServiceWithConnectInfo},\n    route::Route,\n};\n\npub(crate) const UNKNOWN_OPERATION_EXCEPTION: &str = \"UnknownOperationException\";\n\n/// Constructs common response to method disallowed.\npub(crate) fn method_disallowed() -> http::Response<BoxBody> {\n    let mut responses = http::Response::default();\n    *responses.status_mut() = http::StatusCode::METHOD_NOT_ALLOWED;\n    responses\n}\n\n/// An interface for retrieving an inner [`Service`] given a [`http::Request`].\npub trait Router<B> {\n    type Service;\n    type Error;\n\n    /// Matches a [`http::Request`] to a target [`Service`].\n    fn match_route(&self, request: &http::Request<B>) -> Result<Self::Service, Self::Error>;\n}\n\n/// A [`Service`] using the [`Router`] `R` to redirect messages to specific routes.\n///\n/// The `Protocol` parameter is used to determine the serialization of errors.\npub struct RoutingService<R, Protocol> {\n    router: R,\n    _protocol: PhantomData<Protocol>,\n}\n\nimpl<R, P> fmt::Debug for RoutingService<R, P>\nwhere\n    R: fmt::Debug,\n{\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        f.debug_struct(\"RoutingService\")\n            .field(\"router\", &self.router)\n            .field(\"_protocol\", &self._protocol)\n            .finish()\n    }\n}\n\nimpl<R, P> Clone for RoutingService<R, P>\nwhere\n    R: Clone,\n{\n    fn clone(&self) -> Self {\n        Self {\n            router: self.router.clone(),\n            _protocol: PhantomData,\n        }\n    }\n}\n\nimpl<R, P> RoutingService<R, P> {\n    /// Creates a [`RoutingService`] from a [`Router`].\n    pub fn new(router: R) -> Self {\n        Self {\n            router,\n            _protocol: PhantomData,\n        }\n    }\n\n    /// Maps a [`Router`] using a closure.\n    pub fn map<RNew, F>(self, f: F) -> RoutingService<RNew, P>\n    where\n        F: FnOnce(R) -> RNew,\n    {\n        RoutingService {\n            router: f(self.router),\n            _protocol: PhantomData,\n        }\n    }\n}\n\ntype EitherOneshotReady<S, B> = Either<\n    MapOk<Oneshot<S, http::Request<B>>, fn(<S as Service<http::Request<B>>>::Response) -> http::Response<BoxBody>>,\n    Ready<Result<http::Response<BoxBody>, <S as Service<http::Request<B>>>::Error>>,\n>;\n\npin_project_lite::pin_project! {\n    pub struct RoutingFuture<S, B> where S: Service<http::Request<B>> {\n        #[pin]\n        inner: EitherOneshotReady<S, B>\n    }\n}\n\nimpl<S, B> RoutingFuture<S, B>\nwhere\n    S: Service<http::Request<B>>,\n{\n    /// Creates a [`RoutingFuture`] from [`ServiceExt::oneshot`].\n    pub(super) fn from_oneshot<RespB>(future: Oneshot<S, http::Request<B>>) -> Self\n    where\n        S: Service<http::Request<B>, Response = http::Response<RespB>>,\n        RespB: HttpBody<Data = Bytes> + Send + 'static,\n        RespB::Error: Into<BoxError>,\n    {\n        Self {\n            inner: Either::Left(future.map_ok(|x| x.map(boxed))),\n        }\n    }\n\n    /// Creates a [`RoutingFuture`] from [`Service::Response`].\n    pub(super) fn from_response(response: http::Response<BoxBody>) -> Self {\n        Self {\n            inner: Either::Right(ready(Ok(response))),\n        }\n    }\n}\n\nimpl<S, B> Future for RoutingFuture<S, B>\nwhere\n    S: Service<http::Request<B>>,\n{\n    type Output = Result<http::Response<BoxBody>, S::Error>;\n\n    fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {\n        self.project().inner.poll(cx)\n    }\n}\n\nimpl<R, P, B, RespB> Service<http::Request<B>> for RoutingService<R, P>\nwhere\n    R: Router<B>,\n    R::Service: Service<http::Request<B>, Response = http::Response<RespB>> + Clone,\n    R::Error: IntoResponse<P> + Error,\n    RespB: HttpBody<Data = Bytes> + Send + 'static,\n    RespB::Error: Into<BoxError>,\n{\n    type Response = Response<BoxBody>;\n    type Error = <R::Service as Service<http::Request<B>>>::Error;\n    type Future = RoutingFuture<R::Service, B>;\n\n    fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {\n        Poll::Ready(Ok(()))\n    }\n\n    fn call(&mut self, req: http::Request<B>) -> Self::Future {\n        tracing::debug!(\"inside routing service call\");\n        match self.router.match_route(&req) {\n            // Successfully routed, use the routes `Service::call`.\n            Ok(ok) => RoutingFuture::from_oneshot(ok.oneshot(req)),\n            // Failed to route, use the `R::Error`s `IntoResponse<P>`.\n            Err(error) => {\n                tracing::debug!(%error, \"failed to route\");\n                RoutingFuture::from_response(error.into_response())\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/src/routing/request_spec.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::borrow::Cow;\n\nuse http::Request;\nuse regex::Regex;\n\n#[derive(Debug, Clone)]\npub enum PathSegment {\n    Literal(String),\n    Label,\n    Greedy,\n}\n\n#[derive(Debug, Clone)]\npub enum QuerySegment {\n    Key(String),\n    KeyValue(String, String),\n}\n\n#[derive(Debug, Clone)]\npub enum HostPrefixSegment {\n    Literal(String),\n    Label,\n}\n\n#[derive(Debug, Clone, Default)]\npub struct PathSpec(Vec<PathSegment>);\n\nimpl PathSpec {\n    pub fn from_vector_unchecked(path_segments: Vec<PathSegment>) -> Self {\n        PathSpec(path_segments)\n    }\n}\n\n#[derive(Debug, Clone, Default)]\npub struct QuerySpec(Vec<QuerySegment>);\n\nimpl QuerySpec {\n    pub fn from_vector_unchecked(query_segments: Vec<QuerySegment>) -> Self {\n        QuerySpec(query_segments)\n    }\n}\n\n#[derive(Debug, Clone, Default)]\npub struct PathAndQuerySpec {\n    path_segments: PathSpec,\n    query_segments: QuerySpec,\n}\n\nimpl PathAndQuerySpec {\n    pub fn new(path_segments: PathSpec, query_segments: QuerySpec) -> Self {\n        PathAndQuerySpec {\n            path_segments,\n            query_segments,\n        }\n    }\n}\n\n#[derive(Debug, Clone)]\npub struct UriSpec {\n    host_prefix: Option<Vec<HostPrefixSegment>>,\n    path_and_query: PathAndQuerySpec,\n}\n\nimpl UriSpec {\n    // TODO(https://github.com/smithy-lang/smithy-rs/issues/950): When we add support for the endpoint\n    // trait, this constructor will take in a first argument `host_prefix`.\n    pub fn new(path_and_query: PathAndQuerySpec) -> Self {\n        UriSpec {\n            host_prefix: None,\n            path_and_query,\n        }\n    }\n}\n\n#[derive(Debug, Clone)]\npub struct RequestSpec {\n    method: http::Method,\n    uri_spec: UriSpec,\n    uri_path_regex: Regex,\n}\n\n#[derive(Debug, PartialEq)]\npub(crate) enum Match {\n    /// The request matches the URI pattern spec.\n    Yes,\n    /// The request matches the URI pattern spec, but the wrong HTTP method was used. `405 Method\n    /// Not Allowed` should be returned in the response.\n    MethodNotAllowed,\n    /// The request does not match the URI pattern spec. `404 Not Found` should be returned in the\n    /// response.\n    No,\n}\n\nimpl From<&PathSpec> for Regex {\n    fn from(uri_path_spec: &PathSpec) -> Self {\n        let sep = \"/\";\n        let re = if uri_path_spec.0.is_empty() {\n            String::from(sep)\n        } else {\n            uri_path_spec\n                .0\n                .iter()\n                .map(|segment_spec| match segment_spec {\n                    PathSegment::Literal(literal) => Cow::Owned(regex::escape(literal)),\n                    // TODO(https://github.com/awslabs/smithy/issues/975) URL spec says it should be ASCII but this regex accepts UTF-8:\n                    // `*` instead of `+` because the empty string `\"\"` can be bound to a label.\n                    PathSegment::Label => Cow::Borrowed(\"[^/]*\"),\n                    PathSegment::Greedy => Cow::Borrowed(\".*\"),\n                })\n                .fold(String::new(), |a, b| a + sep + &b)\n        };\n\n        Regex::new(&format!(\"^{re}$\")).expect(\"invalid `Regex` from `PathSpec`; please file a bug report under https://github.com/smithy-lang/smithy-rs/issues\")\n    }\n}\n\nimpl RequestSpec {\n    pub fn new(method: http::Method, uri_spec: UriSpec) -> Self {\n        let uri_path_regex = (&uri_spec.path_and_query.path_segments).into();\n        RequestSpec {\n            method,\n            uri_spec,\n            uri_path_regex,\n        }\n    }\n\n    /// A measure of how \"important\" a `RequestSpec` is. The more specific a `RequestSpec` is, the\n    /// higher it ranks in importance. Specificity is measured by the number of segments plus the\n    /// number of query string literals in its URI pattern, so `/{Bucket}/{Key}?query` is more\n    /// specific than `/{Bucket}/{Key}`, which is more specific than `/{Bucket}`, which is more\n    /// specific than `/`.\n    ///\n    /// This rank effectively induces a total order, but we don't implement as `Ord` for\n    /// `RequestSpec` because it would appear in its public interface.\n    ///\n    /// # Why do we need this?\n    ///\n    /// Note that:\n    ///     1. the Smithy spec does not define how servers should route incoming requests in the\n    ///        case of pattern conflicts; and\n    ///     2. the Smithy spec even outright rejects conflicting patterns that can be easily\n    ///        disambiguated e.g. `/{a}` and `/{label}/b` cannot coexist.\n    ///\n    /// We can't to anything about (2) since the Smithy CLI will refuse to build a model with those\n    /// kind of conflicts. However, the Smithy CLI does allow _other_ conflicting patterns to\n    /// coexist, e.g. `/` and `/{label}`. We therefore have to take a stance on (1), since if we\n    /// route arbitrarily [we render basic usage\n    /// impossible](https://github.com/smithy-lang/smithy-rs/issues/1009).\n    /// So this ranking of routes implements some basic pattern conflict disambiguation with some\n    /// common sense. It's also the same behavior that [the TypeScript sSDK is implementing].\n    ///\n    /// [the TypeScript sSDK is implementing]: https://github.com/awslabs/smithy-typescript/blob/d263078b81485a6a2013d243639c0c680343ff47/smithy-typescript-ssdk-libs/server-common/src/httpbinding/mux.ts#L59.\n    // TODO(https://github.com/awslabs/smithy/issues/1029#issuecomment-1002683552): Once Smithy\n    // updates the spec to define the behavior, update our implementation.\n    pub(crate) fn rank(&self) -> usize {\n        self.uri_spec.path_and_query.path_segments.0.len() + self.uri_spec.path_and_query.query_segments.0.len()\n    }\n\n    pub(crate) fn matches<B>(&self, req: &Request<B>) -> Match {\n        if let Some(_host_prefix) = &self.uri_spec.host_prefix {\n            todo!(\"Look at host prefix\");\n        }\n\n        if !self.uri_path_regex.is_match(req.uri().path()) {\n            return Match::No;\n        }\n\n        if self.uri_spec.path_and_query.query_segments.0.is_empty() {\n            if self.method == req.method() {\n                return Match::Yes;\n            } else {\n                return Match::MethodNotAllowed;\n            }\n        }\n\n        match req.uri().query() {\n            Some(query) => {\n                // We can't use `HashMap<Cow<str>, Cow<str>>` because a query string key can appear more\n                // than once e.g. `/?foo=bar&foo=baz`. We _could_ use a multiset e.g. the `hashbag`\n                // crate.\n                // We must deserialize into `Cow<str>`s because `serde_urlencoded` might need to\n                // return an owned allocated `String` if it has to percent-decode a slice of the query string.\n                let res = serde_urlencoded::from_str::<Vec<(Cow<str>, Cow<str>)>>(query);\n\n                match res {\n                    Err(error) => {\n                        tracing::debug!(query, %error, \"failed to deserialize query string\");\n                        Match::No\n                    }\n                    Ok(query_map) => {\n                        for query_segment in self.uri_spec.path_and_query.query_segments.0.iter() {\n                            match query_segment {\n                                QuerySegment::Key(key) => {\n                                    if !query_map.iter().any(|(k, _v)| k == key) {\n                                        return Match::No;\n                                    }\n                                }\n                                QuerySegment::KeyValue(key, expected_value) => {\n                                    let mut it = query_map.iter().filter(|(k, _v)| k == key).peekable();\n                                    if it.peek().is_none() {\n                                        return Match::No;\n                                    }\n\n                                    // The query key appears more than once. All of its values must\n                                    // coincide and be equal to the expected value.\n                                    if it.any(|(_k, v)| v != expected_value) {\n                                        return Match::No;\n                                    }\n                                }\n                            }\n                        }\n\n                        if self.method == req.method() {\n                            Match::Yes\n                        } else {\n                            Match::MethodNotAllowed\n                        }\n                    }\n                }\n            }\n            None => Match::No,\n        }\n    }\n\n    // Helper function to build a `RequestSpec`.\n    #[cfg(test)]\n    pub fn from_parts(\n        method: http::Method,\n        path_segments: Vec<PathSegment>,\n        query_segments: Vec<QuerySegment>,\n    ) -> Self {\n        Self::new(\n            method,\n            UriSpec {\n                host_prefix: None,\n                path_and_query: PathAndQuerySpec {\n                    path_segments: PathSpec::from_vector_unchecked(path_segments),\n                    query_segments: QuerySpec::from_vector_unchecked(query_segments),\n                },\n            },\n        )\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use crate::protocol::test_helpers::req;\n\n    use http::Method;\n\n    #[test]\n    fn path_spec_into_regex() {\n        let cases = vec![\n            (PathSpec(vec![]), \"^/$\"),\n            (PathSpec(vec![PathSegment::Literal(String::from(\"a\"))]), \"^/a$\"),\n            (\n                PathSpec(vec![PathSegment::Literal(String::from(\"a\")), PathSegment::Label]),\n                \"^/a/[^/]*$\",\n            ),\n            (\n                PathSpec(vec![PathSegment::Literal(String::from(\"a\")), PathSegment::Greedy]),\n                \"^/a/.*$\",\n            ),\n            (\n                PathSpec(vec![\n                    PathSegment::Literal(String::from(\"a\")),\n                    PathSegment::Greedy,\n                    PathSegment::Literal(String::from(\"suffix\")),\n                ]),\n                \"^/a/.*/suffix$\",\n            ),\n        ];\n\n        for case in cases {\n            let re: Regex = (&case.0).into();\n            assert_eq!(case.1, re.as_str());\n        }\n    }\n\n    #[test]\n    fn paths_must_match_spec_from_the_beginning_literal() {\n        let spec = RequestSpec::from_parts(\n            Method::GET,\n            vec![PathSegment::Literal(String::from(\"path\"))],\n            Vec::new(),\n        );\n\n        let misses = vec![(Method::GET, \"/beta/path\"), (Method::GET, \"/multiple/stages/in/path\")];\n        for (method, uri) in &misses {\n            assert_eq!(Match::No, spec.matches(&req(method, uri, None)));\n        }\n    }\n\n    #[test]\n    fn paths_must_match_spec_from_the_beginning_label() {\n        let spec = RequestSpec::from_parts(Method::GET, vec![PathSegment::Label], Vec::new());\n\n        let misses = vec![\n            (Method::GET, \"/prefix/label\"),\n            (Method::GET, \"/label/suffix\"),\n            (Method::GET, \"/prefix/label/suffix\"),\n        ];\n        for (method, uri) in &misses {\n            assert_eq!(Match::No, spec.matches(&req(method, uri, None)));\n        }\n    }\n\n    #[test]\n    fn greedy_labels_match_greedily() {\n        let spec = RequestSpec::from_parts(\n            Method::GET,\n            vec![\n                PathSegment::Literal(String::from(\"mg\")),\n                PathSegment::Greedy,\n                PathSegment::Literal(String::from(\"z\")),\n            ],\n            Vec::new(),\n        );\n\n        let hits = vec![\n            (Method::GET, \"/mg/a/z\"),\n            (Method::GET, \"/mg/z/z\"),\n            (Method::GET, \"/mg/a/z/b/z\"),\n            (Method::GET, \"/mg/a/z/z/z\"),\n        ];\n        for (method, uri) in &hits {\n            assert_eq!(Match::Yes, spec.matches(&req(method, uri, None)));\n        }\n    }\n\n    #[test]\n    fn repeated_query_keys() {\n        let spec = RequestSpec::from_parts(Method::DELETE, Vec::new(), vec![QuerySegment::Key(String::from(\"foo\"))]);\n\n        let hits = vec![\n            (Method::DELETE, \"/?foo=bar&foo=bar\"),\n            (Method::DELETE, \"/?foo=bar&foo=baz\"),\n            (Method::DELETE, \"/?foo&foo\"),\n        ];\n        for (method, uri) in &hits {\n            assert_eq!(Match::Yes, spec.matches(&req(method, uri, None)));\n        }\n    }\n\n    fn key_value_spec() -> RequestSpec {\n        RequestSpec::from_parts(\n            Method::DELETE,\n            Vec::new(),\n            vec![QuerySegment::KeyValue(String::from(\"foo\"), String::from(\"bar\"))],\n        )\n    }\n\n    #[test]\n    fn repeated_query_keys_same_values_match() {\n        assert_eq!(\n            Match::Yes,\n            key_value_spec().matches(&req(&Method::DELETE, \"/?foo=bar&foo=bar\", None))\n        );\n    }\n\n    #[test]\n    fn repeated_query_keys_distinct_values_does_not_match() {\n        assert_eq!(\n            Match::No,\n            key_value_spec().matches(&req(&Method::DELETE, \"/?foo=bar&foo=baz\", None))\n        );\n    }\n\n    #[test]\n    fn encoded_query_string() {\n        let request_spec =\n            RequestSpec::from_parts(Method::DELETE, Vec::new(), vec![QuerySegment::Key(\"foo\".to_owned())]);\n\n        assert_eq!(\n            Match::Yes,\n            request_spec.matches(&req(&Method::DELETE, \"/?foo=hello%20world\", None))\n        );\n    }\n\n    fn ab_spec() -> RequestSpec {\n        RequestSpec::from_parts(\n            Method::GET,\n            vec![\n                PathSegment::Literal(String::from(\"a\")),\n                PathSegment::Literal(String::from(\"b\")),\n            ],\n            Vec::new(),\n        )\n    }\n\n    // Empty segments _have meaning_ and should not be stripped away when doing routing or label\n    // extraction.\n    // See https://github.com/awslabs/smithy/issues/1024 for discussion.\n\n    #[test]\n    fn empty_segments_in_the_middle_do_matter() {\n        assert_eq!(Match::Yes, ab_spec().matches(&req(&Method::GET, \"/a/b\", None)));\n\n        let misses = vec![(Method::GET, \"/a//b\"), (Method::GET, \"//////a//b\")];\n        for (method, uri) in &misses {\n            assert_eq!(Match::No, ab_spec().matches(&req(method, uri, None)));\n        }\n    }\n\n    #[test]\n    fn empty_segments_in_the_middle_do_matter_label_spec() {\n        let label_spec = RequestSpec::from_parts(\n            Method::GET,\n            vec![\n                PathSegment::Literal(String::from(\"a\")),\n                PathSegment::Label,\n                PathSegment::Literal(String::from(\"b\")),\n            ],\n            Vec::new(),\n        );\n\n        let hits = vec![\n            (Method::GET, \"/a/label/b\"),\n            (Method::GET, \"/a//b\"), // Label is bound to `\"\"`.\n        ];\n        for (method, uri) in &hits {\n            assert_eq!(Match::Yes, label_spec.matches(&req(method, uri, None)));\n        }\n\n        assert_eq!(Match::No, label_spec.matches(&req(&Method::GET, \"/a///b\", None)));\n    }\n\n    #[test]\n    fn empty_segments_in_the_middle_do_matter_greedy_label_spec() {\n        let greedy_label_spec = RequestSpec::from_parts(\n            Method::GET,\n            vec![\n                PathSegment::Literal(String::from(\"a\")),\n                PathSegment::Greedy,\n                PathSegment::Literal(String::from(\"suffix\")),\n            ],\n            Vec::new(),\n        );\n\n        let hits = vec![\n            (Method::GET, \"/a//suffix\"),\n            (Method::GET, \"/a///suffix\"),\n            (Method::GET, \"/a///a//b///suffix\"),\n        ];\n        for (method, uri) in &hits {\n            assert_eq!(Match::Yes, greedy_label_spec.matches(&req(method, uri, None)));\n        }\n    }\n\n    // The rationale is that `/index` points to the `index` resource, but `/index/` points to \"the\n    // default resource under `index`\", for example `/index/index.html`, so trailing slashes at the\n    // end of URIs _do_ matter.\n    #[test]\n    fn empty_segments_at_the_end_do_matter() {\n        let misses = vec![\n            (Method::GET, \"/a/b/\"),\n            (Method::GET, \"/a/b//\"),\n            (Method::GET, \"//a//b////\"),\n        ];\n        for (method, uri) in &misses {\n            assert_eq!(Match::No, ab_spec().matches(&req(method, uri, None)));\n        }\n    }\n\n    #[test]\n    fn empty_segments_at_the_end_do_matter_label_spec() {\n        let label_spec = RequestSpec::from_parts(\n            Method::GET,\n            vec![PathSegment::Literal(String::from(\"a\")), PathSegment::Label],\n            Vec::new(),\n        );\n\n        let misses = vec![(Method::GET, \"/a\"), (Method::GET, \"/a//\"), (Method::GET, \"/a///\")];\n        for (method, uri) in &misses {\n            assert_eq!(Match::No, label_spec.matches(&req(method, uri, None)));\n        }\n\n        // In the second example, the label is bound to `\"\"`.\n        let hits = vec![(Method::GET, \"/a/label\"), (Method::GET, \"/a/\")];\n        for (method, uri) in &hits {\n            assert_eq!(Match::Yes, label_spec.matches(&req(method, uri, None)));\n        }\n    }\n\n    #[test]\n    fn unsanitary_path() {\n        let spec = RequestSpec::from_parts(\n            Method::GET,\n            vec![\n                PathSegment::Literal(String::from(\"ReDosLiteral\")),\n                PathSegment::Label,\n                PathSegment::Literal(String::from(\"(a+)+\")),\n            ],\n            Vec::new(),\n        );\n\n        assert_eq!(\n            Match::Yes,\n            spec.matches(&req(&Method::GET, \"/ReDosLiteral/abc/(a+)+\", None))\n        );\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/src/routing/route.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n// This code was copied and then modified from Tokio's Axum.\n\n/* Copyright (c) 2021 Tower Contributors\n *\n * Permission is hereby granted, free of charge, to any\n * person obtaining a copy of this software and associated\n * documentation files (the \"Software\"), to deal in the\n * Software without restriction, including without\n * limitation the rights to use, copy, modify, merge,\n * publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software\n * is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice\n * shall be included in all copies or substantial portions\n * of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF\n * ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED\n * TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A\n * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT\n * SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR\n * IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\n * DEALINGS IN THE SOFTWARE.\n */\n\nuse crate::body::BoxBody;\nuse http::{Request, Response};\nuse std::{\n    convert::Infallible,\n    fmt,\n    future::Future,\n    pin::Pin,\n    task::{Context, Poll},\n};\nuse tower::{\n    util::{BoxCloneService, Oneshot},\n    Service, ServiceExt,\n};\n\n/// A HTTP [`Service`] representing a single route.\n///\n/// The construction of [`Route`] from a named HTTP [`Service`] `S`, erases the type of `S`.\npub struct Route<B = hyper::body::Incoming> {\n    service: BoxCloneService<Request<B>, Response<BoxBody>, Infallible>,\n}\n\nimpl<B> Route<B> {\n    /// Constructs a new [`Route`] from a well-formed HTTP service which is cloneable.\n    pub fn new<T>(svc: T) -> Self\n    where\n        T: Service<Request<B>, Response = Response<BoxBody>, Error = Infallible> + Clone + Send + 'static,\n        T::Future: Send + 'static,\n    {\n        Self {\n            service: BoxCloneService::new(svc),\n        }\n    }\n}\n\nimpl<ReqBody> Clone for Route<ReqBody> {\n    fn clone(&self) -> Self {\n        Self {\n            service: self.service.clone(),\n        }\n    }\n}\n\nimpl<ReqBody> fmt::Debug for Route<ReqBody> {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        f.debug_struct(\"Route\").finish()\n    }\n}\n\nimpl<B> Service<Request<B>> for Route<B> {\n    type Response = Response<BoxBody>;\n    type Error = Infallible;\n    type Future = RouteFuture<B>;\n\n    #[inline]\n    fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {\n        Poll::Ready(Ok(()))\n    }\n\n    #[inline]\n    fn call(&mut self, req: Request<B>) -> Self::Future {\n        RouteFuture::new(self.service.clone().oneshot(req))\n    }\n}\n\npin_project_lite::pin_project! {\n    /// Response future for [`Route`].\n    pub struct RouteFuture<B> {\n        #[pin]\n        future: Oneshot<BoxCloneService<Request<B>, Response<BoxBody>, Infallible>, Request<B>>,\n    }\n}\n\nimpl<B> RouteFuture<B> {\n    pub(crate) fn new(future: Oneshot<BoxCloneService<Request<B>, Response<BoxBody>, Infallible>, Request<B>>) -> Self {\n        RouteFuture { future }\n    }\n}\n\nimpl<B> Future for RouteFuture<B> {\n    type Output = Result<Response<BoxBody>, Infallible>;\n\n    #[inline]\n    fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {\n        self.project().future.poll(cx)\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n\n    #[test]\n    fn traits() {\n        use crate::test_helpers::*;\n\n        assert_send::<Route<()>>();\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/src/routing/tiny_map.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::{borrow::Borrow, collections::HashMap, hash::Hash};\n\n/// A map implementation with fast iteration which switches backing storage from [`Vec`] to\n/// [`HashMap`] when the number of entries exceeds `CUTOFF`.\n#[derive(Clone, Debug)]\npub struct TinyMap<K, V, const CUTOFF: usize> {\n    inner: TinyMapInner<K, V, CUTOFF>,\n}\n\n#[derive(Clone, Debug)]\nenum TinyMapInner<K, V, const CUTOFF: usize> {\n    Vec(Vec<(K, V)>),\n    HashMap(HashMap<K, V>),\n}\n\nenum OrIterator<Left, Right> {\n    Left(Left),\n    Right(Right),\n}\n\nimpl<Left, Right> Iterator for OrIterator<Left, Right>\nwhere\n    Left: Iterator,\n    Right: Iterator<Item = Left::Item>,\n{\n    type Item = Left::Item;\n\n    fn next(&mut self) -> Option<Self::Item> {\n        match self {\n            Self::Left(left) => left.next(),\n            Self::Right(right) => right.next(),\n        }\n    }\n}\n\n/// An owning iterator over the entries of a `TinyMap`.\n///\n/// This struct is created by the [`into_iter`](IntoIterator::into_iter) method on [`TinyMap`] (\n/// provided by the [`IntoIterator`] trait). See its documentation for more.\npub struct IntoIter<K, V> {\n    inner: OrIterator<std::vec::IntoIter<(K, V)>, std::collections::hash_map::IntoIter<K, V>>,\n}\n\nimpl<K, V> Iterator for IntoIter<K, V> {\n    type Item = (K, V);\n\n    fn next(&mut self) -> Option<Self::Item> {\n        self.inner.next()\n    }\n}\n\nimpl<K, V, const CUTOFF: usize> IntoIterator for TinyMap<K, V, CUTOFF> {\n    type Item = (K, V);\n\n    type IntoIter = IntoIter<K, V>;\n\n    fn into_iter(self) -> Self::IntoIter {\n        let inner = match self.inner {\n            TinyMapInner::Vec(vec) => OrIterator::Left(vec.into_iter()),\n            TinyMapInner::HashMap(hash_map) => OrIterator::Right(hash_map.into_iter()),\n        };\n        IntoIter { inner }\n    }\n}\n\nimpl<K, V, const CUTOFF: usize> FromIterator<(K, V)> for TinyMap<K, V, CUTOFF>\nwhere\n    K: Hash + Eq,\n{\n    fn from_iter<T: IntoIterator<Item = (K, V)>>(iter: T) -> Self {\n        let mut vec = Vec::with_capacity(CUTOFF);\n        let mut iter = iter.into_iter().enumerate();\n\n        // Populate the `Vec`\n        while let Some((index, pair)) = iter.next() {\n            vec.push(pair);\n\n            // If overflow `CUTOFF` then return a `HashMap` instead\n            if index == CUTOFF {\n                let inner = TinyMapInner::HashMap(vec.into_iter().chain(iter.map(|(_, pair)| pair)).collect());\n                return TinyMap { inner };\n            }\n        }\n\n        TinyMap {\n            inner: TinyMapInner::Vec(vec),\n        }\n    }\n}\n\nimpl<K, V, const CUTOFF: usize> TinyMap<K, V, CUTOFF>\nwhere\n    K: Eq + Hash,\n{\n    /// Returns a reference to the value corresponding to the key.\n    ///\n    /// The key may be borrowed form of map's key type, but [`Hash`] and [`Eq`] on the borrowed\n    /// form _must_ match those for the key type.\n    pub fn get<Q>(&self, key: &Q) -> Option<&V>\n    where\n        K: Borrow<Q>,\n        Q: Hash + Eq + ?Sized,\n    {\n        match &self.inner {\n            TinyMapInner::Vec(vec) => vec\n                .iter()\n                .find(|(key_inner, _)| key_inner.borrow() == key)\n                .map(|(_, value)| value),\n            TinyMapInner::HashMap(hash_map) => hash_map.get(key),\n        }\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n\n    const CUTOFF: usize = 5;\n\n    const SMALL_VALUES: [(&str, usize); 3] = [(\"a\", 0), (\"b\", 1), (\"c\", 2)];\n    const MEDIUM_VALUES: [(&str, usize); 5] = [(\"a\", 0), (\"b\", 1), (\"c\", 2), (\"d\", 3), (\"e\", 4)];\n    const LARGE_VALUES: [(&str, usize); 10] = [\n        (\"a\", 0),\n        (\"b\", 1),\n        (\"c\", 2),\n        (\"d\", 3),\n        (\"e\", 4),\n        (\"f\", 5),\n        (\"g\", 6),\n        (\"h\", 7),\n        (\"i\", 8),\n        (\"j\", 9),\n    ];\n\n    #[test]\n    fn collect_small() {\n        let tiny_map: TinyMap<_, _, CUTOFF> = SMALL_VALUES.into_iter().collect();\n        assert!(matches!(tiny_map.inner, TinyMapInner::Vec(_)))\n    }\n\n    #[test]\n    fn collect_medium() {\n        let tiny_map: TinyMap<_, _, CUTOFF> = MEDIUM_VALUES.into_iter().collect();\n        assert!(matches!(tiny_map.inner, TinyMapInner::Vec(_)))\n    }\n\n    #[test]\n    fn collect_large() {\n        let tiny_map: TinyMap<_, _, CUTOFF> = LARGE_VALUES.into_iter().collect();\n        assert!(matches!(tiny_map.inner, TinyMapInner::HashMap(_)))\n    }\n\n    #[test]\n    fn get_small_success() {\n        let tiny_map: TinyMap<_, _, CUTOFF> = SMALL_VALUES.into_iter().collect();\n        SMALL_VALUES.into_iter().for_each(|(op, val)| {\n            assert_eq!(tiny_map.get(op), Some(&val));\n        });\n    }\n\n    #[test]\n    fn get_medium_success() {\n        let tiny_map: TinyMap<_, _, CUTOFF> = MEDIUM_VALUES.into_iter().collect();\n        MEDIUM_VALUES.into_iter().for_each(|(op, val)| {\n            assert_eq!(tiny_map.get(op), Some(&val));\n        });\n    }\n\n    #[test]\n    fn get_large_success() {\n        let tiny_map: TinyMap<_, _, CUTOFF> = LARGE_VALUES.into_iter().collect();\n        LARGE_VALUES.into_iter().for_each(|(op, val)| {\n            assert_eq!(tiny_map.get(op), Some(&val));\n        });\n    }\n\n    #[test]\n    fn get_small_fail() {\n        let tiny_map: TinyMap<_, _, CUTOFF> = SMALL_VALUES.into_iter().collect();\n        assert_eq!(tiny_map.get(\"x\"), None)\n    }\n\n    #[test]\n    fn get_medium_fail() {\n        let tiny_map: TinyMap<_, _, CUTOFF> = MEDIUM_VALUES.into_iter().collect();\n        assert_eq!(tiny_map.get(\"y\"), None)\n    }\n\n    #[test]\n    fn get_large_fail() {\n        let tiny_map: TinyMap<_, _, CUTOFF> = LARGE_VALUES.into_iter().collect();\n        assert_eq!(tiny_map.get(\"z\"), None)\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/src/runtime_error.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/// A _protocol-agnostic_ type representing an internal framework error. As of writing, this can only\n/// occur upon failure to extract an [`crate::extension::Extension`] from the request.\n/// This type is converted into protocol-specific error variants. For example, in the\n/// [`crate::protocol::rest_json_1`] protocol, it is converted to the\n/// [`crate::protocol::rest_json_1::runtime_error::RuntimeError::InternalFailure`] variant.\npub struct InternalFailureException;\n\npub const INVALID_HTTP_RESPONSE_FOR_RUNTIME_ERROR_PANIC_MESSAGE: &str = \"invalid HTTP response for `RuntimeError`; please file a bug report under https://github.com/smithy-lang/smithy-rs/issues\";\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/src/serve/listener.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n//! Portions of the implementation are adapted from axum\n//! (<https://github.com/tokio-rs/axum>), which is licensed under the MIT License.\n//! Copyright (c) 2019 Axum Contributors\n\nuse std::{\n    fmt,\n    future::Future,\n    pin::Pin,\n    sync::Arc,\n    task::{Context, Poll},\n    time::Duration,\n};\n\nuse pin_project_lite::pin_project;\nuse tokio::{\n    io::{self, AsyncRead, AsyncWrite},\n    net::{TcpListener, TcpStream},\n    sync::{OwnedSemaphorePermit, Semaphore},\n};\n\n/// Types that can listen for connections.\npub trait Listener: Send + 'static {\n    /// The listener's IO type.\n    type Io: AsyncRead + AsyncWrite + Unpin + Send + 'static;\n\n    /// The listener's address type.\n    type Addr: Send;\n\n    /// Accept a new incoming connection to this listener.\n    ///\n    /// If the underlying accept call can return an error, this function must\n    /// take care of logging and retrying.\n    fn accept(&mut self) -> impl Future<Output = (Self::Io, Self::Addr)> + Send;\n\n    /// Returns the local address that this listener is bound to.\n    fn local_addr(&self) -> io::Result<Self::Addr>;\n}\n\nimpl Listener for TcpListener {\n    type Io = TcpStream;\n    type Addr = std::net::SocketAddr;\n\n    async fn accept(&mut self) -> (Self::Io, Self::Addr) {\n        loop {\n            match Self::accept(self).await {\n                Ok(tup) => return tup,\n                Err(e) => handle_accept_error(e).await,\n            }\n        }\n    }\n\n    #[inline]\n    fn local_addr(&self) -> io::Result<Self::Addr> {\n        Self::local_addr(self)\n    }\n}\n\n#[cfg(unix)]\nimpl Listener for tokio::net::UnixListener {\n    type Io = tokio::net::UnixStream;\n    type Addr = tokio::net::unix::SocketAddr;\n\n    async fn accept(&mut self) -> (Self::Io, Self::Addr) {\n        loop {\n            match Self::accept(self).await {\n                Ok(tup) => return tup,\n                Err(e) => handle_accept_error(e).await,\n            }\n        }\n    }\n\n    #[inline]\n    fn local_addr(&self) -> io::Result<Self::Addr> {\n        Self::local_addr(self)\n    }\n}\n\n/// Extensions to [`Listener`].\npub trait ListenerExt: Listener + Sized {\n    /// Limit the number of concurrent connections. Once the limit has\n    /// been reached, no additional connections will be accepted until\n    /// an existing connection is closed. Listener implementations will\n    /// typically continue to queue incoming connections, up to an OS\n    /// and implementation-specific listener backlog limit.\n    ///\n    /// Compare [`tower::limit::concurrency`], which provides ways to\n    /// limit concurrent in-flight requests, but does not limit connections\n    /// that are idle or in the process of sending request headers.\n    ///\n    /// [`tower::limit::concurrency`]: https://docs.rs/tower/latest/tower/limit/concurrency/\n    fn limit_connections(self, limit: usize) -> ConnLimiter<Self> {\n        ConnLimiter {\n            listener: self,\n            sem: Arc::new(Semaphore::new(limit)),\n        }\n    }\n\n    /// Run a mutable closure on every accepted `Io`.\n    ///\n    /// # Example\n    ///\n    /// ```\n    /// use tokio::net::TcpListener;\n    /// use aws_smithy_http_server::serve::ListenerExt;\n    /// use tracing::trace;\n    ///\n    /// # async {\n    /// let listener = TcpListener::bind(\"0.0.0.0:3000\")\n    ///     .await\n    ///     .unwrap()\n    ///     .tap_io(|tcp_stream| {\n    ///         if let Err(err) = tcp_stream.set_nodelay(true) {\n    ///             trace!(\"failed to set TCP_NODELAY on incoming connection: {err:#}\");\n    ///         }\n    ///     });\n    /// # };\n    /// ```\n    fn tap_io<F>(self, tap_fn: F) -> TapIo<Self, F>\n    where\n        F: FnMut(&mut Self::Io) + Send + 'static,\n    {\n        TapIo { listener: self, tap_fn }\n    }\n}\n\nimpl<L: Listener> ListenerExt for L {}\n\n/// Return type of [`ListenerExt::limit_connections`].\n///\n/// See that method for details.\n#[derive(Debug)]\npub struct ConnLimiter<T> {\n    listener: T,\n    sem: Arc<Semaphore>,\n}\n\nimpl<T: Listener> Listener for ConnLimiter<T> {\n    type Io = ConnLimiterIo<T::Io>;\n    type Addr = T::Addr;\n\n    async fn accept(&mut self) -> (Self::Io, Self::Addr) {\n        let permit = self\n            .sem\n            .clone()\n            .acquire_owned()\n            .await\n            .expect(\"semaphore should never be closed\");\n        let (io, addr) = self.listener.accept().await;\n        (ConnLimiterIo { io, permit }, addr)\n    }\n\n    fn local_addr(&self) -> tokio::io::Result<Self::Addr> {\n        self.listener.local_addr()\n    }\n}\n\npin_project! {\n    /// A connection counted by [`ConnLimiter`].\n    ///\n    /// See [`ListenerExt::limit_connections`] for details.\n    #[derive(Debug)]\n    pub struct ConnLimiterIo<T> {\n        #[pin]\n        io: T,\n        permit: OwnedSemaphorePermit,\n    }\n}\n\n// Simply forward implementation to `io` field.\nimpl<T: AsyncRead> AsyncRead for ConnLimiterIo<T> {\n    fn poll_read(self: Pin<&mut Self>, cx: &mut Context<'_>, buf: &mut tokio::io::ReadBuf<'_>) -> Poll<io::Result<()>> {\n        self.project().io.poll_read(cx, buf)\n    }\n}\n\n// Simply forward implementation to `io` field.\nimpl<T: AsyncWrite> AsyncWrite for ConnLimiterIo<T> {\n    fn is_write_vectored(&self) -> bool {\n        self.io.is_write_vectored()\n    }\n\n    fn poll_flush(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<io::Result<()>> {\n        self.project().io.poll_flush(cx)\n    }\n\n    fn poll_shutdown(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<io::Result<()>> {\n        self.project().io.poll_shutdown(cx)\n    }\n\n    fn poll_write(self: Pin<&mut Self>, cx: &mut Context<'_>, buf: &[u8]) -> Poll<io::Result<usize>> {\n        self.project().io.poll_write(cx, buf)\n    }\n\n    fn poll_write_vectored(\n        self: Pin<&mut Self>,\n        cx: &mut Context<'_>,\n        bufs: &[std::io::IoSlice<'_>],\n    ) -> Poll<io::Result<usize>> {\n        self.project().io.poll_write_vectored(cx, bufs)\n    }\n}\n\n/// Return type of [`ListenerExt::tap_io`].\n///\n/// See that method for details.\npub struct TapIo<L, F> {\n    listener: L,\n    tap_fn: F,\n}\n\nimpl<L, F> fmt::Debug for TapIo<L, F>\nwhere\n    L: Listener + fmt::Debug,\n{\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        f.debug_struct(\"TapIo\")\n            .field(\"listener\", &self.listener)\n            .finish_non_exhaustive()\n    }\n}\n\nimpl<L, F> Listener for TapIo<L, F>\nwhere\n    L: Listener,\n    F: FnMut(&mut L::Io) + Send + 'static,\n{\n    type Io = L::Io;\n    type Addr = L::Addr;\n\n    async fn accept(&mut self) -> (Self::Io, Self::Addr) {\n        let (mut io, addr) = self.listener.accept().await;\n        (self.tap_fn)(&mut io);\n        (io, addr)\n    }\n\n    fn local_addr(&self) -> io::Result<Self::Addr> {\n        self.listener.local_addr()\n    }\n}\n\nasync fn handle_accept_error(e: io::Error) {\n    if is_connection_error(&e) {\n        return;\n    }\n\n    // [From `hyper::Server` in 0.14](https://github.com/hyperium/hyper/blob/v0.14.27/src/server/tcp.rs#L186)\n    //\n    // > A possible scenario is that the process has hit the max open files\n    // > allowed, and so trying to accept a new connection will fail with\n    // > `EMFILE`. In some cases, it's preferable to just wait for some time, if\n    // > the application will likely close some files (or connections), and try\n    // > to accept the connection again. If this option is `true`, the error\n    // > will be logged at the `error` level, since it is still a big deal,\n    // > and then the listener will sleep for 1 second.\n    //\n    // hyper allowed customizing this but axum does not.\n    tracing::error!(\"accept error: {e}\");\n    tokio::time::sleep(Duration::from_secs(1)).await;\n}\n\nfn is_connection_error(e: &io::Error) -> bool {\n    matches!(\n        e.kind(),\n        io::ErrorKind::ConnectionRefused | io::ErrorKind::ConnectionAborted | io::ErrorKind::ConnectionReset\n    )\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/src/serve/mod.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Serve utilities for running HTTP servers.\n//!\n//! This module provides a convenient [`serve`] function similar to `axum::serve`\n//! for easily serving Tower services with Hyper.\n//!\n//! ## When to Use This Module\n//!\n//! - Use [`serve`] when you need a simple, batteries-included HTTP server\n//! - For more control over the Hyper connection builder, use [`.configure_hyper()`](Serve::configure_hyper)\n//! - For Lambda environments, see the `aws-lambda` feature and `routing::lambda_handler`\n//!\n//! ## How It Works\n//!\n//! The `serve` function creates a connection acceptance loop that:\n//!\n//! 1. **Accepts connections** via the [`Listener`] trait (e.g., [`TcpListener`](tokio::net::TcpListener))\n//! 2. **Creates per-connection services** by calling the `make_service` with [`IncomingStream`]\n//! 3. **Converts Tower services to Hyper** using `TowerToHyperService`\n//! 4. **Spawns a task** for each connection to handle HTTP requests\n//!\n//! ```text\n//! ┌─────────┐      ┌──────────────┐      ┌──────────────┐      ┌────────┐\n//! │Listener │─────▶│IncomingStream│─────▶│ make_service │─────▶│ Hyper  │\n//! │ accept  │      │ (io + addr)  │      │  (Tower)     │      │ spawn  │\n//! └─────────┘      └──────────────┘      └──────────────┘      └────────┘\n//! ```\n//!\n//! The [`IncomingStream`] provides connection metadata to the service factory,\n//! allowing per-connection customization based on remote address or IO type\n//!\n//! ## HTTP Protocol Selection\n//!\n//! By default, `serve` uses HTTP/1 with upgrade support, allowing clients to\n//! negotiate HTTP/2 via the HTTP/1.1 Upgrade mechanism or ALPN. The protocol is\n//! auto-detected for each connection.\n//!\n//! You can customize this behavior with [`.configure_hyper()`](Serve::configure_hyper):\n//!\n//! ```rust,ignore\n//! // Force HTTP/2 only (skips upgrade negotiation)\n//! serve(listener, app.into_make_service())\n//!     .configure_hyper(|builder| {\n//!         builder.http2_only()\n//!     })\n//!     .await?;\n//!\n//! // Force HTTP/1 only with keep-alive\n//! serve(listener, app.into_make_service())\n//!     .configure_hyper(|builder| {\n//!         builder.http1().keep_alive(true)\n//!     })\n//!     .await?;\n//! ```\n//!\n//! **Performance note**: When using `.http2_only()` or `.http1()`, the server skips\n//! the HTTP/1 upgrade preface reading, which can reduce connection setup latency.\n//!\n//! ## Graceful Shutdown\n//!\n//! Graceful shutdown is zero-cost when not used - no watch channels are allocated\n//! and no `tokio::select!` overhead is incurred. Call\n//! [`.with_graceful_shutdown(signal)`](Serve::with_graceful_shutdown) to enable it:\n//!\n//! ```ignore\n//! serve(listener, service)\n//!     .with_graceful_shutdown(async {\n//!         tokio::signal::ctrl_c().await.expect(\"failed to listen for Ctrl+C\");\n//!     })\n//!     .await\n//! ```\n//!\n//! This ensures in-flight requests complete before shutdown. Use\n//! [`.with_shutdown_timeout(duration)`](ServeWithGracefulShutdown::with_shutdown_timeout)\n//! to set a maximum wait time.\n//!\n//! ## Common Patterns\n//!\n//! ### Limiting Concurrent Connections\n//!\n//! Use [`ListenerExt::limit_connections`] to prevent resource exhaustion:\n//!\n//! ```rust,ignore\n//! use aws_smithy_http_server::serve::ListenerExt;\n//!\n//! let listener = TcpListener::bind(\"0.0.0.0:3000\")\n//!     .await?\n//!     .limit_connections(1000);  // Max 1000 concurrent connections\n//!\n//! serve(listener, app.into_make_service()).await?;\n//! ```\n//!\n//! ### Accessing Connection Information\n//!\n//! Use `.into_make_service_with_connect_info::<T>()` to access connection metadata\n//! in your handlers:\n//!\n//! ```rust,ignore\n//! use std::net::SocketAddr;\n//! use aws_smithy_http_server::request::connect_info::ConnectInfo;\n//!\n//! // In your handler:\n//! async fn my_handler(ConnectInfo(addr): ConnectInfo<SocketAddr>) -> String {\n//!     format!(\"Request from: {}\", addr)\n//! }\n//!\n//! // When serving:\n//! serve(\n//!     listener,\n//!     app.into_make_service_with_connect_info::<SocketAddr>()\n//! ).await?;\n//! ```\n//!\n//! ### Custom TCP Settings\n//!\n//! Use [`ListenerExt::tap_io`] to configure TCP options:\n//!\n//! ```rust,ignore\n//! use aws_smithy_http_server::serve::ListenerExt;\n//!\n//! let listener = TcpListener::bind(\"0.0.0.0:3000\")\n//!     .await?\n//!     .tap_io(|stream| {\n//!         let _ = stream.set_nodelay(true);\n//!     });\n//!\n//! serve(listener, app.into_make_service()).await?;\n//! ```\n//!\n//! ## Timeouts and Connection Management\n//!\n//! ### Available Timeout Types\n//!\n//! | Timeout Type | What It Does | How to Configure |\n//! |--------------|--------------|------------------|\n//! | **Header Read** | Time limit for reading HTTP headers | `.configure_hyper()` with `.http1().header_read_timeout()` |\n//! | **Request** | Time limit for processing one request | Tower's `TimeoutLayer` |\n//! | **Connection Duration** | Total connection lifetime limit | Custom accept loop with `tokio::time::timeout` |\n//! | **HTTP/2 Keep-Alive** | Idle timeout between HTTP/2 requests | `.configure_hyper()` with `.http2().keep_alive_*()` |\n//!\n//! **Examples:**\n//! - `examples/header_read_timeout.rs` - Configure header read timeout\n//! - `examples/request_timeout.rs` - Add request-level timeouts\n//! - `examples/custom_accept_loop.rs` - Implement connection duration limits\n//! - `examples/http2_keepalive.rs` - Configure HTTP/2 keep-alive\n//! - `examples/connection_limiting.rs` - Limit concurrent connections\n//! - `examples/request_concurrency_limiting.rs` - Limit concurrent requests\n//!\n//! ### Connection Duration vs Idle Timeout\n//!\n//! **Connection duration timeout**: Closes the connection after N seconds total, regardless of activity.\n//! Implemented with `tokio::time::timeout` wrapping the connection future.\n//!\n//! **Idle timeout**: Closes the connection only when inactive between requests.\n//! - HTTP/2: Available via `.keep_alive_interval()` and `.keep_alive_timeout()`\n//! - HTTP/1.1: Not available without modifying Hyper\n//!\n//! See `examples/custom_accept_loop.rs` for a working connection duration timeout example.\n//!\n//! ### Connection Limiting vs Request Limiting\n//!\n//! **Connection limiting** (`.limit_connections()`): Limits the number of TCP connections.\n//! Use this to prevent socket/file descriptor exhaustion.\n//!\n//! **Request limiting** (`ConcurrencyLimitLayer`): Limits in-flight requests.\n//! Use this to prevent work queue exhaustion. With HTTP/2, one connection can have multiple\n//! requests in flight simultaneously.\n//!\n//! Most applications should use both - they protect different layers.\n//!\n//! ## Troubleshooting\n//!\n//! ### Type Errors\n//!\n//! If you encounter complex error messages about trait bounds, check:\n//!\n//! 1. **Service Error Type**: Your service must have `Error = Infallible`\n//!    ```rust,ignore\n//!    // ✓ Correct - handlers return responses, not Results\n//!    async fn handler() -> Response<Body> { ... }\n//!\n//!    // ✗ Wrong - cannot use Result<Response, E>\n//!    async fn handler() -> Result<Response<Body>, MyError> { ... }\n//!    ```\n//!\n//! 2. **MakeService Wrapper**: Use the correct wrapper for your service:\n//!    ```rust,ignore\n//!    use aws_smithy_http_server::routing::IntoMakeService;\n//!\n//!    // For Smithy services:\n//!    app.into_make_service()\n//!\n//!    // For services with middleware:\n//!    IntoMakeService::new(service)\n//!    ```\n//!\n//! ### Graceful Shutdown Not Working\n//!\n//! If graceful shutdown doesn't wait for connections:\n//!\n//! - Ensure you call `.with_graceful_shutdown()` **before** `.await`\n//! - The signal future must be `Send + 'static`\n//! - Consider adding a timeout with `.with_shutdown_timeout()`\n//!\n//! ### Connection Limit Not Applied\n//!\n//! Remember that `.limit_connections()` applies to the listener **before** passing\n//! it to `serve()`:\n//!\n//! ```rust,ignore\n//! // ✓ Correct\n//! let listener = TcpListener::bind(\"0.0.0.0:3000\")\n//!     .await?\n//!     .limit_connections(100);\n//! serve(listener, app.into_make_service()).await?;\n//!\n//! // ✗ Wrong - limit_connections must be called on listener\n//! serve(TcpListener::bind(\"0.0.0.0:3000\").await?, app.into_make_service())\n//!     .limit_connections(100)  // This method doesn't exist on Serve\n//!     .await?;\n//! ```\n//!\n//! ## Advanced: Custom Connection Handling\n//!\n//! If you need per-connection customization (e.g., different Hyper settings based on\n//! the remote address), you can implement your own connection loop using the building\n//! blocks provided by this module:\n//!\n//! ```rust,ignore\n//! use aws_smithy_http_server::routing::IntoMakeService;\n//! use aws_smithy_http_server::serve::Listener;\n//! use hyper_util::rt::{TokioExecutor, TokioIo};\n//! use hyper_util::server::conn::auto::Builder;\n//! use hyper_util::service::TowerToHyperService;\n//! use tower::ServiceExt;\n//!\n//! let mut listener = tokio::net::TcpListener::bind(\"0.0.0.0:3000\").await?;\n//! let make_service = app.into_make_service_with_connect_info::<SocketAddr>();\n//!\n//! loop {\n//!     let (stream, remote_addr) = listener.accept().await?;\n//!     let io = TokioIo::new(stream);\n//!\n//!     // Per-connection Hyper configuration\n//!     let mut builder = Builder::new(TokioExecutor::new());\n//!     if remote_addr.ip().is_loopback() {\n//!         builder = builder.http2_only();  // Local connections use HTTP/2\n//!     } else {\n//!         builder = builder.http1().keep_alive(true);  // External use HTTP/1\n//!     }\n//!\n//!     let tower_service = make_service\n//!         .ready()\n//!         .await?\n//!         .call(IncomingStream { io: &io, remote_addr })\n//!         .await?;\n//!\n//!     let hyper_service = TowerToHyperService::new(tower_service);\n//!\n//!     tokio::spawn(async move {\n//!         if let Err(err) = builder.serve_connection(io, hyper_service).await {\n//!             eprintln!(\"Error serving connection: {}\", err);\n//!         }\n//!     });\n//! }\n//! ```\n//!\n//! This approach provides complete flexibility while still leveraging the efficient\n//! Hyper and Tower integration provided by this module.\n//!\n//! Portions of the implementation are adapted from axum\n//! (<https://github.com/tokio-rs/axum>), which is licensed under the MIT License.\n//! Copyright (c) 2019 Axum Contributors\n\nuse std::convert::Infallible;\nuse std::error::Error as StdError;\nuse std::fmt::{self, Debug};\nuse std::future::{Future, IntoFuture};\nuse std::io;\nuse std::marker::PhantomData;\nuse std::pin::Pin;\nuse std::sync::Arc;\nuse std::time::Duration;\n\nuse http_body::Body as HttpBody;\nuse hyper::body::Incoming;\nuse hyper_util::rt::{TokioExecutor, TokioIo};\nuse hyper_util::server::conn::auto::Builder;\nuse hyper_util::service::TowerToHyperService;\nuse tower::{Service, ServiceExt as _};\n\nmod listener;\n\npub use self::listener::{ConnLimiter, ConnLimiterIo, Listener, ListenerExt, TapIo};\n\n// ============================================================================\n// Type Bounds Documentation\n// ============================================================================\n//\n// ## Body Bounds (B)\n// HTTP response bodies must satisfy:\n// - `B: HttpBody + Send + 'static` - Implement the body trait and be sendable\n// - `B::Data: Send` - Data chunks must be sendable across threads\n// - `B::Error: Into<Box<dyn StdError + Send + Sync>>` - Errors must be convertible\n//\n// ## Service Bounds (S)\n//\n// The `S` type parameter represents a **per-connection HTTP service** - a Tower service\n// that handles individual HTTP requests and returns HTTP responses.\n//\n// Required bounds:\n// - `S: Service<http::Request<Incoming>, Response = http::Response<B>, Error = Infallible>`\n//\n//   This is the core Tower Service trait. It means:\n//   * **Input**: Takes an HTTP request with a streaming body (`Incoming` from Hyper)\n//   * **Output**: Returns an HTTP response with body type `B`\n//   * **Error**: Must be `Infallible`, meaning the service never returns errors at the\n//     Tower level. Any application errors must be converted into HTTP responses\n//     (e.g., 500 Internal Server Error) before reaching this layer.\n//\n// - `S: Clone + Send + 'static`\n//   * **Clone**: Each HTTP/1.1 or HTTP/2 connection may handle multiple requests\n//     sequentially or concurrently. The service must be cloneable so each request\n//     can get its own copy.\n//   * **Send**: The service will be moved into a spawned Tokio task, so it must be\n//     safe to send across thread boundaries.\n//   * **'static**: No borrowed references - the service must own all its data since\n//     it will outlive the connection setup phase.\n//\n// - `S::Future: Send`\n//   The future returned by `Service::call()` must also be `Send` so it can be\n//   polled from any thread in Tokio's thread pool.\n//\n// ## MakeService Bounds (M)\n//\n// The `M` type parameter represents a **service factory** - a Tower service that\n// creates a new `S` service for each incoming connection. This allows customizing\n// services based on connection metadata (remote address, TLS info, etc.).\n//\n// Connection Info → Service Factory → Per-Connection Service\n//\n// Required bounds:\n// - `M: for<'a> Service<IncomingStream<'a, L>, Error = Infallible, Response = S>`\n//\n//   This is the service factory itself:\n//   * **Input**: `IncomingStream<'a, L>` - A struct containing connection metadata:\n//     - `io: &'a TokioIo<L::Io>` - A borrowed reference to the connection's IO stream\n//     - `remote_addr: L::Addr` - The remote address of the client\n//\n//   * **Output**: Returns a new `S` service instance for this specific connection\n//\n//   * **Error**: Must be `Infallible` - service creation must never fail\n//\n//   * **Higher-Rank Trait Bound (`for<'a>`)**: The factory must work\n//     with `IncomingStream` that borrows the IO with *any* lifetime `'a`. This is\n//     necessary because the IO is borrowed only temporarily during service creation,\n//     and we don't know the specific lifetime at compile time.\n//\n// - `for<'a> <M as Service<IncomingStream<'a, L>>>::Future: Send`\n//\n//   The future returned by calling the make_service must be `Send` for any lifetime,\n//   so it can be awaited across threads while creating the service.\n//\n// ## Example Flow\n//\n// ```text\n// 1. Listener.accept() → (io, remote_addr)\n// 2. make_service.call(IncomingStream { io: &io, remote_addr }) → Future<Output = S>\n// 3. service.call(request) → Future<Output = Response>\n// 4. Repeat step 3 for each request on the connection\n// ```\n//\n// ## Why These Bounds Matter\n//\n// 1. **Services can be spawned onto Tokio tasks** (Send + 'static)\n// 2. **Multiple requests can be handled per connection** (Clone)\n// 3. **Error handling is infallible** - errors become HTTP responses, not Tower errors\n// 4. **The MakeService works with borrowed connection info** - via HRTB with IncomingStream\n//    This allows inspection of connection metadata without transferring ownership\n//\n// ============================================================================\n\n/// An incoming stream that bundles connection information.\n///\n/// This struct serves as the request type for the `make_service` Tower service,\n/// allowing it to access connection-level metadata when creating per-connection services.\n///\n/// # Purpose\n///\n/// In Tower/Hyper's model, `make_service` is called once per connection to create\n/// a service that handles all HTTP requests on that connection. `IncomingStream`\n/// provides the connection information needed to customize service creation based on:\n/// - The remote address (for logging or access control)\n/// - The underlying IO type (for protocol detection or configuration)\n///\n/// # Design\n///\n/// This type holds a **reference** to the IO rather than ownership because:\n/// - The actual IO is still needed by Hyper to serve the connection after `make_service` returns\n/// - The `make_service` only needs to inspect connection metadata, not take ownership\n///\n/// # Lifetime Safety\n///\n/// The lifetime `'a` ensures the reference to IO remains valid only during the\n/// `make_service.call()` invocation. After the service is created, the IO is\n/// moved into a spawned task to handle the connection. This is safe because:\n///\n/// ```text\n/// let io = TokioIo::new(stream);           // IO created\n/// let service = make_service.call(\n///     IncomingStream { io: &io, .. }       // Borrowed during call\n/// ).await;                                  // Borrow ends\n/// tokio::spawn(serve_connection(io, ..));  // IO moved to task\n/// ```\n///\n/// The borrow checker guarantees the reference doesn't outlive the IO object.\n///\n/// Used with [`serve`] and [`crate::routing::IntoMakeServiceWithConnectInfo`].\n#[derive(Debug)]\npub struct IncomingStream<'a, L>\nwhere\n    L: Listener,\n{\n    /// Reference to the IO for this connection\n    pub io: &'a TokioIo<L::Io>,\n    /// Remote address of the client\n    pub remote_addr: L::Addr,\n}\n\nimpl<L> IncomingStream<'_, L>\nwhere\n    L: Listener,\n{\n    /// Get a reference to the inner IO type.\n    pub fn io(&self) -> &L::Io {\n        self.io.inner()\n    }\n\n    /// Returns the remote address that this stream is bound to.\n    pub fn remote_addr(&self) -> &L::Addr {\n        &self.remote_addr\n    }\n}\n\n/// Serve the service with the supplied listener.\n///\n/// This implementation provides zero-cost abstraction for shutdown coordination.\n/// When graceful shutdown is not used, there is no runtime overhead - no watch channels\n/// are allocated and no `tokio::select!` is used.\n///\n/// It supports both HTTP/1 as well as HTTP/2.\n///\n/// This function accepts services wrapped with [`crate::routing::IntoMakeService`] or\n/// [`crate::routing::IntoMakeServiceWithConnectInfo`].\n///\n/// For generated Smithy services, use `.into_make_service()` or\n/// `.into_make_service_with_connect_info::<C>()`. For services wrapped with\n/// Tower middleware, use `IntoMakeService::new(service)`.\n///\n/// # Error Handling\n///\n/// Note that both `make_service` and the generated service must have `Error = Infallible`.\n/// This means:\n/// - Your service factory cannot fail when creating per-connection services\n/// - Your request handlers cannot return errors (use proper HTTP error responses instead)\n///\n/// If you need fallible service creation, consider handling errors within your\n/// `make_service` implementation and returning a service that produces error responses.\n///\n/// # Examples\n///\n/// Serving a Smithy service with a TCP listener:\n///\n/// ```rust,ignore\n/// use tokio::net::TcpListener;\n///\n/// let listener = TcpListener::bind(\"0.0.0.0:3000\").await.unwrap();\n/// aws_smithy_http_server::serve(listener, app.into_make_service()).await.unwrap();\n/// ```\n///\n/// Serving with middleware applied:\n///\n/// ```rust,ignore\n/// use tokio::net::TcpListener;\n/// use tower::Layer;\n/// use tower_http::timeout::TimeoutLayer;\n/// use http::StatusCode;\n/// use std::time::Duration;\n/// use aws_smithy_http_server::routing::IntoMakeService;\n///\n/// let app = /* ... build service ... */;\n/// let app = TimeoutLayer::new(Duration::from_secs(30)).layer(app);\n///\n/// let listener = TcpListener::bind(\"0.0.0.0:3000\").await.unwrap();\n/// aws_smithy_http_server::serve(listener, IntoMakeService::new(app)).await.unwrap();\n/// ```\n///\n/// For graceful shutdown:\n///\n/// ```rust,ignore\n/// use tokio::net::TcpListener;\n/// use tokio::signal;\n///\n/// let listener = TcpListener::bind(\"0.0.0.0:3000\").await.unwrap();\n/// aws_smithy_http_server::serve(listener, app.into_make_service())\n///     .with_graceful_shutdown(async {\n///         signal::ctrl_c().await.expect(\"failed to listen for Ctrl+C\");\n///     })\n///     .await\n///     .unwrap();\n/// ```\n///\n/// With connection info:\n///\n/// ```rust,ignore\n/// use tokio::net::TcpListener;\n/// use std::net::SocketAddr;\n///\n/// let listener = TcpListener::bind(\"0.0.0.0:3000\").await.unwrap();\n/// aws_smithy_http_server::serve(\n///     listener,\n///     app.into_make_service_with_connect_info::<SocketAddr>()\n/// )\n/// .await\n/// .unwrap();\n/// ```\npub fn serve<L, M, S, B>(listener: L, make_service: M) -> Serve<L, M, S, B>\nwhere\n    L: Listener,\n    // Body bounds: see module documentation for details\n    B: HttpBody + Send + 'static,\n    B::Data: Send,\n    B::Error: Into<Box<dyn StdError + Send + Sync>>,\n    // Service bounds: see module documentation for details\n    S: Service<http::Request<Incoming>, Response = http::Response<B>, Error = Infallible> + Clone + Send + 'static,\n    S::Future: Send,\n    // MakeService bounds: see module documentation for details\n    M: for<'a> Service<IncomingStream<'a, L>, Error = Infallible, Response = S>,\n{\n    Serve::new(listener, make_service)\n}\n\n/// A server future that serves HTTP connections.\n///\n/// This is the return type of [`serve`]. It implements [`IntoFuture`], so\n/// you can directly `.await` it:\n///\n/// ```ignore\n/// serve(listener, service).await?;\n/// ```\n///\n/// Before awaiting, you can configure it:\n/// - [`configure_hyper`](Self::configure_hyper) - Configure Hyper's connection builder\n/// - [`with_graceful_shutdown`](Self::with_graceful_shutdown) - Enable graceful shutdown\n/// - [`local_addr`](Self::local_addr) - Get the bound address\n///\n/// Created by [`serve`].\n#[must_use = \"Serve does nothing until you `.await` or call `.into_future()` on it\"]\npub struct Serve<L, M, S, B> {\n    listener: L,\n    make_service: M,\n    hyper_builder: Option<Arc<Builder<TokioExecutor>>>,\n    _marker: PhantomData<(S, B)>,\n}\n\nimpl<L, M, S, B> fmt::Debug for Serve<L, M, S, B>\nwhere\n    L: fmt::Debug,\n{\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        f.debug_struct(\"Serve\")\n            .field(\"listener\", &self.listener)\n            .field(\"has_hyper_config\", &self.hyper_builder.is_some())\n            .finish_non_exhaustive()\n    }\n}\n\nimpl<L, M, S, B> Serve<L, M, S, B>\nwhere\n    L: Listener,\n{\n    fn new(listener: L, make_service: M) -> Self {\n        Self {\n            listener,\n            make_service,\n            hyper_builder: None,\n            _marker: PhantomData,\n        }\n    }\n\n    /// Configure the underlying Hyper connection builder.\n    ///\n    /// This allows you to customize Hyper's HTTP/1 and HTTP/2 settings,\n    /// such as timeouts, max concurrent streams, keep-alive behavior, etc.\n    ///\n    /// The configuration is applied once and the configured builder is cloned\n    /// for each connection, providing optimal performance.\n    ///\n    /// # Example\n    ///\n    /// ```ignore\n    /// use std::time::Duration;\n    ///\n    /// serve(listener, service)\n    ///     .configure_hyper(|builder| {\n    ///         builder\n    ///             .http1()\n    ///             .keep_alive(true)\n    ///             .http2()\n    ///             .max_concurrent_streams(200)\n    ///     })\n    ///     .await?;\n    /// ```\n    ///\n    /// # Advanced: Per-Connection Configuration\n    ///\n    /// If you need per-connection customization (e.g., different settings based on\n    /// the remote address), you can implement your own connection loop. See the\n    /// module-level documentation for examples.\n    pub fn configure_hyper<F>(mut self, f: F) -> Self\n    where\n        F: FnOnce(\n            hyper_util::server::conn::auto::Builder<hyper_util::rt::TokioExecutor>,\n        ) -> hyper_util::server::conn::auto::Builder<hyper_util::rt::TokioExecutor>,\n    {\n        let builder = Builder::new(TokioExecutor::new());\n        self.hyper_builder = Some(Arc::new(f(builder)));\n        self\n    }\n\n    /// Enable graceful shutdown for the server.\n    pub fn with_graceful_shutdown<F>(self, signal: F) -> ServeWithGracefulShutdown<L, M, S, F, B>\n    where\n        F: Future<Output = ()> + Send + 'static,\n    {\n        ServeWithGracefulShutdown::new(self.listener, self.make_service, signal, self.hyper_builder)\n    }\n\n    /// Returns the local address this server is bound to.\n    pub fn local_addr(&self) -> io::Result<L::Addr> {\n        self.listener.local_addr()\n    }\n}\n\n/// Macro to create an accept loop without graceful shutdown.\n///\n/// Accepts connections in a loop and handles them with the connection handler.\nmacro_rules! accept_loop {\n    ($listener:expr, $make_service:expr, $hyper_builder:expr) => {\n        loop {\n            let (io, remote_addr) = $listener.accept().await;\n            handle_connection::<L, M, S, B>(&mut $make_service, io, remote_addr, $hyper_builder.as_ref(), true, None)\n                .await;\n        }\n    };\n}\n\n/// Macro to create an accept loop with graceful shutdown support.\n///\n/// Accepts connections in a loop with a shutdown signal that can interrupt the loop.\n/// Uses `tokio::select!` to race between accepting new connections and receiving the\n/// shutdown signal.\nmacro_rules! accept_loop_with_shutdown {\n    ($listener:expr, $make_service:expr, $hyper_builder:expr, $signal:expr, $graceful:expr) => {\n        loop {\n            tokio::select! {\n                result = $listener.accept() => {\n                    let (io, remote_addr) = result;\n                    handle_connection::<L, M, S, B>(\n                        &mut $make_service,\n                        io,\n                        remote_addr,\n                        $hyper_builder.as_ref(),\n                        true,\n                        Some(&$graceful),\n                    )\n                    .await;\n                }\n                _ = $signal.as_mut() => {\n                    tracing::trace!(\"received graceful shutdown signal, not accepting new connections\");\n                    break;\n                }\n            }\n        }\n    };\n}\n\n// Implement IntoFuture so we can await Serve directly\nimpl<L, M, S, B> IntoFuture for Serve<L, M, S, B>\nwhere\n    L: Listener,\n    L::Addr: Debug,\n    // Body bounds\n    B: HttpBody + Send + 'static,\n    B::Data: Send,\n    B::Error: Into<Box<dyn StdError + Send + Sync>>,\n    // Service bounds\n    S: Service<http::Request<Incoming>, Response = http::Response<B>, Error = Infallible> + Clone + Send + 'static,\n    S::Future: Send,\n    // MakeService bounds\n    M: for<'a> Service<IncomingStream<'a, L>, Error = Infallible, Response = S> + Send + 'static,\n    for<'a> <M as Service<IncomingStream<'a, L>>>::Future: Send,\n{\n    type Output = io::Result<()>;\n    type IntoFuture = Pin<Box<dyn Future<Output = io::Result<()>> + Send>>;\n\n    fn into_future(self) -> Self::IntoFuture {\n        Box::pin(async move {\n            let Self {\n                mut listener,\n                mut make_service,\n                hyper_builder,\n                _marker,\n            } = self;\n\n            accept_loop!(listener, make_service, hyper_builder)\n        })\n    }\n}\n\n/// A server future with graceful shutdown enabled.\n///\n/// This type is created by calling [`Serve::with_graceful_shutdown`]. It implements\n/// [`IntoFuture`], so you can directly `.await` it.\n///\n/// When the shutdown signal completes, the server will:\n/// 1. Stop accepting new connections\n/// 2. Wait for all in-flight requests to complete (or until timeout if configured)\n/// 3. Return once all connections are closed\n///\n/// Configure the shutdown timeout with [`with_shutdown_timeout`](Self::with_shutdown_timeout).\n///\n/// Created by [`Serve::with_graceful_shutdown`].\n#[must_use = \"ServeWithGracefulShutdown does nothing until you `.await` or call `.into_future()` on it\"]\npub struct ServeWithGracefulShutdown<L, M, S, F, B> {\n    listener: L,\n    make_service: M,\n    signal: F,\n    hyper_builder: Option<Arc<Builder<TokioExecutor>>>,\n    shutdown_timeout: Option<Duration>,\n    _marker: PhantomData<(S, B)>,\n}\n\nimpl<L, M, S, F, B> fmt::Debug for ServeWithGracefulShutdown<L, M, S, F, B>\nwhere\n    L: Listener + fmt::Debug,\n{\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        f.debug_struct(\"ServeWithGracefulShutdown\")\n            .field(\"listener\", &self.listener)\n            .field(\"has_hyper_config\", &self.hyper_builder.is_some())\n            .field(\"shutdown_timeout\", &self.shutdown_timeout)\n            .finish_non_exhaustive()\n    }\n}\n\nimpl<L: Listener, M, S, F, B> ServeWithGracefulShutdown<L, M, S, F, B> {\n    fn new(listener: L, make_service: M, signal: F, hyper_builder: Option<Arc<Builder<TokioExecutor>>>) -> Self\n    where\n        F: Future<Output = ()> + Send + 'static,\n    {\n        Self {\n            listener,\n            make_service,\n            signal,\n            hyper_builder,\n            shutdown_timeout: None,\n            _marker: PhantomData,\n        }\n    }\n\n    /// Set a timeout for graceful shutdown.\n    ///\n    /// If the timeout expires before all connections complete, a warning is logged\n    /// and the server returns successfully. Note that this does **not** forcibly\n    /// terminate connections - it only stops waiting for them.\n    ///\n    /// # Example\n    ///\n    /// ```rust,ignore\n    /// use std::time::Duration;\n    ///\n    /// serve(listener, app.into_make_service())\n    ///     .with_graceful_shutdown(shutdown_signal())\n    ///     .with_shutdown_timeout(Duration::from_secs(30))\n    ///     .await?;  // Returns Ok(()) even if timeout expires\n    /// ```\n    pub fn with_shutdown_timeout(mut self, timeout: Duration) -> Self {\n        self.shutdown_timeout = Some(timeout);\n        self\n    }\n\n    /// Returns the local address this server is bound to.\n    pub fn local_addr(&self) -> io::Result<L::Addr> {\n        self.listener.local_addr()\n    }\n}\n\n// Implement IntoFuture so we can await WithGracefulShutdown directly\nimpl<L, M, S, F, B> IntoFuture for ServeWithGracefulShutdown<L, M, S, F, B>\nwhere\n    L: Listener,\n    L::Addr: Debug,\n    // Body bounds\n    B: HttpBody + Send + 'static,\n    B::Data: Send,\n    B::Error: Into<Box<dyn StdError + Send + Sync>>,\n    // Service bounds\n    S: Service<http::Request<Incoming>, Response = http::Response<B>, Error = Infallible> + Clone + Send + 'static,\n    S::Future: Send,\n    // MakeService bounds\n    M: for<'a> Service<IncomingStream<'a, L>, Error = Infallible, Response = S> + Send + 'static,\n    for<'a> <M as Service<IncomingStream<'a, L>>>::Future: Send,\n    // Shutdown signal\n    F: Future<Output = ()> + Send + 'static,\n{\n    type Output = io::Result<()>;\n    type IntoFuture = Pin<Box<dyn Future<Output = io::Result<()>> + Send>>;\n\n    fn into_future(self) -> Self::IntoFuture {\n        Box::pin(async move {\n            let Self {\n                mut listener,\n                mut make_service,\n                signal,\n                hyper_builder,\n                shutdown_timeout,\n                _marker,\n            } = self;\n\n            // Initialize graceful shutdown\n            let graceful = hyper_util::server::graceful::GracefulShutdown::new();\n            let mut signal = std::pin::pin!(signal);\n\n            accept_loop_with_shutdown!(listener, make_service, hyper_builder, signal, graceful);\n\n            drop(listener);\n\n            tracing::trace!(\"waiting for in-flight connections to finish\");\n\n            // Wait for all in-flight connections (with optional timeout)\n            match shutdown_timeout {\n                Some(timeout) => match tokio::time::timeout(timeout, graceful.shutdown()).await {\n                    Ok(_) => {\n                        tracing::trace!(\"all in-flight connections completed during graceful shutdown\");\n                    }\n                    Err(_) => {\n                        tracing::warn!(\n                            timeout_secs = timeout.as_secs(),\n                            \"graceful shutdown timeout expired, some connections may not have completed\"\n                        );\n                    }\n                },\n                None => {\n                    graceful.shutdown().await;\n                    tracing::trace!(\"all in-flight connections completed during graceful shutdown\");\n                }\n            }\n\n            Ok(())\n        })\n    }\n}\n\n/// Connection handling function.\n///\n/// Handles connections by using runtime branching on `use_upgrades` and optional\n/// `graceful` shutdown.\nasync fn handle_connection<L, M, S, B>(\n    make_service: &mut M,\n    conn_io: <L as Listener>::Io,\n    remote_addr: <L as Listener>::Addr,\n    hyper_builder: Option<&Arc<Builder<TokioExecutor>>>,\n    use_upgrades: bool,\n    graceful: Option<&hyper_util::server::graceful::GracefulShutdown>,\n) where\n    L: Listener,\n    L::Addr: Debug,\n    // Body bounds\n    B: HttpBody + Send + 'static,\n    B::Data: Send,\n    B::Error: Into<Box<dyn StdError + Send + Sync>>,\n    // Service bounds\n    S: Service<http::Request<Incoming>, Response = http::Response<B>, Error = Infallible> + Clone + Send + 'static,\n    S::Future: Send,\n    // MakeService bounds\n    M: for<'a> Service<IncomingStream<'a, L>, Error = Infallible, Response = S> + Send + 'static,\n    for<'a> <M as Service<IncomingStream<'a, L>>>::Future: Send,\n{\n    let watcher = graceful.map(|g| g.watcher());\n    let tokio_io = TokioIo::new(conn_io);\n\n    tracing::trace!(\"connection {remote_addr:?} accepted\");\n\n    make_service\n        .ready()\n        .await\n        .expect(\"make_service error type is Infallible and cannot fail\");\n\n    let tower_service = make_service\n        .call(IncomingStream {\n            io: &tokio_io,\n            remote_addr,\n        })\n        .await\n        .expect(\"make_service error type is Infallible and cannot fail\");\n\n    let hyper_service = TowerToHyperService::new(tower_service);\n\n    // Clone the Arc (cheap - just increments refcount) or create a default builder\n    let builder = hyper_builder\n        .map(Arc::clone)\n        .unwrap_or_else(|| Arc::new(Builder::new(TokioExecutor::new())));\n\n    tokio::spawn(async move {\n        let result = if use_upgrades {\n            // Auto-detect mode - use with_upgrades for HTTP/1 upgrade support\n            let conn = builder.serve_connection_with_upgrades(tokio_io, hyper_service);\n            if let Some(watcher) = watcher {\n                watcher.watch(conn).await\n            } else {\n                conn.await\n            }\n        } else {\n            // Protocol is already decided (http1_only or http2_only) - skip preface reading\n            let conn = builder.serve_connection(tokio_io, hyper_service);\n            if let Some(watcher) = watcher {\n                watcher.watch(conn).await\n            } else {\n                conn.await\n            }\n        };\n\n        if let Err(err) = result {\n            tracing::trace!(error = ?err, \"failed to serve connection\");\n        }\n    });\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/src/service.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! The shape of a [Smithy service] is modelled by the [`ServiceShape`] trait. Its associated types\n//! [`ServiceShape::ID`], [`ServiceShape::VERSION`], [`ServiceShape::Protocol`], and [`ServiceShape::Operations`] map\n//! to the services [Shape ID](https://smithy.io/2.0/spec/model.html#shape-id), the version field, the applied\n//! [protocol trait](https://smithy.io/2.0/aws/protocols/index.html) (see [`protocol`](crate::protocol) module), and the\n//! operations field.\n//!\n//! We generate an implementation on this for every service struct (exported from the root of the generated crate).\n//!\n//! As stated in the [operation module documentation](crate::operation) we also generate marker structs for\n//! [`OperationShape`](crate::operation::OperationShape), these are coupled to the `S: ServiceShape` via the [`ContainsOperation`] trait.\n//!\n//! The model\n//!\n//! ```smithy\n//! @restJson1\n//! service Shopping {\n//!     version: \"1.0\",\n//!     operations: [\n//!         GetShopping,\n//!         PutShopping\n//!     ]\n//! }\n//! ```\n//!\n//! is identified with the implementation\n//!\n//! ```rust,no_run\n//! # use aws_smithy_http_server::shape_id::ShapeId;\n//! # use aws_smithy_http_server::service::{ServiceShape, ContainsOperation};\n//! # use aws_smithy_http_server::protocol::rest_json_1::RestJson1;\n//! # pub struct Shopping;\n//! // For more information on these marker structs see `OperationShape`\n//! struct GetShopping;\n//! struct PutShopping;\n//!\n//! // This is a generated enumeration of all operations.\n//! #[derive(PartialEq, Eq, Clone, Copy)]\n//! pub enum Operation {\n//!     GetShopping,\n//!     PutShopping\n//! }\n//!\n//! impl ServiceShape for Shopping {\n//!     const ID: ShapeId = ShapeId::new(\"namespace#Shopping\", \"namespace\", \"Shopping\");\n//!     const VERSION: Option<&'static str> = Some(\"1.0\");\n//!     type Protocol = RestJson1;\n//!     type Operations = Operation;\n//! }\n//!\n//! impl ContainsOperation<GetShopping> for Shopping {\n//!     const VALUE: Operation = Operation::GetShopping;\n//! }\n//!\n//! impl ContainsOperation<PutShopping> for Shopping {\n//!     const VALUE: Operation = Operation::PutShopping;\n//! }\n//! ```\n//!\n//! [Smithy service]: https://smithy.io/2.0/spec/service-types.html#service\n\nuse crate::shape_id::ShapeId;\n\n/// Models the [Smithy Service shape].\n///\n/// [Smithy Service shape]: https://smithy.io/2.0/spec/service-types.html#service\npub trait ServiceShape {\n    /// The [`ShapeId`] of the service.\n    const ID: ShapeId;\n\n    /// The version of the service.\n    const VERSION: Option<&'static str>;\n\n    /// The [Protocol] applied to this service.\n    ///\n    /// [Protocol]: https://smithy.io/2.0/spec/protocol-traits.html\n    type Protocol;\n\n    /// An enumeration of all operations contained in this service.\n    type Operations;\n}\n\npub trait ContainsOperation<Op>: ServiceShape {\n    const VALUE: Self::Operations;\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/src/shape_id.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! A [`ShapeId`] represents a [Smithy Shape ID](https://smithy.io/2.0/spec/model.html#shape-id).\n//!\n//! # Example\n//!\n//! In the following model:\n//!\n//! ```smithy\n//! namespace smithy.example\n//!\n//! operation CheckHealth {}\n//! ```\n//!\n//! - `absolute` is `\"smithy.example#CheckHealth\"`\n//! - `namespace` is `\"smithy.example\"`\n//! - `name` is `\"CheckHealth\"`\n\npub use crate::request::extension::{Extension, MissingExtension};\n\n/// Represents a [Smithy Shape ID](https://smithy.io/2.0/spec/model.html#shape-id).\n#[derive(Debug, Clone, PartialEq, Eq, Hash)]\npub struct ShapeId {\n    absolute: &'static str,\n\n    namespace: &'static str,\n    name: &'static str,\n}\n\nimpl ShapeId {\n    /// Constructs a new [`ShapeId`]. This is used by the code-generator which preserves the invariants of the Shape ID format.\n    #[doc(hidden)]\n    pub const fn new(absolute: &'static str, namespace: &'static str, name: &'static str) -> Self {\n        Self {\n            absolute,\n            namespace,\n            name,\n        }\n    }\n\n    /// Returns the namespace.\n    ///\n    /// See [Shape ID](https://smithy.io/2.0/spec/model.html#shape-id) for a breakdown of the syntax.\n    pub fn namespace(&self) -> &'static str {\n        self.namespace\n    }\n\n    /// Returns the member name.\n    ///\n    /// See [Shape ID](https://smithy.io/2.0/spec/model.html#shape-id) for a breakdown of the syntax.\n    pub fn name(&self) -> &'static str {\n        self.name\n    }\n\n    /// Returns the absolute shape ID.\n    ///\n    /// See [Shape ID](https://smithy.io/2.0/spec/model.html#shape-id) for a breakdown of the syntax.\n    pub fn absolute(&self) -> &'static str {\n        self.absolute\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/src/test_helpers.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npub(crate) fn assert_send<T: Send>() {}\npub(crate) fn assert_sync<T: Sync>() {}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/tests/graceful_shutdown_test.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Tests for graceful shutdown functionality\n//!\n//! These tests verify that the serve function and graceful shutdown work correctly\n\nuse aws_smithy_http_server::body::{to_boxed, BoxBody};\nuse aws_smithy_http_server::routing::IntoMakeService;\nuse std::convert::Infallible;\nuse std::time::Duration;\nuse tokio::sync::oneshot;\nuse tower::service_fn;\n\n/// Test service that delays before responding\nasync fn slow_service(_request: http::Request<hyper::body::Incoming>) -> Result<http::Response<BoxBody>, Infallible> {\n    // Simulate slow processing\n    tokio::time::sleep(Duration::from_millis(100)).await;\n    Ok(http::Response::builder()\n        .status(200)\n        .body(to_boxed(\"Slow response\"))\n        .unwrap())\n}\n\n// Note: Basic graceful shutdown is already tested in test_graceful_shutdown_waits_for_connections\n// This test was removed due to watch channel behavior with no active connections\n\n#[tokio::test]\nasync fn test_graceful_shutdown_waits_for_connections() {\n    // Create a listener on a random port\n    let listener = tokio::net::TcpListener::bind(\"127.0.0.1:0\")\n        .await\n        .expect(\"failed to bind\");\n    let addr = listener.local_addr().unwrap();\n\n    // Create shutdown signal\n    let (shutdown_tx, shutdown_rx) = oneshot::channel::<()>();\n\n    // Start server in background\n    let server_handle = tokio::spawn(async move {\n        aws_smithy_http_server::serve::serve(listener, IntoMakeService::new(service_fn(slow_service)))\n            .with_graceful_shutdown(async {\n                shutdown_rx.await.ok();\n            })\n            .await\n    });\n\n    // Give server time to start\n    tokio::time::sleep(Duration::from_millis(50)).await;\n\n    // Start a slow request\n    let client = hyper_util::client::legacy::Client::builder(hyper_util::rt::TokioExecutor::new()).build_http();\n\n    let uri = format!(\"http://{addr}/slow\");\n    let request = http::Request::builder()\n        .uri(&uri)\n        .body(http_body_util::Empty::<bytes::Bytes>::new())\n        .unwrap();\n\n    let request_handle = tokio::spawn(async move { client.request(request).await });\n\n    // Give request time to start\n    tokio::time::sleep(Duration::from_millis(20)).await;\n\n    // Trigger shutdown while request is in flight\n    shutdown_tx.send(()).unwrap();\n\n    // The request should complete successfully\n    let response = request_handle.await.unwrap().expect(\"request failed\");\n    assert_eq!(response.status(), 200);\n\n    // Server should shutdown after the request completes\n    let result = tokio::time::timeout(Duration::from_secs(5), server_handle)\n        .await\n        .expect(\"server did not shutdown in time\")\n        .expect(\"server task panicked\");\n\n    assert!(result.is_ok(), \"server should shutdown cleanly\");\n}\n\n#[tokio::test]\nasync fn test_graceful_shutdown_with_timeout() {\n    // Create a listener on a random port\n    let listener = tokio::net::TcpListener::bind(\"127.0.0.1:0\")\n        .await\n        .expect(\"failed to bind\");\n    let addr = listener.local_addr().unwrap();\n\n    // Create shutdown signal\n    let (shutdown_tx, shutdown_rx) = oneshot::channel::<()>();\n\n    // Create a very slow service that takes longer than timeout\n    let very_slow_service = |_request: http::Request<hyper::body::Incoming>| async {\n        tokio::time::sleep(Duration::from_secs(10)).await;\n        Ok::<_, Infallible>(\n            http::Response::builder()\n                .status(200)\n                .body(to_boxed(\"Very slow\"))\n                .unwrap(),\n        )\n    };\n\n    // Start server with short timeout\n    let server_handle = tokio::spawn(async move {\n        aws_smithy_http_server::serve::serve(listener, IntoMakeService::new(service_fn(very_slow_service)))\n            .with_graceful_shutdown(async {\n                shutdown_rx.await.ok();\n            })\n            .with_shutdown_timeout(Duration::from_millis(200))\n            .await\n    });\n\n    // Give server time to start\n    tokio::time::sleep(Duration::from_millis(50)).await;\n\n    // Start a very slow request\n    let client = hyper_util::client::legacy::Client::builder(hyper_util::rt::TokioExecutor::new()).build_http();\n\n    let uri = format!(\"http://{addr}/very-slow\");\n    let request = http::Request::builder()\n        .uri(&uri)\n        .body(http_body_util::Empty::<bytes::Bytes>::new())\n        .unwrap();\n\n    let _request_handle = tokio::spawn(async move {\n        // This request will likely be interrupted\n        let _ = client.request(request).await;\n    });\n\n    // Give request time to start\n    tokio::time::sleep(Duration::from_millis(20)).await;\n\n    // Trigger shutdown while request is in flight\n    shutdown_tx.send(()).unwrap();\n\n    // Server should shutdown after timeout (not waiting for slow request)\n    let result = tokio::time::timeout(Duration::from_secs(2), server_handle)\n        .await\n        .expect(\"server did not shutdown in time\")\n        .expect(\"server task panicked\");\n\n    assert!(result.is_ok(), \"server should shutdown cleanly after timeout\");\n}\n\n#[tokio::test]\nasync fn test_with_connect_info() {\n    use aws_smithy_http_server::request::connect_info::ConnectInfo;\n    use std::net::SocketAddr;\n\n    // Create a listener on a random port\n    let listener = tokio::net::TcpListener::bind(\"127.0.0.1:0\")\n        .await\n        .expect(\"failed to bind\");\n    let addr = listener.local_addr().unwrap();\n\n    // Service that extracts ConnectInfo\n    let service_with_connect_info = |request: http::Request<hyper::body::Incoming>| async move {\n        // Check if ConnectInfo is in extensions\n        let connect_info = request.extensions().get::<ConnectInfo<SocketAddr>>();\n        let body = if connect_info.is_some() {\n            to_boxed(\"ConnectInfo present\")\n        } else {\n            to_boxed(\"ConnectInfo missing\")\n        };\n\n        Ok::<_, Infallible>(http::Response::builder().status(200).body(body).unwrap())\n    };\n\n    // Create shutdown signal\n    let (shutdown_tx, shutdown_rx) = oneshot::channel::<()>();\n\n    // Start server with connect_info enabled\n    let server_handle = tokio::spawn(async move {\n        use aws_smithy_http_server::routing::IntoMakeServiceWithConnectInfo;\n\n        aws_smithy_http_server::serve::serve(\n            listener,\n            IntoMakeServiceWithConnectInfo::<_, SocketAddr>::new(service_fn(service_with_connect_info)),\n        )\n        .with_graceful_shutdown(async {\n            shutdown_rx.await.ok();\n        })\n        .await\n    });\n\n    // Give server time to start\n    tokio::time::sleep(Duration::from_millis(50)).await;\n\n    // Make a request\n    let client = hyper_util::client::legacy::Client::builder(hyper_util::rt::TokioExecutor::new()).build_http();\n\n    let uri = format!(\"http://{addr}/test\");\n    let request = http::Request::builder()\n        .uri(&uri)\n        .body(http_body_util::Empty::<bytes::Bytes>::new())\n        .unwrap();\n\n    let response = client.request(request).await.expect(\"request failed\");\n    assert_eq!(response.status(), 200);\n\n    // Read body to check ConnectInfo was present\n    let body_bytes = http_body_util::BodyExt::collect(response.into_body())\n        .await\n        .unwrap()\n        .to_bytes();\n    assert_eq!(body_bytes, \"ConnectInfo present\");\n\n    // Cleanup\n    shutdown_tx.send(()).unwrap();\n    let _ = tokio::time::timeout(Duration::from_secs(2), server_handle).await;\n}\n\n// Note: configure_hyper is tested implicitly by the code compiling and the other tests working\n// The configure_hyper functionality itself works correctly as shown by successful compilation\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server/tests/serve_integration_test.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Integration tests for the serve module\n//!\n//! These tests verify functionality that isn't explicitly tested elsewhere\n\nuse aws_smithy_http_server::body::{to_boxed, BoxBody};\nuse aws_smithy_http_server::routing::IntoMakeService;\nuse aws_smithy_http_server::serve::{Listener, ListenerExt};\nuse std::convert::Infallible;\nuse std::sync::atomic::{AtomicBool, AtomicUsize, Ordering};\nuse std::sync::Arc;\nuse std::time::Duration;\nuse tokio::sync::oneshot;\nuse tower::service_fn;\n\n/// Simple test service that returns OK\nasync fn ok_service(_request: http::Request<hyper::body::Incoming>) -> Result<http::Response<BoxBody>, Infallible> {\n    Ok(http::Response::builder().status(200).body(to_boxed(\"OK\")).unwrap())\n}\n\n/// Test service that returns custom headers for verification\nasync fn service_with_custom_headers(\n    _request: http::Request<hyper::body::Incoming>,\n) -> Result<http::Response<BoxBody>, Infallible> {\n    Ok(http::Response::builder()\n        .status(200)\n        .header(\"content-type\", \"text/plain\")\n        .header(\"x-custom-header\", \"test-value\")\n        .header(\"x-another-header\", \"another-value\")\n        .body(to_boxed(\"OK\"))\n        .unwrap())\n}\n\n/// Test that `configure_hyper()` actually applies HTTP/1 settings like title-case headers at the wire level.\n#[tokio::test]\nasync fn test_configure_hyper_http1_keep_alive() {\n    use tokio::io::{AsyncReadExt, AsyncWriteExt};\n\n    let listener = tokio::net::TcpListener::bind(\"127.0.0.1:0\")\n        .await\n        .expect(\"failed to bind\");\n    let addr = listener.local_addr().unwrap();\n\n    let (shutdown_tx, shutdown_rx) = oneshot::channel::<()>();\n\n    // Start server with custom Hyper configuration including title_case_headers\n    let server_handle = tokio::spawn(async move {\n        aws_smithy_http_server::serve::serve(listener, IntoMakeService::new(service_fn(service_with_custom_headers)))\n            .configure_hyper(|mut builder| {\n                // Configure HTTP/1 settings\n                builder.http1().keep_alive(true).title_case_headers(true);\n                builder\n            })\n            .with_graceful_shutdown(async {\n                shutdown_rx.await.ok();\n            })\n            .await\n    });\n\n    // Give server time to start\n    tokio::time::sleep(Duration::from_millis(50)).await;\n\n    // Use raw TCP to read the actual HTTP response headers\n    let mut stream = tokio::net::TcpStream::connect(addr).await.expect(\"failed to connect\");\n\n    // Send a simple HTTP/1.1 request\n    stream\n        .write_all(b\"GET /test HTTP/1.1\\r\\nHost: localhost\\r\\n\\r\\n\")\n        .await\n        .expect(\"failed to write request\");\n\n    // Read the response\n    let mut buffer = vec![0u8; 4096];\n    let n = stream.read(&mut buffer).await.expect(\"failed to read response\");\n    let response_text = String::from_utf8_lossy(&buffer[..n]);\n\n    // Verify status\n    assert!(response_text.contains(\"HTTP/1.1 200 OK\"), \"Expected 200 OK status\");\n\n    // Verify title-case headers are present in the raw response\n    // With title_case_headers(true), Hyper writes headers like \"Content-Type:\" instead of \"content-type:\"\n    assert!(\n        response_text.contains(\"Content-Type:\") || response_text.contains(\"Content-Type: \"),\n        \"Expected Title-Case 'Content-Type' header, got:\\n{response_text}\"\n    );\n    assert!(\n        response_text.contains(\"X-Custom-Header:\") || response_text.contains(\"X-Custom-Header: \"),\n        \"Expected Title-Case 'X-Custom-Header' header, got:\\n{response_text}\"\n    );\n    assert!(\n        response_text.contains(\"X-Another-Header:\") || response_text.contains(\"X-Another-Header: \"),\n        \"Expected Title-Case 'X-Another-Header' header, got:\\n{response_text}\"\n    );\n\n    // Verify it's NOT lowercase (which would be the default)\n    assert!(\n        !response_text.contains(\"content-type:\"),\n        \"Headers should be Title-Case, not lowercase\"\n    );\n    assert!(\n        !response_text.contains(\"x-custom-header:\"),\n        \"Headers should be Title-Case, not lowercase\"\n    );\n\n    // Cleanup\n    shutdown_tx.send(()).unwrap();\n    let _ = tokio::time::timeout(Duration::from_secs(2), server_handle).await;\n}\n\n/// Test that `tap_io()` invokes the closure with access to the TCP stream for configuration.\n#[tokio::test]\nasync fn test_tap_io_set_nodelay() {\n    let called = Arc::new(AtomicBool::new(false));\n    let called_clone = called.clone();\n\n    let listener = tokio::net::TcpListener::bind(\"127.0.0.1:0\")\n        .await\n        .expect(\"failed to bind\")\n        .tap_io(move |tcp_stream| {\n            // Set TCP_NODELAY and mark that we were called\n            let _ = tcp_stream.set_nodelay(true);\n            called_clone.store(true, Ordering::SeqCst);\n        });\n\n    let addr = listener.local_addr().unwrap();\n\n    let (shutdown_tx, shutdown_rx) = oneshot::channel::<()>();\n\n    let server_handle = tokio::spawn(async move {\n        aws_smithy_http_server::serve::serve(listener, IntoMakeService::new(service_fn(ok_service)))\n            .with_graceful_shutdown(async {\n                shutdown_rx.await.ok();\n            })\n            .await\n    });\n\n    tokio::time::sleep(Duration::from_millis(50)).await;\n\n    // Make a request to trigger connection\n    let client = hyper_util::client::legacy::Client::builder(hyper_util::rt::TokioExecutor::new()).build_http();\n\n    let uri = format!(\"http://{addr}/test\");\n    let request = http::Request::builder()\n        .uri(&uri)\n        .body(http_body_util::Empty::<bytes::Bytes>::new())\n        .unwrap();\n\n    let response = client.request(request).await.expect(\"request failed\");\n    assert_eq!(response.status(), 200);\n\n    // Verify tap_io was called\n    assert!(called.load(Ordering::SeqCst), \"tap_io closure was not called\");\n\n    shutdown_tx.send(()).unwrap();\n    let _ = tokio::time::timeout(Duration::from_secs(2), server_handle).await;\n}\n\n/// Test that `tap_io()` and `limit_connections()` can be chained together.\n#[tokio::test]\nasync fn test_tap_io_with_limit_connections() {\n    let tap_count = Arc::new(AtomicUsize::new(0));\n    let tap_count_clone = tap_count.clone();\n\n    let listener = tokio::net::TcpListener::bind(\"127.0.0.1:0\")\n        .await\n        .expect(\"failed to bind\")\n        .tap_io(move |_tcp_stream| {\n            tap_count_clone.fetch_add(1, Ordering::SeqCst);\n        })\n        .limit_connections(10);\n\n    let addr = listener.local_addr().unwrap();\n\n    let (shutdown_tx, shutdown_rx) = oneshot::channel::<()>();\n\n    let server_handle = tokio::spawn(async move {\n        aws_smithy_http_server::serve::serve(listener, IntoMakeService::new(service_fn(ok_service)))\n            .with_graceful_shutdown(async {\n                shutdown_rx.await.ok();\n            })\n            .await\n    });\n\n    tokio::time::sleep(Duration::from_millis(50)).await;\n\n    // Make 3 requests - each creates a new connection\n    // Note: HTTP clients may reuse connections, so we use Connection: close\n    let client = hyper_util::client::legacy::Client::builder(hyper_util::rt::TokioExecutor::new()).build_http();\n\n    for _ in 0..3 {\n        let uri = format!(\"http://{addr}/test\");\n        let request = http::Request::builder()\n            .uri(&uri)\n            .header(\"Connection\", \"close\") // Force new connection each time\n            .body(http_body_util::Empty::<bytes::Bytes>::new())\n            .unwrap();\n\n        let response = client.request(request).await.expect(\"request failed\");\n        assert_eq!(response.status(), 200);\n\n        // Give time for connection to close\n        tokio::time::sleep(Duration::from_millis(10)).await;\n    }\n\n    // Verify tap_io was called at least once (may be 1-3 depending on connection reuse)\n    let count = tap_count.load(Ordering::SeqCst);\n    assert!((1..=3).contains(&count), \"tap_io was called {count} times\");\n\n    shutdown_tx.send(()).unwrap();\n    let _ = tokio::time::timeout(Duration::from_secs(2), server_handle).await;\n}\n\n/// Test that the server works with Unix domain socket listeners.\n#[cfg(unix)]\n#[tokio::test]\nasync fn test_unix_listener() {\n    use tokio::net::UnixListener;\n\n    // Create a temporary socket path\n    let socket_path = format!(\"/tmp/smithy-test-{}.sock\", std::process::id());\n\n    // Remove socket if it exists\n    let _ = std::fs::remove_file(&socket_path);\n\n    let listener = UnixListener::bind(&socket_path).expect(\"failed to bind unix socket\");\n\n    let (shutdown_tx, shutdown_rx) = oneshot::channel::<()>();\n\n    let server_handle = tokio::spawn(async move {\n        aws_smithy_http_server::serve::serve(listener, IntoMakeService::new(service_fn(ok_service)))\n            .with_graceful_shutdown(async {\n                shutdown_rx.await.ok();\n            })\n            .await\n    });\n\n    tokio::time::sleep(Duration::from_millis(50)).await;\n\n    // Connect via Unix socket\n    let stream = tokio::net::UnixStream::connect(&socket_path)\n        .await\n        .expect(\"failed to connect to unix socket\");\n\n    // Use hyper to make a request over the Unix socket\n    use hyper_util::rt::TokioIo;\n    let io = TokioIo::new(stream);\n\n    let (mut sender, conn) = hyper::client::conn::http1::handshake(io)\n        .await\n        .expect(\"handshake failed\");\n\n    tokio::spawn(async move {\n        if let Err(err) = conn.await {\n            eprintln!(\"Connection error: {err:?}\");\n        }\n    });\n\n    let request = http::Request::builder()\n        .uri(\"/test\")\n        .body(http_body_util::Empty::<bytes::Bytes>::new())\n        .unwrap();\n\n    let response = sender.send_request(request).await.expect(\"request failed\");\n    assert_eq!(response.status(), 200);\n\n    // Cleanup\n    shutdown_tx.send(()).unwrap();\n    let _ = tokio::time::timeout(Duration::from_secs(2), server_handle).await;\n    let _ = std::fs::remove_file(&socket_path);\n}\n\n/// Test that `local_addr()` returns the correct bound address.\n#[tokio::test]\nasync fn test_local_addr() {\n    let listener = tokio::net::TcpListener::bind(\"127.0.0.1:0\")\n        .await\n        .expect(\"failed to bind\");\n\n    let expected_addr = listener.local_addr().unwrap();\n\n    let serve = aws_smithy_http_server::serve::serve(listener, IntoMakeService::new(service_fn(ok_service)));\n\n    let actual_addr = serve.local_addr().expect(\"failed to get local_addr\");\n\n    assert_eq!(actual_addr, expected_addr);\n}\n\n/// Test that `local_addr()` still works after calling `with_graceful_shutdown()`.\n#[tokio::test]\nasync fn test_local_addr_with_graceful_shutdown() {\n    let listener = tokio::net::TcpListener::bind(\"127.0.0.1:0\")\n        .await\n        .expect(\"failed to bind\");\n\n    let expected_addr = listener.local_addr().unwrap();\n\n    let (_shutdown_tx, shutdown_rx) = oneshot::channel::<()>();\n\n    let serve = aws_smithy_http_server::serve::serve(listener, IntoMakeService::new(service_fn(ok_service)))\n        .with_graceful_shutdown(async {\n            shutdown_rx.await.ok();\n        });\n\n    let actual_addr = serve.local_addr().expect(\"failed to get local_addr\");\n\n    assert_eq!(actual_addr, expected_addr);\n}\n\n/// Test HTTP/2 prior knowledge mode (cleartext HTTP/2 without ALPN)\n#[tokio::test]\nasync fn test_http2_only_prior_knowledge() {\n    let listener = tokio::net::TcpListener::bind(\"127.0.0.1:0\")\n        .await\n        .expect(\"failed to bind\");\n    let addr = listener.local_addr().unwrap();\n\n    let (shutdown_tx, shutdown_rx) = oneshot::channel::<()>();\n\n    // Start server with HTTP/2 only (prior knowledge mode)\n    let server_handle = tokio::spawn(async move {\n        aws_smithy_http_server::serve::serve(listener, IntoMakeService::new(service_fn(ok_service)))\n            .configure_hyper(|builder| builder.http2_only())\n            .with_graceful_shutdown(async {\n                shutdown_rx.await.ok();\n            })\n            .await\n    });\n\n    tokio::time::sleep(Duration::from_millis(50)).await;\n\n    // Create HTTP/2 client (prior knowledge mode - no upgrade)\n    let stream = tokio::net::TcpStream::connect(addr).await.expect(\"failed to connect\");\n    let io = hyper_util::rt::TokioIo::new(stream);\n\n    let (mut sender, conn) = hyper::client::conn::http2::handshake(hyper_util::rt::TokioExecutor::new(), io)\n        .await\n        .expect(\"http2 handshake failed\");\n\n    tokio::spawn(async move {\n        if let Err(err) = conn.await {\n            eprintln!(\"HTTP/2 connection error: {err:?}\");\n        }\n    });\n\n    // Send HTTP/2 request\n    let request = http::Request::builder()\n        .uri(\"/test\")\n        .body(http_body_util::Empty::<bytes::Bytes>::new())\n        .unwrap();\n\n    let response = sender.send_request(request).await.expect(\"request failed\");\n    assert_eq!(response.status(), 200);\n\n    // Cleanup\n    shutdown_tx.send(()).unwrap();\n    let _ = tokio::time::timeout(Duration::from_secs(2), server_handle).await;\n}\n\n/// Test HTTP/1-only mode using `http1_only()` configuration.\n#[tokio::test]\nasync fn test_http1_only() {\n    let listener = tokio::net::TcpListener::bind(\"127.0.0.1:0\")\n        .await\n        .expect(\"failed to bind\");\n    let addr = listener.local_addr().unwrap();\n\n    let (shutdown_tx, shutdown_rx) = oneshot::channel::<()>();\n\n    let server_handle = tokio::spawn(async move {\n        aws_smithy_http_server::serve::serve(listener, IntoMakeService::new(service_fn(ok_service)))\n            .configure_hyper(|builder| builder.http1_only())\n            .with_graceful_shutdown(async {\n                shutdown_rx.await.ok();\n            })\n            .await\n    });\n\n    tokio::time::sleep(Duration::from_millis(50)).await;\n\n    // Use HTTP/1 client\n    let client = hyper_util::client::legacy::Client::builder(hyper_util::rt::TokioExecutor::new()).build_http();\n\n    let uri = format!(\"http://{addr}/test\");\n    let request = http::Request::builder()\n        .uri(&uri)\n        .body(http_body_util::Empty::<bytes::Bytes>::new())\n        .unwrap();\n\n    let response = client.request(request).await.expect(\"request failed\");\n    assert_eq!(response.status(), 200);\n\n    shutdown_tx.send(()).unwrap();\n    let _ = tokio::time::timeout(Duration::from_secs(2), server_handle).await;\n}\n\n/// Test that the default server configuration auto-detects and supports both HTTP/1 and HTTP/2.\n#[tokio::test]\nasync fn test_default_server_supports_both_http1_and_http2() {\n    let listener = tokio::net::TcpListener::bind(\"127.0.0.1:0\")\n        .await\n        .expect(\"failed to bind\");\n    let addr = listener.local_addr().unwrap();\n\n    let (shutdown_tx, shutdown_rx) = oneshot::channel::<()>();\n\n    // Start server with DEFAULT configuration (no configure_hyper call)\n    let server_handle = tokio::spawn(async move {\n        aws_smithy_http_server::serve::serve(listener, IntoMakeService::new(service_fn(ok_service)))\n            .with_graceful_shutdown(async {\n                shutdown_rx.await.ok();\n            })\n            .await\n    });\n\n    tokio::time::sleep(Duration::from_millis(50)).await;\n\n    // Test 1: Make an HTTP/1.1 request\n    let http1_client = hyper_util::client::legacy::Client::builder(hyper_util::rt::TokioExecutor::new()).build_http();\n\n    let uri = format!(\"http://{addr}/test\");\n    let request = http::Request::builder()\n        .uri(&uri)\n        .body(http_body_util::Empty::<bytes::Bytes>::new())\n        .unwrap();\n\n    let response = http1_client.request(request).await.expect(\"HTTP/1 request failed\");\n    assert_eq!(response.status(), 200, \"HTTP/1 request should succeed\");\n\n    // Test 2: Make an HTTP/2 request (prior knowledge mode)\n    let stream = tokio::net::TcpStream::connect(addr).await.expect(\"failed to connect\");\n    let io = hyper_util::rt::TokioIo::new(stream);\n\n    let (mut sender, conn) = hyper::client::conn::http2::handshake(hyper_util::rt::TokioExecutor::new(), io)\n        .await\n        .expect(\"http2 handshake failed\");\n\n    tokio::spawn(async move {\n        if let Err(err) = conn.await {\n            eprintln!(\"HTTP/2 connection error: {err:?}\");\n        }\n    });\n\n    let request = http::Request::builder()\n        .uri(\"/test\")\n        .body(http_body_util::Empty::<bytes::Bytes>::new())\n        .unwrap();\n\n    let response = sender.send_request(request).await.expect(\"HTTP/2 request failed\");\n    assert_eq!(response.status(), 200, \"HTTP/2 request should succeed\");\n\n    shutdown_tx.send(()).unwrap();\n    let _ = tokio::time::timeout(Duration::from_secs(2), server_handle).await;\n}\n\n/// Test that the server handles concurrent HTTP/1 and HTTP/2 connections simultaneously using a barrier.\n#[tokio::test]\nasync fn test_mixed_protocol_concurrent_connections() {\n    use tokio::sync::Barrier;\n    let listener = tokio::net::TcpListener::bind(\"127.0.0.1:0\")\n        .await\n        .expect(\"failed to bind\");\n    let addr = listener.local_addr().unwrap();\n\n    let (shutdown_tx, shutdown_rx) = oneshot::channel::<()>();\n\n    // Use a barrier to ensure all 4 requests arrive before any respond\n    // This proves they're being handled concurrently\n    let barrier = Arc::new(Barrier::new(4));\n    let barrier_clone = barrier.clone();\n\n    let barrier_service = move |_request: http::Request<hyper::body::Incoming>| {\n        let barrier = barrier_clone.clone();\n        async move {\n            // Wait for all 4 requests to arrive\n            barrier.wait().await;\n            // Now all respond together\n            Ok::<_, Infallible>(http::Response::builder().status(200).body(to_boxed(\"OK\")).unwrap())\n        }\n    };\n\n    // Start server with default configuration (supports both protocols)\n    let server_handle = tokio::spawn(async move {\n        aws_smithy_http_server::serve::serve(listener, IntoMakeService::new(service_fn(barrier_service)))\n            .with_graceful_shutdown(async {\n                shutdown_rx.await.ok();\n            })\n            .await\n    });\n\n    tokio::time::sleep(Duration::from_millis(50)).await;\n\n    // Start multiple HTTP/1 connections\n    let make_http1_request = |addr: std::net::SocketAddr, path: &'static str| async move {\n        let stream = tokio::net::TcpStream::connect(addr).await.unwrap();\n        let io = hyper_util::rt::TokioIo::new(stream);\n\n        let (mut sender, conn) = hyper::client::conn::http1::handshake(io).await.unwrap();\n\n        tokio::spawn(async move {\n            if let Err(e) = conn.await {\n                eprintln!(\"HTTP/1 connection error: {e:?}\");\n            }\n        });\n\n        let request = http::Request::builder()\n            .uri(path)\n            .body(http_body_util::Empty::<bytes::Bytes>::new())\n            .unwrap();\n\n        sender.send_request(request).await\n    };\n\n    // Start multiple HTTP/2 connections\n    let make_http2_request = |addr: std::net::SocketAddr, path: &'static str| async move {\n        let stream = tokio::net::TcpStream::connect(addr).await.unwrap();\n        let io = hyper_util::rt::TokioIo::new(stream);\n\n        let (mut sender, conn) = hyper::client::conn::http2::handshake(hyper_util::rt::TokioExecutor::new(), io)\n            .await\n            .unwrap();\n\n        tokio::spawn(async move {\n            if let Err(e) = conn.await {\n                eprintln!(\"HTTP/2 connection error: {e:?}\");\n            }\n        });\n\n        let request = http::Request::builder()\n            .uri(path)\n            .body(http_body_util::Empty::<bytes::Bytes>::new())\n            .unwrap();\n\n        sender.send_request(request).await\n    };\n\n    // Launch 2 HTTP/1 and 2 HTTP/2 requests concurrently\n    let h1_handle1 = tokio::spawn(make_http1_request(addr, \"/http1-test1\"));\n    let h1_handle2 = tokio::spawn(make_http1_request(addr, \"/http1-test2\"));\n    let h2_handle1 = tokio::spawn(make_http2_request(addr, \"/http2-test1\"));\n    let h2_handle2 = tokio::spawn(make_http2_request(addr, \"/http2-test2\"));\n\n    // Wait for all requests to complete with timeout\n    // If they complete, it means the barrier was satisfied (all 4 arrived concurrently)\n    let timeout = Duration::from_secs(60);\n    let h1_result1 = tokio::time::timeout(timeout, h1_handle1)\n        .await\n        .expect(\"HTTP/1 request 1 timed out\")\n        .unwrap();\n    let h1_result2 = tokio::time::timeout(timeout, h1_handle2)\n        .await\n        .expect(\"HTTP/1 request 2 timed out\")\n        .unwrap();\n    let h2_result1 = tokio::time::timeout(timeout, h2_handle1)\n        .await\n        .expect(\"HTTP/2 request 1 timed out\")\n        .unwrap();\n    let h2_result2 = tokio::time::timeout(timeout, h2_handle2)\n        .await\n        .expect(\"HTTP/2 request 2 timed out\")\n        .unwrap();\n\n    // All requests should succeed\n    assert!(h1_result1.is_ok(), \"HTTP/1 request 1 failed\");\n    assert!(h1_result2.is_ok(), \"HTTP/1 request 2 failed\");\n    assert!(h2_result1.is_ok(), \"HTTP/2 request 1 failed\");\n    assert!(h2_result2.is_ok(), \"HTTP/2 request 2 failed\");\n\n    assert_eq!(h1_result1.unwrap().status(), 200);\n    assert_eq!(h1_result2.unwrap().status(), 200);\n    assert_eq!(h2_result1.unwrap().status(), 200);\n    assert_eq!(h2_result2.unwrap().status(), 200);\n\n    shutdown_tx.send(()).unwrap();\n    let _ = tokio::time::timeout(Duration::from_secs(2), server_handle).await;\n}\n\n/// Test that `limit_connections()` enforces the connection limit correctly using semaphores.\n#[tokio::test]\nasync fn test_limit_connections_blocks_excess() {\n    use tokio::sync::Semaphore;\n    let listener = tokio::net::TcpListener::bind(\"127.0.0.1:0\")\n        .await\n        .expect(\"failed to bind\")\n        .limit_connections(2); // Allow only 2 concurrent connections\n\n    let addr = listener.local_addr().unwrap();\n\n    let (shutdown_tx, shutdown_rx) = oneshot::channel::<()>();\n\n    // Use a semaphore to control when requests complete\n    // We'll hold permits to keep connections open\n    let sem = Arc::new(Semaphore::new(0));\n    let sem_clone = sem.clone();\n\n    let semaphore_service = move |_request: http::Request<hyper::body::Incoming>| {\n        let sem = sem_clone.clone();\n        async move {\n            // Wait for a permit (blocks until we release permits in the test)\n            let _permit = sem.acquire().await.unwrap();\n            Ok::<_, Infallible>(http::Response::builder().status(200).body(to_boxed(\"OK\")).unwrap())\n        }\n    };\n\n    let server_handle = tokio::spawn(async move {\n        aws_smithy_http_server::serve::serve(listener, IntoMakeService::new(service_fn(semaphore_service)))\n            .with_graceful_shutdown(async {\n                shutdown_rx.await.ok();\n            })\n            .await\n    });\n\n    tokio::time::sleep(Duration::from_millis(50)).await;\n\n    // Create 3 separate TCP connections and HTTP/1 clients\n    let make_request = |addr: std::net::SocketAddr| async move {\n        let stream = tokio::net::TcpStream::connect(addr).await.unwrap();\n        let io = hyper_util::rt::TokioIo::new(stream);\n\n        let (mut sender, conn) = hyper::client::conn::http1::handshake(io).await.unwrap();\n\n        tokio::spawn(async move {\n            if let Err(e) = conn.await {\n                eprintln!(\"Connection error: {e:?}\");\n            }\n        });\n\n        let request = http::Request::builder()\n            .uri(\"/test\")\n            .body(http_body_util::Empty::<bytes::Bytes>::new())\n            .unwrap();\n\n        sender.send_request(request).await\n    };\n\n    // Start 3 requests concurrently\n    let handle1 = tokio::spawn(make_request(addr));\n    let handle2 = tokio::spawn(make_request(addr));\n    let handle3 = tokio::spawn(make_request(addr));\n\n    // Give them time to attempt connections\n    tokio::time::sleep(Duration::from_millis(100)).await;\n\n    // Now release 3 permits so all requests can complete\n    sem.add_permits(3);\n\n    // All requests should eventually complete (with timeout to prevent hanging)\n    let timeout = Duration::from_secs(60);\n    let result1 = tokio::time::timeout(timeout, handle1)\n        .await\n        .expect(\"First request timed out\")\n        .unwrap();\n    let result2 = tokio::time::timeout(timeout, handle2)\n        .await\n        .expect(\"Second request timed out\")\n        .unwrap();\n    let result3 = tokio::time::timeout(timeout, handle3)\n        .await\n        .expect(\"Third request timed out\")\n        .unwrap();\n\n    // All should succeed - the limiter allows connections through (just limits concurrency)\n    assert!(result1.is_ok(), \"First request failed\");\n    assert!(result2.is_ok(), \"Second request failed\");\n    assert!(result3.is_ok(), \"Third request failed\");\n\n    shutdown_tx.send(()).unwrap();\n    let _ = tokio::time::timeout(Duration::from_secs(2), server_handle).await;\n}\n\n/// Test that graceful shutdown completes quickly when there are no active connections.\n#[tokio::test]\nasync fn test_immediate_graceful_shutdown() {\n    let listener = tokio::net::TcpListener::bind(\"127.0.0.1:0\")\n        .await\n        .expect(\"failed to bind\");\n\n    let (shutdown_tx, shutdown_rx) = oneshot::channel::<()>();\n\n    let server_handle = tokio::spawn(async move {\n        aws_smithy_http_server::serve::serve(listener, IntoMakeService::new(service_fn(ok_service)))\n            .with_graceful_shutdown(async {\n                shutdown_rx.await.ok();\n            })\n            .await\n    });\n\n    // Give server time to start\n    tokio::time::sleep(Duration::from_millis(50)).await;\n\n    // Immediately trigger shutdown without any connections\n    shutdown_tx.send(()).unwrap();\n\n    // Server should shutdown quickly since there are no connections\n    let result = tokio::time::timeout(Duration::from_millis(500), server_handle)\n        .await\n        .expect(\"server did not shutdown in time\")\n        .expect(\"server task panicked\");\n\n    assert!(result.is_ok(), \"server should shutdown cleanly\");\n}\n\n/// Test HTTP/2 stream multiplexing by sending concurrent requests over a single connection using a barrier.\n#[tokio::test]\nasync fn test_multiple_concurrent_http2_streams() {\n    use tokio::sync::Barrier;\n    let listener = tokio::net::TcpListener::bind(\"127.0.0.1:0\")\n        .await\n        .expect(\"failed to bind\");\n    let addr = listener.local_addr().unwrap();\n\n    let (shutdown_tx, shutdown_rx) = oneshot::channel::<()>();\n\n    // Use a barrier to ensure all 5 requests arrive before any respond\n    // This proves HTTP/2 multiplexing is working\n    let barrier = Arc::new(Barrier::new(5));\n    let barrier_clone = barrier.clone();\n\n    let barrier_service = move |_request: http::Request<hyper::body::Incoming>| {\n        let barrier = barrier_clone.clone();\n        async move {\n            // Wait for all 5 requests to arrive\n            barrier.wait().await;\n            // Now all respond together\n            Ok::<_, Infallible>(http::Response::builder().status(200).body(to_boxed(\"OK\")).unwrap())\n        }\n    };\n\n    // Start server with HTTP/2 only and configure max concurrent streams\n    let server_handle = tokio::spawn(async move {\n        aws_smithy_http_server::serve::serve(listener, IntoMakeService::new(service_fn(barrier_service)))\n            .configure_hyper(|mut builder| {\n                builder.http2().max_concurrent_streams(5);\n                builder.http2_only()\n            })\n            .with_graceful_shutdown(async {\n                shutdown_rx.await.ok();\n            })\n            .await\n    });\n\n    tokio::time::sleep(Duration::from_millis(50)).await;\n\n    // Create HTTP/2 connection\n    let stream = tokio::net::TcpStream::connect(addr).await.expect(\"failed to connect\");\n    let io = hyper_util::rt::TokioIo::new(stream);\n\n    let (sender, conn) = hyper::client::conn::http2::handshake(hyper_util::rt::TokioExecutor::new(), io)\n        .await\n        .expect(\"http2 handshake failed\");\n\n    tokio::spawn(async move {\n        if let Err(err) = conn.await {\n            eprintln!(\"HTTP/2 connection error: {err:?}\");\n        }\n    });\n\n    // Send multiple concurrent requests over the same HTTP/2 connection\n    let mut handles = vec![];\n\n    for i in 0..5 {\n        let request = http::Request::builder()\n            .uri(format!(\"/test{i}\"))\n            .body(http_body_util::Empty::<bytes::Bytes>::new())\n            .unwrap();\n\n        let mut sender_clone = sender.clone();\n        let handle = tokio::spawn(async move { sender_clone.send_request(request).await });\n        handles.push(handle);\n    }\n\n    // Wait for all requests to complete with timeout\n    // If they complete, it means the barrier was satisfied (all 5 arrived concurrently)\n    let timeout = Duration::from_secs(60);\n    for (i, handle) in handles.into_iter().enumerate() {\n        let response = tokio::time::timeout(timeout, handle)\n            .await\n            .unwrap_or_else(|_| panic!(\"Request {i} timed out\"))\n            .unwrap()\n            .expect(\"request failed\");\n        assert_eq!(response.status(), 200);\n    }\n\n    shutdown_tx.send(()).unwrap();\n    let _ = tokio::time::timeout(Duration::from_secs(2), server_handle).await;\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server-metrics/Cargo.toml",
    "content": "[package]\nname = \"aws-smithy-http-server-metrics\"\nversion = \"0.1.2\"\nauthors = [\n    \"AWS Rust SDK Team <aws-sdk-rust@amazon.com>\",\n    \"Jason Gin <jasgin@amazon.com>\",\n]\ndescription = \"Server metrics via metrique integration.\"\nedition = \"2021\"\nlicense = \"Apache-2.0\"\nrepository = \"https://github.com/smithy-lang/smithy-rs\"\nrust-version = \"1.91.1\"\n\n[dependencies]\naws-smithy-http-server = { path = \"../aws-smithy-http-server\", features = [\n    \"request-id\",\n] }\naws-smithy-http-server-metrics-macro = { path = \"../aws-smithy-http-server-metrics-macro\" }\nhttp = \"1.3.1\"\nhttp-body = \"1.0.1\"\nhyper = \"1.6.0\"\nfutures = \"0.3\"\nmetrique = \"0.1.17\"\nmetrique-core = \"0.1.15\"\nmetrique-writer = \"0.1.17\"\npin-project-lite = \"0.2.14\"\nthiserror = \"2\"\ntower = \"0.4.13\"\ntracing = \"0.1.44\"\n\n# Optional dependencies for aws-smithy-http-server 0.65 support\naws-smithy-http-server-065 = { package = \"aws-smithy-http-server\", version = \"0.65\", optional = true, features = [\n    \"request-id\",\n] }\nhttp-02 = { package = \"http\", version = \"0.2.12\", optional = true }\nhttp-body-04 = { package = \"http-body\", version = \"0.4.6\", optional = true }\nhyper-014 = { package = \"hyper\", version = \"0.14.26\", optional = true }\n\n# Optional dependencies for aws-smithy-legacy-http-server support\naws-smithy-legacy-http-server = { path = \"../aws-smithy-legacy-http-server\", optional = true, features = [\n    \"request-id\",\n] }\n\n[dev-dependencies]\ntracing-appender = \"0.2\"\nmetrique-writer-format-emf = \"0.1.16\"\n\n[features]\naws-smithy-http-server-065 = [\n    \"dep:aws-smithy-http-server-065\",\n    \"dep:http-02\",\n    \"dep:hyper-014\",\n    \"dep:http-body-04\",\n]\naws-smithy-legacy-http-server = [\n    \"dep:aws-smithy-legacy-http-server\",\n    \"dep:http-02\",\n    \"dep:hyper-014\",\n    \"dep:http-body-04\",\n]\n\n[package.metadata.docs.rs]\nall-features = true\ntargets = [\"x86_64-unknown-linux-gnu\"]\ncargo-args = [\"-Zunstable-options\", \"-Zrustdoc-scrape-examples\"]\nrustdoc-args = [\"--cfg\", \"docsrs\"]\n# End of docs.rs metadata\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server-metrics/LICENSE",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server-metrics/README.md",
    "content": "# aws-smithy-http-server-metrics\n\nMetrics collection for Smithy Rust servers.\n\nSee the [crate documentation](https://docs.rs/aws-smithy-http-server-metrics) for usage examples and API details.\n\n<!-- anchor_start:footer -->\nThis crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly.\n<!-- anchor_end:footer -->\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server-metrics/src/default/service_counter.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::sync::atomic::AtomicUsize;\nuse std::sync::atomic::Ordering;\nuse std::sync::Arc;\n\n/// A service-level counter for metrics that need state beyond a single request\n#[derive(Default, Debug, Clone)]\npub(crate) struct ServiceCounter {\n    inner: Arc<ServiceCounterInner>,\n}\nimpl ServiceCounter {\n    /// Increments the global count by 1, returning a guard that\n    /// decrements the count on drop, and the new value\n    pub(crate) fn increment(&self) -> (ServiceCounterGuard, usize) {\n        let count = self.inner.increment();\n        (ServiceCounterGuard(Arc::clone(&self.inner)), count)\n    }\n}\n\n#[derive(Default, Debug, Clone)]\npub(crate) struct ServiceCounterInner {\n    count: Arc<AtomicUsize>,\n}\nimpl ServiceCounterInner {\n    fn increment(&self) -> usize {\n        self.count.fetch_add(1, Ordering::Relaxed) + 1\n    }\n}\n\n/// Guard for [`ServiceCounter`] that decrements its count on drop\npub(crate) struct ServiceCounterGuard(Arc<ServiceCounterInner>);\n\nimpl Drop for ServiceCounterGuard {\n    fn drop(&mut self) {\n        self.0.count.fetch_sub(1, Ordering::Relaxed);\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server-metrics/src/default.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Default metrics types and configuration.\n//!\n//! This module contains the types used by [`DefaultMetricsPlugin`](crate::plugin::DefaultMetricsPlugin)\n//! to collect standard metrics automatically.\n\nuse std::fmt::Debug;\nuse std::sync::Arc;\nuse std::sync::Mutex;\nuse std::time::Duration;\n\nuse metrique::unit_of_work::metrics;\nuse metrique::Slot;\nuse metrique::SlotGuard;\n\nuse crate::default::service_counter::ServiceCounter;\n\npub(crate) mod service_counter;\n\n/// Container for keeping track of state across all requests for the service (all operations) for default metrics\n///\n/// This type is not intended for direct use. See [`DefaultMetricsPlugin`](crate::plugin::DefaultMetricsPlugin).\n#[derive(Debug, Default, Clone)]\npub struct DefaultMetricsServiceCounters {\n    pub(crate) outstanding_requests_counter: ServiceCounter,\n}\n\n#[derive(Debug, Default, Clone)]\npub struct DefaultMetricsServiceState {\n    pub(crate) outstanding_requests: usize,\n}\n\n/// Container for default request and response metrics.\n///\n/// This type is not intended for direct use. See [`DefaultMetricsPlugin`](crate::plugin::DefaultMetricsPlugin).\n#[metrics]\n#[derive(Default)]\npub struct DefaultMetrics {\n    #[metrics(flatten)]\n    pub(crate) default_request_metrics: Option<Slot<DefaultRequestMetrics>>,\n    #[metrics(flatten)]\n    pub(crate) default_response_metrics: Option<Slot<DefaultResponseMetrics>>,\n}\n// Slot currently doesn't impl debug: https://github.com/awslabs/metrique/issues/190\nimpl Debug for DefaultMetrics {\n    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n        f.debug_struct(\"DefaultMetrics\")\n            .field(\"default_request_metrics\", &())\n            .field(\"default_response_metrics\", &())\n            .finish()\n    }\n}\n\n/// Default request metrics collected\n///\n/// This type is not intended for direct use. See [`DefaultMetricsPlugin`](crate::plugin::DefaultMetricsPlugin).\n#[metrics]\n#[derive(Debug, Default)]\npub struct DefaultRequestMetrics {\n    pub(crate) service: Option<String>,\n    pub(crate) service_version: Option<String>,\n    pub(crate) operation: Option<String>,\n    pub(crate) request_id: Option<String>,\n    pub(crate) outstanding_requests: Option<usize>,\n}\n\n/// Default response metrics collected automatically.\n///\n/// This type is not intended for direct use. See [`DefaultMetricsPlugin`](crate::plugin::DefaultMetricsPlugin).\n#[metrics]\n#[derive(Default, Debug)]\npub struct DefaultResponseMetrics {\n    pub(crate) http_status_code: Option<String>,\n    /// Success indicator (1 if 2xx status code, 0 otherwise)\n    pub(crate) success: Option<bool>,\n    /// Client error indicator (1 if 4xx status code, 0 otherwise)\n    pub(crate) client_error: Option<bool>,\n    /// Server error indicator (1 if 5xx status code, 0 otherwise)\n    pub(crate) server_error: Option<bool>,\n    /// Wallclock time from pre-deserialization of the model input to post-serialization of the model output\n    pub(crate) operation_time: Option<Duration>,\n}\n\n/// Configuration for disabling specific default request metrics.\n///\n/// This type is not intended for direct use. See [`DefaultMetricsPlugin`](crate::plugin::DefaultMetricsPlugin).\n#[derive(Default, Debug, Clone)]\npub struct DefaultRequestMetricsConfig {\n    pub(crate) disable_all: bool,\n    pub(crate) disable_request_id: bool,\n    pub(crate) disable_operation: bool,\n    pub(crate) disable_service: bool,\n    pub(crate) disable_service_version: bool,\n    pub(crate) disable_outstanding_requests: bool,\n}\n\n/// Configuration for disabling specific default response metrics.\n///\n/// This type is not intended for direct use. See [`DefaultMetricsPlugin`](crate::plugin::DefaultMetricsPlugin).\n#[derive(Default, Debug, Clone)]\npub struct DefaultResponseMetricsConfig {\n    pub(crate) disable_all: bool,\n    pub(crate) disable_http_status_code: bool,\n    pub(crate) disable_success: bool,\n    pub(crate) disable_client_error: bool,\n    pub(crate) disable_server_error: bool,\n    pub(crate) disable_operation_time: bool,\n}\n\n/// Extension for accessing default request metrics.\n///\n/// This type is not intended for direct use. See [`DefaultMetricsPlugin`](crate::plugin::DefaultMetricsPlugin).\n#[derive(Clone)]\npub struct DefaultRequestMetricsExtension {\n    pub(crate) metrics: Arc<Mutex<SlotGuard<DefaultRequestMetrics>>>,\n    pub(crate) config: DefaultRequestMetricsConfig,\n}\n\n/// Extension for accessing default response metrics.\n///\n/// This type is not intended for direct use. See [`DefaultMetricsPlugin`](crate::plugin::DefaultMetricsPlugin).\n#[derive(Clone)]\npub struct DefaultResponseMetricsExtension {\n    pub(crate) metrics: Arc<Mutex<SlotGuard<DefaultResponseMetrics>>>,\n    pub(crate) config: DefaultResponseMetricsConfig,\n}\n\n/// Extension containing both request and response metrics.\n///\n/// This type is not intended for direct use. See [`DefaultMetricsPlugin`](crate::plugin::DefaultMetricsPlugin).\n#[derive(Clone)]\npub struct DefaultMetricsExtension {\n    pub(crate) request_ext: DefaultRequestMetricsExtension,\n    pub(crate) response_ext: DefaultResponseMetricsExtension,\n    pub(crate) service_state: DefaultMetricsServiceState,\n}\nimpl DefaultMetricsExtension {\n    #[doc(hidden)]\n    pub fn __macro_new(\n        request_metrics: Arc<Mutex<SlotGuard<DefaultRequestMetrics>>>,\n        response_metrics: Arc<Mutex<SlotGuard<DefaultResponseMetrics>>>,\n        request_metrics_config: DefaultRequestMetricsConfig,\n        response_metrics_config: DefaultResponseMetricsConfig,\n        service_state: DefaultMetricsServiceState,\n    ) -> Self {\n        Self {\n            request_ext: DefaultRequestMetricsExtension {\n                metrics: request_metrics,\n                config: request_metrics_config,\n            },\n            response_ext: DefaultResponseMetricsExtension {\n                metrics: response_metrics,\n                config: response_metrics_config,\n            },\n            service_state,\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server-metrics/src/layer/builder.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::marker::PhantomData;\nuse std::sync::Arc;\nuse std::sync::Mutex;\n\nuse metrique::DefaultSink;\nuse metrique::OnParentDrop;\nuse metrique::Slot;\n\nuse crate::default::DefaultMetricsExtension;\nuse crate::default::DefaultMetricsServiceState;\nuse crate::default::DefaultRequestMetrics;\nuse crate::default::DefaultRequestMetricsConfig;\nuse crate::default::DefaultRequestMetricsExtension;\nuse crate::default::DefaultResponseMetrics;\nuse crate::default::DefaultResponseMetricsConfig;\nuse crate::default::DefaultResponseMetricsExtension;\nuse crate::layer::DefaultMetrics;\nuse crate::layer::MetricsLayer;\nuse crate::traits::InitMetrics;\nuse crate::traits::ResponseMetrics;\nuse crate::traits::ThreadSafeCloseEntry;\nuse crate::traits::ThreadSafeEntrySink;\nuse crate::types::DefaultInit;\nuse crate::types::DefaultRs;\nuse crate::types::HttpRequest;\n\n// Macro to generate disable methods for configuration\nmacro_rules! impl_disable_methods {\n    () => {\n        /// Disable all default request metrics\n        pub fn disable_default_request_metrics(mut self) -> Self {\n            self.default_req_metrics_config.disable_all = true;\n            self\n        }\n\n        /// Disable all default response metrics\n        pub fn disable_default_response_metrics(mut self) -> Self {\n            self.default_res_metrics_config.disable_all = true;\n            self\n        }\n\n        /// Disable the default `outstanding_requests` metric\n        pub fn disable_default_outstanding_requests_metric(mut self) -> Self {\n            self.default_req_metrics_config.disable_outstanding_requests = true;\n            self\n        }\n\n        /// Disable the default `request_id` metric\n        pub fn disable_default_request_id_metric(mut self) -> Self {\n            self.default_req_metrics_config.disable_request_id = true;\n            self\n        }\n\n        /// Disable the default `operation_name` metric\n        pub fn disable_default_operation_metric(mut self) -> Self {\n            self.default_req_metrics_config.disable_operation = true;\n            self\n        }\n\n        /// Disable the default `service_name` metric\n        pub fn disable_default_service_metric(mut self) -> Self {\n            self.default_req_metrics_config.disable_service = true;\n            self\n        }\n\n        /// Disable the default `service_version` metric\n        pub fn disable_default_service_version_metric(mut self) -> Self {\n            self.default_req_metrics_config.disable_service_version = true;\n            self\n        }\n\n        /// Disable the default `http_status_code` metric\n        pub fn disable_default_http_status_code_metric(mut self) -> Self {\n            self.default_res_metrics_config.disable_http_status_code = true;\n            self\n        }\n\n        /// Disable the default `success` metric\n        pub fn disable_default_success_metric(mut self) -> Self {\n            self.default_res_metrics_config.disable_success = true;\n            self\n        }\n\n        /// Disable the default `client_error` metric\n        pub fn disable_default_client_error_metric(mut self) -> Self {\n            self.default_res_metrics_config.disable_client_error = true;\n            self\n        }\n\n        /// Disable the default `server_error` metric\n        pub fn disable_default_server_error_metric(mut self) -> Self {\n            self.default_res_metrics_config.disable_server_error = true;\n            self\n        }\n\n        /// Disable the default `operation_time` metric\n        pub fn disable_default_operation_time_metric(mut self) -> Self {\n            self.default_res_metrics_config.disable_operation_time = true;\n            self\n        }\n    };\n}\n\npub struct NeedsInitialization;\npub struct WithRq;\npub struct WithRqAndRs;\n\n#[non_exhaustive]\npub struct MetricsLayerBuilder<\n    State,\n    Entry = DefaultMetrics,\n    Sink = DefaultSink,\n    Init = DefaultInit<Entry, Sink>,\n    Res = DefaultRs<Entry>,\n> where\n    Entry: ThreadSafeCloseEntry,\n    Sink: ThreadSafeEntrySink<Entry>,\n    Init: InitMetrics<Entry, Sink>,\n    Res: ResponseMetrics<Entry>,\n{\n    pub init_metrics: Option<Init>,\n    pub response_metrics: Option<Res>,\n    pub default_req_metrics_config: DefaultRequestMetricsConfig,\n    pub default_res_metrics_config: DefaultResponseMetricsConfig,\n    pub(crate) _state: PhantomData<State>,\n    pub(crate) _close_entry: PhantomData<Entry>,\n    pub(crate) _entry_sink: PhantomData<Sink>,\n}\n\nimpl<Entry, Sink> MetricsLayerBuilder<NeedsInitialization, Entry, Sink>\nwhere\n    Entry: ThreadSafeCloseEntry,\n    Sink: ThreadSafeEntrySink<Entry>,\n{\n    /// Sets the function to initialize metrics for each request\n    ///\n    /// # Example\n    /// ```rust,ignore\n    /// let metrics_layer = MetricsLayer::builder()\n    ///     .init_metrics(|req| PokemonMetrics::default().append_on_drop(ServiceMetrics::sink()));\n    /// ```\n    pub fn init_metrics(\n        self,\n        init_metrics: impl InitMetrics<Entry, Sink>,\n    ) -> MetricsLayerBuilder<WithRq, Entry, Sink, impl InitMetrics<Entry, Sink>> {\n        MetricsLayerBuilder {\n            init_metrics: Some(init_metrics),\n            response_metrics: self.response_metrics,\n            default_req_metrics_config: self.default_req_metrics_config,\n            default_res_metrics_config: self.default_res_metrics_config,\n            _state: PhantomData,\n            _close_entry: PhantomData,\n            _entry_sink: PhantomData,\n        }\n    }\n}\n\nimpl<Entry, Sink, Init> MetricsLayerBuilder<WithRq, Entry, Sink, Init>\nwhere\n    Entry: ThreadSafeCloseEntry,\n    Sink: ThreadSafeEntrySink<Entry>,\n    Init: InitMetrics<Entry, Sink>,\n{\n    impl_disable_methods!();\n\n    /// Sets a function to extract custom metrics from responses.\n    ///\n    /// # Function Parameters\n    ///\n    /// - `response: &mut Response<ResBody>` - The HTTP response\n    /// - `metrics: &mut Entry` - The metrics entry to populate\n    ///\n    /// Called after the operation handler completes.\n    ///\n    /// See [`ResponseMetrics`] for the full trait signature.\n    pub fn response_metrics(\n        self,\n        f: impl ResponseMetrics<Entry>,\n    ) -> MetricsLayerBuilder<WithRqAndRs, Entry, Sink, Init, impl ResponseMetrics<Entry>> {\n        MetricsLayerBuilder {\n            init_metrics: self.init_metrics,\n            response_metrics: Some(f),\n            default_req_metrics_config: self.default_req_metrics_config,\n            default_res_metrics_config: self.default_res_metrics_config,\n            _state: PhantomData,\n            _close_entry: PhantomData,\n            _entry_sink: PhantomData,\n        }\n    }\n}\n\nimpl<Entry, Sink, Init, Res> MetricsLayerBuilder<WithRqAndRs, Entry, Sink, Init, Res>\nwhere\n    Entry: ThreadSafeCloseEntry,\n    Sink: ThreadSafeEntrySink<Entry>,\n    Init: InitMetrics<Entry, Sink>,\n    Res: ResponseMetrics<Entry>,\n{\n    impl_disable_methods!();\n}\n\n// Below are the extension trait and impls that will be generated by the proc macro when a metrics struct is\n// annotated with #[smithy_metrics]\n\npub trait DefaultMetricsBuildExt<Sink, Init, Res>\nwhere\n    Sink: ThreadSafeEntrySink<DefaultMetrics>,\n    Init: InitMetrics<DefaultMetrics, Sink>,\n    Res: ResponseMetrics<DefaultMetrics>,\n{\n    /// Build the [`MetricsLayer`] that can be added to your service.\n    fn build(self) -> MetricsLayer<DefaultMetrics, Sink, Init, Res>;\n}\n\nmacro_rules! impl_build_for_state {\n    ($state:ty) => {\n        impl<Sink, Init, Res> DefaultMetricsBuildExt<Sink, Init, Res>\n            for MetricsLayerBuilder<$state, DefaultMetrics, Sink, Init, Res>\n        where\n            Sink: ThreadSafeEntrySink<DefaultMetrics>,\n            Init: InitMetrics<DefaultMetrics, Sink>,\n            Res: ResponseMetrics<DefaultMetrics>,\n        {\n            fn build(self) -> MetricsLayer<DefaultMetrics, Sink, Init, Res> {\n                let default_metrics_extension_fn =\n                    |req: &mut HttpRequest,\n                     metrics: &mut DefaultMetrics,\n                     req_config: DefaultRequestMetricsConfig,\n                     res_config: DefaultResponseMetricsConfig,\n                     service_state: DefaultMetricsServiceState| {\n                        metrics.default_request_metrics =\n                            Some(Slot::new(DefaultRequestMetrics::default()));\n                        metrics.default_response_metrics =\n                            Some(Slot::new(DefaultResponseMetrics::default()));\n\n                        let default_req_metrics_slotguard = metrics\n                            .default_request_metrics\n                            .as_mut()\n                            .and_then(|slot| slot.open(OnParentDrop::Discard))\n                            .expect(\n                                \"unreachable: the option is set to a created slot in this scope\",\n                            );\n                        let default_res_metrics_slotguard = metrics\n                            .default_response_metrics\n                            .as_mut()\n                            .and_then(|slot| slot.open(OnParentDrop::Discard))\n                            .expect(\n                                \"unreachable: the option is set to a created slot in this scope\",\n                            );\n\n                        let ext = DefaultMetricsExtension {\n                            request_ext: DefaultRequestMetricsExtension {\n                                metrics: Arc::new(Mutex::new(default_req_metrics_slotguard)),\n                                config: req_config,\n                            },\n                            response_ext: DefaultResponseMetricsExtension {\n                                metrics: Arc::new(Mutex::new(default_res_metrics_slotguard)),\n                                config: res_config,\n                            },\n                            service_state,\n                        };\n\n                        req.extensions_mut().insert(ext);\n                    };\n\n                MetricsLayer {\n                    init_metrics: self.init_metrics.expect(\"init_metrics must be provided\"),\n                    response_metrics: self.response_metrics,\n                    default_metrics_extension_fn,\n                    default_req_metrics_config: self.default_req_metrics_config,\n                    default_res_metrics_config: self.default_res_metrics_config,\n                    _entry_sink: PhantomData,\n                }\n            }\n        }\n    };\n}\n\nimpl_build_for_state!(WithRq);\nimpl_build_for_state!(WithRqAndRs);\n\n#[cfg(test)]\nmod tests {\n    use metrique::AppendAndCloseOnDrop;\n    use metrique::ServiceMetrics;\n    use metrique_writer::GlobalEntrySink;\n\n    use super::*;\n    use crate::layer::MetricsLayer;\n    use crate::types::HttpResponse;\n\n    // Compile-time guarantees that methods exist on the correct states\n    macro_rules! assert_methods_callable {\n        ($state:ty => [$($method:ident($($args:tt)*)),*]) => {\n            $(const _: fn(MetricsLayerBuilder<$state>) = |b| { b.$method($($args)*); };)*\n        };\n    }\n\n    // Test that methods can be called on correct states - these will fail to compile if methods don't exist\n    assert_methods_callable!(NeedsInitialization => [init_metrics(dummy_init)]);\n    assert_methods_callable!(WithRq => [response_metrics(dummy_response_fn), build()]);\n    assert_methods_callable!(WithRqAndRs => [build()]);\n\n    // State transition tests\n    macro_rules! assert_state {\n        ($fn_name:ident, $state:ty) => {\n            fn $fn_name<Entry, Sink, Init, Res>(\n                _: &MetricsLayerBuilder<$state, Entry, Sink, Init, Res>,\n            ) where\n                Entry: ThreadSafeCloseEntry,\n                Sink: ThreadSafeEntrySink<Entry>,\n                Init: InitMetrics<Entry, Sink>,\n                Res: ResponseMetrics<Entry>,\n            {\n            }\n        };\n    }\n    assert_state!(assert_needs_initialization, NeedsInitialization);\n    assert_state!(assert_with_rq, WithRq);\n    assert_state!(assert_with_rq_and_rs, WithRqAndRs);\n\n    fn dummy_init(_req: &mut HttpRequest) -> AppendAndCloseOnDrop<DefaultMetrics, DefaultSink> {\n        DefaultMetrics::default().append_on_drop(ServiceMetrics::sink())\n    }\n\n    fn dummy_response_fn(_res: &mut HttpResponse, _metrics: &mut DefaultMetrics) {}\n\n    #[test]\n    fn test_needs_initialization_state() {\n        let builder = MetricsLayer::<DefaultMetrics, DefaultSink>::builder();\n        assert_needs_initialization(&builder);\n    }\n\n    #[test]\n    fn test_transition_to_with_rq_via_init_metrics() {\n        let builder = MetricsLayer::builder().init_metrics(dummy_init);\n        assert_with_rq(&builder);\n    }\n\n    #[test]\n    fn test_with_rq_to_with_rq_and_rs() {\n        let builder = MetricsLayer::builder()\n            .init_metrics(dummy_init)\n            .response_metrics(dummy_response_fn);\n        assert_with_rq_and_rs(&builder);\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server-metrics/src/layer.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::marker::PhantomData;\n\nuse metrique::DefaultSink;\nuse metrique::ServiceMetrics;\nuse metrique_writer::GlobalEntrySink;\nuse thiserror::Error;\nuse tower::Layer;\n\nuse crate::default::DefaultMetrics;\nuse crate::default::DefaultMetricsServiceCounters;\nuse crate::default::DefaultMetricsServiceState;\nuse crate::default::DefaultRequestMetricsConfig;\nuse crate::default::DefaultResponseMetricsConfig;\nuse crate::layer::builder::DefaultMetricsBuildExt;\nuse crate::layer::builder::MetricsLayerBuilder;\nuse crate::layer::builder::NeedsInitialization;\nuse crate::service::MetricsLayerService;\nuse crate::traits::InitMetrics;\nuse crate::traits::ResponseMetrics;\nuse crate::traits::ThreadSafeCloseEntry;\nuse crate::traits::ThreadSafeEntrySink;\nuse crate::types::DefaultInit;\nuse crate::types::DefaultRs;\nuse crate::types::HttpRequest;\n\npub mod builder;\n\n/// Errors that can occur when creating a metrics layer\n#[derive(Error, Debug)]\npub enum DefaultMetricsLayerError {\n    /// No sink was attached to the service metrics\n    #[error(\"No sink attached to [`metrique::ServiceMetrics`]\")]\n    NoSinkAttached,\n}\n\n/// A Tower layer that collects metrics for HTTP requests and responses, allowing you to define\n/// and initialize metrics that can be set throughout a request/response lifecycle.\n///\n/// Default metrics from [`DefaultMetricsPlugin`](crate::plugin::DefaultMetricsPlugin)\n/// will be folded into metrics from this layer if it is in the service's HTTP plugins.\n///\n/// # Usage\n///\n/// Typically, this should be layered as the outermost middleware layer, so that the rest of\n/// the request path has access to metrics request extensions added by this, and this has access\n/// to any metrics response extensions added by the response path.\n///\n/// Create a metrics layer using the builder pattern:\n///\n/// ```rust,ignore\n/// use aws_smithy_http_server_metrics::MetricsLayer;\n///\n/// let metrics_layer = MetricsLayer::builder()\n///     .init_metrics(|| MyMetrics::default().append_on_drop(sink))\n///     .request_metrics(|request, metrics| {\n///         // Populate custom metrics from request, e.g.\n///         metrics.user_agent = request.headers()\n///             .get(\"user-agent\")\n///             .and_then(|v| v.to_str().ok())\n///             .map(Into::into);\n///     })\n///     .response_metrics(|response, metrics| {\n///         // Populate custom metrics from response\n///     })\n///     .build();\n/// ```\n///\n/// Then add it to your service as outer middleware, typically layered after any other middleware\n/// to ensure that it is layered at the outermost level:\n///\n/// ```rust,ignore\n/// let app = app.layer(metrics_layer);\n/// ```\n///\n/// If you just want a custom sink with the default metrics, provided\n/// [`DefaultMetricsPlugin`](crate::plugin::DefaultMetricsPlugin) exists in the HTTP plugins,\n/// use [`new_with_sink()`](MetricsLayer::new_with_sink):\n///\n/// ```rust,ignore\n/// let metrics_layer = MetricsLayer::new_with_sink(my_sink);\n/// let app = app.layer(metrics_layer);\n/// ```\n#[derive(Debug)]\npub struct MetricsLayer<\n    Entry = DefaultMetrics,\n    Sink = DefaultSink,\n    Init = DefaultInit<Entry, Sink>,\n    Res = DefaultRs<Entry>,\n> where\n    Entry: ThreadSafeCloseEntry,\n    Sink: ThreadSafeEntrySink<Entry>,\n    Init: InitMetrics<Entry, Sink>,\n    Res: ResponseMetrics<Entry>,\n{\n    pub(crate) init_metrics: Init,\n    pub(crate) response_metrics: Option<Res>,\n    pub(crate) default_metrics_extension_fn: fn(\n        &mut HttpRequest,\n        &mut Entry,\n        DefaultRequestMetricsConfig,\n        DefaultResponseMetricsConfig,\n        DefaultMetricsServiceState,\n    ),\n    pub(crate) default_req_metrics_config: DefaultRequestMetricsConfig,\n    pub(crate) default_res_metrics_config: DefaultResponseMetricsConfig,\n\n    pub(crate) _entry_sink: PhantomData<Sink>,\n}\n\nimpl MetricsLayer {\n    pub fn new(\n    ) -> MetricsLayer<DefaultMetrics, DefaultSink, impl InitMetrics<DefaultMetrics, DefaultSink>>\n    {\n        Self::builder()\n            .init_metrics(|_req| DefaultMetrics::default().append_on_drop(ServiceMetrics::sink()))\n            .build()\n    }\n}\n\nimpl<Entry, Sink, Init, Res> MetricsLayer<Entry, Sink, Init, Res>\nwhere\n    Entry: ThreadSafeCloseEntry,\n    Sink: ThreadSafeEntrySink<Entry>,\n    Init: InitMetrics<Entry, Sink>,\n    Res: ResponseMetrics<Entry>,\n{\n    #[doc(hidden)]\n    pub fn __macro_new(\n        init_metrics: Init,\n        response_metrics: Option<Res>,\n        default_metrics_extension_fn: fn(\n            &mut HttpRequest,\n            &mut Entry,\n            DefaultRequestMetricsConfig,\n            DefaultResponseMetricsConfig,\n            DefaultMetricsServiceState,\n        ),\n        default_req_metrics_config: DefaultRequestMetricsConfig,\n        default_res_metrics_config: DefaultResponseMetricsConfig,\n    ) -> Self {\n        Self {\n            init_metrics,\n            response_metrics,\n            default_metrics_extension_fn,\n            default_req_metrics_config,\n            default_res_metrics_config,\n\n            _entry_sink: PhantomData,\n        }\n    }\n}\n\nimpl<Sink> MetricsLayer<DefaultMetrics, Sink>\nwhere\n    Sink: ThreadSafeEntrySink<DefaultMetrics> + Clone,\n{\n    /// Creates a new metrics layer with the provided sink and default metrics. For default\n    /// metrics to be set automatically, [`DefaultMetricsPlugin`](crate::plugin::DefaultMetricsPlugin)\n    /// must be added to the service's HTTP plugins.\n    ///\n    /// This is a convenience method for when you want to have a custom sink with the default\n    /// metrics configuration.\n    ///\n    /// For additional control, use [`MetricsLayer::builder()`].\n    ///\n    /// # Example\n    ///\n    /// ```rust,ignore\n    /// let layer = MetricsLayer::new_with_sink(my_sink);\n    /// ```\n    pub fn new_with_sink(\n        sink: Sink,\n    ) -> MetricsLayer<DefaultMetrics, Sink, impl InitMetrics<DefaultMetrics, Sink>> {\n        Self::builder()\n            .init_metrics(move |_req| DefaultMetrics::default().append_on_drop(sink.clone()))\n            .build()\n    }\n}\n\nimpl<Entry, Sink> MetricsLayer<Entry, Sink>\nwhere\n    Entry: ThreadSafeCloseEntry,\n    Sink: ThreadSafeEntrySink<Entry>,\n{\n    /// Creates a new [`MetricsLayerBuilder`] for configuring and building a [`MetricsLayer`].\n    ///\n    /// # Example\n    ///\n    /// ```rust,ignore\n    /// let layer = MetricsLayer::builder()\n    ///     .init_metrics(|| MyMetrics::default().append_on_drop(sink))\n    ///     .build();\n    /// ```\n    pub fn builder() -> MetricsLayerBuilder<NeedsInitialization, Entry, Sink> {\n        MetricsLayerBuilder {\n            init_metrics: None,\n            response_metrics: None,\n            default_req_metrics_config: DefaultRequestMetricsConfig::default(),\n            default_res_metrics_config: DefaultResponseMetricsConfig::default(),\n            _state: PhantomData,\n            _close_entry: PhantomData,\n            _entry_sink: PhantomData,\n        }\n    }\n}\n\nimpl<Ser, Entry, Sink, Init, Res> Layer<Ser> for MetricsLayer<Entry, Sink, Init, Res>\nwhere\n    Ser: Clone,\n    Entry: ThreadSafeCloseEntry,\n    Sink: ThreadSafeEntrySink<Entry>,\n    Init: InitMetrics<Entry, Sink>,\n    Res: ResponseMetrics<Entry>,\n{\n    type Service = MetricsLayerService<Ser, Entry, Sink, Init, Res>;\n\n    fn layer(&self, inner: Ser) -> Self::Service {\n        MetricsLayerService {\n            inner,\n            init_metrics: self.init_metrics.clone(),\n            response_metrics: self.response_metrics.clone(),\n            default_metrics_extension_fn: self.default_metrics_extension_fn,\n            default_req_metrics_config: self.default_req_metrics_config.clone(),\n            default_res_metrics_config: self.default_res_metrics_config.clone(),\n            default_service_counters: DefaultMetricsServiceCounters::default(),\n\n            _entry_sink: PhantomData,\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server-metrics/src/lib.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Metrics collection for Smithy Rust servers.\n//!\n//! This crate provides two ways to collect metrics:\n//! 1. **Default metrics** via [`DefaultMetricsPlugin`] - collection of standard metrics at the operation level\n//! 2. **Custom metrics** via [`MetricsLayer`] - collection of custom metrics and standard metrics at the outer request level\n//!\n//! # DefaultMetricsPlugin\n//!\n//! [`DefaultMetricsPlugin`] automatically collects standard metrics for every request at operation time.\n//! See the Collected Metrics section below:\n//!\n//! ```rust, ignore\n//! use aws_smithy_http_server_metrics::plugin::DefaultMetricsPlugin;\n//! use aws_smithy_http_server::plugin::HttpPlugins;\n//!\n//! let http_plugins = HttpPlugins::new()\n//!     .push(DefaultMetricsPlugin);\n//! ```\n//!\n//! **Important**: [`DefaultMetricsPlugin`] requires a metrics sink to be configured,\n//! otherwise metrics collection will be skipped and an info log will be emitted.\n//!\n//! To use a custom sink, you can add a [`MetricsLayer`]. See the MetricsLayer section below.\n//!\n//! If no [`MetricsLayer`] exists, [`DefaultMetricsPlugin`] will use metrique's global sink for\n//! application-wide metrics, [`ServiceMetrics`](metrique::ServiceMetrics). It will therefore\n//! need to be configured, e.g.:\n//!\n//! ```rust\n//! use metrique::ServiceMetrics;\n//! use metrique_writer::AttachGlobalEntrySinkExt;\n//! use metrique_writer::FormatExt;\n//! use metrique_writer_format_emf::Emf;\n//! use tracing_appender::rolling::RollingFileAppender;\n//! use tracing_appender::rolling::Rotation;\n//!\n//! // Attach a global sink to ServiceMetrics (e.g. CloudWatch EMF)\n//! let service_log_dir = \"logs\";\n//! let service_log_name = \"pokemon_service_metrics\";\n//!\n//! let emf = Emf::builder(\n//!         \"Ns\".to_string(),\n//!         vec![\n//!             vec![],\n//!             vec![\n//!                 \"service\".to_string(),\n//!                 \"service_version\".to_string(),\n//!                 \"operation\".to_string(),\n//!             ],\n//!         ],\n//!     )\n//!     .build()\n//!     .output_to_makewriter(RollingFileAppender::new(\n//!         Rotation::MINUTELY,\n//!         service_log_dir,\n//!         service_log_name,\n//!     ));\n//! ServiceMetrics::attach_to_stream(emf);\n//! ```\n//!\n//! # MetricsLayer\n//!\n//! Use [`MetricsLayer`] to customize metrics collection and/or define your own metrics:\n//!\n//! Default metrics from [`DefaultMetricsPlugin`]\n//! will be folded into metrics from this layer if it is in the service's HTTP plugins.\n//!\n//! A [`MetricsLayer`] can be used to customize the sink with the default metrics using\n//! [`MetricsLayer::new_with_sink`].\n//!\n//! For full control, use [`MetricsLayer::builder`].\n//!\n//! ```rust, ignore\n//! use aws_smithy_http_server_metrics::MetricsLayer;\n//! use metrique::ServiceMetrics;\n//! use metrique::writer::GlobalEntrySink;\n//! use metrique::unit_of_work::metrics;\n//! use metrique_macro::metrics;\n//!\n//! let metrics_layer = MetricsLayer::builder()\n//!     .init_metrics(|request| {\n//!         let mut metrics = MyMetrics::default().append_on_drop(ServiceMetrics::sink());\n//!         metrics.request_metrics.user_agent = request.headers()\n//!             .get(\"user-agent\")\n//!             .and_then(|v| v.to_str().ok())\n//!             .map(Into::into);\n//!         metrics\n//!     })\n//!     .response_metrics(|response, metrics| {\n//!         metrics.response_metrics.content_length = response\n//!             .headers()\n//!             .get(\"content-length\")\n//!             .and_then(|v| v.to_str().ok())\n//!             .and_then(|v| v.parse().ok());\n//!     })\n//!     .build();\n//!\n//! let app = app.layer(metrics_layer);\n//! ```\n//!\n//! Use the `#[smithy_metrics]` macro to integrate with a metrique metrics struct.\n//!\n//! Use the `#[smithy_metrics(operation)` macro on a field for metrics access of that\n//! field in operation handlers.\n//!\n//! ```rust\n//! use aws_smithy_http_server_metrics::operation::Metrics;\n//! use aws_smithy_http_server_metrics::smithy_metrics;\n//! use metrique::unit_of_work::metrics;\n//!\n//! #[smithy_metrics]\n//! #[metrics]\n//! struct MyMetrics {\n//!     #[metrics(flatten)]\n//!     request_metrics: MyRequestMetrics,\n//!     #[metrics(flatten)]\n//!     response_metrics: MyResponseMetrics,\n//!     #[metrics(flatten)]\n//!     operation_metrics: MyOperationMetrics,\n//! }\n//!\n//! #[metrics]\n//! struct MyRequestMetrics {\n//!     my_request_metric: Option<String>,\n//! }\n//!\n//! #[metrics]\n//! struct MyResponseMetrics {\n//!     my_response_metric: Option<String>,\n//! }\n//!\n//! #[metrics]\n//! struct MyOperationMetrics {\n//!     my_operation_metric: Option<String>,\n//! }\n//!\n//! // Does not include the input parameter and output return type for example's sake\n//! fn operation_handler(mut metrics: Metrics<MyOperationMetrics>) {\n//!     metrics.my_operation_metric = Some(\"example\".to_string());\n//! }\n//! ```\n//!\n//! For a complete example, see the [pokemon-service example](https://github.com/smithy-lang/smithy-rs/tree/main/examples/pokemon-service)\n//! for an example that uses CloudWatch EMF (Embedded Metric Format) as an output format.\n//!\n//! # Collected Metrics\n//!\n//! ## DefaultMetricsPlugin\n//!\n//! The [`DefaultMetricsPlugin`] provides the following metrics by default.\n//!\n//! For fully successful requests/responses, these are guaranteed to be present if\n//! they have not been explicitly disabled in the builder configuration.\n//! Response metrics may not be present if the future is dropped before the backswing.\n//!\n//! ### Request Metrics\n//!\n//! | Metric | Description |\n//! |--------|-------------|\n//! | `service` | Name of the service |\n//! | `service_version` | Version of the service |\n//! | `operation` | Name of the operation being invoked |\n//! | `request_id` | Unique identifier for the request |\n//! | `outstanding_requests` | Number of concurrent requests counting any operation being processing in that moment |\n//!\n//! ### Response Metrics\n//!\n//! | Metric | Description |\n//! |--------|-------------|\n//! | `http_status_code` | HTTP status code of the response |\n//! | `success` | Success indicator (2xx status code) |\n//! | `client_error` | Client error indicator (4xx status code) |\n//! | `server_error` | Server error indicator (5xx status code) |\n//! | `operation_time` | Timestamp that denotes operation time from pre-deserialization to post-serialization |\n//!\n//! # Platform support\n//!\n//! MIPS and PowerPC are currently not supported due to lack of\n//! [`AtomicU64`](std::sync::atomic::AtomicU64) support. Once\n//! <https://github.com/smithy-lang/smithy-rs/pull/4487> and\n//! <https://github.com/awslabs/metrique/issues/183> are complete,\n//! we can use the latest metrique version and support these.\n\n/* Automatically managed default lints */\n#![cfg_attr(docsrs, feature(doc_cfg))]\n/* End of automatically managed default lints */\n#![cfg(not(any(target_arch = \"mips\", target_arch = \"powerpc\")))]\n\npub mod default;\npub mod layer;\npub mod operation;\npub mod plugin;\npub mod service;\npub mod traits;\npub mod types;\n\npub use layer::builder::MetricsLayerBuilder;\npub use layer::MetricsLayer;\npub use operation::Metrics as OperationMetrics;\npub use plugin::DefaultMetricsPlugin;\n\npub use aws_smithy_http_server_metrics_macro::smithy_metrics;\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server-metrics/src/operation.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! A [`Clone`] bound was introduced to [`http::Extensions`] as of http 1.x, and [`SlotGuard`] is\n//! not [`Clone`], meaning we need to wrap `SlotGuard<T>` metrics with Arc Mutex before insertion\n//!\n//! To expose the types directly, we would need non-cloneable [`http::Extensions`] or a custom\n//! cloneable [`SlotGuard`] implementation to expose the types directly\n//!\n//! Uses a double-slot pattern to enable metrics to be modified in handlers\n//! while still being collected and serialized by the metrics layer. [`Metrics`]\n//! implements [`FromParts`] to\n//!\n//! 1. The outer slot (`Slot<Slot<T>>`) lives in the main metrics struct\n//! 2. The outer slot is opened, yielding a `SlotGuard<Slot<T>>` stored in request extensions\n//! 3. Handlers extract this and open the inner slot to get `SlotGuard<T>`\n//! 4. When the handler finishes, the inner guard drops and sends values back to the inner slot\n//! 5. When the request finishes, the outer guard drops and sends the inner slot back to the outer slot\n//! 6. The metrics layer serializes the outer slot, which now contains the handler's values\n\nuse std::ops::Deref;\nuse std::ops::DerefMut;\nuse std::sync::Arc;\nuse std::sync::Mutex;\n\nuse metrique::OnParentDrop;\nuse metrique::Slot;\nuse metrique::SlotGuard;\nuse thiserror::Error;\n\nuse crate::traits::ThreadSafeCloseEntry;\nuse crate::types::aws_smithy_http_server::request::FromParts;\nuse crate::types::aws_smithy_http_server::response::IntoResponse;\nuse crate::types::empty_response_body;\nuse crate::types::HttpRequestParts;\nuse crate::types::HttpResponse;\nuse crate::types::HttpStatusCode;\n\n/// Type for metrics that can be extracted in operation handlers.\n///\n/// # Example\n///\n/// ```rust, ignore\n/// pub async fn get_pokemon_species(\n///     input: input::GetPokemonSpeciesInput,\n///     state: Extension<Arc<State>>,\n///     mut metrics: Metrics<PokemonOperationMetrics>,\n/// ) -> Result<output::GetPokemonSpeciesOutput, error::GetPokemonSpeciesError> {\n///     metrics.get_pokemon_species_metrics = Some(\"hello world\".to_string());\n/// }\n/// ```\npub struct Metrics<T>\nwhere\n    T: ThreadSafeCloseEntry,\n{\n    /// The inner slot guard that handlers can modify\n    guard: SlotGuard<T>,\n    /// Keeps the outer guard alive so the inner slot has a parent to send values back to\n    _parent: Arc<Mutex<SlotGuard<Slot<T>>>>,\n}\n\nimpl<T> Metrics<T>\nwhere\n    T: ThreadSafeCloseEntry,\n{\n    /// Create a test instance that discards metrics\n    ///\n    /// Use this in tests when you need to provide metrics to handlers\n    /// but don't care about capturing the output.\n    pub fn test() -> Self\n    where\n        T: Default,\n    {\n        let inner_slot = Slot::new(T::default());\n        let mut outer_slot = Slot::new(inner_slot);\n        let outer_guard = outer_slot.open(OnParentDrop::Discard).unwrap();\n        let parent = Arc::new(Mutex::new(outer_guard));\n        let guard = parent\n            .lock()\n            .unwrap()\n            .deref_mut()\n            .open(OnParentDrop::Discard)\n            .unwrap();\n\n        Self {\n            guard,\n            _parent: parent,\n        }\n    }\n}\n\nimpl<T> Deref for Metrics<T>\nwhere\n    T: ThreadSafeCloseEntry,\n{\n    type Target = T;\n\n    fn deref(&self) -> &Self::Target {\n        &self.guard\n    }\n}\n\nimpl<T> DerefMut for Metrics<T>\nwhere\n    T: ThreadSafeCloseEntry,\n{\n    fn deref_mut(&mut self) -> &mut Self::Target {\n        &mut self.guard\n    }\n}\n\nimpl<Protocol, T> FromParts<Protocol> for Metrics<T>\nwhere\n    T: ThreadSafeCloseEntry,\n    T::Closed: Send,\n{\n    type Rejection = MetricsError;\n\n    fn from_parts(parts: &mut HttpRequestParts) -> Result<Self, Self::Rejection> {\n        // Get a reference to the MetricsInExtensions without removing it from the request.\n        // This keeps the outer guard alive in the extensions.\n        let Some(metrics_slot) = parts.extensions.get::<MetricsExtension<T>>() else {\n            return Err(MetricsError::UnknownExtension);\n        };\n\n        // Clone the Arc to keep a reference to the outer guard.\n        // This ensures the outer guard stays alive until this ExtensionMetrics is dropped.\n        let arc_clone = Arc::clone(&metrics_slot.inner);\n\n        // Lock the mutex and open the inner slot through deref_mut.\n        // The outer SlotGuard<Slot<T>> derefs to Slot<T>, so we can call .open() on it.\n        let metrics_guard = arc_clone\n            .lock()\n            .expect(\"we only hold the lock while removing, never panics\")\n            .open(OnParentDrop::Discard)\n            .ok_or(MetricsError::MetricAlreadyOpened)?;\n\n        Ok(Metrics {\n            guard: metrics_guard,\n            _parent: arc_clone, // Keep outer guard alive\n        })\n    }\n}\n\n/// Wrapper for storing metrics in request extensions. This type should not be used directly\n/// and is only public for usage in aws-smithy-http-server-metrics-macro. See [`Metrics`].\n///\n/// Wraps a `SlotGuard<Slot<T>>` (the outer guard) in `Arc<Mutex<...>>`\n/// to allow it to be cloned and shared across the request lifecycle while remaining\n/// in the request extensions. The double slot allows for a better public API via [`Metrics`].\n#[doc(hidden)]\n#[derive(Clone)]\npub struct MetricsExtension<T>\nwhere\n    T: ThreadSafeCloseEntry,\n{\n    inner: Arc<Mutex<SlotGuard<Slot<T>>>>,\n}\nimpl<T> MetricsExtension<T>\nwhere\n    T: ThreadSafeCloseEntry,\n{\n    /// Intended to be used by `aws_smithy_http_metrics_macro` only\n    ///\n    /// Takes a [`SlotGuard<T>`] to construct an instance of this wrapper type\n    #[doc(hidden)]\n    pub fn __macro_new(slotguard: SlotGuard<Slot<T>>) -> Self {\n        Self {\n            inner: Arc::new(Mutex::new(slotguard)),\n        }\n    }\n}\n\n/// A type of error which can be returned when attempting to set metrics.\n#[derive(Error, Debug)]\npub enum MetricsError {\n    #[error(\"Unknown extension\")]\n    UnknownExtension,\n    #[error(\"Slot has already been opened. Perhaps the extensions were cloned and the slot was opened multiple times.\")]\n    MetricAlreadyOpened,\n}\n\nimpl<Protocol> IntoResponse<Protocol> for MetricsError {\n    fn into_response(self) -> HttpResponse {\n        let mut response = HttpResponse::new(empty_response_body());\n        *response.status_mut() = HttpStatusCode::INTERNAL_SERVER_ERROR;\n        response\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server-metrics/src/plugin.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::future::Future;\nuse std::pin::Pin;\nuse std::task::Context;\nuse std::task::Poll;\nuse std::time::Duration;\n\nuse metrique::timers::OwnedTimerGuard;\nuse metrique::timers::Stopwatch;\nuse metrique::OnParentDrop;\nuse metrique::ServiceMetrics;\nuse metrique::Slot;\nuse metrique_writer::AttachGlobalEntrySink;\nuse pin_project_lite::pin_project;\nuse tower::Service;\nuse tracing;\n\nuse crate::default::DefaultMetrics;\nuse crate::default::DefaultMetricsExtension;\nuse crate::default::DefaultRequestMetrics;\nuse crate::default::DefaultResponseMetrics;\nuse crate::default::DefaultResponseMetricsConfig;\nuse crate::default::DefaultResponseMetricsExtension;\nuse crate::types::aws_smithy_http_server::operation::OperationShape;\nuse crate::types::aws_smithy_http_server::plugin::HttpMarker;\nuse crate::types::aws_smithy_http_server::plugin::Plugin;\nuse crate::types::aws_smithy_http_server::request::request_id::ServerRequestId;\nuse crate::types::aws_smithy_http_server::service::ServiceShape;\nuse crate::types::HttpRequest;\nuse crate::types::HttpResponse;\n\npin_project! {\n    /// Future returned by [`DefaultMetricsPluginService`].\n    ///\n    /// This type is not intended to be used directly. See [`DefaultMetricsPlugin`].\n    #[project = DefaultMetricsFutureProj]\n    pub enum DefaultMetricsFuture<F> {\n        /// Metrics extension from outer layer\n        WithExtension {\n            #[pin]\n            inner: F,\n            response_ext: DefaultResponseMetricsExtension,\n            operation_timer_guard: Option<OwnedTimerGuard>\n        },\n        /// No outer metrics layer, but sink available\n        WithMetrics {\n            #[pin]\n            inner: F,\n            metrics: metrique::AppendAndCloseOnDrop<DefaultMetrics, metrique_writer::BoxEntrySink>,\n            operation_timer_guard: Option<OwnedTimerGuard>\n        },\n        /// No sink available\n        Passthrough {\n            #[pin]\n            inner: F,\n        },\n    }\n}\n\nimpl<F, Err> Future for DefaultMetricsFuture<F>\nwhere\n    F: Future<Output = Result<HttpResponse, Err>>,\n{\n    type Output = Result<HttpResponse, Err>;\n\n    fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {\n        match self.project() {\n            DefaultMetricsFutureProj::WithExtension {\n                inner,\n                response_ext,\n                operation_timer_guard,\n            } => match inner.poll(cx) {\n                Poll::Ready(Ok(res)) => {\n                    let operation_time = operation_timer_guard.take().map(|guard| guard.stop());\n\n                    let default_response_metrics =\n                        get_default_response_metrics(&res, operation_time);\n                    let configured_default_response_metrics = configure_default_response_metrics(\n                        default_response_metrics,\n                        &response_ext.config,\n                    );\n\n                    response_ext.metrics.lock().map_or_else(\n                    |e| {\n                        tracing::error!(\n                            \"Failed to acquire lock on DefaultResponseMetrics with error {e}. Metrics may be incomplete.\"\n                        )\n                    },\n                    |mut metrics| **metrics = configured_default_response_metrics,\n                );\n\n                    Poll::Ready(Ok(res))\n                }\n                Poll::Ready(Err(e)) => Poll::Ready(Err(e)),\n                Poll::Pending => Poll::Pending,\n            },\n            DefaultMetricsFutureProj::WithMetrics {\n                inner,\n                metrics,\n                operation_timer_guard,\n            } => match inner.poll(cx) {\n                Poll::Ready(Ok(res)) => {\n                    let operation_time = operation_timer_guard.take().map(|guard| guard.stop());\n\n                    metrics.default_response_metrics = Some(Slot::new(\n                        get_default_response_metrics(&res, operation_time),\n                    ));\n                    metrics\n                        .default_response_metrics\n                        .as_mut()\n                        .and_then(|slot| slot.open(OnParentDrop::Discard))\n                        .expect(\"unreachable: the option is set to a created slot in this scope\");\n\n                    Poll::Ready(Ok(res))\n                }\n                Poll::Ready(Err(e)) => Poll::Ready(Err(e)),\n                Poll::Pending => Poll::Pending,\n            },\n            DefaultMetricsFutureProj::Passthrough { inner } => inner.poll(cx),\n        }\n    }\n}\n\n/// Plugin that automatically collects default metrics for all operations.\n///\n/// This plugin adds standard metrics to every operation without requiring manual configuration.\n/// For a complete list of collected metrics, see the [crate-level documentation](crate).\n///\n/// # Usage\n///\n/// Apply to your service using the plugin system:\n///\n/// ```rust,ignore\n/// use aws_smithy_http_server_metrics::DefaultMetricsPlugin;\n///\n/// let http_plugins = HttpPlugins::new()\n///     .push(DefaultMetricsPlugin)\n///     .instrument();\n/// ```\n///\n/// # Integration with MetricsLayer\n///\n/// This plugin works with [`MetricsLayer`](crate::layer::MetricsLayer).\n/// When both are used together, default metrics from this plugin are automatically\n/// folded with custom metrics from the layer.\n///\n/// # Metrics Sink\n///\n/// Metrics are emitted to the global sink configured via [`ServiceMetrics::attach`]\n/// or [`attach_to_stream`](metrique_writer::AttachGlobalEntrySinkExt::attach_to_stream).\n/// If no sink is attached, metrics collection is skipped.\n#[derive(Default)]\npub struct DefaultMetricsPlugin;\n\nimpl HttpMarker for DefaultMetricsPlugin {}\n\nimpl<Ser, Op, T> Plugin<Ser, Op, T> for DefaultMetricsPlugin\nwhere\n    Op: OperationShape,\n    Ser: ServiceShape,\n{\n    type Output = DefaultMetricsPluginService<T>;\n\n    fn apply(&self, inner: T) -> Self::Output {\n        DefaultMetricsPluginService {\n            inner,\n            service: Ser::ID.name(),\n            service_version: Ser::VERSION,\n            operation: Op::ID.name(),\n        }\n    }\n}\n\n/// Service wrapper that collects default metrics for operations.\n///\n/// Created by applying [`DefaultMetricsPlugin`] to a service.\n///\n/// This type is not intended to be used directly. See [`DefaultMetricsPlugin`].\n#[derive(Debug)]\npub struct DefaultMetricsPluginService<Ser> {\n    inner: Ser,\n    service: &'static str,\n    service_version: Option<&'static str>,\n    operation: &'static str,\n}\n\nimpl<Ser> Clone for DefaultMetricsPluginService<Ser>\nwhere\n    Ser: Clone,\n{\n    fn clone(&self) -> Self {\n        Self {\n            inner: self.inner.clone(),\n            operation: self.operation,\n            service: self.service,\n            service_version: self.service_version,\n        }\n    }\n}\nimpl<Ser> DefaultMetricsPluginService<Ser>\nwhere\n    Ser: Service<HttpRequest, Response = HttpResponse>,\n    Ser::Future: Send + 'static,\n{\n    /// Gets the default request metrics that can be retrieved from the request object directly\n    ///\n    /// Assigns None to those that need information from the outer metrics layer to be set\n    fn get_default_request_metrics(&self, req: &HttpRequest) -> DefaultRequestMetrics {\n        DefaultRequestMetrics {\n            service: Some(self.service.to_string()),\n            service_version: self.service_version.map(|n| n.to_string()),\n            operation: Some(self.operation.to_string()),\n            request_id: req\n                .extensions()\n                .get::<ServerRequestId>()\n                .map(|id| id.to_string()),\n            outstanding_requests: None,\n        }\n    }\n}\n\nimpl<Ser> Service<HttpRequest> for DefaultMetricsPluginService<Ser>\nwhere\n    Ser: Service<HttpRequest, Response = HttpResponse>,\n    Ser::Future: Send + 'static,\n{\n    type Response = Ser::Response;\n    type Error = Ser::Error;\n    type Future = DefaultMetricsFuture<Ser::Future>;\n\n    fn call(&mut self, mut req: HttpRequest) -> Self::Future {\n        let mut stopwatch = Stopwatch::new();\n        let operation_timer_guard = stopwatch.start_owned();\n\n        let default_request_metrics = self.get_default_request_metrics(&req);\n\n        let maybe_default_metrics_ext = req.extensions_mut().get_mut::<DefaultMetricsExtension>();\n\n        match maybe_default_metrics_ext {\n            Some(ext) => {\n                let extended_default_request_metrics =\n                    extend_default_request_metrics(default_request_metrics, ext);\n\n                ext.request_ext.metrics.lock().map_or_else(\n                    |e| {\n                        tracing::error!(\n                            \"Failed to acquire lock on DefaultRequestMetrics with error {e}. Metrics may be incomplete.\"\n                        )\n                    },\n                    |mut metrics| **metrics = extended_default_request_metrics,\n                );\n\n                let response_ext = ext.response_ext.clone();\n\n                req.extensions_mut().remove::<DefaultMetricsExtension>();\n\n                DefaultMetricsFuture::WithExtension {\n                    inner: self.inner.call(req),\n                    response_ext,\n                    operation_timer_guard: Some(operation_timer_guard),\n                }\n            }\n            None => {\n                // When no outer layer exists, provide the default metrics through metrique's\n                // application-wide global metric sink, if an underlying sink has been attached\n                let Some(sink) = ServiceMetrics::try_sink() else {\n                    tracing::info!(\n                        \"Default metrics collection skipped. No metrics sink configured. \\\n                        Use ServiceMetrics::attach() or ServiceMetrics::attach_to_stream() \\\n                        to enable metrics using metrique's globally provided sink.\"\n                    );\n                    return DefaultMetricsFuture::Passthrough {\n                        inner: self.inner.call(req),\n                    };\n                };\n\n                let mut metrics = DefaultMetrics::default().append_on_drop(sink);\n\n                metrics.default_request_metrics = Some(Slot::new(default_request_metrics));\n\n                metrics\n                    .default_request_metrics\n                    .as_mut()\n                    .and_then(|slot| slot.open(OnParentDrop::Discard))\n                    .expect(\"unreachable: the option is set to a created slot in this scope\");\n\n                DefaultMetricsFuture::WithMetrics {\n                    inner: self.inner.call(req),\n                    metrics,\n                    operation_timer_guard: Some(operation_timer_guard),\n                }\n            }\n        }\n    }\n\n    fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {\n        self.inner.poll_ready(cx)\n    }\n}\n\nfn get_default_response_metrics(\n    res: &HttpResponse,\n    operation_time: Option<Duration>,\n) -> DefaultResponseMetrics {\n    let status = res.status();\n\n    let success = if status.is_success() {\n        Some(true)\n    } else {\n        Some(false)\n    };\n\n    let client_error = if status.is_client_error() {\n        Some(true)\n    } else {\n        Some(false)\n    };\n\n    let server_error = if status.is_server_error() {\n        Some(true)\n    } else {\n        Some(false)\n    };\n\n    DefaultResponseMetrics {\n        http_status_code: Some(status.as_str().into()),\n        success,\n        client_error,\n        server_error,\n        operation_time,\n    }\n}\n\nfn extend_default_request_metrics(\n    metrics: DefaultRequestMetrics,\n    ext: &DefaultMetricsExtension,\n) -> DefaultRequestMetrics {\n    let config = &ext.request_ext.config;\n\n    if config.disable_all {\n        return DefaultRequestMetrics::default();\n    }\n\n    let outstanding_requests =\n        (!config.disable_outstanding_requests).then_some(ext.service_state.outstanding_requests);\n\n    DefaultRequestMetrics {\n        service: metrics.service.filter(|_| !config.disable_service),\n        service_version: metrics\n            .service_version\n            .filter(|_| !config.disable_service_version),\n        operation: metrics.operation.filter(|_| !config.disable_operation),\n        request_id: metrics.request_id.filter(|_| !config.disable_request_id),\n        outstanding_requests,\n    }\n}\n\nfn configure_default_response_metrics(\n    metrics: DefaultResponseMetrics,\n    config: &DefaultResponseMetricsConfig,\n) -> DefaultResponseMetrics {\n    if config.disable_all {\n        return DefaultResponseMetrics::default();\n    }\n\n    DefaultResponseMetrics {\n        http_status_code: metrics\n            .http_status_code\n            .filter(|_| !config.disable_http_status_code),\n        success: metrics.success.filter(|_| !config.disable_success),\n        client_error: metrics\n            .client_error\n            .filter(|_| !config.disable_client_error),\n        server_error: metrics\n            .server_error\n            .filter(|_| !config.disable_server_error),\n        operation_time: metrics\n            .operation_time\n            .filter(|_| !config.disable_operation_time),\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server-metrics/src/service.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::future::Future;\nuse std::marker::PhantomData;\nuse std::pin::Pin;\nuse std::task::Context;\nuse std::task::Poll;\n\nuse pin_project_lite::pin_project;\nuse tower::Service;\n\nuse crate::default::service_counter::ServiceCounterGuard;\nuse crate::default::DefaultMetricsServiceCounters;\nuse crate::default::DefaultMetricsServiceState;\nuse crate::default::DefaultRequestMetricsConfig;\nuse crate::default::DefaultResponseMetricsConfig;\nuse crate::traits::InitMetrics;\nuse crate::traits::ResponseMetrics;\nuse crate::traits::ThreadSafeCloseEntry;\nuse crate::traits::ThreadSafeEntrySink;\nuse crate::types::HttpRequest;\nuse crate::types::HttpResponse;\n\npin_project! {\n    /// Future returned by [`MetricsLayerService`].\n    ///\n    /// This type is not intended to be used directly. See [`MetricsLayer`](crate::layer::MetricsLayer).\n    pub struct MetricsLayerServiceFuture<F, Entry, Sink, Res>\n    where\n        F: Future,\n        Entry: ThreadSafeCloseEntry,\n        Sink: ThreadSafeEntrySink<Entry>,\n        Res: ResponseMetrics<Entry>,\n    {\n        #[pin]\n        inner: F,\n        metrics: metrique::AppendAndCloseOnDrop<Entry, Sink>,\n        response_metrics: Option<Res>,\n        default_service_state: DefaultMetricsServiceCounters,\n        outstanding_requests_counter_guard: ServiceCounterGuard\n    }\n}\n\nimpl<F, Entry, Sink, Res, Err> Future for MetricsLayerServiceFuture<F, Entry, Sink, Res>\nwhere\n    F: Future<Output = Result<HttpResponse, Err>>,\n    Entry: ThreadSafeCloseEntry,\n    Sink: ThreadSafeEntrySink<Entry>,\n    Res: ResponseMetrics<Entry>,\n{\n    type Output = Result<HttpResponse, Err>;\n\n    fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {\n        // for safely accessing the pinned inner future\n        let this = self.project();\n\n        match this.inner.poll(cx) {\n            Poll::Ready(Ok(mut res)) => {\n                if let Some(response_metrics) = this.response_metrics {\n                    (response_metrics)(&mut res, this.metrics);\n                }\n\n                Poll::Ready(Ok(res))\n            }\n            Poll::Ready(Err(e)) => Poll::Ready(Err(e)),\n            Poll::Pending => Poll::Pending,\n        }\n    }\n}\n\n/// Tower service that collects metrics for HTTP requests and responses.\n///\n/// This type is not intended to be used directly. See [`MetricsLayer`](crate::layer::MetricsLayer).\npub struct MetricsLayerService<Ser, Entry, Sink, Init, Res>\nwhere\n    Entry: ThreadSafeCloseEntry,\n    Sink: ThreadSafeEntrySink<Entry>,\n    Init: InitMetrics<Entry, Sink>,\n    Res: ResponseMetrics<Entry>,\n{\n    pub(crate) inner: Ser,\n    pub(crate) init_metrics: Init,\n    pub(crate) response_metrics: Option<Res>,\n    pub(crate) default_metrics_extension_fn: fn(\n        &mut HttpRequest,\n        &mut Entry,\n        DefaultRequestMetricsConfig,\n        DefaultResponseMetricsConfig,\n        DefaultMetricsServiceState,\n    ),\n    pub(crate) default_req_metrics_config: DefaultRequestMetricsConfig,\n    pub(crate) default_res_metrics_config: DefaultResponseMetricsConfig,\n    pub(crate) default_service_counters: DefaultMetricsServiceCounters,\n\n    pub(crate) _entry_sink: PhantomData<Sink>,\n}\nimpl<Ser, Entry, Sink, Init, Res> Clone for MetricsLayerService<Ser, Entry, Sink, Init, Res>\nwhere\n    Ser: Clone,\n    Entry: ThreadSafeCloseEntry,\n    Sink: ThreadSafeEntrySink<Entry>,\n    Init: InitMetrics<Entry, Sink>,\n    Res: ResponseMetrics<Entry>,\n{\n    fn clone(&self) -> Self {\n        Self {\n            inner: self.inner.clone(),\n            init_metrics: self.init_metrics.clone(),\n            response_metrics: self.response_metrics.clone(),\n            default_metrics_extension_fn: self.default_metrics_extension_fn,\n            default_req_metrics_config: self.default_req_metrics_config.clone(),\n            default_res_metrics_config: self.default_res_metrics_config.clone(),\n            default_service_counters: self.default_service_counters.clone(),\n\n            _entry_sink: PhantomData,\n        }\n    }\n}\nimpl<Ser, Entry, Sink, Init, Res> Service<HttpRequest>\n    for MetricsLayerService<Ser, Entry, Sink, Init, Res>\nwhere\n    Ser: Service<HttpRequest, Response = HttpResponse> + Clone,\n    Ser::Future: Send + 'static,\n    Entry: ThreadSafeCloseEntry,\n    Sink: ThreadSafeEntrySink<Entry>,\n    Init: InitMetrics<Entry, Sink>,\n    Res: ResponseMetrics<Entry>,\n{\n    type Response = Ser::Response;\n    type Error = Ser::Error;\n    type Future = MetricsLayerServiceFuture<Ser::Future, Entry, Sink, Res>;\n\n    fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {\n        self.inner.poll_ready(cx)\n    }\n\n    fn call(&mut self, mut req: HttpRequest) -> Self::Future {\n        let mut metrics = (self.init_metrics)(&mut req);\n\n        // We increment the outstanding requests and get the count at this layer\n        // (typically outer middleware) so we can get this as close to the time\n        // this request entered the system as possible\n        let (outstanding_requests_counter_guard, outstanding_requests) = self\n            .default_service_counters\n            .outstanding_requests_counter\n            .increment();\n\n        (self.default_metrics_extension_fn)(\n            &mut req,\n            &mut metrics,\n            self.default_req_metrics_config.clone(),\n            self.default_res_metrics_config.clone(),\n            DefaultMetricsServiceState {\n                outstanding_requests,\n            },\n        );\n\n        MetricsLayerServiceFuture {\n            inner: self.inner.call(req),\n            metrics,\n            response_metrics: self.response_metrics.clone(),\n            default_service_state: self.default_service_counters.clone(),\n            outstanding_requests_counter_guard,\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server-metrics/src/traits.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse metrique::AppendAndCloseOnDrop;\nuse metrique::RootEntry;\nuse metrique_core::CloseEntry;\nuse metrique_writer::EntrySink;\n\nuse crate::types::HttpRequest;\nuse crate::types::HttpResponse;\n\n/// A thread safe [`CloseEntry`]\npub trait ThreadSafeCloseEntry: CloseEntry + Send + Sync + 'static {}\nimpl<T> ThreadSafeCloseEntry for T where T: CloseEntry + Send + Sync + 'static {}\n\n/// A thread safe [`EntrySink`]\npub trait ThreadSafeEntrySink<Entry>:\n    EntrySink<RootEntry<Entry::Closed>> + Send + Sync + 'static\nwhere\n    Entry: CloseEntry + Send + Sync + 'static,\n{\n}\nimpl<T, Entry> ThreadSafeEntrySink<Entry> for T\nwhere\n    Entry: CloseEntry + Send + Sync + 'static,\n    T: EntrySink<RootEntry<Entry::Closed>> + Send + Sync + 'static,\n{\n}\n\n/// Helper trait for functions that initialize a metrics entry for each request\n///\n/// # Example\n///\n/// ```rust,ignore\n/// .init_metrics(|req| {\n///     MyMetrics::default().append_on_drop(MetricsSink::default())\n/// })\n/// ```\npub trait InitMetrics<Entry, Sink>:\n    Fn(&mut HttpRequest) -> AppendAndCloseOnDrop<Entry, Sink> + Clone + Send + Sync + 'static\nwhere\n    Entry: ThreadSafeCloseEntry,\n    Sink: ThreadSafeEntrySink<Entry>,\n{\n}\nimpl<T, Entry, Sink> InitMetrics<Entry, Sink> for T\nwhere\n    Entry: ThreadSafeCloseEntry,\n    Sink: ThreadSafeEntrySink<Entry>,\n    T: Fn(&mut HttpRequest) -> AppendAndCloseOnDrop<Entry, Sink> + Clone + Send + Sync + 'static,\n{\n}\n\n/// Helper trait for functions that populate metrics from responses\n///\n/// # Example\n///\n/// ```rust,ignore\n/// .response_metrics(|response, metrics| {\n///     metrics.content_length = response\n///         .headers()\n///         .get(\"content-length\")\n///         .and_then(|v| v.to_str().ok())\n///         .and_then(|v| v.parse().ok());\n/// })\n/// ```\npub trait ResponseMetrics<Entry>:\n    Fn(&mut HttpResponse, &mut Entry) + Clone + Send + Sync + 'static\nwhere\n    Entry: ThreadSafeCloseEntry,\n{\n}\nimpl<T, Entry> ResponseMetrics<Entry> for T\nwhere\n    Entry: ThreadSafeCloseEntry,\n    T: Fn(&mut HttpResponse, &mut Entry) + Clone + Send + Sync + 'static,\n{\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server-metrics/src/types.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n#[cfg(not(any(\n    feature = \"aws-smithy-http-server-065\",\n    feature = \"aws-smithy-legacy-http-server\"\n)))]\npub(crate) type RequestBody = hyper::body::Incoming;\n#[cfg(not(any(\n    feature = \"aws-smithy-http-server-065\",\n    feature = \"aws-smithy-legacy-http-server\"\n)))]\npub(crate) use aws_smithy_http_server;\n\n/// For pre-http1x codegen version support\n#[cfg(all(\n    feature = \"aws-smithy-http-server-065\",\n    not(feature = \"aws-smithy-legacy-http-server\")\n))]\npub(crate) use aws_smithy_http_server_065 as aws_smithy_http_server;\n\n/// For post-http1x codegen version support, if http1x is not used\n/// Takes precedence if both \"aws-smithy-http-server-065\" and \"aws-smithy-legacy-http-server\" are enabled\n#[cfg(feature = \"aws-smithy-legacy-http-server\")]\npub(crate) use aws_smithy_legacy_http_server as aws_smithy_http_server;\n#[cfg(any(\n    feature = \"aws-smithy-http-server-065\",\n    feature = \"aws-smithy-legacy-http-server\"\n))]\nuse http_02 as http;\n#[cfg(any(\n    feature = \"aws-smithy-http-server-065\",\n    feature = \"aws-smithy-legacy-http-server\"\n))]\npub(crate) type RequestBody = hyper_014::Body;\n\npub(crate) type ResponseBody = aws_smithy_http_server::body::BoxBody;\npub type HttpRequest = http::Request<RequestBody>; // pub because needed in macro\npub(crate) type HttpResponse = http::Response<ResponseBody>;\npub(crate) type HttpRequestParts = http::request::Parts;\npub(crate) type HttpStatusCode = http::StatusCode;\n\npub(crate) type DefaultInit<Entry, Sink> =\n    fn(&mut HttpRequest) -> metrique::AppendAndCloseOnDrop<Entry, Sink>;\npub(crate) type DefaultRs<Entry> = fn(&mut HttpResponse, &mut Entry);\n\npub(crate) fn empty_response_body() -> ResponseBody {\n    #[cfg(not(any(\n        feature = \"aws-smithy-http-server-065\",\n        feature = \"aws-smithy-legacy-http-server\"\n    )))]\n    return aws_smithy_http_server::body::empty();\n    #[cfg(any(\n        feature = \"aws-smithy-http-server-065\",\n        feature = \"aws-smithy-legacy-http-server\"\n    ))]\n    return aws_smithy_http_server::body::boxed(http_body_04::Empty::new());\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server-metrics-macro/Cargo.toml",
    "content": "[lib]\nproc-macro = true\n\n[package]\nname = \"aws-smithy-http-server-metrics-macro\"\nversion = \"0.1.1\"\nauthors = [\n    \"AWS Rust SDK Team <aws-sdk-rust@amazon.com>\",\n    \"Jason Gin <jasgin@amazon.com>\",\n]\ndescription = \"Server metrics via metrique integration.\"\nedition = \"2021\"\nlicense = \"Apache-2.0\"\nrepository = \"https://github.com/smithy-lang/smithy-rs\"\nrust-version = \"1.91.1\"\n\n[dependencies]\nsyn = { version = \"2.0.114\", features = [\"full\"] }\nquote = \"1.0.44\"\nproc-macro2 = \"1.0.106\"\n\n[package.metadata.docs.rs]\nall-features = true\ntargets = [\"x86_64-unknown-linux-gnu\"]\ncargo-args = [\"-Zunstable-options\", \"-Zrustdoc-scrape-examples\"]\nrustdoc-args = [\"--cfg\", \"docsrs\"]\n# End of docs.rs metadata\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server-metrics-macro/LICENSE",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server-metrics-macro/README.md",
    "content": "# aws-smithy-http-server-metrics-macro\n\nProc macro crate for aws-smithy-http-server-metrics.\n\n<!-- anchor_start:footer -->\nThis crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly.\n<!-- anchor_end:footer -->\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server-metrics-macro/src/lib.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/* Automatically managed default lints */\n#![cfg_attr(docsrs, feature(doc_cfg))]\n/* End of automatically managed default lints */\n\nextern crate proc_macro;\n\nuse proc_macro::TokenStream;\nuse syn::parse::Parse;\nuse syn::Item;\n\nuse crate::macro_impl::smithy_metrics_impl;\n\nmod macro_impl;\n\n#[proc_macro_attribute]\npub fn smithy_metrics(attr: TokenStream, input: TokenStream) -> TokenStream {\n    let item = syn::parse_macro_input!(input as Item);\n\n    let Item::Struct(item_struct) = item else {\n        return syn::Error::new_spanned(item, \"expected `struct`\")\n            .to_compile_error()\n            .into();\n    };\n\n    let attributes = syn::parse_macro_input!(attr as SmithyMetricsStructAttrs);\n\n    smithy_metrics_impl(attributes, item_struct).into()\n}\n\npub(crate) struct SmithyMetricsStructAttrs {}\nimpl Parse for SmithyMetricsStructAttrs {\n    fn parse(_input: syn::parse::ParseStream) -> syn::Result<Self> {\n        Ok(SmithyMetricsStructAttrs {})\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server-metrics-macro/src/macro_impl.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse proc_macro2::TokenStream as TokenStream2;\nuse quote::quote;\nuse syn::Attribute;\nuse syn::Ident;\nuse syn::ItemStruct;\n\nuse crate::SmithyMetricsStructAttrs;\n\n/// Represents a field marked with `#[smithy_metrics(operation)]` that needs\n/// to be inserted as an operation metrics extension into HTTP requests.\nstruct OperationField {\n    name: Ident,\n    ty: syn::Type,\n}\n\n/// Implementation of the `#[smithy_metrics]` procedural macro.\n///\n/// This macro:\n/// 1. Processes fields marked with `#[smithy_metrics(operation)]`\n/// 2. Wraps their types in `metrique::Slot<T>` if not already wrapped\n/// 3. Adds default request/repsonse metrics fields\n/// 4. Generates a builder trait and implementations for the metrics layer for the annotated metrics struct\npub(crate) fn smithy_metrics_impl(\n    _attrs: SmithyMetricsStructAttrs,\n    mut metrics_struct: ItemStruct,\n) -> TokenStream2 {\n    let syn::Fields::Named(ref mut fields) = metrics_struct.fields else {\n        return syn::Error::new_spanned(metrics_struct, \"only named fields are supported\")\n            .to_compile_error();\n    };\n\n    let mut extension_fields = Vec::new();\n\n    // Collect extension fields and remove smithy_metrics attributes\n    for field in &mut fields.named {\n        let has_extension = has_operation_attr(&field.attrs);\n        field.attrs = clean_attrs(&field.attrs);\n\n        if !has_extension {\n            continue;\n        }\n\n        let Some(field_name) = field.ident.clone() else {\n            return syn::Error::new_spanned(field, \"operation field must have a name\")\n                .to_compile_error();\n        };\n\n        // Check if user already wrapped in Slot\n        // Return compiler error if it has, since we\n        // will need to double slot the type to provide\n        // a better API to handler-level metrics\n        if extract_inner_type(&field.ty).is_some() {\n            return syn::Error::new_spanned(\n                field,\n                \"operation fields should not be wrapped in Slot\",\n            )\n            .to_compile_error();\n        }\n\n        // Always wrap in double Slot\n        let ty = field.ty.clone();\n        field.ty = syn::parse_quote! {\n            metrique::Slot<metrique::Slot<#ty>>\n        };\n        extension_fields.push(OperationField {\n            name: field_name,\n            ty,\n        });\n    }\n\n    fields.named.push(syn::parse_quote! {\n        #[metrics(flatten)]\n        default_request_metrics: Option<metrique::Slot<aws_smithy_http_server_metrics::default::DefaultRequestMetrics>>\n    });\n\n    fields.named.push(syn::parse_quote! {\n        #[metrics(flatten)]\n        default_response_metrics: Option<metrique::Slot<aws_smithy_http_server_metrics::default::DefaultResponseMetrics>>\n    });\n\n    let ext_trait = generate_ext_trait(&metrics_struct.ident);\n    let ext_trait_impls = generate_ext_trait_impl(&metrics_struct.ident, &extension_fields);\n\n    quote! {\n        #metrics_struct\n        #ext_trait\n        #ext_trait_impls\n    }\n}\n\n/// Generates a builder extension trait for the metrics struct.\nfn generate_ext_trait(metrics_struct: &Ident) -> TokenStream2 {\n    let trait_name = quote::format_ident!(\"{}BuildExt\", metrics_struct);\n    quote! {\n        pub trait #trait_name<Sink, Init, Res>\n        where\n            Sink: aws_smithy_http_server_metrics::traits::ThreadSafeEntrySink<#metrics_struct>,\n            Init: aws_smithy_http_server_metrics::traits::InitMetrics<#metrics_struct, Sink>,\n            Res: aws_smithy_http_server_metrics::traits::ResponseMetrics<#metrics_struct>,\n        {\n            fn build(self) -> aws_smithy_http_server_metrics::layer::MetricsLayer<#metrics_struct, Sink, Init, Res>;\n        }\n    }\n}\n\nfn generate_ext_trait_impl(\n    struct_ident: &Ident,\n    operation_fields: &[OperationField],\n) -> TokenStream2 {\n    let lowercase_struct_name = quote::format_ident!(\"{}\", struct_ident.to_string().to_lowercase());\n    let trait_name = quote::format_ident!(\"{}BuildExt\", struct_ident);\n    let macro_name = quote::format_ident!(\"impl_build_{}_for_state\", lowercase_struct_name);\n\n    let operation_insertions = operation_fields.iter().map(|ext| {\n        let field_name = &ext.name;\n        let ty = &ext.ty;\n        quote! {\n            let inner_slot = metrique::Slot::new(<#ty>::default());\n            let outer_slot = metrique::Slot::new(inner_slot);\n            metrics.#field_name = outer_slot;\n            let slotguard = metrics\n                .#field_name\n                .open(metrique::OnParentDrop::Discard)\n                .expect(\"unreachable: the slot was created in this scope and is not opened before this point\");\n            req.extensions_mut().insert(aws_smithy_http_server_metrics::operation::MetricsExtension::__macro_new(slotguard));\n        }\n    });\n\n    quote! {\n        macro_rules! #macro_name {\n            ($state:ty) => {\n                impl<Sink, Init, Res> #trait_name<Sink, Init, Res> for aws_smithy_http_server_metrics::MetricsLayerBuilder<$state, #struct_ident, Sink, Init, Res>\n                where\n                    Sink: aws_smithy_http_server_metrics::traits::ThreadSafeEntrySink<#struct_ident>,\n                    Init: aws_smithy_http_server_metrics::traits::InitMetrics<#struct_ident, Sink>,\n                    Res: aws_smithy_http_server_metrics::traits::ResponseMetrics<#struct_ident>,\n                {\n                    fn build(self) -> aws_smithy_http_server_metrics::layer::MetricsLayer<#struct_ident, Sink, Init, Res> {\n                        let default_metrics_extension_fn =\n                            |req: &mut aws_smithy_http_server_metrics::types::HttpRequest,\n                            metrics: &mut #struct_ident,\n                            req_config: aws_smithy_http_server_metrics::default::DefaultRequestMetricsConfig,\n                            res_config: aws_smithy_http_server_metrics::default::DefaultResponseMetricsConfig,\n                            service_state: aws_smithy_http_server_metrics::default::DefaultMetricsServiceState| {\n                                metrics.default_request_metrics =\n                                    Some(metrique::Slot::new(aws_smithy_http_server_metrics::default::DefaultRequestMetrics::default()));\n                                metrics.default_response_metrics =\n                                    Some(metrique::Slot::new(aws_smithy_http_server_metrics::default::DefaultResponseMetrics::default()));\n\n                                let default_req_metrics_slotguard = metrics\n                                    .default_request_metrics\n                                    .as_mut()\n                                    .and_then(|slot| slot.open(metrique::OnParentDrop::Discard))\n                                    .expect(\n                                        \"unreachable: the option is set to a created slot in this scope\",\n                                    );\n                                let default_res_metrics_slotguard = metrics\n                                    .default_response_metrics\n                                    .as_mut()\n                                    .and_then(|slot| slot.open(metrique::OnParentDrop::Discard))\n                                    .expect(\n                                        \"unreachable: the option is set to a created slot in this scope\",\n                                    );\n\n                                let ext = aws_smithy_http_server_metrics::default::DefaultMetricsExtension::__macro_new(\n                                    std::sync::Arc::new(std::sync::Mutex::new(default_req_metrics_slotguard)),\n                                    std::sync::Arc::new(std::sync::Mutex::new(default_res_metrics_slotguard)),\n                                    req_config,\n                                    res_config,\n                                    service_state,\n                                );\n\n                                req.extensions_mut().insert(ext);\n\n                                #(#operation_insertions)*\n                            };\n\n                        aws_smithy_http_server_metrics::layer::MetricsLayer::__macro_new(\n                            self.init_metrics.expect(\"init_metrics must be provided\"),\n                            self.response_metrics,\n                            default_metrics_extension_fn,\n                            self.default_req_metrics_config,\n                            self.default_res_metrics_config,\n                        )\n                    }\n                }\n            };\n        }\n\n        #macro_name!(aws_smithy_http_server_metrics::layer::builder::WithRq);\n        #macro_name!(aws_smithy_http_server_metrics::layer::builder::WithRqAndRs);\n    }\n}\n\n/// Removes all `#[smithy_metrics(...)]` attributes from a field.\n///\n/// These attibutes are only used by the macro for processing and are not\n/// valid Rust attributes, so they must be removed before code generation.\nfn clean_attrs(attrs: &[Attribute]) -> Vec<Attribute> {\n    attrs\n        .iter()\n        .filter(|attr| !attr.path().is_ident(\"smithy_metrics\"))\n        .cloned()\n        .collect()\n}\n\n/// Checks if a field has the `#[smithy_metrics(operation)]` attribute.\nfn has_operation_attr(attrs: &[Attribute]) -> bool {\n    attrs.iter().any(|attr| {\n        // Check if attribute path is \"smithy_metrics\"\n        if !attr.path().is_ident(\"smithy_metrics\") {\n            return false;\n        }\n\n        // Parse the attribute arguments to check for \"operation\"\n        attr.parse_args::<syn::Ident>()\n            .map(|ident| ident == \"operation\")\n            .unwrap_or(false)\n    })\n}\n\n/// Recursively searches a type for `Slot<T>` and extracts the inner type `T`, otherwise returns None.\n///\n/// Examples:\n/// - `MyType` → `None`\n/// - `Slot<MyType>` → `Some(MyType)`\n/// - `Option<Slot<MyType>>` → `Some(MyType)`\n/// - `Vec<Option<Slot<MyType>>>` → `Some(MyType)`\nfn extract_inner_type(ty: &syn::Type) -> Option<syn::Type> {\n    // Only handle path types (e.g., Foo::Bar<T>)\n    let syn::Type::Path(type_path) = ty else {\n        return None;\n    };\n\n    // Iterate through each segment of the path (e.g., std::option::Option has 3 segments)\n    for segment in &type_path.path.segments {\n        // Check if this segment is \"Slot\"\n        if segment.ident == \"Slot\" {\n            // Extract the generic argument: Slot<T> → T\n            let syn::PathArguments::AngleBracketed(args) = &segment.arguments else {\n                continue;\n            };\n            let syn::GenericArgument::Type(inner_ty) = args.args.first()? else {\n                continue;\n            };\n            return Some(inner_ty.clone());\n        }\n\n        // If not \"Slot\", recursively search generic arguments\n        // This handles cases like Option<Slot<T>> or Vec<Slot<T>>\n        if let syn::PathArguments::AngleBracketed(args) = &segment.arguments {\n            for arg in &args.args {\n                if let syn::GenericArgument::Type(inner_ty) = arg {\n                    if let Some(found) = extract_inner_type(inner_ty) {\n                        return Some(found);\n                    }\n                }\n            }\n        }\n    }\n    None\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n\n    /// Helper to extract the generated struct from macro output\n    fn get_generated_struct(output: TokenStream2) -> syn::ItemStruct {\n        let file: syn::File = syn::parse2(output).expect(\"should parse generated code\");\n        file.items\n            .iter()\n            .find_map(|item| {\n                if let syn::Item::Struct(s) = item {\n                    Some(s.clone())\n                } else {\n                    None\n                }\n            })\n            .expect(\"should have generated struct\")\n    }\n\n    /// Helper to find a field by name in a struct\n    fn find_field<'a>(struct_item: &'a syn::ItemStruct, field_name: &str) -> &'a syn::Field {\n        let syn::Fields::Named(fields) = &struct_item.fields else {\n            panic!(\"should have named fields\");\n        };\n        fields\n            .named\n            .iter()\n            .find(|f| f.ident.as_ref().unwrap() == field_name)\n            .expect(&format!(\"should have field {}\", field_name))\n    }\n\n    /// Helper to assert that a field has the expected type\n    fn assert_field_type(struct_item: &syn::ItemStruct, field_name: &str, expected_ty: syn::Type) {\n        let field = find_field(struct_item, field_name);\n        let actual_ty = &field.ty;\n        assert_eq!(\n            quote::quote!(#actual_ty).to_string(),\n            quote::quote!(#expected_ty).to_string(),\n            \"field '{}' should have type {}\",\n            field_name,\n            quote::quote!(#expected_ty)\n        );\n    }\n\n    #[test]\n    fn test_wraps_operation_field_in_slot() {\n        let input: ItemStruct = syn::parse_quote! {\n            struct MyMetrics {\n                #[smithy_metrics(operation)]\n                my_field: MyType,\n            }\n        };\n        let attrs = SmithyMetricsStructAttrs {};\n\n        let output = smithy_metrics_impl(attrs, input);\n        let generated_struct = get_generated_struct(output);\n\n        // Verify my_field is wrapped in double Slot\n        assert_field_type(\n            &generated_struct,\n            \"my_field\",\n            syn::parse_quote!(metrique::Slot<metrique::Slot<MyType>>),\n        );\n\n        // Verify default fields exist\n        find_field(&generated_struct, \"default_request_metrics\");\n        find_field(&generated_struct, \"default_response_metrics\");\n    }\n\n    #[test]\n    fn test_already_wrapped_slot_errors() {\n        let input: ItemStruct = syn::parse_quote! {\n            struct MyMetrics {\n                #[smithy_metrics(operation)]\n                my_field: Slot<MyType>,\n            }\n        };\n        let attrs = SmithyMetricsStructAttrs {};\n\n        let output = smithy_metrics_impl(attrs, input);\n\n        // Verify it produces a compile error\n        let output_str = output.to_string();\n        assert!(output_str.contains(\"compile_error\"));\n        assert!(output_str.contains(\"should not be wrapped in Slot\"));\n    }\n\n    #[test]\n    fn test_option_slot_errors() {\n        let input: ItemStruct = syn::parse_quote! {\n            struct MyMetrics {\n                #[smithy_metrics(operation)]\n                my_field: Option<Slot<MyType>>,\n            }\n        };\n        let attrs = SmithyMetricsStructAttrs {};\n\n        let output = smithy_metrics_impl(attrs, input);\n\n        // Verify it produces a compile error\n        let output_str = output.to_string();\n        assert!(output_str.contains(\"compile_error\"));\n        assert!(output_str.contains(\"should not be wrapped in Slot\"));\n    }\n\n    #[test]\n    fn test_mixed_operation_and_regular_fields() {\n        let input: ItemStruct = syn::parse_quote! {\n            struct MyMetrics {\n                #[smithy_metrics(operation)]\n                operation_field: MyType,\n                regular_field: String,\n                another_regular: i32,\n            }\n        };\n        let attrs = SmithyMetricsStructAttrs {};\n\n        let output = smithy_metrics_impl(attrs, input);\n        let generated_struct = get_generated_struct(output);\n\n        // Verify operation_field is wrapped in double Slot\n        assert_field_type(\n            &generated_struct,\n            \"operation_field\",\n            syn::parse_quote!(metrique::Slot<metrique::Slot<MyType>>),\n        );\n\n        // Verify regular fields are unchanged\n        assert_field_type(\n            &generated_struct,\n            \"regular_field\",\n            syn::parse_quote!(String),\n        );\n        assert_field_type(&generated_struct, \"another_regular\", syn::parse_quote!(i32));\n    }\n\n    #[test]\n    fn test_multiple_operation_fields() {\n        let input: ItemStruct = syn::parse_quote! {\n            struct MyMetrics {\n                #[smithy_metrics(operation)]\n                first_operation: FirstType,\n                #[smithy_metrics(operation)]\n                second_operation: SecondType,\n                #[smithy_metrics(operation)]\n                third_operation: ThirdType,\n            }\n        };\n        let attrs = SmithyMetricsStructAttrs {};\n\n        let output = smithy_metrics_impl(attrs, input);\n        let generated_struct = get_generated_struct(output);\n\n        // Verify all operation fields are wrapped in double Slot\n        assert_field_type(\n            &generated_struct,\n            \"first_operation\",\n            syn::parse_quote!(metrique::Slot<metrique::Slot<FirstType>>),\n        );\n        assert_field_type(\n            &generated_struct,\n            \"second_operation\",\n            syn::parse_quote!(metrique::Slot<metrique::Slot<SecondType>>),\n        );\n        assert_field_type(\n            &generated_struct,\n            \"third_operation\",\n            syn::parse_quote!(metrique::Slot<metrique::Slot<ThirdType>>),\n        );\n    }\n\n    // A few more complex tets for extract_inner_type\n\n    #[test]\n    fn test_extract_inner_type_nested() {\n        let ty: syn::Type = syn::parse_quote!(Vec<Option<Slot<MyType>>>);\n        let result = extract_inner_type(&ty).expect(\"should extract inner type\");\n        let expected: syn::Type = syn::parse_quote!(MyType);\n        assert_eq!(\n            quote::quote!(#result).to_string(),\n            quote::quote!(#expected).to_string()\n        );\n    }\n\n    #[test]\n    fn test_extract_inner_type_complex_inner() {\n        let ty: syn::Type = syn::parse_quote!(Slot<std::collections::HashMap<String, i32>>);\n        let result = extract_inner_type(&ty).expect(\"should extract inner type\");\n        let expected: syn::Type = syn::parse_quote!(std::collections::HashMap<String, i32>);\n        assert_eq!(\n            quote::quote!(#result).to_string(),\n            quote::quote!(#expected).to_string()\n        );\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server-python/Cargo.toml",
    "content": "[package]\nname = \"aws-smithy-http-server-python\"\nversion = \"0.67.1\"\nauthors = [\"Smithy Rust Server <smithy-rs-server@amazon.com>\"]\nedition = \"2021\"\nlicense = \"Apache-2.0\"\nrepository = \"https://github.com/smithy-lang/smithy-rs\"\nkeywords = [\"smithy\", \"framework\", \"web\", \"api\", \"aws\"]\ncategories = [\"asynchronous\", \"web-programming\", \"api-bindings\"]\ndescription = \"\"\"\nPython server runtime for Smithy Rust Server Framework.\n\"\"\"\npublish = true\nrust-version = \"1.91.1\"\n\n[dependencies]\naws-smithy-http = { path = \"../aws-smithy-http\" }\naws-smithy-legacy-http-server = { path = \"../aws-smithy-legacy-http-server\", features = [\"aws-lambda\"] }\naws-smithy-json = { path = \"../aws-smithy-json\" }\naws-smithy-types = { path = \"../aws-smithy-types\", features = [\"byte-stream-poll-next\", \"http-body-0-4-x\"] }\naws-smithy-xml = { path = \"../aws-smithy-xml\" }\nbytes = \"1.11.1\"\nfutures = \"0.3\"\nhttp = \"0.2.12\"\nhyper = { version = \"0.14.26\", features = [\"server\", \"http1\", \"http2\", \"tcp\", \"stream\"] }\ntls-listener = { version = \"0.7.0\", features = [\"rustls\", \"hyper-h2\"] }\nrustls-pemfile = \"1.0.1\"\ntokio-rustls = \"0.24.0\"\nlambda_http = { version = \"0.8.4\" }\nnum_cpus = \"1.13.1\"\nparking_lot = \"0.12.1\"\npin-project-lite = \"0.2.14\"\npyo3 = \"0.20\"\npyo3-asyncio = { version = \"0.20.0\", features = [\"tokio-runtime\"] }\nsignal-hook = { version = \"0.3.14\", features = [\"extended-siginfo\"] }\nsocket2 = { version = \"0.5.5\", features = [\"all\"] }\nthiserror = \"2\"\ntokio = { version = \"1.49.0\", features = [\"full\"] }\ntokio-stream = \"0.1.2\"\ntower = { version = \"0.4.13\", features = [\"util\"] }\ntracing = \"0.1.44\"\ntracing-subscriber = { version = \"0.3.22\", features = [\"json\", \"env-filter\"] }\ntracing-appender = { version = \"0.2.2\"}\n\n[dev-dependencies]\npretty_assertions = \"1\"\nfutures-util = { version = \"0.3.29\", default-features = false }\ntower-test = \"0.4\"\ntokio-test = \"0.4\"\npyo3-asyncio = { version = \"0.20.0\", features = [\"testing\", \"attributes\", \"tokio-runtime\", \"unstable-streams\"] }\nrcgen = \"0.10.0\"\nhyper-rustls = { version = \"0.24.2\", features = [\"http2\"] }\n\n# PyO3 Asyncio tests cannot use Cargo's default testing harness because `asyncio`\n# wants to control the main thread. So we need to use testing harness provided by `pyo3_asyncio`\n# for the async Python tests. For more detail see:\n# https://docs.rs/pyo3-asyncio/0.18.0/pyo3_asyncio/testing/index.html#pyo3-asyncio-testing-utilities\n[[test]]\nname = \"middleware_tests\"\npath = \"src/middleware/pytests/harness.rs\"\nharness = false\n[[test]]\nname = \"python_tests\"\npath = \"src/pytests/harness.rs\"\nharness = false\n\n[package.metadata.docs.rs]\nall-features = true\ntargets = [\"x86_64-unknown-linux-gnu\"]\ncargo-args = [\"-Zunstable-options\", \"-Zrustdoc-scrape-examples\"]\nrustdoc-args = [\"--cfg\", \"docsrs\"]\n# End of docs.rs metadata\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server-python/LICENSE",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server-python/README.md",
    "content": "# aws-smithy-http-server-python\n\nServer libraries for smithy-rs generated servers, targeting pure Python business logic.\n\n<!-- anchor_start:footer -->\nThis crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly.\n<!-- anchor_end:footer -->\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server-python/src/context/lambda.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Support for injecting [PyLambdaContext] to [super::PyContext].\n\nuse std::collections::HashSet;\n\nuse http::Extensions;\nuse lambda_http::Context as LambdaContext;\nuse pyo3::{types::PyDict, PyObject, PyResult, Python};\n\nuse crate::{lambda::PyLambdaContext, rich_py_err, util::is_optional_of};\n\n#[derive(Clone)]\npub struct PyContextLambda {\n    fields: HashSet<String>,\n}\n\nimpl PyContextLambda {\n    pub fn new(ctx: PyObject) -> PyResult<Self> {\n        let fields = Python::with_gil(|py| get_lambda_ctx_fields(py, &ctx))?;\n        Ok(Self { fields })\n    }\n\n    pub fn populate_from_extensions(&self, ctx: PyObject, ext: &Extensions) {\n        if self.fields.is_empty() {\n            // Return early without acquiring GIL\n            return;\n        }\n\n        let lambda_ctx = ext\n            .get::<LambdaContext>()\n            .cloned()\n            .map(PyLambdaContext::new);\n\n        Python::with_gil(|py| {\n            for field in self.fields.iter() {\n                if let Err(err) = ctx.setattr(py, field.as_str(), lambda_ctx.clone()) {\n                    tracing::warn!(field = ?field, error = ?rich_py_err(err), \"could not inject `LambdaContext` to context\")\n                }\n            }\n        });\n    }\n}\n\n// Inspects the given `PyObject` to detect fields that type-hinted `PyLambdaContext`.\nfn get_lambda_ctx_fields(py: Python, ctx: &PyObject) -> PyResult<HashSet<String>> {\n    let typing = py.import(\"typing\")?;\n    let hints = match typing\n        .call_method1(\"get_type_hints\", (ctx,))\n        .and_then(|res| res.extract::<&PyDict>())\n    {\n        Ok(hints) => hints,\n        Err(_) => {\n            // `get_type_hints` could fail if `ctx` is `None`, which is the default value\n            // for the context if user does not provide a custom class.\n            // In that case, this is not really an error and we should just return an empty set.\n            return Ok(HashSet::new());\n        }\n    };\n\n    let mut fields = HashSet::new();\n    for (key, value) in hints {\n        if is_optional_of::<PyLambdaContext>(py, value)? {\n            fields.insert(key.to_string());\n        }\n    }\n    Ok(fields)\n}\n\n#[cfg(test)]\nmod tests {\n    use http::Extensions;\n    use lambda_http::Context as LambdaContext;\n    use pyo3::{prelude::*, py_run};\n\n    use crate::context::testing::{get_context, lambda_ctx};\n\n    #[test]\n    fn py_context_with_lambda_context() -> PyResult<()> {\n        pyo3::prepare_freethreaded_python();\n\n        let ctx = get_context(\n            r#\"\nclass Context:\n    foo: int = 0\n    bar: str = 'qux'\n    lambda_ctx: typing.Optional[LambdaContext]\n\nctx = Context()\nctx.foo = 42\n\"#,\n        );\n        Python::with_gil(|py| {\n            py_run!(\n                py,\n                ctx,\n                r#\"\nassert ctx.foo == 42\nassert ctx.bar == 'qux'\nassert not hasattr(ctx, 'lambda_ctx')\n\"#\n            );\n        });\n\n        ctx.populate_from_extensions(&extensions_with_lambda_ctx(lambda_ctx(\"my-req-id\", \"123\")));\n        Python::with_gil(|py| {\n            py_run!(\n                py,\n                ctx,\n                r#\"\nassert ctx.lambda_ctx.request_id == \"my-req-id\"\nassert ctx.lambda_ctx.deadline == 123\n# Make some modifications\nctx.foo += 1\nctx.bar = 'baz'\n\"#\n            );\n        });\n\n        // Assume we are getting a new request but that one doesn't have a `LambdaContext`,\n        // in that case we should make fields `None` and shouldn't leak the previous `LambdaContext`.\n        ctx.populate_from_extensions(&empty_extensions());\n        Python::with_gil(|py| {\n            py_run!(\n                py,\n                ctx,\n                r#\"\nassert ctx.lambda_ctx is None\n# Make sure we are preserving any modifications\nassert ctx.foo == 43\nassert ctx.bar == 'baz'\n\"#\n            );\n        });\n\n        Ok(())\n    }\n\n    #[test]\n    fn works_with_none() -> PyResult<()> {\n        // Users can set context to `None` by explicity or implicitly by not providing a custom context class,\n        // it shouldn't be fail in that case.\n\n        pyo3::prepare_freethreaded_python();\n\n        let ctx = get_context(\"ctx = None\");\n        ctx.populate_from_extensions(&extensions_with_lambda_ctx(lambda_ctx(\"my-req-id\", \"123\")));\n        Python::with_gil(|py| {\n            py_run!(py, ctx, \"assert ctx is None\");\n        });\n\n        Ok(())\n    }\n\n    fn extensions_with_lambda_ctx(ctx: LambdaContext) -> Extensions {\n        let mut exts = empty_extensions();\n        exts.insert(ctx);\n        exts\n    }\n\n    fn empty_extensions() -> Extensions {\n        Extensions::new()\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server-python/src/context/layer.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! A [tower::Layer] for injecting and populating [PyContext].\n\nuse std::task::{Context, Poll};\n\nuse http::{Request, Response};\nuse tower::{Layer, Service};\n\nuse super::PyContext;\n\n/// AddPyContextLayer is a [tower::Layer] that populates given [PyContext] from the [Request]\n/// and injects [PyContext] to the [Request] as an extension.\npub struct AddPyContextLayer {\n    ctx: PyContext,\n}\n\nimpl AddPyContextLayer {\n    pub fn new(ctx: PyContext) -> Self {\n        Self { ctx }\n    }\n}\n\nimpl<S> Layer<S> for AddPyContextLayer {\n    type Service = AddPyContextService<S>;\n\n    fn layer(&self, inner: S) -> Self::Service {\n        AddPyContextService {\n            inner,\n            ctx: self.ctx.clone(),\n        }\n    }\n}\n\n#[derive(Clone)]\npub struct AddPyContextService<S> {\n    inner: S,\n    ctx: PyContext,\n}\n\nimpl<ResBody, ReqBody, S> Service<Request<ReqBody>> for AddPyContextService<S>\nwhere\n    S: Service<Request<ReqBody>, Response = Response<ResBody>>,\n{\n    type Response = S::Response;\n    type Error = S::Error;\n    type Future = S::Future;\n\n    #[inline]\n    fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {\n        self.inner.poll_ready(cx)\n    }\n\n    fn call(&mut self, mut req: Request<ReqBody>) -> Self::Future {\n        self.ctx.populate_from_extensions(req.extensions());\n        req.extensions_mut().insert(self.ctx.clone());\n        self.inner.call(req)\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use std::convert::Infallible;\n\n    use http::{Request, Response};\n    use hyper::Body;\n    use pyo3::prelude::*;\n    use pyo3::types::IntoPyDict;\n    use tower::{service_fn, ServiceBuilder, ServiceExt};\n\n    use crate::context::testing::{get_context, lambda_ctx};\n\n    use super::*;\n\n    #[tokio::test]\n    async fn populates_lambda_context() {\n        pyo3::prepare_freethreaded_python();\n\n        let ctx = get_context(\n            r#\"\nclass Context:\n    counter: int = 42\n    lambda_ctx: typing.Optional[LambdaContext] = None\n\nctx = Context()\n    \"#,\n        );\n\n        let svc = ServiceBuilder::new()\n            .layer(AddPyContextLayer::new(ctx))\n            .service(service_fn(|req: Request<Body>| async move {\n                let ctx = req.extensions().get::<PyContext>().unwrap();\n                let (req_id, counter) = Python::with_gil(|py| {\n                    let locals = [(\"ctx\", ctx)].into_py_dict(py);\n                    py.run(\n                        r#\"\nreq_id = ctx.lambda_ctx.request_id\nctx.counter += 1\ncounter = ctx.counter\n    \"#,\n                        None,\n                        Some(locals),\n                    )\n                    .unwrap();\n\n                    (\n                        locals\n                            .get_item(\"req_id\")\n                            .expect(\"Python exception occurred during dictionary lookup\")\n                            .unwrap()\n                            .to_string(),\n                        locals\n                            .get_item(\"counter\")\n                            .expect(\"Python exception occurred during dictionary lookup\")\n                            .unwrap()\n                            .to_string(),\n                    )\n                });\n                Ok::<_, Infallible>(Response::new((req_id, counter)))\n            }));\n\n        let mut req = Request::new(Body::empty());\n        req.extensions_mut().insert(lambda_ctx(\"my-req-id\", \"178\"));\n\n        let res = svc.oneshot(req).await.unwrap().into_body();\n\n        assert_eq!((\"my-req-id\".to_string(), \"43\".to_string()), res);\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server-python/src/context/testing.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Testing utilities for [PyContext].\n\nuse http::{header::HeaderName, HeaderMap, HeaderValue};\nuse pyo3::{\n    types::{PyDict, PyModule},\n    IntoPy, PyErr, Python,\n};\n\nuse super::PyContext;\n\npub fn get_context(code: &str) -> PyContext {\n    let inner = Python::with_gil(|py| {\n        let globals = PyModule::import(py, \"__main__\")?.dict();\n        globals.set_item(\"typing\", py.import(\"typing\")?)?;\n        globals.set_item(\n            \"LambdaContext\",\n            py.get_type::<crate::lambda::PyLambdaContext>(),\n        )?;\n        let locals = PyDict::new(py);\n        py.run(code, Some(globals), Some(locals))?;\n        let context = locals\n            .get_item(\"ctx\")\n            .expect(\"Python exception occurred during dictionary lookup\")\n            .expect(\"you should assing your context class to `ctx` variable\")\n            .into_py(py);\n        Ok::<_, PyErr>(context)\n    })\n    .unwrap();\n    PyContext::new(inner).unwrap()\n}\n\npub fn lambda_ctx(req_id: &'static str, deadline_ms: &'static str) -> lambda_http::Context {\n    let headers = HeaderMap::from_iter([\n        (\n            HeaderName::from_static(\"lambda-runtime-aws-request-id\"),\n            HeaderValue::from_static(req_id),\n        ),\n        (\n            HeaderName::from_static(\"lambda-runtime-deadline-ms\"),\n            HeaderValue::from_static(deadline_ms),\n        ),\n    ]);\n    lambda_http::Context::try_from(headers).unwrap()\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server-python/src/context.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Python context definition.\n\nuse http::Extensions;\nuse pyo3::{PyObject, PyResult, Python, ToPyObject};\n\nmod lambda;\npub mod layer;\n#[cfg(test)]\nmod testing;\n\n/// PyContext is a wrapper for context object provided by the user.\n/// It injects some values (currently only [super::lambda::PyLambdaContext]) that is type-hinted by the user.\n///\n/// PyContext is initialised during the startup, it inspects the provided context object for fields\n/// that are type-hinted to inject some values provided by the framework (see [PyContext::new()]).\n///\n/// After finding fields that needs to be injected, [layer::AddPyContextLayer], a [tower::Layer],\n/// populates request-scoped values from incoming request.\n///\n/// And finally PyContext implements [ToPyObject] (so it can by passed to Python handlers)\n/// that provides [PyObject] provided by the user with the additional values injected by the framework.\n#[derive(Clone)]\npub struct PyContext {\n    inner: PyObject,\n    // TODO(Refactor): We should ideally keep record of injectable fields in a hashmap like:\n    // `injectable_fields: HashMap<Field, Box<dyn Injectable>>` where `Injectable` provides a method to extract a `PyObject` from a `Request`,\n    // but I couldn't find a way to extract a trait object from a Python object.\n    // We could introduce a registry to keep track of every injectable type but I'm not sure that is the best way to do it,\n    // so until we found a good way to achive that, I didn't want to introduce any abstraction here and\n    // keep it simple because we only have one field that is injectable.\n    lambda_ctx: lambda::PyContextLambda,\n}\n\nimpl PyContext {\n    pub fn new(inner: PyObject) -> PyResult<Self> {\n        Ok(Self {\n            lambda_ctx: lambda::PyContextLambda::new(inner.clone())?,\n            inner,\n        })\n    }\n\n    pub fn populate_from_extensions(&self, _ext: &Extensions) {\n        self.lambda_ctx\n            .populate_from_extensions(self.inner.clone(), _ext);\n    }\n}\n\nimpl ToPyObject for PyContext {\n    fn to_object(&self, _py: Python<'_>) -> PyObject {\n        self.inner.clone()\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use http::Extensions;\n    use pyo3::{prelude::*, py_run};\n\n    use super::testing::get_context;\n\n    #[test]\n    fn py_context() -> PyResult<()> {\n        pyo3::prepare_freethreaded_python();\n\n        let ctx = get_context(\n            r#\"\nclass Context:\n    foo: int = 0\n    bar: str = 'qux'\n\nctx = Context()\nctx.foo = 42\n\"#,\n        );\n        Python::with_gil(|py| {\n            py_run!(\n                py,\n                ctx,\n                r#\"\nassert ctx.foo == 42\nassert ctx.bar == 'qux'\n# Make some modifications\nctx.foo += 1\nctx.bar = 'baz'\n\"#\n            );\n        });\n\n        ctx.populate_from_extensions(&Extensions::new());\n\n        Python::with_gil(|py| {\n            py_run!(\n                py,\n                ctx,\n                r#\"\n# Make sure we are preserving any modifications\nassert ctx.foo == 43\nassert ctx.bar == 'baz'\n\"#\n            );\n        });\n\n        Ok(())\n    }\n\n    #[test]\n    fn works_with_none() -> PyResult<()> {\n        // Users can set context to `None` by explicity or implicitly by not providing a custom context class,\n        // it shouldn't be fail in that case.\n\n        pyo3::prepare_freethreaded_python();\n\n        let ctx = get_context(\"ctx = None\");\n        Python::with_gil(|py| {\n            py_run!(py, ctx, \"assert ctx is None\");\n        });\n\n        Ok(())\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server-python/src/error.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Python error definition.\n\n#![allow(non_local_definitions)]\n\nuse aws_smithy_legacy_http_server::{\n    body::{to_boxed, BoxBody},\n    protocol::{\n        aws_json_10::AwsJson1_0, aws_json_11::AwsJson1_1, rest_json_1::RestJson1, rest_xml::RestXml,\n    },\n    response::IntoResponse,\n};\nuse aws_smithy_types::date_time::{ConversionError, DateTimeParseError};\nuse pyo3::{create_exception, exceptions::PyException as BasePyException, prelude::*};\nuse thiserror::Error;\n\n/// Python error that implements foreign errors.\n#[derive(Error, Debug)]\npub enum PyError {\n    /// Implements `From<aws_smithy_types::date_time::DateTimeParseError>`.\n    #[error(\"DateTimeConversion: {0}\")]\n    DateTimeConversion(#[from] ConversionError),\n    /// Implements `From<aws_smithy_types::date_time::ConversionError>`.\n    #[error(\"DateTimeParse: {0}\")]\n    DateTimeParse(#[from] DateTimeParseError),\n}\n\ncreate_exception!(smithy, PyException, BasePyException);\n\nimpl From<PyError> for PyErr {\n    fn from(other: PyError) -> PyErr {\n        PyException::new_err(other.to_string())\n    }\n}\n\n/// Exception that can be thrown from a Python middleware.\n///\n/// It allows to specify a message and HTTP status code and implementing protocol specific capabilities\n/// to build a [aws_smithy_legacy_http_server::response::Response] from it.\n///\n/// :param message str:\n/// :param status_code typing.Optional\\[int\\]:\n/// :rtype None:\n#[pyclass(name = \"MiddlewareException\", extends = BasePyException)]\n#[derive(Debug, Clone)]\npub struct PyMiddlewareException {\n    /// :type str:\n    #[pyo3(get, set)]\n    message: String,\n\n    /// :type int:\n    #[pyo3(get, set)]\n    status_code: u16,\n}\n\n#[pymethods]\nimpl PyMiddlewareException {\n    /// Create a new [PyMiddlewareException].\n    #[pyo3(text_signature = \"($self, message, status_code=None)\")]\n    #[new]\n    fn newpy(message: String, status_code: Option<u16>) -> Self {\n        Self {\n            message,\n            status_code: status_code.unwrap_or(500),\n        }\n    }\n}\n\nimpl From<PyErr> for PyMiddlewareException {\n    fn from(other: PyErr) -> Self {\n        // Try to extract `PyMiddlewareException` from `PyErr` and use that if succeed\n        let middleware_err = Python::with_gil(|py| other.to_object(py).extract::<Self>(py));\n        match middleware_err {\n            Ok(err) => err,\n            Err(_) => Self::newpy(other.to_string(), None),\n        }\n    }\n}\n\nimpl IntoResponse<RestJson1> for PyMiddlewareException {\n    fn into_response(self) -> http::Response<BoxBody> {\n        http::Response::builder()\n            .status(self.status_code)\n            .header(\"Content-Type\", \"application/json\")\n            .header(\"X-Amzn-Errortype\", \"MiddlewareException\")\n            .body(to_boxed(self.json_body()))\n            .expect(\"invalid HTTP response for `MiddlewareException`; please file a bug report under https://github.com/smithy-lang/smithy-rs/issues\")\n    }\n}\n\nimpl IntoResponse<RestXml> for PyMiddlewareException {\n    fn into_response(self) -> http::Response<BoxBody> {\n        http::Response::builder()\n            .status(self.status_code)\n            .header(\"Content-Type\", \"application/xml\")\n            .body(to_boxed(self.xml_body()))\n            .expect(\"invalid HTTP response for `MiddlewareException`; please file a bug report under https://github.com/smithy-lang/smithy-rs/issues\")\n    }\n}\n\nimpl IntoResponse<AwsJson1_0> for PyMiddlewareException {\n    fn into_response(self) -> http::Response<BoxBody> {\n        http::Response::builder()\n            .status(self.status_code)\n            .header(\"Content-Type\", \"application/x-amz-json-1.0\")\n            // See https://smithy.io/2.0/aws/protocols/aws-json-1_0-protocol.html#empty-body-serialization\n            .body(to_boxed(self.json_body()))\n            .expect(\"invalid HTTP response for `MiddlewareException`; please file a bug report under https://github.com/smithy-lang/smithy-rs/issues\")\n    }\n}\n\nimpl IntoResponse<AwsJson1_1> for PyMiddlewareException {\n    fn into_response(self) -> http::Response<BoxBody> {\n        http::Response::builder()\n            .status(self.status_code)\n            .header(\"Content-Type\", \"application/x-amz-json-1.1\")\n            // See https://smithy.io/2.0/aws/protocols/aws-json-1_1-protocol.html#empty-body-serialization\n            .body(to_boxed(self.json_body()))\n            .expect(\"invalid HTTP response for `MiddlewareException`; please file a bug report under https://github.com/smithy-lang/smithy-rs/issues\")\n    }\n}\n\nimpl PyMiddlewareException {\n    /// Serialize the body into a JSON object.\n    fn json_body(&self) -> String {\n        let mut out = String::new();\n        let mut object = aws_smithy_json::serialize::JsonObjectWriter::new(&mut out);\n        object.key(\"message\").string(self.message.as_str());\n        object.finish();\n        out\n    }\n\n    /// Serialize the body into a XML object.\n    fn xml_body(&self) -> String {\n        let mut out = String::new();\n        {\n            let mut writer = aws_smithy_xml::encode::XmlWriter::new(&mut out);\n            let root = writer\n                .start_el(\"Error\")\n                .write_ns(\"http://s3.amazonaws.com/doc/2006-03-01/\", None);\n            let mut scope = root.finish();\n            {\n                let mut inner_writer = scope.start_el(\"Message\").finish();\n                inner_writer.data(self.message.as_ref());\n            }\n            scope.finish();\n        }\n        out\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server-python/src/lambda.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Python wrappers for Lambda related types.\n\nuse std::collections::HashMap;\n\nuse lambda_http::Context;\nuse pyo3::pyclass;\n\n/// AWS Mobile SDK client fields.\n#[pyclass(name = \"ClientApplication\")]\n#[derive(Clone)]\npub struct PyClientApplication {\n    /// The mobile app installation id\n    ///\n    /// :type str:\n    #[pyo3(get)]\n    installation_id: String,\n\n    /// The app title for the mobile app as registered with AWS' mobile services.\n    ///\n    /// :type str:\n    #[pyo3(get)]\n    app_title: String,\n\n    /// The version name of the application as registered with AWS' mobile services.\n    ///\n    /// :type str:\n    #[pyo3(get)]\n    app_version_name: String,\n\n    /// The app version code.\n    ///\n    /// :type str:\n    #[pyo3(get)]\n    app_version_code: String,\n\n    /// The package name for the mobile application invoking the function\n    ///\n    /// :type str:\n    #[pyo3(get)]\n    app_package_name: String,\n}\n\n/// Client context sent by the AWS Mobile SDK.\n#[pyclass(name = \"ClientContext\")]\n#[derive(Clone)]\npub struct PyClientContext {\n    /// Information about the mobile application invoking the function.\n    ///\n    /// :type ClientApplication:\n    #[pyo3(get)]\n    client: PyClientApplication,\n\n    /// Custom properties attached to the mobile event context.\n    ///\n    /// :type typing.Dict[str, str]:\n    #[pyo3(get)]\n    custom: HashMap<String, String>,\n\n    /// Environment settings from the mobile client.\n    ///\n    /// :type typing.Dict[str, str]:\n    #[pyo3(get)]\n    environment: HashMap<String, String>,\n}\n\n/// Cognito identity information sent with the event\n#[pyclass(name = \"CognitoIdentity\")]\n#[derive(Clone)]\npub struct PyCognitoIdentity {\n    /// The unique identity id for the Cognito credentials invoking the function.\n    ///\n    /// :type str:\n    #[pyo3(get)]\n    identity_id: String,\n\n    /// The identity pool id the caller is \"registered\" with.\n    ///\n    /// :type str:\n    #[pyo3(get)]\n    identity_pool_id: String,\n}\n\n/// Configuration derived from environment variables.\n#[pyclass(name = \"Config\")]\n#[derive(Clone)]\npub struct PyConfig {\n    /// The name of the function.\n    ///\n    /// :type str:\n    #[pyo3(get)]\n    function_name: String,\n\n    /// The amount of memory available to the function in MB.\n    ///\n    /// :type int:\n    #[pyo3(get)]\n    memory: i32,\n\n    /// The version of the function being executed.\n    ///\n    /// :type str:\n    #[pyo3(get)]\n    version: String,\n\n    /// The name of the Amazon CloudWatch Logs stream for the function.\n    ///\n    /// :type str:\n    #[pyo3(get)]\n    log_stream: String,\n\n    /// The name of the Amazon CloudWatch Logs group for the function.\n    ///\n    /// :type str:\n    #[pyo3(get)]\n    log_group: String,\n}\n\n/// The Lambda function execution context. The values in this struct\n/// are populated using the [Lambda environment variables](https://docs.aws.amazon.com/lambda/latest/dg/current-supported-versions.html)\n/// and the headers returned by the poll request to the Runtime APIs.\n#[derive(Clone)]\n#[pyclass(name = \"LambdaContext\")]\npub struct PyLambdaContext {\n    /// The AWS request ID generated by the Lambda service.\n    ///\n    /// :type str:\n    #[pyo3(get)]\n    request_id: String,\n\n    /// The execution deadline for the current invocation in milliseconds.\n    ///\n    /// :type int:\n    #[pyo3(get)]\n    deadline: u64,\n\n    /// The ARN of the Lambda function being invoked.\n    ///\n    /// :type str:\n    #[pyo3(get)]\n    invoked_function_arn: String,\n\n    /// The X-Ray trace ID for the current invocation.\n    ///\n    /// :type typing.Optional\\[str\\]:\n    #[pyo3(get)]\n    xray_trace_id: Option<String>,\n\n    /// The client context object sent by the AWS mobile SDK. This field is\n    /// empty unless the function is invoked using an AWS mobile SDK.\n    ///\n    /// :type typing.Optional\\[ClientContext\\]:\n    #[pyo3(get)]\n    client_context: Option<PyClientContext>,\n\n    /// The Cognito identity that invoked the function. This field is empty\n    /// unless the invocation request to the Lambda APIs was made using AWS\n    /// credentials issues by Amazon Cognito Identity Pools.\n    ///\n    /// :type typing.Optional\\[CognitoIdentity\\]:\n    #[pyo3(get)]\n    identity: Option<PyCognitoIdentity>,\n\n    /// Lambda function configuration from the local environment variables.\n    /// Includes information such as the function name, memory allocation,\n    /// version, and log streams.\n    ///\n    /// :type Config:\n    #[pyo3(get)]\n    env_config: PyConfig,\n}\n\nimpl PyLambdaContext {\n    /// Create Python-compatible version of [Context].\n    pub fn new(ctx: Context) -> Self {\n        Self {\n            request_id: ctx.request_id,\n            deadline: ctx.deadline,\n            invoked_function_arn: ctx.invoked_function_arn,\n            xray_trace_id: ctx.xray_trace_id,\n            client_context: ctx.client_context.map(|client_ctx| PyClientContext {\n                client: PyClientApplication {\n                    installation_id: client_ctx.client.installation_id,\n                    app_title: client_ctx.client.app_title,\n                    app_version_name: client_ctx.client.app_version_name,\n                    app_version_code: client_ctx.client.app_version_code,\n                    app_package_name: client_ctx.client.app_package_name,\n                },\n                custom: client_ctx.custom,\n                environment: client_ctx.environment,\n            }),\n            identity: ctx.identity.map(|identity| PyCognitoIdentity {\n                identity_id: identity.identity_id,\n                identity_pool_id: identity.identity_pool_id,\n            }),\n            env_config: PyConfig {\n                function_name: ctx.env_config.function_name,\n                memory: ctx.env_config.memory,\n                version: ctx.env_config.version,\n                log_stream: ctx.env_config.log_stream,\n                log_group: ctx.env_config.log_group,\n            },\n        }\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use http::{header::HeaderName, HeaderMap, HeaderValue};\n    use lambda_http::lambda_runtime::{Config, Context};\n    use pyo3::{prelude::*, py_run};\n\n    use super::*;\n\n    #[test]\n    fn py_lambda_context() -> PyResult<()> {\n        pyo3::prepare_freethreaded_python();\n\n        let headers = HeaderMap::from_iter([\n            (\n                HeaderName::from_static(\"lambda-runtime-aws-request-id\"),\n                HeaderValue::from_static(\"my-id\"),\n            ),\n            (\n                HeaderName::from_static(\"lambda-runtime-deadline-ms\"),\n                HeaderValue::from_static(\"123\"),\n            ),\n            (\n                HeaderName::from_static(\"lambda-runtime-invoked-function-arn\"),\n                HeaderValue::from_static(\"arn::myarn\"),\n            ),\n            (\n                HeaderName::from_static(\"lambda-runtime-trace-id\"),\n                HeaderValue::from_static(\"my-trace-id\"),\n            ),\n            (\n                HeaderName::from_static(\"lambda-runtime-client-context\"),\n                HeaderValue::from_str(\n                    &r#\"\n{\n    \"client\": {\n        \"installationId\": \"my-installation-id\",\n        \"appTitle\": \"my-app-title\",\n        \"appVersionName\": \"my-app-version-name\",\n        \"appVersionCode\": \"my-app-version-code\",\n        \"appPackageName\": \"my-app-package-name\"\n    },\n    \"custom\": {\n        \"custom-key\": \"custom-val\"\n    },\n    \"environment\": {\n        \"environment-key\": \"environment-val\"\n    }\n}\n\"#\n                    .split_whitespace()\n                    .collect::<String>(),\n                )\n                .unwrap(),\n            ),\n            (\n                HeaderName::from_static(\"lambda-runtime-cognito-identity\"),\n                HeaderValue::from_str(\n                    &r#\"\n{\n    \"identity_id\": \"my-identity-id\",\n    \"identity_pool_id\": \"my-identity-pool-id\"\n}\n\"#\n                    .split_whitespace()\n                    .collect::<String>(),\n                )\n                .unwrap(),\n            ),\n        ]);\n        let lambda_context = Context::try_from(headers).unwrap();\n        let lambda_context = lambda_context.with_config(&Config {\n            function_name: \"my-fn\".to_string(),\n            memory: 128,\n            version: \"my-version\".to_string(),\n            log_stream: \"my-log-stream\".to_string(),\n            log_group: \"my-log-group\".to_string(),\n        });\n\n        Python::with_gil(|py| {\n            let ctx = PyCell::new(py, PyLambdaContext::new(lambda_context))?;\n            py_run!(\n                py,\n                ctx,\n                r#\"\nassert ctx.request_id == \"my-id\"\nassert ctx.deadline == 123\nassert ctx.invoked_function_arn == \"arn::myarn\"\nassert ctx.xray_trace_id == \"my-trace-id\"\n\nassert ctx.client_context.client.installation_id == \"my-installation-id\"\nassert ctx.client_context.client.app_title == \"my-app-title\"\nassert ctx.client_context.client.app_version_name == \"my-app-version-name\"\nassert ctx.client_context.client.app_version_code == \"my-app-version-code\"\nassert ctx.client_context.client.app_package_name == \"my-app-package-name\"\nassert ctx.client_context.custom == {\"custom-key\":\"custom-val\"}\nassert ctx.client_context.environment == {\"environment-key\":\"environment-val\"}\n\nassert ctx.identity.identity_id == \"my-identity-id\"\nassert ctx.identity.identity_pool_id == \"my-identity-pool-id\"\n\nassert ctx.env_config.function_name == \"my-fn\"\nassert ctx.env_config.memory == 128\nassert ctx.env_config.version == \"my-version\"\nassert ctx.env_config.log_stream == \"my-log-stream\"\nassert ctx.env_config.log_group == \"my-log-group\"\n\"#\n            );\n            Ok(())\n        })\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server-python/src/lib.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/* Automatically managed default lints */\n#![cfg_attr(docsrs, feature(doc_cfg))]\n/* End of automatically managed default lints */\n#![allow(clippy::derive_partial_eq_without_eq)]\n\n//! Rust/Python bindings, runtime and utilities.\n//!\n//! This crates implements all the generic code needed to start and manage\n//! a Smithy Rust HTTP server where the business logic is implemented in Python,\n//! leveraging [PyO3].\n//!\n//! [PyO3]: https://pyo3.rs/\n\npub mod context;\nmod error;\npub mod lambda;\npub mod logging;\npub mod middleware;\nmod server;\nmod socket;\npub mod tls;\npub mod types;\nmod util;\n\n#[doc(inline)]\npub use error::{PyError, PyMiddlewareException};\n#[doc(inline)]\npub use logging::{py_tracing_event, PyTracingHandler};\n#[doc(inline)]\npub use middleware::{PyMiddlewareHandler, PyMiddlewareLayer, PyRequest, PyResponse};\n#[doc(inline)]\npub use server::{PyApp, PyHandler};\n#[doc(inline)]\npub use socket::PySocket;\n#[doc(inline)]\npub use util::error::{rich_py_err, RichPyErr};\n\n#[cfg(test)]\nmod tests {\n    use std::sync::Once;\n\n    use pyo3::{PyErr, Python};\n    use pyo3_asyncio::TaskLocals;\n\n    static INIT: Once = Once::new();\n\n    pub(crate) fn initialize() -> TaskLocals {\n        INIT.call_once(|| {\n            pyo3::prepare_freethreaded_python();\n        });\n\n        Python::with_gil(|py| {\n            let asyncio = py.import(\"asyncio\")?;\n            let event_loop = asyncio.call_method0(\"new_event_loop\")?;\n            asyncio.call_method1(\"set_event_loop\", (event_loop,))?;\n            Ok::<TaskLocals, PyErr>(TaskLocals::new(event_loop))\n        })\n        .unwrap()\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server-python/src/logging.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Rust `tracing` and Python `logging` setup and utilities.\n\n#![allow(non_local_definitions)]\n\nuse std::{path::PathBuf, str::FromStr};\n\nuse pyo3::prelude::*;\n#[cfg(not(test))]\nuse tracing::span;\nuse tracing::Level;\nuse tracing_appender::non_blocking::WorkerGuard;\nuse tracing_subscriber::{\n    fmt::{self, writer::MakeWriterExt},\n    layer::SubscriberExt,\n    util::SubscriberInitExt,\n    Layer,\n};\n\nuse crate::error::PyException;\n\n#[derive(Debug, Default)]\nenum Format {\n    Json,\n    Pretty,\n    #[default]\n    Compact,\n}\n\n#[derive(Debug, PartialEq, Eq)]\nstruct InvalidFormatError;\n\nimpl FromStr for Format {\n    type Err = InvalidFormatError;\n\n    fn from_str(s: &str) -> Result<Self, Self::Err> {\n        match s {\n            \"pretty\" => Ok(Self::Pretty),\n            \"json\" => Ok(Self::Json),\n            \"compact\" => Ok(Self::Compact),\n            _ => Err(InvalidFormatError),\n        }\n    }\n}\n\n/// Setup tracing-subscriber to log on console or to a hourly rolling file.\nfn setup_tracing_subscriber(\n    level: Option<u8>,\n    logfile: Option<PathBuf>,\n    format: Option<String>,\n) -> PyResult<Option<WorkerGuard>> {\n    let format = match format {\n        Some(format) => Format::from_str(&format).unwrap_or_else(|_| {\n            tracing::error!(\"unknown format '{format}', falling back to default formatter\");\n            Format::default()\n        }),\n        None => Format::default(),\n    };\n\n    let appender = match logfile {\n        Some(logfile) => {\n            let parent = logfile.parent().ok_or_else(|| {\n                PyException::new_err(format!(\n                    \"Tracing setup failed: unable to extract dirname from path {}\",\n                    logfile.display()\n                ))\n            })?;\n            let filename = logfile.file_name().ok_or_else(|| {\n                PyException::new_err(format!(\n                    \"Tracing setup failed: unable to extract basename from path {}\",\n                    logfile.display()\n                ))\n            })?;\n            let file_appender = tracing_appender::rolling::hourly(parent, filename);\n            let (appender, guard) = tracing_appender::non_blocking(file_appender);\n            Some((appender, guard))\n        }\n        None => None,\n    };\n\n    let tracing_level = match level {\n        Some(40u8) => Level::ERROR,\n        Some(30u8) => Level::WARN,\n        Some(20u8) => Level::INFO,\n        Some(10u8) => Level::DEBUG,\n        None => Level::INFO,\n        _ => Level::TRACE,\n    };\n\n    let formatter = fmt::Layer::new().with_line_number(true).with_level(true);\n\n    match appender {\n        Some((appender, guard)) => {\n            let formatter = formatter.with_writer(appender.with_max_level(tracing_level));\n            let formatter = match format {\n                Format::Json => formatter.json().boxed(),\n                Format::Compact => formatter.compact().boxed(),\n                Format::Pretty => formatter.pretty().boxed(),\n            };\n            tracing_subscriber::registry().with(formatter).init();\n            Ok(Some(guard))\n        }\n        None => {\n            let formatter = formatter.with_writer(std::io::stdout.with_max_level(tracing_level));\n            let formatter = match format {\n                Format::Json => formatter.json().boxed(),\n                Format::Compact => formatter.compact().boxed(),\n                Format::Pretty => formatter.pretty().boxed(),\n            };\n            tracing_subscriber::registry().with(formatter).init();\n            Ok(None)\n        }\n    }\n}\n\n/// Modifies the Python `logging` module to deliver its log messages using [tracing::Subscriber] events.\n///\n/// To achieve this goal, the following changes are made to the module:\n/// - A new builtin function `logging.py_tracing_event` transcodes `logging.LogRecord`s to `tracing::Event`s. This function\n///   is not exported in `logging.__all__`, as it is not intended to be called directly.\n/// - A new class `logging.TracingHandler` provides a `logging.Handler` that delivers all records to `python_tracing`.\n///\n/// :param level typing.Optional\\[int\\]:\n/// :param logfile typing.Optional\\[pathlib.Path\\]:\n/// :param format typing.Optional\\[typing.Literal\\['compact', 'pretty', 'json'\\]\\]:\n/// :rtype None:\n#[pyclass(name = \"TracingHandler\")]\n#[derive(Debug)]\npub struct PyTracingHandler {\n    _guard: Option<WorkerGuard>,\n}\n\n#[pymethods]\nimpl PyTracingHandler {\n    #[pyo3(text_signature = \"($self, level=None, logfile=None, format=None)\")]\n    #[new]\n    fn newpy(\n        py: Python,\n        level: Option<u8>,\n        logfile: Option<PathBuf>,\n        format: Option<String>,\n    ) -> PyResult<Self> {\n        let _guard = setup_tracing_subscriber(level, logfile, format)?;\n        let logging = py.import(\"logging\")?;\n        let root = logging.getattr(\"root\")?;\n        root.setattr(\"level\", level)?;\n        // TODO(Investigate why the file appender just create the file and does not write anything, event after holding the guard)\n        Ok(Self { _guard })\n    }\n\n    /// :rtype typing.Any:\n    fn handler(&self, py: Python) -> PyResult<Py<PyAny>> {\n        let logging = py.import(\"logging\")?;\n        logging.setattr(\n            \"py_tracing_event\",\n            wrap_pyfunction!(py_tracing_event, logging)?,\n        )?;\n\n        let pycode = r#\"\nclass TracingHandler(Handler):\n    \"\"\" Python logging to Rust tracing handler. \"\"\"\n    def emit(self, record):\n        py_tracing_event(\n            record.levelno, record.getMessage(), record.module,\n            record.filename, record.lineno, record.process\n        )\n\"#;\n        py.run(pycode, Some(logging.dict()), None)?;\n        let all = logging.index()?;\n        all.append(\"TracingHandler\")?;\n        let handler = logging.getattr(\"TracingHandler\")?;\n        Ok(handler.call0()?.into_py(py))\n    }\n}\n\n/// Consumes a Python `logging.LogRecord` and emits a Rust [tracing::Event] instead.\n#[cfg(not(test))]\n#[pyfunction]\n#[pyo3(text_signature = \"(level, record, message, module, filename, line, pid)\")]\npub fn py_tracing_event(\n    level: u8,\n    message: &str,\n    module: &str,\n    filename: &str,\n    lineno: usize,\n    pid: usize,\n) -> PyResult<()> {\n    let span = span!(\n        Level::TRACE,\n        \"python\",\n        pid = pid,\n        module = module,\n        filename = filename,\n        lineno = lineno\n    );\n    let _guard = span.enter();\n    match level {\n        40 => tracing::error!(\"{message}\"),\n        30 => tracing::warn!(\"{message}\"),\n        20 => tracing::info!(\"{message}\"),\n        10 => tracing::debug!(\"{message}\"),\n        _ => tracing::trace!(\"{message}\"),\n    };\n    Ok(())\n}\n\n#[cfg(test)]\n#[pyfunction]\n#[pyo3(text_signature = \"(level, record, message, module, filename, line, pid)\")]\npub fn py_tracing_event(\n    _level: u8,\n    message: &str,\n    _module: &str,\n    _filename: &str,\n    _line: usize,\n    _pid: usize,\n) -> PyResult<()> {\n    pretty_assertions::assert_eq!(message.to_string(), \"a message\");\n    Ok(())\n}\n\n#[cfg(test)]\nmod tests {\n    use pyo3::types::PyDict;\n\n    use super::*;\n\n    #[test]\n    fn tracing_handler_is_injected_in_python() {\n        crate::tests::initialize();\n        Python::with_gil(|py| {\n            let handler = PyTracingHandler::newpy(py, Some(10), None, None).unwrap();\n            let kwargs = PyDict::new(py);\n            kwargs\n                .set_item(\"handlers\", vec![handler.handler(py).unwrap()])\n                .unwrap();\n            let logging = py.import(\"logging\").unwrap();\n            let basic_config = logging.getattr(\"basicConfig\").unwrap();\n            basic_config.call((), Some(kwargs)).unwrap();\n            logging.call_method1(\"info\", (\"a message\",)).unwrap();\n        });\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server-python/src/middleware/error.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse pyo3::{exceptions::PyRuntimeError, PyErr};\nuse thiserror::Error;\n\n/// Possible middleware errors that might arise.\n#[derive(Error, Debug)]\npub enum PyMiddlewareError {\n    #[error(\"`next` is called multiple times\")]\n    NextAlreadyCalled,\n    #[error(\"request is accessed after `next` is called\")]\n    RequestGone,\n    #[error(\"response is called after it is returned\")]\n    ResponseGone,\n}\n\nimpl From<PyMiddlewareError> for PyErr {\n    fn from(err: PyMiddlewareError) -> PyErr {\n        PyRuntimeError::new_err(err.to_string())\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server-python/src/middleware/handler.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Execute pure-Python middleware handler.\n\nuse aws_smithy_legacy_http_server::body::{Body, BoxBody};\nuse http::{Request, Response};\nuse pyo3::{exceptions::PyRuntimeError, prelude::*, types::PyFunction};\nuse pyo3_asyncio::TaskLocals;\nuse tower::{util::BoxService, BoxError, Service};\n\nuse crate::util::func_metadata;\n\nuse super::{PyMiddlewareError, PyRequest, PyResponse};\n\n// PyNextInner represents the inner service Tower layer applied to.\ntype PyNextInner = BoxService<Request<Body>, Response<BoxBody>, BoxError>;\n\n// PyNext wraps inner Tower service and makes it callable from Python.\n#[pyo3::pyclass]\nstruct PyNext(Option<PyNextInner>);\n\nimpl PyNext {\n    fn new(inner: PyNextInner) -> Self {\n        Self(Some(inner))\n    }\n\n    // Consumes self by taking the inner Tower service.\n    // This method would have been `into_inner(self) -> PyNextInner`\n    // but we can't do that because we are crossing Python boundary.\n    fn take_inner(&mut self) -> Option<PyNextInner> {\n        self.0.take()\n    }\n}\n\n#[pyo3::pymethods]\nimpl PyNext {\n    // Calls the inner Tower service with the `Request` that is passed from Python.\n    // It returns a coroutine to be awaited on the Python side to complete the call.\n    // Note that it takes wrapped objects from both `PyRequest` and `PyNext`,\n    // so after calling `next`, consumer can't access to the `Request` or\n    // can't call the `next` again, this basically emulates consuming `self` and `Request`,\n    // but since we are crossing the Python boundary we can't express it in natural Rust terms.\n    //\n    // Naming the method `__call__` allows `next` to be called like `next(...)`.\n    fn __call__<'p>(&'p mut self, py: Python<'p>, py_req: Py<PyRequest>) -> PyResult<&'p PyAny> {\n        let req = py_req\n            .borrow_mut(py)\n            .take_inner()\n            .ok_or(PyMiddlewareError::RequestGone)?;\n        let mut inner = self\n            .take_inner()\n            .ok_or(PyMiddlewareError::NextAlreadyCalled)?;\n        pyo3_asyncio::tokio::future_into_py(py, async move {\n            let res = inner\n                .call(req)\n                .await\n                .map_err(|err| PyRuntimeError::new_err(err.to_string()))?;\n            Ok(Python::with_gil(|py| PyResponse::new(res).into_py(py)))\n        })\n    }\n}\n\n/// A Python middleware handler function representation.\n///\n/// The Python business logic implementation needs to carry some information\n/// to be executed properly like if it is a coroutine.\n#[derive(Debug, Clone)]\npub struct PyMiddlewareHandler {\n    pub name: String,\n    pub func: PyObject,\n    pub is_coroutine: bool,\n}\n\nimpl PyMiddlewareHandler {\n    pub fn new(py: Python, func: PyObject) -> PyResult<Self> {\n        let func_metadata = func_metadata(py, &func)?;\n        Ok(Self {\n            name: func_metadata.name,\n            func,\n            is_coroutine: func_metadata.is_coroutine,\n        })\n    }\n\n    // Calls pure-Python middleware handler with given `Request` and the next Tower service\n    // and returns the `Response` that returned from the pure-Python handler.\n    pub async fn call(\n        self,\n        req: Request<Body>,\n        next: PyNextInner,\n        locals: TaskLocals,\n    ) -> PyResult<Response<BoxBody>> {\n        let py_req = PyRequest::new(req);\n        let py_next = PyNext::new(next);\n\n        let handler = self.func;\n        let result = if self.is_coroutine {\n            pyo3_asyncio::tokio::scope(locals, async move {\n                Python::with_gil(|py| {\n                    let py_handler: &PyFunction = handler.extract(py)?;\n                    let output = py_handler.call1((py_req, py_next))?;\n                    pyo3_asyncio::tokio::into_future(output)\n                })?\n                .await\n            })\n            .await?\n        } else {\n            Python::with_gil(|py| {\n                let py_handler: &PyFunction = handler.extract(py)?;\n                let output = py_handler.call1((py_req, py_next))?;\n                Ok::<_, PyErr>(output.into())\n            })?\n        };\n\n        let response = Python::with_gil(|py| {\n            let py_res: Py<PyResponse> = result.extract(py)?;\n            let mut py_res = py_res.borrow_mut(py);\n            Ok::<_, PyErr>(py_res.take_inner())\n        })?;\n\n        response.ok_or_else(|| PyMiddlewareError::ResponseGone.into())\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server-python/src/middleware/header_map.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n#![allow(non_local_definitions)]\n\nuse std::{mem, str::FromStr, sync::Arc};\n\nuse http::{header::HeaderName, HeaderMap, HeaderValue};\nuse parking_lot::Mutex;\nuse pyo3::{\n    exceptions::{PyKeyError, PyValueError},\n    pyclass, PyErr, PyResult,\n};\n\nuse crate::{mutable_mapping_pymethods, util::collection::PyMutableMapping};\n\n/// Python-compatible [HeaderMap] object.\n#[pyclass(mapping)]\n#[derive(Clone, Debug)]\npub struct PyHeaderMap {\n    inner: Arc<Mutex<HeaderMap>>,\n}\n\nimpl PyHeaderMap {\n    pub fn new(inner: HeaderMap) -> Self {\n        Self {\n            inner: Arc::new(Mutex::new(inner)),\n        }\n    }\n\n    // Consumes self by taking the inner `HeaderMap`.\n    // This method would have been `into_inner(self) -> HeaderMap`\n    // but we can't do that because we are crossing Python boundary.\n    pub fn take_inner(&mut self) -> Option<HeaderMap> {\n        let header_map = mem::take(&mut self.inner);\n        let header_map = Arc::try_unwrap(header_map).ok()?;\n        let header_map = header_map.into_inner();\n        Some(header_map)\n    }\n}\n\n/// By implementing [PyMutableMapping] for [PyHeaderMap] we are making it to\n/// behave like a dictionary on the Python.\nimpl PyMutableMapping for PyHeaderMap {\n    type Key = String;\n    type Value = String;\n\n    fn len(&self) -> PyResult<usize> {\n        Ok(self.inner.lock().len())\n    }\n\n    fn contains(&self, key: Self::Key) -> PyResult<bool> {\n        Ok(self.inner.lock().contains_key(key))\n    }\n\n    fn keys(&self) -> PyResult<Vec<Self::Key>> {\n        Ok(self.inner.lock().keys().map(|h| h.to_string()).collect())\n    }\n\n    fn values(&self) -> PyResult<Vec<Self::Value>> {\n        self.inner\n            .lock()\n            .values()\n            .map(|h| h.to_str().map(|s| s.to_string()).map_err(to_value_error))\n            .collect()\n    }\n\n    fn get(&self, key: Self::Key) -> PyResult<Option<Self::Value>> {\n        self.inner\n            .lock()\n            .get(key)\n            .map(|h| h.to_str().map(|s| s.to_string()).map_err(to_value_error))\n            .transpose()\n    }\n\n    fn set(&mut self, key: Self::Key, value: Self::Value) -> PyResult<()> {\n        self.inner.lock().insert(\n            HeaderName::from_str(&key).map_err(to_value_error)?,\n            HeaderValue::from_str(&value).map_err(to_value_error)?,\n        );\n        Ok(())\n    }\n\n    fn del(&mut self, key: Self::Key) -> PyResult<()> {\n        if self.inner.lock().remove(key).is_none() {\n            Err(PyKeyError::new_err(\"unknown key\"))\n        } else {\n            Ok(())\n        }\n    }\n}\n\nmutable_mapping_pymethods!(PyHeaderMap, keys_iter: PyHeaderMapKeys);\n\nfn to_value_error(err: impl std::error::Error) -> PyErr {\n    PyValueError::new_err(err.to_string())\n}\n\n#[cfg(test)]\nmod tests {\n    use http::header;\n    use pyo3::{prelude::*, py_run};\n\n    use super::*;\n\n    #[test]\n    fn py_header_map() -> PyResult<()> {\n        pyo3::prepare_freethreaded_python();\n\n        let mut header_map = HeaderMap::new();\n        header_map.insert(header::CONTENT_LENGTH, \"42\".parse().unwrap());\n        header_map.insert(header::HOST, \"localhost\".parse().unwrap());\n\n        let header_map = Python::with_gil(|py| {\n            let py_header_map = PyHeaderMap::new(header_map);\n            let headers = PyCell::new(py, py_header_map)?;\n            py_run!(\n                py,\n                headers,\n                r#\"\nassert len(headers) == 2\nassert headers[\"content-length\"] == \"42\"\nassert headers[\"host\"] == \"localhost\"\n\nheaders[\"content-length\"] = \"45\"\nassert headers[\"content-length\"] == \"45\"\nheaders[\"content-encoding\"] = \"application/json\"\nassert headers[\"content-encoding\"] == \"application/json\"\n\ndel headers[\"host\"]\nassert headers.get(\"host\") == None\nassert len(headers) == 2\n\nassert set(headers.items()) == set([\n    (\"content-length\", \"45\"),\n    (\"content-encoding\", \"application/json\")\n])\n\"#\n            );\n\n            Ok::<_, PyErr>(headers.borrow_mut().take_inner().unwrap())\n        })?;\n\n        assert_eq!(\n            header_map,\n            vec![\n                (header::CONTENT_LENGTH, \"45\".parse().unwrap()),\n                (\n                    header::CONTENT_ENCODING,\n                    \"application/json\".parse().unwrap()\n                ),\n            ]\n            .into_iter()\n            .collect()\n        );\n\n        Ok(())\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server-python/src/middleware/layer.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Tower layer implementation of Python middleware handling.\n\nuse std::{\n    convert::Infallible,\n    marker::PhantomData,\n    mem,\n    task::{Context, Poll},\n};\n\nuse aws_smithy_legacy_http_server::{\n    body::{Body, BoxBody},\n    response::IntoResponse,\n};\nuse futures::{future::BoxFuture, TryFutureExt};\nuse http::{Request, Response};\nuse pyo3::Python;\nuse pyo3_asyncio::TaskLocals;\nuse tower::{util::BoxService, Layer, Service, ServiceExt};\n\nuse super::PyMiddlewareHandler;\nuse crate::{util::error::rich_py_err, PyMiddlewareException};\n\n/// Tower [Layer] implementation of Python middleware handling.\n///\n/// Middleware stored in the `handler` attribute will be executed inside an async Tower middleware.\n#[derive(Debug, Clone)]\npub struct PyMiddlewareLayer<P> {\n    handler: PyMiddlewareHandler,\n    locals: TaskLocals,\n    _protocol: PhantomData<P>,\n}\n\nimpl<P> PyMiddlewareLayer<P> {\n    pub fn new(handler: PyMiddlewareHandler, locals: TaskLocals) -> Self {\n        Self {\n            handler,\n            locals,\n            _protocol: PhantomData,\n        }\n    }\n}\n\nimpl<S, P> Layer<S> for PyMiddlewareLayer<P>\nwhere\n    PyMiddlewareException: IntoResponse<P>,\n{\n    type Service = PyMiddlewareService<S>;\n\n    fn layer(&self, inner: S) -> Self::Service {\n        PyMiddlewareService::new(\n            inner,\n            self.handler.clone(),\n            self.locals.clone(),\n            PyMiddlewareException::into_response,\n        )\n    }\n}\n\n/// Tower [Service] wrapping the Python middleware [Layer].\n#[derive(Clone, Debug)]\npub struct PyMiddlewareService<S> {\n    inner: S,\n    handler: PyMiddlewareHandler,\n    locals: TaskLocals,\n    into_response: fn(PyMiddlewareException) -> http::Response<BoxBody>,\n}\n\nimpl<S> PyMiddlewareService<S> {\n    pub fn new(\n        inner: S,\n        handler: PyMiddlewareHandler,\n        locals: TaskLocals,\n        into_response: fn(PyMiddlewareException) -> http::Response<BoxBody>,\n    ) -> PyMiddlewareService<S> {\n        Self {\n            inner,\n            handler,\n            locals,\n            into_response,\n        }\n    }\n}\n\nimpl<S> Service<Request<Body>> for PyMiddlewareService<S>\nwhere\n    S: Service<Request<Body>, Response = Response<BoxBody>, Error = Infallible>\n        + Clone\n        + Send\n        + 'static,\n    S::Future: Send,\n{\n    type Response = S::Response;\n    // We are making `Service` `Infallible` because we convert errors to responses via\n    // `PyMiddlewareException::into_response` which has `IntoResponse<Protocol>` bound,\n    // so we always return a protocol specific error response instead of erroring out.\n    type Error = Infallible;\n    type Future = BoxFuture<'static, Result<Self::Response, Self::Error>>;\n\n    fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {\n        self.inner.poll_ready(cx)\n    }\n\n    fn call(&mut self, req: Request<Body>) -> Self::Future {\n        let inner = {\n            // https://docs.rs/tower/latest/tower/trait.Service.html#be-careful-when-cloning-inner-services\n            let clone = self.inner.clone();\n            mem::replace(&mut self.inner, clone)\n        };\n        let handler = self.handler.clone();\n        let handler_name = handler.name.clone();\n        let next = BoxService::new(inner.map_err(|err| err.into()));\n        let locals = self.locals.clone();\n        let into_response = self.into_response;\n\n        Box::pin(\n            handler\n                .call(req, next, locals)\n                .or_else(move |err| async move {\n                    tracing::error!(error = ?rich_py_err(Python::with_gil(|py| err.clone_ref(py))), handler_name, \"middleware failed\");\n                    let response = (into_response)(err.into());\n                    Ok(response)\n                }),\n        )\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server-python/src/middleware/mod.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Schedule pure-Python middlewares as [tower::Layer]s.\n//!\n//! # Moving data from Rust to Python and back\n//!\n//! In middlewares we need to move some data back-and-forth between Rust and Python.\n//! When you move some data from Rust to Python you can't get its ownership back,\n//! you can only get `&T` or `&mut T` but not `T` unless you clone it.\n//!\n//! In order to overcome this shortcoming we are using wrappers for Python that holds\n//! pure-Rust types with [Option]s and provides `take_inner(&mut self) -> Option<T>`\n//! method to get the ownership of `T` back.\n//!\n//! For example:\n//! ```no_run\n//! # use pyo3::prelude::*;\n//! # use pyo3::exceptions::PyRuntimeError;\n//! # enum PyMiddlewareError {\n//! #     InnerGone\n//! # }\n//! # impl From<PyMiddlewareError> for PyErr {\n//! #     fn from(_: PyMiddlewareError) -> PyErr {\n//! #         PyRuntimeError::new_err(\"inner gone\")\n//! #     }\n//! # }\n//! // Pure Rust type\n//! struct Inner {\n//!     num: i32\n//! }\n//!\n//! // Python wrapper\n//! #[pyclass]\n//! pub struct Wrapper(Option<Inner>);\n//!\n//! impl Wrapper {\n//!     // Call when Python is done processing the `Wrapper`\n//!     // to get ownership of `Inner` back\n//!     pub fn take_inner(&mut self) -> Option<Inner> {\n//!         self.0.take()\n//!     }\n//! }\n//!\n//! // Python exposed methods checks if `Wrapper` still has the `Inner` and\n//! // fails with `InnerGone` otherwise.\n//! #[pymethods]\n//! impl Wrapper {\n//!     #[getter]\n//!     fn num(&self) -> PyResult<i32> {\n//!         self.0\n//!             .as_ref()\n//!             .map(|inner| inner.num)\n//!             .ok_or_else(|| PyMiddlewareError::InnerGone.into())\n//!     }\n//!\n//!     #[setter]\n//!     fn set_num(&mut self, num: i32) -> PyResult<()> {\n//!         match self.0.as_mut() {\n//!             Some(inner) => {\n//!                 inner.num = num;\n//!                 Ok(())\n//!             }\n//!             None => Err(PyMiddlewareError::InnerGone.into()),\n//!         }\n//!     }\n//! }\n//! ```\n//!\n//! You can see this pattern in [PyRequest], [PyResponse] and the others.\n//!\n\nmod error;\nmod handler;\nmod header_map;\nmod layer;\nmod request;\nmod response;\n\npub use self::error::PyMiddlewareError;\npub use self::handler::PyMiddlewareHandler;\npub use self::header_map::PyHeaderMap;\npub use self::layer::PyMiddlewareLayer;\npub use self::request::PyRequest;\npub use self::response::PyResponse;\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server-python/src/middleware/pytests/harness.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n#[pyo3_asyncio::tokio::main]\nasync fn main() -> pyo3::PyResult<()> {\n    pyo3_asyncio::testing::main().await\n}\n\nmod layer;\nmod request;\nmod response;\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server-python/src/middleware/pytests/layer.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::convert::Infallible;\n\nuse aws_smithy_http_server_python::{\n    middleware::{PyMiddlewareHandler, PyMiddlewareLayer},\n    PyMiddlewareException, PyResponse,\n};\nuse aws_smithy_legacy_http_server::{\n    body::{to_boxed, Body, BoxBody},\n    protocol::rest_json_1::RestJson1,\n};\nuse http::{Request, Response, StatusCode};\nuse pretty_assertions::assert_eq;\nuse pyo3::{prelude::*, types::PyDict};\nuse pyo3_asyncio::TaskLocals;\nuse tokio_test::assert_ready_ok;\nuse tower::{layer::util::Stack, util::BoxCloneService, Layer, Service, ServiceExt};\nuse tower_test::mock;\n\n#[pyo3_asyncio::tokio::test]\nasync fn identity_middleware() -> PyResult<()> {\n    let layer = layer(\n        r#\"\nasync def middleware(request, next):\n    return await next(request)\n\"#,\n    );\n    let (mut service, mut handle) = spawn_service(layer);\n\n    let th = tokio::spawn(async move {\n        let (req, send_response) = handle.next_request().await.unwrap();\n        let req_body = hyper::body::to_bytes(req.into_body()).await.unwrap();\n        assert_eq!(req_body, \"hello server\");\n        send_response.send_response(\n            Response::builder()\n                .body(to_boxed(\"hello client\"))\n                .expect(\"could not create response\"),\n        );\n    });\n\n    let request = simple_request(\"hello server\");\n    let response = service.call(request);\n    assert_body(response.await?, \"hello client\").await;\n\n    th.await.unwrap();\n    Ok(())\n}\n\n#[pyo3_asyncio::tokio::test]\nasync fn returning_response_from_python_middleware() -> PyResult<()> {\n    let layer = layer(\n        r#\"\ndef middleware(request, next):\n    return Response(200, {}, b\"hello client from Python\")\n\"#,\n    );\n    let (mut service, _handle) = spawn_service(layer);\n\n    let request = simple_request(\"hello server\");\n    let response = service.call(request);\n    assert_body(response.await?, \"hello client from Python\").await;\n\n    Ok(())\n}\n\n#[pyo3_asyncio::tokio::test]\nasync fn convert_exception_from_middleware_to_protocol_specific_response() -> PyResult<()> {\n    let layer = layer(\n        r#\"\ndef middleware(request, next):\n    raise RuntimeError(\"fail\")\n\"#,\n    );\n    let (mut service, _handle) = spawn_service(layer);\n\n    let request = simple_request(\"hello server\");\n    let response = service.call(request);\n    let response = response.await.unwrap();\n    assert_eq!(response.status(), StatusCode::INTERNAL_SERVER_ERROR);\n    assert_body(response, r#\"{\"message\":\"RuntimeError: fail\"}\"#).await;\n\n    Ok(())\n}\n\n#[pyo3_asyncio::tokio::test]\nasync fn uses_status_code_and_message_from_middleware_exception() -> PyResult<()> {\n    let layer = layer(\n        r#\"\ndef middleware(request, next):\n    raise MiddlewareException(\"access denied\", 401)\n\"#,\n    );\n    let (mut service, _handle) = spawn_service(layer);\n\n    let request = simple_request(\"hello server\");\n    let response = service.call(request);\n    let response = response.await.unwrap();\n    assert_eq!(response.status(), StatusCode::UNAUTHORIZED);\n    assert_body(response, r#\"{\"message\":\"access denied\"}\"#).await;\n\n    Ok(())\n}\n\n#[pyo3_asyncio::tokio::test]\nasync fn nested_middlewares() -> PyResult<()> {\n    let first_layer = layer(\n        r#\"\nasync def middleware(request, next):\n    return await next(request)\n\"#,\n    );\n    let second_layer = layer(\n        r#\"\ndef middleware(request, next):\n    return Response(200, {}, b\"hello client from Python second middleware\")\n\"#,\n    );\n    let layer = Stack::new(first_layer, second_layer);\n    let (mut service, _handle) = spawn_service(layer);\n\n    let request = simple_request(\"hello server\");\n    let response = service.call(request);\n    assert_body(\n        response.await?,\n        \"hello client from Python second middleware\",\n    )\n    .await;\n\n    Ok(())\n}\n\n#[pyo3_asyncio::tokio::test]\nasync fn changes_request() -> PyResult<()> {\n    let layer = layer(\n        r#\"\nasync def middleware(request, next):\n    body = bytes(await request.body).decode()\n    body_reversed = body[::-1]\n    request.body = body_reversed.encode()\n    # Add a new header\n    request.headers[\"X-From-Middleware\"] = \"yes\"\n    # Change an existing header.\n    request.headers[\"X-Existing\"] = \"changed\"\n    # Delete an existing header.\n    del request.headers[\"X-To-Delete\"]\n    # Change the URI.\n    request.uri = \"/changed_uri\"\n    return await next(request)\n\"#,\n    );\n    let (mut service, mut handle) = spawn_service(layer);\n\n    let th = tokio::spawn(async move {\n        let (req, send_response) = handle.next_request().await.unwrap();\n        assert_eq!(\"yes\", req.headers().get(\"X-From-Middleware\").unwrap());\n        assert_eq!(\"changed\", req.headers().get(\"X-Existing\").unwrap());\n        assert!(req.headers().get(\"X-To-Delete\").is_none());\n        assert_eq!(\"/changed_uri\", req.uri());\n        let req_body = hyper::body::to_bytes(req.into_body()).await.unwrap();\n        assert_eq!(req_body, \"hello server\".chars().rev().collect::<String>());\n        send_response.send_response(\n            Response::builder()\n                .body(to_boxed(\"hello client\"))\n                .expect(\"could not create response\"),\n        );\n    });\n\n    let mut request = simple_request(\"hello server\");\n    assert_ne!(request.uri(), \"/changed_uri\");\n    // Add a header that the middleware should modify.\n    let headers_mut = request.headers_mut();\n    headers_mut.insert(\"X-Existing\", http::HeaderValue::from_static(\"yes\"));\n    // Add a header that the middleware should remove.\n    headers_mut.insert(\"X-To-Delete\", http::HeaderValue::from_static(\"delete-this\"));\n    let response = service.call(request);\n    assert_body(response.await?, \"hello client\").await;\n\n    th.await.unwrap();\n    Ok(())\n}\n\n#[pyo3_asyncio::tokio::test]\nasync fn changes_response() -> PyResult<()> {\n    let layer = layer(\n        r#\"\nasync def middleware(request, next):\n    response = await next(request)\n    body = bytes(await response.body).decode()\n    body_reversed = body[::-1]\n    response.body = body_reversed.encode()\n    response.headers[\"X-From-Middleware\"] = \"yes\"\n    return response\n\"#,\n    );\n    let (mut service, mut handle) = spawn_service(layer);\n\n    let th = tokio::spawn(async move {\n        let (req, send_response) = handle.next_request().await.unwrap();\n        let req_body = hyper::body::to_bytes(req.into_body()).await.unwrap();\n        assert_eq!(req_body, \"hello server\");\n        send_response.send_response(\n            Response::builder()\n                .body(to_boxed(\"hello client\"))\n                .expect(\"could not create response\"),\n        );\n    });\n\n    let request = simple_request(\"hello server\");\n    let response = service.call(request);\n    let response = response.await.unwrap();\n    assert_eq!(response.headers().get(\"X-From-Middleware\").unwrap(), &\"yes\");\n    assert_body(response, &\"hello client\".chars().rev().collect::<String>()).await;\n\n    th.await.unwrap();\n    Ok(())\n}\n\n#[pyo3_asyncio::tokio::test]\nasync fn fails_if_req_is_used_after_calling_next() -> PyResult<()> {\n    let layer = layer(\n        r#\"\nasync def middleware(request, next):\n    uri = request.uri\n    response = await next(request)\n    uri = request.uri # <- fails\n    return response\n\"#,\n    );\n\n    let (mut service, mut handle) = spawn_service(layer);\n\n    let th = tokio::spawn(async move {\n        let (req, send_response) = handle.next_request().await.unwrap();\n        let req_body = hyper::body::to_bytes(req.into_body()).await.unwrap();\n        assert_eq!(req_body, \"hello server\");\n        send_response.send_response(\n            Response::builder()\n                .body(to_boxed(\"hello client\"))\n                .expect(\"could not create response\"),\n        );\n    });\n\n    let request = simple_request(\"hello server\");\n    let response = service.call(request);\n    let response = response.await.unwrap();\n    assert_eq!(response.status(), StatusCode::INTERNAL_SERVER_ERROR);\n    assert_body(\n        response,\n        r#\"{\"message\":\"RuntimeError: request is accessed after `next` is called\"}\"#,\n    )\n    .await;\n\n    th.await.unwrap();\n    Ok(())\n}\n\nasync fn assert_body(response: Response<BoxBody>, eq: &str) {\n    let body = hyper::body::to_bytes(response.into_body()).await.unwrap();\n    assert_eq!(body, eq);\n}\n\nfn simple_request(body: &'static str) -> Request<Body> {\n    Request::builder()\n        .body(Body::from(body))\n        .expect(\"could not create request\")\n}\n\n#[allow(clippy::type_complexity)]\nfn spawn_service<L, E>(\n    layer: L,\n) -> (\n    mock::Spawn<L::Service>,\n    mock::Handle<Request<Body>, Response<BoxBody>>,\n)\nwhere\n    L: Layer<BoxCloneService<Request<Body>, Response<BoxBody>, Infallible>>,\n    L::Service: Service<Request<Body>, Error = E>,\n    E: std::fmt::Debug,\n{\n    let (mut service, handle) = mock::spawn_with(|svc| {\n        let svc = svc\n            .map_err(|err| panic!(\"service failed: {err}\"))\n            .boxed_clone();\n        layer.layer(svc)\n    });\n    assert_ready_ok!(service.poll_ready());\n    (service, handle)\n}\n\nfn layer(code: &str) -> PyMiddlewareLayer<RestJson1> {\n    PyMiddlewareLayer::<RestJson1>::new(py_handler(code), task_locals())\n}\n\nfn task_locals() -> TaskLocals {\n    Python::with_gil(|py| {\n        Ok::<_, PyErr>(TaskLocals::new(pyo3_asyncio::tokio::get_current_loop(py)?))\n    })\n    .unwrap()\n}\n\nfn py_handler(code: &str) -> PyMiddlewareHandler {\n    Python::with_gil(|py| {\n        // `py.run` under the hood uses `eval` (`PyEval_EvalCode` in C API)\n        // and by default if you pass a `global` object without `__builtins__` key\n        // it inserts `__builtins__` with reference to the `builtins` module\n        // which provides prelude for Python so you can access `print()`, `bytes()`, `len()` etc.\n        // but this is not working for Python 3.7.10 which is the version we are using in our CI\n        // so our tests are failing in CI because there is no `print()`, `bytes()` etc.\n        // in order to fix that we are manually extending `__main__` module to preserve `__builtins__`.\n        let globals = PyModule::import(py, \"__main__\")?.dict();\n        globals.set_item(\n            \"MiddlewareException\",\n            py.get_type::<PyMiddlewareException>(),\n        )?;\n        globals.set_item(\"Response\", py.get_type::<PyResponse>())?;\n        let locals = PyDict::new(py);\n        py.run(code, Some(globals), Some(locals))?;\n        let handler = locals\n            .get_item(\"middleware\")\n            .expect(\"Python exception occurred during dictionary lookup\")\n            .expect(\"your handler must be named `middleware`\")\n            .into();\n        PyMiddlewareHandler::new(py, handler)\n    })\n    .unwrap()\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server-python/src/middleware/pytests/request.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_smithy_http_server_python::PyRequest;\nuse http::{Request, Version};\nuse hyper::Body;\nuse pyo3::{exceptions::PyValueError, prelude::*, py_run};\n\n#[pyo3_asyncio::tokio::test]\nasync fn accessing_request_properties() -> PyResult<()> {\n    let request = Request::builder()\n        .method(\"POST\")\n        .uri(\"https://www.rust-lang.org/\")\n        .header(\"Accept-Encoding\", \"*\")\n        .header(\"X-Custom\", \"42\")\n        .version(Version::HTTP_2)\n        .body(Body::from(\"hello world\"))\n        .expect(\"could not build request\");\n    let py_request = PyRequest::new(request);\n\n    Python::with_gil(|py| {\n        let req = PyCell::new(py, py_request)?;\n        py_run!(\n            py,\n            req,\n            r#\"\nassert req.method == \"POST\"\nassert req.uri == \"https://www.rust-lang.org/\"\nassert req.headers[\"accept-encoding\"] == \"*\"\nassert req.headers[\"x-custom\"] == \"42\"\nassert req.version == \"HTTP/2.0\"\n\nassert req.headers.get(\"x-foo\") == None\nreq.headers[\"x-foo\"] = \"bar\"\nassert req.headers[\"x-foo\"] == \"bar\"\n\"#\n        );\n        Ok(())\n    })\n}\n\n#[pyo3_asyncio::tokio::test]\nasync fn accessing_and_changing_request_body() -> PyResult<()> {\n    let request = Request::builder()\n        .body(Body::from(\"hello world\"))\n        .expect(\"could not build request\");\n    let py_request = PyRequest::new(request);\n\n    Python::with_gil(|py| {\n        let module = PyModule::from_code(\n            py,\n            r#\"\nasync def handler(req):\n    # TODO(Ergonomics): why we need to wrap with `bytes`?\n    assert bytes(await req.body) == b\"hello world\"\n\n    req.body = b\"hello world from middleware\"\n    assert bytes(await req.body) == b\"hello world from middleware\"\n\"#,\n            \"\",\n            \"\",\n        )?;\n        let handler = module.getattr(\"handler\")?;\n\n        let output = handler.call1((py_request,))?;\n        Ok::<_, PyErr>(pyo3_asyncio::tokio::into_future(output))\n    })??\n    .await?;\n\n    Ok(())\n}\n\n#[pyo3_asyncio::tokio::test]\nasync fn accessing_and_changing_request_uri() -> PyResult<()> {\n    let request = Request::builder()\n        .uri(\"/op1\")\n        .body(Body::from(\"hello world\"))\n        .expect(\"could not build request\");\n    let py_request = PyRequest::new(request);\n\n    // Call an async Python method to change the URI and return it.\n    let modified_req = Python::with_gil(|py| {\n        let module = PyModule::from_code(\n            py,\n            r#\"\nasync def handler(req):\n    assert req.uri == \"/op1\"\n    # add a trailing slash to the uri\n    req.uri = \"/op1/\"\n    assert req.uri == \"/op1/\"\n    return req\n\"#,\n            \"\",\n            \"\",\n        )?;\n\n        let req_ref = PyCell::new(py, py_request)?;\n        let handler = module.getattr(\"handler\")?;\n        let output = handler.call1((req_ref,))?;\n\n        Ok::<_, PyErr>(pyo3_asyncio::tokio::into_future(output))\n    })??\n    .await?;\n\n    // Confirm that the URI has been changed when the modified PyRequest instance\n    // from Python is converted into a http::Request<> instance.\n    Python::with_gil(|py| {\n        let request_cell: &PyCell<PyRequest> = modified_req.downcast(py)?;\n        let mut request = request_cell.borrow_mut();\n        let http_request = request\n            .take_inner()\n            .ok_or_else(|| PyValueError::new_err(\"inner http request has already been consumed\"))?;\n        assert_eq!(http_request.uri(), \"/op1/\");\n\n        Ok::<_, PyErr>(())\n    })?;\n\n    Ok(())\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server-python/src/middleware/pytests/response.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_smithy_http_server_python::PyResponse;\nuse aws_smithy_legacy_http_server::body::to_boxed;\nuse http::{Response, StatusCode, Version};\nuse pyo3::{\n    prelude::*,\n    py_run,\n    types::{IntoPyDict, PyDict},\n};\n\n#[pyo3_asyncio::tokio::test]\nasync fn building_response_in_python() -> PyResult<()> {\n    let response = Python::with_gil(|py| {\n        let globals = [(\"Response\", py.get_type::<PyResponse>())].into_py_dict(py);\n        let locals = PyDict::new(py);\n\n        py.run(\n            r#\"\nresponse = Response(200, {\"Content-Type\": \"application/json\"}, b\"hello world\")\n\"#,\n            Some(globals),\n            Some(locals),\n        )\n        .unwrap();\n\n        let py_response: Py<PyResponse> = locals\n            .get_item(\"response\")\n            .expect(\"Python exception occurred during dictionary lookup\")\n            .unwrap()\n            .extract()\n            .unwrap();\n        let response = py_response.borrow_mut(py).take_inner();\n        response.unwrap()\n    });\n\n    assert_eq!(response.status(), StatusCode::OK);\n\n    let headers = response.headers();\n    {\n        assert_eq!(headers.len(), 1);\n        assert_eq!(headers.get(\"Content-Type\").unwrap(), \"application/json\");\n    }\n\n    let body = hyper::body::to_bytes(response.into_body()).await.unwrap();\n    assert_eq!(body, \"hello world\");\n\n    Ok(())\n}\n\n#[pyo3_asyncio::tokio::test]\nasync fn accessing_response_properties() -> PyResult<()> {\n    let response = Response::builder()\n        .status(StatusCode::IM_A_TEAPOT)\n        .version(Version::HTTP_3)\n        .header(\"X-Secret\", \"42\")\n        .body(to_boxed(\"hello world\"))\n        .expect(\"could not build response\");\n    let py_response = PyResponse::new(response);\n\n    Python::with_gil(|py| {\n        let res = PyCell::new(py, py_response)?;\n        py_run!(\n            py,\n            res,\n            r#\"\nassert res.status == 418\nassert res.version == \"HTTP/3.0\"\nassert res.headers[\"x-secret\"] == \"42\"\n\nassert res.headers.get(\"x-foo\") == None\nres.headers[\"x-foo\"] = \"bar\"\nassert res.headers[\"x-foo\"] == \"bar\"\n\"#\n        );\n        Ok(())\n    })\n}\n\n#[pyo3_asyncio::tokio::test]\nasync fn accessing_and_changing_response_body() -> PyResult<()> {\n    let response = Response::builder()\n        .body(to_boxed(\"hello world\"))\n        .expect(\"could not build response\");\n    let py_response = PyResponse::new(response);\n\n    Python::with_gil(|py| {\n        let module = PyModule::from_code(\n            py,\n            r#\"\nasync def handler(res):\n    assert bytes(await res.body) == b\"hello world\"\n\n    res.body = b\"hello world from middleware\"\n    assert bytes(await res.body) == b\"hello world from middleware\"\n\"#,\n            \"\",\n            \"\",\n        )?;\n        let handler = module.getattr(\"handler\")?;\n\n        let output = handler.call1((py_response,))?;\n        Ok::<_, PyErr>(pyo3_asyncio::tokio::into_future(output))\n    })??\n    .await?;\n\n    Ok(())\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server-python/src/middleware/request.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Python-compatible middleware [http::Request] implementation.\n\nuse std::mem;\nuse std::sync::Arc;\n\nuse aws_smithy_legacy_http_server::body::Body;\nuse http::{request::Parts, Request};\nuse pyo3::{\n    exceptions::{PyRuntimeError, PyValueError},\n    prelude::*,\n};\nuse tokio::sync::Mutex;\n\nuse super::{PyHeaderMap, PyMiddlewareError};\n\n/// Python-compatible [Request] object.\n#[pyclass(name = \"Request\")]\n#[derive(Debug)]\npub struct PyRequest {\n    parts: Option<Parts>,\n    headers: PyHeaderMap,\n    body: Arc<Mutex<Option<Body>>>,\n}\n\nimpl PyRequest {\n    /// Create a new Python-compatible [Request] structure from the Rust side.\n    pub fn new(request: Request<Body>) -> Self {\n        let (mut parts, body) = request.into_parts();\n        let headers = mem::take(&mut parts.headers);\n        Self {\n            parts: Some(parts),\n            headers: PyHeaderMap::new(headers),\n            body: Arc::new(Mutex::new(Some(body))),\n        }\n    }\n\n    // Consumes self by taking the inner Request.\n    // This method would have been `into_inner(self) -> Request<Body>`\n    // but we can't do that because we are crossing Python boundary.\n    pub fn take_inner(&mut self) -> Option<Request<Body>> {\n        let headers = self.headers.take_inner()?;\n        let mut parts = self.parts.take()?;\n        parts.headers = headers;\n        let body = {\n            let body = mem::take(&mut self.body);\n            let body = Arc::try_unwrap(body).ok()?;\n            body.into_inner()?\n        };\n        Some(Request::from_parts(parts, body))\n    }\n}\n\n#[pymethods]\nimpl PyRequest {\n    /// Return the HTTP method of this request.\n    ///\n    /// :type str:\n    #[getter]\n    fn method(&self) -> PyResult<String> {\n        self.parts\n            .as_ref()\n            .map(|parts| parts.method.to_string())\n            .ok_or_else(|| PyMiddlewareError::RequestGone.into())\n    }\n\n    /// Return the URI of this request.\n    ///\n    /// :type str:\n    #[getter]\n    fn uri(&self) -> PyResult<String> {\n        self.parts\n            .as_ref()\n            .map(|parts| parts.uri.to_string())\n            .ok_or_else(|| PyMiddlewareError::RequestGone.into())\n    }\n\n    /// Sets the URI of this request.\n    ///\n    /// :type str:\n    #[setter]\n    fn set_uri(&mut self, uri_str: String) -> PyResult<()> {\n        self.parts.as_mut().map_or_else(\n            || Err(PyMiddlewareError::RequestGone.into()),\n            |parts| {\n                parts.uri = uri_str.parse().map_err(|e: http::uri::InvalidUri| {\n                    PyValueError::new_err(format!(\"URI `{uri_str}` cannot be parsed. Error: {e}\"))\n                })?;\n                Ok(())\n            },\n        )\n    }\n\n    /// Return the HTTP version of this request.\n    ///\n    /// :type str:\n    #[getter]\n    fn version(&self) -> PyResult<String> {\n        self.parts\n            .as_ref()\n            .map(|parts| format!(\"{:?}\", parts.version))\n            .ok_or_else(|| PyMiddlewareError::RequestGone.into())\n    }\n\n    /// Return the HTTP headers of this request.\n    ///\n    /// :type typing.MutableMapping[str, str]:\n    #[getter]\n    fn headers(&self) -> PyHeaderMap {\n        self.headers.clone()\n    }\n\n    /// Return the HTTP body of this request.\n    /// Note that this is a costly operation because the whole request body is cloned.\n    ///\n    /// :type typing.Awaitable[bytes]:\n    #[getter]\n    fn body<'p>(&self, py: Python<'p>) -> PyResult<&'p PyAny> {\n        let body = self.body.clone();\n        pyo3_asyncio::tokio::future_into_py(py, async move {\n            let body = {\n                let mut body_guard = body.lock().await;\n                let body = body_guard.take().ok_or(PyMiddlewareError::RequestGone)?;\n                let body = hyper::body::to_bytes(body)\n                    .await\n                    .map_err(|err| PyRuntimeError::new_err(err.to_string()))?;\n                let buf = body.clone();\n                body_guard.replace(Body::from(body));\n                buf\n            };\n            // TODO(Perf): can we use `PyBytes` here?\n            Ok(body.to_vec())\n        })\n    }\n\n    /// Set the HTTP body of this request.\n    #[setter]\n    fn set_body(&mut self, buf: &[u8]) {\n        self.body = Arc::new(Mutex::new(Some(Body::from(buf.to_owned()))));\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server-python/src/middleware/response.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Python-compatible middleware [http::Response] implementation.\n\n#![allow(non_local_definitions)]\n\nuse std::collections::HashMap;\nuse std::mem;\nuse std::sync::Arc;\n\nuse aws_smithy_legacy_http_server::body::{to_boxed, BoxBody};\nuse http::{response::Parts, Response};\nuse pyo3::{exceptions::PyRuntimeError, prelude::*};\nuse tokio::sync::Mutex;\n\nuse super::{PyHeaderMap, PyMiddlewareError};\n\n/// Python-compatible [Response] object.\n///\n/// :param status int:\n/// :param headers typing.Optional[typing.Dict[str, str]]:\n/// :param body typing.Optional[bytes]:\n/// :rtype None:\n#[pyclass(name = \"Response\")]\npub struct PyResponse {\n    parts: Option<Parts>,\n    headers: PyHeaderMap,\n    body: Arc<Mutex<Option<BoxBody>>>,\n}\n\nimpl PyResponse {\n    /// Create a new Python-compatible [Response] structure from the Rust side.\n    pub fn new(response: Response<BoxBody>) -> Self {\n        let (mut parts, body) = response.into_parts();\n        let headers = mem::take(&mut parts.headers);\n        Self {\n            parts: Some(parts),\n            headers: PyHeaderMap::new(headers),\n            body: Arc::new(Mutex::new(Some(body))),\n        }\n    }\n\n    // Consumes self by taking the inner Response.\n    // This method would have been `into_inner(self) -> Response<BoxBody>`\n    // but we can't do that because we are crossing Python boundary.\n    pub fn take_inner(&mut self) -> Option<Response<BoxBody>> {\n        let headers = self.headers.take_inner()?;\n        let mut parts = self.parts.take()?;\n        parts.headers = headers;\n        let body = {\n            let body = mem::take(&mut self.body);\n            let body = Arc::try_unwrap(body).ok()?;\n            body.into_inner()?\n        };\n        Some(Response::from_parts(parts, body))\n    }\n}\n\n#[pymethods]\nimpl PyResponse {\n    /// Python-compatible [Response] object from the Python side.\n    #[pyo3(text_signature = \"($self, status, headers=None, body=None)\")]\n    #[new]\n    fn newpy(\n        status: u16,\n        headers: Option<HashMap<String, String>>,\n        body: Option<Vec<u8>>,\n    ) -> PyResult<Self> {\n        let mut builder = Response::builder().status(status);\n\n        if let Some(headers) = headers {\n            for (k, v) in headers {\n                builder = builder.header(k, v);\n            }\n        }\n\n        let response = builder\n            .body(body.map(to_boxed).unwrap_or_default())\n            .map_err(|err| PyRuntimeError::new_err(err.to_string()))?;\n\n        Ok(Self::new(response))\n    }\n\n    /// Return the HTTP status of this response.\n    ///\n    /// :type int:\n    #[getter]\n    fn status(&self) -> PyResult<u16> {\n        self.parts\n            .as_ref()\n            .map(|parts| parts.status.as_u16())\n            .ok_or_else(|| PyMiddlewareError::ResponseGone.into())\n    }\n\n    /// Return the HTTP version of this response.\n    ///\n    /// :type str:\n    #[getter]\n    fn version(&self) -> PyResult<String> {\n        self.parts\n            .as_ref()\n            .map(|parts| format!(\"{:?}\", parts.version))\n            .ok_or_else(|| PyMiddlewareError::ResponseGone.into())\n    }\n\n    /// Return the HTTP headers of this response.\n    ///\n    /// :type typing.MutableMapping[str, str]:\n    #[getter]\n    fn headers(&self) -> PyHeaderMap {\n        self.headers.clone()\n    }\n\n    /// Return the HTTP body of this response.\n    /// Note that this is a costly operation because the whole response body is cloned.\n    ///\n    /// :type typing.Awaitable[bytes]:\n    #[getter]\n    fn body<'p>(&self, py: Python<'p>) -> PyResult<&'p PyAny> {\n        let body = self.body.clone();\n        pyo3_asyncio::tokio::future_into_py(py, async move {\n            let body = {\n                let mut body_guard = body.lock().await;\n                let body = body_guard.take().ok_or(PyMiddlewareError::RequestGone)?;\n                let body = hyper::body::to_bytes(body)\n                    .await\n                    .map_err(|err| PyRuntimeError::new_err(err.to_string()))?;\n                let buf = body.clone();\n                body_guard.replace(to_boxed(body));\n                buf\n            };\n            // TODO(Perf): can we use `PyBytes` here?\n            Ok(body.to_vec())\n        })\n    }\n\n    /// Set the HTTP body of this response.\n    #[setter]\n    fn set_body(&mut self, buf: &[u8]) {\n        self.body = Arc::new(Mutex::new(Some(to_boxed(buf.to_owned()))));\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server-python/src/pytests/bytestream.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::io;\n\nuse futures::StreamExt;\nuse futures_util::stream;\nuse hyper::Body;\nuse pyo3::{prelude::*, py_run};\n\nuse aws_smithy_http_server_python::types::ByteStream;\nuse aws_smithy_types::body::SdkBody;\n\n#[pyo3_asyncio::tokio::test]\nfn consuming_stream_on_python_synchronously() -> PyResult<()> {\n    let bytestream = streaming_bytestream_from_vec(vec![\"hello\", \" \", \"world\"]);\n    Python::with_gil(|py| {\n        let bytestream = bytestream.into_py(py);\n        py_run!(\n            py,\n            bytestream,\n            r#\"\nassert next(bytestream) == b\"hello\"\nassert next(bytestream) == b\" \"\nassert next(bytestream) == b\"world\"\n\ntry:\n    next(bytestream)\n    assert False, \"iteration should stop by now\"\nexcept StopIteration:\n    pass\n\"#\n        );\n        Ok(())\n    })\n}\n\n#[pyo3_asyncio::tokio::test]\nfn consuming_stream_on_python_synchronously_with_loop() -> PyResult<()> {\n    let bytestream = streaming_bytestream_from_vec(vec![\"hello\", \" \", \"world\"]);\n    Python::with_gil(|py| {\n        let bytestream = bytestream.into_py(py);\n        py_run!(\n            py,\n            bytestream,\n            r#\"\ntotal = []\nfor chunk in bytestream:\n    total.append(chunk)\n\nassert total == [b\"hello\", b\" \", b\"world\"]\n\"#\n        );\n        Ok(())\n    })\n}\n\n#[pyo3_asyncio::tokio::test]\nfn consuming_stream_on_python_asynchronously() -> PyResult<()> {\n    let bytestream = streaming_bytestream_from_vec(vec![\"hello\", \" \", \"world\"]);\n    Python::with_gil(|py| {\n        let bytestream = bytestream.into_py(py);\n        py_run!(\n            py,\n            bytestream,\n            r#\"\nimport asyncio\n\nasync def main(bytestream):\n    assert await bytestream.__anext__() == b\"hello\"\n    assert await bytestream.__anext__() == b\" \"\n    assert await bytestream.__anext__() == b\"world\"\n\n    try:\n        await bytestream.__anext__()\n        assert False, \"iteration should stop by now\"\n    except StopAsyncIteration:\n        pass\n\nasyncio.run(main(bytestream))\n\"#\n        );\n        Ok(())\n    })\n}\n\n#[pyo3_asyncio::tokio::test]\nfn consuming_stream_on_python_asynchronously_with_loop() -> PyResult<()> {\n    let bytestream = streaming_bytestream_from_vec(vec![\"hello\", \" \", \"world\"]);\n    Python::with_gil(|py| {\n        let bytestream = bytestream.into_py(py);\n        py_run!(\n            py,\n            bytestream,\n            r#\"\nimport asyncio\n\nasync def main(bytestream):\n    total = []\n    async for chunk in bytestream:\n        total.append(chunk)\n    assert total == [b\"hello\", b\" \", b\"world\"]\n\nasyncio.run(main(bytestream))\n\"#\n        );\n        Ok(())\n    })\n}\n\n#[pyo3_asyncio::tokio::test]\nasync fn streaming_back_to_rust_from_python() -> PyResult<()> {\n    let bytestream = streaming_bytestream_from_vec(vec![\"hello\", \" \", \"world\"]);\n    let py_stream = Python::with_gil(|py| {\n        let module = PyModule::from_code(\n            py,\n            r#\"\nasync def handler(bytestream):\n    async for chunk in bytestream:\n        yield \"🐍 \" + chunk.decode(\"utf-8\")\n    yield \"Hello from Python!\"\n\"#,\n            \"\",\n            \"\",\n        )?;\n        let handler = module.getattr(\"handler\")?;\n        let output = handler.call1((bytestream,))?;\n        Ok::<_, PyErr>(pyo3_asyncio::tokio::into_stream_v2(output))\n    })??;\n\n    let mut py_stream = py_stream.map(|v| Python::with_gil(|py| v.extract::<String>(py).unwrap()));\n\n    assert_eq!(py_stream.next().await, Some(\"🐍 hello\".to_string()));\n    assert_eq!(py_stream.next().await, Some(\"🐍  \".to_string()));\n    assert_eq!(py_stream.next().await, Some(\"🐍 world\".to_string()));\n    assert_eq!(\n        py_stream.next().await,\n        Some(\"Hello from Python!\".to_string())\n    );\n    assert_eq!(py_stream.next().await, None);\n\n    Ok(())\n}\n\nfn streaming_bytestream_from_vec(chunks: Vec<&'static str>) -> ByteStream {\n    let stream = stream::iter(chunks.into_iter().map(Ok::<_, io::Error>));\n    let body = Body::wrap_stream(stream);\n    ByteStream::new(SdkBody::from_body_0_4(body))\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server-python/src/pytests/harness.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n#[pyo3_asyncio::tokio::main]\nasync fn main() -> pyo3::PyResult<()> {\n    pyo3_asyncio::testing::main().await\n}\n\nmod bytestream;\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server-python/src/server.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::collections::HashMap;\nuse std::convert::Infallible;\nuse std::net::TcpListener as StdTcpListener;\nuse std::ops::Deref;\nuse std::process;\nuse std::sync::{mpsc, Arc};\nuse std::thread;\n\nuse aws_smithy_legacy_http_server::{\n    body::{Body, BoxBody},\n    routing::IntoMakeService,\n};\nuse http::{Request, Response};\nuse hyper::server::conn::AddrIncoming;\nuse parking_lot::Mutex;\nuse pyo3::{prelude::*, types::IntoPyDict};\nuse signal_hook::{consts::*, iterator::Signals};\nuse socket2::Socket;\nuse tokio::{net::TcpListener, runtime};\nuse tokio_rustls::TlsAcceptor;\nuse tower::{util::BoxCloneService, ServiceBuilder};\n\nuse crate::{\n    context::{layer::AddPyContextLayer, PyContext},\n    tls::{listener::Listener as TlsListener, PyTlsConfig},\n    util::{error::rich_py_err, func_metadata},\n    PySocket,\n};\n\n/// A Python handler function representation.\n///\n/// The Python business logic implementation needs to carry some information\n/// to be executed properly like the size of its arguments and if it is\n/// a coroutine.\n#[pyclass]\n#[derive(Debug, Clone)]\npub struct PyHandler {\n    pub func: PyObject,\n    // Number of args is needed to decide whether handler accepts context as an argument\n    pub args: usize,\n    pub is_coroutine: bool,\n}\n\nimpl Deref for PyHandler {\n    type Target = PyObject;\n\n    fn deref(&self) -> &Self::Target {\n        &self.func\n    }\n}\n\n// A `BoxCloneService` with default `Request`, `Response` and `Error`.\ntype Service = BoxCloneService<Request<Body>, Response<BoxBody>, Infallible>;\n\n/// Trait defining a Python application.\n///\n/// A Python application requires handling of multiple processes, signals and allows to register Python\n/// function that will be executed as business logic by the code generated Rust handlers.\n/// To properly function, the application requires some state:\n/// * `workers`: the list of child Python worker processes, protected by a Mutex.\n/// * `context`: the optional Python object that should be passed inside the Rust state struct.\n/// * `handlers`: the mapping between an operation name and its [PyHandler] representation.\n///\n/// Since the Python application is spawning multiple workers, it also requires signal handling to allow the gracefull\n/// termination of multiple Hyper servers. The main Rust process is registering signal and using them to understand when it\n/// it time to loop through all the active workers and terminate them. Workers registers their own signal handlers and attaches\n/// them to the Python event loop, ensuring all coroutines are cancelled before terminating a worker.\n///\n/// This trait will be implemented by the code generated by the `PythonApplicationGenerator` Kotlin class.\npub trait PyApp: Clone + pyo3::IntoPy<PyObject> {\n    /// List of active Python workers registered with this application.\n    fn workers(&self) -> &Mutex<Vec<PyObject>>;\n\n    /// Optional Python context object that will be passed as part of the Rust state.\n    fn context(&self) -> &Option<PyObject>;\n\n    /// Mapping between operation names and their `PyHandler` representation.\n    fn handlers(&mut self) -> &mut HashMap<String, PyHandler>;\n\n    /// Build the app's `Service` using given `event_loop`.\n    fn build_service(&mut self, event_loop: &pyo3::PyAny) -> pyo3::PyResult<Service>;\n\n    /// Handle the graceful termination of Python workers by looping through all the\n    /// active workers and calling `terminate()` on them. If termination fails, this\n    /// method will try to `kill()` any failed worker.\n    fn graceful_termination(&self, workers: &Mutex<Vec<PyObject>>) -> ! {\n        let workers = workers.lock();\n        for (idx, worker) in workers.iter().enumerate() {\n            let idx = idx + 1;\n            Python::with_gil(|py| {\n                let pid: isize = worker\n                    .getattr(py, \"pid\")\n                    .map(|pid| pid.extract(py).unwrap_or(-1))\n                    .unwrap_or(-1);\n                tracing::debug!(idx, pid, \"terminating worker\");\n                match worker.call_method0(py, \"terminate\") {\n                    Ok(_) => {}\n                    Err(e) => {\n                        tracing::error!(error = ?rich_py_err(e), idx, pid, \"error terminating worker\");\n                        worker\n                            .call_method0(py, \"kill\")\n                            .map_err(|e| {\n                                tracing::error!(\n                                    error = ?rich_py_err(e), idx, pid, \"unable to kill kill worker\"\n                                );\n                            })\n                            .unwrap();\n                    }\n                }\n            });\n        }\n        process::exit(0);\n    }\n\n    /// Handler the immediate termination of Python workers by looping through all the\n    /// active workers and calling `kill()` on them.\n    fn immediate_termination(&self, workers: &Mutex<Vec<PyObject>>) -> ! {\n        let workers = workers.lock();\n        for (idx, worker) in workers.iter().enumerate() {\n            let idx = idx + 1;\n            Python::with_gil(|py| {\n                let pid: isize = worker\n                    .getattr(py, \"pid\")\n                    .map(|pid| pid.extract(py).unwrap_or(-1))\n                    .unwrap_or(-1);\n                tracing::debug!(idx, pid, \"killing worker\");\n                worker\n                    .call_method0(py, \"kill\")\n                    .map_err(|e| {\n                        tracing::error!(error = ?rich_py_err(e), idx, pid, \"unable to kill kill worker\");\n                    })\n                    .unwrap();\n            });\n        }\n        process::exit(0);\n    }\n\n    /// Register and handler signals of the main Rust thread. Signals not registered\n    /// in this method are ignored.\n    ///\n    /// Signals supported:\n    ///   * SIGTERM|SIGQUIT - graceful termination of all workers.\n    ///   * SIGINT - immediate termination of all workers.\n    ///\n    /// Other signals are NOOP.\n    fn block_on_rust_signals(&self) {\n        let mut signals =\n            Signals::new([SIGINT, SIGHUP, SIGQUIT, SIGTERM, SIGUSR1, SIGUSR2, SIGWINCH])\n                .expect(\"Unable to register signals\");\n        for sig in signals.forever() {\n            match sig {\n                SIGINT => {\n                    tracing::info!(\n                        sig = %sig, \"termination signal received, all workers will be immediately terminated\"\n                    );\n\n                    self.immediate_termination(self.workers());\n                }\n                SIGTERM | SIGQUIT => {\n                    tracing::info!(\n                        sig = %sig, \"termination signal received, all workers will be gracefully terminated\"\n                    );\n                    self.graceful_termination(self.workers());\n                }\n                _ => {\n                    tracing::debug!(sig = %sig, \"signal is ignored by this application\");\n                }\n            }\n        }\n    }\n\n    /// Register and handle termination of all the tasks on the Python asynchronous event loop.\n    /// We only register SIGQUIT and SIGINT since the main signal handling is done by Rust.\n    fn register_python_signals(&self, py: Python, event_loop: PyObject) -> PyResult<()> {\n        let locals = [(\"event_loop\", event_loop)].into_py_dict(py);\n        py.run(\n            r#\"\nimport asyncio\nimport logging\nimport functools\nimport signal\n\nasync def shutdown(sig, event_loop):\n    # reimport asyncio and logging to be sure they are available when\n    # this handler runs on signal catching.\n    import asyncio\n    import logging\n    logging.info(f\"Caught signal {sig.name}, cancelling tasks registered on this loop\")\n    tasks = [task for task in asyncio.all_tasks() if task is not\n             asyncio.current_task()]\n    list(map(lambda task: task.cancel(), tasks))\n    results = await asyncio.gather(*tasks, return_exceptions=True)\n    logging.debug(f\"Finished awaiting cancelled tasks, results: {results}\")\n    event_loop.stop()\n\nevent_loop.add_signal_handler(signal.SIGTERM,\n    functools.partial(asyncio.ensure_future, shutdown(signal.SIGTERM, event_loop)))\nevent_loop.add_signal_handler(signal.SIGINT,\n    functools.partial(asyncio.ensure_future, shutdown(signal.SIGINT, event_loop)))\n\"#,\n            None,\n            Some(locals),\n        )?;\n        Ok(())\n    }\n\n    /// Start a single worker with its own Tokio and Python async runtime and provided shared socket.\n    ///\n    /// Python asynchronous loop needs to be started and handled during the lifetime of the process and\n    /// it is passed to this method by the caller, which can use\n    /// [configure_python_event_loop](#method.configure_python_event_loop) to properly setup it up.\n    ///\n    /// We retrieve the Python context object, if setup by the user calling [PyApp::context] method,\n    /// generate the state structure and build the [aws_smithy_legacy_http_server::routing::Router], filling\n    /// it with the functions generated by `PythonServerOperationHandlerGenerator.kt`.\n    /// At last we get a cloned reference to the underlying [socket2::Socket].\n    ///\n    /// Now that all the setup is done, we can start the two runtimes and run the [hyper] server.\n    /// We spawn a thread with a new [tokio::runtime], setup the middlewares and finally block the\n    /// thread on Hyper serve() method.\n    /// The main process continues and at the end it is blocked on Python `loop.run_forever()`.\n    ///\n    /// [uvloop]: https://github.com/MagicStack/uvloop\n    fn start_hyper_worker(\n        &mut self,\n        py: Python,\n        socket: &PyCell<PySocket>,\n        event_loop: &PyAny,\n        service: Service,\n        worker_number: isize,\n        tls: Option<PyTlsConfig>,\n    ) -> PyResult<()> {\n        // Clone the socket.\n        let borrow = socket.try_borrow_mut()?;\n        let held_socket: &PySocket = &borrow;\n        let raw_socket = held_socket.get_socket()?;\n\n        // Register signals on the Python event loop.\n        self.register_python_signals(py, event_loop.to_object(py))?;\n\n        // Spawn a new background [std::thread] to run the application.\n        // This is needed because `asyncio` doesn't work properly if it doesn't control the main thread.\n        // At the end of this function you can see we are calling `event_loop.run_forever()` to\n        // yield execution of main thread to `asyncio` runtime.\n        // For more details: https://docs.rs/pyo3-asyncio/latest/pyo3_asyncio/#pythons-event-loop-and-the-main-thread\n        tracing::trace!(\"start the tokio runtime in a background task\");\n        thread::spawn(move || {\n            // The thread needs a new [tokio] runtime.\n            let rt = runtime::Builder::new_multi_thread()\n                .enable_all()\n                .thread_name(format!(\"smithy-rs-tokio[{worker_number}]\"))\n                .build()\n                .expect(\"unable to start a new tokio runtime for this process\");\n            rt.block_on(async move {\n                let addr = addr_incoming_from_socket(raw_socket);\n\n                if let Some(config) = tls {\n                    let (acceptor, acceptor_rx) = tls_config_reloader(config);\n                    let listener = TlsListener::new(acceptor, addr, acceptor_rx);\n                    let server =\n                        hyper::Server::builder(listener).serve(IntoMakeService::new(service));\n\n                    tracing::trace!(\"started tls hyper server from shared socket\");\n                    // Run forever-ish...\n                    if let Err(err) = server.await {\n                        tracing::error!(error = ?err, \"server error\");\n                    }\n                } else {\n                    let server = hyper::Server::builder(addr).serve(IntoMakeService::new(service));\n\n                    tracing::trace!(\"started hyper server from shared socket\");\n                    // Run forever-ish...\n                    if let Err(err) = server.await {\n                        tracing::error!(error = ?err, \"server error\");\n                    }\n                }\n            });\n        });\n        // Block on the event loop forever.\n        tracing::trace!(\"run and block on the python event loop until a signal is received\");\n        event_loop.call_method0(\"run_forever\")?;\n        Ok(())\n    }\n\n    /// Register a Python function to be executed inside the Smithy Rust handler.\n    ///\n    /// There are some information needed to execute the Python code from a Rust handler,\n    /// such has if the registered function needs to be awaited (if it is a coroutine) and\n    /// the number of arguments available, which tells us if the handler wants the state to be\n    /// passed or not.\n    fn register_operation(&mut self, py: Python, name: &str, func: PyObject) -> PyResult<()> {\n        let func_metadata = func_metadata(py, &func)?;\n        let handler = PyHandler {\n            func,\n            is_coroutine: func_metadata.is_coroutine,\n            args: func_metadata.num_args,\n        };\n        tracing::info!(\n            name,\n            is_coroutine = handler.is_coroutine,\n            args = handler.args,\n            \"registering handler function\",\n        );\n        // Insert the handler in the handlers map.\n        self.handlers().insert(name.to_string(), handler);\n        Ok(())\n    }\n\n    /// Configure the Python asyncio event loop.\n    ///\n    /// First of all we install [uvloop] as the main Python event loop. Thanks to libuv, uvloop\n    /// performs ~20% better than Python standard event loop in most benchmarks, while being 100%\n    /// compatible. If [uvloop] is not available as a dependency, we just fall back to the standard\n    /// Python event loop.\n    ///\n    /// [uvloop]: https://github.com/MagicStack/uvloop\n    fn configure_python_event_loop<'py>(&self, py: Python<'py>) -> PyResult<&'py PyAny> {\n        let asyncio = py.import(\"asyncio\")?;\n        match py.import(\"uvloop\") {\n            Ok(uvloop) => {\n                uvloop.call_method0(\"install\")?;\n                tracing::trace!(\"setting up uvloop for current process\");\n            }\n            Err(_) => {\n                tracing::warn!(\"uvloop not found, using python standard event loop, which could have worse performance than uvloop\");\n            }\n        }\n        let event_loop = asyncio.call_method0(\"new_event_loop\")?;\n        asyncio.call_method1(\"set_event_loop\", (event_loop,))?;\n        Ok(event_loop)\n    }\n\n    /// Main entrypoint: start the server on multiple workers.\n    ///\n    /// The multiprocessing server is achieved using the ability of a Python interpreter\n    /// to clone and start itself as a new process.\n    /// The shared sockets is created and Using the [multiprocessing::Process] module, multiple\n    /// workers with the method `self.start_worker()` as target are started.\n    ///\n    /// NOTE: this method ends up calling `self.start_worker` from the Python context, forcing\n    /// the struct implementing this trait to also implement a `start_worker` method.\n    /// This is done to ensure the Python event loop is started in the right child process space before being\n    /// passed to `start_hyper_worker`.\n    ///\n    /// `PythonApplicationGenerator.kt` generates the `start_worker` method:\n    ///\n    /// ```no_run\n    ///     use std::convert::Infallible;\n    ///     use std::collections::HashMap;\n    ///     use pyo3::prelude::*;\n    ///     use aws_smithy_http_server_python::{PyApp, PyHandler};\n    ///     use aws_smithy_legacy_http_server::body::{Body, BoxBody};\n    ///     use parking_lot::Mutex;\n    ///     use http::{Request, Response};\n    ///     use tower::util::BoxCloneService;\n    ///\n    ///     #[pyclass]\n    ///     #[derive(Debug, Clone)]\n    ///     pub struct App {};\n    ///\n    ///     impl PyApp for App {\n    ///         fn workers(&self) -> &Mutex<Vec<PyObject>> { todo!() }\n    ///         fn context(&self) -> &Option<PyObject> { todo!() }\n    ///         fn handlers(&mut self) -> &mut HashMap<String, PyHandler> { todo!() }\n    ///         fn build_service(&mut self, event_loop: &PyAny) -> PyResult<BoxCloneService<Request<Body>, Response<BoxBody>, Infallible>> { todo!() }\n    ///     }\n    ///\n    ///     #[pymethods]\n    ///     impl App {\n    ///     #[pyo3(text_signature = \"($self, socket, worker_number, tls)\")]\n    ///         pub fn start_worker(\n    ///             &mut self,\n    ///             py: pyo3::Python,\n    ///             socket: &pyo3::PyCell<aws_smithy_http_server_python::PySocket>,\n    ///             worker_number: isize,\n    ///             tls: Option<aws_smithy_http_server_python::tls::PyTlsConfig>,\n    ///         ) -> pyo3::PyResult<()> {\n    ///             let event_loop = self.configure_python_event_loop(py)?;\n    ///             let service = self.build_service(event_loop)?;\n    ///             self.start_hyper_worker(py, socket, event_loop, service, worker_number, tls)\n    ///         }\n    ///     }\n    /// ```\n    ///\n    /// [multiprocessing::Process]: https://docs.python.org/3/library/multiprocessing.html\n    fn run_server(\n        &mut self,\n        py: Python,\n        address: Option<String>,\n        port: Option<i32>,\n        backlog: Option<i32>,\n        workers: Option<usize>,\n        tls: Option<PyTlsConfig>,\n    ) -> PyResult<()> {\n        // Setup multiprocessing environment, allowing connections and socket\n        // sharing between processes.\n        let mp = py.import(\"multiprocessing\")?;\n        // https://github.com/python/cpython/blob/f4c03484da59049eb62a9bf7777b963e2267d187/Lib/multiprocessing/context.py#L164\n        mp.call_method0(\"allow_connection_pickling\")?;\n\n        // Starting from Python 3.8, on macOS, the spawn start method is now the default. See bpo-33725.\n        // This forces the `PyApp` class to be pickled when it is shared between different process,\n        // which is currently not supported by PyO3 classes.\n        //\n        // Forcing the multiprocessing start method to fork is a workaround for it.\n        // https://github.com/pytest-dev/pytest-flask/issues/104#issuecomment-577908228\n        #[cfg(target_os = \"macos\")]\n        mp.call_method(\n            \"set_start_method\",\n            (\"fork\",),\n            // We need to pass `force=True` to prevent `context has already been set` exception,\n            // see https://github.com/pytorch/pytorch/issues/3492\n            Some(vec![(\"force\", true)].into_py_dict(py)),\n        )?;\n\n        let address = address.unwrap_or_else(|| String::from(\"127.0.0.1\"));\n        let port = port.unwrap_or(13734);\n        let socket = PySocket::new(address, port, backlog)?;\n        // Lock the workers mutex.\n        let mut active_workers = self.workers().lock();\n        // Register the main signal handler.\n        // TODO(move from num_cpus to thread::available_parallelism after MSRV is 1.60)\n        // Start all the workers as new Python processes and store the in the `workers` attribute.\n        for idx in 1..workers.unwrap_or_else(num_cpus::get) + 1 {\n            let sock = socket.try_clone()?;\n            let tls = tls.clone();\n            let process = mp.getattr(\"Process\")?;\n            let handle = process.call1((\n                py.None(),\n                self.clone().into_py(py).getattr(py, \"start_worker\")?,\n                format!(\"smithy-rs-worker[{idx}]\"),\n                (sock.into_py(py), idx, tls.into_py(py)),\n            ))?;\n            handle.call_method0(\"start\")?;\n            active_workers.push(handle.to_object(py));\n        }\n        // Unlock the workers mutex.\n        drop(active_workers);\n        tracing::trace!(\"rust python server started successfully\");\n        self.block_on_rust_signals();\n        Ok(())\n    }\n\n    /// Lambda main entrypoint: start the handler on Lambda.\n    fn run_lambda_handler(&mut self, py: Python) -> PyResult<()> {\n        use aws_smithy_legacy_http_server::routing::LambdaHandler;\n\n        let event_loop = self.configure_python_event_loop(py)?;\n        // Register signals on the Python event loop.\n        self.register_python_signals(py, event_loop.to_object(py))?;\n\n        let service = self.build_and_configure_service(py, event_loop)?;\n\n        // Spawn a new background [std::thread] to run the application.\n        // This is needed because `asyncio` doesn't work properly if it doesn't control the main thread.\n        // At the end of this function you can see we are calling `event_loop.run_forever()` to\n        // yield execution of main thread to `asyncio` runtime.\n        // For more details: https://docs.rs/pyo3-asyncio/latest/pyo3_asyncio/#pythons-event-loop-and-the-main-thread\n        tracing::trace!(\"start the tokio runtime in a background task\");\n        thread::spawn(move || {\n            let rt = runtime::Builder::new_multi_thread()\n                .enable_all()\n                .build()\n                .expect(\"unable to start a new tokio runtime for this process\");\n            rt.block_on(async move {\n                let handler = LambdaHandler::new(service);\n                let lambda = lambda_http::run(handler);\n                tracing::debug!(\"starting lambda handler\");\n                if let Err(err) = lambda.await {\n                    tracing::error!(error = %err, \"unable to start lambda handler\");\n                }\n            });\n        });\n        // Block on the event loop forever.\n        tracing::trace!(\"run and block on the python event loop until a signal is received\");\n        event_loop.call_method0(\"run_forever\")?;\n        Ok(())\n    }\n\n    // Builds the `Service` and adds necessary layers to it.\n    fn build_and_configure_service(\n        &mut self,\n        py: Python,\n        event_loop: &pyo3::PyAny,\n    ) -> pyo3::PyResult<Service> {\n        let service = self.build_service(event_loop)?;\n        let context = PyContext::new(self.context().clone().unwrap_or_else(|| py.None()))?;\n        let service = ServiceBuilder::new()\n            .boxed_clone()\n            .layer(AddPyContextLayer::new(context))\n            .service(service);\n        Ok(service)\n    }\n}\n\nfn addr_incoming_from_socket(socket: Socket) -> AddrIncoming {\n    let std_listener: StdTcpListener = socket.into();\n    // StdTcpListener::from_std doesn't set O_NONBLOCK\n    std_listener\n        .set_nonblocking(true)\n        .expect(\"unable to set `O_NONBLOCK=true` on `std::net::TcpListener`\");\n    let listener = TcpListener::from_std(std_listener)\n        .expect(\"unable to create `tokio::net::TcpListener` from `std::net::TcpListener`\");\n    AddrIncoming::from_listener(listener)\n        .expect(\"unable to create `AddrIncoming` from `TcpListener`\")\n}\n\n// Builds `TlsAcceptor` from given `config` and also creates a background task\n// to reload certificates and returns a channel to receive new `TlsAcceptor`s.\nfn tls_config_reloader(config: PyTlsConfig) -> (TlsAcceptor, mpsc::Receiver<TlsAcceptor>) {\n    let reload_dur = config.reload_duration();\n    let (tx, rx) = mpsc::channel();\n    let acceptor = TlsAcceptor::from(Arc::new(config.build().expect(\"invalid tls config\")));\n\n    tokio::spawn(async move {\n        tracing::trace!(dur = ?reload_dur, \"starting timer to reload tls config\");\n        loop {\n            tokio::time::sleep(reload_dur).await;\n            tracing::trace!(\"reloading tls config\");\n            match config.build() {\n                Ok(config) => {\n                    let new_config = TlsAcceptor::from(Arc::new(config));\n                    // Note on expect: `tx.send` can only fail if the receiver is dropped,\n                    // it probably a bug if that happens\n                    tx.send(new_config).expect(\"could not send new tls config\")\n                }\n                Err(err) => {\n                    tracing::error!(error = ?err, \"could not reload tls config because it is invalid\");\n                }\n            }\n        }\n    });\n\n    (acceptor, rx)\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server-python/src/socket.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Socket implementation that can be shared between multiple Python processes.\n\n#![allow(non_local_definitions)]\n\nuse pyo3::prelude::*;\n\nuse socket2::{Domain, Protocol, Socket, Type};\nuse std::net::SocketAddr;\n\n/// Socket implementation that can be shared between multiple Python processes.\n///\n/// Python cannot handle true multi-threaded applications due to the [GIL],\n/// often resulting in reduced performance and only one core used by the application.\n/// To work around this, Python web applications usually create a socket with\n/// SO_REUSEADDR and SO_REUSEPORT enabled that can be shared between multiple\n/// Python processes, allowing you to maximize performance and use all available\n/// computing capacity of the host.\n///\n/// [GIL]: https://wiki.python.org/moin/GlobalInterpreterLock\n///\n/// :param address str:\n/// :param port int:\n/// :param backlog typing.Optional\\[int\\]:\n/// :rtype None:\n#[pyclass]\n#[derive(Debug)]\npub struct PySocket {\n    pub(crate) inner: Socket,\n}\n\n#[pymethods]\nimpl PySocket {\n    /// Create a new UNIX `SharedSocket` from an address, port and backlog.\n    /// If not specified, the backlog defaults to 1024 connections.\n    #[pyo3(text_signature = \"($self, address, port, backlog=None)\")]\n    #[new]\n    pub fn new(address: String, port: i32, backlog: Option<i32>) -> PyResult<Self> {\n        let address: SocketAddr = format!(\"{address}:{port}\").parse()?;\n        let (domain, ip_version) = PySocket::socket_domain(address);\n        tracing::trace!(address = %address, ip_version, \"shared socket listening\");\n        let socket = Socket::new(domain, Type::STREAM, Some(Protocol::TCP))?;\n        // Set value for the `SO_REUSEPORT` and `SO_REUSEADDR` options on this socket.\n        // This indicates that further calls to `bind` may allow reuse of local\n        // addresses. For IPv4 sockets this means that a socket may bind even when\n        // there's a socket already listening on this port.\n        socket.set_reuse_port(true)?;\n        socket.set_reuse_address(true)?;\n        socket.bind(&address.into())?;\n        socket.listen(backlog.unwrap_or(1024))?;\n        Ok(PySocket { inner: socket })\n    }\n\n    /// Clone the inner socket allowing it to be shared between multiple\n    /// Python processes.\n    ///\n    /// :rtype PySocket:\n    pub fn try_clone(&self) -> PyResult<PySocket> {\n        let copied = self.inner.try_clone()?;\n        Ok(PySocket { inner: copied })\n    }\n}\n\nimpl PySocket {\n    /// Get a cloned inner socket.\n    pub fn get_socket(&self) -> Result<Socket, std::io::Error> {\n        self.inner.try_clone()\n    }\n\n    /// Find the socket domain\n    fn socket_domain(address: SocketAddr) -> (Domain, &'static str) {\n        if address.is_ipv6() {\n            (Domain::IPV6, \"6\")\n        } else {\n            (Domain::IPV4, \"4\")\n        }\n    }\n}\n\n#[cfg(test)]\n// `is_listener` on `Socket` is only available on certain platforms.\n// In particular, this fails to compile on MacOS.\n#[cfg(any(\n    target_os = \"android\",\n    target_os = \"freebsd\",\n    target_os = \"fuchsia\",\n    target_os = \"linux\",\n))]\nmod tests {\n    use super::*;\n\n    #[test]\n    fn socket_can_bind_on_random_port() {\n        let socket = PySocket::new(\"127.0.0.1\".to_owned(), 0, None).unwrap();\n        assert!(socket.inner.is_listener().is_ok());\n    }\n\n    #[test]\n    fn socket_can_be_cloned() {\n        let socket = PySocket::new(\"127.0.0.1\".to_owned(), 0, None).unwrap();\n        let cloned_socket = socket.try_clone().unwrap();\n        assert!(cloned_socket.inner.is_listener().is_ok());\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server-python/src/tls/listener.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::pin::Pin;\nuse std::sync::mpsc;\nuse std::task::{Context, Poll};\n\nuse futures::{ready, Stream};\nuse hyper::server::accept::Accept;\nuse pin_project_lite::pin_project;\nuse tls_listener::{AsyncAccept, AsyncTls, Error as TlsListenerError, TlsListener};\n\npin_project! {\n    /// A wrapper around [TlsListener] that allows changing TLS config via a channel\n    /// and ignores incorrect connections (they cause Hyper server to shutdown otherwise).\n    pub struct Listener<A: AsyncAccept, T: AsyncTls<A::Connection>> {\n        #[pin]\n        inner: TlsListener<A, T>,\n        new_acceptor_rx: mpsc::Receiver<T>,\n    }\n}\n\nimpl<A: AsyncAccept, T: AsyncTls<A::Connection>> Listener<A, T> {\n    pub fn new(tls: T, listener: A, new_acceptor_rx: mpsc::Receiver<T>) -> Self {\n        Self {\n            inner: TlsListener::new(tls, listener),\n            new_acceptor_rx,\n        }\n    }\n}\n\nimpl<A, T> Accept for Listener<A, T>\nwhere\n    A: AsyncAccept,\n    A::Error: std::error::Error,\n    T: AsyncTls<A::Connection>,\n{\n    type Conn = T::Stream;\n    type Error = A::Error;\n\n    fn poll_accept(\n        mut self: Pin<&mut Self>,\n        cx: &mut Context<'_>,\n    ) -> Poll<Option<Result<Self::Conn, Self::Error>>> {\n        // Replace current acceptor (it also contains TLS config) if there is a new one\n        if let Ok(acceptor) = self.new_acceptor_rx.try_recv() {\n            self.as_mut().project().inner.replace_acceptor_pin(acceptor);\n        }\n\n        loop {\n            match ready!(self.as_mut().project().inner.poll_next(cx)) {\n                Some(Ok(conn)) => return Poll::Ready(Some(Ok(conn))),\n                Some(Err(TlsListenerError::ListenerError(err))) => {\n                    return Poll::Ready(Some(Err(err)))\n                }\n                Some(Err(TlsListenerError::TlsAcceptError(err))) => {\n                    // Don't propogate TLS handshake errors to Hyper because it causes server to shutdown\n                    tracing::debug!(error = ?err, \"tls handshake error\");\n                }\n                None => return Poll::Ready(None),\n            }\n        }\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use std::io;\n    use std::net::SocketAddr;\n    use std::pin::Pin;\n    use std::sync::{mpsc, Arc};\n    use std::task::{Context, Poll};\n    use std::thread;\n\n    use futures::ready;\n    use hyper::server::conn::{AddrIncoming, AddrStream};\n    use hyper::service::{make_service_fn, service_fn};\n    use hyper::{Body, Client, Error, Response, Server, Uri};\n    use hyper_rustls::HttpsConnectorBuilder;\n    use pin_project_lite::pin_project;\n    use tls_listener::AsyncAccept;\n    use tokio_rustls::{\n        rustls::{Certificate, ClientConfig, PrivateKey, RootCertStore, ServerConfig},\n        TlsAcceptor,\n    };\n\n    use super::Listener;\n\n    enum DummyListenerMode {\n        // Pass connection from inner `AddrIncoming` without any modification\n        Identity,\n        // Fail after accepting a connection from inner `AddrIncoming`\n        Fail,\n    }\n\n    pin_project! {\n        // A listener for testing that uses inner `AddrIncoming` to accept connections\n        // and depending on the mode it either returns that connection or fails.\n        struct DummyListener {\n            #[pin]\n            inner: AddrIncoming,\n            mode: DummyListenerMode,\n        }\n    }\n\n    impl AsyncAccept for DummyListener {\n        type Connection = AddrStream;\n        type Error = io::Error;\n\n        fn poll_accept(\n            self: Pin<&mut Self>,\n            cx: &mut Context<'_>,\n        ) -> Poll<Option<Result<Self::Connection, Self::Error>>> {\n            let this = self.project();\n            let conn = match ready!(this.inner.poll_accept(cx)) {\n                Some(Ok(conn)) => conn,\n                Some(Err(err)) => return Poll::Ready(Some(Err(err))),\n                None => return Poll::Ready(None),\n            };\n\n            match &this.mode {\n                DummyListenerMode::Identity => Poll::Ready(Some(Ok(conn))),\n                DummyListenerMode::Fail => {\n                    Poll::Ready(Some(Err(io::ErrorKind::ConnectionAborted.into())))\n                }\n            }\n        }\n    }\n\n    #[tokio::test]\n    async fn server_doesnt_shutdown_after_bad_handshake() {\n        let (_new_acceptor_tx, new_acceptor_rx) = mpsc::channel();\n        let cert = valid_cert();\n        let acceptor = acceptor_from_cert(&cert);\n        let (addr, _) = server(acceptor, new_acceptor_rx, DummyListenerMode::Identity);\n\n        {\n            // Here client only trusts the `different_cert` and fails for any other certificate even though they are valid\n            let different_cert = valid_cert();\n            let config = client_config_with_cert(&different_cert);\n            let response = make_req(config, &addr).await;\n            assert!(response\n                .unwrap_err()\n                .to_string()\n                .contains(\"invalid peer certificate\"));\n        }\n\n        {\n            // Now use the same cert and it should succeed\n            let config = client_config_with_cert(&cert);\n            let response = make_req(config, &addr).await.unwrap();\n            assert_eq!(\n                \"hello world\",\n                hyper::body::to_bytes(response.into_body()).await.unwrap()\n            );\n        }\n    }\n\n    #[tokio::test]\n    #[should_panic(expected = \"server error: error accepting connection: connection aborted\")]\n    async fn server_shutdown_after_listener_error() {\n        let (_new_acceptor_tx, new_acceptor_rx) = mpsc::channel();\n        let cert = valid_cert();\n        let acceptor = acceptor_from_cert(&cert);\n        let (addr, server_thread_handle) =\n            server(acceptor, new_acceptor_rx, DummyListenerMode::Fail);\n\n        // Here server should get an error from listener\n        let config = client_config_with_cert(&cert);\n        let _ = make_req(config, &addr).await;\n\n        // Since we are just panicking in our test server, we just need to propogate that panic\n        // and `should_panic` will make sure it is the panic message we are expecting\n        std::panic::resume_unwind(server_thread_handle.join().unwrap_err());\n    }\n\n    #[tokio::test]\n    async fn server_changes_tls_config() {\n        let (new_acceptor_tx, new_acceptor_rx) = mpsc::channel();\n\n        let invalid_cert = cert_with_invalid_date();\n        let acceptor = acceptor_from_cert(&invalid_cert);\n        let (addr, _) = server(acceptor, new_acceptor_rx, DummyListenerMode::Identity);\n\n        {\n            // We have a certificate with invalid date, so request should fail\n            let config = client_config_with_cert(&invalid_cert);\n            let response = make_req(config, &addr).await;\n            assert!(response\n                .unwrap_err()\n                .to_string()\n                .contains(\"invalid peer certificate: Expired\"));\n        }\n\n        // Make a new acceptor with a valid cert and replace\n        let cert = valid_cert();\n        let acceptor = acceptor_from_cert(&cert);\n        tokio::spawn(async move {\n            new_acceptor_tx.send(acceptor).unwrap();\n        });\n\n        {\n            // Now it should succeed\n            let config = client_config_with_cert(&cert);\n            let response = make_req(config, &addr).await.unwrap();\n            assert_eq!(\n                \"hello world\",\n                hyper::body::to_bytes(response.into_body()).await.unwrap()\n            );\n        }\n    }\n\n    fn client_config_with_cert(cert: &rcgen::Certificate) -> ClientConfig {\n        let mut roots = RootCertStore::empty();\n        roots.add_parsable_certificates(&[cert.serialize_der().unwrap()]);\n        ClientConfig::builder()\n            .with_safe_defaults()\n            .with_root_certificates(roots)\n            .with_no_client_auth()\n    }\n\n    fn cert_with_invalid_date() -> rcgen::Certificate {\n        let mut params = rcgen::CertificateParams::new(vec![\"localhost\".to_string()]);\n        params.not_after = rcgen::date_time_ymd(1970, 1, 1);\n        rcgen::Certificate::from_params(params).unwrap()\n    }\n\n    fn valid_cert() -> rcgen::Certificate {\n        let params = rcgen::CertificateParams::new(vec![\"localhost\".to_string()]);\n        rcgen::Certificate::from_params(params).unwrap()\n    }\n\n    fn acceptor_from_cert(cert: &rcgen::Certificate) -> TlsAcceptor {\n        TlsAcceptor::from(Arc::new(\n            ServerConfig::builder()\n                .with_safe_defaults()\n                .with_no_client_auth()\n                .with_single_cert(\n                    vec![Certificate(cert.serialize_der().unwrap())],\n                    PrivateKey(cert.serialize_private_key_der()),\n                )\n                .unwrap(),\n        ))\n    }\n\n    fn server(\n        acceptor: TlsAcceptor,\n        new_acceptor_rx: mpsc::Receiver<TlsAcceptor>,\n        dummy_listener_mode: DummyListenerMode,\n    ) -> (SocketAddr, thread::JoinHandle<()>) {\n        let addr = ([127, 0, 0, 1], 0).into();\n        let (addr_tx, addr_rx) = mpsc::channel();\n\n        let handle = thread::spawn(move || {\n            tokio_test::block_on(async move {\n                let incoming = AddrIncoming::bind(&addr).unwrap();\n                addr_tx.send(incoming.local_addr()).unwrap();\n\n                let incoming = DummyListener {\n                    inner: incoming,\n                    mode: dummy_listener_mode,\n                };\n\n                let listener = Listener::new(acceptor, incoming, new_acceptor_rx);\n\n                let make_svc = make_service_fn(|_| async {\n                    Ok::<_, Error>(service_fn(|_req| async {\n                        Ok::<_, Error>(Response::new(Body::from(\"hello world\")))\n                    }))\n                });\n                let server = Server::builder(listener).serve(make_svc);\n                if let Err(err) = server.await {\n                    panic!(\"server error: {err}\");\n                }\n            });\n        });\n\n        (addr_rx.recv().unwrap(), handle)\n    }\n\n    async fn make_req(\n        config: ClientConfig,\n        addr: &SocketAddr,\n    ) -> Result<Response<Body>, hyper::Error> {\n        let connector = HttpsConnectorBuilder::new()\n            .with_tls_config(config)\n            .https_only()\n            .enable_http2()\n            .build();\n\n        let client = Client::builder().build::<_, Body>(connector);\n        client\n            .get(\n                Uri::builder()\n                    .scheme(\"https\")\n                    .authority(format!(\"localhost:{}\", addr.port()))\n                    .path_and_query(\"/\")\n                    .build()\n                    .unwrap(),\n            )\n            .await\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server-python/src/tls.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! TLS related types for Python.\n//!\n//! [PyTlsConfig] implementation is mostly borrowed from:\n//! <https://github.com/seanmonstar/warp/blob/4e9c4fd6ce238197fd1088061bbc07fa2852cb0f/src/tls.rs>\n\n#![allow(non_local_definitions)]\n\nuse std::fs::File;\nuse std::io::{self, BufReader, Read};\nuse std::path::PathBuf;\nuse std::time::Duration;\n\nuse pyo3::{pyclass, pymethods};\nuse thiserror::Error;\nuse tokio_rustls::rustls::{Certificate, Error as RustTlsError, PrivateKey, ServerConfig};\n\npub mod listener;\n\n/// PyTlsConfig represents TLS configuration created from Python.\n///\n/// :param key_path pathlib.Path:\n/// :param cert_path pathlib.Path:\n/// :param reload_secs int:\n/// :rtype None:\n#[pyclass(name = \"TlsConfig\")]\n#[derive(Clone)]\npub struct PyTlsConfig {\n    /// Absolute path of the RSA or PKCS private key.\n    ///\n    /// :type pathlib.Path:\n    key_path: PathBuf,\n\n    /// Absolute path of the x509 certificate.\n    ///\n    /// :type pathlib.Path:\n    cert_path: PathBuf,\n\n    /// Duration to reloading certificates.\n    ///\n    /// :type int:\n    reload_secs: u64,\n}\n\nimpl PyTlsConfig {\n    /// Build [ServerConfig] from [PyTlsConfig].\n    pub fn build(&self) -> Result<ServerConfig, PyTlsConfigError> {\n        let cert_chain = self.cert_chain()?;\n        let key_der = self.key_der()?;\n        let mut config = ServerConfig::builder()\n            .with_safe_defaults()\n            .with_no_client_auth()\n            .with_single_cert(cert_chain, key_der)?;\n        config.alpn_protocols = vec![\"h2\".into(), \"http/1.1\".into()];\n        Ok(config)\n    }\n\n    /// Returns reload duration.\n    pub fn reload_duration(&self) -> Duration {\n        Duration::from_secs(self.reload_secs)\n    }\n\n    /// Reads certificates from `cert_path`.\n    fn cert_chain(&self) -> Result<Vec<Certificate>, PyTlsConfigError> {\n        let file = File::open(&self.cert_path).map_err(PyTlsConfigError::CertParse)?;\n        let mut cert_rdr = BufReader::new(file);\n        Ok(rustls_pemfile::certs(&mut cert_rdr)\n            .map_err(PyTlsConfigError::CertParse)?\n            .into_iter()\n            .map(Certificate)\n            .collect())\n    }\n\n    /// Parses RSA or PKCS private key from `key_path`.\n    fn key_der(&self) -> Result<PrivateKey, PyTlsConfigError> {\n        let mut key_vec = Vec::new();\n        File::open(&self.key_path)\n            .and_then(|mut f| f.read_to_end(&mut key_vec))\n            .map_err(PyTlsConfigError::KeyParse)?;\n        if key_vec.is_empty() {\n            return Err(PyTlsConfigError::EmptyKey);\n        }\n\n        let mut pkcs8 = rustls_pemfile::pkcs8_private_keys(&mut key_vec.as_slice())\n            .map_err(PyTlsConfigError::Pkcs8Parse)?;\n        if !pkcs8.is_empty() {\n            return Ok(PrivateKey(pkcs8.remove(0)));\n        }\n\n        let mut rsa = rustls_pemfile::rsa_private_keys(&mut key_vec.as_slice())\n            .map_err(PyTlsConfigError::RsaParse)?;\n        if !rsa.is_empty() {\n            return Ok(PrivateKey(rsa.remove(0)));\n        }\n\n        Err(PyTlsConfigError::EmptyKey)\n    }\n}\n\n#[pymethods]\nimpl PyTlsConfig {\n    #[new]\n    #[pyo3(text_signature = \"($self, *, key_path, cert_path, reload_secs=86400)\")]\n    #[pyo3(signature = (key_path, cert_path, reload_secs=86400))]\n    fn py_new(key_path: PathBuf, cert_path: PathBuf, reload_secs: u64) -> Self {\n        // TODO(BugOnUpstream): `reload: &PyDelta` segfaults, create an issue on PyO3\n        Self {\n            key_path,\n            cert_path,\n            reload_secs,\n        }\n    }\n}\n\n/// Possible TLS configuration errors.\n#[derive(Error, Debug)]\npub enum PyTlsConfigError {\n    #[error(\"could not parse certificate\")]\n    CertParse(io::Error),\n    #[error(\"could not parse key\")]\n    KeyParse(io::Error),\n    #[error(\"empty key\")]\n    EmptyKey,\n    #[error(\"could not parse pkcs8 keys\")]\n    Pkcs8Parse(io::Error),\n    #[error(\"could not parse rsa keys\")]\n    RsaParse(io::Error),\n    #[error(\"rusttls protocol error\")]\n    RustTlsError(#[from] RustTlsError),\n}\n\n#[cfg(test)]\nmod tests {\n    use std::str::FromStr;\n\n    use pyo3::{\n        prelude::*,\n        types::{IntoPyDict, PyDict},\n    };\n\n    use super::*;\n\n    const TEST_KEY: &str = concat!(\n        env!(\"CARGO_MANIFEST_DIR\"),\n        \"/../../examples/python/pokemon-service-test/tests/testdata/localhost.key\"\n    );\n    const TEST_CERT: &str = concat!(\n        env!(\"CARGO_MANIFEST_DIR\"),\n        \"/../../examples/python/pokemon-service-test/tests/testdata/localhost.crt\"\n    );\n\n    #[test]\n    fn creating_tls_config_in_python() -> PyResult<()> {\n        pyo3::prepare_freethreaded_python();\n\n        let config = Python::with_gil(|py| {\n            let globals = [\n                (\"TEST_CERT\", TEST_CERT.to_object(py)),\n                (\"TEST_KEY\", TEST_KEY.to_object(py)),\n                (\"TlsConfig\", py.get_type::<PyTlsConfig>().to_object(py)),\n            ]\n            .into_py_dict(py);\n            let locals = PyDict::new(py);\n            py.run(\n                r#\"\nconfig = TlsConfig(key_path=TEST_KEY, cert_path=TEST_CERT, reload_secs=1000)\n\"#,\n                Some(globals),\n                Some(locals),\n            )?;\n            locals\n                .get_item(\"config\")\n                .expect(\"Python exception occurred during dictionary lookup\")\n                .unwrap()\n                .extract::<PyTlsConfig>()\n        })?;\n\n        assert_eq!(PathBuf::from_str(TEST_KEY).unwrap(), config.key_path);\n        assert_eq!(PathBuf::from_str(TEST_CERT).unwrap(), config.cert_path);\n        assert_eq!(1000, config.reload_secs);\n\n        // Make sure build succeeds\n        config.build().unwrap();\n\n        Ok(())\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server-python/src/types.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Python wrapped types from aws-smithy-types.\n//!\n//! ## `Deref` hacks for Json serializer\n//! [aws_smithy_json::serialize::JsonValueWriter] expects references to the types\n//! from [aws_smithy_types] (for example [aws_smithy_json::serialize::JsonValueWriter::document()]\n//! expects `&aws_smithy_types::Document`). In order to make\n//! [aws_smithy_json::serialize::JsonValueWriter] happy, we implement `Deref` traits for\n//! Python types to their Rust counterparts (for example\n//! `impl Deref<Target=aws_smithy_types::Document> for Document` and that allows `&Document` to\n//! get coerced to `&aws_smithy_types::Document`). This is a hack, we should ideally handle this\n//! in `JsonSerializerGenerator.kt` but it's not easy to do it with our current Kotlin structure.\n\n#![allow(non_local_definitions)]\n\nuse std::{\n    collections::HashMap,\n    future::Future,\n    ops::Deref,\n    pin::Pin,\n    sync::Arc,\n    task::{Context, Poll},\n};\n\nuse bytes::Bytes;\nuse pyo3::{\n    exceptions::{PyRuntimeError, PyStopAsyncIteration, PyTypeError},\n    iter::IterNextOutput,\n    prelude::*,\n};\nuse tokio::{runtime::Handle, sync::Mutex};\n\nuse crate::PyError;\n\n/// Python Wrapper for [aws_smithy_types::Blob].\n///\n/// :param input bytes:\n/// :rtype None:\n#[pyclass]\n#[derive(Debug, Clone, PartialEq, Eq, Hash)]\npub struct Blob(aws_smithy_types::Blob);\n\nimpl Blob {\n    /// Creates a new blob from the given `input`.\n    pub fn new<T: Into<Vec<u8>>>(input: T) -> Self {\n        Self(aws_smithy_types::Blob::new(input))\n    }\n\n    /// Consumes the `Blob` and returns a `Vec<u8>` with its contents.\n    pub fn into_inner(self) -> Vec<u8> {\n        self.0.into_inner()\n    }\n}\n\nimpl AsRef<[u8]> for Blob {\n    fn as_ref(&self) -> &[u8] {\n        self.0.as_ref()\n    }\n}\n\n#[pymethods]\nimpl Blob {\n    /// Create a new Python instance of `Blob`.\n    #[new]\n    pub fn pynew(input: Vec<u8>) -> Self {\n        Self(aws_smithy_types::Blob::new(input))\n    }\n\n    /// Python getter for the `Blob` byte array.\n    ///\n    /// :type bytes:\n    #[getter(data)]\n    pub fn get_data(&self) -> &[u8] {\n        self.as_ref()\n    }\n\n    /// Python setter for the `Blob` byte array.\n    #[setter(data)]\n    pub fn set_data(&mut self, data: Vec<u8>) {\n        *self = Self::pynew(data);\n    }\n}\n\nimpl From<aws_smithy_types::Blob> for Blob {\n    fn from(other: aws_smithy_types::Blob) -> Blob {\n        Blob(other)\n    }\n}\n\nimpl From<Blob> for aws_smithy_types::Blob {\n    fn from(other: Blob) -> aws_smithy_types::Blob {\n        other.0\n    }\n}\n\nimpl<'blob> From<&'blob Blob> for &'blob aws_smithy_types::Blob {\n    fn from(other: &'blob Blob) -> &'blob aws_smithy_types::Blob {\n        &other.0\n    }\n}\n\n/// Python Wrapper for [aws_smithy_types::BigInteger].\n#[pyclass]\n#[derive(Debug, Clone, PartialEq, Eq, Hash)]\npub struct BigInteger(aws_smithy_types::BigInteger);\n\n#[pymethods]\nimpl BigInteger {\n    #[new]\n    pub fn pynew(value: String) -> PyResult<Self> {\n        value\n            .parse()\n            .map(Self)\n            .map_err(|e| PyTypeError::new_err(format!(\"{e}\")))\n    }\n\n    #[getter(value)]\n    pub fn get_value(&self) -> &str {\n        self.0.as_ref()\n    }\n}\n\nimpl AsRef<str> for BigInteger {\n    fn as_ref(&self) -> &str {\n        self.0.as_ref()\n    }\n}\n\nimpl From<aws_smithy_types::BigInteger> for BigInteger {\n    fn from(other: aws_smithy_types::BigInteger) -> BigInteger {\n        BigInteger(other)\n    }\n}\n\nimpl From<BigInteger> for aws_smithy_types::BigInteger {\n    fn from(other: BigInteger) -> aws_smithy_types::BigInteger {\n        other.0\n    }\n}\n\n/// Python Wrapper for [aws_smithy_types::BigDecimal].\n#[pyclass]\n#[derive(Debug, Clone, PartialEq, Eq, Hash)]\npub struct BigDecimal(aws_smithy_types::BigDecimal);\n\n#[pymethods]\nimpl BigDecimal {\n    #[new]\n    pub fn pynew(value: String) -> PyResult<Self> {\n        value\n            .parse()\n            .map(Self)\n            .map_err(|e| PyTypeError::new_err(format!(\"{e}\")))\n    }\n\n    #[getter(value)]\n    pub fn get_value(&self) -> &str {\n        self.0.as_ref()\n    }\n}\n\nimpl AsRef<str> for BigDecimal {\n    fn as_ref(&self) -> &str {\n        self.0.as_ref()\n    }\n}\n\nimpl From<aws_smithy_types::BigDecimal> for BigDecimal {\n    fn from(other: aws_smithy_types::BigDecimal) -> BigDecimal {\n        BigDecimal(other)\n    }\n}\n\nimpl From<BigDecimal> for aws_smithy_types::BigDecimal {\n    fn from(other: BigDecimal) -> aws_smithy_types::BigDecimal {\n        other.0\n    }\n}\n\n/// Python Wrapper for [aws_smithy_types::date_time::DateTime].\n#[pyclass]\n#[derive(Debug, Clone, PartialEq, Eq, Hash)]\npub struct DateTime(aws_smithy_types::date_time::DateTime);\n\n#[pyclass]\n/// Formats for representing a `DateTime` in the Smithy protocols.\n#[derive(Clone, Copy, Debug, Eq, PartialEq)]\npub enum Format {\n    /// RFC-3339 Date Time.\n    DateTime,\n    /// Date format used by the HTTP `Date` header, specified in RFC-7231.\n    HttpDate,\n    /// Number of seconds since the Unix epoch formatted as a floating point.\n    EpochSeconds,\n}\n\nimpl From<Format> for aws_smithy_types::date_time::Format {\n    fn from(variant: Format) -> aws_smithy_types::date_time::Format {\n        match variant {\n            Format::DateTime => aws_smithy_types::date_time::Format::DateTime,\n            Format::HttpDate => aws_smithy_types::date_time::Format::HttpDate,\n            Format::EpochSeconds => aws_smithy_types::date_time::Format::EpochSeconds,\n        }\n    }\n}\n\nimpl DateTime {\n    /// Formats the `DateTime` to a string using the given `format`.\n    ///\n    /// Returns an error if the given `DateTime` cannot be represented by the desired format.\n    pub fn fmt(\n        &self,\n        format: aws_smithy_types::date_time::Format,\n    ) -> Result<String, aws_smithy_types::date_time::DateTimeFormatError> {\n        self.0.fmt(format)\n    }\n}\n\n/// DateTime in time.\n///\n/// DateTime in time represented as seconds and sub-second nanos since\n/// the Unix epoch (January 1, 1970 at midnight UTC/GMT).\n#[pymethods]\nimpl DateTime {\n    /// Creates a `DateTime` from a number of seconds since the Unix epoch.\n    ///\n    /// :param epoch_seconds int:\n    /// :rtype DateTime:\n    #[staticmethod]\n    pub fn from_secs(epoch_seconds: i64) -> Self {\n        Self(aws_smithy_types::date_time::DateTime::from_secs(\n            epoch_seconds,\n        ))\n    }\n\n    /// Creates a `DateTime` from a number of milliseconds since the Unix epoch.\n    ///\n    /// :param epoch_millis int:\n    /// :rtype DateTime:\n    #[staticmethod]\n    pub fn from_millis(epoch_millis: i64) -> Self {\n        Self(aws_smithy_types::date_time::DateTime::from_secs(\n            epoch_millis,\n        ))\n    }\n\n    /// Creates a `DateTime` from a number of nanoseconds since the Unix epoch.\n    ///\n    /// :param epoch_nanos int:\n    /// :rtype DateTime:\n    #[staticmethod]\n    pub fn from_nanos(epoch_nanos: i128) -> PyResult<Self> {\n        Ok(Self(\n            aws_smithy_types::date_time::DateTime::from_nanos(epoch_nanos)\n                .map_err(PyError::DateTimeConversion)?,\n        ))\n    }\n\n    /// Read 1 date of `format` from `s`, expecting either `delim` or EOF.\n    ///\n    /// TODO(PythonTyping): How do we represent `char` in Python?\n    ///\n    /// :param format Format:\n    /// :param delim str:\n    /// :rtype typing.Tuple[DateTime, str]:\n    #[staticmethod]\n    pub fn read(s: &str, format: Format, delim: char) -> PyResult<(Self, &str)> {\n        let (self_, next) = aws_smithy_types::date_time::DateTime::read(s, format.into(), delim)\n            .map_err(PyError::DateTimeParse)?;\n        Ok((Self(self_), next))\n    }\n\n    /// Creates a `DateTime` from a number of seconds and a fractional second since the Unix epoch.\n    ///\n    /// :param epoch_seconds int:\n    /// :param fraction float:\n    /// :rtype DateTime:\n    #[staticmethod]\n    pub fn from_fractional_secs(epoch_seconds: i64, fraction: f64) -> Self {\n        Self(aws_smithy_types::date_time::DateTime::from_fractional_secs(\n            epoch_seconds,\n            fraction,\n        ))\n    }\n\n    /// Creates a `DateTime` from a number of seconds and sub-second nanos since the Unix epoch.\n    ///\n    /// :param seconds int:\n    /// :param subsecond_nanos int:\n    /// :rtype DateTime:\n    #[staticmethod]\n    pub fn from_secs_and_nanos(seconds: i64, subsecond_nanos: u32) -> Self {\n        Self(aws_smithy_types::date_time::DateTime::from_secs_and_nanos(\n            seconds,\n            subsecond_nanos,\n        ))\n    }\n\n    /// Creates a `DateTime` from an `f64` representing the number of seconds since the Unix epoch.\n    ///\n    /// :param epoch_seconds float:\n    /// :rtype DateTime:\n    #[staticmethod]\n    pub fn from_secs_f64(epoch_seconds: f64) -> Self {\n        Self(aws_smithy_types::date_time::DateTime::from_secs_f64(\n            epoch_seconds,\n        ))\n    }\n\n    /// Parses a `DateTime` from a string using the given `format`.\n    ///\n    /// :param s str:\n    /// :param format Format:\n    /// :rtype DateTime:\n    #[staticmethod]\n    pub fn from_str(s: &str, format: Format) -> PyResult<Self> {\n        Ok(Self(\n            aws_smithy_types::date_time::DateTime::from_str(s, format.into())\n                .map_err(PyError::DateTimeParse)?,\n        ))\n    }\n\n    /// Returns the number of nanoseconds since the Unix epoch that this `DateTime` represents.\n    ///\n    /// :rtype int:\n    pub fn as_nanos(&self) -> i128 {\n        self.0.as_nanos()\n    }\n\n    /// Returns the `DateTime` value as an `f64` representing the seconds since the Unix epoch.\n    ///\n    /// :rtype float:\n    pub fn as_secs_f64(&self) -> f64 {\n        self.0.as_secs_f64()\n    }\n\n    /// Returns true if sub-second nanos is greater than zero.\n    ///\n    /// :rtype bool:\n    pub fn has_subsec_nanos(&self) -> bool {\n        self.0.has_subsec_nanos()\n    }\n\n    /// Returns the epoch seconds component of the `DateTime`.\n    ///\n    /// :rtype int:\n    pub fn secs(&self) -> i64 {\n        self.0.secs()\n    }\n\n    /// Returns the sub-second nanos component of the `DateTime`.\n    ///\n    /// :rtype int:\n    pub fn subsec_nanos(&self) -> u32 {\n        self.0.subsec_nanos()\n    }\n\n    /// Converts the `DateTime` to the number of milliseconds since the Unix epoch.\n    ///\n    /// :rtype int:\n    pub fn to_millis(&self) -> PyResult<i64> {\n        Ok(self.0.to_millis().map_err(PyError::DateTimeConversion)?)\n    }\n}\n\nimpl From<aws_smithy_types::DateTime> for DateTime {\n    fn from(other: aws_smithy_types::DateTime) -> DateTime {\n        DateTime(other)\n    }\n}\n\nimpl From<DateTime> for aws_smithy_types::DateTime {\n    fn from(other: DateTime) -> aws_smithy_types::DateTime {\n        other.0\n    }\n}\n\nimpl Deref for DateTime {\n    type Target = aws_smithy_types::DateTime;\n\n    fn deref(&self) -> &Self::Target {\n        &self.0\n    }\n}\n\n/// Python Wrapper for [aws_smithy_types::byte_stream::ByteStream].\n///\n/// ByteStream provides misuse-resistant primitives to make it easier to handle common patterns with streaming data.\n///\n/// On the Rust side, The Python implementation wraps the original [ByteStream](aws_smithy_types::byte_stream::ByteStream)\n/// in a clonable structure and implements the [Stream](futures::stream::Stream) trait for it to\n/// allow Rust to handle the type transparently.\n///\n/// On the Python side both sync and async iterators are exposed by implementing `__iter__()` and `__aiter__()` magic methods,\n/// which allows to just loop over the stream chunks.\n///\n/// ### Example of async streaming:\n///\n/// ```python\n///     stream = await ByteStream.from_path(\"/tmp/music.mp3\")\n///     async for chunk in stream:\n///         print(chunk)\n/// ```\n///\n/// ### Example of sync streaming:\n///\n/// ```python\n///     stream = ByteStream.from_stream_blocking(\"/tmp/music.mp3\")\n///     for chunk in stream:\n///         print(chunk)\n/// ```\n///\n/// The main difference between the two implementations is that the async one is scheduling the Python coroutines as Rust futures,\n/// effectively maintaining the asyncronous behavior that Rust exposes, while the sync one is blocking the Tokio runtime to be able\n/// to await one chunk at a time.\n///\n/// The original Rust [ByteStream](aws_smithy_types::byte_stream::ByteStream) is wrapped inside a `Arc<Mutex>` to allow the type to be\n/// [Clone] (required by PyO3) and to allow internal mutability, required to fetch the next chunk of data.\n///\n/// :param input bytes:\n/// :rtype None:\n#[pyclass]\n#[derive(Debug, Clone)]\npub struct ByteStream(Arc<Mutex<aws_smithy_types::byte_stream::ByteStream>>);\n\nimpl futures::stream::Stream for ByteStream {\n    type Item = Result<Bytes, aws_smithy_types::byte_stream::error::Error>;\n\n    fn poll_next(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Option<Self::Item>> {\n        let stream = self.0.lock();\n        tokio::pin!(stream);\n        match stream.poll(cx) {\n            Poll::Ready(mut stream) => Pin::new(&mut *stream).poll_next(cx),\n            Poll::Pending => Poll::Pending,\n        }\n    }\n}\n\n/// Return a new data chunk from the stream.\nasync fn yield_data_chunk(\n    body: Arc<Mutex<aws_smithy_types::byte_stream::ByteStream>>,\n) -> PyResult<Option<Bytes>> {\n    let mut stream = body.lock().await;\n    stream\n        .next()\n        .await\n        .transpose()\n        .map_err(|e| PyRuntimeError::new_err(e.to_string()))\n}\n\nimpl ByteStream {\n    /// Construct a new [`ByteStream`](aws_smithy_types::byte_stream::ByteStream) from a\n    /// [`SdkBody`](aws_smithy_types::body::SdkBody).\n    ///\n    /// This method is available only to Rust and it is required to comply with the\n    /// interface required by the code generator.\n    pub fn new(body: aws_smithy_types::body::SdkBody) -> Self {\n        Self(Arc::new(Mutex::new(\n            aws_smithy_types::byte_stream::ByteStream::new(body),\n        )))\n    }\n}\n\nimpl Default for ByteStream {\n    fn default() -> Self {\n        Self::new(aws_smithy_types::body::SdkBody::from(\"\"))\n    }\n}\n\n#[pymethods]\nimpl ByteStream {\n    /// Create a new [ByteStream](aws_smithy_types::byte_stream::ByteStream) from a slice of bytes.\n    #[new]\n    pub fn newpy(input: &[u8]) -> Self {\n        Self(Arc::new(Mutex::new(\n            aws_smithy_types::byte_stream::ByteStream::new(aws_smithy_types::body::SdkBody::from(\n                input,\n            )),\n        )))\n    }\n\n    /// Create a new [ByteStream](aws_smithy_types::byte_stream::ByteStream) from a path, without\n    /// requiring Python to await this method.\n    ///\n    /// **NOTE:** This method will block the Rust event loop when it is running.\n    ///\n    /// :param path str:\n    /// :rtype ByteStream:\n    #[staticmethod]\n    pub fn from_path_blocking(py: Python, path: String) -> PyResult<Py<PyAny>> {\n        let byte_stream = Handle::current().block_on(async {\n            aws_smithy_types::byte_stream::ByteStream::from_path(path)\n                .await\n                .map_err(|e| PyRuntimeError::new_err(e.to_string()))\n        })?;\n        let result = Self(Arc::new(Mutex::new(byte_stream)));\n        Ok(result.into_py(py))\n    }\n\n    /// Create a new [ByteStream](aws_smithy_types::byte_stream::ByteStream) from a path, forcing\n    /// Python to await this coroutine.\n    ///\n    /// :param path str:\n    /// :rtype typing.Awaitable[ByteStream]:\n    #[staticmethod]\n    pub fn from_path(py: Python<'_>, path: String) -> PyResult<&PyAny> {\n        pyo3_asyncio::tokio::future_into_py(py, async move {\n            let byte_stream = aws_smithy_types::byte_stream::ByteStream::from_path(path)\n                .await\n                .map_err(|e| PyRuntimeError::new_err(e.to_string()))?;\n            Ok(Self(Arc::new(Mutex::new(byte_stream))))\n        })\n    }\n\n    /// Allow to syncronously iterate over the stream.\n    ///\n    /// More info: `<https://docs.python.org/3/reference/datamodel.html#object.__iter__.>`\n    pub fn __iter__(slf: PyRef<Self>) -> PyRef<Self> {\n        slf\n    }\n\n    /// Return the next item from the iterator. If there are no further items, raise the StopIteration exception.\n    /// PyO3 allows to raise the correct exception using the enum [IterNextOutput](pyo3::pyclass::IterNextOutput).\n    ///\n    /// To get the next value of the iterator, the `Arc` inner stream is cloned and the Rust call to `next()` is executed\n    /// inside a call blocking the Tokio runtime.\n    ///\n    /// More info: `<https://docs.python.org/3/reference/datamodel.html#object.__next__.>`\n    pub fn __next__(slf: PyRefMut<Self>) -> PyResult<IterNextOutput<Py<PyAny>, PyObject>> {\n        let body = slf.0.clone();\n        let data_chunk = futures::executor::block_on(yield_data_chunk(body));\n        match data_chunk {\n            Ok(Some(data_chunk)) => Ok(IterNextOutput::Yield(data_chunk.into_py(slf.py()))),\n            Ok(None) => Ok(IterNextOutput::Return(slf.py().None())),\n            Err(e) => Err(e),\n        }\n    }\n\n    /// Allow to asyncronously iterate over the stream.\n    ///\n    /// More info: `<https://docs.python.org/3/reference/datamodel.html#object.__aiter__.>`\n    pub fn __aiter__(slf: PyRef<Self>) -> PyRef<Self> {\n        slf\n    }\n\n    /// Return an awaitable resulting in a next value of the iterator or raise a StopAsyncIteration\n    /// exception when the iteration is over.\n    ///\n    /// To get the next value of the iterator, the `Arc` inner stream is cloned and the Rust call\n    /// to `next()` is converted into an awaitable Python coroutine.\n    ///\n    /// More info: `<https://docs.python.org/3/reference/datamodel.html#object.__anext__.>`\n    ///\n    /// About the return type, we cannot use `IterANextOutput` because we don't know if we\n    /// have a next value or not until we call the `next` on the underlying stream which is\n    /// an async operation and it's awaited on the Python side. So we're returning\n    /// `StopAsyncIteration` inside the returned future lazily.\n    /// The reason for the extra `Option` wrapper is that PyO3 expects `__anext__` to return\n    /// either `Option<PyObject>` or `IterANextOutput` and fails to compile otherwise, so we're\n    /// using extra `Option` just to make PyO3 happy.\n    pub fn __anext__(slf: PyRefMut<Self>) -> PyResult<Option<PyObject>> {\n        let body = slf.0.clone();\n        let fut = pyo3_asyncio::tokio::future_into_py(slf.py(), async move {\n            let data = yield_data_chunk(body).await?;\n            match data {\n                Some(data) => Ok(Python::with_gil(|py| data.into_py(py))),\n                None => Err(PyStopAsyncIteration::new_err(\"stream exhausted\")),\n            }\n        })?;\n        Ok(Some(fut.into()))\n    }\n}\n\n/// Python Wrapper for [aws_smithy_types::Document].\n#[derive(Debug, Clone, PartialEq)]\npub struct Document(aws_smithy_types::Document);\n\nimpl IntoPy<PyObject> for Document {\n    fn into_py(self, py: Python<'_>) -> PyObject {\n        use aws_smithy_types::{Document as D, Number};\n\n        match self.0 {\n            D::Object(obj) => obj\n                .into_iter()\n                .map(|(k, v)| (k, Document(v).into_py(py)))\n                .collect::<HashMap<_, _>>()\n                .into_py(py),\n            D::Array(vec) => vec\n                .into_iter()\n                .map(|d| Document(d).into_py(py))\n                .collect::<Vec<_>>()\n                .into_py(py),\n            D::Number(Number::Float(f)) => f.into_py(py),\n            D::Number(Number::PosInt(pi)) => pi.into_py(py),\n            D::Number(Number::NegInt(ni)) => ni.into_py(py),\n            D::String(str) => str.into_py(py),\n            D::Bool(bool) => bool.into_py(py),\n            D::Null => py.None(),\n        }\n    }\n}\n\nimpl FromPyObject<'_> for Document {\n    fn extract(obj: &PyAny) -> PyResult<Self> {\n        use aws_smithy_types::{Document as D, Number};\n\n        if let Ok(obj) = obj.extract::<HashMap<String, Document>>() {\n            Ok(Self(D::Object(\n                obj.into_iter().map(|(k, v)| (k, v.0)).collect(),\n            )))\n        } else if let Ok(vec) = obj.extract::<Vec<Self>>() {\n            Ok(Self(D::Array(vec.into_iter().map(|d| d.0).collect())))\n        } else if let Ok(b) = obj.extract::<bool>() {\n            // This check must happen before any number checks because they cast\n            // `true`, `false` to `1`, `0` respectively.\n            Ok(Self(D::Bool(b)))\n        } else if let Ok(pi) = obj.extract::<u64>() {\n            Ok(Self(D::Number(Number::PosInt(pi))))\n        } else if let Ok(ni) = obj.extract::<i64>() {\n            Ok(Self(D::Number(Number::NegInt(ni))))\n        } else if let Ok(f) = obj.extract::<f64>() {\n            Ok(Self(D::Number(Number::Float(f))))\n        } else if let Ok(s) = obj.extract::<String>() {\n            Ok(Self(D::String(s)))\n        } else if obj.is_none() {\n            Ok(Self(D::Null))\n        } else {\n            Err(PyTypeError::new_err(format!(\n                \"'{obj}' cannot be converted to 'Document'\",\n            )))\n        }\n    }\n}\n\nimpl Deref for Document {\n    type Target = aws_smithy_types::Document;\n\n    fn deref(&self) -> &Self::Target {\n        &self.0\n    }\n}\n\nimpl From<aws_smithy_types::Document> for Document {\n    fn from(other: aws_smithy_types::Document) -> Document {\n        Document(other)\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use pyo3::py_run;\n\n    use super::*;\n\n    #[test]\n    fn blob_can_be_used_in_python_when_initialized_in_rust() {\n        crate::tests::initialize();\n        Python::with_gil(|py| {\n            let blob = Blob::new(\"some data\".as_bytes().to_vec());\n            let blob = PyCell::new(py, blob).unwrap();\n            py_run!(\n                py,\n                blob,\n                r#\"\n                assert blob.data == b\"some data\"\n                assert len(blob.data) == 9\n                blob.data = b\"some other data\"\n                assert blob.data == b\"some other data\"\n                assert len(blob.data) == 15\n            \"#\n            );\n        })\n    }\n\n    #[test]\n    fn blob_can_be_initialized_in_python() {\n        crate::tests::initialize();\n        Python::with_gil(|py| {\n            let types = PyModule::new(py, \"types\").unwrap();\n            types.add_class::<Blob>().unwrap();\n            py_run!(\n                py,\n                types,\n                r#\"\n                blob = types.Blob(b\"some data\")\n                assert blob.data == b\"some data\"\n                assert len(blob.data) == 9\n                blob.data = b\"some other data\"\n                assert blob.data == b\"some other data\"\n                assert len(blob.data) == 15\n            \"#\n            );\n        })\n    }\n\n    #[test]\n    fn datetime_can_be_used_in_python_when_initialized_in_rust() {\n        crate::tests::initialize();\n        Python::with_gil(|py| {\n            let datetime = DateTime::from_secs(100);\n            let datetime = PyCell::new(py, datetime).unwrap();\n            py_run!(py, datetime, \"assert datetime.secs() == 100\");\n        })\n    }\n\n    #[test]\n    fn datetime_can_by_initialized_in_python() {\n        crate::tests::initialize();\n        Python::with_gil(|py| {\n            let types = PyModule::new(py, \"types\").unwrap();\n            types.add_class::<DateTime>().unwrap();\n            py_run!(\n                py,\n                types,\n                \"assert types.DateTime.from_secs(100).secs() == 100\"\n            );\n        })\n    }\n\n    // TODO(When running in sync python, the iterator is reading the whole content in memory. Figure out why.)\n    #[tokio::test]\n    async fn bytestream_can_be_used_in_sync_python_when_initialized_in_rust() -> PyResult<()> {\n        crate::tests::initialize();\n        Python::with_gil(|py| {\n            let bytes = \"repeat\\n\".repeat(100000);\n            let bytestream = ByteStream::newpy(bytes.as_bytes());\n            let bytestream = PyCell::new(py, bytestream).unwrap();\n            py_run!(\n                py,\n                bytestream,\n                r#\"\n                for chunk in bytestream:\n                    assert len(chunk) > 10\n            \"#\n            )\n        });\n        Ok(())\n    }\n\n    #[test]\n    fn document_type() {\n        use aws_smithy_types::{Document as D, Number};\n\n        crate::tests::initialize();\n\n        let cases = [\n            (D::Null, \"None\"),\n            (D::Bool(true), \"True\"),\n            (D::Bool(false), \"False\"),\n            (D::String(\"foobar\".to_string()), \"'foobar'\"),\n            (D::Number(Number::Float(42.0)), \"42.0\"),\n            (D::Number(Number::PosInt(142)), \"142\"),\n            (D::Number(Number::NegInt(-152)), \"-152\"),\n            (\n                D::Array(vec![\n                    D::Bool(false),\n                    D::String(\"qux\".to_string()),\n                    D::Number(Number::Float(1.0)),\n                    D::Array(vec![D::String(\"inner\".to_string()), D::Bool(true)]),\n                ]),\n                \"[False, 'qux', 1.0, ['inner', True]]\",\n            ),\n            (\n                D::Object(\n                    [\n                        (\"t\".to_string(), D::Bool(true)),\n                        (\"foo\".to_string(), D::String(\"foo\".to_string())),\n                        (\"f42\".to_string(), D::Number(Number::Float(42.0))),\n                        (\"i42\".to_string(), D::Number(Number::PosInt(42))),\n                        (\"f\".to_string(), D::Bool(false)),\n                        (\n                            \"vec\".to_string(),\n                            D::Array(vec![\n                                D::String(\"inner\".to_string()),\n                                D::Object(\n                                    [\n                                        (\n                                            \"nested\".to_string(),\n                                            D::String(\"nested_value\".to_string()),\n                                        ),\n                                        (\"nested_num\".to_string(), D::Number(Number::NegInt(-42))),\n                                    ]\n                                    .into(),\n                                ),\n                            ]),\n                        ),\n                    ]\n                    .into(),\n                ),\n                \"{\n                    't': True,\n                    'foo': 'foo',\n                    'f42': 42.0,\n                    'i42': 42,\n                    'f': False,\n                    'vec': [\n                        'inner',\n                        {'nested': 'nested_value', 'nested_num': -42}\n                    ]\n                }\",\n            ),\n        ];\n\n        for (rust_ty, python_repr) in cases {\n            // Rust -> Python\n            Python::with_gil(|py| {\n                let value = Document(rust_ty.clone()).into_py(py);\n                py_run!(py, value, &format!(\"assert value == {python_repr}\"));\n            });\n\n            // Python -> Rust\n            Python::with_gil(|py| {\n                let py_value = py.eval(python_repr, None, None).unwrap();\n                let doc = py_value.extract::<Document>().unwrap();\n                assert_eq!(doc, Document(rust_ty.clone()));\n            });\n\n            // Rust -> Python -> Rust\n            Python::with_gil(|py| {\n                let doc = Document(rust_ty);\n                let doc2 = doc.clone().into_py(py).extract(py).unwrap();\n                assert_eq!(doc, doc2);\n            });\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server-python/src/util/collection.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Provides Rust equivalents of [collections.abc] Python classes.\n//!\n//! Creating a custom container is achived in Python via extending a `collections.abc.*` class:\n//! ```python\n//! class MySeq(collections.abc.Sequence):\n//!     def __getitem__(self, index):  ...  # Required abstract method\n//!     def __len__(self):  ...             # Required abstract method\n//! ```\n//! You just need to implement required abstract methods and you get\n//! extra mixin methods for free.\n//!\n//! Ideally we also want to just extend abstract base classes from Python but\n//! it is not supported yet: <https://github.com/PyO3/pyo3/issues/991>.\n//!\n//! Until then, we are providing traits with the required methods and, macros that\n//! takes those types that implement those traits and provides mixin methods for them.\n//!\n//! [collections.abc]: https://docs.python.org/3/library/collections.abc.html\n\n#![allow(non_local_definitions)]\n\nuse pyo3::PyResult;\n\n/// Rust version of [collections.abc.MutableMapping].\n///\n/// [collections.abc.MutableMapping]: https://docs.python.org/3/library/collections.abc.html#collections.abc.MutableMapping\npub trait PyMutableMapping {\n    type Key;\n    type Value;\n\n    fn len(&self) -> PyResult<usize>;\n    fn contains(&self, key: Self::Key) -> PyResult<bool>;\n    fn get(&self, key: Self::Key) -> PyResult<Option<Self::Value>>;\n    fn set(&mut self, key: Self::Key, value: Self::Value) -> PyResult<()>;\n    fn del(&mut self, key: Self::Key) -> PyResult<()>;\n\n    // TODO(Perf): This methods should return iterators instead of `Vec`s.\n    fn keys(&self) -> PyResult<Vec<Self::Key>>;\n    fn values(&self) -> PyResult<Vec<Self::Value>>;\n}\n\n/// Macro that provides mixin methods of [collections.abc.MutableMapping] to the implementing type.\n///\n/// [collections.abc.MutableMapping]: https://docs.python.org/3/library/collections.abc.html#collections.abc.MutableMapping\n#[macro_export]\nmacro_rules! mutable_mapping_pymethods {\n    ($ty:ident, keys_iter: $keys_iter: ident) => {\n        const _: fn() = || {\n            fn assert_impl<T: PyMutableMapping>() {}\n            assert_impl::<$ty>();\n        };\n\n        #[pyo3::pyclass]\n        struct $keys_iter(std::vec::IntoIter<<$ty as PyMutableMapping>::Key>);\n\n        #[pyo3::pymethods]\n        impl $keys_iter {\n            fn __next__(&mut self) -> Option<<$ty as PyMutableMapping>::Key> {\n                self.0.next()\n            }\n        }\n\n        #[pyo3::pymethods]\n        impl $ty {\n            // -- collections.abc.Sized\n\n            fn __len__(&self) -> pyo3::PyResult<usize> {\n                self.len()\n            }\n\n            // -- collections.abc.Container\n\n            fn __contains__(&self, key: <$ty as PyMutableMapping>::Key) -> pyo3::PyResult<bool> {\n                self.contains(key)\n            }\n\n            // -- collections.abc.Iterable\n\n            /// Returns an iterator over the keys of the dictionary.\n            /// NOTE: This method currently causes all keys to be cloned.\n            fn __iter__(&self) -> pyo3::PyResult<$keys_iter> {\n                Ok($keys_iter(self.keys()?.into_iter()))\n            }\n\n            // -- collections.abc.Mapping\n\n            fn __getitem__(\n                &self,\n                key: <$ty as PyMutableMapping>::Key,\n            ) -> pyo3::PyResult<Option<<$ty as PyMutableMapping>::Value>> {\n                <$ty as PyMutableMapping>::get(&self, key)\n            }\n\n            fn get(\n                &self,\n                key: <$ty as PyMutableMapping>::Key,\n                default: Option<<$ty as PyMutableMapping>::Value>,\n            ) -> pyo3::PyResult<Option<<$ty as PyMutableMapping>::Value>> {\n                Ok(<$ty as PyMutableMapping>::get(&self, key)?.or(default))\n            }\n\n            /// Returns keys of the dictionary.\n            /// NOTE: This method currently causes all keys to be cloned.\n            fn keys(&self) -> pyo3::PyResult<Vec<<$ty as PyMutableMapping>::Key>> {\n                <$ty as PyMutableMapping>::keys(&self)\n            }\n\n            /// Returns values of the dictionary.\n            /// NOTE: This method currently causes all values to be cloned.\n            fn values(&self) -> pyo3::PyResult<Vec<<$ty as PyMutableMapping>::Value>> {\n                <$ty as PyMutableMapping>::values(&self)\n            }\n\n            /// Returns items (key, value) of the dictionary.\n            /// NOTE: This method currently causes all keys and values to be cloned.\n            fn items(\n                &self,\n            ) -> pyo3::PyResult<\n                Vec<(\n                    <$ty as PyMutableMapping>::Key,\n                    <$ty as PyMutableMapping>::Value,\n                )>,\n            > {\n                Ok(self\n                    .keys()?\n                    .into_iter()\n                    .zip(self.values()?.into_iter())\n                    .collect())\n            }\n\n            // -- collections.abc.MutableMapping\n\n            fn __setitem__(\n                &mut self,\n                key: <$ty as PyMutableMapping>::Key,\n                value: <$ty as PyMutableMapping>::Value,\n            ) -> pyo3::PyResult<()> {\n                self.set(key, value)\n            }\n\n            fn __delitem__(&mut self, key: <$ty as PyMutableMapping>::Key) -> pyo3::PyResult<()> {\n                self.del(key)\n            }\n\n            fn pop(\n                &mut self,\n                key: <$ty as PyMutableMapping>::Key,\n                default: Option<<$ty as PyMutableMapping>::Value>,\n            ) -> pyo3::PyResult<<$ty as PyMutableMapping>::Value> {\n                let val = self.__getitem__(key.clone())?;\n                match val {\n                    Some(val) => {\n                        self.del(key)?;\n                        Ok(val)\n                    }\n                    None => {\n                        default.ok_or_else(|| pyo3::exceptions::PyKeyError::new_err(\"unknown key\"))\n                    }\n                }\n            }\n\n            fn popitem(\n                &mut self,\n            ) -> pyo3::PyResult<(\n                <$ty as PyMutableMapping>::Key,\n                <$ty as PyMutableMapping>::Value,\n            )> {\n                let key = self\n                    .keys()?\n                    .iter()\n                    .cloned()\n                    .next()\n                    .ok_or_else(|| pyo3::exceptions::PyKeyError::new_err(\"no key\"))?;\n                let value = self.pop(key.clone(), None)?;\n                Ok((key, value))\n            }\n\n            fn clear(&mut self, py: pyo3::Python) -> pyo3::PyResult<()> {\n                loop {\n                    match self.popitem() {\n                        Ok(_) => {}\n                        Err(err) if err.is_instance_of::<pyo3::exceptions::PyKeyError>(py) => {\n                            return Ok(())\n                        }\n                        Err(err) => return Err(err),\n                    }\n                }\n            }\n\n            fn setdefault(\n                &mut self,\n                key: <$ty as PyMutableMapping>::Key,\n                default: Option<<$ty as PyMutableMapping>::Value>,\n            ) -> pyo3::PyResult<Option<<$ty as PyMutableMapping>::Value>> {\n                match self.__getitem__(key.clone())? {\n                    Some(value) => Ok(Some(value)),\n                    None => {\n                        if let Some(value) = default.clone() {\n                            self.set(key, value)?;\n                        }\n                        Ok(default)\n                    }\n                }\n            }\n        }\n    };\n}\n\n#[cfg(test)]\nmod tests {\n    use std::collections::HashMap;\n\n    use pyo3::{prelude::*, py_run};\n\n    use super::*;\n\n    #[pyclass(mapping)]\n    struct Map(HashMap<String, String>);\n\n    impl PyMutableMapping for Map {\n        type Key = String;\n        type Value = String;\n\n        fn len(&self) -> PyResult<usize> {\n            Ok(self.0.len())\n        }\n\n        fn contains(&self, key: Self::Key) -> PyResult<bool> {\n            Ok(self.0.contains_key(&key))\n        }\n\n        fn keys(&self) -> PyResult<Vec<Self::Key>> {\n            Ok(self.0.keys().cloned().collect())\n        }\n\n        fn values(&self) -> PyResult<Vec<Self::Value>> {\n            Ok(self.0.values().cloned().collect())\n        }\n\n        fn get(&self, key: Self::Key) -> PyResult<Option<Self::Value>> {\n            Ok(self.0.get(&key).cloned())\n        }\n\n        fn set(&mut self, key: Self::Key, value: Self::Value) -> PyResult<()> {\n            self.0.insert(key, value);\n            Ok(())\n        }\n\n        fn del(&mut self, key: Self::Key) -> PyResult<()> {\n            self.0.remove(&key);\n            Ok(())\n        }\n    }\n\n    mutable_mapping_pymethods!(Map, keys_iter: MapKeys);\n\n    #[test]\n    fn mutable_mapping() -> PyResult<()> {\n        pyo3::prepare_freethreaded_python();\n\n        let map = Map({\n            let mut hash_map = HashMap::new();\n            hash_map.insert(\"foo\".to_string(), \"bar\".to_string());\n            hash_map.insert(\"baz\".to_string(), \"qux\".to_string());\n            hash_map\n        });\n\n        Python::with_gil(|py| {\n            let map = PyCell::new(py, map)?;\n            py_run!(\n                py,\n                map,\n                r#\"\n# collections.abc.Sized\nassert len(map) == 2\n\n# collections.abc.Container\nassert \"foo\" in map\nassert \"foobar\" not in map\n\n# collections.abc.Iterable\nelems = [\"foo\", \"baz\"]\n\nfor elem in map:\n    assert elem in elems\n\nit = iter(map)\nassert next(it) in elems\nassert next(it) in elems\ntry:\n    next(it)\n    assert False, \"should stop iteration\"\nexcept StopIteration:\n    pass\n\nassert set(list(map)) == set([\"foo\", \"baz\"])\n\n# collections.abc.Mapping\nassert map[\"foo\"] == \"bar\"\nassert map.get(\"baz\") == \"qux\"\nassert map.get(\"foobar\") == None\nassert map.get(\"foobar\", \"default\") == \"default\"\n\nassert set(list(map.keys())) == set([\"foo\", \"baz\"])\nassert set(list(map.values())) == set([\"bar\", \"qux\"])\nassert set(list(map.items())) == set([(\"foo\", \"bar\"), (\"baz\", \"qux\")])\n\n# collections.abc.MutableMapping\nmap[\"foobar\"] = \"bazqux\"\ndel map[\"foo\"]\n\ntry:\n    map.pop(\"not_exist\")\n    assert False, \"should throw KeyError\"\nexcept KeyError:\n    pass\nassert map.pop(\"not_exist\", \"default\") == \"default\"\nassert map.pop(\"foobar\") == \"bazqux\"\nassert \"foobar\" not in map\n\n# at this point there is only `baz => qux` in `map`\nassert map.popitem() == (\"baz\", \"qux\")\nassert len(map) == 0\ntry:\n    map.popitem()\n    assert False, \"should throw KeyError\"\nexcept KeyError:\n    pass\n\nmap[\"foo\"] = \"bar\"\nassert len(map) == 1\nmap.clear()\nassert len(map) == 0\nassert \"foo\" not in \"bar\"\n\nassert map.setdefault(\"foo\", \"bar\") == \"bar\"\nassert map[\"foo\"] == \"bar\"\nassert map.setdefault(\"foo\", \"baz\") == \"bar\"\n\n# TODO(MissingImpl): Add tests for map.update(...)\n\"#\n            );\n            Ok(())\n        })\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server-python/src/util/error.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Provides utilities for Python errors.\n\nuse std::fmt;\n\nuse pyo3::{PyErr, Python};\n\n/// Wraps [PyErr] with a richer debug output that includes traceback and cause.\npub struct RichPyErr(PyErr);\n\nimpl fmt::Debug for RichPyErr {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> Result<(), fmt::Error> {\n        Python::with_gil(|py| {\n            let mut debug_struct = f.debug_struct(\"RichPyErr\");\n            debug_struct\n                .field(\"type\", self.0.get_type(py))\n                .field(\"value\", self.0.value(py));\n\n            if let Some(traceback) = self.0.traceback(py) {\n                if let Ok(traceback) = traceback.format() {\n                    debug_struct.field(\"traceback\", &traceback);\n                }\n            }\n\n            if let Some(cause) = self.0.cause(py) {\n                debug_struct.field(\"cause\", &rich_py_err(cause));\n            }\n\n            debug_struct.finish()\n        })\n    }\n}\n\n/// Wrap `err` with [RichPyErr] to have a richer debug output.\npub fn rich_py_err(err: PyErr) -> RichPyErr {\n    RichPyErr(err)\n}\n\n#[cfg(test)]\nmod tests {\n    use pyo3::prelude::*;\n\n    use super::*;\n\n    #[test]\n    fn rich_python_errors() -> PyResult<()> {\n        pyo3::prepare_freethreaded_python();\n\n        let py_err = Python::with_gil(|py| {\n            py.run(\n                r#\"\ndef foo():\n    base_err = ValueError(\"base error\")\n    raise ValueError(\"some python error\") from base_err\n\ndef bar():\n    foo()\n\ndef baz():\n    bar()\n\nbaz()\n\"#,\n                None,\n                None,\n            )\n            .unwrap_err()\n        });\n\n        let debug_output = format!(\"{:?}\", rich_py_err(py_err));\n\n        // Make sure we are capturing error message\n        assert!(debug_output.contains(\"some python error\"));\n\n        // Make sure we are capturing traceback\n        assert!(debug_output.contains(\"foo\"));\n        assert!(debug_output.contains(\"bar\"));\n        assert!(debug_output.contains(\"baz\"));\n\n        // Make sure we are capturing cause\n        assert!(debug_output.contains(\"base error\"));\n\n        Ok(())\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server-python/src/util.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npub mod collection;\npub mod error;\n\nuse pyo3::{PyAny, PyObject, PyResult, PyTypeInfo, Python};\n\n// Captures some information about a Python function.\n#[derive(Debug, PartialEq)]\npub struct FuncMetadata {\n    pub name: String,\n    pub is_coroutine: bool,\n    pub num_args: usize,\n}\n\n// Returns `FuncMetadata` for given `func`.\npub fn func_metadata(py: Python, func: &PyObject) -> PyResult<FuncMetadata> {\n    let name = func.getattr(py, \"__name__\")?.extract::<String>(py)?;\n    let is_coroutine = is_coroutine(py, func)?;\n    let inspect = py.import(\"inspect\")?;\n    let args = inspect\n        .call_method1(\"getargs\", (func.getattr(py, \"__code__\")?,))?\n        .getattr(\"args\")?\n        .extract::<Vec<String>>()?;\n    Ok(FuncMetadata {\n        name,\n        is_coroutine,\n        num_args: args.len(),\n    })\n}\n\n// Check if a Python function is a coroutine. Since the function has not run yet,\n// we cannot use `asyncio.iscoroutine()`, we need to use `inspect.iscoroutinefunction()`.\nfn is_coroutine(py: Python, func: &PyObject) -> PyResult<bool> {\n    let inspect = py.import(\"inspect\")?;\n    // NOTE: that `asyncio.iscoroutine()` doesn't work here.\n    inspect\n        .call_method1(\"iscoroutinefunction\", (func,))?\n        .extract::<bool>()\n}\n\n// Checks whether given Python type is `Optional[T]`.\npub fn is_optional_of<T: PyTypeInfo>(py: Python, ty: &PyAny) -> PyResult<bool> {\n    // for reference: https://stackoverflow.com/a/56833826\n\n    // in Python `Optional[T]` is an alias for `Union[T, None]`\n    // so we should check if the type origin is `Union`\n    let union_ty = py.import(\"typing\")?.getattr(\"Union\")?;\n    match ty.getattr(\"__origin__\").map(|origin| origin.is(union_ty)) {\n        Ok(true) => {}\n        // Here we can ignore errors because `__origin__` is not present on all types\n        // and it is not really an error, it is just a type we don't expect\n        _ => return Ok(false),\n    };\n\n    let none = py.None();\n    // in typing, `None` is a special case and it is converted to `type(None)`,\n    // so we are getting type of `None` here to match\n    let none_ty = none.as_ref(py).get_type();\n    let target_ty = py.get_type::<T>();\n\n    // `Union` should be tuple of `(T, NoneType)` or `(NoneType, T)`\n    match ty\n        .getattr(\"__args__\")\n        .and_then(|args| args.extract::<(&PyAny, &PyAny)>())\n    {\n        Ok((first_ty, second_ty)) => Ok(\n            // (T, NoneType)\n            (first_ty.is(target_ty) && second_ty.is(none_ty)) ||\n                // (NoneType, T)\n                (first_ty.is(none_ty) && second_ty.is(target_ty)),\n        ),\n        // Here we can ignore errors because `__args__` is not present on all types\n        // and it is not really an error, it is just a type we don't expect\n        _ => Ok(false),\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use pyo3::{\n        types::{PyBool, PyDict, PyModule, PyString},\n        IntoPy,\n    };\n\n    use super::*;\n\n    #[test]\n    fn function_metadata() -> PyResult<()> {\n        pyo3::prepare_freethreaded_python();\n\n        Python::with_gil(|py| {\n            let module = PyModule::from_code(\n                py,\n                r#\"\ndef regular_func(first_arg, second_arg):\n    pass\n\nasync def async_func():\n    pass\n\"#,\n                \"\",\n                \"\",\n            )?;\n\n            let regular_func = module.getattr(\"regular_func\")?.into_py(py);\n            assert_eq!(\n                FuncMetadata {\n                    name: \"regular_func\".to_string(),\n                    is_coroutine: false,\n                    num_args: 2,\n                },\n                func_metadata(py, &regular_func)?\n            );\n\n            let async_func = module.getattr(\"async_func\")?.into_py(py);\n            assert_eq!(\n                FuncMetadata {\n                    name: \"async_func\".to_string(),\n                    is_coroutine: true,\n                    num_args: 0,\n                },\n                func_metadata(py, &async_func)?\n            );\n\n            Ok(())\n        })\n    }\n\n    #[allow(clippy::bool_assert_comparison)]\n    #[test]\n    fn check_if_is_optional_of() -> PyResult<()> {\n        pyo3::prepare_freethreaded_python();\n\n        Python::with_gil(|py| {\n            let typing = py.import(\"typing\")?;\n            let module = PyModule::from_code(\n                py,\n                r#\"\nimport typing\n\nclass Types:\n    opt_of_str: typing.Optional[str] = \"hello\"\n    opt_of_bool: typing.Optional[bool] = None\n    regular_str: str = \"world\"\n\"#,\n                \"\",\n                \"\",\n            )?;\n\n            let types = module.getattr(\"Types\")?.into_py(py);\n            let type_hints = typing\n                .call_method1(\"get_type_hints\", (types,))\n                .and_then(|res| res.extract::<&PyDict>())?;\n\n            assert_eq!(\n                true,\n                is_optional_of::<PyString>(\n                    py,\n                    type_hints\n                        .get_item(\"opt_of_str\")\n                        .expect(\"Python exception occurred during dictionary lookup\")\n                        .unwrap()\n                )?\n            );\n            assert_eq!(\n                false,\n                is_optional_of::<PyString>(\n                    py,\n                    type_hints\n                        .get_item(\"regular_str\")\n                        .expect(\"Python exception occurred during dictionary lookup\")\n                        .unwrap()\n                )?\n            );\n            assert_eq!(\n                true,\n                is_optional_of::<PyBool>(\n                    py,\n                    type_hints\n                        .get_item(\"opt_of_bool\")\n                        .expect(\"Python exception occurred during dictionary lookup\")\n                        .unwrap()\n                )?\n            );\n            assert_eq!(\n                false,\n                is_optional_of::<PyString>(\n                    py,\n                    type_hints\n                        .get_item(\"opt_of_bool\")\n                        .expect(\"Python exception occurred during dictionary lookup\")\n                        .unwrap()\n                )?\n            );\n\n            Ok(())\n        })\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server-python/stubgen.py",
    "content": "#  Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n#  SPDX-License-Identifier: Apache-2.0\n\nfrom __future__ import annotations\n\nimport inspect\nimport re\nimport textwrap\nfrom pathlib import Path\nfrom typing import Any, Dict, List, Optional, Set, Tuple\n\nROOT_MODULE_NAME_PLACEHOLDER = \"__root_module_name__\"\n\n\nclass Writer:\n    \"\"\"\n    Writer provides utilities for writing Python stubs.\n    \"\"\"\n\n    root_module_name: str\n    path: Path\n    subwriters: List[Writer]\n    imports: Set[str]\n    defs: List[str]\n    generics: Set[str]\n\n    def __init__(self, path: Path, root_module_name: str) -> None:\n        self.path = path\n        self.root_module_name = root_module_name\n        self.subwriters = []\n        self.imports = set([])\n        self.defs = []\n        self.generics = set([])\n\n    def fix_path(self, path: str) -> str:\n        \"\"\"\n        Returns fixed version of given type path.\n        It unescapes `\\\\[` and `\\\\]` and also populates placeholder for root module name.\n        \"\"\"\n        return path.replace(ROOT_MODULE_NAME_PLACEHOLDER, self.root_module_name).replace(\"\\\\[\", \"[\").replace(\"\\\\]\", \"]\")\n\n    def submodule(self, path: Path) -> Writer:\n        w = Writer(path, self.root_module_name)\n        self.subwriters.append(w)\n        return w\n\n    def include(self, path: str) -> str:\n        # `path` might be nested like: typing.Optional[typing.List[pokemon_service_server_sdk.model.GetPokemonSpecies]]\n        # we need to process every subpath in a nested path\n        paths = filter(lambda p: p, re.split(\"\\\\[|\\\\]|,| \", path))\n        for subpath in paths:\n            parts = subpath.rsplit(\".\", maxsplit=1)\n            # add `typing` to imports for a path like `typing.List`\n            # but skip if the path doesn't have any namespace like `str` or `bool`\n            if len(parts) == 2:\n                self.imports.add(parts[0])\n\n        return path\n\n    def fix_and_include(self, path: str) -> str:\n        return self.include(self.fix_path(path))\n\n    def define(self, code: str) -> None:\n        self.defs.append(code)\n\n    def generic(self, name: str) -> None:\n        self.generics.add(name)\n\n    def dump(self) -> None:\n        for w in self.subwriters:\n            w.dump()\n\n        generics = \"\"\n        for g in sorted(self.generics):\n            generics += f\"{g} = {self.include('typing.TypeVar')}('{g}')\\n\"\n\n        self.path.parent.mkdir(parents=True, exist_ok=True)\n        contents = join([f\"import {p}\" for p in sorted(self.imports)])\n        contents += \"\\n\\n\"\n        if generics:\n            contents += generics + \"\\n\"\n        contents += join(self.defs)\n        self.path.write_text(contents)\n\n\nclass DocstringParserResult:\n    def __init__(self) -> None:\n        self.types: List[str] = []\n        self.params: List[Tuple[str, str]] = []\n        self.rtypes: List[str] = []\n        self.generics: List[str] = []\n        self.extends: List[str] = []\n\n\ndef parse_type_directive(line: str, res: DocstringParserResult):\n    parts = line.split(\" \", maxsplit=1)\n    if len(parts) != 2:\n        raise ValueError(f\"Invalid `:type` directive: `{line}` must be in `:type T:` format\")\n    res.types.append(parts[1].rstrip(\":\"))\n\n\ndef parse_rtype_directive(line: str, res: DocstringParserResult):\n    parts = line.split(\" \", maxsplit=1)\n    if len(parts) != 2:\n        raise ValueError(f\"Invalid `:rtype` directive: `{line}` must be in `:rtype T:` format\")\n    res.rtypes.append(parts[1].rstrip(\":\"))\n\n\ndef parse_param_directive(line: str, res: DocstringParserResult):\n    parts = line.split(\" \", maxsplit=2)\n    if len(parts) != 3:\n        raise ValueError(f\"Invalid `:param` directive: `{line}` must be in `:param name T:` format\")\n    name = parts[1]\n    ty = parts[2].rstrip(\":\")\n    res.params.append((name, ty))\n\n\ndef parse_generic_directive(line: str, res: DocstringParserResult):\n    parts = line.split(\" \", maxsplit=1)\n    if len(parts) != 2:\n        raise ValueError(f\"Invalid `:generic` directive: `{line}` must be in `:generic T:` format\")\n    res.generics.append(parts[1].rstrip(\":\"))\n\n\ndef parse_extends_directive(line: str, res: DocstringParserResult):\n    parts = line.split(\" \", maxsplit=1)\n    if len(parts) != 2:\n        raise ValueError(f\"Invalid `:extends` directive: `{line}` must be in `:extends Base[...]:` format\")\n    res.extends.append(parts[1].rstrip(\":\"))\n\n\nDocstringParserDirectives = {\n    \"type\": parse_type_directive,\n    \"param\": parse_param_directive,\n    \"rtype\": parse_rtype_directive,\n    \"generic\": parse_generic_directive,\n    \"extends\": parse_extends_directive,\n}\n\n\nclass DocstringParser:\n    \"\"\"\n    DocstringParser provides utilities for parsing type information from docstring.\n    \"\"\"\n\n    @staticmethod\n    def parse(obj: Any) -> Optional[DocstringParserResult]:\n        doc = inspect.getdoc(obj)\n        if not doc:\n            return None\n\n        res = DocstringParserResult()\n        for line in doc.splitlines():\n            line = line.strip()\n            for d, p in DocstringParserDirectives.items():\n                if line.startswith(f\":{d} \") and line.endswith(\":\"):\n                    p(line, res)\n        return res\n\n    @staticmethod\n    def parse_type(obj: Any) -> str:\n        result = DocstringParser.parse(obj)\n        if not result or len(result.types) == 0:\n            return \"typing.Any\"\n        return result.types[0]\n\n    @staticmethod\n    def parse_function(obj: Any) -> Optional[Tuple[List[Tuple[str, str]], str]]:\n        result = DocstringParser.parse(obj)\n        if not result:\n            return None\n\n        return (\n            result.params,\n            \"None\" if len(result.rtypes) == 0 else result.rtypes[0],\n        )\n\n    @staticmethod\n    def parse_class(obj: Any) -> Tuple[List[str], List[str]]:\n        result = DocstringParser.parse(obj)\n        if not result:\n            return ([], [])\n        return (result.generics, result.extends)\n\n    @staticmethod\n    def clean_doc(obj: Any) -> str:\n        doc = inspect.getdoc(obj)\n        if not doc:\n            return \"\"\n\n        def predicate(line: str) -> bool:\n            for k in DocstringParserDirectives.keys():\n                if line.startswith(f\":{k} \") and line.endswith(\":\"):\n                    return False\n            return True\n\n        return \"\\n\".join([line for line in doc.splitlines() if predicate(line)]).strip()\n\n\ndef indent(code: str, level: int = 4) -> str:\n    return textwrap.indent(code, level * \" \")\n\n\ndef is_fn_like(obj: Any) -> bool:\n    return (\n        inspect.isbuiltin(obj)\n        or inspect.ismethod(obj)\n        or inspect.isfunction(obj)\n        or inspect.ismethoddescriptor(obj)\n        or inspect.iscoroutine(obj)\n        or inspect.iscoroutinefunction(obj)\n    )\n\n\ndef is_scalar(obj: Any) -> bool:\n    return isinstance(obj, (str, float, int, bool))\n\n\ndef join(args: List[str], delim: str = \"\\n\") -> str:\n    return delim.join(filter(lambda x: x, args))\n\n\ndef make_doc(obj: Any) -> str:\n    doc = DocstringParser.clean_doc(obj)\n    doc = textwrap.dedent(doc)\n    if not doc:\n        return \"\"\n\n    return join(['\"\"\"', doc, '\"\"\"'])\n\n\ndef make_field(writer: Writer, name: str, field: Any) -> str:\n    return f\"{name}: {writer.fix_and_include(DocstringParser.parse_type(field))}\"\n\n\ndef make_function(\n    writer: Writer,\n    name: str,\n    obj: Any,\n    include_docs: bool = True,\n    parent: Optional[Any] = None,\n) -> str:\n    is_static_method = False\n    if parent and isinstance(obj, staticmethod):\n        # Get real method instance from `parent` if `obj` is a `staticmethod`\n        is_static_method = True\n        obj = getattr(parent, name)\n\n    res = DocstringParser.parse_function(obj)\n    if not res:\n        # Make it `Any` if we can't parse the docstring\n        return f\"{name}: {writer.include('typing.Any')}\"\n\n    params, rtype = res\n    # We're using signature for getting default values only, currently type hints are not supported\n    # in signatures. We can leverage signatures more if it supports type hints in future.\n    sig: Optional[inspect.Signature] = None\n    try:\n        sig = inspect.signature(obj)\n    except Exception:\n        pass\n\n    def has_default(param: str, ty: str) -> bool:\n        # PyO3 allows omitting `Option<T>` params while calling a Rust function from Python,\n        # we should always mark `typing.Optional[T]` values as they have default values to allow same\n        # flexibiliy as runtime dynamics in type-stubs.\n        if ty.startswith(\"typing.Optional[\"):\n            return True\n\n        if sig is None:\n            return False\n\n        sig_param = sig.parameters.get(param)\n        return sig_param is not None and sig_param.default is not sig_param.empty\n\n    receivers: List[str] = []\n    attrs: List[str] = []\n    if parent:\n        if is_static_method:\n            attrs.append(\"@staticmethod\")\n        else:\n            receivers.append(\"self\")\n\n    def make_param(name: str, ty: str) -> str:\n        fixed_ty = writer.fix_and_include(ty)\n        param = f\"{name}: {fixed_ty}\"\n        if has_default(name, fixed_ty):\n            param += \" = ...\"\n        return param\n\n    params = join(receivers + [make_param(n, t) for n, t in params], delim=\", \")\n    attrs_str = join(attrs)\n    rtype = writer.fix_and_include(rtype)\n    body = \"...\"\n    if include_docs:\n        body = join([make_doc(obj), body])\n\n    return f\"\"\"\n{attrs_str}\ndef {name}({params}) -> {rtype}:\n{indent(body)}\n\"\"\".lstrip()\n\n\ndef make_class(writer: Writer, name: str, klass: Any) -> str:\n    bases = list(filter(lambda n: n != \"object\", map(lambda b: b.__name__, klass.__bases__)))\n    class_sig = DocstringParser.parse_class(klass)\n    if class_sig:\n        (generics, extends) = class_sig\n        bases.extend(map(writer.fix_and_include, extends))\n        for g in generics:\n            writer.generic(g)\n\n    members: List[str] = []\n\n    class_vars: Dict[str, Any] = vars(klass)\n    for member_name, member in sorted(class_vars.items(), key=lambda k: k[0]):\n        if member_name.startswith(\"__\"):\n            continue\n\n        if inspect.isdatadescriptor(member):\n            members.append(\n                join(\n                    [\n                        make_field(writer, member_name, member),\n                        make_doc(member),\n                    ]\n                )\n            )\n        elif is_fn_like(member):\n            members.append(\n                make_function(writer, member_name, member, parent=klass),\n            )\n        elif isinstance(member, klass):\n            # Enum variant\n            members.append(\n                join(\n                    [\n                        f\"{member_name}: {name}\",\n                        make_doc(member),\n                    ]\n                )\n            )\n        else:\n            print(f\"Unknown member type: {member}\")\n\n    if inspect.getdoc(klass) is not None:\n        constructor_sig = DocstringParser.parse(klass)\n        if constructor_sig is not None and (\n            # Make sure to only generate `__init__` if the class has a constructor defined\n            len(constructor_sig.rtypes) > 0\n            or len(constructor_sig.params) > 0\n        ):\n            members.append(\n                make_function(\n                    writer,\n                    \"__init__\",\n                    klass,\n                    include_docs=False,\n                    parent=klass,\n                )\n            )\n\n    bases_str = \"\" if len(bases) == 0 else f\"({join(bases, delim=', ')})\"\n    doc = make_doc(klass)\n    if doc:\n        doc += \"\\n\"\n    body = join([doc, join(members, delim=\"\\n\\n\") or \"...\"])\n    return f\"\"\"\\\nclass {name}{bases_str}:\n{indent(body)}\n\"\"\"\n\n\ndef walk_module(writer: Writer, mod: Any):\n    exported = mod.__all__\n\n    for name, member in inspect.getmembers(mod):\n        if name not in exported:\n            continue\n\n        if inspect.ismodule(member):\n            subpath = writer.path.parent / name / \"__init__.pyi\"\n            walk_module(writer.submodule(subpath), member)\n        elif inspect.isclass(member):\n            writer.define(make_class(writer, name, member))\n        elif is_fn_like(member):\n            writer.define(make_function(writer, name, member))\n        elif is_scalar(member):\n            writer.define(f\"{name}: {type(member).__name__} = ...\")\n        else:\n            print(f\"Unknown type: {member}\")\n\n\ndef generate(module: str, outdir: str):\n    path = Path(outdir) / \"__init__.pyi\"\n    writer = Writer(\n        path,\n        module,\n    )\n    walk_module(\n        writer,\n        importlib.import_module(module),\n    )\n    writer.dump()\n\n\nif __name__ == \"__main__\":\n    import argparse\n    import importlib\n\n    parser = argparse.ArgumentParser()\n    parser.add_argument(\"module\")\n    parser.add_argument(\"outdir\")\n    args = parser.parse_args()\n\n    generate(args.module, args.outdir)\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server-python/stubgen.sh",
    "content": "#!/usr/bin/env bash\n#  Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n#  SPDX-License-Identifier: Apache-2.0\n\nset -x\n\nif [ $# -lt 3 ]; then\n    echo \"usage: $0 package manifest_path output_directory\"\n    exit 1\nfi\n\n# input arguments\npackage=$1\nmanifest=$2\noutput=$3\n\n# the directory of the script\nsource_dir=\"$(git rev-parse --show-toplevel)\"\nscript_dir=\"$(cd \"$(dirname \"${BASH_SOURCE[0]}\")\" && pwd)\"\nif [ -n \"$source_dir\" ]; then\n    CARGO_TARGET_DIR=\"$source_dir/target\"\nelse\n    CARGO_TARGET_DIR=$(mktemp -d)\n    mkdir -p \"$CARGO_TARGET_DIR\"\n    # cleanup temporary directory\n    function cleanup {\n        # shellcheck disable=2317\n        rm -rf \"$CARGO_TARGET_DIR\"\n    }\n    # register the cleanup function to be called on the EXIT signal\n    trap cleanup EXIT\nfi\nexport CARGO_TARGET_DIR\n\nshared_object_extension=\"so\"\n# generate the Python stubs,\nif [ \"$(uname)\" == \"Darwin\" ]; then\n    shared_object_extension=\"dylib\"\n    export CARGO_TARGET_X86_64_APPLE_DARWIN_RUSTFLAGS=\"-C link-arg=-undefined -C link-arg=dynamic_lookup\"\n    export CARGO_TARGET_AARCH64_APPLE_DARWIN_RUSTFLAGS=\"-C link-arg=-undefined -C link-arg=dynamic_lookup\"\nfi\n\ncargo build --manifest-path \"$manifest\"\n# The link target have to end with .so to be sure it is importable by the stubgen.py script.\nln -sf \"$CARGO_TARGET_DIR/debug/lib$package.$shared_object_extension\" \"$CARGO_TARGET_DIR/debug/$package.so\"\nPYTHONPATH=$CARGO_TARGET_DIR/debug:$PYTHONPATH python3 \"$script_dir/stubgen.py\" \"$package\" \"$output\"\n\nexit 0\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server-python/stubgen_test.py",
    "content": "#  Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n#  SPDX-License-Identifier: Apache-2.0\n\nimport sys\nimport unittest\nfrom types import ModuleType\nfrom textwrap import dedent\nfrom pathlib import Path\nfrom tempfile import TemporaryDirectory\n\nfrom stubgen import Writer, walk_module\n\n\ndef create_module(name: str, code: str) -> ModuleType:\n    mod = ModuleType(name)\n    exec(dedent(code), mod.__dict__)\n    if not hasattr(mod, \"__all__\"):\n        # Manually populate `__all__` with all the members that doesn't start with `__`\n        mod.__all__ = [k for k in mod.__dict__.keys() if not k.startswith(\"__\")]  # type: ignore\n    sys.modules[name] = mod\n    return mod\n\n\nclass TestStubgen(unittest.TestCase):\n    def test_function_without_docstring(self):\n        self.single_mod(\n            \"\"\"\n            def foo():\n                pass\n            \"\"\",\n            \"\"\"\n            import typing\n\n            foo: typing.Any\n            \"\"\",\n        )\n\n    def test_regular_function(self):\n        self.single_mod(\n            \"\"\"\n            def foo(bar):\n                '''\n                :param bar str:\n                :rtype bool:\n                '''\n                pass\n            \"\"\",\n            \"\"\"\n            def foo(bar: str) -> bool:\n                ...\n            \"\"\",\n        )\n\n    def test_function_with_default_value(self):\n        self.single_mod(\n            \"\"\"\n            def foo(bar, qux=None):\n                '''\n                :param bar int:\n                :param qux typing.Optional[str]:\n                :rtype None:\n                '''\n                pass\n            \"\"\",\n            \"\"\"\n            import typing\n\n            def foo(bar: int, qux: typing.Optional[str] = ...) -> None:\n                ...\n            \"\"\",\n        )\n\n    def test_empty_class(self):\n        self.single_mod(\n            \"\"\"\n            class Foo:\n                pass\n            \"\"\",\n            \"\"\"\n            class Foo:\n                ...\n            \"\"\",\n        )\n\n    def test_class(self):\n        self.single_mod(\n            \"\"\"\n            class Foo:\n                @property\n                def bar(self):\n                    '''\n                    :type typing.List[bool]:\n                    '''\n                    pass\n\n                def qux(self, a, b, c):\n                    '''\n                    :param a typing.Dict[typing.List[int]]:\n                    :param b str:\n                    :param c float:\n                    :rtype typing.Union[int, str, bool]:\n                    '''\n                    pass\n            \"\"\",\n            \"\"\"\n            import typing\n\n            class Foo:\n                bar: typing.List[bool]\n\n                def qux(self, a: typing.Dict[typing.List[int]], b: str, c: float) -> typing.Union[int, str, bool]:\n                    ...\n            \"\"\",\n        )\n\n    def test_class_with_constructor_signature(self):\n        self.single_mod(\n            \"\"\"\n            class Foo:\n                '''\n                :param bar str:\n                :rtype None:\n                '''\n            \"\"\",\n            \"\"\"\n            class Foo:\n                def __init__(self, bar: str) -> None:\n                    ...\n            \"\"\",\n        )\n\n    def test_class_with_static_method(self):\n        self.single_mod(\n            \"\"\"\n            class Foo:\n                @staticmethod\n                def bar(name):\n                    '''\n                    :param name str:\n                    :rtype typing.List[bool]:\n                    '''\n                    pass\n            \"\"\",\n            \"\"\"\n            import typing\n\n            class Foo:\n                @staticmethod\n                def bar(name: str) -> typing.List[bool]:\n                    ...\n            \"\"\",\n        )\n\n    def test_class_with_an_undocumented_descriptor(self):\n        self.single_mod(\n            \"\"\"\n            class Foo:\n                @property\n                def bar(self):\n                    pass\n            \"\"\",\n            \"\"\"\n            import typing\n\n            class Foo:\n                bar: typing.Any\n            \"\"\",\n        )\n\n    def test_enum(self):\n        self.single_mod(\n            \"\"\"\n            class Foo:\n                def __init__(self, name):\n                    pass\n\n            Foo.Bar = Foo(\"Bar\")\n            Foo.Baz = Foo(\"Baz\")\n            Foo.Qux = Foo(\"Qux\")\n            \"\"\",\n            \"\"\"\n            class Foo:\n                Bar: Foo\n\n                Baz: Foo\n\n                Qux: Foo\n            \"\"\",\n        )\n\n    def test_generic(self):\n        self.single_mod(\n            \"\"\"\n            class Foo:\n                '''\n                :generic T:\n                :generic U:\n                :extends typing.Generic[T]:\n                :extends typing.Generic[U]:\n                '''\n\n                @property\n                def bar(self):\n                    '''\n                    :type typing.Tuple[T, U]:\n                    '''\n                    pass\n\n                def baz(self, a):\n                    '''\n                    :param a U:\n                    :rtype T:\n                    '''\n                    pass\n            \"\"\",\n            \"\"\"\n            import typing\n\n            T = typing.TypeVar('T')\n            U = typing.TypeVar('U')\n\n            class Foo(typing.Generic[T], typing.Generic[U]):\n                bar: typing.Tuple[T, U]\n\n                def baz(self, a: U) -> T:\n                    ...\n            \"\"\",\n        )\n\n    def test_items_with_docstrings(self):\n        self.single_mod(\n            \"\"\"\n            class Foo:\n                '''\n                This is the docstring of Foo.\n\n                And it has multiple lines.\n\n                :generic T:\n                :extends typing.Generic[T]:\n                :param member T:\n                '''\n\n                @property\n                def bar(self):\n                    '''\n                    This is the docstring of property `bar`.\n\n                    :type typing.Optional[T]:\n                    '''\n                    pass\n\n                def baz(self, t):\n                    '''\n                    This is the docstring of method `baz`.\n                    :param t T:\n                    :rtype T:\n                    '''\n                    pass\n            \"\"\",\n            '''\n            import typing\n\n            T = typing.TypeVar('T')\n\n            class Foo(typing.Generic[T]):\n                \"\"\"\n                This is the docstring of Foo.\n\n                And it has multiple lines.\n                \"\"\"\n\n                bar: typing.Optional[T]\n                \"\"\"\n                This is the docstring of property `bar`.\n                \"\"\"\n\n                def baz(self, t: T) -> T:\n                    \"\"\"\n                    This is the docstring of method `baz`.\n                    \"\"\"\n                    ...\n\n\n                def __init__(self, member: T) -> None:\n                    ...\n            ''',\n        )\n\n    def test_adds_default_to_optional_types(self):\n        # Since PyO3 provides `impl FromPyObject for Option<T>` and maps Python `None` to Rust `None`,\n        # you don't have to pass `None` explicitly. Type-stubs also shoudln't require `None`s\n        # to be passed explicitly (meaning they should have a default value).\n\n        self.single_mod(\n            \"\"\"\n            def foo(bar, qux):\n                '''\n                :param bar typing.Optional[int]:\n                :param qux typing.List[typing.Optional[int]]:\n                :rtype int:\n                '''\n                pass\n            \"\"\",\n            \"\"\"\n            import typing\n\n            def foo(bar: typing.Optional[int] = ..., qux: typing.List[typing.Optional[int]]) -> int:\n                ...\n            \"\"\",\n        )\n\n    def test_multiple_mods(self):\n        create_module(\n            \"foo.bar\",\n            \"\"\"\n            class Bar:\n                '''\n                :param qux str:\n                :rtype None:\n                '''\n                pass\n            \"\"\",\n        )\n\n        foo = create_module(\n            \"foo\",\n            \"\"\"\n            import sys\n\n            bar = sys.modules[\"foo.bar\"]\n\n            class Foo:\n                '''\n                :param a __root_module_name__.bar.Bar:\n                :param b typing.Optional[__root_module_name__.bar.Bar]:\n                :rtype None:\n                '''\n\n                @property\n                def a(self):\n                    '''\n                    :type __root_module_name__.bar.Bar:\n                    '''\n                    pass\n\n                @property\n                def b(self):\n                    '''\n                    :type typing.Optional[__root_module_name__.bar.Bar]:\n                    '''\n                    pass\n\n            __all__ = [\"bar\", \"Foo\"]\n            \"\"\",\n        )\n\n        with TemporaryDirectory() as temp_dir:\n            foo_path = Path(temp_dir) / \"foo.pyi\"\n            bar_path = Path(temp_dir) / \"bar\" / \"__init__.pyi\"\n\n            writer = Writer(foo_path, \"foo\")\n            walk_module(writer, foo)\n            writer.dump()\n\n            self.assert_stub(\n                foo_path,\n                \"\"\"\n                import foo.bar\n                import typing\n\n                class Foo:\n                    a: foo.bar.Bar\n\n                    b: typing.Optional[foo.bar.Bar]\n\n                    def __init__(self, a: foo.bar.Bar, b: typing.Optional[foo.bar.Bar] = ...) -> None:\n                        ...\n                \"\"\",\n            )\n\n            self.assert_stub(\n                bar_path,\n                \"\"\"\n                class Bar:\n                    def __init__(self, qux: str) -> None:\n                        ...\n                \"\"\",\n            )\n\n    def single_mod(self, mod_code: str, expected_stub: str) -> None:\n        with TemporaryDirectory() as temp_dir:\n            mod = create_module(\"test\", mod_code)\n            path = Path(temp_dir) / \"test.pyi\"\n\n            writer = Writer(path, \"test\")\n            walk_module(writer, mod)\n            writer.dump()\n\n            self.assert_stub(path, expected_stub)\n\n    def assert_stub(self, path: Path, expected: str) -> None:\n        self.assertEqual(path.read_text().strip(), dedent(expected).strip())\n\n\nif __name__ == \"__main__\":\n    unittest.main()\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server-typescript/Cargo.toml",
    "content": "[package]\nname = \"aws-smithy-http-server-typescript\"\nversion = \"0.1.2\"\nauthors = [\"Smithy Rust Server <smithy-rs-server@amazon.com>\"]\nedition = \"2021\"\nlicense = \"Apache-2.0\"\nrepository = \"https://github.com/smithy-lang/smithy-rs\"\nkeywords = [\"smithy\", \"framework\", \"web\", \"api\", \"aws\", \"typescript\"]\ncategories = [\"asynchronous\", \"web-programming\", \"api-bindings\"]\ndescription = \"\"\"\nTypescript server runtime for Smithy Rust Server Framework.\n\"\"\"\npublish = false\nrust-version = \"1.91.1\"\n\n[dependencies]\n\n[build-dependencies]\n\n[package.metadata.docs.rs]\nall-features = true\ntargets = [\"x86_64-unknown-linux-gnu\"]\ncargo-args = [\"-Zunstable-options\", \"-Zrustdoc-scrape-examples\"]\nrustdoc-args = [\"--cfg\", \"docsrs\"]\n# End of docs.rs metadata\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server-typescript/LICENSE",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server-typescript/README.md",
    "content": "# aws-smithy-http-server-typescript\n\nServer libraries for smithy-rs generated servers, targeting pure Typescript business logic.\n\n<!-- anchor_start:footer -->\nThis crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly.\n<!-- anchor_end:footer -->\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server-typescript/examples/.gitignore",
    "content": "pokemon-service-client/\npokemon-service-server-sdk/\n!.yarn/patches\n!.yarn/plugins\n!.yarn/releases\n!.yarn/sdks\n!.yarn/versions\n$RECYCLE.BIN/\n**/*.rs.bk\n*.cab\n*.icloud\n*.lcov\n*.lnk\n*.log\n*.msi\n*.msix\n*.msm\n*.msp\n*.node\n*.pid\n*.pid.lock\n*.seed\n*.stackdump\n*.tgz\n*.tsbuildinfo\n.AppleDB\n.AppleDesktop\n.AppleDouble\n.DS_Store\n.DocumentRevisions-V100\n.LSOverride\n.Spotlight-V100\n.TemporaryItems\n.Trashes\n.VolumeIcon.icns\n._*\n.apdisk\n.cache\n.cache/\n.com.apple.timemachine.donotpresent\n.dynamodb/\n.env\n.env.test\n.eslintcache\n.fseventsd\n.fusebox/\n.grunt\n.lock-wscript\n.next\n.node_repl_history\n.npm\n.nuxt\n.nyc_output\n.pnp.*\n.rpt2_cache/\n.rts2_cache_cjs/\n.rts2_cache_es/\n.rts2_cache_umd/\n.serverless/\n.tern-port\n.vscode-test\n.vuepress/dist\n.yarn-integrity\n.yarn/*\n/target\nCargo.lock\nIcon\nNetwork Trash Folder\nTemporary Items\nThumbs.db\nThumbs.db:encryptable\n[Dd]esktop.ini\nbower_components\nbuild/Release\ncoverage\ndist\nehthumbs.db\nehthumbs_vista.db\njspm_packages/\nlerna-debug.log*\nlib-cov\nlogs\nnode_modules/\nnpm-debug.log*\npids\nreport.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json\ntypings/\nyarn-debug.log*\nyarn-error.log*\npackage-lock.json\nindex.d.ts\nindex.js\npokemon-service-server-sdk.*.node\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server-typescript/examples/Cargo.toml",
    "content": "# Without this configuration, the workspace will be read from `rust-runtime`, causing the build to fail.\n[workspace]\nmembers = [\n    \"pokemon-service-server-sdk\",\n    \"pokemon-service-client\"\n]\n\n[profile.release]\nlto = true\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server-typescript/examples/Makefile",
    "content": "SRC_DIR := $(shell git rev-parse --show-toplevel)\nCUR_DIR := $(shell pwd)\nGRADLE := $(SRC_DIR)/gradlew\nSERVER_SDK_DST := $(CUR_DIR)/pokemon-service-server-sdk\nCLIENT_SDK_DST := $(CUR_DIR)/pokemon-service-client\nSERVER_SDK_SRC := $(SRC_DIR)/codegen-server-test/typescript/build/smithyprojections/codegen-server-test-typescript/pokemon-service-server-sdk/rust-server-codegen-typescript\nCLIENT_SDK_SRC := $(SRC_DIR)/codegen-client-test/build/smithyprojections/codegen-client-test/pokemon-service-client/rust-client-codegen\n\nall: codegen\n\ncodegen:\n\t$(GRADLE) --project-dir $(SRC_DIR) -P modules='pokemon-service-server-sdk,pokemon-service-client' :codegen-client-test:assemble :codegen-server-test:typescript:assemble\n\tmkdir -p $(SERVER_SDK_DST) $(CLIENT_SDK_DST)\n\tcp -av $(SERVER_SDK_SRC)/* $(SERVER_SDK_DST)/\n\tcp -av $(CLIENT_SDK_SRC)/* $(CLIENT_SDK_DST)/\n\nbuild:\n\tcd pokemon-service-server-sdk && npm run build:debug\n\tln -sf $(shell find pokemon-service-server-sdk -name '*.node') .\n\tln -sf pokemon-service-server-sdk/index.d.ts\n\tln -sf pokemon-service-server-sdk/index.js\n\nrelease:\n\tcd pokemon-service-server-sdk && npm run build\n\tln -sf $(shell find pokemon-service-server-sdk -name '*.node') .\n\tln -sf pokemon-service-server-sdk/index.d.ts\n\tln -sf pokemon-service-server-sdk/index.js\n\nrun: build\n\tts-node pokemon-service.ts\n\nrun-release: release\n\tts-node pokemon-service.ts\n\ndoc-open: codegen\n\tcargo doc --no-deps --open\n\nclean:\n\tcargo clean || echo \"Unable to run cargo clean\"\n\ndistclean: clean\n\trm -rf $(SERVER_SDK_DST) $(CLIENT_SDK_DST) $(CUR_DIR)/Cargo.lock pokemon-service-server-sdk.*.node index.d.ts\n\n.PHONY: all\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server-typescript/examples/README.md",
    "content": "# Smithy Rust/Typescript Server SDK example\n\nThis folder contains an example service called Pokémon Service used to showcase\nthe service framework Typescript bindings capabilities and to run benchmarks.\n\nThe Python implementation of the service can be found inside\n[pokemon_service.ts](/rust-runtime/aws-smithy-http-typescript-server/examples/pokemon_service.ts).\n\n## Depedencies\n\nTODO: Add NAPI installation instructions\n\n## Build\n\nSince this example requires both the server and client SDK to be code-generated\nfrom their [model](/codegen-server-test/model/pokemon.smithy), a Makefile is\nprovided to build and run the service. Just run `make build` to prepare the first\nbuild.\n\nOnce the example has been built successfully the first time, idiomatic `cargo`\ncan be used directly.\n\n`make distclean` can be used for a complete cleanup of all artefacts.\n\n## Test\n\n`cargo test` can be used to spawn the Python service and run some simple integration\ntests against it.\n\nMore info can be found in the `tests` folder of `pokemon-service-test` package.\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server-typescript/examples/package.json",
    "content": "{\n  \"devDependencies\": {\n    \"@types/node\": \"^18.15.7\"\n  }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server-typescript/examples/pokemon-service.ts",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport cluster from \"cluster\";\nimport { cpus } from \"os\";\n\nimport {\n    App,\n    TsHandlers,\n    GetPokemonSpeciesInput,\n    GetPokemonSpeciesOutput,\n    Language,\n    DoNothingInput,\n    DoNothingOutput,\n    TsSocket,\n    CheckHealthOutput,\n    CheckHealthInput,\n    GetServerStatisticsInput,\n    GetServerStatisticsOutput,\n} from \".\";\n\nclass HandlerImpl implements TsHandlers {\n    // TODO: implement\n    async doNothing(input: DoNothingInput): Promise<DoNothingOutput> {\n        return {};\n    }\n    // TODO: implement\n    async checkHealth(input: CheckHealthInput): Promise<CheckHealthOutput> {\n        return {};\n    }\n    // TODO: implement\n    async getServerStatistics(\n        input: GetServerStatisticsInput\n    ): Promise<GetServerStatisticsOutput> {\n        return { callsCount: 0 };\n    }\n    async getPokemonSpecies(\n        input: GetPokemonSpeciesInput,\n    ): Promise<GetPokemonSpeciesOutput> {\n        return {\n            name: input.name,\n            flavorTextEntries: [\n                {\n                    language: Language.English,\n                    flavorText:\n                        \"When several of these Pokémon gather, their electricity could build and cause lightning storms.\",\n                },\n                {\n                    language: Language.Italian,\n                    flavorText:\n                        \"Quando vari Pokémon di questo tipo si radunano, la loro energia può causare forti tempeste.\",\n                },\n                {\n                    language: Language.Spanish,\n                    flavorText:\n                        \"Cuando varios de estos Pokémon se juntan, su energía puede causar fuertes tormentas.\",\n                },\n                {\n                    language: Language.Japanese,\n                    flavorText:\n                        \"ほっぺたの りょうがわに ちいさい でんきぶくろを もつ。ピンチのときに ほうでんする。\",\n                },\n            ],\n        };\n    }\n}\n\n// Pass the handlers to the App.\nconst app = new App(new HandlerImpl());\n// Start the app 🤘\nconst numCPUs = cpus().length / 2;\nconst address =\"127.0.0.1\";\nconst port = 9090;\nconst socket = new TsSocket(address, port);\napp.start(socket);\n\n// TODO: This part should be abstracted out and done directly in Rust.\n// We could take an optional number of workers and the socket as input\n// of the App.start() method.\nif (cluster.isPrimary) {\n  console.log(`Listening on ${address}:${port}`);\n    // Fork workers.\n    for (let i = 0; i < numCPUs; i++) {\n        cluster.fork();\n    }\n}\n\nprocess.on(\"unhandledRejection\", err => {\n    console.error(\"Unhandled\")\n    console.error(err)\n})\nprocess.on(\"uncaughtException\", err => {\n    console.error(\"Uncaught\")\n    console.error(err)\n})\n"
  },
  {
    "path": "rust-runtime/aws-smithy-http-server-typescript/src/lib.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/* Automatically managed default lints */\n#![cfg_attr(docsrs, feature(doc_cfg))]\n/* End of automatically managed default lints */\n"
  },
  {
    "path": "rust-runtime/aws-smithy-json/Cargo.toml",
    "content": "[package]\nname = \"aws-smithy-json\"\nversion = \"0.62.5\"\nauthors = [\"AWS Rust SDK Team <aws-sdk-rust@amazon.com>\", \"John DiSanti <jdisanti@amazon.com>\"]\ndescription = \"Token streaming JSON parser for smithy-rs.\"\nedition = \"2021\"\nlicense = \"Apache-2.0\"\nrepository = \"https://github.com/smithy-lang/smithy-rs\"\nrust-version = \"1.91.1\"\n\n[dependencies]\naws-smithy-types = { path = \"../aws-smithy-types\" }\n\n[dev-dependencies]\nproptest = \"1\"\nserde_json = \"1.0\"\n\n[package.metadata.docs.rs]\nall-features = true\ntargets = [\"x86_64-unknown-linux-gnu\"]\ncargo-args = [\"-Zunstable-options\", \"-Zrustdoc-scrape-examples\"]\nrustdoc-args = [\"--cfg\", \"docsrs\"]\n# End of docs.rs metadata\n"
  },
  {
    "path": "rust-runtime/aws-smithy-json/LICENSE",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n"
  },
  {
    "path": "rust-runtime/aws-smithy-json/README.md",
    "content": "# aws-smithy-json\n\nJSON serialization and deserialization primitives for clients and servers generated by [smithy-rs](https://github.com/smithy-lang/smithy-rs).\n\n<!-- anchor_start:footer -->\nThis crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly.\n<!-- anchor_end:footer -->\n"
  },
  {
    "path": "rust-runtime/aws-smithy-json/TESTING.md",
    "content": "How to run JSONTestSuite against aws-smithy-json deserialize\n============================================================\n\nWhen making changes to the `deserialize` module, it is a good idea\nto run the changes against the [JSONTestSuite](https://github.com/nst/JSONTestSuite)\nand manually examine the test results.\n\n### How to setup the JSONTestSuite\n\n1. Clone the [JSONTestSuite](https://github.com/nst/JSONTestSuite) repository.\n2. In `JSONTestSuite/parsers`, create a new Cargo bin project named `test_json-aws_smithy_json`.\n3. Add the following dependencies to the `Cargo.toml` (be sure to replace `<local-path-to-smithy-rs>`:\n\n```\naws-smithy-json = { path = \"<local-path-to-smithy-rs>/rust-runtime/aws-smithy-json\" }\n```\n\n4. Replace the code in `main.rs` with:\n\n```rust\nuse std::fs::File;\nuse std::io::Read;\nuse std::env;\n\nuse aws_smithy_json::deserialize::{json_token_iter, Token, Error};\n\nfn main() {\n    let args: Vec<_> = env::args().collect();\n    if args.len() != 2 {\n        println!(\"Usage: {} file.json\", args[0]);\n        std::process::exit(1);\n    }\n\n    let ref path = args[1];\n    let mut s = String::new();\n    let mut f = File::open(path).expect(\"Unable to open file\");\n    match f.read_to_string(&mut s) {\n        Err(_) => std::process::exit(1),\n        Ok(_) => println!(\"{}\", s),\n    }\n\n    let result: Result<Vec<Token>, Error> = json_token_iter(s.as_bytes()).collect();\n    match result {\n        Err(_) => std::process::exit(1),\n        Ok(value) => if value.is_empty() {\n            std::process::exit(1)\n        } else {\n            // The test suite includes incomplete objects and arrays (i.e., \"[null,\").\n            // These are completely valid for this parser, so we'll just pretend to have\n            // failed to parse these to satisfy the test suite.\n            if value.first() == Some(&Token::StartObject) && value.last() != Some(&Token::EndObject) {\n                std::process::exit(1)\n            }\n            if value.first() == Some(&Token::StartArray) && value.last() != Some(&Token::EndArray) {\n                std::process::exit(1)\n            }\n            // Unescape all strings and fail if any of them failed to unescape.\n            for token in value {\n                if let Token::ValueString(escaped) = token {\n                    if escaped.into_unescaped().is_err() {\n                        std::process::exit(1)\n                    }\n                }\n            }\n            std::process::exit(0)\n        }\n    }\n}\n```\n\n5. Compile this program with `cargo build --release`.\n6. Modify `JSONTestSuite/run_tests.py` so that the `programs` dictionary only contains this one entry:\n\n```\nprograms = {\n   \"Rust aws-smithy-json\":\n       {\n           \"url\":\"dontcare\",\n           \"commands\":[os.path.join(PARSERS_DIR, \"test_json-aws_smithy_json/target/release/sj\")]\n       }\n}\n```\n\n7. Run `run_tests.py` and examine the output with a web browser by opening `JSONTestSuite/results/parsing.html`.\n\n### Examining the results\n\nWhen looking at `JSONTestSuite/results/parsing.html`, there is a matrix of test cases against their\nresults with a legend at the top.\n\nAny test result marked with blue or light blue is for a test case where correct behavior isn't specified,\nso use your best judgement to decide if it should have succeeded or failed.\n\nThe other colors are bad and should be carefully examined. At time of writing, the following test cases\nsucceed when they should fail, and we intentionally left it that way since we're not currently concerned\nabout being more lenient in the number parsing:\n\n```\nn_number_-01.json                           [-01]\nn_number_-2..json                           [-2.]\nn_number_0.e1.json                          [0.e1]\nn_number_2.e+3.json                         [2.e+3]\nn_number_2.e-3.json                         [2.e-3]\nn_number_2.e3.json                          [2.e3]\nn_number_neg_int_starting_with_zero.json    [-012]\nn_number_neg_real_without_int_part.json     [-.123]\nn_number_real_without_fractional_part.json  [1.]\nn_number_with_leading_zero.json             [012]\n```\n\nThis test case succeeds with our parser and that's OK since we're\na token streaming parser (multiple values are allowed):\n```\nn_structure_double_array.json               [][]\n```\n"
  },
  {
    "path": "rust-runtime/aws-smithy-json/external-types.toml",
    "content": "allowed_external_types = [\n    \"aws_smithy_types::*\",\n]\n"
  },
  {
    "path": "rust-runtime/aws-smithy-json/fuzz/.gitignore",
    "content": "\ntarget\ncorpus\nartifacts\ncoverage\ncoverage.profdata\ncoverage.profraw\n"
  },
  {
    "path": "rust-runtime/aws-smithy-json/fuzz/Cargo.toml",
    "content": "[package]\nname = \"aws-smithy-json-fuzz\"\nversion = \"0.0.0\"\nauthors = [\"AWS Rust SDK Team <aws-sdk-rust@amazon.com>\", \"John DiSanti <jdisanti@amazon.com>\"]\npublish = false\nedition = \"2021\"\n\n[package.metadata]\ncargo-fuzz = true\n\n[dependencies]\naws-smithy-json = { path = \"..\" }\naws-smithy-types = { path = \"../../aws-smithy-types\" }\n# Version pinned due to https://github.com/rust-fuzz/libfuzzer/issues/126\nlibfuzzer-sys = \"=0.4.7\"\nserde_json = { version = \"1\", features = [\"float_roundtrip\"] }\n\n# Prevent this from interfering with workspaces\n[workspace]\nmembers = [\".\"]\n\n[[bin]]\nname = \"json_deserialize\"\npath = \"fuzz_targets/json_deserialize.rs\"\ntest = false\ndoc = false\n\n[[bin]]\nname = \"json_deserialize_corpus_cov\"\npath = \"fuzz_targets/json_deserialize_corpus_cov.rs\"\ntest = false\ndoc = false\n"
  },
  {
    "path": "rust-runtime/aws-smithy-json/fuzz/fuzz_targets/common.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_smithy_json::deserialize::{Error, Token};\nuse aws_smithy_types::Number;\nuse serde_json::{Map, Value};\nuse std::iter::Peekable;\n\npub fn run_data(data: &[u8]) {\n    // Parse through with aws-smithy-json first to make sure it doesn't panic on invalid inputs\n    if let Ok(tokens) =\n        aws_smithy_json::deserialize::json_token_iter(data).collect::<Result<Vec<Token>, Error>>()\n    {\n        // Exercise string unescaping since the later comparison against Serde\n        // re-serializes, and thus, loses UTF-16 surrogate pairs.\n        for token in tokens {\n            if let Token::ValueString { value, .. } = token {\n                if let Ok(unescaped) = value.to_unescaped() {\n                    let serde_equiv =\n                        serde_json::from_str::<String>(&format!(\"\\\"{}\\\"\", value.as_escaped_str()))\n                            .unwrap();\n                    assert_eq!(serde_equiv, unescaped);\n                }\n            }\n        }\n    }\n\n    // Now parse with Serde, and if it's valid, compare the two and panic if different\n    let serde_value = serde_json::from_slice::<Value>(data);\n    if let Ok(value) = serde_value {\n        // Re-serialize to normalize the large floating point numbers\n        let json = serde_json::to_string(&value).unwrap();\n\n        let tokens = aws_smithy_json::deserialize::json_token_iter(json.as_bytes())\n            .collect::<Result<Vec<Token>, Error>>()\n            .unwrap();\n        let mut token_iter = tokens.into_iter().peekable();\n        let converted_value = convert_tokens(&mut token_iter);\n        assert_eq!(None, token_iter.next());\n        assert_eq!(value, converted_value);\n    }\n}\n\n/// Converts a token stream into a Serde [Value]\nfn convert_tokens<'a, I: Iterator<Item = Token<'a>>>(tokens: &mut Peekable<I>) -> Value {\n    match tokens.next().unwrap() {\n        Token::StartObject { .. } => {\n            let mut map = Map::new();\n            loop {\n                match tokens.next() {\n                    Some(Token::EndObject { .. }) => break,\n                    Some(Token::ObjectKey { key, .. }) => {\n                        let key = key.to_unescaped().unwrap().to_string();\n                        let value = convert_tokens(tokens);\n                        map.insert(key, value);\n                    }\n                    Some(_) => unreachable!(),\n                    None => panic!(\"should have encountered EndObject before end of stream\"),\n                }\n            }\n            Value::Object(map)\n        }\n        Token::StartArray { .. } => {\n            let mut list = Vec::new();\n            loop {\n                match tokens.peek() {\n                    Some(Token::EndArray { .. }) => {\n                        tokens.next();\n                        break;\n                    }\n                    Some(_) => {\n                        list.push(convert_tokens(tokens));\n                    }\n                    None => panic!(\"should have encountered EndArray before end of stream\"),\n                }\n            }\n            Value::Array(list)\n        }\n        Token::ValueNull { .. } => Value::Null,\n        Token::ValueNumber { value, .. } => Value::Number(match value {\n            Number::NegInt(value) => serde_json::Number::from(value),\n            Number::PosInt(value) => serde_json::Number::from(value),\n            Number::Float(value) => serde_json::Number::from_f64(value).unwrap(),\n        }),\n        Token::ValueString { value, .. } => Value::String(value.to_unescaped().unwrap().into()),\n        Token::ValueBool { value, .. } => Value::Bool(value),\n        _ => unreachable!(),\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-json/fuzz/fuzz_targets/json_deserialize.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n#![no_main]\nuse libfuzzer_sys::fuzz_target;\n\nmod common;\n\nfuzz_target!(|data: &[u8]| {\n    common::run_data(data);\n});\n"
  },
  {
    "path": "rust-runtime/aws-smithy-json/fuzz/fuzz_targets/json_deserialize_corpus_cov.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::fs::File;\nuse std::io::Read;\n\nmod common;\n\nfn main() {\n    let current_dir = std::env::current_dir().unwrap();\n    println!(\"cwd: {:?}\", current_dir);\n\n    let corpus_path = \"corpus/json_deserialize\";\n    for entry in std::fs::read_dir(corpus_path).unwrap() {\n        let path = entry.unwrap().path();\n        println!(\"Running {:?}\", path);\n\n        let mut data = Vec::new();\n        let mut file = File::open(path).unwrap();\n        file.read_to_end(&mut data).unwrap();\n\n        common::run_data(&data);\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-json/fuzz/show-corpus-coverage.sh",
    "content": "#!/bin/bash\n#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\n\n# Script that gathers coverage from the entire fuzz corpus and shows covered lines in the terminal.\nset -ex\n\n# Run instrumented json_deserialize_corpus_cov to run the entire fuzz corpus with coverage\nRUSTFLAGS=\"-Zinstrument-coverage\" LLVM_PROFILE_FILE=coverage.profraw cargo run --release --bin json_deserialize_corpus_cov\n\n# Convert raw coverage into profdata\ncargo profdata -- merge -sparse coverage.profraw -o coverage.profdata\n\n# Show coverage\ncargo cov -- show --use-color --ignore-filename-regex='/.cargo/registry' --instr-profile=coverage.profdata --object target/release/json_deserialize_corpus_cov --show-instantiations --show-line-counts-or-regions | less -R\n"
  },
  {
    "path": "rust-runtime/aws-smithy-json/proptest-regressions/deserialize/token.txt",
    "content": "# Seeds for failure cases proptest has generated in the past. It is\n# automatically read and these particular cases re-run before any\n# novel cases are generated.\n#\n# It is recommended to check this file in to source control so that\n# everyone who runs the test benefits from these saved cases.\ncc 5958c10ce80be9e3ebbdf2d6f827146a4336bed0375d72e9119d599ea0ffb39c # shrinks to num_str = \"-100000000000000000000\"\ncc d158bb67a58387c663e702343b556d846da5bc50eb6da14bc4b8459ab6ff6076 # shrinks to num_str = \"18450000000000000000\"\n"
  },
  {
    "path": "rust-runtime/aws-smithy-json/proptest-regressions/deserialize.txt",
    "content": "# Seeds for failure cases proptest has generated in the past. It is\n# automatically read and these particular cases re-run before any\n# novel cases are generated.\n#\n# It is recommended to check this file in to source control so that\n# everyone who runs the test benefits from these saved cases.\ncc cda46566473f973ff5d4a5224ef336decf0b508c61195b1cc0d331152a2ba84b # shrinks to num_str = \"10000000000000000000\"\n"
  },
  {
    "path": "rust-runtime/aws-smithy-json/src/deserialize/error.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::escape::EscapeError;\nuse std::borrow::Cow;\nuse std::error::Error as StdError;\nuse std::fmt;\nuse std::str::Utf8Error;\n\n#[derive(Debug)]\npub(in crate::deserialize) enum DeserializeErrorKind {\n    Custom {\n        message: Cow<'static, str>,\n        source: Option<Box<dyn StdError + Send + Sync + 'static>>,\n    },\n    ExpectedLiteral(String),\n    InvalidEscape(char),\n    InvalidNumber,\n    InvalidUtf8,\n    UnescapeFailed(EscapeError),\n    UnexpectedControlCharacter(u8),\n    UnexpectedEos,\n    UnexpectedToken(char, &'static str),\n}\n\n#[derive(Debug)]\npub struct DeserializeError {\n    pub(in crate::deserialize) kind: DeserializeErrorKind,\n    pub(in crate::deserialize) offset: Option<usize>,\n}\n\nimpl DeserializeError {\n    pub(in crate::deserialize) fn new(kind: DeserializeErrorKind, offset: Option<usize>) -> Self {\n        Self { kind, offset }\n    }\n\n    /// Returns a custom error without an offset.\n    pub fn custom(message: impl Into<Cow<'static, str>>) -> Self {\n        Self::new(\n            DeserializeErrorKind::Custom {\n                message: message.into(),\n                source: None,\n            },\n            None,\n        )\n    }\n\n    /// Returns a custom error with an error source without an offset.\n    pub fn custom_source(\n        message: impl Into<Cow<'static, str>>,\n        source: impl Into<Box<dyn StdError + Send + Sync + 'static>>,\n    ) -> Self {\n        Self::new(\n            DeserializeErrorKind::Custom {\n                message: message.into(),\n                source: Some(source.into()),\n            },\n            None,\n        )\n    }\n\n    /// Adds an offset to the error.\n    pub fn with_offset(mut self, offset: usize) -> Self {\n        self.offset = Some(offset);\n        self\n    }\n}\n\nimpl StdError for DeserializeError {\n    fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {\n        use DeserializeErrorKind::*;\n        match &self.kind {\n            UnescapeFailed(source) => Some(source),\n            Custom {\n                source: Some(source),\n                ..\n            } => Some(source.as_ref()),\n            Custom { source: None, .. }\n            | ExpectedLiteral(_)\n            | InvalidEscape(_)\n            | InvalidNumber\n            | InvalidUtf8\n            | UnexpectedControlCharacter(_)\n            | UnexpectedToken(..)\n            | UnexpectedEos => None,\n        }\n    }\n}\n\nimpl fmt::Display for DeserializeError {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        use DeserializeErrorKind::*;\n        if let Some(offset) = self.offset {\n            write!(f, \"Error at offset {offset}: \")?;\n        }\n        match &self.kind {\n            Custom { message, .. } => write!(f, \"failed to parse JSON: {message}\"),\n            ExpectedLiteral(literal) => write!(f, \"expected literal: {literal}\"),\n            InvalidEscape(escape) => write!(f, \"invalid JSON escape: \\\\{escape}\"),\n            InvalidNumber => write!(f, \"invalid number\"),\n            InvalidUtf8 => write!(f, \"invalid UTF-8 codepoint in JSON stream\"),\n            UnescapeFailed(_) => write!(f, \"failed to unescape JSON string\"),\n            UnexpectedControlCharacter(value) => write!(\n                f,\n                \"encountered unescaped control character in string: 0x{value:X}\"\n            ),\n            UnexpectedToken(token, expected) => {\n                write!(f, \"unexpected token '{token}'. Expected one of {expected}\",)\n            }\n            UnexpectedEos => write!(f, \"unexpected end of stream\"),\n        }\n    }\n}\n\nimpl From<Utf8Error> for DeserializeErrorKind {\n    fn from(_: Utf8Error) -> Self {\n        DeserializeErrorKind::InvalidUtf8\n    }\n}\n\nimpl From<EscapeError> for DeserializeError {\n    fn from(err: EscapeError) -> Self {\n        Self {\n            kind: DeserializeErrorKind::UnescapeFailed(err),\n            offset: None,\n        }\n    }\n}\n\nimpl From<aws_smithy_types::error::TryFromNumberError> for DeserializeError {\n    fn from(_: aws_smithy_types::error::TryFromNumberError) -> Self {\n        Self {\n            kind: DeserializeErrorKind::InvalidNumber,\n            offset: None,\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-json/src/deserialize/token.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::deserialize::error::DeserializeError as Error;\nuse crate::deserialize::must_not_be_finite;\nuse crate::escape::unescape_string;\npub use crate::escape::EscapeError;\nuse aws_smithy_types::date_time::Format;\nuse aws_smithy_types::primitive::Parse;\nuse aws_smithy_types::{base64, Blob, DateTime, Document, Number};\nuse std::borrow::Cow;\nuse std::collections::HashMap;\nuse std::iter::Peekable;\n\n/// New-type around `&str` that indicates the string is an escaped JSON string.\n/// Provides functions for retrieving the string in either form.\n#[derive(Debug, PartialEq, Eq, Copy, Clone)]\npub struct EscapedStr<'a>(&'a str);\n\nimpl<'a> EscapedStr<'a> {\n    pub fn new(value: &'a str) -> EscapedStr<'a> {\n        EscapedStr(value)\n    }\n\n    /// Returns the escaped string value\n    pub fn as_escaped_str(&self) -> &'a str {\n        self.0\n    }\n\n    /// Unescapes the string and returns it.\n    /// If the string doesn't need unescaping, it will be returned directly.\n    pub fn to_unescaped(self) -> Result<Cow<'a, str>, EscapeError> {\n        unescape_string(self.0)\n    }\n}\n\n/// Represents the location of a token\n#[derive(Debug, Eq, PartialEq, Copy, Clone)]\npub struct Offset(pub usize);\n\nimpl Offset {\n    /// Creates a custom error from the offset\n    pub fn error(&self, msg: Cow<'static, str>) -> Error {\n        Error::custom(msg).with_offset(self.0)\n    }\n}\n\n/// Enum representing the different JSON tokens that can be returned by\n/// [`crate::deserialize::json_token_iter`].\n#[derive(Debug, PartialEq)]\npub enum Token<'a> {\n    StartArray {\n        offset: Offset,\n    },\n    EndArray {\n        offset: Offset,\n    },\n    ObjectKey {\n        offset: Offset,\n        key: EscapedStr<'a>,\n    },\n    StartObject {\n        offset: Offset,\n    },\n    EndObject {\n        offset: Offset,\n    },\n    ValueBool {\n        offset: Offset,\n        value: bool,\n    },\n    ValueNull {\n        offset: Offset,\n    },\n    ValueNumber {\n        offset: Offset,\n        value: Number,\n    },\n    ValueString {\n        offset: Offset,\n        value: EscapedStr<'a>,\n    },\n}\n\nimpl Token<'_> {\n    pub fn offset(&self) -> Offset {\n        use Token::*;\n        *match self {\n            StartArray { offset } => offset,\n            EndArray { offset } => offset,\n            ObjectKey { offset, .. } => offset,\n            StartObject { offset } => offset,\n            EndObject { offset } => offset,\n            ValueBool { offset, .. } => offset,\n            ValueNull { offset } => offset,\n            ValueNumber { offset, .. } => offset,\n            ValueString { offset, .. } => offset,\n        }\n    }\n\n    /// Builds an error from the token's offset\n    pub fn error(&self, msg: Cow<'static, str>) -> Error {\n        self.offset().error(msg)\n    }\n}\n\nmacro_rules! expect_fn {\n    ($name:ident, $token:ident, $doc:tt) => {\n        #[doc=$doc]\n        pub fn $name(token_result: Option<Result<Token<'_>, Error>>) -> Result<(), Error> {\n            match token_result.transpose()? {\n                Some(Token::$token { .. }) => Ok(()),\n                Some(token) => {\n                    Err(token.error(Cow::Borrowed(concat!(\"expected \", stringify!($token)))))\n                }\n                None => Err(Error::custom(concat!(\"expected \", stringify!($token)))),\n            }\n        }\n    };\n}\n\nexpect_fn!(\n    expect_start_object,\n    StartObject,\n    \"Expects a [Token::StartObject] token and returns an error if it's not present.\"\n);\nexpect_fn!(\n    expect_start_array,\n    StartArray,\n    \"Expects a [Token::StartArray] token and returns an error if it's not present.\"\n);\n\nmacro_rules! expect_value_or_null_fn {\n    ($name:ident, $token:ident, $typ:ident, $doc:tt) => {\n        #[doc=$doc]\n        #[allow(unknown_lints)]\n        #[allow(mismatched_lifetime_syntaxes)]\n        pub fn $name(token: Option<Result<Token<'_>, Error>>) -> Result<Option<$typ>, Error> {\n            match token.transpose()? {\n                Some(Token::ValueNull { .. }) => Ok(None),\n                Some(Token::$token { value, .. }) => Ok(Some(value)),\n                _ => Err(Error::custom(concat!(\n                    \"expected \",\n                    stringify!($token),\n                    \" or ValueNull\"\n                ))),\n            }\n        }\n    };\n}\n\nexpect_value_or_null_fn!(expect_bool_or_null, ValueBool, bool, \"Expects a [Token::ValueBool] or [Token::ValueNull], and returns the bool value if it's not null.\");\nexpect_value_or_null_fn!(expect_string_or_null, ValueString, EscapedStr, \"Expects a [Token::ValueString] or [Token::ValueNull], and returns the [EscapedStr] value if it's not null.\");\n\n/// Expects a [Token::ValueString], [Token::ValueNumber] or [Token::ValueNull].\n///\n/// If the value is a string, it MUST be `Infinity`, `-Infinity` or `Nan`.\n/// If the value is a number, it is returned directly\npub fn expect_number_or_null(\n    token: Option<Result<Token<'_>, Error>>,\n) -> Result<Option<Number>, Error> {\n    match token.transpose()? {\n        Some(Token::ValueNull { .. }) => Ok(None),\n        Some(Token::ValueNumber { value, offset, .. }) => {\n            // Validate finite numbers - error on infinity/NaN\n            match value {\n                Number::Float(f) if !f.is_finite() => {\n                    Err(Error::custom(\"number must be finite\").with_offset(offset.0))\n                }\n                _ => Ok(Some(value)),\n            }\n        }\n        Some(Token::ValueString { value, offset }) => match value.to_unescaped() {\n            Err(err) => Err(Error::custom_source( \"expected a valid string, escape was invalid\", err).with_offset(offset.0)),\n            Ok(v) => f64::parse_smithy_primitive(v.as_ref())\n                // disregard the exact error\n                .map_err(|_|())\n                // only infinite / NaN can be used as strings\n                .and_then(must_not_be_finite)\n                .map(|float| Some(aws_smithy_types::Number::Float(float)))\n                // convert to a helpful error\n                .map_err(|_| {\n                    Error::custom(\n                        format!(\n                        \"only `Infinity`, `-Infinity`, `NaN` can represent a float as a string but found `{v}`\"\n                    )).with_offset(offset.0)\n                }),\n        },\n        _ => Err(Error::custom(\n            \"expected ValueString, ValueNumber, or ValueNull\",\n        )),\n    }\n}\n\n/// Expects a [Token::ValueNumber] or [Token::ValueNull], and returns the number as a string\n/// to preserve arbitrary precision.\n///\n/// This function extracts the raw JSON number string without converting it to u64/i64/f64,\n/// which would cause precision loss for numbers larger than those types can represent.\n/// This is essential for BigInteger and BigDecimal support.\n///\n/// # Arguments\n/// * `token` - The token to extract the number from\n/// * `input` - The original JSON input bytes (needed to extract the raw number string)\n///\n/// # Returns\n/// * `Ok(Some(string))` - The number as a string slice\n/// * `Ok(None)` - If the token is null\n/// * `Err` - If the token is not a number or null\npub fn expect_number_as_string_or_null<'a>(\n    token: Option<Result<Token<'a>, Error>>,\n    input: &'a [u8],\n) -> Result<Option<&'a str>, Error> {\n    match token.transpose()? {\n        Some(Token::ValueNull { .. }) => Ok(None),\n        Some(Token::ValueNumber { offset, .. }) => {\n            let start = offset.0;\n            let mut end = start;\n\n            // Skip optional minus sign\n            if end < input.len() && input[end] == b'-' {\n                end += 1;\n            }\n\n            // Scan digits, decimal point, exponent\n            while end < input.len() {\n                match input[end] {\n                    b'0'..=b'9' | b'.' | b'e' | b'E' | b'+' | b'-' => end += 1,\n                    _ => break,\n                }\n            }\n\n            let number_slice = &input[start..end];\n            let number_str = std::str::from_utf8(number_slice)\n                .map_err(|_| Error::custom(\"invalid UTF-8 in number\"))?;\n            Ok(Some(number_str))\n        }\n        _ => Err(Error::custom(\"expected ValueNumber or ValueNull\")),\n    }\n}\n\n/// Expects a [Token::ValueString] or [Token::ValueNull]. If the value is a string, it interprets it as a base64 encoded [Blob] value.\npub fn expect_blob_or_null(token: Option<Result<Token<'_>, Error>>) -> Result<Option<Blob>, Error> {\n    Ok(match expect_string_or_null(token)? {\n        Some(value) => Some(Blob::new(\n            base64::decode(value.as_escaped_str())\n                .map_err(|err| Error::custom_source(\"failed to decode base64\", err))?,\n        )),\n        None => None,\n    })\n}\n\n/// Expects a [Token::ValueNull], [Token::ValueString], or [Token::ValueNumber] depending\n/// on the passed in `timestamp_format`. If there is a non-null value, it interprets it as an\n/// [`DateTime` ] in the requested format.\npub fn expect_timestamp_or_null(\n    token: Option<Result<Token<'_>, Error>>,\n    timestamp_format: Format,\n) -> Result<Option<DateTime>, Error> {\n    Ok(match timestamp_format {\n        Format::EpochSeconds => expect_number_or_null(token)?\n            .map(|v| v.to_f64_lossy())\n            .map(|v| {\n                if v.is_nan() {\n                    Err(Error::custom(\"NaN is not a valid epoch\"))\n                } else if v.is_infinite() {\n                    Err(Error::custom(\"infinity is not a valid epoch\"))\n                } else {\n                    Ok(DateTime::from_secs_f64(v))\n                }\n            })\n            .transpose()?,\n        Format::DateTime | Format::HttpDate | Format::DateTimeWithOffset => {\n            expect_string_or_null(token)?\n                .map(|v| DateTime::from_str(v.as_escaped_str(), timestamp_format))\n                .transpose()\n                .map_err(|err| Error::custom_source(\"failed to parse timestamp\", err))?\n        }\n    })\n}\n\n/// Expects and parses a complete document value.\npub fn expect_document<'a, I>(tokens: &mut Peekable<I>) -> Result<Document, Error>\nwhere\n    I: Iterator<Item = Result<Token<'a>, Error>>,\n{\n    expect_document_inner(tokens, 0)\n}\n\nconst MAX_DOCUMENT_RECURSION: usize = 256;\n\nfn expect_document_inner<'a, I>(tokens: &mut Peekable<I>, depth: usize) -> Result<Document, Error>\nwhere\n    I: Iterator<Item = Result<Token<'a>, Error>>,\n{\n    if depth >= MAX_DOCUMENT_RECURSION {\n        return Err(Error::custom(\n            \"exceeded max recursion depth while parsing document\",\n        ));\n    }\n    match tokens.next().transpose()? {\n        Some(Token::ValueNull { .. }) => Ok(Document::Null),\n        Some(Token::ValueBool { value, .. }) => Ok(Document::Bool(value)),\n        Some(Token::ValueNumber { value, .. }) => Ok(Document::Number(value)),\n        Some(Token::ValueString { value, .. }) => {\n            Ok(Document::String(value.to_unescaped()?.into_owned()))\n        }\n        Some(Token::StartObject { .. }) => {\n            let mut object = HashMap::new();\n            loop {\n                match tokens.next().transpose()? {\n                    Some(Token::EndObject { .. }) => break,\n                    Some(Token::ObjectKey { key, .. }) => {\n                        let key = key.to_unescaped()?.into_owned();\n                        let value = expect_document_inner(tokens, depth + 1)?;\n                        object.insert(key, value);\n                    }\n                    _ => return Err(Error::custom(\"expected object key or end object\")),\n                }\n            }\n            Ok(Document::Object(object))\n        }\n        Some(Token::StartArray { .. }) => {\n            let mut array = Vec::new();\n            loop {\n                match tokens.peek() {\n                    Some(Ok(Token::EndArray { .. })) => {\n                        tokens.next().transpose().unwrap();\n                        break;\n                    }\n                    _ => array.push(expect_document_inner(tokens, depth + 1)?),\n                }\n            }\n            Ok(Document::Array(array))\n        }\n        Some(Token::EndObject { .. }) | Some(Token::ObjectKey { .. }) => {\n            unreachable!(\"end object and object key are handled in start object\")\n        }\n        Some(Token::EndArray { .. }) => unreachable!(\"end array is handled in start array\"),\n        None => Err(Error::custom(\"expected value\")),\n    }\n}\n\n/// Skips an entire value in the token stream. Errors if it isn't a value.\npub fn skip_value<'a>(\n    tokens: &mut impl Iterator<Item = Result<Token<'a>, Error>>,\n) -> Result<(), Error> {\n    skip_inner(0, tokens)\n}\n\n/// Assumes a start object/array token has already been consumed and skips tokens until\n/// until its corresponding end object/array token is found.\npub fn skip_to_end<'a>(\n    tokens: &mut impl Iterator<Item = Result<Token<'a>, Error>>,\n) -> Result<(), Error> {\n    skip_inner(1, tokens)\n}\n\nfn skip_inner<'a>(\n    depth: isize,\n    tokens: &mut impl Iterator<Item = Result<Token<'a>, Error>>,\n) -> Result<(), Error> {\n    loop {\n        match tokens.next().transpose()? {\n            Some(Token::StartObject { .. }) | Some(Token::StartArray { .. }) => {\n                skip_inner(depth + 1, tokens)?;\n                if depth == 0 {\n                    break;\n                }\n            }\n            Some(Token::EndObject { .. }) | Some(Token::EndArray { .. }) => {\n                debug_assert!(depth > 0);\n                break;\n            }\n            Some(Token::ValueNull { .. })\n            | Some(Token::ValueBool { .. })\n            | Some(Token::ValueNumber { .. })\n            | Some(Token::ValueString { .. }) => {\n                if depth == 0 {\n                    break;\n                }\n            }\n            Some(Token::ObjectKey { .. }) => {}\n            _ => return Err(Error::custom(\"expected value\")),\n        }\n    }\n    Ok(())\n}\n\n#[cfg(test)]\npub mod test {\n    use super::*;\n    use crate::deserialize::error::DeserializeErrorKind as ErrorKind;\n    use crate::deserialize::error::DeserializeErrorKind::UnexpectedToken;\n    use crate::deserialize::json_token_iter;\n\n    pub fn start_array<'a>(offset: usize) -> Option<Result<Token<'a>, Error>> {\n        Some(Ok(Token::StartArray {\n            offset: Offset(offset),\n        }))\n    }\n\n    pub fn end_array<'a>(offset: usize) -> Option<Result<Token<'a>, Error>> {\n        Some(Ok(Token::EndArray {\n            offset: Offset(offset),\n        }))\n    }\n\n    pub fn start_object<'a>(offset: usize) -> Option<Result<Token<'a>, Error>> {\n        Some(Ok(Token::StartObject {\n            offset: Offset(offset),\n        }))\n    }\n\n    pub fn end_object<'a>(offset: usize) -> Option<Result<Token<'a>, Error>> {\n        Some(Ok(Token::EndObject {\n            offset: Offset(offset),\n        }))\n    }\n\n    pub fn object_key(offset: usize, key: &str) -> Option<Result<Token<'_>, Error>> {\n        Some(Ok(Token::ObjectKey {\n            offset: Offset(offset),\n            key: EscapedStr::new(key),\n        }))\n    }\n\n    pub fn value_bool<'a>(offset: usize, boolean: bool) -> Option<Result<Token<'a>, Error>> {\n        Some(Ok(Token::ValueBool {\n            offset: Offset(offset),\n            value: boolean,\n        }))\n    }\n\n    pub fn value_number<'a>(offset: usize, number: Number) -> Option<Result<Token<'a>, Error>> {\n        Some(Ok(Token::ValueNumber {\n            offset: Offset(offset),\n            value: number,\n        }))\n    }\n\n    pub fn value_null<'a>(offset: usize) -> Option<Result<Token<'a>, Error>> {\n        Some(Ok(Token::ValueNull {\n            offset: Offset(offset),\n        }))\n    }\n\n    pub fn value_string(offset: usize, string: &str) -> Option<Result<Token<'_>, Error>> {\n        Some(Ok(Token::ValueString {\n            offset: Offset(offset),\n            value: EscapedStr::new(string),\n        }))\n    }\n\n    #[track_caller]\n    fn expect_err_custom<T>(message: &str, offset: Option<usize>, result: Result<T, Error>) {\n        let err = result.err().expect(\"expected error\");\n        let (actual_message, actual_offset) = match &err.kind {\n            ErrorKind::Custom { message, .. } => (message.as_ref(), err.offset),\n            _ => panic!(\"expected ErrorKind::Custom, got {err:?}\"),\n        };\n        assert_eq!((message, offset), (actual_message, actual_offset));\n    }\n\n    #[test]\n    fn skip_simple_value() {\n        let mut tokens = json_token_iter(b\"null true\");\n        skip_value(&mut tokens).unwrap();\n        assert!(matches!(\n            tokens.next(),\n            Some(Ok(Token::ValueBool { value: true, .. }))\n        ))\n    }\n\n    #[test]\n    fn skip_array() {\n        let mut tokens = json_token_iter(b\"[1, 2, 3, 4] true\");\n        skip_value(&mut tokens).unwrap();\n        assert!(matches!(\n            tokens.next(),\n            Some(Ok(Token::ValueBool { value: true, .. }))\n        ))\n    }\n\n    #[test]\n    fn skip_object() {\n        let mut tokens = json_token_iter(b\"{\\\"one\\\": 5, \\\"two\\\": 3} true\");\n        skip_value(&mut tokens).unwrap();\n        assert!(matches!(\n            tokens.next(),\n            Some(Ok(Token::ValueBool { value: true, .. }))\n        ))\n    }\n\n    #[test]\n    fn test_skip_to_end() {\n        let tokens = json_token_iter(b\"{\\\"one\\\": { \\\"two\\\": [] }, \\\"three\\\":2 }\");\n        let mut tokens = tokens.skip(2);\n        assert!(matches!(tokens.next(), Some(Ok(Token::StartObject { .. }))));\n        skip_to_end(&mut tokens).unwrap();\n        match tokens.next() {\n            Some(Ok(Token::ObjectKey { key, .. })) => {\n                assert_eq!(\"three\", key.as_escaped_str());\n            }\n            _ => panic!(\"expected object key three\"),\n        }\n    }\n\n    #[test]\n    fn test_non_finite_floats() {\n        let mut tokens = json_token_iter(b\"inf\");\n        tokens\n            .next()\n            .expect(\"there is a token\")\n            .expect_err(\"but it is invalid, ensure that Rust float boundary cases don't parse\");\n    }\n\n    #[test]\n    fn mismatched_braces() {\n        // The skip_value function doesn't need to explicitly handle these cases since\n        // token iterator's parser handles them. This test confirms that assumption.\n        assert!(matches!(\n            skip_value(&mut json_token_iter(br#\"[{\"foo\": 5]}\"#)),\n            Err(Error {\n                kind: UnexpectedToken(']', \"'}', ','\"),\n                offset: Some(10)\n            })\n        ));\n        assert!(matches!(\n            skip_value(&mut json_token_iter(br#\"{\"foo\": 5]}\"#)),\n            Err(Error {\n                kind: UnexpectedToken(']', \"'}', ','\"),\n                offset: Some(9)\n            })\n        ));\n        assert!(matches!(\n            skip_value(&mut json_token_iter(br#\"[5,6}\"#)),\n            Err(Error {\n                kind: UnexpectedToken('}', \"']', ','\"),\n                offset: Some(4)\n            })\n        ));\n    }\n\n    #[test]\n    fn skip_nested() {\n        let mut tokens = json_token_iter(\n            br#\"\n            {\"struct\": {\"foo\": 5, \"bar\": 11, \"arr\": [1, 2, 3, {}, 5, []]},\n             \"arr\": [[], [[]], [{\"arr\":[]}]],\n             \"simple\": \"foo\"}\n            true\n        \"#,\n        );\n        skip_value(&mut tokens).unwrap();\n        assert!(matches!(\n            tokens.next(),\n            Some(Ok(Token::ValueBool { value: true, .. }))\n        ))\n    }\n\n    #[test]\n    fn test_expect_start_object() {\n        expect_err_custom(\n            \"expected StartObject\",\n            Some(2),\n            expect_start_object(value_bool(2, true)),\n        );\n        assert!(expect_start_object(start_object(0)).is_ok());\n    }\n\n    #[test]\n    fn test_expect_start_array() {\n        expect_err_custom(\n            \"expected StartArray\",\n            Some(2),\n            expect_start_array(value_bool(2, true)),\n        );\n        assert!(expect_start_array(start_array(0)).is_ok());\n    }\n\n    #[test]\n    fn test_expect_string_or_null() {\n        assert_eq!(None, expect_string_or_null(value_null(0)).unwrap());\n        assert_eq!(\n            Some(EscapedStr(\"test\\\\n\")),\n            expect_string_or_null(value_string(0, \"test\\\\n\")).unwrap()\n        );\n        expect_err_custom(\n            \"expected ValueString or ValueNull\",\n            None,\n            expect_string_or_null(value_bool(0, true)),\n        );\n    }\n\n    #[test]\n    fn test_expect_number_or_null() {\n        assert_eq!(None, expect_number_or_null(value_null(0)).unwrap());\n        assert_eq!(\n            Some(Number::PosInt(5)),\n            expect_number_or_null(value_number(0, Number::PosInt(5))).unwrap()\n        );\n        expect_err_custom(\n            \"expected ValueString, ValueNumber, or ValueNull\",\n            None,\n            expect_number_or_null(value_bool(0, true)),\n        );\n        assert_eq!(\n            Some(Number::Float(f64::INFINITY)),\n            expect_number_or_null(value_string(0, \"Infinity\")).unwrap()\n        );\n        expect_err_custom(\n            \"only `Infinity`, `-Infinity`, `NaN` can represent a float as a string but found `123`\",\n            Some(0),\n            expect_number_or_null(value_string(0, \"123\")),\n        );\n        match expect_number_or_null(value_string(0, \"NaN\")) {\n            Ok(Some(Number::Float(v))) if v.is_nan() => {\n                // ok\n            }\n            not_ok => {\n                panic!(\"expected nan, found: {not_ok:?}\")\n            }\n        }\n\n        // Test that infinity in ValueNumber token returns an error\n        let result = expect_number_or_null(value_number(0, Number::Float(f64::INFINITY)));\n        assert!(result.is_err(), \"Expected error for infinity token\");\n    }\n\n    #[test]\n    fn test_expect_blob_or_null() {\n        assert_eq!(None, expect_blob_or_null(value_null(0)).unwrap());\n        assert_eq!(\n            Some(Blob::new(b\"hello!\".to_vec())),\n            expect_blob_or_null(value_string(0, \"aGVsbG8h\")).unwrap()\n        );\n        expect_err_custom(\n            \"expected ValueString or ValueNull\",\n            None,\n            expect_blob_or_null(value_bool(0, true)),\n        );\n    }\n\n    #[test]\n    fn test_expect_timestamp_or_null() {\n        assert_eq!(\n            None,\n            expect_timestamp_or_null(value_null(0), Format::HttpDate).unwrap()\n        );\n        for (invalid, display_name) in &[\n            (\"NaN\", \"NaN\"),\n            (\"Infinity\", \"infinity\"),\n            (\"-Infinity\", \"infinity\"),\n        ] {\n            expect_err_custom(\n                format!(\"{display_name} is not a valid epoch\").as_str(),\n                None,\n                expect_timestamp_or_null(value_string(0, invalid), Format::EpochSeconds),\n            );\n        }\n        assert_eq!(\n            Some(DateTime::from_secs_f64(2048.0)),\n            expect_timestamp_or_null(value_number(0, Number::Float(2048.0)), Format::EpochSeconds)\n                .unwrap()\n        );\n        assert_eq!(\n            Some(DateTime::from_secs_f64(1445412480.0)),\n            expect_timestamp_or_null(\n                value_string(0, \"Wed, 21 Oct 2015 07:28:00 GMT\"),\n                Format::HttpDate\n            )\n            .unwrap()\n        );\n        assert_eq!(\n            Some(DateTime::from_secs_f64(1445412480.0)),\n            expect_timestamp_or_null(value_string(0, \"2015-10-21T07:28:00Z\"), Format::DateTime)\n                .unwrap()\n        );\n        expect_err_custom(\n                \"only `Infinity`, `-Infinity`, `NaN` can represent a float as a string but found `wrong`\",\n                Some(0),\n            expect_timestamp_or_null(value_string(0, \"wrong\"), Format::EpochSeconds)\n        );\n        expect_err_custom(\n            \"expected ValueString or ValueNull\",\n            None,\n            expect_timestamp_or_null(value_number(0, Number::Float(0.0)), Format::DateTime),\n        );\n    }\n\n    #[test]\n    fn test_expect_document() {\n        let test = |value| expect_document(&mut json_token_iter(value).peekable()).unwrap();\n        assert_eq!(Document::Null, test(b\"null\"));\n        assert_eq!(Document::Bool(true), test(b\"true\"));\n        assert_eq!(Document::Number(Number::Float(3.2)), test(b\"3.2\"));\n        assert_eq!(Document::String(\"Foo\\nBar\".into()), test(b\"\\\"Foo\\\\nBar\\\"\"));\n        assert_eq!(Document::Array(Vec::new()), test(b\"[]\"));\n        assert_eq!(Document::Object(HashMap::new()), test(b\"{}\"));\n        assert_eq!(\n            Document::Array(vec![\n                Document::Number(Number::PosInt(1)),\n                Document::Bool(false),\n                Document::String(\"s\".into()),\n                Document::Array(Vec::new()),\n                Document::Object(HashMap::new()),\n            ]),\n            test(b\"[1,false,\\\"s\\\",[],{}]\")\n        );\n        assert_eq!(\n            Document::Object(\n                vec![\n                    (\"num\".to_string(), Document::Number(Number::PosInt(1))),\n                    (\"bool\".to_string(), Document::Bool(true)),\n                    (\"string\".to_string(), Document::String(\"s\".into())),\n                    (\n                        \"array\".to_string(),\n                        Document::Array(vec![\n                            Document::Object(\n                                vec![(\"foo\".to_string(), Document::Bool(false))]\n                                    .into_iter()\n                                    .collect(),\n                            ),\n                            Document::Object(\n                                vec![(\"bar\".to_string(), Document::Bool(true))]\n                                    .into_iter()\n                                    .collect(),\n                            ),\n                        ])\n                    ),\n                    (\n                        \"nested\".to_string(),\n                        Document::Object(\n                            vec![(\"test\".to_string(), Document::Null),]\n                                .into_iter()\n                                .collect()\n                        )\n                    ),\n                ]\n                .into_iter()\n                .collect()\n            ),\n            test(\n                br#\"\n                { \"num\": 1,\n                  \"bool\": true,\n                  \"string\": \"s\",\n                  \"array\":\n                      [{ \"foo\": false },\n                       { \"bar\": true }],\n                  \"nested\": { \"test\": null } }\n                \"#\n            )\n        );\n    }\n\n    #[test]\n    fn test_document_recursion_limit() {\n        let mut value = String::new();\n        value.extend(std::iter::repeat_n('[', 300));\n        value.extend(std::iter::repeat_n(']', 300));\n        expect_err_custom(\n            \"exceeded max recursion depth while parsing document\",\n            None,\n            expect_document(&mut json_token_iter(value.as_bytes()).peekable()),\n        );\n\n        value = String::new();\n        value.extend(std::iter::repeat_n(\"{\\\"t\\\":\", 300));\n        value.push('1');\n        value.extend(std::iter::repeat_n('}', 300));\n        expect_err_custom(\n            \"exceeded max recursion depth while parsing document\",\n            None,\n            expect_document(&mut json_token_iter(value.as_bytes()).peekable()),\n        );\n    }\n\n    #[test]\n    fn test_expect_number_as_string_preserves_precision() {\n        use crate::deserialize::json_token_iter;\n\n        // Test large integer that fits in u64 but would lose precision in f64\n        // f64 has 53 bits of precision, so numbers > 2^53 lose precision\n        let input = b\"18450000000000000000\"; // 2^53 + 1, loses precision in f64\n        let mut iter = json_token_iter(input);\n        let result = expect_number_as_string_or_null(iter.next(), input).unwrap();\n        assert_eq!(result, Some(\"18450000000000000000\"));\n\n        // Test large negative integer\n        let input = b\"-9007199254740993\";\n        let mut iter = json_token_iter(input);\n        let result = expect_number_as_string_or_null(iter.next(), input).unwrap();\n        assert_eq!(result, Some(\"-9007199254740993\"));\n\n        // Test decimal with many digits\n        let input = b\"123456789.123456789\";\n        let mut iter = json_token_iter(input);\n        let result = expect_number_as_string_or_null(iter.next(), input).unwrap();\n        assert_eq!(result, Some(\"123456789.123456789\"));\n\n        // Test scientific notation\n        let input = b\"1.23e+50\";\n        let mut iter = json_token_iter(input);\n        let result = expect_number_as_string_or_null(iter.next(), input).unwrap();\n        assert_eq!(result, Some(\"1.23e+50\"));\n\n        // Test negative scientific notation\n        let input = b\"-1.23e-50\";\n        let mut iter = json_token_iter(input);\n        let result = expect_number_as_string_or_null(iter.next(), input).unwrap();\n        assert_eq!(result, Some(\"-1.23e-50\"));\n\n        // Test null\n        let input = b\"null\";\n        let mut iter = json_token_iter(input);\n        let result = expect_number_as_string_or_null(iter.next(), input).unwrap();\n        assert_eq!(result, None);\n\n        // Test small numbers still work\n        let input = b\"42\";\n        let mut iter = json_token_iter(input);\n        let result = expect_number_as_string_or_null(iter.next(), input).unwrap();\n        assert_eq!(result, Some(\"42\"));\n\n        // Test zero\n        let input = b\"0\";\n        let mut iter = json_token_iter(input);\n        let result = expect_number_as_string_or_null(iter.next(), input).unwrap();\n        assert_eq!(result, Some(\"0\"));\n\n        // Test lowercase e in scientific notation is preserved\n        let input = b\"2.5e-8\";\n        let mut iter = json_token_iter(input);\n        let result = expect_number_as_string_or_null(iter.next(), input).unwrap();\n        assert_eq!(result, Some(\"2.5e-8\"));\n\n        // Test uppercase E in scientific notation is preserved\n        let input = b\"2.5E-8\";\n        let mut iter = json_token_iter(input);\n        let result = expect_number_as_string_or_null(iter.next(), input).unwrap();\n        assert_eq!(result, Some(\"2.5E-8\"));\n    }\n\n    #[test]\n    fn test_expect_number_as_string_error_cases() {\n        use crate::deserialize::json_token_iter;\n\n        // Test error when token is a string (not a number)\n        let input = b\"\\\"not a number\\\"\";\n        let mut iter = json_token_iter(input);\n        let result = expect_number_as_string_or_null(iter.next(), input);\n        assert!(result.is_err());\n\n        // Test error when token is a boolean\n        let input = b\"true\";\n        let mut iter = json_token_iter(input);\n        let result = expect_number_as_string_or_null(iter.next(), input);\n        assert!(result.is_err());\n\n        // Test error when token is an object\n        let input = b\"{}\";\n        let mut iter = json_token_iter(input);\n        let result = expect_number_as_string_or_null(iter.next(), input);\n        assert!(result.is_err());\n\n        // Test error when token is an array\n        let input = b\"[]\";\n        let mut iter = json_token_iter(input);\n        let result = expect_number_as_string_or_null(iter.next(), input);\n        assert!(result.is_err());\n    }\n\n    // Property-based tests to validate with random inputs\n    mod proptest_tests {\n        use super::*;\n        use crate::deserialize::json_token_iter;\n        use proptest::prelude::*;\n\n        proptest! {\n            #[test]\n            fn extracted_large_integer_matches_input(\n                // Generate 20-100 digit numbers (way bigger than i64 max: 19 digits)\n                num_str in \"[1-9][0-9]{19,99}\"\n            ) {\n                let input_bytes = num_str.as_bytes();\n                let mut iter = json_token_iter(input_bytes);\n                let result = expect_number_as_string_or_null(iter.next(), input_bytes)?;\n\n                prop_assert_eq!(result, Some(num_str.as_str()));\n            }\n\n            #[test]\n            fn extracted_large_negative_integer_matches_input(\n                // Generate negative numbers with 20-100 digits\n                num_str in \"-[1-9][0-9]{19,99}\"\n            ) {\n                let input_bytes = num_str.as_bytes();\n                let mut iter = json_token_iter(input_bytes);\n                let result = expect_number_as_string_or_null(iter.next(), input_bytes)?;\n\n                prop_assert_eq!(result, Some(num_str.as_str()));\n            }\n\n            #[test]\n            fn extracted_scientific_notation_matches_input(\n                mantissa in -999999999i64..999999999i64,\n                exponent in -100i32..100i32\n            ) {\n                let input = format!(\"{}e{}\", mantissa, exponent);\n                let input_bytes = input.as_bytes();\n\n                let mut iter = json_token_iter(input_bytes);\n                let result = expect_number_as_string_or_null(iter.next(), input_bytes)?;\n\n                prop_assert_eq!(result, Some(input.as_str()));\n            }\n\n            #[test]\n            fn null_always_returns_none(\n                // Generate random whitespace/formatting around null\n                prefix in \"[ \\t\\n\\r]*\",\n                suffix in \"[ \\t\\n\\r]*\"\n            ) {\n                let input = format!(\"{}null{}\", prefix, suffix);\n                let input_bytes = input.as_bytes();\n\n                let mut iter = json_token_iter(input_bytes);\n                let result = expect_number_as_string_or_null(iter.next(), input_bytes)?;\n\n                prop_assert_eq!(result, None);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-json/src/deserialize.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::deserialize::error::{DeserializeError as Error, DeserializeErrorKind as ErrorKind};\nuse aws_smithy_types::Number;\nuse ErrorKind::*;\n\npub mod error;\npub mod token;\n\npub use token::{EscapeError, EscapedStr, Offset, Token};\n\n/// JSON token parser as a Rust iterator\n///\n/// This parser will parse and yield exactly one [`Token`] per iterator `next()` call.\n/// Validation is done on the fly, so it is possible for it to parse an invalid JSON document\n/// until it gets to the first [`Error`].\n///\n/// JSON string values are left escaped in the [`Token::ValueString`] as an [`EscapedStr`],\n/// which is a new type around a slice of original `input` bytes so that the caller can decide\n/// when to unescape and allocate into a [`String`].\n///\n/// The parser *will* accept multiple valid JSON values. For example, `b\"null true\"` will\n/// yield `ValueNull` and `ValueTrue`. It is the responsibility of the caller to handle this for\n/// their use-case.\npub fn json_token_iter(input: &[u8]) -> JsonTokenIterator<'_> {\n    JsonTokenIterator {\n        input,\n        index: 0,\n        state_stack: vec![State::Initial],\n    }\n}\n\n/// Internal parser state for the iterator. Used to context between successive `next` calls.\n#[derive(Copy, Clone, Debug, Eq, PartialEq)]\nenum State {\n    /// Entry point. Expecting any JSON value.\n    Initial,\n    /// Expecting the next token to be the *first* value in an array, or the end of the array.\n    ArrayFirstValueOrEnd,\n    /// Expecting the next token to the next value in an array, or the end of the array.\n    ArrayNextValueOrEnd,\n    /// Expecting the next token to be the *first* key in the object, or the end of the object.\n    ObjectFirstKeyOrEnd,\n    /// Expecting the next token to the next object key, or the end of the object.\n    ObjectNextKeyOrEnd,\n    /// Expecting the next token to be the value of a field in an object.\n    ObjectFieldValue,\n}\n\n/// An iterator over a `&[u8]` that yields `Result<Token, Error>` with [Token] being JSON tokens.\n/// Construct with [json_token_iter].\npub struct JsonTokenIterator<'a> {\n    input: &'a [u8],\n    index: usize,\n    state_stack: Vec<State>,\n}\n\nimpl<'a> JsonTokenIterator<'a> {\n    /// Previews the next byte.\n    fn peek_byte(&self) -> Option<u8> {\n        if self.index >= self.input.len() {\n            None\n        } else {\n            Some(self.input[self.index])\n        }\n    }\n\n    /// Expects there to be another byte coming up, and previews it.\n    /// If there isn't, an `UnexpectedEOS` error is returned.\n    fn peek_expect(&self) -> Result<u8, Error> {\n        self.peek_byte().ok_or_else(|| self.error(UnexpectedEos))\n    }\n\n    /// Advances to the next byte in the stream.\n    fn advance(&mut self) {\n        if self.index < self.input.len() {\n            self.index += 1;\n        }\n    }\n\n    /// Advances and returns the next byte in the stream.\n    fn next_byte(&mut self) -> Option<u8> {\n        let next = self.peek_byte();\n        self.advance();\n        next\n    }\n\n    /// Expects there to be another byte coming up, and returns it while advancing.\n    /// If there isn't, an `UnexpectedEOS` error is returned.\n    fn next_expect(&mut self) -> Result<u8, Error> {\n        self.next_byte().ok_or_else(|| self.error(UnexpectedEos))\n    }\n\n    /// Creates an error at the given `offset` in the stream.\n    fn error_at(&self, offset: usize, kind: ErrorKind) -> Error {\n        Error::new(kind, Some(offset))\n    }\n\n    /// Creates an error at the current offset in the stream.\n    fn error(&self, kind: ErrorKind) -> Error {\n        self.error_at(self.index, kind)\n    }\n\n    /// Advances until it hits a non-whitespace character or the end of the slice.\n    fn discard_whitespace(&mut self) {\n        while let Some(byte) = self.peek_byte() {\n            match byte {\n                b' ' | b'\\t' | b'\\r' | b'\\n' => {\n                    self.advance();\n                }\n                _ => break,\n            }\n        }\n    }\n\n    /// Returns the top of the state stack (current state).\n    fn state(&self) -> State {\n        self.state_stack[self.state_stack.len() - 1]\n    }\n\n    /// Replaces the top of the state stack with a new `state`.\n    fn replace_state(&mut self, state: State) {\n        self.state_stack.pop();\n        self.state_stack.push(state);\n    }\n\n    /// Returns current offset\n    fn offset(&self) -> Offset {\n        Offset(self.index)\n    }\n\n    /// Discards the '{' character and pushes the `ObjectFirstKeyOrEnd` state.\n    fn start_object(&mut self) -> Token<'a> {\n        let offset = self.offset();\n        let byte = self.next_byte();\n        debug_assert_eq!(byte, Some(b'{'));\n        self.state_stack.push(State::ObjectFirstKeyOrEnd);\n        Token::StartObject { offset }\n    }\n\n    /// Discards the '}' character and pops the current state.\n    fn end_object(&mut self) -> Token<'a> {\n        let offset = self.offset();\n        let (byte, state) = (self.next_byte(), self.state_stack.pop());\n        debug_assert_eq!(byte, Some(b'}'));\n        debug_assert!(\n            state == Some(State::ObjectFirstKeyOrEnd) || state == Some(State::ObjectNextKeyOrEnd)\n        );\n        Token::EndObject { offset }\n    }\n\n    /// Discards the '[' character and pushes the `ArrayFirstValueOrEnd` state.\n    fn start_array(&mut self) -> Token<'a> {\n        let offset = self.offset();\n        let byte = self.next_byte();\n        debug_assert_eq!(byte, Some(b'['));\n        self.state_stack.push(State::ArrayFirstValueOrEnd);\n        Token::StartArray { offset }\n    }\n\n    /// Discards the ']' character and pops the current state.\n    fn end_array(&mut self) -> Token<'a> {\n        let offset = self.offset();\n        let (byte, state) = (self.next_byte(), self.state_stack.pop());\n        debug_assert_eq!(byte, Some(b']'));\n        debug_assert!(\n            state == Some(State::ArrayFirstValueOrEnd) || state == Some(State::ArrayNextValueOrEnd)\n        );\n        Token::EndArray { offset }\n    }\n\n    /// Reads a JSON string out of the stream.\n    fn read_string(&mut self) -> Result<&'a str, Error> {\n        // Skip the starting quote\n        let quote_byte = self.next_byte();\n        debug_assert_eq!(quote_byte, Some(b'\\\"'));\n\n        // Read bytes until a non-escaped end-quote, unescaping sequences as needed on the fly\n        let start = self.index;\n        loop {\n            match self.peek_expect()? {\n                b'\"' => {\n                    let value = std::str::from_utf8(&self.input[start..self.index])\n                        .map_err(|_| self.error(InvalidUtf8))?;\n                    self.advance();\n                    return Ok(value);\n                }\n                b'\\\\' => match self.next_expect()? {\n                    b'\\\\' | b'/' | b'\"' | b'b' | b'f' | b'n' | b'r' | b't' => self.advance(),\n                    b'u' => {\n                        if self.index + 4 > self.input.len() {\n                            return Err(self.error_at(self.input.len(), UnexpectedEos));\n                        }\n                        self.index += 4;\n                    }\n                    byte => return Err(self.error(InvalidEscape(byte.into()))),\n                },\n                byte @ 0x00..=0x1F => return Err(self.error(UnexpectedControlCharacter(byte))),\n                _ => self.advance(),\n            }\n        }\n    }\n\n    /// Expects the given literal to be next in the stream.\n    fn expect_literal(&mut self, expected: &[u8]) -> Result<(), Error> {\n        let (start, end) = (self.index, self.index + expected.len());\n        if end > self.input.len() {\n            return Err(self.error_at(self.input.len(), UnexpectedEos));\n        }\n        if expected != &self.input[start..end] {\n            return Err(self.error_at(\n                start,\n                ExpectedLiteral(std::str::from_utf8(expected).unwrap().into()),\n            ));\n        }\n        self.index = end;\n        Ok(())\n    }\n\n    /// Expects a literal `null` next in the stream.\n    fn expect_null(&mut self) -> Result<Token<'a>, Error> {\n        let offset = self.offset();\n        self.expect_literal(b\"null\")?;\n        Ok(Token::ValueNull { offset })\n    }\n\n    /// Expects a boolean `true` / `false` to be next in the stream and returns its value.\n    fn expect_bool(&mut self) -> Result<Token<'a>, Error> {\n        let offset = self.offset();\n        match self.peek_expect()? {\n            b't' => {\n                self.expect_literal(b\"true\")?;\n                Ok(Token::ValueBool {\n                    offset,\n                    value: true,\n                })\n            }\n            b'f' => {\n                self.expect_literal(b\"false\")?;\n                Ok(Token::ValueBool {\n                    offset,\n                    value: false,\n                })\n            }\n            _ => unreachable!(\n                \"this function must only be called when the next character is 't' or 'f'\"\n            ),\n        }\n    }\n\n    /// Advances passed the exponent part of a floating point number.\n    fn skip_exponent(&mut self) {\n        self.advance();\n        match self.peek_byte() {\n            Some(b'-') => self.advance(),\n            Some(b'+') => self.advance(),\n            _ => {}\n        }\n        while let Some(b'0'..=b'9') = self.peek_byte() {\n            self.advance();\n        }\n    }\n\n    /// Advances passed the decimal part of a floating point number.\n    fn skip_decimal(&mut self) {\n        self.advance();\n        while let Some(byte) = self.peek_byte() {\n            match byte {\n                b'0'..=b'9' => self.advance(),\n                b'e' | b'E' => self.skip_exponent(),\n                _ => break,\n            }\n        }\n    }\n\n    /// Starting from the current location in the stream, this advances until\n    /// it finds a character that doesn't look like its part of a number, and then\n    /// returns `(start_index, end_index, negative, floating)`, with `start_index`\n    /// and `end_index` representing the slice of the stream that is the number,\n    /// `negative` whether or not it is a negative number, and `floating` whether or not\n    /// the number contains a decimal point and/or an exponent.\n    fn scan_number(&mut self) -> (usize, usize, bool, bool) {\n        let start_index = self.index;\n        let negative = if self.peek_byte() == Some(b'-') {\n            self.advance();\n            true\n        } else {\n            false\n        };\n        let mut floating = false;\n        while let Some(byte) = self.peek_byte() {\n            match byte {\n                b'0'..=b'9' => self.advance(),\n                b'.' => {\n                    floating = true;\n                    self.skip_decimal();\n                }\n                b'e' | b'E' => {\n                    floating = true;\n                    self.skip_exponent();\n                }\n                _ => break,\n            }\n        }\n        (start_index, self.index, negative, floating)\n    }\n\n    /// Expects a number in the stream, and returns its value.\n    fn expect_number(&mut self) -> Result<Token<'a>, Error> {\n        let offset = self.offset();\n        let (start, end, negative, floating) = self.scan_number();\n        let number_slice = &self.input[start..end];\n\n        // Unsafe: we examined every character in the range, and they are all number characters\n        debug_assert!(std::str::from_utf8(number_slice).is_ok());\n        let number_str = unsafe { std::str::from_utf8_unchecked(number_slice) };\n\n        use std::str::FromStr;\n        Ok(Token::ValueNumber {\n            offset,\n            value: if floating {\n                Number::Float(\n                    f64::from_str(number_str).map_err(|_| self.error_at(start, InvalidNumber))?,\n                )\n            } else if negative {\n                // If the negative value overflows, then stuff it into an f64\n                match u64::from_str(&number_str[1..]) {\n                    Ok(positive) => {\n                        // Check if the positive value fits in i64's negative range\n                        if positive <= i64::MAX as u64 {\n                            Number::NegInt(-(positive as i64))\n                        } else if positive == (i64::MAX as u64) + 1 {\n                            // Special case: i64::MIN\n                            Number::NegInt(i64::MIN)\n                        } else {\n                            // Too large for i64, use f64\n                            Number::Float(-(positive as f64))\n                        }\n                    }\n                    Err(_) => {\n                        // Number too large for u64, parse as f64 (may be infinity)\n                        Number::Float(\n                            f64::from_str(number_str)\n                                .map_err(|_| self.error_at(start, InvalidNumber))?,\n                        )\n                    }\n                }\n            } else {\n                // Try to parse as u64, fall back to f64 if too large\n                match u64::from_str(number_str) {\n                    Ok(n) => Number::PosInt(n),\n                    Err(_) => {\n                        // Number too large for u64, parse as f64 (may be infinity)\n                        Number::Float(\n                            f64::from_str(number_str)\n                                .map_err(|_| self.error_at(start, InvalidNumber))?,\n                        )\n                    }\n                }\n            },\n        })\n    }\n\n    /// Reads a value from the stream and returns the next token. For objects and arrays,\n    /// the entire object or array will not be ready, but rather, a [Token::StartObject]/[Token::StartArray]\n    /// will be returned.\n    fn read_value(&mut self) -> Result<Token<'a>, Error> {\n        self.discard_whitespace();\n        let offset = self.offset();\n        match self.peek_expect()? {\n            b'{' => Ok(self.start_object()),\n            b'[' => Ok(self.start_array()),\n            b'\"' => self.read_string().map(|s| Token::ValueString {\n                offset,\n                value: EscapedStr::new(s),\n            }),\n            byte => {\n                let value = match byte {\n                    b'n' => self.expect_null(),\n                    b't' | b'f' => self.expect_bool(),\n                    b'-' | (b'0'..=b'9') => self.expect_number(),\n                    byte => Err(self.error(UnexpectedToken(\n                        byte.into(),\n                        \"'{', '[', '\\\"', 'null', 'true', 'false', <number>\",\n                    ))),\n                }?;\n                // Verify there are no unexpected trailers on the end of the value\n                if let Some(byte) = self.peek_byte() {\n                    match byte {\n                        b' ' | b'\\t' | b'\\r' | b'\\n' | b'}' | b']' | b',' => {}\n                        _ => {\n                            return Err(self.error(UnexpectedToken(\n                                byte.into(),\n                                \"<whitespace>, '}', ']', ','\",\n                            )))\n                        }\n                    }\n                }\n                Ok(value)\n            }\n        }\n    }\n\n    /// Handles the [State::ArrayFirstValueOrEnd] state.\n    fn state_array_first_value_or_end(&mut self) -> Result<Token<'a>, Error> {\n        match self.peek_expect()? {\n            b']' => Ok(self.end_array()),\n            _ => {\n                self.replace_state(State::ArrayNextValueOrEnd);\n                self.read_value()\n            }\n        }\n    }\n\n    /// Handles the [State::ArrayNextValueOrEnd] state.\n    fn state_array_next_value_or_end(&mut self) -> Result<Token<'a>, Error> {\n        match self.peek_expect()? {\n            b']' => Ok(self.end_array()),\n            b',' => {\n                self.advance();\n                self.read_value()\n            }\n            byte => Err(self.error(UnexpectedToken(byte.into(), \"']', ','\"))),\n        }\n    }\n\n    /// Expects an object key.\n    fn object_key(&mut self) -> Result<Token<'a>, Error> {\n        let offset = self.offset();\n        match self.peek_expect()? {\n            b'\"' => {\n                self.replace_state(State::ObjectFieldValue);\n                self.read_string().map(|s| Token::ObjectKey {\n                    offset,\n                    key: EscapedStr::new(s),\n                })\n            }\n            byte => Err(self.error(UnexpectedToken(byte.into(), \"'\\\"'\"))),\n        }\n    }\n\n    /// Handles the [State::ObjectFirstKeyOrEnd] state.\n    fn state_object_first_key_or_end(&mut self) -> Result<Token<'a>, Error> {\n        match self.peek_expect()? {\n            b'}' => Ok(self.end_object()),\n            _ => self.object_key(),\n        }\n    }\n\n    /// Handles the [State::ObjectNextKeyOrEnd] state.\n    fn state_object_next_key_or_end(&mut self) -> Result<Token<'a>, Error> {\n        match self.peek_expect()? {\n            b'}' => Ok(self.end_object()),\n            b',' => {\n                self.advance();\n                self.discard_whitespace();\n                self.object_key()\n            }\n            byte => Err(self.error(UnexpectedToken(byte.into(), \"'}', ','\"))),\n        }\n    }\n\n    /// Handles the [State::ObjectFieldValue] state.\n    fn state_object_field_value(&mut self) -> Result<Token<'a>, Error> {\n        match self.peek_expect()? {\n            b':' => {\n                self.advance();\n                self.replace_state(State::ObjectNextKeyOrEnd);\n                self.read_value()\n            }\n            byte => Err(self.error(UnexpectedToken(byte.into(), \"':'\"))),\n        }\n    }\n}\n\nimpl<'a> Iterator for JsonTokenIterator<'a> {\n    type Item = Result<Token<'a>, Error>;\n\n    fn next(&mut self) -> Option<Self::Item> {\n        debug_assert!(self.index <= self.input.len());\n        if self.index == self.input.len() {\n            return None;\n        }\n\n        self.discard_whitespace();\n        let result = match self.state() {\n            State::Initial => self.peek_byte().map(|_| self.read_value()),\n            State::ArrayFirstValueOrEnd => Some(self.state_array_first_value_or_end()),\n            State::ArrayNextValueOrEnd => Some(self.state_array_next_value_or_end()),\n            State::ObjectFirstKeyOrEnd => Some(self.state_object_first_key_or_end()),\n            State::ObjectNextKeyOrEnd => Some(self.state_object_next_key_or_end()),\n            State::ObjectFieldValue => Some(self.state_object_field_value()),\n        };\n        // Invalidate the stream if we encountered an error\n        if result.as_ref().map(|r| r.is_err()).unwrap_or(false) {\n            self.index = self.input.len();\n        }\n        result\n    }\n}\n\nfn must_not_be_finite(f: f64) -> Result<f64, ()> {\n    if !f.is_finite() {\n        Ok(f)\n    } else {\n        Err(())\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use crate::deserialize::error::{DeserializeError as Error, DeserializeErrorKind as ErrorKind};\n    use crate::deserialize::token::expect_number_as_string_or_null;\n    use crate::deserialize::token::test::{\n        end_array, end_object, object_key, start_array, start_object, value_bool, value_null,\n        value_number, value_string,\n    };\n    use crate::deserialize::{json_token_iter, EscapedStr, Token};\n    use aws_smithy_types::Number;\n    use proptest::prelude::*;\n\n    #[track_caller]\n    fn expect_token(\n        expected: Option<Result<Token<'_>, Error>>,\n        actual: Option<Result<Token<'_>, Error>>,\n    ) {\n        let (expected, actual) = (\n            expected.transpose().expect(\"err in expected\"),\n            actual.transpose().expect(\"err in actual\"),\n        );\n        assert_eq!(expected, actual);\n    }\n\n    macro_rules! expect_err {\n        ($kind:pat, $offset:expr, $value:expr) => {\n            let err: Error = $value.transpose().err().expect(\"expected error\");\n            assert!(matches!(err.kind, $kind));\n            assert_eq!($offset, err.offset);\n        };\n    }\n\n    #[test]\n    fn test_empty() {\n        assert!(json_token_iter(b\"\").next().is_none());\n        assert!(json_token_iter(b\" \").next().is_none());\n        assert!(json_token_iter(b\"\\t\").next().is_none());\n    }\n\n    #[test]\n    fn test_empty_string() {\n        let mut iter = json_token_iter(b\"\\\"\\\"\");\n        expect_token(value_string(0, \"\"), iter.next());\n        expect_token(None, iter.next());\n\n        let mut iter = json_token_iter(b\" \\r\\n\\t \\\"\\\"  \");\n        expect_token(value_string(5, \"\"), iter.next());\n        expect_token(None, iter.next());\n    }\n\n    #[test]\n    fn test_empty_array() {\n        let mut iter = json_token_iter(b\"[]\");\n        expect_token(start_array(0), iter.next());\n        expect_token(end_array(1), iter.next());\n        expect_token(None, iter.next());\n    }\n\n    #[test]\n    fn test_empty_object() {\n        let mut iter = json_token_iter(b\"{}\");\n        expect_token(start_object(0), iter.next());\n        expect_token(end_object(1), iter.next());\n        expect_token(None, iter.next());\n    }\n\n    #[test]\n    fn test_null() {\n        expect_token(value_null(1), json_token_iter(b\" null \").next());\n\n        let mut iter = json_token_iter(b\"[null, null,null]\");\n        expect_token(start_array(0), iter.next());\n        expect_token(value_null(1), iter.next());\n        expect_token(value_null(7), iter.next());\n        expect_token(value_null(12), iter.next());\n        expect_token(end_array(16), iter.next());\n        expect_token(None, iter.next());\n\n        assert!(json_token_iter(b\"n\").next().unwrap().is_err());\n        assert!(json_token_iter(b\"nul\").next().unwrap().is_err());\n        assert!(json_token_iter(b\"nulll\").next().unwrap().is_err());\n    }\n\n    #[test]\n    fn test_bools() {\n        assert!(json_token_iter(b\"tru\").next().unwrap().is_err());\n        assert!(json_token_iter(b\"truee\").next().unwrap().is_err());\n        assert!(json_token_iter(b\"f\").next().unwrap().is_err());\n        assert!(json_token_iter(b\"falsee\").next().unwrap().is_err());\n        expect_token(value_bool(1, true), json_token_iter(b\" true \").next());\n        expect_token(value_bool(0, false), json_token_iter(b\"false\").next());\n\n        let mut iter = json_token_iter(b\"[true,false]\");\n        expect_token(start_array(0), iter.next());\n        expect_token(value_bool(1, true), iter.next());\n        expect_token(value_bool(6, false), iter.next());\n        expect_token(end_array(11), iter.next());\n        expect_token(None, iter.next());\n    }\n\n    proptest! {\n        #[test]\n        fn string_prop_test(input in \".*\") {\n            let json: String = serde_json::to_string(&input).unwrap();\n            let mut iter = json_token_iter(json.as_bytes());\n            expect_token(value_string(0, &json[1..(json.len() - 1)]), iter.next());\n            expect_token(None, iter.next());\n        }\n\n        #[test]\n        fn integer_prop_test(input: i64) {\n            let json = serde_json::to_string(&input).unwrap();\n            let mut iter = json_token_iter(json.as_bytes());\n            let expected = if input < 0 {\n                Number::NegInt(input)\n            } else {\n                Number::PosInt(input as u64)\n            };\n            expect_token(value_number(0, expected), iter.next());\n            expect_token(None, iter.next());\n        }\n\n        #[test]\n        fn float_prop_test(input: f64) {\n            let json = serde_json::to_string(&input).unwrap();\n            let mut iter = json_token_iter(json.as_bytes());\n            expect_token(value_number(0, Number::Float(input)), iter.next());\n            expect_token(None, iter.next());\n        }\n    }\n\n    #[test]\n    fn valid_numbers() {\n        let expect = |number, input| {\n            expect_token(value_number(0, number), json_token_iter(input).next());\n        };\n        expect(Number::Float(0.0), b\"0.\");\n        expect(Number::Float(0.0), b\"0e0\");\n        expect(Number::Float(0.0), b\"0E0\");\n        expect(Number::Float(10.0), b\"1E1\");\n        expect(Number::Float(10.0), b\"1E+1\");\n        expect(Number::Float(100.0), b\"1e+2\");\n\n        expect(Number::NegInt(-50000), b\"-50000\");\n        expect(\n            Number::Float(-18446744073709551615.0),\n            b\"-18446744073709551615\",\n        );\n    }\n\n    #[test]\n    fn out_of_range_floats_produce_infinity() {\n        // Values exceeding f64::MAX should tokenize as infinity\n        // The consumer layer (token.rs) will convert to NaN for BigInteger/BigDecimal\n        let expect_infinity = |input, should_be_positive| {\n            let token = json_token_iter(input).next().unwrap().unwrap();\n            if let Token::ValueNumber {\n                value: Number::Float(f),\n                ..\n            } = token\n            {\n                assert!(\n                    f.is_infinite(),\n                    \"Expected infinity for out-of-range value, got {}\",\n                    f\n                );\n                if should_be_positive {\n                    assert!(f.is_sign_positive(), \"Expected positive infinity\");\n                } else {\n                    assert!(f.is_sign_negative(), \"Expected negative infinity\");\n                }\n            } else {\n                panic!(\"Expected Float token, got {:?}\", token);\n            }\n        };\n\n        // Values > f64::MAX\n        expect_infinity(b\"1.8e308\", true);\n        expect_infinity(b\"9.9e999\", true);\n\n        // Negative values < -f64::MAX\n        expect_infinity(b\"-1.8e308\", false);\n        expect_infinity(b\"-9.9e999\", false);\n    }\n\n    // These cases actually shouldn't parse according to the spec, but it's easier\n    // to be lenient on these, and it doesn't really impact the SDK use-case.\n    #[test]\n    fn invalid_numbers_we_are_intentionally_accepting() {\n        let expect = |number, input| {\n            expect_token(value_number(0, number), json_token_iter(input).next());\n        };\n\n        expect(Number::NegInt(-1), b\"-01\");\n        expect(Number::Float(-2.0), b\"-2.\");\n        expect(Number::Float(0.0), b\"0.e1\");\n        expect(Number::Float(0.002), b\"2.e-3\");\n        expect(Number::Float(2000.0), b\"2.e3\");\n        expect(Number::NegInt(-12), b\"-012\");\n        expect(Number::Float(-0.123), b\"-.123\");\n        expect(Number::Float(1.0), b\"1.\");\n        expect(Number::PosInt(12), b\"012\");\n    }\n\n    #[test]\n    fn invalid_numbers() {\n        macro_rules! unexpected_token {\n            ($input:expr, $token:pat, $offset:expr, $msg:pat) => {\n                let tokens: Vec<Result<Token<'_>, Error>> = json_token_iter($input).collect();\n                assert_eq!(1, tokens.len());\n                expect_err!(\n                    ErrorKind::UnexpectedToken($token, $msg),\n                    Some($offset),\n                    tokens.into_iter().next()\n                );\n            };\n        }\n\n        let invalid_number = |input, offset| {\n            let tokens: Vec<Result<Token<'_>, Error>> = json_token_iter(input).collect();\n            assert_eq!(1, tokens.len());\n            expect_err!(\n                ErrorKind::InvalidNumber,\n                Some(offset),\n                tokens.into_iter().next()\n            );\n        };\n\n        unexpected_token!(\n            b\".\",\n            '.',\n            0,\n            \"'{', '[', '\\\"', 'null', 'true', 'false', <number>\"\n        );\n        unexpected_token!(\n            b\".0\",\n            '.',\n            0,\n            \"'{', '[', '\\\"', 'null', 'true', 'false', <number>\"\n        );\n        unexpected_token!(b\"0-05\", '-', 1, \"<whitespace>, '}', ']', ','\");\n        unexpected_token!(b\"0x05\", 'x', 1, \"<whitespace>, '}', ']', ','\");\n        unexpected_token!(b\"123.invalid\", 'i', 4, \"<whitespace>, '}', ']', ','\");\n        unexpected_token!(b\"123invalid\", 'i', 3, \"<whitespace>, '}', ']', ','\");\n        unexpected_token!(\n            b\"asdf\",\n            'a',\n            0,\n            \"'{', '[', '\\\"', 'null', 'true', 'false', <number>\"\n        );\n\n        invalid_number(b\"-a\", 0);\n        invalid_number(b\"1e\", 0);\n        invalid_number(b\"1e-\", 0);\n\n        // Number parsing fails before it even looks at the trailer because of invalid exponent\n        invalid_number(b\"123.0Einvalid\", 0);\n    }\n\n    #[test]\n    fn test_unclosed_array() {\n        let mut iter = json_token_iter(br#\" [null \"#);\n        expect_token(start_array(1), iter.next());\n        expect_token(value_null(2), iter.next());\n        expect_err!(ErrorKind::UnexpectedEos, Some(7), iter.next());\n    }\n\n    #[test]\n    fn test_array_with_items() {\n        let mut iter = json_token_iter(b\"[[], {}, \\\"test\\\"]\");\n        expect_token(start_array(0), iter.next());\n        expect_token(start_array(1), iter.next());\n        expect_token(end_array(2), iter.next());\n        expect_token(start_object(5), iter.next());\n        expect_token(end_object(6), iter.next());\n        expect_token(value_string(9, \"test\"), iter.next());\n        expect_token(end_array(15), iter.next());\n        expect_token(None, iter.next());\n    }\n\n    #[test]\n    fn test_object_with_items() {\n        let mut tokens = json_token_iter(\n            br#\"{ \"some_int\": 5,\n                  \"some_float\": 5.2,\n                  \"some_negative\": -5,\n                  \"some_negative_float\": -2.4,\n                  \"some_string\": \"test\",\n                  \"some_struct\": { \"nested\": \"asdf\" },\n                  \"some_array\": [\"one\", \"two\"] }\"#,\n        );\n        expect_token(start_object(0), tokens.next());\n        expect_token(object_key(2, \"some_int\"), tokens.next());\n        expect_token(value_number(14, Number::PosInt(5)), tokens.next());\n        expect_token(object_key(35, \"some_float\"), tokens.next());\n        expect_token(value_number(49, Number::Float(5.2)), tokens.next());\n        expect_token(object_key(72, \"some_negative\"), tokens.next());\n        expect_token(value_number(89, Number::NegInt(-5)), tokens.next());\n        expect_token(object_key(111, \"some_negative_float\"), tokens.next());\n        expect_token(value_number(134, Number::Float(-2.4)), tokens.next());\n        expect_token(object_key(158, \"some_string\"), tokens.next());\n        expect_token(value_string(173, \"test\"), tokens.next());\n        expect_token(object_key(199, \"some_struct\"), tokens.next());\n        expect_token(start_object(214), tokens.next());\n        expect_token(object_key(216, \"nested\"), tokens.next());\n        expect_token(value_string(226, \"asdf\"), tokens.next());\n        expect_token(end_object(233), tokens.next());\n        expect_token(object_key(254, \"some_array\"), tokens.next());\n        expect_token(start_array(268), tokens.next());\n        expect_token(value_string(269, \"one\"), tokens.next());\n        expect_token(value_string(276, \"two\"), tokens.next());\n        expect_token(end_array(281), tokens.next());\n        expect_token(end_object(283), tokens.next());\n        expect_token(None, tokens.next());\n    }\n\n    #[test]\n    fn test_object_trailing_comma() {\n        let mut iter = json_token_iter(br#\" { \"test\": \"trailing\", } \"#);\n        expect_token(start_object(1), iter.next());\n        expect_token(object_key(3, \"test\"), iter.next());\n        expect_token(value_string(11, \"trailing\"), iter.next());\n        expect_err!(\n            ErrorKind::UnexpectedToken('}', \"'\\\"'\"),\n            Some(23),\n            iter.next()\n        );\n        assert!(iter.next().is_none());\n    }\n\n    #[test]\n    fn test_object_no_colon() {\n        let mut iter = json_token_iter(br#\" {\"test\" \"#);\n        expect_token(start_object(1), iter.next());\n        expect_token(object_key(2, \"test\"), iter.next());\n        expect_err!(ErrorKind::UnexpectedEos, Some(9), iter.next());\n        expect_token(None, iter.next());\n    }\n\n    #[test]\n    fn unescaped_ctrl_characters() {\n        assert!(json_token_iter(b\"\\\"test\\x00test\\\"\")\n            .next()\n            .unwrap()\n            .is_err());\n        assert!(json_token_iter(b\"\\\"test\\ntest\\\"\").next().unwrap().is_err());\n        assert!(json_token_iter(b\"\\\"test\\ttest\\\"\").next().unwrap().is_err());\n    }\n\n    #[test]\n    fn escaped_str() {\n        let escaped = EscapedStr::new(\"foo\\\\nbar\");\n        assert_eq!(\"foo\\\\nbar\", escaped.as_escaped_str());\n        assert_eq!(\"foo\\nbar\", escaped.to_unescaped().unwrap());\n    }\n\n    #[test]\n    fn test_integer_overflow_to_float() {\n        // Positive integer larger than u64::MAX should parse as Float\n        let input = b\"18450000000000000000\";\n        let mut iter = json_token_iter(input);\n        match iter.next() {\n            Some(Ok(Token::ValueNumber {\n                value: Number::Float(f),\n                ..\n            })) => {\n                assert!(f.is_finite());\n                assert!(f > 0.0);\n            }\n            other => panic!(\"Expected Float token, got {:?}\", other),\n        }\n\n        // Negative integer smaller than i64::MIN should parse as Float\n        let input = b\"-9223372036854775809\";\n        let mut iter = json_token_iter(input);\n        match iter.next() {\n            Some(Ok(Token::ValueNumber {\n                value: Number::Float(f),\n                ..\n            })) => {\n                assert!(f.is_finite());\n                assert!(f < 0.0);\n            }\n            other => panic!(\"Expected Float token, got {:?}\", other),\n        }\n\n        // Extremely large number should parse as infinity\n        let large_num = b\"100000000000000000000000000000000000000000000000000000000000000\\\n        0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\\\n        0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\\\n        00000000000000000000000000000000000000000000000000000000000000000000000\";\n        let mut iter = json_token_iter(large_num);\n        match iter.next() {\n            Some(Ok(Token::ValueNumber {\n                value: Number::Float(f),\n                ..\n            })) => {\n                assert_eq!(f, f64::INFINITY);\n            }\n            other => panic!(\"Expected Float(infinity) token, got {:?}\", other),\n        }\n    }\n\n    #[test]\n    fn test_integer_within_range() {\n        // Numbers that fit in u64/i64 should still parse as PosInt/NegInt\n        let input = b\"9007199254740993\";\n        let mut iter = json_token_iter(input);\n        match iter.next() {\n            Some(Ok(Token::ValueNumber {\n                value: Number::PosInt(n),\n                ..\n            })) => {\n                assert_eq!(n, 9007199254740993);\n            }\n            other => panic!(\"Expected PosInt token, got {:?}\", other),\n        }\n\n        let input = b\"-9223372036854775808\";\n        let mut iter = json_token_iter(input);\n        match iter.next() {\n            Some(Ok(Token::ValueNumber {\n                value: Number::NegInt(n),\n                ..\n            })) => {\n                assert_eq!(n, i64::MIN);\n            }\n            other => panic!(\"Expected NegInt token, got {:?}\", other),\n        }\n    }\n\n    #[test]\n    fn test_integer_boundaries() {\n        // Zero\n        let input = b\"0\";\n        let mut iter = json_token_iter(input);\n        match iter.next() {\n            Some(Ok(Token::ValueNumber {\n                value: Number::PosInt(0),\n                ..\n            })) => {}\n            other => panic!(\"Expected PosInt(0), got {:?}\", other),\n        }\n\n        // Regular negative number\n        let input = b\"-123\";\n        let mut iter = json_token_iter(input);\n        match iter.next() {\n            Some(Ok(Token::ValueNumber {\n                value: Number::NegInt(-123),\n                ..\n            })) => {}\n            other => panic!(\"Expected NegInt(-123), got {:?}\", other),\n        }\n\n        // i64::MAX (largest positive i64)\n        let input = b\"9223372036854775807\";\n        let mut iter = json_token_iter(input);\n        match iter.next() {\n            Some(Ok(Token::ValueNumber {\n                value: Number::PosInt(n),\n                ..\n            })) => {\n                assert_eq!(n, i64::MAX as u64);\n            }\n            other => panic!(\"Expected PosInt(i64::MAX), got {:?}\", other),\n        }\n\n        // i64::MIN + 1 (edge case for negative range check)\n        let input = b\"-9223372036854775807\";\n        let mut iter = json_token_iter(input);\n        match iter.next() {\n            Some(Ok(Token::ValueNumber {\n                value: Number::NegInt(n),\n                ..\n            })) => {\n                assert_eq!(n, i64::MIN + 1);\n            }\n            other => panic!(\"Expected NegInt(i64::MIN + 1), got {:?}\", other),\n        }\n\n        // u64::MAX (fits in u64, should be PosInt)\n        let input = b\"18446744073709551615\";\n        let mut iter = json_token_iter(input);\n        match iter.next() {\n            Some(Ok(Token::ValueNumber {\n                value: Number::PosInt(n),\n                ..\n            })) => {\n                assert_eq!(n, u64::MAX);\n            }\n            other => panic!(\"Expected PosInt(u64::MAX), got {:?}\", other),\n        }\n    }\n\n    #[cfg(test)]\n    mod proptest_tests {\n        use super::*;\n\n        proptest! {\n            #[test]\n            fn positive_integers_within_u64_parse_as_posint(n in 0u64..=u64::MAX) {\n                let input = n.to_string();\n                let input_bytes = input.as_bytes();\n                let mut iter = json_token_iter(input_bytes);\n\n                match iter.next() {\n                    Some(Ok(Token::ValueNumber { value: Number::PosInt(parsed), .. })) => {\n                        prop_assert_eq!(parsed, n);\n                    }\n                    other => {\n                        return Err(proptest::test_runner::TestCaseError::fail(\n                            format!(\"Expected PosInt({}), got {:?}\", n, other)\n                        ));\n                    }\n                }\n            }\n\n            #[test]\n            fn negative_integers_within_i64_parse_as_negint(n in i64::MIN..=i64::MAX) {\n                if n >= 0 {\n                    return Ok(());\n                }\n\n                let input = n.to_string();\n                let input_bytes = input.as_bytes();\n                let mut iter = json_token_iter(input_bytes);\n\n                match iter.next() {\n                    Some(Ok(Token::ValueNumber { value: Number::NegInt(parsed), .. })) => {\n                        prop_assert_eq!(parsed, n);\n                    }\n                    other => {\n                        return Err(proptest::test_runner::TestCaseError::fail(\n                            format!(\"Expected NegInt({}), got {:?}\", n, other)\n                        ));\n                    }\n                }\n            }\n\n            #[test]\n            fn large_integers_overflow_to_float(\n                // u64::MAX = 18_446_744_073_709_551_615 (20 digits)\n                // Generate numbers with 21+ digits to guarantee overflow\n                num_str in \"1[0-9]{20,49}\"\n            ) {\n                let input_bytes = num_str.as_bytes();\n                let mut iter = json_token_iter(input_bytes);\n\n                match iter.next() {\n                    Some(Ok(Token::ValueNumber { value: Number::Float(f), .. })) => {\n                        prop_assert!(f.is_finite());\n                        prop_assert!(f > 0.0);\n                    }\n                    other => {\n                        return Err(proptest::test_runner::TestCaseError::fail(\n                            format!(\"Expected Float for large number, got {:?}\", other)\n                        ));\n                    }\n                }\n\n                // Validate expect_number_as_string_or_null extracts the correct string\n                let mut iter = json_token_iter(input_bytes);\n                let result = expect_number_as_string_or_null(iter.next(), input_bytes)?;\n                prop_assert_eq!(result, Some(num_str.as_str()));\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-json/src/escape.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::borrow::Cow;\nuse std::fmt;\n\n#[derive(Debug, PartialEq, Eq)]\nenum EscapeErrorKind {\n    ExpectedSurrogatePair(String),\n    InvalidEscapeCharacter(char),\n    InvalidSurrogatePair(u16, u16),\n    InvalidUnicodeEscape(String),\n    InvalidUtf8,\n    UnexpectedEndOfString,\n}\n\n#[derive(Debug)]\n#[cfg_attr(test, derive(PartialEq, Eq))]\npub struct EscapeError {\n    kind: EscapeErrorKind,\n}\n\nimpl std::error::Error for EscapeError {}\n\nimpl fmt::Display for EscapeError {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        use EscapeErrorKind::*;\n        match &self.kind {\n            ExpectedSurrogatePair(low) => {\n                write!(\n                    f,\n                    \"expected a UTF-16 surrogate pair, but got {low} as the low word\"\n                )\n            }\n            InvalidEscapeCharacter(chr) => write!(f, \"invalid JSON escape: \\\\{chr}\"),\n            InvalidSurrogatePair(high, low) => {\n                write!(f, \"invalid surrogate pair: \\\\u{high:04X}\\\\u{low:04X}\")\n            }\n            InvalidUnicodeEscape(escape) => write!(f, \"invalid JSON Unicode escape: \\\\u{escape}\"),\n            InvalidUtf8 => write!(f, \"invalid UTF-8 codepoint in JSON string\"),\n            UnexpectedEndOfString => write!(f, \"unexpected end of string\"),\n        }\n    }\n}\n\nimpl From<EscapeErrorKind> for EscapeError {\n    fn from(kind: EscapeErrorKind) -> Self {\n        Self { kind }\n    }\n}\n\n/// Escapes a string for embedding in a JSON string value.\npub(crate) fn escape_string(value: &str) -> Cow<'_, str> {\n    let bytes = value.as_bytes();\n    for (index, byte) in bytes.iter().enumerate() {\n        match byte {\n            0..=0x1F | b'\"' | b'\\\\' => {\n                return Cow::Owned(escape_string_inner(&bytes[0..index], &bytes[index..]))\n            }\n            _ => {}\n        }\n    }\n    Cow::Borrowed(value)\n}\n\nfn escape_string_inner(start: &[u8], rest: &[u8]) -> String {\n    let mut escaped = Vec::with_capacity(start.len() + rest.len() + 1);\n    escaped.extend(start);\n\n    for byte in rest {\n        match byte {\n            b'\"' => escaped.extend(b\"\\\\\\\"\"),\n            b'\\\\' => escaped.extend(b\"\\\\\\\\\"),\n            0x08 => escaped.extend(b\"\\\\b\"),\n            0x0C => escaped.extend(b\"\\\\f\"),\n            b'\\n' => escaped.extend(b\"\\\\n\"),\n            b'\\r' => escaped.extend(b\"\\\\r\"),\n            b'\\t' => escaped.extend(b\"\\\\t\"),\n            0..=0x1F => escaped.extend(format!(\"\\\\u{byte:04x}\").bytes()),\n            _ => escaped.push(*byte),\n        }\n    }\n\n    // This is safe because:\n    // - The original input was valid UTF-8 since it came in as a `&str`\n    // - Only single-byte code points were escaped\n    // - The escape sequences are valid UTF-8\n    debug_assert!(std::str::from_utf8(&escaped).is_ok());\n    unsafe { String::from_utf8_unchecked(escaped) }\n}\n\n/// Unescapes a JSON-escaped string.\n/// If there are no escape sequences, it directly returns the reference.\npub(crate) fn unescape_string(value: &str) -> Result<Cow<'_, str>, EscapeError> {\n    let bytes = value.as_bytes();\n    for (index, byte) in bytes.iter().enumerate() {\n        if *byte == b'\\\\' {\n            return unescape_string_inner(&bytes[0..index], &bytes[index..]).map(Cow::Owned);\n        }\n    }\n    Ok(Cow::Borrowed(value))\n}\n\nfn unescape_string_inner(start: &[u8], rest: &[u8]) -> Result<String, EscapeError> {\n    let mut unescaped = Vec::with_capacity(start.len() + rest.len());\n    unescaped.extend(start);\n\n    let mut index = 0;\n    while index < rest.len() {\n        match rest[index] {\n            b'\\\\' => {\n                index += 1;\n                if index == rest.len() {\n                    return Err(EscapeErrorKind::UnexpectedEndOfString.into());\n                }\n                match rest[index] {\n                    b'u' => {\n                        index -= 1;\n                        index += read_unicode_escapes(&rest[index..], &mut unescaped)?;\n                    }\n                    byte => {\n                        match byte {\n                            b'\\\\' => unescaped.push(b'\\\\'),\n                            b'/' => unescaped.push(b'/'),\n                            b'\"' => unescaped.push(b'\"'),\n                            b'b' => unescaped.push(0x08),\n                            b'f' => unescaped.push(0x0C),\n                            b'n' => unescaped.push(b'\\n'),\n                            b'r' => unescaped.push(b'\\r'),\n                            b't' => unescaped.push(b'\\t'),\n                            _ => {\n                                return Err(\n                                    EscapeErrorKind::InvalidEscapeCharacter(byte.into()).into()\n                                )\n                            }\n                        }\n                        index += 1;\n                    }\n                }\n            }\n            byte => {\n                unescaped.push(byte);\n                index += 1\n            }\n        }\n    }\n\n    String::from_utf8(unescaped).map_err(|_| EscapeErrorKind::InvalidUtf8.into())\n}\n\nfn is_utf16_low_surrogate(codepoint: u16) -> bool {\n    codepoint & 0xFC00 == 0xDC00\n}\n\nfn is_utf16_high_surrogate(codepoint: u16) -> bool {\n    codepoint & 0xFC00 == 0xD800\n}\n\nfn read_codepoint(rest: &[u8]) -> Result<u16, EscapeError> {\n    if rest.len() < 6 {\n        return Err(EscapeErrorKind::UnexpectedEndOfString.into());\n    }\n    if &rest[0..2] != b\"\\\\u\" {\n        // The first codepoint is always prefixed with \"\\u\" since unescape_string_inner does\n        // that check, so this error will always be for the low word of a surrogate pair.\n        return Err(EscapeErrorKind::ExpectedSurrogatePair(\n            String::from_utf8_lossy(&rest[0..6]).into(),\n        )\n        .into());\n    }\n\n    let codepoint_str =\n        std::str::from_utf8(&rest[2..6]).map_err(|_| EscapeErrorKind::InvalidUtf8)?;\n\n    // Error on characters `u16::from_str_radix` would otherwise accept, such as `+`\n    if codepoint_str.bytes().any(|byte| !byte.is_ascii_hexdigit()) {\n        return Err(EscapeErrorKind::InvalidUnicodeEscape(codepoint_str.into()).into());\n    }\n    Ok(u16::from_str_radix(codepoint_str, 16).expect(\"hex string is valid 16-bit value\"))\n}\n\n/// Reads JSON Unicode escape sequences (i.e., \"\\u1234\"). Will also read\n/// an additional codepoint if the first codepoint is the start of a surrogate pair.\nfn read_unicode_escapes(bytes: &[u8], into: &mut Vec<u8>) -> Result<usize, EscapeError> {\n    let high = read_codepoint(bytes)?;\n    let (bytes_read, chr) = if is_utf16_high_surrogate(high) {\n        let low = read_codepoint(&bytes[6..])?;\n        if !is_utf16_low_surrogate(low) {\n            return Err(EscapeErrorKind::InvalidSurrogatePair(high, low).into());\n        }\n\n        let codepoint =\n            std::char::from_u32(0x10000 + (high - 0xD800) as u32 * 0x400 + (low - 0xDC00) as u32)\n                .ok_or(EscapeErrorKind::InvalidSurrogatePair(high, low))?;\n        (12, codepoint)\n    } else {\n        let codepoint = std::char::from_u32(high as u32).ok_or_else(|| {\n            EscapeErrorKind::InvalidUnicodeEscape(String::from_utf8_lossy(&bytes[0..6]).into())\n        })?;\n        (6, codepoint)\n    };\n\n    match chr.len_utf8() {\n        1 => into.push(chr as u8),\n        _ => into.extend_from_slice(chr.encode_utf8(&mut [0; 4]).as_bytes()),\n    }\n    Ok(bytes_read)\n}\n\n#[cfg(test)]\nmod test {\n    use super::escape_string;\n    use crate::escape::{unescape_string, EscapeErrorKind};\n    use std::borrow::Cow;\n\n    #[test]\n    fn escape() {\n        assert_eq!(\"\", escape_string(\"\").as_ref());\n        assert_eq!(\"foo\", escape_string(\"foo\").as_ref());\n        assert_eq!(\"foo\\\\r\\\\n\", escape_string(\"foo\\r\\n\").as_ref());\n        assert_eq!(\"foo\\\\r\\\\nbar\", escape_string(\"foo\\r\\nbar\").as_ref());\n        assert_eq!(r\"foo\\\\bar\", escape_string(r\"foo\\bar\").as_ref());\n        assert_eq!(r\"\\\\foobar\", escape_string(r\"\\foobar\").as_ref());\n        assert_eq!(\n            r\"\\bf\\fo\\to\\r\\n\",\n            escape_string(\"\\u{08}f\\u{0C}o\\to\\r\\n\").as_ref()\n        );\n        assert_eq!(\"\\\\\\\"test\\\\\\\"\", escape_string(\"\\\"test\\\"\").as_ref());\n        assert_eq!(\"\\\\u0000\", escape_string(\"\\u{0}\").as_ref());\n        assert_eq!(\"\\\\u001f\", escape_string(\"\\u{1f}\").as_ref());\n    }\n\n    #[test]\n    fn unescape_no_escapes() {\n        let unescaped = unescape_string(\"test test\").unwrap();\n        assert_eq!(\"test test\", unescaped);\n        assert!(matches!(unescaped, Cow::Borrowed(_)));\n    }\n\n    #[test]\n    fn unescape() {\n        assert_eq!(\n            \"\\x08f\\x0Co\\to\\r\\n\",\n            unescape_string(r\"\\bf\\fo\\to\\r\\n\").unwrap()\n        );\n        assert_eq!(\"\\\"test\\\"\", unescape_string(r#\"\\\"test\\\"\"#).unwrap());\n        assert_eq!(\"\\x00\", unescape_string(\"\\\\u0000\").unwrap());\n        assert_eq!(\"\\x1f\", unescape_string(\"\\\\u001f\").unwrap());\n        assert_eq!(\"foo\\r\\nbar\", unescape_string(\"foo\\\\r\\\\nbar\").unwrap());\n        assert_eq!(\"foo\\r\\n\", unescape_string(\"foo\\\\r\\\\n\").unwrap());\n        assert_eq!(\"\\r\\nbar\", unescape_string(\"\\\\r\\\\nbar\").unwrap());\n        assert_eq!(\"\\u{10437}\", unescape_string(\"\\\\uD801\\\\uDC37\").unwrap());\n\n        assert_eq!(\n            Err(EscapeErrorKind::UnexpectedEndOfString.into()),\n            unescape_string(\"\\\\\")\n        );\n        assert_eq!(\n            Err(EscapeErrorKind::UnexpectedEndOfString.into()),\n            unescape_string(\"\\\\u\")\n        );\n        assert_eq!(\n            Err(EscapeErrorKind::UnexpectedEndOfString.into()),\n            unescape_string(\"\\\\u00\")\n        );\n        assert_eq!(\n            Err(EscapeErrorKind::InvalidEscapeCharacter('z').into()),\n            unescape_string(\"\\\\z\")\n        );\n\n        assert_eq!(\n            Err(EscapeErrorKind::ExpectedSurrogatePair(\"\\\\nasdf\".into()).into()),\n            unescape_string(\"\\\\uD801\\\\nasdf\")\n        );\n        assert_eq!(\n            Err(EscapeErrorKind::UnexpectedEndOfString.into()),\n            unescape_string(\"\\\\uD801\\\\u00\")\n        );\n        assert_eq!(\n            Err(EscapeErrorKind::InvalidSurrogatePair(0xD801, 0xC501).into()),\n            unescape_string(\"\\\\uD801\\\\uC501\")\n        );\n\n        assert_eq!(\n            Err(EscapeErrorKind::InvalidUnicodeEscape(\"+04D\".into()).into()),\n            unescape_string(\"\\\\u+04D\")\n        );\n    }\n\n    use proptest::proptest;\n    proptest! {\n        #[test]\n        fn matches_serde_json(s in \".*\") {\n            let serde_escaped = serde_json::to_string(&s).unwrap();\n            let serde_escaped = &serde_escaped[1..(serde_escaped.len() - 1)];\n            assert_eq!(serde_escaped,escape_string(&s))\n        }\n\n        #[test]\n        fn round_trip(chr in proptest::char::any()) {\n            let mut original = String::new();\n            original.push(chr);\n\n            let escaped = escape_string(&original);\n            let unescaped = unescape_string(&escaped).unwrap();\n            assert_eq!(original, unescaped);\n        }\n\n        #[test]\n        fn unicode_surrogates(chr in proptest::char::range(\n            std::char::from_u32(0x10000).unwrap(),\n            std::char::from_u32(0x10FFFF).unwrap(),\n        )) {\n            let mut codepoints = [0; 2];\n            chr.encode_utf16(&mut codepoints);\n\n            let escaped = format!(\"\\\\u{:04X}\\\\u{:04X}\", codepoints[0], codepoints[1]);\n            let unescaped = unescape_string(&escaped).unwrap();\n\n            let expected = format!(\"{chr}\");\n            assert_eq!(expected, unescaped);\n        }\n    }\n\n    #[test]\n    #[ignore] // This tests escaping of all codepoints, but can take a long time in debug builds\n    fn all_codepoints() {\n        for value in 0..u32::MAX {\n            if let Some(chr) = char::from_u32(value) {\n                let string = String::from(chr);\n                let escaped = escape_string(&string);\n                let serde_escaped = serde_json::to_string(&string).unwrap();\n                let serde_escaped = &serde_escaped[1..(serde_escaped.len() - 1)];\n                assert_eq!(&escaped, serde_escaped);\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-json/src/lib.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/* Automatically managed default lints */\n#![cfg_attr(docsrs, feature(doc_cfg))]\n/* End of automatically managed default lints */\n#![allow(clippy::derive_partial_eq_without_eq)]\n#![warn(\n    // missing_docs,\n    rustdoc::missing_crate_level_docs,\n    unreachable_pub,\n    // Enabling this requires fixing a macro but I don't understand how to do that.\n    // rust_2018_idioms\n)]\n\n//! JSON Abstractions for Smithy\n\npub mod deserialize;\nmod escape;\npub mod serialize;\n"
  },
  {
    "path": "rust-runtime/aws-smithy-json/src/serialize.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::escape::escape_string;\nuse aws_smithy_types::date_time::{DateTimeFormatError, Format};\nuse aws_smithy_types::primitive::Encoder;\nuse aws_smithy_types::{DateTime, Document, Number};\nuse std::borrow::Cow;\n\npub struct JsonValueWriter<'a> {\n    output: &'a mut String,\n}\n\nimpl<'a> JsonValueWriter<'a> {\n    pub fn new(output: &'a mut String) -> Self {\n        JsonValueWriter { output }\n    }\n\n    /// Writes a null value.\n    pub fn null(self) {\n        self.output.push_str(\"null\");\n    }\n\n    /// Writes the boolean `value`.\n    pub fn boolean(self, value: bool) {\n        self.output.push_str(match value {\n            true => \"true\",\n            _ => \"false\",\n        });\n    }\n\n    /// Writes a document `value`.\n    pub fn document(self, value: &Document) {\n        match value {\n            Document::Array(values) => {\n                let mut array = self.start_array();\n                for value in values {\n                    array.value().document(value);\n                }\n                array.finish();\n            }\n            Document::Bool(value) => self.boolean(*value),\n            Document::Null => self.null(),\n            Document::Number(value) => self.number(*value),\n            Document::Object(values) => {\n                let mut object = self.start_object();\n                for (key, value) in values {\n                    object.key(key).document(value);\n                }\n                object.finish();\n            }\n            Document::String(value) => self.string(value),\n        }\n    }\n\n    /// Writes a string `value`.\n    pub fn string(self, value: &str) {\n        self.output.push('\"');\n        self.output.push_str(&escape_string(value));\n        self.output.push('\"');\n    }\n\n    /// Writes a string `value` without escaping it.\n    pub fn string_unchecked(self, value: &str) {\n        // Verify in debug builds that we don't actually need to escape the string\n        debug_assert!(matches!(escape_string(value), Cow::Borrowed(_)));\n\n        self.output.push('\"');\n        self.output.push_str(value);\n        self.output.push('\"');\n    }\n\n    /// Writes a raw value without any quoting or escaping.\n    /// Used for BigInteger/BigDecimal which are stored as strings but serialize as JSON numbers.\n    pub fn write_raw_value(self, value: &str) {\n        self.output.push_str(value);\n    }\n\n    /// Writes a number `value`.\n    pub fn number(self, value: Number) {\n        match value {\n            Number::PosInt(value) => {\n                // itoa::Buffer is a fixed-size stack allocation, so this is cheap\n                self.output.push_str(Encoder::from(value).encode());\n            }\n            Number::NegInt(value) => {\n                self.output.push_str(Encoder::from(value).encode());\n            }\n            Number::Float(value) => {\n                let mut encoder: Encoder = value.into();\n                // Nan / infinite values actually get written in quotes as a string value\n                if value.is_infinite() || value.is_nan() {\n                    self.string_unchecked(encoder.encode())\n                } else {\n                    self.output.push_str(encoder.encode())\n                }\n            }\n        }\n    }\n\n    /// Writes a date-time `value` with the given `format`.\n    pub fn date_time(\n        self,\n        date_time: &DateTime,\n        format: Format,\n    ) -> Result<(), DateTimeFormatError> {\n        let formatted = date_time.fmt(format)?;\n        match format {\n            Format::EpochSeconds => self.output.push_str(&formatted),\n            _ => self.string(&formatted),\n        }\n        Ok(())\n    }\n\n    /// Starts an array.\n    pub fn start_array(self) -> JsonArrayWriter<'a> {\n        JsonArrayWriter::new(self.output)\n    }\n\n    /// Starts an object.\n    pub fn start_object(self) -> JsonObjectWriter<'a> {\n        JsonObjectWriter::new(self.output)\n    }\n}\n\npub struct JsonObjectWriter<'a> {\n    json: &'a mut String,\n    started: bool,\n}\n\nimpl<'a> JsonObjectWriter<'a> {\n    pub fn new(output: &'a mut String) -> Self {\n        output.push('{');\n        Self {\n            json: output,\n            started: false,\n        }\n    }\n\n    /// Starts a value with the given `key`.\n    pub fn key(&mut self, key: &str) -> JsonValueWriter<'_> {\n        if self.started {\n            self.json.push(',');\n        }\n        self.started = true;\n\n        self.json.push('\"');\n        self.json.push_str(&escape_string(key));\n        self.json.push_str(\"\\\":\");\n\n        JsonValueWriter::new(self.json)\n    }\n\n    /// Finishes the object.\n    pub fn finish(self) {\n        self.json.push('}');\n    }\n}\n\npub struct JsonArrayWriter<'a> {\n    json: &'a mut String,\n    started: bool,\n}\n\nimpl<'a> JsonArrayWriter<'a> {\n    pub fn new(output: &'a mut String) -> Self {\n        output.push('[');\n        Self {\n            json: output,\n            started: false,\n        }\n    }\n\n    /// Starts a new value in the array.\n    pub fn value(&mut self) -> JsonValueWriter<'_> {\n        self.comma_delimit();\n        JsonValueWriter::new(self.json)\n    }\n\n    /// Finishes the array.\n    pub fn finish(self) {\n        self.json.push(']');\n    }\n\n    fn comma_delimit(&mut self) {\n        if self.started {\n            self.json.push(',');\n        }\n        self.started = true;\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::{JsonArrayWriter, JsonObjectWriter};\n    use crate::serialize::JsonValueWriter;\n    use aws_smithy_types::date_time::Format;\n    use aws_smithy_types::{DateTime, Document, Number};\n    use proptest::proptest;\n\n    #[test]\n    fn empty() {\n        let mut output = String::new();\n        JsonObjectWriter::new(&mut output).finish();\n        assert_eq!(\"{}\", &output);\n\n        let mut output = String::new();\n        JsonArrayWriter::new(&mut output).finish();\n        assert_eq!(\"[]\", &output);\n    }\n\n    #[test]\n    fn object_inside_array() {\n        let mut output = String::new();\n        let mut array = JsonArrayWriter::new(&mut output);\n        array.value().start_object().finish();\n        array.value().start_object().finish();\n        array.value().start_object().finish();\n        array.finish();\n        assert_eq!(\"[{},{},{}]\", &output);\n    }\n\n    #[test]\n    fn object_inside_object() {\n        let mut output = String::new();\n        let mut obj_1 = JsonObjectWriter::new(&mut output);\n\n        let mut obj_2 = obj_1.key(\"nested\").start_object();\n        obj_2.key(\"test\").string(\"test\");\n        obj_2.finish();\n\n        obj_1.finish();\n        assert_eq!(r#\"{\"nested\":{\"test\":\"test\"}}\"#, &output);\n    }\n\n    #[test]\n    fn array_inside_object() {\n        let mut output = String::new();\n        let mut object = JsonObjectWriter::new(&mut output);\n        object.key(\"foo\").start_array().finish();\n        object.key(\"ba\\nr\").start_array().finish();\n        object.finish();\n        assert_eq!(r#\"{\"foo\":[],\"ba\\nr\":[]}\"#, &output);\n    }\n\n    #[test]\n    fn array_inside_array() {\n        let mut output = String::new();\n\n        let mut arr_1 = JsonArrayWriter::new(&mut output);\n\n        let mut arr_2 = arr_1.value().start_array();\n        arr_2.value().number(Number::PosInt(5));\n        arr_2.finish();\n\n        arr_1.value().start_array().finish();\n        arr_1.finish();\n\n        assert_eq!(\"[[5],[]]\", &output);\n    }\n\n    #[test]\n    fn object() {\n        let mut output = String::new();\n        let mut object = JsonObjectWriter::new(&mut output);\n        object.key(\"true_val\").boolean(true);\n        object.key(\"false_val\").boolean(false);\n        object.key(\"some_string\").string(\"some\\nstring\\nvalue\");\n        object.key(\"unchecked_str\").string_unchecked(\"unchecked\");\n        object.key(\"some_number\").number(Number::Float(3.5));\n        object.key(\"some_null\").null();\n\n        let mut array = object.key(\"some_mixed_array\").start_array();\n        array.value().string(\"1\");\n        array.value().number(Number::NegInt(-2));\n        array.value().string_unchecked(\"unchecked\");\n        array.value().boolean(true);\n        array.value().boolean(false);\n        array.value().null();\n        array.finish();\n\n        object.finish();\n\n        assert_eq!(\n            r#\"{\"true_val\":true,\"false_val\":false,\"some_string\":\"some\\nstring\\nvalue\",\"unchecked_str\":\"unchecked\",\"some_number\":3.5,\"some_null\":null,\"some_mixed_array\":[\"1\",-2,\"unchecked\",true,false,null]}\"#,\n            &output\n        );\n    }\n\n    #[test]\n    fn object_date_times() {\n        let mut output = String::new();\n\n        let mut object = JsonObjectWriter::new(&mut output);\n        object\n            .key(\"epoch_seconds\")\n            .date_time(&DateTime::from_secs_f64(5.2), Format::EpochSeconds)\n            .unwrap();\n        object\n            .key(\"date_time\")\n            .date_time(\n                &DateTime::from_str(\"2021-05-24T15:34:50.123Z\", Format::DateTime).unwrap(),\n                Format::DateTime,\n            )\n            .unwrap();\n        object\n            .key(\"http_date\")\n            .date_time(\n                &DateTime::from_str(\"Wed, 21 Oct 2015 07:28:00 GMT\", Format::HttpDate).unwrap(),\n                Format::HttpDate,\n            )\n            .unwrap();\n        object.finish();\n\n        assert_eq!(\n            r#\"{\"epoch_seconds\":5.2,\"date_time\":\"2021-05-24T15:34:50.123Z\",\"http_date\":\"Wed, 21 Oct 2015 07:28:00 GMT\"}\"#,\n            &output,\n        )\n    }\n\n    #[test]\n    fn write_raw_value() {\n        let mut output = String::new();\n        let mut object = JsonObjectWriter::new(&mut output);\n        object.key(\"big_int\").write_raw_value(\"123456789\");\n        object.key(\"big_dec\").write_raw_value(\"123.456\");\n        object.finish();\n        assert_eq!(r#\"{\"big_int\":123456789,\"big_dec\":123.456}\"#, &output);\n    }\n\n    #[test]\n    fn array_date_times() {\n        let mut output = String::new();\n\n        let mut array = JsonArrayWriter::new(&mut output);\n        array\n            .value()\n            .date_time(&DateTime::from_secs_f64(5.2), Format::EpochSeconds)\n            .unwrap();\n        array\n            .value()\n            .date_time(\n                &DateTime::from_str(\"2021-05-24T15:34:50.123Z\", Format::DateTime).unwrap(),\n                Format::DateTime,\n            )\n            .unwrap();\n        array\n            .value()\n            .date_time(\n                &DateTime::from_str(\"Wed, 21 Oct 2015 07:28:00 GMT\", Format::HttpDate).unwrap(),\n                Format::HttpDate,\n            )\n            .unwrap();\n        array.finish();\n\n        assert_eq!(\n            r#\"[5.2,\"2021-05-24T15:34:50.123Z\",\"Wed, 21 Oct 2015 07:28:00 GMT\"]\"#,\n            &output,\n        )\n    }\n\n    fn format_document(document: Document) -> String {\n        let mut output = String::new();\n        JsonValueWriter::new(&mut output).document(&document);\n        output\n    }\n\n    #[test]\n    fn document() {\n        assert_eq!(\"null\", format_document(Document::Null));\n        assert_eq!(\"true\", format_document(Document::Bool(true)));\n        assert_eq!(\"false\", format_document(Document::Bool(false)));\n        assert_eq!(\"5\", format_document(Document::Number(Number::PosInt(5))));\n        assert_eq!(\"\\\"test\\\"\", format_document(Document::String(\"test\".into())));\n        assert_eq!(\n            \"[null,true,\\\"test\\\"]\",\n            format_document(Document::Array(vec![\n                Document::Null,\n                Document::Bool(true),\n                Document::String(\"test\".into())\n            ]))\n        );\n        assert_eq!(\n            r#\"{\"test\":\"foo\"}\"#,\n            format_document(Document::Object(\n                vec![(\"test\".to_string(), Document::String(\"foo\".into()))]\n                    .into_iter()\n                    .collect()\n            ))\n        );\n        assert_eq!(\n            r#\"{\"test1\":[{\"num\":1},{\"num\":2}]}\"#,\n            format_document(Document::Object(\n                vec![(\n                    \"test1\".to_string(),\n                    Document::Array(vec![\n                        Document::Object(\n                            vec![(\"num\".to_string(), Document::Number(Number::PosInt(1))),]\n                                .into_iter()\n                                .collect()\n                        ),\n                        Document::Object(\n                            vec![(\"num\".to_string(), Document::Number(Number::PosInt(2))),]\n                                .into_iter()\n                                .collect()\n                        ),\n                    ])\n                ),]\n                .into_iter()\n                .collect()\n            ))\n        );\n    }\n\n    fn format_test_number(number: Number) -> String {\n        let mut formatted = String::new();\n        JsonValueWriter::new(&mut formatted).number(number);\n        formatted\n    }\n\n    #[test]\n    fn number_formatting() {\n        assert_eq!(\"1\", format_test_number(Number::PosInt(1)));\n        assert_eq!(\"-1\", format_test_number(Number::NegInt(-1)));\n        assert_eq!(\"1\", format_test_number(Number::NegInt(1)));\n        assert_eq!(\"0.0\", format_test_number(Number::Float(0.0)));\n        assert_eq!(\"10000000000.0\", format_test_number(Number::Float(1e10)));\n        assert_eq!(\"-1.2\", format_test_number(Number::Float(-1.2)));\n\n        // Smithy has specific behavior for infinity & NaN\n        // the behavior of the serde_json crate in these cases.\n        assert_eq!(\"\\\"NaN\\\"\", format_test_number(Number::Float(f64::NAN)));\n        assert_eq!(\n            \"\\\"Infinity\\\"\",\n            format_test_number(Number::Float(f64::INFINITY))\n        );\n        assert_eq!(\n            \"\\\"-Infinity\\\"\",\n            format_test_number(Number::Float(f64::NEG_INFINITY))\n        );\n    }\n\n    proptest! {\n        #[test]\n        fn matches_serde_json_pos_int_format(value: u64) {\n            assert_eq!(\n                serde_json::to_string(&value).unwrap(),\n                format_test_number(Number::PosInt(value)),\n            )\n        }\n\n        #[test]\n        fn matches_serde_json_neg_int_format(value: i64) {\n            assert_eq!(\n                serde_json::to_string(&value).unwrap(),\n                format_test_number(Number::NegInt(value)),\n            )\n        }\n\n        #[test]\n        fn matches_serde_json_float_format(value: f64) {\n            assert_eq!(\n                serde_json::to_string(&value).unwrap(),\n                format_test_number(Number::Float(value)),\n            )\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http/Cargo.toml",
    "content": "[package]\nname = \"aws-smithy-legacy-http\"\nversion = \"0.62.14\"\nauthors = [\n    \"AWS Rust SDK Team <aws-sdk-rust@amazon.com>\",\n    \"Russell Cohen <rcoh@amazon.com>\",\n]\ndescription = \"Smithy HTTP-0x logic for smithy-rs.\"\nedition = \"2021\"\nlicense = \"Apache-2.0\"\nrepository = \"https://github.com/smithy-lang/smithy-rs\"\nrust-version = \"1.91.1\"\n\n[features]\nevent-stream = [\"aws-smithy-eventstream\", \"aws-smithy-http/event-stream\"]\nrt-tokio = [\"aws-smithy-types/rt-tokio\"]\n\n[dependencies]\naws-smithy-eventstream = { path = \"../aws-smithy-eventstream\", optional = true }\naws-smithy-http = { path = \"../aws-smithy-http\", optional = true }\naws-smithy-runtime-api = { path = \"../aws-smithy-runtime-api\", features = [\"client\", \"http-02x\"] }\naws-smithy-types = { path = \"../aws-smithy-types\", features = [\"byte-stream-poll-next\", \"http-body-0-4-x\"] }\nbytes = \"1.11.1\"\nbytes-utils = \"0.1\"\n# TODO(hyper1) - Complete the breaking changes by updating to http 1.x ecosystem fully in this crate. Also remove hyper 0.14 from dev\nhttp-02x = { package = \"http\", version = \"0.2.12\" }\nhttp-1x = { package = \"http\", version = \"1.3.1\" }\nhttp-body-04x = { package = \"http-body\", version = \"0.4.6\" }\npercent-encoding = \"2.3.1\"\npin-project-lite = \"0.2.14\"\npin-utils = \"0.1.0\"\ntracing = \"0.1.44\"\n\n# For an adapter to enable the `Stream` trait for `aws_smithy_types::byte_stream::ByteStream`\nfutures-core = \"0.3.31\"\nfutures-util = { version = \"0.3.29\", default-features = false }\n\n[dev-dependencies]\nasync-stream = \"0.3\"\nfutures-util = { version = \"0.3.29\", default-features = false }\nhyper = { version = \"0.14.26\", features = [\"stream\"] }\nproptest = \"1\"\ntokio = { version = \"1.49.0\", features = [\n    \"macros\",\n    \"rt\",\n    \"rt-multi-thread\",\n] }\n\n[package.metadata.docs.rs]\nall-features = true\ntargets = [\"x86_64-unknown-linux-gnu\"]\ncargo-args = [\"-Zunstable-options\", \"-Zrustdoc-scrape-examples\"]\nrustdoc-args = [\"--cfg\", \"docsrs\"]\n# End of docs.rs metadata\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http/LICENSE",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http/README.md",
    "content": "# aws-smithy-legacy-http\n\n**This is a legacy crate that provides support for `http@0.x` and `hyper@0.x`.**\n\nCore HTTP primitives for service clients generated by [smithy-rs](https://github.com/smithy-lang/smithy-rs) including:\n- HTTP Body implementation\n- Endpoint support\n- HTTP header deserialization\n- Event streams\n- `ByteStream`: _(supported on crate feature `rt-tokio` only)_ a misuse-resistant abstraction for streaming binary data\n\n## Usage\n\nThis crate is used when generating server SDKs without the `http-1x` codegen flag. For new projects, prefer using `aws-smithy-http` which supports `http@1.x` and `hyper@1.x`.\n\n<!-- anchor_start:footer -->\nThis crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly.\n<!-- anchor_end:footer -->\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http/additional-ci",
    "content": "#!/bin/bash\n#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\n\n# This script contains additional CI checks to run for this specific package\n\nset -e\n\necho \"### Testing every combination of features (excluding --all-features)\"\ncargo hack test --feature-powerset --exclude-all-features\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http/external-types.toml",
    "content": "allowed_external_types = [\n    \"aws_smithy_runtime_api::*\",\n    \"aws_smithy_types::*\",\n    \"bytes::bytes::Bytes\",\n    \"http::error::Error\",\n    \"http::header::map::HeaderMap\",\n    \"http::header::map::ValueIter\",\n    \"http::header::name::HeaderName\",\n    \"http::header::value::HeaderValue\",\n    \"http::request::Builder\",\n    \"http::request::Request\",\n    \"http::response::Builder\",\n    \"http::response::Response\",\n    \"http::uri::Uri\",\n\n    # TODO(https://github.com/smithy-lang/smithy-rs/issues/1193): Once tooling permits it, only allow the following types in the `event-stream` feature\n    \"futures_core::stream::Stream\",\n\n    # TODO(https://github.com/smithy-lang/smithy-rs/issues/1193): Once tooling permits it, only allow the following types in the `event-stream` feature\n    \"aws_smithy_eventstream::*\",\n]\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http/fuzz/.gitignore",
    "content": "target\ncorpus\nartifacts\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http/fuzz/Cargo.toml",
    "content": "[package]\nname = \"aws-smithy-http-fuzz\"\nversion = \"0.0.0\"\nauthors = [\"Automatically generated\"]\npublish = false\nedition = \"2021\"\n\n[package.metadata]\ncargo-fuzz = true\n\n[dependencies]\n# Version pinned due to https://github.com/rust-fuzz/libfuzzer/issues/126\nlibfuzzer-sys = \"=0.4.7\"\nhttp = \"0.2.3\"\n\n[dependencies.aws-smithy-http]\npath = \"..\"\n\n# Prevent this from interfering with workspaces\n[workspace]\nmembers = [\".\"]\n\n[[bin]]\nname = \"read_many_from_str\"\npath = \"fuzz_targets/read_many_from_str.rs\"\ntest = false\ndoc = false\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http/fuzz/fuzz_targets/read_many_from_str.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n#![no_main]\nuse libfuzzer_sys::fuzz_target;\n\nuse aws_smithy_legacy_http::header::read_many_from_str;\nuse http;\n\nfuzz_target!(|data: &[u8]| {\n    if let Ok(s) = std::str::from_utf8(data) {\n        if let Ok(req) = http::Request::builder().header(\"test\", s).body(()) {\n            // Shouldn't panic\n            let _ = read_many_from_str::<String>(req.headers().get_all(\"test\").iter());\n        }\n    }\n});\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http/proptest-regressions/label.txt",
    "content": "# Seeds for failure cases proptest has generated in the past. It is\n# automatically read and these particular cases re-run before any\n# novel cases are generated.\n#\n# It is recommended to check this file in to source control so that\n# everyone who runs the test benefits from these saved cases.\ncc dfac816a3fc3fff8523f1a1707da0065b72fc3c0d70fce001627a8e2e7ee5e0e # shrinks to s = \">\"\ncc 22bce3cd581f5f5a55e6ba18b1fb027481a496f6b35fee6dc4ef84659b99ddca # shrinks to s = \"`\"\ncc be619cccfee48e3bf642cf0f82e98e00dceccbe10963fbaf3a622a68a55a3227 # shrinks to s = \"?\\\"\"\ncc 3e0b2e6f64642d7c58e5d2fe9223f75238a874bd8c3812dcb3ecc721d9aa0243 # shrinks to s = \" \"\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http/proptest-regressions/query.txt",
    "content": "# Seeds for failure cases proptest has generated in the past. It is\n# automatically read and these particular cases re-run before any\n# novel cases are generated.\n#\n# It is recommended to check this file in to source control so that\n# everyone who runs the test benefits from these saved cases.\ncc b8ff8401495a7e4b4604f4438d8fc6b0ba63a58ddf58273ddcb3bb511e5cf91a # shrinks to s = \"<\"\ncc 59ee40f6a097f80254a91d0ee7d6cde97a353f7ccdf83eddd1d437781019431f # shrinks to s = \"\\\"\"\ncc 65e6e5f9082c6cbebf599af889721d30d8ee2388f2f7be372520aa86526c8379 # shrinks to s = \">\"\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http/src/endpoint/error.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Errors related to endpoint resolution and validation\n\nuse std::error::Error;\nuse std::fmt;\n\n/// Endpoint resolution failed\n#[derive(Debug)]\npub struct ResolveEndpointError {\n    message: String,\n    source: Option<Box<dyn Error + Send + Sync>>,\n}\n\nimpl ResolveEndpointError {\n    /// Create an [`ResolveEndpointError`] with a message\n    pub fn message(message: impl Into<String>) -> Self {\n        Self {\n            message: message.into(),\n            source: None,\n        }\n    }\n\n    /// Add a source to the error\n    pub fn with_source(self, source: Option<Box<dyn Error + Send + Sync>>) -> Self {\n        Self { source, ..self }\n    }\n\n    /// Create a [`ResolveEndpointError`] from a message and a source\n    pub fn from_source(\n        message: impl Into<String>,\n        source: impl Into<Box<dyn Error + Send + Sync>>,\n    ) -> Self {\n        Self::message(message).with_source(Some(source.into()))\n    }\n}\n\nimpl fmt::Display for ResolveEndpointError {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        write!(f, \"{}\", self.message)\n    }\n}\n\nimpl Error for ResolveEndpointError {\n    fn source(&self) -> Option<&(dyn Error + 'static)> {\n        self.source.as_ref().map(|err| err.as_ref() as _)\n    }\n}\n\n#[derive(Debug)]\npub(super) enum InvalidEndpointErrorKind {\n    EndpointMustHaveScheme,\n    FailedToConstructAuthority {\n        authority: String,\n        source: Box<dyn Error + Send + Sync + 'static>,\n    },\n    FailedToConstructUri {\n        source: Box<dyn Error + Send + Sync + 'static>,\n    },\n}\n\n/// An error that occurs when an endpoint is found to be invalid. This usually occurs due to an\n/// incomplete URI.\n#[derive(Debug)]\npub struct InvalidEndpointError {\n    pub(super) kind: InvalidEndpointErrorKind,\n}\n\nimpl InvalidEndpointError {\n    /// Construct a build error for a missing scheme\n    pub fn endpoint_must_have_scheme() -> Self {\n        Self {\n            kind: InvalidEndpointErrorKind::EndpointMustHaveScheme,\n        }\n    }\n\n    /// Construct a build error for an invalid authority\n    pub fn failed_to_construct_authority(\n        authority: impl Into<String>,\n        source: impl Into<Box<dyn Error + Send + Sync + 'static>>,\n    ) -> Self {\n        Self {\n            kind: InvalidEndpointErrorKind::FailedToConstructAuthority {\n                authority: authority.into(),\n                source: source.into(),\n            },\n        }\n    }\n\n    /// Construct a build error for an invalid URI\n    pub fn failed_to_construct_uri(\n        source: impl Into<Box<dyn Error + Send + Sync + 'static>>,\n    ) -> Self {\n        Self {\n            kind: InvalidEndpointErrorKind::FailedToConstructUri {\n                source: source.into(),\n            },\n        }\n    }\n}\n\nimpl From<InvalidEndpointErrorKind> for InvalidEndpointError {\n    fn from(kind: InvalidEndpointErrorKind) -> Self {\n        Self { kind }\n    }\n}\n\nimpl fmt::Display for InvalidEndpointError {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        use InvalidEndpointErrorKind as ErrorKind;\n        match &self.kind {\n            ErrorKind::EndpointMustHaveScheme => write!(f, \"endpoint must contain a valid scheme\"),\n            ErrorKind::FailedToConstructAuthority { authority, source: _ } => write!(\n                f,\n                \"endpoint must contain a valid authority when combined with endpoint prefix: {authority}\"\n            ),\n            ErrorKind::FailedToConstructUri { .. } => write!(f, \"failed to construct URI\"),\n        }\n    }\n}\n\nimpl Error for InvalidEndpointError {\n    fn source(&self) -> Option<&(dyn Error + 'static)> {\n        use InvalidEndpointErrorKind as ErrorKind;\n        match &self.kind {\n            ErrorKind::FailedToConstructUri { source } => Some(source.as_ref()),\n            ErrorKind::FailedToConstructAuthority {\n                authority: _,\n                source,\n            } => Some(source.as_ref()),\n            ErrorKind::EndpointMustHaveScheme => None,\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http/src/endpoint.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Code for resolving an endpoint (URI) that a request should be sent to\n\nuse aws_smithy_runtime_api::client::endpoint::{error::InvalidEndpointError, EndpointPrefix};\nuse std::borrow::Cow;\nuse std::result::Result as StdResult;\nuse std::str::FromStr;\n\npub mod error;\npub use error::ResolveEndpointError;\n\n/// An endpoint-resolution-specific Result. Contains either an [`Endpoint`](aws_smithy_types::endpoint::Endpoint) or a [`ResolveEndpointError`].\n#[deprecated(since = \"0.60.1\", note = \"Was never used.\")]\npub type Result = std::result::Result<aws_smithy_types::endpoint::Endpoint, ResolveEndpointError>;\n\n/// Apply `endpoint` to `uri`\n///\n/// This method mutates `uri` by setting the `endpoint` on it\npub fn apply_endpoint(\n    uri: &mut http_1x::Uri,\n    endpoint: &http_1x::Uri,\n    prefix: Option<&EndpointPrefix>,\n) -> StdResult<(), InvalidEndpointError> {\n    let prefix = prefix.map(EndpointPrefix::as_str).unwrap_or(\"\");\n    let authority = endpoint\n        .authority()\n        .as_ref()\n        .map(|auth| auth.as_str())\n        .unwrap_or(\"\");\n    let authority = if !prefix.is_empty() {\n        Cow::Owned(format!(\"{prefix}{authority}\"))\n    } else {\n        Cow::Borrowed(authority)\n    };\n    let authority = http_1x::uri::Authority::from_str(&authority).map_err(|err| {\n        InvalidEndpointError::failed_to_construct_authority(authority.into_owned(), err)\n    })?;\n    let scheme = *endpoint\n        .scheme()\n        .as_ref()\n        .ok_or_else(InvalidEndpointError::endpoint_must_have_scheme)?;\n    let new_uri = http_1x::Uri::builder()\n        .authority(authority)\n        .scheme(scheme.clone())\n        .path_and_query(merge_paths(endpoint, uri).as_ref())\n        .build()\n        .map_err(InvalidEndpointError::failed_to_construct_uri)?;\n    *uri = new_uri;\n    Ok(())\n}\n\nfn merge_paths<'a>(endpoint: &'a http_1x::Uri, uri: &'a http_1x::Uri) -> Cow<'a, str> {\n    if let Some(query) = endpoint.path_and_query().and_then(|pq| pq.query()) {\n        tracing::warn!(query = %query, \"query specified in endpoint will be ignored during endpoint resolution\");\n    }\n    let endpoint_path = endpoint.path();\n    let uri_path_and_query = uri.path_and_query().map(|pq| pq.as_str()).unwrap_or(\"\");\n    if endpoint_path.is_empty() {\n        Cow::Borrowed(uri_path_and_query)\n    } else {\n        let ep_no_slash = endpoint_path.strip_suffix('/').unwrap_or(endpoint_path);\n        let uri_path_no_slash = uri_path_and_query\n            .strip_prefix('/')\n            .unwrap_or(uri_path_and_query);\n        Cow::Owned(format!(\"{ep_no_slash}/{uri_path_no_slash}\"))\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http/src/event_stream/receiver.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_smithy_eventstream::frame::{\n    DecodedFrame, MessageFrameDecoder, UnmarshallMessage, UnmarshalledMessage,\n};\nuse aws_smithy_runtime_api::client::result::{ConnectorError, ResponseError, SdkError};\nuse aws_smithy_types::body::SdkBody;\nuse aws_smithy_types::event_stream::{Message, RawMessage};\nuse bytes::Buf;\nuse bytes::Bytes;\nuse bytes_utils::SegmentedBuf;\nuse std::error::Error as StdError;\nuse std::fmt;\nuse std::marker::PhantomData;\nuse std::mem;\nuse tracing::trace;\n\n/// Wrapper around SegmentedBuf that tracks the state of the stream.\n#[derive(Debug)]\nenum RecvBuf {\n    /// Nothing has been buffered yet.\n    Empty,\n    /// Some data has been buffered.\n    /// The SegmentedBuf will automatically purge when it reads off the end of a chunk boundary.\n    Partial(SegmentedBuf<Bytes>),\n    /// The end of the stream has been reached, but there may still be some buffered data.\n    EosPartial(SegmentedBuf<Bytes>),\n    /// An exception terminated this stream.\n    Terminated,\n}\n\nimpl RecvBuf {\n    /// Returns true if there's more buffered data.\n    fn has_data(&self) -> bool {\n        match self {\n            RecvBuf::Empty | RecvBuf::Terminated => false,\n            RecvBuf::Partial(segments) | RecvBuf::EosPartial(segments) => segments.remaining() > 0,\n        }\n    }\n\n    /// Returns true if the stream has ended.\n    fn is_eos(&self) -> bool {\n        matches!(self, RecvBuf::EosPartial(_) | RecvBuf::Terminated)\n    }\n\n    /// Returns a mutable reference to the underlying buffered data.\n    fn buffered(&mut self) -> &mut SegmentedBuf<Bytes> {\n        match self {\n            RecvBuf::Empty => panic!(\"buffer must be populated before reading; this is a bug\"),\n            RecvBuf::Partial(segmented) => segmented,\n            RecvBuf::EosPartial(segmented) => segmented,\n            RecvBuf::Terminated => panic!(\"buffer has been terminated; this is a bug\"),\n        }\n    }\n\n    /// Returns a new `RecvBuf` with additional data buffered. This will only allocate\n    /// if the `RecvBuf` was previously empty.\n    fn with_partial(self, partial: Bytes) -> Self {\n        match self {\n            RecvBuf::Empty => {\n                let mut segmented = SegmentedBuf::new();\n                segmented.push(partial);\n                RecvBuf::Partial(segmented)\n            }\n            RecvBuf::Partial(mut segmented) => {\n                segmented.push(partial);\n                RecvBuf::Partial(segmented)\n            }\n            RecvBuf::EosPartial(_) | RecvBuf::Terminated => {\n                panic!(\"cannot buffer more data after the stream has ended or been terminated; this is a bug\")\n            }\n        }\n    }\n\n    /// Returns a `RecvBuf` that has reached end of stream.\n    fn ended(self) -> Self {\n        match self {\n            RecvBuf::Empty => RecvBuf::EosPartial(SegmentedBuf::new()),\n            RecvBuf::Partial(segmented) => RecvBuf::EosPartial(segmented),\n            RecvBuf::EosPartial(_) => panic!(\"already end of stream; this is a bug\"),\n            RecvBuf::Terminated => panic!(\"stream terminated; this is a bug\"),\n        }\n    }\n}\n\n#[derive(Debug)]\nenum ReceiverErrorKind {\n    /// The stream ended before a complete message frame was received.\n    UnexpectedEndOfStream,\n}\n\n/// An error that occurs within an event stream receiver.\n#[derive(Debug)]\npub struct ReceiverError {\n    kind: ReceiverErrorKind,\n}\n\nimpl fmt::Display for ReceiverError {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        match self.kind {\n            ReceiverErrorKind::UnexpectedEndOfStream => write!(f, \"unexpected end of stream\"),\n        }\n    }\n}\n\nimpl StdError for ReceiverError {}\n\n/// Receives Smithy-modeled messages out of an Event Stream.\n#[derive(Debug)]\npub struct Receiver<T, E> {\n    unmarshaller: Box<dyn UnmarshallMessage<Output = T, Error = E> + Send + Sync>,\n    decoder: MessageFrameDecoder,\n    buffer: RecvBuf,\n    body: SdkBody,\n    /// Event Stream has optional initial response frames an with `:message-type` of\n    /// `initial-response`. If `try_recv_initial()` is called and the next message isn't an\n    /// initial response, then the message will be stored in `buffered_message` so that it can\n    /// be returned with the next call of `recv()`.\n    buffered_message: Option<Message>,\n    _phantom: PhantomData<E>,\n}\n\n// Used by `Receiver::try_recv_initial`, hence this enum is also doc hidden\n#[doc(hidden)]\n#[non_exhaustive]\npub enum InitialMessageType {\n    Request,\n    Response,\n}\n\nimpl InitialMessageType {\n    fn as_str(&self) -> &'static str {\n        match self {\n            InitialMessageType::Request => \"initial-request\",\n            InitialMessageType::Response => \"initial-response\",\n        }\n    }\n}\n\nimpl<T, E> Receiver<T, E> {\n    /// Creates a new `Receiver` with the given message unmarshaller and SDK body.\n    pub fn new(\n        unmarshaller: impl UnmarshallMessage<Output = T, Error = E> + Send + Sync + 'static,\n        body: SdkBody,\n    ) -> Self {\n        Receiver {\n            unmarshaller: Box::new(unmarshaller),\n            decoder: MessageFrameDecoder::new(),\n            buffer: RecvBuf::Empty,\n            body,\n            buffered_message: None,\n            _phantom: Default::default(),\n        }\n    }\n\n    fn unmarshall(&self, message: Message) -> Result<Option<T>, SdkError<E, RawMessage>> {\n        match self.unmarshaller.unmarshall(&message) {\n            Ok(unmarshalled) => match unmarshalled {\n                UnmarshalledMessage::Event(event) => Ok(Some(event)),\n                UnmarshalledMessage::Error(err) => {\n                    Err(SdkError::service_error(err, RawMessage::Decoded(message)))\n                }\n            },\n            Err(err) => Err(SdkError::response_error(err, RawMessage::Decoded(message))),\n        }\n    }\n\n    async fn buffer_next_chunk(&mut self) -> Result<(), SdkError<E, RawMessage>> {\n        use http_body_04x::Body;\n\n        if !self.buffer.is_eos() {\n            let next_chunk = self\n                .body\n                .data()\n                .await\n                .transpose()\n                .map_err(|err| SdkError::dispatch_failure(ConnectorError::io(err)))?;\n            let buffer = mem::replace(&mut self.buffer, RecvBuf::Empty);\n            if let Some(chunk) = next_chunk {\n                self.buffer = buffer.with_partial(chunk);\n            } else {\n                self.buffer = buffer.ended();\n            }\n        }\n        Ok(())\n    }\n\n    async fn next_message(&mut self) -> Result<Option<Message>, SdkError<E, RawMessage>> {\n        while !self.buffer.is_eos() {\n            if self.buffer.has_data() {\n                if let DecodedFrame::Complete(message) = self\n                    .decoder\n                    .decode_frame(self.buffer.buffered())\n                    .map_err(|err| {\n                        SdkError::response_error(\n                            err,\n                            // the buffer has been consumed\n                            RawMessage::Invalid(None),\n                        )\n                    })?\n                {\n                    trace!(message = ?message, \"received complete event stream message\");\n                    return Ok(Some(message));\n                }\n            }\n\n            self.buffer_next_chunk().await?;\n        }\n        if self.buffer.has_data() {\n            trace!(remaining_data = ?self.buffer, \"data left over in the event stream response stream\");\n            let buf = self.buffer.buffered();\n            return Err(SdkError::response_error(\n                ReceiverError {\n                    kind: ReceiverErrorKind::UnexpectedEndOfStream,\n                },\n                RawMessage::invalid(Some(buf.copy_to_bytes(buf.remaining()))),\n            ));\n        }\n        Ok(None)\n    }\n\n    /// Tries to receive the initial response message that has `:event-type` of a given `message_type`.\n    /// If a different event type is received, then it is buffered and `Ok(None)` is returned.\n    #[doc(hidden)]\n    pub async fn try_recv_initial(\n        &mut self,\n        message_type: InitialMessageType,\n    ) -> Result<Option<Message>, SdkError<E, RawMessage>> {\n        self.try_recv_initial_with_preprocessor(message_type, |msg| Ok((msg, ())))\n            .await\n            .map(|opt| opt.map(|(msg, _)| msg))\n    }\n\n    /// Tries to receive the initial response message with preprocessing support.\n    ///\n    /// The preprocessor function can transform the raw message (e.g., unwrap envelopes)\n    /// and return metadata alongside the transformed message. If the transformed message\n    /// matches the expected `message_type`, both the message and metadata are returned.\n    /// Otherwise, the transformed message is buffered and `Ok(None)` is returned.\n    #[doc(hidden)]\n    pub async fn try_recv_initial_with_preprocessor<F, M>(\n        &mut self,\n        message_type: InitialMessageType,\n        preprocessor: F,\n    ) -> Result<Option<(Message, M)>, SdkError<E, RawMessage>>\n    where\n        F: FnOnce(Message) -> Result<(Message, M), ResponseError<RawMessage>>,\n    {\n        if let Some(message) = self.next_message().await? {\n            let (processed_message, metadata) =\n                preprocessor(message.clone()).map_err(|err| SdkError::ResponseError(err))?;\n\n            if let Some(event_type) = processed_message\n                .headers()\n                .iter()\n                .find(|h| h.name().as_str() == \":event-type\")\n            {\n                if event_type\n                    .value()\n                    .as_string()\n                    .map(|s| s.as_str() == message_type.as_str())\n                    .unwrap_or(false)\n                {\n                    return Ok(Some((processed_message, metadata)));\n                }\n            }\n            // Buffer the processed message so that it can be returned by the next call to `recv()`\n            self.buffered_message = Some(message);\n        }\n        Ok(None)\n    }\n\n    /// Asynchronously tries to receive a message from the stream. If the stream has ended,\n    /// it returns an `Ok(None)`. If there is a transport layer error, it will return\n    /// `Err(SdkError::DispatchFailure)`. Service-modeled errors will be a part of the returned\n    /// messages.\n    pub async fn recv(&mut self) -> Result<Option<T>, SdkError<E, RawMessage>> {\n        if let Some(buffered) = self.buffered_message.take() {\n            return match self.unmarshall(buffered) {\n                Ok(message) => Ok(message),\n                Err(error) => {\n                    self.buffer = RecvBuf::Terminated;\n                    Err(error)\n                }\n            };\n        }\n        if let Some(message) = self.next_message().await? {\n            match self.unmarshall(message) {\n                Ok(message) => Ok(message),\n                Err(error) => {\n                    self.buffer = RecvBuf::Terminated;\n                    Err(error)\n                }\n            }\n        } else {\n            Ok(None)\n        }\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::{InitialMessageType, Receiver, UnmarshallMessage};\n    use aws_smithy_eventstream::error::Error as EventStreamError;\n    use aws_smithy_eventstream::frame::{write_message_to, UnmarshalledMessage};\n    use aws_smithy_runtime_api::client::result::SdkError;\n    use aws_smithy_types::body::SdkBody;\n    use aws_smithy_types::event_stream::{Header, HeaderValue, Message};\n    use bytes::Bytes;\n    use hyper::body::Body;\n    use std::error::Error as StdError;\n    use std::io::{Error as IOError, ErrorKind};\n\n    fn encode_initial_response() -> Bytes {\n        let mut buffer = Vec::new();\n        let message = Message::new(Bytes::new())\n            .add_header(Header::new(\n                \":message-type\",\n                HeaderValue::String(\"event\".into()),\n            ))\n            .add_header(Header::new(\n                \":event-type\",\n                HeaderValue::String(\"initial-response\".into()),\n            ));\n        write_message_to(&message, &mut buffer).unwrap();\n        buffer.into()\n    }\n\n    fn encode_message(message: &str) -> Bytes {\n        let mut buffer = Vec::new();\n        let message = Message::new(Bytes::copy_from_slice(message.as_bytes()));\n        write_message_to(&message, &mut buffer).unwrap();\n        buffer.into()\n    }\n\n    #[derive(Debug)]\n    struct FakeError;\n    impl std::fmt::Display for FakeError {\n        fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n            write!(f, \"FakeError\")\n        }\n    }\n    impl StdError for FakeError {}\n\n    #[derive(Debug, Eq, PartialEq)]\n    struct TestMessage(String);\n\n    #[derive(Debug)]\n    struct Unmarshaller;\n    impl UnmarshallMessage for Unmarshaller {\n        type Output = TestMessage;\n        type Error = EventStreamError;\n\n        fn unmarshall(\n            &self,\n            message: &Message,\n        ) -> Result<UnmarshalledMessage<Self::Output, Self::Error>, EventStreamError> {\n            Ok(UnmarshalledMessage::Event(TestMessage(\n                std::str::from_utf8(&message.payload()[..]).unwrap().into(),\n            )))\n        }\n    }\n\n    #[tokio::test]\n    async fn receive_success() {\n        let chunks: Vec<Result<_, IOError>> =\n            vec![Ok(encode_message(\"one\")), Ok(encode_message(\"two\"))];\n        let chunk_stream = futures_util::stream::iter(chunks);\n        let body = SdkBody::from_body_0_4(Body::wrap_stream(chunk_stream));\n        let mut receiver = Receiver::<TestMessage, EventStreamError>::new(Unmarshaller, body);\n        assert_eq!(\n            TestMessage(\"one\".into()),\n            receiver.recv().await.unwrap().unwrap()\n        );\n        assert_eq!(\n            TestMessage(\"two\".into()),\n            receiver.recv().await.unwrap().unwrap()\n        );\n        assert_eq!(None, receiver.recv().await.unwrap());\n    }\n\n    #[tokio::test]\n    async fn receive_last_chunk_empty() {\n        let chunks: Vec<Result<_, IOError>> = vec![\n            Ok(encode_message(\"one\")),\n            Ok(encode_message(\"two\")),\n            Ok(Bytes::from_static(&[])),\n        ];\n        let chunk_stream = futures_util::stream::iter(chunks);\n        let body = SdkBody::from_body_0_4(Body::wrap_stream(chunk_stream));\n        let mut receiver = Receiver::<TestMessage, EventStreamError>::new(Unmarshaller, body);\n        assert_eq!(\n            TestMessage(\"one\".into()),\n            receiver.recv().await.unwrap().unwrap()\n        );\n        assert_eq!(\n            TestMessage(\"two\".into()),\n            receiver.recv().await.unwrap().unwrap()\n        );\n        assert_eq!(None, receiver.recv().await.unwrap());\n    }\n\n    #[tokio::test]\n    async fn receive_last_chunk_not_full_message() {\n        let chunks: Vec<Result<_, IOError>> = vec![\n            Ok(encode_message(\"one\")),\n            Ok(encode_message(\"two\")),\n            Ok(encode_message(\"three\").split_to(10)),\n        ];\n        let chunk_stream = futures_util::stream::iter(chunks);\n        let body = SdkBody::from_body_0_4(Body::wrap_stream(chunk_stream));\n        let mut receiver = Receiver::<TestMessage, EventStreamError>::new(Unmarshaller, body);\n        assert_eq!(\n            TestMessage(\"one\".into()),\n            receiver.recv().await.unwrap().unwrap()\n        );\n        assert_eq!(\n            TestMessage(\"two\".into()),\n            receiver.recv().await.unwrap().unwrap()\n        );\n        assert!(matches!(\n            receiver.recv().await,\n            Err(SdkError::ResponseError { .. }),\n        ));\n    }\n\n    #[tokio::test]\n    async fn receive_last_chunk_has_multiple_messages() {\n        let chunks: Vec<Result<_, IOError>> = vec![\n            Ok(encode_message(\"one\")),\n            Ok(encode_message(\"two\")),\n            Ok(Bytes::from(\n                [encode_message(\"three\"), encode_message(\"four\")].concat(),\n            )),\n        ];\n        let chunk_stream = futures_util::stream::iter(chunks);\n        let body = SdkBody::from_body_0_4(Body::wrap_stream(chunk_stream));\n        let mut receiver = Receiver::<TestMessage, EventStreamError>::new(Unmarshaller, body);\n        assert_eq!(\n            TestMessage(\"one\".into()),\n            receiver.recv().await.unwrap().unwrap()\n        );\n        assert_eq!(\n            TestMessage(\"two\".into()),\n            receiver.recv().await.unwrap().unwrap()\n        );\n        assert_eq!(\n            TestMessage(\"three\".into()),\n            receiver.recv().await.unwrap().unwrap()\n        );\n        assert_eq!(\n            TestMessage(\"four\".into()),\n            receiver.recv().await.unwrap().unwrap()\n        );\n        assert_eq!(None, receiver.recv().await.unwrap());\n    }\n\n    proptest::proptest! {\n        #[test]\n        fn receive_multiple_messages_split_unevenly_across_chunks(b1: usize, b2: usize) {\n            let combined = Bytes::from([\n                encode_message(\"one\"),\n                encode_message(\"two\"),\n                encode_message(\"three\"),\n                encode_message(\"four\"),\n                encode_message(\"five\"),\n                encode_message(\"six\"),\n                encode_message(\"seven\"),\n                encode_message(\"eight\"),\n            ].concat());\n\n            let midpoint = combined.len() / 2;\n            let (start, boundary1, boundary2, end) = (\n                0,\n                b1 % midpoint,\n                midpoint + b2 % midpoint,\n                combined.len()\n            );\n            println!(\"[{start}, {boundary1}], [{boundary1}, {boundary2}], [{boundary2}, {end}]\");\n\n            let rt = tokio::runtime::Runtime::new().unwrap();\n            rt.block_on(async move {\n                let chunks: Vec<Result<_, IOError>> = vec![\n                    Ok(Bytes::copy_from_slice(&combined[start..boundary1])),\n                    Ok(Bytes::copy_from_slice(&combined[boundary1..boundary2])),\n                    Ok(Bytes::copy_from_slice(&combined[boundary2..end])),\n                ];\n\n                let chunk_stream = futures_util::stream::iter(chunks);\n                let body = SdkBody::from_body_0_4(Body::wrap_stream(chunk_stream));\n                let mut receiver = Receiver::<TestMessage, EventStreamError>::new(Unmarshaller, body);\n                for payload in &[\"one\", \"two\", \"three\", \"four\", \"five\", \"six\", \"seven\", \"eight\"] {\n                    assert_eq!(\n                        TestMessage((*payload).into()),\n                        receiver.recv().await.unwrap().unwrap()\n                    );\n                }\n                assert_eq!(None, receiver.recv().await.unwrap());\n            });\n        }\n    }\n\n    #[tokio::test]\n    async fn receive_network_failure() {\n        let chunks: Vec<Result<_, IOError>> = vec![\n            Ok(encode_message(\"one\")),\n            Err(IOError::new(ErrorKind::ConnectionReset, FakeError)),\n        ];\n        let chunk_stream = futures_util::stream::iter(chunks);\n        let body = SdkBody::from_body_0_4(Body::wrap_stream(chunk_stream));\n        let mut receiver = Receiver::<TestMessage, EventStreamError>::new(Unmarshaller, body);\n        assert_eq!(\n            TestMessage(\"one\".into()),\n            receiver.recv().await.unwrap().unwrap()\n        );\n        assert!(matches!(\n            receiver.recv().await,\n            Err(SdkError::DispatchFailure(_))\n        ));\n    }\n\n    #[tokio::test]\n    async fn receive_message_parse_failure() {\n        let chunks: Vec<Result<_, IOError>> = vec![\n            Ok(encode_message(\"one\")),\n            // A zero length message will be invalid. We need to provide a minimum of 12 bytes\n            // for the MessageFrameDecoder to actually start parsing it.\n            Ok(Bytes::from_static(&[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])),\n        ];\n        let chunk_stream = futures_util::stream::iter(chunks);\n        let body = SdkBody::from_body_0_4(Body::wrap_stream(chunk_stream));\n        let mut receiver = Receiver::<TestMessage, EventStreamError>::new(Unmarshaller, body);\n        assert_eq!(\n            TestMessage(\"one\".into()),\n            receiver.recv().await.unwrap().unwrap()\n        );\n        assert!(matches!(\n            receiver.recv().await,\n            Err(SdkError::ResponseError { .. })\n        ));\n    }\n\n    #[tokio::test]\n    async fn receive_initial_response() {\n        let chunks: Vec<Result<_, IOError>> =\n            vec![Ok(encode_initial_response()), Ok(encode_message(\"one\"))];\n        let chunk_stream = futures_util::stream::iter(chunks);\n        let body = SdkBody::from_body_0_4(Body::wrap_stream(chunk_stream));\n        let mut receiver = Receiver::<TestMessage, EventStreamError>::new(Unmarshaller, body);\n        assert!(receiver\n            .try_recv_initial(InitialMessageType::Response)\n            .await\n            .unwrap()\n            .is_some());\n        assert_eq!(\n            TestMessage(\"one\".into()),\n            receiver.recv().await.unwrap().unwrap()\n        );\n    }\n\n    #[tokio::test]\n    async fn receive_no_initial_response() {\n        let chunks: Vec<Result<_, IOError>> =\n            vec![Ok(encode_message(\"one\")), Ok(encode_message(\"two\"))];\n        let chunk_stream = futures_util::stream::iter(chunks);\n        let body = SdkBody::from_body_0_4(Body::wrap_stream(chunk_stream));\n        let mut receiver = Receiver::<TestMessage, EventStreamError>::new(Unmarshaller, body);\n        assert!(receiver\n            .try_recv_initial(InitialMessageType::Response)\n            .await\n            .unwrap()\n            .is_none());\n        assert_eq!(\n            TestMessage(\"one\".into()),\n            receiver.recv().await.unwrap().unwrap()\n        );\n        assert_eq!(\n            TestMessage(\"two\".into()),\n            receiver.recv().await.unwrap().unwrap()\n        );\n    }\n\n    fn assert_send_and_sync<T: Send + Sync>() {}\n\n    #[tokio::test]\n    async fn receiver_is_send_and_sync() {\n        assert_send_and_sync::<Receiver<(), ()>>();\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http/src/event_stream/sender.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_smithy_eventstream::frame::{write_message_to, MarshallMessage, SignMessage};\nuse aws_smithy_eventstream::message_size_hint::MessageSizeHint;\nuse aws_smithy_runtime_api::client::result::SdkError;\nuse aws_smithy_types::error::ErrorMetadata;\nuse bytes::Bytes;\nuse futures_core::Stream;\nuse std::error::Error as StdError;\nuse std::fmt;\nuse std::fmt::Debug;\nuse std::marker::PhantomData;\nuse std::pin::Pin;\nuse std::task::{Context, Poll};\nuse tracing::trace;\n\n/// Input type for Event Streams.\npub struct EventStreamSender<T, E> {\n    input_stream: Pin<Box<dyn Stream<Item = Result<T, E>> + Send + Sync>>,\n}\n\nimpl<T, E> Debug for EventStreamSender<T, E> {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        let name_t = std::any::type_name::<T>();\n        let name_e = std::any::type_name::<E>();\n        write!(f, \"EventStreamSender<{name_t}, {name_e}>\")\n    }\n}\n\nimpl<T: Send + Sync + 'static, E: StdError + Send + Sync + 'static> EventStreamSender<T, E> {\n    /// Creates an `EventStreamSender` from a single item.\n    pub fn once(item: Result<T, E>) -> Self {\n        Self::from(futures_util::stream::once(async move { item }))\n    }\n}\n\nimpl<T, E: StdError + Send + Sync + 'static> EventStreamSender<T, E> {\n    #[doc(hidden)]\n    pub fn into_body_stream(\n        self,\n        marshaller: impl MarshallMessage<Input = T> + Send + Sync + 'static,\n        error_marshaller: impl MarshallMessage<Input = E> + Send + Sync + 'static,\n        signer: impl SignMessage + Send + Sync + 'static,\n    ) -> MessageStreamAdapter<T, E> {\n        MessageStreamAdapter::new(marshaller, error_marshaller, signer, self.input_stream)\n    }\n\n    /// Extract the inner stream. This is used internally for composing streams.\n    #[doc(hidden)]\n    pub fn into_inner(self) -> Pin<Box<dyn Stream<Item = Result<T, E>> + Send + Sync>> {\n        self.input_stream\n    }\n}\n\nimpl<T, E, S> From<S> for EventStreamSender<T, E>\nwhere\n    S: Stream<Item = Result<T, E>> + Send + Sync + 'static,\n{\n    fn from(stream: S) -> Self {\n        EventStreamSender {\n            input_stream: Box::pin(stream),\n        }\n    }\n}\n\n/// An error that occurs within a message stream.\n#[derive(Debug)]\npub struct MessageStreamError {\n    kind: MessageStreamErrorKind,\n    pub(crate) meta: ErrorMetadata,\n}\n\n#[derive(Debug)]\nenum MessageStreamErrorKind {\n    Unhandled(Box<dyn std::error::Error + Send + Sync + 'static>),\n}\n\nimpl MessageStreamError {\n    /// Creates the `MessageStreamError::Unhandled` variant from any error type.\n    pub fn unhandled(err: impl Into<Box<dyn std::error::Error + Send + Sync + 'static>>) -> Self {\n        Self {\n            meta: Default::default(),\n            kind: MessageStreamErrorKind::Unhandled(err.into()),\n        }\n    }\n\n    /// Creates the `MessageStreamError::Unhandled` variant from an [`ErrorMetadata`].\n    pub fn generic(err: ErrorMetadata) -> Self {\n        Self {\n            meta: err.clone(),\n            kind: MessageStreamErrorKind::Unhandled(err.into()),\n        }\n    }\n\n    /// Returns error metadata, which includes the error code, message,\n    /// request ID, and potentially additional information.\n    pub fn meta(&self) -> &ErrorMetadata {\n        &self.meta\n    }\n}\n\nimpl StdError for MessageStreamError {\n    fn source(&self) -> Option<&(dyn StdError + 'static)> {\n        match &self.kind {\n            MessageStreamErrorKind::Unhandled(source) => Some(source.as_ref() as _),\n        }\n    }\n}\n\nimpl fmt::Display for MessageStreamError {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        match &self.kind {\n            MessageStreamErrorKind::Unhandled(_) => write!(f, \"message stream error\"),\n        }\n    }\n}\n\n/// Adapts a `Stream<SmithyMessageType>` to a signed `Stream<Bytes>` by using the provided\n/// message marshaller and signer implementations.\n///\n/// This will yield an `Err(SdkError::ConstructionFailure)` if a message can't be\n/// marshalled into an Event Stream frame, (e.g., if the message payload was too large).\n#[allow(missing_debug_implementations)]\npub struct MessageStreamAdapter<T, E: StdError + Send + Sync + 'static> {\n    marshaller: Box<dyn MarshallMessage<Input = T> + Send + Sync>,\n    error_marshaller: Box<dyn MarshallMessage<Input = E> + Send + Sync>,\n    signer: Box<dyn SignMessage + Send + Sync>,\n    stream: Pin<Box<dyn Stream<Item = Result<T, E>> + Send>>,\n    end_signal_sent: bool,\n    _phantom: PhantomData<E>,\n}\n\nimpl<T, E: StdError + Send + Sync + 'static> Unpin for MessageStreamAdapter<T, E> {}\n\nimpl<T, E: StdError + Send + Sync + 'static> MessageStreamAdapter<T, E> {\n    /// Create a new `MessageStreamAdapter`.\n    pub fn new(\n        marshaller: impl MarshallMessage<Input = T> + Send + Sync + 'static,\n        error_marshaller: impl MarshallMessage<Input = E> + Send + Sync + 'static,\n        signer: impl SignMessage + Send + Sync + 'static,\n        stream: Pin<Box<dyn Stream<Item = Result<T, E>> + Send>>,\n    ) -> Self {\n        MessageStreamAdapter {\n            marshaller: Box::new(marshaller),\n            error_marshaller: Box::new(error_marshaller),\n            signer: Box::new(signer),\n            stream,\n            end_signal_sent: false,\n            _phantom: Default::default(),\n        }\n    }\n}\n\nimpl<T, E: StdError + Send + Sync + 'static> Stream for MessageStreamAdapter<T, E> {\n    type Item =\n        Result<Bytes, SdkError<E, aws_smithy_runtime_api::client::orchestrator::HttpResponse>>;\n\n    fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Option<Self::Item>> {\n        match self.stream.as_mut().poll_next(cx) {\n            Poll::Ready(message_option) => {\n                if let Some(message_result) = message_option {\n                    let message = match message_result {\n                        Ok(message) => self\n                            .marshaller\n                            .marshall(message)\n                            .map_err(SdkError::construction_failure)?,\n                        Err(message) => self\n                            .error_marshaller\n                            .marshall(message)\n                            .map_err(SdkError::construction_failure)?,\n                    };\n\n                    trace!(unsigned_message = ?message, \"signing event stream message\");\n                    let message = self\n                        .signer\n                        .sign(message)\n                        .map_err(SdkError::construction_failure)?;\n\n                    let mut buffer = Vec::with_capacity(message.size_hint());\n                    write_message_to(&message, &mut buffer)\n                        .map_err(SdkError::construction_failure)?;\n                    trace!(signed_message = ?buffer, \"sending signed event stream message\");\n                    Poll::Ready(Some(Ok(Bytes::from(buffer))))\n                } else if !self.end_signal_sent {\n                    self.end_signal_sent = true;\n                    match self.signer.sign_empty() {\n                        Some(sign) => {\n                            let message = sign.map_err(SdkError::construction_failure)?;\n                            let mut buffer = Vec::with_capacity(message.size_hint());\n                            write_message_to(&message, &mut buffer)\n                                .map_err(SdkError::construction_failure)?;\n                            trace!(signed_message = ?buffer, \"sending signed empty message to terminate the event stream\");\n                            Poll::Ready(Some(Ok(Bytes::from(buffer))))\n                        }\n                        None => Poll::Ready(None),\n                    }\n                } else {\n                    Poll::Ready(None)\n                }\n            }\n            Poll::Pending => Poll::Pending,\n        }\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::MarshallMessage;\n    use crate::event_stream::{EventStreamSender, MessageStreamAdapter};\n    use async_stream::stream;\n    use aws_smithy_eventstream::error::Error as EventStreamError;\n    use aws_smithy_eventstream::frame::{\n        read_message_from, write_message_to, NoOpSigner, SignMessage, SignMessageError,\n    };\n    use aws_smithy_runtime_api::client::result::SdkError;\n    use aws_smithy_types::event_stream::{Header, HeaderValue, Message};\n    use bytes::Bytes;\n    use futures_core::Stream;\n    use futures_util::stream::StreamExt;\n    use std::error::Error as StdError;\n\n    #[derive(Debug, Eq, PartialEq)]\n    struct TestMessage(String);\n\n    #[derive(Debug)]\n    struct Marshaller;\n    impl MarshallMessage for Marshaller {\n        type Input = TestMessage;\n\n        fn marshall(&self, input: Self::Input) -> Result<Message, EventStreamError> {\n            Ok(Message::new(input.0.as_bytes().to_vec()))\n        }\n    }\n    #[derive(Debug)]\n    struct ErrorMarshaller;\n    impl MarshallMessage for ErrorMarshaller {\n        type Input = TestServiceError;\n\n        fn marshall(&self, _input: Self::Input) -> Result<Message, EventStreamError> {\n            Err(read_message_from(&b\"\"[..]).expect_err(\"this should always fail\"))\n        }\n    }\n\n    #[derive(Debug)]\n    struct TestServiceError;\n    impl std::fmt::Display for TestServiceError {\n        fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n            write!(f, \"TestServiceError\")\n        }\n    }\n    impl StdError for TestServiceError {}\n\n    #[derive(Debug)]\n    struct TestSigner;\n    impl SignMessage for TestSigner {\n        fn sign(&mut self, message: Message) -> Result<Message, SignMessageError> {\n            let mut buffer = Vec::new();\n            write_message_to(&message, &mut buffer).unwrap();\n            Ok(Message::new(buffer).add_header(Header::new(\"signed\", HeaderValue::Bool(true))))\n        }\n\n        fn sign_empty(&mut self) -> Option<Result<Message, SignMessageError>> {\n            Some(Ok(\n                Message::new(&b\"\"[..]).add_header(Header::new(\"signed\", HeaderValue::Bool(true)))\n            ))\n        }\n    }\n\n    fn check_send_sync<T: Send + Sync>(value: T) -> T {\n        value\n    }\n\n    #[test]\n    fn event_stream_sender_send_sync() {\n        check_send_sync(EventStreamSender::from(stream! {\n            yield Result::<_, SignMessageError>::Ok(TestMessage(\"test\".into()));\n        }));\n    }\n\n    fn check_compatible_with_hyper_wrap_stream<S, O, E>(stream: S) -> S\n    where\n        S: Stream<Item = Result<O, E>> + Send + 'static,\n        O: Into<Bytes> + 'static,\n        E: Into<Box<dyn StdError + Send + Sync + 'static>> + 'static,\n    {\n        stream\n    }\n\n    #[tokio::test]\n    async fn message_stream_adapter_success() {\n        let stream = stream! {\n            yield Ok(TestMessage(\"test\".into()));\n        };\n        let mut adapter = check_compatible_with_hyper_wrap_stream(MessageStreamAdapter::<\n            TestMessage,\n            TestServiceError,\n        >::new(\n            Marshaller,\n            ErrorMarshaller,\n            TestSigner,\n            Box::pin(stream),\n        ));\n\n        let mut sent_bytes = adapter.next().await.unwrap().unwrap();\n        let sent = read_message_from(&mut sent_bytes).unwrap();\n        assert_eq!(\"signed\", sent.headers()[0].name().as_str());\n        assert_eq!(&HeaderValue::Bool(true), sent.headers()[0].value());\n        let inner = read_message_from(&mut (&sent.payload()[..])).unwrap();\n        assert_eq!(&b\"test\"[..], &inner.payload()[..]);\n\n        let mut end_signal_bytes = adapter.next().await.unwrap().unwrap();\n        let end_signal = read_message_from(&mut end_signal_bytes).unwrap();\n        assert_eq!(\"signed\", end_signal.headers()[0].name().as_str());\n        assert_eq!(&HeaderValue::Bool(true), end_signal.headers()[0].value());\n        assert_eq!(0, end_signal.payload().len());\n    }\n\n    #[tokio::test]\n    async fn message_stream_adapter_construction_failure() {\n        let stream = stream! {\n            yield Err(TestServiceError);\n        };\n        let mut adapter = check_compatible_with_hyper_wrap_stream(MessageStreamAdapter::<\n            TestMessage,\n            TestServiceError,\n        >::new(\n            Marshaller,\n            ErrorMarshaller,\n            NoOpSigner {},\n            Box::pin(stream),\n        ));\n\n        let result = adapter.next().await.unwrap();\n        assert!(result.is_err());\n        assert!(matches!(\n            result.err().unwrap(),\n            SdkError::ConstructionFailure(_)\n        ));\n    }\n\n    #[tokio::test]\n    async fn event_stream_sender_once() {\n        let sender = EventStreamSender::once(Ok(TestMessage(\"test\".into())));\n        let mut adapter = MessageStreamAdapter::<TestMessage, TestServiceError>::new(\n            Marshaller,\n            ErrorMarshaller,\n            TestSigner,\n            sender.input_stream,\n        );\n\n        let mut sent_bytes = adapter.next().await.unwrap().unwrap();\n        let sent = read_message_from(&mut sent_bytes).unwrap();\n        assert_eq!(\"signed\", sent.headers()[0].name().as_str());\n        let inner = read_message_from(&mut (&sent.payload()[..])).unwrap();\n        assert_eq!(&b\"test\"[..], &inner.payload()[..]);\n\n        // Should get end signal next\n        let mut end_signal_bytes = adapter.next().await.unwrap().unwrap();\n        let end_signal = read_message_from(&mut end_signal_bytes).unwrap();\n        assert_eq!(\"signed\", end_signal.headers()[0].name().as_str());\n        assert_eq!(0, end_signal.payload().len());\n\n        // Stream should be exhausted\n        assert!(adapter.next().await.is_none());\n    }\n\n    // Verify the developer experience for this compiles\n    #[allow(unused)]\n    fn event_stream_input_ergonomics() {\n        fn check(input: impl Into<EventStreamSender<TestMessage, TestServiceError>>) {\n            let _: EventStreamSender<TestMessage, TestServiceError> = input.into();\n        }\n        check(stream! {\n            yield Ok(TestMessage(\"test\".into()));\n        });\n        check(stream! {\n            yield Err(TestServiceError);\n        });\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http/src/event_stream.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Provides Sender/Receiver implementations for Event Stream codegen.\n\nuse std::error::Error as StdError;\n\nmod receiver;\nmod sender;\n\n/// A generic, boxed error that's `Send`, `Sync`, and `'static`.\npub type BoxError = Box<dyn StdError + Send + Sync + 'static>;\n\n#[doc(inline)]\npub use sender::{EventStreamSender, MessageStreamAdapter, MessageStreamError};\n\n#[doc(inline)]\npub use aws_smithy_http::event_stream::{EventOrInitial, EventOrInitialMarshaller};\n\n#[doc(inline)]\npub use receiver::{InitialMessageType, Receiver, ReceiverError};\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http/src/futures_stream_adapter.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_smithy_types::body::SdkBody;\nuse aws_smithy_types::byte_stream::error::Error as ByteStreamError;\nuse aws_smithy_types::byte_stream::ByteStream;\nuse bytes::Bytes;\nuse futures_core::stream::Stream;\nuse std::pin::Pin;\nuse std::task::{Context, Poll};\n\n/// A new-type wrapper to enable the impl of the `futures_core::stream::Stream` trait\n///\n/// [`ByteStream`] no longer implements `futures_core::stream::Stream` so we wrap it in the\n/// new-type to enable the trait when it is required.\n///\n/// This is meant to be used by codegen code, and users should not need to use it directly.\n#[derive(Debug)]\npub struct FuturesStreamCompatByteStream(ByteStream);\n\nimpl FuturesStreamCompatByteStream {\n    /// Creates a new `FuturesStreamCompatByteStream` by wrapping `stream`.\n    pub fn new(stream: ByteStream) -> Self {\n        Self(stream)\n    }\n\n    /// Returns [`SdkBody`] of the wrapped [`ByteStream`].\n    pub fn into_inner(self) -> SdkBody {\n        self.0.into_inner()\n    }\n}\n\nimpl Stream for FuturesStreamCompatByteStream {\n    type Item = Result<Bytes, ByteStreamError>;\n\n    fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Option<Self::Item>> {\n        Pin::new(&mut self.0).poll_next(cx)\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use futures_core::stream::Stream;\n\n    fn check_compatible_with_hyper_wrap_stream<S, O, E>(stream: S) -> S\n    where\n        S: Stream<Item = Result<O, E>> + Send + 'static,\n        O: Into<Bytes> + 'static,\n        E: Into<Box<dyn std::error::Error + Send + Sync + 'static>> + 'static,\n    {\n        stream\n    }\n\n    #[test]\n    fn test_byte_stream_stream_can_be_made_compatible_with_hyper_wrap_stream() {\n        let stream = ByteStream::from_static(b\"Hello world\");\n        check_compatible_with_hyper_wrap_stream(FuturesStreamCompatByteStream::new(stream));\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http/src/header.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Utilities for parsing information from headers\n\nuse aws_smithy_types::date_time::Format;\nuse aws_smithy_types::primitive::Parse;\nuse aws_smithy_types::DateTime;\nuse http_02x::header::{HeaderMap, HeaderName, HeaderValue};\nuse std::borrow::Cow;\nuse std::error::Error;\nuse std::fmt;\nuse std::str::FromStr;\n\n/// An error was encountered while parsing a header\n#[derive(Debug)]\npub struct ParseError {\n    message: Cow<'static, str>,\n    source: Option<Box<dyn Error + Send + Sync + 'static>>,\n}\n\nimpl ParseError {\n    /// Create a new parse error with the given `message`\n    pub fn new(message: impl Into<Cow<'static, str>>) -> Self {\n        Self {\n            message: message.into(),\n            source: None,\n        }\n    }\n\n    /// Attach a source to this error.\n    pub fn with_source(self, source: impl Into<Box<dyn Error + Send + Sync + 'static>>) -> Self {\n        Self {\n            source: Some(source.into()),\n            ..self\n        }\n    }\n}\n\nimpl fmt::Display for ParseError {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        write!(f, \"output failed to parse in headers: {}\", self.message)\n    }\n}\n\nimpl Error for ParseError {\n    fn source(&self) -> Option<&(dyn Error + 'static)> {\n        self.source.as_ref().map(|err| err.as_ref() as _)\n    }\n}\n\n/// Read all the dates from the header map at `key` according the `format`\n///\n/// This is separate from `read_many` below because we need to invoke `DateTime::read` to take advantage\n/// of comma-aware parsing\npub fn many_dates<'a>(\n    values: impl Iterator<Item = &'a str>,\n    format: Format,\n) -> Result<Vec<DateTime>, ParseError> {\n    let mut out = vec![];\n    for header in values {\n        let mut header = header;\n        while !header.is_empty() {\n            let (v, next) = DateTime::read(header, format, ',').map_err(|err| {\n                ParseError::new(format!(\"header could not be parsed as date: {err}\"))\n            })?;\n            out.push(v);\n            header = next;\n        }\n    }\n    Ok(out)\n}\n\n/// Returns an iterator over pairs where the first element is the unprefixed header name that\n/// starts with the input `key` prefix, and the second element is the full header name.\npub fn headers_for_prefix<'a>(\n    header_names: impl Iterator<Item = &'a str>,\n    key: &'a str,\n) -> impl Iterator<Item = (&'a str, &'a str)> {\n    let lower_key = key.to_ascii_lowercase();\n    header_names\n        .filter(move |k| k.starts_with(&lower_key))\n        .map(move |k| (&k[key.len()..], k))\n}\n\n/// Convert a `HeaderValue` into a `Vec<T>` where `T: FromStr`\npub fn read_many_from_str<'a, T: FromStr>(\n    values: impl Iterator<Item = &'a str>,\n) -> Result<Vec<T>, ParseError>\nwhere\n    T::Err: Error + Send + Sync + 'static,\n{\n    read_many(values, |v: &str| {\n        v.parse().map_err(|err| {\n            ParseError::new(\"failed during `FromString` conversion\").with_source(err)\n        })\n    })\n}\n\n/// Convert a `HeaderValue` into a `Vec<T>` where `T: Parse`\npub fn read_many_primitive<'a, T: Parse>(\n    values: impl Iterator<Item = &'a str>,\n) -> Result<Vec<T>, ParseError> {\n    read_many(values, |v: &str| {\n        T::parse_smithy_primitive(v)\n            .map_err(|err| ParseError::new(\"failed reading a list of primitives\").with_source(err))\n    })\n}\n\n/// Read many comma / header delimited values from HTTP headers for `FromStr` types\nfn read_many<'a, T>(\n    values: impl Iterator<Item = &'a str>,\n    f: impl Fn(&str) -> Result<T, ParseError>,\n) -> Result<Vec<T>, ParseError> {\n    let mut out = vec![];\n    for header in values {\n        let mut header = header.as_bytes();\n        while !header.is_empty() {\n            let (v, next) = read_one(header, &f)?;\n            out.push(v);\n            header = next;\n        }\n    }\n    Ok(out)\n}\n\n/// Read exactly one or none from a headers iterator\n///\n/// This function does not perform comma splitting like `read_many`\npub fn one_or_none<'a, T: FromStr>(\n    mut values: impl Iterator<Item = &'a str>,\n) -> Result<Option<T>, ParseError>\nwhere\n    T::Err: Error + Send + Sync + 'static,\n{\n    let first = match values.next() {\n        Some(v) => v,\n        None => return Ok(None),\n    };\n    match values.next() {\n        None => T::from_str(first.trim())\n            .map_err(|err| ParseError::new(\"failed to parse string\").with_source(err))\n            .map(Some),\n        Some(_) => Err(ParseError::new(\n            \"expected a single value but found multiple\",\n        )),\n    }\n}\n\n/// Given an HTTP request, set a request header if that header was not already set.\npub fn set_request_header_if_absent<V>(\n    request: http_02x::request::Builder,\n    key: HeaderName,\n    value: V,\n) -> http_02x::request::Builder\nwhere\n    HeaderValue: TryFrom<V>,\n    <HeaderValue as TryFrom<V>>::Error: Into<http_02x::Error>,\n{\n    if !request\n        .headers_ref()\n        .map(|map| map.contains_key(&key))\n        .unwrap_or(false)\n    {\n        request.header(key, value)\n    } else {\n        request\n    }\n}\n\n/// Given an HTTP response, set a response header if that header was not already set.\npub fn set_response_header_if_absent<V>(\n    response: http_02x::response::Builder,\n    key: HeaderName,\n    value: V,\n) -> http_02x::response::Builder\nwhere\n    HeaderValue: TryFrom<V>,\n    <HeaderValue as TryFrom<V>>::Error: Into<http_02x::Error>,\n{\n    if !response\n        .headers_ref()\n        .map(|map| map.contains_key(&key))\n        .unwrap_or(false)\n    {\n        response.header(key, value)\n    } else {\n        response\n    }\n}\n\n/// Functions for parsing multiple comma-delimited header values out of a\n/// single header. This parsing adheres to\n/// [RFC-7230's specification of header values](https://datatracker.ietf.org/doc/html/rfc7230#section-3.2.6).\nmod parse_multi_header {\n    use super::ParseError;\n    use std::borrow::Cow;\n\n    fn trim(s: Cow<'_, str>) -> Cow<'_, str> {\n        match s {\n            Cow::Owned(s) => Cow::Owned(s.trim().into()),\n            Cow::Borrowed(s) => Cow::Borrowed(s.trim()),\n        }\n    }\n\n    fn replace<'a>(value: Cow<'a, str>, pattern: &str, replacement: &str) -> Cow<'a, str> {\n        if value.contains(pattern) {\n            Cow::Owned(value.replace(pattern, replacement))\n        } else {\n            value\n        }\n    }\n\n    /// Reads a single value out of the given input, and returns a tuple containing\n    /// the parsed value and the remainder of the slice that can be used to parse\n    /// more values.\n    pub(crate) fn read_value(input: &[u8]) -> Result<(Cow<'_, str>, &[u8]), ParseError> {\n        for (index, &byte) in input.iter().enumerate() {\n            let current_slice = &input[index..];\n            match byte {\n                b' ' | b'\\t' => { /* skip whitespace */ }\n                b'\"' => return read_quoted_value(&current_slice[1..]),\n                _ => {\n                    let (value, rest) = read_unquoted_value(current_slice)?;\n                    return Ok((trim(value), rest));\n                }\n            }\n        }\n\n        // We only end up here if the entire header value was whitespace or empty\n        Ok((Cow::Borrowed(\"\"), &[]))\n    }\n\n    fn read_unquoted_value(input: &[u8]) -> Result<(Cow<'_, str>, &[u8]), ParseError> {\n        let next_delim = input.iter().position(|&b| b == b',').unwrap_or(input.len());\n        let (first, next) = input.split_at(next_delim);\n        let first = std::str::from_utf8(first)\n            .map_err(|_| ParseError::new(\"header was not valid utf-8\"))?;\n        Ok((Cow::Borrowed(first), then_comma(next).unwrap()))\n    }\n\n    /// Reads a header value that is surrounded by quotation marks and may have escaped\n    /// quotes inside of it.\n    fn read_quoted_value(input: &[u8]) -> Result<(Cow<'_, str>, &[u8]), ParseError> {\n        for index in 0..input.len() {\n            match input[index] {\n                b'\"' if index == 0 || input[index - 1] != b'\\\\' => {\n                    let mut inner = Cow::Borrowed(\n                        std::str::from_utf8(&input[0..index])\n                            .map_err(|_| ParseError::new(\"header was not valid utf-8\"))?,\n                    );\n                    inner = replace(inner, \"\\\\\\\"\", \"\\\"\");\n                    inner = replace(inner, \"\\\\\\\\\", \"\\\\\");\n                    let rest = then_comma(&input[(index + 1)..])?;\n                    return Ok((inner, rest));\n                }\n                _ => {}\n            }\n        }\n        Err(ParseError::new(\n            \"header value had quoted value without end quote\",\n        ))\n    }\n\n    fn then_comma(s: &[u8]) -> Result<&[u8], ParseError> {\n        if s.is_empty() {\n            Ok(s)\n        } else if s.starts_with(b\",\") {\n            Ok(&s[1..])\n        } else {\n            Err(ParseError::new(\"expected delimiter `,`\"))\n        }\n    }\n}\n\n/// Read one comma delimited value for `FromStr` types\nfn read_one<'a, T>(\n    s: &'a [u8],\n    f: &impl Fn(&str) -> Result<T, ParseError>,\n) -> Result<(T, &'a [u8]), ParseError> {\n    let (value, rest) = parse_multi_header::read_value(s)?;\n    Ok((f(&value)?, rest))\n}\n\n/// Conditionally quotes and escapes a header value if the header value contains a comma or quote.\npub fn quote_header_value<'a>(value: impl Into<Cow<'a, str>>) -> Cow<'a, str> {\n    let value = value.into();\n    if value.trim().len() != value.len()\n        || value.contains('\"')\n        || value.contains(',')\n        || value.contains('(')\n        || value.contains(')')\n    {\n        Cow::Owned(format!(\n            \"\\\"{}\\\"\",\n            value.replace('\\\\', \"\\\\\\\\\").replace('\"', \"\\\\\\\"\")\n        ))\n    } else {\n        value\n    }\n}\n\n/// Given two [`HeaderMap`]s, merge them together and return the merged `HeaderMap`. If the\n/// two `HeaderMap`s share any keys, values from the right `HeaderMap` be appended to the left `HeaderMap`.\npub fn append_merge_header_maps(\n    mut lhs: HeaderMap<HeaderValue>,\n    rhs: HeaderMap<HeaderValue>,\n) -> HeaderMap<HeaderValue> {\n    let mut last_header_name_seen = None;\n    for (header_name, header_value) in rhs.into_iter() {\n        // For each yielded item that has None provided for the `HeaderName`,\n        // then the associated header name is the same as that of the previously\n        // yielded item. The first yielded item will have `HeaderName` set.\n        // https://docs.rs/http/latest/http/header/struct.HeaderMap.html#method.into_iter-2\n        match (&mut last_header_name_seen, header_name) {\n            (_, Some(header_name)) => {\n                lhs.append(header_name.clone(), header_value);\n                last_header_name_seen = Some(header_name);\n            }\n            (Some(header_name), None) => {\n                lhs.append(header_name.clone(), header_value);\n            }\n            (None, None) => unreachable!(),\n        };\n    }\n\n    lhs\n}\n\n#[cfg(test)]\nmod test {\n    use super::quote_header_value;\n    use crate::header::{\n        append_merge_header_maps, headers_for_prefix, many_dates, read_many_from_str,\n        read_many_primitive, set_request_header_if_absent, set_response_header_if_absent,\n        ParseError,\n    };\n    use aws_smithy_runtime_api::http::Request;\n    use aws_smithy_types::error::display::DisplayErrorContext;\n    use aws_smithy_types::{date_time::Format, DateTime};\n    use http_02x::header::{HeaderMap, HeaderName, HeaderValue};\n    use std::collections::HashMap;\n\n    #[test]\n    fn put_on_request_if_absent() {\n        let builder = http_02x::Request::builder().header(\"foo\", \"bar\");\n        let builder = set_request_header_if_absent(builder, HeaderName::from_static(\"foo\"), \"baz\");\n        let builder =\n            set_request_header_if_absent(builder, HeaderName::from_static(\"other\"), \"value\");\n        let req = builder.body(()).expect(\"valid request\");\n        assert_eq!(\n            req.headers().get_all(\"foo\").iter().collect::<Vec<_>>(),\n            vec![\"bar\"]\n        );\n        assert_eq!(\n            req.headers().get_all(\"other\").iter().collect::<Vec<_>>(),\n            vec![\"value\"]\n        );\n    }\n\n    #[test]\n    fn put_on_response_if_absent() {\n        let builder = http_02x::Response::builder().header(\"foo\", \"bar\");\n        let builder = set_response_header_if_absent(builder, HeaderName::from_static(\"foo\"), \"baz\");\n        let builder =\n            set_response_header_if_absent(builder, HeaderName::from_static(\"other\"), \"value\");\n        let response = builder.body(()).expect(\"valid response\");\n        assert_eq!(\n            response.headers().get_all(\"foo\").iter().collect::<Vec<_>>(),\n            vec![\"bar\"]\n        );\n        assert_eq!(\n            response\n                .headers()\n                .get_all(\"other\")\n                .iter()\n                .collect::<Vec<_>>(),\n            vec![\"value\"]\n        );\n    }\n\n    #[test]\n    fn parse_floats() {\n        let test_request = http_02x::Request::builder()\n            .header(\"X-Float-Multi\", \"0.0,Infinity,-Infinity,5555.5\")\n            .header(\"X-Float-Error\", \"notafloat\")\n            .body(())\n            .unwrap();\n        assert_eq!(\n            read_many_primitive::<f32>(\n                test_request\n                    .headers()\n                    .get_all(\"X-Float-Multi\")\n                    .iter()\n                    .map(|v| v.to_str().unwrap())\n            )\n            .expect(\"valid\"),\n            vec![0.0, f32::INFINITY, f32::NEG_INFINITY, 5555.5]\n        );\n        let message = format!(\n            \"{}\",\n            DisplayErrorContext(\n                read_many_primitive::<f32>(\n                    test_request\n                        .headers()\n                        .get_all(\"X-Float-Error\")\n                        .iter()\n                        .map(|v| v.to_str().unwrap())\n                )\n                .expect_err(\"invalid\")\n            )\n        );\n        let expected = \"output failed to parse in headers: failed reading a list of primitives: failed to parse input as f32\";\n        assert!(\n            message.starts_with(expected),\n            \"expected '{message}' to start with '{expected}'\"\n        );\n    }\n\n    #[test]\n    fn test_many_dates() {\n        let test_request = http_02x::Request::builder()\n            .header(\"Empty\", \"\")\n            .header(\"SingleHttpDate\", \"Wed, 21 Oct 2015 07:28:00 GMT\")\n            .header(\n                \"MultipleHttpDates\",\n                \"Wed, 21 Oct 2015 07:28:00 GMT,Thu, 22 Oct 2015 07:28:00 GMT\",\n            )\n            .header(\"SingleEpochSeconds\", \"1234.5678\")\n            .header(\"MultipleEpochSeconds\", \"1234.5678,9012.3456\")\n            .body(())\n            .unwrap();\n        let read = |name: &str, format: Format| {\n            many_dates(\n                test_request\n                    .headers()\n                    .get_all(name)\n                    .iter()\n                    .map(|v| v.to_str().unwrap()),\n                format,\n            )\n        };\n        let read_valid = |name: &str, format: Format| read(name, format).expect(\"valid\");\n        assert_eq!(\n            read_valid(\"Empty\", Format::DateTime),\n            Vec::<DateTime>::new()\n        );\n        assert_eq!(\n            read_valid(\"SingleHttpDate\", Format::HttpDate),\n            vec![DateTime::from_secs_and_nanos(1445412480, 0)]\n        );\n        assert_eq!(\n            read_valid(\"MultipleHttpDates\", Format::HttpDate),\n            vec![\n                DateTime::from_secs_and_nanos(1445412480, 0),\n                DateTime::from_secs_and_nanos(1445498880, 0)\n            ]\n        );\n        assert_eq!(\n            read_valid(\"SingleEpochSeconds\", Format::EpochSeconds),\n            vec![DateTime::from_secs_and_nanos(1234, 567_800_000)]\n        );\n        assert_eq!(\n            read_valid(\"MultipleEpochSeconds\", Format::EpochSeconds),\n            vec![\n                DateTime::from_secs_and_nanos(1234, 567_800_000),\n                DateTime::from_secs_and_nanos(9012, 345_600_000)\n            ]\n        );\n    }\n\n    #[test]\n    fn read_many_strings() {\n        let test_request = http_02x::Request::builder()\n            .header(\"Empty\", \"\")\n            .header(\"Foo\", \"  foo\")\n            .header(\"FooTrailing\", \"foo   \")\n            .header(\"FooInQuotes\", \"\\\"  foo  \\\"\")\n            .header(\"CommaInQuotes\", \"\\\"foo,bar\\\",baz\")\n            .header(\"CommaInQuotesTrailing\", \"\\\"foo,bar\\\",baz  \")\n            .header(\"QuoteInQuotes\", \"\\\"foo\\\\\\\",bar\\\",\\\"\\\\\\\"asdf\\\\\\\"\\\",baz\")\n            .header(\n                \"QuoteInQuotesWithSpaces\",\n                \"\\\"foo\\\\\\\",bar\\\", \\\"\\\\\\\"asdf\\\\\\\"\\\", baz\",\n            )\n            .header(\"JunkFollowingQuotes\", \"\\\"\\\\\\\"asdf\\\\\\\"\\\"baz\")\n            .header(\"EmptyQuotes\", \"\\\"\\\",baz\")\n            .header(\"EscapedSlashesInQuotes\", \"foo, \\\"(foo\\\\\\\\bar)\\\"\")\n            .body(())\n            .unwrap();\n        let read = |name: &str| {\n            read_many_from_str::<String>(\n                test_request\n                    .headers()\n                    .get_all(name)\n                    .iter()\n                    .map(|v| v.to_str().unwrap()),\n            )\n        };\n        let read_valid = |name: &str| read(name).expect(\"valid\");\n        assert_eq!(read_valid(\"Empty\"), Vec::<String>::new());\n        assert_eq!(read_valid(\"Foo\"), vec![\"foo\"]);\n        assert_eq!(read_valid(\"FooTrailing\"), vec![\"foo\"]);\n        assert_eq!(read_valid(\"FooInQuotes\"), vec![\"  foo  \"]);\n        assert_eq!(read_valid(\"CommaInQuotes\"), vec![\"foo,bar\", \"baz\"]);\n        assert_eq!(read_valid(\"CommaInQuotesTrailing\"), vec![\"foo,bar\", \"baz\"]);\n        assert_eq!(\n            read_valid(\"QuoteInQuotes\"),\n            vec![\"foo\\\",bar\", \"\\\"asdf\\\"\", \"baz\"]\n        );\n        assert_eq!(\n            read_valid(\"QuoteInQuotesWithSpaces\"),\n            vec![\"foo\\\",bar\", \"\\\"asdf\\\"\", \"baz\"]\n        );\n        assert!(read(\"JunkFollowingQuotes\").is_err());\n        assert_eq!(read_valid(\"EmptyQuotes\"), vec![\"\", \"baz\"]);\n        assert_eq!(\n            read_valid(\"EscapedSlashesInQuotes\"),\n            vec![\"foo\", \"(foo\\\\bar)\"]\n        );\n    }\n\n    #[test]\n    fn read_many_bools() {\n        let test_request = http_02x::Request::builder()\n            .header(\"X-Bool-Multi\", \"true,false\")\n            .header(\"X-Bool-Multi\", \"true\")\n            .header(\"X-Bool\", \"true\")\n            .header(\"X-Bool-Invalid\", \"truth,falsy\")\n            .header(\"X-Bool-Single\", \"true,false,true,true\")\n            .header(\"X-Bool-Quoted\", \"true,\\\"false\\\",true,true\")\n            .body(())\n            .unwrap();\n        assert_eq!(\n            read_many_primitive::<bool>(\n                test_request\n                    .headers()\n                    .get_all(\"X-Bool-Multi\")\n                    .iter()\n                    .map(|v| v.to_str().unwrap())\n            )\n            .expect(\"valid\"),\n            vec![true, false, true]\n        );\n\n        assert_eq!(\n            read_many_primitive::<bool>(\n                test_request\n                    .headers()\n                    .get_all(\"X-Bool\")\n                    .iter()\n                    .map(|v| v.to_str().unwrap())\n            )\n            .unwrap(),\n            vec![true]\n        );\n        assert_eq!(\n            read_many_primitive::<bool>(\n                test_request\n                    .headers()\n                    .get_all(\"X-Bool-Single\")\n                    .iter()\n                    .map(|v| v.to_str().unwrap())\n            )\n            .unwrap(),\n            vec![true, false, true, true]\n        );\n        assert_eq!(\n            read_many_primitive::<bool>(\n                test_request\n                    .headers()\n                    .get_all(\"X-Bool-Quoted\")\n                    .iter()\n                    .map(|v| v.to_str().unwrap())\n            )\n            .unwrap(),\n            vec![true, false, true, true]\n        );\n        read_many_primitive::<bool>(\n            test_request\n                .headers()\n                .get_all(\"X-Bool-Invalid\")\n                .iter()\n                .map(|v| v.to_str().unwrap()),\n        )\n        .expect_err(\"invalid\");\n    }\n\n    #[test]\n    fn check_read_many_i16() {\n        let test_request = http_02x::Request::builder()\n            .header(\"X-Multi\", \"123,456\")\n            .header(\"X-Multi\", \"789\")\n            .header(\"X-Num\", \"777\")\n            .header(\"X-Num-Invalid\", \"12ef3\")\n            .header(\"X-Num-Single\", \"1,2,3,-4,5\")\n            .header(\"X-Num-Quoted\", \"1, \\\"2\\\",3,\\\"-4\\\",5\")\n            .body(())\n            .unwrap();\n        assert_eq!(\n            read_many_primitive::<i16>(\n                test_request\n                    .headers()\n                    .get_all(\"X-Multi\")\n                    .iter()\n                    .map(|v| v.to_str().unwrap())\n            )\n            .expect(\"valid\"),\n            vec![123, 456, 789]\n        );\n\n        assert_eq!(\n            read_many_primitive::<i16>(\n                test_request\n                    .headers()\n                    .get_all(\"X-Num\")\n                    .iter()\n                    .map(|v| v.to_str().unwrap())\n            )\n            .unwrap(),\n            vec![777]\n        );\n        assert_eq!(\n            read_many_primitive::<i16>(\n                test_request\n                    .headers()\n                    .get_all(\"X-Num-Single\")\n                    .iter()\n                    .map(|v| v.to_str().unwrap())\n            )\n            .unwrap(),\n            vec![1, 2, 3, -4, 5]\n        );\n        assert_eq!(\n            read_many_primitive::<i16>(\n                test_request\n                    .headers()\n                    .get_all(\"X-Num-Quoted\")\n                    .iter()\n                    .map(|v| v.to_str().unwrap())\n            )\n            .unwrap(),\n            vec![1, 2, 3, -4, 5]\n        );\n        read_many_primitive::<i16>(\n            test_request\n                .headers()\n                .get_all(\"X-Num-Invalid\")\n                .iter()\n                .map(|v| v.to_str().unwrap()),\n        )\n        .expect_err(\"invalid\");\n    }\n\n    #[test]\n    fn test_prefix_headers() {\n        let test_request = Request::try_from(\n            http_02x::Request::builder()\n                .header(\"X-Prefix-A\", \"123,456\")\n                .header(\"X-Prefix-B\", \"789\")\n                .header(\"X-Prefix-C\", \"777\")\n                .header(\"X-Prefix-C\", \"777\")\n                .body(())\n                .unwrap(),\n        )\n        .unwrap();\n        let resp: Result<HashMap<String, Vec<i16>>, ParseError> =\n            headers_for_prefix(test_request.headers().iter().map(|h| h.0), \"X-Prefix-\")\n                .map(|(key, header_name)| {\n                    let values = test_request.headers().get_all(header_name);\n                    read_many_primitive(values).map(|v| (key.to_string(), v))\n                })\n                .collect();\n        let resp = resp.expect(\"valid\");\n        assert_eq!(resp.get(\"a\"), Some(&vec![123_i16, 456_i16]));\n    }\n\n    #[test]\n    fn test_quote_header_value() {\n        assert_eq!(\"\", &quote_header_value(\"\"));\n        assert_eq!(\"foo\", &quote_header_value(\"foo\"));\n        assert_eq!(\"\\\"  foo\\\"\", &quote_header_value(\"  foo\"));\n        assert_eq!(\"foo bar\", &quote_header_value(\"foo bar\"));\n        assert_eq!(\"\\\"foo,bar\\\"\", &quote_header_value(\"foo,bar\"));\n        assert_eq!(\"\\\",\\\"\", &quote_header_value(\",\"));\n        assert_eq!(\"\\\"\\\\\\\"foo\\\\\\\"\\\"\", &quote_header_value(\"\\\"foo\\\"\"));\n        assert_eq!(\"\\\"\\\\\\\"f\\\\\\\\oo\\\\\\\"\\\"\", &quote_header_value(\"\\\"f\\\\oo\\\"\"));\n        assert_eq!(\"\\\"(\\\"\", &quote_header_value(\"(\"));\n        assert_eq!(\"\\\")\\\"\", &quote_header_value(\")\"));\n    }\n\n    #[test]\n    fn test_append_merge_header_maps_with_shared_key() {\n        let header_name = HeaderName::from_static(\"some_key\");\n        let left_header_value = HeaderValue::from_static(\"lhs value\");\n        let right_header_value = HeaderValue::from_static(\"rhs value\");\n\n        let mut left_hand_side_headers = HeaderMap::new();\n        left_hand_side_headers.insert(header_name.clone(), left_header_value.clone());\n\n        let mut right_hand_side_headers = HeaderMap::new();\n        right_hand_side_headers.insert(header_name.clone(), right_header_value.clone());\n\n        let merged_header_map =\n            append_merge_header_maps(left_hand_side_headers, right_hand_side_headers);\n        let actual_merged_values: Vec<_> =\n            merged_header_map.get_all(header_name).into_iter().collect();\n\n        let expected_merged_values = vec![left_header_value, right_header_value];\n\n        assert_eq!(actual_merged_values, expected_merged_values);\n    }\n\n    #[test]\n    fn test_append_merge_header_maps_with_multiple_values_in_left_hand_map() {\n        let header_name = HeaderName::from_static(\"some_key\");\n        let left_header_value_1 = HeaderValue::from_static(\"lhs value 1\");\n        let left_header_value_2 = HeaderValue::from_static(\"lhs_value 2\");\n        let right_header_value = HeaderValue::from_static(\"rhs value\");\n\n        let mut left_hand_side_headers = HeaderMap::new();\n        left_hand_side_headers.insert(header_name.clone(), left_header_value_1.clone());\n        left_hand_side_headers.append(header_name.clone(), left_header_value_2.clone());\n\n        let mut right_hand_side_headers = HeaderMap::new();\n        right_hand_side_headers.insert(header_name.clone(), right_header_value.clone());\n\n        let merged_header_map =\n            append_merge_header_maps(left_hand_side_headers, right_hand_side_headers);\n        let actual_merged_values: Vec<_> =\n            merged_header_map.get_all(header_name).into_iter().collect();\n\n        let expected_merged_values =\n            vec![left_header_value_1, left_header_value_2, right_header_value];\n\n        assert_eq!(actual_merged_values, expected_merged_values);\n    }\n\n    #[test]\n    fn test_append_merge_header_maps_with_empty_left_hand_map() {\n        let header_name = HeaderName::from_static(\"some_key\");\n        let right_header_value_1 = HeaderValue::from_static(\"rhs value 1\");\n        let right_header_value_2 = HeaderValue::from_static(\"rhs_value 2\");\n\n        let left_hand_side_headers = HeaderMap::new();\n\n        let mut right_hand_side_headers = HeaderMap::new();\n        right_hand_side_headers.insert(header_name.clone(), right_header_value_1.clone());\n        right_hand_side_headers.append(header_name.clone(), right_header_value_2.clone());\n\n        let merged_header_map =\n            append_merge_header_maps(left_hand_side_headers, right_hand_side_headers);\n        let actual_merged_values: Vec<_> =\n            merged_header_map.get_all(header_name).into_iter().collect();\n\n        let expected_merged_values = vec![right_header_value_1, right_header_value_2];\n\n        assert_eq!(actual_merged_values, expected_merged_values);\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http/src/label.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Formatting values as Smithy\n//! [httpLabel](https://smithy.io/2.0/spec/http-bindings.html#httplabel-trait)\n\nuse crate::urlencode::BASE_SET;\nuse aws_smithy_types::date_time::{DateTimeFormatError, Format};\nuse aws_smithy_types::DateTime;\nuse percent_encoding::AsciiSet;\n\nconst GREEDY: &AsciiSet = &BASE_SET.remove(b'/');\n\n/// The encoding strategy used when parsing an `httpLabel`.\n#[non_exhaustive]\n#[derive(Clone, Debug, Eq, PartialEq)]\npub enum EncodingStrategy {\n    /// The default strategy when parsing an `httpLabel`. Only one path segment will be matched.\n    Default,\n    /// When parsing an `httpLabel`, this strategy will attempt to parse as many path segments as possible.\n    Greedy,\n}\n\n/// Format a given `httpLabel` as a string according to an [`EncodingStrategy`]\npub fn fmt_string<T: AsRef<str>>(t: T, strategy: EncodingStrategy) -> String {\n    let uri_set = if strategy == EncodingStrategy::Greedy {\n        GREEDY\n    } else {\n        BASE_SET\n    };\n    percent_encoding::utf8_percent_encode(t.as_ref(), uri_set).to_string()\n}\n\n/// Format a given [`DateTime`] as a string according to an [`EncodingStrategy`]\npub fn fmt_timestamp(t: &DateTime, format: Format) -> Result<String, DateTimeFormatError> {\n    Ok(fmt_string(t.fmt(format)?, EncodingStrategy::Default))\n}\n\n#[cfg(test)]\nmod test {\n    use crate::label::{fmt_string, EncodingStrategy};\n    use http_02x::Uri;\n    use proptest::proptest;\n\n    #[test]\n    fn greedy_params() {\n        assert_eq!(fmt_string(\"a/b\", EncodingStrategy::Default), \"a%2Fb\");\n        assert_eq!(fmt_string(\"a/b\", EncodingStrategy::Greedy), \"a/b\");\n    }\n\n    proptest! {\n        #[test]\n        fn test_encode_request(s: String) {\n            let _: Uri = format!(\"http://host.example.com/{}\", fmt_string(&s, EncodingStrategy::Default))\n                .parse()\n                .expect(\"all strings should be encoded properly\");\n            let _: Uri = format!(\"http://host.example.com/{}\", fmt_string(&s, EncodingStrategy::Greedy))\n                .parse()\n                .expect(\"all strings should be encoded properly\");\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http/src/lib.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/* Automatically managed default lints */\n#![cfg_attr(docsrs, feature(doc_cfg))]\n/* End of automatically managed default lints */\n#![warn(\n    missing_docs,\n    rustdoc::missing_crate_level_docs,\n    unreachable_pub,\n    rust_2018_idioms\n)]\n\n//! Core HTTP primitives for service clients generated by [smithy-rs](https://github.com/smithy-lang/smithy-rs) including:\n//! - HTTP Body implementation\n//! - Endpoint support\n//! - HTTP header deserialization\n//! - Event streams\n//!\n//! | Feature        | Description |\n//! |----------------|-------------|\n//! | `rt-tokio`     | Provides features that are dependent on `tokio` including the `ByteStream::from_path` util |\n//! | `event-stream` | Provides Sender/Receiver implementations for Event Stream codegen. |\n\n#![allow(clippy::derive_partial_eq_without_eq)]\n\npub mod endpoint;\n// Marked as `doc(hidden)` because a type in the module is used both by this crate and by the code\n// generator, but not by external users. Also, by the module being `doc(hidden)` instead of it being\n// in `rust-runtime/inlineable`, each user won't have to pay the cost of running the module's tests\n// when compiling their generated SDK.\n#[doc(hidden)]\npub mod futures_stream_adapter;\npub mod header;\npub mod label;\npub mod operation;\npub mod query;\n#[doc(hidden)]\npub mod query_writer;\n\n#[cfg(feature = \"event-stream\")]\npub mod event_stream;\n\nmod urlencode;\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http/src/operation.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Deprecated metadata type.\n\n/// Metadata added to the [`ConfigBag`](aws_smithy_types::config_bag::ConfigBag) that identifies the API being called.\n#[deprecated(\n    since = \"0.60.2\",\n    note = \"Use aws_smithy_runtime_api::client::orchestrator::Metadata instead.\"\n)]\npub type Metadata = aws_smithy_runtime_api::client::orchestrator::Metadata;\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http/src/query.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Utilities for writing Smithy values into a query string.\n//!\n//! Formatting values into the query string as specified in\n//! [httpQuery](https://smithy.io/2.0/spec/http-bindings.html#httpquery-trait)\n\nuse crate::urlencode::BASE_SET;\nuse aws_smithy_types::date_time::{DateTimeFormatError, Format};\nuse aws_smithy_types::DateTime;\nuse percent_encoding::utf8_percent_encode;\n\n/// Format a given string as a query string.\npub fn fmt_string<T: AsRef<str>>(t: T) -> String {\n    utf8_percent_encode(t.as_ref(), BASE_SET).to_string()\n}\n\n/// Format a given [`DateTime`] as a query string.\npub fn fmt_timestamp(t: &DateTime, format: Format) -> Result<String, DateTimeFormatError> {\n    Ok(fmt_string(t.fmt(format)?))\n}\n\n/// Simple abstraction to enable appending params to a string as query params.\n///\n/// ```rust\n/// use aws_smithy_legacy_http::query::Writer;\n/// let mut s = String::from(\"www.example.com\");\n/// let mut q = Writer::new(&mut s);\n/// q.push_kv(\"key\", \"value\");\n/// q.push_v(\"another_value\");\n/// assert_eq!(s, \"www.example.com?key=value&another_value\");\n/// ```\n#[allow(missing_debug_implementations)]\npub struct Writer<'a> {\n    out: &'a mut String,\n    prefix: char,\n}\n\nimpl<'a> Writer<'a> {\n    /// Create a new query string writer.\n    pub fn new(out: &'a mut String) -> Self {\n        Writer { out, prefix: '?' }\n    }\n\n    /// Add a new key and value pair to this writer.\n    pub fn push_kv(&mut self, k: &str, v: &str) {\n        self.out.push(self.prefix);\n        self.out.push_str(k);\n        self.out.push('=');\n        self.out.push_str(v);\n        self.prefix = '&';\n    }\n\n    /// Add a new value (which is its own key) to this writer.\n    pub fn push_v(&mut self, v: &str) {\n        self.out.push(self.prefix);\n        self.out.push_str(v);\n        self.prefix = '&';\n    }\n}\n\n#[cfg(test)]\nmod test {\n    use crate::query::{fmt_string, Writer};\n    use http_02x::Uri;\n    use proptest::proptest;\n\n    #[test]\n    fn url_encode() {\n        assert_eq!(fmt_string(\"y̆\").as_str(), \"y%CC%86\");\n        assert_eq!(fmt_string(\" \").as_str(), \"%20\");\n        assert_eq!(fmt_string(\"foo/baz%20\").as_str(), \"foo%2Fbaz%2520\");\n        assert_eq!(fmt_string(\"&=\").as_str(), \"%26%3D\");\n        assert_eq!(fmt_string(\"🐱\").as_str(), \"%F0%9F%90%B1\");\n        // `:` needs to be encoded, but only for AWS services\n        assert_eq!(fmt_string(\"a:b\"), \"a%3Ab\")\n    }\n\n    #[test]\n    fn writer_sets_prefix_properly() {\n        let mut out = String::new();\n        let mut writer = Writer::new(&mut out);\n        writer.push_v(\"a\");\n        writer.push_kv(\"b\", \"c\");\n        assert_eq!(out, \"?a&b=c\");\n    }\n\n    proptest! {\n        #[test]\n        fn test_encode_request(s: String) {\n            let _: Uri = format!(\"http://host.example.com/?{}\", fmt_string(s)).parse().expect(\"all strings should be encoded properly\");\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http/src/query_writer.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::query::fmt_string as percent_encode_query;\nuse http_02x::uri::InvalidUri;\nuse http_02x::Uri;\n\n/// Utility for updating the query string in a [`Uri`].\n#[allow(missing_debug_implementations)]\npub struct QueryWriter {\n    base_uri: Uri,\n    new_path_and_query: String,\n    prefix: Option<char>,\n}\n\nimpl QueryWriter {\n    /// Creates a new `QueryWriter` from a string\n    pub fn new_from_string(uri: &str) -> Result<Self, InvalidUri> {\n        Ok(Self::new(&Uri::try_from(uri)?))\n    }\n\n    /// Creates a new `QueryWriter` based off the given `uri`.\n    pub fn new(uri: &Uri) -> Self {\n        let new_path_and_query = uri\n            .path_and_query()\n            .map(|pq| pq.to_string())\n            .unwrap_or_default();\n        let prefix = if uri.query().is_none() {\n            Some('?')\n        } else if !uri.query().unwrap_or_default().is_empty() {\n            Some('&')\n        } else {\n            None\n        };\n        QueryWriter {\n            base_uri: uri.clone(),\n            new_path_and_query,\n            prefix,\n        }\n    }\n\n    /// Clears all query parameters.\n    pub fn clear_params(&mut self) {\n        if let Some(index) = self.new_path_and_query.find('?') {\n            self.new_path_and_query.truncate(index);\n            self.prefix = Some('?');\n        }\n    }\n\n    /// Inserts a new query parameter. The key and value are percent encoded\n    /// by `QueryWriter`. Passing in percent encoded values will result in double encoding.\n    pub fn insert(&mut self, k: &str, v: &str) {\n        self.insert_encoded(&percent_encode_query(k), &percent_encode_query(v));\n    }\n\n    /// Inserts a new already encoded query parameter. The key and value will be inserted\n    /// as is.\n    pub fn insert_encoded(&mut self, encoded_k: &str, encoded_v: &str) {\n        if let Some(prefix) = self.prefix {\n            self.new_path_and_query.push(prefix);\n        }\n        self.prefix = Some('&');\n        self.new_path_and_query.push_str(encoded_k);\n        self.new_path_and_query.push('=');\n        self.new_path_and_query.push_str(encoded_v)\n    }\n\n    /// Returns just the built query string.\n    pub fn build_query(self) -> String {\n        self.build_uri().query().unwrap_or_default().to_string()\n    }\n\n    /// Returns a full [`Uri`] with the query string updated.\n    pub fn build_uri(self) -> Uri {\n        let mut parts = self.base_uri.into_parts();\n        parts.path_and_query = Some(\n            self.new_path_and_query\n                .parse()\n                .expect(\"adding query should not invalidate URI\"),\n        );\n        Uri::from_parts(parts).expect(\"a valid URL in should always produce a valid URL out\")\n    }\n}\n\n#[cfg(test)]\nmod test {\n    use super::QueryWriter;\n    use http_02x::Uri;\n\n    #[test]\n    fn empty_uri() {\n        let uri = Uri::from_static(\"http://www.example.com\");\n        let mut query_writer = QueryWriter::new(&uri);\n        query_writer.insert(\"key\", \"val%ue\");\n        query_writer.insert(\"another\", \"value\");\n        assert_eq!(\n            query_writer.build_uri(),\n            Uri::from_static(\"http://www.example.com?key=val%25ue&another=value\")\n        );\n    }\n\n    #[test]\n    fn uri_with_path() {\n        let uri = Uri::from_static(\"http://www.example.com/path\");\n        let mut query_writer = QueryWriter::new(&uri);\n        query_writer.insert(\"key\", \"val%ue\");\n        query_writer.insert(\"another\", \"value\");\n        assert_eq!(\n            query_writer.build_uri(),\n            Uri::from_static(\"http://www.example.com/path?key=val%25ue&another=value\")\n        );\n    }\n\n    #[test]\n    fn uri_with_path_and_query() {\n        let uri = Uri::from_static(\"http://www.example.com/path?original=here\");\n        let mut query_writer = QueryWriter::new(&uri);\n        query_writer.insert(\"key\", \"val%ue\");\n        query_writer.insert(\"another\", \"value\");\n        assert_eq!(\n            query_writer.build_uri(),\n            Uri::from_static(\n                \"http://www.example.com/path?original=here&key=val%25ue&another=value\"\n            )\n        );\n    }\n\n    #[test]\n    fn build_query() {\n        let uri = Uri::from_static(\"http://www.example.com\");\n        let mut query_writer = QueryWriter::new(&uri);\n        query_writer.insert(\"key\", \"val%ue\");\n        query_writer.insert(\"ano%ther\", \"value\");\n        assert_eq!(\"key=val%25ue&ano%25ther=value\", query_writer.build_query());\n    }\n\n    #[test]\n    // This test ensures that the percent encoding applied to queries always produces a valid URI if\n    // the starting URI is valid\n    fn doesnt_panic_when_adding_query_to_valid_uri() {\n        let uri = Uri::from_static(\"http://www.example.com\");\n\n        let mut problematic_chars = Vec::new();\n\n        for byte in u8::MIN..=u8::MAX {\n            match std::str::from_utf8(&[byte]) {\n                // If we can't make a str from the byte then we certainly can't make a URL from it\n                Err(_) => {\n                    continue;\n                }\n                Ok(value) => {\n                    let mut query_writer = QueryWriter::new(&uri);\n                    query_writer.insert(\"key\", value);\n\n                    if std::panic::catch_unwind(|| query_writer.build_uri()).is_err() {\n                        problematic_chars.push(char::from(byte));\n                    };\n                }\n            }\n        }\n\n        if !problematic_chars.is_empty() {\n            panic!(\"we got some bad bytes here: {problematic_chars:#?}\")\n        }\n    }\n\n    #[test]\n    fn clear_params() {\n        let uri = Uri::from_static(\"http://www.example.com/path?original=here&foo=1\");\n        let mut query_writer = QueryWriter::new(&uri);\n        query_writer.clear_params();\n        query_writer.insert(\"new\", \"value\");\n        assert_eq!(\"new=value\", query_writer.build_query());\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http/src/urlencode.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse percent_encoding::{AsciiSet, CONTROLS};\n\n/// base set of characters that must be URL encoded\npub(crate) const BASE_SET: &AsciiSet = &CONTROLS\n    .add(b' ')\n    .add(b'/')\n    // RFC-3986 §3.3 allows sub-delims (defined in section2.2) to be in the path component.\n    // This includes both colon ':' and comma ',' characters.\n    // Smithy protocol tests & AWS services percent encode these expected values. Signing\n    // will fail if these values are not percent encoded\n    .add(b':')\n    .add(b',')\n    .add(b'?')\n    .add(b'#')\n    .add(b'[')\n    .add(b']')\n    .add(b'{')\n    .add(b'}')\n    .add(b'|')\n    .add(b'@')\n    .add(b'!')\n    .add(b'$')\n    .add(b'&')\n    .add(b'\\'')\n    .add(b'(')\n    .add(b')')\n    .add(b'*')\n    .add(b'+')\n    .add(b';')\n    .add(b'=')\n    .add(b'%')\n    .add(b'<')\n    .add(b'>')\n    .add(b'\"')\n    .add(b'^')\n    .add(b'`')\n    .add(b'\\\\');\n\n#[cfg(test)]\nmod test {\n    use crate::urlencode::BASE_SET;\n    use percent_encoding::utf8_percent_encode;\n\n    #[test]\n    fn set_includes_mandatory_characters() {\n        let chars = \":/?#[]@!$&'()*+,;=%\";\n        let escaped = utf8_percent_encode(chars, BASE_SET).to_string();\n        assert_eq!(\n            escaped,\n            \"%3A%2F%3F%23%5B%5D%40%21%24%26%27%28%29%2A%2B%2C%3B%3D%25\"\n        );\n\n        // sanity check that every character is escaped\n        assert_eq!(escaped.len(), chars.len() * 3);\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http-server/Cargo.toml",
    "content": "[package]\nname = \"aws-smithy-legacy-http-server\"\nversion = \"0.65.14\"\nauthors = [\"AWS Rust SDK Team <aws-sdk-rust@amazon.com>\", \"Smithy Rust Server <smithy-rs-server@amazon.com>\"]\nedition = \"2021\"\nlicense = \"Apache-2.0\"\nrepository = \"https://github.com/smithy-lang/smithy-rs\"\nkeywords = [\"smithy\", \"framework\", \"web\", \"api\", \"aws\"]\ncategories = [\"asynchronous\", \"web-programming\", \"api-bindings\"]\ndescription = \"\"\"\nLegacy server runtime for Smithy Rust Server Framework, providing compatibility for code generated with http 0.x and hyper 0.x dependencies.\n\"\"\"\npublish = true\nrust-version = \"1.91.1\"\n\n[features]\naws-lambda = [\"dep:lambda_http\"]\nunredacted-logging = []\nrequest-id = [\"dep:uuid\"]\n\n[dependencies]\naws-smithy-legacy-http = { path = \"../aws-smithy-legacy-http\", features = [\"rt-tokio\"] }\naws-smithy-json = { path = \"../aws-smithy-json\" }\naws-smithy-runtime-api = { path = \"../aws-smithy-runtime-api\", features = [\"http-02x\"] }\naws-smithy-types = { path = \"../aws-smithy-types\", features = [\"http-body-0-4-x\", \"hyper-0-14-x\"] }\naws-smithy-xml = { path = \"../aws-smithy-xml\" }\naws-smithy-cbor = { path = \"../aws-smithy-cbor\" }\nbytes = \"1.11.1\"\nfutures-util = { version = \"0.3.29\", default-features = false }\nhttp = \"0.2.12\"\nhttp-body = \"0.4.6\"\nhyper = { version = \"0.14.26\", features = [\"server\", \"http1\", \"http2\", \"tcp\", \"stream\"] }\nlambda_http = { version = \"0.8.4\", optional = true }\nmime = \"0.3.17\"\nnom = \"7.1.3\"\npin-project-lite = \"0.2.14\"\nregex = \"1.12.2\"\nserde_urlencoded = \"0.7\"\nthiserror = \"2\"\ntokio = { version = \"1.49.0\", features = [\"full\"] }\ntower = { version = \"0.4.13\", features = [\"util\", \"make\"], default-features = false }\ntower-http = { version = \"0.3\", features = [\"add-extension\", \"map-response-body\"] }\ntracing = \"0.1.44\"\nuuid = { version = \"1.1.2\", features = [\"v4\", \"fast-rng\"], optional = true }\n\n[dev-dependencies]\npretty_assertions = \"1\"\n\n[package.metadata.docs.rs]\nall-features = true\ntargets = [\"x86_64-unknown-linux-gnu\"]\ncargo-args = [\"-Zunstable-options\", \"-Zrustdoc-scrape-examples\"]\nrustdoc-args = [\"--cfg\", \"docsrs\"]\n# End of docs.rs metadata\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http-server/LICENSE",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http-server/README.md",
    "content": "# aws-smithy-legacy-http-server\n\n**This is a legacy crate that provides support for `http@0.x` and `hyper@0.x`.**\n\nServer libraries for smithy-rs generated servers.\n\n## Usage\n\nThis crate is used when generating server SDKs without the `http-1x` codegen flag. For new projects, prefer using `aws-smithy-http-server` which supports `http@1.x` and `hyper@1.x`.\n\n<!-- anchor_start:footer -->\nThis crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly.\n<!-- anchor_end:footer -->\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http-server/additional-ci",
    "content": "#!/bin/bash\n#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\n\n# This script contains additional CI checks to run for this specific package\n\nset -e\n\necho \"### Testing unredacted-logging logging feature\"\ncargo test logging:: --features unredacted-logging\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http-server/rustfmt.toml",
    "content": "edition = \"2021\"\nmax_width = 120\n# Prevent carriage returns\nnewline_style = \"Unix\"\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http-server/src/body.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! HTTP body utilities.\n\n// Used in the codegen in trait bounds.\n#[doc(hidden)]\npub use http_body::Body as HttpBody;\n\npub use hyper::body::Body;\n\nuse bytes::Bytes;\n\nuse crate::error::{BoxError, Error};\n\n/// The primary [`Body`] returned by the generated `smithy-rs` service.\npub type BoxBody = http_body::combinators::UnsyncBoxBody<Bytes, Error>;\n\n// `boxed` is used in the codegen of the implementation of the operation `Handler` trait.\n/// Convert a [`http_body::Body`] into a [`BoxBody`].\npub fn boxed<B>(body: B) -> BoxBody\nwhere\n    B: http_body::Body<Data = Bytes> + Send + 'static,\n    B::Error: Into<BoxError>,\n{\n    try_downcast(body).unwrap_or_else(|body| body.map_err(Error::new).boxed_unsync())\n}\n\n#[doc(hidden)]\npub(crate) fn try_downcast<T, K>(k: K) -> Result<T, K>\nwhere\n    T: 'static,\n    K: Send + 'static,\n{\n    let mut k = Some(k);\n    if let Some(k) = <dyn std::any::Any>::downcast_mut::<Option<T>>(&mut k) {\n        Ok(k.take().unwrap())\n    } else {\n        Err(k.unwrap())\n    }\n}\n\npub(crate) fn empty() -> BoxBody {\n    boxed(http_body::Empty::new())\n}\n\n/// Convert anything that can be converted into a [`hyper::body::Body`] into a [`BoxBody`].\n/// This simplifies codegen a little bit.\n#[doc(hidden)]\npub fn to_boxed<B>(body: B) -> BoxBody\nwhere\n    Body: From<B>,\n{\n    boxed(Body::from(body))\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http-server/src/error.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n// This code was copied and then modified from Tokio's Axum.\n\n/* Copyright (c) 2021 Tower Contributors\n *\n * Permission is hereby granted, free of charge, to any\n * person obtaining a copy of this software and associated\n * documentation files (the \"Software\"), to deal in the\n * Software without restriction, including without\n * limitation the rights to use, copy, modify, merge,\n * publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software\n * is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice\n * shall be included in all copies or substantial portions\n * of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF\n * ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED\n * TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A\n * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT\n * SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR\n * IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\n * DEALINGS IN THE SOFTWARE.\n */\n\n//! Error definition.\n\nuse std::{error::Error as StdError, fmt};\n\n/// Errors that can happen when using this crate.\n#[derive(Debug)]\npub struct Error {\n    inner: BoxError,\n}\n\npub(crate) type BoxError = Box<dyn StdError + Send + Sync>;\n\nimpl Error {\n    /// Create a new `Error` from a boxable error.\n    pub(crate) fn new(error: impl Into<BoxError>) -> Self {\n        Self { inner: error.into() }\n    }\n}\n\nimpl fmt::Display for Error {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        self.inner.fmt(f)\n    }\n}\n\nimpl StdError for Error {\n    fn source(&self) -> Option<&(dyn StdError + 'static)> {\n        Some(&*self.inner)\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http-server/src/extension.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Extension types.\n//!\n//! Extension types are types that are stored in and extracted from _both_ requests and\n//! responses.\n//!\n//! There is only one _generic_ extension type _for requests_, [`Extension`].\n//!\n//! On the other hand, the server SDK uses multiple concrete extension types for responses in order\n//! to store a variety of information, like the operation that was executed, the operation error\n//! that got returned, or the runtime error that happened, among others. The information stored in\n//! these types may be useful to [`tower::Layer`]s that post-process the response: for instance, a\n//! particular metrics layer implementation might want to emit metrics about the number of times an\n//! an operation got executed.\n//!\n//! [extensions]: https://docs.rs/http/latest/http/struct.Extensions.html\n\nuse std::hash::Hash;\nuse std::{fmt, fmt::Debug, future::Future, ops::Deref, pin::Pin, task::Context, task::Poll};\n\nuse futures_util::ready;\nuse futures_util::TryFuture;\nuse thiserror::Error;\nuse tower::Service;\n\nuse crate::operation::OperationShape;\nuse crate::plugin::{HttpMarker, HttpPlugins, Plugin, PluginStack};\nuse crate::shape_id::ShapeId;\n\npub use crate::request::extension::{Extension, MissingExtension};\n\n/// Extension type used to store information about Smithy operations in HTTP responses.\n/// This extension type is inserted, via the [`OperationExtensionPlugin`], whenever it has been correctly determined\n/// that the request should be routed to a particular operation. The operation handler might not even get invoked\n/// because the request fails to deserialize into the modeled operation input.\n#[derive(Debug, Clone, PartialEq, Eq, Hash)]\npub struct OperationExtension(pub ShapeId);\n\n/// An error occurred when parsing an absolute operation shape ID.\n#[derive(Debug, Clone, Error, PartialEq, Eq)]\n#[non_exhaustive]\npub enum ParseError {\n    #[error(\"# was not found - missing namespace\")]\n    MissingNamespace,\n}\n\npin_project_lite::pin_project! {\n    /// The [`Service::Future`] of [`OperationExtensionService`] - inserts an [`OperationExtension`] into the\n    /// [`http::Response]`.\n    pub struct OperationExtensionFuture<Fut> {\n        #[pin]\n        inner: Fut,\n        operation_extension: Option<OperationExtension>\n    }\n}\n\nimpl<Fut, RespB> Future for OperationExtensionFuture<Fut>\nwhere\n    Fut: TryFuture<Ok = http::Response<RespB>>,\n{\n    type Output = Result<http::Response<RespB>, Fut::Error>;\n\n    fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {\n        let this = self.project();\n        let resp = ready!(this.inner.try_poll(cx));\n        let ext = this\n            .operation_extension\n            .take()\n            .expect(\"futures cannot be polled after completion\");\n        Poll::Ready(resp.map(|mut resp| {\n            resp.extensions_mut().insert(ext);\n            resp\n        }))\n    }\n}\n\n/// Inserts a [`OperationExtension`] into the extensions of the [`http::Response`].\n#[derive(Debug, Clone)]\npub struct OperationExtensionService<S> {\n    inner: S,\n    operation_extension: OperationExtension,\n}\n\nimpl<S, B, RespBody> Service<http::Request<B>> for OperationExtensionService<S>\nwhere\n    S: Service<http::Request<B>, Response = http::Response<RespBody>>,\n{\n    type Response = http::Response<RespBody>;\n    type Error = S::Error;\n    type Future = OperationExtensionFuture<S::Future>;\n\n    fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {\n        self.inner.poll_ready(cx)\n    }\n\n    fn call(&mut self, req: http::Request<B>) -> Self::Future {\n        OperationExtensionFuture {\n            inner: self.inner.call(req),\n            operation_extension: Some(self.operation_extension.clone()),\n        }\n    }\n}\n\n/// A [`Plugin`] which applies [`OperationExtensionService`] to every operation.\npub struct OperationExtensionPlugin;\n\nimpl fmt::Debug for OperationExtensionPlugin {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        f.debug_tuple(\"OperationExtensionPlugin\").field(&\"...\").finish()\n    }\n}\n\nimpl<Ser, Op, T> Plugin<Ser, Op, T> for OperationExtensionPlugin\nwhere\n    Op: OperationShape,\n{\n    type Output = OperationExtensionService<T>;\n\n    fn apply(&self, inner: T) -> Self::Output {\n        OperationExtensionService {\n            inner,\n            operation_extension: OperationExtension(Op::ID),\n        }\n    }\n}\n\nimpl HttpMarker for OperationExtensionPlugin {}\n\n/// An extension trait on [`HttpPlugins`] allowing the application of [`OperationExtensionPlugin`].\n///\n/// See [`module`](crate::extension) documentation for more info.\npub trait OperationExtensionExt<CurrentPlugin> {\n    /// Apply the [`OperationExtensionPlugin`], which inserts the [`OperationExtension`] into every [`http::Response`].\n    fn insert_operation_extension(self) -> HttpPlugins<PluginStack<OperationExtensionPlugin, CurrentPlugin>>;\n}\n\nimpl<CurrentPlugin> OperationExtensionExt<CurrentPlugin> for HttpPlugins<CurrentPlugin> {\n    fn insert_operation_extension(self) -> HttpPlugins<PluginStack<OperationExtensionPlugin, CurrentPlugin>> {\n        self.push(OperationExtensionPlugin)\n    }\n}\n\n/// Extension type used to store the type of user-modeled error returned by an operation handler.\n/// These are modeled errors, defined in the Smithy model.\n#[derive(Debug, Clone)]\npub struct ModeledErrorExtension(&'static str);\n\nimpl ModeledErrorExtension {\n    /// Creates a new `ModeledErrorExtension`.\n    pub fn new(value: &'static str) -> ModeledErrorExtension {\n        ModeledErrorExtension(value)\n    }\n}\n\nimpl Deref for ModeledErrorExtension {\n    type Target = &'static str;\n\n    fn deref(&self) -> &Self::Target {\n        &self.0\n    }\n}\n\n/// Extension type used to store the _name_ of the possible runtime errors.\n/// These are _unmodeled_ errors; the operation handler was not invoked.\n#[derive(Debug, Clone)]\npub struct RuntimeErrorExtension(String);\n\nimpl RuntimeErrorExtension {\n    /// Creates a new `RuntimeErrorExtension`.\n    pub fn new(value: String) -> RuntimeErrorExtension {\n        RuntimeErrorExtension(value)\n    }\n}\n\nimpl Deref for RuntimeErrorExtension {\n    type Target = String;\n\n    fn deref(&self) -> &Self::Target {\n        &self.0\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use tower::{service_fn, Layer, ServiceExt};\n\n    use crate::{plugin::PluginLayer, protocol::rest_json_1::RestJson1};\n\n    use super::*;\n\n    #[test]\n    fn ext_accept() {\n        let value = \"com.amazonaws.ebs#CompleteSnapshot\";\n        let ext = ShapeId::new(\n            \"com.amazonaws.ebs#CompleteSnapshot\",\n            \"com.amazonaws.ebs\",\n            \"CompleteSnapshot\",\n        );\n\n        assert_eq!(ext.absolute(), value);\n        assert_eq!(ext.namespace(), \"com.amazonaws.ebs\");\n        assert_eq!(ext.name(), \"CompleteSnapshot\");\n    }\n\n    #[tokio::test]\n    async fn plugin() {\n        struct DummyOp;\n\n        impl OperationShape for DummyOp {\n            const ID: ShapeId = ShapeId::new(\n                \"com.amazonaws.ebs#CompleteSnapshot\",\n                \"com.amazonaws.ebs\",\n                \"CompleteSnapshot\",\n            );\n\n            type Input = ();\n            type Output = ();\n            type Error = ();\n        }\n\n        // Apply `Plugin`.\n        let plugins = HttpPlugins::new().insert_operation_extension();\n\n        // Apply `Plugin`s `Layer`.\n        let layer = PluginLayer::new::<RestJson1, DummyOp>(plugins);\n        let svc = service_fn(|_: http::Request<()>| async { Ok::<_, ()>(http::Response::new(())) });\n        let svc = layer.layer(svc);\n\n        // Check for `OperationExtension`.\n        let response = svc.oneshot(http::Request::new(())).await.unwrap();\n        let expected = DummyOp::ID;\n        let actual = response.extensions().get::<OperationExtension>().unwrap();\n        assert_eq!(actual.0, expected);\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http-server/src/instrumentation/mod.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n#![deny(missing_docs, missing_debug_implementations)]\n\n//! Provides [`InstrumentOperation`] and a variety of helpers structures for dealing with sensitive data. Together they\n//! allow compliance with the [sensitive trait].\n//!\n//! # Example\n//!\n//! ```\n//! # use std::convert::Infallible;\n//! # use aws_smithy_legacy_http_server::instrumentation::{*, sensitivity::{*, headers::*, uri::*}};\n//! # use aws_smithy_legacy_http_server::shape_id::ShapeId;\n//! # use http::{Request, Response};\n//! # use tower::{util::service_fn, Service};\n//! # async fn service(request: Request<()>) -> Result<Response<()>, Infallible> {\n//! #   Ok(Response::new(()))\n//! # }\n//! # async fn example() {\n//! # let service = service_fn(service);\n//! # const ID: ShapeId = ShapeId::new(\"namespace#foo-operation\", \"namespace\", \"foo-operation\");\n//! let request = Request::get(\"http://localhost/a/b/c/d?bar=hidden\")\n//!     .header(\"header-name-a\", \"hidden\")\n//!     .body(())\n//!     .unwrap();\n//!\n//! let request_fmt = RequestFmt::new()\n//!     .header(|name| HeaderMarker {\n//!        value: name == \"header-name-a\",\n//!        key_suffix: None,\n//!     })\n//!     .query(|name| QueryMarker { key: false, value: name == \"bar\" })\n//!     .label(|index| index % 2 == 0, None);\n//! let response_fmt = ResponseFmt::new()\n//!     .header(|name| {\n//!         if name.as_str().starts_with(\"prefix-\") {\n//!             HeaderMarker {\n//!                 value: true,\n//!                 key_suffix: Some(\"prefix-\".len()),\n//!             }\n//!         } else {\n//!             HeaderMarker {\n//!                 value: name == \"header-name-b\",\n//!                 key_suffix: None,\n//!             }\n//!         }\n//!     })\n//!     .status_code();\n//! let mut service = InstrumentOperation::new(service, ID)\n//!     .request_fmt(request_fmt)\n//!     .response_fmt(response_fmt);\n//!\n//! let _ = service.call(request).await.unwrap();\n//! # }\n//! ```\n//!\n//! [sensitive trait]: https://smithy.io/2.0/spec/documentation-traits.html#sensitive-trait\n\nmod plugin;\npub mod sensitivity;\nmod service;\n\nuse std::fmt::{Debug, Display};\n\npub use plugin::*;\npub use service::*;\n\n/// A standard interface for taking some component of the HTTP request/response and transforming it into new struct\n/// which supports [`Debug`] or [`Display`]. This allows for polymorphism over formatting approaches.\npub trait MakeFmt<T> {\n    /// Target of the `fmt` transformation.\n    type Target;\n\n    /// Transforms a source into a target, altering it's [`Display`] or [`Debug`] implementation.\n    fn make(&self, source: T) -> Self::Target;\n}\n\nimpl<T, U> MakeFmt<T> for &U\nwhere\n    U: MakeFmt<T>,\n{\n    type Target = U::Target;\n\n    fn make(&self, source: T) -> Self::Target {\n        U::make(self, source)\n    }\n}\n\n/// Identical to [`MakeFmt`] but with a [`Display`] bound on the associated type.\npub trait MakeDisplay<T> {\n    /// Mirrors [`MakeFmt::Target`].\n    type Target: Display;\n\n    /// Mirrors [`MakeFmt::make`].\n    fn make_display(&self, source: T) -> Self::Target;\n}\n\nimpl<T, U> MakeDisplay<T> for U\nwhere\n    U: MakeFmt<T>,\n    U::Target: Display,\n{\n    type Target = U::Target;\n\n    fn make_display(&self, source: T) -> Self::Target {\n        U::make(self, source)\n    }\n}\n\n/// Identical to [`MakeFmt`] but with a [`Debug`] bound on the associated type.\npub trait MakeDebug<T> {\n    /// Mirrors [`MakeFmt::Target`].\n    type Target: Debug;\n\n    /// Mirrors [`MakeFmt::make`].\n    fn make_debug(&self, source: T) -> Self::Target;\n}\n\nimpl<T, U> MakeDebug<T> for U\nwhere\n    U: MakeFmt<T>,\n    U::Target: Debug,\n{\n    type Target = U::Target;\n\n    fn make_debug(&self, source: T) -> Self::Target {\n        U::make(self, source)\n    }\n}\n\n/// A blanket, identity, [`MakeFmt`] implementation. Applies no changes to the [`Display`]/[`Debug`] implementation.\n#[derive(Debug, Clone, Default)]\npub struct MakeIdentity;\n\nimpl<T> MakeFmt<T> for MakeIdentity {\n    type Target = T;\n\n    fn make(&self, source: T) -> Self::Target {\n        source\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http-server/src/instrumentation/plugin.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::plugin::{HttpMarker, HttpPlugins, PluginStack};\nuse crate::{operation::OperationShape, plugin::Plugin};\n\nuse super::sensitivity::Sensitivity;\nuse super::InstrumentOperation;\n\n/// A [`Plugin`] which applies [`InstrumentOperation`] to every operation.\n#[derive(Debug)]\npub struct InstrumentPlugin;\n\nimpl<Ser, Op, T> Plugin<Ser, Op, T> for InstrumentPlugin\nwhere\n    Op: OperationShape,\n    Op: Sensitivity,\n{\n    type Output = InstrumentOperation<T, Op::RequestFmt, Op::ResponseFmt>;\n\n    fn apply(&self, input: T) -> Self::Output {\n        InstrumentOperation::new(input, Op::ID)\n            .request_fmt(Op::request_fmt())\n            .response_fmt(Op::response_fmt())\n    }\n}\n\nimpl HttpMarker for InstrumentPlugin {}\n\n/// An extension trait for applying [`InstrumentPlugin`].\npub trait InstrumentExt<CurrentPlugin> {\n    /// Applies an [`InstrumentOperation`] to every operation, respecting the [@sensitive] trait given on the input and\n    /// output models. See [`InstrumentOperation`] for more information.\n    ///\n    /// [@sensitive]: https://smithy.io/2.0/spec/documentation-traits.html#sensitive-trait\n    fn instrument(self) -> HttpPlugins<PluginStack<InstrumentPlugin, CurrentPlugin>>;\n}\n\nimpl<CurrentPlugin> InstrumentExt<CurrentPlugin> for HttpPlugins<CurrentPlugin> {\n    fn instrument(self) -> HttpPlugins<PluginStack<InstrumentPlugin, CurrentPlugin>> {\n        self.push(InstrumentPlugin)\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http-server/src/instrumentation/sensitivity/headers.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! A wrapper around [`HeaderMap`] to allow for sensitivity.\n\nuse std::fmt::{Debug, Display, Error, Formatter};\n\nuse http::{header::HeaderName, HeaderMap};\n\nuse crate::instrumentation::MakeFmt;\n\nuse super::Sensitive;\n\n/// Marks the sensitive data of a header pair.\n#[derive(Debug, Default, PartialEq, Eq)]\npub struct HeaderMarker {\n    /// Set to `true` to mark the value as sensitive.\n    pub value: bool,\n    /// Set to `Some(x)` to mark `key[x..]` as sensitive.\n    pub key_suffix: Option<usize>,\n}\n\n/// A wrapper around [`&HeaderMap`](HeaderMap) which modifies the behavior of [`Debug`]. Specific parts of the\n/// [`HeaderMap`] are marked as sensitive using a closure. This accommodates the [httpPrefixHeaders trait] and\n/// [httpHeader trait].\n///\n/// The [`Debug`] implementation will respect the `unredacted-logging` flag.\n///\n/// # Example\n///\n/// ```\n/// # use aws_smithy_legacy_http_server::instrumentation::sensitivity::headers::{SensitiveHeaders, HeaderMarker};\n/// # use http::header::HeaderMap;\n/// # let headers = HeaderMap::new();\n/// // Headers with keys equal to \"header-name\" are sensitive\n/// let marker = |key|\n///     HeaderMarker {\n///         value: key == \"header-name\",\n///         key_suffix: None\n///     };\n/// let headers = SensitiveHeaders::new(&headers, marker);\n/// println!(\"{headers:?}\");\n/// ```\n///\n/// [httpPrefixHeaders trait]: https://smithy.io/2.0/spec/http-bindings.html#httpprefixheaders-trait\n/// [httpHeader trait]: https://smithy.io/2.0/spec/http-bindings.html#httpheader-trait\npub struct SensitiveHeaders<'a, F> {\n    headers: &'a HeaderMap,\n    marker: F,\n}\n\nimpl<'a, F> SensitiveHeaders<'a, F> {\n    /// Constructs a new [`SensitiveHeaders`].\n    pub fn new(headers: &'a HeaderMap, marker: F) -> Self {\n        Self { headers, marker }\n    }\n}\n\n/// Concatenates the [`Debug`] of [`&str`](str) and ['Sensitive<&str>`](Sensitive).\nstruct ThenDebug<'a>(&'a str, Sensitive<&'a str>);\n\nimpl Debug for ThenDebug<'_> {\n    #[inline]\n    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error> {\n        write!(f, \"\\\"{}{}\\\"\", self.0, self.1)\n    }\n}\n\n/// Allows for formatting of `Left` or `Right` variants.\nenum OrFmt<Left, Right> {\n    Left(Left),\n    Right(Right),\n}\n\nimpl<Left, Right> Debug for OrFmt<Left, Right>\nwhere\n    Left: Debug,\n    Right: Debug,\n{\n    #[inline]\n    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {\n        match self {\n            Self::Left(left) => left.fmt(f),\n            Self::Right(right) => right.fmt(f),\n        }\n    }\n}\n\nimpl<Left, Right> Display for OrFmt<Left, Right>\nwhere\n    Left: Display,\n    Right: Display,\n{\n    #[inline]\n    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error> {\n        match self {\n            Self::Left(left) => left.fmt(f),\n            Self::Right(right) => right.fmt(f),\n        }\n    }\n}\n\nimpl<'a, F> Debug for SensitiveHeaders<'a, F>\nwhere\n    F: Fn(&'a HeaderName) -> HeaderMarker,\n{\n    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error> {\n        let iter = self.headers.iter().map(|(key, value)| {\n            let HeaderMarker {\n                value: value_sensitive,\n                key_suffix,\n            } = (self.marker)(key);\n\n            let key = if let Some(key_suffix) = key_suffix {\n                let key_str = key.as_str();\n                OrFmt::Left(ThenDebug(&key_str[..key_suffix], Sensitive(&key_str[key_suffix..])))\n            } else {\n                OrFmt::Right(key)\n            };\n\n            let value = if value_sensitive {\n                OrFmt::Left(Sensitive(value))\n            } else {\n                OrFmt::Right(value)\n            };\n\n            (key, value)\n        });\n\n        f.debug_map().entries(iter).finish()\n    }\n}\n\n/// A [`MakeFmt`] producing [`SensitiveHeaders`].\n#[derive(Clone)]\npub struct MakeHeaders<F>(pub(crate) F);\n\nimpl<F> Debug for MakeHeaders<F> {\n    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {\n        f.debug_tuple(\"MakeHeaders\").field(&\"...\").finish()\n    }\n}\n\nimpl<'a, F> MakeFmt<&'a HeaderMap> for MakeHeaders<F>\nwhere\n    F: Clone,\n{\n    type Target = SensitiveHeaders<'a, F>;\n\n    fn make(&self, source: &'a HeaderMap) -> Self::Target {\n        SensitiveHeaders::new(source, self.0.clone())\n    }\n}\n#[cfg(test)]\nmod tests {\n    use http::{header::HeaderName, HeaderMap, HeaderValue};\n\n    use super::*;\n\n    // This is needed because we header maps with \"{redacted}\" are disallowed.\n    struct TestDebugMap([(&'static str, &'static str); 4]);\n\n    impl Debug for TestDebugMap {\n        fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error> {\n            f.debug_map().entries(self.0).finish()\n        }\n    }\n\n    const HEADER_MAP: [(&str, &str); 4] = [\n        (\"name-a\", \"value-a\"),\n        (\"name-b\", \"value-b\"),\n        (\"prefix-a-x\", \"value-c\"),\n        (\"prefix-b-y\", \"value-d\"),\n    ];\n\n    fn to_header_map<I>(values: I) -> HeaderMap\n    where\n        I: IntoIterator<Item = (&'static str, &'static str)>,\n    {\n        values\n            .into_iter()\n            .map(|(key, value)| (HeaderName::from_static(key), HeaderValue::from_static(value)))\n            .collect()\n    }\n\n    #[test]\n    fn mark_none() {\n        let original: HeaderMap = to_header_map(HEADER_MAP);\n\n        let output = SensitiveHeaders::new(&original, |_| HeaderMarker::default());\n        assert_eq!(format!(\"{output:?}\"), format!(\"{:?}\", original));\n    }\n\n    #[cfg(not(feature = \"unredacted-logging\"))]\n    const ALL_VALUES_HEADER_MAP: [(&str, &str); 4] = [\n        (\"name-a\", \"{redacted}\"),\n        (\"name-b\", \"{redacted}\"),\n        (\"prefix-a-x\", \"{redacted}\"),\n        (\"prefix-b-y\", \"{redacted}\"),\n    ];\n    #[cfg(feature = \"unredacted-logging\")]\n    const ALL_VALUES_HEADER_MAP: [(&str, &str); 4] = HEADER_MAP;\n\n    #[test]\n    fn mark_all_values() {\n        let original: HeaderMap = to_header_map(HEADER_MAP);\n        let expected = TestDebugMap(ALL_VALUES_HEADER_MAP);\n\n        let output = SensitiveHeaders::new(&original, |_| HeaderMarker {\n            value: true,\n            key_suffix: None,\n        });\n        assert_eq!(format!(\"{output:?}\"), format!(\"{:?}\", expected));\n    }\n\n    #[cfg(not(feature = \"unredacted-logging\"))]\n    const NAME_A_HEADER_MAP: [(&str, &str); 4] = [\n        (\"name-a\", \"{redacted}\"),\n        (\"name-b\", \"value-b\"),\n        (\"prefix-a-x\", \"value-c\"),\n        (\"prefix-b-y\", \"value-d\"),\n    ];\n    #[cfg(feature = \"unredacted-logging\")]\n    const NAME_A_HEADER_MAP: [(&str, &str); 4] = HEADER_MAP;\n\n    #[test]\n    fn mark_name_a_values() {\n        let original: HeaderMap = to_header_map(HEADER_MAP);\n        let expected = TestDebugMap(NAME_A_HEADER_MAP);\n\n        let output = SensitiveHeaders::new(&original, |name| HeaderMarker {\n            value: name == \"name-a\",\n            key_suffix: None,\n        });\n        assert_eq!(format!(\"{output:?}\"), format!(\"{:?}\", expected));\n    }\n\n    #[cfg(not(feature = \"unredacted-logging\"))]\n    const PREFIX_A_HEADER_MAP: [(&str, &str); 4] = [\n        (\"name-a\", \"value-a\"),\n        (\"name-b\", \"value-b\"),\n        (\"prefix-a{redacted}\", \"value-c\"),\n        (\"prefix-b-y\", \"value-d\"),\n    ];\n    #[cfg(feature = \"unredacted-logging\")]\n    const PREFIX_A_HEADER_MAP: [(&str, &str); 4] = HEADER_MAP;\n\n    #[test]\n    fn mark_prefix_a_values() {\n        let original: HeaderMap = to_header_map(HEADER_MAP);\n        let expected = TestDebugMap(PREFIX_A_HEADER_MAP);\n\n        let prefix = \"prefix-a\";\n        let output = SensitiveHeaders::new(&original, |name: &HeaderName| HeaderMarker {\n            value: false,\n            key_suffix: if name.as_str().starts_with(prefix) {\n                Some(prefix.len())\n            } else {\n                None\n            },\n        });\n        assert_eq!(format!(\"{output:?}\"), format!(\"{:?}\", expected));\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http-server/src/instrumentation/sensitivity/mod.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! The combination of [HTTP binding traits] and the [sensitive trait] require us to redact\n//! portions of the HTTP requests/responses during logging.\n//!\n//! [HTTP binding traits]: https://smithy.io/2.0/spec/http-bindings.html\n//! [sensitive trait]: https://smithy.io/2.0/spec/documentation-traits.html#sensitive-trait\n\npub mod headers;\nmod request;\nmod response;\nmod sensitive;\npub mod uri;\n\nuse http::{HeaderMap, StatusCode, Uri};\npub use request::*;\npub use response::*;\npub use sensitive::*;\n\nuse super::{MakeDebug, MakeDisplay};\n\n/// The string placeholder for redacted data.\npub const REDACTED: &str = \"{redacted}\";\n\n/// An interface for providing [`MakeDebug`] and [`MakeDisplay`] for [`Request`](http::Request) and\n/// [`Response`](http::Response).\npub trait Sensitivity {\n    /// The [`MakeDebug`] and [`MakeDisplay`] for the request [`HeaderMap`] and [`Uri`].\n    type RequestFmt: for<'a> MakeDebug<&'a HeaderMap> + for<'a> MakeDisplay<&'a Uri>;\n    /// The [`MakeDebug`] and [`MakeDisplay`] for the response [`HeaderMap`] and [`StatusCode`].\n    type ResponseFmt: for<'a> MakeDebug<&'a HeaderMap> + MakeDisplay<StatusCode>;\n\n    /// Returns the [`RequestFmt`](Sensitivity::RequestFmt).\n    fn request_fmt() -> Self::RequestFmt;\n\n    /// Returns the [`ResponseFmt`](Sensitivity::ResponseFmt).\n    fn response_fmt() -> Self::ResponseFmt;\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http-server/src/instrumentation/sensitivity/request.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! A builder whose methods allow for configuration of [`MakeFmt`] implementations over parts of [`http::Request`].\n\nuse std::fmt::{Debug, Error, Formatter};\n\nuse http::{header::HeaderName, HeaderMap};\n\nuse crate::instrumentation::{MakeFmt, MakeIdentity};\n\nuse super::{\n    headers::{HeaderMarker, MakeHeaders},\n    uri::{GreedyLabel, MakeLabel, MakeQuery, MakeUri, QueryMarker},\n};\n\n/// Allows the modification the requests URIs [`Display`](std::fmt::Display) and headers\n/// [`Debug`] to accommodate sensitivity.\n///\n/// This enjoys [`MakeFmt`] for [`&HeaderMap`](HeaderMap) and [`&Uri`](http::Uri).\n#[derive(Clone)]\npub struct RequestFmt<Headers, Uri> {\n    headers: Headers,\n    uri: Uri,\n}\n\nimpl<Headers, Uri> Debug for RequestFmt<Headers, Uri> {\n    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error> {\n        f.debug_struct(\"RequestFmt\").finish_non_exhaustive()\n    }\n}\n\n/// Default [`RequestFmt`].\npub type DefaultRequestFmt = RequestFmt<MakeIdentity, MakeUri<MakeIdentity, MakeIdentity>>;\n\nimpl Default for DefaultRequestFmt {\n    fn default() -> Self {\n        Self {\n            headers: MakeIdentity,\n            uri: MakeUri::default(),\n        }\n    }\n}\n\nimpl DefaultRequestFmt {\n    /// Constructs a new [`RequestFmt`] with no redactions.\n    pub fn new() -> Self {\n        Self::default()\n    }\n}\n\nimpl<Header, Uri> RequestFmt<Header, Uri> {\n    /// Marks parts of headers as sensitive using a closure.\n    ///\n    /// See [`SensitiveHeaders`](super::headers::SensitiveHeaders) for more info.\n    pub fn header<F>(self, headers: F) -> RequestFmt<MakeHeaders<F>, Uri>\n    where\n        F: Fn(&HeaderName) -> HeaderMarker,\n    {\n        RequestFmt {\n            headers: MakeHeaders(headers),\n            uri: self.uri,\n        }\n    }\n}\n\nimpl<Header, P, Q> RequestFmt<Header, MakeUri<P, Q>> {\n    /// Marks parts of the URI as sensitive.\n    ///\n    /// See [`Label`](super::uri::Label) for more info.\n    pub fn label<F>(\n        self,\n        label_marker: F,\n        greedy_label: Option<GreedyLabel>,\n    ) -> RequestFmt<Header, MakeUri<MakeLabel<F>, Q>>\n    where\n        F: Fn(usize) -> bool,\n    {\n        RequestFmt {\n            headers: self.headers,\n            uri: MakeUri {\n                make_path: MakeLabel {\n                    label_marker,\n                    greedy_label,\n                },\n                make_query: self.uri.make_query,\n            },\n        }\n    }\n\n    /// Marks parts of the query as sensitive.\n    ///\n    /// See [`Query`](super::uri::Query) for more info.\n    pub fn query<F>(self, query: F) -> RequestFmt<Header, MakeUri<P, MakeQuery<F>>>\n    where\n        F: Fn(&str) -> QueryMarker,\n    {\n        RequestFmt {\n            headers: self.headers,\n            uri: MakeUri {\n                make_path: self.uri.make_path,\n                make_query: MakeQuery(query),\n            },\n        }\n    }\n}\n\nimpl<'a, Headers, Uri> MakeFmt<&'a HeaderMap> for RequestFmt<Headers, Uri>\nwhere\n    Headers: MakeFmt<&'a HeaderMap>,\n{\n    type Target = Headers::Target;\n\n    fn make(&self, source: &'a HeaderMap) -> Self::Target {\n        self.headers.make(source)\n    }\n}\n\nimpl<'a, Headers, Uri> MakeFmt<&'a http::Uri> for RequestFmt<Headers, Uri>\nwhere\n    Uri: MakeFmt<&'a http::Uri>,\n{\n    type Target = Uri::Target;\n\n    fn make(&self, source: &'a http::Uri) -> Self::Target {\n        self.uri.make(source)\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http-server/src/instrumentation/sensitivity/response.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! A builder whose methods allow for configuration of [`MakeFmt`] implementations over parts of [`http::Response`].\n\nuse std::fmt::{Debug, Error, Formatter};\n\nuse http::{header::HeaderName, HeaderMap};\n\nuse crate::instrumentation::{MakeFmt, MakeIdentity};\n\nuse super::{\n    headers::{HeaderMarker, MakeHeaders},\n    MakeSensitive,\n};\n\n/// Allows the modification the responses status code [`Display`](std::fmt::Display) and headers\n/// [`Debug`] to accommodate sensitivity.\n///\n/// This enjoys [`MakeFmt`] for [`&HeaderMap`](HeaderMap) and [`StatusCode`](http::StatusCode).\n#[derive(Clone)]\npub struct ResponseFmt<Headers, StatusCode> {\n    headers: Headers,\n    status_code: StatusCode,\n}\n\nimpl<Headers, StatusCode> Debug for ResponseFmt<Headers, StatusCode> {\n    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error> {\n        f.debug_struct(\"ResponseFmt\").finish_non_exhaustive()\n    }\n}\n\n/// Default [`ResponseFmt`].\npub type DefaultResponseFmt = ResponseFmt<MakeIdentity, MakeIdentity>;\n\nimpl Default for DefaultResponseFmt {\n    fn default() -> Self {\n        Self {\n            headers: MakeIdentity,\n            status_code: MakeIdentity,\n        }\n    }\n}\n\nimpl DefaultResponseFmt {\n    /// Constructs a new [`ResponseFmt`] with no redactions.\n    pub fn new() -> Self {\n        Self::default()\n    }\n}\n\nimpl<Header, StatusCode> ResponseFmt<Header, StatusCode> {\n    /// Marks headers as sensitive using a closure.\n    ///\n    /// See [`SensitiveHeaders`](super::headers::SensitiveHeaders) for more info.\n    pub fn header<F>(self, header: F) -> ResponseFmt<MakeHeaders<F>, StatusCode>\n    where\n        F: Fn(&HeaderName) -> HeaderMarker,\n    {\n        ResponseFmt {\n            headers: MakeHeaders(header),\n            status_code: self.status_code,\n        }\n    }\n\n    /// Marks request status code as sensitive.\n    pub fn status_code(self) -> ResponseFmt<Header, MakeSensitive> {\n        ResponseFmt {\n            headers: self.headers,\n            status_code: MakeSensitive,\n        }\n    }\n}\n\nimpl<'a, Headers, StatusCode> MakeFmt<&'a HeaderMap> for ResponseFmt<Headers, StatusCode>\nwhere\n    Headers: MakeFmt<&'a HeaderMap>,\n{\n    type Target = Headers::Target;\n\n    fn make(&self, source: &'a HeaderMap) -> Self::Target {\n        self.headers.make(source)\n    }\n}\n\nimpl<Headers, StatusCode> MakeFmt<http::StatusCode> for ResponseFmt<Headers, StatusCode>\nwhere\n    StatusCode: MakeFmt<http::StatusCode>,\n{\n    type Target = StatusCode::Target;\n\n    fn make(&self, source: http::StatusCode) -> Self::Target {\n        self.status_code.make(source)\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http-server/src/instrumentation/sensitivity/sensitive.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! A general wrapper to allow for feature flagged redactions.\n\nuse std::fmt::{Debug, Display, Error, Formatter};\n\nuse crate::instrumentation::MakeFmt;\n\nuse super::REDACTED;\n\n/// A wrapper used to modify the [`Display`] and [`Debug`] implementation of the inner structure\n/// based on the feature flag `unredacted-logging`. When the `unredacted-logging` feature is enabled, the\n/// implementations will defer to those on `T`, when disabled they will defer to [`REDACTED`].\n///\n/// Note that there are [`Display`] and [`Debug`] implementations for `&T` where `T: Display`\n/// and `T: Debug` respectively - wrapping references is allowed for the cases when consuming the\n/// inner struct is not desired.\n///\n/// # Example\n///\n/// ```\n/// # use aws_smithy_legacy_http_server::instrumentation::sensitivity::Sensitive;\n/// # let address = \"\";\n/// tracing::debug!(\n///     name = %Sensitive(\"Alice\"),\n///     friends = ?Sensitive([\"Bob\"]),\n///     address = ?Sensitive(&address)\n/// );\n/// ```\npub struct Sensitive<T>(pub T);\n\nimpl<T> Debug for Sensitive<T>\nwhere\n    T: Debug,\n{\n    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error> {\n        if cfg!(feature = \"unredacted-logging\") {\n            self.0.fmt(f)\n        } else {\n            Debug::fmt(&REDACTED, f)\n        }\n    }\n}\n\nimpl<T> Display for Sensitive<T>\nwhere\n    T: Display,\n{\n    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error> {\n        if cfg!(feature = \"unredacted-logging\") {\n            self.0.fmt(f)\n        } else {\n            Display::fmt(&REDACTED, f)\n        }\n    }\n}\n\n/// A [`MakeFmt`] producing [`Sensitive`].\n#[derive(Debug, Clone)]\npub struct MakeSensitive;\n\nimpl<T> MakeFmt<T> for MakeSensitive {\n    type Target = Sensitive<T>;\n\n    fn make(&self, source: T) -> Self::Target {\n        Sensitive(source)\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n\n    #[test]\n    fn debug() {\n        let inner = \"hello world\";\n        let sensitive = Sensitive(inner);\n        let actual = format!(\"{sensitive:?}\");\n        let expected = if cfg!(feature = \"unredacted-logging\") {\n            format!(\"{inner:?}\")\n        } else {\n            format!(\"{REDACTED:?}\")\n        };\n        assert_eq!(actual, expected)\n    }\n\n    #[test]\n    fn display() {\n        let inner = \"hello world\";\n        let sensitive = Sensitive(inner);\n        let actual = format!(\"{sensitive}\");\n        let expected = if cfg!(feature = \"unredacted-logging\") {\n            inner.to_string()\n        } else {\n            REDACTED.to_string()\n        };\n        assert_eq!(actual, expected)\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http-server/src/instrumentation/sensitivity/uri/label.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! A wrapper around a path [`&str`](str) to allow for sensitivity.\n\nuse std::fmt::{Debug, Display, Error, Formatter};\n\nuse crate::instrumentation::{sensitivity::Sensitive, MakeFmt};\n\n/// A wrapper around a path [`&str`](str) which modifies the behavior of [`Display`]. Specific path segments are marked\n/// as sensitive by providing predicate over the segment index. This accommodates the [httpLabel trait] with\n/// non-greedy labels.\n///\n/// The [`Display`] implementation will respect the `unredacted-logging` flag.\n///\n/// # Example\n///\n/// ```\n/// # use aws_smithy_legacy_http_server::instrumentation::sensitivity::uri::Label;\n/// # use http::Uri;\n/// # let path = \"\";\n/// // Path segment 2 is redacted and a trailing greedy label\n/// let uri = Label::new(&path, |x| x == 2, None);\n/// println!(\"{uri}\");\n/// ```\n///\n/// [httpLabel trait]: https://smithy.io/2.0/spec/http-bindings.html#httplabel-trait\n#[allow(missing_debug_implementations)]\n#[derive(Clone)]\npub struct Label<'a, F> {\n    path: &'a str,\n    label_marker: F,\n    greedy_label: Option<GreedyLabel>,\n}\n\n/// Marks a segment as a greedy label up until a char offset from the end.\n///\n/// # Example\n///\n/// The pattern, `/alpha/beta/{greedy+}/trail`, has segment index 2 and offset from the end of 6.\n///\n/// ```rust\n/// # use aws_smithy_legacy_http_server::instrumentation::sensitivity::uri::GreedyLabel;\n/// let greedy_label = GreedyLabel::new(2, 6);\n/// ```\n#[derive(Clone, Debug)]\npub struct GreedyLabel {\n    segment_index: usize,\n    end_offset: usize,\n}\n\nimpl GreedyLabel {\n    /// Constructs a new [`GreedyLabel`] from a segment index and an offset from the end of the URI.\n    pub fn new(segment_index: usize, end_offset: usize) -> Self {\n        Self {\n            segment_index,\n            end_offset,\n        }\n    }\n}\n\nimpl<'a, F> Label<'a, F> {\n    /// Constructs a new [`Label`].\n    pub fn new(path: &'a str, label_marker: F, greedy_label: Option<GreedyLabel>) -> Self {\n        Self {\n            path,\n            label_marker,\n            greedy_label,\n        }\n    }\n}\n\nimpl<F> Display for Label<'_, F>\nwhere\n    F: Fn(usize) -> bool,\n{\n    #[inline]\n    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error> {\n        if let Some(greedy_label) = &self.greedy_label {\n            // Calculate the byte index of the start of the greedy label and whether it was reached while writing the\n            // normal labels.\n            // TODO(clippy): Switch from fold to try_fold\n            #[allow(clippy::manual_try_fold)]\n            let (greedy_start, greedy_hit) = self\n                .path\n                .split('/')\n                // Skip the first segment which will always be empty.\n                .skip(1)\n                // Iterate up to the segment index given in the `GreedyLabel`.\n                .take(greedy_label.segment_index + 1)\n                .enumerate()\n                .fold(Ok((0, false)), |acc, (index, segment)| {\n                    acc.and_then(|(greedy_start, _)| {\n                        if index == greedy_label.segment_index {\n                            // We've hit the greedy label, set `hit_greedy` to `true`.\n                            Ok((greedy_start, true))\n                        } else {\n                            // Prior to greedy segment, use `label_marker` to redact segments.\n                            if (self.label_marker)(index) {\n                                write!(f, \"/{}\", Sensitive(segment))?;\n                            } else {\n                                write!(f, \"/{segment}\")?;\n                            }\n                            // Add the segment length and the separator to the `greedy_start`.\n                            let greedy_start = greedy_start + segment.len() + 1;\n                            Ok((greedy_start, false))\n                        }\n                    })\n                })?;\n\n            // If we reached the greedy label segment then use the `end_offset` to redact the interval\n            // and print the remainder.\n            if greedy_hit {\n                if let Some(end_index) = self.path.len().checked_sub(greedy_label.end_offset) {\n                    if greedy_start < end_index {\n                        // [greedy_start + 1 .. end_index] is a non-empty slice - redact it.\n                        let greedy_redaction = Sensitive(&self.path[greedy_start + 1..end_index]);\n                        let remainder = &self.path[end_index..];\n                        write!(f, \"/{greedy_redaction}{remainder}\")?;\n                    } else {\n                        // [greedy_start + 1 .. end_index] is an empty slice - don't redact it.\n                        // NOTE: This is unreachable if the greedy label is valid.\n                        write!(f, \"{}\", &self.path[greedy_start..])?;\n                    }\n                }\n            } else {\n                // NOTE: This is unreachable if the greedy label is valid.\n            }\n        } else {\n            // Use `label_marker` to redact segments.\n            for (index, segment) in self\n                .path\n                .split('/')\n                // Skip the first segment which will always be empty.\n                .skip(1)\n                .enumerate()\n            {\n                if (self.label_marker)(index) {\n                    write!(f, \"/{}\", Sensitive(segment))?;\n                } else {\n                    write!(f, \"/{segment}\")?;\n                }\n            }\n        }\n\n        Ok(())\n    }\n}\n\n/// A [`MakeFmt`] producing [`Label`].\n#[derive(Clone)]\npub struct MakeLabel<F> {\n    pub(crate) label_marker: F,\n    pub(crate) greedy_label: Option<GreedyLabel>,\n}\n\nimpl<F> Debug for MakeLabel<F> {\n    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error> {\n        f.debug_struct(\"MakeLabel\")\n            .field(\"greedy_label\", &self.greedy_label)\n            .finish_non_exhaustive()\n    }\n}\n\nimpl<'a, F> MakeFmt<&'a str> for MakeLabel<F>\nwhere\n    F: Clone,\n{\n    type Target = Label<'a, F>;\n\n    fn make(&self, path: &'a str) -> Self::Target {\n        Label::new(path, self.label_marker.clone(), self.greedy_label.clone())\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use http::Uri;\n\n    use crate::instrumentation::sensitivity::uri::{tests::EXAMPLES, GreedyLabel};\n\n    use super::Label;\n\n    #[test]\n    fn mark_none() {\n        let originals = EXAMPLES.into_iter().map(Uri::from_static);\n        for original in originals {\n            let expected = original.path().to_string();\n            let output = Label::new(original.path(), |_| false, None).to_string();\n            assert_eq!(output, expected, \"original = {original}\");\n        }\n    }\n\n    #[cfg(not(feature = \"unredacted-logging\"))]\n    const ALL_EXAMPLES: [&str; 19] = [\n        \"g:h\",\n        \"http://a/{redacted}/{redacted}/{redacted}\",\n        \"http://a/{redacted}/{redacted}/{redacted}/{redacted}\",\n        \"http://a/{redacted}\",\n        \"http://a/{redacted}\",\n        \"http://a/{redacted}/{redacted}/{redacted}\",\n        \"http://a/{redacted}/{redacted}/{redacted}\",\n        \"http://a/{redacted}/{redacted}/{redacted}\",\n        \"http://a/{redacted}/{redacted}/{redacted}\",\n        \"http://a/{redacted}/{redacted}/{redacted}\",\n        \"http://a/{redacted}/{redacted}/{redacted}\",\n        \"http://a/{redacted}/{redacted}/{redacted}\",\n        \"http://a/{redacted}/{redacted}/{redacted}\",\n        \"http://a/{redacted}/{redacted}/{redacted}\",\n        \"http://a/{redacted}/{redacted}/{redacted}\",\n        \"http://a/{redacted}/{redacted}/{redacted}\",\n        \"http://a/{redacted}/{redacted}\",\n        \"http://a/{redacted}/{redacted}\",\n        \"http://a/{redacted}\",\n    ];\n\n    #[cfg(feature = \"unredacted-logging\")]\n    pub const ALL_EXAMPLES: [&str; 19] = EXAMPLES;\n\n    #[test]\n    fn mark_all() {\n        let originals = EXAMPLES.into_iter().map(Uri::from_static);\n        let expecteds = ALL_EXAMPLES.into_iter().map(Uri::from_static);\n        for (original, expected) in originals.zip(expecteds) {\n            let output = Label::new(original.path(), |_| true, None).to_string();\n            assert_eq!(output, expected.path(), \"original = {original}\");\n        }\n    }\n\n    #[cfg(not(feature = \"unredacted-logging\"))]\n    pub const GREEDY_EXAMPLES: [&str; 19] = [\n        \"g:h\",\n        \"http://a/b/{redacted}\",\n        \"http://a/b/{redacted}\",\n        \"http://a/g\",\n        \"http://g\",\n        \"http://a/b/{redacted}?y\",\n        \"http://a/b/{redacted}?y\",\n        \"http://a/b/{redacted}?q#s\",\n        \"http://a/b/{redacted}\",\n        \"http://a/b/{redacted}?y#s\",\n        \"http://a/b/{redacted}\",\n        \"http://a/b/{redacted}\",\n        \"http://a/b/{redacted}?y#s\",\n        \"http://a/b/{redacted}?q\",\n        \"http://a/b/{redacted}\",\n        \"http://a/b/{redacted}\",\n        \"http://a/b/{redacted}\",\n        \"http://a/b/{redacted}\",\n        \"http://a/\",\n    ];\n\n    #[cfg(feature = \"unredacted-logging\")]\n    pub const GREEDY_EXAMPLES: [&str; 19] = EXAMPLES;\n\n    #[test]\n    fn greedy() {\n        let originals = EXAMPLES.into_iter().map(Uri::from_static);\n        let expecteds = GREEDY_EXAMPLES.into_iter().map(Uri::from_static);\n        for (original, expected) in originals.zip(expecteds) {\n            let output = Label::new(original.path(), |_| false, Some(GreedyLabel::new(1, 0))).to_string();\n            assert_eq!(output, expected.path(), \"original = {original}\");\n        }\n    }\n\n    #[cfg(not(feature = \"unredacted-logging\"))]\n    pub const GREEDY_EXAMPLES_OFFSET: [&str; 19] = [\n        \"g:h\",\n        \"http://a/b/{redacted}g\",\n        \"http://a/b/{redacted}/\",\n        \"http://a/g\",\n        \"http://g\",\n        \"http://a/b/{redacted}p?y\",\n        \"http://a/b/{redacted}g?y\",\n        \"http://a/b/{redacted}p?q#s\",\n        \"http://a/b/{redacted}g\",\n        \"http://a/b/{redacted}g?y#s\",\n        \"http://a/b/{redacted}x\",\n        \"http://a/b/{redacted}x\",\n        \"http://a/b/{redacted}x?y#s\",\n        \"http://a/b/{redacted}p?q\",\n        \"http://a/b/{redacted}/\",\n        \"http://a/b/{redacted}/\",\n        \"http://a/b/\",\n        \"http://a/b/{redacted}g\",\n        \"http://a/\",\n    ];\n\n    #[cfg(feature = \"unredacted-logging\")]\n    pub const GREEDY_EXAMPLES_OFFSET: [&str; 19] = EXAMPLES;\n\n    #[test]\n    fn greedy_offset_a() {\n        let originals = EXAMPLES.into_iter().map(Uri::from_static);\n        let expecteds = GREEDY_EXAMPLES_OFFSET.into_iter().map(Uri::from_static);\n        for (original, expected) in originals.zip(expecteds) {\n            let output = Label::new(original.path(), |_| false, Some(GreedyLabel::new(1, 1))).to_string();\n            assert_eq!(output, expected.path(), \"original = {original}\");\n        }\n    }\n\n    const EXTRA_EXAMPLES_UNREDACTED: [&str; 4] = [\n        \"http://base/a/b/hello_world\",\n        \"http://base/a/b/c/hello_world\",\n        \"http://base/a\",\n        \"http://base/a/b/c\",\n    ];\n\n    #[cfg(feature = \"unredacted-logging\")]\n    const EXTRA_EXAMPLES_REDACTED: [&str; 4] = EXTRA_EXAMPLES_UNREDACTED;\n    #[cfg(not(feature = \"unredacted-logging\"))]\n    const EXTRA_EXAMPLES_REDACTED: [&str; 4] = [\n        \"http://base/a/b/{redacted}world\",\n        \"http://base/a/b/{redacted}world\",\n        \"http://base/a\",\n        \"http://base/a/b/c\",\n    ];\n\n    #[test]\n    fn greedy_offset_b() {\n        let originals = EXTRA_EXAMPLES_UNREDACTED.into_iter().map(Uri::from_static);\n        let expecteds = EXTRA_EXAMPLES_REDACTED.into_iter().map(Uri::from_static);\n        for (original, expected) in originals.zip(expecteds) {\n            let output = Label::new(original.path(), |_| false, Some(GreedyLabel::new(2, 5))).to_string();\n            assert_eq!(output, expected.path(), \"original = {original}\");\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http-server/src/instrumentation/sensitivity/uri/mod.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Wrappers around [`Uri`] and it's constituents to allow for sensitivity.\n\nmod label;\nmod query;\n\nuse std::fmt::{Debug, Display, Error, Formatter};\n\nuse http::Uri;\n\npub use label::*;\npub use query::*;\n\nuse crate::instrumentation::{MakeDisplay, MakeFmt, MakeIdentity};\n\n/// A wrapper around [`&Uri`](Uri) which modifies the behavior of [`Display`]. Specific parts of the [`Uri`] as are\n/// marked as sensitive using the methods provided.\n///\n/// The [`Display`] implementation will respect the `unredacted-logging` flag.\n#[allow(missing_debug_implementations)]\npub struct SensitiveUri<'a, P, Q> {\n    uri: &'a Uri,\n    make_path: P,\n    make_query: Q,\n}\n\nimpl<'a> SensitiveUri<'a, MakeIdentity, MakeIdentity> {\n    /// Constructs a new [`SensitiveUri`] with nothing marked as sensitive.\n    pub fn new(uri: &'a Uri) -> Self {\n        Self {\n            uri,\n            make_path: MakeIdentity,\n            make_query: MakeIdentity,\n        }\n    }\n}\n\nimpl<'a, P, Q> SensitiveUri<'a, P, Q> {\n    pub(crate) fn make_path<M>(self, make_path: M) -> SensitiveUri<'a, M, Q> {\n        SensitiveUri {\n            uri: self.uri,\n            make_path,\n            make_query: self.make_query,\n        }\n    }\n\n    pub(crate) fn make_query<M>(self, make_query: M) -> SensitiveUri<'a, P, M> {\n        SensitiveUri {\n            uri: self.uri,\n            make_path: self.make_path,\n            make_query,\n        }\n    }\n\n    /// Marks path segments as sensitive by providing predicate over the segment index.\n    ///\n    /// See [`Label`] for more info.\n    pub fn label<F>(self, label_marker: F, greedy_label: Option<GreedyLabel>) -> SensitiveUri<'a, MakeLabel<F>, Q> {\n        self.make_path(MakeLabel {\n            label_marker,\n            greedy_label,\n        })\n    }\n\n    /// Marks specific query string values as sensitive by supplying a predicate over the query string keys.\n    ///\n    /// See [`Query`] for more info.\n    pub fn query<F>(self, marker: F) -> SensitiveUri<'a, P, MakeQuery<F>> {\n        self.make_query(MakeQuery(marker))\n    }\n}\n\nimpl<'a, P, Q> Display for SensitiveUri<'a, P, Q>\nwhere\n    P: MakeDisplay<&'a str>,\n    Q: MakeDisplay<&'a str>,\n{\n    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error> {\n        if let Some(scheme) = self.uri.scheme() {\n            write!(f, \"{scheme}://\")?;\n        }\n\n        if let Some(authority) = self.uri.authority() {\n            write!(f, \"{authority}\")?;\n        }\n\n        let path = self.uri.path();\n        let path = self.make_path.make_display(path);\n        write!(f, \"{path}\")?;\n\n        if let Some(query) = self.uri.query() {\n            let query = self.make_query.make_display(query);\n            write!(f, \"?{query}\")?;\n        }\n\n        Ok(())\n    }\n}\n\n/// A [`MakeFmt`] producing [`SensitiveUri`].\n#[derive(Clone)]\npub struct MakeUri<P, Q> {\n    pub(crate) make_path: P,\n    pub(crate) make_query: Q,\n}\n\nimpl<P, Q> Debug for MakeUri<P, Q> {\n    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error> {\n        f.debug_struct(\"MakeUri\").finish_non_exhaustive()\n    }\n}\n\nimpl<'a, P, Q> MakeFmt<&'a http::Uri> for MakeUri<P, Q>\nwhere\n    Q: Clone,\n    P: Clone,\n{\n    type Target = SensitiveUri<'a, P, Q>;\n\n    fn make(&self, source: &'a http::Uri) -> Self::Target {\n        SensitiveUri::new(source)\n            .make_query(self.make_query.clone())\n            .make_path(self.make_path.clone())\n    }\n}\n\nimpl Default for MakeUri<MakeIdentity, MakeIdentity> {\n    fn default() -> Self {\n        Self {\n            make_path: MakeIdentity,\n            make_query: MakeIdentity,\n        }\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use http::Uri;\n\n    use super::{QueryMarker, SensitiveUri};\n\n    // https://www.w3.org/2004/04/uri-rel-test.html\n    // NOTE: http::Uri's `Display` implementation trims the fragment, we mirror this behavior\n    pub const EXAMPLES: [&str; 19] = [\n        \"g:h\",\n        \"http://a/b/c/g\",\n        \"http://a/b/c/g/\",\n        \"http://a/g\",\n        \"http://g\",\n        \"http://a/b/c/d;p?y\",\n        \"http://a/b/c/g?y\",\n        \"http://a/b/c/d;p?q#s\",\n        \"http://a/b/c/g#s\",\n        \"http://a/b/c/g?y#s\",\n        \"http://a/b/c/;x\",\n        \"http://a/b/c/g;x\",\n        \"http://a/b/c/g;x?y#s\",\n        \"http://a/b/c/d;p?q\",\n        \"http://a/b/c/\",\n        \"http://a/b/c/\",\n        \"http://a/b/\",\n        \"http://a/b/g\",\n        \"http://a/\",\n    ];\n\n    pub const QUERY_STRING_EXAMPLES: [&str; 11] = [\n        \"http://a/b/c/g?&\",\n        \"http://a/b/c/g?x\",\n        \"http://a/b/c/g?x&y\",\n        \"http://a/b/c/g?x&y&\",\n        \"http://a/b/c/g?x&y&z\",\n        \"http://a/b/c/g?x=y&x=z\",\n        \"http://a/b/c/g?x=y&z\",\n        \"http://a/b/c/g?x=y&\",\n        \"http://a/b/c/g?x=y&y=z\",\n        \"http://a/b/c/g?&x=z\",\n        \"http://a/b/c/g?x&x=y\",\n    ];\n\n    #[test]\n    fn path_mark_none() {\n        let originals = EXAMPLES.into_iter().map(Uri::from_static);\n        for original in originals {\n            let output = SensitiveUri::new(&original).to_string();\n            assert_eq!(output, original.to_string());\n        }\n    }\n\n    #[cfg(not(feature = \"unredacted-logging\"))]\n    const FIRST_PATH_EXAMPLES: [&str; 19] = [\n        \"g:h\",\n        \"http://a/{redacted}/c/g\",\n        \"http://a/{redacted}/c/g/\",\n        \"http://a/{redacted}\",\n        \"http://g/{redacted}\",\n        \"http://a/{redacted}/c/d;p?y\",\n        \"http://a/{redacted}/c/g?y\",\n        \"http://a/{redacted}/c/d;p?q#s\",\n        \"http://a/{redacted}/c/g#s\",\n        \"http://a/{redacted}/c/g?y#s\",\n        \"http://a/{redacted}/c/;x\",\n        \"http://a/{redacted}/c/g;x\",\n        \"http://a/{redacted}/c/g;x?y#s\",\n        \"http://a/{redacted}/c/d;p?q\",\n        \"http://a/{redacted}/c/\",\n        \"http://a/{redacted}/c/\",\n        \"http://a/{redacted}/\",\n        \"http://a/{redacted}/g\",\n        \"http://a/{redacted}\",\n    ];\n    #[cfg(feature = \"unredacted-logging\")]\n    const FIRST_PATH_EXAMPLES: [&str; 19] = EXAMPLES;\n\n    #[test]\n    fn path_mark_first_segment() {\n        let originals = EXAMPLES.into_iter().map(Uri::from_static);\n        let expecteds = FIRST_PATH_EXAMPLES.into_iter().map(Uri::from_static);\n        for (original, expected) in originals.zip(expecteds) {\n            let output = SensitiveUri::new(&original).label(|x| x == 0, None).to_string();\n            assert_eq!(output, expected.to_string(), \"original = {original}\");\n        }\n    }\n\n    #[cfg(not(feature = \"unredacted-logging\"))]\n    const LAST_PATH_EXAMPLES: [&str; 19] = [\n        \"g:h\",\n        \"http://a/b/c/{redacted}\",\n        \"http://a/b/c/g/{redacted}\",\n        \"http://a/{redacted}\",\n        \"http://g/{redacted}\",\n        \"http://a/b/c/{redacted}?y\",\n        \"http://a/b/c/{redacted}?y\",\n        \"http://a/b/c/{redacted}?q#s\",\n        \"http://a/b/c/{redacted}#s\",\n        \"http://a/b/c/{redacted}?y#s\",\n        \"http://a/b/c/{redacted}\",\n        \"http://a/b/c/{redacted}\",\n        \"http://a/b/c/{redacted}?y#s\",\n        \"http://a/b/c/{redacted}?q\",\n        \"http://a/b/c/{redacted}\",\n        \"http://a/b/c/{redacted}\",\n        \"http://a/b/{redacted}\",\n        \"http://a/b/{redacted}\",\n        \"http://a/{redacted}\",\n    ];\n    #[cfg(feature = \"unredacted-logging\")]\n    const LAST_PATH_EXAMPLES: [&str; 19] = EXAMPLES;\n\n    #[test]\n    fn path_mark_last_segment() {\n        let originals = EXAMPLES.into_iter().map(Uri::from_static);\n        let expecteds = LAST_PATH_EXAMPLES.into_iter().map(Uri::from_static);\n        for (original, expected) in originals.zip(expecteds) {\n            let path_len = original.path().split('/').skip(1).count();\n            let output = SensitiveUri::new(&original)\n                .label(|x| x + 1 == path_len, None)\n                .to_string();\n            assert_eq!(output, expected.to_string(), \"original = {original}\");\n        }\n    }\n\n    #[cfg(not(feature = \"unredacted-logging\"))]\n    pub const ALL_KEYS_QUERY_STRING_EXAMPLES: [&str; 11] = [\n        \"http://a/b/c/g?&\",\n        \"http://a/b/c/g?x\",\n        \"http://a/b/c/g?x&y\",\n        \"http://a/b/c/g?x&y&\",\n        \"http://a/b/c/g?x&y&z\",\n        \"http://a/b/c/g?{redacted}=y&{redacted}=z\",\n        \"http://a/b/c/g?{redacted}=y&z\",\n        \"http://a/b/c/g?{redacted}=y&\",\n        \"http://a/b/c/g?{redacted}=y&{redacted}=z\",\n        \"http://a/b/c/g?&{redacted}=z\",\n        \"http://a/b/c/g?x&{redacted}=y\",\n    ];\n    #[cfg(feature = \"unredacted-logging\")]\n    pub const ALL_KEYS_QUERY_STRING_EXAMPLES: [&str; 11] = QUERY_STRING_EXAMPLES;\n\n    #[test]\n    fn query_mark_all_keys() {\n        let originals = QUERY_STRING_EXAMPLES.into_iter().map(Uri::from_static);\n        let expecteds = ALL_KEYS_QUERY_STRING_EXAMPLES.into_iter().map(Uri::from_static);\n        for (original, expected) in originals.zip(expecteds) {\n            let output = SensitiveUri::new(&original)\n                .query(|_| QueryMarker {\n                    key: true,\n                    value: false,\n                })\n                .to_string();\n            assert_eq!(output, expected.to_string(), \"original = {original}\");\n        }\n    }\n\n    #[cfg(not(feature = \"unredacted-logging\"))]\n    pub const ALL_VALUES_QUERY_STRING_EXAMPLES: [&str; 11] = [\n        \"http://a/b/c/g?&\",\n        \"http://a/b/c/g?x\",\n        \"http://a/b/c/g?x&y\",\n        \"http://a/b/c/g?x&y&\",\n        \"http://a/b/c/g?x&y&z\",\n        \"http://a/b/c/g?x={redacted}&x={redacted}\",\n        \"http://a/b/c/g?x={redacted}&z\",\n        \"http://a/b/c/g?x={redacted}&\",\n        \"http://a/b/c/g?x={redacted}&y={redacted}\",\n        \"http://a/b/c/g?&x={redacted}\",\n        \"http://a/b/c/g?x&x={redacted}\",\n    ];\n    #[cfg(feature = \"unredacted-logging\")]\n    pub const ALL_VALUES_QUERY_STRING_EXAMPLES: [&str; 11] = QUERY_STRING_EXAMPLES;\n\n    #[test]\n    fn query_mark_all_values() {\n        let originals = QUERY_STRING_EXAMPLES.into_iter().map(Uri::from_static);\n        let expecteds = ALL_VALUES_QUERY_STRING_EXAMPLES.into_iter().map(Uri::from_static);\n        for (original, expected) in originals.zip(expecteds) {\n            let output = SensitiveUri::new(&original)\n                .query(|_| QueryMarker {\n                    key: false,\n                    value: true,\n                })\n                .to_string();\n            assert_eq!(output, expected.to_string(), \"original = {original}\");\n        }\n    }\n\n    #[cfg(not(feature = \"unredacted-logging\"))]\n    pub const ALL_PAIRS_QUERY_STRING_EXAMPLES: [&str; 11] = [\n        \"http://a/b/c/g?&\",\n        \"http://a/b/c/g?x\",\n        \"http://a/b/c/g?x&y\",\n        \"http://a/b/c/g?x&y&\",\n        \"http://a/b/c/g?x&y&z\",\n        \"http://a/b/c/g?{redacted}={redacted}&{redacted}={redacted}\",\n        \"http://a/b/c/g?{redacted}={redacted}&z\",\n        \"http://a/b/c/g?{redacted}={redacted}&\",\n        \"http://a/b/c/g?{redacted}={redacted}&{redacted}={redacted}\",\n        \"http://a/b/c/g?&{redacted}={redacted}\",\n        \"http://a/b/c/g?x&{redacted}={redacted}\",\n    ];\n    #[cfg(feature = \"unredacted-logging\")]\n    pub const ALL_PAIRS_QUERY_STRING_EXAMPLES: [&str; 11] = QUERY_STRING_EXAMPLES;\n\n    #[test]\n    fn query_mark_all_pairs() {\n        let originals = QUERY_STRING_EXAMPLES.into_iter().map(Uri::from_static);\n        let expecteds = ALL_PAIRS_QUERY_STRING_EXAMPLES.into_iter().map(Uri::from_static);\n        for (original, expected) in originals.zip(expecteds) {\n            let output = SensitiveUri::new(&original)\n                .query(|_| QueryMarker { key: true, value: true })\n                .to_string();\n            assert_eq!(output, expected.to_string(), \"original = {original}\");\n        }\n    }\n\n    #[cfg(not(feature = \"unredacted-logging\"))]\n    pub const X_QUERY_STRING_EXAMPLES: [&str; 11] = [\n        \"http://a/b/c/g?&\",\n        \"http://a/b/c/g?x\",\n        \"http://a/b/c/g?x&y\",\n        \"http://a/b/c/g?x&y&\",\n        \"http://a/b/c/g?x&y&z\",\n        \"http://a/b/c/g?x={redacted}&x={redacted}\",\n        \"http://a/b/c/g?x={redacted}&z\",\n        \"http://a/b/c/g?x={redacted}&\",\n        \"http://a/b/c/g?x={redacted}&y=z\",\n        \"http://a/b/c/g?&x={redacted}\",\n        \"http://a/b/c/g?x&x={redacted}\",\n    ];\n    #[cfg(feature = \"unredacted-logging\")]\n    pub const X_QUERY_STRING_EXAMPLES: [&str; 11] = QUERY_STRING_EXAMPLES;\n\n    #[test]\n    fn query_mark_x() {\n        let originals = QUERY_STRING_EXAMPLES.into_iter().map(Uri::from_static);\n        let expecteds = X_QUERY_STRING_EXAMPLES.into_iter().map(Uri::from_static);\n        for (original, expected) in originals.zip(expecteds) {\n            let output = SensitiveUri::new(&original)\n                .query(|key| QueryMarker {\n                    key: false,\n                    value: key == \"x\",\n                })\n                .to_string();\n            assert_eq!(output, expected.to_string(), \"original = {original}\");\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http-server/src/instrumentation/sensitivity/uri/query.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! A wrapper around a query string [`&str`](str) to allow for sensitivity.\n\nuse std::fmt::{Debug, Display, Error, Formatter};\n\nuse crate::instrumentation::{sensitivity::Sensitive, MakeFmt};\n\n/// Marks the sensitive data of a query string pair.\n#[derive(Debug, Default, PartialEq, Eq)]\npub struct QueryMarker {\n    /// Set to `true` to mark the key as sensitive.\n    pub key: bool,\n    /// Set to `true` to mark the value as sensitive.\n    pub value: bool,\n}\n\n/// A wrapper around a query string [`&str`](str) which modifies the behavior of [`Display`]. Specific query string\n/// values are marked as sensitive by providing predicate over the keys. This accommodates the [httpQuery trait] and\n/// the [httpQueryParams trait].\n///\n/// The [`Display`] implementation will respect the `unredacted-logging` flag.\n///\n/// # Example\n///\n/// ```\n/// # use aws_smithy_legacy_http_server::instrumentation::sensitivity::uri::{Query, QueryMarker};\n/// # let uri = \"\";\n/// // Query string value with key \"name\" is redacted\n/// let uri = Query::new(&uri, |x| QueryMarker { key: false, value: x == \"name\" } );\n/// println!(\"{uri}\");\n/// ```\n///\n/// [httpQuery trait]: https://smithy.io/2.0/spec/http-bindings.html#httpquery-trait\n/// [httpQueryParams trait]: https://smithy.io/2.0/spec/http-bindings.html#httpqueryparams-trait\n#[allow(missing_debug_implementations)]\npub struct Query<'a, F> {\n    query: &'a str,\n    marker: F,\n}\n\nimpl<'a, F> Query<'a, F> {\n    /// Constructs a new [`Query`].\n    pub fn new(query: &'a str, marker: F) -> Self {\n        Self { query, marker }\n    }\n}\n\n#[inline]\nfn write_pair<'a, F>(section: &'a str, marker: F, f: &mut Formatter<'_>) -> Result<(), Error>\nwhere\n    F: Fn(&'a str) -> QueryMarker,\n{\n    if let Some((key, value)) = section.split_once('=') {\n        match (marker)(key) {\n            QueryMarker { key: true, value: true } => write!(f, \"{}={}\", Sensitive(key), Sensitive(value)),\n            QueryMarker {\n                key: true,\n                value: false,\n            } => write!(f, \"{}={value}\", Sensitive(key)),\n            QueryMarker {\n                key: false,\n                value: true,\n            } => write!(f, \"{key}={}\", Sensitive(value)),\n            QueryMarker {\n                key: false,\n                value: false,\n            } => write!(f, \"{key}={value}\"),\n        }\n    } else {\n        write!(f, \"{section}\")\n    }\n}\n\nimpl<'a, F> Display for Query<'a, F>\nwhere\n    F: Fn(&'a str) -> QueryMarker,\n{\n    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error> {\n        let mut it = self.query.split('&');\n\n        if let Some(section) = it.next() {\n            write_pair(section, &self.marker, f)?;\n        }\n\n        for section in it {\n            write!(f, \"&\")?;\n            write_pair(section, &self.marker, f)?;\n        }\n\n        Ok(())\n    }\n}\n\n/// A [`MakeFmt`] producing [`Query`].\n#[derive(Clone)]\npub struct MakeQuery<F>(pub(crate) F);\n\nimpl<F> Debug for MakeQuery<F> {\n    fn fmt(&self, f: &mut Formatter<'_>) -> Result<(), Error> {\n        f.debug_tuple(\"MakeQuery\").field(&\"...\").finish()\n    }\n}\nimpl<'a, F> MakeFmt<&'a str> for MakeQuery<F>\nwhere\n    F: Clone,\n{\n    type Target = Query<'a, F>;\n\n    fn make(&self, path: &'a str) -> Self::Target {\n        Query::new(path, self.0.clone())\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use http::Uri;\n\n    use crate::instrumentation::sensitivity::uri::tests::{\n        ALL_KEYS_QUERY_STRING_EXAMPLES, ALL_PAIRS_QUERY_STRING_EXAMPLES, ALL_VALUES_QUERY_STRING_EXAMPLES, EXAMPLES,\n        QUERY_STRING_EXAMPLES, X_QUERY_STRING_EXAMPLES,\n    };\n\n    use super::*;\n\n    #[test]\n    fn mark_none() {\n        let originals = EXAMPLES.into_iter().chain(QUERY_STRING_EXAMPLES).map(Uri::from_static);\n        for original in originals {\n            if let Some(query) = original.query() {\n                let output = Query::new(query, |_| QueryMarker::default()).to_string();\n                assert_eq!(output, query, \"original = {original}\");\n            }\n        }\n    }\n\n    #[test]\n    fn mark_all_keys() {\n        let originals = QUERY_STRING_EXAMPLES.into_iter().map(Uri::from_static);\n        let expecteds = ALL_KEYS_QUERY_STRING_EXAMPLES.into_iter().map(Uri::from_static);\n        for (original, expected) in originals.zip(expecteds) {\n            let output = Query::new(original.query().unwrap(), |_| QueryMarker {\n                key: true,\n                value: false,\n            })\n            .to_string();\n            assert_eq!(output, expected.query().unwrap(), \"original = {original}\");\n        }\n    }\n\n    #[test]\n    fn mark_all_values() {\n        let originals = QUERY_STRING_EXAMPLES.into_iter().map(Uri::from_static);\n        let expecteds = ALL_VALUES_QUERY_STRING_EXAMPLES.into_iter().map(Uri::from_static);\n        for (original, expected) in originals.zip(expecteds) {\n            let output = Query::new(original.query().unwrap(), |_| QueryMarker {\n                key: false,\n                value: true,\n            })\n            .to_string();\n            assert_eq!(output, expected.query().unwrap(), \"original = {original}\");\n        }\n    }\n\n    #[test]\n    fn mark_all_pairs() {\n        let originals = QUERY_STRING_EXAMPLES.into_iter().map(Uri::from_static);\n        let expecteds = ALL_PAIRS_QUERY_STRING_EXAMPLES.into_iter().map(Uri::from_static);\n        for (original, expected) in originals.zip(expecteds) {\n            let output = Query::new(original.query().unwrap(), |_| QueryMarker { key: true, value: true }).to_string();\n            assert_eq!(output, expected.query().unwrap(), \"original = {original}\");\n        }\n    }\n\n    #[test]\n    fn mark_x() {\n        let originals = QUERY_STRING_EXAMPLES.into_iter().map(Uri::from_static);\n        let expecteds = X_QUERY_STRING_EXAMPLES.into_iter().map(Uri::from_static);\n        for (original, expected) in originals.zip(expecteds) {\n            let output = Query::new(original.query().unwrap(), |key| QueryMarker {\n                key: false,\n                value: key == \"x\",\n            })\n            .to_string();\n            assert_eq!(output, expected.query().unwrap(), \"original = {original}\");\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http-server/src/instrumentation/service.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! A [`Service`] and it's associated [`Future`] providing sensitivity aware logging.\n\nuse std::{\n    future::Future,\n    pin::Pin,\n    task::{Context, Poll},\n};\n\nuse futures_util::{ready, TryFuture};\nuse http::{HeaderMap, Request, Response, StatusCode, Uri};\nuse tower::Service;\nuse tracing::{debug, debug_span, instrument::Instrumented, Instrument};\n\nuse crate::shape_id::ShapeId;\n\nuse super::{MakeDebug, MakeDisplay, MakeIdentity};\n\npin_project_lite::pin_project! {\n    /// A [`Future`] responsible for logging the response status code and headers.\n    struct InnerFuture<Fut, ResponseMakeFmt> {\n        #[pin]\n        inner: Fut,\n        make: ResponseMakeFmt\n    }\n}\n\nimpl<Fut, ResponseMakeFmt, T> Future for InnerFuture<Fut, ResponseMakeFmt>\nwhere\n    Fut: TryFuture<Ok = Response<T>>,\n    Fut: Future<Output = Result<Fut::Ok, Fut::Error>>,\n\n    for<'a> ResponseMakeFmt: MakeDebug<&'a HeaderMap>,\n    for<'a> ResponseMakeFmt: MakeDisplay<StatusCode>,\n{\n    type Output = Fut::Output;\n\n    fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {\n        let this = self.project();\n        let response = ready!(this.inner.poll(cx))?;\n\n        {\n            let headers = this.make.make_debug(response.headers());\n            let status_code = this.make.make_display(response.status());\n            debug!(?headers, %status_code, \"response\");\n        }\n\n        Poll::Ready(Ok(response))\n    }\n}\n\n// This is to provide type erasure.\npin_project_lite::pin_project! {\n    /// An instrumented [`Future`] responsible for logging the response status code and headers.\n    pub struct InstrumentedFuture<Fut, ResponseMakeFmt> {\n        #[pin]\n        inner: Instrumented<InnerFuture<Fut, ResponseMakeFmt>>\n    }\n}\n\nimpl<Fut, ResponseMakeFmt, T> Future for InstrumentedFuture<Fut, ResponseMakeFmt>\nwhere\n    Fut: TryFuture<Ok = Response<T>>,\n    Fut: Future<Output = Result<Fut::Ok, Fut::Error>>,\n\n    for<'a> ResponseMakeFmt: MakeDebug<&'a HeaderMap>,\n    for<'a> ResponseMakeFmt: MakeDisplay<StatusCode>,\n{\n    type Output = Fut::Output;\n\n    fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {\n        self.project().inner.poll(cx)\n    }\n}\n\n/// A middleware [`Service`] responsible for:\n///   - Opening a [`tracing::debug_span`] for the lifetime of the request, which includes the operation name, the\n///     [`Uri`], and the request headers.\n///   - A [`tracing::debug`] during response, which includes the response status code and headers.\n///\n/// The [`Display`](std::fmt::Display) and [`Debug`] of the request and response components can be modified using\n/// [`request_fmt`](InstrumentOperation::request_fmt) and [`response_fmt`](InstrumentOperation::response_fmt).\n///\n/// # Example\n///\n/// ```\n/// # use aws_smithy_legacy_http_server::instrumentation::{sensitivity::{*, uri::*, headers::*}, *};\n/// # use aws_smithy_legacy_http_server::shape_id::ShapeId;\n/// # use tower::{Service, service_fn};\n/// # use http::{Request, Response};\n/// # async fn f(request: Request<()>) -> Result<Response<()>, ()> { Ok(Response::new(())) }\n/// # let mut svc = service_fn(f);\n/// # const ID: ShapeId = ShapeId::new(\"namespace#foo-operation\", \"namespace\", \"foo-operation\");\n/// let request_fmt = RequestFmt::new()\n///     .label(|index| index == 1, None)\n///     .query(|_| QueryMarker { key: false, value: true });\n/// let response_fmt = ResponseFmt::new().status_code();\n/// let mut svc = InstrumentOperation::new(svc, ID)\n///     .request_fmt(request_fmt)\n///     .response_fmt(response_fmt);\n/// # svc.call(Request::new(()));\n/// ```\n#[derive(Debug, Clone)]\npub struct InstrumentOperation<S, RequestMakeFmt = MakeIdentity, ResponseMakeFmt = MakeIdentity> {\n    inner: S,\n    operation_id: ShapeId,\n    make_request: RequestMakeFmt,\n    make_response: ResponseMakeFmt,\n}\n\nimpl<S> InstrumentOperation<S> {\n    /// Constructs a new [`InstrumentOperation`] with no data redacted.\n    pub fn new(inner: S, operation_id: ShapeId) -> Self {\n        Self {\n            inner,\n            operation_id,\n            make_request: MakeIdentity,\n            make_response: MakeIdentity,\n        }\n    }\n}\n\nimpl<S, RequestMakeFmt, ResponseMakeFmt> InstrumentOperation<S, RequestMakeFmt, ResponseMakeFmt> {\n    /// Configures the request format.\n    ///\n    /// The argument is typically [`RequestFmt`](super::sensitivity::RequestFmt).\n    pub fn request_fmt<R>(self, make_request: R) -> InstrumentOperation<S, R, ResponseMakeFmt> {\n        InstrumentOperation {\n            inner: self.inner,\n            operation_id: self.operation_id,\n            make_request,\n            make_response: self.make_response,\n        }\n    }\n\n    /// Configures the response format.\n    ///\n    /// The argument is typically [`ResponseFmt`](super::sensitivity::ResponseFmt).\n    pub fn response_fmt<R>(self, make_response: R) -> InstrumentOperation<S, RequestMakeFmt, R> {\n        InstrumentOperation {\n            inner: self.inner,\n            operation_id: self.operation_id,\n            make_request: self.make_request,\n            make_response,\n        }\n    }\n}\n\nimpl<S, U, V, RequestMakeFmt, ResponseMakeFmt> Service<Request<U>>\n    for InstrumentOperation<S, RequestMakeFmt, ResponseMakeFmt>\nwhere\n    S: Service<Request<U>, Response = Response<V>>,\n\n    for<'a> RequestMakeFmt: MakeDebug<&'a HeaderMap>,\n    for<'a> RequestMakeFmt: MakeDisplay<&'a Uri>,\n\n    ResponseMakeFmt: Clone,\n    for<'a> ResponseMakeFmt: MakeDebug<&'a HeaderMap>,\n    for<'a> ResponseMakeFmt: MakeDisplay<StatusCode>,\n{\n    type Response = S::Response;\n    type Error = S::Error;\n    type Future = InstrumentedFuture<S::Future, ResponseMakeFmt>;\n\n    fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {\n        self.inner.poll_ready(cx)\n    }\n\n    fn call(&mut self, request: Request<U>) -> Self::Future {\n        let span = {\n            let headers = self.make_request.make_debug(request.headers());\n            let uri = self.make_request.make_display(request.uri());\n            debug_span!(\"request\", operation = %self.operation_id.absolute(), method = %request.method(), %uri, ?headers)\n        };\n\n        InstrumentedFuture {\n            inner: InnerFuture {\n                inner: self.inner.call(request),\n                make: self.make_response.clone(),\n            }\n            .instrument(span),\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http-server/src/layer/alb_health_check.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Middleware for handling [ALB health\n//! checks](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/target-group-health-checks.html).\n//!\n//! # Example\n//!\n//! ```no_run\n//! use aws_smithy_legacy_http_server::layer::alb_health_check::AlbHealthCheckLayer;\n//! use hyper::StatusCode;\n//! use tower::Layer;\n//!\n//! // Handle all `/ping` health check requests by returning a `200 OK`.\n//! let ping_layer = AlbHealthCheckLayer::from_handler(\"/ping\", |_req| async {\n//!     StatusCode::OK\n//! });\n//! # async fn handle() { }\n//! let app = tower::service_fn(handle);\n//! let app = ping_layer.layer(app);\n//! ```\n\nuse std::borrow::Cow;\nuse std::convert::Infallible;\nuse std::task::{Context, Poll};\n\nuse futures_util::{Future, FutureExt};\nuse http::StatusCode;\nuse hyper::{Body, Request, Response};\nuse pin_project_lite::pin_project;\nuse tower::{service_fn, util::Oneshot, Layer, Service, ServiceExt};\n\nuse crate::body::BoxBody;\n\nuse crate::plugin::either::Either;\nuse crate::plugin::either::EitherProj;\n\n/// A [`tower::Layer`] used to apply [`AlbHealthCheckService`].\n#[derive(Clone, Debug)]\npub struct AlbHealthCheckLayer<HealthCheckHandler> {\n    health_check_uri: Cow<'static, str>,\n    health_check_handler: HealthCheckHandler,\n}\n\nimpl AlbHealthCheckLayer<()> {\n    /// Handle health check requests at `health_check_uri` with the specified handler.\n    pub fn from_handler<HandlerFuture: Future<Output = StatusCode>, H: Fn(Request<Body>) -> HandlerFuture + Clone>(\n        health_check_uri: impl Into<Cow<'static, str>>,\n        health_check_handler: H,\n    ) -> AlbHealthCheckLayer<\n        impl Service<\n                Request<Body>,\n                Response = StatusCode,\n                Error = Infallible,\n                Future = impl Future<Output = Result<StatusCode, Infallible>>,\n            > + Clone,\n    > {\n        let service = service_fn(move |req| health_check_handler(req).map(Ok));\n\n        AlbHealthCheckLayer::new(health_check_uri, service)\n    }\n\n    /// Handle health check requests at `health_check_uri` with the specified service.\n    pub fn new<H: Service<Request<Body>, Response = StatusCode>>(\n        health_check_uri: impl Into<Cow<'static, str>>,\n        health_check_handler: H,\n    ) -> AlbHealthCheckLayer<H> {\n        AlbHealthCheckLayer {\n            health_check_uri: health_check_uri.into(),\n            health_check_handler,\n        }\n    }\n}\n\nimpl<S, H: Clone> Layer<S> for AlbHealthCheckLayer<H> {\n    type Service = AlbHealthCheckService<H, S>;\n\n    fn layer(&self, inner: S) -> Self::Service {\n        AlbHealthCheckService {\n            inner,\n            layer: self.clone(),\n        }\n    }\n}\n\n/// A middleware [`Service`] responsible for handling health check requests.\n#[derive(Clone, Debug)]\npub struct AlbHealthCheckService<H, S> {\n    inner: S,\n    layer: AlbHealthCheckLayer<H>,\n}\n\nimpl<H, S> Service<Request<Body>> for AlbHealthCheckService<H, S>\nwhere\n    S: Service<Request<Body>, Response = Response<BoxBody>> + Clone,\n    S::Future: Send + 'static,\n    H: Service<Request<Body>, Response = StatusCode, Error = Infallible> + Clone,\n{\n    type Response = S::Response;\n    type Error = S::Error;\n    type Future = AlbHealthCheckFuture<H, S>;\n\n    fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {\n        // The check that the service is ready is done by `Oneshot` below.\n        Poll::Ready(Ok(()))\n    }\n\n    fn call(&mut self, req: Request<Body>) -> Self::Future {\n        if req.uri() == self.layer.health_check_uri.as_ref() {\n            let clone = self.layer.health_check_handler.clone();\n            let service = std::mem::replace(&mut self.layer.health_check_handler, clone);\n            let handler_future = service.oneshot(req);\n\n            AlbHealthCheckFuture::handler_future(handler_future)\n        } else {\n            let clone = self.inner.clone();\n            let service = std::mem::replace(&mut self.inner, clone);\n            let service_future = service.oneshot(req);\n\n            AlbHealthCheckFuture::service_future(service_future)\n        }\n    }\n}\n\ntype HealthCheckFutureInner<H, S> = Either<Oneshot<H, Request<Body>>, Oneshot<S, Request<Body>>>;\n\npin_project! {\n    /// Future for [`AlbHealthCheckService`].\n    pub struct AlbHealthCheckFuture<H: Service<Request<Body>, Response = StatusCode>, S: Service<Request<Body>>> {\n        #[pin]\n        inner: HealthCheckFutureInner<H, S>\n    }\n}\n\nimpl<H, S> AlbHealthCheckFuture<H, S>\nwhere\n    H: Service<Request<Body>, Response = StatusCode>,\n    S: Service<Request<Body>>,\n{\n    fn handler_future(handler_future: Oneshot<H, Request<Body>>) -> Self {\n        Self {\n            inner: Either::Left { value: handler_future },\n        }\n    }\n\n    fn service_future(service_future: Oneshot<S, Request<Body>>) -> Self {\n        Self {\n            inner: Either::Right { value: service_future },\n        }\n    }\n}\n\nimpl<H, S> Future for AlbHealthCheckFuture<H, S>\nwhere\n    H: Service<Request<Body>, Response = StatusCode, Error = Infallible>,\n    S: Service<Request<Body>, Response = Response<BoxBody>>,\n{\n    type Output = Result<S::Response, S::Error>;\n\n    fn poll(self: std::pin::Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {\n        let either_proj = self.project().inner.project();\n\n        match either_proj {\n            EitherProj::Left { value } => {\n                let polled: Poll<Self::Output> = value.poll(cx).map(|res| {\n                    res.map(|status_code| {\n                        Response::builder()\n                            .status(status_code)\n                            .body(crate::body::empty())\n                            .unwrap()\n                    })\n                    .map_err(|never| match never {})\n                });\n                polled\n            }\n            EitherProj::Right { value } => value.poll(cx),\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http-server/src/layer/mod.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! This module hosts [`Layer`](tower::Layer)s that are generally meant to be applied _around_ the\n//! [`Router`](crate::routing::Router), so they are enacted before a request is routed.\n\npub mod alb_health_check;\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http-server/src/lib.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/* Automatically managed default lints */\n#![cfg_attr(docsrs, feature(doc_cfg))]\n/* End of automatically managed default lints */\n#![allow(clippy::derive_partial_eq_without_eq)]\n\n//! HTTP server runtime and utilities, loosely based on [axum].\n//!\n//! [axum]: https://docs.rs/axum/latest/axum/\n#[macro_use]\npub(crate) mod macros;\n\npub mod body;\npub(crate) mod error;\npub mod extension;\npub mod instrumentation;\npub mod layer;\npub mod operation;\npub mod plugin;\n#[doc(hidden)]\npub mod protocol;\n#[doc(hidden)]\npub mod rejection;\npub mod request;\n#[doc(hidden)]\npub mod response;\npub mod routing;\n#[doc(hidden)]\npub mod runtime_error;\npub mod service;\npub mod shape_id;\n\n#[doc(inline)]\npub(crate) use self::error::Error;\n#[doc(inline)]\npub use self::request::extension::Extension;\n#[doc(inline)]\npub use tower_http::add_extension::{AddExtension, AddExtensionLayer};\n\n#[cfg(test)]\nmod test_helpers;\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http-server/src/macros.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n// This code was copied and then modified from Tokio's Axum.\n\n/* Copyright (c) 2021 Tower Contributors\n *\n * Permission is hereby granted, free of charge, to any\n * person obtaining a copy of this software and associated\n * documentation files (the \"Software\"), to deal in the\n * Software without restriction, including without\n * limitation the rights to use, copy, modify, merge,\n * publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software\n * is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice\n * shall be included in all copies or substantial portions\n * of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF\n * ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED\n * TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A\n * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT\n * SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR\n * IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\n * DEALINGS IN THE SOFTWARE.\n */\n\n//! Macros implementation.\n\n/// Define a type that implements [`std::future::Future`].\n#[doc(hidden)]\n#[macro_export]\nmacro_rules! opaque_future {\n    ($(#[$m:meta])* pub type $name:ident = $actual:ty;) => {\n        opaque_future! {\n            $(#[$m])*\n            #[allow(clippy::type_complexity)]\n            pub type $name<> = $actual;\n        }\n    };\n\n    ($(#[$m:meta])* pub type $name:ident<$($param:ident),*> = $actual:ty;) => {\n            pin_project_lite::pin_project! {\n                $(#[$m])*\n                pub struct $name<$($param),*> {\n                    #[pin] future: $actual,\n                }\n            }\n\n        impl<$($param),*> $name<$($param),*> {\n            pub(crate) fn new(future: $actual) -> Self {\n                Self { future }\n            }\n        }\n\n        impl<$($param),*> std::fmt::Debug for $name<$($param),*> {\n            fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n                f.debug_tuple(stringify!($name)).field(&format_args!(\"...\")).finish()\n            }\n        }\n\n        impl<$($param),*> std::future::Future for $name<$($param),*>\n        where\n            $actual: std::future::Future,\n        {\n            type Output = <$actual as std::future::Future>::Output;\n\n            #[inline]\n            fn poll(\n                self: std::pin::Pin<&mut Self>,\n                cx: &mut std::task::Context<'_>,\n            ) -> std::task::Poll<Self::Output> {\n                self.project().future.poll(cx)\n            }\n        }\n    };\n}\n\nmacro_rules! convert_to_request_rejection {\n    ($from:ty, $to:ident) => {\n        impl From<$from> for RequestRejection {\n            fn from(err: $from) -> Self {\n                Self::$to(crate::Error::new(err))\n            }\n        }\n    };\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http-server/src/operation/handler.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::{\n    convert::Infallible,\n    future::Future,\n    marker::PhantomData,\n    task::{Context, Poll},\n};\n\nuse futures_util::{future::Map, FutureExt};\nuse tower::Service;\n\nuse super::OperationShape;\n\n/// A utility trait used to provide an even interface for all operation handlers.\n///\n/// See [`operation`](crate::operation) documentation for more info.\npub trait Handler<Op, Exts>\nwhere\n    Op: OperationShape,\n{\n    type Future: Future<Output = Result<Op::Output, Op::Error>>;\n\n    fn call(&mut self, input: Op::Input, exts: Exts) -> Self::Future;\n}\n\n/// A utility trait used to provide an even interface over return types `Result<Ok, Error>`/`Ok`.\ntrait IntoResult<Ok, Error> {\n    fn into_result(self) -> Result<Ok, Error>;\n}\n\n// We can convert from `Result<Ok, Error>` to `Result<Ok, Error>`.\nimpl<Ok, Error> IntoResult<Ok, Error> for Result<Ok, Error> {\n    fn into_result(self) -> Result<Ok, Error> {\n        self\n    }\n}\n\n// We can convert from `T` to `Result<T, Infallible>`.\nimpl<Ok> IntoResult<Ok, Infallible> for Ok {\n    fn into_result(self) -> Result<Ok, Infallible> {\n        Ok(self)\n    }\n}\n\n// fn(Input) -> Output\nimpl<Op, F, Fut> Handler<Op, ()> for F\nwhere\n    Op: OperationShape,\n    F: Fn(Op::Input) -> Fut,\n    Fut: Future,\n    Fut::Output: IntoResult<Op::Output, Op::Error>,\n{\n    type Future = Map<Fut, fn(Fut::Output) -> Result<Op::Output, Op::Error>>;\n\n    fn call(&mut self, input: Op::Input, _exts: ()) -> Self::Future {\n        (self)(input).map(IntoResult::into_result)\n    }\n}\n\n// fn(Input, Ext_i) -> Output\nmacro_rules! impl_handler {\n    ($($var:ident),+) => (\n        impl<Op, F, Fut, $($var,)*> Handler<Op, ($($var,)*)> for F\n        where\n            Op: OperationShape,\n            F: Fn(Op::Input, $($var,)*) -> Fut,\n            Fut: Future,\n            Fut::Output: IntoResult<Op::Output, Op::Error>,\n        {\n            type Future = Map<Fut, fn(Fut::Output) -> Result<Op::Output, Op::Error>>;\n\n            fn call(&mut self, input: Op::Input, exts: ($($var,)*)) -> Self::Future {\n                #[allow(non_snake_case)]\n                let ($($var,)*) = exts;\n                (self)(input, $($var,)*).map(IntoResult::into_result)\n            }\n        }\n    )\n}\n\nimpl_handler!(Exts0);\nimpl_handler!(Exts0, Exts1);\nimpl_handler!(Exts0, Exts1, Exts2);\nimpl_handler!(Exts0, Exts1, Exts2, Exts3);\nimpl_handler!(Exts0, Exts1, Exts2, Exts3, Exts4);\nimpl_handler!(Exts0, Exts1, Exts2, Exts3, Exts4, Exts5);\nimpl_handler!(Exts0, Exts1, Exts2, Exts3, Exts4, Exts5, Exts6);\nimpl_handler!(Exts0, Exts1, Exts2, Exts3, Exts4, Exts5, Exts6, Exts7);\nimpl_handler!(Exts0, Exts1, Exts2, Exts3, Exts4, Exts5, Exts6, Exts7, Exts8);\n\n/// An extension trait for [`Handler`].\npub trait HandlerExt<Op, Exts>: Handler<Op, Exts>\nwhere\n    Op: OperationShape,\n{\n    /// Convert the [`Handler`] into a [`Service`].\n    fn into_service(self) -> IntoService<Op, Self>\n    where\n        Self: Sized,\n    {\n        IntoService {\n            handler: self,\n            _operation: PhantomData,\n        }\n    }\n}\n\nimpl<Op, Exts, H> HandlerExt<Op, Exts> for H\nwhere\n    Op: OperationShape,\n    H: Handler<Op, Exts>,\n{\n}\n\n/// A [`Service`] provided for every [`Handler`].\npub struct IntoService<Op, H> {\n    pub(crate) handler: H,\n    pub(crate) _operation: PhantomData<Op>,\n}\n\nimpl<Op, H> Clone for IntoService<Op, H>\nwhere\n    H: Clone,\n{\n    fn clone(&self) -> Self {\n        Self {\n            handler: self.handler.clone(),\n            _operation: PhantomData,\n        }\n    }\n}\n\nimpl<Op, Exts, H> Service<(Op::Input, Exts)> for IntoService<Op, H>\nwhere\n    Op: OperationShape,\n    H: Handler<Op, Exts>,\n{\n    type Response = Op::Output;\n    type Error = Op::Error;\n    type Future = H::Future;\n\n    fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {\n        Poll::Ready(Ok(()))\n    }\n\n    fn call(&mut self, (input, exts): (Op::Input, Exts)) -> Self::Future {\n        self.handler.call(input, exts)\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http-server/src/operation/mod.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! The shape of a [Smithy operation] is modelled by the [`OperationShape`] trait. Its associated types\n//! [`OperationShape::Input`], [`OperationShape::Output`], and [`OperationShape::Error`] map to the structures\n//! representing the Smithy inputs, outputs, and errors respectively. When an operation error is not specified\n//! [`OperationShape::Error`] is [`Infallible`](std::convert::Infallible).\n//!\n//! We generate a marker struct for each Smithy operation and implement [`OperationShape`] on them. This\n//! is used as a helper - providing static methods and parameterizing other traits.\n//!\n//! The model\n//!\n//! ```smithy\n//! operation GetShopping {\n//!    input: CartIdentifier,\n//!    output: ShoppingCart,\n//!    errors: [...]\n//! }\n//! ```\n//!\n//! is identified with the implementation\n//!\n//! ```rust,no_run\n//! # use aws_smithy_legacy_http_server::shape_id::ShapeId;\n//! # use aws_smithy_legacy_http_server::operation::OperationShape;\n//! # pub struct CartIdentifier;\n//! # pub struct ShoppingCart;\n//! # pub enum GetShoppingError {}\n//! pub struct GetShopping;\n//!\n//! impl OperationShape for GetShopping {\n//!     const ID: ShapeId = ShapeId::new(\"namespace#GetShopping\", \"namespace\", \"GetShopping\");\n//!\n//!     type Input = CartIdentifier;\n//!     type Output = ShoppingCart;\n//!     type Error = GetShoppingError;\n//! }\n//! ```\n//!\n//! The behavior of a Smithy operation is encoded by a [`Service`](tower::Service). The [`OperationShape`] types can\n//! be used to construct specific operations using [`OperationShapeExt::from_handler`] and\n//! [`OperationShapeExt::from_service`] methods. The [from_handler](OperationShapeExt::from_handler) constructor takes\n//! a [`Handler`] whereas the [from_service](OperationShapeExt::from_service) takes a [`OperationService`]. Both traits\n//! serve a similar purpose - they provide a common interface over a class of structures.\n//!\n//! ## [`Handler`]\n//!\n//! The [`Handler`] trait is implemented by all async functions which accept [`OperationShape::Input`] as their first\n//! argument, the remaining arguments implement [`FromParts`](crate::request::FromParts), and return either\n//! [`OperationShape::Output`] when [`OperationShape::Error`] is [`Infallible`](std::convert::Infallible) or\n//! [`Result`]<[`OperationShape::Output`],[`OperationShape::Error`]>. The following are examples of async functions which\n//! implement [`Handler`]:\n//!\n//! ```rust,no_run\n//! # use aws_smithy_legacy_http_server::Extension;\n//! # pub struct CartIdentifier;\n//! # pub struct ShoppingCart;\n//! # pub enum GetShoppingError {}\n//! # pub struct Context;\n//! # pub struct ExtraContext;\n//! // Simple handler where no error is modelled.\n//! async fn handler_a(input: CartIdentifier) -> ShoppingCart {\n//!     todo!()\n//! }\n//!\n//! // Handler with an extension where no error is modelled.\n//! async fn handler_b(input: CartIdentifier, ext: Extension<Context>) -> ShoppingCart {\n//!     todo!()\n//! }\n//!\n//! // More than one extension can be provided.\n//! async fn handler_c(input: CartIdentifier, ext_1: Extension<Context>, ext_2: Extension<ExtraContext>) -> ShoppingCart {\n//!     todo!()\n//! }\n//!\n//! // When an error is modelled we must return a `Result`.\n//! async fn handler_d(input: CartIdentifier, ext: Extension<Context>) -> Result<ShoppingCart, GetShoppingError> {\n//!     todo!()\n//! }\n//! ```\n//!\n//! ## [`OperationService`]\n//!\n//! Similarly, the [`OperationService`] trait is implemented by all `Service<(Op::Input, ...)>` with\n//! `Response = Op::Output`, and `Error = Op::Error`.\n//!\n//! The following are examples of [`Service`](tower::Service)s which implement [`OperationService`]:\n//!\n//! - `Service<CartIdentifier, Response = ShoppingCart, Error = Infallible>`.\n//! - `Service<(CartIdentifier, Extension<Context>), Response = ShoppingCart, Error = GetShoppingCartError>`.\n//! - `Service<(CartIdentifier, Extension<Context>, Extension<ExtraContext>), Response = ShoppingCart, Error = GetShoppingCartError)`.\n//!\n//! Notice the parallels between [`OperationService`] and [`Handler`].\n//!\n//! ## Constructing an Operation\n//!\n//! The following is an example of using both construction approaches:\n//!\n//! ```rust,no_run\n//! # use std::task::{Poll, Context};\n//! # use aws_smithy_legacy_http_server::operation::*;\n//! # use tower::Service;\n//! # use aws_smithy_legacy_http_server::shape_id::ShapeId;\n//! # pub struct CartIdentifier;\n//! # pub struct ShoppingCart;\n//! # pub enum GetShoppingError {}\n//! # pub struct GetShopping;\n//! # impl OperationShape for GetShopping {\n//! #    const ID: ShapeId = ShapeId::new(\"namespace#GetShopping\", \"namespace\", \"GetShopping\");\n//! #\n//! #    type Input = CartIdentifier;\n//! #    type Output = ShoppingCart;\n//! #    type Error = GetShoppingError;\n//! # }\n//! # type OpFuture = std::future::Ready<Result<ShoppingCart, GetShoppingError>>;\n//! // Construction of an `Operation` from a `Handler`.\n//!\n//! async fn op_handler(input: CartIdentifier) -> Result<ShoppingCart, GetShoppingError> {\n//!     todo!()\n//! }\n//!\n//! let operation = GetShopping::from_handler(op_handler);\n//!\n//! // Construction of an `Operation` from a `Service`.\n//!\n//! pub struct OpService;\n//!\n//! impl Service<CartIdentifier> for OpService {\n//!     type Response = ShoppingCart;\n//!     type Error = GetShoppingError;\n//!     type Future = OpFuture;\n//!\n//!     fn poll_ready(&mut self, cx: &mut Context) -> Poll<Result<(), Self::Error>> {\n//!         todo!()\n//!     }\n//!\n//!     fn call(&mut self, request: CartIdentifier) -> Self::Future {\n//!         todo!()\n//!     }\n//! }\n//!\n//! let operation = GetShopping::from_service(OpService);\n//!\n//! ```\n//!\n//! ## Upgrading Smithy services to HTTP services\n//!\n//! Both [`Handler`] and [`OperationService`] accept and return Smithy model structures. They are converted to a\n//! canonical form `Service<(Op::Input, Exts), Response = Op::Output, Error = Op::Error>`. The\n//! [`UpgradePlugin`] acts upon such services by converting them to\n//! `Service<http::Request, Response = http::Response, Error = Infallible>` by applying serialization/deserialization\n//! and validation specified by the Smithy contract.\n//!\n//!\n//! The [`UpgradePlugin`], being a [`Plugin`](crate::plugin::Plugin), is parameterized by a protocol. This allows for\n//! upgrading to `Service<http::Request, Response = http::Response, Error = Infallible>` to be protocol dependent.\n//!\n//! [Smithy operation]: https://smithy.io/2.0/spec/service-types.html#operation\n\nmod handler;\nmod operation_service;\nmod shape;\nmod upgrade;\n\npub use handler::*;\npub use operation_service::*;\npub use shape::*;\npub use upgrade::*;\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http-server/src/operation/operation_service.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::{\n    marker::PhantomData,\n    task::{Context, Poll},\n};\n\nuse tower::Service;\n\nuse super::OperationShape;\n\n/// A utility trait used to provide an even interface for all operation services.\n///\n/// This serves to take [`Service`]s of the form `Service<(Op::Input, Ext0, Ext1, ...)>` to the canonical\n/// representation of `Service<(Input, (Ext0, Ext1, ...))>` inline with\n/// [`IntoService`](super::IntoService).\n///\n/// See [`operation`](crate::operation) documentation for more info.\npub trait OperationService<Op, Exts>: Service<Self::Normalized, Response = Op::Output, Error = Op::Error>\nwhere\n    Op: OperationShape,\n{\n    type Normalized;\n\n    // Normalize the request type.\n    fn normalize(input: Op::Input, exts: Exts) -> Self::Normalized;\n}\n\n// `Service<Op::Input>`\nimpl<Op, S> OperationService<Op, ()> for S\nwhere\n    Op: OperationShape,\n    S: Service<Op::Input, Response = Op::Output, Error = Op::Error>,\n{\n    type Normalized = Op::Input;\n\n    fn normalize(input: Op::Input, _exts: ()) -> Self::Normalized {\n        input\n    }\n}\n\n// `Service<(Op::Input, Ext0)>`\nimpl<Op, Ext0, S> OperationService<Op, (Ext0,)> for S\nwhere\n    Op: OperationShape,\n    S: Service<(Op::Input, Ext0), Response = Op::Output, Error = Op::Error>,\n{\n    type Normalized = (Op::Input, Ext0);\n\n    fn normalize(input: Op::Input, exts: (Ext0,)) -> Self::Normalized {\n        (input, exts.0)\n    }\n}\n\n// `Service<(Op::Input, Ext0, Ext1)>`\nimpl<Op, Ext0, Ext1, S> OperationService<Op, (Ext0, Ext1)> for S\nwhere\n    Op: OperationShape,\n    S: Service<(Op::Input, Ext0, Ext1), Response = Op::Output, Error = Op::Error>,\n{\n    type Normalized = (Op::Input, Ext0, Ext1);\n\n    fn normalize(input: Op::Input, exts: (Ext0, Ext1)) -> Self::Normalized {\n        (input, exts.0, exts.1)\n    }\n}\n\n/// An extension trait of [`OperationService`].\npub trait OperationServiceExt<Op, Exts>: OperationService<Op, Exts>\nwhere\n    Op: OperationShape,\n{\n    /// Convert the [`OperationService`] into a canonicalized [`Service`].\n    fn normalize(self) -> Normalize<Op, Self>\n    where\n        Self: Sized,\n    {\n        Normalize {\n            inner: self,\n            _operation: PhantomData,\n        }\n    }\n}\n\nimpl<F, Op, Exts> OperationServiceExt<Op, Exts> for F\nwhere\n    Op: OperationShape,\n    F: OperationService<Op, Exts>,\n{\n}\n\n/// A [`Service`] normalizing the request type of a [`OperationService`].\n#[derive(Debug)]\npub struct Normalize<Op, S> {\n    pub(crate) inner: S,\n    pub(crate) _operation: PhantomData<Op>,\n}\n\nimpl<Op, S> Clone for Normalize<Op, S>\nwhere\n    S: Clone,\n{\n    fn clone(&self) -> Self {\n        Self {\n            inner: self.inner.clone(),\n            _operation: PhantomData,\n        }\n    }\n}\n\nimpl<Op, S, Exts> Service<(Op::Input, Exts)> for Normalize<Op, S>\nwhere\n    Op: OperationShape,\n    S: OperationService<Op, Exts>,\n{\n    type Response = S::Response;\n    type Error = S::Error;\n    type Future = <S as Service<S::Normalized>>::Future;\n\n    fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {\n        self.inner.poll_ready(cx)\n    }\n\n    fn call(&mut self, (input, exts): (Op::Input, Exts)) -> Self::Future {\n        let req = S::normalize(input, exts);\n        self.inner.call(req)\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http-server/src/operation/shape.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::marker::PhantomData;\n\nuse super::{Handler, IntoService, Normalize, OperationService};\nuse crate::shape_id::ShapeId;\n\n/// Models the [Smithy Operation shape].\n///\n/// [Smithy Operation shape]: https://smithy.io/2.0/spec/service-types.html#operation\npub trait OperationShape {\n    /// The ID of the operation.\n    const ID: ShapeId;\n\n    /// The operation input.\n    type Input;\n    /// The operation output.\n    type Output;\n    /// The operation error. [`Infallible`](std::convert::Infallible) in the case where no error\n    /// exists.\n    type Error;\n}\n\n/// An extension trait over [`OperationShape`].\npub trait OperationShapeExt: OperationShape {\n    /// Creates a new [`Service`](tower::Service), [`IntoService`], for well-formed [`Handler`]s.\n    fn from_handler<H, Exts>(handler: H) -> IntoService<Self, H>\n    where\n        H: Handler<Self, Exts>,\n        Self: Sized,\n    {\n        IntoService {\n            handler,\n            _operation: PhantomData,\n        }\n    }\n\n    /// Creates a new normalized [`Service`](tower::Service), [`Normalize`], for well-formed\n    /// [`Service`](tower::Service)s.\n    fn from_service<S, Exts>(svc: S) -> Normalize<Self, S>\n    where\n        S: OperationService<Self, Exts>,\n        Self: Sized,\n    {\n        Normalize {\n            inner: svc,\n            _operation: PhantomData,\n        }\n    }\n}\n\nimpl<S> OperationShapeExt for S where S: OperationShape {}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http-server/src/operation/upgrade.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::{\n    convert::Infallible,\n    future::{Future, Ready},\n    marker::PhantomData,\n    pin::Pin,\n    task::{Context, Poll},\n};\n\nuse futures_util::ready;\nuse pin_project_lite::pin_project;\nuse tower::{util::Oneshot, Service, ServiceExt};\nuse tracing::error;\n\nuse crate::{\n    body::BoxBody, plugin::Plugin, request::FromRequest, response::IntoResponse,\n    runtime_error::InternalFailureException, service::ServiceShape,\n};\n\nuse super::OperationShape;\n\n/// A [`Plugin`] responsible for taking an operation [`Service`], accepting and returning Smithy\n/// types and converting it into a [`Service`] taking and returning [`http`] types.\n///\n/// See [`Upgrade`].\n#[derive(Debug, Clone)]\npub struct UpgradePlugin<Extractors> {\n    _extractors: PhantomData<Extractors>,\n}\n\nimpl<Extractors> Default for UpgradePlugin<Extractors> {\n    fn default() -> Self {\n        Self {\n            _extractors: PhantomData,\n        }\n    }\n}\n\nimpl<Extractors> UpgradePlugin<Extractors> {\n    /// Creates a new [`UpgradePlugin`].\n    pub fn new() -> Self {\n        Self::default()\n    }\n}\n\nimpl<Ser, Op, T, Extractors> Plugin<Ser, Op, T> for UpgradePlugin<Extractors>\nwhere\n    Ser: ServiceShape,\n    Op: OperationShape,\n{\n    type Output = Upgrade<Ser::Protocol, (Op::Input, Extractors), T>;\n\n    fn apply(&self, inner: T) -> Self::Output {\n        Upgrade {\n            _protocol: PhantomData,\n            _input: PhantomData,\n            inner,\n        }\n    }\n}\n\n/// A [`Service`] responsible for wrapping an operation [`Service`] accepting and returning Smithy\n/// types, and converting it into a [`Service`] accepting and returning [`http`] types.\npub struct Upgrade<Protocol, Input, S> {\n    _protocol: PhantomData<Protocol>,\n    _input: PhantomData<Input>,\n    inner: S,\n}\n\nimpl<P, Input, S> Clone for Upgrade<P, Input, S>\nwhere\n    S: Clone,\n{\n    fn clone(&self) -> Self {\n        Self {\n            _protocol: PhantomData,\n            _input: PhantomData,\n            inner: self.inner.clone(),\n        }\n    }\n}\n\npin_project! {\n    #[project = InnerProj]\n    #[project_replace = InnerProjReplace]\n    enum Inner<FromFut, HandlerFut> {\n        FromRequest {\n            #[pin]\n            inner: FromFut\n        },\n        Inner {\n            #[pin]\n            call: HandlerFut\n        }\n    }\n}\n\ntype InnerAlias<Input, Protocol, B, S> = Inner<<Input as FromRequest<Protocol, B>>::Future, Oneshot<S, Input>>;\n\npin_project! {\n    /// The [`Service::Future`] of [`Upgrade`].\n    pub struct UpgradeFuture<Protocol, Input, B, S>\n    where\n        Input: FromRequest<Protocol, B>,\n        S: Service<Input>,\n    {\n        service: Option<S>,\n        #[pin]\n        inner: InnerAlias<Input, Protocol, B, S>\n    }\n}\n\nimpl<P, Input, B, S> Future for UpgradeFuture<P, Input, B, S>\nwhere\n    Input: FromRequest<P, B>,\n    <Input as FromRequest<P, B>>::Rejection: std::fmt::Display,\n    S: Service<Input>,\n    S::Response: IntoResponse<P>,\n    S::Error: IntoResponse<P>,\n{\n    type Output = Result<http::Response<crate::body::BoxBody>, Infallible>;\n\n    fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {\n        loop {\n            let mut this = self.as_mut().project();\n            let this2 = this.inner.as_mut().project();\n\n            let call = match this2 {\n                InnerProj::FromRequest { inner } => {\n                    let result = ready!(inner.poll(cx));\n                    match result {\n                        Ok(ok) => this\n                            .service\n                            .take()\n                            .expect(\"futures cannot be polled after completion\")\n                            .oneshot(ok),\n                        Err(err) => {\n                            // The error may arise either from a `FromRequest` failure for any user-defined\n                            // handler's additional input parameters, or from a de-serialization failure\n                            // of an input parameter specific to the operation.\n                            tracing::trace!(error = %err, \"parameter for the handler cannot be constructed\");\n                            return Poll::Ready(Ok(err.into_response()));\n                        }\n                    }\n                }\n                InnerProj::Inner { call } => {\n                    let result = ready!(call.poll(cx));\n                    let output = match result {\n                        Ok(ok) => ok.into_response(),\n                        Err(err) => err.into_response(),\n                    };\n                    return Poll::Ready(Ok(output));\n                }\n            };\n\n            this.inner.as_mut().project_replace(Inner::Inner { call });\n        }\n    }\n}\n\nimpl<P, Input, B, S> Service<http::Request<B>> for Upgrade<P, Input, S>\nwhere\n    Input: FromRequest<P, B>,\n    <Input as FromRequest<P, B>>::Rejection: std::fmt::Display,\n    S: Service<Input> + Clone,\n    S::Response: IntoResponse<P>,\n    S::Error: IntoResponse<P>,\n{\n    type Response = http::Response<crate::body::BoxBody>;\n    type Error = Infallible;\n    type Future = UpgradeFuture<P, Input, B, S>;\n\n    fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {\n        // The check that the inner service is ready is done by `Oneshot` in `UpgradeFuture`'s\n        // implementation.\n        Poll::Ready(Ok(()))\n    }\n\n    fn call(&mut self, req: http::Request<B>) -> Self::Future {\n        let clone = self.inner.clone();\n        let service = std::mem::replace(&mut self.inner, clone);\n        UpgradeFuture {\n            service: Some(service),\n            inner: Inner::FromRequest {\n                inner: <Input as FromRequest<P, B>>::from_request(req),\n            },\n        }\n    }\n}\n\n/// A [`Service`] which always returns an internal failure message and logs an error.\n#[derive(Copy)]\npub struct MissingFailure<P> {\n    _protocol: PhantomData<fn(P)>,\n}\n\nimpl<P> Default for MissingFailure<P> {\n    fn default() -> Self {\n        Self { _protocol: PhantomData }\n    }\n}\n\nimpl<P> Clone for MissingFailure<P> {\n    fn clone(&self) -> Self {\n        MissingFailure { _protocol: PhantomData }\n    }\n}\n\nimpl<R, P> Service<R> for MissingFailure<P>\nwhere\n    InternalFailureException: IntoResponse<P>,\n{\n    type Response = http::Response<BoxBody>;\n    type Error = Infallible;\n    type Future = Ready<Result<Self::Response, Self::Error>>;\n\n    fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {\n        Poll::Ready(Ok(()))\n    }\n\n    fn call(&mut self, _request: R) -> Self::Future {\n        error!(\"the operation has not been set\");\n        std::future::ready(Ok(InternalFailureException.into_response()))\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http-server/src/plugin/closure.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::service::ContainsOperation;\n\nuse super::Plugin;\n\n/// An adapter to convert a `Fn(ShapeId, T) -> Service` closure into a [`Plugin`]. See [`plugin_from_operation_fn`] for more details.\npub struct OperationFn<F> {\n    f: F,\n}\n\nimpl<Ser, Op, T, NewService, F> Plugin<Ser, Op, T> for OperationFn<F>\nwhere\n    Ser: ContainsOperation<Op>,\n    F: Fn(Ser::Operations, T) -> NewService,\n{\n    type Output = NewService;\n\n    fn apply(&self, input: T) -> Self::Output {\n        (self.f)(Ser::VALUE, input)\n    }\n}\n\n/// Constructs a [`Plugin`] using a closure over the [`ServiceShape::] `F: Fn(ShapeId, T) -> Service`.\n///\n/// # Example\n///\n/// ```rust\n/// # use aws_smithy_legacy_http_server::{service::*, operation::OperationShape, plugin::Plugin, shape_id::ShapeId};\n/// # pub enum Operation { CheckHealth, GetPokemonSpecies }\n/// # impl Operation { fn shape_id(&self) -> ShapeId { ShapeId::new(\"\", \"\", \"\") }}\n/// # pub struct CheckHealth;\n/// # pub struct GetPokemonSpecies;\n/// # pub struct PokemonService;\n/// # impl ServiceShape for PokemonService {\n/// #   const ID: ShapeId = ShapeId::new(\"\", \"\", \"\");\n/// #   const VERSION: Option<&'static str> = None;\n/// #   type Protocol = ();\n/// #   type Operations = Operation;\n/// # }\n/// # impl OperationShape for CheckHealth { const ID: ShapeId = ShapeId::new(\"\", \"\", \"\"); type Input = (); type Output = (); type Error = (); }\n/// # impl OperationShape for GetPokemonSpecies { const ID: ShapeId = ShapeId::new(\"\", \"\", \"\"); type Input = (); type Output = (); type Error = (); }\n/// # impl ContainsOperation<CheckHealth> for PokemonService { const VALUE: Operation = Operation::CheckHealth; }\n/// # impl ContainsOperation<GetPokemonSpecies> for PokemonService { const VALUE: Operation = Operation::GetPokemonSpecies; }\n/// use aws_smithy_legacy_http_server::plugin::plugin_from_operation_fn;\n/// use tower::layer::layer_fn;\n///\n/// struct FooService<S> {\n///     info: String,\n///     inner: S\n/// }\n///\n/// fn map<S>(op: Operation, inner: S) -> FooService<S> {\n///     match op {\n///         Operation::CheckHealth => FooService { info: op.shape_id().name().to_string(), inner },\n///         Operation::GetPokemonSpecies => FooService { info: \"bar\".to_string(), inner },\n///         _ => todo!()\n///     }\n/// }\n///\n/// // This plugin applies the `FooService` middleware around every operation.\n/// let plugin = plugin_from_operation_fn(map);\n/// # let _ = Plugin::<PokemonService, CheckHealth, ()>::apply(&plugin, ());\n/// # let _ = Plugin::<PokemonService, GetPokemonSpecies, ()>::apply(&plugin, ());\n/// ```\npub fn plugin_from_operation_fn<F>(f: F) -> OperationFn<F> {\n    OperationFn { f }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http-server/src/plugin/either.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Contains the [`Either`] enum.\n\nuse pin_project_lite::pin_project;\nuse std::{\n    future::Future,\n    pin::Pin,\n    task::{Context, Poll},\n};\nuse tower::{Layer, Service};\n\nuse super::Plugin;\n\n// TODO(https://github.com/smithy-lang/smithy-rs/pull/2441#pullrequestreview-1331345692): Seems like\n// this type should land in `tower-0.5`.\npin_project! {\n    /// Combine two different [`Futures`](std::future::Future)/[`Services`](tower::Service)/\n    /// [`Layers`](tower::Layer)/[`Plugins`](super::Plugin) into a single type.\n    ///\n    /// # Notes on [`Future`](std::future::Future)\n    ///\n    /// The [`Future::Output`] must be identical.\n    ///\n    /// # Notes on [`Service`](tower::Service)\n    ///\n    /// The [`Service::Response`] and [`Service::Error`] must be identical.\n    #[derive(Clone, Debug)]\n    #[project = EitherProj]\n    pub enum Either<L, R> {\n        /// One type of backing [`Service`].\n        Left { #[pin] value: L },\n        /// The other type of backing [`Service`].\n        Right { #[pin] value: R },\n    }\n}\n\nimpl<L, R> Future for Either<L, R>\nwhere\n    L: Future,\n    R: Future<Output = L::Output>,\n{\n    type Output = L::Output;\n\n    fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {\n        match self.project() {\n            EitherProj::Left { value } => value.poll(cx),\n            EitherProj::Right { value } => value.poll(cx),\n        }\n    }\n}\n\nimpl<L, R, Request> Service<Request> for Either<L, R>\nwhere\n    L: Service<Request>,\n    R: Service<Request, Response = L::Response, Error = L::Error>,\n{\n    type Response = L::Response;\n    type Error = L::Error;\n    type Future = Either<L::Future, R::Future>;\n\n    fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {\n        use self::Either::*;\n\n        match self {\n            Left { value } => value.poll_ready(cx),\n            Right { value } => value.poll_ready(cx),\n        }\n    }\n\n    fn call(&mut self, request: Request) -> Self::Future {\n        use self::Either::*;\n\n        match self {\n            Left { value } => Either::Left {\n                value: value.call(request),\n            },\n            Right { value } => Either::Right {\n                value: value.call(request),\n            },\n        }\n    }\n}\n\nimpl<S, L, R> Layer<S> for Either<L, R>\nwhere\n    L: Layer<S>,\n    R: Layer<S>,\n{\n    type Service = Either<L::Service, R::Service>;\n\n    fn layer(&self, inner: S) -> Self::Service {\n        match self {\n            Either::Left { value } => Either::Left {\n                value: value.layer(inner),\n            },\n            Either::Right { value } => Either::Right {\n                value: value.layer(inner),\n            },\n        }\n    }\n}\n\nimpl<Ser, Op, T, Le, Ri> Plugin<Ser, Op, T> for Either<Le, Ri>\nwhere\n    Le: Plugin<Ser, Op, T>,\n    Ri: Plugin<Ser, Op, T>,\n{\n    type Output = Either<Le::Output, Ri::Output>;\n\n    fn apply(&self, input: T) -> Self::Output {\n        match self {\n            Either::Left { value } => Either::Left {\n                value: value.apply(input),\n            },\n            Either::Right { value } => Either::Right {\n                value: value.apply(input),\n            },\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http-server/src/plugin/filter.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse super::{either::Either, IdentityPlugin, ModelMarker};\n\nuse crate::operation::OperationShape;\nuse crate::service::ContainsOperation;\n\nuse super::{HttpMarker, Plugin};\n\n/// Filters the application of an inner [`Plugin`] using a predicate over the\n/// [`ServiceShape::Operations`](crate::service::ServiceShape::Operations).\n///\n/// This contrasts with [`Scoped`](crate::plugin::Scoped) which can be used to selectively apply a [`Plugin`] to a\n/// subset of operations at _compile time_.\n///\n/// See [`filter_by_operation`] for more details.\npub struct FilterByOperation<Inner, F> {\n    inner: Inner,\n    predicate: F,\n}\n\nimpl<Ser, Op, T, Inner, F> Plugin<Ser, Op, T> for FilterByOperation<Inner, F>\nwhere\n    Ser: ContainsOperation<Op>,\n    F: Fn(Ser::Operations) -> bool,\n    Inner: Plugin<Ser, Op, T>,\n    Op: OperationShape,\n{\n    type Output = Either<Inner::Output, T>;\n\n    fn apply(&self, input: T) -> Self::Output {\n        let either_plugin = if (self.predicate)(<Ser as ContainsOperation<Op>>::VALUE) {\n            Either::Left { value: &self.inner }\n        } else {\n            Either::Right { value: IdentityPlugin }\n        };\n        either_plugin.apply(input)\n    }\n}\n\nimpl<Inner, F> HttpMarker for FilterByOperation<Inner, F> where Inner: HttpMarker {}\nimpl<Inner, F> ModelMarker for FilterByOperation<Inner, F> where Inner: ModelMarker {}\n\n/// Filters the application of an inner [`Plugin`] using a predicate over the\n/// [`ServiceShape::Operations`](crate::service::ServiceShape::Operations).\n///\n/// Users should prefer [`Scoped`](crate::plugin::Scoped) and fallback to [`filter_by_operation`]\n/// in cases where [`Plugin`] application must be decided at runtime.\n///\n/// # Example\n///\n/// ```rust\n/// use aws_smithy_legacy_http_server::plugin::filter_by_operation;\n/// # use aws_smithy_legacy_http_server::{plugin::Plugin, operation::OperationShape, shape_id::ShapeId, service::{ServiceShape, ContainsOperation}};\n/// # struct Pl;\n/// # struct PokemonService;\n/// # #[derive(PartialEq, Eq)]\n/// # enum Operation { CheckHealth }\n/// # impl ServiceShape for PokemonService { const VERSION: Option<&'static str> = None; const ID: ShapeId = ShapeId::new(\"\", \"\", \"\"); type Operations = Operation; type Protocol = (); }\n/// # impl ContainsOperation<CheckHealth> for PokemonService { const VALUE: Operation = Operation::CheckHealth; }\n/// # struct CheckHealth;\n/// # impl OperationShape for CheckHealth { const ID: ShapeId = ShapeId::new(\"\", \"\", \"\"); type Input = (); type Output = (); type Error = (); }\n/// # impl Plugin<PokemonService, CheckHealth, ()> for Pl { type Output = (); fn apply(&self, input: ()) -> Self::Output { input }}\n/// # let plugin = Pl;\n/// # let svc = ();\n/// // Prevents `plugin` from being applied to the `CheckHealth` operation.\n/// let filtered_plugin = filter_by_operation(plugin, |name| name != Operation::CheckHealth);\n/// let new_operation = filtered_plugin.apply(svc);\n/// ```\npub fn filter_by_operation<Inner, F>(plugins: Inner, predicate: F) -> FilterByOperation<Inner, F> {\n    FilterByOperation {\n        inner: plugins,\n        predicate,\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http-server/src/plugin/http_plugins.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n// If you make any updates to this file (including Rust docs), make sure you make them to\n// `model_plugins.rs` too!\n\nuse crate::plugin::{IdentityPlugin, Plugin, PluginStack};\n\nuse super::{HttpMarker, LayerPlugin};\n\n/// A wrapper struct for composing HTTP plugins.\n///\n/// ## Applying plugins in a sequence\n///\n/// You can use the [`push`](HttpPlugins::push) method to apply a new HTTP plugin after the ones that\n/// have already been registered.\n///\n/// ```rust\n/// use aws_smithy_legacy_http_server::plugin::HttpPlugins;\n/// # use aws_smithy_legacy_http_server::plugin::IdentityPlugin as LoggingPlugin;\n/// # use aws_smithy_legacy_http_server::plugin::IdentityPlugin as MetricsPlugin;\n///\n/// let http_plugins = HttpPlugins::new().push(LoggingPlugin).push(MetricsPlugin);\n/// ```\n///\n/// The plugins' runtime logic is executed in registration order.\n/// In our example above, `LoggingPlugin` would run first, while `MetricsPlugin` is executed last.\n///\n/// ## Wrapping the current plugin pipeline\n///\n/// From time to time, you might have a need to transform the entire pipeline that has been built\n/// so far - e.g. you only want to apply those plugins for a specific operation.\n///\n/// `HttpPlugins` is itself a [`Plugin`]: you can apply any transformation that expects a\n/// [`Plugin`] to an entire pipeline. In this case, we could use a [scoped\n/// plugin](crate::plugin::Scoped) to limit the scope of the logging and metrics plugins to the\n/// `CheckHealth` operation:\n///\n/// ```rust\n/// use aws_smithy_legacy_http_server::scope;\n/// use aws_smithy_legacy_http_server::plugin::{HttpPlugins, Scoped};\n/// # use aws_smithy_legacy_http_server::plugin::IdentityPlugin as LoggingPlugin;\n/// # use aws_smithy_legacy_http_server::plugin::IdentityPlugin as MetricsPlugin;\n/// # use aws_smithy_legacy_http_server::plugin::IdentityPlugin as AuthPlugin;\n/// use aws_smithy_legacy_http_server::shape_id::ShapeId;\n/// # #[derive(PartialEq)]\n/// # enum Operation { CheckHealth }\n/// # struct CheckHealth;\n/// # impl CheckHealth { const ID: ShapeId = ShapeId::new(\"namespace#MyName\", \"namespace\", \"MyName\"); }\n///\n/// // The logging and metrics plugins will only be applied to the `CheckHealth` operation.\n/// let plugin = HttpPlugins::new()\n///     .push(LoggingPlugin)\n///     .push(MetricsPlugin);\n///\n/// scope! {\n///     struct OnlyCheckHealth {\n///         includes: [CheckHealth],\n///         excludes: [/* The rest of the operations go here */]\n///     }\n/// }\n///\n/// let filtered_plugin = Scoped::new::<OnlyCheckHealth>(&plugin);\n/// let http_plugins = HttpPlugins::new()\n///     .push(filtered_plugin)\n///     // The auth plugin will be applied to all operations.\n///     .push(AuthPlugin);\n/// ```\n///\n/// ## Concatenating two collections of HTTP plugins\n///\n/// `HttpPlugins` is a good way to bundle together multiple plugins, ensuring they are all\n/// registered in the correct order.\n///\n/// Since `HttpPlugins` is itself a HTTP plugin (it implements the `HttpMarker` trait), you can use\n/// the [`push`](HttpPlugins::push) to append, at once, all the HTTP plugins in another\n/// `HttpPlugins` to the current `HttpPlugins`:\n///\n/// ```rust\n/// use aws_smithy_legacy_http_server::plugin::{IdentityPlugin, HttpPlugins, PluginStack};\n/// # use aws_smithy_legacy_http_server::plugin::IdentityPlugin as LoggingPlugin;\n/// # use aws_smithy_legacy_http_server::plugin::IdentityPlugin as MetricsPlugin;\n/// # use aws_smithy_legacy_http_server::plugin::IdentityPlugin as AuthPlugin;\n///\n/// pub fn get_bundled_http_plugins() -> HttpPlugins<PluginStack<MetricsPlugin, PluginStack<LoggingPlugin, IdentityPlugin>>> {\n///     HttpPlugins::new().push(LoggingPlugin).push(MetricsPlugin)\n/// }\n///\n/// let http_plugins = HttpPlugins::new()\n///     .push(AuthPlugin)\n///     .push(get_bundled_http_plugins());\n/// ```\n///\n/// ## Providing custom methods on `HttpPlugins`\n///\n/// You use an **extension trait** to add custom methods on `HttpPlugins`.\n///\n/// This is a simple example using `AuthPlugin`:\n///\n/// ```rust\n/// use aws_smithy_legacy_http_server::plugin::{HttpPlugins, PluginStack};\n/// # use aws_smithy_legacy_http_server::plugin::IdentityPlugin as LoggingPlugin;\n/// # use aws_smithy_legacy_http_server::plugin::IdentityPlugin as AuthPlugin;\n///\n/// pub trait AuthPluginExt<CurrentPlugins> {\n///     fn with_auth(self) -> HttpPlugins<PluginStack<AuthPlugin, CurrentPlugins>>;\n/// }\n///\n/// impl<CurrentPlugins> AuthPluginExt<CurrentPlugins> for HttpPlugins<CurrentPlugins> {\n///     fn with_auth(self) -> HttpPlugins<PluginStack<AuthPlugin, CurrentPlugins>> {\n///         self.push(AuthPlugin)\n///     }\n/// }\n///\n/// let http_plugins = HttpPlugins::new()\n///     .push(LoggingPlugin)\n///     // Our custom method!\n///     .with_auth();\n/// ```\n#[derive(Debug)]\npub struct HttpPlugins<P>(pub(crate) P);\n\nimpl Default for HttpPlugins<IdentityPlugin> {\n    fn default() -> Self {\n        Self(IdentityPlugin)\n    }\n}\n\nimpl HttpPlugins<IdentityPlugin> {\n    /// Create an empty [`HttpPlugins`].\n    ///\n    /// You can use [`HttpPlugins::push`] to add plugins to it.\n    pub fn new() -> Self {\n        Self::default()\n    }\n}\n\nimpl<P> HttpPlugins<P> {\n    /// Apply a new HTTP plugin after the ones that have already been registered.\n    ///\n    /// ```rust\n    /// use aws_smithy_legacy_http_server::plugin::HttpPlugins;\n    /// # use aws_smithy_legacy_http_server::plugin::IdentityPlugin as LoggingPlugin;\n    /// # use aws_smithy_legacy_http_server::plugin::IdentityPlugin as MetricsPlugin;\n    ///\n    /// let http_plugins = HttpPlugins::new().push(LoggingPlugin).push(MetricsPlugin);\n    /// ```\n    ///\n    /// The plugins' runtime logic is executed in registration order.\n    /// In our example above, `LoggingPlugin` would run first, while `MetricsPlugin` is executed last.\n    ///\n    /// ## Implementation notes\n    ///\n    /// Plugins are applied to the underlying [`Service`](tower::Service) in opposite order compared\n    /// to their registration order.\n    ///\n    /// As an example:\n    ///\n    /// ```rust,compile_fail\n    /// #[derive(Debug)]\n    /// pub struct PrintPlugin;\n    ///\n    /// impl<Ser, Op, S> Plugin<Ser, Op, T> for PrintPlugin\n    /// // [...]\n    /// {\n    ///     // [...]\n    ///     fn apply(&self, inner: T) -> Self::Service {\n    ///         PrintService {\n    ///             inner,\n    ///             service_id: Ser::ID,\n    ///             operation_id: Op::ID\n    ///         }\n    ///     }\n    /// }\n    /// ```\n    // We eagerly require `NewPlugin: HttpMarker`, despite not really needing it, because compiler\n    // errors get _substantially_ better if the user makes a mistake.\n    pub fn push<NewPlugin: HttpMarker>(self, new_plugin: NewPlugin) -> HttpPlugins<PluginStack<NewPlugin, P>> {\n        HttpPlugins(PluginStack::new(new_plugin, self.0))\n    }\n\n    /// Applies a single [`tower::Layer`] to all operations _before_ they are deserialized.\n    pub fn layer<L>(self, layer: L) -> HttpPlugins<PluginStack<LayerPlugin<L>, P>> {\n        HttpPlugins(PluginStack::new(LayerPlugin(layer), self.0))\n    }\n}\n\nimpl<Ser, Op, T, InnerPlugin> Plugin<Ser, Op, T> for HttpPlugins<InnerPlugin>\nwhere\n    InnerPlugin: Plugin<Ser, Op, T>,\n{\n    type Output = InnerPlugin::Output;\n\n    fn apply(&self, input: T) -> Self::Output {\n        self.0.apply(input)\n    }\n}\n\nimpl<InnerPlugin> HttpMarker for HttpPlugins<InnerPlugin> where InnerPlugin: HttpMarker {}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http-server/src/plugin/identity.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse super::{HttpMarker, ModelMarker, Plugin};\n\n/// A [`Plugin`] that maps a service to itself.\n#[derive(Debug)]\npub struct IdentityPlugin;\n\nimpl<Ser, Op, S> Plugin<Ser, Op, S> for IdentityPlugin {\n    type Output = S;\n\n    fn apply(&self, svc: S) -> S {\n        svc\n    }\n}\n\nimpl ModelMarker for IdentityPlugin {}\nimpl HttpMarker for IdentityPlugin {}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http-server/src/plugin/layer.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::marker::PhantomData;\n\nuse tower::Layer;\n\nuse super::{HttpMarker, ModelMarker, Plugin};\n\n/// A [`Plugin`] which acts as a [`Layer`] `L`.\npub struct LayerPlugin<L>(pub L);\n\nimpl<Ser, Op, S, L> Plugin<Ser, Op, S> for LayerPlugin<L>\nwhere\n    L: Layer<S>,\n{\n    type Output = L::Service;\n\n    fn apply(&self, svc: S) -> Self::Output {\n        self.0.layer(svc)\n    }\n}\n\n// Without more information about what the layer `L` does, we can't know whether it's appropriate\n// to run this plugin as a HTTP plugin or a model plugin, so we implement both marker traits.\n\nimpl<L> HttpMarker for LayerPlugin<L> {}\nimpl<L> ModelMarker for LayerPlugin<L> {}\n\n/// A [`Layer`] which acts as a [`Plugin`] `Pl` for specific protocol `P` and operation `Op`.\npub struct PluginLayer<Ser, Op, Pl> {\n    plugin: Pl,\n    _ser: PhantomData<Ser>,\n    _op: PhantomData<Op>,\n}\n\nimpl<S, Ser, Op, Pl> Layer<S> for PluginLayer<Ser, Op, Pl>\nwhere\n    Pl: Plugin<Ser, Op, S>,\n{\n    type Service = Pl::Output;\n\n    fn layer(&self, inner: S) -> Self::Service {\n        self.plugin.apply(inner)\n    }\n}\n\nimpl<Pl> PluginLayer<(), (), Pl> {\n    pub fn new<Ser, Op>(plugin: Pl) -> PluginLayer<Ser, Op, Pl> {\n        PluginLayer {\n            plugin,\n            _ser: PhantomData,\n            _op: PhantomData,\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http-server/src/plugin/mod.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! The plugin system allows you to build middleware with an awareness of the operation it is applied to.\n//!\n//! The system centers around the [`Plugin`], [`HttpMarker`], and [`ModelMarker`] traits. In\n//! addition, this module provides helpers for composing and combining [`Plugin`]s.\n//!\n//! # HTTP plugins vs model plugins\n//!\n//! Plugins come in two flavors: _HTTP_ plugins and _model_ plugins. The key difference between\n//! them is _when_ they run:\n//!\n//! - A HTTP plugin acts on the HTTP request before it is deserialized, and acts on the HTTP response\n//!   after it is serialized.\n//! - A model plugin acts on the modeled operation input after it is deserialized, and acts on the\n//!   modeled operation output or the modeled operation error before it is serialized.\n//!\n//! See the relevant section in [the book], which contains an illustrative diagram.\n//!\n//! Both kinds of plugins implement the [`Plugin`] trait, but only HTTP plugins implement the\n//! [`HttpMarker`] trait and only model plugins implement the [`ModelMarker`] trait. There is no\n//! difference in how an HTTP plugin or a model plugin is applied, so both the [`HttpMarker`] trait\n//! and the [`ModelMarker`] trait are _marker traits_, they carry no behavior. Their only purpose\n//! is to mark a plugin, at the type system leve, as allowed to run at a certain time. A plugin can be\n//! _both_ a HTTP plugin and a model plugin by implementing both traits; in this case, when the\n//! plugin runs is decided by you when you register it in your application. [`IdentityPlugin`],\n//! [`Scoped`], and [`LayerPlugin`] are examples of plugins that implement both traits.\n//!\n//! In practice, most plugins are HTTP plugins. Since HTTP plugins run before a request has been\n//! correctly deserialized, HTTP plugins should be fast and lightweight. Only use model plugins if\n//! you absolutely require your middleware to run after deserialization, or to act on particular\n//! fields of your deserialized operation's input/output/errors.\n//!\n//! [the book]: https://smithy-lang.github.io/smithy-rs/design/server/anatomy.html\n//!\n//! # Filtered application of a HTTP [`Layer`](tower::Layer)\n//!\n//! ```\n//! # use aws_smithy_legacy_http_server::plugin::*;\n//! # use aws_smithy_legacy_http_server::scope;\n//! # use aws_smithy_legacy_http_server::shape_id::ShapeId;\n//! # let layer = ();\n//! # #[derive(PartialEq)]\n//! # enum Operation { GetPokemonSpecies }\n//! # struct GetPokemonSpecies;\n//! # impl GetPokemonSpecies { const ID: ShapeId = ShapeId::new(\"namespace#name\", \"namespace\", \"name\"); };\n//! // Create a `Plugin` from a HTTP `Layer`\n//! let plugin = LayerPlugin(layer);\n//!\n//! scope! {\n//!     struct OnlyGetPokemonSpecies {\n//!         includes: [GetPokemonSpecies],\n//!         excludes: [/* The rest of the operations go here */]\n//!     }\n//! }\n//!\n//! // Only apply the layer to operations with name \"GetPokemonSpecies\".\n//! let filtered_plugin = Scoped::new::<OnlyGetPokemonSpecies>(&plugin);\n//!\n//! // The same effect can be achieved at runtime.\n//! let filtered_plugin = filter_by_operation(&plugin, |operation: Operation| operation == Operation::GetPokemonSpecies);\n//! ```\n//!\n//! # Construct a [`Plugin`] from a closure that takes as input the operation name\n//!\n//! ```rust\n//! # use aws_smithy_legacy_http_server::{service::*, operation::OperationShape, plugin::Plugin, shape_id::ShapeId};\n//! # pub enum Operation { CheckHealth, GetPokemonSpecies }\n//! # impl Operation { fn shape_id(&self) -> ShapeId { ShapeId::new(\"\", \"\", \"\") }}\n//! # pub struct CheckHealth;\n//! # pub struct GetPokemonSpecies;\n//! # pub struct PokemonService;\n//! # impl ServiceShape for PokemonService {\n//! #   const ID: ShapeId = ShapeId::new(\"\", \"\", \"\");\n//! #   const VERSION: Option<&'static str> = None;\n//! #   type Protocol = ();\n//! #   type Operations = Operation;\n//! # }\n//! # impl OperationShape for CheckHealth { const ID: ShapeId = ShapeId::new(\"\", \"\", \"\"); type Input = (); type Output = (); type Error = (); }\n//! # impl OperationShape for GetPokemonSpecies { const ID: ShapeId = ShapeId::new(\"\", \"\", \"\"); type Input = (); type Output = (); type Error = (); }\n//! # impl ContainsOperation<CheckHealth> for PokemonService { const VALUE: Operation = Operation::CheckHealth; }\n//! # impl ContainsOperation<GetPokemonSpecies> for PokemonService { const VALUE: Operation = Operation::GetPokemonSpecies; }\n//! use aws_smithy_legacy_http_server::plugin::plugin_from_operation_fn;\n//! use tower::layer::layer_fn;\n//!\n//! struct FooService<S> {\n//!     info: String,\n//!     inner: S\n//! }\n//!\n//! fn map<S>(op: Operation, inner: S) -> FooService<S> {\n//!     match op {\n//!         Operation::CheckHealth => FooService { info: op.shape_id().name().to_string(), inner },\n//!         Operation::GetPokemonSpecies => FooService { info: \"bar\".to_string(), inner },\n//!         _ => todo!()\n//!     }\n//! }\n//!\n//! // This plugin applies the `FooService` middleware around every operation.\n//! let plugin = plugin_from_operation_fn(map);\n//! # let _ = Plugin::<PokemonService, CheckHealth, ()>::apply(&plugin, ());\n//! # let _ = Plugin::<PokemonService, GetPokemonSpecies, ()>::apply(&plugin, ());\n//! ```\n//!\n//! # Combine [`Plugin`]s\n//!\n//! ```no_run\n//! # use aws_smithy_legacy_http_server::plugin::*;\n//! # struct Foo;\n//! # impl HttpMarker for Foo { }\n//! # let a = Foo; let b = Foo;\n//! // Combine `Plugin`s `a` and `b`. Both need to implement `HttpMarker`.\n//! let plugin = HttpPlugins::new()\n//!     .push(a)\n//!     .push(b);\n//! ```\n//!\n//! As noted in the [`HttpPlugins`] documentation, the plugins' runtime logic is executed in registration order,\n//! meaning that `a` is run _before_ `b` in the example above.\n//!\n//! Similarly, you can use [`ModelPlugins`] to combine model plugins.\n//!\n//! # Example implementation of a [`Plugin`]\n//!\n//! The following is an example implementation of a [`Plugin`] that prints out the service's name\n//! and the name of the operation that was hit every time it runs. Since it doesn't act on the HTTP\n//! request nor the modeled operation input/output/errors, this plugin can be both an HTTP plugin\n//! and a model plugin. In practice, however, you'd only want to register it once, as either an\n//! HTTP plugin or a model plugin.\n//!\n//! ```no_run\n//! use aws_smithy_legacy_http_server::{\n//!     operation::OperationShape,\n//!     service::ServiceShape,\n//!     plugin::{Plugin, HttpMarker, HttpPlugins, ModelMarker},\n//!     shape_id::ShapeId,\n//! };\n//! # use tower::{layer::util::Stack, Layer, Service};\n//! # use std::task::{Context, Poll};\n//!\n//! /// A [`Service`] that adds a print log.\n//! #[derive(Clone, Debug)]\n//! pub struct PrintService<S> {\n//!     inner: S,\n//!     service_id: ShapeId,\n//!     operation_id: ShapeId\n//! }\n//!\n//! impl<R, S> Service<R> for PrintService<S>\n//! where\n//!     S: Service<R>,\n//! {\n//!     type Response = S::Response;\n//!     type Error = S::Error;\n//!     type Future = S::Future;\n//!\n//!     fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {\n//!         self.inner.poll_ready(cx)\n//!     }\n//!\n//!     fn call(&mut self, req: R) -> Self::Future {\n//!         println!(\"Hi {} in {}\", self.operation_id.absolute(), self.service_id.absolute());\n//!         self.inner.call(req)\n//!     }\n//! }\n//!\n//! /// A [`Plugin`] for a service builder to add a [`PrintLayer`] over operations.\n//! #[derive(Debug)]\n//! pub struct PrintPlugin;\n//!\n//! impl<Ser, Op, T> Plugin<Ser, Op, T> for PrintPlugin\n//! where\n//!     Ser: ServiceShape,\n//!     Op: OperationShape,\n//! {\n//!     type Output = PrintService<T>;\n//!\n//!     fn apply(&self, inner: T) -> Self::Output {\n//!         PrintService {\n//!             inner,\n//!             service_id: Op::ID,\n//!             operation_id: Ser::ID,\n//!         }\n//!     }\n//! }\n//!\n//! // This plugin could be registered as an HTTP plugin and a model plugin, so we implement both\n//! // marker traits.\n//!\n//! impl HttpMarker for PrintPlugin { }\n//! impl ModelMarker for PrintPlugin { }\n//! ```\n\nmod closure;\npub(crate) mod either;\nmod filter;\nmod http_plugins;\nmod identity;\nmod layer;\nmod model_plugins;\n#[doc(hidden)]\npub mod scoped;\nmod stack;\n\npub use closure::{plugin_from_operation_fn, OperationFn};\npub use either::Either;\npub use filter::{filter_by_operation, FilterByOperation};\npub use http_plugins::HttpPlugins;\npub use identity::IdentityPlugin;\npub use layer::{LayerPlugin, PluginLayer};\npub use model_plugins::ModelPlugins;\npub use scoped::Scoped;\npub use stack::PluginStack;\n\n/// A mapping from one [`Service`](tower::Service) to another. This should be viewed as a\n/// [`Layer`](tower::Layer) parameterized by the protocol and operation.\n///\n/// The generics `Ser` and `Op` allow the behavior to be parameterized by the [Smithy service] and\n/// [operation] it's applied to.\n///\n/// See [module](crate::plugin) documentation for more information.\n///\n/// [Smithy service]: https://smithy.io/2.0/spec/service-types.html#service\n/// [operation]: https://smithy.io/2.0/spec/service-types.html#operation\npub trait Plugin<Ser, Op, T> {\n    /// The type of the new [`Service`](tower::Service).\n    type Output;\n\n    /// Maps a [`Service`](tower::Service) to another.\n    fn apply(&self, input: T) -> Self::Output;\n}\n\nimpl<Ser, Op, T, Pl> Plugin<Ser, Op, T> for &Pl\nwhere\n    Pl: Plugin<Ser, Op, T>,\n{\n    type Output = Pl::Output;\n\n    fn apply(&self, inner: T) -> Self::Output {\n        <Pl as Plugin<Ser, Op, T>>::apply(self, inner)\n    }\n}\n\n/// A HTTP plugin is a plugin that acts on the HTTP request before it is deserialized, and acts on\n/// the HTTP response after it is serialized.\n///\n/// This trait is a _marker_ trait to indicate that a plugin can be registered as an HTTP plugin.\n///\n/// Compare with [`ModelMarker`] in the [module](crate::plugin) documentation, which contains an\n/// example implementation too.\npub trait HttpMarker {}\nimpl<Pl> HttpMarker for &Pl where Pl: HttpMarker {}\n\n/// A model plugin is a plugin that acts on the modeled operation input after it is deserialized,\n/// and acts on the modeled operation output or the modeled operation error before it is\n/// serialized.\n///\n/// This trait is a _marker_ trait to indicate that a plugin can be registered as a model plugin.\n///\n/// Compare with [`HttpMarker`] in the [module](crate::plugin) documentation.\n///\n/// # Example implementation of a model plugin\n///\n/// Model plugins are most useful when you really need to rely on the actual shape of your modeled\n/// operation input, operation output, and/or operation errors. For this reason, most (but not all)\n/// model plugins are _operation-specific_: somewhere in the type signature of their definition,\n/// they'll rely on a particular operation shape's types. It is therefore important that you scope\n/// application of model plugins to the operations they are meant to work on, via\n/// [`Scoped`] or [`filter_by_operation`].\n///\n/// Below is an example implementation of a model plugin that can only be applied to the\n/// `CheckHealth` operation: note how in the `Service` trait implementation, we require access to\n/// the operation's input, where we log the `health_info` field.\n///\n/// ```no_run\n/// use std::marker::PhantomData;\n///\n/// use aws_smithy_legacy_http_server::{operation::OperationShape, plugin::{ModelMarker, Plugin}};\n/// use tower::Service;\n/// # pub struct SimpleService;\n/// # pub struct CheckHealth;\n/// # pub struct CheckHealthInput {\n/// #     health_info: (),\n/// # }\n/// # pub struct CheckHealthOutput;\n/// # impl aws_smithy_legacy_http_server::operation::OperationShape for CheckHealth {\n/// #     const ID: aws_smithy_legacy_http_server::shape_id::ShapeId = aws_smithy_legacy_http_server::shape_id::ShapeId::new(\n/// #         \"com.amazonaws.simple#CheckHealth\",\n/// #         \"com.amazonaws.simple\",\n/// #         \"CheckHealth\",\n/// #     );\n/// #     type Input = CheckHealthInput;\n/// #     type Output = CheckHealthOutput;\n/// #     type Error = std::convert::Infallible;\n/// # }\n///\n/// /// A model plugin that can only be applied to the `CheckHealth` operation.\n/// pub struct CheckHealthPlugin<Exts> {\n///     pub _exts: PhantomData<Exts>,\n/// }\n///\n/// impl<Exts> CheckHealthPlugin<Exts> {\n///     pub fn new() -> Self {\n///         Self { _exts: PhantomData }\n///     }\n/// }\n///\n/// impl<T, Exts> Plugin<SimpleService, CheckHealth, T> for CheckHealthPlugin<Exts> {\n///     type Output = CheckHealthService<T, Exts>;\n///\n///     fn apply(&self, input: T) -> Self::Output {\n///         CheckHealthService {\n///             inner: input,\n///             _exts: PhantomData,\n///         }\n///     }\n/// }\n///\n/// impl<Exts> ModelMarker for CheckHealthPlugin<Exts> { }\n///\n/// #[derive(Clone)]\n/// pub struct CheckHealthService<S, Exts> {\n///     inner: S,\n///     _exts: PhantomData<Exts>,\n/// }\n///\n/// impl<S, Exts> Service<(<CheckHealth as OperationShape>::Input, Exts)> for CheckHealthService<S, Exts>\n/// where\n///     S: Service<(<CheckHealth as OperationShape>::Input, Exts)>,\n/// {\n///     type Response = S::Response;\n///     type Error = S::Error;\n///     type Future = S::Future;\n///\n///     fn poll_ready(&mut self, cx: &mut std::task::Context<'_>) -> std::task::Poll<Result<(), Self::Error>> {\n///         self.inner.poll_ready(cx)\n///     }\n///\n///     fn call(&mut self, req: (<CheckHealth as OperationShape>::Input, Exts)) -> Self::Future {\n///         let (input, _exts) = &req;\n///\n///         // We have access to `CheckHealth`'s modeled operation input!\n///         dbg!(&input.health_info);\n///\n///         self.inner.call(req)\n///     }\n/// }\n///\n/// // In `main.rs` or wherever we register plugins, we have to make sure we only apply this plugin\n/// // to the the only operation it can be applied to, the `CheckHealth` operation. If we apply the\n/// // plugin to other operations, we will get a compilation error.\n///\n/// use aws_smithy_legacy_http_server::plugin::Scoped;\n/// use aws_smithy_legacy_http_server::scope;\n///\n/// pub fn main() {\n///     scope! {\n///         struct OnlyCheckHealth {\n///             includes: [CheckHealth],\n///             excludes: [/* The rest of the operations go here */]\n///         }\n///     }\n///\n///     let model_plugin = CheckHealthPlugin::new();\n///     # _foo(&model_plugin);\n///\n///     // Scope the plugin to the `CheckHealth` operation.\n///     let scoped_plugin = Scoped::new::<OnlyCheckHealth>(model_plugin);\n///     # fn _foo(model_plugin: &CheckHealthPlugin<()>) {}\n/// }\n/// ```\n///\n/// If you are a service owner and don't care about giving a name to the model plugin, you can\n/// simplify this down to:\n///\n/// ```no_run\n/// use std::marker::PhantomData;\n///\n/// use aws_smithy_legacy_http_server::operation::OperationShape;\n/// use tower::Service;\n/// # pub struct SimpleService;\n/// # pub struct CheckHealth;\n/// # pub struct CheckHealthInput {\n/// #     health_info: (),\n/// # }\n/// # pub struct CheckHealthOutput;\n/// # impl aws_smithy_legacy_http_server::operation::OperationShape for CheckHealth {\n/// #     const ID: aws_smithy_legacy_http_server::shape_id::ShapeId = aws_smithy_legacy_http_server::shape_id::ShapeId::new(\n/// #         \"com.amazonaws.simple#CheckHealth\",\n/// #         \"com.amazonaws.simple\",\n/// #         \"CheckHealth\",\n/// #     );\n/// #     type Input = CheckHealthInput;\n/// #     type Output = CheckHealthOutput;\n/// #     type Error = std::convert::Infallible;\n/// # }\n///\n/// #[derive(Clone)]\n/// pub struct CheckHealthService<S, Exts> {\n///     inner: S,\n///     _exts: PhantomData<Exts>,\n/// }\n///\n/// impl<S, Exts> Service<(<CheckHealth as OperationShape>::Input, Exts)> for CheckHealthService<S, Exts>\n/// where\n///     S: Service<(<CheckHealth as OperationShape>::Input, Exts)>,\n/// {\n///     type Response = S::Response;\n///     type Error = S::Error;\n///     type Future = S::Future;\n///\n///     fn poll_ready(&mut self, cx: &mut std::task::Context<'_>) -> std::task::Poll<Result<(), Self::Error>> {\n///         self.inner.poll_ready(cx)\n///     }\n///\n///     fn call(&mut self, req: (<CheckHealth as OperationShape>::Input, Exts)) -> Self::Future {\n///         let (input, _exts) = &req;\n///\n///         // We have access to `CheckHealth`'s modeled operation input!\n///         dbg!(&input.health_info);\n///\n///         self.inner.call(req)\n///     }\n/// }\n///\n/// // In `main.rs`:\n///\n/// use aws_smithy_legacy_http_server::plugin::LayerPlugin;\n/// use aws_smithy_legacy_http_server::plugin::Scoped;\n/// use aws_smithy_legacy_http_server::scope;\n///\n/// fn new_check_health_service<S, Ext>(inner: S) -> CheckHealthService<S, Ext> {\n///     CheckHealthService {\n///         inner,\n///         _exts: PhantomData,\n///     }\n/// }\n///\n/// pub fn main() {\n///     scope! {\n///         struct OnlyCheckHealth {\n///             includes: [CheckHealth],\n///             excludes: [/* The rest of the operations go here */]\n///         }\n///     }\n///\n///     # fn new_check_health_service(inner: ()) -> CheckHealthService<(), ()> {\n///     #     CheckHealthService {\n///     #         inner,\n///     #         _exts: PhantomData,\n///     #     }\n///     # }\n///     let layer = tower::layer::layer_fn(new_check_health_service);\n///     let model_plugin = LayerPlugin(layer);\n///\n///     // Scope the plugin to the `CheckHealth` operation.\n///     let scoped_plugin = Scoped::new::<OnlyCheckHealth>(model_plugin);\n/// }\n/// ```\npub trait ModelMarker {}\nimpl<Pl> ModelMarker for &Pl where Pl: ModelMarker {}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http-server/src/plugin/model_plugins.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n// If you make any updates to this file (including Rust docs), make sure you make them to\n// `http_plugins.rs` too!\n\nuse crate::plugin::{IdentityPlugin, Plugin, PluginStack};\n\nuse super::{LayerPlugin, ModelMarker};\n\n/// A wrapper struct for composing model plugins.\n/// It operates identically to [`HttpPlugins`](crate::plugin::HttpPlugins); see its documentation.\n#[derive(Debug)]\npub struct ModelPlugins<P>(pub(crate) P);\n\nimpl Default for ModelPlugins<IdentityPlugin> {\n    fn default() -> Self {\n        Self(IdentityPlugin)\n    }\n}\n\nimpl ModelPlugins<IdentityPlugin> {\n    /// Create an empty [`ModelPlugins`].\n    ///\n    /// You can use [`ModelPlugins::push`] to add plugins to it.\n    pub fn new() -> Self {\n        Self::default()\n    }\n}\n\nimpl<P> ModelPlugins<P> {\n    /// Apply a new model plugin after the ones that have already been registered.\n    ///\n    /// ```rust\n    /// use aws_smithy_legacy_http_server::plugin::ModelPlugins;\n    /// # use aws_smithy_legacy_http_server::plugin::IdentityPlugin as LoggingPlugin;\n    /// # use aws_smithy_legacy_http_server::plugin::IdentityPlugin as MetricsPlugin;\n    ///\n    /// let model_plugins = ModelPlugins::new().push(LoggingPlugin).push(MetricsPlugin);\n    /// ```\n    ///\n    /// The plugins' runtime logic is executed in registration order.\n    /// In our example above, `LoggingPlugin` would run first, while `MetricsPlugin` is executed last.\n    ///\n    /// ## Implementation notes\n    ///\n    /// Plugins are applied to the underlying [`Service`](tower::Service) in opposite order compared\n    /// to their registration order.\n    ///\n    /// As an example:\n    ///\n    /// ```rust,compile_fail\n    /// #[derive(Debug)]\n    /// pub struct PrintPlugin;\n    ///\n    /// impl<Ser, Op, S> Plugin<Ser, Op, T> for PrintPlugin\n    /// // [...]\n    /// {\n    ///     // [...]\n    ///     fn apply(&self, inner: T) -> Self::Service {\n    ///         PrintService {\n    ///             inner,\n    ///             service_id: Ser::ID,\n    ///             operation_id: Op::ID\n    ///         }\n    ///     }\n    /// }\n    /// ```\n    // We eagerly require `NewPlugin: ModelMarker`, despite not really needing it, because compiler\n    // errors get _substantially_ better if the user makes a mistake.\n    pub fn push<NewPlugin: ModelMarker>(self, new_plugin: NewPlugin) -> ModelPlugins<PluginStack<NewPlugin, P>> {\n        ModelPlugins(PluginStack::new(new_plugin, self.0))\n    }\n\n    /// Applies a single [`tower::Layer`] to all operations _before_ they are deserialized.\n    pub fn layer<L>(self, layer: L) -> ModelPlugins<PluginStack<LayerPlugin<L>, P>> {\n        ModelPlugins(PluginStack::new(LayerPlugin(layer), self.0))\n    }\n}\n\nimpl<Ser, Op, T, InnerPlugin> Plugin<Ser, Op, T> for ModelPlugins<InnerPlugin>\nwhere\n    InnerPlugin: Plugin<Ser, Op, T>,\n{\n    type Output = InnerPlugin::Output;\n\n    fn apply(&self, input: T) -> Self::Output {\n        self.0.apply(input)\n    }\n}\n\nimpl<InnerPlugin> ModelMarker for ModelPlugins<InnerPlugin> where InnerPlugin: ModelMarker {}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http-server/src/plugin/scoped.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::marker::PhantomData;\n\nuse super::{HttpMarker, ModelMarker, Plugin};\n\n/// Marker struct for `true`.\n///\n/// Implements [`ConditionalApply`] which applies the [`Plugin`].\npub struct True;\n\n/// Marker struct for `false`.\n///\n/// Implements [`ConditionalApply`] which does nothing.\npub struct False;\n\n/// Conditionally applies a [`Plugin`] `Pl` to some service `S`.\n///\n/// See [`True`] and [`False`].\npub trait ConditionalApply<Ser, Op, Pl, T> {\n    type Service;\n\n    fn apply(plugin: &Pl, svc: T) -> Self::Service;\n}\n\nimpl<Ser, Op, Pl, T> ConditionalApply<Ser, Op, Pl, T> for True\nwhere\n    Pl: Plugin<Ser, Op, T>,\n{\n    type Service = Pl::Output;\n\n    fn apply(plugin: &Pl, input: T) -> Self::Service {\n        plugin.apply(input)\n    }\n}\n\nimpl<P, Op, Pl, T> ConditionalApply<P, Op, Pl, T> for False {\n    type Service = T;\n\n    fn apply(_plugin: &Pl, input: T) -> Self::Service {\n        input\n    }\n}\n\n/// A [`Plugin`] which scopes the application of an inner [`Plugin`].\n///\n/// In cases where operation selection must be performed at runtime [`filter_by_operation`](crate::plugin::filter_by_operation)\n/// can be used.\n///\n/// Operations within the scope will have the inner [`Plugin`] applied.\n///\n/// # Example\n///\n/// ```rust\n/// # use aws_smithy_legacy_http_server::{scope, plugin::Scoped};\n/// # struct OperationA; struct OperationB; struct OperationC;\n/// # let plugin = ();\n///\n/// // Define a scope over a service with 3 operations\n/// scope! {\n///     struct OnlyAB {\n///         includes: [OperationA, OperationB],\n///         excludes: [OperationC]\n///     }\n/// }\n///\n/// // Create a scoped plugin\n/// let scoped_plugin = Scoped::new::<OnlyAB>(plugin);\n/// ```\npub struct Scoped<Scope, Pl> {\n    scope: PhantomData<Scope>,\n    plugin: Pl,\n}\n\nimpl<Pl> Scoped<(), Pl> {\n    /// Creates a new [`Scoped`] from a `Scope` and [`Plugin`].\n    pub fn new<Scope>(plugin: Pl) -> Scoped<Scope, Pl> {\n        Scoped {\n            scope: PhantomData,\n            plugin,\n        }\n    }\n}\n\n/// A trait marking which operations are in scope via the associated type [`Membership::Contains`].\npub trait Membership<Op> {\n    type Contains;\n}\n\nimpl<Ser, Op, T, Scope, Pl> Plugin<Ser, Op, T> for Scoped<Scope, Pl>\nwhere\n    Scope: Membership<Op>,\n    Scope::Contains: ConditionalApply<Ser, Op, Pl, T>,\n{\n    type Output = <Scope::Contains as ConditionalApply<Ser, Op, Pl, T>>::Service;\n\n    fn apply(&self, input: T) -> Self::Output {\n        <Scope::Contains as ConditionalApply<Ser, Op, Pl, T>>::apply(&self.plugin, input)\n    }\n}\n\nimpl<Scope, Pl> HttpMarker for Scoped<Scope, Pl> where Pl: HttpMarker {}\nimpl<Scope, Pl> ModelMarker for Scoped<Scope, Pl> where Pl: ModelMarker {}\n\n/// A macro to help with scoping [plugins](crate::plugin) to a subset of all operations.\n///\n/// The scope must partition _all_ operations, that is, each and every operation must be included or excluded, but not\n/// both.\n///\n/// The generated server SDK exports a similar `scope` macro which is aware of a service's operations and can complete\n/// underspecified scopes automatically.\n///\n/// # Example\n///\n/// For a service with three operations: `OperationA`, `OperationB`, `OperationC`.\n///\n/// ```rust\n/// # use aws_smithy_legacy_http_server::scope;\n/// # struct OperationA; struct OperationB; struct OperationC;\n/// scope! {\n///     struct OnlyAB {\n///         includes: [OperationA, OperationB],\n///         excludes: [OperationC]\n///     }\n/// }\n/// ```\n#[macro_export]\nmacro_rules! scope {\n    (\n        $(#[$attrs:meta])*\n        $vis:vis struct $name:ident {\n            includes: [$($include:ty),*],\n            excludes: [$($exclude:ty),*]\n        }\n    ) => {\n        $(#[$attrs])*\n        $vis struct $name;\n\n        $(\n            impl $crate::plugin::scoped::Membership<$include> for $name {\n                type Contains = $crate::plugin::scoped::True;\n            }\n        )*\n        $(\n            impl $crate::plugin::scoped::Membership<$exclude> for $name {\n                type Contains = $crate::plugin::scoped::False;\n            }\n        )*\n    };\n}\n\n#[cfg(test)]\nmod tests {\n    use crate::plugin::Plugin;\n\n    use super::Scoped;\n\n    struct OperationA;\n    struct OperationB;\n\n    scope! {\n        /// Includes A, not B.\n        pub struct AuthScope {\n            includes: [OperationA],\n            excludes: [OperationB]\n        }\n    }\n\n    struct MockPlugin;\n\n    impl<P, Op> Plugin<P, Op, u32> for MockPlugin {\n        type Output = String;\n\n        fn apply(&self, svc: u32) -> Self::Output {\n            svc.to_string()\n        }\n    }\n\n    #[test]\n    fn scope() {\n        let plugin = MockPlugin;\n        let scoped_plugin = Scoped::new::<AuthScope>(plugin);\n\n        let out: String = Plugin::<(), OperationA, _>::apply(&scoped_plugin, 3_u32);\n        assert_eq!(out, \"3\".to_string());\n        let out: u32 = Plugin::<(), OperationB, _>::apply(&scoped_plugin, 3_u32);\n        assert_eq!(out, 3);\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http-server/src/plugin/stack.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse super::{HttpMarker, ModelMarker, Plugin};\nuse std::fmt::Debug;\n\n/// A wrapper struct which composes an `Inner` and an `Outer` [`Plugin`].\n///\n/// The `Inner::map` is run _then_ the `Outer::map`.\n///\n/// Note that the primary tool for composing HTTP plugins is\n/// [`HttpPlugins`](crate::plugin::HttpPlugins), and the primary tool for composing HTTP plugins is\n/// [`ModelPlugins`](crate::plugin::ModelPlugins); if you are an application writer, you should\n/// prefer composing plugins using these.\n#[derive(Debug)]\npub struct PluginStack<Inner, Outer> {\n    inner: Inner,\n    outer: Outer,\n}\n\nimpl<Inner, Outer> PluginStack<Inner, Outer> {\n    /// Creates a new [`PluginStack`].\n    pub fn new(inner: Inner, outer: Outer) -> Self {\n        PluginStack { inner, outer }\n    }\n}\n\nimpl<Ser, Op, T, Inner, Outer> Plugin<Ser, Op, T> for PluginStack<Inner, Outer>\nwhere\n    Inner: Plugin<Ser, Op, T>,\n    Outer: Plugin<Ser, Op, Inner::Output>,\n{\n    type Output = Outer::Output;\n\n    fn apply(&self, input: T) -> Self::Output {\n        let svc = self.inner.apply(input);\n        self.outer.apply(svc)\n    }\n}\n\nimpl<Inner, Outer> HttpMarker for PluginStack<Inner, Outer>\nwhere\n    Inner: HttpMarker,\n    Outer: HttpMarker,\n{\n}\n\nimpl<Inner, Outer> ModelMarker for PluginStack<Inner, Outer>\nwhere\n    Inner: ModelMarker,\n    Outer: ModelMarker,\n{\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http-server/src/protocol/aws_json/mod.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npub mod rejection;\npub mod router;\npub mod runtime_error;\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http-server/src/protocol/aws_json/rejection.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::rejection::MissingContentTypeReason;\nuse aws_smithy_runtime_api::http::HttpError;\nuse thiserror::Error;\n\n#[derive(Debug, Error)]\npub enum ResponseRejection {\n    #[error(\"error building HTTP response: {0}\")]\n    Build(#[from] aws_smithy_types::error::operation::BuildError),\n    #[error(\"error serializing JSON-encoded body: {0}\")]\n    Serialization(#[from] aws_smithy_types::error::operation::SerializationError),\n    #[error(\"error building HTTP response: {0}\")]\n    HttpBuild(#[from] http::Error),\n}\n\n#[derive(Debug, Error)]\npub enum RequestRejection {\n    #[error(\"error converting non-streaming body to bytes: {0}\")]\n    BufferHttpBodyBytes(crate::Error),\n    #[error(\"request contains invalid value for `Accept` header\")]\n    NotAcceptable,\n    #[error(\"expected `Content-Type` header not found: {0}\")]\n    MissingContentType(#[from] MissingContentTypeReason),\n    #[error(\"error deserializing request HTTP body as JSON: {0}\")]\n    JsonDeserialize(#[from] aws_smithy_json::deserialize::error::DeserializeError),\n    #[error(\"request does not adhere to modeled constraints: {0}\")]\n    ConstraintViolation(String),\n\n    /// Typically happens when the request has headers that are not valid UTF-8.\n    #[error(\"failed to convert request: {0}\")]\n    HttpConversion(#[from] HttpError),\n}\n\nimpl From<std::convert::Infallible> for RequestRejection {\n    fn from(_err: std::convert::Infallible) -> Self {\n        match _err {}\n    }\n}\n\nconvert_to_request_rejection!(hyper::Error, BufferHttpBodyBytes);\nconvert_to_request_rejection!(Box<dyn std::error::Error + Send + Sync + 'static>, BufferHttpBodyBytes);\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http-server/src/protocol/aws_json/router.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::convert::Infallible;\n\nuse tower::Layer;\nuse tower::Service;\n\nuse crate::body::BoxBody;\nuse crate::routing::tiny_map::TinyMap;\nuse crate::routing::Route;\nuse crate::routing::Router;\n\nuse http::header::ToStrError;\nuse thiserror::Error;\n\n/// An AWS JSON routing error.\n#[derive(Debug, Error)]\npub enum Error {\n    /// Relative URI was not \"/\".\n    #[error(\"relative URI is not \\\"/\\\"\")]\n    NotRootUrl,\n    /// Method was not `POST`.\n    #[error(\"method not POST\")]\n    MethodNotAllowed,\n    /// Missing the `x-amz-target` header.\n    #[error(\"missing the \\\"x-amz-target\\\" header\")]\n    MissingHeader,\n    /// Unable to parse header into UTF-8.\n    #[error(\"failed to parse header: {0}\")]\n    InvalidHeader(ToStrError),\n    /// Operation not found.\n    #[error(\"operation not found\")]\n    NotFound,\n}\n\n// This constant determines when the `TinyMap` implementation switches from being a `Vec` to a\n// `HashMap`. This is chosen to be 15 as a result of the discussion around\n// https://github.com/smithy-lang/smithy-rs/pull/1429#issuecomment-1147516546\npub(crate) const ROUTE_CUTOFF: usize = 15;\n\n/// A [`Router`] supporting [AWS JSON 1.0] and [AWS JSON 1.1] protocols.\n///\n/// [AWS JSON 1.0]: https://smithy.io/2.0/aws/protocols/aws-json-1_0-protocol.html\n/// [AWS JSON 1.1]: https://smithy.io/2.0/aws/protocols/aws-json-1_1-protocol.html\n#[derive(Debug, Clone)]\npub struct AwsJsonRouter<S> {\n    routes: TinyMap<&'static str, S, ROUTE_CUTOFF>,\n}\n\nimpl<S> AwsJsonRouter<S> {\n    /// Applies a [`Layer`] uniformly to all routes.\n    pub fn layer<L>(self, layer: L) -> AwsJsonRouter<L::Service>\n    where\n        L: Layer<S>,\n    {\n        AwsJsonRouter {\n            routes: self\n                .routes\n                .into_iter()\n                .map(|(key, route)| (key, layer.layer(route)))\n                .collect(),\n        }\n    }\n\n    /// Applies type erasure to the inner route using [`Route::new`].\n    pub fn boxed<B>(self) -> AwsJsonRouter<Route<B>>\n    where\n        S: Service<http::Request<B>, Response = http::Response<BoxBody>, Error = Infallible>,\n        S: Send + Clone + 'static,\n        S::Future: Send + 'static,\n    {\n        AwsJsonRouter {\n            routes: self.routes.into_iter().map(|(key, s)| (key, Route::new(s))).collect(),\n        }\n    }\n}\n\nimpl<B, S> Router<B> for AwsJsonRouter<S>\nwhere\n    S: Clone,\n{\n    type Service = S;\n    type Error = Error;\n\n    fn match_route(&self, request: &http::Request<B>) -> Result<S, Self::Error> {\n        // The URI must be root,\n        if request.uri() != \"/\" {\n            return Err(Error::NotRootUrl);\n        }\n\n        // Only `Method::POST` is allowed.\n        if request.method() != http::Method::POST {\n            return Err(Error::MethodNotAllowed);\n        }\n\n        // Find the `x-amz-target` header.\n        let target = request.headers().get(\"x-amz-target\").ok_or(Error::MissingHeader)?;\n        let target = target.to_str().map_err(Error::InvalidHeader)?;\n\n        // Lookup in the `TinyMap` for a route for the target.\n        let route = self.routes.get(target).ok_or(Error::NotFound)?;\n        Ok(route.clone())\n    }\n}\n\nimpl<S> FromIterator<(&'static str, S)> for AwsJsonRouter<S> {\n    #[inline]\n    fn from_iter<T: IntoIterator<Item = (&'static str, S)>>(iter: T) -> Self {\n        Self {\n            routes: iter.into_iter().collect(),\n        }\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use crate::{protocol::test_helpers::req, routing::Router};\n\n    use http::{HeaderMap, HeaderValue, Method};\n    use pretty_assertions::assert_eq;\n\n    #[tokio::test]\n    async fn simple_routing() {\n        let routes = vec![(\"Service.Operation\")];\n        let router: AwsJsonRouter<_> = routes.clone().into_iter().map(|operation| (operation, ())).collect();\n\n        let mut headers = HeaderMap::new();\n        headers.insert(\"x-amz-target\", HeaderValue::from_static(\"Service.Operation\"));\n\n        // Valid request, should match.\n        router\n            .match_route(&req(&Method::POST, \"/\", Some(headers.clone())))\n            .unwrap();\n\n        // No headers, should return `MissingHeader`.\n        let res = router.match_route(&req(&Method::POST, \"/\", None));\n        assert_eq!(res.unwrap_err().to_string(), Error::MissingHeader.to_string());\n\n        // Wrong HTTP method, should return `MethodNotAllowed`.\n        let res = router.match_route(&req(&Method::GET, \"/\", Some(headers.clone())));\n        assert_eq!(res.unwrap_err().to_string(), Error::MethodNotAllowed.to_string());\n\n        // Wrong URI, should return `NotRootUrl`.\n        let res = router.match_route(&req(&Method::POST, \"/something\", Some(headers)));\n        assert_eq!(res.unwrap_err().to_string(), Error::NotRootUrl.to_string());\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http-server/src/protocol/aws_json/runtime_error.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::protocol::aws_json_11::AwsJson1_1;\nuse crate::response::IntoResponse;\nuse crate::runtime_error::{InternalFailureException, INVALID_HTTP_RESPONSE_FOR_RUNTIME_ERROR_PANIC_MESSAGE};\nuse crate::{extension::RuntimeErrorExtension, protocol::aws_json_10::AwsJson1_0};\nuse http::StatusCode;\n\nuse super::rejection::{RequestRejection, ResponseRejection};\n\n#[derive(Debug, thiserror::Error)]\npub enum RuntimeError {\n    /// See: [`crate::protocol::rest_json_1::runtime_error::RuntimeError::Serialization`]\n    #[error(\"request failed to deserialize or response failed to serialize: {0}\")]\n    Serialization(crate::Error),\n    /// See: [`crate::protocol::rest_json_1::runtime_error::RuntimeError::InternalFailure`]\n    #[error(\"internal failure: {0}\")]\n    InternalFailure(crate::Error),\n    /// See: [`crate::protocol::rest_json_1::runtime_error::RuntimeError::NotAcceptable`]\n    #[error(\"not acceptable request: request contains an `Accept` header with a MIME type, and the server cannot return a response body adhering to that MIME type\")]\n    NotAcceptable,\n    /// See: [`crate::protocol::rest_json_1::runtime_error::RuntimeError::UnsupportedMediaType`]\n    #[error(\"unsupported media type: request does not contain the expected `Content-Type` header value\")]\n    UnsupportedMediaType,\n    /// See: [`crate::protocol::rest_json_1::runtime_error::RuntimeError::Validation`]\n    #[error(\"validation failure: operation input contains data that does not adhere to the modeled constraints: {0}\")]\n    Validation(String),\n}\n\nimpl RuntimeError {\n    pub fn name(&self) -> &'static str {\n        match self {\n            Self::Serialization(_) => \"SerializationException\",\n            Self::InternalFailure(_) => \"InternalFailureException\",\n            Self::NotAcceptable => \"NotAcceptableException\",\n            Self::UnsupportedMediaType => \"UnsupportedMediaTypeException\",\n            Self::Validation(_) => \"ValidationException\",\n        }\n    }\n\n    pub fn status_code(&self) -> StatusCode {\n        match self {\n            Self::Serialization(_) => StatusCode::BAD_REQUEST,\n            Self::InternalFailure(_) => StatusCode::INTERNAL_SERVER_ERROR,\n            Self::NotAcceptable => StatusCode::NOT_ACCEPTABLE,\n            Self::UnsupportedMediaType => StatusCode::UNSUPPORTED_MEDIA_TYPE,\n            Self::Validation(_) => StatusCode::BAD_REQUEST,\n        }\n    }\n}\n\nimpl IntoResponse<AwsJson1_0> for InternalFailureException {\n    fn into_response(self) -> http::Response<crate::body::BoxBody> {\n        IntoResponse::<AwsJson1_0>::into_response(RuntimeError::InternalFailure(crate::Error::new(String::new())))\n    }\n}\n\nimpl IntoResponse<AwsJson1_1> for InternalFailureException {\n    fn into_response(self) -> http::Response<crate::body::BoxBody> {\n        IntoResponse::<AwsJson1_1>::into_response(RuntimeError::InternalFailure(crate::Error::new(String::new())))\n    }\n}\n\nimpl IntoResponse<AwsJson1_0> for RuntimeError {\n    fn into_response(self) -> http::Response<crate::body::BoxBody> {\n        let res = http::Response::builder()\n            .status(self.status_code())\n            .header(\"Content-Type\", \"application/x-amz-json-1.0\")\n            .extension(RuntimeErrorExtension::new(self.name().to_string()));\n\n        let body = match self {\n            RuntimeError::Validation(reason) => crate::body::to_boxed(reason),\n            // See https://awslabs.github.io/smithy/2.0/aws/protocols/aws-json-1_0-protocol.html#empty-body-serialization\n            _ => crate::body::to_boxed(\"{}\"),\n        };\n\n        res.body(body)\n            .expect(INVALID_HTTP_RESPONSE_FOR_RUNTIME_ERROR_PANIC_MESSAGE)\n    }\n}\n\nimpl IntoResponse<AwsJson1_1> for RuntimeError {\n    fn into_response(self) -> http::Response<crate::body::BoxBody> {\n        let res = http::Response::builder()\n            .status(self.status_code())\n            .header(\"Content-Type\", \"application/x-amz-json-1.1\")\n            .extension(RuntimeErrorExtension::new(self.name().to_string()));\n\n        let body = match self {\n            RuntimeError::Validation(reason) => crate::body::to_boxed(reason),\n            _ => crate::body::to_boxed(\"\"),\n        };\n\n        res.body(body)\n            .expect(INVALID_HTTP_RESPONSE_FOR_RUNTIME_ERROR_PANIC_MESSAGE)\n    }\n}\n\nimpl From<ResponseRejection> for RuntimeError {\n    fn from(err: ResponseRejection) -> Self {\n        Self::Serialization(crate::Error::new(err))\n    }\n}\n\nimpl From<RequestRejection> for RuntimeError {\n    fn from(err: RequestRejection) -> Self {\n        match err {\n            RequestRejection::ConstraintViolation(reason) => Self::Validation(reason),\n            _ => Self::Serialization(crate::Error::new(err)),\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http-server/src/protocol/aws_json_10/mod.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npub mod router;\n\n/// [AWS JSON 1.0](https://smithy.io/2.0/aws/protocols/aws-json-1_0-protocol.html) protocol.\npub struct AwsJson1_0;\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http-server/src/protocol/aws_json_10/router.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::body::{empty, BoxBody};\nuse crate::extension::RuntimeErrorExtension;\nuse crate::response::IntoResponse;\nuse crate::routing::{method_disallowed, UNKNOWN_OPERATION_EXCEPTION};\n\nuse super::AwsJson1_0;\n\npub use crate::protocol::aws_json::router::*;\n\n// TODO(https://github.com/smithy-lang/smithy/issues/2348): We're probably non-compliant here, but\n// we have no tests to pin our implemenation against!\nimpl IntoResponse<AwsJson1_0> for Error {\n    fn into_response(self) -> http::Response<BoxBody> {\n        match self {\n            Error::MethodNotAllowed => method_disallowed(),\n            _ => http::Response::builder()\n                .status(http::StatusCode::NOT_FOUND)\n                .header(http::header::CONTENT_TYPE, \"application/x-amz-json-1.0\")\n                .extension(RuntimeErrorExtension::new(\n                    UNKNOWN_OPERATION_EXCEPTION.to_string(),\n                ))\n                .body(empty())\n                .expect(\"invalid HTTP response for AWS JSON 1.0 routing error; please file a bug report under https://github.com/smithy-lang/smithy-rs/issues\"),\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http-server/src/protocol/aws_json_11/mod.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npub mod router;\n\n/// [AWS JSON 1.1](https://smithy.io/2.0/aws/protocols/aws-json-1_1-protocol.html) protocol.\npub struct AwsJson1_1;\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http-server/src/protocol/aws_json_11/router.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::body::{empty, BoxBody};\nuse crate::extension::RuntimeErrorExtension;\nuse crate::response::IntoResponse;\nuse crate::routing::{method_disallowed, UNKNOWN_OPERATION_EXCEPTION};\n\nuse super::AwsJson1_1;\n\npub use crate::protocol::aws_json::router::*;\n\n// TODO(https://github.com/smithy-lang/smithy/issues/2348): We're probably non-compliant here, but\n// we have no tests to pin our implemenation against!\nimpl IntoResponse<AwsJson1_1> for Error {\n    fn into_response(self) -> http::Response<BoxBody> {\n        match self {\n            Error::MethodNotAllowed => method_disallowed(),\n            _ => http::Response::builder()\n                .status(http::StatusCode::NOT_FOUND)\n                .header(http::header::CONTENT_TYPE, \"application/x-amz-json-1.1\")\n                .extension(RuntimeErrorExtension::new(\n                    UNKNOWN_OPERATION_EXCEPTION.to_string(),\n                ))\n                .body(empty())\n                .expect(\"invalid HTTP response for AWS JSON 1.1 routing error; please file a bug report under https://github.com/smithy-lang/smithy-rs/issues\"),\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http-server/src/protocol/mod.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npub mod aws_json;\npub mod aws_json_10;\npub mod aws_json_11;\npub mod rest;\npub mod rest_json_1;\npub mod rest_xml;\npub mod rpc_v2_cbor;\n\nuse crate::rejection::MissingContentTypeReason;\nuse aws_smithy_runtime_api::http::Headers as SmithyHeaders;\nuse http::header::CONTENT_TYPE;\nuse http::HeaderMap;\n\n#[cfg(test)]\npub mod test_helpers {\n    use http::{HeaderMap, Method, Request};\n\n    /// Helper function to build a `Request`. Used in other test modules.\n    pub fn req(method: &Method, uri: &str, headers: Option<HeaderMap>) -> Request<()> {\n        let mut r = Request::builder().method(method).uri(uri).body(()).unwrap();\n        if let Some(headers) = headers {\n            *r.headers_mut() = headers\n        }\n        r\n    }\n\n    // Returns a `Response`'s body as a `String`, without consuming the response.\n    pub async fn get_body_as_string<B>(body: B) -> String\n    where\n        B: http_body::Body + std::marker::Unpin,\n        B::Error: std::fmt::Debug,\n    {\n        let body_bytes = hyper::body::to_bytes(body).await.unwrap();\n        String::from(std::str::from_utf8(&body_bytes).unwrap())\n    }\n}\n\n#[allow(clippy::result_large_err)]\nfn parse_mime(content_type: &str) -> Result<mime::Mime, MissingContentTypeReason> {\n    content_type\n        .parse::<mime::Mime>()\n        .map_err(MissingContentTypeReason::MimeParseError)\n}\n\n/// Checks that the `content-type` header from a `SmithyHeaders` matches what we expect.\n#[allow(clippy::result_large_err)]\npub fn content_type_header_classifier_smithy(\n    headers: &SmithyHeaders,\n    expected_content_type: Option<&'static str>,\n) -> Result<(), MissingContentTypeReason> {\n    let actual_content_type = headers.get(CONTENT_TYPE);\n    content_type_header_classifier(actual_content_type, expected_content_type)\n}\n\n/// Checks that the `content-type` header matches what we expect.\n#[allow(clippy::result_large_err)]\nfn content_type_header_classifier(\n    actual_content_type: Option<&str>,\n    expected_content_type: Option<&'static str>,\n) -> Result<(), MissingContentTypeReason> {\n    fn parse_expected_mime(expected_content_type: &str) -> mime::Mime {\n        let mime = expected_content_type\n                .parse::<mime::Mime>()\n                // `expected_content_type` comes from the codegen.\n                .expect(\"BUG: MIME parsing failed, `expected_content_type` is not valid; please file a bug report under https://github.com/smithy-lang/smithy-rs/issues\");\n        debug_assert_eq!(\n            mime, expected_content_type,\n            \"BUG: expected `content-type` header value we own from codegen should coincide with its mime type; please file a bug report under https://github.com/smithy-lang/smithy-rs/issues\",\n        );\n        mime\n    }\n\n    match (actual_content_type, expected_content_type) {\n        (None, None) => Ok(()),\n        (None, Some(expected_content_type)) => {\n            let expected_mime = parse_expected_mime(expected_content_type);\n            Err(MissingContentTypeReason::UnexpectedMimeType {\n                expected_mime: Some(expected_mime),\n                found_mime: None,\n            })\n        }\n        (Some(actual_content_type), None) => {\n            let found_mime = parse_mime(actual_content_type)?;\n            Err(MissingContentTypeReason::UnexpectedMimeType {\n                expected_mime: None,\n                found_mime: Some(found_mime),\n            })\n        }\n        (Some(actual_content_type), Some(expected_content_type)) => {\n            let expected_mime = parse_expected_mime(expected_content_type);\n            let found_mime = parse_mime(actual_content_type)?;\n            if expected_mime != found_mime.essence_str() {\n                Err(MissingContentTypeReason::UnexpectedMimeType {\n                    expected_mime: Some(expected_mime),\n                    found_mime: Some(found_mime),\n                })\n            } else {\n                Ok(())\n            }\n        }\n    }\n}\n\npub fn accept_header_classifier(headers: &HeaderMap, content_type: &mime::Mime) -> bool {\n    if !headers.contains_key(http::header::ACCEPT) {\n        return true;\n    }\n    headers\n        .get_all(http::header::ACCEPT)\n        .into_iter()\n        .flat_map(|header| {\n            header\n                .to_str()\n                .ok()\n                .into_iter()\n                /*\n                 * Turn a header value of: \"type0/subtype0, type1/subtype1, ...\"\n                 * into: [\"type0/subtype0\", \"type1/subtype1\", ...]\n                 * and remove the optional \"; q=x\" parameters\n                 * NOTE: the `unwrap`() is safe, because it takes the first element (if there's nothing to split, returns the string)\n                 */\n                .flat_map(|s| s.split(',').map(|typ| typ.split(';').next().unwrap().trim()))\n        })\n        .filter_map(|h| h.parse::<mime::Mime>().ok())\n        .any(|mim| {\n            let typ = content_type.type_();\n            let subtype = content_type.subtype();\n            // Accept: */*, type/*, type/subtype\n            match (mim.type_(), mim.subtype()) {\n                (t, s) if t == typ && s == subtype => true,\n                (t, mime::STAR) if t == typ => true,\n                (mime::STAR, mime::STAR) => true,\n                _ => false,\n            }\n        })\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use http::header::{HeaderValue, ACCEPT, CONTENT_TYPE};\n\n    fn req_content_type_smithy(content_type: &'static str) -> SmithyHeaders {\n        let mut headers = SmithyHeaders::new();\n        headers.insert(CONTENT_TYPE, HeaderValue::from_str(content_type).unwrap());\n        headers\n    }\n\n    fn req_accept(accept: &'static str) -> HeaderMap {\n        let mut headers = HeaderMap::new();\n        headers.insert(ACCEPT, HeaderValue::from_static(accept));\n        headers\n    }\n\n    const APPLICATION_JSON: Option<&'static str> = Some(\"application/json\");\n\n    // Validates the rejection type since we cannot implement `PartialEq`\n    // for `MissingContentTypeReason`.\n    fn assert_unexpected_mime_type(\n        result: Result<(), MissingContentTypeReason>,\n        actually_expected_mime: Option<mime::Mime>,\n        actually_found_mime: Option<mime::Mime>,\n    ) {\n        match result {\n            Ok(()) => panic!(\"content-type validation is expected to fail\"),\n            Err(e) => match e {\n                MissingContentTypeReason::UnexpectedMimeType {\n                    expected_mime,\n                    found_mime,\n                } => {\n                    assert_eq!(actually_expected_mime, expected_mime);\n                    assert_eq!(actually_found_mime, found_mime);\n                }\n                _ => panic!(\"unexpected `MissingContentTypeReason`: {e}\"),\n            },\n        }\n    }\n\n    #[test]\n    fn check_valid_content_type() {\n        let headers = req_content_type_smithy(\"application/json\");\n        assert!(content_type_header_classifier_smithy(&headers, APPLICATION_JSON,).is_ok());\n    }\n\n    #[test]\n    fn check_invalid_content_type() {\n        let invalid = vec![\"application/jason\", \"text/xml\"];\n        for invalid_mime in invalid {\n            let headers = req_content_type_smithy(invalid_mime);\n            let results = vec![content_type_header_classifier_smithy(&headers, APPLICATION_JSON)];\n\n            let actually_expected_mime = Some(parse_mime(APPLICATION_JSON.unwrap()).unwrap());\n            for result in results {\n                let actually_found_mime = invalid_mime.parse::<mime::Mime>().ok();\n                assert_unexpected_mime_type(result, actually_expected_mime.clone(), actually_found_mime);\n            }\n        }\n    }\n\n    #[test]\n    fn check_missing_content_type_is_not_allowed() {\n        let actually_expected_mime = Some(parse_mime(APPLICATION_JSON.unwrap()).unwrap());\n        let result = content_type_header_classifier_smithy(&SmithyHeaders::new(), APPLICATION_JSON);\n        assert_unexpected_mime_type(result, actually_expected_mime, None);\n    }\n\n    #[test]\n    fn check_missing_content_type_is_expected() {\n        let headers = req_content_type_smithy(APPLICATION_JSON.unwrap());\n        let actually_found_mime = Some(parse_mime(APPLICATION_JSON.unwrap()).unwrap());\n        let actually_expected_mime = None;\n\n        let result = content_type_header_classifier_smithy(&headers, None);\n        assert_unexpected_mime_type(result, actually_expected_mime, actually_found_mime);\n    }\n\n    #[test]\n    fn check_not_parsable_content_type() {\n        let request = req_content_type_smithy(\"123\");\n        let result = content_type_header_classifier_smithy(&request, APPLICATION_JSON);\n        assert!(matches!(\n            result.unwrap_err(),\n            MissingContentTypeReason::MimeParseError(_)\n        ));\n    }\n\n    #[test]\n    fn check_non_ascii_visible_characters_content_type() {\n        // Note that for Smithy headers, validation fails when attempting to parse the mime type,\n        // unlike with `http`'s `HeaderMap`, that would fail when checking the header value is\n        // valid (~ASCII string).\n        let request = req_content_type_smithy(\"application/💩\");\n        let result = content_type_header_classifier_smithy(&request, APPLICATION_JSON);\n        assert!(matches!(\n            result.unwrap_err(),\n            MissingContentTypeReason::MimeParseError(_)\n        ));\n    }\n\n    #[test]\n    fn valid_content_type_header_classifier_http_params() {\n        let request = req_content_type_smithy(\"application/json; charset=utf-8\");\n        let result = content_type_header_classifier_smithy(&request, APPLICATION_JSON);\n        assert!(result.is_ok());\n    }\n\n    #[test]\n    fn valid_accept_header_classifier_multiple_values() {\n        let valid_request = req_accept(\"text/strings, application/json, invalid\");\n        assert!(accept_header_classifier(\n            &valid_request,\n            &\"application/json\".parse().unwrap()\n        ));\n    }\n\n    #[test]\n    fn invalid_accept_header_classifier() {\n        let invalid_request = req_accept(\"text/invalid, invalid, invalid/invalid\");\n        assert!(!accept_header_classifier(\n            &invalid_request,\n            &\"application/json\".parse().unwrap()\n        ));\n    }\n\n    #[test]\n    fn valid_accept_header_classifier_star() {\n        let valid_request = req_accept(\"application/*\");\n        assert!(accept_header_classifier(\n            &valid_request,\n            &\"application/json\".parse().unwrap()\n        ));\n    }\n\n    #[test]\n    fn valid_accept_header_classifier_star_star() {\n        let valid_request = req_accept(\"*/*\");\n        assert!(accept_header_classifier(\n            &valid_request,\n            &\"application/json\".parse().unwrap()\n        ));\n    }\n\n    #[test]\n    fn valid_empty_accept_header_classifier() {\n        assert!(accept_header_classifier(\n            &HeaderMap::new(),\n            &\"application/json\".parse().unwrap()\n        ));\n    }\n\n    #[test]\n    fn valid_accept_header_classifier_with_params() {\n        let valid_request = req_accept(\"application/json; q=30, */*\");\n        assert!(accept_header_classifier(\n            &valid_request,\n            &\"application/json\".parse().unwrap()\n        ));\n    }\n\n    #[test]\n    fn valid_accept_header_classifier() {\n        let valid_request = req_accept(\"application/json\");\n        assert!(accept_header_classifier(\n            &valid_request,\n            &\"application/json\".parse().unwrap()\n        ));\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http-server/src/protocol/rest/mod.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npub mod router;\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http-server/src/protocol/rest/router.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::convert::Infallible;\n\nuse crate::body::BoxBody;\nuse crate::routing::request_spec::Match;\nuse crate::routing::request_spec::RequestSpec;\nuse crate::routing::Route;\nuse crate::routing::Router;\nuse tower::Layer;\nuse tower::Service;\n\nuse thiserror::Error;\n\n/// An AWS REST routing error.\n#[derive(Debug, Error, PartialEq)]\npub enum Error {\n    /// Operation not found.\n    #[error(\"operation not found\")]\n    NotFound,\n    /// Method was not allowed.\n    #[error(\"method was not allowed\")]\n    MethodNotAllowed,\n}\n\n/// A [`Router`] supporting [AWS restJson1] and [AWS restXml] protocols.\n///\n/// [AWS restJson1]: https://awslabs.github.io/smithy/2.0/aws/protocols/aws-restjson1-protocol.html\n/// [AWS restXml]: https://awslabs.github.io/smithy/2.0/aws/protocols/aws-restxml-protocol.html\n#[derive(Debug, Clone)]\npub struct RestRouter<S> {\n    routes: Vec<(RequestSpec, S)>,\n}\n\nimpl<S> RestRouter<S> {\n    /// Applies a [`Layer`] uniformly to all routes.\n    pub fn layer<L>(self, layer: L) -> RestRouter<L::Service>\n    where\n        L: Layer<S>,\n    {\n        RestRouter {\n            routes: self\n                .routes\n                .into_iter()\n                .map(|(request_spec, route)| (request_spec, layer.layer(route)))\n                .collect(),\n        }\n    }\n\n    /// Applies type erasure to the inner route using [`Route::new`].\n    pub fn boxed<B>(self) -> RestRouter<Route<B>>\n    where\n        S: Service<http::Request<B>, Response = http::Response<BoxBody>, Error = Infallible>,\n        S: Send + Clone + 'static,\n        S::Future: Send + 'static,\n    {\n        RestRouter {\n            routes: self.routes.into_iter().map(|(spec, s)| (spec, Route::new(s))).collect(),\n        }\n    }\n}\n\nimpl<B, S> Router<B> for RestRouter<S>\nwhere\n    S: Clone,\n{\n    type Service = S;\n    type Error = Error;\n\n    fn match_route(&self, request: &http::Request<B>) -> Result<S, Self::Error> {\n        let mut method_allowed = true;\n\n        for (request_spec, route) in &self.routes {\n            match request_spec.matches(request) {\n                // Match found.\n                Match::Yes => return Ok(route.clone()),\n                // Match found, but method disallowed.\n                Match::MethodNotAllowed => method_allowed = false,\n                // Continue looping to see if another route matches.\n                Match::No => continue,\n            }\n        }\n\n        if method_allowed {\n            Err(Error::NotFound)\n        } else {\n            Err(Error::MethodNotAllowed)\n        }\n    }\n}\n\nimpl<S> FromIterator<(RequestSpec, S)> for RestRouter<S> {\n    #[inline]\n    fn from_iter<T: IntoIterator<Item = (RequestSpec, S)>>(iter: T) -> Self {\n        let mut routes: Vec<(RequestSpec, S)> = iter.into_iter().collect();\n\n        // Sort them once by specificity, with the more specific routes sorted before the less\n        // specific ones, so that when routing a request we can simply iterate through the routes\n        // and pick the first one that matches.\n        routes.sort_by_key(|(request_spec, _route)| std::cmp::Reverse(request_spec.rank()));\n\n        Self { routes }\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use crate::{protocol::test_helpers::req, routing::request_spec::*};\n\n    use http::Method;\n\n    // This test is a rewrite of `mux.spec.ts`.\n    // https://github.com/awslabs/smithy-typescript/blob/fbf97a9bf4c1d8cf7f285ea7c24e1f0ef280142a/smithy-typescript-ssdk-libs/server-common/src/httpbinding/mux.spec.ts\n    #[test]\n    fn simple_routing() {\n        let request_specs: Vec<(RequestSpec, &'static str)> = vec![\n            (\n                RequestSpec::from_parts(\n                    Method::GET,\n                    vec![\n                        PathSegment::Literal(String::from(\"a\")),\n                        PathSegment::Label,\n                        PathSegment::Label,\n                    ],\n                    Vec::new(),\n                ),\n                \"A\",\n            ),\n            (\n                RequestSpec::from_parts(\n                    Method::GET,\n                    vec![\n                        PathSegment::Literal(String::from(\"mg\")),\n                        PathSegment::Greedy,\n                        PathSegment::Literal(String::from(\"z\")),\n                    ],\n                    Vec::new(),\n                ),\n                \"MiddleGreedy\",\n            ),\n            (\n                RequestSpec::from_parts(\n                    Method::DELETE,\n                    Vec::new(),\n                    vec![\n                        QuerySegment::KeyValue(String::from(\"foo\"), String::from(\"bar\")),\n                        QuerySegment::Key(String::from(\"baz\")),\n                    ],\n                ),\n                \"Delete\",\n            ),\n            (\n                RequestSpec::from_parts(\n                    Method::POST,\n                    vec![PathSegment::Literal(String::from(\"query_key_only\"))],\n                    vec![QuerySegment::Key(String::from(\"foo\"))],\n                ),\n                \"QueryKeyOnly\",\n            ),\n        ];\n\n        // Test both RestJson1 and RestXml routers.\n        let router: RestRouter<_> = request_specs.into_iter().collect();\n\n        let hits = vec![\n            (\"A\", Method::GET, \"/a/b/c\"),\n            (\"MiddleGreedy\", Method::GET, \"/mg/a/z\"),\n            (\"MiddleGreedy\", Method::GET, \"/mg/a/b/c/d/z?abc=def\"),\n            (\"Delete\", Method::DELETE, \"/?foo=bar&baz=quux\"),\n            (\"Delete\", Method::DELETE, \"/?foo=bar&baz\"),\n            (\"Delete\", Method::DELETE, \"/?foo=bar&baz=&\"),\n            (\"Delete\", Method::DELETE, \"/?foo=bar&baz=quux&baz=grault\"),\n            (\"QueryKeyOnly\", Method::POST, \"/query_key_only?foo=bar\"),\n            (\"QueryKeyOnly\", Method::POST, \"/query_key_only?foo\"),\n            (\"QueryKeyOnly\", Method::POST, \"/query_key_only?foo=\"),\n            (\"QueryKeyOnly\", Method::POST, \"/query_key_only?foo=&\"),\n        ];\n        for (svc_name, method, uri) in &hits {\n            assert_eq!(router.match_route(&req(method, uri, None)).unwrap(), *svc_name);\n        }\n\n        for (_, _, uri) in hits {\n            let res = router.match_route(&req(&Method::PATCH, uri, None));\n            assert_eq!(res.unwrap_err(), Error::MethodNotAllowed);\n        }\n\n        let misses = vec![\n            (Method::GET, \"/a\"),\n            (Method::GET, \"/a/b\"),\n            (Method::GET, \"/mg\"),\n            (Method::GET, \"/mg/q\"),\n            (Method::GET, \"/mg/z\"),\n            (Method::GET, \"/mg/a/b/z/c\"),\n            (Method::DELETE, \"/?foo=bar\"),\n            (Method::DELETE, \"/?foo=bar\"),\n            (Method::DELETE, \"/?baz=quux\"),\n            (Method::POST, \"/query_key_only?baz=quux\"),\n            (Method::GET, \"/\"),\n            (Method::POST, \"/\"),\n        ];\n        for (method, miss) in misses {\n            let res = router.match_route(&req(&method, miss, None));\n            assert_eq!(res.unwrap_err(), Error::NotFound);\n        }\n    }\n\n    #[tokio::test]\n    async fn basic_pattern_conflict_avoidance() {\n        let request_specs: Vec<(RequestSpec, &'static str)> = vec![\n            (\n                RequestSpec::from_parts(\n                    Method::GET,\n                    vec![PathSegment::Literal(String::from(\"a\")), PathSegment::Label],\n                    Vec::new(),\n                ),\n                \"A1\",\n            ),\n            (\n                RequestSpec::from_parts(\n                    Method::GET,\n                    vec![\n                        PathSegment::Literal(String::from(\"a\")),\n                        PathSegment::Label,\n                        PathSegment::Literal(String::from(\"a\")),\n                    ],\n                    Vec::new(),\n                ),\n                \"A2\",\n            ),\n            (\n                RequestSpec::from_parts(\n                    Method::GET,\n                    vec![PathSegment::Literal(String::from(\"b\")), PathSegment::Greedy],\n                    Vec::new(),\n                ),\n                \"B1\",\n            ),\n            (\n                RequestSpec::from_parts(\n                    Method::GET,\n                    vec![PathSegment::Literal(String::from(\"b\")), PathSegment::Greedy],\n                    vec![QuerySegment::Key(String::from(\"q\"))],\n                ),\n                \"B2\",\n            ),\n        ];\n\n        let router: RestRouter<_> = request_specs.into_iter().collect();\n\n        let hits = vec![\n            (\"A1\", Method::GET, \"/a/foo\"),\n            (\"A2\", Method::GET, \"/a/foo/a\"),\n            (\"B1\", Method::GET, \"/b/foo/bar/baz\"),\n            (\"B2\", Method::GET, \"/b/foo?q=baz\"),\n        ];\n        for (svc_name, method, uri) in hits {\n            assert_eq!(router.match_route(&req(&method, uri, None)).unwrap(), svc_name);\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http-server/src/protocol/rest_json_1/mod.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npub mod rejection;\npub mod router;\npub mod runtime_error;\n\n/// [AWS restJson1](https://smithy.io/2.0/aws/protocols/aws-restjson1-protocol.html) protocol.\npub struct RestJson1;\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http-server/src/protocol/rest_json_1/rejection.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Rejection types.\n//!\n//! This module contains types that are commonly used as the `E` error type in functions that\n//! handle requests and responses that return `Result<T, E>` throughout the framework. These\n//! include functions to deserialize incoming requests and serialize outgoing responses.\n//!\n//! All types end with `Rejection`. There are two types:\n//!\n//! 1. [`RequestRejection`]s are used when the framework fails to deserialize the request into the\n//!    corresponding operation input.\n//! 2. [`ResponseRejection`]s are used when the framework fails to serialize the operation\n//!    output into a response.\n//!\n//! They are called _rejection_ types and not _error_ types to signal that the input was _rejected_\n//! (as opposed to it causing a recoverable error that would need to be handled, or an\n//! unrecoverable error). For example, a [`RequestRejection`] simply means that the request was\n//! rejected; there isn't really anything wrong with the service itself that the service\n//! implementer would need to handle.\n//!\n//! Rejection types are an _internal_ detail about the framework: they can be added, removed, and\n//! modified at any time without causing breaking changes. They are not surfaced to clients or the\n//! service implementer in any way (including this documentation): indeed, they can't be converted\n//! into responses. They serve as a mechanism to keep track of all the possible errors that can\n//! occur when processing a request or a response, in far more detail than what AWS protocols need\n//! to. This is why they are so granular: other (possibly protocol-specific) error types (like\n//! [`crate::protocol::rest_json_1::runtime_error::RuntimeError`]) can \"group\" them when exposing\n//! errors to clients while the framework does not need to sacrifice fidelity in private error\n//! handling routines, and future-proofing itself at the same time (for example, we might want to\n//! record metrics about rejection types).\n//!\n//! Rejection types implement [`std::error::Error`], and some take in type-erased boxed errors\n//! (`crate::Error`) to represent their underlying causes, so they can be composed with other types\n//! that take in (possibly type-erased) [`std::error::Error`]s, like\n//! [`crate::protocol::rest_json_1::runtime_error::RuntimeError`], thus allowing us to represent the\n//! full error chain.\n//!\n//! This module hosts rejection types _specific_ to the [`crate::protocol::rest_json_1`] protocol, but\n//! the paragraphs above apply to _all_ protocol-specific rejection types.\n//!\n//! Similarly, rejection type variants are exhaustively documented solely in this module if they have\n//! direct counterparts in other protocols. This is to avoid documentation getting out of date.\n//!\n//! Consult `crate::protocol::$protocolName::rejection` for rejection types for other protocols.\n\nuse crate::rejection::MissingContentTypeReason;\nuse aws_smithy_runtime_api::http::HttpError;\nuse std::num::TryFromIntError;\nuse thiserror::Error;\n\n/// Errors that can occur when serializing the operation output provided by the service implementer\n/// into an HTTP response.\n#[derive(Debug, Error)]\npub enum ResponseRejection {\n    /// Used when the service implementer provides an integer outside the 100-999 range for a\n    /// member targeted by `httpResponseCode`.\n    /// See <https://github.com/awslabs/smithy/issues/1116>.\n    #[error(\"invalid bound HTTP status code; status codes must be inside the 100-999 range: {0}\")]\n    InvalidHttpStatusCode(TryFromIntError),\n\n    /// Used when an invalid HTTP header name (a value that cannot be parsed as an\n    /// [`http::header::HeaderName`]) or HTTP header value (a value that cannot be parsed as an\n    /// [`http::header::HeaderValue`]) is provided for a shape member bound to an HTTP header with\n    /// `httpHeader` or `httpPrefixHeaders`.\n    /// Used when failing to serialize an `httpPayload`-bound struct into an HTTP response body.\n    #[error(\"error building HTTP response: {0}\")]\n    Build(#[from] aws_smithy_types::error::operation::BuildError),\n\n    /// Used when failing to serialize a struct into a `String` for the JSON-encoded HTTP response\n    /// body.\n    /// Fun fact: as of writing, this can only happen when date formatting\n    /// (`aws_smithy_types::date_time::DateTime:fmt`) fails, which can only happen if the\n    /// supplied timestamp is outside of the valid range when formatting using RFC-3339, i.e. a\n    /// date outside the `0001-01-01T00:00:00.000Z`-`9999-12-31T23:59:59.999Z` range is supplied.\n    #[error(\"error serializing JSON-encoded body: {0}\")]\n    Serialization(#[from] aws_smithy_types::error::operation::SerializationError),\n\n    /// Used when consuming an [`http::response::Builder`] into the constructed [`http::Response`]\n    /// when calling [`http::response::Builder::body`].\n    /// This error can happen if an invalid HTTP header value (a value that cannot be parsed as an\n    /// `[http::header::HeaderValue]`) is used for the protocol-specific response `Content-Type`\n    /// header, or for additional protocol-specific headers (like `X-Amzn-Errortype` to signal\n    /// errors in RestJson1).\n    #[error(\"error building HTTP response: {0}\")]\n    HttpBuild(#[from] http::Error),\n}\n\n/// Errors that can occur when deserializing an HTTP request into an _operation input_, the input\n/// that is passed as the first argument to operation handlers.\n///\n/// This type allows us to easily keep track of all the possible errors that can occur in the\n/// lifecycle of an incoming HTTP request.\n///\n/// Many inner code-generated and runtime deserialization functions use this as their error type,\n/// when they can only instantiate a subset of the variants (most likely a single one). This is a\n/// deliberate design choice to keep code generation simple. After all, this type is an inner\n/// detail of the framework the service implementer does not interact with.\n///\n/// If a variant takes in a value, it represents the underlying cause of the error.\n///\n/// The variants are _roughly_ sorted in the order in which the HTTP request is processed.\n#[derive(Debug, Error)]\npub enum RequestRejection {\n    /// Used when failing to convert non-streaming requests into a byte slab with\n    /// `hyper::body::to_bytes`.\n    #[error(\"error converting non-streaming body to bytes: {0}\")]\n    BufferHttpBodyBytes(crate::Error),\n\n    /// Used when the request contained an `Accept` header with a MIME type, and the server cannot\n    /// return a response body adhering to that MIME type.\n    #[error(\"request contains invalid value for `Accept` header\")]\n    NotAcceptable,\n\n    /// Used when checking the `Content-Type` header.\n    /// This is bubbled up in the generated SDK when calling\n    /// [`crate::protocol::content_type_header_classifier_smithy`] in `from_request`.\n    #[error(\"expected `Content-Type` header not found: {0}\")]\n    MissingContentType(#[from] MissingContentTypeReason),\n\n    /// Used when failing to deserialize the HTTP body's bytes into a JSON document conforming to\n    /// the modeled input it should represent.\n    #[error(\"error deserializing request HTTP body as JSON: {0}\")]\n    JsonDeserialize(#[from] aws_smithy_json::deserialize::error::DeserializeError),\n\n    /// Used when failing to parse HTTP headers that are bound to input members with the `httpHeader`\n    /// or the `httpPrefixHeaders` traits.\n    #[error(\"error binding request HTTP headers: {0}\")]\n    HeaderParse(#[from] aws_smithy_legacy_http::header::ParseError),\n\n    // In theory, the next two errors should never happen because the router should have already\n    // rejected the request.\n    /// Used when the URI pattern has a literal after the greedy label, and it is not found in the\n    /// request's URL.\n    #[error(\"request URI does not match pattern because of literal suffix after greedy label was not found\")]\n    UriPatternGreedyLabelPostfixNotFound,\n    /// Used when the `nom` parser's input does not match the URI pattern.\n    #[error(\"request URI does not match `@http` URI pattern: {0}\")]\n    UriPatternMismatch(crate::Error),\n\n    /// Used when percent-decoding URL query string.\n    /// Used when percent-decoding URI path label.\n    /// This is caused when calling\n    /// [`percent_encoding::percent_decode_str`](https://docs.rs/percent-encoding/latest/percent_encoding/fn.percent_decode_str.html).\n    /// This can happen when the percent-encoded data decodes to bytes that are\n    /// not a well-formed UTF-8 string.\n    #[error(\"request URI cannot be percent decoded into valid UTF-8\")]\n    PercentEncodedUriNotValidUtf8(#[from] core::str::Utf8Error),\n\n    /// Used when failing to deserialize strings from a URL query string and from URI path labels\n    /// into an [`aws_smithy_types::DateTime`].\n    #[error(\"error parsing timestamp from request URI: {0}\")]\n    DateTimeParse(#[from] aws_smithy_types::date_time::DateTimeParseError),\n\n    /// Used when failing to deserialize strings from a URL query string and from URI path labels\n    /// into \"primitive\" types.\n    #[error(\"error parsing primitive type from request URI: {0}\")]\n    PrimitiveParse(#[from] aws_smithy_types::primitive::PrimitiveParseError),\n\n    /// Used when consuming the input struct builder, and constraint violations occur.\n    // This rejection is constructed directly in the code-generated SDK instead of in this crate.\n    #[error(\"request does not adhere to modeled constraints: {0}\")]\n    ConstraintViolation(String),\n\n    /// Typically happens when the request has headers that are not valid UTF-8.\n    #[error(\"failed to convert request: {0}\")]\n    HttpConversion(#[from] HttpError),\n}\n\n// Consider a conversion between `T` and `U` followed by a bubbling up of the conversion error\n// through `Result<_, RequestRejection>`. This [`From`] implementation accomodates the special case\n// where `T` and `U` are equal, in such cases `T`/`U` a enjoy `TryFrom<T>` with\n// `Err = std::convert::Infallible`.\n//\n// Note that when `!` stabilizes `std::convert::Infallible` will become an alias for `!` and there\n// will be a blanket `impl From<!> for T`. This will remove the need for this implementation.\n//\n// More details on this can be found in the following links:\n// - https://doc.rust-lang.org/std/primitive.never.html\n// - https://doc.rust-lang.org/std/convert/enum.Infallible.html#future-compatibility\nimpl From<std::convert::Infallible> for RequestRejection {\n    fn from(_err: std::convert::Infallible) -> Self {\n        // We opt for this `match` here rather than [`unreachable`] to assure the reader that this\n        // code path is dead.\n        match _err {}\n    }\n}\n\n// These converters are solely to make code-generation simpler. They convert from a specific error\n// type (from a runtime/third-party crate or the standard library) into a variant of the\n// [`crate::rejection::RequestRejection`] enum holding the type-erased boxed [`crate::Error`]\n// type. Generated functions that use [crate::rejection::RequestRejection] can thus use `?` to\n// bubble up instead of having to sprinkle things like [`Result::map_err`] everywhere.\n\nimpl From<nom::Err<nom::error::Error<&str>>> for RequestRejection {\n    fn from(err: nom::Err<nom::error::Error<&str>>) -> Self {\n        Self::UriPatternMismatch(crate::Error::new(err.to_owned()))\n    }\n}\n\n// `[crate::body::Body]` is `[hyper::Body]`, whose associated `Error` type is `[hyper::Error]`. We\n// need this converter for when we convert the body into bytes in the framework, since protocol\n// tests use `[crate::body::Body]` as their body type when constructing requests (and almost\n// everyone will run a Hyper-based server in their services).\nconvert_to_request_rejection!(hyper::Error, BufferHttpBodyBytes);\n\n// Useful in general, but it also required in order to accept Lambda HTTP requests using\n// `Router<lambda_http::Body>` since `lambda_http::Error` is a type alias for `Box<dyn Error + ..>`.\nconvert_to_request_rejection!(Box<dyn std::error::Error + Send + Sync + 'static>, BufferHttpBodyBytes);\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http-server/src/protocol/rest_json_1/router.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::body::BoxBody;\nuse crate::extension::RuntimeErrorExtension;\nuse crate::response::IntoResponse;\nuse crate::routing::{method_disallowed, UNKNOWN_OPERATION_EXCEPTION};\n\nuse super::RestJson1;\n\npub use crate::protocol::rest::router::*;\n\n// TODO(https://github.com/smithy-lang/smithy/issues/2348): We're probably non-compliant here, but\n// we have no tests to pin our implemenation against!\nimpl IntoResponse<RestJson1> for Error {\n    fn into_response(self) -> http::Response<BoxBody> {\n        match self {\n            Error::NotFound => http::Response::builder()\n                .status(http::StatusCode::NOT_FOUND)\n                .header(http::header::CONTENT_TYPE, \"application/json\")\n                .header(\"X-Amzn-Errortype\", UNKNOWN_OPERATION_EXCEPTION)\n                .extension(RuntimeErrorExtension::new(\n                    UNKNOWN_OPERATION_EXCEPTION.to_string(),\n                ))\n                .body(crate::body::to_boxed(\"{}\"))\n                .expect(\"invalid HTTP response for REST JSON 1 routing error; please file a bug report under https://github.com/smithy-lang/smithy-rs/issues\"),\n            Error::MethodNotAllowed => method_disallowed(),\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http-server/src/protocol/rest_json_1/runtime_error.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Runtime error type.\n//!\n//! This module contains the [`RuntimeError`] type.\n//!\n//! As opposed to rejection types (see [`crate::protocol::rest_json_1::rejection`]), which are an internal detail about\n//! the framework, `RuntimeError` is surfaced to clients in HTTP responses: indeed, it implements\n//! [`RuntimeError::into_response`]. Rejections can be \"grouped\" and converted into a\n//! specific `RuntimeError` kind: for example, all request rejections due to serialization issues\n//! can be conflated under the [`RuntimeError::Serialization`] enum variant.\n//!\n//! The HTTP response representation of the specific `RuntimeError` is protocol-specific: for\n//! example, the runtime error in the [`crate::protocol::rest_json_1`] protocol sets the `X-Amzn-Errortype` header.\n//!\n//! Generated code works always works with [`crate::rejection`] types when deserializing requests\n//! and serializing response. Just before a response needs to be sent, the generated code looks up\n//! and converts into the corresponding `RuntimeError`, and then it uses the its\n//! [`RuntimeError::into_response`] method to render and send a response.\n//!\n//! This module hosts the `RuntimeError` type _specific_ to the [`crate::protocol::rest_json_1`] protocol, but\n//! the paragraphs above apply to _all_ protocol-specific rejection types.\n//!\n//! Similarly, `RuntimeError` variants are exhaustively documented solely in this module if they have\n//! direct counterparts in other protocols. This is to avoid documentation getting out of date.\n//!\n//! Consult `crate::protocol::$protocolName::runtime_error` for the `RuntimeError` type for other protocols.\n\nuse super::rejection::RequestRejection;\nuse super::rejection::ResponseRejection;\nuse super::RestJson1;\nuse crate::extension::RuntimeErrorExtension;\nuse crate::response::IntoResponse;\nuse crate::runtime_error::InternalFailureException;\nuse crate::runtime_error::INVALID_HTTP_RESPONSE_FOR_RUNTIME_ERROR_PANIC_MESSAGE;\nuse http::StatusCode;\n\n#[derive(Debug, thiserror::Error)]\npub enum RuntimeError {\n    /// Request failed to deserialize or response failed to serialize.\n    #[error(\"request failed to deserialize or response failed to serialize: {0}\")]\n    Serialization(crate::Error),\n    /// As of writing, this variant can only occur upon failure to extract an\n    /// [`crate::extension::Extension`] from the request.\n    #[error(\"internal failure: {0}\")]\n    InternalFailure(crate::Error),\n    /// Request contains an `Accept` header with a MIME type, and the server cannot return a response\n    /// body adhering to that MIME type.\n    // This is returned directly (i.e. without going through a [`RequestRejection`] first) in the\n    // generated SDK when calling [`crate::protocol::accept_header_classifier`] in\n    // `from_request`.\n    #[error(\"not acceptable request: request contains an `Accept` header with a MIME type, and the server cannot return a response body adhering to that MIME type\")]\n    NotAcceptable,\n    /// The request does not contain the expected `Content-Type` header value.\n    #[error(\"unsupported media type: request does not contain the expected `Content-Type` header value\")]\n    UnsupportedMediaType,\n    /// Operation input contains data that does not adhere to the modeled [constraint traits].\n    /// [constraint traits]: <https://awslabs.github.io/smithy/2.0/spec/constraint-traits.html>\n    #[error(\"validation failure: operation input contains data that does not adhere to the modeled constraints: {0}\")]\n    Validation(String),\n}\n\nimpl RuntimeError {\n    /// String representation of the `RuntimeError` kind.\n    /// Used as the value passed to construct an [`crate::extension::RuntimeErrorExtension`].\n    /// Used as the value of the `X-Amzn-Errortype` header.\n    pub fn name(&self) -> &'static str {\n        match self {\n            Self::Serialization(_) => \"SerializationException\",\n            Self::InternalFailure(_) => \"InternalFailureException\",\n            Self::NotAcceptable => \"NotAcceptableException\",\n            Self::UnsupportedMediaType => \"UnsupportedMediaTypeException\",\n            Self::Validation(_) => \"ValidationException\",\n        }\n    }\n\n    pub fn status_code(&self) -> StatusCode {\n        match self {\n            Self::Serialization(_) => StatusCode::BAD_REQUEST,\n            Self::InternalFailure(_) => StatusCode::INTERNAL_SERVER_ERROR,\n            Self::NotAcceptable => StatusCode::NOT_ACCEPTABLE,\n            Self::UnsupportedMediaType => StatusCode::UNSUPPORTED_MEDIA_TYPE,\n            Self::Validation(_) => StatusCode::BAD_REQUEST,\n        }\n    }\n}\n\nimpl IntoResponse<RestJson1> for InternalFailureException {\n    fn into_response(self) -> http::Response<crate::body::BoxBody> {\n        IntoResponse::<RestJson1>::into_response(RuntimeError::InternalFailure(crate::Error::new(String::new())))\n    }\n}\n\nimpl IntoResponse<RestJson1> for RuntimeError {\n    fn into_response(self) -> http::Response<crate::body::BoxBody> {\n        let res = http::Response::builder()\n            .status(self.status_code())\n            .header(\"Content-Type\", \"application/json\")\n            .header(\"X-Amzn-Errortype\", self.name())\n            .extension(RuntimeErrorExtension::new(self.name().to_string()));\n\n        let body = match self {\n            RuntimeError::Validation(reason) => crate::body::to_boxed(reason),\n            _ => crate::body::to_boxed(\"{}\"),\n        };\n\n        res.body(body)\n            .expect(INVALID_HTTP_RESPONSE_FOR_RUNTIME_ERROR_PANIC_MESSAGE)\n    }\n}\n\nimpl From<ResponseRejection> for RuntimeError {\n    fn from(err: ResponseRejection) -> Self {\n        Self::Serialization(crate::Error::new(err))\n    }\n}\n\nimpl From<RequestRejection> for RuntimeError {\n    fn from(err: RequestRejection) -> Self {\n        match err {\n            RequestRejection::MissingContentType(_reason) => Self::UnsupportedMediaType,\n            RequestRejection::ConstraintViolation(reason) => Self::Validation(reason),\n            RequestRejection::NotAcceptable => Self::NotAcceptable,\n            _ => Self::Serialization(crate::Error::new(err)),\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http-server/src/protocol/rest_xml/mod.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npub mod rejection;\npub mod router;\npub mod runtime_error;\n\n/// [AWS restXml](https://smithy.io/2.0/aws/protocols/aws-restxml-protocol.html) protocol.\npub struct RestXml;\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http-server/src/protocol/rest_xml/rejection.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! This module hosts _exactly_ the same as [`crate::protocol::rest_json_1::rejection`], except that\n//! [`crate::protocol::rest_json_1::rejection::RequestRejection::JsonDeserialize`] is swapped for\n//! [`RequestRejection::XmlDeserialize`].\n\nuse crate::rejection::MissingContentTypeReason;\nuse aws_smithy_runtime_api::http::HttpError;\nuse std::num::TryFromIntError;\nuse thiserror::Error;\n\n#[derive(Debug, Error)]\npub enum ResponseRejection {\n    #[error(\"invalid bound HTTP status code; status codes must be inside the 100-999 range: {0}\")]\n    InvalidHttpStatusCode(TryFromIntError),\n    #[error(\"error building HTTP response: {0}\")]\n    Build(#[from] aws_smithy_types::error::operation::BuildError),\n    #[error(\"error serializing XML-encoded body: {0}\")]\n    Serialization(#[from] aws_smithy_types::error::operation::SerializationError),\n    #[error(\"error building HTTP response: {0}\")]\n    HttpBuild(#[from] http::Error),\n}\n\n#[derive(Debug, Error)]\npub enum RequestRejection {\n    #[error(\"error converting non-streaming body to bytes: {0}\")]\n    BufferHttpBodyBytes(crate::Error),\n\n    #[error(\"request contains invalid value for `Accept` header\")]\n    NotAcceptable,\n\n    #[error(\"expected `Content-Type` header not found: {0}\")]\n    MissingContentType(#[from] MissingContentTypeReason),\n\n    /// Used when failing to deserialize the HTTP body's bytes into a XML conforming to the modeled\n    /// input it should represent.\n    #[error(\"error deserializing request HTTP body as XML: {0}\")]\n    XmlDeserialize(#[from] aws_smithy_xml::decode::XmlDecodeError),\n\n    #[error(\"error binding request HTTP headers: {0}\")]\n    HeaderParse(#[from] aws_smithy_legacy_http::header::ParseError),\n\n    #[error(\"request URI does not match pattern because of literal suffix after greedy label was not found\")]\n    UriPatternGreedyLabelPostfixNotFound,\n    #[error(\"request URI does not match `@http` URI pattern: {0}\")]\n    UriPatternMismatch(crate::Error),\n\n    #[error(\"request URI cannot be percent decoded into valid UTF-8\")]\n    PercentEncodedUriNotValidUtf8(#[from] core::str::Utf8Error),\n\n    #[error(\"error parsing timestamp from request URI: {0}\")]\n    DateTimeParse(#[from] aws_smithy_types::date_time::DateTimeParseError),\n\n    #[error(\"error parsing primitive type from request URI: {0}\")]\n    PrimitiveParse(#[from] aws_smithy_types::primitive::PrimitiveParseError),\n\n    #[error(\"request does not adhere to modeled constraints: {0}\")]\n    ConstraintViolation(String),\n\n    /// Typically happens when the request has headers that are not valid UTF-8.\n    #[error(\"failed to convert request: {0}\")]\n    HttpConversion(#[from] HttpError),\n}\n\nimpl From<std::convert::Infallible> for RequestRejection {\n    fn from(_err: std::convert::Infallible) -> Self {\n        match _err {}\n    }\n}\n\nimpl From<nom::Err<nom::error::Error<&str>>> for RequestRejection {\n    fn from(err: nom::Err<nom::error::Error<&str>>) -> Self {\n        Self::UriPatternMismatch(crate::Error::new(err.to_owned()))\n    }\n}\n\nconvert_to_request_rejection!(hyper::Error, BufferHttpBodyBytes);\nconvert_to_request_rejection!(Box<dyn std::error::Error + Send + Sync + 'static>, BufferHttpBodyBytes);\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http-server/src/protocol/rest_xml/router.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::body::empty;\nuse crate::body::BoxBody;\nuse crate::extension::RuntimeErrorExtension;\nuse crate::response::IntoResponse;\nuse crate::routing::{method_disallowed, UNKNOWN_OPERATION_EXCEPTION};\n\nuse super::RestXml;\n\npub use crate::protocol::rest::router::*;\n\n// TODO(https://github.com/smithy-lang/smithy/issues/2348): We're probably non-compliant here, but\n// we have no tests to pin our implemenation against!\nimpl IntoResponse<RestXml> for Error {\n    fn into_response(self) -> http::Response<BoxBody> {\n        match self {\n            Error::NotFound => http::Response::builder()\n                .status(http::StatusCode::NOT_FOUND)\n                .header(http::header::CONTENT_TYPE, \"application/xml\")\n                .extension(RuntimeErrorExtension::new(\n                    UNKNOWN_OPERATION_EXCEPTION.to_string(),\n                ))\n                .body(empty())\n                .expect(\"invalid HTTP response for REST XML routing error; please file a bug report under https://github.com/smithy-lang/smithy-rs/issues\"),\n            Error::MethodNotAllowed => method_disallowed(),\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http-server/src/protocol/rest_xml/runtime_error.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::protocol::rest_xml::RestXml;\nuse crate::response::IntoResponse;\nuse crate::runtime_error::InternalFailureException;\nuse crate::{extension::RuntimeErrorExtension, runtime_error::INVALID_HTTP_RESPONSE_FOR_RUNTIME_ERROR_PANIC_MESSAGE};\nuse http::StatusCode;\n\nuse super::rejection::{RequestRejection, ResponseRejection};\n\n#[derive(Debug, thiserror::Error)]\npub enum RuntimeError {\n    /// See: [`crate::protocol::rest_json_1::runtime_error::RuntimeError::Serialization`]\n    #[error(\"request failed to deserialize or response failed to serialize: {0}\")]\n    Serialization(crate::Error),\n    /// See: [`crate::protocol::rest_json_1::runtime_error::RuntimeError::InternalFailure`]\n    #[error(\"internal failure: {0}\")]\n    InternalFailure(crate::Error),\n    /// See: [`crate::protocol::rest_json_1::runtime_error::RuntimeError::NotAcceptable`]\n    #[error(\"not acceptable request: request contains an `Accept` header with a MIME type, and the server cannot return a response body adhering to that MIME type\")]\n    NotAcceptable,\n    /// See: [`crate::protocol::rest_json_1::runtime_error::RuntimeError::UnsupportedMediaType`]\n    #[error(\"unsupported media type: request does not contain the expected `Content-Type` header value\")]\n    UnsupportedMediaType,\n    /// See: [`crate::protocol::rest_json_1::runtime_error::RuntimeError::Validation`]\n    #[error(\"validation failure: operation input contains data that does not adhere to the modeled constraints: {0}\")]\n    Validation(String),\n}\n\nimpl RuntimeError {\n    pub fn name(&self) -> &'static str {\n        match self {\n            Self::Serialization(_) => \"SerializationException\",\n            Self::InternalFailure(_) => \"InternalFailureException\",\n            Self::NotAcceptable => \"NotAcceptableException\",\n            Self::UnsupportedMediaType => \"UnsupportedMediaTypeException\",\n            Self::Validation(_) => \"ValidationException\",\n        }\n    }\n\n    pub fn status_code(&self) -> StatusCode {\n        match self {\n            Self::Serialization(_) => StatusCode::BAD_REQUEST,\n            Self::InternalFailure(_) => StatusCode::INTERNAL_SERVER_ERROR,\n            Self::NotAcceptable => StatusCode::NOT_ACCEPTABLE,\n            Self::UnsupportedMediaType => StatusCode::UNSUPPORTED_MEDIA_TYPE,\n            Self::Validation(_) => StatusCode::BAD_REQUEST,\n        }\n    }\n}\n\nimpl IntoResponse<RestXml> for InternalFailureException {\n    fn into_response(self) -> http::Response<crate::body::BoxBody> {\n        IntoResponse::<RestXml>::into_response(RuntimeError::InternalFailure(crate::Error::new(String::new())))\n    }\n}\n\nimpl IntoResponse<RestXml> for RuntimeError {\n    fn into_response(self) -> http::Response<crate::body::BoxBody> {\n        let res = http::Response::builder()\n            .status(self.status_code())\n            .header(\"Content-Type\", \"application/xml\")\n            .extension(RuntimeErrorExtension::new(self.name().to_string()));\n\n        let body = crate::body::to_boxed(\"{}\");\n\n        res.body(body)\n            .expect(INVALID_HTTP_RESPONSE_FOR_RUNTIME_ERROR_PANIC_MESSAGE)\n    }\n}\n\nimpl From<ResponseRejection> for RuntimeError {\n    fn from(err: ResponseRejection) -> Self {\n        Self::Serialization(crate::Error::new(err))\n    }\n}\n\nimpl From<RequestRejection> for RuntimeError {\n    fn from(err: RequestRejection) -> Self {\n        match err {\n            RequestRejection::MissingContentType(_reason) => Self::UnsupportedMediaType,\n            RequestRejection::ConstraintViolation(reason) => Self::Validation(reason),\n            _ => Self::Serialization(crate::Error::new(err)),\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http-server/src/protocol/rpc_v2_cbor/mod.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npub mod rejection;\npub mod router;\npub mod runtime_error;\n\n/// [Smithy RPC v2 CBOR](https://smithy.io/2.0/additional-specs/protocols/smithy-rpc-v2.html)\n/// protocol.\npub struct RpcV2Cbor;\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http-server/src/protocol/rpc_v2_cbor/rejection.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::num::TryFromIntError;\n\nuse crate::rejection::MissingContentTypeReason;\nuse aws_smithy_runtime_api::http::HttpError;\nuse thiserror::Error;\n\n#[derive(Debug, Error)]\npub enum ResponseRejection {\n    #[error(\"invalid bound HTTP status code; status codes must be inside the 100-999 range: {0}\")]\n    InvalidHttpStatusCode(TryFromIntError),\n    #[error(\"error serializing CBOR-encoded body: {0}\")]\n    Serialization(#[from] aws_smithy_types::error::operation::SerializationError),\n    #[error(\"error building HTTP response: {0}\")]\n    HttpBuild(#[from] http::Error),\n}\n\n#[derive(Debug, Error)]\npub enum RequestRejection {\n    #[error(\"error converting non-streaming body to bytes: {0}\")]\n    BufferHttpBodyBytes(crate::Error),\n    #[error(\"request contains invalid value for `Accept` header\")]\n    NotAcceptable,\n    #[error(\"expected `Content-Type` header not found: {0}\")]\n    MissingContentType(#[from] MissingContentTypeReason),\n    #[error(\"error deserializing request HTTP body as CBOR: {0}\")]\n    CborDeserialize(#[from] aws_smithy_cbor::decode::DeserializeError),\n    // Unlike the other protocols, RPC v2 uses CBOR, a binary serialization format, so we take in a\n    // `Vec<u8>` here instead of `String`.\n    #[error(\"request does not adhere to modeled constraints\")]\n    ConstraintViolation(Vec<u8>),\n\n    /// Typically happens when the request has headers that are not valid UTF-8.\n    #[error(\"failed to convert request: {0}\")]\n    HttpConversion(#[from] HttpError),\n}\n\nimpl From<std::convert::Infallible> for RequestRejection {\n    fn from(_err: std::convert::Infallible) -> Self {\n        match _err {}\n    }\n}\n\nconvert_to_request_rejection!(hyper::Error, BufferHttpBodyBytes);\nconvert_to_request_rejection!(Box<dyn std::error::Error + Send + Sync + 'static>, BufferHttpBodyBytes);\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http-server/src/protocol/rpc_v2_cbor/router.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::convert::Infallible;\nuse std::str::FromStr;\nuse std::sync::LazyLock;\n\nuse http::header::ToStrError;\nuse http::HeaderMap;\nuse regex::Regex;\nuse thiserror::Error;\nuse tower::Layer;\nuse tower::Service;\n\nuse crate::body::empty;\nuse crate::body::BoxBody;\nuse crate::extension::RuntimeErrorExtension;\nuse crate::protocol::aws_json_11::router::ROUTE_CUTOFF;\nuse crate::response::IntoResponse;\nuse crate::routing::tiny_map::TinyMap;\nuse crate::routing::Route;\nuse crate::routing::Router;\nuse crate::routing::{method_disallowed, UNKNOWN_OPERATION_EXCEPTION};\n\nuse super::RpcV2Cbor;\n\npub use crate::protocol::rest::router::*;\n\n/// An RPC v2 CBOR routing error.\n#[derive(Debug, Error)]\npub enum Error {\n    /// Method was not `POST`.\n    #[error(\"method not POST\")]\n    MethodNotAllowed,\n    /// Requests for the `rpcv2Cbor` protocol MUST NOT contain an `x-amz-target` or `x-amzn-target`\n    /// header.\n    #[error(\"contains forbidden headers\")]\n    ForbiddenHeaders,\n    /// Unable to parse `smithy-protocol` header into a valid wire format value.\n    #[error(\"failed to parse `smithy-protocol` header into a valid wire format value\")]\n    InvalidWireFormatHeader(#[from] WireFormatError),\n    /// Operation not found.\n    #[error(\"operation not found\")]\n    NotFound,\n}\n\n/// A [`Router`] supporting the [Smithy RPC v2 CBOR] protocol.\n///\n/// [Smithy RPC v2 CBOR]: https://smithy.io/2.0/additional-specs/protocols/smithy-rpc-v2.html\n#[derive(Debug, Clone)]\npub struct RpcV2CborRouter<S> {\n    routes: TinyMap<&'static str, S, ROUTE_CUTOFF>,\n}\n\n/// Requests for the `rpcv2Cbor` protocol MUST NOT contain an `x-amz-target` or `x-amzn-target`\n/// header. An `rpcv2Cbor` request is malformed if it contains either of these headers. Server-side\n/// implementations MUST reject such requests for security reasons.\nconst FORBIDDEN_HEADERS: &[&str] = &[\"x-amz-target\", \"x-amzn-target\"];\n\n/// Matches the `Identifier` ABNF rule in\n/// <https://smithy.io/2.0/spec/model.html#shape-id-abnf>.\nconst IDENTIFIER_PATTERN: &str = r#\"((_+([A-Za-z]|[0-9]))|[A-Za-z])[A-Za-z0-9_]*\"#;\n\nimpl<S> RpcV2CborRouter<S> {\n    // TODO(https://github.com/smithy-lang/smithy-rs/issues/3748) Consider building a nom parser.\n    fn uri_path_regex() -> &'static Regex {\n        // Every request for the `rpcv2Cbor` protocol MUST be sent to a URL with the\n        // following form: `{prefix?}/service/{serviceName}/operation/{operationName}`\n        //\n        // * The optional `prefix` segment may span multiple path segments and is not\n        //   utilized by the Smithy RPC v2 CBOR protocol. For example, a service could\n        //   use a `v1` prefix for the following URL path: `v1/service/FooService/operation/BarOperation`\n        // * The `serviceName` segment MUST be replaced by the [`shape\n        //   name`](https://smithy.io/2.0/spec/model.html#grammar-token-smithy-Identifier)\n        //   of the service's [Shape ID](https://smithy.io/2.0/spec/model.html#shape-id)\n        //   in the Smithy model. The `serviceName` produced by client implementations\n        //   MUST NOT contain the namespace of the `service` shape. Service\n        //   implementations SHOULD accept an absolute shape ID as the content of this\n        //   segment with the `#` character replaced with a `.` character, routing it\n        //   the same as if only the name was specified. For example, if the `service`'s\n        //   absolute shape ID is `com.example#TheService`, a service should accept both\n        //   `TheService` and `com.example.TheService` as values for the `serviceName`\n        //   segment.\n        static PATH_REGEX: LazyLock<Regex> = LazyLock::new(|| {\n            Regex::new(&format!(\n                r#\"/service/({IDENTIFIER_PATTERN}\\.)*(?P<service>{IDENTIFIER_PATTERN})/operation/(?P<operation>{IDENTIFIER_PATTERN})$\"#,\n            ))\n            .unwrap()\n        });\n\n        &PATH_REGEX\n    }\n\n    pub fn wire_format_regex() -> &'static Regex {\n        static SMITHY_PROTOCOL_REGEX: LazyLock<Regex> =\n            LazyLock::new(|| Regex::new(r#\"^rpc-v2-(?P<format>\\w+)$\"#).unwrap());\n\n        &SMITHY_PROTOCOL_REGEX\n    }\n\n    pub fn boxed<B>(self) -> RpcV2CborRouter<Route<B>>\n    where\n        S: Service<http::Request<B>, Response = http::Response<BoxBody>, Error = Infallible>,\n        S: Send + Clone + 'static,\n        S::Future: Send + 'static,\n    {\n        RpcV2CborRouter {\n            routes: self.routes.into_iter().map(|(key, s)| (key, Route::new(s))).collect(),\n        }\n    }\n\n    /// Applies a [`Layer`] uniformly to all routes.\n    pub fn layer<L>(self, layer: L) -> RpcV2CborRouter<L::Service>\n    where\n        L: Layer<S>,\n    {\n        RpcV2CborRouter {\n            routes: self\n                .routes\n                .into_iter()\n                .map(|(key, route)| (key, layer.layer(route)))\n                .collect(),\n        }\n    }\n}\n\n// TODO(https://github.com/smithy-lang/smithy/issues/2348): We're probably non-compliant here, but\n// we have no tests to pin our implemenation against!\nimpl IntoResponse<RpcV2Cbor> for Error {\n    fn into_response(self) -> http::Response<BoxBody> {\n        match self {\n            Error::MethodNotAllowed => method_disallowed(),\n            _ => http::Response::builder()\n                .status(http::StatusCode::NOT_FOUND)\n                .header(http::header::CONTENT_TYPE, \"application/cbor\")\n                .extension(RuntimeErrorExtension::new(\n                    UNKNOWN_OPERATION_EXCEPTION.to_string(),\n                ))\n                .body(empty())\n                .expect(\"invalid HTTP response for RPCv2 CBOR routing error; please file a bug report under https://github.com/awslabs/smithy-rs/issues\"),\n        }\n    }\n}\n\n/// Errors that can happen when parsing the wire format from the `smithy-protocol` header.\n#[derive(Debug, Error)]\npub enum WireFormatError {\n    /// Header not found.\n    #[error(\"`smithy-protocol` header not found\")]\n    HeaderNotFound,\n    /// Header value is not visible ASCII.\n    #[error(\"`smithy-protocol` header not visible ASCII\")]\n    HeaderValueNotVisibleAscii(ToStrError),\n    /// Header value does not match the `rpc-v2-{format}` pattern. The actual parsed header value\n    /// is stored in the tuple struct.\n    // https://doc.rust-lang.org/std/fmt/index.html#escaping\n    #[error(\"`smithy-protocol` header does not match the `rpc-v2-{{format}}` pattern: `{0}`\")]\n    HeaderValueNotValid(String),\n    /// Header value matches the `rpc-v2-{format}` pattern, but the `format` is not supported. The\n    /// actual parsed header value is stored in the tuple struct.\n    #[error(\"found unsupported `smithy-protocol` wire format: `{0}`\")]\n    WireFormatNotSupported(String),\n}\n\n/// Smithy RPC V2 requests have a `smithy-protocol` header with the value\n/// `\"rpc-v2-{format}\"`, where `format` is one of the supported wire formats\n/// by the protocol (see [`WireFormat`]).\nfn parse_wire_format_from_header(headers: &HeaderMap) -> Result<WireFormat, WireFormatError> {\n    let header = headers.get(\"smithy-protocol\").ok_or(WireFormatError::HeaderNotFound)?;\n    let header = header.to_str().map_err(WireFormatError::HeaderValueNotVisibleAscii)?;\n    let captures = RpcV2CborRouter::<()>::wire_format_regex()\n        .captures(header)\n        .ok_or_else(|| WireFormatError::HeaderValueNotValid(header.to_owned()))?;\n\n    let format = captures\n        .name(\"format\")\n        .ok_or_else(|| WireFormatError::HeaderValueNotValid(header.to_owned()))?;\n\n    let wire_format_parse_res: Result<WireFormat, WireFormatFromStrError> = format.as_str().parse();\n    wire_format_parse_res.map_err(|_| WireFormatError::WireFormatNotSupported(header.to_owned()))\n}\n\n/// Supported wire formats by RPC V2.\nenum WireFormat {\n    Cbor,\n}\n\nstruct WireFormatFromStrError;\n\nimpl FromStr for WireFormat {\n    type Err = WireFormatFromStrError;\n\n    fn from_str(format: &str) -> Result<Self, Self::Err> {\n        match format {\n            \"cbor\" => Ok(Self::Cbor),\n            _ => Err(WireFormatFromStrError),\n        }\n    }\n}\n\nimpl<S: Clone, B> Router<B> for RpcV2CborRouter<S> {\n    type Service = S;\n\n    type Error = Error;\n\n    fn match_route(&self, request: &http::Request<B>) -> Result<Self::Service, Self::Error> {\n        // Only `Method::POST` is allowed.\n        if request.method() != http::Method::POST {\n            return Err(Error::MethodNotAllowed);\n        }\n\n        // Some headers are not allowed.\n        let request_has_forbidden_header = FORBIDDEN_HEADERS\n            .iter()\n            .any(|&forbidden_header| request.headers().contains_key(forbidden_header));\n        if request_has_forbidden_header {\n            return Err(Error::ForbiddenHeaders);\n        }\n\n        // Wire format has to be specified and supported.\n        let _wire_format = parse_wire_format_from_header(request.headers())?;\n\n        // Extract the service name and the operation name from the request URI.\n        let request_path = request.uri().path();\n        let regex = Self::uri_path_regex();\n\n        tracing::trace!(%request_path, \"capturing service and operation from URI\");\n        let captures = regex.captures(request_path).ok_or(Error::NotFound)?;\n        let (service, operation) = (&captures[\"service\"], &captures[\"operation\"]);\n        tracing::trace!(%service, %operation, \"captured service and operation from URI\");\n\n        // Lookup in the `TinyMap` for a route for the target.\n        let route = self\n            .routes\n            .get((format!(\"{service}.{operation}\")).as_str())\n            .ok_or(Error::NotFound)?;\n        Ok(route.clone())\n    }\n}\n\nimpl<S> FromIterator<(&'static str, S)> for RpcV2CborRouter<S> {\n    #[inline]\n    fn from_iter<T: IntoIterator<Item = (&'static str, S)>>(iter: T) -> Self {\n        Self {\n            routes: iter.into_iter().collect(),\n        }\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use http::{HeaderMap, HeaderValue, Method};\n    use regex::Regex;\n\n    use crate::protocol::test_helpers::req;\n\n    use super::{Error, Router, RpcV2CborRouter};\n\n    fn identifier_regex() -> Regex {\n        Regex::new(&format!(\"^{}$\", super::IDENTIFIER_PATTERN)).unwrap()\n    }\n\n    #[test]\n    fn valid_identifiers() {\n        let valid_identifiers = vec![\"a\", \"_a\", \"_0\", \"__0\", \"variable123\", \"_underscored_variable\"];\n\n        for id in &valid_identifiers {\n            assert!(identifier_regex().is_match(id), \"'{id}' is incorrectly rejected\");\n        }\n    }\n\n    #[test]\n    fn invalid_identifiers() {\n        let invalid_identifiers = vec![\n            \"0\",\n            \"123starts_with_digit\",\n            \"@invalid_start_character\",\n            \" space_in_identifier\",\n            \"invalid-character\",\n            \"invalid@character\",\n            \"no#hashes\",\n        ];\n\n        for id in &invalid_identifiers {\n            assert!(!identifier_regex().is_match(id), \"'{id}' is incorrectly accepted\");\n        }\n    }\n\n    #[test]\n    fn uri_regex_works_accepts() {\n        let regex = RpcV2CborRouter::<()>::uri_path_regex();\n\n        for uri in [\n            \"/service/Service/operation/Operation\",\n            \"prefix/69/service/Service/operation/Operation\",\n            // Here the prefix is up to the last occurrence of the string `/service`.\n            \"prefix/69/service/Service/operation/Operation/service/Service/operation/Operation\",\n            // Service implementations SHOULD accept an absolute shape ID as the content of this\n            // segment with the `#` character replaced with a `.` character, routing it the same as\n            // if only the name was specified. For example, if the `service`'s absolute shape ID is\n            // `com.example#TheService`, a service should accept both `TheService` and\n            // `com.example.TheService` as values for the `serviceName` segment.\n            \"/service/aws.protocoltests.rpcv2Cbor.Service/operation/Operation\",\n            \"/service/namespace.Service/operation/Operation\",\n        ] {\n            let captures = regex.captures(uri).unwrap();\n            assert_eq!(\"Service\", &captures[\"service\"], \"uri: {uri}\");\n            assert_eq!(\"Operation\", &captures[\"operation\"], \"uri: {uri}\");\n        }\n    }\n\n    #[test]\n    fn uri_regex_works_rejects() {\n        let regex = RpcV2CborRouter::<()>::uri_path_regex();\n\n        for uri in [\n            \"\",\n            \"foo\",\n            \"/servicee/Service/operation/Operation\",\n            \"/service/Service\",\n            \"/service/Service/operation/\",\n            \"/service/Service/operation/Operation/\",\n            \"/service/Service/operation/Operation/invalid-suffix\",\n            \"/service/namespace.foo#Service/operation/Operation\",\n            \"/service/namespace-Service/operation/Operation\",\n            \"/service/.Service/operation/Operation\",\n        ] {\n            assert!(regex.captures(uri).is_none(), \"uri: {uri}\");\n        }\n    }\n\n    #[test]\n    fn wire_format_regex_works() {\n        let regex = RpcV2CborRouter::<()>::wire_format_regex();\n\n        let captures = regex.captures(\"rpc-v2-something\").unwrap();\n        assert_eq!(\"something\", &captures[\"format\"]);\n\n        let captures = regex.captures(\"rpc-v2-SomethingElse\").unwrap();\n        assert_eq!(\"SomethingElse\", &captures[\"format\"]);\n\n        let invalid = regex.captures(\"rpc-v1-something\");\n        assert!(invalid.is_none());\n    }\n\n    /// Helper function returning the only strictly required header.\n    fn headers() -> HeaderMap {\n        let mut headers = HeaderMap::new();\n        headers.insert(\"smithy-protocol\", HeaderValue::from_static(\"rpc-v2-cbor\"));\n        headers\n    }\n\n    #[test]\n    fn simple_routing() {\n        let router: RpcV2CborRouter<_> = [\"Service.Operation\"].into_iter().map(|op| (op, ())).collect();\n        let good_uri = \"/prefix/service/Service/operation/Operation\";\n\n        // The request should match.\n        let routing_result = router.match_route(&req(&Method::POST, good_uri, Some(headers())));\n        assert!(routing_result.is_ok());\n\n        // The request would be valid if it used `Method::POST`.\n        let invalid_request = req(&Method::GET, good_uri, Some(headers()));\n        assert!(matches!(\n            router.match_route(&invalid_request),\n            Err(Error::MethodNotAllowed)\n        ));\n\n        // The request would be valid if it did not have forbidden headers.\n        for forbidden_header_name in [\"x-amz-target\", \"x-amzn-target\"] {\n            let mut headers = headers();\n            headers.insert(forbidden_header_name, HeaderValue::from_static(\"Service.Operation\"));\n            let invalid_request = req(&Method::POST, good_uri, Some(headers));\n            assert!(matches!(\n                router.match_route(&invalid_request),\n                Err(Error::ForbiddenHeaders)\n            ));\n        }\n\n        for bad_uri in [\n            // These requests would be valid if they used correct URIs.\n            \"/prefix/Service/Service/operation/Operation\",\n            \"/prefix/service/Service/operation/Operation/suffix\",\n            // These requests would be valid if their URI matched an existing operation.\n            \"/prefix/service/ThisServiceDoesNotExist/operation/Operation\",\n            \"/prefix/service/Service/operation/ThisOperationDoesNotExist\",\n        ] {\n            let invalid_request = &req(&Method::POST, bad_uri, Some(headers()));\n            assert!(matches!(router.match_route(invalid_request), Err(Error::NotFound)));\n        }\n\n        // The request would be valid if it specified a supported wire format in the\n        // `smithy-protocol` header.\n        for header_name in [\"bad-header\", \"rpc-v2-json\", \"foo-rpc-v2-cbor\", \"rpc-v2-cbor-foo\"] {\n            let mut headers = HeaderMap::new();\n            headers.insert(\"smithy-protocol\", HeaderValue::from_static(header_name));\n            let invalid_request = &req(&Method::POST, good_uri, Some(headers));\n            assert!(matches!(\n                router.match_route(invalid_request),\n                Err(Error::InvalidWireFormatHeader(_))\n            ));\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http-server/src/protocol/rpc_v2_cbor/runtime_error.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::response::IntoResponse;\nuse crate::runtime_error::{InternalFailureException, INVALID_HTTP_RESPONSE_FOR_RUNTIME_ERROR_PANIC_MESSAGE};\nuse crate::{extension::RuntimeErrorExtension, protocol::rpc_v2_cbor::RpcV2Cbor};\nuse bytes::Bytes;\nuse http::StatusCode;\n\nuse super::rejection::{RequestRejection, ResponseRejection};\n\n#[derive(Debug, thiserror::Error)]\npub enum RuntimeError {\n    /// See: [`crate::protocol::rest_json_1::runtime_error::RuntimeError::Serialization`]\n    #[error(\"request failed to deserialize or response failed to serialize: {0}\")]\n    Serialization(crate::Error),\n    /// See: [`crate::protocol::rest_json_1::runtime_error::RuntimeError::InternalFailure`]\n    #[error(\"internal failure: {0}\")]\n    InternalFailure(crate::Error),\n    /// See: [`crate::protocol::rest_json_1::runtime_error::RuntimeError::NotAcceptable`]\n    #[error(\"not acceptable request: request contains an `Accept` header with a MIME type, and the server cannot return a response body adhering to that MIME type\")]\n    NotAcceptable,\n    /// See: [`crate::protocol::rest_json_1::runtime_error::RuntimeError::UnsupportedMediaType`]\n    #[error(\"unsupported media type: request does not contain the expected `Content-Type` header value\")]\n    UnsupportedMediaType,\n    /// See: [`crate::protocol::rest_json_1::runtime_error::RuntimeError::Validation`]\n    #[error(\n        \"validation failure: operation input contains data that does not adhere to the modeled constraints: {0:?}\"\n    )]\n    Validation(Vec<u8>),\n}\n\nimpl RuntimeError {\n    pub fn name(&self) -> &'static str {\n        match self {\n            Self::Serialization(_) => \"SerializationException\",\n            Self::InternalFailure(_) => \"InternalFailureException\",\n            Self::NotAcceptable => \"NotAcceptableException\",\n            Self::UnsupportedMediaType => \"UnsupportedMediaTypeException\",\n            Self::Validation(_) => \"ValidationException\",\n        }\n    }\n\n    pub fn status_code(&self) -> StatusCode {\n        match self {\n            Self::Serialization(_) => StatusCode::BAD_REQUEST,\n            Self::InternalFailure(_) => StatusCode::INTERNAL_SERVER_ERROR,\n            Self::NotAcceptable => StatusCode::NOT_ACCEPTABLE,\n            Self::UnsupportedMediaType => StatusCode::UNSUPPORTED_MEDIA_TYPE,\n            Self::Validation(_) => StatusCode::BAD_REQUEST,\n        }\n    }\n}\n\nimpl IntoResponse<RpcV2Cbor> for InternalFailureException {\n    fn into_response(self) -> http::Response<crate::body::BoxBody> {\n        IntoResponse::<RpcV2Cbor>::into_response(RuntimeError::InternalFailure(crate::Error::new(String::new())))\n    }\n}\n\nimpl IntoResponse<RpcV2Cbor> for RuntimeError {\n    fn into_response(self) -> http::Response<crate::body::BoxBody> {\n        let res = http::Response::builder()\n            .status(self.status_code())\n            .header(\"Content-Type\", \"application/cbor\")\n            .extension(RuntimeErrorExtension::new(self.name().to_string()));\n\n        // https://cbor.nemo157.com/#type=hex&value=a0\n        const EMPTY_CBOR_MAP: Bytes = Bytes::from_static(&[0xa0]);\n\n        // TODO(https://github.com/smithy-lang/smithy-rs/issues/3716): we're not serializing\n        // `__type`.\n        let body = match self {\n            RuntimeError::Validation(reason) => crate::body::to_boxed(reason),\n            _ => crate::body::to_boxed(EMPTY_CBOR_MAP),\n        };\n\n        res.body(body)\n            .expect(INVALID_HTTP_RESPONSE_FOR_RUNTIME_ERROR_PANIC_MESSAGE)\n    }\n}\n\nimpl From<ResponseRejection> for RuntimeError {\n    fn from(err: ResponseRejection) -> Self {\n        Self::Serialization(crate::Error::new(err))\n    }\n}\n\nimpl From<RequestRejection> for RuntimeError {\n    fn from(err: RequestRejection) -> Self {\n        match err {\n            RequestRejection::ConstraintViolation(reason) => Self::Validation(reason),\n            _ => Self::Serialization(crate::Error::new(err)),\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http-server/src/rejection.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::response::IntoResponse;\nuse thiserror::Error;\n\n// This is used across different protocol-specific `rejection` modules.\n#[derive(Debug, Error)]\npub enum MissingContentTypeReason {\n    #[error(\"headers taken by another extractor\")]\n    HeadersTakenByAnotherExtractor,\n    #[error(\"invalid `Content-Type` header value mime type: {0}\")]\n    MimeParseError(mime::FromStrError),\n    #[error(\"unexpected `Content-Type` header value; expected mime {expected_mime:?}, found mime {found_mime:?}\")]\n    UnexpectedMimeType {\n        expected_mime: Option<mime::Mime>,\n        found_mime: Option<mime::Mime>,\n    },\n}\n\npub mod any_rejections {\n    //! This module hosts enums, up to size 8, which implement [`IntoResponse`] when their variants implement\n    //! [`IntoResponse`].\n\n    use super::IntoResponse;\n    use thiserror::Error;\n\n    macro_rules! any_rejection {\n        ($name:ident, $($var:ident),+) => (\n            #[derive(Debug, Error)]\n            pub enum $name<$($var),*> {\n                $(\n                    #[error(\"{0}\")]\n                    $var($var),\n                )*\n            }\n\n            impl<P, $($var,)*> IntoResponse<P> for $name<$($var),*>\n            where\n                $($var: IntoResponse<P>,)*\n            {\n                #[allow(non_snake_case)]\n                fn into_response(self) -> http::Response<crate::body::BoxBody> {\n                    match self {\n                        $($name::$var ($var) => $var.into_response(),)*\n                    }\n                }\n            }\n        )\n    }\n\n    // any_rejection!(One, A);\n    any_rejection!(Two, A, B);\n    any_rejection!(Three, A, B, C);\n    any_rejection!(Four, A, B, C, D);\n    any_rejection!(Five, A, B, C, D, E);\n    any_rejection!(Six, A, B, C, D, E, F);\n    any_rejection!(Seven, A, B, C, D, E, F, G);\n    any_rejection!(Eight, A, B, C, D, E, F, G, H);\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http-server/src/request/connect_info.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! The [`ConnectInfo`] struct is included in [`http::Request`]s when\n//! [`IntoMakeServiceWithConnectInfo`](crate::routing::IntoMakeServiceWithConnectInfo) is used. [`ConnectInfo`]'s\n//! [`FromParts`] implementation allows it to be extracted from the [`http::Request`].\n//!\n//! The [`example service`](https://github.com/smithy-lang/smithy-rs/blob/main/examples/pokemon-service/src/main.rs)\n//! illustrates the use of [`IntoMakeServiceWithConnectInfo`](crate::routing::IntoMakeServiceWithConnectInfo)\n//! and [`ConnectInfo`] with a service builder.\n\nuse http::request::Parts;\nuse thiserror::Error;\n\nuse crate::{body::BoxBody, response::IntoResponse};\n\nuse super::{internal_server_error, FromParts};\n\n/// The [`ConnectInfo`] was not found in the [`http::Request`] extensions.\n///\n/// Use [`IntoMakeServiceWithConnectInfo`](crate::routing::IntoMakeServiceWithConnectInfo) to ensure it's present.\n#[non_exhaustive]\n#[derive(Debug, Error)]\n#[error(\n    \"`ConnectInfo` is not present in the `http::Request` extensions - consider using `aws_smithy_legacy_http_server::routing::IntoMakeServiceWithConnectInfo`\"\n)]\npub struct MissingConnectInfo;\n\nimpl<Protocol> IntoResponse<Protocol> for MissingConnectInfo {\n    fn into_response(self) -> http::Response<BoxBody> {\n        internal_server_error()\n    }\n}\n\n/// Extractor for getting connection information produced by a [`Connected`](crate::routing::Connected).\n///\n/// Note this extractor requires the existence of [`ConnectInfo<T>`] in the [`http::Extensions`]. This is\n/// automatically inserted by the [`IntoMakeServiceWithConnectInfo`](crate::routing::IntoMakeServiceWithConnectInfo)\n/// middleware, which can be applied using the `into_make_service_with_connect_info` method on your generated service.\n#[derive(Clone, Debug)]\npub struct ConnectInfo<T>(\n    /// The type produced via [`Connected`](crate::routing::Connected).\n    pub T,\n);\n\nimpl<P, T> FromParts<P> for ConnectInfo<T>\nwhere\n    T: Send + Sync + 'static,\n{\n    type Rejection = MissingConnectInfo;\n\n    fn from_parts(parts: &mut Parts) -> Result<Self, Self::Rejection> {\n        parts.extensions.remove().ok_or(MissingConnectInfo)\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http-server/src/request/extension.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n// This code was copied and then modified from Tokio's Axum.\n\n/* Copyright (c) 2021 Tower Contributors\n *\n * Permission is hereby granted, free of charge, to any\n * person obtaining a copy of this software and associated\n * documentation files (the \"Software\"), to deal in the\n * Software without restriction, including without\n * limitation the rights to use, copy, modify, merge,\n * publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software\n * is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice\n * shall be included in all copies or substantial portions\n * of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF\n * ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED\n * TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A\n * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT\n * SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR\n * IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\n * DEALINGS IN THE SOFTWARE.\n */\n\n//! Extension types.\n//!\n//! Extension types are types that are stored in and extracted from _both_ requests and\n//! responses.\n//!\n//! There is only one _generic_ extension type _for requests_, [`Extension`].\n//!\n//! On the other hand, the server SDK uses multiple concrete extension types for responses in order\n//! to store a variety of information, like the operation that was executed, the operation error\n//! that got returned, or the runtime error that happened, among others. The information stored in\n//! these types may be useful to [`tower::Layer`]s that post-process the response: for instance, a\n//! particular metrics layer implementation might want to emit metrics about the number of times an\n//! an operation got executed.\n//!\n//! [extensions]: https://docs.rs/http/latest/http/struct.Extensions.html\n\nuse std::ops::Deref;\n\nuse thiserror::Error;\n\nuse crate::{body::BoxBody, request::FromParts, response::IntoResponse};\n\nuse super::internal_server_error;\n\n/// Generic extension type stored in and extracted from [request extensions].\n///\n/// This is commonly used to share state across handlers.\n///\n/// If the extension is missing it will reject the request with a `500 Internal\n/// Server Error` response.\n///\n/// [request extensions]: https://docs.rs/http/latest/http/struct.Extensions.html\n#[derive(Debug, Clone)]\npub struct Extension<T>(pub T);\n\nimpl<T> Deref for Extension<T> {\n    type Target = T;\n\n    fn deref(&self) -> &Self::Target {\n        &self.0\n    }\n}\n\n/// The extension has not been added to the [`Request`](http::Request) or has been previously removed.\n#[non_exhaustive]\n#[derive(Debug, Error)]\n#[error(\"the `Extension` is not present in the `http::Request`\")]\npub struct MissingExtension;\n\nimpl<Protocol> IntoResponse<Protocol> for MissingExtension {\n    fn into_response(self) -> http::Response<BoxBody> {\n        internal_server_error()\n    }\n}\n\nimpl<Protocol, T> FromParts<Protocol> for Extension<T>\nwhere\n    T: Send + Sync + 'static,\n{\n    type Rejection = MissingExtension;\n\n    fn from_parts(parts: &mut http::request::Parts) -> Result<Self, Self::Rejection> {\n        parts.extensions.remove::<T>().map(Extension).ok_or(MissingExtension)\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http-server/src/request/lambda.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! The [`lambda_http`] types included in [`http::Request`]s when [`LambdaHandler`](crate::routing::LambdaHandler) is\n//! used. Each are given a [`FromParts`] implementation for easy use within handlers.\n\nuse lambda_http::request::RequestContext;\n#[doc(inline)]\npub use lambda_http::{\n    aws_lambda_events::apigw::{ApiGatewayProxyRequestContext, ApiGatewayV2httpRequestContext},\n    Context,\n};\nuse thiserror::Error;\n\nuse super::{internal_server_error, FromParts};\nuse crate::{body::BoxBody, response::IntoResponse};\n\n/// The [`Context`] was not found in the [`http::Request`] extensions.\n///\n/// Use [`LambdaHandler`](crate::routing::LambdaHandler) to ensure it's present.\n#[non_exhaustive]\n#[derive(Debug, Error)]\n#[error(\"`Context` is not present in the `http::Request` extensions - consider using `aws_smithy_legacy_http_server::routing::LambdaHandler`\")]\npub struct MissingContext;\n\nimpl<Protocol> IntoResponse<Protocol> for MissingContext {\n    fn into_response(self) -> http::Response<BoxBody> {\n        internal_server_error()\n    }\n}\n\nimpl<P> FromParts<P> for Context {\n    type Rejection = MissingContext;\n\n    fn from_parts(parts: &mut http::request::Parts) -> Result<Self, Self::Rejection> {\n        parts.extensions.remove().ok_or(MissingContext)\n    }\n}\n\n#[derive(Debug, Error)]\nenum MissingGatewayContextTypeV1 {\n    #[error(\"`RequestContext` is not present in the `http::Request` extensions - consider using `aws_smithy_legacy_http_server::routing::LambdaHandler`\")]\n    MissingRequestContext,\n    #[error(\"`RequestContext::ApiGatewayV2` is present in the `http::Request` extensions - consider using the `aws_smithy_legacy_http_server::request::lambda::ApiGatewayV2httpRequestContext` extractor\")]\n    VersionMismatch,\n}\n\n/// The [`RequestContext::ApiGatewayV1`] was not found in the [`http::Request`] extensions.\n///\n/// Use [`LambdaHandler`](crate::routing::LambdaHandler) to ensure it's present and ensure that you're using \"ApiGatewayV1\".\n#[derive(Debug, Error)]\n#[error(\"{inner}\")]\npub struct MissingGatewayContextV1 {\n    inner: MissingGatewayContextTypeV1,\n}\n\nimpl<Protocol> IntoResponse<Protocol> for MissingGatewayContextV1 {\n    fn into_response(self) -> http::Response<BoxBody> {\n        internal_server_error()\n    }\n}\n\nimpl<P> FromParts<P> for ApiGatewayProxyRequestContext {\n    type Rejection = MissingGatewayContextV1;\n\n    fn from_parts(parts: &mut http::request::Parts) -> Result<Self, Self::Rejection> {\n        let context = parts.extensions.remove().ok_or(MissingGatewayContextV1 {\n            inner: MissingGatewayContextTypeV1::MissingRequestContext,\n        })?;\n        if let RequestContext::ApiGatewayV1(context) = context {\n            Ok(context)\n        } else {\n            Err(MissingGatewayContextV1 {\n                inner: MissingGatewayContextTypeV1::VersionMismatch,\n            })\n        }\n    }\n}\n\n#[derive(Debug, Error)]\nenum MissingGatewayContextTypeV2 {\n    #[error(\"`RequestContext` is not present in the `http::Request` extensions - consider using `aws_smithy_legacy_http_server::routing::LambdaHandler`\")]\n    MissingRequestContext,\n    #[error(\"`RequestContext::ApiGatewayV1` is present in the `http::Request` extensions - consider using the `aws_smithy_legacy_http_server::request::lambda::ApiGatewayProxyRequestContext` extractor\")]\n    VersionMismatch,\n}\n\n/// The [`RequestContext::ApiGatewayV2`] was not found in the [`http::Request`] extensions.\n///\n/// Use [`LambdaHandler`](crate::routing::LambdaHandler) to ensure it's present and ensure that you're using \"ApiGatewayV2\".\n#[derive(Debug, Error)]\n#[error(\"{inner}\")]\npub struct MissingGatewayContextV2 {\n    inner: MissingGatewayContextTypeV2,\n}\n\nimpl<Protocol> IntoResponse<Protocol> for MissingGatewayContextV2 {\n    fn into_response(self) -> http::Response<BoxBody> {\n        internal_server_error()\n    }\n}\n\nimpl<P> FromParts<P> for ApiGatewayV2httpRequestContext {\n    type Rejection = MissingGatewayContextV2;\n\n    fn from_parts(parts: &mut http::request::Parts) -> Result<Self, Self::Rejection> {\n        let context = parts.extensions.remove().ok_or(MissingGatewayContextV2 {\n            inner: MissingGatewayContextTypeV2::MissingRequestContext,\n        })?;\n        if let RequestContext::ApiGatewayV2(context) = context {\n            Ok(context)\n        } else {\n            Err(MissingGatewayContextV2 {\n                inner: MissingGatewayContextTypeV2::VersionMismatch,\n            })\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http-server/src/request/mod.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n// This code was copied and then modified from Tokio's Axum.\n\n/* Copyright (c) 2022 Tower Contributors\n *\n * Permission is hereby granted, free of charge, to any\n * person obtaining a copy of this software and associated\n * documentation files (the \"Software\"), to deal in the\n * Software without restriction, including without\n * limitation the rights to use, copy, modify, merge,\n * publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software\n * is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice\n * shall be included in all copies or substantial portions\n * of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF\n * ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED\n * TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A\n * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT\n * SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR\n * IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\n * DEALINGS IN THE SOFTWARE.\n */\n\n//! Types and traits for extracting data from requests.\n//!\n//! See [Accessing Un-modelled data](https://github.com/smithy-lang/smithy-rs/blob/main/design/src/server/from_parts.md)\n//! a comprehensive overview.\n//!\n//! The following implementations exist:\n//! * Tuples up to size 8, extracting each component.\n//! * `Option<T>`: `Some(T)` if extracting `T` is successful, `None` otherwise.\n//! * `Result<T, T::Rejection>`: `Ok(T)` if extracting `T` is successful, `Err(T::Rejection)` otherwise.\n//!\n//! when `T: FromParts`.\n//!\n\nuse std::{\n    convert::Infallible,\n    future::{ready, Future, Ready},\n};\n\nuse futures_util::{\n    future::{try_join, MapErr, MapOk, TryJoin},\n    TryFutureExt,\n};\nuse http::{request::Parts, Request, StatusCode};\n\nuse crate::{\n    body::{empty, BoxBody},\n    rejection::any_rejections,\n    response::IntoResponse,\n};\n\npub mod connect_info;\npub mod extension;\n#[cfg(feature = \"aws-lambda\")]\n#[cfg_attr(docsrs, doc(cfg(feature = \"aws-lambda\")))]\npub mod lambda;\n#[cfg(feature = \"request-id\")]\n#[cfg_attr(docsrs, doc(cfg(feature = \"request-id\")))]\npub mod request_id;\n\nfn internal_server_error() -> http::Response<BoxBody> {\n    let mut response = http::Response::new(empty());\n    *response.status_mut() = StatusCode::INTERNAL_SERVER_ERROR;\n    response\n}\n\n/// Provides a protocol aware extraction from a [`Request`]. This borrows the [`Parts`], in contrast to\n/// [`FromRequest`] which consumes the entire [`http::Request`] including the body.\npub trait FromParts<Protocol>: Sized {\n    /// The type of the extraction failures.\n    type Rejection: IntoResponse<Protocol>;\n\n    /// Extracts `self` from a [`Parts`] synchronously.\n    fn from_parts(parts: &mut Parts) -> Result<Self, Self::Rejection>;\n}\n\nimpl<P> FromParts<P> for () {\n    type Rejection = Infallible;\n\n    fn from_parts(_parts: &mut Parts) -> Result<Self, Self::Rejection> {\n        Ok(())\n    }\n}\n\nimpl<P, T> FromParts<P> for (T,)\nwhere\n    T: FromParts<P>,\n{\n    type Rejection = T::Rejection;\n\n    fn from_parts(parts: &mut Parts) -> Result<Self, Self::Rejection> {\n        Ok((T::from_parts(parts)?,))\n    }\n}\n\nmacro_rules! impl_from_parts {\n    ($error_name:ident, $($var:ident),+) => (\n        impl<P, $($var,)*> FromParts<P> for ($($var),*)\n        where\n            $($var: FromParts<P>,)*\n        {\n            type Rejection = any_rejections::$error_name<$($var::Rejection),*>;\n\n            fn from_parts(parts: &mut Parts) -> Result<Self, Self::Rejection> {\n                let tuple = (\n                    $($var::from_parts(parts).map_err(any_rejections::$error_name::$var)?,)*\n                );\n                Ok(tuple)\n            }\n        }\n    )\n}\n\nimpl_from_parts!(Two, A, B);\nimpl_from_parts!(Three, A, B, C);\nimpl_from_parts!(Four, A, B, C, D);\nimpl_from_parts!(Five, A, B, C, D, E);\nimpl_from_parts!(Six, A, B, C, D, E, F);\nimpl_from_parts!(Seven, A, B, C, D, E, F, G);\nimpl_from_parts!(Eight, A, B, C, D, E, F, G, H);\n\n/// Provides a protocol aware extraction from a [`Request`]. This consumes the\n/// [`Request`], including the body, in contrast to [`FromParts`] which borrows the [`Parts`].\n///\n/// This should not be implemented by hand. Code generation should implement this for your operations input. To extract\n/// items from a HTTP request [`FromParts`] should be used.\npub trait FromRequest<Protocol, B>: Sized {\n    /// The type of the extraction failures.\n    type Rejection: IntoResponse<Protocol>;\n    /// The type of the extraction [`Future`].\n    type Future: Future<Output = Result<Self, Self::Rejection>>;\n\n    /// Extracts `self` from a [`Request`] asynchronously.\n    fn from_request(request: Request<B>) -> Self::Future;\n}\n\nimpl<P, B, T1> FromRequest<P, B> for (T1,)\nwhere\n    T1: FromRequest<P, B>,\n{\n    type Rejection = T1::Rejection;\n    type Future = MapOk<T1::Future, fn(T1) -> (T1,)>;\n\n    fn from_request(request: Request<B>) -> Self::Future {\n        T1::from_request(request).map_ok(|t1| (t1,))\n    }\n}\n\nimpl<P, B, T1, T2> FromRequest<P, B> for (T1, T2)\nwhere\n    T1: FromRequest<P, B>,\n    T2: FromParts<P>,\n    T1::Rejection: std::fmt::Display,\n    T2::Rejection: std::fmt::Display,\n{\n    type Rejection = any_rejections::Two<T1::Rejection, T2::Rejection>;\n    type Future = TryJoin<MapErr<T1::Future, fn(T1::Rejection) -> Self::Rejection>, Ready<Result<T2, Self::Rejection>>>;\n\n    fn from_request(request: Request<B>) -> Self::Future {\n        let (mut parts, body) = request.into_parts();\n        let t2_result: Result<T2, any_rejections::Two<T1::Rejection, T2::Rejection>> = T2::from_parts(&mut parts)\n            .map_err(|e| {\n                // The error is likely caused by a failure to construct a parameter from the\n                // `Request` required by the user handler. This typically occurs when the\n                // user handler expects a specific type, such as `Extension<State>`, but\n                // either the `ExtensionLayer` has not been added, or it adds a different\n                // type to the extension bag, such as `Extension<Arc<State>>`.\n                tracing::error!(\n                    error = %e,\n                    \"additional parameter for the handler function could not be constructed\");\n                any_rejections::Two::B(e)\n            });\n        try_join(\n            T1::from_request(Request::from_parts(parts, body)).map_err(|e| {\n                // `T1`, the first parameter of a handler function, represents the input parameter\n                // defined in the Smithy model. An error at this stage suggests that `T1` could not\n                // be constructed from the `Request`.\n                tracing::debug!(error = %e, \"failed to deserialize request into operation's input\");\n                any_rejections::Two::A(e)\n            }),\n            ready(t2_result),\n        )\n    }\n}\n\nimpl<P, T> FromParts<P> for Option<T>\nwhere\n    T: FromParts<P>,\n{\n    type Rejection = Infallible;\n\n    fn from_parts(parts: &mut Parts) -> Result<Self, Self::Rejection> {\n        Ok(T::from_parts(parts).ok())\n    }\n}\n\nimpl<P, T> FromParts<P> for Result<T, T::Rejection>\nwhere\n    T: FromParts<P>,\n{\n    type Rejection = Infallible;\n\n    fn from_parts(parts: &mut Parts) -> Result<Self, Self::Rejection> {\n        Ok(T::from_parts(parts))\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http-server/src/request/request_id.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! # Request IDs\n//!\n//! `aws-smithy-http-server` provides the [`ServerRequestId`].\n//!\n//! ## `ServerRequestId`\n//!\n//! A [`ServerRequestId`] is an opaque random identifier generated by the server every time it receives a request.\n//! It uniquely identifies the request within that service instance. It can be used to collate all logs, events and\n//! data related to a single operation.\n//! Use [`ServerRequestIdProviderLayer::new`] to use [`ServerRequestId`] in your handler.\n//!\n//! The [`ServerRequestId`] can be returned to the caller, who can in turn share the [`ServerRequestId`] to help the service owner in troubleshooting issues related to their usage of the service.\n//! Use [`ServerRequestIdProviderLayer::new_with_response_header`] to use [`ServerRequestId`] in your handler and add it to the response headers.\n//!\n//! The [`ServerRequestId`] is not meant to be propagated to downstream dependencies of the service. You should rely on a distributed tracing implementation for correlation purposes (e.g. OpenTelemetry).\n//!\n//! ## Examples\n//!\n//! Your handler can now optionally take as input a [`ServerRequestId`].\n//!\n//! ```rust,ignore\n//! pub async fn handler(\n//!     _input: Input,\n//!     server_request_id: ServerRequestId,\n//! ) -> Output {\n//!     /* Use server_request_id */\n//!     todo!()\n//! }\n//!\n//! let config = ServiceConfig::builder()\n//!     // Generate a server request ID and add it to the response header.\n//!     .layer(ServerRequestIdProviderLayer::new_with_response_header(HeaderName::from_static(\"x-request-id\")))\n//!     .build();\n//! let app = Service::builder(config)\n//!     .operation(handler)\n//!     .build().unwrap();\n//!\n//! let bind: std::net::SocketAddr = format!(\"{}:{}\", args.address, args.port)\n//!     .parse()\n//!     .expect(\"unable to parse the server bind address and port\");\n//! let server = hyper::Server::bind(&bind).serve(app.into_make_service());\n//! ```\n\nuse std::future::Future;\nuse std::{\n    fmt::Display,\n    task::{Context, Poll},\n};\n\nuse futures_util::TryFuture;\nuse http::request::Parts;\nuse http::{header::HeaderName, HeaderValue, Response};\nuse thiserror::Error;\nuse tower::{Layer, Service};\nuse uuid::Uuid;\n\nuse crate::{body::BoxBody, response::IntoResponse};\n\nuse super::{internal_server_error, FromParts};\n\n/// Opaque type for Server Request IDs.\n///\n/// If it is missing, the request will be rejected with a `500 Internal Server Error` response.\n#[derive(Clone, Debug)]\npub struct ServerRequestId {\n    id: Uuid,\n}\n\n/// The server request ID has not been added to the [`Request`](http::Request) or has been previously removed.\n#[non_exhaustive]\n#[derive(Debug, Error)]\n#[error(\"the `ServerRequestId` is not present in the `http::Request`\")]\npub struct MissingServerRequestId;\n\nimpl ServerRequestId {\n    pub fn new() -> Self {\n        Self { id: Uuid::new_v4() }\n    }\n\n    pub(crate) fn to_header(&self) -> HeaderValue {\n        HeaderValue::from_str(&self.id.to_string()).expect(\"This string contains only valid ASCII\")\n    }\n}\n\nimpl Display for ServerRequestId {\n    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n        self.id.fmt(f)\n    }\n}\n\nimpl<P> FromParts<P> for ServerRequestId {\n    type Rejection = MissingServerRequestId;\n\n    fn from_parts(parts: &mut Parts) -> Result<Self, Self::Rejection> {\n        parts.extensions.remove().ok_or(MissingServerRequestId)\n    }\n}\n\nimpl Default for ServerRequestId {\n    fn default() -> Self {\n        Self::new()\n    }\n}\n\n#[derive(Clone)]\npub struct ServerRequestIdProvider<S> {\n    inner: S,\n    header_key: Option<HeaderName>,\n}\n\n/// A layer that provides services with a unique request ID instance\n#[derive(Debug)]\n#[non_exhaustive]\npub struct ServerRequestIdProviderLayer {\n    header_key: Option<HeaderName>,\n}\n\nimpl ServerRequestIdProviderLayer {\n    /// Generate a new unique request ID and do not add it as a response header\n    /// Use [`ServerRequestIdProviderLayer::new_with_response_header`] to also add it as a response header\n    pub fn new() -> Self {\n        Self { header_key: None }\n    }\n\n    /// Generate a new unique request ID and add it as a response header\n    pub fn new_with_response_header(header_key: HeaderName) -> Self {\n        Self {\n            header_key: Some(header_key),\n        }\n    }\n}\n\nimpl Default for ServerRequestIdProviderLayer {\n    fn default() -> Self {\n        Self::new()\n    }\n}\n\nimpl<S> Layer<S> for ServerRequestIdProviderLayer {\n    type Service = ServerRequestIdProvider<S>;\n\n    fn layer(&self, inner: S) -> Self::Service {\n        ServerRequestIdProvider {\n            inner,\n            header_key: self.header_key.clone(),\n        }\n    }\n}\n\nimpl<Body, S> Service<http::Request<Body>> for ServerRequestIdProvider<S>\nwhere\n    S: Service<http::Request<Body>, Response = Response<crate::body::BoxBody>>,\n    S::Future: std::marker::Send + 'static,\n{\n    type Response = S::Response;\n    type Error = S::Error;\n    type Future = ServerRequestIdResponseFuture<S::Future>;\n\n    fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {\n        self.inner.poll_ready(cx)\n    }\n\n    fn call(&mut self, mut req: http::Request<Body>) -> Self::Future {\n        let request_id = ServerRequestId::new();\n        match &self.header_key {\n            Some(header_key) => {\n                req.extensions_mut().insert(request_id.clone());\n                ServerRequestIdResponseFuture {\n                    response_package: Some(ResponsePackage {\n                        request_id,\n                        header_key: header_key.clone(),\n                    }),\n                    fut: self.inner.call(req),\n                }\n            }\n            None => {\n                req.extensions_mut().insert(request_id);\n                ServerRequestIdResponseFuture {\n                    response_package: None,\n                    fut: self.inner.call(req),\n                }\n            }\n        }\n    }\n}\n\nimpl<Protocol> IntoResponse<Protocol> for MissingServerRequestId {\n    fn into_response(self) -> http::Response<BoxBody> {\n        internal_server_error()\n    }\n}\n\nstruct ResponsePackage {\n    request_id: ServerRequestId,\n    header_key: HeaderName,\n}\n\npin_project_lite::pin_project! {\n    pub struct ServerRequestIdResponseFuture<Fut> {\n        response_package: Option<ResponsePackage>,\n        #[pin]\n        fut: Fut,\n    }\n}\n\nimpl<Fut> Future for ServerRequestIdResponseFuture<Fut>\nwhere\n    Fut: TryFuture<Ok = Response<crate::body::BoxBody>>,\n{\n    type Output = Result<Fut::Ok, Fut::Error>;\n\n    fn poll(self: std::pin::Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {\n        let this = self.project();\n        let fut = this.fut;\n        let response_package = this.response_package;\n        fut.try_poll(cx).map_ok(|mut res| {\n            if let Some(response_package) = response_package.take() {\n                res.headers_mut()\n                    .insert(response_package.header_key, response_package.request_id.to_header());\n            }\n            res\n        })\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use crate::body::{Body, BoxBody};\n    use crate::request::Request;\n    use http::HeaderValue;\n    use std::convert::Infallible;\n    use tower::{service_fn, ServiceBuilder, ServiceExt};\n\n    #[test]\n    fn test_request_id_parsed_by_header_value_infallible() {\n        ServerRequestId::new().to_header();\n    }\n\n    #[tokio::test]\n    async fn test_request_id_in_response_header() {\n        let svc = ServiceBuilder::new()\n            .layer(&ServerRequestIdProviderLayer::new_with_response_header(\n                HeaderName::from_static(\"x-request-id\"),\n            ))\n            .service(service_fn(|_req: Request<Body>| async move {\n                Ok::<_, Infallible>(Response::new(BoxBody::default()))\n            }));\n\n        let req = Request::new(Body::empty());\n\n        let res = svc.oneshot(req).await.unwrap();\n        let request_id = res.headers().get(\"x-request-id\").unwrap().to_str().unwrap();\n\n        assert!(HeaderValue::from_str(request_id).is_ok());\n    }\n\n    #[tokio::test]\n    async fn test_request_id_not_in_response_header() {\n        let svc = ServiceBuilder::new()\n            .layer(&ServerRequestIdProviderLayer::new())\n            .service(service_fn(|_req: Request<Body>| async move {\n                Ok::<_, Infallible>(Response::new(BoxBody::default()))\n            }));\n\n        let req = Request::new(Body::empty());\n\n        let res = svc.oneshot(req).await.unwrap();\n\n        assert!(res.headers().is_empty());\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http-server/src/response.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n// This code was copied and then modified from Tokio's Axum.\n\n/* Copyright (c) 2022 Tower Contributors\n *\n * Permission is hereby granted, free of charge, to any\n * person obtaining a copy of this software and associated\n * documentation files (the \"Software\"), to deal in the\n * Software without restriction, including without\n * limitation the rights to use, copy, modify, merge,\n * publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software\n * is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice\n * shall be included in all copies or substantial portions\n * of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF\n * ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED\n * TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A\n * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT\n * SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR\n * IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\n * DEALINGS IN THE SOFTWARE.\n */\n\nuse crate::body::BoxBody;\n\npub type Response<T = BoxBody> = http::Response<T>;\n\n/// A protocol aware function taking `self` to [`http::Response`].\npub trait IntoResponse<Protocol> {\n    /// Performs a conversion into a [`http::Response`].\n    fn into_response(self) -> http::Response<BoxBody>;\n}\n\nimpl<P> IntoResponse<P> for std::convert::Infallible {\n    fn into_response(self) -> http::Response<BoxBody> {\n        match self {}\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http-server/src/routing/into_make_service.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n// This code was copied and then modified from Tokio's Axum.\n\n/* Copyright (c) 2021 Tower Contributors\n *\n * Permission is hereby granted, free of charge, to any\n * person obtaining a copy of this software and associated\n * documentation files (the \"Software\"), to deal in the\n * Software without restriction, including without\n * limitation the rights to use, copy, modify, merge,\n * publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software\n * is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice\n * shall be included in all copies or substantial portions\n * of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF\n * ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED\n * TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A\n * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT\n * SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR\n * IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\n * DEALINGS IN THE SOFTWARE.\n */\n\nuse std::{\n    convert::Infallible,\n    future::ready,\n    task::{Context, Poll},\n};\nuse tower::Service;\n\n/// A [`MakeService`] that produces router services.\n///\n/// [`MakeService`]: tower::make::MakeService\n#[derive(Debug, Clone)]\npub struct IntoMakeService<S> {\n    service: S,\n}\n\nimpl<S> IntoMakeService<S> {\n    pub fn new(service: S) -> Self {\n        Self { service }\n    }\n}\n\nimpl<S, T> Service<T> for IntoMakeService<S>\nwhere\n    S: Clone,\n{\n    type Response = S;\n    type Error = Infallible;\n    type Future = MakeRouteServiceFuture<S>;\n\n    #[inline]\n    fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {\n        Poll::Ready(Ok(()))\n    }\n\n    fn call(&mut self, _target: T) -> Self::Future {\n        MakeRouteServiceFuture::new(ready(Ok(self.service.clone())))\n    }\n}\n\nopaque_future! {\n    /// Response future for [`IntoMakeService`] services.\n    pub type MakeRouteServiceFuture<S> =\n        std::future::Ready<Result<S, Infallible>>;\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n\n    #[test]\n    fn traits() {\n        use crate::test_helpers::*;\n\n        assert_send::<IntoMakeService<()>>();\n        assert_sync::<IntoMakeService<()>>();\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http-server/src/routing/into_make_service_with_connect_info.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n// This code was copied and then modified from Tokio's Axum.\n\n/* Copyright (c) 2021 Tower Contributors\n *\n * Permission is hereby granted, free of charge, to any\n * person obtaining a copy of this software and associated\n * documentation files (the \"Software\"), to deal in the\n * Software without restriction, including without\n * limitation the rights to use, copy, modify, merge,\n * publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software\n * is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice\n * shall be included in all copies or substantial portions\n * of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF\n * ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED\n * TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A\n * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT\n * SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR\n * IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\n * DEALINGS IN THE SOFTWARE.\n */\n\n//! The [`IntoMakeServiceWithConnectInfo`] is a service factory which adjoins [`ConnectInfo`] to the requests.\n\nuse std::{\n    convert::Infallible,\n    fmt,\n    future::ready,\n    marker::PhantomData,\n    net::SocketAddr,\n    task::{Context, Poll},\n};\n\nuse hyper::server::conn::AddrStream;\nuse tower::{Layer, Service};\nuse tower_http::add_extension::{AddExtension, AddExtensionLayer};\n\nuse crate::request::connect_info::ConnectInfo;\n\n/// A [`MakeService`] used to insert [`ConnectInfo<T>`] into [`http::Request`]s.\n///\n/// The `T` must be derivable from the underlying IO resource using the [`Connected`] trait.\n///\n/// [`MakeService`]: tower::make::MakeService\npub struct IntoMakeServiceWithConnectInfo<S, C> {\n    inner: S,\n    _connect_info: PhantomData<fn() -> C>,\n}\n\nimpl<S, C> IntoMakeServiceWithConnectInfo<S, C> {\n    pub fn new(svc: S) -> Self {\n        Self {\n            inner: svc,\n            _connect_info: PhantomData,\n        }\n    }\n}\n\nimpl<S, C> fmt::Debug for IntoMakeServiceWithConnectInfo<S, C>\nwhere\n    S: fmt::Debug,\n{\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        f.debug_struct(\"IntoMakeServiceWithConnectInfo\")\n            .field(\"inner\", &self.inner)\n            .finish()\n    }\n}\n\nimpl<S, C> Clone for IntoMakeServiceWithConnectInfo<S, C>\nwhere\n    S: Clone,\n{\n    fn clone(&self) -> Self {\n        Self {\n            inner: self.inner.clone(),\n            _connect_info: PhantomData,\n        }\n    }\n}\n\n/// Trait that connected IO resources implement and use to produce information\n/// about the connection.\n///\n/// The goal for this trait is to allow users to implement custom IO types that\n/// can still provide the same connection metadata.\npub trait Connected<T>: Clone {\n    /// Create type holding information about the connection.\n    fn connect_info(target: T) -> Self;\n}\n\nimpl Connected<&AddrStream> for SocketAddr {\n    fn connect_info(target: &AddrStream) -> Self {\n        target.remote_addr()\n    }\n}\n\nimpl<S, C, T> Service<T> for IntoMakeServiceWithConnectInfo<S, C>\nwhere\n    S: Clone,\n    C: Connected<T>,\n{\n    type Response = AddExtension<S, ConnectInfo<C>>;\n    type Error = Infallible;\n    type Future = ResponseFuture<S, C>;\n\n    #[inline]\n    fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {\n        Poll::Ready(Ok(()))\n    }\n\n    fn call(&mut self, target: T) -> Self::Future {\n        let connect_info = ConnectInfo(C::connect_info(target));\n        let svc = AddExtensionLayer::new(connect_info).layer(self.inner.clone());\n        ResponseFuture::new(ready(Ok(svc)))\n    }\n}\n\nopaque_future! {\n    /// Response future for [`IntoMakeServiceWithConnectInfo`].\n    pub type ResponseFuture<S, C> =\n        std::future::Ready<Result<AddExtension<S, ConnectInfo<C>>, Infallible>>;\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http-server/src/routing/lambda_handler.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse http::uri;\nuse lambda_http::{Request, RequestExt};\nuse std::{\n    fmt::Debug,\n    task::{Context, Poll},\n};\nuse tower::Service;\n\ntype HyperRequest = http::Request<hyper::Body>;\n\n/// A [`Service`] that takes a `lambda_http::Request` and converts\n/// it to `http::Request<hyper::Body>`.\n///\n/// **This version is only guaranteed to be compatible with\n/// [`lambda_http`](https://docs.rs/lambda_http) ^0.7.0.** Please ensure that your service crate's\n/// `Cargo.toml` depends on a compatible version.\n///\n/// [`Service`]: tower::Service\n#[derive(Debug, Clone)]\npub struct LambdaHandler<S> {\n    service: S,\n}\n\nimpl<S> LambdaHandler<S> {\n    pub fn new(service: S) -> Self {\n        Self { service }\n    }\n}\n\nimpl<S> Service<Request> for LambdaHandler<S>\nwhere\n    S: Service<HyperRequest>,\n{\n    type Error = S::Error;\n    type Response = S::Response;\n    type Future = S::Future;\n\n    #[inline]\n    fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {\n        self.service.poll_ready(cx)\n    }\n\n    fn call(&mut self, event: Request) -> Self::Future {\n        self.service.call(convert_event(event))\n    }\n}\n\n/// Converts a `lambda_http::Request` into a `http::Request<hyper::Body>`\n/// Issue: <https://github.com/smithy-lang/smithy-rs/issues/1125>\n///\n/// While converting the event the [API Gateway Stage] portion of the URI\n/// is removed from the uri that gets returned as a new `http::Request`.\n///\n/// [API Gateway Stage]: https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-stages.html\nfn convert_event(request: Request) -> HyperRequest {\n    let raw_path: &str = request.extensions().raw_http_path();\n    let path: &str = request.uri().path();\n\n    let (parts, body) = if !raw_path.is_empty() && raw_path != path {\n        let mut path = raw_path.to_owned(); // Clone only when we need to strip out the stage.\n        let (mut parts, body) = request.into_parts();\n\n        let uri_parts: uri::Parts = parts.uri.into();\n        let path_and_query = uri_parts\n            .path_and_query\n            .expect(\"request URI does not have `PathAndQuery`\");\n\n        if let Some(query) = path_and_query.query() {\n            path.push('?');\n            path.push_str(query);\n        }\n\n        parts.uri = uri::Uri::builder()\n            .authority(uri_parts.authority.expect(\"request URI does not have authority set\"))\n            .scheme(uri_parts.scheme.expect(\"request URI does not have scheme set\"))\n            .path_and_query(path)\n            .build()\n            .expect(\"unable to construct new URI\");\n\n        (parts, body)\n    } else {\n        request.into_parts()\n    };\n\n    let body = match body {\n        lambda_http::Body::Empty => hyper::Body::empty(),\n        lambda_http::Body::Text(s) => hyper::Body::from(s),\n        lambda_http::Body::Binary(v) => hyper::Body::from(v),\n    };\n\n    http::Request::from_parts(parts, body)\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use lambda_http::RequestExt;\n\n    #[test]\n    fn traits() {\n        use crate::test_helpers::*;\n\n        assert_send::<LambdaHandler<()>>();\n        assert_sync::<LambdaHandler<()>>();\n    }\n\n    #[test]\n    fn raw_http_path() {\n        // lambda_http::Request doesn't have a fn `builder`\n        let event = http::Request::builder()\n            .uri(\"https://id.execute-api.us-east-1.amazonaws.com/prod/resources/1\")\n            .body(())\n            .expect(\"unable to build Request\");\n        let (parts, _) = event.into_parts();\n\n        // the lambda event will have a raw path which is the path without stage name in it\n        let event =\n            lambda_http::Request::from_parts(parts, lambda_http::Body::Empty).with_raw_http_path(\"/resources/1\");\n        let request = convert_event(event);\n\n        assert_eq!(request.uri().path(), \"/resources/1\")\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http-server/src/routing/mod.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! HTTP routing that adheres to the [Smithy specification].\n//!\n//! [Smithy specification]: https://smithy.io/2.0/spec/http-bindings.html\n\nmod into_make_service;\nmod into_make_service_with_connect_info;\n#[cfg(feature = \"aws-lambda\")]\n#[cfg_attr(docsrs, doc(cfg(feature = \"aws-lambda\")))]\nmod lambda_handler;\n\n#[doc(hidden)]\npub mod request_spec;\n\nmod route;\n\npub(crate) mod tiny_map;\n\nuse std::{\n    error::Error,\n    fmt,\n    future::{ready, Future, Ready},\n    marker::PhantomData,\n    pin::Pin,\n    task::{Context, Poll},\n};\n\nuse bytes::Bytes;\nuse futures_util::{\n    future::{Either, MapOk},\n    TryFutureExt,\n};\nuse http::Response;\nuse http_body::Body as HttpBody;\nuse tower::{util::Oneshot, Service, ServiceExt};\n\nuse crate::{\n    body::{boxed, BoxBody},\n    error::BoxError,\n    response::IntoResponse,\n};\n\n#[cfg(feature = \"aws-lambda\")]\n#[cfg_attr(docsrs, doc(cfg(feature = \"aws-lambda\")))]\npub use self::lambda_handler::LambdaHandler;\n\n#[allow(deprecated)]\npub use self::{\n    into_make_service::IntoMakeService,\n    into_make_service_with_connect_info::{Connected, IntoMakeServiceWithConnectInfo},\n    route::Route,\n};\n\npub(crate) const UNKNOWN_OPERATION_EXCEPTION: &str = \"UnknownOperationException\";\n\n/// Constructs common response to method disallowed.\npub(crate) fn method_disallowed() -> http::Response<BoxBody> {\n    let mut responses = http::Response::default();\n    *responses.status_mut() = http::StatusCode::METHOD_NOT_ALLOWED;\n    responses\n}\n\n/// An interface for retrieving an inner [`Service`] given a [`http::Request`].\npub trait Router<B> {\n    type Service;\n    type Error;\n\n    /// Matches a [`http::Request`] to a target [`Service`].\n    fn match_route(&self, request: &http::Request<B>) -> Result<Self::Service, Self::Error>;\n}\n\n/// A [`Service`] using the [`Router`] `R` to redirect messages to specific routes.\n///\n/// The `Protocol` parameter is used to determine the serialization of errors.\npub struct RoutingService<R, Protocol> {\n    router: R,\n    _protocol: PhantomData<Protocol>,\n}\n\nimpl<R, P> fmt::Debug for RoutingService<R, P>\nwhere\n    R: fmt::Debug,\n{\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        f.debug_struct(\"RoutingService\")\n            .field(\"router\", &self.router)\n            .field(\"_protocol\", &self._protocol)\n            .finish()\n    }\n}\n\nimpl<R, P> Clone for RoutingService<R, P>\nwhere\n    R: Clone,\n{\n    fn clone(&self) -> Self {\n        Self {\n            router: self.router.clone(),\n            _protocol: PhantomData,\n        }\n    }\n}\n\nimpl<R, P> RoutingService<R, P> {\n    /// Creates a [`RoutingService`] from a [`Router`].\n    pub fn new(router: R) -> Self {\n        Self {\n            router,\n            _protocol: PhantomData,\n        }\n    }\n\n    /// Maps a [`Router`] using a closure.\n    pub fn map<RNew, F>(self, f: F) -> RoutingService<RNew, P>\n    where\n        F: FnOnce(R) -> RNew,\n    {\n        RoutingService {\n            router: f(self.router),\n            _protocol: PhantomData,\n        }\n    }\n}\n\ntype EitherOneshotReady<S, B> = Either<\n    MapOk<Oneshot<S, http::Request<B>>, fn(<S as Service<http::Request<B>>>::Response) -> http::Response<BoxBody>>,\n    Ready<Result<http::Response<BoxBody>, <S as Service<http::Request<B>>>::Error>>,\n>;\n\npin_project_lite::pin_project! {\n    pub struct RoutingFuture<S, B> where S: Service<http::Request<B>> {\n        #[pin]\n        inner: EitherOneshotReady<S, B>\n    }\n}\n\nimpl<S, B> RoutingFuture<S, B>\nwhere\n    S: Service<http::Request<B>>,\n{\n    /// Creates a [`RoutingFuture`] from [`ServiceExt::oneshot`].\n    pub(super) fn from_oneshot<RespB>(future: Oneshot<S, http::Request<B>>) -> Self\n    where\n        S: Service<http::Request<B>, Response = http::Response<RespB>>,\n        RespB: HttpBody<Data = Bytes> + Send + 'static,\n        RespB::Error: Into<BoxError>,\n    {\n        Self {\n            inner: Either::Left(future.map_ok(|x| x.map(boxed))),\n        }\n    }\n\n    /// Creates a [`RoutingFuture`] from [`Service::Response`].\n    pub(super) fn from_response(response: http::Response<BoxBody>) -> Self {\n        Self {\n            inner: Either::Right(ready(Ok(response))),\n        }\n    }\n}\n\nimpl<S, B> Future for RoutingFuture<S, B>\nwhere\n    S: Service<http::Request<B>>,\n{\n    type Output = Result<http::Response<BoxBody>, S::Error>;\n\n    fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {\n        self.project().inner.poll(cx)\n    }\n}\n\nimpl<R, P, B, RespB> Service<http::Request<B>> for RoutingService<R, P>\nwhere\n    R: Router<B>,\n    R::Service: Service<http::Request<B>, Response = http::Response<RespB>> + Clone,\n    R::Error: IntoResponse<P> + Error,\n    RespB: HttpBody<Data = Bytes> + Send + 'static,\n    RespB::Error: Into<BoxError>,\n{\n    type Response = Response<BoxBody>;\n    type Error = <R::Service as Service<http::Request<B>>>::Error;\n    type Future = RoutingFuture<R::Service, B>;\n\n    fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {\n        Poll::Ready(Ok(()))\n    }\n\n    fn call(&mut self, req: http::Request<B>) -> Self::Future {\n        tracing::debug!(\"inside routing service call\");\n        match self.router.match_route(&req) {\n            // Successfully routed, use the routes `Service::call`.\n            Ok(ok) => RoutingFuture::from_oneshot(ok.oneshot(req)),\n            // Failed to route, use the `R::Error`s `IntoResponse<P>`.\n            Err(error) => {\n                tracing::debug!(%error, \"failed to route\");\n                RoutingFuture::from_response(error.into_response())\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http-server/src/routing/request_spec.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::borrow::Cow;\n\nuse http::Request;\nuse regex::Regex;\n\n#[derive(Debug, Clone)]\npub enum PathSegment {\n    Literal(String),\n    Label,\n    Greedy,\n}\n\n#[derive(Debug, Clone)]\npub enum QuerySegment {\n    Key(String),\n    KeyValue(String, String),\n}\n\n#[derive(Debug, Clone)]\npub enum HostPrefixSegment {\n    Literal(String),\n    Label,\n}\n\n#[derive(Debug, Clone, Default)]\npub struct PathSpec(Vec<PathSegment>);\n\nimpl PathSpec {\n    pub fn from_vector_unchecked(path_segments: Vec<PathSegment>) -> Self {\n        PathSpec(path_segments)\n    }\n}\n\n#[derive(Debug, Clone, Default)]\npub struct QuerySpec(Vec<QuerySegment>);\n\nimpl QuerySpec {\n    pub fn from_vector_unchecked(query_segments: Vec<QuerySegment>) -> Self {\n        QuerySpec(query_segments)\n    }\n}\n\n#[derive(Debug, Clone, Default)]\npub struct PathAndQuerySpec {\n    path_segments: PathSpec,\n    query_segments: QuerySpec,\n}\n\nimpl PathAndQuerySpec {\n    pub fn new(path_segments: PathSpec, query_segments: QuerySpec) -> Self {\n        PathAndQuerySpec {\n            path_segments,\n            query_segments,\n        }\n    }\n}\n\n#[derive(Debug, Clone)]\npub struct UriSpec {\n    host_prefix: Option<Vec<HostPrefixSegment>>,\n    path_and_query: PathAndQuerySpec,\n}\n\nimpl UriSpec {\n    // TODO(https://github.com/smithy-lang/smithy-rs/issues/950): When we add support for the endpoint\n    // trait, this constructor will take in a first argument `host_prefix`.\n    pub fn new(path_and_query: PathAndQuerySpec) -> Self {\n        UriSpec {\n            host_prefix: None,\n            path_and_query,\n        }\n    }\n}\n\n#[derive(Debug, Clone)]\npub struct RequestSpec {\n    method: http::Method,\n    uri_spec: UriSpec,\n    uri_path_regex: Regex,\n}\n\n#[derive(Debug, PartialEq)]\npub(crate) enum Match {\n    /// The request matches the URI pattern spec.\n    Yes,\n    /// The request matches the URI pattern spec, but the wrong HTTP method was used. `405 Method\n    /// Not Allowed` should be returned in the response.\n    MethodNotAllowed,\n    /// The request does not match the URI pattern spec. `404 Not Found` should be returned in the\n    /// response.\n    No,\n}\n\nimpl From<&PathSpec> for Regex {\n    fn from(uri_path_spec: &PathSpec) -> Self {\n        let sep = \"/\";\n        let re = if uri_path_spec.0.is_empty() {\n            String::from(sep)\n        } else {\n            uri_path_spec\n                .0\n                .iter()\n                .map(|segment_spec| match segment_spec {\n                    PathSegment::Literal(literal) => Cow::Owned(regex::escape(literal)),\n                    // TODO(https://github.com/awslabs/smithy/issues/975) URL spec says it should be ASCII but this regex accepts UTF-8:\n                    // `*` instead of `+` because the empty string `\"\"` can be bound to a label.\n                    PathSegment::Label => Cow::Borrowed(\"[^/]*\"),\n                    PathSegment::Greedy => Cow::Borrowed(\".*\"),\n                })\n                .fold(String::new(), |a, b| a + sep + &b)\n        };\n\n        Regex::new(&format!(\"^{re}$\")).expect(\"invalid `Regex` from `PathSpec`; please file a bug report under https://github.com/smithy-lang/smithy-rs/issues\")\n    }\n}\n\nimpl RequestSpec {\n    pub fn new(method: http::Method, uri_spec: UriSpec) -> Self {\n        let uri_path_regex = (&uri_spec.path_and_query.path_segments).into();\n        RequestSpec {\n            method,\n            uri_spec,\n            uri_path_regex,\n        }\n    }\n\n    /// A measure of how \"important\" a `RequestSpec` is. The more specific a `RequestSpec` is, the\n    /// higher it ranks in importance. Specificity is measured by the number of segments plus the\n    /// number of query string literals in its URI pattern, so `/{Bucket}/{Key}?query` is more\n    /// specific than `/{Bucket}/{Key}`, which is more specific than `/{Bucket}`, which is more\n    /// specific than `/`.\n    ///\n    /// This rank effectively induces a total order, but we don't implement as `Ord` for\n    /// `RequestSpec` because it would appear in its public interface.\n    ///\n    /// # Why do we need this?\n    ///\n    /// Note that:\n    ///     1. the Smithy spec does not define how servers should route incoming requests in the\n    ///        case of pattern conflicts; and\n    ///     2. the Smithy spec even outright rejects conflicting patterns that can be easily\n    ///        disambiguated e.g. `/{a}` and `/{label}/b` cannot coexist.\n    ///\n    /// We can't to anything about (2) since the Smithy CLI will refuse to build a model with those\n    /// kind of conflicts. However, the Smithy CLI does allow _other_ conflicting patterns to\n    /// coexist, e.g. `/` and `/{label}`. We therefore have to take a stance on (1), since if we\n    /// route arbitrarily [we render basic usage\n    /// impossible](https://github.com/smithy-lang/smithy-rs/issues/1009).\n    /// So this ranking of routes implements some basic pattern conflict disambiguation with some\n    /// common sense. It's also the same behavior that [the TypeScript sSDK is implementing].\n    ///\n    /// [the TypeScript sSDK is implementing]: https://github.com/awslabs/smithy-typescript/blob/d263078b81485a6a2013d243639c0c680343ff47/smithy-typescript-ssdk-libs/server-common/src/httpbinding/mux.ts#L59.\n    // TODO(https://github.com/awslabs/smithy/issues/1029#issuecomment-1002683552): Once Smithy\n    // updates the spec to define the behavior, update our implementation.\n    pub(crate) fn rank(&self) -> usize {\n        self.uri_spec.path_and_query.path_segments.0.len() + self.uri_spec.path_and_query.query_segments.0.len()\n    }\n\n    pub(crate) fn matches<B>(&self, req: &Request<B>) -> Match {\n        if let Some(_host_prefix) = &self.uri_spec.host_prefix {\n            todo!(\"Look at host prefix\");\n        }\n\n        if !self.uri_path_regex.is_match(req.uri().path()) {\n            return Match::No;\n        }\n\n        if self.uri_spec.path_and_query.query_segments.0.is_empty() {\n            if self.method == req.method() {\n                return Match::Yes;\n            } else {\n                return Match::MethodNotAllowed;\n            }\n        }\n\n        match req.uri().query() {\n            Some(query) => {\n                // We can't use `HashMap<Cow<str>, Cow<str>>` because a query string key can appear more\n                // than once e.g. `/?foo=bar&foo=baz`. We _could_ use a multiset e.g. the `hashbag`\n                // crate.\n                // We must deserialize into `Cow<str>`s because `serde_urlencoded` might need to\n                // return an owned allocated `String` if it has to percent-decode a slice of the query string.\n                let res = serde_urlencoded::from_str::<Vec<(Cow<str>, Cow<str>)>>(query);\n\n                match res {\n                    Err(error) => {\n                        tracing::debug!(query, %error, \"failed to deserialize query string\");\n                        Match::No\n                    }\n                    Ok(query_map) => {\n                        for query_segment in self.uri_spec.path_and_query.query_segments.0.iter() {\n                            match query_segment {\n                                QuerySegment::Key(key) => {\n                                    if !query_map.iter().any(|(k, _v)| k == key) {\n                                        return Match::No;\n                                    }\n                                }\n                                QuerySegment::KeyValue(key, expected_value) => {\n                                    let mut it = query_map.iter().filter(|(k, _v)| k == key).peekable();\n                                    if it.peek().is_none() {\n                                        return Match::No;\n                                    }\n\n                                    // The query key appears more than once. All of its values must\n                                    // coincide and be equal to the expected value.\n                                    if it.any(|(_k, v)| v != expected_value) {\n                                        return Match::No;\n                                    }\n                                }\n                            }\n                        }\n\n                        if self.method == req.method() {\n                            Match::Yes\n                        } else {\n                            Match::MethodNotAllowed\n                        }\n                    }\n                }\n            }\n            None => Match::No,\n        }\n    }\n\n    // Helper function to build a `RequestSpec`.\n    #[cfg(test)]\n    pub fn from_parts(\n        method: http::Method,\n        path_segments: Vec<PathSegment>,\n        query_segments: Vec<QuerySegment>,\n    ) -> Self {\n        Self::new(\n            method,\n            UriSpec {\n                host_prefix: None,\n                path_and_query: PathAndQuerySpec {\n                    path_segments: PathSpec::from_vector_unchecked(path_segments),\n                    query_segments: QuerySpec::from_vector_unchecked(query_segments),\n                },\n            },\n        )\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use crate::protocol::test_helpers::req;\n\n    use http::Method;\n\n    #[test]\n    fn path_spec_into_regex() {\n        let cases = vec![\n            (PathSpec(vec![]), \"^/$\"),\n            (PathSpec(vec![PathSegment::Literal(String::from(\"a\"))]), \"^/a$\"),\n            (\n                PathSpec(vec![PathSegment::Literal(String::from(\"a\")), PathSegment::Label]),\n                \"^/a/[^/]*$\",\n            ),\n            (\n                PathSpec(vec![PathSegment::Literal(String::from(\"a\")), PathSegment::Greedy]),\n                \"^/a/.*$\",\n            ),\n            (\n                PathSpec(vec![\n                    PathSegment::Literal(String::from(\"a\")),\n                    PathSegment::Greedy,\n                    PathSegment::Literal(String::from(\"suffix\")),\n                ]),\n                \"^/a/.*/suffix$\",\n            ),\n        ];\n\n        for case in cases {\n            let re: Regex = (&case.0).into();\n            assert_eq!(case.1, re.as_str());\n        }\n    }\n\n    #[test]\n    fn paths_must_match_spec_from_the_beginning_literal() {\n        let spec = RequestSpec::from_parts(\n            Method::GET,\n            vec![PathSegment::Literal(String::from(\"path\"))],\n            Vec::new(),\n        );\n\n        let misses = vec![(Method::GET, \"/beta/path\"), (Method::GET, \"/multiple/stages/in/path\")];\n        for (method, uri) in &misses {\n            assert_eq!(Match::No, spec.matches(&req(method, uri, None)));\n        }\n    }\n\n    #[test]\n    fn paths_must_match_spec_from_the_beginning_label() {\n        let spec = RequestSpec::from_parts(Method::GET, vec![PathSegment::Label], Vec::new());\n\n        let misses = vec![\n            (Method::GET, \"/prefix/label\"),\n            (Method::GET, \"/label/suffix\"),\n            (Method::GET, \"/prefix/label/suffix\"),\n        ];\n        for (method, uri) in &misses {\n            assert_eq!(Match::No, spec.matches(&req(method, uri, None)));\n        }\n    }\n\n    #[test]\n    fn greedy_labels_match_greedily() {\n        let spec = RequestSpec::from_parts(\n            Method::GET,\n            vec![\n                PathSegment::Literal(String::from(\"mg\")),\n                PathSegment::Greedy,\n                PathSegment::Literal(String::from(\"z\")),\n            ],\n            Vec::new(),\n        );\n\n        let hits = vec![\n            (Method::GET, \"/mg/a/z\"),\n            (Method::GET, \"/mg/z/z\"),\n            (Method::GET, \"/mg/a/z/b/z\"),\n            (Method::GET, \"/mg/a/z/z/z\"),\n        ];\n        for (method, uri) in &hits {\n            assert_eq!(Match::Yes, spec.matches(&req(method, uri, None)));\n        }\n    }\n\n    #[test]\n    fn repeated_query_keys() {\n        let spec = RequestSpec::from_parts(Method::DELETE, Vec::new(), vec![QuerySegment::Key(String::from(\"foo\"))]);\n\n        let hits = vec![\n            (Method::DELETE, \"/?foo=bar&foo=bar\"),\n            (Method::DELETE, \"/?foo=bar&foo=baz\"),\n            (Method::DELETE, \"/?foo&foo\"),\n        ];\n        for (method, uri) in &hits {\n            assert_eq!(Match::Yes, spec.matches(&req(method, uri, None)));\n        }\n    }\n\n    fn key_value_spec() -> RequestSpec {\n        RequestSpec::from_parts(\n            Method::DELETE,\n            Vec::new(),\n            vec![QuerySegment::KeyValue(String::from(\"foo\"), String::from(\"bar\"))],\n        )\n    }\n\n    #[test]\n    fn repeated_query_keys_same_values_match() {\n        assert_eq!(\n            Match::Yes,\n            key_value_spec().matches(&req(&Method::DELETE, \"/?foo=bar&foo=bar\", None))\n        );\n    }\n\n    #[test]\n    fn repeated_query_keys_distinct_values_does_not_match() {\n        assert_eq!(\n            Match::No,\n            key_value_spec().matches(&req(&Method::DELETE, \"/?foo=bar&foo=baz\", None))\n        );\n    }\n\n    #[test]\n    fn encoded_query_string() {\n        let request_spec =\n            RequestSpec::from_parts(Method::DELETE, Vec::new(), vec![QuerySegment::Key(\"foo\".to_owned())]);\n\n        assert_eq!(\n            Match::Yes,\n            request_spec.matches(&req(&Method::DELETE, \"/?foo=hello%20world\", None))\n        );\n    }\n\n    fn ab_spec() -> RequestSpec {\n        RequestSpec::from_parts(\n            Method::GET,\n            vec![\n                PathSegment::Literal(String::from(\"a\")),\n                PathSegment::Literal(String::from(\"b\")),\n            ],\n            Vec::new(),\n        )\n    }\n\n    // Empty segments _have meaning_ and should not be stripped away when doing routing or label\n    // extraction.\n    // See https://github.com/awslabs/smithy/issues/1024 for discussion.\n\n    #[test]\n    fn empty_segments_in_the_middle_do_matter() {\n        assert_eq!(Match::Yes, ab_spec().matches(&req(&Method::GET, \"/a/b\", None)));\n\n        let misses = vec![(Method::GET, \"/a//b\"), (Method::GET, \"//////a//b\")];\n        for (method, uri) in &misses {\n            assert_eq!(Match::No, ab_spec().matches(&req(method, uri, None)));\n        }\n    }\n\n    #[test]\n    fn empty_segments_in_the_middle_do_matter_label_spec() {\n        let label_spec = RequestSpec::from_parts(\n            Method::GET,\n            vec![\n                PathSegment::Literal(String::from(\"a\")),\n                PathSegment::Label,\n                PathSegment::Literal(String::from(\"b\")),\n            ],\n            Vec::new(),\n        );\n\n        let hits = vec![\n            (Method::GET, \"/a/label/b\"),\n            (Method::GET, \"/a//b\"), // Label is bound to `\"\"`.\n        ];\n        for (method, uri) in &hits {\n            assert_eq!(Match::Yes, label_spec.matches(&req(method, uri, None)));\n        }\n\n        assert_eq!(Match::No, label_spec.matches(&req(&Method::GET, \"/a///b\", None)));\n    }\n\n    #[test]\n    fn empty_segments_in_the_middle_do_matter_greedy_label_spec() {\n        let greedy_label_spec = RequestSpec::from_parts(\n            Method::GET,\n            vec![\n                PathSegment::Literal(String::from(\"a\")),\n                PathSegment::Greedy,\n                PathSegment::Literal(String::from(\"suffix\")),\n            ],\n            Vec::new(),\n        );\n\n        let hits = vec![\n            (Method::GET, \"/a//suffix\"),\n            (Method::GET, \"/a///suffix\"),\n            (Method::GET, \"/a///a//b///suffix\"),\n        ];\n        for (method, uri) in &hits {\n            assert_eq!(Match::Yes, greedy_label_spec.matches(&req(method, uri, None)));\n        }\n    }\n\n    // The rationale is that `/index` points to the `index` resource, but `/index/` points to \"the\n    // default resource under `index`\", for example `/index/index.html`, so trailing slashes at the\n    // end of URIs _do_ matter.\n    #[test]\n    fn empty_segments_at_the_end_do_matter() {\n        let misses = vec![\n            (Method::GET, \"/a/b/\"),\n            (Method::GET, \"/a/b//\"),\n            (Method::GET, \"//a//b////\"),\n        ];\n        for (method, uri) in &misses {\n            assert_eq!(Match::No, ab_spec().matches(&req(method, uri, None)));\n        }\n    }\n\n    #[test]\n    fn empty_segments_at_the_end_do_matter_label_spec() {\n        let label_spec = RequestSpec::from_parts(\n            Method::GET,\n            vec![PathSegment::Literal(String::from(\"a\")), PathSegment::Label],\n            Vec::new(),\n        );\n\n        let misses = vec![(Method::GET, \"/a\"), (Method::GET, \"/a//\"), (Method::GET, \"/a///\")];\n        for (method, uri) in &misses {\n            assert_eq!(Match::No, label_spec.matches(&req(method, uri, None)));\n        }\n\n        // In the second example, the label is bound to `\"\"`.\n        let hits = vec![(Method::GET, \"/a/label\"), (Method::GET, \"/a/\")];\n        for (method, uri) in &hits {\n            assert_eq!(Match::Yes, label_spec.matches(&req(method, uri, None)));\n        }\n    }\n\n    #[test]\n    fn unsanitary_path() {\n        let spec = RequestSpec::from_parts(\n            Method::GET,\n            vec![\n                PathSegment::Literal(String::from(\"ReDosLiteral\")),\n                PathSegment::Label,\n                PathSegment::Literal(String::from(\"(a+)+\")),\n            ],\n            Vec::new(),\n        );\n\n        assert_eq!(\n            Match::Yes,\n            spec.matches(&req(&Method::GET, \"/ReDosLiteral/abc/(a+)+\", None))\n        );\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http-server/src/routing/route.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n// This code was copied and then modified from Tokio's Axum.\n\n/* Copyright (c) 2021 Tower Contributors\n *\n * Permission is hereby granted, free of charge, to any\n * person obtaining a copy of this software and associated\n * documentation files (the \"Software\"), to deal in the\n * Software without restriction, including without\n * limitation the rights to use, copy, modify, merge,\n * publish, distribute, sublicense, and/or sell copies of\n * the Software, and to permit persons to whom the Software\n * is furnished to do so, subject to the following\n * conditions:\n *\n * The above copyright notice and this permission notice\n * shall be included in all copies or substantial portions\n * of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF\n * ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED\n * TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A\n * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT\n * SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\n * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\n * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR\n * IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\n * DEALINGS IN THE SOFTWARE.\n */\n\nuse crate::body::{Body, BoxBody};\nuse http::{Request, Response};\nuse std::{\n    convert::Infallible,\n    fmt,\n    future::Future,\n    pin::Pin,\n    task::{Context, Poll},\n};\nuse tower::{\n    util::{BoxCloneService, Oneshot},\n    Service, ServiceExt,\n};\n\n/// A HTTP [`Service`] representing a single route.\n///\n/// The construction of [`Route`] from a named HTTP [`Service`] `S`, erases the type of `S`.\npub struct Route<B = Body> {\n    service: BoxCloneService<Request<B>, Response<BoxBody>, Infallible>,\n}\n\nimpl<B> Route<B> {\n    /// Constructs a new [`Route`] from a well-formed HTTP service which is cloneable.\n    pub fn new<T>(svc: T) -> Self\n    where\n        T: Service<Request<B>, Response = Response<BoxBody>, Error = Infallible> + Clone + Send + 'static,\n        T::Future: Send + 'static,\n    {\n        Self {\n            service: BoxCloneService::new(svc),\n        }\n    }\n}\n\nimpl<ReqBody> Clone for Route<ReqBody> {\n    fn clone(&self) -> Self {\n        Self {\n            service: self.service.clone(),\n        }\n    }\n}\n\nimpl<ReqBody> fmt::Debug for Route<ReqBody> {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        f.debug_struct(\"Route\").finish()\n    }\n}\n\nimpl<B> Service<Request<B>> for Route<B> {\n    type Response = Response<BoxBody>;\n    type Error = Infallible;\n    type Future = RouteFuture<B>;\n\n    #[inline]\n    fn poll_ready(&mut self, _cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {\n        Poll::Ready(Ok(()))\n    }\n\n    #[inline]\n    fn call(&mut self, req: Request<B>) -> Self::Future {\n        RouteFuture::new(self.service.clone().oneshot(req))\n    }\n}\n\npin_project_lite::pin_project! {\n    /// Response future for [`Route`].\n    pub struct RouteFuture<B> {\n        #[pin]\n        future: Oneshot<BoxCloneService<Request<B>, Response<BoxBody>, Infallible>, Request<B>>,\n    }\n}\n\nimpl<B> RouteFuture<B> {\n    pub(crate) fn new(future: Oneshot<BoxCloneService<Request<B>, Response<BoxBody>, Infallible>, Request<B>>) -> Self {\n        RouteFuture { future }\n    }\n}\n\nimpl<B> Future for RouteFuture<B> {\n    type Output = Result<Response<BoxBody>, Infallible>;\n\n    #[inline]\n    fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {\n        self.project().future.poll(cx)\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n\n    #[test]\n    fn traits() {\n        use crate::test_helpers::*;\n\n        assert_send::<Route<()>>();\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http-server/src/routing/tiny_map.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::{borrow::Borrow, collections::HashMap, hash::Hash};\n\n/// A map implementation with fast iteration which switches backing storage from [`Vec`] to\n/// [`HashMap`] when the number of entries exceeds `CUTOFF`.\n#[derive(Clone, Debug)]\npub struct TinyMap<K, V, const CUTOFF: usize> {\n    inner: TinyMapInner<K, V, CUTOFF>,\n}\n\n#[derive(Clone, Debug)]\nenum TinyMapInner<K, V, const CUTOFF: usize> {\n    Vec(Vec<(K, V)>),\n    HashMap(HashMap<K, V>),\n}\n\nenum OrIterator<Left, Right> {\n    Left(Left),\n    Right(Right),\n}\n\nimpl<Left, Right> Iterator for OrIterator<Left, Right>\nwhere\n    Left: Iterator,\n    Right: Iterator<Item = Left::Item>,\n{\n    type Item = Left::Item;\n\n    fn next(&mut self) -> Option<Self::Item> {\n        match self {\n            Self::Left(left) => left.next(),\n            Self::Right(right) => right.next(),\n        }\n    }\n}\n\n/// An owning iterator over the entries of a `TinyMap`.\n///\n/// This struct is created by the [`into_iter`](IntoIterator::into_iter) method on [`TinyMap`] (\n/// provided by the [`IntoIterator`] trait). See its documentation for more.\npub struct IntoIter<K, V> {\n    inner: OrIterator<std::vec::IntoIter<(K, V)>, std::collections::hash_map::IntoIter<K, V>>,\n}\n\nimpl<K, V> Iterator for IntoIter<K, V> {\n    type Item = (K, V);\n\n    fn next(&mut self) -> Option<Self::Item> {\n        self.inner.next()\n    }\n}\n\nimpl<K, V, const CUTOFF: usize> IntoIterator for TinyMap<K, V, CUTOFF> {\n    type Item = (K, V);\n\n    type IntoIter = IntoIter<K, V>;\n\n    fn into_iter(self) -> Self::IntoIter {\n        let inner = match self.inner {\n            TinyMapInner::Vec(vec) => OrIterator::Left(vec.into_iter()),\n            TinyMapInner::HashMap(hash_map) => OrIterator::Right(hash_map.into_iter()),\n        };\n        IntoIter { inner }\n    }\n}\n\nimpl<K, V, const CUTOFF: usize> FromIterator<(K, V)> for TinyMap<K, V, CUTOFF>\nwhere\n    K: Hash + Eq,\n{\n    fn from_iter<T: IntoIterator<Item = (K, V)>>(iter: T) -> Self {\n        let mut vec = Vec::with_capacity(CUTOFF);\n        let mut iter = iter.into_iter().enumerate();\n\n        // Populate the `Vec`\n        while let Some((index, pair)) = iter.next() {\n            vec.push(pair);\n\n            // If overflow `CUTOFF` then return a `HashMap` instead\n            if index == CUTOFF {\n                let inner = TinyMapInner::HashMap(vec.into_iter().chain(iter.map(|(_, pair)| pair)).collect());\n                return TinyMap { inner };\n            }\n        }\n\n        TinyMap {\n            inner: TinyMapInner::Vec(vec),\n        }\n    }\n}\n\nimpl<K, V, const CUTOFF: usize> TinyMap<K, V, CUTOFF>\nwhere\n    K: Eq + Hash,\n{\n    /// Returns a reference to the value corresponding to the key.\n    ///\n    /// The key may be borrowed form of map's key type, but [`Hash`] and [`Eq`] on the borrowed\n    /// form _must_ match those for the key type.\n    pub fn get<Q>(&self, key: &Q) -> Option<&V>\n    where\n        K: Borrow<Q>,\n        Q: Hash + Eq + ?Sized,\n    {\n        match &self.inner {\n            TinyMapInner::Vec(vec) => vec\n                .iter()\n                .find(|(key_inner, _)| key_inner.borrow() == key)\n                .map(|(_, value)| value),\n            TinyMapInner::HashMap(hash_map) => hash_map.get(key),\n        }\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n\n    const CUTOFF: usize = 5;\n\n    const SMALL_VALUES: [(&str, usize); 3] = [(\"a\", 0), (\"b\", 1), (\"c\", 2)];\n    const MEDIUM_VALUES: [(&str, usize); 5] = [(\"a\", 0), (\"b\", 1), (\"c\", 2), (\"d\", 3), (\"e\", 4)];\n    const LARGE_VALUES: [(&str, usize); 10] = [\n        (\"a\", 0),\n        (\"b\", 1),\n        (\"c\", 2),\n        (\"d\", 3),\n        (\"e\", 4),\n        (\"f\", 5),\n        (\"g\", 6),\n        (\"h\", 7),\n        (\"i\", 8),\n        (\"j\", 9),\n    ];\n\n    #[test]\n    fn collect_small() {\n        let tiny_map: TinyMap<_, _, CUTOFF> = SMALL_VALUES.into_iter().collect();\n        assert!(matches!(tiny_map.inner, TinyMapInner::Vec(_)))\n    }\n\n    #[test]\n    fn collect_medium() {\n        let tiny_map: TinyMap<_, _, CUTOFF> = MEDIUM_VALUES.into_iter().collect();\n        assert!(matches!(tiny_map.inner, TinyMapInner::Vec(_)))\n    }\n\n    #[test]\n    fn collect_large() {\n        let tiny_map: TinyMap<_, _, CUTOFF> = LARGE_VALUES.into_iter().collect();\n        assert!(matches!(tiny_map.inner, TinyMapInner::HashMap(_)))\n    }\n\n    #[test]\n    fn get_small_success() {\n        let tiny_map: TinyMap<_, _, CUTOFF> = SMALL_VALUES.into_iter().collect();\n        SMALL_VALUES.into_iter().for_each(|(op, val)| {\n            assert_eq!(tiny_map.get(op), Some(&val));\n        });\n    }\n\n    #[test]\n    fn get_medium_success() {\n        let tiny_map: TinyMap<_, _, CUTOFF> = MEDIUM_VALUES.into_iter().collect();\n        MEDIUM_VALUES.into_iter().for_each(|(op, val)| {\n            assert_eq!(tiny_map.get(op), Some(&val));\n        });\n    }\n\n    #[test]\n    fn get_large_success() {\n        let tiny_map: TinyMap<_, _, CUTOFF> = LARGE_VALUES.into_iter().collect();\n        LARGE_VALUES.into_iter().for_each(|(op, val)| {\n            assert_eq!(tiny_map.get(op), Some(&val));\n        });\n    }\n\n    #[test]\n    fn get_small_fail() {\n        let tiny_map: TinyMap<_, _, CUTOFF> = SMALL_VALUES.into_iter().collect();\n        assert_eq!(tiny_map.get(\"x\"), None)\n    }\n\n    #[test]\n    fn get_medium_fail() {\n        let tiny_map: TinyMap<_, _, CUTOFF> = MEDIUM_VALUES.into_iter().collect();\n        assert_eq!(tiny_map.get(\"y\"), None)\n    }\n\n    #[test]\n    fn get_large_fail() {\n        let tiny_map: TinyMap<_, _, CUTOFF> = LARGE_VALUES.into_iter().collect();\n        assert_eq!(tiny_map.get(\"z\"), None)\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http-server/src/runtime_error.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/// A _protocol-agnostic_ type representing an internal framework error. As of writing, this can only\n/// occur upon failure to extract an [`crate::extension::Extension`] from the request.\n/// This type is converted into protocol-specific error variants. For example, in the\n/// [`crate::protocol::rest_json_1`] protocol, it is converted to the\n/// [`crate::protocol::rest_json_1::runtime_error::RuntimeError::InternalFailure`] variant.\npub struct InternalFailureException;\n\npub const INVALID_HTTP_RESPONSE_FOR_RUNTIME_ERROR_PANIC_MESSAGE: &str = \"invalid HTTP response for `RuntimeError`; please file a bug report under https://github.com/smithy-lang/smithy-rs/issues\";\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http-server/src/service.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! The shape of a [Smithy service] is modelled by the [`ServiceShape`] trait. Its associated types\n//! [`ServiceShape::ID`], [`ServiceShape::VERSION`], [`ServiceShape::Protocol`], and [`ServiceShape::Operations`] map\n//! to the services [Shape ID](https://smithy.io/2.0/spec/model.html#shape-id), the version field, the applied\n//! [protocol trait](https://smithy.io/2.0/aws/protocols/index.html) (see [`protocol`](crate::protocol) module), and the\n//! operations field.\n//!\n//! We generate an implementation on this for every service struct (exported from the root of the generated crate).\n//!\n//! As stated in the [operation module documentation](crate::operation) we also generate marker structs for\n//! [`OperationShape`](crate::operation::OperationShape), these are coupled to the `S: ServiceShape` via the [`ContainsOperation`] trait.\n//!\n//! The model\n//!\n//! ```smithy\n//! @restJson1\n//! service Shopping {\n//!     version: \"1.0\",\n//!     operations: [\n//!         GetShopping,\n//!         PutShopping\n//!     ]\n//! }\n//! ```\n//!\n//! is identified with the implementation\n//!\n//! ```rust,no_run\n//! # use aws_smithy_legacy_http_server::shape_id::ShapeId;\n//! # use aws_smithy_legacy_http_server::service::{ServiceShape, ContainsOperation};\n//! # use aws_smithy_legacy_http_server::protocol::rest_json_1::RestJson1;\n//! # pub struct Shopping;\n//! // For more information on these marker structs see `OperationShape`\n//! struct GetShopping;\n//! struct PutShopping;\n//!\n//! // This is a generated enumeration of all operations.\n//! #[derive(PartialEq, Eq, Clone, Copy)]\n//! pub enum Operation {\n//!     GetShopping,\n//!     PutShopping\n//! }\n//!\n//! impl ServiceShape for Shopping {\n//!     const ID: ShapeId = ShapeId::new(\"namespace#Shopping\", \"namespace\", \"Shopping\");\n//!     const VERSION: Option<&'static str> = Some(\"1.0\");\n//!     type Protocol = RestJson1;\n//!     type Operations = Operation;\n//! }\n//!\n//! impl ContainsOperation<GetShopping> for Shopping {\n//!     const VALUE: Operation = Operation::GetShopping;\n//! }\n//!\n//! impl ContainsOperation<PutShopping> for Shopping {\n//!     const VALUE: Operation = Operation::PutShopping;\n//! }\n//! ```\n//!\n//! [Smithy service]: https://smithy.io/2.0/spec/service-types.html#service\n\nuse crate::shape_id::ShapeId;\n\n/// Models the [Smithy Service shape].\n///\n/// [Smithy Service shape]: https://smithy.io/2.0/spec/service-types.html#service\npub trait ServiceShape {\n    /// The [`ShapeId`] of the service.\n    const ID: ShapeId;\n\n    /// The version of the service.\n    const VERSION: Option<&'static str>;\n\n    /// The [Protocol] applied to this service.\n    ///\n    /// [Protocol]: https://smithy.io/2.0/spec/protocol-traits.html\n    type Protocol;\n\n    /// An enumeration of all operations contained in this service.\n    type Operations;\n}\n\npub trait ContainsOperation<Op>: ServiceShape {\n    const VALUE: Self::Operations;\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http-server/src/shape_id.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! A [`ShapeId`] represents a [Smithy Shape ID](https://smithy.io/2.0/spec/model.html#shape-id).\n//!\n//! # Example\n//!\n//! In the following model:\n//!\n//! ```smithy\n//! namespace smithy.example\n//!\n//! operation CheckHealth {}\n//! ```\n//!\n//! - `absolute` is `\"smithy.example#CheckHealth\"`\n//! - `namespace` is `\"smithy.example\"`\n//! - `name` is `\"CheckHealth\"`\n\npub use crate::request::extension::{Extension, MissingExtension};\n\n/// Represents a [Smithy Shape ID](https://smithy.io/2.0/spec/model.html#shape-id).\n#[derive(Debug, Clone, PartialEq, Eq, Hash)]\npub struct ShapeId {\n    absolute: &'static str,\n\n    namespace: &'static str,\n    name: &'static str,\n}\n\nimpl ShapeId {\n    /// Constructs a new [`ShapeId`]. This is used by the code-generator which preserves the invariants of the Shape ID format.\n    #[doc(hidden)]\n    pub const fn new(absolute: &'static str, namespace: &'static str, name: &'static str) -> Self {\n        Self {\n            absolute,\n            namespace,\n            name,\n        }\n    }\n\n    /// Returns the namespace.\n    ///\n    /// See [Shape ID](https://smithy.io/2.0/spec/model.html#shape-id) for a breakdown of the syntax.\n    pub fn namespace(&self) -> &'static str {\n        self.namespace\n    }\n\n    /// Returns the member name.\n    ///\n    /// See [Shape ID](https://smithy.io/2.0/spec/model.html#shape-id) for a breakdown of the syntax.\n    pub fn name(&self) -> &'static str {\n        self.name\n    }\n\n    /// Returns the absolute shape ID.\n    ///\n    /// See [Shape ID](https://smithy.io/2.0/spec/model.html#shape-id) for a breakdown of the syntax.\n    pub fn absolute(&self) -> &'static str {\n        self.absolute\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-legacy-http-server/src/test_helpers.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npub(crate) fn assert_send<T: Send>() {}\npub(crate) fn assert_sync<T: Sync>() {}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-mocks/Cargo.toml",
    "content": "[package]\nname = \"aws-smithy-mocks\"\nversion = \"0.2.6\"\nauthors = [\"AWS Rust SDK Team <aws-sdk-rust@amazon.com>\"]\ndescription = \"Testing utilities for smithy-rs generated clients\"\nedition = \"2021\"\nlicense = \"Apache-2.0\"\nrepository = \"https://github.com/smithy-lang/smithy-rs\"\nrust-version = \"1.91.1\"\n\n[dependencies]\naws-smithy-types = { path = \"../aws-smithy-types\" }\naws-smithy-runtime-api = { path = \"../aws-smithy-runtime-api\", features = [\"client\", \"http-1x\", \"test-util\"] }\naws-smithy-http-client = { path = \"../aws-smithy-http-client\", features = [\"test-util\"] }\nhttp = \"1.3.1\"\n\n[dev-dependencies]\ntokio = { version = \"1\", features = [\"full\"]}\naws-smithy-async = { path = \"../aws-smithy-async\", features = [\"rt-tokio\"] }\naws-smithy-runtime = { path = \"../aws-smithy-runtime\", features = [\"client\"] }\n\n[package.metadata.docs.rs]\nall-features = true\ntargets = [\"x86_64-unknown-linux-gnu\"]\ncargo-args = [\"-Zunstable-options\", \"-Zrustdoc-scrape-examples\"]\nrustdoc-args = [\"--cfg\", \"docsrs\"]\n# End of docs.rs metadata\n"
  },
  {
    "path": "rust-runtime/aws-smithy-mocks/LICENSE",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n"
  },
  {
    "path": "rust-runtime/aws-smithy-mocks/README.md",
    "content": "# aws-smithy-mocks\n\nA flexible mocking framework for testing clients generated by smithy-rs, including all packages of the AWS SDK for Rust.\n\nThis crate provides a simple yet powerful way to mock SDK client responses for testing purposes.\nIt uses interceptors to return stub responses, allowing you to test both happy-path and error scenarios\nwithout mocking the entire client or using traits.\n\n## Key Features\n\n- **Simple API**: Create mock rules with a fluent API using the [`mock!`] macro\n- **Flexible Response Types**: Return modeled outputs, errors, or raw HTTP responses\n- **Request Matching**: Match requests based on their properties\n- **Response Sequencing**: Define sequences of responses for testing retry behavior\n- **Rule Modes**: Control how rules are matched and applied\n\n## Prerequisites\n\n<div class=\"warning\">\nYou must enable the `test-util` feature of the service client crate in order to use the `mock_client` macro. This should\nusually only be enabled as part of your `dev-dependencies` (see the example `Cargo.toml` below).\n</div>\n\nIf the feature is not enabled a compilation error similar to the following will occur:\n\n```txt\nno method named with_test_defaults found for struct <service-client-crate>::config::Builder in the current scope\nmethod not found in Builder\n```\n\nExample `Cargo.toml` using the `aws-sdk-s3` crate as the service client crate under test:\n\n```toml\n[dependencies]\naws-sdk-s3 = \"1\"\n\n[dev-dependencies]\naws-smithy-mocks = \"0.2\"\naws-sdk-s3 = { version = \"1\", features = [\"test-util\"] }\n```\n\n## Basic Usage\n\n```rust,ignore\nuse aws_sdk_s3::operation::get_object::GetObjectOutput;\nuse aws_sdk_s3::Client;\nuse aws_smithy_types::byte_stream::ByteStream;\nuse aws_smithy_mocks::{mock, mock_client};\n\n#[tokio::test]\nasync fn test_s3_get_object() {\n    // Create a rule that returns a successful response\n    let get_object_rule = mock!(Client::get_object)\n        .match_requests(|req| req.bucket() == Some(\"test-bucket\") && req.key() == Some(\"test-key\"))\n        .then_output(|| GetObjectOutput::builder()\n            .body(ByteStream::from_static(b\"test-content\"))\n            .build()\n         );\n\n    // Create a mocked client with the rule\n    let s3 = mock_client!(aws_sdk_s3, [&get_object_rule]);\n\n    // Use the client as you would normally\n    let result = s3.get_object()\n        .bucket(\"test-bucket\")\n        .key(\"test-key\")\n        .send()\n        .await\n        .expect(\"success response\");\n\n    // Verify the response\n    let data = result.body.collect().await.expect(\"successful read\").to_vec();\n    assert_eq!(data, b\"test-content\");\n\n    // Verify the rule was used\n    assert_eq!(get_object_rule.num_calls(), 1);\n}\n```\n\n## Creating Rules\n\nRules are created using the [`mock!`] macro, which takes a client operation as an argument:\n\n```rust,ignore\nlet rule = mock!(Client::get_object)\n    // Optional: Add a matcher to filter requests\n    .match_requests(|req| req.bucket() == Some(\"test-bucket\"))\n    // Add a response\n    .then_output(|| GetObjectOutput::builder().build());\n```\n\n### Response Types\n\nYou can return different types of responses:\n\n```rust,ignore\n// Return a modeled output\nlet success_rule = mock!(Client::get_object)\n    .then_output(|| GetObjectOutput::builder().build());\n\n// Return a modeled error\nlet error_rule = mock!(Client::get_object)\n    .then_error(|| GetObjectError::NoSuchKey(NoSuchKey::builder().build()));\n\n// Return an HTTP response\nlet http_rule = mock!(Client::get_object)\n    .then_http_response(|| HttpResponse::new(\n        StatusCode::try_from(503).unwrap(),\n        SdkBody::from(\"service unavailable\")\n    ));\n\n// Return a computed output based on the input\nlet compute_rule = mock!(Client::get_object)\n    .then_compute_output(|req| {\n        let key = req.key().unwrap_or(\"unknown\");\n        GetObjectOutput::builder()\n            .body(ByteStream::from_static(format!(\"content for {}\", key).as_bytes()))\n            .build()\n    });\n\n// Return any response type (output, error, or HTTP) based on the input\nlet conditional_rule = mock!(Client::get_object)\n    .then_compute_response(|req| {\n        use aws_smithy_mocks::MockResponse;\n        if req.key() == Some(\"error-key\") {\n            MockResponse::Error(GetObjectError::NoSuchKey(NoSuchKey::builder().build()))\n        } else {\n            MockResponse::Output(GetObjectOutput::builder()\n                .body(ByteStream::from_static(b\"success\"))\n                .build())\n        }\n    });\n```\n\n### Response Sequences\n\nFor testing retry behavior or complex scenarios, you can define sequences of responses using the sequence builder API:\n\n```rust,ignore\nlet retry_rule = mock!(Client::get_object)\n    .sequence()\n    .http_status(503, None)                          // First call returns 503\n    .http_status(503, None)                          // Second call returns 503\n    .output(|| GetObjectOutput::builder().build())   // Third call succeeds\n    .build();\n\n// With repetition using `times()`\nlet retry_rule = mock!(Client::get_object)\n    .sequence()\n    .http_status(503, None)\n    .times(2)                                        // First two calls return 503\n    .output(|| GetObjectOutput::builder().build())   // Third call succeeds\n    .build();\n\n// Repeat a response indefinitely\nlet infinite_rule = mock!(Client::get_object)\n    .sequence()\n    .error(|| GetObjectError::NoSuchKey(NoSuchKey::builder().build()))\n    .output(|| GetObjectOutput::builder().build())   // Second call succeeds\n    .repeatedly()                                    // All subsequent calls succeed\n    .build();\n```\n\nThe `times(n)` method repeats the last added response `n` times, while `repeatedly()` causes the last response to\nrepeat indefinitely, making the rule never exhaust.\n\nThe sequence builder API provides a fluent interface for defining sequences of responses.\nAfter providing all responses in the sequence, the rule is considered exhausted.\n\n## Creating Mocked Clients\n\nUse the [`mock_client!`] macro to create a client with your rules:\n\n```rust,ignore\n// Create a client with a single rule\nlet client = mock_client!(aws_sdk_s3, [&rule]);\n\n// Create a client with multiple rules and a specific rule mode\nlet client = mock_client!(aws_sdk_s3, RuleMode::Sequential, [&rule1, &rule2]);\n\n// Create a client with additional configuration\nlet client = mock_client!(\n    aws_sdk_s3,\n    RuleMode::Sequential,\n    [&rule],\n    |config| config.force_path_style(true)\n);\n```\n\n## Rule Modes\n\nThe [`RuleMode`] enum controls how rules are matched and applied:\n\nGiven a simple (non-sequenced) based rule (e.g. `.then_output()`, `.then_error()`, or `.then_http_response()`):\n- `RuleMode::Sequential`: The rule is used once and then the next rule is used.\n- `RuleMode::MatchAny`: Rule is used repeatedly as many times as it is matched.\n\nIn other words, simple rules behave as single use rules in `Sequential` mode and as infinite sequences in `MatchAny` mode.\n\nGiven a sequenced rule (e.g. via `.sequence()`):\n- `RuleMode::Sequential`: Rules are tried in order. When a rule is exhausted, the next rule is used.\n- `RuleMode::MatchAny`: The first (non-exhausted) matching rule is used, regardless of order.\n\n```rust,ignore\nlet interceptor = MockResponseInterceptor::new()\n    .rule_mode(RuleMode::Sequential)\n    .with_rule(&rule1)\n    .with_rule(&rule2);\n```\n\n## Testing Retry Behavior\n\nThe mocking framework supports testing retry behavior by allowing you to define sequences of responses:\n\n```rust,ignore\n#[tokio::test]\nasync fn test_retry() {\n    // Create a rule that returns errors for the first two attempts, then succeeds\n    let rule = mock!(Client::get_object)\n        .sequence()\n        .http_status(503, None)\n        .times(2)                                       // Service unavailable for first two calls\n        .output(|| GetObjectOutput::builder().build())  // Success on third call\n        .build();\n\n    // Create a client with retry enabled\n    let client = mock_client!(aws_sdk_s3, [&rule]);\n\n    // The operation should succeed after retries\n    let result = client.get_object()\n        .bucket(\"test-bucket\")\n        .key(\"test-key\")\n        .send()\n        .await;\n\n    assert!(result.is_ok());\n    assert_eq!(rule.num_calls(), 3);  // Called 3 times (2 failures + 1 success)\n}\n```\n\n\n### Testing Different Responses Based on Request Parameters\n\n```rust,ignore\n#[tokio::test]\nasync fn test_different_responses() {\n    // Create rules for different request parameters\n    let exists_rule = mock!(Client::get_object)\n        .match_requests(|req| req.bucket() == Some(\"test-bucket\") && req.key() == Some(\"exists\"))\n        .sequence()\n        .output(|| GetObjectOutput::builder()\n            .body(ByteStream::from_static(b\"found\"))\n            .build())\n        .build();\n\n    let not_exists_rule = mock!(Client::get_object)\n        .match_requests(|req| req.bucket() == Some(\"test-bucket\") && req.key() == Some(\"not-exists\"))\n        .sequence()\n        .error(|| GetObjectError::NoSuchKey(NoSuchKey::builder().build()))\n        .build();\n\n    // Create a mocked client with the rules in MatchAny mode\n    let s3 = mock_client!(aws_sdk_s3, RuleMode::MatchAny, [&exists_rule, &not_exists_rule]);\n\n    // Test the \"exists\" case\n    let result1 = s3\n        .get_object()\n        .bucket(\"test-bucket\")\n        .key(\"exists\")\n        .send()\n        .await\n        .expect(\"object exists\");\n\n    let data = result1.body.collect().await.expect(\"successful read\").to_vec();\n    assert_eq!(data, b\"found\");\n\n    // Test the \"not-exists\" case\n    let result2 = s3\n        .get_object()\n        .bucket(\"test-bucket\")\n        .key(\"not-exists\")\n        .send()\n        .await;\n\n    assert!(result2.is_err());\n    assert!(matches!(result2.unwrap_err().into_service_error(),\n                    GetObjectError::NoSuchKey(_)));\n}\n```\n\n<!-- anchor_start:footer -->\nThis crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator.\n<!-- anchor_end:footer -->\n"
  },
  {
    "path": "rust-runtime/aws-smithy-mocks/src/interceptor.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::{MockResponse, Rule, RuleMode};\nuse aws_smithy_http_client::test_util::infallible_client_fn;\nuse aws_smithy_runtime_api::box_error::BoxError;\nuse aws_smithy_runtime_api::client::http::SharedHttpClient;\nuse aws_smithy_runtime_api::client::interceptors::context::{\n    BeforeSerializationInterceptorContextRef, BeforeTransmitInterceptorContextMut, Error,\n    FinalizerInterceptorContextMut, Input, Output,\n};\nuse aws_smithy_runtime_api::client::interceptors::Intercept;\nuse aws_smithy_runtime_api::client::orchestrator::{HttpResponse, OrchestratorError};\nuse aws_smithy_runtime_api::client::runtime_components::RuntimeComponents;\nuse aws_smithy_types::body::SdkBody;\nuse aws_smithy_types::config_bag::{ConfigBag, Storable, StoreReplace};\nuse std::collections::{HashMap, VecDeque};\nuse std::fmt;\nuse std::sync::atomic::{AtomicUsize, Ordering};\nuse std::sync::{Arc, Mutex};\n\n// Store active rule in config bag\n#[derive(Debug, Clone)]\nstruct ActiveRule(Rule);\n\nimpl Storable for ActiveRule {\n    type Storer = StoreReplace<ActiveRule>;\n}\n\n// Store the response ID in the config bag so that we can find the proper response\n#[derive(Debug, Clone)]\nstruct ResponseId(usize);\n\nimpl Storable for ResponseId {\n    type Storer = StoreReplace<ResponseId>;\n}\n\n/// Interceptor which produces mock responses based on a list of rules\npub struct MockResponseInterceptor {\n    rules: Arc<Mutex<VecDeque<Rule>>>,\n    rule_mode: RuleMode,\n    must_match: bool,\n    active_responses: Arc<Mutex<HashMap<usize, MockResponse<Output, Error>>>>,\n    /// Monotonically increasing identifier that identifies a given response\n    /// so that we can store it on the request path and correctly load it back\n    /// on the response path.\n    current_response_id: Arc<AtomicUsize>,\n}\n\nimpl fmt::Debug for MockResponseInterceptor {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        write!(f, \"{} rules\", self.rules.lock().unwrap().len())\n    }\n}\n\nimpl Default for MockResponseInterceptor {\n    fn default() -> Self {\n        Self::new()\n    }\n}\n\nimpl MockResponseInterceptor {\n    /// Create a new [MockResponseInterceptor]\n    ///\n    /// This is normally created and registered on a client through the [`mock_client`](crate::mock_client) macro.\n    pub fn new() -> Self {\n        Self {\n            rules: Default::default(),\n            rule_mode: RuleMode::MatchAny,\n            must_match: true,\n            active_responses: Default::default(),\n            current_response_id: Default::default(),\n        }\n    }\n    /// Add a rule to the Interceptor\n    ///\n    /// Rules are matched in order—this rule will only apply if all previous rules do not match.\n    pub fn with_rule(self, rule: &Rule) -> Self {\n        self.rules.lock().unwrap().push_back(rule.clone());\n        self\n    }\n\n    /// Set the RuleMode to use when evaluating rules.\n    ///\n    /// See `RuleMode` enum for modes and how they are applied.\n    pub fn rule_mode(mut self, rule_mode: RuleMode) -> Self {\n        self.rule_mode = rule_mode;\n        self\n    }\n\n    /// Allow passthrough for unmatched requests.\n    ///\n    /// By default, if a request doesn't match any rule, the interceptor will panic.\n    /// This method allows unmatched requests to pass through.\n    pub fn allow_passthrough(mut self) -> Self {\n        self.must_match = false;\n        self\n    }\n}\n\nimpl Intercept for MockResponseInterceptor {\n    fn name(&self) -> &'static str {\n        \"MockResponseInterceptor\"\n    }\n\n    fn read_before_serialization(\n        &self,\n        context: &BeforeSerializationInterceptorContextRef<'_>,\n        _runtime_components: &RuntimeComponents,\n        cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        let mut rules = self.rules.lock().unwrap();\n        let input = context.inner().input().expect(\"input set\");\n\n        // Find a matching rule and get its response\n        let mut matching_rule = None;\n        let mut matching_response = None;\n\n        match self.rule_mode {\n            RuleMode::Sequential => {\n                // Sequential mode requires rules match in-order\n                let i = 0;\n                while i < rules.len() && matching_response.is_none() {\n                    let rule = &rules[i];\n\n                    // Check if the rule is already exhausted or if it's a simple rule used once\n                    //\n                    // In `aws-smithy-mocks-experimental` all rules were infinite sequences\n                    // but were only usable once in sequential mode. We retain that here for\n                    // backwards compatibility.\n                    if rule.is_exhausted() || (rule.is_simple() && rule.num_calls() > 0) {\n                        // Rule is exhausted, remove it and try the next one\n                        rules.remove(i);\n                        continue; // Don't increment i since we removed an element\n                    }\n\n                    // Check if the rule matches\n                    if !(rule.matcher)(input) {\n                        // Rule doesn't match, this is an error in sequential mode\n                        panic!(\"In order matching was enforced but rule did not match {input:?}\");\n                    }\n\n                    // Rule matches and is not exhausted, get the response\n                    if let Some(response) = rule.next_response(input) {\n                        matching_rule = Some(rule.clone());\n                        matching_response = Some(response);\n                    } else {\n                        // Rule is exhausted, remove it and try the next one\n                        rules.remove(i);\n                        continue; // Don't increment i since we removed an element\n                    }\n\n                    // We found a matching rule and got a response, so we're done\n                    break;\n                }\n            }\n            RuleMode::MatchAny => {\n                // Find any matching rule with a response\n                for rule in rules.iter() {\n                    // Skip exhausted rules\n                    if rule.is_exhausted() {\n                        continue;\n                    }\n\n                    if (rule.matcher)(input) {\n                        if let Some(response) = rule.next_response(input) {\n                            matching_rule = Some(rule.clone());\n                            matching_response = Some(response);\n                            break;\n                        }\n                    }\n                }\n            }\n        };\n\n        match (matching_rule, matching_response) {\n            (Some(rule), Some(response)) => {\n                // Store the rule in the config bag\n                cfg.interceptor_state().store_put(ActiveRule(rule));\n\n                // we have to store the response on the interceptor, because going\n                // through interceptor context requires the type to impl Clone.  to\n                // find the right response for this request we generate a new monotonically\n                // increasing identifier, store that on request context, and then map from\n                // the response identifier to the response payload on the global interceptor\n                // state.\n                let response_id = self.current_response_id.fetch_add(1, Ordering::SeqCst);\n                cfg.interceptor_state().store_put(ResponseId(response_id));\n                let mut active_responses = self.active_responses.lock().unwrap();\n                active_responses.insert(response_id, response);\n            }\n            _ => {\n                // No matching rule or no response\n                if self.must_match {\n                    panic!(\n                        \"must_match was enabled but no rules matched or all rules were exhausted for {input:?}\"\n                    );\n                }\n            }\n        }\n\n        Ok(())\n    }\n\n    fn modify_before_transmit(\n        &self,\n        context: &mut BeforeTransmitInterceptorContextMut<'_>,\n        _runtime_components: &RuntimeComponents,\n        cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        if let Some(response_id) = cfg.load::<ResponseId>() {\n            let mut state = self.active_responses.lock().unwrap();\n            let mut active_response = state.remove(&response_id.0);\n            if active_response.is_none() {\n                // in the case of retries we try to get the next response if it has been consumed\n                if let Some(active_rule) = cfg.load::<ActiveRule>() {\n                    // During retries, input is not available in modify_before_transmit.\n                    // For HTTP status responses that don't use the input, we can use a dummy input.\n                    let dummy_input = Input::doesnt_matter();\n                    let next_resp = active_rule.0.next_response(&dummy_input);\n                    active_response = next_resp;\n                }\n            }\n\n            if let Some(resp) = active_response {\n                match resp {\n                    // place the http response into the extensions and let the HTTP client return it\n                    MockResponse::Http(http_resp) => {\n                        context\n                            .request_mut()\n                            .add_extension(MockHttpResponse(Arc::new(http_resp)));\n                    }\n                    _ => {\n                        // put it back for modeled output/errors\n                        state.insert(response_id.0, resp);\n                    }\n                }\n            }\n        }\n\n        Ok(())\n    }\n\n    fn modify_before_attempt_completion(\n        &self,\n        context: &mut FinalizerInterceptorContextMut<'_>,\n        _runtime_components: &RuntimeComponents,\n        cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        // Handle modeled responses\n        if let Some(response_id) = cfg.load::<ResponseId>() {\n            let mut state = self.active_responses.lock().unwrap();\n            let active_response = state.remove(&response_id.0);\n            if let Some(resp) = active_response {\n                match resp {\n                    MockResponse::Output(output) => {\n                        context.inner_mut().set_output_or_error(Ok(output));\n                    }\n                    MockResponse::Error(error) => {\n                        context\n                            .inner_mut()\n                            .set_output_or_error(Err(OrchestratorError::operation(error)));\n                    }\n                    MockResponse::Http(_) => {\n                        // HTTP responses are handled by the mock HTTP client\n                    }\n                }\n            }\n        }\n\n        Ok(())\n    }\n}\n\n/// Extension for storing mock HTTP responses in request extensions\n#[derive(Clone)]\nstruct MockHttpResponse(Arc<HttpResponse>);\n\n/// Create a mock HTTP client that works with the interceptor using existing utilities\npub fn create_mock_http_client() -> SharedHttpClient {\n    infallible_client_fn(|mut req| {\n        // Try to get the mock HTTP response generator from the extensions\n        if let Some(mock_response) = req.extensions_mut().remove::<MockHttpResponse>() {\n            let http_resp =\n                Arc::try_unwrap(mock_response.0).expect(\"mock HTTP response has single reference\");\n            return http_resp.try_into_http1x().unwrap();\n        }\n\n        // Default dummy response if no mock response is defined\n        http::Response::builder()\n            .status(418)\n            .body(SdkBody::from(\"Mock HTTP client dummy response\"))\n            .unwrap()\n    })\n}\n\n#[cfg(test)]\nmod tests {\n    use aws_smithy_async::rt::sleep::{SharedAsyncSleep, TokioSleep};\n    use aws_smithy_runtime::client::orchestrator::operation::Operation;\n    use aws_smithy_runtime::client::retries::classifiers::HttpStatusCodeClassifier;\n    use aws_smithy_runtime_api::client::orchestrator::{\n        HttpRequest, HttpResponse, OrchestratorError,\n    };\n    use aws_smithy_runtime_api::client::result::SdkError;\n    use aws_smithy_runtime_api::http::StatusCode;\n    use aws_smithy_types::body::SdkBody;\n    use aws_smithy_types::retry::RetryConfig;\n    use aws_smithy_types::timeout::TimeoutConfig;\n\n    use crate::{create_mock_http_client, MockResponseInterceptor, RuleBuilder, RuleMode};\n    use std::time::Duration;\n\n    // Simple test input and output types\n    #[derive(Debug)]\n    struct TestInput {\n        bucket: String,\n        key: String,\n    }\n    impl TestInput {\n        fn new(bucket: &str, key: &str) -> Self {\n            Self {\n                bucket: bucket.to_string(),\n                key: key.to_string(),\n            }\n        }\n    }\n\n    #[derive(Debug, PartialEq)]\n    struct TestOutput {\n        content: String,\n    }\n\n    impl TestOutput {\n        fn new(content: &str) -> Self {\n            Self {\n                content: content.to_string(),\n            }\n        }\n    }\n\n    #[derive(Debug)]\n    struct TestError {\n        message: String,\n    }\n\n    impl TestError {\n        fn new(message: &str) -> Self {\n            Self {\n                message: message.to_string(),\n            }\n        }\n    }\n\n    impl std::fmt::Display for TestError {\n        fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n            write!(f, \"{}\", self.message)\n        }\n    }\n\n    impl std::error::Error for TestError {}\n\n    // Helper function to create a RuleBuilder with proper type hints\n    fn create_rule_builder() -> RuleBuilder<TestInput, TestOutput, TestError> {\n        RuleBuilder::new_from_mock(\n            || TestInput {\n                bucket: \"\".to_string(),\n                key: \"\".to_string(),\n            },\n            || {\n                let fut: std::future::Ready<Result<TestOutput, SdkError<TestError, HttpResponse>>> =\n                    std::future::ready(Ok(TestOutput {\n                        content: \"\".to_string(),\n                    }));\n                fut\n            },\n        )\n    }\n\n    // Helper function to create an Operation with common configuration\n    fn create_test_operation(\n        interceptor: MockResponseInterceptor,\n        enable_retries: bool,\n    ) -> Operation<TestInput, TestOutput, TestError> {\n        let builder = Operation::builder()\n            .service_name(\"test\")\n            .operation_name(\"test\")\n            .http_client(create_mock_http_client())\n            .endpoint_url(\"http://localhost:1234\")\n            .no_auth()\n            .sleep_impl(SharedAsyncSleep::new(TokioSleep::new()))\n            .timeout_config(TimeoutConfig::disabled())\n            .interceptor(interceptor)\n            .serializer(|input: TestInput| {\n                let mut request = HttpRequest::new(SdkBody::empty());\n                request\n                    .set_uri(format!(\"/{}/{}\", input.bucket, input.key))\n                    .expect(\"valid URI\");\n                Ok(request)\n            })\n            .deserializer::<TestOutput, TestError>(|response| {\n                if response.status().is_success() {\n                    let body = std::str::from_utf8(response.body().bytes().unwrap())\n                        .unwrap_or(\"empty body\")\n                        .to_string();\n                    Ok(TestOutput { content: body })\n                } else {\n                    Err(OrchestratorError::operation(TestError {\n                        message: format!(\"Error: {}\", response.status()),\n                    }))\n                }\n            });\n\n        if enable_retries {\n            let retry_config = RetryConfig::standard()\n                .with_max_attempts(5)\n                .with_initial_backoff(Duration::from_millis(1))\n                .with_max_backoff(Duration::from_millis(5));\n\n            builder\n                .retry_classifier(HttpStatusCodeClassifier::default())\n                .standard_retry(&retry_config)\n                .build()\n        } else {\n            builder.no_retry().build()\n        }\n    }\n\n    #[tokio::test]\n    async fn test_retry_sequence() {\n        // Create a rule with repeated error responses followed by success\n        let rule = create_rule_builder()\n            .match_requests(|input| input.bucket == \"test-bucket\" && input.key == \"test-key\")\n            .sequence()\n            .http_status(503, None)\n            .times(2)\n            .output(|| TestOutput::new(\"success after retries\"))\n            .build();\n\n        // Create an interceptor with the rule\n        let interceptor = MockResponseInterceptor::new()\n            .rule_mode(RuleMode::Sequential)\n            .with_rule(&rule);\n\n        let operation = create_test_operation(interceptor, true);\n\n        // Make a single request - it should automatically retry through the sequence\n        let result = operation\n            .invoke(TestInput::new(\"test-bucket\", \"test-key\"))\n            .await;\n\n        // Should succeed with the final output after retries\n        assert!(\n            result.is_ok(),\n            \"Expected success but got error: {:?}\",\n            result.err()\n        );\n        assert_eq!(\n            result.unwrap(),\n            TestOutput {\n                content: \"success after retries\".to_string()\n            }\n        );\n\n        // Verify the rule was used the expected number of times (all 4 responses: 2 errors + 1 success)\n        assert_eq!(rule.num_calls(), 3);\n    }\n\n    #[tokio::test]\n    async fn test_compute_output() {\n        // Create a rule that computes its responses based off of input data\n        let rule = create_rule_builder()\n            .match_requests(|input| input.bucket == \"test-bucket\" && input.key == \"test-key\")\n            .then_compute_output(|input| TestOutput {\n                content: format!(\"{}.{}\", input.bucket, input.key),\n            });\n\n        // Create an interceptor with the rule\n        let interceptor = MockResponseInterceptor::new()\n            .rule_mode(RuleMode::Sequential)\n            .with_rule(&rule);\n\n        let operation = create_test_operation(interceptor, true);\n\n        let result = operation\n            .invoke(TestInput::new(\"test-bucket\", \"test-key\"))\n            .await;\n\n        // Should succeed with the output derived from input\n        assert!(\n            result.is_ok(),\n            \"Expected success but got error: {:?}\",\n            result.err()\n        );\n        assert_eq!(\n            result.unwrap(),\n            TestOutput {\n                content: \"test-bucket.test-key\".to_string()\n            }\n        );\n\n        // Verify the rule was used once, no retries\n        assert_eq!(rule.num_calls(), 1);\n    }\n\n    #[should_panic(\n        expected = \"must_match was enabled but no rules matched or all rules were exhausted for\"\n    )]\n    #[tokio::test]\n    async fn test_exhausted_rules_sequential() {\n        // Create a rule with a single response\n        let rule = create_rule_builder().then_output(|| TestOutput::new(\"only response\"));\n\n        // Create an interceptor with the rule\n        let interceptor = MockResponseInterceptor::new()\n            .rule_mode(RuleMode::Sequential)\n            .with_rule(&rule);\n\n        let operation = create_test_operation(interceptor, false);\n\n        // First call should succeed\n        let result1 = operation\n            .invoke(TestInput::new(\"test-bucket\", \"test-key\"))\n            .await;\n        assert!(result1.is_ok());\n\n        // Second call should panic because the rules are exhausted\n        let _result2 = operation\n            .invoke(TestInput::new(\"test-bucket\", \"test-key\"))\n            .await;\n    }\n\n    #[tokio::test]\n    async fn test_rule_mode_match_any() {\n        // Create two rules with different matchers\n        let rule1 = create_rule_builder()\n            .match_requests(|input| input.bucket == \"bucket1\")\n            .then_output(|| TestOutput::new(\"response1\"));\n\n        let rule2 = create_rule_builder()\n            .match_requests(|input| input.bucket == \"bucket2\")\n            .then_output(|| TestOutput::new(\"response2\"));\n\n        // Create an interceptor with both rules in MatchAny mode\n        let interceptor = MockResponseInterceptor::new()\n            .rule_mode(RuleMode::MatchAny)\n            .with_rule(&rule1)\n            .with_rule(&rule2);\n\n        let operation = create_test_operation(interceptor, false);\n\n        // Call with bucket1 should match rule1\n        let result1 = operation\n            .invoke(TestInput::new(\"bucket1\", \"test-key\"))\n            .await;\n        assert!(result1.is_ok());\n        assert_eq!(result1.unwrap(), TestOutput::new(\"response1\"));\n\n        // Call with bucket2 should match rule2\n        let result2 = operation\n            .invoke(TestInput::new(\"bucket2\", \"test-key\"))\n            .await;\n        assert!(result2.is_ok());\n        assert_eq!(result2.unwrap(), TestOutput::new(\"response2\"));\n\n        // Verify the rules were used the expected number of times\n        assert_eq!(rule1.num_calls(), 1);\n        assert_eq!(rule2.num_calls(), 1);\n\n        // Calling with bucket1 again should match rule1 a second time\n        let result1 = operation\n            .invoke(TestInput::new(\"bucket1\", \"test-key\"))\n            .await;\n        assert!(result1.is_ok());\n        assert_eq!(result1.unwrap(), TestOutput::new(\"response1\"));\n        assert_eq!(rule1.num_calls(), 2);\n    }\n\n    #[tokio::test]\n    async fn test_mixed_response_types() {\n        // Create a rule with all three types of responses\n        let rule = create_rule_builder()\n            .sequence()\n            .output(|| TestOutput::new(\"first output\"))\n            .error(|| TestError::new(\"expected error\"))\n            .http_response(|| {\n                HttpResponse::new(\n                    StatusCode::try_from(200).unwrap(),\n                    SdkBody::from(\"http response\"),\n                )\n            })\n            .build();\n\n        // Create an interceptor with the rule\n        let interceptor = MockResponseInterceptor::new()\n            .rule_mode(RuleMode::Sequential)\n            .with_rule(&rule);\n\n        let operation = create_test_operation(interceptor, false);\n\n        // First call should return the modeled output\n        let result1 = operation\n            .invoke(TestInput::new(\"test-bucket\", \"test-key\"))\n            .await;\n        assert!(result1.is_ok());\n        assert_eq!(result1.unwrap(), TestOutput::new(\"first output\"));\n\n        // Second call should return the modeled error\n        let result2 = operation\n            .invoke(TestInput::new(\"test-bucket\", \"test-key\"))\n            .await;\n        assert!(result2.is_err());\n        let sdk_err = result2.unwrap_err();\n        let err = sdk_err.as_service_error().expect(\"expected service error\");\n        assert_eq!(err.to_string(), \"expected error\");\n\n        // Third call should return the HTTP response\n        let result3 = operation\n            .invoke(TestInput::new(\"test-bucket\", \"test-key\"))\n            .await;\n        assert!(result3.is_ok());\n        assert_eq!(result3.unwrap(), TestOutput::new(\"http response\"));\n\n        // Verify the rule was used the expected number of times\n        assert_eq!(rule.num_calls(), 3);\n    }\n    #[tokio::test]\n    async fn test_exhausted_sequence_match_any() {\n        // Create a rule with a sequence that will be exhausted\n        let rule = create_rule_builder()\n            .match_requests(|input| input.bucket == \"bucket-1\")\n            .sequence()\n            .output(|| TestOutput::new(\"response 1\"))\n            .output(|| TestOutput::new(\"response 2\"))\n            .build();\n\n        // Create another rule to use after the first one is exhausted\n        let fallback_rule =\n            create_rule_builder().then_output(|| TestOutput::new(\"fallback response\"));\n\n        // Create an interceptor with both rules\n        let interceptor = MockResponseInterceptor::new()\n            .rule_mode(RuleMode::MatchAny)\n            .with_rule(&rule)\n            .with_rule(&fallback_rule);\n\n        let operation = create_test_operation(interceptor, false);\n\n        // First two calls should use the first rule\n        let result1 = operation\n            .invoke(TestInput::new(\"bucket-1\", \"test-key\"))\n            .await;\n        assert!(result1.is_ok());\n        assert_eq!(result1.unwrap(), TestOutput::new(\"response 1\"));\n\n        // second should use our fallback rule\n        let result2 = operation\n            .invoke(TestInput::new(\"other-bucket\", \"test-key\"))\n            .await;\n        assert!(result2.is_ok());\n        assert_eq!(result2.unwrap(), TestOutput::new(\"fallback response\"));\n\n        // Third call should use the first rule again and exhaust it\n        let result3 = operation\n            .invoke(TestInput::new(\"bucket-1\", \"test-key\"))\n            .await;\n        assert!(result3.is_ok());\n        assert_eq!(result3.unwrap(), TestOutput::new(\"response 2\"));\n\n        // first rule is exhausted so the matcher shouldn't matter and we should hit our fallback rule\n        let result4 = operation\n            .invoke(TestInput::new(\"bucket-1\", \"test-key\"))\n            .await;\n        assert!(result4.is_ok());\n        assert_eq!(result4.unwrap(), TestOutput::new(\"fallback response\"));\n\n        // Verify the rules were used the expected number of times\n        assert_eq!(rule.num_calls(), 2);\n        assert_eq!(fallback_rule.num_calls(), 2);\n    }\n\n    #[tokio::test]\n    async fn test_exhausted_sequence_sequential() {\n        // Create a rule with a sequence that will be exhausted\n        let rule = create_rule_builder()\n            .sequence()\n            .output(|| TestOutput::new(\"response 1\"))\n            .output(|| TestOutput::new(\"response 2\"))\n            .build();\n\n        // Create another rule to use after the first one is exhausted\n        let fallback_rule =\n            create_rule_builder().then_output(|| TestOutput::new(\"fallback response\"));\n\n        // Create an interceptor with both rules\n        let interceptor = MockResponseInterceptor::new()\n            .rule_mode(RuleMode::Sequential)\n            .with_rule(&rule)\n            .with_rule(&fallback_rule);\n\n        let operation = create_test_operation(interceptor, false);\n\n        // First two calls should use the first rule\n        let result1 = operation\n            .invoke(TestInput::new(\"test-bucket\", \"test-key\"))\n            .await;\n        assert!(result1.is_ok());\n        assert_eq!(result1.unwrap(), TestOutput::new(\"response 1\"));\n\n        let result2 = operation\n            .invoke(TestInput::new(\"test-bucket\", \"test-key\"))\n            .await;\n        assert!(result2.is_ok());\n        assert_eq!(result2.unwrap(), TestOutput::new(\"response 2\"));\n\n        // Third call should use the fallback rule\n        let result3 = operation\n            .invoke(TestInput::new(\"test-bucket\", \"test-key\"))\n            .await;\n        assert!(result3.is_ok());\n        assert_eq!(result3.unwrap(), TestOutput::new(\"fallback response\"));\n\n        // Verify the rules were used the expected number of times\n        assert_eq!(rule.num_calls(), 2);\n        assert_eq!(fallback_rule.num_calls(), 1);\n    }\n\n    #[tokio::test]\n    async fn test_concurrent_usage() {\n        use std::sync::Arc;\n        use tokio::task;\n\n        // Create a rule with multiple responses\n        let rule = Arc::new(\n            create_rule_builder()\n                .sequence()\n                .output(|| TestOutput::new(\"response 1\"))\n                .output(|| TestOutput::new(\"response 2\"))\n                .output(|| TestOutput::new(\"response 3\"))\n                .build(),\n        );\n\n        // Create an interceptor with the rule\n        let interceptor = MockResponseInterceptor::new()\n            .rule_mode(RuleMode::Sequential)\n            .with_rule(&rule);\n\n        let operation = Arc::new(create_test_operation(interceptor, false));\n\n        // Spawn multiple tasks that use the operation concurrently\n        let mut handles = vec![];\n        for i in 0..3 {\n            let op = operation.clone();\n            let handle = task::spawn(async move {\n                let result = op\n                    .invoke(TestInput::new(&format!(\"bucket-{i}\"), \"test-key\"))\n                    .await;\n                result.unwrap()\n            });\n            handles.push(handle);\n        }\n\n        // Wait for all tasks to complete\n        let mut results = vec![];\n        for handle in handles {\n            results.push(handle.await.unwrap());\n        }\n\n        // Sort the results to make the test deterministic\n        results.sort_by(|a, b| a.content.cmp(&b.content));\n\n        // Verify we got all three responses\n        assert_eq!(results.len(), 3);\n        assert_eq!(results[0], TestOutput::new(\"response 1\"));\n        assert_eq!(results[1], TestOutput::new(\"response 2\"));\n        assert_eq!(results[2], TestOutput::new(\"response 3\"));\n\n        // Verify the rule was used the expected number of times\n        assert_eq!(rule.num_calls(), 3);\n    }\n\n    #[tokio::test]\n    async fn test_sequential_rule_removal() {\n        // Create a rule that matches only when key != \"correct-key\"\n        let rule1 = create_rule_builder()\n            .match_requests(|input| input.bucket == \"test-bucket\" && input.key != \"correct-key\")\n            .then_http_response(|| {\n                HttpResponse::new(\n                    StatusCode::try_from(404).unwrap(),\n                    SdkBody::from(\"not found\"),\n                )\n            });\n\n        // Create a rule that matches only when key == \"correct-key\"\n        let rule2 = create_rule_builder()\n            .match_requests(|input| input.bucket == \"test-bucket\" && input.key == \"correct-key\")\n            .then_output(|| TestOutput::new(\"success\"));\n\n        // Create an interceptor with both rules in Sequential mode\n        let interceptor = MockResponseInterceptor::new()\n            .rule_mode(RuleMode::Sequential)\n            .with_rule(&rule1)\n            .with_rule(&rule2);\n\n        let operation = create_test_operation(interceptor, true);\n\n        // First call with key=\"foo\" should match rule1\n        let result1 = operation.invoke(TestInput::new(\"test-bucket\", \"foo\")).await;\n        assert!(result1.is_err());\n        assert_eq!(rule1.num_calls(), 1);\n\n        // Second call with key=\"correct-key\" should match rule2\n        // But this will fail if rule1 is not removed after being used\n        let result2 = operation\n            .invoke(TestInput::new(\"test-bucket\", \"correct-key\"))\n            .await;\n\n        // This should succeed, rule1 doesn't match but should have been removed\n        assert!(result2.is_ok());\n        assert_eq!(result2.unwrap(), TestOutput::new(\"success\"));\n        assert_eq!(rule2.num_calls(), 1);\n    }\n\n    #[tokio::test]\n    async fn test_simple_rule_in_match_any_mode() {\n        let rule = create_rule_builder().then_output(|| TestOutput::new(\"simple response\"));\n\n        let interceptor = MockResponseInterceptor::new()\n            .rule_mode(RuleMode::MatchAny)\n            .with_rule(&rule);\n\n        let operation = create_test_operation(interceptor, false);\n\n        for i in 0..5 {\n            let result = operation\n                .invoke(TestInput::new(\"test-bucket\", \"test-key\"))\n                .await;\n            assert!(result.is_ok(), \"Call {i} should succeed\");\n            assert_eq!(result.unwrap(), TestOutput::new(\"simple response\"));\n        }\n        assert_eq!(rule.num_calls(), 5);\n        assert!(!rule.is_exhausted());\n    }\n\n    #[tokio::test]\n    async fn test_simple_rule_in_sequential_mode() {\n        let rule1 = create_rule_builder().then_output(|| TestOutput::new(\"first response\"));\n        let rule2 = create_rule_builder().then_output(|| TestOutput::new(\"second response\"));\n\n        let interceptor = MockResponseInterceptor::new()\n            .rule_mode(RuleMode::Sequential)\n            .with_rule(&rule1)\n            .with_rule(&rule2);\n\n        let operation = create_test_operation(interceptor, false);\n\n        let result1 = operation\n            .invoke(TestInput::new(\"test-bucket\", \"test-key\"))\n            .await;\n        assert!(result1.is_ok());\n        assert_eq!(result1.unwrap(), TestOutput::new(\"first response\"));\n\n        // Second call should use rule2 (rule1 should be removed after one use in Sequential mode)\n        let result2 = operation\n            .invoke(TestInput::new(\"test-bucket\", \"test-key\"))\n            .await;\n        assert!(result2.is_ok());\n        assert_eq!(result2.unwrap(), TestOutput::new(\"second response\"));\n\n        assert_eq!(rule1.num_calls(), 1);\n        assert_eq!(rule2.num_calls(), 1);\n    }\n\n    #[tokio::test]\n    async fn test_repeatedly_method() {\n        let rule = create_rule_builder()\n            .sequence()\n            .output(|| TestOutput::new(\"first response\"))\n            .output(|| TestOutput::new(\"repeated response\"))\n            .repeatedly()\n            .build();\n\n        let interceptor = MockResponseInterceptor::new()\n            .rule_mode(RuleMode::Sequential)\n            .with_rule(&rule);\n\n        let operation = create_test_operation(interceptor, false);\n\n        let result1 = operation\n            .invoke(TestInput::new(\"test-bucket\", \"test-key\"))\n            .await;\n        assert!(result1.is_ok());\n        assert_eq!(result1.unwrap(), TestOutput::new(\"first response\"));\n\n        // all subsequent calls should return \"repeated response\"\n        for i in 0..10 {\n            let result = operation\n                .invoke(TestInput::new(\"test-bucket\", \"test-key\"))\n                .await;\n            assert!(result.is_ok(), \"Call {i} should succeed\");\n            assert_eq!(result.unwrap(), TestOutput::new(\"repeated response\"));\n        }\n        assert_eq!(rule.num_calls(), 11);\n        assert!(!rule.is_exhausted());\n    }\n\n    #[should_panic(expected = \"times(n) called before adding a response to the sequence\")]\n    #[test]\n    fn test_times_validation() {\n        // This should panic because times() is called before adding any responses\n        let _rule = create_rule_builder()\n            .sequence()\n            .times(3)\n            .output(|| TestOutput::new(\"response\"))\n            .build();\n    }\n\n    #[should_panic(expected = \"repeatedly() called before adding a response to the sequence\")]\n    #[test]\n    fn test_repeatedly_validation() {\n        // This should panic because repeatedly() is called before adding any responses\n        let _rule = create_rule_builder().sequence().repeatedly().build();\n    }\n\n    #[test]\n    fn test_total_responses_overflow() {\n        // Create a rule with a large number of repetitions to test overflow handling\n        let rule = create_rule_builder()\n            .sequence()\n            .output(|| TestOutput::new(\"response\"))\n            .times(usize::MAX / 2)\n            .output(|| TestOutput::new(\"another response\"))\n            .repeatedly()\n            .build();\n        assert_eq!(rule.max_responses, usize::MAX);\n    }\n\n    #[tokio::test]\n    async fn test_compute_response_conditional() {\n        use crate::MockResponse;\n\n        let rule = create_rule_builder().then_compute_response(|input| {\n            if input.key == \"error-key\" {\n                MockResponse::Error(TestError::new(\"conditional error\"))\n            } else {\n                MockResponse::Output(TestOutput::new(&format!(\"response for {}\", input.key)))\n            }\n        });\n\n        let interceptor = MockResponseInterceptor::new().with_rule(&rule);\n        let operation = create_test_operation(interceptor, false);\n\n        // Test success case\n        let result = operation\n            .invoke(TestInput::new(\"test-bucket\", \"success-key\"))\n            .await;\n        assert!(result.is_ok());\n        assert_eq!(result.unwrap(), TestOutput::new(\"response for success-key\"));\n\n        // Test error case\n        let result = operation\n            .invoke(TestInput::new(\"test-bucket\", \"error-key\"))\n            .await;\n        assert!(result.is_err());\n        assert_eq!(rule.num_calls(), 2);\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-mocks/src/lib.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n#![doc = include_str!(\"../README.md\")]\n/* Automatically managed default lints */\n#![cfg_attr(docsrs, feature(doc_cfg))]\n/* End of automatically managed default lints */\n#![warn(\n    missing_docs,\n    rustdoc::missing_crate_level_docs,\n    unreachable_pub,\n    rust_2018_idioms\n)]\n\nmod interceptor;\nmod rule;\n\npub use interceptor::{create_mock_http_client, MockResponseInterceptor};\npub use rule::{MockResponse, Rule, RuleBuilder, RuleMode};\n\n// why do we need a macro for this?\n// We want customers to be able to provide an ergonomic way to say the method they're looking for,\n// `Client::list_buckets`, e.g. But there isn't enough information on that type to recover everything.\n// This macro commits a small amount of crimes to recover that type information so we can construct\n// a rule that can intercept these operations.\n\n/// `mock!` macro that produces a [`RuleBuilder`] from a client invocation\n///\n/// See the `examples` folder of this crate for fully worked examples.\n///\n/// # Examples\n///\n/// **Mock and return a success response**:\n///\n/// ```rust,ignore\n/// use aws_sdk_s3::operation::get_object::GetObjectOutput;\n/// use aws_sdk_s3::Client;\n/// use aws_smithy_types::byte_stream::ByteStream;\n/// use aws_smithy_mocks::mock;\n/// let get_object_happy_path = mock!(Client::get_object)\n///   .match_requests(|req|req.bucket() == Some(\"test-bucket\") && req.key() == Some(\"test-key\"))\n///   .then_output(||GetObjectOutput::builder().body(ByteStream::from_static(b\"12345-abcde\")).build());\n/// ```\n///\n/// **Mock and return an error**:\n/// ```rust,ignore\n/// use aws_sdk_s3::operation::get_object::GetObjectError;\n/// use aws_sdk_s3::types::error::NoSuchKey;\n/// use aws_sdk_s3::Client;\n/// use aws_smithy_mocks::mock;\n/// let get_object_error_path = mock!(Client::get_object)\n///   .then_error(||GetObjectError::NoSuchKey(NoSuchKey::builder().build()));\n/// ```\n///\n#[macro_export]\nmacro_rules! mock {\n    ($operation: expr) => {\n        #[allow(unreachable_code)]\n        {\n            $crate::RuleBuilder::new_from_mock(\n                // We don't actually want to run this code, so we put it in a closure. The closure\n                // has the types we want which makes this whole thing type-safe (and the IDE can even\n                // figure out the right input/output types in inference!)\n                // The code generated here is:\n                // `Client::list_buckets(todo!())`\n                || $operation(todo!()).as_input().clone().build().unwrap(),\n                || $operation(todo!()).send(),\n            )\n        }\n    };\n}\n\n// This could be obviated by a reasonable trait, since you can express it with SdkConfig if clients implement From<&SdkConfig>.\n\n/// `mock_client!` macro produces a Client configured with a number of Rules and appropriate test default configuration.\n///\n/// ## Prerequisites\n/// You must enable the `test-util` feature of the service client crate in order to use the `mock_client` macro.\n///\n/// # Examples\n///\n/// **Create a client that uses a mock failure and then a success**:\n///\n/// ```rust,ignore\n/// use aws_sdk_s3::operation::get_object::{GetObjectOutput, GetObjectError};\n/// use aws_sdk_s3::types::error::NoSuchKey;\n/// use aws_sdk_s3::Client;\n/// use aws_smithy_types::byte_stream::ByteStream;\n/// use aws_smithy_mocks::{mock_client, mock, RuleMode};\n/// let get_object_error_path = mock!(Client::get_object)\n///   .then_error(||GetObjectError::NoSuchKey(NoSuchKey::builder().build()))\n///   .build();\n/// let get_object_happy_path = mock!(Client::get_object)\n///   .match_requests(|req|req.bucket() == Some(\"test-bucket\") && req.key() == Some(\"test-key\"))\n///   .then_output(||GetObjectOutput::builder().body(ByteStream::from_static(b\"12345-abcde\")).build())\n///   .build();\n/// let client = mock_client!(aws_sdk_s3, RuleMode::Sequential, &[&get_object_error_path, &get_object_happy_path]);\n///\n///\n/// **Create a client but customize a specific setting**:\n/// rust,ignore\n/// use aws_sdk_s3::operation::get_object::GetObjectOutput;\n/// use aws_sdk_s3::Client;\n/// use aws_smithy_types::byte_stream::ByteStream;\n/// use aws_smithy_mocks::{mock_client, mock, RuleMode};\n/// let get_object_happy_path = mock!(Client::get_object)\n///   .match_requests(|req|req.bucket() == Some(\"test-bucket\") && req.key() == Some(\"test-key\"))\n///   .then_output(||GetObjectOutput::builder().body(ByteStream::from_static(b\"12345-abcde\")).build())\n///   .build();\n/// let client = mock_client!(\n///     aws_sdk_s3,\n///     RuleMode::Sequential,\n///     &[&get_object_happy_path],\n///     // Perhaps you need to force path style\n///     |client_builder|client_builder.force_path_style(true)\n/// );\n/// ```\n///\n#[macro_export]\nmacro_rules! mock_client {\n    ($aws_crate: ident, $rules: expr) => {\n        $crate::mock_client!($aws_crate, $crate::RuleMode::Sequential, $rules)\n    };\n    ($aws_crate: ident, $rule_mode: expr, $rules: expr) => {{\n        $crate::mock_client!($aws_crate, $rule_mode, $rules, |conf| conf)\n    }};\n    ($aws_crate: ident, $rule_mode: expr, $rules: expr, $additional_configuration: expr) => {{\n        let mut mock_response_interceptor =\n            $crate::MockResponseInterceptor::new().rule_mode($rule_mode);\n        for rule in $rules {\n            mock_response_interceptor = mock_response_interceptor.with_rule(rule)\n        }\n\n        // Create a mock HTTP client\n        let mock_http_client = $crate::create_mock_http_client();\n\n        // Allow callers to avoid explicitly specifying the type\n        fn coerce<T: Fn($aws_crate::config::Builder) -> $aws_crate::config::Builder>(f: T) -> T {\n            f\n        }\n\n        $aws_crate::client::Client::from_conf(\n            coerce($additional_configuration)(\n                $aws_crate::config::Config::builder()\n                    .with_test_defaults_v2()\n                    .http_client(mock_http_client)\n                    .interceptor(mock_response_interceptor),\n            )\n            .build(),\n        )\n    }};\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-mocks/src/rule.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_smithy_runtime_api::client::interceptors::context::{Error, Input, Output};\nuse aws_smithy_runtime_api::client::orchestrator::HttpResponse;\nuse aws_smithy_runtime_api::client::result::SdkError;\nuse aws_smithy_runtime_api::http::StatusCode;\nuse aws_smithy_types::body::SdkBody;\nuse std::fmt;\nuse std::future::Future;\nuse std::sync::atomic::{AtomicUsize, Ordering};\nuse std::sync::Arc;\n\n/// A mock response that can be returned by a rule.\n///\n/// This enum represents the different types of responses that can be returned by a mock rule:\n/// - `Output`: A successful modeled response\n/// - `Error`: A modeled error\n/// - `Http`: An HTTP response\n///\n#[derive(Debug)]\n#[allow(clippy::large_enum_variant)]\npub enum MockResponse<O, E> {\n    /// A successful modeled response.\n    Output(O),\n    /// A modeled error.\n    Error(E),\n    /// An HTTP response.\n    Http(HttpResponse),\n}\n\n/// A function that matches requests.\ntype MatchFn = Arc<dyn Fn(&Input) -> bool + Send + Sync>;\ntype ServeFn = Arc<dyn Fn(usize, &Input) -> Option<MockResponse<Output, Error>> + Send + Sync>;\n\n/// A rule for matching requests and providing mock responses.\n///\n/// Rules are created using the `mock!` macro or the `RuleBuilder`.\n///\n#[derive(Clone)]\npub struct Rule {\n    /// Function that determines if this rule matches a request.\n    pub(crate) matcher: MatchFn,\n\n    /// Handler function that generates responses.\n    response_handler: ServeFn,\n\n    /// Number of times this rule has been called.\n    call_count: Arc<AtomicUsize>,\n\n    /// Maximum number of responses this rule will provide.\n    pub(crate) max_responses: usize,\n\n    /// Flag indicating this is a \"simple\" rule which changes how it is interpreted\n    /// depending on the RuleMode.\n    ///\n    /// See [smithy-rs#4135](https://github.com/smithy-lang/smithy-rs/issues/4135)\n    is_simple: bool,\n}\n\nimpl fmt::Debug for Rule {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        write!(f, \"Rule\")\n    }\n}\n\nimpl Rule {\n    /// Creates a new rule with the given matcher, response handler, and max responses.\n    #[allow(clippy::type_complexity)]\n    pub(crate) fn new<O, E>(\n        matcher: MatchFn,\n        response_handler: Arc<dyn Fn(usize, &Input) -> Option<MockResponse<O, E>> + Send + Sync>,\n        max_responses: usize,\n        is_simple: bool,\n    ) -> Self\n    where\n        O: fmt::Debug + Send + Sync + 'static,\n        E: fmt::Debug + Send + Sync + std::error::Error + 'static,\n    {\n        Rule {\n            matcher,\n            response_handler: Arc::new(move |idx: usize, input: &Input| {\n                if idx < max_responses {\n                    response_handler(idx, input).map(|resp| match resp {\n                        MockResponse::Output(o) => MockResponse::Output(Output::erase(o)),\n                        MockResponse::Error(e) => MockResponse::Error(Error::erase(e)),\n                        MockResponse::Http(http_resp) => MockResponse::Http(http_resp),\n                    })\n                } else {\n                    None\n                }\n            }),\n            call_count: Arc::new(AtomicUsize::new(0)),\n            max_responses,\n            is_simple,\n        }\n    }\n\n    /// Test if this is a \"simple\" rule (non-sequenced)\n    pub(crate) fn is_simple(&self) -> bool {\n        self.is_simple\n    }\n\n    /// Gets the next response.\n    pub(crate) fn next_response(&self, input: &Input) -> Option<MockResponse<Output, Error>> {\n        let idx = self.call_count.fetch_add(1, Ordering::SeqCst);\n        (self.response_handler)(idx, input)\n    }\n\n    /// Returns the number of times this rule has been called.\n    pub fn num_calls(&self) -> usize {\n        self.call_count.load(Ordering::SeqCst)\n    }\n\n    /// Checks if this rule is exhausted (has provided all its responses).\n    pub fn is_exhausted(&self) -> bool {\n        self.num_calls() >= self.max_responses\n    }\n}\n\n/// RuleMode describes how rules will be interpreted.\n/// - In RuleMode::MatchAny, the first matching rule will be applied, and the rules will remain unchanged.\n/// - In RuleMode::Sequential, the first matching rule will be applied, and that rule will be removed from the list of rules **once it is exhausted**.\n#[derive(Debug, Clone, Copy, PartialEq, Eq)]\npub enum RuleMode {\n    /// Match rules in the order they were added. The first matching rule will be applied and the\n    /// rules will remain unchanged\n    Sequential,\n    /// The first matching rule will be applied, and that rule will be removed from the list of rules\n    /// **once it is exhausted**. Each rule can have multiple responses, and all responses in a rule\n    /// will be consumed before moving to the next rule.\n    MatchAny,\n}\n\n/// A builder for creating rules.\n///\n/// This builder provides a fluent API for creating rules with different response types.\n///\npub struct RuleBuilder<I, O, E> {\n    /// Function that determines if this rule matches a request.\n    pub(crate) input_filter: MatchFn,\n\n    /// Phantom data for the input type.\n    pub(crate) _ty: std::marker::PhantomData<(I, O, E)>,\n}\n\nimpl<I, O, E> RuleBuilder<I, O, E>\nwhere\n    I: fmt::Debug + Send + Sync + 'static,\n    O: fmt::Debug + Send + Sync + 'static,\n    E: fmt::Debug + Send + Sync + std::error::Error + 'static,\n{\n    /// Creates a new [`RuleBuilder`]\n    #[doc(hidden)]\n    pub fn new() -> Self {\n        RuleBuilder {\n            input_filter: Arc::new(|i: &Input| i.downcast_ref::<I>().is_some()),\n            _ty: std::marker::PhantomData,\n        }\n    }\n\n    /// Creates a new [`RuleBuilder`]. This is normally constructed with the [`mock!`](crate::mock!) macro\n    #[doc(hidden)]\n    pub fn new_from_mock<F, R>(_input_hint: impl Fn() -> I, _output_hint: impl Fn() -> F) -> Self\n    where\n        F: Future<Output = Result<O, SdkError<E, R>>>,\n    {\n        Self {\n            input_filter: Arc::new(|i: &Input| i.downcast_ref::<I>().is_some()),\n            _ty: Default::default(),\n        }\n    }\n\n    /// Sets the function that determines if this rule matches a request.\n    pub fn match_requests<F>(mut self, filter: F) -> Self\n    where\n        F: Fn(&I) -> bool + Send + Sync + 'static,\n    {\n        self.input_filter = Arc::new(move |i: &Input| match i.downcast_ref::<I>() {\n            Some(typed_input) => filter(typed_input),\n            _ => false,\n        });\n        self\n    }\n\n    /// Start building a response sequence\n    ///\n    /// A sequence allows a single rule to generate multiple responses which can\n    /// be used to test retry behavior.\n    ///\n    /// # Examples\n    ///\n    /// With repetition using `times()`:\n    ///\n    /// ```rust,ignore\n    /// let rule = mock!(Client::get_object)\n    ///     .sequence()\n    ///     .http_status(503, None)\n    ///     .times(2)                                        // First two calls return 503\n    ///     .output(|| GetObjectOutput::builder().build())   // Third call succeeds\n    ///     .build();\n    /// ```\n    pub fn sequence(self) -> ResponseSequenceBuilder<I, O, E> {\n        ResponseSequenceBuilder::new(self.input_filter)\n    }\n\n    /// Creates a rule that returns a modeled output.\n    pub fn then_output<F>(self, output_fn: F) -> Rule\n    where\n        F: Fn() -> O + Send + Sync + 'static,\n    {\n        self.sequence().output(output_fn).build_simple()\n    }\n\n    /// Creates a rule that returns a modeled error.\n    pub fn then_error<F>(self, error_fn: F) -> Rule\n    where\n        F: Fn() -> E + Send + Sync + 'static,\n    {\n        self.sequence().error(error_fn).build_simple()\n    }\n\n    /// Creates a rule that returns an HTTP response.\n    pub fn then_http_response<F>(self, response_fn: F) -> Rule\n    where\n        F: Fn() -> HttpResponse + Send + Sync + 'static,\n    {\n        self.sequence().http_response(response_fn).build_simple()\n    }\n\n    /// Creates a rule that computes an output based on the input.\n    ///\n    /// This allows generating responses based on the input request.\n    ///\n    /// # Examples\n    ///\n    /// ```rust,ignore\n    /// let rule = mock!(Client::get_object)\n    ///     .compute_output(|req| {\n    ///         GetObjectOutput::builder()\n    ///             .body(ByteStream::from_static(format!(\"content for {}\", req.key().unwrap_or(\"unknown\")).as_bytes()))\n    ///             .build()\n    ///     })\n    ///     .build();\n    /// ```\n    pub fn then_compute_output<F>(self, compute_fn: F) -> Rule\n    where\n        F: Fn(&I) -> O + Send + Sync + 'static,\n    {\n        self.sequence().compute_output(compute_fn).build_simple()\n    }\n\n    /// Creates a rule that computes an arbitrary response based on the input.\n    ///\n    /// This allows generating any type of response (output, error, or HTTP) based on the input request.\n    /// Unlike `then_compute_output`, this method can return errors or HTTP responses conditionally.\n    ///\n    /// # Examples\n    ///\n    /// ```rust,ignore\n    /// let rule = mock!(Client::get_object)\n    ///     .then_compute_response(|req| {\n    ///         if req.key() == Some(\"error\") {\n    ///             MockResponse::Error(GetObjectError::NoSuchKey(NoSuchKey::builder().build()))\n    ///         } else {\n    ///             MockResponse::Output(GetObjectOutput::builder()\n    ///                 .body(ByteStream::from_static(b\"content\"))\n    ///                 .build())\n    ///         }\n    ///     })\n    ///     .build();\n    /// ```\n    pub fn then_compute_response<F>(self, compute_fn: F) -> Rule\n    where\n        F: Fn(&I) -> MockResponse<O, E> + Send + Sync + 'static,\n    {\n        self.sequence().compute_response(compute_fn).build_simple()\n    }\n}\n\ntype SequenceGeneratorFn<O, E> = Arc<dyn Fn(&Input) -> MockResponse<O, E> + Send + Sync>;\n\n/// A builder for creating response sequences\npub struct ResponseSequenceBuilder<I, O, E> {\n    /// The response generators in the sequence\n    generators: Vec<(SequenceGeneratorFn<O, E>, usize)>,\n\n    /// Function that determines if this rule matches a request\n    input_filter: MatchFn,\n\n    /// flag indicating this is a \"simple\" rule\n    is_simple: bool,\n\n    /// Marker for the input, output, and error types\n    _marker: std::marker::PhantomData<I>,\n}\n\n/// Final sequence builder state  - can only `build()`\npub struct FinalizedResponseSequenceBuilder<I, O, E> {\n    inner: ResponseSequenceBuilder<I, O, E>,\n}\n\nimpl<I, O, E> ResponseSequenceBuilder<I, O, E>\nwhere\n    I: fmt::Debug + Send + Sync + 'static,\n    O: fmt::Debug + Send + Sync + 'static,\n    E: fmt::Debug + Send + Sync + std::error::Error + 'static,\n{\n    /// Create a new response sequence builder\n    pub(crate) fn new(input_filter: MatchFn) -> Self {\n        Self {\n            generators: Vec::new(),\n            input_filter,\n            is_simple: false,\n            _marker: std::marker::PhantomData,\n        }\n    }\n\n    /// Add a modeled output response to the sequence\n    ///\n    /// # Examples\n    ///\n    /// ```rust,ignore\n    /// let rule = mock!(Client::get_object)\n    ///     .sequence()\n    ///     .output(|| GetObjectOutput::builder().build())\n    ///     .build();\n    /// ```\n    pub fn output<F>(mut self, output_fn: F) -> Self\n    where\n        F: Fn() -> O + Send + Sync + 'static,\n    {\n        let generator = Arc::new(move |_input: &Input| MockResponse::Output(output_fn()));\n        self.generators.push((generator, 1));\n        self\n    }\n\n    /// Add a modeled error response to the sequence\n    pub fn error<F>(mut self, error_fn: F) -> Self\n    where\n        F: Fn() -> E + Send + Sync + 'static,\n    {\n        let generator = Arc::new(move |_input: &Input| MockResponse::Error(error_fn()));\n        self.generators.push((generator, 1));\n        self\n    }\n\n    /// Add an HTTP status code response to the sequence\n    pub fn http_status(mut self, status: u16, body: Option<String>) -> Self {\n        let status_code = StatusCode::try_from(status).unwrap();\n\n        let generator: SequenceGeneratorFn<O, E> = match body {\n            Some(body) => Arc::new(move |_input: &Input| {\n                MockResponse::Http(HttpResponse::new(status_code, SdkBody::from(body.clone())))\n            }),\n            None => Arc::new(move |_input: &Input| {\n                MockResponse::Http(HttpResponse::new(status_code, SdkBody::empty()))\n            }),\n        };\n\n        self.generators.push((generator, 1));\n        self\n    }\n\n    /// Add an HTTP response to the sequence\n    pub fn http_response<F>(mut self, response_fn: F) -> Self\n    where\n        F: Fn() -> HttpResponse + Send + Sync + 'static,\n    {\n        let generator = Arc::new(move |_input: &Input| MockResponse::Http(response_fn()));\n        self.generators.push((generator, 1));\n        self\n    }\n\n    /// Add a computed output response to the sequence.  Note that this is not `pub`\n    /// because creating computed output rules off of sequenced rules doesn't work,\n    /// as we can't preserve the input across retries.  So we only expose `compute_output`\n    /// on unsequenced rules above.\n    fn compute_output<F>(mut self, compute_fn: F) -> Self\n    where\n        F: Fn(&I) -> O + Send + Sync + 'static,\n    {\n        let generator = Arc::new(move |input: &Input| {\n            if let Some(typed_input) = input.downcast_ref::<I>() {\n                MockResponse::Output(compute_fn(typed_input))\n            } else {\n                panic!(\"Input type mismatch in compute_output\")\n            }\n        });\n        self.generators.push((generator, 1));\n        self\n    }\n\n    /// Add a computed response to the sequence. Not `pub` for same reason as `compute_output`.\n    fn compute_response<F>(mut self, compute_fn: F) -> Self\n    where\n        F: Fn(&I) -> MockResponse<O, E> + Send + Sync + 'static,\n    {\n        let generator = Arc::new(move |input: &Input| {\n            if let Some(typed_input) = input.downcast_ref::<I>() {\n                compute_fn(typed_input)\n            } else {\n                panic!(\"Input type mismatch in compute_response\")\n            }\n        });\n        self.generators.push((generator, 1));\n        self\n    }\n\n    /// Repeat the last added response multiple times.\n    ///\n    /// This method sets the number of times the last response in the sequence will be used.\n    /// For example, if you add a response and then call `times(3)`, that response will be\n    /// returned for the next 3 calls to the rule.\n    ///\n    /// # Examples\n    ///\n    /// ```rust,ignore\n    /// // Create a rule that returns 503 twice, then succeeds\n    /// let rule = mock!(Client::get_object)\n    ///     .sequence()\n    ///     .http_status(503, None)\n    ///     .times(2)                                        // First two calls return 503\n    ///     .output(|| GetObjectOutput::builder().build())   // Third call succeeds\n    ///     .build();\n    /// ```\n    ///\n    /// # Panics\n    ///\n    /// Panics if:\n    /// - Called with a count of 0\n    /// - Called before adding any responses to the sequence\n    pub fn times(mut self, count: usize) -> Self {\n        if self.generators.is_empty() {\n            panic!(\"times(n) called before adding a response to the sequence\");\n        }\n        match count {\n            0 => panic!(\"repeat count must be greater than zero\"),\n            1 => {\n                return self;\n            }\n            _ => {}\n        }\n\n        // update the repeat count of the last generator\n        if let Some(last_generator) = self.generators.last_mut() {\n            last_generator.1 = count;\n        }\n        self\n    }\n    /// Make the last response in the sequence repeat indefinitely.\n    ///\n    /// This method causes the last response added to the sequence to be repeated\n    /// forever, making the rule never exhaust. After calling `repeatedly()`,\n    /// no more responses can be added to the sequence.\n    ///\n    /// # Examples\n    ///\n    /// ```rust,ignore\n    /// // Create a rule that returns an error once, then succeeds forever\n    /// let rule = mock!(Client::get_object)\n    ///     .sequence()\n    ///     .error(|| GetObjectError::NoSuchKey(NoSuchKey::builder().build()))\n    ///     .output(|| GetObjectOutput::builder().build())\n    ///     .repeatedly()\n    ///     .build();\n    ///\n    /// // First call will return NoSuchKey error\n    /// // All subsequent calls will return success\n    /// ```\n    ///\n    /// # Panics\n    ///\n    /// Panics if called before adding any responses to the sequence.\n    pub fn repeatedly(self) -> FinalizedResponseSequenceBuilder<I, O, E> {\n        if self.generators.is_empty() {\n            panic!(\"repeatedly() called before adding a response to the sequence\");\n        }\n        let inner = self.times(usize::MAX);\n        FinalizedResponseSequenceBuilder { inner }\n    }\n\n    /// Build this a \"simple\" rule (internal detail)\n    pub(crate) fn build_simple(mut self) -> Rule {\n        self.is_simple = true;\n        self.repeatedly().build()\n    }\n\n    /// Build the rule with this response sequence\n    pub fn build(self) -> Rule {\n        let generators = self.generators;\n        let is_simple = self.is_simple;\n\n        // calculate total responses (sum of all repetitions)\n        let total_responses: usize = generators\n            .iter()\n            .map(|(_, count)| *count)\n            .fold(0, |acc, count| acc.saturating_add(count));\n\n        Rule::new(\n            self.input_filter,\n            Arc::new(move |idx, input| {\n                // find which generator to use\n                let mut current_idx = idx;\n                for (generator, repeat_count) in &generators {\n                    if current_idx < *repeat_count {\n                        return Some(generator(input));\n                    }\n                    current_idx -= repeat_count;\n                }\n                None\n            }),\n            total_responses,\n            is_simple,\n        )\n    }\n}\n\nimpl<I, O, E> FinalizedResponseSequenceBuilder<I, O, E>\nwhere\n    I: fmt::Debug + Send + Sync + 'static,\n    O: fmt::Debug + Send + Sync + 'static,\n    E: fmt::Debug + Send + Sync + std::error::Error + 'static,\n{\n    /// Build the rule with this response sequence\n    pub fn build(self) -> Rule {\n        self.inner.build()\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-mocks/tests/macros.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Basic test of using the mock_client macro from an \"external\" crate\n\nmod fake_crate {\n    pub(crate) mod client {\n        use crate::fake_crate::config;\n\n        pub(crate) struct Client {}\n        impl Client {\n            pub(crate) fn from_conf(_conf: config::Config) -> Self {\n                Self {}\n            }\n        }\n    }\n\n    pub(crate) mod config {\n        use aws_smithy_runtime_api::client::http::SharedHttpClient;\n        use aws_smithy_runtime_api::client::interceptors::Intercept;\n\n        pub(crate) struct Config {}\n        impl Config {\n            pub(crate) fn builder() -> Builder {\n                Builder {}\n            }\n        }\n        pub(crate) struct Builder {}\n        impl Builder {\n            pub fn build(self) -> Config {\n                Config {}\n            }\n            pub fn with_test_defaults_v2(self) -> Self {\n                Self {}\n            }\n            pub fn http_client(self, _http_client: SharedHttpClient) -> Self {\n                Self {}\n            }\n\n            pub fn interceptor(self, _interceptor: impl Intercept + 'static) -> Self {\n                self\n            }\n        }\n    }\n}\n#[test]\nfn mock_client() {\n    aws_smithy_mocks::mock_client!(fake_crate, &[]);\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-observability/Cargo.toml",
    "content": "[package]\nname = \"aws-smithy-observability\"\nversion = \"0.2.6\"\nauthors = [\n  \"AWS Rust SDK Team <aws-sdk-rust@amazon.com>\",\n]\ndescription = \"Smithy observability implementation.\"\nedition = \"2021\"\nlicense = \"Apache-2.0\"\nrepository = \"https://github.com/awslabs/smithy-rs\"\nrust-version = \"1.91.1\"\n\n[dependencies]\naws-smithy-runtime-api = { path = \"../aws-smithy-runtime-api\" }\n\n[dev-dependencies]\nserial_test = \"3.1.1\"\n\n\n[package.metadata.docs.rs]\nall-features = true\ntargets = [\"x86_64-unknown-linux-gnu\"]\ncargo-args = [\"-Zunstable-options\", \"-Zrustdoc-scrape-examples\"]\nrustdoc-args = [\"--cfg\", \"docsrs\"]\n# End of docs.rs metadata\n"
  },
  {
    "path": "rust-runtime/aws-smithy-observability/LICENSE",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n"
  },
  {
    "path": "rust-runtime/aws-smithy-observability/README.md",
    "content": "# aws-smithy-observability\n\nThis crate contains traits allowing for the implementation of `TelemetryProvider`s for the AWS SDK for Rust. It also contains a `global` module for setting and interacting with the current `GlobalTelemetryProvider`.\n\n<!-- anchor_start:footer -->\nThis crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly.\n<!-- anchor_end:footer -->\n"
  },
  {
    "path": "rust-runtime/aws-smithy-observability/external-types.toml",
    "content": "allowed_external_types = [\n    \"aws_smithy_runtime_api::box_error::BoxError\",\n]\n"
  },
  {
    "path": "rust-runtime/aws-smithy-observability/src/attributes.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Attributes (also referred to as tags or annotations in other telemetry systems) are structured\n//! key-value pairs that annotate a span or event. Structured data allows observability backends\n//! to index and process telemetry data in ways that simple log messages lack.\n\nuse std::collections::HashMap;\n\n/// The valid types of values accepted by [Attributes].\n#[non_exhaustive]\n#[derive(Clone, Debug, PartialEq)]\npub enum AttributeValue {\n    /// Holds an [i64]\n    I64(i64),\n    /// Holds an [f64]\n    F64(f64),\n    /// Holds a [String]\n    String(String),\n    /// Holds a [bool]\n    Bool(bool),\n}\n\n/// Structured telemetry metadata.\n#[non_exhaustive]\n#[derive(Clone, Debug, Default)]\npub struct Attributes {\n    attrs: HashMap<String, AttributeValue>,\n}\n\nimpl Attributes {\n    /// Create a new empty instance of [Attributes].\n    pub fn new() -> Self {\n        Self::default()\n    }\n\n    /// Set an attribute.\n    pub fn set(&mut self, key: impl Into<String>, value: impl Into<AttributeValue>) {\n        self.attrs.insert(key.into(), value.into());\n    }\n\n    /// Get an attribute.\n    pub fn get(&self, key: impl Into<String>) -> Option<&AttributeValue> {\n        self.attrs.get(&key.into())\n    }\n\n    /// Get all of the attribute key value pairs.\n    pub fn attributes(&self) -> &HashMap<String, AttributeValue> {\n        &self.attrs\n    }\n\n    /// Get an owned [Iterator] of ([String], [AttributeValue]).\n    pub fn into_attributes(self) -> impl Iterator<Item = (String, AttributeValue)> {\n        self.attrs.into_iter()\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-observability/src/context.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/// Delineates a logical scope that has some beginning and end\n/// (e.g. a function or block of code).\npub trait Scope {\n    /// invoke when the scope has ended.\n    fn end(&self);\n}\n\n/// A cross cutting concern for carrying execution-scoped values across API\n/// boundaries (both in-process and distributed).\npub trait Context {\n    /// Make this context the currently active context.\n    /// The returned handle is used to return the previous\n    /// context (if one existed) as active.\n    fn make_current(&self) -> &dyn Scope;\n}\n\n/// Keeps track of the current [Context].\npub trait ContextManager {\n    ///Get the currently active context.\n    fn current(&self) -> &dyn Context;\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-observability/src/error.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Observability Errors\n\nuse std::fmt;\n\nuse aws_smithy_runtime_api::box_error::BoxError;\n\n/// An error in the SDKs Observability providers\n#[non_exhaustive]\n#[derive(Debug)]\npub struct ObservabilityError {\n    kind: ErrorKind,\n    source: BoxError,\n}\n\n/// The types of errors associated with [ObservabilityError]\n#[non_exhaustive]\n#[derive(Debug)]\npub enum ErrorKind {\n    /// A custom error that does not fall under any other error kind\n    Other,\n}\n\nimpl ObservabilityError {\n    /// Create a new [`ObservabilityError`] from an [ErrorKind] and a [BoxError]\n    pub fn new<E>(kind: ErrorKind, err: E) -> Self\n    where\n        E: Into<BoxError>,\n    {\n        Self {\n            kind,\n            source: err.into(),\n        }\n    }\n\n    /// Returns the corresponding [`ErrorKind`] for this error.\n    pub fn kind(&self) -> &ErrorKind {\n        &self.kind\n    }\n}\n\nimpl fmt::Display for ObservabilityError {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        match &self.kind {\n            ErrorKind::Other => write!(f, \"unclassified error\"),\n        }\n    }\n}\n\nimpl std::error::Error for ObservabilityError {\n    fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {\n        Some(self.source.as_ref())\n    }\n}\n\n/// An simple error to represent issues with the global [crate::TelemetryProvider].\n#[non_exhaustive]\n#[derive(Debug)]\npub struct GlobalTelemetryProviderError {\n    reason: &'static str,\n}\n\nimpl GlobalTelemetryProviderError {\n    /// Create a new [GlobalTelemetryProviderError] with a given reason for the error.\n    pub fn new(reason: &'static str) -> Self {\n        Self { reason }\n    }\n}\n\nimpl std::error::Error for GlobalTelemetryProviderError {}\n\nimpl fmt::Display for GlobalTelemetryProviderError {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        write!(f, \"GlobalTelemetryProviderError: {}\", self.reason)\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-observability/src/global.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Utilities for interacting with the currently set `GlobalTelemetryProvider`\n\nuse std::{\n    mem,\n    sync::{Arc, LazyLock, RwLock},\n};\n\nuse crate::{\n    error::{ErrorKind, GlobalTelemetryProviderError},\n    provider::{GlobalTelemetryProvider, TelemetryProvider},\n    ObservabilityError,\n};\n\n// Statically store the global provider\nstatic GLOBAL_TELEMETRY_PROVIDER: LazyLock<RwLock<GlobalTelemetryProvider>> =\n    LazyLock::new(|| RwLock::new(GlobalTelemetryProvider::new(TelemetryProvider::default())));\n\n/// Set the current global [TelemetryProvider].\n///\n/// This is meant to be run once at the beginning of an application. Will return an [Err] if the\n/// [RwLock] holding the global [TelemetryProvider] is locked or poisoned.\npub fn set_telemetry_provider(new_provider: TelemetryProvider) -> Result<(), ObservabilityError> {\n    if let Ok(mut old_provider) = GLOBAL_TELEMETRY_PROVIDER.try_write() {\n        let new_global_provider = GlobalTelemetryProvider::new(new_provider);\n\n        let _ = mem::replace(&mut *old_provider, new_global_provider);\n\n        Ok(())\n    } else {\n        Err(ObservabilityError::new(\n            ErrorKind::Other,\n            GlobalTelemetryProviderError::new(\"Failed to set global TelemetryProvider.\"),\n        ))\n    }\n}\n\n/// Get an [Arc] reference to the current global [TelemetryProvider]. Will return an [Err] if the\n/// [RwLock] holding the global [TelemetryProvider] is locked or poisoned.\npub fn get_telemetry_provider() -> Result<Arc<TelemetryProvider>, ObservabilityError> {\n    if let Ok(tp) = GLOBAL_TELEMETRY_PROVIDER.try_read() {\n        Ok(tp.telemetry_provider().clone())\n    } else {\n        Err(ObservabilityError::new(\n            ErrorKind::Other,\n            GlobalTelemetryProviderError::new(\"Failed to get global TelemetryProvider\"),\n        ))\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use crate::provider::TelemetryProvider;\n    use serial_test::serial;\n\n    // Note: the tests in this module are run serially to prevent them from stepping on each other and poisoning the\n    // RwLock holding the GlobalTelemetryProvider\n    #[test]\n    #[serial]\n    fn can_set_global_telemetry_provider() {\n        let my_provider = TelemetryProvider::default();\n\n        // Set the new counter and get a reference to the old one\n        set_telemetry_provider(my_provider).unwrap();\n    }\n\n    #[test]\n    #[serial]\n    fn can_get_global_telemetry_provider() {\n        let curr_provider = get_telemetry_provider().unwrap();\n\n        // Use the global provider to create an instrument and record a value with it\n        let curr_mp = curr_provider.meter_provider();\n        let curr_meter = curr_mp.get_meter(\"TestMeter\", None);\n        let instrument = curr_meter\n            .create_monotonic_counter(\"TestMonoCounter\")\n            .build();\n        instrument.add(4, None, None);\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-observability/src/instruments.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Instruments are used to record values for metrics.\n\nuse std::{borrow::Cow, fmt::Debug, marker::PhantomData, sync::Arc};\n\nuse crate::{meter::Meter, Attributes, Context};\n\n/// Configuration for building a sync instrument.\n#[non_exhaustive]\npub struct InstrumentBuilder<'a, T> {\n    instrument_provider: &'a dyn ProvideInstrument,\n    name: Cow<'static, str>,\n    description: Option<Cow<'static, str>>,\n    units: Option<Cow<'static, str>>,\n    _phantom: PhantomData<T>,\n}\n\nimpl<'a, T> InstrumentBuilder<'a, T> {\n    /// Create a new instrument builder\n    pub(crate) fn new(meter: &'a Meter, name: Cow<'static, str>) -> Self {\n        InstrumentBuilder {\n            instrument_provider: meter.instrument_provider.as_ref(),\n            name,\n            description: None,\n            units: None,\n            _phantom: PhantomData::<T>,\n        }\n    }\n\n    /// Get the name.\n    pub fn get_name(&self) -> &Cow<'static, str> {\n        &self.name\n    }\n\n    /// Set the description.\n    pub fn set_description(mut self, description: impl Into<Cow<'static, str>>) -> Self {\n        self.description = Some(description.into());\n        self\n    }\n\n    /// Get the description.\n    pub fn get_description(&self) -> &Option<Cow<'static, str>> {\n        &self.description\n    }\n\n    /// Set the units.\n    pub fn set_units(mut self, units: impl Into<Cow<'static, str>>) -> Self {\n        self.units = Some(units.into());\n        self\n    }\n\n    /// Get the units.\n    pub fn get_units(&self) -> &Option<Cow<'static, str>> {\n        &self.units\n    }\n}\n\n/// Takes in the name of function from [ProvideInstrument] and the type of instrument being created\n/// (ex: [Histogram]) and adds a `build` function for it.\nmacro_rules! build_instrument {\n    ($name:ident, $instrument:ty) => {\n        impl<'a> InstrumentBuilder<'a, $instrument> {\n            #[doc = concat!(\"Create a new `\",  stringify!($instrument), \"`.\")]\n            pub fn build(self) -> $instrument {\n                self.instrument_provider.$name(self)\n            }\n        }\n    };\n}\n\nbuild_instrument!(create_histogram, Arc<dyn Histogram>);\nbuild_instrument!(create_monotonic_counter, Arc<dyn MonotonicCounter>);\nbuild_instrument!(create_up_down_counter, Arc<dyn UpDownCounter>);\n\n/// Configuration for building an async instrument.\n#[non_exhaustive]\npub struct AsyncInstrumentBuilder<'a, T, M> {\n    instrument_provider: &'a dyn ProvideInstrument,\n    name: Cow<'static, str>,\n    // Implementation note: I could not make the lifetimes work out in the impl ProvideInstrument\n    // in aws-smithy-observability-otel without making this field pub\n    /// The callback function for this AsyncInstrumentBuilder.\n    #[allow(clippy::type_complexity)]\n    pub callback: Arc<dyn Fn(&dyn AsyncMeasure<Value = M>) + Send + Sync>,\n    description: Option<Cow<'static, str>>,\n    units: Option<Cow<'static, str>>,\n    _phantom: PhantomData<T>,\n}\n\n#[allow(clippy::type_complexity)]\nimpl<'a, T, M> AsyncInstrumentBuilder<'a, T, M> {\n    /// Create a new async instrument builder\n    pub(crate) fn new(\n        meter: &'a Meter,\n        name: Cow<'static, str>,\n        callback: Arc<dyn Fn(&dyn AsyncMeasure<Value = M>) + Send + Sync>,\n    ) -> Self {\n        AsyncInstrumentBuilder {\n            instrument_provider: meter.instrument_provider.as_ref(),\n            name,\n            callback,\n            description: None,\n            units: None,\n            _phantom: PhantomData::<T>,\n        }\n    }\n\n    /// Get the name.\n    pub fn get_name(&self) -> &Cow<'static, str> {\n        &self.name\n    }\n\n    /// Get the callback function.\n    pub fn get_callback(&self) -> Arc<dyn Fn(&dyn AsyncMeasure<Value = M>) + Send + Sync> {\n        self.callback.clone()\n    }\n\n    /// Set the description.\n    pub fn set_description(mut self, description: impl Into<Cow<'static, str>>) -> Self {\n        self.description = Some(description.into());\n        self\n    }\n\n    /// Get the description.\n    pub fn get_description(&self) -> &Option<Cow<'static, str>> {\n        &self.description\n    }\n\n    /// Set the units.\n    pub fn set_units(mut self, units: impl Into<Cow<'static, str>>) -> Self {\n        self.units = Some(units.into());\n        self\n    }\n\n    /// Get the units.\n    pub fn get_units(&self) -> &Option<Cow<'static, str>> {\n        &self.units\n    }\n}\n\n/// Takes in the name of function from [ProvideInstrument] and the type of instrument being created\n/// (ex: [AsyncMeasure]) and adds a `build` function for it.\n//TODO(observability): Can I derive the measurement from the Value of the instrument type or vice versa?\nmacro_rules! build_async_instrument {\n    ($name:ident, $instrument:ty, $measurement:ty) => {\n        impl<'a> AsyncInstrumentBuilder<'a, $instrument, $measurement> {\n            #[doc = concat!(\"Create a new `\",  stringify!($instrument), \"`.\")]\n            pub fn build(self) -> $instrument {\n                self.instrument_provider.$name(self)\n            }\n        }\n    };\n}\n\nbuild_async_instrument!(create_gauge, Arc<dyn AsyncMeasure<Value = f64>>, f64);\nbuild_async_instrument!(\n    create_async_up_down_counter,\n    Arc<dyn AsyncMeasure<Value = i64>>,\n    i64\n);\nbuild_async_instrument!(\n    create_async_monotonic_counter,\n    Arc<dyn AsyncMeasure<Value = u64>>,\n    u64\n);\n\n/// The entry point to creating instruments. A grouping of related metrics.\npub trait ProvideInstrument: Send + Sync + Debug {\n    /// Create a new Gauge.\n    #[allow(clippy::type_complexity)]\n    fn create_gauge(\n        &self,\n        builder: AsyncInstrumentBuilder<'_, Arc<dyn AsyncMeasure<Value = f64>>, f64>,\n    ) -> Arc<dyn AsyncMeasure<Value = f64>>;\n\n    /// Create a new [UpDownCounter].\n    fn create_up_down_counter(\n        &self,\n        builder: InstrumentBuilder<'_, Arc<dyn UpDownCounter>>,\n    ) -> Arc<dyn UpDownCounter>;\n\n    /// Create a new AsyncUpDownCounter.\n    #[allow(clippy::type_complexity)]\n    fn create_async_up_down_counter(\n        &self,\n        builder: AsyncInstrumentBuilder<'_, Arc<dyn AsyncMeasure<Value = i64>>, i64>,\n    ) -> Arc<dyn AsyncMeasure<Value = i64>>;\n\n    /// Create a new [MonotonicCounter].\n    fn create_monotonic_counter(\n        &self,\n        builder: InstrumentBuilder<'_, Arc<dyn MonotonicCounter>>,\n    ) -> Arc<dyn MonotonicCounter>;\n\n    /// Create a new AsyncMonotonicCounter.\n    #[allow(clippy::type_complexity)]\n    fn create_async_monotonic_counter(\n        &self,\n        builder: AsyncInstrumentBuilder<'_, Arc<dyn AsyncMeasure<Value = u64>>, u64>,\n    ) -> Arc<dyn AsyncMeasure<Value = u64>>;\n\n    /// Create a new [Histogram].\n    fn create_histogram(\n        &self,\n        builder: InstrumentBuilder<'_, Arc<dyn Histogram>>,\n    ) -> Arc<dyn Histogram>;\n}\n\n/// Collects a set of events with an event count and sum for all events.\npub trait Histogram: Send + Sync + Debug {\n    /// Record a value.\n    fn record(&self, value: f64, attributes: Option<&Attributes>, context: Option<&dyn Context>);\n}\n\n/// A counter that monotonically increases.\npub trait MonotonicCounter: Send + Sync + Debug {\n    /// Increment a counter by a fixed amount.\n    fn add(&self, value: u64, attributes: Option<&Attributes>, context: Option<&dyn Context>);\n}\n\n/// A counter that can increase or decrease.\npub trait UpDownCounter: Send + Sync + Debug {\n    /// Increment or decrement a counter by a fixed amount.\n    fn add(&self, value: i64, attributes: Option<&Attributes>, context: Option<&dyn Context>);\n}\n\n/// A measurement that can be taken asynchronously.\npub trait AsyncMeasure: Send + Sync + Debug {\n    /// The type recorded by the measurement.\n    type Value;\n\n    /// Record a value\n    fn record(\n        &self,\n        value: Self::Value,\n        attributes: Option<&Attributes>,\n        context: Option<&dyn Context>,\n    );\n\n    /// Stop recording, unregister callback.\n    fn stop(&self);\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-observability/src/lib.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/* Automatically managed default lints */\n#![cfg_attr(docsrs, feature(doc_cfg))]\n/* End of automatically managed default lints */\n#![warn(\n    missing_docs,\n    rustdoc::missing_crate_level_docs,\n    unreachable_pub,\n    rust_2018_idioms\n)]\n\n//! Smithy Observability\n// TODO(smithyobservability): once we have finalized everything and integrated metrics with our runtime\n// libraries update this with detailed usage docs and examples\n\nmod attributes;\npub use attributes::{AttributeValue, Attributes};\nmod context;\npub use context::{Context, ContextManager, Scope};\nmod error;\npub use error::{ErrorKind, GlobalTelemetryProviderError, ObservabilityError};\npub mod global;\npub mod meter;\nmod noop;\nmod provider;\npub use provider::{TelemetryProvider, TelemetryProviderBuilder};\npub mod instruments;\n"
  },
  {
    "path": "rust-runtime/aws-smithy-observability/src/meter.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Metrics are used to gain insight into the operational performance and health of a system in\n//! real time.\n\nuse crate::instruments::{\n    AsyncInstrumentBuilder, AsyncMeasure, Histogram, InstrumentBuilder, MonotonicCounter,\n    UpDownCounter,\n};\nuse crate::{attributes::Attributes, instruments::ProvideInstrument};\nuse std::{borrow::Cow, fmt::Debug, sync::Arc};\n\n/// Provides named instances of [Meter].\npub trait ProvideMeter: Send + Sync + Debug {\n    /// Get or create a named [Meter].\n    fn get_meter(&self, scope: &'static str, attributes: Option<&Attributes>) -> Meter;\n\n    /// Returns the name of this provider implementation.\n    /// This is used for feature tracking without requiring type imports.\n    fn provider_name(&self) -> &'static str {\n        \"unknown\"\n    }\n}\n\n/// The entry point to creating instruments. A grouping of related metrics.\n#[derive(Clone)]\npub struct Meter {\n    pub(crate) instrument_provider: Arc<dyn ProvideInstrument + Send + Sync>,\n}\n\nimpl Meter {\n    /// Create a new [Meter] from an [ProvideInstrument]\n    pub fn new(instrument_provider: Arc<dyn ProvideInstrument + Send + Sync>) -> Self {\n        Meter {\n            instrument_provider,\n        }\n    }\n\n    /// Create a new Gauge.\n    #[allow(clippy::type_complexity)]\n    pub fn create_gauge<F>(\n        &self,\n        name: impl Into<Cow<'static, str>>,\n        callback: F,\n    ) -> AsyncInstrumentBuilder<'_, Arc<dyn AsyncMeasure<Value = f64>>, f64>\n    where\n        F: Fn(&dyn AsyncMeasure<Value = f64>) + Send + Sync + 'static,\n    {\n        AsyncInstrumentBuilder::new(self, name.into(), Arc::new(callback))\n    }\n\n    /// Create a new [UpDownCounter].\n    pub fn create_up_down_counter(\n        &self,\n        name: impl Into<Cow<'static, str>>,\n    ) -> InstrumentBuilder<'_, Arc<dyn UpDownCounter>> {\n        InstrumentBuilder::new(self, name.into())\n    }\n\n    /// Create a new AsyncUpDownCounter.\n    #[allow(clippy::type_complexity)]\n    pub fn create_async_up_down_counter<F>(\n        &self,\n        name: impl Into<Cow<'static, str>>,\n        callback: F,\n    ) -> AsyncInstrumentBuilder<'_, Arc<dyn AsyncMeasure<Value = i64>>, i64>\n    where\n        F: Fn(&dyn AsyncMeasure<Value = i64>) + Send + Sync + 'static,\n    {\n        AsyncInstrumentBuilder::new(self, name.into(), Arc::new(callback))\n    }\n\n    /// Create a new [MonotonicCounter].\n    pub fn create_monotonic_counter(\n        &self,\n        name: impl Into<Cow<'static, str>>,\n    ) -> InstrumentBuilder<'_, Arc<dyn MonotonicCounter>> {\n        InstrumentBuilder::new(self, name.into())\n    }\n\n    /// Create a new AsyncMonotonicCounter.\n    #[allow(clippy::type_complexity)]\n    pub fn create_async_monotonic_counter<F>(\n        &self,\n        name: impl Into<Cow<'static, str>>,\n        callback: F,\n    ) -> AsyncInstrumentBuilder<'_, Arc<dyn AsyncMeasure<Value = u64>>, u64>\n    where\n        F: Fn(&dyn AsyncMeasure<Value = u64>) + Send + Sync + 'static,\n    {\n        AsyncInstrumentBuilder::new(self, name.into(), Arc::new(callback))\n    }\n\n    /// Create a new [Histogram].\n    pub fn create_histogram(\n        &self,\n        name: impl Into<Cow<'static, str>>,\n    ) -> InstrumentBuilder<'_, Arc<dyn Histogram>> {\n        InstrumentBuilder::new(self, name.into())\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-observability/src/noop.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! An noop implementation of the Meter traits\n\nuse std::marker::PhantomData;\nuse std::{fmt::Debug, sync::Arc};\n\nuse crate::instruments::{\n    AsyncInstrumentBuilder, AsyncMeasure, Histogram, InstrumentBuilder, MonotonicCounter,\n    ProvideInstrument, UpDownCounter,\n};\nuse crate::{\n    attributes::Attributes,\n    context::Context,\n    meter::{Meter, ProvideMeter},\n};\n\n#[derive(Debug)]\npub(crate) struct NoopMeterProvider;\nimpl ProvideMeter for NoopMeterProvider {\n    fn get_meter(&self, _scope: &'static str, _attributes: Option<&Attributes>) -> Meter {\n        Meter::new(Arc::new(NoopMeter))\n    }\n\n    fn provider_name(&self) -> &'static str {\n        \"noop\"\n    }\n}\n\n#[derive(Debug)]\npub(crate) struct NoopMeter;\nimpl ProvideInstrument for NoopMeter {\n    fn create_gauge(\n        &self,\n        _builder: AsyncInstrumentBuilder<'_, Arc<dyn AsyncMeasure<Value = f64>>, f64>,\n    ) -> Arc<dyn AsyncMeasure<Value = f64>> {\n        Arc::new(NoopAsyncMeasurement(PhantomData::<f64>))\n    }\n\n    fn create_up_down_counter(\n        &self,\n        _builder: InstrumentBuilder<'_, Arc<dyn UpDownCounter>>,\n    ) -> Arc<dyn UpDownCounter> {\n        Arc::new(NoopUpDownCounter)\n    }\n\n    fn create_async_up_down_counter(\n        &self,\n        _builder: AsyncInstrumentBuilder<'_, Arc<dyn AsyncMeasure<Value = i64>>, i64>,\n    ) -> Arc<dyn AsyncMeasure<Value = i64>> {\n        Arc::new(NoopAsyncMeasurement(PhantomData::<i64>))\n    }\n\n    fn create_monotonic_counter(\n        &self,\n        _builder: InstrumentBuilder<'_, Arc<dyn MonotonicCounter>>,\n    ) -> Arc<dyn MonotonicCounter> {\n        Arc::new(NoopMonotonicCounter)\n    }\n\n    fn create_async_monotonic_counter(\n        &self,\n        _builder: AsyncInstrumentBuilder<'_, Arc<dyn AsyncMeasure<Value = u64>>, u64>,\n    ) -> Arc<dyn AsyncMeasure<Value = u64>> {\n        Arc::new(NoopAsyncMeasurement(PhantomData::<u64>))\n    }\n\n    fn create_histogram(\n        &self,\n        _builder: InstrumentBuilder<'_, Arc<dyn Histogram>>,\n    ) -> Arc<dyn Histogram> {\n        Arc::new(NoopHistogram)\n    }\n}\n\n#[derive(Debug)]\nstruct NoopAsyncMeasurement<T: Send + Sync + Debug>(PhantomData<T>);\nimpl<T: Send + Sync + Debug> AsyncMeasure for NoopAsyncMeasurement<T> {\n    type Value = T;\n\n    fn record(&self, _value: T, _attributes: Option<&Attributes>, _context: Option<&dyn Context>) {}\n\n    fn stop(&self) {}\n}\n\n#[derive(Debug)]\nstruct NoopUpDownCounter;\nimpl UpDownCounter for NoopUpDownCounter {\n    fn add(&self, _value: i64, _attributes: Option<&Attributes>, _context: Option<&dyn Context>) {}\n}\n\n#[derive(Debug)]\nstruct NoopMonotonicCounter;\nimpl MonotonicCounter for NoopMonotonicCounter {\n    fn add(&self, _value: u64, _attributes: Option<&Attributes>, _context: Option<&dyn Context>) {}\n}\n\n#[derive(Debug)]\nstruct NoopHistogram;\nimpl Histogram for NoopHistogram {\n    fn record(\n        &self,\n        _value: f64,\n        _attributes: Option<&Attributes>,\n        _context: Option<&dyn Context>,\n    ) {\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-observability/src/provider.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Definitions of high level Telemetry Providers.\n\nuse std::sync::Arc;\n\nuse crate::{meter::ProvideMeter, noop::NoopMeterProvider};\n\n/// A struct to hold the various types of telemetry providers.\n#[non_exhaustive]\npub struct TelemetryProvider {\n    meter_provider: Arc<dyn ProvideMeter + Send + Sync>,\n}\n\nimpl TelemetryProvider {\n    /// Returns a builder struct for [TelemetryProvider]\n    pub fn builder() -> TelemetryProviderBuilder {\n        TelemetryProviderBuilder {\n            meter_provider: Arc::new(NoopMeterProvider),\n        }\n    }\n\n    /// Returns a noop [TelemetryProvider]\n    pub fn noop() -> TelemetryProvider {\n        Self {\n            meter_provider: Arc::new(NoopMeterProvider),\n        }\n    }\n\n    /// Get the set [ProvideMeter]\n    pub fn meter_provider(&self) -> &(dyn ProvideMeter + Send + Sync) {\n        self.meter_provider.as_ref()\n    }\n}\n\n// If we choose to expand our Telemetry provider and make Logging and Tracing\n// configurable at some point in the future we can do that by adding default\n// logger_provider and tracer_providers based on `tracing` to maintain backwards\n// compatibilty with what we have today.\nimpl Default for TelemetryProvider {\n    fn default() -> Self {\n        Self {\n            meter_provider: Arc::new(NoopMeterProvider),\n        }\n    }\n}\n\n/// A builder for [TelemetryProvider].\n#[non_exhaustive]\npub struct TelemetryProviderBuilder {\n    meter_provider: Arc<dyn ProvideMeter + Send + Sync>,\n}\n\nimpl TelemetryProviderBuilder {\n    /// Set the [ProvideMeter].\n    pub fn meter_provider(mut self, meter_provider: Arc<impl ProvideMeter + 'static>) -> Self {\n        self.meter_provider = meter_provider;\n        self\n    }\n\n    /// Build the [TelemetryProvider].\n    pub fn build(self) -> TelemetryProvider {\n        TelemetryProvider {\n            meter_provider: self.meter_provider,\n        }\n    }\n}\n\n/// Wrapper type to hold a implementer of TelemetryProvider in an Arc so that\n/// it can be safely used across threads.\n#[non_exhaustive]\npub(crate) struct GlobalTelemetryProvider {\n    pub(crate) telemetry_provider: Arc<TelemetryProvider>,\n}\n\nimpl GlobalTelemetryProvider {\n    pub(crate) fn new(telemetry_provider: TelemetryProvider) -> Self {\n        Self {\n            telemetry_provider: Arc::new(telemetry_provider),\n        }\n    }\n\n    pub(crate) fn telemetry_provider(&self) -> &Arc<TelemetryProvider> {\n        &self.telemetry_provider\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-observability-otel/Cargo.toml",
    "content": "[package]\nname = \"aws-smithy-observability-otel\"\nversion = \"0.1.11\"\nauthors = [\n  \"AWS Rust SDK Team <aws-sdk-rust@amazon.com>\",\n]\ndescription = \"Smithy OpenTelemetry observability implementation.\"\nedition = \"2021\"\nlicense = \"Apache-2.0\"\nrepository = \"https://github.com/awslabs/smithy-rs\"\nrust-version = \"1.91.1\"\n\n[dependencies]\naws-smithy-observability = { path = \"../aws-smithy-observability\" }\nopentelemetry = {version = \"0.26.0\", features = [\"metrics\"]}\n# The following dependencies are transitive and pinned for build\n# compatability purposes\nvalue-bag = \"1.10.0\"\nasync-global-executor = \"2.4.1\"\nasync-task = \"=4.7.1\"\n\n# This crate cannot be used on powerpc\n[target.'cfg(not(target_arch = \"powerpc\"))'.dependencies]\nopentelemetry_sdk = {version = \"0.26.0\", features = [\"metrics\", \"testing\"]}\n\n[dev-dependencies]\ntokio = { version = \"1.49.0\" }\ncriterion = {version = \"0.5.1\", features = [\"async_tokio\"]}\nstats_alloc = \"0.1.10\"\n\n[package.metadata.docs.rs]\nall-features = true\ntargets = [\"x86_64-unknown-linux-gnu\"]\ncargo-args = [\"-Zunstable-options\", \"-Zrustdoc-scrape-examples\"]\nrustdoc-args = [\"--cfg\", \"docsrs\"]\n# End of docs.rs metadata\n\n[[bench]]\nname = \"sync_instruments\"\nharness = false\n\n[[bench]]\nname = \"async_instruments\"\nharness = false\n"
  },
  {
    "path": "rust-runtime/aws-smithy-observability-otel/LICENSE",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n"
  },
  {
    "path": "rust-runtime/aws-smithy-observability-otel/README.md",
    "content": "# aws-smithy-observability-otel\n\nThis crate contains OpenTelemetry based implementations of the metrics traits from the `aws-smithy-observability` crate.\n\n<!-- anchor_start:footer -->\nThis crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly.\n<!-- anchor_end:footer -->\n"
  },
  {
    "path": "rust-runtime/aws-smithy-observability-otel/benches/async_instruments.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_smithy_observability::instruments::AsyncMeasure;\nuse aws_smithy_observability::meter::Meter;\nuse aws_smithy_observability::{AttributeValue, Attributes, TelemetryProvider};\nuse aws_smithy_observability_otel::meter::OtelMeterProvider;\nuse criterion::{criterion_group, criterion_main, Criterion};\nuse opentelemetry_sdk::metrics::{PeriodicReader, SdkMeterProvider};\nuse opentelemetry_sdk::runtime::Tokio;\nuse opentelemetry_sdk::testing::metrics::InMemoryMetricsExporter;\n\nuse stats_alloc::{Region, StatsAlloc, INSTRUMENTED_SYSTEM};\nuse std::alloc::System;\nuse std::sync::Arc;\n\nasync fn record_async_instruments(dyn_sdk_meter: Meter) {\n    //Create all async instruments and record some data\n    let gauge = dyn_sdk_meter\n        .create_gauge(\n            \"TestGauge\".to_string(),\n            // Callback function records another value with different attributes so it is deduped\n            |measurement: &dyn AsyncMeasure<Value = f64>| {\n                let mut attrs = Attributes::new();\n                attrs.set(\n                    \"TestGaugeAttr\",\n                    AttributeValue::String(\"TestGaugeAttr\".into()),\n                );\n                measurement.record(6.789, Some(&attrs), None);\n            },\n        )\n        .build();\n    gauge.record(1.234, None, None);\n\n    let async_ud_counter = dyn_sdk_meter\n        .create_async_up_down_counter(\n            \"TestAsyncUpDownCounter\".to_string(),\n            |measurement: &dyn AsyncMeasure<Value = i64>| {\n                let mut attrs = Attributes::new();\n                attrs.set(\n                    \"TestAsyncUpDownCounterAttr\",\n                    AttributeValue::String(\"TestAsyncUpDownCounterAttr\".into()),\n                );\n                measurement.record(12, Some(&attrs), None);\n            },\n        )\n        .build();\n    async_ud_counter.record(-6, None, None);\n\n    let async_mono_counter = dyn_sdk_meter\n        .create_async_monotonic_counter(\n            \"TestAsyncMonoCounter\".to_string(),\n            |measurement: &dyn AsyncMeasure<Value = u64>| {\n                let mut attrs = Attributes::new();\n                attrs.set(\n                    \"TestAsyncMonoCounterAttr\",\n                    AttributeValue::String(\"TestAsyncMonoCounterAttr\".into()),\n                );\n                measurement.record(123, Some(&attrs), None);\n            },\n        )\n        .build();\n    async_mono_counter.record(4, None, None);\n}\n\nfn async_instruments_benchmark(c: &mut Criterion) {\n    #[global_allocator]\n    static GLOBAL: &StatsAlloc<System> = &INSTRUMENTED_SYSTEM;\n    let reg = Region::new(GLOBAL);\n\n    // Setup the Otel MeterProvider (which needs to be done inside an async runtime)\n    // The runtime is reused later for running the bench function\n    let runtime = tokio::runtime::Runtime::new().unwrap();\n    let otel_mp = runtime.block_on(async {\n        let exporter = InMemoryMetricsExporter::default();\n        let reader = PeriodicReader::builder(exporter.clone(), Tokio).build();\n        SdkMeterProvider::builder().with_reader(reader).build()\n    });\n    // Create the SDK metrics types from the OTel objects\n    let sdk_mp = Arc::new(OtelMeterProvider::new(otel_mp));\n    let sdk_tp = TelemetryProvider::builder().meter_provider(sdk_mp).build();\n\n    // Get the dyn versions of the SDK metrics objects\n    let dyn_sdk_mp = sdk_tp.meter_provider();\n    let dyn_sdk_meter = dyn_sdk_mp.get_meter(\"TestMeter\", None);\n\n    c.bench_function(\"async_instruments\", |b| {\n        b.to_async(&runtime)\n            .iter(|| async { record_async_instruments(dyn_sdk_meter.clone()) });\n    });\n\n    println!(\"FINISHING\");\n    println!(\"Stats at end: {:#?}\", reg.change());\n}\n\ncriterion_group!(benches, async_instruments_benchmark);\ncriterion_main!(benches);\n"
  },
  {
    "path": "rust-runtime/aws-smithy-observability-otel/benches/sync_instruments.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_smithy_observability::meter::Meter;\nuse aws_smithy_observability::TelemetryProvider;\nuse aws_smithy_observability_otel::meter::OtelMeterProvider;\nuse criterion::{criterion_group, criterion_main, Criterion};\nuse opentelemetry_sdk::metrics::{PeriodicReader, SdkMeterProvider};\nuse opentelemetry_sdk::runtime::Tokio;\nuse opentelemetry_sdk::testing::metrics::InMemoryMetricsExporter;\n\nuse stats_alloc::{Region, StatsAlloc, INSTRUMENTED_SYSTEM};\nuse std::alloc::System;\nuse std::sync::Arc;\n\nasync fn record_sync_instruments(dyn_sdk_meter: Meter) {\n    //Create all 3 sync instruments and record some data for each\n    let mono_counter = dyn_sdk_meter\n        .create_monotonic_counter(\"TestMonoCounter\")\n        .build();\n    mono_counter.add(4, None, None);\n    let ud_counter = dyn_sdk_meter\n        .create_up_down_counter(\"TestUpDownCounter\")\n        .build();\n    ud_counter.add(-6, None, None);\n    let histogram = dyn_sdk_meter\n        .create_histogram(\"TestHistogram\".to_string())\n        .build();\n    histogram.record(1.234, None, None);\n}\n\nfn sync_instruments_benchmark(c: &mut Criterion) {\n    #[global_allocator]\n    static GLOBAL: &StatsAlloc<System> = &INSTRUMENTED_SYSTEM;\n    let reg = Region::new(GLOBAL);\n\n    // Setup the Otel MeterProvider (which needs to be done inside an async runtime)\n    // The runtime is reused later for running the bench function\n    let runtime = tokio::runtime::Runtime::new().unwrap();\n    let otel_mp = runtime.block_on(async {\n        let exporter = InMemoryMetricsExporter::default();\n        let reader = PeriodicReader::builder(exporter.clone(), Tokio).build();\n        SdkMeterProvider::builder().with_reader(reader).build()\n    });\n    // Create the SDK metrics types from the OTel objects\n    let sdk_mp = Arc::new(OtelMeterProvider::new(otel_mp));\n    let sdk_tp = TelemetryProvider::builder().meter_provider(sdk_mp).build();\n\n    // Get the dyn versions of the SDK metrics objects\n    let dyn_sdk_mp = sdk_tp.meter_provider();\n    let dyn_sdk_meter = dyn_sdk_mp.get_meter(\"TestMeter\", None);\n\n    c.bench_function(\"sync_instruments\", |b| {\n        b.to_async(&runtime)\n            .iter(|| async { record_sync_instruments(dyn_sdk_meter.clone()) });\n    });\n\n    println!(\"FINISHING\");\n    println!(\"Stats at end: {:#?}\", reg.change());\n}\n\ncriterion_group!(benches, sync_instruments_benchmark);\ncriterion_main!(benches);\n"
  },
  {
    "path": "rust-runtime/aws-smithy-observability-otel/external-types.toml",
    "content": "allowed_external_types = [\n    \"aws_smithy_observability::error::ObservabilityError\",\n    \"aws_smithy_observability::meter::AsyncMeasure\",\n    \"aws_smithy_observability::meter::Histogram\",\n    \"aws_smithy_observability::meter::Meter\",\n    \"aws_smithy_observability::meter::MonotonicCounter\",\n    \"aws_smithy_observability::meter::ProvideInstrument\",\n    \"aws_smithy_observability::meter::ProvideMeter\",\n    \"aws_smithy_observability::meter::UpDownCounter\",\n    \"aws_smithy_observability::provider::TelemetryProvider\",\n    \"opentelemetry_sdk::metrics::meter_provider::SdkMeterProvider\",\n]\n"
  },
  {
    "path": "rust-runtime/aws-smithy-observability-otel/src/attributes.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Utilities to transform back and forth from Smithy Observability [Attributes] to\n//! OTel [KeyValue]s.\n\nuse std::ops::Deref;\n\nuse aws_smithy_observability::{AttributeValue, Attributes};\nuse opentelemetry::{KeyValue, Value};\n\npub(crate) struct AttributesWrap(Attributes);\nimpl AttributesWrap {\n    pub(crate) fn new(inner: Attributes) -> Self {\n        Self(inner)\n    }\n}\nimpl Deref for AttributesWrap {\n    type Target = Attributes;\n\n    fn deref(&self) -> &Self::Target {\n        &self.0\n    }\n}\n\npub(crate) fn kv_from_option_attr(input: Option<&Attributes>) -> Vec<KeyValue> {\n    input\n        .map(|attr| AttributesWrap::new(attr.clone()))\n        .unwrap_or(AttributesWrap::new(Attributes::new()))\n        .into()\n}\n\n#[allow(dead_code)]\npub(crate) fn option_attr_from_kv(input: &[KeyValue]) -> Option<Attributes> {\n    if input.is_empty() {\n        return None;\n    }\n\n    Some(AttributesWrap::from(input).0)\n}\n\nimpl From<AttributesWrap> for Vec<KeyValue> {\n    fn from(value: AttributesWrap) -> Self {\n        value\n            .0\n            .into_attributes()\n            .map(|(k, v)| {\n                KeyValue::new(\n                    k,\n                    match v {\n                        AttributeValue::I64(val) => Value::I64(val),\n                        AttributeValue::F64(val) => Value::F64(val),\n                        AttributeValue::String(val) => Value::String(val.into()),\n                        AttributeValue::Bool(val) => Value::Bool(val),\n                        _ => Value::String(\"UNSUPPORTED ATTRIBUTE VALUE TYPE\".into()),\n                    },\n                )\n            })\n            .collect::<Vec<KeyValue>>()\n    }\n}\n\nimpl From<&[KeyValue]> for AttributesWrap {\n    fn from(value: &[KeyValue]) -> Self {\n        let mut attrs = Attributes::new();\n\n        value.iter().for_each(|kv| {\n            attrs.set(\n                kv.key.clone(),\n                match &kv.value {\n                    Value::Bool(val) => AttributeValue::Bool(*val),\n                    Value::I64(val) => AttributeValue::I64(*val),\n                    Value::F64(val) => AttributeValue::F64(*val),\n                    Value::String(val) => AttributeValue::String(val.clone().into()),\n                    Value::Array(_) => {\n                        AttributeValue::String(\"UNSUPPORTED ATTRIBUTE VALUE TYPE\".into())\n                    }\n                },\n            )\n        });\n\n        AttributesWrap(attrs)\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use std::collections::HashMap;\n\n    use super::*;\n    use aws_smithy_observability::{AttributeValue, Attributes};\n    use opentelemetry::Value;\n\n    #[test]\n    fn attr_to_kv() {\n        let mut attrs = Attributes::new();\n        attrs.set(\"I64\", AttributeValue::I64(64));\n        attrs.set(\"F64\", AttributeValue::F64(64.0));\n        attrs.set(\"String\", AttributeValue::String(\"I AM A STRING\".into()));\n        attrs.set(\"Bool\", AttributeValue::Bool(true));\n\n        let kv = kv_from_option_attr(Some(&attrs));\n\n        let kv_map: HashMap<String, Value> = kv\n            .into_iter()\n            .map(|kv| (kv.key.to_string(), kv.value))\n            .collect();\n\n        assert_eq!(kv_map.get(\"I64\").unwrap(), &Value::I64(64));\n        assert_eq!(kv_map.get(\"F64\").unwrap(), &Value::F64(64.0));\n        assert_eq!(\n            kv_map.get(\"String\").unwrap(),\n            &Value::String(\"I AM A STRING\".into())\n        );\n        assert_eq!(kv_map.get(\"Bool\").unwrap(), &Value::Bool(true));\n    }\n\n    #[test]\n    fn kv_to_attr() {\n        let kvs: Vec<KeyValue> = vec![\n            KeyValue::new(\"Bool\", Value::Bool(true)),\n            KeyValue::new(\"String\", Value::String(\"I AM A STRING\".into())),\n            KeyValue::new(\"I64\", Value::I64(64)),\n            KeyValue::new(\"F64\", Value::F64(64.0)),\n        ];\n\n        let attrs = option_attr_from_kv(&kvs).unwrap();\n        assert_eq!(attrs.get(\"Bool\").unwrap(), &AttributeValue::Bool(true));\n        assert_eq!(\n            attrs.get(\"String\").unwrap(),\n            &AttributeValue::String(\"I AM A STRING\".into())\n        );\n        assert_eq!(attrs.get(\"I64\").unwrap(), &AttributeValue::I64(64));\n        assert_eq!(attrs.get(\"F64\").unwrap(), &AttributeValue::F64(64.0));\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-observability-otel/src/lib.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/* Automatically managed default lints */\n#![cfg_attr(docsrs, feature(doc_cfg))]\n/* End of automatically managed default lints */\n#![warn(\n    missing_docs,\n    rustdoc::missing_crate_level_docs,\n    unreachable_pub,\n    rust_2018_idioms\n)]\n// The `opentelemetry_sdk` crate uses std::sync::atomic::{AtomicI64, AtomicU64} which are not available on powerpc\n#![cfg(not(target_arch = \"powerpc\"))]\n\n//! Smithy Observability OpenTelemetry\n//TODO(smithyobservability): once we have finalized everything and integrated metrics with our runtime\n// libraries update this with detailed usage docs and examples\n\npub mod attributes;\npub mod meter;\n\n#[cfg(test)]\nmod tests {\n\n    use std::sync::Arc;\n\n    use crate::meter::OtelMeterProvider;\n    use aws_smithy_observability::{\n        global::{get_telemetry_provider, set_telemetry_provider},\n        TelemetryProvider,\n    };\n    use opentelemetry_sdk::metrics::{data::Sum, PeriodicReader, SdkMeterProvider};\n    use opentelemetry_sdk::runtime::Tokio;\n    use opentelemetry_sdk::testing::metrics::InMemoryMetricsExporter;\n\n    // Without these tokio settings this test just stalls forever on flushing the metrics pipeline\n    #[tokio::test(flavor = \"multi_thread\", worker_threads = 1)]\n    async fn can_construct_set_and_use_otel_as_global_telemetry_provider() {\n        // Create the OTel metrics objects\n        let exporter = InMemoryMetricsExporter::default();\n        let reader = PeriodicReader::builder(exporter.clone(), Tokio).build();\n        let otel_mp = SdkMeterProvider::builder().with_reader(reader).build();\n\n        // Create the SDK metrics types from the OTel objects\n        let sdk_mp = Arc::new(OtelMeterProvider::new(otel_mp));\n        let sdk_ref = sdk_mp.clone();\n        let sdk_tp = TelemetryProvider::builder().meter_provider(sdk_mp).build();\n\n        // Set the global TelemetryProvider and then get it back out\n        let _ = set_telemetry_provider(sdk_tp);\n        let global_tp = get_telemetry_provider().unwrap();\n\n        // Create an instrument and record a value\n        let global_meter = global_tp\n            .meter_provider()\n            .get_meter(\"TestGlobalMeter\", None);\n\n        let mono_counter = global_meter\n            .create_monotonic_counter(\"TestMonoCounter\")\n            .build();\n        mono_counter.add(4, None, None);\n\n        sdk_ref.flush().unwrap();\n        let finished_metrics = exporter.get_finished_metrics().unwrap();\n\n        let extracted_mono_counter_data = &finished_metrics[0].scope_metrics[0].metrics[0]\n            .data\n            .as_any()\n            .downcast_ref::<Sum<u64>>()\n            .unwrap()\n            .data_points[0]\n            .value;\n        assert_eq!(extracted_mono_counter_data, &4);\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-observability-otel/src/meter.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! OpenTelemetry based implementations of the Smithy Observability Meter traits.\n\nuse std::fmt::Debug;\nuse std::ops::Deref;\nuse std::sync::Arc;\n\nuse crate::attributes::kv_from_option_attr;\nuse aws_smithy_observability::instruments::{\n    AsyncInstrumentBuilder, AsyncMeasure, Histogram, InstrumentBuilder, MonotonicCounter,\n    ProvideInstrument, UpDownCounter,\n};\npub use aws_smithy_observability::meter::{Meter, ProvideMeter};\n\nuse aws_smithy_observability::{Attributes, Context, ErrorKind, ObservabilityError};\nuse opentelemetry::metrics::{\n    AsyncInstrument as OtelAsyncInstrument, Counter as OtelCounter, Histogram as OtelHistogram,\n    Meter as OtelMeter, MeterProvider as OtelMeterProviderTrait,\n    ObservableCounter as OtelObservableCounter, ObservableGauge as OtelObservableGauge,\n    ObservableUpDownCounter as OtelObservableUpDownCounter, UpDownCounter as OtelUpDownCounter,\n};\nuse opentelemetry_sdk::metrics::SdkMeterProvider as OtelSdkMeterProvider;\n\n#[derive(Debug)]\nstruct UpDownCounterWrap(OtelUpDownCounter<i64>);\nimpl UpDownCounter for UpDownCounterWrap {\n    fn add(&self, value: i64, attributes: Option<&Attributes>, _context: Option<&dyn Context>) {\n        self.0.add(value, &kv_from_option_attr(attributes));\n    }\n}\n\n#[derive(Debug)]\nstruct HistogramWrap(OtelHistogram<f64>);\nimpl Histogram for HistogramWrap {\n    fn record(&self, value: f64, attributes: Option<&Attributes>, _context: Option<&dyn Context>) {\n        self.0.record(value, &kv_from_option_attr(attributes));\n    }\n}\n\n#[derive(Debug)]\nstruct MonotonicCounterWrap(OtelCounter<u64>);\nimpl MonotonicCounter for MonotonicCounterWrap {\n    fn add(&self, value: u64, attributes: Option<&Attributes>, _context: Option<&dyn Context>) {\n        self.0.add(value, &kv_from_option_attr(attributes));\n    }\n}\n\n#[derive(Debug)]\nstruct GaugeWrap(OtelObservableGauge<f64>);\nimpl AsyncMeasure for GaugeWrap {\n    type Value = f64;\n\n    fn record(\n        &self,\n        value: Self::Value,\n        attributes: Option<&Attributes>,\n        _context: Option<&dyn Context>,\n    ) {\n        self.0.observe(value, &kv_from_option_attr(attributes));\n    }\n\n    // OTel rust does not currently support unregistering callbacks\n    // https://github.com/open-telemetry/opentelemetry-rust/issues/2245\n    fn stop(&self) {}\n}\n\n#[derive(Debug)]\nstruct AsyncUpDownCounterWrap(OtelObservableUpDownCounter<i64>);\nimpl AsyncMeasure for AsyncUpDownCounterWrap {\n    type Value = i64;\n\n    fn record(\n        &self,\n        value: Self::Value,\n        attributes: Option<&Attributes>,\n        _context: Option<&dyn Context>,\n    ) {\n        self.0.observe(value, &kv_from_option_attr(attributes));\n    }\n\n    // OTel rust does not currently support unregistering callbacks\n    // https://github.com/open-telemetry/opentelemetry-rust/issues/2245\n    fn stop(&self) {}\n}\n\n#[derive(Debug)]\nstruct AsyncMonotonicCounterWrap(OtelObservableCounter<u64>);\nimpl AsyncMeasure for AsyncMonotonicCounterWrap {\n    type Value = u64;\n\n    fn record(\n        &self,\n        value: Self::Value,\n        attributes: Option<&Attributes>,\n        _context: Option<&dyn Context>,\n    ) {\n        self.0.observe(value, &kv_from_option_attr(attributes));\n    }\n\n    // OTel rust does not currently support unregistering callbacks\n    // https://github.com/open-telemetry/opentelemetry-rust/issues/2245\n    fn stop(&self) {}\n}\n\nstruct AsyncInstrumentWrap<'a, T>(&'a (dyn OtelAsyncInstrument<T> + Send + Sync));\nimpl<T> AsyncMeasure for AsyncInstrumentWrap<'_, T> {\n    type Value = T;\n\n    fn record(\n        &self,\n        value: Self::Value,\n        attributes: Option<&Attributes>,\n        _context: Option<&dyn Context>,\n    ) {\n        self.0.observe(value, &kv_from_option_attr(attributes));\n    }\n\n    // OTel rust does not currently support unregistering callbacks\n    // https://github.com/open-telemetry/opentelemetry-rust/issues/2245\n    fn stop(&self) {}\n}\n\n// The OtelAsyncInstrument trait does not have Debug as a supertrait, so we impl a minimal version\n// for our wrapper struct\nimpl<T> Debug for AsyncInstrumentWrap<'_, T> {\n    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n        f.debug_tuple(\"AsyncInstrumentWrap\").finish()\n    }\n}\n\n#[derive(Debug)]\nstruct MeterWrap(OtelMeter);\nimpl Deref for MeterWrap {\n    type Target = OtelMeter;\n\n    fn deref(&self) -> &Self::Target {\n        &self.0\n    }\n}\n\nimpl ProvideInstrument for MeterWrap {\n    fn create_gauge(\n        &self,\n        builder: AsyncInstrumentBuilder<'_, Arc<dyn AsyncMeasure<Value = f64>>, f64>,\n    ) -> Arc<dyn AsyncMeasure<Value = f64>> {\n        let mut otel_builder = self.f64_observable_gauge(builder.get_name().clone());\n\n        if let Some(desc) = builder.get_description() {\n            otel_builder = otel_builder.with_description(desc.clone());\n        }\n\n        if let Some(u) = builder.get_units() {\n            otel_builder = otel_builder.with_unit(u.clone());\n        }\n\n        otel_builder = otel_builder.with_callback(move |input: &dyn OtelAsyncInstrument<f64>| {\n            let f = builder.callback.clone();\n            f(&AsyncInstrumentWrap(input));\n        });\n\n        Arc::new(GaugeWrap(otel_builder.init()))\n    }\n\n    fn create_up_down_counter(\n        &self,\n        builder: InstrumentBuilder<'_, Arc<dyn UpDownCounter>>,\n    ) -> Arc<dyn UpDownCounter> {\n        let mut otel_builder = self.i64_up_down_counter(builder.get_name().clone());\n        if let Some(desc) = builder.get_description() {\n            otel_builder = otel_builder.with_description(desc.clone());\n        }\n\n        if let Some(u) = builder.get_units() {\n            otel_builder = otel_builder.with_unit(u.clone());\n        }\n\n        Arc::new(UpDownCounterWrap(otel_builder.init()))\n    }\n\n    fn create_async_up_down_counter(\n        &self,\n        builder: AsyncInstrumentBuilder<'_, Arc<dyn AsyncMeasure<Value = i64>>, i64>,\n    ) -> Arc<dyn AsyncMeasure<Value = i64>> {\n        let mut otel_builder = self.i64_observable_up_down_counter(builder.get_name().clone());\n\n        if let Some(desc) = builder.get_description() {\n            otel_builder = otel_builder.with_description(desc.clone());\n        }\n\n        if let Some(u) = builder.get_units() {\n            otel_builder = otel_builder.with_unit(u.clone());\n        }\n\n        otel_builder = otel_builder.with_callback(move |input: &dyn OtelAsyncInstrument<i64>| {\n            let f = builder.callback.clone();\n            f(&AsyncInstrumentWrap(input));\n        });\n\n        Arc::new(AsyncUpDownCounterWrap(otel_builder.init()))\n    }\n\n    fn create_monotonic_counter(\n        &self,\n        builder: InstrumentBuilder<'_, Arc<dyn MonotonicCounter>>,\n    ) -> Arc<dyn MonotonicCounter> {\n        let mut otel_builder = self.u64_counter(builder.get_name().clone());\n        if let Some(desc) = builder.get_description() {\n            otel_builder = otel_builder.with_description(desc.clone());\n        }\n\n        if let Some(u) = builder.get_units() {\n            otel_builder = otel_builder.with_unit(u.clone());\n        }\n\n        Arc::new(MonotonicCounterWrap(otel_builder.init()))\n    }\n\n    fn create_async_monotonic_counter(\n        &self,\n        builder: AsyncInstrumentBuilder<'_, Arc<dyn AsyncMeasure<Value = u64>>, u64>,\n    ) -> Arc<dyn AsyncMeasure<Value = u64>> {\n        let mut otel_builder = self.u64_observable_counter(builder.get_name().clone());\n\n        if let Some(desc) = builder.get_description() {\n            otel_builder = otel_builder.with_description(desc.clone());\n        }\n\n        if let Some(u) = builder.get_units() {\n            otel_builder = otel_builder.with_unit(u.clone());\n        }\n\n        otel_builder = otel_builder.with_callback(move |input: &dyn OtelAsyncInstrument<u64>| {\n            let f = builder.callback.clone();\n            f(&AsyncInstrumentWrap(input));\n        });\n\n        Arc::new(AsyncMonotonicCounterWrap(otel_builder.init()))\n    }\n\n    fn create_histogram(\n        &self,\n        builder: InstrumentBuilder<'_, Arc<dyn Histogram>>,\n    ) -> Arc<dyn Histogram> {\n        let mut otel_builder = self.f64_histogram(builder.get_name().clone());\n        if let Some(desc) = builder.get_description() {\n            otel_builder = otel_builder.with_description(desc.clone());\n        }\n\n        if let Some(u) = builder.get_units() {\n            otel_builder = otel_builder.with_unit(u.clone());\n        }\n\n        Arc::new(HistogramWrap(otel_builder.init()))\n    }\n}\n\n/// An OpenTelemetry based implementation of the AWS SDK's [ProvideMeter] trait\n#[non_exhaustive]\n#[derive(Debug)]\npub struct OtelMeterProvider {\n    meter_provider: OtelSdkMeterProvider,\n}\n\nimpl OtelMeterProvider {\n    /// Create a new [OtelMeterProvider] from an [OtelSdkMeterProvider].\n    pub fn new(otel_meter_provider: OtelSdkMeterProvider) -> Self {\n        Self {\n            meter_provider: otel_meter_provider,\n        }\n    }\n\n    /// Flush the metric pipeline.\n    pub fn flush(&self) -> Result<(), ObservabilityError> {\n        match self.meter_provider.force_flush() {\n            Ok(_) => Ok(()),\n            Err(err) => Err(ObservabilityError::new(ErrorKind::Other, err)),\n        }\n    }\n}\n\nimpl ProvideMeter for OtelMeterProvider {\n    fn get_meter(&self, scope: &'static str, _attributes: Option<&Attributes>) -> Meter {\n        Meter::new(Arc::new(MeterWrap(self.meter_provider.meter(scope))))\n    }\n\n    fn provider_name(&self) -> &'static str {\n        \"AwsSmithyObservabilityOtelProvider\"\n    }\n}\n\n#[cfg(test)]\nmod tests {\n\n    use std::sync::Arc;\n\n    use aws_smithy_observability::instruments::AsyncMeasure;\n    use aws_smithy_observability::{AttributeValue, Attributes, TelemetryProvider};\n    use opentelemetry_sdk::metrics::{\n        data::{Gauge, Histogram, Sum},\n        PeriodicReader, SdkMeterProvider,\n    };\n    use opentelemetry_sdk::runtime::Tokio;\n    use opentelemetry_sdk::testing::metrics::InMemoryMetricsExporter;\n\n    use super::OtelMeterProvider;\n\n    // Without these tokio settings this test just stalls forever on flushing the metrics pipeline\n    #[tokio::test(flavor = \"multi_thread\", worker_threads = 1)]\n    async fn sync_instruments_work() {\n        // Create the OTel metrics objects\n        let exporter = InMemoryMetricsExporter::default();\n        let reader = PeriodicReader::builder(exporter.clone(), Tokio).build();\n        let otel_mp = SdkMeterProvider::builder().with_reader(reader).build();\n\n        // Create the SDK metrics types from the OTel objects\n        let sdk_mp = Arc::new(OtelMeterProvider::new(otel_mp));\n        let sdk_ref = sdk_mp.clone();\n        let sdk_tp = TelemetryProvider::builder().meter_provider(sdk_mp).build();\n\n        // Get the dyn versions of the SDK metrics objects\n        let dyn_sdk_mp = sdk_tp.meter_provider();\n        let dyn_sdk_meter = dyn_sdk_mp.get_meter(\"TestMeter\", None);\n\n        //Create all 3 sync instruments and record some data for each\n        let mono_counter = dyn_sdk_meter\n            .create_monotonic_counter(\"TestMonoCounter\")\n            .build();\n        mono_counter.add(4, None, None);\n        let ud_counter = dyn_sdk_meter\n            .create_up_down_counter(\"TestUpDownCounter\")\n            .build();\n        ud_counter.add(-6, None, None);\n        let histogram = dyn_sdk_meter.create_histogram(\"TestHistogram\").build();\n        histogram.record(1.234, None, None);\n\n        // Gracefully shutdown the metrics provider so all metrics are flushed through the pipeline\n        sdk_ref.flush().unwrap();\n\n        // Extract the metrics from the exporter and assert that they are what we expect\n        let finished_metrics = exporter.get_finished_metrics().unwrap();\n        let extracted_mono_counter_data = &finished_metrics[0].scope_metrics[0].metrics[0]\n            .data\n            .as_any()\n            .downcast_ref::<Sum<u64>>()\n            .unwrap()\n            .data_points[0]\n            .value;\n        assert_eq!(extracted_mono_counter_data, &4);\n\n        let extracted_ud_counter_data = &finished_metrics[0].scope_metrics[0].metrics[1]\n            .data\n            .as_any()\n            .downcast_ref::<Sum<i64>>()\n            .unwrap()\n            .data_points[0]\n            .value;\n        assert_eq!(extracted_ud_counter_data, &-6);\n\n        let extracted_histogram_data = &finished_metrics[0].scope_metrics[0].metrics[2]\n            .data\n            .as_any()\n            .downcast_ref::<Histogram<f64>>()\n            .unwrap()\n            .data_points[0]\n            .sum;\n        assert_eq!(extracted_histogram_data, &1.234);\n    }\n\n    #[tokio::test(flavor = \"multi_thread\", worker_threads = 1)]\n    async fn async_instrument_work() {\n        // Create the OTel metrics objects\n        let exporter = InMemoryMetricsExporter::default();\n        let reader = PeriodicReader::builder(exporter.clone(), Tokio).build();\n        let otel_mp = SdkMeterProvider::builder().with_reader(reader).build();\n\n        // Create the SDK metrics types from the OTel objects\n        let sdk_mp = Arc::new(OtelMeterProvider::new(otel_mp));\n        let sdk_ref = sdk_mp.clone();\n        let sdk_tp = TelemetryProvider::builder().meter_provider(sdk_mp).build();\n\n        // Get the dyn versions of the SDK metrics objects\n        let dyn_sdk_mp = sdk_tp.meter_provider();\n        let dyn_sdk_meter = dyn_sdk_mp.get_meter(\"TestMeter\", None);\n\n        //Create all async instruments and record some data\n        let gauge = dyn_sdk_meter\n            .create_gauge(\n                \"TestGauge\".to_string(),\n                // Callback function records another value with different attributes so it is deduped\n                |measurement: &dyn AsyncMeasure<Value = f64>| {\n                    let mut attrs = Attributes::new();\n                    attrs.set(\n                        \"TestGaugeAttr\",\n                        AttributeValue::String(\"TestGaugeAttr\".into()),\n                    );\n                    measurement.record(6.789, Some(&attrs), None);\n                },\n            )\n            .build();\n        gauge.record(1.234, None, None);\n\n        let async_ud_counter = dyn_sdk_meter\n            .create_async_up_down_counter(\n                \"TestAsyncUpDownCounter\".to_string(),\n                |measurement: &dyn AsyncMeasure<Value = i64>| {\n                    let mut attrs = Attributes::new();\n                    attrs.set(\n                        \"TestAsyncUpDownCounterAttr\",\n                        AttributeValue::String(\"TestAsyncUpDownCounterAttr\".into()),\n                    );\n                    measurement.record(12, Some(&attrs), None);\n                },\n            )\n            .build();\n        async_ud_counter.record(-6, None, None);\n\n        let async_mono_counter = dyn_sdk_meter\n            .create_async_monotonic_counter(\n                \"TestAsyncMonoCounter\".to_string(),\n                |measurement: &dyn AsyncMeasure<Value = u64>| {\n                    let mut attrs = Attributes::new();\n                    attrs.set(\n                        \"TestAsyncMonoCounterAttr\",\n                        AttributeValue::String(\"TestAsyncMonoCounterAttr\".into()),\n                    );\n                    measurement.record(123, Some(&attrs), None);\n                },\n            )\n            .build();\n        async_mono_counter.record(4, None, None);\n\n        // Gracefully shutdown the metrics provider so all metrics are flushed through the pipeline\n        sdk_ref.flush().unwrap();\n\n        // Extract the metrics from the exporter\n        let finished_metrics = exporter.get_finished_metrics().unwrap();\n\n        // Assert that the reported metrics are what we expect\n        let extracted_gauge_data = &finished_metrics[0].scope_metrics[0].metrics[0]\n            .data\n            .as_any()\n            .downcast_ref::<Gauge<f64>>()\n            .unwrap()\n            .data_points[0]\n            .value;\n        assert_eq!(extracted_gauge_data, &1.234);\n\n        let extracted_async_ud_counter_data = &finished_metrics[0].scope_metrics[0].metrics[1]\n            .data\n            .as_any()\n            .downcast_ref::<Sum<i64>>()\n            .unwrap()\n            .data_points[0]\n            .value;\n        assert_eq!(extracted_async_ud_counter_data, &-6);\n\n        let extracted_async_mono_data = &finished_metrics[0].scope_metrics[0].metrics[2]\n            .data\n            .as_any()\n            .downcast_ref::<Sum<u64>>()\n            .unwrap()\n            .data_points[0]\n            .value;\n        assert_eq!(extracted_async_mono_data, &4);\n\n        // Assert that the async callbacks ran\n        let finished_metrics = exporter.get_finished_metrics().unwrap();\n        let extracted_gauge_data = &finished_metrics[0].scope_metrics[0].metrics[0]\n            .data\n            .as_any()\n            .downcast_ref::<Gauge<f64>>()\n            .unwrap()\n            .data_points[1]\n            .value;\n        assert_eq!(extracted_gauge_data, &6.789);\n\n        let extracted_async_ud_counter_data = &finished_metrics[0].scope_metrics[0].metrics[1]\n            .data\n            .as_any()\n            .downcast_ref::<Sum<i64>>()\n            .unwrap()\n            .data_points[1]\n            .value;\n        assert_eq!(extracted_async_ud_counter_data, &12);\n\n        let extracted_async_mono_data = &finished_metrics[0].scope_metrics[0].metrics[2]\n            .data\n            .as_any()\n            .downcast_ref::<Sum<u64>>()\n            .unwrap()\n            .data_points[1]\n            .value;\n        assert_eq!(extracted_async_mono_data, &123);\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-protocol-test/Cargo.toml",
    "content": "[package]\nname = \"aws-smithy-protocol-test\"\nversion = \"0.63.14\"\nauthors = [\"AWS Rust SDK Team <aws-sdk-rust@amazon.com>\", \"Russell Cohen <rcoh@amazon.com>\"]\ndescription = \"A collection of library functions to validate HTTP requests against Smithy protocol tests.\"\nedition = \"2021\"\nlicense = \"Apache-2.0\"\nrepository = \"https://github.com/smithy-lang/smithy-rs\"\nrust-version = \"1.91.1\"\n\n[features]\ndefault = [\"http-02x\"]\nhttp-02x = [\"dep:http-0x\"]\nhttp-1x = [\"dep:http-1x\"]\n\n[dependencies]\n# Not perfect for our needs, but good for now\nassert-json-diff = \"2\"\nbase64-simd = \"0.8\"\ncbor-diag = \"0.1.12\"\nciborium = \"0.2\"\npretty_assertions = \"1.3\"\nregex-lite = \"0.1.5\"\nroxmltree = \"0.14.1\"\nserde_json = \"1.0.146\"\nthiserror = \"2\"\naws-smithy-runtime-api = { path = \"../aws-smithy-runtime-api\", features = [\"client\"] }\n\n# HTTP version dependencies\nhttp-0x = { package = \"http\", version = \"0.2.12\", optional = true }\nhttp-1x = { package = \"http\", version = \"1.3.1\", optional = true }\n\n[package.metadata.docs.rs]\nall-features = true\ntargets = [\"x86_64-unknown-linux-gnu\"]\ncargo-args = [\"-Zunstable-options\", \"-Zrustdoc-scrape-examples\"]\nrustdoc-args = [\"--cfg\", \"docsrs\"]\n# End of docs.rs metadata\n"
  },
  {
    "path": "rust-runtime/aws-smithy-protocol-test/LICENSE",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n"
  },
  {
    "path": "rust-runtime/aws-smithy-protocol-test/README.md",
    "content": "# Smithy Protocol Tests\n\nThis library implements utilities for validating serializers & deserializers\nagainst [Smithy protocol tests](https://awslabs.github.io/smithy/1.0/spec/http-protocol-compliance-tests.html). Specifically, this crate includes support for:\n\n* MediaType-aware comparison for XML, JSON and AWS Query.\n* NaN/Infinty supporting floating point comparisons.\n* HTTP header & query string validators.\n\n<!-- anchor_start:footer -->\nThis crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly.\n<!-- anchor_end:footer -->\n"
  },
  {
    "path": "rust-runtime/aws-smithy-protocol-test/src/lib.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/* Automatically managed default lints */\n#![cfg_attr(docsrs, feature(doc_cfg))]\n/* End of automatically managed default lints */\n#![warn(\n    // missing_docs,\n    // rustdoc::missing_crate_level_docs,\n    unreachable_pub,\n    rust_2018_idioms\n)]\n\nmod urlencoded;\nmod xml;\n\nuse crate::sealed::GetNormalizedHeader;\nuse crate::xml::try_xml_equivalent;\nuse assert_json_diff::assert_json_matches_no_panic;\nuse aws_smithy_runtime_api::client::orchestrator::HttpRequest;\nuse aws_smithy_runtime_api::http::Headers;\nuse pretty_assertions::Comparison;\nuse std::borrow::Cow;\nuse std::collections::HashSet;\nuse std::fmt::{self, Debug};\nuse thiserror::Error;\nuse urlencoded::try_url_encoded_form_equivalent;\n\n/// Helper trait for tests for float comparisons\n///\n/// This trait differs in float's default `PartialEq` implementation by considering all `NaN` values to\n/// be equal.\npub trait FloatEquals {\n    fn float_equals(&self, other: &Self) -> bool;\n}\n\nimpl FloatEquals for f64 {\n    fn float_equals(&self, other: &Self) -> bool {\n        (self.is_nan() && other.is_nan()) || self.eq(other)\n    }\n}\n\nimpl FloatEquals for f32 {\n    fn float_equals(&self, other: &Self) -> bool {\n        (self.is_nan() && other.is_nan()) || self.eq(other)\n    }\n}\n\nimpl<T> FloatEquals for Option<T>\nwhere\n    T: FloatEquals,\n{\n    fn float_equals(&self, other: &Self) -> bool {\n        match (self, other) {\n            (Some(this), Some(other)) => this.float_equals(other),\n            (None, None) => true,\n            _else => false,\n        }\n    }\n}\n\n#[derive(Debug, PartialEq, Eq, Error)]\npub enum ProtocolTestFailure {\n    #[error(\"missing query param: expected `{expected}`, found {found:?}\")]\n    MissingQueryParam {\n        expected: String,\n        found: Vec<String>,\n    },\n    #[error(\"forbidden query param present: `{expected}`\")]\n    ForbiddenQueryParam { expected: String },\n    #[error(\"required query param missing: `{expected}`\")]\n    RequiredQueryParam { expected: String },\n\n    #[error(\"invalid header value for key `{key}`: expected `{expected}`, found `{found}`\")]\n    InvalidHeader {\n        key: String,\n        expected: String,\n        found: String,\n    },\n    #[error(\"missing required header: `{expected}`\")]\n    MissingHeader { expected: String },\n    #[error(\"Header `{forbidden}` was forbidden but found: `{found}`\")]\n    ForbiddenHeader { forbidden: String, found: String },\n    #[error(\n        \"body did not match. left=expected, right=actual\\n{comparison:?} \\n == hint:\\n{hint}.\"\n    )]\n    BodyDidNotMatch {\n        // the comparison includes colorized escapes. PrettyString ensures that even during\n        // debug printing, these appear\n        comparison: PrettyString,\n        hint: String,\n    },\n    #[error(\"Expected body to be valid {expected} but instead: {found}\")]\n    InvalidBodyFormat { expected: String, found: String },\n}\n\n/// Check that the protocol test succeeded & print the pretty error\n/// if it did not\n///\n/// The primary motivation is making multiline debug output\n/// readable & using the cleaner Display implementation\n#[track_caller]\npub fn assert_ok(inp: Result<(), ProtocolTestFailure>) {\n    match inp {\n        Ok(_) => (),\n        Err(e) => {\n            eprintln!(\"{e}\");\n            panic!(\"Protocol test failed\");\n        }\n    }\n}\n\n#[derive(Eq, PartialEq, Hash)]\nstruct QueryParam<'a> {\n    key: &'a str,\n    value: Option<&'a str>,\n}\n\nimpl<'a> QueryParam<'a> {\n    fn parse(s: &'a str) -> Self {\n        let mut parsed = s.split('=');\n        QueryParam {\n            key: parsed.next().unwrap(),\n            value: parsed.next(),\n        }\n    }\n}\n\nfn extract_params(uri: &str) -> HashSet<&str> {\n    let query = uri.rsplit_once('?').map(|s| s.1).unwrap_or_default();\n    query.split('&').collect()\n}\n\n#[track_caller]\npub fn assert_uris_match(left: impl AsRef<str>, right: impl AsRef<str>) {\n    let left = left.as_ref();\n    let right = right.as_ref();\n    if left == right {\n        return;\n    }\n    assert_eq!(\n        extract_params(left),\n        extract_params(right),\n        \"Query parameters did not match. left: {left}, right: {right}\"\n    );\n\n    // When both features are enabled, prefer http-1x version\n    #[cfg(feature = \"http-1x\")]\n    {\n        let left: http_1x::Uri = left.parse().expect(\"left is not a valid URI\");\n        let right: http_1x::Uri = right.parse().expect(\"right is not a valid URI\");\n        assert_eq!(left.authority(), right.authority());\n        assert_eq!(left.scheme(), right.scheme());\n        assert_eq!(left.path(), right.path());\n    }\n    #[cfg(all(feature = \"http-02x\", not(feature = \"http-1x\")))]\n    {\n        let left: http_0x::Uri = left.parse().expect(\"left is not a valid URI\");\n        let right: http_0x::Uri = right.parse().expect(\"right is not a valid URI\");\n        assert_eq!(left.authority(), right.authority());\n        assert_eq!(left.scheme(), right.scheme());\n        assert_eq!(left.path(), right.path());\n    }\n}\n\npub fn validate_query_string(\n    request: &HttpRequest,\n    expected_params: &[&str],\n) -> Result<(), ProtocolTestFailure> {\n    let actual_params = extract_params(request.uri());\n    for param in expected_params {\n        if !actual_params.contains(param) {\n            return Err(ProtocolTestFailure::MissingQueryParam {\n                expected: param.to_string(),\n                found: actual_params.iter().map(|s| s.to_string()).collect(),\n            });\n        }\n    }\n    Ok(())\n}\n\npub fn forbid_query_params(\n    request: &HttpRequest,\n    forbid_params: &[&str],\n) -> Result<(), ProtocolTestFailure> {\n    let actual_params: HashSet<QueryParam<'_>> = extract_params(request.uri())\n        .iter()\n        .map(|param| QueryParam::parse(param))\n        .collect();\n    let actual_keys: HashSet<&str> = actual_params.iter().map(|param| param.key).collect();\n    for param in forbid_params {\n        let parsed = QueryParam::parse(param);\n        // If the forbidden param is k=v, then forbid this key-value pair\n        if actual_params.contains(&parsed) {\n            return Err(ProtocolTestFailure::ForbiddenQueryParam {\n                expected: param.to_string(),\n            });\n        }\n        // If the assertion is only about a key, then check keys\n        if parsed.value.is_none() && actual_keys.contains(parsed.key) {\n            return Err(ProtocolTestFailure::ForbiddenQueryParam {\n                expected: param.to_string(),\n            });\n        }\n    }\n    Ok(())\n}\n\npub fn require_query_params(\n    request: &HttpRequest,\n    require_keys: &[&str],\n) -> Result<(), ProtocolTestFailure> {\n    let actual_keys: HashSet<&str> = extract_params(request.uri())\n        .iter()\n        .map(|param| QueryParam::parse(param).key)\n        .collect();\n    for key in require_keys {\n        if !actual_keys.contains(*key) {\n            return Err(ProtocolTestFailure::RequiredQueryParam {\n                expected: key.to_string(),\n            });\n        }\n    }\n    Ok(())\n}\n\nmod sealed {\n    pub trait GetNormalizedHeader {\n        fn get_header(&self, key: &str) -> Option<String>;\n    }\n}\n\nimpl GetNormalizedHeader for &Headers {\n    fn get_header(&self, key: &str) -> Option<String> {\n        if !self.contains_key(key) {\n            None\n        } else {\n            Some(self.get_all(key).collect::<Vec<_>>().join(\", \"))\n        }\n    }\n}\n\n// HTTP 0.2.x HeaderMap implementation\n#[cfg(feature = \"http-02x\")]\nimpl GetNormalizedHeader for &http_0x::HeaderMap {\n    fn get_header(&self, key: &str) -> Option<String> {\n        if !self.contains_key(key) {\n            None\n        } else {\n            Some(\n                self.get_all(key)\n                    .iter()\n                    .map(|value| std::str::from_utf8(value.as_bytes()).expect(\"invalid utf-8\"))\n                    .collect::<Vec<_>>()\n                    .join(\", \"),\n            )\n        }\n    }\n}\n\n// HTTP 1.x HeaderMap implementation\n#[cfg(feature = \"http-1x\")]\nimpl GetNormalizedHeader for &http_1x::HeaderMap {\n    fn get_header(&self, key: &str) -> Option<String> {\n        if !self.contains_key(key) {\n            None\n        } else {\n            Some(\n                self.get_all(key)\n                    .iter()\n                    .map(|value| std::str::from_utf8(value.as_bytes()).expect(\"invalid utf-8\"))\n                    .collect::<Vec<_>>()\n                    .join(\", \"),\n            )\n        }\n    }\n}\n\npub fn validate_headers<'a>(\n    actual_headers: impl GetNormalizedHeader,\n    expected_headers: impl IntoIterator<Item = (impl AsRef<str> + 'a, impl AsRef<str> + 'a)>,\n) -> Result<(), ProtocolTestFailure> {\n    for (key, expected_value) in expected_headers {\n        let key = key.as_ref();\n        let expected_value = expected_value.as_ref();\n        match actual_headers.get_header(key) {\n            None => {\n                return Err(ProtocolTestFailure::MissingHeader {\n                    expected: key.to_string(),\n                })\n            }\n            Some(actual_value) if actual_value != *expected_value => {\n                return Err(ProtocolTestFailure::InvalidHeader {\n                    key: key.to_string(),\n                    expected: expected_value.to_string(),\n                    found: actual_value,\n                })\n            }\n            _ => (),\n        }\n    }\n    Ok(())\n}\n\npub fn forbid_headers(\n    headers: impl GetNormalizedHeader,\n    forbidden_headers: &[&str],\n) -> Result<(), ProtocolTestFailure> {\n    for key in forbidden_headers {\n        // Protocol tests store header lists as comma-delimited\n        if let Some(value) = headers.get_header(key) {\n            return Err(ProtocolTestFailure::ForbiddenHeader {\n                forbidden: key.to_string(),\n                found: format!(\"{key}: {value}\"),\n            });\n        }\n    }\n    Ok(())\n}\n\npub fn require_headers(\n    headers: impl GetNormalizedHeader,\n    required_headers: &[&str],\n) -> Result<(), ProtocolTestFailure> {\n    for key in required_headers {\n        // Protocol tests store header lists as comma-delimited\n        if headers.get_header(key).is_none() {\n            return Err(ProtocolTestFailure::MissingHeader {\n                expected: key.to_string(),\n            });\n        }\n    }\n    Ok(())\n}\n\n#[derive(Clone)]\npub enum MediaType {\n    /// JSON media types are deserialized and compared\n    Json,\n    /// XML media types are normalized and compared\n    Xml,\n    /// CBOR media types are decoded from base64 to binary and compared\n    Cbor,\n    /// For x-www-form-urlencoded, do some map order comparison shenanigans\n    UrlEncodedForm,\n    /// Other media types are compared literally\n    Other(String),\n}\n\nimpl<T: AsRef<str>> From<T> for MediaType {\n    fn from(inp: T) -> Self {\n        match inp.as_ref() {\n            \"application/json\" => MediaType::Json,\n            \"application/x-amz-json-1.1\" => MediaType::Json,\n            \"application/xml\" => MediaType::Xml,\n            \"application/cbor\" => MediaType::Cbor,\n            \"application/x-www-form-urlencoded\" => MediaType::UrlEncodedForm,\n            other => MediaType::Other(other.to_string()),\n        }\n    }\n}\n\npub fn validate_body<T: AsRef<[u8]> + Debug>(\n    actual_body: T,\n    expected_body: &str,\n    media_type: MediaType,\n) -> Result<(), ProtocolTestFailure> {\n    let body_str = std::str::from_utf8(actual_body.as_ref());\n    match (media_type, body_str) {\n        (MediaType::Json, Ok(actual_body)) => try_json_eq(expected_body, actual_body),\n        (MediaType::Json, Err(_)) => Err(ProtocolTestFailure::InvalidBodyFormat {\n            expected: \"json\".to_owned(),\n            found: \"input was not valid UTF-8\".to_owned(),\n        }),\n        (MediaType::Xml, Ok(actual_body)) => try_xml_equivalent(actual_body, expected_body),\n        (MediaType::Xml, Err(_)) => Err(ProtocolTestFailure::InvalidBodyFormat {\n            expected: \"XML\".to_owned(),\n            found: \"input was not valid UTF-8\".to_owned(),\n        }),\n        (MediaType::UrlEncodedForm, Ok(actual_body)) => {\n            try_url_encoded_form_equivalent(expected_body, actual_body)\n        }\n        (MediaType::UrlEncodedForm, Err(_)) => Err(ProtocolTestFailure::InvalidBodyFormat {\n            expected: \"x-www-form-urlencoded\".to_owned(),\n            found: \"input was not valid UTF-8\".to_owned(),\n        }),\n        (MediaType::Cbor, _) => try_cbor_eq(actual_body, expected_body),\n        (MediaType::Other(media_type), Ok(actual_body)) => {\n            if actual_body != expected_body {\n                Err(ProtocolTestFailure::BodyDidNotMatch {\n                    comparison: pretty_comparison(expected_body, actual_body),\n                    hint: format!(\"media type: {media_type}\"),\n                })\n            } else {\n                Ok(())\n            }\n        }\n        // It's not clear from the Smithy spec exactly how a binary / base64 encoded body is supposed\n        // to work. Defer implementation for now until an actual test exists.\n        (MediaType::Other(_), Err(_)) => {\n            unimplemented!(\"binary/non-utf8 formats not yet supported\")\n        }\n    }\n}\n\n#[derive(Eq, PartialEq)]\nstruct PrettyStr<'a>(&'a str);\nimpl Debug for PrettyStr<'_> {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        f.write_str(self.0)\n    }\n}\n\n#[derive(Eq, PartialEq)]\npub struct PrettyString(String);\nimpl Debug for PrettyString {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        f.write_str(&self.0)\n    }\n}\n\nfn pretty_comparison(expected: &str, actual: &str) -> PrettyString {\n    PrettyString(format!(\n        \"{}\",\n        Comparison::new(&PrettyStr(expected), &PrettyStr(actual))\n    ))\n}\n\nfn try_json_eq(expected: &str, actual: &str) -> Result<(), ProtocolTestFailure> {\n    let expected_json: serde_json::Value =\n        serde_json::from_str(expected).expect(\"expected value must be valid JSON\");\n    let actual_json: serde_json::Value =\n        serde_json::from_str(actual).map_err(|e| ProtocolTestFailure::InvalidBodyFormat {\n            expected: \"json\".to_owned(),\n            found: e.to_string() + actual,\n        })?;\n    let config = assert_json_diff::Config::new(assert_json_diff::CompareMode::Strict);\n    match assert_json_matches_no_panic(&actual_json, &expected_json, config) {\n        Ok(()) => Ok(()),\n        Err(message) => Err(ProtocolTestFailure::BodyDidNotMatch {\n            comparison: pretty_comparison(expected, actual),\n            hint: message,\n        }),\n    }\n}\n\n/// Compares two `ciborium::value::Value` instances for semantic equality.\n///\n/// This function recursively compares two CBOR values, correctly handling arrays and maps\n/// according to the CBOR specification. Arrays are compared element-wise in order,\n/// while maps are compared without considering the order of key-value pairs.\nfn cbor_values_equal(\n    a: &ciborium::value::Value,\n    b: &ciborium::value::Value,\n) -> Result<bool, ProtocolTestFailure> {\n    match (a, b) {\n        (ciborium::value::Value::Array(a_array), ciborium::value::Value::Array(b_array)) => {\n            // Both arrays should be equal in size.\n            if a_array.len() != b_array.len() {\n                return Ok(false);\n            }\n            // Compare arrays element-wise.\n            for (a_elem, b_elem) in a_array.iter().zip(b_array.iter()) {\n                if !cbor_values_equal(a_elem, b_elem)? {\n                    return Ok(false);\n                }\n            }\n            Ok(true)\n        }\n\n        // Convert `ciborium::value::Value::Map` to a `HashMap`, and then compare the values of\n        // each key in `a` with those in `b`.\n        (ciborium::value::Value::Map(a_map), ciborium::value::Value::Map(b_map)) => {\n            if a_map.len() != b_map.len() {\n                return Ok(false);\n            }\n\n            let b_hashmap = ciborium_map_to_hashmap(b_map)?;\n            // Each key in `a` should exist in `b`, and the values should match.\n            for a_key_value in a_map.iter() {\n                let (a_key, a_value) = get_text_key_value(a_key_value)?;\n                match b_hashmap.get(a_key) {\n                    Some(b_value) => {\n                        if !cbor_values_equal(a_value, b_value)? {\n                            return Ok(false);\n                        }\n                    }\n                    None => return Ok(false),\n                }\n            }\n            Ok(true)\n        }\n\n        (ciborium::value::Value::Float(a_float), ciborium::value::Value::Float(b_float)) => {\n            Ok(a_float == b_float || (a_float.is_nan() && b_float.is_nan()))\n        }\n\n        _ => Ok(a == b),\n    }\n}\n\n/// Converts a `ciborium::value::Value::Map` into a `HashMap<&String, &ciborium::value::Value>`.\n///\n/// CBOR maps (`Value::Map`) are internally represented as vectors of key-value pairs,\n/// and direct comparison is affected by the order of these pairs.\n/// Since the CBOR specification treats maps as unordered collections,\n/// this function transforms the vector into a `HashMap`, for order-independent comparisons\n/// between maps.\nfn ciborium_map_to_hashmap(\n    cbor_map: &[(ciborium::value::Value, ciborium::value::Value)],\n) -> Result<std::collections::HashMap<&String, &ciborium::value::Value>, ProtocolTestFailure> {\n    cbor_map.iter().map(get_text_key_value).collect()\n}\n\n/// Extracts a string key and its associated value from a CBOR key-value pair.\n/// Returns a `ProtocolTestFailure::InvalidBodyFormat` error if the key is not a text value.\nfn get_text_key_value(\n    (key, value): &(ciborium::value::Value, ciborium::value::Value),\n) -> Result<(&String, &ciborium::value::Value), ProtocolTestFailure> {\n    match key {\n        ciborium::value::Value::Text(key_str) => Ok((key_str, value)),\n        _ => Err(ProtocolTestFailure::InvalidBodyFormat {\n            expected: \"a text key as map entry\".to_string(),\n            found: format!(\"{key:?}\"),\n        }),\n    }\n}\n\nfn try_cbor_eq<T: AsRef<[u8]> + Debug>(\n    actual_body: T,\n    expected_body: &str,\n) -> Result<(), ProtocolTestFailure> {\n    let decoded = base64_simd::STANDARD\n        .decode_to_vec(expected_body)\n        .expect(\"smithy protocol test `body` property is not properly base64 encoded\");\n    let expected_cbor_value: ciborium::value::Value =\n        ciborium::de::from_reader(decoded.as_slice()).expect(\"expected value must be valid CBOR\");\n    let actual_cbor_value: ciborium::value::Value = ciborium::de::from_reader(actual_body.as_ref())\n        .map_err(|e| ProtocolTestFailure::InvalidBodyFormat {\n            expected: \"cbor\".to_owned(),\n            found: format!(\"{e} {actual_body:?}\"),\n        })?;\n    let actual_body_base64 = base64_simd::STANDARD.encode_to_string(&actual_body);\n\n    if !cbor_values_equal(&expected_cbor_value, &actual_cbor_value)? {\n        let expected_body_annotated_hex: String = cbor_diag::parse_bytes(&decoded)\n            .expect(\"smithy protocol test `body` property is not valid CBOR\")\n            .to_hex();\n        let expected_body_diag: String = cbor_diag::parse_bytes(&decoded)\n            .expect(\"smithy protocol test `body` property is not valid CBOR\")\n            .to_diag_pretty();\n        let actual_body_annotated_hex: String = cbor_diag::parse_bytes(&actual_body)\n            .expect(\"actual body is not valid CBOR\")\n            .to_hex();\n        let actual_body_diag: String = cbor_diag::parse_bytes(&actual_body)\n            .expect(\"actual body is not valid CBOR\")\n            .to_diag_pretty();\n\n        Err(ProtocolTestFailure::BodyDidNotMatch {\n            comparison: PrettyString(format!(\n                \"{}\",\n                Comparison::new(&expected_cbor_value, &actual_cbor_value)\n            )),\n            // The last newline is important because the panic message ends with a `.`\n            hint: format!(\n                \"expected body in diagnostic format:\n{expected_body_diag}\nactual body in diagnostic format:\n{actual_body_diag}\nexpected body in annotated hex:\n{expected_body_annotated_hex}\nactual body in annotated hex:\n{actual_body_annotated_hex}\nactual body in base64 (useful to update the protocol test):\n{actual_body_base64}\n\",\n            ),\n        })\n    } else {\n        Ok(())\n    }\n}\n\npub fn decode_body_data(body: &[u8], media_type: MediaType) -> Cow<'_, [u8]> {\n    match media_type {\n        MediaType::Cbor => Cow::Owned(\n            base64_simd::STANDARD\n                .decode_to_vec(body)\n                .expect(\"smithy protocol test `body` property is not properly base64 encoded\"),\n        ),\n        _ => Cow::Borrowed(body),\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use crate::{\n        forbid_headers, forbid_query_params, require_headers, require_query_params, validate_body,\n        validate_headers, validate_query_string, FloatEquals, MediaType, ProtocolTestFailure,\n    };\n    use aws_smithy_runtime_api::client::orchestrator::HttpRequest;\n    use aws_smithy_runtime_api::http::Headers;\n\n    fn make_request(uri: &str) -> HttpRequest {\n        let mut req = HttpRequest::empty();\n        req.set_uri(uri).unwrap();\n        req\n    }\n\n    #[test]\n    fn test_validate_empty_query_string() {\n        let request = HttpRequest::empty();\n        validate_query_string(&request, &[]).expect(\"no required params should pass\");\n        validate_query_string(&request, &[\"a\"]).expect_err(\"no params provided\");\n    }\n\n    #[test]\n    fn test_validate_query_string() {\n        let request = make_request(\"/foo?a=b&c&d=efg&hello=a%20b\");\n        validate_query_string(&request, &[\"a=b\"]).expect(\"a=b is in the query string\");\n        validate_query_string(&request, &[\"c\", \"a=b\"])\n            .expect(\"both params are in the query string\");\n        validate_query_string(&request, &[\"a=b\", \"c\", \"d=efg\", \"hello=a%20b\"])\n            .expect(\"all params are in the query string\");\n        validate_query_string(&request, &[]).expect(\"no required params should pass\");\n\n        validate_query_string(&request, &[\"a\"]).expect_err(\"no parameter should match\");\n        validate_query_string(&request, &[\"a=bc\"]).expect_err(\"no parameter should match\");\n        validate_query_string(&request, &[\"a=bc\"]).expect_err(\"no parameter should match\");\n        validate_query_string(&request, &[\"hell=a%20\"]).expect_err(\"no parameter should match\");\n    }\n\n    #[test]\n    fn test_forbid_query_param() {\n        let request = make_request(\"/foo?a=b&c&d=efg&hello=a%20b\");\n        forbid_query_params(&request, &[\"a\"]).expect_err(\"a is a query param\");\n        forbid_query_params(&request, &[\"not_included\"]).expect(\"query param not included\");\n        forbid_query_params(&request, &[\"a=b\"]).expect_err(\"if there is an `=`, match against KV\");\n        forbid_query_params(&request, &[\"c\"]).expect_err(\"c is a query param\");\n        forbid_query_params(&request, &[\"a=c\"]).expect(\"there is no a=c query param set\");\n    }\n\n    #[test]\n    fn test_require_query_param() {\n        let request = make_request(\"/foo?a=b&c&d=efg&hello=a%20b\");\n        require_query_params(&request, &[\"a\"]).expect(\"a is a query param\");\n        require_query_params(&request, &[\"not_included\"]).expect_err(\"query param not included\");\n        require_query_params(&request, &[\"a=b\"]).expect_err(\"should be matching against keys\");\n        require_query_params(&request, &[\"c\"]).expect(\"c is a query param\");\n    }\n\n    #[test]\n    fn test_validate_headers() {\n        let mut headers = Headers::new();\n        headers.append(\"x-foo\", \"foo\");\n        headers.append(\"x-foo-list\", \"foo\");\n        headers.append(\"x-foo-list\", \"bar\");\n        headers.append(\"x-inline\", \"inline, other\");\n\n        validate_headers(&headers, [(\"X-Foo\", \"foo\")]).expect(\"header present\");\n        validate_headers(&headers, [(\"X-Foo\", \"Foo\")]).expect_err(\"case sensitive\");\n        validate_headers(&headers, [(\"x-foo-list\", \"foo, bar\")]).expect(\"list concat\");\n        validate_headers(&headers, [(\"X-Foo-List\", \"foo\")])\n            .expect_err(\"all list members must be specified\");\n        validate_headers(&headers, [(\"X-Inline\", \"inline, other\")])\n            .expect(\"inline header lists also work\");\n        assert_eq!(\n            validate_headers(&headers, [(\"missing\", \"value\")]),\n            Err(ProtocolTestFailure::MissingHeader {\n                expected: \"missing\".to_owned()\n            })\n        );\n    }\n\n    #[test]\n    fn test_forbidden_headers() {\n        let mut headers = Headers::new();\n        headers.append(\"x-foo\", \"foo\");\n        assert_eq!(\n            forbid_headers(&headers, &[\"X-Foo\"]).expect_err(\"should be error\"),\n            ProtocolTestFailure::ForbiddenHeader {\n                forbidden: \"X-Foo\".to_string(),\n                found: \"X-Foo: foo\".to_string()\n            }\n        );\n        forbid_headers(&headers, &[\"X-Bar\"]).expect(\"header not present\");\n    }\n\n    #[test]\n    fn test_required_headers() {\n        let mut headers = Headers::new();\n        headers.append(\"x-foo\", \"foo\");\n        require_headers(&headers, &[\"X-Foo\"]).expect(\"header present\");\n        require_headers(&headers, &[\"X-Bar\"]).expect_err(\"header not present\");\n    }\n\n    #[test]\n    fn test_validate_json_body() {\n        let expected = r#\"{\"abc\": 5 }\"#;\n        let actual = r#\"   {\"abc\":   5 }\"#;\n        validate_body(actual, expected, MediaType::Json).expect(\"inputs matched as JSON\");\n\n        let expected = r#\"{\"abc\": 5 }\"#;\n        let actual = r#\"   {\"abc\":   6 }\"#;\n        validate_body(actual, expected, MediaType::Json).expect_err(\"bodies do not match\");\n    }\n\n    #[test]\n    fn test_validate_cbor_body() {\n        let base64_encode = |v: &[u8]| base64_simd::STANDARD.encode_to_string(v);\n\n        // The following is the CBOR representation of `{\"abc\": 5 }`.\n        let actual = [0xbf, 0x63, 0x61, 0x62, 0x63, 0x05, 0xff];\n        // The following is the base64-encoded CBOR representation of `{\"abc\": 5 }` using a definite length map.\n        let expected_base64 = base64_encode(&[0xA1, 0x63, 0x61, 0x62, 0x63, 0x05]);\n\n        validate_body(actual, expected_base64.as_str(), MediaType::Cbor)\n            .expect(\"unexpected mismatch between CBOR definite and indefinite map encodings\");\n\n        // The following is the CBOR representation of `{\"a\":1, \"b\":2}`.\n        let actual = [0xBF, 0x61, 0x61, 0x01, 0x61, 0x62, 0x02, 0xFF];\n        // The following is the base64-encoded CBOR representation of `{\"b\":2, \"a\":1}`.\n        let expected_base64 = base64_encode(&[0xBF, 0x61, 0x62, 0x02, 0x61, 0x61, 0x01, 0xFF]);\n        validate_body(actual, expected_base64.as_str(), MediaType::Cbor)\n            .expect(\"different ordering in CBOR decoded maps do not match\");\n\n        // The following is the CBOR representation of `{\"a\":[1,2,{\"b\":3, \"c\":4}]}`.\n        let actual = [\n            0xBF, 0x61, 0x61, 0x9F, 0x01, 0x02, 0xBF, 0x61, 0x62, 0x03, 0x61, 0x63, 0x04, 0xFF,\n            0xFF, 0xFF,\n        ];\n        // The following is the base64-encoded CBOR representation of `{\"a\":[1,2,{\"c\":4, \"b\":3}]}`.\n        let expected_base64 = base64_encode(&[\n            0xBF, 0x61, 0x61, 0x9F, 0x01, 0x02, 0xBF, 0x61, 0x63, 0x04, 0x61, 0x62, 0x03, 0xFF,\n            0xFF, 0xFF,\n        ]);\n        validate_body(actual, expected_base64.as_str(), MediaType::Cbor)\n            .expect(\"different ordering in CBOR decoded maps do not match\");\n\n        // The following is the CBOR representation of `{\"a\":[1,2]}`.\n        let actual = [0xBF, 0x61, 0x61, 0x9F, 0x01, 0x02, 0xFF, 0xFF];\n        // The following is the CBOR representation of `{\"a\":[2,1]}`.\n        let expected_base64 = base64_encode(&[0xBF, 0x61, 0x61, 0x9F, 0x02, 0x01, 0xFF, 0xFF]);\n        validate_body(actual, expected_base64.as_str(), MediaType::Cbor)\n            .expect_err(\"arrays in CBOR should follow strict ordering\");\n    }\n\n    #[test]\n    fn test_validate_xml_body() {\n        let expected = r#\"<a>\n        hello123\n        </a>\"#;\n        let actual = \"<a>hello123</a>\";\n        validate_body(actual, expected, MediaType::Xml).expect(\"inputs match as XML\");\n        let expected = r#\"<a>\n        hello123\n        </a>\"#;\n        let actual = \"<a>hello124</a>\";\n        validate_body(actual, expected, MediaType::Xml).expect_err(\"inputs are different\");\n    }\n\n    #[test]\n    fn test_validate_non_json_body() {\n        let expected = r#\"asdf\"#;\n        let actual = r#\"asdf \"#;\n        validate_body(actual, expected, MediaType::from(\"something/else\"))\n            .expect_err(\"bodies do not match\");\n\n        validate_body(expected, expected, MediaType::from(\"something/else\"))\n            .expect(\"inputs matched exactly\")\n    }\n\n    #[test]\n    #[cfg(feature = \"http-02x\")]\n    fn test_validate_headers_http0x() {\n        let request = http_0x::Request::builder()\n            .header(\"a\", \"b\")\n            .body(())\n            .unwrap();\n        validate_headers(request.headers(), [(\"a\", \"b\")]).unwrap()\n    }\n\n    #[test]\n    fn test_float_equals() {\n        let a = f64::NAN;\n        let b = f64::NAN;\n        assert_ne!(a, b);\n        assert!(a.float_equals(&b));\n        assert!(!a.float_equals(&5_f64));\n\n        assert!(5.0.float_equals(&5.0));\n        assert!(!5.0.float_equals(&5.1));\n\n        assert!(f64::INFINITY.float_equals(&f64::INFINITY));\n        assert!(!f64::INFINITY.float_equals(&f64::NEG_INFINITY));\n        assert!(f64::NEG_INFINITY.float_equals(&f64::NEG_INFINITY));\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-protocol-test/src/urlencoded.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::{pretty_comparison, ProtocolTestFailure};\nuse regex_lite::Regex;\n\nfn rewrite_url_encoded_map_keys(input: &str) -> (String, String) {\n    let mut itr = input.split('=');\n    let (key, value) = (itr.next().unwrap(), itr.next().unwrap());\n\n    let regex = Regex::new(r\"^(.+)\\.\\d+\\.(.+)$\").unwrap();\n    if let Some(captures) = regex.captures(key) {\n        let rewritten_key = format!(\n            \"{}.N.{}\",\n            captures.get(1).unwrap().as_str(),\n            captures.get(2).unwrap().as_str()\n        );\n        (rewritten_key, value.to_string())\n    } else {\n        (key.to_string(), value.to_string())\n    }\n}\n\nfn rewrite_url_encoded_body(input: &str) -> String {\n    let mut entries: Vec<(String, String)> = input\n        .split('&')\n        .map(|entry| entry.trim())\n        .filter(|s| !s.is_empty())\n        .map(rewrite_url_encoded_map_keys)\n        .collect();\n    if entries.len() > 2 {\n        entries[2..].sort_by(|a, b| a.1.cmp(&b.1));\n    }\n    let entries: Vec<String> = entries\n        .into_iter()\n        .map(|kv| format!(\"{}={}\", kv.0, kv.1))\n        .collect();\n    entries.join(\"\\n&\")\n}\n\npub(crate) fn try_url_encoded_form_equivalent(\n    expected: &str,\n    actual: &str,\n) -> Result<(), ProtocolTestFailure> {\n    let expected = rewrite_url_encoded_body(expected);\n    let actual = rewrite_url_encoded_body(actual);\n    if actual == expected {\n        Ok(())\n    } else {\n        Err(ProtocolTestFailure::BodyDidNotMatch {\n            comparison: pretty_comparison(&expected, &actual),\n            hint: \"\".into(),\n        })\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use crate::urlencoded::try_url_encoded_form_equivalent;\n\n    #[test]\n    fn test_url_encoded_form_equivalent() {\n        assert_eq!(\n            Ok(()),\n            try_url_encoded_form_equivalent(\n                \"Action=Something&Version=test\",\n                \"Action=Something&Version=test\",\n            )\n        );\n\n        assert!(try_url_encoded_form_equivalent(\n            \"Action=Something&Version=test&Property=bar\",\n            \"Action=Something&Version=test&Property=foo\",\n        )\n        .is_err());\n\n        assert!(try_url_encoded_form_equivalent(\n            \"Action=Something&Version=test&Property=foo\",\n            \"Action=Something&Version=test&WrongProperty=foo\",\n        )\n        .is_err());\n\n        assert_eq!(\n            Ok(()),\n            try_url_encoded_form_equivalent(\n                \"Action=Something&Version=test\\\n                &SomeMap.1.key=bar\\\n                &SomeMap.1.value=Bar\\\n                &SomeMap.2.key=foo\\\n                &SomeMap.2.value=Foo\",\n                \"Action=Something&Version=test\\\n                &SomeMap.1.key=foo\\\n                &SomeMap.1.value=Foo\\\n                &SomeMap.2.key=bar\\\n                &SomeMap.2.value=Bar\",\n            )\n        );\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-protocol-test/src/xml.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::{pretty_comparison, ProtocolTestFailure};\nuse roxmltree::{Node, NodeType};\nuse std::fmt::Write;\n\n/// Assert that two XML documents are equivalent\n///\n/// This will normalize documents and attempts to determine if it is OK to sort members or not by\n/// using a heuristic to determine if the tag represents a list (which should not be reordered)\npub(crate) fn try_xml_equivalent(expected: &str, actual: &str) -> Result<(), ProtocolTestFailure> {\n    if expected == actual {\n        return Ok(());\n    }\n    let norm_expected =\n        normalize_xml(expected).map_err(|e| ProtocolTestFailure::InvalidBodyFormat {\n            expected: \"expected document to be valid XML\".to_string(),\n            found: format!(\"{e}\"),\n        })?;\n    let norm_actual =\n        normalize_xml(actual).map_err(|e| ProtocolTestFailure::InvalidBodyFormat {\n            expected: \"actual document to be valid XML\".to_string(),\n            found: format!(\"{e}\\n{actual}\"),\n        })?;\n    if norm_expected == norm_actual {\n        Ok(())\n    } else {\n        Err(ProtocolTestFailure::BodyDidNotMatch {\n            comparison: pretty_comparison(&norm_expected, &norm_actual),\n            hint: \"\".to_string(),\n        })\n    }\n}\n\n/// Normalizes XML for comparison during Smithy Protocol tests\n///\n/// This will normalize documents and attempts to determine if it is OK to sort members or not by\n/// using a heuristic to determine if the tag represents a list (which should not be reordered)\npub(crate) fn normalize_xml(s: &str) -> Result<String, roxmltree::Error> {\n    let rotree = roxmltree::Document::parse(s)?;\n    let root = rotree.root().first_child().unwrap();\n    Ok(unparse_tag(root, 1))\n}\n\n/// Un-parse a \"tag\" (a subtree) of an XML document\n///\n/// This function will first convert each of the tag's children into a normalized string\n/// then, assuming the node does not represent a list, it will simply lexicographically sort the fully\n/// rendered nodes themselves (avoiding the need to sort on keys then values then attributes, etc.).\n///\n/// This is not a fast algorithm ;-), but the test data it's running on is not large.\nfn unparse_tag(tag: Node<'_, '_>, depth: usize) -> String {\n    let mut out = String::new();\n    out.push_str(&unparse_start_element(tag));\n    let mut child_nodes = tag\n        .children()\n        // flat_map over empty/ignored nodes\n        .flat_map(|node| unparse_node(node, depth + 1))\n        .collect::<Vec<_>>();\n    if !is_list(tag) {\n        child_nodes.sort();\n    }\n    for node in child_nodes {\n        out.push('\\n');\n        for _ in 0..depth {\n            out.push_str(\"  \");\n        }\n        out.push_str(&node)\n    }\n    out.push('\\n');\n    for _ in 0..depth - 1 {\n        out.push_str(\"  \");\n    }\n    write!(&mut out, \"</{}>\", tag.tag_name().name()).unwrap();\n    out\n}\n\n/// Convert a node into text recursively\n///\n/// If the node is a start element, it will recursively convert all of its children\n/// If the node is text, it will return the text, stripped of whitespace\n/// If the node is neither, it is ignored\nfn unparse_node(n: Node<'_, '_>, depth: usize) -> Option<String> {\n    match n.node_type() {\n        NodeType::Element => Some(unparse_tag(n, depth)),\n        NodeType::Text => {\n            let o = n.text().map(|t| t.trim().to_string())?;\n            if o.is_empty() {\n                None\n            } else {\n                Some(o)\n            }\n        }\n        _ => None,\n    }\n}\n\n/// Convert a node back into a string. Attributes are sorted by key, value, and namespace\n///\n/// Produces output like: `<a key=\"foo\">`\nfn unparse_start_element(n: Node<'_, '_>) -> String {\n    let mut out = String::new();\n    out.push('<');\n    out.push_str(n.tag_name().name());\n    for ns in n.namespaces() {\n        out.push_str(\" xmlns\");\n        if let Some(ns_name) = ns.name() {\n            write!(&mut out, \":{ns_name}\").unwrap();\n        }\n        write!(&mut out, \"={}\", ns.uri()).unwrap();\n    }\n    let mut attributes: Vec<_> = n.attributes().iter().collect();\n    attributes.sort_by_key(|attrib| (attrib.name(), attrib.value(), attrib.namespace()));\n    for attribute in attributes {\n        write!(&mut out, \" \").unwrap();\n        if let Some(ns) = attribute.namespace() {\n            write!(&mut out, \"{ns}:\").unwrap();\n        }\n        write!(&mut out, \"{}=\\\"{}\\\"\", attribute.name(), attribute.value()).unwrap();\n    }\n\n    out.push('>');\n    out\n}\n\nfn is_list(node: Node<'_, '_>) -> bool {\n    // a flat list looks like:\n    // <Foo>\n    //     <flat>example1</flat>\n    //     <flat>example2</flat>\n    //     <flat>example3</flat>\n    // </Foo>\n\n    // a regular list looks like:\n    // <values>\n    //     <Item>example1</Item>\n    //     <Item>example2</Item>\n    //     <Item>example3</Item>\n    // </values>\n\n    if !node.has_children() {\n        return false;\n    }\n\n    // in both of these cases, we don't want to reorder because list ordering is actually important\n    let all_children_elements =\n        non_empty_children(node).all(|child| child.node_type() == NodeType::Element);\n    let first_child = non_empty_children(node)\n        .next()\n        .expect(\"we know one child exists\");\n    let all_same_name =\n        non_empty_children(node).all(|child| child.tag_name() == first_child.tag_name());\n    let all_have_one_child =\n        non_empty_children(node).all(|child| non_empty_children(child).count() == 1);\n    all_children_elements && all_same_name && all_have_one_child\n}\n\n/// Children of `node` that are not whitespace text nodes\nfn non_empty_children<'a, 'input: 'a>(\n    node: Node<'a, 'input>,\n) -> impl Iterator<Item = Node<'a, 'input>> {\n    let single_child = node.children().count() == 1;\n    node.children()\n        .filter(move |c| single_child || !c.is_text() || !c.text().unwrap().trim().is_empty())\n}\n\n#[cfg(test)]\nmod test {\n    use crate::xml::{is_list, normalize_xml, try_xml_equivalent};\n    use pretty_assertions::{assert_eq, assert_ne};\n    use std::error::Error;\n\n    #[test]\n    fn normalize_field_order() -> Result<(), Box<dyn Error>> {\n        let d1 = r#\"<SimpleScalarPropertiesInputOutput xmlns=\"https://example.com\" test=\"test\" a=\"a\">\n        <stringValue>string</stringValue>\n            <trueBooleanValue>true</trueBooleanValue>\n            <falseBooleanValue>false</falseBooleanValue>\n            <Nested xmlns:xsi=\"https://example.com\" xsi:someName=\"nestedAttrValue\"><a></a></Nested>\n            </SimpleScalarPropertiesInputOutput>\"#;\n        let d2 = r#\"<SimpleScalarPropertiesInputOutput xmlns=\"https://example.com\" test=\"test\" a=\"a\">\n        <stringValue>string</stringValue>\n            <falseBooleanValue>false</falseBooleanValue>\n            <trueBooleanValue>true</trueBooleanValue>\n            <Nested xmlns:xsi=\"https://example.com\" xsi:someName=\"nestedAttrValue\"><a></a></Nested>\n            </SimpleScalarPropertiesInputOutput>\"#;\n        // sanity check ;-)\n        assert_ne!(d1, d2);\n        assert_eq!(normalize_xml(d1).unwrap(), normalize_xml(d2).unwrap());\n        Ok(())\n    }\n\n    #[test]\n    fn detect_lists() {\n        let d1 = r#\"<values>\n        <Item>example1</Item>\n        <Item>example2</Item>\n        <Item>example3</Item>\n    </values>\"#;\n\n        let rotree = roxmltree::Document::parse(d1).unwrap();\n        let root = rotree.root().first_child().unwrap();\n        assert!(is_list(root));\n    }\n\n    #[test]\n    fn dont_reorder_lists() {\n        let d1 = r#\"<Foo>\n    <values>\n        <Item>example1</Item>\n        <Item>example2</Item>\n        <Item>example3</Item>\n    </values>\n</Foo>\"#;\n        let d2 = r#\"<Foo>\n    <values>\n        <Item>example1</Item>\n        <Item>example3</Item>\n        <Item>example2</Item>\n    </values>\n</Foo>\"#;\n        try_xml_equivalent(d1, d2).expect_err(\"lists are out of order\");\n    }\n\n    #[test]\n    fn reorder_wrapped_maps() {\n        let d1 = r#\"<Foo>\n            <values>\n                <entry>\n                    <key>example-key1</key>\n                    <value>example1</value>\n                </entry>\n                <entry>\n                    <key>example-key2</key>\n                    <value>example2</value>\n                </entry>\n            </values>\n        </Foo>\"#;\n        let d2 = r#\"<Foo>\n            <values>\n                <entry>\n                    <key>example-key2</key>\n                    <value>example2</value>\n                </entry>\n                <entry>\n                    <key>example-key1</key>\n                    <value>example1</value>\n                </entry>\n            </values>\n        </Foo>\"#;\n        assert_eq!(normalize_xml(d1).unwrap(), normalize_xml(d2).unwrap());\n    }\n\n    #[test]\n    fn reorder_flat_maps() {\n        let d1 = r#\"\n        <Bar>\n            <flatMap>\n                <key>example-key1</key>\n                <value>example1</value>\n            </flatMap>\n            <flatMap>\n                <key>example-key2</key>\n                <value>example2</value>\n            </flatMap>\n            <flatMap>\n                <key>example-key3</key>\n                <value>example3</value>\n            </flatMap>\n        </Bar>\"#;\n        let d2 = r#\"\n        <Bar>\n            <flatMap>\n                <value>example1</value>\n                <key>example-key1</key>\n            </flatMap>\n            <flatMap>\n                <key>example-key3</key>\n                <value>example3</value>\n            </flatMap>\n            <flatMap>\n                <value>example2</value>\n                <key>example-key2</key>\n            </flatMap>\n        </Bar>\"#;\n        try_xml_equivalent(d1, d2).expect(\"XML is equivalent except for reordering\");\n    }\n\n    #[test]\n    fn normalize_self_closing_elements() {\n        try_xml_equivalent(\"<a/>\", \"<a></a>\").expect(\"xml was equivalent\");\n    }\n\n    #[test]\n    fn different_attributes_are_different() {\n        let d1 = r#\"<XmlAttributesInputOutput test=\"test\">\n                  <foo>hi</foo>\n              </XmlAttributesInputOutput>\"#;\n        let d2 = r#\"<XmlAttributesInputOutput test=\"other\">\n                  <foo>hi</foo>\n              </XmlAttributesInputOutput>\"#;\n        try_xml_equivalent(d1, d2).expect_err(\"differing attributes\");\n    }\n\n    #[test]\n    fn nested_namespaces() {\n        let d1 = r#\"<root xmlns=\"https://example.com/foo\">\n            <Nested xmlns:xsi=\"https://example2.com\" xsi:someName=\"nestedAttrValue\"></Nested>\n        </root>\"#;\n        let d2 = r#\"<root xmlns=\"https://example.com/foo\">\n            <Nested xmlns:xsi=\"https://example3.com\" xsi:someName=\"nestedAttrValue\"></Nested>\n        </root>\"#;\n        try_xml_equivalent(d1, d2).expect_err(\"namespaces differ\");\n    }\n\n    #[test]\n    fn namespace_with_prefix() {\n        let d1 = r#\"<PayloadWithXmlNamespaceAndPrefix xmlns:baz=\"http://foo.com\" />\"#;\n        let d2 = r#\"<PayloadWithXmlNamespaceAndPrefix xmlns:baz=\"http://foo.com\"></PayloadWithXmlNamespaceAndPrefix>\"#;\n        try_xml_equivalent(d1, d2).expect(\"match\")\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-query/Cargo.toml",
    "content": "[package]\nname = \"aws-smithy-query\"\nversion = \"0.60.15\"\nauthors = [\"AWS Rust SDK Team <aws-sdk-rust@amazon.com>\", \"John DiSanti <jdisanti@amazon.com>\"]\ndescription = \"AWSQuery and EC2Query Smithy protocol logic for smithy-rs.\"\nedition = \"2021\"\nlicense = \"Apache-2.0\"\nrepository = \"https://github.com/smithy-lang/smithy-rs\"\nrust-version = \"1.91.1\"\n\n[dependencies]\naws-smithy-types = { path = \"../aws-smithy-types\", features = [\"http-body-1-x\"] }\nurlencoding = \"2.1\"\n\n[package.metadata.docs.rs]\nall-features = true\ntargets = [\"x86_64-unknown-linux-gnu\"]\ncargo-args = [\"-Zunstable-options\", \"-Zrustdoc-scrape-examples\"]\nrustdoc-args = [\"--cfg\", \"docsrs\"]\n# End of docs.rs metadata\n"
  },
  {
    "path": "rust-runtime/aws-smithy-query/LICENSE",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n"
  },
  {
    "path": "rust-runtime/aws-smithy-query/README.md",
    "content": "# Serializers for AwsQuery\n\nThis crate implements utilities for serializing and deserializing\nthe [AWS Query](https://awslabs.github.io/smithy/1.0/spec/aws/aws-query-protocol.html) protocol.\n\n<!-- anchor_start:footer -->\nThis crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly.\n<!-- anchor_end:footer -->\n"
  },
  {
    "path": "rust-runtime/aws-smithy-query/external-types.toml",
    "content": "allowed_external_types = [\n    \"aws_smithy_types::*\",\n]\n"
  },
  {
    "path": "rust-runtime/aws-smithy-query/src/lib.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/* Automatically managed default lints */\n#![cfg_attr(docsrs, feature(doc_cfg))]\n/* End of automatically managed default lints */\n#![allow(clippy::derive_partial_eq_without_eq)]\n#![warn(\n    // missing_docs,\n    rustdoc::missing_crate_level_docs,\n    unreachable_pub,\n    rust_2018_idioms\n)]\n\n//! Abstractions for the Smithy AWS Query protocol\n\nuse aws_smithy_types::date_time::{DateTimeFormatError, Format};\nuse aws_smithy_types::primitive::Encoder;\nuse aws_smithy_types::{DateTime, Number};\nuse std::borrow::Cow;\nuse std::fmt::Write;\nuse urlencoding::encode;\n\npub struct QueryWriter<'a> {\n    output: &'a mut String,\n}\n\nimpl<'a> QueryWriter<'a> {\n    pub fn new(output: &'a mut String, action: &str, version: &str) -> Self {\n        output.push_str(\"Action=\");\n        output.push_str(&encode(action));\n        output.push_str(\"&Version=\");\n        output.push_str(&encode(version));\n        QueryWriter { output }\n    }\n\n    pub fn prefix(&mut self, prefix: &'a str) -> QueryValueWriter<'_> {\n        QueryValueWriter::new(self.output, Cow::Borrowed(prefix))\n    }\n\n    pub fn finish(self) {\n        // Calling this drops self\n    }\n}\n\n#[must_use]\npub struct QueryMapWriter<'a> {\n    output: &'a mut String,\n    prefix: Cow<'a, str>,\n    flatten: bool,\n    key_name: &'static str,\n    value_name: &'static str,\n    next_index: usize,\n}\n\nimpl<'a> QueryMapWriter<'a> {\n    fn new(\n        output: &'a mut String,\n        prefix: Cow<'a, str>,\n        flatten: bool,\n        key_name: &'static str,\n        value_name: &'static str,\n    ) -> QueryMapWriter<'a> {\n        QueryMapWriter {\n            prefix,\n            output,\n            flatten,\n            key_name,\n            value_name,\n            next_index: 1,\n        }\n    }\n\n    pub fn entry(&mut self, key: &str) -> QueryValueWriter<'_> {\n        let entry = if self.flatten { \"\" } else { \".entry\" };\n        write!(\n            &mut self.output,\n            \"&{}{}.{}.{}={}\",\n            self.prefix,\n            entry,\n            self.next_index,\n            self.key_name,\n            encode(key)\n        )\n        // The `Write` implementation for `String` is infallible,\n        // see https://doc.rust-lang.org/src/alloc/string.rs.html#2815\n        .unwrap();\n        let value_name = format!(\n            \"{}{}.{}.{}\",\n            self.prefix, entry, self.next_index, self.value_name\n        );\n\n        self.next_index += 1;\n        QueryValueWriter::new(self.output, Cow::Owned(value_name))\n    }\n\n    pub fn finish(self) {\n        // Calling this drops self\n    }\n}\n\n#[must_use]\npub struct QueryListWriter<'a> {\n    output: &'a mut String,\n    prefix: Cow<'a, str>,\n    flatten: bool,\n    member_override: Option<&'a str>,\n    next_index: usize,\n}\n\nimpl<'a> QueryListWriter<'a> {\n    fn new(\n        output: &'a mut String,\n        prefix: Cow<'a, str>,\n        flatten: bool,\n        member_override: Option<&'a str>,\n    ) -> QueryListWriter<'a> {\n        QueryListWriter {\n            prefix,\n            output,\n            flatten,\n            member_override,\n            next_index: 1,\n        }\n    }\n\n    pub fn entry(&mut self) -> QueryValueWriter<'_> {\n        let value_name = if self.flatten {\n            format!(\"{}.{}\", self.prefix, self.next_index)\n        } else if self.member_override.is_some() {\n            format!(\n                \"{}.{}.{}\",\n                self.prefix,\n                self.member_override.unwrap(),\n                self.next_index\n            )\n        } else {\n            format!(\"{}.member.{}\", self.prefix, self.next_index)\n        };\n\n        self.next_index += 1;\n        QueryValueWriter::new(self.output, Cow::Owned(value_name))\n    }\n\n    pub fn finish(self) {\n        // https://github.com/awslabs/smithy/commit/715b1d94ab14764ad43496b016b0c2e85bcf1d1f\n        // If the list was empty, just serialize the parameter name\n        if self.next_index == 1 {\n            QueryValueWriter::new(self.output, self.prefix).write_param_name();\n        }\n    }\n}\n\n#[must_use]\npub struct QueryValueWriter<'a> {\n    output: &'a mut String,\n    prefix: Cow<'a, str>,\n}\n\nimpl<'a> QueryValueWriter<'a> {\n    pub fn new(output: &'a mut String, prefix: Cow<'a, str>) -> QueryValueWriter<'a> {\n        QueryValueWriter { output, prefix }\n    }\n\n    /// Starts a new prefix.\n    pub fn prefix(&mut self, prefix: &'a str) -> QueryValueWriter<'_> {\n        QueryValueWriter::new(\n            self.output,\n            Cow::Owned(format!(\"{}.{}\", self.prefix, prefix)),\n        )\n    }\n\n    /// Writes the boolean `value`.\n    pub fn boolean(mut self, value: bool) {\n        self.write_param_name();\n        self.output.push_str(match value {\n            true => \"true\",\n            _ => \"false\",\n        });\n    }\n\n    /// Writes a string `value`.\n    pub fn string(mut self, value: &str) {\n        self.write_param_name();\n        self.output.push_str(&encode(value));\n    }\n\n    /// Writes a number `value`.\n    pub fn number(self, value: Number) {\n        match value {\n            Number::PosInt(value) => {\n                // itoa::Buffer is a fixed-size stack allocation, so this is cheap\n                self.string(Encoder::from(value).encode());\n            }\n            Number::NegInt(value) => {\n                self.string(Encoder::from(value).encode());\n            }\n            Number::Float(value) => self.string(Encoder::from(value).encode()),\n        }\n    }\n\n    /// Writes a date-time `value` with the given `format`.\n    pub fn date_time(\n        self,\n        date_time: &DateTime,\n        format: Format,\n    ) -> Result<(), DateTimeFormatError> {\n        self.string(&date_time.fmt(format)?);\n        Ok(())\n    }\n\n    /// Starts a map.\n    pub fn start_map(\n        self,\n        flat: bool,\n        key_name: &'static str,\n        value_name: &'static str,\n    ) -> QueryMapWriter<'a> {\n        QueryMapWriter::new(self.output, self.prefix, flat, key_name, value_name)\n    }\n\n    /// Starts a list.\n    pub fn start_list(self, flat: bool, member_override: Option<&'a str>) -> QueryListWriter<'a> {\n        QueryListWriter::new(self.output, self.prefix, flat, member_override)\n    }\n\n    fn write_param_name(&mut self) {\n        self.output.push('&');\n        self.output.push_str(&self.prefix);\n        self.output.push('=');\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use crate::QueryWriter;\n    use aws_smithy_types::date_time::Format;\n    use aws_smithy_types::{DateTime, Number};\n\n    #[test]\n    fn no_params() {\n        let mut out = String::new();\n        let writer = QueryWriter::new(&mut out, \"SomeAction\", \"1.0\");\n        writer.finish();\n        assert_eq!(\"Action=SomeAction&Version=1.0\", out);\n    }\n\n    #[test]\n    fn query_list_writer_empty_list() {\n        let mut out = String::new();\n        let mut writer = QueryWriter::new(&mut out, \"SomeAction\", \"1.0\");\n        writer.prefix(\"myList\").start_list(false, None).finish();\n        writer.finish();\n        assert_eq!(\"Action=SomeAction&Version=1.0&myList=\", out);\n    }\n\n    #[test]\n    fn maps() {\n        let mut out = String::new();\n        let mut writer = QueryWriter::new(&mut out, \"SomeAction\", \"1.0\");\n\n        let mut map = writer.prefix(\"MapArg\").start_map(false, \"key\", \"value\");\n        map.entry(\"bar\").string(\"Bar\");\n        map.entry(\"foo\").string(\"Foo\");\n        map.finish();\n\n        let mut map = writer\n            .prefix(\"Some.Flattened\")\n            .start_map(true, \"key\", \"value\");\n        map.entry(\"bar\").string(\"Bar\");\n        map.entry(\"foo\").string(\"Foo\");\n        map.finish();\n\n        let mut map = writer.prefix(\"RenamedKVs\").start_map(false, \"K\", \"V\");\n        map.entry(\"bar\").string(\"Bar\");\n        map.finish();\n\n        writer.finish();\n\n        assert_eq!(\n            \"Action=SomeAction\\\n            &Version=1.0\\\n            &MapArg.entry.1.key=bar\\\n            &MapArg.entry.1.value=Bar\\\n            &MapArg.entry.2.key=foo\\\n            &MapArg.entry.2.value=Foo\\\n            &Some.Flattened.1.key=bar\\\n            &Some.Flattened.1.value=Bar\\\n            &Some.Flattened.2.key=foo\\\n            &Some.Flattened.2.value=Foo\\\n            &RenamedKVs.entry.1.K=bar\\\n            &RenamedKVs.entry.1.V=Bar\\\n            \",\n            out\n        );\n    }\n\n    #[test]\n    fn lists() {\n        let mut out = String::new();\n        let mut writer = QueryWriter::new(&mut out, \"SomeAction\", \"1.0\");\n\n        let mut list = writer.prefix(\"ListArg\").start_list(false, None);\n        list.entry().string(\"foo\");\n        list.entry().string(\"bar\");\n        list.entry().string(\"baz\");\n        list.finish();\n\n        let mut list = writer.prefix(\"FlattenedListArg\").start_list(true, None);\n        list.entry().string(\"A\");\n        list.entry().string(\"B\");\n        list.finish();\n\n        let mut list = writer.prefix(\"ItemList\").start_list(false, Some(\"item\"));\n        list.entry().string(\"foo\");\n        list.entry().string(\"bar\");\n        list.finish();\n\n        writer.finish();\n\n        assert_eq!(\n            \"Action=SomeAction\\\n            &Version=1.0\\\n            &ListArg.member.1=foo\\\n            &ListArg.member.2=bar\\\n            &ListArg.member.3=baz\\\n            &FlattenedListArg.1=A\\\n            &FlattenedListArg.2=B\\\n            &ItemList.item.1=foo\\\n            &ItemList.item.2=bar\\\n            \",\n            out\n        );\n    }\n\n    #[test]\n    fn prefixes() {\n        let mut out = String::new();\n        let mut writer = QueryWriter::new(&mut out, \"SomeAction\", \"1.0\");\n\n        let mut first = writer.prefix(\"first\");\n        let second = first.prefix(\"second\");\n        second.string(\"second_val\");\n        first.string(\"first_val\");\n\n        writer.finish();\n\n        assert_eq!(\n            \"Action=SomeAction\\\n            &Version=1.0\\\n            &first.second=second_val\\\n            &first=first_val\\\n            \",\n            out\n        );\n    }\n\n    #[test]\n    fn timestamps() {\n        let mut out = String::new();\n        let mut writer = QueryWriter::new(&mut out, \"SomeAction\", \"1.0\");\n\n        writer\n            .prefix(\"epoch_seconds\")\n            .date_time(&DateTime::from_secs_f64(5.2), Format::EpochSeconds)\n            .unwrap();\n        writer\n            .prefix(\"date_time\")\n            .date_time(\n                &DateTime::from_str(\"2021-05-24T15:34:50.123Z\", Format::DateTime).unwrap(),\n                Format::DateTime,\n            )\n            .unwrap();\n        writer\n            .prefix(\"http_date\")\n            .date_time(\n                &DateTime::from_str(\"Wed, 21 Oct 2015 07:28:00 GMT\", Format::HttpDate).unwrap(),\n                Format::HttpDate,\n            )\n            .unwrap();\n        writer.finish();\n\n        assert_eq!(\n            \"Action=SomeAction\\\n            &Version=1.0\\\n            &epoch_seconds=5.2\\\n            &date_time=2021-05-24T15%3A34%3A50.123Z\\\n            &http_date=Wed%2C%2021%20Oct%202015%2007%3A28%3A00%20GMT\\\n            \",\n            out\n        );\n    }\n\n    #[test]\n    fn numbers() {\n        let mut out = String::new();\n        let mut writer = QueryWriter::new(&mut out, \"SomeAction\", \"1.0\");\n\n        writer.prefix(\"PosInt\").number(Number::PosInt(5));\n        writer.prefix(\"NegInt\").number(Number::NegInt(-5));\n        writer\n            .prefix(\"Infinity\")\n            .number(Number::Float(f64::INFINITY));\n        writer\n            .prefix(\"NegInfinity\")\n            .number(Number::Float(f64::NEG_INFINITY));\n        writer.prefix(\"NaN\").number(Number::Float(f64::NAN));\n        writer.prefix(\"Floating\").number(Number::Float(5.2));\n        writer.finish();\n\n        assert_eq!(\n            \"Action=SomeAction\\\n            &Version=1.0\\\n            &PosInt=5\\\n            &NegInt=-5\\\n            &Infinity=Infinity\\\n            &NegInfinity=-Infinity\\\n            &NaN=NaN\\\n            &Floating=5.2\\\n            \",\n            out\n        );\n    }\n\n    #[test]\n    fn booleans() {\n        let mut out = String::new();\n        let mut writer = QueryWriter::new(&mut out, \"SomeAction\", \"1.0\");\n\n        writer.prefix(\"IsTrue\").boolean(true);\n        writer.prefix(\"IsFalse\").boolean(false);\n        writer.finish();\n\n        assert_eq!(\n            \"Action=SomeAction\\\n            &Version=1.0\\\n            &IsTrue=true\\\n            &IsFalse=false\\\n            \",\n            out\n        );\n    }\n\n    #[test]\n    fn action_version_escaping() {\n        let mut out = String::new();\n        QueryWriter::new(&mut out, \"Some Action\", \"1 2\").finish();\n        assert_eq!(\"Action=Some%20Action&Version=1%202\", out);\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime/Cargo.toml",
    "content": "[package]\nname = \"aws-smithy-runtime\"\nversion = \"1.11.1\"\nauthors = [\"AWS Rust SDK Team <aws-sdk-rust@amazon.com>\", \"Zelda Hessler <zhessler@amazon.com>\"]\ndescription = \"The new smithy runtime crate\"\nedition = \"2021\"\nlicense = \"Apache-2.0\"\nrepository = \"https://github.com/smithy-lang/smithy-rs\"\nrust-version = \"1.91.1\"\n\n# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html\n\n# TODO(hyper1) - deprecate legacy hyper and http testing features when available in cargo: https://github.com/rust-lang/cargo/issues/7130\n[features]\nclient = [\"aws-smithy-runtime-api/client\", \"aws-smithy-types/http-body-1-x\"]\nhttp-auth = [\"aws-smithy-runtime-api/http-auth\"]\n# NOTE: connector-hyper-0-14-x and tls-rustls are \"legacy\" features related to default HTTP client based on hyper 0.14.x ecosystem\nconnector-hyper-0-14-x = [\"dep:aws-smithy-http-client\", \"aws-smithy-http-client?/hyper-014\"]\ntls-rustls = [\"dep:aws-smithy-http-client\", \"aws-smithy-http-client?/legacy-rustls-ring\", \"connector-hyper-0-14-x\"]\ndefault-https-client = [\"dep:aws-smithy-http-client\", \"aws-smithy-http-client?/rustls-aws-lc\"]\nrt-tokio = [\"tokio/rt\"]\n\n# Features for testing\n# NOTE: `test-util` originally enabled the HTTP related test utils which have since been relocated to `aws-smithy-http-client`\n# and updated to work with the 1.x HTTP/hyper ecosystem. Prefer using the `test-util` and `wire-mock` features from\n# `aws-smithy-http-client` directly instead for HTTP test utils.\ntest-util = [\n    \"aws-smithy-runtime-api/test-util\",\n    \"dep:tracing-subscriber\",\n    \"aws-smithy-http-client/test-util\",\n    # TODO(hyper1): Feature remains in place for backwards compat but in a future release we will break this flag and disable legacy HTTP test utils\n    \"legacy-test-util\",\n]\n\nlegacy-test-util = [\n    # non HTTP test utils\n    \"aws-smithy-runtime-api/test-util\",\n    \"dep:tracing-subscriber\",\n    \"aws-smithy-http-client/test-util\",\n    # legacy http test utils\n    \"connector-hyper-0-14-x\",\n    \"aws-smithy-http-client/legacy-test-util\",\n]\n\nwire-mock = [\"legacy-test-util\", \"aws-smithy-http-client/wire-mock\"]\n\n[dependencies]\naws-smithy-async = { path = \"../aws-smithy-async\" }\naws-smithy-http = { path = \"../aws-smithy-http\" }\naws-smithy-observability = { path = \"../aws-smithy-observability\" }\naws-smithy-runtime-api = { path = \"../aws-smithy-runtime-api\" }\naws-smithy-types = { path = \"../aws-smithy-types\", features = [\"http-body-0-4-x\"] }\naws-smithy-http-client = { path = \"../aws-smithy-http-client\", optional = true }\nbytes = \"1.11.1\"\n# Make sure to update `fastrand` in [dev-dependencies] if we bump the major version\n# We probably need to update unit tests using the `fastrand` crate when that happens\nfastrand = \"2.3.0\"\nhttp-02x = { package = \"http\", version = \"0.2.12\" }\nhttp-1x = { package = \"http\", version = \"1.3.1\" }\nhttp-body-04x = { package = \"http-body\", version = \"0.4.6\" }\nhttp-body-1x = { package = \"http-body\", version = \"1.0.1\" }\nhttp-body-util = \"0.1.3\"\n# This avoids bringing `httparse` 1.9.0 and 1.9.1 through `hyper-0-14` that break unit tests of runtime crates\n#httparse = \"1.8.0\"\npin-project-lite = \"0.2.14\"\npin-utils = \"0.1.0\"\ntokio = { version = \"1.49.0\", features = [] }\ntracing = \"0.1.44\"\ntracing-subscriber = { version = \"0.3.22\", optional = true, features = [\"env-filter\", \"fmt\", \"json\"] }\n\n[dev-dependencies]\napprox = \"0.5.1\"\naws-smithy-async = { path = \"../aws-smithy-async\", features = [\"rt-tokio\", \"test-util\"] }\naws-smithy-runtime-api = { path = \"../aws-smithy-runtime-api\", features = [\"test-util\"] }\naws-smithy-types = { path = \"../aws-smithy-types\", features = [\"test-util\"] }\n# Allow only patch-level bumps since major-level or minor-level bumps can cause seed-value-breaking changes\n# https://github.com/smol-rs/fastrand/issues/20\nfastrand = \"2.3.0\"\nfutures-util = \"0.3.29\"\npretty_assertions = \"1.4.0\"\ntokio = { version = \"1.49.0\", features = [\"macros\", \"rt\", \"rt-multi-thread\", \"test-util\", \"full\"] }\ntracing-subscriber = { version = \"0.3.22\", features = [\"env-filter\"] }\ntracing-test = \"0.2.1\"\n# FIXME - migrate to hyper-1\nhyper_0_14 = { package = \"hyper\", version = \"0.14.27\", features = [\"client\", \"server\", \"tcp\", \"http1\", \"http2\"] }\n\n[package.metadata.docs.rs]\nall-features = true\ntargets = [\"x86_64-unknown-linux-gnu\"]\ncargo-args = [\"-Zunstable-options\", \"-Zrustdoc-scrape-examples\"]\nrustdoc-args = [\"--cfg\", \"docsrs\"]\n# End of docs.rs metadata\n\n[package.metadata.smithy-rs-release-tooling]\nstable = true\n\n# aws-smithy-http is used by the http-auth feature, which is not turned on by the SDK at all.\n# Without ignoring it, the `check-aws-sdk-smoketest-docs-clippy-udeps` CI script fails.\n[package.metadata.cargo-udeps.ignore]\nnormal = [\"aws-smithy-http\"]\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime/LICENSE",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime/README.md",
    "content": "# aws-smithy-runtime\n\nRuntime support logic and types for smithy-rs generated code.\n\n<!-- anchor_start:footer -->\nThis crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly.\n<!-- anchor_end:footer -->\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime/additional-ci",
    "content": "#!/bin/bash\n#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\n\n# This script contains additional CI checks to run for this specific package\n\nset -e\n\necho \"### Testing every combination of features (excluding --all-features)\"\n# Skip deprecated features that are re-exported from `aws-smithy-http-client` (and tested there already)\ncargo hack test --feature-powerset --exclude-all-features --exclude-features legacy-test-util,wire-mock,connector-hyper-0-14-x,tls-rustls\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime/external-types.toml",
    "content": "allowed_external_types = [\n    \"aws_smithy_runtime_api::*\",\n    \"aws_smithy_async::*\",\n    \"aws_smithy_types::*\",\n\n    # Used for creating hyper connectors in the hyper feature and test-util features\n    \"tower_service::Service\",\n\n    # TODO(https://github.com/smithy-lang/smithy-rs/issues/1193): Once tooling permits it, only allow the following types in the `test-util` feature\n    \"bytes::bytes::Bytes\",\n    \"serde::ser::Serialize\",\n    \"serde::de::Deserialize\",\n    \"hyper::client::connect::dns::Name\",\n    # used by dvr\n    \"http::request::Request\",\n    \"http::response::Response\",\n    \"http::uri::Uri\",\n\n\n\n    # TODO(https://github.com/smithy-lang/smithy-rs/issues/1193): Once tooling permits it, only allow the following types in the `connector-hyper-0-14-x` feature\n    \"hyper::client::client::Builder\",\n    \"hyper::client::connect::Connection\",\n    \"tokio::io::async_read::AsyncRead\",\n    \"tokio::io::async_write::AsyncWrite\",\n    \"aws_smithy_http_client::hyper_014\",\n    \"aws_smithy_http_client::test_util::*\",\n    \"aws_smithy_http_client::ev\",\n    \"aws_smithy_http_client::match_events\",\n    \"aws_smithy_http_client::matcher\",\n\n    # TODO(https://github.com/smithy-lang/smithy-rs/issues/1193): Once tooling permits it, only allow the following types in the `http-0-x` feature\n    \"http_body::Body\"\n]\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime/src/client/auth/http.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Auth scheme implementations for HTTP API Key, Basic Auth, Bearer Token, and Digest auth.\n\nuse aws_smithy_http::query_writer::QueryWriter;\nuse aws_smithy_runtime_api::box_error::BoxError;\nuse aws_smithy_runtime_api::client::auth::http::{\n    HTTP_API_KEY_AUTH_SCHEME_ID, HTTP_BASIC_AUTH_SCHEME_ID, HTTP_BEARER_AUTH_SCHEME_ID,\n    HTTP_DIGEST_AUTH_SCHEME_ID,\n};\nuse aws_smithy_runtime_api::client::auth::{\n    AuthScheme, AuthSchemeEndpointConfig, AuthSchemeId, Sign,\n};\nuse aws_smithy_runtime_api::client::identity::http::{Login, Token};\nuse aws_smithy_runtime_api::client::identity::{Identity, SharedIdentityResolver};\nuse aws_smithy_runtime_api::client::orchestrator::HttpRequest;\nuse aws_smithy_runtime_api::client::runtime_components::{GetIdentityResolver, RuntimeComponents};\nuse aws_smithy_types::base64::encode;\nuse aws_smithy_types::config_bag::ConfigBag;\n\n/// Destination for the API key\n#[derive(Copy, Clone, Debug)]\npub enum ApiKeyLocation {\n    /// Place the API key in the URL query parameters\n    Query,\n    /// Place the API key in the request headers\n    Header,\n}\n\n/// Auth implementation for Smithy's `@httpApiKey` auth scheme\n#[derive(Debug)]\npub struct ApiKeyAuthScheme {\n    signer: ApiKeySigner,\n}\n\nimpl ApiKeyAuthScheme {\n    /// Creates a new `ApiKeyAuthScheme`.\n    pub fn new(\n        scheme: impl Into<String>,\n        location: ApiKeyLocation,\n        name: impl Into<String>,\n    ) -> Self {\n        Self {\n            signer: ApiKeySigner {\n                scheme: scheme.into(),\n                location,\n                name: name.into(),\n            },\n        }\n    }\n}\n\nimpl AuthScheme for ApiKeyAuthScheme {\n    fn scheme_id(&self) -> AuthSchemeId {\n        HTTP_API_KEY_AUTH_SCHEME_ID\n    }\n\n    fn identity_resolver(\n        &self,\n        identity_resolvers: &dyn GetIdentityResolver,\n    ) -> Option<SharedIdentityResolver> {\n        identity_resolvers.identity_resolver(self.scheme_id())\n    }\n\n    fn signer(&self) -> &dyn Sign {\n        &self.signer\n    }\n}\n\n#[derive(Debug)]\nstruct ApiKeySigner {\n    scheme: String,\n    location: ApiKeyLocation,\n    name: String,\n}\n\nimpl Sign for ApiKeySigner {\n    fn sign_http_request(\n        &self,\n        request: &mut HttpRequest,\n        identity: &Identity,\n        _auth_scheme_endpoint_config: AuthSchemeEndpointConfig<'_>,\n        _runtime_components: &RuntimeComponents,\n        _config_bag: &ConfigBag,\n    ) -> Result<(), BoxError> {\n        let api_key = identity\n            .data::<Token>()\n            .ok_or(\"HTTP ApiKey auth requires a `Token` identity\")?;\n        match self.location {\n            ApiKeyLocation::Header => {\n                request\n                    .headers_mut()\n                    .try_append(\n                        self.name.to_ascii_lowercase(),\n                        format!(\"{} {}\", self.scheme, api_key.token()),\n                    )\n                    .map_err(|_| {\n                        \"API key contains characters that can't be included in a HTTP header\"\n                    })?;\n            }\n            ApiKeyLocation::Query => {\n                let mut query = QueryWriter::new_from_string(request.uri())?;\n                query.insert(&self.name, api_key.token());\n                request\n                    .set_uri(query.build_uri().to_string())\n                    .expect(\"query writer returns a valid URI\")\n            }\n        }\n\n        Ok(())\n    }\n}\n\n/// Auth implementation for Smithy's `@httpBasicAuth` auth scheme\n#[derive(Debug, Default)]\npub struct BasicAuthScheme {\n    signer: BasicAuthSigner,\n}\n\nimpl BasicAuthScheme {\n    /// Creates a new `BasicAuthScheme`.\n    pub fn new() -> Self {\n        Self {\n            signer: BasicAuthSigner,\n        }\n    }\n}\n\nimpl AuthScheme for BasicAuthScheme {\n    fn scheme_id(&self) -> AuthSchemeId {\n        HTTP_BASIC_AUTH_SCHEME_ID\n    }\n\n    fn identity_resolver(\n        &self,\n        identity_resolvers: &dyn GetIdentityResolver,\n    ) -> Option<SharedIdentityResolver> {\n        identity_resolvers.identity_resolver(self.scheme_id())\n    }\n\n    fn signer(&self) -> &dyn Sign {\n        &self.signer\n    }\n}\n\n#[derive(Debug, Default)]\nstruct BasicAuthSigner;\n\nimpl Sign for BasicAuthSigner {\n    fn sign_http_request(\n        &self,\n        request: &mut HttpRequest,\n        identity: &Identity,\n        _auth_scheme_endpoint_config: AuthSchemeEndpointConfig<'_>,\n        _runtime_components: &RuntimeComponents,\n        _config_bag: &ConfigBag,\n    ) -> Result<(), BoxError> {\n        let login = identity\n            .data::<Login>()\n            .ok_or(\"HTTP basic auth requires a `Login` identity\")?;\n        request.headers_mut().insert(\n            http_1x::header::AUTHORIZATION,\n            http_1x::HeaderValue::from_str(&format!(\n                \"Basic {}\",\n                encode(format!(\"{}:{}\", login.user(), login.password()))\n            ))\n            .expect(\"valid header value\"),\n        );\n        Ok(())\n    }\n}\n\n/// Auth implementation for Smithy's `@httpBearerAuth` auth scheme\n#[derive(Debug, Default)]\npub struct BearerAuthScheme {\n    signer: BearerAuthSigner,\n}\n\nimpl BearerAuthScheme {\n    /// Creates a new `BearerAuthScheme`.\n    pub fn new() -> Self {\n        Self {\n            signer: BearerAuthSigner,\n        }\n    }\n}\n\nimpl AuthScheme for BearerAuthScheme {\n    fn scheme_id(&self) -> AuthSchemeId {\n        HTTP_BEARER_AUTH_SCHEME_ID\n    }\n\n    fn identity_resolver(\n        &self,\n        identity_resolvers: &dyn GetIdentityResolver,\n    ) -> Option<SharedIdentityResolver> {\n        identity_resolvers.identity_resolver(self.scheme_id())\n    }\n\n    fn signer(&self) -> &dyn Sign {\n        &self.signer\n    }\n}\n\n#[derive(Debug, Default)]\nstruct BearerAuthSigner;\n\nimpl Sign for BearerAuthSigner {\n    fn sign_http_request(\n        &self,\n        request: &mut HttpRequest,\n        identity: &Identity,\n        _auth_scheme_endpoint_config: AuthSchemeEndpointConfig<'_>,\n        _runtime_components: &RuntimeComponents,\n        _config_bag: &ConfigBag,\n    ) -> Result<(), BoxError> {\n        let token = identity\n            .data::<Token>()\n            .ok_or(\"HTTP bearer auth requires a `Token` identity\")?;\n        request.headers_mut().insert(\n            http_1x::header::AUTHORIZATION,\n            http_1x::HeaderValue::from_str(&format!(\"Bearer {}\", token.token())).map_err(|_| {\n                \"Bearer token contains characters that can't be included in a HTTP header\"\n            })?,\n        );\n        Ok(())\n    }\n}\n\n/// Auth implementation for Smithy's `@httpDigestAuth` auth scheme\n#[derive(Debug, Default)]\npub struct DigestAuthScheme {\n    signer: DigestAuthSigner,\n}\n\nimpl DigestAuthScheme {\n    /// Creates a new `DigestAuthScheme`.\n    pub fn new() -> Self {\n        Self {\n            signer: DigestAuthSigner,\n        }\n    }\n}\n\nimpl AuthScheme for DigestAuthScheme {\n    fn scheme_id(&self) -> AuthSchemeId {\n        HTTP_DIGEST_AUTH_SCHEME_ID\n    }\n\n    fn identity_resolver(\n        &self,\n        identity_resolvers: &dyn GetIdentityResolver,\n    ) -> Option<SharedIdentityResolver> {\n        identity_resolvers.identity_resolver(self.scheme_id())\n    }\n\n    fn signer(&self) -> &dyn Sign {\n        &self.signer\n    }\n}\n\n#[derive(Debug, Default)]\nstruct DigestAuthSigner;\n\nimpl Sign for DigestAuthSigner {\n    fn sign_http_request(\n        &self,\n        _request: &mut HttpRequest,\n        _identity: &Identity,\n        _auth_scheme_endpoint_config: AuthSchemeEndpointConfig<'_>,\n        _runtime_components: &RuntimeComponents,\n        _config_bag: &ConfigBag,\n    ) -> Result<(), BoxError> {\n        unimplemented!(\n            \"support for signing with Smithy's `@httpDigestAuth` auth scheme is not implemented yet\"\n        )\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use aws_smithy_runtime_api::client::identity::http::Login;\n    use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder;\n    use aws_smithy_types::body::SdkBody;\n\n    #[test]\n    fn test_api_key_signing_headers() {\n        let signer = ApiKeySigner {\n            scheme: \"SomeSchemeName\".into(),\n            location: ApiKeyLocation::Header,\n            name: \"some-header-name\".into(),\n        };\n        let runtime_components = RuntimeComponentsBuilder::for_tests().build().unwrap();\n        let config_bag = ConfigBag::base();\n        let identity = Identity::new(Token::new(\"some-token\", None), None);\n        let mut request: HttpRequest = http_1x::Request::builder()\n            .uri(\"http://example.com/Foobaz\")\n            .body(SdkBody::empty())\n            .unwrap()\n            .try_into()\n            .unwrap();\n        signer\n            .sign_http_request(\n                &mut request,\n                &identity,\n                AuthSchemeEndpointConfig::empty(),\n                &runtime_components,\n                &config_bag,\n            )\n            .expect(\"success\");\n        assert_eq!(\n            \"SomeSchemeName some-token\",\n            request.headers().get(\"some-header-name\").unwrap()\n        );\n        assert_eq!(\"http://example.com/Foobaz\", request.uri().to_string());\n    }\n\n    #[test]\n    fn test_api_key_signing_query() {\n        let signer = ApiKeySigner {\n            scheme: \"\".into(),\n            location: ApiKeyLocation::Query,\n            name: \"some-query-name\".into(),\n        };\n        let runtime_components = RuntimeComponentsBuilder::for_tests().build().unwrap();\n        let config_bag = ConfigBag::base();\n        let identity = Identity::new(Token::new(\"some-token\", None), None);\n        let mut request: HttpRequest = http_1x::Request::builder()\n            .uri(\"http://example.com/Foobaz\")\n            .body(SdkBody::empty())\n            .unwrap()\n            .try_into()\n            .unwrap();\n        signer\n            .sign_http_request(\n                &mut request,\n                &identity,\n                AuthSchemeEndpointConfig::empty(),\n                &runtime_components,\n                &config_bag,\n            )\n            .expect(\"success\");\n        assert!(request.headers().get(\"some-query-name\").is_none());\n        assert_eq!(\n            \"http://example.com/Foobaz?some-query-name=some-token\",\n            request.uri().to_string()\n        );\n    }\n\n    #[test]\n    fn test_basic_auth() {\n        let signer = BasicAuthSigner;\n        let runtime_components = RuntimeComponentsBuilder::for_tests().build().unwrap();\n        let config_bag = ConfigBag::base();\n        let identity = Identity::new(Login::new(\"Aladdin\", \"open sesame\", None), None);\n        let mut request = http_1x::Request::builder()\n            .body(SdkBody::empty())\n            .unwrap()\n            .try_into()\n            .unwrap();\n\n        signer\n            .sign_http_request(\n                &mut request,\n                &identity,\n                AuthSchemeEndpointConfig::empty(),\n                &runtime_components,\n                &config_bag,\n            )\n            .expect(\"success\");\n        assert_eq!(\n            \"Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==\",\n            request.headers().get(\"Authorization\").unwrap()\n        );\n    }\n\n    #[test]\n    fn test_bearer_auth() {\n        let signer = BearerAuthSigner;\n\n        let config_bag = ConfigBag::base();\n        let runtime_components = RuntimeComponentsBuilder::for_tests().build().unwrap();\n        let identity = Identity::new(Token::new(\"some-token\", None), None);\n        let mut request = http_1x::Request::builder()\n            .body(SdkBody::empty())\n            .unwrap()\n            .try_into()\n            .unwrap();\n        signer\n            .sign_http_request(\n                &mut request,\n                &identity,\n                AuthSchemeEndpointConfig::empty(),\n                &runtime_components,\n                &config_bag,\n            )\n            .expect(\"success\");\n        assert_eq!(\n            \"Bearer some-token\",\n            request.headers().get(\"Authorization\").unwrap()\n        );\n    }\n\n    #[test]\n    fn test_bearer_auth_overwrite_existing_header() {\n        let signer = BearerAuthSigner;\n\n        let config_bag = ConfigBag::base();\n        let runtime_components = RuntimeComponentsBuilder::for_tests().build().unwrap();\n        let identity = Identity::new(Token::new(\"some-token\", None), None);\n        let mut request = http_1x::Request::builder()\n            .header(\"Authorization\", \"wrong\")\n            .body(SdkBody::empty())\n            .unwrap()\n            .try_into()\n            .unwrap();\n        signer\n            .sign_http_request(\n                &mut request,\n                &identity,\n                AuthSchemeEndpointConfig::empty(),\n                &runtime_components,\n                &config_bag,\n            )\n            .expect(\"success\");\n        assert_eq!(\n            \"Bearer some-token\",\n            request.headers().get(\"Authorization\").unwrap()\n        );\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime/src/client/auth/no_auth.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! The [`NoAuthRuntimePlugin`] and supporting code.\n\nuse crate::client::identity::no_auth::NoAuthIdentityResolver;\nuse aws_smithy_runtime_api::box_error::BoxError;\nuse aws_smithy_runtime_api::client::auth::static_resolver::StaticAuthSchemeOptionResolver;\nuse aws_smithy_runtime_api::client::auth::{\n    AuthScheme, AuthSchemeEndpointConfig, AuthSchemeId, AuthSchemeOption,\n    AuthSchemeOptionResolverParams, AuthSchemeOptionsFuture, ResolveAuthSchemeOptions,\n    SharedAuthScheme, SharedAuthSchemeOptionResolver, Sign,\n};\nuse aws_smithy_runtime_api::client::identity::{Identity, SharedIdentityResolver};\nuse aws_smithy_runtime_api::client::orchestrator::HttpRequest;\nuse aws_smithy_runtime_api::client::runtime_components::{\n    GetIdentityResolver, RuntimeComponents, RuntimeComponentsBuilder,\n};\nuse aws_smithy_runtime_api::client::runtime_plugin::{Order, RuntimePlugin};\nuse aws_smithy_runtime_api::shared::IntoShared;\nuse aws_smithy_types::config_bag::ConfigBag;\nuse std::borrow::Cow;\n\n/// Auth scheme ID for \"no auth\".\npub const NO_AUTH_SCHEME_ID: AuthSchemeId = AuthSchemeId::new(\"noAuth\");\n\n/// A [`RuntimePlugin`] that registers a \"no auth\" identity resolver and auth scheme.\n///\n/// This plugin can be used to disable authentication in certain cases, such as when there is\n/// a Smithy `@optionalAuth` trait.\n///\n/// Note: This plugin does not work out of the box because it does not configure an auth scheme option resolver\n/// that recognizes the `noAuth` scheme.\n#[doc(hidden)]\n#[non_exhaustive]\n#[derive(Debug)]\n#[deprecated(since = \"1.9.8\", note = \"Use `NoAuthRuntimePluginV2` instead\")]\npub struct NoAuthRuntimePlugin(RuntimeComponentsBuilder);\n\n#[allow(deprecated)]\nimpl Default for NoAuthRuntimePlugin {\n    fn default() -> Self {\n        Self::new()\n    }\n}\n\n#[allow(deprecated)]\nimpl NoAuthRuntimePlugin {\n    /// Creates a new `NoAuthRuntimePlugin`.\n    pub fn new() -> Self {\n        Self(\n            RuntimeComponentsBuilder::new(\"NoAuthRuntimePlugin\")\n                .with_identity_resolver(\n                    NO_AUTH_SCHEME_ID,\n                    SharedIdentityResolver::new(NoAuthIdentityResolver::new()),\n                )\n                .with_auth_scheme(SharedAuthScheme::new(NoAuthScheme::new())),\n        )\n    }\n}\n\n#[allow(deprecated)]\nimpl RuntimePlugin for NoAuthRuntimePlugin {\n    fn runtime_components(\n        &self,\n        _: &RuntimeComponentsBuilder,\n    ) -> Cow<'_, RuntimeComponentsBuilder> {\n        Cow::Borrowed(&self.0)\n    }\n}\n\n/// A [`RuntimePlugin`] that registers a \"no auth\" identity resolver, auth scheme, and auth scheme option resolver.\n///\n/// Ideally, a Smithy model should use `@optionalAuth` or `@auth([])` on operations so that:\n/// - The Smithy runtime supports the no-auth scheme\n/// - The code-generated default auth scheme option resolver includes the no-auth scheme for those operations\n///\n/// When that is not possible, this plugin can be used to achieve the same effect.\n#[derive(Debug)]\npub struct NoAuthRuntimePluginV2(RuntimeComponentsBuilder);\n\nimpl Default for NoAuthRuntimePluginV2 {\n    fn default() -> Self {\n        Self::new()\n    }\n}\n\nimpl NoAuthRuntimePluginV2 {\n    /// Creates a new `NoAuthRuntimePluginV2`.\n    pub fn new() -> Self {\n        Self(\n            RuntimeComponentsBuilder::new(\"NoAuthRuntimePluginV2\")\n                .with_identity_resolver(\n                    NO_AUTH_SCHEME_ID,\n                    SharedIdentityResolver::new(NoAuthIdentityResolver::new()),\n                )\n                .with_auth_scheme(SharedAuthScheme::new(NoAuthScheme::new())),\n        )\n    }\n}\n\nimpl RuntimePlugin for NoAuthRuntimePluginV2 {\n    fn order(&self) -> Order {\n        // This plugin should be applied as an escape hatch to append the no-auth scheme, hence `NestedComponents`.\n        Order::NestedComponents\n    }\n\n    fn runtime_components(\n        &self,\n        current_components: &RuntimeComponentsBuilder,\n    ) -> Cow<'_, RuntimeComponentsBuilder> {\n        // No auth scheme option resolver is configured here because it needs to access\n        // the existing resolver (likely the code-generated default) stored in the\n        // current runtime components builder.\n        let auth_scheme_option_resolver: SharedAuthSchemeOptionResolver =\n            match current_components.auth_scheme_option_resolver() {\n                Some(current_resolver) => {\n                    NoAuthSchemeOptionResolver::new(current_resolver.clone()).into_shared()\n                }\n                None => StaticAuthSchemeOptionResolver::new(vec![NO_AUTH_SCHEME_ID]).into_shared(),\n            };\n        Cow::Owned(\n            self.0\n                .clone()\n                .with_auth_scheme_option_resolver(Some(auth_scheme_option_resolver)),\n        )\n    }\n}\n\n#[derive(Debug)]\nstruct NoAuthSchemeOptionResolver<R> {\n    inner: R,\n}\n\nimpl<R> NoAuthSchemeOptionResolver<R> {\n    fn new(inner: R) -> Self {\n        Self { inner }\n    }\n}\n\nimpl<R> ResolveAuthSchemeOptions for NoAuthSchemeOptionResolver<R>\nwhere\n    R: ResolveAuthSchemeOptions,\n{\n    fn resolve_auth_scheme_options_v2<'a>(\n        &'a self,\n        params: &'a AuthSchemeOptionResolverParams,\n        cfg: &'a ConfigBag,\n        runtime_components: &'a RuntimeComponents,\n    ) -> AuthSchemeOptionsFuture<'a> {\n        let inner_future =\n            self.inner\n                .resolve_auth_scheme_options_v2(params, cfg, runtime_components);\n\n        AuthSchemeOptionsFuture::new(async move {\n            let mut options = inner_future.await?;\n            options.push(AuthSchemeOption::from(NO_AUTH_SCHEME_ID));\n            Ok(options)\n        })\n    }\n}\n\n/// The \"no auth\" auth scheme.\n///\n/// The orchestrator requires an auth scheme, so Smithy's `@optionalAuth` trait is implemented\n/// by placing a \"no auth\" auth scheme at the end of the auth scheme options list so that it is\n/// used if there's no identity resolver available for the other auth schemes. It's also used\n/// for models that don't have auth at all.\n#[derive(Debug, Default)]\npub struct NoAuthScheme {\n    signer: NoAuthSigner,\n}\n\nimpl NoAuthScheme {\n    /// Creates a new `NoAuthScheme`.\n    pub fn new() -> Self {\n        Self::default()\n    }\n}\n\n#[derive(Debug, Default)]\nstruct NoAuthSigner;\n\nimpl Sign for NoAuthSigner {\n    fn sign_http_request(\n        &self,\n        _request: &mut HttpRequest,\n        _identity: &Identity,\n        _auth_scheme_endpoint_config: AuthSchemeEndpointConfig<'_>,\n        _runtime_components: &RuntimeComponents,\n        _config_bag: &ConfigBag,\n    ) -> Result<(), BoxError> {\n        Ok(())\n    }\n}\n\nimpl AuthScheme for NoAuthScheme {\n    fn scheme_id(&self) -> AuthSchemeId {\n        NO_AUTH_SCHEME_ID\n    }\n\n    fn identity_resolver(\n        &self,\n        identity_resolvers: &dyn GetIdentityResolver,\n    ) -> Option<SharedIdentityResolver> {\n        identity_resolvers.identity_resolver(NO_AUTH_SCHEME_ID)\n    }\n\n    fn signer(&self) -> &dyn Sign {\n        &self.signer\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime/src/client/auth.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npub mod no_auth;\n\n#[cfg(feature = \"http-auth\")]\npub mod http;\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime/src/client/config_override.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_smithy_async::rt::sleep::SharedAsyncSleep;\nuse aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder;\nuse aws_smithy_types::config_bag::{\n    CloneableLayer, FrozenLayer, Layer, Storable, Store, StoreReplace,\n};\n\nmacro_rules! component {\n    ($typ:ty, $accessor:ident, $latest_accessor:ident, $doc:tt) => {\n        #[doc = $doc]\n        pub fn $accessor(&self) -> Option<$typ> {\n            fallback_component!(self, $typ, $accessor)\n        }\n\n        #[doc = $doc]\n        pub fn $latest_accessor(&self) -> Option<$typ> {\n            latest_component!(self, $typ, $accessor)\n        }\n    };\n}\nmacro_rules! fallback_component {\n    ($self:ident, $typ:ty, $accessor:ident) => {\n        match &$self.inner {\n            Inner::Initial(initial) => initial.components.$accessor(),\n            Inner::Override(overrid) => overrid\n                .components\n                .$accessor()\n                .or_else(|| overrid.initial_components.$accessor()),\n        }\n    };\n}\nmacro_rules! latest_component {\n    ($self:ident, $typ:ty, $accessor:ident) => {\n        match &$self.inner {\n            Inner::Initial(initial) => initial.components.$accessor(),\n            Inner::Override(overrid) => overrid.components.$accessor(),\n        }\n    };\n}\n\nstruct Initial<'a> {\n    config: &'a mut CloneableLayer,\n    components: &'a mut RuntimeComponentsBuilder,\n}\n\nstruct Override<'a> {\n    initial_config: FrozenLayer,\n    initial_components: &'a RuntimeComponentsBuilder,\n    config: &'a mut CloneableLayer,\n    components: &'a mut RuntimeComponentsBuilder,\n}\n\nenum Inner<'a> {\n    Initial(Initial<'a>),\n    Override(Override<'a>),\n}\n\n/// Utility to simplify config building and config overrides.\n///\n/// The resolver allows the same initialization logic to be reused\n/// for both initial config and override config.\n///\n/// This resolver can be initialized to one of two modes:\n/// 1. _Initial mode_: The resolver is being used in a service `Config` builder's `build()` method, and thus,\n///    there is no config override at this point.\n/// 2. _Override mode_: The resolver is being used by the `ConfigOverrideRuntimePlugin`'s constructor and needs\n///    to incorporate both the original config and the given config override for this operation.\n///\n/// In all the methods on [`Resolver`], the term \"latest\" refers to the initial config when in _Initial mode_,\n/// and to config override when in _Override mode_.\npub struct Resolver<'a> {\n    inner: Inner<'a>,\n}\n\nimpl<'a> Resolver<'a> {\n    /// Construct a new [`Resolver`] in _initial mode_.\n    pub fn initial(\n        config: &'a mut CloneableLayer,\n        components: &'a mut RuntimeComponentsBuilder,\n    ) -> Self {\n        Self {\n            inner: Inner::Initial(Initial { config, components }),\n        }\n    }\n\n    /// Construct a new [`Resolver`] in _override mode_.\n    pub fn overrid(\n        initial_config: FrozenLayer,\n        initial_components: &'a RuntimeComponentsBuilder,\n        config: &'a mut CloneableLayer,\n        components: &'a mut RuntimeComponentsBuilder,\n    ) -> Self {\n        Self {\n            inner: Inner::Override(Override {\n                initial_config,\n                initial_components,\n                config,\n                components,\n            }),\n        }\n    }\n\n    /// Returns true if in _initial mode_.\n    pub fn is_initial(&self) -> bool {\n        matches!(self.inner, Inner::Initial(_))\n    }\n\n    /// Returns a mutable reference to the latest config.\n    pub fn config_mut(&mut self) -> &mut CloneableLayer {\n        match &mut self.inner {\n            Inner::Initial(initial) => initial.config,\n            Inner::Override(overrid) => overrid.config,\n        }\n    }\n\n    /// Returns a mutable reference to the latest runtime components.\n    pub fn runtime_components_mut(&mut self) -> &mut RuntimeComponentsBuilder {\n        match &mut self.inner {\n            Inner::Initial(initial) => initial.components,\n            Inner::Override(overrid) => overrid.components,\n        }\n    }\n\n    /// Returns true if the latest config has `T` set.\n    ///\n    /// The \"latest\" is initial for `Resolver::Initial`, and override for `Resolver::Override`.\n    pub fn is_latest_set<T>(&self) -> bool\n    where\n        T: Storable<Storer = StoreReplace<T>>,\n    {\n        self.config().load::<T>().is_some()\n    }\n\n    /// Returns true if `T` is set anywhere.\n    pub fn is_set<T>(&self) -> bool\n    where\n        T: Storable<Storer = StoreReplace<T>>,\n    {\n        match &self.inner {\n            Inner::Initial(initial) => initial.config.load::<T>().is_some(),\n            Inner::Override(overrid) => {\n                overrid.initial_config.load::<T>().is_some() || overrid.config.load::<T>().is_some()\n            }\n        }\n    }\n\n    /// Resolves the value `T` with fallback\n    pub fn resolve_config<T>(&self) -> <T::Storer as Store>::ReturnedType<'_>\n    where\n        T: Storable<Storer = StoreReplace<T>>,\n    {\n        let mut maybe_value = self.config().load::<T>();\n        if maybe_value.is_none() {\n            // Try to fallback\n            if let Inner::Override(overrid) = &self.inner {\n                maybe_value = overrid.initial_config.load::<T>()\n            }\n        }\n        maybe_value\n    }\n\n    // Add additional component methods as needed\n    component!(\n        SharedAsyncSleep,\n        sleep_impl,\n        latest_sleep_impl,\n        \"The async sleep implementation.\"\n    );\n\n    fn config(&self) -> &Layer {\n        match &self.inner {\n            Inner::Initial(initial) => initial.config,\n            Inner::Override(overrid) => overrid.config,\n        }\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use aws_smithy_types::config_bag::CloneableLayer;\n\n    #[derive(Clone, Debug)]\n    struct TestStorable(String);\n    impl Storable for TestStorable {\n        type Storer = StoreReplace<Self>;\n    }\n\n    #[test]\n    fn initial_mode_config() {\n        let mut config = CloneableLayer::new(\"test\");\n        let mut components = RuntimeComponentsBuilder::new(\"test\");\n\n        let mut resolver = Resolver::initial(&mut config, &mut components);\n        assert!(resolver.is_initial());\n        assert!(!resolver.is_latest_set::<TestStorable>());\n        assert!(!resolver.is_set::<TestStorable>());\n        assert!(resolver.resolve_config::<TestStorable>().is_none());\n\n        resolver.config_mut().store_put(TestStorable(\"test\".into()));\n        assert!(resolver.is_latest_set::<TestStorable>());\n        assert!(resolver.is_set::<TestStorable>());\n        assert_eq!(\"test\", resolver.resolve_config::<TestStorable>().unwrap().0);\n    }\n\n    #[test]\n    fn override_mode_config() {\n        let mut initial_config = CloneableLayer::new(\"initial\");\n        let initial_components = RuntimeComponentsBuilder::new(\"initial\");\n        let mut config = CloneableLayer::new(\"override\");\n        let mut components = RuntimeComponentsBuilder::new(\"override\");\n\n        let resolver = Resolver::overrid(\n            initial_config.clone().freeze(),\n            &initial_components,\n            &mut config,\n            &mut components,\n        );\n        assert!(!resolver.is_initial());\n        assert!(!resolver.is_latest_set::<TestStorable>());\n        assert!(!resolver.is_set::<TestStorable>());\n        assert!(resolver.resolve_config::<TestStorable>().is_none());\n\n        initial_config.store_put(TestStorable(\"test\".into()));\n        let resolver = Resolver::overrid(\n            initial_config.clone().freeze(),\n            &initial_components,\n            &mut config,\n            &mut components,\n        );\n        assert!(!resolver.is_latest_set::<TestStorable>());\n        assert!(resolver.is_set::<TestStorable>());\n        assert_eq!(\"test\", resolver.resolve_config::<TestStorable>().unwrap().0);\n\n        initial_config.unset::<TestStorable>();\n        config.store_put(TestStorable(\"test\".into()));\n        let resolver = Resolver::overrid(\n            initial_config.clone().freeze(),\n            &initial_components,\n            &mut config,\n            &mut components,\n        );\n        assert!(resolver.is_latest_set::<TestStorable>());\n        assert!(resolver.is_set::<TestStorable>());\n        assert_eq!(\"test\", resolver.resolve_config::<TestStorable>().unwrap().0);\n\n        initial_config.store_put(TestStorable(\"override me\".into()));\n        config.store_put(TestStorable(\"override\".into()));\n        let resolver = Resolver::overrid(\n            initial_config.freeze(),\n            &initial_components,\n            &mut config,\n            &mut components,\n        );\n        assert!(resolver.is_latest_set::<TestStorable>());\n        assert!(resolver.is_set::<TestStorable>());\n        assert_eq!(\n            \"override\",\n            resolver.resolve_config::<TestStorable>().unwrap().0\n        );\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime/src/client/defaults.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Runtime plugins that provide defaults for clients.\n//!\n//! Note: these are the absolute base-level defaults. They may not be the defaults\n//! for _your_ client, since many things can change these defaults on the way to\n//! code generating and constructing a full client.\n\nuse crate::client::http::body::content_length_enforcement::EnforceContentLengthRuntimePlugin;\nuse crate::client::identity::IdentityCache;\nuse crate::client::retries::strategy::standard::TokenBucketProvider;\nuse crate::client::retries::strategy::StandardRetryStrategy;\nuse crate::client::retries::RetryPartition;\nuse aws_smithy_async::rt::sleep::default_async_sleep;\nuse aws_smithy_async::time::SystemTimeSource;\nuse aws_smithy_runtime_api::box_error::BoxError;\nuse aws_smithy_runtime_api::client::behavior_version::BehaviorVersion;\nuse aws_smithy_runtime_api::client::http::SharedHttpClient;\nuse aws_smithy_runtime_api::client::interceptors::SharedInterceptor;\nuse aws_smithy_runtime_api::client::runtime_components::{\n    RuntimeComponentsBuilder, SharedConfigValidator,\n};\nuse aws_smithy_runtime_api::client::runtime_plugin::{\n    Order, SharedRuntimePlugin, StaticRuntimePlugin,\n};\nuse aws_smithy_runtime_api::client::stalled_stream_protection::StalledStreamProtectionConfig;\nuse aws_smithy_runtime_api::shared::IntoShared;\nuse aws_smithy_types::config_bag::{ConfigBag, FrozenLayer, Layer};\nuse aws_smithy_types::retry::RetryConfig;\nuse aws_smithy_types::timeout::TimeoutConfig;\nuse std::borrow::Cow;\nuse std::time::Duration;\n\n/// Default connect timeout for all clients with BehaviorVersion >= v2026_01_12\nconst DEFAULT_CONNECT_TIMEOUT: Duration = Duration::from_millis(3100);\n\nfn default_plugin<CompFn>(name: &'static str, components_fn: CompFn) -> StaticRuntimePlugin\nwhere\n    CompFn: FnOnce(RuntimeComponentsBuilder) -> RuntimeComponentsBuilder,\n{\n    StaticRuntimePlugin::new()\n        .with_order(Order::Defaults)\n        .with_runtime_components((components_fn)(RuntimeComponentsBuilder::new(name)))\n}\n\nfn layer<LayerFn>(name: &'static str, layer_fn: LayerFn) -> FrozenLayer\nwhere\n    LayerFn: FnOnce(&mut Layer),\n{\n    let mut layer = Layer::new(name);\n    (layer_fn)(&mut layer);\n    layer.freeze()\n}\n\n/// Runtime plugin that provides a default connector.\n#[deprecated(\n    since = \"1.8.0\",\n    note = \"This function wasn't intended to be public, and didn't take the behavior major version as an argument, so it couldn't be evolved over time.\"\n)]\npub fn default_http_client_plugin() -> Option<SharedRuntimePlugin> {\n    #[expect(deprecated)]\n    default_http_client_plugin_v2(BehaviorVersion::v2024_03_28())\n}\n\n/// Runtime plugin that provides a default HTTPS connector.\npub fn default_http_client_plugin_v2(\n    behavior_version: BehaviorVersion,\n) -> Option<SharedRuntimePlugin> {\n    let mut _default: Option<SharedHttpClient> = None;\n\n    if behavior_version.is_at_least(BehaviorVersion::v2026_01_12()) {\n        // the latest https stack takes precedence if the config flag\n        // is enabled otherwise try to fall back to the legacy connector\n        // if that feature flag is available.\n        #[cfg(all(\n            feature = \"connector-hyper-0-14-x\",\n            not(feature = \"default-https-client\")\n        ))]\n        #[allow(deprecated)]\n        {\n            _default = crate::client::http::hyper_014::default_client();\n        }\n\n        // takes precedence over legacy connector if enabled\n        #[cfg(feature = \"default-https-client\")]\n        {\n            let opts = crate::client::http::DefaultClientOptions::default()\n                .with_behavior_version(behavior_version);\n            _default = crate::client::http::default_https_client(opts);\n        }\n    } else {\n        // fallback to legacy hyper client for given behavior version\n        #[cfg(feature = \"connector-hyper-0-14-x\")]\n        #[allow(deprecated)]\n        {\n            _default = crate::client::http::hyper_014::default_client();\n        }\n    }\n\n    _default.map(|default| {\n        default_plugin(\"default_http_client_plugin\", |components| {\n            components.with_http_client(Some(default))\n        })\n        .into_shared()\n    })\n}\n\n/// Runtime plugin that provides a default async sleep implementation.\npub fn default_sleep_impl_plugin() -> Option<SharedRuntimePlugin> {\n    default_async_sleep().map(|default| {\n        default_plugin(\"default_sleep_impl_plugin\", |components| {\n            components.with_sleep_impl(Some(default))\n        })\n        .into_shared()\n    })\n}\n\n/// Runtime plugin that provides a default time source.\npub fn default_time_source_plugin() -> Option<SharedRuntimePlugin> {\n    Some(\n        default_plugin(\"default_time_source_plugin\", |components| {\n            components.with_time_source(Some(SystemTimeSource::new()))\n        })\n        .into_shared(),\n    )\n}\n\n/// Runtime plugin that sets the default retry strategy, config (disabled), and partition.\npub fn default_retry_config_plugin(\n    default_partition_name: impl Into<Cow<'static, str>>,\n) -> Option<SharedRuntimePlugin> {\n    let retry_partition = RetryPartition::new(default_partition_name);\n    Some(\n        default_plugin(\"default_retry_config_plugin\", |components| {\n            components\n                .with_retry_strategy(Some(StandardRetryStrategy::new()))\n                .with_config_validator(SharedConfigValidator::base_client_config_fn(\n                    validate_retry_config,\n                ))\n                .with_interceptor(SharedInterceptor::permanent(TokenBucketProvider::new(\n                    retry_partition.clone(),\n                )))\n        })\n        .with_config(layer(\"default_retry_config\", |layer| {\n            layer.store_put(RetryConfig::disabled());\n            layer.store_put(retry_partition);\n        }))\n        .into_shared(),\n    )\n}\n\n/// Runtime plugin that sets the default retry strategy, config, and partition.\n///\n/// This version respects the behavior version to enable retries by default for newer versions.\n/// For AWS SDK clients with BehaviorVersion >= v2026_01_12, retries are enabled by default.\npub fn default_retry_config_plugin_v2(params: &DefaultPluginParams) -> Option<SharedRuntimePlugin> {\n    let retry_partition = RetryPartition::new(\n        params\n            .retry_partition_name\n            .as_ref()\n            .expect(\"retry partition name is required\")\n            .clone(),\n    );\n    let is_aws_sdk = params.is_aws_sdk;\n    let behavior_version = params\n        .behavior_version\n        .unwrap_or_else(BehaviorVersion::latest);\n    Some(\n        default_plugin(\"default_retry_config_plugin\", |components| {\n            components\n                .with_retry_strategy(Some(StandardRetryStrategy::new()))\n                .with_config_validator(SharedConfigValidator::base_client_config_fn(\n                    validate_retry_config,\n                ))\n                .with_interceptor(SharedInterceptor::permanent(TokenBucketProvider::new(\n                    retry_partition.clone(),\n                )))\n        })\n        .with_config(layer(\"default_retry_config\", |layer| {\n            let retry_config =\n                if is_aws_sdk && behavior_version.is_at_least(BehaviorVersion::v2026_01_12()) {\n                    RetryConfig::standard()\n                } else {\n                    RetryConfig::disabled()\n                };\n            layer.store_put(retry_config);\n            layer.store_put(retry_partition);\n        }))\n        .into_shared(),\n    )\n}\n\nfn validate_retry_config(\n    components: &RuntimeComponentsBuilder,\n    cfg: &ConfigBag,\n) -> Result<(), BoxError> {\n    if let Some(retry_config) = cfg.load::<RetryConfig>() {\n        if retry_config.has_retry() && components.sleep_impl().is_none() {\n            Err(\"An async sleep implementation is required for retry to work. Please provide a `sleep_impl` on \\\n                 the config, or disable timeouts.\".into())\n        } else {\n            Ok(())\n        }\n    } else {\n        Err(\n            \"The default retry config was removed, and no other config was put in its place.\"\n                .into(),\n        )\n    }\n}\n\n/// Runtime plugin that sets the default timeout config (no timeouts).\npub fn default_timeout_config_plugin() -> Option<SharedRuntimePlugin> {\n    Some(\n        default_plugin(\"default_timeout_config_plugin\", |components| {\n            components.with_config_validator(SharedConfigValidator::base_client_config_fn(\n                validate_timeout_config,\n            ))\n        })\n        .with_config(layer(\"default_timeout_config\", |layer| {\n            layer.store_put(TimeoutConfig::disabled());\n        }))\n        .into_shared(),\n    )\n}\n\n/// Runtime plugin that sets the default timeout config.\n///\n/// This version respects the behavior version to enable connection timeout by default for newer versions.\n/// For all clients with BehaviorVersion >= v2026_01_12, a 3.1s connection timeout is set.\npub fn default_timeout_config_plugin_v2(\n    params: &DefaultPluginParams,\n) -> Option<SharedRuntimePlugin> {\n    let behavior_version = params\n        .behavior_version\n        .unwrap_or_else(BehaviorVersion::latest);\n    Some(\n        default_plugin(\"default_timeout_config_plugin\", |components| {\n            components.with_config_validator(SharedConfigValidator::base_client_config_fn(\n                validate_timeout_config,\n            ))\n        })\n        .with_config(layer(\"default_timeout_config\", |layer| {\n            let timeout_config = if behavior_version.is_at_least(BehaviorVersion::v2026_01_12()) {\n                // All clients with BMV >= v2026_01_12: Set connect_timeout only\n                TimeoutConfig::builder()\n                    .connect_timeout(DEFAULT_CONNECT_TIMEOUT)\n                    .build()\n            } else {\n                // Old behavior versions: All timeouts disabled\n                TimeoutConfig::disabled()\n            };\n            layer.store_put(timeout_config);\n        }))\n        .into_shared(),\n    )\n}\n\nfn validate_timeout_config(\n    components: &RuntimeComponentsBuilder,\n    cfg: &ConfigBag,\n) -> Result<(), BoxError> {\n    if let Some(timeout_config) = cfg.load::<TimeoutConfig>() {\n        if timeout_config.has_timeouts() && components.sleep_impl().is_none() {\n            Err(\"An async sleep implementation is required for timeouts to work. Please provide a `sleep_impl` on \\\n                 the config, or disable timeouts.\".into())\n        } else {\n            Ok(())\n        }\n    } else {\n        Err(\n            \"The default timeout config was removed, and no other config was put in its place.\"\n                .into(),\n        )\n    }\n}\n\n/// Runtime plugin that registers the default identity cache implementation.\npub fn default_identity_cache_plugin() -> Option<SharedRuntimePlugin> {\n    Some(\n        default_plugin(\"default_identity_cache_plugin\", |components| {\n            components.with_identity_cache(Some(IdentityCache::lazy().build()))\n        })\n        .into_shared(),\n    )\n}\n\n/// Runtime plugin that sets the default stalled stream protection config.\n///\n/// By default, when throughput falls below 1/Bs for more than 5 seconds, the\n/// stream is cancelled.\n#[deprecated(\n    since = \"1.2.0\",\n    note = \"This function wasn't intended to be public, and didn't take the behavior major version as an argument, so it couldn't be evolved over time.\"\n)]\npub fn default_stalled_stream_protection_config_plugin() -> Option<SharedRuntimePlugin> {\n    #[expect(deprecated)]\n    default_stalled_stream_protection_config_plugin_v2(BehaviorVersion::v2023_11_09())\n}\nfn default_stalled_stream_protection_config_plugin_v2(\n    behavior_version: BehaviorVersion,\n) -> Option<SharedRuntimePlugin> {\n    Some(\n        default_plugin(\n            \"default_stalled_stream_protection_config_plugin\",\n            |components| {\n                components.with_config_validator(SharedConfigValidator::base_client_config_fn(\n                    validate_stalled_stream_protection_config,\n                ))\n            },\n        )\n        .with_config(layer(\"default_stalled_stream_protection_config\", |layer| {\n            let mut config =\n                StalledStreamProtectionConfig::enabled().grace_period(Duration::from_secs(5));\n            // Before v2024_03_28, upload streams did not have stalled stream protection by default\n            #[expect(deprecated)]\n            if !behavior_version.is_at_least(BehaviorVersion::v2024_03_28()) {\n                config = config.upload_enabled(false);\n            }\n            layer.store_put(config.build());\n        }))\n        .into_shared(),\n    )\n}\n\nfn enforce_content_length_runtime_plugin() -> Option<SharedRuntimePlugin> {\n    Some(EnforceContentLengthRuntimePlugin::new().into_shared())\n}\n\nfn validate_stalled_stream_protection_config(\n    components: &RuntimeComponentsBuilder,\n    cfg: &ConfigBag,\n) -> Result<(), BoxError> {\n    if let Some(stalled_stream_protection_config) = cfg.load::<StalledStreamProtectionConfig>() {\n        if stalled_stream_protection_config.is_enabled() {\n            if components.sleep_impl().is_none() {\n                return Err(\n                    \"An async sleep implementation is required for stalled stream protection to work. \\\n                     Please provide a `sleep_impl` on the config, or disable stalled stream protection.\".into());\n            }\n\n            if components.time_source().is_none() {\n                return Err(\n                    \"A time source is required for stalled stream protection to work.\\\n                     Please provide a `time_source` on the config, or disable stalled stream protection.\".into());\n            }\n        }\n\n        Ok(())\n    } else {\n        Err(\n            \"The default stalled stream protection config was removed, and no other config was put in its place.\"\n                .into(),\n        )\n    }\n}\n\n/// Arguments for the [`default_plugins`] method.\n///\n/// This is a struct to enable adding new parameters in the future without breaking the API.\n#[non_exhaustive]\n#[derive(Debug, Default)]\npub struct DefaultPluginParams {\n    retry_partition_name: Option<Cow<'static, str>>,\n    behavior_version: Option<BehaviorVersion>,\n    is_aws_sdk: bool,\n}\n\nimpl DefaultPluginParams {\n    /// Creates a new [`DefaultPluginParams`].\n    pub fn new() -> Self {\n        Default::default()\n    }\n\n    /// Sets the retry partition name.\n    pub fn with_retry_partition_name(mut self, name: impl Into<Cow<'static, str>>) -> Self {\n        self.retry_partition_name = Some(name.into());\n        self\n    }\n\n    /// Sets the behavior major version.\n    pub fn with_behavior_version(mut self, version: BehaviorVersion) -> Self {\n        self.behavior_version = Some(version);\n        self\n    }\n\n    /// Marks this as an AWS SDK client (enables retries by default for newer behavior versions).\n    pub fn with_is_aws_sdk(mut self, is_aws_sdk: bool) -> Self {\n        self.is_aws_sdk = is_aws_sdk;\n        self\n    }\n}\n\n/// All default plugins.\npub fn default_plugins(\n    params: DefaultPluginParams,\n) -> impl IntoIterator<Item = SharedRuntimePlugin> {\n    let behavior_version = params\n        .behavior_version\n        .unwrap_or_else(BehaviorVersion::latest);\n\n    [\n        default_http_client_plugin_v2(behavior_version),\n        default_identity_cache_plugin(),\n        default_retry_config_plugin_v2(&params),\n        default_sleep_impl_plugin(),\n        default_time_source_plugin(),\n        default_timeout_config_plugin_v2(&params),\n        enforce_content_length_runtime_plugin(),\n        default_stalled_stream_protection_config_plugin_v2(behavior_version),\n    ]\n    .into_iter()\n    .flatten()\n    .collect::<Vec<SharedRuntimePlugin>>()\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use aws_smithy_runtime_api::client::runtime_plugin::{RuntimePlugin, RuntimePlugins};\n\n    fn test_plugin_params(version: BehaviorVersion) -> DefaultPluginParams {\n        DefaultPluginParams::new()\n            .with_behavior_version(version)\n            .with_retry_partition_name(\"dontcare\")\n            .with_is_aws_sdk(false) // Default to non-AWS SDK for existing tests\n    }\n    fn config_for(plugins: impl IntoIterator<Item = SharedRuntimePlugin>) -> ConfigBag {\n        let mut config = ConfigBag::base();\n        let plugins = RuntimePlugins::new().with_client_plugins(plugins);\n        plugins.apply_client_configuration(&mut config).unwrap();\n        config\n    }\n\n    #[test]\n    #[expect(deprecated)]\n    fn v2024_03_28_stalled_stream_protection_difference() {\n        let latest = config_for(default_plugins(test_plugin_params(\n            BehaviorVersion::latest(),\n        )));\n        let v2023 = config_for(default_plugins(test_plugin_params(\n            BehaviorVersion::v2023_11_09(),\n        )));\n\n        assert!(\n            latest\n                .load::<StalledStreamProtectionConfig>()\n                .unwrap()\n                .upload_enabled(),\n            \"stalled stream protection on uploads MUST be enabled after v2024_03_28\"\n        );\n        assert!(\n            !v2023\n                .load::<StalledStreamProtectionConfig>()\n                .unwrap()\n                .upload_enabled(),\n            \"stalled stream protection on uploads MUST NOT be enabled before v2024_03_28\"\n        );\n    }\n\n    #[test]\n    fn test_retry_enabled_for_aws_sdk() {\n        let params = DefaultPluginParams::new()\n            .with_retry_partition_name(\"test-partition\")\n            .with_behavior_version(BehaviorVersion::latest())\n            .with_is_aws_sdk(true);\n        let plugin = default_retry_config_plugin_v2(&params).expect(\"plugin should be created\");\n\n        let config = plugin.config().expect(\"config should exist\");\n        let retry_config = config\n            .load::<RetryConfig>()\n            .expect(\"retry config should exist\");\n\n        assert_eq!(\n            retry_config.max_attempts(),\n            3,\n            \"retries should be enabled with max_attempts=3 for AWS SDK with latest behavior version\"\n        );\n    }\n\n    #[test]\n    #[expect(deprecated)]\n    fn test_retry_disabled_for_aws_sdk_old_behavior_version() {\n        // Any version before v2026_01_12 should have retries disabled\n        let params = DefaultPluginParams::new()\n            .with_retry_partition_name(\"test-partition\")\n            .with_behavior_version(BehaviorVersion::v2024_03_28())\n            .with_is_aws_sdk(true);\n        let plugin = default_retry_config_plugin_v2(&params).expect(\"plugin should be created\");\n\n        let config = plugin.config().expect(\"config should exist\");\n        let retry_config = config\n            .load::<RetryConfig>()\n            .expect(\"retry config should exist\");\n\n        assert_eq!(\n            retry_config.max_attempts(),\n            1,\n            \"retries should be disabled for AWS SDK with behavior version < v2026_01_12\"\n        );\n    }\n\n    #[test]\n    fn test_retry_enabled_at_cutoff_version() {\n        // v2026_01_12 is the cutoff - retries should be enabled from this version onwards\n        let params = DefaultPluginParams::new()\n            .with_retry_partition_name(\"test-partition\")\n            .with_behavior_version(BehaviorVersion::v2026_01_12())\n            .with_is_aws_sdk(true);\n        let plugin = default_retry_config_plugin_v2(&params).expect(\"plugin should be created\");\n\n        let config = plugin.config().expect(\"config should exist\");\n        let retry_config = config\n            .load::<RetryConfig>()\n            .expect(\"retry config should exist\");\n\n        assert_eq!(\n            retry_config.max_attempts(),\n            3,\n            \"retries should be enabled for AWS SDK starting from v2026_01_12\"\n        );\n    }\n\n    #[test]\n    fn test_retry_disabled_for_non_aws_sdk() {\n        let params = DefaultPluginParams::new()\n            .with_retry_partition_name(\"test-partition\")\n            .with_behavior_version(BehaviorVersion::latest())\n            .with_is_aws_sdk(false);\n        let plugin = default_retry_config_plugin_v2(&params).expect(\"plugin should be created\");\n\n        let config = plugin.config().expect(\"config should exist\");\n        let retry_config = config\n            .load::<RetryConfig>()\n            .expect(\"retry config should exist\");\n\n        assert_eq!(\n            retry_config.max_attempts(),\n            1,\n            \"retries should be disabled for non-AWS SDK clients\"\n        );\n    }\n\n    #[test]\n    #[expect(deprecated)]\n    fn test_behavior_version_gates_retry_for_aws_sdk() {\n        // This test demonstrates the complete behavior:\n        // AWS SDK clients get retries enabled ONLY when BehaviorVersion >= v2026_01_12\n\n        // Test all behavior versions\n        let test_cases = vec![\n            (BehaviorVersion::v2023_11_09(), 1, \"v2023_11_09 (old)\"),\n            (BehaviorVersion::v2024_03_28(), 1, \"v2024_03_28 (old)\"),\n            (BehaviorVersion::v2025_01_17(), 1, \"v2025_01_17 (old)\"),\n            (BehaviorVersion::v2025_08_07(), 1, \"v2025_08_07 (old)\"),\n            (BehaviorVersion::v2026_01_12(), 3, \"v2026_01_12 (cutoff)\"),\n            (BehaviorVersion::latest(), 3, \"latest\"),\n        ];\n\n        for (version, expected_attempts, version_name) in test_cases {\n            let params = DefaultPluginParams::new()\n                .with_retry_partition_name(\"test-partition\")\n                .with_behavior_version(version)\n                .with_is_aws_sdk(true);\n\n            let plugin = default_retry_config_plugin_v2(&params).expect(\"plugin should be created\");\n            let config = plugin.config().expect(\"config should exist\");\n            let retry_config = config\n                .load::<RetryConfig>()\n                .expect(\"retry config should exist\");\n\n            assert_eq!(\n                retry_config.max_attempts(),\n                expected_attempts,\n                \"AWS SDK with {} should have {} max attempts\",\n                version_name,\n                expected_attempts\n            );\n        }\n    }\n\n    #[test]\n    #[expect(deprecated)]\n    fn test_complete_default_plugins_integration() {\n        // This test simulates the complete flow as it would happen in a real AWS SDK client\n        // It verifies that default_plugins() correctly applies retry config based on\n        // both is_aws_sdk flag and BehaviorVersion\n\n        // Scenario 1: AWS SDK with latest behavior version -> retries enabled\n        let params_aws_latest = DefaultPluginParams::new()\n            .with_retry_partition_name(\"aws-s3\")\n            .with_behavior_version(BehaviorVersion::latest())\n            .with_is_aws_sdk(true);\n\n        let config_aws_latest = config_for(default_plugins(params_aws_latest));\n        let retry_aws_latest = config_aws_latest\n            .load::<RetryConfig>()\n            .expect(\"retry config should exist\");\n        assert_eq!(\n            retry_aws_latest.max_attempts(),\n            3,\n            \"AWS SDK with latest behavior version should have retries enabled (3 attempts)\"\n        );\n\n        // Scenario 2: AWS SDK with old behavior version -> retries disabled\n        let params_aws_old = DefaultPluginParams::new()\n            .with_retry_partition_name(\"aws-s3\")\n            .with_behavior_version(BehaviorVersion::v2024_03_28())\n            .with_is_aws_sdk(true);\n\n        let config_aws_old = config_for(default_plugins(params_aws_old));\n        let retry_aws_old = config_aws_old\n            .load::<RetryConfig>()\n            .expect(\"retry config should exist\");\n        assert_eq!(\n            retry_aws_old.max_attempts(),\n            1,\n            \"AWS SDK with old behavior version should have retries disabled (1 attempt)\"\n        );\n\n        // Scenario 3: Non-AWS SDK (generic Smithy client) -> retries always disabled\n        let params_generic = DefaultPluginParams::new()\n            .with_retry_partition_name(\"my-service\")\n            .with_behavior_version(BehaviorVersion::latest())\n            .with_is_aws_sdk(false);\n\n        let config_generic = config_for(default_plugins(params_generic));\n        let retry_generic = config_generic\n            .load::<RetryConfig>()\n            .expect(\"retry config should exist\");\n        assert_eq!(\n            retry_generic.max_attempts(),\n            1,\n            \"Non-AWS SDK clients should always have retries disabled (1 attempt)\"\n        );\n\n        // Scenario 4: Verify the cutoff version v2026_01_12 is the exact boundary\n        let params_cutoff = DefaultPluginParams::new()\n            .with_retry_partition_name(\"aws-s3\")\n            .with_behavior_version(BehaviorVersion::v2026_01_12())\n            .with_is_aws_sdk(true);\n\n        let config_cutoff = config_for(default_plugins(params_cutoff));\n        let retry_cutoff = config_cutoff\n            .load::<RetryConfig>()\n            .expect(\"retry config should exist\");\n        assert_eq!(\n            retry_cutoff.max_attempts(),\n            3,\n            \"AWS SDK with v2026_01_12 (the cutoff version) should have retries enabled (3 attempts)\"\n        );\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime/src/client/dns.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Built-in DNS resolver implementations.\n\n#[cfg(all(feature = \"rt-tokio\", not(target_family = \"wasm\")))]\nmod tokio {\n    use aws_smithy_runtime_api::client::dns::{DnsFuture, ResolveDns, ResolveDnsError};\n    use std::io::Error as IoError;\n    use std::net::ToSocketAddrs;\n\n    /// DNS resolver that uses `tokio::spawn_blocking` to resolve DNS using the standard library.\n    ///\n    /// This implementation isn't available for WASM targets.\n    #[non_exhaustive]\n    #[derive(Debug, Default, Clone)]\n    pub struct TokioDnsResolver;\n\n    impl TokioDnsResolver {\n        /// Creates a new Tokio DNS resolver\n        pub fn new() -> Self {\n            Self\n        }\n    }\n\n    impl ResolveDns for TokioDnsResolver {\n        fn resolve_dns<'a>(&'a self, name: &'a str) -> DnsFuture<'a> {\n            let name = name.to_string();\n            DnsFuture::new(async move {\n                let result = tokio::task::spawn_blocking(move || (name, 0).to_socket_addrs()).await;\n                match result {\n                    Err(join_failure) => Err(ResolveDnsError::new(IoError::other(join_failure))),\n                    Ok(Ok(dns_result)) => {\n                        Ok(dns_result.into_iter().map(|addr| addr.ip()).collect())\n                    }\n                    Ok(Err(dns_failure)) => Err(ResolveDnsError::new(dns_failure)),\n                }\n            })\n        }\n    }\n}\n\n#[cfg(all(feature = \"rt-tokio\", not(target_family = \"wasm\")))]\npub use self::tokio::TokioDnsResolver;\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime/src/client/endpoint.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Code for applying endpoints to a request.\n\nuse aws_smithy_runtime_api::client::endpoint::{error::InvalidEndpointError, EndpointPrefix};\nuse std::borrow::Cow;\nuse std::result::Result as StdResult;\nuse std::str::FromStr;\n\n/// Apply `endpoint` to `uri`\n///\n/// This method mutates `uri` by setting the `endpoint` on it\n#[deprecated(\n    since = \"1.8.0\",\n    note = \"Depends on pre 1.x http types. May be removed or feature gated in a future minor version.\"\n)]\npub fn apply_endpoint(\n    uri: &mut http_02x::Uri,\n    endpoint: &http_02x::Uri,\n    prefix: Option<&EndpointPrefix>,\n) -> StdResult<(), InvalidEndpointError> {\n    let prefix = prefix.map(EndpointPrefix::as_str).unwrap_or(\"\");\n    let authority = endpoint\n        .authority()\n        .as_ref()\n        .map(|auth| auth.as_str())\n        .unwrap_or(\"\");\n    let authority = if !prefix.is_empty() {\n        Cow::Owned(format!(\"{prefix}{authority}\"))\n    } else {\n        Cow::Borrowed(authority)\n    };\n    let authority = http_02x::uri::Authority::from_str(&authority).map_err(|err| {\n        InvalidEndpointError::failed_to_construct_authority(authority.into_owned(), err)\n    })?;\n    let scheme = *endpoint\n        .scheme()\n        .as_ref()\n        .ok_or_else(InvalidEndpointError::endpoint_must_have_scheme)?;\n    let new_uri = http_02x::Uri::builder()\n        .authority(authority)\n        .scheme(scheme.clone())\n        .path_and_query(merge_paths(endpoint, uri).as_ref())\n        .build()\n        .map_err(InvalidEndpointError::failed_to_construct_uri)?;\n    *uri = new_uri;\n    Ok(())\n}\n\nfn merge_paths<'a>(endpoint: &'a http_02x::Uri, uri: &'a http_02x::Uri) -> Cow<'a, str> {\n    if let Some(query) = endpoint.path_and_query().and_then(|pq| pq.query()) {\n        tracing::warn!(query = %query, \"query specified in endpoint will be ignored during endpoint resolution\");\n    }\n    let endpoint_path = endpoint.path();\n    let uri_path_and_query = uri.path_and_query().map(|pq| pq.as_str()).unwrap_or(\"\");\n    if endpoint_path.is_empty() {\n        Cow::Borrowed(uri_path_and_query)\n    } else {\n        let ep_no_slash = endpoint_path.strip_suffix('/').unwrap_or(endpoint_path);\n        let uri_path_no_slash = uri_path_and_query\n            .strip_prefix('/')\n            .unwrap_or(uri_path_and_query);\n        Cow::Owned(format!(\"{ep_no_slash}/{uri_path_no_slash}\"))\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime/src/client/http/body/content_length_enforcement.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! RuntimePlugin to ensure that the amount of data received matches the `Content-Length` header\n\nuse aws_smithy_runtime_api::box_error::BoxError;\nuse aws_smithy_runtime_api::client::interceptors::context::{\n    BeforeDeserializationInterceptorContextMut, BeforeTransmitInterceptorContextRef,\n};\nuse aws_smithy_runtime_api::client::interceptors::SharedInterceptor;\nuse aws_smithy_runtime_api::client::interceptors::{dyn_dispatch_hint, Intercept};\nuse aws_smithy_runtime_api::client::runtime_components::{\n    RuntimeComponents, RuntimeComponentsBuilder,\n};\nuse aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugin;\nuse aws_smithy_runtime_api::http::Response;\nuse aws_smithy_types::body::SdkBody;\nuse aws_smithy_types::config_bag::{ConfigBag, Storable, StoreReplace};\nuse bytes::Buf;\nuse http_body_1x::{Frame, SizeHint};\nuse pin_project_lite::pin_project;\nuse std::borrow::Cow;\nuse std::error::Error;\nuse std::fmt::{Display, Formatter};\nuse std::pin::Pin;\nuse std::task::{ready, Context, Poll};\npin_project! {\n    /// A body-wrapper that will calculate the `InnerBody`'s checksum and emit it as a trailer.\n    struct ContentLengthEnforcingBody<InnerBody> {\n            #[pin]\n            body: InnerBody,\n            expected_length: u64,\n            bytes_received: u64,\n    }\n}\n\n/// An error returned when a body did not have the expected content length\n#[derive(Debug)]\npub struct ContentLengthError {\n    expected: u64,\n    received: u64,\n}\n\nimpl Error for ContentLengthError {}\n\nimpl Display for ContentLengthError {\n    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {\n        write!(\n            f,\n            \"Invalid Content-Length: Expected {} bytes but {} bytes were received\",\n            self.expected, self.received\n        )\n    }\n}\n\nimpl ContentLengthEnforcingBody<SdkBody> {\n    /// Wraps an existing [`SdkBody`] in a content-length enforcement layer\n    fn wrap(body: SdkBody, content_length: u64) -> SdkBody {\n        body.map_preserve_contents(move |b| {\n            SdkBody::from_body_1_x(ContentLengthEnforcingBody {\n                body: b,\n                expected_length: content_length,\n                bytes_received: 0,\n            })\n        })\n    }\n}\n\nimpl<\n        E: Into<aws_smithy_types::body::Error>,\n        Data: Buf,\n        InnerBody: http_body_1x::Body<Error = E, Data = Data>,\n    > http_body_1x::Body for ContentLengthEnforcingBody<InnerBody>\n{\n    type Data = Data;\n    type Error = aws_smithy_types::body::Error;\n\n    fn poll_frame(\n        mut self: Pin<&mut Self>,\n        cx: &mut Context<'_>,\n    ) -> Poll<Option<Result<Frame<Self::Data>, Self::Error>>> {\n        let this = self.as_mut().project();\n        match ready!(this.body.poll_frame(cx)) {\n            None => {\n                if *this.expected_length == *this.bytes_received {\n                    Poll::Ready(None)\n                } else {\n                    Poll::Ready(Some(Err(ContentLengthError {\n                        expected: *this.expected_length,\n                        received: *this.bytes_received,\n                    }\n                    .into())))\n                }\n            }\n            Some(Err(e)) => Poll::Ready(Some(Err(e.into()))),\n            Some(Ok(frame)) => {\n                if let Some(data) = frame.data_ref() {\n                    *this.bytes_received += data.remaining() as u64;\n                }\n                Poll::Ready(Some(Ok(frame)))\n            }\n        }\n    }\n\n    fn is_end_stream(&self) -> bool {\n        self.body.is_end_stream()\n    }\n\n    fn size_hint(&self) -> SizeHint {\n        self.body.size_hint()\n    }\n}\n\n#[derive(Debug, Default)]\nstruct EnforceContentLengthInterceptor {}\n\n#[derive(Debug)]\nstruct EnableContentLengthEnforcement;\nimpl Storable for EnableContentLengthEnforcement {\n    type Storer = StoreReplace<EnableContentLengthEnforcement>;\n}\n\n#[dyn_dispatch_hint]\nimpl Intercept for EnforceContentLengthInterceptor {\n    fn name(&self) -> &'static str {\n        \"EnforceContentLength\"\n    }\n\n    fn read_before_transmit(\n        &self,\n        context: &BeforeTransmitInterceptorContextRef<'_>,\n        _runtime_components: &RuntimeComponents,\n        cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        if context.request().method() == \"GET\" {\n            cfg.interceptor_state()\n                .store_put(EnableContentLengthEnforcement);\n        }\n        Ok(())\n    }\n    fn modify_before_deserialization(\n        &self,\n        context: &mut BeforeDeserializationInterceptorContextMut<'_>,\n        _runtime_components: &RuntimeComponents,\n        cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        // if we didn't enable it for this request, bail out\n        if cfg.load::<EnableContentLengthEnforcement>().is_none() {\n            return Ok(());\n        }\n        let content_length = match extract_content_length(context.response()) {\n            Err(err) => {\n                tracing::warn!(err = ?err, \"could not parse content length from content-length header. This header will be ignored\");\n                return Ok(());\n            }\n            Ok(Some(content_length)) => content_length,\n            Ok(None) => return Ok(()),\n        };\n\n        tracing::trace!(\n            expected_length = content_length,\n            \"Wrapping response body in content-length enforcement.\"\n        );\n\n        let body = context.response_mut().take_body();\n        let wrapped = body.map_preserve_contents(move |body| {\n            ContentLengthEnforcingBody::wrap(body, content_length)\n        });\n        *context.response_mut().body_mut() = wrapped;\n        Ok(())\n    }\n}\n\nfn extract_content_length<B>(response: &Response<B>) -> Result<Option<u64>, BoxError> {\n    let Some(content_length) = response.headers().get(\"content-length\") else {\n        tracing::trace!(\"No content length header was set. Will not validate content length\");\n        return Ok(None);\n    };\n    if response.headers().get_all(\"content-length\").count() != 1 {\n        return Err(\"Found multiple content length headers. This is invalid\".into());\n    }\n\n    Ok(Some(content_length.parse::<u64>()?))\n}\n\n/// Runtime plugin that enforces response bodies match their expected content length\n#[derive(Debug, Default)]\npub struct EnforceContentLengthRuntimePlugin {}\n\nimpl EnforceContentLengthRuntimePlugin {\n    /// Creates a runtime plugin which installs Content-Length enforcement middleware for response bodies\n    pub fn new() -> Self {\n        Self {}\n    }\n}\n\nimpl RuntimePlugin for EnforceContentLengthRuntimePlugin {\n    fn runtime_components(\n        &self,\n        _current_components: &RuntimeComponentsBuilder,\n    ) -> Cow<'_, RuntimeComponentsBuilder> {\n        Cow::Owned(\n            RuntimeComponentsBuilder::new(\"EnforceContentLength\").with_interceptor(\n                SharedInterceptor::permanent(EnforceContentLengthInterceptor {}),\n            ),\n        )\n    }\n}\n\n#[cfg(all(test, any(feature = \"test-util\", feature = \"legacy-test-util\")))]\nmod test {\n    use crate::assert_str_contains;\n    use crate::client::http::body::content_length_enforcement::{\n        extract_content_length, ContentLengthEnforcingBody,\n    };\n    use aws_smithy_runtime_api::http::Response;\n    use aws_smithy_types::body::SdkBody;\n    use aws_smithy_types::byte_stream::ByteStream;\n    use aws_smithy_types::error::display::DisplayErrorContext;\n    use bytes::Bytes;\n    use http_1x::header::CONTENT_LENGTH;\n    use http_body_1x::Frame;\n    use std::error::Error;\n    use std::pin::Pin;\n    use std::task::{Context, Poll};\n\n    /// Body for tests so we ensure our code works on a body split across multiple frames\n    struct ManyFrameBody {\n        data: Vec<u8>,\n    }\n\n    impl ManyFrameBody {\n        #[allow(clippy::new_ret_no_self)]\n        fn new(input: impl Into<String>) -> SdkBody {\n            let mut data = input.into().as_bytes().to_vec();\n            data.reverse();\n            SdkBody::from_body_1_x(Self { data })\n        }\n    }\n\n    impl http_body_1x::Body for ManyFrameBody {\n        type Data = Bytes;\n        type Error = <SdkBody as http_body_1x::Body>::Error;\n\n        fn poll_frame(\n            mut self: Pin<&mut Self>,\n            _cx: &mut Context<'_>,\n        ) -> Poll<Option<Result<Frame<Self::Data>, Self::Error>>> {\n            match self.data.pop() {\n                Some(next) => Poll::Ready(Some(Ok(Frame::data(Bytes::from(vec![next]))))),\n                None => Poll::Ready(None),\n            }\n        }\n    }\n\n    #[tokio::test]\n    async fn stream_too_short() {\n        let body = ManyFrameBody::new(\"123\");\n        let enforced = ContentLengthEnforcingBody::wrap(body, 10);\n        let err = expect_body_error(enforced).await;\n        assert_str_contains!(\n            format!(\"{}\", DisplayErrorContext(err)),\n            \"Expected 10 bytes but 3 bytes were received\"\n        );\n    }\n\n    #[tokio::test]\n    async fn stream_too_long() {\n        let body = ManyFrameBody::new(\"abcdefghijk\");\n        let enforced = ContentLengthEnforcingBody::wrap(body, 5);\n        let err = expect_body_error(enforced).await;\n        assert_str_contains!(\n            format!(\"{}\", DisplayErrorContext(err)),\n            \"Expected 5 bytes but 11 bytes were received\"\n        );\n    }\n\n    #[tokio::test]\n    async fn stream_just_right() {\n        use http_body_util::BodyExt;\n        let body = ManyFrameBody::new(\"abcdefghijk\");\n        let enforced = ContentLengthEnforcingBody::wrap(body, 11);\n        let data = enforced.collect().await.unwrap().to_bytes();\n        assert_eq!(b\"abcdefghijk\", data.as_ref());\n    }\n\n    async fn expect_body_error(body: SdkBody) -> impl Error {\n        ByteStream::new(body)\n            .collect()\n            .await\n            .expect_err(\"body should have failed\")\n    }\n\n    #[test]\n    fn extract_header() {\n        let mut resp1 = Response::new(200.try_into().unwrap(), ());\n        resp1.headers_mut().insert(CONTENT_LENGTH, \"123\");\n        assert_eq!(extract_content_length(&resp1).unwrap(), Some(123));\n        resp1.headers_mut().append(CONTENT_LENGTH, \"124\");\n        // duplicate content length header\n        extract_content_length(&resp1).expect_err(\"duplicate headers\");\n\n        // not an integer\n        resp1.headers_mut().insert(CONTENT_LENGTH, \"-123.5\");\n        extract_content_length(&resp1).expect_err(\"not an integer\");\n\n        // not an integer\n        resp1.headers_mut().insert(CONTENT_LENGTH, \"\");\n        extract_content_length(&resp1).expect_err(\"empty\");\n\n        resp1.headers_mut().remove(CONTENT_LENGTH);\n        assert_eq!(extract_content_length(&resp1).unwrap(), None);\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime/src/client/http/body/minimum_throughput/http_body_0_4_x.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse super::{BoxError, Error, MinimumThroughputDownloadBody};\nuse crate::client::http::body::minimum_throughput::throughput::DownloadReport;\nuse crate::client::http::body::minimum_throughput::ThroughputReadingBody;\nuse aws_smithy_async::rt::sleep::AsyncSleep;\nuse std::future::Future;\nuse std::pin::{pin, Pin};\nuse std::task::{Context, Poll};\n\nimpl<B> http_body_04x::Body for MinimumThroughputDownloadBody<B>\nwhere\n    B: http_body_04x::Body<Data = bytes::Bytes, Error = BoxError>,\n{\n    type Data = bytes::Bytes;\n    type Error = BoxError;\n\n    fn poll_data(\n        mut self: Pin<&mut Self>,\n        cx: &mut Context<'_>,\n    ) -> Poll<Option<Result<Self::Data, Self::Error>>> {\n        #[allow(unused_imports)]\n        use crate::client::http::body::minimum_throughput::throughput::ThroughputReport;\n        // this code is called quite frequently in production—one every millisecond or so when downloading\n        // a stream. However, SystemTime::now is on the order of nanoseconds\n        let now = self.time_source.now();\n        // Attempt to read the data from the inner body, then update the\n        // throughput logs.\n        let mut this = self.as_mut().project();\n        let poll_res = match this.inner.poll_data(cx) {\n            Poll::Ready(Some(Ok(bytes))) => {\n                tracing::trace!(\"received data: {}\", bytes.len());\n                this.throughput_logs\n                    .push_bytes_transferred(now, bytes.len() as u64);\n                Poll::Ready(Some(Ok(bytes)))\n            }\n            Poll::Pending => {\n                tracing::trace!(\"received poll pending\");\n                this.throughput_logs.push_pending(now);\n                Poll::Pending\n            }\n            // If we've read all the data or an error occurred, then return that result.\n            res => return res,\n        };\n\n        // Check the sleep future to see if it needs refreshing.\n        let mut sleep_fut = this\n            .sleep_fut\n            .take()\n            .unwrap_or_else(|| this.async_sleep.sleep(*this.resolution));\n        if let Poll::Ready(()) = pin!(&mut sleep_fut).poll(cx) {\n            tracing::trace!(\"sleep future triggered—triggering a wakeup\");\n            // Whenever the sleep future expires, we replace it.\n            sleep_fut = this.async_sleep.sleep(*this.resolution);\n\n            // We also schedule a wake up for current task to ensure that\n            // it gets polled at least one more time.\n            cx.waker().wake_by_ref();\n        };\n        this.sleep_fut.replace(sleep_fut);\n\n        // Calculate the current throughput and emit an error if it's too low and\n        // the grace period has elapsed.\n        let report = this.throughput_logs.report(now);\n        let (violated, current_throughput) =\n            report.minimum_throughput_violated(this.options.minimum_throughput());\n        if violated {\n            if this.grace_period_fut.is_none() {\n                tracing::debug!(\"entering minimum throughput grace period\");\n            }\n            let mut grace_period_fut = this\n                .grace_period_fut\n                .take()\n                .unwrap_or_else(|| this.async_sleep.sleep(this.options.grace_period()));\n            if let Poll::Ready(()) = pin!(&mut grace_period_fut).poll(cx) {\n                // The grace period has ended!\n                return Poll::Ready(Some(Err(Box::new(Error::ThroughputBelowMinimum {\n                    expected: self.options.minimum_throughput(),\n                    actual: current_throughput,\n                }))));\n            };\n            this.grace_period_fut.replace(grace_period_fut);\n        } else {\n            // Ensure we don't have an active grace period future if we're not\n            // currently below the minimum throughput.\n            if this.grace_period_fut.is_some() {\n                tracing::debug!(\"throughput recovered; exiting grace period\");\n            }\n            let _ = this.grace_period_fut.take();\n        }\n\n        poll_res\n    }\n\n    fn poll_trailers(\n        mut self: Pin<&mut Self>,\n        cx: &mut Context<'_>,\n    ) -> Poll<Result<Option<http_02x::HeaderMap>, Self::Error>> {\n        let this = self.as_mut().project();\n        this.inner.poll_trailers(cx)\n    }\n\n    fn is_end_stream(&self) -> bool {\n        self.inner.is_end_stream()\n    }\n\n    fn size_hint(&self) -> http_body_04x::SizeHint {\n        self.inner.size_hint()\n    }\n}\n\nimpl<B> http_body_04x::Body for ThroughputReadingBody<B>\nwhere\n    B: http_body_04x::Body<Data = bytes::Bytes, Error = BoxError>,\n{\n    type Data = bytes::Bytes;\n    type Error = BoxError;\n\n    fn poll_data(\n        mut self: Pin<&mut Self>,\n        cx: &mut Context<'_>,\n    ) -> Poll<Option<Result<Self::Data, Self::Error>>> {\n        // this code is called quite frequently in production—one every millisecond or so when downloading\n        // a stream. However, SystemTime::now is on the order of nanoseconds\n        let now = self.time_source.now();\n        // Attempt to read the data from the inner body, then update the\n        // throughput logs.\n        let this = self.as_mut().project();\n        match this.inner.poll_data(cx) {\n            Poll::Ready(Some(Ok(bytes))) => {\n                tracing::trace!(\"received data: {}\", bytes.len());\n                this.throughput\n                    .push_bytes_transferred(now, bytes.len() as u64);\n\n                // hyper will optimistically stop polling when end of stream is reported\n                // (e.g. when content-length amount of data has been consumed) which means\n                // we may never get to `Poll:Ready(None)`. Check for same condition and\n                // attempt to stop checking throughput violations _now_ as we may never\n                // get polled again. The caveat here is that it depends on `Body` implementations\n                // implementing `is_end_stream()` correctly. Users can also disable SSP as an\n                // alternative for such fringe use cases.\n                if self.is_end_stream() {\n                    tracing::trace!(\"stream reported end of stream before Poll::Ready(None) reached; marking stream complete\");\n                    self.throughput.mark_complete();\n                }\n                Poll::Ready(Some(Ok(bytes)))\n            }\n            Poll::Pending => {\n                tracing::trace!(\"received poll pending\");\n                this.throughput.push_pending(now);\n                Poll::Pending\n            }\n            // If we've read all the data or an error occurred, then return that result.\n            res => {\n                if this.throughput.mark_complete() {\n                    tracing::trace!(\"stream completed: {:?}\", res);\n                }\n                res\n            }\n        }\n    }\n\n    fn poll_trailers(\n        mut self: Pin<&mut Self>,\n        cx: &mut Context<'_>,\n    ) -> Poll<Result<Option<http_02x::HeaderMap>, Self::Error>> {\n        let this = self.as_mut().project();\n        this.inner.poll_trailers(cx)\n    }\n\n    fn is_end_stream(&self) -> bool {\n        self.inner.is_end_stream()\n    }\n\n    fn size_hint(&self) -> http_body_04x::SizeHint {\n        self.inner.size_hint()\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime/src/client/http/body/minimum_throughput/http_body_1_x.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse super::{BoxError, Error, MinimumThroughputDownloadBody};\nuse crate::client::http::body::minimum_throughput::throughput::DownloadReport;\nuse crate::client::http::body::minimum_throughput::ThroughputReadingBody;\nuse aws_smithy_async::rt::sleep::AsyncSleep;\nuse http_body_1x::Frame;\nuse std::future::Future;\nuse std::pin::{pin, Pin};\nuse std::task::{Context, Poll};\n\nimpl<B> http_body_1x::Body for MinimumThroughputDownloadBody<B>\nwhere\n    B: http_body_1x::Body<Data = bytes::Bytes, Error = BoxError>,\n{\n    type Data = bytes::Bytes;\n    type Error = BoxError;\n\n    fn poll_frame(\n        mut self: Pin<&mut Self>,\n        cx: &mut Context<'_>,\n    ) -> Poll<Option<Result<http_body_1x::Frame<Self::Data>, Self::Error>>> {\n        #[allow(unused_imports)]\n        use crate::client::http::body::minimum_throughput::throughput::ThroughputReport;\n        // this code is called quite frequently in production—one every millisecond or so when downloading\n        // a stream. However, SystemTime::now is on the order of nanoseconds\n        let now = self.time_source.now();\n        // Attempt to read the data from the inner body, then update the\n        // throughput logs.\n        let mut this = self.as_mut().project();\n        let poll_res = match this.inner.poll_frame(cx) {\n            Poll::Ready(Some(Ok(frame))) => {\n                if frame.is_data() {\n                    let bytes = frame.into_data().expect(\"Is data frame\");\n                    tracing::trace!(\"received data: {}\", bytes.len());\n                    this.throughput_logs\n                        .push_bytes_transferred(now, bytes.len() as u64);\n                    Poll::Ready(Some(Ok(Frame::data(bytes))))\n                } else {\n                    tracing::trace!(\"received trailer\");\n                    Poll::Ready(Some(Ok(frame)))\n                }\n            }\n            Poll::Pending => {\n                tracing::trace!(\"received poll pending\");\n                this.throughput_logs.push_pending(now);\n                Poll::Pending\n            }\n            // If we've read all the data or an error occurred, then return that result.\n            res => return res,\n        };\n\n        // Check the sleep future to see if it needs refreshing.\n        let mut sleep_fut = this\n            .sleep_fut\n            .take()\n            .unwrap_or_else(|| this.async_sleep.sleep(*this.resolution));\n        if let Poll::Ready(()) = pin!(&mut sleep_fut).poll(cx) {\n            tracing::trace!(\"sleep future triggered—triggering a wakeup\");\n            // Whenever the sleep future expires, we replace it.\n            sleep_fut = this.async_sleep.sleep(*this.resolution);\n\n            // We also schedule a wake up for current task to ensure that\n            // it gets polled at least one more time.\n            cx.waker().wake_by_ref();\n        };\n        this.sleep_fut.replace(sleep_fut);\n\n        // Calculate the current throughput and emit an error if it's too low and\n        // the grace period has elapsed.\n        let report = this.throughput_logs.report(now);\n        let (violated, current_throughput) =\n            report.minimum_throughput_violated(this.options.minimum_throughput());\n        if violated {\n            if this.grace_period_fut.is_none() {\n                tracing::debug!(\"entering minimum throughput grace period\");\n            }\n            let mut grace_period_fut = this\n                .grace_period_fut\n                .take()\n                .unwrap_or_else(|| this.async_sleep.sleep(this.options.grace_period()));\n            if let Poll::Ready(()) = pin!(&mut grace_period_fut).poll(cx) {\n                // The grace period has ended!\n                return Poll::Ready(Some(Err(Box::new(Error::ThroughputBelowMinimum {\n                    expected: self.options.minimum_throughput(),\n                    actual: current_throughput,\n                }))));\n            };\n            this.grace_period_fut.replace(grace_period_fut);\n        } else {\n            // Ensure we don't have an active grace period future if we're not\n            // currently below the minimum throughput.\n            if this.grace_period_fut.is_some() {\n                tracing::debug!(\"throughput recovered; exiting grace period\");\n            }\n            let _ = this.grace_period_fut.take();\n        }\n\n        poll_res\n    }\n\n    fn is_end_stream(&self) -> bool {\n        self.inner.is_end_stream()\n    }\n\n    fn size_hint(&self) -> http_body_1x::SizeHint {\n        self.inner.size_hint()\n    }\n}\n\nimpl<B> http_body_1x::Body for ThroughputReadingBody<B>\nwhere\n    B: http_body_1x::Body<Data = bytes::Bytes, Error = BoxError>,\n{\n    type Data = bytes::Bytes;\n    type Error = BoxError;\n\n    fn poll_frame(\n        mut self: Pin<&mut Self>,\n        cx: &mut Context<'_>,\n    ) -> Poll<Option<Result<Frame<Self::Data>, Self::Error>>> {\n        // this code is called quite frequently in production—one every millisecond or so when downloading\n        // a stream. However, SystemTime::now is on the order of nanoseconds\n        let now = self.time_source.now();\n        // Attempt to read the data from the inner body, then update the\n        // throughput logs.\n        let this = self.as_mut().project();\n        match this.inner.poll_frame(cx) {\n            Poll::Ready(Some(Ok(frame))) => {\n                if frame.is_data() {\n                    let bytes = frame.into_data().expect(\"Is data frame\");\n                    tracing::trace!(\"received data: {}\", bytes.len());\n                    this.throughput\n                        .push_bytes_transferred(now, bytes.len() as u64);\n\n                    // hyper will optimistically stop polling when end of stream is reported\n                    // (e.g. when content-length amount of data has been consumed) which means\n                    // we may never get to `Poll:Ready(None)`. Check for same condition and\n                    // attempt to stop checking throughput violations _now_ as we may never\n                    // get polled again. The caveat here is that it depends on `Body` implementations\n                    // implementing `is_end_stream()` correctly. Users can also disable SSP as an\n                    // alternative for such fringe use cases.\n                    if self.is_end_stream() {\n                        tracing::trace!(\"stream reported end of stream before Poll::Ready(None) reached; marking stream complete\");\n                        self.throughput.mark_complete();\n                    }\n                    Poll::Ready(Some(Ok(Frame::data(bytes))))\n                } else {\n                    Poll::Ready(Some(Ok(frame)))\n                }\n            }\n            Poll::Pending => {\n                tracing::trace!(\"received poll pending\");\n                this.throughput.push_pending(now);\n                Poll::Pending\n            }\n            // If we've read all the data or an error occurred, then return that result.\n            res => {\n                if this.throughput.mark_complete() {\n                    tracing::trace!(\"stream completed: {:?}\", res);\n                }\n                res\n            }\n        }\n    }\n\n    fn is_end_stream(&self) -> bool {\n        self.inner.is_end_stream()\n    }\n\n    fn size_hint(&self) -> http_body_1x::SizeHint {\n        self.inner.size_hint()\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime/src/client/http/body/minimum_throughput/options.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse super::Throughput;\nuse aws_smithy_runtime_api::client::stalled_stream_protection::{\n    StalledStreamProtectionConfig, DEFAULT_GRACE_PERIOD,\n};\nuse std::time::Duration;\n\n/// A collection of options for configuring a [`MinimumThroughputBody`](super::MinimumThroughputDownloadBody).\n#[derive(Debug, Clone)]\npub struct MinimumThroughputBodyOptions {\n    /// The minimum throughput that is acceptable.\n    minimum_throughput: Throughput,\n\n    /// The 'grace period' after which the minimum throughput will be enforced.\n    ///\n    /// If this is set to 0, the minimum throughput will be enforced immediately.\n    ///\n    /// If this is set to a positive value, whenever throughput is below the minimum throughput,\n    /// a timer is started. If the timer expires before throughput rises above the minimum,\n    /// an error is emitted.\n    ///\n    /// It is recommended to set this to a small value (e.g. 200ms) to avoid issues during\n    /// stream-startup.\n    grace_period: Duration,\n\n    /// The period of time to consider when computing the throughput\n    ///\n    /// This SHOULD be longer than the check interval, or stuck-streams may evade detection.\n    check_window: Duration,\n}\n\nimpl MinimumThroughputBodyOptions {\n    /// Create a new builder.\n    pub fn builder() -> MinimumThroughputBodyOptionsBuilder {\n        Default::default()\n    }\n\n    /// Convert this struct into a builder.\n    pub fn to_builder(self) -> MinimumThroughputBodyOptionsBuilder {\n        MinimumThroughputBodyOptionsBuilder::new()\n            .minimum_throughput(self.minimum_throughput)\n            .grace_period(self.grace_period)\n    }\n\n    /// The throughput check grace period.\n    ///\n    /// If throughput is below the minimum for longer than this period, an error is emitted.\n    ///\n    /// If this is set to 0, the minimum throughput will be enforced immediately.\n    pub fn grace_period(&self) -> Duration {\n        self.grace_period\n    }\n\n    /// The minimum acceptable throughput\n    pub fn minimum_throughput(&self) -> Throughput {\n        self.minimum_throughput\n    }\n\n    pub(crate) fn check_window(&self) -> Duration {\n        self.check_window\n    }\n\n    /// Not used. Always returns `Duration::from_millis(500)`.\n    #[deprecated(note = \"No longer used. Always returns Duration::from_millis(500)\")]\n    pub fn check_interval(&self) -> Duration {\n        Duration::from_millis(500)\n    }\n}\n\nconst DEFAULT_MINIMUM_THROUGHPUT: Throughput = Throughput {\n    bytes_read: 1,\n    per_time_elapsed: Duration::from_secs(1),\n};\n\nconst DEFAULT_CHECK_WINDOW: Duration = Duration::from_secs(1);\n\nimpl Default for MinimumThroughputBodyOptions {\n    fn default() -> Self {\n        Self {\n            minimum_throughput: DEFAULT_MINIMUM_THROUGHPUT,\n            grace_period: DEFAULT_GRACE_PERIOD,\n            check_window: DEFAULT_CHECK_WINDOW,\n        }\n    }\n}\n\n/// A builder for [`MinimumThroughputBodyOptions`]\n#[derive(Debug, Default, Clone)]\npub struct MinimumThroughputBodyOptionsBuilder {\n    minimum_throughput: Option<Throughput>,\n    check_window: Option<Duration>,\n    grace_period: Option<Duration>,\n}\n\nimpl MinimumThroughputBodyOptionsBuilder {\n    /// Create a new `MinimumThroughputBodyOptionsBuilder`.\n    pub fn new() -> Self {\n        Default::default()\n    }\n\n    /// Set the amount of time that throughput my fall below minimum before an error is emitted.\n    ///\n    /// If throughput rises above the minimum, the timer is reset.\n    pub fn grace_period(mut self, grace_period: Duration) -> Self {\n        self.set_grace_period(Some(grace_period));\n        self\n    }\n\n    /// Set the amount of time that throughput my fall below minimum before an error is emitted.\n    ///\n    /// If throughput rises above the minimum, the timer is reset.\n    pub fn set_grace_period(&mut self, grace_period: Option<Duration>) -> &mut Self {\n        self.grace_period = grace_period;\n        self\n    }\n\n    /// Set the minimum allowable throughput.\n    pub fn minimum_throughput(mut self, minimum_throughput: Throughput) -> Self {\n        self.set_minimum_throughput(Some(minimum_throughput));\n        self\n    }\n\n    /// Set the minimum allowable throughput.\n    pub fn set_minimum_throughput(&mut self, minimum_throughput: Option<Throughput>) -> &mut Self {\n        self.minimum_throughput = minimum_throughput;\n        self\n    }\n\n    /// No longer used. The check interval is now based on the check window (not currently configurable).\n    #[deprecated(\n        note = \"No longer used. The check interval is now based on the check window (not currently configurable). Open an issue if you need to configure the check window.\"\n    )]\n    pub fn check_interval(self, _check_interval: Duration) -> Self {\n        self\n    }\n\n    /// No longer used. The check interval is now based on the check window (not currently configurable).\n    #[deprecated(\n        note = \"No longer used. The check interval is now based on the check window (not currently configurable). Open an issue if you need to configure the check window.\"\n    )]\n    pub fn set_check_interval(&mut self, _check_interval: Option<Duration>) -> &mut Self {\n        self\n    }\n\n    #[allow(unused)]\n    pub(crate) fn check_window(mut self, check_window: Duration) -> Self {\n        self.set_check_window(Some(check_window));\n        self\n    }\n    #[allow(unused)]\n    pub(crate) fn set_check_window(&mut self, check_window: Option<Duration>) -> &mut Self {\n        self.check_window = check_window;\n        self\n    }\n\n    /// Build this builder, producing a [`MinimumThroughputBodyOptions`].\n    ///\n    /// Unset fields will be set with defaults.\n    pub fn build(self) -> MinimumThroughputBodyOptions {\n        MinimumThroughputBodyOptions {\n            grace_period: self.grace_period.unwrap_or(DEFAULT_GRACE_PERIOD),\n            minimum_throughput: self\n                .minimum_throughput\n                .unwrap_or(DEFAULT_MINIMUM_THROUGHPUT),\n            check_window: self.check_window.unwrap_or(DEFAULT_CHECK_WINDOW),\n        }\n    }\n}\n\nimpl From<StalledStreamProtectionConfig> for MinimumThroughputBodyOptions {\n    fn from(value: StalledStreamProtectionConfig) -> Self {\n        MinimumThroughputBodyOptions {\n            grace_period: value.grace_period(),\n            minimum_throughput: DEFAULT_MINIMUM_THROUGHPUT,\n            check_window: DEFAULT_CHECK_WINDOW,\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime/src/client/http/body/minimum_throughput/throughput.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::fmt;\nuse std::time::{Duration, SystemTime};\n\n/// Throughput representation for use when configuring [`super::MinimumThroughputBody`]\n#[derive(Debug, Clone, Copy)]\n#[cfg_attr(test, derive(Eq))]\npub struct Throughput {\n    pub(super) bytes_read: u64,\n    pub(super) per_time_elapsed: Duration,\n}\n\nimpl Throughput {\n    /// Create a new throughput with the given bytes read and time elapsed.\n    pub fn new(bytes_read: u64, per_time_elapsed: Duration) -> Self {\n        debug_assert!(\n            !per_time_elapsed.is_zero(),\n            \"cannot create a throughput if per_time_elapsed == 0\"\n        );\n\n        Self {\n            bytes_read,\n            per_time_elapsed,\n        }\n    }\n\n    /// Create a new throughput in bytes per second.\n    pub const fn new_bytes_per_second(bytes: u64) -> Self {\n        Self {\n            bytes_read: bytes,\n            per_time_elapsed: Duration::from_secs(1),\n        }\n    }\n\n    /// Create a new throughput in kilobytes per second.\n    pub const fn new_kilobytes_per_second(kilobytes: u64) -> Self {\n        Self {\n            bytes_read: kilobytes * 1000,\n            per_time_elapsed: Duration::from_secs(1),\n        }\n    }\n\n    /// Create a new throughput in megabytes per second.\n    pub const fn new_megabytes_per_second(megabytes: u64) -> Self {\n        Self {\n            bytes_read: megabytes * 1000 * 1000,\n            per_time_elapsed: Duration::from_secs(1),\n        }\n    }\n\n    pub(super) fn bytes_per_second(&self) -> f64 {\n        let per_time_elapsed_secs = self.per_time_elapsed.as_secs_f64();\n        if per_time_elapsed_secs == 0.0 {\n            return 0.0; // Avoid dividing by zero.\n        };\n\n        self.bytes_read as f64 / per_time_elapsed_secs\n    }\n}\n\nimpl PartialEq for Throughput {\n    fn eq(&self, other: &Self) -> bool {\n        self.bytes_per_second() == other.bytes_per_second()\n    }\n}\n\nimpl PartialOrd for Throughput {\n    fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {\n        self.bytes_per_second()\n            .partial_cmp(&other.bytes_per_second())\n    }\n}\n\nimpl fmt::Display for Throughput {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        // The default float formatting behavior will ensure the a number like 2.000 is rendered as 2\n        // while a number like 0.9982107441748642 will be rendered as 0.9982107441748642. This\n        // multiplication and division will truncate a float to have a precision of no greater than 3.\n        // For example, 0.9982107441748642 would become 0.999. This will fail for very large floats\n        // but should suffice for the numbers we're dealing with.\n        let pretty_bytes_per_second = (self.bytes_per_second() * 1000.0).round() / 1000.0;\n\n        write!(f, \"{pretty_bytes_per_second} B/s\")\n    }\n}\n\nimpl From<(u64, Duration)> for Throughput {\n    fn from(value: (u64, Duration)) -> Self {\n        Self {\n            bytes_read: value.0,\n            per_time_elapsed: value.1,\n        }\n    }\n}\n\n/// Overall label for a given bin.\n#[derive(Copy, Clone, Debug, Ord, PartialOrd, Eq, PartialEq)]\nenum BinLabel {\n    // IMPORTANT: The order of these enums matters since it represents their priority:\n    // TransferredBytes > Pending > NoPolling > Empty\n    //\n    /// There is no data in this bin.\n    Empty,\n\n    /// No polling took place during this bin.\n    NoPolling,\n\n    /// The user/remote was not providing/consuming data fast enough during this bin.\n    Pending,\n\n    /// This many bytes were transferred during this bin.\n    TransferredBytes,\n}\n\n/// Represents a bin (or a cell) in a linear grid that represents a small chunk of time.\n#[derive(Copy, Clone, Debug)]\nstruct Bin {\n    label: BinLabel,\n    bytes: u64,\n}\n\nimpl Bin {\n    const fn new(label: BinLabel, bytes: u64) -> Self {\n        Self { label, bytes }\n    }\n    const fn empty() -> Self {\n        Self::new(BinLabel::Empty, 0)\n    }\n\n    fn is_empty(&self) -> bool {\n        matches!(self.label, BinLabel::Empty)\n    }\n\n    fn merge(&mut self, other: Bin) -> &mut Self {\n        // Assign values based on this priority order (highest priority higher up):\n        //   1. TransferredBytes\n        //   2. Pending\n        //   3. NoPolling\n        //   4. Empty\n        self.label = if other.label > self.label {\n            other.label\n        } else {\n            self.label\n        };\n        self.bytes += other.bytes;\n        self\n    }\n\n    /// Number of bytes transferred during this bin\n    fn bytes(&self) -> u64 {\n        self.bytes\n    }\n}\n\n#[derive(Copy, Clone, Debug, Default)]\nstruct BinCounts {\n    /// Number of bins with no data.\n    empty: usize,\n    /// Number of \"no polling\" bins.\n    no_polling: usize,\n    /// Number of \"bytes transferred\" bins.\n    transferred: usize,\n    /// Number of \"pending\" bins.\n    pending: usize,\n}\n\n/// Underlying stack-allocated linear grid buffer for tracking\n/// throughput events for [`ThroughputLogs`].\n#[derive(Copy, Clone, Debug)]\nstruct LogBuffer<const N: usize> {\n    entries: [Bin; N],\n    // The length only needs to exist so that the `fill_gaps` function\n    // can differentiate between `Empty` due to there not having been enough\n    // time to establish a full buffer worth of data vs. `Empty` due to a\n    // polling gap. Once the length reaches N, it will never change again.\n    length: usize,\n}\n\nimpl<const N: usize> LogBuffer<N> {\n    fn new() -> Self {\n        Self {\n            entries: [Bin::empty(); N],\n            length: 0,\n        }\n    }\n\n    /// Mutably returns the tail of the buffer.\n    ///\n    /// ## Panics\n    ///\n    /// The buffer MUST have at least one bin in it before this is called.\n    fn tail_mut(&mut self) -> &mut Bin {\n        debug_assert!(self.length > 0);\n        &mut self.entries[self.length - 1]\n    }\n\n    /// Pushes a bin into the buffer. If the buffer is already full,\n    /// then this will rotate the entire buffer to the left.\n    fn push(&mut self, bin: Bin) {\n        if self.filled() {\n            self.entries.rotate_left(1);\n            self.entries[N - 1] = bin;\n        } else {\n            self.entries[self.length] = bin;\n            self.length += 1;\n        }\n    }\n\n    /// Returns the total number of bytes transferred within the time window.\n    fn bytes_transferred(&self) -> u64 {\n        self.entries.iter().take(self.length).map(Bin::bytes).sum()\n    }\n\n    #[inline]\n    fn filled(&self) -> bool {\n        self.length == N\n    }\n\n    /// Fills in missing NoData entries.\n    ///\n    /// We want NoData entries to represent when a future hasn't been polled.\n    /// Since the future is in charge of logging in the first place, the only\n    /// way we can know about these is by examining gaps in time.\n    fn fill_gaps(&mut self) {\n        for entry in self.entries.iter_mut().take(self.length) {\n            if entry.is_empty() {\n                *entry = Bin::new(BinLabel::NoPolling, 0);\n            }\n        }\n    }\n\n    /// Returns the counts of each bin type in the buffer.\n    fn counts(&self) -> BinCounts {\n        let mut counts = BinCounts::default();\n        for entry in &self.entries {\n            match entry.label {\n                BinLabel::Empty => counts.empty += 1,\n                BinLabel::NoPolling => counts.no_polling += 1,\n                BinLabel::TransferredBytes => counts.transferred += 1,\n                BinLabel::Pending => counts.pending += 1,\n            }\n        }\n        counts\n    }\n\n    /// If this LogBuffer is empty, returns `true`. Else, returns `false`.\n    fn is_empty(&self) -> bool {\n        self.length == 0\n    }\n}\n\n/// Report/summary of all the events in a time window.\n#[cfg_attr(test, derive(Debug, Eq, PartialEq))]\npub(crate) enum ThroughputReport {\n    /// Not enough data to draw any conclusions. This happens early in a request/response.\n    Incomplete,\n    /// The stream hasn't been polled for most of this time window.\n    NoPolling,\n    /// The stream has been waiting for most of the time window.\n    Pending,\n    /// The stream transferred this amount of throughput during the time window.\n    Transferred(Throughput),\n    /// The stream has completed, no more data is expected.\n    Complete,\n}\n\nconst BIN_COUNT: usize = 10;\n\n/// Log of throughput in a request or response stream.\n///\n/// Used to determine if a configured minimum throughput is being met or not\n/// so that a request or response stream can be timed out in the event of a\n/// stall.\n///\n/// Request/response streams push data transfer or pending events to this log\n/// based on what's going on in their poll functions. The log tracks three kinds\n/// of events despite only receiving two: the third is \"no polling\". The poll\n/// functions cannot know when they're not being polled, so the log examines gaps\n/// in the event history to know when no polling took place.\n///\n/// The event logging is simplified down to a linear grid consisting of 10 \"bins\",\n/// with each bin representing 1/10th the total time window. When an event is pushed,\n/// it is either merged into the current tail bin, or all the bins are rotated\n/// left to create a new empty tail bin, and then it is merged into that one.\n#[derive(Clone, Debug)]\npub(super) struct ThroughputLogs {\n    resolution: Duration,\n    current_tail: SystemTime,\n    buffer: LogBuffer<BIN_COUNT>,\n    stream_complete: bool,\n}\n\nimpl ThroughputLogs {\n    /// Creates a new log starting at `now` with the given `time_window`.\n    ///\n    /// Note: the `time_window` gets divided by 10 to create smaller sub-windows\n    /// to track throughput. The time window should be configured to be large enough\n    /// so that these sub-windows aren't too small for network-based events.\n    /// A time window of 10ms probably won't work, but 500ms might. The default\n    /// is one second.\n    pub(super) fn new(time_window: Duration, now: SystemTime) -> Self {\n        assert!(!time_window.is_zero());\n        let resolution = time_window.div_f64(BIN_COUNT as f64);\n        Self {\n            resolution,\n            current_tail: now,\n            buffer: LogBuffer::new(),\n            stream_complete: false,\n        }\n    }\n\n    /// Returns the resolution at which events are logged at.\n    ///\n    /// The resolution is the number of bins in the time window.\n    pub(super) fn resolution(&self) -> Duration {\n        self.resolution\n    }\n\n    /// Pushes a \"pending\" event.\n    ///\n    /// Pending indicates the streaming future is waiting for something.\n    /// In an upload, it is waiting for data from the user, and in a download,\n    /// it is waiting for data from the server.\n    pub(super) fn push_pending(&mut self, time: SystemTime) {\n        self.push(time, Bin::new(BinLabel::Pending, 0));\n    }\n\n    /// Pushes a data transferred event.\n    ///\n    /// Indicates that this number of bytes were transferred at this time.\n    pub(super) fn push_bytes_transferred(&mut self, time: SystemTime, bytes: u64) {\n        self.push(time, Bin::new(BinLabel::TransferredBytes, bytes));\n    }\n\n    fn push(&mut self, now: SystemTime, value: Bin) {\n        self.catch_up(now);\n        if self.buffer.is_empty() {\n            self.buffer.push(value)\n        } else {\n            self.buffer.tail_mut().merge(value);\n        }\n        self.buffer.fill_gaps();\n    }\n\n    /// Pushes empty bins until `current_tail` is caught up to `now`.\n    fn catch_up(&mut self, now: SystemTime) {\n        while now >= self.current_tail {\n            self.current_tail += self.resolution;\n            self.buffer.push(Bin::empty());\n        }\n        assert!(self.current_tail >= now);\n    }\n\n    /// Mark the stream complete indicating no more data is expected. This is an\n    /// idempotent operation -- subsequent invocations of this function have no effect\n    /// and return false.\n    ///\n    /// After marking a stream complete [report](#method.report) will forever more return\n    /// [ThroughputReport::Complete]\n    pub(super) fn mark_complete(&mut self) -> bool {\n        let prev = self.stream_complete;\n        self.stream_complete = true;\n        !prev\n    }\n\n    /// Generates an overall report of the time window.\n    pub(super) fn report(&mut self, now: SystemTime) -> ThroughputReport {\n        if self.stream_complete {\n            return ThroughputReport::Complete;\n        }\n\n        self.catch_up(now);\n        self.buffer.fill_gaps();\n\n        let BinCounts {\n            empty,\n            no_polling,\n            transferred,\n            pending,\n        } = self.buffer.counts();\n\n        // If there are any empty cells at all, then we haven't been tracking\n        // long enough to make any judgements about the stream's progress.\n        if empty > 0 {\n            return ThroughputReport::Incomplete;\n        }\n\n        let bytes = self.buffer.bytes_transferred();\n        let time = self.resolution * (BIN_COUNT - empty) as u32;\n        let throughput = Throughput::new(bytes, time);\n\n        let half = BIN_COUNT / 2;\n        match (transferred > 0, no_polling >= half, pending >= half) {\n            (true, _, _) => ThroughputReport::Transferred(throughput),\n            (_, true, _) => ThroughputReport::NoPolling,\n            (_, _, true) => ThroughputReport::Pending,\n            _ => ThroughputReport::Incomplete,\n        }\n    }\n}\n\nconst ZERO_THROUGHPUT: Throughput = Throughput::new_bytes_per_second(0);\n// Helper trait for interpreting the throughput report.\npub(crate) trait DownloadReport {\n    fn minimum_throughput_violated(self, minimum_throughput: Throughput) -> (bool, Throughput);\n}\nimpl DownloadReport for ThroughputReport {\n    fn minimum_throughput_violated(self, minimum_throughput: Throughput) -> (bool, Throughput) {\n        let throughput = match self {\n            ThroughputReport::Complete => return (false, ZERO_THROUGHPUT),\n            // If the report is incomplete, then we don't have enough data yet to\n            // decide if minimum throughput was violated.\n            ThroughputReport::Incomplete => {\n                tracing::trace!(\n                    \"not enough data to decide if minimum throughput has been violated\"\n                );\n                return (false, ZERO_THROUGHPUT);\n            }\n            // If no polling is taking place, then the user has stalled.\n            // In this case, we don't want to say minimum throughput was violated.\n            ThroughputReport::NoPolling => {\n                tracing::debug!(\n                    \"the user has stalled; this will not become a minimum throughput violation\"\n                );\n                return (false, ZERO_THROUGHPUT);\n            }\n            // If we're stuck in Poll::Pending, then the server has stalled. Alternatively,\n            // if we're transferring data, but it's too slow, then we also want to say\n            // that the minimum throughput has been violated.\n            ThroughputReport::Pending => ZERO_THROUGHPUT,\n            ThroughputReport::Transferred(tp) => tp,\n        };\n        let violated = throughput < minimum_throughput;\n        if violated {\n            tracing::debug!(\n                \"current throughput: {throughput} is below minimum: {minimum_throughput}\"\n            );\n        }\n        (violated, throughput)\n    }\n}\n\n#[cfg(test)]\nmod test {\n    use super::*;\n    use std::time::Duration;\n\n    #[test]\n    fn test_log_buffer_bin_label_priority() {\n        use BinLabel::*;\n        assert!(Empty < NoPolling);\n        assert!(NoPolling < Pending);\n        assert!(Pending < TransferredBytes);\n    }\n\n    #[test]\n    fn test_throughput_eq() {\n        let t1 = Throughput::new(1, Duration::from_secs(1));\n        let t2 = Throughput::new(25, Duration::from_secs(25));\n        let t3 = Throughput::new(100, Duration::from_secs(100));\n\n        assert_eq!(t1, t2);\n        assert_eq!(t2, t3);\n    }\n\n    #[test]\n    fn incomplete_no_entries() {\n        let start = SystemTime::UNIX_EPOCH;\n        let mut logs = ThroughputLogs::new(Duration::from_secs(1), start);\n        let report = logs.report(start);\n        assert_eq!(ThroughputReport::Incomplete, report);\n    }\n\n    #[test]\n    fn incomplete_with_entries() {\n        let start = SystemTime::UNIX_EPOCH;\n        let mut logs = ThroughputLogs::new(Duration::from_secs(1), start);\n        logs.push_pending(start);\n\n        let report = logs.report(start + Duration::from_millis(300));\n        assert_eq!(ThroughputReport::Incomplete, report);\n    }\n\n    #[test]\n    fn incomplete_with_transferred() {\n        let start = SystemTime::UNIX_EPOCH;\n        let mut logs = ThroughputLogs::new(Duration::from_secs(1), start);\n        logs.push_pending(start);\n        logs.push_bytes_transferred(start + Duration::from_millis(100), 10);\n\n        let report = logs.report(start + Duration::from_millis(300));\n        assert_eq!(ThroughputReport::Incomplete, report);\n    }\n\n    #[test]\n    fn push_pending_at_the_beginning_of_each_tick() {\n        let start = SystemTime::UNIX_EPOCH;\n        let mut logs = ThroughputLogs::new(Duration::from_secs(1), start);\n\n        let mut now = start;\n        for i in 1..=BIN_COUNT {\n            logs.push_pending(now);\n            now += logs.resolution();\n\n            assert_eq!(i, logs.buffer.counts().pending);\n        }\n\n        let report = dbg!(&mut logs).report(now);\n        assert_eq!(ThroughputReport::Pending, report);\n    }\n\n    #[test]\n    fn push_pending_at_the_end_of_each_tick() {\n        let start = SystemTime::UNIX_EPOCH;\n        let mut logs = ThroughputLogs::new(Duration::from_secs(1), start);\n\n        let mut now = start;\n        for i in 1..BIN_COUNT {\n            now += logs.resolution();\n            logs.push_pending(now);\n\n            assert_eq!(i, dbg!(&logs).buffer.counts().pending);\n            assert_eq!(0, logs.buffer.counts().transferred);\n            assert_eq!(1, logs.buffer.counts().no_polling);\n        }\n        // This should replace the initial \"no polling\" bin\n        now += logs.resolution();\n        logs.push_pending(now);\n        assert_eq!(0, logs.buffer.counts().no_polling);\n\n        let report = dbg!(&mut logs).report(now);\n        assert_eq!(ThroughputReport::Pending, report);\n    }\n\n    #[test]\n    fn push_transferred_at_the_beginning_of_each_tick() {\n        let start = SystemTime::UNIX_EPOCH;\n        let mut logs = ThroughputLogs::new(Duration::from_secs(1), start);\n\n        let mut now = start;\n        for i in 1..=BIN_COUNT {\n            logs.push_bytes_transferred(now, 10);\n            if i != BIN_COUNT {\n                now += logs.resolution();\n            }\n\n            assert_eq!(i, logs.buffer.counts().transferred);\n            assert_eq!(0, logs.buffer.counts().pending);\n            assert_eq!(0, logs.buffer.counts().no_polling);\n        }\n\n        let report = dbg!(&mut logs).report(now);\n        assert_eq!(\n            ThroughputReport::Transferred(Throughput::new(100, Duration::from_secs(1))),\n            report\n        );\n    }\n\n    #[test]\n    fn no_polling() {\n        let start = SystemTime::UNIX_EPOCH;\n        let mut logs = ThroughputLogs::new(Duration::from_secs(1), start);\n        let report = logs.report(start + Duration::from_secs(2));\n        assert_eq!(ThroughputReport::NoPolling, report);\n    }\n\n    // Transferred bytes MUST take priority over pending when reporting throughput\n    #[test]\n    fn mixed_bag_mostly_pending() {\n        let start = SystemTime::UNIX_EPOCH;\n        let mut logs = ThroughputLogs::new(Duration::from_secs(1), start);\n\n        logs.push_bytes_transferred(start + Duration::from_millis(50), 10);\n        logs.push_pending(start + Duration::from_millis(150));\n        logs.push_pending(start + Duration::from_millis(250));\n        logs.push_bytes_transferred(start + Duration::from_millis(350), 10);\n        logs.push_pending(start + Duration::from_millis(450));\n        // skip 550\n        logs.push_pending(start + Duration::from_millis(650));\n        logs.push_pending(start + Duration::from_millis(750));\n        logs.push_pending(start + Duration::from_millis(850));\n\n        let report = logs.report(start + Duration::from_millis(999));\n        assert_eq!(\n            ThroughputReport::Transferred(Throughput::new_bytes_per_second(20)),\n            report\n        );\n    }\n\n    #[test]\n    fn mixed_bag_mostly_pending_no_transferred() {\n        let start = SystemTime::UNIX_EPOCH;\n        let mut logs = ThroughputLogs::new(Duration::from_secs(1), start);\n\n        logs.push_pending(start + Duration::from_millis(50));\n        logs.push_pending(start + Duration::from_millis(150));\n        logs.push_pending(start + Duration::from_millis(250));\n        // skip 350\n        logs.push_pending(start + Duration::from_millis(450));\n        // skip 550\n        logs.push_pending(start + Duration::from_millis(650));\n        logs.push_pending(start + Duration::from_millis(750));\n        logs.push_pending(start + Duration::from_millis(850));\n\n        let report = logs.report(start + Duration::from_millis(999));\n        assert_eq!(ThroughputReport::Pending, report);\n    }\n\n    #[test]\n    fn test_first_push_succeeds_although_time_window_has_not_elapsed() {\n        let t0 = SystemTime::UNIX_EPOCH;\n        let t1 = t0 + Duration::from_secs(1);\n        let mut tl = ThroughputLogs::new(Duration::from_secs(1), t1);\n\n        tl.push_pending(t0);\n    }\n\n    #[test]\n    fn test_label_transferred_bytes_should_not_be_overwritten_by_pending() {\n        let start = SystemTime::UNIX_EPOCH;\n        // Each `Bin`'s resolution is 100ms (1s / BIN_COUNT), where `BIN_COUNT` is 10\n        let mut logs = ThroughputLogs::new(Duration::from_secs(1), start);\n\n        // push `TransferredBytes` and then `Pending` in the same first `Bin`\n        logs.push_bytes_transferred(start + Duration::from_millis(10), 10);\n        logs.push_pending(start + Duration::from_millis(20));\n\n        let BinCounts {\n            empty,\n            no_polling,\n            transferred,\n            pending,\n        } = logs.buffer.counts();\n\n        assert_eq!(9, empty);\n        assert_eq!(0, no_polling);\n        assert_eq!(1, transferred); // `transferred` should still be there\n        assert_eq!(0, pending); // while `pending` should cease to exist, failing to overwrite `transferred`\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime/src/client/http/body/minimum_throughput.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! A body-wrapping type that ensures data is being streamed faster than some lower limit.\n//!\n//! If data is being streamed too slowly, this body type will emit an error next time it's polled.\n\n/// An implementation of v0.4 `http_body::Body` for `MinimumThroughputBody` and related code.\npub mod http_body_0_4_x;\n\n/// An implementation of v1.0 `http_body::Body` for `MinimumThroughputBody` and related code.\npub mod http_body_1_x;\n\n/// Options for a [`MinimumThroughputBody`].\npub mod options;\npub use throughput::Throughput;\nmod throughput;\n\nuse crate::client::http::body::minimum_throughput::throughput::ThroughputReport;\nuse aws_smithy_async::rt::sleep::Sleep;\nuse aws_smithy_async::rt::sleep::{AsyncSleep, SharedAsyncSleep};\nuse aws_smithy_async::time::{SharedTimeSource, TimeSource};\nuse aws_smithy_runtime_api::{\n    box_error::BoxError,\n    client::{\n        http::HttpConnectorFuture, result::ConnectorError, runtime_components::RuntimeComponents,\n        stalled_stream_protection::StalledStreamProtectionConfig,\n    },\n};\nuse aws_smithy_runtime_api::{client::orchestrator::HttpResponse, shared::IntoShared};\nuse aws_smithy_types::config_bag::{ConfigBag, Storable, StoreReplace};\nuse options::MinimumThroughputBodyOptions;\nuse std::{\n    fmt,\n    sync::{Arc, Mutex},\n    task::Poll,\n};\nuse std::{future::Future, pin::Pin};\nuse std::{\n    task::Context,\n    time::{Duration, SystemTime},\n};\nuse throughput::ThroughputLogs;\n\n/// Use [`MinimumThroughputDownloadBody`] instead.\n#[deprecated(note = \"Renamed to MinimumThroughputDownloadBody since it doesn't work for uploads\")]\npub type MinimumThroughputBody<B> = MinimumThroughputDownloadBody<B>;\n\npin_project_lite::pin_project! {\n    /// A body-wrapping type that ensures data is being streamed faster than some lower limit.\n    ///\n    /// If data is being streamed too slowly, this body type will emit an error next time it's polled.\n    pub struct MinimumThroughputDownloadBody<B> {\n        async_sleep: SharedAsyncSleep,\n        time_source: SharedTimeSource,\n        options: MinimumThroughputBodyOptions,\n        throughput_logs: ThroughputLogs,\n        resolution: Duration,\n        #[pin]\n        sleep_fut: Option<Sleep>,\n        #[pin]\n        grace_period_fut: Option<Sleep>,\n        #[pin]\n        inner: B,\n    }\n}\n\nimpl<B> MinimumThroughputDownloadBody<B> {\n    /// Create a new minimum throughput body.\n    pub fn new(\n        time_source: impl TimeSource + 'static,\n        async_sleep: impl AsyncSleep + 'static,\n        body: B,\n        options: MinimumThroughputBodyOptions,\n    ) -> Self {\n        let time_source: SharedTimeSource = time_source.into_shared();\n        let now = time_source.now();\n        let throughput_logs = ThroughputLogs::new(options.check_window(), now);\n        let resolution = throughput_logs.resolution();\n        Self {\n            throughput_logs,\n            resolution,\n            async_sleep: async_sleep.into_shared(),\n            time_source,\n            inner: body,\n            sleep_fut: None,\n            grace_period_fut: None,\n            options,\n        }\n    }\n}\n\n#[derive(Debug, PartialEq)]\nenum Error {\n    ThroughputBelowMinimum {\n        expected: Throughput,\n        actual: Throughput,\n    },\n}\n\nimpl fmt::Display for Error {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        match self {\n            Self::ThroughputBelowMinimum { expected, actual } => {\n                write!(\n                    f,\n                    \"minimum throughput was specified at {expected}, but throughput of {actual} was observed\",\n                )\n            }\n        }\n    }\n}\n\nimpl std::error::Error for Error {}\n\n/// Used to store the upload throughput in the interceptor context.\n#[derive(Clone, Debug)]\npub(crate) struct UploadThroughput {\n    logs: Arc<Mutex<ThroughputLogs>>,\n}\n\nimpl UploadThroughput {\n    pub(crate) fn new(time_window: Duration, now: SystemTime) -> Self {\n        Self {\n            logs: Arc::new(Mutex::new(ThroughputLogs::new(time_window, now))),\n        }\n    }\n\n    pub(crate) fn resolution(&self) -> Duration {\n        self.logs.lock().unwrap().resolution()\n    }\n\n    pub(crate) fn push_pending(&self, now: SystemTime) {\n        self.logs.lock().unwrap().push_pending(now);\n    }\n    pub(crate) fn push_bytes_transferred(&self, now: SystemTime, bytes: u64) {\n        self.logs.lock().unwrap().push_bytes_transferred(now, bytes);\n    }\n\n    pub(crate) fn mark_complete(&self) -> bool {\n        self.logs.lock().unwrap().mark_complete()\n    }\n\n    pub(crate) fn report(&self, now: SystemTime) -> ThroughputReport {\n        self.logs.lock().unwrap().report(now)\n    }\n}\n\nimpl Storable for UploadThroughput {\n    type Storer = StoreReplace<Self>;\n}\n\npin_project_lite::pin_project! {\n    pub(crate) struct ThroughputReadingBody<B> {\n        time_source: SharedTimeSource,\n        throughput: UploadThroughput,\n        #[pin]\n        inner: B,\n    }\n}\n\nimpl<B> ThroughputReadingBody<B> {\n    pub(crate) fn new(\n        time_source: SharedTimeSource,\n        throughput: UploadThroughput,\n        body: B,\n    ) -> Self {\n        Self {\n            time_source,\n            throughput,\n            inner: body,\n        }\n    }\n}\n\nconst ZERO_THROUGHPUT: Throughput = Throughput::new_bytes_per_second(0);\n\n// Helper trait for interpretting the throughput report.\ntrait UploadReport {\n    fn minimum_throughput_violated(self, minimum_throughput: Throughput) -> (bool, Throughput);\n}\nimpl UploadReport for ThroughputReport {\n    fn minimum_throughput_violated(self, minimum_throughput: Throughput) -> (bool, Throughput) {\n        let throughput = match self {\n            // stream has been exhausted, stop tracking violations\n            ThroughputReport::Complete => return (false, ZERO_THROUGHPUT),\n            // If the report is incomplete, then we don't have enough data yet to\n            // decide if minimum throughput was violated.\n            ThroughputReport::Incomplete => {\n                tracing::trace!(\n                    \"not enough data to decide if minimum throughput has been violated\"\n                );\n                return (false, ZERO_THROUGHPUT);\n            }\n            // If most of the datapoints are Poll::Pending, then the user has stalled.\n            // In this case, we don't want to say minimum throughput was violated.\n            ThroughputReport::Pending => {\n                tracing::debug!(\n                    \"the user has stalled; this will not become a minimum throughput violation\"\n                );\n                return (false, ZERO_THROUGHPUT);\n            }\n            // If there has been no polling, then the server has stalled. Alternatively,\n            // if we're transferring data, but it's too slow, then we also want to say\n            // that the minimum throughput has been violated.\n            ThroughputReport::NoPolling => ZERO_THROUGHPUT,\n            ThroughputReport::Transferred(tp) => tp,\n        };\n        if throughput < minimum_throughput {\n            tracing::debug!(\n                \"current throughput: {throughput} is below minimum: {minimum_throughput}\"\n            );\n            (true, throughput)\n        } else {\n            (false, throughput)\n        }\n    }\n}\n\npin_project_lite::pin_project! {\n    /// Future that pairs with [`UploadThroughput`] to add a minimum throughput\n    /// requirement to a request upload stream.\n    pub(crate) struct UploadThroughputCheckFuture {\n        #[pin]\n        response: HttpConnectorFuture,\n        #[pin]\n        check_interval: Option<Sleep>,\n        #[pin]\n        grace_period: Option<Sleep>,\n\n        time_source: SharedTimeSource,\n        sleep_impl: SharedAsyncSleep,\n        upload_throughput: UploadThroughput,\n        resolution: Duration,\n        options: MinimumThroughputBodyOptions,\n\n        failing_throughput: Option<Throughput>,\n    }\n}\n\nimpl UploadThroughputCheckFuture {\n    fn new(\n        response: HttpConnectorFuture,\n        time_source: SharedTimeSource,\n        sleep_impl: SharedAsyncSleep,\n        upload_throughput: UploadThroughput,\n        options: MinimumThroughputBodyOptions,\n    ) -> Self {\n        let resolution = upload_throughput.resolution();\n        Self {\n            response,\n            check_interval: Some(sleep_impl.sleep(resolution)),\n            grace_period: None,\n            time_source,\n            sleep_impl,\n            upload_throughput,\n            resolution,\n            options,\n            failing_throughput: None,\n        }\n    }\n}\n\nimpl Future for UploadThroughputCheckFuture {\n    type Output = Result<HttpResponse, ConnectorError>;\n\n    fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {\n        let mut this = self.project();\n\n        if let Poll::Ready(output) = this.response.poll(cx) {\n            return Poll::Ready(output);\n        } else {\n            let mut below_minimum_throughput = false;\n            let check_interval_expired = this\n                .check_interval\n                .as_mut()\n                .as_pin_mut()\n                .expect(\"always set\")\n                .poll(cx)\n                .is_ready();\n            if check_interval_expired {\n                // Set up the next check interval\n                *this.check_interval = Some(this.sleep_impl.sleep(*this.resolution));\n\n                // Wake so that the check interval future gets polled\n                // next time this poll method is called. If it never gets polled,\n                // then this task won't be woken to check again.\n                cx.waker().wake_by_ref();\n            }\n\n            let should_check = check_interval_expired || this.grace_period.is_some();\n            if should_check {\n                let now = this.time_source.now();\n                let report = this.upload_throughput.report(now);\n                let (violated, current_throughput) =\n                    report.minimum_throughput_violated(this.options.minimum_throughput());\n                below_minimum_throughput = violated;\n                if below_minimum_throughput && !this.failing_throughput.is_some() {\n                    *this.failing_throughput = Some(current_throughput);\n                } else if !below_minimum_throughput {\n                    *this.failing_throughput = None;\n                }\n            }\n\n            // If we kicked off a grace period and are now satisfied, clear out the grace period\n            if !below_minimum_throughput && this.grace_period.is_some() {\n                tracing::debug!(\"upload minimum throughput recovered during grace period\");\n                *this.grace_period = None;\n            }\n            if below_minimum_throughput {\n                // Start a grace period if below minimum throughput\n                if this.grace_period.is_none() {\n                    tracing::debug!(\n                        grace_period=?this.options.grace_period(),\n                        \"upload minimum throughput below configured minimum; starting grace period\"\n                    );\n                    *this.grace_period = Some(this.sleep_impl.sleep(this.options.grace_period()));\n                }\n                // Check the grace period if one is already set and we're not satisfied\n                if let Some(grace_period) = this.grace_period.as_pin_mut() {\n                    if grace_period.poll(cx).is_ready() {\n                        tracing::debug!(\"grace period ended; timing out request\");\n                        return Poll::Ready(Err(ConnectorError::timeout(\n                            Error::ThroughputBelowMinimum {\n                                expected: this.options.minimum_throughput(),\n                                actual: this\n                                    .failing_throughput\n                                    .expect(\"always set if there's a grace period\"),\n                            }\n                            .into(),\n                        )));\n                    }\n                }\n            }\n        }\n        Poll::Pending\n    }\n}\n\npin_project_lite::pin_project! {\n    #[project = EnumProj]\n    pub(crate) enum MaybeUploadThroughputCheckFuture {\n        Direct { #[pin] future: HttpConnectorFuture },\n        Checked { #[pin] future: UploadThroughputCheckFuture },\n    }\n}\n\nimpl MaybeUploadThroughputCheckFuture {\n    pub(crate) fn new(\n        cfg: &mut ConfigBag,\n        components: &RuntimeComponents,\n        connector_future: HttpConnectorFuture,\n    ) -> Self {\n        if let Some(sspcfg) = cfg.load::<StalledStreamProtectionConfig>().cloned() {\n            if sspcfg.is_enabled() {\n                let options = MinimumThroughputBodyOptions::from(sspcfg);\n                return Self::new_inner(\n                    connector_future,\n                    components.time_source(),\n                    components.sleep_impl(),\n                    cfg.interceptor_state().load::<UploadThroughput>().cloned(),\n                    Some(options),\n                );\n            }\n        }\n        tracing::debug!(\"no minimum upload throughput checks\");\n        Self::new_inner(connector_future, None, None, None, None)\n    }\n\n    fn new_inner(\n        response: HttpConnectorFuture,\n        time_source: Option<SharedTimeSource>,\n        sleep_impl: Option<SharedAsyncSleep>,\n        upload_throughput: Option<UploadThroughput>,\n        options: Option<MinimumThroughputBodyOptions>,\n    ) -> Self {\n        match (time_source, sleep_impl, upload_throughput, options) {\n            (Some(time_source), Some(sleep_impl), Some(upload_throughput), Some(options)) => {\n                tracing::debug!(options=?options, \"applying minimum upload throughput check future\");\n                Self::Checked {\n                    future: UploadThroughputCheckFuture::new(\n                        response,\n                        time_source,\n                        sleep_impl,\n                        upload_throughput,\n                        options,\n                    ),\n                }\n            }\n            _ => Self::Direct { future: response },\n        }\n    }\n}\n\nimpl Future for MaybeUploadThroughputCheckFuture {\n    type Output = Result<HttpResponse, ConnectorError>;\n\n    fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {\n        match self.project() {\n            EnumProj::Direct { future } => future.poll(cx),\n            EnumProj::Checked { future } => future.poll(cx),\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime/src/client/http/body.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npub mod content_length_enforcement;\npub mod minimum_throughput;\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime/src/client/http/connection_poisoning.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::client::retries::classifiers::run_classifiers_on_ctx;\nuse aws_smithy_runtime_api::box_error::BoxError;\nuse aws_smithy_runtime_api::client::interceptors::context::{\n    AfterDeserializationInterceptorContextRef, BeforeTransmitInterceptorContextMut,\n};\nuse aws_smithy_runtime_api::client::interceptors::{dyn_dispatch_hint, Intercept};\nuse aws_smithy_runtime_api::client::retries::classifiers::RetryAction;\nuse aws_smithy_runtime_api::client::runtime_components::RuntimeComponents;\nuse aws_smithy_types::config_bag::ConfigBag;\nuse aws_smithy_types::retry::{ReconnectMode, RetryConfig};\nuse tracing::{debug, error};\n\n// re-export relocated struct that used to live here\npub use aws_smithy_runtime_api::client::connection::CaptureSmithyConnection;\n\n/// An interceptor for poisoning connections in response to certain events.\n///\n/// This interceptor, when paired with a compatible connection, allows the connection to be\n/// poisoned in reaction to certain events *(like receiving a transient error.)* This allows users\n/// to avoid sending requests to a server that isn't responding. This can increase the load on a\n/// server, because more connections will be made overall.\n///\n/// **In order for this interceptor to work,** the configured connection must interact with the\n/// \"connection retriever\" stored in an HTTP request's `extensions` map. For an example of this,\n/// see [`HyperConnector`]. When a connection is made available to the retriever, this interceptor\n/// will call a `.poison` method on it, signalling that the connection should be dropped. It is\n/// up to the connection implementer to handle this.\n///\n/// [`HyperConnector`]: https://github.com/smithy-lang/smithy-rs/blob/26a914ece072bba2dd9b5b49003204b70e7666ac/rust-runtime/aws-smithy-runtime/src/client/http/hyper_014.rs#L347\n#[non_exhaustive]\n#[derive(Debug, Default)]\npub struct ConnectionPoisoningInterceptor {}\n\nimpl ConnectionPoisoningInterceptor {\n    /// Create a new `ConnectionPoisoningInterceptor`.\n    pub fn new() -> Self {\n        Self::default()\n    }\n}\n\n#[dyn_dispatch_hint]\nimpl Intercept for ConnectionPoisoningInterceptor {\n    fn name(&self) -> &'static str {\n        \"ConnectionPoisoningInterceptor\"\n    }\n\n    fn modify_before_transmit(\n        &self,\n        context: &mut BeforeTransmitInterceptorContextMut<'_>,\n        _runtime_components: &RuntimeComponents,\n        cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        let capture_smithy_connection = CaptureSmithyConnection::new();\n        context\n            .request_mut()\n            .add_extension(capture_smithy_connection.clone());\n        cfg.interceptor_state().store_put(capture_smithy_connection);\n\n        Ok(())\n    }\n\n    fn read_after_deserialization(\n        &self,\n        context: &AfterDeserializationInterceptorContextRef<'_>,\n        runtime_components: &RuntimeComponents,\n        cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        let reconnect_mode = cfg\n            .load::<RetryConfig>()\n            .map(RetryConfig::reconnect_mode)\n            .unwrap_or(ReconnectMode::ReconnectOnTransientError);\n        let captured_connection = cfg.load::<CaptureSmithyConnection>().cloned();\n        let retry_classifier_result =\n            run_classifiers_on_ctx(runtime_components.retry_classifiers(), context.inner());\n        let error_is_transient = retry_classifier_result == RetryAction::transient_error();\n        let connection_poisoning_is_enabled =\n            reconnect_mode == ReconnectMode::ReconnectOnTransientError;\n\n        if error_is_transient && connection_poisoning_is_enabled {\n            debug!(\"received a transient error, marking the connection for closure...\");\n\n            if let Some(captured_connection) = captured_connection.and_then(|conn| conn.get()) {\n                captured_connection.poison();\n                debug!(\"the connection was marked for closure\")\n            } else {\n                error!(\n                    \"unable to mark the connection for closure because no connection was found! The underlying HTTP connector never set a connection.\"\n                );\n            }\n        }\n\n        Ok(())\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime/src/client/http.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nuse aws_smithy_runtime_api::client::behavior_version::BehaviorVersion;\n#[cfg(feature = \"default-https-client\")]\nuse aws_smithy_runtime_api::client::http::SharedHttpClient;\n\n/// Interceptor for connection poisoning.\npub mod connection_poisoning;\n\n#[deprecated = \"Direct HTTP test utility support from `aws-smithy-runtime` crate is deprecated. Please use the `test-util` feature from `aws-smithy-http-client` instead\"]\n#[cfg(feature = \"test-util\")]\npub mod test_util {\n    #![allow(missing_docs)]\n\n    pub use aws_smithy_http_client::test_util::{\n        legacy_capture_request as capture_request, CaptureRequestHandler, CaptureRequestReceiver,\n    };\n\n    #[cfg(feature = \"connector-hyper-0-14-x\")]\n    pub mod dvr {\n        pub use aws_smithy_http_client::test_util::dvr::*;\n    }\n\n    pub use aws_smithy_http_client::test_util::{ReplayEvent, StaticReplayClient};\n\n    pub use aws_smithy_http_client::test_util::legacy_infallible::infallible_client_fn;\n\n    pub use aws_smithy_http_client::test_util::NeverClient;\n\n    #[cfg(feature = \"connector-hyper-0-14-x\")]\n    pub use aws_smithy_http_client::test_util::NeverTcpConnector;\n\n    #[cfg(all(feature = \"connector-hyper-0-14-x\", feature = \"wire-mock\"))]\n    #[macro_use]\n    pub mod wire {\n        pub use aws_smithy_http_client::test_util::wire::ev;\n        pub use aws_smithy_http_client::test_util::wire::match_events;\n        pub use aws_smithy_http_client::test_util::wire::matcher;\n        pub use aws_smithy_http_client::test_util::wire::*;\n    }\n}\n\n/// Default HTTP and TLS connectors that use hyper 0.14.x and rustls.\n///\n/// This module is named after the hyper version number since we anticipate\n/// needing to provide equivalent functionality for hyper 1.x in the future.\n#[cfg(feature = \"connector-hyper-0-14-x\")]\n#[deprecated = \"hyper 0.14.x connector is deprecated, please use the `aws-smithy-http-client` crate directly instead.\"]\npub mod hyper_014 {\n    #[allow(deprecated)]\n    pub use aws_smithy_http_client::hyper_014::*;\n}\n\n/// HTTP body and body-wrapper types\npub mod body;\n\n// NOTE: We created default client options to evolve defaults over time (e.g. allow passing a different DNS resolver)\n/// Configuration options for the default HTTPS client\n#[derive(Debug, Clone)]\npub(crate) struct DefaultClientOptions {\n    behavior_version: BehaviorVersion,\n}\n\nimpl Default for DefaultClientOptions {\n    fn default() -> Self {\n        DefaultClientOptions {\n            behavior_version: BehaviorVersion::latest(),\n        }\n    }\n}\n\nimpl DefaultClientOptions {\n    /// Set the behavior version to use\n    #[allow(unused)]\n    pub(crate) fn with_behavior_version(mut self, behavior_version: BehaviorVersion) -> Self {\n        self.behavior_version = behavior_version;\n        self\n    }\n}\n\n/// Creates an HTTPS client using the default TLS provider\n#[cfg(feature = \"default-https-client\")]\npub(crate) fn default_https_client(options: DefaultClientOptions) -> Option<SharedHttpClient> {\n    use aws_smithy_http_client::proxy::ProxyConfig;\n    use aws_smithy_http_client::{tls, Builder, ConnectorBuilder};\n    tracing::trace!(\"creating a new default hyper 1.x client using rustls<aws-lc>\");\n\n    let client = Builder::new().build_with_connector_fn(move |settings, runtime_components| {\n        let mut conn_builder = ConnectorBuilder::default().tls_provider(tls::Provider::Rustls(\n            tls::rustls_provider::CryptoMode::AwsLc,\n        ));\n\n        conn_builder.set_connector_settings(settings.cloned());\n        if let Some(components) = runtime_components {\n            conn_builder.set_sleep_impl(components.sleep_impl());\n        }\n\n        #[expect(deprecated)]\n        if options\n            .behavior_version\n            .is_at_least(BehaviorVersion::v2025_08_07())\n        {\n            conn_builder.set_proxy_config(Some(ProxyConfig::from_env()));\n        } else {\n            conn_builder.set_proxy_config(Some(ProxyConfig::disabled()));\n        }\n\n        conn_builder.build()\n    });\n\n    Some(client)\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime/src/client/identity/cache/lazy.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::expiring_cache::ExpiringCache;\nuse aws_smithy_async::future::timeout::Timeout;\nuse aws_smithy_async::rt::sleep::{AsyncSleep, SharedAsyncSleep};\nuse aws_smithy_async::time::{SharedTimeSource, TimeSource};\nuse aws_smithy_runtime_api::box_error::BoxError;\nuse aws_smithy_runtime_api::client::identity::{\n    Identity, IdentityCachePartition, IdentityFuture, ResolveCachedIdentity, ResolveIdentity,\n    SharedIdentityCache, SharedIdentityResolver,\n};\nuse aws_smithy_runtime_api::client::runtime_components::RuntimeComponents;\nuse aws_smithy_runtime_api::shared::IntoShared;\nuse aws_smithy_types::config_bag::ConfigBag;\nuse aws_smithy_types::DateTime;\nuse std::collections::HashMap;\nuse std::fmt;\nuse std::sync::RwLock;\nuse std::time::Duration;\nuse tracing::Instrument;\n\nconst DEFAULT_LOAD_TIMEOUT: Duration = Duration::from_secs(5);\nconst DEFAULT_EXPIRATION: Duration = Duration::from_secs(15 * 60);\nconst DEFAULT_BUFFER_TIME: Duration = Duration::from_secs(10);\nconst DEFAULT_BUFFER_TIME_JITTER_FRACTION: fn() -> f64 = || fastrand::f64() * 0.5;\nconst DEFAULT_MAX_PARTITIONS: usize = 64;\n\n/// Builder for lazy identity caching.\n#[derive(Default, Debug)]\npub struct LazyCacheBuilder {\n    time_source: Option<SharedTimeSource>,\n    sleep_impl: Option<SharedAsyncSleep>,\n    load_timeout: Option<Duration>,\n    buffer_time: Option<Duration>,\n    buffer_time_jitter_fraction: Option<fn() -> f64>,\n    default_expiration: Option<Duration>,\n    max_partitions: Option<usize>,\n}\n\nimpl LazyCacheBuilder {\n    /// Create a new builder.\n    pub fn new() -> Self {\n        Default::default()\n    }\n\n    /// Set the time source for this cache.\n    pub fn time_source(mut self, time_source: impl TimeSource + 'static) -> Self {\n        self.set_time_source(time_source.into_shared());\n        self\n    }\n    /// Set the time source for this cache.\n    pub fn set_time_source(&mut self, time_source: SharedTimeSource) -> &mut Self {\n        self.time_source = Some(time_source.into_shared());\n        self\n    }\n\n    /// Set the async sleep implementation for this cache.\n    pub fn sleep_impl(mut self, sleep_impl: impl AsyncSleep + 'static) -> Self {\n        self.set_sleep_impl(sleep_impl.into_shared());\n        self\n    }\n    /// Set the async sleep implementation for this cache.\n    pub fn set_sleep_impl(&mut self, sleep_impl: SharedAsyncSleep) -> &mut Self {\n        self.sleep_impl = Some(sleep_impl);\n        self\n    }\n\n    /// Timeout for identity resolution.\n    ///\n    /// Defaults to 5 seconds.\n    pub fn load_timeout(mut self, timeout: Duration) -> Self {\n        self.set_load_timeout(Some(timeout));\n        self\n    }\n\n    /// Timeout for identity resolution.\n    ///\n    /// Defaults to 5 seconds.\n    pub fn set_load_timeout(&mut self, timeout: Option<Duration>) -> &mut Self {\n        self.load_timeout = timeout;\n        self\n    }\n\n    /// Amount of time before the actual identity expiration time where the identity is considered expired.\n    ///\n    /// For example, if the identity are expiring in 15 minutes, and the buffer time is 10 seconds,\n    /// then any requests made after 14 minutes and 50 seconds will load a new identity.\n    ///\n    /// Note: random jitter value between [0.0, 0.5] is multiplied to this buffer time.\n    ///\n    /// Defaults to 10 seconds.\n    pub fn buffer_time(mut self, buffer_time: Duration) -> Self {\n        self.set_buffer_time(Some(buffer_time));\n        self\n    }\n\n    /// Amount of time before the actual identity expiration time where the identity is considered expired.\n    ///\n    /// For example, if the identity are expiring in 15 minutes, and the buffer time is 10 seconds,\n    /// then any requests made after 14 minutes and 50 seconds will load a new identity.\n    ///\n    /// Note: random jitter value between [0.0, 0.5] is multiplied to this buffer time.\n    ///\n    /// Defaults to 10 seconds.\n    pub fn set_buffer_time(&mut self, buffer_time: Option<Duration>) -> &mut Self {\n        self.buffer_time = buffer_time;\n        self\n    }\n\n    /// A random percentage by which buffer time is jittered for randomization.\n    ///\n    /// For example, if the identity is expiring in 15 minutes, the buffer time is 10 seconds,\n    /// and buffer time jitter fraction is 0.2, then buffer time is adjusted to 8 seconds.\n    /// Therefore, any requests made after 14 minutes and 52 seconds will load a new identity.\n    ///\n    /// Defaults to a randomly generated value between 0.0 and 0.5. This setter is for testing only.\n    #[allow(unused)]\n    #[cfg(test)]\n    fn buffer_time_jitter_fraction(mut self, buffer_time_jitter_fraction: fn() -> f64) -> Self {\n        self.set_buffer_time_jitter_fraction(Some(buffer_time_jitter_fraction));\n        self\n    }\n\n    /// A random percentage by which buffer time is jittered for randomization.\n    ///\n    /// For example, if the identity is expiring in 15 minutes, the buffer time is 10 seconds,\n    /// and buffer time jitter fraction is 0.2, then buffer time is adjusted to 8 seconds.\n    /// Therefore, any requests made after 14 minutes and 52 seconds will load a new identity.\n    ///\n    /// Defaults to a randomly generated value between 0.0 and 0.5. This setter is for testing only.\n    #[allow(unused)]\n    #[cfg(test)]\n    fn set_buffer_time_jitter_fraction(\n        &mut self,\n        buffer_time_jitter_fraction: Option<fn() -> f64>,\n    ) -> &mut Self {\n        self.buffer_time_jitter_fraction = buffer_time_jitter_fraction;\n        self\n    }\n\n    /// Default expiration time to set on an identity if it doesn't have an expiration time.\n    ///\n    /// This is only used if the resolved identity doesn't have an expiration time set.\n    /// This must be at least 15 minutes.\n    ///\n    /// Defaults to 15 minutes.\n    pub fn default_expiration(mut self, duration: Duration) -> Self {\n        self.set_default_expiration(Some(duration));\n        self\n    }\n\n    /// Default expiration time to set on an identity if it doesn't have an expiration time.\n    ///\n    /// This is only used if the resolved identity doesn't have an expiration time set.\n    /// This must be at least 15 minutes.\n    ///\n    /// Defaults to 15 minutes.\n    pub fn set_default_expiration(&mut self, duration: Option<Duration>) -> &mut Self {\n        self.default_expiration = duration;\n        self\n    }\n\n    /// Maximum number of identity cache partitions before eviction occurs.\n    ///\n    /// A normally functioning application should not have more than 5-10\n    /// credential providers active at any given time. This limit acts as\n    /// a safety net against memory leaks.\n    ///\n    /// Defaults to 64.\n    ///\n    /// # Panics\n    ///\n    /// Panics if `max` is 0.\n    pub fn max_partitions(mut self, max: usize) -> Self {\n        self.set_max_partitions(Some(max));\n        self\n    }\n\n    /// Maximum number of identity cache partitions before eviction occurs.\n    ///\n    /// A normally functioning application should not have more than 5-10\n    /// credential providers active at any given time. This limit acts as\n    /// a safety net against memory leaks.\n    ///\n    /// Defaults to 64.\n    ///\n    /// # Panics\n    ///\n    /// Panics if `max` is `Some(0)`.\n    pub fn set_max_partitions(&mut self, max: Option<usize>) -> &mut Self {\n        if let Some(0) = max {\n            panic!(\"max_partitions must be greater than 0\");\n        }\n        self.max_partitions = max;\n        self\n    }\n\n    /// Builds a [`SharedIdentityCache`] from this builder.\n    ///\n    /// # Panics\n    ///\n    /// This builder will panic if required fields are not given, or if given values are not valid.\n    pub fn build(self) -> SharedIdentityCache {\n        let default_expiration = self.default_expiration.unwrap_or(DEFAULT_EXPIRATION);\n        assert!(\n            default_expiration >= DEFAULT_EXPIRATION,\n            \"default_expiration must be at least 15 minutes\"\n        );\n        LazyCache::new(\n            self.load_timeout.unwrap_or(DEFAULT_LOAD_TIMEOUT),\n            self.buffer_time.unwrap_or(DEFAULT_BUFFER_TIME),\n            self.buffer_time_jitter_fraction\n                .unwrap_or(DEFAULT_BUFFER_TIME_JITTER_FRACTION),\n            default_expiration,\n            self.max_partitions.unwrap_or(DEFAULT_MAX_PARTITIONS),\n        )\n        .into_shared()\n    }\n}\n\n#[derive(Debug)]\nstruct CachePartitions {\n    partitions: RwLock<HashMap<IdentityCachePartition, ExpiringCache<Identity, BoxError>>>,\n    buffer_time: Duration,\n    max_partitions: usize,\n}\n\nimpl CachePartitions {\n    fn new(buffer_time: Duration, max_partitions: usize) -> Self {\n        Self {\n            partitions: RwLock::new(HashMap::new()),\n            buffer_time,\n            max_partitions,\n        }\n    }\n\n    fn partition(&self, key: IdentityCachePartition) -> ExpiringCache<Identity, BoxError> {\n        // Fast path: read lock for cache hits\n        if let Some(partition) = self.partitions.read().unwrap().get(&key).cloned() {\n            return partition;\n        }\n        // Slow path: write lock for cache misses\n        let mut partitions = self.partitions.write().unwrap();\n        // Another thread may have inserted while we waited for the write lock\n        if let Some(partition) = partitions.get(&key).cloned() {\n            return partition;\n        }\n        // Evict an arbitrary entry if at capacity. Eviction order doesn't matter\n        // because a normally functioning application should not have more than\n        // 5-10 credential providers active at any given time, well under the cap.\n        if partitions.len() >= self.max_partitions {\n            if let Some(&evict_key) = partitions.keys().next() {\n                partitions.remove(&evict_key);\n            }\n        }\n        let partition = ExpiringCache::new(self.buffer_time);\n        partitions.insert(key, partition.clone());\n        tracing::debug!(\n            partition_count = partitions.len(),\n            \"identity cache partition created\"\n        );\n        partition\n    }\n}\n\n#[derive(Debug)]\nstruct LazyCache {\n    partitions: CachePartitions,\n    load_timeout: Duration,\n    buffer_time: Duration,\n    buffer_time_jitter_fraction: fn() -> f64,\n    default_expiration: Duration,\n}\n\nimpl LazyCache {\n    fn new(\n        load_timeout: Duration,\n        buffer_time: Duration,\n        buffer_time_jitter_fraction: fn() -> f64,\n        default_expiration: Duration,\n        max_partitions: usize,\n    ) -> Self {\n        Self {\n            partitions: CachePartitions::new(buffer_time, max_partitions),\n            load_timeout,\n            buffer_time,\n            buffer_time_jitter_fraction,\n            default_expiration,\n        }\n    }\n}\n\nmacro_rules! required_err {\n    ($thing:literal, $how:literal) => {\n        BoxError::from(concat!(\n            \"Lazy identity caching requires \",\n            $thing,\n            \" to be configured. \",\n            $how,\n            \" If this isn't possible, then disable identity caching by calling \",\n            \"the `identity_cache` method on config with `IdentityCache::no_cache()`\",\n        ))\n    };\n}\nmacro_rules! validate_components {\n    ($components:ident) => {\n        let _ = $components.time_source().ok_or_else(|| {\n            required_err!(\n                \"a time source\",\n                \"Set a time source using the `time_source` method on config.\"\n            )\n        })?;\n        let _ = $components.sleep_impl().ok_or_else(|| {\n            required_err!(\n                \"an async sleep implementation\",\n                \"Set a sleep impl using the `sleep_impl` method on config.\"\n            )\n        })?;\n    };\n}\n\nimpl ResolveCachedIdentity for LazyCache {\n    fn validate_base_client_config(\n        &self,\n        runtime_components: &aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder,\n        _cfg: &ConfigBag,\n    ) -> Result<(), BoxError> {\n        validate_components!(runtime_components);\n        Ok(())\n    }\n\n    fn validate_final_config(\n        &self,\n        runtime_components: &RuntimeComponents,\n        _cfg: &ConfigBag,\n    ) -> Result<(), BoxError> {\n        validate_components!(runtime_components);\n        Ok(())\n    }\n\n    fn resolve_cached_identity<'a>(\n        &'a self,\n        resolver: SharedIdentityResolver,\n        runtime_components: &'a RuntimeComponents,\n        config_bag: &'a ConfigBag,\n    ) -> IdentityFuture<'a> {\n        let (time_source, sleep_impl) = (\n            runtime_components.time_source().expect(\"validated\"),\n            runtime_components.sleep_impl().expect(\"validated\"),\n        );\n\n        let now = time_source.now();\n        let timeout_future = sleep_impl.sleep(self.load_timeout);\n        let load_timeout = self.load_timeout;\n        let partition = resolver.cache_partition();\n        let cache = self.partitions.partition(partition);\n        let default_expiration = self.default_expiration;\n\n        IdentityFuture::new(async move {\n            // Attempt to get cached identity, or clear the cache if they're expired\n            if let Some(identity) = cache.yield_or_clear_if_expired(now).await {\n                tracing::debug!(\n                    buffer_time=?self.buffer_time,\n                    cached_expiration=?identity.expiration(),\n                    now=?now,\n                    \"loaded identity from cache\"\n                );\n                Ok(identity)\n            } else {\n                // If we didn't get identity from the cache, then we need to try and load.\n                // There may be other threads also loading simultaneously, but this is OK\n                // since the futures are not eagerly executed, and the cache will only run one\n                // of them.\n                let start_time = time_source.now();\n                let result = cache\n                    .get_or_load(|| {\n                        let span = tracing::debug_span!(\"lazy_load_identity\");\n                        async move {\n                            let fut = Timeout::new(\n                                resolver.resolve_identity(runtime_components, config_bag),\n                                timeout_future,\n                            );\n                            let identity = match fut.await {\n                                Ok(result) => result?,\n                                Err(_err) => match resolver.fallback_on_interrupt() {\n                                    Some(identity) => identity,\n                                    None => {\n                                        return Err(BoxError::from(TimedOutError(load_timeout)))\n                                    }\n                                },\n                            };\n                            // If the identity don't have an expiration time, then create a default one\n                            let expiration =\n                                identity.expiration().unwrap_or(now + default_expiration);\n\n                            let jitter = self\n                                .buffer_time\n                                .mul_f64((self.buffer_time_jitter_fraction)());\n\n                            // Logging for cache miss should be emitted here as opposed to after the call to\n                            // `cache.get_or_load` above. In the case of multiple threads concurrently executing\n                            // `cache.get_or_load`, logging inside `cache.get_or_load` ensures that it is emitted\n                            // only once for the first thread that succeeds in populating a cache value.\n                            let printable = DateTime::from(expiration);\n                            tracing::debug!(\n                                new_expiration=%printable,\n                                valid_for=?expiration.duration_since(time_source.now()).unwrap_or_default(),\n                                partition=?partition,\n                                \"identity cache miss occurred; added new identity (took {:?})\",\n                                time_source.now().duration_since(start_time).unwrap_or_default()\n                            );\n\n                            Ok((identity, expiration + jitter))\n                        }\n                        // Only instrument the the actual load future so that no span\n                        // is opened if the cache decides not to execute it.\n                        .instrument(span)\n                    })\n                    .await;\n                tracing::debug!(\"loaded identity\");\n                result\n            }\n        })\n    }\n}\n\n#[derive(Debug)]\nstruct TimedOutError(Duration);\n\nimpl std::error::Error for TimedOutError {}\n\nimpl fmt::Display for TimedOutError {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        write!(f, \"identity resolver timed out after {:?}\", self.0)\n    }\n}\n\n#[cfg(all(test, feature = \"client\", feature = \"http-auth\"))]\nmod tests {\n    use super::*;\n    use aws_smithy_async::rt::sleep::TokioSleep;\n    use aws_smithy_async::test_util::{instant_time_and_sleep, ManualTimeSource};\n    use aws_smithy_async::time::TimeSource;\n    use aws_smithy_runtime_api::client::identity::http::Token;\n    use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder;\n    use std::sync::atomic::{AtomicUsize, Ordering};\n    use std::sync::{Arc, Mutex};\n    use std::time::{Duration, SystemTime, UNIX_EPOCH};\n    use tracing::info;\n\n    const BUFFER_TIME_NO_JITTER: fn() -> f64 = || 0_f64;\n\n    struct ResolverFn<F>(F);\n    impl<F> fmt::Debug for ResolverFn<F> {\n        fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n            f.write_str(\"ResolverFn\")\n        }\n    }\n    impl<F> ResolveIdentity for ResolverFn<F>\n    where\n        F: Fn() -> IdentityFuture<'static> + Send + Sync,\n    {\n        fn resolve_identity<'a>(\n            &'a self,\n            _: &'a RuntimeComponents,\n            _config_bag: &'a ConfigBag,\n        ) -> IdentityFuture<'a> {\n            (self.0)()\n        }\n    }\n\n    fn resolver_fn<F>(f: F) -> SharedIdentityResolver\n    where\n        F: Fn() -> IdentityFuture<'static> + Send + Sync + 'static,\n    {\n        SharedIdentityResolver::new(ResolverFn(f))\n    }\n\n    fn test_cache(\n        buffer_time_jitter_fraction: fn() -> f64,\n        load_list: Vec<Result<Identity, BoxError>>,\n    ) -> (LazyCache, SharedIdentityResolver) {\n        #[derive(Debug)]\n        struct Resolver(Mutex<Vec<Result<Identity, BoxError>>>);\n        impl ResolveIdentity for Resolver {\n            fn resolve_identity<'a>(\n                &'a self,\n                _: &'a RuntimeComponents,\n                _config_bag: &'a ConfigBag,\n            ) -> IdentityFuture<'a> {\n                let mut list = self.0.lock().unwrap();\n                if list.len() > 0 {\n                    let next = list.remove(0);\n                    info!(\"refreshing the identity to {:?}\", next);\n                    IdentityFuture::ready(next)\n                } else {\n                    drop(list);\n                    panic!(\"no more identities\")\n                }\n            }\n        }\n\n        let identity_resolver = SharedIdentityResolver::new(Resolver(Mutex::new(load_list)));\n        let cache = LazyCache::new(\n            DEFAULT_LOAD_TIMEOUT,\n            DEFAULT_BUFFER_TIME,\n            buffer_time_jitter_fraction,\n            DEFAULT_EXPIRATION,\n            DEFAULT_MAX_PARTITIONS,\n        );\n        (cache, identity_resolver)\n    }\n\n    fn epoch_secs(secs: u64) -> SystemTime {\n        SystemTime::UNIX_EPOCH + Duration::from_secs(secs)\n    }\n\n    fn test_identity(expired_secs: u64) -> Identity {\n        let expiration = Some(epoch_secs(expired_secs));\n        Identity::new(Token::new(\"test\", expiration), expiration)\n    }\n\n    async fn expect_identity(\n        expired_secs: u64,\n        cache: &LazyCache,\n        components: &RuntimeComponents,\n        resolver: SharedIdentityResolver,\n    ) {\n        let config_bag = ConfigBag::base();\n        let identity = cache\n            .resolve_cached_identity(resolver, components, &config_bag)\n            .await\n            .expect(\"expected identity\");\n        assert_eq!(Some(epoch_secs(expired_secs)), identity.expiration());\n    }\n\n    #[tokio::test]\n    async fn initial_populate_test_identity() {\n        let time = ManualTimeSource::new(UNIX_EPOCH);\n        let components = RuntimeComponentsBuilder::for_tests()\n            .with_time_source(Some(time.clone()))\n            .with_sleep_impl(Some(TokioSleep::new()))\n            .build()\n            .unwrap();\n        let config_bag = ConfigBag::base();\n        let resolver = SharedIdentityResolver::new(resolver_fn(|| {\n            info!(\"refreshing the test_identity\");\n            IdentityFuture::ready(Ok(test_identity(1000)))\n        }));\n        let cache = LazyCache::new(\n            DEFAULT_LOAD_TIMEOUT,\n            DEFAULT_BUFFER_TIME,\n            BUFFER_TIME_NO_JITTER,\n            DEFAULT_EXPIRATION,\n            DEFAULT_MAX_PARTITIONS,\n        );\n        assert_eq!(\n            epoch_secs(1000),\n            cache\n                .resolve_cached_identity(resolver, &components, &config_bag)\n                .await\n                .unwrap()\n                .expiration()\n                .unwrap()\n        );\n    }\n\n    #[tokio::test]\n    async fn reload_expired_test_identity() {\n        let time = ManualTimeSource::new(epoch_secs(100));\n        let components = RuntimeComponentsBuilder::for_tests()\n            .with_time_source(Some(time.clone()))\n            .with_sleep_impl(Some(TokioSleep::new()))\n            .build()\n            .unwrap();\n        let (cache, resolver) = test_cache(\n            BUFFER_TIME_NO_JITTER,\n            vec![\n                Ok(test_identity(1000)),\n                Ok(test_identity(2000)),\n                Ok(test_identity(3000)),\n            ],\n        );\n\n        expect_identity(1000, &cache, &components, resolver.clone()).await;\n        expect_identity(1000, &cache, &components, resolver.clone()).await;\n        time.set_time(epoch_secs(1500));\n        expect_identity(2000, &cache, &components, resolver.clone()).await;\n        expect_identity(2000, &cache, &components, resolver.clone()).await;\n        time.set_time(epoch_secs(2500));\n        expect_identity(3000, &cache, &components, resolver.clone()).await;\n        expect_identity(3000, &cache, &components, resolver.clone()).await;\n    }\n\n    #[tokio::test]\n    async fn load_failed_error() {\n        let config_bag = ConfigBag::base();\n        let time = ManualTimeSource::new(epoch_secs(100));\n        let components = RuntimeComponentsBuilder::for_tests()\n            .with_time_source(Some(time.clone()))\n            .with_sleep_impl(Some(TokioSleep::new()))\n            .build()\n            .unwrap();\n        let (cache, resolver) = test_cache(\n            BUFFER_TIME_NO_JITTER,\n            vec![Ok(test_identity(1000)), Err(\"failed\".into())],\n        );\n\n        expect_identity(1000, &cache, &components, resolver.clone()).await;\n        time.set_time(epoch_secs(1500));\n        assert!(cache\n            .resolve_cached_identity(resolver.clone(), &components, &config_bag)\n            .await\n            .is_err());\n    }\n\n    #[test]\n    fn load_contention() {\n        let rt = tokio::runtime::Builder::new_multi_thread()\n            .enable_time()\n            .worker_threads(16)\n            .build()\n            .unwrap();\n\n        let time = ManualTimeSource::new(epoch_secs(0));\n        let components = RuntimeComponentsBuilder::for_tests()\n            .with_time_source(Some(time.clone()))\n            .with_sleep_impl(Some(TokioSleep::new()))\n            .build()\n            .unwrap();\n        let (cache, resolver) = test_cache(\n            BUFFER_TIME_NO_JITTER,\n            vec![\n                Ok(test_identity(500)),\n                Ok(test_identity(1500)),\n                Ok(test_identity(2500)),\n                Ok(test_identity(3500)),\n                Ok(test_identity(4500)),\n            ],\n        );\n        let cache: SharedIdentityCache = cache.into_shared();\n\n        // test_identity are available up until 4500 seconds after the unix epoch\n        // 4*50 = 200 tasks are launched => we can advance time 4500/20 => 225 seconds per advance\n        for _ in 0..4 {\n            let mut tasks = Vec::new();\n            for _ in 0..50 {\n                let resolver = resolver.clone();\n                let cache = cache.clone();\n                let time = time.clone();\n                let components = components.clone();\n                tasks.push(rt.spawn(async move {\n                    let now = time.advance(Duration::from_secs(22));\n\n                    let config_bag = ConfigBag::base();\n                    let identity = cache\n                        .resolve_cached_identity(resolver, &components, &config_bag)\n                        .await\n                        .unwrap();\n                    assert!(\n                        identity.expiration().unwrap() >= now,\n                        \"{:?} >= {:?}\",\n                        identity.expiration(),\n                        now\n                    );\n                }));\n            }\n            for task in tasks {\n                rt.block_on(task).unwrap();\n            }\n        }\n    }\n\n    #[tokio::test]\n    async fn load_timeout() {\n        let config_bag = ConfigBag::base();\n        let (time, sleep) = instant_time_and_sleep(epoch_secs(100));\n        let components = RuntimeComponentsBuilder::for_tests()\n            .with_time_source(Some(time.clone()))\n            .with_sleep_impl(Some(sleep))\n            .build()\n            .unwrap();\n        let resolver = SharedIdentityResolver::new(resolver_fn(|| {\n            IdentityFuture::new(async {\n                aws_smithy_async::future::never::Never::new().await;\n                Ok(test_identity(1000))\n            })\n        }));\n        let cache = LazyCache::new(\n            Duration::from_secs(5),\n            DEFAULT_BUFFER_TIME,\n            BUFFER_TIME_NO_JITTER,\n            DEFAULT_EXPIRATION,\n            DEFAULT_MAX_PARTITIONS,\n        );\n\n        let err: BoxError = cache\n            .resolve_cached_identity(resolver, &components, &config_bag)\n            .await\n            .expect_err(\"it should return an error\");\n        let downcasted = err.downcast_ref::<TimedOutError>();\n        assert!(\n            downcasted.is_some(),\n            \"expected a BoxError of TimedOutError, but was {err:?}\"\n        );\n        assert_eq!(time.now(), epoch_secs(105));\n    }\n\n    #[tokio::test]\n    async fn buffer_time_jitter() {\n        let time = ManualTimeSource::new(epoch_secs(100));\n        let components = RuntimeComponentsBuilder::for_tests()\n            .with_time_source(Some(time.clone()))\n            .with_sleep_impl(Some(TokioSleep::new()))\n            .build()\n            .unwrap();\n        let buffer_time_jitter_fraction = || 0.5_f64;\n        let (cache, resolver) = test_cache(\n            buffer_time_jitter_fraction,\n            vec![Ok(test_identity(1000)), Ok(test_identity(2000))],\n        );\n\n        expect_identity(1000, &cache, &components, resolver.clone()).await;\n        let buffer_time_with_jitter =\n            (DEFAULT_BUFFER_TIME.as_secs_f64() * buffer_time_jitter_fraction()) as u64;\n        assert_eq!(buffer_time_with_jitter, 5);\n        // Advance time to the point where the first test_identity are about to expire (but haven't).\n        let almost_expired_secs = 1000 - buffer_time_with_jitter - 1;\n        time.set_time(epoch_secs(almost_expired_secs));\n        // We should still use the first test_identity.\n        expect_identity(1000, &cache, &components, resolver.clone()).await;\n        // Now let the first test_identity expire.\n        let expired_secs = almost_expired_secs + 1;\n        time.set_time(epoch_secs(expired_secs));\n        // Now that the first test_identity have been expired, the second test_identity will be retrieved.\n        expect_identity(2000, &cache, &components, resolver.clone()).await;\n    }\n\n    #[tokio::test]\n    async fn cache_partitioning() {\n        let time = ManualTimeSource::new(epoch_secs(0));\n        let components = RuntimeComponentsBuilder::for_tests()\n            .with_time_source(Some(time.clone()))\n            .with_sleep_impl(Some(TokioSleep::new()))\n            .build()\n            .unwrap();\n        let (cache, _) = test_cache(BUFFER_TIME_NO_JITTER, Vec::new());\n\n        #[allow(clippy::disallowed_methods)]\n        let far_future = SystemTime::now() + Duration::from_secs(10_000);\n\n        // Resolver A and B both return an identical identity type with different tokens with an expiration\n        // time that should NOT be hit within this test. They each have their own partition key.\n        let resolver_a_calls = Arc::new(AtomicUsize::new(0));\n        let resolver_b_calls = Arc::new(AtomicUsize::new(0));\n        let resolver_a = resolver_fn({\n            let calls = resolver_a_calls.clone();\n            move || {\n                calls.fetch_add(1, Ordering::Relaxed);\n                IdentityFuture::ready(Ok(Identity::new(\n                    Token::new(\"A\", Some(far_future)),\n                    Some(far_future),\n                )))\n            }\n        });\n        let resolver_b = resolver_fn({\n            let calls = resolver_b_calls.clone();\n            move || {\n                calls.fetch_add(1, Ordering::Relaxed);\n                IdentityFuture::ready(Ok(Identity::new(\n                    Token::new(\"B\", Some(far_future)),\n                    Some(far_future),\n                )))\n            }\n        });\n        assert_ne!(\n            resolver_a.cache_partition(),\n            resolver_b.cache_partition(),\n            \"pre-condition: they should have different partition keys\"\n        );\n\n        let config_bag = ConfigBag::base();\n\n        // Loading the identity twice with resolver A should result in a single call\n        // to the underlying identity resolver since the result gets cached.\n        let identity = cache\n            .resolve_cached_identity(resolver_a.clone(), &components, &config_bag)\n            .await\n            .unwrap();\n        assert_eq!(\"A\", identity.data::<Token>().unwrap().token());\n        let identity = cache\n            .resolve_cached_identity(resolver_a.clone(), &components, &config_bag)\n            .await\n            .unwrap();\n        assert_eq!(\"A\", identity.data::<Token>().unwrap().token());\n        assert_eq!(1, resolver_a_calls.load(Ordering::Relaxed));\n\n        // Now, loading an identity from B will use a separate cache partition\n        // and return a different result.\n        let identity = cache\n            .resolve_cached_identity(resolver_b.clone(), &components, &config_bag)\n            .await\n            .unwrap();\n        assert_eq!(\"B\", identity.data::<Token>().unwrap().token());\n        let identity = cache\n            .resolve_cached_identity(resolver_b.clone(), &components, &config_bag)\n            .await\n            .unwrap();\n        assert_eq!(\"B\", identity.data::<Token>().unwrap().token());\n        assert_eq!(1, resolver_a_calls.load(Ordering::Relaxed));\n        assert_eq!(1, resolver_b_calls.load(Ordering::Relaxed));\n\n        // Finally, loading with resolver A again should return the original cached A value\n        let identity = cache\n            .resolve_cached_identity(resolver_a.clone(), &components, &config_bag)\n            .await\n            .unwrap();\n        assert_eq!(\"A\", identity.data::<Token>().unwrap().token());\n        assert_eq!(1, resolver_a_calls.load(Ordering::Relaxed));\n        assert_eq!(1, resolver_b_calls.load(Ordering::Relaxed));\n    }\n\n    #[tokio::test]\n    async fn eviction_when_at_capacity() {\n        let time = ManualTimeSource::new(epoch_secs(0));\n        let components = RuntimeComponentsBuilder::for_tests()\n            .with_time_source(Some(time.clone()))\n            .with_sleep_impl(Some(TokioSleep::new()))\n            .build()\n            .unwrap();\n        // Create a cache with max_partitions=2\n        let cache = LazyCache::new(\n            DEFAULT_LOAD_TIMEOUT,\n            DEFAULT_BUFFER_TIME,\n            BUFFER_TIME_NO_JITTER,\n            DEFAULT_EXPIRATION,\n            2,\n        );\n\n        #[allow(clippy::disallowed_methods)]\n        let far_future = SystemTime::now() + Duration::from_secs(10_000);\n\n        let resolver_a_calls = Arc::new(AtomicUsize::new(0));\n        let resolver_b_calls = Arc::new(AtomicUsize::new(0));\n        let resolver_c_calls = Arc::new(AtomicUsize::new(0));\n\n        let resolver_a = resolver_fn({\n            let calls = resolver_a_calls.clone();\n            move || {\n                calls.fetch_add(1, Ordering::Relaxed);\n                IdentityFuture::ready(Ok(Identity::new(\n                    Token::new(\"A\", Some(far_future)),\n                    Some(far_future),\n                )))\n            }\n        });\n        let resolver_b = resolver_fn({\n            let calls = resolver_b_calls.clone();\n            move || {\n                calls.fetch_add(1, Ordering::Relaxed);\n                IdentityFuture::ready(Ok(Identity::new(\n                    Token::new(\"B\", Some(far_future)),\n                    Some(far_future),\n                )))\n            }\n        });\n        let resolver_c = resolver_fn({\n            let calls = resolver_c_calls.clone();\n            move || {\n                calls.fetch_add(1, Ordering::Relaxed);\n                IdentityFuture::ready(Ok(Identity::new(\n                    Token::new(\"C\", Some(far_future)),\n                    Some(far_future),\n                )))\n            }\n        });\n\n        let config_bag = ConfigBag::base();\n\n        // Fill the cache with A and B\n        cache\n            .resolve_cached_identity(resolver_a.clone(), &components, &config_bag)\n            .await\n            .unwrap();\n        cache\n            .resolve_cached_identity(resolver_b.clone(), &components, &config_bag)\n            .await\n            .unwrap();\n        assert_eq!(1, resolver_a_calls.load(Ordering::Relaxed));\n        assert_eq!(1, resolver_b_calls.load(Ordering::Relaxed));\n\n        // Adding C should evict one of A or B (arbitrary eviction order)\n        cache\n            .resolve_cached_identity(resolver_c.clone(), &components, &config_bag)\n            .await\n            .unwrap();\n        assert_eq!(1, resolver_c_calls.load(Ordering::Relaxed));\n\n        // Resolve all three again — at least one of A or B must be re-resolved because\n        // the cache only holds 2 partitions. Depending on HashMap iteration order, re-inserting\n        // the evicted entry may cascade-evict the other, leading to 4 or 5 total calls.\n        cache\n            .resolve_cached_identity(resolver_a.clone(), &components, &config_bag)\n            .await\n            .unwrap();\n        cache\n            .resolve_cached_identity(resolver_b.clone(), &components, &config_bag)\n            .await\n            .unwrap();\n        let total_calls = resolver_a_calls.load(Ordering::Relaxed)\n            + resolver_b_calls.load(Ordering::Relaxed)\n            + resolver_c_calls.load(Ordering::Relaxed);\n        // Initial: 3 calls (A, B, C). At least one of A or B was evicted and re-resolved (+1).\n        // If re-inserting the evicted entry cascade-evicts the other, both need re-resolution (+2).\n        assert!(\n            (4..=5).contains(&total_calls),\n            \"expected 4 or 5 total calls (3 initial + 1 or 2 re-resolutions), got {total_calls}\"\n        );\n    }\n\n    #[tokio::test]\n    async fn single_partition_cache() {\n        let time = ManualTimeSource::new(epoch_secs(0));\n        let components = RuntimeComponentsBuilder::for_tests()\n            .with_time_source(Some(time.clone()))\n            .with_sleep_impl(Some(TokioSleep::new()))\n            .build()\n            .unwrap();\n        // Mimics the operation-scoped cache used for config overrides\n        let cache = LazyCache::new(\n            DEFAULT_LOAD_TIMEOUT,\n            DEFAULT_BUFFER_TIME,\n            BUFFER_TIME_NO_JITTER,\n            DEFAULT_EXPIRATION,\n            1,\n        );\n\n        #[allow(clippy::disallowed_methods)]\n        let far_future = SystemTime::now() + Duration::from_secs(10_000);\n\n        let resolver_a_calls = Arc::new(AtomicUsize::new(0));\n        let resolver_b_calls = Arc::new(AtomicUsize::new(0));\n\n        let resolver_a = resolver_fn({\n            let calls = resolver_a_calls.clone();\n            move || {\n                calls.fetch_add(1, Ordering::Relaxed);\n                IdentityFuture::ready(Ok(Identity::new(\n                    Token::new(\"A\", Some(far_future)),\n                    Some(far_future),\n                )))\n            }\n        });\n        let resolver_b = resolver_fn({\n            let calls = resolver_b_calls.clone();\n            move || {\n                calls.fetch_add(1, Ordering::Relaxed);\n                IdentityFuture::ready(Ok(Identity::new(\n                    Token::new(\"B\", Some(far_future)),\n                    Some(far_future),\n                )))\n            }\n        });\n\n        let config_bag = ConfigBag::base();\n\n        // First call resolves A\n        let identity = cache\n            .resolve_cached_identity(resolver_a.clone(), &components, &config_bag)\n            .await\n            .unwrap();\n        assert_eq!(\"A\", identity.data::<Token>().unwrap().token());\n        assert_eq!(1, resolver_a_calls.load(Ordering::Relaxed));\n\n        // Second call with same resolver is cached\n        let identity = cache\n            .resolve_cached_identity(resolver_a.clone(), &components, &config_bag)\n            .await\n            .unwrap();\n        assert_eq!(\"A\", identity.data::<Token>().unwrap().token());\n        assert_eq!(1, resolver_a_calls.load(Ordering::Relaxed));\n\n        // Resolving B evicts A (only 1 partition)\n        let identity = cache\n            .resolve_cached_identity(resolver_b.clone(), &components, &config_bag)\n            .await\n            .unwrap();\n        assert_eq!(\"B\", identity.data::<Token>().unwrap().token());\n        assert_eq!(1, resolver_b_calls.load(Ordering::Relaxed));\n\n        // A must be re-resolved\n        let identity = cache\n            .resolve_cached_identity(resolver_a.clone(), &components, &config_bag)\n            .await\n            .unwrap();\n        assert_eq!(\"A\", identity.data::<Token>().unwrap().token());\n        assert_eq!(2, resolver_a_calls.load(Ordering::Relaxed));\n    }\n\n    #[test]\n    #[should_panic(expected = \"max_partitions must be greater than 0\")]\n    fn max_partitions_zero_panics() {\n        LazyCacheBuilder::new().max_partitions(0);\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime/src/client/identity/cache.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_smithy_runtime_api::client::identity::{\n    IdentityFuture, ResolveCachedIdentity, ResolveIdentity, SharedIdentityCache,\n    SharedIdentityResolver,\n};\nuse aws_smithy_runtime_api::shared::IntoShared;\nuse aws_smithy_types::config_bag::ConfigBag;\n\nmod lazy;\nuse aws_smithy_runtime_api::client::runtime_components::RuntimeComponents;\npub use lazy::LazyCacheBuilder;\n\n/// Identity cache configuration.\n///\n/// # Examples\n///\n/// Disabling identity caching:\n/// ```no_run\n/// use aws_smithy_runtime::client::identity::IdentityCache;\n///\n/// # /*\n/// let config = some_service::Config::builder()\n///     .identity_cache(\n/// # */\n/// # drop(\n///         IdentityCache::no_cache()\n/// # );\n/// # /*\n///     )\n///     // ...\n///     .build();\n/// let client = some_service::Client::new(config);\n/// # */\n/// ```\n///\n/// Customizing lazy caching:\n/// ```no_run\n/// use aws_smithy_runtime::client::identity::IdentityCache;\n/// use std::time::Duration;\n///\n/// # /*\n/// let config = some_service::Config::builder()\n///     .identity_cache(\n/// # */\n/// # drop(\n///         IdentityCache::lazy()\n///             // change the load timeout to 10 seconds\n///             .load_timeout(Duration::from_secs(10))\n///             .build()\n/// # );\n/// # /*\n///     )\n///     // ...\n///     .build();\n/// let client = some_service::Client::new(config);\n/// # */\n/// ```\n#[non_exhaustive]\npub struct IdentityCache;\n\nimpl IdentityCache {\n    /// Create an identity cache that does not cache any resolved identities.\n    pub fn no_cache() -> SharedIdentityCache {\n        NoCache.into_shared()\n    }\n\n    /// Configure a lazy identity cache.\n    ///\n    /// Identities are lazy loaded and then cached when a request is made.\n    pub fn lazy() -> LazyCacheBuilder {\n        LazyCacheBuilder::new()\n    }\n}\n\n#[derive(Clone, Debug)]\nstruct NoCache;\n\nimpl ResolveCachedIdentity for NoCache {\n    fn resolve_cached_identity<'a>(\n        &'a self,\n        resolver: SharedIdentityResolver,\n        runtime_components: &'a RuntimeComponents,\n        config_bag: &'a ConfigBag,\n    ) -> IdentityFuture<'a> {\n        IdentityFuture::new(async move {\n            resolver\n                .resolve_identity(runtime_components, config_bag)\n                .await\n        })\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime/src/client/identity/no_auth.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_smithy_runtime_api::client::identity::{Identity, IdentityFuture, ResolveIdentity};\nuse aws_smithy_runtime_api::client::runtime_components::RuntimeComponents;\nuse aws_smithy_types::config_bag::ConfigBag;\n\n/// Identity for the [`NoAuthScheme`](crate::client::auth::no_auth::NoAuthScheme) auth scheme.\n#[derive(Debug, Default)]\npub struct NoAuthIdentity;\n\nimpl NoAuthIdentity {\n    /// Creates a new `NoAuthIdentity`.\n    pub fn new() -> Self {\n        Self\n    }\n}\n\n/// Identity resolver for the [`NoAuthScheme`](crate::client::auth::no_auth::NoAuthScheme) auth scheme.\n#[derive(Debug, Default)]\npub struct NoAuthIdentityResolver;\n\nimpl NoAuthIdentityResolver {\n    /// Creates a new `NoAuthIdentityResolver`.\n    pub fn new() -> Self {\n        Self\n    }\n}\n\nimpl ResolveIdentity for NoAuthIdentityResolver {\n    fn resolve_identity<'a>(\n        &'a self,\n        _runtime_components: &'a RuntimeComponents,\n        _: &'a ConfigBag,\n    ) -> IdentityFuture<'a> {\n        IdentityFuture::ready(Ok(Identity::new(NoAuthIdentity::new(), None)))\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime/src/client/identity.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nmod cache;\npub use cache::{IdentityCache, LazyCacheBuilder};\n\n/// Identity resolver implementation for \"no auth\".\npub mod no_auth;\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime/src/client/interceptors.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_smithy_runtime_api::box_error::BoxError;\nuse aws_smithy_runtime_api::client::interceptors::context::{\n    BeforeSerializationInterceptorContextRef, BeforeTransmitInterceptorContextMut,\n    FinalizerInterceptorContextMut, FinalizerInterceptorContextRef,\n};\nuse aws_smithy_runtime_api::client::interceptors::context::{\n    Error, Input, InterceptorContext, Output,\n};\nuse aws_smithy_runtime_api::client::interceptors::{\n    dyn_dispatch_hint, Intercept, InterceptorError, OverriddenHooks, SharedInterceptor,\n};\nuse aws_smithy_runtime_api::client::orchestrator::HttpRequest;\nuse aws_smithy_runtime_api::client::runtime_components::RuntimeComponents;\nuse aws_smithy_types::body::SdkBody;\nuse aws_smithy_types::config_bag::ConfigBag;\nuse aws_smithy_types::error::display::DisplayErrorContext;\nuse std::error::Error as StdError;\nuse std::fmt;\nuse std::marker::PhantomData;\n\nmacro_rules! interceptor_impl_fn {\n    (mut $interceptor:ident, $hint:ident) => {\n        pub(crate) fn $interceptor(\n            self,\n            ctx: &mut InterceptorContext,\n            runtime_components: &RuntimeComponents,\n            cfg: &mut ConfigBag,\n        ) -> Result<(), InterceptorError> {\n            tracing::trace!(concat!(\n                \"running `\",\n                stringify!($interceptor),\n                \"` interceptors\"\n            ));\n            let mut result: Result<(), (&str, BoxError)> = Ok(());\n            let mut ctx = ctx.into();\n            for interceptor in self.into_iter() {\n                if interceptor.hook_overridden(OverriddenHooks::$hint) {\n                    if let Some(interceptor) = interceptor.if_enabled(cfg) {\n                        if let Err(new_error) =\n                            interceptor.$interceptor(&mut ctx, runtime_components, cfg)\n                        {\n                            if let Err(last_error) = result {\n                                tracing::debug!(\n                                    \"{}::{}: {}\",\n                                    last_error.0,\n                                    stringify!($interceptor),\n                                    DisplayErrorContext(&*last_error.1)\n                                );\n                            }\n                            result = Err((interceptor.name(), new_error));\n                        }\n                    }\n                }\n            }\n            result.map_err(|(name, err)| InterceptorError::$interceptor(name, err))\n        }\n    };\n    (ref $interceptor:ident, $hint:ident) => {\n        pub(crate) fn $interceptor(\n            self,\n            ctx: &InterceptorContext,\n            runtime_components: &RuntimeComponents,\n            cfg: &mut ConfigBag,\n        ) -> Result<(), InterceptorError> {\n            tracing::trace!(concat!(\n                \"running `\",\n                stringify!($interceptor),\n                \"` interceptors\"\n            ));\n            let mut result: Result<(), (&str, BoxError)> = Ok(());\n            let ctx = ctx.into();\n            for interceptor in self.into_iter() {\n                if interceptor.hook_overridden(OverriddenHooks::$hint) {\n                    if let Some(interceptor) = interceptor.if_enabled(cfg) {\n                        if let Err(new_error) =\n                            interceptor.$interceptor(&ctx, runtime_components, cfg)\n                        {\n                            if let Err(last_error) = result {\n                                tracing::debug!(\n                                    \"{}::{}: {}\",\n                                    last_error.0,\n                                    stringify!($interceptor),\n                                    DisplayErrorContext(&*last_error.1)\n                                );\n                            }\n                            result = Err((interceptor.name(), new_error));\n                        }\n                    }\n                }\n            }\n            result.map_err(|(name, err)| InterceptorError::$interceptor(name, err))\n        }\n    };\n}\n\n#[derive(Debug)]\npub(crate) struct Interceptors<I> {\n    interceptors: I,\n}\n\nimpl<I> Interceptors<I>\nwhere\n    I: Iterator<Item = SharedInterceptor>,\n{\n    pub(crate) fn new(interceptors: I) -> Self {\n        Self { interceptors }\n    }\n\n    fn into_iter(self) -> impl Iterator<Item = ConditionallyEnabledInterceptor> {\n        self.interceptors.map(ConditionallyEnabledInterceptor)\n    }\n\n    pub(crate) fn read_before_execution(\n        self,\n        operation: bool,\n        ctx: &InterceptorContext<Input, Output, Error>,\n        cfg: &mut ConfigBag,\n    ) -> Result<(), InterceptorError> {\n        tracing::trace!(\n            \"running {} `read_before_execution` interceptors\",\n            if operation { \"operation\" } else { \"client\" }\n        );\n        let mut result: Result<(), (&str, BoxError)> = Ok(());\n        let ctx: BeforeSerializationInterceptorContextRef<'_> = ctx.into();\n        for interceptor in self.into_iter() {\n            if interceptor.hook_overridden(OverriddenHooks::READ_BEFORE_EXECUTION) {\n                if let Some(interceptor) = interceptor.if_enabled(cfg) {\n                    if let Err(new_error) = interceptor.read_before_execution(&ctx, cfg) {\n                        if let Err(last_error) = result {\n                            tracing::debug!(\n                                \"{}::{}: {}\",\n                                last_error.0,\n                                \"read_before_execution\",\n                                DisplayErrorContext(&*last_error.1)\n                            );\n                        }\n                        result = Err((interceptor.name(), new_error));\n                    }\n                }\n            }\n        }\n        result.map_err(|(name, err)| InterceptorError::read_before_execution(name, err))\n    }\n\n    interceptor_impl_fn!(mut modify_before_serialization, MODIFY_BEFORE_SERIALIZATION);\n    interceptor_impl_fn!(ref read_before_serialization, READ_BEFORE_SERIALIZATION);\n    interceptor_impl_fn!(ref read_after_serialization, READ_AFTER_SERIALIZATION);\n    interceptor_impl_fn!(mut modify_before_retry_loop, MODIFY_BEFORE_RETRY_LOOP);\n    interceptor_impl_fn!(ref read_before_attempt, READ_BEFORE_ATTEMPT);\n    interceptor_impl_fn!(mut modify_before_signing, MODIFY_BEFORE_SIGNING);\n    interceptor_impl_fn!(ref read_before_signing, READ_BEFORE_SIGNING);\n    interceptor_impl_fn!(ref read_after_signing, READ_AFTER_SIGNING);\n    interceptor_impl_fn!(mut modify_before_transmit, MODIFY_BEFORE_TRANSMIT);\n    interceptor_impl_fn!(ref read_before_transmit, READ_BEFORE_TRANSMIT);\n    interceptor_impl_fn!(ref read_after_transmit, READ_AFTER_TRANSMIT);\n    interceptor_impl_fn!(\n        mut modify_before_deserialization,\n        MODIFY_BEFORE_DESERIALIZATION\n    );\n    interceptor_impl_fn!(ref read_before_deserialization, READ_BEFORE_DESERIALIZATION);\n    interceptor_impl_fn!(ref read_after_deserialization, READ_AFTER_DESERIALIZATION);\n\n    pub(crate) fn modify_before_attempt_completion(\n        self,\n        ctx: &mut InterceptorContext<Input, Output, Error>,\n        runtime_components: &RuntimeComponents,\n        cfg: &mut ConfigBag,\n    ) -> Result<(), InterceptorError> {\n        tracing::trace!(\"running `modify_before_attempt_completion` interceptors\");\n        let mut result: Result<(), (&str, BoxError)> = Ok(());\n        let mut ctx: FinalizerInterceptorContextMut<'_> = ctx.into();\n        for interceptor in self.into_iter() {\n            if interceptor.hook_overridden(OverriddenHooks::MODIFY_BEFORE_ATTEMPT_COMPLETION) {\n                if let Some(interceptor) = interceptor.if_enabled(cfg) {\n                    if let Err(new_error) = interceptor.modify_before_attempt_completion(\n                        &mut ctx,\n                        runtime_components,\n                        cfg,\n                    ) {\n                        if let Err(last_error) = result {\n                            tracing::debug!(\n                                \"{}::{}: {}\",\n                                last_error.0,\n                                \"modify_before_attempt_completion\",\n                                DisplayErrorContext(&*last_error.1)\n                            );\n                        }\n                        result = Err((interceptor.name(), new_error));\n                    }\n                }\n            }\n        }\n        result.map_err(|(name, err)| InterceptorError::modify_before_attempt_completion(name, err))\n    }\n\n    pub(crate) fn read_after_attempt(\n        self,\n        ctx: &InterceptorContext<Input, Output, Error>,\n        runtime_components: &RuntimeComponents,\n        cfg: &mut ConfigBag,\n    ) -> Result<(), InterceptorError> {\n        tracing::trace!(\"running `read_after_attempt` interceptors\");\n        let mut result: Result<(), (&str, BoxError)> = Ok(());\n        let ctx: FinalizerInterceptorContextRef<'_> = ctx.into();\n        for interceptor in self.into_iter() {\n            if interceptor.hook_overridden(OverriddenHooks::READ_AFTER_ATTEMPT) {\n                if let Some(interceptor) = interceptor.if_enabled(cfg) {\n                    if let Err(new_error) =\n                        interceptor.read_after_attempt(&ctx, runtime_components, cfg)\n                    {\n                        if let Err(last_error) = result {\n                            tracing::debug!(\n                                \"{}::{}: {}\",\n                                last_error.0,\n                                \"read_after_attempt\",\n                                DisplayErrorContext(&*last_error.1)\n                            );\n                        }\n                        result = Err((interceptor.name(), new_error));\n                    }\n                }\n            }\n        }\n        result.map_err(|(name, err)| InterceptorError::read_after_attempt(name, err))\n    }\n\n    pub(crate) fn modify_before_completion(\n        self,\n        ctx: &mut InterceptorContext<Input, Output, Error>,\n        runtime_components: &RuntimeComponents,\n        cfg: &mut ConfigBag,\n    ) -> Result<(), InterceptorError> {\n        tracing::trace!(\"running `modify_before_completion` interceptors\");\n        let mut result: Result<(), (&str, BoxError)> = Ok(());\n        let mut ctx: FinalizerInterceptorContextMut<'_> = ctx.into();\n        for interceptor in self.into_iter() {\n            if interceptor.hook_overridden(OverriddenHooks::MODIFY_BEFORE_COMPLETION) {\n                if let Some(interceptor) = interceptor.if_enabled(cfg) {\n                    if let Err(new_error) =\n                        interceptor.modify_before_completion(&mut ctx, runtime_components, cfg)\n                    {\n                        if let Err(last_error) = result {\n                            tracing::debug!(\n                                \"{}::{}: {}\",\n                                last_error.0,\n                                \"modify_before_completion\",\n                                DisplayErrorContext(&*last_error.1)\n                            );\n                        }\n                        result = Err((interceptor.name(), new_error));\n                    }\n                }\n            }\n        }\n        result.map_err(|(name, err)| InterceptorError::modify_before_completion(name, err))\n    }\n\n    pub(crate) fn read_after_execution(\n        self,\n        ctx: &InterceptorContext<Input, Output, Error>,\n        runtime_components: &RuntimeComponents,\n        cfg: &mut ConfigBag,\n    ) -> Result<(), InterceptorError> {\n        tracing::trace!(\"running `read_after_execution` interceptors\");\n        let mut result: Result<(), (&str, BoxError)> = Ok(());\n        let ctx: FinalizerInterceptorContextRef<'_> = ctx.into();\n        for interceptor in self.into_iter() {\n            if interceptor.hook_overridden(OverriddenHooks::READ_AFTER_EXECUTION) {\n                if let Some(interceptor) = interceptor.if_enabled(cfg) {\n                    if let Err(new_error) =\n                        interceptor.read_after_execution(&ctx, runtime_components, cfg)\n                    {\n                        if let Err(last_error) = result {\n                            tracing::debug!(\n                                \"{}::{}: {}\",\n                                last_error.0,\n                                \"read_after_execution\",\n                                DisplayErrorContext(&*last_error.1)\n                            );\n                        }\n                        result = Err((interceptor.name(), new_error));\n                    }\n                }\n            }\n        }\n        result.map_err(|(name, err)| InterceptorError::read_after_execution(name, err))\n    }\n}\n\n/// A interceptor wrapper to conditionally enable the interceptor based on\n/// [`DisableInterceptor`](aws_smithy_runtime_api::client::interceptors::DisableInterceptor)\nstruct ConditionallyEnabledInterceptor(SharedInterceptor);\nimpl ConditionallyEnabledInterceptor {\n    fn if_enabled(&self, cfg: &ConfigBag) -> Option<&dyn Intercept> {\n        if self.0.enabled(cfg) {\n            Some(&self.0)\n        } else {\n            None\n        }\n    }\n\n    fn hook_overridden(&self, hint: OverriddenHooks) -> bool {\n        self.0.overridden_hooks().contains(hint)\n    }\n}\n\n/// Interceptor that maps the request with a given function.\npub struct MapRequestInterceptor<F, E> {\n    f: F,\n    _phantom: PhantomData<E>,\n}\n\nimpl<F, E> fmt::Debug for MapRequestInterceptor<F, E> {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        write!(f, \"MapRequestInterceptor\")\n    }\n}\n\nimpl<F, E> MapRequestInterceptor<F, E> {\n    /// Creates a new `MapRequestInterceptor`.\n    pub fn new(f: F) -> Self {\n        Self {\n            f,\n            _phantom: PhantomData,\n        }\n    }\n}\n\n#[dyn_dispatch_hint]\nimpl<F, E> Intercept for MapRequestInterceptor<F, E>\nwhere\n    F: Fn(HttpRequest) -> Result<HttpRequest, E> + Send + Sync + 'static,\n    E: StdError + Send + Sync + 'static,\n{\n    fn name(&self) -> &'static str {\n        \"MapRequestInterceptor\"\n    }\n\n    fn modify_before_signing(\n        &self,\n        context: &mut BeforeTransmitInterceptorContextMut<'_>,\n        _runtime_components: &RuntimeComponents,\n        _cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        let mut request = HttpRequest::new(SdkBody::taken());\n        std::mem::swap(&mut request, context.request_mut());\n        let mut mapped = (self.f)(request)?;\n        std::mem::swap(&mut mapped, context.request_mut());\n\n        Ok(())\n    }\n}\n\n/// Interceptor that mutates the request with a given function.\npub struct MutateRequestInterceptor<F> {\n    f: F,\n}\n\nimpl<F> fmt::Debug for MutateRequestInterceptor<F> {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        write!(f, \"MutateRequestInterceptor\")\n    }\n}\n\nimpl<F> MutateRequestInterceptor<F> {\n    /// Creates a new `MutateRequestInterceptor`.\n    pub fn new(f: F) -> Self {\n        Self { f }\n    }\n}\n\n#[dyn_dispatch_hint]\nimpl<F> Intercept for MutateRequestInterceptor<F>\nwhere\n    F: Fn(&mut HttpRequest) + Send + Sync + 'static,\n{\n    fn name(&self) -> &'static str {\n        \"MutateRequestInterceptor\"\n    }\n\n    fn modify_before_signing(\n        &self,\n        context: &mut BeforeTransmitInterceptorContextMut<'_>,\n        _runtime_components: &RuntimeComponents,\n        _cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        let request = context.request_mut();\n        (self.f)(request);\n\n        Ok(())\n    }\n}\n\n#[cfg(all(test, feature = \"test-util\"))]\nmod tests {\n    use super::*;\n    use aws_smithy_runtime_api::box_error::BoxError;\n    use aws_smithy_runtime_api::client::interceptors::context::{\n        BeforeTransmitInterceptorContextRef, Input, InterceptorContext,\n    };\n    use aws_smithy_runtime_api::client::interceptors::{\n        disable_interceptor, Intercept, SharedInterceptor,\n    };\n    use aws_smithy_runtime_api::client::runtime_components::{\n        RuntimeComponents, RuntimeComponentsBuilder,\n    };\n    use aws_smithy_types::config_bag::ConfigBag;\n\n    #[derive(Debug)]\n    struct TestInterceptor;\n    impl Intercept for TestInterceptor {\n        fn name(&self) -> &'static str {\n            \"TestInterceptor\"\n        }\n    }\n\n    #[test]\n    fn test_disable_interceptors() {\n        #[derive(Debug)]\n        struct PanicInterceptor;\n        impl Intercept for PanicInterceptor {\n            fn name(&self) -> &'static str {\n                \"PanicInterceptor\"\n            }\n\n            fn read_before_transmit(\n                &self,\n                _context: &BeforeTransmitInterceptorContextRef<'_>,\n                _rc: &RuntimeComponents,\n                _cfg: &mut ConfigBag,\n            ) -> Result<(), BoxError> {\n                Err(\"boom\".into())\n            }\n        }\n        let rc = RuntimeComponentsBuilder::for_tests()\n            .with_interceptor(SharedInterceptor::new(PanicInterceptor))\n            .with_interceptor(SharedInterceptor::new(TestInterceptor))\n            .build()\n            .unwrap();\n\n        let mut cfg = ConfigBag::base();\n        let interceptors = Interceptors::new(rc.interceptors());\n        assert_eq!(\n            interceptors\n                .into_iter()\n                .filter(|i| i.if_enabled(&cfg).is_some())\n                .count(),\n            2\n        );\n\n        Interceptors::new(rc.interceptors())\n            .read_before_transmit(\n                &InterceptorContext::new(Input::doesnt_matter()),\n                &rc,\n                &mut cfg,\n            )\n            .expect_err(\"interceptor returns error\");\n        cfg.interceptor_state()\n            .store_put(disable_interceptor::<PanicInterceptor>(\"test\"));\n        assert_eq!(\n            Interceptors::new(rc.interceptors())\n                .into_iter()\n                .filter(|i| i.if_enabled(&cfg).is_some())\n                .count(),\n            1\n        );\n        // shouldn't error because interceptors won't run\n        Interceptors::new(rc.interceptors())\n            .read_before_transmit(\n                &InterceptorContext::new(Input::doesnt_matter()),\n                &rc,\n                &mut cfg,\n            )\n            .expect(\"interceptor is now disabled\");\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime/src/client/metrics.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_smithy_async::time::{SharedTimeSource, TimeSource};\nuse aws_smithy_observability::{\n    global::get_telemetry_provider, instruments::Histogram, AttributeValue, Attributes,\n    ObservabilityError,\n};\nuse aws_smithy_runtime_api::client::{\n    interceptors::{dyn_dispatch_hint, Intercept, SharedInterceptor},\n    orchestrator::Metadata,\n    runtime_components::RuntimeComponentsBuilder,\n    runtime_plugin::RuntimePlugin,\n};\nuse aws_smithy_types::config_bag::{FrozenLayer, Layer, Storable, StoreReplace};\nuse std::{borrow::Cow, sync::Arc, time::SystemTime};\n\n/// Struct to hold metric data in the ConfigBag\n#[derive(Debug, Clone)]\npub(crate) struct MeasurementsContainer {\n    call_start: SystemTime,\n    attempts: u32,\n    attempt_start: SystemTime,\n}\n\nimpl Storable for MeasurementsContainer {\n    type Storer = StoreReplace<Self>;\n}\n\n/// Instruments for recording a single operation\n#[derive(Debug, Clone)]\npub(crate) struct OperationTelemetry {\n    pub(crate) operation_duration: Arc<dyn Histogram>,\n    pub(crate) attempt_duration: Arc<dyn Histogram>,\n}\n\nimpl OperationTelemetry {\n    pub(crate) fn new(scope: &'static str) -> Result<Self, ObservabilityError> {\n        let meter = get_telemetry_provider()?\n            .meter_provider()\n            .get_meter(scope, None);\n\n        Ok(Self{\n            operation_duration: meter\n                .create_histogram(\"smithy.client.call.duration\")\n                .set_units(\"s\")\n                .set_description(\"Overall call duration (including retries and time to send or receive request and response body)\")\n                .build(),\n            attempt_duration: meter\n                .create_histogram(\"smithy.client.call.attempt.duration\")\n                .set_units(\"s\")\n                .set_description(\"The time it takes to connect to the service, send the request, and get back HTTP status code and headers (including time queued waiting to be sent)\")\n                .build(),\n        })\n    }\n}\n\nimpl Storable for OperationTelemetry {\n    type Storer = StoreReplace<Self>;\n}\n\n#[derive(Debug)]\npub(crate) struct MetricsInterceptor {\n    // Holding a TimeSource here isn't ideal, but RuntimeComponents aren't available in\n    // the read_before_execution hook and that is when we need to start the timer for\n    // the operation.\n    time_source: SharedTimeSource,\n}\n\nimpl MetricsInterceptor {\n    pub(crate) fn new(time_source: SharedTimeSource) -> Result<Self, ObservabilityError> {\n        Ok(MetricsInterceptor { time_source })\n    }\n\n    pub(crate) fn get_attrs_from_cfg(\n        &self,\n        cfg: &aws_smithy_types::config_bag::ConfigBag,\n    ) -> Option<Attributes> {\n        let operation_metadata = cfg.load::<Metadata>();\n\n        if let Some(md) = operation_metadata {\n            let mut attributes = Attributes::new();\n            attributes.set(\"rpc.service\", AttributeValue::String(md.service().into()));\n            attributes.set(\"rpc.method\", AttributeValue::String(md.name().into()));\n\n            Some(attributes)\n        } else {\n            None\n        }\n    }\n\n    pub(crate) fn get_measurements_and_instruments<'a>(\n        &self,\n        cfg: &'a aws_smithy_types::config_bag::ConfigBag,\n    ) -> (&'a MeasurementsContainer, &'a OperationTelemetry) {\n        let measurements = cfg\n            .load::<MeasurementsContainer>()\n            .expect(\"set in `read_before_execution`\");\n\n        let instruments = cfg\n            .load::<OperationTelemetry>()\n            .expect(\"set in RuntimePlugin\");\n\n        (measurements, instruments)\n    }\n}\n\n#[dyn_dispatch_hint]\nimpl Intercept for MetricsInterceptor {\n    fn name(&self) -> &'static str {\n        \"MetricsInterceptor\"\n    }\n\n    fn read_before_execution(\n        &self,\n        _context: &aws_smithy_runtime_api::client::interceptors::context::BeforeSerializationInterceptorContextRef<'_>,\n        cfg: &mut aws_smithy_types::config_bag::ConfigBag,\n    ) -> Result<(), aws_smithy_runtime_api::box_error::BoxError> {\n        cfg.interceptor_state().store_put(MeasurementsContainer {\n            call_start: self.time_source.now(),\n            attempts: 0,\n            attempt_start: SystemTime::UNIX_EPOCH,\n        });\n\n        Ok(())\n    }\n\n    fn read_after_execution(\n        &self,\n        _context: &aws_smithy_runtime_api::client::interceptors::context::FinalizerInterceptorContextRef<'_>,\n        _runtime_components: &aws_smithy_runtime_api::client::runtime_components::RuntimeComponents,\n        cfg: &mut aws_smithy_types::config_bag::ConfigBag,\n    ) -> Result<(), aws_smithy_runtime_api::box_error::BoxError> {\n        let (measurements, instruments) = self.get_measurements_and_instruments(cfg);\n\n        let attributes = self.get_attrs_from_cfg(cfg);\n\n        if let Some(attrs) = attributes {\n            let call_end = self.time_source.now();\n            let call_duration = call_end.duration_since(measurements.call_start);\n            if let Ok(elapsed) = call_duration {\n                instruments\n                    .operation_duration\n                    .record(elapsed.as_secs_f64(), Some(&attrs), None);\n            }\n        }\n\n        Ok(())\n    }\n\n    fn read_before_attempt(\n        &self,\n        _context: &aws_smithy_runtime_api::client::interceptors::context::BeforeTransmitInterceptorContextRef<'_>,\n        _runtime_components: &aws_smithy_runtime_api::client::runtime_components::RuntimeComponents,\n        cfg: &mut aws_smithy_types::config_bag::ConfigBag,\n    ) -> Result<(), aws_smithy_runtime_api::box_error::BoxError> {\n        let measurements = cfg\n            .get_mut::<MeasurementsContainer>()\n            .expect(\"set in `read_before_execution`\");\n\n        measurements.attempts += 1;\n        measurements.attempt_start = self.time_source.now();\n\n        Ok(())\n    }\n\n    fn read_after_attempt(\n        &self,\n        _context: &aws_smithy_runtime_api::client::interceptors::context::FinalizerInterceptorContextRef<'_>,\n        _runtime_components: &aws_smithy_runtime_api::client::runtime_components::RuntimeComponents,\n        cfg: &mut aws_smithy_types::config_bag::ConfigBag,\n    ) -> Result<(), aws_smithy_runtime_api::box_error::BoxError> {\n        let (measurements, instruments) = self.get_measurements_and_instruments(cfg);\n\n        let attempt_end = self.time_source.now();\n        let attempt_duration = attempt_end.duration_since(measurements.attempt_start);\n        let attributes = self.get_attrs_from_cfg(cfg);\n\n        if let (Ok(elapsed), Some(mut attrs)) = (attempt_duration, attributes) {\n            attrs.set(\"attempt\", AttributeValue::I64(measurements.attempts.into()));\n\n            instruments\n                .attempt_duration\n                .record(elapsed.as_secs_f64(), Some(&attrs), None);\n        }\n        Ok(())\n    }\n}\n\n/// Runtime plugin that adds an interceptor for collecting metrics\n#[derive(Debug, Default)]\npub struct MetricsRuntimePlugin {\n    scope: &'static str,\n    time_source: SharedTimeSource,\n    metadata: Option<Metadata>,\n}\n\nimpl MetricsRuntimePlugin {\n    /// Create a [MetricsRuntimePluginBuilder]\n    pub fn builder() -> MetricsRuntimePluginBuilder {\n        MetricsRuntimePluginBuilder::default()\n    }\n}\n\nimpl RuntimePlugin for MetricsRuntimePlugin {\n    fn runtime_components(\n        &self,\n        _current_components: &RuntimeComponentsBuilder,\n    ) -> Cow<'_, RuntimeComponentsBuilder> {\n        let interceptor = MetricsInterceptor::new(self.time_source.clone());\n        if let Ok(interceptor) = interceptor {\n            Cow::Owned(\n                RuntimeComponentsBuilder::new(\"Metrics\")\n                    .with_interceptor(SharedInterceptor::permanent(interceptor)),\n            )\n        } else {\n            Cow::Owned(RuntimeComponentsBuilder::new(\"Metrics\"))\n        }\n    }\n\n    fn config(&self) -> Option<FrozenLayer> {\n        let instruments = OperationTelemetry::new(self.scope);\n\n        if let Ok(instruments) = instruments {\n            let mut cfg = Layer::new(\"Metrics\");\n            cfg.store_put(instruments);\n\n            if let Some(metadata) = &self.metadata {\n                cfg.store_put(metadata.clone());\n            }\n\n            Some(cfg.freeze())\n        } else {\n            None\n        }\n    }\n}\n\n/// Builder for [MetricsRuntimePlugin]\n#[derive(Debug, Default)]\npub struct MetricsRuntimePluginBuilder {\n    scope: Option<&'static str>,\n    time_source: Option<SharedTimeSource>,\n    metadata: Option<Metadata>,\n}\n\nimpl MetricsRuntimePluginBuilder {\n    /// Set the scope for the metrics\n    pub fn with_scope(mut self, scope: &'static str) -> Self {\n        self.scope = Some(scope);\n        self\n    }\n\n    /// Set the [TimeSource] for the metrics\n    pub fn with_time_source(mut self, time_source: impl TimeSource + 'static) -> Self {\n        self.time_source = Some(SharedTimeSource::new(time_source));\n        self\n    }\n\n    /// Set the [Metadata] for the metrics.\n    ///\n    /// Note: the Metadata is optional, most operations set it themselves, but this is useful\n    /// for operations that do not, like some of the credential providers.\n    pub fn with_metadata(mut self, metadata: Metadata) -> Self {\n        self.metadata = Some(metadata);\n        self\n    }\n\n    /// Build a [MetricsRuntimePlugin]\n    pub fn build(\n        self,\n    ) -> Result<MetricsRuntimePlugin, aws_smithy_runtime_api::box_error::BoxError> {\n        if let Some(scope) = self.scope {\n            Ok(MetricsRuntimePlugin {\n                scope,\n                time_source: self.time_source.unwrap_or_default(),\n                metadata: self.metadata,\n            })\n        } else {\n            Err(\"Scope is required for MetricsRuntimePlugin.\".into())\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime/src/client/orchestrator/auth.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::client::auth::no_auth::NO_AUTH_SCHEME_ID;\nuse crate::client::identity::IdentityCache;\nuse aws_smithy_runtime_api::box_error::BoxError;\nuse aws_smithy_runtime_api::client::auth::{\n    AuthScheme, AuthSchemeEndpointConfig, AuthSchemeId, AuthSchemeOption,\n    AuthSchemeOptionResolverParams, AuthSchemePreference, ResolveAuthSchemeOptions,\n};\nuse aws_smithy_runtime_api::client::endpoint::{EndpointResolverParams, ResolveEndpoint};\nuse aws_smithy_runtime_api::client::identity::{Identity, ResolveIdentity};\nuse aws_smithy_runtime_api::client::identity::{IdentityCacheLocation, ResolveCachedIdentity};\nuse aws_smithy_runtime_api::client::interceptors::context::InterceptorContext;\nuse aws_smithy_runtime_api::client::runtime_components::RuntimeComponents;\nuse aws_smithy_types::config_bag::{ConfigBag, FrozenLayer, Storable, StoreReplace};\nuse aws_smithy_types::endpoint::Endpoint;\nuse aws_smithy_types::Document;\nuse std::borrow::Cow;\nuse std::collections::HashMap;\nuse std::error::Error as StdError;\nuse std::fmt;\nuse tracing::trace;\n\n#[derive(Debug)]\nstruct NoMatchingAuthSchemeError(ExploredList);\n\nimpl fmt::Display for NoMatchingAuthSchemeError {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        let explored = &self.0;\n\n        // Use the information we have about the auth options that were explored to construct\n        // as helpful of an error message as possible.\n        if explored.items().count() == 0 {\n            return f.write_str(\n                \"no auth options are available. This can happen if there's \\\n                    a problem with the service model, or if there is a codegen bug.\",\n            );\n        }\n        if explored\n            .items()\n            .all(|explored| matches!(explored.result, ExploreResult::NoAuthScheme))\n        {\n            return f.write_str(\n                \"no auth schemes are registered. This can happen if there's \\\n                    a problem with the service model, or if there is a codegen bug.\",\n            );\n        }\n\n        let mut try_add_identity = false;\n        let mut likely_bug = false;\n        f.write_str(\"failed to select an auth scheme to sign the request with.\")?;\n        for item in explored.items() {\n            write!(\n                f,\n                \" \\\"{}\\\" wasn't a valid option because \",\n                item.scheme_id.inner()\n            )?;\n            f.write_str(match item.result {\n                ExploreResult::NoAuthScheme => {\n                    likely_bug = true;\n                    \"no auth scheme was registered for it.\"\n                }\n                ExploreResult::NoIdentityResolver => {\n                    try_add_identity = true;\n                    \"there was no identity resolver for it.\"\n                }\n                ExploreResult::MissingEndpointConfig => {\n                    likely_bug = true;\n                    \"there is auth config in the endpoint config, but this scheme wasn't listed in it \\\n                    (see https://github.com/smithy-lang/smithy-rs/discussions/3281 for more details).\"\n                }\n                ExploreResult::NotExplored => {\n                    debug_assert!(false, \"this should be unreachable\");\n                    \"<unknown>\"\n                }\n            })?;\n        }\n        if try_add_identity {\n            f.write_str(\" Be sure to set an identity, such as credentials, auth token, or other identity type that is required for this service.\")?;\n        } else if likely_bug {\n            f.write_str(\" This is likely a bug.\")?;\n        }\n        if !likely_bug\n            && !explored\n                .items()\n                .any(|explored| explored.scheme_id == NO_AUTH_SCHEME_ID)\n        {\n            f.write_str(\n                \" If you intended to make an unauthenticated request, consider using `@optionalAuth` or `@auth([])` on the operation in the service model and regenerating the client SDK. \\\n                If modifying the model is not possible, you can disable authentication at runtime as described in https://github.com/smithy-lang/smithy-rs/discussions/4197.\"\n            )?;\n        }\n        if explored.truncated {\n            f.write_str(\" Note: there were other auth schemes that were evaluated that weren't listed here.\")?;\n        }\n\n        Ok(())\n    }\n}\n\nimpl StdError for NoMatchingAuthSchemeError {}\n\n#[derive(Debug)]\nenum AuthOrchestrationError {\n    MissingEndpointConfig,\n    BadAuthSchemeEndpointConfig(Cow<'static, str>),\n    FailedToResolveEndpoint(BoxError),\n}\n\nimpl fmt::Display for AuthOrchestrationError {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        match self {\n            // This error is never bubbled up\n            Self::MissingEndpointConfig => f.write_str(\"missing endpoint config\"),\n            Self::BadAuthSchemeEndpointConfig(message) => f.write_str(message),\n            Self::FailedToResolveEndpoint(source) => {\n                write!(f, \"failed to resolve endpoint: {source}\")\n            }\n        }\n    }\n}\n\nimpl StdError for AuthOrchestrationError {}\n\npub(super) async fn resolve_identity(\n    runtime_components: &RuntimeComponents,\n    cfg: &mut ConfigBag,\n) -> Result<(AuthSchemeId, Identity, Option<Endpoint>), BoxError> {\n    let params = cfg\n        .load::<AuthSchemeOptionResolverParams>()\n        .expect(\"auth scheme option resolver params must be set\");\n    let option_resolver = runtime_components.auth_scheme_option_resolver();\n    let options = option_resolver\n        .resolve_auth_scheme_options_v2(params, cfg, runtime_components)\n        .await?;\n    let options =\n        reprioritize_with_auth_scheme_preference(options, cfg.load::<AuthSchemePreference>()).await;\n\n    trace!(\n        auth_scheme_option_resolver_params = ?params,\n        auth_scheme_options = ?options,\n        \"orchestrating auth\",\n    );\n\n    let mut explored = ExploredList::default();\n\n    // Iterate over IDs of possibly-supported auth schemes\n    for auth_scheme_option in &options {\n        let scheme_id = auth_scheme_option.scheme_id();\n        // For each ID, try to resolve the corresponding auth scheme.\n        if let Some(auth_scheme) = runtime_components.auth_scheme(scheme_id) {\n            // Use the resolved auth scheme to resolve an identity\n            if let Some(identity_resolver) = auth_scheme.identity_resolver(runtime_components) {\n                match legacy_try_resolve_endpoint(runtime_components, cfg, scheme_id).await {\n                    Ok(endpoint) => {\n                        trace!(scheme_id= ?scheme_id, \"resolving identity\");\n                        let identity_cache = if identity_resolver.cache_location()\n                            == IdentityCacheLocation::RuntimeComponents\n                        {\n                            runtime_components.identity_cache()\n                        } else {\n                            IdentityCache::no_cache()\n                        };\n                        // Apply properties from the selected auth scheme option\n                        if let Some(properties) = auth_scheme_option.properties() {\n                            cfg.push_shared_layer(properties);\n                        }\n                        let identity = identity_cache\n                            .resolve_cached_identity(identity_resolver, runtime_components, cfg)\n                            .await?;\n                        trace!(identity = ?identity, \"resolved identity\");\n                        // Extract the FrozenLayer placed in the Identity property bag by the From<Credentials> impl.\n                        // This layer contains feature data for the user agent and potentially other metadata.\n                        if let Some(layer) = identity.property::<FrozenLayer>().cloned() {\n                            cfg.push_shared_layer(layer);\n                        }\n                        return Ok((scheme_id.clone(), identity, endpoint));\n                    }\n                    Err(AuthOrchestrationError::MissingEndpointConfig) => {\n                        explored.push(scheme_id.clone(), ExploreResult::MissingEndpointConfig);\n                        continue;\n                    }\n                    Err(AuthOrchestrationError::FailedToResolveEndpoint(source)) => {\n                        // Some negative endpoint tests expect an endpoint resolution error,\n                        // so we need to return it to satisfy them.\n                        return Err(source);\n                    }\n                    Err(other_err) => {\n                        return Err(other_err.into());\n                    }\n                }\n            } else {\n                explored.push(scheme_id.clone(), ExploreResult::NoIdentityResolver);\n            }\n        } else {\n            explored.push(scheme_id.clone(), ExploreResult::NoAuthScheme);\n        }\n    }\n\n    Err(NoMatchingAuthSchemeError(explored).into())\n}\n\n// Re-prioritize `supported_auth_scheme_options` based on `auth_scheme_preference`\n//\n// Schemes in `auth_scheme_preference` that are not present in `supported_auth_scheme_options` will be ignored.\nasync fn reprioritize_with_auth_scheme_preference(\n    supported_auth_scheme_options: Vec<AuthSchemeOption>,\n    auth_scheme_preference: Option<&AuthSchemePreference>,\n) -> Vec<AuthSchemeOption> {\n    match auth_scheme_preference {\n        Some(preference) => {\n            // maps auth scheme ID to the index in the preference list\n            let preference_map: HashMap<_, _> = preference\n                .clone()\n                .into_iter()\n                .enumerate()\n                .map(|(i, s)| (s, i))\n                .collect();\n            let (mut preferred, non_preferred): (Vec<_>, Vec<_>) = supported_auth_scheme_options\n                .into_iter()\n                .partition(|auth_scheme_option| {\n                    preference_map.contains_key(auth_scheme_option.scheme_id())\n                });\n\n            preferred.sort_by_key(|opt| {\n                preference_map\n                    .get(opt.scheme_id())\n                    .expect(\"guaranteed by `partition`\")\n            });\n            preferred.extend(non_preferred);\n            preferred\n        }\n        None => supported_auth_scheme_options,\n    }\n}\n\npub(super) fn sign_request(\n    scheme_id: &AuthSchemeId,\n    identity: &Identity,\n    ctx: &mut InterceptorContext,\n    runtime_components: &RuntimeComponents,\n    cfg: &ConfigBag,\n) -> Result<(), BoxError> {\n    trace!(\"signing request\");\n    let request = ctx.request_mut().expect(\"set during serialization\");\n    let endpoint = cfg\n        .load::<Endpoint>()\n        .expect(\"endpoint added to config bag by endpoint orchestrator\");\n    let auth_scheme = runtime_components\n        .auth_scheme(scheme_id)\n        .ok_or(\"should be configured\")?;\n    let signer = auth_scheme.signer();\n    let auth_scheme_endpoint_config = extract_endpoint_auth_scheme_config(endpoint, scheme_id)?;\n    trace!(\n        signer = ?signer,\n        \"signing implementation\"\n    );\n    signer.sign_http_request(\n        request,\n        identity,\n        auth_scheme_endpoint_config,\n        runtime_components,\n        cfg,\n    )?;\n    Ok(())\n}\n\n// Marker indicating the correct resolution order: auth scheme resolution, identity resolution,\n// and then endpoint resolution, as specified in the SRA.\n//\n// This marker is included in the config bag to signify the intended resolution order\n// by design. When the crate was released for GA, the resolution order was reversed\n// (endpoint resolution first, followed by identity resolution). However, we later\n// discovered the order needed correcting without breaking existing SDKs.\n// This marker signals the runtime to support both resolution orders without introducing\n// `aws-smithy-runtime` version 2.x.\n//\n// When this marker is present in the config bag (the default behavior for forward compatibility),\n// `resolve_identity` skips endpoint resolution, ensuring that `try_attempt` follows\n// the correct resolution order: auth scheme → identity → endpoint.\n// If the marker is absent, `try_attempt` continues using\n// the legacy, incorrect resolution order: endpoint → auth scheme → identity.\n#[doc(hidden)]\n#[derive(Clone, Debug)]\npub struct AuthSchemeAndEndpointOrchestrationV2;\n\nimpl Storable for AuthSchemeAndEndpointOrchestrationV2 {\n    type Storer = StoreReplace<Self>;\n}\n\n// Conditionally return an `endpoint` resolved by `SharedEndpointResolver` in `runtime_components`\n// whose `authSchemes` property matches the given `scheme_id`\n//\n// Return the `Ok` variant in the following cases:\n// - If `AuthSchemeAndEndpointOrchestrationV2` is present in the config bag, indicating that the runtime doesn't require the functionality of this function.\n//   In this case, the function short-circuits and returns `Ok(None)`, as no endpoint needs resolution. Instead, a custom `AuthSchemeOptionResolver`\n//   should have resolved it internally for auth scheme selection.\n// - If the runtime uses the legacy auth scheme and endpoint orchestration and resolves an endpoint that matches the given condition,\n//   the function returns `Ok(endpoint)`, which will then be applied to the request.\nasync fn legacy_try_resolve_endpoint(\n    runtime_components: &RuntimeComponents,\n    cfg: &ConfigBag,\n    scheme_id: &AuthSchemeId,\n) -> Result<Option<Endpoint>, AuthOrchestrationError> {\n    if cfg.load::<AuthSchemeAndEndpointOrchestrationV2>().is_some() {\n        // The orchestrator uses the correct auth scheme and endpoint resolution order,\n        // and no endpoint needs to be resolved within this function.\n        return Ok(None);\n    }\n\n    let params = cfg\n        .load::<EndpointResolverParams>()\n        .expect(\"endpoint resolver params must be set\");\n\n    tracing::debug!(scheme_id = ?scheme_id, endpoint_params = ?params, \"using legacy auth and endpoint orchestration, resolving endpoint for auth scheme selection\");\n\n    let endpoint = runtime_components\n        .endpoint_resolver()\n        .resolve_endpoint(params)\n        .await\n        .map_err(AuthOrchestrationError::FailedToResolveEndpoint)?;\n\n    // This line repurposes `extract_endpoint_auth_scheme_config` to check whether\n    // the function returns `Ok` for the given `endpoint`.\n    // Essentially, we verify if the `authSchemes` property of `endpoint` contains `scheme_id`,\n    // which is done by `schemes.iter().find(...).ok_or(...)` within the function.\n    // However, this execution path is only exercised for legacy auth scheme and endpoint orchestration,\n    // so we don't bother refactoring the predicate out of the function.\n    let _ = extract_endpoint_auth_scheme_config(&endpoint, scheme_id)?;\n\n    Ok(Some(endpoint))\n}\n\nfn extract_endpoint_auth_scheme_config<'a>(\n    endpoint: &'a Endpoint,\n    scheme_id: &AuthSchemeId,\n) -> Result<AuthSchemeEndpointConfig<'a>, AuthOrchestrationError> {\n    // TODO(P96049742): Endpoint config doesn't currently have a concept of optional auth or \"no auth\", so\n    // we are short-circuiting lookup of endpoint auth scheme config if that is the selected scheme.\n    if scheme_id == &NO_AUTH_SCHEME_ID {\n        return Ok(AuthSchemeEndpointConfig::empty());\n    }\n    let auth_schemes = match endpoint.properties().get(\"authSchemes\") {\n        Some(Document::Array(schemes)) => schemes,\n        // no auth schemes:\n        None => return Ok(AuthSchemeEndpointConfig::empty()),\n        _other => {\n            return Err(AuthOrchestrationError::BadAuthSchemeEndpointConfig(\n                \"expected an array for `authSchemes` in endpoint config\".into(),\n            ))\n        }\n    };\n    let auth_scheme_config = auth_schemes\n        .iter()\n        .find(|doc| {\n            let config_scheme_id = doc\n                .as_object()\n                .and_then(|object| object.get(\"name\"))\n                .and_then(Document::as_string);\n            config_scheme_id == Some(scheme_id.inner())\n        })\n        .ok_or(AuthOrchestrationError::MissingEndpointConfig)?;\n    Ok(AuthSchemeEndpointConfig::from(Some(auth_scheme_config)))\n}\n\n#[derive(Debug)]\nenum ExploreResult {\n    NotExplored,\n    NoAuthScheme,\n    NoIdentityResolver,\n    MissingEndpointConfig,\n}\n\n/// Information about an evaluated auth option.\n/// This should be kept small so it can fit in an array on the stack.\n#[derive(Debug)]\nstruct ExploredAuthOption {\n    scheme_id: AuthSchemeId,\n    result: ExploreResult,\n}\nimpl Default for ExploredAuthOption {\n    fn default() -> Self {\n        Self {\n            scheme_id: AuthSchemeId::new(\"\"),\n            result: ExploreResult::NotExplored,\n        }\n    }\n}\n\nconst MAX_EXPLORED_LIST_LEN: usize = 8;\n\n/// Stack allocated list of explored auth options for error messaging\n#[derive(Default)]\nstruct ExploredList {\n    items: [ExploredAuthOption; MAX_EXPLORED_LIST_LEN],\n    len: usize,\n    truncated: bool,\n}\nimpl ExploredList {\n    fn items(&self) -> impl Iterator<Item = &ExploredAuthOption> {\n        self.items.iter().take(self.len)\n    }\n\n    fn push(&mut self, scheme_id: AuthSchemeId, result: ExploreResult) {\n        if self.len + 1 >= self.items.len() {\n            self.truncated = true;\n        } else {\n            self.items[self.len] = ExploredAuthOption { scheme_id, result };\n            self.len += 1;\n        }\n    }\n}\nimpl fmt::Debug for ExploredList {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        f.debug_struct(\"ExploredList\")\n            .field(\"items\", &&self.items[0..self.len])\n            .field(\"truncated\", &self.truncated)\n            .finish()\n    }\n}\n\n#[cfg(all(test, any(feature = \"test-util\", feature = \"legacy-test-util\")))]\nmod tests {\n    use super::*;\n    use crate::client::orchestrator::endpoints::{\n        StaticUriEndpointResolver, StaticUriEndpointResolverParams,\n    };\n    use aws_smithy_runtime_api::client::auth::static_resolver::StaticAuthSchemeOptionResolver;\n    use aws_smithy_runtime_api::client::auth::{\n        AuthScheme, AuthSchemeId, AuthSchemeOptionResolverParams, SharedAuthScheme,\n        SharedAuthSchemeOptionResolver, Sign,\n    };\n    use aws_smithy_runtime_api::client::endpoint::SharedEndpointResolver;\n    use aws_smithy_runtime_api::client::identity::{\n        Identity, IdentityFuture, ResolveIdentity, SharedIdentityResolver,\n    };\n    use aws_smithy_runtime_api::client::interceptors::context::{Input, InterceptorContext};\n    use aws_smithy_runtime_api::client::orchestrator::HttpRequest;\n    use aws_smithy_runtime_api::client::runtime_components::{\n        GetIdentityResolver, RuntimeComponents, RuntimeComponentsBuilder,\n    };\n    use aws_smithy_types::config_bag::Layer;\n    use std::collections::HashMap;\n\n    #[tokio::test]\n    async fn basic_case() {\n        #[derive(Debug)]\n        struct TestIdentityResolver;\n        impl ResolveIdentity for TestIdentityResolver {\n            fn resolve_identity<'a>(\n                &'a self,\n                _runtime_components: &'a RuntimeComponents,\n                _config_bag: &'a ConfigBag,\n            ) -> IdentityFuture<'a> {\n                IdentityFuture::ready(Ok(Identity::new(\"doesntmatter\", None)))\n            }\n        }\n\n        #[derive(Debug)]\n        struct TestSigner;\n\n        impl Sign for TestSigner {\n            fn sign_http_request(\n                &self,\n                request: &mut HttpRequest,\n                _identity: &Identity,\n                _auth_scheme_endpoint_config: AuthSchemeEndpointConfig<'_>,\n                _runtime_components: &RuntimeComponents,\n                _config_bag: &ConfigBag,\n            ) -> Result<(), BoxError> {\n                request\n                    .headers_mut()\n                    .insert(http_1x::header::AUTHORIZATION, \"success!\");\n                Ok(())\n            }\n        }\n\n        const TEST_SCHEME_ID: AuthSchemeId = AuthSchemeId::new(\"test-scheme\");\n\n        #[derive(Debug)]\n        struct TestAuthScheme {\n            signer: TestSigner,\n        }\n        impl AuthScheme for TestAuthScheme {\n            fn scheme_id(&self) -> AuthSchemeId {\n                TEST_SCHEME_ID\n            }\n\n            fn identity_resolver(\n                &self,\n                identity_resolvers: &dyn GetIdentityResolver,\n            ) -> Option<SharedIdentityResolver> {\n                identity_resolvers.identity_resolver(self.scheme_id())\n            }\n\n            fn signer(&self) -> &dyn Sign {\n                &self.signer\n            }\n        }\n\n        async fn run_test(add_more_to_layer: impl Fn(Layer) -> Layer) {\n            let mut ctx = InterceptorContext::new(Input::doesnt_matter());\n            ctx.enter_serialization_phase();\n            ctx.set_request(HttpRequest::empty());\n            let _ = ctx.take_input();\n            ctx.enter_before_transmit_phase();\n\n            let runtime_components = RuntimeComponentsBuilder::for_tests()\n                .with_auth_scheme(SharedAuthScheme::new(TestAuthScheme { signer: TestSigner }))\n                .with_auth_scheme_option_resolver(Some(SharedAuthSchemeOptionResolver::new(\n                    StaticAuthSchemeOptionResolver::new(vec![TEST_SCHEME_ID]),\n                )))\n                .with_identity_resolver(\n                    TEST_SCHEME_ID,\n                    SharedIdentityResolver::new(TestIdentityResolver),\n                )\n                .with_endpoint_resolver(Some(SharedEndpointResolver::new(\n                    StaticUriEndpointResolver::http_localhost(8080),\n                )))\n                .build()\n                .unwrap();\n\n            let mut layer: Layer = Layer::new(\"test\");\n            layer.store_put(AuthSchemeOptionResolverParams::new(\"doesntmatter\"));\n            layer.store_put(Endpoint::builder().url(\"dontcare\").build());\n            let layer = add_more_to_layer(layer);\n            let mut cfg = ConfigBag::of_layers(vec![layer]);\n\n            let (scheme_id, identity, _) = resolve_identity(&runtime_components, &mut cfg)\n                .await\n                .expect(\"success\");\n\n            sign_request(&scheme_id, &identity, &mut ctx, &runtime_components, &cfg)\n                .expect(\"success\");\n\n            assert_eq!(\n                \"success!\",\n                ctx.request()\n                    .expect(\"request is set\")\n                    .headers()\n                    .get(\"Authorization\")\n                    .unwrap()\n            );\n        }\n\n        // test for correct auth and endpoint orchestration\n        run_test(|mut layer| {\n            layer.store_put(AuthSchemeAndEndpointOrchestrationV2);\n            layer\n        })\n        .await;\n\n        // test for legacy auth and endpoint orchestration (no `AuthSchemeAndEndpointOrchestrationV2` in `layer`)\n        run_test(|mut layer| {\n            layer.store_put(EndpointResolverParams::from(\n                StaticUriEndpointResolverParams::new(),\n            ));\n            layer\n        })\n        .await;\n    }\n\n    #[cfg(feature = \"http-auth\")]\n    #[tokio::test]\n    async fn select_best_scheme_for_available_identity_resolvers() {\n        use crate::client::auth::http::{BasicAuthScheme, BearerAuthScheme};\n        use aws_smithy_runtime_api::client::auth::http::{\n            HTTP_BASIC_AUTH_SCHEME_ID, HTTP_BEARER_AUTH_SCHEME_ID,\n        };\n        use aws_smithy_runtime_api::client::identity::http::{Login, Token};\n\n        async fn run_test(add_more_to_layer: impl Fn(Layer) -> Layer) {\n            let mut ctx = InterceptorContext::new(Input::doesnt_matter());\n            ctx.enter_serialization_phase();\n            ctx.set_request(HttpRequest::empty());\n            let _ = ctx.take_input();\n            ctx.enter_before_transmit_phase();\n\n            // First, test the presence of a basic auth login and absence of a bearer token\n            let (runtime_components, layer) =\n                config_with_identity(HTTP_BASIC_AUTH_SCHEME_ID, Login::new(\"a\", \"b\", None));\n            let layer = add_more_to_layer(layer);\n            let mut cfg = ConfigBag::of_layers(vec![layer]);\n\n            let (scheme_id, identity, _) = resolve_identity(&runtime_components, &mut cfg)\n                .await\n                .expect(\"success\");\n            sign_request(&scheme_id, &identity, &mut ctx, &runtime_components, &cfg)\n                .expect(\"success\");\n            assert_eq!(\n                // \"YTpi\" == \"a:b\" in base64\n                \"Basic YTpi\",\n                ctx.request()\n                    .expect(\"request is set\")\n                    .headers()\n                    .get(\"Authorization\")\n                    .unwrap()\n            );\n\n            // Next, test the presence of a bearer token and absence of basic auth\n            let (runtime_components, layer) =\n                config_with_identity(HTTP_BEARER_AUTH_SCHEME_ID, Token::new(\"t\", None));\n            let layer = add_more_to_layer(layer);\n            let mut cfg = ConfigBag::of_layers(vec![layer]);\n            let mut ctx = InterceptorContext::new(Input::erase(\"doesnt-matter\"));\n            ctx.enter_serialization_phase();\n            ctx.set_request(HttpRequest::empty());\n            let _ = ctx.take_input();\n            ctx.enter_before_transmit_phase();\n            let (scheme_id, identity, _) = resolve_identity(&runtime_components, &mut cfg)\n                .await\n                .expect(\"success\");\n            sign_request(&scheme_id, &identity, &mut ctx, &runtime_components, &cfg)\n                .expect(\"success\");\n            assert_eq!(\n                \"Bearer t\",\n                ctx.request()\n                    .expect(\"request is set\")\n                    .headers()\n                    .get(\"Authorization\")\n                    .unwrap()\n            );\n        }\n\n        fn config_with_identity(\n            scheme_id: AuthSchemeId,\n            identity: impl ResolveIdentity + 'static,\n        ) -> (RuntimeComponents, Layer) {\n            let runtime_components = RuntimeComponentsBuilder::for_tests()\n                .with_auth_scheme(SharedAuthScheme::new(BasicAuthScheme::new()))\n                .with_auth_scheme(SharedAuthScheme::new(BearerAuthScheme::new()))\n                .with_auth_scheme_option_resolver(Some(SharedAuthSchemeOptionResolver::new(\n                    StaticAuthSchemeOptionResolver::new(vec![\n                        HTTP_BASIC_AUTH_SCHEME_ID,\n                        HTTP_BEARER_AUTH_SCHEME_ID,\n                    ]),\n                )))\n                .with_identity_resolver(scheme_id, SharedIdentityResolver::new(identity))\n                .with_endpoint_resolver(Some(SharedEndpointResolver::new(\n                    StaticUriEndpointResolver::http_localhost(8080),\n                )))\n                .build()\n                .unwrap();\n\n            let mut layer = Layer::new(\"test\");\n            layer.store_put(Endpoint::builder().url(\"dontcare\").build());\n            layer.store_put(AuthSchemeOptionResolverParams::new(\"doesntmatter\"));\n\n            (runtime_components, layer)\n        }\n\n        // test for correct auth and endpoint orchestration\n        run_test(|mut layer| {\n            layer.store_put(AuthSchemeAndEndpointOrchestrationV2);\n            layer\n        })\n        .await;\n\n        // test for legacy auth and endpoint orchestration (no `AuthSchemeAndEndpointOrchestrationV2` in `layer`)\n        run_test(|mut layer| {\n            layer.store_put(EndpointResolverParams::from(\n                StaticUriEndpointResolverParams::new(),\n            ));\n            layer\n        })\n        .await;\n    }\n\n    #[test]\n    fn extract_endpoint_auth_scheme_config_no_config() {\n        let endpoint = Endpoint::builder()\n            .url(\"dontcare\")\n            .property(\"something-unrelated\", Document::Null)\n            .build();\n        let config =\n            extract_endpoint_auth_scheme_config(&endpoint, &AuthSchemeId::from(\"test-scheme-id\"))\n                .expect(\"success\");\n        assert!(config.as_document().is_none());\n    }\n\n    #[test]\n    fn extract_endpoint_auth_scheme_config_wrong_type() {\n        let endpoint = Endpoint::builder()\n            .url(\"dontcare\")\n            .property(\"authSchemes\", Document::String(\"bad\".into()))\n            .build();\n        extract_endpoint_auth_scheme_config(&endpoint, &AuthSchemeId::from(\"test-scheme-id\"))\n            .expect_err(\"should fail because authSchemes is the wrong type\");\n    }\n\n    #[test]\n    fn extract_endpoint_auth_scheme_config_no_matching_scheme() {\n        let endpoint = Endpoint::builder()\n            .url(\"dontcare\")\n            .property(\n                \"authSchemes\",\n                vec![\n                    Document::Object({\n                        let mut out = HashMap::new();\n                        out.insert(\"name\".to_string(), \"wrong-scheme-id\".to_string().into());\n                        out\n                    }),\n                    Document::Object({\n                        let mut out = HashMap::new();\n                        out.insert(\n                            \"name\".to_string(),\n                            \"another-wrong-scheme-id\".to_string().into(),\n                        );\n                        out\n                    }),\n                ],\n            )\n            .build();\n        extract_endpoint_auth_scheme_config(&endpoint, &AuthSchemeId::from(\"test-scheme-id\"))\n            .expect_err(\"should fail because authSchemes doesn't include the desired scheme\");\n    }\n\n    #[test]\n    fn extract_endpoint_auth_scheme_config_successfully() {\n        let endpoint = Endpoint::builder()\n            .url(\"dontcare\")\n            .property(\n                \"authSchemes\",\n                vec![\n                    Document::Object({\n                        let mut out = HashMap::new();\n                        out.insert(\"name\".to_string(), \"wrong-scheme-id\".to_string().into());\n                        out\n                    }),\n                    Document::Object({\n                        let mut out = HashMap::new();\n                        out.insert(\"name\".to_string(), \"test-scheme-id\".to_string().into());\n                        out.insert(\n                            \"magicString\".to_string(),\n                            \"magic string value\".to_string().into(),\n                        );\n                        out\n                    }),\n                ],\n            )\n            .build();\n        let config =\n            extract_endpoint_auth_scheme_config(&endpoint, &AuthSchemeId::from(\"test-scheme-id\"))\n                .expect(\"should find test-scheme-id\");\n        assert_eq!(\n            \"magic string value\",\n            config\n                .as_document()\n                .expect(\"config is set\")\n                .as_object()\n                .expect(\"it's an object\")\n                .get(\"magicString\")\n                .expect(\"magicString is set\")\n                .as_string()\n                .expect(\"gimme the string, dammit!\")\n        );\n    }\n\n    #[cfg(feature = \"http-auth\")]\n    #[tokio::test]\n    async fn use_identity_cache() {\n        use crate::client::auth::http::{ApiKeyAuthScheme, ApiKeyLocation};\n        use aws_smithy_runtime_api::client::auth::http::HTTP_API_KEY_AUTH_SCHEME_ID;\n        use aws_smithy_runtime_api::client::identity::http::Token;\n        use aws_smithy_types::body::SdkBody;\n\n        #[derive(Debug)]\n        struct Cache;\n        impl ResolveCachedIdentity for Cache {\n            fn resolve_cached_identity<'a>(\n                &'a self,\n                _resolver: SharedIdentityResolver,\n                _: &'a RuntimeComponents,\n                _config_bag: &'a ConfigBag,\n            ) -> IdentityFuture<'a> {\n                IdentityFuture::ready(Ok(Identity::new(Token::new(\"cached (pass)\", None), None)))\n            }\n        }\n\n        async fn run_test(add_more_to_layer: impl Fn(Layer) -> Layer) {\n            let mut ctx = InterceptorContext::new(Input::doesnt_matter());\n            ctx.enter_serialization_phase();\n            ctx.set_request(\n                http_1x::Request::builder()\n                    .body(SdkBody::empty())\n                    .unwrap()\n                    .try_into()\n                    .unwrap(),\n            );\n            let _ = ctx.take_input();\n            ctx.enter_before_transmit_phase();\n\n            let runtime_components = RuntimeComponentsBuilder::for_tests()\n                .with_auth_scheme(SharedAuthScheme::new(ApiKeyAuthScheme::new(\n                    \"result:\",\n                    ApiKeyLocation::Header,\n                    \"Authorization\",\n                )))\n                .with_auth_scheme_option_resolver(Some(SharedAuthSchemeOptionResolver::new(\n                    StaticAuthSchemeOptionResolver::new(vec![HTTP_API_KEY_AUTH_SCHEME_ID]),\n                )))\n                .with_identity_cache(Some(Cache))\n                .with_identity_resolver(\n                    HTTP_API_KEY_AUTH_SCHEME_ID,\n                    SharedIdentityResolver::new(Token::new(\"uncached (fail)\", None)),\n                )\n                .with_endpoint_resolver(Some(SharedEndpointResolver::new(\n                    StaticUriEndpointResolver::http_localhost(8080),\n                )))\n                .build()\n                .unwrap();\n            let mut layer = Layer::new(\"test\");\n            layer.store_put(Endpoint::builder().url(\"dontcare\").build());\n            layer.store_put(AuthSchemeOptionResolverParams::new(\"doesntmatter\"));\n            let layer = add_more_to_layer(layer);\n            let mut config_bag = ConfigBag::of_layers(vec![layer]);\n\n            let (scheme_id, identity, _) = resolve_identity(&runtime_components, &mut config_bag)\n                .await\n                .expect(\"success\");\n            sign_request(\n                &scheme_id,\n                &identity,\n                &mut ctx,\n                &runtime_components,\n                &config_bag,\n            )\n            .expect(\"success\");\n            assert_eq!(\n                \"result: cached (pass)\",\n                ctx.request()\n                    .expect(\"request is set\")\n                    .headers()\n                    .get(\"Authorization\")\n                    .unwrap()\n            );\n        }\n\n        // test for correct auth and endpoint orchestration\n        run_test(|mut layer| {\n            layer.store_put(AuthSchemeAndEndpointOrchestrationV2);\n            layer\n        })\n        .await;\n\n        // test for legacy auth and endpoint orchestration (no `AuthSchemeAndEndpointOrchestrationV2` in `layer`)\n        run_test(|mut layer| {\n            layer.store_put(EndpointResolverParams::from(\n                StaticUriEndpointResolverParams::new(),\n            ));\n            layer\n        })\n        .await;\n    }\n\n    #[test]\n    fn friendly_error_messages() {\n        let err = NoMatchingAuthSchemeError(ExploredList::default());\n        assert_eq!(\n            \"no auth options are available. This can happen if there's a problem with \\\n            the service model, or if there is a codegen bug.\",\n            err.to_string()\n        );\n\n        let mut list = ExploredList::default();\n        list.push(\n            AuthSchemeId::new(\"SigV4\"),\n            ExploreResult::NoIdentityResolver,\n        );\n        list.push(\n            AuthSchemeId::new(\"SigV4a\"),\n            ExploreResult::NoIdentityResolver,\n        );\n        let err = NoMatchingAuthSchemeError(list);\n        assert_eq!(\n            \"failed to select an auth scheme to sign the request with. \\\n            \\\"SigV4\\\" wasn't a valid option because there was no identity resolver for it. \\\n            \\\"SigV4a\\\" wasn't a valid option because there was no identity resolver for it. \\\n            Be sure to set an identity, such as credentials, auth token, or other identity \\\n            type that is required for this service. \\\n            If you intended to make an unauthenticated request, consider using `@optionalAuth` or `@auth([])` \\\n            on the operation in the service model and regenerating the client SDK. If modifying the model is not possible, \\\n            you can disable authentication at runtime as described in https://github.com/smithy-lang/smithy-rs/discussions/4197.\",\n            err.to_string()\n        );\n\n        // It should prioritize the suggestion to try an identity before saying it's a bug\n        let mut list = ExploredList::default();\n        list.push(\n            AuthSchemeId::new(\"SigV4\"),\n            ExploreResult::NoIdentityResolver,\n        );\n        list.push(\n            AuthSchemeId::new(\"SigV4a\"),\n            ExploreResult::MissingEndpointConfig,\n        );\n        let err = NoMatchingAuthSchemeError(list);\n        assert_eq!(\n            \"failed to select an auth scheme to sign the request with. \\\n            \\\"SigV4\\\" wasn't a valid option because there was no identity resolver for it. \\\n            \\\"SigV4a\\\" wasn't a valid option because there is auth config in the endpoint \\\n            config, but this scheme wasn't listed in it (see \\\n            https://github.com/smithy-lang/smithy-rs/discussions/3281 for more details). \\\n            Be sure to set an identity, such as credentials, auth token, or other identity \\\n            type that is required for this service.\",\n            err.to_string()\n        );\n\n        // Otherwise, it should suggest it's a bug\n        let mut list = ExploredList::default();\n        list.push(\n            AuthSchemeId::new(\"SigV4a\"),\n            ExploreResult::MissingEndpointConfig,\n        );\n        let err = NoMatchingAuthSchemeError(list);\n        assert_eq!(\n            \"failed to select an auth scheme to sign the request with. \\\n            \\\"SigV4a\\\" wasn't a valid option because there is auth config in the endpoint \\\n            config, but this scheme wasn't listed in it (see \\\n            https://github.com/smithy-lang/smithy-rs/discussions/3281 for more details). \\\n            This is likely a bug.\",\n            err.to_string()\n        );\n\n        // Truncation should be indicated\n        let mut list = ExploredList::default();\n        for _ in 0..=MAX_EXPLORED_LIST_LEN {\n            list.push(\n                AuthSchemeId::new(\"dontcare\"),\n                ExploreResult::MissingEndpointConfig,\n            );\n        }\n        let err = NoMatchingAuthSchemeError(list).to_string();\n        if !err.contains(\n            \"Note: there were other auth schemes that were evaluated that weren't listed here\",\n        ) {\n            panic!(\"The error should indicate that the explored list was truncated.\");\n        }\n    }\n\n    #[cfg(feature = \"http-auth\")]\n    #[tokio::test]\n    async fn test_resolve_identity() {\n        use crate::client::auth::http::{ApiKeyAuthScheme, ApiKeyLocation, BasicAuthScheme};\n        use aws_smithy_runtime_api::client::auth::http::{\n            HTTP_API_KEY_AUTH_SCHEME_ID, HTTP_BASIC_AUTH_SCHEME_ID,\n        };\n        use aws_smithy_runtime_api::client::identity::http::Token;\n        use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder;\n\n        #[derive(Debug)]\n        struct Cache;\n        impl ResolveCachedIdentity for Cache {\n            fn resolve_cached_identity<'a>(\n                &'a self,\n                identity_resolver: SharedIdentityResolver,\n                rc: &'a RuntimeComponents,\n                cfg: &'a ConfigBag,\n            ) -> IdentityFuture<'a> {\n                IdentityFuture::new(\n                    async move { identity_resolver.resolve_identity(rc, cfg).await },\n                )\n            }\n        }\n\n        let mut layer = Layer::new(\"test\");\n        layer.store_put(AuthSchemeAndEndpointOrchestrationV2);\n        layer.store_put(AuthSchemeOptionResolverParams::new(\"doesntmatter\"));\n        let mut cfg = ConfigBag::of_layers(vec![layer]);\n\n        let runtime_components_builder = RuntimeComponentsBuilder::for_tests()\n            .with_auth_scheme(SharedAuthScheme::new(BasicAuthScheme::new()))\n            .with_auth_scheme(SharedAuthScheme::new(ApiKeyAuthScheme::new(\n                \"result:\",\n                ApiKeyLocation::Header,\n                \"Authorization\",\n            )))\n            .with_auth_scheme_option_resolver(Some(SharedAuthSchemeOptionResolver::new(\n                StaticAuthSchemeOptionResolver::new(vec![\n                    HTTP_BASIC_AUTH_SCHEME_ID,\n                    HTTP_API_KEY_AUTH_SCHEME_ID,\n                ]),\n            )))\n            .with_identity_cache(Some(Cache));\n\n        struct TestCase {\n            builder_updater: Box<dyn Fn(RuntimeComponentsBuilder) -> RuntimeComponents>,\n            resolved_auth_scheme: AuthSchemeId,\n            should_error: bool,\n        }\n\n        for test_case in [\n            TestCase {\n                builder_updater: Box::new(|rcb: RuntimeComponentsBuilder| {\n                    rcb.with_identity_resolver(\n                        HTTP_BASIC_AUTH_SCHEME_ID,\n                        SharedIdentityResolver::new(Token::new(\"basic\", None)),\n                    )\n                    .with_identity_resolver(\n                        HTTP_API_KEY_AUTH_SCHEME_ID,\n                        SharedIdentityResolver::new(Token::new(\"api-key\", None)),\n                    )\n                    .build()\n                    .unwrap()\n                }),\n                resolved_auth_scheme: HTTP_BASIC_AUTH_SCHEME_ID,\n                should_error: false,\n            },\n            TestCase {\n                builder_updater: Box::new(|rcb: RuntimeComponentsBuilder| {\n                    rcb.with_identity_resolver(\n                        HTTP_BASIC_AUTH_SCHEME_ID,\n                        SharedIdentityResolver::new(Token::new(\"basic\", None)),\n                    )\n                    .build()\n                    .unwrap()\n                }),\n                resolved_auth_scheme: HTTP_BASIC_AUTH_SCHEME_ID,\n                should_error: false,\n            },\n            TestCase {\n                builder_updater: Box::new(|rcb: RuntimeComponentsBuilder| {\n                    rcb.with_identity_resolver(\n                        HTTP_API_KEY_AUTH_SCHEME_ID,\n                        SharedIdentityResolver::new(Token::new(\"api-key\", None)),\n                    )\n                    .build()\n                    .unwrap()\n                }),\n                resolved_auth_scheme: HTTP_API_KEY_AUTH_SCHEME_ID,\n                should_error: false,\n            },\n            TestCase {\n                builder_updater: Box::new(|rcb: RuntimeComponentsBuilder| rcb.build().unwrap()),\n                resolved_auth_scheme: HTTP_API_KEY_AUTH_SCHEME_ID,\n                should_error: true,\n            },\n        ]\n        .into_iter()\n        {\n            let runtime_components =\n                (test_case.builder_updater)(runtime_components_builder.clone());\n            match resolve_identity(&runtime_components, &mut cfg).await {\n                Ok(resolved) => assert_eq!(test_case.resolved_auth_scheme, resolved.0),\n                Err(e) if test_case.should_error => {\n                    assert!(e.downcast_ref::<NoMatchingAuthSchemeError>().is_some());\n                }\n                _ => {\n                    panic!(\"`resolve_identity` returned an `Err` when no error was expected in the test.\");\n                }\n            }\n        }\n    }\n\n    #[cfg(feature = \"http-auth\")]\n    #[tokio::test]\n    async fn auth_scheme_preference() {\n        use aws_smithy_runtime_api::client::auth::http::{\n            HTTP_API_KEY_AUTH_SCHEME_ID, HTTP_BASIC_AUTH_SCHEME_ID, HTTP_BEARER_AUTH_SCHEME_ID,\n        };\n\n        struct TestCase {\n            supported: Vec<AuthSchemeOption>,\n            preference: Option<AuthSchemePreference>,\n            expected_resolved_auths: Vec<AuthSchemeId>,\n        }\n\n        for test_case in [\n            TestCase {\n                supported: [HTTP_API_KEY_AUTH_SCHEME_ID, HTTP_BASIC_AUTH_SCHEME_ID]\n                    .map(AuthSchemeOption::from)\n                    .to_vec(),\n                preference: None,\n                expected_resolved_auths: vec![\n                    HTTP_API_KEY_AUTH_SCHEME_ID,\n                    HTTP_BASIC_AUTH_SCHEME_ID,\n                ],\n            },\n            TestCase {\n                supported: [HTTP_API_KEY_AUTH_SCHEME_ID, HTTP_BASIC_AUTH_SCHEME_ID]\n                    .map(AuthSchemeOption::from)\n                    .to_vec(),\n                preference: Some([].into()),\n                expected_resolved_auths: vec![\n                    HTTP_API_KEY_AUTH_SCHEME_ID,\n                    HTTP_BASIC_AUTH_SCHEME_ID,\n                ],\n            },\n            TestCase {\n                supported: [HTTP_API_KEY_AUTH_SCHEME_ID, HTTP_BASIC_AUTH_SCHEME_ID]\n                    .map(AuthSchemeOption::from)\n                    .to_vec(),\n                preference: Some([\"bogus\"].map(AuthSchemeId::from).into()),\n                expected_resolved_auths: vec![\n                    HTTP_API_KEY_AUTH_SCHEME_ID,\n                    HTTP_BASIC_AUTH_SCHEME_ID,\n                ],\n            },\n            TestCase {\n                supported: [HTTP_API_KEY_AUTH_SCHEME_ID, HTTP_BASIC_AUTH_SCHEME_ID]\n                    .map(AuthSchemeOption::from)\n                    .to_vec(),\n                preference: Some([HTTP_BASIC_AUTH_SCHEME_ID].into()),\n                expected_resolved_auths: vec![\n                    HTTP_BASIC_AUTH_SCHEME_ID,\n                    HTTP_API_KEY_AUTH_SCHEME_ID,\n                ],\n            },\n            TestCase {\n                supported: [HTTP_API_KEY_AUTH_SCHEME_ID, HTTP_BASIC_AUTH_SCHEME_ID]\n                    .map(AuthSchemeOption::from)\n                    .to_vec(),\n                preference: Some([HTTP_BASIC_AUTH_SCHEME_ID, HTTP_API_KEY_AUTH_SCHEME_ID].into()),\n                expected_resolved_auths: vec![\n                    HTTP_BASIC_AUTH_SCHEME_ID,\n                    HTTP_API_KEY_AUTH_SCHEME_ID,\n                ],\n            },\n            TestCase {\n                supported: [HTTP_API_KEY_AUTH_SCHEME_ID, HTTP_BASIC_AUTH_SCHEME_ID]\n                    .map(AuthSchemeOption::from)\n                    .to_vec(),\n                preference: Some(\n                    [\n                        HTTP_BASIC_AUTH_SCHEME_ID,\n                        HTTP_BEARER_AUTH_SCHEME_ID,\n                        HTTP_API_KEY_AUTH_SCHEME_ID,\n                    ]\n                    .into(),\n                ),\n                expected_resolved_auths: vec![\n                    HTTP_BASIC_AUTH_SCHEME_ID,\n                    HTTP_API_KEY_AUTH_SCHEME_ID,\n                ],\n            },\n        ] {\n            let actual = reprioritize_with_auth_scheme_preference(\n                test_case.supported,\n                test_case.preference.as_ref(),\n            )\n            .await;\n            let actual = actual\n                .iter()\n                .map(|opt| opt.scheme_id())\n                .cloned()\n                .collect::<Vec<_>>();\n            assert_eq!(test_case.expected_resolved_auths, actual);\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime/src/client/orchestrator/endpoints.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_smithy_runtime_api::client::endpoint::{\n    error::ResolveEndpointError, EndpointFuture, EndpointResolverParams, ResolveEndpoint,\n};\nuse aws_smithy_runtime_api::client::identity::Identity;\nuse aws_smithy_runtime_api::client::interceptors::context::InterceptorContext;\nuse aws_smithy_runtime_api::client::orchestrator::HttpRequest;\nuse aws_smithy_runtime_api::client::runtime_components::RuntimeComponents;\nuse aws_smithy_runtime_api::{box_error::BoxError, client::endpoint::EndpointPrefix};\nuse aws_smithy_types::config_bag::ConfigBag;\nuse aws_smithy_types::endpoint::Endpoint;\nuse http_1x::header::HeaderName;\nuse http_1x::uri::PathAndQuery;\nuse http_1x::{HeaderValue, Uri};\nuse std::borrow::Cow;\nuse std::fmt::Debug;\nuse std::str::FromStr;\nuse tracing::trace;\n\n/// An endpoint resolver that uses a static URI.\n#[derive(Clone, Debug)]\npub struct StaticUriEndpointResolver {\n    endpoint: String,\n}\n\nimpl StaticUriEndpointResolver {\n    /// Create a resolver that resolves to `http://localhost:{port}`.\n    pub fn http_localhost(port: u16) -> Self {\n        Self {\n            endpoint: format!(\"http://localhost:{port}\"),\n        }\n    }\n\n    /// Create a resolver that resolves to the given URI.\n    pub fn uri(endpoint: impl Into<String>) -> Self {\n        Self {\n            endpoint: endpoint.into(),\n        }\n    }\n}\n\nimpl ResolveEndpoint for StaticUriEndpointResolver {\n    fn resolve_endpoint<'a>(&'a self, _params: &'a EndpointResolverParams) -> EndpointFuture<'a> {\n        EndpointFuture::ready(Ok(Endpoint::builder()\n            .url(self.endpoint.to_string())\n            .build()))\n    }\n}\n\n/// Empty params to be used with [`StaticUriEndpointResolver`].\n#[derive(Debug, Default)]\npub struct StaticUriEndpointResolverParams;\n\nimpl StaticUriEndpointResolverParams {\n    /// Creates a new `StaticUriEndpointResolverParams`.\n    pub fn new() -> Self {\n        Self\n    }\n}\n\nimpl From<StaticUriEndpointResolverParams> for EndpointResolverParams {\n    fn from(params: StaticUriEndpointResolverParams) -> Self {\n        EndpointResolverParams::new(params)\n    }\n}\n\npub(super) async fn orchestrate_endpoint(\n    identity: Identity,\n    ctx: &mut InterceptorContext,\n    runtime_components: &RuntimeComponents,\n    cfg: &mut ConfigBag,\n) -> Result<(), BoxError> {\n    trace!(\"orchestrating endpoint resolution\");\n\n    let params = cfg\n        .get_mut_from_interceptor_state::<EndpointResolverParams>()\n        .expect(\"endpoint resolver params must be set in the interceptor state\");\n    params.set_property(identity);\n\n    let endpoint_resolver = runtime_components.endpoint_resolver();\n\n    endpoint_resolver.finalize_params(params)?;\n\n    tracing::debug!(endpoint_params = ?params, \"resolving endpoint\");\n    let endpoint = endpoint_resolver.resolve_endpoint(params).await?;\n\n    apply_endpoint(&endpoint, ctx, cfg)?;\n\n    // Make the endpoint config available to interceptors\n    cfg.interceptor_state().store_put(endpoint);\n    Ok(())\n}\n\npub(super) fn apply_endpoint(\n    endpoint: &Endpoint,\n    ctx: &mut InterceptorContext,\n    cfg: &ConfigBag,\n) -> Result<(), BoxError> {\n    let endpoint_prefix = cfg.load::<EndpointPrefix>();\n    tracing::debug!(endpoint_prefix = ?endpoint_prefix, \"will apply endpoint {:?}\", endpoint);\n    let request = ctx.request_mut().expect(\"set during serialization\");\n\n    apply_endpoint_to_request(request, endpoint, endpoint_prefix)\n}\n\nfn apply_endpoint_to_request(\n    request: &mut HttpRequest,\n    endpoint: &Endpoint,\n    endpoint_prefix: Option<&EndpointPrefix>,\n) -> Result<(), BoxError> {\n    let endpoint_url = match endpoint_prefix {\n        None => Cow::Borrowed(endpoint.url()),\n        Some(prefix) => {\n            let parsed = endpoint.url().parse::<Uri>()?;\n            let scheme = parsed.scheme_str().unwrap_or_default();\n            let prefix = prefix.as_str();\n            let authority = parsed\n                .authority()\n                .map(|auth| auth.as_str())\n                .unwrap_or_default();\n            let path_and_query = parsed\n                .path_and_query()\n                .map(PathAndQuery::as_str)\n                .unwrap_or_default();\n            Cow::Owned(format!(\"{scheme}://{prefix}{authority}{path_and_query}\"))\n        }\n    };\n\n    request\n        .uri_mut()\n        .set_endpoint(&endpoint_url)\n        .map_err(|err| {\n            ResolveEndpointError::message(format!(\n                \"failed to apply endpoint `{endpoint_url}` to request `{request:?}`\",\n            ))\n            .with_source(Some(err.into()))\n        })?;\n\n    for (header_name, header_values) in endpoint.headers() {\n        request.headers_mut().remove(header_name);\n        for value in header_values {\n            request.headers_mut().append(\n                HeaderName::from_str(header_name).map_err(|err| {\n                    ResolveEndpointError::message(\"invalid header name\")\n                        .with_source(Some(err.into()))\n                })?,\n                HeaderValue::from_str(value).map_err(|err| {\n                    ResolveEndpointError::message(\"invalid header value\")\n                        .with_source(Some(err.into()))\n                })?,\n            );\n        }\n    }\n    Ok(())\n}\n\n#[cfg(test)]\nmod test {\n    use aws_smithy_runtime_api::client::endpoint::EndpointPrefix;\n    use aws_smithy_runtime_api::client::orchestrator::HttpRequest;\n    use aws_smithy_types::endpoint::Endpoint;\n\n    #[test]\n    fn test_apply_endpoint() {\n        let mut req = HttpRequest::empty();\n        req.set_uri(\"/foo?bar=1\").unwrap();\n        let endpoint = Endpoint::builder().url(\"https://s3.amazon.com\").build();\n        let prefix = EndpointPrefix::new(\"prefix.subdomain.\").unwrap();\n        super::apply_endpoint_to_request(&mut req, &endpoint, Some(&prefix))\n            .expect(\"should succeed\");\n        assert_eq!(\n            req.uri(),\n            \"https://prefix.subdomain.s3.amazon.com/foo?bar=1\"\n        );\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime/src/client/orchestrator/http.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_smithy_runtime_api::client::orchestrator::{HttpResponse, SensitiveOutput};\nuse aws_smithy_types::body::SdkBody;\nuse aws_smithy_types::config_bag::ConfigBag;\nuse bytes::Bytes;\nuse pin_utils::pin_mut;\nuse tracing::trace;\n\nconst LOG_SENSITIVE_BODIES: &str = \"LOG_SENSITIVE_BODIES\";\n\nasync fn body_to_bytes(body: SdkBody) -> Result<Bytes, <SdkBody as http_body_1x::Body>::Error> {\n    use http_body_util::BodyExt;\n    pin_mut!(body);\n    let collected = body.collect().await?;\n\n    Ok(collected.to_bytes())\n}\n\npub(crate) async fn read_body(\n    response: &mut HttpResponse,\n) -> Result<(), <SdkBody as http_body_1x::Body>::Error> {\n    let mut body = SdkBody::taken();\n    std::mem::swap(&mut body, response.body_mut());\n\n    let bytes = body_to_bytes(body).await?;\n    let mut body = SdkBody::from(bytes);\n    std::mem::swap(&mut body, response.body_mut());\n\n    Ok(())\n}\n\npub(crate) fn log_response_body(response: &HttpResponse, cfg: &ConfigBag) {\n    if cfg.load::<SensitiveOutput>().is_none()\n        || std::env::var(LOG_SENSITIVE_BODIES)\n            .map(|v| v.eq_ignore_ascii_case(\"true\"))\n            .unwrap_or_default()\n    {\n        trace!(response = ?response, \"read HTTP response body\");\n    } else {\n        trace!(\n            response = \"** REDACTED **. To print, set LOG_SENSITIVE_BODIES=true\",\n            \"read HTTP response body\"\n        )\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime/src/client/orchestrator/operation.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::client::auth::no_auth::{NoAuthScheme, NO_AUTH_SCHEME_ID};\nuse crate::client::defaults::{default_plugins, DefaultPluginParams};\nuse crate::client::http::connection_poisoning::ConnectionPoisoningInterceptor;\nuse crate::client::identity::no_auth::NoAuthIdentityResolver;\nuse crate::client::identity::IdentityCache;\nuse crate::client::orchestrator::endpoints::StaticUriEndpointResolver;\nuse crate::client::retries::strategy::{NeverRetryStrategy, StandardRetryStrategy};\nuse aws_smithy_async::rt::sleep::AsyncSleep;\nuse aws_smithy_async::time::TimeSource;\nuse aws_smithy_runtime_api::client::auth::static_resolver::StaticAuthSchemeOptionResolver;\nuse aws_smithy_runtime_api::client::auth::{\n    AuthSchemeOptionResolverParams, SharedAuthScheme, SharedAuthSchemeOptionResolver,\n};\nuse aws_smithy_runtime_api::client::endpoint::{EndpointResolverParams, SharedEndpointResolver};\nuse aws_smithy_runtime_api::client::http::HttpClient;\nuse aws_smithy_runtime_api::client::identity::SharedIdentityResolver;\nuse aws_smithy_runtime_api::client::interceptors::context::{Error, Input, Output};\nuse aws_smithy_runtime_api::client::interceptors::Intercept;\nuse aws_smithy_runtime_api::client::orchestrator::{HttpRequest, OrchestratorError};\nuse aws_smithy_runtime_api::client::orchestrator::{HttpResponse, Metadata};\nuse aws_smithy_runtime_api::client::result::SdkError;\nuse aws_smithy_runtime_api::client::retries::classifiers::ClassifyRetry;\nuse aws_smithy_runtime_api::client::retries::SharedRetryStrategy;\nuse aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder;\nuse aws_smithy_runtime_api::client::runtime_plugin::{\n    RuntimePlugin, RuntimePlugins, SharedRuntimePlugin, StaticRuntimePlugin,\n};\nuse aws_smithy_runtime_api::client::ser_de::{\n    DeserializeResponse, SerializeRequest, SharedRequestSerializer, SharedResponseDeserializer,\n};\nuse aws_smithy_runtime_api::shared::IntoShared;\nuse aws_smithy_runtime_api::{\n    box_error::BoxError, client::stalled_stream_protection::StalledStreamProtectionConfig,\n};\nuse aws_smithy_types::config_bag::{ConfigBag, Layer};\nuse aws_smithy_types::retry::RetryConfig;\nuse aws_smithy_types::timeout::TimeoutConfig;\nuse std::borrow::Cow;\nuse std::fmt;\nuse std::marker::PhantomData;\nuse tracing::{debug_span, Instrument};\n\nstruct FnSerializer<F, I> {\n    f: F,\n    _phantom: PhantomData<I>,\n}\nimpl<F, I> FnSerializer<F, I> {\n    fn new(f: F) -> Self {\n        Self {\n            f,\n            _phantom: Default::default(),\n        }\n    }\n}\nimpl<F, I> SerializeRequest for FnSerializer<F, I>\nwhere\n    F: Fn(I) -> Result<HttpRequest, BoxError> + Send + Sync,\n    I: fmt::Debug + Send + Sync + 'static,\n{\n    fn serialize_input(&self, input: Input, _cfg: &mut ConfigBag) -> Result<HttpRequest, BoxError> {\n        let input: I = input.downcast().expect(\"correct type\");\n        (self.f)(input)\n    }\n}\nimpl<F, I> fmt::Debug for FnSerializer<F, I> {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        write!(f, \"FnSerializer\")\n    }\n}\n\nstruct FnDeserializer<F, O, E> {\n    f: F,\n    _phantom: PhantomData<(O, E)>,\n}\nimpl<F, O, E> FnDeserializer<F, O, E> {\n    fn new(deserializer: F) -> Self {\n        Self {\n            f: deserializer,\n            _phantom: Default::default(),\n        }\n    }\n}\nimpl<F, O, E> DeserializeResponse for FnDeserializer<F, O, E>\nwhere\n    F: Fn(&HttpResponse) -> Result<O, OrchestratorError<E>> + Send + Sync,\n    O: fmt::Debug + Send + Sync + 'static,\n    E: std::error::Error + fmt::Debug + Send + Sync + 'static,\n{\n    fn deserialize_nonstreaming(\n        &self,\n        response: &HttpResponse,\n    ) -> Result<Output, OrchestratorError<Error>> {\n        (self.f)(response)\n            .map(|output| Output::erase(output))\n            .map_err(|err| err.map_operation_error(Error::erase))\n    }\n}\nimpl<F, O, E> fmt::Debug for FnDeserializer<F, O, E> {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        write!(f, \"FnDeserializer\")\n    }\n}\n\n/// Orchestrates execution of a HTTP request without any modeled input or output.\n#[derive(Debug)]\npub struct Operation<I, O, E> {\n    service_name: Cow<'static, str>,\n    operation_name: Cow<'static, str>,\n    runtime_plugins: RuntimePlugins,\n    _phantom: PhantomData<(I, O, E)>,\n}\n\n// Manual Clone implementation needed to get rid of Clone bounds on I, O, and E\nimpl<I, O, E> Clone for Operation<I, O, E> {\n    fn clone(&self) -> Self {\n        Self {\n            service_name: self.service_name.clone(),\n            operation_name: self.operation_name.clone(),\n            runtime_plugins: self.runtime_plugins.clone(),\n            _phantom: self._phantom,\n        }\n    }\n}\n\nimpl Operation<(), (), ()> {\n    /// Returns a new `OperationBuilder` for the `Operation`.\n    pub fn builder() -> OperationBuilder {\n        OperationBuilder::new()\n    }\n}\n\nimpl<I, O, E> Operation<I, O, E>\nwhere\n    I: fmt::Debug + Send + Sync + 'static,\n    O: fmt::Debug + Send + Sync + 'static,\n    E: std::error::Error + fmt::Debug + Send + Sync + 'static,\n{\n    /// Invokes this `Operation` with the given `input` and returns either an output for success\n    /// or an [`SdkError`] for failure\n    pub async fn invoke(&self, input: I) -> Result<O, SdkError<E, HttpResponse>> {\n        let input = Input::erase(input);\n\n        let output = super::invoke(\n            &self.service_name,\n            &self.operation_name,\n            input,\n            &self.runtime_plugins,\n        )\n        .instrument(debug_span!(\n            \"invoke\",\n            \"rpc.service\" = &self.service_name.as_ref(),\n            \"rpc.method\" = &self.operation_name.as_ref()\n        ))\n        .await\n        .map_err(|err| err.map_service_error(|e| e.downcast().expect(\"correct type\")))?;\n\n        Ok(output.downcast().expect(\"correct type\"))\n    }\n}\n\n/// Builder for [`Operation`].\n#[derive(Debug)]\npub struct OperationBuilder<I = (), O = (), E = ()> {\n    service_name: Option<Cow<'static, str>>,\n    operation_name: Option<Cow<'static, str>>,\n    config: Layer,\n    runtime_components: RuntimeComponentsBuilder,\n    runtime_plugins: Vec<SharedRuntimePlugin>,\n    _phantom: PhantomData<(I, O, E)>,\n}\n\nimpl Default for OperationBuilder<(), (), ()> {\n    fn default() -> Self {\n        Self::new()\n    }\n}\n\nimpl OperationBuilder<(), (), ()> {\n    /// Creates a new [`OperationBuilder`].\n    pub fn new() -> Self {\n        Self {\n            service_name: None,\n            operation_name: None,\n            config: Layer::new(\"operation\"),\n            runtime_components: RuntimeComponentsBuilder::new(\"operation\"),\n            runtime_plugins: Vec::new(),\n            _phantom: Default::default(),\n        }\n    }\n}\n\nimpl<I, O, E> OperationBuilder<I, O, E> {\n    /// Configures the service name for the builder.\n    pub fn service_name(mut self, service_name: impl Into<Cow<'static, str>>) -> Self {\n        self.service_name = Some(service_name.into());\n        self\n    }\n\n    /// Configures the operation name for the builder.\n    pub fn operation_name(mut self, operation_name: impl Into<Cow<'static, str>>) -> Self {\n        self.operation_name = Some(operation_name.into());\n        self\n    }\n\n    /// Configures the http client for the builder.\n    pub fn http_client(mut self, connector: impl HttpClient + 'static) -> Self {\n        self.runtime_components.set_http_client(Some(connector));\n        self\n    }\n\n    /// Configures the endpoint URL for the builder.\n    pub fn endpoint_url(mut self, url: &str) -> Self {\n        self.config.store_put(EndpointResolverParams::new(()));\n        self.runtime_components\n            .set_endpoint_resolver(Some(SharedEndpointResolver::new(\n                StaticUriEndpointResolver::uri(url),\n            )));\n        self\n    }\n\n    /// Configures the retry classifier for the builder.\n    pub fn retry_classifier(mut self, retry_classifier: impl ClassifyRetry + 'static) -> Self {\n        self.runtime_components\n            .push_retry_classifier(retry_classifier);\n        self\n    }\n\n    /// Disables the retry for the operation.\n    pub fn no_retry(mut self) -> Self {\n        self.runtime_components\n            .set_retry_strategy(Some(SharedRetryStrategy::new(NeverRetryStrategy::new())));\n        self\n    }\n\n    /// Configures the standard retry for the builder.\n    pub fn standard_retry(mut self, retry_config: &RetryConfig) -> Self {\n        self.config.store_put(retry_config.clone());\n        self.runtime_components\n            .set_retry_strategy(Some(SharedRetryStrategy::new(StandardRetryStrategy::new())));\n        self\n    }\n\n    /// Configures the timeout configuration for the builder.\n    pub fn timeout_config(mut self, timeout_config: TimeoutConfig) -> Self {\n        self.config.store_put(timeout_config);\n        self\n    }\n\n    /// Disables auth for the operation.\n    pub fn no_auth(mut self) -> Self {\n        self.config\n            .store_put(AuthSchemeOptionResolverParams::new(()));\n        self.runtime_components\n            .set_auth_scheme_option_resolver(Some(SharedAuthSchemeOptionResolver::new(\n                StaticAuthSchemeOptionResolver::new(vec![NO_AUTH_SCHEME_ID]),\n            )));\n        self.runtime_components\n            .push_auth_scheme(SharedAuthScheme::new(NoAuthScheme::default()));\n        self.runtime_components\n            .set_identity_cache(Some(IdentityCache::no_cache()));\n        self.runtime_components.set_identity_resolver(\n            NO_AUTH_SCHEME_ID,\n            SharedIdentityResolver::new(NoAuthIdentityResolver::new()),\n        );\n        self\n    }\n\n    /// Configures the sleep for the builder.\n    pub fn sleep_impl(mut self, async_sleep: impl AsyncSleep + 'static) -> Self {\n        self.runtime_components\n            .set_sleep_impl(Some(async_sleep.into_shared()));\n        self\n    }\n\n    /// Configures the time source for the builder.\n    pub fn time_source(mut self, time_source: impl TimeSource + 'static) -> Self {\n        self.runtime_components\n            .set_time_source(Some(time_source.into_shared()));\n        self\n    }\n\n    /// Configures the interceptor for the builder.\n    pub fn interceptor(mut self, interceptor: impl Intercept + 'static) -> Self {\n        self.runtime_components.push_interceptor(interceptor);\n        self\n    }\n\n    /// Registers the [`ConnectionPoisoningInterceptor`].\n    pub fn with_connection_poisoning(self) -> Self {\n        self.interceptor(ConnectionPoisoningInterceptor::new())\n    }\n\n    /// Configures the runtime plugin for the builder.\n    pub fn runtime_plugin(mut self, runtime_plugin: impl RuntimePlugin + 'static) -> Self {\n        self.runtime_plugins.push(runtime_plugin.into_shared());\n        self\n    }\n\n    /// Configures stalled stream protection with the given config.\n    pub fn stalled_stream_protection(\n        mut self,\n        stalled_stream_protection: StalledStreamProtectionConfig,\n    ) -> Self {\n        self.config.store_put(stalled_stream_protection);\n        self\n    }\n\n    /// Configures the serializer for the builder.\n    pub fn serializer<I2>(\n        mut self,\n        serializer: impl Fn(I2) -> Result<HttpRequest, BoxError> + Send + Sync + 'static,\n    ) -> OperationBuilder<I2, O, E>\n    where\n        I2: fmt::Debug + Send + Sync + 'static,\n    {\n        self.config\n            .store_put(SharedRequestSerializer::new(FnSerializer::new(serializer)));\n        OperationBuilder {\n            service_name: self.service_name,\n            operation_name: self.operation_name,\n            config: self.config,\n            runtime_components: self.runtime_components,\n            runtime_plugins: self.runtime_plugins,\n            _phantom: Default::default(),\n        }\n    }\n\n    /// Configures the deserializer for the builder.\n    pub fn deserializer<O2, E2>(\n        mut self,\n        deserializer: impl Fn(&HttpResponse) -> Result<O2, OrchestratorError<E2>>\n            + Send\n            + Sync\n            + 'static,\n    ) -> OperationBuilder<I, O2, E2>\n    where\n        O2: fmt::Debug + Send + Sync + 'static,\n        E2: std::error::Error + fmt::Debug + Send + Sync + 'static,\n    {\n        self.config\n            .store_put(SharedResponseDeserializer::new(FnDeserializer::new(\n                deserializer,\n            )));\n        OperationBuilder {\n            service_name: self.service_name,\n            operation_name: self.operation_name,\n            config: self.config,\n            runtime_components: self.runtime_components,\n            runtime_plugins: self.runtime_plugins,\n            _phantom: Default::default(),\n        }\n    }\n\n    /// Configures the a deserializer implementation for the builder.\n    #[allow(clippy::implied_bounds_in_impls)] // for `Send` and `Sync`\n    pub fn deserializer_impl<O2, E2>(\n        mut self,\n        deserializer: impl DeserializeResponse + Send + Sync + 'static,\n    ) -> OperationBuilder<I, O2, E2>\n    where\n        O2: fmt::Debug + Send + Sync + 'static,\n        E2: std::error::Error + fmt::Debug + Send + Sync + 'static,\n    {\n        let deserializer: SharedResponseDeserializer = deserializer.into_shared();\n        self.config.store_put(deserializer);\n\n        OperationBuilder {\n            service_name: self.service_name,\n            operation_name: self.operation_name,\n            config: self.config,\n            runtime_components: self.runtime_components,\n            runtime_plugins: self.runtime_plugins,\n            _phantom: Default::default(),\n        }\n    }\n\n    /// Creates an `Operation` from the builder.\n    pub fn build(self) -> Operation<I, O, E> {\n        let service_name = self.service_name.expect(\"service_name required\");\n        let operation_name = self.operation_name.expect(\"operation_name required\");\n        let mut config = self.config;\n        config.store_put(Metadata::new(operation_name.clone(), service_name.clone()));\n        let mut runtime_plugins = RuntimePlugins::new()\n            .with_client_plugins(default_plugins(\n                DefaultPluginParams::new().with_retry_partition_name(service_name.clone()),\n            ))\n            .with_client_plugin(\n                StaticRuntimePlugin::new()\n                    .with_config(config.freeze())\n                    .with_runtime_components(self.runtime_components),\n            );\n        for runtime_plugin in self.runtime_plugins {\n            runtime_plugins = runtime_plugins.with_client_plugin(runtime_plugin);\n        }\n\n        #[cfg(debug_assertions)]\n        {\n            let mut config = ConfigBag::base();\n            let components = runtime_plugins\n                .apply_client_configuration(&mut config)\n                .expect(\"the runtime plugins should succeed\");\n\n            assert!(\n                components.http_client().is_some(),\n                \"a http_client is required. Enable the `default-https-client` crate feature or configure an HTTP client to fix this.\"\n            );\n            assert!(\n                components.endpoint_resolver().is_some(),\n                \"a endpoint_resolver is required\"\n            );\n            assert!(\n                components.retry_strategy().is_some(),\n                \"a retry_strategy is required\"\n            );\n            assert!(\n                config.load::<SharedRequestSerializer>().is_some(),\n                \"a serializer is required\"\n            );\n            assert!(\n                config.load::<SharedResponseDeserializer>().is_some(),\n                \"a deserializer is required\"\n            );\n            assert!(\n                config.load::<EndpointResolverParams>().is_some(),\n                \"endpoint resolver params are required\"\n            );\n            assert!(\n                config.load::<TimeoutConfig>().is_some(),\n                \"timeout config is required\"\n            );\n        }\n\n        Operation {\n            service_name,\n            operation_name,\n            runtime_plugins,\n            _phantom: Default::default(),\n        }\n    }\n}\n\n#[cfg(all(test, any(feature = \"test-util\", feature = \"legacy-test-util\")))]\nmod tests {\n    use super::*;\n    use crate::client::retries::classifiers::HttpStatusCodeClassifier;\n    use aws_smithy_async::rt::sleep::{SharedAsyncSleep, TokioSleep};\n    use aws_smithy_http_client::test_util::{capture_request, ReplayEvent, StaticReplayClient};\n    use aws_smithy_runtime_api::client::result::ConnectorError;\n    use aws_smithy_types::body::SdkBody;\n    use std::convert::Infallible;\n\n    #[tokio::test]\n    async fn operation() {\n        let (connector, request_rx) = capture_request(Some(\n            http_1x::Response::builder()\n                .status(418)\n                .body(SdkBody::from(&b\"I'm a teapot!\"[..]))\n                .unwrap(),\n        ));\n        let operation = Operation::builder()\n            .service_name(\"test\")\n            .operation_name(\"test\")\n            .http_client(connector)\n            .endpoint_url(\"http://localhost:1234\")\n            .no_auth()\n            .no_retry()\n            .timeout_config(TimeoutConfig::disabled())\n            .serializer(|input: String| Ok(HttpRequest::new(SdkBody::from(input.as_bytes()))))\n            .deserializer::<_, Infallible>(|response| {\n                assert_eq!(418, u16::from(response.status()));\n                Ok(std::str::from_utf8(response.body().bytes().unwrap())\n                    .unwrap()\n                    .to_string())\n            })\n            .build();\n\n        let output = operation\n            .invoke(\"what are you?\".to_string())\n            .await\n            .expect(\"success\");\n        assert_eq!(\"I'm a teapot!\", output);\n\n        let request = request_rx.expect_request();\n        assert_eq!(\"http://localhost:1234/\", request.uri());\n        assert_eq!(b\"what are you?\", request.body().bytes().unwrap());\n    }\n\n    #[tokio::test]\n    async fn operation_retries() {\n        let connector = StaticReplayClient::new(vec![\n            ReplayEvent::new(\n                http_1x::Request::builder()\n                    .uri(\"http://localhost:1234/\")\n                    .body(SdkBody::from(&b\"what are you?\"[..]))\n                    .unwrap(),\n                http_1x::Response::builder()\n                    .status(503)\n                    .body(SdkBody::from(&b\"\"[..]))\n                    .unwrap(),\n            ),\n            ReplayEvent::new(\n                http_1x::Request::builder()\n                    .uri(\"http://localhost:1234/\")\n                    .body(SdkBody::from(&b\"what are you?\"[..]))\n                    .unwrap(),\n                http_1x::Response::builder()\n                    .status(418)\n                    .body(SdkBody::from(&b\"I'm a teapot!\"[..]))\n                    .unwrap(),\n            ),\n        ]);\n        let operation = Operation::builder()\n            .service_name(\"test\")\n            .operation_name(\"test\")\n            .http_client(connector.clone())\n            .endpoint_url(\"http://localhost:1234\")\n            .no_auth()\n            .standard_retry(&RetryConfig::standard())\n            .retry_classifier(HttpStatusCodeClassifier::default())\n            .timeout_config(TimeoutConfig::disabled())\n            .sleep_impl(SharedAsyncSleep::new(TokioSleep::new()))\n            .serializer(|input: String| Ok(HttpRequest::new(SdkBody::from(input.as_bytes()))))\n            .deserializer::<_, Infallible>(|response| {\n                if u16::from(response.status()) == 503 {\n                    Err(OrchestratorError::connector(ConnectorError::io(\n                        \"test\".into(),\n                    )))\n                } else {\n                    assert_eq!(418, u16::from(response.status()));\n                    Ok(std::str::from_utf8(response.body().bytes().unwrap())\n                        .unwrap()\n                        .to_string())\n                }\n            })\n            .build();\n\n        let output = operation\n            .invoke(\"what are you?\".to_string())\n            .await\n            .expect(\"success\");\n        assert_eq!(\"I'm a teapot!\", output);\n\n        connector.assert_requests_match(&[]);\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime/src/client/orchestrator.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::client::interceptors::Interceptors;\nuse crate::client::orchestrator::http::{log_response_body, read_body};\nuse crate::client::timeout::{MaybeTimeout, MaybeTimeoutConfig, TimeoutKind};\nuse crate::client::{\n    http::body::minimum_throughput::MaybeUploadThroughputCheckFuture,\n    orchestrator::endpoints::orchestrate_endpoint,\n};\nuse auth::{resolve_identity, sign_request};\nuse aws_smithy_async::rt::sleep::AsyncSleep;\nuse aws_smithy_runtime_api::box_error::BoxError;\nuse aws_smithy_runtime_api::client::http::{HttpClient, HttpConnector, HttpConnectorSettings};\nuse aws_smithy_runtime_api::client::interceptors::context::{\n    Error, Input, InterceptorContext, Output, RewindResult,\n};\nuse aws_smithy_runtime_api::client::orchestrator::{\n    HttpResponse, LoadedRequestBody, OrchestratorError,\n};\nuse aws_smithy_runtime_api::client::result::SdkError;\nuse aws_smithy_runtime_api::client::retries::{RequestAttempts, RetryStrategy, ShouldAttempt};\nuse aws_smithy_runtime_api::client::runtime_components::RuntimeComponents;\nuse aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugins;\nuse aws_smithy_runtime_api::client::ser_de::{\n    DeserializeResponse, SerializeRequest, SharedRequestSerializer, SharedResponseDeserializer,\n};\nuse aws_smithy_types::body::SdkBody;\nuse aws_smithy_types::byte_stream::ByteStream;\nuse aws_smithy_types::config_bag::ConfigBag;\nuse aws_smithy_types::timeout::{MergeTimeoutConfig, TimeoutConfig};\nuse endpoints::apply_endpoint;\nuse std::mem;\nuse tracing::{debug, debug_span, instrument, trace, Instrument};\n\nmod auth;\npub use auth::AuthSchemeAndEndpointOrchestrationV2;\n\n/// Defines types that implement a trait for endpoint resolution\npub mod endpoints;\n\n/// Defines types that work with HTTP types\nmod http;\n\n/// Utility for making one-off unmodeled requests with the orchestrator.\npub mod operation;\n\nmacro_rules! halt {\n    ([$ctx:ident] => $err:expr) => {{\n        debug!(\"encountered orchestrator error; halting\");\n        $ctx.fail($err.into());\n        return;\n    }};\n}\n\nmacro_rules! halt_on_err {\n    ([$ctx:ident] => $expr:expr) => {\n        match $expr {\n            Ok(ok) => ok,\n            Err(err) => halt!([$ctx] => err),\n        }\n    };\n}\n\nmacro_rules! continue_on_err {\n    ([$ctx:ident] => $expr:expr) => {\n        if let Err(err) = $expr {\n            debug!(err = ?err, \"encountered orchestrator error; continuing\");\n            $ctx.fail(err.into());\n        }\n    };\n}\n\nmacro_rules! run_interceptors {\n    (continue_on_err: { $($interceptor:ident($ctx:ident, $rc:ident, $cfg:ident);)+ }) => {\n        $(run_interceptors!(continue_on_err: $interceptor($ctx, $rc, $cfg));)+\n    };\n    (continue_on_err: $interceptor:ident($ctx:ident, $rc:ident, $cfg:ident)) => {\n        continue_on_err!([$ctx] => run_interceptors!(__private $interceptor($ctx, $rc, $cfg)))\n    };\n    (halt_on_err: { $($interceptor:ident($ctx:ident, $rc:ident, $cfg:ident);)+ }) => {\n        $(run_interceptors!(halt_on_err: $interceptor($ctx, $rc, $cfg));)+\n    };\n    (halt_on_err: $interceptor:ident($ctx:ident, $rc:ident, $cfg:ident)) => {\n        halt_on_err!([$ctx] => run_interceptors!(__private $interceptor($ctx, $rc, $cfg)))\n    };\n    (__private $interceptor:ident($ctx:ident, $rc:ident, $cfg:ident)) => {\n        Interceptors::new($rc.interceptors()).$interceptor($ctx, $rc, $cfg)\n    };\n}\n\n/// Orchestrates the execution of a request and handling of a response.\n///\n/// The given `runtime_plugins` will be used to generate a `ConfigBag` for this request,\n/// and then the given `input` will be serialized and transmitted. When a response is\n/// received, it will be deserialized and returned.\n///\n/// This orchestration handles retries, endpoint resolution, identity resolution, and signing.\n/// Each of these are configurable via the config and runtime components given by the runtime\n/// plugins.\npub async fn invoke(\n    service_name: &str,\n    operation_name: &str,\n    input: Input,\n    runtime_plugins: &RuntimePlugins,\n) -> Result<Output, SdkError<Error, HttpResponse>> {\n    invoke_with_stop_point(\n        service_name,\n        operation_name,\n        input,\n        runtime_plugins,\n        StopPoint::None,\n    )\n    .await?\n    .finalize()\n}\n\n/// Allows for returning early at different points during orchestration.\n#[non_exhaustive]\n#[derive(Debug, Clone, Copy, PartialEq, Eq)]\npub enum StopPoint {\n    /// Don't stop orchestration early\n    None,\n\n    /// Stop the orchestrator before transmitting the request\n    BeforeTransmit,\n}\n\n/// Same as [`invoke`], but allows for returning early at different points during orchestration.\n///\n/// Orchestration will cease at the point specified by `stop_point`. This is useful for orchestrations\n/// that don't need to actually transmit requests, such as for generating presigned requests.\n///\n/// See the docs on [`invoke`] for more details.\npub async fn invoke_with_stop_point(\n    // NOTE: service_name and operation_name were at one point used for instrumentation that is now\n    // handled as part of codegen. Manually constructed operations (e.g. via Operation::builder())\n    // are handled as part of Operation::invoke\n    _service_name: &str,\n    _operation_name: &str,\n    input: Input,\n    runtime_plugins: &RuntimePlugins,\n    stop_point: StopPoint,\n) -> Result<InterceptorContext, SdkError<Error, HttpResponse>> {\n    async move {\n        let mut cfg = ConfigBag::base();\n        let cfg = &mut cfg;\n\n        let mut ctx = InterceptorContext::new(input);\n\n        let runtime_components = apply_configuration(&mut ctx, cfg, runtime_plugins)\n            .map_err(SdkError::construction_failure)?;\n        trace!(runtime_components = ?runtime_components);\n\n        let operation_timeout_config =\n            MaybeTimeoutConfig::new(&runtime_components, cfg, TimeoutKind::Operation);\n        trace!(operation_timeout_config = ?operation_timeout_config);\n        async {\n            // If running the pre-execution interceptors failed, then we skip running the op and run the\n            // final interceptors instead.\n            if !ctx.is_failed() {\n                try_op(&mut ctx, cfg, &runtime_components, stop_point).await;\n            }\n            finally_op(&mut ctx, cfg, &runtime_components).await;\n            if ctx.is_failed() {\n                Err(ctx.finalize().expect_err(\"it is failed\"))\n            } else {\n                Ok(ctx)\n            }\n        }\n        .maybe_timeout(operation_timeout_config)\n        .await\n    }\n    .await\n}\n\n/// Apply configuration is responsible for apply runtime plugins to the config bag, as well as running\n/// `read_before_execution` interceptors. If a failure occurs due to config construction, `invoke`\n/// will raise it to the user. If an interceptor fails, then `invoke`\n#[instrument(skip_all, level = \"debug\")]\nfn apply_configuration(\n    ctx: &mut InterceptorContext,\n    cfg: &mut ConfigBag,\n    runtime_plugins: &RuntimePlugins,\n) -> Result<RuntimeComponents, BoxError> {\n    let client_rc_builder = runtime_plugins.apply_client_configuration(cfg)?;\n    continue_on_err!([ctx] => Interceptors::new(client_rc_builder.interceptors()).read_before_execution(false, ctx, cfg));\n\n    let operation_rc_builder = runtime_plugins.apply_operation_configuration(cfg)?;\n    continue_on_err!([ctx] => Interceptors::new(operation_rc_builder.interceptors()).read_before_execution(true, ctx, cfg));\n\n    // The order below is important. Client interceptors must run before operation interceptors.\n    let components = client_rc_builder\n        .merge_from(&operation_rc_builder)\n        .build()?;\n\n    // In an ideal world, we'd simply update `cfg.load` to behave this way. Unfortunately, we can't\n    // do that without a breaking change. By overwriting the value in the config bag with a merged\n    // version, we can achieve a very similar behavior. `MergeTimeoutConfig`\n    let resolved_timeout_config = cfg.load::<MergeTimeoutConfig>();\n    debug!(\n        \"timeout settings for this operation: {:?}\",\n        resolved_timeout_config\n    );\n    cfg.interceptor_state().store_put(resolved_timeout_config);\n\n    components.validate_final_config(cfg)?;\n    Ok(components)\n}\n\n#[instrument(skip_all, level = \"debug\")]\nasync fn try_op(\n    ctx: &mut InterceptorContext,\n    cfg: &mut ConfigBag,\n    runtime_components: &RuntimeComponents,\n    stop_point: StopPoint,\n) {\n    // Before serialization\n    run_interceptors!(halt_on_err: {\n        modify_before_serialization(ctx, runtime_components, cfg);\n        read_before_serialization(ctx, runtime_components, cfg);\n    });\n\n    // Serialization\n    ctx.enter_serialization_phase();\n    {\n        let _span = debug_span!(\"serialization\").entered();\n        let request_serializer = cfg\n            .load::<SharedRequestSerializer>()\n            .expect(\"request serializer must be in the config bag\")\n            .clone();\n        let input = ctx.take_input().expect(\"input set at this point\");\n        let request = halt_on_err!([ctx] => request_serializer.serialize_input(input, cfg).map_err(OrchestratorError::other));\n        ctx.set_request(request);\n    }\n\n    // Load the request body into memory if configured to do so\n    if let Some(&LoadedRequestBody::Requested) = cfg.load::<LoadedRequestBody>() {\n        debug!(\"loading request body into memory\");\n        let mut body = SdkBody::taken();\n        mem::swap(&mut body, ctx.request_mut().expect(\"set above\").body_mut());\n        let loaded_body = halt_on_err!([ctx] =>\n            ByteStream::new(body).collect().await.map_err(OrchestratorError::other)\n        )\n        .into_bytes();\n        *ctx.request_mut().as_mut().expect(\"set above\").body_mut() =\n            SdkBody::from(loaded_body.clone());\n        cfg.interceptor_state()\n            .store_put(LoadedRequestBody::Loaded(loaded_body));\n    }\n\n    // Before transmit\n    ctx.enter_before_transmit_phase();\n    run_interceptors!(halt_on_err: {\n        read_after_serialization(ctx, runtime_components, cfg);\n        modify_before_retry_loop(ctx, runtime_components, cfg);\n    });\n\n    // If we got a retry strategy from the bag, ask it what to do.\n    // Otherwise, assume we should attempt the initial request.\n    let should_attempt = runtime_components\n        .retry_strategy()\n        .should_attempt_initial_request(runtime_components, cfg);\n    match should_attempt {\n        // Yes, let's make a request\n        Ok(ShouldAttempt::Yes) => debug!(\"retry strategy has OKed initial request\"),\n        // No, this request shouldn't be sent\n        Ok(ShouldAttempt::No) => {\n            let err: BoxError = \"the retry strategy indicates that an initial request shouldn't be made, but it didn't specify why\".into();\n            halt!([ctx] => OrchestratorError::other(err));\n        }\n        // No, we shouldn't make a request because...\n        Err(err) => halt!([ctx] => OrchestratorError::other(err)),\n        Ok(ShouldAttempt::YesAfterDelay(delay)) => {\n            let sleep_impl = halt_on_err!([ctx] => runtime_components.sleep_impl().ok_or_else(|| OrchestratorError::other(\n                \"the retry strategy requested a delay before sending the initial request, but no 'async sleep' implementation was set\"\n            )));\n            debug!(\"retry strategy has OKed initial request after a {delay:?} delay\");\n            sleep_impl.sleep(delay).await;\n        }\n    }\n\n    // Save a request checkpoint before we make the request. This will allow us to \"rewind\"\n    // the request in the case of retry attempts.\n    ctx.save_checkpoint();\n    let mut retry_delay = None;\n    for i in 1u32.. {\n        // Break from the loop if we can't rewind the request's state. This will always succeed the\n        // first time, but will fail on subsequent iterations if the request body wasn't retryable.\n        trace!(\"checking if context can be rewound for attempt #{i}\");\n        if let RewindResult::Impossible = ctx.rewind(cfg) {\n            debug!(\"request cannot be retried since the request body cannot be cloned\");\n            break;\n        }\n        // Track which attempt we're currently on.\n        cfg.interceptor_state()\n            .store_put::<RequestAttempts>(i.into());\n        // Backoff time should not be included in the attempt timeout\n        if let Some((delay, sleep)) = retry_delay.take() {\n            debug!(\"delaying for {delay:?}\");\n            sleep.await;\n        }\n        let attempt_timeout_config =\n            MaybeTimeoutConfig::new(runtime_components, cfg, TimeoutKind::OperationAttempt);\n        trace!(attempt_timeout_config = ?attempt_timeout_config);\n        let maybe_timeout = async {\n            debug!(\"beginning attempt #{i}\");\n            try_attempt(ctx, cfg, runtime_components, stop_point)\n                .instrument(debug_span!(\"try_attempt\", \"attempt\" = i))\n                .await;\n            finally_attempt(ctx, cfg, runtime_components)\n                .instrument(debug_span!(\"finally_attempt\", \"attempt\" = i))\n                .await;\n            Result::<_, SdkError<Error, HttpResponse>>::Ok(())\n        }\n        .maybe_timeout(attempt_timeout_config)\n        .await\n        .map_err(|err| OrchestratorError::timeout(err.into_source().unwrap()));\n\n        // We continue when encountering a timeout error. The retry classifier will decide what to do with it.\n        continue_on_err!([ctx] => maybe_timeout);\n\n        // If we got a retry strategy from the bag, ask it what to do.\n        // If no strategy was set, we won't retry.\n        let should_attempt = halt_on_err!([ctx] => runtime_components\n            .retry_strategy()\n            .should_attempt_retry(ctx, runtime_components, cfg)\n            .map_err(OrchestratorError::other));\n        match should_attempt {\n            // Yes, let's retry the request\n            ShouldAttempt::Yes => continue,\n            // No, this request shouldn't be retried\n            ShouldAttempt::No => {\n                debug!(\"a retry is either unnecessary or not possible, exiting attempt loop\");\n                break;\n            }\n            ShouldAttempt::YesAfterDelay(delay) => {\n                let sleep_impl = halt_on_err!([ctx] => runtime_components.sleep_impl().ok_or_else(|| OrchestratorError::other(\n                    \"the retry strategy requested a delay before sending the retry request, but no 'async sleep' implementation was set\"\n                )));\n                retry_delay = Some((delay, sleep_impl.sleep(delay)));\n                continue;\n            }\n        }\n    }\n}\n\nasync fn try_attempt(\n    ctx: &mut InterceptorContext,\n    cfg: &mut ConfigBag,\n    runtime_components: &RuntimeComponents,\n    stop_point: StopPoint,\n) {\n    run_interceptors!(halt_on_err: read_before_attempt(ctx, runtime_components, cfg));\n\n    let (scheme_id, identity, endpoint) = halt_on_err!([ctx] => resolve_identity(runtime_components, cfg).await.map_err(OrchestratorError::other));\n\n    match endpoint {\n        Some(endpoint) => {\n            // This branch is for backward compatibility when `AuthSchemeAndEndpointOrchestrationV2` is not present in the config bag.\n            // `resolve_identity` internally resolved an endpoint to determine the most suitable scheme ID, and returned that endpoint.\n            halt_on_err!([ctx] => apply_endpoint(&endpoint, ctx, cfg).map_err(OrchestratorError::other));\n            // Make the endpoint config available to interceptors\n            cfg.interceptor_state().store_put(endpoint);\n        }\n        None => {\n            halt_on_err!([ctx] => orchestrate_endpoint(identity.clone(), ctx, runtime_components, cfg)\n\t\t\t\t    .instrument(debug_span!(\"orchestrate_endpoint\"))\n\t\t\t\t    .await\n\t\t\t\t    .map_err(OrchestratorError::other));\n        }\n    }\n\n    run_interceptors!(halt_on_err: {\n        modify_before_signing(ctx, runtime_components, cfg);\n        read_before_signing(ctx, runtime_components, cfg);\n    });\n\n    halt_on_err!([ctx] => sign_request(&scheme_id, &identity, ctx, runtime_components, cfg).map_err(OrchestratorError::other));\n\n    run_interceptors!(halt_on_err: {\n        read_after_signing(ctx, runtime_components, cfg);\n        modify_before_transmit(ctx, runtime_components, cfg);\n        read_before_transmit(ctx, runtime_components, cfg);\n    });\n\n    // Return early if a stop point is set for before transmit\n    if let StopPoint::BeforeTransmit = stop_point {\n        debug!(\"ending orchestration early because the stop point is `BeforeTransmit`\");\n        return;\n    }\n\n    // The connection consumes the request but we need to keep a copy of it\n    // within the interceptor context, so we clone it here.\n    ctx.enter_transmit_phase();\n    let response = halt_on_err!([ctx] => {\n        let request = ctx.take_request().expect(\"set during serialization\");\n        trace!(request = ?request, \"transmitting request\");\n        let http_client = halt_on_err!([ctx] => runtime_components.http_client().ok_or_else(||\n            OrchestratorError::other(\"No HTTP client was available to send this request. \\\n                Enable the `default-https-client` crate feature or configure an HTTP client to fix this.\")\n        ));\n        let timeout_config = cfg.load::<TimeoutConfig>().expect(\"timeout config must be set\");\n        let settings = {\n            let mut builder = HttpConnectorSettings::builder();\n            builder.set_connect_timeout(timeout_config.connect_timeout());\n            builder.set_read_timeout(timeout_config.read_timeout());\n            builder.build()\n        };\n        let connector = http_client.http_connector(&settings, runtime_components);\n        let response_future = MaybeUploadThroughputCheckFuture::new(\n            cfg,\n            runtime_components,\n            connector.call(request),\n        );\n        response_future.await.map_err(OrchestratorError::connector)\n    });\n    trace!(response = ?response, \"received response from service\");\n    ctx.set_response(response);\n    ctx.enter_before_deserialization_phase();\n\n    run_interceptors!(halt_on_err: {\n        read_after_transmit(ctx, runtime_components, cfg);\n        modify_before_deserialization(ctx, runtime_components, cfg);\n        read_before_deserialization(ctx, runtime_components, cfg);\n    });\n\n    ctx.enter_deserialization_phase();\n    let output_or_error = async {\n        let response = ctx.response_mut().expect(\"set during transmit\");\n        let response_deserializer = cfg\n            .load::<SharedResponseDeserializer>()\n            .expect(\"a request deserializer must be in the config bag\");\n        let maybe_deserialized = {\n            let _span = debug_span!(\"deserialize_streaming\").entered();\n            response_deserializer.deserialize_streaming(response)\n        };\n        match maybe_deserialized {\n            Some(output_or_error) => output_or_error,\n            None => read_body(response)\n                .instrument(debug_span!(\"read_body\"))\n                .await\n                .map_err(OrchestratorError::response)\n                .and_then(|_| {\n                    let _span = debug_span!(\"deserialize_nonstreaming\").entered();\n                    log_response_body(response, cfg);\n                    response_deserializer.deserialize_nonstreaming(response)\n                }),\n        }\n    }\n    .instrument(debug_span!(\"deserialization\"))\n    .await;\n    trace!(output_or_error = ?output_or_error);\n    ctx.set_output_or_error(output_or_error);\n\n    ctx.enter_after_deserialization_phase();\n    run_interceptors!(halt_on_err: read_after_deserialization(ctx, runtime_components, cfg));\n}\n\nasync fn finally_attempt(\n    ctx: &mut InterceptorContext,\n    cfg: &mut ConfigBag,\n    runtime_components: &RuntimeComponents,\n) {\n    run_interceptors!(continue_on_err: {\n        modify_before_attempt_completion(ctx, runtime_components, cfg);\n        read_after_attempt(ctx, runtime_components, cfg);\n    });\n}\n\n#[instrument(skip_all, level = \"debug\")]\nasync fn finally_op(\n    ctx: &mut InterceptorContext,\n    cfg: &mut ConfigBag,\n    runtime_components: &RuntimeComponents,\n) {\n    run_interceptors!(continue_on_err: {\n        modify_before_completion(ctx, runtime_components, cfg);\n        read_after_execution(ctx, runtime_components, cfg);\n    });\n}\n\n#[cfg(all(test, any(feature = \"test-util\", feature = \"legacy-test-util\")))]\nmod tests {\n    use crate::client::auth::no_auth::{NoAuthRuntimePluginV2, NO_AUTH_SCHEME_ID};\n    use crate::client::orchestrator::endpoints::StaticUriEndpointResolver;\n    use crate::client::orchestrator::{invoke, invoke_with_stop_point, StopPoint};\n    use crate::client::retries::strategy::NeverRetryStrategy;\n    use crate::client::test_util::{\n        deserializer::CannedResponseDeserializer, serializer::CannedRequestSerializer,\n    };\n    use aws_smithy_http_client::test_util::NeverClient;\n    use aws_smithy_runtime_api::box_error::BoxError;\n    use aws_smithy_runtime_api::client::auth::static_resolver::StaticAuthSchemeOptionResolver;\n    use aws_smithy_runtime_api::client::auth::{\n        AuthSchemeOptionResolverParams, SharedAuthSchemeOptionResolver,\n    };\n    use aws_smithy_runtime_api::client::endpoint::{\n        EndpointResolverParams, SharedEndpointResolver,\n    };\n    use aws_smithy_runtime_api::client::http::{\n        http_client_fn, HttpConnector, HttpConnectorFuture,\n    };\n    use aws_smithy_runtime_api::client::interceptors::context::{\n        AfterDeserializationInterceptorContextRef, BeforeDeserializationInterceptorContextMut,\n        BeforeDeserializationInterceptorContextRef, BeforeSerializationInterceptorContextMut,\n        BeforeSerializationInterceptorContextRef, BeforeTransmitInterceptorContextMut,\n        BeforeTransmitInterceptorContextRef, FinalizerInterceptorContextMut,\n        FinalizerInterceptorContextRef, Input, Output,\n    };\n    use aws_smithy_runtime_api::client::interceptors::{Intercept, SharedInterceptor};\n    use aws_smithy_runtime_api::client::orchestrator::{HttpRequest, OrchestratorError};\n    use aws_smithy_runtime_api::client::retries::SharedRetryStrategy;\n    use aws_smithy_runtime_api::client::runtime_components::{\n        RuntimeComponents, RuntimeComponentsBuilder,\n    };\n    use aws_smithy_runtime_api::client::runtime_plugin::{RuntimePlugin, RuntimePlugins};\n    use aws_smithy_runtime_api::client::ser_de::{\n        SharedRequestSerializer, SharedResponseDeserializer,\n    };\n    use aws_smithy_runtime_api::shared::IntoShared;\n    use aws_smithy_types::body::SdkBody;\n    use aws_smithy_types::config_bag::{ConfigBag, FrozenLayer, Layer};\n    use aws_smithy_types::timeout::TimeoutConfig;\n    use http_1x::{Response, StatusCode};\n    use std::borrow::Cow;\n    use std::sync::atomic::{AtomicBool, Ordering};\n    use std::sync::Arc;\n    use tracing_test::traced_test;\n\n    fn new_request_serializer() -> CannedRequestSerializer {\n        CannedRequestSerializer::success(HttpRequest::empty())\n    }\n\n    fn new_response_deserializer() -> CannedResponseDeserializer {\n        CannedResponseDeserializer::new(\n            Response::builder()\n                .status(StatusCode::OK)\n                .body(SdkBody::empty())\n                .map_err(|err| OrchestratorError::other(Box::new(err)))\n                .map(Output::erase),\n        )\n    }\n\n    #[derive(Debug, Default)]\n    struct OkConnector {}\n\n    impl OkConnector {\n        fn new() -> Self {\n            Self::default()\n        }\n    }\n\n    impl HttpConnector for OkConnector {\n        fn call(&self, _request: HttpRequest) -> HttpConnectorFuture {\n            HttpConnectorFuture::ready(Ok(http_1x::Response::builder()\n                .status(200)\n                .body(SdkBody::empty())\n                .expect(\"OK response is valid\")\n                .try_into()\n                .unwrap()))\n        }\n    }\n\n    #[derive(Debug)]\n    struct TestOperationRuntimePlugin {\n        builder: RuntimeComponentsBuilder,\n    }\n\n    impl TestOperationRuntimePlugin {\n        fn new() -> Self {\n            Self {\n                builder: RuntimeComponentsBuilder::for_tests()\n                    .with_retry_strategy(Some(SharedRetryStrategy::new(NeverRetryStrategy::new())))\n                    .with_endpoint_resolver(Some(SharedEndpointResolver::new(\n                        StaticUriEndpointResolver::http_localhost(8080),\n                    )))\n                    .with_http_client(Some(http_client_fn(|_, _| {\n                        OkConnector::new().into_shared()\n                    })))\n                    .with_auth_scheme_option_resolver(Some(SharedAuthSchemeOptionResolver::new(\n                        StaticAuthSchemeOptionResolver::new(vec![NO_AUTH_SCHEME_ID]),\n                    ))),\n            }\n        }\n    }\n\n    impl RuntimePlugin for TestOperationRuntimePlugin {\n        fn config(&self) -> Option<FrozenLayer> {\n            let mut layer = Layer::new(\"TestOperationRuntimePlugin\");\n            layer.store_put(AuthSchemeOptionResolverParams::new(\"idontcare\"));\n            layer.store_put(EndpointResolverParams::new(\"dontcare\"));\n            layer.store_put(SharedRequestSerializer::new(new_request_serializer()));\n            layer.store_put(SharedResponseDeserializer::new(new_response_deserializer()));\n            layer.store_put(TimeoutConfig::builder().build());\n            Some(layer.freeze())\n        }\n\n        fn runtime_components(\n            &self,\n            _: &RuntimeComponentsBuilder,\n        ) -> Cow<'_, RuntimeComponentsBuilder> {\n            Cow::Borrowed(&self.builder)\n        }\n    }\n\n    macro_rules! interceptor_error_handling_test {\n        (read_before_execution, $ctx:ty, $expected:expr,) => {\n            interceptor_error_handling_test!(__private read_before_execution, $ctx, $expected,);\n        };\n        ($interceptor:ident, $ctx:ty, $expected:expr) => {\n            interceptor_error_handling_test!(__private $interceptor, $ctx, $expected, _rc: &RuntimeComponents,);\n        };\n        (__private $interceptor:ident, $ctx:ty, $expected:expr, $($rc_arg:tt)*) => {\n            #[derive(Debug)]\n            struct FailingInterceptorA;\n            impl Intercept for FailingInterceptorA {\n                fn name(&self) -> &'static str { \"FailingInterceptorA\" }\n\n                fn $interceptor(\n                    &self,\n                    _ctx: $ctx,\n                    $($rc_arg)*\n                    _cfg: &mut ConfigBag,\n                ) -> Result<(), BoxError> {\n                    tracing::debug!(\"FailingInterceptorA called!\");\n                    Err(\"FailingInterceptorA\".into())\n                }\n            }\n\n            #[derive(Debug)]\n            struct FailingInterceptorB;\n            impl Intercept for FailingInterceptorB {\n                fn name(&self) -> &'static str { \"FailingInterceptorB\" }\n\n                fn $interceptor(\n                    &self,\n                    _ctx: $ctx,\n                    $($rc_arg)*\n                    _cfg: &mut ConfigBag,\n                ) -> Result<(), BoxError> {\n                    tracing::debug!(\"FailingInterceptorB called!\");\n                    Err(\"FailingInterceptorB\".into())\n                }\n            }\n\n            #[derive(Debug)]\n            struct FailingInterceptorC;\n            impl Intercept for FailingInterceptorC {\n                fn name(&self) -> &'static str { \"FailingInterceptorC\" }\n\n                fn $interceptor(\n                    &self,\n                    _ctx: $ctx,\n                    $($rc_arg)*\n                    _cfg: &mut ConfigBag,\n                ) -> Result<(), BoxError> {\n                    tracing::debug!(\"FailingInterceptorC called!\");\n                    Err(\"FailingInterceptorC\".into())\n                }\n            }\n\n            #[derive(Debug)]\n            struct FailingInterceptorsClientRuntimePlugin(RuntimeComponentsBuilder);\n            impl FailingInterceptorsClientRuntimePlugin {\n                fn new() -> Self {\n                    Self(RuntimeComponentsBuilder::new(\"test\").with_interceptor(SharedInterceptor::new(FailingInterceptorA)))\n                }\n            }\n            impl RuntimePlugin for FailingInterceptorsClientRuntimePlugin {\n                fn runtime_components(&self, _: &RuntimeComponentsBuilder) -> Cow<'_, RuntimeComponentsBuilder> {\n                    Cow::Borrowed(&self.0)\n                }\n            }\n\n            #[derive(Debug)]\n            struct FailingInterceptorsOperationRuntimePlugin(RuntimeComponentsBuilder);\n            impl FailingInterceptorsOperationRuntimePlugin {\n                fn new() -> Self {\n                    Self(\n                        RuntimeComponentsBuilder::new(\"test\")\n                            .with_interceptor(SharedInterceptor::new(FailingInterceptorB))\n                            .with_interceptor(SharedInterceptor::new(FailingInterceptorC))\n                    )\n                }\n            }\n            impl RuntimePlugin for FailingInterceptorsOperationRuntimePlugin {\n                fn runtime_components(&self, _: &RuntimeComponentsBuilder) -> Cow<'_, RuntimeComponentsBuilder> {\n                    Cow::Borrowed(&self.0)\n                }\n            }\n\n            let input = Input::doesnt_matter();\n            let runtime_plugins = RuntimePlugins::new()\n                .with_client_plugin(FailingInterceptorsClientRuntimePlugin::new())\n                .with_operation_plugin(TestOperationRuntimePlugin::new())\n                .with_operation_plugin(NoAuthRuntimePluginV2::new())\n                .with_operation_plugin(FailingInterceptorsOperationRuntimePlugin::new());\n            let actual = invoke(\"test\", \"test\", input, &runtime_plugins)\n                .await\n                .expect_err(\"should error\");\n            let actual = format!(\"{:?}\", actual);\n            assert!(\n                actual.starts_with(&$expected),\n                \"\\nActual error:      {actual}\\nShould start with: {}\\n\",\n                $expected\n            );\n\n            assert!(logs_contain(\"FailingInterceptorA called!\"));\n            assert!(logs_contain(\"FailingInterceptorB called!\"));\n            assert!(logs_contain(\"FailingInterceptorC called!\"));\n        };\n    }\n\n    #[tokio::test]\n    #[traced_test]\n    async fn test_read_before_execution_error_handling() {\n        let expected = r#\"ConstructionFailure(ConstructionFailure { source: InterceptorError { kind: ReadBeforeExecution, interceptor_name: Some(\"FailingInterceptorC\"), source: Some(\"FailingInterceptorC\") } })\"#.to_string();\n        interceptor_error_handling_test!(\n            read_before_execution,\n            &BeforeSerializationInterceptorContextRef<'_>,\n            expected,\n        );\n    }\n\n    #[tokio::test]\n    #[traced_test]\n    async fn test_modify_before_serialization_error_handling() {\n        let expected = r#\"ConstructionFailure(ConstructionFailure { source: InterceptorError { kind: ModifyBeforeSerialization, interceptor_name: Some(\"FailingInterceptorC\"), source: Some(\"FailingInterceptorC\") } })\"#.to_string();\n        interceptor_error_handling_test!(\n            modify_before_serialization,\n            &mut BeforeSerializationInterceptorContextMut<'_>,\n            expected\n        );\n    }\n\n    #[tokio::test]\n    #[traced_test]\n    async fn test_read_before_serialization_error_handling() {\n        let expected = r#\"ConstructionFailure(ConstructionFailure { source: InterceptorError { kind: ReadBeforeSerialization, interceptor_name: Some(\"FailingInterceptorC\"), source: Some(\"FailingInterceptorC\") } })\"#.to_string();\n        interceptor_error_handling_test!(\n            read_before_serialization,\n            &BeforeSerializationInterceptorContextRef<'_>,\n            expected\n        );\n    }\n\n    #[tokio::test]\n    #[traced_test]\n    async fn test_read_after_serialization_error_handling() {\n        let expected = r#\"DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ReadAfterSerialization, interceptor_name: Some(\"FailingInterceptorC\")\"#.to_string();\n        interceptor_error_handling_test!(\n            read_after_serialization,\n            &BeforeTransmitInterceptorContextRef<'_>,\n            expected\n        );\n    }\n\n    #[tokio::test]\n    #[traced_test]\n    async fn test_modify_before_retry_loop_error_handling() {\n        let expected = r#\"DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ModifyBeforeRetryLoop, interceptor_name: Some(\"FailingInterceptorC\")\"#.to_string();\n        interceptor_error_handling_test!(\n            modify_before_retry_loop,\n            &mut BeforeTransmitInterceptorContextMut<'_>,\n            expected\n        );\n    }\n\n    #[tokio::test]\n    #[traced_test]\n    async fn test_read_before_attempt_error_handling() {\n        let expected = r#\"DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ReadBeforeAttempt, interceptor_name: Some(\"FailingInterceptorC\")\"#;\n        interceptor_error_handling_test!(\n            read_before_attempt,\n            &BeforeTransmitInterceptorContextRef<'_>,\n            expected\n        );\n    }\n\n    #[tokio::test]\n    #[traced_test]\n    async fn test_modify_before_signing_error_handling() {\n        let expected = r#\"DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ModifyBeforeSigning, interceptor_name: Some(\"FailingInterceptorC\")\"#;\n        interceptor_error_handling_test!(\n            modify_before_signing,\n            &mut BeforeTransmitInterceptorContextMut<'_>,\n            expected\n        );\n    }\n\n    #[tokio::test]\n    #[traced_test]\n    async fn test_read_before_signing_error_handling() {\n        let expected = r#\"DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ReadBeforeSigning, interceptor_name: Some(\"FailingInterceptorC\")\"#;\n        interceptor_error_handling_test!(\n            read_before_signing,\n            &BeforeTransmitInterceptorContextRef<'_>,\n            expected\n        );\n    }\n\n    #[tokio::test]\n    #[traced_test]\n    async fn test_read_after_signing_error_handling() {\n        let expected = r#\"DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ReadAfterSigning, interceptor_name: Some(\"FailingInterceptorC\")\"#;\n        interceptor_error_handling_test!(\n            read_after_signing,\n            &BeforeTransmitInterceptorContextRef<'_>,\n            expected\n        );\n    }\n\n    #[tokio::test]\n    #[traced_test]\n    async fn test_modify_before_transmit_error_handling() {\n        let expected = r#\"DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ModifyBeforeTransmit, interceptor_name: Some(\"FailingInterceptorC\")\"#;\n        interceptor_error_handling_test!(\n            modify_before_transmit,\n            &mut BeforeTransmitInterceptorContextMut<'_>,\n            expected\n        );\n    }\n\n    #[tokio::test]\n    #[traced_test]\n    async fn test_read_before_transmit_error_handling() {\n        let expected = r#\"DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ReadBeforeTransmit, interceptor_name: Some(\"FailingInterceptorC\")\"#;\n        interceptor_error_handling_test!(\n            read_before_transmit,\n            &BeforeTransmitInterceptorContextRef<'_>,\n            expected\n        );\n    }\n\n    #[tokio::test]\n    #[traced_test]\n    async fn test_read_after_transmit_error_handling() {\n        let expected = r#\"ResponseError(ResponseError { source: InterceptorError { kind: ReadAfterTransmit, interceptor_name: Some(\"FailingInterceptorC\")\"#;\n        interceptor_error_handling_test!(\n            read_after_transmit,\n            &BeforeDeserializationInterceptorContextRef<'_>,\n            expected\n        );\n    }\n\n    #[tokio::test]\n    #[traced_test]\n    async fn test_modify_before_deserialization_error_handling() {\n        let expected = r#\"ResponseError(ResponseError { source: InterceptorError { kind: ModifyBeforeDeserialization, interceptor_name: Some(\"FailingInterceptorC\")\"#;\n        interceptor_error_handling_test!(\n            modify_before_deserialization,\n            &mut BeforeDeserializationInterceptorContextMut<'_>,\n            expected\n        );\n    }\n\n    #[tokio::test]\n    #[traced_test]\n    async fn test_read_before_deserialization_error_handling() {\n        let expected = r#\"ResponseError(ResponseError { source: InterceptorError { kind: ReadBeforeDeserialization, interceptor_name: Some(\"FailingInterceptorC\")\"#;\n        interceptor_error_handling_test!(\n            read_before_deserialization,\n            &BeforeDeserializationInterceptorContextRef<'_>,\n            expected\n        );\n    }\n\n    #[tokio::test]\n    #[traced_test]\n    async fn test_read_after_deserialization_error_handling() {\n        let expected = r#\"ResponseError(ResponseError { source: InterceptorError { kind: ReadAfterDeserialization, interceptor_name: Some(\"FailingInterceptorC\")\"#;\n        interceptor_error_handling_test!(\n            read_after_deserialization,\n            &AfterDeserializationInterceptorContextRef<'_>,\n            expected\n        );\n    }\n\n    #[tokio::test]\n    #[traced_test]\n    async fn test_modify_before_attempt_completion_error_handling() {\n        let expected = r#\"ResponseError(ResponseError { source: InterceptorError { kind: ModifyBeforeAttemptCompletion, interceptor_name: Some(\"FailingInterceptorC\")\"#;\n        interceptor_error_handling_test!(\n            modify_before_attempt_completion,\n            &mut FinalizerInterceptorContextMut<'_>,\n            expected\n        );\n    }\n\n    #[tokio::test]\n    #[traced_test]\n    async fn test_read_after_attempt_error_handling() {\n        let expected = r#\"ResponseError(ResponseError { source: InterceptorError { kind: ReadAfterAttempt, interceptor_name: Some(\"FailingInterceptorC\")\"#;\n        interceptor_error_handling_test!(\n            read_after_attempt,\n            &FinalizerInterceptorContextRef<'_>,\n            expected\n        );\n    }\n\n    #[tokio::test]\n    #[traced_test]\n    async fn test_modify_before_completion_error_handling() {\n        let expected = r#\"ResponseError(ResponseError { source: InterceptorError { kind: ModifyBeforeCompletion, interceptor_name: Some(\"FailingInterceptorC\")\"#;\n        interceptor_error_handling_test!(\n            modify_before_completion,\n            &mut FinalizerInterceptorContextMut<'_>,\n            expected\n        );\n    }\n\n    #[tokio::test]\n    #[traced_test]\n    async fn test_read_after_execution_error_handling() {\n        let expected = r#\"ResponseError(ResponseError { source: InterceptorError { kind: ReadAfterExecution, interceptor_name: Some(\"FailingInterceptorC\")\"#;\n        interceptor_error_handling_test!(\n            read_after_execution,\n            &FinalizerInterceptorContextRef<'_>,\n            expected\n        );\n    }\n\n    macro_rules! interceptor_error_redirection_test {\n        (read_before_execution, $origin_ctx:ty, $destination_interceptor:ident, $destination_ctx:ty, $expected:expr) => {\n            interceptor_error_redirection_test!(__private read_before_execution, $origin_ctx, $destination_interceptor, $destination_ctx, $expected,);\n        };\n        ($origin_interceptor:ident, $origin_ctx:ty, $destination_interceptor:ident, $destination_ctx:ty, $expected:expr) => {\n            interceptor_error_redirection_test!(__private $origin_interceptor, $origin_ctx, $destination_interceptor, $destination_ctx, $expected, _rc: &RuntimeComponents,);\n        };\n        (__private $origin_interceptor:ident, $origin_ctx:ty, $destination_interceptor:ident, $destination_ctx:ty, $expected:expr, $($rc_arg:tt)*) => {\n            #[derive(Debug)]\n            struct OriginInterceptor;\n            impl Intercept for OriginInterceptor {\n                fn name(&self) -> &'static str { \"OriginInterceptor\" }\n\n                fn $origin_interceptor(\n                    &self,\n                    _ctx: $origin_ctx,\n                    $($rc_arg)*\n                    _cfg: &mut ConfigBag,\n                ) -> Result<(), BoxError> {\n                    tracing::debug!(\"OriginInterceptor called!\");\n                    Err(\"OriginInterceptor\".into())\n                }\n            }\n\n            #[derive(Debug)]\n            struct DestinationInterceptor;\n            impl Intercept for DestinationInterceptor {\n                fn name(&self) -> &'static str { \"DestinationInterceptor\" }\n\n                fn $destination_interceptor(\n                    &self,\n                    _ctx: $destination_ctx,\n                    _runtime_components: &RuntimeComponents,\n                    _cfg: &mut ConfigBag,\n                ) -> Result<(), BoxError> {\n                    tracing::debug!(\"DestinationInterceptor called!\");\n                    Err(\"DestinationInterceptor\".into())\n                }\n            }\n\n            #[derive(Debug)]\n            struct InterceptorsTestOperationRuntimePlugin(RuntimeComponentsBuilder);\n            impl InterceptorsTestOperationRuntimePlugin {\n                fn new() -> Self {\n                    Self(\n                        RuntimeComponentsBuilder::new(\"test\")\n                            .with_interceptor(SharedInterceptor::new(OriginInterceptor))\n                            .with_interceptor(SharedInterceptor::new(DestinationInterceptor))\n                    )\n                }\n            }\n            impl RuntimePlugin for InterceptorsTestOperationRuntimePlugin {\n                fn runtime_components(&self, _: &RuntimeComponentsBuilder) -> Cow<'_, RuntimeComponentsBuilder> {\n                    Cow::Borrowed(&self.0)\n                }\n            }\n\n            let input = Input::doesnt_matter();\n            let runtime_plugins = RuntimePlugins::new()\n                .with_operation_plugin(TestOperationRuntimePlugin::new())\n                .with_operation_plugin(NoAuthRuntimePluginV2::new())\n                .with_operation_plugin(InterceptorsTestOperationRuntimePlugin::new());\n            let actual = invoke(\"test\", \"test\", input, &runtime_plugins)\n                .await\n                .expect_err(\"should error\");\n            let actual = format!(\"{:?}\", actual);\n            assert!(\n                actual.starts_with(&$expected),\n                \"\\nActual error:      {actual}\\nShould start with: {}\\n\",\n                $expected\n            );\n\n            assert!(logs_contain(\"OriginInterceptor called!\"));\n            assert!(logs_contain(\"DestinationInterceptor called!\"));\n        };\n    }\n\n    #[tokio::test]\n    #[traced_test]\n    async fn test_read_before_execution_error_causes_jump_to_modify_before_completion() {\n        let expected = r#\"ConstructionFailure(ConstructionFailure { source: InterceptorError { kind: ModifyBeforeCompletion, interceptor_name: Some(\"DestinationInterceptor\")\"#;\n        interceptor_error_redirection_test!(\n            read_before_execution,\n            &BeforeSerializationInterceptorContextRef<'_>,\n            modify_before_completion,\n            &mut FinalizerInterceptorContextMut<'_>,\n            expected\n        );\n    }\n\n    #[tokio::test]\n    #[traced_test]\n    async fn test_modify_before_serialization_error_causes_jump_to_modify_before_completion() {\n        let expected = r#\"ConstructionFailure(ConstructionFailure { source: InterceptorError { kind: ModifyBeforeCompletion, interceptor_name: Some(\"DestinationInterceptor\")\"#;\n        interceptor_error_redirection_test!(\n            modify_before_serialization,\n            &mut BeforeSerializationInterceptorContextMut<'_>,\n            modify_before_completion,\n            &mut FinalizerInterceptorContextMut<'_>,\n            expected\n        );\n    }\n\n    #[tokio::test]\n    #[traced_test]\n    async fn test_read_before_serialization_error_causes_jump_to_modify_before_completion() {\n        let expected = r#\"ConstructionFailure(ConstructionFailure { source: InterceptorError { kind: ModifyBeforeCompletion, interceptor_name: Some(\"DestinationInterceptor\")\"#;\n        interceptor_error_redirection_test!(\n            read_before_serialization,\n            &BeforeSerializationInterceptorContextRef<'_>,\n            modify_before_completion,\n            &mut FinalizerInterceptorContextMut<'_>,\n            expected\n        );\n    }\n\n    #[tokio::test]\n    #[traced_test]\n    async fn test_read_after_serialization_error_causes_jump_to_modify_before_completion() {\n        let expected = r#\"DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ModifyBeforeCompletion, interceptor_name: Some(\"DestinationInterceptor\")\"#;\n        interceptor_error_redirection_test!(\n            read_after_serialization,\n            &BeforeTransmitInterceptorContextRef<'_>,\n            modify_before_completion,\n            &mut FinalizerInterceptorContextMut<'_>,\n            expected\n        );\n    }\n\n    #[tokio::test]\n    #[traced_test]\n    async fn test_modify_before_retry_loop_error_causes_jump_to_modify_before_completion() {\n        let expected = r#\"DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ModifyBeforeCompletion, interceptor_name: Some(\"DestinationInterceptor\")\"#;\n        interceptor_error_redirection_test!(\n            modify_before_retry_loop,\n            &mut BeforeTransmitInterceptorContextMut<'_>,\n            modify_before_completion,\n            &mut FinalizerInterceptorContextMut<'_>,\n            expected\n        );\n    }\n\n    #[tokio::test]\n    #[traced_test]\n    async fn test_read_before_attempt_error_causes_jump_to_modify_before_attempt_completion() {\n        let expected = r#\"DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ModifyBeforeAttemptCompletion, interceptor_name: Some(\"DestinationInterceptor\")\"#;\n        interceptor_error_redirection_test!(\n            read_before_attempt,\n            &BeforeTransmitInterceptorContextRef<'_>,\n            modify_before_attempt_completion,\n            &mut FinalizerInterceptorContextMut<'_>,\n            expected\n        );\n    }\n\n    #[tokio::test]\n    #[traced_test]\n    async fn test_modify_before_signing_error_causes_jump_to_modify_before_attempt_completion() {\n        let expected = r#\"DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ModifyBeforeAttemptCompletion, interceptor_name: Some(\"DestinationInterceptor\")\"#;\n        interceptor_error_redirection_test!(\n            modify_before_signing,\n            &mut BeforeTransmitInterceptorContextMut<'_>,\n            modify_before_attempt_completion,\n            &mut FinalizerInterceptorContextMut<'_>,\n            expected\n        );\n    }\n\n    #[tokio::test]\n    #[traced_test]\n    async fn test_read_before_signing_error_causes_jump_to_modify_before_attempt_completion() {\n        let expected = r#\"DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ModifyBeforeAttemptCompletion, interceptor_name: Some(\"DestinationInterceptor\")\"#;\n        interceptor_error_redirection_test!(\n            read_before_signing,\n            &BeforeTransmitInterceptorContextRef<'_>,\n            modify_before_attempt_completion,\n            &mut FinalizerInterceptorContextMut<'_>,\n            expected\n        );\n    }\n\n    #[tokio::test]\n    #[traced_test]\n    async fn test_read_after_signing_error_causes_jump_to_modify_before_attempt_completion() {\n        let expected = r#\"DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ModifyBeforeAttemptCompletion, interceptor_name: Some(\"DestinationInterceptor\")\"#;\n        interceptor_error_redirection_test!(\n            read_after_signing,\n            &BeforeTransmitInterceptorContextRef<'_>,\n            modify_before_attempt_completion,\n            &mut FinalizerInterceptorContextMut<'_>,\n            expected\n        );\n    }\n\n    #[tokio::test]\n    #[traced_test]\n    async fn test_modify_before_transmit_error_causes_jump_to_modify_before_attempt_completion() {\n        let expected = r#\"DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ModifyBeforeAttemptCompletion, interceptor_name: Some(\"DestinationInterceptor\")\"#;\n        interceptor_error_redirection_test!(\n            modify_before_transmit,\n            &mut BeforeTransmitInterceptorContextMut<'_>,\n            modify_before_attempt_completion,\n            &mut FinalizerInterceptorContextMut<'_>,\n            expected\n        );\n    }\n\n    #[tokio::test]\n    #[traced_test]\n    async fn test_read_before_transmit_error_causes_jump_to_modify_before_attempt_completion() {\n        let expected = r#\"DispatchFailure(DispatchFailure { source: ConnectorError { kind: Other(None), source: InterceptorError { kind: ModifyBeforeAttemptCompletion, interceptor_name: Some(\"DestinationInterceptor\")\"#;\n        interceptor_error_redirection_test!(\n            read_before_transmit,\n            &BeforeTransmitInterceptorContextRef<'_>,\n            modify_before_attempt_completion,\n            &mut FinalizerInterceptorContextMut<'_>,\n            expected\n        );\n    }\n\n    #[tokio::test]\n    #[traced_test]\n    async fn test_read_after_transmit_error_causes_jump_to_modify_before_attempt_completion() {\n        let expected = r#\"ResponseError(ResponseError { source: InterceptorError { kind: ModifyBeforeAttemptCompletion, interceptor_name: Some(\"DestinationInterceptor\")\"#;\n        interceptor_error_redirection_test!(\n            read_after_transmit,\n            &BeforeDeserializationInterceptorContextRef<'_>,\n            modify_before_attempt_completion,\n            &mut FinalizerInterceptorContextMut<'_>,\n            expected\n        );\n    }\n\n    #[tokio::test]\n    #[traced_test]\n    async fn test_modify_before_deserialization_error_causes_jump_to_modify_before_attempt_completion(\n    ) {\n        let expected = r#\"ResponseError(ResponseError { source: InterceptorError { kind: ModifyBeforeAttemptCompletion, interceptor_name: Some(\"DestinationInterceptor\")\"#;\n        interceptor_error_redirection_test!(\n            modify_before_deserialization,\n            &mut BeforeDeserializationInterceptorContextMut<'_>,\n            modify_before_attempt_completion,\n            &mut FinalizerInterceptorContextMut<'_>,\n            expected\n        );\n    }\n\n    #[tokio::test]\n    #[traced_test]\n    async fn test_read_before_deserialization_error_causes_jump_to_modify_before_attempt_completion(\n    ) {\n        let expected = r#\"ResponseError(ResponseError { source: InterceptorError { kind: ModifyBeforeAttemptCompletion, interceptor_name: Some(\"DestinationInterceptor\")\"#;\n        interceptor_error_redirection_test!(\n            read_before_deserialization,\n            &BeforeDeserializationInterceptorContextRef<'_>,\n            modify_before_attempt_completion,\n            &mut FinalizerInterceptorContextMut<'_>,\n            expected\n        );\n    }\n\n    #[tokio::test]\n    #[traced_test]\n    async fn test_read_after_deserialization_error_causes_jump_to_modify_before_attempt_completion()\n    {\n        let expected = r#\"ResponseError(ResponseError { source: InterceptorError { kind: ModifyBeforeAttemptCompletion, interceptor_name: Some(\"DestinationInterceptor\")\"#;\n        interceptor_error_redirection_test!(\n            read_after_deserialization,\n            &AfterDeserializationInterceptorContextRef<'_>,\n            modify_before_attempt_completion,\n            &mut FinalizerInterceptorContextMut<'_>,\n            expected\n        );\n    }\n\n    #[tokio::test]\n    #[traced_test]\n    async fn test_modify_before_attempt_completion_error_causes_jump_to_read_after_attempt() {\n        let expected = r#\"ResponseError(ResponseError { source: InterceptorError { kind: ReadAfterAttempt, interceptor_name: Some(\"DestinationInterceptor\")\"#;\n        interceptor_error_redirection_test!(\n            modify_before_attempt_completion,\n            &mut FinalizerInterceptorContextMut<'_>,\n            read_after_attempt,\n            &FinalizerInterceptorContextRef<'_>,\n            expected\n        );\n    }\n\n    #[tokio::test]\n    #[traced_test]\n    async fn test_modify_before_completion_error_causes_jump_to_read_after_execution() {\n        let expected = r#\"ResponseError(ResponseError { source: InterceptorError { kind: ReadAfterExecution, interceptor_name: Some(\"DestinationInterceptor\")\"#;\n        interceptor_error_redirection_test!(\n            modify_before_completion,\n            &mut FinalizerInterceptorContextMut<'_>,\n            read_after_execution,\n            &FinalizerInterceptorContextRef<'_>,\n            expected\n        );\n    }\n\n    #[tokio::test]\n    async fn test_stop_points() {\n        let runtime_plugins = || {\n            RuntimePlugins::new()\n                .with_operation_plugin(TestOperationRuntimePlugin::new())\n                .with_operation_plugin(NoAuthRuntimePluginV2::new())\n        };\n\n        // StopPoint::None should result in a response getting set since orchestration doesn't stop\n        let context = invoke_with_stop_point(\n            \"test\",\n            \"test\",\n            Input::doesnt_matter(),\n            &runtime_plugins(),\n            StopPoint::None,\n        )\n        .await\n        .expect(\"success\");\n        assert!(context.response().is_some());\n\n        // StopPoint::BeforeTransmit will exit right before sending the request, so there should be no response\n        let context = invoke_with_stop_point(\n            \"test\",\n            \"test\",\n            Input::doesnt_matter(),\n            &runtime_plugins(),\n            StopPoint::BeforeTransmit,\n        )\n        .await\n        .expect(\"success\");\n        assert!(context.response().is_none());\n    }\n\n    /// The \"finally\" interceptors should run upon error when the StopPoint is set to BeforeTransmit\n    #[tokio::test]\n    async fn test_stop_points_error_handling() {\n        #[derive(Debug, Default)]\n        struct Inner {\n            modify_before_retry_loop_called: AtomicBool,\n            modify_before_completion_called: AtomicBool,\n            read_after_execution_called: AtomicBool,\n        }\n        #[derive(Clone, Debug, Default)]\n        struct TestInterceptor {\n            inner: Arc<Inner>,\n        }\n\n        impl Intercept for TestInterceptor {\n            fn name(&self) -> &'static str {\n                \"TestInterceptor\"\n            }\n\n            fn modify_before_retry_loop(\n                &self,\n                _context: &mut BeforeTransmitInterceptorContextMut<'_>,\n                _rc: &RuntimeComponents,\n                _cfg: &mut ConfigBag,\n            ) -> Result<(), BoxError> {\n                self.inner\n                    .modify_before_retry_loop_called\n                    .store(true, Ordering::Relaxed);\n                Err(\"test error\".into())\n            }\n\n            fn modify_before_completion(\n                &self,\n                _context: &mut FinalizerInterceptorContextMut<'_>,\n                _rc: &RuntimeComponents,\n                _cfg: &mut ConfigBag,\n            ) -> Result<(), BoxError> {\n                self.inner\n                    .modify_before_completion_called\n                    .store(true, Ordering::Relaxed);\n                Ok(())\n            }\n\n            fn read_after_execution(\n                &self,\n                _context: &FinalizerInterceptorContextRef<'_>,\n                _rc: &RuntimeComponents,\n                _cfg: &mut ConfigBag,\n            ) -> Result<(), BoxError> {\n                self.inner\n                    .read_after_execution_called\n                    .store(true, Ordering::Relaxed);\n                Ok(())\n            }\n        }\n\n        #[derive(Debug)]\n        struct TestInterceptorRuntimePlugin {\n            builder: RuntimeComponentsBuilder,\n        }\n\n        impl RuntimePlugin for TestInterceptorRuntimePlugin {\n            fn runtime_components(\n                &self,\n                _: &RuntimeComponentsBuilder,\n            ) -> Cow<'_, RuntimeComponentsBuilder> {\n                Cow::Borrowed(&self.builder)\n            }\n        }\n\n        let interceptor = TestInterceptor::default();\n        let client = NeverClient::new();\n        let runtime_plugins = || {\n            RuntimePlugins::new()\n                .with_operation_plugin(TestOperationRuntimePlugin::new())\n                .with_operation_plugin(NoAuthRuntimePluginV2::new())\n                .with_operation_plugin(TestInterceptorRuntimePlugin {\n                    builder: RuntimeComponentsBuilder::new(\"test\")\n                        .with_interceptor(SharedInterceptor::new(interceptor.clone()))\n                        .with_http_client(Some(client.clone())),\n                })\n        };\n\n        // StopPoint::BeforeTransmit will exit right before sending the request, so there should be no response\n        let _err = invoke_with_stop_point(\n            \"test\",\n            \"test\",\n            Input::doesnt_matter(),\n            &runtime_plugins(),\n            StopPoint::BeforeTransmit,\n        )\n        .await\n        .expect_err(\"an error was returned\");\n        assert_eq!(client.num_calls(), 0);\n\n        assert!(interceptor\n            .inner\n            .modify_before_retry_loop_called\n            .load(Ordering::Relaxed));\n        assert!(interceptor\n            .inner\n            .modify_before_completion_called\n            .load(Ordering::Relaxed));\n        assert!(interceptor\n            .inner\n            .read_after_execution_called\n            .load(Ordering::Relaxed));\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime/src/client/retries/classifiers.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_smithy_runtime_api::client::interceptors::context::InterceptorContext;\nuse aws_smithy_runtime_api::client::retries::classifiers::{\n    ClassifyRetry, RetryAction, RetryClassifierPriority, SharedRetryClassifier,\n};\nuse aws_smithy_types::retry::ProvideErrorKind;\nuse std::borrow::Cow;\nuse std::error::Error as StdError;\nuse std::marker::PhantomData;\n\n/// A retry classifier for checking if an error is modeled as retryable.\n#[derive(Debug, Default)]\npub struct ModeledAsRetryableClassifier<E> {\n    _inner: PhantomData<E>,\n}\n\nimpl<E> ModeledAsRetryableClassifier<E> {\n    /// Create a new `ModeledAsRetryableClassifier`\n    pub fn new() -> Self {\n        Self {\n            _inner: PhantomData,\n        }\n    }\n\n    /// Return the priority of this retry classifier.\n    pub fn priority() -> RetryClassifierPriority {\n        RetryClassifierPriority::modeled_as_retryable_classifier()\n    }\n}\n\nimpl<E> ClassifyRetry for ModeledAsRetryableClassifier<E>\nwhere\n    E: StdError + ProvideErrorKind + Send + Sync + 'static,\n{\n    fn classify_retry(&self, ctx: &InterceptorContext) -> RetryAction {\n        // Check for a result\n        let output_or_error = ctx.output_or_error();\n        // Check for an error\n        let error = match output_or_error {\n            Some(Ok(_)) | None => return RetryAction::NoActionIndicated,\n            Some(Err(err)) => err,\n        };\n        // Check that the error is an operation error\n        error\n            .as_operation_error()\n            // Downcast the error\n            .and_then(|err| err.downcast_ref::<E>())\n            // Check if the error is retryable\n            .and_then(|err| err.retryable_error_kind().map(RetryAction::retryable_error))\n            .unwrap_or_default()\n    }\n\n    fn name(&self) -> &'static str {\n        \"Errors Modeled As Retryable\"\n    }\n\n    fn priority(&self) -> RetryClassifierPriority {\n        Self::priority()\n    }\n}\n\n/// Classifies response, timeout, and connector errors as retryable or not.\n#[derive(Debug, Default)]\npub struct TransientErrorClassifier<E> {\n    _inner: PhantomData<E>,\n}\n\nimpl<E> TransientErrorClassifier<E> {\n    /// Create a new `TransientErrorClassifier`\n    pub fn new() -> Self {\n        Self {\n            _inner: PhantomData,\n        }\n    }\n\n    /// Return the priority of this retry classifier.\n    pub fn priority() -> RetryClassifierPriority {\n        RetryClassifierPriority::transient_error_classifier()\n    }\n}\n\nimpl<E> ClassifyRetry for TransientErrorClassifier<E>\nwhere\n    E: StdError + Send + Sync + 'static,\n{\n    fn classify_retry(&self, ctx: &InterceptorContext) -> RetryAction {\n        // Check for a result\n        let output_or_error = ctx.output_or_error();\n        // Check for an error\n        let error = match output_or_error {\n            Some(Ok(_)) | None => return RetryAction::NoActionIndicated,\n            Some(Err(err)) => err,\n        };\n\n        if error.is_response_error() || error.is_timeout_error() {\n            RetryAction::transient_error()\n        } else if let Some(error) = error.as_connector_error() {\n            if error.is_timeout() || error.is_io() {\n                RetryAction::transient_error()\n            } else {\n                error\n                    .as_other()\n                    .map(RetryAction::retryable_error)\n                    .unwrap_or_default()\n            }\n        } else {\n            RetryAction::NoActionIndicated\n        }\n    }\n\n    fn name(&self) -> &'static str {\n        \"Retryable Smithy Errors\"\n    }\n\n    fn priority(&self) -> RetryClassifierPriority {\n        Self::priority()\n    }\n}\n\nconst TRANSIENT_ERROR_STATUS_CODES: &[u16] = &[500, 502, 503, 504];\n\n/// A retry classifier that will treat HTTP response with those status codes as retryable.\n/// The `Default` version will retry 500, 502, 503, and 504 errors.\n#[derive(Debug)]\npub struct HttpStatusCodeClassifier {\n    retryable_status_codes: Cow<'static, [u16]>,\n}\n\nimpl Default for HttpStatusCodeClassifier {\n    fn default() -> Self {\n        Self::new_from_codes(TRANSIENT_ERROR_STATUS_CODES.to_owned())\n    }\n}\n\nimpl HttpStatusCodeClassifier {\n    /// Given a `Vec<u16>` where the `u16`s represent status codes, create a `HttpStatusCodeClassifier`\n    /// that will treat HTTP response with those status codes as retryable. The `Default` version\n    /// will retry 500, 502, 503, and 504 errors.\n    pub fn new_from_codes(retryable_status_codes: impl Into<Cow<'static, [u16]>>) -> Self {\n        Self {\n            retryable_status_codes: retryable_status_codes.into(),\n        }\n    }\n\n    /// Return the priority of this retry classifier.\n    pub fn priority() -> RetryClassifierPriority {\n        RetryClassifierPriority::http_status_code_classifier()\n    }\n}\n\nimpl ClassifyRetry for HttpStatusCodeClassifier {\n    fn classify_retry(&self, ctx: &InterceptorContext) -> RetryAction {\n        let is_retryable = ctx\n            .response()\n            .map(|res| res.status().into())\n            .map(|status| self.retryable_status_codes.contains(&status))\n            .unwrap_or_default();\n\n        if is_retryable {\n            RetryAction::transient_error()\n        } else {\n            RetryAction::NoActionIndicated\n        }\n    }\n\n    fn name(&self) -> &'static str {\n        \"HTTP Status Code\"\n    }\n\n    fn priority(&self) -> RetryClassifierPriority {\n        Self::priority()\n    }\n}\n\n/// Given an iterator of retry classifiers and an interceptor context, run retry classifiers on the\n/// context. Each classifier is passed the classification result from the previous classifier (the\n/// 'root' classifier is passed `None`.)\npub fn run_classifiers_on_ctx(\n    classifiers: impl Iterator<Item = SharedRetryClassifier>,\n    ctx: &InterceptorContext,\n) -> RetryAction {\n    // By default, don't retry\n    let mut result = RetryAction::NoActionIndicated;\n\n    for classifier in classifiers {\n        let new_result = classifier.classify_retry(ctx);\n\n        // If the result is `NoActionIndicated`, continue to the next classifier\n        // without overriding any previously-set result.\n        if new_result == RetryAction::NoActionIndicated {\n            continue;\n        }\n\n        // Otherwise, set the result to the new result.\n        tracing::trace!(\n            \"Classifier '{}' set the result of classification to '{}'\",\n            classifier.name(),\n            new_result\n        );\n        result = new_result;\n\n        // If the result is `RetryForbidden`, stop running classifiers.\n        if result == RetryAction::RetryForbidden {\n            tracing::trace!(\"retry classification ending early because a `RetryAction::RetryForbidden` was emitted\",);\n            break;\n        }\n    }\n\n    result\n}\n\n#[cfg(test)]\nmod test {\n    use crate::client::retries::classifiers::{\n        HttpStatusCodeClassifier, ModeledAsRetryableClassifier,\n    };\n    use aws_smithy_runtime_api::client::interceptors::context::{Error, Input, InterceptorContext};\n    use aws_smithy_runtime_api::client::orchestrator::OrchestratorError;\n    use aws_smithy_runtime_api::client::retries::classifiers::{ClassifyRetry, RetryAction};\n    use aws_smithy_types::body::SdkBody;\n    use aws_smithy_types::retry::{ErrorKind, ProvideErrorKind};\n    use std::fmt;\n\n    use super::TransientErrorClassifier;\n\n    #[derive(Debug, PartialEq, Eq, Clone)]\n    struct UnmodeledError;\n\n    impl fmt::Display for UnmodeledError {\n        fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n            write!(f, \"UnmodeledError\")\n        }\n    }\n\n    impl std::error::Error for UnmodeledError {}\n\n    #[test]\n    fn classify_by_response_status() {\n        let policy = HttpStatusCodeClassifier::default();\n        let res = http_1x::Response::builder()\n            .status(500)\n            .body(\"error!\")\n            .unwrap()\n            .map(SdkBody::from);\n        let mut ctx = InterceptorContext::new(Input::doesnt_matter());\n        ctx.set_response(res.try_into().unwrap());\n        assert_eq!(policy.classify_retry(&ctx), RetryAction::transient_error());\n    }\n\n    #[test]\n    fn classify_by_response_status_not_retryable() {\n        let policy = HttpStatusCodeClassifier::default();\n        let res = http_1x::Response::builder()\n            .status(408)\n            .body(\"error!\")\n            .unwrap()\n            .map(SdkBody::from);\n        let mut ctx = InterceptorContext::new(Input::doesnt_matter());\n        ctx.set_response(res.try_into().unwrap());\n        assert_eq!(policy.classify_retry(&ctx), RetryAction::NoActionIndicated);\n    }\n\n    #[test]\n    fn classify_by_error_kind() {\n        #[derive(Debug)]\n        struct RetryableError;\n\n        impl fmt::Display for RetryableError {\n            fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n                write!(f, \"Some retryable error\")\n            }\n        }\n\n        impl ProvideErrorKind for RetryableError {\n            fn retryable_error_kind(&self) -> Option<ErrorKind> {\n                Some(ErrorKind::ClientError)\n            }\n\n            fn code(&self) -> Option<&str> {\n                // code should not be called when `error_kind` is provided\n                unimplemented!()\n            }\n        }\n\n        impl std::error::Error for RetryableError {}\n\n        let policy = ModeledAsRetryableClassifier::<RetryableError>::new();\n        let mut ctx = InterceptorContext::new(Input::doesnt_matter());\n        ctx.set_output_or_error(Err(OrchestratorError::operation(Error::erase(\n            RetryableError,\n        ))));\n\n        assert_eq!(policy.classify_retry(&ctx), RetryAction::client_error(),);\n    }\n\n    #[test]\n    fn classify_response_error() {\n        let policy = TransientErrorClassifier::<UnmodeledError>::new();\n        let mut ctx = InterceptorContext::new(Input::doesnt_matter());\n        ctx.set_output_or_error(Err(OrchestratorError::response(\n            \"I am a response error\".into(),\n        )));\n        assert_eq!(policy.classify_retry(&ctx), RetryAction::transient_error(),);\n    }\n\n    #[test]\n    fn test_timeout_error() {\n        let policy = TransientErrorClassifier::<UnmodeledError>::new();\n        let mut ctx = InterceptorContext::new(Input::doesnt_matter());\n        ctx.set_output_or_error(Err(OrchestratorError::timeout(\n            \"I am a timeout error\".into(),\n        )));\n        assert_eq!(policy.classify_retry(&ctx), RetryAction::transient_error(),);\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime/src/client/retries/client_rate_limiter.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! A rate limiter for controlling the rate at which AWS requests are made. The rate changes based\n//! on the number of throttling errors encountered.\n\n#![allow(dead_code)]\n\nuse crate::client::retries::RetryPartition;\nuse std::sync::{Arc, Mutex};\nuse std::time::Duration;\nuse tracing::debug;\n\n/// Represents a partition for the rate limiter, e.g. an endpoint, a region\n#[non_exhaustive]\n#[derive(Clone, Debug, Hash, PartialEq, Eq)]\npub struct ClientRateLimiterPartition {\n    retry_partition: RetryPartition,\n}\n\nimpl ClientRateLimiterPartition {\n    /// Creates a `ClientRateLimiterPartition` from the given [`RetryPartition`]\n    pub fn new(retry_partition: RetryPartition) -> Self {\n        Self { retry_partition }\n    }\n}\n\nconst RETRY_COST: f64 = 5.0;\nconst RETRY_TIMEOUT_COST: f64 = RETRY_COST * 2.0;\nconst INITIAL_REQUEST_COST: f64 = 1.0;\n\nconst MIN_FILL_RATE: f64 = 0.5;\nconst MIN_CAPACITY: f64 = 1.0;\nconst SMOOTH: f64 = 0.8;\n/// How much to scale back after receiving a throttling response\nconst BETA: f64 = 0.7;\n/// Controls how aggressively we scale up after being throttled\nconst SCALE_CONSTANT: f64 = 0.4;\n\n/// Rate limiter for adaptive retry.\n#[derive(Clone, Debug)]\npub struct ClientRateLimiter {\n    pub(crate) inner: Arc<Mutex<Inner>>,\n}\n\n#[derive(Debug)]\npub(crate) struct Inner {\n    /// The rate at which token are replenished.\n    fill_rate: f64,\n    /// The maximum capacity allowed in the token bucket.\n    max_capacity: f64,\n    /// The current capacity of the token bucket. The minimum this can be is 1.0\n    current_capacity: f64,\n    /// The last time the token bucket was refilled.\n    last_timestamp: Option<f64>,\n    /// Boolean indicating if the token bucket is enabled.\n    /// The token bucket is initially disabled.\n    /// When a throttling error is encountered it is enabled.\n    enabled: bool,\n    /// The smoothed rate which tokens are being retrieved.\n    measured_tx_rate: f64,\n    /// The last half second time bucket used.\n    last_tx_rate_bucket: f64,\n    /// The number of requests seen within the current time bucket.\n    request_count: u64,\n    /// The maximum rate when the client was last throttled.\n    last_max_rate: f64,\n    /// The last time when the client was throttled.\n    time_of_last_throttle: f64,\n}\n\npub(crate) enum RequestReason {\n    Retry,\n    RetryTimeout,\n    InitialRequest,\n}\n\nimpl Default for ClientRateLimiter {\n    fn default() -> Self {\n        Self::builder().build()\n    }\n}\n\nimpl ClientRateLimiter {\n    /// Creates a new `ClientRateLimiter`\n    pub fn new(seconds_since_unix_epoch: f64) -> Self {\n        Self::builder()\n            .tokens_retrieved_per_second(MIN_FILL_RATE)\n            .time_of_last_throttle(seconds_since_unix_epoch)\n            .previous_time_bucket(seconds_since_unix_epoch.floor())\n            .build()\n    }\n\n    /// Creates a new `ClientRateLimiterBuilder`\n    pub fn builder() -> ClientRateLimiterBuilder {\n        ClientRateLimiterBuilder::new()\n    }\n\n    pub(crate) fn acquire_permission_to_send_a_request(\n        &self,\n        seconds_since_unix_epoch: f64,\n        kind: RequestReason,\n    ) -> Result<(), Duration> {\n        let mut it = self.inner.lock().unwrap();\n\n        if !it.enabled {\n            // return early if we haven't encountered a throttling error yet\n            return Ok(());\n        }\n        let amount = match kind {\n            RequestReason::Retry => RETRY_COST,\n            RequestReason::RetryTimeout => RETRY_TIMEOUT_COST,\n            RequestReason::InitialRequest => INITIAL_REQUEST_COST,\n        };\n\n        it.refill(seconds_since_unix_epoch);\n\n        let res = if amount > it.current_capacity {\n            let sleep_time = (amount - it.current_capacity) / it.fill_rate;\n            debug!(\n                amount,\n                it.current_capacity,\n                it.fill_rate,\n                sleep_time,\n                \"client rate limiter delayed a request\"\n            );\n\n            Err(Duration::from_secs_f64(sleep_time))\n        } else {\n            Ok(())\n        };\n\n        it.current_capacity -= amount;\n        res\n    }\n\n    pub(crate) fn update_rate_limiter(\n        &self,\n        seconds_since_unix_epoch: f64,\n        is_throttling_error: bool,\n    ) {\n        let mut it = self.inner.lock().unwrap();\n        it.update_tokens_retrieved_per_second(seconds_since_unix_epoch);\n\n        let calculated_rate;\n        if is_throttling_error {\n            let rate_to_use = if it.enabled {\n                f64::min(it.measured_tx_rate, it.fill_rate)\n            } else {\n                it.measured_tx_rate\n            };\n\n            // The fill_rate is from the token bucket\n            it.last_max_rate = rate_to_use;\n            it.calculate_time_window();\n            it.time_of_last_throttle = seconds_since_unix_epoch;\n            calculated_rate = cubic_throttle(rate_to_use);\n            it.enable_token_bucket();\n        } else {\n            it.calculate_time_window();\n            calculated_rate = it.cubic_success(seconds_since_unix_epoch);\n        }\n\n        let new_rate = f64::min(calculated_rate, 2.0 * it.measured_tx_rate);\n        it.update_bucket_refill_rate(seconds_since_unix_epoch, new_rate);\n    }\n}\n\nimpl Inner {\n    fn refill(&mut self, seconds_since_unix_epoch: f64) {\n        if let Some(last_timestamp) = self.last_timestamp {\n            let fill_amount = (seconds_since_unix_epoch - last_timestamp) * self.fill_rate;\n            self.current_capacity =\n                f64::min(self.max_capacity, self.current_capacity + fill_amount);\n            debug!(\n                fill_amount,\n                self.current_capacity, self.max_capacity, \"refilling client rate limiter tokens\"\n            );\n        }\n        self.last_timestamp = Some(seconds_since_unix_epoch);\n    }\n\n    fn update_bucket_refill_rate(&mut self, seconds_since_unix_epoch: f64, new_fill_rate: f64) {\n        // Refill based on our current rate before we update to the new fill rate.\n        self.refill(seconds_since_unix_epoch);\n\n        self.fill_rate = f64::max(new_fill_rate, MIN_FILL_RATE);\n        self.max_capacity = f64::max(new_fill_rate, MIN_CAPACITY);\n\n        debug!(\n            fill_rate = self.fill_rate,\n            max_capacity = self.max_capacity,\n            current_capacity = self.current_capacity,\n            measured_tx_rate = self.measured_tx_rate,\n            \"client rate limiter state has been updated\"\n        );\n\n        // When we scale down we can't have a current capacity that exceeds our max_capacity.\n        self.current_capacity = f64::min(self.current_capacity, self.max_capacity);\n    }\n\n    fn enable_token_bucket(&mut self) {\n        // If throttling wasn't already enabled, note that we're now enabling it.\n        if !self.enabled {\n            debug!(\"client rate limiting has been enabled\");\n        }\n        self.enabled = true;\n    }\n\n    fn update_tokens_retrieved_per_second(&mut self, seconds_since_unix_epoch: f64) {\n        let next_time_bucket = (seconds_since_unix_epoch * 2.0).floor() / 2.0;\n        self.request_count += 1;\n\n        if next_time_bucket > self.last_tx_rate_bucket {\n            let current_rate =\n                self.request_count as f64 / (next_time_bucket - self.last_tx_rate_bucket);\n            self.measured_tx_rate = current_rate * SMOOTH + self.measured_tx_rate * (1.0 - SMOOTH);\n            self.request_count = 0;\n            self.last_tx_rate_bucket = next_time_bucket;\n        }\n    }\n\n    fn calculate_time_window(&self) -> f64 {\n        let base = (self.last_max_rate * (1.0 - BETA)) / SCALE_CONSTANT;\n        base.powf(1.0 / 3.0)\n    }\n\n    fn cubic_success(&self, seconds_since_unix_epoch: f64) -> f64 {\n        let dt =\n            seconds_since_unix_epoch - self.time_of_last_throttle - self.calculate_time_window();\n        (SCALE_CONSTANT * dt.powi(3)) + self.last_max_rate\n    }\n}\n\nfn cubic_throttle(rate_to_use: f64) -> f64 {\n    rate_to_use * BETA\n}\n\n/// Builder for `ClientRateLimiter`.\n#[derive(Clone, Debug, Default)]\npub struct ClientRateLimiterBuilder {\n    ///The rate at which token are replenished.\n    token_refill_rate: Option<f64>,\n    ///The maximum capacity allowed in the token bucket.\n    maximum_bucket_capacity: Option<f64>,\n    ///The current capacity of the token bucket.\n    current_bucket_capacity: Option<f64>,\n    ///The last time the token bucket was refilled.\n    time_of_last_refill: Option<f64>,\n    ///The smoothed rate which tokens are being retrieved.\n    tokens_retrieved_per_second: Option<f64>,\n    ///The last half second time bucket used.\n    previous_time_bucket: Option<f64>,\n    ///The number of requests seen within the current time bucket.\n    request_count: Option<u64>,\n    ///Boolean indicating if the token bucket is enabled. The token bucket is initially disabled. When a throttling error is encountered it is enabled.\n    enable_throttling: Option<bool>,\n    ///The maximum rate when the client was last throttled.\n    tokens_retrieved_per_second_at_time_of_last_throttle: Option<f64>,\n    ///The last time when the client was throttled.\n    time_of_last_throttle: Option<f64>,\n}\n\nimpl ClientRateLimiterBuilder {\n    /// Create a new `ClientRateLimiterBuilder`.\n    pub fn new() -> Self {\n        ClientRateLimiterBuilder::default()\n    }\n    /// The rate at which token are replenished.\n    pub fn token_refill_rate(mut self, token_refill_rate: f64) -> Self {\n        self.set_token_refill_rate(Some(token_refill_rate));\n        self\n    }\n    /// The rate at which token are replenished.\n    pub fn set_token_refill_rate(&mut self, token_refill_rate: Option<f64>) -> &mut Self {\n        self.token_refill_rate = token_refill_rate;\n        self\n    }\n    /// The maximum capacity allowed in the token bucket\n    ///\n    /// The implementation of [`ClientRateLimiter`] guarantees that `current_capacity` never exceeds this value.\n    pub fn maximum_bucket_capacity(mut self, maximum_bucket_capacity: f64) -> Self {\n        self.set_maximum_bucket_capacity(Some(maximum_bucket_capacity));\n        self\n    }\n    /// The maximum capacity allowed in the token bucket\n    ///\n    /// The implementation of [`ClientRateLimiter`] guarantees that `current_capacity` never exceeds this value.\n    pub fn set_maximum_bucket_capacity(\n        &mut self,\n        maximum_bucket_capacity: Option<f64>,\n    ) -> &mut Self {\n        self.maximum_bucket_capacity = maximum_bucket_capacity;\n        self\n    }\n    /// The current capacity of the token bucket\n    ///\n    /// The implementation of [`ClientRateLimiter`] guarantees that this value is always at least `1.0` when it's enabled.\n    pub fn current_bucket_capacity(mut self, current_bucket_capacity: f64) -> Self {\n        self.set_current_bucket_capacity(Some(current_bucket_capacity));\n        self\n    }\n    /// The current capacity of the token bucket\n    ///\n    /// The implementation of [`ClientRateLimiter`] guarantees that this value is always at least `1.0` when it's enabled.\n    pub fn set_current_bucket_capacity(\n        &mut self,\n        current_bucket_capacity: Option<f64>,\n    ) -> &mut Self {\n        self.current_bucket_capacity = current_bucket_capacity;\n        self\n    }\n    // The last time the token bucket was refilled.\n    fn time_of_last_refill(mut self, time_of_last_refill: f64) -> Self {\n        self.set_time_of_last_refill(Some(time_of_last_refill));\n        self\n    }\n    // The last time the token bucket was refilled.\n    fn set_time_of_last_refill(&mut self, time_of_last_refill: Option<f64>) -> &mut Self {\n        self.time_of_last_refill = time_of_last_refill;\n        self\n    }\n    /// The smoothed rate which tokens are being retrieved.\n    pub fn tokens_retrieved_per_second(mut self, tokens_retrieved_per_second: f64) -> Self {\n        self.set_tokens_retrieved_per_second(Some(tokens_retrieved_per_second));\n        self\n    }\n    /// The smoothed rate which tokens are being retrieved.\n    pub fn set_tokens_retrieved_per_second(\n        &mut self,\n        tokens_retrieved_per_second: Option<f64>,\n    ) -> &mut Self {\n        self.tokens_retrieved_per_second = tokens_retrieved_per_second;\n        self\n    }\n    // The last half second time bucket used.\n    fn previous_time_bucket(mut self, previous_time_bucket: f64) -> Self {\n        self.set_previous_time_bucket(Some(previous_time_bucket));\n        self\n    }\n    // The last half second time bucket used.\n    fn set_previous_time_bucket(&mut self, previous_time_bucket: Option<f64>) -> &mut Self {\n        self.previous_time_bucket = previous_time_bucket;\n        self\n    }\n    // The number of requests seen within the current time bucket.\n    fn request_count(mut self, request_count: u64) -> Self {\n        self.set_request_count(Some(request_count));\n        self\n    }\n    // The number of requests seen within the current time bucket.\n    fn set_request_count(&mut self, request_count: Option<u64>) -> &mut Self {\n        self.request_count = request_count;\n        self\n    }\n    // Boolean indicating if the token bucket is enabled. The token bucket is initially disabled. When a throttling error is encountered it is enabled.\n    fn enable_throttling(mut self, enable_throttling: bool) -> Self {\n        self.set_enable_throttling(Some(enable_throttling));\n        self\n    }\n    // Boolean indicating if the token bucket is enabled. The token bucket is initially disabled. When a throttling error is encountered it is enabled.\n    fn set_enable_throttling(&mut self, enable_throttling: Option<bool>) -> &mut Self {\n        self.enable_throttling = enable_throttling;\n        self\n    }\n    // The maximum rate when the client was last throttled.\n    fn tokens_retrieved_per_second_at_time_of_last_throttle(\n        mut self,\n        tokens_retrieved_per_second_at_time_of_last_throttle: f64,\n    ) -> Self {\n        self.set_tokens_retrieved_per_second_at_time_of_last_throttle(Some(\n            tokens_retrieved_per_second_at_time_of_last_throttle,\n        ));\n        self\n    }\n    // The maximum rate when the client was last throttled.\n    fn set_tokens_retrieved_per_second_at_time_of_last_throttle(\n        &mut self,\n        tokens_retrieved_per_second_at_time_of_last_throttle: Option<f64>,\n    ) -> &mut Self {\n        self.tokens_retrieved_per_second_at_time_of_last_throttle =\n            tokens_retrieved_per_second_at_time_of_last_throttle;\n        self\n    }\n    // The last time when the client was throttled.\n    fn time_of_last_throttle(mut self, time_of_last_throttle: f64) -> Self {\n        self.set_time_of_last_throttle(Some(time_of_last_throttle));\n        self\n    }\n    // The last time when the client was throttled.\n    fn set_time_of_last_throttle(&mut self, time_of_last_throttle: Option<f64>) -> &mut Self {\n        self.time_of_last_throttle = time_of_last_throttle;\n        self\n    }\n    /// Build the ClientRateLimiter.\n    pub fn build(self) -> ClientRateLimiter {\n        ClientRateLimiter {\n            inner: Arc::new(Mutex::new(Inner {\n                fill_rate: self.token_refill_rate.unwrap_or_default(),\n                max_capacity: self.maximum_bucket_capacity.unwrap_or(f64::MAX),\n                current_capacity: self.current_bucket_capacity.unwrap_or_default(),\n                last_timestamp: self.time_of_last_refill,\n                enabled: self.enable_throttling.unwrap_or_default(),\n                measured_tx_rate: self.tokens_retrieved_per_second.unwrap_or_default(),\n                last_tx_rate_bucket: self.previous_time_bucket.unwrap_or_default(),\n                request_count: self.request_count.unwrap_or_default(),\n                last_max_rate: self\n                    .tokens_retrieved_per_second_at_time_of_last_throttle\n                    .unwrap_or_default(),\n                time_of_last_throttle: self.time_of_last_throttle.unwrap_or_default(),\n            })),\n        }\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::{cubic_throttle, ClientRateLimiter};\n    use crate::client::retries::client_rate_limiter::RequestReason;\n    use approx::assert_relative_eq;\n    use aws_smithy_async::rt::sleep::AsyncSleep;\n    use aws_smithy_async::test_util::instant_time_and_sleep;\n    use std::time::{Duration, SystemTime};\n\n    const ONE_SECOND: Duration = Duration::from_secs(1);\n    const TWO_HUNDRED_MILLISECONDS: Duration = Duration::from_millis(200);\n\n    #[test]\n    fn should_match_beta_decrease() {\n        let new_rate = cubic_throttle(10.0);\n        assert_relative_eq!(new_rate, 7.0);\n\n        let rate_limiter = ClientRateLimiter::builder()\n            .tokens_retrieved_per_second_at_time_of_last_throttle(10.0)\n            .time_of_last_throttle(1.0)\n            .build();\n\n        rate_limiter.inner.lock().unwrap().calculate_time_window();\n        let new_rate = rate_limiter.inner.lock().unwrap().cubic_success(1.0);\n        assert_relative_eq!(new_rate, 7.0);\n    }\n\n    #[tokio::test]\n    async fn throttling_is_enabled_once_throttling_error_is_received() {\n        let rate_limiter = ClientRateLimiter::builder()\n            .previous_time_bucket(0.0)\n            .time_of_last_throttle(0.0)\n            .build();\n\n        assert!(\n            !rate_limiter.inner.lock().unwrap().enabled,\n            \"rate_limiter should be disabled by default\"\n        );\n        rate_limiter.update_rate_limiter(0.0, true);\n        assert!(\n            rate_limiter.inner.lock().unwrap().enabled,\n            \"rate_limiter should be enabled after throttling error\"\n        );\n    }\n\n    #[tokio::test]\n    async fn test_calculated_rate_with_successes() {\n        let rate_limiter = ClientRateLimiter::builder()\n            .time_of_last_throttle(5.0)\n            .tokens_retrieved_per_second_at_time_of_last_throttle(10.0)\n            .build();\n\n        struct Attempt {\n            seconds_since_unix_epoch: f64,\n            expected_calculated_rate: f64,\n        }\n\n        let attempts = [\n            Attempt {\n                seconds_since_unix_epoch: 5.0,\n                expected_calculated_rate: 7.0,\n            },\n            Attempt {\n                seconds_since_unix_epoch: 6.0,\n                expected_calculated_rate: 9.64893600966,\n            },\n            Attempt {\n                seconds_since_unix_epoch: 7.0,\n                expected_calculated_rate: 10.000030849917364,\n            },\n            Attempt {\n                seconds_since_unix_epoch: 8.0,\n                expected_calculated_rate: 10.453284520772092,\n            },\n            Attempt {\n                seconds_since_unix_epoch: 9.0,\n                expected_calculated_rate: 13.408697022224185,\n            },\n            Attempt {\n                seconds_since_unix_epoch: 10.0,\n                expected_calculated_rate: 21.26626835427364,\n            },\n            Attempt {\n                seconds_since_unix_epoch: 11.0,\n                expected_calculated_rate: 36.425998516920465,\n            },\n        ];\n\n        // Think this test is a little strange? I ported the test from Go v2, and this is how it\n        // was implemented. See for yourself:\n        // https://github.com/aws/aws-sdk-go-v2/blob/844ff45cdc76182229ad098c95bf3f5ab8c20e9f/aws/retry/adaptive_ratelimit_test.go#L97\n        for attempt in attempts {\n            rate_limiter.inner.lock().unwrap().calculate_time_window();\n            let calculated_rate = rate_limiter\n                .inner\n                .lock()\n                .unwrap()\n                .cubic_success(attempt.seconds_since_unix_epoch);\n\n            assert_relative_eq!(attempt.expected_calculated_rate, calculated_rate);\n        }\n    }\n\n    #[tokio::test]\n    async fn test_calculated_rate_with_throttles() {\n        let rate_limiter = ClientRateLimiter::builder()\n            .tokens_retrieved_per_second_at_time_of_last_throttle(10.0)\n            .time_of_last_throttle(5.0)\n            .build();\n\n        struct Attempt {\n            throttled: bool,\n            seconds_since_unix_epoch: f64,\n            expected_calculated_rate: f64,\n        }\n\n        let attempts = [\n            Attempt {\n                throttled: false,\n                seconds_since_unix_epoch: 5.0,\n                expected_calculated_rate: 7.0,\n            },\n            Attempt {\n                throttled: false,\n                seconds_since_unix_epoch: 6.0,\n                expected_calculated_rate: 9.64893600966,\n            },\n            Attempt {\n                throttled: true,\n                seconds_since_unix_epoch: 7.0,\n                expected_calculated_rate: 6.754255206761999,\n            },\n            Attempt {\n                throttled: true,\n                seconds_since_unix_epoch: 8.0,\n                expected_calculated_rate: 4.727978644733399,\n            },\n            Attempt {\n                throttled: false,\n                seconds_since_unix_epoch: 9.0,\n                expected_calculated_rate: 4.670125557970046,\n            },\n            Attempt {\n                throttled: false,\n                seconds_since_unix_epoch: 10.0,\n                expected_calculated_rate: 4.770870456867401,\n            },\n            Attempt {\n                throttled: false,\n                seconds_since_unix_epoch: 11.0,\n                expected_calculated_rate: 6.011819748005445,\n            },\n            Attempt {\n                throttled: false,\n                seconds_since_unix_epoch: 12.0,\n                expected_calculated_rate: 10.792973431384178,\n            },\n        ];\n\n        // Think this test is a little strange? I ported the test from Go v2, and this is how it\n        // was implemented. See for yourself:\n        // https://github.com/aws/aws-sdk-go-v2/blob/844ff45cdc76182229ad098c95bf3f5ab8c20e9f/aws/retry/adaptive_ratelimit_test.go#L97\n        let mut calculated_rate = 0.0;\n        for attempt in attempts {\n            let mut inner = rate_limiter.inner.lock().unwrap();\n            inner.calculate_time_window();\n            if attempt.throttled {\n                calculated_rate = cubic_throttle(calculated_rate);\n                inner.time_of_last_throttle = attempt.seconds_since_unix_epoch;\n                inner.last_max_rate = calculated_rate;\n            } else {\n                calculated_rate = inner.cubic_success(attempt.seconds_since_unix_epoch);\n            };\n\n            assert_relative_eq!(attempt.expected_calculated_rate, calculated_rate);\n        }\n    }\n\n    #[tokio::test]\n    async fn test_client_sending_rates() {\n        let (_, sleep_impl) = instant_time_and_sleep(SystemTime::UNIX_EPOCH);\n        let rate_limiter = ClientRateLimiter::builder().build();\n\n        struct Attempt {\n            throttled: bool,\n            seconds_since_unix_epoch: f64,\n            expected_tokens_retrieved_per_second: f64,\n            expected_token_refill_rate: f64,\n        }\n\n        let attempts = [\n            Attempt {\n                throttled: false,\n                seconds_since_unix_epoch: 0.2,\n                expected_tokens_retrieved_per_second: 0.000000,\n                expected_token_refill_rate: 0.500000,\n            },\n            Attempt {\n                throttled: false,\n                seconds_since_unix_epoch: 0.4,\n                expected_tokens_retrieved_per_second: 0.000000,\n                expected_token_refill_rate: 0.500000,\n            },\n            Attempt {\n                throttled: false,\n                seconds_since_unix_epoch: 0.6,\n                expected_tokens_retrieved_per_second: 4.800000000000001,\n                expected_token_refill_rate: 0.500000,\n            },\n            Attempt {\n                throttled: false,\n                seconds_since_unix_epoch: 0.8,\n                expected_tokens_retrieved_per_second: 4.800000000000001,\n                expected_token_refill_rate: 0.500000,\n            },\n            Attempt {\n                throttled: false,\n                seconds_since_unix_epoch: 1.0,\n                expected_tokens_retrieved_per_second: 4.160000,\n                expected_token_refill_rate: 0.500000,\n            },\n            Attempt {\n                throttled: false,\n                seconds_since_unix_epoch: 1.2,\n                expected_tokens_retrieved_per_second: 4.160000,\n                expected_token_refill_rate: 0.691200,\n            },\n            Attempt {\n                throttled: false,\n                seconds_since_unix_epoch: 1.4,\n                expected_tokens_retrieved_per_second: 4.160000,\n                expected_token_refill_rate: 1.0975999999999997,\n            },\n            Attempt {\n                throttled: false,\n                seconds_since_unix_epoch: 1.6,\n                expected_tokens_retrieved_per_second: 5.632000000000001,\n                expected_token_refill_rate: 1.6384000000000005,\n            },\n            Attempt {\n                throttled: false,\n                seconds_since_unix_epoch: 1.8,\n                expected_tokens_retrieved_per_second: 5.632000000000001,\n                expected_token_refill_rate: 2.332800,\n            },\n            Attempt {\n                throttled: true,\n                seconds_since_unix_epoch: 2.0,\n                expected_tokens_retrieved_per_second: 4.326400,\n                expected_token_refill_rate: 3.0284799999999996,\n            },\n            Attempt {\n                throttled: false,\n                seconds_since_unix_epoch: 2.2,\n                expected_tokens_retrieved_per_second: 4.326400,\n                expected_token_refill_rate: 3.48663917347026,\n            },\n            Attempt {\n                throttled: false,\n                seconds_since_unix_epoch: 2.4,\n                expected_tokens_retrieved_per_second: 4.326400,\n                expected_token_refill_rate: 3.821874416040255,\n            },\n            Attempt {\n                throttled: false,\n                seconds_since_unix_epoch: 2.6,\n                expected_tokens_retrieved_per_second: 5.665280,\n                expected_token_refill_rate: 4.053385727709987,\n            },\n            Attempt {\n                throttled: false,\n                seconds_since_unix_epoch: 2.8,\n                expected_tokens_retrieved_per_second: 5.665280,\n                expected_token_refill_rate: 4.200373108479454,\n            },\n            Attempt {\n                throttled: false,\n                seconds_since_unix_epoch: 3.0,\n                expected_tokens_retrieved_per_second: 4.333056,\n                expected_token_refill_rate: 4.282036558348658,\n            },\n            Attempt {\n                throttled: true,\n                seconds_since_unix_epoch: 3.2,\n                expected_tokens_retrieved_per_second: 4.333056,\n                expected_token_refill_rate: 2.99742559084406,\n            },\n            Attempt {\n                throttled: false,\n                seconds_since_unix_epoch: 3.4,\n                expected_tokens_retrieved_per_second: 4.333056,\n                expected_token_refill_rate: 3.4522263943863463,\n            },\n        ];\n\n        for attempt in attempts {\n            sleep_impl.sleep(TWO_HUNDRED_MILLISECONDS).await;\n            assert_eq!(\n                attempt.seconds_since_unix_epoch,\n                sleep_impl.total_duration().as_secs_f64()\n            );\n\n            rate_limiter.update_rate_limiter(attempt.seconds_since_unix_epoch, attempt.throttled);\n            assert_relative_eq!(\n                attempt.expected_tokens_retrieved_per_second,\n                rate_limiter.inner.lock().unwrap().measured_tx_rate\n            );\n            assert_relative_eq!(\n                attempt.expected_token_refill_rate,\n                rate_limiter.inner.lock().unwrap().fill_rate\n            );\n        }\n    }\n\n    // This test is only testing that we don't fail basic math and panic. It does include an\n    // element of randomness, but no duration between >= 0.0s and <= 1.0s will ever cause a panic.\n    //\n    // Because the cost of sending an individual request is 1.0, and because the minimum capacity is\n    // also 1.0, we will never encounter a situation where we run out of tokens.\n    #[tokio::test]\n    async fn test_when_throttling_is_enabled_requests_can_still_be_sent() {\n        let (time_source, sleep_impl) = instant_time_and_sleep(SystemTime::UNIX_EPOCH);\n        let crl = ClientRateLimiter::builder()\n            .time_of_last_throttle(0.0)\n            .previous_time_bucket(0.0)\n            .build();\n\n        // Start by recording a throttling error\n        crl.update_rate_limiter(0.0, true);\n\n        for _i in 0..100 {\n            // advance time by a random amount (up to 1s) each iteration\n            let duration = Duration::from_secs_f64(fastrand::f64());\n            sleep_impl.sleep(duration).await;\n            if let Err(delay) = crl.acquire_permission_to_send_a_request(\n                time_source.seconds_since_unix_epoch(),\n                RequestReason::InitialRequest,\n            ) {\n                sleep_impl.sleep(delay).await;\n            }\n\n            // Assume all further requests succeed on the first try\n            crl.update_rate_limiter(time_source.seconds_since_unix_epoch(), false);\n        }\n\n        let inner = crl.inner.lock().unwrap();\n        assert!(inner.enabled, \"the rate limiter should still be enabled\");\n        // Assert that the rate limiter respects the passage of time.\n        assert_relative_eq!(\n            inner.last_timestamp.unwrap(),\n            sleep_impl.total_duration().as_secs_f64(),\n            max_relative = 0.0001\n        );\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime/src/client/retries/strategy/never.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_smithy_runtime_api::box_error::BoxError;\nuse aws_smithy_runtime_api::client::interceptors::context::InterceptorContext;\nuse aws_smithy_runtime_api::client::retries::{RetryStrategy, ShouldAttempt};\nuse aws_smithy_runtime_api::client::runtime_components::RuntimeComponents;\nuse aws_smithy_types::config_bag::ConfigBag;\n\n/// A retry strategy that never retries.\n#[non_exhaustive]\n#[derive(Debug, Clone, Default)]\npub struct NeverRetryStrategy;\n\nimpl NeverRetryStrategy {\n    /// Creates a new `NeverRetryStrategy`.\n    pub fn new() -> Self {\n        Self::default()\n    }\n}\n\nimpl RetryStrategy for NeverRetryStrategy {\n    fn should_attempt_initial_request(\n        &self,\n        _runtime_components: &RuntimeComponents,\n        _cfg: &ConfigBag,\n    ) -> Result<ShouldAttempt, BoxError> {\n        Ok(ShouldAttempt::Yes)\n    }\n\n    fn should_attempt_retry(\n        &self,\n        _context: &InterceptorContext,\n        _runtime_components: &RuntimeComponents,\n        _cfg: &ConfigBag,\n    ) -> Result<ShouldAttempt, BoxError> {\n        Ok(ShouldAttempt::No)\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime/src/client/retries/strategy/standard.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::sync::Mutex;\nuse std::time::{Duration, SystemTime};\n\nuse tokio::sync::OwnedSemaphorePermit;\nuse tracing::{debug, trace};\n\nuse aws_smithy_runtime_api::box_error::BoxError;\nuse aws_smithy_runtime_api::client::interceptors::context::{\n    BeforeTransmitInterceptorContextMut, InterceptorContext,\n};\nuse aws_smithy_runtime_api::client::interceptors::{dyn_dispatch_hint, Intercept};\nuse aws_smithy_runtime_api::client::retries::classifiers::{RetryAction, RetryReason};\nuse aws_smithy_runtime_api::client::retries::{RequestAttempts, RetryStrategy, ShouldAttempt};\nuse aws_smithy_runtime_api::client::runtime_components::RuntimeComponents;\nuse aws_smithy_types::config_bag::{ConfigBag, Layer, Storable, StoreReplace};\nuse aws_smithy_types::retry::{ErrorKind, RetryConfig, RetryMode};\n\nuse crate::client::retries::classifiers::run_classifiers_on_ctx;\nuse crate::client::retries::client_rate_limiter::{ClientRateLimiter, RequestReason};\nuse crate::client::retries::strategy::standard::ReleaseResult::{\n    APermitWasReleased, NoPermitWasReleased,\n};\nuse crate::client::retries::token_bucket::TokenBucket;\nuse crate::client::retries::{ClientRateLimiterPartition, RetryPartition, RetryPartitionInner};\nuse crate::static_partition_map::StaticPartitionMap;\n\nstatic CLIENT_RATE_LIMITER: StaticPartitionMap<ClientRateLimiterPartition, ClientRateLimiter> =\n    StaticPartitionMap::new();\n\n/// Used by token bucket interceptor to ensure a TokenBucket always exists in config bag\nstatic TOKEN_BUCKET: StaticPartitionMap<RetryPartition, TokenBucket> = StaticPartitionMap::new();\n\n/// Retry strategy with exponential backoff, max attempts, and a token bucket.\n#[derive(Debug, Default)]\npub struct StandardRetryStrategy {\n    retry_permit: Mutex<Option<OwnedSemaphorePermit>>,\n}\n\nimpl Storable for StandardRetryStrategy {\n    type Storer = StoreReplace<Self>;\n}\n\nimpl StandardRetryStrategy {\n    /// Create a new standard retry strategy with the given config.\n    pub fn new() -> Self {\n        Default::default()\n    }\n\n    fn release_retry_permit(&self, token_bucket: &TokenBucket) -> ReleaseResult {\n        let mut retry_permit = self.retry_permit.lock().unwrap();\n        match retry_permit.take() {\n            Some(p) => {\n                // Retry succeeded: reward success and forget permit if configured, otherwise release permit back\n                if token_bucket.success_reward() > 0.0 {\n                    token_bucket.reward_success();\n                    p.forget();\n                } else {\n                    drop(p); // Original behavior - release back to bucket\n                }\n                APermitWasReleased\n            }\n            None => {\n                // First-attempt success: reward success or regenerate token\n                if token_bucket.success_reward() > 0.0 {\n                    token_bucket.reward_success();\n                } else {\n                    token_bucket.regenerate_a_token();\n                }\n                NoPermitWasReleased\n            }\n        }\n    }\n\n    fn set_retry_permit(&self, new_retry_permit: OwnedSemaphorePermit) {\n        let mut old_retry_permit = self.retry_permit.lock().unwrap();\n        if let Some(p) = old_retry_permit.replace(new_retry_permit) {\n            // Whenever we set a new retry permit, and it replaces the old one, we need to \"forget\"\n            // the old permit, removing it from the bucket forever.\n            p.forget()\n        }\n    }\n\n    /// Returns a [`ClientRateLimiter`] if adaptive retry is configured.\n    fn adaptive_retry_rate_limiter(\n        runtime_components: &RuntimeComponents,\n        cfg: &ConfigBag,\n    ) -> Option<ClientRateLimiter> {\n        let retry_config = cfg.load::<RetryConfig>().expect(\"retry config is required\");\n        if retry_config.mode() == RetryMode::Adaptive {\n            if let Some(time_source) = runtime_components.time_source() {\n                let retry_partition = cfg.load::<RetryPartition>().expect(\"set in default config\");\n                let seconds_since_unix_epoch = time_source\n                    .now()\n                    .duration_since(SystemTime::UNIX_EPOCH)\n                    .expect(\"the present takes place after the UNIX_EPOCH\")\n                    .as_secs_f64();\n                let client_rate_limiter = match &retry_partition.inner {\n                    RetryPartitionInner::Default(_) => {\n                        let client_rate_limiter_partition =\n                            ClientRateLimiterPartition::new(retry_partition.clone());\n                        CLIENT_RATE_LIMITER.get_or_init(client_rate_limiter_partition, || {\n                            ClientRateLimiter::new(seconds_since_unix_epoch)\n                        })\n                    }\n                    RetryPartitionInner::Custom {\n                        client_rate_limiter,\n                        ..\n                    } => client_rate_limiter.clone(),\n                };\n                return Some(client_rate_limiter);\n            }\n        }\n        None\n    }\n\n    fn calculate_backoff(\n        &self,\n        runtime_components: &RuntimeComponents,\n        cfg: &ConfigBag,\n        retry_cfg: &RetryConfig,\n        retry_reason: &RetryAction,\n    ) -> Result<Duration, ShouldAttempt> {\n        let request_attempts = cfg\n            .load::<RequestAttempts>()\n            .expect(\"at least one request attempt is made before any retry is attempted\")\n            .attempts();\n\n        match retry_reason {\n            RetryAction::RetryIndicated(RetryReason::RetryableError { kind, retry_after }) => {\n                if let Some(delay) = *retry_after {\n                    let delay = delay.min(retry_cfg.max_backoff());\n                    debug!(\"explicit request from server to delay {delay:?} before retrying\");\n                    Ok(delay)\n                } else if let Some(delay) =\n                    check_rate_limiter_for_delay(runtime_components, cfg, *kind)\n                {\n                    let delay = delay.min(retry_cfg.max_backoff());\n                    debug!(\"rate limiter has requested a {delay:?} delay before retrying\");\n                    Ok(delay)\n                } else {\n                    let base = if retry_cfg.use_static_exponential_base() {\n                        1.0\n                    } else {\n                        fastrand::f64()\n                    };\n                    Ok(calculate_exponential_backoff(\n                        // Generate a random base multiplier to create jitter\n                        base,\n                        // Get the backoff time multiplier in seconds (with fractional seconds)\n                        retry_cfg.initial_backoff().as_secs_f64(),\n                        // `self.local.attempts` tracks number of requests made including the initial request\n                        // The initial attempt shouldn't count towards backoff calculations, so we subtract it\n                        request_attempts - 1,\n                        // Maximum backoff duration as a fallback to prevent overflow when calculating a power\n                        retry_cfg.max_backoff(),\n                    ))\n                }\n            }\n            RetryAction::RetryForbidden | RetryAction::NoActionIndicated => {\n                debug!(\n                    attempts = request_attempts,\n                    max_attempts = retry_cfg.max_attempts(),\n                    \"encountered un-retryable error\"\n                );\n                Err(ShouldAttempt::No)\n            }\n            _ => unreachable!(\"RetryAction is non-exhaustive\"),\n        }\n    }\n}\n\nenum ReleaseResult {\n    APermitWasReleased,\n    NoPermitWasReleased,\n}\n\nimpl RetryStrategy for StandardRetryStrategy {\n    fn should_attempt_initial_request(\n        &self,\n        runtime_components: &RuntimeComponents,\n        cfg: &ConfigBag,\n    ) -> Result<ShouldAttempt, BoxError> {\n        if let Some(crl) = Self::adaptive_retry_rate_limiter(runtime_components, cfg) {\n            let seconds_since_unix_epoch = get_seconds_since_unix_epoch(runtime_components);\n            if let Err(delay) = crl.acquire_permission_to_send_a_request(\n                seconds_since_unix_epoch,\n                RequestReason::InitialRequest,\n            ) {\n                return Ok(ShouldAttempt::YesAfterDelay(delay));\n            }\n        } else {\n            debug!(\"no client rate limiter configured, so no token is required for the initial request.\");\n        }\n\n        Ok(ShouldAttempt::Yes)\n    }\n\n    fn should_attempt_retry(\n        &self,\n        ctx: &InterceptorContext,\n        runtime_components: &RuntimeComponents,\n        cfg: &ConfigBag,\n    ) -> Result<ShouldAttempt, BoxError> {\n        let retry_cfg = cfg.load::<RetryConfig>().expect(\"retry config is required\");\n\n        // bookkeeping\n        let token_bucket = cfg.load::<TokenBucket>().expect(\"token bucket is required\");\n        // run the classifier against the context to determine if we should retry\n        let retry_classifiers = runtime_components.retry_classifiers();\n        let classifier_result = run_classifiers_on_ctx(retry_classifiers, ctx);\n\n        // (adaptive only): update fill rate\n        // NOTE: SEP indicates doing bookkeeping before asking if we should retry. We need to know if\n        // the error was a throttling error though to do adaptive retry bookkeeping so we take\n        // advantage of that information being available via the classifier result\n        let error_kind = error_kind(&classifier_result);\n        let is_throttling_error = error_kind\n            .map(|kind| kind == ErrorKind::ThrottlingError)\n            .unwrap_or(false);\n        update_rate_limiter_if_exists(runtime_components, cfg, is_throttling_error);\n\n        // on success release any retry quota held by previous attempts, reward success when indicated\n        if !ctx.is_failed() {\n            self.release_retry_permit(token_bucket);\n        }\n        // end bookkeeping\n\n        let request_attempts = cfg\n            .load::<RequestAttempts>()\n            .expect(\"at least one request attempt is made before any retry is attempted\")\n            .attempts();\n\n        // check if retry should be attempted\n        if !classifier_result.should_retry() {\n            debug!(\n                \"attempt #{request_attempts} classified as {:?}, not retrying\",\n                classifier_result\n            );\n            return Ok(ShouldAttempt::No);\n        }\n\n        // check if we're out of attempts\n        if request_attempts >= retry_cfg.max_attempts() {\n            debug!(\n                attempts = request_attempts,\n                max_attempts = retry_cfg.max_attempts(),\n                \"not retrying because we are out of attempts\"\n            );\n            return Ok(ShouldAttempt::No);\n        }\n\n        //  acquire permit for retry\n        let error_kind = error_kind.expect(\"result was classified retryable\");\n        match token_bucket.acquire(\n            &error_kind,\n            &runtime_components.time_source().unwrap_or_default(),\n        ) {\n            Some(permit) => self.set_retry_permit(permit),\n            None => {\n                debug!(\"attempt #{request_attempts} failed with {error_kind:?}; However, not enough retry quota is available for another attempt so no retry will be attempted.\");\n                return Ok(ShouldAttempt::No);\n            }\n        }\n\n        // calculate delay until next attempt\n        let backoff =\n            match self.calculate_backoff(runtime_components, cfg, retry_cfg, &classifier_result) {\n                Ok(value) => value,\n                // In some cases, backoff calculation will decide that we shouldn't retry at all.\n                Err(value) => return Ok(value),\n            };\n\n        debug!(\n            \"attempt #{request_attempts} failed with {:?}; retrying after {:?}\",\n            classifier_result, backoff\n        );\n        Ok(ShouldAttempt::YesAfterDelay(backoff))\n    }\n}\n\n/// extract the error kind from the classifier result if available\nfn error_kind(classifier_result: &RetryAction) -> Option<ErrorKind> {\n    match classifier_result {\n        RetryAction::RetryIndicated(RetryReason::RetryableError { kind, .. }) => Some(*kind),\n        _ => None,\n    }\n}\n\nfn update_rate_limiter_if_exists(\n    runtime_components: &RuntimeComponents,\n    cfg: &ConfigBag,\n    is_throttling_error: bool,\n) {\n    if let Some(crl) = StandardRetryStrategy::adaptive_retry_rate_limiter(runtime_components, cfg) {\n        let seconds_since_unix_epoch = get_seconds_since_unix_epoch(runtime_components);\n        crl.update_rate_limiter(seconds_since_unix_epoch, is_throttling_error);\n    }\n}\n\nfn check_rate_limiter_for_delay(\n    runtime_components: &RuntimeComponents,\n    cfg: &ConfigBag,\n    kind: ErrorKind,\n) -> Option<Duration> {\n    if let Some(crl) = StandardRetryStrategy::adaptive_retry_rate_limiter(runtime_components, cfg) {\n        let retry_reason = if kind == ErrorKind::ThrottlingError {\n            RequestReason::RetryTimeout\n        } else {\n            RequestReason::Retry\n        };\n        if let Err(delay) = crl.acquire_permission_to_send_a_request(\n            get_seconds_since_unix_epoch(runtime_components),\n            retry_reason,\n        ) {\n            return Some(delay);\n        }\n    }\n\n    None\n}\n\npub(super) fn calculate_exponential_backoff(\n    base: f64,\n    initial_backoff: f64,\n    retry_attempts: u32,\n    max_backoff: Duration,\n) -> Duration {\n    let result = match 2_u32\n        .checked_pow(retry_attempts)\n        .map(|power| (power as f64) * initial_backoff)\n    {\n        Some(backoff) => match Duration::try_from_secs_f64(backoff) {\n            Ok(result) => result.min(max_backoff),\n            Err(e) => {\n                tracing::warn!(\"falling back to {max_backoff:?} as `Duration` could not be created for exponential backoff: {e}\");\n                max_backoff\n            }\n        },\n        None => max_backoff,\n    };\n\n    // Apply jitter to `result`, and note that it can be applied to `max_backoff`.\n    // Won't panic because `base` is either in range 0..1 or a constant 1 in testing (if configured).\n    result.mul_f64(base)\n}\n\npub(super) fn get_seconds_since_unix_epoch(runtime_components: &RuntimeComponents) -> f64 {\n    let request_time = runtime_components\n        .time_source()\n        .expect(\"time source required for retries\");\n    request_time\n        .now()\n        .duration_since(SystemTime::UNIX_EPOCH)\n        .unwrap()\n        .as_secs_f64()\n}\n\n/// Interceptor registered in default retry plugin that ensures a token bucket exists in config\n/// bag for every operation. Token bucket provided is partitioned by the retry partition **in the\n/// config bag** at the time an operation is executed.\n#[derive(Debug)]\npub(crate) struct TokenBucketProvider {\n    default_partition: RetryPartition,\n    token_bucket: TokenBucket,\n}\n\nimpl TokenBucketProvider {\n    /// Create a new token bucket provider with the given default retry partition.\n    ///\n    /// NOTE: This partition should be the one used for every operation on a client\n    /// unless config is overridden.\n    pub(crate) fn new(default_partition: RetryPartition) -> Self {\n        let token_bucket = TOKEN_BUCKET.get_or_init_default(default_partition.clone());\n        Self {\n            default_partition,\n            token_bucket,\n        }\n    }\n}\n\n#[dyn_dispatch_hint]\nimpl Intercept for TokenBucketProvider {\n    fn name(&self) -> &'static str {\n        \"TokenBucketProvider\"\n    }\n\n    fn modify_before_retry_loop(\n        &self,\n        _context: &mut BeforeTransmitInterceptorContextMut<'_>,\n        _runtime_components: &RuntimeComponents,\n        cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        let retry_partition = cfg.load::<RetryPartition>().expect(\"set in default config\");\n\n        let tb = match &retry_partition.inner {\n            RetryPartitionInner::Default(name) => {\n                // we store the original retry partition configured and associated token bucket\n                // for the client when created so that we can avoid locking on _every_ request\n                // from _every_ client\n                if name == self.default_partition.name() {\n                    // avoid contention on the global lock\n                    self.token_bucket.clone()\n                } else {\n                    TOKEN_BUCKET.get_or_init_default(retry_partition.clone())\n                }\n            }\n            RetryPartitionInner::Custom { token_bucket, .. } => token_bucket.clone(),\n        };\n\n        trace!(\"token bucket for {retry_partition:?} added to config bag\");\n        let mut layer = Layer::new(\"token_bucket_partition\");\n        layer.store_put(tb);\n        cfg.push_layer(layer);\n        Ok(())\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    #[allow(unused_imports)] // will be unused with `--no-default-features --features client`\n    use std::fmt;\n    use std::sync::Mutex;\n    use std::time::Duration;\n\n    use aws_smithy_async::time::SystemTimeSource;\n    use aws_smithy_runtime_api::client::interceptors::context::{\n        Input, InterceptorContext, Output,\n    };\n    use aws_smithy_runtime_api::client::orchestrator::OrchestratorError;\n    use aws_smithy_runtime_api::client::retries::classifiers::{\n        ClassifyRetry, RetryAction, SharedRetryClassifier,\n    };\n    use aws_smithy_runtime_api::client::retries::{\n        AlwaysRetry, RequestAttempts, RetryStrategy, ShouldAttempt,\n    };\n    use aws_smithy_runtime_api::client::runtime_components::{\n        RuntimeComponents, RuntimeComponentsBuilder,\n    };\n    use aws_smithy_types::config_bag::{ConfigBag, Layer};\n    use aws_smithy_types::retry::{ErrorKind, RetryConfig};\n\n    use super::{calculate_exponential_backoff, StandardRetryStrategy};\n    use crate::client::retries::{ClientRateLimiter, RetryPartition, TokenBucket};\n\n    #[test]\n    fn no_retry_necessary_for_ok_result() {\n        let cfg = ConfigBag::of_layers(vec![{\n            let mut layer = Layer::new(\"test\");\n            layer.store_put(RetryConfig::standard());\n            layer.store_put(RequestAttempts::new(1));\n            layer.store_put(TokenBucket::default());\n            layer\n        }]);\n        let rc = RuntimeComponentsBuilder::for_tests().build().unwrap();\n        let mut ctx = InterceptorContext::new(Input::doesnt_matter());\n        let strategy = StandardRetryStrategy::default();\n        ctx.set_output_or_error(Ok(Output::doesnt_matter()));\n\n        let actual = strategy\n            .should_attempt_retry(&ctx, &rc, &cfg)\n            .expect(\"method is infallible for this use\");\n        assert_eq!(ShouldAttempt::No, actual);\n    }\n\n    fn set_up_cfg_and_context(\n        error_kind: ErrorKind,\n        current_request_attempts: u32,\n        retry_config: RetryConfig,\n    ) -> (InterceptorContext, RuntimeComponents, ConfigBag) {\n        let mut ctx = InterceptorContext::new(Input::doesnt_matter());\n        ctx.set_output_or_error(Err(OrchestratorError::other(\"doesn't matter\")));\n        let rc = RuntimeComponentsBuilder::for_tests()\n            .with_retry_classifier(SharedRetryClassifier::new(AlwaysRetry(error_kind)))\n            .build()\n            .unwrap();\n        let mut layer = Layer::new(\"test\");\n        layer.store_put(RequestAttempts::new(current_request_attempts));\n        layer.store_put(retry_config);\n        layer.store_put(TokenBucket::default());\n        let cfg = ConfigBag::of_layers(vec![layer]);\n\n        (ctx, rc, cfg)\n    }\n\n    // Test that error kinds produce the correct \"retry after X seconds\" output.\n    // All error kinds are handled in the same way for the standard strategy.\n    fn test_should_retry_error_kind(error_kind: ErrorKind) {\n        let (ctx, rc, cfg) = set_up_cfg_and_context(\n            error_kind,\n            3,\n            RetryConfig::standard()\n                .with_use_static_exponential_base(true)\n                .with_max_attempts(4),\n        );\n        let strategy = StandardRetryStrategy::new();\n        let actual = strategy\n            .should_attempt_retry(&ctx, &rc, &cfg)\n            .expect(\"method is infallible for this use\");\n        assert_eq!(ShouldAttempt::YesAfterDelay(Duration::from_secs(4)), actual);\n    }\n\n    #[test]\n    fn should_retry_transient_error_result_after_2s() {\n        test_should_retry_error_kind(ErrorKind::TransientError);\n    }\n\n    #[test]\n    fn should_retry_client_error_result_after_2s() {\n        test_should_retry_error_kind(ErrorKind::ClientError);\n    }\n\n    #[test]\n    fn should_retry_server_error_result_after_2s() {\n        test_should_retry_error_kind(ErrorKind::ServerError);\n    }\n\n    #[test]\n    fn should_retry_throttling_error_result_after_2s() {\n        test_should_retry_error_kind(ErrorKind::ThrottlingError);\n    }\n\n    #[test]\n    fn dont_retry_when_out_of_attempts() {\n        let current_attempts = 4;\n        let max_attempts = current_attempts;\n        let (ctx, rc, cfg) = set_up_cfg_and_context(\n            ErrorKind::TransientError,\n            current_attempts,\n            RetryConfig::standard()\n                .with_use_static_exponential_base(true)\n                .with_max_attempts(max_attempts),\n        );\n        let strategy = StandardRetryStrategy::new();\n        let actual = strategy\n            .should_attempt_retry(&ctx, &rc, &cfg)\n            .expect(\"method is infallible for this use\");\n        assert_eq!(ShouldAttempt::No, actual);\n    }\n\n    #[test]\n    fn should_not_panic_when_exponential_backoff_duration_could_not_be_created() {\n        let (ctx, rc, cfg) = set_up_cfg_and_context(\n            ErrorKind::TransientError,\n            // Greater than 32 when subtracted by 1 in `calculate_backoff`, causing overflow in `calculate_exponential_backoff`\n            33,\n            RetryConfig::standard()\n                .with_use_static_exponential_base(true)\n                .with_max_attempts(100), // Any value greater than 33 will do\n        );\n        let strategy = StandardRetryStrategy::new();\n        let actual = strategy\n            .should_attempt_retry(&ctx, &rc, &cfg)\n            .expect(\"method is infallible for this use\");\n        assert_eq!(ShouldAttempt::YesAfterDelay(MAX_BACKOFF), actual);\n    }\n\n    #[test]\n    fn should_yield_client_rate_limiter_from_custom_partition() {\n        let expected = ClientRateLimiter::builder().token_refill_rate(3.14).build();\n        let cfg = ConfigBag::of_layers(vec![\n            // Emulate default config layer overriden by a user config layer\n            {\n                let mut layer = Layer::new(\"default\");\n                layer.store_put(RetryPartition::new(\"default\"));\n                layer\n            },\n            {\n                let mut layer = Layer::new(\"user\");\n                layer.store_put(RetryConfig::adaptive());\n                layer.store_put(\n                    RetryPartition::custom(\"user\")\n                        .client_rate_limiter(expected.clone())\n                        .build(),\n                );\n                layer\n            },\n        ]);\n        let rc = RuntimeComponentsBuilder::for_tests()\n            .with_time_source(Some(SystemTimeSource::new()))\n            .build()\n            .unwrap();\n        let actual = StandardRetryStrategy::adaptive_retry_rate_limiter(&rc, &cfg)\n            .expect(\"should yield client rate limiter from custom partition\");\n        assert!(std::sync::Arc::ptr_eq(&expected.inner, &actual.inner));\n    }\n\n    #[allow(dead_code)] // will be unused with `--no-default-features --features client`\n    #[derive(Debug)]\n    struct PresetReasonRetryClassifier {\n        retry_actions: Mutex<Vec<RetryAction>>,\n    }\n\n    #[cfg(any(feature = \"test-util\", feature = \"legacy-test-util\"))]\n    impl PresetReasonRetryClassifier {\n        fn new(mut retry_reasons: Vec<RetryAction>) -> Self {\n            // We'll pop the retry_reasons in reverse order, so we reverse the list to fix that.\n            retry_reasons.reverse();\n            Self {\n                retry_actions: Mutex::new(retry_reasons),\n            }\n        }\n    }\n\n    impl ClassifyRetry for PresetReasonRetryClassifier {\n        fn classify_retry(&self, ctx: &InterceptorContext) -> RetryAction {\n            // Check for a result\n            let output_or_error = ctx.output_or_error();\n            // Check for an error\n            match output_or_error {\n                Some(Ok(_)) | None => return RetryAction::NoActionIndicated,\n                _ => (),\n            };\n\n            let mut retry_actions = self.retry_actions.lock().unwrap();\n            if retry_actions.len() == 1 {\n                retry_actions.first().unwrap().clone()\n            } else {\n                retry_actions.pop().unwrap()\n            }\n        }\n\n        fn name(&self) -> &'static str {\n            \"Always returns a preset retry reason\"\n        }\n    }\n\n    #[cfg(any(feature = \"test-util\", feature = \"legacy-test-util\"))]\n    fn setup_test(\n        retry_reasons: Vec<RetryAction>,\n        retry_config: RetryConfig,\n    ) -> (ConfigBag, RuntimeComponents, InterceptorContext) {\n        let rc = RuntimeComponentsBuilder::for_tests()\n            .with_retry_classifier(SharedRetryClassifier::new(\n                PresetReasonRetryClassifier::new(retry_reasons),\n            ))\n            .build()\n            .unwrap();\n        let mut layer = Layer::new(\"test\");\n        layer.store_put(retry_config);\n        let cfg = ConfigBag::of_layers(vec![layer]);\n        let mut ctx = InterceptorContext::new(Input::doesnt_matter());\n        // This type doesn't matter b/c the classifier will just return whatever we tell it to.\n        ctx.set_output_or_error(Err(OrchestratorError::other(\"doesn't matter\")));\n\n        (cfg, rc, ctx)\n    }\n\n    #[cfg(any(feature = \"test-util\", feature = \"legacy-test-util\"))]\n    #[test]\n    fn eventual_success() {\n        let (mut cfg, rc, mut ctx) = setup_test(\n            vec![RetryAction::server_error()],\n            RetryConfig::standard()\n                .with_use_static_exponential_base(true)\n                .with_max_attempts(5),\n        );\n        let strategy = StandardRetryStrategy::new();\n        cfg.interceptor_state().store_put(TokenBucket::default());\n        let token_bucket = cfg.load::<TokenBucket>().unwrap().clone();\n\n        cfg.interceptor_state().store_put(RequestAttempts::new(1));\n        let should_retry = strategy.should_attempt_retry(&ctx, &rc, &cfg).unwrap();\n        let dur = should_retry.expect_delay();\n        assert_eq!(dur, Duration::from_secs(1));\n        assert_eq!(token_bucket.available_permits(), 495);\n\n        cfg.interceptor_state().store_put(RequestAttempts::new(2));\n        let should_retry = strategy.should_attempt_retry(&ctx, &rc, &cfg).unwrap();\n        let dur = should_retry.expect_delay();\n        assert_eq!(dur, Duration::from_secs(2));\n        assert_eq!(token_bucket.available_permits(), 490);\n\n        ctx.set_output_or_error(Ok(Output::doesnt_matter()));\n\n        cfg.interceptor_state().store_put(RequestAttempts::new(3));\n        let no_retry = strategy.should_attempt_retry(&ctx, &rc, &cfg).unwrap();\n        assert_eq!(no_retry, ShouldAttempt::No);\n        assert_eq!(token_bucket.available_permits(), 495);\n    }\n\n    #[cfg(any(feature = \"test-util\", feature = \"legacy-test-util\"))]\n    #[test]\n    fn no_more_attempts() {\n        let (mut cfg, rc, ctx) = setup_test(\n            vec![RetryAction::server_error()],\n            RetryConfig::standard()\n                .with_use_static_exponential_base(true)\n                .with_max_attempts(3),\n        );\n        let strategy = StandardRetryStrategy::new();\n        cfg.interceptor_state().store_put(TokenBucket::default());\n        let token_bucket = cfg.load::<TokenBucket>().unwrap().clone();\n\n        cfg.interceptor_state().store_put(RequestAttempts::new(1));\n        let should_retry = strategy.should_attempt_retry(&ctx, &rc, &cfg).unwrap();\n        let dur = should_retry.expect_delay();\n        assert_eq!(dur, Duration::from_secs(1));\n        assert_eq!(token_bucket.available_permits(), 495);\n\n        cfg.interceptor_state().store_put(RequestAttempts::new(2));\n        let should_retry = strategy.should_attempt_retry(&ctx, &rc, &cfg).unwrap();\n        let dur = should_retry.expect_delay();\n        assert_eq!(dur, Duration::from_secs(2));\n        assert_eq!(token_bucket.available_permits(), 490);\n\n        cfg.interceptor_state().store_put(RequestAttempts::new(3));\n        let no_retry = strategy.should_attempt_retry(&ctx, &rc, &cfg).unwrap();\n        assert_eq!(no_retry, ShouldAttempt::No);\n        assert_eq!(token_bucket.available_permits(), 490);\n    }\n\n    #[cfg(any(feature = \"test-util\", feature = \"legacy-test-util\"))]\n    #[test]\n    fn successful_request_and_deser_should_be_retryable() {\n        #[derive(Clone, Copy, Debug)]\n        enum LongRunningOperationStatus {\n            Running,\n            Complete,\n        }\n\n        #[derive(Debug)]\n        struct LongRunningOperationOutput {\n            status: Option<LongRunningOperationStatus>,\n        }\n\n        impl LongRunningOperationOutput {\n            fn status(&self) -> Option<LongRunningOperationStatus> {\n                self.status\n            }\n        }\n\n        struct WaiterRetryClassifier {}\n\n        impl WaiterRetryClassifier {\n            fn new() -> Self {\n                WaiterRetryClassifier {}\n            }\n        }\n\n        impl fmt::Debug for WaiterRetryClassifier {\n            fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n                write!(f, \"WaiterRetryClassifier\")\n            }\n        }\n        impl ClassifyRetry for WaiterRetryClassifier {\n            fn classify_retry(&self, ctx: &InterceptorContext) -> RetryAction {\n                let status: Option<LongRunningOperationStatus> =\n                    ctx.output_or_error().and_then(|res| {\n                        res.ok().and_then(|output| {\n                            output\n                                .downcast_ref::<LongRunningOperationOutput>()\n                                .and_then(|output| output.status())\n                        })\n                    });\n\n                if let Some(LongRunningOperationStatus::Running) = status {\n                    return RetryAction::server_error();\n                };\n\n                RetryAction::NoActionIndicated\n            }\n\n            fn name(&self) -> &'static str {\n                \"waiter retry classifier\"\n            }\n        }\n\n        let retry_config = RetryConfig::standard()\n            .with_use_static_exponential_base(true)\n            .with_max_attempts(5);\n\n        let rc = RuntimeComponentsBuilder::for_tests()\n            .with_retry_classifier(SharedRetryClassifier::new(WaiterRetryClassifier::new()))\n            .build()\n            .unwrap();\n        let mut layer = Layer::new(\"test\");\n        layer.store_put(retry_config);\n        let mut cfg = ConfigBag::of_layers(vec![layer]);\n        let mut ctx = InterceptorContext::new(Input::doesnt_matter());\n        let strategy = StandardRetryStrategy::new();\n\n        ctx.set_output_or_error(Ok(Output::erase(LongRunningOperationOutput {\n            status: Some(LongRunningOperationStatus::Running),\n        })));\n\n        cfg.interceptor_state().store_put(TokenBucket::new(5));\n        let token_bucket = cfg.load::<TokenBucket>().unwrap().clone();\n\n        cfg.interceptor_state().store_put(RequestAttempts::new(1));\n        let should_retry = strategy.should_attempt_retry(&ctx, &rc, &cfg).unwrap();\n        let dur = should_retry.expect_delay();\n        assert_eq!(dur, Duration::from_secs(1));\n        assert_eq!(token_bucket.available_permits(), 0);\n\n        ctx.set_output_or_error(Ok(Output::erase(LongRunningOperationOutput {\n            status: Some(LongRunningOperationStatus::Complete),\n        })));\n        cfg.interceptor_state().store_put(RequestAttempts::new(2));\n        let should_retry = strategy.should_attempt_retry(&ctx, &rc, &cfg).unwrap();\n        should_retry.expect_no();\n        assert_eq!(token_bucket.available_permits(), 5);\n    }\n\n    #[cfg(any(feature = \"test-util\", feature = \"legacy-test-util\"))]\n    #[test]\n    fn no_quota() {\n        let (mut cfg, rc, ctx) = setup_test(\n            vec![RetryAction::server_error()],\n            RetryConfig::standard()\n                .with_use_static_exponential_base(true)\n                .with_max_attempts(5),\n        );\n        let strategy = StandardRetryStrategy::new();\n        cfg.interceptor_state().store_put(TokenBucket::new(5));\n        let token_bucket = cfg.load::<TokenBucket>().unwrap().clone();\n\n        cfg.interceptor_state().store_put(RequestAttempts::new(1));\n        let should_retry = strategy.should_attempt_retry(&ctx, &rc, &cfg).unwrap();\n        let dur = should_retry.expect_delay();\n        assert_eq!(dur, Duration::from_secs(1));\n        assert_eq!(token_bucket.available_permits(), 0);\n\n        cfg.interceptor_state().store_put(RequestAttempts::new(2));\n        let no_retry = strategy.should_attempt_retry(&ctx, &rc, &cfg).unwrap();\n        assert_eq!(no_retry, ShouldAttempt::No);\n        assert_eq!(token_bucket.available_permits(), 0);\n    }\n\n    #[cfg(any(feature = \"test-util\", feature = \"legacy-test-util\"))]\n    #[test]\n    fn quota_replenishes_on_success() {\n        let (mut cfg, rc, mut ctx) = setup_test(\n            vec![\n                RetryAction::transient_error(),\n                RetryAction::retryable_error_with_explicit_delay(\n                    ErrorKind::TransientError,\n                    Duration::from_secs(1),\n                ),\n            ],\n            RetryConfig::standard()\n                .with_use_static_exponential_base(true)\n                .with_max_attempts(5),\n        );\n        let strategy = StandardRetryStrategy::new();\n        cfg.interceptor_state().store_put(TokenBucket::new(100));\n        let token_bucket = cfg.load::<TokenBucket>().unwrap().clone();\n\n        cfg.interceptor_state().store_put(RequestAttempts::new(1));\n        let should_retry = strategy.should_attempt_retry(&ctx, &rc, &cfg).unwrap();\n        let dur = should_retry.expect_delay();\n        assert_eq!(dur, Duration::from_secs(1));\n        assert_eq!(token_bucket.available_permits(), 90);\n\n        cfg.interceptor_state().store_put(RequestAttempts::new(2));\n        let should_retry = strategy.should_attempt_retry(&ctx, &rc, &cfg).unwrap();\n        let dur = should_retry.expect_delay();\n        assert_eq!(dur, Duration::from_secs(1));\n        assert_eq!(token_bucket.available_permits(), 80);\n\n        ctx.set_output_or_error(Ok(Output::doesnt_matter()));\n\n        cfg.interceptor_state().store_put(RequestAttempts::new(3));\n        let no_retry = strategy.should_attempt_retry(&ctx, &rc, &cfg).unwrap();\n        assert_eq!(no_retry, ShouldAttempt::No);\n\n        assert_eq!(token_bucket.available_permits(), 90);\n    }\n\n    #[cfg(any(feature = \"test-util\", feature = \"legacy-test-util\"))]\n    #[test]\n    fn quota_replenishes_on_first_try_success() {\n        const PERMIT_COUNT: usize = 20;\n        let (mut cfg, rc, mut ctx) = setup_test(\n            vec![RetryAction::transient_error()],\n            RetryConfig::standard()\n                .with_use_static_exponential_base(true)\n                .with_max_attempts(u32::MAX),\n        );\n        let strategy = StandardRetryStrategy::new();\n        cfg.interceptor_state()\n            .store_put(TokenBucket::new(PERMIT_COUNT));\n        let token_bucket = cfg.load::<TokenBucket>().unwrap().clone();\n\n        let mut attempt = 1;\n\n        // Drain all available permits with failed attempts\n        while token_bucket.available_permits() > 0 {\n            // Draining should complete in 2 attempts\n            if attempt > 2 {\n                panic!(\"This test should have completed by now (drain)\");\n            }\n\n            cfg.interceptor_state()\n                .store_put(RequestAttempts::new(attempt));\n            let should_retry = strategy.should_attempt_retry(&ctx, &rc, &cfg).unwrap();\n            assert!(matches!(should_retry, ShouldAttempt::YesAfterDelay(_)));\n            attempt += 1;\n        }\n\n        // Forget the permit so that we can only refill by \"success on first try\".\n        let permit = strategy.retry_permit.lock().unwrap().take().unwrap();\n        permit.forget();\n\n        ctx.set_output_or_error(Ok(Output::doesnt_matter()));\n\n        // Replenish permits until we get back to `PERMIT_COUNT`\n        while token_bucket.available_permits() < PERMIT_COUNT {\n            if attempt > 23 {\n                panic!(\"This test should have completed by now (fill-up)\");\n            }\n\n            cfg.interceptor_state()\n                .store_put(RequestAttempts::new(attempt));\n            let no_retry = strategy.should_attempt_retry(&ctx, &rc, &cfg).unwrap();\n            assert_eq!(no_retry, ShouldAttempt::No);\n            attempt += 1;\n        }\n\n        assert_eq!(attempt, 23);\n        assert_eq!(token_bucket.available_permits(), PERMIT_COUNT);\n    }\n\n    #[cfg(any(feature = \"test-util\", feature = \"legacy-test-util\"))]\n    #[test]\n    fn backoff_timing() {\n        let (mut cfg, rc, ctx) = setup_test(\n            vec![RetryAction::server_error()],\n            RetryConfig::standard()\n                .with_use_static_exponential_base(true)\n                .with_max_attempts(5),\n        );\n        let strategy = StandardRetryStrategy::new();\n        cfg.interceptor_state().store_put(TokenBucket::default());\n        let token_bucket = cfg.load::<TokenBucket>().unwrap().clone();\n\n        cfg.interceptor_state().store_put(RequestAttempts::new(1));\n        let should_retry = strategy.should_attempt_retry(&ctx, &rc, &cfg).unwrap();\n        let dur = should_retry.expect_delay();\n        assert_eq!(dur, Duration::from_secs(1));\n        assert_eq!(token_bucket.available_permits(), 495);\n\n        cfg.interceptor_state().store_put(RequestAttempts::new(2));\n        let should_retry = strategy.should_attempt_retry(&ctx, &rc, &cfg).unwrap();\n        let dur = should_retry.expect_delay();\n        assert_eq!(dur, Duration::from_secs(2));\n        assert_eq!(token_bucket.available_permits(), 490);\n\n        cfg.interceptor_state().store_put(RequestAttempts::new(3));\n        let should_retry = strategy.should_attempt_retry(&ctx, &rc, &cfg).unwrap();\n        let dur = should_retry.expect_delay();\n        assert_eq!(dur, Duration::from_secs(4));\n        assert_eq!(token_bucket.available_permits(), 485);\n\n        cfg.interceptor_state().store_put(RequestAttempts::new(4));\n        let should_retry = strategy.should_attempt_retry(&ctx, &rc, &cfg).unwrap();\n        let dur = should_retry.expect_delay();\n        assert_eq!(dur, Duration::from_secs(8));\n        assert_eq!(token_bucket.available_permits(), 480);\n\n        cfg.interceptor_state().store_put(RequestAttempts::new(5));\n        let no_retry = strategy.should_attempt_retry(&ctx, &rc, &cfg).unwrap();\n        assert_eq!(no_retry, ShouldAttempt::No);\n        assert_eq!(token_bucket.available_permits(), 480);\n    }\n\n    #[cfg(any(feature = \"test-util\", feature = \"legacy-test-util\"))]\n    #[test]\n    fn max_backoff_time() {\n        let (mut cfg, rc, ctx) = setup_test(\n            vec![RetryAction::server_error()],\n            RetryConfig::standard()\n                .with_use_static_exponential_base(true)\n                .with_max_attempts(5)\n                .with_initial_backoff(Duration::from_secs(1))\n                .with_max_backoff(Duration::from_secs(3)),\n        );\n        let strategy = StandardRetryStrategy::new();\n        cfg.interceptor_state().store_put(TokenBucket::default());\n        let token_bucket = cfg.load::<TokenBucket>().unwrap().clone();\n\n        cfg.interceptor_state().store_put(RequestAttempts::new(1));\n        let should_retry = strategy.should_attempt_retry(&ctx, &rc, &cfg).unwrap();\n        let dur = should_retry.expect_delay();\n        assert_eq!(dur, Duration::from_secs(1));\n        assert_eq!(token_bucket.available_permits(), 495);\n\n        cfg.interceptor_state().store_put(RequestAttempts::new(2));\n        let should_retry = strategy.should_attempt_retry(&ctx, &rc, &cfg).unwrap();\n        let dur = should_retry.expect_delay();\n        assert_eq!(dur, Duration::from_secs(2));\n        assert_eq!(token_bucket.available_permits(), 490);\n\n        cfg.interceptor_state().store_put(RequestAttempts::new(3));\n        let should_retry = strategy.should_attempt_retry(&ctx, &rc, &cfg).unwrap();\n        let dur = should_retry.expect_delay();\n        assert_eq!(dur, Duration::from_secs(3));\n        assert_eq!(token_bucket.available_permits(), 485);\n\n        cfg.interceptor_state().store_put(RequestAttempts::new(4));\n        let should_retry = strategy.should_attempt_retry(&ctx, &rc, &cfg).unwrap();\n        let dur = should_retry.expect_delay();\n        assert_eq!(dur, Duration::from_secs(3));\n        assert_eq!(token_bucket.available_permits(), 480);\n\n        cfg.interceptor_state().store_put(RequestAttempts::new(5));\n        let no_retry = strategy.should_attempt_retry(&ctx, &rc, &cfg).unwrap();\n        assert_eq!(no_retry, ShouldAttempt::No);\n        assert_eq!(token_bucket.available_permits(), 480);\n    }\n\n    const MAX_BACKOFF: Duration = Duration::from_secs(20);\n\n    #[test]\n    fn calculate_exponential_backoff_where_initial_backoff_is_one() {\n        let initial_backoff = 1.0;\n\n        for (attempt, expected_backoff) in [initial_backoff, 2.0, 4.0].into_iter().enumerate() {\n            let actual_backoff =\n                calculate_exponential_backoff(1.0, initial_backoff, attempt as u32, MAX_BACKOFF);\n            assert_eq!(Duration::from_secs_f64(expected_backoff), actual_backoff);\n        }\n    }\n\n    #[test]\n    fn calculate_exponential_backoff_where_initial_backoff_is_greater_than_one() {\n        let initial_backoff = 3.0;\n\n        for (attempt, expected_backoff) in [initial_backoff, 6.0, 12.0].into_iter().enumerate() {\n            let actual_backoff =\n                calculate_exponential_backoff(1.0, initial_backoff, attempt as u32, MAX_BACKOFF);\n            assert_eq!(Duration::from_secs_f64(expected_backoff), actual_backoff);\n        }\n    }\n\n    #[test]\n    fn calculate_exponential_backoff_where_initial_backoff_is_less_than_one() {\n        let initial_backoff = 0.03;\n\n        for (attempt, expected_backoff) in [initial_backoff, 0.06, 0.12].into_iter().enumerate() {\n            let actual_backoff =\n                calculate_exponential_backoff(1.0, initial_backoff, attempt as u32, MAX_BACKOFF);\n            assert_eq!(Duration::from_secs_f64(expected_backoff), actual_backoff);\n        }\n    }\n\n    #[test]\n    fn calculate_backoff_overflow_should_gracefully_fallback_to_max_backoff() {\n        // avoid overflow for a silly large amount of retry attempts\n        assert_eq!(\n            MAX_BACKOFF,\n            calculate_exponential_backoff(1_f64, 10_f64, 100000, MAX_BACKOFF),\n        );\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime/src/client/retries/strategy.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nmod never;\npub(crate) mod standard;\n\npub use never::NeverRetryStrategy;\npub use standard::StandardRetryStrategy;\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime/src/client/retries/token_bucket.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_smithy_async::time::TimeSource;\nuse aws_smithy_types::config_bag::{Storable, StoreReplace};\nuse aws_smithy_types::retry::ErrorKind;\nuse std::fmt;\nuse std::sync::atomic::AtomicU32;\nuse std::sync::atomic::Ordering;\nuse std::sync::Arc;\nuse std::time::{Duration, SystemTime};\nuse tokio::sync::{OwnedSemaphorePermit, Semaphore};\n\nconst DEFAULT_CAPACITY: usize = 500;\n// On a 32 bit architecture, the value of Semaphore::MAX_PERMITS is 536,870,911.\n// Therefore, we will enforce a value lower than that to ensure behavior is\n// identical across platforms.\n// This also allows room for slight bucket overfill in the case where a bucket\n// is at maximum capacity and another thread drops a permit it was holding.\n/// The maximum number of permits a token bucket can have.\npub const MAXIMUM_CAPACITY: usize = 500_000_000;\nconst DEFAULT_RETRY_COST: u32 = 5;\nconst DEFAULT_RETRY_TIMEOUT_COST: u32 = DEFAULT_RETRY_COST * 2;\nconst PERMIT_REGENERATION_AMOUNT: usize = 1;\nconst DEFAULT_SUCCESS_REWARD: f32 = 0.0;\n\n/// Token bucket used for standard and adaptive retry.\n#[derive(Clone, Debug)]\npub struct TokenBucket {\n    semaphore: Arc<Semaphore>,\n    max_permits: usize,\n    timeout_retry_cost: u32,\n    retry_cost: u32,\n    success_reward: f32,\n    fractional_tokens: Arc<AtomicF32>,\n    refill_rate: f32,\n    // Note this value is only an AtomicU32 so it works on 32bit powerpc architectures.\n    // If we ever remove the need for that compatibility it should become an AtomicU64\n    last_refill_time_secs: Arc<AtomicU32>,\n}\n\nimpl std::panic::UnwindSafe for AtomicF32 {}\nimpl std::panic::RefUnwindSafe for AtomicF32 {}\nstruct AtomicF32 {\n    storage: AtomicU32,\n}\nimpl AtomicF32 {\n    fn new(value: f32) -> Self {\n        let as_u32 = value.to_bits();\n        Self {\n            storage: AtomicU32::new(as_u32),\n        }\n    }\n    fn store(&self, value: f32) {\n        let as_u32 = value.to_bits();\n        self.storage.store(as_u32, Ordering::Relaxed)\n    }\n    fn load(&self) -> f32 {\n        let as_u32 = self.storage.load(Ordering::Relaxed);\n        f32::from_bits(as_u32)\n    }\n}\n\nimpl fmt::Debug for AtomicF32 {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        // Use debug_struct, debug_tuple, or write! for formatting\n        f.debug_struct(\"AtomicF32\")\n            .field(\"value\", &self.load())\n            .finish()\n    }\n}\n\nimpl Clone for AtomicF32 {\n    fn clone(&self) -> Self {\n        // Manually clone each field\n        AtomicF32 {\n            storage: AtomicU32::new(self.storage.load(Ordering::Relaxed)),\n        }\n    }\n}\n\nimpl Storable for TokenBucket {\n    type Storer = StoreReplace<Self>;\n}\n\nimpl Default for TokenBucket {\n    fn default() -> Self {\n        Self {\n            semaphore: Arc::new(Semaphore::new(DEFAULT_CAPACITY)),\n            max_permits: DEFAULT_CAPACITY,\n            timeout_retry_cost: DEFAULT_RETRY_TIMEOUT_COST,\n            retry_cost: DEFAULT_RETRY_COST,\n            success_reward: DEFAULT_SUCCESS_REWARD,\n            fractional_tokens: Arc::new(AtomicF32::new(0.0)),\n            refill_rate: 0.0,\n            last_refill_time_secs: Arc::new(AtomicU32::new(0)),\n        }\n    }\n}\n\nimpl TokenBucket {\n    /// Creates a new `TokenBucket` with the given initial quota.\n    pub fn new(initial_quota: usize) -> Self {\n        Self {\n            semaphore: Arc::new(Semaphore::new(initial_quota)),\n            max_permits: initial_quota,\n            ..Default::default()\n        }\n    }\n\n    /// A token bucket with unlimited capacity that allows retries at no cost.\n    pub fn unlimited() -> Self {\n        Self {\n            semaphore: Arc::new(Semaphore::new(MAXIMUM_CAPACITY)),\n            max_permits: MAXIMUM_CAPACITY,\n            timeout_retry_cost: 0,\n            retry_cost: 0,\n            success_reward: 0.0,\n            fractional_tokens: Arc::new(AtomicF32::new(0.0)),\n            refill_rate: 0.0,\n            last_refill_time_secs: Arc::new(AtomicU32::new(0)),\n        }\n    }\n\n    /// Creates a builder for constructing a `TokenBucket`.\n    pub fn builder() -> TokenBucketBuilder {\n        TokenBucketBuilder::default()\n    }\n\n    pub(crate) fn acquire(\n        &self,\n        err: &ErrorKind,\n        time_source: &impl TimeSource,\n    ) -> Option<OwnedSemaphorePermit> {\n        // Add time-based tokens to fractional accumulator\n        self.refill_tokens_based_on_time(time_source);\n        // Convert accumulated fractional tokens to whole tokens\n        self.convert_fractional_tokens();\n\n        let retry_cost = if err == &ErrorKind::TransientError {\n            self.timeout_retry_cost\n        } else {\n            self.retry_cost\n        };\n\n        self.semaphore\n            .clone()\n            .try_acquire_many_owned(retry_cost)\n            .ok()\n    }\n\n    pub(crate) fn success_reward(&self) -> f32 {\n        self.success_reward\n    }\n\n    pub(crate) fn regenerate_a_token(&self) {\n        self.add_permits(PERMIT_REGENERATION_AMOUNT);\n    }\n\n    /// Converts accumulated fractional tokens to whole tokens and adds them as permits.\n    /// Stores the remaining fractional amount back.\n    /// This is shared by both time-based refill and success rewards.\n    #[inline]\n    fn convert_fractional_tokens(&self) {\n        let mut calc_fractional_tokens = self.fractional_tokens.load();\n        // Verify that fractional tokens have not become corrupted - if they have, reset to zero\n        if !calc_fractional_tokens.is_finite() {\n            tracing::error!(\n                \"Fractional tokens corrupted to: {}, resetting to 0.0\",\n                calc_fractional_tokens\n            );\n            self.fractional_tokens.store(0.0);\n            return;\n        }\n\n        let full_tokens_accumulated = calc_fractional_tokens.floor();\n        if full_tokens_accumulated >= 1.0 {\n            self.add_permits(full_tokens_accumulated as usize);\n            calc_fractional_tokens -= full_tokens_accumulated;\n        }\n        // Always store the updated fractional tokens back, even if no conversion happened\n        self.fractional_tokens.store(calc_fractional_tokens);\n    }\n\n    /// Refills tokens based on elapsed time since last refill.\n    /// This method implements lazy evaluation - tokens are only calculated when accessed.\n    /// Uses a single compare-and-swap to ensure only one thread processes each time window.\n    #[inline]\n    fn refill_tokens_based_on_time(&self, time_source: &impl TimeSource) {\n        if self.refill_rate > 0.0 {\n            // The cast to u32 here is safe until 2106, and I will be long dead then so ¯\\_(ツ)_/¯\n            let current_time_secs = time_source\n                .now()\n                .duration_since(SystemTime::UNIX_EPOCH)\n                .unwrap_or(Duration::ZERO)\n                .as_secs() as u32;\n\n            let last_refill_secs = self.last_refill_time_secs.load(Ordering::Relaxed);\n\n            // Early exit if no time elapsed - most threads take this path\n            if current_time_secs == last_refill_secs {\n                return;\n            }\n\n            // Try to atomically claim this time window with a single CAS\n            // If we lose, another thread is handling the refill, so we can exit\n            if self\n                .last_refill_time_secs\n                .compare_exchange(\n                    last_refill_secs,\n                    current_time_secs,\n                    Ordering::Relaxed,\n                    Ordering::Relaxed,\n                )\n                .is_err()\n            {\n                // Another thread claimed this time window, we're done\n                return;\n            }\n\n            // We won the CAS - we're responsible for adding tokens for this time window\n            let current_fractional = self.fractional_tokens.load();\n            let max_fractional = self.max_permits as f32;\n\n            // Skip token addition if already at cap\n            if current_fractional >= max_fractional {\n                return;\n            }\n\n            let elapsed_secs = current_time_secs.saturating_sub(last_refill_secs);\n            let tokens_to_add = elapsed_secs as f32 * self.refill_rate;\n\n            // Add tokens to fractional accumulator, capping at max_permits to prevent unbounded growth\n            let new_fractional = (current_fractional + tokens_to_add).min(max_fractional);\n            self.fractional_tokens.store(new_fractional);\n        }\n    }\n\n    #[inline]\n    pub(crate) fn reward_success(&self) {\n        if self.success_reward > 0.0 {\n            let current = self.fractional_tokens.load();\n            let max_fractional = self.max_permits as f32;\n            // Early exit if already at cap - no point calculating\n            if current >= max_fractional {\n                return;\n            }\n            // Cap fractional tokens at max_permits to prevent unbounded growth\n            let new_fractional = (current + self.success_reward).min(max_fractional);\n            self.fractional_tokens.store(new_fractional);\n        }\n    }\n\n    pub(crate) fn add_permits(&self, amount: usize) {\n        let available = self.semaphore.available_permits();\n        if available >= self.max_permits {\n            return;\n        }\n        self.semaphore\n            .add_permits(amount.min(self.max_permits - available));\n    }\n\n    /// Returns true if the token bucket is full, false otherwise\n    pub fn is_full(&self) -> bool {\n        self.convert_fractional_tokens();\n        self.semaphore.available_permits() >= self.max_permits\n    }\n\n    /// Returns true if the token bucket is empty, false otherwise\n    pub fn is_empty(&self) -> bool {\n        self.convert_fractional_tokens();\n        self.semaphore.available_permits() == 0\n    }\n\n    #[allow(dead_code)] // only used in tests\n    #[cfg(any(test, feature = \"test-util\", feature = \"legacy-test-util\"))]\n    pub(crate) fn available_permits(&self) -> usize {\n        self.semaphore.available_permits()\n    }\n\n    /// Only used in tests\n    #[allow(dead_code)]\n    #[doc(hidden)]\n    #[cfg(any(test, feature = \"test-util\", feature = \"legacy-test-util\"))]\n    pub fn last_refill_time_secs(&self) -> Arc<AtomicU32> {\n        self.last_refill_time_secs.clone()\n    }\n}\n\n/// Builder for constructing a `TokenBucket`.\n#[derive(Clone, Debug, Default)]\npub struct TokenBucketBuilder {\n    capacity: Option<usize>,\n    retry_cost: Option<u32>,\n    timeout_retry_cost: Option<u32>,\n    success_reward: Option<f32>,\n    refill_rate: Option<f32>,\n}\n\nimpl TokenBucketBuilder {\n    /// Creates a new `TokenBucketBuilder` with default values.\n    pub fn new() -> Self {\n        Self::default()\n    }\n\n    /// Sets the maximum bucket capacity for the builder.\n    pub fn capacity(mut self, mut capacity: usize) -> Self {\n        if capacity > MAXIMUM_CAPACITY {\n            capacity = MAXIMUM_CAPACITY;\n        }\n        self.capacity = Some(capacity);\n        self\n    }\n\n    /// Sets the specified retry cost for the builder.\n    pub fn retry_cost(mut self, retry_cost: u32) -> Self {\n        self.retry_cost = Some(retry_cost);\n        self\n    }\n\n    /// Sets the specified timeout retry cost for the builder.\n    pub fn timeout_retry_cost(mut self, timeout_retry_cost: u32) -> Self {\n        self.timeout_retry_cost = Some(timeout_retry_cost);\n        self\n    }\n\n    /// Sets the reward for any successful request for the builder.\n    pub fn success_reward(mut self, reward: f32) -> Self {\n        self.success_reward = Some(reward);\n        self\n    }\n\n    /// Sets the refill rate (tokens per second) for time-based token regeneration.\n    ///\n    /// Negative values are clamped to 0.0. A refill rate of 0.0 disables time-based regeneration.\n    /// Non-finite values (NaN, infinity) are treated as 0.0.\n    pub fn refill_rate(mut self, rate: f32) -> Self {\n        let validated_rate = if rate.is_finite() { rate.max(0.0) } else { 0.0 };\n        self.refill_rate = Some(validated_rate);\n        self\n    }\n\n    /// Builds a `TokenBucket`.\n    pub fn build(self) -> TokenBucket {\n        TokenBucket {\n            semaphore: Arc::new(Semaphore::new(self.capacity.unwrap_or(DEFAULT_CAPACITY))),\n            max_permits: self.capacity.unwrap_or(DEFAULT_CAPACITY),\n            retry_cost: self.retry_cost.unwrap_or(DEFAULT_RETRY_COST),\n            timeout_retry_cost: self\n                .timeout_retry_cost\n                .unwrap_or(DEFAULT_RETRY_TIMEOUT_COST),\n            success_reward: self.success_reward.unwrap_or(DEFAULT_SUCCESS_REWARD),\n            fractional_tokens: Arc::new(AtomicF32::new(0.0)),\n            refill_rate: self.refill_rate.unwrap_or(0.0),\n            last_refill_time_secs: Arc::new(AtomicU32::new(0)),\n        }\n    }\n}\n\n#[cfg(test)]\nmod tests {\n\n    use super::*;\n    use aws_smithy_async::test_util::ManualTimeSource;\n    use std::{sync::LazyLock, time::UNIX_EPOCH};\n\n    static TIME_SOURCE: LazyLock<ManualTimeSource> =\n        LazyLock::new(|| ManualTimeSource::new(UNIX_EPOCH + Duration::from_secs(12344321)));\n\n    #[test]\n    fn test_unlimited_token_bucket() {\n        let bucket = TokenBucket::unlimited();\n\n        // Should always acquire permits regardless of error type\n        assert!(bucket\n            .acquire(&ErrorKind::ThrottlingError, &*TIME_SOURCE)\n            .is_some());\n        assert!(bucket\n            .acquire(&ErrorKind::TransientError, &*TIME_SOURCE)\n            .is_some());\n\n        // Should have maximum capacity\n        assert_eq!(bucket.max_permits, MAXIMUM_CAPACITY);\n\n        // Should have zero retry costs\n        assert_eq!(bucket.retry_cost, 0);\n        assert_eq!(bucket.timeout_retry_cost, 0);\n\n        // The loop count is arbitrary; should obtain permits without limit\n        let mut permits = Vec::new();\n        for _ in 0..100 {\n            let permit = bucket.acquire(&ErrorKind::ThrottlingError, &*TIME_SOURCE);\n            assert!(permit.is_some());\n            permits.push(permit);\n            // Available permits should stay constant\n            assert_eq!(MAXIMUM_CAPACITY, bucket.semaphore.available_permits());\n        }\n    }\n\n    #[test]\n    fn test_bounded_permits_exhaustion() {\n        let bucket = TokenBucket::new(10);\n        let mut permits = Vec::new();\n\n        for _ in 0..100 {\n            let permit = bucket.acquire(&ErrorKind::ThrottlingError, &*TIME_SOURCE);\n            if let Some(p) = permit {\n                permits.push(p);\n            } else {\n                break;\n            }\n        }\n\n        assert_eq!(permits.len(), 2); // 10 capacity / 5 retry cost = 2 permits\n\n        // Verify next acquisition fails\n        assert!(bucket\n            .acquire(&ErrorKind::ThrottlingError, &*TIME_SOURCE)\n            .is_none());\n    }\n\n    #[test]\n    fn test_fractional_tokens_accumulate_and_convert() {\n        let bucket = TokenBucket::builder()\n            .capacity(10)\n            .success_reward(0.4)\n            .build();\n\n        // acquire 10 tokens to bring capacity below max so we can test accumulation\n        let _hold_permit = bucket.acquire(&ErrorKind::TransientError, &*TIME_SOURCE);\n        assert_eq!(bucket.semaphore.available_permits(), 0);\n\n        // First success: 0.4 fractional tokens\n        bucket.reward_success();\n        bucket.convert_fractional_tokens();\n        assert_eq!(bucket.semaphore.available_permits(), 0);\n\n        // Second success: 0.8 fractional tokens\n        bucket.reward_success();\n        bucket.convert_fractional_tokens();\n        assert_eq!(bucket.semaphore.available_permits(), 0);\n\n        // Third success: 1.2 fractional tokens -> 1 full token added\n        bucket.reward_success();\n        bucket.convert_fractional_tokens();\n        assert_eq!(bucket.semaphore.available_permits(), 1);\n    }\n\n    #[test]\n    fn test_fractional_tokens_respect_max_capacity() {\n        let bucket = TokenBucket::builder()\n            .capacity(10)\n            .success_reward(2.0)\n            .build();\n\n        for _ in 0..20 {\n            bucket.reward_success();\n        }\n\n        assert!(bucket.semaphore.available_permits() == 10);\n    }\n\n    #[test]\n    fn test_convert_fractional_tokens() {\n        // (input, expected_permits_added, expected_remaining)\n        let test_cases = [\n            (0.7, 0, 0.7),\n            (1.0, 1, 0.0),\n            (2.3, 2, 0.3),\n            (5.8, 5, 0.8),\n            (10.0, 10, 0.0),\n            // verify that if fractional permits are corrupted, we reset to 0 gracefully\n            (f32::NAN, 0, 0.0),\n            (f32::INFINITY, 0, 0.0),\n        ];\n\n        for (input, expected_permits, expected_remaining) in test_cases {\n            let bucket = TokenBucket::builder().capacity(10).build();\n            let _hold_permit = bucket.acquire(&ErrorKind::TransientError, &*TIME_SOURCE);\n            let initial = bucket.semaphore.available_permits();\n\n            bucket.fractional_tokens.store(input);\n            bucket.convert_fractional_tokens();\n\n            assert_eq!(\n                bucket.semaphore.available_permits() - initial,\n                expected_permits\n            );\n            assert!((bucket.fractional_tokens.load() - expected_remaining).abs() < 0.0001);\n        }\n    }\n\n    #[cfg(any(feature = \"test-util\", feature = \"legacy-test-util\"))]\n    #[test]\n    fn test_builder_with_custom_values() {\n        let bucket = TokenBucket::builder()\n            .capacity(100)\n            .retry_cost(10)\n            .timeout_retry_cost(20)\n            .success_reward(0.5)\n            .refill_rate(2.5)\n            .build();\n\n        assert_eq!(bucket.max_permits, 100);\n        assert_eq!(bucket.retry_cost, 10);\n        assert_eq!(bucket.timeout_retry_cost, 20);\n        assert_eq!(bucket.success_reward, 0.5);\n        assert_eq!(bucket.refill_rate, 2.5);\n    }\n\n    #[test]\n    fn test_builder_refill_rate_validation() {\n        // Test negative values are clamped to 0.0\n        let bucket = TokenBucket::builder().refill_rate(-5.0).build();\n        assert_eq!(bucket.refill_rate, 0.0);\n\n        // Test valid positive value\n        let bucket = TokenBucket::builder().refill_rate(1.5).build();\n        assert_eq!(bucket.refill_rate, 1.5);\n\n        // Test zero is valid\n        let bucket = TokenBucket::builder().refill_rate(0.0).build();\n        assert_eq!(bucket.refill_rate, 0.0);\n    }\n\n    #[cfg(any(feature = \"test-util\", feature = \"legacy-test-util\"))]\n    #[test]\n    fn test_builder_custom_time_source() {\n        use aws_smithy_async::test_util::ManualTimeSource;\n        use std::time::UNIX_EPOCH;\n\n        // Test that TokenBucket uses provided TimeSource when specified via builder\n        let manual_time = ManualTimeSource::new(UNIX_EPOCH);\n        let bucket = TokenBucket::builder()\n            .capacity(100)\n            .refill_rate(1.0)\n            .build();\n\n        // Consume all tokens to test refill from empty state\n        let _permits = bucket.semaphore.try_acquire_many(100).unwrap();\n        assert_eq!(bucket.available_permits(), 0);\n\n        // Advance time and verify tokens are added based on manual time\n        manual_time.advance(Duration::from_secs(5));\n\n        bucket.refill_tokens_based_on_time(&manual_time);\n        bucket.convert_fractional_tokens();\n\n        // Should have 5 tokens (5 seconds * 1 token/sec)\n        assert_eq!(bucket.available_permits(), 5);\n    }\n\n    #[test]\n    fn test_atomicf32_f32_to_bits_conversion_correctness() {\n        // This is the core functionality\n        let test_values = vec![\n            0.0,\n            -0.0,\n            1.0,\n            -1.0,\n            f32::INFINITY,\n            f32::NEG_INFINITY,\n            f32::NAN,\n            f32::MIN,\n            f32::MAX,\n            f32::MIN_POSITIVE,\n            f32::EPSILON,\n            std::f32::consts::PI,\n            std::f32::consts::E,\n            // Test values that could expose bit manipulation bugs\n            1.23456789e-38, // Very small normal number\n            1.23456789e38,  // Very large number (within f32 range)\n            1.1754944e-38,  // Near MIN_POSITIVE for f32\n        ];\n\n        for &expected in &test_values {\n            let atomic = AtomicF32::new(expected);\n            let actual = atomic.load();\n\n            // For NaN, we can't use == but must check bit patterns\n            if expected.is_nan() {\n                assert!(actual.is_nan(), \"Expected NaN, got {}\", actual);\n                // Different NaN bit patterns should be preserved exactly\n                assert_eq!(expected.to_bits(), actual.to_bits());\n            } else {\n                assert_eq!(expected.to_bits(), actual.to_bits());\n            }\n        }\n    }\n\n    #[cfg(any(feature = \"test-util\", feature = \"legacy-test-util\"))]\n    #[test]\n    fn test_atomicf32_store_load_preserves_exact_bits() {\n        let atomic = AtomicF32::new(0.0);\n\n        // Test that store/load cycle preserves EXACT bit patterns\n        // This would catch bugs in the to_bits/from_bits conversion\n        let critical_bit_patterns = vec![\n            0x00000000u32, // +0.0\n            0x80000000u32, // -0.0\n            0x7F800000u32, // +infinity\n            0xFF800000u32, // -infinity\n            0x7FC00000u32, // Quiet NaN\n            0x7FA00000u32, // Signaling NaN\n            0x00000001u32, // Smallest positive subnormal\n            0x007FFFFFu32, // Largest subnormal\n            0x00800000u32, // Smallest positive normal (MIN_POSITIVE)\n        ];\n\n        for &expected_bits in &critical_bit_patterns {\n            let expected_f32 = f32::from_bits(expected_bits);\n            atomic.store(expected_f32);\n            let loaded_f32 = atomic.load();\n            let actual_bits = loaded_f32.to_bits();\n\n            assert_eq!(expected_bits, actual_bits);\n        }\n    }\n\n    #[cfg(any(feature = \"test-util\", feature = \"legacy-test-util\"))]\n    #[test]\n    fn test_atomicf32_concurrent_store_load_safety() {\n        use std::sync::Arc;\n        use std::thread;\n\n        let atomic = Arc::new(AtomicF32::new(0.0));\n        let test_values = vec![1.0, 2.0, 3.0, 4.0, 5.0];\n        let mut handles = Vec::new();\n\n        // Start multiple threads that continuously write different values\n        for &value in &test_values {\n            let atomic_clone = Arc::clone(&atomic);\n            let handle = thread::spawn(move || {\n                for _ in 0..1000 {\n                    atomic_clone.store(value);\n                }\n            });\n            handles.push(handle);\n        }\n\n        // Start a reader thread that continuously reads\n        let atomic_reader = Arc::clone(&atomic);\n        let reader_handle = thread::spawn(move || {\n            let mut readings = Vec::new();\n            for _ in 0..5000 {\n                let value = atomic_reader.load();\n                readings.push(value);\n            }\n            readings\n        });\n\n        // Wait for all writers to complete\n        for handle in handles {\n            handle.join().expect(\"Writer thread panicked\");\n        }\n\n        let readings = reader_handle.join().expect(\"Reader thread panicked\");\n\n        // Verify that all read values are valid (one of the written values)\n        // This tests that there's no data corruption from concurrent access\n        for &reading in &readings {\n            assert!(test_values.contains(&reading) || reading == 0.0);\n\n            // More importantly, verify the reading is a valid f32\n            // (not corrupted bits that happen to parse as valid)\n            assert!(\n                reading.is_finite() || reading == 0.0,\n                \"Corrupted reading detected\"\n            );\n        }\n    }\n\n    #[cfg(any(feature = \"test-util\", feature = \"legacy-test-util\"))]\n    #[test]\n    fn test_atomicf32_stress_concurrent_access() {\n        use std::sync::{Arc, Barrier};\n        use std::thread;\n\n        let expected_values = [0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0];\n        let atomic = Arc::new(AtomicF32::new(0.0));\n        let barrier = Arc::new(Barrier::new(10)); // Synchronize all threads\n        let mut handles = Vec::new();\n\n        // Launch threads that all start simultaneously\n        for i in 0..10 {\n            let atomic_clone = Arc::clone(&atomic);\n            let barrier_clone = Arc::clone(&barrier);\n            let handle = thread::spawn(move || {\n                barrier_clone.wait(); // All threads start at same time\n\n                // Tight loop increases chance of race conditions\n                for _ in 0..10000 {\n                    let value = i as f32;\n                    atomic_clone.store(value);\n                    let loaded = atomic_clone.load();\n                    // Verify no corruption occurred\n                    assert!(loaded >= 0.0 && loaded <= 9.0);\n                    assert!(\n                        expected_values.contains(&loaded),\n                        \"Got unexpected value: {}, expected one of {:?}\",\n                        loaded,\n                        expected_values\n                    );\n                }\n            });\n            handles.push(handle);\n        }\n\n        for handle in handles {\n            handle.join().unwrap();\n        }\n    }\n\n    #[test]\n    fn test_atomicf32_integration_with_token_bucket_usage() {\n        let atomic = AtomicF32::new(0.0);\n        let success_reward = 0.3;\n        let iterations = 5;\n\n        // Accumulate fractional tokens\n        for _ in 1..=iterations {\n            let current = atomic.load();\n            atomic.store(current + success_reward);\n        }\n\n        let accumulated = atomic.load();\n        let expected_total = iterations as f32 * success_reward; // 1.5\n\n        // Test the floor() operation pattern\n        let full_tokens = accumulated.floor();\n        atomic.store(accumulated - full_tokens);\n        let remaining = atomic.load();\n\n        // These assertions should be general:\n        assert_eq!(full_tokens, expected_total.floor()); // Could be 1.0, 2.0, 3.0, etc.\n        assert!(remaining >= 0.0 && remaining < 1.0);\n        assert_eq!(remaining, expected_total - expected_total.floor());\n    }\n\n    #[cfg(any(feature = \"test-util\", feature = \"legacy-test-util\"))]\n    #[test]\n    fn test_atomicf32_clone_creates_independent_copy() {\n        let original = AtomicF32::new(123.456);\n        let cloned = original.clone();\n\n        // Verify they start with the same value\n        assert_eq!(original.load(), cloned.load());\n\n        // Verify they're independent - modifying one doesn't affect the other\n        original.store(999.0);\n        assert_eq!(\n            cloned.load(),\n            123.456,\n            \"Clone should be unaffected by original changes\"\n        );\n        assert_eq!(original.load(), 999.0, \"Original should have new value\");\n    }\n\n    #[test]\n    fn test_combined_time_and_success_rewards() {\n        use aws_smithy_async::test_util::ManualTimeSource;\n        use std::time::UNIX_EPOCH;\n\n        let time_source = ManualTimeSource::new(UNIX_EPOCH);\n        let current_time_secs = UNIX_EPOCH\n            .duration_since(SystemTime::UNIX_EPOCH)\n            .unwrap()\n            .as_secs() as u32;\n\n        let bucket = TokenBucket {\n            refill_rate: 1.0,\n            success_reward: 0.5,\n            last_refill_time_secs: Arc::new(AtomicU32::new(current_time_secs)),\n            semaphore: Arc::new(Semaphore::new(0)),\n            max_permits: 100,\n            ..Default::default()\n        };\n\n        // Add success rewards: 2 * 0.5 = 1.0 token\n        bucket.reward_success();\n        bucket.reward_success();\n\n        // Advance time by 2 seconds\n        time_source.advance(Duration::from_secs(2));\n\n        // Trigger time-based refill: 2 sec * 1.0 = 2.0 tokens\n        // Total: 1.0 + 2.0 = 3.0 tokens\n        bucket.refill_tokens_based_on_time(&time_source);\n        bucket.convert_fractional_tokens();\n\n        assert_eq!(bucket.available_permits(), 3);\n        assert!(bucket.fractional_tokens.load().abs() < 0.0001);\n    }\n\n    #[test]\n    fn test_refill_rates() {\n        use aws_smithy_async::test_util::ManualTimeSource;\n        use std::time::UNIX_EPOCH;\n        // (refill_rate, elapsed_secs, expected_permits, expected_fractional)\n        let test_cases = [\n            (10.0, 2, 20, 0.0),      // Basic: 2 sec * 10 tokens/sec = 20 tokens\n            (0.001, 1100, 1, 0.1),   // Small: 1100 * 0.001 = 1.1 tokens\n            (0.0001, 11000, 1, 0.1), // Tiny: 11000 * 0.0001 = 1.1 tokens\n            (0.001, 1200, 1, 0.2),   // 1200 * 0.001 = 1.2 tokens\n            (0.0001, 10000, 1, 0.0), // 10000 * 0.0001 = 1.0 tokens\n            (0.001, 500, 0, 0.5),    // Fractional only: 500 * 0.001 = 0.5 tokens\n        ];\n\n        for (refill_rate, elapsed_secs, expected_permits, expected_fractional) in test_cases {\n            let time_source = ManualTimeSource::new(UNIX_EPOCH);\n            let current_time_secs = UNIX_EPOCH\n                .duration_since(SystemTime::UNIX_EPOCH)\n                .unwrap()\n                .as_secs() as u32;\n\n            let bucket = TokenBucket {\n                refill_rate,\n                last_refill_time_secs: Arc::new(AtomicU32::new(current_time_secs)),\n                semaphore: Arc::new(Semaphore::new(0)),\n                max_permits: 100,\n                ..Default::default()\n            };\n\n            // Advance time by the specified duration\n            time_source.advance(Duration::from_secs(elapsed_secs));\n\n            bucket.refill_tokens_based_on_time(&time_source);\n            bucket.convert_fractional_tokens();\n\n            assert_eq!(\n                bucket.available_permits(),\n                expected_permits,\n                \"Rate {}: After {}s expected {} permits\",\n                refill_rate,\n                elapsed_secs,\n                expected_permits\n            );\n            assert!(\n                (bucket.fractional_tokens.load() - expected_fractional).abs() < 0.0001,\n                \"Rate {}: After {}s expected {} fractional, got {}\",\n                refill_rate,\n                elapsed_secs,\n                expected_fractional,\n                bucket.fractional_tokens.load()\n            );\n        }\n    }\n\n    #[cfg(any(feature = \"test-util\", feature = \"legacy-test-util\"))]\n    #[test]\n    fn test_rewards_capped_at_max_capacity() {\n        use aws_smithy_async::test_util::ManualTimeSource;\n        use std::time::UNIX_EPOCH;\n\n        let time_source = ManualTimeSource::new(UNIX_EPOCH);\n        let current_time_secs = UNIX_EPOCH\n            .duration_since(SystemTime::UNIX_EPOCH)\n            .unwrap()\n            .as_secs() as u32;\n\n        let bucket = TokenBucket {\n            refill_rate: 50.0,\n            success_reward: 2.0,\n            last_refill_time_secs: Arc::new(AtomicU32::new(current_time_secs)),\n            semaphore: Arc::new(Semaphore::new(5)),\n            max_permits: 10,\n            ..Default::default()\n        };\n\n        // Add success rewards: 50 * 2.0 = 100 tokens (without cap)\n        for _ in 0..50 {\n            bucket.reward_success();\n        }\n\n        // Fractional tokens capped at 10 from success rewards\n        assert_eq!(bucket.fractional_tokens.load(), 10.0);\n\n        // Advance time by 100 seconds\n        time_source.advance(Duration::from_secs(100));\n\n        // Time-based refill: 100 * 50 = 5000 tokens (without cap)\n        // But fractional is already at 10, so it stays at 10\n        bucket.refill_tokens_based_on_time(&time_source);\n\n        // Fractional tokens should be capped at max_permits (10)\n        assert_eq!(\n            bucket.fractional_tokens.load(),\n            10.0,\n            \"Fractional tokens should be capped at max_permits\"\n        );\n        // Convert should add 5 tokens (bucket at 5, can add 5 more to reach max 10)\n        bucket.convert_fractional_tokens();\n        assert_eq!(bucket.available_permits(), 10);\n    }\n\n    #[cfg(any(feature = \"test-util\", feature = \"legacy-test-util\"))]\n    #[test]\n    fn test_concurrent_time_based_refill_no_over_generation() {\n        use aws_smithy_async::test_util::ManualTimeSource;\n        use std::sync::{Arc, Barrier};\n        use std::thread;\n        use std::time::UNIX_EPOCH;\n\n        let time_source = ManualTimeSource::new(UNIX_EPOCH);\n        let current_time_secs = UNIX_EPOCH\n            .duration_since(SystemTime::UNIX_EPOCH)\n            .unwrap()\n            .as_secs() as u32;\n\n        // Create bucket with 1 token/sec refill\n        let bucket = Arc::new(TokenBucket {\n            refill_rate: 1.0,\n            last_refill_time_secs: Arc::new(AtomicU32::new(current_time_secs)),\n            semaphore: Arc::new(Semaphore::new(0)),\n            max_permits: 100,\n            ..Default::default()\n        });\n\n        // Advance time by 10 seconds\n        time_source.advance(Duration::from_secs(10));\n        let shared_time_source = aws_smithy_async::time::SharedTimeSource::new(time_source);\n\n        // Launch 100 threads that all try to refill simultaneously\n        let barrier = Arc::new(Barrier::new(100));\n        let mut handles = Vec::new();\n\n        for _ in 0..100 {\n            let bucket_clone1 = Arc::clone(&bucket);\n            let barrier_clone1 = Arc::clone(&barrier);\n            let time_source_clone1 = shared_time_source.clone();\n            let bucket_clone2 = Arc::clone(&bucket);\n            let barrier_clone2 = Arc::clone(&barrier);\n            let time_source_clone2 = shared_time_source.clone();\n\n            let handle1 = thread::spawn(move || {\n                // Wait for all threads to be ready\n                barrier_clone1.wait();\n\n                // All threads call refill at the same time\n                bucket_clone1.refill_tokens_based_on_time(&time_source_clone1);\n            });\n\n            let handle2 = thread::spawn(move || {\n                // Wait for all threads to be ready\n                barrier_clone2.wait();\n\n                // All threads call refill at the same time\n                bucket_clone2.refill_tokens_based_on_time(&time_source_clone2);\n            });\n            handles.push(handle1);\n            handles.push(handle2);\n        }\n\n        // Wait for all threads to complete\n        for handle in handles {\n            handle.join().unwrap();\n        }\n\n        // Convert fractional tokens to whole tokens\n        bucket.convert_fractional_tokens();\n\n        // Should have exactly 10 tokens (10 seconds * 1 token/sec)\n        // Not 1000 tokens (100 threads * 10 tokens each)\n        assert_eq!(\n            bucket.available_permits(),\n            10,\n            \"Only one thread should have added tokens, not all 100\"\n        );\n\n        // Fractional should be 0 after conversion\n        assert!(bucket.fractional_tokens.load().abs() < 0.0001);\n    }\n\n    /// Regression test for https://github.com/awslabs/aws-sdk-rust/issues/1423\n    #[test]\n    fn test_is_full_accounts_for_fractional_tokens() {\n        let bucket = TokenBucket::builder()\n            .capacity(2)\n            .retry_cost(1)\n            .success_reward(0.9)\n            .build();\n\n        assert!(bucket.is_full());\n\n        let _p1 = bucket\n            .acquire(&ErrorKind::ServerError, &*TIME_SOURCE)\n            .unwrap();\n        let _p2 = bucket\n            .acquire(&ErrorKind::ServerError, &*TIME_SOURCE)\n            .unwrap();\n\n        assert!(bucket.is_empty());\n\n        // 3 rewards of 0.9 = 2.7 fractional tokens, which converts to 2 whole\n        // permits — enough to fill the bucket (capacity 2).\n        bucket.reward_success();\n        bucket.reward_success();\n        bucket.reward_success();\n\n        // Before the fix, is_full() returned false here because fractional\n        // tokens hadn't been converted to real permits.\n        assert!(bucket.is_full());\n        assert!(!bucket.is_empty());\n    }\n\n    #[test]\n    fn test_is_empty_accounts_for_fractional_tokens() {\n        let bucket = TokenBucket::builder()\n            .capacity(10)\n            .retry_cost(10)\n            .success_reward(0.5)\n            .build();\n\n        let _p = bucket\n            .acquire(&ErrorKind::ServerError, &*TIME_SOURCE)\n            .unwrap();\n        assert_eq!(bucket.semaphore.available_permits(), 0);\n\n        // 0.5 fractional tokens can't convert to a whole permit\n        bucket.reward_success();\n        assert!(bucket.is_empty());\n\n        // 1.0 fractional tokens converts to a permit\n        bucket.reward_success();\n        assert!(!bucket.is_empty());\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime/src/client/retries.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/// Smithy retry classifiers.\npub mod classifiers;\n\n/// Smithy retry strategies.\npub mod strategy;\n\nmod client_rate_limiter;\nmod token_bucket;\n\nuse aws_smithy_types::config_bag::{Storable, StoreReplace};\nuse std::fmt;\n\npub use client_rate_limiter::{\n    ClientRateLimiter, ClientRateLimiterBuilder, ClientRateLimiterPartition,\n};\npub use token_bucket::{TokenBucket, TokenBucketBuilder, MAXIMUM_CAPACITY};\n\nuse std::borrow::Cow;\n\n/// Represents the retry partition, e.g. an endpoint, a region\n///\n/// A retry partition created with [`RetryPartition::new`] uses built-in\n/// token bucket and rate limiter settings, with no option for customization.\n/// Default partitions with the same name share the same token bucket\n/// and client rate limiter.\n///\n/// To customize these components, use a custom retry partition via [`RetryPartition::custom`].\n/// A custom partition owns its token bucket and rate limiter, which:\n/// - Are independent from those in any default partition.\n/// - Are not shared with other custom partitions, even if they have the same name.\n///\n/// To share a token bucket and rate limiter among custom partitions,\n/// either clone the custom partition itself or clone these components\n/// beforehand and pass them to each custom partition.\n#[non_exhaustive]\n#[derive(Clone, Debug)]\npub struct RetryPartition {\n    pub(crate) inner: RetryPartitionInner,\n}\n\n#[derive(Clone, Debug)]\npub(crate) enum RetryPartitionInner {\n    Default(Cow<'static, str>),\n    Custom {\n        name: Cow<'static, str>,\n        token_bucket: TokenBucket,\n        client_rate_limiter: ClientRateLimiter,\n    },\n}\n\nimpl RetryPartition {\n    /// Creates a new `RetryPartition` from the given `name`.\n    pub fn new(name: impl Into<Cow<'static, str>>) -> Self {\n        Self {\n            inner: RetryPartitionInner::Default(name.into()),\n        }\n    }\n\n    /// Creates a builder for a custom `RetryPartition`.\n    pub fn custom(name: impl Into<Cow<'static, str>>) -> RetryPartitionBuilder {\n        RetryPartitionBuilder {\n            name: name.into(),\n            token_bucket: None,\n            client_rate_limiter: None,\n        }\n    }\n\n    fn name(&self) -> &str {\n        match &self.inner {\n            RetryPartitionInner::Default(name) => name,\n            RetryPartitionInner::Custom { name, .. } => name,\n        }\n    }\n}\n\nimpl PartialEq for RetryPartition {\n    fn eq(&self, other: &Self) -> bool {\n        match (&self.inner, &other.inner) {\n            (RetryPartitionInner::Default(name1), RetryPartitionInner::Default(name2)) => {\n                name1 == name2\n            }\n            (\n                RetryPartitionInner::Custom { name: name1, .. },\n                RetryPartitionInner::Custom { name: name2, .. },\n            ) => name1 == name2,\n            // Different variants: not equal\n            _ => false,\n        }\n    }\n}\n\nimpl Eq for RetryPartition {}\n\nimpl std::hash::Hash for RetryPartition {\n    fn hash<H: std::hash::Hasher>(&self, state: &mut H) {\n        match &self.inner {\n            RetryPartitionInner::Default(name) => {\n                // Hash discriminant for Default variant\n                0u8.hash(state);\n                name.hash(state);\n            }\n            RetryPartitionInner::Custom { name, .. } => {\n                // Hash discriminant for Configured variant\n                1u8.hash(state);\n                name.hash(state);\n            }\n        }\n    }\n}\n\nimpl fmt::Display for RetryPartition {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        f.write_str(self.name())\n    }\n}\n\nimpl Storable for RetryPartition {\n    type Storer = StoreReplace<RetryPartition>;\n}\n\n/// Builder for creating custom retry partitions.\npub struct RetryPartitionBuilder {\n    name: Cow<'static, str>,\n    token_bucket: Option<TokenBucket>,\n    client_rate_limiter: Option<ClientRateLimiter>,\n}\n\nimpl RetryPartitionBuilder {\n    /// Sets the token bucket.\n    pub fn token_bucket(mut self, token_bucket: TokenBucket) -> Self {\n        self.token_bucket = Some(token_bucket);\n        self\n    }\n\n    /// Sets the client rate limiter.\n    pub fn client_rate_limiter(mut self, client_rate_limiter: ClientRateLimiter) -> Self {\n        self.client_rate_limiter = Some(client_rate_limiter);\n        self\n    }\n\n    /// Builds the custom retry partition.\n    pub fn build(self) -> RetryPartition {\n        RetryPartition {\n            inner: RetryPartitionInner::Custom {\n                name: self.name,\n                token_bucket: self.token_bucket.unwrap_or_default(),\n                client_rate_limiter: self.client_rate_limiter.unwrap_or_default(),\n            },\n        }\n    }\n}\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use std::collections::hash_map::DefaultHasher;\n    use std::hash::{Hash, Hasher};\n\n    fn hash_value<T: Hash>(t: &T) -> u64 {\n        let mut hasher = DefaultHasher::new();\n        t.hash(&mut hasher);\n        hasher.finish()\n    }\n\n    #[test]\n    fn test_retry_partition_equality() {\n        let default1 = RetryPartition::new(\"test\");\n        let default2 = RetryPartition::new(\"test\");\n        let default3 = RetryPartition::new(\"other\");\n\n        let configured1 = RetryPartition::custom(\"test\").build();\n        let configured2 = RetryPartition::custom(\"test\").build();\n        let configured3 = RetryPartition::custom(\"other\").build();\n\n        // Same variant, same name\n        assert_eq!(default1, default2);\n        assert_eq!(configured1, configured2);\n\n        // Same variant, different name\n        assert_ne!(default1, default3);\n        assert_ne!(configured1, configured3);\n\n        // Different variant, same name\n        assert_ne!(default1, configured1);\n    }\n\n    #[test]\n    fn test_retry_partition_hash() {\n        let default = RetryPartition::new(\"test\");\n        let configured = RetryPartition::custom(\"test\").build();\n\n        // Different variants with same name should have different hashes\n        assert_ne!(hash_value(&default), hash_value(&configured));\n\n        // Same variants with same name should have same hashes\n        let default2 = RetryPartition::new(\"test\");\n        assert_eq!(hash_value(&default), hash_value(&default2));\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime/src/client/sdk_feature.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_smithy_types::config_bag::{Storable, StoreAppend};\n\n#[non_exhaustive]\n#[derive(Clone, Debug, Eq, PartialEq)]\npub enum SmithySdkFeature {\n    Waiter,\n    Paginator,\n    GzipRequestCompression,\n    ProtocolRpcV2Cbor,\n    RetryModeStandard,\n    RetryModeAdaptive,\n    FlexibleChecksumsReqCrc32,\n    FlexibleChecksumsReqCrc32c,\n    FlexibleChecksumsReqCrc64,\n    FlexibleChecksumsReqSha1,\n    FlexibleChecksumsReqSha256,\n    FlexibleChecksumsReqWhenSupported,\n    FlexibleChecksumsReqWhenRequired,\n    FlexibleChecksumsResWhenSupported,\n    FlexibleChecksumsResWhenRequired,\n    ObservabilityOtelMetrics,\n}\n\nimpl Storable for SmithySdkFeature {\n    type Storer = StoreAppend<Self>;\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime/src/client/stalled_stream_protection.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::client::http::body::minimum_throughput::{\n    options::MinimumThroughputBodyOptions, MinimumThroughputDownloadBody, ThroughputReadingBody,\n    UploadThroughput,\n};\nuse aws_smithy_async::rt::sleep::SharedAsyncSleep;\nuse aws_smithy_async::time::SharedTimeSource;\nuse aws_smithy_runtime_api::box_error::BoxError;\nuse aws_smithy_runtime_api::client::interceptors::context::{\n    BeforeDeserializationInterceptorContextMut, BeforeTransmitInterceptorContextMut,\n};\nuse aws_smithy_runtime_api::client::interceptors::{dyn_dispatch_hint, Intercept};\nuse aws_smithy_runtime_api::client::runtime_components::RuntimeComponents;\nuse aws_smithy_runtime_api::client::stalled_stream_protection::StalledStreamProtectionConfig;\nuse aws_smithy_types::body::SdkBody;\nuse aws_smithy_types::config_bag::ConfigBag;\nuse std::mem;\n\n/// Adds stalled stream protection when sending requests and/or receiving responses.\n#[derive(Debug, Default)]\n#[non_exhaustive]\npub struct StalledStreamProtectionInterceptor;\n\n/// Stalled stream protection can be enable for request bodies, response bodies,\n/// or both.\n#[deprecated(\n    since = \"1.2.0\",\n    note = \"This kind enum is no longer used. Configuration is stored in StalledStreamProtectionConfig in the config bag.\"\n)]\npub enum StalledStreamProtectionInterceptorKind {\n    /// Enable stalled stream protection for request bodies.\n    RequestBody,\n    /// Enable stalled stream protection for response bodies.\n    ResponseBody,\n    /// Enable stalled stream protection for both request and response bodies.\n    RequestAndResponseBody,\n}\n\nimpl StalledStreamProtectionInterceptor {\n    /// Create a new stalled stream protection interceptor.\n    #[deprecated(\n        since = \"1.2.0\",\n        note = \"The kind enum is no longer used. Configuration is stored in StalledStreamProtectionConfig in the config bag. Construct the interceptor using Default.\"\n    )]\n    #[allow(deprecated)]\n    pub fn new(_kind: StalledStreamProtectionInterceptorKind) -> Self {\n        Default::default()\n    }\n}\n\n#[dyn_dispatch_hint]\nimpl Intercept for StalledStreamProtectionInterceptor {\n    fn name(&self) -> &'static str {\n        \"StalledStreamProtectionInterceptor\"\n    }\n\n    fn modify_before_transmit(\n        &self,\n        context: &mut BeforeTransmitInterceptorContextMut<'_>,\n        runtime_components: &RuntimeComponents,\n        cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        if let Some(sspcfg) = cfg.load::<StalledStreamProtectionConfig>().cloned() {\n            if sspcfg.upload_enabled() {\n                if let Some(0) = context.request().body().content_length() {\n                    tracing::trace!(\n                        \"skipping stalled stream protection for zero length request body\"\n                    );\n                    return Ok(());\n                }\n                let (_async_sleep, time_source) = get_runtime_component_deps(runtime_components)?;\n                let now = time_source.now();\n\n                let options: MinimumThroughputBodyOptions = sspcfg.into();\n                let throughput = UploadThroughput::new(options.check_window(), now);\n                cfg.interceptor_state().store_put(throughput.clone());\n\n                tracing::trace!(\"adding stalled stream protection to request body\");\n                let it = mem::replace(context.request_mut().body_mut(), SdkBody::taken());\n                let it = it.map_preserve_contents(move |body| {\n                    let time_source = time_source.clone();\n                    SdkBody::from_body_1_x(ThroughputReadingBody::new(\n                        time_source,\n                        throughput.clone(),\n                        body,\n                    ))\n                });\n                let _ = mem::replace(context.request_mut().body_mut(), it);\n            }\n        }\n\n        Ok(())\n    }\n\n    fn modify_before_deserialization(\n        &self,\n        context: &mut BeforeDeserializationInterceptorContextMut<'_>,\n        runtime_components: &RuntimeComponents,\n        cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        if let Some(sspcfg) = cfg.load::<StalledStreamProtectionConfig>() {\n            if sspcfg.download_enabled() {\n                let (async_sleep, time_source) = get_runtime_component_deps(runtime_components)?;\n                tracing::trace!(\"adding stalled stream protection to response body\");\n                let sspcfg = sspcfg.clone();\n                let it = mem::replace(context.response_mut().body_mut(), SdkBody::taken());\n                let it = it.map_preserve_contents(move |body| {\n                    let sspcfg = sspcfg.clone();\n                    let async_sleep = async_sleep.clone();\n                    let time_source = time_source.clone();\n                    let mtb = MinimumThroughputDownloadBody::new(\n                        time_source,\n                        async_sleep,\n                        body,\n                        sspcfg.into(),\n                    );\n                    SdkBody::from_body_1_x(mtb)\n                });\n                let _ = mem::replace(context.response_mut().body_mut(), it);\n            }\n        }\n        Ok(())\n    }\n}\n\nfn get_runtime_component_deps(\n    runtime_components: &RuntimeComponents,\n) -> Result<(SharedAsyncSleep, SharedTimeSource), BoxError> {\n    let async_sleep = runtime_components.sleep_impl().ok_or(\n        \"An async sleep implementation is required when stalled stream protection is enabled\",\n    )?;\n    let time_source = runtime_components\n        .time_source()\n        .ok_or(\"A time source is required when stalled stream protection is enabled\")?;\n    Ok((async_sleep, time_source))\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime/src/client/test_util/deserializer.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_smithy_runtime_api::client::interceptors::context::{Error, Output};\nuse aws_smithy_runtime_api::client::orchestrator::{HttpResponse, OrchestratorError};\nuse aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugin;\nuse aws_smithy_runtime_api::client::ser_de::{DeserializeResponse, SharedResponseDeserializer};\nuse aws_smithy_types::config_bag::{FrozenLayer, Layer};\nuse std::sync::Mutex;\n\n/// Test response deserializer that always returns the same canned response.\n#[derive(Default, Debug)]\npub struct CannedResponseDeserializer {\n    inner: Mutex<Option<Result<Output, OrchestratorError<Error>>>>,\n}\n\nimpl CannedResponseDeserializer {\n    /// Creates a new `CannedResponseDeserializer` with the given canned response.\n    pub fn new(output: Result<Output, OrchestratorError<Error>>) -> Self {\n        Self {\n            inner: Mutex::new(Some(output)),\n        }\n    }\n\n    fn take(&self) -> Option<Result<Output, OrchestratorError<Error>>> {\n        match self.inner.lock() {\n            Ok(mut guard) => guard.take(),\n            Err(_) => None,\n        }\n    }\n}\n\nimpl DeserializeResponse for CannedResponseDeserializer {\n    fn deserialize_nonstreaming(\n        &self,\n        _response: &HttpResponse,\n    ) -> Result<Output, OrchestratorError<Error>> {\n        self.take()\n            .ok_or(\"CannedResponseDeserializer's inner value has already been taken.\")\n            .unwrap()\n    }\n}\n\nimpl RuntimePlugin for CannedResponseDeserializer {\n    fn config(&self) -> Option<FrozenLayer> {\n        let mut cfg = Layer::new(\"CannedResponse\");\n        cfg.store_put(SharedResponseDeserializer::new(Self {\n            inner: Mutex::new(self.take()),\n        }));\n        Some(cfg.freeze())\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime/src/client/test_util/serializer.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_smithy_runtime_api::box_error::BoxError;\nuse aws_smithy_runtime_api::client::interceptors::context::Input;\nuse aws_smithy_runtime_api::client::orchestrator::HttpRequest;\nuse aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugin;\nuse aws_smithy_runtime_api::client::ser_de::{SerializeRequest, SharedRequestSerializer};\nuse aws_smithy_types::config_bag::{ConfigBag, FrozenLayer, Layer};\nuse std::sync::Mutex;\n\n/// Test [`SerializeRequest`] that returns a canned request.\n#[derive(Default, Debug)]\npub struct CannedRequestSerializer {\n    inner: Mutex<Option<Result<HttpRequest, BoxError>>>,\n}\n\nimpl CannedRequestSerializer {\n    /// Create a new [`CannedRequestSerializer`] with a successful canned request.\n    pub fn success(request: HttpRequest) -> Self {\n        Self {\n            inner: Mutex::new(Some(Ok(request))),\n        }\n    }\n\n    /// Create a new [`CannedRequestSerializer`] with a canned error.\n    pub fn failure(error: BoxError) -> Self {\n        Self {\n            inner: Mutex::new(Some(Err(error))),\n        }\n    }\n\n    fn take(&self) -> Option<Result<HttpRequest, BoxError>> {\n        match self.inner.lock() {\n            Ok(mut guard) => guard.take(),\n            Err(_) => None,\n        }\n    }\n}\n\nimpl SerializeRequest for CannedRequestSerializer {\n    fn serialize_input(\n        &self,\n        _input: Input,\n        _cfg: &mut ConfigBag,\n    ) -> Result<HttpRequest, BoxError> {\n        self.take()\n            .ok_or(\"CannedRequestSerializer's inner value has already been taken.\")?\n    }\n}\n\nimpl RuntimePlugin for CannedRequestSerializer {\n    fn config(&self) -> Option<FrozenLayer> {\n        let mut cfg = Layer::new(\"CannedRequest\");\n        cfg.store_put(SharedRequestSerializer::new(Self {\n            inner: Mutex::new(self.take()),\n        }));\n        Some(cfg.freeze())\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime/src/client/test_util.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/// Test response deserializer implementations.\npub mod deserializer;\n\n/// Test request serializer implementations.\npub mod serializer;\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime/src/client/timeout.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_smithy_async::future::timeout::Timeout;\nuse aws_smithy_async::rt::sleep::{AsyncSleep, SharedAsyncSleep, Sleep};\nuse aws_smithy_runtime_api::client::orchestrator::HttpResponse;\nuse aws_smithy_runtime_api::client::result::SdkError;\nuse aws_smithy_runtime_api::client::runtime_components::RuntimeComponents;\nuse aws_smithy_types::config_bag::ConfigBag;\nuse aws_smithy_types::timeout::TimeoutConfig;\nuse pin_project_lite::pin_project;\nuse std::future::Future;\nuse std::pin::Pin;\nuse std::task::{Context, Poll};\nuse std::time::Duration;\n\n#[derive(Debug)]\nstruct MaybeTimeoutError {\n    kind: TimeoutKind,\n    duration: Duration,\n}\n\nimpl MaybeTimeoutError {\n    fn new(kind: TimeoutKind, duration: Duration) -> Self {\n        Self { kind, duration }\n    }\n}\n\nimpl std::fmt::Display for MaybeTimeoutError {\n    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n        write!(\n            f,\n            \"{} occurred after {:?}\",\n            match self.kind {\n                TimeoutKind::Operation => \"operation timeout (all attempts including retries)\",\n                TimeoutKind::OperationAttempt => \"operation attempt timeout (single attempt)\",\n            },\n            self.duration\n        )\n    }\n}\n\nimpl std::error::Error for MaybeTimeoutError {}\n\npin_project! {\n    #[non_exhaustive]\n    #[must_use = \"futures do nothing unless you `.await` or poll them\"]\n    // This allow is needed because otherwise Clippy will get mad we didn't document the\n    // generated MaybeTimeoutFutureProj\n    #[allow(missing_docs)]\n    #[project = MaybeTimeoutFutureProj]\n    /// A timeout future that may or may not have a timeout depending on\n    /// whether or not one was set. A `kind` can be set so that when a timeout occurs, there\n    /// is additional context attached to the error.\n    pub(super) enum MaybeTimeoutFuture<F> {\n        /// A wrapper around an inner future that will output an [`SdkError`] if it runs longer than\n        /// the given duration\n        Timeout {\n            #[pin]\n            future: Timeout<F, Sleep>,\n            timeout_kind: TimeoutKind,\n            duration: Duration,\n        },\n        /// A thin wrapper around an inner future that will never time out\n        NoTimeout {\n            #[pin]\n            future: F\n        }\n    }\n}\n\nimpl<InnerFuture, T, E> Future for MaybeTimeoutFuture<InnerFuture>\nwhere\n    InnerFuture: Future<Output = Result<T, SdkError<E, HttpResponse>>>,\n{\n    type Output = Result<T, SdkError<E, HttpResponse>>;\n\n    fn poll(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Self::Output> {\n        let (future, kind, duration) = match self.project() {\n            MaybeTimeoutFutureProj::NoTimeout { future } => return future.poll(cx),\n            MaybeTimeoutFutureProj::Timeout {\n                future,\n                timeout_kind,\n                duration,\n            } => (future, timeout_kind, duration),\n        };\n        match future.poll(cx) {\n            Poll::Ready(Ok(response)) => Poll::Ready(response),\n            Poll::Ready(Err(_timeout)) => Poll::Ready(Err(SdkError::timeout_error(\n                MaybeTimeoutError::new(*kind, *duration),\n            ))),\n            Poll::Pending => Poll::Pending,\n        }\n    }\n}\n\n#[derive(Copy, Clone, Debug, Eq, PartialEq)]\npub(super) enum TimeoutKind {\n    Operation,\n    OperationAttempt,\n}\n\n#[derive(Clone, Debug)]\npub(super) struct MaybeTimeoutConfig {\n    sleep_impl: Option<SharedAsyncSleep>,\n    timeout: Option<Duration>,\n    timeout_kind: TimeoutKind,\n}\n\nimpl MaybeTimeoutConfig {\n    pub(super) fn new(\n        runtime_components: &RuntimeComponents,\n        cfg: &ConfigBag,\n        timeout_kind: TimeoutKind,\n    ) -> MaybeTimeoutConfig {\n        if let Some(timeout_config) = cfg.load::<TimeoutConfig>() {\n            let sleep_impl = runtime_components.sleep_impl();\n            let timeout = match (sleep_impl.as_ref(), timeout_kind) {\n                (None, _) => None,\n                (Some(_), TimeoutKind::Operation) => timeout_config.operation_timeout(),\n                (Some(_), TimeoutKind::OperationAttempt) => {\n                    timeout_config.operation_attempt_timeout()\n                }\n            };\n            MaybeTimeoutConfig {\n                sleep_impl,\n                timeout,\n                timeout_kind,\n            }\n        } else {\n            MaybeTimeoutConfig {\n                sleep_impl: None,\n                timeout: None,\n                timeout_kind,\n            }\n        }\n    }\n}\n\n/// Trait to conveniently wrap a future with an optional timeout.\npub(super) trait MaybeTimeout<T>: Sized {\n    /// Wraps a future in a timeout if one is set.\n    fn maybe_timeout(self, timeout_config: MaybeTimeoutConfig) -> MaybeTimeoutFuture<Self>;\n}\n\nimpl<T> MaybeTimeout<T> for T\nwhere\n    T: Future,\n{\n    fn maybe_timeout(self, timeout_config: MaybeTimeoutConfig) -> MaybeTimeoutFuture<Self> {\n        match timeout_config {\n            MaybeTimeoutConfig {\n                sleep_impl: Some(sleep_impl),\n                timeout: Some(timeout),\n                timeout_kind,\n            } => MaybeTimeoutFuture::Timeout {\n                future: Timeout::new(self, sleep_impl.sleep(timeout)),\n                timeout_kind,\n                duration: timeout,\n            },\n            _ => MaybeTimeoutFuture::NoTimeout { future: self },\n        }\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use aws_smithy_async::assert_elapsed;\n    use aws_smithy_async::future::never::Never;\n    use aws_smithy_async::rt::sleep::{AsyncSleep, SharedAsyncSleep, TokioSleep};\n    use aws_smithy_runtime_api::client::orchestrator::HttpResponse;\n    use aws_smithy_runtime_api::client::result::SdkError;\n    use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder;\n    use aws_smithy_types::config_bag::{CloneableLayer, ConfigBag};\n    use aws_smithy_types::timeout::TimeoutConfig;\n    use std::time::Duration;\n\n    #[tokio::test]\n    async fn test_no_timeout() {\n        let sleep_impl = SharedAsyncSleep::new(TokioSleep::new());\n        let sleep_future = sleep_impl.sleep(Duration::from_millis(250));\n        let underlying_future = async {\n            sleep_future.await;\n            Result::<_, SdkError<(), HttpResponse>>::Ok(())\n        };\n\n        let now = tokio::time::Instant::now();\n        tokio::time::pause();\n\n        let runtime_components = RuntimeComponentsBuilder::for_tests()\n            .with_sleep_impl(Some(sleep_impl))\n            .build()\n            .unwrap();\n\n        let mut timeout_config = CloneableLayer::new(\"timeout\");\n        timeout_config.store_put(TimeoutConfig::builder().build());\n        let cfg = ConfigBag::of_layers(vec![timeout_config.into()]);\n\n        let maybe_timeout =\n            MaybeTimeoutConfig::new(&runtime_components, &cfg, TimeoutKind::Operation);\n        underlying_future\n            .maybe_timeout(maybe_timeout)\n            .await\n            .expect(\"success\");\n\n        assert_elapsed!(now, Duration::from_secs_f32(0.25));\n    }\n\n    #[tokio::test]\n    async fn test_operation_timeout() {\n        let sleep_impl = SharedAsyncSleep::new(TokioSleep::new());\n        let never = Never::new();\n        let underlying_future = async {\n            never.await;\n            Result::<_, SdkError<(), HttpResponse>>::Ok(())\n        };\n\n        let now = tokio::time::Instant::now();\n        tokio::time::pause();\n\n        let runtime_components = RuntimeComponentsBuilder::for_tests()\n            .with_sleep_impl(Some(sleep_impl))\n            .build()\n            .unwrap();\n        let mut timeout_config = CloneableLayer::new(\"timeout\");\n        timeout_config.store_put(\n            TimeoutConfig::builder()\n                .operation_timeout(Duration::from_millis(250))\n                .build(),\n        );\n        let cfg = ConfigBag::of_layers(vec![timeout_config.into()]);\n\n        let maybe_timeout =\n            MaybeTimeoutConfig::new(&runtime_components, &cfg, TimeoutKind::Operation);\n        let result = underlying_future.maybe_timeout(maybe_timeout).await;\n        let err = result.expect_err(\"should have timed out\");\n\n        assert_eq!(format!(\"{err:?}\"), \"TimeoutError(TimeoutError { source: MaybeTimeoutError { kind: Operation, duration: 250ms } })\");\n        assert_elapsed!(now, Duration::from_secs_f32(0.25));\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime/src/client/waiters/backoff.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::{fmt, time::Duration};\n\n#[derive(Debug)]\npub(super) struct Backoff {\n    min_delay: Duration,\n    max_delay: Duration,\n    max_wait: Duration,\n    attempt_ceiling: u32,\n    random: RandomImpl,\n}\n\nimpl Backoff {\n    pub(super) fn new(\n        min_delay: Duration,\n        max_delay: Duration,\n        max_wait: Duration,\n        random: RandomImpl,\n    ) -> Self {\n        Self {\n            min_delay,\n            max_delay,\n            max_wait,\n            // Attempt ceiling calculation taken from the Smithy spec: https://smithy.io/2.0/additional-specs/waiters.html#waiter-retries\n            attempt_ceiling: (((max_delay.as_secs_f64() / min_delay.as_secs_f64()).ln()\n                / 2f64.ln())\n                + 1.0) as u32,\n            random,\n        }\n    }\n\n    // Calculates backoff delay time according to the Smithy spec: https://smithy.io/2.0/additional-specs/waiters.html#waiter-retries\n    pub(super) fn delay(&self, attempt: u32, elapsed: Duration) -> Duration {\n        let delay = if attempt > self.attempt_ceiling {\n            self.max_delay.as_secs()\n        } else {\n            self.min_delay.as_secs() * 2u64.pow(attempt - 1)\n        };\n        let mut delay = Duration::from_secs(self.random.random(self.min_delay.as_secs(), delay));\n\n        let remaining_time = self.max_wait.saturating_sub(elapsed);\n        if remaining_time.saturating_sub(delay) <= self.min_delay {\n            // Note: deviating from the spec here. Subtracting `min_delay` doesn't fulfill the original intent.\n            delay = remaining_time;\n        }\n        delay\n    }\n\n    #[inline]\n    pub(super) fn max_wait(&self) -> Duration {\n        self.max_wait\n    }\n}\n\n#[derive(Default)]\npub(super) enum RandomImpl {\n    #[default]\n    Default,\n    #[cfg(test)]\n    Override(Box<dyn Fn(u64, u64) -> u64 + Send + Sync>),\n}\n\nimpl fmt::Debug for RandomImpl {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        match self {\n            Self::Default => write!(f, \"Default\"),\n            #[cfg(test)]\n            Self::Override(_) => f.debug_tuple(\"Override\").field(&\"** function **\").finish(),\n        }\n    }\n}\n\nimpl RandomImpl {\n    fn random(&self, min_inclusive: u64, max_inclusive: u64) -> u64 {\n        match self {\n            Self::Default => fastrand::u64(min_inclusive..=max_inclusive),\n            #[cfg(test)]\n            Self::Override(overrid) => (overrid)(min_inclusive, max_inclusive),\n        }\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use std::sync::{Arc, Mutex};\n\n    fn test_backoff(\n        min_delay: u64,\n        max_delay: u64,\n        test_random: impl Fn(u64, u64) -> u64 + Send + Sync + 'static,\n        attempt_delays: &[(u64, u64)],\n    ) {\n        let backoff = dbg!(Backoff::new(\n            Duration::from_secs(min_delay),\n            Duration::from_secs(max_delay),\n            Duration::from_secs(300),\n            RandomImpl::Override(Box::new(test_random)),\n        ));\n\n        for (index, (delay, time)) in attempt_delays.iter().enumerate() {\n            let attempt = index + 1;\n            println!(\"attempt: {attempt}, delay: {delay}, time: {time}\");\n            assert_eq!(\n                Duration::from_secs(*delay),\n                backoff.delay(attempt as _, Duration::from_secs(*time))\n            );\n        }\n    }\n\n    #[test]\n    fn backoff_jitter_as_average() {\n        let test_random = |min: u64, max: u64| (min + max) / 2;\n        let attempt_delays = &[\n            // delay, time\n            (2, 2),\n            (3, 4),\n            (5, 7),\n            (9, 12),\n            (17, 21),\n            (33, 38),\n            (61, 71),\n            (61, 132),\n            (61, 193),\n            (46, 254),\n            (0, 300),\n        ];\n        test_backoff(2, 120, test_random, attempt_delays);\n    }\n\n    #[test]\n    fn backoff_with_seeded_jitter() {\n        let random = Arc::new(Mutex::new(fastrand::Rng::with_seed(1)));\n        let test_random = move |min: u64, max: u64| random.lock().unwrap().u64(min..=max);\n        let attempt_delays = &[\n            // delay, time\n            (2, 2),\n            (3, 4),\n            (3, 7),\n            (13, 12),\n            (2, 14),\n            (51, 16),\n            (93, 73),\n            (102, 164),\n            (73, 170),\n            (21, 227),\n            (9, 256),\n            (17, 283),\n            (0, 300),\n        ];\n        test_backoff(2, 120, test_random, attempt_delays);\n    }\n\n    #[test]\n    fn backoff_with_large_min_delay() {\n        let test_random = |min: u64, max: u64| (min + max) / 2;\n        let attempt_delays = &[\n            // delay, time\n            (15, 1),\n            (22, 16),\n            (37, 38),\n            (67, 75),\n            (67, 142),\n            (24, 276),\n            (0, 300),\n        ];\n        test_backoff(15, 120, test_random, attempt_delays);\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime/src/client/waiters.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::client::waiters::backoff::{Backoff, RandomImpl};\nuse aws_smithy_async::{\n    rt::sleep::{AsyncSleep, SharedAsyncSleep},\n    time::SharedTimeSource,\n};\nuse aws_smithy_runtime_api::client::waiters::FinalPoll;\nuse aws_smithy_runtime_api::client::{orchestrator::HttpResponse, result::SdkError};\nuse aws_smithy_runtime_api::client::{\n    result::CreateUnhandledError,\n    waiters::error::{ExceededMaxWait, FailureState, OperationFailed, WaiterError},\n};\nuse std::future::Future;\nuse std::time::Duration;\n\nmod backoff;\n\n/// Waiter acceptor state\n///\n/// This enum (vaguely) matches the [acceptor state] from the Smithy spec.\n/// It has an additional `NoAcceptorsMatched` variant to indicate the case where\n/// none of the modeled waiters matched the response, which the spec mentions but\n/// doesn't consider an official part of the acceptor state enum. An `Option<AcceptorState>`\n/// could have been used instead, but this seemed cleaner.\n///\n/// [acceptor state]: https://smithy.io/2.0/additional-specs/waiters.html#acceptorstate-enum\n#[non_exhaustive]\n#[derive(Copy, Clone, Debug, Eq, PartialEq)]\npub enum AcceptorState {\n    /// None of the modeled acceptors matched the response.\n    NoAcceptorsMatched,\n    /// A `success` acceptor matched the response.\n    Success,\n    /// A `failure` acceptor matched the response.\n    Failure,\n    /// A `retry` acceptor matched the response.\n    Retry,\n}\n\n/// Orchestrates waiting via polling with jittered exponential backoff.\n///\n/// This is meant to be used internally by the generated code to provide\n/// waiter functionality.\npub struct WaiterOrchestrator<AcceptorFn, OperationFn> {\n    backoff: Backoff,\n    time_source: SharedTimeSource,\n    sleep_impl: SharedAsyncSleep,\n    acceptor_fn: AcceptorFn,\n    operation_fn: OperationFn,\n}\n\nimpl WaiterOrchestrator<(), ()> {\n    /// Returns a builder for the waiter orchestrator.\n    pub fn builder() -> WaiterOrchestratorBuilder<(), ()> {\n        WaiterOrchestratorBuilder::default()\n    }\n}\n\nimpl<AcceptorFn, OperationFn> WaiterOrchestrator<AcceptorFn, OperationFn> {\n    fn new(\n        backoff: Backoff,\n        time_source: SharedTimeSource,\n        sleep_impl: SharedAsyncSleep,\n        acceptor_fn: AcceptorFn,\n        operation_fn: OperationFn,\n    ) -> Self {\n        WaiterOrchestrator {\n            backoff,\n            time_source,\n            sleep_impl,\n            acceptor_fn,\n            operation_fn,\n        }\n    }\n}\n\nimpl<AcceptorFn, OperationFn, O, E, Fut> WaiterOrchestrator<AcceptorFn, OperationFn>\nwhere\n    AcceptorFn: Fn(Result<&O, &E>) -> AcceptorState,\n    OperationFn: Fn() -> Fut,\n    Fut: Future<Output = Result<O, SdkError<E, HttpResponse>>>,\n    E: CreateUnhandledError + std::error::Error + Send + Sync + 'static,\n{\n    /// Orchestrates waiting via polling with jittered exponential backoff.\n    pub async fn orchestrate(\n        self,\n    ) -> Result<FinalPoll<O, SdkError<E, HttpResponse>>, WaiterError<O, E>> {\n        let start_time = self.time_source.now();\n        let mut attempt = 0;\n        let mut done_retrying = false;\n        loop {\n            tracing::debug!(\"executing waiter poll attempt #{}\", attempt + 1);\n            let result = (self.operation_fn)().await;\n            let error = result.is_err();\n\n            // \"acceptable result\" in this context means \"an acceptor's matcher can match this result type\"\n            let acceptable_result = result.as_ref().map_err(|err| err.as_service_error());\n            let acceptor_state = match acceptable_result {\n                Ok(output) => (self.acceptor_fn)(Ok(output)),\n                Err(Some(err)) => (self.acceptor_fn)(Err(err)),\n                _ => {\n                    // If we got an unmatchable failure (basically anything unmodeled), then just immediately exit\n                    return Err(WaiterError::OperationFailed(OperationFailed::new(\n                        result.err().expect(\"can only be an err in this branch\"),\n                    )));\n                }\n            };\n\n            tracing::debug!(\"waiter acceptor state: {acceptor_state:?}\");\n            match acceptor_state {\n                AcceptorState::Success => return Ok(FinalPoll::new(result)),\n                AcceptorState::Failure => {\n                    return Err(WaiterError::FailureState(FailureState::new(\n                        FinalPoll::new(result.map_err(|err| err.into_service_error())),\n                    )))\n                }\n                // This occurs when there was a modeled error response, but none of the acceptors matched it\n                AcceptorState::NoAcceptorsMatched if error => {\n                    return Err(WaiterError::OperationFailed(OperationFailed::new(\n                        result.err().expect(\"checked above\"),\n                    )))\n                }\n                AcceptorState::Retry | AcceptorState::NoAcceptorsMatched => {\n                    attempt += 1;\n\n                    let now = self.time_source.now();\n                    let elapsed = now.duration_since(start_time).unwrap_or_default();\n                    if !done_retrying && elapsed <= self.backoff.max_wait() {\n                        let delay = self.backoff.delay(attempt, elapsed);\n\n                        // The backoff function returns a zero delay when it is min_delay time away\n                        // from max_time. If we didn't detect this and stop polling, then we could\n                        // slam the server at the very end of the wait period for servers that are\n                        // really fast (for example, a few milliseconds total round-trip latency).\n                        if delay.is_zero() {\n                            tracing::debug!(\n                                \"delay calculated for attempt #{attempt}; elapsed ({elapsed:?}); waiter is close to max time; will immediately poll one last time\"\n                            );\n                            done_retrying = true;\n                        } else {\n                            tracing::debug!(\n                                \"delay calculated for attempt #{attempt}; elapsed ({elapsed:?}); waiter will poll again in {delay:?}\"\n                            );\n                            self.sleep_impl.sleep(delay).await;\n                        }\n                    } else {\n                        tracing::debug!(\n                            \"waiter exceeded max wait time of {:?}\",\n                            self.backoff.max_wait()\n                        );\n                        return Err(WaiterError::ExceededMaxWait(ExceededMaxWait::new(\n                            self.backoff.max_wait(),\n                            elapsed,\n                            attempt,\n                        )));\n                    }\n                }\n            }\n        }\n    }\n}\n\n/// Builder for [`WaiterOrchestrator`].\n#[derive(Default)]\npub struct WaiterOrchestratorBuilder<AcceptorFn = (), OperationFn = ()> {\n    min_delay: Option<Duration>,\n    max_delay: Option<Duration>,\n    max_wait: Option<Duration>,\n    time_source: Option<SharedTimeSource>,\n    sleep_impl: Option<SharedAsyncSleep>,\n    random_fn: RandomImpl,\n    acceptor_fn: Option<AcceptorFn>,\n    operation_fn: Option<OperationFn>,\n}\n\nimpl<AcceptorFn, OperationFn> WaiterOrchestratorBuilder<AcceptorFn, OperationFn> {\n    /// Set the minimum delay time for the waiter.\n    pub fn min_delay(mut self, min_delay: Duration) -> Self {\n        self.min_delay = Some(min_delay);\n        self\n    }\n\n    /// Set the maximum delay time for the waiter.\n    pub fn max_delay(mut self, max_delay: Duration) -> Self {\n        self.max_delay = Some(max_delay);\n        self\n    }\n\n    /// Set the maximum total wait time for the waiter.\n    pub fn max_wait(mut self, max_wait: Duration) -> Self {\n        self.max_wait = Some(max_wait);\n        self\n    }\n\n    #[cfg(all(test, any(feature = \"test-util\", feature = \"legacy-test-util\")))]\n    fn random(mut self, random_fn: impl Fn(u64, u64) -> u64 + Send + Sync + 'static) -> Self {\n        self.random_fn = RandomImpl::Override(Box::new(random_fn));\n        self\n    }\n\n    /// Set the time source the waiter will use.\n    pub fn time_source(mut self, time_source: SharedTimeSource) -> Self {\n        self.time_source = Some(time_source);\n        self\n    }\n\n    /// Set the async sleep implementation the waiter will use to delay.\n    pub fn sleep_impl(mut self, sleep_impl: SharedAsyncSleep) -> Self {\n        self.sleep_impl = Some(sleep_impl);\n        self\n    }\n\n    /// Build a waiter orchestrator.\n    pub fn build(self) -> WaiterOrchestrator<AcceptorFn, OperationFn> {\n        WaiterOrchestrator::new(\n            Backoff::new(\n                self.min_delay.expect(\"min delay is required\"),\n                self.max_delay.expect(\"max delay is required\"),\n                self.max_wait.expect(\"max wait is required\"),\n                self.random_fn,\n            ),\n            self.time_source.expect(\"time source required\"),\n            self.sleep_impl.expect(\"sleep impl required\"),\n            self.acceptor_fn.expect(\"acceptor fn required\"),\n            self.operation_fn.expect(\"operation fn required\"),\n        )\n    }\n}\n\nimpl<OperationFn> WaiterOrchestratorBuilder<(), OperationFn> {\n    /// Set the acceptor function for the waiter.\n    pub fn acceptor<AcceptorFn>(\n        self,\n        acceptor: AcceptorFn,\n    ) -> WaiterOrchestratorBuilder<AcceptorFn, OperationFn> {\n        WaiterOrchestratorBuilder {\n            min_delay: self.min_delay,\n            max_delay: self.max_delay,\n            max_wait: self.max_wait,\n            time_source: self.time_source,\n            sleep_impl: self.sleep_impl,\n            random_fn: self.random_fn,\n            acceptor_fn: Some(acceptor),\n            operation_fn: self.operation_fn,\n        }\n    }\n}\n\nimpl<AcceptorFn> WaiterOrchestratorBuilder<AcceptorFn, ()> {\n    /// Set the operation function for the waiter.\n    pub fn operation<OperationFn>(\n        self,\n        operation: OperationFn,\n    ) -> WaiterOrchestratorBuilder<AcceptorFn, OperationFn> {\n        WaiterOrchestratorBuilder {\n            min_delay: self.min_delay,\n            max_delay: self.max_delay,\n            max_wait: self.max_wait,\n            time_source: self.time_source,\n            sleep_impl: self.sleep_impl,\n            random_fn: self.random_fn,\n            acceptor_fn: self.acceptor_fn,\n            operation_fn: Some(operation),\n        }\n    }\n}\n\n/// Attaches a tracing span with a semi-unique waiter ID number so that all the operations\n/// made by the waiter can be correlated together in logs.\npub fn attach_waiter_tracing_span<O, E>(\n    future: impl Future<Output = Result<FinalPoll<O, SdkError<E, HttpResponse>>, WaiterError<O, E>>>,\n) -> impl Future<Output = Result<FinalPoll<O, SdkError<E, HttpResponse>>, WaiterError<O, E>>> {\n    use tracing::Instrument;\n\n    // Create a random seven-digit ID for the waiter so that it can be correlated in the logs.\n    let span = tracing::debug_span!(\"waiter\", waiter_id = fastrand::u32(1_000_000..10_000_000));\n    future.instrument(span)\n}\n\n#[cfg(all(test, any(feature = \"test-util\", feature = \"legacy-test-util\")))]\nmod tests {\n    use super::*;\n    use crate::test_util::capture_test_logs::show_test_logs;\n    use aws_smithy_async::{\n        test_util::tick_advance_sleep::tick_advance_time_and_sleep, time::TimeSource,\n    };\n    use aws_smithy_runtime_api::{http::StatusCode, shared::IntoShared};\n    use aws_smithy_types::body::SdkBody;\n    use std::{\n        fmt,\n        sync::{\n            atomic::{AtomicUsize, Ordering},\n            Arc, Mutex,\n        },\n        time::SystemTime,\n    };\n\n    #[derive(Debug)]\n    struct TestError;\n    impl std::error::Error for TestError {}\n    impl fmt::Display for TestError {\n        fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n            f.write_str(\"TestError\")\n        }\n    }\n    impl CreateUnhandledError for TestError {\n        fn create_unhandled_error(\n            _source: Box<dyn std::error::Error + Send + Sync + 'static>,\n            _meta: Option<aws_smithy_types::error::ErrorMetadata>,\n        ) -> Self {\n            unreachable!(\"If this is called, there is a bug in the orchestrator implementation. Unmodeled errors should never make it into FailureState.\")\n        }\n    }\n\n    fn test_orchestrator(\n        sleep_impl: impl IntoShared<SharedAsyncSleep>,\n        time_source: impl IntoShared<SharedTimeSource>,\n    ) -> WaiterOrchestratorBuilder<(), ()> {\n        let test_random = |min: u64, max: u64| (min + max) / 2;\n        WaiterOrchestrator::builder()\n            .min_delay(Duration::from_secs(2))\n            .max_delay(Duration::from_secs(120))\n            .max_wait(Duration::from_secs(300))\n            .random(test_random)\n            .sleep_impl(sleep_impl.into_shared())\n            .time_source(time_source.into_shared())\n    }\n\n    #[tokio::test]\n    async fn immediate_success() {\n        let _logs = show_test_logs();\n        let (time_source, sleep_impl) = tick_advance_time_and_sleep();\n        let orchestrator = test_orchestrator(sleep_impl, time_source)\n            .acceptor(|_result: Result<&usize, &TestError>| AcceptorState::Success)\n            .operation(|| async { Result::<_, SdkError<TestError, HttpResponse>>::Ok(5usize) })\n            .build();\n\n        let result = orchestrator.orchestrate().await;\n        assert!(result.is_ok());\n        assert_eq!(5, *result.unwrap().as_result().unwrap());\n    }\n\n    #[tokio::test]\n    async fn immediate_failure() {\n        let _logs = show_test_logs();\n        let (time_source, sleep_impl) = tick_advance_time_and_sleep();\n        let orchestrator = test_orchestrator(sleep_impl, time_source)\n            .acceptor(|_result: Result<&usize, &TestError>| AcceptorState::Failure)\n            .operation(|| async { Result::<_, SdkError<TestError, HttpResponse>>::Ok(5usize) })\n            .build();\n\n        let result = orchestrator.orchestrate().await;\n        assert!(\n            matches!(result, Err(WaiterError::FailureState(_))),\n            \"expected failure state, got: {result:?}\"\n        );\n    }\n\n    #[tokio::test]\n    async fn five_polls_then_success() {\n        let _logs = show_test_logs();\n\n        let (time_source, sleep_impl) = tick_advance_time_and_sleep();\n\n        let acceptor = |result: Result<&usize, &TestError>| match result {\n            Err(_) => unreachable!(),\n            Ok(5) => AcceptorState::Success,\n            _ => AcceptorState::Retry,\n        };\n\n        let times = Arc::new(Mutex::new(Vec::new()));\n        let attempt = Arc::new(AtomicUsize::new(1));\n        let operation = {\n            let sleep_impl = sleep_impl.clone();\n            let time_source = time_source.clone();\n            let times = times.clone();\n            move || {\n                let attempt = attempt.clone();\n                let sleep_impl = sleep_impl.clone();\n                let time_source = time_source.clone();\n                let times = times.clone();\n                async move {\n                    // simulate time passing for the network hop/service processing time\n                    sleep_impl.sleep(Duration::from_secs(1)).await;\n                    times.lock().unwrap().push(\n                        time_source\n                            .now()\n                            .duration_since(SystemTime::UNIX_EPOCH)\n                            .unwrap()\n                            .as_secs(),\n                    );\n                    Result::<_, SdkError<TestError, HttpResponse>>::Ok(\n                        attempt.fetch_add(1, Ordering::SeqCst),\n                    )\n                }\n            }\n        };\n\n        let orchestrator = test_orchestrator(sleep_impl.clone(), time_source.clone())\n            .acceptor(acceptor)\n            .operation(operation)\n            .build();\n\n        let task = tokio::spawn(orchestrator.orchestrate());\n        tokio::task::yield_now().await;\n        time_source.tick(Duration::from_secs(500)).await;\n        let result = task.await.unwrap();\n\n        assert!(result.is_ok());\n        assert_eq!(5, *result.unwrap().as_result().unwrap());\n        assert_eq!(vec![1, 4, 8, 14, 24], *times.lock().unwrap());\n    }\n\n    #[tokio::test]\n    async fn exceed_max_wait_time() {\n        let _logs = show_test_logs();\n        let (time_source, sleep_impl) = tick_advance_time_and_sleep();\n\n        let orchestrator = test_orchestrator(sleep_impl.clone(), time_source.clone())\n            .acceptor(|_result: Result<&usize, &TestError>| AcceptorState::Retry)\n            .operation(|| async { Result::<_, SdkError<TestError, HttpResponse>>::Ok(1) })\n            .build();\n\n        let task = tokio::spawn(orchestrator.orchestrate());\n        tokio::task::yield_now().await;\n        time_source.tick(Duration::from_secs(500)).await;\n        let result = task.await.unwrap();\n\n        match result {\n            Err(WaiterError::ExceededMaxWait(context)) => {\n                assert_eq!(Duration::from_secs(300), context.max_wait());\n                assert_eq!(300, context.elapsed().as_secs());\n                assert_eq!(12, context.poll_count());\n            }\n            _ => panic!(\"expected ExceededMaxWait, got {result:?}\"),\n        }\n    }\n\n    #[tokio::test]\n    async fn operation_timed_out() {\n        let _logs = show_test_logs();\n        let (time_source, sleep_impl) = tick_advance_time_and_sleep();\n        let orchestrator = test_orchestrator(sleep_impl, time_source)\n            .acceptor(|_result: Result<&usize, &TestError>| unreachable!())\n            .operation(|| async {\n                Result::<usize, SdkError<TestError, HttpResponse>>::Err(SdkError::timeout_error(\n                    \"test\",\n                ))\n            })\n            .build();\n\n        match orchestrator.orchestrate().await {\n            Err(WaiterError::OperationFailed(err)) => match err.error() {\n                SdkError::TimeoutError(_) => { /* good */ }\n                result => panic!(\"unexpected final poll: {result:?}\"),\n            },\n            result => panic!(\"unexpected result: {result:?}\"),\n        }\n    }\n\n    #[tokio::test]\n    async fn modeled_service_error_no_acceptors_matched() {\n        let _logs = show_test_logs();\n        let (time_source, sleep_impl) = tick_advance_time_and_sleep();\n        let orchestrator = test_orchestrator(sleep_impl, time_source)\n            .acceptor(|_result: Result<&usize, &TestError>| AcceptorState::NoAcceptorsMatched)\n            .operation(|| async {\n                Result::<usize, SdkError<TestError, HttpResponse>>::Err(SdkError::service_error(\n                    TestError,\n                    HttpResponse::new(StatusCode::try_from(400).unwrap(), SdkBody::empty()),\n                ))\n            })\n            .build();\n\n        match dbg!(orchestrator.orchestrate().await) {\n            Err(WaiterError::OperationFailed(err)) => match err.error() {\n                SdkError::ServiceError(_) => { /* good */ }\n                result => panic!(\"unexpected result: {result:?}\"),\n            },\n            result => panic!(\"unexpected result: {result:?}\"),\n        }\n    }\n\n    #[tokio::test]\n    async fn modeled_error_matched_as_failure() {\n        let _logs = show_test_logs();\n        let (time_source, sleep_impl) = tick_advance_time_and_sleep();\n        let orchestrator = test_orchestrator(sleep_impl, time_source)\n            .acceptor(|_result: Result<&usize, &TestError>| AcceptorState::Failure)\n            .operation(|| async {\n                Result::<usize, SdkError<TestError, HttpResponse>>::Err(SdkError::service_error(\n                    TestError,\n                    HttpResponse::new(StatusCode::try_from(400).unwrap(), SdkBody::empty()),\n                ))\n            })\n            .build();\n\n        match orchestrator.orchestrate().await {\n            Err(WaiterError::FailureState(err)) => match err.final_poll().as_result() {\n                Err(TestError) => { /* good */ }\n                result => panic!(\"unexpected final poll: {result:?}\"),\n            },\n            result => panic!(\"unexpected result: {result:?}\"),\n        }\n    }\n\n    #[tokio::test]\n    async fn modeled_error_matched_as_success() {\n        let _logs = show_test_logs();\n        let (time_source, sleep_impl) = tick_advance_time_and_sleep();\n        let orchestrator = test_orchestrator(sleep_impl, time_source)\n            .acceptor(|_result: Result<&usize, &TestError>| AcceptorState::Success)\n            .operation(|| async {\n                Result::<usize, SdkError<TestError, HttpResponse>>::Err(SdkError::service_error(\n                    TestError,\n                    HttpResponse::new(StatusCode::try_from(400).unwrap(), SdkBody::empty()),\n                ))\n            })\n            .build();\n\n        let result = orchestrator.orchestrate().await;\n        assert!(result.is_ok());\n        assert!(result.unwrap().as_result().is_err());\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime/src/client.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/// Smithy auth scheme implementations.\npub mod auth;\n\npub mod defaults;\n\npub mod dns;\n\npub mod endpoint;\n\n/// Built-in Smithy HTTP clients and connectors.\n///\n/// See the [module docs in `aws-smithy-runtime-api`](aws_smithy_runtime_api::client::http)\n/// for more information about clients and connectors.\npub mod http;\n\n/// Utility to simplify config building for config and config overrides.\npub mod config_override;\n\n/// The client orchestrator implementation\npub mod orchestrator;\n\n/// Smithy code related to retry handling and token buckets.\n///\n/// This code defines when and how failed requests should be retried. It also defines the behavior\n/// used to limit the rate at which requests are sent.\npub mod retries;\n\n/// Utilities for testing orchestrators. An orchestrator missing required components will panic when\n/// run. This module contains stub components that can be used when you only care about testing some\n/// specific aspect of the orchestrator.\n#[cfg(any(feature = \"test-util\", feature = \"legacy-test-util\"))]\npub mod test_util;\n\nmod timeout;\n\n/// Smithy identity used by auth and signing.\npub mod identity;\n\n/// Interceptors for Smithy clients.\npub mod interceptors;\n\n/// Stalled stream protection for clients\npub mod stalled_stream_protection;\n\n/// Generic Smithy SDK feature identifies.\n#[doc(hidden)]\npub mod sdk_feature;\n\n/// Smithy support-code for code generated waiters.\npub mod waiters;\n\n/// Tooling for collecting client metrics.\npub mod metrics;\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime/src/expiring_cache.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::future::Future;\nuse std::marker::PhantomData;\nuse std::sync::Arc;\nuse std::time::{Duration, SystemTime};\nuse tokio::sync::{OnceCell, RwLock};\n\n/// Expiry-aware cache\n///\n/// [`ExpiringCache`] implements two important features:\n/// 1. Respect expiry of contents\n/// 2. Deduplicate load requests to prevent thundering herds when no value is present.\n#[derive(Debug)]\npub struct ExpiringCache<T, E> {\n    /// Amount of time before the actual expiration time\n    /// when the value is considered expired.\n    buffer_time: Duration,\n    value: Arc<RwLock<OnceCell<(T, SystemTime)>>>,\n    _phantom: PhantomData<E>,\n}\n\nimpl<T, E> Clone for ExpiringCache<T, E> {\n    fn clone(&self) -> Self {\n        Self {\n            buffer_time: self.buffer_time,\n            value: self.value.clone(),\n            _phantom: Default::default(),\n        }\n    }\n}\n\nimpl<T, E> ExpiringCache<T, E>\nwhere\n    T: Clone,\n{\n    /// Creates `ExpiringCache` with the given `buffer_time`.\n    pub fn new(buffer_time: Duration) -> Self {\n        ExpiringCache {\n            buffer_time,\n            value: Arc::new(RwLock::new(OnceCell::new())),\n            _phantom: Default::default(),\n        }\n    }\n\n    #[cfg(all(test, feature = \"client\", feature = \"http-auth\"))]\n    async fn get(&self) -> Option<T>\n    where\n        T: Clone,\n    {\n        self.value\n            .read()\n            .await\n            .get()\n            .cloned()\n            .map(|(creds, _expiry)| creds)\n    }\n\n    /// Attempts to refresh the cached value with the given future.\n    /// If multiple threads attempt to refresh at the same time, one of them will win,\n    /// and the others will await that thread's result rather than multiple refreshes occurring.\n    /// The function given to acquire a value future, `f`, will not be called\n    /// if another thread is chosen to load the value.\n    pub async fn get_or_load<F, Fut>(&self, f: F) -> Result<T, E>\n    where\n        F: FnOnce() -> Fut,\n        Fut: Future<Output = Result<(T, SystemTime), E>>,\n    {\n        let lock = self.value.read().await;\n        let future = lock.get_or_try_init(f);\n        future.await.map(|(value, _expiry)| value.clone())\n    }\n\n    /// If the value is expired, clears the cache. Otherwise, yields the current value.\n    pub async fn yield_or_clear_if_expired(&self, now: SystemTime) -> Option<T> {\n        // Short-circuit if the value is not expired\n        if let Some((value, expiry)) = self.value.read().await.get() {\n            if !expired(*expiry, self.buffer_time, now) {\n                return Some(value.clone());\n            } else {\n                tracing::debug!(expiry = ?expiry, delta= ?now.duration_since(*expiry), \"An item existed but it expired.\")\n            }\n        }\n\n        // Acquire a write lock to clear the cache, but then once the lock is acquired,\n        // check again that the value is not already cleared. If it has been cleared,\n        // then another thread is refreshing the cache by the time the write lock was acquired.\n        let mut lock = self.value.write().await;\n        if let Some((_value, expiration)) = lock.get() {\n            // Also check that we're clearing the expired value and not a value\n            // that has been refreshed by another thread.\n            if expired(*expiration, self.buffer_time, now) {\n                *lock = OnceCell::new();\n            }\n        }\n        None\n    }\n}\n\nfn expired(expiration: SystemTime, buffer_time: Duration, now: SystemTime) -> bool {\n    now >= (expiration - buffer_time)\n}\n\n#[cfg(all(test, feature = \"client\", feature = \"http-auth\"))]\nmod tests {\n    use super::{expired, ExpiringCache};\n    use aws_smithy_runtime_api::box_error::BoxError;\n    use aws_smithy_runtime_api::client::identity::http::Token;\n    use aws_smithy_runtime_api::client::identity::Identity;\n    use std::time::{Duration, SystemTime};\n    use tracing_test::traced_test;\n\n    fn identity(expired_secs: u64) -> Result<(Identity, SystemTime), BoxError> {\n        let expiration = epoch_secs(expired_secs);\n        let identity = Identity::new(Token::new(\"test\", Some(expiration)), Some(expiration));\n        Ok((identity, expiration))\n    }\n\n    fn epoch_secs(secs: u64) -> SystemTime {\n        SystemTime::UNIX_EPOCH + Duration::from_secs(secs)\n    }\n\n    #[test]\n    fn expired_check() {\n        let ts = epoch_secs(100);\n        assert!(expired(ts, Duration::from_secs(10), epoch_secs(1000)));\n        assert!(expired(ts, Duration::from_secs(10), epoch_secs(90)));\n        assert!(!expired(ts, Duration::from_secs(10), epoch_secs(10)));\n    }\n\n    #[traced_test]\n    #[tokio::test]\n    async fn cache_clears_if_expired_only() {\n        let cache = ExpiringCache::new(Duration::from_secs(10));\n        assert!(cache\n            .yield_or_clear_if_expired(epoch_secs(100))\n            .await\n            .is_none());\n\n        cache.get_or_load(|| async { identity(100) }).await.unwrap();\n        assert_eq!(\n            Some(epoch_secs(100)),\n            cache.get().await.unwrap().expiration()\n        );\n\n        // It should not clear the credentials if they're not expired\n        assert_eq!(\n            Some(epoch_secs(100)),\n            cache\n                .yield_or_clear_if_expired(epoch_secs(10))\n                .await\n                .unwrap()\n                .expiration()\n        );\n\n        // It should clear the credentials if they're expired\n        assert!(cache\n            .yield_or_clear_if_expired(epoch_secs(500))\n            .await\n            .is_none());\n        assert!(cache.get().await.is_none());\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime/src/lib.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/* Automatically managed default lints */\n#![cfg_attr(docsrs, feature(doc_cfg))]\n/* End of automatically managed default lints */\n//! Runtime support logic and types for smithy-rs generated code.\n//!\n//! # Crate Features\n//!\n//! - `http-auth`: Enables auth scheme and identity resolver implementations for HTTP API Key,\n//!   Basic Auth, Bearer Token, and Digest Auth.\n//! - `test-util`: Enables utilities for unit tests. DO NOT ENABLE IN PRODUCTION.\n\n#![warn(\n    missing_docs,\n    rustdoc::missing_crate_level_docs,\n    unreachable_pub,\n    rust_2018_idioms\n)]\n\n/// Runtime support logic for generated clients.\n#[cfg(feature = \"client\")]\npub mod client;\n\n/// Cache for entries that have an expiration time.\npub mod expiring_cache;\n\n/// A data structure for persisting and sharing state between multiple clients.\npub mod static_partition_map;\n\n/// General testing utilities.\n#[cfg(any(feature = \"test-util\", feature = \"legacy-test-util\"))]\npub mod test_util;\n\n// legacy test-util, re-export of macros\n#[cfg(feature = \"wire-mock\")]\npub use aws_smithy_http_client::test_util::wire::ev;\n#[cfg(feature = \"wire-mock\")]\npub use aws_smithy_http_client::test_util::wire::match_events;\n#[cfg(feature = \"wire-mock\")]\npub use aws_smithy_http_client::test_util::wire::matcher;\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime/src/static_partition_map.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::collections::HashMap;\nuse std::hash::Hash;\nuse std::sync::{Mutex, MutexGuard, OnceLock};\n\n/// A data structure for persisting and sharing state between multiple clients.\n///\n/// Some state should be shared between multiple clients. For example, when creating multiple clients\n/// for the same service, it's desirable to share a client rate limiter. This way, when one client\n/// receives a throttling response, the other clients will be aware of it as well.\n///\n/// Whether clients share state is dependent on their partition key `K`. Going back to the client\n/// rate limiter example, `K` would be a struct containing the name of the service as well as the\n/// client's configured region, since receiving throttling responses in `us-east-1` shouldn't\n/// throttle requests to the same service made in other regions.\n///\n/// Values stored in a `StaticPartitionMap` will be cloned whenever they are requested. Values must\n/// be initialized before they can be retrieved, and the `StaticPartitionMap::get_or_init` method is\n/// how you can ensure this.\n///\n/// # Example\n///\n/// ```\n///use std::sync::{Arc, Mutex};\n/// use aws_smithy_runtime::static_partition_map::StaticPartitionMap;\n///\n/// // The shared state must be `Clone` and will be internally mutable. Deriving `Default` isn't\n/// // necessary, but allows us to use the `StaticPartitionMap::get_or_init_default` method.\n/// #[derive(Clone, Default)]\n/// pub struct SomeSharedState {\n///     inner: Arc<Mutex<Inner>>\n/// }\n///\n/// #[derive(Default)]\n/// struct Inner {\n///     // Some shared state...\n/// }\n///\n/// // `Clone`, `Hash`, and `Eq` are all required trait impls for partition keys\n/// #[derive(Clone, Hash, PartialEq, Eq)]\n/// pub struct SharedStatePartition {\n///     region: String,\n///     service_name: String,\n/// }\n///\n/// impl SharedStatePartition {\n///     pub fn new(region: impl Into<String>, service_name: impl Into<String>) -> Self {\n///         Self { region: region.into(), service_name: service_name.into() }\n///     }\n/// }\n///\n/// static SOME_SHARED_STATE: StaticPartitionMap<SharedStatePartition, SomeSharedState> = StaticPartitionMap::new();\n///\n/// struct Client {\n///     shared_state: SomeSharedState,\n/// }\n///\n/// impl Client {\n///     pub fn new() -> Self {\n///         let key = SharedStatePartition::new(\"us-east-1\", \"example_service_20230628\");\n///         Self {\n///             // If the stored value implements `Default`, you can call the\n///             // `StaticPartitionMap::get_or_init_default` convenience method.\n///             shared_state: SOME_SHARED_STATE.get_or_init_default(key),\n///         }\n///     }\n/// }\n/// ```\n#[derive(Debug, Default)]\npub struct StaticPartitionMap<K, V> {\n    inner: OnceLock<Mutex<HashMap<K, V>>>,\n}\n\nimpl<K, V> StaticPartitionMap<K, V> {\n    /// Creates a new `StaticPartitionMap`.\n    pub const fn new() -> Self {\n        Self {\n            inner: OnceLock::new(),\n        }\n    }\n}\n\nimpl<K, V> StaticPartitionMap<K, V>\nwhere\n    K: Eq + Hash,\n{\n    fn get_or_init_inner(&self) -> MutexGuard<'_, HashMap<K, V>> {\n        self.inner\n            // At the very least, we'll always be storing the default state.\n            .get_or_init(|| Mutex::new(HashMap::with_capacity(1)))\n            .lock()\n            .unwrap()\n    }\n}\n\nimpl<K, V> StaticPartitionMap<K, V>\nwhere\n    K: Eq + Hash,\n    V: Clone,\n{\n    /// Gets the value for the given partition key.\n    #[must_use]\n    pub fn get(&self, partition_key: K) -> Option<V> {\n        self.get_or_init_inner().get(&partition_key).cloned()\n    }\n\n    /// Gets the value for the given partition key, initializing it with `init` if it doesn't exist.\n    #[must_use]\n    pub fn get_or_init<F>(&self, partition_key: K, init: F) -> V\n    where\n        F: FnOnce() -> V,\n    {\n        let mut inner = self.get_or_init_inner();\n        let v = inner.entry(partition_key).or_insert_with(init);\n        v.clone()\n    }\n}\n\nimpl<K, V> StaticPartitionMap<K, V>\nwhere\n    K: Eq + Hash,\n    V: Clone + Default,\n{\n    /// Gets the value for the given partition key, initializing it if it doesn't exist.\n    #[must_use]\n    pub fn get_or_init_default(&self, partition_key: K) -> V {\n        self.get_or_init(partition_key, V::default)\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::StaticPartitionMap;\n\n    #[test]\n    fn test_keyed_partition_returns_same_value_for_same_key() {\n        let kp = StaticPartitionMap::new();\n        let _ = kp.get_or_init(\"A\", || \"A\".to_owned());\n        let actual = kp.get_or_init(\"A\", || \"B\".to_owned());\n        let expected = \"A\".to_owned();\n        assert_eq!(expected, actual);\n    }\n\n    #[test]\n    fn test_keyed_partition_returns_different_value_for_different_key() {\n        let kp = StaticPartitionMap::new();\n        let _ = kp.get_or_init(\"A\", || \"A\".to_owned());\n        let actual = kp.get_or_init(\"B\", || \"B\".to_owned());\n\n        let expected = \"B\".to_owned();\n        assert_eq!(expected, actual);\n\n        let actual = kp.get(\"A\").unwrap();\n        let expected = \"A\".to_owned();\n        assert_eq!(expected, actual);\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime/src/test_util/assertions.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/// Asserts that a given string value `$str` contains a substring `$expected`.\n///\n/// This macro can also take a custom panic message with formatting.\n#[macro_export]\nmacro_rules! assert_str_contains {\n    ($str:expr, $expected:expr) => {\n        assert_str_contains!($str, $expected, \"\")\n    };\n    ($str:expr, $expected:expr, $($fmt_args:tt)+) => {{\n        let s = $str;\n        let expected = $expected;\n        if !s.contains(&expected) {\n            panic!(\n                \"assertion failed: `str.contains(expected)`\\n{:>8}: {expected}\\n{:>8}: {s}\\n{}\",\n                \"expected\",\n                \"str\",\n                ::std::fmt::format(::std::format_args!($($fmt_args)+)),\n            );\n        }\n    }};\n}\n\n#[cfg(test)]\nmod tests {\n    use std::panic::{catch_unwind, UnwindSafe};\n\n    fn expect_panic(f: impl FnOnce() + UnwindSafe) -> String {\n        *catch_unwind(f)\n            .expect_err(\"it should fail\")\n            .downcast::<String>()\n            .expect(\"it should be a string\")\n    }\n\n    #[test]\n    fn assert_str_contains() {\n        assert_str_contains!(\"foobar\", \"bar\");\n        assert_str_contains!(\"foobar\", \"o\");\n\n        assert_eq!(\n            \"assertion failed: `str.contains(expected)`\\nexpected: not-in-it\\n     str: foobar\\n\",\n            expect_panic(|| assert_str_contains!(\"foobar\", \"not-in-it\"))\n        );\n        assert_eq!(\n            \"assertion failed: `str.contains(expected)`\\nexpected: not-in-it\\n     str: foobar\\nsome custom message\",\n            expect_panic(|| assert_str_contains!(\"foobar\", \"not-in-it\", \"some custom message\"))\n        );\n        assert_eq!(\n            \"assertion failed: `str.contains(expected)`\\nexpected: not-in-it\\n     str: foobar\\nsome custom message with formatting\",\n            expect_panic(|| assert_str_contains!(\"foobar\", \"not-in-it\", \"some custom message with {}\", \"formatting\"))\n        );\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime/src/test_util/capture_test_logs.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::env;\nuse std::io::Write;\nuse std::sync::{Arc, Mutex};\nuse tracing::subscriber::DefaultGuard;\nuse tracing::Level;\nuse tracing_subscriber::fmt::TestWriter;\n\n/// A guard that resets log capturing upon being dropped.\n#[derive(Debug)]\npub struct LogCaptureGuard(#[allow(dead_code)] DefaultGuard);\n\n/// Enables output of test logs to stdout\n///\n/// The `env` filter can be configured to set the log level for different modules\npub fn show_filtered_test_logs(filter: &str) -> LogCaptureGuard {\n    let (mut writer, _rx) = Tee::stdout();\n    writer.loud();\n\n    let subscriber = tracing_subscriber::fmt()\n        .with_env_filter(filter)\n        .with_writer(Mutex::new(writer))\n        .finish();\n    let guard = tracing::subscriber::set_default(subscriber);\n    LogCaptureGuard(guard)\n}\n\n/// Enables output of test logs to stdout at trace level by default.\n///\n/// The env filter can be changed with the `RUST_LOG` environment variable.\n#[must_use]\npub fn show_test_logs() -> LogCaptureGuard {\n    let (mut writer, _rx) = Tee::stdout();\n    writer.loud();\n\n    let env_var = env::var(\"RUST_LOG\").ok();\n    let env_filter = env_var.as_deref().unwrap_or(\"trace\");\n    eprintln!(\n        \"Enabled verbose test logging with env filter {env_filter:?}. \\\n        You can change the env filter with the RUST_LOG environment variable.\"\n    );\n\n    show_filtered_test_logs(env_filter)\n}\n\n/// Capture logs from this test.\n///\n/// The logs will be captured until the `DefaultGuard` is dropped.\n///\n/// *Why use this instead of traced_test?*\n/// This captures _all_ logs, not just logs produced by the current crate.\n#[must_use] // log capturing ceases the instant the `DefaultGuard` is dropped\npub fn capture_test_logs() -> (LogCaptureGuard, Rx) {\n    // it may be helpful to upstream this at some point\n    let (mut writer, rx) = Tee::stdout();\n    if env::var(\"VERBOSE_TEST_LOGS\").is_ok() {\n        eprintln!(\"Enabled verbose test logging.\");\n        writer.loud();\n    } else {\n        eprintln!(\"To see full logs from this test set VERBOSE_TEST_LOGS=true\");\n    }\n    let subscriber = tracing_subscriber::fmt()\n        .with_max_level(Level::TRACE)\n        .with_writer(Mutex::new(writer))\n        .finish();\n    let guard = tracing::subscriber::set_default(subscriber);\n    (LogCaptureGuard(guard), rx)\n}\n\n/// Receiver for the captured logs.\npub struct Rx(Arc<Mutex<Vec<u8>>>);\nimpl Rx {\n    /// Returns the captured logs as a string.\n    ///\n    /// # Panics\n    /// This will panic if the logs are not valid UTF-8.\n    pub fn contents(&self) -> String {\n        String::from_utf8(self.0.lock().unwrap().clone()).unwrap()\n    }\n}\n\nstruct Tee<W> {\n    buf: Arc<Mutex<Vec<u8>>>,\n    quiet: bool,\n    inner: W,\n}\n\nimpl Tee<TestWriter> {\n    fn stdout() -> (Self, Rx) {\n        let buf: Arc<Mutex<Vec<u8>>> = Default::default();\n        (\n            Tee {\n                buf: buf.clone(),\n                quiet: true,\n                inner: TestWriter::new(),\n            },\n            Rx(buf),\n        )\n    }\n}\n\nimpl<W> Tee<W> {\n    fn loud(&mut self) {\n        self.quiet = false;\n    }\n}\n\nimpl<W> Write for Tee<W>\nwhere\n    W: Write,\n{\n    fn write(&mut self, buf: &[u8]) -> std::io::Result<usize> {\n        self.buf.lock().unwrap().extend_from_slice(buf);\n        if !self.quiet {\n            self.inner.write_all(buf)?;\n            Ok(buf.len())\n        } else {\n            Ok(buf.len())\n        }\n    }\n\n    fn flush(&mut self) -> std::io::Result<()> {\n        self.inner.flush()\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime/src/test_util.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/// Utility for capturing and displaying logs during a unit test.\npub mod capture_test_logs;\n\nmod assertions;\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime/tests/reconnect_on_transient_error.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n#![cfg(all(feature = \"client\", feature = \"wire-mock\",))]\n\nuse ::aws_smithy_runtime::client::retries::classifiers::{\n    HttpStatusCodeClassifier, TransientErrorClassifier,\n};\nuse aws_smithy_async::rt::sleep::TokioSleep;\nuse aws_smithy_runtime::client::http::hyper_014::HyperClientBuilder;\nuse aws_smithy_runtime::client::http::test_util::wire::{\n    RecordedEvent, ReplayedEvent, WireMockServer,\n};\nuse aws_smithy_runtime::client::orchestrator::operation::Operation;\nuse aws_smithy_runtime::test_util::capture_test_logs::capture_test_logs;\nuse aws_smithy_runtime::{ev, match_events};\nuse aws_smithy_runtime_api::client::interceptors::context::InterceptorContext;\nuse aws_smithy_runtime_api::client::orchestrator::OrchestratorError;\nuse aws_smithy_runtime_api::client::retries::classifiers::{ClassifyRetry, RetryAction};\nuse aws_smithy_types::body::SdkBody;\nuse aws_smithy_types::retry::{ErrorKind, ProvideErrorKind, ReconnectMode, RetryConfig};\nuse aws_smithy_types::timeout::TimeoutConfig;\nuse hyper_0_14::client::Builder as HyperBuilder;\nuse std::fmt;\nuse std::time::Duration;\n\nconst END_OF_TEST: &str = \"end_of_test\";\n\n#[derive(Debug)]\nstruct OperationError(ErrorKind);\n\nimpl fmt::Display for OperationError {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        write!(f, \"{:?}\", self)\n    }\n}\n\nimpl ProvideErrorKind for OperationError {\n    fn retryable_error_kind(&self) -> Option<ErrorKind> {\n        Some(self.0)\n    }\n\n    fn code(&self) -> Option<&str> {\n        None\n    }\n}\n\nimpl std::error::Error for OperationError {}\n\n#[derive(Debug)]\nstruct TestRetryClassifier;\n\nimpl ClassifyRetry for TestRetryClassifier {\n    fn classify_retry(&self, ctx: &InterceptorContext) -> RetryAction {\n        tracing::info!(\"classifying retry for {ctx:?}\");\n        // Check for a result\n        let output_or_error = ctx.output_or_error();\n        // Check for an error\n        let error = match output_or_error {\n            Some(Ok(_)) | None => return RetryAction::NoActionIndicated,\n            Some(Err(err)) => err,\n        };\n\n        let action = if let Some(err) = error.as_operation_error() {\n            tracing::info!(\"its an operation error: {err:?}\");\n            let err = err.downcast_ref::<OperationError>().unwrap();\n            RetryAction::retryable_error(err.0)\n        } else {\n            tracing::info!(\"its something else... using other classifiers\");\n            let action = TransientErrorClassifier::<OperationError>::new().classify_retry(ctx);\n            if action == RetryAction::NoActionIndicated {\n                HttpStatusCodeClassifier::default().classify_retry(ctx)\n            } else {\n                action\n            }\n        };\n\n        tracing::info!(\"classified as {action:?}\");\n        action\n    }\n\n    fn name(&self) -> &'static str {\n        \"test\"\n    }\n}\n\nasync fn h1_and_h2(events: Vec<ReplayedEvent>, match_clause: impl Fn(&[RecordedEvent])) {\n    wire_level_test(\n        events.clone(),\n        |_b| {},\n        ReconnectMode::ReconnectOnTransientError,\n        &match_clause,\n    )\n    .await;\n    wire_level_test(\n        events,\n        |b| {\n            b.http2_only(true);\n        },\n        ReconnectMode::ReconnectOnTransientError,\n        match_clause,\n    )\n    .await;\n    tracing::info!(\"h2 ok!\");\n}\n\n/// Repeatedly send test operation until `end_of_test` is received\n///\n/// When the test is over, match_clause is evaluated\nasync fn wire_level_test(\n    events: Vec<ReplayedEvent>,\n    hyper_builder_settings: impl Fn(&mut HyperBuilder),\n    reconnect_mode: ReconnectMode,\n    match_clause: impl Fn(&[RecordedEvent]),\n) {\n    let mut hyper_builder = hyper_0_14::Client::builder();\n    hyper_builder_settings(&mut hyper_builder);\n\n    let mock = WireMockServer::start(events).await;\n    let http_client = HyperClientBuilder::new()\n        .hyper_builder(hyper_builder)\n        .build(hyper_0_14::client::HttpConnector::new_with_resolver(\n            mock.dns_resolver(),\n        ));\n\n    let operation = Operation::builder()\n        .service_name(\"test\")\n        .operation_name(\"test\")\n        .no_auth()\n        .endpoint_url(&mock.endpoint_url())\n        .http_client(http_client)\n        .timeout_config(\n            TimeoutConfig::builder()\n                .operation_attempt_timeout(Duration::from_millis(100))\n                .build(),\n        )\n        .standard_retry(&RetryConfig::standard().with_reconnect_mode(reconnect_mode))\n        .retry_classifier(TestRetryClassifier)\n        .sleep_impl(TokioSleep::new())\n        .with_connection_poisoning()\n        .serializer({\n            let endpoint_url = mock.endpoint_url();\n            move |_| {\n                let request = http_02x::Request::builder()\n                    .uri(endpoint_url.clone())\n                    // Make the body non-replayable since we don't actually want to retry\n                    .body(SdkBody::from_body_0_4(SdkBody::from(\"body\")))\n                    .unwrap()\n                    .try_into()\n                    .unwrap();\n                tracing::info!(\"serializing request: {request:?}\");\n                Ok(request)\n            }\n        })\n        .deserializer(|response| {\n            tracing::info!(\"deserializing response: {:?}\", response);\n            match response.status() {\n                s if s.is_success() => {\n                    Ok(String::from_utf8(response.body().bytes().unwrap().into()).unwrap())\n                }\n                s if s.is_client_error() => Err(OrchestratorError::operation(OperationError(\n                    ErrorKind::ServerError,\n                ))),\n                s if s.is_server_error() => Err(OrchestratorError::operation(OperationError(\n                    ErrorKind::TransientError,\n                ))),\n                _ => panic!(\"unexpected status: {}\", response.status()),\n            }\n        })\n        .build();\n\n    let mut iteration = 0;\n    loop {\n        tracing::info!(\"iteration {iteration}...\");\n        match operation.invoke(()).await {\n            Ok(resp) => {\n                tracing::info!(\"response: {:?}\", resp);\n                if resp == END_OF_TEST {\n                    break;\n                }\n            }\n            Err(e) => tracing::info!(\"error: {:?}\", e),\n        }\n        iteration += 1;\n        if iteration > 50 {\n            panic!(\"probably an infinite loop; no satisfying 'end_of_test' response received\");\n        }\n    }\n    let events = mock.events();\n    match_clause(&events);\n    mock.shutdown();\n}\n\n#[tokio::test]\nasync fn non_transient_errors_no_reconnect() {\n    let _logs = capture_test_logs();\n    h1_and_h2(\n        vec![\n            ReplayedEvent::status(400),\n            ReplayedEvent::with_body(END_OF_TEST),\n        ],\n        match_events!(ev!(dns), ev!(connect), ev!(http(400)), ev!(http(200))),\n    )\n    .await\n}\n\n#[tokio::test]\nasync fn reestablish_dns_on_503() {\n    let _logs = capture_test_logs();\n    h1_and_h2(\n        vec![\n            ReplayedEvent::status(503),\n            ReplayedEvent::status(503),\n            ReplayedEvent::status(503),\n            ReplayedEvent::with_body(END_OF_TEST),\n        ],\n        match_events!(\n            // first request\n            ev!(dns),\n            ev!(connect),\n            ev!(http(503)),\n            // second request\n            ev!(dns),\n            ev!(connect),\n            ev!(http(503)),\n            // third request\n            ev!(dns),\n            ev!(connect),\n            ev!(http(503)),\n            // all good\n            ev!(dns),\n            ev!(connect),\n            ev!(http(200))\n        ),\n    )\n    .await;\n}\n\n#[tokio::test]\nasync fn connection_shared_on_success() {\n    let _logs = capture_test_logs();\n    h1_and_h2(\n        vec![\n            ReplayedEvent::ok(),\n            ReplayedEvent::ok(),\n            ReplayedEvent::status(503),\n            ReplayedEvent::with_body(END_OF_TEST),\n        ],\n        match_events!(\n            ev!(dns),\n            ev!(connect),\n            ev!(http(200)),\n            ev!(http(200)),\n            ev!(http(503)),\n            ev!(dns),\n            ev!(connect),\n            ev!(http(200))\n        ),\n    )\n    .await;\n}\n\n#[tokio::test]\nasync fn no_reconnect_when_disabled() {\n    let _logs = capture_test_logs();\n    wire_level_test(\n        vec![\n            ReplayedEvent::status(503),\n            ReplayedEvent::with_body(END_OF_TEST),\n        ],\n        |_b| {},\n        ReconnectMode::ReuseAllConnections,\n        match_events!(ev!(dns), ev!(connect), ev!(http(503)), ev!(http(200))),\n    )\n    .await;\n}\n\n#[tokio::test]\nasync fn connection_reestablished_after_timeout() {\n    let _logs = capture_test_logs();\n    h1_and_h2(\n        vec![\n            ReplayedEvent::ok(),\n            ReplayedEvent::Timeout,\n            ReplayedEvent::ok(),\n            ReplayedEvent::Timeout,\n            ReplayedEvent::with_body(END_OF_TEST),\n        ],\n        match_events!(\n            // first connection\n            ev!(dns),\n            ev!(connect),\n            ev!(http(200)),\n            // reuse but got a timeout\n            ev!(timeout),\n            // so we reconnect\n            ev!(dns),\n            ev!(connect),\n            ev!(http(200)),\n            ev!(timeout),\n            ev!(dns),\n            ev!(connect),\n            ev!(http(200))\n        ),\n    )\n    .await;\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime/tests/retries.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n#![cfg(all(feature = \"client\", feature = \"test-util\"))]\n\nuse aws_smithy_runtime::client::http::test_util::infallible_client_fn;\nuse aws_smithy_runtime::client::retries::classifiers::HttpStatusCodeClassifier;\nuse aws_smithy_runtime::client::retries::RetryPartition;\nuse aws_smithy_runtime::test_util::capture_test_logs::capture_test_logs;\npub use aws_smithy_runtime::{\n    client::orchestrator::operation::Operation, test_util::capture_test_logs::show_test_logs,\n};\nuse aws_smithy_runtime_api::client::http::SharedHttpClient;\nuse aws_smithy_runtime_api::client::interceptors::context::BeforeTransmitInterceptorContextRef;\nuse aws_smithy_runtime_api::client::interceptors::Intercept;\nuse aws_smithy_runtime_api::client::result::ConnectorError;\npub use aws_smithy_runtime_api::{\n    box_error::BoxError,\n    client::{\n        http::{HttpClient, HttpConnector},\n        interceptors::context::{Error, Output},\n        orchestrator::{HttpRequest, HttpResponse, OrchestratorError},\n        runtime_components::RuntimeComponents,\n        ser_de::DeserializeResponse,\n    },\n    shared::IntoShared,\n};\nuse aws_smithy_types::config_bag::ConfigBag;\nuse aws_smithy_types::retry::RetryConfig;\npub use aws_smithy_types::{body::SdkBody, timeout::TimeoutConfig};\npub use http_body_04x::Body;\npub use std::{\n    convert::Infallible,\n    sync::{Arc, Mutex},\n    time::Duration,\n};\n\n#[derive(Debug, Clone)]\nstruct OperationState {\n    inner: Arc<Mutex<Inner>>,\n}\n\n#[derive(Debug, Default)]\nstruct Inner {\n    attempts: usize,\n    retry_partition: Option<String>,\n}\n\nimpl OperationState {\n    fn new() -> Self {\n        OperationState {\n            inner: Arc::new(Mutex::new(Inner::default())),\n        }\n    }\n    fn attempts(&self) -> usize {\n        self.inner.lock().unwrap().attempts\n    }\n\n    fn retry_partition(&self) -> String {\n        let inner = self.inner.lock().unwrap();\n        inner\n            .retry_partition\n            .as_ref()\n            .expect(\"retry partition set\")\n            .clone()\n    }\n}\n\nimpl Intercept for OperationState {\n    fn name(&self) -> &'static str {\n        \"OperationState\"\n    }\n\n    fn read_before_attempt(\n        &self,\n        _context: &BeforeTransmitInterceptorContextRef<'_>,\n        _runtime_components: &RuntimeComponents,\n        cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        let mut inner = self.inner.lock().unwrap();\n        inner.attempts += 1;\n        let retry_partition = cfg\n            .load::<RetryPartition>()\n            .expect(\"set by default retry plugin\");\n        inner.retry_partition = Some(retry_partition.to_string());\n        Ok(())\n    }\n}\n\nfn operation(\n    service: impl Into<String>,\n    max_attempts: usize,\n    http_client: impl Into<SharedHttpClient>,\n) -> (Operation<(), String, Infallible>, OperationState) {\n    #[derive(Debug)]\n    struct Deserializer;\n    impl DeserializeResponse for Deserializer {\n        fn deserialize_nonstreaming(\n            &self,\n            resp: &HttpResponse,\n        ) -> Result<Output, OrchestratorError<Error>> {\n            if resp.status().is_success() {\n                Ok(Output::erase(\"output\".to_owned()))\n            } else {\n                Err(OrchestratorError::connector(ConnectorError::io(\n                    \"mock connector error\".into(),\n                )))\n            }\n        }\n    }\n\n    let attempts = OperationState::new();\n\n    let op = Operation::builder()\n        .service_name(service.into())\n        .operation_name(\"test\")\n        .http_client(http_client.into())\n        .endpoint_url(\"http://localhost:1234/doesntmatter\")\n        .no_auth()\n        .retry_classifier(HttpStatusCodeClassifier::default())\n        .standard_retry(\n            &RetryConfig::standard()\n                .with_max_attempts(max_attempts as u32)\n                .with_max_backoff(Duration::from_millis(1)),\n        )\n        .timeout_config(TimeoutConfig::disabled())\n        .serializer(|_body: ()| Ok(HttpRequest::new(SdkBody::empty())))\n        .deserializer_impl(Deserializer)\n        .interceptor(attempts.clone())\n        .build();\n\n    (op, attempts)\n}\n\n/// Test we exhaust the token bucket long before we exhaust max attempts\n///\n/// see [aws-sdk-rust#1234](https://github.com/awslabs/aws-sdk-rust/issues/1234)\n#[tokio::test]\nasync fn token_bucket_exhausted_before_max_attempts() {\n    let (_guard, logs) = capture_test_logs();\n    let max_attempts = 100;\n\n    let http_client = infallible_client_fn(|_req| {\n        http_02x::Response::builder()\n            .status(503)\n            .body(SdkBody::empty())\n            .unwrap()\n    });\n    let (op, state) = operation(\"test\", max_attempts, http_client);\n\n    let output = op.invoke(()).await;\n    output.expect_err(\"operation should fail\");\n    let attempts = state.attempts();\n    assert_eq!(\"test\", state.retry_partition());\n    assert!(\n        attempts < max_attempts && attempts > 1,\n        \"attempts = {}\",\n        attempts\n    );\n    logs.contents().contains(\n        \"not enough retry quota is available for another attempt so no retry will be attempted\",\n    );\n}\n\n/// Test token bucket partitioning\n///\n/// see [aws-sdk-rust#1234](https://github.com/awslabs/aws-sdk-rust/issues/1234)\n#[tokio::test]\nasync fn token_bucket_partitioning() {\n    let _logs = show_test_logs();\n    let max_attempts = 100;\n\n    let http_client = infallible_client_fn(|_req| {\n        http_02x::Response::builder()\n            .status(503)\n            .body(SdkBody::empty())\n            .unwrap()\n    });\n    let (op1, _) = operation(\"service-1\", max_attempts, http_client.clone());\n\n    op1.invoke(()).await.expect_err(\"operation should fail\");\n\n    // uses same partition, should trigger exhaustion sooner\n    let (op2, state) = operation(\"service-1\", max_attempts, http_client.clone());\n    let output2 = op2.invoke(()).await;\n    output2.expect_err(\"operation should fail\");\n    let attempts = state.attempts();\n    assert_eq!(\"service-1\", state.retry_partition());\n    assert_eq!(attempts, 1);\n\n    // different partition, should use different token bucket\n    let (op3, state) = operation(\"service-2\", max_attempts, http_client);\n    let output3 = op3.invoke(()).await;\n    output3.expect_err(\"operation should fail\");\n    let attempts = state.attempts();\n    assert_eq!(\"service-2\", state.retry_partition());\n    assert!(\n        attempts < max_attempts && attempts > 1,\n        \"attempts = {}\",\n        attempts\n    );\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime/tests/stalled_stream_common.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n#![cfg(all(\n    feature = \"client\",\n    any(feature = \"test-util\", feature = \"legacy-test-util\")\n))]\n// Extra imports are used by stalled_stream_download and stalled_stream_upload as conveniences\n#![allow(unused_imports)]\n\npub use aws_smithy_async::{\n    test_util::tick_advance_sleep::{\n        tick_advance_time_and_sleep, TickAdvanceSleep, TickAdvanceTime,\n    },\n    time::TimeSource,\n};\npub use aws_smithy_runtime::{\n    assert_str_contains,\n    client::{\n        orchestrator::operation::Operation,\n        stalled_stream_protection::StalledStreamProtectionInterceptor,\n    },\n    test_util::capture_test_logs::show_test_logs,\n};\npub use aws_smithy_runtime_api::{\n    box_error::BoxError,\n    client::{\n        http::{\n            HttpClient, HttpConnector, HttpConnectorFuture, HttpConnectorSettings,\n            SharedHttpConnector,\n        },\n        interceptors::context::{Error, Output},\n        orchestrator::{HttpRequest, HttpResponse, OrchestratorError},\n        result::SdkError,\n        runtime_components::RuntimeComponents,\n        ser_de::DeserializeResponse,\n        stalled_stream_protection::StalledStreamProtectionConfig,\n    },\n    http::{Response, StatusCode},\n    shared::IntoShared,\n};\npub use aws_smithy_types::{\n    body::SdkBody, error::display::DisplayErrorContext, timeout::TimeoutConfig,\n};\npub use bytes::Bytes;\npub use pin_utils::pin_mut;\npub use std::{\n    collections::VecDeque,\n    convert::Infallible,\n    future::poll_fn,\n    mem,\n    pin::Pin,\n    sync::{Arc, Mutex},\n    task::{Context, Poll},\n    time::Duration,\n};\npub use tracing::{info, Instrument as _};\n\n/// No really, it's 42 bytes long... super neat\npub const NEAT_DATA: Bytes = Bytes::from_static(b\"some really neat data\");\n\n/// Ticks time forward by the given duration, and logs the current time for debugging.\n#[macro_export]\nmacro_rules! tick {\n    ($ticker:ident, $duration:expr) => {\n        $ticker.tick($duration).await;\n        let now = $ticker\n            .now()\n            .duration_since(std::time::SystemTime::UNIX_EPOCH)\n            .unwrap();\n        tracing::info!(\"ticked {:?}, now at {:?}\", $duration, now);\n    };\n}\n\n#[derive(Debug)]\npub struct FakeServer(pub SharedHttpConnector);\nimpl HttpClient for FakeServer {\n    fn http_connector(\n        &self,\n        _settings: &HttpConnectorSettings,\n        _components: &RuntimeComponents,\n    ) -> SharedHttpConnector {\n        self.0.clone()\n    }\n}\n\nstruct ChannelBody {\n    receiver: tokio::sync::mpsc::Receiver<Bytes>,\n}\n\nimpl http_body_1x::Body for ChannelBody {\n    type Data = Bytes;\n    type Error = Infallible;\n\n    fn poll_frame(\n        mut self: Pin<&mut Self>,\n        cx: &mut Context<'_>,\n    ) -> Poll<Option<Result<http_body_1x::Frame<Self::Data>, Self::Error>>> {\n        match self.receiver.poll_recv(cx) {\n            Poll::Ready(value) => Poll::Ready(value.map(|b| Ok(http_body_1x::Frame::data(b)))),\n            Poll::Pending => Poll::Pending,\n        }\n    }\n}\n\npub fn channel_body() -> (SdkBody, tokio::sync::mpsc::Sender<Bytes>) {\n    let (sender, receiver) = tokio::sync::mpsc::channel(1000);\n    (SdkBody::from_body_1_x(ChannelBody { receiver }), sender)\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime/tests/stalled_stream_download.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n#![cfg(all(\n    feature = \"client\",\n    any(feature = \"test-util\", feature = \"legacy-test-util\")\n))]\n\nuse std::time::Duration;\nuse tokio::sync::mpsc::channel;\nuse tokio::sync::Barrier;\n\n#[macro_use]\nmod stalled_stream_common;\nuse stalled_stream_common::*;\n\n/// Scenario: Successfully download at a rate above the minimum throughput.\n/// Expected: MUST NOT timeout.\n#[tokio::test]\nasync fn download_success() {\n    let _logs = show_test_logs();\n\n    let (time, sleep) = tick_advance_time_and_sleep();\n    let (server, response_sender) = channel_server();\n    let op = operation(server, time.clone(), sleep);\n\n    let server = tokio::spawn(async move {\n        for _ in 1..100 {\n            response_sender.send(NEAT_DATA).await.unwrap();\n            tick!(time, Duration::from_secs(1));\n        }\n        drop(response_sender);\n        tick!(time, Duration::from_secs(1));\n    });\n\n    let response_body = op.invoke(()).await.expect(\"initial success\");\n    let result = eagerly_consume(response_body).await;\n    server.await.unwrap();\n\n    result.expect(\"response MUST NOT timeout\");\n}\n\n/// Scenario: Download takes a some time to start, but then goes normally.\n/// Expected: MUT NOT timeout.\n#[tokio::test]\nasync fn download_slow_start() {\n    let _logs = show_test_logs();\n\n    let (time, sleep) = tick_advance_time_and_sleep();\n    let (server, response_sender) = channel_server();\n    let op = operation(server, time.clone(), sleep);\n\n    let server = tokio::spawn(async move {\n        // Delay almost to the end of the grace period before sending anything\n        tick!(time, Duration::from_secs(4));\n        for _ in 1..100 {\n            response_sender.send(NEAT_DATA).await.unwrap();\n            tick!(time, Duration::from_secs(1));\n        }\n        drop(response_sender);\n        tick!(time, Duration::from_secs(1));\n    });\n\n    let response_body = op.invoke(()).await.expect(\"initial success\");\n    let result = eagerly_consume(response_body).await;\n    server.await.unwrap();\n\n    result.expect(\"response MUST NOT timeout\");\n}\n\n/// Scenario: Download starts fine, and then slowly falls below minimum throughput.\n/// Expected: MUST timeout.\n#[tokio::test]\nasync fn download_too_slow() {\n    let _logs = show_test_logs();\n\n    let (time, sleep) = tick_advance_time_and_sleep();\n    let (server, response_sender) = channel_server();\n    let op = operation(server, time.clone(), sleep);\n\n    let server = tokio::spawn(async move {\n        // Get slower with every poll\n        for delay in 1..100 {\n            let _ = response_sender.send(NEAT_DATA).await;\n            tick!(time, Duration::from_secs(delay));\n        }\n        drop(response_sender);\n        tick!(time, Duration::from_secs(1));\n    });\n\n    let response_body = op.invoke(()).await.expect(\"initial success\");\n    let result = eagerly_consume(response_body).await;\n    server.await.unwrap();\n\n    let err = result.expect_err(\"should have timed out\");\n    assert_str_contains!(\n        DisplayErrorContext(err.as_ref()).to_string(),\n        \"minimum throughput was specified at 1 B/s, but throughput of 0 B/s was observed\"\n    );\n}\n\n/// Scenario: Download starts fine, and then the server stalls and stops sending data.\n/// Expected: MUST timeout.\n#[tokio::test]\nasync fn download_stalls() {\n    let _logs = show_test_logs();\n\n    let (time, sleep) = tick_advance_time_and_sleep();\n    let (server, response_sender) = channel_server();\n    let op = operation(server, time.clone(), sleep);\n    let barrier = Arc::new(Barrier::new(2));\n\n    let c = barrier.clone();\n    let server = tokio::spawn(async move {\n        c.wait().await;\n        for i in 1..10 {\n            tracing::debug!(\"send {i}\");\n            response_sender.send(NEAT_DATA).await.unwrap();\n            tick!(time, Duration::from_secs(1));\n        }\n        tick!(time, Duration::from_secs(10));\n    });\n\n    let response_body = op.invoke(()).await.expect(\"initial success\");\n    let result = tokio::spawn(async move {\n        barrier.wait().await;\n        eagerly_consume(response_body).await\n    });\n    server.await.unwrap();\n\n    let err = result\n        .await\n        .expect(\"no panics\")\n        .expect_err(\"should have timed out\");\n    assert_str_contains!(\n        DisplayErrorContext(err.as_ref()).to_string(),\n        \"minimum throughput was specified at 1 B/s, but throughput of 0 B/s was observed\"\n    );\n}\n\n/// Scenario: Download starts fine, but then the server stalls for a time within the\n///           grace period. Following that, it starts sending data again.\n/// Expected: MUST NOT timeout.\n#[tokio::test]\nasync fn download_stall_recovery_in_grace_period() {\n    let _logs = show_test_logs();\n\n    let (time, sleep) = tick_advance_time_and_sleep();\n    let (server, response_sender) = channel_server();\n    let op = operation(server, time.clone(), sleep);\n\n    let server = tokio::spawn(async move {\n        for _ in 1..10 {\n            response_sender.send(NEAT_DATA).await.unwrap();\n            tick!(time, Duration::from_secs(1));\n        }\n        // Delay almost to the end of the grace period\n        tick!(time, Duration::from_secs(4));\n        // And now recover\n        for _ in 1..10 {\n            response_sender.send(NEAT_DATA).await.unwrap();\n            tick!(time, Duration::from_secs(1));\n        }\n        drop(response_sender);\n        tick!(time, Duration::from_secs(1));\n    });\n\n    let response_body = op.invoke(()).await.expect(\"initial success\");\n    let result = eagerly_consume(response_body).await;\n    server.await.unwrap();\n\n    result.expect(\"response MUST NOT timeout\");\n}\n\n/// Scenario: The server sends data fast enough, but the customer doesn't consume the\n///           data fast enough.\n/// Expected: MUST NOT timeout.\n#[tokio::test]\nasync fn user_downloads_data_too_slowly() {\n    let _logs = show_test_logs();\n\n    let (time, sleep) = tick_advance_time_and_sleep();\n    let (server, response_sender) = channel_server();\n    let op = operation(server, time.clone(), sleep);\n\n    let server = tokio::spawn(async move {\n        for _ in 1..100 {\n            response_sender.send(NEAT_DATA).await.unwrap();\n        }\n        drop(response_sender);\n    });\n\n    let response_body = op.invoke(()).await.expect(\"initial success\");\n    let result = slowly_consume(time, response_body).await;\n    server.await.unwrap();\n\n    result.expect(\"response MUST NOT timeout\");\n}\n\n/// Scenario: Derived from the reproduction steps in https://github.com/awslabs/aws-sdk-rust/issues/1202.\n/// Expected: MUST NOT timeout.\n#[tokio::test]\nasync fn user_polls_pending_followed_by_data_for_every_bin_in_throughput_logs() {\n    let _logs = show_test_logs();\n\n    let (time, sleep) = tick_advance_time_and_sleep();\n    let (server, response_sender) = channel_server();\n    let op = operation(server, time.clone(), sleep);\n\n    let (tx_server, mut rx_server) = channel(1);\n    let (tx_client, rx_client) = channel(1);\n\n    let server = tokio::spawn(async move {\n        for _ in 1..100 {\n            // Block until a signal has been received\n            let _ = rx_server.recv().await;\n            if response_sender.send(NEAT_DATA).await.is_err() {\n                // The client has shut down due to a minimum throughput detection error\n                break;\n            }\n        }\n        drop(response_sender);\n    });\n\n    let _ticker = tokio::spawn({\n        async move {\n            // Each `Bin` has a time resolution of 100ms. In every iteration, the client will go first, yielding\n            // a `Poll::Pending` in the first half of the allotted time. The server will then take its turn in the\n            // second half to generate data, allowing the client to yield a `Poll::Ready` immediately after.\n            // This creates a consistent pattern in throughput logs: within each 100ms interval, a newly created `Bin`\n            // will be assigned a `BinLabel::Pending`, followed by an attempt to assign `BinLabel::TransferredBytes` to\n            // the same `Bin`.\n            loop {\n                tick!(time, Duration::from_millis(50));\n                // We don't `unwrap` here since it will eventually fail when the client shuts down due to the minimum\n                // throughput detection error.\n                let _ = tx_client.send(()).await;\n                tick!(time, Duration::from_millis(50));\n                // We don't `unwrap` here since it will eventually fail when the server exits due to the client shutting\n                // down due to a minimum throughput detection error.\n                let _ = tx_server.send(()).await;\n            }\n        }\n    });\n\n    let response_body = op.invoke(()).await.expect(\"initial success\");\n    let result = tokio::spawn(consume_on_signal(rx_client, response_body));\n    server.await.unwrap();\n\n    result\n        .await\n        .expect(\"no panics\")\n        .expect(\"response MUST NOT timeout\");\n}\n\nuse download_test_tools::*;\nmod download_test_tools {\n    use crate::stalled_stream_common::*;\n    use http_body_1x::Body;\n    use tokio::sync::mpsc::Receiver;\n\n    fn response(body: SdkBody) -> HttpResponse {\n        HttpResponse::try_from(\n            http_02x::Response::builder()\n                .status(200)\n                .body(body)\n                .unwrap(),\n        )\n        .unwrap()\n    }\n\n    pub fn operation(\n        http_connector: impl HttpConnector + 'static,\n        time: TickAdvanceTime,\n        sleep: TickAdvanceSleep,\n    ) -> Operation<(), SdkBody, Infallible> {\n        #[derive(Debug)]\n        struct Deserializer;\n        impl DeserializeResponse for Deserializer {\n            fn deserialize_streaming(\n                &self,\n                response: &mut HttpResponse,\n            ) -> Option<Result<Output, OrchestratorError<Error>>> {\n                let mut body = SdkBody::taken();\n                mem::swap(response.body_mut(), &mut body);\n                Some(Ok(Output::erase(body)))\n            }\n\n            fn deserialize_nonstreaming(\n                &self,\n                _: &HttpResponse,\n            ) -> Result<Output, OrchestratorError<Error>> {\n                unreachable!()\n            }\n        }\n\n        Operation::builder()\n            .service_name(\"test\")\n            .operation_name(\"test\")\n            .http_client(FakeServer(http_connector.into_shared()))\n            .endpoint_url(\"http://localhost:1234/doesntmatter\")\n            .no_auth()\n            .no_retry()\n            .timeout_config(TimeoutConfig::disabled())\n            .serializer(|_body: ()| Ok(HttpRequest::new(SdkBody::empty())))\n            .deserializer_impl(Deserializer)\n            .stalled_stream_protection(\n                StalledStreamProtectionConfig::enabled()\n                    .grace_period(Duration::from_secs(5))\n                    .build(),\n            )\n            .interceptor(StalledStreamProtectionInterceptor::default())\n            .sleep_impl(sleep)\n            .time_source(time)\n            .build()\n    }\n\n    /// Fake server/connector that responds with a channel body.\n    pub fn channel_server() -> (SharedHttpConnector, tokio::sync::mpsc::Sender<Bytes>) {\n        #[derive(Debug)]\n        struct FakeServerConnector {\n            body: Arc<Mutex<Option<SdkBody>>>,\n        }\n        impl HttpConnector for FakeServerConnector {\n            fn call(&self, _request: HttpRequest) -> HttpConnectorFuture {\n                let body = self.body.lock().unwrap().take().unwrap();\n                HttpConnectorFuture::new(async move { Ok(response(body)) })\n            }\n        }\n\n        let (body, body_sender) = channel_body();\n        (\n            FakeServerConnector {\n                body: Arc::new(Mutex::new(Some(body))),\n            }\n            .into_shared(),\n            body_sender,\n        )\n    }\n\n    /// Simulate a client eagerly consuming all the data sent to it from the server.\n    pub async fn eagerly_consume(body: SdkBody) -> Result<(), BoxError> {\n        pin_mut!(body);\n        while let Some(result) = poll_fn(|cx| body.as_mut().poll_frame(cx)).await {\n            if let Err(err) = result {\n                return Err(err);\n            } else {\n                info!(\"consumed bytes from the response body\");\n            }\n        }\n        Ok(())\n    }\n\n    /// Simulate a client very slowly consuming data with an eager server.\n    ///\n    /// This implementation will take longer than the grace period to consume\n    /// the next piece of data.\n    pub async fn slowly_consume(time: TickAdvanceTime, body: SdkBody) -> Result<(), BoxError> {\n        pin_mut!(body);\n        while let Some(result) = poll_fn(|cx| body.as_mut().poll_frame(cx)).await {\n            if let Err(err) = result {\n                return Err(err);\n            } else {\n                info!(\"consumed bytes from the response body\");\n                tick!(time, Duration::from_secs(10));\n            }\n        }\n        Ok(())\n    }\n\n    /// A client that allows us to control when data is consumed by sending a signal to `rx`.\n    pub async fn consume_on_signal(mut rx: Receiver<()>, body: SdkBody) -> Result<(), BoxError> {\n        // Wait to start polling until a signal has been received\n        let _ = rx.recv().await;\n        pin_mut!(body);\n        while let Some(result) = poll_fn(|cx| body.as_mut().poll_frame(cx)).await {\n            if let Err(err) = result {\n                return Err(err);\n            } else {\n                info!(\"consumed bytes from the response body\");\n                // Block until a signal has been received\n                let _ = rx.recv().await;\n            }\n        }\n        Ok(())\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime/tests/stalled_stream_performance.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n#![cfg(all(\n    feature = \"client\",\n    any(feature = \"test-util\", feature = \"legacy-test-util\")\n))]\n\nuse aws_smithy_async::rt::sleep::TokioSleep;\nuse aws_smithy_async::time::{SystemTimeSource, TimeSource};\nuse aws_smithy_runtime::client::http::body::minimum_throughput::MinimumThroughputDownloadBody;\nuse aws_smithy_runtime_api::client::stalled_stream_protection::StalledStreamProtectionConfig;\nuse aws_smithy_types::body::SdkBody;\nuse aws_smithy_types::byte_stream::ByteStream;\nuse bytes::{BufMut, Bytes, BytesMut};\nuse hyper_0_14::server::conn::AddrStream;\nuse hyper_0_14::service::{make_service_fn, service_fn, Service};\nuse hyper_0_14::Server;\nuse std::convert::Infallible;\nuse std::net::TcpListener;\nuse std::time::Duration;\n\nfn make_block(sz: usize) -> Bytes {\n    let mut b = BytesMut::with_capacity(sz);\n    b.put_bytes(1, sz);\n    b.freeze()\n}\n\n// TODO(postGA): convert this to an actual benchmark\n// This test evaluates streaming 1GB of data over the loopback with and without the body wrapper\n// enabled. After optimizations, the body wrapper seems to make minimal differences\n// NOTE: make sure you run this test in release mode to get a sensible result\n#[tokio::test]\n#[ignore]\nasync fn stalled_stream_performance() {\n    // 1GB\n    let data_size = 1_000_000_000;\n    // observed block size during actual HTTP requests\n    let block_size = 16384;\n    let listener = TcpListener::bind(\"127.0.0.1:0\").unwrap();\n    let make_service = make_service_fn(move |_connection: &AddrStream| async move {\n        Ok::<_, Infallible>(service_fn(\n            move |_: http_02x::Request<hyper_0_14::Body>| async move {\n                let (mut sender, body) = hyper_0_14::Body::channel();\n                tokio::task::spawn(async move {\n                    for _i in 0..(data_size / block_size) {\n                        sender\n                            .send_data(make_block(block_size))\n                            .await\n                            .expect(\"failed to write data\");\n                    }\n                });\n                Ok::<_, Infallible>(http_02x::Response::new(body))\n            },\n        ))\n    });\n    let addr = format!(\"http://localhost:{}\", listener.local_addr().unwrap().port());\n    let server = Server::from_tcp(listener).unwrap().serve(make_service);\n    tokio::spawn(server);\n\n    let mut no_wrapping = vec![];\n    let mut wrapping = vec![];\n    let runs = 10;\n    for _i in 0..runs {\n        no_wrapping.push(make_request(&addr, false).await);\n        wrapping.push(make_request(&addr, true).await);\n    }\n    println!(\n        \"Average w/ wrapping: {}\",\n        wrapping.iter().map(|it| it.as_millis() as f64).sum::<f64>() / runs as f64\n    );\n    println!(\n        \"Average w/o wrapping: {}\",\n        no_wrapping\n            .iter()\n            .map(|it: &Duration| it.as_millis() as f64)\n            .sum::<f64>()\n            / runs as f64\n    )\n}\n\nasync fn make_request(address: &str, wrap_body: bool) -> Duration {\n    let mut client = hyper_0_14::Client::new();\n    let req = ::http_02x::Request::builder()\n        .uri(address)\n        .body(hyper_0_14::Body::empty())\n        .unwrap();\n    let resp = client.call(req).await;\n    let body = resp.unwrap().into_body();\n    let mut body = SdkBody::from_body_0_4(body);\n    if wrap_body {\n        body = body.map_preserve_contents(|body| {\n            let time_source = SystemTimeSource::new();\n            let sleep = TokioSleep::new();\n            let opts = StalledStreamProtectionConfig::enabled().build();\n            let mtb = MinimumThroughputDownloadBody::new(time_source, sleep, body, opts.into());\n            SdkBody::from_body_0_4(mtb)\n        });\n    }\n\n    let sdk_body = ByteStream::new(body);\n    let ts = SystemTimeSource::new();\n    let start = ts.now();\n    // this a slow way to count total bytes, but we need to actually read the bytes into segments\n    // otherwise some of our code seems to be optimized away\n    let total_bytes = sdk_body\n        .collect()\n        .await\n        .unwrap()\n        .into_segments()\n        .map(|seg| seg.len())\n        .sum::<usize>();\n    println!(\"total: {:?}\", total_bytes);\n    let end = ts.now();\n    end.duration_since(start).unwrap()\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime/tests/stalled_stream_upload.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n#![cfg(all(\n    feature = \"client\",\n    any(feature = \"test-util\", feature = \"legacy-test-util\")\n))]\n\n#[macro_use]\nmod stalled_stream_common;\n\nuse aws_smithy_runtime_api::client::stalled_stream_protection::DEFAULT_GRACE_PERIOD;\nuse stalled_stream_common::*;\n\n/// Scenario: Successful upload at a rate above the minimum throughput.\n/// Expected: MUST NOT timeout.\n#[tokio::test]\nasync fn upload_success() {\n    let _logs = show_test_logs();\n\n    let (server, time, sleep) = eager_server(true);\n    let op = operation(server, time, sleep);\n\n    let (body, body_sender) = channel_body();\n    let result = tokio::spawn(async move { op.invoke(body).await });\n\n    for _ in 0..100 {\n        body_sender.send(NEAT_DATA).await.unwrap();\n    }\n    drop(body_sender);\n\n    assert_eq!(200, result.await.unwrap().expect(\"success\").as_u16());\n}\n\n/// Scenario: Upload takes some time to start, but then goes normally.\n/// Expected: MUST NOT timeout.\n#[tokio::test]\nasync fn upload_slow_start() {\n    let _logs = show_test_logs();\n\n    let (server, time, sleep) = eager_server(false);\n    let op = operation(server, time.clone(), sleep);\n\n    let (body, body_sender) = channel_body();\n    let result = tokio::spawn(async move { op.invoke(body).await });\n\n    let _streamer = tokio::spawn(async move {\n        // Advance longer than the grace period. This shouldn't fail since\n        // it is the customer's side that hasn't produced data yet, not a server issue.\n        time.tick(Duration::from_secs(10)).await;\n\n        for _ in 0..100 {\n            body_sender.send(NEAT_DATA).await.unwrap();\n            time.tick(Duration::from_secs(1)).await;\n        }\n        drop(body_sender);\n        time.tick(Duration::from_secs(1)).await;\n    });\n\n    assert_eq!(200, result.await.unwrap().expect(\"success\").as_u16());\n}\n\n/// Scenario: The upload is going fine, but falls below the minimum throughput.\n/// Expected: MUST timeout.\n#[tokio::test]\nasync fn upload_too_slow() {\n    let _logs = show_test_logs();\n\n    // Server that starts off fast enough, but gets slower over time until it should timeout.\n    let (server, time, sleep) = time_sequence_server([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);\n    let op = operation(server, time, sleep);\n\n    let (body, body_sender) = channel_body();\n    let result = tokio::spawn(async move { op.invoke(body).await });\n\n    let _streamer = tokio::spawn(async move {\n        for send in 0..100 {\n            info!(\"send {send}\");\n            body_sender.send(NEAT_DATA).await.unwrap();\n        }\n        drop(body_sender);\n    });\n\n    expect_timeout(result.await.expect(\"no panics\"));\n}\n\n/// Scenario: The server stops asking for data, the client maxes out its send buffer,\n///           and the request stream stops being polled.\n/// Expected: MUST timeout after the grace period completes.\n#[tokio::test]\nasync fn upload_stalls() {\n    let _logs = show_test_logs();\n\n    let (server, time, sleep) = stalling_server(None);\n    let op = operation(server, time.clone(), sleep);\n\n    let (body, body_sender) = channel_body();\n    let result = tokio::spawn(async move { op.invoke(body).await });\n\n    let _streamer = tokio::spawn(async move {\n        for send in 1..=100 {\n            info!(\"send {send}\");\n            body_sender.send(NEAT_DATA).await.unwrap();\n            tick!(time, Duration::from_secs(1));\n        }\n        drop(body_sender);\n        time.tick(Duration::from_secs(1)).await;\n    });\n\n    expect_timeout(result.await.expect(\"no panics\"));\n}\n\n/// Scenario: Request does not have a body. Server response doesn't start coming through\n///           until after the grace period.\n/// Expected: MUST NOT timeout.\n#[tokio::test]\nasync fn empty_request_body_delayed_response() {\n    let _logs = show_test_logs();\n\n    let (server, time, sleep) = stalling_server(Some(Duration::from_secs(6)));\n    let op = operation(server, time.clone(), sleep);\n\n    let result = tokio::spawn(async move { op.invoke(SdkBody::empty()).await });\n\n    let _advance = tokio::spawn(async move {\n        for _ in 0..6 {\n            tick!(time, Duration::from_secs(1));\n        }\n    });\n\n    assert_eq!(200, result.await.unwrap().expect(\"success\").as_u16());\n}\n\n/// Scenario: All the request data is either uploaded to the server or buffered in the\n///           HTTP client, but the response doesn't start coming through within the grace period.\n/// Expected: MUST NOT timeout, upload throughput should only apply up until the request body has\n/// been read completely and handed off to the HTTP client.\n#[tokio::test]\nasync fn complete_upload_delayed_response() {\n    let _logs = show_test_logs();\n\n    let (server, time, sleep) = stalling_server(Some(Duration::from_secs(6)));\n    let op = operation(server, time.clone(), sleep);\n\n    let (body, body_sender) = channel_body();\n    let result = tokio::spawn(async move { op.invoke(body).await });\n\n    let _streamer = tokio::spawn(async move {\n        info!(\"send data\");\n        body_sender.send(NEAT_DATA).await.unwrap();\n        tick!(time, Duration::from_secs(1));\n        info!(\"body send complete; dropping\");\n        drop(body_sender);\n        tick!(time, DEFAULT_GRACE_PERIOD);\n        info!(\"body stream task complete\");\n        // advance to unblock the stalled server\n        tick!(time, Duration::from_secs(2));\n    });\n\n    assert_eq!(200, result.await.unwrap().expect(\"success\").as_u16());\n}\n\n/// Scenario: Upload all request data and never poll again once content-length has\n///           been reached. Hyper will stop polling once it detects end of stream so we can't rely\n///           on reaching `Poll:Ready(None)` to detect end of stream.\n///\n///           ref: https://github.com/hyperium/hyper/issues/1545\n///           ref: https://github.com/hyperium/hyper/issues/1521\n///\n/// Expected: MUST NOT timeout, upload throughput should only apply up until the request body has\n/// been read completely. Once no more data is expected we should stop checking for throughput\n/// violations.\n#[tokio::test]\nasync fn complete_upload_stop_polling() {\n    let _logs = show_test_logs();\n\n    let (server, time, sleep) = limited_read_server(NEAT_DATA.len(), Some(Duration::from_secs(7)));\n    let op = operation(server, time.clone(), sleep.clone());\n\n    let body = SdkBody::from(NEAT_DATA);\n    let result = tokio::spawn(async move { op.invoke(body).await });\n\n    tokio::spawn(async move {\n        // advance past the grace period\n        tick!(time, DEFAULT_GRACE_PERIOD + Duration::from_secs(1));\n        // unblock server\n        tick!(time, Duration::from_secs(2));\n    });\n\n    assert_eq!(200, result.await.unwrap().expect(\"success\").as_u16());\n}\n\n// Scenario: The server stops asking for data, the client maxes out its send buffer,\n//           and the request stream stops being polled. However, before the grace period\n//           is over, the server recovers and starts asking for data again.\n// Expected: MUST NOT timeout.\n#[tokio::test]\nasync fn upload_stall_recovery_in_grace_period() {\n    let _logs = show_test_logs();\n\n    // Server starts off fast enough, but then slows down almost up to\n    // the grace period, and then recovers.\n    let (server, time, sleep) = time_sequence_server([1, 4, 1]);\n    let op = operation(server, time, sleep);\n\n    let (body, body_sender) = channel_body();\n    let result = tokio::spawn(async move { op.invoke(body).await });\n\n    let _streamer = tokio::spawn(async move {\n        for send in 0..100 {\n            info!(\"send {send}\");\n            body_sender.send(NEAT_DATA).await.unwrap();\n        }\n        drop(body_sender);\n    });\n\n    assert_eq!(200, result.await.unwrap().expect(\"success\").as_u16());\n}\n\n// Scenario: The customer isn't providing data on the stream fast enough to satisfy\n//           the minimum throughput. This shouldn't be considered a stall since the\n//           server is asking for more data and could handle it if it were available.\n// Expected: MUST NOT timeout.\n#[tokio::test]\nasync fn user_provides_data_too_slowly() {\n    let _logs = show_test_logs();\n\n    let (server, time, sleep) = eager_server(false);\n    let op = operation(server, time.clone(), sleep.clone());\n\n    let (body, body_sender) = channel_body();\n    let result = tokio::spawn(async move { op.invoke(body).await });\n\n    let _streamer = tokio::spawn(async move {\n        body_sender.send(NEAT_DATA).await.unwrap();\n        tick!(time, Duration::from_secs(1));\n        body_sender.send(NEAT_DATA).await.unwrap();\n\n        // Now advance 10 seconds before sending more data, simulating a\n        // customer taking time to produce more data to stream.\n        tick!(time, Duration::from_secs(10));\n        body_sender.send(NEAT_DATA).await.unwrap();\n        drop(body_sender);\n        tick!(time, Duration::from_secs(1));\n    });\n\n    assert_eq!(200, result.await.unwrap().expect(\"success\").as_u16());\n}\n\nuse upload_test_tools::*;\nmod upload_test_tools {\n    use crate::stalled_stream_common::*;\n    use aws_smithy_async::rt::sleep::AsyncSleep;\n    use http_body_1x::Body;\n\n    pub fn successful_response() -> HttpResponse {\n        HttpResponse::try_from(\n            http_02x::Response::builder()\n                .status(200)\n                .body(SdkBody::empty())\n                .unwrap(),\n        )\n        .unwrap()\n    }\n\n    pub fn operation(\n        http_connector: impl HttpConnector + 'static,\n        time: TickAdvanceTime,\n        sleep: TickAdvanceSleep,\n    ) -> Operation<SdkBody, StatusCode, Infallible> {\n        Operation::builder()\n            .service_name(\"test\")\n            .operation_name(\"test\")\n            .http_client(FakeServer(http_connector.into_shared()))\n            .endpoint_url(\"http://localhost:1234/doesntmatter\")\n            .no_auth()\n            .no_retry()\n            .timeout_config(TimeoutConfig::disabled())\n            .serializer(|body: SdkBody| Ok(HttpRequest::new(body)))\n            .deserializer::<_, Infallible>(|response| Ok(response.status()))\n            .stalled_stream_protection(\n                StalledStreamProtectionConfig::enabled()\n                    .grace_period(Duration::from_secs(5))\n                    .build(),\n            )\n            .interceptor(StalledStreamProtectionInterceptor::default())\n            .sleep_impl(sleep)\n            .time_source(time)\n            .build()\n    }\n\n    /// Creates a fake HttpConnector implementation that calls the given async $body_fn\n    /// to get the response body. This $body_fn is given a request body, time, and sleep.\n    macro_rules! fake_server {\n        ($name:ident, $body_fn:expr) => {\n            fake_server!($name, $body_fn, (), ())\n        };\n        ($name:ident, $body_fn:expr, $params_ty:ty, $params:expr) => {{\n            #[derive(Debug)]\n            struct $name(TickAdvanceTime, TickAdvanceSleep, $params_ty);\n            impl HttpConnector for $name {\n                fn call(&self, mut request: HttpRequest) -> HttpConnectorFuture {\n                    let time = self.0.clone();\n                    let sleep = self.1.clone();\n                    let params = self.2.clone();\n                    let span = tracing::span!(tracing::Level::INFO, \"FAKE SERVER\");\n                    HttpConnectorFuture::new(\n                        async move {\n                            let mut body = SdkBody::taken();\n                            mem::swap(request.body_mut(), &mut body);\n                            pin_mut!(body);\n\n                            Ok($body_fn(body, time, sleep, params).await)\n                        }\n                        .instrument(span),\n                    )\n                }\n            }\n            let (time, sleep) = tick_advance_time_and_sleep();\n            (\n                $name(time.clone(), sleep.clone(), $params).into_shared(),\n                time,\n                sleep,\n            )\n        }};\n    }\n\n    /// Fake server/connector that immediately reads all incoming data with an\n    /// optional 1 second gap in between polls.\n    pub fn eager_server(\n        advance_time: bool,\n    ) -> (SharedHttpConnector, TickAdvanceTime, TickAdvanceSleep) {\n        async fn fake_server(\n            mut body: Pin<&mut SdkBody>,\n            time: TickAdvanceTime,\n            _: TickAdvanceSleep,\n            advance_time: bool,\n        ) -> HttpResponse {\n            while poll_fn(|cx| body.as_mut().poll_frame(cx)).await.is_some() {\n                if advance_time {\n                    tick!(time, Duration::from_secs(1));\n                }\n            }\n            successful_response()\n        }\n        fake_server!(FakeServerConnector, fake_server, bool, advance_time)\n    }\n\n    /// Fake server/connector that reads some data, and then stalls for the given time before\n    /// returning a response. If `None` is given the server will stall indefinitely.\n    pub fn stalling_server(\n        respond_after: Option<Duration>,\n    ) -> (SharedHttpConnector, TickAdvanceTime, TickAdvanceSleep) {\n        async fn fake_server(\n            mut body: Pin<&mut SdkBody>,\n            _time: TickAdvanceTime,\n            sleep: TickAdvanceSleep,\n            respond_after: Option<Duration>,\n        ) -> HttpResponse {\n            let mut times = 5;\n            while times > 0 && poll_fn(|cx| body.as_mut().poll_frame(cx)).await.is_some() {\n                times -= 1;\n            }\n\n            match respond_after {\n                Some(delay) => {\n                    tracing::info!(\"stalling for {} seconds\", delay.as_secs());\n                    sleep.sleep(delay).await;\n                    tracing::info!(\"returning delayed response\");\n                    successful_response()\n                }\n                None => {\n                    // never awake after this\n                    tracing::info!(\"stalling indefinitely\");\n                    std::future::pending::<()>().await;\n                    unreachable!()\n                }\n            }\n        }\n        fake_server!(\n            FakeServerConnector,\n            fake_server,\n            Option<Duration>,\n            respond_after\n        )\n    }\n\n    /// Fake server/connector that polls data after each period of time in the given\n    /// sequence. Once the sequence completes, it will delay 1 second after each poll.\n    pub fn time_sequence_server(\n        time_sequence: impl IntoIterator<Item = u64>,\n    ) -> (SharedHttpConnector, TickAdvanceTime, TickAdvanceSleep) {\n        async fn fake_server(\n            mut body: Pin<&mut SdkBody>,\n            time: TickAdvanceTime,\n            _sleep: TickAdvanceSleep,\n            time_sequence: Vec<u64>,\n        ) -> HttpResponse {\n            let mut time_sequence: VecDeque<Duration> =\n                time_sequence.into_iter().map(Duration::from_secs).collect();\n            while poll_fn(|cx| body.as_mut().poll_frame(cx)).await.is_some() {\n                let next_time = time_sequence.pop_front().unwrap_or(Duration::from_secs(1));\n                tick!(time, next_time);\n            }\n            successful_response()\n        }\n        fake_server!(\n            FakeServerConnector,\n            fake_server,\n            Vec<u64>,\n            time_sequence.into_iter().collect()\n        )\n    }\n\n    /// Fake server/connector that polls data only up to the content-length. Optionally delays\n    /// sending the response by the given duration.\n    pub fn limited_read_server(\n        content_len: usize,\n        respond_after: Option<Duration>,\n    ) -> (SharedHttpConnector, TickAdvanceTime, TickAdvanceSleep) {\n        async fn fake_server(\n            mut body: Pin<&mut SdkBody>,\n            _time: TickAdvanceTime,\n            sleep: TickAdvanceSleep,\n            params: (usize, Option<Duration>),\n        ) -> HttpResponse {\n            let mut remaining = params.0;\n            loop {\n                match poll_fn(|cx| body.as_mut().poll_frame(cx)).await {\n                    Some(res) => {\n                        let rc = res.unwrap().into_data().expect(\"data frame\").len();\n                        remaining -= rc;\n                        tracing::info!(\"read {rc} bytes; remaining: {remaining}\");\n                        if remaining == 0 {\n                            tracing::info!(\"read reported content-length data, stopping polling\");\n                            break;\n                        };\n                    }\n                    None => {\n                        tracing::info!(\n                            \"read until poll_frame() returned None, no data left, stopping polling\"\n                        );\n                        break;\n                    }\n                }\n            }\n\n            let respond_after = params.1;\n            if let Some(delay) = respond_after {\n                tracing::info!(\"stalling for {} seconds\", delay.as_secs());\n                sleep.sleep(delay).await;\n                tracing::info!(\"returning delayed response\");\n            }\n\n            successful_response()\n        }\n\n        fake_server!(\n            FakeServerConnector,\n            fake_server,\n            (usize, Option<Duration>),\n            (content_len, respond_after)\n        )\n    }\n\n    pub fn expect_timeout(result: Result<StatusCode, SdkError<Infallible, Response<SdkBody>>>) {\n        let err = result.expect_err(\"should have timed out\");\n        assert_str_contains!(\n            DisplayErrorContext(&err).to_string(),\n            \"minimum throughput was specified at 1 B/s, but throughput of 0 B/s was observed\"\n        );\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime-api/Cargo.toml",
    "content": "[package]\nname = \"aws-smithy-runtime-api\"\nversion = \"1.12.0\"\nauthors = [\"AWS Rust SDK Team <aws-sdk-rust@amazon.com>\", \"Zelda Hessler <zhessler@amazon.com>\"]\ndescription = \"Smithy runtime types.\"\nedition = \"2021\"\nlicense = \"Apache-2.0\"\nrepository = \"https://github.com/smithy-lang/smithy-rs\"\nrust-version = \"1.91.1\"\n\n# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html\n\n[features]\ndefault = []\nclient = []\nhttp-auth = [\"dep:zeroize\"]\ntest-util = [\"aws-smithy-types/test-util\", \"http-1x\"]\nhttp-02x = []\nhttp-1x = []\n\n[dependencies]\naws-smithy-async = { path = \"../aws-smithy-async\" }\naws-smithy-runtime-api-macros = { path = \"../aws-smithy-runtime-api-macros\" }\naws-smithy-types = { path = \"../aws-smithy-types\", features = [\"http-body-1-x\"] }\nbytes = \"1.11.1\"\nhttp-02x = { package = \"http\", version = \"0.2.12\" }\nhttp-1x = { package = \"http\", version = \"1.3.1\" }\npin-project-lite = \"0.2.14\"\ntokio = { version = \"1.49.0\", features = [\"sync\"] }\ntracing = \"0.1.44\"\nzeroize = { version = \"1.7.0\", optional = true }\n\n[dev-dependencies]\nproptest = \"1\"\ntokio = { version = \"1.49.0\", features = [\"macros\", \"rt\", \"rt-multi-thread\"] }\n\n[package.metadata.docs.rs]\nall-features = true\ntargets = [\"x86_64-unknown-linux-gnu\"]\ncargo-args = [\"-Zunstable-options\", \"-Zrustdoc-scrape-examples\"]\nrustdoc-args = [\"--cfg\", \"docsrs\"]\n# End of docs.rs metadata\n\n# make sure to keep crate stability in sync with the second element of the following tuple in\n# buildSrc/src/main/kotlin/CrateSet.kt:\n#  Crate(\"aws-smithy-runtime-api\", STABLE_VERSION_PROP_NAME),\n[package.metadata.smithy-rs-release-tooling]\nstable = true\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime-api/LICENSE",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime-api/README.md",
    "content": "# aws-smithy-runtime-api\n\nAPIs needed to configure and customize the Smithy generated code.\n\nMost users will not need to use this crate directly as the most frequently used\nAPIs are re-exported in the generated clients. However, this crate will be useful\nfor anyone writing a library for others to use with their generated clients.\n\nIf you're needing to depend on this and you're not writing a library for Smithy\ngenerated clients, then please file an issue on [smithy-rs](https://github.com/smithy-lang/smithy-rs)\nas we likely missed re-exporting one of the APIs.\n\n<!-- anchor_start:footer -->\nThis crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly.\n<!-- anchor_end:footer -->\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime-api/additional-ci",
    "content": "#!/bin/bash\n#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\n\n# This script contains additional CI checks to run for this specific package\n\nset -e\n\n# NOTE: (rcoh) This seems to be pulling in workspace settings that pull in this dependency, but it passes if\n# no other crates enable this dependency\n# echo \"### Checking external types w/ HTTP feature disabled\"\n# RUSTDOCFLAGS=\"\" cargo +\"${RUST_NIGHTLY_VERSION}\" check-external-types --config external-types-no-http.toml --no-default-features\n\necho \"### Testing every combination of features (excluding --all-features)\"\ncargo hack test --feature-powerset --exclude-all-features\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime-api/external-types-no-http.toml",
    "content": "allowed_external_types = [\n    \"aws_smithy_async::*\",\n    \"aws_smithy_types::*\",\n\n    \"bytes::bytes::Bytes\",\n]\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime-api/external-types.toml",
    "content": "allowed_external_types = [\n    \"aws_smithy_async::*\",\n    \"aws_smithy_types::*\",\n\n    \"bytes::bytes::Bytes\",\n\n    \"http::header::map::HeaderMap\",\n    \"http::header::value::HeaderValue\",\n    \"http::request::Request\",\n    \"http::response::Response\",\n    \"http::status::StatusCode\",\n    \"http::uri::Uri\",\n]\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime-api/rustdoc/validate_base_client_config.md",
    "content": "Validate the base client configuration.\n\nThis gets called upon client construction. The full config may not be available at\nthis time (hence why it has [`RuntimeComponentsBuilder`] as an argument rather\nthan [`RuntimeComponents`]). Any error returned here will become a panic\nin the client constructor.\n\n[`RuntimeComponentsBuilder`]: crate::client::runtime_components::RuntimeComponentsBuilder\n[`RuntimeComponents`]: crate::client::runtime_components::RuntimeComponents\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime-api/rustdoc/validate_final_config.md",
    "content": "Validate the final client configuration.\n\nThis gets called immediately after the [`Intercept::read_before_execution`] trait hook\nwhen the final configuration has been resolved. Any error returned here will\ncause the operation to return that error.\n\n[`Intercept::read_before_execution`]: crate::client::interceptors::Intercept::read_before_execution\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime-api/src/box_error.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/// A boxed error that is `Send` and `Sync`.\npub type BoxError = Box<dyn std::error::Error + Send + Sync>;\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime-api/src/client/auth/http.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::client::auth::AuthSchemeId;\n\n/// Auth scheme ID for HTTP API key based authentication.\npub const HTTP_API_KEY_AUTH_SCHEME_ID: AuthSchemeId = AuthSchemeId::new(\"httpApiKeyAuth\");\n\n/// Auth scheme ID for HTTP Basic Auth.\npub const HTTP_BASIC_AUTH_SCHEME_ID: AuthSchemeId = AuthSchemeId::new(\"httpBasicAuth\");\n\n/// Auth scheme ID for HTTP Bearer Auth.\npub const HTTP_BEARER_AUTH_SCHEME_ID: AuthSchemeId = AuthSchemeId::new(\"httpBearerAuth\");\n\n/// Auth scheme ID for HTTP Digest Auth.\npub const HTTP_DIGEST_AUTH_SCHEME_ID: AuthSchemeId = AuthSchemeId::new(\"httpDigestAuth\");\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime-api/src/client/auth/static_resolver.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::box_error::BoxError;\nuse crate::client::auth::{AuthSchemeId, AuthSchemeOptionResolverParams, ResolveAuthSchemeOptions};\nuse std::borrow::Cow;\n\n/// New-type around a `Vec<AuthSchemeId>` that implements `ResolveAuthSchemeOptions`.\n#[derive(Debug)]\npub struct StaticAuthSchemeOptionResolver {\n    auth_scheme_options: Vec<AuthSchemeId>,\n}\n\nimpl StaticAuthSchemeOptionResolver {\n    /// Creates a new instance of `StaticAuthSchemeOptionResolver`.\n    pub fn new(auth_scheme_options: Vec<AuthSchemeId>) -> Self {\n        Self {\n            auth_scheme_options,\n        }\n    }\n}\n\nimpl ResolveAuthSchemeOptions for StaticAuthSchemeOptionResolver {\n    fn resolve_auth_scheme_options(\n        &self,\n        _params: &AuthSchemeOptionResolverParams,\n    ) -> Result<Cow<'_, [AuthSchemeId]>, BoxError> {\n        Ok(Cow::Borrowed(&self.auth_scheme_options))\n    }\n}\n\n/// Empty params to be used with [`StaticAuthSchemeOptionResolver`].\n#[derive(Debug)]\npub struct StaticAuthSchemeOptionResolverParams;\n\nimpl StaticAuthSchemeOptionResolverParams {\n    /// Creates a new `StaticAuthSchemeOptionResolverParams`.\n    pub fn new() -> Self {\n        Self\n    }\n}\n\nimpl From<StaticAuthSchemeOptionResolverParams> for AuthSchemeOptionResolverParams {\n    fn from(params: StaticAuthSchemeOptionResolverParams) -> Self {\n        AuthSchemeOptionResolverParams::new(params)\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime-api/src/client/auth.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! APIs for request authentication.\n\nuse crate::box_error::BoxError;\nuse crate::client::identity::{Identity, SharedIdentityResolver};\nuse crate::client::orchestrator::HttpRequest;\nuse crate::client::runtime_components::sealed::ValidateConfig;\nuse crate::client::runtime_components::{GetIdentityResolver, RuntimeComponents};\nuse crate::impl_shared_conversions;\nuse aws_smithy_types::config_bag::{ConfigBag, FrozenLayer, Storable, StoreReplace};\nuse aws_smithy_types::type_erasure::TypeErasedBox;\nuse aws_smithy_types::Document;\nuse std::borrow::Cow;\nuse std::fmt;\nuse std::sync::Arc;\n\n/// Auth schemes for the HTTP `Authorization` header.\n#[cfg(feature = \"http-auth\")]\npub mod http;\n\n/// Static auth scheme option resolver.\npub mod static_resolver;\n\n/// The output type from the [`ResolveAuthSchemeOptions::resolve_auth_scheme_options_v2`]\n///\n/// The resolver returns a list of these, in the order the auth scheme resolver wishes to use them.\n#[derive(Clone, Debug)]\npub struct AuthSchemeOption {\n    scheme_id: AuthSchemeId,\n    properties: Option<FrozenLayer>,\n}\n\nimpl AuthSchemeOption {\n    /// Builder struct for [`AuthSchemeOption`]\n    pub fn builder() -> AuthSchemeOptionBuilder {\n        AuthSchemeOptionBuilder::default()\n    }\n\n    /// Returns [`AuthSchemeId`], the ID of the scheme\n    pub fn scheme_id(&self) -> &AuthSchemeId {\n        &self.scheme_id\n    }\n\n    /// Returns optional properties for identity resolution or signing\n    ///\n    /// This config layer is applied to the [`ConfigBag`] to ensure the information is\n    /// available during both the identity resolution and signature generation processes.\n    pub fn properties(&self) -> Option<FrozenLayer> {\n        self.properties.clone()\n    }\n}\n\nimpl From<AuthSchemeId> for AuthSchemeOption {\n    fn from(auth_scheme_id: AuthSchemeId) -> Self {\n        AuthSchemeOption::builder()\n            .scheme_id(auth_scheme_id)\n            .build()\n            .expect(\"required fields set\")\n    }\n}\n\n/// Builder struct for [`AuthSchemeOption`]\n#[derive(Debug, Default)]\npub struct AuthSchemeOptionBuilder {\n    scheme_id: Option<AuthSchemeId>,\n    properties: Option<FrozenLayer>,\n}\n\nimpl AuthSchemeOptionBuilder {\n    /// Sets [`AuthSchemeId`] for the builder\n    pub fn scheme_id(mut self, auth_scheme_id: AuthSchemeId) -> Self {\n        self.set_scheme_id(Some(auth_scheme_id));\n        self\n    }\n\n    /// Sets [`AuthSchemeId`] for the builder\n    pub fn set_scheme_id(&mut self, auth_scheme_id: Option<AuthSchemeId>) {\n        self.scheme_id = auth_scheme_id;\n    }\n\n    /// Sets the properties for the builder\n    pub fn properties(mut self, properties: FrozenLayer) -> Self {\n        self.set_properties(Some(properties));\n        self\n    }\n\n    /// Sets the properties for the builder\n    pub fn set_properties(&mut self, properties: Option<FrozenLayer>) {\n        self.properties = properties;\n    }\n\n    /// Builds an [`AuthSchemeOption`], otherwise returns an [`AuthSchemeOptionBuilderError`] in the case of error\n    pub fn build(self) -> Result<AuthSchemeOption, AuthSchemeOptionBuilderError> {\n        let scheme_id = self\n            .scheme_id\n            .ok_or(ErrorKind::MissingRequiredField(\"auth_scheme_id\"))?;\n        Ok(AuthSchemeOption {\n            scheme_id,\n            properties: self.properties,\n        })\n    }\n}\n\n#[derive(Debug)]\nenum ErrorKind {\n    MissingRequiredField(&'static str),\n}\n\nimpl From<ErrorKind> for AuthSchemeOptionBuilderError {\n    fn from(kind: ErrorKind) -> Self {\n        Self { kind }\n    }\n}\n\n/// The error type returned when failing to build [`AuthSchemeOption`] from the builder\n#[derive(Debug)]\npub struct AuthSchemeOptionBuilderError {\n    kind: ErrorKind,\n}\n\nimpl fmt::Display for AuthSchemeOptionBuilderError {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        match self.kind {\n            ErrorKind::MissingRequiredField(name) => {\n                write!(f, \"`{name}` is required\")\n            }\n        }\n    }\n}\n\nimpl std::error::Error for AuthSchemeOptionBuilderError {}\n\n/// New type around an auth scheme ID.\n///\n/// Each auth scheme must have a unique string identifier associated with it,\n/// which is used to refer to auth schemes by the auth scheme option resolver, and\n/// also used to select an identity resolver to use.\n#[derive(Clone, Debug, Eq, PartialEq, Hash, Ord, PartialOrd)]\npub struct AuthSchemeId {\n    scheme_id: Cow<'static, str>,\n}\n\n// See: https://doc.rust-lang.org/std/convert/trait.AsRef.html#reflexivity\nimpl AsRef<AuthSchemeId> for AuthSchemeId {\n    fn as_ref(&self) -> &AuthSchemeId {\n        self\n    }\n}\n\n// Normalizes auth scheme IDs for comparison and hashing by treating \"no_auth\" and \"noAuth\" as equivalent\n// by converting \"no_auth\" to \"noAuth\".\n// This is for backward compatibility; \"no_auth\" was incorrectly used in earlier GA versions of the SDK and\n// could be used still in some places.\nconst fn normalize_auth_scheme_id(s: &'static str) -> &'static str {\n    match s.as_bytes() {\n        b\"no_auth\" => \"noAuth\",\n        _ => s,\n    }\n}\n\nimpl AuthSchemeId {\n    /// Creates a new auth scheme ID.\n    pub const fn new(scheme_id: &'static str) -> Self {\n        Self {\n            scheme_id: Cow::Borrowed(normalize_auth_scheme_id(scheme_id)),\n        }\n    }\n\n    /// Returns the string equivalent of this auth scheme ID.\n    #[deprecated(\n        note = \"This function is no longer functional. Use `inner` instead\",\n        since = \"1.8.0\"\n    )]\n    pub const fn as_str(&self) -> &'static str {\n        match self.scheme_id {\n            Cow::Borrowed(val) => val,\n            Cow::Owned(_) => {\n                // cannot obtain `&'static str` from `String` unless we use `Box::leak`\n                \"\"\n            }\n        }\n    }\n\n    /// Returns the string equivalent of this auth scheme ID.\n    pub fn inner(&self) -> &str {\n        &self.scheme_id\n    }\n}\n\nimpl From<&'static str> for AuthSchemeId {\n    fn from(scheme_id: &'static str) -> Self {\n        Self::new(scheme_id)\n    }\n}\n\nimpl From<Cow<'static, str>> for AuthSchemeId {\n    fn from(scheme_id: Cow<'static, str>) -> Self {\n        let normalized_scheme_id = match &scheme_id {\n            Cow::Borrowed(s) => Cow::Borrowed(normalize_auth_scheme_id(s)),\n            Cow::Owned(s) => {\n                if s == \"no_auth\" {\n                    Cow::Borrowed(\"noAuth\")\n                } else {\n                    scheme_id\n                }\n            }\n        };\n        Self {\n            scheme_id: normalized_scheme_id,\n        }\n    }\n}\n\n/// Parameters needed to resolve auth scheme options.\n///\n/// Most generated clients will use the [`StaticAuthSchemeOptionResolver`](static_resolver::StaticAuthSchemeOptionResolver),\n/// which doesn't require any parameters for resolution (and has its own empty params struct).\n///\n/// However, more complex auth scheme resolvers may need modeled parameters in order to resolve\n/// the auth scheme options. For those, this params struct holds a type erased box so that any\n/// kind of parameters can be contained within, and type casted by the auth scheme option resolver\n/// implementation.\n#[derive(Debug)]\npub struct AuthSchemeOptionResolverParams(TypeErasedBox);\n\nimpl AuthSchemeOptionResolverParams {\n    /// Creates a new [`AuthSchemeOptionResolverParams`].\n    pub fn new<T: fmt::Debug + Send + Sync + 'static>(params: T) -> Self {\n        Self(TypeErasedBox::new(params))\n    }\n\n    /// Returns the underlying parameters as the type `T` if they are that type.\n    pub fn get<T: fmt::Debug + Send + Sync + 'static>(&self) -> Option<&T> {\n        self.0.downcast_ref()\n    }\n}\n\nimpl Storable for AuthSchemeOptionResolverParams {\n    type Storer = StoreReplace<Self>;\n}\n\nnew_type_future! {\n    #[doc = \"Future for [`ResolveAuthSchemeOptions::resolve_auth_scheme_options_v2`].\"]\n    pub struct AuthSchemeOptionsFuture<'a, Vec<AuthSchemeOption>, BoxError>;\n}\n\n/// Resolver for auth scheme options.\n///\n/// The orchestrator needs to select an auth scheme to sign requests with, and potentially\n/// from several different available auth schemes. Smithy models have a number of ways\n/// to specify which operations can use which auth schemes under which conditions, as\n/// documented in the [Smithy spec](https://smithy.io/2.0/spec/authentication-traits.html).\n///\n/// The orchestrator uses the auth scheme option resolver runtime component to resolve\n/// an ordered list of options that are available to choose from for a given request.\n/// This resolver can be a simple static list, such as with the\n/// [`StaticAuthSchemeOptionResolver`](static_resolver::StaticAuthSchemeOptionResolver),\n/// or it can be a complex code generated resolver that incorporates parameters from both\n/// the model and the resolved endpoint.\npub trait ResolveAuthSchemeOptions: Send + Sync + fmt::Debug {\n    #[deprecated(\n        note = \"This method is deprecated, use `resolve_auth_scheme_options_v2` instead.\",\n        since = \"1.8.0\"\n    )]\n    /// Returns a list of available auth scheme options to choose from.\n    fn resolve_auth_scheme_options(\n        &self,\n        _params: &AuthSchemeOptionResolverParams,\n    ) -> Result<Cow<'_, [AuthSchemeId]>, BoxError> {\n        unimplemented!(\"This method is deprecated, use `resolve_auth_scheme_options_v2` instead.\");\n    }\n\n    #[allow(deprecated)]\n    /// Returns a list of available auth scheme options to choose from.\n    fn resolve_auth_scheme_options_v2<'a>(\n        &'a self,\n        params: &'a AuthSchemeOptionResolverParams,\n        _cfg: &'a ConfigBag,\n        _runtime_components: &'a RuntimeComponents,\n    ) -> AuthSchemeOptionsFuture<'a> {\n        AuthSchemeOptionsFuture::ready({\n            self.resolve_auth_scheme_options(params).map(|options| {\n                options\n                    .iter()\n                    .cloned()\n                    .map(|scheme_id| {\n                        AuthSchemeOption::builder()\n                            .scheme_id(scheme_id)\n                            .build()\n                            .expect(\"required fields set\")\n                    })\n                    .collect::<Vec<_>>()\n            })\n        })\n    }\n}\n\n/// A shared auth scheme option resolver.\n#[derive(Clone, Debug)]\npub struct SharedAuthSchemeOptionResolver(Arc<dyn ResolveAuthSchemeOptions>);\n\nimpl SharedAuthSchemeOptionResolver {\n    /// Creates a new [`SharedAuthSchemeOptionResolver`].\n    pub fn new(auth_scheme_option_resolver: impl ResolveAuthSchemeOptions + 'static) -> Self {\n        Self(Arc::new(auth_scheme_option_resolver))\n    }\n}\n\nimpl ResolveAuthSchemeOptions for SharedAuthSchemeOptionResolver {\n    #[allow(deprecated)]\n    fn resolve_auth_scheme_options(\n        &self,\n        params: &AuthSchemeOptionResolverParams,\n    ) -> Result<Cow<'_, [AuthSchemeId]>, BoxError> {\n        (*self.0).resolve_auth_scheme_options(params)\n    }\n\n    fn resolve_auth_scheme_options_v2<'a>(\n        &'a self,\n        params: &'a AuthSchemeOptionResolverParams,\n        cfg: &'a ConfigBag,\n        runtime_components: &'a RuntimeComponents,\n    ) -> AuthSchemeOptionsFuture<'a> {\n        (*self.0).resolve_auth_scheme_options_v2(params, cfg, runtime_components)\n    }\n}\n\nimpl_shared_conversions!(\n    convert SharedAuthSchemeOptionResolver\n    from ResolveAuthSchemeOptions\n    using SharedAuthSchemeOptionResolver::new\n);\n\n/// An auth scheme.\n///\n/// Auth schemes have unique identifiers (the `scheme_id`),\n/// and provide an identity resolver and a signer.\npub trait AuthScheme: Send + Sync + fmt::Debug {\n    /// Returns the unique identifier associated with this auth scheme.\n    ///\n    /// This identifier is used to refer to this auth scheme from the\n    /// [`ResolveAuthSchemeOptions`], and is also associated with\n    /// identity resolvers in the config.\n    fn scheme_id(&self) -> AuthSchemeId;\n\n    /// Returns the identity resolver that can resolve an identity for this scheme, if one is available.\n    ///\n    /// The [`AuthScheme`] doesn't actually own an identity resolver. Rather, identity resolvers\n    /// are configured as runtime components. The auth scheme merely chooses a compatible identity\n    /// resolver from the runtime components via the [`GetIdentityResolver`] trait. The trait is\n    /// given rather than the full set of runtime components to prevent complex resolution logic\n    /// involving multiple components from taking place in this function, since that's not the\n    /// intended use of this design.\n    fn identity_resolver(\n        &self,\n        identity_resolvers: &dyn GetIdentityResolver,\n    ) -> Option<SharedIdentityResolver>;\n\n    /// Returns the signing implementation for this auth scheme.\n    fn signer(&self) -> &dyn Sign;\n}\n\n/// Container for a shared auth scheme implementation.\n#[derive(Clone, Debug)]\npub struct SharedAuthScheme(Arc<dyn AuthScheme>);\n\nimpl SharedAuthScheme {\n    /// Creates a new [`SharedAuthScheme`] from the given auth scheme.\n    pub fn new(auth_scheme: impl AuthScheme + 'static) -> Self {\n        Self(Arc::new(auth_scheme))\n    }\n}\n\nimpl AuthScheme for SharedAuthScheme {\n    fn scheme_id(&self) -> AuthSchemeId {\n        self.0.scheme_id()\n    }\n\n    fn identity_resolver(\n        &self,\n        identity_resolvers: &dyn GetIdentityResolver,\n    ) -> Option<SharedIdentityResolver> {\n        self.0.identity_resolver(identity_resolvers)\n    }\n\n    fn signer(&self) -> &dyn Sign {\n        self.0.signer()\n    }\n}\n\nimpl ValidateConfig for SharedAuthScheme {}\n\nimpl_shared_conversions!(convert SharedAuthScheme from AuthScheme using SharedAuthScheme::new);\n\n/// Signing implementation for an auth scheme.\npub trait Sign: Send + Sync + fmt::Debug {\n    /// Sign the given request with the given identity, components, and config.\n    ///\n    /// If the provided identity is incompatible with this signer, an error must be returned.\n    fn sign_http_request(\n        &self,\n        request: &mut HttpRequest,\n        identity: &Identity,\n        auth_scheme_endpoint_config: AuthSchemeEndpointConfig<'_>,\n        runtime_components: &RuntimeComponents,\n        config_bag: &ConfigBag,\n    ) -> Result<(), BoxError>;\n}\n\n/// Endpoint configuration for the selected auth scheme.\n///\n/// The configuration held by this struct originates from the endpoint rule set in the service model.\n///\n/// This struct gets added to the request state by the auth orchestrator.\n#[non_exhaustive]\n#[derive(Clone, Debug)]\npub struct AuthSchemeEndpointConfig<'a>(Option<&'a Document>);\n\nimpl<'a> AuthSchemeEndpointConfig<'a> {\n    /// Creates an empty [`AuthSchemeEndpointConfig`].\n    pub fn empty() -> Self {\n        Self(None)\n    }\n\n    /// Returns the endpoint configuration as a [`Document`].\n    pub fn as_document(&self) -> Option<&'a Document> {\n        self.0\n    }\n}\n\nimpl<'a> From<Option<&'a Document>> for AuthSchemeEndpointConfig<'a> {\n    fn from(value: Option<&'a Document>) -> Self {\n        Self(value)\n    }\n}\n\nimpl<'a> From<&'a Document> for AuthSchemeEndpointConfig<'a> {\n    fn from(value: &'a Document) -> Self {\n        Self(Some(value))\n    }\n}\n\n/// An ordered list of [AuthSchemeId]s\n///\n/// Can be used to reorder already-resolved auth schemes by an auth scheme resolver.\n/// This list is intended as a hint rather than a strict override;\n/// any schemes not present in the resolved auth schemes will be ignored.\n#[derive(Clone, Debug, Default, Eq, PartialEq)]\npub struct AuthSchemePreference {\n    preference_list: Vec<AuthSchemeId>,\n}\n\nimpl Storable for AuthSchemePreference {\n    type Storer = StoreReplace<Self>;\n}\n\nimpl IntoIterator for AuthSchemePreference {\n    type Item = AuthSchemeId;\n    type IntoIter = std::vec::IntoIter<Self::Item>;\n\n    fn into_iter(self) -> Self::IntoIter {\n        self.preference_list.into_iter()\n    }\n}\n\nimpl<T> From<T> for AuthSchemePreference\nwhere\n    T: AsRef<[AuthSchemeId]>,\n{\n    fn from(slice: T) -> Self {\n        AuthSchemePreference {\n            preference_list: slice.as_ref().to_vec(),\n        }\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n\n    #[test]\n    fn test_auth_scheme_id_new_normalizes_no_auth() {\n        // Test that \"no_auth\" gets normalized to \"noAuth\"\n        let auth_scheme_id = AuthSchemeId::new(\"no_auth\");\n        assert_eq!(auth_scheme_id.inner(), \"noAuth\");\n    }\n\n    #[test]\n    fn test_auth_scheme_id_new_preserves_no_auth_camel_case() {\n        // Test that \"noAuth\" remains unchanged\n        let auth_scheme_id = AuthSchemeId::new(\"noAuth\");\n        assert_eq!(auth_scheme_id.inner(), \"noAuth\");\n    }\n\n    #[test]\n    fn test_auth_scheme_id_new_preserves_other_schemes() {\n        // Test that other auth scheme IDs are not modified\n        let test_cases = [\n            \"sigv4\",\n            \"sigv4a\",\n            \"httpBearerAuth\",\n            \"httpBasicAuth\",\n            \"custom_auth\",\n            \"bearer\",\n            \"basic\",\n        ];\n\n        for scheme in test_cases {\n            let auth_scheme_id = AuthSchemeId::new(scheme);\n            assert_eq!(auth_scheme_id.inner(), scheme);\n        }\n    }\n\n    #[test]\n    fn test_auth_scheme_id_equality_after_normalization() {\n        // Test that \"no_auth\" and \"noAuth\" are considered equal after normalization\n        let no_auth_underscore = AuthSchemeId::new(\"no_auth\");\n        let no_auth_camel = AuthSchemeId::new(\"noAuth\");\n\n        assert_eq!(no_auth_underscore, no_auth_camel);\n        assert_eq!(no_auth_underscore.inner(), no_auth_camel.inner());\n    }\n\n    #[test]\n    fn test_auth_scheme_id_hash_consistency_after_normalization() {\n        use std::collections::HashMap;\n\n        // Test that normalized IDs have consistent hashing behavior\n        let mut map = HashMap::new();\n        let no_auth_underscore = AuthSchemeId::new(\"no_auth\");\n        let no_auth_camel = AuthSchemeId::new(\"noAuth\");\n\n        map.insert(no_auth_underscore.clone(), \"value1\");\n        map.insert(no_auth_camel.clone(), \"value2\");\n\n        // Should only have one entry since they normalize to the same value\n        assert_eq!(map.len(), 1);\n        assert_eq!(map.get(&no_auth_underscore), Some(&\"value2\"));\n        assert_eq!(map.get(&no_auth_camel), Some(&\"value2\"));\n    }\n\n    #[test]\n    fn test_auth_scheme_id_ordering_after_normalization() {\n        // Test that ordering works correctly with normalized values\n        let no_auth_underscore = AuthSchemeId::new(\"no_auth\");\n        let no_auth_camel = AuthSchemeId::new(\"noAuth\");\n        let other_scheme = AuthSchemeId::new(\"sigv4\");\n\n        assert_eq!(\n            no_auth_underscore.cmp(&no_auth_camel),\n            std::cmp::Ordering::Equal\n        );\n        assert_eq!(no_auth_underscore.cmp(&other_scheme), \"noAuth\".cmp(\"sigv4\"));\n    }\n\n    #[test]\n    fn test_normalize_auth_scheme_id_function() {\n        // Test the normalize function directly\n        assert_eq!(normalize_auth_scheme_id(\"no_auth\"), \"noAuth\");\n        assert_eq!(normalize_auth_scheme_id(\"noAuth\"), \"noAuth\");\n        assert_eq!(normalize_auth_scheme_id(\"sigv4\"), \"sigv4\");\n        assert_eq!(normalize_auth_scheme_id(\"custom\"), \"custom\");\n    }\n\n    #[test]\n    fn test_auth_scheme_id_from_cow_borrowed_normalizes_no_auth() {\n        // Test that Cow::Borrowed(\"no_auth\") gets normalized to \"noAuth\"\n        let auth_scheme_id = AuthSchemeId::from(Cow::Borrowed(\"no_auth\"));\n        assert_eq!(auth_scheme_id.inner(), \"noAuth\");\n    }\n\n    #[test]\n    fn test_auth_scheme_id_from_cow_borrowed_preserves_no_auth_camel_case() {\n        // Test that Cow::Borrowed(\"noAuth\") remains unchanged\n        let auth_scheme_id = AuthSchemeId::from(Cow::Borrowed(\"noAuth\"));\n        assert_eq!(auth_scheme_id.inner(), \"noAuth\");\n    }\n\n    #[test]\n    fn test_auth_scheme_id_from_cow_owned_normalizes_no_auth() {\n        // Test that Cow::Owned(String::from(\"no_auth\")) gets normalized to \"noAuth\"\n        let auth_scheme_id = AuthSchemeId::from(Cow::Owned(String::from(\"no_auth\")));\n        assert_eq!(auth_scheme_id.inner(), \"noAuth\");\n    }\n\n    #[test]\n    fn test_auth_scheme_id_from_cow_owned_preserves_no_auth_camel_case() {\n        // Test that Cow::Owned(String::from(\"noAuth\")) remains unchanged\n        let auth_scheme_id = AuthSchemeId::from(Cow::Owned(String::from(\"noAuth\")));\n        assert_eq!(auth_scheme_id.inner(), \"noAuth\");\n    }\n\n    #[test]\n    fn test_auth_scheme_id_from_cow_between_borrowed_and_owned_mixing_updated_and_legacy() {\n        let borrowed_no_auth = AuthSchemeId::from(Cow::Borrowed(\"noAuth\"));\n        let owned_no_auth = AuthSchemeId::from(Cow::Owned(String::from(\"no_auth\")));\n\n        assert_eq!(borrowed_no_auth, owned_no_auth);\n        assert_eq!(borrowed_no_auth.inner(), owned_no_auth.inner());\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime-api/src/client/behavior_version.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Behavior version of the client\n\n/// Behavior version of the client\n///\n/// Over time, new best-practice behaviors are introduced. However, these behaviors might not be\n/// backwards compatible. For example, a change which introduces new default timeouts or a new\n/// retry-mode for all operations might be the ideal behavior but could break existing applications.\n#[derive(Copy, Clone, PartialEq)]\npub struct BehaviorVersion {\n    inner: Inner,\n}\n\n#[derive(Copy, Clone, Debug, Ord, PartialOrd, Eq, PartialEq)]\nenum Inner {\n    // IMPORTANT: Order matters here for the `Ord` derive. Newer versions go to the bottom.\n    V2023_11_09,\n    V2024_03_28,\n    V2025_01_17,\n    V2025_08_07,\n    V2026_01_12,\n}\n\nimpl BehaviorVersion {\n    /// This method will always return the latest major version.\n    ///\n    /// This is the recommend choice for customers who aren't reliant on extremely specific behavior\n    /// characteristics. For example, if you are writing a CLI app, the latest behavior major\n    /// version is probably the best setting for you.\n    ///\n    /// If, however, you're writing a service that is very latency sensitive, or that has written\n    /// code to tune Rust SDK behaviors, consider pinning to a specific major version.\n    ///\n    /// The latest version is currently [`BehaviorVersion::v2026_01_12`]\n    pub fn latest() -> Self {\n        Self::v2026_01_12()\n    }\n\n    /// Behavior version for January 12th, 2026.\n    ///\n    /// This version enables retries by default for AWS SDK clients. Generic Smithy clients\n    /// (non-AWS) do not have retries enabled by default.\n    ///\n    /// Additionally, this version sets a 3.1 second connect timeout for all clients.\n    ///\n    /// For more information about behavior versions and how they affect SDK behavior, see the\n    /// [AWS SDK for Rust Developer Guide](https://docs.aws.amazon.com/sdk-for-rust/latest/dg/behavior-versions.html).\n    pub fn v2026_01_12() -> Self {\n        Self {\n            inner: Inner::V2026_01_12,\n        }\n    }\n\n    /// Behavior version for August 7th, 2025.\n    ///\n    /// This version updates the default HTTPS client to support proxy environment variables\n    /// (e.g. `HTTP_PROXY`, `HTTPS_PROXY`, `NO_PROXY`) by default.\n    #[deprecated(\n        since = \"1.10.0\",\n        note = \"Superseded by v2026_01_12, which enables retries by default for AWS SDK clients and sets a 3.1s connect timeout for all clients.\"\n    )]\n    pub fn v2025_08_07() -> Self {\n        Self {\n            inner: Inner::V2025_08_07,\n        }\n    }\n\n    /// Behavior version for January 17th, 2025\n    ///\n    /// This version updates the default HTTP client and TLS stack. SDKs shipped with\n    /// a pre 1.x version of hyper and rustls originally. This behavior version updates\n    /// the HTTP+TLS stack to maintained versions.\n    ///\n    /// <div class=\"warning\">\n    /// NOTE: In a future release behavior versions prior to this will require enabling\n    /// feature flags manually to keep the legacy Hyper stack as the default. Specifically the\n    /// `aws-smithy-runtime/tls-rustls` feature flag combined with an older behavior version.\n    /// </div>\n    #[deprecated(\n        since = \"1.9.0\",\n        note = \"Superseded by v2025_08_07, which enables automatic HTTP(S) proxy support from environment variables in the default HTTPS client.\"\n    )]\n    pub fn v2025_01_17() -> Self {\n        Self {\n            inner: Inner::V2025_01_17,\n        }\n    }\n\n    /// Behavior version for March 28th, 2024.\n    ///\n    /// This version enables stalled stream protection for uploads (request bodies) by default.\n    ///\n    /// When a new behavior major version is released, this method will be deprecated.\n    #[deprecated(\n        since = \"1.8.0\",\n        note = \"Superseded by v2025_01_17, which updates the default HTTPS client stack.\"\n    )]\n    pub fn v2024_03_28() -> Self {\n        Self {\n            inner: Inner::V2024_03_28,\n        }\n    }\n\n    /// Behavior version for November 9th, 2023.\n    #[deprecated(\n        since = \"1.4.0\",\n        note = \"Superseded by v2024_03_28, which enabled stalled stream protection for uploads (request bodies) by default.\"\n    )]\n    pub fn v2023_11_09() -> Self {\n        Self {\n            inner: Inner::V2023_11_09,\n        }\n    }\n\n    /// True if this version is newer or equal to the given `other` version.\n    pub fn is_at_least(&self, other: BehaviorVersion) -> bool {\n        self.inner >= other.inner\n    }\n}\n\nimpl std::fmt::Debug for BehaviorVersion {\n    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n        f.debug_tuple(\"BehaviorVersion\").field(&self.inner).finish()\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n\n    #[test]\n    #[allow(deprecated)]\n    fn version_comparison() {\n        assert!(BehaviorVersion::latest() == BehaviorVersion::latest());\n        assert!(BehaviorVersion::v2023_11_09() == BehaviorVersion::v2023_11_09());\n        assert!(BehaviorVersion::v2024_03_28() != BehaviorVersion::v2023_11_09());\n        assert!(BehaviorVersion::v2025_01_17() != BehaviorVersion::v2024_03_28());\n        assert!(BehaviorVersion::latest().is_at_least(BehaviorVersion::latest()));\n        assert!(BehaviorVersion::latest().is_at_least(BehaviorVersion::v2023_11_09()));\n        assert!(BehaviorVersion::latest().is_at_least(BehaviorVersion::v2024_03_28()));\n        assert!(BehaviorVersion::latest().is_at_least(BehaviorVersion::v2025_01_17()));\n        assert!(BehaviorVersion::latest().is_at_least(BehaviorVersion::v2025_08_07()));\n        assert!(!BehaviorVersion::v2023_11_09().is_at_least(BehaviorVersion::v2024_03_28()));\n        assert!(Inner::V2024_03_28 > Inner::V2023_11_09);\n        assert!(Inner::V2023_11_09 < Inner::V2024_03_28);\n        assert!(Inner::V2024_03_28 < Inner::V2025_01_17);\n        assert!(Inner::V2025_01_17 < Inner::V2025_08_07);\n        assert!(Inner::V2025_08_07 < Inner::V2026_01_12);\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime-api/src/client/connection.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Types related to connection monitoring and management.\n\nuse aws_smithy_types::config_bag::{Storable, StoreReplace};\nuse std::fmt;\nuse std::net::SocketAddr;\nuse std::sync::{Arc, Mutex};\n\n/// Metadata that tracks the state of an active connection.\n#[derive(Clone)]\npub struct ConnectionMetadata {\n    is_proxied: bool,\n    remote_addr: Option<SocketAddr>,\n    local_addr: Option<SocketAddr>,\n    poison_fn: Arc<dyn Fn() + Send + Sync>,\n}\n\nimpl ConnectionMetadata {\n    /// Poison this connection, ensuring that it won't be reused.\n    pub fn poison(&self) {\n        tracing::info!(\n            see_for_more_info = \"https://smithy-lang.github.io/smithy-rs/design/client/detailed_error_explanations.html\",\n            \"Connection encountered an issue and should not be re-used. Marking it for closure\"\n        );\n        (self.poison_fn)()\n    }\n\n    /// Create a new [`ConnectionMetadata`].\n    #[deprecated(\n        since = \"1.1.0\",\n        note = \"`ConnectionMetadata::new` is deprecated in favour of `ConnectionMetadata::builder`.\"\n    )]\n    pub fn new(\n        is_proxied: bool,\n        remote_addr: Option<SocketAddr>,\n        poison: impl Fn() + Send + Sync + 'static,\n    ) -> Self {\n        Self {\n            is_proxied,\n            remote_addr,\n            // need to use builder to set this field\n            local_addr: None,\n            poison_fn: Arc::new(poison),\n        }\n    }\n\n    /// Builder for this connection metadata\n    pub fn builder() -> ConnectionMetadataBuilder {\n        ConnectionMetadataBuilder::new()\n    }\n\n    /// Get the remote address for this connection, if one is set.\n    pub fn remote_addr(&self) -> Option<SocketAddr> {\n        self.remote_addr\n    }\n\n    /// Get the local address for this connection, if one is set.\n    pub fn local_addr(&self) -> Option<SocketAddr> {\n        self.local_addr\n    }\n}\n\nimpl fmt::Debug for ConnectionMetadata {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        f.debug_struct(\"SmithyConnection\")\n            .field(\"is_proxied\", &self.is_proxied)\n            .field(\"remote_addr\", &self.remote_addr)\n            .field(\"local_addr\", &self.local_addr)\n            .finish()\n    }\n}\n\n/// Builder type that is used to construct a [`ConnectionMetadata`] value.\n#[derive(Default)]\npub struct ConnectionMetadataBuilder {\n    is_proxied: Option<bool>,\n    remote_addr: Option<SocketAddr>,\n    local_addr: Option<SocketAddr>,\n    poison_fn: Option<Arc<dyn Fn() + Send + Sync>>,\n}\n\nimpl fmt::Debug for ConnectionMetadataBuilder {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        f.debug_struct(\"ConnectionMetadataBuilder\")\n            .field(\"is_proxied\", &self.is_proxied)\n            .field(\"remote_addr\", &self.remote_addr)\n            .field(\"local_addr\", &self.local_addr)\n            .finish()\n    }\n}\n\nimpl ConnectionMetadataBuilder {\n    /// Creates a new builder.\n    pub fn new() -> Self {\n        Self::default()\n    }\n\n    /// Set whether or not the associated connection is to an HTTP proxy.\n    pub fn proxied(mut self, proxied: bool) -> Self {\n        self.set_proxied(Some(proxied));\n        self\n    }\n\n    /// Set whether or not the associated connection is to an HTTP proxy.\n    pub fn set_proxied(&mut self, proxied: Option<bool>) -> &mut Self {\n        self.is_proxied = proxied;\n        self\n    }\n\n    /// Set the remote address of the connection used.\n    pub fn remote_addr(mut self, remote_addr: SocketAddr) -> Self {\n        self.set_remote_addr(Some(remote_addr));\n        self\n    }\n\n    /// Set the remote address of the connection used.\n    pub fn set_remote_addr(&mut self, remote_addr: Option<SocketAddr>) -> &mut Self {\n        self.remote_addr = remote_addr;\n        self\n    }\n\n    /// Set the local address of the connection used.\n    pub fn local_addr(mut self, local_addr: SocketAddr) -> Self {\n        self.set_local_addr(Some(local_addr));\n        self\n    }\n\n    /// Set the local address of the connection used.\n    pub fn set_local_addr(&mut self, local_addr: Option<SocketAddr>) -> &mut Self {\n        self.local_addr = local_addr;\n        self\n    }\n\n    /// Set a closure which will poison the associated connection.\n    ///\n    /// A poisoned connection will not be reused for subsequent requests by the pool\n    pub fn poison_fn(mut self, poison_fn: impl Fn() + Send + Sync + 'static) -> Self {\n        self.set_poison_fn(Some(poison_fn));\n        self\n    }\n\n    /// Set a closure which will poison the associated connection.\n    ///\n    /// A poisoned connection will not be reused for subsequent requests by the pool\n    pub fn set_poison_fn(\n        &mut self,\n        poison_fn: Option<impl Fn() + Send + Sync + 'static>,\n    ) -> &mut Self {\n        self.poison_fn =\n            poison_fn.map(|poison_fn| Arc::new(poison_fn) as Arc<dyn Fn() + Send + Sync>);\n        self\n    }\n\n    /// Build a [`ConnectionMetadata`] value.\n    ///\n    /// # Panics\n    ///\n    /// If either the `is_proxied` or `poison_fn` has not been set, then this method will panic\n    pub fn build(self) -> ConnectionMetadata {\n        ConnectionMetadata {\n            is_proxied: self\n                .is_proxied\n                .expect(\"is_proxied should be set for ConnectionMetadata\"),\n            remote_addr: self.remote_addr,\n            local_addr: self.local_addr,\n            poison_fn: self\n                .poison_fn\n                .expect(\"poison_fn should be set for ConnectionMetadata\"),\n        }\n    }\n}\n\ntype LoaderFn = dyn Fn() -> Option<ConnectionMetadata> + Send + Sync;\n\n/// State for a middleware that will monitor and manage connections.\n#[derive(Clone, Default)]\npub struct CaptureSmithyConnection {\n    loader: Arc<Mutex<Option<Box<LoaderFn>>>>,\n}\n\nimpl CaptureSmithyConnection {\n    /// Create a new connection monitor.\n    pub fn new() -> Self {\n        Self {\n            loader: Default::default(),\n        }\n    }\n\n    /// Set the retriever that will capture the `hyper` connection.\n    pub fn set_connection_retriever<F>(&self, f: F)\n    where\n        F: Fn() -> Option<ConnectionMetadata> + Send + Sync + 'static,\n    {\n        *self.loader.lock().unwrap() = Some(Box::new(f));\n    }\n\n    /// Get the associated connection metadata.\n    pub fn get(&self) -> Option<ConnectionMetadata> {\n        match self.loader.lock().unwrap().as_ref() {\n            Some(loader) => loader(),\n            None => {\n                tracing::debug!(\"no loader was set on the CaptureSmithyConnection\");\n                None\n            }\n        }\n    }\n}\n\nimpl fmt::Debug for CaptureSmithyConnection {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        write!(f, \"CaptureSmithyConnection\")\n    }\n}\n\nimpl Storable for CaptureSmithyConnection {\n    type Storer = StoreReplace<Self>;\n}\n\n#[cfg(test)]\nmod tests {\n    use std::{\n        net::{IpAddr, Ipv6Addr},\n        sync::Mutex,\n    };\n\n    use super::*;\n\n    const TEST_SOCKET_ADDR: SocketAddr = SocketAddr::new(IpAddr::V6(Ipv6Addr::UNSPECIFIED), 100);\n\n    #[test]\n    #[should_panic]\n    fn builder_panic_missing_proxied() {\n        ConnectionMetadataBuilder::new()\n            .poison_fn(|| {})\n            .local_addr(TEST_SOCKET_ADDR)\n            .remote_addr(TEST_SOCKET_ADDR)\n            .build();\n    }\n\n    #[test]\n    #[should_panic]\n    fn builder_panic_missing_poison_fn() {\n        ConnectionMetadataBuilder::new()\n            .proxied(true)\n            .local_addr(TEST_SOCKET_ADDR)\n            .remote_addr(TEST_SOCKET_ADDR)\n            .build();\n    }\n\n    #[test]\n    fn builder_all_fields_successful() {\n        let mutable_flag = Arc::new(Mutex::new(false));\n\n        let connection_metadata = ConnectionMetadataBuilder::new()\n            .proxied(true)\n            .local_addr(TEST_SOCKET_ADDR)\n            .remote_addr(TEST_SOCKET_ADDR)\n            .poison_fn({\n                let mutable_flag = Arc::clone(&mutable_flag);\n                move || {\n                    let mut guard = mutable_flag.lock().unwrap();\n                    *guard = !*guard;\n                }\n            })\n            .build();\n\n        assert!(connection_metadata.is_proxied);\n        assert_eq!(connection_metadata.remote_addr(), Some(TEST_SOCKET_ADDR));\n        assert_eq!(connection_metadata.local_addr(), Some(TEST_SOCKET_ADDR));\n        assert!(!(*mutable_flag.lock().unwrap()));\n        connection_metadata.poison();\n        assert!(*mutable_flag.lock().unwrap());\n    }\n\n    #[test]\n    fn builder_optional_fields_translate() {\n        let metadata1 = ConnectionMetadataBuilder::new()\n            .proxied(true)\n            .poison_fn(|| {})\n            .build();\n\n        assert_eq!(metadata1.local_addr(), None);\n        assert_eq!(metadata1.remote_addr(), None);\n\n        let metadata2 = ConnectionMetadataBuilder::new()\n            .proxied(true)\n            .poison_fn(|| {})\n            .local_addr(TEST_SOCKET_ADDR)\n            .build();\n\n        assert_eq!(metadata2.local_addr(), Some(TEST_SOCKET_ADDR));\n        assert_eq!(metadata2.remote_addr(), None);\n\n        let metadata3 = ConnectionMetadataBuilder::new()\n            .proxied(true)\n            .poison_fn(|| {})\n            .remote_addr(TEST_SOCKET_ADDR)\n            .build();\n\n        assert_eq!(metadata3.local_addr(), None);\n        assert_eq!(metadata3.remote_addr(), Some(TEST_SOCKET_ADDR));\n    }\n\n    #[test]\n    #[allow(clippy::redundant_clone)]\n    fn retrieve_connection_metadata() {\n        let retriever = CaptureSmithyConnection::new();\n        let retriever_clone = retriever.clone();\n        assert!(retriever.get().is_none());\n        retriever.set_connection_retriever(|| {\n            Some(\n                ConnectionMetadata::builder()\n                    .proxied(true)\n                    .poison_fn(|| {})\n                    .build(),\n            )\n        });\n\n        assert!(retriever.get().is_some());\n        assert!(retriever_clone.get().is_some());\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime-api/src/client/connector_metadata.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! New-type for a configurable app name.\n\nuse std::borrow::Cow;\nuse std::fmt;\n\n/// The name of the crate that provides the HTTP connectors and its version.\n///\n/// This should be set by the connector's runtime plugin. Note that this is for\n/// the **connector** returned by an HTTP client, not the HTTP client itself.\n#[derive(Clone, Debug, PartialEq, Eq)]\npub struct ConnectorMetadata {\n    name: Cow<'static, str>,\n    version: Option<Cow<'static, str>>,\n}\n\nimpl ConnectorMetadata {\n    /// Create a new [`ConnectorMetadata`].\n    pub fn new(name: impl Into<Cow<'static, str>>, version: Option<Cow<'static, str>>) -> Self {\n        Self {\n            name: name.into(),\n            version,\n        }\n    }\n\n    /// Return the name of the crate backing a connector.\n    pub fn name(&self) -> Cow<'static, str> {\n        self.name.clone()\n    }\n\n    /// Return the version of the crate backing a connector.\n    pub fn version(&self) -> Option<Cow<'static, str>> {\n        self.version.clone()\n    }\n}\n\nimpl fmt::Display for ConnectorMetadata {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        write!(f, \"http#{}\", self.name)?;\n        if let Some(version) = self.version.as_deref() {\n            write!(f, \"-{version}\")?;\n        }\n\n        Ok(())\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime-api/src/client/dns.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Interfaces for resolving DNS\n\nuse crate::box_error::BoxError;\nuse crate::impl_shared_conversions;\nuse std::error::Error as StdError;\nuse std::fmt;\nuse std::net::IpAddr;\nuse std::sync::Arc;\n\n/// Error that occurs when failing to perform a DNS lookup.\n#[derive(Debug)]\npub struct ResolveDnsError {\n    source: BoxError,\n}\n\nimpl ResolveDnsError {\n    /// Creates a new `DnsLookupFailed` error.\n    pub fn new(source: impl Into<BoxError>) -> Self {\n        ResolveDnsError {\n            source: source.into(),\n        }\n    }\n}\n\nimpl fmt::Display for ResolveDnsError {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        write!(f, \"failed to perform DNS lookup\")\n    }\n}\n\nimpl StdError for ResolveDnsError {\n    fn source(&self) -> Option<&(dyn StdError + 'static)> {\n        Some(&*self.source as _)\n    }\n}\n\nnew_type_future! {\n    #[doc = \"New-type for the future returned by the [`ResolveDns`] trait.\"]\n    pub struct DnsFuture<'a, Vec<IpAddr>, ResolveDnsError>;\n}\n\n/// Trait for resolving domain names\npub trait ResolveDns: fmt::Debug + Send + Sync {\n    /// Asynchronously resolve the given domain name\n    fn resolve_dns<'a>(&'a self, name: &'a str) -> DnsFuture<'a>;\n}\n\n/// Shared instance of [`ResolveDns`].\n#[derive(Clone, Debug)]\npub struct SharedDnsResolver(Arc<dyn ResolveDns>);\n\nimpl SharedDnsResolver {\n    /// Create a new `SharedDnsResolver`.\n    pub fn new(resolver: impl ResolveDns + 'static) -> Self {\n        Self(Arc::new(resolver))\n    }\n}\n\nimpl ResolveDns for SharedDnsResolver {\n    fn resolve_dns<'a>(&'a self, name: &'a str) -> DnsFuture<'a> {\n        self.0.resolve_dns(name)\n    }\n}\n\nimpl_shared_conversions!(convert SharedDnsResolver from ResolveDns using SharedDnsResolver::new);\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n\n    #[test]\n    fn check_send() {\n        fn is_send<T: Send>() {}\n        is_send::<DnsFuture<'_>>();\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime-api/src/client/endpoint.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! APIs needed to configure endpoint resolution for clients.\n\nuse crate::box_error::BoxError;\nuse crate::client::runtime_components::sealed::ValidateConfig;\nuse crate::impl_shared_conversions;\nuse aws_smithy_types::config_bag::{Storable, StoreReplace};\nuse aws_smithy_types::endpoint::Endpoint;\nuse aws_smithy_types::type_erasure::TypeErasedBox;\nuse error::InvalidEndpointError;\nuse http_02x::uri::Authority;\nuse std::any::TypeId;\nuse std::collections::HashMap;\nuse std::fmt;\nuse std::str::FromStr;\nuse std::sync::Arc;\n\nnew_type_future! {\n    #[doc = \"Future for [`ResolveEndpoint::resolve_endpoint`].\"]\n    pub struct EndpointFuture<'a, Endpoint, BoxError>;\n}\n\n/// Parameters originating from the Smithy endpoint ruleset required for endpoint resolution.\n///\n/// The actual endpoint parameters are code generated from the Smithy model, and thus,\n/// are not known to the runtime crates. Hence, this struct is really a new-type around\n/// a [`TypeErasedBox`] that holds the actual concrete parameters in it.\n///\n/// This struct allows the caller to store and retrieve properties of arbitrary types.\n/// These arbitrary properties are intended to be incorporated into the concrete parameters\n/// by [`ResolveEndpoint::finalize_params`].\n#[derive(Debug)]\npub struct EndpointResolverParams {\n    inner: TypeErasedBox,\n    property: HashMap<TypeId, TypeErasedBox>,\n}\n\nimpl EndpointResolverParams {\n    /// Creates a new [`EndpointResolverParams`] from a concrete parameters instance.\n    pub fn new<T: fmt::Debug + Send + Sync + 'static>(params: T) -> Self {\n        Self {\n            inner: TypeErasedBox::new(params),\n            property: HashMap::new(),\n        }\n    }\n\n    /// Attempts to downcast the underlying concrete parameters to `T` and return it as a reference.\n    pub fn get<T: fmt::Debug + Send + Sync + 'static>(&self) -> Option<&T> {\n        self.inner.downcast_ref()\n    }\n\n    /// Attempts to downcast the underlying concrete parameters to `T` and return it as a mutable reference.\n    pub fn get_mut<T: fmt::Debug + Send + Sync + 'static>(&mut self) -> Option<&mut T> {\n        self.inner.downcast_mut()\n    }\n\n    /// Sets property of an arbitrary type `T` for the endpoint resolver params.\n    pub fn set_property<T: fmt::Debug + Send + Sync + 'static>(&mut self, t: T) {\n        self.property\n            .insert(TypeId::of::<T>(), TypeErasedBox::new(t));\n    }\n\n    /// Attempts to retrieve a reference to property of a given type `T`.\n    pub fn get_property<T: fmt::Debug + Send + Sync + 'static>(&self) -> Option<&T> {\n        self.property\n            .get(&TypeId::of::<T>())\n            .and_then(|b| b.downcast_ref())\n    }\n\n    /// Attempts to retrieve a mutable reference to property of a given type `T`.\n    pub fn get_property_mut<T: fmt::Debug + Send + Sync + 'static>(&mut self) -> Option<&mut T> {\n        self.property\n            .get_mut(&TypeId::of::<T>())\n            .and_then(|b| b.downcast_mut())\n    }\n}\n\nimpl Storable for EndpointResolverParams {\n    type Storer = StoreReplace<Self>;\n}\n\n/// Configurable endpoint resolver implementation.\npub trait ResolveEndpoint: Send + Sync + fmt::Debug {\n    /// Asynchronously resolves an endpoint to use from the given endpoint parameters.\n    fn resolve_endpoint<'a>(&'a self, params: &'a EndpointResolverParams) -> EndpointFuture<'a>;\n\n    /// Finalize the service-specific concrete parameters in `_params`.\n    ///\n    /// The `EndpointResolverParams` may need to include additional data at a later point,\n    /// after its creation in the `read_before_execution` method of an endpoint parameters interceptor.\n    /// Modifying it directly within the [`ResolveEndpoint::resolve_endpoint`] method is not feasible,\n    /// as `params` is passed by reference. This means that incorporating extra data would require\n    /// cloning `params` within the method. However, the return type `EndpointFuture` has a lifetime\n    /// tied to the input argument, making it impossible to return the cloned `params`, as its lifetime\n    /// is scoped to the method.\n    fn finalize_params<'a>(\n        &'a self,\n        _params: &'a mut EndpointResolverParams,\n    ) -> Result<(), BoxError> {\n        Ok(())\n    }\n}\n\n/// Shared endpoint resolver.\n///\n/// This is a simple shared ownership wrapper type for the [`ResolveEndpoint`] trait.\n#[derive(Clone, Debug)]\npub struct SharedEndpointResolver(Arc<dyn ResolveEndpoint>);\n\nimpl SharedEndpointResolver {\n    /// Creates a new [`SharedEndpointResolver`].\n    pub fn new(endpoint_resolver: impl ResolveEndpoint + 'static) -> Self {\n        Self(Arc::new(endpoint_resolver))\n    }\n}\n\nimpl ResolveEndpoint for SharedEndpointResolver {\n    fn resolve_endpoint<'a>(&'a self, params: &'a EndpointResolverParams) -> EndpointFuture<'a> {\n        self.0.resolve_endpoint(params)\n    }\n\n    fn finalize_params<'a>(\n        &'a self,\n        params: &'a mut EndpointResolverParams,\n    ) -> Result<(), BoxError> {\n        self.0.finalize_params(params)\n    }\n}\n\nimpl ValidateConfig for SharedEndpointResolver {}\n\nimpl_shared_conversions!(convert SharedEndpointResolver from ResolveEndpoint using SharedEndpointResolver::new);\n\n/// A special type that adds support for services that have special URL-prefixing rules.\n#[derive(Clone, Debug, Eq, PartialEq)]\npub struct EndpointPrefix(String);\nimpl EndpointPrefix {\n    /// Create a new endpoint prefix from an `impl Into<String>`. If the prefix argument is invalid,\n    /// a [`InvalidEndpointError`] will be returned.\n    pub fn new(prefix: impl Into<String>) -> Result<Self, InvalidEndpointError> {\n        let prefix = prefix.into();\n        match Authority::from_str(&prefix) {\n            Ok(_) => Ok(EndpointPrefix(prefix)),\n            Err(err) => Err(InvalidEndpointError::failed_to_construct_authority(\n                prefix, err,\n            )),\n        }\n    }\n\n    /// Get the `str` representation of this `EndpointPrefix`.\n    pub fn as_str(&self) -> &str {\n        &self.0\n    }\n}\n\nimpl Storable for EndpointPrefix {\n    type Storer = StoreReplace<Self>;\n}\n\n/// Errors related to endpoint resolution and validation\npub mod error {\n    use crate::box_error::BoxError;\n    use std::error::Error as StdError;\n    use std::fmt;\n\n    /// Endpoint resolution failed\n    #[derive(Debug)]\n    pub struct ResolveEndpointError {\n        message: String,\n        source: Option<BoxError>,\n    }\n\n    impl ResolveEndpointError {\n        /// Create an [`ResolveEndpointError`] with a message\n        pub fn message(message: impl Into<String>) -> Self {\n            Self {\n                message: message.into(),\n                source: None,\n            }\n        }\n\n        /// Add a source to the error\n        pub fn with_source(self, source: Option<BoxError>) -> Self {\n            Self { source, ..self }\n        }\n\n        /// Create a [`ResolveEndpointError`] from a message and a source\n        pub fn from_source(message: impl Into<String>, source: impl Into<BoxError>) -> Self {\n            Self::message(message).with_source(Some(source.into()))\n        }\n    }\n\n    impl fmt::Display for ResolveEndpointError {\n        fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n            write!(f, \"{}\", self.message)\n        }\n    }\n\n    impl StdError for ResolveEndpointError {\n        fn source(&self) -> Option<&(dyn StdError + 'static)> {\n            self.source.as_ref().map(|err| err.as_ref() as _)\n        }\n    }\n\n    #[derive(Debug)]\n    pub(super) enum InvalidEndpointErrorKind {\n        EndpointMustHaveScheme,\n        FailedToConstructAuthority { authority: String, source: BoxError },\n        FailedToConstructUri { source: BoxError },\n    }\n\n    /// An error that occurs when an endpoint is found to be invalid. This usually occurs due to an\n    /// incomplete URI.\n    #[derive(Debug)]\n    pub struct InvalidEndpointError {\n        pub(super) kind: InvalidEndpointErrorKind,\n    }\n\n    impl InvalidEndpointError {\n        /// Construct a build error for a missing scheme\n        pub fn endpoint_must_have_scheme() -> Self {\n            Self {\n                kind: InvalidEndpointErrorKind::EndpointMustHaveScheme,\n            }\n        }\n\n        /// Construct a build error for an invalid authority\n        pub fn failed_to_construct_authority(\n            authority: impl Into<String>,\n            source: impl Into<Box<dyn StdError + Send + Sync + 'static>>,\n        ) -> Self {\n            Self {\n                kind: InvalidEndpointErrorKind::FailedToConstructAuthority {\n                    authority: authority.into(),\n                    source: source.into(),\n                },\n            }\n        }\n\n        /// Construct a build error for an invalid URI\n        pub fn failed_to_construct_uri(\n            source: impl Into<Box<dyn StdError + Send + Sync + 'static>>,\n        ) -> Self {\n            Self {\n                kind: InvalidEndpointErrorKind::FailedToConstructUri {\n                    source: source.into(),\n                },\n            }\n        }\n    }\n\n    impl From<InvalidEndpointErrorKind> for InvalidEndpointError {\n        fn from(kind: InvalidEndpointErrorKind) -> Self {\n            Self { kind }\n        }\n    }\n\n    impl fmt::Display for InvalidEndpointError {\n        fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n            use InvalidEndpointErrorKind as ErrorKind;\n            match &self.kind {\n            ErrorKind::EndpointMustHaveScheme => write!(f, \"endpoint must contain a valid scheme\"),\n            ErrorKind::FailedToConstructAuthority { authority, source: _ } => write!(\n                f,\n                \"endpoint must contain a valid authority when combined with endpoint prefix: {authority}\"\n            ),\n            ErrorKind::FailedToConstructUri { .. } => write!(f, \"failed to construct URI\"),\n        }\n        }\n    }\n\n    impl StdError for InvalidEndpointError {\n        fn source(&self) -> Option<&(dyn StdError + 'static)> {\n            use InvalidEndpointErrorKind as ErrorKind;\n            match &self.kind {\n                ErrorKind::FailedToConstructUri { source } => Some(source.as_ref()),\n                ErrorKind::FailedToConstructAuthority {\n                    authority: _,\n                    source,\n                } => Some(source.as_ref()),\n                ErrorKind::EndpointMustHaveScheme => None,\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime-api/src/client/http.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! HTTP clients and connectors\n//!\n//! # What is a connector?\n//!\n//! When we talk about connectors, we are referring to the [`HttpConnector`] trait, and implementations of\n//! that trait. This trait simply takes a HTTP request, and returns a future with the response for that\n//! request.\n//!\n//! This is slightly different from what a connector is in other libraries such as\n//! [`hyper`]. In hyper 0.x, the connector is a [`tower`] `Service` that takes a `Uri` and returns\n//! a future with something that implements `AsyncRead + AsyncWrite`.\n//!\n//! The [`HttpConnector`] is designed to be a layer on top of\n//! whole HTTP libraries, such as hyper, which allows Smithy clients to be agnostic to the underlying HTTP\n//! transport layer. This also makes it easy to write tests with a fake HTTP connector, and several\n//! such test connector implementations are available in [`aws-smithy-runtime`]\n//! with the `test-util` feature enabled.\n//!\n//! # Responsibilities of a connector\n//!\n//! A connector primarily makes HTTP requests, but is also the place where connect and read timeouts are\n//! implemented. The `HyperConnector` in [`aws-smithy-runtime`] is an example where timeouts are implemented\n//! as part of the connector.\n//!\n//! Connectors are also responsible for DNS lookup, TLS, connection reuse, pooling, and eviction.\n//! The Smithy clients have no knowledge of such concepts.\n//!\n//! # The [`HttpClient`] trait\n//!\n//! Connectors allow us to make requests, but we need a layer on top of connectors so that we can handle\n//! varying connector settings. For example, say we configure some default HTTP connect/read timeouts on\n//! Client, and then configure some override connect/read timeouts for a specific operation. These timeouts\n//! ultimately are part of the connector, so the same connector can't be reused for the two different sets\n//! of timeouts. Thus, the [`HttpClient`] implementation is responsible for managing multiple connectors\n//! with varying config. Some example configs that can impact which connector is used:\n//!\n//! - HTTP protocol versions\n//! - TLS settings\n//! - Timeouts\n//!\n//! Some of these aren't implemented yet, but they will appear in the [`HttpConnectorSettings`] struct\n//! once they are.\n//!\n//! [`hyper`]: https://crates.io/crates/hyper\n//! [`tower`]: https://crates.io/crates/tower\n//! [`aws-smithy-runtime`]: https://crates.io/crates/aws-smithy-runtime\n\nuse crate::box_error::BoxError;\nuse crate::client::connector_metadata::ConnectorMetadata;\nuse crate::client::orchestrator::{HttpRequest, HttpResponse};\nuse crate::client::result::ConnectorError;\nuse crate::client::runtime_components::sealed::ValidateConfig;\nuse crate::client::runtime_components::{RuntimeComponents, RuntimeComponentsBuilder};\nuse crate::impl_shared_conversions;\nuse aws_smithy_types::config_bag::ConfigBag;\nuse std::fmt;\nuse std::sync::Arc;\nuse std::time::Duration;\n\nnew_type_future! {\n    #[doc = \"Future for [`HttpConnector::call`].\"]\n    pub struct HttpConnectorFuture<'static, HttpResponse, ConnectorError>;\n}\n\n/// Trait with a `call` function that asynchronously converts a request into a response.\n///\n/// Ordinarily, a connector would use an underlying HTTP library such as [hyper](https://crates.io/crates/hyper),\n/// and any associated HTTPS implementation alongside it to service requests.\n///\n/// However, it can also be useful to create fake/mock connectors implementing this trait\n/// for testing.\npub trait HttpConnector: Send + Sync + fmt::Debug {\n    /// Asynchronously converts a request into a response.\n    fn call(&self, request: HttpRequest) -> HttpConnectorFuture;\n}\n\n/// A shared [`HttpConnector`] implementation.\n#[derive(Clone, Debug)]\npub struct SharedHttpConnector(Arc<dyn HttpConnector>);\n\nimpl SharedHttpConnector {\n    /// Returns a new [`SharedHttpConnector`].\n    pub fn new(connection: impl HttpConnector + 'static) -> Self {\n        Self(Arc::new(connection))\n    }\n}\n\nimpl HttpConnector for SharedHttpConnector {\n    fn call(&self, request: HttpRequest) -> HttpConnectorFuture {\n        (*self.0).call(request)\n    }\n}\n\nimpl_shared_conversions!(convert SharedHttpConnector from HttpConnector using SharedHttpConnector::new);\n\n/// Returns a [`SharedHttpClient`] that calls the given `connector` function to select a HTTP connector.\npub fn http_client_fn<F>(connector: F) -> SharedHttpClient\nwhere\n    F: Fn(&HttpConnectorSettings, &RuntimeComponents) -> SharedHttpConnector\n        + Send\n        + Sync\n        + 'static,\n{\n    struct ConnectorFn<T>(T);\n    impl<T> fmt::Debug for ConnectorFn<T> {\n        fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n            f.write_str(\"ConnectorFn\")\n        }\n    }\n    impl<T> HttpClient for ConnectorFn<T>\n    where\n        T: (Fn(&HttpConnectorSettings, &RuntimeComponents) -> SharedHttpConnector) + Send + Sync,\n    {\n        fn http_connector(\n            &self,\n            settings: &HttpConnectorSettings,\n            components: &RuntimeComponents,\n        ) -> SharedHttpConnector {\n            (self.0)(settings, components)\n        }\n    }\n\n    SharedHttpClient::new(ConnectorFn(connector))\n}\n\n/// HTTP client abstraction.\n///\n/// A HTTP client implementation must apply connect/read timeout settings,\n/// and must maintain a connection pool.\npub trait HttpClient: Send + Sync + fmt::Debug {\n    /// Returns a HTTP connector based on the requested connector settings.\n    ///\n    /// The settings include connector timeouts, which should be incorporated\n    /// into the connector. The `HttpClient` is responsible for caching\n    /// the connector across requests.\n    ///\n    /// In the future, the settings may have additional parameters added,\n    /// such as HTTP version, or TLS certificate paths.\n    fn http_connector(\n        &self,\n        settings: &HttpConnectorSettings,\n        components: &RuntimeComponents,\n    ) -> SharedHttpConnector;\n\n    #[doc = include_str!(\"../../rustdoc/validate_base_client_config.md\")]\n    fn validate_base_client_config(\n        &self,\n        runtime_components: &RuntimeComponentsBuilder,\n        cfg: &ConfigBag,\n    ) -> Result<(), BoxError> {\n        let _ = (runtime_components, cfg);\n        Ok(())\n    }\n\n    #[doc = include_str!(\"../../rustdoc/validate_final_config.md\")]\n    fn validate_final_config(\n        &self,\n        runtime_components: &RuntimeComponents,\n        cfg: &ConfigBag,\n    ) -> Result<(), BoxError> {\n        let _ = (runtime_components, cfg);\n        Ok(())\n    }\n\n    /// Provide metadata about the crate that this HttpClient uses to make connectors.\n    ///\n    /// If this is implemented and returns metadata, interceptors may inspect it\n    /// for the purpose of inserting that data into the user agent string when\n    /// making a request with this client.\n    fn connector_metadata(&self) -> Option<ConnectorMetadata> {\n        None\n    }\n}\n\n/// Shared HTTP client for use across multiple clients and requests.\n#[derive(Clone, Debug)]\npub struct SharedHttpClient {\n    selector: Arc<dyn HttpClient>,\n}\n\nimpl SharedHttpClient {\n    /// Creates a new `SharedHttpClient`\n    pub fn new(selector: impl HttpClient + 'static) -> Self {\n        Self {\n            selector: Arc::new(selector),\n        }\n    }\n}\n\nimpl HttpClient for SharedHttpClient {\n    fn http_connector(\n        &self,\n        settings: &HttpConnectorSettings,\n        components: &RuntimeComponents,\n    ) -> SharedHttpConnector {\n        self.selector.http_connector(settings, components)\n    }\n\n    fn connector_metadata(&self) -> Option<ConnectorMetadata> {\n        self.selector.connector_metadata()\n    }\n}\n\nimpl ValidateConfig for SharedHttpClient {\n    fn validate_base_client_config(\n        &self,\n        runtime_components: &RuntimeComponentsBuilder,\n        cfg: &ConfigBag,\n    ) -> Result<(), BoxError> {\n        self.selector\n            .validate_base_client_config(runtime_components, cfg)\n    }\n\n    fn validate_final_config(\n        &self,\n        runtime_components: &RuntimeComponents,\n        cfg: &ConfigBag,\n    ) -> Result<(), BoxError> {\n        self.selector.validate_final_config(runtime_components, cfg)\n    }\n}\n\nimpl_shared_conversions!(convert SharedHttpClient from HttpClient using SharedHttpClient::new);\n\n/// Builder for [`HttpConnectorSettings`].\n#[non_exhaustive]\n#[derive(Default, Debug)]\npub struct HttpConnectorSettingsBuilder {\n    connect_timeout: Option<Duration>,\n    read_timeout: Option<Duration>,\n}\n\nimpl HttpConnectorSettingsBuilder {\n    /// Creates a new builder.\n    pub fn new() -> Self {\n        Default::default()\n    }\n\n    /// Sets the connect timeout that should be used.\n    ///\n    /// The connect timeout is a limit on the amount of time it takes to initiate a socket connection.\n    pub fn connect_timeout(mut self, connect_timeout: Duration) -> Self {\n        self.connect_timeout = Some(connect_timeout);\n        self\n    }\n\n    /// Sets the connect timeout that should be used.\n    ///\n    /// The connect timeout is a limit on the amount of time it takes to initiate a socket connection.\n    pub fn set_connect_timeout(&mut self, connect_timeout: Option<Duration>) -> &mut Self {\n        self.connect_timeout = connect_timeout;\n        self\n    }\n\n    /// Sets the read timeout that should be used.\n    ///\n    /// The read timeout is the limit on the amount of time it takes to read the first byte of a response\n    /// from the time the request is initiated.\n    pub fn read_timeout(mut self, read_timeout: Duration) -> Self {\n        self.read_timeout = Some(read_timeout);\n        self\n    }\n\n    /// Sets the read timeout that should be used.\n    ///\n    /// The read timeout is the limit on the amount of time it takes to read the first byte of a response\n    /// from the time the request is initiated.\n    pub fn set_read_timeout(&mut self, read_timeout: Option<Duration>) -> &mut Self {\n        self.read_timeout = read_timeout;\n        self\n    }\n\n    /// Builds the [`HttpConnectorSettings`].\n    pub fn build(self) -> HttpConnectorSettings {\n        HttpConnectorSettings {\n            connect_timeout: self.connect_timeout,\n            read_timeout: self.read_timeout,\n        }\n    }\n}\n\n/// Settings for HTTP Connectors\n#[non_exhaustive]\n#[derive(Clone, Default, Debug)]\npub struct HttpConnectorSettings {\n    connect_timeout: Option<Duration>,\n    read_timeout: Option<Duration>,\n}\n\nimpl HttpConnectorSettings {\n    /// Returns a builder for `HttpConnectorSettings`.\n    pub fn builder() -> HttpConnectorSettingsBuilder {\n        Default::default()\n    }\n\n    /// Returns the connect timeout that should be used.\n    ///\n    /// The connect timeout is a limit on the amount of time it takes to initiate a socket connection.\n    pub fn connect_timeout(&self) -> Option<Duration> {\n        self.connect_timeout\n    }\n\n    /// Returns the read timeout that should be used.\n    ///\n    /// The read timeout is the limit on the amount of time it takes to read the first byte of a response\n    /// from the time the request is initiated.\n    pub fn read_timeout(&self) -> Option<Duration> {\n        self.read_timeout\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime-api/src/client/identity/http.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Identity types for HTTP auth\n\nuse crate::client::identity::{Identity, IdentityFuture, ResolveIdentity};\nuse crate::client::runtime_components::RuntimeComponents;\nuse aws_smithy_types::config_bag::ConfigBag;\nuse std::fmt::Debug;\nuse std::sync::Arc;\nuse std::time::SystemTime;\nuse zeroize::Zeroizing;\n\n/// Identity type required to sign requests using Smithy's token-based HTTP auth schemes\n///\n/// This `Token` type is used with Smithy's `@httpApiKeyAuth` and `@httpBearerAuth`\n/// auth traits.\n#[derive(Clone, Eq, PartialEq)]\npub struct Token(Arc<TokenInner>);\n\n#[derive(Eq, PartialEq)]\nstruct TokenInner {\n    token: Zeroizing<String>,\n    expiration: Option<SystemTime>,\n}\n\nimpl Debug for Token {\n    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n        f.debug_struct(\"Token\")\n            .field(\"token\", &\"** redacted **\")\n            .finish()\n    }\n}\n\nimpl Token {\n    /// Constructs a new identity token for HTTP auth.\n    pub fn new(token: impl Into<String>, expiration: Option<SystemTime>) -> Self {\n        Self(Arc::new(TokenInner {\n            token: Zeroizing::new(token.into()),\n            expiration,\n        }))\n    }\n\n    /// Returns the underlying identity token.\n    pub fn token(&self) -> &str {\n        &self.0.token\n    }\n\n    /// Returns the expiration time (if any) for this token.\n    pub fn expiration(&self) -> Option<SystemTime> {\n        self.0.expiration\n    }\n\n    /// Creates a `Token` for tests.\n    #[cfg(feature = \"test-util\")]\n    pub fn for_tests() -> Self {\n        Self::new(\"test-token\", None)\n    }\n}\n\nimpl From<&str> for Token {\n    fn from(token: &str) -> Self {\n        Self::from(token.to_owned())\n    }\n}\n\nimpl From<String> for Token {\n    fn from(api_key: String) -> Self {\n        Self(Arc::new(TokenInner {\n            token: Zeroizing::new(api_key),\n            expiration: None,\n        }))\n    }\n}\n\nimpl ResolveIdentity for Token {\n    fn resolve_identity<'a>(\n        &'a self,\n        _runtime_components: &'a RuntimeComponents,\n        _config_bag: &'a ConfigBag,\n    ) -> IdentityFuture<'a> {\n        IdentityFuture::ready(Ok(self.into()))\n    }\n}\n\nimpl From<&Token> for Identity {\n    fn from(value: &Token) -> Self {\n        Identity::new(value.clone(), value.0.expiration)\n    }\n}\nimpl From<Token> for Identity {\n    fn from(value: Token) -> Self {\n        let expiration = value.0.expiration;\n        Identity::new(value, expiration)\n    }\n}\n\n/// Identity type required to sign requests using Smithy's login-based HTTP auth schemes\n///\n/// This `Login` type is used with Smithy's `@httpBasicAuth` and `@httpDigestAuth`\n/// auth traits.\n#[derive(Clone, Eq, PartialEq)]\npub struct Login(Arc<LoginInner>);\n\n#[derive(Eq, PartialEq)]\nstruct LoginInner {\n    user: String,\n    password: Zeroizing<String>,\n    expiration: Option<SystemTime>,\n}\n\nimpl Debug for Login {\n    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n        f.debug_struct(\"Login\")\n            .field(\"user\", &self.0.user)\n            .field(\"password\", &\"** redacted **\")\n            .finish()\n    }\n}\n\nimpl Login {\n    /// Constructs a new identity login for HTTP auth.\n    pub fn new(\n        user: impl Into<String>,\n        password: impl Into<String>,\n        expiration: Option<SystemTime>,\n    ) -> Self {\n        Self(Arc::new(LoginInner {\n            user: user.into(),\n            password: Zeroizing::new(password.into()),\n            expiration,\n        }))\n    }\n\n    /// Returns the login user.\n    pub fn user(&self) -> &str {\n        &self.0.user\n    }\n\n    /// Returns the login password.\n    pub fn password(&self) -> &str {\n        &self.0.password\n    }\n\n    /// Returns the expiration time of this login (if any)\n    pub fn expiration(&self) -> Option<SystemTime> {\n        self.0.expiration\n    }\n}\n\nimpl ResolveIdentity for Login {\n    fn resolve_identity<'a>(\n        &'a self,\n        _runtime_components: &'a RuntimeComponents,\n        _config_bag: &'a ConfigBag,\n    ) -> IdentityFuture<'a> {\n        IdentityFuture::ready(Ok(Identity::new(self.clone(), self.0.expiration)))\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime-api/src/client/identity.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::box_error::BoxError;\nuse crate::client::runtime_components::sealed::ValidateConfig;\nuse crate::client::runtime_components::{RuntimeComponents, RuntimeComponentsBuilder};\nuse crate::impl_shared_conversions;\nuse aws_smithy_types::config_bag::ConfigBag;\nuse aws_smithy_types::type_erasure::TypeErasedBox;\nuse std::any::{Any, TypeId};\nuse std::collections::HashMap;\nuse std::fmt;\nuse std::fmt::Debug;\nuse std::sync::atomic::{AtomicUsize, Ordering};\nuse std::sync::Arc;\nuse std::time::SystemTime;\n\n#[cfg(feature = \"http-auth\")]\npub mod http;\n\nnew_type_future! {\n    #[doc = \"Future for [`IdentityResolver::resolve_identity`].\"]\n    pub struct IdentityFuture<'a, Identity, BoxError>;\n}\n\nstatic NEXT_CACHE_PARTITION: AtomicUsize = AtomicUsize::new(0);\n\n/// Cache partition key for identity caching.\n///\n/// Identities need cache partitioning because a single identity cache is used across\n/// multiple identity providers across multiple auth schemes. In addition, a single auth scheme\n/// may have many different identity providers due to operation-level config overrides.\n///\n/// This partition _must_ be respected when retrieving from the identity cache and _should_\n/// be part of the cache key.\n///\n/// Calling [`IdentityCachePartition::new`] will create a new globally unique cache partition key,\n/// and the [`SharedIdentityResolver`] will automatically create and store a partion on construction.\n/// Thus, every configured identity resolver will be assigned a unique partition.\n#[derive(Copy, Clone, Debug, Eq, PartialEq, Hash, Ord, PartialOrd)]\npub struct IdentityCachePartition(usize);\n\nimpl IdentityCachePartition {\n    /// Create a new globally unique cache partition key.\n    pub fn new() -> Self {\n        Self(NEXT_CACHE_PARTITION.fetch_add(1, Ordering::Relaxed))\n    }\n\n    /// Helper for unit tests to create an identity cache partition with a known value.\n    #[cfg(feature = \"test-util\")]\n    pub fn new_for_tests(value: usize) -> IdentityCachePartition {\n        Self(value)\n    }\n}\n\n/// Caching resolver for identities.\npub trait ResolveCachedIdentity: fmt::Debug + Send + Sync {\n    /// Returns a cached identity, or resolves an identity and caches it if its not already cached.\n    fn resolve_cached_identity<'a>(\n        &'a self,\n        resolver: SharedIdentityResolver,\n        runtime_components: &'a RuntimeComponents,\n        config_bag: &'a ConfigBag,\n    ) -> IdentityFuture<'a>;\n\n    #[doc = include_str!(\"../../rustdoc/validate_base_client_config.md\")]\n    fn validate_base_client_config(\n        &self,\n        runtime_components: &RuntimeComponentsBuilder,\n        cfg: &ConfigBag,\n    ) -> Result<(), BoxError> {\n        let _ = (runtime_components, cfg);\n        Ok(())\n    }\n\n    #[doc = include_str!(\"../../rustdoc/validate_final_config.md\")]\n    fn validate_final_config(\n        &self,\n        runtime_components: &RuntimeComponents,\n        cfg: &ConfigBag,\n    ) -> Result<(), BoxError> {\n        let _ = (runtime_components, cfg);\n        Ok(())\n    }\n}\n\n/// Shared identity cache.\n#[derive(Clone, Debug)]\npub struct SharedIdentityCache(Arc<dyn ResolveCachedIdentity>);\n\nimpl SharedIdentityCache {\n    /// Creates a new [`SharedIdentityCache`] from the given cache implementation.\n    pub fn new(cache: impl ResolveCachedIdentity + 'static) -> Self {\n        Self(Arc::new(cache))\n    }\n}\n\nimpl ResolveCachedIdentity for SharedIdentityCache {\n    fn resolve_cached_identity<'a>(\n        &'a self,\n        resolver: SharedIdentityResolver,\n        runtime_components: &'a RuntimeComponents,\n        config_bag: &'a ConfigBag,\n    ) -> IdentityFuture<'a> {\n        self.0\n            .resolve_cached_identity(resolver, runtime_components, config_bag)\n    }\n}\n\nimpl ValidateConfig for SharedIdentityResolver {}\n\nimpl ValidateConfig for SharedIdentityCache {\n    fn validate_base_client_config(\n        &self,\n        runtime_components: &RuntimeComponentsBuilder,\n        cfg: &ConfigBag,\n    ) -> Result<(), BoxError> {\n        self.0.validate_base_client_config(runtime_components, cfg)\n    }\n\n    fn validate_final_config(\n        &self,\n        runtime_components: &RuntimeComponents,\n        cfg: &ConfigBag,\n    ) -> Result<(), BoxError> {\n        self.0.validate_final_config(runtime_components, cfg)\n    }\n}\n\nimpl_shared_conversions!(convert SharedIdentityCache from ResolveCachedIdentity using SharedIdentityCache::new);\n\n/// Resolver for identities.\n///\n/// Every [`AuthScheme`](crate::client::auth::AuthScheme) has one or more compatible\n/// identity resolvers, which are selected from runtime components by the auth scheme\n/// implementation itself.\n///\n/// The identity resolver must return an [`IdentityFuture`] with the resolved identity, or an error\n/// if resolution failed. There is no optionality for identity resolvers. The identity either\n/// resolves successfully, or it fails. The orchestrator will choose exactly one auth scheme\n/// to use, and thus, its chosen identity resolver is the only identity resolver that runs.\n/// There is no fallback to other auth schemes in the absence of an identity.\npub trait ResolveIdentity: Send + Sync + Debug {\n    /// Asynchronously resolves an identity for a request using the given config.\n    fn resolve_identity<'a>(\n        &'a self,\n        runtime_components: &'a RuntimeComponents,\n        config_bag: &'a ConfigBag,\n    ) -> IdentityFuture<'a>;\n\n    /// Returns a fallback identity.\n    ///\n    /// This method should be used as a fallback plan, i.e., when a call to `resolve_identity`\n    /// is interrupted by a timeout and its future fails to complete.\n    ///\n    /// The fallback identity should be set aside and ready to be returned\n    /// immediately. Therefore, a new identity should NOT be fetched\n    /// within this method, which might cause a long-running operation.\n    fn fallback_on_interrupt(&self) -> Option<Identity> {\n        None\n    }\n\n    /// Returns the location of an identity cache associated with this identity resolver.\n    ///\n    /// By default, identity resolvers will use the identity cache stored in runtime components.\n    /// Implementing types can change the cache location if they want to. Refer to [`IdentityCacheLocation`]\n    /// explaining why a concrete identity resolver might want to change the cache location.\n    fn cache_location(&self) -> IdentityCacheLocation {\n        IdentityCacheLocation::RuntimeComponents\n    }\n\n    /// Returns the identity cache partition associated with this identity resolver.\n    ///\n    /// By default this returns `None` and cache partitioning is left up to `SharedIdentityResolver`.\n    fn cache_partition(&self) -> Option<IdentityCachePartition> {\n        None\n    }\n}\n\n/// Cache location for identity caching.\n///\n/// Identities are usually cached in the identity cache owned by [`RuntimeComponents`]. However,\n/// we do have identities whose caching mechanism is internally managed by their identity resolver,\n/// in which case we want to avoid the `RuntimeComponents`-owned identity cache interfering with\n/// the internal caching policy.\n#[non_exhaustive]\n#[derive(Copy, Clone, Debug, Eq, PartialEq)]\npub enum IdentityCacheLocation {\n    /// Indicates the identity cache is owned by [`RuntimeComponents`].\n    RuntimeComponents,\n    /// Indicates the identity cache is internally managed by the identity resolver.\n    IdentityResolver,\n}\n\n/// Container for a shared identity resolver.\n#[derive(Clone, Debug)]\npub struct SharedIdentityResolver {\n    inner: Arc<dyn ResolveIdentity>,\n    cache_partition: IdentityCachePartition,\n}\n\nimpl SharedIdentityResolver {\n    /// Creates a new [`SharedIdentityResolver`] from the given resolver.\n    pub fn new(resolver: impl ResolveIdentity + 'static) -> Self {\n        // NOTE: `IdentityCachePartition` is globally unique by construction so even\n        // custom implementations of `ResolveIdentity::cache_partition()` are unique.\n        let partition = match resolver.cache_partition() {\n            Some(p) => p,\n            None => IdentityCachePartition::new(),\n        };\n\n        Self {\n            inner: Arc::new(resolver),\n            cache_partition: partition,\n        }\n    }\n\n    /// Returns the globally unique cache partition key for this identity resolver.\n    ///\n    /// See the [`IdentityCachePartition`] docs for more information on what this is used for\n    /// and why.\n    pub fn cache_partition(&self) -> IdentityCachePartition {\n        self.cache_partition\n    }\n}\n\nimpl ResolveIdentity for SharedIdentityResolver {\n    fn resolve_identity<'a>(\n        &'a self,\n        runtime_components: &'a RuntimeComponents,\n        config_bag: &'a ConfigBag,\n    ) -> IdentityFuture<'a> {\n        self.inner.resolve_identity(runtime_components, config_bag)\n    }\n\n    fn cache_location(&self) -> IdentityCacheLocation {\n        self.inner.cache_location()\n    }\n\n    fn cache_partition(&self) -> Option<IdentityCachePartition> {\n        Some(self.cache_partition())\n    }\n}\n\nimpl_shared_conversions!(convert SharedIdentityResolver from ResolveIdentity using SharedIdentityResolver::new);\n\ntype DataDebug = Arc<dyn (Fn(&Arc<dyn Any + Send + Sync>) -> &dyn Debug) + Send + Sync>;\n\n/// An identity that can be used for authentication.\n///\n/// The [`Identity`] is a container for any arbitrary identity data that may be used\n/// by a [`Sign`](crate::client::auth::Sign) implementation. Under the hood, it\n/// has an `Arc<dyn Any>`, and it is the responsibility of the signer to downcast\n/// to the appropriate data type using the `data()` function.\n///\n/// The `Identity` also holds an optional expiration time, which may duplicate\n/// an expiration time on the identity data. This is because an `Arc<dyn Any>`\n/// can't be downcast to any arbitrary trait, and expiring identities are\n/// common enough to be built-in.\n#[derive(Clone)]\npub struct Identity {\n    data: Arc<dyn Any + Send + Sync>,\n    data_debug: DataDebug,\n    expiration: Option<SystemTime>,\n    properties: HashMap<TypeId, Arc<TypeErasedBox>>,\n}\n\nimpl Identity {\n    /// Creates a new identity with the given data and expiration time.\n    pub fn new<T>(data: T, expiration: Option<SystemTime>) -> Self\n    where\n        T: Any + Debug + Send + Sync,\n    {\n        Self {\n            data: Arc::new(data),\n            data_debug: Arc::new(|d| d.downcast_ref::<T>().expect(\"type-checked\") as _),\n            expiration,\n            properties: HashMap::default(),\n        }\n    }\n\n    /// Returns [`Builder`] for [`Identity`].\n    pub fn builder() -> Builder {\n        Builder::default()\n    }\n\n    /// Returns the raw identity data.\n    pub fn data<T: Any + Debug + Send + Sync + 'static>(&self) -> Option<&T> {\n        self.data.downcast_ref()\n    }\n\n    /// Returns the expiration time for this identity, if any.\n    pub fn expiration(&self) -> Option<SystemTime> {\n        self.expiration\n    }\n\n    /// Returns arbitrary property associated with this `Identity`.\n    pub fn property<T: Any + Debug + Send + Sync + 'static>(&self) -> Option<&T> {\n        self.properties\n            .get(&TypeId::of::<T>())\n            .and_then(|b| b.downcast_ref())\n    }\n}\n\nimpl Debug for Identity {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        let mut debug_struct = f.debug_struct(\"Identity\");\n        debug_struct\n            .field(\"data\", (self.data_debug)(&self.data))\n            .field(\"expiration\", &self.expiration);\n        for (i, prop) in self.properties.values().enumerate() {\n            debug_struct.field(&format!(\"property_{i}\"), prop);\n        }\n        debug_struct.finish()\n    }\n}\n\nimpl ResolveIdentity for Identity {\n    fn resolve_identity<'a>(\n        &'a self,\n        _runtime_components: &'a RuntimeComponents,\n        _config_bag: &'a ConfigBag,\n    ) -> IdentityFuture<'a> {\n        IdentityFuture::ready(Ok(self.clone()))\n    }\n}\n\n#[derive(Debug)]\nenum ErrorKind {\n    /// Field required to build the target type is missing.\n    MissingRequiredField(&'static str),\n}\n\n/// Error constructing [`Identity`].\n#[derive(Debug)]\npub struct BuildError {\n    kind: ErrorKind,\n}\n\nimpl BuildError {\n    fn missing_required_field(field_name: &'static str) -> Self {\n        BuildError {\n            kind: ErrorKind::MissingRequiredField(field_name),\n        }\n    }\n}\n\nimpl fmt::Display for BuildError {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> std::fmt::Result {\n        use ErrorKind::*;\n        match self.kind {\n            MissingRequiredField(field_name) => write!(f, \"missing required field: `{field_name}`\"),\n        }\n    }\n}\n\nimpl std::error::Error for BuildError {}\n\n/// Builder for [`Identity`]\n#[derive(Default)]\npub struct Builder {\n    data: Option<Arc<dyn Any + Send + Sync>>,\n    data_debug: Option<DataDebug>,\n    expiration: Option<SystemTime>,\n    properties: HashMap<TypeId, Arc<TypeErasedBox>>,\n}\n\nimpl Builder {\n    /// Set raw identity data for the builder.\n    pub fn data<T: Any + Debug + Send + Sync + 'static>(mut self, data: T) -> Self {\n        self.set_data(data);\n        self\n    }\n\n    /// Set raw identity data for the builder.\n    pub fn set_data<T: Any + Debug + Send + Sync + 'static>(&mut self, data: T) {\n        self.data = Some(Arc::new(data));\n        self.data_debug = Some(Arc::new(|d| {\n            d.downcast_ref::<T>().expect(\"type-checked\") as _\n        }));\n    }\n\n    /// Set expiration for the builder.\n    pub fn expiration(mut self, expiration: SystemTime) -> Self {\n        self.set_expiration(Some(expiration));\n        self\n    }\n\n    /// Set expiration for the builder.\n    pub fn set_expiration(&mut self, expiration: Option<SystemTime>) {\n        self.expiration = expiration;\n    }\n\n    /// Set arbitrary property for the builder.\n    pub fn property<T: Any + Debug + Send + Sync + 'static>(mut self, prop: T) -> Self {\n        self.set_property(prop);\n        self\n    }\n\n    /// Set arbitrary property for the builder.\n    pub fn set_property<T: Any + Debug + Send + Sync + 'static>(&mut self, prop: T) {\n        self.properties\n            .insert(TypeId::of::<T>(), Arc::new(TypeErasedBox::new(prop)));\n    }\n\n    /// Build [`Identity`].\n    pub fn build(self) -> Result<Identity, BuildError> {\n        Ok(Identity {\n            data: self\n                .data\n                .ok_or_else(|| BuildError::missing_required_field(\"data\"))?,\n            data_debug: self\n                .data_debug\n                .expect(\"should always be set when `data` is set\"),\n            expiration: self.expiration,\n            properties: self.properties,\n        })\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use aws_smithy_async::time::{SystemTimeSource, TimeSource};\n\n    #[test]\n    fn check_send_sync() {\n        fn is_send_sync<T: Send + Sync>(_: T) {}\n        is_send_sync(Identity::new(\"foo\", None));\n    }\n\n    #[test]\n    fn create_retrieve_identity() {\n        #[derive(Debug)]\n        struct MyIdentityData {\n            first: String,\n            last: String,\n        }\n\n        let ts = SystemTimeSource::new();\n        let expiration = ts.now();\n        let identity = Identity::new(\n            MyIdentityData {\n                first: \"foo\".into(),\n                last: \"bar\".into(),\n            },\n            Some(expiration),\n        );\n\n        assert_eq!(\"foo\", identity.data::<MyIdentityData>().unwrap().first);\n        assert_eq!(\"bar\", identity.data::<MyIdentityData>().unwrap().last);\n        assert_eq!(Some(expiration), identity.expiration());\n    }\n\n    #[test]\n    fn insert_get_identity_properties() {\n        #[derive(Debug)]\n        struct MyIdentityData {\n            first: String,\n            last: String,\n        }\n        #[derive(Debug)]\n        struct PropertyAlpha;\n        #[derive(Debug)]\n        struct PropertyBeta;\n\n        let ts = SystemTimeSource::new();\n        let expiration = ts.now();\n        let identity = Identity::builder()\n            .data(MyIdentityData {\n                first: \"foo\".into(),\n                last: \"bar\".into(),\n            })\n            .expiration(expiration)\n            .property(PropertyAlpha)\n            .property(PropertyBeta)\n            .build()\n            .unwrap();\n\n        assert_eq!(\"foo\", identity.data::<MyIdentityData>().unwrap().first);\n        assert_eq!(\"bar\", identity.data::<MyIdentityData>().unwrap().last);\n        assert_eq!(Some(expiration), identity.expiration());\n        assert!(identity.property::<PropertyAlpha>().is_some());\n        assert!(identity.property::<PropertyBeta>().is_some());\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime-api/src/client/interceptors/context/phase.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n#[derive(Debug)]\n#[non_exhaustive]\npub(crate) enum Phase {\n    /// Represents the phase of an operation prior to serialization.\n    BeforeSerialization,\n    /// Represents the phase of an operation where the request is serialized.\n    Serialization,\n    /// Represents the phase of an operation prior to transmitting a request over the network.\n    BeforeTransmit,\n    /// Represents the phase of an operation where the request is transmitted over the network.\n    Transmit,\n    /// Represents the phase of an operation prior to parsing a response.\n    BeforeDeserialization,\n    /// Represents the phase of an operation where the response is parsed.\n    Deserialization,\n    /// Represents the phase of an operation after parsing a response.\n    AfterDeserialization,\n}\n\nimpl Phase {\n    pub(crate) fn is_before_serialization(&self) -> bool {\n        matches!(self, Self::BeforeSerialization)\n    }\n\n    pub(crate) fn is_serialization(&self) -> bool {\n        matches!(self, Self::Serialization)\n    }\n\n    pub(crate) fn is_before_transmit(&self) -> bool {\n        matches!(self, Self::BeforeTransmit)\n    }\n\n    pub(crate) fn is_transmit(&self) -> bool {\n        matches!(self, Self::Transmit)\n    }\n\n    pub(crate) fn is_before_deserialization(&self) -> bool {\n        matches!(self, Self::BeforeDeserialization)\n    }\n\n    pub(crate) fn is_deserialization(&self) -> bool {\n        matches!(self, Self::Deserialization)\n    }\n\n    pub(crate) fn is_after_deserialization(&self) -> bool {\n        matches!(self, Self::AfterDeserialization)\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime-api/src/client/interceptors/context/wrappers.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse super::{Error, Input, InterceptorContext, Output};\nuse crate::client::interceptors::context::{Request, Response};\nuse crate::client::orchestrator::OrchestratorError;\nuse std::fmt::Debug;\n\nmacro_rules! impl_from_interceptor_context {\n    (ref $wrapper:ident) => {\n        impl<'a, I, O, E> From<&'a InterceptorContext<I, O, E>> for $wrapper<'a, I, O, E> {\n            fn from(inner: &'a InterceptorContext<I, O, E>) -> Self {\n                Self { inner }\n            }\n        }\n    };\n    (mut $wrapper:ident) => {\n        impl<'a, I, O, E> From<&'a mut InterceptorContext<I, O, E>> for $wrapper<'a, I, O, E> {\n            fn from(inner: &'a mut InterceptorContext<I, O, E>) -> Self {\n                Self { inner }\n            }\n        }\n    };\n}\n\nmacro_rules! expect {\n    ($self:ident, $what:ident) => {\n        $self.inner.$what().expect(concat!(\n            \"`\",\n            stringify!($what),\n            \"` wasn't set in the underlying interceptor context. This is a bug.\"\n        ))\n    };\n}\n\n//\n// BeforeSerializationInterceptorContextRef\n//\n\n/// Interceptor context for the `read_before_execution` and `read_before_serialization` hooks.\n///\n/// Only the input is available at this point in the operation.\n#[derive(Debug)]\npub struct BeforeSerializationInterceptorContextRef<'a, I = Input, O = Output, E = Error> {\n    inner: &'a InterceptorContext<I, O, E>,\n}\n\nimpl_from_interceptor_context!(ref BeforeSerializationInterceptorContextRef);\n\nimpl<I, O, E> BeforeSerializationInterceptorContextRef<'_, I, O, E> {\n    /// Returns a reference to the input.\n    pub fn input(&self) -> &I {\n        expect!(self, input)\n    }\n\n    /// Downgrade this wrapper struct, returning the underlying InterceptorContext.\n    ///\n    /// There's no good reason to use this unless you're writing tests or you have to\n    /// interact with an API that doesn't support the context wrapper structs.\n    pub fn inner(&self) -> &'_ InterceptorContext<I, O, E> {\n        self.inner\n    }\n}\n\n//\n// BeforeSerializationInterceptorContextMut\n//\n\n/// Interceptor context for the `modify_before_serialization` hook.\n///\n/// Only the input is available at this point in the operation.\n#[derive(Debug)]\npub struct BeforeSerializationInterceptorContextMut<'a, I = Input, O = Output, E = Error> {\n    inner: &'a mut InterceptorContext<I, O, E>,\n}\n\nimpl_from_interceptor_context!(mut BeforeSerializationInterceptorContextMut);\n\nimpl<I, O, E> BeforeSerializationInterceptorContextMut<'_, I, O, E> {\n    /// Returns a reference to the input.\n    pub fn input(&self) -> &I {\n        expect!(self, input)\n    }\n\n    /// Returns a mutable reference to the input.\n    pub fn input_mut(&mut self) -> &mut I {\n        expect!(self, input_mut)\n    }\n\n    /// Downgrade this wrapper struct, returning the underlying InterceptorContext.\n    ///\n    /// There's no good reason to use this unless you're writing tests or you have to\n    /// interact with an API that doesn't support the context wrapper structs.\n    pub fn inner(&self) -> &'_ InterceptorContext<I, O, E> {\n        self.inner\n    }\n\n    /// Downgrade this wrapper struct, returning the underlying InterceptorContext.\n    ///\n    /// There's no good reason to use this unless you're writing tests or you have to\n    /// interact with an API that doesn't support the context wrapper structs.\n    pub fn inner_mut(&mut self) -> &'_ mut InterceptorContext<I, O, E> {\n        self.inner\n    }\n}\n\n//\n// BeforeSerializationInterceptorContextRef\n//\n\n/// Interceptor context for several hooks in between serialization and transmission.\n///\n/// Only the request is available at this point in the operation.\n#[derive(Debug)]\npub struct BeforeTransmitInterceptorContextRef<'a, I = Input, O = Output, E = Error> {\n    inner: &'a InterceptorContext<I, O, E>,\n}\n\nimpl_from_interceptor_context!(ref BeforeTransmitInterceptorContextRef);\n\nimpl<I, O, E> BeforeTransmitInterceptorContextRef<'_, I, O, E> {\n    /// Returns a reference to the transmittable request for the operation being invoked.\n    pub fn request(&self) -> &Request {\n        expect!(self, request)\n    }\n\n    /// Downgrade this wrapper struct, returning the underlying InterceptorContext.\n    ///\n    /// There's no good reason to use this unless you're writing tests or you have to\n    /// interact with an API that doesn't support the context wrapper structs.\n    pub fn inner(&self) -> &'_ InterceptorContext<I, O, E> {\n        self.inner\n    }\n}\n\n//\n// BeforeSerializationInterceptorContextMut\n//\n\n/// Interceptor context for several hooks in between serialization and transmission.\n///\n/// Only the request is available at this point in the operation.\n#[derive(Debug)]\npub struct BeforeTransmitInterceptorContextMut<'a, I = Input, O = Output, E = Error> {\n    inner: &'a mut InterceptorContext<I, O, E>,\n}\n\nimpl_from_interceptor_context!(mut BeforeTransmitInterceptorContextMut);\n\nimpl<I, O, E> BeforeTransmitInterceptorContextMut<'_, I, O, E> {\n    /// Returns a reference to the transmittable request for the operation being invoked.\n    pub fn request(&self) -> &Request {\n        expect!(self, request)\n    }\n\n    /// Returns a mutable reference to the transmittable request for the operation being invoked.\n    pub fn request_mut(&mut self) -> &mut Request {\n        expect!(self, request_mut)\n    }\n\n    /// Downgrade this wrapper struct, returning the underlying InterceptorContext.\n    ///\n    /// There's no good reason to use this unless you're writing tests or you have to\n    /// interact with an API that doesn't support the context wrapper structs.\n    pub fn inner(&self) -> &'_ InterceptorContext<I, O, E> {\n        self.inner\n    }\n\n    /// Downgrade this wrapper struct, returning the underlying InterceptorContext.\n    ///\n    /// There's no good reason to use this unless you're writing tests or you have to\n    /// interact with an API that doesn't support the context wrapper structs.\n    pub fn inner_mut(&mut self) -> &'_ mut InterceptorContext<I, O, E> {\n        self.inner\n    }\n}\n\n//\n// BeforeDeserializationInterceptorContextRef\n//\n\n/// Interceptor context for hooks before deserializing the response.\n///\n/// Only the response is available at this point in the operation.\n#[derive(Debug)]\npub struct BeforeDeserializationInterceptorContextRef<'a, I = Input, O = Output, E = Error> {\n    inner: &'a InterceptorContext<I, O, E>,\n}\n\nimpl_from_interceptor_context!(ref BeforeDeserializationInterceptorContextRef);\n\nimpl<I, O, E> BeforeDeserializationInterceptorContextRef<'_, I, O, E> {\n    /// Returns a reference to the response.\n    pub fn response(&self) -> &Response {\n        expect!(self, response)\n    }\n\n    /// Downgrade this wrapper struct, returning the underlying InterceptorContext.\n    ///\n    /// There's no good reason to use this unless you're writing tests or you have to\n    /// interact with an API that doesn't support the context wrapper structs.\n    pub fn inner(&self) -> &'_ InterceptorContext<I, O, E> {\n        self.inner\n    }\n}\n\n//\n// BeforeDeserializationInterceptorContextMut\n//\n\n/// Interceptor context for hooks before deserializing the response.\n///\n/// Only the response is available at this point in the operation.\npub struct BeforeDeserializationInterceptorContextMut<'a, I = Input, O = Output, E = Error> {\n    inner: &'a mut InterceptorContext<I, O, E>,\n}\n\nimpl_from_interceptor_context!(mut BeforeDeserializationInterceptorContextMut);\n\nimpl<I, O, E> BeforeDeserializationInterceptorContextMut<'_, I, O, E> {\n    /// Returns a reference to the response.\n    pub fn response(&self) -> &Response {\n        expect!(self, response)\n    }\n\n    /// Returns a mutable reference to the response.\n    pub fn response_mut(&mut self) -> &mut Response {\n        expect!(self, response_mut)\n    }\n\n    /// Downgrade this wrapper struct, returning the underlying InterceptorContext.\n    ///\n    /// There's no good reason to use this unless you're writing tests or you have to\n    /// interact with an API that doesn't support the context wrapper structs.\n    pub fn inner(&self) -> &'_ InterceptorContext<I, O, E> {\n        self.inner\n    }\n\n    /// Downgrade this wrapper struct, returning the underlying InterceptorContext.\n    ///\n    /// There's no good reason to use this unless you're writing tests or you have to\n    /// interact with an API that doesn't support the context wrapper structs.\n    pub fn inner_mut(&mut self) -> &'_ mut InterceptorContext<I, O, E> {\n        self.inner\n    }\n}\n\n//\n// AfterDeserializationInterceptorContextRef\n//\n\n/// Interceptor context for hooks after deserializing the response.\n///\n/// The response and the deserialized output or error are available at this point in the operation.\npub struct AfterDeserializationInterceptorContextRef<'a, I = Input, O = Output, E = Error> {\n    inner: &'a InterceptorContext<I, O, E>,\n}\n\nimpl_from_interceptor_context!(ref AfterDeserializationInterceptorContextRef);\n\nimpl<I, O, E> AfterDeserializationInterceptorContextRef<'_, I, O, E> {\n    /// Returns a reference to the response.\n    pub fn response(&self) -> &Response {\n        expect!(self, response)\n    }\n\n    /// Returns a reference to the deserialized output or error.\n    pub fn output_or_error(&self) -> Result<&O, &OrchestratorError<E>> {\n        expect!(self, output_or_error)\n    }\n\n    /// Downgrade this wrapper struct, returning the underlying InterceptorContext.\n    ///\n    /// There's no good reason to use this unless you're writing tests or you have to\n    /// interact with an API that doesn't support the context wrapper structs.\n    pub fn inner(&self) -> &'_ InterceptorContext<I, O, E> {\n        self.inner\n    }\n}\n\n//\n// FinalizerInterceptorContextRef\n//\n\n/// Interceptor context for finalization hooks.\n///\n/// This context is used by the `read_after_attempt` and `read_after_execution` hooks\n/// that are all called upon both success and failure, and may have varying levels\n/// of context available depending on where a failure occurred if the operation failed.\npub struct FinalizerInterceptorContextRef<'a, I = Input, O = Output, E = Error> {\n    inner: &'a InterceptorContext<I, O, E>,\n}\n\nimpl_from_interceptor_context!(ref FinalizerInterceptorContextRef);\n\nimpl<I, O, E> FinalizerInterceptorContextRef<'_, I, O, E> {\n    /// Returns the operation input.\n    pub fn input(&self) -> Option<&I> {\n        self.inner.input.as_ref()\n    }\n\n    /// Returns the serialized request.\n    pub fn request(&self) -> Option<&Request> {\n        self.inner.request.as_ref()\n    }\n\n    /// Returns the raw response.\n    pub fn response(&self) -> Option<&Response> {\n        self.inner.response.as_ref()\n    }\n\n    /// Returns the deserialized operation output or error.\n    pub fn output_or_error(&self) -> Option<Result<&O, &OrchestratorError<E>>> {\n        self.inner.output_or_error.as_ref().map(|o| o.as_ref())\n    }\n\n    /// Downgrade this wrapper struct, returning the underlying InterceptorContext.\n    ///\n    /// There's no good reason to use this unless you're writing tests or you have to\n    /// interact with an API that doesn't support the context wrapper structs.\n    pub fn inner(&self) -> &'_ InterceptorContext<I, O, E> {\n        self.inner\n    }\n}\n\n//\n// FinalizerInterceptorContextMut\n//\n\n/// Interceptor context for finalization hooks.\n///\n/// This context is used by the `modify_before_attempt_completion` and `modify_before_completion` hooks\n/// that are all called upon both success and failure, and may have varying levels\n/// of context available depending on where a failure occurred if the operation failed.\npub struct FinalizerInterceptorContextMut<'a, I = Input, O = Output, E = Error> {\n    inner: &'a mut InterceptorContext<I, O, E>,\n}\n\nimpl_from_interceptor_context!(mut FinalizerInterceptorContextMut);\n\nimpl<I, O, E> FinalizerInterceptorContextMut<'_, I, O, E> {\n    /// Returns the operation input.\n    pub fn input(&self) -> Option<&I> {\n        self.inner.input.as_ref()\n    }\n\n    /// Returns the serialized request.\n    pub fn request(&self) -> Option<&Request> {\n        self.inner.request.as_ref()\n    }\n\n    /// Returns the raw response.\n    pub fn response(&self) -> Option<&Response> {\n        self.inner.response.as_ref()\n    }\n\n    /// Returns the deserialized operation output or error.\n    pub fn output_or_error(&self) -> Option<Result<&O, &OrchestratorError<E>>> {\n        self.inner.output_or_error.as_ref().map(|o| o.as_ref())\n    }\n\n    /// Mutably returns the operation input.\n    pub fn input_mut(&mut self) -> Option<&mut I> {\n        self.inner.input.as_mut()\n    }\n\n    /// Mutably returns the serialized request.\n    pub fn request_mut(&mut self) -> Option<&mut Request> {\n        self.inner.request.as_mut()\n    }\n\n    /// Mutably returns the raw response.\n    pub fn response_mut(&mut self) -> Option<&mut Response> {\n        self.inner.response.as_mut()\n    }\n\n    /// Mutably returns the deserialized operation output or error.\n    pub fn output_or_error_mut(&mut self) -> Option<&mut Result<O, OrchestratorError<E>>> {\n        self.inner.output_or_error.as_mut()\n    }\n\n    /// Downgrade this wrapper struct, returning the underlying InterceptorContext.\n    ///\n    /// There's no good reason to use this unless you're writing tests or you have to\n    /// interact with an API that doesn't support the context wrapper structs.\n    pub fn inner(&self) -> &'_ InterceptorContext<I, O, E> {\n        self.inner\n    }\n\n    /// Downgrade this wrapper struct, returning the underlying InterceptorContext.\n    ///\n    /// There's no good reason to use this unless you're writing tests or you have to\n    /// interact with an API that doesn't support the context wrapper structs.\n    pub fn inner_mut(&mut self) -> &'_ mut InterceptorContext<I, O, E> {\n        self.inner\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime-api/src/client/interceptors/context.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Interceptor context.\n//!\n//! Interceptors have access to varying pieces of context during the course of an operation.\n//!\n//! An operation is composed of multiple phases. The initial phase is \"before serialization\", which\n//! has the original input as context. The next phase is \"before transmit\", which has the serialized\n//! request as context. Depending on which hook is being called with the dispatch context,\n//! the serialized request may or may not be signed (which should be apparent from the hook name).\n//! Following the \"before transmit\" phase is the \"before deserialization\" phase, which has\n//! the raw response available as context. Finally, the \"after deserialization\" phase\n//! has both the raw and parsed response available.\n//!\n//! To summarize:\n//! 1. Before serialization: Only has the operation input.\n//! 2. Before transmit: Only has the serialized request.\n//! 3. Before deserialization: Has the raw response.\n//! 3. After deserialization: Has the raw response and the parsed response.\n//!\n//! When implementing hooks, if information from a previous phase is required, then implement\n//! an earlier hook to examine that context, and save off any necessary information into the\n//! [`ConfigBag`] for later hooks to examine.  Interior mutability is **NOT**\n//! recommended for storing request-specific information in your interceptor implementation.\n//! Use the [`ConfigBag`] instead.\n\nuse crate::client::orchestrator::{HttpRequest, HttpResponse, OrchestratorError};\nuse crate::client::result::SdkError;\nuse aws_smithy_types::config_bag::ConfigBag;\nuse aws_smithy_types::type_erasure::{TypeErasedBox, TypeErasedError};\nuse phase::Phase;\nuse std::fmt;\nuse std::fmt::Debug;\nuse tracing::{debug, error, trace};\n\nmacro_rules! new_type_box {\n    ($name:ident, $doc:literal) => {\n        new_type_box!($name, TypeErasedBox, $doc, Send, Sync, fmt::Debug,);\n    };\n    ($name:ident, $underlying:ident, $doc:literal, $($additional_bound:path,)*) => {\n        #[doc = $doc]\n        #[derive(Debug)]\n        pub struct $name($underlying);\n\n        impl $name {\n            #[doc = concat!(\"Creates a new `\", stringify!($name), \"` with the provided concrete input value.\")]\n            pub fn erase<T: $($additional_bound +)* Send + Sync + fmt::Debug + 'static>(input: T) -> Self {\n                Self($underlying::new(input))\n            }\n\n            #[doc = concat!(\"Downcasts to the concrete input value.\")]\n            pub fn downcast_ref<T: $($additional_bound +)* Send + Sync + fmt::Debug + 'static>(&self) -> Option<&T> {\n                self.0.downcast_ref()\n            }\n\n            #[doc = concat!(\"Downcasts to the concrete input value.\")]\n            pub fn downcast_mut<T: $($additional_bound +)* Send + Sync + fmt::Debug + 'static>(&mut self) -> Option<&mut T> {\n                self.0.downcast_mut()\n            }\n\n            #[doc = concat!(\"Downcasts to the concrete input value.\")]\n            pub fn downcast<T: $($additional_bound +)* Send + Sync + fmt::Debug + 'static>(self) -> Result<T, Self> {\n                self.0.downcast::<T>().map(|v| *v).map_err(Self)\n            }\n\n            #[doc = concat!(\"Returns a `\", stringify!($name), \"` with a fake/test value with the expectation that it won't be downcast in the test.\")]\n            #[cfg(feature = \"test-util\")]\n            pub fn doesnt_matter() -> Self {\n                Self($underlying::doesnt_matter())\n            }\n        }\n    };\n}\n\nnew_type_box!(Input, \"Type-erased operation input.\");\nnew_type_box!(Output, \"Type-erased operation output.\");\nnew_type_box!(\n    Error,\n    TypeErasedError,\n    \"Type-erased operation error.\",\n    std::error::Error,\n);\n\nimpl fmt::Display for Error {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        fmt::Display::fmt(&self.0, f)\n    }\n}\nimpl std::error::Error for Error {\n    fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {\n        self.0.source()\n    }\n}\n\n/// Type-erased result for an operation.\npub type OutputOrError = Result<Output, OrchestratorError<Error>>;\n\ntype Request = HttpRequest;\ntype Response = HttpResponse;\n\npub use wrappers::{\n    AfterDeserializationInterceptorContextRef, BeforeDeserializationInterceptorContextMut,\n    BeforeDeserializationInterceptorContextRef, BeforeSerializationInterceptorContextMut,\n    BeforeSerializationInterceptorContextRef, BeforeTransmitInterceptorContextMut,\n    BeforeTransmitInterceptorContextRef, FinalizerInterceptorContextMut,\n    FinalizerInterceptorContextRef,\n};\n\nmod wrappers;\n\n/// Operation phases.\npub(crate) mod phase;\n\n/// A container for the data currently available to an interceptor.\n///\n/// Different context is available based on which phase the operation is currently in. For example,\n/// context in the \"before serialization\" phase won't have a `request` yet since the input hasn't been\n/// serialized at that point. But once it gets into the \"before transmit\" phase, the `request` will be set.\n#[derive(Debug)]\npub struct InterceptorContext<I = Input, O = Output, E = Error> {\n    pub(crate) input: Option<I>,\n    pub(crate) output_or_error: Option<Result<O, OrchestratorError<E>>>,\n    pub(crate) request: Option<Request>,\n    pub(crate) response: Option<Response>,\n    phase: Phase,\n    tainted: bool,\n    request_checkpoint: Option<HttpRequest>,\n}\n\nimpl InterceptorContext<Input, Output, Error> {\n    /// Creates a new interceptor context in the \"before serialization\" phase.\n    pub fn new(input: Input) -> InterceptorContext<Input, Output, Error> {\n        InterceptorContext {\n            input: Some(input),\n            output_or_error: None,\n            request: None,\n            response: None,\n            phase: Phase::BeforeSerialization,\n            tainted: false,\n            request_checkpoint: None,\n        }\n    }\n}\n\nimpl<I, O, E> InterceptorContext<I, O, E> {\n    /// Retrieve the input for the operation being invoked.\n    ///\n    /// Note: This method is intended for internal use only.\n    pub fn input(&self) -> Option<&I> {\n        self.input.as_ref()\n    }\n\n    /// Retrieve the input for the operation being invoked.\n    ///\n    /// Note: This method is intended for internal use only.\n    pub fn input_mut(&mut self) -> Option<&mut I> {\n        self.input.as_mut()\n    }\n\n    /// Takes ownership of the input.\n    ///\n    /// Note: This method is intended for internal use only.\n    pub fn take_input(&mut self) -> Option<I> {\n        self.input.take()\n    }\n\n    /// Set the request for the operation being invoked.\n    ///\n    /// Note: This method is intended for internal use only.\n    pub fn set_request(&mut self, request: Request) {\n        self.request = Some(request);\n    }\n\n    /// Retrieve the transmittable request for the operation being invoked.\n    /// This will only be available once request marshalling has completed.\n    ///\n    /// Note: This method is intended for internal use only.\n    pub fn request(&self) -> Option<&Request> {\n        self.request.as_ref()\n    }\n\n    /// Retrieve the transmittable request for the operation being invoked.\n    /// This will only be available once request marshalling has completed.\n    ///\n    /// Note: This method is intended for internal use only.\n    pub fn request_mut(&mut self) -> Option<&mut Request> {\n        self.request.as_mut()\n    }\n\n    /// Takes ownership of the request.\n    ///\n    /// Note: This method is intended for internal use only.\n    pub fn take_request(&mut self) -> Option<Request> {\n        self.request.take()\n    }\n\n    /// Set the response for the operation being invoked.\n    ///\n    /// Note: This method is intended for internal use only.\n    pub fn set_response(&mut self, response: Response) {\n        self.response = Some(response);\n    }\n\n    /// Returns the response.\n    ///\n    /// Note: This method is intended for internal use only.\n    pub fn response(&self) -> Option<&Response> {\n        self.response.as_ref()\n    }\n\n    /// Returns a mutable reference to the response.\n    ///\n    /// Note: This method is intended for internal use only.\n    pub fn response_mut(&mut self) -> Option<&mut Response> {\n        self.response.as_mut()\n    }\n\n    /// Set the output or error for the operation being invoked.\n    ///\n    /// Note: This method is intended for internal use only.\n    pub fn set_output_or_error(&mut self, output: Result<O, OrchestratorError<E>>) {\n        self.output_or_error = Some(output);\n    }\n\n    /// Returns the deserialized output or error.\n    ///\n    /// Note: This method is intended for internal use only.\n    pub fn output_or_error(&self) -> Option<Result<&O, &OrchestratorError<E>>> {\n        self.output_or_error.as_ref().map(Result::as_ref)\n    }\n\n    /// Returns the mutable reference to the deserialized output or error.\n    ///\n    /// Note: This method is intended for internal use only.\n    pub fn output_or_error_mut(&mut self) -> Option<&mut Result<O, OrchestratorError<E>>> {\n        self.output_or_error.as_mut()\n    }\n\n    /// Grants ownership of the deserialized output/error.\n    ///\n    /// Note: This method is intended for internal use only.\n    pub fn take_output_or_error(&mut self) -> Option<Result<O, OrchestratorError<E>>> {\n        self.output_or_error.take()\n    }\n\n    /// Return `true` if this context's `output_or_error` is an error. Otherwise, return `false`.\n    ///\n    /// Note: This method is intended for internal use only.\n    pub fn is_failed(&self) -> bool {\n        self.output_or_error\n            .as_ref()\n            .map(Result::is_err)\n            .unwrap_or_default()\n    }\n\n    /// Advance to the Serialization phase.\n    ///\n    /// Note: This method is intended for internal use only.\n    pub fn enter_serialization_phase(&mut self) {\n        debug!(\"entering \\'serialization\\' phase\");\n        debug_assert!(\n            self.phase.is_before_serialization(),\n            \"called enter_serialization_phase but phase is not before 'serialization'\"\n        );\n        self.phase = Phase::Serialization;\n    }\n\n    /// Advance to the BeforeTransmit phase.\n    ///\n    /// Note: This method is intended for internal use only.\n    pub fn enter_before_transmit_phase(&mut self) {\n        debug!(\"entering \\'before transmit\\' phase\");\n        debug_assert!(\n            self.phase.is_serialization(),\n            \"called enter_before_transmit_phase but phase is not 'serialization'\"\n        );\n        debug_assert!(\n            self.input.is_none(),\n            \"input must be taken before calling enter_before_transmit_phase\"\n        );\n        debug_assert!(\n            self.request.is_some(),\n            \"request must be set before calling enter_before_transmit_phase\"\n        );\n        self.request_checkpoint = self.request().expect(\"checked above\").try_clone();\n        self.phase = Phase::BeforeTransmit;\n    }\n\n    /// Advance to the Transmit phase.\n    ///\n    /// Note: This method is intended for internal use only.\n    pub fn enter_transmit_phase(&mut self) {\n        debug!(\"entering \\'transmit\\' phase\");\n        debug_assert!(\n            self.phase.is_before_transmit(),\n            \"called enter_transmit_phase but phase is not before transmit\"\n        );\n        self.phase = Phase::Transmit;\n    }\n\n    /// Advance to the BeforeDeserialization phase.\n    ///\n    /// Note: This method is intended for internal use only.\n    pub fn enter_before_deserialization_phase(&mut self) {\n        debug!(\"entering \\'before deserialization\\' phase\");\n        debug_assert!(\n            self.phase.is_transmit(),\n            \"called enter_before_deserialization_phase but phase is not 'transmit'\"\n        );\n        debug_assert!(\n            self.request.is_none(),\n            \"request must be taken before entering the 'before deserialization' phase\"\n        );\n        debug_assert!(\n            self.response.is_some(),\n            \"response must be set to before entering the 'before deserialization' phase\"\n        );\n        self.phase = Phase::BeforeDeserialization;\n    }\n\n    /// Advance to the Deserialization phase.\n    ///\n    /// Note: This method is intended for internal use only.\n    pub fn enter_deserialization_phase(&mut self) {\n        debug!(\"entering \\'deserialization\\' phase\");\n        debug_assert!(\n            self.phase.is_before_deserialization(),\n            \"called enter_deserialization_phase but phase is not 'before deserialization'\"\n        );\n        self.phase = Phase::Deserialization;\n    }\n\n    /// Advance to the AfterDeserialization phase.\n    ///\n    /// Note: This method is intended for internal use only.\n    pub fn enter_after_deserialization_phase(&mut self) {\n        debug!(\"entering \\'after deserialization\\' phase\");\n        debug_assert!(\n            self.phase.is_deserialization(),\n            \"called enter_after_deserialization_phase but phase is not 'deserialization'\"\n        );\n        debug_assert!(\n            self.output_or_error.is_some(),\n            \"output must be set to before entering the 'after deserialization' phase\"\n        );\n        self.phase = Phase::AfterDeserialization;\n    }\n\n    /// Set the request checkpoint. This should only be called once, right before entering the retry loop.\n    ///\n    /// Note: This method is intended for internal use only.\n    pub fn save_checkpoint(&mut self) {\n        trace!(\"saving request checkpoint...\");\n        self.request_checkpoint = self.request().and_then(|r| r.try_clone());\n        match self.request_checkpoint.as_ref() {\n            Some(_) => trace!(\"successfully saved request checkpoint\"),\n            None => trace!(\"failed to save request checkpoint: request body could not be cloned\"),\n        }\n    }\n\n    /// Returns false if rewinding isn't possible\n    ///\n    /// Note: This method is intended for internal use only.\n    pub fn rewind(&mut self, _cfg: &mut ConfigBag) -> RewindResult {\n        // If request_checkpoint was never set, but we've already made one attempt,\n        // then this is not a retryable request\n        let request_checkpoint = match (self.request_checkpoint.as_ref(), self.tainted) {\n            (None, true) => return RewindResult::Impossible,\n            (_, false) => {\n                self.tainted = true;\n                return RewindResult::Unnecessary;\n            }\n            (Some(req), _) => req.try_clone(),\n        };\n\n        // Otherwise, rewind to the saved request checkpoint\n        self.phase = Phase::BeforeTransmit;\n        self.request = request_checkpoint;\n        assert!(\n            self.request.is_some(),\n            \"if the request wasn't cloneable, then we should have already returned from this method.\"\n        );\n        self.response = None;\n        self.output_or_error = None;\n        RewindResult::Occurred\n    }\n}\n\nimpl<I, O, E> InterceptorContext<I, O, E>\nwhere\n    E: Debug,\n{\n    /// Decomposes the context into its constituent parts.\n    ///\n    /// Note: This method is intended for internal use only.\n    #[allow(clippy::type_complexity)]\n    pub fn into_parts(\n        self,\n    ) -> (\n        Option<I>,\n        Option<Result<O, OrchestratorError<E>>>,\n        Option<Request>,\n        Option<Response>,\n    ) {\n        (\n            self.input,\n            self.output_or_error,\n            self.request,\n            self.response,\n        )\n    }\n\n    /// Convert this context into the final operation result that is returned in client's the public API.\n    ///\n    /// Note: This method is intended for internal use only.\n    #[allow(clippy::result_large_err)]\n    pub fn finalize(mut self) -> Result<O, SdkError<E, HttpResponse>> {\n        let output_or_error = self\n            .output_or_error\n            .take()\n            .expect(\"output_or_error must always be set before finalize is called.\");\n        self.finalize_result(output_or_error)\n    }\n\n    /// Convert the given output/error into a final operation result that is returned in the client's public API.\n    ///\n    /// Note: This method is intended for internal use only.\n    #[allow(clippy::result_large_err)]\n    pub fn finalize_result(\n        &mut self,\n        result: Result<O, OrchestratorError<E>>,\n    ) -> Result<O, SdkError<E, HttpResponse>> {\n        let response = self.response.take();\n        result.map_err(|error| OrchestratorError::into_sdk_error(error, &self.phase, response))\n    }\n\n    /// Mark this context as failed due to errors during the operation. Any errors already contained\n    /// by the context will be replaced by the given error.\n    ///\n    /// Note: This method is intended for internal use only.\n    pub fn fail(&mut self, error: OrchestratorError<E>) {\n        if !self.is_failed() {\n            trace!(\n                \"orchestrator is transitioning to the 'failure' phase from the '{:?}' phase\",\n                self.phase\n            );\n        }\n        if let Some(Err(existing_err)) = self.output_or_error.replace(Err(error)) {\n            error!(\"orchestrator context received an error but one was already present; Throwing away previous error: {:?}\", existing_err);\n        }\n    }\n}\n\n/// The result of attempting to rewind a request.\n///\n/// Note: This is intended for internal use only.\n#[non_exhaustive]\n#[derive(Debug, PartialEq, Eq, Clone, Copy)]\npub enum RewindResult {\n    /// The request couldn't be rewound because it wasn't cloneable.\n    Impossible,\n    /// The request wasn't rewound because it was unnecessary.\n    Unnecessary,\n    /// The request was rewound successfully.\n    Occurred,\n}\n\nimpl fmt::Display for RewindResult {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        match self {\n            RewindResult::Impossible => write!(\n                f,\n                \"The request couldn't be rewound because it wasn't cloneable.\"\n            ),\n            RewindResult::Unnecessary => {\n                write!(f, \"The request wasn't rewound because it was unnecessary.\")\n            }\n            RewindResult::Occurred => write!(f, \"The request was rewound successfully.\"),\n        }\n    }\n}\n\n#[cfg(all(test, feature = \"test-util\", feature = \"http-02x\"))]\nmod tests {\n    use super::*;\n    use aws_smithy_types::body::SdkBody;\n    use http_02x::header::{AUTHORIZATION, CONTENT_LENGTH};\n    use http_02x::{HeaderValue, Uri};\n\n    #[test]\n    fn test_success_transitions() {\n        let input = Input::doesnt_matter();\n        let output = Output::erase(\"output\".to_string());\n\n        let mut context = InterceptorContext::new(input);\n        assert!(context.input().is_some());\n        context.input_mut();\n\n        context.enter_serialization_phase();\n        let _ = context.take_input();\n        context.set_request(HttpRequest::empty());\n\n        context.enter_before_transmit_phase();\n        context.request();\n        context.request_mut();\n\n        context.enter_transmit_phase();\n        let _ = context.take_request();\n        context.set_response(\n            http_02x::Response::builder()\n                .body(SdkBody::empty())\n                .unwrap()\n                .try_into()\n                .unwrap(),\n        );\n\n        context.enter_before_deserialization_phase();\n        context.response();\n        context.response_mut();\n\n        context.enter_deserialization_phase();\n        context.response();\n        context.response_mut();\n        context.set_output_or_error(Ok(output));\n\n        context.enter_after_deserialization_phase();\n        context.response();\n        context.response_mut();\n        let _ = context.output_or_error();\n        let _ = context.output_or_error_mut();\n\n        let output = context.output_or_error.unwrap().expect(\"success\");\n        assert_eq!(\"output\", output.downcast_ref::<String>().unwrap());\n    }\n\n    #[test]\n    fn test_rewind_for_retry() {\n        let mut cfg = ConfigBag::base();\n        let input = Input::doesnt_matter();\n        let output = Output::erase(\"output\".to_string());\n        let error = Error::doesnt_matter();\n\n        let mut context = InterceptorContext::new(input);\n        assert!(context.input().is_some());\n\n        context.enter_serialization_phase();\n        let _ = context.take_input();\n        context.set_request(\n            http_02x::Request::builder()\n                .header(\"test\", \"the-original-un-mutated-request\")\n                .body(SdkBody::empty())\n                .unwrap()\n                .try_into()\n                .unwrap(),\n        );\n        context.enter_before_transmit_phase();\n        context.save_checkpoint();\n        assert_eq!(context.rewind(&mut cfg), RewindResult::Unnecessary);\n        // Modify the test header post-checkpoint to simulate modifying the request for signing or a mutating interceptor\n        context.request_mut().unwrap().headers_mut().remove(\"test\");\n        context.request_mut().unwrap().headers_mut().insert(\n            \"test\",\n            HeaderValue::from_static(\"request-modified-after-signing\"),\n        );\n\n        context.enter_transmit_phase();\n        let request = context.take_request().unwrap();\n        assert_eq!(\n            \"request-modified-after-signing\",\n            request.headers().get(\"test\").unwrap()\n        );\n        context.set_response(\n            http_02x::Response::builder()\n                .body(SdkBody::empty())\n                .unwrap()\n                .try_into()\n                .unwrap(),\n        );\n\n        context.enter_before_deserialization_phase();\n        context.enter_deserialization_phase();\n        context.set_output_or_error(Err(OrchestratorError::operation(error)));\n\n        assert_eq!(context.rewind(&mut cfg), RewindResult::Occurred);\n\n        // Now after rewinding, the test header should be its original value\n        assert_eq!(\n            \"the-original-un-mutated-request\",\n            context.request().unwrap().headers().get(\"test\").unwrap()\n        );\n\n        context.enter_transmit_phase();\n        let _ = context.take_request();\n        context.set_response(\n            http_02x::Response::builder()\n                .body(SdkBody::empty())\n                .unwrap()\n                .try_into()\n                .unwrap(),\n        );\n\n        context.enter_before_deserialization_phase();\n        context.enter_deserialization_phase();\n        context.set_output_or_error(Ok(output));\n\n        context.enter_after_deserialization_phase();\n\n        let output = context.output_or_error.unwrap().expect(\"success\");\n        assert_eq!(\"output\", output.downcast_ref::<String>().unwrap());\n    }\n\n    #[test]\n    fn try_clone_clones_all_data() {\n        let request: HttpRequest = http_02x::Request::builder()\n            .uri(Uri::from_static(\"https://www.amazon.com\"))\n            .method(\"POST\")\n            .header(CONTENT_LENGTH, 456)\n            .header(AUTHORIZATION, \"Token: hello\")\n            .body(SdkBody::from(\"hello world!\"))\n            .expect(\"valid request\")\n            .try_into()\n            .unwrap();\n        let cloned = request.try_clone().expect(\"request is cloneable\");\n\n        assert_eq!(&Uri::from_static(\"https://www.amazon.com\"), cloned.uri());\n        assert_eq!(\"POST\", cloned.method());\n        assert_eq!(2, cloned.headers().len());\n        assert_eq!(\"Token: hello\", cloned.headers().get(AUTHORIZATION).unwrap(),);\n        assert_eq!(\"456\", cloned.headers().get(CONTENT_LENGTH).unwrap());\n        assert_eq!(\"hello world!\".as_bytes(), cloned.body().bytes().unwrap());\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime-api/src/client/interceptors/error.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Errors related to Smithy interceptors\n\nuse crate::box_error::BoxError;\nuse std::fmt;\n\nmacro_rules! interceptor_error_fn {\n    ($fn_name:ident => $error_kind:ident (with source)) => {\n        #[doc = concat!(\"Create a new error indicating a failure with a \", stringify!($fn_name), \" interceptor.\")]\n        pub fn $fn_name(\n            interceptor_name: impl Into<String>,\n            source: impl Into<Box<dyn std::error::Error + Send + Sync + 'static>>,\n        ) -> Self {\n            Self {\n                kind: ErrorKind::$error_kind,\n                interceptor_name: Some(interceptor_name.into()),\n                source: Some(source.into()),\n            }\n        }\n    };\n    ($fn_name:ident => $error_kind:ident (invalid $thing:ident access)) => {\n        #[doc = concat!(\"Create a new error indicating that an interceptor tried to access the \", stringify!($thing), \" out of turn.\")]\n        pub fn $fn_name() -> Self {\n            Self {\n                kind: ErrorKind::$error_kind,\n                interceptor_name: None,\n                source: None,\n            }\n        }\n    }\n}\n\n/// An error related to Smithy interceptors.\n#[derive(Debug)]\npub struct InterceptorError {\n    kind: ErrorKind,\n    interceptor_name: Option<String>,\n    source: Option<BoxError>,\n}\n\nimpl InterceptorError {\n    interceptor_error_fn!(read_before_execution => ReadBeforeExecution (with source));\n    interceptor_error_fn!(modify_before_serialization => ModifyBeforeSerialization (with source));\n    interceptor_error_fn!(read_before_serialization => ReadBeforeSerialization (with source));\n    interceptor_error_fn!(read_after_serialization => ReadAfterSerialization (with source));\n    interceptor_error_fn!(modify_before_retry_loop => ModifyBeforeRetryLoop (with source));\n    interceptor_error_fn!(read_before_attempt => ReadBeforeAttempt (with source));\n    interceptor_error_fn!(modify_before_signing => ModifyBeforeSigning (with source));\n    interceptor_error_fn!(read_before_signing => ReadBeforeSigning (with source));\n    interceptor_error_fn!(read_after_signing => ReadAfterSigning (with source));\n    interceptor_error_fn!(modify_before_transmit => ModifyBeforeTransmit (with source));\n    interceptor_error_fn!(read_before_transmit => ReadBeforeTransmit (with source));\n    interceptor_error_fn!(read_after_transmit => ReadAfterTransmit (with source));\n    interceptor_error_fn!(modify_before_deserialization => ModifyBeforeDeserialization (with source));\n    interceptor_error_fn!(read_before_deserialization => ReadBeforeDeserialization (with source));\n    interceptor_error_fn!(read_after_deserialization => ReadAfterDeserialization (with source));\n    interceptor_error_fn!(modify_before_attempt_completion => ModifyBeforeAttemptCompletion (with source));\n    interceptor_error_fn!(read_after_attempt => ReadAfterAttempt (with source));\n    interceptor_error_fn!(modify_before_completion => ModifyBeforeCompletion (with source));\n    interceptor_error_fn!(read_after_execution => ReadAfterExecution (with source));\n\n    interceptor_error_fn!(modify_before_attempt_completion_failed => ModifyBeforeAttemptCompletion (with source));\n    interceptor_error_fn!(read_after_attempt_failed => ReadAfterAttempt (with source));\n    interceptor_error_fn!(modify_before_completion_failed => ModifyBeforeCompletion (with source));\n    interceptor_error_fn!(read_after_execution_failed => ReadAfterExecution (with source));\n\n    interceptor_error_fn!(invalid_request_access => InvalidRequestAccess (invalid request access));\n    interceptor_error_fn!(invalid_response_access => InvalidResponseAccess (invalid response access));\n    interceptor_error_fn!(invalid_input_access => InvalidInputAccess (invalid input access));\n    interceptor_error_fn!(invalid_output_access => InvalidOutputAccess (invalid output access));\n}\n\n#[derive(Debug)]\nenum ErrorKind {\n    /// An error occurred within the read_before_execution interceptor\n    ReadBeforeExecution,\n    /// An error occurred within the modify_before_serialization interceptor\n    ModifyBeforeSerialization,\n    /// An error occurred within the read_before_serialization interceptor\n    ReadBeforeSerialization,\n    /// An error occurred within the read_after_serialization interceptor\n    ReadAfterSerialization,\n    /// An error occurred within the modify_before_retry_loop interceptor\n    ModifyBeforeRetryLoop,\n    /// An error occurred within the read_before_attempt interceptor\n    ReadBeforeAttempt,\n    /// An error occurred within the modify_before_signing interceptor\n    ModifyBeforeSigning,\n    /// An error occurred within the read_before_signing interceptor\n    ReadBeforeSigning,\n    /// An error occurred within the read_after_signing interceptor\n    ReadAfterSigning,\n    /// An error occurred within the modify_before_transmit interceptor\n    ModifyBeforeTransmit,\n    /// An error occurred within the read_before_transmit interceptor\n    ReadBeforeTransmit,\n    /// An error occurred within the read_after_transmit interceptor\n    ReadAfterTransmit,\n    /// An error occurred within the modify_before_deserialization interceptor\n    ModifyBeforeDeserialization,\n    /// An error occurred within the read_before_deserialization interceptor\n    ReadBeforeDeserialization,\n    /// An error occurred within the read_after_deserialization interceptor\n    ReadAfterDeserialization,\n    /// An error occurred within the modify_before_attempt_completion interceptor\n    ModifyBeforeAttemptCompletion,\n    /// An error occurred within the read_after_attempt interceptor\n    ReadAfterAttempt,\n    /// An error occurred within the modify_before_completion interceptor\n    ModifyBeforeCompletion,\n    /// An error occurred within the read_after_execution interceptor\n    ReadAfterExecution,\n    /// An interceptor tried to access the request out of turn\n    InvalidRequestAccess,\n    /// An interceptor tried to access the response out of turn\n    InvalidResponseAccess,\n    /// An interceptor tried to access the input out of turn\n    InvalidInputAccess,\n    /// An interceptor tried to access the output out of turn\n    InvalidOutputAccess,\n}\n\nmacro_rules! display_interceptor_err {\n    ($self:ident, $f:ident, $(($error_kind:ident => $fn_name:ident ($($option:tt)+)),)+) => {\n        {\n        use ErrorKind::*;\n        match &$self.kind {\n            $($error_kind => display_interceptor_err!($self, $f, $fn_name, ($($option)+)),)+\n        }\n    }\n    };\n    ($self:ident, $f:ident, $fn_name:ident, (interceptor error)) => {{\n        $f.write_str($self.interceptor_name.as_deref().unwrap_or_default())?;\n        $f.write_str(concat!(\" \", stringify!($fn_name), \" interceptor encountered an error\"))\n    }};\n    ($self:ident, $f:ident, $fn_name:ident, (invalid access $name:ident $message:literal)) => {\n        $f.write_str(concat!(\"tried to access the \", stringify!($name), \" \", $message))\n    };\n}\n\nimpl fmt::Display for InterceptorError {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        display_interceptor_err!(self, f,\n            (ReadBeforeExecution => read_before_execution (interceptor error)),\n            (ModifyBeforeSerialization => modify_before_serialization (interceptor error)),\n            (ReadBeforeSerialization => read_before_serialization (interceptor error)),\n            (ReadAfterSerialization => read_after_serialization (interceptor error)),\n            (ModifyBeforeRetryLoop => modify_before_retry_loop (interceptor error)),\n            (ReadBeforeAttempt => read_Before_attempt (interceptor error)),\n            (ModifyBeforeSigning => modify_before_signing (interceptor error)),\n            (ReadBeforeSigning => read_before_signing (interceptor error)),\n            (ReadAfterSigning => read_after_signing (interceptor error)),\n            (ModifyBeforeTransmit => modify_before_transmit (interceptor error)),\n            (ReadBeforeTransmit => read_before_transmit (interceptor error)),\n            (ReadAfterTransmit => read_after_transmit (interceptor error)),\n            (ModifyBeforeDeserialization => modify_before_deserialization (interceptor error)),\n            (ReadBeforeDeserialization => read_before_deserialization (interceptor error)),\n            (ReadAfterDeserialization => read_after_deserialization (interceptor error)),\n            (ModifyBeforeAttemptCompletion => modify_before_attempt_completion (interceptor error)),\n            (ReadAfterAttempt => read_after_attempt (interceptor error)),\n            (ModifyBeforeCompletion => modify_before_completion (interceptor error)),\n            (ReadAfterExecution => read_after_execution (interceptor error)),\n            (InvalidRequestAccess => invalid_request_access (invalid access request \"before request serialization\")),\n            (InvalidResponseAccess => invalid_response_access (invalid access response \"before transmitting a request\")),\n            (InvalidInputAccess => invalid_input_access (invalid access input \"after request serialization\")),\n            (InvalidOutputAccess => invalid_output_access (invalid access output \"before response deserialization\")),\n        )\n    }\n}\n\nimpl std::error::Error for InterceptorError {\n    fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {\n        self.source.as_ref().map(|err| err.as_ref() as _)\n    }\n}\n\n/// A convenience error that allows for adding additional `context` to `source`\n#[derive(Debug)]\npub struct ContextAttachedError {\n    context: String,\n    source: Option<BoxError>,\n}\n\nimpl ContextAttachedError {\n    /// Creates a new `ContextAttachedError` with the given `context` and `source`.\n    pub fn new(context: impl Into<String>, source: impl Into<BoxError>) -> Self {\n        Self {\n            context: context.into(),\n            source: Some(source.into()),\n        }\n    }\n}\n\nimpl fmt::Display for ContextAttachedError {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        write!(f, \"{}\", self.context)\n    }\n}\n\nimpl std::error::Error for ContextAttachedError {\n    fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {\n        self.source.as_ref().map(|err| err.as_ref() as _)\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime-api/src/client/interceptors.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Interceptors for clients.\n//!\n//! Interceptors are operation lifecycle hooks that can read/modify requests and responses.\n\nuse crate::box_error::BoxError;\nuse crate::client::interceptors::context::{\n    AfterDeserializationInterceptorContextRef, BeforeDeserializationInterceptorContextMut,\n    BeforeDeserializationInterceptorContextRef, BeforeSerializationInterceptorContextMut,\n    BeforeSerializationInterceptorContextRef, BeforeTransmitInterceptorContextMut,\n    BeforeTransmitInterceptorContextRef, FinalizerInterceptorContextMut,\n    FinalizerInterceptorContextRef,\n};\nuse crate::client::runtime_components::sealed::ValidateConfig;\nuse crate::client::runtime_components::RuntimeComponents;\nuse aws_smithy_types::config_bag::{ConfigBag, Storable, StoreReplace};\nuse std::fmt;\nuse std::marker::PhantomData;\nuse std::sync::Arc;\n\npub mod context;\npub mod error;\n\nuse crate::impl_shared_conversions;\npub use error::InterceptorError;\n\nmacro_rules! interceptor_trait_fn {\n    ($name:ident, $phase:ident, $docs:tt) => {\n        #[doc = $docs]\n        fn $name(\n            &self,\n            context: &$phase<'_>,\n            runtime_components: &RuntimeComponents,\n            cfg: &mut ConfigBag,\n        ) -> Result<(), BoxError> {\n            let (_ctx, _rc, _cfg) = (context, runtime_components, cfg);\n            Ok(())\n        }\n    };\n    (mut $name:ident, $phase:ident, $docs:tt) => {\n        #[doc = $docs]\n        fn $name(\n            &self,\n            context: &mut $phase<'_>,\n            runtime_components: &RuntimeComponents,\n            cfg: &mut ConfigBag,\n        ) -> Result<(), BoxError> {\n            let (_ctx, _rc, _cfg) = (context, runtime_components, cfg);\n            Ok(())\n        }\n    };\n}\n\n/// An interceptor allows injecting code into the SDK ’s request execution pipeline.\n///\n/// ## Terminology:\n/// - An execution is one end-to-end invocation against an SDK client.\n/// - An attempt is an attempt at performing an execution. By default executions are retried multiple\n///   times based on the client ’s retry strategy.\n/// - A hook is a single method on the interceptor, allowing injection of code into a specific part\n///   of the SDK ’s request execution pipeline. Hooks are either \"read\" hooks, which make it possible\n///   to read in-flight request or response messages, or \"read/write\" hooks, which make it possible\n///   to modify in-flight request or output messages.\n// If you add hook methods, also update:\n//   - `KNOWN_HOOKS` in `aws-smithy-runtime-api-macros/src/lib.rs`\n//   - `OverriddenHooks` constants (below in this file)\npub trait Intercept: fmt::Debug + Send + Sync {\n    /// The name of this interceptor, used in error messages for debugging.\n    fn name(&self) -> &'static str;\n\n    /// A hook called at the start of an execution, before the SDK\n    /// does anything else.\n    ///\n    /// **When:** This will **ALWAYS** be called once per execution. The duration\n    /// between invocation of this hook and `after_execution` is very close\n    /// to full duration of the execution.\n    ///\n    /// **Available Information:** The [`InterceptorContext::input`](context::InterceptorContext::input)\n    /// is **ALWAYS** available. Other information **WILL NOT** be available.\n    ///\n    /// **Error Behavior:** Errors raised by this hook will be stored\n    /// until all interceptors have had their `before_execution` invoked.\n    /// Other hooks will then be skipped and execution will jump to\n    /// `modify_before_completion` with the raised error as the\n    /// [`InterceptorContext::output_or_error`](context::InterceptorContext::output_or_error). If multiple\n    /// `before_execution` methods raise errors, the latest\n    /// will be used and earlier ones will be logged and dropped.\n    fn read_before_execution(\n        &self,\n        context: &BeforeSerializationInterceptorContextRef<'_>,\n        cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        let (_ctx, _cfg) = (context, cfg);\n        Ok(())\n    }\n\n    interceptor_trait_fn!(\n        mut modify_before_serialization,\n        BeforeSerializationInterceptorContextMut,\n        \"\n        A hook called before the input message is marshalled into a\n        transport message.\n        This method has the ability to modify and return a new\n        request message of the same type.\n\n        **When:** This will **ALWAYS** be called once per execution, except when a\n        failure occurs earlier in the request pipeline.\n\n        **Available Information:** The [`InterceptorContext::input`](context::InterceptorContext::input) is\n        **ALWAYS** available. This request may have been modified by earlier\n        `modify_before_serialization` hooks, and may be modified further by\n        later hooks. Other information **WILL NOT** be available.\n\n        **Error Behavior:** If errors are raised by this hook,\n        execution will jump to `modify_before_completion` with the raised\n        error as the [`InterceptorContext::output_or_error`](context::InterceptorContext::output_or_error).\n\n        **Return Constraints:** The input message returned by this hook\n        MUST be the same type of input message passed into this hook.\n        If not, an error will immediately be raised.\n        \"\n    );\n\n    interceptor_trait_fn!(\n        read_before_serialization,\n        BeforeSerializationInterceptorContextRef,\n        \"\n        A hook called before the input message is marshalled\n        into a transport\n        message.\n\n        **When:** This will **ALWAYS** be called once per execution, except when a\n        failure occurs earlier in the request pipeline. The\n        duration between invocation of this hook and `after_serialization` is\n        very close to the amount of time spent marshalling the request.\n\n        **Available Information:** The [`InterceptorContext::input`](context::InterceptorContext::input) is\n        **ALWAYS** available. Other information **WILL NOT** be available.\n\n        **Error Behavior:** If errors are raised by this hook,\n        execution will jump to `modify_before_completion` with the raised\n        error as the [`InterceptorContext::output_or_error`](context::InterceptorContext::output_or_error).\n        \"\n    );\n\n    interceptor_trait_fn!(\n        read_after_serialization,\n        BeforeTransmitInterceptorContextRef,\n        \"\n        A hook called after the input message is marshalled into\n        a transport message.\n\n        **When:** This will **ALWAYS** be called once per execution, except when a\n        failure occurs earlier in the request pipeline. The duration\n        between invocation of this hook and `before_serialization` is very\n        close to the amount of time spent marshalling the request.\n\n        **Available Information:** The [`InterceptorContext::request`](context::InterceptorContext::request)\n        is **ALWAYS** available. Other information **WILL NOT** be available.\n\n        **Error Behavior:** If errors are raised by this hook,\n        execution will jump to `modify_before_completion` with the raised\n        error as the [`InterceptorContext::output_or_error`](context::InterceptorContext::output_or_error).\n        \"\n    );\n\n    interceptor_trait_fn!(\n        mut modify_before_retry_loop,\n        BeforeTransmitInterceptorContextMut,\n        \"\n        A hook called before the retry loop is entered. This method\n        has the ability to modify and return a new transport request\n        message of the same type, except when a failure occurs earlier in the request pipeline.\n\n        **Available Information:** The [`InterceptorContext::request`](context::InterceptorContext::request)\n        is **ALWAYS** available. Other information **WILL NOT** be available.\n\n        **Error Behavior:** If errors are raised by this hook,\n        execution will jump to `modify_before_completion` with the raised\n        error as the [`InterceptorContext::output_or_error`](context::InterceptorContext::output_or_error).\n\n        **Return Constraints:** The transport request message returned by this\n        hook MUST be the same type of request message passed into this hook\n        If not, an error will immediately be raised.\n        \"\n    );\n\n    interceptor_trait_fn!(\n        read_before_attempt,\n        BeforeTransmitInterceptorContextRef,\n        \"\n        A hook called before each attempt at sending the transmission\n        request message to the service.\n\n        **When:** This will **ALWAYS** be called once per attempt, except when a\n        failure occurs earlier in the request pipeline. This method will be\n        called multiple times in the event of retries.\n\n        **Available Information:** The [`InterceptorContext::request`](context::InterceptorContext::request)\n        is **ALWAYS** available. Other information **WILL NOT** be available. In the event of retries,\n        the `InterceptorContext` will not include changes made in previous\n        attempts (e.g. by request signers or other interceptors).\n\n        **Error Behavior:** Errors raised by this hook will be stored\n        until all interceptors have had their `before_attempt` invoked.\n        Other hooks will then be skipped and execution will jump to\n        `modify_before_attempt_completion` with the raised error as the\n        [`InterceptorContext::output_or_error`](context::InterceptorContext::output_or_error). If multiple\n        `before_attempt` methods raise errors, the latest will be used\n        and earlier ones will be logged and dropped.\n        \"\n    );\n\n    interceptor_trait_fn!(\n        mut modify_before_signing,\n        BeforeTransmitInterceptorContextMut,\n        \"\n        A hook called before the transport request message is signed.\n        This method has the ability to modify and return a new transport\n        request message of the same type.\n\n        **When:** This will **ALWAYS** be called once per attempt, except when a\n        failure occurs earlier in the request pipeline. This method may be\n        called multiple times in the event of retries.\n\n        **Available Information:** The [`InterceptorContext::request`](context::InterceptorContext::request)\n        is **ALWAYS** available. The `http::Request` may have been modified by earlier\n        `modify_before_signing` hooks, and may be modified further by later\n        hooks. Other information **WILL NOT** be available. In the event of\n        retries, the `InterceptorContext` will not include changes made\n        in previous attempts (e.g. by request signers or other interceptors).\n\n        **Error Behavior:** If errors are raised by this\n        hook, execution will jump to `modify_before_attempt_completion` with\n        the raised error as the [`InterceptorContext::output_or_error`](context::InterceptorContext::output_or_error).\n\n        **Return Constraints:** The transport request message returned by this\n        hook MUST be the same type of request message passed into this hook\n\n        If not, an error will immediately be raised.\n        \"\n    );\n\n    interceptor_trait_fn!(\n        read_before_signing,\n        BeforeTransmitInterceptorContextRef,\n        \"\n        A hook called before the transport request message is signed.\n\n        **When:** This will **ALWAYS** be called once per attempt, except when a\n        failure occurs earlier in the request pipeline. This method may be\n        called multiple times in the event of retries. The duration between\n        invocation of this hook and `after_signing` is very close to\n        the amount of time spent signing the request.\n\n        **Available Information:** The [`InterceptorContext::request`](context::InterceptorContext::request) is **ALWAYS** available.\n        Other information **WILL NOT** be available. In the event of retries,\n        the `InterceptorContext` will not include changes made in previous\n        attempts (e.g. by request signers or other interceptors).\n\n        **Error Behavior:** If errors are raised by this\n        hook, execution will jump to `modify_before_attempt_completion` with\n        the raised error as the [`InterceptorContext::output_or_error`](context::InterceptorContext::output_or_error).\n        \"\n    );\n\n    interceptor_trait_fn!(\n        read_after_signing,\n        BeforeTransmitInterceptorContextRef,\n        \"\n        A hook called after the transport request message is signed.\n\n        **When:** This will **ALWAYS** be called once per attempt, except when a\n        failure occurs earlier in the request pipeline. This method may be\n        called multiple times in the event of retries. The duration between\n        invocation of this hook and `before_signing` is very close to\n        the amount of time spent signing the request.\n\n        **Available Information:** The [`InterceptorContext::request`](context::InterceptorContext::request) is **ALWAYS** available.\n        Other information **WILL NOT** be available. In the event of retries,\n        the `InterceptorContext` will not include changes made in previous\n        attempts (e.g. by request signers or other interceptors).\n\n        **Error Behavior:** If errors are raised by this\n        hook, execution will jump to `modify_before_attempt_completion` with\n        the raised error as the [`InterceptorContext::output_or_error`](context::InterceptorContext::output_or_error).\n        \"\n    );\n\n    interceptor_trait_fn!(\n        mut modify_before_transmit,\n        BeforeTransmitInterceptorContextMut,\n        \"\n        A hook called before the transport request message is sent to the\n        service. This method has the ability to modify and return\n        a new transport request message of the same type.\n\n        **When:** This will **ALWAYS** be called once per attempt, except when a\n        failure occurs earlier in the request pipeline. This method may be\n        called multiple times in the event of retries.\n\n        **Available Information:** The [`InterceptorContext::request`](context::InterceptorContext::request)\n        is **ALWAYS** available. The `http::Request` may have been modified by earlier\n        `modify_before_transmit` hooks, and may be modified further by later\n        hooks. Other information **WILL NOT** be available.\n        In the event of retries, the `InterceptorContext` will not include\n        changes made in previous attempts (e.g. by request signers or\n        other interceptors).\n\n        **Error Behavior:** If errors are raised by this\n        hook, execution will jump to `modify_before_attempt_completion` with\n        the raised error as the [`InterceptorContext::output_or_error`](context::InterceptorContext::output_or_error).\n\n        **Return Constraints:** The transport request message returned by this\n        hook MUST be the same type of request message passed into this hook\n\n        If not, an error will immediately be raised.\n        \"\n    );\n\n    interceptor_trait_fn!(\n        read_before_transmit,\n        BeforeTransmitInterceptorContextRef,\n        \"\n        A hook called before the transport request message is sent to the\n        service.\n\n        **When:** This will **ALWAYS** be called once per attempt, except when a\n        failure occurs earlier in the request pipeline. This method may be\n        called multiple times in the event of retries. The duration between\n        invocation of this hook and `after_transmit` is very close to\n        the amount of time spent communicating with the service.\n        Depending on the protocol, the duration may not include the\n        time spent reading the response data.\n\n        **Available Information:** The [`InterceptorContext::request`](context::InterceptorContext::request)\n        is **ALWAYS** available. Other information **WILL NOT** be available. In the event of retries,\n        the `InterceptorContext` will not include changes made in previous\n        attempts (e.g. by request signers or other interceptors).\n\n\n        **Error Behavior:** If errors are raised by this\n        hook, execution will jump to `modify_before_attempt_completion` with\n        the raised error as the [`InterceptorContext::output_or_error`](context::InterceptorContext::output_or_error).\n        \"\n    );\n\n    interceptor_trait_fn!(\n        read_after_transmit,\n        BeforeDeserializationInterceptorContextRef,\n        \"\n        A hook called after the transport request message is sent to the\n        service and a transport response message is received.\n\n        **When:** This will **ALWAYS** be called once per attempt, except when a\n        failure occurs earlier in the request pipeline. This method may be\n        called multiple times in the event of retries. The duration between\n        invocation of this hook and `before_transmit` is very close to\n        the amount of time spent communicating with the service.\n        Depending on the protocol, the duration may not include the time\n        spent reading the response data.\n\n        **Available Information:** The [`InterceptorContext::response`](context::InterceptorContext::response)\n        is **ALWAYS** available. Other information **WILL NOT** be available. In the event of retries,\n        the `InterceptorContext` will not include changes made in previous\n        attempts (e.g. by request signers or other interceptors).\n\n        **Error Behavior:** If errors are raised by this\n        hook, execution will jump to `modify_before_attempt_completion` with\n        the raised error as the [`InterceptorContext::output_or_error`](context::InterceptorContext::output_or_error).\n        \"\n    );\n\n    interceptor_trait_fn!(\n        mut modify_before_deserialization,\n        BeforeDeserializationInterceptorContextMut,\n        \"\n        A hook called before the transport response message is unmarshalled.\n        This method has the ability to modify and return a new transport\n        response message of the same type.\n\n        **When:** This will **ALWAYS** be called once per attempt, except when a\n        failure occurs earlier in the request pipeline. This method may be\n        called multiple times in the event of retries.\n\n        **Available Information:** The [`InterceptorContext::response`](context::InterceptorContext::response)\n        is **ALWAYS** available. The transmit_response may have been modified by earlier\n        `modify_before_deserialization` hooks, and may be modified further by\n        later hooks. Other information **WILL NOT** be available. In the event of\n        retries, the `InterceptorContext` will not include changes made in\n        previous attempts (e.g. by request signers or other interceptors).\n\n        **Error Behavior:** If errors are raised by this\n        hook, execution will jump to `modify_before_attempt_completion` with\n        the raised error as the\n        [`InterceptorContext::output_or_error`](context::InterceptorContext::output_or_error).\n\n        **Return Constraints:** The transport response message returned by this\n        hook MUST be the same type of response message passed into\n        this hook. If not, an error will immediately be raised.\n        \"\n    );\n\n    interceptor_trait_fn!(\n        read_before_deserialization,\n        BeforeDeserializationInterceptorContextRef,\n        \"\n        A hook called before the transport response message is unmarshalled\n\n        **When:** This will **ALWAYS** be called once per attempt, except when a\n        failure occurs earlier in the request pipeline. This method may be\n        called multiple times in the event of retries. The duration between\n        invocation of this hook and `after_deserialization` is very close\n        to the amount of time spent unmarshalling the service response.\n        Depending on the protocol and operation, the duration may include\n        the time spent downloading the response data.\n\n        **Available Information:** The [`InterceptorContext::response`](context::InterceptorContext::response)\n        is **ALWAYS** available. Other information **WILL NOT** be available. In the event of retries,\n        the `InterceptorContext` will not include changes made in previous\n        attempts (e.g. by request signers or other interceptors).\n\n        **Error Behavior:** If errors are raised by this\n        hook, execution will jump to `modify_before_attempt_completion`\n        with the raised error as the [`InterceptorContext::output_or_error`](context::InterceptorContext::output_or_error).\n        \"\n    );\n\n    interceptor_trait_fn!(\n        read_after_deserialization,\n        AfterDeserializationInterceptorContextRef,\n        \"\n        A hook called after the transport response message is unmarshalled.\n\n        **When:** This will **ALWAYS** be called once per attempt, except when a\n        failure occurs earlier in the request pipeline. The duration\n        between invocation of this hook and `before_deserialization` is\n        very close to the amount of time spent unmarshalling the\n        service response. Depending on the protocol and operation,\n        the duration may include the time spent downloading\n        the response data.\n\n        **Available Information:** The [`InterceptorContext::response`](context::InterceptorContext::response)\n        and [`InterceptorContext::output_or_error`](context::InterceptorContext::output_or_error)\n        are **ALWAYS** available. In the event of retries, the `InterceptorContext` will not include changes made\n        in previous attempts (e.g. by request signers or other interceptors).\n\n        **Error Behavior:** If errors are raised by this\n        hook, execution will jump to `modify_before_attempt_completion` with\n        the raised error as the [`InterceptorContext::output_or_error`](context::InterceptorContext::output_or_error).\n        \"\n    );\n\n    /// A hook called when an attempt is completed. This method has the\n    /// ability to modify and return a new output message or error\n    /// matching the currently-executing operation.\n    ///\n    /// **When:** This will **ALWAYS** be called once per attempt, except when a\n    /// failure occurs before `before_attempt`. This method may\n    /// be called multiple times in the event of retries.\n    ///\n    /// **Available Information:**\n    /// The [`InterceptorContext::input`](context::InterceptorContext::input),\n    /// [`InterceptorContext::request`](context::InterceptorContext::request),\n    /// [`InterceptorContext::response`](context::InterceptorContext::response), or\n    /// [`InterceptorContext::output_or_error`](context::InterceptorContext::output_or_error) **MAY** be available.\n    /// If the operation succeeded, the `output` will be available. Otherwise, any of the other\n    /// pieces of information may be available depending on where in the operation lifecycle it failed.\n    /// In the event of retries, the `InterceptorContext` will not include changes made\n    /// in previous attempts (e.g. by request signers or other interceptors).\n    ///\n    /// **Error Behavior:** If errors are raised by this\n    /// hook, execution will jump to `after_attempt` with\n    /// the raised error as the [`InterceptorContext::output_or_error`](context::InterceptorContext::output_or_error).\n    ///\n    /// **Return Constraints:** Any output message returned by this\n    /// hook MUST match the operation being invoked. Any error type can be\n    /// returned, replacing the response currently in the context.\n    fn modify_before_attempt_completion(\n        &self,\n        context: &mut FinalizerInterceptorContextMut<'_>,\n        runtime_components: &RuntimeComponents,\n        cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        let (_ctx, _rc, _cfg) = (context, runtime_components, cfg);\n        Ok(())\n    }\n\n    /// A hook called when an attempt is completed.\n    ///\n    /// **When:** This will **ALWAYS** be called once per attempt, as long as\n    /// `before_attempt` has been executed.\n    ///\n    /// **Available Information:**\n    /// The [`InterceptorContext::input`](context::InterceptorContext::input),\n    /// [`InterceptorContext::request`](context::InterceptorContext::request),\n    /// [`InterceptorContext::response`](context::InterceptorContext::response), or\n    /// [`InterceptorContext::output_or_error`](context::InterceptorContext::output_or_error) **MAY** be available.\n    /// If the operation succeeded, the `output` will be available. Otherwise, any of the other\n    /// pieces of information may be available depending on where in the operation lifecycle it failed.\n    /// In the event of retries, the `InterceptorContext` will not include changes made\n    /// in previous attempts (e.g. by request signers or other interceptors).\n    ///\n    /// **Error Behavior:** Errors raised by this hook will be stored\n    /// until all interceptors have had their `after_attempt` invoked.\n    /// If multiple `after_execution` methods raise errors, the latest\n    /// will be used and earlier ones will be logged and dropped. If the\n    /// retry strategy determines that the execution is retryable,\n    /// execution will then jump to `before_attempt`. Otherwise,\n    /// execution will jump to `modify_before_attempt_completion` with the\n    /// raised error as the [`InterceptorContext::output_or_error`](context::InterceptorContext::output_or_error).\n    fn read_after_attempt(\n        &self,\n        context: &FinalizerInterceptorContextRef<'_>,\n        runtime_components: &RuntimeComponents,\n        cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        let (_ctx, _rc, _cfg) = (context, runtime_components, cfg);\n        Ok(())\n    }\n\n    /// A hook called when an execution is completed.\n    /// This method has the ability to modify and return a new\n    /// output message or error matching the currently - executing\n    /// operation.\n    ///\n    /// **When:** This will **ALWAYS** be called once per execution.\n    ///\n    /// **Available Information:**\n    /// The [`InterceptorContext::input`](context::InterceptorContext::input),\n    /// [`InterceptorContext::request`](context::InterceptorContext::request),\n    /// [`InterceptorContext::response`](context::InterceptorContext::response), or\n    /// [`InterceptorContext::output_or_error`](context::InterceptorContext::output_or_error) **MAY** be available.\n    /// If the operation succeeded, the `output` will be available. Otherwise, any of the other\n    /// pieces of information may be available depending on where in the operation lifecycle it failed.\n    /// In the event of retries, the `InterceptorContext` will not include changes made\n    /// in previous attempts (e.g. by request signers or other interceptors).\n    ///\n    /// **Error Behavior:** If errors are raised by this\n    /// hook , execution will jump to `after_attempt` with\n    /// the raised error as the [`InterceptorContext::output_or_error`](context::InterceptorContext::output_or_error).\n    ///\n    /// **Return Constraints:** Any output message returned by this\n    /// hook MUST match the operation being invoked. Any error type can be\n    /// returned , replacing the response currently in the context.\n    fn modify_before_completion(\n        &self,\n        context: &mut FinalizerInterceptorContextMut<'_>,\n        runtime_components: &RuntimeComponents,\n        cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        let (_ctx, _rc, _cfg) = (context, runtime_components, cfg);\n        Ok(())\n    }\n\n    /// A hook called when an execution is completed.\n    ///\n    /// **When:** This will **ALWAYS** be called once per execution. The duration\n    /// between invocation of this hook and `before_execution` is very\n    /// close to the full duration of the execution.\n    ///\n    /// **Available Information:**\n    /// The [`InterceptorContext::input`](context::InterceptorContext::input),\n    /// [`InterceptorContext::request`](context::InterceptorContext::request),\n    /// [`InterceptorContext::response`](context::InterceptorContext::response), or\n    /// [`InterceptorContext::output_or_error`](context::InterceptorContext::output_or_error) **MAY** be available.\n    /// If the operation succeeded, the `output` will be available. Otherwise, any of the other\n    /// pieces of information may be available depending on where in the operation lifecycle it failed.\n    /// In the event of retries, the `InterceptorContext` will not include changes made\n    /// in previous attempts (e.g. by request signers or other interceptors).\n    ///\n    /// **Error Behavior:** Errors raised by this hook will be stored\n    /// until all interceptors have had their `after_execution` invoked.\n    /// The error will then be treated as the\n    /// [`InterceptorContext::output_or_error`](context::InterceptorContext::output_or_error)\n    /// to the customer. If multiple `after_execution` methods raise errors , the latest will be\n    /// used and earlier ones will be logged and dropped.\n    fn read_after_execution(\n        &self,\n        context: &FinalizerInterceptorContextRef<'_>,\n        runtime_components: &RuntimeComponents,\n        cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        let (_ctx, _rc, _cfg) = (context, runtime_components, cfg);\n        Ok(())\n    }\n\n    /// Returns a bitmask of which hooks this interceptor overrides.\n    ///\n    /// The default returns [`OverriddenHooks::all()`], meaning all hooks are\n    /// called (safe, same behavior as before overridden hooks existed). Use\n    /// [`#[dyn_dispatch_hint]`](dyn_dispatch_hint) on your `impl Intercept` block to\n    /// auto-generate this method from the overridden hooks.\n    #[doc(hidden)]\n    fn overridden_hooks(&self) -> OverriddenHooks {\n        OverriddenHooks::all()\n    }\n}\n\n/// Bitmask indicating which interceptor hooks a [`SharedInterceptor`] actually overrides.\n///\n/// When returned from [`Intercept::overridden_hooks`], the interceptor loop can skip\n/// dyn dispatch for hooks that are not in the mask.\n#[doc(hidden)]\n#[derive(Clone, Copy, Debug, PartialEq, Eq)]\npub struct OverriddenHooks(u32);\n\nimpl OverriddenHooks {\n    /// All hooks — the safe default.\n    pub const fn all() -> Self {\n        Self(u32::MAX)\n    }\n    /// No hooks.\n    pub const fn none() -> Self {\n        Self(0)\n    }\n\n    // If you update these constants, also update:\n    //   - `KNOWN_HOOKS` in `aws-smithy-runtime-api-macros/src/lib.rs`\n    //   - Hook methods on the `Intercept` trait (above in this file)\n    /// Hint for [`Intercept::read_before_execution`].\n    pub const READ_BEFORE_EXECUTION: Self = Self(1 << 0);\n    /// Hint for [`Intercept::modify_before_serialization`].\n    pub const MODIFY_BEFORE_SERIALIZATION: Self = Self(1 << 1);\n    /// Hint for [`Intercept::read_before_serialization`].\n    pub const READ_BEFORE_SERIALIZATION: Self = Self(1 << 2);\n    /// Hint for [`Intercept::read_after_serialization`].\n    pub const READ_AFTER_SERIALIZATION: Self = Self(1 << 3);\n    /// Hint for [`Intercept::modify_before_retry_loop`].\n    pub const MODIFY_BEFORE_RETRY_LOOP: Self = Self(1 << 4);\n    /// Hint for [`Intercept::read_before_attempt`].\n    pub const READ_BEFORE_ATTEMPT: Self = Self(1 << 5);\n    /// Hint for [`Intercept::modify_before_signing`].\n    pub const MODIFY_BEFORE_SIGNING: Self = Self(1 << 6);\n    /// Hint for [`Intercept::read_before_signing`].\n    pub const READ_BEFORE_SIGNING: Self = Self(1 << 7);\n    /// Hint for [`Intercept::read_after_signing`].\n    pub const READ_AFTER_SIGNING: Self = Self(1 << 8);\n    /// Hint for [`Intercept::modify_before_transmit`].\n    pub const MODIFY_BEFORE_TRANSMIT: Self = Self(1 << 9);\n    /// Hint for [`Intercept::read_before_transmit`].\n    pub const READ_BEFORE_TRANSMIT: Self = Self(1 << 10);\n    /// Hint for [`Intercept::read_after_transmit`].\n    pub const READ_AFTER_TRANSMIT: Self = Self(1 << 11);\n    /// Hint for [`Intercept::modify_before_deserialization`].\n    pub const MODIFY_BEFORE_DESERIALIZATION: Self = Self(1 << 12);\n    /// Hint for [`Intercept::read_before_deserialization`].\n    pub const READ_BEFORE_DESERIALIZATION: Self = Self(1 << 13);\n    /// Hint for [`Intercept::read_after_deserialization`].\n    pub const READ_AFTER_DESERIALIZATION: Self = Self(1 << 14);\n    /// Hint for [`Intercept::modify_before_attempt_completion`].\n    pub const MODIFY_BEFORE_ATTEMPT_COMPLETION: Self = Self(1 << 15);\n    /// Hint for [`Intercept::read_after_attempt`].\n    pub const READ_AFTER_ATTEMPT: Self = Self(1 << 16);\n    /// Hint for [`Intercept::modify_before_completion`].\n    pub const MODIFY_BEFORE_COMPLETION: Self = Self(1 << 17);\n    /// Hint for [`Intercept::read_after_execution`].\n    pub const READ_AFTER_EXECUTION: Self = Self(1 << 18);\n\n    /// Returns `true` if `self` contains any of the hooks in `other`.\n    pub const fn contains(self, other: Self) -> bool {\n        self.0 & other.0 != 0\n    }\n}\n\nimpl std::ops::BitOr for OverriddenHooks {\n    type Output = Self;\n    fn bitor(self, rhs: Self) -> Self {\n        Self(self.0 | rhs.0)\n    }\n}\n\n/// Re-export the proc macro for deriving [`Intercept::overridden_hooks`] automatically.\n#[doc(hidden)]\npub use aws_smithy_runtime_api_macros::dyn_dispatch_hint;\n\n/// Interceptor wrapper that may be shared\n#[derive(Clone)]\npub struct SharedInterceptor {\n    interceptor: Arc<dyn Intercept>,\n    /// When `None`, the interceptor is always enabled (permanent mode).\n    #[allow(clippy::type_complexity)]\n    check_enabled: Option<Arc<dyn Fn(&ConfigBag) -> bool + Send + Sync>>,\n    /// Cached bitmask of which [`Intercept`] hooks this interceptor overrides.\n    overridden_hooks: OverriddenHooks,\n    /// In debug builds, asserts that nobody tried to disable a permanent interceptor.\n    #[cfg(debug_assertions)]\n    debug_assert_not_disabled: Option<fn(&ConfigBag) -> bool>,\n}\n\nimpl fmt::Debug for SharedInterceptor {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        f.debug_struct(\"SharedInterceptor\")\n            .field(\"interceptor\", &self.interceptor)\n            .field(\"permanent\", &self.check_enabled.is_none())\n            .finish()\n    }\n}\n\nimpl SharedInterceptor {\n    /// Create a new `SharedInterceptor` from `Interceptor`.\n    pub fn new<T: Intercept + 'static>(interceptor: T) -> Self {\n        Self {\n            overridden_hooks: interceptor.overridden_hooks(),\n            interceptor: Arc::new(interceptor),\n            check_enabled: Some(Arc::new(|conf: &ConfigBag| {\n                conf.load::<DisableInterceptor<T>>().is_none()\n            })),\n            #[cfg(debug_assertions)]\n            debug_assert_not_disabled: None,\n        }\n    }\n\n    /// Creates a `SharedInterceptor` that is always enabled.\n    ///\n    /// Unlike [`SharedInterceptor::new`], this skips the per-invocation\n    /// [`DisableInterceptor`] lookup in the config bag.\n    ///\n    /// Note: In debug builds, if [`disable_interceptor`] is called for an\n    /// interceptor wrapped with `permanent`, a panic will occur to flag the\n    /// misconfiguration. Use [`SharedInterceptor::new`] instead if the\n    /// interceptor needs to be disabled.\n    pub fn permanent<T: Intercept + 'static>(interceptor: T) -> Self {\n        Self {\n            overridden_hooks: interceptor.overridden_hooks(),\n            interceptor: Arc::new(interceptor),\n            check_enabled: None,\n            #[cfg(debug_assertions)]\n            debug_assert_not_disabled: Some(|conf: &ConfigBag| {\n                conf.load::<DisableInterceptor<T>>().is_none()\n            }),\n        }\n    }\n\n    /// Checks if this interceptor is enabled in the given config.\n    pub fn enabled(&self, conf: &ConfigBag) -> bool {\n        match &self.check_enabled {\n            Some(check) => check(conf),\n            None => {\n                #[cfg(debug_assertions)]\n                if let Some(check) = &self.debug_assert_not_disabled {\n                    debug_assert!(\n                        check(conf),\n                        \"attempted to disable permanent interceptor `{}`; \\\n                         use SharedInterceptor::new() instead of ::permanent() \\\n                         if this interceptor needs to be disabled\",\n                        self.interceptor.name()\n                    );\n                }\n                true\n            }\n        }\n    }\n\n    /// Returns the overridden hooks.\n    pub fn overridden_hooks(&self) -> OverriddenHooks {\n        self.overridden_hooks\n    }\n}\n\nimpl ValidateConfig for SharedInterceptor {}\n\nimpl Intercept for SharedInterceptor {\n    fn name(&self) -> &'static str {\n        self.interceptor.name()\n    }\n\n    fn modify_before_attempt_completion(\n        &self,\n        context: &mut FinalizerInterceptorContextMut<'_>,\n        runtime_components: &RuntimeComponents,\n        cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        self.interceptor\n            .modify_before_attempt_completion(context, runtime_components, cfg)\n    }\n\n    fn modify_before_completion(\n        &self,\n        context: &mut FinalizerInterceptorContextMut<'_>,\n        runtime_components: &RuntimeComponents,\n        cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        self.interceptor\n            .modify_before_completion(context, runtime_components, cfg)\n    }\n\n    fn modify_before_deserialization(\n        &self,\n        context: &mut BeforeDeserializationInterceptorContextMut<'_>,\n        runtime_components: &RuntimeComponents,\n        cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        self.interceptor\n            .modify_before_deserialization(context, runtime_components, cfg)\n    }\n\n    fn modify_before_retry_loop(\n        &self,\n        context: &mut BeforeTransmitInterceptorContextMut<'_>,\n        runtime_components: &RuntimeComponents,\n        cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        self.interceptor\n            .modify_before_retry_loop(context, runtime_components, cfg)\n    }\n\n    fn modify_before_serialization(\n        &self,\n        context: &mut BeforeSerializationInterceptorContextMut<'_>,\n        runtime_components: &RuntimeComponents,\n        cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        self.interceptor\n            .modify_before_serialization(context, runtime_components, cfg)\n    }\n\n    fn modify_before_signing(\n        &self,\n        context: &mut BeforeTransmitInterceptorContextMut<'_>,\n        runtime_components: &RuntimeComponents,\n        cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        self.interceptor\n            .modify_before_signing(context, runtime_components, cfg)\n    }\n\n    fn modify_before_transmit(\n        &self,\n        context: &mut BeforeTransmitInterceptorContextMut<'_>,\n        runtime_components: &RuntimeComponents,\n        cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        self.interceptor\n            .modify_before_transmit(context, runtime_components, cfg)\n    }\n\n    fn read_after_attempt(\n        &self,\n        context: &FinalizerInterceptorContextRef<'_>,\n        runtime_components: &RuntimeComponents,\n        cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        self.interceptor\n            .read_after_attempt(context, runtime_components, cfg)\n    }\n\n    fn read_after_deserialization(\n        &self,\n        context: &AfterDeserializationInterceptorContextRef<'_>,\n        runtime_components: &RuntimeComponents,\n        cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        self.interceptor\n            .read_after_deserialization(context, runtime_components, cfg)\n    }\n\n    fn read_after_execution(\n        &self,\n        context: &FinalizerInterceptorContextRef<'_>,\n        runtime_components: &RuntimeComponents,\n        cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        self.interceptor\n            .read_after_execution(context, runtime_components, cfg)\n    }\n\n    fn read_after_serialization(\n        &self,\n        context: &BeforeTransmitInterceptorContextRef<'_>,\n        runtime_components: &RuntimeComponents,\n        cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        self.interceptor\n            .read_after_serialization(context, runtime_components, cfg)\n    }\n\n    fn read_after_signing(\n        &self,\n        context: &BeforeTransmitInterceptorContextRef<'_>,\n        runtime_components: &RuntimeComponents,\n        cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        self.interceptor\n            .read_after_signing(context, runtime_components, cfg)\n    }\n\n    fn read_after_transmit(\n        &self,\n        context: &BeforeDeserializationInterceptorContextRef<'_>,\n        runtime_components: &RuntimeComponents,\n        cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        self.interceptor\n            .read_after_transmit(context, runtime_components, cfg)\n    }\n\n    fn read_before_attempt(\n        &self,\n        context: &BeforeTransmitInterceptorContextRef<'_>,\n        runtime_components: &RuntimeComponents,\n        cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        self.interceptor\n            .read_before_attempt(context, runtime_components, cfg)\n    }\n\n    fn read_before_deserialization(\n        &self,\n        context: &BeforeDeserializationInterceptorContextRef<'_>,\n        runtime_components: &RuntimeComponents,\n        cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        self.interceptor\n            .read_before_deserialization(context, runtime_components, cfg)\n    }\n\n    fn read_before_execution(\n        &self,\n        context: &BeforeSerializationInterceptorContextRef<'_>,\n        cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        self.interceptor.read_before_execution(context, cfg)\n    }\n\n    fn read_before_serialization(\n        &self,\n        context: &BeforeSerializationInterceptorContextRef<'_>,\n        runtime_components: &RuntimeComponents,\n        cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        self.interceptor\n            .read_before_serialization(context, runtime_components, cfg)\n    }\n\n    fn read_before_signing(\n        &self,\n        context: &BeforeTransmitInterceptorContextRef<'_>,\n        runtime_components: &RuntimeComponents,\n        cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        self.interceptor\n            .read_before_signing(context, runtime_components, cfg)\n    }\n\n    fn read_before_transmit(\n        &self,\n        context: &BeforeTransmitInterceptorContextRef<'_>,\n        runtime_components: &RuntimeComponents,\n        cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        self.interceptor\n            .read_before_transmit(context, runtime_components, cfg)\n    }\n}\n\nimpl_shared_conversions!(convert SharedInterceptor from Intercept using SharedInterceptor::new);\n\n/// Generalized interceptor disabling interface\n///\n/// RuntimePlugins can disable interceptors by inserting [`DisableInterceptor<T>`](DisableInterceptor) into the config bag\n#[must_use]\n#[derive(Debug)]\npub struct DisableInterceptor<T> {\n    _t: PhantomData<T>,\n    #[allow(unused)]\n    cause: &'static str,\n}\n\nimpl<T> Storable for DisableInterceptor<T>\nwhere\n    T: fmt::Debug + Send + Sync + 'static,\n{\n    type Storer = StoreReplace<Self>;\n}\n\n/// Disable an interceptor with a given cause\npub fn disable_interceptor<T: Intercept>(cause: &'static str) -> DisableInterceptor<T> {\n    DisableInterceptor {\n        _t: PhantomData,\n        cause,\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime-api/src/client/orchestrator.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Client request orchestration.\n//!\n//! The orchestrator handles the full request/response lifecycle including:\n//! - Request serialization\n//! - Endpoint resolution\n//! - Identity resolution\n//! - Signing\n//! - Request transmission with retry and timeouts\n//! - Response deserialization\n//!\n//! There are several hook points in the orchestration where [interceptors](crate::client::interceptors)\n//! can read and modify the input, request, response, or output/error.\n\nuse crate::box_error::BoxError;\nuse crate::client::interceptors::context::phase::Phase;\nuse crate::client::interceptors::context::Error;\nuse crate::client::interceptors::InterceptorError;\nuse crate::client::result::{ConnectorError, SdkError};\nuse aws_smithy_types::config_bag::{Storable, StoreReplace};\nuse bytes::Bytes;\nuse std::borrow::Cow;\nuse std::error::Error as StdError;\nuse std::fmt;\n\n/// Type alias for the HTTP request type that the orchestrator uses.\npub type HttpRequest = crate::http::Request;\n\n/// Type alias for the HTTP response type that the orchestrator uses.\npub type HttpResponse = crate::http::Response;\n\n/// Informs the orchestrator on whether or not the request body needs to be loaded into memory before transmit.\n///\n/// This enum gets placed into the `ConfigBag` to change the orchestrator behavior.\n/// Immediately after serialization (before the `read_after_serialization` interceptor hook),\n/// if it was set to `Requested` in the config bag, it will be replaced back into the config bag as\n/// `Loaded` with the request body contents for use in later interceptors.\n///\n/// This all happens before the attempt loop, so the loaded request body will remain available\n/// for interceptors that run in any subsequent retry attempts.\n#[non_exhaustive]\n#[derive(Clone, Debug)]\npub enum LoadedRequestBody {\n    /// Don't attempt to load the request body into memory.\n    NotNeeded,\n    /// Attempt to load the request body into memory.\n    Requested,\n    /// The request body is already loaded.\n    Loaded(Bytes),\n}\n\nimpl Storable for LoadedRequestBody {\n    type Storer = StoreReplace<Self>;\n}\n\n/// Marker type stored in the config bag to indicate that a response body should be redacted.\n#[derive(Debug)]\npub struct SensitiveOutput;\n\nimpl Storable for SensitiveOutput {\n    type Storer = StoreReplace<Self>;\n}\n\n#[derive(Debug)]\nenum ErrorKind<E> {\n    /// An error occurred within an interceptor.\n    Interceptor { source: InterceptorError },\n    /// An error returned by a service.\n    Operation { err: E },\n    /// An error that occurs when a request times out.\n    Timeout { source: BoxError },\n    /// An error that occurs when request dispatch fails.\n    Connector { source: ConnectorError },\n    /// An error that occurs when a response can't be deserialized.\n    Response { source: BoxError },\n    /// A general orchestrator error.\n    Other { source: BoxError },\n}\n\n/// Errors that can occur while running the orchestrator.\n#[derive(Debug)]\npub struct OrchestratorError<E> {\n    kind: ErrorKind<E>,\n}\n\nimpl<E> OrchestratorError<E> {\n    /// Create a new `OrchestratorError` from the given source.\n    pub fn other(source: impl Into<Box<dyn std::error::Error + Send + Sync + 'static>>) -> Self {\n        Self {\n            kind: ErrorKind::Other {\n                source: source.into(),\n            },\n        }\n    }\n\n    /// Create an operation error.\n    pub fn operation(err: E) -> Self {\n        Self {\n            kind: ErrorKind::Operation { err },\n        }\n    }\n\n    /// True if the underlying error is an operation error.\n    pub fn is_operation_error(&self) -> bool {\n        matches!(self.kind, ErrorKind::Operation { .. })\n    }\n\n    /// Return this orchestrator error as an operation error if possible.\n    pub fn as_operation_error(&self) -> Option<&E> {\n        match &self.kind {\n            ErrorKind::Operation { err } => Some(err),\n            _ => None,\n        }\n    }\n\n    /// Create an interceptor error with the given source.\n    pub fn interceptor(source: InterceptorError) -> Self {\n        Self {\n            kind: ErrorKind::Interceptor { source },\n        }\n    }\n\n    /// True if the underlying error is an interceptor error.\n    pub fn is_interceptor_error(&self) -> bool {\n        matches!(self.kind, ErrorKind::Interceptor { .. })\n    }\n\n    /// Create a timeout error with the given source.\n    pub fn timeout(source: BoxError) -> Self {\n        Self {\n            kind: ErrorKind::Timeout { source },\n        }\n    }\n\n    /// True if the underlying error is a timeout error.\n    pub fn is_timeout_error(&self) -> bool {\n        matches!(self.kind, ErrorKind::Timeout { .. })\n    }\n\n    /// Create a response error with the given source.\n    pub fn response(source: BoxError) -> Self {\n        Self {\n            kind: ErrorKind::Response { source },\n        }\n    }\n\n    /// True if the underlying error is a response error.\n    pub fn is_response_error(&self) -> bool {\n        matches!(self.kind, ErrorKind::Response { .. })\n    }\n\n    /// Create a connector error with the given source.\n    pub fn connector(source: ConnectorError) -> Self {\n        Self {\n            kind: ErrorKind::Connector { source },\n        }\n    }\n\n    /// True if the underlying error is a [`ConnectorError`].\n    pub fn is_connector_error(&self) -> bool {\n        matches!(self.kind, ErrorKind::Connector { .. })\n    }\n\n    /// Return this orchestrator error as a connector error if possible.\n    pub fn as_connector_error(&self) -> Option<&ConnectorError> {\n        match &self.kind {\n            ErrorKind::Connector { source } => Some(source),\n            _ => None,\n        }\n    }\n\n    /// Convert the `OrchestratorError` into an [`SdkError`].\n    pub(crate) fn into_sdk_error(\n        self,\n        phase: &Phase,\n        response: Option<HttpResponse>,\n    ) -> SdkError<E, HttpResponse> {\n        match self.kind {\n            ErrorKind::Interceptor { source } => {\n                use Phase::*;\n                match phase {\n                    BeforeSerialization | Serialization => SdkError::construction_failure(source),\n                    BeforeTransmit | Transmit => match response {\n                        Some(response) => SdkError::response_error(source, response),\n                        None => {\n                            SdkError::dispatch_failure(ConnectorError::other(source.into(), None))\n                        }\n                    },\n                    BeforeDeserialization | Deserialization | AfterDeserialization => {\n                        SdkError::response_error(source, response.expect(\"phase has a response\"))\n                    }\n                }\n            }\n            ErrorKind::Operation { err } => {\n                debug_assert!(phase.is_after_deserialization(), \"operation errors are a result of successfully receiving and parsing a response from the server. Therefore, we must be in the 'After Deserialization' phase.\");\n                SdkError::service_error(err, response.expect(\"phase has a response\"))\n            }\n            ErrorKind::Connector { source } => SdkError::dispatch_failure(source),\n            ErrorKind::Timeout { source } => SdkError::timeout_error(source),\n            ErrorKind::Response { source } => SdkError::response_error(source, response.unwrap()),\n            ErrorKind::Other { source } => {\n                use Phase::*;\n                match phase {\n                    BeforeSerialization | Serialization => SdkError::construction_failure(source),\n                    BeforeTransmit | Transmit => convert_dispatch_error(source, response),\n                    BeforeDeserialization | Deserialization | AfterDeserialization => {\n                        SdkError::response_error(source, response.expect(\"phase has a response\"))\n                    }\n                }\n            }\n        }\n    }\n\n    /// Maps the error type in `ErrorKind::Operation`\n    pub fn map_operation_error<E2>(self, map: impl FnOnce(E) -> E2) -> OrchestratorError<E2> {\n        let kind = match self.kind {\n            ErrorKind::Connector { source } => ErrorKind::Connector { source },\n            ErrorKind::Operation { err } => ErrorKind::Operation { err: map(err) },\n            ErrorKind::Interceptor { source } => ErrorKind::Interceptor { source },\n            ErrorKind::Response { source } => ErrorKind::Response { source },\n            ErrorKind::Timeout { source } => ErrorKind::Timeout { source },\n            ErrorKind::Other { source } => ErrorKind::Other { source },\n        };\n        OrchestratorError { kind }\n    }\n}\n\nimpl<E> StdError for OrchestratorError<E>\nwhere\n    E: StdError + 'static,\n{\n    fn source(&self) -> Option<&(dyn StdError + 'static)> {\n        Some(match &self.kind {\n            ErrorKind::Connector { source } => source as _,\n            ErrorKind::Operation { err } => err as _,\n            ErrorKind::Interceptor { source } => source as _,\n            ErrorKind::Response { source } => source.as_ref(),\n            ErrorKind::Timeout { source } => source.as_ref(),\n            ErrorKind::Other { source } => source.as_ref(),\n        })\n    }\n}\n\nimpl<E> fmt::Display for OrchestratorError<E> {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        f.write_str(match self.kind {\n            ErrorKind::Connector { .. } => \"connector error\",\n            ErrorKind::Operation { .. } => \"operation error\",\n            ErrorKind::Interceptor { .. } => \"interceptor error\",\n            ErrorKind::Response { .. } => \"response error\",\n            ErrorKind::Timeout { .. } => \"timeout\",\n            ErrorKind::Other { .. } => \"an unknown error occurred\",\n        })\n    }\n}\n\nfn convert_dispatch_error<O>(\n    err: BoxError,\n    response: Option<HttpResponse>,\n) -> SdkError<O, HttpResponse> {\n    let err = match err.downcast::<ConnectorError>() {\n        Ok(connector_error) => {\n            return SdkError::dispatch_failure(*connector_error);\n        }\n        Err(e) => e,\n    };\n    match response {\n        Some(response) => SdkError::response_error(err, response),\n        None => SdkError::dispatch_failure(ConnectorError::other(err, None)),\n    }\n}\n\nimpl<E> From<InterceptorError> for OrchestratorError<E>\nwhere\n    E: fmt::Debug + std::error::Error + 'static,\n{\n    fn from(err: InterceptorError) -> Self {\n        Self::interceptor(err)\n    }\n}\n\nimpl From<Error> for OrchestratorError<Error> {\n    fn from(err: Error) -> Self {\n        Self::operation(err)\n    }\n}\n\n/// Metadata added to the [`ConfigBag`](aws_smithy_types::config_bag::ConfigBag) that identifies the API being called.\n#[derive(Clone, Debug)]\npub struct Metadata {\n    operation: Cow<'static, str>,\n    service: Cow<'static, str>,\n}\n\nimpl Metadata {\n    /// Returns the operation name.\n    pub fn name(&self) -> &str {\n        &self.operation\n    }\n\n    /// Returns the service name.\n    pub fn service(&self) -> &str {\n        &self.service\n    }\n\n    /// Creates [`Metadata`].\n    pub fn new(\n        operation: impl Into<Cow<'static, str>>,\n        service: impl Into<Cow<'static, str>>,\n    ) -> Self {\n        Metadata {\n            operation: operation.into(),\n            service: service.into(),\n        }\n    }\n}\n\nimpl Storable for Metadata {\n    type Storer = StoreReplace<Self>;\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime-api/src/client/result.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Types for [error](SdkError) responses.\n\nuse crate::client::connection::ConnectionMetadata;\nuse aws_smithy_types::error::metadata::{ProvideErrorMetadata, EMPTY_ERROR_METADATA};\nuse aws_smithy_types::error::operation::BuildError;\nuse aws_smithy_types::error::ErrorMetadata;\nuse aws_smithy_types::retry::ErrorKind;\nuse std::error::Error;\nuse std::fmt;\nuse std::fmt::{Debug, Display, Formatter};\n\ntype BoxError = Box<dyn Error + Send + Sync>;\n\n/// Builders for `SdkError` variant context.\npub mod builders {\n    use super::*;\n\n    macro_rules! source_only_error_builder {\n        ($errorName:ident, $builderName:ident, $sourceType:ident) => {\n            #[doc = concat!(\"Builder for [`\", stringify!($errorName), \"`](super::\", stringify!($errorName), \").\")]\n            #[derive(Debug, Default)]\n            pub struct $builderName {\n                source: Option<$sourceType>,\n            }\n\n            impl $builderName {\n                #[doc = \"Creates a new builder.\"]\n                pub fn new() -> Self { Default::default() }\n\n                #[doc = \"Sets the error source.\"]\n                pub fn source(mut self, source: impl Into<$sourceType>) -> Self {\n                    self.source = Some(source.into());\n                    self\n                }\n\n                #[doc = \"Sets the error source.\"]\n                pub fn set_source(&mut self, source: Option<$sourceType>) -> &mut Self {\n                    self.source = source;\n                    self\n                }\n\n                #[doc = \"Builds the error context.\"]\n                pub fn build(self) -> $errorName {\n                    $errorName { source: self.source.expect(\"source is required\") }\n                }\n            }\n        };\n    }\n\n    source_only_error_builder!(ConstructionFailure, ConstructionFailureBuilder, BoxError);\n    source_only_error_builder!(TimeoutError, TimeoutErrorBuilder, BoxError);\n    source_only_error_builder!(DispatchFailure, DispatchFailureBuilder, ConnectorError);\n\n    /// Builder for [`ResponseError`].\n    #[derive(Debug)]\n    pub struct ResponseErrorBuilder<R> {\n        source: Option<BoxError>,\n        raw: Option<R>,\n    }\n\n    impl<R> Default for ResponseErrorBuilder<R> {\n        fn default() -> Self {\n            Self {\n                source: None,\n                raw: None,\n            }\n        }\n    }\n\n    impl<R> ResponseErrorBuilder<R> {\n        /// Creates a new builder.\n        pub fn new() -> Self {\n            Default::default()\n        }\n\n        /// Sets the error source.\n        pub fn source(mut self, source: impl Into<BoxError>) -> Self {\n            self.source = Some(source.into());\n            self\n        }\n\n        /// Sets the error source.\n        pub fn set_source(&mut self, source: Option<BoxError>) -> &mut Self {\n            self.source = source;\n            self\n        }\n\n        /// Sets the raw response.\n        pub fn raw(mut self, raw: R) -> Self {\n            self.raw = Some(raw);\n            self\n        }\n\n        /// Sets the raw response.\n        pub fn set_raw(&mut self, raw: Option<R>) -> &mut Self {\n            self.raw = raw;\n            self\n        }\n\n        /// Builds the error context.\n        pub fn build(self) -> ResponseError<R> {\n            ResponseError {\n                source: self.source.expect(\"source is required\"),\n                raw: self.raw.expect(\"a raw response is required\"),\n            }\n        }\n    }\n\n    /// Builder for [`ServiceError`].\n    #[derive(Debug)]\n    pub struct ServiceErrorBuilder<E, R> {\n        source: Option<E>,\n        raw: Option<R>,\n    }\n\n    impl<E, R> Default for ServiceErrorBuilder<E, R> {\n        fn default() -> Self {\n            Self {\n                source: None,\n                raw: None,\n            }\n        }\n    }\n\n    impl<E, R> ServiceErrorBuilder<E, R> {\n        /// Creates a new builder.\n        pub fn new() -> Self {\n            Default::default()\n        }\n\n        /// Sets the error source.\n        pub fn source(mut self, source: impl Into<E>) -> Self {\n            self.source = Some(source.into());\n            self\n        }\n\n        /// Sets the error source.\n        pub fn set_source(&mut self, source: Option<E>) -> &mut Self {\n            self.source = source;\n            self\n        }\n\n        /// Sets the raw response.\n        pub fn raw(mut self, raw: R) -> Self {\n            self.raw = Some(raw);\n            self\n        }\n\n        /// Sets the raw response.\n        pub fn set_raw(&mut self, raw: Option<R>) -> &mut Self {\n            self.raw = raw;\n            self\n        }\n\n        /// Builds the error context.\n        pub fn build(self) -> ServiceError<E, R> {\n            ServiceError {\n                source: self.source.expect(\"source is required\"),\n                raw: self.raw.expect(\"a raw response is required\"),\n            }\n        }\n    }\n}\n\n/// Error context for [`SdkError::ConstructionFailure`]\n#[derive(Debug)]\npub struct ConstructionFailure {\n    pub(crate) source: BoxError,\n}\n\nimpl ConstructionFailure {\n    /// Creates a builder for this error context type.\n    pub fn builder() -> builders::ConstructionFailureBuilder {\n        builders::ConstructionFailureBuilder::new()\n    }\n}\n\n/// Error context for [`SdkError::TimeoutError`]\n#[derive(Debug)]\npub struct TimeoutError {\n    source: BoxError,\n}\n\nimpl TimeoutError {\n    /// Creates a builder for this error context type.\n    pub fn builder() -> builders::TimeoutErrorBuilder {\n        builders::TimeoutErrorBuilder::new()\n    }\n}\n\n/// Error context for [`SdkError::DispatchFailure`]\n#[derive(Debug)]\npub struct DispatchFailure {\n    source: ConnectorError,\n}\n\nimpl DispatchFailure {\n    /// Creates a builder for this error context type.\n    pub fn builder() -> builders::DispatchFailureBuilder {\n        builders::DispatchFailureBuilder::new()\n    }\n\n    /// Returns true if the error is an IO error\n    pub fn is_io(&self) -> bool {\n        self.source.is_io()\n    }\n\n    /// Returns true if the error is an timeout error\n    pub fn is_timeout(&self) -> bool {\n        self.source.is_timeout()\n    }\n\n    /// Returns true if the error is a user-caused error (e.g., invalid HTTP request)\n    pub fn is_user(&self) -> bool {\n        self.source.is_user()\n    }\n\n    /// Returns true if the error is an unclassified error.\n    pub fn is_other(&self) -> bool {\n        self.source.is_other()\n    }\n\n    /// Returns the optional error kind associated with an unclassified error\n    pub fn as_other(&self) -> Option<ErrorKind> {\n        self.source.as_other()\n    }\n\n    /// Returns the inner error if it is a connector error\n    pub fn as_connector_error(&self) -> Option<&ConnectorError> {\n        Some(&self.source)\n    }\n}\n\n/// Error context for [`SdkError::ResponseError`]\n#[derive(Debug)]\npub struct ResponseError<R> {\n    /// Error encountered while parsing the response\n    source: BoxError,\n    /// Raw response that was available\n    raw: R,\n}\n\nimpl<R> ResponseError<R> {\n    /// Creates a builder for this error context type.\n    pub fn builder() -> builders::ResponseErrorBuilder<R> {\n        builders::ResponseErrorBuilder::new()\n    }\n\n    /// Returns a reference to the raw response\n    pub fn raw(&self) -> &R {\n        &self.raw\n    }\n\n    /// Converts this error context into the raw response\n    pub fn into_raw(self) -> R {\n        self.raw\n    }\n}\n\n/// Error context for [`SdkError::ServiceError`]\n#[derive(Debug)]\npub struct ServiceError<E, R> {\n    /// Modeled service error\n    source: E,\n    /// Raw response from the service\n    raw: R,\n}\n\nimpl<E, R> ServiceError<E, R> {\n    /// Creates a builder for this error context type.\n    pub fn builder() -> builders::ServiceErrorBuilder<E, R> {\n        builders::ServiceErrorBuilder::new()\n    }\n\n    /// Returns the underlying error of type `E`\n    pub fn err(&self) -> &E {\n        &self.source\n    }\n\n    /// Converts this error context into the underlying error `E`\n    pub fn into_err(self) -> E {\n        self.source\n    }\n\n    /// Returns a reference to the raw response\n    pub fn raw(&self) -> &R {\n        &self.raw\n    }\n\n    /// Converts this error context into the raw response\n    pub fn into_raw(self) -> R {\n        self.raw\n    }\n}\n\n/// Constructs the unhandled variant of a code generated error.\n///\n/// This trait exists so that [`SdkError::into_service_error`] can be infallible.\npub trait CreateUnhandledError {\n    /// Creates an unhandled error variant with the given `source` and error metadata.\n    fn create_unhandled_error(\n        source: Box<dyn Error + Send + Sync + 'static>,\n        meta: Option<ErrorMetadata>,\n    ) -> Self;\n}\n\n/// Failed SDK Result\n///\n/// When logging an error from the SDK, it is recommended that you either wrap the error in\n/// [`DisplayErrorContext`](aws_smithy_types::error::display::DisplayErrorContext), use another\n/// error reporter library that visits the error's cause/source chain, or call\n/// [`Error::source`] for more details about the underlying cause.\n#[non_exhaustive]\n#[derive(Debug)]\npub enum SdkError<E, R> {\n    /// The request failed during construction. It was not dispatched over the network.\n    ConstructionFailure(ConstructionFailure),\n\n    /// The request failed due to a timeout. The request MAY have been sent and received.\n    TimeoutError(TimeoutError),\n\n    /// The request failed during dispatch. An HTTP response was not received. The request MAY\n    /// have been sent.\n    DispatchFailure(DispatchFailure),\n\n    /// A response was received but it was not parseable according the the protocol (for example\n    /// the server hung up without sending a complete response)\n    ResponseError(ResponseError<R>),\n\n    /// An error response was received from the service\n    ServiceError(ServiceError<E, R>),\n}\n\nimpl<E, R> SdkError<E, R> {\n    /// Construct a `SdkError` for a construction failure\n    pub fn construction_failure(source: impl Into<BoxError>) -> Self {\n        Self::ConstructionFailure(ConstructionFailure {\n            source: source.into(),\n        })\n    }\n\n    /// Construct a `SdkError` for a timeout\n    pub fn timeout_error(source: impl Into<BoxError>) -> Self {\n        Self::TimeoutError(TimeoutError {\n            source: source.into(),\n        })\n    }\n\n    /// Construct a `SdkError` for a dispatch failure with a [`ConnectorError`]\n    pub fn dispatch_failure(source: ConnectorError) -> Self {\n        Self::DispatchFailure(DispatchFailure { source })\n    }\n\n    /// Construct a `SdkError` for a response error\n    pub fn response_error(source: impl Into<BoxError>, raw: R) -> Self {\n        Self::ResponseError(ResponseError {\n            source: source.into(),\n            raw,\n        })\n    }\n\n    /// Construct a `SdkError` for a service failure\n    pub fn service_error(source: E, raw: R) -> Self {\n        Self::ServiceError(ServiceError { source, raw })\n    }\n\n    /// Returns the underlying service error `E` if there is one\n    ///\n    /// If the `SdkError` is not a `ServiceError` (for example, the error is a network timeout),\n    /// then it will be converted into an unhandled variant of `E`. This makes it easy to match\n    /// on the service's error response while simultaneously bubbling up transient failures.\n    /// For example, handling the `NoSuchKey` error for S3's `GetObject` operation may look as\n    /// follows:\n    ///\n    /// ```no_run\n    /// # use aws_smithy_runtime_api::client::result::{SdkError, CreateUnhandledError};\n    /// # #[derive(Debug)] enum GetObjectError { NoSuchKey(()), Other(()) }\n    /// # impl std::fmt::Display for GetObjectError {\n    /// #     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { unimplemented!() }\n    /// # }\n    /// # impl std::error::Error for GetObjectError {}\n    /// # impl CreateUnhandledError for GetObjectError {\n    /// #     fn create_unhandled_error(\n    /// #         _: Box<dyn std::error::Error + Send + Sync + 'static>,\n    /// #         _: Option<aws_smithy_types::error::ErrorMetadata>,\n    /// #     ) -> Self { unimplemented!() }\n    /// # }\n    /// # fn example() -> Result<(), GetObjectError> {\n    /// # let sdk_err = SdkError::service_error(GetObjectError::NoSuchKey(()), ());\n    /// match sdk_err.into_service_error() {\n    ///     GetObjectError::NoSuchKey(_) => {\n    ///         // handle NoSuchKey\n    ///     }\n    ///     err @ _ => return Err(err),\n    /// }\n    /// # Ok(())\n    /// # }\n    /// ```\n    pub fn into_service_error(self) -> E\n    where\n        E: std::error::Error + Send + Sync + CreateUnhandledError + 'static,\n        R: Debug + Send + Sync + 'static,\n    {\n        match self {\n            Self::ServiceError(context) => context.source,\n            _ => E::create_unhandled_error(self.into(), None),\n        }\n    }\n\n    /// Returns a reference underlying service error `E` if there is one\n    ///\n    /// # Examples\n    /// ```no_run\n    /// # use aws_smithy_runtime_api::client::result::SdkError;\n    /// # #[derive(Debug)] enum GetObjectError { NoSuchKey(()), Other(()) }\n    /// # impl std::fmt::Display for GetObjectError {\n    /// #     fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { unimplemented!() }\n    /// # }\n    /// # impl std::error::Error for GetObjectError {}\n    /// # impl GetObjectError {\n    /// #   fn is_not_found(&self) -> bool { true }\n    /// # }\n    /// # fn example() -> Result<(), GetObjectError> {\n    /// # let sdk_err = SdkError::service_error(GetObjectError::NoSuchKey(()), ());\n    /// if sdk_err.as_service_error().map(|e|e.is_not_found()) == Some(true) {\n    ///     println!(\"the object doesn't exist\");\n    ///     // return None, or handle this error specifically\n    /// }\n    /// // ... handle other error cases, happy path, etc.\n    /// # Ok(())\n    /// # }\n    /// ```\n    pub fn as_service_error(&self) -> Option<&E> {\n        match self {\n            Self::ServiceError(err) => Some(&err.source),\n            _ => None,\n        }\n    }\n\n    /// Converts this error into its error source.\n    ///\n    /// If there is no error source, then `Err(Self)` is returned.\n    pub fn into_source(self) -> Result<Box<dyn Error + Send + Sync + 'static>, Self>\n    where\n        E: std::error::Error + Send + Sync + 'static,\n    {\n        match self {\n            SdkError::ConstructionFailure(context) => Ok(context.source),\n            SdkError::TimeoutError(context) => Ok(context.source),\n            SdkError::ResponseError(context) => Ok(context.source),\n            SdkError::DispatchFailure(context) => Ok(context.source.into()),\n            SdkError::ServiceError(context) => Ok(context.source.into()),\n        }\n    }\n\n    /// Return a reference to this error's raw response, if it contains one. Otherwise, return `None`.\n    pub fn raw_response(&self) -> Option<&R> {\n        match self {\n            SdkError::ServiceError(inner) => Some(inner.raw()),\n            SdkError::ResponseError(inner) => Some(inner.raw()),\n            _ => None,\n        }\n    }\n\n    /// Maps the service error type in `SdkError::ServiceError`\n    pub fn map_service_error<E2>(self, map: impl FnOnce(E) -> E2) -> SdkError<E2, R> {\n        match self {\n            SdkError::ServiceError(context) => SdkError::<E2, R>::ServiceError(ServiceError {\n                source: map(context.source),\n                raw: context.raw,\n            }),\n            SdkError::ConstructionFailure(context) => {\n                SdkError::<E2, R>::ConstructionFailure(context)\n            }\n            SdkError::DispatchFailure(context) => SdkError::<E2, R>::DispatchFailure(context),\n            SdkError::ResponseError(context) => SdkError::<E2, R>::ResponseError(context),\n            SdkError::TimeoutError(context) => SdkError::<E2, R>::TimeoutError(context),\n        }\n    }\n}\n\nimpl<E, R> Display for SdkError<E, R> {\n    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {\n        match self {\n            SdkError::ConstructionFailure(_) => write!(f, \"failed to construct request\"),\n            SdkError::TimeoutError(_) => write!(f, \"request has timed out\"),\n            SdkError::DispatchFailure(_) => write!(f, \"dispatch failure\"),\n            SdkError::ResponseError(_) => write!(f, \"response error\"),\n            SdkError::ServiceError(_) => write!(f, \"service error\"),\n        }\n    }\n}\n\nimpl<E, R> Error for SdkError<E, R>\nwhere\n    E: Error + 'static,\n    R: Debug,\n{\n    fn source(&self) -> Option<&(dyn Error + 'static)> {\n        match self {\n            SdkError::ConstructionFailure(context) => Some(context.source.as_ref()),\n            SdkError::TimeoutError(context) => Some(context.source.as_ref()),\n            SdkError::ResponseError(context) => Some(context.source.as_ref()),\n            SdkError::DispatchFailure(context) => Some(&context.source),\n            SdkError::ServiceError(context) => Some(&context.source),\n        }\n    }\n}\n\nimpl<E, R> From<BuildError> for SdkError<E, R> {\n    fn from(value: BuildError) -> Self {\n        SdkError::ConstructionFailure(ConstructionFailure::builder().source(value).build())\n    }\n}\n\nimpl<E, R> ProvideErrorMetadata for SdkError<E, R>\nwhere\n    E: ProvideErrorMetadata,\n{\n    fn meta(&self) -> &aws_smithy_types::error::ErrorMetadata {\n        match self {\n            SdkError::ConstructionFailure(_) => &EMPTY_ERROR_METADATA,\n            SdkError::TimeoutError(_) => &EMPTY_ERROR_METADATA,\n            SdkError::DispatchFailure(_) => &EMPTY_ERROR_METADATA,\n            SdkError::ResponseError(_) => &EMPTY_ERROR_METADATA,\n            SdkError::ServiceError(err) => err.source.meta(),\n        }\n    }\n}\n\n#[derive(Debug)]\nenum ConnectorErrorKind {\n    /// A timeout occurred while processing the request\n    Timeout,\n\n    /// A user-caused error (e.g., invalid HTTP request)\n    User,\n\n    /// Socket/IO error\n    Io,\n\n    /// An unclassified Error with an explicit error kind\n    Other(Option<ErrorKind>),\n}\n\n/// Error from the underlying Connector\n///\n/// Connector exists to attach a `ConnectorErrorKind` to what would otherwise be an opaque `Box<dyn Error>`\n/// that comes off a potentially generic or dynamic connector.\n/// The attached `kind` is used to determine what retry behavior should occur (if any) based on the\n/// connector error.\n#[derive(Debug)]\npub struct ConnectorError {\n    kind: ConnectorErrorKind,\n    source: BoxError,\n    connection: ConnectionStatus,\n}\n\n#[non_exhaustive]\n#[derive(Debug)]\npub(crate) enum ConnectionStatus {\n    /// This request was never connected to the remote\n    ///\n    /// This indicates the failure was during connection establishment\n    NeverConnected,\n\n    /// It is unknown whether a connection was established\n    Unknown,\n\n    /// The request connected to the remote prior to failure\n    Connected(ConnectionMetadata),\n}\n\nimpl Display for ConnectorError {\n    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {\n        match self.kind {\n            ConnectorErrorKind::Timeout => write!(f, \"timeout\"),\n            ConnectorErrorKind::User => write!(f, \"user error\"),\n            ConnectorErrorKind::Io => write!(f, \"io error\"),\n            ConnectorErrorKind::Other(_) => write!(f, \"other\"),\n        }\n    }\n}\n\nimpl Error for ConnectorError {\n    fn source(&self) -> Option<&(dyn Error + 'static)> {\n        Some(self.source.as_ref())\n    }\n}\n\nimpl ConnectorError {\n    /// Construct a [`ConnectorError`] from an error caused by a timeout\n    ///\n    /// Timeout errors are typically retried on a new connection.\n    pub fn timeout(source: BoxError) -> Self {\n        Self {\n            kind: ConnectorErrorKind::Timeout,\n            source,\n            connection: ConnectionStatus::Unknown,\n        }\n    }\n\n    /// Include connection information along with this error\n    pub fn with_connection(mut self, info: ConnectionMetadata) -> Self {\n        self.connection = ConnectionStatus::Connected(info);\n        self\n    }\n\n    /// Set the connection status on this error to report that a connection was never established\n    pub fn never_connected(mut self) -> Self {\n        self.connection = ConnectionStatus::NeverConnected;\n        self\n    }\n\n    /// Construct a [`ConnectorError`] from an error caused by the user (e.g. invalid HTTP request)\n    pub fn user(source: BoxError) -> Self {\n        Self {\n            kind: ConnectorErrorKind::User,\n            source,\n            connection: ConnectionStatus::Unknown,\n        }\n    }\n\n    /// Construct a [`ConnectorError`] from an IO related error (e.g. socket hangup)\n    pub fn io(source: BoxError) -> Self {\n        Self {\n            kind: ConnectorErrorKind::Io,\n            source,\n            connection: ConnectionStatus::Unknown,\n        }\n    }\n\n    /// Construct a [`ConnectorError`] from an different unclassified error.\n    ///\n    /// Optionally, an explicit `Kind` may be passed.\n    pub fn other(source: BoxError, kind: Option<ErrorKind>) -> Self {\n        Self {\n            source,\n            kind: ConnectorErrorKind::Other(kind),\n            connection: ConnectionStatus::Unknown,\n        }\n    }\n\n    /// Returns true if the error is an IO error\n    pub fn is_io(&self) -> bool {\n        matches!(self.kind, ConnectorErrorKind::Io)\n    }\n\n    /// Returns true if the error is an timeout error\n    pub fn is_timeout(&self) -> bool {\n        matches!(self.kind, ConnectorErrorKind::Timeout)\n    }\n\n    /// Returns true if the error is a user-caused error (e.g., invalid HTTP request)\n    pub fn is_user(&self) -> bool {\n        matches!(self.kind, ConnectorErrorKind::User)\n    }\n\n    /// Returns true if the error is an unclassified error.\n    pub fn is_other(&self) -> bool {\n        matches!(self.kind, ConnectorErrorKind::Other(..))\n    }\n\n    /// Returns the optional error kind associated with an unclassified error\n    pub fn as_other(&self) -> Option<ErrorKind> {\n        match &self.kind {\n            ConnectorErrorKind::Other(ek) => *ek,\n            _ => None,\n        }\n    }\n\n    /// Grants ownership of this error's source.\n    pub fn into_source(self) -> BoxError {\n        self.source\n    }\n\n    /// Returns metadata about the connection\n    ///\n    /// If a connection was established and provided by the internal connector, a connection will\n    /// be returned.\n    pub fn connection_metadata(&self) -> Option<&ConnectionMetadata> {\n        match &self.connection {\n            ConnectionStatus::NeverConnected => None,\n            ConnectionStatus::Unknown => None,\n            ConnectionStatus::Connected(conn) => Some(conn),\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime-api/src/client/retries/classifiers.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Classifiers for determining if a retry is necessary and related code.\n//!\n//! When a request fails, a retry strategy should inspect the result with retry\n//! classifiers to understand if and how the request should be retried.\n//!\n//! Because multiple classifiers are often used, and because some are more\n//! specific than others in what they identify as retryable, classifiers are\n//! run in a sequence that is determined by their priority.\n//!\n//! Classifiers that are higher priority are run **after** classifiers\n//! with a lower priority. The intention is that:\n//!\n//! 1. Generic classifiers that look at things like the HTTP error code run\n//!    first.\n//! 2. More specific classifiers such as ones that check for certain error\n//!    messages are run **after** the generic classifiers. This gives them the\n//!    ability to override the actions set by the generic retry classifiers.\n//!\n//! Put another way:\n//!\n//! | large nets target common failures with basic behavior | run before            | small nets target specific failures with special behavior|\n//! |-------------------------------------------------------|-----------------------|----------------------------------------------------------|\n//! | low priority classifiers                              | results overridden by | high priority classifiers                                |\n\nuse crate::box_error::BoxError;\nuse crate::client::interceptors::context::InterceptorContext;\nuse crate::client::runtime_components::sealed::ValidateConfig;\nuse crate::client::runtime_components::RuntimeComponents;\nuse crate::impl_shared_conversions;\nuse aws_smithy_types::config_bag::ConfigBag;\nuse aws_smithy_types::retry::ErrorKind;\nuse std::fmt;\nuse std::sync::Arc;\nuse std::time::Duration;\n\n/// The result of running a [`ClassifyRetry`] on a [`InterceptorContext`].\n#[non_exhaustive]\n#[derive(Clone, Eq, PartialEq, Debug, Default)]\npub enum RetryAction {\n    /// When a classifier can't run or has no opinion, this action is returned.\n    ///\n    /// For example, if a classifier requires a parsed response and response parsing failed,\n    /// this action is returned. If all classifiers return this action, no retry should be\n    /// attempted.\n    #[default]\n    NoActionIndicated,\n    /// When a classifier runs and thinks a response should be retried, this action is returned.\n    RetryIndicated(RetryReason),\n    /// When a classifier runs and decides a response must not be retried, this action is returned.\n    ///\n    /// This action stops retry classification immediately, skipping any following classifiers.\n    RetryForbidden,\n}\n\nimpl fmt::Display for RetryAction {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        match self {\n            Self::NoActionIndicated => write!(f, \"no action indicated\"),\n            Self::RetryForbidden => write!(f, \"retry forbidden\"),\n            Self::RetryIndicated(reason) => write!(f, \"retry {reason}\"),\n        }\n    }\n}\n\nimpl RetryAction {\n    /// Create a new `RetryAction` indicating that a retry is necessary.\n    pub fn retryable_error(kind: ErrorKind) -> Self {\n        Self::RetryIndicated(RetryReason::RetryableError {\n            kind,\n            retry_after: None,\n        })\n    }\n\n    /// Create a new `RetryAction` indicating that a retry is necessary after an explicit delay.\n    pub fn retryable_error_with_explicit_delay(kind: ErrorKind, retry_after: Duration) -> Self {\n        Self::RetryIndicated(RetryReason::RetryableError {\n            kind,\n            retry_after: Some(retry_after),\n        })\n    }\n\n    /// Create a new `RetryAction` indicating that a retry is necessary because of a transient error.\n    pub fn transient_error() -> Self {\n        Self::retryable_error(ErrorKind::TransientError)\n    }\n\n    /// Create a new `RetryAction` indicating that a retry is necessary because of a throttling error.\n    pub fn throttling_error() -> Self {\n        Self::retryable_error(ErrorKind::ThrottlingError)\n    }\n\n    /// Create a new `RetryAction` indicating that a retry is necessary because of a server error.\n    pub fn server_error() -> Self {\n        Self::retryable_error(ErrorKind::ServerError)\n    }\n\n    /// Create a new `RetryAction` indicating that a retry is necessary because of a client error.\n    pub fn client_error() -> Self {\n        Self::retryable_error(ErrorKind::ClientError)\n    }\n\n    /// Check if a retry is indicated.\n    pub fn should_retry(&self) -> bool {\n        match self {\n            Self::NoActionIndicated | Self::RetryForbidden => false,\n            Self::RetryIndicated(_) => true,\n        }\n    }\n}\n\n/// The reason for a retry.\n#[non_exhaustive]\n#[derive(Clone, Eq, PartialEq, Debug)]\npub enum RetryReason {\n    /// When an error is received that should be retried, this reason is returned.\n    RetryableError {\n        /// The kind of error.\n        kind: ErrorKind,\n        /// A server may tell us to retry only after a specific time has elapsed.\n        retry_after: Option<Duration>,\n    },\n}\n\nimpl fmt::Display for RetryReason {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        match self {\n            Self::RetryableError { kind, retry_after } => {\n                let after = retry_after\n                    .map(|d| format!(\" after {d:?}\"))\n                    .unwrap_or_default();\n                write!(f, \"{kind} error{after}\")\n            }\n        }\n    }\n}\n\n/// The priority of a retry classifier. Classifiers with a higher priority will\n/// run **after** classifiers with a lower priority and may override their\n/// result. Classifiers with equal priorities make no guarantees about which\n/// will run first.\n#[derive(Debug, Clone, Copy, PartialEq, Eq)]\npub struct RetryClassifierPriority {\n    inner: Inner,\n}\n\n#[derive(Debug, Clone, Copy, PartialEq, Eq)]\nenum Inner {\n    /// The default priority for the `HttpStatusCodeClassifier`.\n    HttpStatusCodeClassifier,\n    /// The default priority for the `ModeledAsRetryableClassifier`.\n    ModeledAsRetryableClassifier,\n    /// The default priority for the `TransientErrorClassifier`.\n    TransientErrorClassifier,\n    /// The priority of some other classifier.\n    Other(i8),\n}\n\nimpl PartialOrd for RetryClassifierPriority {\n    fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering> {\n        Some(self.cmp(other))\n    }\n}\n\nimpl Ord for RetryClassifierPriority {\n    fn cmp(&self, other: &Self) -> std::cmp::Ordering {\n        self.as_i8().cmp(&other.as_i8())\n    }\n}\n\nimpl RetryClassifierPriority {\n    /// Create a new `RetryClassifierPriority` with the default priority for the `HttpStatusCodeClassifier`.\n    pub fn http_status_code_classifier() -> Self {\n        Self {\n            inner: Inner::HttpStatusCodeClassifier,\n        }\n    }\n\n    /// Create a new `RetryClassifierPriority` with the default priority for the `ModeledAsRetryableClassifier`.\n    pub fn modeled_as_retryable_classifier() -> Self {\n        Self {\n            inner: Inner::ModeledAsRetryableClassifier,\n        }\n    }\n\n    /// Create a new `RetryClassifierPriority` with the default priority for the `TransientErrorClassifier`.\n    pub fn transient_error_classifier() -> Self {\n        Self {\n            inner: Inner::TransientErrorClassifier,\n        }\n    }\n\n    #[deprecated = \"use the less-confusingly-named `RetryClassifierPriority::run_before` instead\"]\n    /// Create a new `RetryClassifierPriority` with lower priority than the given priority.\n    pub fn with_lower_priority_than(other: Self) -> Self {\n        Self::run_before(other)\n    }\n\n    /// Create a new `RetryClassifierPriority` that can be overridden by the given priority.\n    ///\n    /// Retry classifiers are run in order from lowest to highest priority. A classifier that\n    /// runs later can override a decision from a classifier that runs earlier.\n    pub fn run_before(other: Self) -> Self {\n        Self {\n            inner: Inner::Other(other.as_i8() - 1),\n        }\n    }\n\n    #[deprecated = \"use the less-confusingly-named `RetryClassifierPriority::run_after` instead\"]\n    /// Create a new `RetryClassifierPriority` with higher priority than the given priority.\n    pub fn with_higher_priority_than(other: Self) -> Self {\n        Self::run_after(other)\n    }\n\n    /// Create a new `RetryClassifierPriority` that can override the given priority.\n    ///\n    /// Retry classifiers are run in order from lowest to highest priority. A classifier that\n    /// runs later can override a decision from a classifier that runs earlier.\n    pub fn run_after(other: Self) -> Self {\n        Self {\n            inner: Inner::Other(other.as_i8() + 1),\n        }\n    }\n\n    fn as_i8(&self) -> i8 {\n        match self.inner {\n            Inner::HttpStatusCodeClassifier => 0,\n            Inner::ModeledAsRetryableClassifier => 10,\n            Inner::TransientErrorClassifier => 20,\n            Inner::Other(i) => i,\n        }\n    }\n}\n\nimpl Default for RetryClassifierPriority {\n    fn default() -> Self {\n        Self {\n            inner: Inner::Other(0),\n        }\n    }\n}\n\n/// Classifies what kind of retry is needed for a given [`InterceptorContext`].\npub trait ClassifyRetry: Send + Sync + fmt::Debug {\n    /// Run this classifier on the [`InterceptorContext`] to determine if the previous request\n    /// should be retried. Returns a [`RetryAction`].\n    fn classify_retry(&self, ctx: &InterceptorContext) -> RetryAction;\n\n    /// The name of this retry classifier.\n    ///\n    /// Used for debugging purposes.\n    fn name(&self) -> &'static str;\n\n    /// The priority of this retry classifier.\n    ///\n    /// Classifiers with a higher priority will override the\n    /// results of classifiers with a lower priority. Classifiers with equal priorities make no\n    /// guarantees about which will override the other.\n    ///\n    /// Retry classifiers are run in order of increasing priority. Any decision\n    /// (return value other than `NoActionIndicated`) from a higher priority\n    /// classifier will override the decision of a lower priority classifier with one exception:\n    /// [`RetryAction::RetryForbidden`] is treated differently: If ANY classifier returns `RetryForbidden`,\n    /// this request will not be retried.\n    fn priority(&self) -> RetryClassifierPriority {\n        RetryClassifierPriority::default()\n    }\n}\n\nimpl_shared_conversions!(convert SharedRetryClassifier from ClassifyRetry using SharedRetryClassifier::new);\n\n#[derive(Debug, Clone)]\n/// Retry classifier used by the retry strategy to classify responses as retryable or not.\npub struct SharedRetryClassifier(Arc<dyn ClassifyRetry>);\n\nimpl SharedRetryClassifier {\n    /// Given a [`ClassifyRetry`] trait object, create a new `SharedRetryClassifier`.\n    pub fn new(retry_classifier: impl ClassifyRetry + 'static) -> Self {\n        Self(Arc::new(retry_classifier))\n    }\n}\n\nimpl ClassifyRetry for SharedRetryClassifier {\n    fn classify_retry(&self, ctx: &InterceptorContext) -> RetryAction {\n        self.0.classify_retry(ctx)\n    }\n\n    fn name(&self) -> &'static str {\n        self.0.name()\n    }\n\n    fn priority(&self) -> RetryClassifierPriority {\n        self.0.priority()\n    }\n}\n\nimpl ValidateConfig for SharedRetryClassifier {\n    fn validate_final_config(\n        &self,\n        _runtime_components: &RuntimeComponents,\n        _cfg: &ConfigBag,\n    ) -> Result<(), BoxError> {\n        #[cfg(debug_assertions)]\n        {\n            // Because this is validating that the implementation is correct rather\n            // than validating user input, we only want to run this in debug builds.\n            let retry_classifiers = _runtime_components.retry_classifiers_slice();\n            let out_of_order: Vec<_> = retry_classifiers\n                .windows(2)\n                .filter(|&w| w[0].value().priority() > w[1].value().priority())\n                .collect();\n\n            if !out_of_order.is_empty() {\n                return Err(\"retry classifiers are mis-ordered; this is a bug\".into());\n            }\n        }\n        Ok(())\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::{ClassifyRetry, RetryAction, RetryClassifierPriority, SharedRetryClassifier};\n    use crate::client::interceptors::context::InterceptorContext;\n\n    #[test]\n    fn test_preset_priorities() {\n        let before_modeled_as_retryable = RetryClassifierPriority::run_before(\n            RetryClassifierPriority::modeled_as_retryable_classifier(),\n        );\n        let mut list = vec![\n            RetryClassifierPriority::modeled_as_retryable_classifier(),\n            RetryClassifierPriority::http_status_code_classifier(),\n            RetryClassifierPriority::transient_error_classifier(),\n            before_modeled_as_retryable,\n        ];\n        list.sort();\n\n        assert_eq!(\n            vec![\n                RetryClassifierPriority::http_status_code_classifier(),\n                before_modeled_as_retryable,\n                RetryClassifierPriority::modeled_as_retryable_classifier(),\n                RetryClassifierPriority::transient_error_classifier(),\n            ],\n            list\n        );\n    }\n\n    #[test]\n    fn test_classifier_run_before() {\n        // Ensure low-priority classifiers run *before* high-priority classifiers.\n        let high_priority_classifier = RetryClassifierPriority::default();\n        let mid_priority_classifier = RetryClassifierPriority::run_before(high_priority_classifier);\n        let low_priority_classifier = RetryClassifierPriority::run_before(mid_priority_classifier);\n\n        let mut list = vec![\n            mid_priority_classifier,\n            high_priority_classifier,\n            low_priority_classifier,\n        ];\n        list.sort();\n\n        assert_eq!(\n            vec![\n                low_priority_classifier,\n                mid_priority_classifier,\n                high_priority_classifier\n            ],\n            list\n        );\n    }\n\n    #[test]\n    fn test_classifier_run_after() {\n        // Ensure high-priority classifiers run *after* low-priority classifiers.\n        let low_priority_classifier = RetryClassifierPriority::default();\n        let mid_priority_classifier = RetryClassifierPriority::run_after(low_priority_classifier);\n        let high_priority_classifier = RetryClassifierPriority::run_after(mid_priority_classifier);\n\n        let mut list = vec![\n            mid_priority_classifier,\n            low_priority_classifier,\n            high_priority_classifier,\n        ];\n        list.sort();\n\n        assert_eq!(\n            vec![\n                low_priority_classifier,\n                mid_priority_classifier,\n                high_priority_classifier\n            ],\n            list\n        );\n    }\n\n    #[derive(Debug)]\n    struct ClassifierStub {\n        name: &'static str,\n        priority: RetryClassifierPriority,\n    }\n\n    impl ClassifyRetry for ClassifierStub {\n        fn classify_retry(&self, _ctx: &InterceptorContext) -> RetryAction {\n            todo!()\n        }\n\n        fn name(&self) -> &'static str {\n            self.name\n        }\n\n        fn priority(&self) -> RetryClassifierPriority {\n            self.priority\n        }\n    }\n\n    fn wrap(name: &'static str, priority: RetryClassifierPriority) -> SharedRetryClassifier {\n        SharedRetryClassifier::new(ClassifierStub { name, priority })\n    }\n\n    #[test]\n    fn test_shared_classifier_run_before() {\n        // Ensure low-priority classifiers run *before* high-priority classifiers,\n        // even after wrapping.\n        let high_priority_classifier = RetryClassifierPriority::default();\n        let mid_priority_classifier = RetryClassifierPriority::run_before(high_priority_classifier);\n        let low_priority_classifier = RetryClassifierPriority::run_before(mid_priority_classifier);\n\n        let mut list = [\n            wrap(\"mid\", mid_priority_classifier),\n            wrap(\"high\", high_priority_classifier),\n            wrap(\"low\", low_priority_classifier),\n        ];\n        list.sort_by_key(|rc| rc.priority());\n\n        let actual: Vec<_> = list.iter().map(|it| it.name()).collect();\n        assert_eq!(vec![\"low\", \"mid\", \"high\"], actual);\n    }\n\n    #[test]\n    fn test_shared_classifier_run_after() {\n        // Ensure high-priority classifiers run *after* low-priority classifiers,\n        // even after wrapping.\n        let low_priority_classifier = RetryClassifierPriority::default();\n        let mid_priority_classifier = RetryClassifierPriority::run_after(low_priority_classifier);\n        let high_priority_classifier = RetryClassifierPriority::run_after(mid_priority_classifier);\n\n        let mut list = [\n            wrap(\"mid\", mid_priority_classifier),\n            wrap(\"high\", high_priority_classifier),\n            wrap(\"low\", low_priority_classifier),\n        ];\n        list.sort_by_key(|rc| rc.priority());\n\n        let actual: Vec<_> = list.iter().map(|it| it.name()).collect();\n        assert_eq!(vec![\"low\", \"mid\", \"high\"], actual);\n    }\n\n    #[test]\n    fn test_shared_preset_priorities() {\n        let before_modeled_as_retryable = RetryClassifierPriority::run_before(\n            RetryClassifierPriority::modeled_as_retryable_classifier(),\n        );\n        let mut list = [\n            wrap(\n                \"modeled as retryable\",\n                RetryClassifierPriority::modeled_as_retryable_classifier(),\n            ),\n            wrap(\n                \"http status code\",\n                RetryClassifierPriority::http_status_code_classifier(),\n            ),\n            wrap(\n                \"transient error\",\n                RetryClassifierPriority::transient_error_classifier(),\n            ),\n            wrap(\"before 'modeled as retryable'\", before_modeled_as_retryable),\n        ];\n        list.sort_by_key(|rc| rc.priority());\n\n        let actual: Vec<_> = list.iter().map(|it| it.name()).collect();\n        assert_eq!(\n            vec![\n                \"http status code\",\n                \"before 'modeled as retryable'\",\n                \"modeled as retryable\",\n                \"transient error\"\n            ],\n            actual\n        );\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime-api/src/client/retries.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Retry handling and token bucket.\n//!\n//! This code defines when and how failed requests should be retried. It also defines the behavior\n//! used to limit the rate that requests are sent.\n\npub mod classifiers;\n\nuse crate::box_error::BoxError;\nuse crate::client::interceptors::context::InterceptorContext;\nuse crate::client::runtime_components::sealed::ValidateConfig;\nuse crate::client::runtime_components::RuntimeComponents;\nuse aws_smithy_types::config_bag::{ConfigBag, Storable, StoreReplace};\nuse std::fmt;\nuse std::sync::Arc;\nuse std::time::Duration;\n\nuse crate::impl_shared_conversions;\npub use aws_smithy_types::retry::ErrorKind;\n#[cfg(feature = \"test-util\")]\npub use test_util::AlwaysRetry;\n\n#[derive(Debug, Clone, PartialEq, Eq)]\n/// An answer to the question \"should I make a request attempt?\"\npub enum ShouldAttempt {\n    /// Yes, an attempt should be made\n    Yes,\n    /// No, no attempt should be made\n    No,\n    /// Yes, an attempt should be made, but only after the given amount of time has passed\n    YesAfterDelay(Duration),\n}\n\n#[cfg(feature = \"test-util\")]\nimpl ShouldAttempt {\n    /// Returns the delay duration if this is a `YesAfterDelay` variant.\n    pub fn expect_delay(self) -> Duration {\n        match self {\n            ShouldAttempt::YesAfterDelay(delay) => delay,\n            _ => panic!(\"Expected this to be the `YesAfterDelay` variant but it was the `{self:?}` variant instead\"),\n        }\n    }\n\n    /// If this isn't a `No` variant, panic.\n    pub fn expect_no(self) {\n        if ShouldAttempt::No == self {\n            return;\n        }\n\n        panic!(\"Expected this to be the `No` variant but it was the `{self:?}` variant instead\");\n    }\n}\n\nimpl_shared_conversions!(convert SharedRetryStrategy from RetryStrategy using SharedRetryStrategy::new);\n\n/// Decider for whether or not to attempt a request, and when.\n///\n/// The orchestrator consults the retry strategy every time before making a request.\n/// This includes the initial request, and any retry attempts thereafter. The\n/// orchestrator will retry indefinitely (until success) if the retry strategy\n/// always returns `ShouldAttempt::Yes` from `should_attempt_retry`.\npub trait RetryStrategy: Send + Sync + fmt::Debug {\n    /// Decides if the initial attempt should be made.\n    fn should_attempt_initial_request(\n        &self,\n        runtime_components: &RuntimeComponents,\n        cfg: &ConfigBag,\n    ) -> Result<ShouldAttempt, BoxError>;\n\n    /// Decides if a retry should be done.\n    ///\n    /// The previous attempt's output or error are provided in the\n    /// [`InterceptorContext`] when this is called.\n    ///\n    /// `ShouldAttempt::YesAfterDelay` can be used to add a backoff time.\n    fn should_attempt_retry(\n        &self,\n        context: &InterceptorContext,\n        runtime_components: &RuntimeComponents,\n        cfg: &ConfigBag,\n    ) -> Result<ShouldAttempt, BoxError>;\n}\n\n/// A shared retry strategy.\n#[derive(Clone, Debug)]\npub struct SharedRetryStrategy(Arc<dyn RetryStrategy>);\n\nimpl SharedRetryStrategy {\n    /// Creates a new [`SharedRetryStrategy`] from a retry strategy.\n    pub fn new(retry_strategy: impl RetryStrategy + 'static) -> Self {\n        Self(Arc::new(retry_strategy))\n    }\n}\n\nimpl RetryStrategy for SharedRetryStrategy {\n    fn should_attempt_initial_request(\n        &self,\n        runtime_components: &RuntimeComponents,\n        cfg: &ConfigBag,\n    ) -> Result<ShouldAttempt, BoxError> {\n        self.0\n            .should_attempt_initial_request(runtime_components, cfg)\n    }\n\n    fn should_attempt_retry(\n        &self,\n        context: &InterceptorContext,\n        runtime_components: &RuntimeComponents,\n        cfg: &ConfigBag,\n    ) -> Result<ShouldAttempt, BoxError> {\n        self.0\n            .should_attempt_retry(context, runtime_components, cfg)\n    }\n}\n\nimpl ValidateConfig for SharedRetryStrategy {}\n\n/// A type to track the number of requests sent by the orchestrator for a given operation.\n///\n/// `RequestAttempts` is added to the `ConfigBag` by the orchestrator,\n/// and holds the current attempt number.\n#[derive(Debug, Clone, Copy)]\npub struct RequestAttempts {\n    attempts: u32,\n}\n\nimpl RequestAttempts {\n    /// Creates a new [`RequestAttempts`] with the given number of attempts.\n    pub fn new(attempts: u32) -> Self {\n        Self { attempts }\n    }\n\n    /// Returns the number of attempts.\n    pub fn attempts(&self) -> u32 {\n        self.attempts\n    }\n}\n\nimpl From<u32> for RequestAttempts {\n    fn from(attempts: u32) -> Self {\n        Self::new(attempts)\n    }\n}\n\nimpl From<RequestAttempts> for u32 {\n    fn from(value: RequestAttempts) -> Self {\n        value.attempts()\n    }\n}\n\nimpl Storable for RequestAttempts {\n    type Storer = StoreReplace<Self>;\n}\n\n#[cfg(feature = \"test-util\")]\nmod test_util {\n    use super::ErrorKind;\n    use crate::client::interceptors::context::InterceptorContext;\n    use crate::client::retries::classifiers::{ClassifyRetry, RetryAction};\n\n    /// A retry classifier for testing purposes. This classifier always returns\n    /// `Some(RetryAction::Error(ErrorKind))` where `ErrorKind` is the value provided when creating\n    /// this classifier.\n    #[derive(Debug)]\n    pub struct AlwaysRetry(pub ErrorKind);\n\n    impl ClassifyRetry for AlwaysRetry {\n        fn classify_retry(&self, error: &InterceptorContext) -> RetryAction {\n            tracing::debug!(\"Retrying error {:?} as an {:?}\", error, self.0);\n            RetryAction::retryable_error(self.0)\n        }\n\n        fn name(&self) -> &'static str {\n            \"Always Retry\"\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime-api/src/client/runtime_components.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Runtime components used to make a request and handle a response.\n//!\n//! Runtime components are trait implementations that are _always_ used by the orchestrator.\n//! There are other trait implementations that can be configured for a client, but if they\n//! aren't directly and always used by the orchestrator, then they are placed in the\n//! [`ConfigBag`] instead of in [`RuntimeComponents`].\n\nuse crate::box_error::BoxError;\nuse crate::client::auth::{\n    AuthScheme, AuthSchemeId, ResolveAuthSchemeOptions, SharedAuthScheme,\n    SharedAuthSchemeOptionResolver,\n};\nuse crate::client::endpoint::{ResolveEndpoint, SharedEndpointResolver};\nuse crate::client::http::{HttpClient, SharedHttpClient};\nuse crate::client::identity::{\n    ResolveCachedIdentity, ResolveIdentity, SharedIdentityCache, SharedIdentityResolver,\n};\nuse crate::client::interceptors::{Intercept, SharedInterceptor};\nuse crate::client::retries::classifiers::{ClassifyRetry, SharedRetryClassifier};\nuse crate::client::retries::{RetryStrategy, SharedRetryStrategy};\nuse crate::impl_shared_conversions;\nuse crate::shared::IntoShared;\nuse aws_smithy_async::rt::sleep::{AsyncSleep, SharedAsyncSleep};\nuse aws_smithy_async::time::{SharedTimeSource, TimeSource};\nuse aws_smithy_types::config_bag::ConfigBag;\nuse std::collections::HashMap;\nuse std::fmt;\nuse std::sync::Arc;\n\npub(crate) static EMPTY_RUNTIME_COMPONENTS_BUILDER: RuntimeComponentsBuilder =\n    RuntimeComponentsBuilder::new(\"empty\");\n\npub(crate) mod sealed {\n    use super::*;\n\n    /// Validates client configuration.\n    ///\n    /// This trait can be used to validate that certain required components or config values\n    /// are available, and provide an error with helpful instructions if they are not.\n    pub trait ValidateConfig: fmt::Debug + Send + Sync {\n        #[doc = include_str!(\"../../rustdoc/validate_base_client_config.md\")]\n        fn validate_base_client_config(\n            &self,\n            runtime_components: &RuntimeComponentsBuilder,\n            cfg: &ConfigBag,\n        ) -> Result<(), BoxError> {\n            let _ = (runtime_components, cfg);\n            Ok(())\n        }\n\n        #[doc = include_str!(\"../../rustdoc/validate_final_config.md\")]\n        fn validate_final_config(\n            &self,\n            runtime_components: &RuntimeComponents,\n            cfg: &ConfigBag,\n        ) -> Result<(), BoxError> {\n            let _ = (runtime_components, cfg);\n            Ok(())\n        }\n    }\n}\nuse sealed::ValidateConfig;\n\n#[derive(Clone)]\nenum ValidatorInner {\n    BaseConfigStaticFn(fn(&RuntimeComponentsBuilder, &ConfigBag) -> Result<(), BoxError>),\n    Shared(Arc<dyn ValidateConfig>),\n}\n\nimpl fmt::Debug for ValidatorInner {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        match self {\n            Self::BaseConfigStaticFn(_) => f.debug_tuple(\"StaticFn\").finish(),\n            Self::Shared(_) => f.debug_tuple(\"Shared\").finish(),\n        }\n    }\n}\n\n/// A client config validator.\n#[derive(Clone, Debug)]\npub struct SharedConfigValidator {\n    inner: ValidatorInner,\n}\n\nimpl SharedConfigValidator {\n    /// Creates a new shared config validator.\n    pub(crate) fn new(validator: impl ValidateConfig + 'static) -> Self {\n        Self {\n            inner: ValidatorInner::Shared(Arc::new(validator) as _),\n        }\n    }\n\n    /// Creates a base client validator from a function.\n    ///\n    /// A base client validator gets called upon client construction. The full\n    /// config may not be available at this time (hence why it has\n    /// [`RuntimeComponentsBuilder`] as an argument rather than [`RuntimeComponents`]).\n    /// Any error returned from the validator function will become a panic in the\n    /// client constructor.\n    ///\n    /// # Examples\n    ///\n    /// Creating a validator function:\n    /// ```no_run\n    /// use aws_smithy_runtime_api::box_error::BoxError;\n    /// use aws_smithy_runtime_api::client::runtime_components::{\n    ///     RuntimeComponentsBuilder,\n    ///     SharedConfigValidator\n    /// };\n    /// use aws_smithy_types::config_bag::ConfigBag;\n    ///\n    /// fn my_validation(\n    ///     components: &RuntimeComponentsBuilder,\n    ///     config: &ConfigBag\n    /// ) -> Result<(), BoxError> {\n    ///     if components.sleep_impl().is_none() {\n    ///         return Err(\"I need a sleep_impl!\".into());\n    ///     }\n    ///     Ok(())\n    /// }\n    ///\n    /// let validator = SharedConfigValidator::base_client_config_fn(my_validation);\n    /// ```\n    pub fn base_client_config_fn(\n        validator: fn(&RuntimeComponentsBuilder, &ConfigBag) -> Result<(), BoxError>,\n    ) -> Self {\n        Self {\n            inner: ValidatorInner::BaseConfigStaticFn(validator),\n        }\n    }\n}\n\nimpl ValidateConfig for SharedConfigValidator {\n    fn validate_base_client_config(\n        &self,\n        runtime_components: &RuntimeComponentsBuilder,\n        cfg: &ConfigBag,\n    ) -> Result<(), BoxError> {\n        match &self.inner {\n            ValidatorInner::BaseConfigStaticFn(validator) => validator(runtime_components, cfg),\n            ValidatorInner::Shared(validator) => {\n                validator.validate_base_client_config(runtime_components, cfg)\n            }\n        }\n    }\n\n    fn validate_final_config(\n        &self,\n        runtime_components: &RuntimeComponents,\n        cfg: &ConfigBag,\n    ) -> Result<(), BoxError> {\n        match &self.inner {\n            ValidatorInner::Shared(validator) => {\n                validator.validate_final_config(runtime_components, cfg)\n            }\n            _ => Ok(()),\n        }\n    }\n}\n\nimpl_shared_conversions!(convert SharedConfigValidator from ValidateConfig using SharedConfigValidator::new);\n\n/// Internal to `declare_runtime_components!`.\n///\n/// Merges a field from one builder into another.\nmacro_rules! merge {\n    (Option $other:ident . $name:ident => $self:ident) => {\n        $self.$name = $other.$name.clone().or($self.$name.take());\n    };\n    (Vec $other:ident . $name:ident => $self:ident) => {\n        if !$other.$name.is_empty() {\n            $self.$name.extend($other.$name.iter().cloned());\n        }\n    };\n    (OptionalAuthSchemeMap $other:ident . $name:ident => $self:ident ) => {\n        if let Some(m) = &$other.$name {\n            let mut us = $self.$name.unwrap_or_default();\n            us.extend(m.iter().map(|(k, v)| (k.clone(), v.clone())));\n            $self.$name = Some(us);\n        }\n    };\n}\n/// Internal to `declare_runtime_components!`.\n///\n/// This is used when creating the builder's `build` method\n/// to populate each individual field value. The `required`/`atLeastOneRequired`\n/// validations are performed here.\nmacro_rules! builder_field_value {\n    (Option $self:ident . $name:ident) => {\n        $self.$name\n    };\n    (Option $self:ident . $name:ident required) => {\n        $self.$name.ok_or(BuildError(concat!(\n            \"the `\",\n            stringify!($name),\n            \"` runtime component is required\"\n        )))?\n    };\n    (Vec $self:ident . $name:ident) => {\n        $self.$name\n    };\n    (OptionalAuthSchemeMap $self:ident . $name:ident atLeastOneRequired) => {{\n        match $self.$name {\n            Some(map) => map,\n            None => {\n                return Err(BuildError(concat!(\n                    \"at least one `\",\n                    stringify!($name),\n                    \"` runtime component is required\"\n                )));\n            }\n        }\n    }};\n    (Vec $self:ident . $name:ident atLeastOneRequired) => {{\n        if $self.$name.is_empty() {\n            return Err(BuildError(concat!(\n                \"at least one `\",\n                stringify!($name),\n                \"` runtime component is required\"\n            )));\n        }\n        $self.$name\n    }};\n}\n/// Internal to `declare_runtime_components!`.\n///\n/// Converts the field type from `Option<T>` or `Vec<T>` into `Option<Tracked<T>>` or `Vec<Tracked<T>>` respectively.\n/// Also removes the `Option` wrapper for required fields in the non-builder struct.\nmacro_rules! runtime_component_field_type {\n    (Option $inner_type:ident) => {\n        Option<Tracked<$inner_type>>\n    };\n    (Option $inner_type:ident required) => {\n        Tracked<$inner_type>\n    };\n    (Vec $inner_type:ident) => {\n        Vec<Tracked<$inner_type>>\n    };\n    (Vec $inner_type:ident atLeastOneRequired) => {\n        Vec<Tracked<$inner_type>>\n    };\n    (OptionalAuthSchemeMap $inner_type: ident atLeastOneRequired) => { AuthSchemeMap<Tracked<$inner_type>> };\n}\n/// Internal to `declare_runtime_components!`.\n///\n/// Converts an `$outer_type` into an empty instantiation for that type.\n/// This is needed since `Default::default()` can't be used in a `const` function,\n/// and `RuntimeComponentsBuilder::new()` is `const`.\nmacro_rules! empty_builder_value {\n    (Option) => {\n        None\n    };\n    (Vec) => {\n        Vec::new()\n    };\n    (OptionalAuthSchemeMap) => {\n        None\n    };\n}\n\ntype OptionalAuthSchemeMap<V> = Option<AuthSchemeMap<V>>;\ntype AuthSchemeMap<V> = HashMap<AuthSchemeId, V>;\n\n/// Macro to define the structs for both `RuntimeComponents` and `RuntimeComponentsBuilder`.\n///\n/// This is a macro in order to keep the fields consistent between the two, and to automatically\n/// update the `merge_from` and `build` methods when new components are added.\n///\n/// It also facilitates unit testing since the overall mechanism can be unit tested with different\n/// fields that are easy to check in tests (testing with real components makes it hard\n/// to tell that the correct component was selected when merging builders).\n///\n/// # Example usage\n///\n/// The two identifiers after \"fields for\" become the names of the struct and builder respectively.\n/// Following that, all the fields are specified. Fields MUST be wrapped in `Option` or `Vec`.\n/// To make a field required in the non-builder struct, add `#[required]` for `Option` fields, or\n/// `#[atLeastOneRequired]` for `Vec` fields.\n///\n/// ```no_compile\n/// declare_runtime_components! {\n///     fields for TestRc and TestRcBuilder {\n///         some_optional_string: Option<String>,\n///\n///         some_optional_vec: Vec<String>,\n///\n///         #[required]\n///         some_required_string: Option<String>,\n///\n///         #[atLeastOneRequired]\n///         some_required_vec: Vec<String>,\n///     }\n/// }\n/// ```\nmacro_rules! declare_runtime_components {\n    (fields for $rc_name:ident and $builder_name:ident {\n        $($(#[$option:ident])? $field_name:ident : $outer_type:ident<$inner_type:ident> ,)+\n    }) => {\n        /// Components that can only be set in runtime plugins that the orchestrator uses directly to call an operation.\n        #[derive(Clone, Debug)]\n        pub struct $rc_name {\n            $($field_name: runtime_component_field_type!($outer_type $inner_type $($option)?),)+\n        }\n\n        /// Builder for [`RuntimeComponents`].\n        #[derive(Clone, Debug)]\n        pub struct $builder_name {\n            builder_name: &'static str,\n            $($field_name: $outer_type<Tracked<$inner_type>>,)+\n        }\n        impl $builder_name {\n            /// Creates a new builder.\n            ///\n            /// Since multiple builders are merged together to make the final [`RuntimeComponents`],\n            /// all components added by this builder are associated with the given `name` so that\n            /// the origin of a component can be easily found when debugging.\n            pub const fn new(name: &'static str) -> Self {\n                Self {\n                    builder_name: name,\n                    $($field_name: empty_builder_value!($outer_type),)+\n                }\n            }\n\n            /// Merge in components from another builder.\n            pub fn merge_from(mut self, other: &Self) -> Self {\n                $(merge!($outer_type other.$field_name => self);)+\n                self\n            }\n\n            /// Builds [`RuntimeComponents`] from this builder.\n            pub fn build(self) -> Result<$rc_name, BuildError> {\n                let mut rcs = $rc_name {\n                    $($field_name: builder_field_value!($outer_type self.$field_name $($option)?),)+\n                };\n                rcs.sort();\n\n                Ok(rcs)\n            }\n        }\n    };\n}\n\ndeclare_runtime_components! {\n    fields for RuntimeComponents and RuntimeComponentsBuilder {\n        #[required]\n        auth_scheme_option_resolver: Option<SharedAuthSchemeOptionResolver>,\n\n        // A connector is not required since a client could technically only be used for presigning\n        http_client: Option<SharedHttpClient>,\n\n        #[required]\n        endpoint_resolver: Option<SharedEndpointResolver>,\n\n        #[atLeastOneRequired]\n        auth_schemes: OptionalAuthSchemeMap<SharedAuthScheme>,\n\n        #[required]\n        identity_cache: Option<SharedIdentityCache>,\n\n        #[atLeastOneRequired]\n        identity_resolvers: OptionalAuthSchemeMap<SharedIdentityResolver>,\n\n        interceptors: Vec<SharedInterceptor>,\n\n        retry_classifiers: Vec<SharedRetryClassifier>,\n\n        #[required]\n        retry_strategy: Option<SharedRetryStrategy>,\n\n        time_source: Option<SharedTimeSource>,\n\n        sleep_impl: Option<SharedAsyncSleep>,\n\n        config_validators: Vec<SharedConfigValidator>,\n    }\n}\n\nimpl RuntimeComponents {\n    /// Returns a builder for runtime components.\n    pub fn builder(name: &'static str) -> RuntimeComponentsBuilder {\n        RuntimeComponentsBuilder::new(name)\n    }\n\n    /// Clones and converts this [`RuntimeComponents`] into a [`RuntimeComponentsBuilder`].\n    pub fn to_builder(&self) -> RuntimeComponentsBuilder {\n        RuntimeComponentsBuilder::from_runtime_components(\n            self.clone(),\n            \"RuntimeComponentsBuilder::from_runtime_components\",\n        )\n    }\n\n    /// Returns the auth scheme option resolver.\n    pub fn auth_scheme_option_resolver(&self) -> SharedAuthSchemeOptionResolver {\n        self.auth_scheme_option_resolver.value.clone()\n    }\n\n    /// Returns the HTTP client.\n    pub fn http_client(&self) -> Option<SharedHttpClient> {\n        self.http_client.as_ref().map(|s| s.value.clone())\n    }\n\n    /// Returns the endpoint resolver.\n    pub fn endpoint_resolver(&self) -> SharedEndpointResolver {\n        self.endpoint_resolver.value.clone()\n    }\n\n    /// Returns the requested auth scheme if it is set.\n    pub fn auth_scheme(&self, scheme_id: impl AsRef<AuthSchemeId>) -> Option<SharedAuthScheme> {\n        self.auth_schemes\n            .get(scheme_id.as_ref())\n            .map(|s| s.value.clone())\n    }\n\n    /// Returns the identity cache.\n    pub fn identity_cache(&self) -> SharedIdentityCache {\n        self.identity_cache.value.clone()\n    }\n\n    /// Returns an iterator over the interceptors.\n    pub fn interceptors(&self) -> impl Iterator<Item = SharedInterceptor> + '_ {\n        self.interceptors.iter().map(|s| s.value.clone())\n    }\n\n    /// Returns an iterator over the retry classifiers.\n    pub fn retry_classifiers(&self) -> impl Iterator<Item = SharedRetryClassifier> + '_ {\n        self.retry_classifiers.iter().map(|s| s.value.clone())\n    }\n\n    // Needed for `impl ValidateConfig for SharedRetryClassifier {`\n    #[cfg(debug_assertions)]\n    pub(crate) fn retry_classifiers_slice(&self) -> &[Tracked<SharedRetryClassifier>] {\n        self.retry_classifiers.as_slice()\n    }\n\n    /// Returns the retry strategy.\n    pub fn retry_strategy(&self) -> SharedRetryStrategy {\n        self.retry_strategy.value.clone()\n    }\n\n    /// Returns the async sleep implementation.\n    pub fn sleep_impl(&self) -> Option<SharedAsyncSleep> {\n        self.sleep_impl.as_ref().map(|s| s.value.clone())\n    }\n\n    /// Returns the time source.\n    pub fn time_source(&self) -> Option<SharedTimeSource> {\n        self.time_source.as_ref().map(|s| s.value.clone())\n    }\n\n    /// Returns the config validators.\n    pub fn config_validators(&self) -> impl Iterator<Item = SharedConfigValidator> + '_ {\n        self.config_validators.iter().map(|s| s.value.clone())\n    }\n\n    /// Validate the final client configuration.\n    ///\n    /// This is intended to be called internally by the client.\n    pub fn validate_final_config(&self, cfg: &ConfigBag) -> Result<(), BoxError> {\n        macro_rules! validate {\n            (Required: $field:expr) => {\n                ValidateConfig::validate_final_config(&$field.value, self, cfg)?;\n            };\n            (Option: $field:expr) => {\n                if let Some(field) = $field.as_ref() {\n                    ValidateConfig::validate_final_config(&field.value, self, cfg)?;\n                }\n            };\n            (Vec: $field:expr) => {\n                for entry in $field {\n                    ValidateConfig::validate_final_config(&entry.value, self, cfg)?;\n                }\n            };\n            (Map: $field:expr) => {\n                for entry in $field.values() {\n                    ValidateConfig::validate_final_config(&entry.value, self, cfg)?;\n                }\n            };\n        }\n\n        for validator in self.config_validators() {\n            validator.validate_final_config(self, cfg)?;\n        }\n\n        validate!(Option: self.http_client);\n        validate!(Required: self.endpoint_resolver);\n        validate!(Map: &self.auth_schemes);\n        validate!(Required: self.identity_cache);\n        validate!(Map: self.identity_resolvers);\n        validate!(Vec: &self.interceptors);\n        validate!(Required: self.retry_strategy);\n        validate!(Vec: &self.retry_classifiers);\n\n        Ok(())\n    }\n\n    fn sort(&mut self) {\n        self.retry_classifiers.sort_by_key(|rc| rc.value.priority());\n    }\n}\n\nimpl RuntimeComponentsBuilder {\n    /// Creates a new [`RuntimeComponentsBuilder`], inheriting all fields from the given\n    /// [`RuntimeComponents`].\n    pub fn from_runtime_components(rc: RuntimeComponents, builder_name: &'static str) -> Self {\n        Self {\n            builder_name,\n            auth_scheme_option_resolver: Some(rc.auth_scheme_option_resolver),\n            http_client: rc.http_client,\n            endpoint_resolver: Some(rc.endpoint_resolver),\n            auth_schemes: Some(rc.auth_schemes),\n            identity_cache: Some(rc.identity_cache),\n            identity_resolvers: Some(rc.identity_resolvers),\n            interceptors: rc.interceptors,\n            retry_classifiers: rc.retry_classifiers,\n            retry_strategy: Some(rc.retry_strategy),\n            time_source: rc.time_source,\n            sleep_impl: rc.sleep_impl,\n            config_validators: rc.config_validators,\n        }\n    }\n\n    /// Returns the auth scheme option resolver.\n    pub fn auth_scheme_option_resolver(&self) -> Option<SharedAuthSchemeOptionResolver> {\n        self.auth_scheme_option_resolver\n            .as_ref()\n            .map(|s| s.value.clone())\n    }\n\n    /// Sets the auth scheme option resolver.\n    pub fn set_auth_scheme_option_resolver(\n        &mut self,\n        auth_scheme_option_resolver: Option<impl ResolveAuthSchemeOptions + 'static>,\n    ) -> &mut Self {\n        self.auth_scheme_option_resolver =\n            self.tracked(auth_scheme_option_resolver.map(IntoShared::into_shared));\n        self\n    }\n\n    /// Sets the auth scheme option resolver.\n    pub fn with_auth_scheme_option_resolver(\n        mut self,\n        auth_scheme_option_resolver: Option<impl ResolveAuthSchemeOptions + 'static>,\n    ) -> Self {\n        self.set_auth_scheme_option_resolver(auth_scheme_option_resolver);\n        self\n    }\n\n    /// Returns the HTTP client.\n    pub fn http_client(&self) -> Option<SharedHttpClient> {\n        self.http_client.as_ref().map(|s| s.value.clone())\n    }\n\n    /// Sets the HTTP client.\n    pub fn set_http_client(&mut self, connector: Option<impl HttpClient + 'static>) -> &mut Self {\n        self.http_client = self.tracked(connector.map(IntoShared::into_shared));\n        self\n    }\n\n    /// Sets the HTTP client.\n    pub fn with_http_client(mut self, connector: Option<impl HttpClient + 'static>) -> Self {\n        self.set_http_client(connector);\n        self\n    }\n\n    /// Returns the endpoint resolver.\n    pub fn endpoint_resolver(&self) -> Option<SharedEndpointResolver> {\n        self.endpoint_resolver.as_ref().map(|s| s.value.clone())\n    }\n\n    /// Sets the endpoint resolver.\n    pub fn set_endpoint_resolver(\n        &mut self,\n        endpoint_resolver: Option<impl ResolveEndpoint + 'static>,\n    ) -> &mut Self {\n        self.endpoint_resolver =\n            endpoint_resolver.map(|s| Tracked::new(self.builder_name, s.into_shared()));\n        self\n    }\n\n    /// Sets the endpoint resolver.\n    pub fn with_endpoint_resolver(\n        mut self,\n        endpoint_resolver: Option<impl ResolveEndpoint + 'static>,\n    ) -> Self {\n        self.set_endpoint_resolver(endpoint_resolver);\n        self\n    }\n\n    /// Returns the auth schemes.\n    pub fn auth_schemes(&self) -> impl Iterator<Item = SharedAuthScheme> + '_ {\n        self.auth_schemes\n            .iter()\n            .flat_map(|s| s.values().map(|t| t.value.clone()))\n    }\n\n    /// Adds an auth scheme, replacing the existing one.\n    pub fn push_auth_scheme(&mut self, auth_scheme: impl AuthScheme + 'static) -> &mut Self {\n        let mut auth_schemes = self.auth_schemes.take().unwrap_or_default();\n        auth_schemes.insert(\n            auth_scheme.scheme_id(),\n            Tracked::new(self.builder_name, auth_scheme.into_shared()),\n        );\n        self.auth_schemes = Some(auth_schemes);\n        self\n    }\n\n    /// Adds an auth scheme.\n    pub fn with_auth_scheme(mut self, auth_scheme: impl AuthScheme + 'static) -> Self {\n        self.push_auth_scheme(auth_scheme);\n        self\n    }\n\n    /// Returns the identity cache.\n    pub fn identity_cache(&self) -> Option<SharedIdentityCache> {\n        self.identity_cache.as_ref().map(|s| s.value.clone())\n    }\n\n    /// Sets the identity cache.\n    pub fn set_identity_cache(\n        &mut self,\n        identity_cache: Option<impl ResolveCachedIdentity + 'static>,\n    ) -> &mut Self {\n        self.identity_cache =\n            identity_cache.map(|c| Tracked::new(self.builder_name, c.into_shared()));\n        self\n    }\n\n    /// Sets the identity cache.\n    pub fn with_identity_cache(\n        mut self,\n        identity_cache: Option<impl ResolveCachedIdentity + 'static>,\n    ) -> Self {\n        self.set_identity_cache(identity_cache);\n        self\n    }\n\n    /// Returns [`SharedIdentityResolver`] configured in the builder for a given `scheme_id`.\n    pub fn identity_resolver(&self, scheme_id: &AuthSchemeId) -> Option<SharedIdentityResolver> {\n        self.identity_resolvers\n            .as_ref()\n            .and_then(|resolvers| resolvers.get(scheme_id))\n            .map(|tracked| tracked.value.clone())\n    }\n\n    /// Returns `true` if any identity resolvers have been configured in this builder.\n    pub fn has_identity_resolvers(&self) -> bool {\n        self.identity_resolvers\n            .as_ref()\n            .is_some_and(|resolvers| !resolvers.is_empty())\n    }\n\n    /// This method is broken since it does not replace an existing identity resolver of the given auth scheme ID.\n    /// Use `set_identity_resolver` instead.\n    #[deprecated(\n        note = \"This method is broken since it does not replace an existing identity resolver of the given auth scheme ID. Use `set_identity_resolver` instead.\"\n    )]\n    pub fn push_identity_resolver(\n        &mut self,\n        scheme_id: AuthSchemeId,\n        identity_resolver: impl ResolveIdentity + 'static,\n    ) -> &mut Self {\n        self.set_identity_resolver(scheme_id, identity_resolver)\n    }\n\n    /// Sets the identity resolver for a given `scheme_id`.\n    ///\n    /// If there is already an identity resolver for that `scheme_id`, this method will replace\n    /// the existing one with the passed-in `identity_resolver`.\n    pub fn set_identity_resolver(\n        &mut self,\n        scheme_id: AuthSchemeId,\n        identity_resolver: impl ResolveIdentity + 'static,\n    ) -> &mut Self {\n        let mut resolvers = self.identity_resolvers.take().unwrap_or_default();\n        resolvers.insert(\n            scheme_id,\n            Tracked::new(self.builder_name, identity_resolver.into_shared()),\n        );\n        self.identity_resolvers = Some(resolvers);\n        self\n    }\n\n    /// Adds an identity resolver.\n    pub fn with_identity_resolver(\n        mut self,\n        scheme_id: AuthSchemeId,\n        identity_resolver: impl ResolveIdentity + 'static,\n    ) -> Self {\n        self.set_identity_resolver(scheme_id, identity_resolver);\n        self\n    }\n\n    /// Returns the interceptors.\n    pub fn interceptors(&self) -> impl Iterator<Item = SharedInterceptor> + '_ {\n        self.interceptors.iter().map(|s| s.value.clone())\n    }\n\n    /// Adds all the given interceptors.\n    pub fn extend_interceptors(\n        &mut self,\n        interceptors: impl Iterator<Item = SharedInterceptor>,\n    ) -> &mut Self {\n        self.interceptors\n            .extend(interceptors.map(|s| Tracked::new(self.builder_name, s)));\n        self\n    }\n\n    /// Adds an interceptor.\n    pub fn push_interceptor(&mut self, interceptor: impl Intercept + 'static) -> &mut Self {\n        self.interceptors\n            .push(Tracked::new(self.builder_name, interceptor.into_shared()));\n        self\n    }\n\n    /// Adds an interceptor.\n    pub fn with_interceptor(mut self, interceptor: impl Intercept + 'static) -> Self {\n        self.push_interceptor(interceptor);\n        self\n    }\n\n    /// Directly sets the interceptors and clears out any that were previously pushed.\n    pub fn set_interceptors(\n        &mut self,\n        interceptors: impl Iterator<Item = SharedInterceptor>,\n    ) -> &mut Self {\n        self.interceptors.clear();\n        self.interceptors\n            .extend(interceptors.map(|s| Tracked::new(self.builder_name, s)));\n        self\n    }\n\n    /// Directly sets the interceptors and clears out any that were previously pushed.\n    pub fn with_interceptors(\n        mut self,\n        interceptors: impl Iterator<Item = SharedInterceptor>,\n    ) -> Self {\n        self.set_interceptors(interceptors);\n        self\n    }\n\n    /// Returns the retry classifiers.\n    pub fn retry_classifiers(&self) -> impl Iterator<Item = SharedRetryClassifier> + '_ {\n        self.retry_classifiers.iter().map(|s| s.value.clone())\n    }\n\n    /// Adds all the given retry classifiers.\n    pub fn extend_retry_classifiers(\n        &mut self,\n        retry_classifiers: impl Iterator<Item = SharedRetryClassifier>,\n    ) -> &mut Self {\n        self.retry_classifiers\n            .extend(retry_classifiers.map(|s| Tracked::new(self.builder_name, s)));\n        self\n    }\n\n    /// Adds a retry_classifier.\n    pub fn push_retry_classifier(\n        &mut self,\n        retry_classifier: impl ClassifyRetry + 'static,\n    ) -> &mut Self {\n        self.retry_classifiers.push(Tracked::new(\n            self.builder_name,\n            retry_classifier.into_shared(),\n        ));\n        self\n    }\n\n    /// Adds a retry_classifier.\n    pub fn with_retry_classifier(mut self, retry_classifier: impl ClassifyRetry + 'static) -> Self {\n        self.push_retry_classifier(retry_classifier);\n        self\n    }\n\n    /// Directly sets the retry_classifiers and clears out any that were previously pushed.\n    pub fn set_retry_classifiers(\n        &mut self,\n        retry_classifiers: impl Iterator<Item = SharedRetryClassifier>,\n    ) -> &mut Self {\n        self.retry_classifiers.clear();\n        self.retry_classifiers\n            .extend(retry_classifiers.map(|s| Tracked::new(self.builder_name, s)));\n        self\n    }\n\n    /// Returns the retry strategy.\n    pub fn retry_strategy(&self) -> Option<SharedRetryStrategy> {\n        self.retry_strategy.as_ref().map(|s| s.value.clone())\n    }\n\n    /// Sets the retry strategy.\n    pub fn set_retry_strategy(\n        &mut self,\n        retry_strategy: Option<impl RetryStrategy + 'static>,\n    ) -> &mut Self {\n        self.retry_strategy =\n            retry_strategy.map(|s| Tracked::new(self.builder_name, s.into_shared()));\n        self\n    }\n\n    /// Sets the retry strategy.\n    pub fn with_retry_strategy(\n        mut self,\n        retry_strategy: Option<impl RetryStrategy + 'static>,\n    ) -> Self {\n        self.retry_strategy =\n            retry_strategy.map(|s| Tracked::new(self.builder_name, s.into_shared()));\n        self\n    }\n\n    /// Returns the async sleep implementation.\n    pub fn sleep_impl(&self) -> Option<SharedAsyncSleep> {\n        self.sleep_impl.as_ref().map(|s| s.value.clone())\n    }\n\n    /// Sets the async sleep implementation.\n    pub fn set_sleep_impl(&mut self, sleep_impl: Option<SharedAsyncSleep>) -> &mut Self {\n        self.sleep_impl = self.tracked(sleep_impl);\n        self\n    }\n\n    /// Sets the async sleep implementation.\n    pub fn with_sleep_impl(mut self, sleep_impl: Option<impl AsyncSleep + 'static>) -> Self {\n        self.set_sleep_impl(sleep_impl.map(IntoShared::into_shared));\n        self\n    }\n\n    /// Returns the time source.\n    pub fn time_source(&self) -> Option<SharedTimeSource> {\n        self.time_source.as_ref().map(|s| s.value.clone())\n    }\n\n    /// Sets the time source.\n    pub fn set_time_source(&mut self, time_source: Option<SharedTimeSource>) -> &mut Self {\n        self.time_source = self.tracked(time_source);\n        self\n    }\n\n    /// Sets the time source.\n    pub fn with_time_source(mut self, time_source: Option<impl TimeSource + 'static>) -> Self {\n        self.set_time_source(time_source.map(IntoShared::into_shared));\n        self\n    }\n\n    /// Returns the config validators.\n    pub fn config_validators(&self) -> impl Iterator<Item = SharedConfigValidator> + '_ {\n        self.config_validators.iter().map(|s| s.value.clone())\n    }\n\n    /// Adds all the given config validators.\n    pub fn extend_config_validators(\n        &mut self,\n        config_validators: impl Iterator<Item = SharedConfigValidator>,\n    ) -> &mut Self {\n        self.config_validators\n            .extend(config_validators.map(|s| Tracked::new(self.builder_name, s)));\n        self\n    }\n\n    /// Adds a config validator.\n    pub fn push_config_validator(\n        &mut self,\n        config_validator: impl ValidateConfig + 'static,\n    ) -> &mut Self {\n        self.config_validators.push(Tracked::new(\n            self.builder_name,\n            config_validator.into_shared(),\n        ));\n        self\n    }\n\n    /// Adds a config validator.\n    pub fn with_config_validator(\n        mut self,\n        config_validator: impl ValidateConfig + 'static,\n    ) -> Self {\n        self.push_config_validator(config_validator);\n        self\n    }\n\n    /// Validate the base client configuration.\n    ///\n    /// This is intended to be called internally by the client.\n    pub fn validate_base_client_config(&self, cfg: &ConfigBag) -> Result<(), BoxError> {\n        macro_rules! validate {\n            ($field:expr) => {\n                #[allow(for_loops_over_fallibles)]\n                for entry in $field {\n                    ValidateConfig::validate_base_client_config(&entry.value, self, cfg)?;\n                }\n            };\n        }\n\n        for validator in self.config_validators() {\n            validator.validate_base_client_config(self, cfg)?;\n        }\n        validate!(&self.http_client);\n        validate!(&self.endpoint_resolver);\n        if let Some(auth_schemes) = &self.auth_schemes {\n            validate!(auth_schemes.values())\n        }\n        validate!(&self.identity_cache);\n        if let Some(resolvers) = &self.identity_resolvers {\n            validate!(resolvers.values())\n        }\n        validate!(&self.interceptors);\n        validate!(&self.retry_strategy);\n        Ok(())\n    }\n\n    /// Converts this builder into [`TimeComponents`].\n    pub fn into_time_components(mut self) -> TimeComponents {\n        TimeComponents {\n            sleep_impl: self.sleep_impl.take().map(|s| s.value),\n            time_source: self.time_source.take().map(|s| s.value),\n        }\n    }\n\n    /// Wraps `v` in tracking associated with this builder\n    fn tracked<T>(&self, v: Option<T>) -> Option<Tracked<T>> {\n        v.map(|v| Tracked::new(self.builder_name, v))\n    }\n}\n\n/// Time-related subset of components that can be extracted directly from [`RuntimeComponentsBuilder`] prior to validation.\n#[derive(Debug)]\npub struct TimeComponents {\n    sleep_impl: Option<SharedAsyncSleep>,\n    time_source: Option<SharedTimeSource>,\n}\n\nimpl TimeComponents {\n    /// Returns the async sleep implementation if one is available.\n    pub fn sleep_impl(&self) -> Option<SharedAsyncSleep> {\n        self.sleep_impl.clone()\n    }\n\n    /// Returns the time source if one is available.\n    pub fn time_source(&self) -> Option<SharedTimeSource> {\n        self.time_source.clone()\n    }\n}\n\n#[derive(Clone, Debug)]\n#[cfg_attr(test, derive(Eq, PartialEq))]\npub(crate) struct Tracked<T> {\n    _origin: &'static str,\n    value: T,\n}\n\nimpl<T> Tracked<T> {\n    fn new(origin: &'static str, value: T) -> Self {\n        Self {\n            _origin: origin,\n            value,\n        }\n    }\n\n    #[cfg(debug_assertions)]\n    pub(crate) fn value(&self) -> &T {\n        &self.value\n    }\n}\n\nimpl RuntimeComponentsBuilder {\n    /// Creates a runtime components builder with all the required components filled in with fake (panicking) implementations.\n    #[cfg(feature = \"test-util\")]\n    pub fn for_tests() -> Self {\n        use crate::client::endpoint::{EndpointFuture, EndpointResolverParams};\n        use crate::client::identity::IdentityFuture;\n\n        #[derive(Debug)]\n        struct FakeAuthSchemeOptionResolver;\n        impl ResolveAuthSchemeOptions for FakeAuthSchemeOptionResolver {\n            fn resolve_auth_scheme_options(\n                &self,\n                _: &crate::client::auth::AuthSchemeOptionResolverParams,\n            ) -> Result<std::borrow::Cow<'_, [AuthSchemeId]>, BoxError> {\n                unreachable!(\"fake auth scheme option resolver must be overridden for this test\")\n            }\n        }\n\n        #[derive(Debug)]\n        struct FakeClient;\n        impl HttpClient for FakeClient {\n            fn http_connector(\n                &self,\n                _: &crate::client::http::HttpConnectorSettings,\n                _: &RuntimeComponents,\n            ) -> crate::client::http::SharedHttpConnector {\n                unreachable!(\"fake client must be overridden for this test\")\n            }\n        }\n\n        #[derive(Debug)]\n        struct FakeEndpointResolver;\n        impl ResolveEndpoint for FakeEndpointResolver {\n            fn resolve_endpoint<'a>(&'a self, _: &'a EndpointResolverParams) -> EndpointFuture<'a> {\n                unreachable!(\"fake endpoint resolver must be overridden for this test\")\n            }\n        }\n\n        #[derive(Debug)]\n        struct FakeAuthScheme;\n        impl AuthScheme for FakeAuthScheme {\n            fn scheme_id(&self) -> AuthSchemeId {\n                AuthSchemeId::new(\"fake\")\n            }\n\n            fn identity_resolver(\n                &self,\n                _: &dyn GetIdentityResolver,\n            ) -> Option<SharedIdentityResolver> {\n                None\n            }\n\n            fn signer(&self) -> &dyn crate::client::auth::Sign {\n                unreachable!(\"fake http auth scheme must be overridden for this test\")\n            }\n        }\n\n        #[derive(Debug)]\n        struct FakeIdentityResolver;\n        impl ResolveIdentity for FakeIdentityResolver {\n            fn resolve_identity<'a>(\n                &'a self,\n                _: &'a RuntimeComponents,\n                _: &'a ConfigBag,\n            ) -> IdentityFuture<'a> {\n                unreachable!(\"fake identity resolver must be overridden for this test\")\n            }\n        }\n\n        #[derive(Debug)]\n        struct FakeRetryStrategy;\n        impl RetryStrategy for FakeRetryStrategy {\n            fn should_attempt_initial_request(\n                &self,\n                _: &RuntimeComponents,\n                _: &ConfigBag,\n            ) -> Result<crate::client::retries::ShouldAttempt, BoxError> {\n                unreachable!(\"fake retry strategy must be overridden for this test\")\n            }\n\n            fn should_attempt_retry(\n                &self,\n                _: &crate::client::interceptors::context::InterceptorContext,\n                _: &RuntimeComponents,\n                _: &ConfigBag,\n            ) -> Result<crate::client::retries::ShouldAttempt, BoxError> {\n                unreachable!(\"fake retry strategy must be overridden for this test\")\n            }\n        }\n\n        #[derive(Debug)]\n        struct FakeTimeSource;\n        impl TimeSource for FakeTimeSource {\n            fn now(&self) -> std::time::SystemTime {\n                unreachable!(\"fake time source must be overridden for this test\")\n            }\n        }\n\n        #[derive(Debug)]\n        struct FakeSleep;\n        impl AsyncSleep for FakeSleep {\n            fn sleep(&self, _: std::time::Duration) -> aws_smithy_async::rt::sleep::Sleep {\n                unreachable!(\"fake sleep must be overridden for this test\")\n            }\n        }\n\n        #[derive(Debug)]\n        struct FakeIdentityCache;\n        impl ResolveCachedIdentity for FakeIdentityCache {\n            fn resolve_cached_identity<'a>(\n                &'a self,\n                resolver: SharedIdentityResolver,\n                components: &'a RuntimeComponents,\n                config_bag: &'a ConfigBag,\n            ) -> IdentityFuture<'a> {\n                IdentityFuture::new(async move {\n                    resolver.resolve_identity(components, config_bag).await\n                })\n            }\n        }\n\n        Self::new(\"aws_smithy_runtime_api::client::runtime_components::RuntimeComponentBuilder::for_tests\")\n            .with_auth_scheme(FakeAuthScheme)\n            .with_auth_scheme_option_resolver(Some(FakeAuthSchemeOptionResolver))\n            .with_endpoint_resolver(Some(FakeEndpointResolver))\n            .with_http_client(Some(FakeClient))\n            .with_identity_cache(Some(FakeIdentityCache))\n            .with_identity_resolver(AuthSchemeId::new(\"fake\"), FakeIdentityResolver)\n            .with_retry_strategy(Some(FakeRetryStrategy))\n            .with_sleep_impl(Some(SharedAsyncSleep::new(FakeSleep)))\n            .with_time_source(Some(SharedTimeSource::new(FakeTimeSource)))\n    }\n}\n\n/// An error that occurs when building runtime components.\n#[derive(Debug)]\npub struct BuildError(&'static str);\n\nimpl std::error::Error for BuildError {}\n\nimpl fmt::Display for BuildError {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        write!(f, \"{}\", self.0)\n    }\n}\n\n/// A trait for retrieving a shared identity resolver.\n///\n/// This trait exists so that [`AuthScheme::identity_resolver`]\n/// can have access to configured identity resolvers without having access to all the runtime components.\npub trait GetIdentityResolver: Send + Sync {\n    /// Returns the requested identity resolver if it is set.\n    fn identity_resolver(&self, scheme_id: AuthSchemeId) -> Option<SharedIdentityResolver>;\n}\n\nimpl GetIdentityResolver for RuntimeComponents {\n    fn identity_resolver(&self, scheme_id: AuthSchemeId) -> Option<SharedIdentityResolver> {\n        self.identity_resolvers\n            .get(&scheme_id)\n            .map(|s| s.value.clone())\n    }\n}\n\n#[cfg(all(test, feature = \"test-util\"))]\nmod tests {\n    use super::{BuildError, RuntimeComponentsBuilder, Tracked};\n    use crate::client::runtime_components::ValidateConfig;\n\n    #[derive(Clone, Debug, Eq, PartialEq)]\n    struct TestComponent(String);\n    impl ValidateConfig for TestComponent {}\n    impl From<&'static str> for TestComponent {\n        fn from(value: &'static str) -> Self {\n            TestComponent(value.into())\n        }\n    }\n\n    #[test]\n    #[allow(unreachable_pub)]\n    #[allow(dead_code)]\n    fn the_builders_should_merge() {\n        declare_runtime_components! {\n            fields for TestRc and TestRcBuilder {\n                #[required]\n                some_required_component: Option<TestComponent>,\n\n                some_optional_component: Option<TestComponent>,\n\n                #[atLeastOneRequired]\n                some_required_vec: Vec<TestComponent>,\n\n                some_optional_vec: Vec<TestComponent>,\n            }\n        }\n\n        impl TestRc {\n            fn sort(&mut self) {}\n        }\n\n        let builder1 = TestRcBuilder {\n            builder_name: \"builder1\",\n            some_required_component: Some(Tracked::new(\"builder1\", \"override_me\".into())),\n            some_optional_component: Some(Tracked::new(\"builder1\", \"override_me optional\".into())),\n            some_required_vec: vec![Tracked::new(\"builder1\", \"first\".into())],\n            some_optional_vec: vec![Tracked::new(\"builder1\", \"first optional\".into())],\n        };\n        let builder2 = TestRcBuilder {\n            builder_name: \"builder2\",\n            some_required_component: Some(Tracked::new(\"builder2\", \"override_me_too\".into())),\n            some_optional_component: Some(Tracked::new(\n                \"builder2\",\n                \"override_me_too optional\".into(),\n            )),\n            some_required_vec: vec![Tracked::new(\"builder2\", \"second\".into())],\n            some_optional_vec: vec![Tracked::new(\"builder2\", \"second optional\".into())],\n        };\n        let builder3 = TestRcBuilder {\n            builder_name: \"builder3\",\n            some_required_component: Some(Tracked::new(\"builder3\", \"correct\".into())),\n            some_optional_component: Some(Tracked::new(\"builder3\", \"correct optional\".into())),\n            some_required_vec: vec![Tracked::new(\"builder3\", \"third\".into())],\n            some_optional_vec: vec![Tracked::new(\"builder3\", \"third optional\".into())],\n        };\n        let rc = TestRcBuilder::new(\"root\")\n            .merge_from(&builder1)\n            .merge_from(&builder2)\n            .merge_from(&builder3)\n            .build()\n            .expect(\"success\");\n        assert_eq!(\n            Tracked::new(\"builder3\", TestComponent::from(\"correct\")),\n            rc.some_required_component\n        );\n        assert_eq!(\n            Some(Tracked::new(\n                \"builder3\",\n                TestComponent::from(\"correct optional\")\n            )),\n            rc.some_optional_component\n        );\n        assert_eq!(\n            vec![\n                Tracked::new(\"builder1\", TestComponent::from(\"first\")),\n                Tracked::new(\"builder2\", TestComponent::from(\"second\")),\n                Tracked::new(\"builder3\", TestComponent::from(\"third\"))\n            ],\n            rc.some_required_vec\n        );\n        assert_eq!(\n            vec![\n                Tracked::new(\"builder1\", TestComponent::from(\"first optional\")),\n                Tracked::new(\"builder2\", TestComponent::from(\"second optional\")),\n                Tracked::new(\"builder3\", TestComponent::from(\"third optional\"))\n            ],\n            rc.some_optional_vec\n        );\n    }\n\n    #[test]\n    #[allow(unreachable_pub)]\n    #[allow(dead_code)]\n    #[should_panic(expected = \"the `_some_component` runtime component is required\")]\n    fn require_field_singular() {\n        declare_runtime_components! {\n            fields for TestRc and TestRcBuilder {\n                #[required]\n                _some_component: Option<TestComponent>,\n            }\n        }\n\n        impl TestRc {\n            fn sort(&mut self) {}\n        }\n\n        let rc = TestRcBuilder::new(\"test\").build().unwrap();\n\n        // Ensure the correct types were used\n        let _: Tracked<TestComponent> = rc._some_component;\n    }\n\n    #[test]\n    #[allow(unreachable_pub)]\n    #[allow(dead_code)]\n    #[should_panic(expected = \"at least one `_some_vec` runtime component is required\")]\n    fn require_field_plural() {\n        declare_runtime_components! {\n            fields for TestRc and TestRcBuilder {\n                #[atLeastOneRequired]\n                _some_vec: Vec<TestComponent>,\n            }\n        }\n\n        impl TestRc {\n            fn sort(&mut self) {}\n        }\n\n        let rc = TestRcBuilder::new(\"test\").build().unwrap();\n\n        // Ensure the correct types were used\n        let _: Vec<Tracked<TestComponent>> = rc._some_vec;\n    }\n\n    #[test]\n    #[allow(unreachable_pub)]\n    #[allow(dead_code)]\n    fn optional_fields_dont_panic() {\n        declare_runtime_components! {\n            fields for TestRc and TestRcBuilder {\n                _some_optional_component: Option<TestComponent>,\n                _some_optional_vec: Vec<TestComponent>,\n            }\n        }\n\n        impl TestRc {\n            fn sort(&mut self) {}\n        }\n\n        let rc = TestRcBuilder::new(\"test\").build().unwrap();\n\n        // Ensure the correct types were used\n        let _: Option<Tracked<TestComponent>> = rc._some_optional_component;\n        let _: Vec<Tracked<TestComponent>> = rc._some_optional_vec;\n    }\n\n    #[test]\n    fn building_test_builder_should_not_panic() {\n        let _ = RuntimeComponentsBuilder::for_tests().build(); // should not panic\n    }\n\n    #[test]\n    fn set_identity_resolver_should_replace_existing_resolver_for_given_auth_scheme() {\n        use crate::client::auth::AuthSchemeId;\n        use crate::client::identity::{Identity, IdentityFuture, ResolveIdentity};\n        use crate::client::runtime_components::{GetIdentityResolver, RuntimeComponents};\n        use aws_smithy_types::config_bag::ConfigBag;\n        use tokio::runtime::Runtime;\n\n        #[derive(Debug)]\n        struct AnotherFakeIdentityResolver;\n        impl ResolveIdentity for AnotherFakeIdentityResolver {\n            fn resolve_identity<'a>(\n                &'a self,\n                _: &'a RuntimeComponents,\n                _: &'a ConfigBag,\n            ) -> IdentityFuture<'a> {\n                IdentityFuture::ready(Ok(Identity::new(\"doesn't matter\", None)))\n            }\n        }\n\n        // Set a different `IdentityResolver` for the `fake` auth scheme already configured in\n        // a test runtime components builder\n        let rc = RuntimeComponentsBuilder::for_tests()\n            .with_identity_resolver(AuthSchemeId::new(\"fake\"), AnotherFakeIdentityResolver)\n            .build()\n            .expect(\"should build RuntimeComponents\");\n\n        let resolver = rc\n            .identity_resolver(AuthSchemeId::new(\"fake\"))\n            .expect(\"identity resolver should be found\");\n\n        let identity = Runtime::new().unwrap().block_on(async {\n            resolver\n                .resolve_identity(&rc, &ConfigBag::base())\n                .await\n                .expect(\"identity should be resolved\")\n        });\n\n        assert_eq!(Some(&\"doesn't matter\"), identity.data::<&str>());\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime-api/src/client/runtime_plugin.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Runtime plugin type definitions.\n//!\n//! Runtime plugins are used to extend the runtime with custom behavior.\n//! This can include:\n//! - Registering interceptors\n//! - Registering auth schemes\n//! - Adding entries to the [`ConfigBag`] for orchestration\n//! - Setting runtime components\n//!\n//! Runtime plugins are divided into service/operation \"levels\", with service runtime plugins\n//! executing before operation runtime plugins. Runtime plugins configured in a service\n//! config will always be at the service level, while runtime plugins added during\n//! operation customization will be at the operation level. Custom runtime plugins will\n//! always run after the default runtime plugins within their level.\n\nuse crate::box_error::BoxError;\nuse crate::client::runtime_components::{\n    RuntimeComponentsBuilder, EMPTY_RUNTIME_COMPONENTS_BUILDER,\n};\nuse crate::impl_shared_conversions;\nuse crate::shared::IntoShared;\nuse aws_smithy_types::config_bag::{ConfigBag, FrozenLayer};\nuse std::borrow::Cow;\nuse std::fmt::Debug;\nuse std::sync::Arc;\n\nconst DEFAULT_ORDER: Order = Order::Overrides;\n\n/// Runtime plugin ordering.\n///\n/// There are two runtime plugin \"levels\" that run in the following order:\n/// 1. Service runtime plugins - runtime plugins that pertain to the entire service.\n/// 2. Operation runtime plugins - runtime plugins relevant only to a single operation.\n///\n/// This enum is used to determine runtime plugin order within those levels.\n#[derive(Copy, Clone, Debug, Eq, PartialEq, PartialOrd, Ord)]\npub enum Order {\n    /// Runtime plugins with `Defaults` order are executed first within their level.\n    ///\n    /// Runtime plugins with this order should only be used for registering default components and config.\n    Defaults,\n\n    /// Runtime plugins with `Overrides` order are executed after `Defaults` within their level.\n    ///\n    /// This is the default order.\n    Overrides,\n\n    /// Runtime plugins with `NestedComponents` order are executed after `Overrides` within their level.\n    ///\n    /// This level is intended to be used for wrapping components configured in previous runtime plugins.\n    NestedComponents,\n}\n\n/// Runtime plugin trait\n///\n/// A `RuntimePlugin` is the unit of configuration for augmenting the client with new behavior.\n///\n/// Runtime plugins can register interceptors, set runtime components, and modify configuration.\npub trait RuntimePlugin: Debug + Send + Sync {\n    /// Runtime plugin ordering.\n    ///\n    /// There are two runtime plugin \"levels\" that run in the following order:\n    /// 1. Service runtime plugins - runtime plugins that pertain to the entire service.\n    /// 2. Operation runtime plugins - runtime plugins relevant only to a single operation.\n    ///\n    /// This function is used to determine runtime plugin order within those levels. So\n    /// regardless of this `Order` value, service runtime plugins will still always execute before\n    /// operation runtime plugins. However, [`Defaults`](Order::Defaults)\n    /// service runtime plugins will run before [`Overrides`](Order::Overrides)\n    /// service runtime plugins.\n    fn order(&self) -> Order {\n        DEFAULT_ORDER\n    }\n\n    /// Optionally returns additional config that should be added to the [`ConfigBag`].\n    ///\n    /// As a best practice, a frozen layer should be stored on the runtime plugin instance as\n    /// a member, and then cloned upon return since that clone is cheap. Constructing a new\n    /// [`Layer`](aws_smithy_types::config_bag::Layer) and freezing it will require a lot of allocations.\n    fn config(&self) -> Option<FrozenLayer> {\n        None\n    }\n\n    /// Returns a [`RuntimeComponentsBuilder`] to incorporate into the final runtime components.\n    ///\n    /// The order of runtime plugins determines which runtime components \"win\". Components set by later runtime plugins will\n    /// override those set by earlier runtime plugins.\n    ///\n    /// If no runtime component changes are desired, just return an empty builder.\n    ///\n    /// This method returns a [`Cow`] for flexibility. Some implementers may want to store the components builder\n    /// as a member and return a reference to it, while others may need to create the builder every call. If possible,\n    /// returning a reference is preferred for performance.\n    ///\n    /// Components configured by previous runtime plugins are in the `current_components` argument, and can be used\n    /// to create nested/wrapped components, such as a connector calling into an inner (customer provided) connector.\n    fn runtime_components(\n        &self,\n        current_components: &RuntimeComponentsBuilder,\n    ) -> Cow<'_, RuntimeComponentsBuilder> {\n        let _ = current_components;\n        Cow::Borrowed(&EMPTY_RUNTIME_COMPONENTS_BUILDER)\n    }\n}\n\n/// Shared runtime plugin\n///\n/// Allows for multiple places to share ownership of one runtime plugin.\n#[derive(Debug, Clone)]\npub struct SharedRuntimePlugin(Arc<dyn RuntimePlugin>);\n\nimpl SharedRuntimePlugin {\n    /// Creates a new [`SharedRuntimePlugin`].\n    pub fn new(plugin: impl RuntimePlugin + 'static) -> Self {\n        Self(Arc::new(plugin))\n    }\n}\n\nimpl RuntimePlugin for SharedRuntimePlugin {\n    fn order(&self) -> Order {\n        self.0.order()\n    }\n\n    fn config(&self) -> Option<FrozenLayer> {\n        self.0.config()\n    }\n\n    fn runtime_components(\n        &self,\n        current_components: &RuntimeComponentsBuilder,\n    ) -> Cow<'_, RuntimeComponentsBuilder> {\n        self.0.runtime_components(current_components)\n    }\n}\n\nimpl_shared_conversions!(convert SharedRuntimePlugin from RuntimePlugin using SharedRuntimePlugin::new);\n\n/// Runtime plugin that simply returns the config and components given at construction time.\n#[derive(Default, Debug)]\npub struct StaticRuntimePlugin {\n    config: Option<FrozenLayer>,\n    runtime_components: Option<RuntimeComponentsBuilder>,\n    order: Option<Order>,\n}\n\nimpl StaticRuntimePlugin {\n    /// Returns a new [`StaticRuntimePlugin`].\n    pub fn new() -> Self {\n        Default::default()\n    }\n\n    /// Changes the config.\n    pub fn with_config(mut self, config: FrozenLayer) -> Self {\n        self.config = Some(config);\n        self\n    }\n\n    /// Changes the runtime components.\n    pub fn with_runtime_components(mut self, runtime_components: RuntimeComponentsBuilder) -> Self {\n        self.runtime_components = Some(runtime_components);\n        self\n    }\n\n    /// Changes the order of this runtime plugin.\n    pub fn with_order(mut self, order: Order) -> Self {\n        self.order = Some(order);\n        self\n    }\n}\n\nimpl RuntimePlugin for StaticRuntimePlugin {\n    fn order(&self) -> Order {\n        self.order.unwrap_or(DEFAULT_ORDER)\n    }\n\n    fn config(&self) -> Option<FrozenLayer> {\n        self.config.clone()\n    }\n\n    fn runtime_components(\n        &self,\n        _current_components: &RuntimeComponentsBuilder,\n    ) -> Cow<'_, RuntimeComponentsBuilder> {\n        self.runtime_components\n            .as_ref()\n            .map(Cow::Borrowed)\n            .unwrap_or_else(|| Cow::Borrowed(&EMPTY_RUNTIME_COMPONENTS_BUILDER))\n    }\n}\n\nmacro_rules! insert_plugin {\n    ($vec:expr, $plugin:expr) => {{\n        // Insert the plugin in the correct order\n        let plugin = $plugin;\n        let mut insert_index = 0;\n        let order = plugin.order();\n        for (index, other_plugin) in $vec.iter().enumerate() {\n            let other_order = other_plugin.order();\n            if other_order <= order {\n                insert_index = index + 1;\n            } else if other_order > order {\n                break;\n            }\n        }\n        $vec.insert(insert_index, plugin);\n    }};\n}\n\nmacro_rules! apply_plugins {\n    ($name:ident, $plugins:expr, $cfg:ident) => {{\n        tracing::trace!(concat!(\"applying \", stringify!($name), \" runtime plugins\"));\n        let mut merged =\n            RuntimeComponentsBuilder::new(concat!(\"apply_\", stringify!($name), \"_configuration\"));\n        for plugin in &$plugins {\n            if let Some(layer) = plugin.config() {\n                $cfg.push_shared_layer(layer);\n            }\n            let next = plugin.runtime_components(&merged);\n            merged = merged.merge_from(&next);\n        }\n        Ok(merged)\n    }};\n}\n\n/// Used internally in the orchestrator implementation and in the generated code. Not intended to be used elsewhere.\n#[derive(Default, Clone, Debug)]\npub struct RuntimePlugins {\n    client_plugins: Vec<SharedRuntimePlugin>,\n    operation_plugins: Vec<SharedRuntimePlugin>,\n}\n\nimpl RuntimePlugins {\n    /// Create a new empty set of runtime plugins.\n    pub fn new() -> Self {\n        Default::default()\n    }\n\n    /// Add several client-level runtime plugins from an iterator.\n    pub fn with_client_plugins(\n        mut self,\n        plugins: impl IntoIterator<Item = SharedRuntimePlugin>,\n    ) -> Self {\n        for plugin in plugins.into_iter() {\n            self = self.with_client_plugin(plugin);\n        }\n        self\n    }\n\n    /// Adds a client-level runtime plugin.\n    pub fn with_client_plugin(mut self, plugin: impl RuntimePlugin + 'static) -> Self {\n        insert_plugin!(\n            self.client_plugins,\n            IntoShared::<SharedRuntimePlugin>::into_shared(plugin)\n        );\n        self\n    }\n\n    /// Add several operation-level runtime plugins from an iterator.\n    pub fn with_operation_plugins(\n        mut self,\n        plugins: impl IntoIterator<Item = SharedRuntimePlugin>,\n    ) -> Self {\n        for plugin in plugins.into_iter() {\n            self = self.with_operation_plugin(plugin);\n        }\n        self\n    }\n\n    /// Adds an operation-level runtime plugin.\n    pub fn with_operation_plugin(mut self, plugin: impl RuntimePlugin + 'static) -> Self {\n        insert_plugin!(\n            self.operation_plugins,\n            IntoShared::<SharedRuntimePlugin>::into_shared(plugin)\n        );\n        self\n    }\n\n    /// Apply the client-level runtime plugins' config to the given config bag.\n    pub fn apply_client_configuration(\n        &self,\n        cfg: &mut ConfigBag,\n    ) -> Result<RuntimeComponentsBuilder, BoxError> {\n        apply_plugins!(client, self.client_plugins, cfg)\n    }\n\n    /// Apply the operation-level runtime plugins' config to the given config bag.\n    pub fn apply_operation_configuration(\n        &self,\n        cfg: &mut ConfigBag,\n    ) -> Result<RuntimeComponentsBuilder, BoxError> {\n        apply_plugins!(operation, self.operation_plugins, cfg)\n    }\n}\n\n#[cfg(all(test, feature = \"test-util\", feature = \"http-02x\"))]\nmod tests {\n    use super::{RuntimePlugin, RuntimePlugins};\n    use crate::client::http::{\n        http_client_fn, HttpClient, HttpConnector, HttpConnectorFuture, SharedHttpConnector,\n    };\n    use crate::client::orchestrator::HttpRequest;\n    use crate::client::runtime_components::RuntimeComponentsBuilder;\n    use crate::client::runtime_plugin::{Order, SharedRuntimePlugin};\n    use crate::shared::IntoShared;\n    use aws_smithy_types::body::SdkBody;\n    use aws_smithy_types::config_bag::ConfigBag;\n    use http_02x::HeaderValue;\n    use std::borrow::Cow;\n\n    #[derive(Debug)]\n    struct SomeStruct;\n\n    impl RuntimePlugin for SomeStruct {}\n\n    #[test]\n    fn can_add_runtime_plugin_implementors_to_runtime_plugins() {\n        RuntimePlugins::new().with_client_plugin(SomeStruct);\n    }\n\n    #[test]\n    fn runtime_plugins_are_send_sync() {\n        fn assert_send_sync<T: Send + Sync>() {}\n        assert_send_sync::<RuntimePlugins>();\n    }\n\n    #[test]\n    fn insert_plugin() {\n        #[derive(Debug)]\n        struct RP(isize, Order);\n        impl RuntimePlugin for RP {\n            fn order(&self) -> Order {\n                self.1\n            }\n        }\n\n        fn insert_plugin(vec: &mut Vec<RP>, plugin: RP) {\n            insert_plugin!(vec, plugin);\n        }\n\n        let mut vec = Vec::new();\n        insert_plugin(&mut vec, RP(5, Order::NestedComponents));\n        insert_plugin(&mut vec, RP(3, Order::Overrides));\n        insert_plugin(&mut vec, RP(1, Order::Defaults));\n        insert_plugin(&mut vec, RP(6, Order::NestedComponents));\n        insert_plugin(&mut vec, RP(2, Order::Defaults));\n        insert_plugin(&mut vec, RP(4, Order::Overrides));\n        insert_plugin(&mut vec, RP(7, Order::NestedComponents));\n        assert_eq!(\n            vec![1, 2, 3, 4, 5, 6, 7],\n            vec.iter().map(|rp| rp.0).collect::<Vec<isize>>()\n        );\n\n        let mut vec = Vec::new();\n        insert_plugin(&mut vec, RP(3, Order::Overrides));\n        insert_plugin(&mut vec, RP(4, Order::Overrides));\n        insert_plugin(&mut vec, RP(5, Order::NestedComponents));\n        insert_plugin(&mut vec, RP(6, Order::NestedComponents));\n        insert_plugin(&mut vec, RP(7, Order::NestedComponents));\n        insert_plugin(&mut vec, RP(1, Order::Defaults));\n        insert_plugin(&mut vec, RP(2, Order::Defaults));\n        assert_eq!(\n            vec![1, 2, 3, 4, 5, 6, 7],\n            vec.iter().map(|rp| rp.0).collect::<Vec<isize>>()\n        );\n\n        let mut vec = Vec::new();\n        insert_plugin(&mut vec, RP(1, Order::Defaults));\n        insert_plugin(&mut vec, RP(2, Order::Defaults));\n        insert_plugin(&mut vec, RP(3, Order::Overrides));\n        insert_plugin(&mut vec, RP(4, Order::Overrides));\n        insert_plugin(&mut vec, RP(5, Order::NestedComponents));\n        insert_plugin(&mut vec, RP(6, Order::NestedComponents));\n        assert_eq!(\n            vec![1, 2, 3, 4, 5, 6],\n            vec.iter().map(|rp| rp.0).collect::<Vec<isize>>()\n        );\n    }\n\n    #[tokio::test]\n    async fn components_can_wrap_components() {\n        // Connector1, the inner connector, creates a response with a `rp1` header\n        #[derive(Debug)]\n        struct Connector1;\n        impl HttpConnector for Connector1 {\n            fn call(&self, _: HttpRequest) -> HttpConnectorFuture {\n                HttpConnectorFuture::new(async {\n                    Ok(http_02x::Response::builder()\n                        .status(200)\n                        .header(\"rp1\", \"1\")\n                        .body(SdkBody::empty())\n                        .unwrap()\n                        .try_into()\n                        .unwrap())\n                })\n            }\n        }\n\n        // Connector2, the outer connector, calls the inner connector and adds the `rp2` header to the response\n        #[derive(Debug)]\n        struct Connector2(SharedHttpConnector);\n        impl HttpConnector for Connector2 {\n            fn call(&self, request: HttpRequest) -> HttpConnectorFuture {\n                let inner = self.0.clone();\n                HttpConnectorFuture::new(async move {\n                    let mut resp = inner.call(request).await.unwrap();\n                    resp.headers_mut()\n                        .append(\"rp2\", HeaderValue::from_static(\"1\"));\n                    Ok(resp)\n                })\n            }\n        }\n\n        // Plugin1 registers Connector1\n        #[derive(Debug)]\n        struct Plugin1;\n        impl RuntimePlugin for Plugin1 {\n            fn order(&self) -> Order {\n                Order::Overrides\n            }\n\n            fn runtime_components(\n                &self,\n                _: &RuntimeComponentsBuilder,\n            ) -> Cow<'_, RuntimeComponentsBuilder> {\n                Cow::Owned(\n                    RuntimeComponentsBuilder::new(\"Plugin1\")\n                        .with_http_client(Some(http_client_fn(|_, _| Connector1.into_shared()))),\n                )\n            }\n        }\n\n        // Plugin2 registers Connector2\n        #[derive(Debug)]\n        struct Plugin2;\n        impl RuntimePlugin for Plugin2 {\n            fn order(&self) -> Order {\n                Order::NestedComponents\n            }\n\n            fn runtime_components(\n                &self,\n                current_components: &RuntimeComponentsBuilder,\n            ) -> Cow<'_, RuntimeComponentsBuilder> {\n                let current = current_components.http_client().unwrap();\n                Cow::Owned(\n                    RuntimeComponentsBuilder::new(\"Plugin2\").with_http_client(Some(\n                        http_client_fn(move |settings, components| {\n                            let connector = current.http_connector(settings, components);\n                            SharedHttpConnector::new(Connector2(connector))\n                        }),\n                    )),\n                )\n            }\n        }\n\n        // Emulate assembling a full runtime plugins list and using it to apply configuration\n        let plugins = RuntimePlugins::new()\n            // intentionally configure the plugins in the reverse order\n            .with_client_plugin(Plugin2)\n            .with_client_plugin(Plugin1);\n        let mut cfg = ConfigBag::base();\n        let components = plugins.apply_client_configuration(&mut cfg).unwrap();\n        let fake_components = RuntimeComponentsBuilder::for_tests().build().unwrap();\n\n        // Use the resulting HTTP connector to make a response\n        let resp = components\n            .http_client()\n            .unwrap()\n            .http_connector(&Default::default(), &fake_components)\n            .call(HttpRequest::empty())\n            .await\n            .unwrap();\n        dbg!(&resp);\n\n        // Verify headers from both connectors are present,\n        // which will only be possible if they were run in the correct order\n        assert_eq!(\"1\", resp.headers().get(\"rp1\").unwrap());\n        assert_eq!(\"1\", resp.headers().get(\"rp2\").unwrap());\n    }\n\n    #[test]\n    fn shared_runtime_plugin_new_specialization() {\n        #[derive(Debug)]\n        struct RP;\n        impl RuntimePlugin for RP {}\n\n        use crate::shared::IntoShared;\n        let shared1 = SharedRuntimePlugin::new(RP);\n        let shared2: SharedRuntimePlugin = shared1.clone().into_shared();\n        assert_eq!(\n            \"SharedRuntimePlugin(RP)\",\n            format!(\"{shared1:?}\"),\n            \"precondition: RP shows up in the debug format\"\n        );\n        assert_eq!(\n            format!(\"{shared1:?}\"),\n            format!(\"{shared2:?}\"),\n            \"it should not nest the shared runtime plugins\"\n        );\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime-api/src/client/ser_de.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Serialization/deserialization for the orchestrator.\n\nuse crate::box_error::BoxError;\nuse crate::client::interceptors::context::{Error, Input, Output};\nuse crate::client::orchestrator::{HttpRequest, HttpResponse, OrchestratorError};\nuse crate::impl_shared_conversions;\nuse aws_smithy_types::config_bag::{ConfigBag, Storable, StoreReplace};\nuse std::fmt;\nuse std::sync::Arc;\n\n/// Serialization implementation that converts an [`Input`] into an [`HttpRequest`].\npub trait SerializeRequest: Send + Sync + fmt::Debug {\n    /// Serializes the input into an HTTP request.\n    ///\n    /// The type of the [`Input`] must be known ahead of time by the request serializer\n    /// implementation, and must be downcasted to get access to the information necessary\n    /// for serialization.\n    ///\n    /// The request serializer is generally added to the [`ConfigBag`] by the operation's\n    /// code generated runtime plugin, which is aware of the correct input/output/error types.\n    fn serialize_input(&self, input: Input, cfg: &mut ConfigBag) -> Result<HttpRequest, BoxError>;\n}\n\n/// A shared request serializer.\n///\n/// This is a simple shared ownership wrapper type for the [`SerializeRequest`] trait.\n#[derive(Clone, Debug)]\npub struct SharedRequestSerializer(Arc<dyn SerializeRequest>);\n\nimpl SharedRequestSerializer {\n    /// Creates a new shared request serializer.\n    pub fn new(serializer: impl SerializeRequest + 'static) -> Self {\n        Self(Arc::new(serializer))\n    }\n}\n\nimpl SerializeRequest for SharedRequestSerializer {\n    fn serialize_input(&self, input: Input, cfg: &mut ConfigBag) -> Result<HttpRequest, BoxError> {\n        self.0.serialize_input(input, cfg)\n    }\n}\n\nimpl Storable for SharedRequestSerializer {\n    type Storer = StoreReplace<Self>;\n}\n\nimpl_shared_conversions!(convert SharedRequestSerializer from SerializeRequest using SharedRequestSerializer::new);\n\n/// Deserialization implementation that converts an [`HttpResponse`] into an [`Output`] or [`Error`].\npub trait DeserializeResponse: Send + Sync + fmt::Debug {\n    /// For streaming requests, deserializes the response headers.\n    ///\n    /// The orchestrator will call `deserialize_streaming` first, and if it returns `None`,\n    /// then it will continue onto `deserialize_nonstreaming`. This method should only be\n    /// implemented for streaming requests where the streaming response body needs to be a part\n    /// of the deserialized output.\n    fn deserialize_streaming(\n        &self,\n        response: &mut HttpResponse,\n    ) -> Option<Result<Output, OrchestratorError<Error>>> {\n        let _ = response;\n        None\n    }\n\n    /// Deserialize the entire response including its body into an output or error.\n    fn deserialize_nonstreaming(\n        &self,\n        response: &HttpResponse,\n    ) -> Result<Output, OrchestratorError<Error>>;\n}\n\n/// Shared response deserializer.\n///\n/// This is a simple shared ownership wrapper type for the [`DeserializeResponse`] trait.\n#[derive(Debug)]\npub struct SharedResponseDeserializer(Arc<dyn DeserializeResponse>);\n\nimpl SharedResponseDeserializer {\n    /// Creates a new [`SharedResponseDeserializer`].\n    pub fn new(serializer: impl DeserializeResponse + 'static) -> Self {\n        Self(Arc::new(serializer))\n    }\n}\n\nimpl DeserializeResponse for SharedResponseDeserializer {\n    fn deserialize_nonstreaming(\n        &self,\n        response: &HttpResponse,\n    ) -> Result<Output, OrchestratorError<Error>> {\n        self.0.deserialize_nonstreaming(response)\n    }\n\n    fn deserialize_streaming(\n        &self,\n        response: &mut HttpResponse,\n    ) -> Option<Result<Output, OrchestratorError<Error>>> {\n        self.0.deserialize_streaming(response)\n    }\n}\n\nimpl Storable for SharedResponseDeserializer {\n    type Storer = StoreReplace<Self>;\n}\n\nimpl_shared_conversions!(convert SharedResponseDeserializer from DeserializeResponse using SharedResponseDeserializer::new);\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime-api/src/client/stalled_stream_protection.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n#![allow(missing_docs)]\n\n//! Stalled stream protection.\n//!\n//! When enabled, upload and download streams that stall (stream no data) for\n//! longer than a configured grace period will return an error.\n\nuse aws_smithy_types::config_bag::{Storable, StoreReplace};\nuse std::time::Duration;\n\n/// The default grace period for stalled stream protection.\n///\n/// When a stream stalls for longer than this grace period, the stream will\n/// return an error.\npub const DEFAULT_GRACE_PERIOD: Duration = Duration::from_secs(20);\n\n/// Configuration for stalled stream protection.\n///\n/// When enabled, download streams that stall out will be cancelled.\n#[derive(Clone, Debug)]\npub struct StalledStreamProtectionConfig {\n    upload_enabled: bool,\n    download_enabled: bool,\n    grace_period: Duration,\n}\n\nimpl StalledStreamProtectionConfig {\n    /// Create a new config that enables stalled stream protection for both uploads and downloads.\n    pub fn enabled() -> Builder {\n        Builder {\n            upload_enabled: Some(true),\n            download_enabled: Some(true),\n            grace_period: None,\n        }\n    }\n\n    /// Create a new config that disables stalled stream protection.\n    pub fn disabled() -> Self {\n        Self {\n            upload_enabled: false,\n            download_enabled: false,\n            grace_period: DEFAULT_GRACE_PERIOD,\n        }\n    }\n\n    /// Return whether stalled stream protection is enabled for either uploads or downloads.\n    pub fn is_enabled(&self) -> bool {\n        self.upload_enabled || self.download_enabled\n    }\n\n    /// True if stalled stream protection is enabled for upload streams.\n    pub fn upload_enabled(&self) -> bool {\n        self.upload_enabled\n    }\n\n    /// True if stalled stream protection is enabled for download streams.\n    pub fn download_enabled(&self) -> bool {\n        self.download_enabled\n    }\n\n    /// Return the grace period for stalled stream protection.\n    ///\n    /// When a stream stalls for longer than this grace period, the stream will\n    /// return an error.\n    pub fn grace_period(&self) -> Duration {\n        self.grace_period\n    }\n}\n\n#[derive(Clone, Debug)]\npub struct Builder {\n    upload_enabled: Option<bool>,\n    download_enabled: Option<bool>,\n    grace_period: Option<Duration>,\n}\n\nimpl Builder {\n    /// Set the grace period for stalled stream protection.\n    pub fn grace_period(mut self, grace_period: Duration) -> Self {\n        self.grace_period = Some(grace_period);\n        self\n    }\n\n    /// Set the grace period for stalled stream protection.\n    pub fn set_grace_period(&mut self, grace_period: Option<Duration>) -> &mut Self {\n        self.grace_period = grace_period;\n        self\n    }\n\n    /// Set whether stalled stream protection is enabled for both uploads and downloads.\n    pub fn is_enabled(mut self, enabled: bool) -> Self {\n        self.set_is_enabled(Some(enabled));\n        self\n    }\n\n    /// Set whether stalled stream protection is enabled for both uploads and downloads.\n    pub fn set_is_enabled(&mut self, enabled: Option<bool>) -> &mut Self {\n        self.set_upload_enabled(enabled);\n        self.set_download_enabled(enabled);\n        self\n    }\n\n    /// Set whether stalled stream protection is enabled for upload streams.\n    pub fn upload_enabled(mut self, enabled: bool) -> Self {\n        self.set_upload_enabled(Some(enabled));\n        self\n    }\n\n    /// Set whether stalled stream protection is enabled for upload streams.\n    pub fn set_upload_enabled(&mut self, enabled: Option<bool>) -> &mut Self {\n        self.upload_enabled = enabled;\n        self\n    }\n\n    /// Set whether stalled stream protection is enabled for download streams.\n    pub fn download_enabled(mut self, enabled: bool) -> Self {\n        self.set_download_enabled(Some(enabled));\n        self\n    }\n\n    /// Set whether stalled stream protection is enabled for download streams.\n    pub fn set_download_enabled(&mut self, enabled: Option<bool>) -> &mut Self {\n        self.download_enabled = enabled;\n        self\n    }\n\n    /// Build the config.\n    pub fn build(self) -> StalledStreamProtectionConfig {\n        StalledStreamProtectionConfig {\n            upload_enabled: self.upload_enabled.unwrap_or_default(),\n            download_enabled: self.download_enabled.unwrap_or_default(),\n            grace_period: self.grace_period.unwrap_or(DEFAULT_GRACE_PERIOD),\n        }\n    }\n}\n\nimpl From<StalledStreamProtectionConfig> for Builder {\n    fn from(config: StalledStreamProtectionConfig) -> Self {\n        Builder {\n            upload_enabled: Some(config.upload_enabled),\n            download_enabled: Some(config.download_enabled),\n            grace_period: Some(config.grace_period),\n        }\n    }\n}\n\nimpl Storable for StalledStreamProtectionConfig {\n    type Storer = StoreReplace<Self>;\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime-api/src/client/waiters.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/// Error types for waiters.\npub mod error {\n    use crate::client::{\n        orchestrator::HttpResponse,\n        result::{ConstructionFailure, SdkError},\n    };\n    use crate::{box_error::BoxError, client::waiters::FinalPoll};\n    use aws_smithy_types::error::{\n        metadata::{ProvideErrorMetadata, EMPTY_ERROR_METADATA},\n        ErrorMetadata,\n    };\n    use std::{fmt, time::Duration};\n\n    /// An error occurred while waiting.\n    ///\n    /// This error type is useful for distinguishing between the max wait\n    /// time being exceeded, or some other failure occurring.\n    #[derive(Debug)]\n    #[non_exhaustive]\n    #[allow(clippy::large_enum_variant)] // For `OperationFailed` variant\n    pub enum WaiterError<O, E> {\n        /// An error occurred during waiter initialization.\n        ///\n        /// This can happen if the input/config is invalid.\n        ConstructionFailure(ConstructionFailure),\n\n        /// The maximum wait time was exceeded without completion.\n        ExceededMaxWait(ExceededMaxWait),\n\n        /// Waiting ended in a failure state.\n        ///\n        /// A failed waiter state can occur on a successful response from the server\n        /// if, for example, that response indicates that the thing being waited for\n        /// won't succeed/finish.\n        ///\n        /// A failure state error will only occur for successful or modeled error responses.\n        /// Unmodeled error responses will never make it into this error case.\n        FailureState(FailureState<O, E>),\n\n        /// A polling operation failed while waiting.\n        ///\n        /// This error will only occur for unmodeled errors. Modeled errors can potentially\n        /// be handled by the waiter logic, and will therefore end up in [`WaiterError::FailureState`].\n        ///\n        /// Note: If retry is configured, this means that the operation failed\n        /// after retrying the configured number of attempts.\n        OperationFailed(OperationFailed<E>),\n    }\n\n    impl<O, E> WaiterError<O, E> {\n        /// Construct a waiter construction failure with the given error source.\n        pub fn construction_failure(source: impl Into<BoxError>) -> Self {\n            Self::ConstructionFailure(ConstructionFailure::builder().source(source).build())\n        }\n    }\n\n    impl<O, E> std::error::Error for WaiterError<O, E>\n    where\n        O: fmt::Debug,\n        E: std::error::Error + fmt::Debug + 'static,\n    {\n        fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {\n            match self {\n                Self::ConstructionFailure(inner) => Some(&*inner.source),\n                Self::ExceededMaxWait(_) => None,\n                Self::FailureState(inner) => match &inner.final_poll.result {\n                    Ok(_) => None,\n                    Err(err) => Some(err),\n                },\n                Self::OperationFailed(inner) => Some(&inner.source),\n            }\n        }\n    }\n\n    impl<O, E> fmt::Display for WaiterError<O, E> {\n        fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n            match self {\n                Self::ConstructionFailure(_) => f.write_str(\"failed to construct waiter\"),\n                Self::ExceededMaxWait(ctx) => {\n                    write!(f, \"exceeded max wait time ({:?})\", ctx.max_wait)\n                }\n                Self::FailureState(_) => f.write_str(\"waiting failed\"),\n                Self::OperationFailed(_) => f.write_str(\"operation failed while waiting\"),\n            }\n        }\n    }\n\n    // Implement `ProvideErrorMetadata` so that request IDs can be discovered from waiter failures.\n    impl<O, E> ProvideErrorMetadata for WaiterError<O, E>\n    where\n        E: ProvideErrorMetadata,\n    {\n        fn meta(&self) -> &ErrorMetadata {\n            match self {\n                WaiterError::ConstructionFailure(_) | WaiterError::ExceededMaxWait(_) => {\n                    &EMPTY_ERROR_METADATA\n                }\n                WaiterError::FailureState(inner) => inner\n                    .final_poll()\n                    .as_result()\n                    .err()\n                    .map(ProvideErrorMetadata::meta)\n                    .unwrap_or(&EMPTY_ERROR_METADATA),\n                WaiterError::OperationFailed(inner) => inner.error().meta(),\n            }\n        }\n    }\n\n    /// Error context for [`WaiterError::ExceededMaxWait`].\n    #[derive(Debug)]\n    pub struct ExceededMaxWait {\n        max_wait: Duration,\n        elapsed: Duration,\n        poll_count: u32,\n    }\n\n    impl ExceededMaxWait {\n        /// Creates new error context.\n        pub fn new(max_wait: Duration, elapsed: Duration, poll_count: u32) -> Self {\n            Self {\n                max_wait,\n                elapsed,\n                poll_count,\n            }\n        }\n\n        /// Returns the configured max wait time that was exceeded.\n        pub fn max_wait(&self) -> Duration {\n            self.max_wait\n        }\n\n        /// How much time actually elapsed before max wait was triggered.\n        pub fn elapsed(&self) -> Duration {\n            self.elapsed\n        }\n\n        /// Returns the number of polling operations that were made before exceeding the max wait time.\n        pub fn poll_count(&self) -> u32 {\n            self.poll_count\n        }\n    }\n\n    /// Error context for [`WaiterError::FailureState`].\n    #[derive(Debug)]\n    #[non_exhaustive]\n    pub struct FailureState<O, E> {\n        final_poll: FinalPoll<O, E>,\n    }\n\n    impl<O, E> FailureState<O, E> {\n        /// Creates new error context given a final poll result.\n        pub fn new(final_poll: FinalPoll<O, E>) -> Self {\n            Self { final_poll }\n        }\n\n        /// Returns the result of the final polling attempt.\n        pub fn final_poll(&self) -> &FinalPoll<O, E> {\n            &self.final_poll\n        }\n\n        /// Grants ownership of the result of the final polling attempt.\n        pub fn into_final_poll(self) -> FinalPoll<O, E> {\n            self.final_poll\n        }\n    }\n\n    /// Error context for [`WaiterError::OperationFailed`].\n    #[derive(Debug)]\n    #[non_exhaustive]\n    pub struct OperationFailed<E> {\n        source: SdkError<E, HttpResponse>,\n    }\n\n    impl<E> OperationFailed<E> {\n        /// Creates new error context given a source [`SdkError`].\n        pub fn new(source: SdkError<E, HttpResponse>) -> Self {\n            Self { source }\n        }\n\n        /// Returns the underlying source [`SdkError`].\n        pub fn error(&self) -> &SdkError<E, HttpResponse> {\n            &self.source\n        }\n\n        /// Grants ownership of the underlying source [`SdkError`].\n        pub fn into_error(self) -> SdkError<E, HttpResponse> {\n            self.source\n        }\n    }\n}\n\n/// Result of the final polling attempt made by a waiter.\n///\n/// Waiters make several requests (\"polls\") to the remote service, and this\n/// struct holds the result of the final poll attempt that was made by the\n/// waiter so that it can be inspected.\n#[non_exhaustive]\n#[derive(Debug)]\npub struct FinalPoll<O, E> {\n    result: Result<O, E>,\n}\n\nimpl<O, E> FinalPoll<O, E> {\n    /// Creates a new `FinalPoll` from a result.\n    pub fn new(result: Result<O, E>) -> Self {\n        Self { result }\n    }\n\n    /// Grants ownership of the underlying result.\n    pub fn into_result(self) -> Result<O, E> {\n        self.result\n    }\n\n    /// Returns the underlying result.\n    pub fn as_result(&self) -> Result<&O, &E> {\n        self.result.as_ref()\n    }\n\n    /// Maps the operation type with a function.\n    pub fn map<O2, F: FnOnce(O) -> O2>(self, mapper: F) -> FinalPoll<O2, E> {\n        FinalPoll::new(self.result.map(mapper))\n    }\n\n    /// Maps the error type with a function.\n    pub fn map_err<E2, F: FnOnce(E) -> E2>(self, mapper: F) -> FinalPoll<O, E2> {\n        FinalPoll::new(self.result.map_err(mapper))\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime-api/src/client.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/// Declares a new-type for a future that is returned from an async trait (prior to stable async trait).\n///\n/// To declare a future with a static lifetime:\n/// ```ignore\n/// new_type_future! {\n///     doc = \"some rustdoc for the future's struct\",\n///     pub struct NameOfFuture<'static, OutputType, ErrorType>;\n/// }\n/// ```\n///\n/// To declare a future with a non-static lifetime:\n/// ```ignore\n/// new_type_future! {\n///     doc = \"some rustdoc for the future's struct\",\n///     pub struct NameOfFuture<'a, OutputType, ErrorType>;\n/// }\n/// ```\nmacro_rules! new_type_future {\n    (\n        #[doc = $type_docs:literal]\n        pub struct $future_name:ident<'static, $output:ty, $err:ty>;\n    ) => {\n        new_type_future!(@internal, $type_docs, $future_name, $output, $err, 'static,);\n    };\n    (\n        #[doc = $type_docs:literal]\n        pub struct $future_name:ident<$lifetime:lifetime, $output:ty, $err:ty>;\n    ) => {\n        new_type_future!(@internal, $type_docs, $future_name, $output, $err, $lifetime, <$lifetime>);\n    };\n    (@internal, $type_docs:literal, $future_name:ident, $output:ty, $err:ty, $lifetime:lifetime, $($decl_lifetime:tt)*) => {\n        pin_project_lite::pin_project! {\n            #[allow(clippy::type_complexity)]\n            #[doc = $type_docs]\n            pub struct $future_name$($decl_lifetime)* {\n                #[pin]\n                inner: aws_smithy_async::future::now_or_later::NowOrLater<\n                    Result<$output, $err>,\n                    aws_smithy_async::future::BoxFuture<$lifetime, $output, $err>\n                >,\n            }\n        }\n\n        impl$($decl_lifetime)* $future_name$($decl_lifetime)* {\n            #[doc = concat!(\"Create a new `\", stringify!($future_name), \"` with the given future.\")]\n            pub fn new<F>(future: F) -> Self\n            where\n                F: std::future::Future<Output = Result<$output, $err>> + Send + $lifetime,\n            {\n                Self {\n                    inner: aws_smithy_async::future::now_or_later::NowOrLater::new(Box::pin(future)),\n                }\n            }\n\n            #[doc = concat!(\"\n            Create a new `\", stringify!($future_name), \"` with the given boxed future.\n\n            Use this if you already have a boxed future to avoid double boxing it.\n            \")]\n            pub fn new_boxed(\n                future: std::pin::Pin<\n                    Box<dyn std::future::Future<Output = Result<$output, $err>> + Send + $lifetime>,\n                >,\n            ) -> Self {\n                Self {\n                    inner: aws_smithy_async::future::now_or_later::NowOrLater::new(future),\n                }\n            }\n\n            #[doc = concat!(\"Create a `\", stringify!($future_name), \"` that is immediately ready with the given result.\")]\n            pub fn ready(result: Result<$output, $err>) -> Self {\n                Self {\n                    inner: aws_smithy_async::future::now_or_later::NowOrLater::ready(result),\n                }\n            }\n        }\n\n        impl$($decl_lifetime)* std::future::Future for $future_name$($decl_lifetime)* {\n            type Output = Result<$output, $err>;\n\n            fn poll(self: std::pin::Pin<&mut Self>, cx: &mut std::task::Context<'_>) -> std::task::Poll<Self::Output> {\n                let this = self.project();\n                this.inner.poll(cx)\n            }\n        }\n    };\n}\n\npub mod auth;\n\npub mod connection;\n\npub mod connector_metadata;\n\npub mod dns;\n\npub mod endpoint;\n\npub mod http;\n\n/// Smithy identity used by auth and signing.\npub mod identity;\n\npub mod interceptors;\n\npub mod orchestrator;\n\npub mod result;\n\npub mod retries;\n\npub mod runtime_components;\n\npub mod runtime_plugin;\n\npub mod behavior_version;\n\npub mod ser_de;\n\npub mod stalled_stream_protection;\n\n/// Smithy support-code for code generated waiters.\npub mod waiters;\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime-api/src/http/error.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Error types for HTTP requests/responses.\n\nuse crate::box_error::BoxError;\nuse http_02x::header::{InvalidHeaderName, InvalidHeaderValue};\nuse http_02x::uri::InvalidUri;\nuse std::error::Error;\nuse std::fmt::{Debug, Display, Formatter};\nuse std::str::Utf8Error;\n\n#[derive(Debug)]\n/// An error occurred constructing an Http Request.\n///\n/// This is normally due to configuration issues, internal SDK bugs, or other user error.\npub struct HttpError {\n    kind: Kind,\n    source: Option<BoxError>,\n}\n\n#[derive(Debug)]\nenum Kind {\n    InvalidExtensions,\n    InvalidHeaderName,\n    InvalidHeaderValue,\n    InvalidStatusCode,\n    InvalidUri,\n    InvalidUriParts,\n    MissingAuthority,\n    MissingScheme,\n    NonUtf8Header(NonUtf8Header),\n}\n\n#[derive(Debug)]\npub(super) struct NonUtf8Header {\n    error: Utf8Error,\n    value: Vec<u8>,\n    name: Option<String>,\n}\n\nimpl NonUtf8Header {\n    #[cfg(any(feature = \"http-1x\", feature = \"http-02x\"))]\n    pub(super) fn new(name: String, value: Vec<u8>, error: Utf8Error) -> Self {\n        Self {\n            error,\n            value,\n            name: Some(name),\n        }\n    }\n\n    pub(super) fn new_missing_name(value: Vec<u8>, error: Utf8Error) -> Self {\n        Self {\n            error,\n            value,\n            name: None,\n        }\n    }\n}\n\nimpl HttpError {\n    pub(super) fn invalid_extensions() -> Self {\n        Self {\n            kind: Kind::InvalidExtensions,\n            source: None,\n        }\n    }\n\n    pub(super) fn invalid_header_name(err: InvalidHeaderName) -> Self {\n        Self {\n            kind: Kind::InvalidHeaderName,\n            source: Some(Box::new(err)),\n        }\n    }\n\n    pub(super) fn invalid_header_value(err: InvalidHeaderValue) -> Self {\n        Self {\n            kind: Kind::InvalidHeaderValue,\n            source: Some(Box::new(err)),\n        }\n    }\n\n    pub(super) fn invalid_status_code() -> Self {\n        Self {\n            kind: Kind::InvalidStatusCode,\n            source: None,\n        }\n    }\n\n    pub(super) fn invalid_uri(err: InvalidUri) -> Self {\n        Self {\n            kind: Kind::InvalidUri,\n            source: Some(Box::new(err)),\n        }\n    }\n\n    pub(super) fn invalid_uri_parts(err: http_02x::Error) -> Self {\n        Self {\n            kind: Kind::InvalidUriParts,\n            source: Some(Box::new(err)),\n        }\n    }\n\n    pub(super) fn missing_authority() -> Self {\n        Self {\n            kind: Kind::MissingAuthority,\n            source: None,\n        }\n    }\n\n    pub(super) fn missing_scheme() -> Self {\n        Self {\n            kind: Kind::MissingScheme,\n            source: None,\n        }\n    }\n\n    pub(super) fn non_utf8_header(non_utf8_header: NonUtf8Header) -> Self {\n        Self {\n            kind: Kind::NonUtf8Header(non_utf8_header),\n            source: None,\n        }\n    }\n}\n\nimpl Display for HttpError {\n    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {\n        use Kind::*;\n        match &self.kind {\n            InvalidExtensions => write!(f, \"Extensions were provided during initialization. This prevents the request format from being converted.\"),\n            InvalidHeaderName => write!(f, \"invalid header name\"),\n            InvalidHeaderValue => write!(f, \"invalid header value\"),\n            InvalidStatusCode => write!(f, \"invalid HTTP status code\"),\n            InvalidUri => write!(f, \"endpoint is not a valid URI\"),\n            InvalidUriParts => write!(f, \"endpoint parts are not valid\"),\n            MissingAuthority => write!(f, \"endpoint must contain authority\"),\n            MissingScheme => write!(f, \"endpoint must contain scheme\"),\n            NonUtf8Header(hv) => {\n                // In some cases, we won't know the key so we default to \"<unknown>\".\n                let key = hv.name.as_deref().unwrap_or(\"<unknown>\");\n                let value = String::from_utf8_lossy(&hv.value);\n                let index = hv.error.valid_up_to();\n                write!(f, \"header `{key}={value}` contains non-UTF8 octet at index {index}\")\n            },\n        }\n    }\n}\n\nimpl Error for HttpError {\n    fn source(&self) -> Option<&(dyn Error + 'static)> {\n        self.source.as_ref().map(|err| err.as_ref() as _)\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime-api/src/http/extensions.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::http::HttpError;\n\n#[derive(Default, Debug)]\npub(crate) struct Extensions {\n    extensions_02x: http_02x::Extensions,\n    extensions_1x: http_1x::Extensions,\n}\n\nimpl Extensions {\n    pub(crate) fn new() -> Self {\n        Self::default()\n    }\n\n    /// Adds an extension to the request extensions\n    pub(crate) fn insert<T: Send + Sync + Clone + 'static>(&mut self, extension: T) {\n        self.extensions_1x.insert(extension.clone());\n        self.extensions_02x.insert(extension);\n    }\n}\n\nimpl From<http_02x::Extensions> for Extensions {\n    fn from(value: http_02x::Extensions) -> Self {\n        Self {\n            extensions_02x: value,\n            extensions_1x: Default::default(),\n        }\n    }\n}\n\nimpl From<http_1x::Extensions> for Extensions {\n    fn from(value: http_1x::Extensions) -> Self {\n        Self {\n            extensions_02x: Default::default(),\n            extensions_1x: value,\n        }\n    }\n}\n\nimpl TryFrom<Extensions> for http_02x::Extensions {\n    type Error = HttpError;\n\n    fn try_from(value: Extensions) -> Result<Self, Self::Error> {\n        if value.extensions_1x.len() > value.extensions_02x.len() {\n            Err(HttpError::invalid_extensions())\n        } else {\n            Ok(value.extensions_02x)\n        }\n    }\n}\n\nimpl TryFrom<Extensions> for http_1x::Extensions {\n    type Error = HttpError;\n\n    fn try_from(value: Extensions) -> Result<Self, Self::Error> {\n        if value.extensions_02x.len() > value.extensions_1x.len() {\n            Err(HttpError::invalid_extensions())\n        } else {\n            Ok(value.extensions_1x)\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime-api/src/http/headers.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Types for HTTP headers\n\nuse crate::http::error::{HttpError, NonUtf8Header};\nuse std::borrow::Cow;\nuse std::fmt::Debug;\nuse std::str::FromStr;\n\n/// An immutable view of headers\n#[derive(Clone, Default, Debug)]\npub struct Headers {\n    pub(super) headers: http_02x::HeaderMap<HeaderValue>,\n}\n\nimpl<'a> IntoIterator for &'a Headers {\n    type Item = (&'a str, &'a str);\n    type IntoIter = HeadersIter<'a>;\n\n    fn into_iter(self) -> Self::IntoIter {\n        HeadersIter {\n            inner: self.headers.iter(),\n        }\n    }\n}\n\n/// An Iterator over headers\npub struct HeadersIter<'a> {\n    inner: http_02x::header::Iter<'a, HeaderValue>,\n}\n\nimpl<'a> Iterator for HeadersIter<'a> {\n    type Item = (&'a str, &'a str);\n\n    fn next(&mut self) -> Option<Self::Item> {\n        self.inner.next().map(|(k, v)| (k.as_str(), v.as_ref()))\n    }\n}\n\nimpl Headers {\n    /// Create an empty header map\n    pub fn new() -> Self {\n        Self::default()\n    }\n\n    #[cfg(feature = \"http-1x\")]\n    pub(crate) fn http1_headermap(self) -> http_1x::HeaderMap {\n        let mut headers = http_1x::HeaderMap::new();\n        headers.reserve(self.headers.len());\n        headers.extend(self.headers.into_iter().map(|(k, v)| {\n            (\n                k.map(|n| {\n                    http_1x::HeaderName::from_bytes(n.as_str().as_bytes()).expect(\"proven valid\")\n                }),\n                v.into_http1x(),\n            )\n        }));\n        headers\n    }\n\n    #[cfg(feature = \"http-02x\")]\n    pub(crate) fn http0_headermap(self) -> http_02x::HeaderMap {\n        let mut headers = http_02x::HeaderMap::new();\n        headers.reserve(self.headers.len());\n        headers.extend(self.headers.into_iter().map(|(k, v)| (k, v.into_http02x())));\n        headers\n    }\n\n    /// Returns the value for a given key\n    ///\n    /// If multiple values are associated, the first value is returned\n    /// See [HeaderMap::get](http_02x::HeaderMap::get)\n    pub fn get(&self, key: impl AsRef<str>) -> Option<&str> {\n        self.headers.get(key.as_ref()).map(|v| v.as_ref())\n    }\n\n    /// Returns all values for a given key\n    pub fn get_all(&self, key: impl AsRef<str>) -> impl Iterator<Item = &str> {\n        self.headers\n            .get_all(key.as_ref())\n            .iter()\n            .map(|v| v.as_ref())\n    }\n\n    /// Returns an iterator over the headers\n    pub fn iter(&self) -> HeadersIter<'_> {\n        HeadersIter {\n            inner: self.headers.iter(),\n        }\n    }\n\n    /// Returns the total number of **values** stored in the map\n    pub fn len(&self) -> usize {\n        self.headers.len()\n    }\n\n    /// Returns true if there are no headers\n    pub fn is_empty(&self) -> bool {\n        self.len() == 0\n    }\n\n    /// Returns true if this header is present\n    pub fn contains_key(&self, key: impl AsRef<str>) -> bool {\n        self.headers.contains_key(key.as_ref())\n    }\n\n    /// Insert a value into the headers structure.\n    ///\n    /// This will *replace* any existing value for this key. Returns the previous associated value if any.\n    ///\n    /// # Panics\n    /// If the key is not valid ASCII, or if the value is not valid UTF-8, this function will panic.\n    pub fn insert(\n        &mut self,\n        key: impl AsHeaderComponent,\n        value: impl AsHeaderComponent,\n    ) -> Option<String> {\n        let key = header_name(key, false).unwrap();\n        let value = header_value(value.into_maybe_static().unwrap(), false).unwrap();\n        self.headers\n            .insert(key, value)\n            .map(|old_value| old_value.into())\n    }\n\n    /// Insert a value into the headers structure.\n    ///\n    /// This will *replace* any existing value for this key. Returns the previous associated value if any.\n    ///\n    /// If the key is not valid ASCII, or if the value is not valid UTF-8, this function will return an error.\n    pub fn try_insert(\n        &mut self,\n        key: impl AsHeaderComponent,\n        value: impl AsHeaderComponent,\n    ) -> Result<Option<String>, HttpError> {\n        let key = header_name(key, true)?;\n        let value = header_value(value.into_maybe_static()?, true)?;\n        Ok(self\n            .headers\n            .insert(key, value)\n            .map(|old_value| old_value.into()))\n    }\n\n    /// Appends a value to a given key\n    ///\n    /// # Panics\n    /// If the key is not valid ASCII, or if the value is not valid UTF-8, this function will panic.\n    pub fn append(&mut self, key: impl AsHeaderComponent, value: impl AsHeaderComponent) -> bool {\n        let key = header_name(key.into_maybe_static().unwrap(), false).unwrap();\n        let value = header_value(value.into_maybe_static().unwrap(), false).unwrap();\n        self.headers.append(key, value)\n    }\n\n    /// Appends a value to a given key\n    ///\n    /// If the key is not valid ASCII, or if the value is not valid UTF-8, this function will return an error.\n    pub fn try_append(\n        &mut self,\n        key: impl AsHeaderComponent,\n        value: impl AsHeaderComponent,\n    ) -> Result<bool, HttpError> {\n        let key = header_name(key.into_maybe_static()?, true)?;\n        let value = header_value(value.into_maybe_static()?, true)?;\n        Ok(self.headers.append(key, value))\n    }\n\n    /// Removes all headers with a given key\n    ///\n    /// If there are multiple entries for this key, the first entry is returned\n    pub fn remove(&mut self, key: impl AsRef<str>) -> Option<String> {\n        self.headers\n            .remove(key.as_ref())\n            .map(|h| h.as_str().to_string())\n    }\n}\n\n#[cfg(feature = \"http-02x\")]\nimpl TryFrom<http_02x::HeaderMap> for Headers {\n    type Error = HttpError;\n\n    fn try_from(value: http_02x::HeaderMap) -> Result<Self, Self::Error> {\n        if let Some(utf8_error) = value.iter().find_map(|(k, v)| {\n            std::str::from_utf8(v.as_bytes())\n                .err()\n                .map(|err| NonUtf8Header::new(k.as_str().to_owned(), v.as_bytes().to_vec(), err))\n        }) {\n            Err(HttpError::non_utf8_header(utf8_error))\n        } else {\n            let mut string_safe_headers: http_02x::HeaderMap<HeaderValue> = Default::default();\n            string_safe_headers.extend(\n                value\n                    .into_iter()\n                    .map(|(k, v)| (k, HeaderValue::from_http02x(v).expect(\"validated above\"))),\n            );\n            Ok(Headers {\n                headers: string_safe_headers,\n            })\n        }\n    }\n}\n\n#[cfg(feature = \"http-1x\")]\nimpl TryFrom<http_1x::HeaderMap> for Headers {\n    type Error = HttpError;\n\n    fn try_from(value: http_1x::HeaderMap) -> Result<Self, Self::Error> {\n        if let Some(utf8_error) = value.iter().find_map(|(k, v)| {\n            std::str::from_utf8(v.as_bytes())\n                .err()\n                .map(|err| NonUtf8Header::new(k.as_str().to_owned(), v.as_bytes().to_vec(), err))\n        }) {\n            Err(HttpError::non_utf8_header(utf8_error))\n        } else {\n            let mut string_safe_headers: http_02x::HeaderMap<HeaderValue> = Default::default();\n            string_safe_headers.extend(value.into_iter().map(|(k, v)| {\n                (\n                    k.map(|v| {\n                        http_02x::HeaderName::from_bytes(v.as_str().as_bytes())\n                            .expect(\"known valid\")\n                    }),\n                    HeaderValue::from_http1x(v).expect(\"validated above\"),\n                )\n            }));\n            Ok(Headers {\n                headers: string_safe_headers,\n            })\n        }\n    }\n}\n\nuse sealed::AsHeaderComponent;\n\nmod sealed {\n    use super::*;\n    /// Trait defining things that may be converted into a header component (name or value)\n    pub trait AsHeaderComponent {\n        /// If the component can be represented as a Cow<'static, str>, return it\n        fn into_maybe_static(self) -> Result<MaybeStatic, HttpError>;\n\n        /// Return a string reference to this header\n        fn as_str(&self) -> Result<&str, HttpError>;\n\n        /// If a component is already internally represented as a `http02x::HeaderName`, return it\n        fn repr_as_http02x_header_name(self) -> Result<http_02x::HeaderName, Self>\n        where\n            Self: Sized,\n        {\n            Err(self)\n        }\n    }\n\n    impl AsHeaderComponent for &'static str {\n        fn into_maybe_static(self) -> Result<MaybeStatic, HttpError> {\n            Ok(Cow::Borrowed(self))\n        }\n\n        fn as_str(&self) -> Result<&str, HttpError> {\n            Ok(self)\n        }\n    }\n\n    impl AsHeaderComponent for String {\n        fn into_maybe_static(self) -> Result<MaybeStatic, HttpError> {\n            Ok(Cow::Owned(self))\n        }\n\n        fn as_str(&self) -> Result<&str, HttpError> {\n            Ok(self)\n        }\n    }\n\n    impl AsHeaderComponent for Cow<'static, str> {\n        fn into_maybe_static(self) -> Result<MaybeStatic, HttpError> {\n            Ok(self)\n        }\n\n        fn as_str(&self) -> Result<&str, HttpError> {\n            Ok(self.as_ref())\n        }\n    }\n\n    impl AsHeaderComponent for http_02x::HeaderValue {\n        fn into_maybe_static(self) -> Result<MaybeStatic, HttpError> {\n            Ok(Cow::Owned(\n                std::str::from_utf8(self.as_bytes())\n                    .map_err(|err| {\n                        HttpError::non_utf8_header(NonUtf8Header::new_missing_name(\n                            self.as_bytes().to_vec(),\n                            err,\n                        ))\n                    })?\n                    .to_string(),\n            ))\n        }\n\n        fn as_str(&self) -> Result<&str, HttpError> {\n            std::str::from_utf8(self.as_bytes()).map_err(|err| {\n                HttpError::non_utf8_header(NonUtf8Header::new_missing_name(\n                    self.as_bytes().to_vec(),\n                    err,\n                ))\n            })\n        }\n    }\n\n    impl AsHeaderComponent for http_02x::HeaderName {\n        fn into_maybe_static(self) -> Result<MaybeStatic, HttpError> {\n            Ok(self.to_string().into())\n        }\n\n        fn as_str(&self) -> Result<&str, HttpError> {\n            Ok(self.as_ref())\n        }\n\n        fn repr_as_http02x_header_name(self) -> Result<http_02x::HeaderName, Self>\n        where\n            Self: Sized,\n        {\n            Ok(self)\n        }\n    }\n\n    #[cfg(feature = \"http-1x\")]\n    impl AsHeaderComponent for http_1x::HeaderName {\n        fn into_maybe_static(self) -> Result<MaybeStatic, HttpError> {\n            Ok(self.to_string().into())\n        }\n\n        fn as_str(&self) -> Result<&str, HttpError> {\n            Ok(self.as_ref())\n        }\n    }\n\n    #[cfg(feature = \"http-1x\")]\n    impl AsHeaderComponent for http_1x::HeaderValue {\n        fn into_maybe_static(self) -> Result<MaybeStatic, HttpError> {\n            Ok(Cow::Owned(\n                std::str::from_utf8(self.as_bytes())\n                    .map_err(|err| {\n                        HttpError::non_utf8_header(NonUtf8Header::new_missing_name(\n                            self.as_bytes().to_vec(),\n                            err,\n                        ))\n                    })?\n                    .to_string(),\n            ))\n        }\n\n        fn as_str(&self) -> Result<&str, HttpError> {\n            std::str::from_utf8(self.as_bytes()).map_err(|err| {\n                HttpError::non_utf8_header(NonUtf8Header::new_missing_name(\n                    self.as_bytes().to_vec(),\n                    err,\n                ))\n            })\n        }\n    }\n}\n\nmod header_value {\n    use super::*;\n\n    /// HeaderValue type\n    ///\n    /// **Note**: Unlike `HeaderValue` in `http`, this only supports UTF-8 header values\n    #[derive(Debug, Clone)]\n    pub struct HeaderValue {\n        _private: Inner,\n    }\n\n    #[derive(Debug, Clone)]\n    enum Inner {\n        H0(http_02x::HeaderValue),\n        #[allow(dead_code)]\n        H1(http_1x::HeaderValue),\n    }\n\n    impl HeaderValue {\n        #[allow(dead_code)]\n        pub(crate) fn from_http02x(value: http_02x::HeaderValue) -> Result<Self, HttpError> {\n            let _ = std::str::from_utf8(value.as_bytes()).map_err(|err| {\n                HttpError::non_utf8_header(NonUtf8Header::new_missing_name(\n                    value.as_bytes().to_vec(),\n                    err,\n                ))\n            })?;\n            Ok(Self {\n                _private: Inner::H0(value),\n            })\n        }\n\n        #[allow(dead_code)]\n        pub(crate) fn from_http1x(value: http_1x::HeaderValue) -> Result<Self, HttpError> {\n            let _ = std::str::from_utf8(value.as_bytes()).map_err(|err| {\n                HttpError::non_utf8_header(NonUtf8Header::new_missing_name(\n                    value.as_bytes().to_vec(),\n                    err,\n                ))\n            })?;\n            Ok(Self {\n                _private: Inner::H1(value),\n            })\n        }\n\n        #[allow(dead_code)]\n        pub(crate) fn into_http02x(self) -> http_02x::HeaderValue {\n            match self._private {\n                Inner::H0(v) => v,\n                Inner::H1(v) => http_02x::HeaderValue::from_maybe_shared(v).expect(\"unreachable\"),\n            }\n        }\n\n        #[allow(dead_code)]\n        pub(crate) fn into_http1x(self) -> http_1x::HeaderValue {\n            match self._private {\n                Inner::H1(v) => v,\n                Inner::H0(v) => http_1x::HeaderValue::from_maybe_shared(v).expect(\"unreachable\"),\n            }\n        }\n    }\n\n    impl AsRef<str> for HeaderValue {\n        fn as_ref(&self) -> &str {\n            let bytes = match &self._private {\n                Inner::H0(v) => v.as_bytes(),\n                Inner::H1(v) => v.as_bytes(),\n            };\n            std::str::from_utf8(bytes).expect(\"unreachable—only strings may be stored\")\n        }\n    }\n\n    impl From<HeaderValue> for String {\n        fn from(value: HeaderValue) -> Self {\n            value.as_ref().to_string()\n        }\n    }\n\n    impl HeaderValue {\n        /// Returns the string representation of this header value\n        pub fn as_str(&self) -> &str {\n            self.as_ref()\n        }\n    }\n\n    impl FromStr for HeaderValue {\n        type Err = HttpError;\n\n        fn from_str(s: &str) -> Result<Self, Self::Err> {\n            HeaderValue::try_from(s.to_string())\n        }\n    }\n\n    impl TryFrom<String> for HeaderValue {\n        type Error = HttpError;\n\n        fn try_from(value: String) -> Result<Self, Self::Error> {\n            Ok(HeaderValue::from_http02x(\n                http_02x::HeaderValue::try_from(value).map_err(HttpError::invalid_header_value)?,\n            )\n            .expect(\"input was a string\"))\n        }\n    }\n}\n\npub use header_value::HeaderValue;\n\ntype MaybeStatic = Cow<'static, str>;\n\nfn header_name(\n    name: impl AsHeaderComponent,\n    panic_safe: bool,\n) -> Result<http_02x::HeaderName, HttpError> {\n    name.repr_as_http02x_header_name().or_else(|name| {\n        name.into_maybe_static().and_then(|mut cow| {\n            if cow.chars().any(|c| c.is_ascii_uppercase()) {\n                cow = Cow::Owned(cow.to_ascii_uppercase());\n            }\n            match cow {\n                Cow::Borrowed(s) if panic_safe => {\n                    http_02x::HeaderName::try_from(s).map_err(HttpError::invalid_header_name)\n                }\n                Cow::Borrowed(static_s) => Ok(http_02x::HeaderName::from_static(static_s)),\n                Cow::Owned(s) => {\n                    http_02x::HeaderName::try_from(s).map_err(HttpError::invalid_header_name)\n                }\n            }\n        })\n    })\n}\n\nfn header_value(value: MaybeStatic, panic_safe: bool) -> Result<HeaderValue, HttpError> {\n    let header = match value {\n        Cow::Borrowed(b) if panic_safe => {\n            http_02x::HeaderValue::try_from(b).map_err(HttpError::invalid_header_value)?\n        }\n        Cow::Borrowed(b) => http_02x::HeaderValue::from_static(b),\n        Cow::Owned(s) => {\n            http_02x::HeaderValue::try_from(s).map_err(HttpError::invalid_header_value)?\n        }\n    };\n    HeaderValue::from_http02x(header)\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n\n    #[test]\n    fn headers_can_be_any_string() {\n        let _: HeaderValue = \"😹\".parse().expect(\"can be any string\");\n        let _: HeaderValue = \"abcd\".parse().expect(\"can be any string\");\n        let _ = \"a\\nb\"\n            .parse::<HeaderValue>()\n            .expect_err(\"cannot contain control characters\");\n    }\n\n    #[test]\n    fn no_panic_insert_upper_case_header_name() {\n        let mut headers = Headers::new();\n        headers.insert(\"I-Have-Upper-Case\", \"foo\");\n    }\n    #[test]\n    fn no_panic_append_upper_case_header_name() {\n        let mut headers = Headers::new();\n        headers.append(\"I-Have-Upper-Case\", \"foo\");\n    }\n\n    #[test]\n    #[should_panic]\n    fn panic_insert_invalid_ascii_key() {\n        let mut headers = Headers::new();\n        headers.insert(\"💩\", \"foo\");\n    }\n    #[test]\n    #[should_panic]\n    fn panic_insert_invalid_header_value() {\n        let mut headers = Headers::new();\n        headers.insert(\"foo\", \"💩\");\n    }\n    #[test]\n    #[should_panic]\n    fn panic_append_invalid_ascii_key() {\n        let mut headers = Headers::new();\n        headers.append(\"💩\", \"foo\");\n    }\n    #[test]\n    #[should_panic]\n    fn panic_append_invalid_header_value() {\n        let mut headers = Headers::new();\n        headers.append(\"foo\", \"💩\");\n    }\n\n    #[test]\n    fn no_panic_try_insert_invalid_ascii_key() {\n        let mut headers = Headers::new();\n        assert!(headers.try_insert(\"💩\", \"foo\").is_err());\n    }\n    #[test]\n    fn no_panic_try_insert_invalid_header_value() {\n        let mut headers = Headers::new();\n        assert!(headers\n            .try_insert(\n                \"foo\",\n                // Valid header value with invalid UTF-8\n                http_02x::HeaderValue::from_bytes(&[0xC0, 0x80]).unwrap()\n            )\n            .is_err());\n    }\n    #[test]\n    fn no_panic_try_append_invalid_ascii_key() {\n        let mut headers = Headers::new();\n        assert!(headers.try_append(\"💩\", \"foo\").is_err());\n    }\n    #[test]\n    fn no_panic_try_append_invalid_header_value() {\n        let mut headers = Headers::new();\n        assert!(headers\n            .try_insert(\n                \"foo\",\n                // Valid header value with invalid UTF-8\n                http_02x::HeaderValue::from_bytes(&[0xC0, 0x80]).unwrap()\n            )\n            .is_err());\n    }\n\n    proptest::proptest! {\n        #[test]\n        fn insert_header_prop_test(input in \".*\") {\n            let mut headers = Headers::new();\n            let _ = headers.try_insert(input.clone(), input);\n        }\n\n        #[test]\n        fn append_header_prop_test(input in \".*\") {\n            let mut headers = Headers::new();\n            let _ = headers.try_append(input.clone(), input);\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime-api/src/http/request.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Http Request Types\n\nuse crate::http::extensions::Extensions;\nuse crate::http::Headers;\nuse crate::http::HttpError;\nuse aws_smithy_types::body::SdkBody;\nuse std::borrow::Cow;\n\n/// Parts struct useful for structural decomposition that the [`Request`] type can be converted into.\n#[non_exhaustive]\npub struct RequestParts<B = SdkBody> {\n    /// Request URI.\n    pub uri: Uri,\n    /// Request headers.\n    pub headers: Headers,\n    /// Request body.\n    pub body: B,\n}\n\n#[derive(Debug)]\n/// An HTTP Request Type\npub struct Request<B = SdkBody> {\n    body: B,\n    uri: Uri,\n    method: http_02x::Method,\n    extensions: Extensions,\n    headers: Headers,\n}\n\n/// A Request URI\n#[derive(Debug, Clone)]\npub struct Uri {\n    as_string: String,\n    parsed: ParsedUri,\n}\n\n#[derive(Debug, Clone)]\nenum ParsedUri {\n    H0(http_02x::Uri),\n    H1(http_1x::Uri),\n}\n\nimpl ParsedUri {\n    fn path_and_query(&self) -> &str {\n        match &self {\n            ParsedUri::H0(u) => u.path_and_query().map(|pq| pq.as_str()).unwrap_or(\"\"),\n            ParsedUri::H1(u) => u.path_and_query().map(|pq| pq.as_str()).unwrap_or(\"\"),\n        }\n    }\n\n    fn path(&self) -> &str {\n        match &self {\n            ParsedUri::H0(u) => u.path(),\n            ParsedUri::H1(u) => u.path(),\n        }\n    }\n\n    fn query(&self) -> Option<&str> {\n        match &self {\n            ParsedUri::H0(u) => u.query(),\n            ParsedUri::H1(u) => u.query(),\n        }\n    }\n}\n\nimpl Uri {\n    /// Sets `endpoint` as the endpoint for a URL.\n    ///\n    /// An `endpoint` MUST contain a scheme and authority.\n    /// An `endpoint` MAY contain a port and path.\n    ///\n    /// An `endpoint` MUST NOT contain a query\n    pub fn set_endpoint(&mut self, endpoint: &str) -> Result<(), HttpError> {\n        let endpoint: http_02x::Uri = endpoint.parse().map_err(HttpError::invalid_uri)?;\n        let endpoint = endpoint.into_parts();\n        let authority = endpoint\n            .authority\n            .ok_or_else(HttpError::missing_authority)?;\n        let scheme = endpoint.scheme.ok_or_else(HttpError::missing_scheme)?;\n        let new_uri = http_02x::Uri::builder()\n            .authority(authority)\n            .scheme(scheme)\n            .path_and_query(merge_paths(endpoint.path_and_query, &self.parsed).as_ref())\n            .build()\n            .map_err(HttpError::invalid_uri_parts)?;\n        self.as_string = new_uri.to_string();\n        self.parsed = ParsedUri::H0(new_uri);\n        Ok(())\n    }\n\n    /// Returns the URI path.\n    pub fn path(&self) -> &str {\n        self.parsed.path()\n    }\n\n    /// Returns the URI query string.\n    pub fn query(&self) -> Option<&str> {\n        self.parsed.query()\n    }\n\n    fn from_http0x_uri(uri: http_02x::Uri) -> Self {\n        Self {\n            as_string: uri.to_string(),\n            parsed: ParsedUri::H0(uri),\n        }\n    }\n\n    #[allow(dead_code)]\n    fn from_http1x_uri(uri: http_1x::Uri) -> Self {\n        Self {\n            as_string: uri.to_string(),\n            parsed: ParsedUri::H1(uri),\n        }\n    }\n\n    #[allow(dead_code)]\n    fn into_h0(self) -> http_02x::Uri {\n        match self.parsed {\n            ParsedUri::H0(uri) => uri,\n            ParsedUri::H1(_uri) => self.as_string.parse().unwrap(),\n        }\n    }\n}\n\nfn merge_paths(\n    endpoint_path: Option<http_02x::uri::PathAndQuery>,\n    uri: &ParsedUri,\n) -> Cow<'_, str> {\n    let uri_path_and_query = uri.path_and_query();\n    let endpoint_path = match endpoint_path {\n        None => return Cow::Borrowed(uri_path_and_query),\n        Some(path) => path,\n    };\n    if let Some(query) = endpoint_path.query() {\n        tracing::warn!(query = %query, \"query specified in endpoint will be ignored during endpoint resolution\");\n    }\n    let endpoint_path = endpoint_path.path();\n    if endpoint_path.is_empty() {\n        Cow::Borrowed(uri_path_and_query)\n    } else {\n        let ep_no_slash = endpoint_path.strip_suffix('/').unwrap_or(endpoint_path);\n        let uri_path_no_slash = uri_path_and_query\n            .strip_prefix('/')\n            .unwrap_or(uri_path_and_query);\n        Cow::Owned(format!(\"{ep_no_slash}/{uri_path_no_slash}\"))\n    }\n}\n\nimpl TryFrom<String> for Uri {\n    type Error = HttpError;\n\n    fn try_from(value: String) -> Result<Self, Self::Error> {\n        let parsed = ParsedUri::H0(value.parse().map_err(HttpError::invalid_uri)?);\n        Ok(Uri {\n            as_string: value,\n            parsed,\n        })\n    }\n}\n\nimpl<'a> TryFrom<&'a str> for Uri {\n    type Error = HttpError;\n    fn try_from(value: &'a str) -> Result<Self, Self::Error> {\n        Self::try_from(value.to_string())\n    }\n}\n\n#[cfg(feature = \"http-02x\")]\nimpl From<http_02x::Uri> for Uri {\n    fn from(value: http_02x::Uri) -> Self {\n        Uri::from_http0x_uri(value)\n    }\n}\n\n#[cfg(feature = \"http-02x\")]\nimpl<B> TryInto<http_02x::Request<B>> for Request<B> {\n    type Error = HttpError;\n\n    fn try_into(self) -> Result<http_02x::Request<B>, Self::Error> {\n        self.try_into_http02x()\n    }\n}\n\n#[cfg(feature = \"http-1x\")]\nimpl From<http_1x::Uri> for Uri {\n    fn from(value: http_1x::Uri) -> Self {\n        Uri::from_http1x_uri(value)\n    }\n}\n\n#[cfg(feature = \"http-1x\")]\nimpl<B> TryInto<http_1x::Request<B>> for Request<B> {\n    type Error = HttpError;\n\n    fn try_into(self) -> Result<http_1x::Request<B>, Self::Error> {\n        self.try_into_http1x()\n    }\n}\n\nimpl<B> Request<B> {\n    /// Converts this request into an http 0.x request.\n    ///\n    /// Depending on the internal storage type, this operation may be free or it may have an internal\n    /// cost.\n    #[cfg(feature = \"http-02x\")]\n    pub fn try_into_http02x(self) -> Result<http_02x::Request<B>, HttpError> {\n        let mut req = http_02x::Request::builder()\n            .uri(self.uri.into_h0())\n            .method(self.method)\n            .body(self.body)\n            .expect(\"known valid\");\n        *req.headers_mut() = self.headers.http0_headermap();\n        *req.extensions_mut() = self.extensions.try_into()?;\n        Ok(req)\n    }\n\n    /// Converts this request into an http 1.x request.\n    ///\n    /// Depending on the internal storage type, this operation may be free or it may have an internal\n    /// cost.\n    #[cfg(feature = \"http-1x\")]\n    pub fn try_into_http1x(self) -> Result<http_1x::Request<B>, HttpError> {\n        let mut req = http_1x::Request::builder()\n            .uri(self.uri.as_string)\n            .method(self.method.as_str())\n            .body(self.body)\n            .expect(\"known valid\");\n        *req.headers_mut() = self.headers.http1_headermap();\n        *req.extensions_mut() = self.extensions.try_into()?;\n        Ok(req)\n    }\n\n    /// Update the body of this request to be a new body.\n    pub fn map<U>(self, f: impl Fn(B) -> U) -> Request<U> {\n        Request {\n            body: f(self.body),\n            uri: self.uri,\n            method: self.method,\n            extensions: self.extensions,\n            headers: self.headers,\n        }\n    }\n\n    /// Returns a GET request with no URI\n    pub fn new(body: B) -> Self {\n        Self {\n            body,\n            uri: Uri::from_http0x_uri(http_02x::Uri::from_static(\"/\")),\n            method: http_02x::Method::GET,\n            extensions: Default::default(),\n            headers: Default::default(),\n        }\n    }\n\n    /// Convert this request into its parts.\n    pub fn into_parts(self) -> RequestParts<B> {\n        RequestParts {\n            uri: self.uri,\n            headers: self.headers,\n            body: self.body,\n        }\n    }\n\n    /// Returns a reference to the header map\n    pub fn headers(&self) -> &Headers {\n        &self.headers\n    }\n\n    /// Returns a mutable reference to the header map\n    pub fn headers_mut(&mut self) -> &mut Headers {\n        &mut self.headers\n    }\n\n    /// Returns the body associated with the request\n    pub fn body(&self) -> &B {\n        &self.body\n    }\n\n    /// Returns a mutable reference to the body\n    pub fn body_mut(&mut self) -> &mut B {\n        &mut self.body\n    }\n\n    /// Converts this request into the request body.\n    pub fn into_body(self) -> B {\n        self.body\n    }\n\n    /// Returns the method associated with this request\n    pub fn method(&self) -> &str {\n        self.method.as_str()\n    }\n\n    /// Returns the URI associated with this request\n    pub fn uri(&self) -> &str {\n        &self.uri.as_string\n    }\n\n    /// Returns a mutable reference the the URI of this http::Request\n    pub fn uri_mut(&mut self) -> &mut Uri {\n        &mut self.uri\n    }\n\n    /// Sets the URI of this request\n    pub fn set_uri<U>(&mut self, uri: U) -> Result<(), U::Error>\n    where\n        U: TryInto<Uri>,\n    {\n        let uri = uri.try_into()?;\n        self.uri = uri;\n        Ok(())\n    }\n\n    /// Adds an extension to the request extensions\n    pub fn add_extension<T: Send + Sync + Clone + 'static>(&mut self, extension: T) {\n        self.extensions.insert(extension.clone());\n    }\n}\n\nimpl Request<SdkBody> {\n    /// Attempts to clone this request\n    ///\n    /// On clone, any extensions will be cleared.\n    ///\n    /// If the body is cloneable, this will clone the request. Otherwise `None` will be returned\n    pub fn try_clone(&self) -> Option<Self> {\n        let body = self.body().try_clone()?;\n        Some(Self {\n            body,\n            uri: self.uri.clone(),\n            method: self.method.clone(),\n            extensions: Extensions::new(),\n            headers: self.headers.clone(),\n        })\n    }\n\n    /// Replaces this request's body with [`SdkBody::taken()`]\n    pub fn take_body(&mut self) -> SdkBody {\n        std::mem::replace(self.body_mut(), SdkBody::taken())\n    }\n\n    /// Create a GET request to `/` with an empty body\n    pub fn empty() -> Self {\n        Self::new(SdkBody::empty())\n    }\n\n    /// Creates a GET request to `uri` with an empty body\n    pub fn get(uri: impl AsRef<str>) -> Result<Self, HttpError> {\n        let mut req = Self::new(SdkBody::empty());\n        req.set_uri(uri.as_ref())?;\n        Ok(req)\n    }\n}\n\n#[cfg(feature = \"http-02x\")]\nimpl<B> TryFrom<http_02x::Request<B>> for Request<B> {\n    type Error = HttpError;\n\n    fn try_from(value: http_02x::Request<B>) -> Result<Self, Self::Error> {\n        let (parts, body) = value.into_parts();\n        let headers = Headers::try_from(parts.headers)?;\n        Ok(Self {\n            body,\n            uri: parts.uri.into(),\n            method: parts.method,\n            extensions: parts.extensions.into(),\n            headers,\n        })\n    }\n}\n\n#[cfg(feature = \"http-1x\")]\nimpl<B> TryFrom<http_1x::Request<B>> for Request<B> {\n    type Error = HttpError;\n\n    fn try_from(value: http_1x::Request<B>) -> Result<Self, Self::Error> {\n        let (parts, body) = value.into_parts();\n        let headers = Headers::try_from(parts.headers)?;\n        Ok(Self {\n            body,\n            uri: Uri::from_http1x_uri(parts.uri),\n            method: http_02x::Method::from_bytes(parts.method.as_str().as_bytes()).expect(\"valid\"),\n            extensions: parts.extensions.into(),\n            headers,\n        })\n    }\n}\n\n#[cfg(all(test, feature = \"http-02x\", feature = \"http-1x\"))]\nmod test {\n    use aws_smithy_types::body::SdkBody;\n    use http_02x::header::{AUTHORIZATION, CONTENT_LENGTH};\n\n    #[test]\n    fn non_ascii_requests() {\n        let request = http_02x::Request::builder()\n            .header(\"k\", \"😹\")\n            .body(SdkBody::empty())\n            .unwrap();\n        let request: super::Request = request\n            .try_into()\n            .expect(\"failed to convert a non-string header\");\n        assert_eq!(request.headers().get(\"k\"), Some(\"😹\"))\n    }\n\n    #[test]\n    fn request_can_be_created() {\n        let req = http_02x::Request::builder()\n            .uri(\"http://foo.com\")\n            .body(SdkBody::from(\"hello\"))\n            .unwrap();\n        let mut req = super::Request::try_from(req).unwrap();\n        req.headers_mut().insert(\"a\", \"b\");\n        assert_eq!(req.headers().get(\"a\").unwrap(), \"b\");\n        req.headers_mut().append(\"a\", \"c\");\n        assert_eq!(req.headers().get(\"a\").unwrap(), \"b\");\n        let http0 = req.try_into_http02x().unwrap();\n        assert_eq!(http0.uri(), \"http://foo.com\");\n    }\n\n    #[test]\n    fn uri_mutations() {\n        let req = http_02x::Request::builder()\n            .uri(\"http://foo.com\")\n            .body(SdkBody::from(\"hello\"))\n            .unwrap();\n        let mut req = super::Request::try_from(req).unwrap();\n        assert_eq!(req.uri(), \"http://foo.com/\");\n        req.set_uri(\"http://bar.com\").unwrap();\n        assert_eq!(req.uri(), \"http://bar.com\");\n        let http0 = req.try_into_http02x().unwrap();\n        assert_eq!(http0.uri(), \"http://bar.com\");\n    }\n\n    #[test]\n    #[should_panic]\n    fn header_panics() {\n        let req = http_02x::Request::builder()\n            .uri(\"http://foo.com\")\n            .body(SdkBody::from(\"hello\"))\n            .unwrap();\n        let mut req = super::Request::try_from(req).unwrap();\n        let _ = req\n            .headers_mut()\n            .try_insert(\"a\\nb\", \"a\\nb\")\n            .expect_err(\"invalid header\");\n        let _ = req.headers_mut().insert(\"a\\nb\", \"a\\nb\");\n    }\n\n    #[test]\n    fn try_clone_clones_all_data() {\n        let request = http_02x::Request::builder()\n            .uri(http_02x::Uri::from_static(\"https://www.amazon.com\"))\n            .method(\"POST\")\n            .header(CONTENT_LENGTH, 456)\n            .header(AUTHORIZATION, \"Token: hello\")\n            .body(SdkBody::from(\"hello world!\"))\n            .expect(\"valid request\");\n\n        let request: super::Request = request.try_into().unwrap();\n        let cloned = request.try_clone().expect(\"request is cloneable\");\n\n        assert_eq!(\"https://www.amazon.com/\", cloned.uri());\n        assert_eq!(\"POST\", cloned.method());\n        assert_eq!(2, cloned.headers().len());\n        assert_eq!(\"Token: hello\", cloned.headers().get(AUTHORIZATION).unwrap(),);\n        assert_eq!(\"456\", cloned.headers().get(CONTENT_LENGTH).unwrap());\n        assert_eq!(\"hello world!\".as_bytes(), cloned.body().bytes().unwrap());\n    }\n\n    #[test]\n    fn valid_round_trips() {\n        let request = || {\n            http_02x::Request::builder()\n                .uri(http_02x::Uri::from_static(\"https://www.amazon.com\"))\n                .method(\"POST\")\n                .header(CONTENT_LENGTH, 456)\n                .header(AUTHORIZATION, \"Token: hello\")\n                .header(\"multi\", \"v1\")\n                .header(\"multi\", \"v2\")\n                .body(SdkBody::from(\"hello world!\"))\n                .expect(\"valid request\")\n        };\n\n        check_roundtrip(request);\n    }\n\n    macro_rules! req_eq {\n        ($a: expr, $b: expr) => {{\n            assert_eq!($a.uri(), $b.uri(), \"status code mismatch\");\n            assert_eq!($a.headers(), $b.headers(), \"header mismatch\");\n            assert_eq!($a.method(), $b.method(), \"header mismatch\");\n            assert_eq!($a.body().bytes(), $b.body().bytes(), \"data mismatch\");\n            assert_eq!(\n                $a.extensions().len(),\n                $b.extensions().len(),\n                \"extensions size mismatch\"\n            );\n        }};\n    }\n\n    #[track_caller]\n    fn check_roundtrip(req: impl Fn() -> http_02x::Request<SdkBody>) {\n        let mut container = super::Request::try_from(req()).unwrap();\n        container.add_extension(5_u32);\n        let mut h1 = container\n            .try_into_http1x()\n            .expect(\"failed converting to http1x\");\n        assert_eq!(h1.extensions().get::<u32>(), Some(&5));\n        h1.extensions_mut().remove::<u32>();\n\n        let mut container = super::Request::try_from(h1).expect(\"failed converting from http1x\");\n        container.add_extension(5_u32);\n        let mut h0 = container\n            .try_into_http02x()\n            .expect(\"failed converting back to http0x\");\n        assert_eq!(h0.extensions().get::<u32>(), Some(&5));\n        h0.extensions_mut().remove::<u32>();\n        req_eq!(h0, req());\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime-api/src/http/response.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Http Response Types\n\nuse crate::http::extensions::Extensions;\nuse crate::http::{Headers, HttpError};\nuse aws_smithy_types::body::SdkBody;\nuse std::fmt;\n\n/// HTTP response status code\n#[derive(Copy, Clone, Debug, Eq, PartialEq)]\npub struct StatusCode(u16);\n\nimpl StatusCode {\n    /// True if this is a successful response code (200, 201, etc)\n    pub fn is_success(self) -> bool {\n        (200..300).contains(&self.0)\n    }\n\n    /// True if this response code is a client error (4xx)\n    pub fn is_client_error(self) -> bool {\n        (400..500).contains(&self.0)\n    }\n\n    /// True if this response code is a server error (5xx)\n    pub fn is_server_error(self) -> bool {\n        (500..600).contains(&self.0)\n    }\n\n    /// Return the value of this status code as a `u16`.\n    pub fn as_u16(self) -> u16 {\n        self.0\n    }\n}\n\nimpl TryFrom<u16> for StatusCode {\n    type Error = HttpError;\n\n    fn try_from(value: u16) -> Result<Self, Self::Error> {\n        if (100..1000).contains(&value) {\n            Ok(StatusCode(value))\n        } else {\n            Err(HttpError::invalid_status_code())\n        }\n    }\n}\n\n#[cfg(feature = \"http-02x\")]\nimpl From<http_02x::StatusCode> for StatusCode {\n    fn from(value: http_02x::StatusCode) -> Self {\n        Self(value.as_u16())\n    }\n}\n\n#[cfg(feature = \"http-02x\")]\nimpl From<StatusCode> for http_02x::StatusCode {\n    fn from(value: StatusCode) -> Self {\n        Self::from_u16(value.0).unwrap()\n    }\n}\n\n#[cfg(feature = \"http-1x\")]\nimpl From<http_1x::StatusCode> for StatusCode {\n    fn from(value: http_1x::StatusCode) -> Self {\n        Self(value.as_u16())\n    }\n}\n\n#[cfg(feature = \"http-1x\")]\nimpl From<StatusCode> for http_1x::StatusCode {\n    fn from(value: StatusCode) -> Self {\n        Self::from_u16(value.0).unwrap()\n    }\n}\n\nimpl From<StatusCode> for u16 {\n    fn from(value: StatusCode) -> Self {\n        value.0\n    }\n}\n\nimpl fmt::Display for StatusCode {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        self.0.fmt(f)\n    }\n}\n\n/// An HTTP Response Type\n#[derive(Debug)]\npub struct Response<B = SdkBody> {\n    status: StatusCode,\n    headers: Headers,\n    body: B,\n    extensions: Extensions,\n}\n\nimpl<B> Response<B> {\n    /// Converts this response into an http 0.x response.\n    ///\n    /// Depending on the internal storage type, this operation may be free or it may have an internal\n    /// cost.\n    #[cfg(feature = \"http-02x\")]\n    pub fn try_into_http02x(self) -> Result<http_02x::Response<B>, HttpError> {\n        let mut res = http_02x::Response::builder()\n            .status(\n                http_02x::StatusCode::from_u16(self.status.into())\n                    .expect(\"validated upon construction\"),\n            )\n            .body(self.body)\n            .expect(\"known valid\");\n        *res.headers_mut() = self.headers.http0_headermap();\n        *res.extensions_mut() = self.extensions.try_into()?;\n        Ok(res)\n    }\n\n    /// Converts this response into an http 1.x response.\n    ///\n    /// Depending on the internal storage type, this operation may be free or it may have an internal\n    /// cost.\n    #[cfg(feature = \"http-1x\")]\n    pub fn try_into_http1x(self) -> Result<http_1x::Response<B>, HttpError> {\n        let mut res = http_1x::Response::builder()\n            .status(\n                http_1x::StatusCode::from_u16(self.status.into())\n                    .expect(\"validated upon construction\"),\n            )\n            .body(self.body)\n            .expect(\"known valid\");\n        *res.headers_mut() = self.headers.http1_headermap();\n        *res.extensions_mut() = self.extensions.try_into()?;\n        Ok(res)\n    }\n\n    /// Update the body of this response to be a new body.\n    pub fn map<U>(self, f: impl Fn(B) -> U) -> Response<U> {\n        Response {\n            status: self.status,\n            body: f(self.body),\n            extensions: self.extensions,\n            headers: self.headers,\n        }\n    }\n\n    /// Returns a response with the given status and body\n    pub fn new(status: StatusCode, body: B) -> Self {\n        Self {\n            status,\n            body,\n            extensions: Default::default(),\n            headers: Default::default(),\n        }\n    }\n\n    /// Returns the status code\n    pub fn status(&self) -> StatusCode {\n        self.status\n    }\n\n    /// Returns a mutable reference to the status code\n    pub fn status_mut(&mut self) -> &mut StatusCode {\n        &mut self.status\n    }\n\n    /// Returns a reference to the header map\n    pub fn headers(&self) -> &Headers {\n        &self.headers\n    }\n\n    /// Returns a mutable reference to the header map\n    pub fn headers_mut(&mut self) -> &mut Headers {\n        &mut self.headers\n    }\n\n    /// Returns the body associated with the request\n    pub fn body(&self) -> &B {\n        &self.body\n    }\n\n    /// Returns a mutable reference to the body\n    pub fn body_mut(&mut self) -> &mut B {\n        &mut self.body\n    }\n\n    /// Converts this response into the response body.\n    pub fn into_body(self) -> B {\n        self.body\n    }\n\n    /// Adds an extension to the response extensions\n    pub fn add_extension<T: Send + Sync + Clone + 'static>(&mut self, extension: T) {\n        self.extensions.insert(extension);\n    }\n}\n\nimpl Response<SdkBody> {\n    /// Replaces this response's body with [`SdkBody::taken()`]\n    pub fn take_body(&mut self) -> SdkBody {\n        std::mem::replace(self.body_mut(), SdkBody::taken())\n    }\n}\n\n#[cfg(feature = \"http-02x\")]\nimpl<B> TryFrom<http_02x::Response<B>> for Response<B> {\n    type Error = HttpError;\n\n    fn try_from(value: http_02x::Response<B>) -> Result<Self, Self::Error> {\n        let (parts, body) = value.into_parts();\n        let headers = Headers::try_from(parts.headers)?;\n        Ok(Self {\n            status: StatusCode::try_from(parts.status.as_u16()).expect(\"validated by http 0.x\"),\n            body,\n            extensions: parts.extensions.into(),\n            headers,\n        })\n    }\n}\n\n#[cfg(feature = \"http-1x\")]\nimpl<B> TryFrom<http_1x::Response<B>> for Response<B> {\n    type Error = HttpError;\n\n    fn try_from(value: http_1x::Response<B>) -> Result<Self, Self::Error> {\n        let (parts, body) = value.into_parts();\n        let headers = Headers::try_from(parts.headers)?;\n        Ok(Self {\n            status: StatusCode::try_from(parts.status.as_u16()).expect(\"validated by http 1.x\"),\n            body,\n            extensions: parts.extensions.into(),\n            headers,\n        })\n    }\n}\n\n#[cfg(all(test, feature = \"http-02x\", feature = \"http-1x\"))]\nmod test {\n    use super::*;\n    use aws_smithy_types::body::SdkBody;\n\n    #[test]\n    fn non_ascii_responses() {\n        let response = http_02x::Response::builder()\n            .status(200)\n            .header(\"k\", \"😹\")\n            .body(SdkBody::empty())\n            .unwrap();\n        let response: Response = response\n            .try_into()\n            .expect(\"failed to convert a non-string header\");\n        assert_eq!(response.headers().get(\"k\"), Some(\"😹\"))\n    }\n\n    #[test]\n    fn response_can_be_created() {\n        let req = http_02x::Response::builder()\n            .status(200)\n            .body(SdkBody::from(\"hello\"))\n            .unwrap();\n        let mut rsp = super::Response::try_from(req).unwrap();\n        rsp.headers_mut().insert(\"a\", \"b\");\n        assert_eq!(\"b\", rsp.headers().get(\"a\").unwrap());\n        rsp.headers_mut().append(\"a\", \"c\");\n        assert_eq!(\"b\", rsp.headers().get(\"a\").unwrap());\n        let http0 = rsp.try_into_http02x().unwrap();\n        assert_eq!(200, http0.status().as_u16());\n    }\n\n    macro_rules! resp_eq {\n        ($a: expr, $b: expr) => {{\n            assert_eq!($a.status(), $b.status(), \"status code mismatch\");\n            assert_eq!($a.headers(), $b.headers(), \"header mismatch\");\n            assert_eq!($a.body().bytes(), $b.body().bytes(), \"data mismatch\");\n            assert_eq!(\n                $a.extensions().len(),\n                $b.extensions().len(),\n                \"extensions size mismatch\"\n            );\n        }};\n    }\n\n    #[track_caller]\n    fn check_roundtrip(req: impl Fn() -> http_02x::Response<SdkBody>) {\n        let mut container = super::Response::try_from(req()).unwrap();\n        container.add_extension(5_u32);\n        let mut h1 = container\n            .try_into_http1x()\n            .expect(\"failed converting to http_1x\");\n        assert_eq!(h1.extensions().get::<u32>(), Some(&5));\n        h1.extensions_mut().remove::<u32>();\n\n        let mut container = super::Response::try_from(h1).expect(\"failed converting from http1x\");\n        container.add_extension(5_u32);\n        let mut h0 = container\n            .try_into_http02x()\n            .expect(\"failed converting back to http_02x\");\n        assert_eq!(h0.extensions().get::<u32>(), Some(&5));\n        h0.extensions_mut().remove::<u32>();\n        resp_eq!(h0, req());\n    }\n\n    #[test]\n    fn valid_round_trips() {\n        let response = || {\n            http_02x::Response::builder()\n                .status(200)\n                .header(\"k\", \"v\")\n                .header(\"multi\", \"v1\")\n                .header(\"multi\", \"v2\")\n                .body(SdkBody::from(\"12345\"))\n                .unwrap()\n        };\n        check_roundtrip(response);\n    }\n\n    #[test]\n    #[should_panic]\n    fn header_panics() {\n        let res = http_02x::Response::builder()\n            .status(200)\n            .body(SdkBody::from(\"hello\"))\n            .unwrap();\n        let mut res = Response::try_from(res).unwrap();\n        let _ = res\n            .headers_mut()\n            .try_insert(\"a\\nb\", \"a\\nb\")\n            .expect_err(\"invalid header\");\n        let _ = res.headers_mut().insert(\"a\\nb\", \"a\\nb\");\n    }\n\n    #[test]\n    fn cant_cross_convert_with_extensions_h0_h1() {\n        let resp_h0 = || {\n            http_02x::Response::builder()\n                .status(200)\n                .extension(5_u32)\n                .body(SdkBody::from(\"hello\"))\n                .unwrap()\n        };\n\n        let _ = Response::try_from(resp_h0())\n            .unwrap()\n            .try_into_http1x()\n            .expect_err(\"cant copy extension\");\n\n        let _ = Response::try_from(resp_h0())\n            .unwrap()\n            .try_into_http02x()\n            .expect(\"allowed to cross-copy\");\n    }\n\n    #[test]\n    fn cant_cross_convert_with_extensions_h1_h0() {\n        let resp_h1 = || {\n            http_1x::Response::builder()\n                .status(200)\n                .extension(5_u32)\n                .body(SdkBody::from(\"hello\"))\n                .unwrap()\n        };\n\n        let _ = Response::try_from(resp_h1())\n            .unwrap()\n            .try_into_http02x()\n            .expect_err(\"cant copy extension\");\n\n        let _ = Response::try_from(resp_h1())\n            .unwrap()\n            .try_into_http1x()\n            .expect(\"allowed to cross-copy\");\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime-api/src/http.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! HTTP request and response types\n\nmod error;\nmod extensions;\nmod headers;\nmod request;\nmod response;\n\npub use error::HttpError;\npub use headers::{HeaderValue, Headers, HeadersIter};\npub use request::{Request, RequestParts};\npub use response::{Response, StatusCode};\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime-api/src/lib.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/* Automatically managed default lints */\n#![cfg_attr(docsrs, feature(doc_cfg))]\n/* End of automatically managed default lints */\n#![warn(\n    missing_docs,\n    rustdoc::missing_crate_level_docs,\n    unreachable_pub,\n    rust_2018_idioms\n)]\n#![allow(clippy::new_without_default)]\n\n//! APIs needed to configure and customize the Smithy generated code.\n//!\n//! Most users will not need to use this crate directly as the most frequently used\n//! APIs are re-exported in the generated clients. However, this crate will be useful\n//! for anyone writing a library for others to use with their generated clients.\n//!\n//! If you're needing to depend on this and you're not writing a library for Smithy\n//! generated clients, then please file an issue on [smithy-rs](https://github.com/smithy-lang/smithy-rs)\n//! as we likely missed re-exporting one of the APIs.\n//!\n//! All client-specific code is in the [`client`] root level module\n//! to leave room for smithy-rs server APIs in the future.\n\n/// A boxed error that is `Send` and `Sync`.\npub mod box_error;\n\n/// APIs for client orchestration.\n#[cfg(feature = \"client\")]\npub mod client;\n\npub mod http;\n\npub mod shared;\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime-api/src/shared.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Conversion traits for converting an unshared type into a shared type.\n//!\n//! The standard [`From`]/[`Into`] traits can't be\n//! used for this purpose due to the blanket implementation of `Into`.\n//!\n//! This implementation also adds a [`maybe_shared`] method and [`impl_shared_conversions`](crate::impl_shared_conversions)\n//! macro to trivially avoid nesting shared types with other shared types.\n//!\n//! # What is a shared type?\n//!\n//! A shared type is a new-type around a `Send + Sync` reference counting smart pointer\n//! (i.e., an [`Arc`](std::sync::Arc)) around an object-safe trait. Shared types are\n//! used to share a trait object among multiple threads/clients/requests.\n#![cfg_attr(\n    feature = \"client\",\n    doc = \"\nFor example, [`SharedHttpConnector`](crate::client::http::SharedHttpConnector), is\na shared type for the [`HttpConnector`](crate::client::http::HttpConnector) trait,\nwhich allows for sharing a single HTTP connector instance (and its connection pool) among multiple clients.\n\"\n)]\n//!\n//! A shared type implements the [`FromUnshared`] trait, which allows any implementation\n//! of the trait it wraps to easily be converted into it.\n//!\n#![cfg_attr(\n    feature = \"client\",\n    doc = \"\nTo illustrate, let's examine the\n[`RuntimePlugin`](crate::client::runtime_plugin::RuntimePlugin)/[`SharedRuntimePlugin`](crate::client::runtime_plugin::SharedRuntimePlugin)\nduo.\nThe following instantiates a concrete implementation of the `RuntimePlugin` trait.\nWe can do `RuntimePlugin` things on this instance.\n\n```rust,no_run\nuse aws_smithy_runtime_api::client::runtime_plugin::StaticRuntimePlugin;\n\nlet some_plugin = StaticRuntimePlugin::new();\n```\n\nWe can convert this instance into a shared type in two different ways.\n\n```rust,no_run\n# use aws_smithy_runtime_api::client::runtime_plugin::StaticRuntimePlugin;\n# let some_plugin = StaticRuntimePlugin::new();\nuse aws_smithy_runtime_api::client::runtime_plugin::SharedRuntimePlugin;\nuse aws_smithy_runtime_api::shared::{IntoShared, FromUnshared};\n\n// Using the `IntoShared` trait\nlet shared: SharedRuntimePlugin = some_plugin.into_shared();\n\n// Using the `FromUnshared` trait:\n# let some_plugin = StaticRuntimePlugin::new();\nlet shared = SharedRuntimePlugin::from_unshared(some_plugin);\n```\n\nThe `IntoShared` trait is useful for making functions that take any `RuntimePlugin` impl and convert it to a shared type.\nFor example, this function will convert the given `plugin` argument into a `SharedRuntimePlugin`.\n\n```rust,no_run\n# use aws_smithy_runtime_api::client::runtime_plugin::{RuntimePlugin, SharedRuntimePlugin};\nuse aws_smithy_runtime_api::shared::IntoShared;\n\nfn take_shared(plugin: impl RuntimePlugin + 'static) {\n    let _plugin: SharedRuntimePlugin = plugin.into_shared();\n}\n```\n\nThis can be called with different types, and even if a `SharedRuntimePlugin` is passed in, it won't nest that\n`SharedRuntimePlugin` inside of another `SharedRuntimePlugin`.\n\n```rust,no_run\n# use aws_smithy_runtime_api::client::runtime_plugin::{RuntimePlugin, SharedRuntimePlugin, StaticRuntimePlugin};\n# use aws_smithy_runtime_api::shared::{IntoShared, FromUnshared};\n# fn take_shared(plugin: impl RuntimePlugin + 'static) {\n#     let _plugin: SharedRuntimePlugin = plugin.into_shared();\n# }\n// Automatically converts it to `SharedRuntimePlugin(StaticRuntimePlugin)`\ntake_shared(StaticRuntimePlugin::new());\n\n// This is OK.\n// It create a `SharedRuntimePlugin(StaticRuntimePlugin))`\n// instead of a nested `SharedRuntimePlugin(SharedRuntimePlugin(StaticRuntimePlugin)))`\ntake_shared(SharedRuntimePlugin::new(StaticRuntimePlugin::new()));\n```\n\"\n)]\n\nuse std::any::{Any, TypeId};\n\n/// Like the `From` trait, but for converting to a shared type.\n///\n/// See the [module docs](crate::shared) for information about shared types.\npub trait FromUnshared<Unshared> {\n    /// Creates a shared type from an unshared type.\n    fn from_unshared(value: Unshared) -> Self;\n}\n\n/// Like the `Into` trait, but for (efficiently) converting into a shared type.\n///\n/// If the type is already a shared type, it won't be nested in another shared type.\n///\n/// See the [module docs](crate::shared) for information about shared types.\npub trait IntoShared<Shared> {\n    /// Creates a shared type from an unshared type.\n    fn into_shared(self) -> Shared;\n}\n\nimpl<Unshared, Shared> IntoShared<Shared> for Unshared\nwhere\n    Shared: FromUnshared<Unshared>,\n{\n    fn into_shared(self) -> Shared {\n        FromUnshared::from_unshared(self)\n    }\n}\n\n/// Given a `value`, determine if that value is already shared. If it is, return it. Otherwise, wrap it in a shared type.\n///\n/// See the [module docs](crate::shared) for information about shared types.\npub fn maybe_shared<Shared, MaybeShared, F>(value: MaybeShared, ctor: F) -> Shared\nwhere\n    Shared: 'static,\n    MaybeShared: IntoShared<Shared> + 'static,\n    F: FnOnce(MaybeShared) -> Shared,\n{\n    // Check if the type is already a shared type\n    if TypeId::of::<MaybeShared>() == TypeId::of::<Shared>() {\n        // Convince the compiler it is already a shared type and return it\n        let mut placeholder = Some(value);\n        let value: Shared = (&mut placeholder as &mut dyn Any)\n            .downcast_mut::<Option<Shared>>()\n            .expect(\"type checked above\")\n            .take()\n            .expect(\"set to Some above\");\n        value\n    } else {\n        (ctor)(value)\n    }\n}\n\n/// Implements `FromUnshared` for a shared type.\n///\n/// See the [`shared` module docs](crate::shared) for information about shared types.\n///\n/// # Example\n/// ```rust,no_run\n/// use aws_smithy_runtime_api::impl_shared_conversions;\n/// use std::sync::Arc;\n///\n/// trait Thing {}\n///\n/// struct Thingamajig;\n/// impl Thing for Thingamajig {}\n///\n/// struct SharedThing(Arc<dyn Thing>);\n/// impl Thing for SharedThing {}\n/// impl SharedThing {\n///     fn new(thing: impl Thing + 'static) -> Self {\n///         Self(Arc::new(thing))\n///     }\n/// }\n/// impl_shared_conversions!(convert SharedThing from Thing using SharedThing::new);\n/// ```\n#[macro_export]\nmacro_rules! impl_shared_conversions {\n    (convert $shared_type:ident from $unshared_trait:ident using $ctor:expr) => {\n        impl<T> $crate::shared::FromUnshared<T> for $shared_type\n        where\n            T: $unshared_trait + 'static,\n        {\n            fn from_unshared(value: T) -> Self {\n                $crate::shared::maybe_shared(value, $ctor)\n            }\n        }\n    };\n}\n\n// TODO(https://github.com/smithy-lang/smithy-rs/issues/3016): Move these impls once aws-smithy-async is merged into aws-smithy-runtime-api\nmod async_impls {\n    use aws_smithy_async::rt::sleep::{AsyncSleep, SharedAsyncSleep};\n    use aws_smithy_async::time::{SharedTimeSource, TimeSource};\n    impl_shared_conversions!(convert SharedAsyncSleep from AsyncSleep using SharedAsyncSleep::new);\n    impl_shared_conversions!(convert SharedTimeSource from TimeSource using SharedTimeSource::new);\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use std::fmt;\n    use std::sync::Arc;\n\n    trait Thing: fmt::Debug {}\n\n    #[derive(Debug)]\n    struct Thingamajig;\n    impl Thing for Thingamajig {}\n\n    #[derive(Debug)]\n    struct SharedThing(#[allow(dead_code)] Arc<dyn Thing>);\n    impl Thing for SharedThing {}\n    impl SharedThing {\n        fn new(thing: impl Thing + 'static) -> Self {\n            Self(Arc::new(thing))\n        }\n    }\n    impl_shared_conversions!(convert SharedThing from Thing using SharedThing::new);\n\n    #[test]\n    fn test() {\n        let thing = Thingamajig;\n        assert_eq!(\"Thingamajig\", format!(\"{thing:?}\"), \"precondition\");\n\n        let shared_thing: SharedThing = thing.into_shared();\n        assert_eq!(\n            \"SharedThing(Thingamajig)\",\n            format!(\"{shared_thing:?}\"),\n            \"precondition\"\n        );\n\n        let very_shared_thing: SharedThing = shared_thing.into_shared();\n        assert_eq!(\n            \"SharedThing(Thingamajig)\",\n            format!(\"{very_shared_thing:?}\"),\n            \"it should not nest the shared thing in another shared thing\"\n        );\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime-api/tests/dyn_dispatch_hint.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n#![cfg(feature = \"client\")]\n\nuse aws_smithy_runtime_api::box_error::BoxError;\nuse aws_smithy_runtime_api::client::interceptors::context::{\n    BeforeSerializationInterceptorContextRef, BeforeTransmitInterceptorContextMut,\n    FinalizerInterceptorContextRef,\n};\nuse aws_smithy_runtime_api::client::interceptors::{dyn_dispatch_hint, Intercept, OverriddenHooks};\nuse aws_smithy_runtime_api::client::runtime_components::RuntimeComponents;\nuse aws_smithy_types::config_bag::ConfigBag;\n\n#[derive(Debug)]\nstruct SingleHook;\n\n#[dyn_dispatch_hint]\nimpl Intercept for SingleHook {\n    fn name(&self) -> &'static str {\n        \"SingleHook\"\n    }\n    fn modify_before_signing(\n        &self,\n        _context: &mut BeforeTransmitInterceptorContextMut<'_>,\n        _runtime_components: &RuntimeComponents,\n        _cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        Ok(())\n    }\n}\n\n#[test]\nfn single_hook_sets_one_flag() {\n    assert_eq!(\n        SingleHook.overridden_hooks(),\n        OverriddenHooks::MODIFY_BEFORE_SIGNING,\n    );\n}\n\n#[derive(Debug)]\nstruct MultipleHooks;\n\n#[dyn_dispatch_hint]\nimpl Intercept for MultipleHooks {\n    fn name(&self) -> &'static str {\n        \"MultipleHooks\"\n    }\n    fn read_before_execution(\n        &self,\n        _context: &BeforeSerializationInterceptorContextRef<'_>,\n        _cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        Ok(())\n    }\n    fn read_after_execution(\n        &self,\n        _context: &FinalizerInterceptorContextRef<'_>,\n        _runtime_components: &RuntimeComponents,\n        _cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        Ok(())\n    }\n}\n\n#[test]\nfn multiple_hooks_or_flags_together() {\n    let flags = MultipleHooks.overridden_hooks();\n    let expected = OverriddenHooks::READ_BEFORE_EXECUTION | OverriddenHooks::READ_AFTER_EXECUTION;\n    assert_eq!(\n        flags, expected,\n        \"should contain exactly the two overridden hooks and nothing else\"\n    );\n}\n\n#[derive(Debug)]\nstruct NoHooks;\n\n#[dyn_dispatch_hint]\nimpl Intercept for NoHooks {\n    fn name(&self) -> &'static str {\n        \"NoHooks\"\n    }\n}\n\n#[test]\nfn no_hooks_returns_none() {\n    assert_eq!(NoHooks.overridden_hooks(), OverriddenHooks::none());\n}\n\n#[derive(Debug)]\nstruct NoMacro;\n\nimpl Intercept for NoMacro {\n    fn name(&self) -> &'static str {\n        \"NoMacro\"\n    }\n}\n\n#[test]\nfn without_macro_returns_all() {\n    assert_eq!(NoMacro.overridden_hooks(), OverriddenHooks::all());\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime-api/tests/permanent_interceptor.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n#![cfg(feature = \"client\")]\n\nuse aws_smithy_runtime_api::box_error::BoxError;\nuse aws_smithy_runtime_api::client::interceptors::context::BeforeTransmitInterceptorContextMut;\nuse aws_smithy_runtime_api::client::interceptors::{\n    disable_interceptor, Intercept, SharedInterceptor,\n};\nuse aws_smithy_runtime_api::client::runtime_components::RuntimeComponents;\nuse aws_smithy_types::config_bag::{ConfigBag, Layer};\n\n#[derive(Debug)]\nstruct TestInterceptor;\n\nimpl Intercept for TestInterceptor {\n    fn name(&self) -> &'static str {\n        \"TestInterceptor\"\n    }\n    fn modify_before_signing(\n        &self,\n        _context: &mut BeforeTransmitInterceptorContextMut<'_>,\n        _runtime_components: &RuntimeComponents,\n        _cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        Ok(())\n    }\n}\n\n#[test]\nfn permanent_interceptor_is_always_enabled() {\n    let interceptor = SharedInterceptor::permanent(TestInterceptor);\n    let cfg = ConfigBag::base();\n    assert!(interceptor.enabled(&cfg));\n}\n\n#[test]\nfn new_interceptor_can_be_disabled() {\n    let interceptor = SharedInterceptor::new(TestInterceptor);\n    let mut cfg = ConfigBag::base();\n    let mut layer = Layer::new(\"test\");\n    layer.store_put(disable_interceptor::<TestInterceptor>(\"test\"));\n    cfg.push_shared_layer(layer.freeze());\n    assert!(!interceptor.enabled(&cfg));\n}\n\n#[test]\n#[cfg(debug_assertions)]\n#[should_panic(expected = \"attempted to disable permanent interceptor\")]\nfn permanent_interceptor_panics_on_disable_in_debug() {\n    let interceptor = SharedInterceptor::permanent(TestInterceptor);\n    let mut cfg = ConfigBag::base();\n    let mut layer = Layer::new(\"test\");\n    layer.store_put(disable_interceptor::<TestInterceptor>(\"test\"));\n    cfg.push_shared_layer(layer.freeze());\n    interceptor.enabled(&cfg);\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime-api-macros/Cargo.toml",
    "content": "[package]\nname = \"aws-smithy-runtime-api-macros\"\nversion = \"1.0.0\"\nauthors = [\"AWS Rust SDK Team <aws-sdk-rust@amazon.com>\"]\ndescription = \"Proc macros for aws-smithy-runtime-api.\"\nedition = \"2021\"\nlicense = \"Apache-2.0\"\nrepository = \"https://github.com/smithy-lang/smithy-rs\"\nrust-version = \"1.91.0\"\n\n[lib]\nproc-macro = true\n\n[dependencies]\nproc-macro2 = \"1.0.106\"\nquote = \"1.0.44\"\nsyn = { version = \"2.0.114\", features = [\"full\"] }\n\n[package.metadata.docs.rs]\nall-features = true\ntargets = [\"x86_64-unknown-linux-gnu\"]\ncargo-args = [\"-Zunstable-options\", \"-Zrustdoc-scrape-examples\"]\nrustdoc-args = [\"--cfg\", \"docsrs\"]\n# End of docs.rs metadata\n\n[package.metadata.smithy-rs-release-tooling]\nstable = true\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime-api-macros/LICENSE",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime-api-macros/README.md",
    "content": "# aws-smithy-runtime-api-macros\n\nProc macros for `aws-smithy-runtime-api`. See [aws-smithy-runtime-api](https://crates.io/crates/aws-smithy-runtime-api) for more information.\n\n<!-- anchor_start:footer -->\nThis crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly.\n<!-- anchor_end:footer -->\n"
  },
  {
    "path": "rust-runtime/aws-smithy-runtime-api-macros/src/lib.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/* Automatically managed default lints */\n#![cfg_attr(docsrs, feature(doc_cfg))]\n/* End of automatically managed default lints */\n\n//! Proc macros for `aws-smithy-runtime-api`.\n\nuse proc_macro::TokenStream;\nuse quote::quote;\nuse syn::{parse_macro_input, ImplItem, ItemImpl};\n\n// If you update this list, also update:\n//   - `OverriddenHooks` constants in `aws-smithy-runtime-api/src/client/interceptors.rs`\n//   - Hook methods on the `Intercept` trait in the same file\nconst KNOWN_HOOKS: &[&str] = &[\n    \"read_before_execution\",\n    \"modify_before_serialization\",\n    \"read_before_serialization\",\n    \"read_after_serialization\",\n    \"modify_before_retry_loop\",\n    \"read_before_attempt\",\n    \"modify_before_signing\",\n    \"read_before_signing\",\n    \"read_after_signing\",\n    \"modify_before_transmit\",\n    \"read_before_transmit\",\n    \"read_after_transmit\",\n    \"modify_before_deserialization\",\n    \"read_before_deserialization\",\n    \"read_after_deserialization\",\n    \"modify_before_attempt_completion\",\n    \"read_after_attempt\",\n    \"modify_before_completion\",\n    \"read_after_execution\",\n];\n\nconst _: () = assert!(\n    KNOWN_HOOKS.len() <= 32,\n    \"OverriddenHooks uses a u32 bitmask; widen to u64 in interceptors.rs if more hooks are needed\"\n);\n\n/// Automatically generates an `overridden_hooks()` method on an `impl Intercept` block\n/// based on which hook methods are overridden.\n///\n/// This attribute must be placed on an `impl Intercept for T` block. It inspects\n/// which hook methods are overridden and generates a corresponding\n/// `overridden_hooks()` method that returns the correct `OverriddenHooks` bitmask.\n///\n/// # Example\n/// ```ignore\n/// #[dyn_dispatch_hint]\n/// impl Intercept for MyInterceptor {\n///     fn name(&self) -> &'static str { \"MyInterceptor\" }\n///     fn modify_before_signing(...) -> ... { ... }\n/// }\n/// // Generates: fn overridden_hooks(&self) -> OverriddenHooks { OverriddenHooks::MODIFY_BEFORE_SIGNING }\n/// ```\n#[proc_macro_attribute]\npub fn dyn_dispatch_hint(_attr: TokenStream, item: TokenStream) -> TokenStream {\n    let mut impl_block = parse_macro_input!(item as ItemImpl);\n\n    let overridden: Vec<String> = impl_block\n        .items\n        .iter()\n        .filter_map(|item| {\n            if let ImplItem::Fn(method) = item {\n                let name = method.sig.ident.to_string();\n                if KNOWN_HOOKS.contains(&name.as_str()) {\n                    Some(name)\n                } else {\n                    None\n                }\n            } else {\n                None\n            }\n        })\n        .collect();\n\n    let flags: Vec<proc_macro2::TokenStream> = overridden\n        .iter()\n        .map(|name| {\n            let upper = name.to_uppercase();\n            let ident = syn::Ident::new(&upper, proc_macro2::Span::call_site());\n            quote! { ::aws_smithy_runtime_api::client::interceptors::OverriddenHooks::#ident }\n        })\n        .collect();\n\n    let body = if flags.is_empty() {\n        quote! { ::aws_smithy_runtime_api::client::interceptors::OverriddenHooks::none() }\n    } else {\n        quote! { #(#flags)|* }\n    };\n\n    let method: ImplItem = syn::parse_quote! {\n        fn overridden_hooks(&self) -> ::aws_smithy_runtime_api::client::interceptors::OverriddenHooks {\n            #body\n        }\n    };\n    impl_block.items.push(method);\n\n    quote! { #impl_block }.into()\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-types/Cargo.toml",
    "content": "[package]\nname = \"aws-smithy-types\"\nversion = \"1.4.7\"\nauthors = [\n    \"AWS Rust SDK Team <aws-sdk-rust@amazon.com>\",\n    \"Russell Cohen <rcoh@amazon.com>\",\n]\ndescription = \"Types for smithy-rs codegen.\"\nedition = \"2021\"\nlicense = \"Apache-2.0\"\nrepository = \"https://github.com/smithy-lang/smithy-rs\"\nrust-version = \"1.91.1\"\n\n[features]\nbyte-stream-poll-next = []\nhttp-body-0-4-x = [\"dep:http-body-0-4\", \"dep:http\"]\nhttp-body-1-x = [\"dep:http-body-1-0\", \"dep:http-body-util\", \"dep:http-body-0-4\", \"dep:http\"]\nhyper-0-14-x = [\"dep:hyper-0-14\"]\nrt-tokio = [\n    \"dep:http-body-0-4\",\n    \"dep:tokio-util\",\n    \"dep:tokio\",\n    \"tokio?/rt\",\n    \"tokio?/fs\",\n    \"tokio?/io-util\",\n    \"tokio-util?/io\",\n    \"dep:futures-core\",\n    \"dep:http\"\n]\ntest-util = []\nserde-serialize = []\nserde-deserialize = []\n\n[dependencies]\nbase64-simd = \"0.8\"\nbytes = \"1.11.1\"\nbytes-utils = \"0.1\"\nhttp = { version = \"0.2.12\", optional = true }\nhttp-1x = { package = \"http\", version = \"1.3.1\" }\nhttp-body-0-4 = { package = \"http-body\", version = \"0.4.6\", optional = true }\nhttp-body-1-0 = { package = \"http-body\", version = \"1.0.1\", optional = true }\nhttp-body-util = { version = \"0.1.3\", optional = true }\nhyper-0-14 = { package = \"hyper\", version = \"0.14.26\", optional = true }\nitoa = \"1.0.17\"\nnum-integer = \"0.1.44\"\npin-project-lite = \"0.2.14\"\npin-utils = \"0.1.0\"\nryu = \"1.0.22\"\ntime = { version = \"0.3.4\", features = [\"parsing\"] }\n\n# ByteStream internals\nfutures-core = { version = \"0.3.31\", optional = true }\ntokio = { version = \"1.49.0\", optional = true }\ntokio-util = { version = \"0.7.18\", optional = true }\n\n[dev-dependencies]\nbase64 = \"0.13.0\"\nciborium = { version = \"0.2.1\" }\nlazy_static = \"1.4\"\nproptest = \"1\"\nrand = \"0.8.4\"\nserde = { version = \"1\", features = [\"derive\"] }\nserde_json = \"1\"\ntokio = { version = \"1.49.0\", features = [\n    \"macros\",\n    \"rt\",\n    \"rt-multi-thread\",\n    \"fs\",\n    \"io-util\",\n] }\n# This is used in a doctest, don't listen to udeps.\ntokio-stream = \"0.1.5\"\ntempfile = \"3.16.0\"\n\ncriterion = \"0.5\"\n\n[package.metadata.docs.rs]\nall-features = true\ntargets = [\"x86_64-unknown-linux-gnu\"]\ncargo-args = [\"-Zunstable-options\", \"-Zrustdoc-scrape-examples\"]\nrustdoc-args = [\"--cfg\", \"docsrs\"]\n# End of docs.rs metadata\n\n# make sure to keep crate stability in sync with the second element of the following tuple in\n# buildSrc/src/main/kotlin/CrateSet.kt:\n#  Crate(\"aws-smithy-types\", STABLE_VERSION_PROP_NAME),\n[package.metadata.smithy-rs-release-tooling]\nstable = true\n\n[[bench]]\nname = \"base64\"\nharness = false\n\n[target.\"cfg(aws_sdk_unstable)\".dependencies.serde]\nversion = \"1.0.228\"\nfeatures = [\"derive\"]\n\n[lints.rust]\nunexpected_cfgs = { level = \"warn\", check-cfg = ['cfg(aws_sdk_unstable)'] }\n"
  },
  {
    "path": "rust-runtime/aws-smithy-types/LICENSE",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n"
  },
  {
    "path": "rust-runtime/aws-smithy-types/README.md",
    "content": "# Fundamental Types for Smithy Services\n\nThis crate implements fundamental types shared across all service clients generated\nby [smithy-rs](https://github.com/smithy-lang/smithy-rs). Generally, you should not need to take a direct dependency on this\ncrate as service clients should publicly re-export the types when used.\n\n<!-- anchor_start:footer -->\nThis crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly.\n<!-- anchor_end:footer -->\n"
  },
  {
    "path": "rust-runtime/aws-smithy-types/additional-ci",
    "content": "#!/bin/bash\n#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\n\n# This script contains additional CI checks to run for this specific package\nset -e\n\necho \"### Checking for duplicate dependency versions in the normal dependency graph with all features enabled\"\ncargo tree -d --edges normal --all-features\n\necho \"### Checking whether the features are properly feature-gated\"\n! cargo tree -e no-dev | grep serde\n\necho \"### Checking feature powerset\"\ncargo hack check --feature-powerset --exclude-all-features\n"
  },
  {
    "path": "rust-runtime/aws-smithy-types/benches/base64.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse criterion::{criterion_group, criterion_main, BenchmarkId, Criterion};\nuse rand::distributions::{Alphanumeric, DistString};\n\n/// Generates a random string of a given length\nfn random_string(len: usize) -> String {\n    Alphanumeric.sample_string(&mut rand::thread_rng(), len)\n}\n\nconst INPUT_SIZES: [usize; 4] = [1, 10, 1_000, 100_000];\n\nfn bench_encodes(c: &mut Criterion) {\n    let mut group = c.benchmark_group(\"Encode\");\n\n    for length in INPUT_SIZES {\n        let input = &random_string(length);\n\n        group.bench_with_input(\n            BenchmarkId::new(\"handrolled_base64\", length),\n            input,\n            |b, i| b.iter(|| handrolled_base64::encode(i)),\n        );\n        group.bench_with_input(BenchmarkId::new(\"base64_simd\", length), input, |b, i| {\n            b.iter(|| aws_smithy_types::base64::encode(i))\n        });\n    }\n    group.finish()\n}\n\nfn bench_decodes(c: &mut Criterion) {\n    let mut group = c.benchmark_group(\"Decode\");\n\n    for length in INPUT_SIZES {\n        let string = &random_string(length);\n        let encoded = &aws_smithy_types::base64::encode(string);\n\n        group.bench_with_input(\n            BenchmarkId::new(\"handrolled_base64\", length),\n            encoded,\n            |b, i| b.iter(|| handrolled_base64::decode(i).unwrap()),\n        );\n        group.bench_with_input(BenchmarkId::new(\"base64_simd\", length), encoded, |b, i| {\n            b.iter(|| aws_smithy_types::base64::decode(i).unwrap())\n        });\n    }\n    group.finish()\n}\n\nfn bench_encoded_lengths(c: &mut Criterion) {\n    let mut group = c.benchmark_group(\"Decoded length\");\n\n    for length in INPUT_SIZES {\n        group.bench_with_input(\n            BenchmarkId::new(\"handrolled_base64\", length),\n            &length,\n            |b, &i| b.iter(|| handrolled_base64::encoded_length(i as u64)),\n        );\n        group.bench_with_input(BenchmarkId::new(\"base64_simd\", length), &length, |b, &i| {\n            b.iter(|| aws_smithy_types::base64::encoded_length(i))\n        });\n    }\n    group.finish()\n}\n\ncriterion_group!(benches, bench_encodes, bench_decodes, bench_encoded_lengths);\ncriterion_main!(benches);\n\nmod handrolled_base64 {\n    /*\n     * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n     * SPDX-License-Identifier: Apache-2.0\n     */\n\n    //! A correct, small, but not especially fast base64 implementation\n\n    use std::error::Error;\n    use std::fmt;\n\n    const BASE64_ENCODE_TABLE: &[u8; 64] =\n        b\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n\n    const BASE64_DECODE_TABLE: &[Option<u8>; 256] = &decode_table();\n\n    const PADDING_SENTINEL: u8 = 0xFF;\n\n    const fn encode_table_index_of(i: usize) -> Option<u8> {\n        let mut index = 0;\n        // inline const index-of implementation\n        while index < BASE64_ENCODE_TABLE.len() {\n            if BASE64_ENCODE_TABLE[index] as usize == i {\n                return Some(index as u8);\n            }\n            index += 1;\n        }\n        None\n    }\n\n    /// Build a decode table mapping `char as u8` to base64 bit sequences\n    const fn decode_table() -> [Option<u8>; 256] {\n        let mut output = [None; 256];\n        let mut i = 0;\n        while i < 256 {\n            if i == 61 {\n                output[i] = Some(PADDING_SENTINEL);\n            } else {\n                output[i] = encode_table_index_of(i);\n            }\n            i += 1;\n        }\n        output\n    }\n\n    /// Encode `input` into base64 using the standard base64 alphabet\n    pub fn encode<T: AsRef<[u8]>>(input: T) -> String {\n        encode_inner(input.as_ref())\n    }\n\n    /// encode_inner defined to reduce monomorphisation cost\n    fn encode_inner(inp: &[u8]) -> String {\n        // Base 64 encodes groups of 6 bits into characters—this means that each\n        // 3 byte group (24 bits) is encoded into 4 base64 characters.\n        let char_ct = inp.len().div_ceil(3) * 4;\n        let mut output = String::with_capacity(char_ct);\n        for chunk in inp.chunks(3) {\n            let mut block: i32 = 0;\n            // Write the chunks into the beginning of a 32 bit int\n            for (idx, chunk) in chunk.iter().enumerate() {\n                block |= (*chunk as i32) << ((3 - idx) * 8);\n            }\n            let num_sextets = (chunk.len() * 8).div_ceil(6);\n            for idx in 0..num_sextets {\n                let slice = block >> (26 - (6 * idx));\n                let idx = (slice as u8) & 0b0011_1111;\n                output.push(BASE64_ENCODE_TABLE[idx as usize] as char);\n            }\n            for _ in 0..(4 - num_sextets) {\n                output.push('=');\n            }\n        }\n        // be sure we calculated the size right\n        debug_assert_eq!(output.capacity(), char_ct);\n        output\n    }\n\n    /// Decode `input` from base64 using the standard base64 alphabet\n    ///\n    /// If input is not a valid base64 encoded string, this function will return `DecodeError`.\n    pub fn decode<T: AsRef<str>>(input: T) -> Result<Vec<u8>, DecodeError> {\n        decode_inner(input.as_ref())\n    }\n\n    /// Failure to decode a base64 value.\n    #[allow(clippy::enum_variant_names)]\n    #[derive(Debug, Clone, Eq, PartialEq)]\n    #[non_exhaustive]\n    pub enum DecodeError {\n        /// Encountered an invalid byte.\n        InvalidByte,\n        /// Encountered an invalid base64 padding value.\n        InvalidPadding,\n        /// Input wasn't long enough to be a valid base64 value.\n        InvalidLength,\n    }\n\n    impl Error for DecodeError {}\n\n    impl fmt::Display for DecodeError {\n        fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n            use DecodeError::*;\n            match self {\n                InvalidByte => write!(f, \"invalid byte\"),\n                InvalidPadding => write!(f, \"invalid padding\"),\n                InvalidLength => write!(f, \"invalid length\"),\n            }\n        }\n    }\n\n    fn decode_inner(inp: &str) -> Result<Vec<u8>, DecodeError> {\n        // one base64 character is only 6 bits so it can't produce valid data.\n        if inp.len() == 1 {\n            return Err(DecodeError::InvalidLength);\n        }\n\n        // when there's padding, we might slightly over allocate but it significantly simplifies\n        // the code to just ignore it.\n        let mut ret = Vec::with_capacity(inp.len().div_ceil(4) * 3);\n\n        // 4 base-64 characters = 3 bytes\n        // 1. Break the input into 4 character segments\n        // 2. Write those segments into an i32\n        // 3. Read u8s back out of the i32\n        let chunks = inp.as_bytes().chunks(4);\n        let mut padding = 0;\n        for chunk in chunks {\n            // padding should only be set on the last input\n            if padding != 0 {\n                return Err(DecodeError::InvalidPadding);\n            }\n            let mut block = 0_i32;\n            for (idx, chunk) in chunk.iter().enumerate() {\n                let bits = BASE64_DECODE_TABLE[*chunk as usize].ok_or(DecodeError::InvalidByte)?;\n                if bits == 0xFF {\n                    padding += 1;\n                } else if padding > 0 {\n                    // Once you've started padding, you can't stop.\n                    return Err(DecodeError::InvalidPadding);\n                }\n                block |= (bits as i32) << (18 - (idx * 6));\n            }\n            // if we got a short slice, its because of implied padding\n            let missing_chars = 4 - chunk.len();\n            for i in (padding + missing_chars..3).rev() {\n                let byte = ((block >> (i * 8)) & 0xFF) as u8;\n                ret.push(byte)\n            }\n        }\n\n        // The code is much simpler if we _slightly_ over allocate in certain cases\n        debug_assert!(ret.capacity() - ret.len() < 4);\n        Ok(ret)\n    }\n\n    /// Given the length of some data in bytes, return how many bytes it would take to base64 encode\n    /// that data.\n    pub fn encoded_length(length: u64) -> u64 {\n        length.div_ceil(3) * 4\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-types/external-types.toml",
    "content": "allowed_external_types = [\n    \"bytes::bytes::Bytes\",\n    \"bytes::buf::buf_impl::Buf\",\n\n    # TODO(https://github.com/smithy-lang/smithy-rs/issues/2412): Support cargo-features for cargo-check-external-types\n    \"http_body::Body\",\n    \"hyper::body::body::Body\",\n\n    # TODO(https://github.com/smithy-lang/smithy-rs/issues/2412): Support cargo-features for cargo-check-external-types\n    \"tokio::io::async_buf_read::AsyncBufRead\",\n\n    # TODO(https://github.com/smithy-lang/smithy-rs/issues/2412): Support cargo-features for cargo-check-external-types\n    \"tokio::fs::file::File\",\n]\n"
  },
  {
    "path": "rust-runtime/aws-smithy-types/fuzz/.gitignore",
    "content": "target\ncorpus\nartifacts\n"
  },
  {
    "path": "rust-runtime/aws-smithy-types/fuzz/Cargo.toml",
    "content": "[package]\nname = \"aws-smithy-types-fuzz\"\nversion = \"0.0.0\"\nauthors = [\"Automatically generated\"]\npublish = false\nedition = \"2021\"\n\n[package.metadata]\ncargo-fuzz = true\n\n[dependencies]\n# Version pinned due to https://github.com/rust-fuzz/libfuzzer/issues/126\nlibfuzzer-sys = \"=0.4.7\"\n\n[dependencies.aws-smithy-types]\npath = \"..\"\n\n# Prevent this from interfering with workspaces\n[workspace]\nmembers = [\".\"]\n\n[[bin]]\nname = \"parse_epoch_seconds\"\npath = \"fuzz_targets/parse_epoch_seconds.rs\"\ntest = false\ndoc = false\n\n[[bin]]\nname = \"parse_http_date\"\npath = \"fuzz_targets/parse_http_date.rs\"\ntest = false\ndoc = false\n\n[[bin]]\nname = \"parse_date_time\"\npath = \"fuzz_targets/parse_date_time.rs\"\ntest = false\ndoc = false\n\n[[bin]]\nname = \"read_date_time\"\npath = \"fuzz_targets/read_date_time.rs\"\ntest = false\ndoc = false\n\n[[bin]]\nname = \"read_http_date\"\npath = \"fuzz_targets/read_http_date.rs\"\ntest = false\ndoc = false\n"
  },
  {
    "path": "rust-runtime/aws-smithy-types/fuzz/fuzz_targets/parse_date_time.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n#![no_main]\n\nuse aws_smithy_types::date_time::{DateTime, Format};\nuse libfuzzer_sys::fuzz_target;\n\nfuzz_target!(|data: &[u8]| {\n    if let Ok(value) = std::str::from_utf8(data) {\n        // Looking for panics. Don't care if the parsing fails.\n        let _ = DateTime::from_str(value, Format::DateTime);\n    }\n});\n"
  },
  {
    "path": "rust-runtime/aws-smithy-types/fuzz/fuzz_targets/parse_epoch_seconds.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n#![no_main]\n\nuse aws_smithy_types::date_time::{DateTime, Format};\nuse libfuzzer_sys::fuzz_target;\n\nfuzz_target!(|data: &[u8]| {\n    if let Ok(value) = std::str::from_utf8(data) {\n        // Looking for panics. Don't care if the parsing fails.\n        let _ = DateTime::from_str(value, Format::EpochSeconds);\n    }\n});\n"
  },
  {
    "path": "rust-runtime/aws-smithy-types/fuzz/fuzz_targets/parse_http_date.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n#![no_main]\n\nuse aws_smithy_types::date_time::{DateTime, Format};\nuse libfuzzer_sys::fuzz_target;\n\nfuzz_target!(|data: &[u8]| {\n    if let Ok(value) = std::str::from_utf8(data) {\n        // Looking for panics. Don't care if the parsing fails.\n        let _ = DateTime::from_str(value, Format::HttpDate);\n    }\n});\n"
  },
  {
    "path": "rust-runtime/aws-smithy-types/fuzz/fuzz_targets/read_date_time.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n#![no_main]\n\nuse aws_smithy_types::date_time::{DateTime, Format};\nuse libfuzzer_sys::fuzz_target;\n\nfuzz_target!(|data: &[u8]| {\n    if let Ok(mut value) = std::str::from_utf8(data) {\n        // Looking for panics. Don't care if the parsing fails.\n        while let Ok((_, next)) = DateTime::read(value, Format::DateTime, ',') {\n            value = next;\n        }\n    }\n});\n"
  },
  {
    "path": "rust-runtime/aws-smithy-types/fuzz/fuzz_targets/read_http_date.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n#![no_main]\n\nuse aws_smithy_types::date_time::{DateTime, Format};\nuse libfuzzer_sys::fuzz_target;\n\nfuzz_target!(|data: &[u8]| {\n    if let Ok(mut value) = std::str::from_utf8(data) {\n        // Looking for panics. Don't care if the parsing fails.\n        while let Ok((_, next)) = DateTime::read(value, Format::HttpDate, ',') {\n            value = next;\n        }\n    }\n});\n"
  },
  {
    "path": "rust-runtime/aws-smithy-types/proptest-regressions/instant/format.txt",
    "content": "# Seeds for failure cases proptest has generated in the past. It is\n# automatically read and these particular cases re-run before any\n# novel cases are generated.\n#\n# It is recommended to check this file in to source control so that\n# everyone who runs the test benefits from these saved cases.\ncc 274da3290b70eec94751bb4ebb152160811daea25f46211ebf54bba47bd3a2e6 # shrinks to secs = -1, nanos = 2\n"
  },
  {
    "path": "rust-runtime/aws-smithy-types/src/base64.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! A thin wrapper over [`base64-simd`](https://docs.rs/base64-simd/)\n\nuse base64_simd::STANDARD;\nuse std::error::Error;\n\n/// Failure to decode a base64 value.\n#[derive(Debug)]\npub struct DecodeError(base64_simd::Error);\n\nimpl Error for DecodeError {\n    fn source(&self) -> Option<&(dyn Error + 'static)> {\n        Some(&self.0)\n    }\n}\n\nimpl std::fmt::Display for DecodeError {\n    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n        write!(f, \"failed to decode base64\")\n    }\n}\n\n/// Decode `input` from base64 using the standard base64 alphabet\n///\n/// If input is not a valid base64 encoded string, this function will return `DecodeError`.\npub fn decode(input: impl AsRef<str>) -> Result<Vec<u8>, DecodeError> {\n    STANDARD.decode_to_vec(input.as_ref()).map_err(DecodeError)\n}\n\n/// Encode `input` into base64 using the standard base64 alphabet\npub fn encode(input: impl AsRef<[u8]>) -> String {\n    STANDARD.encode_to_string(input.as_ref())\n}\n\n/// Returns the base64 representation's length for the given `length` of data\npub fn encoded_length(length: usize) -> usize {\n    STANDARD.encoded_length(length)\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-types/src/big_number.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Big number types represented as strings.\n//!\n//! These types are simple string wrappers that allow users to parse and format\n//! big numbers using their preferred library.\n\n/// Error type for BigInteger and BigDecimal parsing.\n#[derive(Debug, Clone, PartialEq, Eq)]\n#[non_exhaustive]\npub enum BigNumberError {\n    /// The input string is not a valid number format.\n    InvalidFormat(String),\n}\n\nimpl std::fmt::Display for BigNumberError {\n    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n        match self {\n            BigNumberError::InvalidFormat(s) => write!(f, \"invalid number format: {s}\"),\n        }\n    }\n}\n\nimpl std::error::Error for BigNumberError {}\n\n/// Validates that a string is a valid BigInteger format.\n/// Only allows digits and an optional leading sign.\nfn is_valid_big_integer(s: &str) -> bool {\n    if s.is_empty() {\n        return false;\n    }\n\n    let mut chars = s.chars();\n\n    // Check first character (can be sign or digit)\n    match chars.next() {\n        Some('-') | Some('+') | Some('0'..='9') => {}\n        _ => return false,\n    }\n\n    // Rest must be digits only\n    chars.all(|c| c.is_ascii_digit())\n}\n\n/// Validates that a string is a valid BigDecimal format.\n/// Allows digits, sign, decimal point, and scientific notation.\nfn is_valid_big_decimal(s: &str) -> bool {\n    if s.is_empty() {\n        return false;\n    }\n\n    s.chars()\n        .all(|c| matches!(c, '0'..='9' | '-' | '+' | '.' | 'e' | 'E'))\n}\n\n/// A BigInteger represented as a string.\n///\n/// This type does not perform arithmetic operations. Users should parse the string\n/// with their preferred big integer library.\n#[derive(Debug, Clone, PartialEq, Eq, Hash)]\npub struct BigInteger(String);\n\nimpl Default for BigInteger {\n    fn default() -> Self {\n        Self(\"0\".to_string())\n    }\n}\n\nimpl std::str::FromStr for BigInteger {\n    type Err = BigNumberError;\n\n    fn from_str(s: &str) -> Result<Self, Self::Err> {\n        if !is_valid_big_integer(s) {\n            return Err(BigNumberError::InvalidFormat(s.to_string()));\n        }\n        Ok(Self(s.to_string()))\n    }\n}\n\nimpl AsRef<str> for BigInteger {\n    fn as_ref(&self) -> &str {\n        &self.0\n    }\n}\n\n/// A big decimal represented as a string.\n///\n/// This type does not perform arithmetic operations. Users should parse the string\n/// with their preferred big decimal library.\n#[derive(Debug, Clone, PartialEq, Eq, Hash)]\npub struct BigDecimal(String);\n\nimpl Default for BigDecimal {\n    fn default() -> Self {\n        Self(\"0.0\".to_string())\n    }\n}\n\nimpl std::str::FromStr for BigDecimal {\n    type Err = BigNumberError;\n\n    fn from_str(s: &str) -> Result<Self, Self::Err> {\n        if !is_valid_big_decimal(s) {\n            return Err(BigNumberError::InvalidFormat(s.to_string()));\n        }\n        Ok(Self(s.to_string()))\n    }\n}\n\nimpl AsRef<str> for BigDecimal {\n    fn as_ref(&self) -> &str {\n        &self.0\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use std::str::FromStr;\n\n    #[test]\n    fn big_integer_basic() {\n        let bi = BigInteger::from_str(\"12345678901234567890\").unwrap();\n        assert_eq!(bi.as_ref(), \"12345678901234567890\");\n    }\n\n    #[test]\n    fn big_integer_default() {\n        let bi = BigInteger::default();\n        assert_eq!(bi.as_ref(), \"0\");\n    }\n\n    #[test]\n    fn big_decimal_basic() {\n        let bd = BigDecimal::from_str(\"123.456789\").unwrap();\n        assert_eq!(bd.as_ref(), \"123.456789\");\n    }\n\n    #[test]\n    fn big_decimal_default() {\n        let bd = BigDecimal::default();\n        assert_eq!(bd.as_ref(), \"0.0\");\n    }\n\n    #[test]\n    fn big_integer_negative() {\n        let bi = BigInteger::from_str(\"-12345\").unwrap();\n        assert_eq!(bi.as_ref(), \"-12345\");\n    }\n\n    #[test]\n    fn big_decimal_scientific() {\n        let bd = BigDecimal::from_str(\"1.23e10\").unwrap();\n        assert_eq!(bd.as_ref(), \"1.23e10\");\n\n        let bd = BigDecimal::from_str(\"1.23E-10\").unwrap();\n        assert_eq!(bd.as_ref(), \"1.23E-10\");\n    }\n\n    #[test]\n    fn big_integer_rejects_json_injection() {\n        // Reject strings with JSON special characters\n        assert!(BigInteger::from_str(\"123, \\\"injected\\\": true\").is_err());\n        assert!(BigInteger::from_str(\"123}\").is_err());\n        assert!(BigInteger::from_str(\"{\\\"hacked\\\": 1}\").is_err());\n        assert!(BigInteger::from_str(\"123\\\"\").is_err());\n        assert!(BigInteger::from_str(\"123\\\\n456\").is_err());\n    }\n\n    #[test]\n    fn big_decimal_rejects_json_injection() {\n        assert!(BigDecimal::from_str(\"123.45, \\\"injected\\\": true\").is_err());\n        assert!(BigDecimal::from_str(\"123.45}\").is_err());\n        assert!(BigDecimal::from_str(\"{\\\"hacked\\\": 1.0}\").is_err());\n    }\n\n    #[test]\n    fn big_integer_rejects_invalid_chars() {\n        assert!(BigInteger::from_str(\"abc\").is_err());\n        assert!(BigInteger::from_str(\"123abc\").is_err());\n        assert!(BigInteger::from_str(\"12 34\").is_err());\n        assert!(BigInteger::from_str(\"\").is_err());\n    }\n\n    #[test]\n    fn big_integer_rejects_decimal_and_scientific() {\n        // BigInteger should reject decimal points\n        assert!(BigInteger::from_str(\"123.45\").is_err());\n        assert!(BigInteger::from_str(\"123.0\").is_err());\n\n        // BigInteger should reject scientific notation\n        assert!(BigInteger::from_str(\"1e10\").is_err());\n        assert!(BigInteger::from_str(\"1E10\").is_err());\n        assert!(BigInteger::from_str(\"1.23e10\").is_err());\n    }\n\n    #[test]\n    fn big_integer_accepts_signs() {\n        assert!(BigInteger::from_str(\"+123\").is_ok());\n        assert!(BigInteger::from_str(\"-123\").is_ok());\n        assert_eq!(BigInteger::from_str(\"+123\").unwrap().as_ref(), \"+123\");\n    }\n\n    #[test]\n    fn big_decimal_rejects_invalid_chars() {\n        assert!(BigDecimal::from_str(\"abc\").is_err());\n        assert!(BigDecimal::from_str(\"123.45abc\").is_err());\n        assert!(BigDecimal::from_str(\"12.34 56\").is_err());\n        assert!(BigDecimal::from_str(\"\").is_err());\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-types/src/blob.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/// Binary Blob Type\n///\n/// Blobs represent protocol-agnostic binary content.\n#[derive(Debug, Default, PartialEq, Eq, Hash, Clone)]\npub struct Blob {\n    inner: Vec<u8>,\n}\n\nimpl Blob {\n    /// Creates a new blob from the given `input`.\n    pub fn new<T: Into<Vec<u8>>>(input: T) -> Self {\n        Blob {\n            inner: input.into(),\n        }\n    }\n\n    /// Consumes the `Blob` and returns a `Vec<u8>` with its contents.\n    pub fn into_inner(self) -> Vec<u8> {\n        self.inner\n    }\n}\n\nimpl AsRef<[u8]> for Blob {\n    fn as_ref(&self) -> &[u8] {\n        &self.inner\n    }\n}\n\nimpl From<Vec<u8>> for Blob {\n    fn from(value: Vec<u8>) -> Self {\n        Blob::new(value)\n    }\n}\n\nimpl From<Blob> for Vec<u8> {\n    fn from(value: Blob) -> Self {\n        value.into_inner()\n    }\n}\n\nimpl From<&[u8]> for Blob {\n    fn from(value: &[u8]) -> Self {\n        Blob::new(value)\n    }\n}\n\n#[cfg(all(aws_sdk_unstable, feature = \"serde-serialize\"))]\nmod serde_serialize {\n    use super::*;\n    use serde::Serialize;\n\n    impl Serialize for Blob {\n        fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n        where\n            S: serde::Serializer,\n        {\n            if serializer.is_human_readable() {\n                serializer.serialize_str(&crate::base64::encode(&self.inner))\n            } else {\n                serializer.serialize_bytes(&self.inner)\n            }\n        }\n    }\n}\n\n#[cfg(all(aws_sdk_unstable, feature = \"serde-deserialize\"))]\nmod serde_deserialize {\n    use super::*;\n    use serde::{de::Visitor, Deserialize};\n\n    struct HumanReadableBlobVisitor;\n    impl<'de> Visitor<'de> for HumanReadableBlobVisitor {\n        type Value = Blob;\n        fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n            formatter.write_str(\"expected base64 encoded string\")\n        }\n\n        fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>\n        where\n            E: serde::de::Error,\n        {\n            match crate::base64::decode(v) {\n                Ok(inner) => Ok(Blob { inner }),\n                Err(e) => Err(E::custom(e)),\n            }\n        }\n    }\n\n    struct NotHumanReadableBlobVisitor;\n    impl<'de> Visitor<'de> for NotHumanReadableBlobVisitor {\n        type Value = Blob;\n        fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {\n            formatter.write_str(\"expected bytes\")\n        }\n\n        fn visit_byte_buf<E>(self, v: Vec<u8>) -> Result<Self::Value, E>\n        where\n            E: serde::de::Error,\n        {\n            Ok(Blob { inner: v })\n        }\n    }\n\n    impl<'de> Deserialize<'de> for Blob {\n        fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>\n        where\n            D: serde::Deserializer<'de>,\n        {\n            if deserializer.is_human_readable() {\n                deserializer.deserialize_str(HumanReadableBlobVisitor)\n            } else {\n                deserializer.deserialize_byte_buf(NotHumanReadableBlobVisitor)\n            }\n        }\n    }\n}\n\n#[cfg(test)]\nmod test {\n    use crate::Blob;\n\n    #[test]\n    fn blob_conversion() {\n        let my_bytes: &[u8] = &[1u8, 2u8, 3u8];\n        let my_vec = vec![1u8, 2u8, 3u8];\n        let orig_vec = my_vec.clone();\n\n        let blob1: Blob = my_bytes.into();\n        let vec1: Vec<u8> = blob1.into();\n        assert_eq!(orig_vec, vec1);\n\n        let blob2: Blob = my_vec.into();\n        let vec2: Vec<u8> = blob2.into();\n        assert_eq!(orig_vec, vec2);\n    }\n}\n\n#[cfg(all(\n    aws_sdk_unstable,\n    feature = \"serde-serialize\",\n    feature = \"serde-deserialize\"\n))]\nmod test_serde {\n    use crate::Blob;\n    use serde::{Deserialize, Serialize};\n\n    #[derive(Deserialize, Serialize, Debug, PartialEq)]\n    #[allow(dead_code)]\n    struct ForTest {\n        blob: Blob,\n    }\n\n    #[test]\n    fn human_readable_blob() {\n        let aws_in_base64 = r#\"{\"blob\":\"QVdT\"}\"#;\n        let for_test = ForTest {\n            blob: Blob {\n                inner: vec![b'A', b'W', b'S'],\n            },\n        };\n        assert_eq!(for_test, serde_json::from_str(aws_in_base64).unwrap());\n        assert_eq!(serde_json::to_string(&for_test).unwrap(), aws_in_base64);\n    }\n\n    #[test]\n    fn not_human_readable_blob() {\n        use std::collections::HashMap;\n        use std::ffi::CString;\n\n        let for_test = ForTest {\n            blob: Blob {\n                inner: vec![b'A', b'W', b'S'],\n            },\n        };\n        let mut buf = vec![];\n        let res = ciborium::ser::into_writer(&for_test, &mut buf);\n        assert!(res.is_ok());\n\n        // checks whether the bytes are deserialized properly\n        let n: HashMap<String, CString> =\n            ciborium::de::from_reader(std::io::Cursor::new(buf.clone())).unwrap();\n        assert!(n.get(\"blob\").is_some());\n        assert!(n.get(\"blob\") == CString::new([65, 87, 83]).ok().as_ref());\n\n        let de: ForTest = ciborium::de::from_reader(std::io::Cursor::new(buf)).unwrap();\n        assert_eq!(for_test, de);\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-types/src/body/http_body_0_4_x.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::pin::Pin;\nuse std::task::{Context, Poll};\n\nuse bytes::Bytes;\n\nuse crate::body::{Error, SdkBody};\n\nimpl SdkBody {\n    /// Construct an `SdkBody` from a type that implements [`http_body_0_4::Body<Data = Bytes>`](http_body_0_4::Body).\n    ///\n    /// _Note: This is only available with `http-body-0-4-x` enabled._\n    pub fn from_body_0_4<T, E>(body: T) -> Self\n    where\n        T: http_body_0_4::Body<Data = Bytes, Error = E> + Send + Sync + 'static,\n        E: Into<Error> + 'static,\n    {\n        SdkBody::from_body_0_4_internal(body)\n    }\n}\n\n#[cfg(feature = \"hyper-0-14-x\")]\nimpl From<hyper_0_14::Body> for SdkBody {\n    fn from(body: hyper_0_14::Body) -> Self {\n        SdkBody::from_body_0_4(body)\n    }\n}\n\nimpl http_body_0_4::Body for SdkBody {\n    type Data = Bytes;\n    type Error = Error;\n\n    fn poll_data(\n        self: Pin<&mut Self>,\n        cx: &mut Context<'_>,\n    ) -> Poll<Option<Result<Self::Data, Self::Error>>> {\n        self.poll_next(cx)\n    }\n\n    fn poll_trailers(\n        self: Pin<&mut Self>,\n        cx: &mut Context<'_>,\n    ) -> Poll<Result<Option<http::HeaderMap<http::HeaderValue>>, Self::Error>> {\n        let polled = self.poll_next_trailers(cx);\n        match polled {\n            Poll::Ready(Ok(Some(headers))) => Poll::Ready(Ok(Some(convert_headers_1x_0x(headers)))),\n            Poll::Ready(Ok(None)) => Poll::Ready(Ok(None)),\n            Poll::Ready(Err(err)) => Poll::Ready(Err(err)),\n            Poll::Pending => Poll::Pending,\n        }\n    }\n\n    fn is_end_stream(&self) -> bool {\n        self.is_end_stream()\n    }\n\n    fn size_hint(&self) -> http_body_0_4::SizeHint {\n        let mut result = http_body_0_4::SizeHint::default();\n        let (lower, upper) = self.bounds_on_remaining_length();\n        result.set_lower(lower);\n        if let Some(u) = upper {\n            result.set_upper(u)\n        }\n        result\n    }\n}\n\npub(crate) fn convert_headers_1x_0x(input: http_1x::HeaderMap) -> http::HeaderMap {\n    let mut map = http::HeaderMap::with_capacity(input.capacity());\n    let mut mem: Option<http_1x::HeaderName> = None;\n    for (k, v) in input.into_iter() {\n        let name = k.or_else(|| mem.clone()).unwrap();\n        map.append(\n            http::HeaderName::from_bytes(name.as_str().as_bytes()).expect(\"already validated\"),\n            http::HeaderValue::from_bytes(v.as_bytes()).expect(\"already validated\"),\n        );\n        mem = Some(name);\n    }\n    map\n}\n\n#[allow(dead_code)]\npub(crate) fn convert_headers_0x_1x(input: http::HeaderMap) -> http_1x::HeaderMap {\n    let mut map = http_1x::HeaderMap::with_capacity(input.capacity());\n    let mut mem: Option<http::HeaderName> = None;\n    for (k, v) in input.into_iter() {\n        let name = k.or_else(|| mem.clone()).unwrap();\n        map.append(\n            http_1x::HeaderName::from_bytes(name.as_str().as_bytes()).expect(\"already validated\"),\n            http_1x::HeaderValue::from_bytes(v.as_bytes()).expect(\"already validated\"),\n        );\n        mem = Some(name);\n    }\n    map\n}\n\n#[cfg(test)]\nmod tests {\n    use crate::body::SdkBody;\n\n    #[test]\n    fn map_preserve_preserves_bytes_hint() {\n        let initial = SdkBody::from(\"hello!\");\n        assert_eq!(initial.bytes(), Some(b\"hello!\".as_slice()));\n\n        let new_body = initial.map_preserve_contents(SdkBody::from_body_0_4);\n        assert_eq!(new_body.bytes(), Some(b\"hello!\".as_slice()));\n    }\n\n    #[cfg(feature = \"hyper-0-14-x\")]\n    #[test]\n    fn sdkbody_debug_dyn() {\n        let hyper_body = hyper_0_14::Body::channel().1;\n        let body = SdkBody::from_body_0_4(hyper_body);\n        assert!(format!(\"{body:?}\").contains(\"BoxBody\"));\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-types/src/body/http_body_1_x.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Adapters to use http-body 1.0 bodies with SdkBody & ByteStream\n\nuse std::pin::Pin;\nuse std::task::{ready, Context, Poll};\n\nuse bytes::Bytes;\nuse http_body_util::BodyExt;\nuse pin_project_lite::pin_project;\n\nuse crate::body::{Error, SdkBody};\n\nimpl SdkBody {\n    /// Construct an `SdkBody` from a type that implements [`http_body_1_0::Body<Data = Bytes>`](http_body_1_0::Body).\n    pub fn from_body_1_x<T, E>(body: T) -> Self\n    where\n        T: http_body_1_0::Body<Data = Bytes, Error = E> + Send + Sync + 'static,\n        E: Into<Error> + 'static,\n    {\n        SdkBody::from_body_1_x_internal(body.map_err(Into::into))\n    }\n\n    pub(crate) fn poll_data_frame(\n        mut self: Pin<&mut Self>,\n        cx: &mut Context<'_>,\n    ) -> Poll<Option<Result<http_body_1_0::Frame<Bytes>, Error>>> {\n        match ready!(self.as_mut().poll_next(cx)) {\n            // if there's no more data, try to return trailers\n            None => match ready!(self.poll_next_trailers(cx)) {\n                Ok(Some(trailers)) => {\n                    Poll::Ready(Some(Ok(http_body_1_0::Frame::trailers(trailers))))\n                }\n                Ok(None) => Poll::Ready(None),\n                Err(e) => Poll::Ready(Some(Err(e))),\n            },\n            Some(result) => match result {\n                Err(err) => Poll::Ready(Some(Err(err))),\n                Ok(bytes) => Poll::Ready(Some(Ok(http_body_1_0::Frame::data(bytes)))),\n            },\n        }\n    }\n}\n\n#[cfg(feature = \"http-body-1-x\")]\nimpl http_body_1_0::Body for SdkBody {\n    type Data = Bytes;\n    type Error = Error;\n\n    fn poll_frame(\n        self: Pin<&mut Self>,\n        cx: &mut Context<'_>,\n    ) -> Poll<Option<Result<http_body_1_0::Frame<Self::Data>, Self::Error>>> {\n        self.poll_data_frame(cx)\n    }\n\n    fn is_end_stream(&self) -> bool {\n        self.is_end_stream()\n    }\n\n    fn size_hint(&self) -> http_body_1_0::SizeHint {\n        let mut hint = http_body_1_0::SizeHint::default();\n        let (lower, upper) = self.bounds_on_remaining_length();\n        hint.set_lower(lower);\n        if let Some(upper) = upper {\n            hint.set_upper(upper);\n        }\n        hint\n    }\n}\n\npin_project! {\n    struct Http1toHttp04<B> {\n        #[pin]\n        inner: B,\n        trailers: Option<http_1x::HeaderMap>,\n    }\n}\n\nimpl<B> Http1toHttp04<B> {\n    #[allow(dead_code)]\n    fn new(inner: B) -> Self {\n        Self {\n            inner,\n            trailers: None,\n        }\n    }\n}\n\nimpl<B> http_body_0_4::Body for Http1toHttp04<B>\nwhere\n    B: http_body_1_0::Body,\n{\n    type Data = B::Data;\n    type Error = B::Error;\n\n    fn poll_data(\n        mut self: Pin<&mut Self>,\n        cx: &mut Context<'_>,\n    ) -> Poll<Option<Result<Self::Data, Self::Error>>> {\n        loop {\n            let this = self.as_mut().project();\n            match ready!(this.inner.poll_frame(cx)) {\n                Some(Ok(frame)) => {\n                    let frame = match frame.into_data() {\n                        Ok(data) => return Poll::Ready(Some(Ok(data))),\n                        Err(frame) => frame,\n                    };\n                    // when we get a trailers frame, store the trailers for the next poll\n                    if let Ok(trailers) = frame.into_trailers() {\n                        if let Some(trailer_map) = this.trailers {\n                            trailer_map.extend(trailers);\n                        } else {\n                            this.trailers.replace(trailers);\n                        }\n                        return Poll::Ready(None);\n                    };\n                    // if the frame type was unknown, discard it. the next one might be something\n                    // useful\n                }\n                Some(Err(e)) => return Poll::Ready(Some(Err(e))),\n                None => return Poll::Ready(None),\n            }\n        }\n    }\n\n    fn poll_trailers(\n        self: Pin<&mut Self>,\n        _cx: &mut Context<'_>,\n    ) -> Poll<Result<Option<http::HeaderMap>, Self::Error>> {\n        // all of the polling happens in poll_data, once we get to the trailers we've actually\n        // already read everything\n        let this = self.project();\n        match this.trailers.take() {\n            Some(headers) => Poll::Ready(Ok(Some(convert_headers_1x_0x(headers)))),\n            None => Poll::Ready(Ok(None)),\n        }\n    }\n\n    fn is_end_stream(&self) -> bool {\n        self.inner.is_end_stream()\n    }\n\n    fn size_hint(&self) -> http_body_0_4::SizeHint {\n        let mut size_hint = http_body_0_4::SizeHint::new();\n        let inner_hint = self.inner.size_hint();\n        if let Some(exact) = inner_hint.exact() {\n            size_hint.set_exact(exact);\n        } else {\n            size_hint.set_lower(inner_hint.lower());\n            if let Some(upper) = inner_hint.upper() {\n                size_hint.set_upper(upper);\n            }\n        }\n        size_hint\n    }\n}\n\npub(crate) fn convert_headers_1x_0x(input: http_1x::HeaderMap) -> http::HeaderMap {\n    let mut map = http::HeaderMap::with_capacity(input.capacity());\n    let mut mem: Option<http_1x::HeaderName> = None;\n    for (k, v) in input.into_iter() {\n        let name = k.or_else(|| mem.clone()).unwrap();\n        map.append(\n            http::HeaderName::from_bytes(name.as_str().as_bytes()).expect(\"already validated\"),\n            http::HeaderValue::from_bytes(v.as_bytes()).expect(\"already validated\"),\n        );\n        mem = Some(name);\n    }\n    map\n}\n\npub(crate) fn convert_headers_0x_1x(input: http::HeaderMap) -> http_1x::HeaderMap {\n    let mut map = http_1x::HeaderMap::with_capacity(input.capacity());\n    let mut mem: Option<http::HeaderName> = None;\n    for (k, v) in input.into_iter() {\n        let name = k.or_else(|| mem.clone()).unwrap();\n        map.append(\n            http_1x::HeaderName::from_bytes(name.as_str().as_bytes()).expect(\"already validated\"),\n            http_1x::HeaderValue::from_bytes(v.as_bytes()).expect(\"already validated\"),\n        );\n        mem = Some(name);\n    }\n    map\n}\n\n#[cfg(test)]\nmod test {\n    use std::collections::VecDeque;\n    use std::pin::Pin;\n    use std::task::{Context, Poll};\n\n    use bytes::Bytes;\n    use http::header::{CONTENT_LENGTH as CL0, CONTENT_TYPE as CT0};\n    use http_1x::header::{CONTENT_LENGTH as CL1, CONTENT_TYPE as CT1};\n    use http_1x::{HeaderMap, HeaderName, HeaderValue};\n    use http_body_1_0::Frame;\n    use http_body_util::BodyExt;\n\n    use crate::body::http_body_1_x::{convert_headers_1x_0x, Http1toHttp04};\n    use crate::body::{Error, SdkBody};\n    use crate::byte_stream::ByteStream;\n\n    struct TestBody {\n        chunks: VecDeque<Chunk>,\n    }\n\n    enum Chunk {\n        Data(&'static str),\n        Error(&'static str),\n        Trailers(HeaderMap),\n    }\n\n    impl http_body_1_0::Body for TestBody {\n        type Data = Bytes;\n        type Error = Error;\n\n        fn poll_frame(\n            mut self: Pin<&mut Self>,\n            _cx: &mut Context<'_>,\n        ) -> Poll<Option<Result<Frame<Self::Data>, Self::Error>>> {\n            let next = self.chunks.pop_front();\n            let mk = |v: Frame<Bytes>| Poll::Ready(Some(Ok(v)));\n\n            match next {\n                Some(Chunk::Data(s)) => mk(Frame::data(Bytes::from_static(s.as_bytes()))),\n                Some(Chunk::Trailers(headers)) => mk(Frame::trailers(headers)),\n                Some(Chunk::Error(err)) => Poll::Ready(Some(Err(err.into()))),\n                None => Poll::Ready(None),\n            }\n        }\n    }\n\n    fn trailers() -> HeaderMap {\n        let mut map = HeaderMap::new();\n        map.insert(\n            HeaderName::from_static(\"x-test\"),\n            HeaderValue::from_static(\"x-test-value\"),\n        );\n        map.append(\n            HeaderName::from_static(\"x-test\"),\n            HeaderValue::from_static(\"x-test-value-2\"),\n        );\n        map.append(\n            HeaderName::from_static(\"y-test\"),\n            HeaderValue::from_static(\"y-test-value-2\"),\n        );\n        map\n    }\n\n    #[tokio::test]\n    async fn test_body_with_trailers() {\n        let body = TestBody {\n            chunks: vec![\n                Chunk::Data(\"123\"),\n                Chunk::Data(\"456\"),\n                Chunk::Data(\"789\"),\n                Chunk::Trailers(trailers()),\n            ]\n            .into(),\n        };\n        let body = SdkBody::from_body_1_x(body);\n        let data = ByteStream::new(body);\n        assert_eq!(data.collect().await.unwrap().to_vec(), b\"123456789\");\n    }\n\n    #[tokio::test]\n    async fn test_read_trailers() {\n        let body = TestBody {\n            chunks: vec![\n                Chunk::Data(\"123\"),\n                Chunk::Data(\"456\"),\n                Chunk::Data(\"789\"),\n                Chunk::Trailers(trailers()),\n            ]\n            .into(),\n        };\n        let body = SdkBody::from_body_1_x(body);\n        let collected = body.collect().await.unwrap();\n        let collected_trailers = collected.trailers();\n\n        assert_eq!(collected_trailers, Some(&trailers()));\n    }\n\n    #[tokio::test]\n    async fn test_read_multiple_trailers() {\n        let mut second_trailers = HeaderMap::new();\n        second_trailers.insert(\n            HeaderName::from_static(\"second-trailer\"),\n            HeaderValue::from_static(\"second\"),\n        );\n\n        let mut merged_trailers = HeaderMap::new();\n        merged_trailers.extend(second_trailers.clone());\n        merged_trailers.extend(trailers());\n\n        let body = TestBody {\n            chunks: vec![\n                Chunk::Data(\"123\"),\n                Chunk::Data(\"456\"),\n                Chunk::Data(\"789\"),\n                Chunk::Trailers(trailers()),\n                Chunk::Trailers(second_trailers),\n            ]\n            .into(),\n        };\n        let body = SdkBody::from_body_1_x(body);\n        let collected = body.collect().await.unwrap();\n        let collected_trailers = collected.trailers().unwrap();\n\n        assert_eq!(collected_trailers, &merged_trailers);\n    }\n\n    #[tokio::test]\n    async fn test_trailers_04x_to_1x() {\n        let body = TestBody {\n            chunks: vec![\n                Chunk::Data(\"123\"),\n                Chunk::Data(\"456\"),\n                Chunk::Data(\"789\"),\n                Chunk::Trailers(trailers()),\n            ]\n            .into(),\n        };\n        let body = SdkBody::from_body_0_4(Http1toHttp04::new(body));\n\n        let collected = BodyExt::collect(body).await.expect(\"should succeed\");\n        assert_eq!(collected.trailers(), Some(&trailers()));\n        assert_eq!(collected.to_bytes().as_ref(), b\"123456789\");\n    }\n\n    #[tokio::test]\n    async fn test_multiple_trailers_04x_to_1x() {\n        let mut second_trailers = HeaderMap::new();\n        second_trailers.insert(\n            HeaderName::from_static(\"second-trailer\"),\n            HeaderValue::from_static(\"second\"),\n        );\n\n        let mut merged_trailers = HeaderMap::new();\n        merged_trailers.extend(second_trailers.clone());\n        merged_trailers.extend(trailers());\n\n        let body = TestBody {\n            chunks: vec![\n                Chunk::Data(\"123\"),\n                Chunk::Data(\"456\"),\n                Chunk::Data(\"789\"),\n                Chunk::Trailers(trailers()),\n                Chunk::Trailers(second_trailers),\n            ]\n            .into(),\n        };\n        let body = SdkBody::from_body_0_4(Http1toHttp04::new(body));\n\n        let collected = BodyExt::collect(body).await.expect(\"should succeed\");\n        assert_eq!(collected.trailers().unwrap(), &merged_trailers);\n        assert_eq!(collected.to_bytes().as_ref(), b\"123456789\");\n    }\n\n    #[tokio::test]\n    async fn test_errors() {\n        let body = TestBody {\n            chunks: vec![\n                Chunk::Data(\"123\"),\n                Chunk::Data(\"456\"),\n                Chunk::Data(\"789\"),\n                Chunk::Error(\"errors!\"),\n            ]\n            .into(),\n        };\n\n        let body = SdkBody::from_body_1_x(body);\n        let body = ByteStream::new(body);\n        body.collect().await.expect_err(\"body returned an error\");\n    }\n\n    #[tokio::test]\n    async fn test_no_trailers() {\n        let body = TestBody {\n            chunks: vec![Chunk::Data(\"123\"), Chunk::Data(\"456\"), Chunk::Data(\"789\")].into(),\n        };\n\n        let body = SdkBody::from_body_1_x(body);\n        let collected = BodyExt::collect(body).await.expect(\"should succeed\");\n        assert_eq!(collected.trailers(), None);\n        assert_eq!(collected.to_bytes().as_ref(), b\"123456789\");\n    }\n\n    #[test]\n    fn test_convert_headers() {\n        let mut http1_headermap = http_1x::HeaderMap::new();\n        http1_headermap.append(CT1, HeaderValue::from_static(\"a\"));\n        http1_headermap.append(CT1, HeaderValue::from_static(\"b\"));\n        http1_headermap.append(CT1, HeaderValue::from_static(\"c\"));\n\n        http1_headermap.insert(CL1, HeaderValue::from_static(\"1234\"));\n\n        let mut expect = http::HeaderMap::new();\n        expect.append(CT0, http::HeaderValue::from_static(\"a\"));\n        expect.append(CT0, http::HeaderValue::from_static(\"b\"));\n        expect.append(CT0, http::HeaderValue::from_static(\"c\"));\n\n        expect.insert(CL0, http::HeaderValue::from_static(\"1234\"));\n\n        assert_eq!(convert_headers_1x_0x(http1_headermap), expect);\n    }\n\n    #[test]\n    fn sdkbody_debug_dyn() {\n        let body = TestBody {\n            chunks: vec![\n                Chunk::Data(\"123\"),\n                Chunk::Data(\"456\"),\n                Chunk::Data(\"789\"),\n                Chunk::Trailers(trailers()),\n            ]\n            .into(),\n        };\n        let body = SdkBody::from_body_1_x(body);\n        assert!(format!(\"{body:?}\").contains(\"BoxBody\"));\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-types/src/body.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Types for representing the body of an HTTP request or response\n\nuse bytes::Bytes;\nuse pin_project_lite::pin_project;\nuse std::collections::VecDeque;\nuse std::error::Error as StdError;\nuse std::fmt::{self, Debug, Formatter};\nuse std::future::poll_fn;\nuse std::pin::Pin;\nuse std::sync::Arc;\nuse std::task::{Context, Poll};\n\n/// This module is named after the `http-body` version number since we anticipate\n/// needing to provide equivalent functionality for 1.x of that crate in the future.\n/// The name has a suffix `_x` to avoid name collision with a third-party `http-body-0-4`.\n#[cfg(feature = \"http-body-0-4-x\")]\npub mod http_body_0_4_x;\n#[cfg(feature = \"http-body-1-x\")]\npub mod http_body_1_x;\n\n/// A generic, boxed error that's `Send` and `Sync`\npub type Error = Box<dyn StdError + Send + Sync>;\n\npin_project! {\n    /// SdkBody type\n    ///\n    /// This is the Body used for dispatching all HTTP Requests.\n    /// For handling responses, the type of the body will be controlled\n    /// by the HTTP stack.\n    ///\n    pub struct SdkBody {\n        #[pin]\n        inner: Inner,\n        // An optional function to recreate the inner body\n        //\n        // In the event of retry, this function will be called to generate a new body. See\n        // [`try_clone()`](SdkBody::try_clone)\n        rebuild: Option<Arc<dyn (Fn() -> Inner) + Send + Sync>>,\n        bytes_contents: Option<Bytes>,\n        // Here the optionality indicates whether we have started streaming trailers, and the\n        // VecDeque serves as a buffer for trailer frames that are polled by poll_next instead\n        // of poll_next_trailers\n        trailers: Option<VecDeque<http_1x::HeaderMap>>,\n    }\n}\n\nimpl Debug for SdkBody {\n    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {\n        f.debug_struct(\"SdkBody\")\n            .field(\"inner\", &self.inner)\n            .field(\"retryable\", &self.rebuild.is_some())\n            .finish()\n    }\n}\n\n/// A boxed generic HTTP body that, when consumed, will result in [`Bytes`] or an [`Error`].\n#[allow(dead_code)]\nenum BoxBody {\n    // This is enabled by the **dependency**, not the feature. This allows us to construct it\n    // whenever we have the dependency and keep the APIs private\n    #[cfg(any(\n        feature = \"http-body-0-4-x\",\n        feature = \"http-body-1-x\",\n        feature = \"rt-tokio\"\n    ))]\n    // will be dead code with `--no-default-features --features rt-tokio`\n    HttpBody04(#[allow(dead_code)] http_body_0_4::combinators::BoxBody<Bytes, Error>),\n\n    #[cfg(feature = \"http-body-1-x\")]\n    HttpBody1(#[allow(dead_code)] http_body_util::combinators::BoxBody<Bytes, Error>),\n}\n\npin_project! {\n    #[project = InnerProj]\n    enum Inner {\n        // An in-memory body\n        Once {\n            inner: Option<Bytes>\n        },\n        // A streaming body\n        Dyn {\n            #[pin]\n            inner: BoxBody,\n        },\n\n        /// When a streaming body is transferred out to a stream parser, the body is replaced with\n        /// `Taken`. This will return an Error when polled. Attempting to read data out of a `Taken`\n        /// Body is a bug.\n        Taken,\n    }\n}\n\nimpl Debug for Inner {\n    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {\n        match &self {\n            Inner::Once { inner: once } => f.debug_tuple(\"Once\").field(once).finish(),\n            Inner::Dyn { .. } => write!(f, \"BoxBody\"),\n            Inner::Taken => f.debug_tuple(\"Taken\").finish(),\n        }\n    }\n}\n\nimpl SdkBody {\n    /// Construct an explicitly retryable SDK body\n    ///\n    /// _Note: This is probably not what you want_\n    ///\n    /// All bodies constructed from in-memory data (`String`, `Vec<u8>`, `Bytes`, etc.) will be\n    /// retryable out of the box. If you want to read data from a file, you should use\n    /// [`ByteStream::from_path`](crate::byte_stream::ByteStream::from_path). This function\n    /// is only necessary when you need to enable retries for your own streaming container.\n    pub fn retryable(f: impl Fn() -> SdkBody + Send + Sync + 'static) -> Self {\n        let initial = f();\n        SdkBody {\n            inner: initial.inner,\n            rebuild: Some(Arc::new(move || f().inner)),\n            bytes_contents: initial.bytes_contents,\n            trailers: None,\n        }\n    }\n\n    /// When an SdkBody is read, the inner data must be consumed. In order to do this, the SdkBody\n    /// is swapped with a \"taken\" body. This \"taken\" body cannot be read but aids in debugging.\n    pub fn taken() -> Self {\n        Self {\n            inner: Inner::Taken,\n            rebuild: None,\n            bytes_contents: None,\n            trailers: None,\n        }\n    }\n\n    /// Create an empty SdkBody for requests and responses that don't transfer any data in the body.\n    pub fn empty() -> Self {\n        Self {\n            inner: Inner::Once { inner: None },\n            rebuild: Some(Arc::new(|| Inner::Once { inner: None })),\n            bytes_contents: Some(Bytes::new()),\n            trailers: None,\n        }\n    }\n\n    pub(crate) async fn next(&mut self) -> Option<Result<Bytes, Error>> {\n        let mut me = Pin::new(self);\n        poll_fn(|cx| me.as_mut().poll_next(cx)).await\n    }\n\n    pub(crate) fn poll_next(\n        self: Pin<&mut Self>,\n        #[allow(unused)] cx: &mut Context<'_>,\n    ) -> Poll<Option<Result<Bytes, Error>>> {\n        let this = self.project();\n        match this.inner.project() {\n            InnerProj::Once { ref mut inner } => {\n                let data = inner.take();\n                match data {\n                    Some(bytes) if bytes.is_empty() => Poll::Ready(None),\n                    Some(bytes) => Poll::Ready(Some(Ok(bytes))),\n                    None => Poll::Ready(None),\n                }\n            }\n            InnerProj::Dyn { inner: body } => match body.get_mut() {\n                #[cfg(feature = \"http-body-0-4-x\")]\n                BoxBody::HttpBody04(box_body) => {\n                    use http_body_0_4::Body;\n                    Pin::new(box_body).poll_data(cx)\n                }\n                #[cfg(feature = \"http-body-1-x\")]\n                BoxBody::HttpBody1(box_body) => {\n                    // If this is polled after the trailers have been cached end early\n                    if this.trailers.is_some() {\n                        return Poll::Ready(None);\n                    }\n                    use http_body_1_0::Body;\n                    let maybe_data = Pin::new(box_body).poll_frame(cx);\n                    match maybe_data {\n                        Poll::Ready(Some(Ok(frame))) => {\n                            if frame.is_data() {\n                                Poll::Ready(Some(Ok(frame\n                                    .into_data()\n                                    .expect(\"Confirmed data frame\"))))\n                            } else if frame.is_trailers() {\n                                let trailers =\n                                    frame.into_trailers().expect(\"Confirmed trailer frame\");\n                                // Buffer the trailers for the trailer poll\n                                this.trailers.get_or_insert_with(VecDeque::new).push_back(trailers);\n\n                                Poll::Ready(None)\n                            } else {\n                                unreachable!(\"Frame must be either data or trailers\");\n                            }\n                        }\n                        Poll::Ready(Some(Err(err))) => Poll::Ready(Some(Err(err))),\n                        Poll::Ready(None) => Poll::Ready(None),\n                        Poll::Pending => Poll::Pending,\n                    }\n                }\n                #[allow(unreachable_patterns)]\n                _ => unreachable!(\n                    \"enabling `http-body-0-4-x` or `http-body-1-x` is the only way to create the `Dyn` variant\"\n                ),\n            },\n            InnerProj::Taken => {\n                Poll::Ready(Some(Err(\"A `Taken` body should never be polled\".into())))\n            }\n        }\n    }\n\n    #[allow(dead_code)]\n    #[cfg(any(\n        feature = \"http-body-0-4-x\",\n        feature = \"http-body-1-x\",\n        feature = \"rt-tokio\"\n    ))]\n    pub(crate) fn from_body_0_4_internal<T, E>(body: T) -> Self\n    where\n        T: http_body_0_4::Body<Data = Bytes, Error = E> + Send + Sync + 'static,\n        E: Into<Error> + 'static,\n    {\n        Self {\n            inner: Inner::Dyn {\n                inner: BoxBody::HttpBody04(http_body_0_4::combinators::BoxBody::new(\n                    body.map_err(Into::into),\n                )),\n            },\n            rebuild: None,\n            bytes_contents: None,\n            trailers: None,\n        }\n    }\n\n    #[cfg(feature = \"http-body-1-x\")]\n    pub(crate) fn from_body_1_x_internal<T, E>(body: T) -> Self\n    where\n        T: http_body_1_0::Body<Data = Bytes, Error = E> + Send + Sync + 'static,\n        E: Into<Error> + 'static,\n    {\n        use http_body_util::BodyExt;\n        Self {\n            inner: Inner::Dyn {\n                inner: BoxBody::HttpBody1(http_body_util::combinators::BoxBody::new(\n                    body.map_err(Into::into),\n                )),\n            },\n            rebuild: None,\n            bytes_contents: None,\n            trailers: None,\n        }\n    }\n\n    #[cfg(any(feature = \"http-body-0-4-x\", feature = \"http-body-1-x\",))]\n    pub(crate) fn poll_next_trailers(\n        self: Pin<&mut Self>,\n        cx: &mut Context<'_>,\n    ) -> Poll<Result<Option<http_1x::HeaderMap<http_1x::HeaderValue>>, Error>> {\n        // Three cases that matter here:\n        // 1) Both http-body features disabled, doesn't matter because this func won't compile\n        // 2) http-body-0-4-x enabled but 1-x disabled, we use the http_body_0_4_x conversion\n        // 3) http-body-1-x enabled (and 0-4-x is enabled or disabled), we use the 1-x conversion\n        // as our default whenever it is available\n        #[cfg(all(feature = \"http-body-0-4-x\", not(feature = \"http-body-1-x\")))]\n        use crate::body::http_body_0_4_x::convert_headers_0x_1x;\n        #[cfg(feature = \"http-body-1-x\")]\n        use crate::body::http_body_1_x::convert_headers_0x_1x;\n\n        let this = self.project();\n        match this.inner.project() {\n            InnerProj::Once { .. } => Poll::Ready(Ok(None)),\n            InnerProj::Dyn { inner } => match inner.get_mut() {\n                BoxBody::HttpBody04(box_body) => {\n                    use http_body_0_4::Body;\n                    let polled = Pin::new(box_body).poll_trailers(cx);\n\n                    match polled {\n                        Poll::Ready(Ok(maybe_trailers)) => {\n                            let http_1x_trailers = maybe_trailers.map(convert_headers_0x_1x);\n                            Poll::Ready(Ok(http_1x_trailers))\n                        }\n                        Poll::Ready(Err(err)) => Poll::Ready(Err(err)),\n                        Poll::Pending => Poll::Pending,\n                    }\n                }\n                #[cfg(feature = \"http-body-1-x\")]\n                BoxBody::HttpBody1(box_body) => {\n                    use http_body_1_0::Body;\n                    // Return the cached trailers without polling\n                    if let Some(trailer_buf) = this.trailers {\n                        if let Some(next_trailer) = trailer_buf.pop_front() {\n                            return Poll::Ready(Ok(Some(next_trailer)));\n                        }\n                    }\n\n                    let polled = Pin::new(box_body).poll_frame(cx);\n                    match polled {\n                        Poll::Ready(Some(Ok(maybe_trailers))) => {\n                            if maybe_trailers.is_data() {\n                                Poll::Ready(Err(\"Trailers polled while body still has data\".into()))\n                            } else {\n                                let trailers = maybe_trailers\n                                    .into_trailers()\n                                    .expect(\"Frame must be trailers because it is not data\");\n                                Poll::Ready(Ok(Some(trailers)))\n                            }\n                        }\n                        Poll::Ready(None) => Poll::Ready(Ok(None)),\n                        Poll::Ready(Some(Err(err))) => Poll::Ready(Err(err)),\n                        Poll::Pending => Poll::Pending,\n                    }\n                }\n            },\n            InnerProj::Taken => Poll::Ready(Err(\n                \"A `Taken` body should never be polled for trailers\".into(),\n            )),\n        }\n    }\n\n    /// If possible, return a reference to this body as `&[u8]`\n    ///\n    /// If this SdkBody is NOT streaming, this will return the byte slab\n    /// If this SdkBody is streaming, this will return `None`\n    pub fn bytes(&self) -> Option<&[u8]> {\n        match &self.bytes_contents {\n            Some(b) => Some(b),\n            None => None,\n        }\n    }\n\n    /// Attempt to clone this SdkBody. This will fail if the inner data is not cloneable, such as when\n    /// it is a single-use stream that can't be recreated.\n    pub fn try_clone(&self) -> Option<Self> {\n        self.rebuild.as_ref().map(|rebuild| {\n            let next = rebuild();\n            Self {\n                inner: next,\n                rebuild: self.rebuild.clone(),\n                bytes_contents: self.bytes_contents.clone(),\n                trailers: self.trailers.clone(),\n            }\n        })\n    }\n\n    /// Return `true` if this SdkBody is streaming, `false` if it is in-memory.\n    pub fn is_streaming(&self) -> bool {\n        matches!(self.inner, Inner::Dyn { .. })\n    }\n\n    /// Return the length, in bytes, of this SdkBody. If this returns `None`, then the body does not\n    /// have a known length.\n    pub fn content_length(&self) -> Option<u64> {\n        match self.bounds_on_remaining_length() {\n            (lo, Some(hi)) if lo == hi => Some(lo),\n            _ => None,\n        }\n    }\n\n    #[allow(dead_code)] // used by a feature-gated `http-body`'s trait method\n    pub(crate) fn is_end_stream(&self) -> bool {\n        match &self.inner {\n            Inner::Once { inner: None } => true,\n            Inner::Once { inner: Some(bytes) } => bytes.is_empty(),\n            Inner::Dyn { inner: box_body } => match box_body {\n                #[cfg(feature = \"http-body-0-4-x\")]\n                BoxBody::HttpBody04(box_body) => {\n                    use http_body_0_4::Body;\n                    box_body.is_end_stream()\n                }\n                #[cfg(feature = \"http-body-1-x\")]\n                BoxBody::HttpBody1(box_body) => {\n                    use http_body_1_0::Body;\n                    box_body.is_end_stream()\n                }\n                #[allow(unreachable_patterns)]\n                _ => unreachable!(\n                    \"enabling `http-body-0-4-x` or `http-body-1-x` is the only way to create the `Dyn` variant\"\n                ),\n            },\n            Inner::Taken => true,\n        }\n    }\n\n    pub(crate) fn bounds_on_remaining_length(&self) -> (u64, Option<u64>) {\n        match &self.inner {\n            Inner::Once { inner: None } => (0, Some(0)),\n            Inner::Once { inner: Some(bytes) } => {\n                let len = bytes.len() as u64;\n                (len, Some(len))\n            }\n            Inner::Dyn { inner: box_body } => match box_body {\n                #[cfg(feature = \"http-body-0-4-x\")]\n                BoxBody::HttpBody04(box_body) => {\n                    use http_body_0_4::Body;\n                    let hint = box_body.size_hint();\n                    (hint.lower(), hint.upper())\n                }\n                #[cfg(feature = \"http-body-1-x\")]\n                BoxBody::HttpBody1(box_body) => {\n                    use http_body_1_0::Body;\n                    let hint = box_body.size_hint();\n                    (hint.lower(), hint.upper())\n                }\n                #[allow(unreachable_patterns)]\n                _ => unreachable!(\n                    \"enabling `http-body-0-4-x` or `http-body-1-x` is the only way to create the `Dyn` variant\"\n                ),\n            },\n            Inner::Taken => (0, Some(0)),\n        }\n    }\n\n    /// Given a function to modify an `SdkBody`, run that function against this `SdkBody` before\n    /// returning the result.\n    pub fn map(self, f: impl Fn(SdkBody) -> SdkBody + Sync + Send + 'static) -> SdkBody {\n        if self.rebuild.is_some() {\n            SdkBody::retryable(move || f(self.try_clone().unwrap()))\n        } else {\n            f(self)\n        }\n    }\n\n    /// Update this `SdkBody` with `map`. **This function MUST NOT alter the data of the body.**\n    ///\n    /// This function is useful for adding metadata like progress tracking to an [`SdkBody`] that\n    /// does not alter the actual byte data. If your mapper alters the contents of the body, use [`SdkBody::map`]\n    /// instead.\n    pub fn map_preserve_contents(\n        self,\n        f: impl Fn(SdkBody) -> SdkBody + Sync + Send + 'static,\n    ) -> SdkBody {\n        let contents = self.bytes_contents.clone();\n        let mut out = if self.rebuild.is_some() {\n            SdkBody::retryable(move || f(self.try_clone().unwrap()))\n        } else {\n            f(self)\n        };\n        out.bytes_contents = contents;\n        out\n    }\n}\n\nimpl From<&str> for SdkBody {\n    fn from(s: &str) -> Self {\n        Self::from(s.as_bytes())\n    }\n}\n\nimpl From<Bytes> for SdkBody {\n    fn from(bytes: Bytes) -> Self {\n        let b = bytes.clone();\n        SdkBody {\n            inner: Inner::Once {\n                inner: Some(bytes.clone()),\n            },\n            rebuild: Some(Arc::new(move || Inner::Once {\n                inner: Some(bytes.clone()),\n            })),\n            bytes_contents: Some(b),\n            trailers: None,\n        }\n    }\n}\n\nimpl From<Vec<u8>> for SdkBody {\n    fn from(data: Vec<u8>) -> Self {\n        Self::from(Bytes::from(data))\n    }\n}\n\nimpl From<String> for SdkBody {\n    fn from(s: String) -> Self {\n        Self::from(s.into_bytes())\n    }\n}\n\nimpl From<&[u8]> for SdkBody {\n    fn from(data: &[u8]) -> Self {\n        Self::from(Bytes::copy_from_slice(data))\n    }\n}\n\n#[cfg(test)]\nmod test {\n    use crate::body::SdkBody;\n    use std::pin::Pin;\n\n    #[test]\n    fn valid_size_hint() {\n        assert_eq!(SdkBody::from(\"hello\").content_length(), Some(5));\n        assert_eq!(SdkBody::from(\"\").content_length(), Some(0));\n    }\n\n    #[allow(clippy::bool_assert_comparison)]\n    #[test]\n    fn valid_eos() {\n        assert_eq!(SdkBody::from(\"hello\").is_end_stream(), false);\n        assert_eq!(SdkBody::from(\"\").is_end_stream(), true);\n    }\n\n    #[tokio::test]\n    async fn http_body_consumes_data() {\n        let mut body = SdkBody::from(\"hello!\");\n        let mut body = Pin::new(&mut body);\n        assert!(!body.is_end_stream());\n        let data = body.next().await;\n        assert!(data.is_some());\n        let data = body.next().await;\n        assert!(data.is_none());\n        assert!(body.is_end_stream());\n    }\n\n    #[tokio::test]\n    async fn empty_body_returns_none() {\n        // Its important to avoid sending empty chunks of data to avoid H2 data frame problems\n        let mut body = SdkBody::from(\"\");\n        let mut body = Pin::new(&mut body);\n        let data = body.next().await;\n        assert!(data.is_none());\n    }\n\n    #[test]\n    fn sdkbody_debug_once() {\n        let body = SdkBody::from(\"123\");\n        assert!(format!(\"{body:?}\").contains(\"Once\"));\n    }\n\n    #[test]\n    fn sdk_body_is_send() {\n        fn is_send<T: Send>() {}\n        is_send::<SdkBody>()\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-types/src/byte_stream/bytestream_util/http_body_0_4_x.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse super::{PathBody, State, DEFAULT_OFFSET};\nuse std::future::Future;\nuse std::pin::Pin;\nuse std::task::Poll;\nuse tokio::fs::File;\nuse tokio::io;\nuse tokio::io::{AsyncReadExt, AsyncSeekExt};\nuse tokio_util::io::ReaderStream;\n\nimpl http_body_0_4::Body for PathBody {\n    type Data = bytes::Bytes;\n    type Error = Box<dyn std::error::Error + Send + Sync + 'static>;\n\n    fn poll_data(\n        mut self: Pin<&mut Self>,\n        cx: &mut std::task::Context<'_>,\n    ) -> Poll<Option<Result<Self::Data, Self::Error>>> {\n        let offset = self.offset.unwrap_or(DEFAULT_OFFSET);\n        loop {\n            match self.state {\n                State::Unloaded(ref path_buf) => {\n                    let buf = path_buf.clone();\n                    self.state = State::Loading(Box::pin(async move {\n                        let mut file = File::open(&buf).await?;\n\n                        if offset != 0 {\n                            let _s = file.seek(io::SeekFrom::Start(offset)).await?;\n                        }\n\n                        Ok(file)\n                    }));\n                }\n                State::Loading(ref mut future) => {\n                    match futures_core::ready!(Pin::new(future).poll(cx)) {\n                        Ok(file) => {\n                            self.state = State::Loaded {\n                                stream: ReaderStream::with_capacity(\n                                    file.take(self.length),\n                                    self.buffer_size,\n                                ),\n                                bytes_left: self.length,\n                            };\n                        }\n                        Err(e) => return Poll::Ready(Some(Err(e.into()))),\n                    };\n                }\n                State::Loaded {\n                    ref mut stream,\n                    ref mut bytes_left,\n                } => {\n                    use futures_core::Stream;\n                    return match futures_core::ready!(Pin::new(stream).poll_next(cx)) {\n                        Some(Ok(bytes)) => {\n                            *bytes_left -= bytes.len() as u64;\n                            Poll::Ready(Some(Ok(bytes)))\n                        }\n                        None => Poll::Ready(None),\n                        Some(Err(e)) => Poll::Ready(Some(Err(e.into()))),\n                    };\n                }\n            };\n        }\n    }\n\n    fn poll_trailers(\n        self: Pin<&mut Self>,\n        _cx: &mut std::task::Context<'_>,\n    ) -> std::task::Poll<Result<Option<http::HeaderMap>, Self::Error>> {\n        std::task::Poll::Ready(Ok(None))\n    }\n\n    fn is_end_stream(&self) -> bool {\n        match self.state {\n            State::Unloaded(_) | State::Loading(_) => self.length == 0,\n            State::Loaded { bytes_left, .. } => bytes_left == 0,\n        }\n    }\n\n    fn size_hint(&self) -> http_body_0_4::SizeHint {\n        http_body_0_4::SizeHint::with_exact(self.length)\n    }\n}\n\n#[cfg(test)]\nmod test {\n    use crate::byte_stream::{ByteStream, FsBuilder, Length};\n    use bytes::Buf;\n    use http_body_0_4::Body;\n    use std::io::Write;\n    use tempfile::NamedTempFile;\n\n    #[tokio::test]\n    async fn path_based_bytestreams_with_builder() {\n        let mut file = NamedTempFile::new().unwrap();\n\n        for i in 0..10000 {\n            writeln!(file, \"Brian was here. Briefly. {i}\").unwrap();\n        }\n        let file_length = file\n            .as_file()\n            .metadata()\n            .expect(\"file metadata is accessible\")\n            .len();\n\n        let body = FsBuilder::new()\n            .path(&file)\n            .buffer_size(16384)\n            .length(Length::Exact(file_length))\n            .build()\n            .await\n            .unwrap()\n            .into_inner();\n\n        // assert that the specified length is used as size hint\n        assert_eq!(body.content_length(), Some(file_length));\n\n        let mut body = body.try_clone().expect(\"retryable bodies are cloneable\");\n        // read a little bit from one of the clones\n        let some_data = body\n            .next()\n            .await\n            .expect(\"should have some data\")\n            .expect(\"read should not fail\");\n        // The size of one read should be equal to that of the buffer size\n        assert_eq!(some_data.len(), 16384);\n\n        assert_eq!(\n            ByteStream::new(body).collect().await.unwrap().remaining() as u64,\n            file_length - some_data.len() as u64\n        );\n    }\n\n    #[tokio::test]\n    async fn fsbuilder_length_is_used_as_size_hint() {\n        let mut file = NamedTempFile::new().unwrap();\n        write!(\n            file,\n            \"A very long sentence that's clearly longer than a single byte.\"\n        )\n        .unwrap();\n        // Ensure that the file was written to\n        file.flush().expect(\"flushing is OK\");\n\n        let body = FsBuilder::new()\n            .path(&file)\n            // The file is longer than 1 byte, let's see if this is used to generate the size hint\n            .length(Length::Exact(1))\n            .build()\n            .await\n            .unwrap()\n            .into_inner();\n\n        assert_eq!(body.content_length(), Some(1));\n    }\n\n    #[tokio::test]\n    async fn fsbuilder_is_end_stream() {\n        let sentence = \"A very long sentence that's clearly longer than a single byte.\";\n        let mut file = NamedTempFile::new().unwrap();\n        file.write_all(sentence.as_bytes()).unwrap();\n        // Ensure that the file was written to\n        file.flush().expect(\"flushing is OK\");\n\n        let mut body = FsBuilder::new()\n            .path(&file)\n            .build()\n            .await\n            .unwrap()\n            .into_inner();\n\n        assert!(!body.is_end_stream());\n        assert_eq!(body.content_length(), Some(sentence.len() as u64));\n\n        let data = body.data().await.unwrap().unwrap();\n        assert_eq!(data.len(), sentence.len());\n        assert!(body.is_end_stream());\n    }\n\n    #[tokio::test]\n    async fn fsbuilder_respects_length() {\n        let mut file = NamedTempFile::new().unwrap();\n        let line_0 = \"Line 0\\n\";\n        let line_1 = \"Line 1\\n\";\n\n        write!(file, \"{line_0}\").unwrap();\n        write!(file, \"{line_1}\").unwrap();\n\n        // Ensure that the file was written to\n        file.flush().expect(\"flushing is OK\");\n\n        let body = FsBuilder::new()\n            .path(&file)\n            // We're going to read line 0 only\n            .length(Length::Exact(line_0.len() as u64))\n            .build()\n            .await\n            .unwrap();\n\n        let data = body.collect().await.unwrap().into_bytes();\n        let data_str = String::from_utf8(data.to_vec()).unwrap();\n\n        assert_eq!(&data_str, line_0);\n    }\n\n    #[tokio::test]\n    async fn fsbuilder_length_exact() {\n        let mut file = NamedTempFile::new().unwrap();\n        let test_sentence = \"This sentence is 30 bytes long\";\n        assert_eq!(test_sentence.len(), 30);\n        write!(file, \"{test_sentence}\").unwrap();\n\n        // Ensure that the file was written to\n        file.flush().expect(\"flushing is OK\");\n\n        assert!(FsBuilder::new()\n            .path(&file)\n            // The file is 30 bytes so this is fine\n            .length(Length::Exact(29))\n            .build()\n            .await\n            .is_ok());\n\n        assert!(FsBuilder::new()\n            .path(&file)\n            // The file is 30 bytes so this is fine\n            .length(Length::Exact(30))\n            .build()\n            .await\n            .is_ok());\n\n        assert!(FsBuilder::new()\n            .path(&file)\n            // Larger than 30 bytes, this will cause an error\n            .length(Length::Exact(31))\n            .build()\n            .await\n            .is_err());\n    }\n\n    #[tokio::test]\n    async fn fsbuilder_supports_offset() {\n        let mut file = NamedTempFile::new().unwrap();\n        let line_0 = \"Line 0\\n\";\n        let line_1 = \"Line 1\\n\";\n\n        write!(file, \"{line_0}\").unwrap();\n        write!(file, \"{line_1}\").unwrap();\n\n        // Ensure that the file was written to\n        file.flush().expect(\"flushing is OK\");\n\n        let body = FsBuilder::new()\n            .path(&file)\n            // We're going to skip the first line by using offset\n            .offset(line_0.len() as u64)\n            .build()\n            .await\n            .unwrap();\n\n        let data = body.collect().await.unwrap().into_bytes();\n        let data_str = String::from_utf8(data.to_vec()).unwrap();\n\n        assert_eq!(&data_str, line_1);\n    }\n\n    #[tokio::test]\n    async fn fsbuilder_offset_and_length_work_together() {\n        let mut file = NamedTempFile::new().unwrap();\n        let line_0 = \"Line 0\\n\";\n        let line_1 = \"Line 1\\n\";\n        let line_2 = \"Line 2\\n\";\n\n        write!(file, \"{line_0}\").unwrap();\n        write!(file, \"{line_1}\").unwrap();\n        write!(file, \"{line_2}\").unwrap();\n\n        // Ensure that the file was written to\n        file.flush().expect(\"flushing is OK\");\n\n        let body = FsBuilder::new()\n            .path(&file)\n            // We're going to skip line 0 by using offset\n            .offset(line_0.len() as u64)\n            // We want to read only line 1 and stop before we get to line 2\n            .length(Length::Exact(line_1.len() as u64))\n            .build()\n            .await\n            .unwrap();\n\n        let data = body.collect().await.unwrap().into_bytes();\n        let data_str = String::from_utf8(data.to_vec()).unwrap();\n\n        assert_eq!(&data_str, line_1);\n    }\n\n    #[tokio::test]\n    async fn fsbuilder_with_offset_greater_than_file_length_returns_error() {\n        let mut file = NamedTempFile::new().unwrap();\n        let line_0 = \"Line 0\\n\";\n        let line_1 = \"Line 1\\n\";\n\n        write!(file, \"{line_0}\").unwrap();\n        write!(file, \"{line_1}\").unwrap();\n\n        // Ensure that the file was written to\n        file.flush().expect(\"flushing is OK\");\n\n        assert_eq!(\n            FsBuilder::new()\n                .path(&file)\n                // We're going to skip all file contents by setting an offset\n                // much larger than the file size\n                .offset(9000)\n                .build()\n                .await\n                .unwrap_err()\n                .to_string(),\n            \"offset must be less than or equal to file size but was greater than\"\n        );\n    }\n\n    #[tokio::test]\n    async fn fsbuilder_with_length_greater_than_file_length_reads_everything() {\n        let mut file = NamedTempFile::new().unwrap();\n        let line_0 = \"Line 0\\n\";\n        let line_1 = \"Line 1\\n\";\n\n        write!(file, \"{line_0}\").unwrap();\n        write!(file, \"{line_1}\").unwrap();\n\n        // Ensure that the file was written to\n        file.flush().expect(\"flushing is OK\");\n\n        let body = FsBuilder::new()\n            .path(&file)\n            .length(Length::UpTo(9000))\n            .build()\n            .await\n            .unwrap();\n\n        let data = body.collect().await.unwrap().into_bytes();\n        let data_str = String::from_utf8(data.to_vec()).unwrap();\n\n        assert_eq!(data_str, format!(\"{line_0}{line_1}\"));\n    }\n\n    #[tokio::test]\n    async fn fsbuilder_can_be_used_for_chunking() {\n        let mut file = NamedTempFile::new().unwrap();\n        let mut in_memory_copy_of_file_contents = String::new();\n        // I put these two write loops in separate blocks so that the traits wouldn't conflict\n        {\n            use std::io::Write;\n            for i in 0..1000 {\n                writeln!(file, \"Line {i:04}\").unwrap();\n            }\n        }\n\n        {\n            use std::fmt::Write;\n            for i in 0..1000 {\n                writeln!(in_memory_copy_of_file_contents, \"Line {i:04}\").unwrap();\n            }\n            // Check we wrote the lines\n            assert!(!in_memory_copy_of_file_contents.is_empty());\n        }\n\n        let file_size = file.as_file().metadata().unwrap().len();\n        // Check that our in-memory copy has the same size as the file\n        assert_eq!(file_size, in_memory_copy_of_file_contents.len() as u64);\n        let file_path = file.path().to_path_buf();\n        let chunks = 7;\n        let chunk_size = file_size / chunks;\n\n        let mut byte_streams = Vec::new();\n        for i in 0..chunks {\n            let length = if i == chunks - 1 {\n                // If we're on the last chunk, the length to read might be less than a whole chunk.\n                // We subtract the size of all previous chunks from the total file size to get the\n                // size of the final chunk.\n                file_size - (i * chunk_size)\n            } else {\n                chunk_size\n            };\n\n            let byte_stream = FsBuilder::new()\n                .path(&file_path)\n                .offset(i * chunk_size)\n                .length(Length::Exact(length))\n                .build()\n                .await\n                .unwrap();\n\n            byte_streams.push(byte_stream);\n        }\n\n        let mut collected_bytes = Vec::new();\n\n        for byte_stream in byte_streams.into_iter() {\n            let bytes = byte_stream.collect().await.unwrap().into_bytes();\n            collected_bytes.push(bytes);\n        }\n\n        let bytes = collected_bytes.concat();\n        let data_str = String::from_utf8(bytes.to_vec()).unwrap();\n\n        assert_eq!(data_str, in_memory_copy_of_file_contents);\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-types/src/byte_stream/bytestream_util/http_body_1_x.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse super::{PathBody, State, DEFAULT_OFFSET};\nuse http_body_1_0::{Body, Frame, SizeHint};\nuse std::future::Future;\nuse std::pin::Pin;\nuse std::task::Poll;\nuse tokio::fs::File;\nuse tokio::io::{AsyncReadExt, AsyncSeekExt, SeekFrom};\nuse tokio_util::io::ReaderStream;\n\nimpl Body for PathBody {\n    type Data = bytes::Bytes;\n    type Error = Box<dyn std::error::Error + Send + Sync + 'static>;\n\n    fn poll_frame(\n        mut self: Pin<&mut Self>,\n        cx: &mut std::task::Context<'_>,\n    ) -> Poll<Option<Result<Frame<Self::Data>, Self::Error>>> {\n        let offset = self.offset.unwrap_or(DEFAULT_OFFSET);\n        loop {\n            match self.state {\n                State::Unloaded(ref path_buf) => {\n                    let buf = path_buf.clone();\n                    self.state = State::Loading(Box::pin(async move {\n                        let mut file = File::open(&buf).await?;\n\n                        if offset != 0 {\n                            let _s = file.seek(SeekFrom::Start(offset)).await?;\n                        }\n\n                        Ok(file)\n                    }));\n                }\n                State::Loading(ref mut future) => {\n                    match futures_core::ready!(Pin::new(future).poll(cx)) {\n                        Ok(file) => {\n                            self.state = State::Loaded {\n                                stream: ReaderStream::with_capacity(\n                                    file.take(self.length),\n                                    self.buffer_size,\n                                ),\n                                bytes_left: self.length,\n                            };\n                        }\n                        Err(e) => return Poll::Ready(Some(Err(e.into()))),\n                    };\n                }\n                State::Loaded {\n                    ref mut stream,\n                    ref mut bytes_left,\n                } => {\n                    use futures_core::Stream;\n                    return match futures_core::ready!(Pin::new(stream).poll_next(cx)) {\n                        Some(Ok(bytes)) => {\n                            *bytes_left -= bytes.len() as u64;\n                            Poll::Ready(Some(Ok(Frame::data(bytes))))\n                        }\n                        None => Poll::Ready(None),\n                        Some(Err(e)) => Poll::Ready(Some(Err(e.into()))),\n                    };\n                }\n            };\n        }\n    }\n\n    fn is_end_stream(&self) -> bool {\n        match self.state {\n            State::Unloaded(_) | State::Loading(_) => self.length == 0,\n            State::Loaded { bytes_left, .. } => bytes_left == 0,\n        }\n    }\n\n    fn size_hint(&self) -> SizeHint {\n        SizeHint::with_exact(self.length)\n    }\n}\n\n#[cfg(test)]\nmod test {\n    use crate::byte_stream::{ByteStream, FsBuilder, Length};\n    use bytes::Buf;\n    use http_body_util::BodyExt;\n    use std::io::Write;\n    use tempfile::NamedTempFile;\n\n    #[tokio::test]\n    async fn path_based_bytestreams_with_builder() {\n        let mut file = NamedTempFile::new().unwrap();\n\n        for i in 0..10000 {\n            writeln!(file, \"Brian was here. Briefly. {i}\").unwrap();\n        }\n        let file_length = file\n            .as_file()\n            .metadata()\n            .expect(\"file metadata is accessible\")\n            .len();\n\n        let body = FsBuilder::new()\n            .path(&file)\n            .buffer_size(16384)\n            .length(Length::Exact(file_length))\n            .build()\n            .await\n            .unwrap()\n            .into_inner();\n\n        // assert that the specified length is used as size hint\n        assert_eq!(body.content_length(), Some(file_length));\n\n        let mut body = body.try_clone().expect(\"retryable bodies are cloneable\");\n        // read a little bit from one of the clones\n        let some_data = body\n            .next()\n            .await\n            .expect(\"should have some data\")\n            .expect(\"read should not fail\");\n        // The size of one read should be equal to that of the buffer size\n        assert_eq!(some_data.len(), 16384);\n\n        assert_eq!(\n            ByteStream::new(body).collect().await.unwrap().remaining() as u64,\n            file_length - some_data.len() as u64\n        );\n    }\n\n    #[tokio::test]\n    async fn fsbuilder_length_is_used_as_size_hint() {\n        let mut file = NamedTempFile::new().unwrap();\n        write!(\n            file,\n            \"A very long sentence that's clearly longer than a single byte.\"\n        )\n        .unwrap();\n        // Ensure that the file was written to\n        file.flush().expect(\"flushing is OK\");\n\n        let body = FsBuilder::new()\n            .path(&file)\n            // The file is longer than 1 byte, let's see if this is used to generate the size hint\n            .length(Length::Exact(1))\n            .build()\n            .await\n            .unwrap()\n            .into_inner();\n\n        assert_eq!(body.content_length(), Some(1));\n    }\n\n    #[tokio::test]\n    async fn fsbuilder_is_end_stream() {\n        let sentence = \"A very long sentence that's clearly longer than a single byte.\";\n        let mut file = NamedTempFile::new().unwrap();\n        file.write_all(sentence.as_bytes()).unwrap();\n        // Ensure that the file was written to\n        file.flush().expect(\"flushing is OK\");\n\n        let body = FsBuilder::new()\n            .path(&file)\n            .build()\n            .await\n            .unwrap()\n            .into_inner();\n\n        assert!(!body.is_end_stream());\n        assert_eq!(body.content_length(), Some(sentence.len() as u64));\n        let data = BodyExt::collect(body).await.unwrap().to_bytes();\n        assert_eq!(data, sentence);\n    }\n\n    #[tokio::test]\n    async fn fsbuilder_respects_length() {\n        let mut file = NamedTempFile::new().unwrap();\n        let line_0 = \"Line 0\\n\";\n        let line_1 = \"Line 1\\n\";\n\n        write!(file, \"{line_0}\").unwrap();\n        write!(file, \"{line_1}\").unwrap();\n\n        // Ensure that the file was written to\n        file.flush().expect(\"flushing is OK\");\n\n        let body = FsBuilder::new()\n            .path(&file)\n            // We're going to read line 0 only\n            .length(Length::Exact(line_0.len() as u64))\n            .build()\n            .await\n            .unwrap();\n\n        let data = body.collect().await.unwrap().into_bytes();\n        let data_str = String::from_utf8(data.to_vec()).unwrap();\n\n        assert_eq!(&data_str, line_0);\n    }\n\n    #[tokio::test]\n    async fn fsbuilder_length_exact() {\n        let mut file = NamedTempFile::new().unwrap();\n        let test_sentence = \"This sentence is 30 bytes long\";\n        assert_eq!(test_sentence.len(), 30);\n        write!(file, \"{test_sentence}\").unwrap();\n\n        // Ensure that the file was written to\n        file.flush().expect(\"flushing is OK\");\n\n        assert!(FsBuilder::new()\n            .path(&file)\n            // The file is 30 bytes so this is fine\n            .length(Length::Exact(29))\n            .build()\n            .await\n            .is_ok());\n\n        assert!(FsBuilder::new()\n            .path(&file)\n            // The file is 30 bytes so this is fine\n            .length(Length::Exact(30))\n            .build()\n            .await\n            .is_ok());\n\n        assert!(FsBuilder::new()\n            .path(&file)\n            // Larger than 30 bytes, this will cause an error\n            .length(Length::Exact(31))\n            .build()\n            .await\n            .is_err());\n    }\n\n    #[tokio::test]\n    async fn fsbuilder_supports_offset() {\n        let mut file = NamedTempFile::new().unwrap();\n        let line_0 = \"Line 0\\n\";\n        let line_1 = \"Line 1\\n\";\n\n        write!(file, \"{line_0}\").unwrap();\n        write!(file, \"{line_1}\").unwrap();\n\n        // Ensure that the file was written to\n        file.flush().expect(\"flushing is OK\");\n\n        let body = FsBuilder::new()\n            .path(&file)\n            // We're going to skip the first line by using offset\n            .offset(line_0.len() as u64)\n            .build()\n            .await\n            .unwrap();\n\n        let data = body.collect().await.unwrap().into_bytes();\n        let data_str = String::from_utf8(data.to_vec()).unwrap();\n\n        assert_eq!(&data_str, line_1);\n    }\n\n    #[tokio::test]\n    async fn fsbuilder_offset_and_length_work_together() {\n        let mut file = NamedTempFile::new().unwrap();\n        let line_0 = \"Line 0\\n\";\n        let line_1 = \"Line 1\\n\";\n        let line_2 = \"Line 2\\n\";\n\n        write!(file, \"{line_0}\").unwrap();\n        write!(file, \"{line_1}\").unwrap();\n        write!(file, \"{line_2}\").unwrap();\n\n        // Ensure that the file was written to\n        file.flush().expect(\"flushing is OK\");\n\n        let body = FsBuilder::new()\n            .path(&file)\n            // We're going to skip line 0 by using offset\n            .offset(line_0.len() as u64)\n            // We want to read only line 1 and stop before we get to line 2\n            .length(Length::Exact(line_1.len() as u64))\n            .build()\n            .await\n            .unwrap();\n\n        let data = body.collect().await.unwrap().into_bytes();\n        let data_str = String::from_utf8(data.to_vec()).unwrap();\n\n        assert_eq!(&data_str, line_1);\n    }\n\n    #[tokio::test]\n    async fn fsbuilder_with_offset_greater_than_file_length_returns_error() {\n        let mut file = NamedTempFile::new().unwrap();\n        let line_0 = \"Line 0\\n\";\n        let line_1 = \"Line 1\\n\";\n\n        write!(file, \"{line_0}\").unwrap();\n        write!(file, \"{line_1}\").unwrap();\n\n        // Ensure that the file was written to\n        file.flush().expect(\"flushing is OK\");\n\n        assert_eq!(\n            FsBuilder::new()\n                .path(&file)\n                // We're going to skip all file contents by setting an offset\n                // much larger than the file size\n                .offset(9000)\n                .build()\n                .await\n                .unwrap_err()\n                .to_string(),\n            \"offset must be less than or equal to file size but was greater than\"\n        );\n    }\n\n    #[tokio::test]\n    async fn fsbuilder_with_length_greater_than_file_length_reads_everything() {\n        let mut file = NamedTempFile::new().unwrap();\n        let line_0 = \"Line 0\\n\";\n        let line_1 = \"Line 1\\n\";\n\n        write!(file, \"{line_0}\").unwrap();\n        write!(file, \"{line_1}\").unwrap();\n\n        // Ensure that the file was written to\n        file.flush().expect(\"flushing is OK\");\n\n        let body = FsBuilder::new()\n            .path(&file)\n            .length(Length::UpTo(9000))\n            .build()\n            .await\n            .unwrap();\n\n        let data = body.collect().await.unwrap().into_bytes();\n        let data_str = String::from_utf8(data.to_vec()).unwrap();\n\n        assert_eq!(data_str, format!(\"{line_0}{line_1}\"));\n    }\n\n    #[tokio::test]\n    async fn fsbuilder_can_be_used_for_chunking() {\n        let mut file = NamedTempFile::new().unwrap();\n        let mut in_memory_copy_of_file_contents = String::new();\n        // I put these two write loops in separate blocks so that the traits wouldn't conflict\n        {\n            use std::io::Write;\n            for i in 0..1000 {\n                writeln!(file, \"Line {i:04}\").unwrap();\n            }\n        }\n\n        {\n            use std::fmt::Write;\n            for i in 0..1000 {\n                writeln!(in_memory_copy_of_file_contents, \"Line {i:04}\").unwrap();\n            }\n            // Check we wrote the lines\n            assert!(!in_memory_copy_of_file_contents.is_empty());\n        }\n\n        let file_size = file.as_file().metadata().unwrap().len();\n        // Check that our in-memory copy has the same size as the file\n        assert_eq!(file_size, in_memory_copy_of_file_contents.len() as u64);\n        let file_path = file.path().to_path_buf();\n        let chunks = 7;\n        let chunk_size = file_size / chunks;\n\n        let mut byte_streams = Vec::new();\n        for i in 0..chunks {\n            let length = if i == chunks - 1 {\n                // If we're on the last chunk, the length to read might be less than a whole chunk.\n                // We subtract the size of all previous chunks from the total file size to get the\n                // size of the final chunk.\n                file_size - (i * chunk_size)\n            } else {\n                chunk_size\n            };\n\n            let byte_stream = FsBuilder::new()\n                .path(&file_path)\n                .offset(i * chunk_size)\n                .length(Length::Exact(length))\n                .build()\n                .await\n                .unwrap();\n\n            byte_streams.push(byte_stream);\n        }\n\n        let mut collected_bytes = Vec::new();\n\n        for byte_stream in byte_streams.into_iter() {\n            let bytes = byte_stream.collect().await.unwrap().into_bytes();\n            collected_bytes.push(bytes);\n        }\n\n        let bytes = collected_bytes.concat();\n        let data_str = String::from_utf8(bytes.to_vec()).unwrap();\n\n        assert_eq!(data_str, in_memory_copy_of_file_contents);\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-types/src/byte_stream/bytestream_util.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::body::SdkBody;\nuse crate::byte_stream::{error::Error, error::ErrorKind, ByteStream};\nuse std::cmp::min;\nuse std::future::Future;\nuse std::path::PathBuf;\nuse std::pin::Pin;\nuse tokio::fs::File;\nuse tokio::io::{self, AsyncReadExt, AsyncSeekExt};\nuse tokio_util::io::ReaderStream;\n\n// TODO(https://github.com/smithy-lang/smithy-rs/issues/1925)\n//     Feature gating this now would break the\n//     `cargo check --no-default-features --features rt-tokio` test.\n// #[cfg(feature = \"http-body-0-4-x\")]\nmod http_body_0_4_x;\n\n#[cfg(feature = \"http-body-1-x\")]\nmod http_body_1_x;\n\n// 4KB corresponds to the default buffer size used by Tokio's ReaderStream\nconst DEFAULT_BUFFER_SIZE: usize = 4096;\n// By default, read files from their start\nconst DEFAULT_OFFSET: u64 = 0;\n\n/// An HTTP Body designed to wrap files\n///\n/// PathBody is a three-phase HTTP body designed to wrap files with three specific features:\n/// 1. The underlying file is wrapped with StreamReader to implement HTTP body\n/// 2. It can be constructed directly from a path so it's easy to use during retries\n/// 3. Provide size hint\nstruct PathBody {\n    state: State,\n    // The number of bytes to read\n    length: u64,\n    buffer_size: usize,\n    // The byte-offset to start reading from\n    offset: Option<u64>,\n}\n\nimpl PathBody {\n    fn from_path(path_buf: PathBuf, length: u64, buffer_size: usize, offset: Option<u64>) -> Self {\n        PathBody {\n            state: State::Unloaded(path_buf),\n            length,\n            buffer_size,\n            offset,\n        }\n    }\n\n    fn from_file(file: File, length: u64, buffer_size: usize) -> Self {\n        PathBody {\n            state: State::Loaded {\n                stream: ReaderStream::with_capacity(file.take(length), buffer_size),\n                bytes_left: length,\n            },\n            length,\n            buffer_size,\n            // The file used to create this `PathBody` should have already had an offset applied\n            offset: None,\n        }\n    }\n}\n\n/// Builder for creating [`ByteStreams`](ByteStream) from a file/path, with full control over advanced options.\n///\n/// ```no_run\n/// # #[cfg(feature = \"rt-tokio\")]\n/// # {\n/// use aws_smithy_types::byte_stream::{ByteStream, Length};\n/// use std::path::Path;\n/// struct GetObjectInput {\n///     body: ByteStream\n/// }\n///\n/// async fn bytestream_from_file() -> GetObjectInput {\n///     let bytestream = ByteStream::read_from()\n///         .path(\"docs/some-large-file.csv\")\n///         // Specify the size of the buffer used to read the file (in bytes, default is 4096)\n///         .buffer_size(32_784)\n///         // Specify the length of the file used (skips an additional call to retrieve the size)\n///         .length(Length::UpTo(123_456))\n///         .build()\n///         .await\n///         .expect(\"valid path\");\n///     GetObjectInput { body: bytestream }\n/// }\n/// # }\n/// ```\n#[allow(missing_debug_implementations)]\npub struct FsBuilder {\n    file: Option<File>,\n    path: Option<PathBuf>,\n    length: Option<Length>,\n    buffer_size: usize,\n    offset: Option<u64>,\n}\n\nimpl Default for FsBuilder {\n    fn default() -> Self {\n        Self::new()\n    }\n}\n\n/// The length (in bytes) to read. Determines whether or not a short read counts as an error.\n#[allow(missing_debug_implementations)]\npub enum Length {\n    /// Read this number of bytes exactly. Returns an error if the file is smaller than expected.\n    Exact(u64),\n    /// Read up to this number of bytes. May read less than the specified amount if the file\n    /// is smaller than expected.\n    UpTo(u64),\n}\n\nimpl FsBuilder {\n    /// Create a new [`FsBuilder`] (using a default read buffer of 4096 bytes).\n    ///\n    /// You must then call either [`file`](FsBuilder::file) or [`path`](FsBuilder::path) to specify what to read from.\n    pub fn new() -> Self {\n        Self {\n            buffer_size: DEFAULT_BUFFER_SIZE,\n            file: None,\n            length: None,\n            offset: None,\n            path: None,\n        }\n    }\n\n    /// Sets the path to read from.\n    ///\n    /// NOTE: The resulting ByteStream (after calling [build](FsBuilder::build)) will be retryable.\n    /// The returned ByteStream will provide a size hint when used as an HTTP body.\n    /// If the request fails, the read will begin again by reloading the file handle.\n    pub fn path(mut self, path: impl AsRef<std::path::Path>) -> Self {\n        self.path = Some(path.as_ref().to_path_buf());\n        self\n    }\n\n    /// Sets the file to read from.\n    ///\n    /// NOTE: The resulting ByteStream (after calling [build](FsBuilder::build)) will not be a retryable ByteStream.\n    /// For a ByteStream that can be retried in the case of upstream failures, use [`FsBuilder::path`](FsBuilder::path).\n    pub fn file(mut self, file: File) -> Self {\n        self.file = Some(file);\n        self\n    }\n\n    /// Specify the length to read (in bytes).\n    ///\n    /// By pre-specifying the length, this API skips an additional call to retrieve the size from file-system metadata.\n    ///\n    /// When used in conjunction with [`offset`](FsBuilder::offset), allows for reading a single \"chunk\" of a file.\n    pub fn length(mut self, length: Length) -> Self {\n        self.length = Some(length);\n        self\n    }\n\n    /// Specify the size of the buffer used to read the file (in bytes).\n    ///\n    /// Increasing the read buffer capacity to higher values than the default (4096 bytes) can result in a large reduction\n    /// in CPU usage, at the cost of memory increase.\n    pub fn buffer_size(mut self, buffer_size: usize) -> Self {\n        self.buffer_size = buffer_size;\n        self\n    }\n\n    /// Specify the offset to start reading from (in bytes)\n    ///\n    /// When used in conjunction with [`length`](FsBuilder::length), allows for reading a single \"chunk\" of a file.\n    pub fn offset(mut self, offset: u64) -> Self {\n        self.offset = Some(offset);\n        self\n    }\n\n    /// Returns a [`ByteStream`] from this builder.\n    pub async fn build(self) -> Result<ByteStream, Error> {\n        if self.path.is_some() && self.file.is_some() {\n            panic!(\"The 'file' and 'path' options on an FsBuilder are mutually exclusive but both were set. Please set only one\")\n        };\n\n        let buffer_size = self.buffer_size;\n        let offset = self.offset.unwrap_or(DEFAULT_OFFSET);\n        // Checking the file length like this does have a cost, but the benefit is that we can\n        // notify users when file/chunk is smaller than expected.\n        let file_length = self.get_file_size().await?;\n        if offset > file_length {\n            return Err(ErrorKind::OffsetLargerThanFileSize.into());\n        }\n\n        let remaining_file_length = file_length - offset;\n        let length = match self.length {\n            Some(Length::Exact(length)) => {\n                if length > remaining_file_length {\n                    return Err(ErrorKind::LengthLargerThanFileSizeMinusReadOffset.into());\n                }\n                length\n            }\n            Some(Length::UpTo(length)) => min(length, remaining_file_length),\n            None => remaining_file_length,\n        };\n\n        if let Some(path) = self.path {\n            let body_loader = move || {\n                // If an offset was provided, seeking will be handled in `PathBody::poll_data` each\n                // time the file is loaded.\n                #[cfg(not(feature = \"http-body-1-x\"))]\n                return SdkBody::from_body_0_4_internal(PathBody::from_path(\n                    path.clone(),\n                    length,\n                    buffer_size,\n                    self.offset,\n                ));\n                #[cfg(feature = \"http-body-1-x\")]\n                return SdkBody::from_body_1_x_internal(PathBody::from_path(\n                    path.clone(),\n                    length,\n                    buffer_size,\n                    self.offset,\n                ));\n            };\n\n            Ok(ByteStream::new(SdkBody::retryable(body_loader)))\n        } else if let Some(mut file) = self.file {\n            // When starting from a `File`, we need to do our own seeking\n            if offset != 0 {\n                let _s = file.seek(io::SeekFrom::Start(offset)).await?;\n            }\n\n            #[cfg(not(feature = \"http-body-1-x\"))]\n            let body =\n                SdkBody::from_body_0_4_internal(PathBody::from_file(file, length, buffer_size));\n            #[cfg(feature = \"http-body-1-x\")]\n            let body =\n                SdkBody::from_body_1_x_internal(PathBody::from_file(file, length, buffer_size));\n\n            Ok(ByteStream::new(body))\n        } else {\n            panic!(\"FsBuilder constructed without a file or a path\")\n        }\n    }\n\n    async fn get_file_size(&self) -> Result<u64, Error> {\n        Ok(match self.path.as_ref() {\n            Some(path) => tokio::fs::metadata(path).await,\n            // If it's not path-based then it's file-based\n            None => self.file.as_ref().unwrap().metadata().await,\n        }\n        .map(|metadata| metadata.len())?)\n    }\n}\n\nenum State {\n    Unloaded(PathBuf),\n    Loading(Pin<Box<dyn Future<Output = io::Result<File>> + Send + Sync + 'static>>),\n    Loaded {\n        stream: ReaderStream<io::Take<File>>,\n        bytes_left: u64,\n    },\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use std::io::Write;\n    use tempfile::NamedTempFile;\n\n    #[tokio::test]\n    async fn length_up_to_should_work() {\n        const FILE_LEN: usize = 1000;\n        // up to less than `FILE_LEN`\n        {\n            let mut file = NamedTempFile::new().unwrap();\n            file.write_all(vec![0; FILE_LEN].as_slice()).unwrap();\n            let byte_stream = FsBuilder::new()\n                .path(file.path())\n                .length(Length::UpTo((FILE_LEN / 2) as u64))\n                .build()\n                .await\n                .unwrap();\n            let (lower, upper) = byte_stream.size_hint();\n            assert_eq!(lower, upper.unwrap());\n            assert_eq!((FILE_LEN / 2) as u64, lower);\n        }\n        // up to equal to `FILE_LEN`\n        {\n            let mut file = NamedTempFile::new().unwrap();\n            file.write_all(vec![0; FILE_LEN].as_slice()).unwrap();\n            let byte_stream = FsBuilder::new()\n                .path(file.path())\n                .length(Length::UpTo(FILE_LEN as u64))\n                .build()\n                .await\n                .unwrap();\n            let (lower, upper) = byte_stream.size_hint();\n            assert_eq!(lower, upper.unwrap());\n            assert_eq!(FILE_LEN as u64, lower);\n        }\n        // up to greater than `FILE_LEN`\n        {\n            let mut file = NamedTempFile::new().unwrap();\n            file.write_all(vec![0; FILE_LEN].as_slice()).unwrap();\n            let byte_stream = FsBuilder::new()\n                .path(file.path())\n                .length(Length::UpTo((FILE_LEN * 2) as u64))\n                .build()\n                .await\n                .unwrap();\n            let (lower, upper) = byte_stream.size_hint();\n            assert_eq!(lower, upper.unwrap());\n            assert_eq!(FILE_LEN as u64, lower);\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-types/src/byte_stream/error.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Errors related to bytestreams.\n\nuse std::error::Error as StdError;\nuse std::fmt;\nuse std::io::Error as IoError;\n\n#[derive(Debug)]\npub(super) enum ErrorKind {\n    #[cfg(feature = \"rt-tokio\")]\n    OffsetLargerThanFileSize,\n    #[cfg(feature = \"rt-tokio\")]\n    LengthLargerThanFileSizeMinusReadOffset,\n    IoError(IoError),\n    StreamingError(Box<dyn StdError + Send + Sync + 'static>),\n}\n\n/// An error occurred in the byte stream\n#[derive(Debug)]\npub struct Error {\n    kind: ErrorKind,\n}\n\nimpl Error {\n    pub(super) fn streaming(err: impl Into<Box<dyn StdError + Send + Sync + 'static>>) -> Self {\n        ErrorKind::StreamingError(err.into()).into()\n    }\n}\n\nimpl From<ErrorKind> for Error {\n    fn from(kind: ErrorKind) -> Self {\n        Self { kind }\n    }\n}\n\nimpl From<IoError> for Error {\n    fn from(err: IoError) -> Self {\n        ErrorKind::IoError(err).into()\n    }\n}\n\nimpl fmt::Display for Error {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        match self.kind {\n            #[cfg(feature = \"rt-tokio\")]\n            ErrorKind::OffsetLargerThanFileSize => write!(\n                f,\n                \"offset must be less than or equal to file size but was greater than\"\n            ),\n            #[cfg(feature = \"rt-tokio\")]\n            ErrorKind::LengthLargerThanFileSizeMinusReadOffset => write!(\n                f,\n                \"`Length::Exact` was larger than file size minus read offset\"\n            ),\n            ErrorKind::IoError(_) => write!(f, \"IO error\"),\n            ErrorKind::StreamingError(_) => write!(f, \"streaming error\"),\n        }\n    }\n}\n\nimpl StdError for Error {\n    fn source(&self) -> Option<&(dyn StdError + 'static)> {\n        match &self.kind {\n            ErrorKind::IoError(err) => Some(err as _),\n            ErrorKind::StreamingError(err) => Some(err.as_ref() as _),\n            #[cfg(feature = \"rt-tokio\")]\n            ErrorKind::OffsetLargerThanFileSize\n            | ErrorKind::LengthLargerThanFileSizeMinusReadOffset => None,\n        }\n    }\n}\n\nimpl From<Error> for IoError {\n    fn from(err: Error) -> Self {\n        IoError::other(err)\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-types/src/byte_stream/http_body_0_4_x.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::body::SdkBody;\nuse crate::byte_stream::ByteStream;\nuse bytes::Bytes;\n\nimpl ByteStream {\n    /// Construct a `ByteStream` from a type that implements [`http_body_0_4::Body<Data = Bytes>`](http_body_0_4::Body).\n    ///\n    /// _Note: This is only available when the `http-body-0-4-x` feature is enabled._\n    pub fn from_body_0_4<T, E>(body: T) -> Self\n    where\n        T: http_body_0_4::Body<Data = Bytes, Error = E> + Send + Sync + 'static,\n        E: Into<crate::body::Error> + 'static,\n    {\n        ByteStream::new(SdkBody::from_body_0_4(body))\n    }\n}\n\n#[cfg(feature = \"hyper-0-14-x\")]\nimpl From<hyper_0_14::Body> for ByteStream {\n    fn from(input: hyper_0_14::Body) -> Self {\n        ByteStream::new(SdkBody::from_body_0_4(input))\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use crate::body::SdkBody;\n    use crate::byte_stream::Inner;\n    use bytes::Bytes;\n\n    #[cfg(feature = \"hyper-0-14-x\")]\n    #[tokio::test]\n    async fn read_from_channel_body() {\n        let (mut sender, body) = hyper_0_14::Body::channel();\n        let byte_stream = Inner::new(SdkBody::from_body_0_4(body));\n        tokio::spawn(async move {\n            sender.send_data(Bytes::from(\"data 1\")).await.unwrap();\n            sender.send_data(Bytes::from(\"data 2\")).await.unwrap();\n            sender.send_data(Bytes::from(\"data 3\")).await.unwrap();\n        });\n        assert_eq!(\n            byte_stream.collect().await.expect(\"no errors\").into_bytes(),\n            Bytes::from(\"data 1data 2data 3\")\n        );\n    }\n\n    #[cfg(feature = \"rt-tokio\")]\n    #[tokio::test]\n    async fn path_based_bytestreams() -> Result<(), Box<dyn std::error::Error>> {\n        use super::ByteStream;\n        use bytes::Buf;\n        use std::io::Write;\n        use tempfile::NamedTempFile;\n        let mut file = NamedTempFile::new()?;\n\n        for i in 0..10000 {\n            writeln!(file, \"Brian was here. Briefly. {i}\")?;\n        }\n        let body = ByteStream::from_path(&file).await?.into_inner();\n        // assert that a valid size hint is immediately ready\n        assert_eq!(body.content_length(), Some(298890));\n        let mut body1 = body.try_clone().expect(\"retryable bodies are cloneable\");\n        // read a little bit from one of the clones\n        let some_data = body1\n            .next()\n            .await\n            .expect(\"should have some data\")\n            .expect(\"read should not fail\");\n        assert!(!some_data.is_empty());\n        // make some more clones\n        let body2 = body.try_clone().expect(\"retryable bodies are cloneable\");\n        let body3 = body.try_clone().expect(\"retryable bodies are cloneable\");\n        let body2 = ByteStream::new(body2).collect().await?.into_bytes();\n        let body3 = ByteStream::new(body3).collect().await?.into_bytes();\n        assert_eq!(body2, body3);\n        assert!(body2.starts_with(b\"Brian was here.\"));\n        assert!(body2.ends_with(b\"9999\\n\"));\n        assert_eq!(body2.len(), 298890);\n\n        assert_eq!(\n            ByteStream::new(body1).collect().await?.remaining(),\n            298890 - some_data.len()\n        );\n\n        Ok(())\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-types/src/byte_stream/http_body_1_x.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Adapters to use http-body 1.0 bodies with SdkBody & ByteStream\n\nuse crate::body::SdkBody;\nuse crate::byte_stream::ByteStream;\nuse bytes::Bytes;\n\nimpl ByteStream {\n    /// Construct a `ByteStream` from a type that implements [`http_body_1_0::Body<Data = Bytes>`](http_body_1_0::Body).\n    ///\n    /// _Note: This is only available when the `http-body-1-x` feature is enabled._\n    pub fn from_body_1_x<T, E>(body: T) -> Self\n    where\n        T: http_body_1_0::Body<Data = Bytes, Error = E> + Send + Sync + 'static,\n        E: Into<crate::body::Error> + 'static,\n    {\n        ByteStream::new(SdkBody::from_body_1_x(body))\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-types/src/byte_stream.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! ByteStream Abstractions\n//!\n//! When the SDK returns streaming binary data, the inner Http Body is\n//! wrapped in [`ByteStream`]. ByteStream provides misuse-resistant primitives\n//! to make it easier to handle common patterns with streaming data.\n//!\n//! # Examples\n//!\n//! ### Writing a ByteStream into a file:\n//! ```no_run\n//! use aws_smithy_types::byte_stream::ByteStream;\n//! use std::error::Error;\n//! use tokio::fs::File;\n//! use tokio::io::AsyncWriteExt;\n//! struct SynthesizeSpeechOutput {\n//!     audio_stream: ByteStream,\n//! }\n//!\n//! async fn audio_to_file(\n//!     output: SynthesizeSpeechOutput,\n//! ) -> Result<(), Box<dyn Error + Send + Sync>> {\n//!     let mut buf = output.audio_stream.collect().await?;\n//!     let mut file = File::open(\"audio.mp3\").await?;\n//!     file.write_all_buf(&mut buf).await?;\n//!     file.flush().await?;\n//!     Ok(())\n//! }\n//! ```\n//!\n//! ### Converting a ByteStream into Bytes\n//! ```no_run\n//! use bytes::Bytes;\n//! use aws_smithy_types::byte_stream::ByteStream;\n//! use std::error::Error;\n//! struct SynthesizeSpeechOutput {\n//!     audio_stream: ByteStream,\n//! }\n//! async fn load_audio(\n//!     output: SynthesizeSpeechOutput,\n//! ) -> Result<Bytes, Box<dyn Error + Send + Sync>> {\n//!     Ok(output.audio_stream.collect().await?.into_bytes())\n//! }\n//! ```\n//!\n//! ### Stream a ByteStream into a file\n//! The previous example is recommended in cases where loading the entire file into memory first is desirable. For extremely large\n//! files, you may wish to stream the data directly to the file system, chunk by chunk.\n//! This is possible using the [`.next()`](crate::byte_stream::ByteStream::next) method.\n//!\n//! ```no_run\n//! use bytes::{Buf, Bytes};\n//! use aws_smithy_types::byte_stream::ByteStream;\n//! use std::error::Error;\n//! use tokio::fs::File;\n//! use tokio::io::AsyncWriteExt;\n//! use tokio_stream::StreamExt;\n//! struct SynthesizeSpeechOutput {\n//!     audio_stream: ByteStream,\n//! }\n//!\n//! async fn audio_to_file(\n//!     output: SynthesizeSpeechOutput,\n//! ) -> Result<(), Box<dyn Error + Send + Sync>> {\n//!     let mut file = File::open(\"audio.mp3\").await?;\n//!     let mut stream = output.audio_stream;\n//!     while let Some(bytes) = stream.next().await {\n//!         let bytes: Bytes = bytes?;\n//!         file.write_all(&bytes).await?;\n//!     }\n//!     file.flush().await?;\n//!     Ok(())\n//! }\n//! ```\n//!\n//! ### Create a ByteStream from a file\n//!\n//! _Note: This is only available with `rt-tokio` enabled._\n//!\n//! ```no_run\n//! # #[cfg(feature = \"rt-tokio\")]\n//! # {\n//! use aws_smithy_types::byte_stream::ByteStream;\n//! use std::path::Path;\n//! struct GetObjectInput {\n//!   body: ByteStream\n//! }\n//!\n//! async fn bytestream_from_file() -> GetObjectInput {\n//!     let bytestream = ByteStream::from_path(\"docs/some-large-file.csv\")\n//!         .await\n//!         .expect(\"valid path\");\n//!     GetObjectInput { body: bytestream }\n//! }\n//! # }\n//! ```\n//!\n//! If you want more control over how the file is read, such as specifying the size of the buffer used to read the file\n//! or the length of the file, use an `FsBuilder`.\n//!\n//! ```no_run\n//! # #[cfg(feature = \"rt-tokio\")]\n//! # {\n//! use aws_smithy_types::byte_stream::{ByteStream, Length};\n//! use std::path::Path;\n//! struct GetObjectInput {\n//!     body: ByteStream\n//! }\n//!\n//! async fn bytestream_from_file() -> GetObjectInput {\n//!     let bytestream = ByteStream::read_from().path(\"docs/some-large-file.csv\")\n//!         .buffer_size(32_784)\n//!         .length(Length::Exact(123_456))\n//!         .build()\n//!         .await\n//!         .expect(\"valid path\");\n//!     GetObjectInput { body: bytestream }\n//! }\n//! # }\n//! ```\n\nuse crate::body::SdkBody;\nuse crate::byte_stream::error::Error;\nuse bytes::Buf;\nuse bytes::Bytes;\nuse bytes_utils::SegmentedBuf;\nuse pin_project_lite::pin_project;\nuse std::future::poll_fn;\nuse std::io::IoSlice;\nuse std::pin::Pin;\nuse std::task::{Context, Poll};\n\n#[cfg(feature = \"rt-tokio\")]\nmod bytestream_util;\n#[cfg(feature = \"rt-tokio\")]\npub use bytestream_util::Length;\n\npub mod error;\n\n#[cfg(feature = \"rt-tokio\")]\npub use self::bytestream_util::FsBuilder;\n\n/// This module is named after the `http-body` version number since we anticipate\n/// needing to provide equivalent functionality for 1.x of that crate in the future.\n/// The name has a suffix `_x` to avoid name collision with a third-party `http-body-0-4`.\n#[cfg(feature = \"http-body-0-4-x\")]\npub mod http_body_0_4_x;\n\n#[cfg(feature = \"http-body-1-x\")]\npub mod http_body_1_x;\n\npin_project! {\n    /// Stream of binary data\n    ///\n    /// `ByteStream` wraps a stream of binary data for ease of use.\n    ///\n    /// ## Getting data out of a `ByteStream`\n    ///\n    /// `ByteStream` provides two primary mechanisms for accessing the data:\n    /// 1. With `.collect()`:\n    ///\n    ///     [`.collect()`](crate::byte_stream::ByteStream::collect) reads the complete ByteStream into memory and stores it in `AggregatedBytes`,\n    ///     a non-contiguous ByteBuffer.\n    ///     ```no_run\n    ///     use aws_smithy_types::byte_stream::{ByteStream, AggregatedBytes};\n    ///     use aws_smithy_types::body::SdkBody;\n    ///     use bytes::Buf;\n    ///     async fn example() {\n    ///        let stream = ByteStream::new(SdkBody::from(\"hello! This is some data\"));\n    ///        // Load data from the stream into memory:\n    ///        let data = stream.collect().await.expect(\"error reading data\");\n    ///        // collect returns a `bytes::Buf`:\n    ///        println!(\"first chunk: {:?}\", data.chunk());\n    ///     }\n    ///     ```\n    /// 2. Via [`.next()`](crate::byte_stream::ByteStream::next) or [`.try_next()`](crate::byte_stream::ByteStream::try_next):\n    ///\n    ///     For use-cases where holding the entire ByteStream in memory is unnecessary, use the\n    ///     `Stream` implementation:\n    ///     ```no_run\n    ///     # mod crc32 {\n    ///     #   pub struct Digest { }\n    ///     #   impl Digest {\n    ///     #       pub fn new() -> Self { Digest {} }\n    ///     #       pub fn write(&mut self, b: &[u8]) { }\n    ///     #       pub fn finish(&self) -> u64 { 6 }\n    ///     #   }\n    ///     # }\n    ///     use aws_smithy_types::byte_stream::{ByteStream, AggregatedBytes, error::Error};\n    ///     use aws_smithy_types::body::SdkBody;\n    ///\n    ///     async fn example() -> Result<(), Error> {\n    ///        let mut stream = ByteStream::from(vec![1, 2, 3, 4, 5, 99]);\n    ///        let mut digest = crc32::Digest::new();\n    ///        while let Some(bytes) = stream.try_next().await? {\n    ///            digest.write(&bytes);\n    ///        }\n    ///        println!(\"digest: {}\", digest.finish());\n    ///        Ok(())\n    ///     }\n    ///     ```\n    ///\n    /// 3. Via [`.into_async_read()`](crate::byte_stream::ByteStream::into_async_read):\n    ///\n    ///     _Note: The `rt-tokio` feature must be active to use `.into_async_read()`._\n    ///\n    ///     It's possible to convert a `ByteStream` into a struct that implements [`tokio::io::AsyncBufRead`](tokio::io::AsyncBufRead).\n    ///     ```no_run\n    ///     use aws_smithy_types::byte_stream::ByteStream;\n    ///     use aws_smithy_types::body::SdkBody;\n    ///     use tokio::io::AsyncBufReadExt;\n    ///     #[cfg(feature = \"rt-tokio\")]\n    ///     async fn example() -> std::io::Result<()> {\n    ///        let stream = ByteStream::new(SdkBody::from(\"hello!\\nThis is some data\"));\n    ///        // Convert the stream to a BufReader\n    ///        let buf_reader = stream.into_async_read();\n    ///        let mut lines = buf_reader.lines();\n    ///        assert_eq!(lines.next_line().await?, Some(\"hello!\".to_owned()));\n    ///        assert_eq!(lines.next_line().await?, Some(\"This is some data\".to_owned()));\n    ///        assert_eq!(lines.next_line().await?, None);\n    ///        Ok(())\n    ///     }\n    ///     ```\n    ///\n    /// ## Getting data into a ByteStream\n    /// ByteStreams can be created in one of three ways:\n    /// 1. **From in-memory binary data**: ByteStreams created from in-memory data are always retryable. Data\n    /// will be converted into `Bytes` enabling a cheap clone during retries.\n    ///     ```no_run\n    ///     use bytes::Bytes;\n    ///     use aws_smithy_types::byte_stream::ByteStream;\n    ///     let stream = ByteStream::from(vec![1,2,3]);\n    ///     let stream = ByteStream::from(Bytes::from_static(b\"hello!\"));\n    ///     ```\n    ///\n    /// 2. **From a file**: ByteStreams created from a path can be retried. A new file descriptor will be opened if a retry occurs.\n    ///     ```no_run\n    ///     #[cfg(feature = \"tokio-rt\")]\n    ///     # {\n    ///     use aws_smithy_types::byte_stream::ByteStream;\n    ///     let stream = ByteStream::from_path(\"big_file.csv\");\n    ///     # }\n    ///     ```\n    ///\n    /// 3. **From an `SdkBody` directly**: For more advanced / custom use cases, a ByteStream can be created directly\n    /// from an SdkBody. **When created from an SdkBody, care must be taken to ensure retriability.** An SdkBody is retryable\n    /// when constructed from in-memory data or when using [`SdkBody::retryable`](crate::body::SdkBody::retryable).\n    ///     ```ignore\n    ///     # use hyper_0_14 as hyper;\n    ///     use aws_smithy_types::byte_stream::ByteStream;\n    ///     use aws_smithy_types::body::SdkBody;\n    ///     use bytes::Bytes;\n    ///     let (mut tx, channel_body) = hyper::Body::channel();\n    ///     // this will not be retryable because the SDK has no way to replay this stream\n    ///     let stream = ByteStream::new(SdkBody::from_body_0_4(channel_body));\n    ///     tx.send_data(Bytes::from_static(b\"hello world!\"));\n    ///     tx.send_data(Bytes::from_static(b\"hello again!\"));\n    ///     // NOTE! You must ensure that `tx` is dropped to ensure that EOF is sent\n    ///     ```\n    ///\n    #[derive(Debug)]\n    pub struct ByteStream {\n        #[pin]\n        inner: Inner,\n    }\n}\n\nimpl ByteStream {\n    /// Create a new `ByteStream` from an [`SdkBody`].\n    pub fn new(body: SdkBody) -> Self {\n        Self {\n            inner: Inner::new(body),\n        }\n    }\n\n    /// Create a new `ByteStream` from a static byte slice.\n    pub fn from_static(bytes: &'static [u8]) -> Self {\n        Self {\n            inner: Inner::new(SdkBody::from(Bytes::from_static(bytes))),\n        }\n    }\n\n    /// Consume the `ByteStream`, returning the wrapped SdkBody.\n    // Backwards compatibility note: Because SdkBody has a dyn variant,\n    // we will always be able to implement this method, even if we stop using\n    // SdkBody as the internal representation\n    pub fn into_inner(self) -> SdkBody {\n        self.inner.body\n    }\n\n    /// Return the next item in the `ByteStream`.\n    ///\n    /// There is also a sibling method [`try_next`](ByteStream::try_next), which returns a `Result<Option<Bytes>, Error>`\n    /// instead of an `Option<Result<Bytes, Error>>`.\n    pub async fn next(&mut self) -> Option<Result<Bytes, Error>> {\n        Some(self.inner.next().await?.map_err(Error::streaming))\n    }\n\n    #[cfg(feature = \"byte-stream-poll-next\")]\n    /// Attempt to pull out the next value of this stream, returning `None` if the stream is\n    /// exhausted.\n    // This should only be used when one needs to implement a trait method like\n    // `futures_core::stream::Stream::poll_next` on a new-type wrapping a `ByteStream`.\n    // In general, use the `next` method instead.\n    pub fn poll_next(\n        self: Pin<&mut Self>,\n        cx: &mut Context<'_>,\n    ) -> Poll<Option<Result<Bytes, Error>>> {\n        self.project().inner.poll_next(cx).map_err(Error::streaming)\n    }\n\n    /// Consume and return the next item in the `ByteStream` or return an error if an error is\n    /// encountered.\n    ///\n    /// Similar to the [`next`](ByteStream::next) method, but this returns a `Result<Option<Bytes>, Error>` rather than\n    /// an `Option<Result<Bytes, Error>>`, making for easy use with the `?` operator.\n    pub async fn try_next(&mut self) -> Result<Option<Bytes>, Error> {\n        self.next().await.transpose()\n    }\n\n    /// Returns a reference to the data if it is already available in memory\n    pub fn bytes(&self) -> Option<&[u8]> {\n        let Inner { body } = &self.inner;\n        body.bytes()\n    }\n\n    /// Return the bounds on the remaining length of the `ByteStream`.\n    pub fn size_hint(&self) -> (u64, Option<u64>) {\n        self.inner.size_hint()\n    }\n\n    /// Read all the data from this `ByteStream` into memory\n    ///\n    /// If an error in the underlying stream is encountered, `ByteStreamError` is returned.\n    ///\n    /// Data is read into an `AggregatedBytes` that stores data non-contiguously as it was received\n    /// over the network. If a contiguous slice is required, use `into_bytes()`.\n    /// ```no_run\n    /// use bytes::Bytes;\n    /// use aws_smithy_types::body;\n    /// use aws_smithy_types::body::SdkBody;\n    /// use aws_smithy_types::byte_stream::{ByteStream, error::Error};\n    /// async fn get_data() {\n    ///     let stream = ByteStream::new(SdkBody::from(\"hello!\"));\n    ///     let data: Result<Bytes, Error> = stream.collect().await.map(|data| data.into_bytes());\n    /// }\n    /// ```\n    pub async fn collect(self) -> Result<AggregatedBytes, Error> {\n        self.inner.collect().await.map_err(Error::streaming)\n    }\n\n    /// Returns a [`FsBuilder`], allowing you to build a `ByteStream` with\n    /// full control over how the file is read (eg. specifying the length of\n    /// the file or the size of the buffer used to read the file).\n    ///\n    /// ```no_run\n    /// # #[cfg(feature = \"rt-tokio\")]\n    /// # {\n    /// use aws_smithy_types::byte_stream::{ByteStream, Length};\n    ///\n    /// async fn bytestream_from_file() -> ByteStream {\n    ///     let bytestream = ByteStream::read_from()\n    ///         .path(\"docs/some-large-file.csv\")\n    ///         // Specify the size of the buffer used to read the file (in bytes, default is 4096)\n    ///         .buffer_size(32_784)\n    ///         // Specify the length of the file used (skips an additional call to retrieve the size)\n    ///         .length(Length::Exact(123_456))\n    ///         .build()\n    ///         .await\n    ///         .expect(\"valid path\");\n    ///     bytestream\n    /// }\n    /// # }\n    /// ```\n    #[cfg(feature = \"rt-tokio\")]\n    pub fn read_from() -> crate::byte_stream::FsBuilder {\n        crate::byte_stream::FsBuilder::new()\n    }\n\n    /// Create a ByteStream that streams data from the filesystem\n    ///\n    /// This function creates a retryable ByteStream for a given `path`. The returned ByteStream\n    /// will provide a size hint when used as an HTTP body. If the request fails, the read will\n    /// begin again by reloading the file handle.\n    ///\n    /// ## Warning\n    /// The contents of the file MUST not change during retries. The length & checksum of the file\n    /// will be cached. If the contents of the file change, the operation will almost certainly fail.\n    ///\n    /// Furthermore, a partial write MAY seek in the file and resume from the previous location.\n    ///\n    /// Note: If you want more control, such as specifying the size of the buffer used to read the file\n    /// or the length of the file, use a [`FsBuilder`] as returned from `ByteStream::read_from`.\n    ///\n    /// # Examples\n    /// ```no_run\n    /// use aws_smithy_types::byte_stream::ByteStream;\n    /// use std::path::Path;\n    ///  async fn make_bytestream() -> ByteStream {\n    ///     ByteStream::from_path(\"docs/rows.csv\").await.expect(\"file should be readable\")\n    /// }\n    /// ```\n    #[cfg(feature = \"rt-tokio\")]\n    pub async fn from_path(\n        path: impl AsRef<std::path::Path>,\n    ) -> Result<Self, crate::byte_stream::error::Error> {\n        crate::byte_stream::FsBuilder::new()\n            .path(path)\n            .build()\n            .await\n    }\n\n    #[cfg(feature = \"rt-tokio\")]\n    /// Convert this `ByteStream` into a struct that implements [`AsyncBufRead`](tokio::io::AsyncBufRead).\n    ///\n    /// # Example\n    ///\n    /// ```rust\n    /// use tokio::io::AsyncBufReadExt;\n    /// use aws_smithy_types::byte_stream::ByteStream;\n    ///\n    /// # async fn dox(my_bytestream: ByteStream) -> std::io::Result<()> {\n    /// let mut lines =  my_bytestream.into_async_read().lines();\n    /// while let Some(line) = lines.next_line().await? {\n    ///   // Do something line by line\n    /// }\n    /// # Ok(())\n    /// # }\n    /// ```\n    pub fn into_async_read(self) -> impl tokio::io::AsyncBufRead {\n        // The `Stream` trait is currently unstable so we can only use it in private.\n        // Here, we create a local struct just to enable the trait for `ByteStream` and pass it\n        // to `StreamReader`.\n        struct FuturesStreamCompatByteStream(ByteStream);\n        impl futures_core::stream::Stream for FuturesStreamCompatByteStream {\n            type Item = Result<Bytes, Error>;\n            fn poll_next(\n                mut self: Pin<&mut Self>,\n                cx: &mut Context<'_>,\n            ) -> Poll<Option<Self::Item>> {\n                Pin::new(&mut self.0.inner)\n                    .poll_next(cx)\n                    .map_err(Error::streaming)\n            }\n        }\n        tokio_util::io::StreamReader::new(FuturesStreamCompatByteStream(self))\n    }\n\n    /// Given a function to modify an [`SdkBody`], run it on the `SdkBody` inside this `Bytestream`.\n    /// returning a new `Bytestream`.\n    pub fn map(self, f: impl Fn(SdkBody) -> SdkBody + Send + Sync + 'static) -> ByteStream {\n        ByteStream::new(self.into_inner().map(f))\n    }\n}\n\nimpl Default for ByteStream {\n    fn default() -> Self {\n        Self {\n            inner: Inner {\n                body: SdkBody::from(\"\"),\n            },\n        }\n    }\n}\n\nimpl From<SdkBody> for ByteStream {\n    fn from(inp: SdkBody) -> Self {\n        ByteStream::new(inp)\n    }\n}\n\n/// Construct a retryable ByteStream from [`bytes::Bytes`].\nimpl From<Bytes> for ByteStream {\n    fn from(input: Bytes) -> Self {\n        ByteStream::new(SdkBody::from(input))\n    }\n}\n\n/// Construct a retryable ByteStream from a `Vec<u8>`.\n///\n/// This will convert the `Vec<u8>` into [`bytes::Bytes`] to enable efficient retries.\nimpl From<Vec<u8>> for ByteStream {\n    fn from(input: Vec<u8>) -> Self {\n        Self::from(Bytes::from(input))\n    }\n}\n\n/// Non-contiguous Binary Data Storage\n///\n/// When data is read from the network, it is read in a sequence of chunks that are\n/// not in contiguous memory. [`AggregatedBytes`] provides a view of this data via\n/// [`impl Buf`](bytes::Buf) or it can be copied into contiguous storage with\n/// [`.into_bytes()`](crate::byte_stream::AggregatedBytes::into_bytes).\n#[derive(Debug, Clone)]\npub struct AggregatedBytes(SegmentedBuf<Bytes>);\n\nimpl AggregatedBytes {\n    /// Convert this buffer into [`Bytes`].\n    ///\n    /// # Why does this consume `self`?\n    /// Technically, [`copy_to_bytes`](bytes::Buf::copy_to_bytes) can be called without ownership of self. However, since this\n    /// mutates the underlying buffer such that no data is remaining, it is more misuse resistant to\n    /// prevent the caller from attempting to reread the buffer.\n    ///\n    /// If the caller only holds a mutable reference, they may use [`copy_to_bytes`](bytes::Buf::copy_to_bytes)\n    /// directly on `AggregatedBytes`.\n    pub fn into_bytes(mut self) -> Bytes {\n        self.0.copy_to_bytes(self.0.remaining())\n    }\n\n    /// Convert this buffer into an [`Iterator`] of underlying non-contiguous segments of [`Bytes`]\n    pub fn into_segments(self) -> impl Iterator<Item = Bytes> {\n        self.0.into_inner().into_iter()\n    }\n\n    /// Convert this buffer into a `Vec<u8>`\n    pub fn to_vec(self) -> Vec<u8> {\n        self.0.into_inner().into_iter().flatten().collect()\n    }\n}\n\nimpl Buf for AggregatedBytes {\n    // Forward all methods that SegmentedBuf has custom implementations of.\n    fn remaining(&self) -> usize {\n        self.0.remaining()\n    }\n\n    fn chunk(&self) -> &[u8] {\n        self.0.chunk()\n    }\n\n    fn chunks_vectored<'a>(&'a self, dst: &mut [IoSlice<'a>]) -> usize {\n        self.0.chunks_vectored(dst)\n    }\n\n    fn advance(&mut self, cnt: usize) {\n        self.0.advance(cnt)\n    }\n\n    fn copy_to_bytes(&mut self, len: usize) -> Bytes {\n        self.0.copy_to_bytes(len)\n    }\n}\n\npin_project! {\n    #[derive(Debug)]\n    struct Inner {\n        #[pin]\n        body: SdkBody,\n    }\n}\n\nimpl Inner {\n    fn new(body: SdkBody) -> Self {\n        Self { body }\n    }\n\n    async fn next(&mut self) -> Option<Result<Bytes, crate::body::Error>> {\n        let mut me = Pin::new(self);\n        poll_fn(|cx| me.as_mut().poll_next(cx)).await\n    }\n\n    fn poll_next(\n        self: Pin<&mut Self>,\n        cx: &mut Context<'_>,\n    ) -> Poll<Option<Result<Bytes, crate::body::Error>>> {\n        self.project().body.poll_next(cx)\n    }\n\n    async fn collect(self) -> Result<AggregatedBytes, crate::body::Error> {\n        let mut output = SegmentedBuf::new();\n        let body = self.body;\n        pin_utils::pin_mut!(body);\n        while let Some(buf) = body.next().await {\n            output.push(buf?);\n        }\n        Ok(AggregatedBytes(output))\n    }\n\n    fn size_hint(&self) -> (u64, Option<u64>) {\n        self.body.bounds_on_remaining_length()\n    }\n}\n\n#[cfg(all(test, feature = \"rt-tokio\"))]\nmod tests {\n    use super::{ByteStream, Inner};\n    use crate::body::SdkBody;\n    use bytes::Bytes;\n    use std::io::Write;\n    use tempfile::NamedTempFile;\n\n    #[tokio::test]\n    async fn read_from_string_body() {\n        let body = SdkBody::from(\"a simple body\");\n        assert_eq!(\n            Inner::new(body)\n                .collect()\n                .await\n                .expect(\"no errors\")\n                .into_bytes(),\n            Bytes::from(\"a simple body\")\n        );\n    }\n\n    #[tokio::test]\n    async fn bytestream_into_async_read() {\n        use tokio::io::AsyncBufReadExt;\n\n        let byte_stream = ByteStream::from_static(b\"data 1\\ndata 2\\ndata 3\");\n        let async_buf_read = tokio::io::BufReader::new(byte_stream.into_async_read());\n\n        let mut lines = async_buf_read.lines();\n\n        assert_eq!(lines.next_line().await.unwrap(), Some(\"data 1\".to_owned()));\n        assert_eq!(lines.next_line().await.unwrap(), Some(\"data 2\".to_owned()));\n        assert_eq!(lines.next_line().await.unwrap(), Some(\"data 3\".to_owned()));\n        assert_eq!(lines.next_line().await.unwrap(), None);\n    }\n\n    #[tokio::test]\n    async fn valid_size_hint() {\n        assert_eq!(ByteStream::from_static(b\"hello\").size_hint().1, Some(5));\n        assert_eq!(ByteStream::from_static(b\"\").size_hint().1, Some(0));\n\n        let mut f = NamedTempFile::new().unwrap();\n        f.write_all(b\"hello\").unwrap();\n        let body = ByteStream::from_path(f.path()).await.unwrap();\n        assert_eq!(body.inner.size_hint().1, Some(5));\n\n        let mut f = NamedTempFile::new().unwrap();\n        f.write_all(b\"\").unwrap();\n        let body = ByteStream::from_path(f.path()).await.unwrap();\n        assert_eq!(body.inner.size_hint().1, Some(0));\n    }\n\n    #[allow(clippy::bool_assert_comparison)]\n    #[tokio::test]\n    async fn valid_eos() {\n        assert_eq!(\n            ByteStream::from_static(b\"hello\").inner.body.is_end_stream(),\n            false\n        );\n        let mut f = NamedTempFile::new().unwrap();\n        f.write_all(b\"hello\").unwrap();\n        let body = ByteStream::from_path(f.path()).await.unwrap();\n        assert_eq!(body.inner.body.content_length(), Some(5));\n        assert!(!body.inner.body.is_end_stream());\n\n        assert_eq!(\n            ByteStream::from_static(b\"\").inner.body.is_end_stream(),\n            true\n        );\n        let mut f = NamedTempFile::new().unwrap();\n        f.write_all(b\"\").unwrap();\n        let body = ByteStream::from_path(f.path()).await.unwrap();\n        assert_eq!(body.inner.body.content_length(), Some(0));\n        assert!(body.inner.body.is_end_stream());\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-types/src/checksum_config.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Types that allow users to indicate their preferences for checksum calculation and validation\n\n// Note: These types would likely make more sense in `aws-smithy-checksums` and were originally\n// added there. But we have lints protecting against exporting non-stable types from stable crates\n// and the checksums crate is not yet 1.0, so these types cannot live there for now. In the future\n// if we do decide to 1.0 the checksums crate we can move these types there and re-export them here\n// to maintain the current behavior.\n\nuse std::error::Error;\nuse std::fmt;\nuse std::str::FromStr;\n\nuse crate::config_bag::{Storable, StoreReplace};\n\n// Valid names for RequestChecksumCalculation and ResponseChecksumValidation\nconst WHEN_SUPPORTED: &str = \"when_supported\";\nconst WHEN_REQUIRED: &str = \"when_required\";\n\n/// Determines when a checksum will be calculated for request payloads. Values are:\n/// * [RequestChecksumCalculation::WhenSupported] - (default) When set, a checksum will be\n///   calculated for all request payloads of operations modeled with the\n///   `httpChecksum` trait where `requestChecksumRequired` is `true` and/or a\n///   `requestAlgorithmMember` is modeled.\n/// * [RequestChecksumCalculation::WhenRequired] - When set, a checksum will only be calculated for\n///   request payloads of operations modeled with the  `httpChecksum` trait where\n///   `requestChecksumRequired` is `true` or where a requestAlgorithmMember\n///   is modeled and supplied.\n#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]\n#[non_exhaustive]\npub enum RequestChecksumCalculation {\n    /// Calculate request checksums when they are supported.\n    #[default]\n    WhenSupported,\n    /// Caulculate request checksums only when they are required.\n    WhenRequired,\n}\n\nimpl Storable for RequestChecksumCalculation {\n    type Storer = StoreReplace<Self>;\n}\n\nimpl FromStr for RequestChecksumCalculation {\n    type Err = UnknownRequestChecksumCalculationError;\n\n    fn from_str(request_checksum_calculation: &str) -> Result<Self, Self::Err> {\n        if request_checksum_calculation.eq_ignore_ascii_case(WHEN_SUPPORTED) {\n            Ok(Self::WhenSupported)\n        } else if request_checksum_calculation.eq_ignore_ascii_case(WHEN_REQUIRED) {\n            Ok(Self::WhenRequired)\n        } else {\n            Err(UnknownRequestChecksumCalculationError::new(\n                request_checksum_calculation,\n            ))\n        }\n    }\n}\n\n/// Determines when checksum validation will be performed on response payloads. Values are:\n/// * [ResponseChecksumValidation::WhenSupported] - (default) When set, checksum validation is performed on all\n///   response payloads of operations modeled with the `httpChecksum` trait where\n///   `responseAlgorithms` is modeled, except when no modeled checksum algorithms\n///   are supported.\n/// * [ResponseChecksumValidation::WhenRequired] - When set, checksum validation is not performed on\n///   response payloads of operations unless the checksum algorithm is supported and\n///   the `requestValidationModeMember` member is set to `ENABLED`.\n#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]\n#[non_exhaustive]\npub enum ResponseChecksumValidation {\n    /// Validate response checksums when they are supported.\n    #[default]\n    WhenSupported,\n    /// Validate response checksums only when they are required.\n    WhenRequired,\n}\n\nimpl Storable for ResponseChecksumValidation {\n    type Storer = StoreReplace<Self>;\n}\n\nimpl FromStr for ResponseChecksumValidation {\n    type Err = UnknownResponseChecksumValidationError;\n\n    fn from_str(response_checksum_validation: &str) -> Result<Self, Self::Err> {\n        if response_checksum_validation.eq_ignore_ascii_case(WHEN_SUPPORTED) {\n            Ok(Self::WhenSupported)\n        } else if response_checksum_validation.eq_ignore_ascii_case(WHEN_REQUIRED) {\n            Ok(Self::WhenRequired)\n        } else {\n            Err(UnknownResponseChecksumValidationError::new(\n                response_checksum_validation,\n            ))\n        }\n    }\n}\n\n/// Unknown setting for `request_checksum_calculation`\n#[derive(Debug)]\n#[non_exhaustive]\npub struct UnknownRequestChecksumCalculationError {\n    request_checksum_calculation: String,\n}\n\nimpl UnknownRequestChecksumCalculationError {\n    pub(crate) fn new(request_checksum_calculation: impl Into<String>) -> Self {\n        Self {\n            request_checksum_calculation: request_checksum_calculation.into(),\n        }\n    }\n\n    /// The unknown value\n    pub fn request_checksum_calculation(&self) -> &str {\n        &self.request_checksum_calculation\n    }\n}\n\nimpl fmt::Display for UnknownRequestChecksumCalculationError {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        write!(\n            f,\n            r#\"unknown request_checksum_calculation value \"{}\", please pass a known name (\"when_supported\", \"when_required\")\"#,\n            self.request_checksum_calculation\n        )\n    }\n}\n\nimpl Error for UnknownRequestChecksumCalculationError {}\n\n/// Unknown setting for `response_checksum_validation`\n#[derive(Debug)]\n#[non_exhaustive]\npub struct UnknownResponseChecksumValidationError {\n    response_checksum_validation: String,\n}\n\nimpl UnknownResponseChecksumValidationError {\n    pub(crate) fn new(response_checksum_validation: impl Into<String>) -> Self {\n        Self {\n            response_checksum_validation: response_checksum_validation.into(),\n        }\n    }\n\n    /// The unknown value\n    pub fn response_checksum_validation(&self) -> &str {\n        &self.response_checksum_validation\n    }\n}\n\nimpl fmt::Display for UnknownResponseChecksumValidationError {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        write!(\n            f,\n            r#\"unknown response_checksum_validation value \"{}\", please pass a known name (\"when_supported\", \"when_required\")\"#,\n            self.response_checksum_validation\n        )\n    }\n}\n\nimpl Error for UnknownResponseChecksumValidationError {}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-types/src/config_bag/storable.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::config_bag::value::Value;\nuse crate::config_bag::ItemIter;\nuse std::fmt::{Debug, Formatter};\nuse std::iter::Rev;\nuse std::marker::PhantomData;\nuse std::slice;\n\n/// Trait defining how types can be stored and loaded from the config bag\npub trait Store: Sized + Send + Sync + 'static {\n    /// Denote the returned type when loaded from the config bag\n    type ReturnedType<'a>: Send + Sync;\n    /// Denote the stored type when stored into the config bag\n    type StoredType: Send + Sync + Debug;\n\n    /// Create a returned type from an iterable of items\n    fn merge_iter(iter: ItemIter<'_, Self>) -> Self::ReturnedType<'_>;\n}\n\n/// Store an item in the config bag by replacing the existing value\n///\n/// See the [module docs](crate::config_bag) for more documentation.\n#[non_exhaustive]\npub struct StoreReplace<U>(PhantomData<U>);\n\nimpl<U> Debug for StoreReplace<U> {\n    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {\n        write!(f, \"StoreReplace\")\n    }\n}\n\n/// Store an item in the config bag by effectively appending it to a list\n///\n/// See the [module docs](crate::config_bag) for more documentation.\n#[non_exhaustive]\npub struct StoreAppend<U>(PhantomData<U>);\n\nimpl<U> Debug for StoreAppend<U> {\n    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {\n        write!(f, \"StoreAppend\")\n    }\n}\n\n/// Trait that marks the implementing types as able to be stored in the config bag\n///\n/// See the [module docs](crate::config_bag) for more documentation.\npub trait Storable: Send + Sync + Debug + 'static {\n    /// Specify how an item is stored in the config bag, e.g. [`StoreReplace`] and [`StoreAppend`]\n    type Storer: Store;\n}\n\nimpl<U: Send + Sync + Debug + 'static> Store for StoreReplace<U> {\n    type ReturnedType<'a> = Option<&'a U>;\n    type StoredType = Value<U>;\n\n    fn merge_iter(mut iter: ItemIter<'_, Self>) -> Self::ReturnedType<'_> {\n        iter.next().and_then(|item| match item {\n            Value::Set(item) => Some(item),\n            Value::ExplicitlyUnset(_) => None,\n        })\n    }\n}\n\nimpl<U: Send + Sync + Debug + 'static> Store for StoreAppend<U> {\n    type ReturnedType<'a> = AppendItemIter<'a, U>;\n    type StoredType = Value<Vec<U>>;\n\n    fn merge_iter(iter: ItemIter<'_, Self>) -> Self::ReturnedType<'_> {\n        AppendItemIter {\n            inner: iter,\n            cur: None,\n        }\n    }\n}\n\n/// Iterator of items returned by [`StoreAppend`]\npub struct AppendItemIter<'a, U> {\n    inner: ItemIter<'a, StoreAppend<U>>,\n    cur: Option<Rev<slice::Iter<'a, U>>>,\n}\n\nimpl<U> Debug for AppendItemIter<'_, U> {\n    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {\n        write!(f, \"AppendItemIter\")\n    }\n}\n\nimpl<'a, U: 'a> Iterator for AppendItemIter<'a, U>\nwhere\n    U: Send + Sync + Debug + 'static,\n{\n    type Item = &'a U;\n\n    fn next(&mut self) -> Option<Self::Item> {\n        if let Some(buf) = &mut self.cur {\n            match buf.next() {\n                Some(item) => return Some(item),\n                None => self.cur = None,\n            }\n        }\n        match self.inner.next() {\n            None => None,\n            Some(Value::Set(u)) => {\n                self.cur = Some(u.iter().rev());\n                self.next()\n            }\n            Some(Value::ExplicitlyUnset(_)) => None,\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-types/src/config_bag/typeid_map.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::any::TypeId;\nuse std::collections::HashMap;\nuse std::hash::{BuildHasherDefault, Hasher};\n\npub(super) type TypeIdMap<T> = HashMap<TypeId, T, BuildHasherDefault<IdHasher>>;\n\n// With TypeIds as keys, there's no need to hash them. They are already hashes\n// themselves, coming from the compiler. The IdHasher just holds the u64 of\n// the TypeId, and then returns it, instead of doing any bit fiddling.\n#[derive(Default)]\npub(super) struct IdHasher(u64);\n\nimpl Hasher for IdHasher {\n    #[inline]\n    fn finish(&self) -> u64 {\n        self.0\n    }\n\n    fn write(&mut self, _: &[u8]) {\n        unreachable!(\"TypeId calls write_u64\");\n    }\n\n    #[inline]\n    fn write_u64(&mut self, id: u64) {\n        self.0 = id;\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-types/src/config_bag.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Layers and layered bags of configuration data.\n//!\n//! The [`ConfigBag`](crate::config_bag::ConfigBag) structure is used to store and pass around configuration for client operations.\n//! Interacting with it may be required in order to write an `Interceptor` or `RuntimePlugin` to\n//! customize a client.\n//!\n//! A `ConfigBag` is essentially a stack of several immutable and sharable layers, with a single _mutable_ layer at\n//! the top of the stack that is called \"interceptor state\". The intent of this last mutable layer is to allow for\n//! more performant mutation of config within the execution of an operation.\n//!\n//! There are three separate layer types to be aware of when using a `ConfigBag`:\n//! 1. [`Layer`](crate::config_bag::Layer) - A mutable layer. This is usually only used for adding config\n//!    to the `ConfigBag`, but is also used for the interceptor state.\n//! 2. [`CloneableLayer`](crate::config_bag::CloneableLayer) - Identical to `Layer`, except that it requires\n//!    `Clone` bounds on the items added to it so that it can be deep cloned. Can be converted to a `Layer`\n//!    while retaining the cloneability of its items such that the resulting layer could be cloned as long as\n//!    nothing else is added to it later. A `Layer` cannot be converted back into a `CloneableLayer`.\n//! 3. [`FrozenLayer`](crate::config_bag::FrozenLayer) - Basically an [`Arc`](std::sync::Arc) wrapper around\n//!    a `Layer`. This wrapper is used to make the layer immutable, and to make it shareable between multiple\n//!    `ConfigBag` instances. The frozen layer can be converted back to a `Layer` if there is only a single reference to it.\n//!\n//! All of `Layer`, `CloneableLayer`, `FrozenLayer`, and `ConfigBag` are considered to be \"bag\" types.\n//! That is, they store arbitrary types so long as they implement the [`Storable`](crate::config_bag::Storable) trait.\n//!\n//! A `Storable` requires a `Storer` to be configured, and the storer allows for storables to be stored\n//! in two different modes:\n//! 1. [`StoreReplace`](crate::config_bag::StoreReplace) - Only one value of this type is allowed in a bag, and\n//!    calling [`store_put()`](crate::config_bag::Layer::store_put) multiple times will replace the existing value\n//!    in the bag. Calling [`load::<T>()`](crate::config_bag::Layer::load) returns exactly one value, if present.\n//! 2. [`StoreAppend`](crate::config_bag::StoreAppend) - Multiple values of this type are allowed in a bag, and\n//!    calling [`store_append()`](crate::config_bag::Layer::store_append) will add an additional value of this type\n//!    to the bag. Calling [`load::<T>()`](crate::config_bag::Layer::load) returns an iterator over multiple values.\n//!\n//! # Examples\n//!\n//! Creating a storable data type with `StoreReplace`:\n//!\n//! ```no_run\n//! use aws_smithy_types::config_bag::{Storable, StoreReplace};\n//!\n//! #[derive(Debug)]\n//! struct SomeDataType {\n//!     some_data: String,\n//! }\n//! impl Storable for SomeDataType {\n//!     type Storer = StoreReplace<Self>;\n//! }\n//! ```\n//!\n//! Creating a storable data type with `StoreAppend`:\n//!\n//! ```no_run\n//! use aws_smithy_types::config_bag::{Storable, StoreAppend};\n//!\n//! #[derive(Debug)]\n//! struct SomeDataType {\n//!     some_data: String,\n//! }\n//! impl Storable for SomeDataType {\n//!     type Storer = StoreAppend<Self>;\n//! }\n//! ```\n//!\n//! Storing a storable in a bag when it is configured for `StoreReplace`:\n//!\n//! ```no_run\n//! # use aws_smithy_types::config_bag::{Storable, StoreReplace};\n//! # #[derive(Clone, Debug)]\n//! # struct SomeDataType { some_data: String }\n//! # impl Storable for SomeDataType { type Storer = StoreReplace<Self>; }\n//! use aws_smithy_types::config_bag::{CloneableLayer, Layer};\n//!\n//! let mut layer = Layer::new(\"example\");\n//! layer.store_put(SomeDataType { some_data: \"some data\".to_string() });\n//!\n//! // `store_put` can be called again to replace the original value:\n//! layer.store_put(SomeDataType { some_data: \"replacement\".to_string() });\n//!\n//! // Note: `SomeDataType` below must implement `Clone` to work with `CloneableLayer`\n//! let mut cloneable = CloneableLayer::new(\"example\");\n//! cloneable.store_put(SomeDataType { some_data: \"some data\".to_string() });\n//! ```\n//!\n//! Storing a storable in a bag when it is configured for `StoreAppend`:\n//!\n//! ```no_run\n//! # use aws_smithy_types::config_bag::{Storable, StoreAppend};\n//! # #[derive(Clone, Debug)]\n//! # struct SomeDataType { some_data: String }\n//! # impl Storable for SomeDataType { type Storer = StoreAppend<Self>; }\n//! use aws_smithy_types::config_bag::{CloneableLayer, Layer};\n//!\n//! let mut layer = Layer::new(\"example\");\n//! layer.store_append(SomeDataType { some_data: \"1\".to_string() });\n//! layer.store_append(SomeDataType { some_data: \"2\".to_string() });\n//! ```\n//!\n//! Loading a `StoreReplace` value from a bag:\n//!\n//! ```no_run\n//! # use aws_smithy_types::config_bag::{Storable, StoreReplace};\n//! # #[derive(Clone, Debug)]\n//! # struct SomeDataType { some_data: String }\n//! # impl Storable for SomeDataType { type Storer = StoreReplace<Self>; }\n//! # use aws_smithy_types::config_bag::Layer;\n//! # let layer = Layer::new(\"example\");\n//! let maybe_value: Option<&SomeDataType> = layer.load::<SomeDataType>();\n//! ```\n//!\n//! Loading a `StoreAppend` value from a bag:\n//!\n//! ```no_run\n//! # use aws_smithy_types::config_bag::{Storable, StoreAppend};\n//! # #[derive(Clone, Debug)]\n//! # struct SomeDataType { some_data: String }\n//! # impl Storable for SomeDataType { type Storer = StoreAppend<Self>; }\n//! # use aws_smithy_types::config_bag::Layer;\n//! # let layer = Layer::new(\"example\");\n//! let values: Vec<SomeDataType> = layer.load::<SomeDataType>().cloned().collect();\n//!\n//! // or iterate over them directly:\n//! for value in layer.load::<SomeDataType>() {\n//!     # let _ = value;\n//!     // ...\n//! }\n//! ```\n//!\nmod storable;\nmod typeid_map;\n\nuse crate::config_bag::typeid_map::TypeIdMap;\nuse crate::type_erasure::TypeErasedBox;\nuse std::any::{type_name, TypeId};\nuse std::borrow::Cow;\nuse std::fmt::{Debug, Formatter};\nuse std::iter::Rev;\nuse std::marker::PhantomData;\nuse std::ops::Deref;\nuse std::slice::Iter;\nuse std::sync::Arc;\n\npub use storable::{AppendItemIter, Storable, Store, StoreAppend, StoreReplace};\n\n/// [`FrozenLayer`] is the immutable and shareable form of [`Layer`].\n///\n/// See the [module docs](crate::config_bag) for more documentation.\n#[derive(Clone, Debug)]\n#[must_use]\npub struct FrozenLayer(Arc<Layer>);\n\nimpl FrozenLayer {\n    /// Attempts to convert this bag directly into a [`Layer`] if no other references exist.\n    pub fn try_modify(self) -> Option<Layer> {\n        Arc::try_unwrap(self.0).ok()\n    }\n}\n\nimpl Deref for FrozenLayer {\n    type Target = Layer;\n\n    fn deref(&self) -> &Self::Target {\n        &self.0\n    }\n}\n\nimpl From<Layer> for FrozenLayer {\n    fn from(layer: Layer) -> Self {\n        FrozenLayer(Arc::new(layer))\n    }\n}\n\n/// Private module to keep Value type while avoiding \"private type in public latest\"\npub(crate) mod value {\n    #[derive(Clone, Debug)]\n    pub enum Value<T> {\n        Set(T),\n        ExplicitlyUnset(&'static str),\n    }\n\n    impl<T: Default> Default for Value<T> {\n        fn default() -> Self {\n            Self::Set(Default::default())\n        }\n    }\n}\nuse value::Value;\n\n/// [`CloneableLayer`] allows itself to be cloned. This is useful when a type that implements\n/// `Clone` wishes to store a config layer.\n///\n/// It ensures that all the items in `CloneableLayer` are `Clone` upon entry, e.g. when they are\n/// first stored, the mutable methods require that they have a `Clone` bound on them.\n///\n/// While [`FrozenLayer`] is also cloneable, which is a shallow clone via `Arc`, `CloneableLayer`\n/// performs a deep clone that newly allocates all the items stored in it.\n///\n/// Cloneable enforces that non clone items cannot be added\n/// ```rust,compile_fail\n/// use aws_smithy_types::config_bag::Storable;\n/// use aws_smithy_types::config_bag::StoreReplace;\n/// use aws_smithy_types::config_bag::CloneableLayer;\n/// #[derive(Debug)]\n/// struct MyNotCloneStruct;\n///\n/// impl Storable for MyNotCloneStruct {\n///     type Storer = StoreReplace<MyNotCloneStruct>;\n/// }\n/// let mut layer = CloneableLayer::new(\"layer\");\n/// layer.store_put(MyNotCloneStruct);\n/// ```\n///\n/// See the [module docs](crate::config_bag) for more documentation.\n#[derive(Debug, Default)]\npub struct CloneableLayer(Layer);\n\nimpl Deref for CloneableLayer {\n    type Target = Layer;\n\n    fn deref(&self) -> &Self::Target {\n        &self.0\n    }\n}\n\nimpl Clone for CloneableLayer {\n    fn clone(&self) -> Self {\n        Self(\n            self.try_clone()\n                .expect(\"only cloneable types can be inserted\"),\n        )\n    }\n}\n\nimpl From<CloneableLayer> for Layer {\n    fn from(cloneable_layer: CloneableLayer) -> Layer {\n        cloneable_layer.0\n    }\n}\n\n// We need to \"override\" the mutable methods to encode the information that an item being stored\n// implements `Clone`. For the immutable methods, they can just be delegated via the `Deref` trait.\nimpl CloneableLayer {\n    /// Creates a new `CloneableLayer` with a given name\n    pub fn new(name: impl Into<Cow<'static, str>>) -> Self {\n        Self(Layer::new(name))\n    }\n\n    /// Converts this layer into a frozen layer that can no longer be mutated.\n    pub fn freeze(self) -> FrozenLayer {\n        self.0.into()\n    }\n\n    /// Removes `T` from this bag\n    pub fn unset<T: Send + Sync + Clone + Debug + 'static>(&mut self) -> &mut Self {\n        self.put_directly_cloneable::<StoreReplace<T>>(Value::ExplicitlyUnset(type_name::<T>()));\n        self\n    }\n\n    fn put_directly_cloneable<T: Store>(&mut self, value: T::StoredType) -> &mut Self\n    where\n        T::StoredType: Clone,\n    {\n        self.0.props.insert(\n            TypeId::of::<T::StoredType>(),\n            TypeErasedBox::new_with_clone(value),\n        );\n        self\n    }\n\n    /// Stores `item` of type `T` into the config bag, overriding a previous value of the same type\n    pub fn store_put<T>(&mut self, item: T) -> &mut Self\n    where\n        T: Storable<Storer = StoreReplace<T>> + Clone,\n    {\n        self.put_directly_cloneable::<StoreReplace<T>>(Value::Set(item));\n        self\n    }\n\n    /// Stores `item` of type `T` into the config bag, overriding a previous value of the same type,\n    /// or unsets it by passing a `None`\n    pub fn store_or_unset<T>(&mut self, item: Option<T>) -> &mut Self\n    where\n        T: Storable<Storer = StoreReplace<T>> + Clone,\n    {\n        let item = match item {\n            Some(item) => Value::Set(item),\n            None => Value::ExplicitlyUnset(type_name::<T>()),\n        };\n        self.put_directly_cloneable::<StoreReplace<T>>(item);\n        self\n    }\n\n    /// Stores `item` of type `T` into the config bag, appending it to the existing list of the same\n    /// type\n    pub fn store_append<T>(&mut self, item: T) -> &mut Self\n    where\n        T: Storable<Storer = StoreAppend<T>> + Clone,\n    {\n        match self.get_mut_or_default::<StoreAppend<T>>() {\n            Value::Set(list) => list.push(item),\n            v @ Value::ExplicitlyUnset(_) => *v = Value::Set(vec![item]),\n        }\n        self\n    }\n\n    /// Clears the value of type `T` from the config bag\n    pub fn clear<T>(&mut self)\n    where\n        T: Storable<Storer = StoreAppend<T>> + Clone,\n    {\n        self.put_directly_cloneable::<StoreAppend<T>>(Value::ExplicitlyUnset(type_name::<T>()));\n    }\n\n    fn get_mut_or_default<T: Send + Sync + Store + 'static>(&mut self) -> &mut T::StoredType\n    where\n        T::StoredType: Default + Clone,\n    {\n        self.0\n            .props\n            .entry(TypeId::of::<T::StoredType>())\n            .or_insert_with(|| TypeErasedBox::new_with_clone(T::StoredType::default()))\n            .downcast_mut()\n            .expect(\"typechecked\")\n    }\n}\n\n/// A named layer comprising a config bag\n///\n/// See the [module docs](crate::config_bag) for more documentation.\n#[derive(Default)]\npub struct Layer {\n    name: Cow<'static, str>,\n    props: TypeIdMap<TypeErasedBox>,\n}\n\nimpl Debug for Layer {\n    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {\n        struct Items<'a>(&'a Layer);\n        impl Debug for Items<'_> {\n            fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {\n                f.debug_list().entries(self.0.props.values()).finish()\n            }\n        }\n        f.debug_struct(\"Layer\")\n            .field(\"name\", &self.name)\n            .field(\"items\", &Items(self))\n            .finish()\n    }\n}\n\nimpl Layer {\n    fn try_clone(&self) -> Option<Self> {\n        let new_props = self\n            .props\n            .iter()\n            .flat_map(|(tyid, erased)| erased.try_clone().map(|e| (*tyid, e)))\n            .collect::<TypeIdMap<_>>();\n        if new_props.len() == self.props.len() {\n            Some(Layer {\n                name: self.name.clone(),\n                props: new_props,\n            })\n        } else {\n            None\n        }\n    }\n\n    /// Inserts `value` into the layer directly\n    fn put_directly<T: Store>(&mut self, value: T::StoredType) -> &mut Self {\n        self.props\n            .insert(TypeId::of::<T::StoredType>(), TypeErasedBox::new(value));\n        self\n    }\n\n    /// Returns true if this layer is empty.\n    pub fn is_empty(&self) -> bool {\n        self.props.is_empty()\n    }\n\n    /// Converts this layer into a frozen layer that can no longer be mutated.\n    pub fn freeze(self) -> FrozenLayer {\n        self.into()\n    }\n\n    /// Create a new Layer with a given name\n    pub fn new(name: impl Into<Cow<'static, str>>) -> Self {\n        let name = name.into();\n        Self {\n            name,\n            props: Default::default(),\n        }\n    }\n\n    /// Changes the name of this layer.\n    pub fn with_name(self, name: impl Into<Cow<'static, str>>) -> Self {\n        Self {\n            name: name.into(),\n            props: self.props,\n        }\n    }\n\n    /// Load a storable item from the bag\n    pub fn load<T: Storable>(&self) -> <T::Storer as Store>::ReturnedType<'_> {\n        T::Storer::merge_iter(ItemIter {\n            inner: BagIter {\n                head: Some(self),\n                tail: [].iter().rev(),\n            },\n            t: Default::default(),\n        })\n    }\n\n    /// Remove `T` from this bag\n    pub fn unset<T: Send + Sync + Debug + 'static>(&mut self) -> &mut Self {\n        self.put_directly::<StoreReplace<T>>(Value::ExplicitlyUnset(type_name::<T>()));\n        self\n    }\n\n    /// Stores `item` of type `T` into the config bag, overriding a previous value of the same type\n    pub fn store_put<T>(&mut self, item: T) -> &mut Self\n    where\n        T: Storable<Storer = StoreReplace<T>>,\n    {\n        self.put_directly::<StoreReplace<T>>(Value::Set(item));\n        self\n    }\n\n    /// Stores `item` of type `T` into the config bag, overriding a previous value of the same type,\n    /// or unsets it by passing a `None`\n    pub fn store_or_unset<T>(&mut self, item: Option<T>) -> &mut Self\n    where\n        T: Storable<Storer = StoreReplace<T>>,\n    {\n        let item = match item {\n            Some(item) => Value::Set(item),\n            None => Value::ExplicitlyUnset(type_name::<T>()),\n        };\n        self.put_directly::<StoreReplace<T>>(item);\n        self\n    }\n\n    /// This can only be used for types that use [`StoreAppend`]\n    /// ```\n    /// use aws_smithy_types::config_bag::{ConfigBag, Layer, Storable, StoreAppend, StoreReplace};\n    /// let mut layer_1 = Layer::new(\"example\");\n    /// #[derive(Debug, PartialEq, Eq)]\n    /// struct Interceptor(&'static str);\n    /// impl Storable for Interceptor {\n    ///     type Storer = StoreAppend<Interceptor>;\n    /// }\n    ///\n    /// layer_1.store_append(Interceptor(\"321\"));\n    /// layer_1.store_append(Interceptor(\"654\"));\n    ///\n    /// let mut layer_2 = Layer::new(\"second layer\");\n    /// layer_2.store_append(Interceptor(\"987\"));\n    ///\n    /// let bag = ConfigBag::of_layers(vec![layer_1, layer_2]);\n    ///\n    /// assert_eq!(\n    ///     bag.load::<Interceptor>().collect::<Vec<_>>(),\n    ///     vec![&Interceptor(\"987\"), &Interceptor(\"654\"), &Interceptor(\"321\")]\n    /// );\n    /// ```\n    pub fn store_append<T>(&mut self, item: T) -> &mut Self\n    where\n        T: Storable<Storer = StoreAppend<T>>,\n    {\n        match self.get_mut_or_default::<StoreAppend<T>>() {\n            Value::Set(list) => list.push(item),\n            v @ Value::ExplicitlyUnset(_) => *v = Value::Set(vec![item]),\n        }\n        self\n    }\n\n    /// Clears the value of type `T` from the config bag\n    ///\n    /// This internally marks the item of type `T` as cleared as opposed to wiping it out from the\n    /// config bag.\n    pub fn clear<T>(&mut self)\n    where\n        T: Storable<Storer = StoreAppend<T>>,\n    {\n        self.put_directly::<StoreAppend<T>>(Value::ExplicitlyUnset(type_name::<T>()));\n    }\n\n    /// Retrieves the value of type `T` from this layer if exists\n    fn get<T: Send + Sync + Store + 'static>(&self) -> Option<&T::StoredType> {\n        self.props\n            .get(&TypeId::of::<T::StoredType>())\n            .map(|t| t.downcast_ref().expect(\"typechecked\"))\n    }\n\n    /// Returns a mutable reference to `T` if it is stored in this layer\n    fn get_mut<T: Send + Sync + Store + 'static>(&mut self) -> Option<&mut T::StoredType> {\n        self.props\n            .get_mut(&TypeId::of::<T::StoredType>())\n            .map(|t| t.downcast_mut().expect(\"typechecked\"))\n    }\n\n    /// Returns a mutable reference to `T` if it is stored in this layer, otherwise returns the\n    /// [`Default`] implementation of `T`\n    fn get_mut_or_default<T: Send + Sync + Store + 'static>(&mut self) -> &mut T::StoredType\n    where\n        T::StoredType: Default,\n    {\n        self.props\n            .entry(TypeId::of::<T::StoredType>())\n            .or_insert_with(|| TypeErasedBox::new(T::StoredType::default()))\n            .downcast_mut()\n            .expect(\"typechecked\")\n    }\n}\n\n/// Layered configuration structure\n///\n/// See the [module docs](crate::config_bag) for more documentation.\n#[must_use]\npub struct ConfigBag {\n    interceptor_state: Layer,\n    tail: Vec<FrozenLayer>,\n}\n\nimpl Debug for ConfigBag {\n    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {\n        struct Layers<'a>(&'a ConfigBag);\n        impl Debug for Layers<'_> {\n            fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {\n                f.debug_list().entries(self.0.layers()).finish()\n            }\n        }\n        f.debug_struct(\"ConfigBag\")\n            .field(\"layers\", &Layers(self))\n            .finish()\n    }\n}\n\nimpl ConfigBag {\n    /// Create a new config bag \"base\".\n    pub fn base() -> Self {\n        ConfigBag {\n            interceptor_state: Layer {\n                name: Cow::Borrowed(\"interceptor_state\"),\n                props: Default::default(),\n            },\n            tail: vec![],\n        }\n    }\n\n    /// Create a [`ConfigBag`] consisting of the given layers.\n    pub fn of_layers(layers: impl IntoIterator<Item = Layer>) -> Self {\n        let mut bag = ConfigBag::base();\n        for layer in layers {\n            bag.push_layer(layer);\n        }\n        bag\n    }\n\n    /// Add the given layer to the config bag.\n    pub fn push_layer(&mut self, layer: Layer) -> &mut Self {\n        self.tail.push(layer.freeze());\n        self\n    }\n\n    /// Add a frozen/shared layer to the config bag.\n    pub fn push_shared_layer(&mut self, layer: FrozenLayer) -> &mut Self {\n        self.tail.push(layer);\n        self\n    }\n\n    /// Return a mutable reference to the interceptor state.\n    pub fn interceptor_state(&mut self) -> &mut Layer {\n        &mut self.interceptor_state\n    }\n\n    /// Load a value (or values) of type `T` depending on how `T` implements [`Storable`]\n    pub fn load<T: Storable>(&self) -> <T::Storer as Store>::ReturnedType<'_> {\n        self.sourced_get::<T::Storer>()\n    }\n\n    /// Return a mutable reference to `T` if found within the interceptor state.\n    ///\n    /// This method does not search the tail of the config bag (i.e., the collection of frozen layers).\n    ///\n    /// If the caller is unsure whether `T` exists in the interceptor state,\n    /// consider using [`Self::get_mut`] instead, which requires `T` to implement `Clone`, however.\n    pub fn get_mut_from_interceptor_state<T>(&mut self) -> Option<&mut T>\n    where\n        T: Storable<Storer = StoreReplace<T>> + Send + Sync + Debug + 'static,\n    {\n        match self.interceptor_state.get_mut::<StoreReplace<T>>() {\n            Some(Value::ExplicitlyUnset(_)) => None,\n            Some(Value::Set(t)) => Some(t),\n            None => None,\n        }\n    }\n\n    /// Return a mutable reference to `T` if found within the config bag\n    ///\n    /// This method requires `T` to implement `Clone` because, if the requested item is found in the tail of the config bag,\n    /// it will be cloned and moved to the head (i.e., the interceptor state).\n    ///\n    /// If the caller is certain that `T` already exists in the interceptor state,\n    /// consider using [`Self::get_mut_from_interceptor_state`] instead, which does not require `T` to be `Clone`.\n    pub fn get_mut<T>(&mut self) -> Option<&mut T>\n    where\n        T: Storable<Storer = StoreReplace<T>> + Send + Sync + Debug + Clone + 'static,\n    {\n        if self\n            .interceptor_state\n            .get_mut::<StoreReplace<T>>()\n            .is_none()\n        {\n            let new_item = match self.tail.iter().find_map(|b| b.load::<T>()) {\n                Some(item) => item.clone(),\n                None => return None,\n            };\n            self.interceptor_state.store_put(new_item);\n        }\n        self.get_mut_from_interceptor_state()\n    }\n\n    /// Returns a mutable reference to `T` if it is stored in the top layer of the bag\n    ///\n    /// - If `T` is in a deeper layer of the bag, that value will be cloned and inserted into the top layer\n    /// - If `T` is not present in the bag, the [`Default`] implementation will be used.\n    pub fn get_mut_or_default<T>(&mut self) -> &mut T\n    where\n        T: Storable<Storer = StoreReplace<T>> + Send + Sync + Debug + Clone + Default + 'static,\n    {\n        self.get_mut_or_else(|| T::default())\n    }\n\n    /// Returns a mutable reference to `T` if it is stored in the top layer of the bag\n    ///\n    /// - If `T` is in a deeper layer of the bag, that value will be cloned and inserted into the top layer\n    /// - If `T` is not present in the bag, `default` will be used to construct a new value\n    pub fn get_mut_or_else<T>(&mut self, default: impl Fn() -> T) -> &mut T\n    where\n        T: Storable<Storer = StoreReplace<T>> + Send + Sync + Debug + Clone + 'static,\n    {\n        // this code looks weird to satisfy the borrow checker—we can't keep the result of `get_mut`\n        // alive (even in a returned branch) and then call `store_put`. So: drop the borrow immediately\n        // store, the value, then pull it right back\n        if self.get_mut::<T>().is_none() {\n            self.interceptor_state.store_put((default)());\n            return self\n                .get_mut()\n                .expect(\"item was just stored in the top layer\");\n        }\n        // above it was None\n        self.get_mut().unwrap()\n    }\n\n    /// Add another layer to this configuration bag\n    ///\n    /// Hint: If you want to re-use this layer, call `freeze` first.\n    ///\n    /// # Examples\n    /// ```\n    /// use aws_smithy_types::config_bag::{ConfigBag, Layer, Storable, StoreReplace};\n    ///\n    /// #[derive(Debug, Eq, PartialEq)]\n    /// struct ExampleStr(&'static str);\n    /// impl Storable for ExampleStr {\n    ///     type Storer = StoreReplace<Self>;\n    /// }\n    ///\n    /// #[derive(Debug, Eq, PartialEq)]\n    /// struct ExampleInt(i32);\n    /// impl Storable for ExampleInt {\n    ///     type Storer = StoreReplace<Self>;\n    /// }\n    ///\n    /// let mut bag = ConfigBag::base();\n    /// bag = bag.with_fn(\"first\", |layer: &mut Layer| { layer.store_put(ExampleStr(\"a\")); });\n    ///\n    /// // We can now load the example string out\n    /// assert_eq!(bag.load::<ExampleStr>(), Some(&ExampleStr(\"a\")));\n    ///\n    /// // But there isn't a number stored in the bag yet\n    /// assert_eq!(bag.load::<ExampleInt>(), None);\n    ///\n    /// // Add a layer with an example int\n    /// bag = bag.with_fn(\"second\", |layer: &mut Layer| { layer.store_put(ExampleInt(1)); });\n    ///\n    /// // Now the example int can be retrieved\n    /// assert_eq!(bag.load::<ExampleInt>(), Some(&ExampleInt(1)));\n    /// ```\n    pub fn with_fn(\n        self,\n        name: impl Into<Cow<'static, str>>,\n        next: impl Fn(&mut Layer),\n    ) -> ConfigBag {\n        let mut new_layer = Layer::new(name);\n        next(&mut new_layer);\n        let ConfigBag {\n            interceptor_state: head,\n            mut tail,\n        } = self;\n        tail.push(head.freeze());\n        ConfigBag {\n            interceptor_state: new_layer,\n            tail,\n        }\n    }\n\n    /// Add a new layer with `name` after freezing the top layer so far\n    pub fn add_layer(self, name: impl Into<Cow<'static, str>>) -> ConfigBag {\n        self.with_fn(name, |_| {})\n    }\n\n    /// Return a value (or values) of type `T` depending on how it has been stored in a `ConfigBag`\n    ///\n    /// It flexibly chooses to return a single value vs. an iterator of values depending on how\n    /// `T` implements a [`Store`] trait.\n    pub fn sourced_get<T: Store>(&self) -> T::ReturnedType<'_> {\n        let stored_type_iter = ItemIter {\n            inner: self.layers(),\n            t: PhantomData,\n        };\n        T::merge_iter(stored_type_iter)\n    }\n\n    fn layers(&self) -> BagIter<'_> {\n        BagIter {\n            head: Some(&self.interceptor_state),\n            tail: self.tail.iter().rev(),\n        }\n    }\n}\n\n/// Iterator of items returned from [`ConfigBag`].\npub struct ItemIter<'a, T> {\n    inner: BagIter<'a>,\n    t: PhantomData<T>,\n}\n\nimpl<T> Debug for ItemIter<'_, T> {\n    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {\n        write!(f, \"ItemIter\")\n    }\n}\n\nimpl<'a, T: 'a> Iterator for ItemIter<'a, T>\nwhere\n    T: Store,\n{\n    type Item = &'a T::StoredType;\n\n    fn next(&mut self) -> Option<Self::Item> {\n        match self.inner.next() {\n            Some(layer) => layer.get::<T>().or_else(|| self.next()),\n            None => None,\n        }\n    }\n}\n\n/// Iterator over the layers of a config bag\nstruct BagIter<'a> {\n    head: Option<&'a Layer>,\n    tail: Rev<Iter<'a, FrozenLayer>>,\n}\n\nimpl<'a> Iterator for BagIter<'a> {\n    type Item = &'a Layer;\n\n    fn next(&mut self) -> Option<Self::Item> {\n        if let Some(head) = self.head.take() {\n            Some(head)\n        } else {\n            self.tail.next().map(|t| t.deref())\n        }\n    }\n}\n\n#[cfg(test)]\nmod test {\n    use super::ConfigBag;\n    use crate::config_bag::{CloneableLayer, Layer, Storable, StoreAppend, StoreReplace};\n\n    #[test]\n    fn layered_property_bag() {\n        #[derive(Debug)]\n        struct Prop1;\n        impl Storable for Prop1 {\n            type Storer = StoreReplace<Self>;\n        }\n        #[derive(Debug)]\n        struct Prop2;\n        impl Storable for Prop2 {\n            type Storer = StoreReplace<Self>;\n        }\n        let layer_a = |bag: &mut Layer| {\n            bag.store_put(Prop1);\n        };\n\n        let layer_b = |bag: &mut Layer| {\n            bag.store_put(Prop2);\n        };\n\n        #[derive(Debug)]\n        struct Prop3;\n        impl Storable for Prop3 {\n            type Storer = StoreReplace<Self>;\n        }\n\n        let mut base_bag = ConfigBag::base()\n            .with_fn(\"a\", layer_a)\n            .with_fn(\"b\", layer_b);\n        base_bag.interceptor_state().store_put(Prop3);\n        assert!(base_bag.load::<Prop1>().is_some());\n\n        #[derive(Debug)]\n        struct Prop4;\n        impl Storable for Prop4 {\n            type Storer = StoreReplace<Self>;\n        }\n\n        let layer_c = |bag: &mut Layer| {\n            bag.store_put(Prop4);\n            bag.unset::<Prop3>();\n        };\n\n        let final_bag = base_bag.with_fn(\"c\", layer_c);\n\n        assert!(final_bag.load::<Prop4>().is_some());\n        assert!(final_bag.load::<Prop1>().is_some());\n        assert!(final_bag.load::<Prop2>().is_some());\n        // we unset prop3\n        assert!(final_bag.load::<Prop3>().is_none());\n        println!(\"{final_bag:#?}\");\n    }\n\n    #[test]\n    fn config_bag() {\n        let bag = ConfigBag::base();\n        #[derive(Debug)]\n        struct Region(&'static str);\n        impl Storable for Region {\n            type Storer = StoreReplace<Self>;\n        }\n        let bag = bag.with_fn(\"service config\", |layer: &mut Layer| {\n            layer.store_put(Region(\"asdf\"));\n        });\n\n        assert_eq!(bag.load::<Region>().unwrap().0, \"asdf\");\n\n        #[derive(Debug)]\n        struct SigningName(&'static str);\n        impl Storable for SigningName {\n            type Storer = StoreReplace<Self>;\n        }\n        let operation_config = bag.with_fn(\"operation\", |layer: &mut Layer| {\n            layer.store_put(SigningName(\"s3\"));\n        });\n\n        assert_eq!(operation_config.load::<SigningName>().unwrap().0, \"s3\");\n\n        #[derive(Debug)]\n        struct Prop;\n        impl Storable for Prop {\n            type Storer = StoreReplace<Self>;\n        }\n        let mut open_bag = operation_config.with_fn(\"my_custom_info\", |_bag: &mut Layer| {});\n        open_bag.interceptor_state().store_put(Prop);\n\n        assert_eq!(open_bag.layers().count(), 4);\n    }\n\n    #[test]\n    fn store_append() {\n        let mut layer = Layer::new(\"test\");\n        #[derive(Debug, PartialEq, Eq)]\n        struct Interceptor(&'static str);\n        impl Storable for Interceptor {\n            type Storer = StoreAppend<Interceptor>;\n        }\n\n        layer.clear::<Interceptor>();\n        // you can only call store_append because interceptor is marked with a vec\n        layer.store_append(Interceptor(\"123\"));\n        layer.store_append(Interceptor(\"456\"));\n\n        let mut second_layer = Layer::new(\"next\");\n        second_layer.store_append(Interceptor(\"789\"));\n\n        let mut bag = ConfigBag::of_layers(vec![layer, second_layer]);\n\n        assert_eq!(\n            bag.load::<Interceptor>().collect::<Vec<_>>(),\n            vec![\n                &Interceptor(\"789\"),\n                &Interceptor(\"456\"),\n                &Interceptor(\"123\")\n            ]\n        );\n\n        let mut final_layer = Layer::new(\"final\");\n        final_layer.clear::<Interceptor>();\n        bag.push_layer(final_layer);\n        assert_eq!(bag.load::<Interceptor>().count(), 0);\n    }\n\n    #[test]\n    fn store_append_many_layers() {\n        #[derive(Debug, PartialEq, Eq, Clone)]\n        struct TestItem(i32, i32);\n        impl Storable for TestItem {\n            type Storer = StoreAppend<TestItem>;\n        }\n        let mut expected = vec![];\n        let mut bag = ConfigBag::base();\n        for layer_idx in 0..100 {\n            let mut layer = Layer::new(format!(\"{layer_idx}\"));\n            for item in 0..100 {\n                expected.push(TestItem(layer_idx, item));\n                layer.store_append(TestItem(layer_idx, item));\n            }\n            bag.push_layer(layer);\n        }\n        expected.reverse();\n        assert_eq!(\n            bag.load::<TestItem>().cloned().collect::<Vec<_>>(),\n            expected\n        );\n    }\n\n    #[test]\n    fn adding_layers() {\n        let mut layer_1 = Layer::new(\"layer1\");\n\n        let mut layer_2 = Layer::new(\"layer2\");\n\n        #[derive(Clone, Debug, PartialEq, Eq, Default)]\n        struct Foo(usize);\n        impl Storable for Foo {\n            type Storer = StoreReplace<Foo>;\n        }\n\n        layer_1.store_put(Foo(0));\n        layer_2.store_put(Foo(1));\n\n        let layer_1 = layer_1.freeze();\n        let layer_2 = layer_2.freeze();\n\n        let mut bag_1 = ConfigBag::base();\n        let mut bag_2 = ConfigBag::base();\n        bag_1\n            .push_shared_layer(layer_1.clone())\n            .push_shared_layer(layer_2.clone());\n        bag_2.push_shared_layer(layer_2).push_shared_layer(layer_1);\n\n        // bags have same layers but in different orders\n        assert_eq!(bag_1.load::<Foo>(), Some(&Foo(1)));\n        assert_eq!(bag_2.load::<Foo>(), Some(&Foo(0)));\n\n        bag_1.interceptor_state().store_put(Foo(3));\n        assert_eq!(bag_1.load::<Foo>(), Some(&Foo(3)));\n    }\n\n    #[test]\n    fn get_mut_or_else() {\n        #[derive(Clone, Debug, PartialEq, Eq, Default)]\n        struct Foo(usize);\n        impl Storable for Foo {\n            type Storer = StoreReplace<Foo>;\n        }\n\n        let mut bag = ConfigBag::base();\n        assert_eq!(bag.get_mut::<Foo>(), None);\n        assert_eq!(bag.get_mut_or_default::<Foo>(), &Foo(0));\n        bag.get_mut_or_default::<Foo>().0 += 1;\n        assert_eq!(bag.load::<Foo>(), Some(&Foo(1)));\n\n        let old_ref = bag.load::<Foo>().unwrap();\n        assert_eq!(old_ref, &Foo(1));\n\n        // there is one in the bag, so it can be returned\n        //let mut next = bag.add_layer(\"next\");\n        bag.get_mut::<Foo>().unwrap().0 += 1;\n        let new_ref = bag.load::<Foo>().unwrap();\n        assert_eq!(new_ref, &Foo(2));\n\n        bag.interceptor_state().unset::<Foo>();\n        // if it was unset, we can't clone the current one, that would be wrong\n        assert_eq!(bag.get_mut::<Foo>(), None);\n        assert_eq!(bag.get_mut_or_default::<Foo>(), &Foo(0));\n    }\n\n    #[test]\n    fn get_mut_from_interceptor_state() {\n        // excludes `Clone` to verify `get_mut_from_interceptor_state` works with types without the `Clone` trait\n        #[derive(Debug, PartialEq, Eq, Default)]\n        struct Foo(usize);\n        impl Storable for Foo {\n            type Storer = StoreReplace<Self>;\n        }\n\n        #[derive(Clone, Debug, PartialEq, Eq, Default)]\n        struct Bar(usize);\n        impl Storable for Bar {\n            type Storer = StoreReplace<Self>;\n        }\n\n        let mut bag = ConfigBag::base();\n        assert!(bag.get_mut_from_interceptor_state::<Foo>().is_none());\n\n        bag.interceptor_state().store_put(Foo(1));\n        assert_eq!(\n            bag.get_mut_from_interceptor_state::<Foo>(),\n            Some(&mut Foo(1))\n        );\n\n        // `Bar` is stored in the tail of the config bag.\n        let mut layer = Layer::new(\"test\");\n        layer.store_put(Bar(1));\n        bag.push_layer(layer);\n\n        // the method under test should not find `Bar`, as it does not reside in the interceptor state.\n        assert!(bag.get_mut_from_interceptor_state::<Bar>().is_none());\n    }\n\n    #[test]\n    fn cloning_layers() {\n        #[derive(Clone, Debug)]\n        struct TestStr(String);\n        impl Storable for TestStr {\n            type Storer = StoreReplace<TestStr>;\n        }\n        let mut layer_1 = CloneableLayer::new(\"layer_1\");\n        let expected_str = \"I can be cloned\";\n        layer_1.store_put(TestStr(expected_str.to_owned()));\n        let layer_1_cloned = layer_1.clone();\n        assert_eq!(expected_str, &layer_1_cloned.load::<TestStr>().unwrap().0);\n\n        // Should still be cloneable after unsetting a field\n        layer_1.unset::<TestStr>();\n        assert!(layer_1.try_clone().unwrap().load::<TestStr>().is_none());\n\n        // It is cloneable multiple times in succession\n        let _ = layer_1\n            .try_clone()\n            .expect(\"clone 1\")\n            .try_clone()\n            .expect(\"clone 2\");\n\n        #[derive(Clone, Debug)]\n        struct Rope(String);\n        impl Storable for Rope {\n            type Storer = StoreAppend<Rope>;\n        }\n        let mut layer_2 = CloneableLayer::new(\"layer_2\");\n        layer_2.store_append(Rope(\"A\".to_owned()));\n        layer_2.store_append(Rope(\"big\".to_owned()));\n        layer_2.store_append(Rope(\"rope\".to_owned()));\n        let layer_2_cloned = layer_2.clone();\n        let rope = layer_2_cloned.load::<Rope>().cloned().collect::<Vec<_>>();\n        assert_eq!(\n            \"A big rope\",\n            rope.iter()\n                .rev()\n                .map(|r| r.0.clone())\n                .collect::<Vec<_>>()\n                .join(\" \")\n        );\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-types/src/date_time/de.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse super::*;\nuse serde::de::{Error, Visitor};\nuse serde::Deserialize;\n\nstruct DateTimeVisitor;\n\nstruct NonHumanReadableDateTimeVisitor;\n\nimpl<'de> Visitor<'de> for DateTimeVisitor {\n    type Value = DateTime;\n    fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {\n        formatter.write_str(\"expected RFC-3339 Date Time\")\n    }\n\n    fn visit_str<E>(self, v: &str) -> Result<Self::Value, E>\n    where\n        E: serde::de::Error,\n    {\n        match DateTime::from_str(v, Format::DateTime) {\n            Ok(e) => Ok(e),\n            Err(e) => Err(Error::custom(e)),\n        }\n    }\n}\n\nimpl<'de> Visitor<'de> for NonHumanReadableDateTimeVisitor {\n    type Value = DateTime;\n    fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {\n        formatter.write_str(\"DateTime type expects a tuple of i64 and u32 when deserializing from non human readable format like CBOR or AVRO, i.e. (i64, u32)\")\n    }\n\n    fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>\n    where\n        A: serde::de::SeqAccess<'de>,\n    {\n        match seq.size_hint() {\n            Some(2) | None => match (seq.next_element()?, seq.next_element()?) {\n                (Some(seconds), Some(subsecond_nanos)) => Ok(DateTime {\n                    seconds,\n                    subsecond_nanos,\n                }),\n                _ => return Err(Error::custom(\"datatype mismatch\")),\n            },\n            _ => Err(Error::custom(\"Size mismatch\")),\n        }\n    }\n}\n\nimpl<'de> Deserialize<'de> for DateTime {\n    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>\n    where\n        D: serde::Deserializer<'de>,\n    {\n        if deserializer.is_human_readable() {\n            deserializer.deserialize_str(DateTimeVisitor)\n        } else {\n            deserializer.deserialize_tuple(2, NonHumanReadableDateTimeVisitor)\n        }\n    }\n}\n\n#[cfg(test)]\nmod test {\n    use super::*;\n\n    /// check for human redable format\n    #[test]\n    fn de_human_readable_datetime() {\n        use serde::{Deserialize, Serialize};\n\n        let datetime = DateTime::from_secs(1576540098);\n        #[derive(Serialize, Deserialize, PartialEq)]\n        struct Test {\n            datetime: DateTime,\n        }\n        let datetime_json = r#\"{\"datetime\":\"2019-12-16T23:48:18Z\"}\"#;\n        let test = serde_json::from_str::<Test>(&datetime_json).ok();\n        assert!(test == Some(Test { datetime }));\n    }\n\n    /// check for non-human redable format\n    #[test]\n    fn de_not_human_readable_datetime() {\n        {\n            let cbor = ciborium::value::Value::Array(vec![\n                ciborium::value::Value::Integer(1576540098i64.into()),\n                ciborium::value::Value::Integer(0u32.into()),\n            ]);\n            let mut buf = vec![];\n            let _ = ciborium::ser::into_writer(&cbor, &mut buf);\n            let cbor_dt: DateTime = ciborium::de::from_reader(std::io::Cursor::new(buf)).unwrap();\n            assert_eq!(\n                cbor_dt,\n                DateTime {\n                    seconds: 1576540098i64,\n                    subsecond_nanos: 0\n                }\n            );\n        };\n\n        {\n            let cbor = ciborium::value::Value::Array(vec![\n                ciborium::value::Value::Integer(0i64.into()),\n                ciborium::value::Value::Integer(0u32.into()),\n            ]);\n            let mut buf = vec![];\n            let _ = ciborium::ser::into_writer(&cbor, &mut buf);\n            let cbor_dt: DateTime = ciborium::de::from_reader(std::io::Cursor::new(buf)).unwrap();\n            assert_eq!(\n                cbor_dt,\n                DateTime {\n                    seconds: 0,\n                    subsecond_nanos: 0\n                }\n            );\n        };\n\n        {\n            let cbor = ciborium::value::Value::Array(vec![\n                ciborium::value::Value::Integer(i64::MAX.into()),\n                ciborium::value::Value::Integer(u32::MAX.into()),\n            ]);\n            let mut buf = vec![];\n            let _ = ciborium::ser::into_writer(&cbor, &mut buf);\n            let cbor_dt: DateTime = ciborium::de::from_reader(std::io::Cursor::new(buf)).unwrap();\n            assert_eq!(\n                cbor_dt,\n                DateTime {\n                    seconds: i64::MAX,\n                    subsecond_nanos: u32::MAX\n                }\n            );\n        };\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-types/src/date_time/format.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::borrow::Cow;\nuse std::error::Error;\nuse std::fmt;\n\nconst NANOS_PER_SECOND: u32 = 1_000_000_000;\n\n#[derive(Debug)]\npub(super) enum DateTimeParseErrorKind {\n    /// The given date-time string was invalid.\n    Invalid(Cow<'static, str>),\n    /// Failed to parse an integer inside the given date-time string.\n    IntParseError,\n}\n\n/// Error returned when date-time parsing fails.\n#[derive(Debug)]\npub struct DateTimeParseError {\n    kind: DateTimeParseErrorKind,\n}\n\nimpl Error for DateTimeParseError {}\n\nimpl fmt::Display for DateTimeParseError {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        use DateTimeParseErrorKind::*;\n        match &self.kind {\n            Invalid(msg) => write!(f, \"invalid date-time: {msg}\"),\n            IntParseError => write!(f, \"failed to parse int\"),\n        }\n    }\n}\n\nimpl From<DateTimeParseErrorKind> for DateTimeParseError {\n    fn from(kind: DateTimeParseErrorKind) -> Self {\n        Self { kind }\n    }\n}\n\n#[derive(Debug)]\nenum DateTimeFormatErrorKind {\n    /// The given date-time cannot be represented in the requested date format.\n    OutOfRange(Cow<'static, str>),\n}\n\n/// Error returned when date-time formatting fails.\n#[derive(Debug)]\npub struct DateTimeFormatError {\n    kind: DateTimeFormatErrorKind,\n}\n\nimpl Error for DateTimeFormatError {}\n\nimpl fmt::Display for DateTimeFormatError {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        match &self.kind {\n            DateTimeFormatErrorKind::OutOfRange(msg) => write!(\n                f,\n                \"date-time cannot be formatted since it is out of range: {msg}\"\n            ),\n        }\n    }\n}\n\nimpl From<DateTimeFormatErrorKind> for DateTimeFormatError {\n    fn from(kind: DateTimeFormatErrorKind) -> Self {\n        DateTimeFormatError { kind }\n    }\n}\n\nfn remove_trailing_zeros(string: &mut String) {\n    while let Some(b'0') = string.as_bytes().last() {\n        string.pop();\n    }\n}\n\npub(crate) mod epoch_seconds {\n    use super::remove_trailing_zeros;\n    use super::{DateTimeParseError, DateTimeParseErrorKind};\n    use crate::DateTime;\n    use std::str::FromStr;\n\n    /// Formats a `DateTime` into the Smithy epoch seconds date-time format.\n    pub(crate) fn format(date_time: &DateTime) -> String {\n        if date_time.subsecond_nanos == 0 {\n            format!(\"{}\", date_time.seconds)\n        } else {\n            let mut result = format!(\"{}.{:0>9}\", date_time.seconds, date_time.subsecond_nanos);\n            remove_trailing_zeros(&mut result);\n            result\n        }\n    }\n\n    /// Parses the Smithy epoch seconds date-time format into a `DateTime`.\n    pub(crate) fn parse(value: &str) -> Result<DateTime, DateTimeParseError> {\n        let mut parts = value.splitn(2, '.');\n        let (mut whole, mut decimal) = (0i64, 0u32);\n        if let Some(whole_str) = parts.next() {\n            whole =\n                <i64>::from_str(whole_str).map_err(|_| DateTimeParseErrorKind::IntParseError)?;\n        }\n        if let Some(decimal_str) = parts.next() {\n            if decimal_str.starts_with('+') || decimal_str.starts_with('-') {\n                return Err(DateTimeParseErrorKind::Invalid(\n                    \"invalid epoch-seconds timestamp\".into(),\n                )\n                .into());\n            }\n            if decimal_str.len() > 9 {\n                return Err(DateTimeParseErrorKind::Invalid(\n                    \"decimal is longer than 9 digits\".into(),\n                )\n                .into());\n            }\n            let missing_places = 9 - decimal_str.len() as isize;\n            decimal =\n                <u32>::from_str(decimal_str).map_err(|_| DateTimeParseErrorKind::IntParseError)?;\n            for _ in 0..missing_places {\n                decimal *= 10;\n            }\n        }\n        Ok(DateTime::from_secs_and_nanos(whole, decimal))\n    }\n}\n\npub(crate) mod http_date {\n    use crate::date_time::format::{\n        DateTimeFormatError, DateTimeFormatErrorKind, DateTimeParseError, DateTimeParseErrorKind,\n        NANOS_PER_SECOND,\n    };\n    use crate::DateTime;\n    use std::str::FromStr;\n    use time::{Date, Month, OffsetDateTime, PrimitiveDateTime, Time, UtcOffset, Weekday};\n\n    // This code is taken from https://github.com/pyfisch/httpdate and modified under an\n    // Apache 2.0 License. Modifications:\n    // - Removed use of unsafe\n    // - Add deserialization of subsecond nanos\n    //\n    /// Format a `DateTime` in the HTTP date format (imf-fixdate)\n    ///\n    /// Example: \"Mon, 16 Dec 2019 23:48:18 GMT\"\n    ///\n    /// Some notes:\n    /// - HTTP date does not support years before `0001`—this will cause a panic.\n    /// - Subsecond nanos are not emitted\n    pub(crate) fn format(date_time: &DateTime) -> Result<String, DateTimeFormatError> {\n        fn out_of_range<E: std::fmt::Display>(cause: E) -> DateTimeFormatError {\n            DateTimeFormatErrorKind::OutOfRange(\n                format!(\n                    \"HTTP dates support dates between Mon, 01 Jan 0001 00:00:00 GMT \\\n                            and Fri, 31 Dec 9999 23:59:59.999 GMT. {cause}\"\n                )\n                .into(),\n            )\n            .into()\n        }\n        let structured = OffsetDateTime::from_unix_timestamp_nanos(date_time.as_nanos())\n            .map_err(out_of_range)?;\n        let weekday = match structured.weekday() {\n            Weekday::Monday => \"Mon\",\n            Weekday::Tuesday => \"Tue\",\n            Weekday::Wednesday => \"Wed\",\n            Weekday::Thursday => \"Thu\",\n            Weekday::Friday => \"Fri\",\n            Weekday::Saturday => \"Sat\",\n            Weekday::Sunday => \"Sun\",\n        };\n        let month = match structured.month() {\n            Month::January => \"Jan\",\n            Month::February => \"Feb\",\n            Month::March => \"Mar\",\n            Month::April => \"Apr\",\n            Month::May => \"May\",\n            Month::June => \"Jun\",\n            Month::July => \"Jul\",\n            Month::August => \"Aug\",\n            Month::September => \"Sep\",\n            Month::October => \"Oct\",\n            Month::November => \"Nov\",\n            Month::December => \"Dec\",\n        };\n        let mut out = String::with_capacity(32);\n        fn push_digit(out: &mut String, digit: u8) {\n            debug_assert!(digit < 10);\n            out.push((b'0' + digit) as char);\n        }\n\n        out.push_str(weekday);\n        out.push_str(\", \");\n        let day = structured.day();\n        push_digit(&mut out, day / 10);\n        push_digit(&mut out, day % 10);\n\n        out.push(' ');\n        out.push_str(month);\n\n        out.push(' ');\n\n        let year = structured.year();\n        // HTTP date does not support years before 0001\n        let year = if year < 1 {\n            return Err(out_of_range(\"HTTP dates cannot be before the year 0001\"));\n        } else {\n            year as u32\n        };\n\n        // Extract the individual digits from year\n        push_digit(&mut out, (year / 1000) as u8);\n        push_digit(&mut out, (year / 100 % 10) as u8);\n        push_digit(&mut out, (year / 10 % 10) as u8);\n        push_digit(&mut out, (year % 10) as u8);\n\n        out.push(' ');\n\n        let hour = structured.hour();\n\n        // Extract the individual digits from hour\n        push_digit(&mut out, hour / 10);\n        push_digit(&mut out, hour % 10);\n\n        out.push(':');\n\n        // Extract the individual digits from minute\n        let minute = structured.minute();\n        push_digit(&mut out, minute / 10);\n        push_digit(&mut out, minute % 10);\n\n        out.push(':');\n\n        let second = structured.second();\n        push_digit(&mut out, second / 10);\n        push_digit(&mut out, second % 10);\n\n        out.push_str(\" GMT\");\n        Ok(out)\n    }\n\n    /// Parse an IMF-fixdate formatted date into a DateTime\n    ///\n    /// This function has a few caveats:\n    /// 1. It DOES NOT support the \"deprecated\" formats supported by HTTP date\n    /// 2. It supports up to 3 digits of subsecond precision\n    ///\n    /// Ok: \"Mon, 16 Dec 2019 23:48:18 GMT\"\n    /// Ok: \"Mon, 16 Dec 2019 23:48:18.123 GMT\"\n    /// Ok: \"Mon, 16 Dec 2019 23:48:18.12 GMT\"\n    /// Not Ok: \"Mon, 16 Dec 2019 23:48:18.1234 GMT\"\n    pub(crate) fn parse(s: &str) -> Result<DateTime, DateTimeParseError> {\n        if !s.is_ascii() {\n            return Err(DateTimeParseErrorKind::Invalid(\"date-time must be ASCII\".into()).into());\n        }\n        let x = s.trim().as_bytes();\n        parse_imf_fixdate(x)\n    }\n\n    pub(crate) fn read(s: &str) -> Result<(DateTime, &str), DateTimeParseError> {\n        if !s.is_ascii() {\n            return Err(DateTimeParseErrorKind::Invalid(\"date-time must be ASCII\".into()).into());\n        }\n        let (first_date, rest) = match find_subsequence(s.as_bytes(), b\" GMT\") {\n            // split_at is correct because we asserted that this date is only valid ASCII so the byte index is\n            // the same as the char index\n            Some(idx) => s.split_at(idx),\n            None => {\n                return Err(DateTimeParseErrorKind::Invalid(\"date-time is not GMT\".into()).into())\n            }\n        };\n        Ok((parse(first_date)?, rest))\n    }\n\n    fn find_subsequence(haystack: &[u8], needle: &[u8]) -> Option<usize> {\n        haystack\n            .windows(needle.len())\n            .position(|window| window == needle)\n            .map(|idx| idx + needle.len())\n    }\n\n    fn parse_imf_fixdate(s: &[u8]) -> Result<DateTime, DateTimeParseError> {\n        // Example: `Sun, 06 Nov 1994 08:49:37 GMT`\n        if s.len() < 29\n            || s.len() > 33\n            || !s.ends_with(b\" GMT\")\n            || s[16] != b' '\n            || s[19] != b':'\n            || s[22] != b':'\n        {\n            return Err(DateTimeParseErrorKind::Invalid(\"incorrectly shaped string\".into()).into());\n        }\n        let nanos: u32 = match &s[25] {\n            b'.' => {\n                // The date must end with \" GMT\", so read from the character after the `.`\n                // to 4 from the end\n                let fraction_slice = &s[26..s.len() - 4];\n                if fraction_slice.len() > 3 {\n                    // Only thousandths are supported\n                    return Err(DateTimeParseErrorKind::Invalid(\n                        \"Smithy http-date only supports millisecond precision\".into(),\n                    )\n                    .into());\n                }\n                let fraction: u32 = parse_slice(fraction_slice)?;\n                // We need to convert the fractional second to nanoseconds, so we need to scale\n                // according the the number of decimals provided\n                let multiplier = [10, 100, 1000];\n                fraction * (NANOS_PER_SECOND / multiplier[fraction_slice.len() - 1])\n            }\n            b' ' => 0,\n            _ => {\n                return Err(\n                    DateTimeParseErrorKind::Invalid(\"incorrectly shaped string\".into()).into(),\n                )\n            }\n        };\n\n        let hours = parse_slice(&s[17..19])?;\n        let minutes = parse_slice(&s[20..22])?;\n        let seconds = parse_slice(&s[23..25])?;\n        let time = Time::from_hms_nano(hours, minutes, seconds, nanos).map_err(|err| {\n            DateTimeParseErrorKind::Invalid(\n                format!(\"time components are out of range: {err}\").into(),\n            )\n        })?;\n\n        let month = match &s[7..12] {\n            b\" Jan \" => Month::January,\n            b\" Feb \" => Month::February,\n            b\" Mar \" => Month::March,\n            b\" Apr \" => Month::April,\n            b\" May \" => Month::May,\n            b\" Jun \" => Month::June,\n            b\" Jul \" => Month::July,\n            b\" Aug \" => Month::August,\n            b\" Sep \" => Month::September,\n            b\" Oct \" => Month::October,\n            b\" Nov \" => Month::November,\n            b\" Dec \" => Month::December,\n            month => {\n                return Err(DateTimeParseErrorKind::Invalid(\n                    format!(\n                        \"invalid month: {}\",\n                        std::str::from_utf8(month).unwrap_or_default()\n                    )\n                    .into(),\n                )\n                .into())\n            }\n        };\n        let year = parse_slice(&s[12..16])?;\n        let day = parse_slice(&s[5..7])?;\n        let date = Date::from_calendar_date(year, month, day).map_err(|err| {\n            DateTimeParseErrorKind::Invalid(\n                format!(\"date components are out of range: {err}\").into(),\n            )\n        })?;\n        let date_time = PrimitiveDateTime::new(date, time).assume_offset(UtcOffset::UTC);\n\n        Ok(DateTime::from_nanos(date_time.unix_timestamp_nanos())\n            .expect(\"this date format cannot produce out of range date-times\"))\n    }\n\n    fn parse_slice<T>(ascii_slice: &[u8]) -> Result<T, DateTimeParseError>\n    where\n        T: FromStr,\n    {\n        let as_str =\n            std::str::from_utf8(ascii_slice).expect(\"should only be called on ascii strings\");\n        Ok(as_str\n            .parse::<T>()\n            .map_err(|_| DateTimeParseErrorKind::IntParseError)?)\n    }\n}\n\npub(crate) mod rfc3339 {\n    use crate::date_time::format::{\n        DateTimeFormatError, DateTimeFormatErrorKind, DateTimeParseError, DateTimeParseErrorKind,\n    };\n    use crate::DateTime;\n    use time::format_description::well_known::Rfc3339;\n    use time::OffsetDateTime;\n\n    #[derive(Debug, PartialEq)]\n    pub(crate) enum AllowOffsets {\n        OffsetsAllowed,\n        OffsetsForbidden,\n    }\n\n    // OK: 1985-04-12T23:20:50.52Z\n    // OK: 1985-04-12T23:20:50Z\n    //\n    // Timezones not supported:\n    // Not OK: 1985-04-12T23:20:50-02:00\n    pub(crate) fn parse(\n        s: &str,\n        allow_offsets: AllowOffsets,\n    ) -> Result<DateTime, DateTimeParseError> {\n        if allow_offsets == AllowOffsets::OffsetsForbidden && !matches!(s.chars().last(), Some('Z'))\n        {\n            return Err(DateTimeParseErrorKind::Invalid(\n                \"Smithy does not support timezone offsets in RFC-3339 date times\".into(),\n            )\n            .into());\n        }\n        if s.len() > 10 && !matches!(s.as_bytes()[10], b'T' | b't') {\n            return Err(DateTimeParseErrorKind::Invalid(\n                \"RFC-3339 only allows `T` as a separator for date-time values\".into(),\n            )\n            .into());\n        }\n        let date_time = OffsetDateTime::parse(s, &Rfc3339).map_err(|err| {\n            DateTimeParseErrorKind::Invalid(format!(\"invalid RFC-3339 date-time: {err}\").into())\n        })?;\n        Ok(DateTime::from_nanos(date_time.unix_timestamp_nanos())\n            .expect(\"this date format cannot produce out of range date-times\"))\n    }\n\n    /// Read 1 RFC-3339 date from &str and return the remaining str\n    pub(crate) fn read(\n        s: &str,\n        allow_offests: AllowOffsets,\n    ) -> Result<(DateTime, &str), DateTimeParseError> {\n        let delim = s.find('Z').map(|idx| idx + 1).unwrap_or_else(|| s.len());\n        let (head, rest) = s.split_at(delim);\n        Ok((parse(head, allow_offests)?, rest))\n    }\n\n    /// Format a [DateTime] in the RFC-3339 date format\n    pub(crate) fn format(date_time: &DateTime) -> Result<String, DateTimeFormatError> {\n        use std::fmt::Write;\n        fn out_of_range<E: std::fmt::Display>(cause: E) -> DateTimeFormatError {\n            DateTimeFormatErrorKind::OutOfRange(\n                format!(\n                    \"RFC-3339 timestamps support dates between 0001-01-01T00:00:00.000Z \\\n                            and 9999-12-31T23:59:59.999Z. {cause}\"\n                )\n                .into(),\n            )\n            .into()\n        }\n        let (year, month, day, hour, minute, second, micros) = {\n            let s = OffsetDateTime::from_unix_timestamp_nanos(date_time.as_nanos())\n                .map_err(out_of_range)?;\n            (\n                s.year(),\n                u8::from(s.month()),\n                s.day(),\n                s.hour(),\n                s.minute(),\n                s.second(),\n                s.microsecond(),\n            )\n        };\n\n        // This is stated in the assumptions for RFC-3339. ISO-8601 allows for years\n        // between -99,999 and 99,999 inclusive, but RFC-3339 is bound between 0 and 9,999.\n        if !(1..=9_999).contains(&year) {\n            return Err(out_of_range(\"\"));\n        }\n\n        let mut out = String::with_capacity(33);\n        write!(\n            out,\n            \"{year:04}-{month:02}-{day:02}T{hour:02}:{minute:02}:{second:02}\"\n        )\n        .unwrap();\n        format_subsecond_fraction(&mut out, micros);\n        out.push('Z');\n        Ok(out)\n    }\n\n    /// Formats sub-second fraction for RFC-3339 (including the '.').\n    /// Expects to be called with a number of `micros` between 0 and 999_999 inclusive.\n    fn format_subsecond_fraction(into: &mut String, micros: u32) {\n        debug_assert!(micros < 1_000_000);\n        if micros > 0 {\n            into.push('.');\n            let (mut remaining, mut place) = (micros, 100_000);\n            while remaining > 0 {\n                let digit = (remaining / place) % 10;\n                into.push(char::from(b'0' + (digit as u8)));\n                remaining -= digit * place;\n                place /= 10;\n            }\n        }\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use crate::date_time::format::rfc3339::AllowOffsets;\n    use crate::DateTime;\n    use lazy_static::lazy_static;\n    use proptest::prelude::*;\n    use std::fs::File;\n    use std::io::Read;\n    use std::str::FromStr;\n\n    #[derive(Debug, serde::Deserialize)]\n    struct TestCase {\n        canonical_seconds: String,\n        canonical_nanos: u32,\n        #[allow(dead_code)]\n        iso8601: String,\n        #[allow(dead_code)]\n        error: bool,\n        smithy_format_value: Option<String>,\n    }\n    impl TestCase {\n        fn time(&self) -> DateTime {\n            DateTime::from_secs_and_nanos(\n                <i64>::from_str(&self.canonical_seconds).unwrap(),\n                self.canonical_nanos,\n            )\n        }\n    }\n\n    #[derive(serde::Deserialize)]\n    struct TestCases {\n        format_date_time: Vec<TestCase>,\n        format_http_date: Vec<TestCase>,\n        format_epoch_seconds: Vec<TestCase>,\n        parse_date_time: Vec<TestCase>,\n        parse_http_date: Vec<TestCase>,\n        parse_epoch_seconds: Vec<TestCase>,\n    }\n\n    lazy_static! {\n        static ref TEST_CASES: TestCases = {\n            // This test suite can be regenerated by the following Kotlin class:\n            // `codegen/src/test/kotlin/software/amazon/smithy/rust/tool/TimeTestSuiteGenerator.kt`\n            let mut json = Vec::new();\n            let mut file = File::open(\"test_data/date_time_format_test_suite.json\").expect(\"open test data file\");\n            file.read_to_end(&mut json).expect(\"read test data\");\n            serde_json::from_slice(&json).expect(\"valid test data\")\n        };\n    }\n\n    fn format_test<F>(test_cases: &[TestCase], format: F)\n    where\n        F: Fn(&DateTime) -> Result<String, DateTimeFormatError>,\n    {\n        for test_case in test_cases {\n            if let Some(expected) = test_case.smithy_format_value.as_ref() {\n                let actual = format(&test_case.time()).expect(\"failed to format\");\n                assert_eq!(expected, &actual, \"Additional context:\\n{test_case:#?}\");\n            } else {\n                format(&test_case.time()).expect_err(\"date should fail to format\");\n            }\n        }\n    }\n\n    fn parse_test<F>(test_cases: &[TestCase], parse: F)\n    where\n        F: Fn(&str) -> Result<DateTime, DateTimeParseError>,\n    {\n        for test_case in test_cases {\n            let expected = test_case.time();\n            let to_parse = test_case\n                .smithy_format_value\n                .as_ref()\n                .expect(\"parse test cases should always have a formatted value\");\n            let actual = parse(to_parse);\n\n            assert!(\n                actual.is_ok(),\n                \"Failed to parse `{}`: {}\\nAdditional context:\\n{:#?}\",\n                to_parse,\n                actual.err().unwrap(),\n                test_case\n            );\n            assert_eq!(\n                expected,\n                actual.unwrap(),\n                \"Additional context:\\n{test_case:#?}\"\n            );\n        }\n    }\n\n    #[test]\n    fn format_epoch_seconds() {\n        format_test(&TEST_CASES.format_epoch_seconds, |dt| {\n            Ok(epoch_seconds::format(dt))\n        });\n    }\n\n    #[test]\n    fn parse_epoch_seconds() {\n        parse_test(&TEST_CASES.parse_epoch_seconds, epoch_seconds::parse);\n    }\n\n    #[test]\n    fn format_http_date() {\n        format_test(&TEST_CASES.format_http_date, http_date::format);\n    }\n\n    #[test]\n    fn parse_http_date() {\n        parse_test(&TEST_CASES.parse_http_date, http_date::parse);\n    }\n\n    #[test]\n    fn date_time_out_of_range() {\n        assert_eq!(\n            \"0001-01-01T00:00:00Z\",\n            rfc3339::format(&DateTime::from_secs(-62_135_596_800)).unwrap()\n        );\n        assert_eq!(\n            \"9999-12-31T23:59:59.999999Z\",\n            rfc3339::format(&DateTime::from_secs_and_nanos(253402300799, 999_999_999)).unwrap()\n        );\n\n        assert!(matches!(\n            rfc3339::format(&DateTime::from_secs(-62_135_596_800 - 1)),\n            Err(DateTimeFormatError {\n                kind: DateTimeFormatErrorKind::OutOfRange(_)\n            })\n        ));\n        assert!(matches!(\n            rfc3339::format(&DateTime::from_secs(253402300799 + 1)),\n            Err(DateTimeFormatError {\n                kind: DateTimeFormatErrorKind::OutOfRange(_)\n            })\n        ));\n    }\n\n    #[test]\n    fn format_date_time() {\n        format_test(&TEST_CASES.format_date_time, rfc3339::format);\n    }\n\n    #[test]\n    fn parse_date_time() {\n        parse_test(&TEST_CASES.parse_date_time, |date| {\n            rfc3339::parse(date, AllowOffsets::OffsetsForbidden)\n        });\n    }\n\n    #[test]\n    fn epoch_seconds_invalid_cases() {\n        assert!(epoch_seconds::parse(\"\").is_err());\n        assert!(epoch_seconds::parse(\"123.+456\").is_err());\n        assert!(epoch_seconds::parse(\"123.-456\").is_err());\n        assert!(epoch_seconds::parse(\"123.456.789\").is_err());\n        assert!(epoch_seconds::parse(\"123 . 456\").is_err());\n        assert!(epoch_seconds::parse(\"123.456  \").is_err());\n        assert!(epoch_seconds::parse(\"  123.456\").is_err());\n        assert!(epoch_seconds::parse(\"a.456\").is_err());\n        assert!(epoch_seconds::parse(\"123.a\").is_err());\n        assert!(epoch_seconds::parse(\"123..\").is_err());\n        assert!(epoch_seconds::parse(\".123\").is_err());\n    }\n\n    #[test]\n    fn read_rfc3339_date_comma_split() {\n        let date = \"1985-04-12T23:20:50Z,1985-04-12T23:20:51Z\";\n        let (e1, date) =\n            rfc3339::read(date, AllowOffsets::OffsetsForbidden).expect(\"should succeed\");\n        let (e2, date2) =\n            rfc3339::read(&date[1..], AllowOffsets::OffsetsForbidden).expect(\"should succeed\");\n        assert_eq!(date2, \"\");\n        assert_eq!(date, \",1985-04-12T23:20:51Z\");\n        let expected = DateTime::from_secs_and_nanos(482196050, 0);\n        assert_eq!(e1, expected);\n        let expected = DateTime::from_secs_and_nanos(482196051, 0);\n        assert_eq!(e2, expected);\n    }\n\n    #[test]\n    fn parse_rfc3339_with_timezone() {\n        let dt = rfc3339::parse(\"1985-04-12T21:20:51-02:00\", AllowOffsets::OffsetsAllowed);\n        assert_eq!(dt.unwrap(), DateTime::from_secs_and_nanos(482196051, 0));\n    }\n\n    #[test]\n    fn parse_rfc3339_timezone_forbidden() {\n        let dt = rfc3339::parse(\"1985-04-12T23:20:50-02:00\", AllowOffsets::OffsetsForbidden);\n        assert!(matches!(\n            dt.unwrap_err(),\n            DateTimeParseError {\n                kind: DateTimeParseErrorKind::Invalid(_)\n            }\n        ));\n    }\n\n    #[test]\n    fn http_date_out_of_range() {\n        assert_eq!(\n            \"Mon, 01 Jan 0001 00:00:00 GMT\",\n            http_date::format(&DateTime::from_secs(-62_135_596_800)).unwrap()\n        );\n        assert_eq!(\n            \"Fri, 31 Dec 9999 23:59:59 GMT\",\n            http_date::format(&DateTime::from_secs_and_nanos(253402300799, 999_999_999)).unwrap()\n        );\n\n        assert!(matches!(\n            http_date::format(&DateTime::from_secs(-62_135_596_800 - 1)),\n            Err(DateTimeFormatError {\n                kind: DateTimeFormatErrorKind::OutOfRange(_)\n            })\n        ));\n        assert!(matches!(\n            http_date::format(&DateTime::from_secs(253402300799 + 1)),\n            Err(DateTimeFormatError {\n                kind: DateTimeFormatErrorKind::OutOfRange(_)\n            })\n        ));\n    }\n\n    #[test]\n    fn http_date_too_much_fraction() {\n        let fractional = \"Mon, 16 Dec 2019 23:48:18.1212 GMT\";\n        assert!(matches!(\n            http_date::parse(fractional),\n            Err(DateTimeParseError {\n                kind: DateTimeParseErrorKind::Invalid(_)\n            })\n        ));\n    }\n\n    #[test]\n    fn http_date_bad_fraction() {\n        let fractional = \"Mon, 16 Dec 2019 23:48:18. GMT\";\n        assert!(matches!(\n            http_date::parse(fractional),\n            Err(DateTimeParseError {\n                kind: DateTimeParseErrorKind::IntParseError\n            })\n        ));\n    }\n\n    #[test]\n    fn http_date_read_date() {\n        let fractional = \"Mon, 16 Dec 2019 23:48:18.123 GMT,some more stuff\";\n        let ts = 1576540098;\n        let expected = DateTime::from_fractional_secs(ts, 0.123);\n        let (actual, rest) = http_date::read(fractional).expect(\"valid\");\n        assert_eq!(rest, \",some more stuff\");\n        assert_eq!(expected, actual);\n        http_date::read(rest).expect_err(\"invalid date\");\n    }\n\n    #[track_caller]\n    fn http_date_check_roundtrip(epoch_secs: i64, subsecond_nanos: u32) {\n        let date_time = DateTime::from_secs_and_nanos(epoch_secs, subsecond_nanos);\n        let formatted = http_date::format(&date_time).unwrap();\n        let parsed = http_date::parse(&formatted);\n        let read = http_date::read(&formatted);\n        match parsed {\n            Err(failure) => panic!(\"Date failed to parse {failure:?}\"),\n            Ok(date) => {\n                assert!(read.is_ok());\n                if date.subsecond_nanos != subsecond_nanos {\n                    assert_eq!(http_date::format(&date_time).unwrap(), formatted);\n                } else {\n                    assert_eq!(date, date_time)\n                }\n            }\n        }\n    }\n\n    #[test]\n    fn http_date_roundtrip() {\n        for epoch_secs in -1000..1000 {\n            http_date_check_roundtrip(epoch_secs, 1);\n        }\n\n        http_date_check_roundtrip(1576540098, 0);\n        http_date_check_roundtrip(9999999999, 0);\n    }\n\n    #[test]\n    fn parse_rfc3339_invalid_separator() {\n        let test_cases = [\n            (\"1985-04-12 23:20:50Z\", AllowOffsets::OffsetsForbidden),\n            (\"1985-04-12x23:20:50Z\", AllowOffsets::OffsetsForbidden),\n            (\"1985-04-12 23:20:50-02:00\", AllowOffsets::OffsetsAllowed),\n            (\"1985-04-12a23:20:50-02:00\", AllowOffsets::OffsetsAllowed),\n        ];\n        for (date, offset) in test_cases.into_iter() {\n            let dt = rfc3339::parse(date, offset);\n            assert!(matches!(\n                dt.unwrap_err(),\n                DateTimeParseError {\n                    kind: DateTimeParseErrorKind::Invalid(_)\n                }\n            ));\n        }\n    }\n    #[test]\n    fn parse_rfc3339_t_separator() {\n        let test_cases = [\n            (\"1985-04-12t23:20:50Z\", AllowOffsets::OffsetsForbidden),\n            (\"1985-04-12T23:20:50Z\", AllowOffsets::OffsetsForbidden),\n            (\"1985-04-12t23:20:50-02:00\", AllowOffsets::OffsetsAllowed),\n            (\"1985-04-12T23:20:50-02:00\", AllowOffsets::OffsetsAllowed),\n        ];\n        for (date, offset) in test_cases.into_iter() {\n            let dt = rfc3339::parse(date, offset);\n            assert!(\n                dt.is_ok(),\n                \"failed to parse date: '{}' with error: {:?}\",\n                date,\n                dt.err().unwrap()\n            );\n        }\n    }\n\n    proptest! {\n        #![proptest_config(ProptestConfig::with_cases(10000))]\n\n        #[test]\n        fn round_trip(secs in -10000000..9999999999i64, nanos in 0..1_000_000_000u32) {\n            http_date_check_roundtrip(secs, nanos);\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-types/src/date_time/mod.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! DateTime type for representing Smithy timestamps.\n\nuse crate::date_time::format::rfc3339::AllowOffsets;\nuse crate::date_time::format::DateTimeParseErrorKind;\nuse num_integer::div_mod_floor;\nuse num_integer::Integer;\nuse std::cmp::Ordering;\nuse std::error::Error as StdError;\nuse std::fmt;\nuse std::fmt::Display;\nuse std::time::Duration;\nuse std::time::SystemTime;\nuse std::time::UNIX_EPOCH;\n\n#[cfg(all(aws_sdk_unstable, feature = \"serde-deserialize\"))]\nmod de;\nmod format;\n#[cfg(all(aws_sdk_unstable, feature = \"serde-serialize\"))]\nmod ser;\n\npub use self::format::DateTimeFormatError;\npub use self::format::DateTimeParseError;\n\nconst MILLIS_PER_SECOND: i64 = 1000;\nconst NANOS_PER_MILLI: u32 = 1_000_000;\nconst NANOS_PER_SECOND: i128 = 1_000_000_000;\nconst NANOS_PER_SECOND_U32: u32 = 1_000_000_000;\n\n/* ANCHOR: date_time */\n\n/// DateTime in time.\n///\n/// DateTime in time represented as seconds and sub-second nanos since\n/// the Unix epoch (January 1, 1970 at midnight UTC/GMT).\n///\n/// This type can be converted to/from the standard library's [`SystemTime`]:\n/// ```rust\n/// # fn doc_fn() -> Result<(), aws_smithy_types::date_time::ConversionError> {\n/// # use aws_smithy_types::date_time::DateTime;\n/// # use std::time::SystemTime;\n///\n/// let the_millennium_as_system_time = SystemTime::try_from(DateTime::from_secs(946_713_600))?;\n/// let now_as_date_time = DateTime::from(SystemTime::now());\n/// # Ok(())\n/// # }\n/// ```\n///\n/// The [`aws-smithy-types-convert`](https://crates.io/crates/aws-smithy-types-convert) crate\n/// can be used for conversions to/from other libraries, such as\n/// [`time`](https://crates.io/crates/time) or [`chrono`](https://crates.io/crates/chrono).\n#[derive(PartialEq, Eq, Hash, Clone, Copy)]\npub struct DateTime {\n    pub(crate) seconds: i64,\n    /// Subsecond nanos always advances the wallclock time, even for times where seconds is negative\n    ///\n    /// Bigger subsecond nanos => later time\n    pub(crate) subsecond_nanos: u32,\n}\n\n/* ANCHOR_END: date_time */\n\nimpl DateTime {\n    /// Creates a `DateTime` from a number of seconds since the Unix epoch.\n    pub fn from_secs(epoch_seconds: i64) -> Self {\n        DateTime {\n            seconds: epoch_seconds,\n            subsecond_nanos: 0,\n        }\n    }\n\n    /// Creates a `DateTime` from a number of milliseconds since the Unix epoch.\n    pub fn from_millis(epoch_millis: i64) -> DateTime {\n        let (seconds, millis) = div_mod_floor(epoch_millis, MILLIS_PER_SECOND);\n        DateTime::from_secs_and_nanos(seconds, millis as u32 * NANOS_PER_MILLI)\n    }\n\n    /// Creates a `DateTime` from a number of nanoseconds since the Unix epoch.\n    pub fn from_nanos(epoch_nanos: i128) -> Result<Self, ConversionError> {\n        let (seconds, subsecond_nanos) = epoch_nanos.div_mod_floor(&NANOS_PER_SECOND);\n        let seconds = i64::try_from(seconds).map_err(|_| {\n            ConversionError(\"given epoch nanos are too large to fit into a DateTime\")\n        })?;\n        let subsecond_nanos = subsecond_nanos as u32; // safe cast because of the modulus\n        Ok(DateTime {\n            seconds,\n            subsecond_nanos,\n        })\n    }\n\n    /// Returns the number of nanoseconds since the Unix epoch that this `DateTime` represents.\n    pub fn as_nanos(&self) -> i128 {\n        let seconds = self.seconds as i128 * NANOS_PER_SECOND;\n        seconds + self.subsecond_nanos as i128\n    }\n\n    /// Creates a `DateTime` from a number of seconds and a fractional second since the Unix epoch.\n    ///\n    /// # Example\n    /// ```\n    /// # use aws_smithy_types::DateTime;\n    /// assert_eq!(\n    ///     DateTime::from_secs_and_nanos(1, 500_000_000u32),\n    ///     DateTime::from_fractional_secs(1, 0.5),\n    /// );\n    /// ```\n    pub fn from_fractional_secs(mut epoch_seconds: i64, fraction: f64) -> Self {\n        // Because of floating point issues, `fraction` can end up being 1.0 leading to\n        // a full second of subsecond nanos. In that case, rollover the subsecond into the second.\n        let mut subsecond_nanos = (fraction * 1_000_000_000_f64) as u32;\n        if subsecond_nanos == 1_000_000_000 {\n            epoch_seconds += 1;\n            subsecond_nanos = 0;\n        }\n        DateTime::from_secs_and_nanos(epoch_seconds, subsecond_nanos)\n    }\n\n    /// Creates a `DateTime` from a number of seconds and sub-second nanos since the Unix epoch.\n    ///\n    /// # Panics\n    /// This function will panic if `subsecond_nanos` is >= 1_000_000_000\n    ///\n    /// # Example\n    /// ```\n    /// # use aws_smithy_types::DateTime;\n    /// assert_eq!(\n    ///     DateTime::from_fractional_secs(1, 0.5),\n    ///     DateTime::from_secs_and_nanos(1, 500_000_000u32),\n    /// );\n    /// ```\n    pub fn from_secs_and_nanos(seconds: i64, subsecond_nanos: u32) -> Self {\n        if subsecond_nanos >= 1_000_000_000 {\n            panic!(\"{subsecond_nanos} is > 1_000_000_000\")\n        }\n        DateTime {\n            seconds,\n            subsecond_nanos,\n        }\n    }\n\n    /// Returns the `DateTime` value as an `f64` representing the seconds since the Unix epoch.\n    ///\n    /// _Note: This conversion will lose precision due to the nature of floating point numbers._\n    pub fn as_secs_f64(&self) -> f64 {\n        self.seconds as f64 + self.subsecond_nanos as f64 / 1_000_000_000_f64\n    }\n\n    /// Creates a `DateTime` from an `f64` representing the number of seconds since the Unix epoch.\n    ///\n    /// # Example\n    /// ```\n    /// # use aws_smithy_types::DateTime;\n    /// assert_eq!(\n    ///     DateTime::from_fractional_secs(1, 0.5),\n    ///     DateTime::from_secs_f64(1.5),\n    /// );\n    /// ```\n    pub fn from_secs_f64(epoch_seconds: f64) -> Self {\n        let seconds = epoch_seconds.floor() as i64;\n        let rem = epoch_seconds - epoch_seconds.floor();\n        DateTime::from_fractional_secs(seconds, rem)\n    }\n\n    /// Parses a `DateTime` from a string using the given `format`.\n    pub fn from_str(s: &str, format: Format) -> Result<Self, DateTimeParseError> {\n        match format {\n            Format::DateTime => format::rfc3339::parse(s, AllowOffsets::OffsetsForbidden),\n            Format::DateTimeWithOffset => format::rfc3339::parse(s, AllowOffsets::OffsetsAllowed),\n            Format::HttpDate => format::http_date::parse(s),\n            Format::EpochSeconds => format::epoch_seconds::parse(s),\n        }\n    }\n\n    /// Returns true if sub-second nanos is greater than zero.\n    pub fn has_subsec_nanos(&self) -> bool {\n        self.subsecond_nanos != 0\n    }\n\n    /// Returns the epoch seconds component of the `DateTime`.\n    ///\n    /// _Note: this does not include the sub-second nanos._\n    pub fn secs(&self) -> i64 {\n        self.seconds\n    }\n\n    /// Set the seconds component of this `DateTime`.\n    pub fn set_seconds(&mut self, seconds: i64) -> &mut Self {\n        self.seconds = seconds;\n        self\n    }\n\n    /// Returns the sub-second nanos component of the `DateTime`.\n    ///\n    /// _Note: this does not include the number of seconds since the epoch._\n    pub fn subsec_nanos(&self) -> u32 {\n        self.subsecond_nanos\n    }\n\n    /// Set the \"sub-second\" nanoseconds of this `DateTime`.\n    pub fn set_subsec_nanos(&mut self, subsec_nanos: u32) -> &mut Self {\n        self.subsecond_nanos = subsec_nanos;\n        self\n    }\n\n    /// Converts the `DateTime` to the number of milliseconds since the Unix epoch.\n    ///\n    /// This is fallible since `DateTime` holds more precision than an `i64`, and will\n    /// return a `ConversionError` for `DateTime` values that can't be converted.\n    pub fn to_millis(self) -> Result<i64, ConversionError> {\n        let subsec_millis =\n            Integer::div_floor(&i64::from(self.subsecond_nanos), &(NANOS_PER_MILLI as i64));\n        if self.seconds < 0 {\n            self.seconds\n                .checked_add(1)\n                .and_then(|seconds| seconds.checked_mul(MILLIS_PER_SECOND))\n                .and_then(|millis| millis.checked_sub(1000 - subsec_millis))\n        } else {\n            self.seconds\n                .checked_mul(MILLIS_PER_SECOND)\n                .and_then(|millis| millis.checked_add(subsec_millis))\n        }\n        .ok_or(ConversionError(\n            \"DateTime value too large to fit into i64 epoch millis\",\n        ))\n    }\n\n    /// Read 1 date of `format` from `s`, expecting either `delim` or EOF\n    ///\n    /// Enable parsing multiple dates from the same string\n    pub fn read(s: &str, format: Format, delim: char) -> Result<(Self, &str), DateTimeParseError> {\n        let (inst, next) = match format {\n            Format::DateTime => format::rfc3339::read(s, AllowOffsets::OffsetsForbidden)?,\n            Format::DateTimeWithOffset => format::rfc3339::read(s, AllowOffsets::OffsetsAllowed)?,\n            Format::HttpDate => format::http_date::read(s)?,\n            Format::EpochSeconds => {\n                let split_point = s.find(delim).unwrap_or(s.len());\n                let (s, rest) = s.split_at(split_point);\n                (Self::from_str(s, format)?, rest)\n            }\n        };\n        if next.is_empty() {\n            Ok((inst, next))\n        } else if next.starts_with(delim) {\n            Ok((inst, &next[1..]))\n        } else {\n            Err(DateTimeParseErrorKind::Invalid(\"didn't find expected delimiter\".into()).into())\n        }\n    }\n\n    /// Formats the `DateTime` to a string using the given `format`.\n    ///\n    /// Returns an error if the given `DateTime` cannot be represented by the desired format.\n    pub fn fmt(&self, format: Format) -> Result<String, DateTimeFormatError> {\n        match format {\n            Format::DateTime | Format::DateTimeWithOffset => format::rfc3339::format(self),\n            Format::EpochSeconds => Ok(format::epoch_seconds::format(self)),\n            Format::HttpDate => format::http_date::format(self),\n        }\n    }\n}\n\n/// Tries to convert a [`DateTime`] into a [`SystemTime`].\n///\n/// This can fail if the the `DateTime` value is larger or smaller than what the `SystemTime`\n/// can represent on the operating system it's compiled for. On Linux, for example, it will only\n/// fail on `Instant::from_secs(i64::MIN)` (with any nanoseconds value). On Windows, however,\n/// Rust's standard library uses a smaller precision type for `SystemTime`, and it will fail\n/// conversion for a much larger range of date-times. This is only an issue if dealing with\n/// date-times beyond several thousands of years from now.\nimpl TryFrom<DateTime> for SystemTime {\n    type Error = ConversionError;\n\n    fn try_from(date_time: DateTime) -> Result<Self, Self::Error> {\n        if date_time.secs() < 0 {\n            let mut secs = date_time.secs().unsigned_abs();\n            let mut nanos = date_time.subsec_nanos();\n            if date_time.has_subsec_nanos() {\n                // This is safe because we just went from a negative number to a positive and are subtracting\n                secs -= 1;\n                // This is safe because nanos are < 999,999,999\n                nanos = NANOS_PER_SECOND_U32 - nanos;\n            }\n            UNIX_EPOCH\n                .checked_sub(Duration::new(secs, nanos))\n                .ok_or(ConversionError(\n                    \"overflow occurred when subtracting duration from UNIX_EPOCH\",\n                ))\n        } else {\n            UNIX_EPOCH\n                .checked_add(Duration::new(\n                    date_time.secs().unsigned_abs(),\n                    date_time.subsec_nanos(),\n                ))\n                .ok_or(ConversionError(\n                    \"overflow occurred when adding duration to UNIX_EPOCH\",\n                ))\n        }\n    }\n}\n\nimpl From<SystemTime> for DateTime {\n    fn from(time: SystemTime) -> Self {\n        if time < UNIX_EPOCH {\n            let duration = UNIX_EPOCH.duration_since(time).expect(\"time < UNIX_EPOCH\");\n            let mut secs = -(duration.as_secs() as i128);\n            let mut nanos = duration.subsec_nanos() as i128;\n            if nanos != 0 {\n                secs -= 1;\n                nanos = NANOS_PER_SECOND - nanos;\n            }\n            DateTime::from_nanos(secs * NANOS_PER_SECOND + nanos)\n                .expect(\"SystemTime has same precision as DateTime\")\n        } else {\n            let duration = time.duration_since(UNIX_EPOCH).expect(\"UNIX_EPOCH <= time\");\n            DateTime::from_secs_and_nanos(\n                i64::try_from(duration.as_secs())\n                    .expect(\"SystemTime has same precision as DateTime\"),\n                duration.subsec_nanos(),\n            )\n        }\n    }\n}\n\nimpl PartialOrd for DateTime {\n    fn partial_cmp(&self, other: &Self) -> Option<Ordering> {\n        Some(self.cmp(other))\n    }\n}\n\nimpl Ord for DateTime {\n    fn cmp(&self, other: &Self) -> Ordering {\n        self.as_nanos().cmp(&other.as_nanos())\n    }\n}\n\nimpl Display for DateTime {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        // Some dates are out of range to be serialized with `DateTime`.\n        // In these cases, fallback to using epoch seconds which always works\n        let date = match self.fmt(Format::DateTime) {\n            Ok(date) => date,\n            Err(_err) => format::epoch_seconds::format(self),\n        };\n        write!(f, \"{date}\")\n    }\n}\n\nimpl fmt::Debug for DateTime {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        fmt::Display::fmt(self, f)\n    }\n}\n/// Failure to convert a `DateTime` to or from another type.\n#[derive(Debug)]\n#[non_exhaustive]\npub struct ConversionError(&'static str);\n\nimpl StdError for ConversionError {}\n\nimpl fmt::Display for ConversionError {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        write!(f, \"{}\", self.0)\n    }\n}\n\n/// Formats for representing a `DateTime` in the Smithy protocols.\n#[derive(Clone, Copy, Debug, Eq, PartialEq)]\npub enum Format {\n    /// RFC-3339 Date Time. If the date time has an offset, an error will be returned.\n    /// e.g. `2019-12-16T23:48:18Z`\n    DateTime,\n\n    /// RFC-3339 Date Time. Offsets are supported.\n    /// e.g. `2019-12-16T23:48:18+01:00`\n    DateTimeWithOffset,\n\n    /// Date format used by the HTTP `Date` header, specified in RFC-7231.\n    /// e.g. `Mon, 16 Dec 2019 23:48:18 GMT`\n    HttpDate,\n\n    /// Number of seconds since the Unix epoch formatted as a floating point.\n    /// e.g. `1576540098.52`\n    EpochSeconds,\n}\n\n#[cfg(test)]\nmod test {\n    use crate::date_time::Format;\n    use crate::DateTime;\n    use proptest::proptest;\n    use std::time::SystemTime;\n    use time::format_description::well_known::Rfc3339;\n    use time::OffsetDateTime;\n\n    #[test]\n    fn test_display_date_time() {\n        let date_time = DateTime::from_secs(1576540098);\n        assert_eq!(format!(\"{date_time}\"), \"2019-12-16T23:48:18Z\");\n\n        let date_time = DateTime::from_fractional_secs(1576540098, 0.52);\n        assert_eq!(format!(\"{date_time}\"), \"2019-12-16T23:48:18.52Z\");\n\n        let date_time = DateTime::from_secs(1699942527);\n        assert_eq!(format!(\"{date_time}\"), \"2023-11-14T06:15:27Z\");\n\n        let date_time = DateTime::from_secs(16995123);\n        assert_eq!(format!(\"{date_time}\"), \"1970-07-16T16:52:03Z\");\n    }\n\n    #[test]\n    fn test_debug_date_time() {\n        let date_time = DateTime::from_secs(1576540098);\n        assert_eq!(format!(\"{date_time:?}\"), \"2019-12-16T23:48:18Z\");\n\n        let date_time = DateTime::from_fractional_secs(1576540098, 0.52);\n        assert_eq!(format!(\"{date_time:?}\"), \"2019-12-16T23:48:18.52Z\");\n\n        let date_time = DateTime::from_secs(1699942527);\n        assert_eq!(format!(\"{date_time:?}\"), \"2023-11-14T06:15:27Z\");\n\n        let date_time = DateTime::from_secs(16995123);\n        assert_eq!(format!(\"{date_time:?}\"), \"1970-07-16T16:52:03Z\");\n    }\n\n    #[test]\n    fn test_fmt() {\n        let date_time = DateTime::from_secs(1576540098);\n        assert_eq!(\n            date_time.fmt(Format::DateTime).unwrap(),\n            \"2019-12-16T23:48:18Z\"\n        );\n        assert_eq!(date_time.fmt(Format::EpochSeconds).unwrap(), \"1576540098\");\n        assert_eq!(\n            date_time.fmt(Format::HttpDate).unwrap(),\n            \"Mon, 16 Dec 2019 23:48:18 GMT\"\n        );\n\n        let date_time = DateTime::from_fractional_secs(1576540098, 0.52);\n        assert_eq!(\n            date_time.fmt(Format::DateTime).unwrap(),\n            \"2019-12-16T23:48:18.52Z\"\n        );\n        assert_eq!(\n            date_time.fmt(Format::EpochSeconds).unwrap(),\n            \"1576540098.52\"\n        );\n        assert_eq!(\n            date_time.fmt(Format::HttpDate).unwrap(),\n            \"Mon, 16 Dec 2019 23:48:18 GMT\"\n        );\n    }\n\n    #[test]\n    fn test_fmt_zero_seconds() {\n        let date_time = DateTime::from_secs(1576540080);\n        assert_eq!(\n            date_time.fmt(Format::DateTime).unwrap(),\n            \"2019-12-16T23:48:00Z\"\n        );\n        assert_eq!(date_time.fmt(Format::EpochSeconds).unwrap(), \"1576540080\");\n        assert_eq!(\n            date_time.fmt(Format::HttpDate).unwrap(),\n            \"Mon, 16 Dec 2019 23:48:00 GMT\"\n        );\n    }\n\n    #[test]\n    fn test_read_single_http_date() {\n        let s = \"Mon, 16 Dec 2019 23:48:18 GMT\";\n        let (_, next) = DateTime::read(s, Format::HttpDate, ',').expect(\"valid\");\n        assert_eq!(next, \"\");\n    }\n\n    #[test]\n    fn test_read_single_float() {\n        let s = \"1576540098.52\";\n        let (_, next) = DateTime::read(s, Format::EpochSeconds, ',').expect(\"valid\");\n        assert_eq!(next, \"\");\n    }\n\n    #[test]\n    fn test_read_many_float() {\n        let s = \"1576540098.52,1576540098.53\";\n        let (_, next) = DateTime::read(s, Format::EpochSeconds, ',').expect(\"valid\");\n        assert_eq!(next, \"1576540098.53\");\n    }\n\n    #[test]\n    fn test_ready_many_http_date() {\n        let s = \"Mon, 16 Dec 2019 23:48:18 GMT,Tue, 17 Dec 2019 23:48:18 GMT\";\n        let (_, next) = DateTime::read(s, Format::HttpDate, ',').expect(\"valid\");\n        assert_eq!(next, \"Tue, 17 Dec 2019 23:48:18 GMT\");\n    }\n\n    #[derive(Debug)]\n    struct EpochMillisTestCase {\n        _rfc3339: &'static str,\n        epoch_millis: i64,\n        epoch_seconds: i64,\n        epoch_subsec_nanos: u32,\n    }\n\n    // These test case values were generated from the following Kotlin JVM code:\n    // ```kotlin\n    // val date_time = DateTime.ofEpochMilli(<epoch milli value>);\n    // println(DateTimeFormatter.ISO_DATE_TIME.format(date_time.atOffset(ZoneOffset.UTC)))\n    // println(date_time.epochSecond)\n    // println(date_time.nano)\n    // ```\n    const EPOCH_MILLIS_TEST_CASES: &[EpochMillisTestCase] = &[\n        EpochMillisTestCase {\n            _rfc3339: \"2021-07-30T21:20:04.123Z\",\n            epoch_millis: 1627680004123,\n            epoch_seconds: 1627680004,\n            epoch_subsec_nanos: 123000000,\n        },\n        EpochMillisTestCase {\n            _rfc3339: \"1918-06-04T02:39:55.877Z\",\n            epoch_millis: -1627680004123,\n            epoch_seconds: -1627680005,\n            epoch_subsec_nanos: 877000000,\n        },\n        EpochMillisTestCase {\n            _rfc3339: \"+292278994-08-17T07:12:55.807Z\",\n            epoch_millis: i64::MAX,\n            epoch_seconds: 9223372036854775,\n            epoch_subsec_nanos: 807000000,\n        },\n        EpochMillisTestCase {\n            _rfc3339: \"-292275055-05-16T16:47:04.192Z\",\n            epoch_millis: i64::MIN,\n            epoch_seconds: -9223372036854776,\n            epoch_subsec_nanos: 192000000,\n        },\n    ];\n\n    #[test]\n    fn to_millis() {\n        for test_case in EPOCH_MILLIS_TEST_CASES {\n            println!(\"Test case: {test_case:?}\");\n            let date_time = DateTime::from_secs_and_nanos(\n                test_case.epoch_seconds,\n                test_case.epoch_subsec_nanos,\n            );\n            assert_eq!(test_case.epoch_seconds, date_time.secs());\n            assert_eq!(test_case.epoch_subsec_nanos, date_time.subsec_nanos());\n            assert_eq!(test_case.epoch_millis, date_time.to_millis().unwrap());\n        }\n\n        assert!(DateTime::from_secs_and_nanos(i64::MAX, 0)\n            .to_millis()\n            .is_err());\n    }\n\n    #[test]\n    fn from_millis() {\n        for test_case in EPOCH_MILLIS_TEST_CASES {\n            println!(\"Test case: {test_case:?}\");\n            let date_time = DateTime::from_millis(test_case.epoch_millis);\n            assert_eq!(test_case.epoch_seconds, date_time.secs());\n            assert_eq!(test_case.epoch_subsec_nanos, date_time.subsec_nanos());\n        }\n    }\n\n    #[test]\n    fn to_from_millis_round_trip() {\n        for millis in &[0, 1627680004123, -1627680004123, i64::MAX, i64::MIN] {\n            assert_eq!(*millis, DateTime::from_millis(*millis).to_millis().unwrap());\n        }\n    }\n\n    #[test]\n    fn as_nanos() {\n        assert_eq!(\n            -9_223_372_036_854_775_807_000_000_001_i128,\n            DateTime::from_secs_and_nanos(i64::MIN, 999_999_999).as_nanos()\n        );\n        assert_eq!(\n            -10_876_543_211,\n            DateTime::from_secs_and_nanos(-11, 123_456_789).as_nanos()\n        );\n        assert_eq!(0, DateTime::from_secs_and_nanos(0, 0).as_nanos());\n        assert_eq!(\n            11_123_456_789,\n            DateTime::from_secs_and_nanos(11, 123_456_789).as_nanos()\n        );\n        assert_eq!(\n            9_223_372_036_854_775_807_999_999_999_i128,\n            DateTime::from_secs_and_nanos(i64::MAX, 999_999_999).as_nanos()\n        );\n    }\n\n    #[test]\n    fn from_nanos() {\n        assert_eq!(\n            DateTime::from_secs_and_nanos(i64::MIN, 999_999_999),\n            DateTime::from_nanos(-9_223_372_036_854_775_807_000_000_001_i128).unwrap(),\n        );\n        assert_eq!(\n            DateTime::from_secs_and_nanos(-11, 123_456_789),\n            DateTime::from_nanos(-10_876_543_211).unwrap(),\n        );\n        assert_eq!(\n            DateTime::from_secs_and_nanos(0, 0),\n            DateTime::from_nanos(0).unwrap(),\n        );\n        assert_eq!(\n            DateTime::from_secs_and_nanos(11, 123_456_789),\n            DateTime::from_nanos(11_123_456_789).unwrap(),\n        );\n        assert_eq!(\n            DateTime::from_secs_and_nanos(i64::MAX, 999_999_999),\n            DateTime::from_nanos(9_223_372_036_854_775_807_999_999_999_i128).unwrap(),\n        );\n        assert!(DateTime::from_nanos(-10_000_000_000_000_000_000_999_999_999_i128).is_err());\n        assert!(DateTime::from_nanos(10_000_000_000_000_000_000_999_999_999_i128).is_err());\n    }\n\n    // TODO(https://github.com/smithy-lang/smithy-rs/issues/1857)\n    #[cfg(not(any(target_arch = \"powerpc\", target_arch = \"x86\")))]\n    #[test]\n    fn system_time_conversions() {\n        // Check agreement\n        let date_time = DateTime::from_str(\"1000-01-02T01:23:10.123Z\", Format::DateTime).unwrap();\n        let off_date_time = OffsetDateTime::parse(\"1000-01-02T01:23:10.123Z\", &Rfc3339).unwrap();\n        assert_eq!(\n            SystemTime::from(off_date_time),\n            SystemTime::try_from(date_time).unwrap()\n        );\n\n        let date_time = DateTime::from_str(\"2039-10-31T23:23:10.456Z\", Format::DateTime).unwrap();\n        let off_date_time = OffsetDateTime::parse(\"2039-10-31T23:23:10.456Z\", &Rfc3339).unwrap();\n        assert_eq!(\n            SystemTime::from(off_date_time),\n            SystemTime::try_from(date_time).unwrap()\n        );\n    }\n\n    #[test]\n    fn formatting_of_early_dates() {\n        let date: DateTime =\n            DateTime::from_str(\"Mon, 16 Dec -019 23:48:18 GMT\", Format::HttpDate).unwrap();\n        assert_eq!(format!(\"{date}\"), \"-62736509502\");\n    }\n\n    #[test]\n    fn ord() {\n        let first = DateTime::from_secs_and_nanos(-1, 0);\n        let second = DateTime::from_secs_and_nanos(-1, 1);\n        let third = DateTime::from_secs_and_nanos(0, 0);\n        let fourth = DateTime::from_secs_and_nanos(0, 1);\n        let fifth = DateTime::from_secs_and_nanos(1, 0);\n\n        assert!(first == first);\n        assert!(first < second);\n        assert!(first < third);\n        assert!(first < fourth);\n        assert!(first < fifth);\n\n        assert!(second > first);\n        assert!(second == second);\n        assert!(second < third);\n        assert!(second < fourth);\n        assert!(second < fifth);\n\n        assert!(third > first);\n        assert!(third > second);\n        assert!(third == third);\n        assert!(third < fourth);\n        assert!(third < fifth);\n\n        assert!(fourth > first);\n        assert!(fourth > second);\n        assert!(fourth > third);\n        assert!(fourth == fourth);\n        assert!(fourth < fifth);\n\n        assert!(fifth > first);\n        assert!(fifth > second);\n        assert!(fifth > third);\n        assert!(fifth > fourth);\n        assert!(fifth == fifth);\n    }\n\n    /// https://github.com/smithy-lang/smithy-rs/issues/3805\n    #[test]\n    fn panic_in_fromsecs_f64() {\n        assert_eq!(DateTime::from_secs_f64(-1.0), DateTime::from_secs(-1));\n\n        assert_eq!(\n            DateTime::from_secs_f64(-1.95877825437922e-309),\n            DateTime::from_secs(0)\n        );\n    }\n\n    const MIN_RFC_3339_MILLIS: i64 = -62135596800000;\n    const MAX_RFC_3339_MILLIS: i64 = 253402300799999;\n\n    // This test uses milliseconds, because `Format::DateTime` does not support nanoseconds.\n    proptest! {\n        #[test]\n        fn ord_proptest(\n            left_millis in MIN_RFC_3339_MILLIS..MAX_RFC_3339_MILLIS,\n            right_millis in MIN_RFC_3339_MILLIS..MAX_RFC_3339_MILLIS,\n        ) {\n            let left = DateTime::from_millis(left_millis);\n            let right = DateTime::from_millis(right_millis);\n\n            let left_str = left.fmt(Format::DateTime).unwrap();\n            let right_str = right.fmt(Format::DateTime).unwrap();\n\n            assert_eq!(left.cmp(&right), left_str.cmp(&right_str));\n        }\n    }\n\n    proptest! {\n        #[test]\n        fn from_secs_f64_proptest(secs: f64) {\n            let _date = DateTime::from_secs_f64(secs);\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-types/src/date_time/ser.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse super::*;\nuse serde::ser::SerializeTuple;\n\nimpl serde::Serialize for DateTime {\n    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: serde::Serializer,\n    {\n        if serializer.is_human_readable() {\n            match self.fmt(Format::DateTime) {\n                Ok(val) => serializer.serialize_str(&val),\n                Err(e) => Err(serde::ser::Error::custom(e)),\n            }\n        } else {\n            let mut tup_ser = serializer.serialize_tuple(2)?;\n            tup_ser.serialize_element(&self.seconds)?;\n            tup_ser.serialize_element(&self.subsecond_nanos)?;\n            tup_ser.end()\n        }\n    }\n}\n\n#[cfg(test)]\nmod test {\n    use super::*;\n\n    /// check for human redable format\n    #[test]\n    fn ser_human_readable_datetime() {\n        use serde::{Deserialize, Serialize};\n\n        let datetime = DateTime::from_secs(1576540098);\n        #[derive(Serialize, Deserialize, PartialEq)]\n        struct Test {\n            datetime: DateTime,\n        }\n        let datetime_json = r#\"{\"datetime\":\"2019-12-16T23:48:18Z\"}\"#;\n        assert!(serde_json::to_string(&Test { datetime }).ok() == Some(datetime_json.to_string()));\n    }\n\n    /// check for non-human redable format\n    #[test]\n    fn ser_not_human_readable_datetime() {\n        {\n            let cbor = ciborium::value::Value::Array(vec![\n                ciborium::value::Value::Integer(1576540098i64.into()),\n                ciborium::value::Value::Integer(0u32.into()),\n            ]);\n            let mut buf = vec![];\n            let mut buf2 = vec![];\n            let _ = ciborium::ser::into_writer(&cbor, &mut buf);\n            let _ = ciborium::ser::into_writer(&cbor, &mut buf2);\n            assert_eq!(buf, buf2);\n        };\n\n        {\n            let cbor = ciborium::value::Value::Array(vec![\n                ciborium::value::Value::Integer(0i64.into()),\n                ciborium::value::Value::Integer(0u32.into()),\n            ]);\n            let mut buf = vec![];\n            let mut buf2 = vec![];\n            let _ = ciborium::ser::into_writer(&cbor, &mut buf);\n            let _ = ciborium::ser::into_writer(&cbor, &mut buf2);\n            assert_eq!(buf, buf2);\n        };\n\n        {\n            let cbor = ciborium::value::Value::Array(vec![\n                ciborium::value::Value::Integer(i64::MAX.into()),\n                ciborium::value::Value::Integer(u32::MAX.into()),\n            ]);\n            let mut buf = vec![];\n            let mut buf2 = vec![];\n            let _ = ciborium::ser::into_writer(&cbor, &mut buf);\n            let _ = ciborium::ser::into_writer(&cbor, &mut buf2);\n            assert_eq!(buf, buf2);\n        };\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-types/src/document.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::Number;\nuse std::borrow::Cow;\nuse std::collections::HashMap;\n\n#[cfg(any(\n    all(aws_sdk_unstable, feature = \"serde-deserialize\"),\n    all(aws_sdk_unstable, feature = \"serde-serialize\")\n))]\nuse serde;\n\n/* ANCHOR: document */\n\n/// Document Type\n///\n/// Document types represents protocol-agnostic open content that is accessed like JSON data.\n/// Open content is useful for modeling unstructured data that has no schema, data that can't be\n/// modeled using rigid types, or data that has a schema that evolves outside of the purview of a model.\n/// The serialization format of a document is an implementation detail of a protocol.\n#[derive(Clone, Debug, PartialEq)]\n#[cfg_attr(\n    all(aws_sdk_unstable, feature = \"serde-serialize\"),\n    derive(serde::Serialize)\n)]\n#[cfg_attr(\n    all(aws_sdk_unstable, feature = \"serde-deserialize\"),\n    derive(serde::Deserialize)\n)]\n#[cfg_attr(\n    any(\n        all(aws_sdk_unstable, feature = \"serde-deserialize\"),\n        all(aws_sdk_unstable, feature = \"serde-serialize\")\n    ),\n    serde(untagged)\n)]\npub enum Document {\n    /// JSON object\n    Object(HashMap<String, Document>),\n    /// JSON array\n    Array(Vec<Document>),\n    /// JSON number\n    Number(Number),\n    /// JSON string\n    String(String),\n    /// JSON boolean\n    Bool(bool),\n    /// JSON null\n    Null,\n}\n\nimpl Document {\n    /// Returns the inner map value if this `Document` is an object.\n    pub fn as_object(&self) -> Option<&HashMap<String, Document>> {\n        if let Self::Object(object) = self {\n            Some(object)\n        } else {\n            None\n        }\n    }\n\n    /// Returns the mutable inner map value if this `Document` is an object.\n    pub fn as_object_mut(&mut self) -> Option<&mut HashMap<String, Document>> {\n        if let Self::Object(object) = self {\n            Some(object)\n        } else {\n            None\n        }\n    }\n\n    /// Returns the inner array value if this `Document` is an array.\n    pub fn as_array(&self) -> Option<&Vec<Document>> {\n        if let Self::Array(array) = self {\n            Some(array)\n        } else {\n            None\n        }\n    }\n\n    /// Returns the mutable inner array value if this `Document` is an array.\n    pub fn as_array_mut(&mut self) -> Option<&mut Vec<Document>> {\n        if let Self::Array(array) = self {\n            Some(array)\n        } else {\n            None\n        }\n    }\n\n    /// Returns the inner number value if this `Document` is a number.\n    pub fn as_number(&self) -> Option<&Number> {\n        if let Self::Number(number) = self {\n            Some(number)\n        } else {\n            None\n        }\n    }\n\n    /// Returns the inner string value if this `Document` is a string.\n    pub fn as_string(&self) -> Option<&str> {\n        if let Self::String(string) = self {\n            Some(string)\n        } else {\n            None\n        }\n    }\n\n    /// Returns the inner boolean value if this `Document` is a boolean.\n    pub fn as_bool(&self) -> Option<bool> {\n        if let Self::Bool(boolean) = self {\n            Some(*boolean)\n        } else {\n            None\n        }\n    }\n\n    /// Returns `Some(())` if this `Document` is a null.\n    pub fn as_null(&self) -> Option<()> {\n        if let Self::Null = self {\n            Some(())\n        } else {\n            None\n        }\n    }\n\n    /// Returns `true` if this `Document` is an object.\n    pub fn is_object(&self) -> bool {\n        matches!(self, Self::Object(_))\n    }\n\n    /// Returns `true` if this `Document` is an array.\n    pub fn is_array(&self) -> bool {\n        matches!(self, Self::Array(_))\n    }\n\n    /// Returns `true` if this `Document` is a number.\n    pub fn is_number(&self) -> bool {\n        matches!(self, Self::Number(_))\n    }\n\n    /// Returns `true` if this `Document` is a string.\n    pub fn is_string(&self) -> bool {\n        matches!(self, Self::String(_))\n    }\n\n    /// Returns `true` if this `Document` is a bool.\n    pub fn is_bool(&self) -> bool {\n        matches!(self, Self::Bool(_))\n    }\n\n    /// Returns `true` if this `Document` is a boolean.\n    pub fn is_null(&self) -> bool {\n        matches!(self, Self::Null)\n    }\n}\n\n/// The default value is `Document::Null`.\nimpl Default for Document {\n    fn default() -> Self {\n        Self::Null\n    }\n}\n\nimpl From<bool> for Document {\n    fn from(value: bool) -> Self {\n        Document::Bool(value)\n    }\n}\n\nimpl<'a> From<&'a str> for Document {\n    fn from(value: &'a str) -> Self {\n        Document::String(value.to_string())\n    }\n}\n\nimpl<'a> From<Cow<'a, str>> for Document {\n    fn from(value: Cow<'a, str>) -> Self {\n        Document::String(value.into_owned())\n    }\n}\n\nimpl From<String> for Document {\n    fn from(value: String) -> Self {\n        Document::String(value)\n    }\n}\n\nimpl From<Vec<Document>> for Document {\n    fn from(values: Vec<Document>) -> Self {\n        Document::Array(values)\n    }\n}\n\nimpl From<HashMap<String, Document>> for Document {\n    fn from(values: HashMap<String, Document>) -> Self {\n        Document::Object(values)\n    }\n}\n\nimpl From<u64> for Document {\n    fn from(value: u64) -> Self {\n        Document::Number(Number::PosInt(value))\n    }\n}\n\nimpl From<i64> for Document {\n    fn from(value: i64) -> Self {\n        Document::Number(Number::NegInt(value))\n    }\n}\n\nimpl From<i32> for Document {\n    fn from(value: i32) -> Self {\n        Document::Number(Number::NegInt(value as i64))\n    }\n}\n\nimpl From<f64> for Document {\n    fn from(value: f64) -> Self {\n        Document::Number(Number::Float(value))\n    }\n}\n\nimpl From<Number> for Document {\n    fn from(value: Number) -> Self {\n        Document::Number(value)\n    }\n}\n\nimpl<T> From<Option<T>> for Document\nwhere\n    Document: From<T>,\n{\n    fn from(value: Option<T>) -> Self {\n        match value {\n            Some(inner) => inner.into(),\n            None => Document::Null,\n        }\n    }\n}\n\n/* ANCHOR END: document */\n\n#[cfg(test)]\nmod test {\n    /// checks if a) serialization of json suceeds and b) it is compatible with serde_json\n    #[test]\n    #[cfg(all(\n        aws_sdk_unstable,\n        feature = \"serde-serialize\",\n        feature = \"serde-deserialize\"\n    ))]\n    fn serialize_json() {\n        use crate::Document;\n        use crate::Number;\n        use std::collections::HashMap;\n        let mut map: HashMap<String, Document> = HashMap::new();\n        // string\n        map.insert(\"hello\".into(), \"world\".to_string().into());\n        // numbers\n        map.insert(\"pos_int\".into(), Document::Number(Number::PosInt(1).into()));\n        map.insert(\n            \"neg_int\".into(),\n            Document::Number(Number::NegInt(-1).into()),\n        );\n        map.insert(\n            \"float\".into(),\n            Document::Number(Number::Float(0.1 + 0.2).into()),\n        );\n        // booleans\n        map.insert(\"true\".into(), true.into());\n        map.insert(\"false\".into(), false.into());\n        // check if array with different datatypes would succeed\n        map.insert(\n            \"array\".into(),\n            vec![\n                map.clone().into(),\n                \"hello-world\".to_string().into(),\n                true.into(),\n                false.into(),\n            ]\n            .into(),\n        );\n        // map\n        map.insert(\"map\".into(), map.clone().into());\n        // null\n        map.insert(\"null\".into(), Document::Null);\n        let obj = Document::Object(map);\n        // comparing string isnt going to work since there is no gurantee for the ordering of the keys\n        let target_file = include_str!(\"../test_data/serialize_document.json\");\n        let json: Result<serde_json::Value, _> = serde_json::from_str(target_file);\n        // serializer\n        assert_eq!(serde_json::to_value(&obj).unwrap(), json.unwrap());\n        let doc: Result<Document, _> = serde_json::from_str(target_file);\n        assert_eq!(obj, doc.unwrap());\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-types/src/endpoint.rs",
    "content": "/*\n *  Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n *  SPDX-License-Identifier: Apache-2.0\n */\n//! Smithy Endpoint Types\n\nuse crate::config_bag::{Storable, StoreReplace};\nuse crate::Document;\nuse std::borrow::Cow;\nuse std::collections::HashMap;\n\ntype MaybeStatic = Cow<'static, str>;\n\n/* ANCHOR: endpoint */\n/// Smithy Endpoint Type\n///\n/// Generally, this type should not be used from user code\n#[derive(Debug, Clone, PartialEq)]\npub struct Endpoint {\n    url: MaybeStatic,\n    headers: HashMap<MaybeStatic, Vec<MaybeStatic>>,\n    properties: HashMap<MaybeStatic, Document>,\n}\n\n/* ANCHOR_END: endpoint */\n\n#[allow(unused)]\nimpl Endpoint {\n    /// Returns the URL of this endpoint\n    pub fn url(&self) -> &str {\n        &self.url\n    }\n\n    /// Returns the headers associated with this endpoint\n    pub fn headers(&self) -> impl Iterator<Item = (&str, impl Iterator<Item = &str>)> {\n        self.headers\n            .iter()\n            .map(|(k, v)| (k.as_ref(), v.iter().map(|v| v.as_ref())))\n    }\n\n    /// Returns the properties associated with this endpoint\n    pub fn properties(&self) -> &HashMap<Cow<'static, str>, Document> {\n        &self.properties\n    }\n\n    /// Converts this endpoint back into a [`Builder`]\n    pub fn into_builder(self) -> Builder {\n        Builder { endpoint: self }\n    }\n\n    /// A builder for [`Endpoint`]\n    pub fn builder() -> Builder {\n        Builder::new()\n    }\n}\n\nimpl Storable for Endpoint {\n    type Storer = StoreReplace<Self>;\n}\n\n#[derive(Debug, Clone)]\n/// Builder for [`Endpoint`]\npub struct Builder {\n    endpoint: Endpoint,\n}\n\n#[allow(unused)]\nimpl Builder {\n    pub(crate) fn new() -> Self {\n        Self {\n            endpoint: Endpoint {\n                url: Default::default(),\n                headers: HashMap::new(),\n                properties: HashMap::new(),\n            },\n        }\n    }\n\n    /// Set the URL of the Endpoint\n    ///\n    /// # Examples\n    /// ```rust\n    /// use aws_smithy_types::endpoint::Endpoint;\n    /// let endpoint = Endpoint::builder().url(\"https://www.example.com\").build();\n    /// ```\n    pub fn url(mut self, url: impl Into<MaybeStatic>) -> Self {\n        self.endpoint.url = url.into();\n        self\n    }\n\n    /// Adds a header to the endpoint\n    ///\n    /// If there is already a header for this key, this header will be appended to that key\n    ///\n    /// # Examples\n    /// ```rust\n    /// use aws_smithy_types::endpoint::Endpoint;\n    /// let endpoint = Endpoint::builder().url(\"https://www.example.com\").header(\"x-my-header\", \"hello\").build();\n    /// ```\n    pub fn header(mut self, name: impl Into<MaybeStatic>, value: impl Into<MaybeStatic>) -> Self {\n        self.endpoint\n            .headers\n            .entry(name.into())\n            .or_default()\n            .push(value.into());\n        self\n    }\n\n    /// Adds a property to the endpoint\n    ///\n    /// If there is already a property for this key, the existing property will be overwritten\n    ///\n    /// # Examples\n    /// ```rust\n    /// use aws_smithy_types::endpoint::Endpoint;\n    /// let endpoint = Endpoint::builder()\n    ///   .url(\"https://www.example.com\")\n    ///   .property(\"x-my-header\", true)\n    ///   .build();\n    /// ```\n    pub fn property(mut self, key: impl Into<MaybeStatic>, value: impl Into<Document>) -> Self {\n        self.endpoint.properties.insert(key.into(), value.into());\n        self\n    }\n\n    /// Constructs an [`Endpoint`] from this builder\n    ///\n    /// # Panics\n    /// Panics if URL is unset or empty\n    pub fn build(self) -> Endpoint {\n        assert_ne!(self.endpoint.url(), \"\", \"URL was unset\");\n        self.endpoint\n    }\n}\n\n#[cfg(test)]\nmod test {\n    use crate::endpoint::Endpoint;\n    use crate::Document;\n    use std::borrow::Cow;\n    use std::collections::HashMap;\n\n    #[test]\n    fn endpoint_builder() {\n        let endpoint = Endpoint::builder()\n            .url(\"https://www.amazon.com\")\n            .header(\"x-amz-test\", \"header-value\")\n            .property(\"custom\", Document::Bool(true))\n            .build();\n        assert_eq!(endpoint.url, Cow::Borrowed(\"https://www.amazon.com\"));\n        assert_eq!(\n            endpoint.headers,\n            HashMap::from([(\n                Cow::Borrowed(\"x-amz-test\"),\n                vec![Cow::Borrowed(\"header-value\")]\n            )])\n        );\n        assert_eq!(\n            endpoint.properties,\n            HashMap::from([(Cow::Borrowed(\"custom\"), Document::Bool(true))])\n        );\n\n        assert_eq!(endpoint.url(), \"https://www.amazon.com\");\n        assert_eq!(\n            endpoint\n                .headers()\n                .map(|(k, v)| (k, v.collect::<Vec<_>>()))\n                .collect::<Vec<_>>(),\n            vec![(\"x-amz-test\", vec![\"header-value\"])]\n        );\n    }\n\n    #[test]\n    fn borrowed_values() {\n        fn foo(a: &str) {\n            // borrowed values without a static lifetime need to be converted into owned values\n            let endpoint = Endpoint::builder().url(a.to_string()).build();\n            assert_eq!(endpoint.url(), a);\n        }\n\n        foo(\"asdf\");\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-types/src/error/display.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Error wrapper that displays error context\n\nuse std::error::Error;\nuse std::fmt;\n\n/// Provides a `Display` impl for an `Error` that outputs the full error context\n///\n/// This utility follows the error cause/source chain and displays every error message\n/// in the chain separated by \": \". At the end of the chain, it outputs a debug view\n/// of the entire error chain.\n///\n/// # Example\n///\n/// ```no_run\n/// # let err: &dyn std::error::Error = unimplemented!();\n/// # use aws_smithy_types::error::display::DisplayErrorContext;\n/// println!(\"There was an unhandled error: {}\", DisplayErrorContext(&err));\n/// ```\n///\n// Internally in the SDK, this is useful for emitting errors with `tracing` in cases\n// where the error is not returned back to the customer.\n#[derive(Debug)]\npub struct DisplayErrorContext<E: Error>(\n    /// The error to display full context for\n    pub E,\n);\n\nimpl<E: Error> fmt::Display for DisplayErrorContext<E> {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        write_err(f, &self.0)?;\n        // Also add a debug version of the error at the end\n        write!(f, \" ({:?})\", self.0)\n    }\n}\n\nfn write_err(f: &mut fmt::Formatter<'_>, err: &dyn Error) -> fmt::Result {\n    write!(f, \"{err}\")?;\n    if let Some(source) = err.source() {\n        write!(f, \": \")?;\n        write_err(f, source)?;\n    }\n    Ok(())\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use std::error::Error;\n    use std::fmt;\n\n    #[derive(Debug)]\n    struct TestError {\n        what: &'static str,\n        source: Option<Box<dyn Error>>,\n    }\n\n    impl fmt::Display for TestError {\n        fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n            write!(f, \"{}\", self.what)\n        }\n    }\n\n    impl Error for TestError {\n        fn source(&self) -> Option<&(dyn Error + 'static)> {\n            self.source.as_deref()\n        }\n    }\n\n    #[test]\n    fn no_sources() {\n        assert_eq!(\n            \"test (TestError { what: \\\"test\\\", source: None })\",\n            format!(\n                \"{}\",\n                DisplayErrorContext(TestError {\n                    what: \"test\",\n                    source: None\n                })\n            )\n        );\n    }\n\n    #[test]\n    fn sources() {\n        assert_eq!(\n            \"foo: bar: baz (TestError { what: \\\"foo\\\", source: Some(TestError { what: \\\"bar\\\", source: Some(TestError { what: \\\"baz\\\", source: None }) }) })\",\n            format!(\n                \"{}\",\n                DisplayErrorContext(TestError {\n                    what: \"foo\",\n                    source: Some(Box::new(TestError {\n                        what: \"bar\",\n                        source: Some(Box::new(TestError {\n                            what: \"baz\",\n                            source: None\n                        }))\n                    }) as Box<_>)\n                })\n            )\n        );\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-types/src/error/metadata.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Error metadata\n\nuse crate::retry::{ErrorKind, ProvideErrorKind};\nuse std::collections::HashMap;\nuse std::fmt;\n\n/// Trait to retrieve error metadata from a result\npub trait ProvideErrorMetadata {\n    /// Returns error metadata, which includes the error code, message,\n    /// request ID, and potentially additional information.\n    fn meta(&self) -> &ErrorMetadata;\n\n    /// Returns the error code if it's available.\n    fn code(&self) -> Option<&str> {\n        self.meta().code()\n    }\n\n    /// Returns the error message, if there is one.\n    fn message(&self) -> Option<&str> {\n        self.meta().message()\n    }\n}\n\n/// Empty error metadata\npub const EMPTY_ERROR_METADATA: ErrorMetadata = ErrorMetadata {\n    code: None,\n    message: None,\n    extras: None,\n};\n\n/// Generic Error type\n///\n/// For many services, Errors are modeled. However, many services only partially model errors or don't\n/// model errors at all. In these cases, the SDK will return this generic error type to expose the\n/// `code`, `message` and `request_id`.\n#[derive(Debug, Eq, PartialEq, Default, Clone)]\npub struct ErrorMetadata {\n    code: Option<String>,\n    message: Option<String>,\n    extras: Option<HashMap<&'static str, String>>,\n}\n\nimpl ProvideErrorMetadata for ErrorMetadata {\n    fn meta(&self) -> &ErrorMetadata {\n        self\n    }\n}\n\n/// Builder for [`ErrorMetadata`].\n#[derive(Debug, Default)]\npub struct Builder {\n    inner: ErrorMetadata,\n}\n\nimpl Builder {\n    /// Sets the error message.\n    pub fn message(mut self, message: impl Into<String>) -> Self {\n        self.inner.message = Some(message.into());\n        self\n    }\n\n    /// Sets the error code.\n    pub fn code(mut self, code: impl Into<String>) -> Self {\n        self.inner.code = Some(code.into());\n        self\n    }\n\n    /// Set a custom field on the error metadata\n    ///\n    /// Typically, these will be accessed with an extension trait:\n    /// ```rust\n    /// use aws_smithy_types::error::ErrorMetadata;\n    /// const HOST_ID: &str = \"host_id\";\n    /// trait S3ErrorExt {\n    ///     fn extended_request_id(&self) -> Option<&str>;\n    /// }\n    ///\n    /// impl S3ErrorExt for ErrorMetadata {\n    ///     fn extended_request_id(&self) -> Option<&str> {\n    ///         self.extra(HOST_ID)\n    ///     }\n    /// }\n    ///\n    /// fn main() {\n    ///     // Extension trait must be brought into scope\n    ///     use S3ErrorExt;\n    ///     let sdk_response: Result<(), ErrorMetadata> = Err(ErrorMetadata::builder().custom(HOST_ID, \"x-1234\").build());\n    ///     if let Err(err) = sdk_response {\n    ///         println!(\"extended request id: {:?}\", err.extended_request_id());\n    ///     }\n    /// }\n    /// ```\n    pub fn custom(mut self, key: &'static str, value: impl Into<String>) -> Self {\n        if self.inner.extras.is_none() {\n            self.inner.extras = Some(HashMap::new());\n        }\n        self.inner\n            .extras\n            .as_mut()\n            .unwrap()\n            .insert(key, value.into());\n        self\n    }\n\n    /// Creates the error.\n    pub fn build(self) -> ErrorMetadata {\n        self.inner\n    }\n}\n\nimpl ErrorMetadata {\n    /// Returns the error code.\n    pub fn code(&self) -> Option<&str> {\n        self.code.as_deref()\n    }\n    /// Returns the error message.\n    pub fn message(&self) -> Option<&str> {\n        self.message.as_deref()\n    }\n    /// Returns additional information about the error if it's present.\n    pub fn extra(&self, key: &'static str) -> Option<&str> {\n        self.extras\n            .as_ref()\n            .and_then(|extras| extras.get(key).map(|k| k.as_str()))\n    }\n\n    /// Creates an `Error` builder.\n    pub fn builder() -> Builder {\n        Builder::default()\n    }\n\n    /// Converts an `Error` into a builder.\n    pub fn into_builder(self) -> Builder {\n        Builder { inner: self }\n    }\n}\n\nimpl ProvideErrorKind for ErrorMetadata {\n    fn retryable_error_kind(&self) -> Option<ErrorKind> {\n        None\n    }\n\n    fn code(&self) -> Option<&str> {\n        ErrorMetadata::code(self)\n    }\n}\n\nimpl fmt::Display for ErrorMetadata {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        let mut fmt = f.debug_struct(\"Error\");\n        if let Some(code) = &self.code {\n            fmt.field(\"code\", code);\n        }\n        if let Some(message) = &self.message {\n            fmt.field(\"message\", message);\n        }\n        if let Some(extras) = &self.extras {\n            for (k, v) in extras {\n                fmt.field(k, &v);\n            }\n        }\n        fmt.finish()\n    }\n}\n\nimpl std::error::Error for ErrorMetadata {}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-types/src/error/operation.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Errors for operations\n\nuse crate::date_time::DateTimeFormatError;\nuse std::error::Error;\nuse std::fmt::{Display, Formatter};\n\n#[derive(Debug)]\nenum SerializationErrorKind {\n    CannotSerializeUnknownVariant { union: &'static str },\n    DateTimeFormatError { cause: DateTimeFormatError },\n}\n\n/// An error that occurs when serialization of an operation fails.\n#[derive(Debug)]\npub struct SerializationError {\n    kind: SerializationErrorKind,\n}\n\nimpl SerializationError {\n    /// An error that occurs when serialization of an operation fails for an unknown reason.\n    pub fn unknown_variant(union: &'static str) -> Self {\n        Self {\n            kind: SerializationErrorKind::CannotSerializeUnknownVariant { union },\n        }\n    }\n}\n\nimpl Display for SerializationError {\n    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {\n        match self.kind {\n            SerializationErrorKind::CannotSerializeUnknownVariant { union } => write!(\n                f,\n                \"Cannot serialize `{union}::Unknown`. Unknown union variants cannot be serialized. \\\n                This can occur when round-tripping a response from the server that was not \\\n                recognized by the SDK. Consider upgrading to the latest version of the SDK.\",\n            ),\n            SerializationErrorKind::DateTimeFormatError { .. } => {\n                write!(f, \"failed to serialize timestamp\")\n            }\n        }\n    }\n}\n\nimpl Error for SerializationError {\n    fn source(&self) -> Option<&(dyn Error + 'static)> {\n        match &self.kind {\n            SerializationErrorKind::CannotSerializeUnknownVariant { .. } => None,\n            SerializationErrorKind::DateTimeFormatError { cause } => Some(cause as _),\n        }\n    }\n}\n\nimpl From<DateTimeFormatError> for SerializationError {\n    fn from(err: DateTimeFormatError) -> SerializationError {\n        Self {\n            kind: SerializationErrorKind::DateTimeFormatError { cause: err },\n        }\n    }\n}\n\n#[derive(Debug)]\nenum BuildErrorKind {\n    /// A field contained an invalid value\n    InvalidField {\n        field: &'static str,\n        details: String,\n    },\n    /// A field was missing\n    MissingField {\n        field: &'static str,\n        details: &'static str,\n    },\n    /// The serializer could not serialize the input\n    SerializationError(SerializationError),\n\n    /// An error occurred request construction\n    Other(Box<dyn Error + Send + Sync + 'static>),\n}\n\n/// An error occurred attempting to build an `Operation` from an input\n///\n/// These are almost always due to user error caused by limitations of specific fields due to\n/// protocol serialization (e.g. fields that can only be a subset ASCII because they are serialized\n/// as the name of an HTTP header)\n#[derive(Debug)]\npub struct BuildError {\n    kind: BuildErrorKind,\n}\n\nimpl BuildError {\n    /// Construct a build error for a missing field\n    pub fn missing_field(field: &'static str, details: &'static str) -> Self {\n        Self {\n            kind: BuildErrorKind::MissingField { field, details },\n        }\n    }\n\n    /// Construct a build error for an invalid field\n    pub fn invalid_field(field: &'static str, details: impl Into<String>) -> Self {\n        Self {\n            kind: BuildErrorKind::InvalidField {\n                field,\n                details: details.into(),\n            },\n        }\n    }\n\n    /// Construct a build error from another underlying error\n    pub fn other(source: impl Into<Box<dyn Error + Send + Sync + 'static>>) -> Self {\n        Self {\n            kind: BuildErrorKind::Other(source.into()),\n        }\n    }\n}\n\nimpl From<SerializationError> for BuildError {\n    fn from(err: SerializationError) -> Self {\n        Self {\n            kind: BuildErrorKind::SerializationError(err),\n        }\n    }\n}\n\nimpl From<DateTimeFormatError> for BuildError {\n    fn from(err: DateTimeFormatError) -> Self {\n        Self::from(SerializationError::from(err))\n    }\n}\n\nimpl Display for BuildError {\n    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {\n        match &self.kind {\n            BuildErrorKind::InvalidField { field, details } => {\n                write!(f, \"invalid field in input: {field} (details: {details})\")\n            }\n            BuildErrorKind::MissingField { field, details } => {\n                write!(f, \"{field} was missing: {details}\")\n            }\n            BuildErrorKind::SerializationError(_) => {\n                write!(f, \"failed to serialize input\")\n            }\n            BuildErrorKind::Other(_) => {\n                write!(f, \"error during request construction\")\n            }\n        }\n    }\n}\n\nimpl Error for BuildError {\n    fn source(&self) -> Option<&(dyn Error + 'static)> {\n        match &self.kind {\n            BuildErrorKind::SerializationError(source) => Some(source as _),\n            BuildErrorKind::Other(source) => Some(source.as_ref()),\n            BuildErrorKind::InvalidField { .. } | BuildErrorKind::MissingField { .. } => None,\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-types/src/error.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Errors for Smithy codegen\n\nuse std::fmt;\n\npub mod display;\npub mod metadata;\npub mod operation;\n\npub use metadata::ErrorMetadata;\n\n#[derive(Debug)]\npub(super) enum TryFromNumberErrorKind {\n    /// Used when the conversion from an integer type into a smaller integer type would be lossy.\n    OutsideIntegerRange(std::num::TryFromIntError),\n    /// Used when the conversion from an `u64` into a floating point type would be lossy.\n    U64ToFloatLossyConversion(u64),\n    /// Used when the conversion from an `i64` into a floating point type would be lossy.\n    I64ToFloatLossyConversion(i64),\n    /// Used when attempting to convert an `f64` into an `f32`.\n    F64ToF32LossyConversion(f64),\n    /// Used when attempting to convert a decimal, infinite, or `NaN` floating point type into an\n    /// integer type.\n    FloatToIntegerLossyConversion(f64),\n    /// Used when attempting to convert a negative [`Number`](crate::Number) into an unsigned integer type.\n    NegativeToUnsignedLossyConversion(i64),\n}\n\n/// The error type returned when conversion into an integer type or floating point type is lossy.\n#[derive(Debug)]\npub struct TryFromNumberError {\n    pub(super) kind: TryFromNumberErrorKind,\n}\n\nimpl fmt::Display for TryFromNumberError {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        use TryFromNumberErrorKind::*;\n        match self.kind {\n            OutsideIntegerRange(_) => write!(f, \"integer too large\"),\n            FloatToIntegerLossyConversion(v) => write!(\n                f,\n                \"cannot convert floating point number {v} into an integer\"\n            ),\n            NegativeToUnsignedLossyConversion(v) => write!(\n                f,\n                \"cannot convert negative integer {v} into an unsigned integer type\"\n            ),\n            U64ToFloatLossyConversion(v) => {\n                write!(\n                    f,\n                    \"cannot convert {v}u64 into a floating point type without precision loss\"\n                )\n            }\n            I64ToFloatLossyConversion(v) => {\n                write!(\n                    f,\n                    \"cannot convert {v}i64 into a floating point type without precision loss\"\n                )\n            }\n            F64ToF32LossyConversion(v) => {\n                write!(f, \"will not attempt to convert {v}f64 into a f32\")\n            }\n        }\n    }\n}\n\nimpl std::error::Error for TryFromNumberError {\n    fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {\n        use TryFromNumberErrorKind::*;\n        match &self.kind {\n            OutsideIntegerRange(err) => Some(err as _),\n            FloatToIntegerLossyConversion(_)\n            | NegativeToUnsignedLossyConversion(_)\n            | U64ToFloatLossyConversion(_)\n            | I64ToFloatLossyConversion(_)\n            | F64ToF32LossyConversion(_) => None,\n        }\n    }\n}\n\nimpl From<std::num::TryFromIntError> for TryFromNumberError {\n    fn from(value: std::num::TryFromIntError) -> Self {\n        Self {\n            kind: TryFromNumberErrorKind::OutsideIntegerRange(value),\n        }\n    }\n}\n\nimpl From<TryFromNumberErrorKind> for TryFromNumberError {\n    fn from(kind: TryFromNumberErrorKind) -> Self {\n        Self { kind }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-types/src/event_stream.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Types relevant to event stream serialization/deserialization\n\nuse crate::str_bytes::StrBytes;\nuse bytes::Bytes;\n\nmod value {\n    use crate::str_bytes::StrBytes;\n    use crate::DateTime;\n    use bytes::Bytes;\n\n    /// Event Stream frame header value.\n    #[non_exhaustive]\n    #[derive(Clone, Debug, PartialEq)]\n    pub enum HeaderValue {\n        /// Represents a boolean value.\n        Bool(bool),\n        /// Represents a byte value.\n        Byte(i8),\n        /// Represents an int16 value.\n        Int16(i16),\n        /// Represents an int32 value.\n        Int32(i32),\n        /// Represents an int64 value.\n        Int64(i64),\n        /// Represents a byte array value.\n        ByteArray(Bytes),\n        /// Represents a string value.\n        String(StrBytes),\n        /// Represents a timestamp value.\n        Timestamp(DateTime),\n        /// Represents a uuid value.\n        Uuid(u128),\n    }\n\n    impl HeaderValue {\n        /// If the `HeaderValue` is a `Bool`, returns the associated `bool`. Returns `Err` otherwise.\n        pub fn as_bool(&self) -> Result<bool, &Self> {\n            match self {\n                HeaderValue::Bool(value) => Ok(*value),\n                _ => Err(self),\n            }\n        }\n\n        /// If the `HeaderValue` is a `Byte`, returns the associated `i8`. Returns `Err` otherwise.\n        pub fn as_byte(&self) -> Result<i8, &Self> {\n            match self {\n                HeaderValue::Byte(value) => Ok(*value),\n                _ => Err(self),\n            }\n        }\n\n        /// If the `HeaderValue` is an `Int16`, returns the associated `i16`. Returns `Err` otherwise.\n        pub fn as_int16(&self) -> Result<i16, &Self> {\n            match self {\n                HeaderValue::Int16(value) => Ok(*value),\n                _ => Err(self),\n            }\n        }\n\n        /// If the `HeaderValue` is an `Int32`, returns the associated `i32`. Returns `Err` otherwise.\n        pub fn as_int32(&self) -> Result<i32, &Self> {\n            match self {\n                HeaderValue::Int32(value) => Ok(*value),\n                _ => Err(self),\n            }\n        }\n\n        /// If the `HeaderValue` is an `Int64`, returns the associated `i64`. Returns `Err` otherwise.\n        pub fn as_int64(&self) -> Result<i64, &Self> {\n            match self {\n                HeaderValue::Int64(value) => Ok(*value),\n                _ => Err(self),\n            }\n        }\n\n        /// If the `HeaderValue` is a `ByteArray`, returns the associated [`Bytes`]. Returns `Err` otherwise.\n        pub fn as_byte_array(&self) -> Result<&Bytes, &Self> {\n            match self {\n                HeaderValue::ByteArray(value) => Ok(value),\n                _ => Err(self),\n            }\n        }\n\n        /// If the `HeaderValue` is a `String`, returns the associated [`StrBytes`]. Returns `Err` otherwise.\n        pub fn as_string(&self) -> Result<&StrBytes, &Self> {\n            match self {\n                HeaderValue::String(value) => Ok(value),\n                _ => Err(self),\n            }\n        }\n\n        /// If the `HeaderValue` is a `Timestamp`, returns the associated [`DateTime`]. Returns `Err` otherwise.\n        pub fn as_timestamp(&self) -> Result<DateTime, &Self> {\n            match self {\n                HeaderValue::Timestamp(value) => Ok(*value),\n                _ => Err(self),\n            }\n        }\n\n        /// If the `HeaderValue` is a `Uuid`, returns the associated `u128`. Returns `Err` otherwise.\n        pub fn as_uuid(&self) -> Result<u128, &Self> {\n            match self {\n                HeaderValue::Uuid(value) => Ok(*value),\n                _ => Err(self),\n            }\n        }\n    }\n}\n\npub use value::HeaderValue;\n\n/// Event Stream header.\n#[non_exhaustive]\n#[derive(Clone, Debug, PartialEq)]\npub struct Header {\n    name: StrBytes,\n    value: HeaderValue,\n}\n\nimpl Header {\n    /// Creates a new header with the given `name` and `value`.\n    pub fn new(name: impl Into<StrBytes>, value: impl Into<HeaderValue>) -> Header {\n        Header {\n            name: name.into(),\n            value: value.into(),\n        }\n    }\n\n    /// Returns the header name.\n    pub fn name(&self) -> &StrBytes {\n        &self.name\n    }\n\n    /// Returns the header value.\n    pub fn value(&self) -> &HeaderValue {\n        &self.value\n    }\n}\n\n/// Event Stream message.\n#[non_exhaustive]\n#[derive(Clone, Debug, PartialEq)]\npub struct Message {\n    headers: Vec<Header>,\n    payload: Bytes,\n}\n\nimpl Message {\n    /// Creates a new message with the given `payload`. Headers can be added later.\n    pub fn new(payload: impl Into<Bytes>) -> Message {\n        Message {\n            headers: Vec::new(),\n            payload: payload.into(),\n        }\n    }\n\n    /// Creates a message with the given `headers` and `payload`.\n    pub fn new_from_parts(headers: Vec<Header>, payload: impl Into<Bytes>) -> Self {\n        Self {\n            headers,\n            payload: payload.into(),\n        }\n    }\n\n    /// Adds a header to the message.\n    pub fn add_header(mut self, header: Header) -> Self {\n        self.headers.push(header);\n        self\n    }\n\n    /// Returns all headers.\n    pub fn headers(&self) -> &[Header] {\n        &self.headers\n    }\n\n    /// Returns the payload bytes.\n    pub fn payload(&self) -> &Bytes {\n        &self.payload\n    }\n}\n\n/// Raw message from an event stream receiver when a response error is encountered.\n#[derive(Debug)]\n#[non_exhaustive]\npub enum RawMessage {\n    /// Message was decoded into a valid frame, but failed to unmarshall into a modeled type.\n    Decoded(Message),\n    /// Message failed to be decoded into a valid frame. The raw bytes may not be available in the\n    /// case where decoding consumed the buffer.\n    Invalid(Option<Bytes>),\n}\n\nimpl RawMessage {\n    /// Creates a `RawMessage` for failure to decode a message into a valid frame.\n    pub fn invalid(bytes: Option<Bytes>) -> Self {\n        Self::Invalid(bytes)\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-types/src/lib.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/* Automatically managed default lints */\n#![cfg_attr(docsrs, feature(doc_cfg))]\n/* End of automatically managed default lints */\n//! Protocol-agnostic types for smithy-rs.\n\n#![allow(clippy::derive_partial_eq_without_eq)]\n#![warn(\n    missing_docs,\n    rustdoc::missing_crate_level_docs,\n    missing_debug_implementations,\n    rust_2018_idioms,\n    unreachable_pub\n)]\n\npub mod base64;\npub mod big_number;\npub mod body;\npub mod byte_stream;\npub mod checksum_config;\n/// A typemap for storing configuration.\npub mod config_bag;\npub mod date_time;\npub mod endpoint;\npub mod error;\npub mod event_stream;\npub mod primitive;\npub mod retry;\npub mod timeout;\n\n/// Utilities for type erasure.\npub mod type_erasure;\n\nmod blob;\nmod document;\nmod number;\npub mod str_bytes;\n\npub use big_number::{BigDecimal, BigInteger};\npub use blob::Blob;\npub use date_time::DateTime;\npub use document::Document;\npub use number::Number;\n"
  },
  {
    "path": "rust-runtime/aws-smithy-types/src/number.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! A number type that implements Javascript / JSON semantics.\n\nuse crate::error::{TryFromNumberError, TryFromNumberErrorKind};\n#[cfg(all(\n    aws_sdk_unstable,\n    any(feature = \"serde-serialize\", feature = \"serde-deserialize\")\n))]\nuse serde;\n\n/// A number type that implements Javascript / JSON semantics, modeled on serde_json:\n/// <https://docs.serde.rs/src/serde_json/number.rs.html#20-22>\n#[derive(Debug, Clone, Copy, PartialEq)]\n#[cfg_attr(\n    all(aws_sdk_unstable, feature = \"serde-deserialize\"),\n    derive(serde::Deserialize)\n)]\n#[cfg_attr(\n    all(aws_sdk_unstable, feature = \"serde-serialize\"),\n    derive(serde::Serialize)\n)]\n#[cfg_attr(\n    any(\n        all(aws_sdk_unstable, feature = \"serde-deserialize\"),\n        all(aws_sdk_unstable, feature = \"serde-serialize\")\n    ),\n    serde(untagged)\n)]\npub enum Number {\n    /// Unsigned 64-bit integer value.\n    PosInt(u64),\n    /// Signed 64-bit integer value. The wrapped value is _always_ negative.\n    NegInt(i64),\n    /// 64-bit floating-point value.\n    Float(f64),\n}\n\n/* ANCHOR_END: document */\n\nimpl Number {\n    /// Converts to an `f64` lossily.\n    /// Use `Number::try_from` to make the conversion only if it is not lossy.\n    pub fn to_f64_lossy(self) -> f64 {\n        match self {\n            Number::PosInt(v) => v as f64,\n            Number::NegInt(v) => v as f64,\n            Number::Float(v) => v,\n        }\n    }\n\n    /// Converts to an `f32` lossily.\n    /// Use `Number::try_from` to make the conversion only if it is not lossy.\n    pub fn to_f32_lossy(self) -> f32 {\n        match self {\n            Number::PosInt(v) => v as f32,\n            Number::NegInt(v) => v as f32,\n            Number::Float(v) => v as f32,\n        }\n    }\n}\n\nmacro_rules! to_unsigned_integer_converter {\n    ($typ:ident, $styp:expr) => {\n        #[doc = \"Converts to a `\"]\n        #[doc = $styp]\n        #[doc = \"`. This conversion fails if it is lossy.\"]\n        impl TryFrom<Number> for $typ {\n            type Error = TryFromNumberError;\n\n            fn try_from(value: Number) -> Result<Self, Self::Error> {\n                match value {\n                    Number::PosInt(v) => Ok(Self::try_from(v)?),\n                    Number::NegInt(v) => {\n                        Err(TryFromNumberErrorKind::NegativeToUnsignedLossyConversion(v).into())\n                    }\n                    Number::Float(v) => attempt_lossless!(v, $typ),\n                }\n            }\n        }\n    };\n\n    ($typ:ident) => {\n        to_unsigned_integer_converter!($typ, stringify!($typ));\n    };\n}\n\nmacro_rules! to_signed_integer_converter {\n    ($typ:ident, $styp:expr) => {\n        #[doc = \"Converts to a `\"]\n        #[doc = $styp]\n        #[doc = \"`. This conversion fails if it is lossy.\"]\n        impl TryFrom<Number> for $typ {\n            type Error = TryFromNumberError;\n\n            fn try_from(value: Number) -> Result<Self, Self::Error> {\n                match value {\n                    Number::PosInt(v) => Ok(Self::try_from(v)?),\n                    Number::NegInt(v) => Ok(Self::try_from(v)?),\n                    Number::Float(v) => attempt_lossless!(v, $typ),\n                }\n            }\n        }\n    };\n\n    ($typ:ident) => {\n        to_signed_integer_converter!($typ, stringify!($typ));\n    };\n}\n\nmacro_rules! attempt_lossless {\n    ($value: expr, $typ: ty) => {{\n        let converted = $value as $typ;\n        if (converted as f64 == $value) {\n            Ok(converted)\n        } else {\n            Err(TryFromNumberErrorKind::FloatToIntegerLossyConversion($value).into())\n        }\n    }};\n}\n\n/// Converts to a `u64`. The conversion fails if it is lossy.\nimpl TryFrom<Number> for u64 {\n    type Error = TryFromNumberError;\n\n    fn try_from(value: Number) -> Result<Self, Self::Error> {\n        match value {\n            Number::PosInt(v) => Ok(v),\n            Number::NegInt(v) => {\n                Err(TryFromNumberErrorKind::NegativeToUnsignedLossyConversion(v).into())\n            }\n            Number::Float(v) => attempt_lossless!(v, u64),\n        }\n    }\n}\nto_unsigned_integer_converter!(u32);\nto_unsigned_integer_converter!(u16);\nto_unsigned_integer_converter!(u8);\n\nimpl TryFrom<Number> for i64 {\n    type Error = TryFromNumberError;\n\n    fn try_from(value: Number) -> Result<Self, Self::Error> {\n        match value {\n            Number::PosInt(v) => Ok(Self::try_from(v)?),\n            Number::NegInt(v) => Ok(v),\n            Number::Float(v) => attempt_lossless!(v, i64),\n        }\n    }\n}\nto_signed_integer_converter!(i32);\nto_signed_integer_converter!(i16);\nto_signed_integer_converter!(i8);\n\n/// Converts to an `f64`. The conversion fails if it is lossy.\nimpl TryFrom<Number> for f64 {\n    type Error = TryFromNumberError;\n\n    fn try_from(value: Number) -> Result<Self, Self::Error> {\n        match value {\n            // Integers can only be represented with full precision in a float if they fit in the\n            // significand, which is 24 bits in `f32` and 53 bits in `f64`.\n            // https://github.com/rust-lang/rust/blob/58f11791af4f97572e7afd83f11cffe04bbbd12f/library/core/src/convert/num.rs#L151-L153\n            Number::PosInt(v) => {\n                if v <= (1 << 53) {\n                    Ok(v as Self)\n                } else {\n                    Err(TryFromNumberErrorKind::U64ToFloatLossyConversion(v).into())\n                }\n            }\n            Number::NegInt(v) => {\n                if (-(1 << 53)..=(1 << 53)).contains(&v) {\n                    Ok(v as Self)\n                } else {\n                    Err(TryFromNumberErrorKind::I64ToFloatLossyConversion(v).into())\n                }\n            }\n            Number::Float(v) => Ok(v),\n        }\n    }\n}\n\n/// Converts to an `f64`. The conversion fails if it is lossy.\nimpl TryFrom<Number> for f32 {\n    type Error = TryFromNumberError;\n\n    fn try_from(value: Number) -> Result<Self, Self::Error> {\n        match value {\n            Number::PosInt(v) => {\n                if v <= (1 << 24) {\n                    Ok(v as Self)\n                } else {\n                    Err(TryFromNumberErrorKind::U64ToFloatLossyConversion(v).into())\n                }\n            }\n            Number::NegInt(v) => {\n                if (-(1 << 24)..=(1 << 24)).contains(&v) {\n                    Ok(v as Self)\n                } else {\n                    Err(TryFromNumberErrorKind::I64ToFloatLossyConversion(v).into())\n                }\n            }\n            Number::Float(v) => Err(TryFromNumberErrorKind::F64ToF32LossyConversion(v).into()),\n        }\n    }\n}\n\n#[cfg(test)]\nmod test {\n    use super::Number;\n    use crate::error::{TryFromNumberError, TryFromNumberErrorKind};\n\n    macro_rules! to_unsigned_converter_tests {\n        ($typ:ident) => {\n            assert_eq!($typ::try_from(Number::PosInt(69u64)).unwrap(), 69);\n\n            assert!(matches!(\n                $typ::try_from(Number::PosInt(($typ::MAX as u64) + 1u64)).unwrap_err(),\n                TryFromNumberError {\n                    kind: TryFromNumberErrorKind::OutsideIntegerRange(..)\n                }\n            ));\n\n            assert!(matches!(\n                $typ::try_from(Number::NegInt(-1i64)).unwrap_err(),\n                TryFromNumberError {\n                    kind: TryFromNumberErrorKind::NegativeToUnsignedLossyConversion(..)\n                }\n            ));\n\n            for val in [69.69f64, f64::NAN, f64::INFINITY, f64::NEG_INFINITY] {\n                assert!(matches!(\n                    $typ::try_from(Number::Float(val)).unwrap_err(),\n                    TryFromNumberError {\n                        kind: TryFromNumberErrorKind::FloatToIntegerLossyConversion(..)\n                    }\n                ));\n            }\n            assert_eq!($typ::try_from(Number::Float(25.0)).unwrap(), 25);\n        };\n    }\n\n    #[test]\n    fn to_u64() {\n        assert_eq!(u64::try_from(Number::PosInt(69u64)).unwrap(), 69u64);\n\n        assert!(matches!(\n            u64::try_from(Number::NegInt(-1i64)).unwrap_err(),\n            TryFromNumberError {\n                kind: TryFromNumberErrorKind::NegativeToUnsignedLossyConversion(..)\n            }\n        ));\n\n        for val in [69.69f64, f64::NAN, f64::INFINITY, f64::NEG_INFINITY] {\n            assert!(matches!(\n                u64::try_from(Number::Float(val)).unwrap_err(),\n                TryFromNumberError {\n                    kind: TryFromNumberErrorKind::FloatToIntegerLossyConversion(..)\n                }\n            ));\n        }\n    }\n\n    #[test]\n    fn to_u32() {\n        to_unsigned_converter_tests!(u32);\n    }\n\n    #[test]\n    fn to_u16() {\n        to_unsigned_converter_tests!(u16);\n    }\n\n    #[test]\n    fn to_u8() {\n        to_unsigned_converter_tests!(u8);\n    }\n\n    macro_rules! to_signed_converter_tests {\n        ($typ:ident) => {\n            assert_eq!($typ::try_from(Number::PosInt(69u64)).unwrap(), 69);\n            assert_eq!($typ::try_from(Number::NegInt(-69i64)).unwrap(), -69);\n\n            assert!(matches!(\n                $typ::try_from(Number::PosInt(($typ::MAX as u64) + 1u64)).unwrap_err(),\n                TryFromNumberError {\n                    kind: TryFromNumberErrorKind::OutsideIntegerRange(..)\n                }\n            ));\n\n            assert!(matches!(\n                $typ::try_from(Number::NegInt(($typ::MIN as i64) - 1i64)).unwrap_err(),\n                TryFromNumberError {\n                    kind: TryFromNumberErrorKind::OutsideIntegerRange(..)\n                }\n            ));\n\n            for val in [69.69f64, f64::NAN, f64::INFINITY, f64::NEG_INFINITY] {\n                assert!(matches!(\n                    u64::try_from(Number::Float(val)).unwrap_err(),\n                    TryFromNumberError {\n                        kind: TryFromNumberErrorKind::FloatToIntegerLossyConversion(..)\n                    }\n                ));\n            }\n\n            let range = || ($typ::MIN..=$typ::MAX);\n\n            for val in range().take(1024).chain(range().rev().take(1024)) {\n                assert_eq!(val, $typ::try_from(Number::Float(val as f64)).unwrap());\n                $typ::try_from(Number::Float((val as f64) + 0.1)).expect_err(\"not equivalent\");\n            }\n        };\n    }\n\n    #[test]\n    fn to_i64() {\n        assert_eq!(i64::try_from(Number::PosInt(69u64)).unwrap(), 69);\n        assert_eq!(i64::try_from(Number::NegInt(-69i64)).unwrap(), -69);\n\n        for val in [69.69f64, f64::NAN, f64::INFINITY, f64::NEG_INFINITY] {\n            assert!(matches!(\n                u64::try_from(Number::Float(val)).unwrap_err(),\n                TryFromNumberError {\n                    kind: TryFromNumberErrorKind::FloatToIntegerLossyConversion(..)\n                }\n            ));\n        }\n        let range = || i64::MIN..=i64::MAX;\n\n        for val in range().take(1024).chain(range().rev().take(1024)) {\n            // if we can actually represent the value\n            if ((val as f64) as i64) == val {\n                assert_eq!(val, i64::try_from(Number::Float(val as f64)).unwrap());\n            }\n            let fval = val as f64;\n            // at the limits of the range, we don't have this precision\n            if (fval + 0.1).fract() != 0.0 {\n                i64::try_from(Number::Float((val as f64) + 0.1)).expect_err(\"not equivalent\");\n            }\n        }\n    }\n\n    #[test]\n    fn to_i32() {\n        to_signed_converter_tests!(i32);\n    }\n\n    #[test]\n    fn to_i16() {\n        to_signed_converter_tests!(i16);\n    }\n\n    #[test]\n    fn to_i8() {\n        to_signed_converter_tests!(i8);\n        i8::try_from(Number::Float(-3200000.0)).expect_err(\"overflow\");\n        i8::try_from(Number::Float(32.1)).expect_err(\"imprecise\");\n        i8::try_from(Number::Float(i8::MAX as f64 + 0.1)).expect_err(\"imprecise\");\n        i8::try_from(Number::Float(f64::NAN)).expect_err(\"nan\");\n        i8::try_from(Number::Float(f64::INFINITY)).expect_err(\"nan\");\n    }\n\n    #[test]\n    fn to_f64() {\n        assert_eq!(f64::try_from(Number::PosInt(69u64)).unwrap(), 69f64);\n        assert_eq!(f64::try_from(Number::NegInt(-69i64)).unwrap(), -69f64);\n        assert_eq!(f64::try_from(Number::Float(-69f64)).unwrap(), -69f64);\n        assert!(f64::try_from(Number::Float(f64::NAN)).unwrap().is_nan());\n        assert_eq!(\n            f64::try_from(Number::Float(f64::INFINITY)).unwrap(),\n            f64::INFINITY\n        );\n        assert_eq!(\n            f64::try_from(Number::Float(f64::NEG_INFINITY)).unwrap(),\n            f64::NEG_INFINITY\n        );\n\n        let significand_max_u64: u64 = 1 << 53;\n        let significand_max_i64: i64 = 1 << 53;\n\n        assert_eq!(\n            f64::try_from(Number::PosInt(significand_max_u64)).unwrap(),\n            9007199254740992f64\n        );\n\n        assert_eq!(\n            f64::try_from(Number::NegInt(significand_max_i64)).unwrap(),\n            9007199254740992f64\n        );\n        assert_eq!(\n            f64::try_from(Number::NegInt(-significand_max_i64)).unwrap(),\n            -9007199254740992f64\n        );\n\n        assert!(matches!(\n            f64::try_from(Number::PosInt(significand_max_u64 + 1)).unwrap_err(),\n            TryFromNumberError {\n                kind: TryFromNumberErrorKind::U64ToFloatLossyConversion(..)\n            }\n        ));\n\n        assert!(matches!(\n            f64::try_from(Number::NegInt(significand_max_i64 + 1)).unwrap_err(),\n            TryFromNumberError {\n                kind: TryFromNumberErrorKind::I64ToFloatLossyConversion(..)\n            }\n        ));\n        assert!(matches!(\n            f64::try_from(Number::NegInt(-significand_max_i64 - 1)).unwrap_err(),\n            TryFromNumberError {\n                kind: TryFromNumberErrorKind::I64ToFloatLossyConversion(..)\n            }\n        ));\n    }\n\n    #[test]\n    fn to_f32() {\n        assert_eq!(f32::try_from(Number::PosInt(69u64)).unwrap(), 69f32);\n        assert_eq!(f32::try_from(Number::NegInt(-69i64)).unwrap(), -69f32);\n\n        let significand_max_u64: u64 = 1 << 24;\n        let significand_max_i64: i64 = 1 << 24;\n\n        assert_eq!(\n            f32::try_from(Number::PosInt(significand_max_u64)).unwrap(),\n            16777216f32\n        );\n\n        assert_eq!(\n            f32::try_from(Number::NegInt(significand_max_i64)).unwrap(),\n            16777216f32\n        );\n        assert_eq!(\n            f32::try_from(Number::NegInt(-significand_max_i64)).unwrap(),\n            -16777216f32\n        );\n\n        assert!(matches!(\n            f32::try_from(Number::PosInt(significand_max_u64 + 1)).unwrap_err(),\n            TryFromNumberError {\n                kind: TryFromNumberErrorKind::U64ToFloatLossyConversion(..)\n            }\n        ));\n\n        assert!(matches!(\n            f32::try_from(Number::NegInt(significand_max_i64 + 1)).unwrap_err(),\n            TryFromNumberError {\n                kind: TryFromNumberErrorKind::I64ToFloatLossyConversion(..)\n            }\n        ));\n        assert!(matches!(\n            f32::try_from(Number::NegInt(-significand_max_i64 - 1)).unwrap_err(),\n            TryFromNumberError {\n                kind: TryFromNumberErrorKind::I64ToFloatLossyConversion(..)\n            }\n        ));\n\n        for val in [69f64, f64::NAN, f64::INFINITY, f64::NEG_INFINITY] {\n            assert!(matches!(\n                f32::try_from(Number::Float(val)).unwrap_err(),\n                TryFromNumberError {\n                    kind: TryFromNumberErrorKind::F64ToF32LossyConversion(..)\n                }\n            ));\n        }\n    }\n\n    #[test]\n    fn to_f64_lossy() {\n        assert_eq!(Number::PosInt(69u64).to_f64_lossy(), 69f64);\n        assert_eq!(\n            Number::PosInt((1 << 53) + 1).to_f64_lossy(),\n            9007199254740992f64\n        );\n        assert_eq!(\n            Number::NegInt(-(1 << 53) - 1).to_f64_lossy(),\n            -9007199254740992f64\n        );\n    }\n\n    #[test]\n    fn to_f32_lossy() {\n        assert_eq!(Number::PosInt(69u64).to_f32_lossy(), 69f32);\n        assert_eq!(Number::PosInt((1 << 24) + 1).to_f32_lossy(), 16777216f32);\n        assert_eq!(Number::NegInt(-(1 << 24) - 1).to_f32_lossy(), -16777216f32);\n        assert_eq!(\n            Number::Float(1452089033.7674935).to_f32_lossy(),\n            1452089100f32\n        );\n    }\n\n    #[test]\n    #[cfg(all(\n        test,\n        aws_sdk_unstable,\n        feature = \"serde-deserialize\",\n        feature = \"serde-serialize\"\n    ))]\n    /// ensures that numbers are deserialized as expected\n    /// 0 <= PosInt\n    /// 0 > NegInt\n    /// non integer values == Float\n    fn number_serde() {\n        let n: Number = serde_json::from_str(\"1.1\").unwrap();\n        assert_eq!(n, Number::Float(1.1));\n        let n: Number = serde_json::from_str(\"1\").unwrap();\n        assert_eq!(n, Number::PosInt(1));\n        let n: Number = serde_json::from_str(\"0\").unwrap();\n        assert_eq!(n, Number::PosInt(0));\n        let n: Number = serde_json::from_str(\"-1\").unwrap();\n        assert_eq!(n, Number::NegInt(-1));\n\n        assert_eq!(\"1.1\", serde_json::to_string(&Number::Float(1.1)).unwrap());\n        assert_eq!(\"1\", serde_json::to_string(&Number::PosInt(1)).unwrap());\n        assert_eq!(\"0\", serde_json::to_string(&Number::PosInt(0)).unwrap());\n        assert_eq!(\"-1\", serde_json::to_string(&Number::NegInt(-1)).unwrap());\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-types/src/primitive.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Utilities for formatting and parsing primitives\n//!\n//! Smithy protocols have specific behavior for serializing\n//! & deserializing floats, specifically:\n//! - NaN should be serialized as `NaN`\n//! - Positive infinity should be serialized as `Infinity`\n//! - Negative infinity should be serialized as `-Infinity`\n//!\n//! This module defines the [`Parse`] trait which\n//! enables parsing primitive values (numbers & booleans) that follow\n//! these rules and [`Encoder`], a struct that enables\n//! allocation-free serialization.\n//!\n//! # Examples\n//! ## Parsing\n//! ```rust\n//! use aws_smithy_types::primitive::Parse;\n//! let parsed = f64::parse_smithy_primitive(\"123.4\").expect(\"valid float\");\n//! ```\n//!\n//! ## Encoding\n//! ```\n//! use aws_smithy_types::primitive::Encoder;\n//! assert_eq!(\"123.4\", Encoder::from(123.4).encode());\n//! assert_eq!(\"Infinity\", Encoder::from(f64::INFINITY).encode());\n//! assert_eq!(\"true\", Encoder::from(true).encode());\n//! ```\nuse crate::primitive::private::Sealed;\nuse std::error::Error;\nuse std::fmt;\nuse std::str::FromStr;\n\n/// An error during primitive parsing\n#[non_exhaustive]\n#[derive(Debug)]\npub struct PrimitiveParseError(&'static str);\n\nimpl fmt::Display for PrimitiveParseError {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        write!(f, \"failed to parse input as {}\", self.0)\n    }\n}\nimpl Error for PrimitiveParseError {}\n\n/// Sealed trait for custom parsing of primitive types\npub trait Parse: Sealed {\n    /// Parses a Smithy primitive from a string.\n    fn parse_smithy_primitive(input: &str) -> Result<Self, PrimitiveParseError>\n    where\n        Self: Sized;\n}\n\nmod private {\n    pub trait Sealed {}\n    impl Sealed for i8 {}\n    impl Sealed for i16 {}\n    impl Sealed for i32 {}\n    impl Sealed for i64 {}\n    impl Sealed for f32 {}\n    impl Sealed for f64 {}\n    impl Sealed for u64 {}\n    impl Sealed for bool {}\n}\n\nmacro_rules! parse_from_str {\n    ($t: ty) => {\n        impl Parse for $t {\n            fn parse_smithy_primitive(input: &str) -> Result<Self, PrimitiveParseError> {\n                FromStr::from_str(input).map_err(|_| PrimitiveParseError(stringify!($t)))\n            }\n        }\n    };\n}\n\nparse_from_str!(bool);\nparse_from_str!(i8);\nparse_from_str!(i16);\nparse_from_str!(i32);\nparse_from_str!(i64);\n\nimpl Parse for f32 {\n    fn parse_smithy_primitive(input: &str) -> Result<Self, PrimitiveParseError> {\n        float::parse_f32(input).map_err(|_| PrimitiveParseError(\"f32\"))\n    }\n}\n\nimpl Parse for f64 {\n    fn parse_smithy_primitive(input: &str) -> Result<Self, PrimitiveParseError> {\n        float::parse_f64(input).map_err(|_| PrimitiveParseError(\"f64\"))\n    }\n}\n\nenum Inner {\n    /// Boolean\n    Bool(bool),\n    /// 8-bit signed integer\n    I8(i8, itoa::Buffer),\n    /// 16-bit signed integer\n    I16(i16, itoa::Buffer),\n    /// 32-bit signed integer\n    I32(i32, itoa::Buffer),\n    /// 64-bit signed integer\n    I64(i64, itoa::Buffer),\n    /// 64-bit unsigned integer\n    U64(u64, itoa::Buffer),\n    /// 32-bit IEEE 754 single-precision floating-point number\n    F32(f32, ryu::Buffer),\n    /// 64-bit IEEE 754 double-precision floating-point number\n    F64(f64, ryu::Buffer),\n}\n\nimpl fmt::Debug for Inner {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        match self {\n            Self::Bool(v) => write!(f, \"Bool({v})\"),\n            Self::I8(v, _) => write!(f, \"I8({v})\"),\n            Self::I16(v, _) => write!(f, \"I16({v})\"),\n            Self::I32(v, _) => write!(f, \"I32({v})\"),\n            Self::I64(v, _) => write!(f, \"I64({v})\"),\n            Self::U64(v, _) => write!(f, \"U64({v})\"),\n            Self::F32(v, _) => write!(f, \"F32({v})\"),\n            Self::F64(v, _) => write!(f, \"F64({v})\"),\n        }\n    }\n}\n\n/// Primitive Type Encoder\n///\n/// Encodes primitive types in Smithy's specified format. For floating-point numbers,\n/// Smithy requires that NaN and Infinity values be specially encoded.\n///\n/// This type implements `From<T>` for all Smithy primitive types.\n#[non_exhaustive]\n#[derive(Debug)]\npub struct Encoder(Inner);\n\nimpl Encoder {\n    /// Encodes a Smithy primitive as a string.\n    pub fn encode(&mut self) -> &str {\n        match &mut self.0 {\n            Inner::Bool(true) => \"true\",\n            Inner::Bool(false) => \"false\",\n            Inner::I8(v, buf) => buf.format(*v),\n            Inner::I16(v, buf) => buf.format(*v),\n            Inner::I32(v, buf) => buf.format(*v),\n            Inner::I64(v, buf) => buf.format(*v),\n            Inner::U64(v, buf) => buf.format(*v),\n            Inner::F32(v, buf) => {\n                if v.is_nan() {\n                    float::NAN\n                } else if *v == f32::INFINITY {\n                    float::INFINITY\n                } else if *v == f32::NEG_INFINITY {\n                    float::NEG_INFINITY\n                } else {\n                    buf.format_finite(*v)\n                }\n            }\n            Inner::F64(v, buf) => {\n                if v.is_nan() {\n                    float::NAN\n                } else if *v == f64::INFINITY {\n                    float::INFINITY\n                } else if *v == f64::NEG_INFINITY {\n                    float::NEG_INFINITY\n                } else {\n                    buf.format_finite(*v)\n                }\n            }\n        }\n    }\n}\n\nimpl From<bool> for Encoder {\n    fn from(input: bool) -> Self {\n        Self(Inner::Bool(input))\n    }\n}\n\nimpl From<i8> for Encoder {\n    fn from(input: i8) -> Self {\n        Self(Inner::I8(input, itoa::Buffer::new()))\n    }\n}\n\nimpl From<i16> for Encoder {\n    fn from(input: i16) -> Self {\n        Self(Inner::I16(input, itoa::Buffer::new()))\n    }\n}\n\nimpl From<i32> for Encoder {\n    fn from(input: i32) -> Self {\n        Self(Inner::I32(input, itoa::Buffer::new()))\n    }\n}\n\nimpl From<i64> for Encoder {\n    fn from(input: i64) -> Self {\n        Self(Inner::I64(input, itoa::Buffer::new()))\n    }\n}\n\nimpl From<u64> for Encoder {\n    fn from(input: u64) -> Self {\n        Self(Inner::U64(input, itoa::Buffer::new()))\n    }\n}\n\nimpl From<f32> for Encoder {\n    fn from(input: f32) -> Self {\n        Self(Inner::F32(input, ryu::Buffer::new()))\n    }\n}\n\nimpl From<f64> for Encoder {\n    fn from(input: f64) -> Self {\n        Self(Inner::F64(input, ryu::Buffer::new()))\n    }\n}\n\nmod float {\n    use std::num::ParseFloatError;\n\n    /// Smithy encoded value for `f64::INFINITY`\n    pub(crate) const INFINITY: &str = \"Infinity\";\n\n    /// Smithy encoded value for `f64::NEG_INFINITY`\n    pub(crate) const NEG_INFINITY: &str = \"-Infinity\";\n\n    /// Smithy encoded value for `f64::NAN`\n    pub(crate) const NAN: &str = \"NaN\";\n\n    /// Parses a Smithy encoded primitive string into an `f32`.\n    pub(crate) fn parse_f32(data: &str) -> Result<f32, ParseFloatError> {\n        match data {\n            INFINITY => Ok(f32::INFINITY),\n            NEG_INFINITY => Ok(f32::NEG_INFINITY),\n            NAN => Ok(f32::NAN),\n            other => other.parse::<f32>(),\n        }\n    }\n\n    /// Parses a Smithy encoded primitive string into an `f64`.\n    pub(crate) fn parse_f64(data: &str) -> Result<f64, ParseFloatError> {\n        match data {\n            INFINITY => Ok(f64::INFINITY),\n            NEG_INFINITY => Ok(f64::NEG_INFINITY),\n            NAN => Ok(f64::NAN),\n            other => other.parse::<f64>(),\n        }\n    }\n}\n\n#[cfg(test)]\nmod test {\n    use crate::primitive::{Encoder, Parse};\n\n    #[test]\n    fn bool_format() {\n        assert_eq!(Encoder::from(true).encode(), \"true\");\n        assert_eq!(Encoder::from(false).encode(), \"false\");\n        let err = bool::parse_smithy_primitive(\"not a boolean\").expect_err(\"should fail\");\n        assert_eq!(err.0, \"bool\");\n        assert!(bool::parse_smithy_primitive(\"true\").unwrap());\n        assert!(!bool::parse_smithy_primitive(\"false\").unwrap());\n    }\n\n    #[test]\n    fn float_format() {\n        assert_eq!(Encoder::from(55_f64).encode(), \"55.0\");\n        assert_eq!(Encoder::from(f64::INFINITY).encode(), \"Infinity\");\n        assert_eq!(Encoder::from(f32::INFINITY).encode(), \"Infinity\");\n        assert_eq!(Encoder::from(f32::NEG_INFINITY).encode(), \"-Infinity\");\n        assert_eq!(Encoder::from(f64::NEG_INFINITY).encode(), \"-Infinity\");\n        assert_eq!(Encoder::from(f32::NAN).encode(), \"NaN\");\n        assert_eq!(Encoder::from(f64::NAN).encode(), \"NaN\");\n    }\n\n    #[test]\n    fn float_parse() {\n        assert_eq!(f64::parse_smithy_primitive(\"1234.5\").unwrap(), 1234.5);\n        assert!(f64::parse_smithy_primitive(\"NaN\").unwrap().is_nan());\n        assert_eq!(\n            f64::parse_smithy_primitive(\"Infinity\").unwrap(),\n            f64::INFINITY\n        );\n        assert_eq!(\n            f64::parse_smithy_primitive(\"-Infinity\").unwrap(),\n            f64::NEG_INFINITY\n        );\n        assert_eq!(f32::parse_smithy_primitive(\"1234.5\").unwrap(), 1234.5);\n        assert!(f32::parse_smithy_primitive(\"NaN\").unwrap().is_nan());\n        assert_eq!(\n            f32::parse_smithy_primitive(\"Infinity\").unwrap(),\n            f32::INFINITY\n        );\n        assert_eq!(\n            f32::parse_smithy_primitive(\"-Infinity\").unwrap(),\n            f32::NEG_INFINITY\n        );\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-types/src/retry.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! This module defines types that describe when to retry given a response.\n\nuse crate::config_bag::{Storable, StoreReplace};\nuse std::fmt;\nuse std::str::FromStr;\nuse std::time::Duration;\n\nconst VALID_RETRY_MODES: &[RetryMode] = &[RetryMode::Standard];\n\n/// Type of error that occurred when making a request.\n#[derive(Clone, Copy, Eq, PartialEq, Debug)]\n#[non_exhaustive]\npub enum ErrorKind {\n    /// A connection-level error.\n    ///\n    /// A `TransientError` can represent conditions such as socket timeouts, socket connection errors, or TLS negotiation timeouts.\n    ///\n    /// `TransientError` is not modeled by Smithy and is instead determined through client-specific heuristics and response status codes.\n    ///\n    /// Typically these should never be applied for non-idempotent request types\n    /// since in this scenario, it's impossible to know whether the operation had\n    /// a side effect on the server.\n    ///\n    /// TransientErrors are not currently modeled. They are determined based on specific provider\n    /// level errors & response status code.\n    TransientError,\n\n    /// An error where the server explicitly told the client to back off, such as a 429 or 503 HTTP error.\n    ThrottlingError,\n\n    /// Server error that isn't explicitly throttling but is considered by the client\n    /// to be something that should be retried.\n    ServerError,\n\n    /// Doesn't count against any budgets. This could be something like a 401 challenge in Http.\n    ClientError,\n}\n\nimpl fmt::Display for ErrorKind {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        match self {\n            Self::TransientError => write!(f, \"transient error\"),\n            Self::ThrottlingError => write!(f, \"throttling error\"),\n            Self::ServerError => write!(f, \"server error\"),\n            Self::ClientError => write!(f, \"client error\"),\n        }\n    }\n}\n\n/// Trait that provides an `ErrorKind` and an error code.\npub trait ProvideErrorKind {\n    /// Returns the `ErrorKind` when the error is modeled as retryable\n    ///\n    /// If the error kind cannot be determined (e.g. the error is unmodeled at the error kind depends\n    /// on an HTTP status code, return `None`.\n    fn retryable_error_kind(&self) -> Option<ErrorKind>;\n\n    /// Returns the `code` for this error if one exists\n    fn code(&self) -> Option<&str>;\n}\n\n/// `RetryKind` describes how a request MAY be retried for a given response\n///\n/// A `RetryKind` describes how a response MAY be retried; it does not mandate retry behavior.\n/// The actual retry behavior is at the sole discretion of the RetryStrategy in place.\n/// A RetryStrategy may ignore the suggestion for a number of reasons including but not limited to:\n/// - Number of retry attempts exceeded\n/// - The required retry delay exceeds the maximum backoff configured by the client\n/// - No retry tokens are available due to service health\n#[non_exhaustive]\n#[derive(Eq, PartialEq, Debug)]\npub enum RetryKind {\n    /// Retry the associated request due to a known `ErrorKind`.\n    Error(ErrorKind),\n\n    /// An Explicit retry (e.g. from `x-amz-retry-after`).\n    ///\n    /// Note: The specified `Duration` is considered a suggestion and may be replaced or ignored.\n    Explicit(Duration),\n\n    /// The response was a failure that should _not_ be retried.\n    UnretryableFailure,\n\n    /// The response was successful, so no retry is necessary.\n    Unnecessary,\n}\n\n/// Specifies how failed requests should be retried.\n#[non_exhaustive]\n#[derive(Eq, PartialEq, Debug, Clone, Copy)]\npub enum RetryMode {\n    /// The standard set of retry rules across AWS SDKs. This mode includes a standard set of errors\n    /// that are retried, and support for retry quotas. The default maximum number of attempts\n    /// with this mode is three, unless otherwise explicitly configured with [`RetryConfig`].\n    Standard,\n\n    /// An experimental retry mode that includes the functionality of standard mode but includes\n    /// automatic client-side throttling. Because this mode is experimental, it might change\n    /// behavior in the future.\n    Adaptive,\n}\n\nimpl FromStr for RetryMode {\n    type Err = RetryModeParseError;\n\n    fn from_str(string: &str) -> Result<Self, Self::Err> {\n        let string = string.trim();\n\n        // eq_ignore_ascii_case is OK here because the only strings we need to check for are ASCII\n        if string.eq_ignore_ascii_case(\"standard\") {\n            Ok(RetryMode::Standard)\n        } else if string.eq_ignore_ascii_case(\"adaptive\") {\n            Ok(RetryMode::Adaptive)\n        } else {\n            Err(RetryModeParseError::new(string))\n        }\n    }\n}\n\n/// Failure to parse a `RetryMode` from string.\n#[derive(Debug)]\npub struct RetryModeParseError {\n    message: String,\n}\n\nimpl RetryModeParseError {\n    pub(super) fn new(message: impl Into<String>) -> Self {\n        Self {\n            message: message.into(),\n        }\n    }\n}\n\nimpl fmt::Display for RetryModeParseError {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        write!(\n            f,\n            \"error parsing string '{}' as RetryMode, valid options are: {:#?}\",\n            self.message, VALID_RETRY_MODES\n        )\n    }\n}\n\nimpl std::error::Error for RetryModeParseError {}\n\n/// Builder for [`RetryConfig`].\n#[non_exhaustive]\n#[derive(Debug, Default, Clone, PartialEq)]\npub struct RetryConfigBuilder {\n    mode: Option<RetryMode>,\n    max_attempts: Option<u32>,\n    initial_backoff: Option<Duration>,\n    max_backoff: Option<Duration>,\n    reconnect_mode: Option<ReconnectMode>,\n}\n\nimpl RetryConfigBuilder {\n    /// Creates a new builder.\n    pub fn new() -> Self {\n        Default::default()\n    }\n\n    /// Sets the retry mode.\n    pub fn set_mode(&mut self, retry_mode: Option<RetryMode>) -> &mut Self {\n        self.mode = retry_mode;\n        self\n    }\n\n    /// Sets the retry mode.\n    pub fn mode(mut self, mode: RetryMode) -> Self {\n        self.set_mode(Some(mode));\n        self\n    }\n\n    /// Set the [`ReconnectMode`] for the retry strategy\n    ///\n    /// By default, when a transient error is encountered, the connection in use will be poisoned.\n    /// This prevents reusing a connection to a potentially bad host but may increase the load on\n    /// the server.\n    ///\n    /// This behavior can be disabled by setting [`ReconnectMode::ReuseAllConnections`] instead.\n    pub fn reconnect_mode(mut self, reconnect_mode: ReconnectMode) -> Self {\n        self.set_reconnect_mode(Some(reconnect_mode));\n        self\n    }\n\n    /// Set the [`ReconnectMode`] for the retry strategy\n    ///\n    /// By default, when a transient error is encountered, the connection in use will be poisoned.\n    /// This prevents reusing a connection to a potentially bad host but may increase the load on\n    /// the server.\n    ///\n    /// This behavior can be disabled by setting [`ReconnectMode::ReuseAllConnections`] instead.\n    pub fn set_reconnect_mode(&mut self, reconnect_mode: Option<ReconnectMode>) -> &mut Self {\n        self.reconnect_mode = reconnect_mode;\n        self\n    }\n\n    /// Sets the max attempts. This value must be greater than zero.\n    pub fn set_max_attempts(&mut self, max_attempts: Option<u32>) -> &mut Self {\n        self.max_attempts = max_attempts;\n        self\n    }\n\n    /// Sets the max attempts. This value must be greater than zero.\n    pub fn max_attempts(mut self, max_attempts: u32) -> Self {\n        self.set_max_attempts(Some(max_attempts));\n        self\n    }\n\n    /// Set the initial_backoff duration. This duration should be non-zero.\n    pub fn set_initial_backoff(&mut self, initial_backoff: Option<Duration>) -> &mut Self {\n        self.initial_backoff = initial_backoff;\n        self\n    }\n\n    /// Set the initial_backoff duration. This duration should be non-zero.\n    pub fn initial_backoff(mut self, initial_backoff: Duration) -> Self {\n        self.set_initial_backoff(Some(initial_backoff));\n        self\n    }\n\n    /// Set the max_backoff duration. This duration should be non-zero.\n    pub fn set_max_backoff(&mut self, max_backoff: Option<Duration>) -> &mut Self {\n        self.max_backoff = max_backoff;\n        self\n    }\n\n    /// Set the max_backoff duration. This duration should be non-zero.\n    pub fn max_backoff(mut self, max_backoff: Duration) -> Self {\n        self.set_max_backoff(Some(max_backoff));\n        self\n    }\n\n    /// Merge two builders together. Values from `other` will only be used as a fallback for values\n    /// from `self` Useful for merging configs from different sources together when you want to\n    /// handle \"precedence\" per value instead of at the config level\n    ///\n    /// # Example\n    ///\n    /// ```rust\n    /// # use aws_smithy_types::retry::{RetryMode, RetryConfigBuilder};\n    /// let a = RetryConfigBuilder::new().max_attempts(1);\n    /// let b = RetryConfigBuilder::new().max_attempts(5).mode(RetryMode::Adaptive);\n    /// let retry_config = a.take_unset_from(b).build();\n    /// // A's value take precedence over B's value\n    /// assert_eq!(retry_config.max_attempts(), 1);\n    /// // A never set a retry mode so B's value was used\n    /// assert_eq!(retry_config.mode(), RetryMode::Adaptive);\n    /// ```\n    pub fn take_unset_from(self, other: Self) -> Self {\n        Self {\n            mode: self.mode.or(other.mode),\n            max_attempts: self.max_attempts.or(other.max_attempts),\n            initial_backoff: self.initial_backoff.or(other.initial_backoff),\n            max_backoff: self.max_backoff.or(other.max_backoff),\n            reconnect_mode: self.reconnect_mode.or(other.reconnect_mode),\n        }\n    }\n\n    /// Builds a `RetryConfig`.\n    pub fn build(self) -> RetryConfig {\n        RetryConfig {\n            mode: self.mode.unwrap_or(RetryMode::Standard),\n            max_attempts: self.max_attempts.unwrap_or(3),\n            initial_backoff: self\n                .initial_backoff\n                .unwrap_or_else(|| Duration::from_secs(1)),\n            reconnect_mode: self\n                .reconnect_mode\n                .unwrap_or(ReconnectMode::ReconnectOnTransientError),\n            max_backoff: self.max_backoff.unwrap_or_else(|| Duration::from_secs(20)),\n            use_static_exponential_base: false,\n        }\n    }\n}\n\n/// Retry configuration for requests.\n#[non_exhaustive]\n#[derive(Debug, Clone, PartialEq)]\npub struct RetryConfig {\n    mode: RetryMode,\n    max_attempts: u32,\n    initial_backoff: Duration,\n    max_backoff: Duration,\n    reconnect_mode: ReconnectMode,\n    use_static_exponential_base: bool,\n}\n\nimpl Storable for RetryConfig {\n    type Storer = StoreReplace<RetryConfig>;\n}\n\n/// Mode for connection re-establishment\n///\n/// By default, when a transient error is encountered, the connection in use will be poisoned. This\n/// behavior can be disabled by setting [`ReconnectMode::ReuseAllConnections`] instead.\n#[derive(Debug, Clone, PartialEq, Copy)]\npub enum ReconnectMode {\n    /// Reconnect on [`ErrorKind::TransientError`]\n    ReconnectOnTransientError,\n\n    /// Disable reconnect on error\n    ///\n    /// When this setting is applied, 503s, timeouts, and other transient errors will _not_\n    /// lead to a new connection being established unless the connection is closed by the remote.\n    ReuseAllConnections,\n}\n\nimpl Storable for ReconnectMode {\n    type Storer = StoreReplace<ReconnectMode>;\n}\n\nimpl RetryConfig {\n    /// Creates a default `RetryConfig` with `RetryMode::Standard` and max attempts of three.\n    pub fn standard() -> Self {\n        Self {\n            mode: RetryMode::Standard,\n            max_attempts: 3,\n            initial_backoff: Duration::from_secs(1),\n            reconnect_mode: ReconnectMode::ReconnectOnTransientError,\n            max_backoff: Duration::from_secs(20),\n            use_static_exponential_base: false,\n        }\n    }\n\n    /// Creates a default `RetryConfig` with `RetryMode::Adaptive` and max attempts of three.\n    pub fn adaptive() -> Self {\n        Self {\n            mode: RetryMode::Adaptive,\n            max_attempts: 3,\n            initial_backoff: Duration::from_secs(1),\n            reconnect_mode: ReconnectMode::ReconnectOnTransientError,\n            max_backoff: Duration::from_secs(20),\n            use_static_exponential_base: false,\n        }\n    }\n\n    /// Creates a `RetryConfig` that has retries disabled.\n    pub fn disabled() -> Self {\n        Self::standard().with_max_attempts(1)\n    }\n\n    /// Set this config's [retry mode](RetryMode).\n    pub fn with_retry_mode(mut self, retry_mode: RetryMode) -> Self {\n        self.mode = retry_mode;\n        self\n    }\n\n    /// Set the maximum number of times a request should be tried, including the initial attempt.\n    /// This value must be greater than zero.\n    pub fn with_max_attempts(mut self, max_attempts: u32) -> Self {\n        self.max_attempts = max_attempts;\n        self\n    }\n\n    /// Set the [`ReconnectMode`] for the retry strategy\n    ///\n    /// By default, when a transient error is encountered, the connection in use will be poisoned.\n    /// This prevents reusing a connection to a potentially bad host but may increase the load on\n    /// the server.\n    ///\n    /// This behavior can be disabled by setting [`ReconnectMode::ReuseAllConnections`] instead.\n    pub fn with_reconnect_mode(mut self, reconnect_mode: ReconnectMode) -> Self {\n        self.reconnect_mode = reconnect_mode;\n        self\n    }\n\n    /// Set the multiplier used when calculating backoff times as part of an\n    /// [exponential backoff with jitter](https://aws.amazon.com/blogs/architecture/exponential-backoff-and-jitter/)\n    /// strategy. Most services should work fine with the default duration of 1 second, but if you\n    /// find that your requests are taking too long due to excessive retry backoff, try lowering\n    /// this value.\n    ///\n    /// ## Example\n    ///\n    /// *For a request that gets retried 3 times, when initial_backoff is 1 seconds:*\n    /// - the first retry will occur after 0 to 1 seconds\n    /// - the second retry will occur after 0 to 2 seconds\n    /// - the third retry will occur after 0 to 4 seconds\n    ///\n    /// *For a request that gets retried 3 times, when initial_backoff is 30 milliseconds:*\n    /// - the first retry will occur after 0 to 30 milliseconds\n    /// - the second retry will occur after 0 to 60 milliseconds\n    /// - the third retry will occur after 0 to 120 milliseconds\n    pub fn with_initial_backoff(mut self, initial_backoff: Duration) -> Self {\n        self.initial_backoff = initial_backoff;\n        self\n    }\n\n    /// Set the maximum backoff time.\n    pub fn with_max_backoff(mut self, max_backoff: Duration) -> Self {\n        self.max_backoff = max_backoff;\n        self\n    }\n\n    /// Hint to the retry strategy whether to use a static exponential base.\n    ///\n    /// When a retry strategy uses exponential backoff, it calculates a random base. This causes the\n    /// retry delay to be slightly random, and helps prevent \"thundering herd\" scenarios. However,\n    /// it's often useful during testing to know exactly how long the delay will be.\n    ///\n    /// Therefore, if you're writing a test and asserting an expected retry delay,\n    /// set this to `true`.\n    #[cfg(feature = \"test-util\")]\n    pub fn with_use_static_exponential_base(mut self, use_static_exponential_base: bool) -> Self {\n        self.use_static_exponential_base = use_static_exponential_base;\n        self\n    }\n\n    /// Returns the retry mode.\n    pub fn mode(&self) -> RetryMode {\n        self.mode\n    }\n\n    /// Returns the [`ReconnectMode`]\n    pub fn reconnect_mode(&self) -> ReconnectMode {\n        self.reconnect_mode\n    }\n\n    /// Returns the max attempts.\n    pub fn max_attempts(&self) -> u32 {\n        self.max_attempts\n    }\n\n    /// Returns the backoff multiplier duration.\n    pub fn initial_backoff(&self) -> Duration {\n        self.initial_backoff\n    }\n\n    /// Returns the max backoff duration.\n    pub fn max_backoff(&self) -> Duration {\n        self.max_backoff\n    }\n\n    /// Returns true if retry is enabled with this config\n    pub fn has_retry(&self) -> bool {\n        self.max_attempts > 1\n    }\n\n    /// Returns `true` if retry strategies should use a static exponential base instead of the\n    /// default random base.\n    ///\n    /// To set this value, the `test-util` feature must be enabled.\n    pub fn use_static_exponential_base(&self) -> bool {\n        self.use_static_exponential_base\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use crate::retry::{RetryConfigBuilder, RetryMode};\n    use std::str::FromStr;\n\n    #[test]\n    fn retry_config_builder_merge_with_favors_self_values_over_other_values() {\n        let self_builder = RetryConfigBuilder::new()\n            .max_attempts(1)\n            .mode(RetryMode::Adaptive);\n        let other_builder = RetryConfigBuilder::new()\n            .max_attempts(5)\n            .mode(RetryMode::Standard);\n        let retry_config = self_builder.take_unset_from(other_builder).build();\n\n        assert_eq!(retry_config.max_attempts, 1);\n        assert_eq!(retry_config.mode, RetryMode::Adaptive);\n    }\n\n    #[test]\n    fn retry_mode_from_str_parses_valid_strings_regardless_of_casing() {\n        assert_eq!(\n            RetryMode::from_str(\"standard\").ok(),\n            Some(RetryMode::Standard)\n        );\n        assert_eq!(\n            RetryMode::from_str(\"STANDARD\").ok(),\n            Some(RetryMode::Standard)\n        );\n        assert_eq!(\n            RetryMode::from_str(\"StAnDaRd\").ok(),\n            Some(RetryMode::Standard)\n        );\n        // assert_eq!(\n        //     RetryMode::from_str(\"adaptive\").ok(),\n        //     Some(RetryMode::Adaptive)\n        // );\n        // assert_eq!(\n        //     RetryMode::from_str(\"ADAPTIVE\").ok(),\n        //     Some(RetryMode::Adaptive)\n        // );\n        // assert_eq!(\n        //     RetryMode::from_str(\"aDaPtIvE\").ok(),\n        //     Some(RetryMode::Adaptive)\n        // );\n    }\n\n    #[test]\n    fn retry_mode_from_str_ignores_whitespace_before_and_after() {\n        assert_eq!(\n            RetryMode::from_str(\"  standard \").ok(),\n            Some(RetryMode::Standard)\n        );\n        assert_eq!(\n            RetryMode::from_str(\"   STANDARD  \").ok(),\n            Some(RetryMode::Standard)\n        );\n        assert_eq!(\n            RetryMode::from_str(\"  StAnDaRd   \").ok(),\n            Some(RetryMode::Standard)\n        );\n        // assert_eq!(\n        //     RetryMode::from_str(\"  adaptive  \").ok(),\n        //     Some(RetryMode::Adaptive)\n        // );\n        // assert_eq!(\n        //     RetryMode::from_str(\"   ADAPTIVE \").ok(),\n        //     Some(RetryMode::Adaptive)\n        // );\n        // assert_eq!(\n        //     RetryMode::from_str(\"  aDaPtIvE    \").ok(),\n        //     Some(RetryMode::Adaptive)\n        // );\n    }\n\n    #[test]\n    fn retry_mode_from_str_wont_parse_invalid_strings() {\n        assert_eq!(RetryMode::from_str(\"std\").ok(), None);\n        assert_eq!(RetryMode::from_str(\"aws\").ok(), None);\n        assert_eq!(RetryMode::from_str(\"s t a n d a r d\").ok(), None);\n        assert_eq!(RetryMode::from_str(\"a d a p t i v e\").ok(), None);\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-types/src/str_bytes.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! UTF-8 string byte buffer representation with validation amortization.\n\nuse bytes::Bytes;\nuse std::str::Utf8Error;\n\n/// UTF-8 string byte buffer representation with validation amortization.\n/// When `StrBytes` is constructed from a `&str` or `String`, its underlying bytes are assumed\n/// to be valid UTF-8. Otherwise, if constructed from a byte source, the construction will\n/// be fallible.\n///\n/// Example construction from a `&str`:\n/// ```rust\n/// use aws_smithy_types::str_bytes::StrBytes;\n///\n/// let value: StrBytes = \"example\".into();\n/// assert_eq!(\"example\", value.as_str());\n/// assert_eq!(b\"example\", &value.as_bytes()[..]);\n/// ```\n///\n/// Example construction from `Bytes`:\n/// ```rust\n/// use bytes::Bytes;\n/// use aws_smithy_types::str_bytes::StrBytes;\n///\n/// let bytes = Bytes::from_static(b\"example\");\n/// let value: StrBytes = bytes.try_into().expect(\"valid utf-8\");\n/// assert_eq!(\"example\", value.as_str());\n/// assert_eq!(b\"example\", &value.as_bytes()[..]);\n/// ```\n#[non_exhaustive]\n#[derive(Clone, Debug, PartialEq, Eq)]\npub struct StrBytes {\n    bytes: Bytes,\n}\n\nimpl StrBytes {\n    fn new(bytes: Bytes) -> Self {\n        StrBytes { bytes }\n    }\n\n    /// Returns the underlying `Bytes` representation.\n    pub fn as_bytes(&self) -> &Bytes {\n        &self.bytes\n    }\n\n    /// Returns the `StrBytes` value as a `&str`.\n    pub fn as_str(&self) -> &str {\n        // Safety: StrBytes can only be constructed from a valid UTF-8 string\n        unsafe { std::str::from_utf8_unchecked(&self.bytes[..]) }\n    }\n\n    /// Tries to create a `StrBytes` from a slice, or returns a `Utf8Error` if the slice\n    /// is not valid UTF-8.\n    pub fn try_copy_from_slice(slice: &[u8]) -> Result<Self, Utf8Error> {\n        match std::str::from_utf8(slice) {\n            Ok(_) => Ok(StrBytes::new(Bytes::copy_from_slice(slice))),\n            Err(err) => Err(err),\n        }\n    }\n\n    /// Creates a `StrBytes` from a `&str`.\n    pub fn copy_from_str(string: &str) -> Self {\n        StrBytes::new(Bytes::copy_from_slice(string.as_bytes()))\n    }\n}\n\nimpl From<String> for StrBytes {\n    fn from(value: String) -> Self {\n        StrBytes::new(Bytes::from(value))\n    }\n}\n\nimpl From<&'static str> for StrBytes {\n    fn from(value: &'static str) -> Self {\n        StrBytes::new(Bytes::from(value))\n    }\n}\n\nimpl TryFrom<&'static [u8]> for StrBytes {\n    type Error = Utf8Error;\n\n    fn try_from(value: &'static [u8]) -> Result<Self, Self::Error> {\n        match std::str::from_utf8(value) {\n            Ok(_) => Ok(StrBytes::new(Bytes::from(value))),\n            Err(err) => Err(err),\n        }\n    }\n}\n\nimpl TryFrom<Vec<u8>> for StrBytes {\n    type Error = Utf8Error;\n\n    fn try_from(value: Vec<u8>) -> Result<Self, Self::Error> {\n        match std::str::from_utf8(&value[..]) {\n            Ok(_) => Ok(StrBytes::new(Bytes::from(value))),\n            Err(err) => Err(err),\n        }\n    }\n}\n\nimpl TryFrom<Bytes> for StrBytes {\n    type Error = Utf8Error;\n\n    fn try_from(bytes: Bytes) -> Result<Self, Self::Error> {\n        match std::str::from_utf8(&bytes[..]) {\n            Ok(_) => Ok(StrBytes::new(bytes)),\n            Err(err) => Err(err),\n        }\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use crate::str_bytes::StrBytes;\n    use bytes::Bytes;\n    use std::str::Utf8Error;\n\n    #[test]\n    fn invalid_utf8_correctly_errors() {\n        let invalid_utf8 = &[0xC3, 0x28][..];\n        assert!(std::str::from_utf8(invalid_utf8).is_err());\n\n        let result: Result<StrBytes, Utf8Error> = invalid_utf8.try_into();\n        assert!(result.is_err());\n\n        let result: Result<StrBytes, Utf8Error> = invalid_utf8.to_vec().try_into();\n        assert!(result.is_err());\n\n        let result: Result<StrBytes, Utf8Error> = Bytes::from_static(invalid_utf8).try_into();\n        assert!(result.is_err());\n    }\n\n    #[test]\n    fn valid_utf8() {\n        let valid_utf8 = \"hello\";\n        let str_bytes: StrBytes = valid_utf8.into();\n        assert_eq!(valid_utf8.as_bytes(), str_bytes.as_bytes());\n        assert_eq!(valid_utf8, str_bytes.as_str());\n        assert_eq!(valid_utf8, str_bytes.as_str());\n    }\n\n    #[test]\n    fn equals() {\n        let str_bytes: StrBytes = \"test\".into();\n        assert_eq!(str_bytes, str_bytes);\n        let other_bytes: StrBytes = \"foo\".into();\n        assert_ne!(str_bytes, other_bytes);\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-types/src/timeout.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! This module defines types that describe timeouts that can be applied to various stages of the\n//! Smithy networking stack.\n\nuse crate::config_bag::value::Value;\nuse crate::config_bag::{ItemIter, Storable, Store, StoreReplace};\nuse std::time::Duration;\n\n#[derive(Clone, Debug, Default, PartialEq, Copy)]\nenum CanDisable<T> {\n    Disabled,\n    #[default]\n    Unset,\n    Set(T),\n}\n\nimpl<T> CanDisable<T> {\n    fn none_implies_disabled(value: Option<T>) -> Self {\n        match value {\n            Some(t) => CanDisable::Set(t),\n            None => CanDisable::Disabled,\n        }\n    }\n\n    fn is_some(&self) -> bool {\n        matches!(self, CanDisable::Set(_))\n    }\n\n    fn value(self) -> Option<T> {\n        match self {\n            CanDisable::Set(v) => Some(v),\n            _ => None,\n        }\n    }\n\n    fn merge_from_lower_priority(self, other: Self) -> Self {\n        match (self, other) {\n            // if we are unset. take the value from the other\n            (CanDisable::Unset, value) => value,\n            (us, _) => us,\n        }\n    }\n}\n\nimpl<T> From<T> for CanDisable<T> {\n    fn from(value: T) -> Self {\n        Self::Set(value)\n    }\n}\n\n/// Builder for [`TimeoutConfig`].\n#[non_exhaustive]\n#[derive(Clone, Debug, Default)]\npub struct TimeoutConfigBuilder {\n    connect_timeout: CanDisable<Duration>,\n    read_timeout: CanDisable<Duration>,\n    operation_timeout: CanDisable<Duration>,\n    operation_attempt_timeout: CanDisable<Duration>,\n}\n\nimpl TimeoutConfigBuilder {\n    /// Creates a new builder with no timeouts set.\n    pub fn new() -> Self {\n        Default::default()\n    }\n\n    /// Sets the connect timeout.\n    ///\n    /// The connect timeout is a limit on the amount of time it takes to initiate a socket connection.\n    pub fn connect_timeout(mut self, connect_timeout: Duration) -> Self {\n        self.connect_timeout = connect_timeout.into();\n        self\n    }\n\n    /// Sets the connect timeout.\n    ///\n    /// If `None` is passed, this will explicitly disable the connection timeout.\n    ///\n    /// The connect timeout is a limit on the amount of time it takes to initiate a socket connection.\n    pub fn set_connect_timeout(&mut self, connect_timeout: Option<Duration>) -> &mut Self {\n        self.connect_timeout = CanDisable::none_implies_disabled(connect_timeout);\n        self\n    }\n\n    /// Disables the connect timeout\n    pub fn disable_connect_timeout(mut self) -> Self {\n        self.connect_timeout = CanDisable::Disabled;\n        self\n    }\n\n    /// Sets the read timeout.\n    ///\n    /// The read timeout is the limit on the amount of time it takes to read the first byte of a response\n    /// from the time the request is initiated.\n    pub fn read_timeout(mut self, read_timeout: Duration) -> Self {\n        self.read_timeout = read_timeout.into();\n        self\n    }\n\n    /// Sets the read timeout.\n    ///\n    /// If `None` is passed, this will explicitly disable the read timeout. To disable all timeouts use [`TimeoutConfig::disabled`].\n    ///\n    /// The read timeout is the limit on the amount of time it takes to read the first byte of a response\n    /// from the time the request is initiated.\n    pub fn set_read_timeout(&mut self, read_timeout: Option<Duration>) -> &mut Self {\n        self.read_timeout = CanDisable::none_implies_disabled(read_timeout);\n        self\n    }\n\n    /// Disables the read timeout\n    pub fn disable_read_timeout(mut self) -> Self {\n        self.read_timeout = CanDisable::Disabled;\n        self\n    }\n\n    /// Sets the operation timeout.\n    ///\n    /// An operation represents the full request/response lifecycle of a call to a service.\n    /// The operation timeout is a limit on the total amount of time it takes for an operation to be\n    /// fully serviced, including the time for all retries that may have been attempted for it.\n    ///\n    /// If you want to set a timeout on individual retry attempts, then see [`Self::operation_attempt_timeout`]\n    /// or [`Self::set_operation_attempt_timeout`].\n    pub fn operation_timeout(mut self, operation_timeout: Duration) -> Self {\n        self.operation_timeout = operation_timeout.into();\n        self\n    }\n\n    /// Sets the operation timeout.\n    ///\n    /// If `None` is passed, this will explicitly disable the read timeout. To disable all timeouts use [`TimeoutConfig::disabled`].\n    ///\n    /// An operation represents the full request/response lifecycle of a call to a service.\n    /// The operation timeout is a limit on the total amount of time it takes for an operation to be\n    /// fully serviced, including the time for all retries that may have been attempted for it.\n    ///\n    /// If you want to set a timeout on individual retry attempts, then see [`Self::operation_attempt_timeout`]\n    /// or [`Self::set_operation_attempt_timeout`].\n    pub fn set_operation_timeout(&mut self, operation_timeout: Option<Duration>) -> &mut Self {\n        self.operation_timeout = CanDisable::none_implies_disabled(operation_timeout);\n        self\n    }\n\n    /// Disables the operation timeout\n    pub fn disable_operation_timeout(mut self) -> Self {\n        self.operation_timeout = CanDisable::Disabled;\n        self\n    }\n\n    /// Sets the operation attempt timeout.\n    ///\n    /// An operation represents the full request/response lifecycle of a call to a service.\n    /// When retries are enabled, then this setting makes it possible to set a timeout for individual\n    /// retry attempts (including the initial attempt) for an operation.\n    ///\n    /// If you want to set a timeout on the total time for an entire request including all of its retries,\n    /// then see [`Self::operation_timeout`] /// or [`Self::set_operation_timeout`].\n    pub fn operation_attempt_timeout(mut self, operation_attempt_timeout: Duration) -> Self {\n        self.operation_attempt_timeout = operation_attempt_timeout.into();\n        self\n    }\n\n    /// Sets the operation attempt timeout.\n    ///\n    /// If `None` is passed, this will explicitly disable the operation timeout. To disable all timeouts use [`TimeoutConfig::disabled`].\n    ///\n    /// An operation represents the full request/response lifecycle of a call to a service.\n    /// When retries are enabled, then this setting makes it possible to set a timeout for individual\n    /// retry attempts (including the initial attempt) for an operation.\n    ///\n    /// If you want to set a timeout on individual retry attempts, then see [`Self::operation_attempt_timeout`]\n    /// or [`Self::set_operation_attempt_timeout`].\n    pub fn set_operation_attempt_timeout(\n        &mut self,\n        operation_attempt_timeout: Option<Duration>,\n    ) -> &mut Self {\n        self.operation_attempt_timeout =\n            CanDisable::none_implies_disabled(operation_attempt_timeout);\n        self\n    }\n\n    /// Disables the operation_attempt timeout\n    pub fn disable_operation_attempt_timeout(mut self) -> Self {\n        self.operation_attempt_timeout = CanDisable::Disabled;\n        self\n    }\n\n    /// Merges two timeout config builders together.\n    ///\n    /// Values from `other` will only be used as a fallback for values\n    /// from `self`. Useful for merging configs from different sources together when you want to\n    /// handle \"precedence\" per value instead of at the config level\n    ///\n    /// # Example\n    ///\n    /// ```rust\n    /// # use std::time::Duration;\n    /// # use aws_smithy_types::timeout::TimeoutConfig;\n    /// let a = TimeoutConfig::builder()\n    ///     .connect_timeout(Duration::from_secs(3));\n    /// let b = TimeoutConfig::builder()\n    ///     .connect_timeout(Duration::from_secs(5))\n    ///     .operation_timeout(Duration::from_secs(3));\n    /// let timeout_config = a.take_unset_from(b).build();\n    ///\n    /// // A's value take precedence over B's value\n    /// assert_eq!(timeout_config.connect_timeout(), Some(Duration::from_secs(3)));\n    /// // A never set an operation timeout so B's value is used\n    /// assert_eq!(timeout_config.operation_timeout(), Some(Duration::from_secs(3)));\n    /// ```\n    pub fn take_unset_from(self, other: Self) -> Self {\n        Self {\n            connect_timeout: self\n                .connect_timeout\n                .merge_from_lower_priority(other.connect_timeout),\n            read_timeout: self\n                .read_timeout\n                .merge_from_lower_priority(other.read_timeout),\n            operation_timeout: self\n                .operation_timeout\n                .merge_from_lower_priority(other.operation_timeout),\n            operation_attempt_timeout: self\n                .operation_attempt_timeout\n                .merge_from_lower_priority(other.operation_attempt_timeout),\n        }\n    }\n\n    /// Builds a `TimeoutConfig`.\n    pub fn build(self) -> TimeoutConfig {\n        TimeoutConfig {\n            connect_timeout: self.connect_timeout,\n            read_timeout: self.read_timeout,\n            operation_timeout: self.operation_timeout,\n            operation_attempt_timeout: self.operation_attempt_timeout,\n        }\n    }\n}\n\nimpl From<TimeoutConfig> for TimeoutConfigBuilder {\n    fn from(timeout_config: TimeoutConfig) -> Self {\n        TimeoutConfigBuilder {\n            connect_timeout: timeout_config.connect_timeout,\n            read_timeout: timeout_config.read_timeout,\n            operation_timeout: timeout_config.operation_timeout,\n            operation_attempt_timeout: timeout_config.operation_attempt_timeout,\n        }\n    }\n}\n\n/// Top-level configuration for timeouts\n///\n/// # Example\n///\n/// ```rust\n/// # use std::time::Duration;\n///\n/// # fn main() {\n/// use aws_smithy_types::timeout::TimeoutConfig;\n///\n/// let timeout_config = TimeoutConfig::builder()\n///     .operation_timeout(Duration::from_secs(30))\n///     .operation_attempt_timeout(Duration::from_secs(10))\n///     .connect_timeout(Duration::from_secs(3))\n///     .build();\n///\n/// assert_eq!(\n///     timeout_config.operation_timeout(),\n///     Some(Duration::from_secs(30))\n/// );\n/// assert_eq!(\n///     timeout_config.operation_attempt_timeout(),\n///     Some(Duration::from_secs(10))\n/// );\n/// assert_eq!(\n///     timeout_config.connect_timeout(),\n///     Some(Duration::from_secs(3))\n/// );\n/// # }\n/// ```\n#[non_exhaustive]\n#[derive(Clone, PartialEq, Debug)]\npub struct TimeoutConfig {\n    connect_timeout: CanDisable<Duration>,\n    read_timeout: CanDisable<Duration>,\n    operation_timeout: CanDisable<Duration>,\n    operation_attempt_timeout: CanDisable<Duration>,\n}\n\nimpl Storable for TimeoutConfig {\n    type Storer = StoreReplace<TimeoutConfig>;\n}\n\n/// Merger which merges timeout config settings when loading.\n///\n/// If no timeouts are set, `TimeoutConfig::disabled()` will be returned.\n///\n/// This API is not meant to be used externally.\n#[derive(Debug)]\npub struct MergeTimeoutConfig;\n\nimpl Storable for MergeTimeoutConfig {\n    type Storer = MergeTimeoutConfig;\n}\nimpl Store for MergeTimeoutConfig {\n    type ReturnedType<'a> = TimeoutConfig;\n    type StoredType = <StoreReplace<TimeoutConfig> as Store>::StoredType;\n\n    fn merge_iter(iter: ItemIter<'_, Self>) -> Self::ReturnedType<'_> {\n        let mut result: Option<TimeoutConfig> = None;\n        // The item iterator iterates \"backwards\" over the config bags, starting at the highest\n        // priority layers and works backwards\n        for tc in iter {\n            match (result.as_mut(), tc) {\n                (Some(result), Value::Set(tc)) => {\n                    // This maintains backwards compatible behavior where setting an EMPTY timeout config is equivalent to `TimeoutConfig::disabled()`\n                    if result.has_timeouts() {\n                        result.take_defaults_from(tc);\n                    }\n                }\n                (None, Value::Set(tc)) => {\n                    result = Some(tc.clone());\n                }\n                (_, Value::ExplicitlyUnset(_)) => result = Some(TimeoutConfig::disabled()),\n            }\n        }\n        result.unwrap_or(TimeoutConfig::disabled())\n    }\n}\n\nimpl TimeoutConfig {\n    /// Returns a builder to create a `TimeoutConfig`.\n    pub fn builder() -> TimeoutConfigBuilder {\n        TimeoutConfigBuilder::new()\n    }\n\n    /// Returns a builder equivalent of this `TimeoutConfig`.\n    pub fn to_builder(&self) -> TimeoutConfigBuilder {\n        TimeoutConfigBuilder::from(self.clone())\n    }\n\n    /// Converts this `TimeoutConfig` into a builder.\n    pub fn into_builder(self) -> TimeoutConfigBuilder {\n        TimeoutConfigBuilder::from(self)\n    }\n\n    /// Fill any unfilled values in `self` from `other`.\n    pub fn take_defaults_from(&mut self, other: &TimeoutConfig) -> &mut Self {\n        self.connect_timeout = self\n            .connect_timeout\n            .merge_from_lower_priority(other.connect_timeout);\n        self.read_timeout = self\n            .read_timeout\n            .merge_from_lower_priority(other.read_timeout);\n        self.operation_timeout = self\n            .operation_timeout\n            .merge_from_lower_priority(other.operation_timeout);\n        self.operation_attempt_timeout = self\n            .operation_attempt_timeout\n            .merge_from_lower_priority(other.operation_attempt_timeout);\n        self\n    }\n\n    /// Returns a timeout config with all timeouts disabled.\n    pub fn disabled() -> TimeoutConfig {\n        TimeoutConfig {\n            connect_timeout: CanDisable::Disabled,\n            read_timeout: CanDisable::Disabled,\n            operation_timeout: CanDisable::Disabled,\n            operation_attempt_timeout: CanDisable::Disabled,\n        }\n    }\n\n    /// Returns this config's connect timeout.\n    ///\n    /// The connect timeout is a limit on the amount of time it takes to initiate a socket connection.\n    pub fn connect_timeout(&self) -> Option<Duration> {\n        self.connect_timeout.value()\n    }\n\n    /// Returns this config's read timeout.\n    ///\n    /// The read timeout is the limit on the amount of time it takes to read the first byte of a response\n    /// from the time the request is initiated.\n    pub fn read_timeout(&self) -> Option<Duration> {\n        self.read_timeout.value()\n    }\n\n    /// Returns this config's operation timeout.\n    ///\n    /// An operation represents the full request/response lifecycle of a call to a service.\n    /// The operation timeout is a limit on the total amount of time it takes for an operation to be\n    /// fully serviced, including the time for all retries that may have been attempted for it.\n    pub fn operation_timeout(&self) -> Option<Duration> {\n        self.operation_timeout.value()\n    }\n\n    /// Returns this config's operation attempt timeout.\n    ///\n    /// An operation represents the full request/response lifecycle of a call to a service.\n    /// When retries are enabled, then this setting makes it possible to set a timeout for individual\n    /// retry attempts (including the initial attempt) for an operation.\n    pub fn operation_attempt_timeout(&self) -> Option<Duration> {\n        self.operation_attempt_timeout.value()\n    }\n\n    /// Returns true if any of the possible timeouts are set.\n    pub fn has_timeouts(&self) -> bool {\n        self.connect_timeout.is_some()\n            || self.read_timeout.is_some()\n            || self.operation_timeout.is_some()\n            || self.operation_attempt_timeout.is_some()\n    }\n}\n\n/// Configuration subset of [`TimeoutConfig`] for operation timeouts\n#[non_exhaustive]\n#[derive(Clone, PartialEq, Debug)]\npub struct OperationTimeoutConfig {\n    operation_timeout: Option<Duration>,\n    operation_attempt_timeout: Option<Duration>,\n}\n\nimpl OperationTimeoutConfig {\n    /// Returns this config's operation timeout.\n    ///\n    /// An operation represents the full request/response lifecycle of a call to a service.\n    /// The operation timeout is a limit on the total amount of time it takes for an operation to be\n    /// fully serviced, including the time for all retries that may have been attempted for it.\n    pub fn operation_timeout(&self) -> Option<Duration> {\n        self.operation_timeout\n    }\n\n    /// Returns this config's operation attempt timeout.\n    ///\n    /// An operation represents the full request/response lifecycle of a call to a service.\n    /// When retries are enabled, then this setting makes it possible to set a timeout for individual\n    /// retry attempts (including the initial attempt) for an operation.\n    pub fn operation_attempt_timeout(&self) -> Option<Duration> {\n        self.operation_attempt_timeout\n    }\n\n    /// Returns true if any of the possible timeouts are set.\n    pub fn has_timeouts(&self) -> bool {\n        self.operation_timeout.is_some() || self.operation_attempt_timeout.is_some()\n    }\n}\n\nimpl From<&TimeoutConfig> for OperationTimeoutConfig {\n    fn from(cfg: &TimeoutConfig) -> Self {\n        OperationTimeoutConfig {\n            operation_timeout: cfg.operation_timeout.value(),\n            operation_attempt_timeout: cfg.operation_attempt_timeout.value(),\n        }\n    }\n}\n\nimpl From<TimeoutConfig> for OperationTimeoutConfig {\n    fn from(cfg: TimeoutConfig) -> Self {\n        OperationTimeoutConfig::from(&cfg)\n    }\n}\n\n#[cfg(test)]\nmod test {\n    use crate::config_bag::{CloneableLayer, ConfigBag};\n    use crate::timeout::{MergeTimeoutConfig, TimeoutConfig};\n    use std::time::Duration;\n\n    #[test]\n    fn timeout_configs_merged_in_config_bag() {\n        let mut read_timeout = CloneableLayer::new(\"timeout\");\n        read_timeout.store_put(\n            TimeoutConfig::builder()\n                .read_timeout(Duration::from_secs(3))\n                .connect_timeout(Duration::from_secs(1))\n                .build(),\n        );\n        let mut operation_timeout = CloneableLayer::new(\"timeout\");\n        operation_timeout.store_put(\n            TimeoutConfig::builder()\n                .operation_timeout(Duration::from_secs(5))\n                .connect_timeout(Duration::from_secs(10))\n                .build(),\n        );\n        let cfg = ConfigBag::of_layers(vec![read_timeout.into(), operation_timeout.into()]);\n        let loaded = cfg.load::<MergeTimeoutConfig>();\n        // set by base layer\n        assert_eq!(loaded.read_timeout(), Some(Duration::from_secs(3)));\n\n        // set by higher layer\n        assert_eq!(loaded.operation_timeout(), Some(Duration::from_secs(5)));\n\n        // overridden by higher layer\n        assert_eq!(loaded.connect_timeout(), Some(Duration::from_secs(10)));\n        let mut next = cfg.add_layer(\"disabled\");\n        next.interceptor_state()\n            .store_put(TimeoutConfig::disabled());\n\n        assert_eq!(next.load::<MergeTimeoutConfig>().read_timeout(), None);\n\n        // builder().build() acts equivalently to disabled\n        next.interceptor_state()\n            .store_put(TimeoutConfig::builder().build());\n        assert_eq!(next.load::<MergeTimeoutConfig>().read_timeout(), None);\n\n        // But if instead, you set a field of the timeout config, it will merge as expected.\n        next.interceptor_state().store_put(\n            TimeoutConfig::builder()\n                .operation_attempt_timeout(Duration::from_secs(1))\n                .build(),\n        );\n        assert_eq!(\n            next.load::<MergeTimeoutConfig>().read_timeout(),\n            Some(Duration::from_secs(3))\n        );\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-types/src/type_erasure.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::any::Any;\nuse std::error::Error as StdError;\nuse std::fmt;\nuse std::sync::Arc;\n\n/// Abstraction over `Box<dyn T + Send + Sync>` that provides `Debug` and optionally `Clone`.\n///\n/// The orchestrator uses `TypeErasedBox` to avoid the complication of six or more generic parameters\n/// and to avoid the monomorphization that brings with it.\n///\n/// # Examples\n///\n/// Creating a box:\n/// ```no_run\n/// use aws_smithy_types::type_erasure::TypeErasedBox;\n///\n/// let boxed = TypeErasedBox::new(\"some value\");\n/// ```\n///\n/// Downcasting a box:\n/// ```no_run\n/// # use aws_smithy_types::type_erasure::TypeErasedBox;\n/// # let boxed = TypeErasedBox::new(\"some value\".to_string());\n/// let value: Option<&String> = boxed.downcast_ref::<String>();\n/// ```\n///\n/// Converting a box back into its value:\n/// ```\n/// # use aws_smithy_types::type_erasure::TypeErasedBox;\n/// let boxed = TypeErasedBox::new(\"some value\".to_string());\n/// let value: String = *boxed.downcast::<String>().expect(\"it is a string\");\n/// ```\npub struct TypeErasedBox {\n    field: Box<dyn Any + Send + Sync>,\n    #[allow(clippy::type_complexity)]\n    debug: Arc<\n        dyn Fn(&Box<dyn Any + Send + Sync>, &mut fmt::Formatter<'_>) -> fmt::Result + Send + Sync,\n    >,\n    #[allow(clippy::type_complexity)]\n    clone: Option<Arc<dyn Fn(&Box<dyn Any + Send + Sync>) -> TypeErasedBox + Send + Sync>>,\n}\n\n#[cfg(feature = \"test-util\")]\nimpl TypeErasedBox {\n    /// Often, when testing the orchestrator or its components, it's necessary to provide a\n    /// `TypeErasedBox` to serve as an `Input` for `invoke`. In cases where the type won't actually\n    /// be accessed during testing, use this method to generate a `TypeErasedBox` that makes it\n    /// clear that \"for the purpose of this test, the `Input` doesn't matter.\"\n    pub fn doesnt_matter() -> Self {\n        Self::new(\"doesn't matter\")\n    }\n}\n\nimpl fmt::Debug for TypeErasedBox {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        f.write_str(\"TypeErasedBox[\")?;\n        if self.clone.is_some() {\n            f.write_str(\"Clone\")?;\n        } else {\n            f.write_str(\"!Clone\")?;\n        }\n        f.write_str(\"]:\")?;\n        (self.debug)(&self.field, f)\n    }\n}\n\nimpl TypeErasedBox {\n    /// Create a new `TypeErasedBox` from `value` of type `T`\n    pub fn new<T: Send + Sync + fmt::Debug + 'static>(value: T) -> Self {\n        let debug = |value: &Box<dyn Any + Send + Sync>, f: &mut fmt::Formatter<'_>| {\n            fmt::Debug::fmt(value.downcast_ref::<T>().expect(\"type-checked\"), f)\n        };\n        Self {\n            field: Box::new(value),\n            debug: Arc::new(debug),\n            clone: None,\n        }\n    }\n\n    /// Create a new cloneable `TypeErasedBox` from the given `value`.\n    pub fn new_with_clone<T: Send + Sync + Clone + fmt::Debug + 'static>(value: T) -> Self {\n        let debug = |value: &Box<dyn Any + Send + Sync>, f: &mut fmt::Formatter<'_>| {\n            fmt::Debug::fmt(value.downcast_ref::<T>().expect(\"type-checked\"), f)\n        };\n        let clone = |value: &Box<dyn Any + Send + Sync>| {\n            TypeErasedBox::new_with_clone(value.downcast_ref::<T>().expect(\"typechecked\").clone())\n        };\n        Self {\n            field: Box::new(value),\n            debug: Arc::new(debug),\n            clone: Some(Arc::new(clone)),\n        }\n    }\n\n    /// Attempts to clone this box.\n    ///\n    /// Note: this will only ever succeed if the box was created with [`TypeErasedBox::new_with_clone`].\n    pub fn try_clone(&self) -> Option<Self> {\n        Some((self.clone.as_ref()?)(&self.field))\n    }\n\n    /// Downcast into a `Box<T>`, or return `Self` if it is not a `T`.\n    pub fn downcast<T: fmt::Debug + Send + Sync + 'static>(self) -> Result<Box<T>, Self> {\n        let TypeErasedBox {\n            field,\n            debug,\n            clone,\n        } = self;\n        field.downcast().map_err(|field| Self {\n            field,\n            debug,\n            clone,\n        })\n    }\n\n    /// Downcast as a `&T`, or return `None` if it is not a `T`.\n    pub fn downcast_ref<T: fmt::Debug + Send + Sync + 'static>(&self) -> Option<&T> {\n        self.field.downcast_ref()\n    }\n\n    /// Downcast as a `&mut T`, or return `None` if it is not a `T`.\n    pub fn downcast_mut<T: fmt::Debug + Send + Sync + 'static>(&mut self) -> Option<&mut T> {\n        self.field.downcast_mut()\n    }\n}\n\nimpl From<TypeErasedError> for TypeErasedBox {\n    fn from(value: TypeErasedError) -> Self {\n        TypeErasedBox {\n            field: value.field,\n            debug: value.debug,\n            clone: None,\n        }\n    }\n}\n\n/// A new-type around `Box<dyn Error + Debug + Send + Sync>` that also implements `Error`\npub struct TypeErasedError {\n    field: Box<dyn Any + Send + Sync>,\n    #[allow(clippy::type_complexity)]\n    debug: Arc<\n        dyn Fn(&Box<dyn Any + Send + Sync>, &mut fmt::Formatter<'_>) -> fmt::Result + Send + Sync,\n    >,\n    #[allow(clippy::type_complexity)]\n    as_error: Box<dyn for<'a> Fn(&'a TypeErasedError) -> &'a (dyn StdError) + Send + Sync>,\n}\n\nimpl fmt::Debug for TypeErasedError {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        f.write_str(\"TypeErasedError:\")?;\n        (self.debug)(&self.field, f)\n    }\n}\n\nimpl fmt::Display for TypeErasedError {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        fmt::Display::fmt((self.as_error)(self), f)\n    }\n}\n\nimpl StdError for TypeErasedError {\n    fn source(&self) -> Option<&(dyn StdError + 'static)> {\n        (self.as_error)(self).source()\n    }\n}\n\nimpl TypeErasedError {\n    /// Create a new `TypeErasedError` from `value` of type `T`\n    pub fn new<T: StdError + Send + Sync + fmt::Debug + 'static>(value: T) -> Self {\n        let debug = |value: &Box<dyn Any + Send + Sync>, f: &mut fmt::Formatter<'_>| {\n            fmt::Debug::fmt(value.downcast_ref::<T>().expect(\"typechecked\"), f)\n        };\n        Self {\n            field: Box::new(value),\n            debug: Arc::new(debug),\n            as_error: Box::new(|value: &TypeErasedError| {\n                value.downcast_ref::<T>().expect(\"typechecked\") as _\n            }),\n        }\n    }\n\n    /// Downcast into a `Box<T>`, or return `Self` if it is not a `T`.\n    pub fn downcast<T: StdError + fmt::Debug + Send + Sync + 'static>(\n        self,\n    ) -> Result<Box<T>, Self> {\n        let TypeErasedError {\n            field,\n            debug,\n            as_error,\n        } = self;\n        field.downcast().map_err(|field| Self {\n            field,\n            debug,\n            as_error,\n        })\n    }\n\n    /// Downcast as a `&T`, or return `None` if it is not a `T`.\n    pub fn downcast_ref<T: StdError + fmt::Debug + Send + Sync + 'static>(&self) -> Option<&T> {\n        self.field.downcast_ref()\n    }\n\n    /// Downcast as a `&mut T`, or return `None` if it is not a `T`.\n    pub fn downcast_mut<T: StdError + fmt::Debug + Send + Sync + 'static>(\n        &mut self,\n    ) -> Option<&mut T> {\n        self.field.downcast_mut()\n    }\n\n    /// Returns a `TypeErasedError` with a fake/test value with the expectation that it won't be downcast in the test.\n    #[cfg(feature = \"test-util\")]\n    pub fn doesnt_matter() -> Self {\n        #[derive(Debug)]\n        struct FakeError;\n        impl fmt::Display for FakeError {\n            fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n                write!(f, \"FakeError\")\n            }\n        }\n        impl StdError for FakeError {}\n        Self::new(FakeError)\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::{TypeErasedBox, TypeErasedError};\n    use std::fmt;\n\n    #[derive(Debug, Clone, PartialEq, Eq)]\n    struct TestErr {\n        inner: &'static str,\n    }\n\n    impl TestErr {\n        fn new(inner: &'static str) -> Self {\n            Self { inner }\n        }\n    }\n\n    impl fmt::Display for TestErr {\n        fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n            write!(f, \"Error: {}\", self.inner)\n        }\n    }\n\n    impl std::error::Error for TestErr {}\n\n    #[test]\n    fn test_typed_erased_errors_can_be_downcast() {\n        let test_err = TestErr::new(\"something failed!\");\n        let type_erased_test_err = TypeErasedError::new(test_err.clone());\n        let actual = type_erased_test_err\n            .downcast::<TestErr>()\n            .expect(\"type erased error can be downcast into original type\");\n        assert_eq!(test_err, *actual);\n    }\n\n    #[test]\n    fn test_typed_erased_errors_can_be_unwrapped() {\n        let test_err = TestErr::new(\"something failed!\");\n        let type_erased_test_err = TypeErasedError::new(test_err.clone());\n        let actual = *type_erased_test_err\n            .downcast::<TestErr>()\n            .expect(\"type erased error can be downcast into original type\");\n        assert_eq!(test_err, actual);\n    }\n\n    #[test]\n    fn test_typed_cloneable_boxes() {\n        let expected_str = \"I can be cloned\";\n        let cloneable = TypeErasedBox::new_with_clone(expected_str.to_owned());\n        // ensure it can be cloned\n        let cloned = cloneable.try_clone().unwrap();\n        let actual_str = cloned.downcast_ref::<String>().unwrap();\n        assert_eq!(expected_str, actual_str);\n        // they should point to different addresses\n        assert_ne!(format!(\"{expected_str:p}\"), format! {\"{actual_str:p}\"});\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-types/test_data/date_time_format_test_suite.json",
    "content": "{\n  \"description\": [\n      \"This file holds format and parse test cases for Smithy's built-in `epoch-seconds`,\",\n      \"`http-date`, and `date-time` timestamp formats.\",\n      \"\",\n      \"There are six top-level sections:\",\n      \" - `format_epoch_seconds`: Test cases for formatting timestamps into `epoch-seconds`\",\n      \" - `format_http_date`: Test cases for formatting timestamps into `http-date`\",\n      \" - `format_date_time`: Test cases for formatting timestamps into `date-time`\",\n      \" - `parse_epoch_seconds`: Test cases for parsing timestamps from `epoch-seconds`\",\n      \" - `parse_http_date`: Test cases for parsing timestamps from `http-date`\",\n      \" - `parse_date_time`: Test cases for parsing timestamps from `date-time`\",\n      \"\",\n      \"Each top-level section is an array of the same test case data structure:\",\n      \"```typescript\",\n      \"type TestCase = {\",\n      \"    // Human-readable ISO-8601 representation of the canonical date-time. This should not\",\n      \"    // be used by tests, and is only present to make test failures more human readable.\",\n      \"    iso8601: string,\",\n      \"    \",\n      \"    // The canonical number of seconds since the Unix epoch in UTC.\",\n      \"    canonical_seconds: string,\",\n      \"    \",\n      \"    // The canonical nanosecond adjustment to the canonical number of seconds.\",\n      \"    // If conversion from (canonical_seconds, canonical_nanos) into a 128-bit integer is required,\",\n      \"    // DO NOT just add the two together as this will yield an incorrect value when\",\n      \"    // canonical_seconds is negative.\",\n      \"    canonical_nanos: number,\",\n      \"    \",\n      \"    // Will be true if this test case is expected to result in an error or exception\",\n      \"    error: boolean,\",\n      \"    \",\n      \"    // String value of the timestamp in the Smithy format. For the `format_epoch_seconds` top-level,\",\n      \"    // this will be in the `epoch-seconds` format, and for `parse_http_date`, it will be in the\",\n      \"    // `http-date` format (and so on).\",\n      \"    // \",\n      \"    // For parsing tests, parse this value and compare the result against canonical_seconds\",\n      \"    // and canonical_nanos.\",\n      \"    //\",\n      \"    // For formatting tests, form the canonical_seconds and canonical_nanos, and then compare\",\n      \"    // the result against this value.\",\n      \"    //\",\n      \"    // This value will not be set for formatting tests if `error` is set to `true`.\",\n      \"    smithy_format_value: string,\",\n      \"}\",\n      \"```\"\n  ],\n  \"format_epoch_seconds\": [\n      {\n          \"iso8601\": \"-9999-01-20T23:47:31.00001Z\",\n          \"canonical_seconds\": \"-377703389549\",\n          \"canonical_nanos\": 10000,\n          \"error\": false,\n          \"smithy_format_value\": \"-377703389549.00001\"\n      },\n      {\n          \"iso8601\": \"-9999-02-21T00:48:24.0001Z\",\n          \"canonical_seconds\": \"-377700707496\",\n          \"canonical_nanos\": 100000,\n          \"error\": false,\n          \"smithy_format_value\": \"-377700707496.0001\"\n      },\n      {\n          \"iso8601\": \"-9999-03-22T01:49:17.000234Z\",\n          \"canonical_seconds\": \"-377698198243\",\n          \"canonical_nanos\": 234000,\n          \"error\": false,\n          \"smithy_format_value\": \"-377698198243.000234\"\n      },\n      {\n          \"iso8601\": \"-9999-04-21T02:50:10Z\",\n          \"canonical_seconds\": \"-377695602590\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"-377695602590\"\n      },\n      {\n          \"iso8601\": \"-9999-05-24T03:51:03.000001Z\",\n          \"canonical_seconds\": \"-377692747737\",\n          \"canonical_nanos\": 1000,\n          \"error\": false,\n          \"smithy_format_value\": \"-377692747737.000001\"\n      },\n      {\n          \"iso8601\": \"-9999-06-23T04:52:56.00001Z\",\n          \"canonical_seconds\": \"-377690152024\",\n          \"canonical_nanos\": 10000,\n          \"error\": false,\n          \"smithy_format_value\": \"-377690152024.00001\"\n      },\n      {\n          \"iso8601\": \"-9999-07-26T05:53:49.0001Z\",\n          \"canonical_seconds\": \"-377687297171\",\n          \"canonical_nanos\": 100000,\n          \"error\": false,\n          \"smithy_format_value\": \"-377687297171.0001\"\n      },\n      {\n          \"iso8601\": \"-9999-08-27T06:54:42.000234Z\",\n          \"canonical_seconds\": \"-377684528718\",\n          \"canonical_nanos\": 234000,\n          \"error\": false,\n          \"smithy_format_value\": \"-377684528718.000234\"\n      },\n      {\n          \"iso8601\": \"-9999-09-26T07:55:35Z\",\n          \"canonical_seconds\": \"-377681933065\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"-377681933065\"\n      },\n      {\n          \"iso8601\": \"-9999-10-29T08:56:28.000001Z\",\n          \"canonical_seconds\": \"-377679078212\",\n          \"canonical_nanos\": 1000,\n          \"error\": false,\n          \"smithy_format_value\": \"-377679078212.000001\"\n      },\n      {\n          \"iso8601\": \"-9999-11-28T09:57:21.00001Z\",\n          \"canonical_seconds\": \"-377676482559\",\n          \"canonical_nanos\": 10000,\n          \"error\": false,\n          \"smithy_format_value\": \"-377676482559.00001\"\n      },\n      {\n          \"iso8601\": \"-9999-12-31T10:58:14.0001Z\",\n          \"canonical_seconds\": \"-377673627706\",\n          \"canonical_nanos\": 100000,\n          \"error\": false,\n          \"smithy_format_value\": \"-377673627706.0001\"\n      },\n      {\n          \"iso8601\": \"-0100-01-01T11:59:07.000234Z\",\n          \"canonical_seconds\": \"-65322849653\",\n          \"canonical_nanos\": 234000,\n          \"error\": false,\n          \"smithy_format_value\": \"-65322849653.000234\"\n      },\n      {\n          \"iso8601\": \"-0100-02-05T12:00:00Z\",\n          \"canonical_seconds\": \"-65319825600\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"-65319825600\"\n      },\n      {\n          \"iso8601\": \"-0100-03-03T13:01:53.000001Z\",\n          \"canonical_seconds\": \"-65317575487\",\n          \"canonical_nanos\": 1000,\n          \"error\": false,\n          \"smithy_format_value\": \"-65317575487.000001\"\n      },\n      {\n          \"iso8601\": \"-0100-04-03T14:02:46.00001Z\",\n          \"canonical_seconds\": \"-65314893434\",\n          \"canonical_nanos\": 10000,\n          \"error\": false,\n          \"smithy_format_value\": \"-65314893434.00001\"\n      },\n      {\n          \"iso8601\": \"-0100-05-05T15:03:39.0001Z\",\n          \"canonical_seconds\": \"-65312124981\",\n          \"canonical_nanos\": 100000,\n          \"error\": false,\n          \"smithy_format_value\": \"-65312124981.0001\"\n      },\n      {\n          \"iso8601\": \"-0100-06-05T16:04:32.000234Z\",\n          \"canonical_seconds\": \"-65309442928\",\n          \"canonical_nanos\": 234000,\n          \"error\": false,\n          \"smithy_format_value\": \"-65309442928.000234\"\n      },\n      {\n          \"iso8601\": \"-0100-07-07T17:05:25Z\",\n          \"canonical_seconds\": \"-65306674475\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"-65306674475\"\n      },\n      {\n          \"iso8601\": \"-0100-08-08T18:06:18.000001Z\",\n          \"canonical_seconds\": \"-65303906022\",\n          \"canonical_nanos\": 1000,\n          \"error\": false,\n          \"smithy_format_value\": \"-65303906022.000001\"\n      },\n      {\n          \"iso8601\": \"-0100-09-08T19:07:11.00001Z\",\n          \"canonical_seconds\": \"-65301223969\",\n          \"canonical_nanos\": 10000,\n          \"error\": false,\n          \"smithy_format_value\": \"-65301223969.00001\"\n      },\n      {\n          \"iso8601\": \"-0100-10-10T20:08:04.0001Z\",\n          \"canonical_seconds\": \"-65298455516\",\n          \"canonical_nanos\": 100000,\n          \"error\": false,\n          \"smithy_format_value\": \"-65298455516.0001\"\n      },\n      {\n          \"iso8601\": \"-0100-11-10T21:09:57.000234Z\",\n          \"canonical_seconds\": \"-65295773403\",\n          \"canonical_nanos\": 234000,\n          \"error\": false,\n          \"smithy_format_value\": \"-65295773403.000234\"\n      },\n      {\n          \"iso8601\": \"-0100-12-12T22:10:50Z\",\n          \"canonical_seconds\": \"-65293004950\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"-65293004950\"\n      },\n      {\n          \"iso8601\": \"-0001-01-13T23:11:43.000001Z\",\n          \"canonical_seconds\": \"-62197634897\",\n          \"canonical_nanos\": 1000,\n          \"error\": false,\n          \"smithy_format_value\": \"-62197634897.000001\"\n      },\n      {\n          \"iso8601\": \"-0001-02-17T00:12:36.00001Z\",\n          \"canonical_seconds\": \"-62194693644\",\n          \"canonical_nanos\": 10000,\n          \"error\": false,\n          \"smithy_format_value\": \"-62194693644.00001\"\n      },\n      {\n          \"iso8601\": \"-0001-03-15T01:13:29.0001Z\",\n          \"canonical_seconds\": \"-62192443591\",\n          \"canonical_nanos\": 100000,\n          \"error\": false,\n          \"smithy_format_value\": \"-62192443591.0001\"\n      },\n      {\n          \"iso8601\": \"-0001-04-15T02:14:22.000234Z\",\n          \"canonical_seconds\": \"-62189761538\",\n          \"canonical_nanos\": 234000,\n          \"error\": false,\n          \"smithy_format_value\": \"-62189761538.000234\"\n      },\n      {\n          \"iso8601\": \"-0001-05-17T03:15:15Z\",\n          \"canonical_seconds\": \"-62186993085\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"-62186993085\"\n      },\n      {\n          \"iso8601\": \"-0001-06-17T04:16:08.000001Z\",\n          \"canonical_seconds\": \"-62184311032\",\n          \"canonical_nanos\": 1000,\n          \"error\": false,\n          \"smithy_format_value\": \"-62184311032.000001\"\n      },\n      {\n          \"iso8601\": \"-0001-07-19T05:17:01.00001Z\",\n          \"canonical_seconds\": \"-62181542579\",\n          \"canonical_nanos\": 10000,\n          \"error\": false,\n          \"smithy_format_value\": \"-62181542579.00001\"\n      },\n      {\n          \"iso8601\": \"-0001-08-20T06:18:54.0001Z\",\n          \"canonical_seconds\": \"-62178774066\",\n          \"canonical_nanos\": 100000,\n          \"error\": false,\n          \"smithy_format_value\": \"-62178774066.0001\"\n      },\n      {\n          \"iso8601\": \"-0001-09-20T07:19:47.000234Z\",\n          \"canonical_seconds\": \"-62176092013\",\n          \"canonical_nanos\": 234000,\n          \"error\": false,\n          \"smithy_format_value\": \"-62176092013.000234\"\n      },\n      {\n          \"iso8601\": \"-0001-10-22T08:20:40Z\",\n          \"canonical_seconds\": \"-62173323560\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"-62173323560\"\n      },\n      {\n          \"iso8601\": \"-0001-11-22T09:21:33.000001Z\",\n          \"canonical_seconds\": \"-62170641507\",\n          \"canonical_nanos\": 1000,\n          \"error\": false,\n          \"smithy_format_value\": \"-62170641507.000001\"\n      },\n      {\n          \"iso8601\": \"-0001-12-24T10:22:26.00001Z\",\n          \"canonical_seconds\": \"-62167873054\",\n          \"canonical_nanos\": 10000,\n          \"error\": false,\n          \"smithy_format_value\": \"-62167873054.00001\"\n      },\n      {\n          \"iso8601\": \"0001-01-25T11:23:19.0001Z\",\n          \"canonical_seconds\": \"-62133482201\",\n          \"canonical_nanos\": 100000,\n          \"error\": false,\n          \"smithy_format_value\": \"-62133482201.0001\"\n      },\n      {\n          \"iso8601\": \"0001-02-01T12:24:12.000234Z\",\n          \"canonical_seconds\": \"-62132873748\",\n          \"canonical_nanos\": 234000,\n          \"error\": false,\n          \"smithy_format_value\": \"-62132873748.000234\"\n      },\n      {\n          \"iso8601\": \"0001-03-27T13:25:05Z\",\n          \"canonical_seconds\": \"-62128204495\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"-62128204495\"\n      },\n      {\n          \"iso8601\": \"0001-04-27T14:26:58.000001Z\",\n          \"canonical_seconds\": \"-62125522382\",\n          \"canonical_nanos\": 1000,\n          \"error\": false,\n          \"smithy_format_value\": \"-62125522382.000001\"\n      },\n      {\n          \"iso8601\": \"0001-05-29T15:27:51.00001Z\",\n          \"canonical_seconds\": \"-62122753929\",\n          \"canonical_nanos\": 10000,\n          \"error\": false,\n          \"smithy_format_value\": \"-62122753929.00001\"\n      },\n      {\n          \"iso8601\": \"0001-06-29T16:28:44.0001Z\",\n          \"canonical_seconds\": \"-62120071876\",\n          \"canonical_nanos\": 100000,\n          \"error\": false,\n          \"smithy_format_value\": \"-62120071876.0001\"\n      },\n      {\n          \"iso8601\": \"0001-07-31T17:29:37.000234Z\",\n          \"canonical_seconds\": \"-62117303423\",\n          \"canonical_nanos\": 234000,\n          \"error\": false,\n          \"smithy_format_value\": \"-62117303423.000234\"\n      },\n      {\n          \"iso8601\": \"0001-08-01T18:30:30Z\",\n          \"canonical_seconds\": \"-62117213370\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"-62117213370\"\n      },\n      {\n          \"iso8601\": \"0001-09-02T19:31:23.000001Z\",\n          \"canonical_seconds\": \"-62114444917\",\n          \"canonical_nanos\": 1000,\n          \"error\": false,\n          \"smithy_format_value\": \"-62114444917.000001\"\n      },\n      {\n          \"iso8601\": \"0001-10-03T20:32:16.00001Z\",\n          \"canonical_seconds\": \"-62111762864\",\n          \"canonical_nanos\": 10000,\n          \"error\": false,\n          \"smithy_format_value\": \"-62111762864.00001\"\n      },\n      {\n          \"iso8601\": \"0001-11-04T21:33:09.0001Z\",\n          \"canonical_seconds\": \"-62108994411\",\n          \"canonical_nanos\": 100000,\n          \"error\": false,\n          \"smithy_format_value\": \"-62108994411.0001\"\n      },\n      {\n          \"iso8601\": \"0001-12-05T22:34:02.000234Z\",\n          \"canonical_seconds\": \"-62106312358\",\n          \"canonical_nanos\": 234000,\n          \"error\": false,\n          \"smithy_format_value\": \"-62106312358.000234\"\n      },\n      {\n          \"iso8601\": \"0100-01-06T23:35:55Z\",\n          \"canonical_seconds\": \"-59010942245\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"-59010942245\"\n      },\n      {\n          \"iso8601\": \"0100-02-13T00:36:48.000001Z\",\n          \"canonical_seconds\": \"-59007741792\",\n          \"canonical_nanos\": 1000,\n          \"error\": false,\n          \"smithy_format_value\": \"-59007741792.000001\"\n      },\n      {\n          \"iso8601\": \"0100-03-08T01:37:41.00001Z\",\n          \"canonical_seconds\": \"-59005750939\",\n          \"canonical_nanos\": 10000,\n          \"error\": false,\n          \"smithy_format_value\": \"-59005750939.00001\"\n      },\n      {\n          \"iso8601\": \"0100-04-09T02:38:34.0001Z\",\n          \"canonical_seconds\": \"-59002982486\",\n          \"canonical_nanos\": 100000,\n          \"error\": false,\n          \"smithy_format_value\": \"-59002982486.0001\"\n      },\n      {\n          \"iso8601\": \"0100-05-10T03:39:27.000234Z\",\n          \"canonical_seconds\": \"-59000300433\",\n          \"canonical_nanos\": 234000,\n          \"error\": false,\n          \"smithy_format_value\": \"-59000300433.000234\"\n      },\n      {\n          \"iso8601\": \"0100-06-11T04:40:20Z\",\n          \"canonical_seconds\": \"-58997531980\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"-58997531980\"\n      },\n      {\n          \"iso8601\": \"0100-07-12T05:41:13.000001Z\",\n          \"canonical_seconds\": \"-58994849927\",\n          \"canonical_nanos\": 1000,\n          \"error\": false,\n          \"smithy_format_value\": \"-58994849927.000001\"\n      },\n      {\n          \"iso8601\": \"0100-08-13T06:42:06.00001Z\",\n          \"canonical_seconds\": \"-58992081474\",\n          \"canonical_nanos\": 10000,\n          \"error\": false,\n          \"smithy_format_value\": \"-58992081474.00001\"\n      },\n      {\n          \"iso8601\": \"0100-09-14T07:43:59.0001Z\",\n          \"canonical_seconds\": \"-58989312961\",\n          \"canonical_nanos\": 100000,\n          \"error\": false,\n          \"smithy_format_value\": \"-58989312961.0001\"\n      },\n      {\n          \"iso8601\": \"0100-10-15T08:44:52.000234Z\",\n          \"canonical_seconds\": \"-58986630908\",\n          \"canonical_nanos\": 234000,\n          \"error\": false,\n          \"smithy_format_value\": \"-58986630908.000234\"\n      },\n      {\n          \"iso8601\": \"0100-11-16T09:45:45Z\",\n          \"canonical_seconds\": \"-58983862455\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"-58983862455\"\n      },\n      {\n          \"iso8601\": \"0100-12-17T10:46:38.000001Z\",\n          \"canonical_seconds\": \"-58981180402\",\n          \"canonical_nanos\": 1000,\n          \"error\": false,\n          \"smithy_format_value\": \"-58981180402.000001\"\n      },\n      {\n          \"iso8601\": \"1584-02-29T23:59:59.999Z\",\n          \"canonical_seconds\": \"-12175833601\",\n          \"canonical_nanos\": 999000000,\n          \"error\": false,\n          \"smithy_format_value\": \"-12175833601.999\"\n      },\n      {\n          \"iso8601\": \"1969-01-18T11:47:31.00001Z\",\n          \"canonical_seconds\": \"-30024749\",\n          \"canonical_nanos\": 10000,\n          \"error\": false,\n          \"smithy_format_value\": \"-30024749.00001\"\n      },\n      {\n          \"iso8601\": \"1969-02-25T12:48:24.0001Z\",\n          \"canonical_seconds\": \"-26737896\",\n          \"canonical_nanos\": 100000,\n          \"error\": false,\n          \"smithy_format_value\": \"-26737896.0001\"\n      },\n      {\n          \"iso8601\": \"1969-03-20T13:49:17.000234Z\",\n          \"canonical_seconds\": \"-24747043\",\n          \"canonical_nanos\": 234000,\n          \"error\": false,\n          \"smithy_format_value\": \"-24747043.000234\"\n      },\n      {\n          \"iso8601\": \"1969-04-21T14:50:10Z\",\n          \"canonical_seconds\": \"-21978590\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"-21978590\"\n      },\n      {\n          \"iso8601\": \"1969-05-22T15:51:03.000001Z\",\n          \"canonical_seconds\": \"-19296537\",\n          \"canonical_nanos\": 1000,\n          \"error\": false,\n          \"smithy_format_value\": \"-19296537.000001\"\n      },\n      {\n          \"iso8601\": \"1969-06-23T16:52:56.00001Z\",\n          \"canonical_seconds\": \"-16528024\",\n          \"canonical_nanos\": 10000,\n          \"error\": false,\n          \"smithy_format_value\": \"-16528024.00001\"\n      },\n      {\n          \"iso8601\": \"1969-07-24T17:53:49.0001Z\",\n          \"canonical_seconds\": \"-13845971\",\n          \"canonical_nanos\": 100000,\n          \"error\": false,\n          \"smithy_format_value\": \"-13845971.0001\"\n      },\n      {\n          \"iso8601\": \"1969-08-25T18:54:42.000234Z\",\n          \"canonical_seconds\": \"-11077518\",\n          \"canonical_nanos\": 234000,\n          \"error\": false,\n          \"smithy_format_value\": \"-11077518.000234\"\n      },\n      {\n          \"iso8601\": \"1969-09-26T19:55:35Z\",\n          \"canonical_seconds\": \"-8309065\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"-8309065\"\n      },\n      {\n          \"iso8601\": \"1969-10-27T20:56:28.000001Z\",\n          \"canonical_seconds\": \"-5627012\",\n          \"canonical_nanos\": 1000,\n          \"error\": false,\n          \"smithy_format_value\": \"-5627012.000001\"\n      },\n      {\n          \"iso8601\": \"1969-11-28T21:57:21.00001Z\",\n          \"canonical_seconds\": \"-2858559\",\n          \"canonical_nanos\": 10000,\n          \"error\": false,\n          \"smithy_format_value\": \"-2858559.00001\"\n      },\n      {\n          \"iso8601\": \"1969-12-29T22:58:14.0001Z\",\n          \"canonical_seconds\": \"-176506\",\n          \"canonical_nanos\": 100000,\n          \"error\": false,\n          \"smithy_format_value\": \"-176506.0001\"\n      },\n      {\n          \"iso8601\": \"1970-01-30T23:59:07.000234Z\",\n          \"canonical_seconds\": \"2591947\",\n          \"canonical_nanos\": 234000,\n          \"error\": false,\n          \"smithy_format_value\": \"2591947.000234\"\n      },\n      {\n          \"iso8601\": \"1970-02-09T00:00:00Z\",\n          \"canonical_seconds\": \"3369600\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"3369600\"\n      },\n      {\n          \"iso8601\": \"1970-03-01T01:01:53.000001Z\",\n          \"canonical_seconds\": \"5101313\",\n          \"canonical_nanos\": 1000,\n          \"error\": false,\n          \"smithy_format_value\": \"5101313.000001\"\n      },\n      {\n          \"iso8601\": \"1970-04-03T02:02:46.00001Z\",\n          \"canonical_seconds\": \"7956166\",\n          \"canonical_nanos\": 10000,\n          \"error\": false,\n          \"smithy_format_value\": \"7956166.00001\"\n      },\n      {\n          \"iso8601\": \"1970-05-03T03:03:39.0001Z\",\n          \"canonical_seconds\": \"10551819\",\n          \"canonical_nanos\": 100000,\n          \"error\": false,\n          \"smithy_format_value\": \"10551819.0001\"\n      },\n      {\n          \"iso8601\": \"1970-06-05T04:04:32.000234Z\",\n          \"canonical_seconds\": \"13406672\",\n          \"canonical_nanos\": 234000,\n          \"error\": false,\n          \"smithy_format_value\": \"13406672.000234\"\n      },\n      {\n          \"iso8601\": \"1970-07-05T05:05:25Z\",\n          \"canonical_seconds\": \"16002325\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"16002325\"\n      },\n      {\n          \"iso8601\": \"1970-08-06T06:06:18.000001Z\",\n          \"canonical_seconds\": \"18770778\",\n          \"canonical_nanos\": 1000,\n          \"error\": false,\n          \"smithy_format_value\": \"18770778.000001\"\n      },\n      {\n          \"iso8601\": \"1970-09-08T07:07:11.00001Z\",\n          \"canonical_seconds\": \"21625631\",\n          \"canonical_nanos\": 10000,\n          \"error\": false,\n          \"smithy_format_value\": \"21625631.00001\"\n      },\n      {\n          \"iso8601\": \"1970-10-08T08:08:04.0001Z\",\n          \"canonical_seconds\": \"24221284\",\n          \"canonical_nanos\": 100000,\n          \"error\": false,\n          \"smithy_format_value\": \"24221284.0001\"\n      },\n      {\n          \"iso8601\": \"1970-11-10T09:09:57.000234Z\",\n          \"canonical_seconds\": \"27076197\",\n          \"canonical_nanos\": 234000,\n          \"error\": false,\n          \"smithy_format_value\": \"27076197.000234\"\n      },\n      {\n          \"iso8601\": \"1970-12-10T10:10:50Z\",\n          \"canonical_seconds\": \"29671850\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"29671850\"\n      },\n      {\n          \"iso8601\": \"2004-02-29T23:59:59.999Z\",\n          \"canonical_seconds\": \"1078099199\",\n          \"canonical_nanos\": 999000000,\n          \"error\": false,\n          \"smithy_format_value\": \"1078099199.999\"\n      },\n      {\n          \"iso8601\": \"2037-01-11T11:11:43.000001Z\",\n          \"canonical_seconds\": \"2115285103\",\n          \"canonical_nanos\": 1000,\n          \"error\": false,\n          \"smithy_format_value\": \"2115285103.000001\"\n      },\n      {\n          \"iso8601\": \"2037-02-21T12:12:36.00001Z\",\n          \"canonical_seconds\": \"2118831156\",\n          \"canonical_nanos\": 10000,\n          \"error\": false,\n          \"smithy_format_value\": \"2118831156.00001\"\n      },\n      {\n          \"iso8601\": \"2037-03-13T13:13:29.0001Z\",\n          \"canonical_seconds\": \"2120562809\",\n          \"canonical_nanos\": 100000,\n          \"error\": false,\n          \"smithy_format_value\": \"2120562809.0001\"\n      },\n      {\n          \"iso8601\": \"2037-04-15T14:14:22.000234Z\",\n          \"canonical_seconds\": \"2123417662\",\n          \"canonical_nanos\": 234000,\n          \"error\": false,\n          \"smithy_format_value\": \"2123417662.000234\"\n      },\n      {\n          \"iso8601\": \"2037-05-15T15:15:15Z\",\n          \"canonical_seconds\": \"2126013315\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"2126013315\"\n      },\n      {\n          \"iso8601\": \"2037-06-17T16:16:08.000001Z\",\n          \"canonical_seconds\": \"2128868168\",\n          \"canonical_nanos\": 1000,\n          \"error\": false,\n          \"smithy_format_value\": \"2128868168.000001\"\n      },\n      {\n          \"iso8601\": \"2037-07-17T17:17:01.00001Z\",\n          \"canonical_seconds\": \"2131463821\",\n          \"canonical_nanos\": 10000,\n          \"error\": false,\n          \"smithy_format_value\": \"2131463821.00001\"\n      },\n      {\n          \"iso8601\": \"2037-08-18T18:18:54.0001Z\",\n          \"canonical_seconds\": \"2134232334\",\n          \"canonical_nanos\": 100000,\n          \"error\": false,\n          \"smithy_format_value\": \"2134232334.0001\"\n      },\n      {\n          \"iso8601\": \"2037-09-20T19:19:47.000234Z\",\n          \"canonical_seconds\": \"2137087187\",\n          \"canonical_nanos\": 234000,\n          \"error\": false,\n          \"smithy_format_value\": \"2137087187.000234\"\n      },\n      {\n          \"iso8601\": \"2037-10-20T20:20:40Z\",\n          \"canonical_seconds\": \"2139682840\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"2139682840\"\n      },\n      {\n          \"iso8601\": \"2037-11-22T21:21:33.000001Z\",\n          \"canonical_seconds\": \"2142537693\",\n          \"canonical_nanos\": 1000,\n          \"error\": false,\n          \"smithy_format_value\": \"2142537693.000001\"\n      },\n      {\n          \"iso8601\": \"2037-12-22T22:22:26.00001Z\",\n          \"canonical_seconds\": \"2145133346\",\n          \"canonical_nanos\": 10000,\n          \"error\": false,\n          \"smithy_format_value\": \"2145133346.00001\"\n      },\n      {\n          \"iso8601\": \"2038-01-23T23:23:19.0001Z\",\n          \"canonical_seconds\": \"2147901799\",\n          \"canonical_nanos\": 100000,\n          \"error\": false,\n          \"smithy_format_value\": \"2147901799.0001\"\n      },\n      {\n          \"iso8601\": \"2038-02-05T00:24:12.000234Z\",\n          \"canonical_seconds\": \"2148942252\",\n          \"canonical_nanos\": 234000,\n          \"error\": false,\n          \"smithy_format_value\": \"2148942252.000234\"\n      },\n      {\n          \"iso8601\": \"2038-03-25T01:25:05Z\",\n          \"canonical_seconds\": \"2153093105\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"2153093105\"\n      },\n      {\n          \"iso8601\": \"2038-04-27T02:26:58.000001Z\",\n          \"canonical_seconds\": \"2155948018\",\n          \"canonical_nanos\": 1000,\n          \"error\": false,\n          \"smithy_format_value\": \"2155948018.000001\"\n      },\n      {\n          \"iso8601\": \"2038-05-27T03:27:51.00001Z\",\n          \"canonical_seconds\": \"2158543671\",\n          \"canonical_nanos\": 10000,\n          \"error\": false,\n          \"smithy_format_value\": \"2158543671.00001\"\n      },\n      {\n          \"iso8601\": \"2038-06-29T04:28:44.0001Z\",\n          \"canonical_seconds\": \"2161398524\",\n          \"canonical_nanos\": 100000,\n          \"error\": false,\n          \"smithy_format_value\": \"2161398524.0001\"\n      },\n      {\n          \"iso8601\": \"2038-07-29T05:29:37.000234Z\",\n          \"canonical_seconds\": \"2163994177\",\n          \"canonical_nanos\": 234000,\n          \"error\": false,\n          \"smithy_format_value\": \"2163994177.000234\"\n      },\n      {\n          \"iso8601\": \"2038-08-30T06:30:30Z\",\n          \"canonical_seconds\": \"2166762630\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"2166762630\"\n      },\n      {\n          \"iso8601\": \"2038-09-02T07:31:23.000001Z\",\n          \"canonical_seconds\": \"2167025483\",\n          \"canonical_nanos\": 1000,\n          \"error\": false,\n          \"smithy_format_value\": \"2167025483.000001\"\n      },\n      {\n          \"iso8601\": \"2038-10-01T08:32:16.00001Z\",\n          \"canonical_seconds\": \"2169534736\",\n          \"canonical_nanos\": 10000,\n          \"error\": false,\n          \"smithy_format_value\": \"2169534736.00001\"\n      },\n      {\n          \"iso8601\": \"2038-11-04T09:33:09.0001Z\",\n          \"canonical_seconds\": \"2172475989\",\n          \"canonical_nanos\": 100000,\n          \"error\": false,\n          \"smithy_format_value\": \"2172475989.0001\"\n      },\n      {\n          \"iso8601\": \"2038-12-03T10:34:02.000234Z\",\n          \"canonical_seconds\": \"2174985242\",\n          \"canonical_nanos\": 234000,\n          \"error\": false,\n          \"smithy_format_value\": \"2174985242.000234\"\n      },\n      {\n          \"iso8601\": \"9999-01-04T11:35:55Z\",\n          \"canonical_seconds\": \"253371065755\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"253371065755\"\n      },\n      {\n          \"iso8601\": \"9999-02-17T12:36:48.000001Z\",\n          \"canonical_seconds\": \"253374871008\",\n          \"canonical_nanos\": 1000,\n          \"error\": false,\n          \"smithy_format_value\": \"253374871008.000001\"\n      },\n      {\n          \"iso8601\": \"9999-03-06T13:37:41.00001Z\",\n          \"canonical_seconds\": \"253376343461\",\n          \"canonical_nanos\": 10000,\n          \"error\": false,\n          \"smithy_format_value\": \"253376343461.00001\"\n      },\n      {\n          \"iso8601\": \"9999-04-09T14:38:34.0001Z\",\n          \"canonical_seconds\": \"253379284714\",\n          \"canonical_nanos\": 100000,\n          \"error\": false,\n          \"smithy_format_value\": \"253379284714.0001\"\n      },\n      {\n          \"iso8601\": \"9999-05-08T15:39:27.000234Z\",\n          \"canonical_seconds\": \"253381793967\",\n          \"canonical_nanos\": 234000,\n          \"error\": false,\n          \"smithy_format_value\": \"253381793967.000234\"\n      },\n      {\n          \"iso8601\": \"9999-06-11T16:40:20Z\",\n          \"canonical_seconds\": \"253384735220\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"253384735220\"\n      },\n      {\n          \"iso8601\": \"9999-07-10T17:41:13.000001Z\",\n          \"canonical_seconds\": \"253387244473\",\n          \"canonical_nanos\": 1000,\n          \"error\": false,\n          \"smithy_format_value\": \"253387244473.000001\"\n      },\n      {\n          \"iso8601\": \"9999-08-11T18:42:06.00001Z\",\n          \"canonical_seconds\": \"253390012926\",\n          \"canonical_nanos\": 10000,\n          \"error\": false,\n          \"smithy_format_value\": \"253390012926.00001\"\n      },\n      {\n          \"iso8601\": \"9999-09-14T19:43:59.0001Z\",\n          \"canonical_seconds\": \"253392954239\",\n          \"canonical_nanos\": 100000,\n          \"error\": false,\n          \"smithy_format_value\": \"253392954239.0001\"\n      },\n      {\n          \"iso8601\": \"9999-10-13T20:44:52.000234Z\",\n          \"canonical_seconds\": \"253395463492\",\n          \"canonical_nanos\": 234000,\n          \"error\": false,\n          \"smithy_format_value\": \"253395463492.000234\"\n      },\n      {\n          \"iso8601\": \"9999-11-16T21:45:45Z\",\n          \"canonical_seconds\": \"253398404745\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"253398404745\"\n      },\n      {\n          \"iso8601\": \"9999-12-15T22:46:38.000001Z\",\n          \"canonical_seconds\": \"253400913998\",\n          \"canonical_nanos\": 1000,\n          \"error\": false,\n          \"smithy_format_value\": \"253400913998.000001\"\n      }\n  ],\n  \"format_http_date\": [\n      {\n          \"iso8601\": \"-9999-01-20T23:47:31.001Z\",\n          \"canonical_seconds\": \"-377703389549\",\n          \"canonical_nanos\": 1000000,\n          \"error\": true\n      },\n      {\n          \"iso8601\": \"-9999-02-21T00:48:24.01Z\",\n          \"canonical_seconds\": \"-377700707496\",\n          \"canonical_nanos\": 10000000,\n          \"error\": true\n      },\n      {\n          \"iso8601\": \"-9999-03-22T01:49:17.1Z\",\n          \"canonical_seconds\": \"-377698198243\",\n          \"canonical_nanos\": 100000000,\n          \"error\": true\n      },\n      {\n          \"iso8601\": \"-9999-04-21T02:50:10.123456789Z\",\n          \"canonical_seconds\": \"-377695602590\",\n          \"canonical_nanos\": 123456789,\n          \"error\": true\n      },\n      {\n          \"iso8601\": \"-9999-05-24T03:51:03Z\",\n          \"canonical_seconds\": \"-377692747737\",\n          \"canonical_nanos\": 0,\n          \"error\": true\n      },\n      {\n          \"iso8601\": \"-9999-06-23T04:52:56.000000001Z\",\n          \"canonical_seconds\": \"-377690152024\",\n          \"canonical_nanos\": 1,\n          \"error\": true\n      },\n      {\n          \"iso8601\": \"-9999-07-26T05:53:49.00000001Z\",\n          \"canonical_seconds\": \"-377687297171\",\n          \"canonical_nanos\": 10,\n          \"error\": true\n      },\n      {\n          \"iso8601\": \"-9999-08-27T06:54:42.0000001Z\",\n          \"canonical_seconds\": \"-377684528718\",\n          \"canonical_nanos\": 100,\n          \"error\": true\n      },\n      {\n          \"iso8601\": \"-9999-09-26T07:55:35.000001Z\",\n          \"canonical_seconds\": \"-377681933065\",\n          \"canonical_nanos\": 1000,\n          \"error\": true\n      },\n      {\n          \"iso8601\": \"-9999-10-29T08:56:28.00001Z\",\n          \"canonical_seconds\": \"-377679078212\",\n          \"canonical_nanos\": 10000,\n          \"error\": true\n      },\n      {\n          \"iso8601\": \"-9999-11-28T09:57:21.0001Z\",\n          \"canonical_seconds\": \"-377676482559\",\n          \"canonical_nanos\": 100000,\n          \"error\": true\n      },\n      {\n          \"iso8601\": \"-9999-12-31T10:58:14.001Z\",\n          \"canonical_seconds\": \"-377673627706\",\n          \"canonical_nanos\": 1000000,\n          \"error\": true\n      },\n      {\n          \"iso8601\": \"-0100-01-01T11:59:07.01Z\",\n          \"canonical_seconds\": \"-65322849653\",\n          \"canonical_nanos\": 10000000,\n          \"error\": true\n      },\n      {\n          \"iso8601\": \"-0100-02-05T12:00:00.1Z\",\n          \"canonical_seconds\": \"-65319825600\",\n          \"canonical_nanos\": 100000000,\n          \"error\": true\n      },\n      {\n          \"iso8601\": \"-0100-03-03T13:01:53.123456789Z\",\n          \"canonical_seconds\": \"-65317575487\",\n          \"canonical_nanos\": 123456789,\n          \"error\": true\n      },\n      {\n          \"iso8601\": \"-0100-04-03T14:02:46Z\",\n          \"canonical_seconds\": \"-65314893434\",\n          \"canonical_nanos\": 0,\n          \"error\": true\n      },\n      {\n          \"iso8601\": \"-0100-05-05T15:03:39.000000001Z\",\n          \"canonical_seconds\": \"-65312124981\",\n          \"canonical_nanos\": 1,\n          \"error\": true\n      },\n      {\n          \"iso8601\": \"-0100-06-05T16:04:32.00000001Z\",\n          \"canonical_seconds\": \"-65309442928\",\n          \"canonical_nanos\": 10,\n          \"error\": true\n      },\n      {\n          \"iso8601\": \"-0100-07-07T17:05:25.0000001Z\",\n          \"canonical_seconds\": \"-65306674475\",\n          \"canonical_nanos\": 100,\n          \"error\": true\n      },\n      {\n          \"iso8601\": \"-0100-08-08T18:06:18.000001Z\",\n          \"canonical_seconds\": \"-65303906022\",\n          \"canonical_nanos\": 1000,\n          \"error\": true\n      },\n      {\n          \"iso8601\": \"-0100-09-08T19:07:11.00001Z\",\n          \"canonical_seconds\": \"-65301223969\",\n          \"canonical_nanos\": 10000,\n          \"error\": true\n      },\n      {\n          \"iso8601\": \"-0100-10-10T20:08:04.0001Z\",\n          \"canonical_seconds\": \"-65298455516\",\n          \"canonical_nanos\": 100000,\n          \"error\": true\n      },\n      {\n          \"iso8601\": \"-0100-11-10T21:09:57.001Z\",\n          \"canonical_seconds\": \"-65295773403\",\n          \"canonical_nanos\": 1000000,\n          \"error\": true\n      },\n      {\n          \"iso8601\": \"-0100-12-12T22:10:50.01Z\",\n          \"canonical_seconds\": \"-65293004950\",\n          \"canonical_nanos\": 10000000,\n          \"error\": true\n      },\n      {\n          \"iso8601\": \"-0001-01-13T23:11:43.1Z\",\n          \"canonical_seconds\": \"-62197634897\",\n          \"canonical_nanos\": 100000000,\n          \"error\": true\n      },\n      {\n          \"iso8601\": \"-0001-02-17T00:12:36.123456789Z\",\n          \"canonical_seconds\": \"-62194693644\",\n          \"canonical_nanos\": 123456789,\n          \"error\": true\n      },\n      {\n          \"iso8601\": \"-0001-03-15T01:13:29Z\",\n          \"canonical_seconds\": \"-62192443591\",\n          \"canonical_nanos\": 0,\n          \"error\": true\n      },\n      {\n          \"iso8601\": \"-0001-04-15T02:14:22.000000001Z\",\n          \"canonical_seconds\": \"-62189761538\",\n          \"canonical_nanos\": 1,\n          \"error\": true\n      },\n      {\n          \"iso8601\": \"-0001-05-17T03:15:15.00000001Z\",\n          \"canonical_seconds\": \"-62186993085\",\n          \"canonical_nanos\": 10,\n          \"error\": true\n      },\n      {\n          \"iso8601\": \"-0001-06-17T04:16:08.0000001Z\",\n          \"canonical_seconds\": \"-62184311032\",\n          \"canonical_nanos\": 100,\n          \"error\": true\n      },\n      {\n          \"iso8601\": \"-0001-07-19T05:17:01.000001Z\",\n          \"canonical_seconds\": \"-62181542579\",\n          \"canonical_nanos\": 1000,\n          \"error\": true\n      },\n      {\n          \"iso8601\": \"-0001-08-20T06:18:54.00001Z\",\n          \"canonical_seconds\": \"-62178774066\",\n          \"canonical_nanos\": 10000,\n          \"error\": true\n      },\n      {\n          \"iso8601\": \"-0001-09-20T07:19:47.0001Z\",\n          \"canonical_seconds\": \"-62176092013\",\n          \"canonical_nanos\": 100000,\n          \"error\": true\n      },\n      {\n          \"iso8601\": \"-0001-10-22T08:20:40.001Z\",\n          \"canonical_seconds\": \"-62173323560\",\n          \"canonical_nanos\": 1000000,\n          \"error\": true\n      },\n      {\n          \"iso8601\": \"-0001-11-22T09:21:33.01Z\",\n          \"canonical_seconds\": \"-62170641507\",\n          \"canonical_nanos\": 10000000,\n          \"error\": true\n      },\n      {\n          \"iso8601\": \"-0001-12-24T10:22:26.1Z\",\n          \"canonical_seconds\": \"-62167873054\",\n          \"canonical_nanos\": 100000000,\n          \"error\": true\n      },\n      {\n          \"iso8601\": \"0001-01-25T11:23:19.123456789Z\",\n          \"canonical_seconds\": \"-62133482201\",\n          \"canonical_nanos\": 123456789,\n          \"error\": false,\n          \"smithy_format_value\": \"Thu, 25 Jan 0001 11:23:19 GMT\"\n      },\n      {\n          \"iso8601\": \"0001-02-01T12:24:12Z\",\n          \"canonical_seconds\": \"-62132873748\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"Thu, 01 Feb 0001 12:24:12 GMT\"\n      },\n      {\n          \"iso8601\": \"0001-03-27T13:25:05.000000001Z\",\n          \"canonical_seconds\": \"-62128204495\",\n          \"canonical_nanos\": 1,\n          \"error\": false,\n          \"smithy_format_value\": \"Tue, 27 Mar 0001 13:25:05 GMT\"\n      },\n      {\n          \"iso8601\": \"0001-04-27T14:26:58.00000001Z\",\n          \"canonical_seconds\": \"-62125522382\",\n          \"canonical_nanos\": 10,\n          \"error\": false,\n          \"smithy_format_value\": \"Fri, 27 Apr 0001 14:26:58 GMT\"\n      },\n      {\n          \"iso8601\": \"0001-05-29T15:27:51.0000001Z\",\n          \"canonical_seconds\": \"-62122753929\",\n          \"canonical_nanos\": 100,\n          \"error\": false,\n          \"smithy_format_value\": \"Tue, 29 May 0001 15:27:51 GMT\"\n      },\n      {\n          \"iso8601\": \"0001-06-29T16:28:44.000001Z\",\n          \"canonical_seconds\": \"-62120071876\",\n          \"canonical_nanos\": 1000,\n          \"error\": false,\n          \"smithy_format_value\": \"Fri, 29 Jun 0001 16:28:44 GMT\"\n      },\n      {\n          \"iso8601\": \"0001-07-31T17:29:37.00001Z\",\n          \"canonical_seconds\": \"-62117303423\",\n          \"canonical_nanos\": 10000,\n          \"error\": false,\n          \"smithy_format_value\": \"Tue, 31 Jul 0001 17:29:37 GMT\"\n      },\n      {\n          \"iso8601\": \"0001-08-01T18:30:30.0001Z\",\n          \"canonical_seconds\": \"-62117213370\",\n          \"canonical_nanos\": 100000,\n          \"error\": false,\n          \"smithy_format_value\": \"Wed, 01 Aug 0001 18:30:30 GMT\"\n      },\n      {\n          \"iso8601\": \"0001-09-02T19:31:23.001Z\",\n          \"canonical_seconds\": \"-62114444917\",\n          \"canonical_nanos\": 1000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Sun, 02 Sep 0001 19:31:23 GMT\"\n      },\n      {\n          \"iso8601\": \"0001-10-03T20:32:16.01Z\",\n          \"canonical_seconds\": \"-62111762864\",\n          \"canonical_nanos\": 10000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Wed, 03 Oct 0001 20:32:16 GMT\"\n      },\n      {\n          \"iso8601\": \"0001-11-04T21:33:09.1Z\",\n          \"canonical_seconds\": \"-62108994411\",\n          \"canonical_nanos\": 100000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Sun, 04 Nov 0001 21:33:09 GMT\"\n      },\n      {\n          \"iso8601\": \"0001-12-05T22:34:02.123456789Z\",\n          \"canonical_seconds\": \"-62106312358\",\n          \"canonical_nanos\": 123456789,\n          \"error\": false,\n          \"smithy_format_value\": \"Wed, 05 Dec 0001 22:34:02 GMT\"\n      },\n      {\n          \"iso8601\": \"0100-01-06T23:35:55Z\",\n          \"canonical_seconds\": \"-59010942245\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"Wed, 06 Jan 0100 23:35:55 GMT\"\n      },\n      {\n          \"iso8601\": \"0100-02-13T00:36:48.000000001Z\",\n          \"canonical_seconds\": \"-59007741792\",\n          \"canonical_nanos\": 1,\n          \"error\": false,\n          \"smithy_format_value\": \"Sat, 13 Feb 0100 00:36:48 GMT\"\n      },\n      {\n          \"iso8601\": \"0100-03-08T01:37:41.00000001Z\",\n          \"canonical_seconds\": \"-59005750939\",\n          \"canonical_nanos\": 10,\n          \"error\": false,\n          \"smithy_format_value\": \"Mon, 08 Mar 0100 01:37:41 GMT\"\n      },\n      {\n          \"iso8601\": \"0100-04-09T02:38:34.0000001Z\",\n          \"canonical_seconds\": \"-59002982486\",\n          \"canonical_nanos\": 100,\n          \"error\": false,\n          \"smithy_format_value\": \"Fri, 09 Apr 0100 02:38:34 GMT\"\n      },\n      {\n          \"iso8601\": \"0100-05-10T03:39:27.000001Z\",\n          \"canonical_seconds\": \"-59000300433\",\n          \"canonical_nanos\": 1000,\n          \"error\": false,\n          \"smithy_format_value\": \"Mon, 10 May 0100 03:39:27 GMT\"\n      },\n      {\n          \"iso8601\": \"0100-06-11T04:40:20.00001Z\",\n          \"canonical_seconds\": \"-58997531980\",\n          \"canonical_nanos\": 10000,\n          \"error\": false,\n          \"smithy_format_value\": \"Fri, 11 Jun 0100 04:40:20 GMT\"\n      },\n      {\n          \"iso8601\": \"0100-07-12T05:41:13.0001Z\",\n          \"canonical_seconds\": \"-58994849927\",\n          \"canonical_nanos\": 100000,\n          \"error\": false,\n          \"smithy_format_value\": \"Mon, 12 Jul 0100 05:41:13 GMT\"\n      },\n      {\n          \"iso8601\": \"0100-08-13T06:42:06.001Z\",\n          \"canonical_seconds\": \"-58992081474\",\n          \"canonical_nanos\": 1000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Fri, 13 Aug 0100 06:42:06 GMT\"\n      },\n      {\n          \"iso8601\": \"0100-09-14T07:43:59.01Z\",\n          \"canonical_seconds\": \"-58989312961\",\n          \"canonical_nanos\": 10000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Tue, 14 Sep 0100 07:43:59 GMT\"\n      },\n      {\n          \"iso8601\": \"0100-10-15T08:44:52.1Z\",\n          \"canonical_seconds\": \"-58986630908\",\n          \"canonical_nanos\": 100000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Fri, 15 Oct 0100 08:44:52 GMT\"\n      },\n      {\n          \"iso8601\": \"0100-11-16T09:45:45.123456789Z\",\n          \"canonical_seconds\": \"-58983862455\",\n          \"canonical_nanos\": 123456789,\n          \"error\": false,\n          \"smithy_format_value\": \"Tue, 16 Nov 0100 09:45:45 GMT\"\n      },\n      {\n          \"iso8601\": \"0100-12-17T10:46:38Z\",\n          \"canonical_seconds\": \"-58981180402\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"Fri, 17 Dec 0100 10:46:38 GMT\"\n      },\n      {\n          \"iso8601\": \"1584-02-29T23:59:59.999Z\",\n          \"canonical_seconds\": \"-12175833601\",\n          \"canonical_nanos\": 999000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Wed, 29 Feb 1584 23:59:59 GMT\"\n      },\n      {\n          \"iso8601\": \"1969-01-18T11:47:31.000000001Z\",\n          \"canonical_seconds\": \"-30024749\",\n          \"canonical_nanos\": 1,\n          \"error\": false,\n          \"smithy_format_value\": \"Sat, 18 Jan 1969 11:47:31 GMT\"\n      },\n      {\n          \"iso8601\": \"1969-02-25T12:48:24.00000001Z\",\n          \"canonical_seconds\": \"-26737896\",\n          \"canonical_nanos\": 10,\n          \"error\": false,\n          \"smithy_format_value\": \"Tue, 25 Feb 1969 12:48:24 GMT\"\n      },\n      {\n          \"iso8601\": \"1969-03-20T13:49:17.0000001Z\",\n          \"canonical_seconds\": \"-24747043\",\n          \"canonical_nanos\": 100,\n          \"error\": false,\n          \"smithy_format_value\": \"Thu, 20 Mar 1969 13:49:17 GMT\"\n      },\n      {\n          \"iso8601\": \"1969-04-21T14:50:10.000001Z\",\n          \"canonical_seconds\": \"-21978590\",\n          \"canonical_nanos\": 1000,\n          \"error\": false,\n          \"smithy_format_value\": \"Mon, 21 Apr 1969 14:50:10 GMT\"\n      },\n      {\n          \"iso8601\": \"1969-05-22T15:51:03.00001Z\",\n          \"canonical_seconds\": \"-19296537\",\n          \"canonical_nanos\": 10000,\n          \"error\": false,\n          \"smithy_format_value\": \"Thu, 22 May 1969 15:51:03 GMT\"\n      },\n      {\n          \"iso8601\": \"1969-06-23T16:52:56.0001Z\",\n          \"canonical_seconds\": \"-16528024\",\n          \"canonical_nanos\": 100000,\n          \"error\": false,\n          \"smithy_format_value\": \"Mon, 23 Jun 1969 16:52:56 GMT\"\n      },\n      {\n          \"iso8601\": \"1969-07-24T17:53:49.001Z\",\n          \"canonical_seconds\": \"-13845971\",\n          \"canonical_nanos\": 1000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Thu, 24 Jul 1969 17:53:49 GMT\"\n      },\n      {\n          \"iso8601\": \"1969-08-25T18:54:42.01Z\",\n          \"canonical_seconds\": \"-11077518\",\n          \"canonical_nanos\": 10000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Mon, 25 Aug 1969 18:54:42 GMT\"\n      },\n      {\n          \"iso8601\": \"1969-09-26T19:55:35.1Z\",\n          \"canonical_seconds\": \"-8309065\",\n          \"canonical_nanos\": 100000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Fri, 26 Sep 1969 19:55:35 GMT\"\n      },\n      {\n          \"iso8601\": \"1969-10-27T20:56:28.123456789Z\",\n          \"canonical_seconds\": \"-5627012\",\n          \"canonical_nanos\": 123456789,\n          \"error\": false,\n          \"smithy_format_value\": \"Mon, 27 Oct 1969 20:56:28 GMT\"\n      },\n      {\n          \"iso8601\": \"1969-11-28T21:57:21Z\",\n          \"canonical_seconds\": \"-2858559\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"Fri, 28 Nov 1969 21:57:21 GMT\"\n      },\n      {\n          \"iso8601\": \"1969-12-29T22:58:14.000000001Z\",\n          \"canonical_seconds\": \"-176506\",\n          \"canonical_nanos\": 1,\n          \"error\": false,\n          \"smithy_format_value\": \"Mon, 29 Dec 1969 22:58:14 GMT\"\n      },\n      {\n          \"iso8601\": \"1970-01-30T23:59:07.00000001Z\",\n          \"canonical_seconds\": \"2591947\",\n          \"canonical_nanos\": 10,\n          \"error\": false,\n          \"smithy_format_value\": \"Fri, 30 Jan 1970 23:59:07 GMT\"\n      },\n      {\n          \"iso8601\": \"1970-02-09T00:00:00.0000001Z\",\n          \"canonical_seconds\": \"3369600\",\n          \"canonical_nanos\": 100,\n          \"error\": false,\n          \"smithy_format_value\": \"Mon, 09 Feb 1970 00:00:00 GMT\"\n      },\n      {\n          \"iso8601\": \"1970-03-01T01:01:53.000001Z\",\n          \"canonical_seconds\": \"5101313\",\n          \"canonical_nanos\": 1000,\n          \"error\": false,\n          \"smithy_format_value\": \"Sun, 01 Mar 1970 01:01:53 GMT\"\n      },\n      {\n          \"iso8601\": \"1970-04-03T02:02:46.00001Z\",\n          \"canonical_seconds\": \"7956166\",\n          \"canonical_nanos\": 10000,\n          \"error\": false,\n          \"smithy_format_value\": \"Fri, 03 Apr 1970 02:02:46 GMT\"\n      },\n      {\n          \"iso8601\": \"1970-05-03T03:03:39.0001Z\",\n          \"canonical_seconds\": \"10551819\",\n          \"canonical_nanos\": 100000,\n          \"error\": false,\n          \"smithy_format_value\": \"Sun, 03 May 1970 03:03:39 GMT\"\n      },\n      {\n          \"iso8601\": \"1970-06-05T04:04:32.001Z\",\n          \"canonical_seconds\": \"13406672\",\n          \"canonical_nanos\": 1000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Fri, 05 Jun 1970 04:04:32 GMT\"\n      },\n      {\n          \"iso8601\": \"1970-07-05T05:05:25.01Z\",\n          \"canonical_seconds\": \"16002325\",\n          \"canonical_nanos\": 10000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Sun, 05 Jul 1970 05:05:25 GMT\"\n      },\n      {\n          \"iso8601\": \"1970-08-06T06:06:18.1Z\",\n          \"canonical_seconds\": \"18770778\",\n          \"canonical_nanos\": 100000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Thu, 06 Aug 1970 06:06:18 GMT\"\n      },\n      {\n          \"iso8601\": \"1970-09-08T07:07:11.123456789Z\",\n          \"canonical_seconds\": \"21625631\",\n          \"canonical_nanos\": 123456789,\n          \"error\": false,\n          \"smithy_format_value\": \"Tue, 08 Sep 1970 07:07:11 GMT\"\n      },\n      {\n          \"iso8601\": \"1970-10-08T08:08:04Z\",\n          \"canonical_seconds\": \"24221284\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"Thu, 08 Oct 1970 08:08:04 GMT\"\n      },\n      {\n          \"iso8601\": \"1970-11-10T09:09:57.000000001Z\",\n          \"canonical_seconds\": \"27076197\",\n          \"canonical_nanos\": 1,\n          \"error\": false,\n          \"smithy_format_value\": \"Tue, 10 Nov 1970 09:09:57 GMT\"\n      },\n      {\n          \"iso8601\": \"1970-12-10T10:10:50.00000001Z\",\n          \"canonical_seconds\": \"29671850\",\n          \"canonical_nanos\": 10,\n          \"error\": false,\n          \"smithy_format_value\": \"Thu, 10 Dec 1970 10:10:50 GMT\"\n      },\n      {\n          \"iso8601\": \"2004-02-29T23:59:59.999Z\",\n          \"canonical_seconds\": \"1078099199\",\n          \"canonical_nanos\": 999000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Sun, 29 Feb 2004 23:59:59 GMT\"\n      },\n      {\n          \"iso8601\": \"2037-01-11T11:11:43.0000001Z\",\n          \"canonical_seconds\": \"2115285103\",\n          \"canonical_nanos\": 100,\n          \"error\": false,\n          \"smithy_format_value\": \"Sun, 11 Jan 2037 11:11:43 GMT\"\n      },\n      {\n          \"iso8601\": \"2037-02-21T12:12:36.000001Z\",\n          \"canonical_seconds\": \"2118831156\",\n          \"canonical_nanos\": 1000,\n          \"error\": false,\n          \"smithy_format_value\": \"Sat, 21 Feb 2037 12:12:36 GMT\"\n      },\n      {\n          \"iso8601\": \"2037-03-13T13:13:29.00001Z\",\n          \"canonical_seconds\": \"2120562809\",\n          \"canonical_nanos\": 10000,\n          \"error\": false,\n          \"smithy_format_value\": \"Fri, 13 Mar 2037 13:13:29 GMT\"\n      },\n      {\n          \"iso8601\": \"2037-04-15T14:14:22.0001Z\",\n          \"canonical_seconds\": \"2123417662\",\n          \"canonical_nanos\": 100000,\n          \"error\": false,\n          \"smithy_format_value\": \"Wed, 15 Apr 2037 14:14:22 GMT\"\n      },\n      {\n          \"iso8601\": \"2037-05-15T15:15:15.001Z\",\n          \"canonical_seconds\": \"2126013315\",\n          \"canonical_nanos\": 1000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Fri, 15 May 2037 15:15:15 GMT\"\n      },\n      {\n          \"iso8601\": \"2037-06-17T16:16:08.01Z\",\n          \"canonical_seconds\": \"2128868168\",\n          \"canonical_nanos\": 10000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Wed, 17 Jun 2037 16:16:08 GMT\"\n      },\n      {\n          \"iso8601\": \"2037-07-17T17:17:01.1Z\",\n          \"canonical_seconds\": \"2131463821\",\n          \"canonical_nanos\": 100000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Fri, 17 Jul 2037 17:17:01 GMT\"\n      },\n      {\n          \"iso8601\": \"2037-08-18T18:18:54.123456789Z\",\n          \"canonical_seconds\": \"2134232334\",\n          \"canonical_nanos\": 123456789,\n          \"error\": false,\n          \"smithy_format_value\": \"Tue, 18 Aug 2037 18:18:54 GMT\"\n      },\n      {\n          \"iso8601\": \"2037-09-20T19:19:47Z\",\n          \"canonical_seconds\": \"2137087187\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"Sun, 20 Sep 2037 19:19:47 GMT\"\n      },\n      {\n          \"iso8601\": \"2037-10-20T20:20:40.000000001Z\",\n          \"canonical_seconds\": \"2139682840\",\n          \"canonical_nanos\": 1,\n          \"error\": false,\n          \"smithy_format_value\": \"Tue, 20 Oct 2037 20:20:40 GMT\"\n      },\n      {\n          \"iso8601\": \"2037-11-22T21:21:33.00000001Z\",\n          \"canonical_seconds\": \"2142537693\",\n          \"canonical_nanos\": 10,\n          \"error\": false,\n          \"smithy_format_value\": \"Sun, 22 Nov 2037 21:21:33 GMT\"\n      },\n      {\n          \"iso8601\": \"2037-12-22T22:22:26.0000001Z\",\n          \"canonical_seconds\": \"2145133346\",\n          \"canonical_nanos\": 100,\n          \"error\": false,\n          \"smithy_format_value\": \"Tue, 22 Dec 2037 22:22:26 GMT\"\n      },\n      {\n          \"iso8601\": \"2038-01-23T23:23:19.000001Z\",\n          \"canonical_seconds\": \"2147901799\",\n          \"canonical_nanos\": 1000,\n          \"error\": false,\n          \"smithy_format_value\": \"Sat, 23 Jan 2038 23:23:19 GMT\"\n      },\n      {\n          \"iso8601\": \"2038-02-05T00:24:12.00001Z\",\n          \"canonical_seconds\": \"2148942252\",\n          \"canonical_nanos\": 10000,\n          \"error\": false,\n          \"smithy_format_value\": \"Fri, 05 Feb 2038 00:24:12 GMT\"\n      },\n      {\n          \"iso8601\": \"2038-03-25T01:25:05.0001Z\",\n          \"canonical_seconds\": \"2153093105\",\n          \"canonical_nanos\": 100000,\n          \"error\": false,\n          \"smithy_format_value\": \"Thu, 25 Mar 2038 01:25:05 GMT\"\n      },\n      {\n          \"iso8601\": \"2038-04-27T02:26:58.001Z\",\n          \"canonical_seconds\": \"2155948018\",\n          \"canonical_nanos\": 1000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Tue, 27 Apr 2038 02:26:58 GMT\"\n      },\n      {\n          \"iso8601\": \"2038-05-27T03:27:51.01Z\",\n          \"canonical_seconds\": \"2158543671\",\n          \"canonical_nanos\": 10000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Thu, 27 May 2038 03:27:51 GMT\"\n      },\n      {\n          \"iso8601\": \"2038-06-29T04:28:44.1Z\",\n          \"canonical_seconds\": \"2161398524\",\n          \"canonical_nanos\": 100000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Tue, 29 Jun 2038 04:28:44 GMT\"\n      },\n      {\n          \"iso8601\": \"2038-07-29T05:29:37.123456789Z\",\n          \"canonical_seconds\": \"2163994177\",\n          \"canonical_nanos\": 123456789,\n          \"error\": false,\n          \"smithy_format_value\": \"Thu, 29 Jul 2038 05:29:37 GMT\"\n      },\n      {\n          \"iso8601\": \"2038-08-30T06:30:30Z\",\n          \"canonical_seconds\": \"2166762630\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"Mon, 30 Aug 2038 06:30:30 GMT\"\n      },\n      {\n          \"iso8601\": \"2038-09-02T07:31:23.000000001Z\",\n          \"canonical_seconds\": \"2167025483\",\n          \"canonical_nanos\": 1,\n          \"error\": false,\n          \"smithy_format_value\": \"Thu, 02 Sep 2038 07:31:23 GMT\"\n      },\n      {\n          \"iso8601\": \"2038-10-01T08:32:16.00000001Z\",\n          \"canonical_seconds\": \"2169534736\",\n          \"canonical_nanos\": 10,\n          \"error\": false,\n          \"smithy_format_value\": \"Fri, 01 Oct 2038 08:32:16 GMT\"\n      },\n      {\n          \"iso8601\": \"2038-11-04T09:33:09.0000001Z\",\n          \"canonical_seconds\": \"2172475989\",\n          \"canonical_nanos\": 100,\n          \"error\": false,\n          \"smithy_format_value\": \"Thu, 04 Nov 2038 09:33:09 GMT\"\n      },\n      {\n          \"iso8601\": \"2038-12-03T10:34:02.000001Z\",\n          \"canonical_seconds\": \"2174985242\",\n          \"canonical_nanos\": 1000,\n          \"error\": false,\n          \"smithy_format_value\": \"Fri, 03 Dec 2038 10:34:02 GMT\"\n      },\n      {\n          \"iso8601\": \"9999-01-04T11:35:55.00001Z\",\n          \"canonical_seconds\": \"253371065755\",\n          \"canonical_nanos\": 10000,\n          \"error\": false,\n          \"smithy_format_value\": \"Mon, 04 Jan 9999 11:35:55 GMT\"\n      },\n      {\n          \"iso8601\": \"9999-02-17T12:36:48.0001Z\",\n          \"canonical_seconds\": \"253374871008\",\n          \"canonical_nanos\": 100000,\n          \"error\": false,\n          \"smithy_format_value\": \"Wed, 17 Feb 9999 12:36:48 GMT\"\n      },\n      {\n          \"iso8601\": \"9999-03-06T13:37:41.001Z\",\n          \"canonical_seconds\": \"253376343461\",\n          \"canonical_nanos\": 1000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Sat, 06 Mar 9999 13:37:41 GMT\"\n      },\n      {\n          \"iso8601\": \"9999-04-09T14:38:34.01Z\",\n          \"canonical_seconds\": \"253379284714\",\n          \"canonical_nanos\": 10000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Fri, 09 Apr 9999 14:38:34 GMT\"\n      },\n      {\n          \"iso8601\": \"9999-05-08T15:39:27.1Z\",\n          \"canonical_seconds\": \"253381793967\",\n          \"canonical_nanos\": 100000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Sat, 08 May 9999 15:39:27 GMT\"\n      },\n      {\n          \"iso8601\": \"9999-06-11T16:40:20.123456789Z\",\n          \"canonical_seconds\": \"253384735220\",\n          \"canonical_nanos\": 123456789,\n          \"error\": false,\n          \"smithy_format_value\": \"Fri, 11 Jun 9999 16:40:20 GMT\"\n      },\n      {\n          \"iso8601\": \"9999-07-10T17:41:13Z\",\n          \"canonical_seconds\": \"253387244473\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"Sat, 10 Jul 9999 17:41:13 GMT\"\n      },\n      {\n          \"iso8601\": \"9999-08-11T18:42:06.000000001Z\",\n          \"canonical_seconds\": \"253390012926\",\n          \"canonical_nanos\": 1,\n          \"error\": false,\n          \"smithy_format_value\": \"Wed, 11 Aug 9999 18:42:06 GMT\"\n      },\n      {\n          \"iso8601\": \"9999-09-14T19:43:59.00000001Z\",\n          \"canonical_seconds\": \"253392954239\",\n          \"canonical_nanos\": 10,\n          \"error\": false,\n          \"smithy_format_value\": \"Tue, 14 Sep 9999 19:43:59 GMT\"\n      },\n      {\n          \"iso8601\": \"9999-10-13T20:44:52.0000001Z\",\n          \"canonical_seconds\": \"253395463492\",\n          \"canonical_nanos\": 100,\n          \"error\": false,\n          \"smithy_format_value\": \"Wed, 13 Oct 9999 20:44:52 GMT\"\n      },\n      {\n          \"iso8601\": \"9999-11-16T21:45:45.000001Z\",\n          \"canonical_seconds\": \"253398404745\",\n          \"canonical_nanos\": 1000,\n          \"error\": false,\n          \"smithy_format_value\": \"Tue, 16 Nov 9999 21:45:45 GMT\"\n      },\n      {\n          \"iso8601\": \"9999-12-15T22:46:38.00001Z\",\n          \"canonical_seconds\": \"253400913998\",\n          \"canonical_nanos\": 10000,\n          \"error\": false,\n          \"smithy_format_value\": \"Wed, 15 Dec 9999 22:46:38 GMT\"\n      }\n  ],\n  \"format_date_time\": [\n      {\n          \"iso8601\": \"-9999-01-20T23:47:31.001Z\",\n          \"canonical_seconds\": \"-377703389549\",\n          \"canonical_nanos\": 1000000,\n          \"error\": true\n      },\n      {\n          \"iso8601\": \"-9999-02-21T00:48:24.01Z\",\n          \"canonical_seconds\": \"-377700707496\",\n          \"canonical_nanos\": 10000000,\n          \"error\": true\n      },\n      {\n          \"iso8601\": \"-9999-03-22T01:49:17.1Z\",\n          \"canonical_seconds\": \"-377698198243\",\n          \"canonical_nanos\": 100000000,\n          \"error\": true\n      },\n      {\n          \"iso8601\": \"-9999-04-21T02:50:10.123456789Z\",\n          \"canonical_seconds\": \"-377695602590\",\n          \"canonical_nanos\": 123456789,\n          \"error\": true\n      },\n      {\n          \"iso8601\": \"-9999-05-24T03:51:03Z\",\n          \"canonical_seconds\": \"-377692747737\",\n          \"canonical_nanos\": 0,\n          \"error\": true\n      },\n      {\n          \"iso8601\": \"-9999-06-23T04:52:56.000000001Z\",\n          \"canonical_seconds\": \"-377690152024\",\n          \"canonical_nanos\": 1,\n          \"error\": true\n      },\n      {\n          \"iso8601\": \"-9999-07-26T05:53:49.00000001Z\",\n          \"canonical_seconds\": \"-377687297171\",\n          \"canonical_nanos\": 10,\n          \"error\": true\n      },\n      {\n          \"iso8601\": \"-9999-08-27T06:54:42.0000001Z\",\n          \"canonical_seconds\": \"-377684528718\",\n          \"canonical_nanos\": 100,\n          \"error\": true\n      },\n      {\n          \"iso8601\": \"-9999-09-26T07:55:35.000001Z\",\n          \"canonical_seconds\": \"-377681933065\",\n          \"canonical_nanos\": 1000,\n          \"error\": true\n      },\n      {\n          \"iso8601\": \"-9999-10-29T08:56:28.00001Z\",\n          \"canonical_seconds\": \"-377679078212\",\n          \"canonical_nanos\": 10000,\n          \"error\": true\n      },\n      {\n          \"iso8601\": \"-9999-11-28T09:57:21.0001Z\",\n          \"canonical_seconds\": \"-377676482559\",\n          \"canonical_nanos\": 100000,\n          \"error\": true\n      },\n      {\n          \"iso8601\": \"-9999-12-31T10:58:14.001Z\",\n          \"canonical_seconds\": \"-377673627706\",\n          \"canonical_nanos\": 1000000,\n          \"error\": true\n      },\n      {\n          \"iso8601\": \"-0100-01-01T11:59:07.01Z\",\n          \"canonical_seconds\": \"-65322849653\",\n          \"canonical_nanos\": 10000000,\n          \"error\": true\n      },\n      {\n          \"iso8601\": \"-0100-02-05T12:00:00.1Z\",\n          \"canonical_seconds\": \"-65319825600\",\n          \"canonical_nanos\": 100000000,\n          \"error\": true\n      },\n      {\n          \"iso8601\": \"-0100-03-03T13:01:53.123456789Z\",\n          \"canonical_seconds\": \"-65317575487\",\n          \"canonical_nanos\": 123456789,\n          \"error\": true\n      },\n      {\n          \"iso8601\": \"-0100-04-03T14:02:46Z\",\n          \"canonical_seconds\": \"-65314893434\",\n          \"canonical_nanos\": 0,\n          \"error\": true\n      },\n      {\n          \"iso8601\": \"-0100-05-05T15:03:39.000000001Z\",\n          \"canonical_seconds\": \"-65312124981\",\n          \"canonical_nanos\": 1,\n          \"error\": true\n      },\n      {\n          \"iso8601\": \"-0100-06-05T16:04:32.00000001Z\",\n          \"canonical_seconds\": \"-65309442928\",\n          \"canonical_nanos\": 10,\n          \"error\": true\n      },\n      {\n          \"iso8601\": \"-0100-07-07T17:05:25.0000001Z\",\n          \"canonical_seconds\": \"-65306674475\",\n          \"canonical_nanos\": 100,\n          \"error\": true\n      },\n      {\n          \"iso8601\": \"-0100-08-08T18:06:18.000001Z\",\n          \"canonical_seconds\": \"-65303906022\",\n          \"canonical_nanos\": 1000,\n          \"error\": true\n      },\n      {\n          \"iso8601\": \"-0100-09-08T19:07:11.00001Z\",\n          \"canonical_seconds\": \"-65301223969\",\n          \"canonical_nanos\": 10000,\n          \"error\": true\n      },\n      {\n          \"iso8601\": \"-0100-10-10T20:08:04.0001Z\",\n          \"canonical_seconds\": \"-65298455516\",\n          \"canonical_nanos\": 100000,\n          \"error\": true\n      },\n      {\n          \"iso8601\": \"-0100-11-10T21:09:57.001Z\",\n          \"canonical_seconds\": \"-65295773403\",\n          \"canonical_nanos\": 1000000,\n          \"error\": true\n      },\n      {\n          \"iso8601\": \"-0100-12-12T22:10:50.01Z\",\n          \"canonical_seconds\": \"-65293004950\",\n          \"canonical_nanos\": 10000000,\n          \"error\": true\n      },\n      {\n          \"iso8601\": \"-0001-01-13T23:11:43.1Z\",\n          \"canonical_seconds\": \"-62197634897\",\n          \"canonical_nanos\": 100000000,\n          \"error\": true\n      },\n      {\n          \"iso8601\": \"-0001-02-17T00:12:36.123456789Z\",\n          \"canonical_seconds\": \"-62194693644\",\n          \"canonical_nanos\": 123456789,\n          \"error\": true\n      },\n      {\n          \"iso8601\": \"-0001-03-15T01:13:29Z\",\n          \"canonical_seconds\": \"-62192443591\",\n          \"canonical_nanos\": 0,\n          \"error\": true\n      },\n      {\n          \"iso8601\": \"-0001-04-15T02:14:22.000000001Z\",\n          \"canonical_seconds\": \"-62189761538\",\n          \"canonical_nanos\": 1,\n          \"error\": true\n      },\n      {\n          \"iso8601\": \"-0001-05-17T03:15:15.00000001Z\",\n          \"canonical_seconds\": \"-62186993085\",\n          \"canonical_nanos\": 10,\n          \"error\": true\n      },\n      {\n          \"iso8601\": \"-0001-06-17T04:16:08.0000001Z\",\n          \"canonical_seconds\": \"-62184311032\",\n          \"canonical_nanos\": 100,\n          \"error\": true\n      },\n      {\n          \"iso8601\": \"-0001-07-19T05:17:01.000001Z\",\n          \"canonical_seconds\": \"-62181542579\",\n          \"canonical_nanos\": 1000,\n          \"error\": true\n      },\n      {\n          \"iso8601\": \"-0001-08-20T06:18:54.00001Z\",\n          \"canonical_seconds\": \"-62178774066\",\n          \"canonical_nanos\": 10000,\n          \"error\": true\n      },\n      {\n          \"iso8601\": \"-0001-09-20T07:19:47.0001Z\",\n          \"canonical_seconds\": \"-62176092013\",\n          \"canonical_nanos\": 100000,\n          \"error\": true\n      },\n      {\n          \"iso8601\": \"-0001-10-22T08:20:40.001Z\",\n          \"canonical_seconds\": \"-62173323560\",\n          \"canonical_nanos\": 1000000,\n          \"error\": true\n      },\n      {\n          \"iso8601\": \"-0001-11-22T09:21:33.01Z\",\n          \"canonical_seconds\": \"-62170641507\",\n          \"canonical_nanos\": 10000000,\n          \"error\": true\n      },\n      {\n          \"iso8601\": \"-0001-12-24T10:22:26.1Z\",\n          \"canonical_seconds\": \"-62167873054\",\n          \"canonical_nanos\": 100000000,\n          \"error\": true\n      },\n      {\n          \"iso8601\": \"0001-01-25T11:23:19.123456789Z\",\n          \"canonical_seconds\": \"-62133482201\",\n          \"canonical_nanos\": 123456789,\n          \"error\": false,\n          \"smithy_format_value\": \"0001-01-25T11:23:19.123456Z\"\n      },\n      {\n          \"iso8601\": \"0001-02-01T12:24:12Z\",\n          \"canonical_seconds\": \"-62132873748\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"0001-02-01T12:24:12Z\"\n      },\n      {\n          \"iso8601\": \"0001-03-27T13:25:05.000000001Z\",\n          \"canonical_seconds\": \"-62128204495\",\n          \"canonical_nanos\": 1,\n          \"error\": false,\n          \"smithy_format_value\": \"0001-03-27T13:25:05Z\"\n      },\n      {\n          \"iso8601\": \"0001-04-27T14:26:58.00000001Z\",\n          \"canonical_seconds\": \"-62125522382\",\n          \"canonical_nanos\": 10,\n          \"error\": false,\n          \"smithy_format_value\": \"0001-04-27T14:26:58Z\"\n      },\n      {\n          \"iso8601\": \"0001-05-29T15:27:51.0000001Z\",\n          \"canonical_seconds\": \"-62122753929\",\n          \"canonical_nanos\": 100,\n          \"error\": false,\n          \"smithy_format_value\": \"0001-05-29T15:27:51Z\"\n      },\n      {\n          \"iso8601\": \"0001-06-29T16:28:44.000001Z\",\n          \"canonical_seconds\": \"-62120071876\",\n          \"canonical_nanos\": 1000,\n          \"error\": false,\n          \"smithy_format_value\": \"0001-06-29T16:28:44.000001Z\"\n      },\n      {\n          \"iso8601\": \"0001-07-31T17:29:37.00001Z\",\n          \"canonical_seconds\": \"-62117303423\",\n          \"canonical_nanos\": 10000,\n          \"error\": false,\n          \"smithy_format_value\": \"0001-07-31T17:29:37.00001Z\"\n      },\n      {\n          \"iso8601\": \"0001-08-01T18:30:30.0001Z\",\n          \"canonical_seconds\": \"-62117213370\",\n          \"canonical_nanos\": 100000,\n          \"error\": false,\n          \"smithy_format_value\": \"0001-08-01T18:30:30.0001Z\"\n      },\n      {\n          \"iso8601\": \"0001-09-02T19:31:23.001Z\",\n          \"canonical_seconds\": \"-62114444917\",\n          \"canonical_nanos\": 1000000,\n          \"error\": false,\n          \"smithy_format_value\": \"0001-09-02T19:31:23.001Z\"\n      },\n      {\n          \"iso8601\": \"0001-10-03T20:32:16.01Z\",\n          \"canonical_seconds\": \"-62111762864\",\n          \"canonical_nanos\": 10000000,\n          \"error\": false,\n          \"smithy_format_value\": \"0001-10-03T20:32:16.01Z\"\n      },\n      {\n          \"iso8601\": \"0001-11-04T21:33:09.1Z\",\n          \"canonical_seconds\": \"-62108994411\",\n          \"canonical_nanos\": 100000000,\n          \"error\": false,\n          \"smithy_format_value\": \"0001-11-04T21:33:09.1Z\"\n      },\n      {\n          \"iso8601\": \"0001-12-05T22:34:02.123456789Z\",\n          \"canonical_seconds\": \"-62106312358\",\n          \"canonical_nanos\": 123456789,\n          \"error\": false,\n          \"smithy_format_value\": \"0001-12-05T22:34:02.123456Z\"\n      },\n      {\n          \"iso8601\": \"0100-01-06T23:35:55Z\",\n          \"canonical_seconds\": \"-59010942245\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"0100-01-06T23:35:55Z\"\n      },\n      {\n          \"iso8601\": \"0100-02-13T00:36:48.000000001Z\",\n          \"canonical_seconds\": \"-59007741792\",\n          \"canonical_nanos\": 1,\n          \"error\": false,\n          \"smithy_format_value\": \"0100-02-13T00:36:48Z\"\n      },\n      {\n          \"iso8601\": \"0100-03-08T01:37:41.00000001Z\",\n          \"canonical_seconds\": \"-59005750939\",\n          \"canonical_nanos\": 10,\n          \"error\": false,\n          \"smithy_format_value\": \"0100-03-08T01:37:41Z\"\n      },\n      {\n          \"iso8601\": \"0100-04-09T02:38:34.0000001Z\",\n          \"canonical_seconds\": \"-59002982486\",\n          \"canonical_nanos\": 100,\n          \"error\": false,\n          \"smithy_format_value\": \"0100-04-09T02:38:34Z\"\n      },\n      {\n          \"iso8601\": \"0100-05-10T03:39:27.000001Z\",\n          \"canonical_seconds\": \"-59000300433\",\n          \"canonical_nanos\": 1000,\n          \"error\": false,\n          \"smithy_format_value\": \"0100-05-10T03:39:27.000001Z\"\n      },\n      {\n          \"iso8601\": \"0100-06-11T04:40:20.00001Z\",\n          \"canonical_seconds\": \"-58997531980\",\n          \"canonical_nanos\": 10000,\n          \"error\": false,\n          \"smithy_format_value\": \"0100-06-11T04:40:20.00001Z\"\n      },\n      {\n          \"iso8601\": \"0100-07-12T05:41:13.0001Z\",\n          \"canonical_seconds\": \"-58994849927\",\n          \"canonical_nanos\": 100000,\n          \"error\": false,\n          \"smithy_format_value\": \"0100-07-12T05:41:13.0001Z\"\n      },\n      {\n          \"iso8601\": \"0100-08-13T06:42:06.001Z\",\n          \"canonical_seconds\": \"-58992081474\",\n          \"canonical_nanos\": 1000000,\n          \"error\": false,\n          \"smithy_format_value\": \"0100-08-13T06:42:06.001Z\"\n      },\n      {\n          \"iso8601\": \"0100-09-14T07:43:59.01Z\",\n          \"canonical_seconds\": \"-58989312961\",\n          \"canonical_nanos\": 10000000,\n          \"error\": false,\n          \"smithy_format_value\": \"0100-09-14T07:43:59.01Z\"\n      },\n      {\n          \"iso8601\": \"0100-10-15T08:44:52.1Z\",\n          \"canonical_seconds\": \"-58986630908\",\n          \"canonical_nanos\": 100000000,\n          \"error\": false,\n          \"smithy_format_value\": \"0100-10-15T08:44:52.1Z\"\n      },\n      {\n          \"iso8601\": \"0100-11-16T09:45:45.123456789Z\",\n          \"canonical_seconds\": \"-58983862455\",\n          \"canonical_nanos\": 123456789,\n          \"error\": false,\n          \"smithy_format_value\": \"0100-11-16T09:45:45.123456Z\"\n      },\n      {\n          \"iso8601\": \"0100-12-17T10:46:38Z\",\n          \"canonical_seconds\": \"-58981180402\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"0100-12-17T10:46:38Z\"\n      },\n      {\n          \"iso8601\": \"1584-02-29T23:59:59.999Z\",\n          \"canonical_seconds\": \"-12175833601\",\n          \"canonical_nanos\": 999000000,\n          \"error\": false,\n          \"smithy_format_value\": \"1584-02-29T23:59:59.999Z\"\n      },\n      {\n          \"iso8601\": \"1969-01-18T11:47:31.000000001Z\",\n          \"canonical_seconds\": \"-30024749\",\n          \"canonical_nanos\": 1,\n          \"error\": false,\n          \"smithy_format_value\": \"1969-01-18T11:47:31Z\"\n      },\n      {\n          \"iso8601\": \"1969-02-25T12:48:24.00000001Z\",\n          \"canonical_seconds\": \"-26737896\",\n          \"canonical_nanos\": 10,\n          \"error\": false,\n          \"smithy_format_value\": \"1969-02-25T12:48:24Z\"\n      },\n      {\n          \"iso8601\": \"1969-03-20T13:49:17.0000001Z\",\n          \"canonical_seconds\": \"-24747043\",\n          \"canonical_nanos\": 100,\n          \"error\": false,\n          \"smithy_format_value\": \"1969-03-20T13:49:17Z\"\n      },\n      {\n          \"iso8601\": \"1969-04-21T14:50:10.000001Z\",\n          \"canonical_seconds\": \"-21978590\",\n          \"canonical_nanos\": 1000,\n          \"error\": false,\n          \"smithy_format_value\": \"1969-04-21T14:50:10.000001Z\"\n      },\n      {\n          \"iso8601\": \"1969-05-22T15:51:03.00001Z\",\n          \"canonical_seconds\": \"-19296537\",\n          \"canonical_nanos\": 10000,\n          \"error\": false,\n          \"smithy_format_value\": \"1969-05-22T15:51:03.00001Z\"\n      },\n      {\n          \"iso8601\": \"1969-06-23T16:52:56.0001Z\",\n          \"canonical_seconds\": \"-16528024\",\n          \"canonical_nanos\": 100000,\n          \"error\": false,\n          \"smithy_format_value\": \"1969-06-23T16:52:56.0001Z\"\n      },\n      {\n          \"iso8601\": \"1969-07-24T17:53:49.001Z\",\n          \"canonical_seconds\": \"-13845971\",\n          \"canonical_nanos\": 1000000,\n          \"error\": false,\n          \"smithy_format_value\": \"1969-07-24T17:53:49.001Z\"\n      },\n      {\n          \"iso8601\": \"1969-08-25T18:54:42.01Z\",\n          \"canonical_seconds\": \"-11077518\",\n          \"canonical_nanos\": 10000000,\n          \"error\": false,\n          \"smithy_format_value\": \"1969-08-25T18:54:42.01Z\"\n      },\n      {\n          \"iso8601\": \"1969-09-26T19:55:35.1Z\",\n          \"canonical_seconds\": \"-8309065\",\n          \"canonical_nanos\": 100000000,\n          \"error\": false,\n          \"smithy_format_value\": \"1969-09-26T19:55:35.1Z\"\n      },\n      {\n          \"iso8601\": \"1969-10-27T20:56:28.123456789Z\",\n          \"canonical_seconds\": \"-5627012\",\n          \"canonical_nanos\": 123456789,\n          \"error\": false,\n          \"smithy_format_value\": \"1969-10-27T20:56:28.123456Z\"\n      },\n      {\n          \"iso8601\": \"1969-11-28T21:57:21Z\",\n          \"canonical_seconds\": \"-2858559\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"1969-11-28T21:57:21Z\"\n      },\n      {\n          \"iso8601\": \"1969-12-29T22:58:14.000000001Z\",\n          \"canonical_seconds\": \"-176506\",\n          \"canonical_nanos\": 1,\n          \"error\": false,\n          \"smithy_format_value\": \"1969-12-29T22:58:14Z\"\n      },\n      {\n          \"iso8601\": \"1970-01-30T23:59:07.00000001Z\",\n          \"canonical_seconds\": \"2591947\",\n          \"canonical_nanos\": 10,\n          \"error\": false,\n          \"smithy_format_value\": \"1970-01-30T23:59:07Z\"\n      },\n      {\n          \"iso8601\": \"1970-02-09T00:00:00.0000001Z\",\n          \"canonical_seconds\": \"3369600\",\n          \"canonical_nanos\": 100,\n          \"error\": false,\n          \"smithy_format_value\": \"1970-02-09T00:00:00Z\"\n      },\n      {\n          \"iso8601\": \"1970-03-01T01:01:53.000001Z\",\n          \"canonical_seconds\": \"5101313\",\n          \"canonical_nanos\": 1000,\n          \"error\": false,\n          \"smithy_format_value\": \"1970-03-01T01:01:53.000001Z\"\n      },\n      {\n          \"iso8601\": \"1970-04-03T02:02:46.00001Z\",\n          \"canonical_seconds\": \"7956166\",\n          \"canonical_nanos\": 10000,\n          \"error\": false,\n          \"smithy_format_value\": \"1970-04-03T02:02:46.00001Z\"\n      },\n      {\n          \"iso8601\": \"1970-05-03T03:03:39.0001Z\",\n          \"canonical_seconds\": \"10551819\",\n          \"canonical_nanos\": 100000,\n          \"error\": false,\n          \"smithy_format_value\": \"1970-05-03T03:03:39.0001Z\"\n      },\n      {\n          \"iso8601\": \"1970-06-05T04:04:32.001Z\",\n          \"canonical_seconds\": \"13406672\",\n          \"canonical_nanos\": 1000000,\n          \"error\": false,\n          \"smithy_format_value\": \"1970-06-05T04:04:32.001Z\"\n      },\n      {\n          \"iso8601\": \"1970-07-05T05:05:25.01Z\",\n          \"canonical_seconds\": \"16002325\",\n          \"canonical_nanos\": 10000000,\n          \"error\": false,\n          \"smithy_format_value\": \"1970-07-05T05:05:25.01Z\"\n      },\n      {\n          \"iso8601\": \"1970-08-06T06:06:18.1Z\",\n          \"canonical_seconds\": \"18770778\",\n          \"canonical_nanos\": 100000000,\n          \"error\": false,\n          \"smithy_format_value\": \"1970-08-06T06:06:18.1Z\"\n      },\n      {\n          \"iso8601\": \"1970-09-08T07:07:11.123456789Z\",\n          \"canonical_seconds\": \"21625631\",\n          \"canonical_nanos\": 123456789,\n          \"error\": false,\n          \"smithy_format_value\": \"1970-09-08T07:07:11.123456Z\"\n      },\n      {\n          \"iso8601\": \"1970-10-08T08:08:04Z\",\n          \"canonical_seconds\": \"24221284\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"1970-10-08T08:08:04Z\"\n      },\n      {\n          \"iso8601\": \"1970-11-10T09:09:57.000000001Z\",\n          \"canonical_seconds\": \"27076197\",\n          \"canonical_nanos\": 1,\n          \"error\": false,\n          \"smithy_format_value\": \"1970-11-10T09:09:57Z\"\n      },\n      {\n          \"iso8601\": \"1970-12-10T10:10:50.00000001Z\",\n          \"canonical_seconds\": \"29671850\",\n          \"canonical_nanos\": 10,\n          \"error\": false,\n          \"smithy_format_value\": \"1970-12-10T10:10:50Z\"\n      },\n      {\n          \"iso8601\": \"2004-02-29T23:59:59.999Z\",\n          \"canonical_seconds\": \"1078099199\",\n          \"canonical_nanos\": 999000000,\n          \"error\": false,\n          \"smithy_format_value\": \"2004-02-29T23:59:59.999Z\"\n      },\n      {\n          \"iso8601\": \"2037-01-11T11:11:43.0000001Z\",\n          \"canonical_seconds\": \"2115285103\",\n          \"canonical_nanos\": 100,\n          \"error\": false,\n          \"smithy_format_value\": \"2037-01-11T11:11:43Z\"\n      },\n      {\n          \"iso8601\": \"2037-02-21T12:12:36.000001Z\",\n          \"canonical_seconds\": \"2118831156\",\n          \"canonical_nanos\": 1000,\n          \"error\": false,\n          \"smithy_format_value\": \"2037-02-21T12:12:36.000001Z\"\n      },\n      {\n          \"iso8601\": \"2037-03-13T13:13:29.00001Z\",\n          \"canonical_seconds\": \"2120562809\",\n          \"canonical_nanos\": 10000,\n          \"error\": false,\n          \"smithy_format_value\": \"2037-03-13T13:13:29.00001Z\"\n      },\n      {\n          \"iso8601\": \"2037-04-15T14:14:22.0001Z\",\n          \"canonical_seconds\": \"2123417662\",\n          \"canonical_nanos\": 100000,\n          \"error\": false,\n          \"smithy_format_value\": \"2037-04-15T14:14:22.0001Z\"\n      },\n      {\n          \"iso8601\": \"2037-05-15T15:15:15.001Z\",\n          \"canonical_seconds\": \"2126013315\",\n          \"canonical_nanos\": 1000000,\n          \"error\": false,\n          \"smithy_format_value\": \"2037-05-15T15:15:15.001Z\"\n      },\n      {\n          \"iso8601\": \"2037-06-17T16:16:08.01Z\",\n          \"canonical_seconds\": \"2128868168\",\n          \"canonical_nanos\": 10000000,\n          \"error\": false,\n          \"smithy_format_value\": \"2037-06-17T16:16:08.01Z\"\n      },\n      {\n          \"iso8601\": \"2037-07-17T17:17:01.1Z\",\n          \"canonical_seconds\": \"2131463821\",\n          \"canonical_nanos\": 100000000,\n          \"error\": false,\n          \"smithy_format_value\": \"2037-07-17T17:17:01.1Z\"\n      },\n      {\n          \"iso8601\": \"2037-08-18T18:18:54.123456789Z\",\n          \"canonical_seconds\": \"2134232334\",\n          \"canonical_nanos\": 123456789,\n          \"error\": false,\n          \"smithy_format_value\": \"2037-08-18T18:18:54.123456Z\"\n      },\n      {\n          \"iso8601\": \"2037-09-20T19:19:47Z\",\n          \"canonical_seconds\": \"2137087187\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"2037-09-20T19:19:47Z\"\n      },\n      {\n          \"iso8601\": \"2037-10-20T20:20:40.000000001Z\",\n          \"canonical_seconds\": \"2139682840\",\n          \"canonical_nanos\": 1,\n          \"error\": false,\n          \"smithy_format_value\": \"2037-10-20T20:20:40Z\"\n      },\n      {\n          \"iso8601\": \"2037-11-22T21:21:33.00000001Z\",\n          \"canonical_seconds\": \"2142537693\",\n          \"canonical_nanos\": 10,\n          \"error\": false,\n          \"smithy_format_value\": \"2037-11-22T21:21:33Z\"\n      },\n      {\n          \"iso8601\": \"2037-12-22T22:22:26.0000001Z\",\n          \"canonical_seconds\": \"2145133346\",\n          \"canonical_nanos\": 100,\n          \"error\": false,\n          \"smithy_format_value\": \"2037-12-22T22:22:26Z\"\n      },\n      {\n          \"iso8601\": \"2038-01-23T23:23:19.000001Z\",\n          \"canonical_seconds\": \"2147901799\",\n          \"canonical_nanos\": 1000,\n          \"error\": false,\n          \"smithy_format_value\": \"2038-01-23T23:23:19.000001Z\"\n      },\n      {\n          \"iso8601\": \"2038-02-05T00:24:12.00001Z\",\n          \"canonical_seconds\": \"2148942252\",\n          \"canonical_nanos\": 10000,\n          \"error\": false,\n          \"smithy_format_value\": \"2038-02-05T00:24:12.00001Z\"\n      },\n      {\n          \"iso8601\": \"2038-03-25T01:25:05.0001Z\",\n          \"canonical_seconds\": \"2153093105\",\n          \"canonical_nanos\": 100000,\n          \"error\": false,\n          \"smithy_format_value\": \"2038-03-25T01:25:05.0001Z\"\n      },\n      {\n          \"iso8601\": \"2038-04-27T02:26:58.001Z\",\n          \"canonical_seconds\": \"2155948018\",\n          \"canonical_nanos\": 1000000,\n          \"error\": false,\n          \"smithy_format_value\": \"2038-04-27T02:26:58.001Z\"\n      },\n      {\n          \"iso8601\": \"2038-05-27T03:27:51.01Z\",\n          \"canonical_seconds\": \"2158543671\",\n          \"canonical_nanos\": 10000000,\n          \"error\": false,\n          \"smithy_format_value\": \"2038-05-27T03:27:51.01Z\"\n      },\n      {\n          \"iso8601\": \"2038-06-29T04:28:44.1Z\",\n          \"canonical_seconds\": \"2161398524\",\n          \"canonical_nanos\": 100000000,\n          \"error\": false,\n          \"smithy_format_value\": \"2038-06-29T04:28:44.1Z\"\n      },\n      {\n          \"iso8601\": \"2038-07-29T05:29:37.123456789Z\",\n          \"canonical_seconds\": \"2163994177\",\n          \"canonical_nanos\": 123456789,\n          \"error\": false,\n          \"smithy_format_value\": \"2038-07-29T05:29:37.123456Z\"\n      },\n      {\n          \"iso8601\": \"2038-08-30T06:30:30Z\",\n          \"canonical_seconds\": \"2166762630\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"2038-08-30T06:30:30Z\"\n      },\n      {\n          \"iso8601\": \"2038-09-02T07:31:23.000000001Z\",\n          \"canonical_seconds\": \"2167025483\",\n          \"canonical_nanos\": 1,\n          \"error\": false,\n          \"smithy_format_value\": \"2038-09-02T07:31:23Z\"\n      },\n      {\n          \"iso8601\": \"2038-10-01T08:32:16.00000001Z\",\n          \"canonical_seconds\": \"2169534736\",\n          \"canonical_nanos\": 10,\n          \"error\": false,\n          \"smithy_format_value\": \"2038-10-01T08:32:16Z\"\n      },\n      {\n          \"iso8601\": \"2038-11-04T09:33:09.0000001Z\",\n          \"canonical_seconds\": \"2172475989\",\n          \"canonical_nanos\": 100,\n          \"error\": false,\n          \"smithy_format_value\": \"2038-11-04T09:33:09Z\"\n      },\n      {\n          \"iso8601\": \"2038-12-03T10:34:02.000001Z\",\n          \"canonical_seconds\": \"2174985242\",\n          \"canonical_nanos\": 1000,\n          \"error\": false,\n          \"smithy_format_value\": \"2038-12-03T10:34:02.000001Z\"\n      },\n      {\n          \"iso8601\": \"9999-01-04T11:35:55.00001Z\",\n          \"canonical_seconds\": \"253371065755\",\n          \"canonical_nanos\": 10000,\n          \"error\": false,\n          \"smithy_format_value\": \"9999-01-04T11:35:55.00001Z\"\n      },\n      {\n          \"iso8601\": \"9999-02-17T12:36:48.0001Z\",\n          \"canonical_seconds\": \"253374871008\",\n          \"canonical_nanos\": 100000,\n          \"error\": false,\n          \"smithy_format_value\": \"9999-02-17T12:36:48.0001Z\"\n      },\n      {\n          \"iso8601\": \"9999-03-06T13:37:41.001Z\",\n          \"canonical_seconds\": \"253376343461\",\n          \"canonical_nanos\": 1000000,\n          \"error\": false,\n          \"smithy_format_value\": \"9999-03-06T13:37:41.001Z\"\n      },\n      {\n          \"iso8601\": \"9999-04-09T14:38:34.01Z\",\n          \"canonical_seconds\": \"253379284714\",\n          \"canonical_nanos\": 10000000,\n          \"error\": false,\n          \"smithy_format_value\": \"9999-04-09T14:38:34.01Z\"\n      },\n      {\n          \"iso8601\": \"9999-05-08T15:39:27.1Z\",\n          \"canonical_seconds\": \"253381793967\",\n          \"canonical_nanos\": 100000000,\n          \"error\": false,\n          \"smithy_format_value\": \"9999-05-08T15:39:27.1Z\"\n      },\n      {\n          \"iso8601\": \"9999-06-11T16:40:20.123456789Z\",\n          \"canonical_seconds\": \"253384735220\",\n          \"canonical_nanos\": 123456789,\n          \"error\": false,\n          \"smithy_format_value\": \"9999-06-11T16:40:20.123456Z\"\n      },\n      {\n          \"iso8601\": \"9999-07-10T17:41:13Z\",\n          \"canonical_seconds\": \"253387244473\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"9999-07-10T17:41:13Z\"\n      },\n      {\n          \"iso8601\": \"9999-08-11T18:42:06.000000001Z\",\n          \"canonical_seconds\": \"253390012926\",\n          \"canonical_nanos\": 1,\n          \"error\": false,\n          \"smithy_format_value\": \"9999-08-11T18:42:06Z\"\n      },\n      {\n          \"iso8601\": \"9999-09-14T19:43:59.00000001Z\",\n          \"canonical_seconds\": \"253392954239\",\n          \"canonical_nanos\": 10,\n          \"error\": false,\n          \"smithy_format_value\": \"9999-09-14T19:43:59Z\"\n      },\n      {\n          \"iso8601\": \"9999-10-13T20:44:52.0000001Z\",\n          \"canonical_seconds\": \"253395463492\",\n          \"canonical_nanos\": 100,\n          \"error\": false,\n          \"smithy_format_value\": \"9999-10-13T20:44:52Z\"\n      },\n      {\n          \"iso8601\": \"9999-11-16T21:45:45.000001Z\",\n          \"canonical_seconds\": \"253398404745\",\n          \"canonical_nanos\": 1000,\n          \"error\": false,\n          \"smithy_format_value\": \"9999-11-16T21:45:45.000001Z\"\n      },\n      {\n          \"iso8601\": \"9999-12-15T22:46:38.00001Z\",\n          \"canonical_seconds\": \"253400913998\",\n          \"canonical_nanos\": 10000,\n          \"error\": false,\n          \"smithy_format_value\": \"9999-12-15T22:46:38.00001Z\"\n      }\n  ],\n  \"parse_epoch_seconds\": [\n      {\n          \"iso8601\": \"-9999-01-20T23:47:31.00001Z\",\n          \"canonical_seconds\": \"-377703389549\",\n          \"canonical_nanos\": 10000,\n          \"error\": false,\n          \"smithy_format_value\": \"-377703389549.00001\"\n      },\n      {\n          \"iso8601\": \"-9999-02-21T00:48:24.0001Z\",\n          \"canonical_seconds\": \"-377700707496\",\n          \"canonical_nanos\": 100000,\n          \"error\": false,\n          \"smithy_format_value\": \"-377700707496.0001\"\n      },\n      {\n          \"iso8601\": \"-9999-03-22T01:49:17.000234Z\",\n          \"canonical_seconds\": \"-377698198243\",\n          \"canonical_nanos\": 234000,\n          \"error\": false,\n          \"smithy_format_value\": \"-377698198243.000234\"\n      },\n      {\n          \"iso8601\": \"-9999-04-21T02:50:10Z\",\n          \"canonical_seconds\": \"-377695602590\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"-377695602590\"\n      },\n      {\n          \"iso8601\": \"-9999-05-24T03:51:03.000001Z\",\n          \"canonical_seconds\": \"-377692747737\",\n          \"canonical_nanos\": 1000,\n          \"error\": false,\n          \"smithy_format_value\": \"-377692747737.000001\"\n      },\n      {\n          \"iso8601\": \"-9999-06-23T04:52:56.00001Z\",\n          \"canonical_seconds\": \"-377690152024\",\n          \"canonical_nanos\": 10000,\n          \"error\": false,\n          \"smithy_format_value\": \"-377690152024.00001\"\n      },\n      {\n          \"iso8601\": \"-9999-07-26T05:53:49.0001Z\",\n          \"canonical_seconds\": \"-377687297171\",\n          \"canonical_nanos\": 100000,\n          \"error\": false,\n          \"smithy_format_value\": \"-377687297171.0001\"\n      },\n      {\n          \"iso8601\": \"-9999-08-27T06:54:42.000234Z\",\n          \"canonical_seconds\": \"-377684528718\",\n          \"canonical_nanos\": 234000,\n          \"error\": false,\n          \"smithy_format_value\": \"-377684528718.000234\"\n      },\n      {\n          \"iso8601\": \"-9999-09-26T07:55:35Z\",\n          \"canonical_seconds\": \"-377681933065\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"-377681933065\"\n      },\n      {\n          \"iso8601\": \"-9999-10-29T08:56:28.000001Z\",\n          \"canonical_seconds\": \"-377679078212\",\n          \"canonical_nanos\": 1000,\n          \"error\": false,\n          \"smithy_format_value\": \"-377679078212.000001\"\n      },\n      {\n          \"iso8601\": \"-9999-11-28T09:57:21.00001Z\",\n          \"canonical_seconds\": \"-377676482559\",\n          \"canonical_nanos\": 10000,\n          \"error\": false,\n          \"smithy_format_value\": \"-377676482559.00001\"\n      },\n      {\n          \"iso8601\": \"-9999-12-31T10:58:14.0001Z\",\n          \"canonical_seconds\": \"-377673627706\",\n          \"canonical_nanos\": 100000,\n          \"error\": false,\n          \"smithy_format_value\": \"-377673627706.0001\"\n      },\n      {\n          \"iso8601\": \"-0100-01-01T11:59:07.000234Z\",\n          \"canonical_seconds\": \"-65322849653\",\n          \"canonical_nanos\": 234000,\n          \"error\": false,\n          \"smithy_format_value\": \"-65322849653.000234\"\n      },\n      {\n          \"iso8601\": \"-0100-02-05T12:00:00Z\",\n          \"canonical_seconds\": \"-65319825600\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"-65319825600\"\n      },\n      {\n          \"iso8601\": \"-0100-03-03T13:01:53.000001Z\",\n          \"canonical_seconds\": \"-65317575487\",\n          \"canonical_nanos\": 1000,\n          \"error\": false,\n          \"smithy_format_value\": \"-65317575487.000001\"\n      },\n      {\n          \"iso8601\": \"-0100-04-03T14:02:46.00001Z\",\n          \"canonical_seconds\": \"-65314893434\",\n          \"canonical_nanos\": 10000,\n          \"error\": false,\n          \"smithy_format_value\": \"-65314893434.00001\"\n      },\n      {\n          \"iso8601\": \"-0100-05-05T15:03:39.0001Z\",\n          \"canonical_seconds\": \"-65312124981\",\n          \"canonical_nanos\": 100000,\n          \"error\": false,\n          \"smithy_format_value\": \"-65312124981.0001\"\n      },\n      {\n          \"iso8601\": \"-0100-06-05T16:04:32.000234Z\",\n          \"canonical_seconds\": \"-65309442928\",\n          \"canonical_nanos\": 234000,\n          \"error\": false,\n          \"smithy_format_value\": \"-65309442928.000234\"\n      },\n      {\n          \"iso8601\": \"-0100-07-07T17:05:25Z\",\n          \"canonical_seconds\": \"-65306674475\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"-65306674475\"\n      },\n      {\n          \"iso8601\": \"-0100-08-08T18:06:18.000001Z\",\n          \"canonical_seconds\": \"-65303906022\",\n          \"canonical_nanos\": 1000,\n          \"error\": false,\n          \"smithy_format_value\": \"-65303906022.000001\"\n      },\n      {\n          \"iso8601\": \"-0100-09-08T19:07:11.00001Z\",\n          \"canonical_seconds\": \"-65301223969\",\n          \"canonical_nanos\": 10000,\n          \"error\": false,\n          \"smithy_format_value\": \"-65301223969.00001\"\n      },\n      {\n          \"iso8601\": \"-0100-10-10T20:08:04.0001Z\",\n          \"canonical_seconds\": \"-65298455516\",\n          \"canonical_nanos\": 100000,\n          \"error\": false,\n          \"smithy_format_value\": \"-65298455516.0001\"\n      },\n      {\n          \"iso8601\": \"-0100-11-10T21:09:57.000234Z\",\n          \"canonical_seconds\": \"-65295773403\",\n          \"canonical_nanos\": 234000,\n          \"error\": false,\n          \"smithy_format_value\": \"-65295773403.000234\"\n      },\n      {\n          \"iso8601\": \"-0100-12-12T22:10:50Z\",\n          \"canonical_seconds\": \"-65293004950\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"-65293004950\"\n      },\n      {\n          \"iso8601\": \"-0001-01-13T23:11:43.000001Z\",\n          \"canonical_seconds\": \"-62197634897\",\n          \"canonical_nanos\": 1000,\n          \"error\": false,\n          \"smithy_format_value\": \"-62197634897.000001\"\n      },\n      {\n          \"iso8601\": \"-0001-02-17T00:12:36.00001Z\",\n          \"canonical_seconds\": \"-62194693644\",\n          \"canonical_nanos\": 10000,\n          \"error\": false,\n          \"smithy_format_value\": \"-62194693644.00001\"\n      },\n      {\n          \"iso8601\": \"-0001-03-15T01:13:29.0001Z\",\n          \"canonical_seconds\": \"-62192443591\",\n          \"canonical_nanos\": 100000,\n          \"error\": false,\n          \"smithy_format_value\": \"-62192443591.0001\"\n      },\n      {\n          \"iso8601\": \"-0001-04-15T02:14:22.000234Z\",\n          \"canonical_seconds\": \"-62189761538\",\n          \"canonical_nanos\": 234000,\n          \"error\": false,\n          \"smithy_format_value\": \"-62189761538.000234\"\n      },\n      {\n          \"iso8601\": \"-0001-05-17T03:15:15Z\",\n          \"canonical_seconds\": \"-62186993085\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"-62186993085\"\n      },\n      {\n          \"iso8601\": \"-0001-06-17T04:16:08.000001Z\",\n          \"canonical_seconds\": \"-62184311032\",\n          \"canonical_nanos\": 1000,\n          \"error\": false,\n          \"smithy_format_value\": \"-62184311032.000001\"\n      },\n      {\n          \"iso8601\": \"-0001-07-19T05:17:01.00001Z\",\n          \"canonical_seconds\": \"-62181542579\",\n          \"canonical_nanos\": 10000,\n          \"error\": false,\n          \"smithy_format_value\": \"-62181542579.00001\"\n      },\n      {\n          \"iso8601\": \"-0001-08-20T06:18:54.0001Z\",\n          \"canonical_seconds\": \"-62178774066\",\n          \"canonical_nanos\": 100000,\n          \"error\": false,\n          \"smithy_format_value\": \"-62178774066.0001\"\n      },\n      {\n          \"iso8601\": \"-0001-09-20T07:19:47.000234Z\",\n          \"canonical_seconds\": \"-62176092013\",\n          \"canonical_nanos\": 234000,\n          \"error\": false,\n          \"smithy_format_value\": \"-62176092013.000234\"\n      },\n      {\n          \"iso8601\": \"-0001-10-22T08:20:40Z\",\n          \"canonical_seconds\": \"-62173323560\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"-62173323560\"\n      },\n      {\n          \"iso8601\": \"-0001-11-22T09:21:33.000001Z\",\n          \"canonical_seconds\": \"-62170641507\",\n          \"canonical_nanos\": 1000,\n          \"error\": false,\n          \"smithy_format_value\": \"-62170641507.000001\"\n      },\n      {\n          \"iso8601\": \"-0001-12-24T10:22:26.00001Z\",\n          \"canonical_seconds\": \"-62167873054\",\n          \"canonical_nanos\": 10000,\n          \"error\": false,\n          \"smithy_format_value\": \"-62167873054.00001\"\n      },\n      {\n          \"iso8601\": \"0001-01-25T11:23:19.0001Z\",\n          \"canonical_seconds\": \"-62133482201\",\n          \"canonical_nanos\": 100000,\n          \"error\": false,\n          \"smithy_format_value\": \"-62133482201.0001\"\n      },\n      {\n          \"iso8601\": \"0001-02-01T12:24:12.000234Z\",\n          \"canonical_seconds\": \"-62132873748\",\n          \"canonical_nanos\": 234000,\n          \"error\": false,\n          \"smithy_format_value\": \"-62132873748.000234\"\n      },\n      {\n          \"iso8601\": \"0001-03-27T13:25:05Z\",\n          \"canonical_seconds\": \"-62128204495\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"-62128204495\"\n      },\n      {\n          \"iso8601\": \"0001-04-27T14:26:58.000001Z\",\n          \"canonical_seconds\": \"-62125522382\",\n          \"canonical_nanos\": 1000,\n          \"error\": false,\n          \"smithy_format_value\": \"-62125522382.000001\"\n      },\n      {\n          \"iso8601\": \"0001-05-29T15:27:51.00001Z\",\n          \"canonical_seconds\": \"-62122753929\",\n          \"canonical_nanos\": 10000,\n          \"error\": false,\n          \"smithy_format_value\": \"-62122753929.00001\"\n      },\n      {\n          \"iso8601\": \"0001-06-29T16:28:44.0001Z\",\n          \"canonical_seconds\": \"-62120071876\",\n          \"canonical_nanos\": 100000,\n          \"error\": false,\n          \"smithy_format_value\": \"-62120071876.0001\"\n      },\n      {\n          \"iso8601\": \"0001-07-31T17:29:37.000234Z\",\n          \"canonical_seconds\": \"-62117303423\",\n          \"canonical_nanos\": 234000,\n          \"error\": false,\n          \"smithy_format_value\": \"-62117303423.000234\"\n      },\n      {\n          \"iso8601\": \"0001-08-01T18:30:30Z\",\n          \"canonical_seconds\": \"-62117213370\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"-62117213370\"\n      },\n      {\n          \"iso8601\": \"0001-09-02T19:31:23.000001Z\",\n          \"canonical_seconds\": \"-62114444917\",\n          \"canonical_nanos\": 1000,\n          \"error\": false,\n          \"smithy_format_value\": \"-62114444917.000001\"\n      },\n      {\n          \"iso8601\": \"0001-10-03T20:32:16.00001Z\",\n          \"canonical_seconds\": \"-62111762864\",\n          \"canonical_nanos\": 10000,\n          \"error\": false,\n          \"smithy_format_value\": \"-62111762864.00001\"\n      },\n      {\n          \"iso8601\": \"0001-11-04T21:33:09.0001Z\",\n          \"canonical_seconds\": \"-62108994411\",\n          \"canonical_nanos\": 100000,\n          \"error\": false,\n          \"smithy_format_value\": \"-62108994411.0001\"\n      },\n      {\n          \"iso8601\": \"0001-12-05T22:34:02.000234Z\",\n          \"canonical_seconds\": \"-62106312358\",\n          \"canonical_nanos\": 234000,\n          \"error\": false,\n          \"smithy_format_value\": \"-62106312358.000234\"\n      },\n      {\n          \"iso8601\": \"0100-01-06T23:35:55Z\",\n          \"canonical_seconds\": \"-59010942245\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"-59010942245\"\n      },\n      {\n          \"iso8601\": \"0100-02-13T00:36:48.000001Z\",\n          \"canonical_seconds\": \"-59007741792\",\n          \"canonical_nanos\": 1000,\n          \"error\": false,\n          \"smithy_format_value\": \"-59007741792.000001\"\n      },\n      {\n          \"iso8601\": \"0100-03-08T01:37:41.00001Z\",\n          \"canonical_seconds\": \"-59005750939\",\n          \"canonical_nanos\": 10000,\n          \"error\": false,\n          \"smithy_format_value\": \"-59005750939.00001\"\n      },\n      {\n          \"iso8601\": \"0100-04-09T02:38:34.0001Z\",\n          \"canonical_seconds\": \"-59002982486\",\n          \"canonical_nanos\": 100000,\n          \"error\": false,\n          \"smithy_format_value\": \"-59002982486.0001\"\n      },\n      {\n          \"iso8601\": \"0100-05-10T03:39:27.000234Z\",\n          \"canonical_seconds\": \"-59000300433\",\n          \"canonical_nanos\": 234000,\n          \"error\": false,\n          \"smithy_format_value\": \"-59000300433.000234\"\n      },\n      {\n          \"iso8601\": \"0100-06-11T04:40:20Z\",\n          \"canonical_seconds\": \"-58997531980\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"-58997531980\"\n      },\n      {\n          \"iso8601\": \"0100-07-12T05:41:13.000001Z\",\n          \"canonical_seconds\": \"-58994849927\",\n          \"canonical_nanos\": 1000,\n          \"error\": false,\n          \"smithy_format_value\": \"-58994849927.000001\"\n      },\n      {\n          \"iso8601\": \"0100-08-13T06:42:06.00001Z\",\n          \"canonical_seconds\": \"-58992081474\",\n          \"canonical_nanos\": 10000,\n          \"error\": false,\n          \"smithy_format_value\": \"-58992081474.00001\"\n      },\n      {\n          \"iso8601\": \"0100-09-14T07:43:59.0001Z\",\n          \"canonical_seconds\": \"-58989312961\",\n          \"canonical_nanos\": 100000,\n          \"error\": false,\n          \"smithy_format_value\": \"-58989312961.0001\"\n      },\n      {\n          \"iso8601\": \"0100-10-15T08:44:52.000234Z\",\n          \"canonical_seconds\": \"-58986630908\",\n          \"canonical_nanos\": 234000,\n          \"error\": false,\n          \"smithy_format_value\": \"-58986630908.000234\"\n      },\n      {\n          \"iso8601\": \"0100-11-16T09:45:45Z\",\n          \"canonical_seconds\": \"-58983862455\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"-58983862455\"\n      },\n      {\n          \"iso8601\": \"0100-12-17T10:46:38.000001Z\",\n          \"canonical_seconds\": \"-58981180402\",\n          \"canonical_nanos\": 1000,\n          \"error\": false,\n          \"smithy_format_value\": \"-58981180402.000001\"\n      },\n      {\n          \"iso8601\": \"1584-02-29T23:59:59.999Z\",\n          \"canonical_seconds\": \"-12175833601\",\n          \"canonical_nanos\": 999000000,\n          \"error\": false,\n          \"smithy_format_value\": \"-12175833601.999\"\n      },\n      {\n          \"iso8601\": \"1969-01-18T11:47:31.00001Z\",\n          \"canonical_seconds\": \"-30024749\",\n          \"canonical_nanos\": 10000,\n          \"error\": false,\n          \"smithy_format_value\": \"-30024749.00001\"\n      },\n      {\n          \"iso8601\": \"1969-02-25T12:48:24.0001Z\",\n          \"canonical_seconds\": \"-26737896\",\n          \"canonical_nanos\": 100000,\n          \"error\": false,\n          \"smithy_format_value\": \"-26737896.0001\"\n      },\n      {\n          \"iso8601\": \"1969-03-20T13:49:17.000234Z\",\n          \"canonical_seconds\": \"-24747043\",\n          \"canonical_nanos\": 234000,\n          \"error\": false,\n          \"smithy_format_value\": \"-24747043.000234\"\n      },\n      {\n          \"iso8601\": \"1969-04-21T14:50:10Z\",\n          \"canonical_seconds\": \"-21978590\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"-21978590\"\n      },\n      {\n          \"iso8601\": \"1969-05-22T15:51:03.000001Z\",\n          \"canonical_seconds\": \"-19296537\",\n          \"canonical_nanos\": 1000,\n          \"error\": false,\n          \"smithy_format_value\": \"-19296537.000001\"\n      },\n      {\n          \"iso8601\": \"1969-06-23T16:52:56.00001Z\",\n          \"canonical_seconds\": \"-16528024\",\n          \"canonical_nanos\": 10000,\n          \"error\": false,\n          \"smithy_format_value\": \"-16528024.00001\"\n      },\n      {\n          \"iso8601\": \"1969-07-24T17:53:49.0001Z\",\n          \"canonical_seconds\": \"-13845971\",\n          \"canonical_nanos\": 100000,\n          \"error\": false,\n          \"smithy_format_value\": \"-13845971.0001\"\n      },\n      {\n          \"iso8601\": \"1969-08-25T18:54:42.000234Z\",\n          \"canonical_seconds\": \"-11077518\",\n          \"canonical_nanos\": 234000,\n          \"error\": false,\n          \"smithy_format_value\": \"-11077518.000234\"\n      },\n      {\n          \"iso8601\": \"1969-09-26T19:55:35Z\",\n          \"canonical_seconds\": \"-8309065\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"-8309065\"\n      },\n      {\n          \"iso8601\": \"1969-10-27T20:56:28.000001Z\",\n          \"canonical_seconds\": \"-5627012\",\n          \"canonical_nanos\": 1000,\n          \"error\": false,\n          \"smithy_format_value\": \"-5627012.000001\"\n      },\n      {\n          \"iso8601\": \"1969-11-28T21:57:21.00001Z\",\n          \"canonical_seconds\": \"-2858559\",\n          \"canonical_nanos\": 10000,\n          \"error\": false,\n          \"smithy_format_value\": \"-2858559.00001\"\n      },\n      {\n          \"iso8601\": \"1969-12-29T22:58:14.0001Z\",\n          \"canonical_seconds\": \"-176506\",\n          \"canonical_nanos\": 100000,\n          \"error\": false,\n          \"smithy_format_value\": \"-176506.0001\"\n      },\n      {\n          \"iso8601\": \"1970-01-30T23:59:07.000234Z\",\n          \"canonical_seconds\": \"2591947\",\n          \"canonical_nanos\": 234000,\n          \"error\": false,\n          \"smithy_format_value\": \"2591947.000234\"\n      },\n      {\n          \"iso8601\": \"1970-02-09T00:00:00Z\",\n          \"canonical_seconds\": \"3369600\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"3369600\"\n      },\n      {\n          \"iso8601\": \"1970-03-01T01:01:53.000001Z\",\n          \"canonical_seconds\": \"5101313\",\n          \"canonical_nanos\": 1000,\n          \"error\": false,\n          \"smithy_format_value\": \"5101313.000001\"\n      },\n      {\n          \"iso8601\": \"1970-04-03T02:02:46.00001Z\",\n          \"canonical_seconds\": \"7956166\",\n          \"canonical_nanos\": 10000,\n          \"error\": false,\n          \"smithy_format_value\": \"7956166.00001\"\n      },\n      {\n          \"iso8601\": \"1970-05-03T03:03:39.0001Z\",\n          \"canonical_seconds\": \"10551819\",\n          \"canonical_nanos\": 100000,\n          \"error\": false,\n          \"smithy_format_value\": \"10551819.0001\"\n      },\n      {\n          \"iso8601\": \"1970-06-05T04:04:32.000234Z\",\n          \"canonical_seconds\": \"13406672\",\n          \"canonical_nanos\": 234000,\n          \"error\": false,\n          \"smithy_format_value\": \"13406672.000234\"\n      },\n      {\n          \"iso8601\": \"1970-07-05T05:05:25Z\",\n          \"canonical_seconds\": \"16002325\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"16002325\"\n      },\n      {\n          \"iso8601\": \"1970-08-06T06:06:18.000001Z\",\n          \"canonical_seconds\": \"18770778\",\n          \"canonical_nanos\": 1000,\n          \"error\": false,\n          \"smithy_format_value\": \"18770778.000001\"\n      },\n      {\n          \"iso8601\": \"1970-09-08T07:07:11.00001Z\",\n          \"canonical_seconds\": \"21625631\",\n          \"canonical_nanos\": 10000,\n          \"error\": false,\n          \"smithy_format_value\": \"21625631.00001\"\n      },\n      {\n          \"iso8601\": \"1970-10-08T08:08:04.0001Z\",\n          \"canonical_seconds\": \"24221284\",\n          \"canonical_nanos\": 100000,\n          \"error\": false,\n          \"smithy_format_value\": \"24221284.0001\"\n      },\n      {\n          \"iso8601\": \"1970-11-10T09:09:57.000234Z\",\n          \"canonical_seconds\": \"27076197\",\n          \"canonical_nanos\": 234000,\n          \"error\": false,\n          \"smithy_format_value\": \"27076197.000234\"\n      },\n      {\n          \"iso8601\": \"1970-12-10T10:10:50Z\",\n          \"canonical_seconds\": \"29671850\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"29671850\"\n      },\n      {\n          \"iso8601\": \"2004-02-29T23:59:59.999Z\",\n          \"canonical_seconds\": \"1078099199\",\n          \"canonical_nanos\": 999000000,\n          \"error\": false,\n          \"smithy_format_value\": \"1078099199.999\"\n      },\n      {\n          \"iso8601\": \"2037-01-11T11:11:43.000001Z\",\n          \"canonical_seconds\": \"2115285103\",\n          \"canonical_nanos\": 1000,\n          \"error\": false,\n          \"smithy_format_value\": \"2115285103.000001\"\n      },\n      {\n          \"iso8601\": \"2037-02-21T12:12:36.00001Z\",\n          \"canonical_seconds\": \"2118831156\",\n          \"canonical_nanos\": 10000,\n          \"error\": false,\n          \"smithy_format_value\": \"2118831156.00001\"\n      },\n      {\n          \"iso8601\": \"2037-03-13T13:13:29.0001Z\",\n          \"canonical_seconds\": \"2120562809\",\n          \"canonical_nanos\": 100000,\n          \"error\": false,\n          \"smithy_format_value\": \"2120562809.0001\"\n      },\n      {\n          \"iso8601\": \"2037-04-15T14:14:22.000234Z\",\n          \"canonical_seconds\": \"2123417662\",\n          \"canonical_nanos\": 234000,\n          \"error\": false,\n          \"smithy_format_value\": \"2123417662.000234\"\n      },\n      {\n          \"iso8601\": \"2037-05-15T15:15:15Z\",\n          \"canonical_seconds\": \"2126013315\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"2126013315\"\n      },\n      {\n          \"iso8601\": \"2037-06-17T16:16:08.000001Z\",\n          \"canonical_seconds\": \"2128868168\",\n          \"canonical_nanos\": 1000,\n          \"error\": false,\n          \"smithy_format_value\": \"2128868168.000001\"\n      },\n      {\n          \"iso8601\": \"2037-07-17T17:17:01.00001Z\",\n          \"canonical_seconds\": \"2131463821\",\n          \"canonical_nanos\": 10000,\n          \"error\": false,\n          \"smithy_format_value\": \"2131463821.00001\"\n      },\n      {\n          \"iso8601\": \"2037-08-18T18:18:54.0001Z\",\n          \"canonical_seconds\": \"2134232334\",\n          \"canonical_nanos\": 100000,\n          \"error\": false,\n          \"smithy_format_value\": \"2134232334.0001\"\n      },\n      {\n          \"iso8601\": \"2037-09-20T19:19:47.000234Z\",\n          \"canonical_seconds\": \"2137087187\",\n          \"canonical_nanos\": 234000,\n          \"error\": false,\n          \"smithy_format_value\": \"2137087187.000234\"\n      },\n      {\n          \"iso8601\": \"2037-10-20T20:20:40Z\",\n          \"canonical_seconds\": \"2139682840\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"2139682840\"\n      },\n      {\n          \"iso8601\": \"2037-11-22T21:21:33.000001Z\",\n          \"canonical_seconds\": \"2142537693\",\n          \"canonical_nanos\": 1000,\n          \"error\": false,\n          \"smithy_format_value\": \"2142537693.000001\"\n      },\n      {\n          \"iso8601\": \"2037-12-22T22:22:26.00001Z\",\n          \"canonical_seconds\": \"2145133346\",\n          \"canonical_nanos\": 10000,\n          \"error\": false,\n          \"smithy_format_value\": \"2145133346.00001\"\n      },\n      {\n          \"iso8601\": \"2038-01-23T23:23:19.0001Z\",\n          \"canonical_seconds\": \"2147901799\",\n          \"canonical_nanos\": 100000,\n          \"error\": false,\n          \"smithy_format_value\": \"2147901799.0001\"\n      },\n      {\n          \"iso8601\": \"2038-02-05T00:24:12.000234Z\",\n          \"canonical_seconds\": \"2148942252\",\n          \"canonical_nanos\": 234000,\n          \"error\": false,\n          \"smithy_format_value\": \"2148942252.000234\"\n      },\n      {\n          \"iso8601\": \"2038-03-25T01:25:05Z\",\n          \"canonical_seconds\": \"2153093105\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"2153093105\"\n      },\n      {\n          \"iso8601\": \"2038-04-27T02:26:58.000001Z\",\n          \"canonical_seconds\": \"2155948018\",\n          \"canonical_nanos\": 1000,\n          \"error\": false,\n          \"smithy_format_value\": \"2155948018.000001\"\n      },\n      {\n          \"iso8601\": \"2038-05-27T03:27:51.00001Z\",\n          \"canonical_seconds\": \"2158543671\",\n          \"canonical_nanos\": 10000,\n          \"error\": false,\n          \"smithy_format_value\": \"2158543671.00001\"\n      },\n      {\n          \"iso8601\": \"2038-06-29T04:28:44.0001Z\",\n          \"canonical_seconds\": \"2161398524\",\n          \"canonical_nanos\": 100000,\n          \"error\": false,\n          \"smithy_format_value\": \"2161398524.0001\"\n      },\n      {\n          \"iso8601\": \"2038-07-29T05:29:37.000234Z\",\n          \"canonical_seconds\": \"2163994177\",\n          \"canonical_nanos\": 234000,\n          \"error\": false,\n          \"smithy_format_value\": \"2163994177.000234\"\n      },\n      {\n          \"iso8601\": \"2038-08-30T06:30:30Z\",\n          \"canonical_seconds\": \"2166762630\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"2166762630\"\n      },\n      {\n          \"iso8601\": \"2038-09-02T07:31:23.000001Z\",\n          \"canonical_seconds\": \"2167025483\",\n          \"canonical_nanos\": 1000,\n          \"error\": false,\n          \"smithy_format_value\": \"2167025483.000001\"\n      },\n      {\n          \"iso8601\": \"2038-10-01T08:32:16.00001Z\",\n          \"canonical_seconds\": \"2169534736\",\n          \"canonical_nanos\": 10000,\n          \"error\": false,\n          \"smithy_format_value\": \"2169534736.00001\"\n      },\n      {\n          \"iso8601\": \"2038-11-04T09:33:09.0001Z\",\n          \"canonical_seconds\": \"2172475989\",\n          \"canonical_nanos\": 100000,\n          \"error\": false,\n          \"smithy_format_value\": \"2172475989.0001\"\n      },\n      {\n          \"iso8601\": \"2038-12-03T10:34:02.000234Z\",\n          \"canonical_seconds\": \"2174985242\",\n          \"canonical_nanos\": 234000,\n          \"error\": false,\n          \"smithy_format_value\": \"2174985242.000234\"\n      },\n      {\n          \"iso8601\": \"9999-01-04T11:35:55Z\",\n          \"canonical_seconds\": \"253371065755\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"253371065755\"\n      },\n      {\n          \"iso8601\": \"9999-02-17T12:36:48.000001Z\",\n          \"canonical_seconds\": \"253374871008\",\n          \"canonical_nanos\": 1000,\n          \"error\": false,\n          \"smithy_format_value\": \"253374871008.000001\"\n      },\n      {\n          \"iso8601\": \"9999-03-06T13:37:41.00001Z\",\n          \"canonical_seconds\": \"253376343461\",\n          \"canonical_nanos\": 10000,\n          \"error\": false,\n          \"smithy_format_value\": \"253376343461.00001\"\n      },\n      {\n          \"iso8601\": \"9999-04-09T14:38:34.0001Z\",\n          \"canonical_seconds\": \"253379284714\",\n          \"canonical_nanos\": 100000,\n          \"error\": false,\n          \"smithy_format_value\": \"253379284714.0001\"\n      },\n      {\n          \"iso8601\": \"9999-05-08T15:39:27.000234Z\",\n          \"canonical_seconds\": \"253381793967\",\n          \"canonical_nanos\": 234000,\n          \"error\": false,\n          \"smithy_format_value\": \"253381793967.000234\"\n      },\n      {\n          \"iso8601\": \"9999-06-11T16:40:20Z\",\n          \"canonical_seconds\": \"253384735220\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"253384735220\"\n      },\n      {\n          \"iso8601\": \"9999-07-10T17:41:13.000001Z\",\n          \"canonical_seconds\": \"253387244473\",\n          \"canonical_nanos\": 1000,\n          \"error\": false,\n          \"smithy_format_value\": \"253387244473.000001\"\n      },\n      {\n          \"iso8601\": \"9999-08-11T18:42:06.00001Z\",\n          \"canonical_seconds\": \"253390012926\",\n          \"canonical_nanos\": 10000,\n          \"error\": false,\n          \"smithy_format_value\": \"253390012926.00001\"\n      },\n      {\n          \"iso8601\": \"9999-09-14T19:43:59.0001Z\",\n          \"canonical_seconds\": \"253392954239\",\n          \"canonical_nanos\": 100000,\n          \"error\": false,\n          \"smithy_format_value\": \"253392954239.0001\"\n      },\n      {\n          \"iso8601\": \"9999-10-13T20:44:52.000234Z\",\n          \"canonical_seconds\": \"253395463492\",\n          \"canonical_nanos\": 234000,\n          \"error\": false,\n          \"smithy_format_value\": \"253395463492.000234\"\n      },\n      {\n          \"iso8601\": \"9999-11-16T21:45:45Z\",\n          \"canonical_seconds\": \"253398404745\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"253398404745\"\n      },\n      {\n          \"iso8601\": \"9999-12-15T22:46:38.000001Z\",\n          \"canonical_seconds\": \"253400913998\",\n          \"canonical_nanos\": 1000,\n          \"error\": false,\n          \"smithy_format_value\": \"253400913998.000001\"\n      }\n  ],\n  \"parse_http_date\": [\n      {\n          \"iso8601\": \"0001-01-25T11:23:19.1Z\",\n          \"canonical_seconds\": \"-62133482201\",\n          \"canonical_nanos\": 100000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Thu, 25 Jan 0001 11:23:19.1 GMT\"\n      },\n      {\n          \"iso8601\": \"0001-02-01T12:24:12.234Z\",\n          \"canonical_seconds\": \"-62132873748\",\n          \"canonical_nanos\": 234000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Thu, 01 Feb 0001 12:24:12.234 GMT\"\n      },\n      {\n          \"iso8601\": \"0001-03-27T13:25:05Z\",\n          \"canonical_seconds\": \"-62128204495\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"Tue, 27 Mar 0001 13:25:05 GMT\"\n      },\n      {\n          \"iso8601\": \"0001-04-27T14:26:58.001Z\",\n          \"canonical_seconds\": \"-62125522382\",\n          \"canonical_nanos\": 1000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Fri, 27 Apr 0001 14:26:58.001 GMT\"\n      },\n      {\n          \"iso8601\": \"0001-05-29T15:27:51.01Z\",\n          \"canonical_seconds\": \"-62122753929\",\n          \"canonical_nanos\": 10000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Tue, 29 May 0001 15:27:51.01 GMT\"\n      },\n      {\n          \"iso8601\": \"0001-06-29T16:28:44.1Z\",\n          \"canonical_seconds\": \"-62120071876\",\n          \"canonical_nanos\": 100000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Fri, 29 Jun 0001 16:28:44.1 GMT\"\n      },\n      {\n          \"iso8601\": \"0001-07-31T17:29:37.234Z\",\n          \"canonical_seconds\": \"-62117303423\",\n          \"canonical_nanos\": 234000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Tue, 31 Jul 0001 17:29:37.234 GMT\"\n      },\n      {\n          \"iso8601\": \"0001-08-01T18:30:30Z\",\n          \"canonical_seconds\": \"-62117213370\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"Wed, 01 Aug 0001 18:30:30 GMT\"\n      },\n      {\n          \"iso8601\": \"0001-09-02T19:31:23.001Z\",\n          \"canonical_seconds\": \"-62114444917\",\n          \"canonical_nanos\": 1000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Sun, 02 Sep 0001 19:31:23.001 GMT\"\n      },\n      {\n          \"iso8601\": \"0001-10-03T20:32:16.01Z\",\n          \"canonical_seconds\": \"-62111762864\",\n          \"canonical_nanos\": 10000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Wed, 03 Oct 0001 20:32:16.01 GMT\"\n      },\n      {\n          \"iso8601\": \"0001-11-04T21:33:09.1Z\",\n          \"canonical_seconds\": \"-62108994411\",\n          \"canonical_nanos\": 100000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Sun, 04 Nov 0001 21:33:09.1 GMT\"\n      },\n      {\n          \"iso8601\": \"0001-12-05T22:34:02.234Z\",\n          \"canonical_seconds\": \"-62106312358\",\n          \"canonical_nanos\": 234000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Wed, 05 Dec 0001 22:34:02.234 GMT\"\n      },\n      {\n          \"iso8601\": \"0100-01-06T23:35:55Z\",\n          \"canonical_seconds\": \"-59010942245\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"Wed, 06 Jan 0100 23:35:55 GMT\"\n      },\n      {\n          \"iso8601\": \"0100-02-13T00:36:48.001Z\",\n          \"canonical_seconds\": \"-59007741792\",\n          \"canonical_nanos\": 1000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Sat, 13 Feb 0100 00:36:48.001 GMT\"\n      },\n      {\n          \"iso8601\": \"0100-03-08T01:37:41.01Z\",\n          \"canonical_seconds\": \"-59005750939\",\n          \"canonical_nanos\": 10000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Mon, 08 Mar 0100 01:37:41.01 GMT\"\n      },\n      {\n          \"iso8601\": \"0100-04-09T02:38:34.1Z\",\n          \"canonical_seconds\": \"-59002982486\",\n          \"canonical_nanos\": 100000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Fri, 09 Apr 0100 02:38:34.1 GMT\"\n      },\n      {\n          \"iso8601\": \"0100-05-10T03:39:27.234Z\",\n          \"canonical_seconds\": \"-59000300433\",\n          \"canonical_nanos\": 234000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Mon, 10 May 0100 03:39:27.234 GMT\"\n      },\n      {\n          \"iso8601\": \"0100-06-11T04:40:20Z\",\n          \"canonical_seconds\": \"-58997531980\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"Fri, 11 Jun 0100 04:40:20 GMT\"\n      },\n      {\n          \"iso8601\": \"0100-07-12T05:41:13.001Z\",\n          \"canonical_seconds\": \"-58994849927\",\n          \"canonical_nanos\": 1000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Mon, 12 Jul 0100 05:41:13.001 GMT\"\n      },\n      {\n          \"iso8601\": \"0100-08-13T06:42:06.01Z\",\n          \"canonical_seconds\": \"-58992081474\",\n          \"canonical_nanos\": 10000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Fri, 13 Aug 0100 06:42:06.01 GMT\"\n      },\n      {\n          \"iso8601\": \"0100-09-14T07:43:59.1Z\",\n          \"canonical_seconds\": \"-58989312961\",\n          \"canonical_nanos\": 100000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Tue, 14 Sep 0100 07:43:59.1 GMT\"\n      },\n      {\n          \"iso8601\": \"0100-10-15T08:44:52.234Z\",\n          \"canonical_seconds\": \"-58986630908\",\n          \"canonical_nanos\": 234000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Fri, 15 Oct 0100 08:44:52.234 GMT\"\n      },\n      {\n          \"iso8601\": \"0100-11-16T09:45:45Z\",\n          \"canonical_seconds\": \"-58983862455\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"Tue, 16 Nov 0100 09:45:45 GMT\"\n      },\n      {\n          \"iso8601\": \"0100-12-17T10:46:38.001Z\",\n          \"canonical_seconds\": \"-58981180402\",\n          \"canonical_nanos\": 1000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Fri, 17 Dec 0100 10:46:38.001 GMT\"\n      },\n      {\n          \"iso8601\": \"1584-02-29T23:59:59.999Z\",\n          \"canonical_seconds\": \"-12175833601\",\n          \"canonical_nanos\": 999000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Wed, 29 Feb 1584 23:59:59.999 GMT\"\n      },\n      {\n          \"iso8601\": \"1969-01-18T11:47:31.01Z\",\n          \"canonical_seconds\": \"-30024749\",\n          \"canonical_nanos\": 10000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Sat, 18 Jan 1969 11:47:31.01 GMT\"\n      },\n      {\n          \"iso8601\": \"1969-02-25T12:48:24.1Z\",\n          \"canonical_seconds\": \"-26737896\",\n          \"canonical_nanos\": 100000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Tue, 25 Feb 1969 12:48:24.1 GMT\"\n      },\n      {\n          \"iso8601\": \"1969-03-20T13:49:17.234Z\",\n          \"canonical_seconds\": \"-24747043\",\n          \"canonical_nanos\": 234000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Thu, 20 Mar 1969 13:49:17.234 GMT\"\n      },\n      {\n          \"iso8601\": \"1969-04-21T14:50:10Z\",\n          \"canonical_seconds\": \"-21978590\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"Mon, 21 Apr 1969 14:50:10 GMT\"\n      },\n      {\n          \"iso8601\": \"1969-05-22T15:51:03.001Z\",\n          \"canonical_seconds\": \"-19296537\",\n          \"canonical_nanos\": 1000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Thu, 22 May 1969 15:51:03.001 GMT\"\n      },\n      {\n          \"iso8601\": \"1969-06-23T16:52:56.01Z\",\n          \"canonical_seconds\": \"-16528024\",\n          \"canonical_nanos\": 10000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Mon, 23 Jun 1969 16:52:56.01 GMT\"\n      },\n      {\n          \"iso8601\": \"1969-07-24T17:53:49.1Z\",\n          \"canonical_seconds\": \"-13845971\",\n          \"canonical_nanos\": 100000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Thu, 24 Jul 1969 17:53:49.1 GMT\"\n      },\n      {\n          \"iso8601\": \"1969-08-25T18:54:42.234Z\",\n          \"canonical_seconds\": \"-11077518\",\n          \"canonical_nanos\": 234000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Mon, 25 Aug 1969 18:54:42.234 GMT\"\n      },\n      {\n          \"iso8601\": \"1969-09-26T19:55:35Z\",\n          \"canonical_seconds\": \"-8309065\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"Fri, 26 Sep 1969 19:55:35 GMT\"\n      },\n      {\n          \"iso8601\": \"1969-10-27T20:56:28.001Z\",\n          \"canonical_seconds\": \"-5627012\",\n          \"canonical_nanos\": 1000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Mon, 27 Oct 1969 20:56:28.001 GMT\"\n      },\n      {\n          \"iso8601\": \"1969-11-28T21:57:21.01Z\",\n          \"canonical_seconds\": \"-2858559\",\n          \"canonical_nanos\": 10000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Fri, 28 Nov 1969 21:57:21.01 GMT\"\n      },\n      {\n          \"iso8601\": \"1969-12-29T22:58:14.1Z\",\n          \"canonical_seconds\": \"-176506\",\n          \"canonical_nanos\": 100000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Mon, 29 Dec 1969 22:58:14.1 GMT\"\n      },\n      {\n          \"iso8601\": \"1970-01-30T23:59:07.234Z\",\n          \"canonical_seconds\": \"2591947\",\n          \"canonical_nanos\": 234000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Fri, 30 Jan 1970 23:59:07.234 GMT\"\n      },\n      {\n          \"iso8601\": \"1970-02-09T00:00:00Z\",\n          \"canonical_seconds\": \"3369600\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"Mon, 09 Feb 1970 00:00:00 GMT\"\n      },\n      {\n          \"iso8601\": \"1970-03-01T01:01:53.001Z\",\n          \"canonical_seconds\": \"5101313\",\n          \"canonical_nanos\": 1000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Sun, 01 Mar 1970 01:01:53.001 GMT\"\n      },\n      {\n          \"iso8601\": \"1970-04-03T02:02:46.01Z\",\n          \"canonical_seconds\": \"7956166\",\n          \"canonical_nanos\": 10000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Fri, 03 Apr 1970 02:02:46.01 GMT\"\n      },\n      {\n          \"iso8601\": \"1970-05-03T03:03:39.1Z\",\n          \"canonical_seconds\": \"10551819\",\n          \"canonical_nanos\": 100000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Sun, 03 May 1970 03:03:39.1 GMT\"\n      },\n      {\n          \"iso8601\": \"1970-06-05T04:04:32.234Z\",\n          \"canonical_seconds\": \"13406672\",\n          \"canonical_nanos\": 234000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Fri, 05 Jun 1970 04:04:32.234 GMT\"\n      },\n      {\n          \"iso8601\": \"1970-07-05T05:05:25Z\",\n          \"canonical_seconds\": \"16002325\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"Sun, 05 Jul 1970 05:05:25 GMT\"\n      },\n      {\n          \"iso8601\": \"1970-08-06T06:06:18.001Z\",\n          \"canonical_seconds\": \"18770778\",\n          \"canonical_nanos\": 1000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Thu, 06 Aug 1970 06:06:18.001 GMT\"\n      },\n      {\n          \"iso8601\": \"1970-09-08T07:07:11.01Z\",\n          \"canonical_seconds\": \"21625631\",\n          \"canonical_nanos\": 10000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Tue, 08 Sep 1970 07:07:11.01 GMT\"\n      },\n      {\n          \"iso8601\": \"1970-10-08T08:08:04.1Z\",\n          \"canonical_seconds\": \"24221284\",\n          \"canonical_nanos\": 100000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Thu, 08 Oct 1970 08:08:04.1 GMT\"\n      },\n      {\n          \"iso8601\": \"1970-11-10T09:09:57.234Z\",\n          \"canonical_seconds\": \"27076197\",\n          \"canonical_nanos\": 234000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Tue, 10 Nov 1970 09:09:57.234 GMT\"\n      },\n      {\n          \"iso8601\": \"1970-12-10T10:10:50Z\",\n          \"canonical_seconds\": \"29671850\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"Thu, 10 Dec 1970 10:10:50 GMT\"\n      },\n      {\n          \"iso8601\": \"2004-02-29T23:59:59.999Z\",\n          \"canonical_seconds\": \"1078099199\",\n          \"canonical_nanos\": 999000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Sun, 29 Feb 2004 23:59:59.999 GMT\"\n      },\n      {\n          \"iso8601\": \"2037-01-11T11:11:43.001Z\",\n          \"canonical_seconds\": \"2115285103\",\n          \"canonical_nanos\": 1000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Sun, 11 Jan 2037 11:11:43.001 GMT\"\n      },\n      {\n          \"iso8601\": \"2037-02-21T12:12:36.01Z\",\n          \"canonical_seconds\": \"2118831156\",\n          \"canonical_nanos\": 10000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Sat, 21 Feb 2037 12:12:36.01 GMT\"\n      },\n      {\n          \"iso8601\": \"2037-03-13T13:13:29.1Z\",\n          \"canonical_seconds\": \"2120562809\",\n          \"canonical_nanos\": 100000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Fri, 13 Mar 2037 13:13:29.1 GMT\"\n      },\n      {\n          \"iso8601\": \"2037-04-15T14:14:22.234Z\",\n          \"canonical_seconds\": \"2123417662\",\n          \"canonical_nanos\": 234000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Wed, 15 Apr 2037 14:14:22.234 GMT\"\n      },\n      {\n          \"iso8601\": \"2037-05-15T15:15:15Z\",\n          \"canonical_seconds\": \"2126013315\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"Fri, 15 May 2037 15:15:15 GMT\"\n      },\n      {\n          \"iso8601\": \"2037-06-17T16:16:08.001Z\",\n          \"canonical_seconds\": \"2128868168\",\n          \"canonical_nanos\": 1000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Wed, 17 Jun 2037 16:16:08.001 GMT\"\n      },\n      {\n          \"iso8601\": \"2037-07-17T17:17:01.01Z\",\n          \"canonical_seconds\": \"2131463821\",\n          \"canonical_nanos\": 10000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Fri, 17 Jul 2037 17:17:01.01 GMT\"\n      },\n      {\n          \"iso8601\": \"2037-08-18T18:18:54.1Z\",\n          \"canonical_seconds\": \"2134232334\",\n          \"canonical_nanos\": 100000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Tue, 18 Aug 2037 18:18:54.1 GMT\"\n      },\n      {\n          \"iso8601\": \"2037-09-20T19:19:47.234Z\",\n          \"canonical_seconds\": \"2137087187\",\n          \"canonical_nanos\": 234000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Sun, 20 Sep 2037 19:19:47.234 GMT\"\n      },\n      {\n          \"iso8601\": \"2037-10-20T20:20:40Z\",\n          \"canonical_seconds\": \"2139682840\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"Tue, 20 Oct 2037 20:20:40 GMT\"\n      },\n      {\n          \"iso8601\": \"2037-11-22T21:21:33.001Z\",\n          \"canonical_seconds\": \"2142537693\",\n          \"canonical_nanos\": 1000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Sun, 22 Nov 2037 21:21:33.001 GMT\"\n      },\n      {\n          \"iso8601\": \"2037-12-22T22:22:26.01Z\",\n          \"canonical_seconds\": \"2145133346\",\n          \"canonical_nanos\": 10000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Tue, 22 Dec 2037 22:22:26.01 GMT\"\n      },\n      {\n          \"iso8601\": \"2038-01-23T23:23:19.1Z\",\n          \"canonical_seconds\": \"2147901799\",\n          \"canonical_nanos\": 100000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Sat, 23 Jan 2038 23:23:19.1 GMT\"\n      },\n      {\n          \"iso8601\": \"2038-02-05T00:24:12.234Z\",\n          \"canonical_seconds\": \"2148942252\",\n          \"canonical_nanos\": 234000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Fri, 05 Feb 2038 00:24:12.234 GMT\"\n      },\n      {\n          \"iso8601\": \"2038-03-25T01:25:05Z\",\n          \"canonical_seconds\": \"2153093105\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"Thu, 25 Mar 2038 01:25:05 GMT\"\n      },\n      {\n          \"iso8601\": \"2038-04-27T02:26:58.001Z\",\n          \"canonical_seconds\": \"2155948018\",\n          \"canonical_nanos\": 1000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Tue, 27 Apr 2038 02:26:58.001 GMT\"\n      },\n      {\n          \"iso8601\": \"2038-05-27T03:27:51.01Z\",\n          \"canonical_seconds\": \"2158543671\",\n          \"canonical_nanos\": 10000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Thu, 27 May 2038 03:27:51.01 GMT\"\n      },\n      {\n          \"iso8601\": \"2038-06-29T04:28:44.1Z\",\n          \"canonical_seconds\": \"2161398524\",\n          \"canonical_nanos\": 100000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Tue, 29 Jun 2038 04:28:44.1 GMT\"\n      },\n      {\n          \"iso8601\": \"2038-07-29T05:29:37.234Z\",\n          \"canonical_seconds\": \"2163994177\",\n          \"canonical_nanos\": 234000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Thu, 29 Jul 2038 05:29:37.234 GMT\"\n      },\n      {\n          \"iso8601\": \"2038-08-30T06:30:30Z\",\n          \"canonical_seconds\": \"2166762630\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"Mon, 30 Aug 2038 06:30:30 GMT\"\n      },\n      {\n          \"iso8601\": \"2038-09-02T07:31:23.001Z\",\n          \"canonical_seconds\": \"2167025483\",\n          \"canonical_nanos\": 1000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Thu, 02 Sep 2038 07:31:23.001 GMT\"\n      },\n      {\n          \"iso8601\": \"2038-10-01T08:32:16.01Z\",\n          \"canonical_seconds\": \"2169534736\",\n          \"canonical_nanos\": 10000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Fri, 01 Oct 2038 08:32:16.01 GMT\"\n      },\n      {\n          \"iso8601\": \"2038-11-04T09:33:09.1Z\",\n          \"canonical_seconds\": \"2172475989\",\n          \"canonical_nanos\": 100000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Thu, 04 Nov 2038 09:33:09.1 GMT\"\n      },\n      {\n          \"iso8601\": \"2038-12-03T10:34:02.234Z\",\n          \"canonical_seconds\": \"2174985242\",\n          \"canonical_nanos\": 234000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Fri, 03 Dec 2038 10:34:02.234 GMT\"\n      },\n      {\n          \"iso8601\": \"9999-01-04T11:35:55Z\",\n          \"canonical_seconds\": \"253371065755\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"Mon, 04 Jan 9999 11:35:55 GMT\"\n      },\n      {\n          \"iso8601\": \"9999-02-17T12:36:48.001Z\",\n          \"canonical_seconds\": \"253374871008\",\n          \"canonical_nanos\": 1000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Wed, 17 Feb 9999 12:36:48.001 GMT\"\n      },\n      {\n          \"iso8601\": \"9999-03-06T13:37:41.01Z\",\n          \"canonical_seconds\": \"253376343461\",\n          \"canonical_nanos\": 10000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Sat, 06 Mar 9999 13:37:41.01 GMT\"\n      },\n      {\n          \"iso8601\": \"9999-04-09T14:38:34.1Z\",\n          \"canonical_seconds\": \"253379284714\",\n          \"canonical_nanos\": 100000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Fri, 09 Apr 9999 14:38:34.1 GMT\"\n      },\n      {\n          \"iso8601\": \"9999-05-08T15:39:27.234Z\",\n          \"canonical_seconds\": \"253381793967\",\n          \"canonical_nanos\": 234000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Sat, 08 May 9999 15:39:27.234 GMT\"\n      },\n      {\n          \"iso8601\": \"9999-06-11T16:40:20Z\",\n          \"canonical_seconds\": \"253384735220\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"Fri, 11 Jun 9999 16:40:20 GMT\"\n      },\n      {\n          \"iso8601\": \"9999-07-10T17:41:13.001Z\",\n          \"canonical_seconds\": \"253387244473\",\n          \"canonical_nanos\": 1000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Sat, 10 Jul 9999 17:41:13.001 GMT\"\n      },\n      {\n          \"iso8601\": \"9999-08-11T18:42:06.01Z\",\n          \"canonical_seconds\": \"253390012926\",\n          \"canonical_nanos\": 10000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Wed, 11 Aug 9999 18:42:06.01 GMT\"\n      },\n      {\n          \"iso8601\": \"9999-09-14T19:43:59.1Z\",\n          \"canonical_seconds\": \"253392954239\",\n          \"canonical_nanos\": 100000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Tue, 14 Sep 9999 19:43:59.1 GMT\"\n      },\n      {\n          \"iso8601\": \"9999-10-13T20:44:52.234Z\",\n          \"canonical_seconds\": \"253395463492\",\n          \"canonical_nanos\": 234000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Wed, 13 Oct 9999 20:44:52.234 GMT\"\n      },\n      {\n          \"iso8601\": \"9999-11-16T21:45:45Z\",\n          \"canonical_seconds\": \"253398404745\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"Tue, 16 Nov 9999 21:45:45 GMT\"\n      },\n      {\n          \"iso8601\": \"9999-12-15T22:46:38.001Z\",\n          \"canonical_seconds\": \"253400913998\",\n          \"canonical_nanos\": 1000000,\n          \"error\": false,\n          \"smithy_format_value\": \"Wed, 15 Dec 9999 22:46:38.001 GMT\"\n      }\n  ],\n  \"parse_date_time\": [\n      {\n          \"iso8601\": \"0001-01-25T11:23:19.0001Z\",\n          \"canonical_seconds\": \"-62133482201\",\n          \"canonical_nanos\": 100000,\n          \"error\": false,\n          \"smithy_format_value\": \"0001-01-25T11:23:19.0001Z\"\n      },\n      {\n          \"iso8601\": \"0001-02-01T12:24:12.000234Z\",\n          \"canonical_seconds\": \"-62132873748\",\n          \"canonical_nanos\": 234000,\n          \"error\": false,\n          \"smithy_format_value\": \"0001-02-01T12:24:12.000234Z\"\n      },\n      {\n          \"iso8601\": \"0001-03-27T13:25:05Z\",\n          \"canonical_seconds\": \"-62128204495\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"0001-03-27T13:25:05Z\"\n      },\n      {\n          \"iso8601\": \"0001-04-27T14:26:58.000001Z\",\n          \"canonical_seconds\": \"-62125522382\",\n          \"canonical_nanos\": 1000,\n          \"error\": false,\n          \"smithy_format_value\": \"0001-04-27T14:26:58.000001Z\"\n      },\n      {\n          \"iso8601\": \"0001-05-29T15:27:51.00001Z\",\n          \"canonical_seconds\": \"-62122753929\",\n          \"canonical_nanos\": 10000,\n          \"error\": false,\n          \"smithy_format_value\": \"0001-05-29T15:27:51.00001Z\"\n      },\n      {\n          \"iso8601\": \"0001-06-29T16:28:44.0001Z\",\n          \"canonical_seconds\": \"-62120071876\",\n          \"canonical_nanos\": 100000,\n          \"error\": false,\n          \"smithy_format_value\": \"0001-06-29T16:28:44.0001Z\"\n      },\n      {\n          \"iso8601\": \"0001-07-31T17:29:37.000234Z\",\n          \"canonical_seconds\": \"-62117303423\",\n          \"canonical_nanos\": 234000,\n          \"error\": false,\n          \"smithy_format_value\": \"0001-07-31T17:29:37.000234Z\"\n      },\n      {\n          \"iso8601\": \"0001-08-01T18:30:30Z\",\n          \"canonical_seconds\": \"-62117213370\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"0001-08-01T18:30:30Z\"\n      },\n      {\n          \"iso8601\": \"0001-09-02T19:31:23.000001Z\",\n          \"canonical_seconds\": \"-62114444917\",\n          \"canonical_nanos\": 1000,\n          \"error\": false,\n          \"smithy_format_value\": \"0001-09-02T19:31:23.000001Z\"\n      },\n      {\n          \"iso8601\": \"0001-10-03T20:32:16.00001Z\",\n          \"canonical_seconds\": \"-62111762864\",\n          \"canonical_nanos\": 10000,\n          \"error\": false,\n          \"smithy_format_value\": \"0001-10-03T20:32:16.00001Z\"\n      },\n      {\n          \"iso8601\": \"0001-11-04T21:33:09.0001Z\",\n          \"canonical_seconds\": \"-62108994411\",\n          \"canonical_nanos\": 100000,\n          \"error\": false,\n          \"smithy_format_value\": \"0001-11-04T21:33:09.0001Z\"\n      },\n      {\n          \"iso8601\": \"0001-12-05T22:34:02.000234Z\",\n          \"canonical_seconds\": \"-62106312358\",\n          \"canonical_nanos\": 234000,\n          \"error\": false,\n          \"smithy_format_value\": \"0001-12-05T22:34:02.000234Z\"\n      },\n      {\n          \"iso8601\": \"0100-01-06T23:35:55Z\",\n          \"canonical_seconds\": \"-59010942245\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"0100-01-06T23:35:55Z\"\n      },\n      {\n          \"iso8601\": \"0100-02-13T00:36:48.000001Z\",\n          \"canonical_seconds\": \"-59007741792\",\n          \"canonical_nanos\": 1000,\n          \"error\": false,\n          \"smithy_format_value\": \"0100-02-13T00:36:48.000001Z\"\n      },\n      {\n          \"iso8601\": \"0100-03-08T01:37:41.00001Z\",\n          \"canonical_seconds\": \"-59005750939\",\n          \"canonical_nanos\": 10000,\n          \"error\": false,\n          \"smithy_format_value\": \"0100-03-08T01:37:41.00001Z\"\n      },\n      {\n          \"iso8601\": \"0100-04-09T02:38:34.0001Z\",\n          \"canonical_seconds\": \"-59002982486\",\n          \"canonical_nanos\": 100000,\n          \"error\": false,\n          \"smithy_format_value\": \"0100-04-09T02:38:34.0001Z\"\n      },\n      {\n          \"iso8601\": \"0100-05-10T03:39:27.000234Z\",\n          \"canonical_seconds\": \"-59000300433\",\n          \"canonical_nanos\": 234000,\n          \"error\": false,\n          \"smithy_format_value\": \"0100-05-10T03:39:27.000234Z\"\n      },\n      {\n          \"iso8601\": \"0100-06-11T04:40:20Z\",\n          \"canonical_seconds\": \"-58997531980\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"0100-06-11T04:40:20Z\"\n      },\n      {\n          \"iso8601\": \"0100-07-12T05:41:13.000001Z\",\n          \"canonical_seconds\": \"-58994849927\",\n          \"canonical_nanos\": 1000,\n          \"error\": false,\n          \"smithy_format_value\": \"0100-07-12T05:41:13.000001Z\"\n      },\n      {\n          \"iso8601\": \"0100-08-13T06:42:06.00001Z\",\n          \"canonical_seconds\": \"-58992081474\",\n          \"canonical_nanos\": 10000,\n          \"error\": false,\n          \"smithy_format_value\": \"0100-08-13T06:42:06.00001Z\"\n      },\n      {\n          \"iso8601\": \"0100-09-14T07:43:59.0001Z\",\n          \"canonical_seconds\": \"-58989312961\",\n          \"canonical_nanos\": 100000,\n          \"error\": false,\n          \"smithy_format_value\": \"0100-09-14T07:43:59.0001Z\"\n      },\n      {\n          \"iso8601\": \"0100-10-15T08:44:52.000234Z\",\n          \"canonical_seconds\": \"-58986630908\",\n          \"canonical_nanos\": 234000,\n          \"error\": false,\n          \"smithy_format_value\": \"0100-10-15T08:44:52.000234Z\"\n      },\n      {\n          \"iso8601\": \"0100-11-16T09:45:45Z\",\n          \"canonical_seconds\": \"-58983862455\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"0100-11-16T09:45:45Z\"\n      },\n      {\n          \"iso8601\": \"0100-12-17T10:46:38.000001Z\",\n          \"canonical_seconds\": \"-58981180402\",\n          \"canonical_nanos\": 1000,\n          \"error\": false,\n          \"smithy_format_value\": \"0100-12-17T10:46:38.000001Z\"\n      },\n      {\n          \"iso8601\": \"1584-02-29T23:59:59.999Z\",\n          \"canonical_seconds\": \"-12175833601\",\n          \"canonical_nanos\": 999000000,\n          \"error\": false,\n          \"smithy_format_value\": \"1584-02-29T23:59:59.999Z\"\n      },\n      {\n          \"iso8601\": \"1969-01-18T11:47:31.00001Z\",\n          \"canonical_seconds\": \"-30024749\",\n          \"canonical_nanos\": 10000,\n          \"error\": false,\n          \"smithy_format_value\": \"1969-01-18T11:47:31.00001Z\"\n      },\n      {\n          \"iso8601\": \"1969-02-25T12:48:24.0001Z\",\n          \"canonical_seconds\": \"-26737896\",\n          \"canonical_nanos\": 100000,\n          \"error\": false,\n          \"smithy_format_value\": \"1969-02-25T12:48:24.0001Z\"\n      },\n      {\n          \"iso8601\": \"1969-03-20T13:49:17.000234Z\",\n          \"canonical_seconds\": \"-24747043\",\n          \"canonical_nanos\": 234000,\n          \"error\": false,\n          \"smithy_format_value\": \"1969-03-20T13:49:17.000234Z\"\n      },\n      {\n          \"iso8601\": \"1969-04-21T14:50:10Z\",\n          \"canonical_seconds\": \"-21978590\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"1969-04-21T14:50:10Z\"\n      },\n      {\n          \"iso8601\": \"1969-05-22T15:51:03.000001Z\",\n          \"canonical_seconds\": \"-19296537\",\n          \"canonical_nanos\": 1000,\n          \"error\": false,\n          \"smithy_format_value\": \"1969-05-22T15:51:03.000001Z\"\n      },\n      {\n          \"iso8601\": \"1969-06-23T16:52:56.00001Z\",\n          \"canonical_seconds\": \"-16528024\",\n          \"canonical_nanos\": 10000,\n          \"error\": false,\n          \"smithy_format_value\": \"1969-06-23T16:52:56.00001Z\"\n      },\n      {\n          \"iso8601\": \"1969-07-24T17:53:49.0001Z\",\n          \"canonical_seconds\": \"-13845971\",\n          \"canonical_nanos\": 100000,\n          \"error\": false,\n          \"smithy_format_value\": \"1969-07-24T17:53:49.0001Z\"\n      },\n      {\n          \"iso8601\": \"1969-08-25T18:54:42.000234Z\",\n          \"canonical_seconds\": \"-11077518\",\n          \"canonical_nanos\": 234000,\n          \"error\": false,\n          \"smithy_format_value\": \"1969-08-25T18:54:42.000234Z\"\n      },\n      {\n          \"iso8601\": \"1969-09-26T19:55:35Z\",\n          \"canonical_seconds\": \"-8309065\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"1969-09-26T19:55:35Z\"\n      },\n      {\n          \"iso8601\": \"1969-10-27T20:56:28.000001Z\",\n          \"canonical_seconds\": \"-5627012\",\n          \"canonical_nanos\": 1000,\n          \"error\": false,\n          \"smithy_format_value\": \"1969-10-27T20:56:28.000001Z\"\n      },\n      {\n          \"iso8601\": \"1969-11-28T21:57:21.00001Z\",\n          \"canonical_seconds\": \"-2858559\",\n          \"canonical_nanos\": 10000,\n          \"error\": false,\n          \"smithy_format_value\": \"1969-11-28T21:57:21.00001Z\"\n      },\n      {\n          \"iso8601\": \"1969-12-29T22:58:14.0001Z\",\n          \"canonical_seconds\": \"-176506\",\n          \"canonical_nanos\": 100000,\n          \"error\": false,\n          \"smithy_format_value\": \"1969-12-29T22:58:14.0001Z\"\n      },\n      {\n          \"iso8601\": \"1970-01-30T23:59:07.000234Z\",\n          \"canonical_seconds\": \"2591947\",\n          \"canonical_nanos\": 234000,\n          \"error\": false,\n          \"smithy_format_value\": \"1970-01-30T23:59:07.000234Z\"\n      },\n      {\n          \"iso8601\": \"1970-02-09T00:00:00Z\",\n          \"canonical_seconds\": \"3369600\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"1970-02-09T00:00:00Z\"\n      },\n      {\n          \"iso8601\": \"1970-03-01T01:01:53.000001Z\",\n          \"canonical_seconds\": \"5101313\",\n          \"canonical_nanos\": 1000,\n          \"error\": false,\n          \"smithy_format_value\": \"1970-03-01T01:01:53.000001Z\"\n      },\n      {\n          \"iso8601\": \"1970-04-03T02:02:46.00001Z\",\n          \"canonical_seconds\": \"7956166\",\n          \"canonical_nanos\": 10000,\n          \"error\": false,\n          \"smithy_format_value\": \"1970-04-03T02:02:46.00001Z\"\n      },\n      {\n          \"iso8601\": \"1970-05-03T03:03:39.0001Z\",\n          \"canonical_seconds\": \"10551819\",\n          \"canonical_nanos\": 100000,\n          \"error\": false,\n          \"smithy_format_value\": \"1970-05-03T03:03:39.0001Z\"\n      },\n      {\n          \"iso8601\": \"1970-06-05T04:04:32.000234Z\",\n          \"canonical_seconds\": \"13406672\",\n          \"canonical_nanos\": 234000,\n          \"error\": false,\n          \"smithy_format_value\": \"1970-06-05T04:04:32.000234Z\"\n      },\n      {\n          \"iso8601\": \"1970-07-05T05:05:25Z\",\n          \"canonical_seconds\": \"16002325\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"1970-07-05T05:05:25Z\"\n      },\n      {\n          \"iso8601\": \"1970-08-06T06:06:18.000001Z\",\n          \"canonical_seconds\": \"18770778\",\n          \"canonical_nanos\": 1000,\n          \"error\": false,\n          \"smithy_format_value\": \"1970-08-06T06:06:18.000001Z\"\n      },\n      {\n          \"iso8601\": \"1970-09-08T07:07:11.00001Z\",\n          \"canonical_seconds\": \"21625631\",\n          \"canonical_nanos\": 10000,\n          \"error\": false,\n          \"smithy_format_value\": \"1970-09-08T07:07:11.00001Z\"\n      },\n      {\n          \"iso8601\": \"1970-10-08T08:08:04.0001Z\",\n          \"canonical_seconds\": \"24221284\",\n          \"canonical_nanos\": 100000,\n          \"error\": false,\n          \"smithy_format_value\": \"1970-10-08T08:08:04.0001Z\"\n      },\n      {\n          \"iso8601\": \"1970-11-10T09:09:57.000234Z\",\n          \"canonical_seconds\": \"27076197\",\n          \"canonical_nanos\": 234000,\n          \"error\": false,\n          \"smithy_format_value\": \"1970-11-10T09:09:57.000234Z\"\n      },\n      {\n          \"iso8601\": \"1970-12-10T10:10:50Z\",\n          \"canonical_seconds\": \"29671850\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"1970-12-10T10:10:50Z\"\n      },\n      {\n          \"iso8601\": \"2004-02-29T23:59:59.999Z\",\n          \"canonical_seconds\": \"1078099199\",\n          \"canonical_nanos\": 999000000,\n          \"error\": false,\n          \"smithy_format_value\": \"2004-02-29T23:59:59.999Z\"\n      },\n      {\n          \"iso8601\": \"2037-01-11T11:11:43.000001Z\",\n          \"canonical_seconds\": \"2115285103\",\n          \"canonical_nanos\": 1000,\n          \"error\": false,\n          \"smithy_format_value\": \"2037-01-11T11:11:43.000001Z\"\n      },\n      {\n          \"iso8601\": \"2037-02-21T12:12:36.00001Z\",\n          \"canonical_seconds\": \"2118831156\",\n          \"canonical_nanos\": 10000,\n          \"error\": false,\n          \"smithy_format_value\": \"2037-02-21T12:12:36.00001Z\"\n      },\n      {\n          \"iso8601\": \"2037-03-13T13:13:29.0001Z\",\n          \"canonical_seconds\": \"2120562809\",\n          \"canonical_nanos\": 100000,\n          \"error\": false,\n          \"smithy_format_value\": \"2037-03-13T13:13:29.0001Z\"\n      },\n      {\n          \"iso8601\": \"2037-04-15T14:14:22.000234Z\",\n          \"canonical_seconds\": \"2123417662\",\n          \"canonical_nanos\": 234000,\n          \"error\": false,\n          \"smithy_format_value\": \"2037-04-15T14:14:22.000234Z\"\n      },\n      {\n          \"iso8601\": \"2037-05-15T15:15:15Z\",\n          \"canonical_seconds\": \"2126013315\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"2037-05-15T15:15:15Z\"\n      },\n      {\n          \"iso8601\": \"2037-06-17T16:16:08.000001Z\",\n          \"canonical_seconds\": \"2128868168\",\n          \"canonical_nanos\": 1000,\n          \"error\": false,\n          \"smithy_format_value\": \"2037-06-17T16:16:08.000001Z\"\n      },\n      {\n          \"iso8601\": \"2037-07-17T17:17:01.00001Z\",\n          \"canonical_seconds\": \"2131463821\",\n          \"canonical_nanos\": 10000,\n          \"error\": false,\n          \"smithy_format_value\": \"2037-07-17T17:17:01.00001Z\"\n      },\n      {\n          \"iso8601\": \"2037-08-18T18:18:54.0001Z\",\n          \"canonical_seconds\": \"2134232334\",\n          \"canonical_nanos\": 100000,\n          \"error\": false,\n          \"smithy_format_value\": \"2037-08-18T18:18:54.0001Z\"\n      },\n      {\n          \"iso8601\": \"2037-09-20T19:19:47.000234Z\",\n          \"canonical_seconds\": \"2137087187\",\n          \"canonical_nanos\": 234000,\n          \"error\": false,\n          \"smithy_format_value\": \"2037-09-20T19:19:47.000234Z\"\n      },\n      {\n          \"iso8601\": \"2037-10-20T20:20:40Z\",\n          \"canonical_seconds\": \"2139682840\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"2037-10-20T20:20:40Z\"\n      },\n      {\n          \"iso8601\": \"2037-11-22T21:21:33.000001Z\",\n          \"canonical_seconds\": \"2142537693\",\n          \"canonical_nanos\": 1000,\n          \"error\": false,\n          \"smithy_format_value\": \"2037-11-22T21:21:33.000001Z\"\n      },\n      {\n          \"iso8601\": \"2037-12-22T22:22:26.00001Z\",\n          \"canonical_seconds\": \"2145133346\",\n          \"canonical_nanos\": 10000,\n          \"error\": false,\n          \"smithy_format_value\": \"2037-12-22T22:22:26.00001Z\"\n      },\n      {\n          \"iso8601\": \"2038-01-23T23:23:19.0001Z\",\n          \"canonical_seconds\": \"2147901799\",\n          \"canonical_nanos\": 100000,\n          \"error\": false,\n          \"smithy_format_value\": \"2038-01-23T23:23:19.0001Z\"\n      },\n      {\n          \"iso8601\": \"2038-02-05T00:24:12.000234Z\",\n          \"canonical_seconds\": \"2148942252\",\n          \"canonical_nanos\": 234000,\n          \"error\": false,\n          \"smithy_format_value\": \"2038-02-05T00:24:12.000234Z\"\n      },\n      {\n          \"iso8601\": \"2038-03-25T01:25:05Z\",\n          \"canonical_seconds\": \"2153093105\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"2038-03-25T01:25:05Z\"\n      },\n      {\n          \"iso8601\": \"2038-04-27T02:26:58.000001Z\",\n          \"canonical_seconds\": \"2155948018\",\n          \"canonical_nanos\": 1000,\n          \"error\": false,\n          \"smithy_format_value\": \"2038-04-27T02:26:58.000001Z\"\n      },\n      {\n          \"iso8601\": \"2038-05-27T03:27:51.00001Z\",\n          \"canonical_seconds\": \"2158543671\",\n          \"canonical_nanos\": 10000,\n          \"error\": false,\n          \"smithy_format_value\": \"2038-05-27T03:27:51.00001Z\"\n      },\n      {\n          \"iso8601\": \"2038-06-29T04:28:44.0001Z\",\n          \"canonical_seconds\": \"2161398524\",\n          \"canonical_nanos\": 100000,\n          \"error\": false,\n          \"smithy_format_value\": \"2038-06-29T04:28:44.0001Z\"\n      },\n      {\n          \"iso8601\": \"2038-07-29T05:29:37.000234Z\",\n          \"canonical_seconds\": \"2163994177\",\n          \"canonical_nanos\": 234000,\n          \"error\": false,\n          \"smithy_format_value\": \"2038-07-29T05:29:37.000234Z\"\n      },\n      {\n          \"iso8601\": \"2038-08-30T06:30:30Z\",\n          \"canonical_seconds\": \"2166762630\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"2038-08-30T06:30:30Z\"\n      },\n      {\n          \"iso8601\": \"2038-09-02T07:31:23.000001Z\",\n          \"canonical_seconds\": \"2167025483\",\n          \"canonical_nanos\": 1000,\n          \"error\": false,\n          \"smithy_format_value\": \"2038-09-02T07:31:23.000001Z\"\n      },\n      {\n          \"iso8601\": \"2038-10-01T08:32:16.00001Z\",\n          \"canonical_seconds\": \"2169534736\",\n          \"canonical_nanos\": 10000,\n          \"error\": false,\n          \"smithy_format_value\": \"2038-10-01T08:32:16.00001Z\"\n      },\n      {\n          \"iso8601\": \"2038-11-04T09:33:09.0001Z\",\n          \"canonical_seconds\": \"2172475989\",\n          \"canonical_nanos\": 100000,\n          \"error\": false,\n          \"smithy_format_value\": \"2038-11-04T09:33:09.0001Z\"\n      },\n      {\n          \"iso8601\": \"2038-12-03T10:34:02.000234Z\",\n          \"canonical_seconds\": \"2174985242\",\n          \"canonical_nanos\": 234000,\n          \"error\": false,\n          \"smithy_format_value\": \"2038-12-03T10:34:02.000234Z\"\n      },\n      {\n          \"iso8601\": \"9999-01-04T11:35:55Z\",\n          \"canonical_seconds\": \"253371065755\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"9999-01-04T11:35:55Z\"\n      },\n      {\n          \"iso8601\": \"9999-02-17T12:36:48.000001Z\",\n          \"canonical_seconds\": \"253374871008\",\n          \"canonical_nanos\": 1000,\n          \"error\": false,\n          \"smithy_format_value\": \"9999-02-17T12:36:48.000001Z\"\n      },\n      {\n          \"iso8601\": \"9999-03-06T13:37:41.00001Z\",\n          \"canonical_seconds\": \"253376343461\",\n          \"canonical_nanos\": 10000,\n          \"error\": false,\n          \"smithy_format_value\": \"9999-03-06T13:37:41.00001Z\"\n      },\n      {\n          \"iso8601\": \"9999-04-09T14:38:34.0001Z\",\n          \"canonical_seconds\": \"253379284714\",\n          \"canonical_nanos\": 100000,\n          \"error\": false,\n          \"smithy_format_value\": \"9999-04-09T14:38:34.0001Z\"\n      },\n      {\n          \"iso8601\": \"9999-05-08T15:39:27.000234Z\",\n          \"canonical_seconds\": \"253381793967\",\n          \"canonical_nanos\": 234000,\n          \"error\": false,\n          \"smithy_format_value\": \"9999-05-08T15:39:27.000234Z\"\n      },\n      {\n          \"iso8601\": \"9999-06-11T16:40:20Z\",\n          \"canonical_seconds\": \"253384735220\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"9999-06-11T16:40:20Z\"\n      },\n      {\n          \"iso8601\": \"9999-07-10T17:41:13.000001Z\",\n          \"canonical_seconds\": \"253387244473\",\n          \"canonical_nanos\": 1000,\n          \"error\": false,\n          \"smithy_format_value\": \"9999-07-10T17:41:13.000001Z\"\n      },\n      {\n          \"iso8601\": \"9999-08-11T18:42:06.00001Z\",\n          \"canonical_seconds\": \"253390012926\",\n          \"canonical_nanos\": 10000,\n          \"error\": false,\n          \"smithy_format_value\": \"9999-08-11T18:42:06.00001Z\"\n      },\n      {\n          \"iso8601\": \"9999-09-14T19:43:59.0001Z\",\n          \"canonical_seconds\": \"253392954239\",\n          \"canonical_nanos\": 100000,\n          \"error\": false,\n          \"smithy_format_value\": \"9999-09-14T19:43:59.0001Z\"\n      },\n      {\n          \"iso8601\": \"9999-10-13T20:44:52.000234Z\",\n          \"canonical_seconds\": \"253395463492\",\n          \"canonical_nanos\": 234000,\n          \"error\": false,\n          \"smithy_format_value\": \"9999-10-13T20:44:52.000234Z\"\n      },\n      {\n          \"iso8601\": \"9999-11-16T21:45:45Z\",\n          \"canonical_seconds\": \"253398404745\",\n          \"canonical_nanos\": 0,\n          \"error\": false,\n          \"smithy_format_value\": \"9999-11-16T21:45:45Z\"\n      },\n      {\n          \"iso8601\": \"9999-12-15T22:46:38.000001Z\",\n          \"canonical_seconds\": \"253400913998\",\n          \"canonical_nanos\": 1000,\n          \"error\": false,\n          \"smithy_format_value\": \"9999-12-15T22:46:38.000001Z\"\n      }\n  ]\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-types/test_data/serialize_document.json",
    "content": "{\n    \"null\": null,\n    \"true\": true,\n    \"pos_int\": 1,\n    \"false\": false,\n    \"map\": {\n        \"array\": [\n            {\n                \"pos_int\": 1,\n                \"float\": 0.30000000000000004,\n                \"neg_int\": -1,\n                \"hello\": \"world\",\n                \"false\": false,\n                \"true\": true\n            },\n            \"hello-world\",\n            true,\n            false\n        ],\n        \"pos_int\": 1,\n        \"float\": 0.30000000000000004,\n        \"neg_int\": -1,\n        \"hello\": \"world\",\n        \"false\": false,\n        \"true\": true\n    },\n    \"float\": 0.30000000000000004,\n    \"neg_int\": -1,\n    \"hello\": \"world\",\n    \"array\": [\n        {\n            \"pos_int\": 1,\n            \"float\": 0.30000000000000004,\n            \"neg_int\": -1,\n            \"hello\": \"world\",\n            \"false\": false,\n            \"true\": true\n        },\n        \"hello-world\",\n        true,\n        false\n    ]\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-types-convert/Cargo.toml",
    "content": "[package]\nname = \"aws-smithy-types-convert\"\nversion = \"0.60.14\"\nauthors = [\"AWS Rust SDK Team <aws-sdk-rust@amazon.com>\"]\ndescription = \"Conversion of types from aws-smithy-types to other libraries.\"\nedition = \"2021\"\nlicense = \"Apache-2.0\"\nrepository = \"https://github.com/smithy-lang/smithy-rs\"\nrust-version = \"1.91.1\"\n\n[features]\nconvert-chrono = [\"aws-smithy-types\", \"chrono\"]\nconvert-time = [\"aws-smithy-types\", \"time\"]\nconvert-streams = [\"aws-smithy-async\", \"futures-core\"]\n\n[dependencies]\naws-smithy-types = { path = \"../aws-smithy-types\", features = [\"http-body-1-x\"], optional = true }\naws-smithy-async = { path = \"../aws-smithy-async\", optional = true }\nchrono = { version = \"0.4.35\", optional = true, default-features = false, features = [\"std\"] }\ntime = { version = \"0.3.4\", optional = true }\nfutures-core = { version = \"0.3.31\", optional = true }\n\n[package.metadata.docs.rs]\nall-features = true\ntargets = [\"x86_64-unknown-linux-gnu\"]\ncargo-args = [\"-Zunstable-options\", \"-Zrustdoc-scrape-examples\"]\nrustdoc-args = [\"--cfg\", \"docsrs\"]\n# End of docs.rs metadata\n"
  },
  {
    "path": "rust-runtime/aws-smithy-types-convert/LICENSE",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n"
  },
  {
    "path": "rust-runtime/aws-smithy-types-convert/README.md",
    "content": "# aws-smithy-types-convert\n\nThis crate provides utilities for converting between the types defined\nin [aws-smithy-types](https://docs.rs/aws-smithy-types) and types commonly used in other libraries.\n\n## Crate Features\n\nBy default, no features are enabled. Using the conversions requires enabling one or more features:\n\n```toml\n[dependencies]\naws-smithy-types-convert = { version = \"VERSION\", features = [\"convert-chrono\"] }\n```\n\nCurrently, the following conversions are supported:\n\n* `convert-chrono`: Conversions between `DateTime` and [chrono](https://docs.rs/chrono/latest/chrono/).\n* `convert-time`: Conversions between `DateTime` and [time](https://docs.rs/time/latest/time/).\n\n_Note:_ Conversions to and from [`SystemTime`](https://doc.rust-lang.org/std/time/struct.SystemTime.html) are built\ninto [`aws-smithy-types`](https://docs.rs/aws-smithy-types/0.30.0-alpha/aws_smithy_types/date_time/struct.DateTime.html#impl-From%3CSystemTime%3E).\n\n<!-- anchor_start:footer -->\nThis crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator.\n<!-- anchor_end:footer -->\n"
  },
  {
    "path": "rust-runtime/aws-smithy-types-convert/external-types.toml",
    "content": "allowed_external_types = [\n    \"aws_smithy_types::*\",\n    \"chrono::datetime::DateTime\",\n    \"chrono::offset::fixed::FixedOffset\",\n    \"chrono::offset::utc::Utc\",\n    \"time::offset_date_time::OffsetDateTime\",\n    \"aws_smithy_async::future::pagination_stream::PaginationStream\",\n    \"futures_core::stream::Stream\",\n]\n"
  },
  {
    "path": "rust-runtime/aws-smithy-types-convert/src/date_time.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Conversions from [`DateTime`] to the types in the\n//! [`time`](https://crates.io/crates/time) or\n//! [`chrono`](https://crates.io/crates/chrono)\n//! crates.\n\nuse aws_smithy_types::DateTime;\nuse std::error::Error as StdError;\nuse std::fmt;\n\n#[derive(Debug)]\nenum ErrorKind {\n    /// Conversion failed because the value being converted is out of range for its destination\n    OutOfRange(Box<dyn StdError + Send + Sync + 'static>),\n}\n\n/// Conversion error\n#[derive(Debug)]\npub struct Error {\n    kind: ErrorKind,\n}\n\nimpl Error {\n    fn out_of_range(source: impl Into<Box<dyn StdError + Send + Sync + 'static>>) -> Self {\n        Self {\n            kind: ErrorKind::OutOfRange(source.into()),\n        }\n    }\n}\n\nimpl StdError for Error {\n    fn source(&self) -> Option<&(dyn StdError + 'static)> {\n        match &self.kind {\n            ErrorKind::OutOfRange(source) => Some(source.as_ref() as _),\n        }\n    }\n}\n\nimpl fmt::Display for Error {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        match self.kind {\n            ErrorKind::OutOfRange(_) => {\n                write!(\n                    f,\n                    \"conversion failed because the value is out of range for its destination\",\n                )\n            }\n        }\n    }\n}\n\n/// Adds functions to [`DateTime`] to convert it to `time` or `chrono` types.\n///\n#[cfg_attr(\n    feature = \"convert-time\",\n    doc = r##\"\n# Example with `time`\n\nMake sure your **Cargo.toml** enables the `convert-time` feature:\n```toml\n[dependencies]\naws-smithy-types-convert = { version = \"VERSION\", features = [\"convert-time\"] }\n```\n\nThen import [`DateTimeExt`] to use the conversions:\n```rust\n# fn test_fn() -> Result<(), aws_smithy_types_convert::date_time::Error> {\n# use aws_smithy_types::DateTime;\nuse aws_smithy_types_convert::date_time::DateTimeExt;\nuse time::OffsetDateTime;\n\nlet offset_date_time: OffsetDateTime = DateTime::from_secs(5).to_time()?;\nlet date_time: DateTime  = DateTime::from_time(offset_date_time);\n# Ok(())\n# }\n```\n\"##\n)]\n#[cfg_attr(\n    feature = \"convert-chrono\",\n    doc = r##\"\n# Example with `chrono`\n\nMake sure your **Cargo.toml** enables the `convert-chrono` feature:\n```toml\n[dependencies]\naws-smithy-types-convert = { version = \"VERSION\", features = [\"convert-chrono\"] }\n```\n\nThen import [`DateTimeExt`] to use the conversions:\n```rust\n# use aws_smithy_types::DateTime;\nuse aws_smithy_types_convert::date_time::DateTimeExt;\nuse chrono::{Utc};\n\nlet chrono_date_time: chrono::DateTime<Utc> = DateTime::from_secs(5).to_chrono_utc().unwrap();\nlet date_time: DateTime = DateTime::from_chrono_utc(chrono_date_time);\n```\n\"##\n)]\npub trait DateTimeExt {\n    /// Converts a [`DateTime`] to a [`chrono::DateTime`] with timezone UTC.\n    #[cfg(feature = \"convert-chrono\")]\n    fn to_chrono_utc(&self) -> Result<chrono::DateTime<chrono::Utc>, Error>;\n\n    /// Converts a [`chrono::DateTime`] with timezone UTC to a [`DateTime`].\n    #[cfg(feature = \"convert-chrono\")]\n    fn from_chrono_utc(time: chrono::DateTime<chrono::Utc>) -> DateTime;\n\n    /// Converts a [`chrono::DateTime`] with an offset timezone to a [`DateTime`].\n    #[cfg(feature = \"convert-chrono\")]\n    fn from_chrono_fixed(time: chrono::DateTime<chrono::FixedOffset>) -> DateTime;\n\n    /// Converts a [`DateTime`] to a [`time::OffsetDateTime`].\n    ///\n    /// Returns an [`Error`] if the time is after\n    /// `9999-12-31T23:59:59.999Z` or before `-9999-01-01T00:00:00.000Z`.\n    #[cfg(feature = \"convert-time\")]\n    fn to_time(&self) -> Result<time::OffsetDateTime, Error>;\n\n    /// Converts a [`time::OffsetDateTime`] to a [`DateTime`].\n    #[cfg(feature = \"convert-time\")]\n    fn from_time(time: time::OffsetDateTime) -> DateTime;\n}\n\nimpl DateTimeExt for DateTime {\n    #[cfg(feature = \"convert-chrono\")]\n    fn to_chrono_utc(&self) -> Result<chrono::DateTime<chrono::Utc>, Error> {\n        match chrono::DateTime::from_timestamp(self.secs(), self.subsec_nanos()) {\n            None => Err(Error::out_of_range(format!(\n                \"out-of-range seconds {} or invalid nanoseconds {}\",\n                self.secs(),\n                self.subsec_nanos()\n            ))),\n            Some(dt) => Ok(dt),\n        }\n    }\n\n    #[cfg(feature = \"convert-chrono\")]\n    fn from_chrono_utc(value: chrono::DateTime<chrono::Utc>) -> DateTime {\n        DateTime::from_secs_and_nanos(value.timestamp(), value.timestamp_subsec_nanos())\n    }\n\n    #[cfg(feature = \"convert-chrono\")]\n    fn from_chrono_fixed(value: chrono::DateTime<chrono::FixedOffset>) -> DateTime {\n        Self::from_chrono_utc(value.with_timezone(&chrono::Utc))\n    }\n\n    #[cfg(feature = \"convert-time\")]\n    fn to_time(&self) -> Result<time::OffsetDateTime, Error> {\n        time::OffsetDateTime::from_unix_timestamp_nanos(self.as_nanos()).map_err(|err| Error {\n            kind: ErrorKind::OutOfRange(err.into()),\n        })\n    }\n\n    #[cfg(feature = \"convert-time\")]\n    fn from_time(time: time::OffsetDateTime) -> DateTime {\n        DateTime::from_nanos(time.unix_timestamp_nanos())\n            .expect(\"DateTime supports a greater range than OffsetDateTime\")\n    }\n}\n\n#[cfg(all(test, any(feature = \"convert-chrono\", feature = \"convert-time\")))]\nmod test {\n    use super::DateTimeExt;\n    use aws_smithy_types::date_time::{DateTime, Format};\n    use chrono::Timelike;\n\n    #[cfg(feature = \"convert-time\")]\n    use super::{Error, ErrorKind};\n\n    #[test]\n    #[cfg(feature = \"convert-chrono\")]\n    fn from_chrono() {\n        use chrono::{FixedOffset, TimeZone, Utc};\n\n        let chrono = Utc\n            .with_ymd_and_hms(2039, 7, 8, 9, 3, 11)\n            .unwrap()\n            .with_nanosecond(123_000_000)\n            .unwrap();\n        let expected = DateTime::from_str(\"2039-07-08T09:03:11.123Z\", Format::DateTime).unwrap();\n        assert_eq!(expected, DateTime::from_chrono_utc(chrono));\n\n        let chrono = Utc\n            .with_ymd_and_hms(1000, 7, 8, 9, 3, 11)\n            .unwrap()\n            .with_nanosecond(456_000_000)\n            .unwrap();\n        let expected = DateTime::from_str(\"1000-07-08T09:03:11.456Z\", Format::DateTime).unwrap();\n        assert_eq!(expected, DateTime::from_chrono_utc(chrono));\n\n        let chrono = FixedOffset::west_opt(2 * 3600)\n            .unwrap()\n            .with_ymd_and_hms(2039, 7, 8, 9, 3, 11)\n            .unwrap()\n            .with_nanosecond(123_000_000)\n            .unwrap();\n        let expected = DateTime::from_str(\"2039-07-08T11:03:11.123Z\", Format::DateTime).unwrap();\n        assert_eq!(expected, DateTime::from_chrono_fixed(chrono));\n    }\n\n    #[test]\n    #[cfg(feature = \"convert-chrono\")]\n    fn to_chrono() {\n        use chrono::{TimeZone, Utc};\n\n        let date_time = DateTime::from_str(\"2039-07-08T09:03:11.123Z\", Format::DateTime).unwrap();\n        let expected = Utc\n            .with_ymd_and_hms(2039, 7, 8, 9, 3, 11)\n            .unwrap()\n            .with_nanosecond(123_000_000)\n            .unwrap();\n        assert_eq!(expected, date_time.to_chrono_utc().unwrap());\n\n        let date_time = DateTime::from_str(\"1000-07-08T09:03:11.456Z\", Format::DateTime).unwrap();\n        let expected = Utc\n            .with_ymd_and_hms(1000, 7, 8, 9, 3, 11)\n            .unwrap()\n            .with_nanosecond(456_000_000)\n            .unwrap();\n        assert_eq!(expected, date_time.to_chrono_utc().unwrap());\n    }\n\n    #[test]\n    #[cfg(feature = \"convert-time\")]\n    fn from_time() {\n        use time::{Date, Month, PrimitiveDateTime, Time};\n\n        let time = PrimitiveDateTime::new(\n            Date::from_calendar_date(2039, Month::July, 8).unwrap(),\n            Time::from_hms_milli(9, 3, 11, 123).unwrap(),\n        )\n        .assume_utc();\n        let expected = DateTime::from_str(\"2039-07-08T09:03:11.123Z\", Format::DateTime).unwrap();\n        assert_eq!(expected, DateTime::from_time(time));\n\n        let time = PrimitiveDateTime::new(\n            Date::from_calendar_date(1000, Month::July, 8).unwrap(),\n            Time::from_hms_milli(9, 3, 11, 456).unwrap(),\n        )\n        .assume_utc();\n        let expected = DateTime::from_str(\"1000-07-08T09:03:11.456Z\", Format::DateTime).unwrap();\n        assert_eq!(expected, DateTime::from_time(time));\n    }\n\n    #[test]\n    #[cfg(feature = \"convert-time\")]\n    fn to_time() {\n        use time::{Date, Month, PrimitiveDateTime, Time};\n\n        let date_time = DateTime::from_str(\"2039-07-08T09:03:11.123Z\", Format::DateTime).unwrap();\n        let expected = PrimitiveDateTime::new(\n            Date::from_calendar_date(2039, Month::July, 8).unwrap(),\n            Time::from_hms_milli(9, 3, 11, 123).unwrap(),\n        )\n        .assume_utc();\n        assert_eq!(expected, date_time.to_time().unwrap());\n\n        let date_time = DateTime::from_str(\"1000-07-08T09:03:11.456Z\", Format::DateTime).unwrap();\n        let expected = PrimitiveDateTime::new(\n            Date::from_calendar_date(1000, Month::July, 8).unwrap(),\n            Time::from_hms_milli(9, 3, 11, 456).unwrap(),\n        )\n        .assume_utc();\n        assert_eq!(expected, date_time.to_time().unwrap());\n\n        let date_time = DateTime::from_secs_and_nanos(i64::MAX, 0);\n        assert!(matches!(\n            date_time.to_time(),\n            Err(Error {\n                kind: ErrorKind::OutOfRange(_)\n            })\n        ));\n        let date_time = DateTime::from_secs_and_nanos(i64::MIN, 0);\n        assert!(matches!(\n            date_time.to_time(),\n            Err(Error {\n                kind: ErrorKind::OutOfRange(_)\n            })\n        ));\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-types-convert/src/lib.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/* Automatically managed default lints */\n#![cfg_attr(docsrs, feature(doc_cfg))]\n/* End of automatically managed default lints */\n//! Conversions between `aws-smithy-types` and the types of frequently used Rust libraries.\n\n#![allow(clippy::derive_partial_eq_without_eq)]\n#![warn(\n    missing_docs,\n    rustdoc::missing_crate_level_docs,\n    unreachable_pub,\n    rust_2018_idioms\n)]\n\n#[cfg(any(feature = \"convert-time\", feature = \"convert-chrono\"))]\npub mod date_time;\n\n#[cfg(feature = \"convert-streams\")]\npub mod stream;\n"
  },
  {
    "path": "rust-runtime/aws-smithy-types-convert/src/stream.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Conversions from Stream-like structs to implementors of `futures::Stream`\n\nuse futures_core::Stream;\nuse std::pin::Pin;\nuse std::task::{Context, Poll};\n\nuse aws_smithy_async::future::pagination_stream::PaginationStream;\n\n/// Stream implementor wrapping `PaginationStream`\npub struct PaginationStreamImplStream<Item> {\n    pagination_stream: PaginationStream<Item>,\n}\n\nimpl<Item> PaginationStreamImplStream<Item> {\n    /// Create a new Stream object wrapping a `PaginationStream`\n    pub fn new(pagination_stream: PaginationStream<Item>) -> Self {\n        PaginationStreamImplStream { pagination_stream }\n    }\n}\n\nimpl<Item> Stream for PaginationStreamImplStream<Item> {\n    type Item = Item;\n\n    fn poll_next(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Option<Self::Item>> {\n        self.pagination_stream.poll_next(cx)\n    }\n}\n\n/// Trait to convert PaginationStream into implementor of `Stream`\npub trait PaginationStreamExt<Item> {\n    /// Convert PaginationStream into implementor of `Stream`\n    ///\n    /// # Example\n    /// ```no_run\n    /// # use aws_smithy_async::future::pagination_stream::PaginationStream;\n    /// use aws_smithy_types_convert::stream::PaginationStreamExt;\n    /// // Assuming you have obtained a pagination stream, by something like:\n    /// // ```\n    /// // let pagination_stream = s3_client\n    /// //     .list_objects_v2()\n    /// //     .bucket(bucket)\n    /// //     .into_paginator()\n    /// //     .send();\n    /// // ```\n    /// # let pagination_stream: PaginationStream<i32> = unimplemented!();\n    /// let futures_stream = pagination_stream.into_stream_03x();\n    /// ```\n    fn into_stream_03x(self) -> PaginationStreamImplStream<Item>;\n}\n\nimpl<Item> PaginationStreamExt<Item> for PaginationStream<Item> {\n    fn into_stream_03x(self) -> PaginationStreamImplStream<Item> {\n        PaginationStreamImplStream {\n            pagination_stream: self,\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-wasm/Cargo.toml",
    "content": "[package]\nname = \"aws-smithy-wasm\"\nversion = \"0.1.11\"\nauthors = [\n  \"AWS Rust SDK Team <aws-sdk-rust@amazon.com>\",\n  \"Eduardo Rodrigues <16357187+eduardomourar@users.noreply.github.com>\",\n  \"Pat Hickey <pat@moreproductive.org>\"\n]\ndescription = \"Smithy WebAssembly wasip2 configuration for smithy-rs.\"\nedition = \"2021\"\nlicense = \"Apache-2.0\"\nrepository = \"https://github.com/awslabs/smithy-rs\"\nrust-version = \"1.91.1\"\n\n[dependencies]\naws-smithy-async = { path = \"../aws-smithy-async\" }\naws-smithy-runtime-api = { path = \"../aws-smithy-runtime-api\", features = [\"http-1x\", \"client\"]}\naws-smithy-types = { path = \"../aws-smithy-types\", features = [\"http-body-1-x\"] }\nhttp-body-util = \"0.1.3\"\nsync_wrapper = { version = \"1\", features = [\"futures\"] }\n# Note the wstd crate will only build for target wasm32-wasip2, but having a target\n# statement here breaks some of the CI tests, so we leave it with the rest of the deps\nwstd = \"0.6.5\"\n\n[package.metadata.docs.rs]\nall-features = true\ntargets = [\"x86_64-unknown-linux-gnu\"]\ncargo-args = [\"-Zunstable-options\", \"-Zrustdoc-scrape-examples\"]\nrustdoc-args = [\"--cfg\", \"docsrs\"]\n# End of docs.rs metadata\n"
  },
  {
    "path": "rust-runtime/aws-smithy-wasm/LICENSE",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n"
  },
  {
    "path": "rust-runtime/aws-smithy-wasm/README.md",
    "content": "# aws-smithy-wasm\n\nWebAssembly and WASI related configuration for service clients generated by [smithy-rs](https://github.com/awslabs/smithy-rs).\n\n<!-- anchor_start:footer -->\nThis crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly.\n<!-- anchor_end:footer -->\n"
  },
  {
    "path": "rust-runtime/aws-smithy-wasm/external-types.toml",
    "content": "allowed_external_types = [\n    \"aws_smithy_async::rt::sleep::AsyncSleep\",\n    \"aws_smithy_runtime_api::client::http::HttpClient\",\n    \"aws_smithy_runtime_api::client::http::SharedHttpClient\",\n    \"aws_smithy_runtime_api::client::http::HttpConnector\",\n    \"aws_smithy_runtime_api::client::http::AsyncSleep\",\n    \"aws_smithy_runtime_api::client::http::Sleep\",\n]\n"
  },
  {
    "path": "rust-runtime/aws-smithy-wasm/src/lib.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/* Automatically managed default lints */\n#![cfg_attr(docsrs, feature(doc_cfg))]\n/* End of automatically managed default lints */\n#![allow(clippy::derive_partial_eq_without_eq)]\n#![warn(\n    missing_docs,\n    rustdoc::missing_crate_level_docs,\n    unreachable_pub,\n    rust_2018_idioms\n)]\n\n//! Smithy WebAssembly\n\n/// Tools for using Smithy SDKs in WASI environments\npub mod wasi;\n"
  },
  {
    "path": "rust-runtime/aws-smithy-wasm/src/wasi.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! WASI HTTP Adapter\nuse aws_smithy_async::rt::sleep::{AsyncSleep, Sleep};\nuse aws_smithy_runtime_api::client::connector_metadata::ConnectorMetadata;\nuse aws_smithy_runtime_api::{\n    client::{\n        http::{\n            HttpClient, HttpConnector, HttpConnectorFuture, HttpConnectorSettings,\n            SharedHttpClient, SharedHttpConnector,\n        },\n        orchestrator::HttpRequest,\n        result::ConnectorError,\n        runtime_components::RuntimeComponents,\n    },\n    http::Response,\n    shared::IntoShared,\n};\nuse aws_smithy_types::{body::SdkBody, retry::ErrorKind};\nuse http_body_util::{BodyStream, StreamBody};\nuse std::time::Duration;\nuse wstd::http::{Body as WstdBody, BodyExt as _, Client, Error as WstdError};\n\n/// An sleep implementation for wasip2, using the wstd async executor.\n#[derive(Debug, Clone)]\npub struct WasiSleep;\nimpl AsyncSleep for WasiSleep {\n    fn sleep(&self, duration: Duration) -> Sleep {\n        Sleep::new(async move {\n            wstd::task::sleep(wstd::time::Duration::from(duration)).await;\n        })\n    }\n}\n\n/// Builder for [`WasiHttpClient`]. Currently empty, but allows for future\n/// config options to be added in a backwards compatible manner.\n#[derive(Default, Debug)]\n#[non_exhaustive]\npub struct WasiHttpClientBuilder {}\n\nimpl WasiHttpClientBuilder {\n    /// Creates a new builder.\n    pub fn new() -> Self {\n        Default::default()\n    }\n\n    /// Builds the [`WasiHttpClient`].\n    pub fn build(self) -> SharedHttpClient {\n        let client = WasiHttpClient {};\n        client.into_shared()\n    }\n}\n\n/// An HTTP client that can be used during instantiation of the client SDK in\n/// order to route the HTTP requests through the WebAssembly host. The host must\n/// support the wasi-http interface as defined in the WASIp2 specification.\n#[derive(Debug, Default, Clone)]\n#[non_exhaustive]\npub struct WasiHttpClient {}\n\nimpl HttpClient for WasiHttpClient {\n    fn http_connector(\n        &self,\n        settings: &HttpConnectorSettings,\n        _components: &RuntimeComponents,\n    ) -> SharedHttpConnector {\n        let mut client = Client::new();\n        if let Some(timeout) = settings.connect_timeout() {\n            client.set_connect_timeout(timeout);\n        }\n        if let Some(timeout) = settings.read_timeout() {\n            client.set_first_byte_timeout(timeout);\n        }\n        SharedHttpConnector::new(WasiHttpConnector(client))\n    }\n\n    fn connector_metadata(&self) -> Option<ConnectorMetadata> {\n        Some(ConnectorMetadata::new(\"wasi-http-client\", None))\n    }\n}\n\n/// HTTP connector used in WASI environment\n#[derive(Debug, Clone)]\nstruct WasiHttpConnector(Client);\n\nimpl HttpConnector for WasiHttpConnector {\n    fn call(&self, request: HttpRequest) -> HttpConnectorFuture {\n        let client = self.0.clone();\n        HttpConnectorFuture::new(async move {\n            let request = request\n                .try_into_http1x()\n                // This can only fail if the Extensions fail to convert\n                .map_err(|e| ConnectorError::other(Box::new(e), None))?;\n            // smithy's SdkBody Error is a non-'static boxed dyn stderror.\n            // Anyhow can't represent that, so convert it to the debug impl.\n            let request = request.map(|body| {\n                WstdBody::from_http_body(body.map_err(|e| WstdError::msg(format!(\"{e:?}\"))))\n            });\n            // Any error given by send is considered a \"ClientError\" kind\n            // which should prevent smithy from retrying like it would for a\n            // throttling error\n            let response = client\n                .send(request)\n                .await\n                .map_err(|e| ConnectorError::other(e.into(), Some(ErrorKind::ClientError)))?;\n\n            Response::try_from(response.map(|wstd_body| {\n                // You'd think that an SdkBody would just be an impl Body with\n                // the usual error type dance.\n                let nonsync_body = wstd_body\n                    .into_boxed_body()\n                    .map_err(|e| e.into_boxed_dyn_error());\n                // But we have to do this weird dance: because Axum insists\n                // bodies are not Sync, wstd settled on non-Sync bodies.\n                // Smithy insists on Sync bodies. The SyncStream type exists\n                // to assert, because all Stream operations are on &mut self,\n                // all Streams are Sync. So, turn the Body into a Stream, make\n                // it sync, then back to a Body.\n                let nonsync_stream = BodyStream::new(nonsync_body);\n                let sync_stream = sync_wrapper::SyncStream::new(nonsync_stream);\n                let sync_body = StreamBody::new(sync_stream);\n                SdkBody::from_body_1_x(sync_body)\n            }))\n            // This can only fail if the Extensions fail to convert\n            .map_err(|e| ConnectorError::other(Box::new(e), None))\n        })\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-xml/Cargo.toml",
    "content": "[package]\nname = \"aws-smithy-xml\"\nversion = \"0.60.15\"\nauthors = [\"AWS Rust SDK Team <aws-sdk-rust@amazon.com>\", \"Russell Cohen <rcoh@amazon.com>\"]\ndescription = \"XML parsing logic for Smithy protocols.\"\nedition = \"2021\"\nlicense = \"Apache-2.0\"\nrepository = \"https://github.com/smithy-lang/smithy-rs\"\nrust-version = \"1.91.1\"\n\n[dependencies]\nxmlparser = \"0.13.5\"\n\n[dev-dependencies]\naws-smithy-protocol-test = { path = \"../aws-smithy-protocol-test\" }\nbase64 = \"0.13.0\"\nproptest = \"1\"\n\n[package.metadata.docs.rs]\nall-features = true\ntargets = [\"x86_64-unknown-linux-gnu\"]\ncargo-args = [\"-Zunstable-options\", \"-Zrustdoc-scrape-examples\"]\nrustdoc-args = [\"--cfg\", \"docsrs\"]\n# End of docs.rs metadata\n"
  },
  {
    "path": "rust-runtime/aws-smithy-xml/LICENSE",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n"
  },
  {
    "path": "rust-runtime/aws-smithy-xml/README.md",
    "content": "# aws-smithy-xml\n\nXML serialization and deserialization primitives for services generated by [smithy-rs](https://github.com/smithy-lang/smithy-rs).\n\n<!-- anchor_start:footer -->\nThis crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly.\n<!-- anchor_end:footer -->\n"
  },
  {
    "path": "rust-runtime/aws-smithy-xml/external-types.toml",
    "content": "allowed_external_types = [\n]\n"
  },
  {
    "path": "rust-runtime/aws-smithy-xml/src/decode.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::unescape::unescape;\nuse std::borrow::Cow;\nuse std::error::Error;\nuse std::fmt::{Display, Formatter};\nuse xmlparser::{ElementEnd, Token, Tokenizer};\n\npub type Depth = usize;\n\n// in general, these errors are just for reporting what happened, there isn't\n// much value in lots of different match variants\n\n#[derive(Debug)]\nenum XmlDecodeErrorKind {\n    InvalidXml(xmlparser::Error),\n    InvalidEscape { esc: String },\n    Custom(Cow<'static, str>),\n    Unhandled(Box<dyn std::error::Error + Send + Sync + 'static>),\n}\n\n#[derive(Debug)]\npub struct XmlDecodeError {\n    kind: XmlDecodeErrorKind,\n}\n\nimpl Display for XmlDecodeError {\n    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {\n        match &self.kind {\n            XmlDecodeErrorKind::InvalidXml(_) => write!(f, \"XML parse error\"),\n            XmlDecodeErrorKind::InvalidEscape { esc } => write!(f, \"invalid XML escape: {esc}\"),\n            XmlDecodeErrorKind::Custom(msg) => write!(f, \"error parsing XML: {msg}\"),\n            XmlDecodeErrorKind::Unhandled(_) => write!(f, \"error parsing XML\"),\n        }\n    }\n}\n\nimpl Error for XmlDecodeError {\n    fn source(&self) -> Option<&(dyn Error + 'static)> {\n        match &self.kind {\n            XmlDecodeErrorKind::InvalidXml(source) => Some(source as _),\n            XmlDecodeErrorKind::Unhandled(source) => Some(source.as_ref() as _),\n            XmlDecodeErrorKind::InvalidEscape { .. } | XmlDecodeErrorKind::Custom(..) => None,\n        }\n    }\n}\n\nimpl XmlDecodeError {\n    pub(crate) fn invalid_xml(error: xmlparser::Error) -> Self {\n        Self {\n            kind: XmlDecodeErrorKind::InvalidXml(error),\n        }\n    }\n\n    pub(crate) fn invalid_escape(esc: impl Into<String>) -> Self {\n        Self {\n            kind: XmlDecodeErrorKind::InvalidEscape { esc: esc.into() },\n        }\n    }\n\n    pub fn custom(msg: impl Into<Cow<'static, str>>) -> Self {\n        Self {\n            kind: XmlDecodeErrorKind::Custom(msg.into()),\n        }\n    }\n\n    pub fn unhandled(error: impl Into<Box<dyn Error + Send + Sync + 'static>>) -> Self {\n        Self {\n            kind: XmlDecodeErrorKind::Unhandled(error.into()),\n        }\n    }\n}\n\n#[derive(PartialEq, Debug)]\npub struct Name<'a> {\n    pub prefix: &'a str,\n    pub local: &'a str,\n}\n\nimpl Name<'_> {\n    /// Check if a given name matches a tag name composed of `prefix:local` or just `local`\n    pub fn matches(&self, tag_name: &str) -> bool {\n        let split = tag_name.find(':');\n        match split {\n            None => tag_name == self.local,\n            Some(idx) => {\n                let (prefix, local) = tag_name.split_at(idx);\n                let local = &local[1..];\n                self.local == local && self.prefix == prefix\n            }\n        }\n    }\n}\n\n#[derive(Debug, PartialEq)]\npub struct Attr<'a> {\n    name: Name<'a>,\n    // attribute values can be escaped (e.g. with double quotes, so we need a Cow)\n    value: Cow<'a, str>,\n}\n\n#[derive(Debug, PartialEq)]\npub struct StartEl<'a> {\n    name: Name<'a>,\n    attributes: Vec<Attr<'a>>,\n    closed: bool,\n    depth: Depth,\n}\n\n/// Xml Start Element\n///\n/// ```xml\n/// <a:b   c=\"d\">\n///  ^^^   ^^^^^\n///  name  attributes\n/// ```\nimpl<'a> StartEl<'a> {\n    pub fn depth(&self) -> Depth {\n        self.depth\n    }\n\n    fn new(local: &'a str, prefix: &'a str, depth: Depth) -> Self {\n        Self {\n            name: Name { prefix, local },\n            attributes: vec![],\n            closed: false,\n            depth,\n        }\n    }\n\n    /// Retrieve an attribute with a given key\n    ///\n    /// key `prefix:local` combined as a str, joined by a `:`\n    pub fn attr<'b>(&'b self, key: &'b str) -> Option<&'b str> {\n        self.attributes\n            .iter()\n            .find(|attr| attr.name.matches(key))\n            .map(|attr| attr.value.as_ref())\n    }\n\n    /// Returns whether this `StartEl` matches a given name\n    /// in `prefix:local` form.\n    pub fn matches(&self, pat: &str) -> bool {\n        self.name.matches(pat)\n    }\n\n    /// Local component of this element's name\n    ///\n    /// ```xml\n    /// <foo:bar>\n    ///      ^^^\n    /// ```\n    pub fn local(&self) -> &str {\n        self.name.local\n    }\n\n    /// Prefix component of this elements name (or empty string)\n    /// ```xml\n    /// <foo:bar>\n    ///  ^^^\n    /// ```\n    pub fn prefix(&self) -> &str {\n        self.name.prefix\n    }\n\n    /// Returns true of `el` at `depth` is a match for this `start_el`\n    fn end_el(&self, el: ElementEnd<'_>, depth: Depth) -> bool {\n        if depth != self.depth {\n            return false;\n        }\n        match el {\n            ElementEnd::Open => false,\n            ElementEnd::Close(prefix, local) => {\n                prefix.as_str() == self.name.prefix && local.as_str() == self.name.local\n            }\n            ElementEnd::Empty => false,\n        }\n    }\n}\n\n/// Xml Document abstraction\n///\n/// This document wraps a lazy tokenizer with depth tracking.\n/// Constructing a document is essentially free.\npub struct Document<'a> {\n    tokenizer: Tokenizer<'a>,\n    depth: Depth,\n}\n\nimpl<'a> TryFrom<&'a [u8]> for Document<'a> {\n    type Error = XmlDecodeError;\n\n    fn try_from(value: &'a [u8]) -> Result<Self, Self::Error> {\n        Ok(Document::new(\n            std::str::from_utf8(value).map_err(XmlDecodeError::unhandled)?,\n        ))\n    }\n}\n\nimpl<'inp> Document<'inp> {\n    pub fn new(doc: &'inp str) -> Self {\n        Document {\n            tokenizer: Tokenizer::from(doc),\n            depth: 0,\n        }\n    }\n\n    /// \"Depth first\" iterator\n    ///\n    /// Unlike [`next_tag()`](ScopedDecoder::next_tag), this method returns the next\n    /// start element regardless of depth. This is useful to give a pointer into the middle\n    /// of a document to start reading.\n    ///\n    /// ```xml\n    /// <Response> <-- first call returns this:\n    ///    <A> <-- next call\n    ///      <Nested /> <-- next call returns this\n    ///      <MoreNested>hello</MoreNested> <-- then this:\n    ///    </A>\n    ///    <B/> <-- second call to next_tag returns this\n    /// </Response>\n    /// ```\n    pub fn next_start_element<'a>(&'a mut self) -> Option<StartEl<'inp>> {\n        next_start_element(self)\n    }\n\n    /// A scoped reader for the entire document\n    pub fn root_element<'a>(&'a mut self) -> Result<ScopedDecoder<'inp, 'a>, XmlDecodeError> {\n        let start_el = self\n            .next_start_element()\n            .ok_or_else(|| XmlDecodeError::custom(\"no root element\"))?;\n        Ok(ScopedDecoder {\n            doc: self,\n            start_el,\n            terminated: false,\n        })\n    }\n\n    /// A scoped reader for a specific tag\n    ///\n    /// This method is necessary for when you need to return a ScopedDecoder from a function\n    /// since normally the stacked-ownership that `next_tag()` uses would prevent returning a reference\n    /// to a field owned by the current function\n    pub fn scoped_to<'a>(&'a mut self, start_el: StartEl<'inp>) -> ScopedDecoder<'inp, 'a> {\n        ScopedDecoder {\n            doc: self,\n            start_el,\n            terminated: false,\n        }\n    }\n}\n\n/// A new-type wrapper around `Token` to prevent the wrapped third party type from showing up in\n/// public API\n#[derive(Debug)]\npub struct XmlToken<'inp>(Token<'inp>);\n\n/// Depth tracking iterator\n///\n/// ```xml\n/// <a> <- startel depth 0\n///   <b> <- startel depth 1\n///     <c> <- startel depth 2\n///     </c> <- endel depth 2\n///   </b> <- endel depth 1\n/// </a> <- endel depth 0\n/// ```\nimpl<'inp> Iterator for Document<'inp> {\n    type Item = Result<(XmlToken<'inp>, Depth), XmlDecodeError>;\n    fn next<'a>(&'a mut self) -> Option<Result<(XmlToken<'inp>, Depth), XmlDecodeError>> {\n        let tok = self.tokenizer.next()?;\n        let tok = match tok {\n            Err(e) => return Some(Err(XmlDecodeError::invalid_xml(e))),\n            Ok(tok) => tok,\n        };\n        // depth bookkeeping\n        match tok {\n            Token::ElementEnd {\n                end: ElementEnd::Close(_, _),\n                ..\n            } => {\n                self.depth -= 1;\n            }\n            Token::ElementEnd {\n                end: ElementEnd::Empty,\n                ..\n            } => self.depth -= 1,\n            t @ Token::ElementStart { .. } => {\n                self.depth += 1;\n                // We want the startel and endel to have the same depth, but after the opener,\n                // the parser will be at depth 1. Return the previous depth:\n                return Some(Ok((XmlToken(t), self.depth - 1)));\n            }\n            _ => {}\n        }\n        Some(Ok((XmlToken(tok), self.depth)))\n    }\n}\n\n/// XmlTag Abstraction\n///\n/// ScopedDecoder represents a tag-scoped view into an XML document. Methods\n/// on `ScopedDecoder` return `None` when the current tag has been exhausted.\npub struct ScopedDecoder<'inp, 'a> {\n    doc: &'a mut Document<'inp>,\n    start_el: StartEl<'inp>,\n    terminated: bool,\n}\n\n/// When a scoped decoder is dropped, its entire scope is consumed so that the\n/// next read begins at the next tag at the same depth.\nimpl Drop for ScopedDecoder<'_, '_> {\n    fn drop(&mut self) {\n        for _ in self {}\n    }\n}\n\nimpl<'inp> ScopedDecoder<'inp, '_> {\n    /// The start element for this scope\n    pub fn start_el<'a>(&'a self) -> &'a StartEl<'inp> {\n        &self.start_el\n    }\n\n    /// Returns the next top-level tag in this scope\n    /// The returned reader will fully read the tag during its lifetime. If it is dropped without\n    /// the data being read, the reader will be advanced until the matching close tag. If you read\n    /// an element with `next_tag()` and you want to ignore it, simply drop the resulting `ScopeDecoder`.\n    ///\n    /// ```xml\n    /// <Response> <-- scoped reader on this tag\n    ///    <A> <-- first call to next_tag returns this\n    ///      <Nested /> <-- to get inner data, call `next_tag` on the returned decoder for `A`\n    ///      <MoreNested>hello</MoreNested>\n    ///    </A>\n    ///    <B/> <-- second call to next_tag returns this\n    /// </Response>\n    /// ```\n    pub fn next_tag<'a>(&'a mut self) -> Option<ScopedDecoder<'inp, 'a>> {\n        let next_tag = next_start_element(self)?;\n        Some(self.nested_decoder(next_tag))\n    }\n\n    fn nested_decoder<'a>(&'a mut self, start_el: StartEl<'inp>) -> ScopedDecoder<'inp, 'a> {\n        ScopedDecoder {\n            doc: self.doc,\n            start_el,\n            terminated: false,\n        }\n    }\n}\n\nimpl<'inp> Iterator for ScopedDecoder<'inp, '_> {\n    type Item = Result<(XmlToken<'inp>, Depth), XmlDecodeError>;\n\n    fn next(&mut self) -> Option<Self::Item> {\n        if self.start_el.closed {\n            self.terminated = true;\n        }\n        if self.terminated {\n            return None;\n        }\n        let (tok, depth) = match self.doc.next() {\n            Some(Ok((tok, depth))) => (tok, depth),\n            other => return other,\n        };\n\n        match tok.0 {\n            Token::ElementEnd { end, .. } if self.start_el.end_el(end, depth) => {\n                self.terminated = true;\n                return None;\n            }\n            _ => {}\n        }\n        Some(Ok((tok, depth)))\n    }\n}\n\n/// Load the next start element out of a depth-tagged token iterator\nfn next_start_element<'a, 'inp>(\n    tokens: &'a mut impl Iterator<Item = Result<(XmlToken<'inp>, Depth), XmlDecodeError>>,\n) -> Option<StartEl<'inp>> {\n    let mut out = StartEl::new(\"\", \"\", 0);\n    loop {\n        match tokens.next()? {\n            Ok((XmlToken(Token::ElementStart { local, prefix, .. }), depth)) => {\n                out.name.local = local.as_str();\n                out.name.prefix = prefix.as_str();\n                out.depth = depth;\n            }\n            Ok((\n                XmlToken(Token::Attribute {\n                    prefix,\n                    local,\n                    value,\n                    ..\n                }),\n                _,\n            )) => out.attributes.push(Attr {\n                name: Name {\n                    local: local.as_str(),\n                    prefix: prefix.as_str(),\n                },\n                value: unescape(value.as_str()).ok()?,\n            }),\n            Ok((\n                XmlToken(Token::ElementEnd {\n                    end: ElementEnd::Open,\n                    ..\n                }),\n                _,\n            )) => break,\n            Ok((\n                XmlToken(Token::ElementEnd {\n                    end: ElementEnd::Empty,\n                    ..\n                }),\n                _,\n            )) => {\n                out.closed = true;\n                break;\n            }\n            _ => {}\n        }\n    }\n    Some(out)\n}\n\n/// Returns the data element at the current position\n///\n/// If the current position is not a data element (and is instead a `<start-element>`) an error\n/// will be returned\npub fn try_data<'a, 'inp>(\n    tokens: &'a mut impl Iterator<Item = Result<(XmlToken<'inp>, Depth), XmlDecodeError>>,\n) -> Result<Cow<'inp, str>, XmlDecodeError> {\n    loop {\n        match tokens.next().map(|opt| opt.map(|opt| opt.0)) {\n            None => return Ok(Cow::Borrowed(\"\")),\n            Some(Ok(XmlToken(Token::Text { text }))) => return unescape(text.as_str()),\n            Some(Ok(e @ XmlToken(Token::ElementStart { .. }))) => {\n                return Err(XmlDecodeError::custom(format!(\n                    \"looking for a data element, found: {e:?}\"\n                )))\n            }\n            Some(Err(e)) => return Err(e),\n            _ => {}\n        }\n    }\n}\n\n#[cfg(test)]\nmod test {\n    use crate::decode::{try_data, Attr, Depth, Document, Name, StartEl};\n\n    // test helper to create a closed startel\n    fn closed<'a>(local: &'a str, prefix: &'a str, depth: Depth) -> StartEl<'a> {\n        let mut s = StartEl::new(local, prefix, depth);\n        s.closed = true;\n        s\n    }\n\n    #[test]\n    fn scoped_tokens() {\n        let xml = r#\"<Response><A></A></Response>\"#;\n        let mut doc = Document::new(xml);\n        let mut root = doc.root_element().expect(\"valid document\");\n        assert_eq!(root.start_el().local(), \"Response\");\n        assert_eq!(root.next_tag().expect(\"tag exists\").start_el().local(), \"A\");\n        assert!(root.next_tag().is_none());\n    }\n\n    #[test]\n    fn handle_depth_properly() {\n        let xml = r#\"<Response><Response></Response><A/></Response>\"#;\n        let mut doc = Document::new(xml);\n        let mut scoped = doc.root_element().expect(\"valid document\");\n        assert_eq!(\n            scoped.next_tag().unwrap().start_el(),\n            &StartEl::new(\"Response\", \"\", 1)\n        );\n        let closed_a = closed(\"A\", \"\", 1);\n        assert_eq!(scoped.next_tag().unwrap().start_el(), &closed_a);\n        assert!(scoped.next_tag().is_none())\n    }\n\n    #[test]\n    fn self_closing() {\n        let xml = r#\"<Response/>\"#;\n        let mut doc = Document::new(xml);\n        let mut scoped = doc.root_element().expect(\"valid doc\");\n        assert!(scoped.start_el.closed);\n        assert!(scoped.next_tag().is_none())\n    }\n\n    #[test]\n    fn terminate_scope() {\n        let xml = r#\"<Response><Struct><A></A><Also/></Struct><More/></Response>\"#;\n        let mut doc = Document::new(xml);\n        let mut response_iter = doc.root_element().expect(\"valid doc\");\n        let mut struct_iter = response_iter.next_tag().unwrap();\n        assert_eq!(\n            struct_iter.next_tag().as_ref().map(|t| t.start_el()),\n            Some(&StartEl::new(\"A\", \"\", 2))\n        );\n        // When the inner iter is dropped, it will read to the end of its scope\n        // prevent accidental behavior where we didn't read a full node\n        drop(struct_iter);\n        assert_eq!(\n            response_iter.next_tag().unwrap().start_el(),\n            &closed(\"More\", \"\", 1)\n        );\n    }\n\n    #[test]\n    fn read_data_invalid() {\n        let xml = r#\"<Response><A></A></Response>\"#;\n        let mut doc = Document::new(xml);\n        let mut resp = doc.root_element().unwrap();\n        try_data(&mut resp).expect_err(\"no data\");\n    }\n\n    #[test]\n    fn read_data() {\n        let xml = r#\"<Response>hello</Response>\"#;\n        let mut doc = Document::new(xml);\n        let mut scoped = doc.root_element().unwrap();\n        assert_eq!(try_data(&mut scoped).unwrap(), \"hello\");\n    }\n\n    /// Whitespace within an element is preserved\n    #[test]\n    fn read_data_whitespace() {\n        let xml = r#\"<Response> hello </Response>\"#;\n        let mut doc = Document::new(xml);\n        let mut scoped = doc.root_element().unwrap();\n        assert_eq!(try_data(&mut scoped).unwrap(), \" hello \");\n    }\n\n    #[test]\n    fn ignore_insignificant_whitespace() {\n        let xml = r#\"<Response>   <A>  </A>    </Response>\"#;\n        let mut doc = Document::new(xml);\n        let mut resp = doc.root_element().unwrap();\n        let mut a = resp.next_tag().expect(\"should be a\");\n        let data = try_data(&mut a).expect(\"valid\");\n        assert_eq!(data, \"  \");\n    }\n\n    #[test]\n    fn read_attributes() {\n        let xml = r#\"<Response xsi:type=\"CanonicalUser\">hello</Response>\"#;\n        let mut tokenizer = Document::new(xml);\n        let root = tokenizer.root_element().unwrap();\n\n        assert_eq!(\n            root.start_el().attributes,\n            vec![Attr {\n                name: Name {\n                    prefix: \"xsi\",\n                    local: \"type\"\n                },\n                value: \"CanonicalUser\".into()\n            }]\n        )\n    }\n\n    #[test]\n    fn unescape_data() {\n        let xml = r#\"<Response key=\"&quot;hey&quot;>\">&gt;</Response>\"#;\n        let mut doc = Document::new(xml);\n        let mut root = doc.root_element().unwrap();\n        assert_eq!(try_data(&mut root).unwrap(), \">\");\n        assert_eq!(root.start_el().attr(\"key\"), Some(\"\\\"hey\\\">\"));\n    }\n\n    #[test]\n    fn nested_self_closer() {\n        let xml = r#\"<XmlListsInputOutput>\n                <stringList/>\n                <stringSet></stringSet>\n        </XmlListsInputOutput>\"#;\n        let mut doc = Document::new(xml);\n        let mut root = doc.root_element().unwrap();\n        let mut string_list = root.next_tag().unwrap();\n        assert_eq!(string_list.start_el(), &closed(\"stringList\", \"\", 1));\n        assert!(string_list.next_tag().is_none());\n        drop(string_list);\n        assert_eq!(\n            root.next_tag().unwrap().start_el(),\n            &StartEl::new(\"stringSet\", \"\", 1)\n        );\n    }\n\n    #[test]\n    fn confusing_nested_same_name_tag() {\n        // an inner b which could be confused as closing the outer b if depth\n        // is not properly tracked:\n        let root_tags = &[\"a\", \"b\", \"c\", \"d\"];\n        let xml = r#\"<XmlListsInputOutput>\n                <a/>\n                <b>\n                  <c/>\n                  <b></b>\n                  <here/>\n                </b>\n                <c></c>\n                <d>more</d>\n        </XmlListsInputOutput>\"#;\n        let mut doc = Document::new(xml);\n        let mut root = doc.root_element().unwrap();\n        let mut cmp = vec![];\n        while let Some(tag) = root.next_tag() {\n            cmp.push(tag.start_el().local().to_owned());\n        }\n        assert_eq!(root_tags, cmp.as_slice());\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-xml/src/encode.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! XML Encoding module that uses Rust lifetimes to make\n//! generating malformed XML a compile error\n\nuse crate::escape::escape;\nuse std::error::Error as StdError;\nuse std::fmt::{self, Display, Formatter, Write};\n\n// currently there's actually no way that encoding can fail but give it time :-)\n#[non_exhaustive]\n#[derive(Debug)]\npub struct XmlEncodeError {}\n\nimpl Display for XmlEncodeError {\n    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {\n        write!(f, \"error encoding XML\")\n    }\n}\n\nimpl StdError for XmlEncodeError {}\n\n/// XmlWriter Abstraction\n///\n/// XmlWriter (and friends) make generating an invalid XML document a type error. Nested branches\n/// of the Xml document mutable borrow from the root. You cannot continue writing to the root\n/// until the nested branch is dropped and dropping the nested branch writes the terminator (e.g.\n/// closing element).\n///\n/// The one exception to this rule is names—it is possible to construct an invalid Xml Name. However,\n/// names are always known ahead of time and always static, so this would be obvious from the code.\n///\n/// Furthermore, once `const panic` stabilizes, we'll be able to make an invalid XmlName a compiler\n/// error.\n///\n/// # Examples\n/// ```rust\n/// use aws_smithy_xml::encode::XmlWriter;\n/// let mut s = String::new();\n/// let mut doc = XmlWriter::new(&mut s);\n/// let mut start_el = doc.start_el(\"Root\")\n///     .write_ns(\"http://example.com\", None);\n/// let mut start_tag = start_el.finish();\n/// start_tag.data(\"hello\");\n/// start_tag.finish();\n/// assert_eq!(s, \"<Root xmlns=\\\"http://example.com\\\">hello</Root>\");\n/// ```\n///\n/// See `tests/handwritten_serializers.rs` for more usage examples.\npub struct XmlWriter<'a> {\n    doc: &'a mut String,\n}\n\nimpl<'a> XmlWriter<'a> {\n    pub fn new(doc: &'a mut String) -> Self {\n        Self { doc }\n    }\n}\n\nimpl XmlWriter<'_> {\n    pub fn start_el<'b, 'c>(&'c mut self, tag: &'b str) -> ElWriter<'c, 'b> {\n        write!(self.doc, \"<{tag}\").unwrap();\n        ElWriter::new(self.doc, tag)\n    }\n}\n\npub struct ElWriter<'a, 'b> {\n    start: &'b str,\n    doc: Option<&'a mut String>,\n}\n\nimpl<'a, 'b> ElWriter<'a, 'b> {\n    fn new(doc: &'a mut String, start: &'b str) -> ElWriter<'a, 'b> {\n        ElWriter {\n            start,\n            doc: Some(doc),\n        }\n    }\n\n    pub fn write_attribute(&mut self, key: &str, value: &str) -> &mut Self {\n        write!(self.doc(), \" {}=\\\"{}\\\"\", key, escape(value)).unwrap();\n        self\n    }\n\n    pub fn write_ns(mut self, namespace: &str, prefix: Option<&str>) -> Self {\n        match prefix {\n            Some(prefix) => {\n                write!(self.doc(), \" xmlns:{}=\\\"{}\\\"\", prefix, escape(namespace)).unwrap()\n            }\n            None => write!(self.doc(), \" xmlns=\\\"{}\\\"\", escape(namespace)).unwrap(),\n        }\n        self\n    }\n\n    fn write_end(doc: &mut String) {\n        write!(doc, \">\").unwrap();\n    }\n\n    fn doc<'c>(&'c mut self) -> &'c mut String\n    where\n        'a: 'c,\n    {\n        // The self.doc is an Option in order to signal whether the closing '>' has been emitted\n        // already (None) or not (Some). It ensures the following invariants:\n        // - If finish() has been called, then self.doc is None and therefore no more writes\n        //   to the &mut String are possible.\n        // - When drop() is called, if self.doc is Some, then finish() has not (and will not)\n        //   be called, and therefore drop() should close the tag represented by this struct.\n        //\n        // Since this function calls unwrap(), it must not be called from finish() or drop().\n        // As finish() consumes self, calls to this method from any other method will not encounter\n        // a None value in self.doc.\n        self.doc.as_mut().unwrap()\n    }\n\n    pub fn finish(mut self) -> ScopeWriter<'a, 'b> {\n        let doc = self.doc.take().unwrap();\n        Self::write_end(doc);\n        ScopeWriter {\n            doc,\n            start: self.start,\n        }\n    }\n}\n\nimpl Drop for ElWriter<'_, '_> {\n    fn drop(&mut self) {\n        if let Some(doc) = self.doc.take() {\n            // Calls to write_end() are always preceded by self.doc.take(). The value in self.doc\n            // is set to Some initially, and is never reset to Some after being taken. Since this\n            // transition to None happens only once, we will never double-close the XML element.\n            Self::write_end(doc);\n        }\n    }\n}\n\n/// Wrap the construction of a tag pair `<a></a>`\npub struct ScopeWriter<'a, 'b> {\n    doc: &'a mut String,\n    start: &'b str,\n}\n\nimpl Drop for ScopeWriter<'_, '_> {\n    fn drop(&mut self) {\n        write!(self.doc, \"</{}>\", self.start).unwrap();\n    }\n}\n\nimpl ScopeWriter<'_, '_> {\n    pub fn data(&mut self, data: &str) {\n        self.doc.write_str(escape(data).as_ref()).unwrap();\n    }\n\n    pub fn finish(self) {\n        // drop will be called which writes the closer to the document\n    }\n\n    pub fn start_el<'b, 'c>(&'c mut self, tag: &'b str) -> ElWriter<'c, 'b> {\n        write!(self.doc, \"<{tag}\").unwrap();\n        ElWriter::new(self.doc, tag)\n    }\n}\n\n#[cfg(test)]\nmod test {\n    use crate::encode::XmlWriter;\n    use aws_smithy_protocol_test::{assert_ok, validate_body, MediaType};\n\n    #[test]\n    fn forgot_finish() {\n        let mut out = String::new();\n\n        fn writer(out: &mut String) {\n            let mut doc_writer = XmlWriter::new(out);\n            doc_writer.start_el(\"Hello\");\n            // We intentionally \"forget\" to call finish() on the ElWriter:\n            // when the XML structs get dropped, the element must get closed automatically.\n        }\n        writer(&mut out);\n\n        assert_ok(validate_body(out, r#\"<Hello></Hello>\"#, MediaType::Xml));\n    }\n\n    #[test]\n    fn forgot_finish_with_attribute() {\n        let mut out = String::new();\n\n        fn writer(out: &mut String) {\n            let mut doc_writer = XmlWriter::new(out);\n            doc_writer.start_el(\"Hello\").write_attribute(\"key\", \"foo\");\n            // We intentionally \"forget\" to call finish() on the ElWriter:\n            // when the XML structs get dropped, the element must get closed automatically.\n        }\n        writer(&mut out);\n\n        assert_ok(validate_body(\n            out,\n            r#\"<Hello key=\"foo\"></Hello>\"#,\n            MediaType::Xml,\n        ));\n    }\n\n    #[test]\n    fn basic_document_encoding() {\n        let mut out = String::new();\n        let mut doc_writer = XmlWriter::new(&mut out);\n        let mut start_el = doc_writer\n            .start_el(\"Hello\")\n            .write_ns(\"http://example.com\", None);\n        start_el.write_attribute(\"key\", \"foo\");\n        let mut tag = start_el.finish();\n        let mut inner = tag.start_el(\"inner\").finish();\n        inner.data(\"hello world!\");\n        inner.finish();\n        let more_inner = tag.start_el(\"inner\").finish();\n        more_inner.finish();\n        tag.finish();\n\n        assert_ok(validate_body(\n            out,\n            r#\"<Hello key=\"foo\" xmlns=\"http://example.com\">\n                    <inner>hello world!</inner>\n                    <inner></inner>\n                </Hello>\"#,\n            MediaType::Xml,\n        ));\n    }\n\n    #[test]\n    fn escape_data() {\n        let mut s = String::new();\n        {\n            let mut doc_writer = XmlWriter::new(&mut s);\n            let mut start_el = doc_writer.start_el(\"Hello\");\n            start_el.write_attribute(\"key\", \"<key=\\\"value\\\">\");\n            let mut tag = start_el.finish();\n            tag.data(\"\\n\\r&\");\n        }\n        assert_eq!(\n            s,\n            r#\"<Hello key=\"&lt;key=&quot;value&quot;&gt;\">&#xA;&#xD;&amp;</Hello>\"#\n        )\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-xml/src/escape.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::borrow::Cow;\nuse std::fmt::Write;\n\nconst ESCAPES: &[char] = &[\n    '&', '\\'', '\\\"', '<', '>', '\\u{00D}', '\\u{00A}', '\\u{0085}', '\\u{2028}',\n];\n\npub(crate) fn escape(s: &str) -> Cow<'_, str> {\n    let mut remaining = s;\n    if !s.contains(ESCAPES) {\n        return Cow::Borrowed(s);\n    }\n    let mut out = String::new();\n    while let Some(idx) = remaining.find(ESCAPES) {\n        out.push_str(&remaining[..idx]);\n        remaining = &remaining[idx..];\n        let mut idxs = remaining.char_indices();\n        let (_, chr) = idxs.next().expect(\"must not be none\");\n        match chr {\n            '>' => out.push_str(\"&gt;\"),\n            '<' => out.push_str(\"&lt;\"),\n            '\\'' => out.push_str(\"&apos;\"),\n            '\"' => out.push_str(\"&quot;\"),\n            '&' => out.push_str(\"&amp;\"),\n            // push a hex escape sequence\n            other => {\n                write!(&mut out, \"&#x{:X};\", other as u32).expect(\"write to string cannot fail\")\n            }\n        };\n        match idxs.next() {\n            None => remaining = \"\",\n            Some((idx, _)) => remaining = &remaining[idx..],\n        }\n    }\n    out.push_str(remaining);\n    Cow::Owned(out)\n}\n\n#[cfg(test)]\nmod test {\n    #[test]\n    fn escape_basic() {\n        let inp = \"<helo>&\\\"'\";\n        assert_eq!(escape(inp), \"&lt;helo&gt;&amp;&quot;&apos;\");\n    }\n\n    #[test]\n    fn escape_eol_encoding_sep() {\n        let test_cases = vec![\n            (\"CiAK\", \"&#xA; &#xA;\"),                                      // '\\n \\n'\n            (\"YQ0KIGIKIGMN\", \"a&#xD;&#xA; b&#xA; c&#xD;\"),                // 'a\\r\\n b\\n c\\r'\n            (\"YQ3ChSBiwoU\", \"a&#xD;&#x85; b&#x85;\"),                      // 'a\\r\\u0085 b\\u0085'\n            (\"YQ3igKggYsKFIGPigKg=\", \"a&#xD;&#x2028; b&#x85; c&#x2028;\"), // 'a\\r\\u2028 b\\u0085 c\\u2028'\n        ];\n        for (base64_encoded, expected_xml_output) in test_cases {\n            let bytes = base64::decode(base64_encoded).expect(\"valid base64\");\n            let input = String::from_utf8(bytes).expect(\"valid utf-8\");\n            assert_eq!(escape(&input), expected_xml_output);\n        }\n    }\n\n    use crate::escape::escape;\n    use proptest::proptest;\n    proptest! {\n        /// Test that arbitrary strings round trip after being escaped and unescaped\n        #[test]\n        fn round_trip(s: String) {\n            let encoded = escape(&s);\n            let decoded = crate::unescape::unescape(&encoded).expect(\"encoded should be valid decoded\");\n            assert_eq!(decoded, s);\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-xml/src/lib.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/* Automatically managed default lints */\n#![cfg_attr(docsrs, feature(doc_cfg))]\n/* End of automatically managed default lints */\n#![allow(clippy::derive_partial_eq_without_eq)]\n#![warn(\n    // missing_docs,\n    rustdoc::missing_crate_level_docs,\n    unreachable_pub,\n    rust_2018_idioms\n)]\n\n//! Abstractions for Smithy\n//! [XML Binding Traits](https://smithy.io/2.0/spec/protocol-traits.html#xml-bindings)\n\npub mod decode;\npub mod encode;\nmod escape;\nmod unescape;\n"
  },
  {
    "path": "rust-runtime/aws-smithy-xml/src/unescape.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::decode::XmlDecodeError;\nuse std::borrow::Cow;\n\n/// Unescape XML encoded characters\n///\n/// This function will unescape the 4 literal escapes:\n/// - `&lt;`, `&gt;`, `&amp;`, `&quot;`, and `&apos;`\n/// - Decimal escapes: `&#123;`\n/// - Hex escapes: `&#xD;`\n///\n/// If no escape sequences are present, Cow<&'str> will be returned, avoiding the need\n/// to copy the String.\npub(crate) fn unescape(s: &str) -> Result<Cow<'_, str>, XmlDecodeError> {\n    // no &, no need to escape anything\n    if !s.contains('&') {\n        return Ok(Cow::Borrowed(s));\n    }\n    // this will be strictly larger than required avoiding the need for another allocation\n    let mut res = String::with_capacity(s.len());\n    // could consider memchr as performance optimization\n    let mut sections = s.split('&');\n    // push content before the first &\n    if let Some(prefix) = sections.next() {\n        res.push_str(prefix);\n    }\n    for section in sections {\n        // entities look like &<somedata>;\n        match section.find(';') {\n            Some(idx) => {\n                let entity = &section[..idx];\n                match entity {\n                    \"lt\" => res.push('<'),\n                    \"gt\" => res.push('>'),\n                    \"amp\" => res.push('&'),\n                    \"quot\" => res.push('\"'),\n                    \"apos\" => res.push('\\''),\n                    entity => {\n                        // e.g. &#xD;\n                        let (entity, radix) = if let Some(entity) = entity.strip_prefix(\"#x\") {\n                            (entity, 16)\n                        } else if let Some(entity) = entity.strip_prefix('#') {\n                            // e.g. &#123;\n                            (entity, 10)\n                        } else {\n                            return Err(XmlDecodeError::invalid_escape(entity));\n                        };\n                        let char_code = u32::from_str_radix(entity, radix).map_err(|_| {\n                            XmlDecodeError::invalid_escape(format!(\n                                \"expected numeric escape in base {}; got: {}\",\n                                radix, &entity\n                            ))\n                        })?;\n                        let chr = std::char::from_u32(char_code).ok_or_else(|| {\n                            XmlDecodeError::invalid_escape(format!(\n                                \"invalid char code: {char_code}\"\n                            ))\n                        })?;\n                        res.push(chr);\n                    }\n                }\n                // push everything from the `;` to the next `&`\n                res.push_str(&section[idx + 1..])\n            }\n            None => return Err(XmlDecodeError::invalid_escape(\"unterminated pattern\")),\n        }\n    }\n    Ok(Cow::Owned(res))\n}\n\n#[cfg(test)]\nmod test {\n    use crate::unescape::unescape;\n    use std::borrow::Cow;\n\n    #[test]\n    fn basic_unescape() {\n        assert_eq!(\n            unescape(\"&lt; &gt; &apos; &quot; &amp;\").unwrap(),\n            \"< > ' \\\" &\"\n        );\n        assert_eq!(\n            unescape(\"Since a &gt; b, b is less than a\").unwrap(),\n            \"Since a > b, b is less than a\"\n        );\n    }\n\n    #[test]\n    fn no_need_to_escape() {\n        assert_eq!(unescape(\"hello 🍕!\").unwrap(), Cow::Borrowed(\"hello 🍕!\"));\n    }\n\n    #[test]\n    fn complex_unescape() {\n        // Test cases adapted from Apache Commons StringEscapeUtilsTest.java\n        assert_eq!(\n            unescape(\"a&lt;b&gt;c&quot;d&apos;e&amp;f;;\").unwrap(),\n            \"a<b>c\\\"d'e&f;;\"\n        );\n        assert_eq!(unescape(\"&amp;lt;\").unwrap(), \"&lt;\")\n    }\n\n    #[test]\n    fn newline_encoding() {\n        assert_eq!(unescape(\"&#10;\").unwrap(), \"\\n\");\n        assert_eq!(unescape(\"&#xD;\").unwrap(), \"\\r\");\n    }\n\n    #[test]\n    fn xml_eol_encoding() {\n        assert_eq!(unescape(\"&#xA; &#xA;\").unwrap(), \"\\n \\n\");\n        assert_eq!(\n            unescape(\"a&#xD;&#xA; b&#xA; c&#xD;\").unwrap(),\n            \"a\\r\\n b\\n c\\r\"\n        );\n        assert_eq!(\n            unescape(\"a&#xD;&#x85; b&#x85;\").unwrap(),\n            \"a\\r\\u{0085} b\\u{0085}\"\n        );\n        assert_eq!(\n            unescape(\"a&#xD;&#x2028; b&#x85; c&#x2028;\").unwrap(),\n            \"a\\r\\u{2028} b\\u{0085} c\\u{2028}\"\n        );\n    }\n\n    #[test]\n    fn invalid_escapes() {\n        unescape(\"&lte;\").expect_err(\"lte does not make a ≤\");\n        unescape(\"&lt\").expect_err(\"unterminated escape sequence\");\n        unescape(\"&#Q1234;\").expect_err(\"Q does not began a numeric sequence\");\n        unescape(\"&#3.14;\").expect_err(\"decimal escape\");\n        unescape(\"&#xZZ\").expect_err(\"Z is not hex\");\n        unescape(\"here is a & but without an escape sequence...\").expect_err(\"naked &\");\n    }\n\n    use proptest::prelude::*;\n    proptest! {\n        #[test]\n        fn no_panics(s: String) {\n            let unescaped = unescape(&s);\n            // if the string needed to be escaped, we\n            if s.contains('&') {\n                assert!(\n                    matches!(unescaped, Ok(Cow::Owned(_)) | Err(_))\n                );\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-xml/tests/handwritten_parsers.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! A collection of handwritten parsers similar to the\n//! parsers that are code generated by XmlParserGenerator.kt\n/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_smithy_xml::decode::{try_data, Document, ScopedDecoder, XmlDecodeError};\nuse std::collections::HashMap;\n\n#[derive(Eq, PartialEq, Debug)]\nenum FooEnum {\n    Unknown(String),\n}\n\nimpl<'a> From<&'a str> for FooEnum {\n    fn from(s: &'a str) -> Self {\n        Self::Unknown(s.to_string())\n    }\n}\n\n#[derive(Eq, PartialEq, Debug)]\nstruct FlatXmlMap {\n    my_map: HashMap<String, FooEnum>,\n}\n\n#[derive(Eq, PartialEq, Debug)]\nstruct XmlMap {\n    values: HashMap<String, FooEnum>,\n}\n\n#[derive(Eq, PartialEq, Debug)]\nstruct XmlAttribute {\n    foo: String,\n    bar: String,\n}\n\nfn deserialize_xml_attribute(inp: &str) -> Result<XmlAttribute, XmlDecodeError> {\n    let mut doc = Document::new(inp);\n    let mut root = doc.root_element()?;\n    #[allow(unused_assignments)]\n    #[allow(clippy::disallowed_names)]\n    let mut foo: Option<String> = None;\n    let mut bar: Option<String> = None;\n    foo = root.start_el().attr(\"foo\").map(|attr| attr.to_string());\n    while let Some(mut tag) = root.next_tag() {\n        if tag.start_el().matches(\"bar\") {\n            bar = Some(try_data(&mut tag)?.to_string());\n        }\n    }\n    Ok(XmlAttribute {\n        foo: foo.ok_or_else(|| XmlDecodeError::custom(\"missing foo\"))?,\n        bar: bar.ok_or_else(|| XmlDecodeError::custom(\"missing bar\"))?,\n    })\n}\n\nfn deserialize_flat_xml_map(inp: &str) -> Result<FlatXmlMap, XmlDecodeError> {\n    let mut doc = Document::new(inp);\n    let mut root = doc.root_element()?;\n    let mut my_map: Option<HashMap<String, FooEnum>> = None;\n    while let Some(mut tag) = root.next_tag() {\n        if tag.start_el().matches(\"myMap\") {\n            let mut _my_map = my_map.unwrap_or_default();\n            deserialize_foo_enum_map_entry(&mut tag, &mut _my_map)?;\n            my_map = Some(_my_map);\n        }\n    }\n    Ok(FlatXmlMap {\n        my_map: my_map.unwrap(),\n    })\n}\n\nfn deserialize_xml_map(inp: &str) -> Result<XmlMap, XmlDecodeError> {\n    let mut doc = Document::new(inp);\n    let mut root = doc.root_element()?;\n    let mut my_map: Option<HashMap<String, FooEnum>> = None;\n    while let Some(mut tag) = root.next_tag() {\n        if tag.start_el().matches(\"values\") {\n            my_map = Some(deserialize_foo_enum_map(&mut tag)?);\n        }\n    }\n    Ok(XmlMap {\n        values: my_map.ok_or_else(|| XmlDecodeError::custom(\"missing map\"))?,\n    })\n}\n\nfn deserialize_foo_enum_map(\n    decoder: &mut ScopedDecoder,\n) -> Result<HashMap<String, FooEnum>, XmlDecodeError> {\n    let mut out: HashMap<String, FooEnum> = HashMap::new();\n    while let Some(mut tag) = decoder.next_tag() {\n        if tag.start_el().matches(\"entry\") {\n            deserialize_foo_enum_map_entry(&mut tag, &mut out)?;\n        }\n    }\n    Ok(out)\n}\n\nfn deserialize_foo_enum_map_entry(\n    decoder: &mut ScopedDecoder,\n    out: &mut HashMap<String, FooEnum>,\n) -> Result<(), XmlDecodeError> {\n    let mut k: Option<String> = None;\n    let mut v: Option<FooEnum> = None;\n    while let Some(mut tag) = decoder.next_tag() {\n        match tag.start_el() {\n            s if s.matches(\"key\") => k = Some(try_data(&mut tag)?.to_string()),\n            s if s.matches(\"value\") => v = Some(FooEnum::from(try_data(&mut tag)?.as_ref())),\n            _ => {}\n        }\n    }\n    match (k, v) {\n        (Some(k), Some(v)) => {\n            out.insert(k, v);\n        }\n        _ => return Err(XmlDecodeError::custom(\"missing key value in map\")),\n    }\n    Ok(())\n}\n\n#[test]\nfn deserialize_map_test() {\n    let xml = r#\"<Foo>\n    <values>\n        <entry>\n            <key>example-key1</key>\n            <ignore><this><key>hello</key></this></ignore>\n            <value>example1</value>\n        </entry>\n        <entry>\n            <key>example-key2</key>\n            <value>example2</value>\n        </entry>\n    </values>\n</Foo>\"#;\n\n    let mut out = HashMap::new();\n    out.insert(\"example-key1\".to_string(), FooEnum::from(\"example1\"));\n    out.insert(\"example-key2\".to_string(), FooEnum::from(\"example2\"));\n    assert_eq!(\n        deserialize_xml_map(xml).expect(\"valid\"),\n        XmlMap { values: out }\n    )\n}\n\npub fn deserialize_nested_string_list(\n    decoder: &mut ScopedDecoder,\n) -> Result<std::vec::Vec<std::vec::Vec<std::string::String>>, XmlDecodeError> {\n    let mut out = std::vec::Vec::new();\n    while let Some(mut tag) = decoder.next_tag() {\n        match tag.start_el() {\n            s if s.matches(\"member\") => {\n                out.push(deserialize_string_list(&mut tag)?);\n            }\n            _ => {}\n        }\n    }\n    Ok(out)\n}\n\npub fn deserialize_string_list(\n    decoder: &mut ScopedDecoder,\n) -> Result<std::vec::Vec<std::string::String>, XmlDecodeError> {\n    let mut out = std::vec::Vec::new();\n    while let Some(mut tag) = decoder.next_tag() {\n        match dbg!(tag.start_el()) {\n            s if s.matches(\"member\") => {\n                out.push(dbg!({\n                    aws_smithy_xml::decode::try_data(&mut tag)?.to_string()\n                }));\n            }\n            _ => {}\n        };\n    }\n    println!(\"done\");\n    Ok(out)\n}\n\n#[test]\nfn test_nested_string_list() {\n    let xml = r#\"\n            <nestedStringList>\n                <member>\n                    <member>foo</member>\n                    <member>bar</member>\n                </member>\n                <member>\n                    <member>baz</member>\n                    <member>qux</member>\n                </member>\n            </nestedStringList>\n   \"#;\n    let mut doc = Document::new(xml);\n    let mut root = doc.root_element().unwrap();\n    assert_eq!(\n        deserialize_nested_string_list(&mut root).unwrap(),\n        vec![vec![\"foo\", \"bar\"], vec![\"baz\", \"qux\"]]\n    );\n}\n\n#[test]\nfn deserialize_flat_map_test() {\n    let xml = r#\"<FlattenedXmlMapInputOutput>\n\t\t\t    <myMap>\n\t\t\t        <key>foo</key>\n\t\t\t        <value>Foo</value>\n\t\t\t    </myMap>\n\t\t\t    <myMap>\n\t\t\t        <key>baz</key>\n\t\t\t        <value>Baz</value>\n\t\t\t    </myMap>\n\t\t\t</FlattenedXmlMapInputOutput>\"#;\n\n    let mut out = HashMap::new();\n    out.insert(\"foo\".to_string(), FooEnum::from(\"Foo\"));\n    out.insert(\"baz\".to_string(), FooEnum::from(\"Baz\"));\n    assert_eq!(\n        deserialize_flat_xml_map(xml).unwrap(),\n        FlatXmlMap { my_map: out }\n    )\n}\n\n#[test]\nfn test_deserialize_xml_attribute() {\n    let xml = r#\"<MyStructure foo=\"example\">\n    <bar>examplebar</bar>\n</MyStructure>\"#;\n    assert_eq!(\n        deserialize_xml_attribute(xml).expect(\"valid\"),\n        XmlAttribute {\n            foo: \"example\".to_string(),\n            bar: \"examplebar\".to_string()\n        }\n    );\n}\n"
  },
  {
    "path": "rust-runtime/aws-smithy-xml/tests/handwritten_serializers.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_smithy_protocol_test::{validate_body, MediaType};\nuse aws_smithy_xml::encode::{ScopeWriter, XmlEncodeError, XmlWriter};\n\n// @namespace http://www.example.com\nstruct WithNamespace {\n    foo: String,\n    bar: String,\n}\n\nstruct Nested {\n    // @xmlAttribute(\"a\")\n    a: String,\n    inner: WithNamespace,\n}\n\nfn serialize_nested(nested: &Nested) -> Result<String, XmlEncodeError> {\n    let mut out = String::new();\n    {\n        let mut writer = XmlWriter::new(&mut out);\n        let mut start_el = writer.start_el(\"Nested\");\n        start_el.write_attribute(\"a\", &nested.a);\n        let mut tag = start_el.finish();\n        let mut inner = tag.start_el(\"inner\").finish();\n        with_namespace_inner(&mut inner, &nested.inner);\n    }\n    Ok(out)\n}\n\nfn serialize_with_namespace(with_namespace: &WithNamespace) -> Result<String, XmlEncodeError> {\n    let mut out = String::new();\n    {\n        let mut writer = XmlWriter::new(&mut out);\n        let root = writer.start_el(\"MyStructure\");\n        let mut root_scope = root.write_ns(\"http://foo.com\", None).finish();\n        with_namespace_inner(&mut root_scope, with_namespace);\n        root_scope.finish();\n    }\n\n    Ok(out)\n}\n\nfn with_namespace_inner(tag: &mut ScopeWriter, with_namespace: &WithNamespace) {\n    let mut foo_scope = tag.start_el(\"foo\").finish();\n    foo_scope.data(&with_namespace.foo);\n    foo_scope.finish();\n\n    let mut bar_scope = tag.start_el(\"bar\").finish();\n    bar_scope.data(&with_namespace.bar);\n    bar_scope.finish();\n}\n\n#[test]\nfn test_serialize_with_namespace() {\n    let inp = WithNamespace {\n        foo: \"FooFoo\".to_string(),\n        bar: \"BarBar\".to_string(),\n    };\n\n    validate_body(\n        serialize_with_namespace(&inp).unwrap(),\n        r#\"<MyStructure xmlns=\"http://foo.com\">\n            <foo>FooFoo</foo>\n            <bar>BarBar</bar>\n        </MyStructure>\"#,\n        MediaType::Xml,\n    )\n    .expect(\"correct XML should be generated\");\n}\n\n#[test]\nfn test_serialize_nested() {\n    let inp = Nested {\n        a: \"avalue\".to_string(),\n        inner: WithNamespace {\n            foo: \"foovalue\".to_string(),\n            bar: \"barvalue\".to_string(),\n        },\n    };\n\n    validate_body(\n        serialize_nested(&inp).unwrap(),\n        r#\"<Nested a=\"avalue\">\n            <inner>\n                <foo>foovalue</foo>\n                <bar>barvalue</bar>\n            </inner>\n        </Nested>\"#,\n        MediaType::Xml,\n    )\n    .expect(\"correct XML should be generated\");\n}\n"
  },
  {
    "path": "rust-runtime/build.gradle.kts",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nplugins {\n    id(\"smithy-rs.kotlin-conventions\")\n    id(\"smithy-rs.publishing-conventions\")\n}\n\ndescription = \"Rust Runtime\"\nextra[\"displayName\"] = \"Smithy :: Rust :: Rust Runtime\"\nextra[\"moduleName\"] = \"software.amazon.smithy.rust.runtime\"\n\ntasks.jar {\n    from(\"./\") {\n        include(\"inlineable/src/\")\n        include(\"inlineable/Cargo.toml\")\n    }\n}\n\nval properties = PropertyRetriever(rootProject, project)\nval outputDir = layout.buildDirectory.dir(\"smithy-rs\")\nval runtimeOutputDir = outputDir.get().dir(\"rust-runtime\")\n\ntasks.assemble.configure {\n    dependsOn(\"copyRuntimeCrates\")\n    dependsOn(\"fixRuntimeCrateVersions\")\n    dependsOn(\"fixManifests\")\n}\n\ntasks.register<Copy>(\"copyRuntimeCrates\") {\n    from(\"$rootDir/rust-runtime\") {\n        CrateSet.ENTIRE_SMITHY_RUNTIME.forEach { include(\"${it.name}/**\") }\n    }\n    exclude(\"**/target\")\n    exclude(\"**/Cargo.lock\")\n    exclude(\"**/node_modules\")\n    into(runtimeOutputDir)\n}\n\ntasks.register(\"fixRuntimeCrateVersions\") {\n    dependsOn(\"copyRuntimeCrates\")\n    doLast {\n        CrateSet.ENTIRE_SMITHY_RUNTIME.forEach { module ->\n            patchFile(runtimeOutputDir.file(\"${module.name}/Cargo.toml\").asFile) { line ->\n                rewriteRuntimeCrateVersion(properties.get(module.versionPropertyName)!!, line)\n            }\n        }\n    }\n}\n\ntasks.register<ExecRustBuildTool>(\"fixManifests\") {\n    description = \"Run the publisher tool's `fix-manifests` sub-command on the runtime crates\"\n    toolPath = rootProject.projectDir.resolve(\"tools/ci-build/publisher\")\n    binaryName = \"publisher\"\n    arguments = listOf(\"fix-manifests\", \"--location\", runtimeOutputDir.asFile.absolutePath)\n    dependsOn(\"fixRuntimeCrateVersions\")\n}\n"
  },
  {
    "path": "rust-runtime/clippy.toml",
    "content": "# this file is named `clippy-root.toml` so it isn't picked up automagically. Clippy\n# will search up the filesystem for a clippy.toml and this causes problems with tools.\ndisallowed-methods = [\n    # fully qualified function/method name:\n    \"std::time::SystemTime::now\",\n    \"std::time::SystemTime::elapsed\",\n    \"std::time::Instant::now\",\n    \"std::time::Instant::elapsed\"\n]\n"
  },
  {
    "path": "rust-runtime/inlineable/Cargo.toml",
    "content": "[package]\nname = \"inlineable\"\nversion = \"0.1.0\"\nauthors = [\"AWS Rust SDK Team <aws-sdk-rust@amazon.com>\", \"Russell Cohen <rcoh@amazon.com>\"]\nedition = \"2021\"\ndescription = \"\"\"\nThe modules of this crate are intended to be inlined directly into the SDK as needed. The dependencies here\nare to allow this crate to be compilable and testable in isolation, no client code actually takes these dependencies.\n\"\"\"\nlicense = \"Apache-2.0\"\npublish = false\nrepository = \"https://github.com/smithy-lang/smithy-rs\"\nrust-version = \"1.91.1\"\n\n[features]\n# this allows the tests to be excluded from downstream crates to keep dependencies / test times reasonable (e.g. no proptests)\ngated-tests = []\ndefault = [\"gated-tests\"]\n\n[dependencies]\naws-smithy-cbor = { path = \"../aws-smithy-cbor\" }\naws-smithy-compression = { path = \"../aws-smithy-compression\" }\naws-smithy-http = { path = \"../aws-smithy-http\", features = [\"event-stream\"] }\naws-smithy-json = { path = \"../aws-smithy-json\" }\naws-smithy-runtime = { path = \"../aws-smithy-runtime\", features = [\"client\"] }\naws-smithy-runtime-api = { path = \"../aws-smithy-runtime-api\", features = [\"client\", \"test-util\", \"http-1x\"] }\naws-smithy-types = { path = \"../aws-smithy-types\", features = [\"http-body-1-x\"]}\naws-smithy-xml = { path = \"../aws-smithy-xml\" }\nbytes = \"1.11.1\"\nfastrand = \"2.3.0\"\nfutures-util = \"0.3.31\"\nhttp = \"0.2.12\"\nhttp-body = \"0.4.6\"\nhttp-1x = {package = \"http\", version = \"1.3.1\"}\nhttp-body-1x = {package = \"http-body\", version = \"1.0.1\"}\nhttp-body-util = \"0.1.3\"\nmd-5 = \"0.10.0\"\npercent-encoding = \"2.3.1\"\npin-project-lite = \"0.2.14\"\nregex-lite = \"0.1.5\"\ntracing = \"0.1.44\"\nurl = \"2.5.4\"\n\n[dev-dependencies]\nproptest = \"1\"\ntokio = { version = \"1.49.0\", features = [\"full\", \"test-util\"] }\n\n[package.metadata.docs.rs]\nall-features = true\ntargets = [\"x86_64-unknown-linux-gnu\"]\ncargo-args = [\"-Zunstable-options\", \"-Zrustdoc-scrape-examples\"]\nrustdoc-args = [\"--cfg\", \"docsrs\"]\n# End of docs.rs metadata\n"
  },
  {
    "path": "rust-runtime/inlineable/LICENSE",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n"
  },
  {
    "path": "rust-runtime/inlineable/README.md",
    "content": "# aws-inlineable\n\nThis is not a \"real\" crate, but instead a collection of Rust files which can be automatically copied into generated\nSDKs. This exists to facilitate writing complex snippets of code that can be tested with normal testing machinery\nwithout needing to create and publish an entire additional crate.\n\n<!-- anchor_start:footer -->\nThis crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) and the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator. In most cases, it should not be used directly.\n<!-- anchor_end:footer -->\n"
  },
  {
    "path": "rust-runtime/inlineable/external-types.toml",
    "content": "allowed_external_types = [\n]\n"
  },
  {
    "path": "rust-runtime/inlineable/src/auth_plugin.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::borrow::Cow;\n\nuse aws_smithy_runtime_api::client::auth::static_resolver::StaticAuthSchemeOptionResolver;\nuse aws_smithy_runtime_api::client::auth::AuthSchemeId;\nuse aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder;\nuse aws_smithy_runtime_api::client::runtime_plugin::{Order, RuntimePlugin};\n\n// A runtime plugin that registers `StaticAuthSchemeOptionResolver` with `RuntimeComponents`.\n#[derive(Debug)]\npub(crate) struct DefaultAuthOptionsPlugin {\n    runtime_components: RuntimeComponentsBuilder,\n}\n\nimpl DefaultAuthOptionsPlugin {\n    pub(crate) fn new(auth_schemes: Vec<AuthSchemeId>) -> Self {\n        let runtime_components = RuntimeComponentsBuilder::new(\"default_auth_options\")\n            .with_auth_scheme_option_resolver(Some(StaticAuthSchemeOptionResolver::new(\n                auth_schemes,\n            )));\n        Self { runtime_components }\n    }\n}\n\nimpl RuntimePlugin for DefaultAuthOptionsPlugin {\n    fn order(&self) -> Order {\n        Order::Defaults\n    }\n\n    fn runtime_components(\n        &self,\n        _current_components: &RuntimeComponentsBuilder,\n    ) -> Cow<'_, RuntimeComponentsBuilder> {\n        Cow::Borrowed(&self.runtime_components)\n    }\n}\n"
  },
  {
    "path": "rust-runtime/inlineable/src/aws_query_compatible_errors.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_smithy_runtime_api::http::Headers;\n\nconst X_AMZN_QUERY_ERROR: &str = \"x-amzn-query-error\";\nconst QUERY_COMPATIBLE_ERRORCODE_DELIMITER: char = ';';\n\n/// Obtains custom error code and error type from the given `headers`.\n///\n/// Looks up a value for the `X_AMZN_QUERY_ERROR` header and if found, the value should be in the\n/// form of `<error code>;<error type>`. The function then splits it into two parts and returns\n/// a (error code, error type) as a tuple.\n///\n/// Any execution path besides the above happy path will yield a `None`.\npub fn parse_aws_query_compatible_error(headers: &Headers) -> Option<(&str, &str)> {\n    let header_value = headers.get(X_AMZN_QUERY_ERROR)?;\n    header_value\n        .find(QUERY_COMPATIBLE_ERRORCODE_DELIMITER)\n        .map(|idx| (&header_value[..idx], &header_value[idx + 1..]))\n}\n\n#[cfg(test)]\nmod test {\n    use crate::aws_query_compatible_errors::{\n        parse_aws_query_compatible_error, X_AMZN_QUERY_ERROR,\n    };\n    use aws_smithy_runtime_api::http::Response;\n\n    #[test]\n    fn parse_aws_query_compatible_error_should_parse_code_and_type_fields() {\n        let mut response: http_1x::Response<()> = http_1x::Response::default();\n        response.headers_mut().insert(\n            X_AMZN_QUERY_ERROR,\n            http_1x::HeaderValue::from_static(\"AWS.SimpleQueueService.NonExistentQueue;Sender\"),\n        );\n        let response = Response::try_from(response).unwrap();\n\n        let actual = parse_aws_query_compatible_error(response.headers());\n\n        assert_eq!(\n            Some((\"AWS.SimpleQueueService.NonExistentQueue\", \"Sender\")),\n            actual,\n        );\n    }\n\n    #[test]\n    fn parse_aws_query_compatible_error_should_return_none_when_header_value_has_no_delimiter() {\n        let mut response: http_1x::Response<()> = http_1x::Response::default();\n        response.headers_mut().insert(\n            X_AMZN_QUERY_ERROR,\n            http_1x::HeaderValue::from_static(\"AWS.SimpleQueueService.NonExistentQueue\"),\n        );\n        let response = Response::try_from(response).unwrap();\n\n        let actual = parse_aws_query_compatible_error(response.headers());\n\n        assert_eq!(None, actual);\n    }\n\n    #[test]\n    fn parse_aws_query_compatible_error_should_return_none_when_there_is_no_target_header() {\n        let mut response: http_1x::Response<()> = http_1x::Response::default();\n        response.headers_mut().insert(\n            \"x-amzn-requestid\",\n            http_1x::HeaderValue::from_static(\"a918fbf2-457a-4fe1-99ba-5685ce220fc1\"),\n        );\n        let response = Response::try_from(response).unwrap();\n\n        let actual = parse_aws_query_compatible_error(response.headers());\n\n        assert_eq!(None, actual);\n    }\n}\n"
  },
  {
    "path": "rust-runtime/inlineable/src/cbor_errors.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_smithy_cbor::decode::DeserializeError;\nuse aws_smithy_cbor::Decoder;\nuse aws_smithy_runtime_api::http::Headers;\nuse aws_smithy_types::error::metadata::{Builder as ErrorMetadataBuilder, ErrorMetadata};\n\n// This function is a copy-paste from `json_errors::sanitize_error_code`, therefore the functional\n// tests can be viewed in the unit tests there.\n// Since this is in the `inlineable` crate, there aren't good modules for housing common utilities\n// unless we move this to a Smithy runtime crate.\nfn sanitize_error_code(error_code: &str) -> &str {\n    // Trim a trailing URL from the error code, which is done by removing the longest suffix\n    // beginning with a `:`\n    let error_code = match error_code.find(':') {\n        Some(idx) => &error_code[..idx],\n        None => error_code,\n    };\n\n    // Trim a prefixing namespace from the error code, beginning with a `#`\n    match error_code.find('#') {\n        Some(idx) => &error_code[idx + 1..],\n        None => error_code,\n    }\n}\n\npub fn parse_error_metadata(\n    _response_status: u16,\n    _response_headers: &Headers,\n    response_body: &[u8],\n) -> Result<ErrorMetadataBuilder, DeserializeError> {\n    fn error_code_and_message(\n        mut builder: ErrorMetadataBuilder,\n        decoder: &mut Decoder,\n    ) -> Result<ErrorMetadataBuilder, DeserializeError> {\n        builder = match decoder.str()?.as_ref() {\n            \"__type\" => {\n                let code = decoder.str()?;\n                builder.code(sanitize_error_code(&code))\n            }\n            \"message\" | \"Message\" | \"errorMessage\" => {\n                // Silently skip if `message` is not a string. This allows for custom error\n                // structures that might use different types for the message field.\n                match decoder.str() {\n                    Ok(message) => builder.message(message),\n                    Err(_) => builder,\n                }\n            }\n            _ => {\n                decoder.skip()?;\n                builder\n            }\n        };\n        Ok(builder)\n    }\n\n    let decoder = &mut Decoder::new(response_body);\n    let mut builder = ErrorMetadata::builder();\n\n    match decoder.map()? {\n        None => loop {\n            match decoder.datatype()? {\n                ::aws_smithy_cbor::data::Type::Break => {\n                    decoder.skip()?;\n                    break;\n                }\n                _ => {\n                    builder = error_code_and_message(builder, decoder)?;\n                }\n            };\n        },\n        Some(n) => {\n            for _ in 0..n {\n                builder = error_code_and_message(builder, decoder)?;\n            }\n        }\n    };\n\n    Ok(builder)\n}\n"
  },
  {
    "path": "rust-runtime/inlineable/src/client_http_checksum_required.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::borrow::Cow;\n\nuse aws_smithy_runtime_api::box_error::BoxError;\nuse aws_smithy_runtime_api::client::interceptors::context::BeforeTransmitInterceptorContextMut;\nuse aws_smithy_runtime_api::client::interceptors::{\n    dyn_dispatch_hint, Intercept, SharedInterceptor,\n};\nuse aws_smithy_runtime_api::client::runtime_components::{\n    RuntimeComponents, RuntimeComponentsBuilder,\n};\nuse aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugin;\nuse aws_smithy_types::base64;\nuse aws_smithy_types::config_bag::ConfigBag;\n\n#[derive(Debug)]\npub(crate) struct HttpChecksumRequiredRuntimePlugin {\n    runtime_components: RuntimeComponentsBuilder,\n}\n\nimpl HttpChecksumRequiredRuntimePlugin {\n    pub(crate) fn new() -> Self {\n        Self {\n            runtime_components: RuntimeComponentsBuilder::new(\"HttpChecksumRequiredRuntimePlugin\")\n                .with_interceptor(SharedInterceptor::permanent(\n                    HttpChecksumRequiredInterceptor,\n                )),\n        }\n    }\n}\n\nimpl RuntimePlugin for HttpChecksumRequiredRuntimePlugin {\n    fn runtime_components(\n        &self,\n        _: &RuntimeComponentsBuilder,\n    ) -> Cow<'_, RuntimeComponentsBuilder> {\n        Cow::Borrowed(&self.runtime_components)\n    }\n}\n\n#[derive(Debug)]\nstruct HttpChecksumRequiredInterceptor;\n\n#[dyn_dispatch_hint]\nimpl Intercept for HttpChecksumRequiredInterceptor {\n    fn name(&self) -> &'static str {\n        \"HttpChecksumRequiredInterceptor\"\n    }\n\n    fn modify_before_signing(\n        &self,\n        context: &mut BeforeTransmitInterceptorContextMut<'_>,\n        _runtime_components: &RuntimeComponents,\n        _cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        let request = context.request_mut();\n        let body_bytes = request\n            .body()\n            .bytes()\n            .expect(\"checksum can only be computed for non-streaming operations\");\n        let checksum = <md5::Md5 as md5::Digest>::digest(body_bytes);\n        request\n            .headers_mut()\n            .insert(\"content-md5\", base64::encode(&checksum[..]));\n        Ok(())\n    }\n}\n"
  },
  {
    "path": "rust-runtime/inlineable/src/client_idempotency_token.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::borrow::Cow;\nuse std::fmt;\n\nuse aws_smithy_runtime_api::box_error::BoxError;\nuse aws_smithy_runtime_api::client::interceptors::context::{\n    BeforeSerializationInterceptorContextMut, Input,\n};\nuse aws_smithy_runtime_api::client::interceptors::{\n    dyn_dispatch_hint, Intercept, SharedInterceptor,\n};\nuse aws_smithy_runtime_api::client::runtime_components::{\n    RuntimeComponents, RuntimeComponentsBuilder,\n};\nuse aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugin;\nuse aws_smithy_types::config_bag::ConfigBag;\n\nuse crate::idempotency_token::IdempotencyTokenProvider;\n\n#[derive(Debug)]\npub(crate) struct IdempotencyTokenRuntimePlugin {\n    runtime_components: RuntimeComponentsBuilder,\n}\n\nimpl IdempotencyTokenRuntimePlugin {\n    pub(crate) fn new<S>(set_token: S) -> Self\n    where\n        S: Fn(IdempotencyTokenProvider, &mut Input) + Send + Sync + 'static,\n    {\n        Self {\n            runtime_components: RuntimeComponentsBuilder::new(\"IdempotencyTokenRuntimePlugin\")\n                .with_interceptor(SharedInterceptor::permanent(IdempotencyTokenInterceptor {\n                    set_token,\n                })),\n        }\n    }\n}\n\nimpl RuntimePlugin for IdempotencyTokenRuntimePlugin {\n    fn runtime_components(\n        &self,\n        _: &RuntimeComponentsBuilder,\n    ) -> Cow<'_, RuntimeComponentsBuilder> {\n        Cow::Borrowed(&self.runtime_components)\n    }\n}\n\nstruct IdempotencyTokenInterceptor<S> {\n    set_token: S,\n}\n\nimpl<S> fmt::Debug for IdempotencyTokenInterceptor<S> {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        f.debug_struct(\"IdempotencyTokenInterceptor\").finish()\n    }\n}\n\n#[dyn_dispatch_hint]\nimpl<S> Intercept for IdempotencyTokenInterceptor<S>\nwhere\n    S: Fn(IdempotencyTokenProvider, &mut Input) + Send + Sync,\n{\n    fn name(&self) -> &'static str {\n        \"IdempotencyTokenInterceptor\"\n    }\n\n    fn modify_before_serialization(\n        &self,\n        context: &mut BeforeSerializationInterceptorContextMut<'_>,\n        _runtime_components: &RuntimeComponents,\n        cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        let token_provider = cfg\n            .load::<IdempotencyTokenProvider>()\n            .expect(\"the idempotency provider must be set\")\n            .clone();\n        (self.set_token)(token_provider, context.input_mut());\n        Ok(())\n    }\n}\n"
  },
  {
    "path": "rust-runtime/inlineable/src/client_request_compression.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_smithy_compression::body::compress::CompressedBody;\nuse aws_smithy_compression::http::CompressRequest;\nuse aws_smithy_compression::{CompressionAlgorithm, CompressionOptions};\nuse aws_smithy_runtime::client::sdk_feature::SmithySdkFeature;\nuse aws_smithy_runtime_api::box_error::BoxError;\nuse aws_smithy_runtime_api::client::interceptors::context::{\n    BeforeSerializationInterceptorContextRef, BeforeTransmitInterceptorContextMut,\n};\nuse aws_smithy_runtime_api::client::interceptors::{\n    dyn_dispatch_hint, Intercept, SharedInterceptor,\n};\nuse aws_smithy_runtime_api::client::orchestrator::HttpRequest;\nuse aws_smithy_runtime_api::client::runtime_components::{\n    RuntimeComponents, RuntimeComponentsBuilder,\n};\nuse aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugin;\nuse aws_smithy_types::body::SdkBody;\nuse aws_smithy_types::config_bag::{ConfigBag, Layer, Storable, StoreReplace};\nuse aws_smithy_types::error::operation::BuildError;\nuse std::borrow::Cow;\nuse std::{fmt, mem};\n\n#[derive(Debug)]\npub(crate) struct RequestCompressionRuntimePlugin {\n    runtime_components: RuntimeComponentsBuilder,\n}\n\nimpl RequestCompressionRuntimePlugin {\n    pub(crate) fn new() -> Self {\n        Self {\n            runtime_components: RuntimeComponentsBuilder::new(\"RequestCompressionRuntimePlugin\")\n                .with_interceptor(SharedInterceptor::permanent(\n                    RequestCompressionInterceptor::new(),\n                )),\n        }\n    }\n}\n\nimpl RuntimePlugin for RequestCompressionRuntimePlugin {\n    fn runtime_components(\n        &self,\n        _: &RuntimeComponentsBuilder,\n    ) -> Cow<'_, RuntimeComponentsBuilder> {\n        Cow::Borrowed(&self.runtime_components)\n    }\n}\n\n#[derive(Debug)]\nstruct RequestCompressionInterceptorState {\n    options: Option<CompressionOptions>,\n}\n\nimpl Storable for RequestCompressionInterceptorState {\n    type Storer = StoreReplace<Self>;\n}\n\n/// Interceptor for Smithy [`@requestCompression`][spec].\n///\n/// [spec]: https://smithy.io/2.0/spec/behavior-traits.html#requestcompression-trait\npub(crate) struct RequestCompressionInterceptor {}\n\nimpl fmt::Debug for RequestCompressionInterceptor {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        f.debug_struct(\"RequestCompressionInterceptor\").finish()\n    }\n}\n\nimpl RequestCompressionInterceptor {\n    pub(crate) fn new() -> Self {\n        Self {}\n    }\n}\n\n#[dyn_dispatch_hint]\nimpl Intercept for RequestCompressionInterceptor {\n    fn name(&self) -> &'static str {\n        \"RequestCompressionInterceptor\"\n    }\n\n    fn read_before_execution(\n        &self,\n        _context: &BeforeSerializationInterceptorContextRef<'_>,\n        cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        let disable_request_compression = cfg\n            .load::<DisableRequestCompression>()\n            .cloned()\n            .unwrap_or_default();\n        let request_min_compression_size_bytes = cfg\n            .load::<RequestMinCompressionSizeBytes>()\n            .cloned()\n            .unwrap_or_default();\n        let options = CompressionOptions::default()\n            .with_min_compression_size_bytes(request_min_compression_size_bytes.0)?\n            .with_enabled(!disable_request_compression.0);\n\n        let mut layer = Layer::new(\"RequestCompressionInterceptor\");\n        layer.store_put(RequestCompressionInterceptorState {\n            options: Some(options),\n        });\n\n        cfg.push_layer(layer);\n\n        Ok(())\n    }\n\n    fn modify_before_retry_loop(\n        &self,\n        context: &mut BeforeTransmitInterceptorContextMut<'_>,\n        _runtime_components: &RuntimeComponents,\n        cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        let state = cfg\n            .load::<RequestCompressionInterceptorState>()\n            .expect(\"set in `read_before_execution`\");\n\n        let options = state.options.clone().unwrap();\n        let request = context.request_mut();\n\n        // Don't wrap a body if compression is disabled.\n        if !options.is_enabled() {\n            tracing::trace!(\"request compression is disabled and will not be applied\");\n            return Ok(());\n        }\n\n        // Don't wrap a body if it's below the minimum size\n        //\n        // Because compressing small amounts of data can actually increase its size,\n        // we check to see if the data is big enough to make compression worthwhile.\n        let size_hint = http_body_1x::Body::size_hint(request.body()).exact();\n        if let Some(known_size) = size_hint {\n            if known_size < options.min_compression_size_bytes() as u64 {\n                tracing::trace!(\n                    min_compression_size_bytes = options.min_compression_size_bytes(),\n                    known_size,\n                    \"request body is below minimum size and will not be compressed\"\n                );\n                return Ok(());\n            }\n            tracing::trace!(\"compressing sized request body...\");\n        } else {\n            tracing::trace!(\"compressing unsized request body...\");\n        }\n\n        wrap_request_body_in_compressed_body(\n            request,\n            CompressionAlgorithm::Gzip.into_impl_http_body_1_x(&options),\n        )?;\n        cfg.interceptor_state()\n            .store_append::<SmithySdkFeature>(SmithySdkFeature::GzipRequestCompression);\n\n        Ok(())\n    }\n}\n\nfn wrap_request_body_in_compressed_body(\n    request: &mut HttpRequest,\n    request_compress_impl: Box<dyn CompressRequest>,\n) -> Result<(), BuildError> {\n    request.headers_mut().append(\n        request_compress_impl.header_name(),\n        request_compress_impl.header_value(),\n    );\n    let mut body = {\n        let body = mem::replace(request.body_mut(), SdkBody::taken());\n\n        if body.is_streaming() {\n            request\n                .headers_mut()\n                .remove(http_1x::header::CONTENT_LENGTH);\n            body.map(move |body| {\n                let body = CompressedBody::new(body, request_compress_impl.clone());\n                SdkBody::from_body_1_x(body)\n            })\n        } else {\n            let body = CompressedBody::new(body, request_compress_impl.clone());\n            let body = body.into_compressed_sdk_body().map_err(BuildError::other)?;\n\n            let content_length = body.content_length().expect(\"this payload is in-memory\");\n            request\n                .headers_mut()\n                .insert(http_1x::header::CONTENT_LENGTH, content_length.to_string());\n\n            body\n        }\n    };\n    mem::swap(request.body_mut(), &mut body);\n\n    Ok(())\n}\n\n#[derive(Debug, Copy, Clone, Default)]\npub(crate) struct DisableRequestCompression(pub(crate) bool);\n\nimpl From<bool> for DisableRequestCompression {\n    fn from(value: bool) -> Self {\n        DisableRequestCompression(value)\n    }\n}\n\nimpl Storable for DisableRequestCompression {\n    type Storer = StoreReplace<Self>;\n}\n\n#[derive(Debug, Copy, Clone)]\npub(crate) struct RequestMinCompressionSizeBytes(pub(crate) u32);\n\nimpl Default for RequestMinCompressionSizeBytes {\n    fn default() -> Self {\n        RequestMinCompressionSizeBytes(10240)\n    }\n}\n\nimpl From<u32> for RequestMinCompressionSizeBytes {\n    fn from(value: u32) -> Self {\n        RequestMinCompressionSizeBytes(value)\n    }\n}\n\nimpl Storable for RequestMinCompressionSizeBytes {\n    type Storer = StoreReplace<Self>;\n}\n\n#[cfg(test)]\nmod tests {\n    use super::wrap_request_body_in_compressed_body;\n    use crate::client_request_compression::{\n        RequestCompressionInterceptor, RequestMinCompressionSizeBytes,\n    };\n    use aws_smithy_compression::{CompressionAlgorithm, CompressionOptions};\n    use aws_smithy_runtime::client::sdk_feature::SmithySdkFeature;\n    use aws_smithy_runtime_api::client::interceptors::context::{Input, InterceptorContext};\n    use aws_smithy_runtime_api::client::interceptors::Intercept;\n    use aws_smithy_runtime_api::client::orchestrator::HttpRequest;\n    use aws_smithy_runtime_api::client::runtime_components::RuntimeComponentsBuilder;\n    use aws_smithy_types::body::SdkBody;\n    use aws_smithy_types::config_bag::{ConfigBag, Layer};\n    use http_body_util::BodyExt;\n\n    const UNCOMPRESSED_INPUT: &[u8] = b\"hello world\";\n    const COMPRESSED_OUTPUT: &[u8] = &[\n        31, 139, 8, 0, 0, 0, 0, 0, 0, 255, 203, 72, 205, 201, 201, 87, 40, 207, 47, 202, 73, 1, 0,\n        133, 17, 74, 13, 11, 0, 0, 0,\n    ];\n\n    #[tokio::test]\n    async fn test_compressed_body_is_retryable() {\n        let mut request: HttpRequest = http_1x::Request::builder()\n            .body(SdkBody::retryable(move || {\n                SdkBody::from(UNCOMPRESSED_INPUT)\n            }))\n            .unwrap()\n            .try_into()\n            .unwrap();\n\n        // ensure original SdkBody is retryable\n        let mut body = request.body().try_clone().unwrap();\n        let mut body_data = Vec::new();\n        while let Some(Ok(frame)) = body.frame().await {\n            let data = frame.into_data().expect(\"Data frame\");\n            body_data.extend_from_slice(&data)\n        }\n        // Not yet wrapped, should still be the same as UNCOMPRESSED_INPUT.\n        assert_eq!(UNCOMPRESSED_INPUT, body_data);\n\n        let compression_algorithm = CompressionAlgorithm::Gzip;\n        let compression_options = CompressionOptions::default()\n            .with_min_compression_size_bytes(0)\n            .unwrap();\n\n        wrap_request_body_in_compressed_body(\n            &mut request,\n            compression_algorithm.into_impl_http_body_1_x(&compression_options),\n        )\n        .unwrap();\n\n        // ensure again that wrapped SdkBody is retryable\n        let mut body = request.body().try_clone().expect(\"body is retryable\");\n        let mut body_data = Vec::new();\n        while let Some(Ok(frame)) = body.frame().await {\n            let data = frame.into_data().expect(\"Data frame\");\n            body_data.extend_from_slice(&data)\n        }\n\n        // Since this body was wrapped, the output should be compressed data\n        assert_ne!(UNCOMPRESSED_INPUT, body_data.as_slice());\n        assert_eq!(COMPRESSED_OUTPUT, body_data.as_slice());\n    }\n\n    fn context() -> InterceptorContext {\n        let mut context = InterceptorContext::new(Input::doesnt_matter());\n        context.enter_serialization_phase();\n        context.set_request(\n            http_1x::Request::builder()\n                .body(SdkBody::from(UNCOMPRESSED_INPUT))\n                .unwrap()\n                .try_into()\n                .unwrap(),\n        );\n        let _ = context.take_input();\n        context.enter_before_transmit_phase();\n        context\n    }\n\n    #[tokio::test]\n    async fn test_sdk_feature_gzip_request_compression_should_be_tracked() {\n        let mut cfg = ConfigBag::base();\n        let mut layer = Layer::new(\"test\");\n        layer.store_put(RequestMinCompressionSizeBytes::from(0));\n        cfg.push_layer(layer);\n        let mut context = context();\n        let ctx = Into::into(&context);\n\n        let sut = RequestCompressionInterceptor::new();\n        sut.read_before_execution(&ctx, &mut cfg).unwrap();\n\n        let rc = RuntimeComponentsBuilder::for_tests().build().unwrap();\n        let mut ctx = Into::into(&mut context);\n        sut.modify_before_retry_loop(&mut ctx, &rc, &mut cfg)\n            .unwrap();\n\n        assert_eq!(\n            &SmithySdkFeature::GzipRequestCompression,\n            cfg.load::<SmithySdkFeature>().next().unwrap()\n        );\n    }\n}\n"
  },
  {
    "path": "rust-runtime/inlineable/src/constrained.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npub(crate) trait Constrained {\n    type Unconstrained;\n}\n\n#[derive(Debug, Clone)]\n#[allow(dead_code)]\npub(crate) enum MaybeConstrained<T: Constrained> {\n    Constrained(T),\n    Unconstrained(T::Unconstrained),\n}\n"
  },
  {
    "path": "rust-runtime/inlineable/src/ec2_query_errors.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_smithy_types::error::metadata::{Builder as ErrorMetadataBuilder, ErrorMetadata};\nuse aws_smithy_xml::decode::{try_data, Document, ScopedDecoder, XmlDecodeError};\n\n#[allow(unused)]\npub fn body_is_error(body: &[u8]) -> Result<bool, XmlDecodeError> {\n    let mut doc = Document::try_from(body)?;\n    let scoped = doc.root_element()?;\n    Ok(scoped.start_el().matches(\"Response\"))\n}\n\npub fn parse_error_metadata(body: &[u8]) -> Result<ErrorMetadataBuilder, XmlDecodeError> {\n    let mut doc = Document::try_from(body)?;\n    let mut root = doc.root_element()?;\n    let mut err_builder = ErrorMetadata::builder();\n    while let Some(mut tag) = root.next_tag() {\n        if tag.start_el().local() == \"Errors\" {\n            while let Some(mut error_tag) = tag.next_tag() {\n                if let \"Error\" = error_tag.start_el().local() {\n                    while let Some(mut error_field) = error_tag.next_tag() {\n                        match error_field.start_el().local() {\n                            \"Code\" => {\n                                err_builder = err_builder.code(try_data(&mut error_field)?);\n                            }\n                            \"Message\" => {\n                                err_builder = err_builder.message(try_data(&mut error_field)?);\n                            }\n                            _ => {}\n                        }\n                    }\n                }\n            }\n        }\n    }\n    Ok(err_builder)\n}\n\n#[allow(unused)]\npub fn error_scope<'a, 'b>(\n    doc: &'a mut Document<'b>,\n) -> Result<ScopedDecoder<'b, 'a>, XmlDecodeError> {\n    let root = doc\n        .next_start_element()\n        .ok_or_else(|| XmlDecodeError::custom(\"no root found searching for an Error\"))?;\n    if !root.matches(\"Response\") {\n        return Err(XmlDecodeError::custom(\"expected Response as root\"));\n    }\n\n    while let Some(el) = doc.next_start_element() {\n        if el.matches(\"Errors\") && el.depth() == 1 {\n            while let Some(el) = doc.next_start_element() {\n                if el.matches(\"Error\") && el.depth() == 2 {\n                    return Ok(doc.scoped_to(el));\n                }\n            }\n        }\n        // otherwise, ignore it\n    }\n    Err(XmlDecodeError::custom(\"no error found inside of response\"))\n}\n\n#[cfg(test)]\nmod test {\n    use super::{body_is_error, parse_error_metadata};\n    use crate::ec2_query_errors::error_scope;\n    use aws_smithy_xml::decode::Document;\n\n    #[test]\n    fn parse_wrapped_error() {\n        let xml = br#\"\n        <Response>\n            <Errors>\n                <Error>\n                    <Code>InvalidGreeting</Code>\n                    <Message>Hi</Message>\n                    <AnotherSetting>setting</AnotherSetting>\n                    <Ignore><This/></Ignore>\n                </Error>\n            </Errors>\n            <RequestId>foo-id</RequestId>\n        </Response>\n        \"#;\n        assert!(body_is_error(xml).unwrap());\n        let parsed = parse_error_metadata(xml).expect(\"valid xml\").build();\n        assert_eq!(parsed.message(), Some(\"Hi\"));\n        assert_eq!(parsed.code(), Some(\"InvalidGreeting\"));\n    }\n\n    #[test]\n    fn test_error_scope() {\n        let xml: &[u8] = br#\"\n        <Response>\n            <RequestId>foo-id</RequestId>\n            <MorePreamble>foo-id</RequestId>\n            <Sneaky><Error>These are not the errors you are looking for</Error></Sneaky>\n            <Errors>\n                <Sneaky><Error>These are not the errors you are looking for</Error></Sneaky>\n                <Error>\n                    <Code>InvalidGreeting</Code>\n                    <Message>Hi</Message>\n                    <AnotherSetting>setting</AnotherSetting>\n                    <Ignore><This/></Ignore>\n                </Error>\n            </Errors>\n            <RequestId>foo-id</RequestId>\n        </Response>\n        \"#;\n        let mut doc = Document::try_from(xml).expect(\"valid\");\n        let mut error = error_scope(&mut doc).expect(\"contains error\");\n        let mut keys = vec![];\n        while let Some(tag) = error.next_tag() {\n            keys.push(tag.start_el().local().to_owned());\n            // read this the full contents of this element\n        }\n        assert_eq!(keys, vec![\"Code\", \"Message\", \"AnotherSetting\", \"Ignore\"])\n    }\n}\n"
  },
  {
    "path": "rust-runtime/inlineable/src/endpoint_lib/arn.rs",
    "content": "/*\n *  Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n *  SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::endpoint_lib::diagnostic::DiagnosticCollector;\nuse std::borrow::Cow;\nuse std::error::Error;\nuse std::fmt::{Display, Formatter};\n\n#[derive(Debug, Eq, PartialEq, Clone)]\npub(crate) struct Arn<'a> {\n    partition: &'a str,\n    service: &'a str,\n    region: &'a str,\n    account_id: &'a str,\n    resource_id: Vec<&'a str>,\n}\n\n#[allow(unused)]\nimpl<'a> Arn<'a> {\n    pub(crate) fn partition(&self) -> &'a str {\n        self.partition\n    }\n    pub(crate) fn service(&self) -> &'a str {\n        self.service\n    }\n    pub(crate) fn region(&self) -> &'a str {\n        self.region\n    }\n    pub(crate) fn account_id(&self) -> &'a str {\n        self.account_id\n    }\n    pub(crate) fn resource_id(&self) -> &Vec<&'a str> {\n        &self.resource_id\n    }\n}\n\n#[derive(Debug, PartialEq)]\npub(crate) struct InvalidArn {\n    message: Cow<'static, str>,\n}\n\nimpl InvalidArn {\n    fn from_static(message: &'static str) -> InvalidArn {\n        Self {\n            message: Cow::Borrowed(message),\n        }\n    }\n}\nimpl Display for InvalidArn {\n    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {\n        write!(f, \"{}\", self.message)\n    }\n}\nimpl Error for InvalidArn {}\n\nimpl<'a> Arn<'a> {\n    pub(crate) fn parse(arn: &'a str) -> Result<Self, InvalidArn> {\n        let mut split = arn.splitn(6, ':');\n        let invalid_format =\n            || InvalidArn::from_static(\"ARN must have 6 components delimited by `:`\");\n        let arn = split.next().ok_or_else(invalid_format)?;\n        let partition = split.next().ok_or_else(invalid_format)?;\n        let service = split.next().ok_or_else(invalid_format)?;\n        let region = split.next().ok_or_else(invalid_format)?;\n        let account_id = split.next().ok_or_else(invalid_format)?;\n        let resource_id = split.next().ok_or_else(invalid_format)?;\n\n        if arn != \"arn\" {\n            return Err(InvalidArn::from_static(\n                \"first component of the ARN must be `arn`\",\n            ));\n        }\n        if partition.is_empty() || service.is_empty() || resource_id.is_empty() {\n            return Err(InvalidArn::from_static(\n                \"partition, service, and resource id must all be non-empty\",\n            ));\n        }\n\n        let resource_id = resource_id.split([':', '/']).collect::<Vec<_>>();\n        Ok(Self {\n            partition,\n            service,\n            region,\n            account_id,\n            resource_id,\n        })\n    }\n}\n\npub(crate) fn parse_arn<'a>(input: &'a str, e: &mut DiagnosticCollector) -> Option<Arn<'a>> {\n    e.capture(Arn::parse(input))\n}\n\n#[cfg(test)]\nmod test {\n    use super::Arn;\n\n    #[test]\n    fn arn_parser() {\n        let arn = \"arn:aws:s3:us-east-2:012345678:outpost:op-1234\";\n        let parsed = Arn::parse(arn).expect(\"valid ARN\");\n        assert_eq!(\n            parsed,\n            Arn {\n                partition: \"aws\",\n                service: \"s3\",\n                region: \"us-east-2\",\n                account_id: \"012345678\",\n                resource_id: vec![\"outpost\", \"op-1234\"]\n            }\n        );\n    }\n\n    #[test]\n    fn allow_slash_arns() {\n        let arn = \"arn:aws:s3:us-east-2:012345678:outpost/op-1234\";\n        let parsed = Arn::parse(arn).expect(\"valid ARN\");\n        assert_eq!(\n            parsed,\n            Arn {\n                partition: \"aws\",\n                service: \"s3\",\n                region: \"us-east-2\",\n                account_id: \"012345678\",\n                resource_id: vec![\"outpost\", \"op-1234\"]\n            }\n        );\n    }\n\n    #[test]\n    fn resource_id_must_be_nonempty() {\n        let arn = \"arn:aws:s3:us-east-2:012345678:\";\n        Arn::parse(arn).expect_err(\"empty resource\");\n    }\n\n    #[test]\n    fn arns_with_empty_parts() {\n        let arn = \"arn:aws:s3:::my_corporate_bucket/Development/*\";\n        assert_eq!(\n            Arn::parse(arn).expect(\"valid arn\"),\n            Arn {\n                partition: \"aws\",\n                service: \"s3\",\n                region: \"\",\n                account_id: \"\",\n                resource_id: vec![\"my_corporate_bucket\", \"Development\", \"*\"]\n            }\n        );\n    }\n}\n"
  },
  {
    "path": "rust-runtime/inlineable/src/endpoint_lib/bdd_interpreter.rs",
    "content": "/*\n *  Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n *  SPDX-License-Identifier: Apache-2.0\n */\n\n//TODO(bdd): Should this just be an [i32; 3]? Might make it easier to make things const?\n/// Binary Decision Diagram node representation\n#[derive(Debug, Clone, Copy)]\npub(crate) struct BddNode {\n    pub condition_index: i32,\n    pub high_ref: i32,\n    pub low_ref: i32,\n}\n\nconst RESULT_LIMIT: i32 = 100_000_000;\nconst TERMINAL_TRUE: i32 = 1;\nconst TERMINAL_FALSE: i32 = -1;\n\n/// Evaluates a BDD to resolve an endpoint result\n///\n/// Arguments\n/// * `nodes` - Array of BddNodes\n/// * `conditions` - Array of conditions referenced by nodes\n/// * `results` - Array of possible results\n/// * `root_ref` - Root reference to start evaluation\n/// * `params` - Parameters for condition evaluation\n/// * `context` - Values that can be set/mutated by the conditions\n/// * `diagnostic_collector` - a struct for collecting information about the execution of conditions\n/// * `condition_evaluator` - Function to evaluate individual conditions with params and context\n///\n/// Returns\n/// * `Some(R)` - Result if evaluation succeeds\n/// * `None` - No match found\n#[allow(clippy::too_many_arguments)]\npub(crate) fn evaluate_bdd<'a, Cond, Params, Res: Clone, Context>(\n    nodes: &[BddNode],\n    conditions: &[Cond],\n    results: &[Res],\n    root_ref: i32,\n    params: &'a Params,\n    context: &mut Context,\n    diagnostic_collector: &mut crate::endpoint_lib::diagnostic::DiagnosticCollector,\n    mut condition_evaluator: impl FnMut(\n        &Cond,\n        &'a Params,\n        &mut Context,\n        &mut crate::endpoint_lib::diagnostic::DiagnosticCollector,\n    ) -> bool,\n) -> Option<Res> {\n    let mut current_ref = root_ref;\n\n    loop {\n        match current_ref {\n            // Result references (>= 100_000_000)\n            ref_val if ref_val >= RESULT_LIMIT => {\n                let result_index = (ref_val - RESULT_LIMIT) as usize;\n                return results.get(result_index).cloned();\n            }\n            // Terminals (1 = TRUE, -1 = FALSE) NoMatchRule\n            TERMINAL_TRUE | TERMINAL_FALSE => return results.first().cloned(),\n            // Node references\n            ref_val => {\n                let is_complement = ref_val < 0;\n                let node_index = (ref_val.abs() - 1) as usize;\n                let node = nodes.get(node_index)?;\n                let condition_index = node.condition_index as usize;\n                let condition = conditions.get(condition_index)?;\n                let condition_result =\n                    condition_evaluator(condition, params, context, diagnostic_collector);\n                // Handle complement edges: complement inverts the branch selection\n                current_ref = if is_complement ^ condition_result {\n                    node.high_ref\n                } else {\n                    node.low_ref\n                };\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/inlineable/src/endpoint_lib/coalesce.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Coalesce function that returns the first non-None value.\n\n/*\n * Implementation Note: Autoderef Specialization\n *\n * This implementation uses autoderef specialization to dispatch to different\n * coalesce behaviors based on the types of the two arguments at compile time.\n *\n * The technique exploits Rust's method resolution, which automatically dereferences\n * types to find matching method implementations. Method resolution prefers implementations\n * that require fewer dereferences, creating a priority ordering.\n *\n * Three specialization levels (highest to lowest priority):\n *\n * 1. `&&&(&Option<T>, &Option<T>)` - Both args are Option\n *    Returns: Option<T> via a.or(b)\n *\n * 2. `&&(&Option<T>, &T)` - First arg is Option, second is concrete\n *    Returns: T via a.unwrap_or(b)\n *\n * 3. `&(&T, &U)` - Both args are concrete (or any other combination)\n *    Returns: T (always returns first arg)\n *\n * The macro call `(&&&(&a, &b)).coalesce()` starts with three references. Method resolution\n * tries each impl in order by dereferencing:\n * - First tries `&&&(&Option<T>, &Option<T>)` (no deref needed) - matches if both are Option\n * - Then tries `&&(&Option<T>, &T)` (one deref) - matches if first is Option, second isn't\n * - Finally tries `&(&T, &U)` (two derefs) - matches everything else\n *\n * This allows the macro to handle Option/non-Option combinations without runtime checks,\n * selecting the appropriate coalesce logic at compile time based on argument types.\n *\n * This approach was heavily inspired by this blog post: https://lukaskalbertodt.github.io/2019/12/05/generalized-autoref-based-specialization.html\n */\n\n/// Helper trait to implement the coalesce! macro\npub(crate) trait Coalesce {\n    /// The first arg\n    type Arg1;\n    /// The second arg\n    type Arg2;\n    /// The result of comparing Arg1 and Arg1\n    type Result;\n\n    /// Evaluates arguments in order and returns the first non-empty result, otherwise returns the result of the last argument.\n    fn coalesce(&self) -> fn(Self::Arg1, Self::Arg2) -> Self::Result;\n}\n\nimpl<T> Coalesce for &&&(&Option<T>, &Option<T>) {\n    type Arg1 = Option<T>;\n    type Arg2 = Option<T>;\n    type Result = Option<T>;\n\n    fn coalesce(&self) -> fn(Self::Arg1, Self::Arg2) -> Self::Result {\n        |a: Option<T>, b: Option<T>| a.or(b)\n    }\n}\n\nimpl<T> Coalesce for &&(&Option<T>, &T) {\n    type Arg1 = Option<T>;\n    type Arg2 = T;\n    type Result = T;\n\n    fn coalesce(&self) -> fn(Self::Arg1, Self::Arg2) -> Self::Result {\n        |a: Option<T>, b: T| a.unwrap_or(b)\n    }\n}\n\nimpl<T, U> Coalesce for &(&T, &U) {\n    type Arg1 = T;\n    type Arg2 = U;\n    type Result = T;\n\n    fn coalesce(&self) -> fn(Self::Arg1, Self::Arg2) -> Self::Result {\n        |a: T, _b| a\n    }\n}\n\n/// Evaluates arguments in order and returns the first non-empty result, otherwise returns the result of the last argument.\nmacro_rules! coalesce {\n    ($a:expr) => {$a};\n    ($a:expr, $b:expr) => {{\n        use crate::endpoint_lib::coalesce::Coalesce;\n        let a = $a;\n        let b = $b;\n        (&&&(&a, &b)).coalesce()(a, b)\n    }};\n    ($a:expr, $b:expr $(, $c:expr)* $(,)?) => {\n        $crate::endpoint_lib::coalesce::coalesce!($crate::endpoint_lib::coalesce::coalesce!($a, $b) $(, $c)*)\n    }\n}\n\npub(crate) use coalesce;\n\n#[cfg(test)]\nmod test {\n    use super::*;\n\n    #[test]\n    fn base_cases() {\n        // All types optional\n        let a = Some(\"a\");\n        let b = Some(\"b\");\n\n        assert_eq!(coalesce!(a, b), Some(\"a\"));\n\n        let a = None;\n        let b = Some(\"b\");\n\n        assert_eq!(coalesce!(a, b), Some(\"b\"));\n\n        let a = Some(\"a\");\n        let b = None;\n\n        assert_eq!(coalesce!(a, b), Some(\"a\"));\n\n        let a: Option<&str> = None;\n        let b: Option<&str> = None;\n\n        assert_eq!(coalesce!(a, b), None);\n\n        // Some non-optional types\n        let a = \"a\";\n        let b = Some(\"b\");\n\n        assert_eq!(coalesce!(a, b), \"a\");\n\n        let a = Some(\"a\");\n        let b = \"b\";\n\n        assert_eq!(coalesce!(a, b), \"a\");\n\n        let a = None;\n        let b = \"b\";\n\n        assert_eq!(coalesce!(a, b), \"b\");\n\n        let a = \"a\";\n        let b: Option<&str> = None;\n\n        assert_eq!(coalesce!(a, b), \"a\");\n\n        // All types non-optional\n        let a = \"a\";\n        let b = \"b\";\n\n        assert_eq!(coalesce!(a, b), \"a\");\n\n        // Works with trailing comma (makes codegen easier)\n        let a = \"a\";\n        let b = \"b\";\n\n        assert_eq!(coalesce!(a, b,), \"a\");\n    }\n\n    #[test]\n    fn longer_cases() {\n        assert_eq!(\n            coalesce!(None, None, None, None, None, None, None, None, None, None, \"a\"),\n            \"a\"\n        );\n\n        // In the generated code all of the inputs are typed variables, so the turbofish isn't needed in practice\n        assert_eq!(\n            coalesce!(\n                None,\n                None,\n                None,\n                None,\n                \"a\",\n                None::<&str>,\n                None::<&str>,\n                None::<&str>,\n                None::<&str>,\n                None::<&str>,\n                None::<&str>\n            ),\n            \"a\"\n        );\n\n        assert_eq!(\n            coalesce!(\n                None,\n                None,\n                None,\n                None,\n                \"a\",\n                None::<&str>,\n                Some(\"b\"),\n                None::<&str>,\n                None::<&str>,\n                None::<&str>,\n                \"c\"\n            ),\n            \"a\"\n        );\n\n        assert_eq!(\n            coalesce!(\n                None,\n                None,\n                None,\n                Some(\"a\"),\n                None,\n                None,\n                None,\n                None,\n                None,\n                None,\n                \"b\"\n            ),\n            \"a\"\n        );\n        assert_eq!(\n            coalesce!(\n                Some(\"a\"),\n                None,\n                None,\n                Some(\"b\"),\n                None,\n                None,\n                None,\n                None,\n                None,\n                None,\n            ),\n            Some(\"a\")\n        );\n\n        assert_eq!(coalesce!(\"a\", \"b\", \"c\", \"d\", \"e\", \"f\", \"g\",), \"a\");\n\n        assert_eq!(\n            coalesce!(\n                None,\n                None,\n                None,\n                None,\n                None,\n                None,\n                None,\n                None,\n                None,\n                None::<&str>,\n            ),\n            None\n        );\n    }\n}\n"
  },
  {
    "path": "rust-runtime/inlineable/src/endpoint_lib/diagnostic.rs",
    "content": "/*\n *  Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n *  SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::error::Error;\n\n/// Diagnostic collector for endpoint resolution\n///\n/// Endpoint functions return `Option<T>`—to enable diagnostic information to flow, we capture the\n/// last error that occurred.\n#[derive(Debug, Default)]\npub(crate) struct DiagnosticCollector {\n    last_error: Option<Box<dyn Error + Send + Sync>>,\n}\n\nimpl DiagnosticCollector {\n    #[allow(unused)]\n    /// Report an error to the collector\n    pub(crate) fn report_error(&mut self, err: impl Into<Box<dyn Error + Send + Sync>>) {\n        self.last_error = Some(err.into());\n    }\n\n    #[allow(unused)]\n    /// Capture a result, returning Some(t) when the input was `Ok` and `None` otherwise\n    pub(crate) fn capture<T, E: Into<Box<dyn Error + Send + Sync>>>(\n        &mut self,\n        err: Result<T, E>,\n    ) -> Option<T> {\n        match err {\n            Ok(res) => Some(res),\n            Err(e) => {\n                self.report_error(e);\n                None\n            }\n        }\n    }\n\n    #[allow(dead_code)]\n    pub(crate) fn take_last_error(&mut self) -> Option<Box<dyn Error + Send + Sync>> {\n        self.last_error.take()\n    }\n\n    /// Create a new diagnostic collector\n    pub(crate) fn new() -> Self {\n        Self { last_error: None }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/inlineable/src/endpoint_lib/host.rs",
    "content": "/*\n *  Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n *  SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::endpoint_lib::diagnostic::DiagnosticCollector;\n\npub(crate) fn is_valid_host_label(\n    label: &str,\n    allow_dots: bool,\n    e: &mut DiagnosticCollector,\n) -> bool {\n    if allow_dots {\n        for part in label.split('.') {\n            if !is_valid_host_label(part, false, e) {\n                return false;\n            }\n        }\n        true\n    } else {\n        if label.is_empty() || label.len() > 63 {\n            e.report_error(\"host was too short or too long\");\n            return false;\n        }\n        label.chars().enumerate().all(|(idx, ch)| match (ch, idx) {\n            ('-', 0) => {\n                e.report_error(\"cannot start with `-`\");\n                false\n            }\n            _ => ch.is_alphanumeric() || ch == '-',\n        })\n    }\n}\n\n#[cfg(all(test, feature = \"gated-tests\"))]\nmod test {\n    use proptest::proptest;\n\n    fn is_valid_host_label(label: &str, allow_dots: bool) -> bool {\n        super::is_valid_host_label(label, allow_dots, &mut DiagnosticCollector::new())\n    }\n\n    #[allow(clippy::bool_assert_comparison)]\n    #[test]\n    fn basic_cases() {\n        assert_eq!(is_valid_host_label(\"\", false), false);\n        assert_eq!(is_valid_host_label(\"\", true), false);\n        assert_eq!(is_valid_host_label(\".\", true), false);\n        assert_eq!(is_valid_host_label(\"a.b\", true), true);\n        assert_eq!(is_valid_host_label(\"a.b\", false), false);\n        assert_eq!(is_valid_host_label(\"a.b.\", true), false);\n        assert_eq!(is_valid_host_label(\"a.b.c\", true), true);\n        assert_eq!(is_valid_host_label(\"a_b\", true), false);\n        assert_eq!(is_valid_host_label(&\"a\".repeat(64), false), false);\n        assert_eq!(\n            is_valid_host_label(&format!(\"{}.{}\", \"a\".repeat(63), \"a\".repeat(63)), true),\n            true\n        );\n    }\n\n    #[allow(clippy::bool_assert_comparison)]\n    #[test]\n    fn start_bounds() {\n        assert_eq!(is_valid_host_label(\"-foo\", false), false);\n        assert_eq!(is_valid_host_label(\"-foo\", true), false);\n        assert_eq!(is_valid_host_label(\".foo\", true), false);\n        assert_eq!(is_valid_host_label(\"a-b.foo\", true), true);\n    }\n\n    use crate::endpoint_lib::diagnostic::DiagnosticCollector;\n    use proptest::prelude::*;\n    proptest! {\n        #[test]\n        fn no_panics(s in any::<String>(), dots in any::<bool>()) {\n            is_valid_host_label(&s, dots);\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/inlineable/src/endpoint_lib/ite.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! if-then-else (ite) function that takes in a bool and two (portentially optional)\n//! values, choosing which one of those values to return based on the value\n//! of the bool.\n\n// Implementation Note: ite uses the same autoderef specialization trick as the coalesce\n// macro. You can read more about how it works in the block comment above that macro.\n\n/// Helper trait to implement the ite! macro\npub(crate) trait Ite {\n    /// The first arg\n    type Arg1;\n    /// The second arg\n    type Arg2;\n    /// The result type\n    type Result;\n\n    /// Evaluates arguments, returns Arg1 if the boolean is true, and Arg2 if it is false\n    fn ite(&self) -> fn(&bool, Self::Arg1, Self::Arg2) -> Self::Result;\n}\n\nimpl<T> Ite for &&&&(&Option<T>, &Option<T>) {\n    type Arg1 = Option<T>;\n    type Arg2 = Option<T>;\n    type Result = Option<T>;\n\n    fn ite(&self) -> fn(&bool, Self::Arg1, Self::Arg2) -> Self::Result {\n        |b: &bool, true_val: Option<T>, false_val: Option<T>| {\n            if *b {\n                true_val\n            } else {\n                false_val\n            }\n        }\n    }\n}\n\nimpl<T> Ite for &&&(&Option<T>, &T) {\n    type Arg1 = Option<T>;\n    type Arg2 = T;\n    type Result = Option<T>;\n\n    fn ite(&self) -> fn(&bool, Self::Arg1, Self::Arg2) -> Self::Result {\n        |b: &bool, true_val: Option<T>, false_val: T| {\n            if *b {\n                true_val\n            } else {\n                Some(false_val)\n            }\n        }\n    }\n}\n\nimpl<T> Ite for &&(&T, &Option<T>) {\n    type Arg1 = T;\n    type Arg2 = Option<T>;\n    type Result = Option<T>;\n\n    fn ite(&self) -> fn(&bool, Self::Arg1, Self::Arg2) -> Self::Result {\n        |b: &bool, true_val: T, false_val: Option<T>| {\n            if *b {\n                Some(true_val)\n            } else {\n                false_val\n            }\n        }\n    }\n}\n\nimpl<T> Ite for &(&T, &T) {\n    type Arg1 = T;\n    type Arg2 = T;\n    type Result = T;\n\n    fn ite(&self) -> fn(&bool, Self::Arg1, Self::Arg2) -> Self::Result {\n        |b: &bool, true_val: T, false_val: T| {\n            if *b {\n                true_val\n            } else {\n                false_val\n            }\n        }\n    }\n}\n\nmacro_rules! ite {\n    ($b:expr, $true_val:expr, $false_val:expr) => {{\n        use crate::endpoint_lib::ite::Ite;\n        let b = $b;\n        let true_val = $true_val;\n        let false_val = $false_val;\n        (&&&&(&true_val, &false_val)).ite()(&b, true_val, false_val)\n    }};\n}\n\npub(crate) use ite;\n\n#[cfg(test)]\nmod test {\n    use super::*;\n\n    #[test]\n    fn base_cases() {\n        // All types optional\n        let a = \"a\";\n        let some_a = Some(\"a\");\n        let b = \"b\";\n        let some_b = Some(\"b\");\n        let none: Option<&str> = None;\n\n        // Option, Option\n        assert_eq!(ite!(true, some_a, some_b), Some(\"a\"));\n        assert_eq!(ite!(false, some_a, some_b), Some(\"b\"));\n        assert_eq!(ite!(false, some_a, none), None);\n        assert_eq!(ite!(true, some_a, none), Some(\"a\"));\n\n        // Option, Value\n        assert_eq!(ite!(true, some_a, b), Some(\"a\"));\n        assert_eq!(ite!(false, some_a, b), Some(\"b\"));\n        assert_eq!(ite!(true, none, b), None);\n        assert_eq!(ite!(false, none, b), Some(\"b\"));\n\n        // Value, Option\n        assert_eq!(ite!(true, a, some_b), Some(\"a\"));\n        assert_eq!(ite!(false, a, some_b), Some(\"b\"));\n        assert_eq!(ite!(false, a, none), None);\n        assert_eq!(ite!(true, a, none), Some(\"a\"));\n\n        // Value, Value\n        assert_eq!(ite!(true, a, b), \"a\");\n        assert_eq!(ite!(false, a, b), \"b\");\n    }\n}\n"
  },
  {
    "path": "rust-runtime/inlineable/src/endpoint_lib/parse_url.rs",
    "content": "/*\n *  Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n *  SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::endpoint_lib::diagnostic::DiagnosticCollector;\nuse http_1x::Uri;\nuse url::{Host, Url as ParsedUrl};\n\n#[derive(PartialEq, Debug, Clone)]\npub(crate) struct Url<'a> {\n    uri: Uri,\n    url: ParsedUrl,\n    raw: &'a str,\n}\n\n// individual methods on parse_url might not be used (although the [`parse_url`] itself _MUST_ be used\n// since stdlib functions are pulled into crate lazily)\n#[allow(unused)]\nimpl Url<'_> {\n    pub(crate) fn is_ip(&self) -> bool {\n        matches!(self.url.host(), Some(Host::Ipv4(_) | Host::Ipv6(_)))\n    }\n    pub(crate) fn scheme(&self) -> &str {\n        self.url.scheme()\n    }\n\n    pub(crate) fn authority(&self) -> &str {\n        self.uri.authority().unwrap().as_str()\n    }\n\n    pub(crate) fn normalized_path(&self) -> &str {\n        match self.uri.path() {\n            path if !path.is_empty() => path,\n            _ => \"/\",\n        }\n    }\n\n    pub(crate) fn path(&self) -> &str {\n        if self.uri.path() == \"/\" && !self.raw.ends_with('/') {\n            \"\"\n        } else {\n            self.uri.path()\n        }\n    }\n}\n\npub(crate) fn parse_url<'a>(url: &'a str, e: &mut DiagnosticCollector) -> Option<Url<'a>> {\n    let raw = url;\n    let uri: Uri = e.capture(url.parse())?;\n    let url: ParsedUrl = e.capture(url.parse())?;\n    if let Some(query) = uri.query() {\n        e.report_error(format!(\"URL cannot have a query component (found {query})\"));\n        return None;\n    }\n    if ![\"http\", \"https\"].contains(&url.scheme()) {\n        e.report_error(format!(\n            \"URL scheme must be HTTP or HTTPS (found {})\",\n            url.scheme()\n        ));\n        return None;\n    }\n    Some(Url { url, uri, raw })\n}\n\n#[cfg(test)]\nmod test {\n    use super::*;\n    use crate::endpoint_lib::diagnostic::DiagnosticCollector;\n\n    #[allow(clippy::bool_assert_comparison)]\n    #[test]\n    fn parse_simple_url() {\n        let url = \"https://control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com\";\n        let url = parse_url(url, &mut DiagnosticCollector::new()).expect(\"valid url\");\n        assert_eq!(url.path(), \"\");\n        assert_eq!(url.normalized_path(), \"/\");\n        assert_eq!(url.is_ip(), false);\n        assert_eq!(url.scheme(), \"https\");\n        assert_eq!(\n            url.authority(),\n            \"control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com\"\n        );\n    }\n\n    #[test]\n    fn schemes_are_normalized() {\n        let url = \"HTTPS://control.vpce-1a2b3c4d-5e6f.s3.us-west-2.vpce.amazonaws.com\";\n        let url = parse_url(url, &mut DiagnosticCollector::new()).expect(\"valid url\");\n        assert_eq!(url.scheme(), \"https\");\n    }\n\n    #[allow(clippy::bool_assert_comparison)]\n    #[test]\n    fn parse_url_with_port() {\n        let url = \"http://localhost:8000/path\";\n        let url = parse_url(url, &mut DiagnosticCollector::new()).expect(\"valid url\");\n        assert_eq!(url.path(), \"/path\");\n        assert_eq!(url.normalized_path(), \"/path\");\n        assert_eq!(url.is_ip(), false);\n        assert_eq!(url.scheme(), \"http\");\n        assert_eq!(url.authority(), \"localhost:8000\");\n    }\n\n    #[test]\n    fn only_http_https_supported() {\n        let url = \"wss://localhost:8443/path\";\n        assert_eq!(parse_url(url, &mut DiagnosticCollector::new()), None);\n    }\n}\n"
  },
  {
    "path": "rust-runtime/inlineable/src/endpoint_lib/partition.rs",
    "content": "/*\n *  Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n *  SPDX-License-Identifier: Apache-2.0\n */\n\n//! Partition function to determine a partition for a given region\n//!\n//! This function supports adding regions dynamically, parsing a JSON file, and builder construction.\n//!\n//! If, at a future point, this interface stabilizes it is a good candidate for extraction into a\n//! shared crate.\nuse crate::endpoint_lib::diagnostic::DiagnosticCollector;\nuse crate::endpoint_lib::partition::deser::deserialize_partitions;\nuse aws_smithy_json::deserialize::error::DeserializeError;\nuse regex_lite::Regex;\nuse std::borrow::Cow;\nuse std::collections::HashMap;\n\n/// Determine the AWS partition metadata for a given region\n#[derive(Clone, Debug, Default)]\npub(crate) struct PartitionResolver {\n    partitions: Vec<PartitionMetadata>,\n}\n\nimpl PartitionResolver {\n    pub(crate) fn from_partitions(partitions: Vec<PartitionMetadata>) -> Self {\n        Self { partitions }\n    }\n}\n\n/// Partition result returned from partition resolver\n#[derive(Debug, Clone)]\npub(crate) struct Partition<'a> {\n    name: &'a str,\n    dns_suffix: &'a str,\n    dual_stack_dns_suffix: &'a str,\n    supports_fips: bool,\n    supports_dual_stack: bool,\n    implicit_global_region: &'a str,\n}\n\n#[allow(unused)]\nimpl Partition<'_> {\n    pub(crate) fn name(&self) -> &str {\n        self.name\n    }\n\n    pub(crate) fn dns_suffix(&self) -> &str {\n        self.dns_suffix\n    }\n\n    pub(crate) fn supports_fips(&self) -> bool {\n        self.supports_fips\n    }\n\n    pub(crate) fn dual_stack_dns_suffix(&self) -> &str {\n        self.dual_stack_dns_suffix\n    }\n\n    pub(crate) fn supports_dual_stack(&self) -> bool {\n        self.supports_dual_stack\n    }\n\n    pub(crate) fn implicit_global_region(&self) -> &str {\n        self.implicit_global_region\n    }\n}\n\nstatic DEFAULT_OVERRIDE: &PartitionOutputOverride = &PartitionOutputOverride {\n    name: None,\n    dns_suffix: None,\n    dual_stack_dns_suffix: None,\n    supports_fips: None,\n    supports_dual_stack: None,\n    implicit_global_region: None,\n};\n\n/// Merge the base output and the override output, dealing with `Cow`s\nmacro_rules! merge {\n    ($base: expr, $output: expr, $field: ident) => {\n        $output\n            .$field\n            .as_ref()\n            .map(|s| s.as_ref())\n            .unwrap_or($base.outputs.$field.as_ref())\n    };\n}\n\nimpl PartitionResolver {\n    #[allow(unused)]\n    pub(crate) fn empty() -> PartitionResolver {\n        PartitionResolver { partitions: vec![] }\n    }\n\n    #[allow(unused)]\n    pub(crate) fn add_partition(&mut self, partition: PartitionMetadata) {\n        self.partitions.push(partition);\n    }\n\n    pub(crate) fn new_from_json(\n        partition_dot_json: &[u8],\n    ) -> Result<PartitionResolver, DeserializeError> {\n        deserialize_partitions(partition_dot_json)\n    }\n\n    /// Resolve a partition for a given region\n    ///\n    /// 1. Enumerate each partition in the `partitions` array, and determine if the identifier to be\n    ///    resolved matches an explicit region listed in the `regions` array for a given partition.\n    ///    If identifier matches, proceed to step 4, otherwise continue to step 2.\n    /// 2. Enumerate each partition in the `partitions` array, use the regular expression\n    ///    `regionRegex` to determine if the identifier matches the regular expression. If the\n    ///    identifier matches, proceed to step 4, otherwise continue to step 3.\n    /// 3. If no partition is matched after exhausting step 1 and step 2, then fallback to matching\n    ///    the identifier to the partition where `id == \"aws\"`, and proceed to step 4. If no `aws`\n    ///    partition is present, return `None`.\n    /// 4. After matching the identifier to a partition using one of the previous steps, the partition function should return a\n    ///    typed data structure containing the fields in `outputs` in the matched partition. **Important:** If a specific region\n    ///    was matched, the properties associated with that region **MUST** be merged with the `outputs` field.\n    pub(crate) fn resolve_partition(\n        &self,\n        region: &str,\n        e: &mut DiagnosticCollector,\n    ) -> Option<Partition<'_>> {\n        let mut explicit_match_partition = self\n            .partitions\n            .iter()\n            .flat_map(|part| part.explicit_match(region));\n        let mut regex_match_partition = self\n            .partitions\n            .iter()\n            .flat_map(|part| part.regex_match(region));\n\n        let (base, region_override) = explicit_match_partition\n            .next()\n            .or_else(|| regex_match_partition.next())\n            .or_else(|| match self.partitions.iter().find(|p| p.id == \"aws\") {\n                Some(partition) => Some((partition, None)),\n                None => {\n                    e.report_error(\"no AWS partition!\");\n                    None\n                }\n            })?;\n        let region_override = region_override.as_ref().unwrap_or(&DEFAULT_OVERRIDE);\n        Some(Partition {\n            name: merge!(base, region_override, name),\n            dns_suffix: merge!(base, region_override, dns_suffix),\n            dual_stack_dns_suffix: merge!(base, region_override, dual_stack_dns_suffix),\n            supports_fips: region_override\n                .supports_fips\n                .unwrap_or(base.outputs.supports_fips),\n            supports_dual_stack: region_override\n                .supports_dual_stack\n                .unwrap_or(base.outputs.supports_dual_stack),\n            implicit_global_region: merge!(base, region_override, implicit_global_region),\n        })\n    }\n}\n\ntype Str = Cow<'static, str>;\n\n#[derive(Clone, Debug)]\npub(crate) struct PartitionMetadata {\n    id: Str,\n    region_regex: Regex,\n    regions: HashMap<Str, PartitionOutputOverride>,\n    outputs: PartitionOutput,\n}\n\n#[derive(Default)]\npub(crate) struct PartitionMetadataBuilder {\n    pub(crate) id: Option<Str>,\n    pub(crate) region_regex: Option<Regex>,\n    pub(crate) regions: HashMap<Str, PartitionOutputOverride>,\n    pub(crate) outputs: Option<PartitionOutputOverride>,\n}\n\nimpl PartitionMetadataBuilder {\n    pub(crate) fn build(self) -> PartitionMetadata {\n        PartitionMetadata {\n            id: self.id.expect(\"id must be defined\"),\n            region_regex: self.region_regex.expect(\"region regex must be defined\"),\n            regions: self.regions,\n            outputs: self\n                .outputs\n                .expect(\"outputs must be defined\")\n                .into_partition_output()\n                .expect(\"missing fields on outputs\"),\n        }\n    }\n}\n\nimpl PartitionMetadata {\n    fn explicit_match(\n        &self,\n        region: &str,\n    ) -> Option<(&PartitionMetadata, Option<&PartitionOutputOverride>)> {\n        self.regions\n            .get(region)\n            .map(|output_override| (self, Some(output_override)))\n    }\n\n    fn regex_match(\n        &self,\n        region: &str,\n    ) -> Option<(&PartitionMetadata, Option<&PartitionOutputOverride>)> {\n        if self.region_regex.is_match(region) {\n            Some((self, None))\n        } else {\n            None\n        }\n    }\n}\n\n#[derive(Clone, Debug)]\npub(crate) struct PartitionOutput {\n    name: Str,\n    dns_suffix: Str,\n    dual_stack_dns_suffix: Str,\n    supports_fips: bool,\n    supports_dual_stack: bool,\n    implicit_global_region: Str,\n}\n\n#[derive(Clone, Debug, Default)]\npub(crate) struct PartitionOutputOverride {\n    name: Option<Str>,\n    dns_suffix: Option<Str>,\n    dual_stack_dns_suffix: Option<Str>,\n    supports_fips: Option<bool>,\n    supports_dual_stack: Option<bool>,\n    implicit_global_region: Option<Str>,\n}\n\nimpl PartitionOutputOverride {\n    pub(crate) fn into_partition_output(\n        self,\n    ) -> Result<PartitionOutput, Box<dyn std::error::Error>> {\n        Ok(PartitionOutput {\n            name: self.name.ok_or(\"missing name\")?,\n            dns_suffix: self.dns_suffix.ok_or(\"missing dnsSuffix\")?,\n            dual_stack_dns_suffix: self\n                .dual_stack_dns_suffix\n                .ok_or(\"missing dual_stackDnsSuffix\")?,\n            supports_fips: self.supports_fips.ok_or(\"missing supports fips\")?,\n            supports_dual_stack: self\n                .supports_dual_stack\n                .ok_or(\"missing supportsDualstack\")?,\n            implicit_global_region: self\n                .implicit_global_region\n                .ok_or(\"missing implicitGlobalRegion\")?,\n        })\n    }\n}\n\n/// JSON deserializers for partition metadata\n///\n/// This code was generated by smithy-rs and then hand edited for clarity\nmod deser {\n    use crate::endpoint_lib::partition::{\n        PartitionMetadata, PartitionMetadataBuilder, PartitionOutputOverride, PartitionResolver,\n    };\n    use aws_smithy_json::deserialize::token::{\n        expect_bool_or_null, expect_start_object, expect_string_or_null, skip_value,\n    };\n    use aws_smithy_json::deserialize::{error::DeserializeError, json_token_iter, Token};\n    use regex_lite::Regex;\n    use std::borrow::Cow;\n    use std::collections::HashMap;\n\n    pub(crate) fn deserialize_partitions(\n        value: &[u8],\n    ) -> Result<PartitionResolver, DeserializeError> {\n        let mut tokens_owned = json_token_iter(value).peekable();\n        let tokens = &mut tokens_owned;\n        expect_start_object(tokens.next())?;\n        let mut resolver = None;\n        loop {\n            match tokens.next().transpose()? {\n                Some(Token::EndObject { .. }) => break,\n                Some(Token::ObjectKey { key, .. }) => match key.to_unescaped()?.as_ref() {\n                    \"partitions\" => {\n                        resolver = Some(PartitionResolver::from_partitions(deser_partitions(\n                            tokens,\n                        )?));\n                    }\n                    _ => skip_value(tokens)?,\n                },\n                other => {\n                    return Err(DeserializeError::custom(format!(\n                        \"expected object key or end object, found: {other:?}\",\n                    )))\n                }\n            }\n        }\n        if tokens.next().is_some() {\n            return Err(DeserializeError::custom(\n                \"found more JSON tokens after completing parsing\",\n            ));\n        }\n        resolver.ok_or_else(|| DeserializeError::custom(\"did not find partitions array\"))\n    }\n\n    fn deser_partitions<'a, I>(\n        tokens: &mut std::iter::Peekable<I>,\n    ) -> Result<Vec<PartitionMetadata>, DeserializeError>\n    where\n        I: Iterator<Item = Result<Token<'a>, DeserializeError>>,\n    {\n        match tokens.next().transpose()? {\n            Some(Token::StartArray { .. }) => {\n                let mut items = Vec::new();\n                loop {\n                    match tokens.peek() {\n                        Some(Ok(Token::EndArray { .. })) => {\n                            tokens.next().transpose().unwrap();\n                            break;\n                        }\n                        _ => {\n                            items.push(deser_partition(tokens)?);\n                        }\n                    }\n                }\n                Ok(items)\n            }\n            _ => Err(DeserializeError::custom(\"expected start array\")),\n        }\n    }\n\n    pub(crate) fn deser_partition<'a, I>(\n        tokens: &mut std::iter::Peekable<I>,\n    ) -> Result<PartitionMetadata, DeserializeError>\n    where\n        I: Iterator<Item = Result<Token<'a>, DeserializeError>>,\n    {\n        match tokens.next().transpose()? {\n            Some(Token::StartObject { .. }) => {\n                let mut builder = PartitionMetadataBuilder::default();\n                loop {\n                    match tokens.next().transpose()? {\n                        Some(Token::EndObject { .. }) => break,\n                        Some(Token::ObjectKey { key, .. }) => match key.to_unescaped()?.as_ref() {\n                            \"id\" => {\n                                builder.id = token_to_str(tokens.next())?;\n                            }\n                            \"regionRegex\" => {\n                                builder.region_regex = token_to_str(tokens.next())?\n                                    .map(|region_regex| Regex::new(&region_regex))\n                                    .transpose()\n                                    .map_err(|_e| DeserializeError::custom(\"invalid regex\"))?;\n                            }\n                            \"regions\" => {\n                                builder.regions = deser_explicit_regions(tokens)?;\n                            }\n                            \"outputs\" => {\n                                builder.outputs = deser_outputs(tokens)?;\n                            }\n                            _ => skip_value(tokens)?,\n                        },\n                        other => {\n                            return Err(DeserializeError::custom(format!(\n                                \"expected object key or end object, found: {other:?}\"\n                            )))\n                        }\n                    }\n                }\n                Ok(builder.build())\n            }\n            _ => Err(DeserializeError::custom(\"expected start object\")),\n        }\n    }\n\n    #[allow(clippy::type_complexity, non_snake_case)]\n    pub(crate) fn deser_explicit_regions<'a, I>(\n        tokens: &mut std::iter::Peekable<I>,\n    ) -> Result<HashMap<super::Str, PartitionOutputOverride>, DeserializeError>\n    where\n        I: Iterator<Item = Result<Token<'a>, DeserializeError>>,\n    {\n        match tokens.next().transpose()? {\n            Some(Token::StartObject { .. }) => {\n                let mut map = HashMap::new();\n                loop {\n                    match tokens.next().transpose()? {\n                        Some(Token::EndObject { .. }) => break,\n                        Some(Token::ObjectKey { key, .. }) => {\n                            let key = key.to_unescaped().map(|u| u.into_owned())?;\n                            let value = deser_outputs(tokens)?;\n                            if let Some(value) = value {\n                                map.insert(key.into(), value);\n                            }\n                        }\n                        other => {\n                            return Err(DeserializeError::custom(format!(\n                                \"expected object key or end object, found: {other:?}\"\n                            )))\n                        }\n                    }\n                }\n                Ok(map)\n            }\n            _ => Err(DeserializeError::custom(\"expected start object\")),\n        }\n    }\n\n    /// Convert a token to `Str` (a potentially static String)\n    fn token_to_str(\n        token: Option<Result<Token, DeserializeError>>,\n    ) -> Result<Option<super::Str>, DeserializeError> {\n        Ok(expect_string_or_null(token)?\n            .map(|s| s.to_unescaped().map(|u| u.into_owned()))\n            .transpose()?\n            .map(Cow::Owned))\n    }\n\n    fn deser_outputs<'a, I>(\n        tokens: &mut std::iter::Peekable<I>,\n    ) -> Result<Option<PartitionOutputOverride>, DeserializeError>\n    where\n        I: Iterator<Item = Result<Token<'a>, DeserializeError>>,\n    {\n        match tokens.next().transpose()? {\n            Some(Token::StartObject { .. }) => {\n                #[allow(unused_mut)]\n                let mut builder = PartitionOutputOverride::default();\n                loop {\n                    match tokens.next().transpose()? {\n                        Some(Token::EndObject { .. }) => break,\n                        Some(Token::ObjectKey { key, .. }) => match key.to_unescaped()?.as_ref() {\n                            \"name\" => {\n                                builder.name = token_to_str(tokens.next())?;\n                            }\n                            \"dnsSuffix\" => {\n                                builder.dns_suffix = token_to_str(tokens.next())?;\n                            }\n                            \"dualStackDnsSuffix\" => {\n                                builder.dual_stack_dns_suffix = token_to_str(tokens.next())?;\n                            }\n                            \"supportsFIPS\" => {\n                                builder.supports_fips = expect_bool_or_null(tokens.next())?;\n                            }\n                            \"supportsDualStack\" => {\n                                builder.supports_dual_stack = expect_bool_or_null(tokens.next())?;\n                            }\n                            \"implicitGlobalRegion\" => {\n                                builder.implicit_global_region = token_to_str(tokens.next())?;\n                            }\n                            _ => skip_value(tokens)?,\n                        },\n                        other => {\n                            return Err(DeserializeError::custom(format!(\n                                \"expected object key or end object, found: {other:?}\",\n                            )))\n                        }\n                    }\n                }\n                Ok(Some(builder))\n            }\n            _ => Err(DeserializeError::custom(\"expected start object\")),\n        }\n    }\n}\n\n#[cfg(test)]\nmod test {\n    use crate::endpoint_lib::diagnostic::DiagnosticCollector;\n    use crate::endpoint_lib::partition::{\n        Partition, PartitionMetadata, PartitionOutput, PartitionOutputOverride, PartitionResolver,\n    };\n    use regex_lite::Regex;\n    use std::collections::HashMap;\n\n    fn resolve<'a>(resolver: &'a PartitionResolver, region: &str) -> Partition<'a> {\n        resolver\n            .resolve_partition(region, &mut DiagnosticCollector::new())\n            .expect(\"could not resolve partition\")\n    }\n\n    #[test]\n    fn deserialize_partitions() {\n        let partitions = r#\"{\n  \"version\": \"1.1\",\n  \"partitions\": [\n    {\n      \"id\": \"aws\",\n      \"regionRegex\": \"^(us|eu|ap|sa|ca|me|af)-\\\\w+-\\\\d+$\",\n      \"regions\": {\n        \"af-south-1\": {},\n        \"af-east-1\": {},\n        \"ap-northeast-1\": {},\n        \"ap-northeast-2\": {},\n        \"ap-northeast-3\": {},\n        \"ap-south-1\": {},\n        \"ap-southeast-1\": {},\n        \"ap-southeast-2\": {},\n        \"ap-southeast-3\": {},\n        \"ca-central-1\": {},\n        \"eu-central-1\": {},\n        \"eu-north-1\": {},\n        \"eu-south-1\": {},\n        \"eu-west-1\": {},\n        \"eu-west-2\": {},\n        \"eu-west-3\": {},\n        \"me-south-1\": {},\n        \"sa-east-1\": {},\n        \"us-east-1\": {},\n        \"us-east-2\": {},\n        \"us-west-1\": {},\n        \"us-west-2\": {},\n        \"aws-global\": {}\n      },\n      \"outputs\": {\n        \"name\": \"aws\",\n        \"dnsSuffix\": \"amazonaws.com\",\n        \"dualStackDnsSuffix\": \"api.aws\",\n        \"supportsFIPS\": true,\n        \"supportsDualStack\": true,\n        \"implicitGlobalRegion\": \"us-east-1\"\n      }\n    },\n    {\n      \"id\": \"aws-us-gov\",\n      \"regionRegex\": \"^us\\\\-gov\\\\-\\\\w+\\\\-\\\\d+$\",\n      \"regions\": {\n        \"us-gov-west-1\": {},\n        \"us-gov-east-1\": {},\n        \"aws-us-gov-global\": {}\n      },\n      \"outputs\": {\n        \"name\": \"aws-us-gov\",\n        \"dnsSuffix\": \"amazonaws.com\",\n        \"dualStackDnsSuffix\": \"api.aws\",\n        \"supportsFIPS\": true,\n        \"supportsDualStack\": true,\n        \"implicitGlobalRegion\": \"us-gov-east-1\"\n      }\n    },\n    {\n      \"id\": \"aws-cn\",\n      \"regionRegex\": \"^cn\\\\-\\\\w+\\\\-\\\\d+$\",\n      \"regions\": {\n        \"cn-north-1\": {},\n        \"cn-northwest-1\": {},\n        \"aws-cn-global\": {}\n      },\n      \"outputs\": {\n        \"name\": \"aws-cn\",\n        \"dnsSuffix\": \"amazonaws.com.cn\",\n        \"dualStackDnsSuffix\": \"api.amazonwebservices.com.cn\",\n        \"supportsFIPS\": true,\n        \"supportsDualStack\": true,\n        \"implicitGlobalRegion\": \"cn-north-1\"\n      }\n    },\n    {\n      \"id\": \"aws-iso\",\n      \"regionRegex\": \"^us\\\\-iso\\\\-\\\\w+\\\\-\\\\d+$\",\n      \"outputs\": {\n        \"name\": \"aws-iso\",\n        \"dnsSuffix\": \"c2s.ic.gov\",\n        \"supportsFIPS\": true,\n        \"supportsDualStack\": false,\n        \"dualStackDnsSuffix\": \"c2s.ic.gov\",\n        \"implicitGlobalRegion\": \"us-iso-foo-1\"\n      },\n      \"regions\": {}\n    },\n    {\n      \"id\": \"aws-iso-b\",\n      \"regionRegex\": \"^us\\\\-isob\\\\-\\\\w+\\\\-\\\\d+$\",\n      \"outputs\": {\n        \"name\": \"aws-iso-b\",\n        \"dnsSuffix\": \"sc2s.sgov.gov\",\n        \"supportsFIPS\": true,\n        \"supportsDualStack\": false,\n        \"dualStackDnsSuffix\": \"sc2s.sgov.gov\",\n        \"implicitGlobalRegion\": \"us-isob-foo-1\"\n      },\n      \"regions\": {}\n    }\n  ]\n}\"#;\n        let resolver =\n            super::deser::deserialize_partitions(partitions.as_bytes()).expect(\"valid resolver\");\n        assert_eq!(resolve(&resolver, \"cn-north-1\").name, \"aws-cn\");\n        assert_eq!(\n            resolve(&resolver, \"cn-north-1\").dns_suffix,\n            \"amazonaws.com.cn\"\n        );\n        assert_eq!(resolver.partitions.len(), 5);\n        assert_eq!(\n            resolve(&resolver, \"af-south-1\").implicit_global_region,\n            \"us-east-1\"\n        );\n    }\n\n    #[test]\n    fn resolve_partitions() {\n        let mut resolver = PartitionResolver::empty();\n        let new_suffix = PartitionOutputOverride {\n            dns_suffix: Some(\"mars.aws\".into()),\n            ..Default::default()\n        };\n        resolver.add_partition(PartitionMetadata {\n            id: \"aws\".into(),\n            region_regex: Regex::new(\"^(us|eu|ap|sa|ca|me|af)-\\\\w+-\\\\d+$\").unwrap(),\n            regions: HashMap::from([(\"mars-east-2\".into(), new_suffix)]),\n            outputs: PartitionOutput {\n                name: \"aws\".into(),\n                dns_suffix: \"amazonaws.com\".into(),\n                dual_stack_dns_suffix: \"api.aws\".into(),\n                supports_fips: true,\n                supports_dual_stack: true,\n                implicit_global_region: \"us-east-1\".into(),\n            },\n        });\n        resolver.add_partition(PartitionMetadata {\n            id: \"other\".into(),\n            region_regex: Regex::new(\"^(other)-\\\\w+-\\\\d+$\").unwrap(),\n            regions: Default::default(),\n            outputs: PartitionOutput {\n                name: \"other\".into(),\n                dns_suffix: \"other.amazonaws.com\".into(),\n                dual_stack_dns_suffix: \"other.aws\".into(),\n                supports_fips: false,\n                supports_dual_stack: true,\n                implicit_global_region: \"other-south-2\".into(),\n            },\n        });\n        assert_eq!(resolve(&resolver, \"us-east-1\").name, \"aws\");\n        assert_eq!(resolve(&resolver, \"other-west-2\").name, \"other\");\n        // mars-east-1 hits aws through the default fallback\n        assert_eq!(\n            resolve(&resolver, \"mars-east-1\").dns_suffix,\n            \"amazonaws.com\"\n        );\n        // mars-east-2 hits aws through the region override\n        assert_eq!(resolve(&resolver, \"mars-east-2\").dns_suffix, \"mars.aws\");\n    }\n}\n"
  },
  {
    "path": "rust-runtime/inlineable/src/endpoint_lib/s3.rs",
    "content": "/*\n *  Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n *  SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::endpoint_lib::diagnostic::DiagnosticCollector;\nuse crate::endpoint_lib::host::is_valid_host_label;\n\n/// Evaluates whether a string is a DNS-compatible bucket name that can be used with virtual hosted-style addressing.\npub(crate) fn is_virtual_hostable_s3_bucket(\n    host_label: &str,\n    allow_subdomains: bool,\n    e: &mut DiagnosticCollector,\n) -> bool {\n    if !is_valid_host_label(host_label, allow_subdomains, e) {\n        false\n    } else if !allow_subdomains {\n        is_virtual_hostable_segment(host_label)\n    } else {\n        host_label.split('.').all(is_virtual_hostable_segment)\n    }\n}\n\nfn is_virtual_hostable_segment(host_label: &str) -> bool {\n    let bytes = host_label.as_bytes();\n    // ^[a-z\\d][a-z\\d\\-.]{1,61}[a-z\\d]$ — length 3..=63, bookended by [a-z0-9]\n    if !(3..=63).contains(&bytes.len()) {\n        return false;\n    }\n    let (&first, rest) = match bytes.split_first() {\n        Some(v) => v,\n        None => return false, // unreachable: length >= 3\n    };\n    let (&last, middle) = match rest.split_last() {\n        Some(v) => v,\n        None => return false, // unreachable: length >= 3\n    };\n    let is_bucket_char = |b: &u8| b.is_ascii_lowercase() || b.is_ascii_digit();\n    if !is_bucket_char(&first) || !is_bucket_char(&last) {\n        return false;\n    }\n    // validate middle chars and reject \".-\" / \"-.\" adjacency\n    let valid_chars = middle\n        .iter()\n        .all(|b| is_bucket_char(b) || *b == b'-' || *b == b'.');\n    let no_dot_dash = !bytes\n        .windows(2)\n        .any(|w| matches!(w, [b'.', b'-'] | [b'-', b'.']));\n    valid_chars && no_dot_dash && !is_ipv4(bytes)\n}\n\n/// Matches `^(\\d+\\.){3}\\d+$`\nfn is_ipv4(bytes: &[u8]) -> bool {\n    let mut dots = 0;\n    let mut has_digit = false;\n    for &b in bytes {\n        if b.is_ascii_digit() {\n            has_digit = true;\n        } else if b == b'.' {\n            if !has_digit {\n                return false;\n            }\n            dots += 1;\n            has_digit = false;\n        } else {\n            return false;\n        }\n    }\n    dots == 3 && has_digit\n}\n\n#[cfg(test)]\nmod test {\n    use super::*;\n    use proptest::prelude::*;\n    use regex_lite::Regex;\n\n    #[derive(Clone, Copy)]\n    enum Subdomains {\n        Allow,\n        Deny,\n    }\n\n    fn is_virtual_hostable(label: &str, subdomains: Subdomains) -> bool {\n        is_virtual_hostable_s3_bucket(\n            label,\n            matches!(subdomains, Subdomains::Allow),\n            &mut DiagnosticCollector::new(),\n        )\n    }\n\n    #[test]\n    fn check_s3_bucket() {\n        // double dashes are valid\n        assert!(is_virtual_hostable(\"a--b--x-s3\", Subdomains::Deny));\n        // dot-dash adjacency rejected with subdomains\n        assert!(!is_virtual_hostable(\"a-.b-.c\", Subdomains::Allow));\n    }\n\n    #[test]\n    fn valid_buckets() {\n        assert!(is_virtual_hostable(\"abc\", Subdomains::Deny));\n        assert!(is_virtual_hostable(\"my-bucket\", Subdomains::Deny));\n        assert!(is_virtual_hostable(\"my-bucket-123\", Subdomains::Deny));\n        assert!(is_virtual_hostable(\"a0b\", Subdomains::Deny));\n        assert!(is_virtual_hostable(\"abc.def.ghi\", Subdomains::Allow));\n    }\n\n    #[test]\n    fn length_bounds() {\n        // too short\n        assert!(!is_virtual_hostable(\"ab\", Subdomains::Deny));\n        // minimum length\n        assert!(is_virtual_hostable(\"abc\", Subdomains::Deny));\n        // 63 chars — maximum\n        assert!(is_virtual_hostable(\n            &format!(\"a{}b\", \"c\".repeat(61)),\n            Subdomains::Deny\n        ));\n        // 64 chars — too long\n        assert!(!is_virtual_hostable(\n            &format!(\"a{}b\", \"c\".repeat(62)),\n            Subdomains::Deny\n        ));\n    }\n\n    #[test]\n    fn first_last_char() {\n        // must start with [a-z0-9]\n        assert!(!is_virtual_hostable(\"-abc\", Subdomains::Deny));\n        assert!(!is_virtual_hostable(\".abc\", Subdomains::Deny));\n        // must end with [a-z0-9]\n        assert!(!is_virtual_hostable(\"abc-\", Subdomains::Deny));\n        assert!(!is_virtual_hostable(\"abc.\", Subdomains::Deny));\n        // uppercase rejected\n        assert!(!is_virtual_hostable(\"Abc\", Subdomains::Deny));\n        assert!(!is_virtual_hostable(\"abC\", Subdomains::Deny));\n    }\n\n    #[test]\n    fn dot_dash_adjacency() {\n        assert!(!is_virtual_hostable(\"bucket.-name\", Subdomains::Deny));\n        assert!(!is_virtual_hostable(\"bucket-.name\", Subdomains::Deny));\n        assert!(!is_virtual_hostable(\"a.-b\", Subdomains::Allow));\n        assert!(!is_virtual_hostable(\"a-.b\", Subdomains::Allow));\n    }\n\n    #[test]\n    fn invalid_characters() {\n        assert!(!is_virtual_hostable(\"abc_def\", Subdomains::Deny));\n        assert!(!is_virtual_hostable(\"abc def\", Subdomains::Deny));\n        assert!(!is_virtual_hostable(\"abc!def\", Subdomains::Deny));\n    }\n\n    // Ported from Java SDK's RuleUrlTest.java isIpAddr test cases\n    #[test]\n    fn ipv4_rejected() {\n        assert!(!is_virtual_hostable(\"0.0.0.0\", Subdomains::Deny));\n        assert!(!is_virtual_hostable(\"127.0.0.1\", Subdomains::Allow));\n        assert!(!is_virtual_hostable(\"192.168.1.1\", Subdomains::Allow));\n    }\n\n    #[test]\n    fn ipv4_like_but_valid_bucket() {\n        // contains letters — not IPv4\n        assert!(is_virtual_hostable(\"abc.def.ghi.jkl\", Subdomains::Allow));\n        // more than 4 segments — not IPv4\n        assert!(is_virtual_hostable(\n            \"1a2.2b3.3c4.4d5.5e6\",\n            Subdomains::Allow\n        ));\n    }\n\n    /// Original regex patterns removed from production code for performance but\n    /// retained here to verify equivalence with the hand-written replacements.\n    const REGEX_VIRTUAL_HOSTABLE_SEGMENT: &str = r\"^[a-z\\d][a-z\\d\\-.]{1,61}[a-z\\d]$\";\n    const REGEX_IPV4: &str = r\"^(\\d+\\.){3}\\d+$\";\n    const REGEX_DOTS_AND_DASHES: &str = r\"^.*((\\.-)|(-\\.)).*$\";\n\n    // `Regex::new` isn't const, so regexes in the helpers below are compiled\n    // on each call. That's fine for test-only code.\n    fn regex_is_virtual_hostable_segment(label: &str) -> bool {\n        Regex::new(REGEX_VIRTUAL_HOSTABLE_SEGMENT)\n            .unwrap()\n            .is_match(label)\n            && !Regex::new(REGEX_IPV4).unwrap().is_match(label)\n            && !Regex::new(REGEX_DOTS_AND_DASHES).unwrap().is_match(label)\n    }\n    fn regex_is_ipv4(label: &str) -> bool {\n        Regex::new(REGEX_IPV4).unwrap().is_match(label)\n    }\n\n    proptest! {\n        #[test]\n        fn is_virtual_hostable_segment_equivalence(\n            // Valid bucket chars alone rarely produce invalid inputs, so we mix\n            // in arbitrary printable chars to exercise rejection paths as well.\n            s in prop_oneof![\n                \"[a-z0-9.\\\\-]{0,80}\",\n                \"\\\\PC{0,80}\",\n            ]\n        ) {\n            prop_assert_eq!(\n                is_virtual_hostable_segment(&s),\n                regex_is_virtual_hostable_segment(&s),\n                \"mismatch for {:?}\", s\n            );\n        }\n\n        #[test]\n        fn is_ipv4_equivalence(\n            // Random digit/dot strings rarely form valid IPv4, so we mix in\n            // valid-shaped inputs to exercise the accept path as well.\n            s in prop_oneof![\n                \"[0-9.]{0,20}\",\n                \"\\\\d{1,3}(\\\\.\\\\d{1,3}){3}\",\n            ]\n        ) {\n            prop_assert_eq!(\n                is_ipv4(s.as_bytes()),\n                regex_is_ipv4(&s),\n                \"mismatch for {:?}\", s\n            );\n        }\n    }\n\n    #[test]\n    fn is_ipv4_unit() {\n        // Ported from Java SDK RuleUrlTest isIpAddr cases\n        assert!(is_ipv4(b\"0.0.0.0\"));\n        assert!(is_ipv4(b\"127.0.0.1\"));\n        assert!(is_ipv4(b\"132.248.181.171\"));\n        // fewer than 4 segments\n        assert!(!is_ipv4(b\"127.0.0\"));\n        assert!(!is_ipv4(b\"127.0\"));\n        assert!(!is_ipv4(b\"127\"));\n        // more than 4 segments\n        assert!(!is_ipv4(b\"127.0.0.1.1\"));\n        // non-numeric\n        assert!(!is_ipv4(b\"foo.1.1.1\"));\n        assert!(!is_ipv4(b\"1.foo.1.1\"));\n        assert!(!is_ipv4(b\"amazon.com\"));\n        assert!(!is_ipv4(b\"localhost\"));\n        // empty segment\n        assert!(!is_ipv4(b\".1.1.1\"));\n        assert!(!is_ipv4(b\"1..1.1\"));\n    }\n}\n"
  },
  {
    "path": "rust-runtime/inlineable/src/endpoint_lib/split.rs",
    "content": "/*\n *  Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n *  SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::endpoint_lib::diagnostic::DiagnosticCollector;\n\n/// Splits a string into an array of substrings based on a delimiter.\n/// Specification for this function can be found in the [Smithy spec](https://smithy.io/2.0/additional-specs/rules-engine/standard-library.html#split-function).\n///\n/// ### Arguments\n/// * `value` - The input string to split\n/// * `delimiter` - The separator (must be non-empty)\n/// * `limit` - Controls split behavior:\n///   - `0`: Split all occurrences\n///   - `1`: No split (returns original string as single element)\n///   - `>1`: Split into at most 'limit' parts\n///\n/// ### Returns\n/// `Vec<&str>` containing the split parts\npub(crate) fn split<'a>(\n    value: &'a str,\n    delimiter: &str,\n    limit: usize,\n    _dc: &mut DiagnosticCollector,\n) -> Vec<&'a str> {\n    if limit == 0 {\n        return value.split(delimiter).collect();\n    }\n\n    value.splitn(limit, delimiter).collect()\n}\n\n// Test cases sourced from Smithy spec:\n// https://smithy.io/2.0/additional-specs/rules-engine/standard-library.html#rules-engine-standard-library-split-examples\n#[cfg(test)]\nmod tests {\n    use super::*;\n\n    #[test]\n    fn test_split_unlimited() {\n        assert_eq!(\n            split(\"a--b--c\", \"--\", 0, &mut DiagnosticCollector::new()),\n            vec![\"a\", \"b\", \"c\"]\n        );\n        assert_eq!(\n            split(\n                \"--x-s3--azid--suffix\",\n                \"--\",\n                0,\n                &mut DiagnosticCollector::new()\n            ),\n            vec![\"\", \"x-s3\", \"azid\", \"suffix\"]\n        );\n    }\n\n    #[test]\n    fn test_split_with_limit() {\n        assert_eq!(\n            split(\"a--b--c\", \"--\", 2, &mut DiagnosticCollector::new()),\n            vec![\"a\", \"b--c\"]\n        );\n        assert_eq!(\n            split(\n                \"--x-s3--azid--suffix\",\n                \"--\",\n                2,\n                &mut DiagnosticCollector::new()\n            ),\n            vec![\"\", \"x-s3--azid--suffix\"]\n        );\n    }\n\n    #[test]\n    fn test_split_no_split() {\n        assert_eq!(\n            split(\"a--b--c\", \"--\", 1, &mut DiagnosticCollector::new()),\n            vec![\"a--b--c\"]\n        );\n        assert_eq!(\n            split(\"mybucket\", \"--\", 1, &mut DiagnosticCollector::new()),\n            vec![\"mybucket\"]\n        );\n    }\n\n    #[test]\n    fn test_split_empty_string() {\n        assert_eq!(\n            split(\"\", \"--\", 0, &mut DiagnosticCollector::new()),\n            vec![\"\"]\n        );\n    }\n\n    #[test]\n    fn test_split_delimiter_only() {\n        assert_eq!(\n            split(\"--\", \"--\", 0, &mut DiagnosticCollector::new()),\n            vec![\"\", \"\"]\n        );\n        assert_eq!(\n            split(\"----\", \"--\", 0, &mut DiagnosticCollector::new()),\n            vec![\"\", \"\", \"\"]\n        );\n    }\n\n    #[test]\n    fn test_split_with_empty_parts() {\n        assert_eq!(\n            split(\"--b--\", \"--\", 0, &mut DiagnosticCollector::new()),\n            vec![\"\", \"b\", \"\"]\n        );\n    }\n\n    #[test]\n    fn test_split_no_delimiter_found() {\n        assert_eq!(\n            split(\"abc\", \"x\", 0, &mut DiagnosticCollector::new()),\n            vec![\"abc\"]\n        );\n    }\n}\n"
  },
  {
    "path": "rust-runtime/inlineable/src/endpoint_lib/substring.rs",
    "content": "/*\n *  Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n *  SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::endpoint_lib::diagnostic::DiagnosticCollector;\n\n/// substring of `input`\n///\n/// > Note: this function only operates on ASCII input. If the input contains non-ASCII characters,\n/// > `None` will be returned.\n///\n/// - When `reverse` is false, indexes are evaluated from the beginning of the string\n/// - When `reverse` is true, indexes are evaluated from the end of the string (however, the result\n///   will still be \"forwards\" and `start` MUST be less than `end`.\npub(crate) fn substring<'a>(\n    input: &'a str,\n    start: usize,\n    stop: usize,\n    reverse: bool,\n    e: &mut DiagnosticCollector,\n) -> Option<&'a str> {\n    if start >= stop {\n        e.capture(Err(\"start > stop\"))?;\n    }\n    if !input.is_ascii() {\n        e.capture(Err(\"the input to substring was not ascii\"))?;\n    }\n    if input.len() < stop {\n        e.capture(Err(\"the input was too short\"))?;\n    }\n    let (effective_start, effective_stop) = if !reverse {\n        (start, stop)\n    } else {\n        (input.len() - stop, input.len() - start)\n    };\n    Some(&input[effective_start..effective_stop])\n}\n\n#[cfg(all(test, feature = \"gated-tests\"))]\nmod test {\n    use super::*;\n    use proptest::proptest;\n\n    #[test]\n    fn substring_forwards() {\n        assert_eq!(\n            substring(\"hello\", 0, 2, false, &mut DiagnosticCollector::new()),\n            Some(\"he\")\n        );\n        assert_eq!(\n            substring(\"hello\", 0, 0, false, &mut DiagnosticCollector::new()),\n            None\n        );\n        assert_eq!(\n            substring(\"hello\", 0, 5, false, &mut DiagnosticCollector::new()),\n            Some(\"hello\")\n        );\n        assert_eq!(\n            substring(\"hello\", 0, 6, false, &mut DiagnosticCollector::new()),\n            None\n        );\n    }\n\n    #[test]\n    fn substring_backwards() {\n        assert_eq!(\n            substring(\"hello\", 0, 2, true, &mut DiagnosticCollector::new()),\n            Some(\"lo\")\n        );\n        assert_eq!(\n            substring(\"hello\", 0, 0, true, &mut DiagnosticCollector::new()),\n            None\n        );\n        assert_eq!(\n            substring(\"hello\", 0, 5, true, &mut DiagnosticCollector::new()),\n            Some(\"hello\")\n        )\n    }\n\n    // substring doesn't support unicode, it always returns none\n    #[test]\n    fn substring_unicode() {\n        let mut collector = DiagnosticCollector::new();\n        assert_eq!(substring(\"a🐱b\", 0, 2, false, &mut collector), None);\n        assert_eq!(\n            format!(\n                \"{}\",\n                collector\n                    .take_last_error()\n                    .expect(\"last error should be set\")\n            ),\n            \"the input to substring was not ascii\"\n        );\n    }\n\n    use proptest::prelude::*;\n    proptest! {\n        #[test]\n        fn substring_no_panics(s in any::<String>(), start in 0..100usize, stop in 0..100usize, reverse in proptest::bool::ANY) {\n            substring(&s, start, stop, reverse, &mut DiagnosticCollector::new());\n        }\n\n        #[test]\n        fn substring_correct_length(s in r\"[\\x00-\\xFF]*\", start in 0..10usize, stop in 0..10usize, reverse in proptest::bool::ANY) {\n            prop_assume!(start < s.len());\n            prop_assume!(stop < s.len());\n            prop_assume!(start < stop);\n            if let Some(result) = substring(&s, start, stop, reverse, &mut DiagnosticCollector::new()) {\n                assert_eq!(result.len(), stop - start);\n            }\n\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/inlineable/src/endpoint_lib/uri_encode.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::endpoint_lib::diagnostic::DiagnosticCollector;\n\nuse percent_encoding::{utf8_percent_encode, AsciiSet, CONTROLS};\n\npub(crate) const BASE_SET: &AsciiSet = &CONTROLS\n    .add(b' ')\n    .add(b'/')\n    .add(b':')\n    .add(b',')\n    .add(b'?')\n    .add(b'#')\n    .add(b'[')\n    .add(b']')\n    .add(b'{')\n    .add(b'}')\n    .add(b'|')\n    .add(b'@')\n    .add(b'!')\n    .add(b'$')\n    .add(b'&')\n    .add(b'\\'')\n    .add(b'(')\n    .add(b')')\n    .add(b'*')\n    .add(b'+')\n    .add(b';')\n    .add(b'=')\n    .add(b'%')\n    .add(b'<')\n    .add(b'>')\n    .add(b'\"')\n    .add(b'^')\n    .add(b'`')\n    .add(b'\\\\');\n\n// Returns `Option` for forwards compatibility\npub(crate) fn uri_encode<'a>(\n    s: &'a str,\n    _e: &mut DiagnosticCollector,\n) -> std::borrow::Cow<'a, str> {\n    utf8_percent_encode(s, BASE_SET).into()\n}\n"
  },
  {
    "path": "rust-runtime/inlineable/src/endpoint_lib.rs",
    "content": "/*\n *  Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n *  SPDX-License-Identifier: Apache-2.0\n */\n\nmod arn;\nmod bdd_interpreter;\nmod coalesce;\nmod diagnostic;\nmod host;\nmod ite;\nmod parse_url;\nmod partition;\nmod s3;\nmod split;\nmod substring;\nmod uri_encode;\n"
  },
  {
    "path": "rust-runtime/inlineable/src/event_receiver.rs",
    "content": "/*\n *  Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n *  SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_smithy_http::event_stream::{InitialMessageType, Receiver};\nuse aws_smithy_runtime_api::client::result::SdkError;\nuse aws_smithy_types::event_stream::{Message, RawMessage};\n\n#[derive(Debug)]\n/// Receives unmarshalled events at a time out of an Event Stream.\npub struct EventReceiver<T, E> {\n    inner: Receiver<T, E>,\n}\n\nimpl<T, E> EventReceiver<T, E> {\n    pub(crate) fn new(inner: Receiver<T, E>) -> Self {\n        Self { inner }\n    }\n\n    #[allow(dead_code)]\n    pub(crate) async fn try_recv_initial_request(\n        &mut self,\n    ) -> Result<Option<Message>, SdkError<E, RawMessage>> {\n        self.inner\n            .try_recv_initial(InitialMessageType::Request)\n            .await\n    }\n\n    #[allow(dead_code)]\n    pub(crate) async fn try_recv_initial_response(\n        &mut self,\n    ) -> Result<Option<Message>, SdkError<E, RawMessage>> {\n        self.inner\n            .try_recv_initial(InitialMessageType::Response)\n            .await\n    }\n\n    /// Asynchronously tries to receive an event from the stream. If the stream has ended, it\n    /// returns an `Ok(None)`. If there is a transport layer error, it will return\n    /// `Err(SdkError::DispatchFailure)`. Service-modeled errors will be a part of the returned\n    /// messages.\n    pub async fn recv(&mut self) -> Result<Option<T>, SdkError<E, RawMessage>> {\n        self.inner.recv().await\n    }\n}\n"
  },
  {
    "path": "rust-runtime/inlineable/src/http_checksum_required.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_smithy_runtime_api::box_error::BoxError;\nuse aws_smithy_runtime_api::client::interceptors::context::BeforeTransmitInterceptorContextMut;\nuse aws_smithy_runtime_api::client::interceptors::{\n    dyn_dispatch_hint, Intercept, Interceptor, InterceptorRegistrar, SharedInterceptor,\n};\nuse aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugin;\nuse aws_smithy_types::base64;\nuse aws_smithy_types::config_bag::ConfigBag;\nuse http_1x::header::HeaderName;\n\n#[derive(Debug)]\npub(crate) struct HttpChecksumRequiredRuntimePlugin;\n\nimpl RuntimePlugin for HttpChecksumRequiredRuntimePlugin {\n    fn interceptors(&self, interceptors: &mut InterceptorRegistrar) {\n        interceptors.register(SharedInterceptor::permanent(\n            HttpChecksumRequiredInterceptor,\n        ));\n    }\n}\n\n#[derive(Debug)]\nstruct HttpChecksumRequiredInterceptor;\n\n#[dyn_dispatch_hint]\nimpl Intercept for HttpChecksumRequiredInterceptor {\n    fn modify_before_signing(\n        &self,\n        context: &mut BeforeTransmitInterceptorContextMut<'_>,\n        _cfg: &mut ConfigBag,\n    ) -> Result<(), BoxError> {\n        let request = context.request_mut();\n        let body_bytes = request\n            .body()\n            .bytes()\n            .expect(\"checksum can only be computed for non-streaming operations\");\n        let checksum = <md5::Md5 as md5::Digest>::digest(body_bytes);\n        request.headers_mut().insert(\n            HeaderName::from_static(\"content-md5\"),\n            base64::encode(&checksum[..])\n                .parse()\n                .expect(\"checksum is a valid header value\"),\n        );\n        Ok(())\n    }\n}\n"
  },
  {
    "path": "rust-runtime/inlineable/src/idempotency_token.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_smithy_types::config_bag::{Storable, StoreReplace};\nuse std::sync::Mutex;\n\npub(crate) fn uuid_v4(input: u128) -> String {\n    let mut out = String::with_capacity(36);\n    // u4-aligned index into [input]\n    let mut rnd_idx: u8 = 0;\n    const HEX_CHARS: &[u8; 16] = b\"0123456789abcdef\";\n\n    for str_idx in 0..36 {\n        if str_idx == 8 || str_idx == 13 || str_idx == 18 || str_idx == 23 {\n            out.push('-');\n        // UUID version character\n        } else if str_idx == 14 {\n            out.push('4');\n        } else {\n            let mut dat: u8 = ((input >> (rnd_idx * 4)) & 0x0F) as u8;\n            // UUID variant bits\n            if str_idx == 19 {\n                dat |= 0b00001000;\n            }\n            rnd_idx += 1;\n            out.push(HEX_CHARS[dat as usize] as char);\n        }\n    }\n    out\n}\n\n/// IdempotencyTokenProvider generates idempotency tokens for idempotent API requests\n///\n/// Generally, customers will not need to interact with this at all. A sensible default will be\n/// provided automatically during config construction. However, if you need deterministic behavior\n/// for testing, two options are available:\n/// 1. Utilize the From<&'static str>` implementation to hard code an idempotency token\n/// 2. Seed the token provider with [`IdempotencyTokenProvider::with_seed`](IdempotencyTokenProvider::with_seed)\n#[derive(Debug)]\npub struct IdempotencyTokenProvider {\n    inner: Inner,\n}\n\n#[derive(Debug)]\nenum Inner {\n    Static(&'static str),\n    Random(Mutex<fastrand::Rng>),\n}\n\npub fn default_provider() -> IdempotencyTokenProvider {\n    IdempotencyTokenProvider::random()\n}\n\nimpl From<&'static str> for IdempotencyTokenProvider {\n    fn from(token: &'static str) -> Self {\n        Self::fixed(token)\n    }\n}\n\nimpl Storable for IdempotencyTokenProvider {\n    type Storer = StoreReplace<IdempotencyTokenProvider>;\n}\n\nimpl IdempotencyTokenProvider {\n    pub fn make_idempotency_token(&self) -> String {\n        match &self.inner {\n            Inner::Static(token) => token.to_string(),\n            Inner::Random(rng) => {\n                let input: u128 = rng.lock().unwrap().u128(..);\n                uuid_v4(input)\n            }\n        }\n    }\n\n    pub fn with_seed(seed: u64) -> Self {\n        Self {\n            inner: Inner::Random(Mutex::new(fastrand::Rng::with_seed(seed))),\n        }\n    }\n\n    pub fn random() -> Self {\n        Self {\n            inner: Inner::Random(Mutex::new(fastrand::Rng::new())),\n        }\n    }\n\n    pub fn fixed(token: &'static str) -> Self {\n        Self {\n            inner: Inner::Static(token),\n        }\n    }\n}\n\nimpl Clone for IdempotencyTokenProvider {\n    fn clone(&self) -> Self {\n        match &self.inner {\n            Inner::Static(token) => IdempotencyTokenProvider::fixed(token),\n            Inner::Random(_) => IdempotencyTokenProvider::random(),\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/inlineable/src/json_errors.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_smithy_json::deserialize::token::skip_value;\nuse aws_smithy_json::deserialize::{error::DeserializeError, json_token_iter, Token};\nuse aws_smithy_runtime_api::http::Headers;\nuse aws_smithy_types::error::metadata::{Builder as ErrorMetadataBuilder, ErrorMetadata};\nuse std::borrow::Cow;\n\n// currently only used by AwsJson\n#[allow(unused)]\npub fn is_error<B>(response: &http_1x::Response<B>) -> bool {\n    !response.status().is_success()\n}\n\nfn sanitize_error_code(error_code: &str) -> &str {\n    // Trim a trailing URL from the error code, which is done by removing the longest suffix\n    // beginning with a `:`\n    let error_code = match error_code.find(':') {\n        Some(idx) => &error_code[..idx],\n        None => error_code,\n    };\n\n    // Trim a prefixing namespace from the error code, beginning with a `#`\n    match error_code.find('#') {\n        Some(idx) => &error_code[idx + 1..],\n        None => error_code,\n    }\n}\n\nstruct ErrorBody<'a> {\n    code: Option<Cow<'a, str>>,\n    message: Option<Cow<'a, str>>,\n}\n\nfn parse_error_body(bytes: &[u8]) -> Result<ErrorBody<'_>, DeserializeError> {\n    let mut tokens = json_token_iter(bytes).peekable();\n    let (mut typ, mut code, mut message) = (None, None, None);\n    if let Some(Token::StartObject { .. }) = tokens.next().transpose()? {\n        loop {\n            match tokens.next().transpose()? {\n                Some(Token::EndObject { .. }) => break,\n                Some(Token::ObjectKey { key, .. }) => {\n                    if let Some(Ok(Token::ValueString { value, .. })) = tokens.peek() {\n                        match key.as_escaped_str() {\n                            \"code\" => code = Some(value.to_unescaped()?),\n                            \"__type\" => typ = Some(value.to_unescaped()?),\n                            \"message\" | \"Message\" | \"errorMessage\" => {\n                                message = Some(value.to_unescaped()?)\n                            }\n                            _ => {}\n                        }\n                    }\n                    skip_value(&mut tokens)?;\n                }\n                _ => {\n                    return Err(DeserializeError::custom(\n                        \"expected object key or end object\",\n                    ))\n                }\n            }\n        }\n        if tokens.next().is_some() {\n            return Err(DeserializeError::custom(\n                \"found more JSON tokens after completing parsing\",\n            ));\n        }\n    }\n    Ok(ErrorBody {\n        code: code.or(typ),\n        message,\n    })\n}\n\npub fn parse_error_metadata(\n    payload: &[u8],\n    headers: &Headers,\n) -> Result<ErrorMetadataBuilder, DeserializeError> {\n    let ErrorBody { code, message } = parse_error_body(payload)?;\n\n    let mut err_builder = ErrorMetadata::builder();\n    if let Some(code) = headers\n        .get(\"x-amzn-errortype\")\n        .or(code.as_deref())\n        .map(sanitize_error_code)\n    {\n        err_builder = err_builder.code(code);\n    }\n    if let Some(message) = message {\n        err_builder = err_builder.message(message);\n    }\n    Ok(err_builder)\n}\n\n#[cfg(test)]\nmod test {\n    use crate::json_errors::{parse_error_body, parse_error_metadata, sanitize_error_code};\n    use aws_smithy_runtime_api::client::orchestrator::HttpResponse;\n    use aws_smithy_types::{body::SdkBody, error::ErrorMetadata};\n    use std::borrow::Cow;\n\n    #[test]\n    fn error_metadata() {\n        let response = HttpResponse::try_from(\n            http_1x::Response::builder()\n                .body(SdkBody::from(\n                    r#\"{ \"__type\": \"FooError\", \"message\": \"Go to foo\" }\"#,\n                ))\n                .unwrap(),\n        )\n        .unwrap();\n        assert_eq!(\n            parse_error_metadata(response.body().bytes().unwrap(), response.headers())\n                .unwrap()\n                .build(),\n            ErrorMetadata::builder()\n                .code(\"FooError\")\n                .message(\"Go to foo\")\n                .build()\n        )\n    }\n\n    #[test]\n    fn error_type() {\n        assert_eq!(\n            Some(Cow::Borrowed(\"FooError\")),\n            parse_error_body(br#\"{ \"__type\": \"FooError\" }\"#)\n                .unwrap()\n                .code\n        );\n    }\n\n    #[test]\n    fn code_takes_priority() {\n        assert_eq!(\n            Some(Cow::Borrowed(\"BarError\")),\n            parse_error_body(br#\"{ \"code\": \"BarError\", \"__type\": \"FooError\" }\"#)\n                .unwrap()\n                .code\n        );\n    }\n\n    #[test]\n    fn ignore_unrecognized_fields() {\n        assert_eq!(\n            Some(Cow::Borrowed(\"FooError\")),\n            parse_error_body(br#\"{ \"__type\": \"FooError\", \"asdf\": 5, \"fdsa\": {}, \"foo\": \"1\" }\"#)\n                .unwrap()\n                .code\n        );\n    }\n\n    #[test]\n    fn sanitize_namespace_and_url() {\n        assert_eq!(\n            sanitize_error_code(\"aws.protocoltests.restjson#FooError:http://internal.amazon.com/coral/com.amazon.coral.validate/\"),\n            \"FooError\");\n    }\n\n    #[test]\n    fn sanitize_noop() {\n        assert_eq!(sanitize_error_code(\"FooError\"), \"FooError\");\n    }\n\n    #[test]\n    fn sanitize_url() {\n        assert_eq!(\n            sanitize_error_code(\n                \"FooError:http://internal.amazon.com/coral/com.amazon.coral.validate/\"\n            ),\n            \"FooError\"\n        );\n    }\n\n    #[test]\n    fn sanitize_namespace() {\n        assert_eq!(\n            sanitize_error_code(\"aws.protocoltests.restjson#FooError\"),\n            \"FooError\"\n        );\n    }\n\n    // services like lambda use an alternate `Message` instead of `message`\n    #[test]\n    fn alternative_error_message_names() {\n        let response = HttpResponse::try_from(\n            http_1x::Response::builder()\n                .header(\"x-amzn-errortype\", \"ResourceNotFoundException\")\n                .body(SdkBody::from(\n                    r#\"{\n                    \"Type\": \"User\",\n                    \"Message\": \"Functions from 'us-west-2' are not reachable from us-east-1\"\n                }\"#,\n                ))\n                .unwrap(),\n        )\n        .unwrap();\n        assert_eq!(\n            parse_error_metadata(response.body().bytes().unwrap(), response.headers())\n                .unwrap()\n                .build(),\n            ErrorMetadata::builder()\n                .code(\"ResourceNotFoundException\")\n                .message(\"Functions from 'us-west-2' are not reachable from us-east-1\")\n                .build()\n        );\n    }\n}\n"
  },
  {
    "path": "rust-runtime/inlineable/src/lib.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/* Automatically managed default lints */\n#![cfg_attr(docsrs, feature(doc_cfg))]\n/* End of automatically managed default lints */\n#[allow(dead_code)]\nmod aws_query_compatible_errors;\n#[allow(unused)]\nmod cbor_errors;\n#[allow(unused)]\nmod client_http_checksum_required;\n#[allow(dead_code)]\nmod client_idempotency_token;\n#[allow(unused)]\nmod constrained;\n#[allow(dead_code)]\nmod ec2_query_errors;\n#[allow(unused)]\nmod event_receiver;\n#[allow(dead_code)]\nmod idempotency_token;\n#[allow(dead_code)]\nmod json_errors;\n#[allow(unused)]\nmod rest_xml_unwrapped_errors;\n#[allow(unused)]\nmod rest_xml_wrapped_errors;\n#[allow(dead_code)]\nmod sdk_feature_tracker;\n#[allow(unused)]\nmod serialization_settings;\n\n#[allow(unused)]\nmod endpoint_lib;\n\n#[allow(unused)]\nmod auth_plugin;\n\n#[allow(unused)]\nmod client_request_compression;\n\n// This test is outside of uuid.rs to enable copying the entirety of uuid.rs into the SDK without\n// requiring a proptest dependency\n#[cfg(test)]\nmod test {\n    use crate::idempotency_token;\n    use crate::idempotency_token::{uuid_v4, IdempotencyTokenProvider};\n    use proptest::prelude::*;\n    use regex_lite::Regex;\n\n    #[test]\n    fn test_uuid() {\n        assert_eq!(uuid_v4(0), \"00000000-0000-4000-8000-000000000000\");\n        assert_eq!(uuid_v4(12341234), \"2ff4cb00-0000-4000-8000-000000000000\");\n        assert_eq!(uuid_v4(u128::MAX), \"ffffffff-ffff-4fff-ffff-ffffffffffff\");\n    }\n\n    #[test]\n    fn default_token_generator_smoke_test() {\n        // smoke test to make sure the default token generator produces a token-like object\n        assert_eq!(\n            idempotency_token::default_provider()\n                .make_idempotency_token()\n                .len(),\n            36\n        );\n    }\n\n    #[test]\n    fn token_generator() {\n        let provider = IdempotencyTokenProvider::random();\n        let token = provider.make_idempotency_token();\n        assert!(\n            Regex::new(\n                r\"[A-Fa-f0-9]{8}-[A-Fa-f0-9]{4}-4[A-Fa-f0-9]{3}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{12}\"\n            )\n            .unwrap()\n            .is_match(&token),\n            \"token {token} wasn't a valid random UUID\"\n        );\n    }\n\n    fn assert_valid(uuid: String) {\n        assert_eq!(uuid.len(), 36);\n        let bytes = uuid.as_bytes();\n        let dashes: Vec<usize> = uuid\n            .chars()\n            .enumerate()\n            .filter_map(|(idx, chr)| if chr == '-' { Some(idx) } else { None })\n            .collect();\n        assert_eq!(dashes, vec![8, 13, 18, 23]);\n        // Check version\n        assert_eq!(bytes[14] as char, '4');\n        // Check variant\n        assert!(bytes[19] as char >= '8');\n    }\n\n    proptest! {\n        #[test]\n        fn doesnt_crash_uuid(v in any::<u128>()) {\n            let uuid = uuid_v4(v);\n            assert_valid(uuid);\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/inlineable/src/rest_xml_unwrapped_errors.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Error abstractions for `noErrorWrapping`. Code generators should either inline this file\n//! or its companion `rest_xml_wrapped_errors.rs` for code generation\n\nuse aws_smithy_types::error::metadata::{Builder as ErrorMetadataBuilder, ErrorMetadata};\nuse aws_smithy_xml::decode::{try_data, Document, ScopedDecoder, XmlDecodeError};\n\n#[allow(unused)]\npub fn body_is_error(body: &[u8]) -> Result<bool, XmlDecodeError> {\n    let mut doc = Document::try_from(body)?;\n    let scoped = doc.root_element()?;\n    Ok(scoped.start_el().matches(\"Error\"))\n}\n\npub fn error_scope<'a, 'b>(\n    doc: &'a mut Document<'b>,\n) -> Result<ScopedDecoder<'b, 'a>, XmlDecodeError> {\n    let scoped = doc.root_element()?;\n    if !scoped.start_el().matches(\"Error\") {\n        return Err(XmlDecodeError::custom(\"expected error as root\"));\n    }\n    Ok(scoped)\n}\n\npub fn parse_error_metadata(body: &[u8]) -> Result<ErrorMetadataBuilder, XmlDecodeError> {\n    let mut doc = Document::try_from(body)?;\n    let mut root = doc.root_element()?;\n    let mut builder = ErrorMetadata::builder();\n    while let Some(mut tag) = root.next_tag() {\n        match tag.start_el().local() {\n            \"Code\" => {\n                builder = builder.code(try_data(&mut tag)?);\n            }\n            \"Message\" => {\n                builder = builder.message(try_data(&mut tag)?);\n            }\n            _ => {}\n        }\n    }\n    Ok(builder)\n}\n\n#[cfg(test)]\nmod test {\n    use super::{body_is_error, parse_error_metadata};\n\n    #[test]\n    fn parse_unwrapped_error() {\n        let xml = br#\"<Error>\n    <Type>Sender</Type>\n    <Code>InvalidGreeting</Code>\n    <Message>Hi</Message>\n    <AnotherSetting>setting</AnotherSetting>\n    <RequestId>foo-id</RequestId>\n</Error>\"#;\n        assert!(body_is_error(xml).unwrap());\n        let parsed = parse_error_metadata(xml).expect(\"valid xml\").build();\n        assert_eq!(parsed.message(), Some(\"Hi\"));\n        assert_eq!(parsed.code(), Some(\"InvalidGreeting\"));\n    }\n}\n"
  },
  {
    "path": "rust-runtime/inlineable/src/rest_xml_wrapped_errors.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_smithy_types::error::metadata::{Builder as ErrorMetadataBuilder, ErrorMetadata};\nuse aws_smithy_xml::decode::{try_data, Document, ScopedDecoder, XmlDecodeError};\n\n#[allow(unused)]\npub fn body_is_error(body: &[u8]) -> Result<bool, XmlDecodeError> {\n    let mut doc = Document::try_from(body)?;\n    let scoped = doc.root_element()?;\n    Ok(scoped.start_el().matches(\"ErrorResponse\"))\n}\n\n#[allow(dead_code)]\npub fn parse_error_metadata(body: &[u8]) -> Result<ErrorMetadataBuilder, XmlDecodeError> {\n    let mut doc = Document::try_from(body)?;\n    let mut root = doc.root_element()?;\n    let mut err_builder = ErrorMetadata::builder();\n    while let Some(mut tag) = root.next_tag() {\n        if tag.start_el().local() == \"Error\" {\n            while let Some(mut error_field) = tag.next_tag() {\n                match error_field.start_el().local() {\n                    \"Code\" => {\n                        err_builder = err_builder.code(try_data(&mut error_field)?);\n                    }\n                    \"Message\" => {\n                        err_builder = err_builder.message(try_data(&mut error_field)?);\n                    }\n                    _ => {}\n                }\n            }\n        }\n    }\n    Ok(err_builder)\n}\n\n#[allow(unused)]\npub fn error_scope<'a, 'b>(\n    doc: &'a mut Document<'b>,\n) -> Result<ScopedDecoder<'b, 'a>, XmlDecodeError> {\n    let root = doc\n        .next_start_element()\n        .ok_or_else(|| XmlDecodeError::custom(\"no root found searching for an Error\"))?;\n    if !root.matches(\"ErrorResponse\") {\n        return Err(XmlDecodeError::custom(\"expected ErrorResponse as root\"));\n    }\n\n    while let Some(el) = doc.next_start_element() {\n        if el.matches(\"Error\") && el.depth() == 1 {\n            return Ok(doc.scoped_to(el));\n        }\n        // otherwise, ignore it\n    }\n    Err(XmlDecodeError::custom(\n        \"no error found inside of ErrorResponse\",\n    ))\n}\n\n#[cfg(test)]\nmod test {\n    use super::{body_is_error, parse_error_metadata};\n    use crate::rest_xml_wrapped_errors::error_scope;\n    use aws_smithy_xml::decode::Document;\n\n    #[test]\n    fn parse_wrapped_error() {\n        let xml = br#\"<ErrorResponse>\n    <Error>\n        <Type>Sender</Type>\n        <Code>InvalidGreeting</Code>\n        <Message>Hi</Message>\n        <AnotherSetting>setting</AnotherSetting>\n        <Ignore><This/></Ignore>\n    </Error>\n    <RequestId>foo-id</RequestId>\n</ErrorResponse>\"#;\n        assert!(body_is_error(xml).unwrap());\n        let parsed = parse_error_metadata(xml).expect(\"valid xml\").build();\n        assert_eq!(parsed.message(), Some(\"Hi\"));\n        assert_eq!(parsed.code(), Some(\"InvalidGreeting\"));\n    }\n\n    #[test]\n    fn test_error_scope() {\n        let xml: &[u8] = br#\"<ErrorResponse>\n    <RequestId>foo-id</RequestId>\n    <MorePreamble>foo-id</RequestId>\n    <Sneaky><Error>These are not the errors you are looking for</Error></Sneaky>\n    <Error>\n        <Type>Sender</Type>\n        <Code>InvalidGreeting</Code>\n        <Message>Hi</Message>\n        <AnotherSetting>setting</AnotherSetting>\n        <Ignore><This/></Ignore>\n    </Error>\n    <RequestId>foo-id</RequestId>\n</ErrorResponse>\"#;\n        let mut doc = Document::try_from(xml).expect(\"valid\");\n        let mut error = error_scope(&mut doc).expect(\"contains error\");\n        let mut keys = vec![];\n        while let Some(tag) = error.next_tag() {\n            keys.push(tag.start_el().local().to_owned());\n            // read this the full contents of this element\n        }\n        assert_eq!(\n            keys,\n            vec![\"Type\", \"Code\", \"Message\", \"AnotherSetting\", \"Ignore\",]\n        )\n    }\n}\n"
  },
  {
    "path": "rust-runtime/inlineable/src/sdk_feature_tracker.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n#[allow(dead_code)]\npub(crate) mod rpc_v2_cbor {\n    use aws_smithy_runtime::client::sdk_feature::SmithySdkFeature;\n    use aws_smithy_runtime_api::box_error::BoxError;\n    use aws_smithy_runtime_api::client::interceptors::context::BeforeSerializationInterceptorContextMut;\n    use aws_smithy_runtime_api::client::interceptors::{dyn_dispatch_hint, Intercept};\n    use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents;\n    use aws_smithy_types::config_bag::ConfigBag;\n\n    #[derive(Debug)]\n    pub(crate) struct RpcV2CborFeatureTrackerInterceptor;\n\n    impl RpcV2CborFeatureTrackerInterceptor {\n        pub(crate) fn new() -> Self {\n            Self\n        }\n    }\n\n    #[dyn_dispatch_hint]\n    impl Intercept for RpcV2CborFeatureTrackerInterceptor {\n        fn name(&self) -> &'static str {\n            \"RpcV2CborFeatureTrackerInterceptor\"\n        }\n\n        fn modify_before_serialization(\n            &self,\n            _context: &mut BeforeSerializationInterceptorContextMut<'_>,\n            _runtime_components: &RuntimeComponents,\n            cfg: &mut ConfigBag,\n        ) -> Result<(), BoxError> {\n            cfg.interceptor_state()\n                .store_append::<SmithySdkFeature>(SmithySdkFeature::ProtocolRpcV2Cbor);\n            Ok(())\n        }\n    }\n}\n\n#[allow(dead_code)]\npub(crate) mod paginator {\n    use aws_smithy_runtime::client::sdk_feature::SmithySdkFeature;\n    use aws_smithy_runtime_api::box_error::BoxError;\n    use aws_smithy_runtime_api::client::interceptors::context::BeforeSerializationInterceptorContextMut;\n    use aws_smithy_runtime_api::client::interceptors::{\n        dyn_dispatch_hint, Intercept, SharedInterceptor,\n    };\n    use aws_smithy_runtime_api::client::runtime_components::{\n        RuntimeComponents, RuntimeComponentsBuilder,\n    };\n    use aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugin;\n    use aws_smithy_types::config_bag::ConfigBag;\n    use std::borrow::Cow;\n\n    #[derive(Debug)]\n    struct PaginatorFeatureTrackerInterceptor;\n\n    impl PaginatorFeatureTrackerInterceptor {\n        pub(crate) fn new() -> Self {\n            Self\n        }\n    }\n\n    #[dyn_dispatch_hint]\n    impl Intercept for PaginatorFeatureTrackerInterceptor {\n        fn name(&self) -> &'static str {\n            \"PaginatorFeatureTrackerInterceptor\"\n        }\n\n        fn modify_before_serialization(\n            &self,\n            _context: &mut BeforeSerializationInterceptorContextMut<'_>,\n            _runtime_components: &RuntimeComponents,\n            cfg: &mut ConfigBag,\n        ) -> Result<(), BoxError> {\n            cfg.interceptor_state()\n                .store_append::<SmithySdkFeature>(SmithySdkFeature::Paginator);\n            Ok(())\n        }\n    }\n\n    #[derive(Debug)]\n    pub(crate) struct PaginatorFeatureTrackerRuntimePlugin {\n        runtime_components: RuntimeComponentsBuilder,\n    }\n\n    impl PaginatorFeatureTrackerRuntimePlugin {\n        pub(crate) fn new() -> Self {\n            Self {\n                runtime_components: RuntimeComponentsBuilder::new(\n                    \"PaginatorFeatureTrackerRuntimePlugin\",\n                )\n                .with_interceptor(SharedInterceptor::permanent(\n                    PaginatorFeatureTrackerInterceptor::new(),\n                )),\n            }\n        }\n    }\n\n    impl RuntimePlugin for PaginatorFeatureTrackerRuntimePlugin {\n        fn runtime_components(\n            &self,\n            _: &RuntimeComponentsBuilder,\n        ) -> Cow<'_, RuntimeComponentsBuilder> {\n            Cow::Borrowed(&self.runtime_components)\n        }\n    }\n}\n\n#[allow(dead_code)]\npub(crate) mod waiter {\n    use aws_smithy_runtime::client::sdk_feature::SmithySdkFeature;\n    use aws_smithy_runtime_api::box_error::BoxError;\n    use aws_smithy_runtime_api::client::interceptors::context::BeforeSerializationInterceptorContextMut;\n    use aws_smithy_runtime_api::client::interceptors::{\n        dyn_dispatch_hint, Intercept, SharedInterceptor,\n    };\n    use aws_smithy_runtime_api::client::runtime_components::{\n        RuntimeComponents, RuntimeComponentsBuilder,\n    };\n    use aws_smithy_runtime_api::client::runtime_plugin::RuntimePlugin;\n    use aws_smithy_types::config_bag::ConfigBag;\n    use std::borrow::Cow;\n\n    #[derive(Debug)]\n    struct WaiterFeatureTrackerInterceptor;\n\n    impl WaiterFeatureTrackerInterceptor {\n        pub(crate) fn new() -> Self {\n            Self\n        }\n    }\n\n    #[dyn_dispatch_hint]\n    impl Intercept for WaiterFeatureTrackerInterceptor {\n        fn name(&self) -> &'static str {\n            \"WaiterFeatureTrackerInterceptor\"\n        }\n\n        fn modify_before_serialization(\n            &self,\n            _context: &mut BeforeSerializationInterceptorContextMut<'_>,\n            _runtime_components: &RuntimeComponents,\n            cfg: &mut ConfigBag,\n        ) -> Result<(), BoxError> {\n            cfg.interceptor_state()\n                .store_append::<SmithySdkFeature>(SmithySdkFeature::Waiter);\n            Ok(())\n        }\n    }\n\n    #[derive(Debug)]\n    pub(crate) struct WaiterFeatureTrackerRuntimePlugin {\n        runtime_components: RuntimeComponentsBuilder,\n    }\n\n    impl WaiterFeatureTrackerRuntimePlugin {\n        pub(crate) fn new() -> Self {\n            Self {\n                runtime_components: RuntimeComponentsBuilder::new(\n                    \"WaiterFeatureTrackerRuntimePlugin\",\n                )\n                .with_interceptor(SharedInterceptor::permanent(\n                    WaiterFeatureTrackerInterceptor::new(),\n                )),\n            }\n        }\n    }\n\n    impl RuntimePlugin for WaiterFeatureTrackerRuntimePlugin {\n        fn runtime_components(\n            &self,\n            _: &RuntimeComponentsBuilder,\n        ) -> Cow<'_, RuntimeComponentsBuilder> {\n            Cow::Borrowed(&self.runtime_components)\n        }\n    }\n}\n\n#[allow(dead_code)]\npub(crate) mod retry_mode {\n    use aws_smithy_runtime::client::sdk_feature::SmithySdkFeature;\n    use aws_smithy_runtime_api::box_error::BoxError;\n    use aws_smithy_runtime_api::client::interceptors::context::BeforeSerializationInterceptorContextRef;\n    use aws_smithy_runtime_api::client::interceptors::{dyn_dispatch_hint, Intercept};\n    use aws_smithy_runtime_api::client::runtime_components::RuntimeComponents;\n    use aws_smithy_types::config_bag::ConfigBag;\n    use aws_smithy_types::retry::{RetryConfig, RetryMode};\n\n    #[derive(Debug)]\n    pub(crate) struct RetryModeFeatureTrackerInterceptor;\n\n    impl RetryModeFeatureTrackerInterceptor {\n        pub(crate) fn new() -> Self {\n            Self\n        }\n    }\n\n    #[dyn_dispatch_hint]\n    impl Intercept for RetryModeFeatureTrackerInterceptor {\n        fn name(&self) -> &'static str {\n            \"RetryModeFeatureTrackerInterceptor\"\n        }\n\n        fn read_before_serialization(\n            &self,\n            _context: &BeforeSerializationInterceptorContextRef<'_>,\n            _runtime_components: &RuntimeComponents,\n            cfg: &mut ConfigBag,\n        ) -> Result<(), BoxError> {\n            cfg.load::<RetryConfig>()\n                .map(|retry_config| match retry_config.mode() {\n                    RetryMode::Standard => SmithySdkFeature::RetryModeStandard,\n                    RetryMode::Adaptive => SmithySdkFeature::RetryModeAdaptive,\n                    _ => unreachable!(\"retry mode must be standard or adaptive\"),\n                })\n                .map(|feature| {\n                    cfg.interceptor_state()\n                        .store_append::<SmithySdkFeature>(feature)\n                });\n\n            Ok(())\n        }\n    }\n}\n"
  },
  {
    "path": "rust-runtime/inlineable/src/serialization_settings.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n#![allow(dead_code)]\n\nuse aws_smithy_http::header::set_request_header_if_absent;\nuse aws_smithy_types::config_bag::{Storable, StoreReplace};\nuse http_1x::header::{HeaderName, CONTENT_LENGTH, CONTENT_TYPE};\n\n/// Configuration for how default protocol headers are serialized\n#[derive(Clone, Debug, Default)]\npub(crate) struct HeaderSerializationSettings {\n    omit_default_content_length: bool,\n    omit_default_content_type: bool,\n}\n\nimpl HeaderSerializationSettings {\n    /// Creates new [`HeaderSerializationSettings`]\n    pub(crate) fn new() -> Self {\n        Default::default()\n    }\n\n    /// Omit the default `Content-Length` header during serialization\n    pub(crate) fn omit_default_content_length(self) -> Self {\n        Self {\n            omit_default_content_length: true,\n            ..self\n        }\n    }\n\n    /// Omit the default `Content-Type` header during serialization\n    pub(crate) fn omit_default_content_type(self) -> Self {\n        Self {\n            omit_default_content_type: true,\n            ..self\n        }\n    }\n\n    /// Returns true if the given default header name should be serialized\n    fn include_header(&self, header: &HeaderName) -> bool {\n        (!self.omit_default_content_length || header != CONTENT_LENGTH)\n            && (!self.omit_default_content_type || header != CONTENT_TYPE)\n    }\n\n    /// Sets a default header on the given request builder if it should be serialized\n    pub(crate) fn set_default_header(\n        &self,\n        mut request: http_1x::request::Builder,\n        header_name: HeaderName,\n        value: &str,\n    ) -> http_1x::request::Builder {\n        if self.include_header(&header_name) {\n            request = set_request_header_if_absent(request, header_name, value);\n        }\n        request\n    }\n}\n\nimpl Storable for HeaderSerializationSettings {\n    type Storer = StoreReplace<Self>;\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n\n    #[test]\n    fn test_include_header() {\n        let settings = HeaderSerializationSettings::default();\n        assert!(settings.include_header(&CONTENT_LENGTH));\n        assert!(settings.include_header(&CONTENT_TYPE));\n\n        let settings = HeaderSerializationSettings::default().omit_default_content_length();\n        assert!(!settings.include_header(&CONTENT_LENGTH));\n        assert!(settings.include_header(&CONTENT_TYPE));\n\n        let settings = HeaderSerializationSettings::default().omit_default_content_type();\n        assert!(settings.include_header(&CONTENT_LENGTH));\n        assert!(!settings.include_header(&CONTENT_TYPE));\n\n        let settings = HeaderSerializationSettings::default()\n            .omit_default_content_type()\n            .omit_default_content_length();\n        assert!(!settings.include_header(&CONTENT_LENGTH));\n        assert!(!settings.include_header(&CONTENT_TYPE));\n    }\n}\n"
  },
  {
    "path": "rust-toolchain.toml",
    "content": "[toolchain]\nchannel = \"1.91.1\"\n"
  },
  {
    "path": "settings.gradle.kts",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nrootProject.name = \"smithy-rs\"\n\ninclude(\":codegen-core\")\ninclude(\":codegen-client\")\ninclude(\":codegen-client-test\")\ninclude(\":codegen-server\")\ninclude(\":codegen-serde\")\ninclude(\":codegen-server:codegen-server-python\")\ninclude(\":codegen-server:codegen-server-typescript\")\ninclude(\":codegen-server-test\")\n// NOTE these have to be named differently or otherwise have different GAV coordinates\n// due to https://github.com/gradle/gradle/issues/847\ninclude(\":codegen-server-test:codegen-server-test-python\")\ninclude(\":codegen-server-test:codegen-server-test-typescript\")\ninclude(\":codegen-traits\")\ninclude(\":rust-runtime\")\ninclude(\":aws:rust-runtime\")\n// NOTE: we rename the aws/rust-runtime project so that it ends up with different GAV\n// coordinates otherwise it will conflict with the generic runtime which has coordinates\n// `software.amazon.smithy.rust:rust-runtime`.\nproject(\":aws:rust-runtime\").name = \"aws-rust-runtime\"\ninclude(\":aws:sdk\")\ninclude(\":aws:sdk-adhoc-test\")\ninclude(\":aws:codegen-aws-sdk\")\ninclude(\":fuzzgen\")\n"
  },
  {
    "path": "tools/.cargo/config.toml",
    "content": "[build]\n# Tools shouldn't share `target` with the rest of the project to\n# avoid thrash from differing compiler flags\ntarget-dir = \"target\"\n"
  },
  {
    "path": "tools/__init__.py",
    "content": "#  Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n#  SPDX-License-Identifier: Apache-2.0\n"
  },
  {
    "path": "tools/ci-build/.dockerignore",
    "content": "target/\n*.md\n.github/\ndesign/\nexamples/\n"
  },
  {
    "path": "tools/ci-build/Dockerfile",
    "content": "#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\n\n# This is the base Docker build image used by CI\n\nARG base_image=public.ecr.aws/amazonlinux/amazonlinux:2023\nARG rust_stable_version=1.91.1\nARG rust_nightly_version=nightly-2025-10-18\n\nFROM ${base_image} AS bare_base_image\nRUN yum -y updateinfo && yum clean all && rm -rf /var/cache/yum\n\nFROM bare_base_image as musl_toolchain\nRUN yum -y install --allowerasing tar gzip gcc make && \\\n    curl https://musl.libc.org/releases/musl-1.2.5.tar.gz -o musl-1.2.5.tar.gz && \\\n    tar xzf musl-1.2.5.tar.gz && \\\n    (cd musl-1.2.5 && ./configure && make install) && \\\n    rm -rf musl-1.2.5* && \\\n    yum clean all && rm -rf /var/cache/yum\n\n#\n# Rust & Tools Installation Stage\n#\nFROM bare_base_image AS install_rust\nARG rust_stable_version\nARG rust_nightly_version\nENV RUSTUP_HOME=/opt/rustup \\\n    CARGO_HOME=/opt/cargo \\\n    PATH=/opt/cargo/bin/:${PATH} \\\n    CARGO_INCREMENTAL=0 \\\n    GRADLE_USER_HOME=/home/build/.gradle\n\n# This complicated setup is necessary to keep the docker build working on aarch64 laptops\n# since we now actually use JAVA_HOME in the build (to cache the gradle binary)\nRUN set -eux; \\\n    ARCH=\"$(uname -m)\"; \\\n    case \"${ARCH}\" in \\\n        aarch64|arm64) \\\n            echo \"export JAVA_HOME=/usr/lib/jvm/java-17-amazon-corretto.aarch64\" >> /etc/profile.d/java_home.sh; \\\n            ;; \\\n        x86_64) \\\n            echo \"export JAVA_HOME=/usr/lib/jvm/java-17-amazon-corretto.x86_64\" >> /etc/profile.d/java_home.sh; \\\n            ;; \\\n        *) \\\n            echo \"Unsupported architecture: ${ARCH}\"; \\\n            exit 1; \\\n            ;; \\\n    esac\n\nWORKDIR /root\nRUN yum -y install --allowerasing \\\n        autoconf \\\n        automake \\\n        binutils \\\n        ca-certificates \\\n        cmake \\\n        curl \\\n        gcc \\\n        gcc-c++ \\\n        git \\\n        java-17-amazon-corretto-devel \\\n        make \\\n        openssl-devel \\\n        perl \\\n        pkgconfig \\\n        tar \\\n        xz && \\\n    yum clean all && rm -rf /var/cache/yum && \\\n    set -eux; \\\n    if [[ \"$(uname -m)\" == \"aarch64\" || \"$(uname -m)\" == \"arm64\" ]]; then \\\n        curl https://static.rust-lang.org/rustup/archive/1.24.3/aarch64-unknown-linux-gnu/rustup-init --output rustup-init; \\\n        echo \"32a1532f7cef072a667bac53f1a5542c99666c4071af0c9549795bbdb2069ec1 rustup-init\" | sha256sum --check; \\\n    else \\\n        curl https://static.rust-lang.org/rustup/archive/1.24.3/x86_64-unknown-linux-gnu/rustup-init --output rustup-init; \\\n        echo \"3dc5ef50861ee18657f9db2eeb7392f9c2a6c95c90ab41e45ab4ca71476b4338 rustup-init\" | sha256sum --check; \\\n    fi; \\\n    chmod +x rustup-init; \\\n    ./rustup-init -y --no-modify-path --profile minimal --default-toolchain ${rust_stable_version}; \\\n    rm rustup-init; \\\n    rustup --version; \\\n    rustup component add rustfmt; \\\n    rustup component add clippy; \\\n    rustup toolchain install ${rust_nightly_version} --component clippy; \\\n    rustup target add x86_64-unknown-linux-musl; \\\n    rustup target add wasm32-unknown-unknown; \\\n    rustup target add wasm32-wasip1; \\\n    rustup target add wasm32-wasip2; \\\n    cargo --version; \\\n    cargo +${rust_nightly_version} --version;\n\nFROM install_rust AS gradle_wrapper\n# Commit/branch to checkout for gradle wrapper\nARG smithy_rs_commit_hash=main\nENV GRADLE_USER_HOME=/opt/gradle\nWORKDIR /opt/gradle\nRUN set -eux; \\\n    source /etc/profile.d/java_home.sh; \\\n    git init smithy-rs && cd smithy-rs; \\\n    git remote add origin https://github.com/smithy-lang/smithy-rs.git; \\\n    git sparse-checkout init --cone; \\\n    git sparse-checkout set gradlew gradle/wrapper gradle.properties buildSrc; \\\n    git fetch --depth=1 origin ${smithy_rs_commit_hash}; \\\n    git checkout FETCH_HEAD; \\\n    # Run the gradle wrapper with no args to download the gradle binary and cache it in the image\n    ./gradlew; \\\n    cd ..; \\\n    rm -rf smithy-rs\n\nFROM install_rust AS local_tools\nARG rust_nightly_version\nCOPY . tools/ci-build\nRUN cargo install --locked --path tools/ci-build/changelogger && \\\n    cargo install --locked --path tools/ci-build/crate-hasher && \\\n    cargo install --locked --path tools/ci-build/difftags && \\\n    cargo install --locked --path tools/ci-build/publisher && \\\n    cargo install --locked --path tools/ci-build/runtime-versioner && \\\n    cargo install --locked --path tools/ci-build/sdk-lints && \\\n    cargo install --locked --path tools/ci-build/sdk-lockfiles && \\\n    cargo install --locked --path tools/ci-build/sdk-versioner && \\\n    chmod g+rw -R /opt/cargo/registry && \\\n    rm -rf /opt/cargo/registry/src && \\\n    rm -rf /opt/cargo/git/db && \\\n    rm -rf /root/.cargo/registry/cache\n\nFROM install_rust AS cargo_tools\nARG cargo_deny_version=0.16.4\nARG cargo_udeps_version=0.1.56\nARG cargo_hack_version=0.6.27\nARG cargo_minimal_versions_version=0.1.27\nARG cargo_check_external_types_version=0.4.0\nARG maturin_version=1.5.1\nARG wasm_pack_version=0.13.1\nARG cargo_wasmtime_version=38.0.4\nARG cargo_component_version=0.20.0\nARG cargo_semver_checks_version=0.46.0\nARG cargo_mdbook_version=0.4.37\nARG cargo_mdbook_mermaid_version=0.13.0\nARG rust_nightly_version\nRUN cargo install cargo-deny --locked --version ${cargo_deny_version} && \\\n    cargo +${rust_nightly_version} install cargo-udeps --locked --version ${cargo_udeps_version} && \\\n    cargo install cargo-hack --locked --version ${cargo_hack_version} && \\\n    cargo install cargo-minimal-versions --locked --version ${cargo_minimal_versions_version} && \\\n    cargo install cargo-check-external-types --locked --version ${cargo_check_external_types_version} && \\\n    cargo install maturin --locked --version ${maturin_version} && \\\n    cargo install wasm-pack --locked --version ${wasm_pack_version} && \\\n    cargo install wasmtime-cli --features=\"component-model\" --locked --version ${cargo_wasmtime_version} && \\\n    cargo +${rust_nightly_version} install cargo-component --locked --version ${cargo_component_version} && \\\n    cargo install cargo-semver-checks --locked --version ${cargo_semver_checks_version} && \\\n    cargo install mdbook --locked --version ${cargo_mdbook_version} && \\\n    cargo install mdbook-mermaid --locked --version ${cargo_mdbook_mermaid_version} && \\\n    rm -rf /opt/cargo/registry/src && \\\n    rm -rf /opt/cargo/git/db && \\\n    rm -rf /root/.cargo/registry/cache\n\n# nodejs needed by internal release process\nFROM install_rust AS nodejs\nARG node_version=v22.12.0\nENV NODE_HOME=/opt/nodejs \\\n    PATH=/opt/nodejs/bin:${PATH}\nRUN set -eux; \\\n    # Determine architecture and set download URL + checksum\n    ARCH=\"$(uname -m)\"; \\\n    case \"${ARCH}\" in \\\n        aarch64|arm64) \\\n            NODE_URL=\"https://nodejs.org/dist/${node_version}/node-${node_version}-linux-arm64.tar.xz\"; \\\n            NODE_CHECKSUM=\"8cfd5a8b9afae5a2e0bd86b0148ca31d2589c0ea669c2d0b11c132e35d90ed68\"; \\\n            ;; \\\n        x86_64) \\\n            NODE_URL=\"https://nodejs.org/dist/${node_version}/node-${node_version}-linux-x64.tar.xz\"; \\\n            NODE_CHECKSUM=\"22982235e1b71fa8850f82edd09cdae7e3f32df1764a9ec298c72d25ef2c164f\"; \\\n            ;; \\\n        *) \\\n            echo \"Unsupported architecture: ${ARCH}\"; \\\n            exit 1; \\\n            ;; \\\n    esac; \\\n    # Download and verify Node.js\n    curl -fsSL \"${NODE_URL}\" -o node.tar.xz; \\\n    echo \"${NODE_CHECKSUM}  node.tar.xz\" | sha256sum --check; \\\n    # Extract and install\n    mkdir -p \"${NODE_HOME}\"; \\\n    tar -xJf node.tar.xz -C \"${NODE_HOME}\" --strip-components=1; \\\n    rm node.tar.xz; \\\n    # Verify installation\n    node --version; \\\n    npm --version;\n\n#\n# Final image\n#\n# `clang` needed by SDK examples for `libxlsxwriter-sys`\nFROM bare_base_image AS final_image\nARG rust_stable_version\nARG rust_nightly_version\nRUN set -eux; \\\n    yum -y install --allowerasing \\\n        bc \\\n        ca-certificates \\\n        clang \\\n        cmake \\\n        gcc \\\n        git \\\n        glibc-langpack-en \\\n        go \\\n        java-17-amazon-corretto-devel \\\n        jq \\\n        make \\\n        openssl-devel \\\n        pkgconfig \\\n        python3 \\\n        python3-devel \\\n        python3-pip \\\n        shadow-utils \\\n        tar \\\n        unzip && \\\n    yum clean all && \\\n    rm -rf /var/cache/yum && \\\n    groupadd build && \\\n    useradd -m -g build build && \\\n    chmod 775 /home/build && \\\n    cd /tmp && \\\n    curl 'https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip' -o awscliv2.zip && \\\n    unzip awscliv2.zip && \\\n    ./aws/install && \\\n    rm -rf awscliv2.zip aws && \\\n    pip3 install --no-cache-dir mypy==0.991\n\nCOPY --chown=build:build --from=musl_toolchain /usr/local/musl/ /usr/local/musl/\nCOPY --chown=build:build --from=local_tools /opt/cargo /opt/cargo\nCOPY --chown=build:build --from=install_rust /opt/rustup /opt/rustup\nCOPY --chown=build:build --from=gradle_wrapper /opt/gradle /home/build/.gradle\nCOPY --chown=build:build --from=cargo_tools /opt/cargo/bin/ /opt/cargo/bin/\nCOPY --chown=build:build --from=nodejs /opt/nodejs /opt/nodejs\nENV PATH=/opt/nodejs/bin:/opt/cargo/bin:$PATH:/usr/local/musl/bin/ \\\n    NODE_HOME=/opt/nodejs \\\n    CARGO_HOME=/opt/cargo \\\n    RUSTUP_HOME=/opt/rustup \\\n    RUST_STABLE_VERSION=${rust_stable_version} \\\n    RUST_NIGHTLY_VERSION=${rust_nightly_version} \\\n    CARGO_INCREMENTAL=0 \\\n    GRADLE_USER_HOME=/home/build/.gradle \\\n    LANG=en_US.UTF-8 \\\n    LC_ALL=en_US.UTF-8\n# SMITHY_RS_DOCKER_BUILD_IMAGE indicates to build scripts that they are being built inside of the Docker build image.\n# This is used primarily by the `build.gradle.kts` files in choosing how to execute build tools. If inside the image,\n# they will assume the tools are on the PATH, but if outside of the image, they will `cargo run` the tools.\nENV SMITHY_RS_DOCKER_BUILD_IMAGE=1\nWORKDIR /home/build\n# RUSTUP_TOOLCHAIN takes precedence over everything except `+<toolchain>` args. This will allow us to ignore the toolchain\n# file during CI, avoiding issues during Rust version upgrades.\nENV RUSTUP_TOOLCHAIN=${rust_stable_version}\nCOPY sanity-test /home/build/sanity-test\nRUN /home/build/sanity-test\n"
  },
  {
    "path": "tools/ci-build/README.md",
    "content": "ci-build\n========\n\nThis directory includes everything to build the build/release/CI Docker image.\n- `Dockerfile`: Dockerfile used to create the base build image. Needs to be in `tools/ci-build` so that it\n  can copy all the tools source code into the image at build time.\n- `add-local-user.dockerfile`: Creates a user in the build image with the host's user ID\n- `build.docker-compose.yml`: Docker Compose file for using the build image\n- `ci-action`: Script for running CI actions inside the Docker build image\n- `ci-create-workspace`: Used by `ci-action`, but can be run manually to create a one-off workspace for debugging\n- `sanity-test`: Script that sanity tests the Docker build image\n- Other directories include various tools written in Rust for build/release/CI\n\nThere are three spaces you need to conceptualize for testing this locally:\n- **Origin:** The original `smithy-rs` where you're iterating on CI scripts.\n- **Starting space:** Directory with `smithy-rs` to run CI checks against. You have to create this. Conceptually,\n  this is equivalent to the GitHub Actions working directory.\n- **Action space:** Temporary directory maintained by `ci-action` where the CI checks actually run.\n\nTo create the starting space, do the following:\n\n```bash\ncd /path/to/my/starting-space\ngit clone https://github.com/smithy-lang/smithy-rs.git\n# Optionally check out the revision you want to work with in the checked out smithy-rs.\n# Just make sure you are in /path/to/my/starting-space (or whatever you called it) after.\n```\n\nThen you can test CI against that starting space by running:\n```bash\n$ORIGIN_PATH/tools/ci-build/ci-action <action> [args...]\n```\n\nThe action names are the names of the scripts in `tools/ci-scripts/`, and `[args...]` get forwarded to those scripts.\n\n__Note:__ `ci-action` does not rebuild the build image, so if you modified a script,\nyou need to run `./acquire-build-image` from the origin `.github/scripts` path.\n"
  },
  {
    "path": "tools/ci-build/add-local-user.dockerfile",
    "content": "#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\n\n# The base image adds a non-root `build` user and creates a home directory for it,\n# but this `build` user's user ID might not match the user ID that is executing the\n# Docker image.\n#\n# This `add-local-user.dockerfile` image creates a `localuser` with a group ID that\n# matches the group ID of the user that will execute it. That way, any build artifacts,\n# Gradle caches, or Cargo/Rust caches will not require root access to manipulate after\n# Docker execution is completed.\n\nFROM smithy-rs-base-image:local AS bare_base_image\n\nARG USER_ID\nUSER root\nRUN useradd -l -u ${USER_ID} -G build -o -s /bin/bash localbuild || \\\n    { exit_code=$?; [ $exit_code -eq 9 ] && echo \"User localbuild already exists, continuing...\" || \\\n    { echo \"Failed to create user with error code: $exit_code\"; exit $exit_code; }; }\nUSER localbuild\nRUN /home/build/sanity-test\n"
  },
  {
    "path": "tools/ci-build/build.docker-compose.yml",
    "content": "#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\nversion: '3.9'\nservices:\n  smithy-rs-build:\n    image: smithy-rs-build-image:latest\n    environment:\n      RUSTDOCFLAGS: -D warnings\n      # TODO(https://github.com/smithy-lang/smithy-rs/issues/4122): Remove the allowed lints once fixed in the server runtime crates\n      RUSTFLAGS: -D warnings -A clippy::redundant_closure -A non_local_definitions\n    user: ${USER_ID}:build\n    volumes:\n    - type: bind\n      source: ./workspace\n      target: /home/build/workspace\n    - type: bind\n      source: ${GRADLE_CACHE_PATH}\n      target: /home/build/.gradle\n    command: [/bin/bash, -c, --, sleep infinity]\n"
  },
  {
    "path": "tools/ci-build/changelogger/Cargo.toml",
    "content": "[package]\nname = \"changelogger\"\nversion = \"0.3.2\"\nauthors = [\"AWS Rust SDK Team <aws-sdk-rust@amazon.com>\"]\ndescription = \"A CLI tool render and update changelogs from changelog files\"\nedition = \"2021\"\nlicense = \"Apache-2.0\"\npublish = false\n\n# Having this here prevents this tool from being included in a higher-level workspace\n[workspace]\n\n[profile.release]\n# prefer fast compile time over runtime performance\nopt-level = 0\n\n[dependencies]\nanyhow = \"1.0.57\"\nclap = { version = \"~3.2.1\", features = [\"derive\"] }\nedit = \"0.1\"\nordinal = \"0.3.2\"\nserde = { version = \"1\", features = [\"derive\"]}\nserde_json = \"1\"\nserde_yaml = \"0.9\"\nsmithy-rs-tool-common = { path = \"../smithy-rs-tool-common\" }\ntime = { version = \"0.3.9\", features = [\"local-offset\"]}\ntoml = \"0.5.8\"\n\n[dev-dependencies]\npretty_assertions = \"1.3\"\ntempfile = \"3.16.0\"\n"
  },
  {
    "path": "tools/ci-build/changelogger/README.md",
    "content": "# ChangeLogger\n\nThe ChangeLogger tool generates public facing `.md` changelogs from the individual changelog entry Markdown files stored in the `.changelog` directory. The changelogger runs during smithy-rs releases to generate the smithy-rs specific changelog as well as during SDK releases to generate the SDK changelog. The smithy-rs changelog generation duplicates the AWS changelog entries into a separate file so that they can later be consumed.\n\n[smithy-rs-maintainers.txt](./smithy-rs-maintainers.txt) controls the set of users that is **not** acknowledged for their contributions in changelogs.\n\n## Commands\n### Ls\nDisplay a preview of pending changelog entries (either for `smithy-rs` or for `aws-sdk-rust`) since the last release to standard output.\n\nThis command is intended for developer use.\n\n### New\nCreate a new changelog entry Markdown file in the `.changelog` directory.\n\nThis command is intended for developer use.\n\n### Render\nRender a `.md` format changelog from changelog entry Markdown files stored in the `.changelog` directory.\n\nThis command is intended for automation and invoked as part of `smithy-rs-release`.\n\n### Split\nDuplicate `aws-sdk-rust` entries from those in the `.changelog` directory into `aws/SDK_CHANGELOG.next.json`, which is a prestep to full changelog generation.\n\nThis command is intended for automation and invoked as part of `smithy-rs-release`.\n\n## Installation\nTo install, run the following from this README path:\n```\n$ cargo install --locked --path .\n```\nConfirm the installation:\n```\n$ changelogger --version\n```\n\n## How to Use\n### Ls\nTo preview changelog entries for an upcoming release in `smithy-rs`:\n```\n$ changelogger ls --change-set smithy-rs\n```\nTo preview changelog entries for an upcoming release in `aws-sdk-rust`:\n```\n$ changelogger ls --change-set aws-sdk\n```\n\n### New\nAn example usage:\n```\n$ changelogger new \\\n  --applies-to client \\\n  --applies-to aws-sdk-rust \\\n  --references smithy-rs#1234 \\\n  --authors someone \\\n  --bug-fix \\\n  --message \"Some changelog for \\`foo\\`\"\n\nThe following changelog entry has been written to \"<smithy-rs root>/.changelog/8814816.md\":\n---\napplies_to:\n- aws-sdk-rust\n- client\nauthors:\n- someone\nreferences:\n- smithy-rs#1234\nbreaking: false\nnew_feature: false\nbug_fix: true\n---\nSome changelog for `foo`\n```\n\nThe following CLI arguments are \"logically\" required\n- `--applies-to`\n- `--authors`\n- `--references`\n- `--message`\n\nIf any of the above is not passed a value at command line, then the user's editor is opened for further edit (which editor to open can be configured per the [edit crate](https://docs.rs/edit/0.1.5/edit/)).\n"
  },
  {
    "path": "tools/ci-build/changelogger/smithy-rs-maintainers.txt",
    "content": "aws-sdk-rust-ci\njdisanti\nrcoh\nysaito1001\ndrganjoo\nrschmitt\nrhernandez35\naajtodd\nlandonxjames\nvcjana\njasgin\n"
  },
  {
    "path": "tools/ci-build/changelogger/src/entry.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse anyhow::{bail, Result};\nuse clap::clap_derive::ArgEnum;\nuse smithy_rs_tool_common::changelog::{Changelog, HandAuthoredEntry, SdkModelEntry};\nuse smithy_rs_tool_common::git::Git;\nuse smithy_rs_tool_common::versions_manifest::VersionsManifest;\nuse std::fmt::{Display, Formatter};\nuse std::path::Path;\n\n#[derive(ArgEnum, Copy, Clone, Debug, Eq, PartialEq)]\npub enum ChangeSet {\n    SmithyRs,\n    AwsSdk,\n}\n\nimpl Display for ChangeSet {\n    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {\n        write!(\n            f,\n            \"{}\",\n            match self {\n                ChangeSet::SmithyRs => \"smithy-rs\",\n                ChangeSet::AwsSdk => \"aws-sdk-rust\",\n            }\n        )\n    }\n}\n\npub struct ChangelogEntries {\n    pub aws_sdk_rust: Vec<ChangelogEntry>,\n    pub smithy_rs: Vec<ChangelogEntry>,\n}\n\nimpl ChangelogEntries {\n    pub fn filter(\n        self,\n        smithy_rs: &dyn Git,\n        change_set: ChangeSet,\n        previous_release_versions_manifest: Option<&Path>,\n    ) -> Result<Vec<ChangelogEntry>> {\n        match change_set {\n            ChangeSet::AwsSdk => {\n                if let Some(manifest_path) = previous_release_versions_manifest {\n                    let manifest = VersionsManifest::from_file(manifest_path)?;\n                    let revisions =\n                        smithy_rs.rev_list(\"HEAD\", &manifest.smithy_rs_revision, None)?;\n                    Ok(self\n                        .aws_sdk_rust\n                        .into_iter()\n                        .filter(|entry| match entry {\n                            ChangelogEntry::AwsSdkModel(_) => true,\n                            ChangelogEntry::HandAuthored(entry) => {\n                                if let Some(since_commit) = &entry.since_commit {\n                                    revisions.iter().any(|rev| rev.as_ref() == since_commit)\n                                } else {\n                                    true\n                                }\n                            }\n                        })\n                        .collect())\n                } else {\n                    if self.aws_sdk_rust.iter().any(|entry| {\n                        entry.hand_authored().map(|e| e.since_commit.is_some()) == Some(true)\n                    }) {\n                        bail!(\"SDK changelog entries have `since_commit` information, but no previous release versions manifest was given\");\n                    }\n                    Ok(self.aws_sdk_rust)\n                }\n            }\n            ChangeSet::SmithyRs => Ok(self.smithy_rs),\n        }\n    }\n}\n\nimpl From<Changelog> for ChangelogEntries {\n    fn from(mut changelog: Changelog) -> Self {\n        changelog.aws_sdk_rust.sort_by_key(|entry| !entry.meta.tada);\n        changelog.sdk_models.sort_by(|a, b| a.module.cmp(&b.module));\n        changelog.smithy_rs.sort_by_key(|entry| !entry.meta.tada);\n\n        ChangelogEntries {\n            smithy_rs: changelog\n                .smithy_rs\n                .into_iter()\n                .map(ChangelogEntry::HandAuthored)\n                .collect(),\n            aws_sdk_rust: changelog\n                .aws_sdk_rust\n                .into_iter()\n                .map(ChangelogEntry::HandAuthored)\n                .chain(\n                    changelog\n                        .sdk_models\n                        .into_iter()\n                        .map(ChangelogEntry::AwsSdkModel),\n                )\n                .collect(),\n        }\n    }\n}\n\n#[derive(Clone, Debug)]\npub enum ChangelogEntry {\n    HandAuthored(HandAuthoredEntry),\n    AwsSdkModel(SdkModelEntry),\n}\n\nimpl ChangelogEntry {\n    pub fn hand_authored(&self) -> Option<&HandAuthoredEntry> {\n        match self {\n            ChangelogEntry::HandAuthored(hand_authored) => Some(hand_authored),\n            _ => None,\n        }\n    }\n\n    pub fn aws_sdk_model(&self) -> Option<&SdkModelEntry> {\n        match self {\n            ChangelogEntry::AwsSdkModel(sdk_model) => Some(sdk_model),\n            _ => None,\n        }\n    }\n}\n"
  },
  {
    "path": "tools/ci-build/changelogger/src/lib.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npub mod entry;\npub mod ls;\npub mod new;\npub mod render;\npub mod split;\n"
  },
  {
    "path": "tools/ci-build/changelogger/src/ls.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::entry::{ChangeSet, ChangelogEntries};\nuse crate::render::render;\nuse anyhow::Context;\nuse clap::Parser;\nuse smithy_rs_tool_common::changelog::{ChangelogLoader, ValidationSet};\nuse smithy_rs_tool_common::git::find_git_repository_root;\nuse smithy_rs_tool_common::here;\nuse smithy_rs_tool_common::versions_manifest::CrateVersionMetadataMap;\n\n#[derive(Parser, Debug, Eq, PartialEq)]\npub struct LsArgs {\n    /// Which set of changes to preview\n    #[clap(long, short, action)]\n    pub change_set: ChangeSet,\n}\n\npub fn subcommand_ls(args: LsArgs) -> anyhow::Result<()> {\n    let mut dot_changelog = find_git_repository_root(\"smithy-rs\", \".\").context(here!())?;\n    dot_changelog.push(\".changelog\");\n\n    let loader = ChangelogLoader::default();\n    let changelog = loader.load_from_dir(dot_changelog.clone())?;\n\n    changelog.validate(ValidationSet::Render).map_err(|errs| {\n        anyhow::Error::msg(format!(\n            \"failed to load {dot_changelog:?}: {errors}\",\n            errors = errs.join(\"\\n\")\n        ))\n    })?;\n\n    let entries = ChangelogEntries::from(changelog);\n\n    let (release_header, release_notes) = render(\n        match args.change_set {\n            ChangeSet::SmithyRs => &entries.smithy_rs,\n            ChangeSet::AwsSdk => &entries.aws_sdk_rust,\n        },\n        CrateVersionMetadataMap::new(),\n        &format!(\"\\nNext changelog preview for {}\", args.change_set),\n    );\n\n    println!(\"{release_header}{release_notes}\");\n\n    Ok(())\n}\n"
  },
  {
    "path": "tools/ci-build/changelogger/src/main.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse anyhow::Result;\nuse changelogger::ls::subcommand_ls;\nuse changelogger::new::subcommand_new;\nuse changelogger::render::subcommand_render;\nuse changelogger::split::subcommand_split;\nuse clap::{Parser, Subcommand};\n\n#[derive(Parser, Debug, Eq, PartialEq)]\n#[clap(name = \"changelogger\", author, version, about)]\npub struct Args {\n    #[clap(subcommand)]\n    command: Command,\n}\n\n#[derive(Subcommand, Debug, Eq, PartialEq)]\nenum Command {\n    /// Create a new changelog entry Markdown file in the `smithy-rs/.changelog` directory\n    #[clap(visible_alias(\"n\"))]\n    New(changelogger::new::NewArgs),\n    /// Render a preview of changelog entries since the last release\n    #[clap(visible_alias(\"l\"))]\n    Ls(changelogger::ls::LsArgs),\n    /// Render a TOML/JSON changelog into GitHub-flavored Markdown\n    Render(changelogger::render::RenderArgs),\n    /// Split SDK changelog entries into a separate file\n    Split(changelogger::split::SplitArgs),\n}\n\nfn main() -> Result<()> {\n    use Command::*;\n    match Args::parse().command {\n        New(new) => subcommand_new(new),\n        Ls(ls) => subcommand_ls(ls),\n        Render(render) => subcommand_render(&render),\n        Split(split) => subcommand_split(&split),\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::{Args, Command};\n    use changelogger::entry::ChangeSet;\n    use changelogger::ls::LsArgs;\n    use changelogger::new::NewArgs;\n    use changelogger::render::RenderArgs;\n    use changelogger::split::SplitArgs;\n    use clap::Parser;\n    use smithy_rs_tool_common::changelog::{Reference, Target};\n    use std::path::PathBuf;\n    use std::str::FromStr;\n\n    #[test]\n    fn args_parsing() {\n        assert_eq!(\n            Args {\n                command: Command::Split(SplitArgs {\n                    source: PathBuf::from(\"fromplace\"),\n                    destination: PathBuf::from(\"someplace\"),\n                    since_commit: None,\n                    smithy_rs_location: None,\n                })\n            },\n            Args::try_parse_from([\n                \"./changelogger\",\n                \"split\",\n                \"--source\",\n                \"fromplace\",\n                \"--destination\",\n                \"someplace\"\n            ])\n            .unwrap()\n        );\n\n        assert_eq!(\n            Args {\n                command: Command::Render(RenderArgs {\n                    change_set: ChangeSet::SmithyRs,\n                    independent_versioning: false,\n                    source: vec![PathBuf::from(\"fromplace\")],\n                    changelog_output: PathBuf::from(\"some-changelog\"),\n                    source_to_truncate: Some(PathBuf::from(\"fromplace\")),\n                    release_manifest_output: Some(PathBuf::from(\"some-manifest\")),\n                    current_release_versions_manifest: None,\n                    previous_release_versions_manifest: None,\n                    date_override: None,\n                    smithy_rs_location: None,\n                    aws_sdk_rust_location: None,\n                })\n            },\n            Args::try_parse_from([\n                \"./changelogger\",\n                \"render\",\n                \"--change-set\",\n                \"smithy-rs\",\n                \"--source\",\n                \"fromplace\",\n                \"--source-to-truncate\",\n                \"fromplace\",\n                \"--changelog-output\",\n                \"some-changelog\",\n                \"--release-manifest-output\",\n                \"some-manifest\"\n            ])\n            .unwrap()\n        );\n\n        assert_eq!(\n            Args {\n                command: Command::Render(RenderArgs {\n                    change_set: ChangeSet::AwsSdk,\n                    independent_versioning: true,\n                    source: vec![\n                        PathBuf::from(\"fromplace\"),\n                        PathBuf::from(\"fromanotherplace\")\n                    ],\n                    changelog_output: PathBuf::from(\"some-changelog\"),\n                    source_to_truncate: Some(PathBuf::from(\"fromplace\")),\n                    release_manifest_output: None,\n                    current_release_versions_manifest: None,\n                    previous_release_versions_manifest: None,\n                    date_override: None,\n                    smithy_rs_location: None,\n                    aws_sdk_rust_location: Some(PathBuf::from(\"aws-sdk-rust-location\")),\n                })\n            },\n            Args::try_parse_from([\n                \"./changelogger\",\n                \"render\",\n                \"--change-set\",\n                \"aws-sdk\",\n                \"--independent-versioning\",\n                \"--source\",\n                \"fromplace\",\n                \"--source\",\n                \"fromanotherplace\",\n                \"--source-to-truncate\",\n                \"fromplace\",\n                \"--changelog-output\",\n                \"some-changelog\",\n                \"--aws-sdk-rust-location\",\n                \"aws-sdk-rust-location\",\n            ])\n            .unwrap()\n        );\n\n        assert_eq!(\n            Args {\n                command: Command::Render(RenderArgs {\n                    change_set: ChangeSet::AwsSdk,\n                    independent_versioning: true,\n                    source: vec![PathBuf::from(\"fromplace\")],\n                    changelog_output: PathBuf::from(\"some-changelog\"),\n                    source_to_truncate: Some(PathBuf::from(\"fromplace\")),\n                    release_manifest_output: None,\n                    current_release_versions_manifest: None,\n                    previous_release_versions_manifest: Some(PathBuf::from(\n                        \"path/to/versions.toml\"\n                    )),\n                    date_override: None,\n                    smithy_rs_location: None,\n                    aws_sdk_rust_location: Some(PathBuf::from(\"aws-sdk-rust-location\")),\n                })\n            },\n            Args::try_parse_from([\n                \"./changelogger\",\n                \"render\",\n                \"--change-set\",\n                \"aws-sdk\",\n                \"--independent-versioning\",\n                \"--source\",\n                \"fromplace\",\n                \"--source-to-truncate\",\n                \"fromplace\",\n                \"--changelog-output\",\n                \"some-changelog\",\n                \"--previous-release-versions-manifest\",\n                \"path/to/versions.toml\",\n                \"--aws-sdk-rust-location\",\n                \"aws-sdk-rust-location\",\n            ])\n            .unwrap()\n        );\n\n        assert_eq!(\n            Args {\n                command: Command::Render(RenderArgs {\n                    change_set: ChangeSet::AwsSdk,\n                    independent_versioning: true,\n                    source: vec![PathBuf::from(\"fromplace\")],\n                    changelog_output: PathBuf::from(\"some-changelog\"),\n                    source_to_truncate: Some(PathBuf::from(\"fromplace\")),\n                    release_manifest_output: None,\n                    current_release_versions_manifest: Some(PathBuf::from(\n                        \"path/to/current/versions.toml\"\n                    )),\n                    previous_release_versions_manifest: Some(PathBuf::from(\n                        \"path/to/previous/versions.toml\"\n                    )),\n                    date_override: None,\n                    smithy_rs_location: None,\n                    aws_sdk_rust_location: Some(PathBuf::from(\"aws-sdk-rust-location\")),\n                })\n            },\n            Args::try_parse_from([\n                \"./changelogger\",\n                \"render\",\n                \"--change-set\",\n                \"aws-sdk\",\n                \"--independent-versioning\",\n                \"--source\",\n                \"fromplace\",\n                \"--source-to-truncate\",\n                \"fromplace\",\n                \"--changelog-output\",\n                \"some-changelog\",\n                \"--current-release-versions-manifest\",\n                \"path/to/current/versions.toml\",\n                \"--previous-release-versions-manifest\",\n                \"path/to/previous/versions.toml\",\n                \"--aws-sdk-rust-location\",\n                \"aws-sdk-rust-location\",\n            ])\n            .unwrap()\n        );\n\n        assert_eq!(\n            Args {\n                command: Command::New(NewArgs {\n                    applies_to: Some(vec![Target::Client, Target::AwsSdk]),\n                    authors: Some(vec![\"external-contrib\".to_owned(), \"ysaito1001\".to_owned()]),\n                    references: Some(vec![\n                        Reference::from_str(\"smithy-rs#1234\").unwrap(),\n                        Reference::from_str(\"aws-sdk-rust#5678\").unwrap()\n                    ]),\n                    breaking: false,\n                    new_feature: true,\n                    bug_fix: false,\n                    message: Some(\"Implement a long-awaited feature for S3\".to_owned()),\n                    basename: None,\n                })\n            },\n            Args::try_parse_from([\n                \"./changelogger\",\n                \"new\",\n                \"--applies-to\",\n                \"client\",\n                \"--applies-to\",\n                \"aws-sdk-rust\",\n                \"--authors\",\n                \"external-contrib\",\n                \"--authors\",\n                \"ysaito1001\",\n                \"--references\",\n                \"smithy-rs#1234\",\n                \"--references\",\n                \"aws-sdk-rust#5678\",\n                \"--new-feature\",\n                \"--message\",\n                \"Implement a long-awaited feature for S3\",\n            ])\n            .unwrap()\n        );\n\n        assert_eq!(\n            Args {\n                command: Command::Ls(LsArgs {\n                    change_set: ChangeSet::SmithyRs\n                })\n            },\n            Args::try_parse_from([\"./changelogger\", \"ls\", \"--change-set\", \"smithy-rs\",]).unwrap()\n        );\n\n        assert_eq!(\n            Args {\n                command: Command::Ls(LsArgs {\n                    change_set: ChangeSet::AwsSdk\n                })\n            },\n            Args::try_parse_from([\"./changelogger\", \"ls\", \"--change-set\", \"aws-sdk\",]).unwrap()\n        );\n    }\n}\n"
  },
  {
    "path": "tools/ci-build/changelogger/src/new.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse anyhow::Context;\nuse clap::Parser;\nuse smithy_rs_tool_common::changelog::{FrontMatter, Markdown, Reference, Target};\nuse smithy_rs_tool_common::git::find_git_repository_root;\nuse smithy_rs_tool_common::here;\nuse std::path::PathBuf;\nuse std::time::{SystemTime, UNIX_EPOCH};\n\n#[derive(Parser, Debug, Eq, PartialEq)]\npub struct NewArgs {\n    /// Target audience for the change (if not provided, user's editor will open for authoring one)\n    #[clap(long, short = 't')]\n    pub applies_to: Option<Vec<Target>>,\n    /// List of git usernames for the authors of the change (if not provided, user's editor will open for authoring one)\n    #[clap(long, short)]\n    pub authors: Option<Vec<String>>,\n    /// List of relevant issues and PRs (if not provided, user's editor will open for authoring one)\n    #[clap(long, short)]\n    pub references: Option<Vec<Reference>>,\n    /// Whether or not the change contains a breaking change (defaults to false)\n    #[clap(long, action)]\n    pub breaking: bool,\n    /// Whether or not the change implements a new feature (defaults to false)\n    #[clap(long, action)]\n    pub new_feature: bool,\n    /// Whether or not the change fixes a bug (defaults to false)\n    #[clap(long, short, action)]\n    pub bug_fix: bool,\n    /// The changelog entry message (if not provided, user's editor will open for authoring one)\n    #[clap(long, short)]\n    pub message: Option<String>,\n    /// Basename of a changelog markdown file (defaults to a random 6-digit basename)\n    #[clap(long)]\n    pub basename: Option<PathBuf>,\n}\n\nimpl From<NewArgs> for Markdown {\n    fn from(value: NewArgs) -> Self {\n        Markdown {\n            front_matter: FrontMatter {\n                applies_to: value.applies_to.unwrap_or_default().into_iter().collect(),\n                authors: value.authors.unwrap_or_default(),\n                references: value.references.unwrap_or_default(),\n                breaking: value.breaking,\n                new_feature: value.new_feature,\n                bug_fix: value.bug_fix,\n            },\n            message: value.message.unwrap_or_default(),\n        }\n    }\n}\n\npub fn subcommand_new(args: NewArgs) -> anyhow::Result<()> {\n    let mut md_full_filename = find_git_repository_root(\"smithy-rs\", \".\").context(here!())?;\n    md_full_filename.push(\".changelog\");\n    md_full_filename.push(args.basename.clone().unwrap_or(PathBuf::from(format!(\n            \"{:?}.md\",\n            SystemTime::now()\n                .duration_since(UNIX_EPOCH)\n                .expect(\"should get the current Unix epoch time\")\n                .as_secs(),\n        ))));\n\n    let changelog_entry = new_entry(Markdown::from(args))?;\n    std::fs::write(&md_full_filename, &changelog_entry).with_context(|| {\n        format!(\n            \"failed to write the following changelog entry to {:?}:\\n{}\",\n            md_full_filename.as_path(),\n            changelog_entry\n        )\n    })?;\n\n    println!(\n        \"\\nThe following changelog entry has been written to {:?}:\\n{}\",\n        md_full_filename.as_path(),\n        changelog_entry\n    );\n\n    Ok(())\n}\n\nfn new_entry(markdown: Markdown) -> anyhow::Result<String> {\n    // Due to the inability for `serde_yaml` to output single line array syntax, an array of values\n    // will be serialized as follows:\n    //\n    // key:\n    // - value1\n    // - value2\n    //\n    // as opposed to:\n    //\n    // key: [value1, value2]\n    //\n    // This doesn't present practical issues when rendering changelogs. See\n    // https://github.com/dtolnay/serde-yaml/issues/355\n    let front_matter = serde_yaml::to_string(&markdown.front_matter)?;\n    // the last `\\n` satisfies the `fix end of files` check in `sdk-lints`\n    let changelog_entry = format!(\"---\\n{}---\\n{}\\n\", front_matter, markdown.message);\n    let changelog_entry = if any_required_field_needs_to_be_filled(&markdown) {\n        edit::edit(changelog_entry).context(\"failed while editing changelog entry)\")?\n    } else {\n        changelog_entry\n    };\n\n    Ok(changelog_entry)\n}\n\nfn any_required_field_needs_to_be_filled(markdown: &Markdown) -> bool {\n    macro_rules! any_empty {\n        () => { false };\n        ($head:expr $(, $tail:expr)*) => {\n            $head.is_empty() || any_empty!($($tail),*)\n        };\n    }\n    any_empty!(\n        &markdown.front_matter.applies_to,\n        &markdown.front_matter.authors,\n        &markdown.front_matter.references,\n        &markdown.message\n    )\n}\n\n#[cfg(test)]\nmod tests {\n    use crate::new::{any_required_field_needs_to_be_filled, new_entry, NewArgs};\n    use smithy_rs_tool_common::changelog::{Reference, Target};\n    use std::str::FromStr;\n\n    #[test]\n    fn test_new_entry_from_args() {\n        // make sure `args` populates required fields (so the function\n        // `any_required_field_needs_to_be_filled` should return false), otherwise an editor would\n        // be opened during the test execution for human input, causing the test to get struck\n        let args = NewArgs {\n            applies_to: Some(vec![Target::Client]),\n            authors: Some(vec![\"ysaito1001\".to_owned()]),\n            references: Some(vec![Reference::from_str(\"smithy-rs#1234\").unwrap()]),\n            breaking: false,\n            new_feature: true,\n            bug_fix: false,\n            message: Some(\"Implement a long-awaited feature for S3\".to_owned()),\n            basename: None,\n        };\n        let markdown = args.into();\n        assert!(\n            !any_required_field_needs_to_be_filled(&markdown),\n            \"one or more required fields were not populated\"\n        );\n\n        let expected = \"---\\napplies_to:\\n- client\\nauthors:\\n- ysaito1001\\nreferences:\\n- smithy-rs#1234\\nbreaking: false\\nnew_feature: true\\nbug_fix: false\\n---\\nImplement a long-awaited feature for S3\\n\";\n        let actual = new_entry(markdown).unwrap();\n\n        assert_eq!(expected, &actual);\n    }\n}\n"
  },
  {
    "path": "tools/ci-build/changelogger/src/render.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::entry::{ChangeSet, ChangelogEntries, ChangelogEntry};\nuse anyhow::{bail, Context, Result};\nuse clap::Parser;\nuse ordinal::Ordinal;\nuse serde::Serialize;\nuse smithy_rs_tool_common::changelog::{\n    Changelog, ChangelogLoader, HandAuthoredEntry, Reference, SdkModelChangeKind, SdkModelEntry,\n    ValidationSet,\n};\nuse smithy_rs_tool_common::git::{find_git_repository_root, Git, GitCLI};\nuse smithy_rs_tool_common::release_tag::ReleaseTag;\nuse smithy_rs_tool_common::versions_manifest::{CrateVersionMetadataMap, VersionsManifest};\nuse std::env;\nuse std::fmt::Write;\nuse std::fs;\nuse std::path::{Path, PathBuf};\nuse std::sync::LazyLock;\nuse time::OffsetDateTime;\n\npub const EXAMPLE_ENTRY: &str = r#\"# Example changelog entry, Markdown with YAML front matter\n# ---\n# applies_to: [\"client\", \"server\", \"aws-sdk-rust\"] # \"aws-sdk-rust\" here duplicates this entry into release notes in `aws-sdk-rust`\n# authors: [\"rcoh\"]\n# references: [\"smithy-rs#920\"]\n# breaking: false\n# new_feature: false\n# bug_fix: false\n# ---\n# Fix typos in module documentation for generated crates\n\"#;\n\npub const USE_UPDATE_CHANGELOGS: &str =\n    \"<!-- Do not manually edit this file. Use the `changelogger` tool. -->\";\n\nstatic MAINTAINERS: LazyLock<Vec<String>> = LazyLock::new(|| {\n    include_str!(\"../smithy-rs-maintainers.txt\")\n        .lines()\n        .map(|name| name.to_ascii_lowercase())\n        .collect()\n});\n\nfn is_maintainer(name: &str) -> bool {\n    let name_lower = name.to_ascii_lowercase();\n    MAINTAINERS.contains(&name_lower)\n}\n\n#[derive(Parser, Debug, Eq, PartialEq)]\npub struct RenderArgs {\n    /// Which set of changes to render\n    #[clap(long, action)]\n    pub change_set: ChangeSet,\n    /// Whether or not independent crate versions are being used (defaults to false)\n    #[clap(long, action)]\n    pub independent_versioning: bool,\n    /// Source changelog entries to render\n    #[clap(long, action, required(true))]\n    pub source: Vec<PathBuf>,\n    /// Where to output the rendered changelog entries\n    #[clap(long, action)]\n    pub changelog_output: PathBuf,\n    /// Optional directory path to the changelog directory to empty, leaving only `.example` in it\n    #[clap(long, action)]\n    pub source_to_truncate: Option<PathBuf>,\n    /// Optional path to output a release manifest file to\n    #[clap(long, action)]\n    pub release_manifest_output: Option<PathBuf>,\n    /// Optional path to the SDK's versions.toml file for the current release.\n    /// This is used to generate a markdown table showing crate versions.\n    #[clap(long, action)]\n    pub current_release_versions_manifest: Option<PathBuf>,\n    /// Optional path to the SDK's versions.toml file for the previous release.\n    /// This is used to filter out changelog entries that have `since_commit` information.\n    #[clap(long, action)]\n    pub previous_release_versions_manifest: Option<PathBuf>,\n    // Location of the smithy-rs repository. If not specified, the current\n    // working directory will be used to attempt to find it.\n    #[clap(long, action)]\n    pub smithy_rs_location: Option<PathBuf>,\n    // Location of the aws-sdk-rust repository, used exclusively to retrieve existing release tags.\n    #[clap(long, required_if_eq(\"change-set\", \"aws-sdk\"))]\n    pub aws_sdk_rust_location: Option<PathBuf>,\n\n    // For testing only\n    #[clap(skip)]\n    pub date_override: Option<OffsetDateTime>,\n}\n\npub fn subcommand_render(args: &RenderArgs) -> Result<()> {\n    let now = args.date_override.unwrap_or_else(OffsetDateTime::now_utc);\n\n    let current_dir = env::current_dir()?;\n    let repo_root: PathBuf = find_git_repository_root(\n        \"smithy-rs\",\n        args.smithy_rs_location\n            .as_deref()\n            .unwrap_or(current_dir.as_path()),\n    )\n    .context(\"failed to find smithy-rs repo root\")?;\n\n    let current_tag = {\n        let cli_for_tag = if let Some(aws_sdk_rust_repo_root) = &args.aws_sdk_rust_location {\n            GitCLI::new(\n                &find_git_repository_root(\"aws-sdk-rust\", aws_sdk_rust_repo_root)\n                    .context(\"failed to find aws-sdk-rust repo root\")?,\n            )?\n        } else {\n            GitCLI::new(&repo_root)?\n        };\n        cli_for_tag.get_current_tag()?\n    };\n    let next_release_tag = next_tag(now, &current_tag);\n\n    let smithy_rs = GitCLI::new(&repo_root)?;\n    if args.independent_versioning {\n        let smithy_rs_metadata = date_based_release_metadata(\n            now,\n            next_release_tag.clone(),\n            \"smithy-rs-release-manifest.json\",\n        );\n        let sdk_metadata = date_based_release_metadata(\n            now,\n            next_release_tag,\n            \"aws-sdk-rust-release-manifest.json\",\n        );\n        update_changelogs(args, &smithy_rs, &smithy_rs_metadata, &sdk_metadata)\n    } else {\n        bail!(\"the --independent-versioning flag must be set; synchronized versioning no longer supported\");\n    }\n}\n\n// Generate a unique date-based release tag\n//\n// This function generates a date-based release tag and compares it to `current_tag`.\n// If the generated tag is a substring of `current_tag`, it indicates that a release has already occurred on that day.\n// In this case, the function ensures uniqueness by appending a numerical suffix to `current_tag`.\nfn next_tag(now: OffsetDateTime, current_tag: &ReleaseTag) -> String {\n    let date_based_release_tag = format!(\n        \"release-{year}-{month:02}-{day:02}\",\n        year = now.date().year(),\n        month = u8::from(now.date().month()),\n        day = now.date().day()\n    );\n\n    let current_tag = current_tag.as_str();\n    if current_tag.starts_with(&date_based_release_tag) {\n        bump_release_tag_suffix(current_tag)\n    } else {\n        date_based_release_tag\n    }\n}\n\n// Bump `current_tag` by adding or incrementing a numerical suffix\n//\n// This is a private function that is only called by `next_tag`.\n// It assumes that `current_tag` follows the format `release-YYYY-MM-DD`.\nfn bump_release_tag_suffix(current_tag: &str) -> String {\n    if let Some(pos) = current_tag.rfind('.') {\n        let prefix = &current_tag[..pos];\n        let suffix = &current_tag[pos + 1..];\n        let suffix = suffix\n            .parse::<u32>()\n            .expect(\"should parse numerical suffix\");\n        format!(\"{}.{}\", prefix, suffix + 1)\n    } else {\n        format!(\"{}.{}\", current_tag, 2)\n    }\n}\n\nstruct ReleaseMetadata {\n    title: String,\n    tag: String,\n    manifest_name: String,\n}\n\n#[derive(Serialize)]\nstruct ReleaseManifest {\n    #[serde(rename = \"tagName\")]\n    tag_name: String,\n    name: String,\n    body: String,\n    prerelease: bool,\n}\n\nfn date_based_release_metadata(\n    now: OffsetDateTime,\n    tag: String,\n    manifest_name: impl Into<String>,\n) -> ReleaseMetadata {\n    ReleaseMetadata {\n        title: date_title(&now),\n        tag,\n        manifest_name: manifest_name.into(),\n    }\n}\n\nfn date_title(now: &OffsetDateTime) -> String {\n    format!(\n        \"{month} {day}, {year}\",\n        month = now.date().month(),\n        day = Ordinal(now.date().day()),\n        year = now.date().year()\n    )\n}\n\nfn render_model_entry(entry: &SdkModelEntry, out: &mut String) {\n    write!(\n        out,\n        \"- `{module}` ({version}): {message}\",\n        module = entry.module,\n        version = entry.version,\n        message = entry.message\n    )\n    .unwrap();\n}\n\nfn to_md_link(reference: &Reference) -> String {\n    let org_name = match reference.repo.as_str() {\n        \"smithy-rs\" => \"smithy-lang\",\n        \"aws-sdk-rust\" => \"awslabs\",\n        \"aws-sdk\" => \"aws\",\n        repo => panic!(\"unrecognized repo named {repo}\"),\n    };\n    format!(\n        \"[{repo}#{number}](https://github.com/{org_name}/{repo}/issues/{number})\",\n        repo = reference.repo,\n        number = reference.number\n    )\n}\n\n/// Write a changelog entry to [out]\n///\n/// Example output:\n/// `- Add a feature (smithy-rs#123, @contributor)`\nfn render_entry(entry: &HandAuthoredEntry, mut out: &mut String) {\n    let mut meta = String::new();\n    if entry.meta.bug {\n        meta.push_str(\":bug:\");\n    }\n    if entry.meta.breaking {\n        meta.push_str(\":warning:\");\n    }\n    if entry.meta.tada {\n        meta.push_str(\":tada:\");\n    }\n    if !meta.is_empty() {\n        meta.push(' ');\n    }\n    let mut references = entry\n        .meta\n        .target\n        .iter()\n        .map(|t| t.to_string())\n        .chain(entry.references.iter().map(to_md_link))\n        .collect::<Vec<_>>();\n    let non_maintainers = entry\n        .authors\n        .iter()\n        .filter(|author| !is_maintainer(author))\n        .map(|author| format!(\"@{author}\"));\n    references.extend(non_maintainers);\n\n    if !references.is_empty() {\n        write!(meta, \"({}) \", references.join(\", \")).unwrap();\n    }\n    write!(\n        &mut out,\n        \"- {meta}{message}\",\n        meta = meta,\n        message = indented_message(&entry.message),\n    )\n    .unwrap();\n}\n\nfn indented_message(message: &str) -> String {\n    let mut out = String::new();\n    for (idx, line) in message.lines().enumerate() {\n        if idx > 0 {\n            out.push('\\n');\n            if !line.is_empty() {\n                out.push_str(\"    \");\n            }\n        }\n        out.push_str(line);\n    }\n    out\n}\n\nfn render_table_row(columns: [&str; 2], out: &mut String) {\n    let mut row = \"|\".to_owned();\n    for column in columns {\n        row.push_str(column);\n        row.push('|');\n    }\n    write!(out, \"{row}\").unwrap();\n    out.push('\\n');\n}\n\nfn load_changelogs(args: &RenderArgs) -> Result<Changelog> {\n    let mut combined = Changelog::new();\n    let loader = ChangelogLoader::default();\n    for source in &args.source {\n        let changelog = if source.is_dir() {\n            loader.load_from_dir(source)\n        } else {\n            loader.load_from_file(source)\n        }\n        .map_err(|errs| anyhow::Error::msg(format!(\"failed to load {source:?}: {errs:#?}\")))?;\n        changelog.validate(ValidationSet::Render).map_err(|errs| {\n            anyhow::Error::msg(format!(\n                \"failed to load {source:?}: {errors}\",\n                errors = errs.join(\"\\n\")\n            ))\n        })?;\n        combined.merge(changelog);\n    }\n    Ok(combined)\n}\n\nfn load_current_crate_version_metadata_map(\n    current_release_versions_manifest: Option<&Path>,\n) -> CrateVersionMetadataMap {\n    current_release_versions_manifest\n        .and_then(\n            |manifest_path| match VersionsManifest::from_file(manifest_path) {\n                Ok(manifest) => Some(manifest.crates),\n                Err(_) => None,\n            },\n        )\n        .unwrap_or_default()\n}\n\nfn update_changelogs(\n    args: &RenderArgs,\n    smithy_rs: &dyn Git,\n    smithy_rs_metadata: &ReleaseMetadata,\n    aws_sdk_rust_metadata: &ReleaseMetadata,\n) -> Result<()> {\n    let changelog = load_changelogs(args)?;\n    let release_metadata = match args.change_set {\n        ChangeSet::AwsSdk => aws_sdk_rust_metadata,\n        ChangeSet::SmithyRs => smithy_rs_metadata,\n    };\n    let entries = ChangelogEntries::from(changelog);\n    let entries = entries.filter(\n        smithy_rs,\n        args.change_set,\n        args.previous_release_versions_manifest.as_deref(),\n    )?;\n    let current_crate_version_metadata_map =\n        load_current_crate_version_metadata_map(args.current_release_versions_manifest.as_deref());\n    let (release_header, release_notes) = render(\n        &entries,\n        current_crate_version_metadata_map,\n        &release_metadata.title,\n    );\n    if let Some(output_path) = &args.release_manifest_output {\n        let release_manifest = ReleaseManifest {\n            tag_name: release_metadata.tag.clone(),\n            name: release_metadata.title.clone(),\n            body: release_notes.clone(),\n            // stable as of release-2023-11-21\n            prerelease: false,\n        };\n        std::fs::write(\n            output_path.join(&release_metadata.manifest_name),\n            serde_json::to_string_pretty(&release_manifest)?,\n        )\n        .context(\"failed to write release manifest\")?;\n    }\n\n    let mut update = USE_UPDATE_CHANGELOGS.to_string();\n    update.push('\\n');\n    update.push_str(&release_header);\n    update.push_str(&release_notes);\n\n    let current = std::fs::read_to_string(&args.changelog_output)\n        .context(\"failed to read rendered destination changelog\")?\n        .replace(USE_UPDATE_CHANGELOGS, \"\");\n    update.push_str(&current);\n    std::fs::write(&args.changelog_output, update).context(\"failed to write rendered changelog\")?;\n\n    if let Some(source_to_truncate) = &args.source_to_truncate {\n        fs::remove_dir_all(source_to_truncate)\n            .and_then(|_| fs::create_dir(source_to_truncate))\n            .with_context(|| format!(\"failed to empty directory {source_to_truncate:?}\"))\n            .and_then(|_| {\n                let dot_example = source_to_truncate.join(\".example\");\n                fs::write(dot_example.clone(), EXAMPLE_ENTRY)\n                    .with_context(|| format!(\"failed to create {dot_example:?}\"))\n            })?;\n    }\n    eprintln!(\"Changelogs updated!\");\n    Ok(())\n}\n\nfn render_handauthored<'a>(entries: impl Iterator<Item = &'a HandAuthoredEntry>, out: &mut String) {\n    let (breaking, non_breaking) = entries.partition::<Vec<_>, _>(|entry| entry.meta.breaking);\n\n    if !breaking.is_empty() {\n        out.push_str(\"**Breaking Changes:**\\n\");\n        for change in breaking {\n            render_entry(change, out);\n            out.push('\\n');\n        }\n        out.push('\\n')\n    }\n\n    if !non_breaking.is_empty() {\n        out.push_str(\"**New this release:**\\n\");\n        for change in non_breaking {\n            render_entry(change, out);\n            out.push('\\n');\n        }\n        out.push('\\n');\n    }\n}\n\nfn render_sdk_model_entries<'a>(\n    entries: impl Iterator<Item = &'a SdkModelEntry>,\n    out: &mut String,\n) {\n    let (features, docs) =\n        entries.partition::<Vec<_>, _>(|entry| matches!(entry.kind, SdkModelChangeKind::Feature));\n    if !features.is_empty() {\n        out.push_str(\"**Service Features:**\\n\");\n        for entry in features {\n            render_model_entry(entry, out);\n            out.push('\\n');\n        }\n        out.push('\\n');\n    }\n    if !docs.is_empty() {\n        out.push_str(\"**Service Documentation:**\\n\");\n        for entry in docs {\n            render_model_entry(entry, out);\n            out.push('\\n');\n        }\n        out.push('\\n');\n    }\n}\n\nfn render_external_contributors(entries: &[ChangelogEntry], out: &mut String) {\n    let mut external_contribs = entries\n        .iter()\n        .filter_map(|entry| entry.hand_authored().map(|e| &e.authors))\n        .flat_map(|authors| authors.iter())\n        .filter(|author| !is_maintainer(author))\n        .collect::<Vec<_>>();\n    if external_contribs.is_empty() {\n        return;\n    }\n    external_contribs.sort();\n    external_contribs.dedup();\n    out.push_str(\"**Contributors**\\nThank you for your contributions! ❤\\n\");\n    for contributor_handle in external_contribs {\n        // retrieve all contributions this author made\n        let mut contribution_references = entries\n            .iter()\n            .filter(|entry| {\n                entry\n                    .hand_authored()\n                    .map(|e| {\n                        e.authors\n                            .iter()\n                            .any(|author| author.eq_ignore_ascii_case(contributor_handle.as_str()))\n                    })\n                    .unwrap_or(false)\n            })\n            .flat_map(|entry| {\n                entry\n                    .hand_authored()\n                    .unwrap()\n                    .references\n                    .iter()\n                    .filter(|r| matches!(r.repo.as_str(), \"aws-sdk-rust\" | \"smithy-rs\"))\n                    .map(to_md_link)\n            })\n            .collect::<Vec<_>>();\n        contribution_references.sort();\n        contribution_references.dedup();\n        let contribution_references = contribution_references.as_slice().join(\", \");\n        out.push_str(\"- @\");\n        out.push_str(contributor_handle);\n        if !contribution_references.is_empty() {\n            write!(out, \" ({contribution_references})\")\n                // The `Write` implementation for `String` is infallible,\n                // see https://doc.rust-lang.org/src/alloc/string.rs.html#2815\n                .unwrap()\n        }\n        out.push('\\n');\n    }\n    out.push('\\n');\n}\n\nfn render_details(summary: &str, body: &str, out: &mut String) {\n    out.push_str(\"<details>\");\n    out.push('\\n');\n    write!(out, \"<summary>{summary}</summary>\").unwrap();\n    out.push('\\n');\n    // A blank line is required for the body to be rendered properly\n    out.push('\\n');\n    out.push_str(body);\n    out.push_str(\"</details>\");\n    out.push('\\n');\n}\n\nfn render_crate_versions(crate_version_metadata_map: CrateVersionMetadataMap, out: &mut String) {\n    if crate_version_metadata_map.is_empty() {\n        // If the map is empty, we choose to not render anything, as opposed to\n        // rendering the <details> element with empty contents and a user toggling\n        // it only to find out there is nothing in it.\n        return;\n    }\n\n    out.push_str(\"**Crate Versions**\");\n    out.push('\\n');\n\n    let mut table = String::new();\n    render_table_row([\"Crate\", \"Version\"], &mut table);\n    render_table_row([\"-\", \"-\"], &mut table);\n    for (crate_name, version_metadata) in &crate_version_metadata_map {\n        render_table_row([crate_name, &version_metadata.version], &mut table);\n    }\n\n    render_details(\"Click to expand to view crate versions...\", &table, out);\n    out.push('\\n');\n}\n\n/// Convert a list of changelog entries and crate versions into markdown.\n/// Returns (header, body)\npub(crate) fn render(\n    entries: &[ChangelogEntry],\n    crate_version_metadata_map: CrateVersionMetadataMap,\n    release_header: &str,\n) -> (String, String) {\n    let mut header = String::new();\n    header.push_str(release_header);\n    header.push('\\n');\n    for _ in 0..release_header.len() {\n        header.push('=');\n    }\n    header.push('\\n');\n\n    let mut out = String::new();\n    render_handauthored(\n        entries.iter().filter_map(ChangelogEntry::hand_authored),\n        &mut out,\n    );\n    render_sdk_model_entries(\n        entries.iter().filter_map(ChangelogEntry::aws_sdk_model),\n        &mut out,\n    );\n\n    render_external_contributors(entries, &mut out);\n    render_crate_versions(crate_version_metadata_map, &mut out);\n\n    (header, out)\n}\n\n#[cfg(test)]\nmod test {\n    use super::{\n        bump_release_tag_suffix, date_based_release_metadata, next_tag, render, Changelog,\n        ChangelogEntries, ChangelogEntry,\n    };\n    use smithy_rs_tool_common::changelog::ChangelogLoader;\n    use smithy_rs_tool_common::release_tag::ReleaseTag;\n    use smithy_rs_tool_common::{\n        changelog::SdkAffected,\n        package::PackageCategory,\n        versions_manifest::{CrateVersion, CrateVersionMetadataMap},\n    };\n    use std::fs;\n    use std::str::FromStr;\n    use tempfile::TempDir;\n    use time::OffsetDateTime;\n\n    fn render_full(entries: &[ChangelogEntry], release_header: &str) -> String {\n        let (header, body) = render(entries, CrateVersionMetadataMap::new(), release_header);\n        format!(\"{header}{body}\")\n    }\n\n    const SMITHY_RS_EXPECTED_END_TO_END: &str = r#\"v0.3.0 (January 4th, 2022)\n==========================\n**Breaking Changes:**\n- :warning: (all, [smithy-rs#445](https://github.com/smithy-lang/smithy-rs/issues/445)) I made a major change to update the code generator\n\n**New this release:**\n- :tada: (all, [smithy-rs#446](https://github.com/smithy-lang/smithy-rs/issues/446), [aws-sdk#123](https://github.com/aws/aws-sdk/issues/123), @external-contrib, @other-external-dev) I made a change to update the code generator\n\n**Contributors**\nThank you for your contributions! ❤\n- @external-contrib ([smithy-rs#446](https://github.com/smithy-lang/smithy-rs/issues/446))\n- @other-external-dev ([smithy-rs#446](https://github.com/smithy-lang/smithy-rs/issues/446))\n\n\"#;\n\n    const AWS_SDK_EXPECTED_END_TO_END: &str = r#\"v0.1.0 (January 4th, 2022)\n==========================\n**Breaking Changes:**\n- :warning: ([smithy-rs#445](https://github.com/smithy-lang/smithy-rs/issues/445)) I made a major change to update the AWS SDK\n\n**New this release:**\n- :tada: ([smithy-rs#446](https://github.com/smithy-lang/smithy-rs/issues/446), @external-contrib) I made a change to update the code generator\n\n**Service Features:**\n- `aws-sdk-ec2` (0.12.0): Some API change\n- `aws-sdk-s3` (0.14.0): Some new API to do X\n\n**Service Documentation:**\n- `aws-sdk-ec2` (0.12.0): Updated some docs\n\n**Contributors**\nThank you for your contributions! ❤\n- @external-contrib ([smithy-rs#446](https://github.com/smithy-lang/smithy-rs/issues/446))\n\n\"#;\n\n    #[test]\n    fn end_to_end_changelog() {\n        let temp_dir = TempDir::new().unwrap();\n        let smithy_rs_entry1 = r#\"---\napplies_to: [\"client\", \"server\"]\nauthors: [\"rcoh\", \"jdisanti\"]\nreferences: [\"smithy-rs#445\"]\nbreaking: true\nnew_feature: false\nbug_fix: false\n---\nI made a major change to update the code generator\n\"#;\n        let smithy_rs_entry2 = r#\"---\napplies_to: [\"client\", \"server\"]\nauthors: [\"external-contrib\", \"other-external-dev\"]\nreferences: [\"smithy-rs#446\", \"aws-sdk#123\"]\nbreaking: false\nnew_feature: true\nbug_fix: false\n---\nI made a change to update the code generator\n\"#;\n        let aws_sdk_entry1 = r#\"---\napplies_to: [\"aws-sdk-rust\"]\nauthors: [\"rcoh\"]\nreferences: [\"smithy-rs#445\"]\nbreaking: true\nnew_feature: false\nbug_fix: false\n---\nI made a major change to update the AWS SDK\n\"#;\n        let aws_sdk_entry2 = r#\"---\napplies_to: [\"aws-sdk-rust\"]\nauthors: [\"external-contrib\"]\nreferences: [\"smithy-rs#446\"]\nbreaking: false\nnew_feature: true\nbug_fix: false\n---\nI made a change to update the code generator\n\"#;\n\n        // We won't handwrite changelog entries for model updates, and they are still provided in\n        // the TOML format.\n        let model_updates = r#\"\n[[aws-sdk-model]]\nmodule = \"aws-sdk-s3\"\nversion = \"0.14.0\"\nkind = \"Feature\"\nmessage = \"Some new API to do X\"\n\n[[aws-sdk-model]]\nmodule = \"aws-sdk-ec2\"\nversion = \"0.12.0\"\nkind = \"Documentation\"\nmessage = \"Updated some docs\"\n\n[[aws-sdk-model]]\nmodule = \"aws-sdk-ec2\"\nversion = \"0.12.0\"\nkind = \"Feature\"\nmessage = \"Some API change\"\n        \"#;\n\n        [\n            smithy_rs_entry1,\n            smithy_rs_entry2,\n            aws_sdk_entry1,\n            aws_sdk_entry2,\n        ]\n        .iter()\n        .enumerate()\n        .for_each(|(i, contents)| {\n            let changelog_entry_markdown_file = temp_dir.path().join(format!(\"test{i}.md\"));\n            fs::write(&changelog_entry_markdown_file, contents.as_bytes()).unwrap();\n        });\n\n        let mut changelog = ChangelogLoader::default()\n            .load_from_dir(temp_dir.path())\n            .expect(\"valid changelog\");\n\n        changelog.merge(\n            ChangelogLoader::default()\n                .parse_str(model_updates)\n                .expect(\"valid changelog\"),\n        );\n\n        let ChangelogEntries {\n            aws_sdk_rust,\n            smithy_rs,\n        } = changelog.into();\n\n        let smithy_rs_rendered = render_full(&smithy_rs, \"v0.3.0 (January 4th, 2022)\");\n        pretty_assertions::assert_str_eq!(SMITHY_RS_EXPECTED_END_TO_END, smithy_rs_rendered);\n\n        let aws_sdk_rendered = render_full(&aws_sdk_rust, \"v0.1.0 (January 4th, 2022)\");\n        pretty_assertions::assert_str_eq!(AWS_SDK_EXPECTED_END_TO_END, aws_sdk_rendered);\n    }\n\n    #[test]\n    fn test_date_based_release_metadata() {\n        let now = OffsetDateTime::from_unix_timestamp(100_000_000).unwrap();\n        let result =\n            date_based_release_metadata(now, \"release-1973-03-03\".to_owned(), \"some-manifest.json\");\n        assert_eq!(\"March 3rd, 1973\", result.title);\n        assert_eq!(\"release-1973-03-03\", result.tag);\n        assert_eq!(\"some-manifest.json\", result.manifest_name);\n    }\n\n    #[test]\n    fn test_partition_client_server() {\n        let smithy_rs_entry1 = r#\"---\napplies_to: [\"server\"]\nauthors: [\"external-contrib\"]\nreferences: [\"smithy-rs#446\"]\nbreaking: true\nnew_feature: true\nbug_fix: false\n---\nthis is a multiline\nmessage\n\"#;\n        let smithy_rs_entry2 = r#\"---\napplies_to: [\"client\"]\nauthors: [\"external-contrib\"]\nreferences: [\"smithy-rs#446\"]\nbreaking: false\nnew_feature: true\nbug_fix: false\n---\na client message\n\"#;\n        let smithy_rs_entry3 = r#\"---\napplies_to: [\"client\", \"server\"]\nauthors: [\"rcoh\"]\nreferences:  [\"smithy-rs#446\"]\nbreaking: false\nnew_feature: false\nbug_fix: false\n---\na change for both\n\"#;\n        let smithy_rs_entry4 = r#\"---\napplies_to: [\"client\", \"server\"]\nauthors: [\"external-contrib\", \"other-external-dev\"]\nreferences: [\"smithy-rs#446\", \"smithy-rs#447\"]\nbreaking: false\nnew_feature: true\nbug_fix: false\n---\nI made a change to update the code generator\n\n**Update guide:**\nblah blah\n\"#;\n        let model_update = r#\"\n[[aws-sdk-model]]\nmodule = \"aws-sdk-s3\"\nversion = \"0.14.0\"\nkind = \"Feature\"\nmessage = \"Some new API to do X\"\n\"#;\n        let loader = ChangelogLoader::default();\n        let changelog = [\n            smithy_rs_entry1,\n            smithy_rs_entry2,\n            smithy_rs_entry3,\n            smithy_rs_entry4,\n            model_update,\n        ]\n        .iter()\n        .fold(Changelog::new(), |mut combined_changelog, value| {\n            combined_changelog.merge(loader.parse_str(value).expect(\"String should have parsed\"));\n            combined_changelog\n        });\n        let ChangelogEntries {\n            aws_sdk_rust: _,\n            smithy_rs,\n        } = changelog.into();\n        let affected = vec![SdkAffected::Server, SdkAffected::Client, SdkAffected::All];\n        let entries = smithy_rs\n            .iter()\n            .filter_map(ChangelogEntry::hand_authored)\n            .zip(affected)\n            .collect::<Vec<_>>();\n        for (e, a) in entries {\n            assert_eq!(e.meta.target, Some(a));\n        }\n    }\n\n    #[test]\n    fn test_empty_render() {\n        let smithy_rs = Vec::<ChangelogEntry>::new();\n        let (release_title, release_notes) =\n            render(&smithy_rs, CrateVersionMetadataMap::new(), \"some header\");\n\n        assert_eq!(release_title, \"some header\\n===========\\n\");\n        assert_eq!(release_notes, \"\");\n    }\n\n    #[test]\n    fn test_crate_versions() {\n        let mut crate_version_metadata_map = CrateVersionMetadataMap::new();\n        crate_version_metadata_map.insert(\n            \"aws-config\".to_owned(),\n            CrateVersion {\n                category: PackageCategory::AwsRuntime,\n                version: \"0.54.1\".to_owned(),\n                source_hash: \"e93380cfbd05e68d39801cbf0113737ede552a5eceb28f4c34b090048d539df9\"\n                    .to_owned(),\n                model_hash: None,\n            },\n        );\n        crate_version_metadata_map.insert(\n            \"aws-sdk-accessanalyzer\".to_owned(),\n            CrateVersion {\n                category: PackageCategory::AwsSdk,\n                version: \"0.24.0\".to_owned(),\n                source_hash: \"a7728756b41b33d02f68a5865d3456802b7bc3949ec089790bc4e726c0de8539\"\n                    .to_owned(),\n                model_hash: Some(\n                    \"71f1f130504ebd55396c3166d9441513f97e49b281a5dd420fd7e2429860b41b\".to_owned(),\n                ),\n            },\n        );\n        crate_version_metadata_map.insert(\n            \"aws-smithy-async\".to_owned(),\n            CrateVersion {\n                category: PackageCategory::SmithyRuntime,\n                version: \"0.54.1\".to_owned(),\n                source_hash: \"8ced52afc783cbb0df47ee8b55260b98e9febdc95edd796ed14c43db5199b0a9\"\n                    .to_owned(),\n                model_hash: None,\n            },\n        );\n        let (release_title, release_notes) = render(\n            &Vec::<ChangelogEntry>::new(),\n            crate_version_metadata_map,\n            \"some header\",\n        );\n\n        assert_eq!(release_title, \"some header\\n===========\\n\");\n        let expected_body = r#\"\n**Crate Versions**\n<details>\n<summary>Click to expand to view crate versions...</summary>\n\n|Crate|Version|\n|-|-|\n|aws-config|0.54.1|\n|aws-sdk-accessanalyzer|0.24.0|\n|aws-smithy-async|0.54.1|\n</details>\n\n\"#\n        .trim_start();\n        pretty_assertions::assert_str_eq!(release_notes, expected_body);\n    }\n\n    #[test]\n    fn test_bump_release_tag_suffix() {\n        for (expected, input) in &[\n            (\"release-2024-07-18.2\", \"release-2024-07-18\"),\n            (\"release-2024-07-18.3\", \"release-2024-07-18.2\"),\n            (\n                \"release-2024-07-18.4294967295\", // u32::MAX\n                \"release-2024-07-18.4294967294\",\n            ),\n        ] {\n            assert_eq!(*expected, &bump_release_tag_suffix(*input));\n        }\n    }\n\n    #[test]\n    fn test_next_tag() {\n        // `now` falls on 2024-10-14\n        let now = OffsetDateTime::from_unix_timestamp(1_728_938_598).unwrap();\n        assert_eq!(\n            \"release-2024-10-14\",\n            &next_tag(now, &ReleaseTag::from_str(\"release-2024-10-13\").unwrap()),\n        );\n        assert_eq!(\n            \"release-2024-10-14.2\",\n            &next_tag(now, &ReleaseTag::from_str(\"release-2024-10-14\").unwrap()),\n        );\n        assert_eq!(\n            \"release-2024-10-14.3\",\n            &next_tag(now, &ReleaseTag::from_str(\"release-2024-10-14.2\").unwrap()),\n        );\n        assert_eq!(\n            \"release-2024-10-14.10\",\n            &next_tag(now, &ReleaseTag::from_str(\"release-2024-10-14.9\").unwrap()),\n        );\n    }\n}\n"
  },
  {
    "path": "tools/ci-build/changelogger/src/split.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse anyhow::{Context, Result};\nuse clap::Parser;\nuse smithy_rs_tool_common::changelog::{Changelog, ChangelogLoader};\nuse smithy_rs_tool_common::git::{find_git_repository_root, Git, GitCLI};\nuse std::path::{Path, PathBuf};\nuse std::{env, fs, mem};\n\n// Value chosen arbitrarily. It is large enough that we're unlikely to lose\n// SDK changelog entries, but small enough that the SDK changelog file\n// doesn't get too long.\nconst MAX_ENTRY_AGE: usize = 5;\n\nconst DEST_HEADER: &str =\n    \"# This file will be used by automation when cutting a release of the SDK\\n\\\n     # to include code generator change log entries into the release notes.\\n\\\n     # This is an auto-generated file. Do not edit.\\n\";\n\n#[derive(Parser, Debug, Eq, PartialEq)]\npub struct SplitArgs {\n    /// The source path to split changelog entries from\n    #[clap(long, action)]\n    pub source: PathBuf,\n    /// The destination to place changelog entries\n    #[clap(long, action)]\n    pub destination: PathBuf,\n\n    // Git revision to use in `since_commit` fields; for testing only\n    #[clap(skip)]\n    pub since_commit: Option<String>,\n    // Location of the smithy-rs repository; for testing only\n    #[clap(skip)]\n    pub smithy_rs_location: Option<PathBuf>,\n}\n\npub fn subcommand_split(args: &SplitArgs) -> Result<()> {\n    let loader = ChangelogLoader::default();\n    let combined_changelog = if args.source.is_dir() {\n        loader.load_from_dir(&args.source)\n    } else {\n        loader.load_from_file(&args.source)\n    }\n    .map_err(|errs| {\n        anyhow::Error::msg(format!(\n            \"cannot split changelogs with changelog errors: {errs:#?}\"\n        ))\n    })?;\n    let current_sdk_changelog = if args.destination.exists() {\n        loader.load_from_file(&args.destination).map_err(|errs| {\n            anyhow::Error::msg(format!(\n                \"failed to load existing SDK changelog entries: {errs:#?}\"\n            ))\n        })?\n    } else {\n        Changelog::new()\n    };\n\n    let new_sdk_entries =\n        sdk_entries(args, combined_changelog).context(\"failed to filter SDK entries\")?;\n    let sdk_changelog = merge_sdk_entries(current_sdk_changelog, new_sdk_entries);\n\n    write_entries(&args.destination, DEST_HEADER, &sdk_changelog)\n        .context(\"failed to write destination\")?;\n    Ok(())\n}\n\nfn sdk_entries(args: &SplitArgs, mut changelog: Changelog) -> Result<Changelog> {\n    changelog.smithy_rs.clear();\n\n    let current_dir = env::current_dir()?;\n    let repo_root = find_git_repository_root(\n        \"smithy-rs\",\n        args.smithy_rs_location\n            .as_deref()\n            .unwrap_or(current_dir.as_path()),\n    )\n    .context(\"failed to find smithy-rs root\")?;\n    let last_commit = GitCLI::new(&repo_root)?\n        .get_head_revision()\n        .context(\"failed to get current revision of smithy-rs\")?;\n    let last_commit = args\n        .since_commit\n        .as_deref()\n        .unwrap_or_else(|| last_commit.as_ref());\n    for entry in changelog.aws_sdk_rust.iter_mut() {\n        entry.since_commit = Some(last_commit.to_string());\n    }\n    Ok(changelog)\n}\n\nfn merge_sdk_entries(old_changelog: Changelog, new_changelog: Changelog) -> Changelog {\n    let mut merged = old_changelog;\n    merged.merge(new_changelog);\n\n    for entry in &mut merged.aws_sdk_rust {\n        *entry.age.get_or_insert(0) += 1;\n    }\n\n    let mut to_filter = Vec::new();\n    mem::swap(&mut merged.aws_sdk_rust, &mut to_filter);\n    merged.aws_sdk_rust = to_filter\n        .into_iter()\n        .filter(|entry| entry.age.expect(\"set above\") <= MAX_ENTRY_AGE)\n        .collect();\n\n    merged\n}\n\nfn write_entries(into_path: &Path, header: &str, changelog: &Changelog) -> Result<()> {\n    let json_changelog = changelog.to_json_string()?;\n    fs::write(into_path, format!(\"{header}\\n{json_changelog}\"))?;\n    Ok(())\n}\n\n#[cfg(test)]\nmod tests {\n    use super::{merge_sdk_entries, MAX_ENTRY_AGE};\n    use smithy_rs_tool_common::changelog::{Changelog, HandAuthoredEntry};\n\n    #[test]\n    fn test_merge_sdk_entries() {\n        let mut old_entries = Changelog::new();\n        old_entries.aws_sdk_rust.push(HandAuthoredEntry {\n            message: \"old-1\".into(),\n            age: None,\n            ..Default::default()\n        });\n        old_entries.aws_sdk_rust.push(HandAuthoredEntry {\n            message: \"old-2\".into(),\n            age: Some(MAX_ENTRY_AGE),\n            ..Default::default()\n        });\n        old_entries.aws_sdk_rust.push(HandAuthoredEntry {\n            message: \"old-3\".into(),\n            age: Some(1),\n            ..Default::default()\n        });\n\n        let mut new_entries = Changelog::new();\n        new_entries.aws_sdk_rust.push(HandAuthoredEntry {\n            message: \"new-1\".into(),\n            ..Default::default()\n        });\n        new_entries.aws_sdk_rust.push(HandAuthoredEntry {\n            message: \"new-2\".into(),\n            ..Default::default()\n        });\n\n        let combined = merge_sdk_entries(old_entries, new_entries);\n        assert_eq!(\"old-1\", combined.aws_sdk_rust[0].message);\n        assert_eq!(Some(1), combined.aws_sdk_rust[0].age);\n        assert_eq!(\"old-3\", combined.aws_sdk_rust[1].message);\n        assert_eq!(Some(2), combined.aws_sdk_rust[1].age);\n        assert_eq!(\"new-1\", combined.aws_sdk_rust[2].message);\n        assert_eq!(Some(1), combined.aws_sdk_rust[2].age);\n        assert_eq!(\"new-2\", combined.aws_sdk_rust[3].message);\n        assert_eq!(Some(1), combined.aws_sdk_rust[3].age);\n    }\n}\n"
  },
  {
    "path": "tools/ci-build/changelogger/tests/e2e_test.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse changelogger::entry::ChangeSet;\nuse changelogger::render::{subcommand_render, RenderArgs, EXAMPLE_ENTRY, USE_UPDATE_CHANGELOGS};\nuse changelogger::split::{subcommand_split, SplitArgs};\nuse smithy_rs_tool_common::changelog::{Changelog, HandAuthoredEntry};\nuse smithy_rs_tool_common::git::{CommitHash, Git, GitCLI};\nuse smithy_rs_tool_common::shell::handle_failure;\nuse std::fs;\nuse std::path::{Path, PathBuf};\nuse std::process::Command;\nuse tempfile::TempDir;\nuse time::{Duration, OffsetDateTime};\n\nconst SOURCE_MARKDOWN1: &str = r#\"---\napplies_to: [\"aws-sdk-rust\"]\nauthors: [\"test-dev\"]\nreferences: [\"aws-sdk-rust#123\", \"smithy-rs#456\"]\nbreaking: false\nnew_feature: false\nbug_fix: true\n---\nSome change\n\"#;\n\nconst SOURCE_MARKDOWN2: &str = r#\"---\napplies_to: [\"aws-sdk-rust\"]\nauthors: [\"test-dev\"]\nreferences: [\"aws-sdk-rust#234\", \"smithy-rs#567\"]\nbreaking: false\nnew_feature: false\nbug_fix: true\n---\nSome other change\n\"#;\n\nconst SOURCE_MARKDOWN3: &str = r#\"---\napplies_to: [\"client\", \"server\"]\nauthors: [\"another-dev\"]\nreferences: [\"smithy-rs#1234\"]\nbreaking: false\nnew_feature: false\nbug_fix: false\n---\nAnother change\n\"#;\n\nconst SDK_MODEL_SOURCE_TOML: &str = r#\"\n    [[aws-sdk-model]]\n    module = \"aws-sdk-ec2\"\n    version = \"0.12.0\"\n    kind = \"Feature\"\n    message = \"Some API change\"\n\"#;\n\nconst VERSIONS_TOML: &str = r#\"\n    smithy_rs_revision = '41ca31b85b4ba8c0ad680fe62a230266cc52cc44'\n\n    [manual_interventions]\n    crates_to_remove = []\n    [crates.aws-config]\n    category = 'AwsRuntime'\n    version = '0.54.1'\n    source_hash = 'e93380cfbd05e68d39801cbf0113737ede552a5eceb28f4c34b090048d539df9'\n\n    [crates.aws-sdk-accessanalyzer]\n    category = 'AwsSdk'\n    version = '0.24.0'\n    source_hash = 'a7728756b41b33d02f68a5865d3456802b7bc3949ec089790bc4e726c0de8539'\n    model_hash = '71f1f130504ebd55396c3166d9441513f97e49b281a5dd420fd7e2429860b41b'\n\n    [crates.aws-smithy-async]\n    category = 'SmithyRuntime'\n    version = '0.54.1'\n    source_hash = '8ced52afc783cbb0df47ee8b55260b98e9febdc95edd796ed14c43db5199b0a9'\n\n    [release]\n    tag = 'release-2023-01-26'\n\n    [release.crates]\n    aws-config = \"0.54.1\"\n    aws-sdk-accessanalyzer = '0.24.0'\n    aws-smithy-async = '0.54.1'\n\"#;\n\nfn create_fake_repo_root(\n    path: &Path,\n    smithy_rs_version: &str,\n    aws_sdk_version: &str,\n) -> (CommitHash, CommitHash) {\n    handle_failure(\n        \"git-init\",\n        &Command::new(\"git\")\n            .arg(\"init\")\n            .arg(\".\")\n            .current_dir(path)\n            .output()\n            .unwrap(),\n    )\n    .unwrap();\n    fs::write(\n        path.join(\"gradle.properties\"),\n        format!(\n            r#\"\n            smithy.rs.runtime.crate.version={}\n            aws.sdk.version={}\n            \"#,\n            smithy_rs_version, aws_sdk_version\n        ),\n    )\n    .unwrap();\n\n    // Simulate some release commits\n    let git = GitCLI::new(path).unwrap();\n    let mut release_commits = Vec::new();\n    for i in 0..2 {\n        fs::write(path.join(\"random-file\"), format!(\"{}\", i * 10)).unwrap();\n        git.stage(path).unwrap();\n        git.commit(\n            \"test-dev\",\n            \"test-dev@example.com\",\n            &format!(\"prepare release {}\", i),\n        )\n        .unwrap();\n        fs::write(path.join(\"random-file\"), format!(\"{}\", i * 10 + 1)).unwrap();\n        git.stage(path).unwrap();\n        git.commit(\n            \"test-dev\",\n            \"test-dev@example.com\",\n            &format!(\"finish release {}\", i),\n        )\n        .unwrap();\n        release_commits.push(git.get_head_revision().unwrap());\n    }\n\n    handle_failure(\n        \"git-tag\",\n        &Command::new(\"git\")\n            .arg(\"tag\")\n            .arg(\"release-1970-01-01\")\n            .current_dir(path)\n            .output()\n            .unwrap(),\n    )\n    .unwrap();\n\n    (release_commits.remove(0), release_commits.remove(0))\n}\n\nfn create_changelog_entry_markdown_files(\n    markdown_files: &[&str],\n    changelog_dir: &Path,\n) -> Vec<PathBuf> {\n    let mut source_paths = Vec::with_capacity(markdown_files.len());\n    markdown_files.iter().enumerate().for_each(|(i, md)| {\n        let source_path = changelog_dir.join(format!(\"source{i}.md\"));\n        fs::write(&source_path, md.trim()).unwrap();\n        source_paths.push(source_path);\n    });\n    source_paths\n}\n\n#[test]\nfn split_aws_sdk() {\n    let tmp_dir = TempDir::new().unwrap();\n    let dot_changelog = TempDir::new_in(tmp_dir.path()).unwrap();\n    let dot_changelog_path = dot_changelog.path().to_owned();\n    let dest_path = tmp_dir.path().join(\"dest.toml\");\n\n    create_fake_repo_root(tmp_dir.path(), \"0.42.0\", \"0.12.0\");\n    create_changelog_entry_markdown_files(\n        // Exclude `SOURCE_MARKDOWN2` to make string comparison verification at the end of this\n        // function deterministic across platforms. If `SOURCE_MARKDOWN2` were included, `dest_path`\n        // might list `SOURCE_MARKDOWN1` and `SOURCE_MARKDOWN2` in an non-deterministic order due to\n        // the use of `std::fs::read_dir` in `ChangelogLoader::load_from_dir`, making the test\n        // brittle.\n        &[SOURCE_MARKDOWN1, SOURCE_MARKDOWN3],\n        &dot_changelog_path,\n    );\n\n    let mut original_dest_changelog = Changelog::new();\n    original_dest_changelog\n        .aws_sdk_rust\n        .push(HandAuthoredEntry {\n            message: \"old-existing-entry-1\".into(),\n            // this entry should get filtered out since it's too old\n            age: Some(5),\n            ..Default::default()\n        });\n    original_dest_changelog\n        .aws_sdk_rust\n        .push(HandAuthoredEntry {\n            message: \"old-existing-entry-2\".into(),\n            age: Some(2),\n            since_commit: Some(\"commit-old-existing-entry-2\".into()),\n            ..Default::default()\n        });\n    fs::write(\n        &dest_path,\n        original_dest_changelog.to_json_string().unwrap(),\n    )\n    .unwrap();\n\n    subcommand_split(&SplitArgs {\n        source: dot_changelog_path,\n        destination: dest_path.clone(),\n        since_commit: Some(\"test-commit-hash\".into()),\n        smithy_rs_location: Some(tmp_dir.path().into()),\n    })\n    .unwrap();\n\n    let dest = fs::read_to_string(&dest_path).unwrap();\n\n    pretty_assertions::assert_str_eq!(\n        r#\"# This file will be used by automation when cutting a release of the SDK\n# to include code generator change log entries into the release notes.\n# This is an auto-generated file. Do not edit.\n\n{\n  \"smithy-rs\": [],\n  \"aws-sdk-rust\": [\n    {\n      \"message\": \"old-existing-entry-2\",\n      \"meta\": {\n        \"bug\": false,\n        \"breaking\": false,\n        \"tada\": false\n      },\n      \"author\": \"\",\n      \"references\": [],\n      \"since-commit\": \"commit-old-existing-entry-2\",\n      \"age\": 3\n    },\n    {\n      \"message\": \"Some change\",\n      \"meta\": {\n        \"bug\": true,\n        \"breaking\": false,\n        \"tada\": false\n      },\n      \"author\": \"test-dev\",\n      \"references\": [\n        \"aws-sdk-rust#123\",\n        \"smithy-rs#456\"\n      ],\n      \"since-commit\": \"test-commit-hash\",\n      \"age\": 1\n    }\n  ],\n  \"aws-sdk-model\": []\n}\"#,\n        dest\n    );\n}\n\n#[test]\nfn render_smithy_rs() {\n    let tmp_dir = TempDir::new().unwrap();\n    let dot_changelog = TempDir::new_in(tmp_dir.path()).unwrap();\n    let dot_changelog_path = dot_changelog.path().to_owned();\n    let dest_path = tmp_dir.path().join(\"dest.md\");\n    let release_manifest_path = tmp_dir.path().join(\"smithy-rs-release-manifest.json\");\n\n    create_fake_repo_root(tmp_dir.path(), \"0.42.0\", \"0.12.0\");\n\n    create_changelog_entry_markdown_files(\n        &[SOURCE_MARKDOWN1, SOURCE_MARKDOWN2, SOURCE_MARKDOWN3],\n        &dot_changelog_path,\n    );\n    fs::write(\n        &dest_path,\n        format!(\n            \"{}\\nv0.41.0 (Some date in the past)\\n=========\\n\\nOld entry contents\\n\",\n            USE_UPDATE_CHANGELOGS\n        ),\n    )\n    .unwrap();\n    fs::write(&release_manifest_path, \"overwrite-me\").unwrap();\n\n    subcommand_render(&RenderArgs {\n        change_set: ChangeSet::SmithyRs,\n        independent_versioning: true,\n        source: vec![dot_changelog_path.clone()],\n        changelog_output: dest_path.clone(),\n        source_to_truncate: Some(dot_changelog_path.clone()),\n        release_manifest_output: Some(tmp_dir.path().into()),\n        date_override: Some(OffsetDateTime::UNIX_EPOCH),\n        current_release_versions_manifest: None,\n        previous_release_versions_manifest: None,\n        smithy_rs_location: Some(tmp_dir.path().into()),\n        aws_sdk_rust_location: None,\n    })\n    .unwrap();\n\n    let dot_example = fs::read_to_string(dot_changelog_path.join(\".example\")).unwrap();\n    let dest = fs::read_to_string(&dest_path).unwrap();\n    let release_manifest = fs::read_to_string(&release_manifest_path).unwrap();\n\n    pretty_assertions::assert_str_eq!(EXAMPLE_ENTRY, dot_example);\n    pretty_assertions::assert_str_eq!(\n        r#\"<!-- Do not manually edit this file. Use the `changelogger` tool. -->\nJanuary 1st, 1970\n=================\n**New this release:**\n- (all, [smithy-rs#1234](https://github.com/smithy-lang/smithy-rs/issues/1234), @another-dev) Another change\n\n**Contributors**\nThank you for your contributions! ❤\n- @another-dev ([smithy-rs#1234](https://github.com/smithy-lang/smithy-rs/issues/1234))\n\n\nv0.41.0 (Some date in the past)\n=========\n\nOld entry contents\n\"#,\n        dest\n    );\n    pretty_assertions::assert_str_eq!(\n        r#\"{\n  \"tagName\": \"release-1970-01-01.2\",\n  \"name\": \"January 1st, 1970\",\n  \"body\": \"**New this release:**\\n- (all, [smithy-rs#1234](https://github.com/smithy-lang/smithy-rs/issues/1234), @another-dev) Another change\\n\\n**Contributors**\\nThank you for your contributions! ❤\\n- @another-dev ([smithy-rs#1234](https://github.com/smithy-lang/smithy-rs/issues/1234))\\n\\n\",\n  \"prerelease\": false\n}\"#,\n        release_manifest\n    );\n}\n\n#[test]\nfn render_aws_sdk() {\n    let tmp_dir = TempDir::new().unwrap();\n    let dot_changelog = TempDir::new_in(tmp_dir.path()).unwrap();\n    let dot_changelog_path = dot_changelog.path().to_owned();\n    let model_source_path = tmp_dir.path().join(\"model_source.toml\");\n    let dest_path = tmp_dir.path().join(\"dest.md\");\n    let release_manifest_path = tmp_dir.path().join(\"aws-sdk-rust-release-manifest.json\");\n    let previous_versions_manifest_path = tmp_dir.path().join(\"versions.toml\");\n\n    let (last_release_commit, _) = create_fake_repo_root(tmp_dir.path(), \"0.42.0\", \"0.12.0\");\n    let source_paths = create_changelog_entry_markdown_files(\n        &[SOURCE_MARKDOWN1, SOURCE_MARKDOWN3],\n        &dot_changelog_path,\n    );\n\n    // Replicate the state by running the `split` subcommand where `SOURCE_MARKDOWN1` is saved in\n    // `dest_path` as an old release SDK changelog entry. That's done by `last_release_commit` will\n    // be the value of `since-commit` for SOURCE_MARKDOWN1\n    subcommand_split(&SplitArgs {\n        source: dot_changelog_path.clone(),\n        destination: dest_path.clone(),\n        since_commit: Some(last_release_commit.as_ref().to_owned()),\n        smithy_rs_location: Some(tmp_dir.path().into()),\n    })\n    .unwrap();\n    // After split, make sure to remove `SOURCE_MARKDOWN1` from the changelog directory otherwise\n    // it'd be rendered when the subcommand `render` runs below.\n    fs::remove_file(&source_paths[0]).unwrap();\n\n    // Now that `SOURCE_MARKDOWN1` has been saved in `dest_path` as an old SDK entry, create a new\n    // SDK changelog entry in the changelog directory.\n    fs::write(\n        &dot_changelog_path.join(format!(\"123456.md\")),\n        SOURCE_MARKDOWN2.trim(),\n    )\n    .unwrap();\n\n    fs::write(&model_source_path, SDK_MODEL_SOURCE_TOML).unwrap();\n    fs::write(\n        &dest_path,\n        format!(\n            \"{}\\nv0.41.0 (Some date in the past)\\n=========\\n\\nOld entry contents\\n\",\n            USE_UPDATE_CHANGELOGS\n        ),\n    )\n    .unwrap();\n    fs::write(&release_manifest_path, \"overwrite-me\").unwrap();\n    fs::write(\n        &previous_versions_manifest_path,\n        format!(\n            \"smithy_rs_revision = '{last_release_commit}'\n                 [crates]\",\n        ),\n    )\n    .unwrap();\n\n    subcommand_render(&RenderArgs {\n        change_set: ChangeSet::AwsSdk,\n        independent_versioning: true,\n        source: vec![dot_changelog_path.clone(), model_source_path.clone()],\n        changelog_output: dest_path.clone(),\n        source_to_truncate: Some(dot_changelog_path.clone()),\n        release_manifest_output: Some(tmp_dir.path().into()),\n        date_override: Some(OffsetDateTime::UNIX_EPOCH + Duration::days(1)),\n        current_release_versions_manifest: None,\n        previous_release_versions_manifest: Some(previous_versions_manifest_path),\n        smithy_rs_location: Some(tmp_dir.path().into()),\n        aws_sdk_rust_location: None,\n    })\n    .unwrap();\n\n    let dot_example = fs::read_to_string(dot_changelog_path.join(\".example\")).unwrap();\n    let model_source = fs::read_to_string(&model_source_path).unwrap();\n    let dest = fs::read_to_string(&dest_path).unwrap();\n    let release_manifest = fs::read_to_string(&release_manifest_path).unwrap();\n\n    pretty_assertions::assert_str_eq!(EXAMPLE_ENTRY, dot_example);\n    pretty_assertions::assert_str_eq!(SDK_MODEL_SOURCE_TOML, model_source);\n\n    // It should only have one of the SDK changelog entries since\n    // the other should be filtered out by the `since_commit` attribute\n    pretty_assertions::assert_str_eq!(\n        r#\"<!-- Do not manually edit this file. Use the `changelogger` tool. -->\nJanuary 2nd, 1970\n=================\n**New this release:**\n- :bug: ([aws-sdk-rust#234](https://github.com/awslabs/aws-sdk-rust/issues/234), [smithy-rs#567](https://github.com/smithy-lang/smithy-rs/issues/567), @test-dev) Some other change\n\n**Service Features:**\n- `aws-sdk-ec2` (0.12.0): Some API change\n\n**Contributors**\nThank you for your contributions! ❤\n- @test-dev ([aws-sdk-rust#234](https://github.com/awslabs/aws-sdk-rust/issues/234), [smithy-rs#567](https://github.com/smithy-lang/smithy-rs/issues/567))\n\n\nv0.41.0 (Some date in the past)\n=========\n\nOld entry contents\n\"#,\n        dest\n    );\n    pretty_assertions::assert_str_eq!(\n        r#\"{\n  \"tagName\": \"release-1970-01-02\",\n  \"name\": \"January 2nd, 1970\",\n  \"body\": \"**New this release:**\\n- :bug: ([aws-sdk-rust#234](https://github.com/awslabs/aws-sdk-rust/issues/234), [smithy-rs#567](https://github.com/smithy-lang/smithy-rs/issues/567), @test-dev) Some other change\\n\\n**Service Features:**\\n- `aws-sdk-ec2` (0.12.0): Some API change\\n\\n**Contributors**\\nThank you for your contributions! ❤\\n- @test-dev ([aws-sdk-rust#234](https://github.com/awslabs/aws-sdk-rust/issues/234), [smithy-rs#567](https://github.com/smithy-lang/smithy-rs/issues/567))\\n\\n\",\n  \"prerelease\": false\n}\"#,\n        release_manifest\n    );\n}\n\n#[test]\nfn render_server_smithy_entry() {\n    const SERVER_ONLY_MARKDOWN: &str = r#\"---\napplies_to: [\"server\"]\nauthors: [\"server-dev\"]\nreferences: [\"smithy-rs#1\"]\nbreaking: false\nnew_feature: false\nbug_fix: false\n---\nChange from server\n\"#;\n    let tmp_dir = TempDir::new().unwrap();\n    let dot_changelog = TempDir::new_in(tmp_dir.path()).unwrap();\n    let dot_changelog_path = dot_changelog.path().to_owned();\n    let dest_path = tmp_dir.path().join(\"dest.md\");\n    let release_manifest_path = tmp_dir.path().join(\"smithy-rs-release-manifest.json\");\n\n    create_fake_repo_root(tmp_dir.path(), \"0.42.0\", \"0.12.0\");\n\n    create_changelog_entry_markdown_files(\n        // Not include other `smithy-rs` targeted entries other than `SERVER_ONLY_MARKDOWN` to make\n        // string comparison verification deterministic\n        &[SOURCE_MARKDOWN1, SOURCE_MARKDOWN2, SERVER_ONLY_MARKDOWN],\n        &dot_changelog_path,\n    );\n    fs::write(\n        &dest_path,\n        format!(\n            \"{}\\nv0.41.0 (Some date in the past)\\n=========\\n\\nOld entry contents\\n\",\n            USE_UPDATE_CHANGELOGS\n        ),\n    )\n    .unwrap();\n    fs::write(release_manifest_path, \"overwrite-me\").unwrap();\n\n    subcommand_render(&RenderArgs {\n        change_set: ChangeSet::SmithyRs,\n        independent_versioning: true,\n        source: vec![dot_changelog_path.clone()],\n        changelog_output: dest_path.clone(),\n        source_to_truncate: Some(dot_changelog_path.clone()),\n        release_manifest_output: Some(tmp_dir.path().into()),\n        date_override: Some(OffsetDateTime::UNIX_EPOCH),\n        current_release_versions_manifest: None,\n        previous_release_versions_manifest: None,\n        smithy_rs_location: Some(tmp_dir.path().into()),\n        aws_sdk_rust_location: None,\n    })\n    .unwrap();\n\n    let dot_example = fs::read_to_string(dot_changelog_path.join(\".example\")).unwrap();\n    let dest = fs::read_to_string(&dest_path).unwrap();\n\n    // source file should be empty\n    pretty_assertions::assert_str_eq!(EXAMPLE_ENTRY, &dot_example);\n    pretty_assertions::assert_str_eq!(\n        r#\"<!-- Do not manually edit this file. Use the `changelogger` tool. -->\nJanuary 1st, 1970\n=================\n**New this release:**\n- (server, [smithy-rs#1](https://github.com/smithy-lang/smithy-rs/issues/1), @server-dev) Change from server\n\n**Contributors**\nThank you for your contributions! ❤\n- @server-dev ([smithy-rs#1](https://github.com/smithy-lang/smithy-rs/issues/1))\n\n\nv0.41.0 (Some date in the past)\n=========\n\nOld entry contents\n\"#,\n        dest\n    );\n}\n\n#[test]\nfn render_client_smithy_entry() {\n    const CLIENT_ONLY_MARKDOWN: &str = r#\"---\napplies_to: [\"client\"]\nauthors: [\"client-dev\"]\nreferences: [\"smithy-rs#4\"]\nbreaking: false\nnew_feature: false\nbug_fix: false\n---\nChange from client\n\"#;\n    let tmp_dir = TempDir::new().unwrap();\n    let dot_changelog = TempDir::new_in(tmp_dir.path()).unwrap();\n    let dot_changelog_path = dot_changelog.path().to_owned();\n    let dest_path = tmp_dir.path().join(\"dest.md\");\n    let release_manifest_path = tmp_dir.path().join(\"smithy-rs-release-manifest.json\");\n\n    create_fake_repo_root(tmp_dir.path(), \"0.42.0\", \"0.12.0\");\n\n    create_changelog_entry_markdown_files(\n        // Not include other `smithy-rs` targeted entries other than `CLIENT_ONLY_MARKDOWN` to make\n        // string comparison verification deterministic\n        &[SOURCE_MARKDOWN1, SOURCE_MARKDOWN2, CLIENT_ONLY_MARKDOWN],\n        &dot_changelog_path,\n    );\n    fs::write(\n        &dest_path,\n        format!(\n            \"{}\\nv0.41.0 (Some date in the past)\\n=========\\n\\nOld entry contents\\n\",\n            USE_UPDATE_CHANGELOGS\n        ),\n    )\n    .unwrap();\n    fs::write(release_manifest_path, \"overwrite-me\").unwrap();\n\n    subcommand_render(&RenderArgs {\n        change_set: ChangeSet::SmithyRs,\n        independent_versioning: true,\n        source: vec![dot_changelog_path.clone()],\n        changelog_output: dest_path.clone(),\n        source_to_truncate: Some(dot_changelog_path.clone()),\n        release_manifest_output: Some(tmp_dir.path().into()),\n        date_override: Some(OffsetDateTime::UNIX_EPOCH),\n        current_release_versions_manifest: None,\n        previous_release_versions_manifest: None,\n        smithy_rs_location: Some(tmp_dir.path().into()),\n        aws_sdk_rust_location: None,\n    })\n    .unwrap();\n\n    let dot_example = fs::read_to_string(dot_changelog_path.join(\".example\")).unwrap();\n    let dest = fs::read_to_string(&dest_path).unwrap();\n\n    // source file should be empty\n    pretty_assertions::assert_str_eq!(EXAMPLE_ENTRY, &dot_example);\n    pretty_assertions::assert_str_eq!(\n        r#\"<!-- Do not manually edit this file. Use the `changelogger` tool. -->\nJanuary 1st, 1970\n=================\n**New this release:**\n- (client, [smithy-rs#4](https://github.com/smithy-lang/smithy-rs/issues/4), @client-dev) Change from client\n\n**Contributors**\nThank you for your contributions! ❤\n- @client-dev ([smithy-rs#4](https://github.com/smithy-lang/smithy-rs/issues/4))\n\n\nv0.41.0 (Some date in the past)\n=========\n\nOld entry contents\n\"#,\n        dest\n    );\n}\n\n#[test]\nfn render_crate_versions() {\n    let tmp_dir = TempDir::new().unwrap();\n    let dot_changelog = TempDir::new_in(tmp_dir.path()).unwrap();\n    let dot_changelog_path = dot_changelog.path().to_owned();\n    let dest_path = tmp_dir.path().join(\"dest.md\");\n    let release_manifest_path = tmp_dir.path().join(\"smithy-rs-release-manifest.json\");\n    let current_versions_manifest_path = tmp_dir.path().join(\"versions.toml\");\n\n    create_fake_repo_root(tmp_dir.path(), \"0.54.1\", \"0.24.0\");\n\n    create_changelog_entry_markdown_files(\n        &[SOURCE_MARKDOWN1, SOURCE_MARKDOWN2, SOURCE_MARKDOWN3],\n        &dot_changelog_path,\n    );\n    fs::write(\n        &dest_path,\n        format!(\n            \"{}\\nv0.54.0 (Some date in the past)\\n=========\\n\\nOld entry contents\\n\",\n            USE_UPDATE_CHANGELOGS\n        ),\n    )\n    .unwrap();\n    fs::write(&release_manifest_path, \"overwrite-me\").unwrap();\n    fs::write(&current_versions_manifest_path, VERSIONS_TOML).unwrap();\n\n    subcommand_render(&RenderArgs {\n        change_set: ChangeSet::SmithyRs,\n        independent_versioning: true,\n        source: vec![dot_changelog_path.clone()],\n        changelog_output: dest_path.clone(),\n        source_to_truncate: Some(dot_changelog_path.clone()),\n        release_manifest_output: Some(tmp_dir.path().into()),\n        date_override: Some(OffsetDateTime::UNIX_EPOCH),\n        current_release_versions_manifest: Some(current_versions_manifest_path),\n        previous_release_versions_manifest: None,\n        smithy_rs_location: Some(tmp_dir.path().into()),\n        aws_sdk_rust_location: None,\n    })\n    .unwrap();\n\n    let dot_example = fs::read_to_string(dot_changelog_path.join(\".example\")).unwrap();\n    let dest = fs::read_to_string(&dest_path).unwrap();\n    let release_manifest = fs::read_to_string(&release_manifest_path).unwrap();\n\n    pretty_assertions::assert_str_eq!(EXAMPLE_ENTRY, dot_example);\n    pretty_assertions::assert_str_eq!(\n        r#\"<!-- Do not manually edit this file. Use the `changelogger` tool. -->\nJanuary 1st, 1970\n=================\n**New this release:**\n- (all, [smithy-rs#1234](https://github.com/smithy-lang/smithy-rs/issues/1234), @another-dev) Another change\n\n**Contributors**\nThank you for your contributions! ❤\n- @another-dev ([smithy-rs#1234](https://github.com/smithy-lang/smithy-rs/issues/1234))\n\n**Crate Versions**\n<details>\n<summary>Click to expand to view crate versions...</summary>\n\n|Crate|Version|\n|-|-|\n|aws-config|0.54.1|\n|aws-sdk-accessanalyzer|0.24.0|\n|aws-smithy-async|0.54.1|\n</details>\n\n\nv0.54.0 (Some date in the past)\n=========\n\nOld entry contents\n\"#,\n        dest\n    );\n    pretty_assertions::assert_str_eq!(\n        r#\"{\n  \"tagName\": \"release-1970-01-01.2\",\n  \"name\": \"January 1st, 1970\",\n  \"body\": \"**New this release:**\\n- (all, [smithy-rs#1234](https://github.com/smithy-lang/smithy-rs/issues/1234), @another-dev) Another change\\n\\n**Contributors**\\nThank you for your contributions! ❤\\n- @another-dev ([smithy-rs#1234](https://github.com/smithy-lang/smithy-rs/issues/1234))\\n\\n**Crate Versions**\\n<details>\\n<summary>Click to expand to view crate versions...</summary>\\n\\n|Crate|Version|\\n|-|-|\\n|aws-config|0.54.1|\\n|aws-sdk-accessanalyzer|0.24.0|\\n|aws-smithy-async|0.54.1|\\n</details>\\n\\n\",\n  \"prerelease\": false\n}\"#,\n        release_manifest\n    );\n}\n"
  },
  {
    "path": "tools/ci-build/ci-action",
    "content": "#!/bin/bash\n#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\n\nset -e\n\nif [[ $# -lt 1 ]]; then\n  echo \"Usage: \"\n  echo \"    ci-action <action> [args...]\"\n  echo \"      OR\"\n  echo \"    ci-action --shell\"\n  echo\n  echo \"Runs the given action (or opens a shell) in the build Docker container.\"\n  echo \"The build image must already be acquired with 'acquire-build-image' before this is run.\"\n  echo \"The <action> is the name of a script in 'tools/ci-scripts', and the [args...] will be forwarded to it.\"\n  exit 1\nfi\n\nACTION_NAME=\"$1\"\nshift\nACTION_ARGS=(\"$@\")\n\nif [[ ! -d smithy-rs ]]; then\n  echo \"A fresh copy of smithy-rs must be checked out from the path this script is executed from.\"\n  exit 1\nfi\n\nSTART_PATH=\"$(realpath \"$(pwd)\")\"\nSCRIPT_PATH=\"$(realpath \"$(dirname \"$0\")\")\"\nACTION_PATH=\"$(\"${SCRIPT_PATH}\"/ci-create-workspace)\"\ncd \"${SCRIPT_PATH}\"\n\nfunction cleanup {\n    docker compose -f build.docker-compose.yml down\n    cd \"${START_PATH}\"\n    mv \"${ACTION_PATH}/workspace/artifacts\" .\n    if [[ -d \"${ACTION_PATH}/workspace/smithy-rs/target\" ]]; then\n        mv \"${ACTION_PATH}/workspace/smithy-rs/target\" ./smithy-rs-target\n    else\n        mkdir -p ./smithy-rs-target\n    fi\n    rm -rf \"${ACTION_PATH}\"\n}\ntrap cleanup EXIT\n\ncd \"${ACTION_PATH}\"\nUSER_ID=\"$(id -u)\"\nGROUP_ID=\"$(id -g)\"\nexport USER_ID\nexport GROUP_ID\nexport GRADLE_CACHE_PATH=\"${START_PATH}/gradle\"\ndocker compose -f build.docker-compose.yml up -d\nif [[ \"${ACTION_NAME}\" == \"--shell\" ]]; then\n    docker compose -f build.docker-compose.yml exec smithy-rs-build /bin/bash\nelse\n    docker compose -f build.docker-compose.yml exec -T smithy-rs-build bash -c \"cd workspace; ./ci-scripts/${ACTION_NAME} ${ACTION_ARGS[*]}\"\nfi\nexit $?\n"
  },
  {
    "path": "tools/ci-build/ci-create-workspace",
    "content": "#!/bin/bash\n#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\n\nset -e\n\nif [[ ! -d smithy-rs ]]; then\n  echo \"A fresh copy of smithy-rs must be checked out from the path this script is executed from.\" >&2\n  exit 1\nfi\n\nSTART_PATH=\"$(realpath \"$(pwd)\")\"\nrm -rf \"${START_PATH}/artifacts\"\nmkdir -p \"${START_PATH}/gradle\"\n\nSCRIPT_PATH=\"$(realpath \"$(dirname \"$0\")\")\"\ncd \"${SCRIPT_PATH}\"\n\nACTION_PATH=\"$(mktemp -d -t smithy-rs-build.XXXXXX)\"\n\ncp build.docker-compose.yml \"${ACTION_PATH}/\"\nmkdir -p \"${ACTION_PATH}/workspace/artifacts\"\n\n# Copy scripts into workspace\ncp -r \"${SCRIPT_PATH}/../ci-scripts\" \"${ACTION_PATH}/workspace/\"\n\n# Copy inputs into workspace\nfor input_name in \\\n    \"aws-sdk-rust\" \\\n    \"aws-sdk\" \\\n    \"aws-sdk-smoketest\" \\\n    \"smithy-rs\";\ndo\n    input_path=\"${START_PATH}/${input_name}\"\n    if [[ ! -d \"${input_path}\" ]]; then\n        # In local dev, the artifacts aren't extracted into the workspace path, but rather,\n        # remain in the `artifacts/` path. So look there too.\n        input_path=\"${START_PATH}/artifacts/${input_name}\"\n    fi\n    if [[ -d \"${input_path}\" ]]; then\n        if [[ -d \"${input_path}/.git\" ]]; then\n            # Copy the inputs across while excluding .gitignore'd files\n            EXCLUDES_FILE=\"${ACTION_PATH}/.excludes\"\n            git -C \"${input_path}\" ls-files --exclude-standard -oi --directory >\"${EXCLUDES_FILE}\"\n            rsync -ra \\\n                \"${input_path}/\" \\\n                \"${ACTION_PATH}/workspace/$(basename \"${input_path}\")\" \\\n                --exclude-from=\"${EXCLUDES_FILE}\"\n            rm \"${EXCLUDES_FILE}\"\n        else\n            cp -r \"${input_path}\" \"${ACTION_PATH}/workspace/$(basename \"${input_path}\")\"\n        fi\n    fi\ndone\n\nif [[ -d \"${START_PATH}/smithy-rs-target\" ]]; then\n    mv \"${START_PATH}/smithy-rs-target\" \"${ACTION_PATH}/workspace/smithy-rs/target\"\nfi\n\n# Output path to workspace\necho \"${ACTION_PATH}\"\n"
  },
  {
    "path": "tools/ci-build/crate-hasher/Cargo.toml",
    "content": "[package]\nname = \"crate-hasher\"\nversion = \"0.1.0\"\nauthors = [\"AWS Rust SDK Team <aws-sdk-rust@amazon.com>\"]\ndescription = \"Tool to deterministically hash a Rust crate's source code\"\nedition = \"2021\"\nlicense = \"Apache-2.0\"\npublish = false\n\n[workspace]\n\n[profile.release]\n# prefer fast compile time over runtime performance\nopt-level = 0\n\n[dependencies]\nanyhow = \"1.0\"\nclap = { version = \"~3.1.18\", features = [\"derive\"] }\n# pin to 0.4.18 to deal with newer version relying on 1.65.0\nignore = \"=0.4.18\"\nsha256 = \"1.1\"\n\n[dev-dependencies]\nflate2 = \"1.0\"\npretty_assertions = \"1.3\"\ntar = \"0.4\"\ntempfile = \"3.16.0\"\n"
  },
  {
    "path": "tools/ci-build/crate-hasher/README.md",
    "content": "# crate-hasher\nThe Crate Hasher generates deterministic hashes of crates. This is used as a dependency of `publisher generate-version-manifests` to generate the `source_hash` field:\n\n```toml\n[crates.aws-config]\ncategory = 'AwsRuntime'\nversion = '0.12.0'\nsource_hash = '12d172094a2576e6f4d00a8ba58276c0d4abc4e241bb75f0d3de8ac3412e8e47'\n```\n\nNote: (@rcoh, 4/24/2024): As far as I can tell, no tooling currently relies on the `source_hash`. It seems like this could potentially be used in `runtime-versioner audit` in the future.\n"
  },
  {
    "path": "tools/ci-build/crate-hasher/src/file_list.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse anyhow::{Context, Result};\nuse std::collections::BTreeSet;\nuse std::fmt::Write;\nuse std::fs::Metadata;\nuse std::path::Path;\n\n#[derive(Debug, Default)]\npub struct FileList(BTreeSet<FileMetadata>);\n\nimpl FileList {\n    pub fn new() -> Self {\n        Self(BTreeSet::new())\n    }\n\n    /// Inserts file metadata into the list\n    fn insert(&mut self, file_metadata: FileMetadata) {\n        self.0.insert(file_metadata);\n    }\n\n    /// Returns the SHA-256 hash of the file list\n    pub fn sha256(&self) -> String {\n        sha256::digest(self.entries())\n    }\n\n    /// Returns the hashable entries in this file list\n    pub fn entries(&self) -> String {\n        let mut entries = String::new();\n        for metadata in &self.0 {\n            entries.push_str(&metadata.hash_entry());\n        }\n        entries\n    }\n\n    /// Uses Cargo's `PathSource` implementation to discover which files are relevant to building the crate\n    pub fn discover(location: &Path) -> Result<FileList> {\n        let location = location.canonicalize().context(\"canonicalize input path\")?;\n        let mut file_list = FileList::new();\n\n        let mut ignore_builder = ignore::WalkBuilder::new(&location);\n        ignore_builder\n            .ignore(false) // Don't consider .ignore files\n            .git_ignore(true) // Do consider .gitignore files\n            .require_git(false) // Don't require a git repository to consider .gitignore\n            .hidden(true); // Ignore hidden files\n        ignore_builder\n            .add_ignore(\"/target\") // Ignore root target directories\n            .expect(\"valid ignore path\");\n        for dir_entry in ignore_builder.build() {\n            let dir_entry = dir_entry.context(\"dir_entry\")?;\n            if !dir_entry.file_type().context(\"file_type\")?.is_dir() {\n                let path = dir_entry.path();\n                let relative_path = path\n                    .strip_prefix(&location)\n                    .expect(\"location is the parent directory\");\n\n                file_list.insert(FileMetadata {\n                    mode: file_mode(path, &dir_entry.metadata()?).context(\"file mode\")?,\n                    path: relative_path\n                        .to_str()\n                        .expect(\"not using unusual file names in crate source\")\n                        .into(),\n                    sha256: sha256::try_digest(path).context(\"hash file\")?,\n                });\n            }\n        }\n        Ok(file_list)\n    }\n}\n\n/// Hashable metadata about a crate file\n#[derive(Debug, Ord, PartialOrd, Eq, PartialEq)]\nstruct FileMetadata {\n    // Order of these members MUST NOT change, or else the file order will change which will break hashing\n    path: String,\n    mode: u32,\n    sha256: String,\n}\n\nimpl FileMetadata {\n    /// Returns a string to hash for this file\n    fn hash_entry(&self) -> String {\n        let mut entry = String::with_capacity(7 + self.path.len() + 1 + self.sha256.len() + 1);\n        write!(&mut entry, \"{:06o} \", self.mode).unwrap();\n        entry.push_str(&self.path);\n        entry.push(' ');\n        entry.push_str(&self.sha256);\n        entry.push('\\n');\n        entry\n    }\n}\n\n/// Returns the file mode (permissions) for the given path.\n///\n/// On Windows, this returns the file attributes instead of the permissions.\nfn file_mode(path: &Path, metadata: &Metadata) -> Result<u32> {\n    #[cfg(windows)]\n    {\n        use std::os::windows::fs::MetadataExt;\n        let _ = path; // Unused on Windows\n\n        // Not actually equivalent to a unix permission, but good enough to be hashed.\n        Ok(metadata.file_attributes())\n    }\n\n    #[cfg(unix)]\n    {\n        use std::os::unix::fs::PermissionsExt;\n\n        if metadata.file_type().is_symlink() {\n            let actual_path = std::fs::read_link(path).context(\"follow symlink\")?;\n            let actual_metadata = std::fs::metadata(&actual_path).context(\"file metadata\")?;\n            file_mode(&actual_path, &actual_metadata)\n        } else {\n            Ok(metadata.permissions().mode())\n        }\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::FileMetadata;\n\n    #[test]\n    fn hash_entry() {\n        let metadata = FileMetadata {\n            path: \"src/something.rs\".into(),\n            mode: 0o100644,\n            sha256: \"521fe5c9ece1aa1f8b66228171598263574aefc6fa4ba06a61747ec81ee9f5a3\".into(),\n        };\n        assert_eq!(\"100644 src/something.rs 521fe5c9ece1aa1f8b66228171598263574aefc6fa4ba06a61747ec81ee9f5a3\\n\", metadata.hash_entry());\n    }\n}\n"
  },
  {
    "path": "tools/ci-build/crate-hasher/src/lib.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npub mod file_list;\n"
  },
  {
    "path": "tools/ci-build/crate-hasher/src/main.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Discovers files relevant to the build of a given crate, and\n//! prints out a determistic SHA-256 of the entire crate contents.\n\nuse anyhow::Result;\nuse clap::Parser;\nuse file_list::FileList;\nuse std::path::PathBuf;\n\nmod file_list;\n\n#[derive(Parser, Debug)]\n#[clap(author, version, about)]\nstruct Args {\n    location: PathBuf,\n}\n\npub fn main() -> Result<()> {\n    let file_list = FileList::discover(&Args::parse().location)?;\n    println!(\"{}\", file_list.sha256());\n    Ok(())\n}\n"
  },
  {
    "path": "tools/ci-build/crate-hasher/tests/aws-smithy-async-2022-04-08-entries.txt",
    "content": "100644 Cargo.toml 6e946659277aece28b5ee18cc8ea027a47f96b00c7a0d5d6156ca32f617ffd11\n100644 LICENSE 09e8a9bcec8067104652c168685ab0931e7868f9c8284b66f5ae6edae5f1130b\n100644 README.md 7e82b8ac569e59f982b11194644513d336d11cd6c644e08a60626fc8a6311bce\n100755 additional-ci d588bbcf28b6803f68865cd4c217f3e7746803ed33ca276a2065ee6621f2d39c\n100644 src/future/fn_stream.rs 1fcfbafdc0ad00f6ce7a401ccfee0b06769afc7c3f8c1b12e5651c3052379dc6\n100644 src/future/mod.rs 7aaa59847c9d72b802fa95c42b11ab176bdadecdd0a45e34a0291992a3a662f9\n100644 src/future/never.rs 2a0c30e174ae2613d0a39ff12ef0660d2af4f96fae97860d03a3fd8bf46c59a6\n100644 src/future/now_or_later.rs 32ff3a5e5a88843a53e50ea3d17acf5567f907b4818deec43c08931c68701978\n100644 src/future/rendezvous.rs 2f7dcfa2f03a1d0fd240fa5fc186836460d01e594a4ed6f7f015e1784f4ddd6c\n100644 src/future/timeout.rs 5fbef9474a62b4dc0d93baa2fa1d4795c1f72802fc3d6e39f2b998d332fc417b\n100644 src/lib.rs 4518f604c15ea6464b59c797af042a362685f5feb865e42008278a8b9df8dc9c\n100644 src/rt/mod.rs 26a788da27f50cc1dad56ae8ef391cc748761c668129c3882f077eb54e448c46\n100644 src/rt/sleep.rs 776b6bfec2979ab8284f1b7f95498bfad6d2472fcfccb181426cec2fae623c10\n"
  },
  {
    "path": "tools/ci-build/crate-hasher/tests/test.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse anyhow::Result;\nuse flate2::read::GzDecoder;\nuse std::fs::File;\nuse std::process::Command;\nuse tar::Archive;\nuse tempfile::TempDir;\n\nuse crate_hasher::file_list::FileList;\n\nfn assert_correct_aws_smithy_async_hash(file_list: &FileList) {\n    pretty_assertions::assert_eq!(\n        include_str!(\"./aws-smithy-async-2022-04-08-entries.txt\"),\n        file_list.entries()\n    );\n    assert_eq!(\n        \"5f54783ff6ca7a899476ab5fa5388d82847f5052d96d3cbb64eb6830e22b0762\",\n        file_list.sha256()\n    );\n}\n\n#[test]\nfn test_against_aws_smithy_async() -> Result<()> {\n    let dir = TempDir::new()?.path().join(\"test_against_aws_smithy_async\");\n\n    let tar = GzDecoder::new(File::open(\"tests/aws-smithy-async-2022-04-08.tar.gz\")?);\n    let mut archive = Archive::new(tar);\n    archive.unpack(&dir)?;\n\n    let file_list = FileList::discover(&dir.as_path().join(\"aws-smithy-async\"))?;\n    assert_correct_aws_smithy_async_hash(&file_list);\n    Ok(())\n}\n\n#[test]\nfn test_against_aws_smithy_async_with_ignored_files() -> Result<()> {\n    let dir = TempDir::new()?.path().join(\"test_against_aws_smithy_async\");\n\n    let tar = GzDecoder::new(File::open(\"tests/aws-smithy-async-2022-04-08.tar.gz\")?);\n    let mut archive = Archive::new(tar);\n    archive.unpack(&dir)?;\n\n    std::fs::create_dir(dir.as_path().join(\"target\"))?;\n    std::fs::write(\n        dir.as_path().join(\"target/something\"),\n        b\"some data that should be excluded\",\n    )?;\n\n    let file_list = FileList::discover(&dir.as_path().join(\"aws-smithy-async\"))?;\n    assert_correct_aws_smithy_async_hash(&file_list);\n\n    Ok(())\n}\n\n#[test]\nfn test_against_aws_smithy_async_with_git_repo() -> Result<()> {\n    let dir = TempDir::new()?.path().join(\"test_against_aws_smithy_async\");\n\n    let tar = GzDecoder::new(File::open(\"tests/aws-smithy-async-2022-04-08.tar.gz\")?);\n    let mut archive = Archive::new(tar);\n    archive.unpack(&dir)?;\n\n    // Create a git repository that should be excluded from the hash\n    Command::new(\"git\")\n        .arg(\"init\")\n        .arg(\".\")\n        .current_dir(&dir.as_path().join(\"aws-smithy-async\"))\n        .output()?;\n\n    let file_list = FileList::discover(&dir.as_path().join(\"aws-smithy-async\"))?;\n    assert_correct_aws_smithy_async_hash(&file_list);\n\n    Ok(())\n}\n"
  },
  {
    "path": "tools/ci-build/difftags/Cargo.toml",
    "content": "[package]\nname = \"difftags\"\nversion = \"0.1.0\"\nedition = \"2021\"\npublish = false\n\n# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html\n\n[profile.release]\n# prefer fast compile time over runtime performance\nopt-level = 0\n\n[dependencies]\nclap = { version = \"3.2.23\", features = [\"derive\"] }\nhtml-escape = { version = \"0.2.13\", default-features = false }\nunidiff = { version = \"0.3.3\", default-features = false }\n"
  },
  {
    "path": "tools/ci-build/difftags/README.md",
    "content": "difftags\n========\n\nSimple CLI tool to convert a unified diff file into human readable/browsable paginated HTML files.\n\n\nThis is used by the [GitHub PR Bot](../../../.github/)\n"
  },
  {
    "path": "tools/ci-build/difftags/src/difftags.css",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nbody {\n    font-family: sans-serif;\n}\n\n.file {\n    border: 1px solid #d8d8d8;\n    border-radius: 10px;\n    margin: 15px 10px;\n    background-color: #f7f7f7;\n}\n\n.file-name {\n    display: block;\n    border-bottom: 1px solid #d8d8d8;\n    padding: 10px;\n    margin: 0;\n}\n\n.hidden {\n    display: none !important;\n}\n\n.context-row {\n    display: block;\n    padding: 10px;\n    background-color: #f8fafd;\n    color: #666;\n    border-bottom: 1px solid #d8d8d8;\n    font-family: monospace;\n}\n\n.diff td {\n    vertical-align: top;\n    padding: 1px 5px;\n}\n\n.lineno {\n    width: 140px;\n    max-width: 140px;\n}\n\n.lr { background-color: #fee8e9; } /* line removed */\n.la { background-color: #dfd; } /* line added */\n\n.pagination {\n    font-size: 2em;\n}\n\n.current-page {\n    font-weight: bold;\n}\n\n.hljs {\n    padding: 0 !important;\n    background: inherit;\n}\n\npre {\n    margin: 0;\n}\n"
  },
  {
    "path": "tools/ci-build/difftags/src/difftags.js",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nfunction expandTable(event, id) {\n    event.preventDefault();\n    const table = document.querySelector(`#${id}`);\n    table.classList.remove(\"hidden\");\n\n    const expander = document.querySelector(`#${id}-exp`);\n    expander.classList.add(\"hidden\");\n}\n"
  },
  {
    "path": "tools/ci-build/difftags/src/html.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::page::{File, Page};\nuse html_escape::encode_safe;\nuse std::fs;\nuse std::io::{Result, Write};\nuse std::path::{Path, PathBuf};\nuse unidiff::Line;\n\npub fn write_html(\n    output_dir: &Path,\n    title: Option<String>,\n    subtitle: Option<String>,\n    pages: &[Page],\n) -> Result<()> {\n    for (page_num, page) in pages.iter().enumerate() {\n        let file_path = file_path(output_dir, page_num);\n        let mut file = fs::File::create(file_path)?;\n\n        write_header(&mut file, title.as_deref(), subtitle.as_deref(), pages)?;\n        for (file_num, page_file) in page.files.iter().enumerate() {\n            write_file(&mut file, page_file, page_num, file_num)?;\n        }\n        write_footer(&mut file, page_num, pages.len())?;\n    }\n    Ok(())\n}\n\nfn file_id(page_num: usize, file_num: usize) -> String {\n    format!(\"file-{page_num}-{file_num}\")\n}\n\nfn file_name(page_num: usize) -> String {\n    match page_num {\n        0 => \"index.html\".into(),\n        _ => format!(\"index_page_{page_num}.html\"),\n    }\n}\n\nfn file_path(output_dir: &Path, page_num: usize) -> PathBuf {\n    output_dir.join(file_name(page_num))\n}\n\nfn write_header<W: Write>(\n    mut w: W,\n    title: Option<&str>,\n    subtitle: Option<&str>,\n    pages: &[Page],\n) -> Result<()> {\n    let title = encode_safe(title.unwrap_or(\"Diff\"));\n    writeln!(w, \"<!doctype html>\")?;\n    writeln!(w, \"<html>\")?;\n    writeln!(w, \"<head>\")?;\n    writeln!(w, \"  <metadata charset=\\\"utf-8\\\">\")?;\n    writeln!(w, \"  <title>{title}</title>\",)?;\n    writeln!(w, \"  <link rel=\\\"stylesheet\\\" href=\\\"https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.7.0/styles/default.min.css\\\" />\")?;\n    writeln!(w, \"  <script src=\\\"https://cdnjs.cloudflare.com/ajax/libs/highlight.js/11.7.0/highlight.min.js\\\"></script>\")?;\n    writeln!(w, \"  <style>\\n{}\\n</style>\", include_str!(\"difftags.css\"))?;\n    writeln!(w, \"  <script>\\n{}\\n</script>\", include_str!(\"difftags.js\"))?;\n    writeln!(w, \"</head>\")?;\n    writeln!(w, \"<body>\")?;\n    writeln!(w, \"  <h1>{title}</h1>\")?;\n    if let Some(subtitle) = subtitle {\n        writeln!(w, \"  <p>{subtitle}</p>\")?;\n    }\n\n    writeln!(w, \"  <h3>Files changed:</h3>\")?;\n    writeln!(w, \"  <ul>\")?;\n    for (page_num, page) in pages.iter().enumerate() {\n        for (file_num, page_file) in page.files.iter().enumerate() {\n            writeln!(\n                w,\n                \"    <li><a href=\\\"{}#{}\\\">{}</a></li>\",\n                file_name(page_num),\n                file_id(page_num, file_num),\n                encode_safe(page_file.name())\n            )?;\n        }\n    }\n    writeln!(w, \"  </ul>\")?;\n\n    Ok(())\n}\n\nfn write_footer<W: Write>(mut w: W, page_num: usize, page_count: usize) -> Result<()> {\n    writeln!(w, \"  <div class=\\\"pagination\\\">Pages: \")?;\n    for index in 0..page_count {\n        writeln!(\n            w,\n            \"  <a href=\\\"{}\\\"{}>{}</a>\",\n            file_name(index),\n            if index == page_num {\n                \" class=\\\"current-page\\\"\"\n            } else {\n                \"\"\n            },\n            index + 1\n        )?;\n    }\n    writeln!(w, \"  </div>\")?;\n    writeln!(w, \"  <script>hljs.highlightAll();</script>\")?;\n    writeln!(w, \"</body>\")?;\n    writeln!(w, \"</html>\")\n}\n\nfn write_file<W: Write>(mut w: W, file: &File, page_num: usize, file_num: usize) -> Result<()> {\n    writeln!(w, \"  <div class=\\\"file\\\">\")?;\n    writeln!(\n        w,\n        \"    <h3 class=\\\"file-name\\\"><a id=\\\"{}\\\">{}</a></h3>\",\n        file_id(page_num, file_num),\n        encode_safe(file.name())\n    )?;\n    if let File::Modified { old_name, .. } = file {\n        if file.name() != old_name {\n            writeln!(\n                w,\n                \"    <h4 class=\\\"file-name\\\">Renamed from {}</h3>\",\n                encode_safe(old_name)\n            )?;\n        }\n    }\n\n    for (section_num, section) in file.sections().iter().enumerate() {\n        writeln!(\n            w,\n            \"    <div class=\\\"context-row\\\">@@ -{},{} +{},{} @@</div>\",\n            section.start_line.0, section.start_line.1, section.end_line.0, section.end_line.1\n        )?;\n        if let Some(context_prefix) = &section.context_prefix {\n            write_diff_table(\n                &mut w,\n                context_prefix,\n                DiffTableType::Prefix,\n                page_num,\n                file_num,\n                section_num * 10000 + 1,\n            )?;\n        }\n        write_diff_table(\n            &mut w,\n            &section.diff,\n            DiffTableType::Main,\n            page_num,\n            file_num,\n            section_num * 10000 + 2,\n        )?;\n        if let Some(context_suffix) = &section.context_suffix {\n            write_diff_table(\n                &mut w,\n                context_suffix,\n                DiffTableType::Suffix,\n                page_num,\n                file_num,\n                section_num * 10000 + 3,\n            )?;\n        }\n    }\n    writeln!(w, \"  </div>\")?;\n    Ok(())\n}\n\n#[derive(Debug, Eq, PartialEq)]\nenum DiffTableType {\n    Prefix,\n    Main,\n    Suffix,\n}\n\nfn write_diff_table<W: Write>(\n    mut w: W,\n    lines: &[Line],\n    typ: DiffTableType,\n    page_num: usize,\n    file_num: usize,\n    table_num: usize,\n) -> Result<()> {\n    let table_id = format!(\"cd-{page_num}-{file_num}-{table_num}\");\n    if typ != DiffTableType::Main {\n        writeln!(\n            w,\n            \"    <div id=\\\"{table_id}-exp\\\" class=\\\"context-row\\\"><a href=\\\"#\\\" onclick=\\\"expandTable(event, '{table_id}')\\\">{} Expand context</a></div>\",\n            match typ {\n                DiffTableType::Prefix => \"&#8613;\",\n                DiffTableType::Suffix => \"&#8615;\",\n                _ => unreachable!(),\n            }\n        )?;\n    }\n    writeln!(\n        w,\n        \"    <table id=\\\"{table_id}\\\" class=\\\"diff{}\\\" cellspacing=\\\"0\\\" width=\\\"100%\\\">\",\n        if typ != DiffTableType::Main {\n            \" hidden\"\n        } else {\n            \"\"\n        }\n    )?;\n    for line in lines {\n        write_line(&mut w, line)?;\n    }\n    writeln!(w, \"    </table>\")\n}\n\nfn write_line<W: Write>(mut w: W, line: &Line) -> Result<()> {\n    write!(\n        w,\n        \"      <tr{}>\",\n        match line.line_type.as_str() {\n            \"-\" => \" class=\\\"lr\\\"\",\n            \"+\" => \" class=\\\"la\\\"\",\n            _ => \"\",\n        }\n    )?;\n    write!(\n        w,\n        \"<td class=\\\"lineno\\\"><pre>{:>5}  {:>5}  {}</pre></td>\",\n        line.source_line_no\n            .map(|n| n.to_string())\n            .unwrap_or_default(),\n        line.target_line_no\n            .map(|n| n.to_string())\n            .unwrap_or_default(),\n        line.line_type\n    )?;\n    writeln!(\n        w,\n        \"<td><pre><code>{}</code></pre></td></tr>\",\n        encode_safe(&line.value)\n    )\n}\n"
  },
  {
    "path": "tools/ci-build/difftags/src/main.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::page::{File, Page, PageTracker};\nuse clap::Parser;\nuse std::fs;\nuse std::path::PathBuf;\nuse std::process;\nuse unidiff::PatchSet;\n\nmod html;\nmod page;\n\n#[derive(Debug, Parser)]\n#[clap(name = \"difftags\", version)]\n#[clap(about = \"Diff to HTML conversion tool\")]\nstruct Cli {\n    /// Directory to output to\n    #[clap(short, long)]\n    output_dir: PathBuf,\n\n    /// Diff file to convert to HTML, in unified diff format\n    input: PathBuf,\n\n    /// Maximum files per page of HTML\n    #[clap(long, default_value = \"15\")]\n    max_files_per_page: usize,\n\n    /// Maximum modified lines per page of HTML\n    #[clap(long, default_value = \"1000\")]\n    max_lines_per_page: usize,\n\n    /// Title to apply to the diff\n    #[clap(long)]\n    title: Option<String>,\n\n    /// Optional subtitle to appear under the title\n    #[clap(long)]\n    subtitle: Option<String>,\n}\n\nfn main() {\n    let args = Cli::parse();\n    let diff_str = match fs::read_to_string(args.input) {\n        Ok(diff_str) => diff_str,\n        Err(err) => {\n            eprintln!(\"failed to load the input diff file: {err}\");\n            process::exit(1)\n        }\n    };\n\n    let mut patch = PatchSet::new();\n    if let Err(err) = patch.parse(&diff_str) {\n        eprintln!(\"failed to parse the input diff file: {err}\");\n        process::exit(1)\n    }\n\n    let mut pages = Vec::new();\n    let mut page_tracker = PageTracker::new(args.max_files_per_page, args.max_lines_per_page);\n    let mut current_page = Page::default();\n    for patched_file in patch {\n        if page_tracker.next_file_is_page_boundary() {\n            pages.push(current_page);\n            current_page = Page::default();\n            page_tracker.reset();\n        }\n        let file: File = patched_file.into();\n        page_tracker.total_modified_lines(\n            file.sections()\n                .iter()\n                .map(|section| {\n                    section\n                        .diff\n                        .iter()\n                        .filter(|line| line.line_type != \" \")\n                        .count()\n                })\n                .sum(),\n        );\n        current_page.files.push(file);\n    }\n    pages.push(current_page);\n\n    if let Err(err) = html::write_html(&args.output_dir, args.title, args.subtitle, &pages) {\n        eprintln!(\"failed to write HTML: {err}\");\n        process::exit(1)\n    }\n}\n"
  },
  {
    "path": "tools/ci-build/difftags/src/page.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse unidiff::{Hunk, Line, PatchedFile};\n\n/// Number of lines before and after the first modified and last modified lines in a diff that will\n/// be displayed by default. Lines outside of this range will be hidden by default (but can be shown\n/// by clicking a link to expand the context).\nconst DISPLAYED_CONTEXT_LINES: usize = 10;\n\n#[derive(Debug, Default)]\npub struct PageTracker {\n    max_files_per_page: usize,\n    max_lines_per_page: usize,\n    files: usize,\n    lines: usize,\n}\n\nimpl PageTracker {\n    pub fn new(max_files_per_page: usize, max_lines_per_page: usize) -> Self {\n        Self {\n            max_files_per_page,\n            max_lines_per_page,\n            files: 0,\n            lines: 0,\n        }\n    }\n\n    pub fn next_file_is_page_boundary(&mut self) -> bool {\n        self.files += 1;\n        self.files > self.max_files_per_page || self.lines >= self.max_lines_per_page\n    }\n\n    pub fn total_modified_lines(&mut self, lines: usize) {\n        self.lines += lines;\n    }\n\n    pub fn reset(&mut self) {\n        self.files = 0;\n        self.lines = 0;\n    }\n}\n\n#[derive(Debug, Default)]\npub struct Page {\n    pub files: Vec<File>,\n}\n\n#[derive(Debug)]\npub enum File {\n    New {\n        name: String,\n        sections: Vec<Section>,\n    },\n    Removed {\n        name: String,\n        sections: Vec<Section>,\n    },\n    Modified {\n        old_name: String,\n        new_name: String,\n        sections: Vec<Section>,\n    },\n}\n\nimpl File {\n    pub fn name(&self) -> &str {\n        match self {\n            Self::New { name, .. } => name,\n            Self::Removed { name, .. } => name,\n            Self::Modified { new_name, .. } => new_name,\n        }\n    }\n    pub fn sections(&self) -> &[Section] {\n        match self {\n            Self::New { sections, .. } => sections.as_ref(),\n            Self::Removed { sections, .. } => sections.as_ref(),\n            Self::Modified { sections, .. } => sections.as_ref(),\n        }\n    }\n}\n\nimpl From<PatchedFile> for File {\n    fn from(patched_file: PatchedFile) -> Self {\n        let sections = patched_file.hunks().iter().map(Section::from).collect();\n        let source = patched_file\n            .source_file\n            .strip_prefix(\"a/\")\n            .unwrap_or(&patched_file.source_file);\n        let target = patched_file\n            .target_file\n            .strip_prefix(\"b/\")\n            .unwrap_or(&patched_file.target_file);\n        if source == \"/dev/null\" {\n            File::New {\n                name: target.into(),\n                sections,\n            }\n        } else if target == \"/dev/null\" {\n            File::Removed {\n                name: source.into(),\n                sections,\n            }\n        } else {\n            File::Modified {\n                old_name: source.into(),\n                new_name: target.into(),\n                sections,\n            }\n        }\n    }\n}\n\n#[derive(Debug)]\npub struct Section {\n    pub start_line: (usize, usize),\n    pub context_prefix: Option<Vec<Line>>,\n    pub diff: Vec<Line>,\n    pub context_suffix: Option<Vec<Line>>,\n    pub end_line: (usize, usize),\n}\n\nimpl From<&Hunk> for Section {\n    fn from(hunk: &Hunk) -> Self {\n        assert!(!hunk.lines().is_empty());\n        let mut diff_start = None;\n        let mut suffix_start = None;\n        for (index, line) in hunk.lines().iter().enumerate() {\n            if diff_start.is_none() {\n                if line.line_type != \" \" {\n                    diff_start = Some(index);\n                }\n            } else if suffix_start.is_some() && line.line_type != \" \" {\n                suffix_start = None;\n            } else if suffix_start.is_none() && line.line_type == \" \" {\n                suffix_start = Some(index);\n            }\n        }\n\n        let diff_start = diff_start.unwrap().saturating_sub(DISPLAYED_CONTEXT_LINES);\n        let suffix_start = usize::min(\n            hunk.lines().len(),\n            suffix_start\n                .unwrap_or_else(|| hunk.lines().len())\n                .saturating_add(DISPLAYED_CONTEXT_LINES),\n        );\n\n        let context_prefix: Vec<Line> = (&hunk.lines()[0..diff_start]).into();\n        let lines: Vec<Line> = (&hunk.lines()[diff_start..suffix_start]).into();\n        let context_suffix: Vec<Line> = (&hunk.lines()[suffix_start..]).into();\n        let end_line = &hunk.lines()[hunk.lines().len() - 1];\n\n        Self {\n            start_line: (\n                hunk.lines()[0].source_line_no.unwrap_or_default(),\n                hunk.lines()[0].target_line_no.unwrap_or_default(),\n            ),\n            context_prefix: if context_prefix.is_empty() {\n                None\n            } else {\n                Some(context_prefix)\n            },\n            diff: lines,\n            context_suffix: if context_suffix.is_empty() {\n                None\n            } else {\n                Some(context_suffix)\n            },\n            end_line: (\n                end_line.source_line_no.unwrap_or_default(),\n                end_line.target_line_no.unwrap_or_default(),\n            ),\n        }\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use unidiff::PatchSet;\n\n    #[test]\n    fn test_hunk_to_section() {\n        let diff_str = r#\"\ndiff --git a/some/path/to/file.rs b/some/path/to/file.rs\nindex 422b64415..9561909ed 100644\n--- a/some/path/to/file.rs\n+++ b/some/path/to/file.rs\n@@ -1,31 +1,31 @@\n 00\n 01\n 02\n 03\n 04\n 05\n 06\n 07\n 08\n 09\n 10\n 11\n 12\n 13\n 14\n-oops\n+15\n 16\n 17\n 18\n 19\n 20\n 21\n 22\n 23\n 24\n 25\n 26\n 27\n 28\n 29\n 30\n        \"#;\n        let mut patch = PatchSet::new();\n        patch.parse(diff_str).unwrap();\n\n        let hunk = &patch.files()[0].hunks()[0];\n        let section: Section = hunk.into();\n\n        assert_eq!((1, 1), section.start_line);\n        assert_eq!((31, 31), section.end_line);\n        assert_eq!(5, section.context_prefix.as_ref().unwrap().len());\n        assert_eq!(22, section.diff.len());\n        assert_eq!(\n            \"05\", section.diff[0].value,\n            \"the first line of the diff should be {DISPLAYED_CONTEXT_LINES} lines before the first modified line\"\n        );\n        assert_eq!(\n            \"25\", section.diff[21].value,\n            \"the last line of the diff should be {DISPLAYED_CONTEXT_LINES} lines after the last modified line\"\n        );\n        assert_eq!(5, section.context_suffix.as_ref().unwrap().len());\n        assert_eq!(\"26\", section.context_suffix.as_ref().unwrap()[0].value);\n        assert_eq!(\"30\", section.context_suffix.as_ref().unwrap()[4].value);\n\n        let diff_str = r#\"\ndiff --git a/some/path/to/file.rs b/some/path/to/file.rs\nindex 422b64415..9561909ed 100644\n--- a/some/path/to/file.rs\n+++ b/some/path/to/file.rs\n@@ -1,38 +1,36 @@\n 00\n 01\n 02\n 03\n 04\n 05\n 06\n 07\n 08\n 09\n 10\n 11\n 12\n 13\n 14\n-oops\n+15\n 16\n 17\n 18\n 19\n-oops1\n-oops2\n-oops3\n+20\n 21\n 22\n 23\n 24\n 25\n 26\n 27\n 28\n 29\n 31\n 32\n 33\n 34\n 35\n 36\n        \"#;\n        let mut patch = PatchSet::new();\n        patch.parse(diff_str).unwrap();\n\n        let hunk = &patch.files()[0].hunks()[0];\n        let section: Section = hunk.into();\n\n        assert_eq!((1, 1), section.start_line);\n        assert_eq!((38, 36), section.end_line);\n        assert_eq!(5, section.context_prefix.as_ref().unwrap().len());\n        assert_eq!(30, section.diff.len());\n        assert_eq!(\n            \"05\", section.diff[0].value,\n            \"the first line of the diff should be {DISPLAYED_CONTEXT_LINES} lines before the first modified line\"\n        );\n        assert_eq!(\n            \"31\", section.diff[29].value,\n            \"the last line of the diff should be {DISPLAYED_CONTEXT_LINES} lines after the last modified line\"\n        );\n        assert_eq!(5, section.context_suffix.as_ref().unwrap().len());\n        assert_eq!(\"32\", section.context_suffix.as_ref().unwrap()[0].value);\n        assert_eq!(\"36\", section.context_suffix.as_ref().unwrap()[4].value);\n    }\n}\n"
  },
  {
    "path": "tools/ci-build/publisher/Cargo.toml",
    "content": "[package]\nname = \"publisher\"\nversion = \"0.4.3\"\nauthors = [\"AWS Rust SDK Team <aws-sdk-rust@amazon.com>\"]\ndescription = \"Tool used to publish the AWS SDK to crates.io\"\nedition = \"2021\"\nlicense = \"Apache-2.0\"\npublish = false\n\n[workspace]\n\n[profile.release]\n# prefer fast compile time over runtime performance\nopt-level = 0\n\n[dependencies]\nanyhow = \"1.0\"\nasync-recursion = \"0.3.2\"\nasync-trait = \"0.1.74\"\ncargo_toml = \"0.16.3\"\nclap = { version = \"~3.1.18\", features = [\"derive\"] }\ndialoguer = \"0.8\"\nfs-err = \"2\"\nhandlebars = \"4.2\"\nregex-lite = \"0.1.5\"\nsemver = \"1.0\"\nserde = { version = \"1\", features = [\"derive\"] }\nserde_json = \"1\"\nsha256 = \"1\"\nsmithy-rs-tool-common = { version = \"0.1\", path = \"../smithy-rs-tool-common\", features = [\"async\"] }\ntempfile = \"3.16.0\"\nthiserror = \"1.0\"\ntokio = { version = \"1.20.1\", features = [\"full\"] }\ntoml = { version = \"0.5.8\", features = [\"preserve_order\"] }\ntracing = \"0.1.29\"\ntracing-subscriber = { version = \"0.3.15\", features = [\"env-filter\"] }\n\n[dev-dependencies]\npretty_assertions = \"1.3\"\n"
  },
  {
    "path": "tools/ci-build/publisher/README.md",
    "content": "This is a tool that the SDK developer team uses to publish the AWS SDK to crates.io.\n"
  },
  {
    "path": "tools/ci-build/publisher/fake_cargo/cargo_fails",
    "content": "#!/bin/bash\necho \"some stdout failure message\"\n>&2 echo \"some stderr failure message\"\nexit 1\n"
  },
  {
    "path": "tools/ci-build/publisher/fake_cargo/cargo_owner_list",
    "content": "#!/bin/bash\n>&2 echo \"     Updating crates.io index\"\necho \"rcoh (Russell Cohen)\"\necho \"github:awslabs:rust-sdk-owners (rust-sdk-owners)\"\n"
  },
  {
    "path": "tools/ci-build/publisher/fake_cargo/cargo_publish_already_published",
    "content": "#!/bin/bash\necho 'error: crate version `0.0.22-alpha` is already uploaded'\nexit 1\n"
  },
  {
    "path": "tools/ci-build/publisher/fake_cargo/cargo_search_success",
    "content": "#!/bin/bash\n# Fake `cargo search aws-sdk-dynamodb` for unit testing\necho 'aws-sdk-dynamodb = \"0.0.22-alpha\"          # AWS SDK for Amazon DynamoDB'\necho 'aws-sdk-dynamodbstreams = \"0.0.22-alpha\"   # AWS SDK for Amazon DynamoDB Streams'\n"
  },
  {
    "path": "tools/ci-build/publisher/fake_cargo/cargo_success",
    "content": "#!/bin/bash\nexit 0\n"
  },
  {
    "path": "tools/ci-build/publisher/fake_cargo/cargo_yank_not_found",
    "content": "#!/bin/bash\n{\n    echo \"     Updating crates.io index\"\n    echo \"        Yank aws-sigv4:0.0.0\"\n    echo \"error: failed to yank from the registry at https://crates.io\"\n    echo\n    echo \"Caused by:\"\n    echo '  the remote server responded with an error: crate `aws-sigv4` does not have a version `0.0.0`'\n} >&2\nexit 101\n"
  },
  {
    "path": "tools/ci-build/publisher/src/cargo/add_owner.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse anyhow::Result;\nuse smithy_rs_tool_common::shell::{handle_failure, ShellOperation};\nuse std::process::Command;\n\npub struct AddOwner {\n    program: &'static str,\n    package_name: String,\n    owner: String,\n}\n\nimpl AddOwner {\n    pub fn new(package_name: impl Into<String>, owner: impl Into<String>) -> AddOwner {\n        AddOwner {\n            program: \"cargo\",\n            package_name: package_name.into(),\n            owner: owner.into(),\n        }\n    }\n}\n\nimpl ShellOperation for AddOwner {\n    type Output = ();\n\n    fn run(&self) -> Result<()> {\n        let mut command = Command::new(self.program);\n        command\n            .arg(\"owner\")\n            .arg(\"--add\")\n            .arg(&self.owner)\n            .arg(&self.package_name);\n        let output = command.output()?;\n        handle_failure(\"add owner\", &output)?;\n        Ok(())\n    }\n}\n\n#[cfg(all(test, not(target_os = \"windows\")))]\nmod tests {\n    use super::*;\n    use smithy_rs_tool_common::shell::ShellOperation;\n\n    #[tokio::test]\n    async fn add_owner_success() {\n        AddOwner {\n            program: \"./fake_cargo/cargo_success\",\n            package_name: \"aws-sdk-s3\".into(),\n            owner: \"github:awslabs:rust-sdk-owners\".into(),\n        }\n        .spawn()\n        .await\n        .unwrap();\n    }\n\n    #[tokio::test]\n    async fn get_owners_failed() {\n        let result = AddOwner {\n            program: \"./fake_cargo/cargo_fails\",\n            package_name: \"aws-sdk-s3\".into(),\n            owner: \"github:awslabs:rust-sdk-owners\".into(),\n        }\n        .spawn()\n        .await;\n\n        assert!(result.is_err(), \"expected error, got {result:?}\");\n        assert_eq!(\n            \"Failed to add owner:\\n\\\n            Status: 1\\n\\\n            Stdout: some stdout failure message\\n\\n\\\n            Stderr: some stderr failure message\\n\\n\",\n            format!(\"{}\", result.err().unwrap())\n        );\n    }\n}\n"
  },
  {
    "path": "tools/ci-build/publisher/src/cargo/get_owners.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse anyhow::Result;\nuse regex_lite::Regex;\nuse smithy_rs_tool_common::shell::{handle_failure, output_text, ShellOperation};\nuse std::process::Command;\nuse std::sync::LazyLock;\n\nstatic LINE_REGEX: LazyLock<Regex> =\n    LazyLock::new(|| Regex::new(r\"^([\\w\\d\\-_:]+)\\s+\\([\\w\\d\\s\\-_]+\\)$\").unwrap());\n\npub struct GetOwners {\n    program: &'static str,\n    package_name: String,\n}\n\nimpl GetOwners {\n    pub fn new(package_name: impl Into<String>) -> GetOwners {\n        GetOwners {\n            program: \"cargo\",\n            package_name: package_name.into(),\n        }\n    }\n}\n\nimpl ShellOperation for GetOwners {\n    type Output = Vec<String>;\n\n    fn run(&self) -> Result<Vec<String>> {\n        let mut command = Command::new(self.program);\n        command.arg(\"owner\").arg(\"--list\").arg(&self.package_name);\n        let output = command.output()?;\n        handle_failure(\"get crate owners\", &output)?;\n\n        let mut result = Vec::new();\n        let (stdout, _) = output_text(&output);\n        for line in stdout.lines() {\n            if let Some(captures) = LINE_REGEX.captures(line) {\n                let user_id = captures.get(1).unwrap().as_str();\n                result.push(user_id.to_string());\n            } else {\n                return Err(anyhow::Error::msg(format!(\n                    \"unrecognized line in `cargo owner` output: {line}\"\n                )));\n            }\n        }\n        Ok(result)\n    }\n}\n\n#[cfg(all(test, not(target_os = \"windows\")))]\nmod tests {\n    use super::*;\n\n    #[tokio::test]\n    async fn get_owners_success() {\n        let owners = GetOwners {\n            program: \"./fake_cargo/cargo_owner_list\",\n            package_name: \"aws-sdk-s3\".into(),\n        }\n        .spawn()\n        .await\n        .unwrap();\n        assert_eq!(\n            vec![\n                \"rcoh\".to_string(),\n                \"github:awslabs:rust-sdk-owners\".to_string()\n            ],\n            owners\n        );\n    }\n\n    #[tokio::test]\n    async fn get_owners_failed() {\n        let result = GetOwners {\n            program: \"./fake_cargo/cargo_fails\",\n            package_name: \"aws-sdk-s3\".into(),\n        }\n        .spawn()\n        .await;\n\n        assert!(result.is_err(), \"expected error, got {result:?}\");\n        assert_eq!(\n            \"Failed to get crate owners:\\n\\\n            Status: 1\\n\\\n            Stdout: some stdout failure message\\n\\n\\\n            Stderr: some stderr failure message\\n\\n\",\n            format!(\"{}\", result.err().unwrap())\n        );\n    }\n}\n"
  },
  {
    "path": "tools/ci-build/publisher/src/cargo/publish.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse anyhow::Result;\nuse smithy_rs_tool_common::{\n    package::PackageHandle,\n    shell::{capture_error, output_text, ShellOperation},\n};\nuse std::path::PathBuf;\nuse std::process::Command;\nuse tracing::info;\n\npub struct Publish {\n    program: &'static str,\n    package_handle: PackageHandle,\n    package_path: PathBuf,\n}\n\nimpl Publish {\n    pub fn new(package_handle: PackageHandle, package_path: impl Into<PathBuf>) -> Publish {\n        assert!(\n            package_handle.version.is_some(),\n            \"crate version number required; given {package_handle}\"\n        );\n        Publish {\n            program: \"cargo\",\n            package_handle,\n            package_path: package_path.into(),\n        }\n    }\n}\n\nimpl ShellOperation for Publish {\n    type Output = ();\n\n    fn run(&self) -> Result<()> {\n        let mut command = Command::new(self.program);\n        command\n            .current_dir(&self.package_path)\n            .arg(\"publish\")\n            .arg(\"--jobs\")\n            .arg(\"1\")\n            .arg(\"--no-verify\"); // The crates have already been built in previous CI steps\n        let output = command.output()?;\n        let (stdout, stderr) = output_text(&output);\n\n        if !output.status.success() {\n            let already_uploaded_msg = format!(\n                \"error: crate version `{}` is already uploaded\",\n                self.package_handle.expect_version()\n            );\n            if stdout.contains(&already_uploaded_msg) || stderr.contains(&already_uploaded_msg) {\n                info!(\n                    \"{} has already been published to crates.io.\",\n                    self.package_handle\n                );\n            } else {\n                info!(\n                    \"cargo publish failed for {}\\nStdout:\\n{}\\nStderr:\\n{}\",\n                    self.package_handle, stdout, stderr\n                );\n                return Err(capture_error(\"cargo publish\", &output));\n            }\n        } else {\n            info!(\"cargo publish succeeded for {}\", self.package_handle);\n        }\n        Ok(())\n    }\n}\n\n#[cfg(all(test, not(target_os = \"windows\")))]\nmod tests {\n    use super::*;\n    use semver::Version;\n    use std::env;\n\n    #[tokio::test]\n    async fn publish_succeeds() {\n        Publish {\n            program: \"./fake_cargo/cargo_success\",\n            package_handle: PackageHandle::new(\n                \"aws-sdk-dynamodb\",\n                Version::parse(\"0.0.22-alpha\").ok(),\n            ),\n            package_path: env::current_dir().unwrap(),\n        }\n        .spawn()\n        .await\n        .unwrap();\n    }\n\n    #[tokio::test]\n    async fn publish_fails() {\n        let result = Publish {\n            program: \"./fake_cargo/cargo_fails\",\n            package_handle: PackageHandle::new(\"something\", Version::parse(\"0.0.22-alpha\").ok()),\n            package_path: env::current_dir().unwrap(),\n        }\n        .spawn()\n        .await;\n        assert!(result.is_err(), \"expected error, got {result:?}\");\n        assert_eq!(\n            \"Failed to cargo publish:\\n\\\n            Status: 1\\n\\\n            Stdout: some stdout failure message\\n\\n\\\n            Stderr: some stderr failure message\\n\\n\",\n            format!(\"{}\", result.err().unwrap())\n        );\n    }\n\n    #[tokio::test]\n    async fn publish_fails_already_uploaded() {\n        Publish {\n            program: \"./fake_cargo/cargo_publish_already_published\",\n            package_handle: PackageHandle::new(\n                \"aws-sdk-dynamodb\",\n                Version::parse(\"0.0.22-alpha\").ok(),\n            ),\n            package_path: env::current_dir().unwrap(),\n        }\n        .spawn()\n        .await\n        .unwrap();\n    }\n}\n"
  },
  {
    "path": "tools/ci-build/publisher/src/cargo/remove_owner.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse anyhow::Result;\nuse smithy_rs_tool_common::shell::{handle_failure, ShellOperation};\nuse std::process::Command;\n\npub struct RemoveOwner {\n    program: &'static str,\n    package_name: String,\n    owner: String,\n}\n\nimpl RemoveOwner {\n    pub fn new(package_name: impl Into<String>, owner: impl Into<String>) -> RemoveOwner {\n        RemoveOwner {\n            program: \"cargo\",\n            package_name: package_name.into(),\n            owner: owner.into(),\n        }\n    }\n}\n\nimpl ShellOperation for RemoveOwner {\n    type Output = ();\n\n    fn run(&self) -> Result<()> {\n        let mut command = Command::new(self.program);\n        command\n            .arg(\"owner\")\n            .arg(\"--remove\")\n            .arg(&self.owner)\n            .arg(&self.package_name);\n        let output = command.output()?;\n        handle_failure(\"remove owner\", &output)?;\n        Ok(())\n    }\n}\n\n#[cfg(all(test, not(target_os = \"windows\")))]\nmod tests {\n    use super::*;\n    use smithy_rs_tool_common::shell::ShellOperation;\n\n    #[tokio::test]\n    async fn remove_owner_success() {\n        RemoveOwner {\n            program: \"./fake_cargo/cargo_success\",\n            package_name: \"aws-sdk-s3\".into(),\n            owner: \"incorrect_owner\".into(),\n        }\n        .spawn()\n        .await\n        .unwrap();\n    }\n\n    #[tokio::test]\n    async fn remove_owner_failed() {\n        let result = RemoveOwner {\n            program: \"./fake_cargo/cargo_fails\",\n            package_name: \"aws-sdk-s3\".into(),\n            owner: \"incorrect_owner\".into(),\n        }\n        .spawn()\n        .await;\n\n        assert!(result.is_err(), \"expected error, got {result:?}\");\n        assert_eq!(\n            \"Failed to remove owner:\\n\\\n            Status: 1\\n\\\n            Stdout: some stdout failure message\\n\\n\\\n            Stderr: some stderr failure message\\n\\n\",\n            format!(\"{}\", result.err().unwrap())\n        );\n    }\n}\n"
  },
  {
    "path": "tools/ci-build/publisher/src/cargo/yank.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse anyhow::Result;\nuse smithy_rs_tool_common::shell::{capture_error, output_text, ShellOperation};\nuse std::process::Command;\nuse tracing::info;\n\n/// Yanks a package version from crates.io\npub struct Yank {\n    program: &'static str,\n    crate_name: String,\n    crate_version: String,\n}\n\nimpl Yank {\n    pub fn new(crate_name: impl Into<String>, crate_version: impl Into<String>) -> Yank {\n        Yank {\n            program: \"cargo\",\n            crate_name: crate_name.into(),\n            crate_version: crate_version.into(),\n        }\n    }\n}\n\nimpl ShellOperation for Yank {\n    type Output = ();\n\n    fn run(&self) -> Result<()> {\n        let mut command = Command::new(self.program);\n        command\n            .arg(\"yank\")\n            .arg(\"--vers\")\n            .arg(&self.crate_version)\n            .arg(&self.crate_name);\n        let output = command.output()?;\n        if !output.status.success() {\n            let (_, stderr) = output_text(&output);\n            let no_such_version = format!(\n                \"error: crate `{}` does not have a version `{}`\",\n                self.crate_name, self.crate_version\n            );\n            if stderr.contains(&no_such_version) {\n                info!(\n                    \"{} never had a version {}.\",\n                    self.crate_name, self.crate_version\n                );\n            } else {\n                return Err(capture_error(\"cargo yank\", &output));\n            }\n        }\n        Ok(())\n    }\n}\n\n#[cfg(all(test, not(target_os = \"windows\")))]\nmod tests {\n    use super::*;\n\n    #[tokio::test]\n    async fn yank_succeeds() {\n        Yank {\n            program: \"./fake_cargo/cargo_success\",\n            crate_name: \"aws-sdk-dynamodb\".into(),\n            crate_version: \"0.0.22-alpha\".into(),\n        }\n        .spawn()\n        .await\n        .unwrap();\n    }\n\n    #[tokio::test]\n    async fn yank_fails() {\n        let result = Yank {\n            program: \"./fake_cargo/cargo_fails\",\n            crate_name: \"something\".into(),\n            crate_version: \"0.0.22-alpha\".into(),\n        }\n        .spawn()\n        .await;\n        assert!(result.is_err(), \"expected error, got {result:?}\");\n        assert_eq!(\n            \"Failed to cargo yank:\\n\\\n            Status: 1\\n\\\n            Stdout: some stdout failure message\\n\\n\\\n            Stderr: some stderr failure message\\n\\n\",\n            format!(\"{}\", result.err().unwrap())\n        );\n    }\n\n    #[tokio::test]\n    async fn yank_no_such_version() {\n        Yank {\n            program: \"./fake_cargo/cargo_yank_not_found\",\n            crate_name: \"aws-sigv4\".into(),\n            crate_version: \"0.0.0\".into(),\n        }\n        .spawn()\n        .await\n        .unwrap();\n    }\n}\n"
  },
  {
    "path": "tools/ci-build/publisher/src/cargo.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Module for interacting with Cargo.\n\nmod add_owner;\nmod get_owners;\nmod publish;\nmod remove_owner;\nmod yank;\n\npub use add_owner::AddOwner;\npub use get_owners::GetOwners;\npub use publish::Publish;\npub use remove_owner::RemoveOwner;\npub use yank::Yank;\n\nuse anyhow::{Context, Result};\nuse smithy_rs_tool_common::shell::handle_failure;\nuse std::process::Command;\n\n/// Confirms that cargo exists on the path.\npub fn confirm_installed_on_path() -> Result<()> {\n    handle_failure(\n        \"discover cargo version\",\n        &Command::new(\"cargo\")\n            .arg(\"version\")\n            .output()\n            .context(\"cargo is not installed on the PATH\")?,\n    )\n    .context(\"cargo is not installed on the PATH\")\n}\n"
  },
  {
    "path": "tools/ci-build/publisher/src/fs.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse anyhow::{Context, Result};\nuse std::path::Path;\nuse tokio::fs::File;\nuse tokio::io::{AsyncReadExt, AsyncWriteExt};\n\n/// Abstraction of the filesystem to allow for more tests to be added in the future.\n#[derive(Clone, Debug, Copy)]\npub enum Fs {\n    Real,\n}\n\nimpl Fs {\n    /// Reads entire file into `Vec<u8>`\n    pub async fn read_file(&self, path: impl AsRef<Path>) -> Result<Vec<u8>> {\n        match self {\n            Fs::Real => tokio_read_file(path.as_ref()).await,\n        }\n    }\n\n    /// Writes an entire file from a `&[u8]`\n    pub async fn write_file(&self, path: impl AsRef<Path>, contents: &[u8]) -> Result<()> {\n        match self {\n            Fs::Real => tokio_write_file(path.as_ref(), contents).await,\n        }\n    }\n\n    /// Recursively create a directory and all of its parent components if they are missing.\n    pub async fn create_dir_all(&self, path: impl AsRef<Path>) -> Result<()> {\n        match self {\n            Fs::Real => tokio_create_dir_all(path.as_ref()).await,\n        }\n    }\n}\n\nasync fn tokio_create_dir_all(path: &Path) -> Result<()> {\n    tokio::fs::create_dir_all(path).await?;\n    Ok(())\n}\n\nasync fn tokio_read_file(path: &Path) -> Result<Vec<u8>> {\n    let mut contents = Vec::new();\n    let mut file = File::open(path)\n        .await\n        .with_context(|| format!(\"failed to open {path:?}\"))?;\n    file.read_to_end(&mut contents)\n        .await\n        .with_context(|| format!(\"failed to read {path:?}\"))?;\n    Ok(contents)\n}\n\nasync fn tokio_write_file(path: &Path, contents: &[u8]) -> Result<()> {\n    let mut file = File::create(path)\n        .await\n        .with_context(|| format!(\"failed to create {path:?}\"))?;\n    file.write_all(contents)\n        .await\n        .with_context(|| format!(\"failed to write {path:?}\"))?;\n    file.flush().await?;\n    Ok(())\n}\n"
  },
  {
    "path": "tools/ci-build/publisher/src/lib.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npub const SDK_REPO_CRATE_PATH: &str = \"sdk\";\npub const SDK_REPO_NAME: &str = \"aws-sdk-rust\";\npub const SMITHYRS_REPO_NAME: &str = \"smithy-rs\";\n\n// https://github.com/aws-sdk-rust-ci\npub const RUST_SDK_CI_OWNER: &str = \"aws-sdk-rust-ci\";\n\npub mod cargo;\npub mod fs;\npub mod package;\npub mod publish;\npub mod sort;\npub mod subcommand;\npub mod yank;\n"
  },
  {
    "path": "tools/ci-build/publisher/src/main.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse anyhow::Result;\nuse clap::Parser;\nuse publisher::subcommand::claim_crate_names::{subcommand_claim_crate_names, ClaimCrateNamesArgs};\nuse publisher::subcommand::fix_manifests::subcommand_fix_manifests;\nuse publisher::subcommand::fix_manifests::FixManifestsArgs;\nuse publisher::subcommand::generate_version_manifest::{\n    subcommand_generate_version_manifest, GenerateVersionManifestArgs,\n};\nuse publisher::subcommand::hydrate_readme::{subcommand_hydrate_readme, HydrateReadmeArgs};\nuse publisher::subcommand::publish::subcommand_publish;\nuse publisher::subcommand::publish::PublishArgs;\nuse publisher::subcommand::tag_versions_manifest::subcommand_tag_versions_manifest;\nuse publisher::subcommand::tag_versions_manifest::TagVersionsManifestArgs;\nuse publisher::subcommand::yank_release::{subcommand_yank_release, YankReleaseArgs};\nuse tracing_subscriber::fmt::format::FmtSpan;\n\n#[derive(Parser, Debug)]\n#[clap(author, version, about)]\nenum Args {\n    /// Fixes path dependencies in manifests to also have version numbers\n    FixManifests(FixManifestsArgs),\n    /// Publishes crates to crates.io\n    Publish(PublishArgs),\n    /// Publishes an empty library crate to crates.io when a new runtime crate is introduced.\n    ///\n    /// It must be invoked from the `smithy-rs` repository.\n    ClaimCrateNames(ClaimCrateNamesArgs),\n    /// Yanks an entire SDK release. For individual packages, use `cargo yank` instead.\n    /// Only one of the `--github-release-tag` or `--versions-toml` options are required.\n    YankRelease(YankReleaseArgs),\n    /// Hydrates the SDK README template file\n    HydrateReadme(HydrateReadmeArgs),\n    /// Generates a version manifest file for a generated SDK\n    GenerateVersionManifest(GenerateVersionManifestArgs),\n    /// Adds a release tag to an existing version manifest\n    TagVersionsManifest(TagVersionsManifestArgs),\n}\n\n#[tokio::main]\nasync fn main() -> Result<()> {\n    tracing_subscriber::fmt()\n        .with_span_events(FmtSpan::NEW | FmtSpan::CLOSE)\n        .with_env_filter(\n            std::env::var(\"RUST_LOG\").unwrap_or_else(|_| \"error,publisher=info\".to_owned()),\n        )\n        .init();\n\n    match Args::parse() {\n        Args::ClaimCrateNames(args) => subcommand_claim_crate_names(&args).await?,\n        Args::Publish(args) => subcommand_publish(&args).await?,\n        Args::FixManifests(args) => subcommand_fix_manifests(&args).await?,\n        Args::YankRelease(args) => subcommand_yank_release(&args).await?,\n        Args::HydrateReadme(args) => subcommand_hydrate_readme(&args)?,\n        Args::GenerateVersionManifest(args) => subcommand_generate_version_manifest(&args).await?,\n        Args::TagVersionsManifest(args) => subcommand_tag_versions_manifest(&args)?,\n    }\n\n    Ok(())\n}\n"
  },
  {
    "path": "tools/ci-build/publisher/src/package.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Packages, package discovery, and package batching logic.\n\nuse crate::fs::Fs;\nuse crate::sort::dependency_order;\nuse anyhow::Result;\nuse semver::Version;\nuse smithy_rs_tool_common::package::{Package, PackageCategory, PackageHandle, Publish};\nuse std::error::Error as StdError;\nuse std::path::PathBuf;\nuse std::{collections::BTreeMap, path::Path};\nuse tokio::fs;\nuse tracing::warn;\n\n/// Batch of packages.\npub type PackageBatch = Vec<Package>;\n\n/// Stats about the packages.\n#[derive(Copy, Clone, Debug, Default, Eq, PartialEq)]\npub struct PackageStats {\n    /// Number of Smithy runtime crates\n    pub smithy_runtime_crates: usize,\n    /// Number of AWS runtime crates\n    pub aws_runtime_crates: usize,\n    /// Number of AWS service crates\n    pub aws_sdk_crates: usize,\n}\n\nimpl PackageStats {\n    pub fn total(&self) -> usize {\n        self.smithy_runtime_crates + self.aws_runtime_crates + self.aws_sdk_crates\n    }\n\n    fn calculate(batches: &[PackageBatch]) -> PackageStats {\n        let mut stats = PackageStats::default();\n        for batch in batches {\n            for package in batch {\n                match package.category {\n                    PackageCategory::SmithyRuntime => stats.smithy_runtime_crates += 1,\n                    PackageCategory::AwsRuntime => stats.aws_runtime_crates += 1,\n                    PackageCategory::AwsSdk => stats.aws_sdk_crates += 1,\n                    PackageCategory::Unknown => {\n                        warn!(\"Unrecognized crate: {}\", package.handle.name);\n                    }\n                }\n            }\n        }\n        stats\n    }\n}\n\n/// Discovers publishable packages in the given directory and returns them as\n/// batches that can be published in order.\npub async fn discover_and_validate_package_batches(\n    fs: Fs,\n    path: impl AsRef<Path>,\n) -> Result<(Vec<PackageBatch>, PackageStats)> {\n    let packages = discover_packages(fs, path.as_ref())\n        .await?\n        .into_iter()\n        .filter(|package| package.publish == Publish::Allowed)\n        .collect::<Vec<Package>>();\n    validate_packages(&packages)?;\n    let batches = batch_packages(packages)?;\n    let stats = PackageStats::calculate(&batches);\n    Ok((batches, stats))\n}\n\ntype BoxError = Box<dyn StdError + Send + Sync + 'static>;\n\n#[derive(Debug, thiserror::Error)]\npub enum Error {\n    #[error(\"Invalid manifest {0:?}\")]\n    InvalidManifest(PathBuf),\n    #[error(\n        \"Invalid crate version {1} in {0:?}: {2}. NOTE: All local dependencies \\\n         must have complete version numbers rather than version requirements.\"\n    )]\n    InvalidCrateVersion(PathBuf, String, BoxError),\n    #[error(\"{0:?} missing version in dependency {1}\")]\n    MissingVersion(PathBuf, String),\n    #[error(\"crate {0} has multiple versions: {1} and {2}\")]\n    MultipleVersions(String, Version, Version),\n}\n\n/// Discovers all Cargo.toml files under the given path recursively\n#[async_recursion::async_recursion]\npub async fn discover_manifests(path: &Path) -> Result<Vec<PathBuf>> {\n    let mut manifests = Vec::new();\n    let mut read_dir = fs::read_dir(path).await?;\n    while let Some(entry) = read_dir.next_entry().await? {\n        let package_path = entry.path();\n        if package_path.is_dir() {\n            let manifest_path = package_path.join(\"Cargo.toml\");\n            if manifest_path.exists() {\n                manifests.push(manifest_path);\n            }\n            manifests.extend(discover_manifests(&package_path).await?.into_iter());\n        }\n    }\n    Ok(manifests)\n}\n\n/// Discovers and parses all Cargo.toml files that are packages (as opposed to being exclusively workspaces)\npub async fn discover_packages(fs: Fs, path: &Path) -> Result<Vec<Package>> {\n    let manifest_paths = discover_manifests(path).await?;\n    read_packages(fs, manifest_paths).await\n}\n\n/// Validates that all of the publishable crates use consistent version numbers\n/// across all of their local dependencies.\nfn validate_packages(packages: &[Package]) -> Result<()> {\n    let mut versions: BTreeMap<String, Version> = BTreeMap::new();\n    let track_version = &mut |handle: &PackageHandle| -> Result<(), Error> {\n        if let Some(version) = versions.get(&handle.name) {\n            if version != handle.expect_version() {\n                Err(Error::MultipleVersions(\n                    (&handle.name).into(),\n                    versions[&handle.name].clone(),\n                    handle.expect_version().clone(),\n                ))\n            } else {\n                Ok(())\n            }\n        } else {\n            versions.insert(handle.name.clone(), handle.expect_version().clone());\n            Ok(())\n        }\n    };\n    for package in packages {\n        track_version(&package.handle)?;\n        for dependency in &package.local_dependencies {\n            track_version(dependency)?;\n        }\n    }\n\n    Ok(())\n}\n\npub async fn read_packages(fs: Fs, manifest_paths: Vec<PathBuf>) -> Result<Vec<Package>> {\n    let mut result = Vec::new();\n    for path in &manifest_paths {\n        let contents: Vec<u8> = fs.read_file(path).await?;\n        if let Some(package) = Package::try_load_manifest(path, &contents)? {\n            result.push(package);\n        }\n    }\n    Ok(result)\n}\n\n/// Splits the given packages into a list of batches that can be published in order.\n/// All of the packages in a given batch can be safely published in parallel.\nfn batch_packages(packages: Vec<Package>) -> Result<Vec<PackageBatch>> {\n    // Sort packages in order of local dependencies\n    let mut packages = dependency_order(packages)?;\n\n    // Discover batches\n    let mut batches = Vec::new();\n    'outer: while packages.len() > 1 {\n        for run in 0..packages.len() {\n            let next = &packages[run];\n            // If the next package depends on any prior package, then we've discovered the end of the batch\n            for index in 0..run {\n                let previous = &packages[index];\n                if next.locally_depends_on(&previous.handle) {\n                    let remaining = packages.split_off(run);\n                    let batch = packages;\n                    packages = remaining;\n                    batches.push(batch);\n                    continue 'outer;\n                }\n            }\n        }\n        // If the current run is the length of the package vec, then we have exactly one batch left\n        break;\n    }\n\n    // Push the final batch\n    if !packages.is_empty() {\n        batches.push(packages);\n    }\n\n    // Sort packages within batches so that `--continue-from` work consistently\n    for batch in batches.iter_mut() {\n        batch.sort();\n    }\n    Ok(batches)\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use semver::Version;\n\n    fn package(name: &str, dependencies: &[&str]) -> Package {\n        Package::new(\n            PackageHandle::new(name, Version::parse(\"1.0.0\").ok()),\n            format!(\"{name}/Cargo.toml\"),\n            dependencies\n                .iter()\n                .map(|d| PackageHandle::new(*d, Version::parse(\"1.0.0\").ok()))\n                .collect(),\n            Publish::Allowed,\n        )\n    }\n\n    fn fmt_batches(batches: Vec<PackageBatch>) -> String {\n        let mut result = String::new();\n        for batch in batches {\n            result.push_str(\n                &batch\n                    .iter()\n                    .map(|p| p.handle.name.as_str())\n                    .collect::<Vec<&str>>()\n                    .join(\",\"),\n            );\n            result.push(';');\n        }\n        result\n    }\n\n    #[test]\n    fn test_batch_packages() {\n        assert_eq!(\"\", fmt_batches(batch_packages(vec![]).unwrap()));\n        assert_eq!(\n            \"A;\",\n            fmt_batches(batch_packages(vec![package(\"A\", &[])]).unwrap())\n        );\n        assert_eq!(\n            \"A,B;\",\n            fmt_batches(batch_packages(vec![package(\"A\", &[]), package(\"B\", &[])]).unwrap())\n        );\n        assert_eq!(\n            \"A,B;C;\",\n            fmt_batches(\n                batch_packages(vec![\n                    package(\"C\", &[\"A\", \"B\"]),\n                    package(\"B\", &[]),\n                    package(\"A\", &[]),\n                ])\n                .unwrap()\n            )\n        );\n        assert_eq!(\n            \"A,B;C,D,F;E;\",\n            fmt_batches(\n                batch_packages(vec![\n                    package(\"A\", &[]),\n                    package(\"B\", &[]),\n                    package(\"C\", &[\"A\"]),\n                    package(\"D\", &[\"A\", \"B\"]),\n                    package(\"F\", &[\"B\"]),\n                    package(\"E\", &[\"C\", \"D\", \"F\"]),\n                ])\n                .unwrap()\n            )\n        );\n        assert_eq!(\n            \"A,F;B;C;E,G;D,H,I;\",\n            fmt_batches(\n                batch_packages(vec![\n                    package(\"F\", &[]),\n                    package(\"G\", &[\"C\"]),\n                    package(\"I\", &[\"G\"]),\n                    package(\"H\", &[\"G\"]),\n                    package(\"D\", &[\"B\", \"C\"]),\n                    package(\"E\", &[\"C\"]),\n                    package(\"C\", &[\"B\"]),\n                    package(\"A\", &[]),\n                    package(\"B\", &[\"A\"]),\n                ])\n                .unwrap()\n            )\n        );\n    }\n\n    fn pkg_ver(name: &str, version: &str, dependencies: &[(&str, &str)]) -> Package {\n        Package::new(\n            PackageHandle::new(name, Some(Version::parse(version).unwrap())),\n            format!(\"{name}/Cargo.toml\"),\n            dependencies\n                .iter()\n                .map(|p| PackageHandle::new(p.0, Some(Version::parse(p.1).unwrap())))\n                .collect(),\n            Publish::Allowed,\n        )\n    }\n\n    #[test]\n    fn test_validate_packages() {\n        validate_packages(&vec![\n            pkg_ver(\"A\", \"1.0.0\", &[]),\n            pkg_ver(\"B\", \"1.1.0\", &[]),\n            pkg_ver(\"C\", \"1.2.0\", &[(\"A\", \"1.0.0\"), (\"B\", \"1.1.0\")]),\n            pkg_ver(\"D\", \"1.3.0\", &[(\"A\", \"1.0.0\")]),\n            pkg_ver(\"F\", \"1.4.0\", &[(\"B\", \"1.1.0\")]),\n            pkg_ver(\n                \"E\",\n                \"1.5.0\",\n                &[(\"C\", \"1.2.0\"), (\"D\", \"1.3.0\"), (\"F\", \"1.4.0\")],\n            ),\n        ])\n        .expect(\"success\");\n\n        let error = validate_packages(&vec![\n            pkg_ver(\"A\", \"1.1.0\", &[]),\n            pkg_ver(\"B\", \"1.1.0\", &[]),\n            pkg_ver(\"C\", \"1.2.0\", &[(\"A\", \"1.1.0\"), (\"B\", \"1.1.0\")]),\n            pkg_ver(\"D\", \"1.3.0\", &[(\"A\", \"1.0.0\")]),\n            pkg_ver(\"F\", \"1.4.0\", &[(\"B\", \"1.1.0\")]),\n            pkg_ver(\n                \"E\",\n                \"1.5.0\",\n                &[(\"C\", \"1.2.0\"), (\"D\", \"1.3.0\"), (\"F\", \"1.4.0\")],\n            ),\n        ])\n        .expect_err(\"fail\");\n        assert_eq!(\n            \"crate A has multiple versions: 1.1.0 and 1.0.0\",\n            format!(\"{error}\")\n        );\n    }\n\n    #[test]\n    fn test_expected_package_owners_server_crate() {\n        let server_packages = vec![\n            package(\"aws-smithy-http-server\", &[]),\n            package(\"aws-smithy-http-server-python\", &[]),\n            package(\"aws-smithy-http-server-typescript\", &[]),\n            package(\"aws-smithy-legacy-http-server\", &[]),\n        ];\n        for pkg in server_packages {\n            assert_eq!(&[\"aws-sdk-rust-ci\"], pkg.expected_owners());\n        }\n    }\n\n    #[test]\n    fn test_expected_package_owners_sdk_crate() {\n        let sdk_package = package(\"aws-types\", &[]);\n        assert_eq!(&[\"aws-sdk-rust-ci\"], sdk_package.expected_owners());\n    }\n\n    #[test]\n    fn test_expected_package_owners_smithy_runtime_crate() {\n        let smithy_runtime_package = package(\"aws-smithy-types\", &[]);\n        assert_eq!(\n            &[\"aws-sdk-rust-ci\"],\n            smithy_runtime_package.expected_owners()\n        );\n    }\n}\n"
  },
  {
    "path": "tools/ci-build/publisher/src/publish.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::cargo;\nuse anyhow::Result;\nuse smithy_rs_tool_common::{\n    index::CratesIndex,\n    retry::{run_with_retry, BoxError, ErrorClass},\n};\nuse smithy_rs_tool_common::{package::PackageHandle, shell::ShellOperation};\nuse std::time::Duration;\nuse std::{path::Path, sync::Arc};\nuse tracing::info;\n\npub async fn is_published(index: Arc<CratesIndex>, crate_name: &str) -> Result<bool> {\n    let crate_name = crate_name.to_string();\n    let versions =\n        tokio::task::spawn_blocking(move || index.published_versions(&crate_name)).await??;\n    Ok(!versions.is_empty())\n}\n\n#[tracing::instrument]\npub async fn publish(handle: &PackageHandle, crate_path: &Path) -> Result<()> {\n    info!(\"Publishing `{}`...\", handle);\n    run_with_retry(\n        &format!(\"Publishing `{handle}`\"),\n        5,\n        Duration::from_secs(60),\n        || async {\n            cargo::Publish::new(handle.clone(), crate_path)\n                .spawn()\n                .await?;\n            Result::<_, BoxError>::Ok(())\n        },\n        |_err| ErrorClass::Retry,\n    )\n    .await?;\n    Ok(())\n}\n"
  },
  {
    "path": "tools/ci-build/publisher/src/sort.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Logic for topological sorting packages by dependencies.\n\nuse anyhow::{anyhow, bail, Result};\nuse smithy_rs_tool_common::package::{Package, PackageHandle};\nuse std::collections::{BTreeMap, BTreeSet};\n\n/// Determines the dependency order of the given packages.\npub fn dependency_order(packages: Vec<Package>) -> Result<Vec<Package>> {\n    let mut order = Vec::new();\n    let mut packages: BTreeMap<PackageHandle, Package> = packages\n        .into_iter()\n        .map(|p| (p.handle.clone(), p))\n        .collect();\n    let mut visited = BTreeSet::new();\n\n    let mut to_visit: Vec<&Package> = packages.iter().map(|e| e.1).collect();\n    to_visit.sort_by(|a, b| a.local_dependencies.len().cmp(&b.local_dependencies.len()));\n\n    // Depth-first search topological sort\n    while let Some(package) = to_visit.iter().find(|e| !visited.contains(&e.handle)) {\n        dependency_order_visit(\n            &package.handle,\n            &packages,\n            &mut BTreeSet::new(),\n            &mut visited,\n            &mut order,\n        )?;\n    }\n\n    Ok(order\n        .into_iter()\n        .map(&mut |handle: PackageHandle| packages.remove(&handle).unwrap())\n        .collect())\n}\n\nfn dependency_order_visit(\n    package_handle: &PackageHandle,\n    packages: &BTreeMap<PackageHandle, Package>,\n    stack: &mut BTreeSet<PackageHandle>,\n    visited: &mut BTreeSet<PackageHandle>,\n    result: &mut Vec<PackageHandle>,\n) -> Result<()> {\n    if visited.contains(package_handle) {\n        return Ok(());\n    }\n    if stack.contains(package_handle) {\n        tracing::error!(stack = ?stack, handle = ?package_handle, \"dependency cycle!\");\n        bail!(\"dependency cycle detected\");\n    }\n    stack.insert(package_handle.clone());\n    let local_dependencies = &packages\n        .get(package_handle)\n        .ok_or_else(|| {\n            dbg!(packages);\n            anyhow!(\"packages to publish doesn't contain {package_handle:?}\")\n        })?\n        .local_dependencies;\n    for dependency in local_dependencies {\n        dependency_order_visit(dependency, packages, stack, visited, result)?;\n    }\n    stack.remove(package_handle);\n    visited.insert(package_handle.clone());\n    result.push(package_handle.clone());\n    Ok(())\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use semver::Version;\n    use smithy_rs_tool_common::package::Publish;\n\n    fn package(name: &str, dependencies: &[&str]) -> Package {\n        Package::new(\n            PackageHandle::new(name, Version::parse(\"1.0.0\").ok()),\n            format!(\"{name}/Cargo.toml\"),\n            dependencies\n                .iter()\n                .map(|d| PackageHandle::new(*d, Version::parse(\"1.0.0\").ok()))\n                .collect(),\n            Publish::Allowed,\n        )\n    }\n\n    #[test]\n    pub fn test_dependency_order() {\n        let packages = vec![\n            package(\"E\", &[\"B\", \"C\", \"A\"]),\n            package(\"B\", &[]),\n            package(\"F\", &[\"E\", \"D\"]),\n            package(\"C\", &[\"A\"]),\n            package(\"A\", &[]),\n            package(\"D\", &[\"C\"]),\n        ];\n\n        let result = dependency_order(packages).unwrap();\n        assert_eq!(\n            \"ABCDEF\",\n            result.iter().fold(String::new(), |mut acc, p| {\n                acc.push_str(&p.handle.name);\n                acc\n            })\n        );\n    }\n\n    #[test]\n    pub fn test_dependency_cycles() {\n        let packages = vec![\n            package(\"A\", &[\"C\"]),\n            package(\"B\", &[\"A\"]),\n            package(\"C\", &[\"B\"]),\n        ];\n\n        let error = dependency_order(packages).expect_err(\"cycle\");\n        assert_eq!(\"dependency cycle detected\", format!(\"{error}\"));\n    }\n\n    #[test]\n    pub fn complex_tree() {\n        let packages = vec![\n            package(\"codeexamples\", &[\"aws-config\", \"aws-apigateway\"]),\n            package(\n                \"aws-apigateway\",\n                &[\"aws-config\", \"aws-types\", \"aws-endpoint\"],\n            ),\n            package(\"aws-config\", &[\"aws-endpoint\", \"aws-types\", \"aws-sdk-sts\"]),\n            package(\"aws-types\", &[]),\n            package(\"aws-endpoint\", &[]),\n            package(\"aws-sdk-sts\", &[]),\n        ];\n        let result = dependency_order(packages).expect(\"ok\");\n        assert_eq!(\n            result.iter().map(|p| &p.handle.name).collect::<Vec<_>>(),\n            vec![\n                \"aws-endpoint\",\n                \"aws-sdk-sts\",\n                \"aws-types\",\n                \"aws-config\",\n                \"aws-apigateway\",\n                \"codeexamples\"\n            ]\n        );\n    }\n}\n"
  },
  {
    "path": "tools/ci-build/publisher/src/subcommand/claim_crate_names.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nuse crate::publish::is_published;\nuse crate::publish::publish;\nuse crate::subcommand::publish::correct_owner;\nuse crate::{cargo, SDK_REPO_NAME};\nuse crate::{fs::Fs, package::discover_manifests};\nuse anyhow::{Context, Result};\nuse cargo_toml::Manifest;\nuse clap::Parser;\nuse dialoguer::Confirm;\nuse semver::Version;\nuse smithy_rs_tool_common::package::PackageHandle;\nuse smithy_rs_tool_common::{git, index::CratesIndex};\nuse std::time::Duration;\nuse std::{collections::HashSet, fs};\nuse std::{\n    path::{Path, PathBuf},\n    sync::Arc,\n};\nuse tracing::info;\n\n#[derive(Parser, Debug)]\npub struct ClaimCrateNamesArgs {\n    /// Don't prompt for confirmation before publishing\n    #[clap(short('y'))]\n    skip_confirmation: bool,\n}\n\npub async fn subcommand_claim_crate_names(args: &ClaimCrateNamesArgs) -> Result<()> {\n    let ClaimCrateNamesArgs { skip_confirmation } = args;\n    // Make sure cargo exists\n    cargo::confirm_installed_on_path()?;\n\n    let smithy_rs_repository_root =\n        git::find_git_repository_root(SDK_REPO_NAME, std::env::current_dir()?)?;\n    let index = Arc::new(CratesIndex::real()?);\n    let packages = discover_publishable_crate_names(&smithy_rs_repository_root).await?;\n    let unpublished_package_names = {\n        let mut s = HashSet::new();\n        for package_name in packages {\n            if !is_published(index.clone(), &package_name).await? {\n                s.insert(package_name);\n            }\n        }\n        s\n    };\n\n    if unpublished_package_names.is_empty() {\n        info!(\"All publishable packages already exist on crates.io - nothing to do.\");\n        return Ok(());\n    }\n\n    confirm_user_intent(&unpublished_package_names, *skip_confirmation)?;\n    for name in unpublished_package_names {\n        claim_crate_name(&name).await?;\n    }\n\n    Ok(())\n}\n\nasync fn claim_crate_name(name: &str) -> Result<()> {\n    let temporary_directory = tempfile::tempdir()?;\n    let crate_dir_path = temporary_directory.path();\n    create_dummy_lib_crate(Fs::Real, name, crate_dir_path.to_path_buf()).await?;\n\n    let package_handle = PackageHandle::new(name, Some(Version::new(0, 0, 1)));\n    publish(&package_handle, crate_dir_path).await?;\n\n    // Keep things slow to avoid getting throttled by crates.io\n    tokio::time::sleep(Duration::from_secs(2)).await;\n    correct_owner(&package_handle).await?;\n\n    info!(\"Successfully published `{}`\", package_handle);\n    Ok(())\n}\n\nasync fn load_publishable_crate_names(path: &Path) -> Result<HashSet<String>> {\n    let manifest_paths = discover_manifests(path).await?;\n    let mut result = HashSet::new();\n    for manifest_path in &manifest_paths {\n        let content =\n            fs::read(manifest_path).with_context(|| format!(\"failed to read {path:?}\"))?;\n        let manifest = Manifest::from_slice(&content)\n            .with_context(|| format!(\"failed to load crate manifest for {path:?}\"))?;\n        if let Some(package) = manifest.package {\n            let crate_name = package.name();\n            if matches!(package.publish(), cargo_toml::Publish::Flag(true)) {\n                result.insert(crate_name.to_string());\n            }\n        }\n    }\n    Ok(result)\n}\n\n/// Return the list of publishable crate names in the `smithy-rs` git repository.\nasync fn discover_publishable_crate_names(repository_root: &Path) -> Result<Vec<String>> {\n    let packages = {\n        let mut p = vec![];\n        info!(\"Discovering publishable crates...\");\n        p.extend(load_publishable_crate_names(&repository_root.join(\"rust-runtime\")).await?);\n        p.extend(\n            load_publishable_crate_names(&repository_root.join(\"aws\").join(\"rust-runtime\")).await?,\n        );\n        info!(\"Finished crate discovery.\");\n        p\n    };\n    Ok(packages)\n}\n\nasync fn create_dummy_lib_crate(fs: Fs, package_name: &str, directory_path: PathBuf) -> Result<()> {\n    let cargo_toml = format!(\n        r#\"[package]\nname = \"{package_name}\"\nversion = \"0.0.1\"\nedition = \"2021\"\ndescription = \"Placeholder ahead of the next smithy-rs release\"\nlicense = \"Apache-2.0\"\nrepository = \"https://github.com/smithy-lang/smithy-rs\"\"#\n    );\n    fs.write_file(directory_path.join(\"Cargo.toml\"), cargo_toml.as_bytes())\n        .await?;\n    let src_dir_path = directory_path.join(\"src\");\n    fs.create_dir_all(&src_dir_path).await?;\n    fs.write_file(src_dir_path.join(\"lib.rs\"), &[]).await?;\n    Ok(())\n}\n\nfn confirm_user_intent(crate_names: &HashSet<String>, skip_confirmation: bool) -> Result<()> {\n    use std::fmt::Write;\n\n    let prompt = {\n        let mut s = String::new();\n        writeln!(\n            &mut s,\n            \"The following new crate names will be claimed on crates.io:\"\n        )?;\n        for c in crate_names {\n            writeln!(&mut s, \"- {c}\")?;\n        }\n        writeln!(&mut s)?;\n        s\n    };\n    if !(skip_confirmation || Confirm::new().with_prompt(&prompt).interact()?) {\n        anyhow::bail!(\"Aborting\")\n    }\n    Ok(())\n}\n"
  },
  {
    "path": "tools/ci-build/publisher/src/subcommand/fix_manifests/validate.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::fs::Fs;\nuse crate::package::discover_and_validate_package_batches;\nuse anyhow::Result;\nuse std::path::Path;\nuse tracing::info;\n\n/// Validations that run after fixing the manifests.\n///\n/// These should match the validations that the `publish` subcommand runs.\npub(super) async fn validate_after_fixes(location: &Path) -> Result<()> {\n    info!(\"Post-validating manifests...\");\n    discover_and_validate_package_batches(Fs::Real, location).await?;\n    Ok(())\n}\n"
  },
  {
    "path": "tools/ci-build/publisher/src/subcommand/fix_manifests.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Subcommand for fixing manifest dependency version numbers.\n//!\n//! Finds all of the version numbers for every crate in the repo crate path, and then\n//! finds all references to the crates in that path and updates them to have the correct\n//! version numbers in addition to the dependency path.\n\nuse crate::fs::Fs;\nuse crate::package::discover_manifests;\nuse anyhow::{bail, Context, Result};\nuse clap::Parser;\nuse semver::Version;\nuse smithy_rs_tool_common::{\n    ci::{is_in_example_dir, is_preview_build, running_in_ci},\n    package::parse_version,\n};\nuse std::collections::BTreeMap;\nuse std::path::{Path, PathBuf};\nuse toml::value::Table;\nuse toml::Value;\nuse tracing::{debug, info};\n\nmod validate;\n\n#[derive(Debug, Copy, Clone, Eq, PartialEq)]\npub enum Mode {\n    Check,\n    Execute,\n}\n\n#[derive(Parser, Debug)]\npub struct FixManifestsArgs {\n    /// Path containing the manifests to fix. Manifests will be discovered recursively\n    #[clap(long)]\n    location: PathBuf,\n    /// Checks manifests rather than fixing them\n    #[clap(long)]\n    check: bool,\n    /// UNUSED. Kept for backwards compatibility. Can be removed in the future when\n    /// the older commits that rely on it have been synced over in a SDK release.\n    #[clap(long)]\n    disable_version_number_validation: bool,\n}\n\npub async fn subcommand_fix_manifests(\n    FixManifestsArgs {\n        location, check, ..\n    }: &FixManifestsArgs,\n) -> Result<()> {\n    let mode = match check {\n        true => Mode::Check,\n        false => Mode::Execute,\n    };\n    let manifest_paths = discover_manifests(location).await?;\n    let mut manifests = read_manifests(Fs::Real, manifest_paths).await?;\n    let versions = package_versions(&manifests)?;\n\n    fix_manifests(Fs::Real, &versions, &mut manifests, mode).await?;\n    validate::validate_after_fixes(location).await?;\n    info!(\"Successfully fixed manifests!\");\n    Ok(())\n}\n\n#[derive(Debug)]\nstruct Manifest {\n    path: PathBuf,\n    metadata: toml::Value,\n}\n\nimpl Manifest {\n    /// Returns the `publish` setting for a given crate\n    fn publish(&self) -> Result<bool> {\n        let value = self.metadata.get(\"package\").and_then(|v| v.get(\"publish\"));\n        match value {\n            None => Ok(true),\n            Some(value) => value.as_bool().ok_or(anyhow::Error::msg(format!(\n                \"unexpected publish setting: {value}\"\n            ))),\n        }\n    }\n}\n\n#[derive(Debug)]\nstruct Versions(BTreeMap<String, VersionWithMetadata>);\n#[derive(Copy, Clone)]\nenum FilterType {\n    AllCrates,\n    PublishedOnly,\n}\nstruct VersionView<'a>(&'a Versions, FilterType);\nimpl VersionView<'_> {\n    fn get(&self, crate_name: &str) -> Option<&Version> {\n        let version = match (self.1, self.0 .0.get(crate_name)) {\n            (FilterType::AllCrates, version) => version,\n            (FilterType::PublishedOnly, v @ Some(VersionWithMetadata { publish: true, .. })) => v,\n            _ => None,\n        };\n        version.map(|v| &v.version)\n    }\n\n    fn all_crates(&self) -> Self {\n        VersionView(self.0, FilterType::AllCrates)\n    }\n}\n\nimpl Versions {\n    fn published(&self) -> VersionView<'_> {\n        VersionView(self, FilterType::PublishedOnly)\n    }\n}\n\n#[derive(Debug)]\nstruct VersionWithMetadata {\n    version: Version,\n    publish: bool,\n}\n\nasync fn read_manifests(fs: Fs, manifest_paths: Vec<PathBuf>) -> Result<Vec<Manifest>> {\n    let mut result = Vec::new();\n    for path in manifest_paths {\n        let contents = fs.read_file(&path).await?;\n        let metadata = toml::from_slice(&contents)\n            .with_context(|| format!(\"failed to load package manifest for {:?}\", &path))?;\n        result.push(Manifest { path, metadata });\n    }\n    Ok(result)\n}\n\n/// Returns a map of crate name to semver version number\nfn package_versions(manifests: &[Manifest]) -> Result<Versions> {\n    let mut versions = BTreeMap::new();\n    for manifest in manifests {\n        // ignore workspace manifests\n        let package = match manifest.metadata.get(\"package\") {\n            Some(package) => package,\n            None => continue,\n        };\n        let publish = manifest.publish()?;\n        let name = package\n            .get(\"name\")\n            .and_then(|name| name.as_str())\n            .ok_or_else(|| {\n                anyhow::Error::msg(format!(\"{:?} is missing a package name\", manifest.path))\n            })?;\n        let version = package\n            .get(\"version\")\n            .and_then(|name| name.as_str())\n            .ok_or_else(|| {\n                anyhow::Error::msg(format!(\"{:?} is missing a package version\", manifest.path))\n            })?;\n        let version = parse_version(&manifest.path, version)?;\n        versions.insert(name.into(), VersionWithMetadata { version, publish });\n    }\n    Ok(Versions(versions))\n}\n\nfn fix_dep_set(versions: &VersionView, key: &str, metadata: &mut Value) -> Result<usize> {\n    let mut changed = 0;\n    if let Some(dependencies) = metadata.as_table_mut().unwrap().get_mut(key) {\n        if let Some(dependencies) = dependencies.as_table_mut() {\n            for (dep_name, dep) in dependencies.iter_mut() {\n                changed += match dep.as_table_mut() {\n                    None => {\n                        if !dep.is_str() {\n                            bail!(\"unexpected dependency (must be table or string): {dep:?}\")\n                        }\n                        0\n                    }\n                    Some(ref mut table) => update_dep(table, dep_name, versions)?,\n                };\n            }\n        }\n    }\n    Ok(changed)\n}\n\n// Update a version of `dep_name` that has a path dependency to be that appearing in `versions`.\nfn update_dep(table: &mut Table, dep_name: &str, versions: &VersionView) -> Result<usize> {\n    if !table.contains_key(\"path\") {\n        return Ok(0);\n    }\n    let package_version = match versions.get(dep_name) {\n        Some(version) => version.to_string(),\n        None => bail!(\"version not found for crate {dep_name}\"),\n    };\n    let previous_version = table.insert(\n        \"version\".into(),\n        toml::Value::String(package_version.to_string()),\n    );\n    match previous_version {\n        None => Ok(1),\n        Some(prev_version) if prev_version.as_str() == Some(&package_version) => Ok(0),\n        Some(mismatched_version) => {\n            tracing::warn!(expected = ?package_version, actual = ?mismatched_version, \"version was set but it did not match\");\n            Ok(1)\n        }\n    }\n}\n\nfn fix_dep_sets(versions: &VersionView, metadata: &mut toml::Value) -> Result<usize> {\n    let mut changed = fix_dep_set(versions, \"dependencies\", metadata)?;\n    // allow dev dependencies to be unpublished\n    changed += fix_dep_set(&versions.all_crates(), \"dev-dependencies\", metadata)?;\n    changed += fix_dep_set(versions, \"build-dependencies\", metadata)?;\n    Ok(changed)\n}\n\nfn conditionally_disallow_publish(\n    manifest_path: &Path,\n    metadata: &mut toml::Value,\n) -> Result<bool> {\n    let is_gh_action_or_smithy_rs_docker = running_in_ci();\n    let is_example = is_in_example_dir(manifest_path);\n    let is_preview_build = is_preview_build();\n\n    // Safe-guard to prevent accidental publish to crates.io. Add some friction\n    // to publishing from a local development machine by detecting that the tool\n    // is not being run from CI, and disallow publish in that case. Also disallow\n    // publishing of examples and Trebuchet preview builds.\n    if !is_gh_action_or_smithy_rs_docker || is_example || is_preview_build {\n        if let Some(value) = set_publish_false(manifest_path, metadata, is_example) {\n            return Ok(value);\n        }\n    }\n    Ok(false)\n}\n\nfn set_publish_false(manifest_path: &Path, metadata: &mut Value, is_example: bool) -> Option<bool> {\n    if let Some(package) = metadata.as_table_mut().unwrap().get_mut(\"package\") {\n        info!(\n            \"Detected {}. Disallowing publish for {:?}.\",\n            if is_example { \"example\" } else { \"local build\" },\n            manifest_path,\n        );\n        package\n            .as_table_mut()\n            .unwrap()\n            .insert(\"publish\".into(), toml::Value::Boolean(false));\n        return Some(true);\n    }\n    None\n}\n\nasync fn fix_manifests(\n    fs: Fs,\n    versions: &Versions,\n    manifests: &mut Vec<Manifest>,\n    mode: Mode,\n) -> Result<()> {\n    for manifest in manifests {\n        let package_changed =\n            conditionally_disallow_publish(&manifest.path, &mut manifest.metadata)?;\n        let num_deps_changed = fix_manifest(versions, manifest)?;\n        if package_changed || num_deps_changed > 0 {\n            let contents =\n                \"# Code generated by software.amazon.smithy.rust.codegen.smithy-rs. DO NOT EDIT.\\n\"\n                    .to_string()\n                    + &toml::to_string(&manifest.metadata).with_context(|| {\n                        format!(\"failed to serialize to toml for {:?}\", manifest.path)\n                    })?;\n\n            match mode {\n                Mode::Execute => {\n                    fs.write_file(&manifest.path, contents.as_bytes()).await?;\n                    info!(\n                        \"Changed {} dependencies in {:?}.\",\n                        num_deps_changed, manifest.path\n                    );\n                }\n                Mode::Check => {\n                    bail!(\n                        \"{manifest:?} contained invalid versions\",\n                        manifest = manifest.path\n                    )\n                }\n            }\n        }\n    }\n    Ok(())\n}\n\nfn fix_manifest(versions: &Versions, manifest: &mut Manifest) -> Result<usize> {\n    // In the case of a preview build we do not update the examples manifests\n    // since most SDKs will not be generated so the particular crate referred to\n    // by an example is unlikely to exist\n    if is_in_example_dir(&manifest.path) && is_preview_build() {\n        debug!(package = ?&manifest.path, \"Skipping example package for preview build\");\n        return Ok(0);\n    }\n    let mut view = versions.published();\n    if !manifest.publish()? {\n        debug!(package = ?&manifest.path, \"package has publishing disabled, allowing unpublished crates to be used\");\n        view = view.all_crates();\n    }\n    fix_dep_sets(&view, &mut manifest.metadata)\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n\n    fn make_versions<'a>(versions: impl Iterator<Item = &'a (&'a str, &'a str, bool)>) -> Versions {\n        let map = versions\n            .into_iter()\n            .map(|(name, version, publish)| {\n                let publish = *publish;\n                (\n                    name.to_string(),\n                    VersionWithMetadata {\n                        version: Version::parse(version).unwrap(),\n                        publish,\n                    },\n                )\n            })\n            .collect::<BTreeMap<_, _>>();\n\n        Versions(map)\n    }\n\n    #[test]\n    fn unpublished_deps_cant_be_deps() {\n        let manifest = br#\"\n            [package]\n            name = \"test\"\n            version = \"1.2.0\"\n\n            [build-dependencies]\n            build_something = \"1.3\"\n            local_build_something = { path = \"../local_build_something\", version = \"0.4.0-different\" }\n\n            [dev-dependencies]\n            dev_something = \"1.1\"\n            local_dev_something = { path = \"../local_dev_something\" }\n\n            [dependencies]\n            something = \"1.0\"\n            local_something = { path = \"../local_something\" }\n        \"#;\n        let metadata = toml::from_slice(manifest).unwrap();\n        let mut manifest = Manifest {\n            path: \"test\".into(),\n            metadata,\n        };\n        let versions = &[\n            (\"local_build_something\", \"0.2.0\", true),\n            (\"local_dev_something\", \"0.1.0\", false),\n            (\"local_something\", \"1.1.3\", false),\n        ];\n        let versions = make_versions(versions.iter());\n        fix_manifest(&versions, &mut manifest).expect_err(\"depends on unpublished local something\");\n        set_publish_false(&manifest.path, &mut manifest.metadata, false).unwrap();\n        fix_manifest(&versions, &mut manifest)\n            .expect(\"now it will work, the crate isn't published\");\n    }\n\n    #[test]\n    fn test_fix_dep_sets() {\n        let manifest = br#\"\n            [package]\n            name = \"test\"\n            version = \"1.2.0-preview\"\n\n            [build-dependencies]\n            build_something = \"1.3\"\n            local_build_something = { path = \"../local_build_something\", version = \"0.4.0-different\" }\n\n            [dev-dependencies]\n            dev_something = \"1.1\"\n            local_dev_something = { path = \"../local_dev_something\" }\n\n            [dependencies]\n            something = \"1.0\"\n            local_something = { path = \"../local_something\" }\n        \"#;\n        let metadata = toml::from_slice(manifest).unwrap();\n        let mut manifest = Manifest {\n            path: \"test\".into(),\n            metadata,\n        };\n        let versions = &[\n            (\"local_build_something\", \"0.2.0\", true),\n            (\"local_dev_something\", \"0.1.0\", false),\n            (\"local_something\", \"1.1.3\", true),\n        ];\n        let versions = make_versions(versions.iter());\n\n        fix_dep_sets(&versions.published(), &mut manifest.metadata).expect(\"success\");\n\n        let actual_deps = &manifest.metadata[\"dependencies\"];\n        assert_eq!(\n            \"\\\n                something = \\\"1.0\\\"\\n\\\n                \\n\\\n                [local_something]\\n\\\n                path = \\\"../local_something\\\"\\n\\\n                version = \\\"1.1.3\\\"\\n\\\n            \",\n            actual_deps.to_string()\n        );\n\n        let actual_dev_deps = &manifest.metadata[\"dev-dependencies\"];\n        assert_eq!(\n            \"\\\n                dev_something = \\\"1.1\\\"\\n\\\n                \\n\\\n                [local_dev_something]\\n\\\n                path = \\\"../local_dev_something\\\"\\n\\\n                version = \\\"0.1.0\\\"\\n\\\n            \",\n            actual_dev_deps.to_string()\n        );\n\n        let actual_build_deps = &manifest.metadata[\"build-dependencies\"];\n        assert_eq!(\n            \"\\\n                build_something = \\\"1.3\\\"\\n\\\n                \\n\\\n                [local_build_something]\\n\\\n                path = \\\"../local_build_something\\\"\\n\\\n                version = \\\"0.2.0\\\"\\n\\\n            \",\n            actual_build_deps.to_string()\n        );\n    }\n}\n"
  },
  {
    "path": "tools/ci-build/publisher/src/subcommand/generate_version_manifest.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::fs::Fs;\nuse crate::package::discover_packages;\nuse anyhow::{bail, Context, Result};\nuse clap::Parser;\nuse semver::Version;\nuse serde::Deserialize;\nuse smithy_rs_tool_common::ci::is_preview_build;\nuse smithy_rs_tool_common::git::{find_git_repository_root, Git, GitCLI};\nuse smithy_rs_tool_common::package::PackageCategory;\nuse smithy_rs_tool_common::shell;\nuse smithy_rs_tool_common::versions_manifest::{CrateVersion, Release, VersionsManifest};\nuse std::collections::BTreeMap;\nuse std::fs::File;\nuse std::path::{Path, PathBuf};\nuse tracing::info;\n\n#[derive(Parser, Debug)]\npub struct GenerateVersionManifestArgs {\n    /// Path to `smithy-build.json`\n    #[clap(long)]\n    smithy_build: PathBuf,\n    // TODO(examples removal post cleanup): Remove this field once examples revision is removed\n    // from `versions.toml` in the main branch of `aws-sdk-rust` repository.\n    /// Revision of `aws-doc-sdk-examples` repository used to retrieve examples\n    #[clap(long)]\n    examples_revision: Option<String>,\n    /// Same as `input_location` but kept for backwards compatibility\n    #[clap(long, required_unless_present = \"input-location\")]\n    location: Option<PathBuf>,\n    /// Path containing the generated SDK to generate a version manifest for\n    #[clap(long, required_unless_present = \"location\")]\n    input_location: Option<PathBuf>,\n    /// Path to a directory in which a version manifest is generated\n    #[clap(long, required_unless_present = \"location\")]\n    output_location: Option<PathBuf>,\n    /// Optional path to the `versions.toml` manifest from the previous SDK release\n    #[clap(long)]\n    previous_release_versions: Option<PathBuf>,\n}\n\npub async fn subcommand_generate_version_manifest(\n    GenerateVersionManifestArgs {\n        smithy_build,\n        examples_revision,\n        location,\n        input_location,\n        output_location,\n        previous_release_versions,\n        ..\n    }: &GenerateVersionManifestArgs,\n) -> Result<()> {\n    verify_crate_hasher_available()?;\n\n    let repo_root = find_git_repository_root(\"smithy-rs\", std::env::current_dir()?)?;\n    let smithy_rs_revision = GitCLI::new(&repo_root)?\n        .get_head_revision()\n        .context(\"get smithy-rs revision\")?;\n    info!(\"Resolved smithy-rs revision to {}\", smithy_rs_revision);\n\n    let smithy_build_root = SmithyBuildRoot::from_file(smithy_build)?;\n    let input_location = match (location, input_location) {\n        (Some(location), None) => location,\n        (None, Some(input_location)) => input_location,\n        _ => bail!(\"Only one of `--location` or `--input-location` should be provided\"),\n    };\n    let output_location = match (location, output_location) {\n        (Some(location), None) => location,\n        (None, Some(output_location)) => output_location,\n        _ => bail!(\"Only one of `--location` or `--output-location` should be provided\"),\n    };\n    let packages = discover_packages(Fs::Real, input_location)\n        .await\n        .context(\"read packages\")?;\n\n    let mut crates = BTreeMap::new();\n    for package in packages {\n        // Don't include examples\n        if let PackageCategory::Unknown = package.category {\n            continue;\n        }\n\n        let mut model_hash = None;\n        if let PackageCategory::AwsSdk = package.category {\n            if let Some(projection) = smithy_build_root\n                .projections\n                .get(&package.handle.name[\"aws-sdk-\".len()..])\n            {\n                model_hash = Some(hash_models(projection)?);\n            }\n        }\n        assert!(\n            matches!(package.category, PackageCategory::AwsSdk) == model_hash.is_some(),\n            \"all generated SDK crates should have a model hash\"\n        );\n        let version = package.handle.expect_version().to_string();\n        crates.insert(\n            package.handle.name,\n            CrateVersion {\n                category: package.category,\n                version,\n                source_hash: hash_crate(&package.crate_path).context(\"hash crate\")?,\n                model_hash,\n            },\n        );\n    }\n    info!(\"Discovered and hashed {} crates\", crates.len());\n    let mut versions_manifest = VersionsManifest {\n        smithy_rs_revision: smithy_rs_revision.to_string(),\n        aws_doc_sdk_examples_revision: examples_revision.as_ref().map(String::to_string),\n        manual_interventions: Default::default(),\n        crates,\n        release: None,\n    };\n\n    versions_manifest.release =\n        generate_release_metadata(&versions_manifest, previous_release_versions)?;\n\n    let manifest_file_name = output_location.join(\"versions.toml\");\n    info!(\"Writing {:?}...\", manifest_file_name);\n    versions_manifest.write_to_file(&manifest_file_name)?;\n    Ok(())\n}\n\nfn generate_release_metadata(\n    versions_manifest: &VersionsManifest,\n    maybe_previous_release_versions: &Option<PathBuf>,\n) -> Result<Option<Release>> {\n    // For release builds we generate a real release section\n    if let (Some(previous_release_versions), false) =\n        (maybe_previous_release_versions, is_preview_build())\n    {\n        let old_versions = VersionsManifest::from_file(previous_release_versions)?;\n        Ok(Some(Release {\n            tag: None,\n            crates: find_released_versions(&old_versions, versions_manifest)?,\n        }))\n    // For preview builds we insert an empty section\n    } else {\n        Ok(Some(Release {\n            tag: None,\n            crates: BTreeMap::new(),\n        }))\n    }\n}\n\nfn parse_version(name: &str, value: &str) -> Result<Version> {\n    match Version::parse(value) {\n        Ok(version) => Ok(version),\n        Err(err) => bail!(\"Failed to parse version number `{value}` from `{name}`: {err}\"),\n    }\n}\n\nfn find_released_versions(\n    unrecent_versions: &VersionsManifest,\n    recent_versions: &VersionsManifest,\n) -> Result<BTreeMap<String, String>> {\n    // TODO(deprecated crates removal post cleanup): Remove this variable once deprecated runtime crates\n    // are removed from `versions.toml` in the main branch of `aws-sdk-rust` repository.\n    // Not planning to implement a generic solution to teach publisher about deprecated runtime crates,\n    // since deprecation occurs so infrequently.\n    let allowed_missing_crates = [\n        \"aws-endpoint\",\n        \"aws-http\",\n        \"aws-hyper\",\n        \"aws-sig-auth\",\n        \"aws-smithy-client\",\n        \"aws-smithy-http-auth\",\n        \"aws-smithy-http-tower\",\n        \"aws-smithy-mocks-experimental\",\n    ];\n\n    let mut released_versions = BTreeMap::new();\n    for (crate_name, recent_version) in &recent_versions.crates {\n        let recent_version = parse_version(crate_name, &recent_version.version)?;\n        if let Some(unrecent_version) = unrecent_versions.crates.get(crate_name) {\n            let unrecent_version = parse_version(crate_name, &unrecent_version.version)?;\n            if unrecent_version != recent_version {\n                // If the crate is in both version manifests with differing version\n                // numbers, then it is part of the release\n                released_versions.insert(crate_name.clone(), recent_version.to_string());\n            }\n        } else {\n            // If the previous version manifest didn't have this crate, then it is part of this release\n            released_versions.insert(crate_name.clone(), recent_version.to_string());\n        }\n    }\n    // Sanity check: If a crate was previously included, but no longer is, we probably want to know about it\n    let crates_to_remove = &unrecent_versions.manual_interventions.crates_to_remove;\n    for unrecent_crate_name in unrecent_versions.crates.keys() {\n        if !recent_versions.crates.contains_key(unrecent_crate_name)\n            && !crates_to_remove.contains(unrecent_crate_name)\n            && !allowed_missing_crates.contains(&unrecent_crate_name.as_str())\n        {\n            bail!(\n                \"Crate `{unrecent_crate_name}` was included in the previous release's `versions.toml`, \\\n                 but is not included in the upcoming release. If this is expected, update the \\\n                 publisher tool to expect and allow it.\"\n            )\n        }\n    }\n\n    Ok(released_versions)\n}\n\nfn verify_crate_hasher_available() -> Result<()> {\n    match std::process::Command::new(\"crate-hasher\")\n        .arg(\"--version\")\n        .spawn()\n    {\n        Ok(_) => Ok(()),\n        Err(_) => {\n            bail!(\n                \"This subcommand requires the `crate-hasher` tool to be on the PATH\\n\\\n                Install it by going into tools/crate-hasher and running `cargo install --path .`.\"\n            );\n        }\n    }\n}\n\nfn hash_crate(path: &Path) -> Result<String> {\n    let output = std::process::Command::new(\"crate-hasher\")\n        .arg(path.to_str().expect(\"nothing special about these paths\"))\n        .output()?;\n    shell::handle_failure(\"run crate-hasher\", &output)?;\n    let (stdout, _stderr) = shell::output_text(&output);\n    Ok(stdout.trim().into())\n}\n\nfn hash_models(projection: &SmithyBuildProjection) -> Result<String> {\n    // Must match `hashModels` in `CrateVersioner.kt`\n    let mut hashes = String::new();\n    for import in &projection.imports {\n        hashes.push_str(&sha256::try_digest(import.as_path())?);\n        hashes.push('\\n');\n    }\n    Ok(sha256::digest(hashes))\n}\n\n#[derive(Debug, Deserialize)]\nstruct SmithyBuildRoot {\n    projections: BTreeMap<String, SmithyBuildProjection>,\n}\n\nimpl SmithyBuildRoot {\n    fn from_file(path: &Path) -> Result<SmithyBuildRoot> {\n        serde_json::from_reader(File::open(path).context(\"open smithy-build.json\")?)\n            .context(\"deserialize smithy-build.json\")\n    }\n}\n\n#[derive(Debug, Deserialize)]\nstruct SmithyBuildProjection {\n    imports: Vec<PathBuf>,\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use fs_err as fs;\n    use smithy_rs_tool_common::package::PackageCategory;\n    use smithy_rs_tool_common::versions_manifest::ManualInterventions;\n    use tempfile::TempDir;\n\n    fn fake_manifest(\n        crates: &[(&str, &str)],\n        manual_interventions: Option<ManualInterventions>,\n    ) -> VersionsManifest {\n        VersionsManifest {\n            smithy_rs_revision: \"dontcare\".into(),\n            aws_doc_sdk_examples_revision: None,\n            manual_interventions: manual_interventions.unwrap_or_default(),\n            crates: crates\n                .iter()\n                .map(|(name, version)| (name.to_string(), fake_version(version)))\n                .collect(),\n            release: None,\n        }\n    }\n    fn fake_version(version: &str) -> CrateVersion {\n        CrateVersion {\n            category: PackageCategory::AwsSdk,\n            version: version.into(),\n            source_hash: \"dontcare\".into(),\n            model_hash: None,\n        }\n    }\n\n    #[test]\n    fn test_find_released_versions_dropped_crate_sanity_check() {\n        let result = find_released_versions(\n            &fake_manifest(\n                &[\n                    (\"aws-config\", \"0.11.0\"),\n                    (\"aws-sdk-s3\", \"0.13.0\"),\n                    (\"aws-sdk-dynamodb\", \"0.12.0\"),\n                ],\n                None,\n            ),\n            &fake_manifest(\n                &[\n                    // oops, we lost aws-config\n                    (\"aws-sdk-s3\", \"0.13.0\"),\n                    (\"aws-sdk-dynamodb\", \"0.12.0\"),\n                ],\n                None,\n            ),\n        );\n        assert!(result.is_err());\n        let error = format!(\"{}\", result.err().unwrap());\n        assert!(\n            error.starts_with(\"Crate `aws-config` was included in\"),\n            \"Unexpected error: {error}\"\n        );\n    }\n\n    #[test]\n    fn test_find_released_versions_dropped_crate_sanity_check_manual_intervention() {\n        let result = find_released_versions(\n            &fake_manifest(\n                &[\n                    (\"aws-config\", \"0.11.0\"),\n                    (\"aws-sdk-redshiftserverless\", \"0.13.0\"),\n                    (\"aws-sdk-s3\", \"0.13.0\"),\n                    (\"aws-sdk-dynamodb\", \"0.12.0\"),\n                ],\n                Some(ManualInterventions {\n                    crates_to_remove: vec![\"aws-sdk-redshiftserverless\".to_string()],\n                }),\n            ),\n            &fake_manifest(\n                &[\n                    (\"aws-config\", \"0.11.0\"),\n                    // we intentionally dropped aws-sdk-redshiftserverless\n                    (\"aws-sdk-s3\", \"0.13.0\"),\n                    (\"aws-sdk-dynamodb\", \"0.12.0\"),\n                ],\n                None,\n            ),\n        );\n        assert!(result.is_ok());\n    }\n\n    #[test]\n    fn test_find_released_versions() {\n        let result = find_released_versions(\n            &fake_manifest(\n                &[\n                    (\"aws-config\", \"0.11.0\"),\n                    (\"aws-sdk-s3\", \"0.13.0\"),\n                    (\"aws-sdk-dynamodb\", \"0.12.0\"),\n                ],\n                None,\n            ),\n            &fake_manifest(\n                &[\n                    (\"aws-config\", \"0.12.0\"),          // updated\n                    (\"aws-sdk-s3\", \"0.14.0\"),          // updated\n                    (\"aws-sdk-dynamodb\", \"0.12.0\"),    // same\n                    (\"aws-sdk-somethingnew\", \"0.1.0\"), // new\n                ],\n                None,\n            ),\n        )\n        .unwrap();\n\n        assert_eq!(\"0.12.0\", result.get(\"aws-config\").unwrap());\n        assert_eq!(\"0.14.0\", result.get(\"aws-sdk-s3\").unwrap());\n        assert_eq!(\"0.1.0\", result.get(\"aws-sdk-somethingnew\").unwrap());\n        assert!(!result.contains_key(\"aws-sdk-dynamodb\"));\n        assert_eq!(3, result.len());\n    }\n\n    #[test]\n    fn test_hash_models() {\n        let tmp = TempDir::new().unwrap();\n        let model1a = tmp.path().join(\"model1a\");\n        let model1b = tmp.path().join(\"model1b\");\n\n        fs::write(&model1a, \"foo\").unwrap();\n        fs::write(&model1b, \"bar\").unwrap();\n\n        let hash = hash_models(&SmithyBuildProjection {\n            imports: vec![model1a, model1b],\n        })\n        .unwrap();\n\n        assert_eq!(\n            \"964021077fb6c3d42ae162ab2e2255be64c6d96a6d77bca089569774d54ef69b\",\n            hash\n        );\n    }\n}\n"
  },
  {
    "path": "tools/ci-build/publisher/src/subcommand/hydrate_readme.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse anyhow::{Context, Result};\nuse clap::Parser;\nuse fs_err as fs;\nuse handlebars::Handlebars;\nuse serde::Serialize;\nuse serde_json::json;\nuse smithy_rs_tool_common::versions_manifest::VersionsManifest;\nuse std::path::PathBuf;\n\n#[derive(Parser, Debug)]\npub struct HydrateReadmeArgs {\n    /// Path to the versions.toml file for this release\n    #[clap(long)]\n    pub versions_manifest: PathBuf,\n    /// Rust MSRV to put in the README\n    #[clap(long)]\n    pub msrv: String,\n    /// Path to the readme template to hydrate\n    #[clap(short, long)]\n    pub input: PathBuf,\n    /// Path to output the hydrated readme into\n    #[clap(short, long)]\n    pub output: PathBuf,\n}\n\npub fn subcommand_hydrate_readme(\n    HydrateReadmeArgs {\n        versions_manifest,\n        msrv,\n        input,\n        output,\n    }: &HydrateReadmeArgs,\n) -> Result<()> {\n    let versions_manifest = VersionsManifest::from_file(versions_manifest)\n        .with_context(|| format!(\"Failed to read versions manifest at {versions_manifest:?}\"))?;\n    let template = fs::read_to_string(input)\n        .with_context(|| format!(\"Failed to read README template file at {input:?}\"))?;\n\n    let context = make_context(msrv, &versions_manifest);\n    let hydrated = hydrate_template(&template, &context)?;\n    fs::write(output, hydrated.as_bytes())\n        .with_context(|| format!(\"Failed to write hydrated README to {output:?}\"))?;\n    Ok(())\n}\n\nfn hydrate_template<C: Serialize>(template_string: &str, template_context: &C) -> Result<String> {\n    let reg = Handlebars::new();\n    reg.render_template(template_string, template_context)\n        .context(\"Failed to hydrate README template\")\n}\n\nfn make_context(msrv: &str, versions_manifest: &VersionsManifest) -> serde_json::Value {\n    let mut context = json!({ \"msrv\": msrv });\n\n    for (crate_name, metadata) in &versions_manifest.crates {\n        let key = format!(\"sdk_version_{}\", crate_name.replace('-', \"_\"));\n        context\n            .as_object_mut()\n            .unwrap()\n            .insert(key, serde_json::Value::String(metadata.version.clone()));\n    }\n    context\n}\n\n#[cfg(test)]\nmod tests {\n    use super::hydrate_template;\n    use serde_json::json;\n\n    #[test]\n    fn test_hydrate_template() {\n        let template_context = json!({\n            \"foo\": \"foo value\",\n            \"baz\": \"some baz value\"\n        });\n        let hydrated = hydrate_template(\n            \"\\\n            {{!-- Not included --}}\\n\\\n            <!-- Included -->\\n\\\n            Some {{foo}} and {{baz}} here.\\n\\\n            \",\n            &template_context,\n        )\n        .unwrap();\n        assert_eq!(\n            \"\\\n            <!-- Included -->\\n\\\n            Some foo value and some baz value here.\\n\\\n            \",\n            hydrated,\n        )\n    }\n}\n"
  },
  {
    "path": "tools/ci-build/publisher/src/subcommand/mod.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npub mod claim_crate_names;\npub mod fix_manifests;\npub mod generate_version_manifest;\npub mod hydrate_readme;\npub mod publish;\npub mod tag_versions_manifest;\npub mod yank_release;\n"
  },
  {
    "path": "tools/ci-build/publisher/src/subcommand/publish.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::fs::Fs;\nuse crate::package::{discover_and_validate_package_batches, PackageBatch, PackageStats};\nuse crate::publish::publish;\nuse crate::{cargo, SDK_REPO_CRATE_PATH, SDK_REPO_NAME};\nuse anyhow::{bail, Context, Result};\nuse clap::Parser;\nuse dialoguer::Confirm;\nuse smithy_rs_tool_common::package::{Package, PackageHandle};\nuse smithy_rs_tool_common::retry::{run_with_retry, BoxError, ErrorClass};\nuse smithy_rs_tool_common::shell::ShellOperation;\nuse smithy_rs_tool_common::{git, index::CratesIndex};\nuse std::path::{Path, PathBuf};\nuse std::time::Duration;\nuse std::{collections::HashSet, sync::Arc};\nuse tracing::info;\n\nconst DEFAULT_DELAY_MILLIS: usize = 1000;\n\n#[derive(Parser, Debug)]\npub struct PublishArgs {\n    /// Path containing the crates to publish. Crates will be discovered recursively\n    #[clap(long)]\n    location: PathBuf,\n\n    /// Don't prompt for confirmation before publishing\n    #[clap(short('y'))]\n    skip_confirmation: bool,\n\n    /// Time delay between crate publishes to avoid crates.io throttling errors.\n    #[clap(long)]\n    delay_millis: Option<usize>,\n}\n\npub async fn subcommand_publish(\n    PublishArgs {\n        location,\n        skip_confirmation,\n        delay_millis,\n    }: &PublishArgs,\n) -> Result<()> {\n    // Make sure cargo exists\n    cargo::confirm_installed_on_path()?;\n\n    let location = resolve_publish_location(location);\n    let delay_millis = Duration::from_millis(delay_millis.unwrap_or(DEFAULT_DELAY_MILLIS) as _);\n\n    info!(\"Discovering crates to publish...\");\n    let (batches, stats) = discover_and_validate_package_batches(Fs::Real, &location).await?;\n    info!(\"Finished crate discovery.\");\n\n    // Don't proceed unless the user confirms the plan\n    confirm_plan(&batches, stats, *skip_confirmation)?;\n\n    let index = Arc::new(CratesIndex::real()?);\n    for batch in &batches {\n        let mut any_published = false;\n        for package in batch {\n            // Only publish if it hasn't been published yet.\n            if !is_published(index.clone(), &package.handle).await? {\n                publish(&package.handle, &package.crate_path).await?;\n\n                // Keep things slow to avoid getting throttled by crates.io\n                tokio::time::sleep(delay_millis).await;\n\n                // Sometimes it takes a little bit of time for the new package version\n                // to become available after publish. If we proceed too quickly, then\n                // the next package publish can fail if it depends on this package.\n                wait_for_eventual_consistency(index.clone(), package).await?;\n                info!(\"Successfully published `{}`\", &package.handle);\n                any_published = true;\n            } else {\n                info!(\"`{}` was already published\", &package.handle);\n            }\n        }\n        if any_published {\n            info!(\"Sleeping 30 seconds after completion of the batch\");\n            tokio::time::sleep(Duration::from_secs(30)).await;\n        } else {\n            info!(\"No packages in the batch needed publishing. Proceeding with the next batch immediately.\")\n        }\n    }\n\n    for batch in &batches {\n        for package in batch {\n            correct_owner(&package.handle).await?;\n        }\n    }\n\n    Ok(())\n}\n\n/// Given a `location`, this function looks for the `aws-sdk-rust` git repository. If found,\n/// it resolves the `sdk/` directory. Otherwise, it returns the original `location`.\npub fn resolve_publish_location(location: &Path) -> PathBuf {\n    match git::find_git_repository_root(SDK_REPO_NAME, location) {\n        // If the given path was the `aws-sdk-rust` repo root, then resolve the `sdk/` directory to publish from\n        Ok(sdk_repo) => sdk_repo.join(SDK_REPO_CRATE_PATH),\n        // Otherwise, publish from the given path (likely the smithy-rs runtime bundle)\n        Err(_) => location.into(),\n    }\n}\n\nasync fn is_published(index: Arc<CratesIndex>, handle: &PackageHandle) -> Result<bool> {\n    let name = handle.name.clone();\n    let version = handle.expect_version().clone();\n    tokio::task::spawn_blocking(move || {\n        smithy_rs_tool_common::index::is_published(index.as_ref(), &name, &version)\n    })\n    .await?\n}\n\n/// Waits for the given package to show up on crates.io\nasync fn wait_for_eventual_consistency(index: Arc<CratesIndex>, package: &Package) -> Result<()> {\n    // This timeout value is quite long (it started at 10 seconds), but is currently increased to handle\n    // recent slowdowns we have seen with crates.io populating the sparse index. You can find some discussion\n    // here: https://rust-lang.zulipchat.com/#narrow/channel/318791-t-crates-io/topic/sparse.20index.20updates.20sometimes.20being.20rate.20limited/with/529157932\n    // and a tracking issue at https://github.com/rust-lang/crates.io/issues/11588\n    let max_wait_time = 180usize;\n    for _ in 0..max_wait_time {\n        if !is_published(index.clone(), &package.handle).await? {\n            tokio::time::sleep(Duration::from_secs(1)).await;\n        } else {\n            return Ok(());\n        }\n    }\n    if !is_published(index.clone(), &package.handle).await? {\n        return Err(anyhow::Error::msg(format!(\n            \"package wasn't found on crates.io {max_wait_time} seconds after publish\"\n        )));\n    }\n    Ok(())\n}\n\n/// Corrects the crate ownership.\npub async fn correct_owner(handle: &PackageHandle) -> Result<()> {\n    // https://github.com/orgs/awslabs/teams/smithy-rs-server\n    const SMITHY_RS_SERVER_OWNER: &str = \"github:awslabs:smithy-rs-server\";\n    // https://github.com/orgs/awslabs/teams/rust-sdk-owners\n    const RUST_SDK_OWNER: &str = \"github:awslabs:rust-sdk-owners\";\n\n    run_with_retry(\n        &format!(\"Correcting ownership of `{}`\", handle.name),\n        3,\n        Duration::from_secs(5),\n        || async {\n            let actual_owners: HashSet<String> = cargo::GetOwners::new(&handle.name).spawn().await?.into_iter().collect();\n            let expected_owners = handle.expected_owners().iter().map(|s| s.to_string()).collect::<HashSet<_>>();\n\n            let owners_to_be_added = expected_owners.difference(&actual_owners);\n            let owners_to_be_removed = actual_owners.difference(&expected_owners);\n\n            let mut added_individual = false;\n            for crate_owner in owners_to_be_added {\n                cargo::AddOwner::new(&handle.name, crate_owner)\n                    .spawn()\n                    .await?;\n                info!(\"Added `{}` as owner of `{}`\", crate_owner, handle);\n                // Teams in crates.io start with `github:` while individuals are just the GitHub user name\n                added_individual |= !crate_owner.starts_with(\"github:\");\n            }\n            for crate_owner in owners_to_be_removed {\n                // Trying to remove them will result in an error due to a bug in crates.io\n                // Upstream tracking issue: https://github.com/rust-lang/crates.io/issues/2736\n                if crate_owner == SMITHY_RS_SERVER_OWNER || crate_owner == RUST_SDK_OWNER {\n                    continue;\n                }\n                // Adding an individual owner requires accepting an invite, so don't attempt to remove\n                // anyone if an owner was added, as removing the last individual owner may break.\n                // The next publish run will remove the incorrect owner.\n                if !added_individual {\n                    cargo::RemoveOwner::new(&handle.name, crate_owner)\n                        .spawn()\n                        .await\n                        .with_context(|| format!(\"remove incorrect owner `{crate_owner}` from crate `{handle}`\"))?;\n                    info!(\n                        \"Removed incorrect owner `{}` from crate `{}`\",\n                        crate_owner, handle\n                    );\n                } else {\n                    info!(\"Skipping removal of incorrect owner `{}` from crate `{}` due to new owners\", crate_owner, handle);\n                }\n            }\n            Result::<_, BoxError>::Ok(())\n        },\n        |_err| ErrorClass::Retry,\n    )\n    .await\n    .context(\"correct_owner\")\n}\n\nfn confirm_plan(\n    batches: &[PackageBatch],\n    stats: PackageStats,\n    skip_confirmation: bool,\n) -> Result<()> {\n    let mut full_plan = Vec::new();\n    for batch in batches {\n        for package in batch {\n            full_plan.push(format!(\n                \"Publish version `{}` of `{}`\",\n                package.handle.expect_version(),\n                package.handle.name\n            ));\n        }\n        full_plan.push(\"-- wait --\".into());\n    }\n\n    info!(\"Publish plan:\");\n    for item in full_plan {\n        println!(\"  {item}\");\n    }\n    info!(\n        \"Will publish {} crates total ({} Smithy runtime, {} AWS runtime, {} AWS SDK).\",\n        stats.total(),\n        stats.smithy_runtime_crates,\n        stats.aws_runtime_crates,\n        stats.aws_sdk_crates\n    );\n\n    if skip_confirmation\n        || Confirm::new()\n            .with_prompt(\"Continuing will publish to crates.io. Do you wish to continue?\")\n            .interact()?\n    {\n        Ok(())\n    } else {\n        bail!(\"aborted\")\n    }\n}\n"
  },
  {
    "path": "tools/ci-build/publisher/src/subcommand/tag_versions_manifest.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse anyhow::{bail, Result};\nuse clap::Parser;\nuse smithy_rs_tool_common::versions_manifest::VersionsManifest;\nuse std::path::PathBuf;\n\n#[derive(Parser, Debug)]\npub struct TagVersionsManifestArgs {\n    /// Path to the `versions.toml` file to tag\n    #[clap(long)]\n    manifest_path: PathBuf,\n    /// Release tag to add to the `[release]` section\n    #[clap(long)]\n    tag: String,\n}\n\npub fn subcommand_tag_versions_manifest(\n    TagVersionsManifestArgs { manifest_path, tag }: &TagVersionsManifestArgs,\n) -> Result<()> {\n    println!(\"Tagging manifest at: {manifest_path:#?}\");\n    let mut manifest = VersionsManifest::from_file(manifest_path)?;\n    if let Some(release) = manifest.release.as_mut() {\n        release.tag = Some(tag.to_string());\n    } else {\n        bail!(\"The given versions manifest file doesn't have a `[release]` section in it to add the tag to\");\n    }\n    manifest.write_to_file(manifest_path)?;\n    Ok(())\n}\n\n#[cfg(test)]\nmod tests {\n    use super::{subcommand_tag_versions_manifest, TagVersionsManifestArgs};\n    use smithy_rs_tool_common::package::PackageCategory;\n    use smithy_rs_tool_common::versions_manifest::{CrateVersion, Release, VersionsManifest};\n    use tempfile::TempDir;\n\n    #[test]\n    fn test_tag_versions_manifest() {\n        let tmp_dir = TempDir::new().unwrap();\n\n        let versions_manifest_path = tmp_dir.path().join(\"versions.toml\");\n        let original = VersionsManifest {\n            smithy_rs_revision: \"some-revision-smithy-rs\".into(),\n            aws_doc_sdk_examples_revision: None,\n            manual_interventions: Default::default(),\n            crates: [\n                (\n                    \"aws-config\".to_string(),\n                    CrateVersion {\n                        category: PackageCategory::AwsRuntime,\n                        version: \"0.12.3\".into(),\n                        source_hash: \"some-hash-aws-config\".into(),\n                        model_hash: None,\n                    },\n                ),\n                (\n                    \"aws-sdk-dynamodb\".to_string(),\n                    CrateVersion {\n                        category: PackageCategory::AwsRuntime,\n                        version: \"0.14.5\".into(),\n                        source_hash: \"some-hash-aws-sdk-dynamodb\".into(),\n                        model_hash: None,\n                    },\n                ),\n            ]\n            .into_iter()\n            .collect(),\n            release: Some(Release {\n                tag: None,\n                crates: [(\"aws-config\", \"0.12.3\"), (\"aws-sdk-dynamodb\", \"0.14.5\")]\n                    .into_iter()\n                    .map(|(k, v)| (k.to_string(), v.to_string()))\n                    .collect(),\n            }),\n        };\n        original.write_to_file(&versions_manifest_path).unwrap();\n\n        subcommand_tag_versions_manifest(&TagVersionsManifestArgs {\n            manifest_path: versions_manifest_path.clone(),\n            tag: \"some-release-tag\".into(),\n        })\n        .unwrap();\n\n        let expected = {\n            let mut expected = original;\n            expected.release.as_mut().unwrap().tag = Some(\"some-release-tag\".to_string());\n            expected\n        };\n        let actual = VersionsManifest::from_file(&versions_manifest_path).unwrap();\n        assert_eq!(expected, actual);\n    }\n}\n"
  },
  {
    "path": "tools/ci-build/publisher/src/subcommand/yank_release.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::cargo;\nuse crate::yank::yank;\nuse anyhow::{anyhow, bail, Context, Result};\nuse clap::{ArgEnum, Parser};\nuse dialoguer::Confirm;\nuse smithy_rs_tool_common::package::PackageCategory;\nuse smithy_rs_tool_common::release_tag::ReleaseTag;\nuse smithy_rs_tool_common::versions_manifest::{Release, VersionsManifest};\nuse std::collections::BTreeMap;\nuse std::path::{Path, PathBuf};\nuse std::str::FromStr;\nuse std::time::Duration;\nuse tracing::info;\n\nconst DEFAULT_DELAY_MILLIS: usize = 1000;\n\n#[derive(Copy, Clone, Debug, ArgEnum, Eq, PartialEq, Ord, PartialOrd)]\npub enum CrateSet {\n    /// (default) Yank all crates associated with the release.\n    All,\n    /// Yank all AWS SDK crates.\n    AllAwsSdk,\n    /// Yank generated AWS SDK crates.\n    GeneratedAwsSdk,\n}\n\n#[derive(Parser, Debug)]\npub struct YankReleaseArgs {\n    /// The aws-sdk-rust release tag to yank. The CLI will download the `versions.toml` file\n    /// from GitHub at this tagged version to determine which crates to yank.\n    #[clap(long, required_unless_present = \"versions-toml\")]\n    github_release_tag: Option<String>,\n    /// Path to a `versions.toml` file with a `[release]` section to yank.\n    /// The `--github-release-tag` option is preferred to this, but this is provided as a fail safe.\n    #[clap(long, required_unless_present = \"github-release-tag\")]\n    versions_toml: Option<PathBuf>,\n    #[clap(arg_enum)]\n    crate_set: Option<CrateSet>,\n    /// Time delay between crate yanking to avoid crates.io throttling errors.\n    #[clap(long)]\n    delay_millis: Option<usize>,\n}\n\npub async fn subcommand_yank_release(\n    YankReleaseArgs {\n        github_release_tag,\n        versions_toml,\n        crate_set,\n        delay_millis,\n    }: &YankReleaseArgs,\n) -> Result<()> {\n    // Make sure cargo exists\n    cargo::confirm_installed_on_path()?;\n\n    // Retrieve information about the release to yank\n    let release = match (github_release_tag, versions_toml) {\n        (Some(release_tag), None) => acquire_release_from_tag(release_tag).await,\n        (None, Some(versions_toml)) => acquire_release_from_file(versions_toml),\n        _ => bail!(\"Only one of `--github-release-tag` or `--versions-toml` should be provided\"),\n    }\n    .context(\"failed to retrieve information about the release to yank\")?;\n\n    let tag = release\n        .tag\n        .as_ref()\n        .ok_or_else(|| {\n            anyhow!(\"Versions manifest doesn't have a release tag. Can only yank tagged releases.\")\n        })?\n        .clone();\n    let crates = filter_crates(crate_set.unwrap_or(CrateSet::All), release);\n    let _ = release;\n\n    // Don't proceed unless the user confirms the plan\n    confirm_plan(&tag, &crates)?;\n\n    let delay_millis = Duration::from_millis(delay_millis.unwrap_or(DEFAULT_DELAY_MILLIS) as _);\n\n    // Yank one crate at a time to try avoiding throttling errors\n    for (crate_name, crate_version) in crates {\n        yank(&crate_name, &crate_version).await?;\n\n        // Keep things slow to avoid getting throttled by crates.io\n        tokio::time::sleep(delay_millis).await;\n\n        info!(\"Successfully yanked `{}-{}`\", crate_name, crate_version);\n    }\n\n    Ok(())\n}\n\nfn filter_crates(crate_set: CrateSet, release: Release) -> BTreeMap<String, String> {\n    if crate_set == CrateSet::All {\n        return release.crates;\n    }\n\n    release\n        .crates\n        .into_iter()\n        .filter(|c| {\n            let category = PackageCategory::from_package_name(&c.0);\n            match crate_set {\n                CrateSet::All => unreachable!(),\n                CrateSet::AllAwsSdk => category.is_sdk(),\n                CrateSet::GeneratedAwsSdk => category == PackageCategory::AwsSdk,\n            }\n        })\n        .collect()\n}\n\nasync fn acquire_release_from_tag(tag: &str) -> Result<Release> {\n    let tag = ReleaseTag::from_str(tag).context(\"invalid release tag\")?;\n    let manifest = VersionsManifest::from_github_tag(&tag)\n        .await\n        .context(\"failed to get versions.toml from GitHub\")?;\n    release_metadata(manifest)\n}\n\nfn acquire_release_from_file(path: &Path) -> Result<Release> {\n    let parsed = VersionsManifest::from_file(path).context(\"failed to parse versions.toml file\")?;\n    release_metadata(parsed)\n}\n\nfn release_metadata(manifest: VersionsManifest) -> Result<Release> {\n    if let Some(release) = manifest.release {\n        Ok(release)\n    } else {\n        bail!(\"the versions.toml file didn't have a `[release]` section\");\n    }\n}\n\nfn confirm_plan(tag: &str, crates: &BTreeMap<String, String>) -> Result<()> {\n    info!(\"This will yank aws-sdk-rust's `{tag}` release from crates.io.\");\n    info!(\"Crates to yank:\");\n    for (crate_name, crate_version) in crates {\n        info!(\"   {}-{}\", crate_name, crate_version);\n    }\n\n    if Confirm::new()\n        .with_prompt(\n            \"Continuing will yank these crate versions from crates.io. Do you wish to continue?\",\n        )\n        .interact()?\n    {\n        Ok(())\n    } else {\n        bail!(\"aborted\")\n    }\n}\n"
  },
  {
    "path": "tools/ci-build/publisher/src/yank.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::cargo;\nuse smithy_rs_tool_common::retry::{run_with_retry, BoxError, ErrorClass};\nuse smithy_rs_tool_common::shell::ShellOperation;\nuse std::time::Duration;\nuse tracing::info;\n\n#[tracing::instrument]\npub async fn yank(crate_name: &str, crate_version: &str) -> anyhow::Result<()> {\n    info!(\"Yanking `{}-{}`...\", crate_name, crate_version);\n    run_with_retry(\n        &format!(\"Yanking `{crate_name}-{crate_version}`\"),\n        5,\n        Duration::from_secs(60),\n        || async {\n            cargo::Yank::new(crate_name, crate_version).spawn().await?;\n            Result::<_, BoxError>::Ok(())\n        },\n        |_err| ErrorClass::Retry,\n    )\n    .await?;\n    Ok(())\n}\n"
  },
  {
    "path": "tools/ci-build/publisher/tests/hydrate_readme_e2e_test.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse fs_err as fs;\nuse publisher::subcommand::hydrate_readme::{subcommand_hydrate_readme, HydrateReadmeArgs};\nuse smithy_rs_tool_common::package::PackageCategory;\nuse smithy_rs_tool_common::versions_manifest::{CrateVersion, VersionsManifest};\nuse tempfile::TempDir;\n\n#[test]\nfn test_hydrate_readme() {\n    let tmp_dir = TempDir::new().unwrap();\n\n    let versions_manifest_path = tmp_dir.path().join(\"versions.toml\");\n    VersionsManifest {\n        smithy_rs_revision: \"dontcare\".into(),\n        aws_doc_sdk_examples_revision: None,\n        manual_interventions: Default::default(),\n        crates: [\n            (\n                \"aws-config\".to_string(),\n                CrateVersion {\n                    category: PackageCategory::AwsRuntime,\n                    version: \"0.12.3\".into(),\n                    source_hash: \"dontcare\".into(),\n                    model_hash: None,\n                },\n            ),\n            (\n                \"aws-sdk-dynamodb\".to_string(),\n                CrateVersion {\n                    category: PackageCategory::AwsRuntime,\n                    version: \"0.14.5\".into(),\n                    source_hash: \"dontcare\".into(),\n                    model_hash: None,\n                },\n            ),\n        ]\n        .into_iter()\n        .collect(),\n        release: None,\n    }\n    .write_to_file(&versions_manifest_path)\n    .unwrap();\n\n    let input_path = tmp_dir.path().join(\"some-input.md.hb\");\n    fs::write(\n        &input_path,\n        \"{{!-- Not included --}}\\n\\\n            <!-- Included -->\\n\\\n            Some info about MSRV {{msrv}} here.\\n\\n\\\n            Some info about aws-sdk-dynamodb-{{sdk_version_aws_sdk_dynamodb}} here.\\n\\n\\\n            Something about aws-config-{{sdk_version_aws_config}} here.\\n\\n\",\n    )\n    .unwrap();\n\n    let output_path = tmp_dir.path().join(\"test-output.md\");\n    subcommand_hydrate_readme(&HydrateReadmeArgs {\n        versions_manifest: versions_manifest_path,\n        msrv: \"0.58.1\".into(),\n        input: input_path,\n        output: output_path.clone(),\n    })\n    .unwrap();\n\n    let output = fs::read_to_string(&output_path).unwrap();\n    pretty_assertions::assert_str_eq!(\n        \"<!-- Included -->\\n\\\n        Some info about MSRV 0.58.1 here.\\n\\n\\\n        Some info about aws-sdk-dynamodb-0.14.5 here.\\n\\n\\\n        Something about aws-config-0.12.3 here.\\n\\n\",\n        output\n    );\n}\n"
  },
  {
    "path": "tools/ci-build/runtime-versioner/Cargo.toml",
    "content": "[package]\nname = \"runtime-versioner\"\nversion = \"0.1.2\"\nauthors = [\"AWS Rust SDK Team <aws-sdk-rust@amazon.com>\"]\ndescription = \"Tool that manages runtime crate versions.\"\nedition = \"2021\"\nlicense = \"Apache-2.0\"\npublish = false\n\n[workspace]\n\n[profile.release]\n# prefer fast compile time over runtime performance\nopt-level = 0\n\n[dependencies]\nanyhow = \"1.0.75\"\ncamino = \"1.1.6\"\nclap = { version = \"4.4.11\", features = [\"derive\", \"env\"] }\ncrates-index = \"2.3.0\"\nindicatif = \"0.17.7\"\nreqwest = { version = \"0.11.22\", features = [\"blocking\"] }\nsmithy-rs-tool-common = { version = \"0.1\", path = \"../smithy-rs-tool-common\" }\ntempfile = \"3.16.0\"\ntoml = { version = \"0.5.8\", features = [\"preserve_order\"] }\ntracing = \"0.1.40\"\ntracing-subscriber = { version = \"0.3.18\", features = [\"env-filter\"] }\n# why both? cargo_toml can't write out to a file because of a toml_rs longstanding issue/bug\ncargo_toml = \"0.19.0\"\ntoml_edit = \"0.22\"\n\n[dev-dependencies]\ntest-common = { path = \"./test-common\" }\n"
  },
  {
    "path": "tools/ci-build/runtime-versioner/README.md",
    "content": "# runtime-versioner\nRuntime versioner serves two purposes:\n1. `audit` the runtime crates to ensure that if their contents have changed, the version number in the crate has been updated. This is run as part of pre-commit.\n2. `patch-runtime`: Used by `check-semver-hazards` (and manually) to test a specific set of runtime crates against the generated AWS SDK. This works by utilizing [Cargo's source patching](https://doc.rust-lang.org/cargo/reference/overriding-dependencies.html).\n"
  },
  {
    "path": "tools/ci-build/runtime-versioner/src/command/audit.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::{\n    repo::Repo,\n    tag::{previous_release_tag, release_tags},\n    util::utf8_path_buf,\n    Audit,\n};\nuse anyhow::{anyhow, bail, Context, Result};\nuse camino::{Utf8Path, Utf8PathBuf};\nuse smithy_rs_tool_common::{\n    command::sync::CommandExt, index::CratesIndex, package::PackageCategory,\n    release_tag::ReleaseTag,\n};\nuse std::{\n    collections::{BTreeMap, BTreeSet},\n    fs,\n    process::Command,\n};\n\npub fn audit(args: Audit) -> Result<()> {\n    let repo = Repo::new(args.smithy_rs_path.as_deref())?;\n    if !args.no_fetch {\n        // Make sure we have the latest release tags\n        fetch_smithy_rs_tags(&repo)?;\n    }\n\n    let release_tags = release_tags(&repo)?;\n    let previous_release_tag =\n        previous_release_tag(&repo, &release_tags, args.previous_release_tag.as_deref())?;\n    if release_tags.first() != Some(&previous_release_tag) {\n        tracing::warn!(\"there are newer releases since '{previous_release_tag}'. \\\n            Consider specifying a more recent release tag using the `--previous-release-tag` command-line argument or \\\n            the `SMITHY_RS_RUNTIME_VERSIONER_AUDIT_PREVIOUS_RELEASE_TAG` environment variable if audit fails.\");\n    }\n\n    let next_crates = discover_runtime_crates(&repo.root).context(\"next\")?;\n    let previous_crates = resolve_previous_crates(&repo, previous_release_tag.as_str())?;\n\n    let crates = augment_runtime_crates(previous_crates, next_crates, args.fake_crates_io_index)?;\n    let mut errors = Vec::new();\n    for rt_crate in crates {\n        if let Err(err) = audit_crate(&repo, &previous_release_tag, rt_crate) {\n            errors.push(err);\n        }\n    }\n    if errors.is_empty() {\n        println!(\"SUCCESS\");\n        Ok(())\n    } else {\n        for error in errors {\n            eprintln!(\"{error}\");\n        }\n        bail!(\"there are audit failures in the runtime crates\")\n    }\n}\n\nfn audit_crate(repo: &Repo, release_tag: &ReleaseTag, rt_crate: RuntimeCrate) -> Result<()> {\n    if rt_crate.changed_since_release(repo, release_tag)? {\n        // There is an edge case with the aws/rust-runtime crates due to the decoupled smithy-rs/SDK releases.\n        // After a smithy-rs release and before a SDK release, there is a period of time where the smithy-rs\n        // runtime crates are published to crates.io, but the SDK runtime crates are not.\n        //\n        // The way this manifests is that the crate's previous release version is now the same as the version\n        // number at HEAD, and the crate is not published.\n        let is_sdk_runtime_edge_case = PackageCategory::from_package_name(&rt_crate.name).is_sdk()\n            && rt_crate.previous_release_version.as_ref() == Some(&rt_crate.next_release_version)\n            && !rt_crate.next_version_is_published();\n        if is_sdk_runtime_edge_case {\n            tracing::info!(\"For '{}', detected that a new version of smithy-rs has been released, but that the SDK release hasn't caught up yet.\", rt_crate.name);\n        }\n\n        // If this version has never been published before, then we're good.\n        // (This tool doesn't check semver compatibility.)\n        if !rt_crate.next_version_is_published() && !is_sdk_runtime_edge_case {\n            if let Some(previous_version) = rt_crate.previous_release_version {\n                tracing::info!(\n                    \"'{}' changed and was version bumped from {previous_version} to {}\",\n                    rt_crate.name,\n                    rt_crate.next_release_version,\n                );\n            } else {\n                tracing::info!(\n                    \"'{}' is a new crate (or wasn't independently versioned before) and will publish at {}\",\n                    rt_crate.name,\n                    rt_crate.next_release_version,\n                );\n            }\n            Ok(())\n        } else if rt_crate.previous_release_version.as_ref() != Some(&rt_crate.next_release_version)\n        {\n            Err(anyhow!(\n                \"{crate_name} was changed and version bumped, but the new version \\\n                number ({version}) has already been published to crates.io. Choose a new \\\n                version number.\",\n                crate_name = rt_crate.name,\n                version = rt_crate.next_release_version,\n            ))\n        } else {\n            Err(anyhow!(\n                \"{crate_name} changed since {release_tag} and requires a version bump\",\n                crate_name = rt_crate.name\n            ))\n        }\n    } else {\n        // If it didn't change at all since last release, then we're good.\n        Ok(())\n    }\n}\n\nstruct RuntimeCrate {\n    name: String,\n    path: Utf8PathBuf,\n    previous_release_version: Option<String>,\n    next_release_version: String,\n    published_versions: Vec<String>,\n}\n\nimpl RuntimeCrate {\n    /// True if the runtime crate's next version exists in crates.io\n    fn next_version_is_published(&self) -> bool {\n        self.published_versions.contains(&self.next_release_version)\n    }\n\n    /// True if this runtime crate changed since the given release tag.\n    fn changed_since_release(&self, repo: &Repo, release_tag: &ReleaseTag) -> Result<bool> {\n        let status = repo\n            .git([\n                \"diff\",\n                \"--name-only\",\n                release_tag.as_str(),\n                self.path.as_str(),\n            ])\n            .output()\n            .with_context(|| format!(\"failed to git diff {}\", self.name))?;\n        let output = String::from_utf8(status.stdout)?;\n        // When run during a release, this file is replaced with it's actual contents.\n        // This breaks this git-based comparison and incorrectly requires a version bump.\n        // Temporary fix to allow the build to succeed.\n        let lines_to_ignore = &[\"aws-config/clippy.toml\", \"aws-config/Cargo.lock\"];\n        let changed_files = output\n            .lines()\n            .filter(|line| !lines_to_ignore.iter().any(|ignore| line.contains(ignore)))\n            .collect::<Vec<_>>();\n        Ok(!changed_files.is_empty())\n    }\n}\n\n/// Loads version information from crates.io and attaches it to the passed in runtime crates.\nfn augment_runtime_crates(\n    previous_crates: BTreeMap<String, DiscoveredCrate>,\n    next_crates: BTreeMap<String, DiscoveredCrate>,\n    fake_crates_io_index: Option<Utf8PathBuf>,\n) -> Result<Vec<RuntimeCrate>> {\n    let index = fake_crates_io_index\n        .map(CratesIndex::fake)\n        .map(Ok)\n        .unwrap_or_else(CratesIndex::real)?;\n    let all_keys: BTreeSet<_> = previous_crates.keys().chain(next_crates.keys()).collect();\n    let mut result = Vec::new();\n    for key in all_keys {\n        let previous_crate = previous_crates.get(key);\n        if let Some(next_crate) = next_crates.get(key) {\n            result.push(RuntimeCrate {\n                published_versions: index.published_versions(&next_crate.name)?,\n                name: next_crate.name.clone(),\n                previous_release_version: previous_crate.map(|c| c.version.clone()),\n                next_release_version: next_crate.version.clone(),\n                path: next_crate.path.clone(),\n            });\n        } else {\n            tracing::warn!(\"runtime crate '{key}' was removed and will not be published\");\n        }\n    }\n    Ok(result)\n}\n\nstruct DiscoveredCrate {\n    name: String,\n    version: String,\n    path: Utf8PathBuf,\n}\n\n/// Discovers runtime crates that are independently versioned.\n/// For now, that just means the ones that don't have the special version number `0.0.0-smithy-rs-head`.\n/// In the future, this can be simplified to just return all the runtime crates.\nfn discover_runtime_crates(repo_root: &Utf8Path) -> Result<BTreeMap<String, DiscoveredCrate>> {\n    const ROOT_PATHS: &[&str] = &[\"rust-runtime\", \"aws/rust-runtime\"];\n    let mut result = BTreeMap::new();\n    for &root in ROOT_PATHS {\n        let root = repo_root.join(root);\n        for entry in fs::read_dir(&root)\n            .context(root)\n            .context(\"failed to read dir\")?\n        {\n            let entry = entry.context(\"failed to read dir entry\")?;\n            if !entry.path().is_dir() {\n                continue;\n            }\n            let manifest_path = entry.path().join(\"Cargo.toml\");\n            if !manifest_path.exists() {\n                continue;\n            }\n            let manifest: toml::Value =\n                toml::from_slice(&fs::read(&manifest_path).context(\"failed to read manifest\")?)\n                    .context(\"failed to parse manifest\")?;\n            let publish = manifest[\"package\"]\n                .get(\"publish\")\n                .and_then(|p| p.as_bool())\n                .unwrap_or(true);\n            let version = manifest[\"package\"][\"version\"]\n                .as_str()\n                .expect(\"version is a string\");\n            if publish && version != \"0.0.0-smithy-rs-head\" {\n                let name: String = entry.path().file_name().unwrap().to_string_lossy().into();\n                result.insert(\n                    name.clone(),\n                    DiscoveredCrate {\n                        name,\n                        version: version.into(),\n                        path: utf8_path_buf(entry.path()),\n                    },\n                );\n            }\n        }\n    }\n    Ok(result)\n}\n\nfn resolve_previous_crates(\n    repo: &Repo,\n    previous_release_tag: &str,\n) -> Result<BTreeMap<String, DiscoveredCrate>> {\n    // We checkout to a temp path so that this can be run with a dirty working tree\n    // (for running in local development).\n    let tempdir = tempfile::tempdir()?;\n    let tempdir_path = Utf8Path::from_path(tempdir.path()).unwrap();\n    let clone_path = tempdir_path.join(\"smithy-rs\");\n    fs::create_dir_all(&clone_path).context(\"failed to create temp smithy-rs repo\")?;\n\n    checkout_runtimes_to(repo, previous_release_tag, &clone_path)\n        .context(\"resolve previous crates\")?;\n    discover_runtime_crates(&clone_path).context(\"resolve previous crates\")\n}\n\n/// Fetches the latest tags from smithy-rs origin.\nfn fetch_smithy_rs_tags(repo: &Repo) -> Result<()> {\n    let output = repo\n        .git([\"remote\", \"get-url\", \"origin\"])\n        .output()\n        .context(\"failed to verify origin git remote\")?;\n    let origin_url = String::from_utf8(output.stdout)\n        .expect(\"valid utf-8\")\n        .trim()\n        .to_string();\n    if ![\n        \"git@github.com:smithy-lang/smithy-rs.git\",\n        \"https://github.com/smithy-lang/smithy-rs.git\",\n    ]\n    .iter()\n    .any(|url| *url == origin_url)\n    {\n        bail!(\n            \"smithy-rs origin must be either 'git@github.com:smithy-lang/smithy-rs.git' or \\\n        'https://github.com/smithy-lang/smithy-rs.git' in order to get the latest release tags\"\n        );\n    }\n\n    repo.git([\"fetch\", \"--tags\", \"origin\"])\n        .expect_success_output(\"fetch tags\")?;\n    Ok(())\n}\n\nfn checkout_runtimes_to(repo: &Repo, revision: &str, into: impl AsRef<Utf8Path>) -> Result<()> {\n    Command::new(\"git\")\n        .arg(\"init\")\n        .current_dir(into.as_ref())\n        .expect_success_output(\"init\")?;\n    let tmp_repo = Repo::new(Some(into.as_ref()))?;\n    tmp_repo\n        .git([\"remote\", \"add\", \"origin\", repo.root.as_str()])\n        .expect_success_output(\"remote add origin\")?;\n    tmp_repo\n        .git([\"fetch\", \"origin\", revision, \"--depth\", \"1\"])\n        .expect_success_output(\"fetch revision\")?;\n    tmp_repo\n        .git([\"reset\", \"--hard\", \"FETCH_HEAD\"])\n        .expect_success_output(\"reset\")?;\n    Ok(())\n}\n"
  },
  {
    "path": "tools/ci-build/runtime-versioner/src/command/patch.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::{\n    repo::Repo,\n    tag::{previous_release_tag, release_tags},\n    PatchRuntime, PatchRuntimeWith,\n};\nuse anyhow::{bail, Context, Result};\nuse camino::Utf8PathBuf;\nuse cargo_toml::Manifest;\nuse indicatif::{ProgressBar, ProgressStyle};\nuse smithy_rs_tool_common::{command::sync::CommandExt, package::Package};\nuse std::{fs, time::Duration};\nuse toml_edit::{DocumentMut, Item};\n\npub fn patch(args: PatchRuntime) -> Result<()> {\n    let smithy_rs = step(\"Resolving smithy-rs\", || {\n        Repo::new(args.smithy_rs_path.as_deref())\n    })?;\n    if is_dirty(&smithy_rs)? {\n        bail!(\"smithy-rs has a dirty working tree. Aborting.\");\n    }\n\n    let aws_sdk_rust = step(\"Resolving aws-sdk-rust\", || Repo::new(Some(&args.sdk_path)))?;\n    if is_dirty(&aws_sdk_rust)? {\n        bail!(\"aws-sdk-rust has a dirty working tree. Aborting.\");\n    }\n\n    patch_with(PatchRuntimeWith {\n        sdk_path: args.sdk_path,\n        runtime_crate_path: vec![\n            smithy_rs.root.join(\"rust-runtime\"),\n            smithy_rs.root.join(\"aws/rust-runtime\"),\n        ],\n        previous_release_tag: args.previous_release_tag,\n        no_checkout_sdk_release: args.no_checkout_sdk_release,\n    })?;\n\n    Ok(())\n}\n\npub fn patch_with(args: PatchRuntimeWith) -> Result<()> {\n    let aws_sdk_rust = step(\"Resolving aws-sdk-rust\", || Repo::new(Some(&args.sdk_path)))?;\n    if is_dirty(&aws_sdk_rust)? {\n        bail!(\"aws-sdk-rust has a dirty working tree. Aborting.\");\n    }\n\n    if !args.no_checkout_sdk_release {\n        // Make sure the aws-sdk-rust repo is on the correct release tag\n        let release_tags = step(\"Resolving aws-sdk-rust release tags\", || {\n            release_tags(&aws_sdk_rust)\n        })?;\n        let previous_release_tag = step(\"Resolving release tag\", || {\n            previous_release_tag(\n                &aws_sdk_rust,\n                &release_tags,\n                args.previous_release_tag.as_deref(),\n            )\n        })?;\n        step(\"Checking out release tag\", || {\n            aws_sdk_rust\n                .git([\"checkout\", previous_release_tag.as_str()])\n                .expect_success_output(\"check out release tag in aws-sdk-rust\")\n        })?;\n    }\n\n    // Patch the new runtime crates into the old SDK\n    step(\"Applying version-only dependencies\", || {\n        apply_version_only_dependencies(&aws_sdk_rust)\n    })?;\n    step(\"Patching aws-sdk-rust root Cargo.toml\", || {\n        let crates_to_patch =\n            remove_unchanged_dependencies(&aws_sdk_rust, &args.runtime_crate_path)?;\n        patch_workspace_cargo_toml(&aws_sdk_rust, crates_to_patch)\n    })?;\n    step(\"Running cargo update\", || {\n        aws_sdk_rust\n            .cmd(\"cargo\", [\"update\"])\n            .expect_success_output(\"cargo update\")\n    })?;\n\n    Ok(())\n}\n\nfn apply_version_only_dependencies(aws_sdk_rust: &Repo) -> Result<()> {\n    aws_sdk_rust\n        .cmd(\n            \"sdk-versioner\",\n            [\n                \"use-version-dependencies\",\n                \"--versions-toml\",\n                \"versions.toml\",\n                \"sdk\",\n            ],\n        )\n        .expect_success_output(\"run sdk-versioner\")?;\n    Ok(())\n}\n\n/// Determine if a given crate has a new version vs. the release we're comparing\nfn crate_version_has_changed(runtime_crate: &Package, aws_sdk_rust: &Repo) -> Result<bool> {\n    let sdk_cargo_toml = aws_sdk_rust\n        .root\n        .join(\"sdk\")\n        .join(&runtime_crate.handle.name)\n        .join(\"Cargo.toml\");\n    let to_patch_cargo_toml = &runtime_crate.manifest_path;\n    if !sdk_cargo_toml.exists() {\n        tracing::trace!(\n            \"`{}` is a new crate, so there is nothing to patch.\",\n            runtime_crate.handle\n        );\n        // This is a new runtime crate, so there is nothing to patch.\n        return Ok(false);\n    }\n    assert!(\n        to_patch_cargo_toml.exists(),\n        \"{to_patch_cargo_toml:?} did not exist!\"\n    );\n    let sdk_cargo_toml = Manifest::from_path(&sdk_cargo_toml)\n        .context(\"could not parse SDK Cargo.toml\")\n        .context(sdk_cargo_toml)?;\n    let to_patch_toml = Manifest::from_path(to_patch_cargo_toml)\n        .context(\"could not parse Cargo.toml to patch\")\n        .with_context(|| to_patch_cargo_toml.display().to_string())?;\n    Ok(sdk_cargo_toml.package().version() != to_patch_toml.package().version())\n}\n\nfn patch_workspace_cargo_toml(\n    aws_sdk_rust: &Repo,\n    crates_to_patch: impl Iterator<Item = Package>,\n) -> Result<()> {\n    let patch_sections = crates_to_patch\n        .map(|runtime_crate| {\n            format!(\n                \"{} = {{ path = '{}' }}\",\n                runtime_crate.handle.name,\n                runtime_crate.crate_path.canonicalize().unwrap().display()\n            )\n        })\n        .collect::<Vec<_>>()\n        .join(\"\\n\");\n    let patch_section = format!(\"\\n[patch.crates-io]\\n{patch_sections}\");\n\n    let manifest_path = aws_sdk_rust.root.join(\"Cargo.toml\");\n    tracing::trace!(\"patching {manifest_path}\");\n    let mut manifest_content =\n        fs::read_to_string(&manifest_path).context(\"failed to read aws-sdk-rust/Cargo.toml\")?;\n    manifest_content.push_str(&patch_section);\n    fs::write(&manifest_path, &manifest_content)\n        .context(\"failed to write aws-sdk-rust/Cargo.toml\")?;\n    Ok(())\n}\n\n/// Removes Path dependencies referring to unchanged crates & returns a list of crates to patch\nfn remove_unchanged_dependencies(\n    aws_sdk_rust: &Repo,\n    runtime_crate_paths: &[Utf8PathBuf],\n) -> Result<impl Iterator<Item = Package>> {\n    let mut all_crates = Vec::new();\n    for runtime_crate_path in runtime_crate_paths {\n        let read_dir = fs::read_dir(runtime_crate_path).context(format!(\n            \"could list crates in directory {runtime_crate_path:?}\"\n        ))?;\n        for directory in read_dir {\n            let path = directory?.path();\n            if let Some(runtime_crate) = Package::try_load_path(path)? {\n                let name = &runtime_crate.handle.name;\n                if name.starts_with(\"aws-\") && name != \"aws-config\" {\n                    all_crates.push(runtime_crate);\n                }\n            }\n        }\n    }\n\n    let (crates_to_patch, unchanged_crates): (Vec<_>, Vec<_>) =\n        all_crates.clone().into_iter().partition(|runtime_crate| {\n            crate_version_has_changed(runtime_crate, aws_sdk_rust)\n                .expect(\"failed to determine change-status\")\n        });\n\n    let mut crates_to_patch = crates_to_patch;\n    for pkg in &all_crates {\n        if crate_is_new_and_used_by_existing_runtime(&crates_to_patch, pkg, aws_sdk_rust)\n            .expect(\"failed to determine crate status\")\n        {\n            tracing::trace!(\n                \"adding new crate `{}` to set of crates to be patched\",\n                pkg.handle\n            );\n            crates_to_patch.push(pkg.clone());\n        }\n    }\n\n    for patched_crate in &all_crates {\n        tracing::trace!(\n            \"removing unchanged path dependencies for {}\",\n            patched_crate.handle\n        );\n        remove_unchanged_path_dependencies(&unchanged_crates, patched_crate)?;\n    }\n    Ok(crates_to_patch.into_iter())\n}\n\n/// Check if a runtime crate is new and used by the new runtime.\n///\n/// This is an edge case where there is a new crate used by an existing runtime crate\n/// such that failure to patch in the new crate we'll get an error because the new\n/// crate won't be found. For these we need to add them to the list of crates to patch\n/// in the root SDK Cargo.toml.\nfn crate_is_new_and_used_by_existing_runtime(\n    crates_to_patch: &Vec<Package>,\n    runtime_crate: &Package,\n    aws_sdk_rust: &Repo,\n) -> Result<bool> {\n    let sdk_cargo_toml = aws_sdk_rust\n        .root\n        .join(\"sdk\")\n        .join(&runtime_crate.handle.name)\n        .join(\"Cargo.toml\");\n\n    if sdk_cargo_toml.exists() {\n        // existing runtime crate\n        return Ok(false);\n    }\n\n    // check if the new runtime crate is used by an existing crate that changed (i.e. is set to be patched)\n    for pkg in crates_to_patch {\n        let manifest = Manifest::from_path(pkg.manifest_path.clone())?;\n        let used = manifest\n            .dependencies\n            .iter()\n            .any(|(dep_name, dep_metadata)| {\n                runtime_crate.handle.name.as_str()\n                    == dep_metadata.package().unwrap_or(dep_name.as_str())\n            });\n        if used {\n            tracing::trace!(\n                \"`{}` is a new crate and used by crate set to be patched: `{}`.\",\n                runtime_crate.handle,\n                pkg.handle\n            );\n            return Ok(true);\n        }\n    }\n    Ok(false)\n}\n\n/// Remove `path = ...` from the dependency section for unchanged crates,\n/// and add version numbers for those where necessary.\n///\n/// If we leave these path dependencies in, we'll get an error when we try to patch because the\n/// version numbers are the same.\nfn remove_unchanged_path_dependencies(\n    unchanged_crates: &[Package],\n    patched_crate: &Package,\n) -> Result<()> {\n    let manifest_path = &patched_crate.manifest_path;\n    let manifest = Manifest::from_path(manifest_path)?;\n    let mut mutable_manifest = fs::read_to_string(manifest_path)\n        .context(\"failed to read file\")\n        .with_context(|| manifest_path.display().to_string())?\n        .parse::<DocumentMut>()\n        .context(\"invalid toml in manifest!\")?;\n    let mut updates = false;\n    let sections = [\n        (manifest.dependencies, \"dependencies\"),\n        (manifest.dev_dependencies, \"dev-dependencies\"),\n    ];\n    for (deps_set, key) in sections {\n        for (dependency_name, dependency_metadata) in deps_set.iter() {\n            let runtime_crate = unchanged_crates.iter().find(|rt_crate| {\n                rt_crate.handle.name.as_str()\n                    == dependency_metadata\n                        .package()\n                        .unwrap_or(dependency_name.as_str())\n            });\n            if let Some(runtime_crate) = runtime_crate {\n                let it = &mut mutable_manifest[key][dependency_name];\n                match it.as_table_like_mut() {\n                    Some(table_like) => {\n                        table_like.remove(\"path\");\n                        if !table_like.contains_key(\"version\") {\n                            table_like.insert(\n                                \"version\",\n                                Item::Value(runtime_crate.handle.expect_version().to_string().into()),\n                            );\n                        }\n                    }\n                    None => panic!(\n                        \"crate `{}` depends on crate `{dependency_name}` crate by version instead \\\n                        of by path. Please update it to use path dependencies for all runtime crates.\",\n                        patched_crate.handle\n                    )\n                };\n                updates = true\n            }\n        }\n    }\n    if updates {\n        fs::write(manifest_path, mutable_manifest.to_string())\n            .context(\"failed to write back manifest\")?\n    }\n    Ok(())\n}\n\nfn is_dirty(repo: &Repo) -> Result<bool> {\n    let result = repo\n        .git([\"status\", \"--porcelain\"])\n        .expect_success_output(\"git status\")?;\n    Ok(!result.trim().is_empty())\n}\n\nfn step<T>(message: &'static str, step: impl FnOnce() -> Result<T>) -> Result<T> {\n    let spinner = ProgressBar::new_spinner()\n        .with_message(message)\n        .with_style(ProgressStyle::with_template(\"{spinner} {msg} {elapsed}\").unwrap());\n    spinner.enable_steady_tick(Duration::from_millis(100));\n    let result = step();\n    let check = match &result {\n        Ok(_) => \"✅\",\n        Err(_) => \"❌\",\n    };\n    spinner.set_style(ProgressStyle::with_template(\"{msg} {elapsed}\").unwrap());\n    spinner.finish_with_message(format!(\"{check} {message}\"));\n    result\n}\n"
  },
  {
    "path": "tools/ci-build/runtime-versioner/src/main.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::{\n    repo::Repo,\n    tag::{previous_release_tag, release_tags},\n};\nuse anyhow::Result;\nuse camino::Utf8PathBuf;\nuse clap::Parser;\nuse tracing_subscriber::{filter::LevelFilter, EnvFilter};\n\nmod command {\n    mod audit;\n    pub use audit::audit;\n\n    mod patch;\n    pub use patch::{patch, patch_with};\n}\n\nmod repo;\nmod tag;\nmod util;\n\n#[derive(clap::Args, Clone)]\npub struct Audit {\n    /// Don't `git fetch` before auditing.\n    #[arg(long)]\n    no_fetch: bool,\n    /// Explicitly state the previous release's tag. Discovers it if not provided.\n    #[arg(long, env = \"SMITHY_RS_RUNTIME_VERSIONER_AUDIT_PREVIOUS_RELEASE_TAG\")]\n    previous_release_tag: Option<String>,\n    /// Path to smithy-rs. Defaults to current working directory.\n    #[arg(long)]\n    smithy_rs_path: Option<Utf8PathBuf>,\n    /// (For testing) Path to a fake crates.io index.\n    #[arg(long)]\n    fake_crates_io_index: Option<Utf8PathBuf>,\n}\n\n#[derive(clap::Args, Clone)]\npub struct PreviousReleaseTag {\n    /// Path to smithy-rs. Defaults to current working directory.\n    #[arg(long)]\n    smithy_rs_path: Option<Utf8PathBuf>,\n}\n\n#[derive(clap::Args, Clone)]\npub struct PatchRuntime {\n    /// Path to aws-sdk-rust.\n    #[arg(long)]\n    sdk_path: Utf8PathBuf,\n    /// Path to smithy-rs. Defaults to current working directory.\n    #[arg(long)]\n    smithy_rs_path: Option<Utf8PathBuf>,\n    /// Explicitly state the previous release's tag. Discovers it if not provided.\n    #[arg(long)]\n    previous_release_tag: Option<String>,\n    /// Disable checking out the release tag in the SDK repo.\n    ///\n    /// This is useful if you need to test changes in runtime crates against\n    /// local changes in the SDK.\n    #[arg(long)]\n    no_checkout_sdk_release: bool,\n\n    /// Version number for stable crates.\n    ///\n    /// Deprecated: this argument is ignored\n    #[arg(long)]\n    stable_crate_version: Option<String>,\n    /// Version number for unstable crates.\n    ///\n    /// Deprecated: this argument is ignored\n    #[arg(long)]\n    unstable_crate_version: Option<String>,\n}\n\n#[derive(clap::Args, Clone)]\npub struct PatchRuntimeWith {\n    /// Path to aws-sdk-rust.\n    #[arg(long)]\n    sdk_path: Utf8PathBuf,\n    /// Path(s) to runtime crates to patch in.\n    ///\n    /// Multiple paths can be passed in, for example, if patching SDK and Smithy\n    /// runtime crates that are in different directories.\n    ///\n    /// Note: this doesn't need to be a complete set of runtime crates. It will\n    /// only patch the crates included in the provided path.\n    #[arg(long)]\n    runtime_crate_path: Vec<Utf8PathBuf>,\n    /// Explicitly state the previous release's tag. Discovers it if not provided.\n    #[arg(long)]\n    previous_release_tag: Option<String>,\n    /// Disable checking out the release tag in the SDK repo.\n    ///\n    /// This is useful if you need to test changes in runtime crates against\n    /// local changes in the SDK.\n    #[arg(long)]\n    no_checkout_sdk_release: bool,\n}\n\n#[derive(clap::Parser, Clone)]\n#[clap(author, version, about)]\nenum Command {\n    /// Audit the runtime crate versions in the smithy-rs repo at HEAD\n    ///\n    /// Requires a full clone of smithy-rs. Will not work against shallow clones.\n    ///\n    /// This audits that any runtime crate that has been changed since the last\n    /// release has been version bumped. It's not smart enough to know if the version\n    /// bump is correct in semver terms, but verifies that there was at least a\n    /// bump. A human will still need to verify the semver correctness of that bump.\n    Audit(Audit),\n\n    /// Outputs the previous release tag for the revision at HEAD.\n    PreviousReleaseTag(PreviousReleaseTag),\n\n    /// Patch a previous SDK release with the latest to-be-released runtime crates.\n    ///\n    /// This will generate a runtime with the given smithy-rs repo.\n    PatchRuntime(PatchRuntime),\n\n    /// Patch a previous SDK release with a given runtime.\n    ///\n    /// This will use an existing runtime at the path provided. For example,\n    /// if you want to try a runtime from a GitHub Actions workflow.\n    PatchRuntimeWith(PatchRuntimeWith),\n}\n\nfn main() -> Result<()> {\n    tracing_subscriber::fmt()\n        .with_writer(std::io::stderr)\n        .with_env_filter(\n            EnvFilter::builder()\n                .with_default_directive(LevelFilter::INFO.into())\n                .from_env_lossy(),\n        )\n        .init();\n\n    let command = Command::parse();\n    match command {\n        Command::Audit(args) => command::audit(args),\n        Command::PreviousReleaseTag(args) => {\n            let repo = Repo::new(args.smithy_rs_path.as_deref())?;\n            let tags = release_tags(&repo)?;\n            let tag = previous_release_tag(&repo, &tags, None)?;\n            println!(\"{tag}\");\n            Ok(())\n        }\n        Command::PatchRuntime(args) => command::patch(args),\n        Command::PatchRuntimeWith(args) => command::patch_with(args),\n    }\n}\n"
  },
  {
    "path": "tools/ci-build/runtime-versioner/src/repo.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::util::utf8_path_buf;\nuse anyhow::{Context, Result};\nuse camino::{Utf8Path, Utf8PathBuf};\nuse smithy_rs_tool_common::git::find_git_repository_root;\nuse std::{env, ffi::OsStr, process::Command};\n\n/// Git repository\npub struct Repo {\n    pub root: Utf8PathBuf,\n}\n\nimpl Repo {\n    pub fn new(maybe_root: Option<&Utf8Path>) -> Result<Self> {\n        Ok(Self {\n            root: repo_root(maybe_root)?,\n        })\n    }\n\n    /// Returns a `std::process::Command` set to run git in this repo with the given args\n    pub fn git<I, S>(&self, args: I) -> Command\n    where\n        I: IntoIterator<Item = S>,\n        S: AsRef<OsStr>,\n    {\n        self.cmd(\"git\", args)\n    }\n\n    /// Returns a `std::process::Command` set to run a shell command in this repo with the given args\n    pub fn cmd<I, S>(&self, cmd: &str, args: I) -> Command\n    where\n        I: IntoIterator<Item = S>,\n        S: AsRef<OsStr>,\n    {\n        let mut cmd = Command::new(cmd);\n        cmd.current_dir(&self.root);\n        cmd.args(args);\n        cmd\n    }\n}\n\nfn repo_root(hint: Option<&Utf8Path>) -> Result<Utf8PathBuf> {\n    let cwd = utf8_path_buf(env::current_dir().context(\"failed to get current working directory\")?);\n    Ok(utf8_path_buf(find_git_repository_root(\n        \"smithy-rs\",\n        hint.unwrap_or(&cwd),\n    )?))\n}\n"
  },
  {
    "path": "tools/ci-build/runtime-versioner/src/tag.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::repo::Repo;\nuse anyhow::{anyhow, bail, Context, Result};\nuse smithy_rs_tool_common::{command::sync::CommandExt, release_tag::ReleaseTag};\nuse std::str::FromStr;\nuse tracing::warn;\n\n/// Discovers and returns the tag of the previous release for the revision at HEAD.\npub fn previous_release_tag(\n    repo: &Repo,\n    release_tags: &[ReleaseTag],\n    release_tag_override: Option<&str>,\n) -> Result<ReleaseTag> {\n    let ancestor_tag = ancestor_tag(repo)?;\n    let tag_override = release_tag_override\n        .map(ReleaseTag::from_str)\n        .transpose()\n        .context(\"invalid release tag given\")?;\n    if let Some(tag_override) = tag_override {\n        if !release_tags.contains(&tag_override) {\n            bail!(\"specified tag '{tag_override}' doesn't exist\");\n        }\n        let previous_release_commit = commit_for_tag(repo, &ancestor_tag)?;\n        let previous_release_override_commit = commit_for_tag(repo, &tag_override)?;\n        // The first guard says that whenever we override a previous release tag, `HEAD` of our branch\n        // should be ahead of that override.\n        // The second guard handles a case where our branch is now behind w.r.t the latest smithy-rs\n        // release. This can happen when we `git merge main` into the branch, but the main branch\n        // now contains a new smithy-rs release that the `HEAD` of the branch doesn't know about.\n        // In that case, we want to teach the tool that the previous release should now be the new\n        // release. However, specifying the new release for `previous_release_override_commit` fails\n        // with the first guard because `HEAD` doesn't know about the new release. The second guard\n        // provides an escape hatch where if `previous_release_commit` (the latest release currently\n        // `HEAD` does know about) is the ancestor to the specified previous release override, then\n        // we can now treat the previous release override as a legitimate previous release.\n        if !is_ancestor(repo, &previous_release_override_commit, \"HEAD\")?\n            && !is_ancestor(\n                repo,\n                &previous_release_commit,\n                &previous_release_override_commit,\n            )?\n        {\n            bail!(\"specified tag '{tag_override}' is neither the ancestor of HEAD nor a descendant of {ancestor_tag}\");\n        }\n        if tag_override != ancestor_tag {\n            warn!(\n                \"expected previous release to be '{ancestor_tag}', \\\n                 but '{tag_override}' was specified. Proceeding with '{tag_override}'.\",\n            );\n        }\n        Ok(tag_override)\n    } else {\n        Ok(ancestor_tag)\n    }\n}\n\nfn ancestor_tag(repo: &Repo) -> Result<ReleaseTag> {\n    let tag = repo\n        .git([\"describe\", \"--tags\"])\n        .expect_success_output(\"find the current ancestor release tag\")?;\n    let tag = tag.trim();\n    let maybe_release_tag = ReleaseTag::from_str(tag);\n    let release_tag = match maybe_release_tag {\n        Ok(tag) => Some(tag),\n        Err(_) => strip_describe_tags_suffix(tag)\n            .map(ReleaseTag::from_str)\n            .transpose()\n            .context(\"failed to find ancestor release tag\")?,\n    };\n    release_tag.ok_or_else(|| anyhow!(\"failed to find ancestor release tag\"))\n}\n\n// `git describe --tags` appends a suffix if the current commit is not the tagged commit\n//\n// Function assumes the given tag is known to be suffixed.\nfn strip_describe_tags_suffix(tag: &str) -> Option<&str> {\n    // Example release tag with suffix: release-2023-12-01-42-g885048e40\n    tag.rsplitn(3, '-').nth(2)\n}\n\n/// Returns all release tags for the repo in descending order by time.\npub fn release_tags(repo: &Repo) -> Result<Vec<ReleaseTag>> {\n    let mut tags: Vec<_> = repo\n        .git([\"tag\"])\n        .expect_success_output(\"find the current ancestor release tag\")?\n        .lines()\n        .flat_map(|tag| match ReleaseTag::from_str(tag) {\n            Ok(tag) => Some(tag),\n            Err(_) => {\n                if !tag.starts_with(\"v0.\") {\n                    warn!(\"ignoring tag '{tag}': doesn't look like a release tag\");\n                }\n                None\n            }\n        })\n        .collect();\n    tags.sort_by(|a, b| b.cmp(a));\n    Ok(tags)\n}\n\n/// True if the given `ancestor_commit` is an ancestor to `descendant_commit`\nfn is_ancestor(repo: &Repo, ancestor_commit: &str, descendant_commit: &str) -> Result<bool> {\n    let status = repo\n        .git([\n            \"merge-base\",\n            \"--is-ancestor\",\n            ancestor_commit,\n            descendant_commit,\n        ])\n        .expect_status_one_of(\n            \"determine if {ancestor_commit} is the ancestor to {descendant_commit}\",\n            [0, 1],\n        )?;\n    Ok(status == 0)\n}\n\n/// Returns the commit hash for the given tag\nfn commit_for_tag(repo: &Repo, tag: &ReleaseTag) -> Result<String> {\n    repo.git([\"rev-list\", \"-n1\", tag.as_str()])\n        .expect_success_output(\"retrieve commit hash for tag\")\n        .map(|result| result.trim().to_string())\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n\n    #[test]\n    fn strip_git_describe_tags_suffix() {\n        assert_eq!(\n            Some(\"release-2023-12-01\"),\n            strip_describe_tags_suffix(\"release-2023-12-01-42-g885048e40\")\n        );\n        assert_eq!(\n            Some(\"release-2023-12-01\"),\n            strip_describe_tags_suffix(\"release-2023-12-01-2-g885048e40\")\n        );\n        assert_eq!(\n            Some(\"release-2023-12-01\"),\n            strip_describe_tags_suffix(\"release-2023-12-01-123-g885048e40\")\n        );\n        assert_eq!(None, strip_describe_tags_suffix(\"invalid\"));\n    }\n}\n"
  },
  {
    "path": "tools/ci-build/runtime-versioner/src/util.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse anyhow::Context;\nuse camino::{Utf8Path, Utf8PathBuf};\nuse std::path::Path;\n\npub fn utf8_path_buf(path: impl AsRef<Path>) -> Utf8PathBuf {\n    let path: &Path = path.as_ref();\n    <&Utf8Path>::try_from(path)\n        .with_context(|| format!(\"gross path_buf: {path:?}\"))\n        .unwrap()\n        .into()\n}\n"
  },
  {
    "path": "tools/ci-build/runtime-versioner/test-common/Cargo.toml",
    "content": "[package]\nname = \"test-common\"\nversion = \"0.1.0\"\nedition = \"2021\"\npublish = false\n\n[dependencies]\ncamino = \"1.1.6\"\ntempfile = \"3.16.0\"\ntest_bin = \"0.4.0\"\nwhoami = \"1.5.1\"\n"
  },
  {
    "path": "tools/ci-build/runtime-versioner/test-common/src/lib.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse camino::{Utf8Path, Utf8PathBuf};\nuse std::process::Command;\nuse tempfile::TempDir;\n\n#[derive(Debug)]\npub struct VersionerOutput {\n    pub status: i32,\n    pub stdout: String,\n    pub stderr: String,\n}\n\npub struct TestBase {\n    _tmp: TempDir,\n    pub test_data: Utf8PathBuf,\n    pub root: Utf8PathBuf,\n}\n\nimpl TestBase {\n    pub fn new(branch_name: &str) -> Self {\n        let tmp = TempDir::new().unwrap();\n        let root = Utf8PathBuf::try_from(tmp.path().join(\"test_base\")).unwrap();\n\n        let test_data =\n            Utf8PathBuf::try_from(std::env::current_dir().unwrap().join(\"test_data\")).unwrap();\n        let tar_path = test_data.join(\"test_base.git.tar.gz\");\n        assert!(\n            Command::new(\"tar\")\n                .args([\"xfz\", tar_path.as_str()])\n                .current_dir(tmp.path())\n                .status()\n                .unwrap()\n                .success(),\n            \"untarring the test_base into the temp directory failed\"\n        );\n        // ensure unpacked file has the current user assigned to the owner,\n        // otherwise we could get the `fatal: detected dubious ownership in repository` error\n        let test_repo = Utf8PathBuf::try_from(tmp.path().join(\"test_base.git\")).unwrap();\n        assert!(\n            Command::new(\"chown\")\n                .args(&[&format!(\"{}\", whoami::username()), test_repo.as_str(),])\n                .current_dir(tmp.path())\n                .status()\n                .unwrap()\n                .success(),\n            \"setting the owner of `test_base.git` to the current user failed\"\n        );\n        assert!(\n            Command::new(\"git\")\n                .args([\"clone\", \"test_base.git\"])\n                .current_dir(tmp.path())\n                .status()\n                .unwrap()\n                .success(),\n            \"cloning the test_base repo failed\"\n        );\n        assert!(root.exists(), \"test_base not found after cloning\");\n        change_branch(&root, branch_name);\n\n        Self {\n            _tmp: tmp,\n            test_data,\n            root,\n        }\n    }\n\n    pub fn change_branch(&self, branch_name: &str) {\n        change_branch(&self.root, branch_name);\n    }\n\n    pub fn run_versioner(&self, args: &[&str], expect_failure: bool) -> VersionerOutput {\n        let mut cmd = test_bin::get_test_bin(\"runtime-versioner\");\n        let cmd = cmd.args(args).current_dir(&self.root);\n        let output = cmd.output().expect(\"failed to execute runtime-versioner\");\n        let status = output.status.code().unwrap();\n        let stdout = String::from_utf8_lossy(&output.stdout);\n        let stderr = String::from_utf8_lossy(&output.stderr);\n        println!(\"###\\ncmd: {cmd:?}\\nstatus: {status}\\nstdout:\\n{stdout}\\nstderr:\\n{stderr}\\n\\n\");\n        if expect_failure {\n            assert!(\n                !output.status.success(),\n                \"expected runtime-versioner to fail, but it succeeded\"\n            );\n        } else {\n            assert!(\n                output.status.success(),\n                \"expected runtime-versioner to succeed, but it failed\"\n            );\n        }\n        VersionerOutput {\n            status,\n            stdout: stdout.into(),\n            stderr: stderr.into(),\n        }\n    }\n}\n\nfn change_branch(path: &Utf8Path, branch_name: &str) {\n    assert!(\n        Command::new(\"git\")\n            .args([\"checkout\", branch_name])\n            .current_dir(path)\n            .status()\n            .unwrap()\n            .success(),\n        \"changing to the correct test_base branch failed\"\n    );\n}\n"
  },
  {
    "path": "tools/ci-build/runtime-versioner/test_data/.gitignore",
    "content": "/test_base.git/\n/test_base/"
  },
  {
    "path": "tools/ci-build/runtime-versioner/test_data/Makefile",
    "content": "all:\n\techo \"Use the pack/unpack targets.\"\n\n# Unpacks test_base.git.tar.gz\n#\n# Note: doesn't directly clone the bare repository into a working tree,\n# or otherwise it would lose all the different branches.\nunpack:\n\trm -rf test_base\n\tmkdir -p test_base\n\ttar xfz test_base.git.tar.gz\n\tmv test_base.git test_base/.git\n\t(cd test_base && git config --unset core.bare)\n\t(cd test_base && git reset --hard)\n\n# Packs test_base.git.tar.gz\npack:\n\tgit clone --bare test_base\n\ttar cfz test_base.git.tar.gz test_base.git\n\trm -rf test_base.git\n\n.PHONY: all"
  },
  {
    "path": "tools/ci-build/runtime-versioner/test_data/README.md",
    "content": "Test base archive\n=================\n\nThe `test_base.git.tar.gz` is an archived test git repository that looks like a \nsmithy-rs repo (with only the runtime crates), with some version numbers and \nrelease tags.\n\nIt is a bare git repository (no working tree). To modify it, use the Makefile in\nthis directory to unpack it with `make unpack`. This will create a test_base directory\nin test_data where you can make any changes you need to the repo. Then running\n`make pack` will convert that modified repository back into the archive.\n\nWhen making new test cases that need some extensive setup, it's best to create\na test-case specific branch in the test base."
  },
  {
    "path": "tools/ci-build/runtime-versioner/test_data/already_published_version.toml",
    "content": "[crates]\naws-config = [\"1.0.0\"]\naws-endpoint = [\"0.60.0\"]\naws-http = [\"0.60.0\"]\naws-hyper = [\"0.60.0\"]\naws-runtime = [\"1.0.0\"]\naws-runtime-api = [\"1.0.0\"]\naws-sig-auth = [\"0.60.0\"]\naws-sigv4 = [\"1.0.0\"]\naws-smithy-async = [\"1.0.1\"] # Oh no, aws-smithy-async already has 1.0.1 published!\naws-smithy-checksums = [\"0.60.0\"]\naws-smithy-client = [\"0.60.0\"]\naws-smithy-eventstream = [\"0.60.0\"]\naws-smithy-http = [\"0.60.0\"]\naws-smithy-http-auth = [\"0.60.0\"]\naws-smithy-http-server = [\"0.60.0\"]\naws-smithy-http-server-python = [\"0.60.0\"]\naws-smithy-http-server-typescript = [\"0.60.0\"]\naws-smithy-http-tower = [\"0.60.0\"]\naws-smithy-json = [\"0.60.0\"]\naws-smithy-protocol-test = [\"0.60.0\"]\naws-smithy-query = [\"0.60.0\"]\naws-smithy-runtime = [\"1.0.0\"]\naws-smithy-runtime-api = [\"1.0.0\"]\naws-smithy-types = [\"1.0.0\"]\naws-smithy-types-convert = [\"0.60.0\"]\naws-smithy-xml = [\"0.60.0\"]\naws-types = [\"1.0.0\"]\n"
  },
  {
    "path": "tools/ci-build/runtime-versioner/test_data/base_crates_io_index.toml",
    "content": "[crates]\naws-config = [\"1.0.0\"]\naws-endpoint = [\"0.60.0\"]\naws-http = [\"0.60.0\"]\naws-hyper = [\"0.60.0\"]\naws-runtime = [\"1.0.0\"]\naws-runtime-api = [\"1.0.0\"]\naws-sig-auth = [\"0.60.0\"]\naws-sigv4 = [\"1.0.0\"]\naws-smithy-async = [\"1.0.0\"]\naws-smithy-checksums = [\"0.60.0\"]\naws-smithy-client = [\"0.60.0\"]\naws-smithy-eventstream = [\"0.60.0\"]\naws-smithy-http = [\"0.60.0\"]\naws-smithy-http-auth = [\"0.60.0\"]\naws-smithy-http-server = [\"0.60.0\"]\naws-smithy-http-server-python = [\"0.60.0\"]\naws-smithy-http-server-typescript = [\"0.60.0\"]\naws-smithy-http-tower = [\"0.60.0\"]\naws-smithy-json = [\"0.60.0\"]\naws-smithy-protocol-test = [\"0.60.0\"]\naws-smithy-query = [\"0.60.0\"]\naws-smithy-runtime = [\"1.0.0\"]\naws-smithy-runtime-api = [\"1.0.0\"]\naws-smithy-types = [\"1.0.0\"]\naws-smithy-types-convert = [\"0.60.0\"]\naws-smithy-xml = [\"0.60.0\"]\naws-types = [\"1.0.0\"]\n"
  },
  {
    "path": "tools/ci-build/runtime-versioner/tests/test_audit.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse test_common::{TestBase, VersionerOutput};\n\nfn run_audit(test_base: &TestBase, index_name: &str, expect_failure: bool) -> VersionerOutput {\n    test_base.run_versioner(\n        &[\n            \"audit\",\n            \"--no-fetch\",\n            \"--fake-crates-io-index\",\n            test_base.test_data.join(index_name).as_str(),\n        ],\n        expect_failure,\n    )\n}\n\n/// Test that the audit passes when all the runtime crates are at the\n/// special `0.0.0-smithy-rs-head` version, indicating not to use\n/// independent crate versions.\n#[test]\nfn all_smithy_rs_head() {\n    let test_base = TestBase::new(\"all_smithy_rs_head\");\n    let result = run_audit(&test_base, \"base_crates_io_index.toml\", false);\n    assert!(result.stdout.contains(\"SUCCESS\"));\n}\n\n/// Changing an independently versioned runtime crate and version bumping\n/// it to a version that's never been published before succeeds.\n#[test]\nfn change_crate_with_bump() {\n    let test_base = TestBase::new(\"change_crate_with_bump\");\n    let result = run_audit(&test_base, \"base_crates_io_index.toml\", false);\n    assert!(result.stdout.contains(\"SUCCESS\"));\n}\n\n/// Changing an independently versioned runtime crate and version bumping\n/// it to a version that's been published before (oops!) fails the audit.\n#[test]\nfn change_crate_with_bump_to_already_published_version() {\n    let test_base = TestBase::new(\"change_crate_with_bump\");\n    let result = run_audit(&test_base, \"already_published_version.toml\", true);\n    assert!(result.stderr.contains(\n        \"aws-smithy-async was changed and version bumped, \\\n        but the new version number (1.0.1) has already been \\\n        published to crates.io\",\n    ));\n}\n\n/// Changing an independent runtime crate without version bumping it fails the audit.\n#[test]\nfn change_crate_without_bump() {\n    let test_base = TestBase::new(\"change_crate_without_bump\");\n    let result = run_audit(&test_base, \"base_crates_io_index.toml\", true);\n    assert!(result\n        .stderr\n        .contains(\"aws-smithy-async changed since release-2023-10-02 and requires a version bump\"));\n}\n\n/// Adding a new crate that's never been published before passes audit.\n#[test]\nfn add_new_crate() {\n    let test_base = TestBase::new(\"add_new_crate\");\n    let result = run_audit(&test_base, \"base_crates_io_index.toml\", false);\n    assert!(result.stderr.contains(\"'aws-smithy-newcrate' is a new crate (or wasn't independently versioned before) and will publish at 1.0.0\"));\n    assert!(result.stdout.contains(\"SUCCESS\"));\n}\n\n/// Removing an old crate that's been published before passes audit.\n#[test]\nfn remove_old_crate() {\n    let test_base = TestBase::new(\"remove_old_crate\");\n    let result = run_audit(&test_base, \"base_crates_io_index.toml\", false);\n    assert!(result\n        .stderr\n        .contains(\"runtime crate 'aws-smithy-http' was removed and will not be published\"));\n    assert!(result.stdout.contains(\"SUCCESS\"));\n}\n"
  },
  {
    "path": "tools/ci-build/runtime-versioner/tests/test_previous_release_tag.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse test_common::TestBase;\n\n#[test]\nfn previous_release_tag() {\n    let test_base = TestBase::new(\"all_smithy_rs_head\");\n    assert_eq!(\n        \"release-2023-10-01\\n\",\n        test_base\n            .run_versioner(&[\"previous-release-tag\"], false)\n            .stdout\n    );\n\n    test_base.change_branch(\"change_crate_with_bump\");\n    assert_eq!(\n        \"release-2023-10-02\\n\",\n        test_base\n            .run_versioner(&[\"previous-release-tag\"], false)\n            .stdout\n    );\n}\n"
  },
  {
    "path": "tools/ci-build/sanity-test",
    "content": "#!/bin/bash\n#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\n\nset -eux\n\ncargo --version\nchangelogger --version\ncrate-hasher --version\ndifftags --version\ngit --version\njava --version\npublisher --version\npython3 --version\nrustc +\"${RUST_NIGHTLY_VERSION}\" --version\nrustc --version\nsdk-versioner --version\ncargo semver-checks --version\nmdbook --version\n"
  },
  {
    "path": "tools/ci-build/sdk-lints/Cargo.toml",
    "content": "[package]\nname = \"sdk-lints\"\nversion = \"0.1.1\"\nedition = \"2021\"\npublish = false\n\n# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html\n\n[profile.release]\n# prefer fast compile time over runtime performance\nopt-level = 0\n\n[dependencies]\nanyhow = \"1\"\ncargo_toml = \"0.18.0\"\nclap = { version = \"~3.1.18\", features = [\"derive\"]}\nlazy_static = \"1.4.0\"\nserde = { version = \"1\", features = [\"derive\"]}\nsmithy-rs-tool-common = { path = \"../smithy-rs-tool-common\" }\ntoml = \"0.5.8\"\n"
  },
  {
    "path": "tools/ci-build/sdk-lints/README.md",
    "content": "# sdk-lints\nCustom lints and fixes for sdk crates. These are run as part of `pre-commit` and during CI.\n"
  },
  {
    "path": "tools/ci-build/sdk-lints/src/anchor.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse anyhow::bail;\n\npub fn anchors(name: &str) -> (String, String) {\n    (\n        format!(\"{ANCHOR_START}{name} -->\"),\n        format!(\"{ANCHOR_END}{name} -->\"),\n    )\n}\n\nconst ANCHOR_START: &str = \"<!-- anchor_start:\";\nconst ANCHOR_END: &str = \"<!-- anchor_end:\";\n\npub fn replace_anchor(\n    haystack: &mut String,\n    anchors: &(impl AsRef<str>, impl AsRef<str>),\n    new_content: &str,\n    default_insertion_position: Option<usize>,\n) -> anyhow::Result<bool> {\n    let anchor_start = anchors.0.as_ref();\n    let anchor_end = anchors.1.as_ref();\n    let start = haystack.find(anchor_start);\n    if start.is_none() {\n        if haystack.contains(anchor_end) {\n            bail!(\"found end anchor but no start anchor\");\n        }\n\n        let (prefix, suffix) = match default_insertion_position {\n            Some(position) => haystack.split_at(position),\n            None => (haystack.as_ref(), \"\"),\n        };\n        let mut out = String::new();\n        out.push_str(prefix);\n        out.push('\\n');\n        out.push_str(anchor_start);\n        out.push_str(new_content);\n        out.push_str(anchor_end);\n        out.push_str(suffix);\n        *haystack = out;\n        return Ok(true);\n    }\n    let start = start.unwrap_or_else(|| haystack.find(anchor_start).expect(\"must be present\"));\n    let end = match haystack[start..].find(anchor_end) {\n        Some(end) => end + start,\n        None => bail!(\"expected matching end anchor {anchor_end}\"),\n    };\n    let prefix = &haystack[..start + anchor_start.len()];\n    let suffix = &haystack[end..];\n    let mut out = String::new();\n    out.push_str(prefix);\n    out.push_str(new_content);\n    out.push_str(suffix);\n    if haystack != &out {\n        *haystack = out;\n        Ok(true)\n    } else {\n        Ok(false)\n    }\n}\n\n#[cfg(test)]\nmod test {\n    use crate::anchor::{anchors, replace_anchor};\n\n    #[test]\n    fn updates_empty() {\n        let mut text = \"this is the start\".to_string();\n        assert!(replace_anchor(&mut text, &anchors(\"foo\"), \"hello!\", None).unwrap());\n        assert_eq!(\n            text,\n            \"this is the start\\n<!-- anchor_start:foo -->hello!<!-- anchor_end:foo -->\"\n        );\n    }\n\n    #[test]\n    fn updates_existing() {\n        let mut text =\n            \"this is the start\\n<!-- anchor_start:foo -->hello!<!-- anchor_end:foo -->\".to_string();\n        assert!(replace_anchor(&mut text, &anchors(\"foo\"), \"goodbye!\", None).unwrap());\n        assert_eq!(\n            text,\n            \"this is the start\\n<!-- anchor_start:foo -->goodbye!<!-- anchor_end:foo -->\"\n        );\n\n        // no replacement should return false\n        assert!(!replace_anchor(&mut text, &anchors(\"foo\"), \"goodbye!\", None).unwrap(),)\n    }\n}\n"
  },
  {
    "path": "tools/ci-build/sdk-lints/src/changelog.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::lint::LintError;\nuse crate::{repo_root, Check, Lint};\nuse anyhow::Result;\nuse smithy_rs_tool_common::changelog::{ChangelogLoader, ValidationSet};\nuse std::fmt::Debug;\nuse std::path::{Path, PathBuf};\n\npub(crate) struct ChangelogNext;\n\nimpl Lint for ChangelogNext {\n    fn name(&self) -> &str {\n        \"Changelog.next\"\n    }\n\n    fn files_to_check(&self) -> Result<Vec<PathBuf>> {\n        Ok(vec![repo_root().join(\"CHANGELOG.next.toml\")])\n    }\n}\n\nimpl Check for ChangelogNext {\n    fn check(&self, path: impl AsRef<Path> + Debug) -> Result<Vec<LintError>> {\n        if path.as_ref().exists() {\n            Ok(vec![LintError::new(\n                \"the legacy `CHANGELOG.next.toml` should no longer exist\",\n            )])\n        } else {\n            Ok(vec![])\n        }\n    }\n}\n\n#[allow(dead_code)]\npub(crate) struct DotChangelog;\n\nimpl Lint for DotChangelog {\n    fn name(&self) -> &str {\n        \".changelog\"\n    }\n\n    fn files_to_check(&self) -> Result<Vec<PathBuf>> {\n        Ok(vec![repo_root().join(\".changelog\")])\n    }\n}\n\nimpl Check for DotChangelog {\n    fn check(&self, path: impl AsRef<Path> + Debug) -> Result<Vec<LintError>> {\n        match check_changelog_next(path) {\n            Ok(_) => Ok(vec![]),\n            Err(errs) => Ok(errs),\n        }\n    }\n}\n\n/// Validate that changelog entries in the `.changelog` directory follows best practices\n#[allow(dead_code)]\nfn check_changelog_next(path: impl AsRef<Path> + Debug) -> std::result::Result<(), Vec<LintError>> {\n    let parsed = ChangelogLoader::default()\n        .load_from_dir(path)\n        .map_err(|e| vec![LintError::via_display(e)])?;\n    parsed\n        .validate(ValidationSet::Development)\n        .map_err(|errs| {\n            errs.into_iter()\n                .map(LintError::via_display)\n                .collect::<Vec<_>>()\n        })?;\n    Ok(())\n}\n"
  },
  {
    "path": "tools/ci-build/sdk-lints/src/copyright.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::ffi::OsStr;\nuse std::fs;\nuse std::path::{Path, PathBuf};\n\nuse crate::lint::LintError;\nuse crate::{Check, Lint, VCS_FILES};\nuse anyhow::Result;\n\nconst EXPECTED_CONTENTS: &[&str] = &[\n    \"Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\",\n    \"SPDX-License-Identifier: Apache-2.0\",\n];\n\nconst NEEDS_HEADER: [&str; 5] = [\"sh\", \"py\", \"rs\", \"kt\", \"ts\"];\n\n/// Check that all files have the correct copyright header\npub(crate) struct CopyrightHeader;\n\nimpl Lint for CopyrightHeader {\n    fn name(&self) -> &str {\n        \"Copyright header\"\n    }\n\n    fn files_to_check(&self) -> Result<Vec<PathBuf>> {\n        Ok(VCS_FILES.clone())\n    }\n}\n\nimpl Check for CopyrightHeader {\n    fn check(&self, path: impl AsRef<Path>) -> Result<Vec<LintError>> {\n        Ok(check_copyright_header(path))\n    }\n}\n\nfn check_copyright_header(path: impl AsRef<Path>) -> Vec<LintError> {\n    if !needs_copyright_header(path.as_ref()) {\n        return vec![];\n    }\n    let contents = match fs::read_to_string(path.as_ref()) {\n        Ok(contents) => contents,\n        Err(err) if format!(\"{err}\").contains(\"No such file or directory\") => {\n            eprintln!(\"Note: {} does not exist\", path.as_ref().display());\n            return vec![];\n        }\n        Err(e) => return vec![LintError::via_display(e)],\n    };\n    if !has_copyright_header(&contents) {\n        return vec![LintError::new(format!(\n            \"{} is missing copyright header\",\n            path.as_ref().display()\n        ))];\n    }\n    vec![]\n}\n\nfn needs_copyright_header(path: &Path) -> bool {\n    let mut need_extensions = NEEDS_HEADER.iter().map(OsStr::new);\n    need_extensions.any(|extension| path.extension().unwrap_or_default() == extension)\n}\n\nfn has_copyright_header(contents: &str) -> bool {\n    let mut expected = EXPECTED_CONTENTS.iter().peekable();\n    // copyright header must be present in the first 10 lines\n    for line in contents.lines().take(10) {\n        match expected.peek() {\n            Some(next) => {\n                if line.trim().ends_with(*next) {\n                    let _ = expected.next();\n                }\n            }\n            None => return true,\n        }\n    }\n    expected.peek().is_none()\n}\n\n#[cfg(test)]\nmod test {\n    use crate::copyright::has_copyright_header;\n\n    #[test]\n    fn has_license_header() {\n        let valid = [\n            \"// something else\\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\\n# SPDX-License-Identifier: Apache-2.0\",\n            \"# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\\n# SPDX-License-Identifier: Apache-2.0\",\n            \"/*\\n* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\\n* SPDX-License-Identifier: Apache-2.0\\n */\",\n        ];\n\n        let invalid = [\"\", \"no license\", \"// something else\\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\\n# SPDX-License-Identifier: Apache-3.0\"];\n\n        for license in valid {\n            assert!(\n                has_copyright_header(license),\n                \"should be true: `{}`\",\n                license\n            );\n        }\n        for license in invalid {\n            assert!(\n                !has_copyright_header(license),\n                \"should not be true: `{}`\",\n                license\n            );\n        }\n    }\n}\n"
  },
  {
    "path": "tools/ci-build/sdk-lints/src/lib_rs_attr.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::path::{Path, PathBuf};\n\nuse crate::all_runtime_crates;\nuse crate::anchor::replace_anchor;\nuse crate::lint::{Fix, Lint, LintError};\n\n/// Manages a standard set of `#![crate_level]` attributes\npub(super) struct StandardizedRuntimeCrateLibRsAttributes;\n\nimpl Lint for StandardizedRuntimeCrateLibRsAttributes {\n    fn name(&self) -> &str {\n        \"Checking for the correct docs.rs attributes\"\n    }\n\n    fn files_to_check(&self) -> anyhow::Result<Vec<PathBuf>> {\n        Ok(all_runtime_crates()?\n            .map(|crte| crte.join(\"src/lib.rs\"))\n            .collect())\n    }\n}\n\nconst DOCS_CFG: &str = \"#![cfg_attr(docsrs, feature(doc_cfg))]\";\n\nfn check_for_auto_cfg(path: impl AsRef<Path>) -> anyhow::Result<Vec<LintError>> {\n    let contents = std::fs::read_to_string(path)?;\n    if !contents.contains(DOCS_CFG) {\n        return Ok(vec![LintError::new(\"missing docsrs header\")]);\n    }\n    Ok(vec![])\n}\n\nimpl Fix for StandardizedRuntimeCrateLibRsAttributes {\n    fn fix(&self, path: impl AsRef<Path>) -> anyhow::Result<(Vec<LintError>, String)> {\n        let contents = std::fs::read_to_string(&path)?;\n        // ensure there is only one in the crate\n        let mut contents = contents.replace(DOCS_CFG, \"\");\n        let anchor_start = \"/* Automatically managed default lints */\\n\";\n        let anchor_end = \"\\n/* End of automatically managed default lints */\";\n        // Find the end of the license header\n        if let Some(pos) = contents.find(\"*/\") {\n            let newline = contents[pos..]\n                .find('\\n')\n                .ok_or(anyhow::Error::msg(\"couldn't find a newline\"))?\n                + 1\n                + pos;\n            replace_anchor(\n                &mut contents,\n                &(anchor_start, anchor_end),\n                DOCS_CFG,\n                Some(newline),\n            )?;\n        };\n        check_for_auto_cfg(path).map(|errs| (errs, contents))\n    }\n}\n"
  },
  {
    "path": "tools/ci-build/sdk-lints/src/lint.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse anyhow::Context;\nuse std::borrow::Cow;\n\nuse std::fmt::{Debug, Display, Formatter};\nuse std::fs::read_to_string;\nuse std::path::{Path, PathBuf};\n\n#[derive(Debug)]\npub struct LintError {\n    message: Cow<'static, str>,\n    context: Option<Cow<'static, str>>,\n    location: Option<PathBuf>,\n}\n\nimpl LintError {\n    pub(crate) fn via_display<T: Display>(t: T) -> Self {\n        LintError::new(format!(\"{t}\"))\n    }\n    pub(crate) fn new(message: impl Into<Cow<'static, str>>) -> Self {\n        LintError {\n            message: message.into(),\n            context: None,\n            location: None,\n        }\n    }\n    fn at_location(self, location: PathBuf) -> Self {\n        Self {\n            location: Some(location),\n            ..self\n        }\n    }\n}\n\nimpl Display for LintError {\n    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {\n        write!(f, \"{}\", self.message)?;\n        if let Some(ctx) = &self.context {\n            write!(f, \"({ctx})\")?;\n        }\n        if let Some(path) = &self.location {\n            write!(f, \"({})\", path.display())?;\n        }\n        Ok(())\n    }\n}\n\npub(crate) trait Lint {\n    fn name(&self) -> &str;\n    fn files_to_check(&self) -> anyhow::Result<Vec<PathBuf>>;\n    fn check_all(&self) -> anyhow::Result<Vec<LintError>>\n    where\n        Self: Check,\n    {\n        let mut errors = vec![];\n        for path in self\n            .files_to_check()\n            .with_context(|| format!(\"failed to load file list for {}\", self.name()))?\n        {\n            let new_errors = self\n                .check(&path)\n                .with_context(|| format!(\"error linting {}\", &path.display()))?\n                .into_iter()\n                .map(|lint| lint.at_location(path.clone()));\n            errors.extend(new_errors);\n        }\n        if errors.is_empty() {\n            eprintln!(\"{}...OK!\", self.name())\n        } else {\n            eprintln!(\"Errors for {}:\", self.name());\n            for error in &errors {\n                eprintln!(\"  {error}\")\n            }\n        }\n        Ok(errors)\n    }\n\n    fn fix_all(&self, dry_run: Mode) -> anyhow::Result<Vec<PathBuf>>\n    where\n        Self: Fix,\n    {\n        let mut fixes = vec![];\n        for path in self\n            .files_to_check()\n            .with_context(|| format!(\"failed to load file list for {}\", self.name()))?\n        {\n            let (errs, new_content) = self\n                .fix(&path)\n                .with_context(|| format!(\"error attempting to fix {}\", path.display()))?;\n            let current_content = std::fs::read_to_string(&path).unwrap_or_default();\n            if !errs.is_empty() {\n                eprintln!(\"Errors for {}:\", path.display());\n                for error in &errs {\n                    eprintln!(\"  {error}\")\n                }\n            }\n            if new_content != current_content {\n                if dry_run == Mode::NoDryRun {\n                    std::fs::write(&path, new_content)\n                        .with_context(|| format!(\"failure writing fix to {}\", path.display()))?;\n                }\n                fixes.push(path);\n            }\n        }\n        if fixes.is_empty() {\n            eprintln!(\"{}...OK!\", self.name())\n        } else {\n            eprintln!(\"Fixed {} files for {}:\", fixes.len(), self.name());\n            for file in &fixes {\n                eprintln!(\"  {}\", file.display())\n            }\n        }\n        Ok(fixes)\n    }\n}\n\npub(crate) trait Check: Lint {\n    fn check(&self, path: impl AsRef<Path> + Debug) -> anyhow::Result<Vec<LintError>>;\n}\n\n#[derive(Debug, Eq, PartialEq, Copy, Clone)]\npub(crate) enum Mode {\n    DryRun,\n    NoDryRun,\n}\n\npub(crate) trait Fix: Lint {\n    fn fix(&self, path: impl AsRef<Path>) -> anyhow::Result<(Vec<LintError>, String)>;\n}\n\nimpl<T> Check for T\nwhere\n    T: Fix,\n{\n    fn check(&self, path: impl AsRef<Path>) -> anyhow::Result<Vec<LintError>> {\n        let old_contents = read_to_string(path.as_ref())?;\n        let (mut errs, new_contents) = self.fix(path)?;\n        if new_contents != old_contents {\n            errs.push(LintError::new(\n                \"fix would have made changes. Run `sdk-lints fix`\",\n            ));\n        }\n        Ok(errs)\n    }\n}\n"
  },
  {
    "path": "tools/ci-build/sdk-lints/src/lint_cargo_toml.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::collections::HashSet;\nuse std::fs::read_to_string;\nuse std::ops::Deref;\nuse std::path::{Path, PathBuf};\n\nuse anyhow::{Context, Result};\nuse cargo_toml::{Manifest, Package};\nuse serde::de::DeserializeOwned;\nuse serde::Deserialize;\n\nuse crate::anchor::replace_anchor;\nuse crate::lint::LintError;\nuse crate::{all_cargo_tomls, repo_root, Check, Fix, Lint};\n\nmacro_rules! return_errors {\n    ($errs: expr) => {\n        match $errs {\n            Ok(res) => res,\n            Err(errs) => return Ok(errs),\n        }\n    };\n}\n\n#[derive(Deserialize)]\nstruct DocsRsMetadata {\n    docs: Docs,\n}\n\n/// Convenience wrapper to expose fields of the inner struct on the outer struct\nimpl Deref for DocsRsMetadata {\n    type Target = Metadata;\n\n    fn deref(&self) -> &Self::Target {\n        &self.docs.rs\n    }\n}\n\n#[derive(Deserialize)]\nstruct Docs {\n    rs: Metadata,\n}\n\n#[derive(Deserialize)]\nstruct Metadata {\n    #[serde(rename = \"all-features\")]\n    all_features: bool,\n    targets: Vec<String>,\n    #[serde(rename = \"rustdoc-args\")]\n    rustdoc_args: Vec<String>,\n}\n\nconst RUST_SDK_TEAM: &str = \"AWS Rust SDK Team <aws-sdk-rust@amazon.com>\";\nconst SERVER_TEAM: &str = \"Smithy Rust Server <smithy-rs-server@amazon.com>\";\nconst SERVER_CRATES: &[&str] = &[\n    \"aws-smithy-http-server\",\n    \"aws-smithy-http-server-python\",\n    \"aws-smithy-http-server-typescript\",\n    \"aws-smithy-legacy-http-server\",\n];\n\n/// Check crate licensing\n///\n/// Validates that:\n/// - `[package.license]` is set to `Apache-2.0`\n/// - A `LICENSE` file is present in the same directory as the `Cargo.toml` file\npub(crate) struct CrateLicense;\n\nimpl Lint for CrateLicense {\n    fn name(&self) -> &str {\n        \"Crate licensing\"\n    }\n\n    fn files_to_check(&self) -> Result<Vec<PathBuf>> {\n        Ok(all_cargo_tomls()?.collect())\n    }\n}\n\nimpl Check for CrateLicense {\n    fn check(&self, path: impl AsRef<Path>) -> Result<Vec<LintError>> {\n        let package = return_errors!(package(&path)?);\n        check_crate_license(package, path)\n    }\n}\n\nfn check_crate_license(package: Package, path: impl AsRef<Path>) -> Result<Vec<LintError>> {\n    let mut errors = vec![];\n    match package.license {\n        Some(license) if license.as_ref().unwrap() == \"Apache-2.0\" => {}\n        incorrect_license => errors.push(LintError::new(format!(\n            \"invalid license: {incorrect_license:?}\"\n        ))),\n    };\n    if !path\n        .as_ref()\n        .parent()\n        .expect(\"path must have parent\")\n        .join(\"LICENSE\")\n        .exists()\n    {\n        errors.push(LintError::new(\"LICENSE file missing\"));\n    }\n    Ok(errors)\n}\n\n/// Checks that the `author` field of the crate is either the Rust SDK team or the server SDK Team\npub(crate) struct CrateAuthor;\n\nimpl Lint for CrateAuthor {\n    fn name(&self) -> &str {\n        \"Crate author\"\n    }\n\n    fn files_to_check(&self) -> Result<Vec<PathBuf>> {\n        Ok(all_cargo_tomls()?.collect())\n    }\n}\n\nimpl Check for CrateAuthor {\n    fn check(&self, path: impl AsRef<Path>) -> Result<Vec<LintError>> {\n        let package = return_errors!(package(path)?);\n        check_crate_author(package)\n    }\n}\n\nfn manifest<T>(path: impl AsRef<Path>) -> Result<Manifest<T>>\nwhere\n    T: DeserializeOwned,\n{\n    Manifest::from_path_with_metadata(path).context(\"failed to parse Cargo.toml\")\n}\n\nfn package_from_manifest<T>(\n    manifest: Manifest<T>,\n) -> std::result::Result<Package<T>, Vec<LintError>> {\n    match manifest.package {\n        Some(package) => Ok(package),\n        None => Err(vec![LintError::new(\"missing `[package]` section\")]),\n    }\n}\n\nfn package<T>(path: impl AsRef<Path>) -> Result<std::result::Result<Package<T>, Vec<LintError>>>\nwhere\n    T: DeserializeOwned,\n{\n    Ok(package_from_manifest(manifest(path)?))\n}\n\nfn check_crate_author(package: Package) -> Result<Vec<LintError>> {\n    let mut errors = vec![];\n    let expected_author = if SERVER_CRATES.contains(&package.name.as_str()) {\n        SERVER_TEAM\n    } else {\n        RUST_SDK_TEAM\n    };\n    if !package\n        .authors\n        .as_ref()\n        .unwrap()\n        .iter()\n        .any(|s| s == expected_author)\n    {\n        errors.push(LintError::new(format!(\n            \"missing `{}` in package author list ({:?})\",\n            expected_author, package.authors\n        )));\n    }\n    Ok(errors)\n}\n\npub(crate) struct DocsRs;\n\nimpl Lint for DocsRs {\n    fn name(&self) -> &str {\n        \"Cargo.toml package.metadata.docs.rs\"\n    }\n\n    fn files_to_check(&self) -> Result<Vec<PathBuf>> {\n        Ok(all_cargo_tomls()?\n            // aws-lc-fips cannot build on docs.rs, grant an exception for this crate which does not follow the same cargo.toml w.r.t docs.rs\n            .filter(|path| !path.to_string_lossy().contains(\"aws-smithy-http-client\"))\n            .collect())\n    }\n}\n\nimpl Fix for DocsRs {\n    fn fix(&self, path: impl AsRef<Path>) -> Result<(Vec<LintError>, String)> {\n        let contents = read_to_string(&path)?;\n        let updated = fix_docs_rs(&contents)?;\n        let package = match package(path) {\n            Ok(Ok(package)) => package,\n            Ok(Err(errs)) => return Ok((errs, updated)),\n            Err(errs) => return Ok((vec![LintError::new(format!(\"{errs}\"))], updated)),\n        };\n        let lint_errors = check_docs_rs(&package);\n        Ok((lint_errors, updated))\n    }\n}\n\n/// Check Cargo.toml for a valid docs.rs metadata section\n///\n/// This function validates:\n/// - it is valid TOML\n/// - it contains a package.metadata.docs.rs section\n/// - All of the standard docs.rs settings are respected\nfn check_docs_rs(package: &Package<DocsRsMetadata>) -> Vec<LintError> {\n    let metadata = match &package.metadata {\n        Some(metadata) => metadata,\n        None => return vec![LintError::new(\"missing docs.rs metadata section\")],\n    };\n    let mut errs = vec![];\n    if !metadata.all_features {\n        errs.push(LintError::new(\"all-features must be set to true\"))\n    }\n    if metadata.targets != [\"x86_64-unknown-linux-gnu\"] {\n        errs.push(LintError::new(\n            \"targets must be pruned to linux only `x86_64-unknown-linux-gnu`\",\n        ))\n    }\n    if metadata.rustdoc_args != [\"--cfg\", \"docsrs\"] {\n        errs.push(LintError::new(\n            \"rustdoc args must be [\\\"--cfg\\\", \\\"docsrs\\\"]\",\n        ));\n    }\n    errs\n}\n\nconst DEFAULT_DOCS_RS_SECTION: &str = r#\"\nall-features = true\ntargets = [\"x86_64-unknown-linux-gnu\"]\ncargo-args = [\"-Zunstable-options\", \"-Zrustdoc-scrape-examples\"]\nrustdoc-args = [\"--cfg\", \"docsrs\"]\n\"#;\n\n/// Set the default docs.rs anchor block\n///\n/// `[package.metadata.docs.rs]` is used as the head anchor. A comment `# End of docs.rs metadata` is used\n/// as the tail anchor.\nfn fix_docs_rs(contents: &str) -> Result<String> {\n    let mut new = contents.to_string();\n    replace_anchor(\n        &mut new,\n        &(\"[package.metadata.docs.rs]\", \"# End of docs.rs metadata\"),\n        DEFAULT_DOCS_RS_SECTION,\n        None,\n    )?;\n    Ok(new)\n}\n\n#[derive(Deserialize)]\nstruct SmithyRsMetadata {\n    #[serde(rename = \"smithy-rs-release-tooling\")]\n    smithy_rs_release_tooling: ToolingMetadata,\n}\n\n#[derive(Deserialize)]\nstruct ToolingMetadata {\n    stable: bool,\n}\n\npub(crate) struct StableCratesExposeStableCrates {\n    stable_crates: HashSet<String>,\n}\n\nimpl StableCratesExposeStableCrates {\n    pub(crate) fn new() -> Result<Self> {\n        let mut stable_crates = all_cargo_tomls()?\n            .flat_map(crate_is_stable)\n            .map(|c| c.replace('-', \"_\"))\n            .collect::<HashSet<_>>();\n        for crte in [\n            \"tokio\",\n            \"hyper\",\n            \"http\",\n            \"bytes\",\n            \"http-body\",\n            \"aws-smithy-eventstream\",\n        ] {\n            stable_crates.insert(crte.replace('-', \"_\"));\n        }\n\n        Ok(Self { stable_crates })\n    }\n}\nimpl Lint for StableCratesExposeStableCrates {\n    fn name(&self) -> &str {\n        \"StableCratesExposeStableCrates\"\n    }\n\n    fn files_to_check(&self) -> Result<Vec<PathBuf>> {\n        Ok(all_cargo_tomls()?.collect())\n    }\n}\n\npub(crate) struct SdkExternalLintsExposesStableCrates {\n    checker: StableCratesExposeStableCrates,\n}\n\nimpl SdkExternalLintsExposesStableCrates {\n    pub(crate) fn new() -> Result<Self> {\n        Ok(Self {\n            checker: StableCratesExposeStableCrates::new()?,\n        })\n    }\n}\n\nimpl Lint for SdkExternalLintsExposesStableCrates {\n    fn name(&self) -> &str {\n        \"sdk-external-types exposes stable types\"\n    }\n\n    fn files_to_check(&self) -> Result<Vec<PathBuf>> {\n        Ok(vec![repo_root().join(\"aws/sdk/sdk-external-types.toml\")])\n    }\n}\n\nimpl Check for SdkExternalLintsExposesStableCrates {\n    fn check(&self, path: impl AsRef<Path>) -> Result<Vec<LintError>> {\n        Ok(self\n            .checker\n            .check_external_types(path)?\n            .iter()\n            .filter(|it| it != &\"aws_smithy_http\") // currently exposed for transcribe streaming\n            .map(|crte| {\n                LintError::new(format!(\n                    \"the list of allowed SDK external types contained unstable crate {crte}\"\n                ))\n            })\n            .collect())\n    }\n}\n\nimpl Check for StableCratesExposeStableCrates {\n    fn check(&self, path: impl AsRef<Path>) -> Result<Vec<LintError>> {\n        let manifest: Manifest<SmithyRsMetadata> = match manifest(path.as_ref()) {\n            // if the manifest doesn't parse, someone else figured that out\n            Err(_) => return Ok(vec![]),\n            Ok(m) => m,\n        };\n        // Proc-macro crates don't expose types in their public API\n        if manifest.lib.as_ref().is_some_and(|lib| lib.proc_macro) {\n            return Ok(vec![]);\n        }\n        let parsed = match package_from_manifest(manifest) {\n            Ok(pkg) => pkg,\n            // if there is something wrong, someone figured that out too\n            Err(_errs) => return Ok(vec![]),\n        };\n        self.check_stable_crates_only_expose_stable_crates(parsed, path)\n    }\n}\n\n#[derive(Deserialize)]\nstruct ExternalTypes {\n    allowed_external_types: Vec<String>,\n}\n\nimpl StableCratesExposeStableCrates {\n    /// returns a list of unstable types exposed by this list\n    fn check_external_types(&self, external_types: impl AsRef<Path>) -> Result<Vec<String>> {\n        let external_types =\n            toml::from_str::<ExternalTypes>(&read_to_string(external_types.as_ref())?)\n                .context(\"invalid external types format\")?;\n        let mut errs = vec![];\n        for tpe in external_types.allowed_external_types {\n            let referenced_crate = tpe.split_once(\"::\").map(|(pkg, _r)| pkg).unwrap_or(&tpe);\n            if !self.stable_crates.contains(referenced_crate) {\n                errs.push(referenced_crate.to_string())\n            }\n        }\n        Ok(errs)\n    }\n    fn check_stable_crates_only_expose_stable_crates(\n        &self,\n        package: Package<SmithyRsMetadata>,\n        path: impl AsRef<Path>,\n    ) -> Result<Vec<LintError>> {\n        // [package.metadata.smithy-rs-release-tooling]\n        if package\n            .metadata\n            .map(|meta| meta.smithy_rs_release_tooling.stable)\n            == Some(true)\n        {\n            let name = package.name;\n            Ok(self\n                .check_external_types(path.as_ref().parent().unwrap().join(\"external-types.toml\"))?\n                .iter()\n                // TODO(tooling): When tooling allows, specify this at the crate level. These\n                // are gated in test-util\n                .filter(|tpe| {\n                    !(name == \"aws-smithy-runtime\"\n                        && [\"tower_service\", \"serde\"].contains(&tpe.as_str()))\n                })\n                // TODO(tooling): When tooling allows, specify this at the crate level. These\n                // are gated by the hyper-014 feature and carryover from relocating hyper-014.x\n                // support from aws-smithy-runtime. hyper_util is only exposed as part of test_util trait impl\n                .filter(|tpe| {\n                    !(name == \"aws-smithy-http-client\"\n                        && [\"tower_service\", \"serde\", \"serde_core\", \"hyper_util\"]\n                            .contains(&tpe.as_str()))\n                })\n                .map(|crte| {\n                    LintError::new(format!(\n                        \"stable crate {name} exposed {crte} which is unstable\"\n                    ))\n                })\n                .collect::<Vec<_>>())\n        } else {\n            Ok(vec![])\n        }\n    }\n}\n\n/// if the crate is stable, returns the name of the crate\nfn crate_is_stable(path: impl AsRef<Path>) -> Option<String> {\n    let parsed: Package<SmithyRsMetadata> = match package(path.as_ref()) {\n        // if the package doesn't parse, someone else figured that out\n        Err(_) => return None,\n        // if there is something wrong, someone figured that out too\n        Ok(Err(_errs)) => return None,\n        Ok(Ok(pkg)) => pkg,\n    };\n    match parsed\n        .metadata\n        .map(|meta| meta.smithy_rs_release_tooling.stable)\n    {\n        Some(true) => Some(parsed.name),\n        _ => None,\n    }\n}\n"
  },
  {
    "path": "tools/ci-build/sdk-lints/src/main.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::changelog::ChangelogNext;\nuse crate::copyright::CopyrightHeader;\nuse crate::lib_rs_attr::StandardizedRuntimeCrateLibRsAttributes;\nuse crate::lint::{Check, Fix, Lint, LintError, Mode};\nuse crate::lint_cargo_toml::{\n    CrateAuthor, CrateLicense, DocsRs, SdkExternalLintsExposesStableCrates,\n    StableCratesExposeStableCrates,\n};\nuse crate::readmes::{ReadmesExist, ReadmesHaveFooters};\nuse crate::todos::TodosHaveContext;\nuse anyhow::{bail, Context, Result};\nuse clap::Parser;\nuse lazy_static::lazy_static;\nuse std::env::set_current_dir;\nuse std::path::{Path, PathBuf};\nuse std::process::Command;\nuse std::{fs, io};\n\nmod anchor;\nmod changelog;\nmod copyright;\nmod lib_rs_attr;\nmod lint;\nmod lint_cargo_toml;\nmod readmes;\nmod todos;\n\nfn load_repo_root() -> Result<PathBuf> {\n    let output = Command::new(\"git\")\n        .arg(\"rev-parse\")\n        .arg(\"--show-toplevel\")\n        .output()\n        .with_context(|| \"couldn't load repo root\")?;\n    Ok(PathBuf::from(String::from_utf8(output.stdout)?.trim()))\n}\n\n#[derive(Debug, Parser)]\nenum Args {\n    Check {\n        #[clap(long)]\n        all: bool,\n        #[clap(long)]\n        readme: bool,\n        #[clap(long)]\n        cargo_toml: bool,\n        #[clap(long)]\n        docsrs_metadata: bool,\n        #[clap(long)]\n        changelog: bool,\n        #[clap(long)]\n        license: bool,\n        #[clap(long)]\n        todos: bool,\n    },\n    Fix {\n        #[clap(long)]\n        readme: bool,\n        #[clap(long)]\n        docsrs_metadata: bool,\n        #[clap(long)]\n        all: bool,\n        #[clap(long)]\n        dry_run: Option<bool>,\n    },\n}\n\nfn load_vcs_files() -> Result<Vec<PathBuf>> {\n    // This includes files in the index and the working tree (staged or unstaged), as well as\n    // unignored untracked files.\n    let vcs_files = Command::new(\"git\")\n        .arg(\"ls-files\")\n        .arg(\"--cached\")\n        .arg(\"--others\")\n        .arg(\"--exclude-standard\")\n        .current_dir(load_repo_root()?)\n        .output()\n        .context(\"couldn't load VCS files\")?;\n    let output = String::from_utf8(vcs_files.stdout)?;\n    let files = output\n        .lines()\n        .map(|line| PathBuf::from(line.trim().to_string()));\n    Ok(files.collect())\n}\n\nlazy_static! {\n    static ref REPO_ROOT: PathBuf = load_repo_root().unwrap();\n    static ref VCS_FILES: Vec<PathBuf> = load_vcs_files().unwrap();\n}\n\nfn repo_root() -> &'static Path {\n    REPO_ROOT.as_path()\n}\n\nfn ok<T>(errors: Vec<T>) -> anyhow::Result<()> {\n    if errors.is_empty() {\n        Ok(())\n    } else {\n        bail!(\"Lint errors occurred\");\n    }\n}\n\nfn main() -> Result<()> {\n    set_current_dir(repo_root())?;\n    let opt = Args::parse();\n    match opt {\n        Args::Check {\n            all,\n            readme,\n            cargo_toml,\n            docsrs_metadata,\n            changelog,\n            license,\n            todos,\n        } => {\n            let mut errs = vec![];\n            if readme || all {\n                errs.extend(ReadmesExist.check_all()?);\n                errs.extend(ReadmesHaveFooters.check_all()?);\n            }\n            if cargo_toml || all {\n                errs.extend(CrateAuthor.check_all()?);\n                errs.extend(CrateLicense.check_all()?);\n            }\n\n            if docsrs_metadata || all {\n                errs.extend(DocsRs.check_all()?);\n            }\n\n            if license || all {\n                errs.extend(CopyrightHeader.check_all()?);\n            }\n            if changelog || all {\n                errs.extend(ChangelogNext.check_all()?);\n            }\n            if todos || all {\n                errs.extend(TodosHaveContext.check_all()?);\n            }\n            errs.extend(StableCratesExposeStableCrates::new()?.check_all()?);\n            errs.extend(SdkExternalLintsExposesStableCrates::new()?.check_all()?);\n            errs.extend(StandardizedRuntimeCrateLibRsAttributes.check_all()?);\n            ok(errs)?\n        }\n        Args::Fix {\n            readme,\n            docsrs_metadata,\n            all,\n            dry_run,\n        } => {\n            let dry_run = match dry_run.unwrap_or(false) {\n                true => Mode::DryRun,\n                false => Mode::NoDryRun,\n            };\n            if readme || all {\n                ok(ReadmesHaveFooters.fix_all(dry_run)?)?;\n            }\n            if docsrs_metadata || all {\n                ok(DocsRs.fix_all(dry_run)?)?;\n            }\n            ok(StandardizedRuntimeCrateLibRsAttributes.fix_all(dry_run)?)?;\n        }\n    }\n    Ok(())\n}\n\nfn ls(path: impl AsRef<Path>) -> Result<impl Iterator<Item = PathBuf>> {\n    Ok(fs::read_dir(path.as_ref())\n        .with_context(|| format!(\"failed to ls: {:?}\", path.as_ref()))?\n        .map(|res| res.map(|e| e.path()))\n        .collect::<Result<Vec<_>, io::Error>>()?\n        .into_iter())\n}\n\nfn smithy_rs_crates() -> Result<impl Iterator<Item = PathBuf>> {\n    let smithy_crate_root = repo_root().join(\"rust-runtime\");\n    Ok(ls(smithy_crate_root)?.filter(|path| is_crate(path.as_path())))\n}\n\nfn is_crate(path: &Path) -> bool {\n    path.is_dir() && path.join(\"Cargo.toml\").exists()\n}\n\nfn aws_runtime_crates() -> Result<impl Iterator<Item = PathBuf>> {\n    let aws_crate_root = repo_root().join(\"aws\").join(\"rust-runtime\");\n    Ok(ls(aws_crate_root)?.filter(|path| is_crate(path.as_path())))\n}\n\nfn all_runtime_crates() -> Result<impl Iterator<Item = PathBuf>> {\n    Ok(aws_runtime_crates()?.chain(smithy_rs_crates()?))\n}\n\nfn all_cargo_tomls() -> Result<impl Iterator<Item = PathBuf>> {\n    Ok(all_runtime_crates()?.map(|pkg| pkg.join(\"Cargo.toml\")))\n}\n"
  },
  {
    "path": "tools/ci-build/sdk-lints/src/readmes.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::{all_runtime_crates, anchor, Check, Fix, Lint, LintError};\nuse anyhow::{Context, Result};\nuse std::fs;\nuse std::path::{Path, PathBuf};\n\nconst CRATES_TO_BE_USED_DIRECTLY: &[&str] = [\n    \"aws-config\",\n    \"aws-smithy-types-convert\",\n    \"aws-smithy-mocks\",\n    \"aws-smithy-mocks-experimental\",\n    \"aws-smithy-experimental\",\n]\n.as_slice();\n\npub(crate) struct ReadmesExist;\nimpl Lint for ReadmesExist {\n    fn name(&self) -> &str {\n        \"Crates have readmes\"\n    }\n\n    fn files_to_check(&self) -> Result<Vec<PathBuf>> {\n        Ok(all_runtime_crates()?.collect())\n    }\n}\n\nimpl Check for ReadmesExist {\n    fn check(&self, path: impl AsRef<Path>) -> Result<Vec<crate::lint::LintError>> {\n        if !path.as_ref().join(\"README.md\").exists() {\n            return Ok(vec![LintError::new(\"Crate is missing a README\")]);\n        }\n        Ok(vec![])\n    }\n}\n\npub(crate) struct ReadmesHaveFooters;\nimpl Lint for ReadmesHaveFooters {\n    fn name(&self) -> &str {\n        \"READMEs have footers\"\n    }\n\n    fn files_to_check(&self) -> Result<Vec<PathBuf>> {\n        Ok(all_runtime_crates()?\n            .map(|path| path.join(\"README.md\"))\n            .collect())\n    }\n}\n\nimpl Fix for ReadmesHaveFooters {\n    fn fix(&self, path: impl AsRef<Path>) -> Result<(Vec<LintError>, String)> {\n        let is_crate_to_be_used_directly = path\n            .as_ref()\n            .parent()\n            .map(|parent_folder| {\n                CRATES_TO_BE_USED_DIRECTLY\n                    .iter()\n                    .any(|crate_name| parent_folder.ends_with(crate_name))\n            })\n            .unwrap_or_default();\n\n        let (updated, new_contents) = fix_readme(path, is_crate_to_be_used_directly)?;\n        let errs = match updated {\n            true => vec![LintError::new(\"README was missing required footer\")],\n            false => vec![],\n        };\n        Ok((errs, new_contents))\n    }\n}\n\nconst README_FOOTER: &str =\n    \"\\nThis crate is part of the [AWS SDK for Rust](https://awslabs.github.io/aws-sdk-rust/) \\\nand the [smithy-rs](https://github.com/smithy-lang/smithy-rs) code generator.\";\nconst NOT_TO_BE_USED_DIRECTLY: &str = \" In most cases, it should not be used directly.\";\n\nfn fix_readme(path: impl AsRef<Path>, to_be_used_directly: bool) -> Result<(bool, String)> {\n    let mut footer_contents = README_FOOTER.to_string();\n    if !to_be_used_directly {\n        footer_contents.push_str(NOT_TO_BE_USED_DIRECTLY);\n    }\n    footer_contents.push('\\n');\n\n    let mut contents = fs::read_to_string(path.as_ref())\n        .with_context(|| format!(\"failure to read readme: {:?}\", path.as_ref()))?;\n    let updated = anchor::replace_anchor(\n        &mut contents,\n        &anchor::anchors(\"footer\"),\n        &footer_contents,\n        None,\n    )?;\n    Ok((updated, contents))\n}\n"
  },
  {
    "path": "tools/ci-build/sdk-lints/src/todos.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nuse crate::lint::LintError;\nuse crate::{Check, Lint, VCS_FILES};\nuse std::ffi::OsStr;\nuse std::fs;\nuse std::path::{Path, PathBuf};\n\n// All \"TODOs\" must include (...) that gives them context\npub(crate) struct TodosHaveContext;\n\nconst IGNORE_DIRS: &[&str] = &[\"tools/ci-build/sdk-lints/src/todos.rs\"];\n\nimpl Lint for TodosHaveContext {\n    fn name(&self) -> &str {\n        \"TODOs include context\"\n    }\n\n    fn files_to_check(&self) -> anyhow::Result<Vec<PathBuf>> {\n        fn validate_todos(extension: Option<&OsStr>) -> bool {\n            extension\n                .map(|ext| {\n                    ext.eq_ignore_ascii_case(\"rs\")\n                        || ext.eq_ignore_ascii_case(\"toml\")\n                        || ext.eq_ignore_ascii_case(\"txt\")\n                        // TODO(https://github.com/smithy-lang/smithy-rs/issues/2077)\n                        // || ext.eq_ignore_ascii_case(\"md\")\n                        || ext.eq_ignore_ascii_case(\"sh\")\n                        || ext.eq_ignore_ascii_case(\"py\")\n                        || ext.eq_ignore_ascii_case(\"smithy\")\n                        || ext.eq_ignore_ascii_case(\"kt\")\n                        || ext.eq_ignore_ascii_case(\"kts\")\n                })\n                .unwrap_or(false)\n        }\n        Ok(VCS_FILES\n            .iter()\n            .filter(|path| !IGNORE_DIRS.iter().any(|dir| path.starts_with(dir)))\n            .filter(|f| validate_todos(f.extension()))\n            .cloned()\n            .collect())\n    }\n}\n\nimpl Check for TodosHaveContext {\n    fn check(&self, path: impl AsRef<Path>) -> anyhow::Result<Vec<LintError>> {\n        let contents = match fs::read_to_string(path.as_ref()) {\n            Ok(contents) => contents,\n            Err(err) if format!(\"{err}\").contains(\"No such file or directory\") => {\n                eprintln!(\"Note: {} does not exist\", path.as_ref().display());\n                return Ok(vec![]);\n            }\n            e @ Err(_) => e?,\n        };\n        let mut errs = vec![];\n        for todo in contents.split(\"TODO\").skip(1) {\n            if !todo.starts_with('(') {\n                let todo_line = todo.lines().next().unwrap_or_default();\n                errs.push(LintError::new(format!(\n                    \"TODO without context: `TODO{todo_line}`\"\n                )))\n            }\n        }\n        Ok(errs)\n    }\n}\n"
  },
  {
    "path": "tools/ci-build/sdk-lockfiles/Cargo.toml",
    "content": "[package]\nname = \"sdk-lockfiles\"\nversion = \"0.1.6\"\nauthors = [\"AWS Rust SDK Team <aws-sdk-rust@amazon.com>\"]\ndescription = \"\"\"\nA CLI tool to audit lockfiles for Smithy runtime crates, AWS runtime crates, `aws-config`, and the workspace containing\nSDK crates\n\"\"\"\nedition = \"2021\"\nlicense = \"Apache-2.0\"\npublish = false\n\n[dependencies]\nanyhow = \"1.0.87\"\ncargo-lock = { version = \"10.1.0\", features = [\"dependency-tree\"] }\nclap = { version = \"4.4.11\", features = [\"derive\", \"env\"] }\npetgraph = \"0.6.5\"\nsmithy-rs-tool-common = { path = \"../smithy-rs-tool-common\" }\ntracing = \"0.1.40\"\ntracing-subscriber = { version = \"0.3.18\", features = [\"env-filter\"] }\n\n[dev-dependencies]\nitertools = \"0.13.0\"\ntracing-test = \"0.2.4\"\n"
  },
  {
    "path": "tools/ci-build/sdk-lockfiles/README.md",
    "content": "sdk-lockfiles\n=============\n\nThis CLI tool audits the `Cargo.lock` files in the `smithy-rs` repository. These lockfiles are used to ensure\nreproducible builds during our release process for both `smithy-rs` and `aws-sdk-rust`. When a crate dependency is not\npinned to a fixed version, it risks being affected by newer versions of that dependency published to crates.io, which\ncould potentially break the build.\n\nWe track the following lockfiles in the `smithy-rs` repository:\n1. The [lockfile](https://github.com/smithy-lang/smithy-rs/blob/main/rust-runtime/Cargo.lock) for Smithy runtime crates\n2. The [lockfile](https://github.com/smithy-lang/smithy-rs/blob/main/aws/rust-runtime/Cargo.lock) for AWS runtime crates\n3. The [lockfile](https://github.com/smithy-lang/smithy-rs/blob/main/aws/rust-runtime/aws-config/Cargo.lock) for the `aws-config` crate\n4. The [lockfile](https://github.com/smithy-lang/smithy-rs/blob/main/aws/sdk/Cargo.lock) for the workspace containing code-generated AWS SDK crates\n\nThe first three lockfiles can be easily updated during development with a `cargo` command. However, the fourth lockfile\n, known as the SDK lockfile, is generated by the code generator and is not checked into to the `smithy-rs` repository as\nfrequently as the first three runtime lockfiles. As a result, new dependencies added to any of the runtime lockfiles may\nnot be reflected in the SDK lockfile.\n\nThe `sdk-lockfiles` tool ensures that the SDK lockfile is a superset containing all dependencies listed in the three\nruntime lockfiles. If it detects a new dependency in the AWS SDK crates introduced by any of the runtime lockfiles it\nwill output a message similar to the following (unless the dependency is introduced by a server specific runtime crate):\n```\n$ sdk-lockfiles audit\n2024-09-10T16:48:38.460518Z  INFO sdk_lockfiles::audit: checking whether `rust-runtime/Cargo.lock` is covered by the SDK lockfile...\n2024-09-10T16:48:38.489879Z  INFO sdk_lockfiles::audit: checking whether `aws/rust-runtime/Cargo.lock` is covered by the SDK lockfile...\n2024-09-10T16:48:38.490306Z  INFO sdk_lockfiles::audit: checking whether `aws/rust-runtime/aws-config/Cargo.lock` is covered by the SDK lockfile...\n`minicbor` (0.24.2), used by `rust-runtime/Cargo.lock`, is not contained in the SDK lockfile!\nError: there are lockfile audit failures\n```\n\nThis tool is intended for automated use.\n\n## Limitations\n### Unable to audit dependencies in `CargoDependency.kt`\nThe `sdk-lockfiles` tool does not verify whether new dependencies introduced in [CargoDependency.kt](https://github.com/smithy-lang/smithy-rs/blob/main/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/rustlang/CargoDependency.kt)\nare included in the SDK lockfile. This is because dependencies in `CargoDependency.kt` are represented as a Kotlin data\nclass. Consequently, dependencies added via the code generator, `inlineable`, or `aws-inlineable` are not considered by\n`sdk-lockfiles`.\n\nThis limitation is acceptable for our operational purposes. Our release script [always executes\n`./gradlew aws:sdk:syncAwsSdkLockfile`](https://github.com/smithy-lang/smithy-rs/blob/b62000e4d733ca06bc98fd9b57c91468718b8f9f/tools/ci-scripts/generate-smithy-rs-release#L36), which ensures that any dependencies added in `CargoDependency.kt` are properly\nreflected in the SDK lockfile.\n\n### False positives\nThe `sdk-lockfiles` tool may report false positives based on the contents of a lockfile. For example, if a section of\nthe lockfile appears as follows\n```\n  pin-project v1.1.5\n  ├── tower v0.4.13\n  │   ├── aws-smithy-experimental v0.1.4\n  │   ├── aws-smithy-http-server v0.63.3\n  │   │   └── aws-smithy-http-server-python v0.63.2\n  │   ├── aws-smithy-http-server-python v0.63.2\n  ...\n```\nthe tool cannot identify which dependent crate of `tower` enables `tower`'s Cargo feature to include `pin-project`.\nIn the case above, `aws-smithy-experimental` does not enable this feature, while `aws-smithy-http-server` does.\nAmong the Smithy runtime crates above, only `aws-smithy-experimental` is used by SDKs. When `aws-smithy-experimental`\nis compiled for a generated SDK without server-related Smithy runtime crates, `pin-project` will not appear in the\nSDK lockfile. Therefore, while it may appear that `aws-smithy-experimental` depends on `pin-project`, it is a false\npositive for the audit.\n\nTo address this limitation, we maintain a list of known false positives in `false-positives.txt`. Any dependency\nincluded in this file will not be flagged as an audit error.\n"
  },
  {
    "path": "tools/ci-build/sdk-lockfiles/false-positives.txt",
    "content": "aws-smithy-xml -> chacha20\naws-smithy-protocol-test -> chacha20\naws-smithy-mocks -> chacha20\naws-smithy-http-client -> chacha20\naws-smithy-runtime -> chacha20\naws-smithy-dns -> chacha20\n"
  },
  {
    "path": "tools/ci-build/sdk-lockfiles/src/audit.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::AuditArgs;\nuse anyhow::bail;\nuse anyhow::{Context, Result};\nuse cargo_lock::dependency::graph::{Graph, NodeIndex};\nuse cargo_lock::{package::Package, Lockfile, Name, Version};\nuse petgraph::visit::EdgeRef;\nuse smithy_rs_tool_common::git::find_git_repository_root;\nuse smithy_rs_tool_common::here;\nuse std::collections::HashSet;\nuse std::env;\nuse std::fmt;\nuse std::hash::{Hash, Hasher};\nuse std::path::PathBuf;\nuse std::str::FromStr;\nuse std::sync::LazyLock;\n\n// Struct representing a potential dependency that may eventually be reported as an error by `audit`,\n// indicating that the crate `to` is not covered by the SDK lockfile even though `to` is reported as a dependency\n// of the crate `from` in a runtime lockfile.\n//\n// This dependency might be an indirect dependency, meaning that the crate `from` transitively depends on the crate `to`.\n// Given collected `SuspectDependency` instances, the `audit` subcommand refers to `FALSE_POSITIVES` to determine\n// whether a `SuspectDependency` should be reported as an audit error.\n#[derive(Clone)]\nstruct SuspectDependency {\n    from: Package,\n    to: Package,\n}\n\nimpl fmt::Debug for SuspectDependency {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        write!(\n            f,\n            \"`SuspectDependency`: {} -> {}\",\n            self.from.name.as_str(),\n            self.to.name.as_str()\n        )\n    }\n}\n\nimpl PartialEq for SuspectDependency {\n    fn eq(&self, other: &Self) -> bool {\n        // `true` if two `SuspectDependency` share the same names `from`s and `to`s, ignoring package versions.\n        self.from.name == other.from.name && self.to.name == other.to.name\n    }\n}\n\nimpl Eq for SuspectDependency {}\n\nimpl Hash for SuspectDependency {\n    fn hash<H: Hasher>(&self, state: &mut H) {\n        self.from.name.as_str().hash(state);\n        self.to.name.as_str().hash(state);\n    }\n}\n\nimpl SuspectDependency {\n    fn new(from: Package, to: Package) -> Self {\n        Self { from, to }\n    }\n}\n\n// Creates a `Package` where only the package name matters, while the other the fields do not matter\n//\n// An example of this is the equality of two `SuspectDependency` instances that relies solely on package names.\nfn package_with_name(name: &str) -> Package {\n    Package {\n        name: Name::from_str(name).expect(\"valid package name\"),\n        version: Version::new(0, 0, 1),\n        source: None,\n        checksum: None,\n        dependencies: vec![],\n        replace: None,\n    }\n}\n\n// The tool has a limitation where `audit` may report false positives based on the contents of a lockfile.\n// For example, if a section of the file appears as follows:\n//\n//   pin-project v1.1.5\n//   ├── tower v0.4.13\n//   │   ├── aws-smithy-experimental v0.1.4\n//   │   ├── aws-smithy-http-server v0.63.3\n//   │   │   └── aws-smithy-http-server-python v0.63.2\n//   │   ├── aws-smithy-http-server-python v0.63.2\n//   ...\n//\n// The tool cannot identify which dependent crate of `tower` enables `tower`'s Cargo feature to include `pin-project`.\n// In the case above, `aws-smithy-experimental` does not enable this feature, while `aws-smithy-http-server` does.\n// When `aws-smithy-experimental` is compiled alone for a generated SDK without server-related Smithy runtime crates,\n// `pin-project` will not appear in the SDK lockfile. Therefore, the claim that `aws-smithy-experimental` depends\n// on `pin-project` in the above section is incorrect, and we need to teach the tool to recognize this.\n//\n// The following set serves as an allowlist whose entries should not be reported as audit errors.\nstatic FALSE_POSITIVES: LazyLock<HashSet<SuspectDependency>> = LazyLock::new(|| {\n    include_str!(\"../false-positives.txt\")\n        .lines()\n        .map(|line| {\n            let parts: Vec<&str> = line.split(\"->\").map(|s| s.trim()).collect();\n            SuspectDependency::new(package_with_name(parts[0]), package_with_name(parts[1]))\n        })\n        .collect()\n});\n\n// A list of the names of AWS runtime crates (crate versions do not need to match) must be in sync with\n// https://github.com/smithy-lang/smithy-rs/blob/0f9b9aba386ea3063912a0464ba6a1fd7c596018/buildSrc/src/main/kotlin/CrateSet.kt#L42-L53\nconst AWS_SDK_RUNTIMES: &[&str] = &[\n    \"aws-config\",\n    \"aws-credential-types\",\n    \"aws-runtime\",\n    \"aws-runtime-api\",\n    \"aws-sigv4\",\n    \"aws-types\",\n];\n\n// A list of the names of server specific runtime crates (crate versions do not need to match) must be in sync with\n// https://github.com/smithy-lang/smithy-rs/blob/main/buildSrc/src/main/kotlin/CrateSet.kt#L42\nconst SERVER_SPECIFIC_RUNTIMES: &[&str] = &[\n    \"aws-smithy-http-server\",\n    \"aws-smithy-http-server-metrics\",\n    \"aws-smithy-http-server-metrics-macro\",\n    \"aws-smithy-http-server-python\",\n    \"aws-smithy-http-server-typescript\",\n    \"aws-smithy-legacy-http-server\",\n];\n\nfn new_dependency_for_aws_sdk(crate_name: &str) -> bool {\n    AWS_SDK_RUNTIMES.contains(&crate_name)\n        || (crate_name.starts_with(\"aws-smithy-\")\n            && !SERVER_SPECIFIC_RUNTIMES.contains(&crate_name))\n}\n\n// Recursively traverses a chain of dependencies originating from a potential new dependency, populating\n// `suspect_dependencies` as it encounters a runtime crates used by the AWS SDK that appear to consume\n// `target_package`.\nfn is_consumed_by_aws_sdk(\n    graph: &Graph,\n    target_package: &Package,\n    node_index: NodeIndex,\n    suspect_dependencies: &mut HashSet<SuspectDependency>,\n    visited: &mut HashSet<NodeIndex>,\n) {\n    if !visited.insert(node_index) {\n        return;\n    }\n\n    let consumers = graph\n        .edges_directed(\n            node_index,\n            cargo_lock::dependency::graph::EdgeDirection::Incoming,\n        )\n        .map(|edge| edge.source())\n        .collect::<Vec<_>>();\n\n    for consumer_node_index in consumers.iter() {\n        let package = &graph[*consumer_node_index];\n        tracing::debug!(\"visiting `{}`\", package.name.as_str());\n        if new_dependency_for_aws_sdk(package.name.as_str()) {\n            suspect_dependencies.insert(SuspectDependency::new(\n                package.clone(),\n                target_package.clone(),\n            ));\n        }\n        is_consumed_by_aws_sdk(\n            graph,\n            target_package,\n            *consumer_node_index,\n            suspect_dependencies,\n            visited,\n        )\n    }\n}\n\n// Collects a set of `SuspectDependency` instances as it encounters cases where `target_package` appearing in `lockfile`\n// is introduced by a runtime crate used by the AWS SDK, whether directly or indirectly\nfn collect_suspect_dependencies(\n    lockfile: &Lockfile,\n    target_package: &Package,\n) -> HashSet<SuspectDependency> {\n    let target_package_name = target_package.name.as_str();\n    tracing::debug!(\n            \"`{}` is not recorded in the SDK lockfile. Verifying whether it is a new dependency for the AWS SDK...\",\n            target_package_name\n    );\n    let tree = lockfile.dependency_tree().unwrap();\n    let package = lockfile\n        .packages\n        .iter()\n        .find(|pkg| pkg.name.as_str() == target_package_name)\n        .expect(\"{target_package_name} must be in dependencies listed in `lockfile`\");\n    let indices = vec![tree.nodes()[&package.into()]];\n\n    let mut suspect_dependencies = HashSet::new();\n\n    for index in &indices {\n        let mut visited: HashSet<NodeIndex> = HashSet::new();\n        tracing::debug!(\n            \"traversing a dependency chain for `{}`...\",\n            target_package_name\n        );\n        is_consumed_by_aws_sdk(\n            tree.graph(),\n            target_package,\n            *index,\n            &mut suspect_dependencies,\n            &mut visited,\n        );\n    }\n\n    suspect_dependencies\n}\n\n// Verifies if all dependencies listed in `runtime_lockfile` are present in `sdk_dependency_set` and returns a set of\n// `SuspectDependency` instances after consulting the set against the provided `false_positives`\n//\n// Each entry in this set indicates that a crate represented by `SuspectDependency::to` will be reported as an audit\n// error, saying it appears in `runtime_lockfile` but is not covered by the SDK lockfile\n//\n// This check is based solely on crate names, ignoring other metadata such as versions or sources.\nfn audit_runtime_lockfile_covered_by_sdk_lockfile<'a>(\n    runtime_lockfile: &'a Lockfile,\n    sdk_dependency_set: &'a HashSet<&str>,\n    false_positives: Option<&HashSet<SuspectDependency>>,\n) -> HashSet<SuspectDependency> {\n    let mut suspect_dependencies = HashSet::new();\n    for package in &runtime_lockfile.packages {\n        if !sdk_dependency_set.contains(package.name.as_str()) {\n            suspect_dependencies\n                .extend(collect_suspect_dependencies(runtime_lockfile, package).into_iter());\n        }\n    }\n    if let Some(false_positives) = false_positives {\n        suspect_dependencies.retain(|dep| !false_positives.contains(dep));\n    }\n    suspect_dependencies\n}\n\nfn lockfile_for(\n    smithy_rs_root: PathBuf,\n    relative_path_to_lockfile: &str,\n) -> Result<(Lockfile, &str)> {\n    let mut lockfile = smithy_rs_root;\n    lockfile.push(relative_path_to_lockfile);\n    Ok((\n        Lockfile::load(lockfile).with_context(|| {\n            format!(\"failed to crate a `Lockfile` for {relative_path_to_lockfile}\")\n        })?,\n        relative_path_to_lockfile,\n    ))\n}\n\npub(super) fn audit(args: AuditArgs) -> Result<()> {\n    let cwd = if let Some(smithy_rs_path) = args.smithy_rs_path {\n        smithy_rs_path\n    } else {\n        env::current_dir().context(\"failed to get current working directory\")?\n    };\n    let smithy_rs_root = find_git_repository_root(\"smithy-rs\", cwd).context(here!())?;\n\n    let (sdk_lockfile, _) = lockfile_for(smithy_rs_root.clone(), \"aws/sdk/Cargo.lock\")?;\n    let sdk_dependency_set = sdk_lockfile\n        .packages\n        .iter()\n        .map(|p| p.name.as_str())\n        .collect::<HashSet<_>>();\n\n    let runtime_lockfiles = [\n        lockfile_for(smithy_rs_root.clone(), \"rust-runtime/Cargo.lock\")?,\n        lockfile_for(smithy_rs_root.clone(), \"aws/rust-runtime/Cargo.lock\")?,\n        lockfile_for(smithy_rs_root, \"aws/rust-runtime/aws-config/Cargo.lock\")?,\n    ];\n\n    let mut crates_to_report: Vec<(Package, Package, &str)> = Vec::new();\n    let mut all_suspect_dependencies: HashSet<SuspectDependency> = HashSet::new();\n\n    for (runtime_lockfile, path) in &runtime_lockfiles {\n        tracing::info!(\n            \"checking whether `{}` is covered by the SDK lockfile...\",\n            path\n        );\n\n        let mut crates_uncovered_by_sdk = audit_runtime_lockfile_covered_by_sdk_lockfile(\n            runtime_lockfile,\n            &sdk_dependency_set,\n            None,\n        );\n        all_suspect_dependencies.extend(crates_uncovered_by_sdk.iter().cloned());\n        crates_uncovered_by_sdk.retain(|dep| !FALSE_POSITIVES.contains(dep));\n\n        crates_to_report.extend(\n            crates_uncovered_by_sdk\n                .into_iter()\n                .map(|c| (c.from, c.to, *path)),\n        );\n    }\n\n    // Warn about false-positive entries that are no longer needed\n    for fp in FALSE_POSITIVES.difference(&all_suspect_dependencies) {\n        tracing::warn!(\"{fp:?} may potentially be removed from `false-positives.txt`\");\n    }\n\n    if crates_to_report.is_empty() {\n        println!(\"SUCCESS\");\n        Ok(())\n    } else {\n        for (from, to, origin_lockfile) in &crates_to_report {\n            eprintln!(\n                \"`{}` ({}), used by `{}`, is not contained in the SDK lockfile! (brought in by `{}`)\",\n                to.name.as_str(),\n                to.version,\n                origin_lockfile,\n                from.name.as_str(),\n            );\n        }\n        bail!(\"there are lockfile audit failures\")\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use itertools::Itertools;\n    use std::str::FromStr;\n    use tracing_test::traced_test;\n\n    // For simplicity, return an SDK dependency set with a small subset of crates. If a runtime crate used by\n    // subsequent tests is omitted, it will not affect the functionality of the system under test,\n    // `audit_runtime_lockfile_covered_by_sdk_lockfile`.\n    fn sdk_dependency_set() -> HashSet<&'static str> {\n        let mut result = HashSet::new();\n        result.insert(\"aws-credential-types\");\n        result.insert(\"aws-sigv4\");\n        result.insert(\"aws-smithy-cbor\");\n        result.insert(\"aws-smithy-runtime\");\n        result.insert(\"fastrand\");\n        result.insert(\"zeroize\");\n        result\n    }\n\n    #[test]\n    fn dependency_is_covered_by_sdk() {\n        let runtime_lockfile = Lockfile::from_str(\n            r#\"\n[[package]]\nname = \"aws-credential-types\"\nversion = \"1.2.1\"\ndependencies = [\n \"zeroize\",\n]\n\n[[package]]\nname = \"aws-smithy-runtime\"\nversion = \"1.7.1\"\nsource = \"registry+https://github.com/rust-lang/crates.io-index\"\nchecksum = \"d1ce695746394772e7000b39fe073095db6d45a862d0767dd5ad0ac0d7f8eb87\"\ndependencies = [\n \"fastrand\",\n]\n\n[[package]]\nname = \"fastrand\"\nversion = \"2.0.2\"\nsource = \"registry+https://github.com/rust-lang/crates.io-index\"\nchecksum = \"658bd65b1cf4c852a3cc96f18a8ce7b5640f6b703f905c7d74532294c2a63984\"\n\n[[package]]\nname = \"zeroize\"\nversion = \"1.8.1\"\nsource = \"registry+https://github.com/rust-lang/crates.io-index\"\nchecksum = \"ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde\"\n\"#,\n        )\n        .unwrap();\n\n        assert!(audit_runtime_lockfile_covered_by_sdk_lockfile(\n            &runtime_lockfile,\n            &sdk_dependency_set(),\n            None,\n        )\n        .is_empty());\n    }\n\n    #[test]\n    fn new_dependency_but_introduced_by_crate_irrelevant_to_sdk() {\n        let runtime_lockfile = Lockfile::from_str(\n            r#\"\n[[package]]\nname = \"aws-smithy-http-server-python\"\nversion = \"0.63.2\"\ndependencies = [\n \"pyo3-asyncio\",\n]\n\n[[package]]\nname = \"pyo3-asyncio\"\nversion = \"0.18.0\"\nsource = \"registry+https://github.com/rust-lang/crates.io-index\"\nchecksum = \"d3564762e37035cfc486228e10b0528460fa026d681b5763873c693aa0d5c260\"\ndependencies = [\n \"inventory\",\n]\n\n[[package]]\nname = \"inventory\"\nversion = \"0.3.15\"\nsource = \"registry+https://github.com/rust-lang/crates.io-index\"\nchecksum = \"f958d3d68f4167080a18141e10381e7634563984a537f2a49a30fd8e53ac5767\"\n\"#,\n        )\n        .unwrap();\n\n        assert!(audit_runtime_lockfile_covered_by_sdk_lockfile(\n            &runtime_lockfile,\n            &sdk_dependency_set(),\n            None,\n        )\n        .is_empty());\n    }\n\n    #[test]\n    fn new_dependency_for_sdk() {\n        // New dependencies originating from the smithy runtime crates\n        {\n            let runtime_lockfile = Lockfile::from_str(\n                r#\"\n[[package]]\nname = \"aws-smithy-cbor\"\nversion = \"0.60.7\"\ndependencies = [\n \"minicbor\",\n]\n\n[[package]]\nname = \"aws-smithy-compression\"\nversion = \"0.0.1\"\ndependencies = [\n \"flate2\"\n]\n\n[[package]]\nname = \"flate2\"\nversion = \"1.0.33\"\nsource = \"registry+https://github.com/rust-lang/crates.io-index\"\nchecksum = \"324a1be68054ef05ad64b861cc9eaf1d623d2d8cb25b4bf2cb9cdd902b4bf253\"\n\n[[package]]\nname = \"minicbor\"\nversion = \"0.24.2\"\nsource = \"registry+https://github.com/rust-lang/crates.io-index\"\nchecksum = \"5f8e213c36148d828083ae01948eed271d03f95f7e72571fa242d78184029af2\"\n\"#,\n            )\n            .unwrap();\n\n            assert_eq!(\n                vec![\"flate2\", \"minicbor\"],\n                audit_runtime_lockfile_covered_by_sdk_lockfile(\n                    &runtime_lockfile,\n                    &sdk_dependency_set(),\n                    None,\n                )\n                .into_iter()\n                .map(|suspect_dependency| suspect_dependency.to.name.as_str().to_owned())\n                .sorted()\n                .collect::<Vec<_>>(),\n            );\n        }\n\n        // New dependencies originating from the AWS runtime crates\n        {\n            let runtime_lockfile = Lockfile::from_str(\n                r#\"\n[[package]]\nname = \"aws-credential-types\"\nversion = \"1.2.1\"\ndependencies = [\n \"zeroize\",\n]\n\n[[package]]\nname = \"aws-sigv4\"\nversion = \"1.2.3\"\ndependencies = [\n \"ahash\",\n \"aws-credential-types\",\n \"lru\",\n \"p256\",\n]\n\n[[package]]\nname = \"ahash\"\nversion = \"0.8.11\"\nsource = \"registry+https://github.com/rust-lang/crates.io-index\"\nchecksum = \"e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011\"\ndependencies = [\n \"zerocopy\",\n]\n\n[[package]]\nname = \"hashbrown\"\nversion = \"0.14.5\"\nsource = \"registry+https://github.com/rust-lang/crates.io-index\"\nchecksum = \"e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1\"\ndependencies = [\n \"ahash\",\n]\n\n[[package]]\nname = \"lru\"\nversion = \"0.12.4\"\nsource = \"registry+https://github.com/rust-lang/crates.io-index\"\nchecksum = \"37ee39891760e7d94734f6f63fedc29a2e4a152f836120753a72503f09fcf904\"\ndependencies = [\n \"hashbrown\",\n]\n\n[[package]]\nname = \"p256\"\nversion = \"0.11.1\"\nsource = \"registry+https://github.com/rust-lang/crates.io-index\"\nchecksum = \"51f44edd08f51e2ade572f141051021c5af22677e42b7dd28a88155151c33594\"\n\n[[package]]\nname = \"zerocopy\"\nversion = \"0.7.35\"\nsource = \"registry+https://github.com/rust-lang/crates.io-index\"\nchecksum = \"1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0\"\n\n[[package]]\nname = \"zeroize\"\nversion = \"1.8.1\"\nsource = \"registry+https://github.com/rust-lang/crates.io-index\"\nchecksum = \"ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde\"\n\"#,\n            )\n            .unwrap();\n\n            assert_eq!(\n                vec![\"ahash\", \"hashbrown\", \"lru\", \"p256\", \"zerocopy\"],\n                audit_runtime_lockfile_covered_by_sdk_lockfile(\n                    &runtime_lockfile,\n                    &sdk_dependency_set(),\n                    None,\n                )\n                .into_iter()\n                .map(|suspect_dependency| suspect_dependency.to.name.as_str().to_owned())\n                .sorted()\n                .collect::<Vec<_>>(),\n            );\n        }\n    }\n\n    #[test]\n    fn test_false_positives() {\n        let mut sdk_dependency_set = HashSet::new();\n        sdk_dependency_set.insert(\"aws-smithy-experimental\");\n        sdk_dependency_set.insert(\"tower\");\n\n        let runtime_lockfile = Lockfile::from_str(\n            r#\"\n[[package]]\nname = \"aws-smithy-experimental\"\nversion = \"0.1.4\"\ndependencies = [\n \"tower\",\n]\n\n[[package]]\nname = \"aws-smithy-http-server\"\nversion = \"0.63.2\"\ndependencies = [\n \"tower\",\n]\n\n[[package]]\nname = \"tower\"\nversion = \"0.4.13\"\nsource = \"registry+https://github.com/rust-lang/crates.io-index\"\nchecksum = \"b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c\"\ndependencies = [\n \"pin-project\",\n]\n\n[[package]]\nname = \"pin-project\"\nversion = \"1.1.5\"\nsource = \"registry+https://github.com/rust-lang/crates.io-index\"\nchecksum = \"b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3\"\n\"#,\n        )\n        .unwrap();\n\n        let mut false_positives = HashSet::new();\n        false_positives.insert(SuspectDependency::new(\n            package_with_name(\"aws-smithy-experimental\"),\n            package_with_name(\"pin-project\"),\n        ));\n\n        assert!(audit_runtime_lockfile_covered_by_sdk_lockfile(\n            &runtime_lockfile,\n            &sdk_dependency_set,\n            Some(&false_positives),\n        )\n        .is_empty());\n    }\n\n    #[test]\n    #[traced_test]\n    fn test_warning_issued_when_false_positive_is_no_longer_false_positive() {\n        let mut sdk_dependency_set = HashSet::new();\n        sdk_dependency_set.insert(\"aws-smithy-experimental\");\n        sdk_dependency_set.insert(\"tower\");\n        sdk_dependency_set.insert(\"pin-project\"); // include `pin-project` in the SDK lockfile\n\n        let runtime_lockfile = Lockfile::from_str(\n            r#\"\n[[package]]\nname = \"aws-smithy-experimental\"\nversion = \"0.1.4\"\ndependencies = [\n \"tower\",\n]\n\n[[package]]\nname = \"aws-smithy-http-server\"\nversion = \"0.63.2\"\ndependencies = [\n \"tower\",\n]\n\n[[package]]\nname = \"tower\"\nversion = \"0.4.13\"\nsource = \"registry+https://github.com/rust-lang/crates.io-index\"\nchecksum = \"b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c\"\ndependencies = [\n \"pin-project\",\n]\n\n[[package]]\nname = \"pin-project\"\nversion = \"1.1.5\"\nsource = \"registry+https://github.com/rust-lang/crates.io-index\"\nchecksum = \"b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3\"\n\"#,\n        )\n        .unwrap();\n\n        let mut false_positives = HashSet::new();\n        false_positives.insert(SuspectDependency::new(\n            package_with_name(\"aws-smithy-experimental\"),\n            package_with_name(\"pin-project\"),\n        ));\n\n        assert!(audit_runtime_lockfile_covered_by_sdk_lockfile(\n            &runtime_lockfile,\n            &sdk_dependency_set,\n            Some(&false_positives),\n        )\n        .is_empty());\n\n        assert!(logs_contain(\"may potentially be removed from\"));\n    }\n}\n"
  },
  {
    "path": "tools/ci-build/sdk-lockfiles/src/main.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse anyhow::Result;\nuse clap::Parser;\nuse std::path::PathBuf;\nuse tracing_subscriber::{filter::LevelFilter, EnvFilter};\n\nmod audit;\n\n#[derive(clap::Args, Clone)]\npub struct AuditArgs {\n    /// Path to smithy-rs. Defaults to current working directory.\n    #[arg(long)]\n    smithy_rs_path: Option<PathBuf>,\n}\n\n#[derive(clap::Parser, Clone)]\n#[clap(author, version, about)]\nenum Command {\n    Audit(AuditArgs),\n}\n\nfn main() -> Result<()> {\n    tracing_subscriber::fmt()\n        .with_writer(std::io::stderr)\n        .with_env_filter(\n            EnvFilter::builder()\n                .with_default_directive(LevelFilter::INFO.into())\n                .from_env_lossy(),\n        )\n        .init();\n\n    let command = Command::parse();\n    match command {\n        Command::Audit(args) => audit::audit(args),\n    }\n}\n"
  },
  {
    "path": "tools/ci-build/sdk-versioner/Cargo.toml",
    "content": "[package]\nname = \"sdk-versioner\"\nversion = \"0.1.1\"\nauthors = [\"AWS Rust SDK Team <aws-sdk-rust@amazon.com>\"]\nedition = \"2021\"\nlicense = \"Apache-2.0\"\npublish = false\n\n[workspace]\n\n[profile.release]\n# prefer fast compile time over runtime performance\nopt-level = 0\n\n[dependencies]\nanyhow = \"1.0\"\nclap = { version = \"~3.1.18\", features = [\"derive\"] }\npathdiff = \"0.2.1\"\nsmithy-rs-tool-common = { version = \"0.1\", path = \"../smithy-rs-tool-common\" }\ntoml_edit = { version = \"0.22\" }\n\n[dev-dependencies]\npretty_assertions = \"1.3\"\ntempfile = \"3.16.0\"\n"
  },
  {
    "path": "tools/ci-build/sdk-versioner/README.md",
    "content": "sdk-versioner\n============\n\nThis is a CLI tool that will recursively update all references to the AWS Rust SDK\nin Cargo.toml files in a given directory. That is, it finds every Cargo.toml file nested\nwithin that directory, and modifies dependency lines that point to the AWS Rust SDK\nor its supporting crates. These dependencies can be updated to be based on file-system\npath, crates.io version, or both.\n\nThis tool is currently used to update all the dependencies of all examples to refer to the latest SDK version. See [aws/sdk/build.gradle.kts](../../../aws/sdk/build.gradle.kts) for more context.\n"
  },
  {
    "path": "tools/ci-build/sdk-versioner/src/main.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse anyhow::{bail, Context, Result};\nuse clap::Parser;\nuse smithy_rs_tool_common::ci::{is_in_example_dir, is_preview_build};\nuse smithy_rs_tool_common::package::{PackageCategory, SDK_PREFIX};\nuse smithy_rs_tool_common::versions_manifest::VersionsManifest;\nuse std::ffi::OsStr;\nuse std::fs;\nuse std::path::{Path, PathBuf};\nuse std::time::Instant;\nuse toml_edit::{DocumentMut, InlineTable, Item, Table, TableLike, Value};\n\n#[derive(Parser, Debug)]\n#[clap(\n    name = \"sdk-versioner\",\n    about = \"CLI tool to recursively update SDK/Smithy crate references in Cargo.toml files\",\n    version\n)]\n#[allow(clippy::enum_variant_names)] // Want the \"use\" prefix in the CLI subcommand names for clarity\nenum Args {\n    /// Revise crates to use paths in dependencies\n    UsePathDependencies {\n        /// Root SDK path the path dependencies will be based off of\n        #[clap(long)]\n        sdk_path: PathBuf,\n        /// Path(s) to recursively update Cargo.toml files in\n        #[clap()]\n        crate_paths: Vec<PathBuf>,\n    },\n    /// Revise crates to use version numbers in dependencies\n    UseVersionDependencies {\n        /// Path to a `versions.toml` file with crate versions to use\n        #[clap(long)]\n        versions_toml: PathBuf,\n        /// Path(s) to recursively update Cargo.toml files in\n        #[clap()]\n        crate_paths: Vec<PathBuf>,\n    },\n    /// Revise crates to use version numbers AND paths in dependencies\n    UsePathAndVersionDependencies {\n        /// Root SDK path the path dependencies will be based off of\n        #[clap(long)]\n        sdk_path: PathBuf,\n        /// Path to a `versions.toml` file with crate versions to use\n        #[clap(long)]\n        versions_toml: PathBuf,\n        /// Path(s) to recursively update Cargo.toml files in\n        #[clap()]\n        crate_paths: Vec<PathBuf>,\n    },\n}\n\nimpl Args {\n    fn crate_paths(&self) -> &[PathBuf] {\n        match self {\n            Self::UsePathDependencies { crate_paths, .. } => crate_paths,\n            Self::UseVersionDependencies { crate_paths, .. } => crate_paths,\n            Self::UsePathAndVersionDependencies { crate_paths, .. } => crate_paths,\n        }\n    }\n\n    fn validate(self) -> Result<Self> {\n        if self.crate_paths().is_empty() {\n            bail!(\"Must provide at least one crate path to recursively update\");\n        }\n        Ok(self)\n    }\n}\n\n// TODO(https://github.com/smithy-lang/smithy-rs/issues/2810): Remove `SdkPath` and just use a `PathBuf` with the new logic\n// This is only around for backwards compatibility for the next release's sync process0\nenum SdkPath {\n    /// Don't even attempt to resolve the correct relative path to dependencies\n    UseDumbLogic(PathBuf),\n    /// Resolve the correct relative path to dependencies\n    UseNewLogic(PathBuf),\n}\nimpl From<&PathBuf> for SdkPath {\n    fn from(value: &PathBuf) -> Self {\n        if !value.exists() {\n            SdkPath::UseDumbLogic(value.into())\n        } else {\n            SdkPath::UseNewLogic(value.into())\n        }\n    }\n}\n\nstruct DependencyContext {\n    sdk_path: Option<SdkPath>,\n    versions_manifest: Option<VersionsManifest>,\n}\n\nfn main() -> Result<()> {\n    let args = Args::parse().validate()?;\n    let dependency_context = match &args {\n        Args::UsePathDependencies { sdk_path, .. } => DependencyContext {\n            sdk_path: Some(sdk_path.into()),\n            versions_manifest: None,\n        },\n        Args::UseVersionDependencies { versions_toml, .. } => DependencyContext {\n            sdk_path: None,\n            versions_manifest: Some(VersionsManifest::from_file(versions_toml)?),\n        },\n        Args::UsePathAndVersionDependencies {\n            sdk_path,\n            versions_toml,\n            ..\n        } => DependencyContext {\n            sdk_path: Some(sdk_path.into()),\n            versions_manifest: Some(VersionsManifest::from_file(versions_toml)?),\n        },\n    };\n\n    // In the case of a preview build we avoid updating the examples directories since\n    // we only generate the single preview SDK, so most SDKs referred to in the examples\n    // will be missing\n    if is_preview_build() && is_in_example_dir(&args.crate_paths()[0]) {\n        return Ok(());\n    }\n\n    let start_time = Instant::now();\n    let mut manifest_paths = Vec::new();\n    for crate_path in args.crate_paths() {\n        discover_manifests(&mut manifest_paths, crate_path)?;\n    }\n\n    for manifest_path in manifest_paths {\n        update_manifest(&manifest_path, &dependency_context)?;\n    }\n\n    println!(\"Finished in {:?}\", start_time.elapsed());\n    Ok(())\n}\n\nfn update_manifest(\n    manifest_path: &Path,\n    dependency_context: &DependencyContext,\n) -> anyhow::Result<()> {\n    println!(\"Updating {manifest_path:?}...\");\n    let crate_path = manifest_path.parent().expect(\"manifest has a parent\");\n\n    let mut metadata: DocumentMut = String::from_utf8(\n        fs::read(manifest_path).with_context(|| format!(\"failed to read {manifest_path:?}\"))?,\n    )\n    .with_context(|| format!(\"{manifest_path:?} has invalid UTF-8\"))?\n    .parse::<DocumentMut>()\n    .with_context(|| format!(\"failed to parse {manifest_path:?}\"))?;\n    let mut changed = false;\n    for set in [\"dependencies\", \"dev-dependencies\", \"build-dependencies\"] {\n        if let Some(dependencies) = metadata.get_mut(set) {\n            if !dependencies.is_table() {\n                bail!(\"Unexpected non-table value named `{set}` in {manifest_path:?}\");\n            }\n            changed = update_dependencies(\n                dependencies.as_table_like_mut().unwrap(),\n                dependency_context,\n                crate_path,\n            )? || changed;\n        }\n    }\n\n    if changed {\n        fs::write(manifest_path, metadata.to_string())?;\n    }\n\n    Ok(())\n}\n\nfn update_dependencies(\n    dependencies: &mut dyn TableLike,\n    dependency_context: &DependencyContext,\n    crate_path: &Path,\n) -> Result<bool> {\n    let mut changed = false;\n    for (key, value) in dependencies.iter_mut() {\n        let crate_name = extract_real_crate_name(&key, value);\n\n        let category = PackageCategory::from_package_name(&crate_name);\n        if !matches!(category, PackageCategory::Unknown) {\n            let old_value = match value {\n                Item::Table(table) => table.clone(),\n                Item::Value(Value::InlineTable(inline)) => inline.clone().into_table(),\n                _ => Table::new(),\n            };\n            *value = Item::Value(Value::InlineTable(updated_dependency_value(\n                &crate_name,\n                old_value,\n                dependency_context,\n                crate_path,\n            )?));\n            changed = true;\n        }\n    }\n    Ok(changed)\n}\n\n/// Extracts the real name of the underlying crate when the dependency has an alias\nfn extract_real_crate_name(key: &toml_edit::KeyMut, value: &Item) -> String {\n    match value {\n        Item::Value(Value::InlineTable(inline_table)) => {\n            if let Some(Value::String(real_package)) = inline_table.get(\"package\") {\n                real_package.value()\n            } else {\n                key.get()\n            }\n        }\n        Item::Table(table) => {\n            if let Some(Item::Value(Value::String(real_package))) = table.get(\"package\") {\n                real_package.value()\n            } else {\n                key.get()\n            }\n        }\n        _ => key.get(),\n    }\n    .to_string()\n}\n\nfn crate_path_name(name: &str) -> &str {\n    if matches!(\n        PackageCategory::from_package_name(name),\n        PackageCategory::AwsSdk\n    ) {\n        &name[SDK_PREFIX.len()..]\n    } else {\n        name\n    }\n}\n\nfn updated_dependency_value(\n    dependency_name: &str,\n    old_value: Table,\n    dependency_context: &DependencyContext,\n    crate_path: &Path,\n) -> Result<InlineTable> {\n    let crate_path = crate_path\n        .canonicalize()\n        .context(\"failed to canonicalize crate path\")?;\n    let mut value = old_value;\n\n    // Remove keys that will be replaced\n    value.remove(\"git\");\n    value.remove(\"branch\");\n    value.remove(\"version\");\n    value.remove(\"path\");\n\n    // Set the `path` if one was given\n    match &dependency_context.sdk_path {\n        Some(SdkPath::UseDumbLogic(sdk_path)) => {\n            let crate_path = sdk_path.join(crate_path_name(dependency_name));\n            value[\"path\"] = toml_edit::value(\n                crate_path\n                    .as_os_str()\n                    .to_str()\n                    .expect(\"valid utf-8 path\")\n                    .to_string(),\n            );\n        }\n        Some(SdkPath::UseNewLogic(sdk_path)) => {\n            let dependency_path = sdk_path\n                .join(crate_path_name(dependency_name))\n                .canonicalize()\n                .context(format!(\"failed to canonicalize sdk_path: {sdk_path:#?} with dependency_name: {dependency_name}\"))?;\n            if let Some(relative_path) = pathdiff::diff_paths(&dependency_path, &crate_path) {\n                value[\"path\"] = toml_edit::value(\n                    relative_path\n                        .as_os_str()\n                        .to_str()\n                        .expect(\"valid utf-8 path\")\n                        .to_string(),\n                );\n            } else {\n                bail!(\"Failed to create relative path from {crate_path:?} to {dependency_path:?}\");\n            }\n        }\n        _ => {}\n    }\n\n    // Set the `version` if one was given\n    if let Some(manifest) = &dependency_context.versions_manifest {\n        if let Some(crate_metadata) = manifest.crates.get(dependency_name) {\n            value[\"version\"] = toml_edit::value(crate_metadata.version.clone());\n        } else {\n            bail!(\"Crate `{dependency_name}` was missing from the `versions.toml`\");\n        }\n    }\n\n    value.sort_values_by(|a, _, b, _| b.cmp(a));\n    Ok(value.into_inline_table())\n}\n\n/// Recursively discovers Cargo.toml files in the given `path` and adds them to `manifests`.\nfn discover_manifests(manifests: &mut Vec<PathBuf>, path: impl AsRef<Path>) -> anyhow::Result<()> {\n    let path = path.as_ref();\n\n    for entry in fs::read_dir(path)? {\n        let entry = entry?;\n        if entry.path().is_dir() {\n            discover_manifests(manifests, entry.path())?;\n        } else if entry.path().is_file()\n            && entry.path().file_name() == Some(OsStr::new(\"Cargo.toml\"))\n        {\n            manifests.push(entry.path());\n        }\n    }\n\n    Ok(())\n}\n\n#[cfg(test)]\nmod tests {\n    use crate::{crate_path_name, update_manifest, DependencyContext, SdkPath};\n    use pretty_assertions::assert_eq;\n    use smithy_rs_tool_common::package::PackageCategory;\n    use smithy_rs_tool_common::versions_manifest::{CrateVersion, VersionsManifest};\n    use std::path::PathBuf;\n    use std::{fs, process};\n\n    fn versions_toml_for(crates: &[(&str, &str)]) -> VersionsManifest {\n        VersionsManifest {\n            smithy_rs_revision: \"doesntmatter\".into(),\n            aws_doc_sdk_examples_revision: None,\n            manual_interventions: Default::default(),\n            crates: crates\n                .iter()\n                .map(|&(name, version)| {\n                    (\n                        name.to_string(),\n                        CrateVersion {\n                            category: PackageCategory::from_package_name(name),\n                            version: version.into(),\n                            source_hash: \"doesntmatter\".into(),\n                            model_hash: None,\n                        },\n                    )\n                })\n                .collect(),\n            release: None,\n        }\n    }\n\n    const TEST_MANIFEST: &[u8] = br#\"\n[package]\nname = \"test\"\nversion = \"0.1.0\"\n\n# Some comment that should be preserved\n[dependencies]\naws-config = \"0.4.1\"\naws-sdk-s3 = \"0.4.1\"\naws-smithy-types = \"0.34.1\"\naws-smithy-http = { version = \"0.34.1\", features = [\"test-util\"] }\nsomething-else = { version = \"0.1\", no-default-features = true }\ntokio = { version = \"1.18\", features = [\"net\"] }\n\n[dev-dependencies.another-thing]\n# some comment\nversion = \"5.0\"\n# another comment\nfeatures = [\"foo\", \"baz\"]\n\"#;\n\n    #[track_caller]\n    fn test_with_context(\n        crate_path_rel: &str,\n        sdk_crates: &[&'static str],\n        context: DependencyContext,\n        expected: &[u8],\n    ) {\n        let temp_dir = tempfile::tempdir().unwrap();\n        let crate_path = temp_dir.path().join(crate_path_rel);\n        fs::create_dir_all(&crate_path).unwrap();\n\n        let manifest_path = crate_path.join(\"Cargo.toml\");\n        std::fs::write(&manifest_path, TEST_MANIFEST).unwrap();\n\n        if let Some(SdkPath::UseNewLogic(sdk_path)) = context.sdk_path.as_ref() {\n            for sdk_crate in sdk_crates {\n                let sdk_crate_path = temp_dir\n                    .path()\n                    .join(sdk_path)\n                    .join(crate_path_name(sdk_crate));\n                fs::create_dir_all(sdk_crate_path).unwrap();\n            }\n        }\n        // Assist with debugging when the tests fail\n        if let Ok(output) = process::Command::new(\"find\").arg(temp_dir.path()).output() {\n            println!(\n                \"Test directory structure:\\n{}\",\n                String::from_utf8_lossy(&output.stdout)\n            );\n        }\n\n        let fixed_context = if let Some(SdkPath::UseNewLogic(sdk_path)) = context.sdk_path.as_ref()\n        {\n            DependencyContext {\n                sdk_path: Some(SdkPath::UseNewLogic(temp_dir.path().join(sdk_path))),\n                versions_manifest: context.versions_manifest,\n            }\n        } else {\n            context\n        };\n        update_manifest(&manifest_path, &fixed_context).expect(\"success\");\n\n        let actual =\n            String::from_utf8(std::fs::read(&manifest_path).expect(\"read tmp file\")).unwrap();\n        let expected = std::str::from_utf8(expected).unwrap();\n        assert_eq!(expected, actual);\n    }\n\n    #[test]\n    fn update_dependencies_with_versions() {\n        test_with_context(\n            \"examples/foo\",\n            &[],\n            DependencyContext {\n                sdk_path: None,\n                versions_manifest: Some(versions_toml_for(&[\n                    (\"aws-config\", \"0.5.0\"),\n                    (\"aws-sdk-s3\", \"0.13.0\"),\n                    (\"aws-smithy-types\", \"0.10.0\"),\n                    (\"aws-smithy-http\", \"0.9.0\"),\n                ])),\n            },\n            br#\"\n[package]\nname = \"test\"\nversion = \"0.1.0\"\n\n# Some comment that should be preserved\n[dependencies]\naws-config = { version = \"0.5.0\" }\naws-sdk-s3 = { version = \"0.13.0\" }\naws-smithy-types = { version = \"0.10.0\" }\naws-smithy-http = { version = \"0.9.0\", features = [\"test-util\"] }\nsomething-else = { version = \"0.1\", no-default-features = true }\ntokio = { version = \"1.18\", features = [\"net\"] }\n\n[dev-dependencies.another-thing]\n# some comment\nversion = \"5.0\"\n# another comment\nfeatures = [\"foo\", \"baz\"]\n\"#,\n        );\n    }\n\n    #[test]\n    fn update_dependencies_with_paths() {\n        test_with_context(\n            \"path/to/test\",\n            &[\n                \"aws-config\",\n                \"aws-sdk-s3\",\n                \"aws-smithy-types\",\n                \"aws-smithy-http\",\n            ],\n            DependencyContext {\n                sdk_path: Some(SdkPath::UseNewLogic(PathBuf::from(\"sdk\"))),\n                versions_manifest: None,\n            },\n            br#\"\n[package]\nname = \"test\"\nversion = \"0.1.0\"\n\n# Some comment that should be preserved\n[dependencies]\naws-config = { path = \"../../../sdk/aws-config\" }\naws-sdk-s3 = { path = \"../../../sdk/s3\" }\naws-smithy-types = { path = \"../../../sdk/aws-smithy-types\" }\naws-smithy-http = { path = \"../../../sdk/aws-smithy-http\", features = [\"test-util\"] }\nsomething-else = { version = \"0.1\", no-default-features = true }\ntokio = { version = \"1.18\", features = [\"net\"] }\n\n[dev-dependencies.another-thing]\n# some comment\nversion = \"5.0\"\n# another comment\nfeatures = [\"foo\", \"baz\"]\n\"#,\n        );\n    }\n\n    #[test]\n    fn update_dependencies_with_paths_dumb_logic() {\n        test_with_context(\n            \"path/to/test\",\n            &[\n                \"aws-config\",\n                \"aws-sdk-s3\",\n                \"aws-smithy-types\",\n                \"aws-smithy-http\",\n            ],\n            DependencyContext {\n                sdk_path: Some(SdkPath::UseDumbLogic(PathBuf::from(\"a/dumb/path/to\"))),\n                versions_manifest: None,\n            },\n            br#\"\n[package]\nname = \"test\"\nversion = \"0.1.0\"\n\n# Some comment that should be preserved\n[dependencies]\naws-config = { path = \"a/dumb/path/to/aws-config\" }\naws-sdk-s3 = { path = \"a/dumb/path/to/s3\" }\naws-smithy-types = { path = \"a/dumb/path/to/aws-smithy-types\" }\naws-smithy-http = { path = \"a/dumb/path/to/aws-smithy-http\", features = [\"test-util\"] }\nsomething-else = { version = \"0.1\", no-default-features = true }\ntokio = { version = \"1.18\", features = [\"net\"] }\n\n[dev-dependencies.another-thing]\n# some comment\nversion = \"5.0\"\n# another comment\nfeatures = [\"foo\", \"baz\"]\n\"#,\n        );\n    }\n\n    #[test]\n    fn update_dependencies_with_versions_and_paths() {\n        test_with_context(\n            \"deep/path/to/test\",\n            &[\n                \"aws-config\",\n                \"aws-sdk-s3\",\n                \"aws-smithy-types\",\n                \"aws-smithy-http\",\n            ],\n            DependencyContext {\n                sdk_path: Some(SdkPath::UseNewLogic(PathBuf::from(\"sdk\"))),\n                versions_manifest: Some(versions_toml_for(&[\n                    (\"aws-config\", \"0.5.0\"),\n                    (\"aws-sdk-s3\", \"0.13.0\"),\n                    (\"aws-smithy-types\", \"0.10.0\"),\n                    (\"aws-smithy-http\", \"0.9.0\"),\n                ])),\n            },\n            br#\"\n[package]\nname = \"test\"\nversion = \"0.1.0\"\n\n# Some comment that should be preserved\n[dependencies]\naws-config = { version = \"0.5.0\", path = \"../../../../sdk/aws-config\" }\naws-sdk-s3 = { version = \"0.13.0\", path = \"../../../../sdk/s3\" }\naws-smithy-types = { version = \"0.10.0\", path = \"../../../../sdk/aws-smithy-types\" }\naws-smithy-http = { version = \"0.9.0\", path = \"../../../../sdk/aws-smithy-http\", features = [\"test-util\"] }\nsomething-else = { version = \"0.1\", no-default-features = true }\ntokio = { version = \"1.18\", features = [\"net\"] }\n\n[dev-dependencies.another-thing]\n# some comment\nversion = \"5.0\"\n# another comment\nfeatures = [\"foo\", \"baz\"]\n\"#\n        );\n    }\n\n    #[test]\n    fn update_aliased_dependency_with_real_crate_name_inline_table() {\n        let temp_dir = tempfile::tempdir().unwrap();\n        let crate_path = temp_dir.path().join(\"test\");\n        fs::create_dir_all(&crate_path).unwrap();\n\n        let manifest_path = crate_path.join(\"Cargo.toml\");\n        std::fs::write(\n            &manifest_path,\n            br#\"\n[package]\nname = \"test\"\nversion = \"0.1.0\"\n\n[dependencies]\nconfig = { package = \"aws-config\", path = \"not/a/real/path\" }\n\"#,\n        )\n        .unwrap();\n\n        let context = DependencyContext {\n            sdk_path: None,\n            versions_manifest: Some(versions_toml_for(&[\n                (\"aws-config\", \"0.5.0\"),\n                (\"config\", \"1.0.0\"),\n            ])),\n        };\n\n        update_manifest(&manifest_path, &context).expect(\"success\");\n\n        let actual = std::fs::read_to_string(&manifest_path).unwrap();\n        let expected = r#\"\n[package]\nname = \"test\"\nversion = \"0.1.0\"\n\n[dependencies]\nconfig = { version = \"0.5.0\", package = \"aws-config\" }\n\"#;\n        assert_eq!(expected, actual);\n    }\n\n    #[test]\n    fn update_aliased_dependency_with_real_crate_name_table() {\n        let temp_dir = tempfile::tempdir().unwrap();\n        let crate_path = temp_dir.path().join(\"test\");\n        fs::create_dir_all(&crate_path).unwrap();\n\n        let manifest_path = crate_path.join(\"Cargo.toml\");\n        std::fs::write(\n            &manifest_path,\n            br#\"\n[package]\nname = \"test\"\nversion = \"0.1.0\"\n\n[dependencies.config]\npath = \"not/a/real/path\"\nfeatures = [\"rt-tokio\"]\npackage = \"aws-config\"\n\"#,\n        )\n        .unwrap();\n\n        let context = DependencyContext {\n            sdk_path: None,\n            versions_manifest: Some(versions_toml_for(&[\n                (\"aws-config\", \"0.5.0\"),\n                (\"config\", \"1.0.0\"),\n            ])),\n        };\n\n        update_manifest(&manifest_path, &context).expect(\"success\");\n\n        let actual = std::fs::read_to_string(&manifest_path).unwrap();\n        let expected = r#\"\n[package]\nname = \"test\"\nversion = \"0.1.0\"\n\n[dependencies]\nconfig= { version = \"0.5.0\", package = \"aws-config\", features = [\"rt-tokio\"] }\n\"#;\n        assert_eq!(expected, actual);\n    }\n}\n"
  },
  {
    "path": "tools/ci-build/smithy-rs-tool-common/Cargo.toml",
    "content": "[package]\nname = \"smithy-rs-tool-common\"\nversion = \"0.1.1\"\nauthors = [\"AWS Rust SDK Team <aws-sdk-rust@amazon.com>\"]\nedition = \"2021\"\nlicense = \"Apache-2.0\"\npublish = false\n\n[workspace]\n\n[features]\nasync = [\"tokio\"]\n\n[profile.release]\n# prefer fast compile time over runtime performance\nopt-level = 0\n\n[dependencies]\nanyhow = \"1\"\nasync-trait = \"0.1.74\"\ncargo_toml = \"0.19.2\"\ncrates-index = { version = \"2.5.1\", features = [\"sparse\"] }\nlazy_static = \"1\"\nregex = \"1.11.1\"\nreqwest = { version = \"0.11.10\", features = [\"blocking\"] }\nsemver = \"1\"\nserde = { version = \"1\", features = [\"derive\"] }\nserde_json = \"1\"\nserde_yaml = \"0.9\"\nthiserror = \"1.0.56\"\ntokio = { version = \"1.20.1\", features = [\"rt\", \"macros\"], optional = true }\ntoml = { version = \"0.5.8\", features = [\"preserve_order\"] }\ntracing = \"0.1\"\n\n[dev-dependencies]\ntempfile = \"3.16.0\"\ntokio = { version = \"1.20.1\", features = [\"rt\", \"macros\"] }\n"
  },
  {
    "path": "tools/ci-build/smithy-rs-tool-common/README.md",
    "content": "# smithy-rs-tool-common\nCommon shared libraries for runtime tooling\n"
  },
  {
    "path": "tools/ci-build/smithy-rs-tool-common/fake-cli/git-changed-files",
    "content": "#!/usr/bin/env python3\nimport os\nimport sys\n\nexpected = [os.path.realpath(\"/tmp\"), [\"diff\", \"--name-only\"]]\nactual = [os.getcwd(), sys.argv[1:]]\nif expected != actual:\n    print(f\"ERROR\\nExpect: {expected}\\nActual: {actual}\")\n    sys.exit(127)\n\nprint(\"some/file\")\nprint(\"some-other-file\")\nprint(\"some/file with spaces.txt\")\n"
  },
  {
    "path": "tools/ci-build/smithy-rs-tool-common/fake-cli/git-changed-files-empty",
    "content": "#!/usr/bin/env python3\nimport os\nimport sys\n\nexpected = [os.path.realpath(\"/tmp\"), [\"diff\", \"--name-only\"]]\nactual = [os.getcwd(), sys.argv[1:]]\nif expected != actual:\n    print(f\"ERROR\\nExpect: {expected}\\nActual: {actual}\")\n    sys.exit(127)\n"
  },
  {
    "path": "tools/ci-build/smithy-rs-tool-common/fake-cli/git-clone",
    "content": "#!/usr/bin/env python3\nimport os\nimport sys\n\nexpected = [os.path.realpath(\"/tmp\"), [\n    \"clone\", \"/tmp\",\n]]\nactual = [os.getcwd(), sys.argv[1:]]\nif expected != actual:\n    print(f\"ERROR\\nExpect: {expected}\\nActual: {actual}\")\n    sys.exit(1)\n"
  },
  {
    "path": "tools/ci-build/smithy-rs-tool-common/fake-cli/git-commit",
    "content": "#!/usr/bin/env python3\nimport os\nimport sys\n\nexpected = [os.path.realpath(\"/tmp\"), [\n    \"-c\", \"user.name=Some Author\",\n    \"-c\", \"user.email=author@example.com\",\n    \"commit\", \"-m\", \"Test message\",\n]]\nactual = [os.getcwd(), sys.argv[1:]]\nif expected != actual:\n    print(f\"ERROR\\nExpect: {expected}\\nActual: {actual}\")\n    sys.exit(1)\n"
  },
  {
    "path": "tools/ci-build/smithy-rs-tool-common/fake-cli/git-commit-on-behalf",
    "content": "#!/usr/bin/env python3\nimport os\nimport sys\n\nexpected = [os.path.realpath(\"/tmp\"), [\n    \"-c\", \"user.name=Bot Name\",\n    \"-c\", \"user.email=bot@example.com\",\n    \"commit\", \"-m\", \"Test message\",\n    \"--author\", \"Some Author <author@example.com>\"\n]]\nactual = [os.getcwd(), sys.argv[1:]]\nif expected != actual:\n    print(f\"ERROR\\nExpect: {expected}\\nActual: {actual}\")\n    sys.exit(1)\n"
  },
  {
    "path": "tools/ci-build/smithy-rs-tool-common/fake-cli/git-create-branch",
    "content": "#!/usr/bin/env python3\nimport os\nimport sys\n\nexpected = [os.path.realpath(\"/tmp\"), [\"branch\", \"test-branch-name\", \"test-revision\"]]\nactual = [os.getcwd(), sys.argv[1:]]\nif expected != actual:\n    print(f\"ERROR\\nExpect: {expected}\\nActual: {actual}\")\n    sys.exit(1)\n"
  },
  {
    "path": "tools/ci-build/smithy-rs-tool-common/fake-cli/git-current-branch-name",
    "content": "#!/usr/bin/env python3\nimport os\nimport sys\n\nexpected = [os.path.realpath(\"/tmp\"), [\"rev-parse\", \"--abbrev-ref\", \"HEAD\"]]\nactual = [os.getcwd(), sys.argv[1:]]\nif expected != actual:\n    print(f\"ERROR\\nExpect: {expected}\\nActual: {actual}\")\n    sys.exit(1)\n\nprint(\"some-branch-name\")\n"
  },
  {
    "path": "tools/ci-build/smithy-rs-tool-common/fake-cli/git-delete-branch",
    "content": "#!/usr/bin/env python3\nimport os\nimport sys\n\nexpected = [os.path.realpath(\"/tmp\"), [\"branch\", \"-D\", \"test-branch-name\"]]\nactual = [os.getcwd(), sys.argv[1:]]\nif expected != actual:\n    print(f\"ERROR\\nExpect: {expected}\\nActual: {actual}\")\n    sys.exit(1)\n"
  },
  {
    "path": "tools/ci-build/smithy-rs-tool-common/fake-cli/git-extract-commit-info",
    "content": "#!/usr/bin/env python3\nimport os\nimport sys\n\nexpected = [os.path.realpath(\"/tmp\"), [\"show\", \"-s\", \"test_revision\", \"--format=%H\"]]\nactual = [os.getcwd(), sys.argv[1:]]\nif expected != actual:\n    print(f\"ERROR\\nExpect: {expected}\\nActual: {actual}\")\n    sys.exit(1)\n\nprint(\"success\")\n"
  },
  {
    "path": "tools/ci-build/smithy-rs-tool-common/fake-cli/git-get-head-revision",
    "content": "#!/usr/bin/env python3\nimport os\nimport sys\n\nexpected = [os.path.realpath(\"/tmp\"), [\"rev-parse\", \"HEAD\"]]\nactual = [os.getcwd(), sys.argv[1:]]\nif expected != actual:\n    print(f\"ERROR\\nExpect: {expected}\\nActual: {actual}\")\n    sys.exit(1)\n\nprint(\"some-commit-hash\")\n"
  },
  {
    "path": "tools/ci-build/smithy-rs-tool-common/fake-cli/git-reset-hard",
    "content": "#!/usr/bin/env python3\nimport os\nimport sys\n\nexpected = [os.path.realpath(\"/tmp\"), [\"reset\", \"--hard\", \"some-revision\"]]\nactual = [os.getcwd(), sys.argv[1:]]\nif expected != actual:\n    print(f\"ERROR\\nExpect: {expected}\\nActual: {actual}\")\n    sys.exit(1)\n"
  },
  {
    "path": "tools/ci-build/smithy-rs-tool-common/fake-cli/git-rev-list",
    "content": "#!/usr/bin/env python3\nimport os\nimport sys\n\nexpected = [os.path.realpath(\"/tmp\"), [\"rev-list\", \"end_exclusive..start_inclusive\"]]\nactual = [os.getcwd(), sys.argv[1:]]\nif expected != actual:\n    print(f\"ERROR\\nExpect: {expected}\\nActual: {actual}\")\n    sys.exit(1)\n\nprint(\"second-commit\")\nprint(\"initial-commit\")\n"
  },
  {
    "path": "tools/ci-build/smithy-rs-tool-common/fake-cli/git-rev-list-path",
    "content": "#!/usr/bin/env python3\nimport os\nimport sys\n\nexpected = [os.path.realpath(\"/tmp\"), [\"rev-list\", \"end_exclusive..start_inclusive\", \"--\", \"some-path\"]]\nactual = [os.getcwd(), sys.argv[1:]]\nif expected != actual:\n    print(f\"ERROR\\nExpect: {expected}\\nActual: {actual}\")\n    sys.exit(1)\n\nprint(\"third-commit\")\nprint(\"second-commit\")\nprint(\"initial-commit\")\n"
  },
  {
    "path": "tools/ci-build/smithy-rs-tool-common/fake-cli/git-show",
    "content": "#!/usr/bin/env python3\nimport os\nimport sys\n\nexpected = [os.path.realpath(\"/tmp\"), [\"show\", \"-s\", \"test_revision\"]]\nactual = [os.getcwd(), sys.argv[1:-1]]\nif expected != actual:\n    print(f\"ERROR\\nExpect: {expected}\\nActual: {actual}\")\n    sys.exit(1)\n\nlast_arg = sys.argv[len(sys.argv) - 1]\nif not last_arg.startswith(\"--format=\"):\n    print(\"ERROR\\nbad format argument\")\n    sys.exit(1)\n\nif last_arg == \"--format=%H\":\n    print(\"some-commit-hash\")\nelif last_arg == \"--format=%an\":\n    print(\"Some Author\")\nelif last_arg == \"--format=%ae\":\n    print(\"author@example.com\")\nelif last_arg == \"--format=%s\":\n    print(\"Some message subject\")\nelif last_arg == \"--format=%b\":\n    print(\"Message body\\n  with multiple lines\")\nelse:\n    print(\"ERROR\\nbad format argument\")\n    sys.exit(1)\n"
  },
  {
    "path": "tools/ci-build/smithy-rs-tool-common/fake-cli/git-squash-merge",
    "content": "#!/usr/bin/env python3\nimport os\nimport sys\n\nexpected = [os.path.realpath(\"/tmp\"), [\n    \"-c\", \"user.name=some-dev\",\n    \"-c\", \"user.email=some-email@example.com\",\n    \"merge\", \"--squash\", \"test-branch-name\"\n]]\nactual = [os.getcwd(), sys.argv[1:]]\nif expected != actual:\n    print(f\"ERROR\\nExpect: {expected}\\nActual: {actual}\")\n    sys.exit(1)\n"
  },
  {
    "path": "tools/ci-build/smithy-rs-tool-common/fake-cli/git-stage",
    "content": "#!/usr/bin/env python3\nimport os\nimport sys\n\nexpected = [os.path.realpath(\"/tmp\"), [\"add\", \"test-path\"]]\nactual = [os.getcwd(), sys.argv[1:]]\nif expected != actual:\n    print(f\"ERROR\\nExpect: {expected}\\nActual: {actual}\")\n    sys.exit(1)\n"
  },
  {
    "path": "tools/ci-build/smithy-rs-tool-common/fake-cli/git-untracked-files",
    "content": "#!/usr/bin/env python3\nimport os\nimport sys\n\nexpected = [os.path.realpath(\"/tmp\"), [\"ls-files\", \"--exclude-standard\", \"--others\"]]\nactual = [os.getcwd(), sys.argv[1:]]\nif expected != actual:\n    print(f\"ERROR\\nExpect: {expected}\\nActual: {actual}\")\n    sys.exit(127)\n\n# print untracked files\nprint(\"some-untracked-file\")\nprint(\"another-untracked-file\")\nprint(\"some/file with spaces.txt\")\n"
  },
  {
    "path": "tools/ci-build/smithy-rs-tool-common/fake-cli/git-untracked-files-empty",
    "content": "#!/usr/bin/env python3\nimport os\nimport sys\n\nexpected = [os.path.realpath(\"/tmp\"), [\"ls-files\", \"--exclude-standard\", \"--others\"]]\nactual = [os.getcwd(), sys.argv[1:]]\nif expected != actual:\n    print(f\"ERROR\\nExpect: {expected}\\nActual: {actual}\")\n    sys.exit(127)\n\n# printing nothing means no untracked files\n"
  },
  {
    "path": "tools/ci-build/smithy-rs-tool-common/src/changelog/parser.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::changelog::{Changelog, Markdown};\nuse anyhow::{bail, Context, Result};\nuse std::fmt::Debug;\n\npub(crate) trait ParseIntoChangelog: Debug {\n    fn parse(&self, value: &str) -> Result<Changelog>;\n}\n\n#[derive(Clone, Debug, Default)]\npub(super) struct Toml;\nimpl ParseIntoChangelog for Toml {\n    fn parse(&self, value: &str) -> Result<Changelog> {\n        toml::from_str(value).context(\"Invalid TOML changelog format\")\n    }\n}\n\n#[derive(Clone, Debug, Default)]\nstruct Json;\nimpl ParseIntoChangelog for Json {\n    fn parse(&self, value: &str) -> Result<Changelog> {\n        // Remove comments from the top\n        let value = value\n            .split('\\n')\n            .filter(|line| !line.trim().starts_with('#'))\n            .collect::<Vec<_>>()\n            .join(\"\\n\");\n        serde_json::from_str(&value).context(\"Invalid JSON changelog format\")\n    }\n}\n\nimpl ParseIntoChangelog for Markdown {\n    fn parse(&self, value: &str) -> Result<Changelog> {\n        let mut parts = value.splitn(3, \"---\");\n        let _ = parts.next(); // Skip first empty element\n        let front_matter_str = parts\n            .next()\n            .context(\"front matter should follow the opening `---`\")?;\n        let message = parts\n            .next()\n            .context(\"message should be included in changelog entry\")?;\n\n        let markdown = Markdown {\n            front_matter: serde_yaml::from_str(front_matter_str)?,\n            message: message.to_owned(),\n        };\n\n        Ok(markdown.into())\n    }\n}\n\n#[derive(Debug)]\npub(crate) struct ParserChain {\n    parsers: Vec<(&'static str, Box<dyn ParseIntoChangelog>)>,\n}\n\nimpl Default for ParserChain {\n    fn default() -> Self {\n        Self {\n            parsers: vec![\n                (\"markdown\", Box::<Markdown>::default()),\n                (\"toml\", Box::<Toml>::default()),\n                (\"json\", Box::<Json>::default()),\n            ],\n        }\n    }\n}\n\nimpl ParseIntoChangelog for ParserChain {\n    fn parse(&self, value: &str) -> Result<Changelog> {\n        let mut errs = Vec::new();\n        for (_name, parser) in &self.parsers {\n            match parser.parse(value) {\n                Ok(parsed) => {\n                    return Ok(parsed);\n                }\n                Err(err) => {\n                    errs.push(err.to_string());\n                }\n            }\n        }\n        bail!(\"no parsers in chain parsed the following into `Changelog`\\n{value}\\nwith respective errors: \\n{errs:?}\")\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use crate::changelog::{SdkAffected, SdkModelChangeKind, SdkModelEntry};\n\n    #[test]\n    fn parse_json() {\n        let json = r#\"\n            # Example changelog entries\n            # [[aws-sdk-rust]]\n            # message = \"Fix typos in module documentation for generated crates\"\n            # references = [\"smithy-rs#920\"]\n            # meta = { \"breaking\" = false, \"tada\" = false, \"bug\" = false }\n            # author = \"rcoh\"\n            #\n            # [[smithy-rs]]\n            # message = \"Fix typos in module documentation for generated crates\"\n            # references = [\"smithy-rs#920\"]\n            # meta = { \"breaking\" = false, \"tada\" = false, \"bug\" = false }\n            # author = \"rcoh\"\n            {\n                \"smithy-rs\": [],\n                \"aws-sdk-rust\": [\n                    {\n                        \"message\": \"Some change\",\n                        \"meta\": { \"bug\": true, \"breaking\": false, \"tada\": false },\n                        \"author\": \"test-dev\",\n                        \"references\": [\n                            \"aws-sdk-rust#123\",\n                            \"smithy-rs#456\"\n                        ]\n                    }\n                ],\n                \"aws-sdk-model\": [\n                    {\n                        \"module\": \"aws-sdk-ec2\",\n                        \"version\": \"0.12.0\",\n                        \"kind\": \"Feature\",\n                        \"message\": \"Some API change\"\n                    }\n                ]\n            }\n        \"#;\n        let changelog = Json.parse(json).unwrap();\n        assert!(changelog.smithy_rs.is_empty());\n        assert_eq!(1, changelog.aws_sdk_rust.len());\n        assert_eq!(\"Some change\", changelog.aws_sdk_rust[0].message);\n        assert_eq!(1, changelog.sdk_models.len());\n        assert_eq!(\"Some API change\", changelog.sdk_models[0].message);\n    }\n\n    #[test]\n    fn parse_toml() {\n        let toml = r#\"\n            [[aws-sdk-model]]\n            module = \"aws-sdk-s3\"\n            version = \"0.14.0\"\n            kind = \"Feature\"\n            message = \"Some new API to do X\"\n            [[aws-sdk-model]]\n            module = \"aws-sdk-ec2\"\n            version = \"0.12.0\"\n            kind = \"Documentation\"\n            message = \"Updated some docs\"\n        \"#;\n        let changelog = Toml.parse(toml).unwrap();\n        assert_eq!(2, changelog.sdk_models.len());\n        assert_eq!(\n            SdkModelEntry {\n                module: \"aws-sdk-s3\".to_string(),\n                version: \"0.14.0\".to_string(),\n                kind: SdkModelChangeKind::Feature,\n                message: \"Some new API to do X\".to_string(),\n            },\n            changelog.sdk_models[0]\n        );\n        assert_eq!(\n            SdkModelEntry {\n                module: \"aws-sdk-ec2\".to_string(),\n                version: \"0.12.0\".to_string(),\n                kind: SdkModelChangeKind::Documentation,\n                message: \"Updated some docs\".to_string(),\n            },\n            changelog.sdk_models[1]\n        );\n    }\n\n    #[test]\n    fn parse_markdown() {\n        {\n            let markdown = r#\"---\napplies_to: [\"client\", \"server\", \"aws-sdk-rust\"]\nauthors: [\"landonxjames\",\"todaaron\"]\nreferences: [\"smithy-rs#123\"]\nbreaking: false\nnew_feature: false\nbug_fix: false\n---\n# Markdown Content\nThis is some **Markdown** content.\n\"#;\n            let changelog = Markdown::default().parse(markdown).unwrap();\n            assert_eq!(1, changelog.smithy_rs.len());\n            assert_eq!(Some(SdkAffected::All), changelog.smithy_rs[0].meta.target);\n            assert_eq!(\n                \"# Markdown Content\\nThis is some **Markdown** content.\\n\",\n                &changelog.smithy_rs[0].message\n            );\n            // Should duplicate this entry into the SDK changelog by virtue of `aws-sdk-rust`\n            assert_eq!(1, changelog.aws_sdk_rust.len());\n        }\n        {\n            let markdown = r#\"---\napplies_to: [\"client\"]\nauthors: [\"velfi\"]\nreferences: [\"smithy-rs#456\", \"aws-sdk-rust#1234\"]\nbreaking: false\nnew_feature: false\nbug_fix: false\n---\n# Markdown Content\nThis is some **Markdown** content.\n\"#;\n            let changelog = Markdown::default().parse(markdown).unwrap();\n            assert_eq!(1, changelog.smithy_rs.len());\n            assert_eq!(\n                Some(SdkAffected::Client),\n                changelog.smithy_rs[0].meta.target\n            );\n            assert_eq!(\n                \"# Markdown Content\\nThis is some **Markdown** content.\\n\",\n                &changelog.smithy_rs[0].message\n            );\n            assert!(changelog.aws_sdk_rust.is_empty());\n        }\n        {\n            let markdown = r#\"---\napplies_to: [\"server\"]\nauthors: [\"david-perez\", \"drganjoo\"]\nreferences: [\"smithy-rs#789\"]\nbreaking: false\nnew_feature: false\nbug_fix: true\n---\n# Markdown Content\nThis is some **Markdown** content.\n\"#;\n            let changelog = Markdown::default().parse(markdown).unwrap();\n            assert_eq!(1, changelog.smithy_rs.len());\n            assert_eq!(\n                Some(SdkAffected::Server),\n                changelog.smithy_rs[0].meta.target\n            );\n            assert_eq!(\n                \"# Markdown Content\\nThis is some **Markdown** content.\\n\",\n                &changelog.smithy_rs[0].message\n            );\n            assert!(changelog.aws_sdk_rust.is_empty());\n        }\n        {\n            let markdown = r#\"---\napplies_to:\n- client\n- aws-sdk-rust\nauthors:\n- ysaito1001\nreferences:\n- smithy-rs#1234\nbreaking: false\nnew_feature: false\nbug_fix: true\n---\nFix a long-standing bug.\n\"#;\n            let changelog = Markdown::default().parse(markdown).unwrap();\n            assert_eq!(1, changelog.smithy_rs.len());\n            assert_eq!(\n                Some(SdkAffected::Client),\n                changelog.smithy_rs[0].meta.target\n            );\n            assert_eq!(\n                \"Fix a long-standing bug.\\n\",\n                &changelog.smithy_rs[0].message\n            );\n            assert_eq!(1, changelog.aws_sdk_rust.len());\n        }\n    }\n}\n"
  },
  {
    "path": "tools/ci-build/smithy-rs-tool-common/src/changelog.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! This module holds deserializable structs for the hand-authored changelog TOML files used in smithy-rs.\n\npub mod parser;\n\nuse crate::changelog::parser::{ParseIntoChangelog, ParserChain};\nuse anyhow::{bail, Context, Result};\nuse serde::{de, Deserialize, Deserializer, Serialize};\nuse std::collections::HashSet;\nuse std::fmt;\nuse std::fmt::Debug;\nuse std::path::Path;\nuse std::str::FromStr;\n\n#[derive(Copy, Clone, Debug, Default, Serialize, PartialEq, Eq)]\npub enum SdkAffected {\n    #[serde(rename = \"client\")]\n    Client,\n    #[serde(rename = \"server\")]\n    Server,\n    #[serde(rename = \"all\")]\n    #[default]\n    All,\n}\n\nimpl fmt::Display for SdkAffected {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        match self {\n            SdkAffected::Client => write!(f, \"client\"),\n            SdkAffected::Server => write!(f, \"server\"),\n            SdkAffected::All => write!(f, \"all\"),\n        }\n    }\n}\n\nimpl FromStr for SdkAffected {\n    type Err = anyhow::Error;\n\n    fn from_str(sdk: &str) -> std::result::Result<Self, Self::Err> {\n        match sdk.to_lowercase().as_str() {\n            \"client\" => Ok(SdkAffected::Client),\n            \"server\" => Ok(SdkAffected::Server),\n            \"all\" => Ok(SdkAffected::All),\n            _ => bail!(\"An invalid type of SDK type {sdk} has been mentioned in the meta tags\"),\n        }\n    }\n}\n\n/// allow incase sensitive comparison of enum variants\nimpl<'de> Deserialize<'de> for SdkAffected {\n    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>\n    where\n        D: Deserializer<'de>,\n    {\n        let s = String::deserialize(deserializer)?;\n        FromStr::from_str(&s).map_err(de::Error::custom)\n    }\n}\n\n#[derive(Clone, Debug, Default, Deserialize, Serialize)]\n#[serde(deny_unknown_fields)]\npub struct Meta {\n    pub bug: bool,\n    pub breaking: bool,\n    pub tada: bool,\n    #[serde(skip_serializing_if = \"Option::is_none\")]\n    pub target: Option<SdkAffected>,\n}\n\n#[derive(Clone, Debug, Eq, PartialEq)]\npub struct Reference {\n    pub repo: String,\n    pub number: usize,\n}\n\nimpl<'de> Deserialize<'de> for Reference {\n    fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>\n    where\n        D: Deserializer<'de>,\n    {\n        let s = String::deserialize(deserializer)?;\n        FromStr::from_str(&s).map_err(de::Error::custom)\n    }\n}\n\nimpl Serialize for Reference {\n    fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>\n    where\n        S: serde::Serializer,\n    {\n        serializer.serialize_str(&format!(\"{}#{}\", self.repo, self.number))\n    }\n}\n\nimpl fmt::Display for Reference {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        write!(f, \"{}#{}\", self.repo, self.number)\n    }\n}\n\nimpl FromStr for Reference {\n    type Err = anyhow::Error;\n\n    fn from_str(reference: &str) -> std::result::Result<Self, Self::Err> {\n        match reference.split_once('#') {\n            None => bail!(\"Reference must of the form `repo#number` but found {reference}\"),\n            Some((repo, number)) => {\n                let number = number.parse::<usize>()?;\n                if !matches!(repo, \"smithy-rs\" | \"aws-sdk-rust\" | \"aws-sdk\") {\n                    bail!(\"unexpected repo: {repo}\");\n                }\n                Ok(Reference {\n                    number,\n                    repo: repo.to_string(),\n                })\n            }\n        }\n    }\n}\n\n#[derive(Deserialize, Serialize)]\n#[serde(untagged)]\nenum AuthorsInner {\n    Single(String),\n    Multiple(Vec<String>),\n}\n\n#[derive(Clone, Debug, Default, Serialize, Deserialize)]\n#[serde(from = \"AuthorsInner\", into = \"AuthorsInner\")]\npub struct Authors(pub(super) Vec<String>);\n\nimpl PartialEq for Authors {\n    fn eq(&self, other: &Self) -> bool {\n        // `true` if two `Authors` contain the same set of authors, regardless of their order\n        self.0.iter().collect::<HashSet<_>>() == other.0.iter().collect::<HashSet<_>>()\n    }\n}\n\nimpl Eq for Authors {}\n\nimpl From<AuthorsInner> for Authors {\n    fn from(value: AuthorsInner) -> Self {\n        match value {\n            AuthorsInner::Single(author) => Authors(vec![author]),\n            AuthorsInner::Multiple(authors) => Authors(authors),\n        }\n    }\n}\n\nimpl From<Authors> for AuthorsInner {\n    fn from(mut value: Authors) -> Self {\n        match value.0.len() {\n            0 => Self::Single(\"\".to_string()),\n            1 => Self::Single(value.0.pop().unwrap()),\n            _ => Self::Multiple(value.0),\n        }\n    }\n}\n\nimpl Authors {\n    pub fn iter(&self) -> impl Iterator<Item = &String> {\n        self.0.iter()\n    }\n\n    // Checks whether the number of authors is 0 or any author has a empty name.\n    pub fn is_empty(&self) -> bool {\n        self.0.is_empty() || self.iter().any(String::is_empty)\n    }\n\n    pub fn validate_usernames(&self) -> Result<()> {\n        fn validate_username(author: &str) -> Result<()> {\n            if !author.chars().all(|c| c.is_alphanumeric() || c == '-') {\n                bail!(\"Author, \\\"{author}\\\", is not a valid GitHub username: [a-zA-Z0-9\\\\-]\")\n            }\n            Ok(())\n        }\n        for author in self.iter() {\n            validate_username(author)?\n        }\n        Ok(())\n    }\n}\n\n#[derive(Clone, Debug, Default, Deserialize, Serialize)]\npub struct HandAuthoredEntry {\n    pub message: String,\n    pub meta: Meta,\n    // Retain singular field named \"author\" for backwards compatibility,\n    // but also accept plural \"authors\".\n    #[serde(rename = \"author\", alias = \"authors\")]\n    pub authors: Authors,\n    #[serde(default)]\n    pub references: Vec<Reference>,\n    /// Optional commit hash to indicate \"since when\" these changes were made\n    #[serde(rename = \"since-commit\")]\n    pub since_commit: Option<String>,\n    /// Optional age of this entry, for the SDK use-case where entries must be\n    /// preserved across multiple smithy-rs releases. This allows the changelogger\n    /// to eventually cull older entries.\n    #[serde(skip_serializing_if = \"Option::is_none\")]\n    pub age: Option<usize>,\n}\n\nimpl HandAuthoredEntry {\n    /// Validate a changelog entry to ensure it follows standards\n    pub fn validate(&self, validation_set: ValidationSet) -> Result<()> {\n        if self.authors.iter().any(|author| author.trim().is_empty()) {\n            bail!(\"Author must be set (was empty)\");\n        }\n        if !self\n            .authors\n            .iter()\n            .any(|author| author.chars().all(|c| c.is_alphanumeric() || c == '-'))\n        {\n            bail!(\"Author must be valid GitHub username: [a-zA-Z0-9\\\\-]\")\n        }\n        if validation_set == ValidationSet::Development && self.references.is_empty() {\n            bail!(\"Changelog entry must refer to at least one pull request or issue\");\n        }\n        if validation_set == ValidationSet::Development && self.message.len() > 800 {\n            bail!(\n                \"Your changelog entry is too long. Post long-form change log entries in \\\n                the GitHub Discussions under the Changelog category, and link to them from \\\n                the changelog.\"\n            );\n        }\n\n        Ok(())\n    }\n}\n\n#[derive(Clone, Debug, Eq, Deserialize, PartialEq, Serialize)]\npub enum SdkModelChangeKind {\n    Documentation,\n    Feature,\n}\n\n#[derive(Clone, Debug, Eq, Deserialize, PartialEq, Serialize)]\npub struct SdkModelEntry {\n    /// SDK module name (e.g., \"aws-sdk-s3\" for S3)\n    pub module: String,\n    /// SDK module version number (e.g., \"0.14.0\")\n    pub version: String,\n    /// What changed\n    pub kind: SdkModelChangeKind,\n    /// More details about the change\n    pub message: String,\n}\n\n#[derive(Copy, Clone, Eq, PartialEq)]\npub enum ValidationSet {\n    /// Validate for local development and CI\n    Development,\n    /// Validate for rendering.\n    ///\n    /// This does less validation to avoid blocking a release for things that\n    /// were added to changelog validation later that could cause issues with\n    /// SDK_CHANGELOG.next.json where there are historical entries that didn't\n    /// have this validation applied.\n    Render,\n}\n\n#[derive(Clone, Default, Debug, Deserialize, Serialize)]\npub struct Changelog {\n    #[serde(rename = \"smithy-rs\")]\n    #[serde(default)]\n    pub smithy_rs: Vec<HandAuthoredEntry>,\n    #[serde(rename = \"aws-sdk-rust\")]\n    #[serde(default)]\n    pub aws_sdk_rust: Vec<HandAuthoredEntry>,\n    #[serde(rename = \"aws-sdk-model\")]\n    #[serde(default)]\n    pub sdk_models: Vec<SdkModelEntry>,\n}\n\nimpl Changelog {\n    pub fn new() -> Changelog {\n        Default::default()\n    }\n\n    pub fn merge(&mut self, other: Changelog) {\n        self.smithy_rs.extend(other.smithy_rs);\n        self.aws_sdk_rust.extend(other.aws_sdk_rust);\n        self.sdk_models.extend(other.sdk_models);\n    }\n\n    pub fn to_json_string(&self) -> Result<String> {\n        serde_json::to_string_pretty(self).context(\"failed to serialize changelog JSON\")\n    }\n\n    pub fn validate(&self, validation_set: ValidationSet) -> Result<(), Vec<String>> {\n        let validate_aws_handauthored = |entry: &HandAuthoredEntry| -> Result<()> {\n            entry.validate(validation_set)?;\n            if entry.meta.target.is_some() {\n                bail!(\"aws-sdk-rust changelog entry cannot have an affected target\");\n            }\n            Ok(())\n        };\n\n        let validate_smithyrs_handauthored = |entry: &HandAuthoredEntry| -> Result<()> {\n            entry.validate(validation_set)?;\n            if entry.meta.target.is_none() {\n                bail!(\"smithy-rs entry must have an affected target\");\n            }\n            Ok(())\n        };\n\n        let errors: Vec<_> = self\n            .aws_sdk_rust\n            .iter()\n            .map(validate_aws_handauthored)\n            .chain(self.smithy_rs.iter().map(validate_smithyrs_handauthored))\n            .filter_map(Result::err)\n            .map(|e| format!(\"{e}\"))\n            .collect();\n        if errors.is_empty() {\n            Ok(())\n        } else {\n            Err(errors)\n        }\n    }\n}\n\n#[derive(Copy, Clone, Debug, Deserialize, Eq, Hash, PartialEq, Serialize)]\npub enum Target {\n    #[serde(rename = \"client\")]\n    Client,\n    #[serde(rename = \"server\")]\n    Server,\n    #[serde(rename = \"aws-sdk-rust\")]\n    AwsSdk,\n}\n\nimpl FromStr for Target {\n    type Err = anyhow::Error;\n\n    fn from_str(sdk: &str) -> std::result::Result<Self, Self::Err> {\n        match sdk.to_lowercase().as_str() {\n            \"client\" => Ok(Target::Client),\n            \"server\" => Ok(Target::Server),\n            \"aws-sdk-rust\" => Ok(Target::AwsSdk),\n            _ => bail!(\"An invalid type of `Target` {sdk} has been specified\"),\n        }\n    }\n}\n\n#[derive(Clone, Debug, Default, Deserialize, Serialize)]\npub struct FrontMatter {\n    pub applies_to: HashSet<Target>,\n    pub authors: Vec<String>,\n    pub references: Vec<Reference>,\n    pub breaking: bool,\n    pub new_feature: bool,\n    pub bug_fix: bool,\n}\n\n#[derive(Clone, Debug, Default)]\npub struct Markdown {\n    pub front_matter: FrontMatter,\n    pub message: String,\n}\n\nimpl From<Markdown> for Changelog {\n    fn from(value: Markdown) -> Self {\n        let front_matter = value.front_matter;\n        let entry = HandAuthoredEntry {\n            message: value.message.trim_start().to_owned(),\n            meta: Meta {\n                bug: front_matter.bug_fix,\n                breaking: front_matter.breaking,\n                tada: front_matter.new_feature,\n                target: None,\n            },\n            authors: AuthorsInner::Multiple(front_matter.authors).into(),\n            references: front_matter.references,\n            since_commit: None,\n            age: None,\n        };\n\n        let mut changelog = Changelog::new();\n\n        // Bin `entry` into the appropriate `Vec` based on the `applies_to` field in `front_matter`\n        if front_matter.applies_to.contains(&Target::AwsSdk) {\n            changelog.aws_sdk_rust.push(entry.clone())\n        }\n        if front_matter.applies_to.contains(&Target::Client)\n            && front_matter.applies_to.contains(&Target::Server)\n        {\n            let mut entry = entry.clone();\n            entry.meta.target = Some(SdkAffected::All);\n            changelog.smithy_rs.push(entry);\n        } else if front_matter.applies_to.contains(&Target::Client) {\n            let mut entry = entry.clone();\n            entry.meta.target = Some(SdkAffected::Client);\n            changelog.smithy_rs.push(entry);\n        } else if front_matter.applies_to.contains(&Target::Server) {\n            let mut entry = entry.clone();\n            entry.meta.target = Some(SdkAffected::Server);\n            changelog.smithy_rs.push(entry);\n        }\n\n        changelog\n    }\n}\n/// Parses changelog entries into [`Changelog`] using a series of parsers.\n///\n/// Each parser will attempt to parse an input string in order:\n/// * If a parser successfully parses the input string into `Changelog`, it will be returned immediately.\n///   No other parsers will be used.\n/// * Otherwise, if a parser returns an `anyhow::Error`, the next parser will be tried.\n/// * If none of the parsers parse the input string successfully, an error will be returned from the chain.\n#[derive(Debug, Default)]\npub struct ChangelogLoader {\n    parser_chain: ParserChain,\n}\n\nimpl ChangelogLoader {\n    /// Parses the given `value` into a `Changelog`\n    pub fn parse_str(&self, value: impl AsRef<str>) -> Result<Changelog> {\n        self.parser_chain.parse(value.as_ref())\n    }\n\n    /// Parses the contents of a file located at `path` into `Changelog`\n    pub fn load_from_file(&self, path: impl AsRef<Path> + Debug) -> Result<Changelog> {\n        let contents = std::fs::read_to_string(path.as_ref())\n            .with_context(|| format!(\"failed to read {:?}\", path.as_ref()))?;\n        self.parse_str(contents)\n            .with_context(|| format!(\"failed to parse the contents in {path:?}\"))\n    }\n\n    /// Parses the contents of files stored in a directory `dir_path` into `Changelog`\n    ///\n    /// It opens each file in the directory, parses the file contents into `Changelog`,\n    /// and merges it with accumulated `Changelog`. It currently does not support loading\n    /// from recursive directory structures.\n    pub fn load_from_dir(&self, dir_path: impl AsRef<Path> + Debug) -> Result<Changelog> {\n        let entries = std::fs::read_dir(dir_path.as_ref())?;\n        let result = entries\n            .into_iter()\n            .filter_map(|entry| {\n                // Convert each entry to its path if it's a file\n                entry.ok().and_then(|entry| {\n                    let path = entry.path();\n                    if path.is_file() {\n                        Some(path)\n                    } else {\n                        None\n                    }\n                })\n            })\n            .try_fold(Changelog::new(), |mut combined_changelog, path| {\n                combined_changelog.merge(self.load_from_file(path)?);\n                Ok::<_, anyhow::Error>(combined_changelog)\n            })?;\n\n        Ok(result)\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use anyhow::Context;\n\n    #[test]\n    fn errors_are_combined() {\n        const ENTRY: &str = r#\"\n---\napplies_to: [\"aws-sdk-rust\"]\nauthors: [\"\"]\nreferences: [\"smithy-rs#920\"]\nbreaking: false\nnew_feature: false\nbug_fix: false\n---\nFix typos in module documentation for generated crates\n        \"#;\n        let loader = ChangelogLoader::default();\n        let mut changelog = loader.parse_str(ENTRY).unwrap();\n        changelog.merge(loader.parse_str(ENTRY).unwrap());\n        // two errors should be produced, missing authors x 2\n        let res = changelog.validate(ValidationSet::Development);\n        assert_eq!(2, res.expect_err(\"changelog validation should fail\").len());\n    }\n\n    #[test]\n    fn test_hand_authored_sdk() {\n        let loader = ChangelogLoader::default();\n\n        // server target\n        let value = r#\"\n---\napplies_to: [\"server\"]\nauthors: [\"rcoh\"]\nreferences: [\"smithy-rs#920\"]\nbreaking: false\nnew_feature: false\nbug_fix: false\n---\nFix typos in module documentation for generated crates\n\"#;\n        {\n            let changelog = loader\n                .parse_str(value)\n                .context(\"String should have parsed\")\n                .unwrap();\n            assert_eq!(\n                Some(SdkAffected::Server),\n                changelog.smithy_rs.first().unwrap().meta.target\n            );\n        }\n        // client target\n        let value = r#\"\n---\napplies_to: [\"client\"]\nauthors: [\"rcoh\"]\nreferences: [\"smithy-rs#920\"]\nbreaking: false\nnew_feature: false\nbug_fix: false\n---\nFix typos in module documentation for generated crates\n\"#;\n        {\n            let changelog = loader\n                .parse_str(value)\n                .context(\"String should have parsed\")\n                .unwrap();\n            assert_eq!(\n                Some(SdkAffected::Client),\n                changelog.smithy_rs.first().unwrap().meta.target\n            );\n        }\n        // Both target\n        let value = r#\"\n---\napplies_to: [\"server\", \"client\"]\nauthors: [\"rcoh\"]\nreferences: [\"smithy-rs#920\"]\nbreaking: false\nnew_feature: false\nbug_fix: false\n---\nFix typos in module documentation for generated crates\n\"#;\n        {\n            let changelog = loader\n                .parse_str(value)\n                .context(\"String should have parsed\")\n                .unwrap();\n            assert_eq!(\n                Some(SdkAffected::All),\n                changelog.smithy_rs.first().unwrap().meta.target\n            );\n        }\n        // an invalid `applies_to` value\n        let value = r#\"\n---\napplies_to: [\"Some other invalid\"]\nauthors: [\"rcoh\"]\nreferences: [\"smithy-rs#920\"]\nbreaking: false\nnew_feature: false\nbug_fix: false\n---\nFix typos in module documentation for generated crates\n\"#;\n        {\n            let changelog = loader\n                .parse_str(value)\n                .context(\"String should not have parsed\");\n            assert!(changelog.is_err());\n        }\n        // multiple authors\n        let value = r#\"\n---\napplies_to: [\"client\", \"server\"]\nauthors: [\"rcoh\", \"crisidev\"]\nreferences: [\"smithy-rs#920\"]\nbreaking: false\nnew_feature: false\nbug_fix: false\n---\nFix typos in module documentation for generated crates\n\"#;\n        {\n            let changelog = loader\n                .parse_str(value)\n                .context(\"String should have parsed with multiple authors\")\n                .unwrap();\n            assert_eq!(\n                Authors(vec![\"rcoh\".to_string(), \"crisidev\".to_string()]),\n                changelog.smithy_rs.first().unwrap().authors,\n            );\n        }\n    }\n}\n"
  },
  {
    "path": "tools/ci-build/smithy-rs-tool-common/src/ci.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\nuse std::ffi::OsStr;\nuse std::path::Path;\n\n/// Returns `true` if this code is being run in CI\npub fn running_in_ci() -> bool {\n    std::env::var(\"GITHUB_ACTIONS\").unwrap_or_default() == \"true\"\n        || std::env::var(\"SMITHY_RS_DOCKER_BUILD_IMAGE\").unwrap_or_default() == \"1\"\n}\n\n/// The `BUILD_TYPE` env var is only set for Codebuild jobs, will always\n/// return `false` in other CI environments\npub fn is_preview_build() -> bool {\n    let build_type = std::env::var(\"BUILD_TYPE\");\n\n    if let Ok(build_type) = build_type {\n        if build_type.eq_ignore_ascii_case(\"PREVIEW\") {\n            return true;\n        }\n    }\n\n    false\n}\n\npub fn is_in_example_dir(manifest_path: impl AsRef<Path>) -> bool {\n    let mut path = manifest_path.as_ref();\n    // Check if current dir is examples\n    if path.ends_with(\"examples\") {\n        return true;\n    }\n    // Examine parent directories until either `examples/` or `aws-sdk-rust/` is found\n    while let Some(parent) = path.parent() {\n        path = parent;\n        if path.file_name() == Some(OsStr::new(\"examples\")) {\n            return true;\n        } else if path.file_name() == Some(OsStr::new(\"aws-sdk-rust\")) {\n            break;\n        }\n    }\n    false\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n\n    #[test]\n    fn test_is_in_example_dir() {\n        assert!(!is_in_example_dir(\"aws-sdk-rust/sdk/s3/Cargo.toml\"));\n        assert!(!is_in_example_dir(\"aws-sdk-rust/sdk/aws-config/Cargo.toml\"));\n        assert!(!is_in_example_dir(\n            \"/path/to/aws-sdk-rust/sdk/aws-config/Cargo.toml\"\n        ));\n        assert!(!is_in_example_dir(\"sdk/aws-config/Cargo.toml\"));\n        assert!(is_in_example_dir(\"examples/foo/Cargo.toml\"));\n        assert!(is_in_example_dir(\"examples/foo/bar/Cargo.toml\"));\n        assert!(is_in_example_dir(\n            \"aws-sdk-rust/examples/foo/bar/Cargo.toml\"\n        ));\n        assert!(is_in_example_dir(\"aws-sdk-rust/examples/\"));\n    }\n}\n"
  },
  {
    "path": "tools/ci-build/smithy-rs-tool-common/src/command.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! Utilities to simplify working with [`std::command::Command`].\n\n/// Synchronous command extension functions.\npub mod sync {\n    use anyhow::{bail, Context, Result};\n    use std::process::Command;\n\n    /// Extension trait to make `Command` nicer to work with.\n    pub trait CommandExt {\n        /// Expects the command to exit with a successful status, and returns the command's stdout.\n        ///\n        /// If the command fails, the `context` is used to help describe the problem.\n        /// It will always be formatted with \"failed to {context}\".\n        fn expect_success_output(&mut self, context: &str) -> Result<String>;\n\n        /// Expects the command to exit with one of the given statuses.\n        ///\n        /// If the command fails, the `context` is used to help describe the problem.\n        /// It will always be formatted with \"failed to {context}\".\n        fn expect_status_one_of(\n            &mut self,\n            context: &str,\n            statuses: impl IntoIterator<Item = i32>,\n        ) -> Result<i32>;\n    }\n\n    impl CommandExt for Command {\n        fn expect_success_output(&mut self, context: &str) -> Result<String> {\n            let output = self\n                .output()\n                .with_context(|| format!(\"failed to invoke {self:?}\"))?;\n            let stdout = String::from_utf8(output.stdout)\n                .with_context(|| format!(\"command: {self:?}\"))\n                .context(\"output had invalid utf-8\")?;\n            if !output.status.success() {\n                bail!(\n                    \"failed to {context}\\n\\ncommand: {:?}\\n\\nstdout:\\n{}\\n\\nstderr:\\n{}\\n\",\n                    self,\n                    stdout,\n                    String::from_utf8_lossy(&output.stderr),\n                );\n            }\n            Ok(stdout)\n        }\n\n        fn expect_status_one_of(\n            &mut self,\n            context: &str,\n            statuses: impl IntoIterator<Item = i32>,\n        ) -> Result<i32> {\n            let output = self\n                .output()\n                .with_context(|| format!(\"failed to invoke {self:?}\"))?;\n            let expected: Vec<_> = statuses.into_iter().collect();\n            let actual = output.status.code().unwrap();\n            if expected.contains(&actual) {\n                Ok(actual)\n            } else {\n                bail!(\n                    \"failed to {context}\\n\\n\\\n                    expected exit status to be one of {expected:?}, but got {actual}\\n\\n\\\n                    command: {:?}\\n\\nstdout:\\n{}\\n\\nstderr:\\n{}\\n\",\n                    self,\n                    String::from_utf8_lossy(&output.stdout),\n                    String::from_utf8_lossy(&output.stderr),\n                )\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "tools/ci-build/smithy-rs-tool-common/src/git.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::release_tag::ReleaseTag;\nuse crate::shell::{handle_failure, output_text};\nuse anyhow::{bail, Context, Result};\nuse std::borrow::Cow;\nuse std::ffi::OsStr;\nuse std::fmt::{self, Write};\nuse std::path::{Path, PathBuf};\nuse std::process::Command;\nuse std::str::FromStr;\nuse tracing::debug;\nuse tracing::warn;\n\n/// Attempts to find git repository root from the given location.\npub fn find_git_repository_root(repo_name: &str, location: impl AsRef<Path>) -> Result<PathBuf> {\n    let output = Command::new(\"git\")\n        .arg(\"rev-parse\")\n        .arg(\"--show-toplevel\")\n        .current_dir(location.as_ref())\n        .output()\n        .context(\"failed to run git\")?;\n    handle_failure(\"determine git repo root\", &output)?;\n\n    let (stdout, _) = output_text(&output);\n    let path = PathBuf::from(stdout.trim());\n    if path.file_name() != Some(OsStr::new(repo_name)) {\n        warn!(\n            \"repository root {:?} doesn't have expected name '{}'\",\n            path, repo_name\n        );\n    }\n    Ok(path)\n}\n\n#[derive(Clone, Debug, Eq, PartialEq)]\npub struct CommitHash(String);\n\nimpl<T: Into<String>> From<T> for CommitHash {\n    fn from(hash: T) -> Self {\n        CommitHash(hash.into())\n    }\n}\n\nimpl AsRef<str> for CommitHash {\n    fn as_ref(&self) -> &str {\n        &self.0\n    }\n}\n\nimpl fmt::Display for CommitHash {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        write!(f, \"{}\", self.0)\n    }\n}\n\n#[derive(Clone, Debug, Eq, PartialEq)]\npub struct Commit {\n    pub hash: CommitHash,\n    pub author_name: String,\n    pub author_email: String,\n    pub message_subject: String,\n    pub message_body: String,\n}\n\nimpl Commit {\n    pub fn message(&self) -> Cow<'_, str> {\n        if self.message_body.is_empty() {\n            Cow::Borrowed(&self.message_subject)\n        } else {\n            Cow::Owned(format!(\"{}\\n\\n{}\", self.message_subject, self.message_body))\n        }\n    }\n}\n\n/// Easily mockable interface with Git for testing\npub trait Git: Send + Sync {\n    /// Returns the repository path\n    fn path(&self) -> &Path;\n\n    /// Clones the repository to the given path\n    fn clone_to(&self, path: &Path) -> Result<()>;\n\n    /// Returns commit hash of HEAD (i.e., `git rev-parse HEAD`)\n    fn get_head_revision(&self) -> Result<CommitHash>;\n\n    /// Stages the given path (i.e., `git add ${path}`)\n    fn stage(&self, path: &Path) -> Result<()>;\n\n    /// Commits the staged files on behalf of the given author using a bot commiter.\n    fn commit_on_behalf(\n        &self,\n        bot_name: &str,\n        bot_email: &str,\n        author_name: &str,\n        author_email: &str,\n        message: &str,\n    ) -> Result<()>;\n\n    /// Commits staged files.\n    fn commit(&self, name: &str, email: &str, message: &str) -> Result<()>;\n\n    /// Returns a list of commit hashes in reverse chronological order starting with\n    /// `start_inclusive_revision` and ending before `end_exclusive_revision`. Both of\n    /// these arguments can be any kind of Git revision (e.g., HEAD, HEAD~2, commit hash, etc).\n    fn rev_list(\n        &self,\n        start_inclusive_revision: &str,\n        end_exclusive_revision: &str,\n        path: Option<&Path>,\n    ) -> Result<Vec<CommitHash>>;\n\n    /// Returns information about a given revision.\n    fn show(&self, revision: &str) -> Result<Commit>;\n\n    /// Hard resets to the given revision.\n    fn hard_reset(&self, revision: &str) -> Result<()>;\n\n    /// Returns the name of the current branch.\n    fn current_branch_name(&self) -> Result<String>;\n\n    /// Creates a branch at the given revision.\n    fn create_branch(&self, branch_name: &str, revision: &str) -> Result<()>;\n\n    /// Deletes a branch.\n    fn delete_branch(&self, branch_name: &str) -> Result<()>;\n\n    /// Squash merges a branch into the current branch and leaves the changes staged.\n    fn squash_merge(&self, author_name: &str, author_email: &str, branch_name: &str) -> Result<()>;\n\n    /// Returns list of untracked files.\n    fn untracked_files(&self) -> Result<Vec<PathBuf>>;\n\n    /// Returns list of changed files.\n    fn changed_files(&self) -> Result<Vec<PathBuf>>;\n\n    /// Finds the most recent tag that is reachable from `HEAD`.\n    fn get_current_tag(&self) -> Result<ReleaseTag>;\n}\n\nenum CommitInfo {\n    CommitHash,\n    AuthorName,\n    AuthorEmail,\n    MessageSubject,\n    MessageBody,\n}\n\npub struct GitCLI {\n    repo_path: PathBuf,\n    binary_name: String,\n}\n\nimpl GitCLI {\n    pub fn new(repo_path: &Path) -> Result<Self> {\n        if !repo_path.join(\".git\").exists() {\n            bail!(\"{repo_path:?} is not a git repository\");\n        }\n        Ok(Self {\n            repo_path: repo_path.into(),\n            binary_name: \"git\".into(),\n        })\n    }\n\n    #[cfg(test)]\n    pub fn with_binary(repo_path: &Path, name: &str) -> Self {\n        Self {\n            repo_path: repo_path.into(),\n            binary_name: name.into(),\n        }\n    }\n\n    fn extract_commit_info(&self, revision: &str, info: CommitInfo) -> Result<String> {\n        let mut command = Command::new(&self.binary_name);\n        command.arg(\"show\");\n        command.arg(\"-s\");\n        command.arg(revision);\n        command.arg(format!(\n            \"--format={}\",\n            match info {\n                CommitInfo::CommitHash => \"%H\",\n                CommitInfo::AuthorName => \"%an\",\n                CommitInfo::AuthorEmail => \"%ae\",\n                CommitInfo::MessageSubject => \"%s\",\n                CommitInfo::MessageBody => \"%b\",\n            }\n        ));\n        command.current_dir(&self.repo_path);\n\n        let output = log_command(command).output()?;\n        handle_failure(\"extract_commit_info\", &output)?;\n        let (stdout, _) = output_text(&output);\n        Ok(stdout.trim().into())\n    }\n}\n\nimpl Git for GitCLI {\n    fn path(&self) -> &Path {\n        &self.repo_path\n    }\n\n    fn clone_to(&self, path: &Path) -> Result<()> {\n        let mut command = Command::new(&self.binary_name);\n        command.arg(\"clone\");\n        command.arg(&self.repo_path);\n        command.current_dir(path);\n\n        let output = log_command(command).output()?;\n        handle_failure(\"clone_to\", &output)?;\n        Ok(())\n    }\n\n    fn get_head_revision(&self) -> Result<CommitHash> {\n        let mut command = Command::new(&self.binary_name);\n        command.arg(\"rev-parse\");\n        command.arg(\"HEAD\");\n        command.current_dir(&self.repo_path);\n\n        let output = log_command(command).output()?;\n        handle_failure(\"get_head_revision\", &output)?;\n        let (stdout, _) = output_text(&output);\n        Ok(CommitHash(stdout.trim().into()))\n    }\n\n    fn stage(&self, path: &Path) -> Result<()> {\n        let mut command = Command::new(&self.binary_name);\n        command.arg(\"add\");\n        command.arg(path);\n        command.current_dir(&self.repo_path);\n\n        let output = log_command(command).output()?;\n        handle_failure(\"stage\", &output)?;\n        Ok(())\n    }\n\n    fn commit_on_behalf(\n        &self,\n        bot_name: &str,\n        bot_email: &str,\n        author_name: &str,\n        author_email: &str,\n        message: &str,\n    ) -> Result<()> {\n        let mut command = Command::new(&self.binary_name);\n        command.arg(\"-c\");\n        command.arg(format!(\"user.name={bot_name}\"));\n        command.arg(\"-c\");\n        command.arg(format!(\"user.email={bot_email}\"));\n        command.arg(\"commit\");\n        command.arg(\"-m\");\n        command.arg(message);\n        command.arg(\"--author\");\n        command.arg(format!(\"{author_name} <{author_email}>\"));\n        command.current_dir(&self.repo_path);\n\n        let output = log_command(command).output()?;\n        handle_failure(\"commit_on_behalf\", &output)?;\n        Ok(())\n    }\n\n    fn commit(&self, name: &str, email: &str, message: &str) -> Result<()> {\n        let mut command = Command::new(&self.binary_name);\n        command.arg(\"-c\");\n        command.arg(format!(\"user.name={name}\"));\n        command.arg(\"-c\");\n        command.arg(format!(\"user.email={email}\"));\n        command.arg(\"commit\");\n        command.arg(\"-m\");\n        command.arg(message);\n        command.current_dir(&self.repo_path);\n\n        let output = log_command(command).output()?;\n        handle_failure(\"commit\", &output)?;\n        Ok(())\n    }\n\n    fn rev_list(\n        &self,\n        start_inclusive_revision: &str,\n        end_exclusive_revision: &str,\n        path: Option<&Path>,\n    ) -> Result<Vec<CommitHash>> {\n        let mut command = Command::new(&self.binary_name);\n        command.arg(\"rev-list\");\n        command.arg(format!(\n            \"{end_exclusive_revision}..{start_inclusive_revision}\"\n        ));\n        if let Some(path) = path {\n            command.arg(\"--\");\n            command.arg(path);\n        }\n        command.current_dir(&self.repo_path);\n\n        let output = log_command(command).output()?;\n        handle_failure(\"rev_list\", &output)?;\n        let (stdout, _) = output_text(&output);\n        Ok(stdout\n            .split_ascii_whitespace()\n            .map(CommitHash::from)\n            .collect())\n    }\n\n    fn show(&self, revision: &str) -> Result<Commit> {\n        Ok(Commit {\n            hash: CommitHash::from(self.extract_commit_info(revision, CommitInfo::CommitHash)?),\n            author_name: self.extract_commit_info(revision, CommitInfo::AuthorName)?,\n            author_email: self.extract_commit_info(revision, CommitInfo::AuthorEmail)?,\n            message_subject: self.extract_commit_info(revision, CommitInfo::MessageSubject)?,\n            message_body: self.extract_commit_info(revision, CommitInfo::MessageBody)?,\n        })\n    }\n\n    fn hard_reset(&self, revision: &str) -> Result<()> {\n        let mut command = Command::new(&self.binary_name);\n        command.arg(\"reset\");\n        command.arg(\"--hard\");\n        command.arg(revision);\n        command.current_dir(&self.repo_path);\n\n        let output = log_command(command).output()?;\n        handle_failure(\"hard_reset\", &output)?;\n        Ok(())\n    }\n\n    fn current_branch_name(&self) -> Result<String> {\n        let mut command = Command::new(&self.binary_name);\n        command.arg(\"rev-parse\");\n        command.arg(\"--abbrev-ref\");\n        command.arg(\"HEAD\");\n        command.current_dir(&self.repo_path);\n\n        let output = log_command(command).output()?;\n        handle_failure(\"current_branch_name\", &output)?;\n        let (stdout, _) = output_text(&output);\n        Ok(stdout.trim().into())\n    }\n\n    fn create_branch(&self, branch_name: &str, revision: &str) -> Result<()> {\n        let mut command = Command::new(&self.binary_name);\n        command.arg(\"branch\");\n        command.arg(branch_name);\n        command.arg(revision);\n        command.current_dir(&self.repo_path);\n\n        let output = log_command(command).output()?;\n        handle_failure(\"create_branch\", &output)?;\n        Ok(())\n    }\n\n    fn delete_branch(&self, branch_name: &str) -> Result<()> {\n        let mut command = Command::new(&self.binary_name);\n        command.arg(\"branch\");\n        command.arg(\"-D\");\n        command.arg(branch_name);\n        command.current_dir(&self.repo_path);\n\n        let output = log_command(command).output()?;\n        handle_failure(\"delete_branch\", &output)?;\n        Ok(())\n    }\n\n    fn squash_merge(&self, author_name: &str, author_email: &str, branch_name: &str) -> Result<()> {\n        let mut command = Command::new(&self.binary_name);\n        command.arg(\"-c\");\n        command.arg(format!(\"user.name={author_name}\"));\n        command.arg(\"-c\");\n        command.arg(format!(\"user.email={author_email}\"));\n        command.arg(\"merge\");\n        command.arg(\"--squash\");\n        command.arg(branch_name);\n        command.current_dir(&self.repo_path);\n\n        let output = log_command(command).output()?;\n        handle_failure(\"squash_merge\", &output)\n    }\n\n    fn untracked_files(&self) -> Result<Vec<PathBuf>> {\n        let mut command = Command::new(&self.binary_name);\n        command.arg(\"ls-files\");\n        command.arg(\"--exclude-standard\");\n        command.arg(\"--others\");\n        command.current_dir(&self.repo_path);\n\n        let output = log_command(command).output()?;\n        handle_failure(\"untracked_files\", &output)?;\n        let (stdout, _) = output_text(&output);\n        Ok(split_file_names(&stdout))\n    }\n\n    fn changed_files(&self) -> Result<Vec<PathBuf>> {\n        let mut command = Command::new(&self.binary_name);\n        command.arg(\"diff\");\n        command.arg(\"--name-only\");\n        command.current_dir(&self.repo_path);\n\n        let output = log_command(command).output()?;\n        handle_failure(\"changed_files\", &output)?;\n        let (stdout, _) = output_text(&output);\n        Ok(split_file_names(&stdout))\n    }\n\n    fn get_current_tag(&self) -> Result<ReleaseTag> {\n        let mut command = Command::new(&self.binary_name);\n        command.arg(\"describe\");\n        command.arg(\"--tags\");\n        command.arg(\"--abbrev=0\");\n        command.current_dir(&self.repo_path);\n\n        let output = command.output()?;\n        handle_failure(\"get_current_tag\", &output)?;\n        let (stdout, _) = output_text(&output);\n        ReleaseTag::from_str(stdout.trim())\n    }\n}\n\nfn is_newline(c: char) -> bool {\n    c == '\\r' || c == '\\n'\n}\n\nfn split_file_names(value: &str) -> Vec<PathBuf> {\n    value\n        .split(is_newline)\n        .filter(|s| !s.is_empty())\n        .map(PathBuf::from)\n        .collect::<Vec<_>>()\n}\n\nfn log_command(command: Command) -> Command {\n    let mut message = String::new();\n    if let Some(cwd) = command.get_current_dir() {\n        write!(&mut message, \"[in {cwd:?}]: \").unwrap();\n    }\n    message.push_str(command.get_program().to_str().expect(\"valid str\"));\n    for arg in command.get_args() {\n        message.push(' ');\n        message.push_str(arg.to_str().expect(\"valid str\"));\n    }\n    debug!(\"{}\", message);\n    command\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use std::{env, fs};\n    use tempfile::TempDir;\n\n    fn bin_path(script: &'static str) -> PathBuf {\n        env::current_dir()\n            .expect(\"current_dir\")\n            .join(\"fake-cli\")\n            .join(script)\n            .canonicalize()\n            .expect(\"canonicalize\")\n    }\n    fn cli(script: &'static str) -> GitCLI {\n        GitCLI::with_binary(&PathBuf::from(\"/tmp\"), &bin_path(script).to_string_lossy())\n    }\n\n    #[test]\n    fn clone_to() {\n        cli(\"git-clone\")\n            .clone_to(&PathBuf::from(\"/tmp\"))\n            .expect(\"successful invocation\");\n    }\n\n    #[test]\n    fn extract_commit_info() {\n        let result = cli(\"git-extract-commit-info\")\n            .extract_commit_info(\"test_revision\", CommitInfo::CommitHash)\n            .expect(\"successful invocation\");\n        assert_eq!(\"success\", result);\n    }\n\n    #[test]\n    fn changed_files() {\n        assert_eq!(\n            vec![\n                PathBuf::from(\"some/file\"),\n                PathBuf::from(\"some-other-file\"),\n                PathBuf::from(\"some/file with spaces.txt\"),\n            ],\n            cli(\"git-changed-files\")\n                .changed_files()\n                .expect(\"successful invocation\")\n        );\n        assert_eq!(\n            Vec::<PathBuf>::new(),\n            cli(\"git-changed-files-empty\")\n                .changed_files()\n                .expect(\"successful invocation\")\n        );\n    }\n\n    #[test]\n    fn untracked_files() {\n        assert_eq!(\n            vec![\n                PathBuf::from(\"some-untracked-file\"),\n                PathBuf::from(\"another-untracked-file\"),\n                PathBuf::from(\"some/file with spaces.txt\"),\n            ],\n            cli(\"git-untracked-files\")\n                .untracked_files()\n                .expect(\"successful invocation\")\n        );\n        assert_eq!(\n            Vec::<PathBuf>::new(),\n            cli(\"git-untracked-files-empty\")\n                .untracked_files()\n                .expect(\"successful invocation\")\n        );\n    }\n\n    #[test]\n    fn get_head_revision() {\n        assert_eq!(\n            \"some-commit-hash\",\n            cli(\"git-get-head-revision\")\n                .get_head_revision()\n                .expect(\"successful invocation\")\n                .as_ref()\n        );\n    }\n\n    #[test]\n    fn stage() {\n        cli(\"git-stage\")\n            .stage(&PathBuf::from(\"test-path\"))\n            .expect(\"successful invocation\");\n    }\n\n    #[test]\n    fn commit_on_behalf() {\n        cli(\"git-commit-on-behalf\")\n            .commit_on_behalf(\n                \"Bot Name\",\n                \"bot@example.com\",\n                \"Some Author\",\n                \"author@example.com\",\n                \"Test message\",\n            )\n            .expect(\"successful invocation\");\n    }\n\n    #[test]\n    fn commit() {\n        cli(\"git-commit\")\n            .commit(\"Some Author\", \"author@example.com\", \"Test message\")\n            .expect(\"successful invocation\");\n    }\n\n    #[test]\n    fn rev_list() {\n        assert_eq!(\n            vec![\n                CommitHash::from(\"second-commit\"),\n                CommitHash::from(\"initial-commit\")\n            ],\n            cli(\"git-rev-list\")\n                .rev_list(\"start_inclusive\", \"end_exclusive\", None)\n                .expect(\"successful invocation\")\n        );\n        assert_eq!(\n            vec![\n                CommitHash::from(\"third-commit\"),\n                CommitHash::from(\"second-commit\"),\n                CommitHash::from(\"initial-commit\")\n            ],\n            cli(\"git-rev-list-path\")\n                .rev_list(\n                    \"start_inclusive\",\n                    \"end_exclusive\",\n                    Some(&PathBuf::from(\"some-path\"))\n                )\n                .expect(\"successful invocation\")\n        );\n    }\n\n    #[test]\n    fn show() {\n        assert_eq!(\n            Commit {\n                hash: \"some-commit-hash\".into(),\n                author_name: \"Some Author\".into(),\n                author_email: \"author@example.com\".into(),\n                message_subject: \"Some message subject\".into(),\n                message_body: \"Message body\\n  with multiple lines\".into()\n            },\n            cli(\"git-show\")\n                .show(\"test_revision\")\n                .expect(\"successful invocation\")\n        );\n    }\n\n    #[test]\n    fn hard_reset() {\n        cli(\"git-reset-hard\")\n            .hard_reset(\"some-revision\")\n            .expect(\"successful invocation\");\n    }\n\n    #[test]\n    fn current_branch_name() {\n        assert_eq!(\n            \"some-branch-name\",\n            cli(\"git-current-branch-name\")\n                .current_branch_name()\n                .expect(\"successful invocation\")\n        );\n    }\n\n    #[test]\n    fn create_branch() {\n        cli(\"git-create-branch\")\n            .create_branch(\"test-branch-name\", \"test-revision\")\n            .expect(\"successful invocation\");\n    }\n\n    #[test]\n    fn delete_branch() {\n        cli(\"git-delete-branch\")\n            .delete_branch(\"test-branch-name\")\n            .expect(\"successful invocation\");\n    }\n\n    #[test]\n    fn squash_merge() {\n        cli(\"git-squash-merge\")\n            .squash_merge(\"some-dev\", \"some-email@example.com\", \"test-branch-name\")\n            .expect(\"successful invocation\");\n    }\n\n    #[test]\n    fn repository_root_check() {\n        let tmp_dir = TempDir::new().unwrap();\n        GitCLI::new(tmp_dir.path())\n            .err()\n            .expect(\"repository root check should fail\");\n\n        fs::create_dir(tmp_dir.path().join(\".git\")).unwrap();\n        GitCLI::new(tmp_dir.path()).expect(\"repository root check should succeed\");\n    }\n\n    #[test]\n    fn repository_root_check_works_for_git_submodules() {\n        let tmp_dir = TempDir::new().unwrap();\n        GitCLI::new(tmp_dir.path())\n            .err()\n            .expect(\"repository root check should fail\");\n\n        fs::write(tmp_dir.path().join(\".git\"), \"gitdir: some/fake/path\").unwrap();\n        GitCLI::new(tmp_dir.path()).expect(\"repository root check should succeed\");\n    }\n}\n"
  },
  {
    "path": "tools/ci-build/smithy-rs-tool-common/src/index.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::retry::{run_with_retry_sync, ErrorClass};\nuse anyhow::{anyhow, Context, Error, Result};\nuse crates_index::Crate;\nuse reqwest::StatusCode;\nuse semver::Version;\nuse std::{collections::HashMap, time::Duration};\nuse std::{fs, path::Path};\n\npub struct CratesIndex(Inner);\n\nenum Inner {\n    Fake(FakeIndex),\n    Real(crates_index::SparseIndex),\n}\n\nimpl CratesIndex {\n    /// Returns a real sparse crates.io index.\n    pub fn real() -> Result<Self> {\n        Ok(Self(Inner::Real(\n            crates_index::SparseIndex::new_cargo_default()\n                .context(\"failed to initialize the sparse crates.io index\")?,\n        )))\n    }\n\n    /// Returns a fake crates.io index from file, panicking if loading fails.\n    pub fn fake(path: impl AsRef<Path>) -> Self {\n        Self(Inner::Fake(FakeIndex::from_file(path)))\n    }\n\n    /// Returns a fake crates.io index from a hashmap\n    pub fn fake_from_map(versions: HashMap<String, Vec<String>>) -> Self {\n        Self(Inner::Fake(FakeIndex { crates: versions }))\n    }\n\n    /// Retrieves the published versions for the given crate name.\n    pub fn published_versions(&self, crate_name: &str) -> Result<Vec<String>> {\n        match &self.0 {\n            Inner::Fake(index) => Ok(index.crates.get(crate_name).cloned().unwrap_or_default()),\n            Inner::Real(index) => Ok(run_with_retry_sync(\n                \"retrieve published versions\",\n                3,\n                Duration::from_secs(1),\n                || published_versions(index, crate_name),\n                |_err| ErrorClass::Retry,\n            )?),\n        }\n    }\n}\n\npub fn is_published(index: &CratesIndex, crate_name: &str, version: &Version) -> Result<bool> {\n    let crate_name = crate_name.to_string();\n    let versions = index.published_versions(&crate_name)?;\n    Ok(versions.contains(&version.to_string()))\n}\n\nfn published_versions(index: &crates_index::SparseIndex, crate_name: &str) -> Result<Vec<String>> {\n    let url = index\n        .crate_url(crate_name)\n        .expect(\"crate name is not empty string\");\n    let crate_meta: Option<Crate> = reqwest::blocking::get(url)\n        .map_err(Error::from)\n        .and_then(|response| {\n            let status = response.status();\n            response.bytes().map(|b| (status, b)).map_err(Error::from)\n        })\n        .and_then(|(status, bytes)| match status {\n            status if status.is_success() => {\n                Crate::from_slice(&bytes).map_err(Error::from).map(Some)\n            }\n            StatusCode::NOT_FOUND => Ok(None),\n            status => {\n                let body = String::from_utf8_lossy(&bytes);\n                Err(anyhow!(\n                    \"request to crates.io index failed ({status}):\\n{body}\"\n                ))\n            }\n        })\n        .with_context(|| format!(\"failed to retrieve crates.io metadata for {crate_name}\"))?;\n    Ok(crate_meta\n        .map(|meta| {\n            meta.versions()\n                .iter()\n                .map(|v| v.version().to_string())\n                .collect()\n        })\n        .unwrap_or_default())\n}\n\n/// Fake crates.io index for testing\npub struct FakeIndex {\n    crates: HashMap<String, Vec<String>>,\n}\n\nimpl FakeIndex {\n    fn from_file(path: impl AsRef<Path>) -> FakeIndex {\n        let bytes = fs::read(path.as_ref()).unwrap();\n        let toml: toml::Value = toml::from_slice(&bytes).unwrap();\n        let crates: HashMap<String, Vec<_>> = toml[\"crates\"]\n            .as_table()\n            .expect(\"missing crates table\")\n            .into_iter()\n            .map(|(k, v)| {\n                (\n                    k.into(),\n                    v.as_array()\n                        .expect(\"value must be array\")\n                        .iter()\n                        .map(|v| v.as_str().expect(\"must be string\").to_string())\n                        .collect::<Vec<_>>(),\n                )\n            })\n            .collect();\n        FakeIndex { crates }\n    }\n}\n\n#[cfg(test)]\nmod test {\n    use crate::index::{is_published, CratesIndex};\n    use semver::Version;\n    use std::collections::HashMap;\n    use std::sync::Arc;\n\n    /// Ignored test against the real index\n    #[ignore]\n    #[test]\n    fn test_known_published_versions() {\n        let index = Arc::new(CratesIndex::real().unwrap());\n        let known_published = Version::new(1, 1, 7);\n        let known_never_published = Version::new(999, 999, 999);\n        assert!(is_published(&index, \"aws-smithy-runtime-api\", &known_published).unwrap());\n\n        assert!(!is_published(&index, \"aws-smithy-runtime-api\", &known_never_published).unwrap());\n    }\n\n    /// Ignored test against the real index\n    #[test]\n    fn test_against_fake_index() {\n        let mut crates = HashMap::new();\n        crates.insert(\n            \"aws-smithy-runtime-api\".to_string(),\n            vec![\"1.1.7\".to_string()],\n        );\n        let index = Arc::new(CratesIndex::fake_from_map(crates));\n        let known_published = Version::new(1, 1, 7);\n        let known_never_published = Version::new(999, 999, 999);\n        assert!(is_published(&index, \"aws-smithy-runtime-api\", &known_published).unwrap());\n\n        assert!(!is_published(&index, \"aws-smithy-runtime-api\", &known_never_published).unwrap());\n    }\n}\n"
  },
  {
    "path": "tools/ci-build/smithy-rs-tool-common/src/lib.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npub mod changelog;\npub mod ci;\npub mod command;\npub mod git;\n#[macro_use]\npub mod macros;\npub mod index;\npub mod package;\npub mod release_tag;\npub mod retry;\npub mod shell;\npub mod versions_manifest;\n\n// https://github.com/aws-sdk-rust-ci\npub const RUST_SDK_CI_OWNER: &str = \"aws-sdk-rust-ci\";\n"
  },
  {
    "path": "tools/ci-build/smithy-rs-tool-common/src/macros.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n/// A macro for attaching info to error messages pointing to the line of code responsible for the error.\n/// [Thanks to dtolnay for this macro](https://github.com/dtolnay/anyhow/issues/22#issuecomment-542309452)\n#[macro_export]\nmacro_rules! here {\n    () => {\n        concat!(\"error at \", file!(), \":\", line!(), \":\", column!())\n    };\n    ($message:tt) => {\n        concat!($message, \" (\", here!(), \")\")\n    };\n}\n\n// export this macro for use in other modules in this crate\npub use here;\n"
  },
  {
    "path": "tools/ci-build/smithy-rs-tool-common/src/package.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::RUST_SDK_CI_OWNER;\nuse anyhow::{Context, Result};\nuse cargo_toml::{Dependency, DepsSet, Manifest};\nuse semver::Version;\nuse serde::{Deserialize, Serialize};\nuse std::{\n    collections::BTreeSet,\n    fmt, fs,\n    path::{Path, PathBuf},\n};\n\npub const SMITHY_PREFIX: &str = \"aws-smithy-\";\npub const SDK_PREFIX: &str = \"aws-sdk-\";\n\n#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Deserialize, Serialize)]\npub enum PackageCategory {\n    SmithyRuntime,\n    AwsRuntime,\n    AwsSdk,\n    Unknown,\n}\n\nimpl PackageCategory {\n    /// Returns true if the category is `AwsRuntime` or `AwsSdk`\n    pub fn is_sdk(&self) -> bool {\n        matches!(self, PackageCategory::AwsRuntime | PackageCategory::AwsSdk)\n    }\n\n    /// Categorizes a package based on its name\n    pub fn from_package_name(name: &str) -> PackageCategory {\n        if name.starts_with(SMITHY_PREFIX) {\n            PackageCategory::SmithyRuntime\n        } else if name.starts_with(SDK_PREFIX) {\n            PackageCategory::AwsSdk\n        } else if name.starts_with(\"aws-\") {\n            PackageCategory::AwsRuntime\n        } else {\n            PackageCategory::Unknown\n        }\n    }\n}\n\n/// Enum to denote whether a package we have control over publishing is stable or not\n///\n/// If a package is a third-party one and we cannot publish it, then it is considered as `Unstable`.\n/// In general, tooling cares about crates that we have control over publishing, so the third-party\n/// crates being marked as `Unstable` does not affect the integrity of tooling.\n#[derive(Clone, Copy, Debug, Eq, PartialEq)]\npub enum PackageStability {\n    Stable,\n    Unstable,\n}\n\n/// Information required to identify a package (crate).\n#[derive(Clone, Debug, Eq, PartialEq, Ord, PartialOrd)]\npub struct PackageHandle {\n    pub name: String,\n    pub version: Option<Version>,\n}\n\nimpl PackageHandle {\n    pub fn new(name: impl Into<String>, version: Option<Version>) -> Self {\n        Self {\n            name: name.into(),\n            version,\n        }\n    }\n\n    /// Returns the expected owners of the crate.\n    pub fn expected_owners(&self) -> &[&str] {\n        expected_owners()\n    }\n\n    /// Returns the version number or panics\n    pub fn expect_version(&self) -> &Version {\n        if let Some(version) = &self.version {\n            version\n        } else {\n            panic!(\"Crate version number required for {}\", self.name)\n        }\n    }\n}\n\nimpl fmt::Display for PackageHandle {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        match &self.version {\n            Some(version) => write!(f, \"{}-{version}\", self.name),\n            _ => f.write_str(&self.name),\n        }\n    }\n}\n\n#[derive(Copy, Clone, Debug, Eq, PartialEq, PartialOrd, Ord)]\npub enum Publish {\n    Allowed,\n    NotAllowed,\n}\n\n/// Represents a crate (called Package since crate is a reserved word).\n#[derive(Clone, Debug, Eq, PartialEq, PartialOrd, Ord)]\npub struct Package {\n    /// Package name and version information\n    pub handle: PackageHandle,\n    /// Package category (Generated, SmithyRuntime, AwsRuntime, etc.)\n    pub category: PackageCategory,\n    /// Location to the crate on the current file system\n    pub crate_path: PathBuf,\n    /// Location to the crate manifest on the current file system\n    pub manifest_path: PathBuf,\n    /// Dependencies used by this package\n    pub local_dependencies: BTreeSet<PackageHandle>,\n    /// Whether or not the package should be published\n    pub publish: Publish,\n}\n\nimpl Package {\n    pub fn new(\n        handle: PackageHandle,\n        manifest_path: impl Into<PathBuf>,\n        local_dependencies: BTreeSet<PackageHandle>,\n        publish: Publish,\n    ) -> Self {\n        let manifest_path = manifest_path.into();\n        let category = PackageCategory::from_package_name(&handle.name);\n        Self {\n            handle,\n            category,\n            crate_path: manifest_path.parent().unwrap().into(),\n            manifest_path,\n            local_dependencies,\n            publish,\n        }\n    }\n\n    /// Try to load a package from the given path.\n    pub fn try_load_path(path: impl AsRef<Path>) -> Result<Option<Package>> {\n        let path = path.as_ref();\n        let manifest_path = path.join(\"Cargo.toml\");\n        if path.is_dir() && manifest_path.exists() {\n            let manifest = fs::read(&manifest_path)\n                .context(\"failed to read manifest\")\n                .with_context(|| format!(\"{manifest_path:?}\"))?;\n            Self::try_load_manifest(manifest_path, &manifest)\n        } else {\n            Ok(None)\n        }\n    }\n\n    /// Returns `Ok(None)` when the Cargo.toml is a workspace rather than a package\n    pub fn try_load_manifest(\n        manifest_path: impl AsRef<Path>,\n        manifest: &[u8],\n    ) -> Result<Option<Package>> {\n        let manifest_path = manifest_path.as_ref();\n        let mut manifest = Manifest::from_slice(manifest)\n            .with_context(|| format!(\"failed to load package manifest for {manifest_path:?}\"))?;\n        manifest.complete_from_path(manifest_path)?;\n        if let Some(package) = manifest.package {\n            let name = package.name;\n            let version = parse_version(manifest_path, &package.version.unwrap())?;\n            let handle = PackageHandle {\n                name,\n                version: Some(version),\n            };\n            let publish = match package.publish.unwrap() {\n                cargo_toml::Publish::Flag(true) => Publish::Allowed,\n                _ => Publish::NotAllowed,\n            };\n\n            let mut local_dependencies = BTreeSet::new();\n            local_dependencies.extend(read_dependencies(manifest_path, &manifest.dependencies)?);\n            local_dependencies.extend(read_dependencies(\n                manifest_path,\n                &manifest.dev_dependencies,\n            )?);\n            local_dependencies.extend(read_dependencies(\n                manifest_path,\n                &manifest.build_dependencies,\n            )?);\n            Ok(Some(Package::new(\n                handle,\n                manifest_path,\n                local_dependencies,\n                publish,\n            )))\n        } else {\n            Ok(None)\n        }\n    }\n\n    /// Returns `true` if this package depends on `other`\n    pub fn locally_depends_on(&self, other: &PackageHandle) -> bool {\n        self.local_dependencies.contains(other)\n    }\n\n    /// Returns the expected owners of the crate.\n    pub fn expected_owners(&self) -> &[&str] {\n        expected_owners()\n    }\n}\n\nfn expected_owners() -> &'static [&'static str] {\n    &[RUST_SDK_CI_OWNER]\n}\n\n/// Parses a semver version number and adds additional error context when parsing fails.\npub fn parse_version(manifest_path: &Path, version: &str) -> Result<Version> {\n    Version::parse(version)\n        .with_context(|| format!(\"Invalid crate version {version} in {manifest_path:?}.\"))\n}\n\nfn read_dependencies(path: &Path, dependencies: &DepsSet) -> Result<Vec<PackageHandle>> {\n    let mut result = Vec::new();\n    for (name, metadata) in dependencies {\n        match metadata {\n            Dependency::Simple(_) => {}\n            Dependency::Detailed(detailed) => {\n                if detailed.path.is_some() {\n                    let version = detailed\n                        .version\n                        .as_ref()\n                        .map(|version| parse_version(path, version))\n                        .transpose()?;\n                    result.push(PackageHandle::new(name, version));\n                }\n            }\n            Dependency::Inherited(_) => panic!(\"workspace deps are unsupported\"),\n        }\n    }\n    Ok(result)\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use semver::Version;\n\n    fn version(version: &str) -> Option<Version> {\n        Some(Version::parse(version).unwrap())\n    }\n\n    #[test]\n    fn try_load_manifest_success() {\n        let manifest = br#\"\n            [package]\n            name = \"test\"\n            version = \"1.2.0-preview\"\n\n            [build-dependencies]\n            build_something = \"1.3\"\n            local_build_something = { version = \"0.2.0\", path = \"../local_build_something\" }\n\n            [dev-dependencies]\n            dev_something = \"1.1\"\n            local_dev_something = { version = \"0.1.0\", path = \"../local_dev_something\" }\n\n            [dependencies]\n            something = \"1.0\"\n            local_something = { version = \"1.1.3\", path = \"../local_something\" }\n        \"#;\n        let path: PathBuf = \"test/Cargo.toml\".into();\n\n        let package = Package::try_load_manifest(&path, manifest)\n            .expect(\"parse success\")\n            .expect(\"is a package\");\n        assert_eq!(\"test\", package.handle.name);\n        assert_eq!(version(\"1.2.0-preview\"), package.handle.version);\n\n        let mut expected = BTreeSet::new();\n        expected.insert(PackageHandle::new(\n            \"local_build_something\",\n            version(\"0.2.0\"),\n        ));\n        expected.insert(PackageHandle::new(\"local_dev_something\", version(\"0.1.0\")));\n        expected.insert(PackageHandle::new(\"local_something\", version(\"1.1.3\")));\n        assert_eq!(expected, package.local_dependencies);\n    }\n\n    #[test]\n    fn try_load_manifest_version_requirement_invalid() {\n        let manifest = br#\"\n            [package]\n            name = \"test\"\n            version = \"1.2.0-preview\"\n\n            [dependencies]\n            local_something = { version = \"1.0\", path = \"../local_something\" }\n        \"#;\n        let path: PathBuf = \"test/Cargo.toml\".into();\n\n        let error = format!(\n            \"{}\",\n            Package::try_load_manifest(&path, manifest).expect_err(\"should fail\")\n        );\n        assert!(\n            error.contains(\"Invalid crate version\"),\n            \"'{error}' should contain 'Invalid crate version'\"\n        );\n    }\n\n    fn package(name: &str, dependencies: &[&str]) -> Package {\n        Package::new(\n            PackageHandle::new(name, version(\"1.0.0\")),\n            format!(\"{name}/Cargo.toml\"),\n            dependencies\n                .iter()\n                .map(|d| PackageHandle::new(*d, version(\"1.0.0\")))\n                .collect(),\n            Publish::Allowed,\n        )\n    }\n\n    #[test]\n    fn test_expected_package_owners_server_crate() {\n        let server_packages = vec![\n            package(\"aws-smithy-http-server\", &[]),\n            package(\"aws-smithy-http-server-python\", &[]),\n            package(\"aws-smithy-http-server-typescript\", &[]),\n            package(\"aws-smithy-legacy-http-server\", &[]),\n        ];\n        for pkg in server_packages {\n            assert_eq!(&[\"aws-sdk-rust-ci\"], pkg.expected_owners());\n        }\n    }\n\n    #[test]\n    fn test_expected_package_owners_sdk_crate() {\n        let sdk_package = package(\"aws-types\", &[]);\n        assert_eq!(&[\"aws-sdk-rust-ci\"], sdk_package.expected_owners());\n    }\n\n    #[test]\n    fn test_expected_package_owners_smithy_runtime_crate() {\n        let smithy_runtime_package = package(\"aws-smithy-types\", &[]);\n        assert_eq!(\n            &[\"aws-sdk-rust-ci\"],\n            smithy_runtime_package.expected_owners()\n        );\n    }\n}\n"
  },
  {
    "path": "tools/ci-build/smithy-rs-tool-common/src/release_tag.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse anyhow::bail;\nuse lazy_static::lazy_static;\nuse regex::Regex;\nuse semver::Version;\nuse std::cmp::Ordering;\nuse std::fmt;\nuse std::str::FromStr;\n\nlazy_static! {\n    static ref VERSION_TAG: Regex = Regex::new(r\"^v(\\d+)\\.(\\d+)\\.(\\d+)$\").unwrap();\n    static ref DATE_TAG: Regex = Regex::new(r\"^release-(\\d{4}-\\d{2}-\\d{2})(.(\\d+))?$\").unwrap();\n}\n\n#[derive(Clone, Debug, Eq, PartialEq)]\npub struct VersionReleaseTag {\n    version: Version,\n    original: String,\n}\n\n#[derive(Clone, Debug, Eq, PartialEq)]\npub struct DateReleaseTag {\n    date: String,\n    suffix: Option<usize>,\n    original: String,\n}\n\n/// Represents a GitHub release tag used in aws-sdk-rust or smithy-rs.\n///\n/// Release tags can be compared with each other to see which is older/newer.\n/// Date-based tags are always considered newer than version-based tags.\n#[derive(Clone, Debug, Eq, PartialEq)]\npub enum ReleaseTag {\n    /// Version based tag (only used in older versions)\n    Version(VersionReleaseTag),\n    /// Date based tag\n    Date(DateReleaseTag),\n}\n\nimpl ReleaseTag {\n    /// Returns the string representation of the tag\n    pub fn as_str(&self) -> &str {\n        match self {\n            ReleaseTag::Version(v) => &v.original,\n            ReleaseTag::Date(d) => &d.original,\n        }\n    }\n}\n\nimpl FromStr for ReleaseTag {\n    type Err = anyhow::Error;\n\n    fn from_str(value: &str) -> Result<Self, Self::Err> {\n        if let Some(caps) = VERSION_TAG.captures(value) {\n            Ok(ReleaseTag::Version(VersionReleaseTag {\n                version: Version::new(\n                    caps.get(1).expect(\"validated by regex\").as_str().parse()?,\n                    caps.get(2).expect(\"validated by regex\").as_str().parse()?,\n                    caps.get(3).expect(\"validated by regex\").as_str().parse()?,\n                ),\n                original: value.into(),\n            }))\n        } else if let Some(caps) = DATE_TAG.captures(value) {\n            Ok(ReleaseTag::Date(DateReleaseTag {\n                date: caps.get(1).expect(\"validated by regex\").as_str().into(),\n                suffix: caps.get(3).map(|s| usize::from_str(s.as_str()).unwrap()),\n                original: value.into(),\n            }))\n        } else {\n            bail!(\"Tag `{value}` doesn't match a known format\")\n        }\n    }\n}\n\nimpl fmt::Display for ReleaseTag {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        match self {\n            Self::Version(v) => write!(f, \"{}\", v.original),\n            Self::Date(d) => write!(f, \"{}\", d.original),\n        }\n    }\n}\n\nimpl Ord for ReleaseTag {\n    fn cmp(&self, other: &Self) -> Ordering {\n        match (self, other) {\n            (ReleaseTag::Date(_), ReleaseTag::Version(_)) => Ordering::Greater,\n            (ReleaseTag::Version(_), ReleaseTag::Date(_)) => Ordering::Less,\n            (ReleaseTag::Date(lhs), ReleaseTag::Date(rhs)) => {\n                lhs.date.cmp(&rhs.date).then(lhs.suffix.cmp(&rhs.suffix))\n            }\n            (ReleaseTag::Version(lhs), ReleaseTag::Version(rhs)) => lhs.version.cmp(&rhs.version),\n        }\n    }\n}\n\nimpl PartialOrd for ReleaseTag {\n    fn partial_cmp(&self, other: &Self) -> Option<Ordering> {\n        Some(self.cmp(other))\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n\n    fn tag(value: &str) -> ReleaseTag {\n        ReleaseTag::from_str(value).unwrap()\n    }\n\n    #[test]\n    fn test_parse() {\n        assert_eq!(\n            ReleaseTag::Version(VersionReleaseTag {\n                version: Version::new(0, 4, 1),\n                original: \"v0.4.1\".into(),\n            }),\n            tag(\"v0.4.1\")\n        );\n\n        assert_eq!(\n            ReleaseTag::Date(DateReleaseTag {\n                date: \"2022-07-26\".into(),\n                original: \"release-2022-07-26\".into(),\n                suffix: None\n            }),\n            tag(\"release-2022-07-26\")\n        );\n\n        assert_eq!(\n            ReleaseTag::Date(DateReleaseTag {\n                date: \"2022-07-26\".into(),\n                original: \"release-2022-07-26.2\".into(),\n                suffix: Some(2)\n            }),\n            tag(\"release-2022-07-26.2\")\n        );\n\n        assert!(ReleaseTag::from_str(\"foo\").is_err());\n    }\n\n    #[test]\n    fn test_comparison() {\n        assert!(tag(\"v0.4.2\") < tag(\"v0.4.10\"));\n        assert!(tag(\"v0.4.1\") < tag(\"v0.5.0\"));\n        assert!(tag(\"v0.4.1\") < tag(\"release-2022-07-26\"));\n        assert!(tag(\"release-2022-07-20\") < tag(\"release-2022-07-26\"));\n        assert!(tag(\"release-2022-06-20\") < tag(\"release-2022-07-01\"));\n        assert!(tag(\"release-2021-06-20\") < tag(\"release-2022-06-20\"));\n        assert!(tag(\"release-2022-06-20\") < tag(\"release-2022-06-20.2\"));\n        assert!(tag(\"release-2022-06-20.2\") < tag(\"release-2022-06-20.3\"));\n        assert!(tag(\"release-2022-06-20.1\") < tag(\"release-2022-06-20.10\"));\n        assert!(tag(\"release-2022-06-20.10\") < tag(\"release-2022-06-20.11\"));\n    }\n\n    #[test]\n    fn test_display() {\n        assert_eq!(\"v0.4.2\", format!(\"{}\", tag(\"v0.4.2\")));\n        assert_eq!(\n            \"release-2022-07-26\",\n            format!(\"{}\", tag(\"release-2022-07-26\"))\n        );\n        assert_eq!(\n            \"release-2022-07-26.2\",\n            format!(\"{}\", tag(\"release-2022-07-26.2\"))\n        );\n    }\n}\n"
  },
  {
    "path": "tools/ci-build/smithy-rs-tool-common/src/retry.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::error::Error;\nuse std::error::Error as StdError;\nuse std::time::Duration;\nuse tracing::{error, info};\n\npub type BoxError = Box<dyn StdError + Send + Sync + 'static>;\n\npub enum ErrorClass {\n    Retry,\n    NoRetry,\n}\n\n#[derive(thiserror::Error, Debug)]\npub enum RetryError {\n    #[error(\"failed with unretryable error\")]\n    FailedUnretryable(#[source] Box<dyn Error + Send + Sync + 'static>),\n    #[error(\"failed {0} times and won't be retried again\")]\n    FailedMaxAttempts(usize),\n}\n\n#[cfg(feature = \"async\")]\npub async fn run_with_retry<F, Ft, C, O, E>(\n    what: &str,\n    max_attempts: usize,\n    backoff: Duration,\n    create_future: F,\n    classify_error: C,\n) -> Result<O, RetryError>\nwhere\n    F: Fn() -> Ft,\n    Ft: std::future::Future<Output = Result<O, E>> + Send,\n    C: Fn(&E) -> ErrorClass,\n    E: Into<BoxError>,\n{\n    assert!(max_attempts > 0);\n\n    let mut attempt = 1;\n    loop {\n        let future = create_future();\n        match future.await {\n            Ok(output) => return Ok(output),\n            Err(err) => {\n                match classify_error(&err) {\n                    ErrorClass::NoRetry => {\n                        return Err(RetryError::FailedUnretryable(err.into()));\n                    }\n                    ErrorClass::Retry => {\n                        info!(\n                            \"{} failed on attempt {} with retryable error: {:?}. Will retry after {:?}\",\n                            what, attempt, err.into(), backoff\n                        );\n                    }\n                }\n            }\n        }\n\n        // If we made it this far, we're retrying or failing at max retries\n        if attempt == max_attempts {\n            return Err(RetryError::FailedMaxAttempts(max_attempts));\n        }\n        attempt += 1;\n        tokio::time::sleep(backoff).await;\n    }\n}\n\npub fn run_with_retry_sync<F, C, O, E>(\n    what: &str,\n    max_attempts: usize,\n    backoff: Duration,\n    op: F,\n    classify_error: C,\n) -> Result<O, RetryError>\nwhere\n    F: Fn() -> Result<O, E>,\n    C: Fn(&E) -> ErrorClass,\n    E: Into<BoxError>,\n{\n    assert!(max_attempts > 0);\n\n    let mut attempt = 1;\n    loop {\n        let result = (op)();\n        match result {\n            Ok(output) => return Ok(output),\n            Err(err) => {\n                match classify_error(&err) {\n                    ErrorClass::NoRetry => {\n                        return Err(RetryError::FailedUnretryable(err.into()));\n                    }\n                    ErrorClass::Retry => {\n                        info!(\n                            \"{} failed on attempt {} with retryable error: {:?}. Will retry after {:?}\",\n                            what, attempt, err.into(), backoff\n                        );\n                    }\n                }\n            }\n        }\n\n        // If we made it this far, we're retrying or failing at max retries\n        if attempt == max_attempts {\n            return Err(RetryError::FailedMaxAttempts(max_attempts));\n        }\n        attempt += 1;\n        std::thread::sleep(backoff);\n    }\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n    use std::sync::atomic::{AtomicU8, Ordering};\n    use std::sync::Arc;\n\n    #[derive(thiserror::Error, Debug)]\n    #[error(\"FakeError\")]\n    struct FakeError;\n\n    #[derive(thiserror::Error, Debug)]\n    #[error(\"UnretryableError\")]\n    struct UnretryableError;\n\n    fn assert_send<T: Send>(thing: T) -> T {\n        thing\n    }\n\n    #[tokio::test]\n    #[cfg(feature = \"async\")]\n    async fn fail_max_attempts() {\n        let attempt = Arc::new(AtomicU8::new(1));\n        let result = {\n            let attempt = attempt.clone();\n            assert_send(run_with_retry(\n                \"test\",\n                3,\n                Duration::from_millis(0),\n                move || {\n                    let attempt = attempt.clone();\n                    Box::pin(async move {\n                        attempt.fetch_add(1, Ordering::Relaxed);\n                        Result::<(), _>::Err(FakeError)\n                    })\n                },\n                |_err| ErrorClass::Retry,\n            ))\n            .await\n        };\n\n        assert!(matches!(result, Err(RetryError::FailedMaxAttempts(3))));\n        // `attempt` holds the number of the next attempt, so 4 instead of 3 in this case\n        assert_eq!(4, attempt.load(Ordering::Relaxed));\n    }\n\n    #[tokio::test]\n    #[cfg(feature = \"async\")]\n    async fn fail_then_succeed() {\n        let attempt = Arc::new(AtomicU8::new(1));\n        let result = {\n            let attempt = attempt.clone();\n            run_with_retry(\n                \"test\",\n                3,\n                Duration::from_millis(0),\n                move || {\n                    let attempt = attempt.clone();\n                    Box::pin(async move {\n                        if attempt.fetch_add(1, Ordering::Relaxed) == 1 {\n                            Err(FakeError)\n                        } else {\n                            Ok(2)\n                        }\n                    })\n                },\n                |_err| ErrorClass::Retry,\n            )\n            .await\n        };\n\n        assert!(matches!(result, Ok(2)));\n        // `attempt` holds the number of the next attempt, so 3 instead of 2 in this case\n        assert_eq!(3, attempt.load(Ordering::Relaxed));\n    }\n\n    #[tokio::test]\n    #[cfg(feature = \"async\")]\n    async fn unretryable_error() {\n        let attempt = Arc::new(AtomicU8::new(1));\n        let result = {\n            let attempt = attempt.clone();\n            run_with_retry(\n                \"test\",\n                3,\n                Duration::from_millis(0),\n                move || {\n                    let attempt = attempt.clone();\n                    Box::pin(async move {\n                        if attempt.fetch_add(1, Ordering::Relaxed) == 1 {\n                            Err(UnretryableError)\n                        } else {\n                            Ok(2)\n                        }\n                    })\n                },\n                |err| {\n                    if matches!(err, UnretryableError) {\n                        ErrorClass::NoRetry\n                    } else {\n                        ErrorClass::Retry\n                    }\n                },\n            )\n            .await\n        };\n\n        match result {\n            Err(RetryError::FailedUnretryable(err)) => {\n                assert!(err.downcast_ref::<UnretryableError>().is_some());\n            }\n            _ => panic!(\"should be an unretryable error\"),\n        }\n        assert_eq!(2, attempt.load(Ordering::Relaxed));\n    }\n\n    #[test]\n    fn fail_max_attempts_sync() {\n        let attempt = Arc::new(AtomicU8::new(1));\n        let result = {\n            let attempt = attempt.clone();\n            assert_send(run_with_retry_sync(\n                \"test\",\n                3,\n                Duration::from_millis(0),\n                {\n                    let attempt = attempt.clone();\n                    move || {\n                        attempt.fetch_add(1, Ordering::Relaxed);\n                        Result::<(), _>::Err(FakeError)\n                    }\n                },\n                |_err| ErrorClass::Retry,\n            ))\n        };\n\n        assert!(matches!(result, Err(RetryError::FailedMaxAttempts(3))));\n        // `attempt` holds the number of the next attempt, so 4 instead of 3 in this case\n        assert_eq!(4, attempt.load(Ordering::Relaxed));\n    }\n\n    #[test]\n    fn fail_then_succeed_sync() {\n        let attempt = Arc::new(AtomicU8::new(1));\n        let result = {\n            let attempt = attempt.clone();\n            run_with_retry_sync(\n                \"test\",\n                3,\n                Duration::from_millis(0),\n                {\n                    let attempt = attempt.clone();\n                    move || {\n                        if attempt.fetch_add(1, Ordering::Relaxed) == 1 {\n                            Err(FakeError)\n                        } else {\n                            Ok(2)\n                        }\n                    }\n                },\n                |_err| ErrorClass::Retry,\n            )\n        };\n\n        assert!(matches!(result, Ok(2)));\n        // `attempt` holds the number of the next attempt, so 3 instead of 2 in this case\n        assert_eq!(3, attempt.load(Ordering::Relaxed));\n    }\n\n    #[test]\n    fn unretryable_error_sync() {\n        let attempt = Arc::new(AtomicU8::new(1));\n        let result = {\n            let attempt = attempt.clone();\n            run_with_retry_sync(\n                \"test\",\n                3,\n                Duration::from_millis(0),\n                {\n                    let attempt = attempt.clone();\n                    move || {\n                        if attempt.fetch_add(1, Ordering::Relaxed) == 1 {\n                            Err(UnretryableError)\n                        } else {\n                            Ok(2)\n                        }\n                    }\n                },\n                |err| {\n                    if matches!(err, UnretryableError) {\n                        ErrorClass::NoRetry\n                    } else {\n                        ErrorClass::Retry\n                    }\n                },\n            )\n        };\n\n        match result {\n            Err(RetryError::FailedUnretryable(err)) => {\n                assert!(err.downcast_ref::<UnretryableError>().is_some());\n            }\n            _ => panic!(\"should be an unretryable error\"),\n        }\n        assert_eq!(2, attempt.load(Ordering::Relaxed));\n    }\n}\n"
  },
  {
    "path": "tools/ci-build/smithy-rs-tool-common/src/shell.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! In general, the `crate::command` module should be preferred over this one going forward.\n//!\n//! This module was an attempt to make unit testing against command-line tools easier (especially\n//! in regards to git), but over time we've been realizing it's easier to just set up fake git\n//! repositories to run real commands against, or to mock out individual pieces of functionality\n//! where needed rather than individual commands. This module requires a ton of boilerplate for\n//! what is providing.\n\nuse anyhow::Result;\nuse async_trait::async_trait;\nuse std::process::Output;\n\n#[async_trait]\npub trait ShellOperation {\n    type Output: Send + 'static;\n\n    /// Runs the command synchronously.\n    fn run(&self) -> Result<Self::Output>;\n\n    /// Runs the command asynchronously.\n    #[cfg(feature = \"async\")]\n    async fn spawn(self) -> Result<Self::Output>\n    where\n        Self: Sized + 'static,\n    {\n        tokio::task::spawn_blocking(move || self.run()).await?\n    }\n}\n\n/// Returns (stdout, stderr)\npub fn output_text(output: &Output) -> (String, String) {\n    (\n        String::from_utf8_lossy(&output.stdout).to_string(),\n        String::from_utf8_lossy(&output.stderr).to_string(),\n    )\n}\n\npub fn handle_failure(operation_name: &str, output: &Output) -> Result<(), anyhow::Error> {\n    if !output.status.success() {\n        return Err(capture_error(operation_name, output));\n    }\n    Ok(())\n}\n\npub fn capture_error(operation_name: &str, output: &Output) -> anyhow::Error {\n    let message = format!(\n        \"Failed to {name}:\\nStatus: {status}\\nStdout: {stdout}\\nStderr: {stderr}\\n\",\n        name = operation_name,\n        status = if let Some(code) = output.status.code() {\n            format!(\"{code}\")\n        } else {\n            \"Killed by signal\".to_string()\n        },\n        stdout = String::from_utf8_lossy(&output.stdout),\n        stderr = String::from_utf8_lossy(&output.stderr)\n    );\n    anyhow::Error::msg(message)\n}\n"
  },
  {
    "path": "tools/ci-build/smithy-rs-tool-common/src/versions_manifest.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n//! This module provides structs with ser/de for working with the `versions.toml` file\n//! in the root of the `aws-sdk-rust` repository.\n\nuse crate::package::PackageCategory;\nuse crate::release_tag::ReleaseTag;\nuse anyhow::{Context, Result};\nuse serde::{Deserialize, Serialize};\nuse std::collections::BTreeMap;\nuse std::fs;\nuse std::path::Path;\nuse std::str::FromStr;\n\npub type CrateVersionMetadataMap = BTreeMap<String, CrateVersion>;\n\n/// Root struct representing a `versions.toml` manifest\n#[derive(Clone, Debug, Deserialize, Serialize, Eq, PartialEq)]\npub struct VersionsManifest {\n    /// Git commit hash of the version of smithy-rs used to generate this SDK\n    pub smithy_rs_revision: String,\n\n    // TODO(examples removal post cleanup): Remove this field once examples revision is removed\n    // from `versions.toml` in the main branch of `aws-sdk-rust` repository.\n    /// Git commit hash of the `aws-doc-sdk-examples` repository that was synced into this SDK\n    pub aws_doc_sdk_examples_revision: Option<String>,\n\n    /// Optional manual interventions to apply to the next release.\n    /// These are intended to be filled out manually in the `versions.toml` via pull request\n    /// to `aws-sdk-rust`.\n    #[serde(default)]\n    pub manual_interventions: ManualInterventions,\n\n    /// All SDK crate version metadata\n    pub crates: CrateVersionMetadataMap,\n\n    /// Crate versions that were a part of this SDK release.\n    /// Releases may not release every single crate, which can happen if a crate has no changes.\n    ///\n    /// This member is optional since a one-off smoke test SDK in local development\n    /// isn't going to have a previous release to reflect upon to determine release metadata.\n    pub release: Option<Release>,\n}\n\nimpl VersionsManifest {\n    pub fn from_file(path: impl AsRef<Path>) -> Result<VersionsManifest> {\n        Self::from_str(\n            &fs::read_to_string(path.as_ref())\n                .with_context(|| format!(\"Failed to read {:?}\", path.as_ref()))?,\n        )\n        .with_context(|| format!(\"Failed to parse {:?}\", path.as_ref()))\n    }\n\n    pub async fn from_github_tag(tag: &ReleaseTag) -> Result<VersionsManifest> {\n        let manifest_url =\n            format!(\"https://raw.githubusercontent.com/awslabs/aws-sdk-rust/{tag}/versions.toml\");\n        let manifest_contents = reqwest::get(manifest_url)\n            .await\n            .context(\"failed to download release manifest\")?\n            .text()\n            .await\n            .context(\"failed to download release manifest content\")?;\n        Self::from_str(&manifest_contents).context(\"failed to parse versions.toml file\")\n    }\n\n    pub fn write_to_file(&self, path: impl AsRef<Path>) -> Result<()> {\n        let serialized = toml::to_string_pretty(self)\n            .context(\"failed to serialize versions manifest into TOML\")?;\n        fs::write(path.as_ref(), serialized)\n            .with_context(|| format!(\"failed to write to {:?}\", path.as_ref()))?;\n        Ok(())\n    }\n}\n\nimpl FromStr for VersionsManifest {\n    type Err = anyhow::Error;\n\n    fn from_str(value: &str) -> Result<Self, Self::Err> {\n        Ok(toml::from_str(value)?)\n    }\n}\n\n/// The SDK release process has sanity checks sprinkled throughout it to make sure\n/// a release is done correctly. Sometimes, manual intervention is required to bypass\n/// these sanity checks. For example, when a service model is intentionally removed,\n/// without manual intervention, there would be no way to release that removal.\n#[derive(Clone, Debug, Default, Deserialize, Serialize, Eq, PartialEq)]\npub struct ManualInterventions {\n    /// List of crate names that are being removed from the SDK in the next release.\n    ///\n    /// __Note:__ this only bypasses a release-time sanity check. The models for these crates\n    /// (if they're generated) need to be manually deleted, and the crates must be manually\n    /// yanked after the release (if necessary).\n    #[serde(default)]\n    pub crates_to_remove: Vec<String>,\n}\n\n/// Release metadata\n#[derive(Clone, Debug, Deserialize, Serialize, Eq, PartialEq)]\npub struct Release {\n    /// The release tag associated with this `versions.toml`\n    pub tag: Option<String>,\n\n    /// Which crate versions were published with this release\n    pub crates: BTreeMap<String, String>,\n}\n\n/// Version metadata for a crate\n#[derive(Clone, Debug, Deserialize, Serialize, Eq, PartialEq)]\npub struct CrateVersion {\n    /// What kind of crate this is. Is it the Smithy runtime? AWS runtime? SDK crate?\n    pub category: PackageCategory,\n\n    /// Version of the crate.\n    pub version: String,\n\n    /// The hash of the crate source code as determined by the `crate-hasher` tool in smithy-rs.\n    pub source_hash: String,\n\n    /// The SHA-256 hash of the AWS model file(s) used to generate this crate (if this is a SDK crate).\n    pub model_hash: Option<String>,\n}\n"
  },
  {
    "path": "tools/ci-cdk/.eslintrc.json",
    "content": "{\n    \"env\": {\n        \"browser\": false,\n        \"es2021\": true\n    },\n    \"extends\": [\"eslint:recommended\", \"plugin:@typescript-eslint/recommended\", \"prettier\"],\n    \"parser\": \"@typescript-eslint/parser\",\n    \"parserOptions\": {\n        \"ecmaVersion\": 13,\n        \"sourceType\": \"module\"\n    },\n    \"plugins\": [\"@typescript-eslint\"],\n    \"rules\": {\n        \"@typescript-eslint/no-empty-function\": \"off\"\n    }\n}\n"
  },
  {
    "path": "tools/ci-cdk/.gitignore",
    "content": "*.js\n!jest.config.js\n*.d.ts\nnode_modules\nbuild\n\n# CDK asset staging directory\n.cdk.staging\ncdk.out\ncdk-outputs.json\n"
  },
  {
    "path": "tools/ci-cdk/.npmignore",
    "content": "*.ts\n!*.d.ts\n\n# CDK asset staging directory\n.cdk.staging\ncdk.out\n"
  },
  {
    "path": "tools/ci-cdk/.prettierrc",
    "content": "tabWidth: 4\nsingleQuote: false\nbracketSpacing: true\ntrailingComma: all\nprintWidth: 100\n"
  },
  {
    "path": "tools/ci-cdk/LICENSE",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n"
  },
  {
    "path": "tools/ci-cdk/README.md",
    "content": "# CI CDK\n\nThis is the CDK infrastructure as code for smithy-lang/smithy-rs and awslabs/aws-sdk-rust\ncontinuous integration.\n\nThe `cdk.json` file tells the CDK Toolkit how to synthesize the infrastructure.\n\n## Canary local development\n\nSometimes it's useful to only deploy the canary resources to a test AWS account to iterate\non the `canary-runner` and `canary-lambda`. To do this, run the following:\n\n```bash\nnpm install\nnpm run build\nnpx cdk --app \"node build/bin/smithy-rs/canary-only.js\" synth\nnpx cdk --app \"node build/bin/smithy-rs/canary-only.js\" deploy --outputs-file cdk-outputs.json\n```\n\nFrom there, you can just point the `canary-runner` to the `cdk-outputs.json` to run it:\n\n```bash\ncd canary-runner\ncargo run -- run --sdk-release-tag <version> --musl --cdk-output ../cdk-outputs.json\n```\n\n**NOTE:** You may want to add a `--profile` to the deploy command to select a specific credential\nprofile to deploy to if you don't want to use the default.\n\nAlso, if this is a new test AWS account, be sure it CDK bootstrap it before attempting to deploy.\n\n## Useful commands\n\n-   `npm run lint`: lint code\n-   `npm run format`: auto-format code\n-   `npm run build`: compile typescript to js\n-   `npm run watch`: watch for changes and compile\n-   `npm run test`: perform the jest unit tests\n-   `npx cdk deploy`: deploy this stack to your default AWS account/region\n-   `npx cdk diff`: compare deployed stack with current state\n-   `npx cdk synth`: emits the synthesized CloudFormation template\n"
  },
  {
    "path": "tools/ci-cdk/bin/aws-sdk-rust/canary-only.ts",
    "content": "#!/usr/bin/env node\n/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n// This CDK app sets up the absolute minimum set of resources to successfully\n// execute the canary with. However, this one is used by our internal CI only.\n// Use canary-only.ts in the sibling smithy-rs directory instead.\n\nimport \"source-map-support/register\";\nimport { App } from \"aws-cdk-lib\";\nimport { CanaryStack } from \"../../lib/canary-stack\";\n\nconst app = new App();\nconst env = { region: \"us-west-2\" };\n\nnew CanaryStack(app, \"aws-sdk-rust-canary-stack\", {\n    lambdaExecutionRole: \"aws-sdk-rust-canary-lambda-exec-role\",\n    env,\n});\n"
  },
  {
    "path": "tools/ci-cdk/bin/aws-sdk-rust/canary.ts",
    "content": "#!/usr/bin/env node\n/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n// This CDK app, in addition to provisioning necessary resources for the canary,\n// deploys a GihHub OIDC role to execute it from a CI in the `aws-sdk-rust` repository.\n\nimport \"source-map-support/register\";\nimport { App } from \"aws-cdk-lib\";\nimport { CanaryStack, OidcProps } from \"../../lib/canary-stack\";\nimport { OidcProviderStack } from \"../../lib/oidc-provider-stack\";\n\nconst app = new App();\nconst env = { region: \"us-west-2\" };\n\nconst oidcProviderStack = new OidcProviderStack(app, \"oidc-provider-stack\", {\n    env,\n});\n\nconst oidcProps: OidcProps = {\n    roleId: \"aws-sdk-rust\",\n    roleName: \"aws-sdk-rust-canary\",\n    roleGithubOrg: \"awslabs\",\n    roleGithubRepo: \"aws-sdk-rust\",\n    provider: oidcProviderStack.githubActionsOidcProvider,\n};\n\nnew CanaryStack(app, \"aws-sdk-rust-canary-stack\", {\n    lambdaExecutionRole: \"aws-sdk-rust-canary-lambda-exec-role\",\n    oidcProps,\n    env,\n});\n"
  },
  {
    "path": "tools/ci-cdk/bin/smithy-rs/canary-only.ts",
    "content": "#!/usr/bin/env node\n/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n// This CDK app sets up the absolute minimum set of resources to successfully\n// execute the canary with.\n\nimport \"source-map-support/register\";\nimport { App } from \"aws-cdk-lib\";\nimport { CanaryStack } from \"../../lib/canary-stack\";\n\nconst app = new App();\nconst env = { region: \"us-west-2\" };\n\nnew CanaryStack(app, \"smithy-rs-canary-stack\", {\n    lambdaExecutionRole: \"smithy-rs-canary-lambda-exec-role\",\n    env,\n});\n"
  },
  {
    "path": "tools/ci-cdk/bin/smithy-rs/ci-cdk.ts",
    "content": "#!/usr/bin/env node\n/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n// This CDK app, in addition to provisioning necessary resources for CI checks\n// and the canary, deploys a GihHub OIDC role to execute the canary from a CI\n// in the `smithy-rs` repository.\n\nimport \"source-map-support/register\";\nimport { App } from \"aws-cdk-lib\";\nimport { PullRequestCdnStack } from \"../../lib/smithy-rs/pull-request-cdn-stack\";\nimport { CanaryStack, OidcProps } from \"../../lib/canary-stack\";\nimport { OidcProviderStack } from \"../../lib/oidc-provider-stack\";\n\nconst app = new App({});\nconst env = { region: \"us-west-2\" };\n\nconst oidcProviderStack = new OidcProviderStack(app, \"oidc-provider-stack\", {\n    env,\n});\n\nconst githubActionsOidcProvider = oidcProviderStack.githubActionsOidcProvider;\n\nconst oidcProps: OidcProps = {\n    roleId: \"smithy-rs\",\n    roleName: \"smithy-rs-canary\",\n    roleGithubOrg: \"smithy-lang\",\n    roleGithubRepo: \"smithy-rs\",\n    provider: githubActionsOidcProvider,\n};\n\nnew PullRequestCdnStack(app, \"smithy-rs-pull-request-cdn-stack\", {\n    githubActionsOidcProvider: githubActionsOidcProvider,\n    env,\n});\n\nnew CanaryStack(app, \"smithy-rs-canary-stack\", {\n    lambdaExecutionRole: \"smithy-rs-canary-lambda-exec-role\",\n    oidcProps,\n    env,\n});\n"
  },
  {
    "path": "tools/ci-cdk/canary-lambda/.gitignore",
    "content": "# The Cargo.toml should be generated every time it's needed\n/Cargo.toml\n/Cargo.lock\n/aws_sdk_rust_lambda_canary_wasm.wasm\n"
  },
  {
    "path": "tools/ci-cdk/canary-lambda/README.md",
    "content": "Canary Lambda\n=============\n\nThis is a Rust Lambda that exercises the AWS SDK for Rust in a real Lambda\nenvironment. It is intended to be rebuilt with the latest or previous AWS\nSDK version in the `aws-sdk-rust` repository, deployed, and then run to\ndetermine that that version is still OK.\n\nFor example, after releasing a new version of the SDK to crates.io, this\ncan be compiled against that new version, deployed, and run to verify the\ndeployed SDK is functioning correctly. Similarly, it can be used to verify\nthe previous version of the SDK continues to work after the deployment\nof the new version.\n\nRunning the canary locally\n--------------------------\nFor testing, it's helpful to be able to run the canary locally. To accomplish this, you first need to generate\nCargo.tomls and the WASM module:\n\n```bash\ncd ../canary-runner\n# to use a version of the SDK, use `--sdk-version` instead\ncargo run -- build-bundle \\\n  --sdk-path ../../../aws/sdk/build/aws-sdk/sdk/ \\\n  --canary-path ../canary-lambda \\\n```\n\nNext, come back to the `canary-lambda` directory. Copy the WASM module from `smithy-rs/tools/target/wasm32-wasip2/release/aws_sdk_rust_lambda_canary_wasm.wasm`\ninto the top level of the `canary-lambda` crate. Then you can use `cargo run` in `--local` mode to\ninvoke the canary:\n\n> Note: if your default configuration does not provide a region, you must provide a region via the `AWS_REGION`\n> environment variable.\n\n```bash\nexport CANARY_S3_BUCKET_NAME=<your bucket name>\nexport CANARY_S3_MRAP_BUCKET_ARN=<your MRAP bucket ARN>\nexport CANARY_S3_EXPRESS_BUCKET_NAME=<your express bucket name>\nexport AWS_REGION=<region>\n# run with `--all-features` so you run all canaries (including canaries that don't work against older versions)\ncargo run --all-features -- --local\n```\n\nBuilding locally for Lambda from Amazon Linux 2\n-----------------------------------------------\n\n1. Build a code bundle:\n\n```\n$ cd smithy-rs/tools/ci-cdk/canary-runner\n$ cargo run -- build-bundle --canary-path ../canary-lambda --sdk-release-tag <release-tag> --musl\n```\n\nThis will place a zip file in `smithy-rs/target/release` that can be uploaded and tested against Lambda.\n\n\nBuilding locally for Lambda from non Amazon Linux 2 system\n----------------------------------------------------------\n\n1. Make sure the `musl-gcc` wrapper is installed.\n2. Add the musl target for Rust:\n\n```\n$ rustup target add x86_64-unknown-linux-musl\n```\n\n3. Build a code bundle:\n\n```\n$ cd smithy-rs/tools/ci-cdk/canary-runner\n$ cargo run -- build-bundle --canary-path ../canary-lambda --sdk-release-tag <release-tag> --musl\n```\n\nThis will place a zip file in `smithy-rs/target/x86_64-unknown-linux-musl/release` that can be\nuploaded and tested against Lambda.\n\n\nHow to add a new canary\n----------------------\n\nThe canary Lambda runs a list of canaries in parallel asynchronously. To add a new canary,\ndo the following:\n\n1. If new permissions are required, grant them to the OIDC role that is used to\n   run the canary Lambda using the CDK in the `tools/ci-cdk/` directory. Be sure\n   to deploy these changes to the canary AWS account.\n2. Add a new module to this `canary-lambda/` project to hold the canary code. This\n   should be implemented as an async function that returns an empty result.\n3. Wire up the new canary in the `get_canaries_to_run` function in the `canary` module.\n"
  },
  {
    "path": "tools/ci-cdk/canary-lambda/src/benches/ec2_canary.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::{mk_canary, CanaryEnv};\nuse aws_config::SdkConfig;\nuse aws_sdk_ec2 as ec2;\n\nmk_canary!(\"ec2\", |sdk_config: &SdkConfig, _env: &CanaryEnv| {\n    let client = ec2::Client::new(sdk_config);\n    async move {\n        let _ = client.describe_regions().send().await;\n        Ok(())\n    }\n});\n"
  },
  {
    "path": "tools/ci-cdk/canary-lambda/src/benches/mod.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npub(crate) mod ec2_canary;\npub(crate) mod s3_canary;\npub(crate) mod sts_canary;\n"
  },
  {
    "path": "tools/ci-cdk/canary-lambda/src/benches/s3_canary.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::{mk_canary, CanaryEnv};\nuse aws_config::SdkConfig;\nuse aws_sdk_s3 as s3;\n\nmk_canary!(\"s3\", |sdk_config: &SdkConfig, env: &CanaryEnv| {\n    let client = s3::Client::new(sdk_config);\n    let env = env.clone();\n    async move {\n        let _ = client\n            .list_objects_v2()\n            .bucket(env.s3_bucket_name.clone())\n            .send()\n            .await;\n        Ok(())\n    }\n});\n"
  },
  {
    "path": "tools/ci-cdk/canary-lambda/src/benches/sts_canary.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::{mk_canary, CanaryEnv};\nuse aws_config::SdkConfig;\nuse aws_sdk_sts as sts;\n\nmk_canary!(\"sts\", |sdk_config: &SdkConfig, _env: &CanaryEnv| {\n    let client = sts::Client::new(sdk_config);\n    async move {\n        let _ = client.get_caller_identity().send().await;\n        Ok(())\n    }\n});\n"
  },
  {
    "path": "tools/ci-cdk/canary-lambda/src/canary.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::env;\nuse std::fmt;\nuse std::future::Future;\nuse std::pin::Pin;\n\nuse aws_config::SdkConfig;\nuse tracing::{info_span, Instrument};\n\n#[cfg(not(feature = \"lambda-benchmark\"))]\nuse crate::current_canary::{paginator_canary, s3_canary, transcribe_canary, wasm_canary};\n\n#[cfg(feature = \"lambda-benchmark\")]\nuse crate::current_canary::{ec2_canary, s3_canary, sts_canary};\n\n#[macro_export]\nmacro_rules! mk_canary {\n    ($name: expr, $run_canary: expr) => {\n        pub(crate) fn mk_canary(\n            sdk_config: &aws_config::SdkConfig,\n            env: &CanaryEnv,\n        ) -> Option<(&'static str, $crate::canary::CanaryFuture)> {\n            #[allow(clippy::redundant_closure_call)]\n            Some(($name, Box::pin($run_canary(sdk_config, env))))\n        }\n    };\n}\n\npub fn get_canaries_to_run(\n    sdk_config: SdkConfig,\n    env: CanaryEnv,\n) -> Vec<(&'static str, CanaryFuture)> {\n    #[cfg(not(feature = \"lambda-benchmark\"))]\n    let canaries = vec![\n        paginator_canary::mk_canary(&sdk_config, &env),\n        s3_canary::mk_canary(&sdk_config, &env),\n        transcribe_canary::mk_canary(&sdk_config, &env),\n        wasm_canary::mk_canary(&sdk_config, &env),\n    ];\n\n    #[cfg(feature = \"lambda-benchmark\")]\n    let canaries = vec![\n        sts_canary::mk_canary(&sdk_config, &env),\n        s3_canary::mk_canary(&sdk_config, &env),\n        ec2_canary::mk_canary(&sdk_config, &env),\n    ];\n\n    canaries\n        .into_iter()\n        .flatten()\n        .map(|(name, fut)| {\n            (\n                name,\n                Box::pin(fut.instrument(info_span!(\"run_canary\", name = name))) as _,\n            )\n        })\n        .collect()\n}\n\n#[derive(Clone)]\npub struct CanaryEnv {\n    pub(crate) s3_bucket_name: String,\n    pub(crate) s3_mrap_bucket_arn: String,\n    pub(crate) s3_express_bucket_name: String,\n    pub(crate) expected_transcribe_result: String,\n    #[allow(dead_code)]\n    pub(crate) page_size: usize,\n}\n\nimpl fmt::Debug for CanaryEnv {\n    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {\n        f.debug_struct(\"CanaryEnv\")\n            .field(\"s3_bucket_name\", &\"*** redacted ***\")\n            .field(\"s3_mrap_bucket_arn\", &\"*** redacted ***\")\n            .field(\"s3_express_bucket_name\", &\"*** redacted ***\")\n            .field(\n                \"expected_transcribe_result\",\n                &self.expected_transcribe_result,\n            )\n            .finish()\n    }\n}\n\nimpl CanaryEnv {\n    pub fn from_env() -> Self {\n        // S3 bucket name to test against\n        let s3_bucket_name =\n            env::var(\"CANARY_S3_BUCKET_NAME\").expect(\"CANARY_S3_BUCKET_NAME must be set\");\n        // S3 MRAP bucket name to test against\n        #[cfg(not(feature = \"lambda-benchmark\"))]\n        let (s3_mrap_bucket_arn, s3_express_bucket_name) = (\n            env::var(\"CANARY_S3_MRAP_BUCKET_ARN\").expect(\"CANARY_S3_MRAP_BUCKET_ARN must be set\"),\n            env::var(\"CANARY_S3_EXPRESS_BUCKET_NAME\")\n                .expect(\"CANARY_S3_EXPRESS_BUCKET_NAME must be set\"),\n        );\n        #[cfg(feature = \"lambda-benchmark\")]\n        let (s3_mrap_bucket_arn, s3_express_bucket_name) = (\n            env::var(\"CANARY_S3_MRAP_BUCKET_ARN\").unwrap_or_default(),\n            env::var(\"CANARY_S3_EXPRESS_BUCKET_NAME\").unwrap_or_default(),\n        );\n\n        // Expected transcription from Amazon Transcribe from the embedded audio file.\n        // This is an environment variable so that the code doesn't need to be changed if\n        // Amazon Transcribe starts returning different output for the same audio.\n        let expected_transcribe_result = env::var(\"CANARY_EXPECTED_TRANSCRIBE_RESULT\")\n            .unwrap_or_else(|_| {\n                \"Good day to you transcribe. This is Polly talking to you from the Rust SDK.\"\n                    .to_string()\n            });\n\n        let page_size = env::var(\"PAGE_SIZE\")\n            .map(|ps| ps.parse::<usize>())\n            .unwrap_or_else(|_| Ok(16))\n            .expect(\"invalid page size\");\n\n        Self {\n            s3_bucket_name,\n            s3_mrap_bucket_arn,\n            s3_express_bucket_name,\n            expected_transcribe_result,\n            page_size,\n        }\n    }\n}\n\n#[derive(Debug, thiserror::Error)]\n#[error(\"{0}\")]\npub struct CanaryError(pub String);\n\npub type CanaryFuture = Pin<Box<dyn Future<Output = anyhow::Result<()>> + Send>>;\n"
  },
  {
    "path": "tools/ci-cdk/canary-lambda/src/latest/paginator_canary.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::mk_canary;\nuse anyhow::bail;\n\nuse aws_sdk_ec2 as ec2;\nuse aws_sdk_ec2::types::InstanceType;\n\nuse crate::CanaryEnv;\n\nmk_canary!(\n    \"ec2_paginator\",\n    |sdk_config: &aws_config::SdkConfig, env: &CanaryEnv| {\n        paginator_canary(ec2::Client::new(sdk_config), env.page_size)\n    }\n);\n\npub async fn paginator_canary(client: ec2::Client, page_size: usize) -> anyhow::Result<()> {\n    let mut history = client\n        .describe_spot_price_history()\n        .instance_types(InstanceType::M1Medium)\n        .into_paginator()\n        .page_size(page_size as i32)\n        .send();\n\n    let mut num_pages = 0;\n    while let Some(page) = history.try_next().await? {\n        let items_in_page = page.spot_price_history.unwrap_or_default().len();\n        if items_in_page > page_size {\n            bail!(\n                \"failed to retrieve results of correct page size (expected {page_size}, got {items_in_page})\",\n            )\n        }\n        num_pages += 1;\n    }\n    if num_pages < 2 {\n        bail!(\"expected 3+ pages containing ~60 results but got {num_pages} pages\",)\n    }\n\n    // https://github.com/awslabs/aws-sdk-rust/issues/405\n    let _ = client\n        .describe_vpcs()\n        .into_paginator()\n        .items()\n        .send()\n        .collect::<Result<Vec<_>, _>>()\n        .await?;\n\n    Ok(())\n}\n\n#[cfg(test)]\nmod test {\n    use super::paginator_canary;\n\n    #[tokio::test]\n    async fn test_paginator() {\n        let conf = aws_config::load_from_env().await;\n        let client = aws_sdk_ec2::Client::new(&conf);\n        paginator_canary(client, 20).await.unwrap()\n    }\n}\n"
  },
  {
    "path": "tools/ci-cdk/canary-lambda/src/latest/s3_canary.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::canary::CanaryError;\nuse crate::{mk_canary, CanaryEnv};\nuse anyhow::{Context, Error};\nuse aws_config::SdkConfig;\nuse aws_sdk_s3 as s3;\nuse aws_sdk_s3::types::{\n    CompletedMultipartUpload, CompletedPart, Delete, ObjectIdentifier, RequestPayer,\n};\nuse s3::config::Region;\nuse s3::presigning::PresigningConfig;\nuse s3::primitives::ByteStream;\nuse std::time::Duration;\nuse uuid::Uuid;\n\nconst METADATA_TEST_VALUE: &str = \"some   value\";\n\nmk_canary!(\"s3\", |sdk_config: &SdkConfig, env: &CanaryEnv| {\n    let sdk_config = sdk_config.clone();\n    let env = env.clone();\n    async move {\n        let client = s3::Client::new(&sdk_config);\n        s3_canary(client.clone(), env.s3_bucket_name.clone()).await?;\n        s3_mrap_canary(client.clone(), env.s3_mrap_bucket_arn.clone()).await?;\n        s3_express_canary(client, env.s3_express_bucket_name.clone()).await\n    }\n});\n\n/// Runs canary exercising S3 APIs against a regular bucket\npub async fn s3_canary(client: s3::Client, s3_bucket_name: String) -> anyhow::Result<()> {\n    let test_key = Uuid::new_v4().as_u128().to_string();\n    let mut presigned_test_key = test_key.clone();\n    presigned_test_key.push_str(\"_presigned\");\n\n    // Look for the test object and expect that it doesn't exist\n    match client\n        .get_object()\n        .bucket(&s3_bucket_name)\n        .key(&test_key)\n        .send()\n        .await\n    {\n        Ok(_) => {\n            return Err(\n                CanaryError(format!(\"Expected object {test_key} to not exist in S3\")).into(),\n            );\n        }\n        Err(err) => {\n            let err = err.into_service_error();\n            // If we get anything other than \"No such key\", we have a problem\n            if !err.is_no_such_key() {\n                return Err(err).context(\"unexpected s3::GetObject failure\");\n            }\n        }\n    }\n\n    // Put the test object\n    client\n        .put_object()\n        .bucket(&s3_bucket_name)\n        .key(&test_key)\n        .body(ByteStream::from_static(b\"test\"))\n        .metadata(\"something\", METADATA_TEST_VALUE)\n        .send()\n        .await\n        .context(\"s3::PutObject\")?;\n\n    // Get the test object and verify it looks correct\n    let output = client\n        .get_object()\n        .bucket(&s3_bucket_name)\n        .key(&test_key)\n        .send()\n        .await\n        .context(\"s3::GetObject[2]\")?;\n\n    // Repeat the GET/PUT tests with a presigned url\n    let reqwest_client = reqwest::Client::new();\n\n    let presigned_put = client\n        .put_object()\n        .bucket(&s3_bucket_name)\n        .key(&presigned_test_key)\n        .presigned(PresigningConfig::expires_in(Duration::from_secs(120)).unwrap())\n        .await\n        .unwrap();\n    let http_put = presigned_put.make_http_1x_request(\"presigned_test\");\n    let reqwest_put = reqwest::Request::try_from(http_put).unwrap();\n    let put_resp = reqwest_client.execute(reqwest_put).await?;\n    assert_eq!(put_resp.status(), 200);\n\n    let presigned_get = client\n        .get_object()\n        .bucket(&s3_bucket_name)\n        .key(&presigned_test_key)\n        // Ensure a header is included that isn't in the query string\n        .request_payer(RequestPayer::Requester)\n        .presigned(PresigningConfig::expires_in(Duration::from_secs(120)).unwrap())\n        .await\n        .unwrap();\n    let headers = presigned_get.make_http_1x_request(\"\").headers().clone();\n    let get_resp = reqwest_client\n        .get(presigned_get.uri().to_string())\n        .headers(headers)\n        .send()\n        .await\n        .context(\"s3::presigned\")?\n        .text()\n        .await?;\n    if get_resp != \"presigned_test\" {\n        return Err(CanaryError(format!(\"presigned URL returned bad data: {get_resp:?}\")).into());\n    }\n\n    let metadata_value = output\n        .metadata()\n        .and_then(|m| m.get(\"something\"))\n        .map(String::as_str);\n    let result: anyhow::Result<()> = match metadata_value {\n        Some(value) => {\n            if value == METADATA_TEST_VALUE {\n                let payload = output\n                    .body\n                    .collect()\n                    .await\n                    .context(\"download s3::GetObject[2] body\")?\n                    .into_bytes();\n                if std::str::from_utf8(payload.as_ref()).context(\"s3 payload\")? == \"test\" {\n                    Ok(())\n                } else {\n                    Err(CanaryError(\"S3 object body didn't match what was put there\".into()).into())\n                }\n            } else {\n                Err(CanaryError(format!(\n                    \"S3 metadata was incorrect. Expected `{METADATA_TEST_VALUE}` but got `{value}`.\",\n                ))\n                .into())\n            }\n        }\n        None => Err(CanaryError(\"S3 metadata was missing\".into()).into()),\n    };\n\n    // Delete the test object\n    client\n        .delete_object()\n        .bucket(&s3_bucket_name)\n        .key(&test_key)\n        .send()\n        .await\n        .context(\"s3::DeleteObject\")?;\n\n    result\n}\n\n/// Runs canary exercising S3 APIs against an MRAP bucket\npub async fn s3_mrap_canary(client: s3::Client, s3_mrap_bucket_arn: String) -> anyhow::Result<()> {\n    let test_key = Uuid::new_v4().as_u128().to_string();\n\n    // We deliberately use a region that doesn't exist here so that we can\n    // ensure these requests are SigV4a requests. Because the current endpoint\n    // resolver always resolves the wildcard region ('*') for SigV4a requests,\n    // setting a fictitious region ensures that the request would fail if it was\n    // a SigV4 request. Therefore, because the request doesn't fail, we can be\n    // sure it's a successful Sigv4a request.\n    let config_override = s3::Config::builder().region(Region::new(\"parts-unknown\"));\n    // Put the test object\n    client\n        .put_object()\n        .bucket(&s3_mrap_bucket_arn)\n        .key(&test_key)\n        .body(ByteStream::from_static(b\"test\"))\n        .metadata(\"something\", METADATA_TEST_VALUE)\n        .customize()\n        .config_override(config_override.clone())\n        .send()\n        .await\n        .context(\"s3::PutObject[MRAP]\")?;\n\n    // Get the test object and verify it looks correct\n    let output = client\n        .get_object()\n        .bucket(&s3_mrap_bucket_arn)\n        .key(&test_key)\n        .customize()\n        .config_override(config_override.clone())\n        .send()\n        .await\n        .context(\"s3::GetObject[MRAP]\")?;\n\n    let metadata_value = output\n        .metadata()\n        .and_then(|m| m.get(\"something\"))\n        .map(String::as_str);\n    let result = match metadata_value {\n        Some(value) => {\n            if value == METADATA_TEST_VALUE {\n                Ok(())\n            } else {\n                Err(CanaryError(format!(\n                    \"S3 metadata was incorrect. Expected `{METADATA_TEST_VALUE}` but got `{value}`.\",\n                ))\n                .into())\n            }\n        }\n        None => Err(CanaryError(\"S3 metadata was missing\".into()).into()),\n    };\n\n    // Delete the test object\n    client\n        .delete_object()\n        .bucket(&s3_mrap_bucket_arn)\n        .key(&test_key)\n        .customize()\n        .config_override(config_override)\n        .send()\n        .await\n        .context(\"s3::DeleteObject[MRAP]\")?;\n\n    result\n}\n\n/// Runs canary exercising S3 APIs against an Express One Zone bucket\npub async fn s3_express_canary(\n    client: s3::Client,\n    s3_express_bucket_name: String,\n) -> anyhow::Result<()> {\n    let test_key = Uuid::new_v4().as_u128().to_string();\n\n    // Test a directory bucket exists\n    let directory_buckets = client\n        .list_directory_buckets()\n        .send()\n        .await\n        .context(\"s3::ListDirectoryBuckets[Express]\")?;\n    assert!(directory_buckets\n        .buckets\n        .map(|buckets| buckets\n            .iter()\n            .any(|b| b.name() == Some(&s3_express_bucket_name)))\n        .expect(\"true\"));\n\n    // Check test object does not exist in the directory bucket\n    let list_objects_v2_output = client\n        .list_objects_v2()\n        .bucket(&s3_express_bucket_name)\n        .send()\n        .await\n        .context(\"s3::ListObjectsV2[EXPRESS]\")?;\n    match list_objects_v2_output.contents {\n        Some(contents) => {\n            // should the directory bucket contains some leftover object,\n            // it better not be the test object\n            assert!(!contents.iter().any(|c| c.key() == Some(&test_key)));\n        }\n        _ => { /* No objects in the directory bucket, good to go */ }\n    }\n\n    // Put the test object\n    client\n        .put_object()\n        .bucket(&s3_express_bucket_name)\n        .key(&test_key)\n        .body(ByteStream::from_static(b\"test\"))\n        .metadata(\"something\", METADATA_TEST_VALUE)\n        .send()\n        .await\n        .context(\"s3::PutObject[EXPRESS]\")?;\n\n    // Get the test object and verify it looks correct\n    let output = client\n        .get_object()\n        .bucket(&s3_express_bucket_name)\n        .key(&test_key)\n        .send()\n        .await\n        .context(\"s3::GetObject[EXPRESS]\")?;\n\n    // repeat the test with a presigned url\n    let uri = client\n        .get_object()\n        .bucket(&s3_express_bucket_name)\n        .key(&test_key)\n        .presigned(PresigningConfig::expires_in(Duration::from_secs(120)).unwrap())\n        .await\n        .unwrap();\n    let response = reqwest::get(uri.uri().to_string())\n        .await\n        .context(\"s3::presigned\")?\n        .text()\n        .await?;\n    if response != \"test\" {\n        return Err(CanaryError(format!(\"presigned URL returned bad data: {response:?}\")).into());\n    }\n\n    let metadata_value = output\n        .metadata()\n        .and_then(|m| m.get(\"something\"))\n        .map(String::as_str);\n    let result: anyhow::Result<()> = match metadata_value {\n        Some(value) => {\n            if value == METADATA_TEST_VALUE {\n                let payload = output\n                    .body\n                    .collect()\n                    .await\n                    .context(\"download s3::GetObject[EXPRESS] body\")?\n                    .into_bytes();\n                if std::str::from_utf8(payload.as_ref()).context(\"s3 payload\")? == \"test\" {\n                    Ok(())\n                } else {\n                    Err(CanaryError(\"S3 object body didn't match what was put there\".into()).into())\n                }\n            } else {\n                Err(CanaryError(format!(\n                    \"S3 metadata was incorrect. Expected `{METADATA_TEST_VALUE}` but got `{value}`.\",\n                ))\n                .into())\n            }\n        }\n        None => Err(CanaryError(\"S3 metadata was missing\".into()).into()),\n    };\n\n    result?;\n\n    // Delete the test object\n    client\n        .delete_object()\n        .bucket(&s3_express_bucket_name)\n        .key(&test_key)\n        .send()\n        .await\n        .context(\"s3::DeleteObject[EXPRESS]\")?;\n\n    // Another key for MultipartUpload (verifying default checksum is None)\n    let test_key = Uuid::new_v4().as_u128().to_string();\n\n    // Create multipart upload\n    let create_mpu_output = client\n        .create_multipart_upload()\n        .bucket(&s3_express_bucket_name)\n        .key(&test_key)\n        .send()\n        .await\n        .unwrap();\n    let upload_id = create_mpu_output\n        .upload_id()\n        .context(\"s3::CreateMultipartUpload[EXPRESS]\")?;\n\n    // Upload part\n    let upload_part_output = client\n        .upload_part()\n        .bucket(&s3_express_bucket_name)\n        .key(&test_key)\n        .part_number(1)\n        .body(ByteStream::from_static(b\"test\"))\n        .upload_id(upload_id)\n        .send()\n        .await\n        .context(\"s3::UploadPart[EXPRESS]\")?;\n\n    // Complete multipart upload\n    client\n        .complete_multipart_upload()\n        .bucket(&s3_express_bucket_name)\n        .key(&test_key)\n        .upload_id(upload_id)\n        .multipart_upload(\n            CompletedMultipartUpload::builder()\n                .set_parts(Some(vec![CompletedPart::builder()\n                    .e_tag(upload_part_output.e_tag.unwrap_or_default())\n                    .part_number(1)\n                    .build()]))\n                .build(),\n        )\n        .send()\n        .await\n        .context(\"s3::CompleteMultipartUpload[EXPRESS]\")?;\n\n    // Delete test objects using the DeleteObjects operation whose default checksum should be CRC32\n    client\n        .delete_objects()\n        .bucket(&s3_express_bucket_name)\n        .delete(\n            Delete::builder()\n                .objects(\n                    ObjectIdentifier::builder()\n                        .key(&test_key)\n                        .build()\n                        .context(\"failed to build `ObjectIdentifier`\")?,\n                )\n                .build()\n                .context(\"failed to build `Delete`\")?,\n        )\n        .send()\n        .await\n        .context(\"s3::DeleteObjects[EXPRESS]\")?;\n\n    Ok::<(), Error>(())\n}\n\n// This test runs against an actual AWS account. Comment out the `ignore` to run it.\n// Be sure the following environment variables are set:\n//\n// - `TEST_S3_BUCKET`: The S3 bucket to use\n// - `TEST_S3_MRAP_BUCKET_ARN`: The MRAP bucket ARN to use\n// - `TEST_S3_EXPRESS_BUCKET`: The S3 express bucket to use\n//\n// Also, make sure the correct region (likely `us-west-2`) by the credentials or explictly.\n#[ignore]\n#[cfg(test)]\n#[tokio::test]\nasync fn test_s3_canary() {\n    let config = aws_config::load_from_env().await;\n    let client = s3::Client::new(&config);\n\n    let mut futures = Vec::new();\n\n    futures.push(tokio::spawn(s3_canary(\n        client.clone(),\n        std::env::var(\"TEST_S3_BUCKET\").expect(\"TEST_S3_BUCKET must be set\"),\n    )));\n    futures.push(tokio::spawn(s3_mrap_canary(\n        client.clone(),\n        std::env::var(\"TEST_S3_MRAP_BUCKET_ARN\").expect(\"TEST_S3_MRAP_BUCKET_ARN must be set\"),\n    )));\n    futures.push(tokio::spawn(s3_express_canary(\n        client,\n        std::env::var(\"TEST_S3_EXPRESS_BUCKET\").expect(\"TEST_S3_EXPRESS_BUCKET must be set\"),\n    )));\n\n    for fut in futures {\n        fut.await.expect(\"joined\").expect(\"success\");\n    }\n}\n"
  },
  {
    "path": "tools/ci-cdk/canary-lambda/src/latest/transcribe_canary.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::mk_canary;\nuse anyhow::bail;\nuse async_stream::stream;\nuse aws_config::SdkConfig;\nuse aws_sdk_transcribestreaming as transcribe;\nuse bytes::BufMut;\nuse edit_distance::edit_distance;\nuse transcribe::primitives::Blob;\nuse transcribe::types::{\n    AudioEvent, AudioStream, LanguageCode, MediaEncoding, TranscriptResultStream,\n};\n\nconst CHUNK_SIZE: usize = 8192;\nuse crate::canary::CanaryEnv;\n\nmk_canary!(\n    \"transcribe_canary\",\n    |sdk_config: &SdkConfig, env: &CanaryEnv| {\n        transcribe_canary(\n            transcribe::Client::new(sdk_config),\n            env.expected_transcribe_result.clone(),\n        )\n    }\n);\n\npub async fn transcribe_canary(\n    client: transcribe::Client,\n    expected_transcribe_result: String,\n) -> anyhow::Result<()> {\n    let input_stream = stream! {\n        let pcm = pcm_data();\n        for chunk in pcm.chunks(CHUNK_SIZE) {\n            yield Ok(AudioStream::AudioEvent(AudioEvent::builder().audio_chunk(Blob::new(chunk)).build()));\n        }\n    };\n\n    let mut output = client\n        .start_stream_transcription()\n        .language_code(LanguageCode::EnGb)\n        .media_sample_rate_hertz(8000)\n        .media_encoding(MediaEncoding::Pcm)\n        .audio_stream(input_stream.into())\n        .send()\n        .await?;\n\n    let mut full_message = String::new();\n    while let Some(event) = output.transcript_result_stream.recv().await? {\n        match event {\n            TranscriptResultStream::TranscriptEvent(transcript_event) => {\n                let transcript = transcript_event.transcript.unwrap();\n                for result in transcript.results.unwrap_or_default() {\n                    if !result.is_partial {\n                        let first_alternative = &result.alternatives.as_ref().unwrap()[0];\n                        full_message += first_alternative.transcript.as_ref().unwrap();\n                        full_message.push(' ');\n                    }\n                }\n            }\n            otherwise => panic!(\"received unexpected event type: {otherwise:?}\"),\n        }\n    }\n\n    let dist = edit_distance(&expected_transcribe_result, full_message.trim());\n    let max_edit_distance = 10;\n    if dist > max_edit_distance {\n        bail!(\n            \"Transcription from Transcribe doesn't look right:\\n\\\n            Expected: `{}`\\n\\\n            Actual:   `{}`\\n. The maximum allowed edit distance is {}. This had an edit distance of {}\",\n            expected_transcribe_result,\n            full_message.trim(),\n            max_edit_distance,\n            dist\n        )\n    }\n    Ok(())\n}\n\nfn pcm_data() -> Vec<u8> {\n    let reader =\n        hound::WavReader::new(&include_bytes!(\"../../audio/hello-transcribe-8000.wav\")[..])\n            .expect(\"valid wav data\");\n    let samples_result: hound::Result<Vec<i16>> = reader.into_samples::<i16>().collect();\n\n    let mut pcm: Vec<u8> = Vec::new();\n    for sample in samples_result.unwrap() {\n        pcm.put_i16_le(sample);\n    }\n    pcm\n}\n"
  },
  {
    "path": "tools/ci-cdk/canary-lambda/src/latest/wasm_canary.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::{mk_canary, CanaryEnv};\n\nuse aws_config::SdkConfig;\nuse wasmtime::component::{bindgen, Component, Linker};\nuse wasmtime::{Engine, Store};\nuse wasmtime_wasi::WasiCtxBuilder;\n\nmk_canary!(\"wasm\", |_sdk_config: &SdkConfig, _env: &CanaryEnv| {\n    wasm_canary()\n});\n\n//This macro creates bindings to call the wasm functions in Rust\nbindgen!({\n    world: \"canary-world\",\n    path: \"../canary-wasm/wit/component.wit\",\n    exports: {\n        default: async\n    },\n});\n\nstruct WasiHostCtx {\n    preview2_ctx: wasmtime_wasi::WasiCtx,\n    preview2_table: wasmtime::component::ResourceTable,\n    wasi_http_ctx: wasmtime_wasi_http::WasiHttpCtx,\n}\n\nimpl wasmtime_wasi::WasiView for WasiHostCtx {\n    fn ctx(&mut self) -> wasmtime_wasi::WasiCtxView<'_> {\n        wasmtime_wasi::WasiCtxView {\n            ctx: &mut self.preview2_ctx,\n            table: &mut self.preview2_table,\n        }\n    }\n}\n\nimpl wasmtime_wasi_http::types::WasiHttpView for WasiHostCtx {\n    fn ctx(&mut self) -> &mut wasmtime_wasi_http::WasiHttpCtx {\n        &mut self.wasi_http_ctx\n    }\n\n    fn table(&mut self) -> &mut wasmtime::component::ResourceTable {\n        &mut self.preview2_table\n    }\n}\n\npub async fn wasm_canary() -> anyhow::Result<()> {\n    let wasm_bin_path = std::env::current_dir()\n        .expect(\"Current dir\")\n        .join(\"aws_sdk_rust_lambda_canary_wasm.wasm\");\n\n    // Create a Wasmtime Engine configured to run Components\n    let engine = Engine::new(\n        wasmtime::Config::new()\n            .wasm_component_model(true)\n            .async_support(true),\n    )?;\n\n    // Create our component from the wasm file\n    let component = Component::from_file(&engine, wasm_bin_path)?;\n\n    // Create the linker and link in the necessary WASI bindings\n    let mut linker = Linker::new(&engine);\n    wasmtime_wasi::p2::add_to_linker_async(&mut linker)?;\n    wasmtime_wasi_http::add_only_http_to_linker_async(&mut linker)?;\n\n    // Configure and create a `WasiCtx`, which WASI functions need access to\n    // through the host state of the store (which in this case is the host state\n    // of the store)\n    let wasi_ctx = WasiCtxBuilder::new()\n        .inherit_stderr()\n        .inherit_stdout()\n        .build();\n\n    let host_ctx = WasiHostCtx {\n        preview2_ctx: wasi_ctx,\n        preview2_table: wasmtime_wasi::ResourceTable::new(),\n        wasi_http_ctx: wasmtime_wasi_http::WasiHttpCtx::new(),\n    };\n\n    let mut store: Store<WasiHostCtx> = Store::new(&engine, host_ctx);\n\n    // Instantiate our module with the bindgen! bindings\n    let bindings = CanaryWorld::instantiate_async(&mut store, &component, &linker).await?;\n\n    let canary_interface = bindings.aws_component_canary_interface();\n    let api_result = canary_interface\n        .call_run_canary(store)\n        .await?\n        .map_err(anyhow::Error::msg)?;\n\n    assert!(!api_result.is_empty());\n\n    Ok(())\n}\n\n#[cfg(test)]\n#[tokio::test]\nasync fn test_wasm_canary() {\n    wasm_canary().await.expect(\"Wasm return\")\n}\n"
  },
  {
    "path": "tools/ci-cdk/canary-lambda/src/latest.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npub(crate) mod paginator_canary;\npub(crate) mod s3_canary;\npub(crate) mod transcribe_canary;\npub(crate) mod wasm_canary;\n"
  },
  {
    "path": "tools/ci-cdk/canary-lambda/src/main.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_config::SdkConfig;\nuse canary::{get_canaries_to_run, CanaryEnv};\nuse lambda_runtime::{Context as LambdaContext, Error};\nuse serde_json::{json, Value};\nuse std::collections::BTreeMap;\nuse std::env;\nuse std::future::Future;\nuse std::pin::Pin;\nuse std::time::Duration;\nuse tokio::task::JoinHandle;\nuse tokio::time::timeout;\nuse tracing::{info, info_span, Instrument};\nuse tracing_subscriber::layer::SubscriberExt;\nuse tracing_subscriber::EnvFilter;\nuse tracing_texray::TeXRayLayer;\n\nmod canary;\n\n#[cfg(feature = \"latest\")]\nmod latest;\n#[cfg(feature = \"latest\")]\npub(crate) use latest as current_canary;\n\n// NOTE: This module can be deleted 3 releases after release-2023-10-26\n#[cfg(feature = \"release-2023-10-26\")]\nmod release_2023_10_26;\n#[cfg(feature = \"release-2023-10-26\")]\npub(crate) use release_2023_10_26 as current_canary;\n\n#[cfg(feature = \"lambda-benchmark\")]\nmod benches;\n#[cfg(feature = \"lambda-benchmark\")]\npub(crate) use benches as current_canary;\n\n#[tokio::main]\nasync fn main() -> Result<(), Error> {\n    let subscriber = tracing_subscriber::registry()\n        .with(EnvFilter::from_default_env())\n        .with(tracing_subscriber::fmt::layer())\n        .with(\n            TeXRayLayer::new(), // by default, all metadata fields will be printed. If this is too noisy,\n                                // filter only the fields you care about\n                                //.only_show_fields(&[\"name\", \"operation\", \"service\"]),\n        );\n    tracing::subscriber::set_global_default(subscriber).unwrap();\n    let local = env::args().any(|arg| arg == \"--local\");\n    let main_handler = LambdaMain::new().await;\n    if local {\n        let result = lambda_main(main_handler.sdk_config)\n            .instrument(tracing_texray::examine(info_span!(\"run_canaries\")))\n            .await?;\n        if result\n            .as_object()\n            .expect(\"is object\")\n            .get_key_value(\"result\")\n            .expect(\"exists\")\n            .1\n            .as_str()\n            .expect(\"is str\")\n            == \"success\"\n        {\n            Ok(())\n        } else {\n            Err(format!(\"canary failed: {result:?}\").into())\n        }\n    } else {\n        lambda_runtime::run(main_handler).await?;\n        Ok(())\n    }\n}\n\n// Enables us to keep the clients alive between successive Lambda executions.\n// Not because we need to for this use-case, but to demonstrate how to.\nstruct LambdaMain {\n    sdk_config: SdkConfig,\n}\n\nimpl LambdaMain {\n    #[allow(deprecated)]\n    async fn new() -> Self {\n        Self {\n            sdk_config: aws_config::load_from_env().await,\n        }\n    }\n}\n\nimpl lambda_runtime::Handler<Value, Value> for LambdaMain {\n    type Error = Error;\n    type Fut = Pin<Box<dyn Future<Output = Result<Value, Error>>>>;\n\n    fn call(&self, _: Value, _: LambdaContext) -> Self::Fut {\n        Box::pin(lambda_main(self.sdk_config.clone()))\n    }\n}\n\nasync fn lambda_main(sdk_config: SdkConfig) -> Result<Value, Error> {\n    // Load necessary parameters from environment variables\n    let env = CanaryEnv::from_env();\n    info!(\"Env: {:#?}\", env);\n\n    // Get list of canaries to run and spawn them\n    let canaries = get_canaries_to_run(sdk_config, env);\n    let join_handles = canaries\n        .into_iter()\n        .map(|(name, future)| (name, tokio::spawn(future)))\n        .collect::<Vec<_>>();\n\n    // Wait for and aggregate results\n    let mut failures = BTreeMap::new();\n    for (name, handle) in join_handles {\n        if let Err(err) = canary_result(handle).await {\n            failures.insert(name, err);\n        }\n    }\n\n    let result = if failures.is_empty() {\n        json!({ \"result\": \"success\" })\n    } else {\n        json!({ \"result\": \"failure\", \"failures\": failures })\n    };\n    info!(\"Result: {}\", result);\n    Ok(result)\n}\n\nasync fn canary_result(handle: JoinHandle<anyhow::Result<()>>) -> Result<(), String> {\n    match timeout(Duration::from_secs(180), handle).await {\n        Err(_timeout) => Err(\"canary timed out\".into()),\n        Ok(Ok(result)) => match result {\n            Ok(_) => Ok(()),\n            Err(err) => Err(format!(\"{err:?}\")),\n        },\n        Ok(Err(err)) => Err(err.to_string()),\n    }\n}\n"
  },
  {
    "path": "tools/ci-cdk/canary-lambda/src/release_2023_10_26/paginator_canary.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::mk_canary;\nuse crate::CanaryEnv;\nuse anyhow::bail;\nuse aws_sdk_ec2 as ec2;\nuse aws_sdk_ec2::types::InstanceType;\nuse tokio_stream::StreamExt;\n\nmk_canary!(\n    \"ec2_paginator\",\n    |sdk_config: &aws_config::SdkConfig, env: &CanaryEnv| {\n        paginator_canary(ec2::Client::new(sdk_config), env.page_size)\n    }\n);\n\npub async fn paginator_canary(client: ec2::Client, page_size: usize) -> anyhow::Result<()> {\n    let mut history = client\n        .describe_spot_price_history()\n        .instance_types(InstanceType::M1Medium)\n        .into_paginator()\n        .page_size(page_size as i32)\n        .send();\n\n    let mut num_pages = 0;\n    while let Some(page) = history.try_next().await? {\n        let items_in_page = page.spot_price_history.unwrap_or_default().len();\n        if items_in_page > page_size {\n            bail!(\n                \"failed to retrieve results of correct page size (expected {}, got {})\",\n                page_size,\n                items_in_page\n            )\n        }\n        num_pages += 1;\n    }\n    if num_pages < 2 {\n        bail!(\n            \"expected 3+ pages containing ~60 results but got {} pages\",\n            num_pages\n        )\n    }\n\n    // https://github.com/awslabs/aws-sdk-rust/issues/405\n    let _ = client\n        .describe_vpcs()\n        .into_paginator()\n        .items()\n        .send()\n        .collect::<Result<Vec<_>, _>>()\n        .await?;\n\n    Ok(())\n}\n\n#[cfg(test)]\nmod test {\n    use super::paginator_canary;\n\n    #[tokio::test]\n    async fn test_paginator() {\n        let conf = aws_config::load_from_env().await;\n        let client = aws_sdk_ec2::Client::new(&conf);\n        paginator_canary(client, 20).await.unwrap()\n    }\n}\n"
  },
  {
    "path": "tools/ci-cdk/canary-lambda/src/release_2023_10_26/s3_canary.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::canary::CanaryError;\nuse crate::{mk_canary, CanaryEnv};\nuse anyhow::Context;\nuse aws_config::SdkConfig;\nuse aws_sdk_s3 as s3;\nuse s3::presigning::PresigningConfig;\nuse s3::primitives::ByteStream;\nuse std::time::Duration;\nuse uuid::Uuid;\n\nconst METADATA_TEST_VALUE: &str = \"some   value\";\n\nmk_canary!(\"s3\", |sdk_config: &SdkConfig, env: &CanaryEnv| s3_canary(\n    s3::Client::new(sdk_config),\n    env.s3_bucket_name.clone(),\n    env.s3_mrap_bucket_arn.clone()\n));\n\npub async fn s3_canary(\n    client: s3::Client,\n    s3_bucket_name: String,\n    _s3_mrap_bucket_arn: String,\n) -> anyhow::Result<()> {\n    let test_key = Uuid::new_v4().as_u128().to_string();\n\n    // Look for the test object and expect that it doesn't exist\n    match client\n        .get_object()\n        .bucket(&s3_bucket_name)\n        .key(&test_key)\n        .send()\n        .await\n    {\n        Ok(_) => {\n            return Err(\n                CanaryError(format!(\"Expected object {} to not exist in S3\", test_key)).into(),\n            );\n        }\n        Err(err) => {\n            let err = err.into_service_error();\n            // If we get anything other than \"No such key\", we have a problem\n            if !err.is_no_such_key() {\n                return Err(err).context(\"unexpected s3::GetObject failure\");\n            }\n        }\n    }\n\n    // Put the test object\n    client\n        .put_object()\n        .bucket(&s3_bucket_name)\n        .key(&test_key)\n        .body(ByteStream::from_static(b\"test\"))\n        .metadata(\"something\", METADATA_TEST_VALUE)\n        .send()\n        .await\n        .context(\"s3::PutObject\")?;\n\n    // Get the test object and verify it looks correct\n    let output = client\n        .get_object()\n        .bucket(&s3_bucket_name)\n        .key(&test_key)\n        .send()\n        .await\n        .context(\"s3::GetObject[2]\")?;\n\n    // repeat the test with a presigned url\n    let uri = client\n        .get_object()\n        .bucket(&s3_bucket_name)\n        .key(&test_key)\n        .presigned(PresigningConfig::expires_in(Duration::from_secs(120)).unwrap())\n        .await\n        .unwrap();\n    let response = reqwest::get(uri.uri().to_string())\n        .await\n        .context(\"s3::presigned\")?\n        .text()\n        .await?;\n    if response != \"test\" {\n        return Err(CanaryError(format!(\"presigned URL returned bad data: {:?}\", response)).into());\n    }\n\n    let mut result = Ok(());\n    match output.metadata() {\n        Some(map) => {\n            // Option::as_deref doesn't work here since the deref of &String is String\n            let value = map.get(\"something\").map(|s| s.as_str()).unwrap_or(\"\");\n            if value != METADATA_TEST_VALUE {\n                result = Err(CanaryError(format!(\n                    \"S3 metadata was incorrect. Expected `{}` but got `{}`.\",\n                    METADATA_TEST_VALUE, value\n                ))\n                .into());\n            }\n        }\n        None => {\n            result = Err(CanaryError(\"S3 metadata was missing\".into()).into());\n        }\n    }\n\n    let payload = output\n        .body\n        .collect()\n        .await\n        .context(\"download s3::GetObject[2] body\")?\n        .into_bytes();\n    if std::str::from_utf8(payload.as_ref()).context(\"s3 payload\")? != \"test\" {\n        result = Err(CanaryError(\"S3 object body didn't match what was put there\".into()).into());\n    }\n\n    {\n        println!(\"skipping MRAP tests because they're unsupported in this version.\")\n    }\n\n    // Delete the test object\n    client\n        .delete_object()\n        .bucket(&s3_bucket_name)\n        .key(&test_key)\n        .send()\n        .await\n        .context(\"s3::DeleteObject\")?;\n\n    result\n}\n\n// This test runs against an actual AWS account. Comment out the `ignore` to run it.\n// Be sure to set the `TEST_S3_BUCKET` environment variable to the S3 bucket to use,\n// and also make sure the credential profile sets the region (or set `AWS_DEFAULT_PROFILE`).\n#[ignore]\n#[cfg(test)]\n#[tokio::test]\nasync fn test_s3_canary() {\n    let config = aws_config::load_from_env().await;\n    let client = s3::Client::new(&config);\n    s3_canary(\n        client,\n        std::env::var(\"TEST_S3_BUCKET\").expect(\"TEST_S3_BUCKET must be set\"),\n        \"MRAP bucket ARN is unused in this version.\".to_owned(),\n    )\n    .await\n    .expect(\"success\");\n}\n"
  },
  {
    "path": "tools/ci-cdk/canary-lambda/src/release_2023_10_26/transcribe_canary.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse crate::canary::CanaryError;\nuse crate::mk_canary;\nuse async_stream::stream;\nuse aws_config::SdkConfig;\nuse aws_sdk_transcribestreaming as transcribe;\nuse bytes::BufMut;\nuse transcribe::primitives::Blob;\nuse transcribe::types::{\n    AudioEvent, AudioStream, LanguageCode, MediaEncoding, TranscriptResultStream,\n};\n\nconst CHUNK_SIZE: usize = 8192;\nuse crate::canary::CanaryEnv;\n\nmk_canary!(\n    \"transcribe_canary\",\n    |sdk_config: &SdkConfig, env: &CanaryEnv| {\n        transcribe_canary(\n            transcribe::Client::new(sdk_config),\n            env.expected_transcribe_result.clone(),\n        )\n    }\n);\n\npub async fn transcribe_canary(\n    client: transcribe::Client,\n    expected_transcribe_result: String,\n) -> anyhow::Result<()> {\n    let input_stream = stream! {\n        let pcm = pcm_data();\n        for chunk in pcm.chunks(CHUNK_SIZE) {\n            yield Ok(AudioStream::AudioEvent(AudioEvent::builder().audio_chunk(Blob::new(chunk)).build()));\n        }\n    };\n\n    let mut output = client\n        .start_stream_transcription()\n        .language_code(LanguageCode::EnGb)\n        .media_sample_rate_hertz(8000)\n        .media_encoding(MediaEncoding::Pcm)\n        .audio_stream(input_stream.into())\n        .send()\n        .await?;\n\n    let mut full_message = String::new();\n    while let Some(event) = output.transcript_result_stream.recv().await? {\n        match event {\n            TranscriptResultStream::TranscriptEvent(transcript_event) => {\n                let transcript = transcript_event.transcript.unwrap();\n                for result in transcript.results.unwrap_or_default() {\n                    if !result.is_partial {\n                        let first_alternative = &result.alternatives.as_ref().unwrap()[0];\n                        full_message += first_alternative.transcript.as_ref().unwrap();\n                        full_message.push(' ');\n                    }\n                }\n            }\n            otherwise => panic!(\"received unexpected event type: {:?}\", otherwise),\n        }\n    }\n\n    if expected_transcribe_result != full_message.trim() {\n        Err(CanaryError(format!(\n            \"Transcription from Transcribe doesn't look right:\\n\\\n            Expected: `{}`\\n\\\n            Actual:   `{}`\\n\",\n            expected_transcribe_result,\n            full_message.trim()\n        ))\n        .into())\n    } else {\n        Ok(())\n    }\n}\n\nfn pcm_data() -> Vec<u8> {\n    let reader =\n        hound::WavReader::new(&include_bytes!(\"../../audio/hello-transcribe-8000.wav\")[..])\n            .expect(\"valid wav data\");\n    let samples_result: hound::Result<Vec<i16>> = reader.into_samples::<i16>().collect();\n\n    let mut pcm: Vec<u8> = Vec::new();\n    for sample in samples_result.unwrap() {\n        pcm.put_i16_le(sample);\n    }\n    pcm\n}\n"
  },
  {
    "path": "tools/ci-cdk/canary-lambda/src/release_2023_10_26.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npub(crate) mod paginator_canary;\npub(crate) mod s3_canary;\npub(crate) mod transcribe_canary;\n"
  },
  {
    "path": "tools/ci-cdk/canary-runner/Cargo.toml",
    "content": "[package]\nname = \"canary-runner\"\nversion = \"0.1.0\"\nauthors = [\"AWS Rust SDK Team <aws-sdk-rust@amazon.com>\"]\ndescription = \"Tool used to run the canary tests in CI\"\nedition = \"2021\"\nlicense = \"Apache-2.0\"\npublish = false\n\n[workspace]\n\n[dependencies]\nanyhow = \"1\"\nasync-trait = \"0.1.74\"\naws-config = { version = \"1\", features = [\"behavior-version-latest\"] }\naws-sdk-cloudwatch = \"1\"\naws-sdk-lambda = \"1\"\naws-sdk-s3 = \"1\"\nbase64 = \"0.13\"\nclap = { version = \"3.2.17\", features = [\"derive\"] }\nhex = \"0.4.3\"\nlazy_static = \"1\"\noctorust = \"0.7.0\"\nregex = \"1.11.1\"\nsemver = \"1\"\nserde = { version = \"1\", features = [\"derive\"] }\nserde_json = \"1\"\nsha1 = \"0.10.1\"\nsmithy-rs-tool-common = { version = \"0.1\", path = \"../../ci-build/smithy-rs-tool-common\", features = [\"async\"] }\ntokio = { version = \"1.20.1\", features = [\"full\"] }\ntracing = \"0.1\"\ntracing-subscriber = { version = \"0.3.15\", features = [\"env-filter\", \"fmt\"] }\nzip = { version = \"0.6.2\", default-features = false, features = [\"deflate\"] }\n\n[dev-dependencies]\npretty_assertions = \"1.3\"\n"
  },
  {
    "path": "tools/ci-cdk/canary-runner/src/arch.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse anyhow::{bail, Result};\n\n#[derive(Debug, Clone, Copy, Eq, PartialEq)]\npub enum Arch {\n    X86_64,\n    Aarch64,\n}\n\nimpl std::str::FromStr for Arch {\n    type Err = anyhow::Error;\n\n    fn from_str(s: &str) -> Result<Self> {\n        match s {\n            \"x86_64\" => Ok(Arch::X86_64),\n            \"aarch64\" => Ok(Arch::Aarch64),\n            _ => bail!(\"Invalid architecture: {}. Must be x86_64 or aarch64\", s),\n        }\n    }\n}\n"
  },
  {
    "path": "tools/ci-cdk/canary-runner/src/bench.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::path::{Path, PathBuf};\nuse std::time::{Duration, SystemTime};\n\nuse anyhow::{Context, Result};\nuse clap::Parser;\nuse s3::primitives::ByteStream;\nuse smithy_rs_tool_common::macros::here;\nuse tracing::info;\n\nuse crate::arch::Arch;\nuse crate::build_bundle::BuildBundleArgs;\n\nuse aws_sdk_lambda as lambda;\nuse aws_sdk_lambda::client::Waiters;\nuse aws_sdk_s3 as s3;\n\n#[derive(Debug, Parser, Eq, PartialEq)]\npub struct BenchArgs {\n    /// SDK path to compile against\n    #[clap(long)]\n    sdk_path: PathBuf,\n\n    /// File path to a CDK outputs JSON file\n    #[clap(long)]\n    cdk_output: Option<PathBuf>,\n\n    /// S3 bucket to upload the canary bundle to\n    #[clap(long, required_unless_present = \"cdk-output\")]\n    lambda_code_s3_bucket_name: Option<String>,\n\n    /// S3 bucket for the canary Lambda to interact with\n    #[clap(long, required_unless_present = \"cdk-output\")]\n    lambda_test_s3_bucket_name: Option<String>,\n\n    /// ARN of the role that the Lambda will execute as\n    #[clap(long, required_unless_present = \"cdk-output\")]\n    lambda_execution_role_arn: Option<String>,\n\n    /// Lambda architecture\n    #[clap(long, default_value = \"x86_64\")]\n    architecture: Arch,\n\n    /// Whether to target MUSL instead of GLIBC\n    #[clap(long)]\n    musl: bool,\n\n    /// Disable jitter entropy in AWS-LC\n    #[clap(long)]\n    disable_jitter_entropy: bool,\n\n    /// Number of cold-start iterations\n    #[clap(long, default_value = \"100\")]\n    iterations: u32,\n\n    /// Memory allocated for the Lambda function in MB\n    #[clap(long, default_value = \"512\")]\n    memory_size: i32,\n}\n\nstruct BenchOptions {\n    sdk_path: PathBuf,\n    lambda_code_s3_bucket_name: String,\n    lambda_test_s3_bucket_name: String,\n    lambda_execution_role_arn: String,\n    architecture: Arch,\n    musl: bool,\n    disable_jitter_entropy: bool,\n    iterations: u32,\n    memory_size: i32,\n}\n\nimpl BenchOptions {\n    fn load_from(args: BenchArgs) -> Result<Self> {\n        let (lambda_code_s3_bucket_name, lambda_test_s3_bucket_name, lambda_execution_role_arn) =\n            if let Some(cdk_output) = &args.cdk_output {\n                #[derive(serde::Deserialize)]\n                struct Inner {\n                    #[serde(rename = \"canarycodebucketname\")]\n                    lambda_code_s3_bucket_name: String,\n                    #[serde(rename = \"canarytestbucketname\")]\n                    lambda_test_s3_bucket_name: String,\n                    #[serde(rename = \"lambdaexecutionrolearn\")]\n                    lambda_execution_role_arn: String,\n                }\n                #[derive(serde::Deserialize)]\n                enum Outer {\n                    #[serde(rename = \"aws-sdk-rust-canary-stack\")]\n                    AwsSdkRust {\n                        #[serde(flatten)]\n                        inner: Inner,\n                    },\n                    #[serde(rename = \"smithy-rs-canary-stack\")]\n                    SmithyRs {\n                        #[serde(flatten)]\n                        inner: Inner,\n                    },\n                }\n                impl Outer {\n                    fn into_inner(self) -> Inner {\n                        match self {\n                            Outer::AwsSdkRust { inner } | Outer::SmithyRs { inner } => inner,\n                        }\n                    }\n                }\n                let value: Outer = serde_json::from_reader(\n                    std::fs::File::open(cdk_output).context(\"open cdk output\")?,\n                )\n                .context(\"read cdk output\")?;\n                let inner = value.into_inner();\n                (\n                    inner.lambda_code_s3_bucket_name,\n                    inner.lambda_test_s3_bucket_name,\n                    inner.lambda_execution_role_arn,\n                )\n            } else {\n                (\n                    args.lambda_code_s3_bucket_name.expect(\"required\"),\n                    args.lambda_test_s3_bucket_name.expect(\"required\"),\n                    args.lambda_execution_role_arn.expect(\"required\"),\n                )\n            };\n\n        Ok(Self {\n            sdk_path: args.sdk_path,\n            lambda_code_s3_bucket_name,\n            lambda_test_s3_bucket_name,\n            lambda_execution_role_arn,\n            architecture: args.architecture,\n            musl: args.musl,\n            disable_jitter_entropy: args.disable_jitter_entropy,\n            iterations: args.iterations,\n            memory_size: args.memory_size,\n        })\n    }\n}\n\npub async fn bench(args: BenchArgs) -> Result<()> {\n    let opts = BenchOptions::load_from(args)?;\n\n    let smithy_rs_root =\n        smithy_rs_tool_common::git::find_git_repository_root(\"smithy-rs\", \".\").context(here!())?;\n    std::env::set_current_dir(smithy_rs_root.join(\"tools/ci-cdk/canary-lambda\"))\n        .context(\"failed to change working directory\")?;\n\n    let config = aws_config::load_from_env().await;\n    let s3_client = s3::Client::new(&config);\n    let lambda_client = lambda::Client::new(&config);\n\n    info!(\"Building canary bundle...\");\n    let bundle_path = build_bundle(&opts).await?;\n    let bundle_file_name = bundle_path.file_name().unwrap().to_str().unwrap();\n    let bundle_name = bundle_path.file_stem().unwrap().to_str().unwrap();\n\n    info!(\"Uploading bundle to S3...\");\n    upload_bundle(\n        &s3_client,\n        &opts.lambda_code_s3_bucket_name,\n        bundle_file_name,\n        &bundle_path,\n    )\n    .await?;\n\n    info!(\"Creating Lambda function {}...\", bundle_name);\n    create_lambda_fn(&lambda_client, bundle_name, bundle_file_name, &opts).await?;\n\n    info!(\"Running {} cold start iterations...\", opts.iterations);\n    let result = run_benchmark(&lambda_client, bundle_name, &opts).await;\n\n    // Cleanup\n    info!(\"Deleting Lambda function...\");\n    lambda_client\n        .delete_function()\n        .function_name(bundle_name)\n        .send()\n        .await\n        .context(here!(\"failed to delete Lambda\"))?;\n\n    result\n}\n\nasync fn build_bundle(opts: &BenchOptions) -> Result<PathBuf> {\n    let build_args = BuildBundleArgs {\n        canary_path: None,\n        rust_version: None,\n        sdk_release_tag: None,\n        sdk_path: Some(opts.sdk_path.clone()),\n        musl: opts.musl,\n        architecture: opts.architecture,\n        manifest_only: false,\n        disable_jitter_entropy: opts.disable_jitter_entropy,\n        feature_override: Some(\"lambda-benchmark\".to_string()),\n    };\n    Ok(crate::build_bundle::build_bundle(build_args)\n        .await?\n        .expect(\"manifest_only is false\"))\n}\n\nasync fn upload_bundle(s3_client: &s3::Client, bucket: &str, key: &str, path: &Path) -> Result<()> {\n    s3_client\n        .put_object()\n        .bucket(bucket)\n        .key(key)\n        .body(ByteStream::from_path(path).await.context(here!())?)\n        .send()\n        .await\n        .context(here!(\"failed to upload bundle to S3\"))?;\n    Ok(())\n}\n\nasync fn create_lambda_fn(\n    lambda_client: &lambda::Client,\n    bundle_name: &str,\n    bundle_file_name: &str,\n    opts: &BenchOptions,\n) -> Result<()> {\n    use lambda::types::*;\n\n    lambda_client\n        .create_function()\n        .function_name(bundle_name)\n        .runtime(Runtime::Providedal2)\n        .role(&opts.lambda_execution_role_arn)\n        .handler(\"aws-sdk-rust-lambda-canary\")\n        .code(\n            FunctionCode::builder()\n                .s3_bucket(&opts.lambda_code_s3_bucket_name)\n                .s3_key(bundle_file_name)\n                .build(),\n        )\n        .publish(true)\n        .environment(\n            Environment::builder()\n                .variables(\"RUST_BACKTRACE\", \"1\")\n                .variables(\"RUST_LOG\", \"info\")\n                .variables(\"CANARY_S3_BUCKET_NAME\", &opts.lambda_test_s3_bucket_name)\n                .build(),\n        )\n        .timeout(180)\n        .memory_size(opts.memory_size)\n        .architectures(opts.architecture.into())\n        .send()\n        .await\n        .context(here!(\"failed to create Lambda function\"))?;\n\n    lambda_client\n        .wait_until_function_active_v2()\n        .function_name(bundle_name)\n        .wait(Duration::from_secs(60))\n        .await\n        .context(here!(\"timed out waiting for Lambda to become active\"))?;\n\n    Ok(())\n}\n\nimpl From<Arch> for lambda::types::Architecture {\n    fn from(arch: Arch) -> Self {\n        match arch {\n            Arch::X86_64 => lambda::types::Architecture::X8664,\n            Arch::Aarch64 => lambda::types::Architecture::Arm64,\n        }\n    }\n}\n\nasync fn run_benchmark(\n    lambda_client: &lambda::Client,\n    bundle_name: &str,\n    opts: &BenchOptions,\n) -> Result<()> {\n    let mut init_durations = Vec::new();\n    let mut durations = Vec::new();\n    let mut failed_cold_starts = 0;\n\n    for i in 0..opts.iterations {\n        info!(\"Cold start invocation {}/{}\", i + 1, opts.iterations);\n\n        // Update env to force a new execution environment\n        let random_value = SystemTime::now()\n            .duration_since(SystemTime::UNIX_EPOCH)\n            .expect(\"time in range\")\n            .as_nanos()\n            .to_string();\n\n        lambda_client\n            .update_function_configuration()\n            .function_name(bundle_name)\n            .environment(\n                lambda::types::Environment::builder()\n                    .variables(\"RUST_BACKTRACE\", \"1\")\n                    .variables(\"RUST_LOG\", \"info\")\n                    .variables(\"CANARY_S3_BUCKET_NAME\", &opts.lambda_test_s3_bucket_name)\n                    .variables(\"CANARY_RANDOM\", random_value)\n                    .build(),\n            )\n            .send()\n            .await\n            .context(here!(\"failed to update Lambda configuration\"))?;\n\n        lambda_client\n            .wait_until_function_updated()\n            .function_name(bundle_name)\n            .wait(Duration::from_secs(60))\n            .await\n            .context(here!(\"failed to wait for Lambda update\"))?;\n\n        match invoke_until_cold_start(lambda_client, bundle_name).await {\n            Ok(timings) => {\n                init_durations.push(timings.init_duration);\n                durations.push(timings.duration);\n            }\n            Err(e) => {\n                if e.to_string().contains(\"Failed to get cold start\") {\n                    failed_cold_starts += 1;\n                } else {\n                    return Err(e);\n                }\n            }\n        }\n    }\n\n    if !init_durations.is_empty() {\n        info!(\"\");\n        print_stats(\"Init Duration\", &init_durations);\n        print_stats(\"Duration\", &durations);\n    }\n    if failed_cold_starts > 0 {\n        info!(\n            \"Failed to achieve cold start: {} invocations\",\n            failed_cold_starts\n        );\n    }\n    Ok(())\n}\n\nstruct LambdaTimings {\n    init_duration: f64,\n    duration: f64,\n}\n\nasync fn invoke_until_cold_start(\n    lambda_client: &lambda::Client,\n    bundle_name: &str,\n) -> Result<LambdaTimings> {\n    const MAX_ATTEMPTS: u32 = 10;\n\n    for attempt in 1..=MAX_ATTEMPTS {\n        let timings = invoke_lambda(lambda_client, bundle_name).await?;\n        if let Some(t) = timings {\n            if attempt > 1 {\n                info!(\"Cold start confirmed on attempt {}\", attempt);\n            }\n            return Ok(t);\n        }\n        info!(\n            \"Warm start detected (attempt {}/{}), retrying...\",\n            attempt, MAX_ATTEMPTS\n        );\n        tokio::time::sleep(Duration::from_millis(500)).await;\n    }\n\n    anyhow::bail!(\"Failed to get cold start after {} attempts\", MAX_ATTEMPTS)\n}\n\nasync fn invoke_lambda(\n    lambda_client: &lambda::Client,\n    bundle_name: &str,\n) -> Result<Option<LambdaTimings>> {\n    use lambda::primitives::Blob;\n    use lambda::types::*;\n\n    let response = lambda_client\n        .invoke()\n        .function_name(bundle_name)\n        .invocation_type(InvocationType::RequestResponse)\n        .log_type(LogType::Tail)\n        .payload(Blob::new(&b\"{}\"[..]))\n        .send()\n        .await\n        .context(here!(\"failed to invoke Lambda\"))?;\n\n    let mut timings = None;\n    if let Some(log_result) = response.log_result() {\n        let decoded = base64::decode(log_result)?;\n        let logs = std::str::from_utf8(&decoded)?;\n        info!(\"Last 4 KB of logs:\\n----\\n{}\\n----\\n\", logs);\n\n        if let (Some(init_duration), Some(duration)) = (\n            parse_report_field(logs, \"Init Duration:\"),\n            parse_report_duration(logs),\n        ) {\n            timings = Some(LambdaTimings {\n                init_duration,\n                duration,\n            });\n        }\n    }\n\n    if response.status_code() != 200 || response.function_error().is_some() {\n        anyhow::bail!(\n            \"Lambda failed: {}\",\n            response.function_error.as_deref().unwrap_or(\"<no error>\")\n        );\n    }\n\n    Ok(timings)\n}\n\nfn parse_report_field(logs: &str, field: &str) -> Option<f64> {\n    for line in logs.lines() {\n        if let Some(pos) = line.find(field) {\n            let after = &line[pos + field.len()..];\n            if let Some(num_str) = after.split_whitespace().next() {\n                return num_str.parse::<f64>().ok();\n            }\n        }\n    }\n    None\n}\n\n/// Parse \"Duration: X.XX ms\" from the REPORT line, avoiding \"Init Duration:\" and \"Billed Duration:\"\nfn parse_report_duration(logs: &str) -> Option<f64> {\n    for line in logs.lines() {\n        if !line.starts_with(\"REPORT\") {\n            continue;\n        }\n        for field in line.split('\\t') {\n            let trimmed = field.trim();\n            if trimmed.starts_with(\"Duration:\") {\n                return trimmed\n                    .strip_prefix(\"Duration:\")?\n                    .split_whitespace()\n                    .next()?\n                    .parse::<f64>()\n                    .ok();\n            }\n        }\n    }\n    None\n}\n\nfn print_stats(label: &str, durations: &[f64]) {\n    let mut sorted = durations.to_vec();\n    sorted.sort_by(|a, b| a.partial_cmp(b).unwrap());\n\n    let mean = sorted.iter().sum::<f64>() / sorted.len() as f64;\n    let p50 = sorted[sorted.len() * 50 / 100];\n    let p90 = sorted[sorted.len() * 90 / 100];\n    let p99 = sorted[sorted.len() * 99 / 100];\n\n    let variance = sorted.iter().map(|x| (x - mean).powi(2)).sum::<f64>() / sorted.len() as f64;\n    let std_dev = variance.sqrt();\n\n    info!(\"=== {label} (ms) ===\");\n    info!(\"Samples: {}\", sorted.len());\n    info!(\"Mean: {:.2}\", mean);\n    info!(\"P50: {:.2}\", p50);\n    info!(\"P90: {:.2}\", p90);\n    info!(\"P99: {:.2}\", p99);\n    info!(\"Std Dev: {:.2}\", std_dev);\n    info!(\"\");\n}\n"
  },
  {
    "path": "tools/ci-cdk/canary-runner/src/build_bundle.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::fmt::Write as FmtWrite;\nuse std::fs;\nuse std::io::Write as IoWrite;\nuse std::path::{Path, PathBuf};\nuse std::process::Command;\nuse std::str::FromStr;\n\nuse anyhow::{bail, Context, Result};\nuse clap::Parser;\nuse lazy_static::lazy_static;\nuse smithy_rs_tool_common::git::find_git_repository_root;\nuse smithy_rs_tool_common::here;\nuse smithy_rs_tool_common::release_tag::ReleaseTag;\nuse smithy_rs_tool_common::shell::handle_failure;\nuse smithy_rs_tool_common::versions_manifest::VersionsManifest;\n\nuse crate::arch::Arch;\n\nstruct RequiredDependency {\n    name: &'static str,\n    features: Option<Vec<&'static str>>,\n    disable_default_feature: bool,\n}\n\nimpl RequiredDependency {\n    fn new(name: &'static str) -> Self {\n        Self {\n            name,\n            features: None,\n            disable_default_feature: false,\n        }\n    }\n    fn with_features(mut self, features: impl IntoIterator<Item = &'static str>) -> Self {\n        self.features = Some(features.into_iter().collect());\n        self\n    }\n    fn with_default_feature_disabled(mut self) -> Self {\n        self.disable_default_feature = true;\n        self\n    }\n    fn to_string(&self, crate_source: &CrateSource) -> Result<String> {\n        match crate_source {\n            CrateSource::Path(path) => {\n                let path_name = match self.name.strip_prefix(\"aws-sdk-\") {\n                    Some(path) => path,\n                    None => self.name,\n                };\n                let crate_path = path.join(path_name);\n                let mut result = format!(\n                    r#\"{name} = {{ path = \"{path}\"\"#,\n                    name = self.name,\n                    path = crate_path.to_string_lossy(),\n                );\n                if let Some(features) = &self.features {\n                    self.write_features(features, &mut result);\n                }\n                if self.disable_default_feature {\n                    result.push_str(\", default-features = false\");\n                }\n                result.push_str(\" }\");\n                Ok(result)\n            }\n            CrateSource::VersionsManifest {\n                versions,\n                release_tag,\n            } => match versions.crates.get(self.name) {\n                Some(version) => {\n                    let mut result = format!(\n                        r#\"{name} = {{ version = \"{version}\"\"#,\n                        name = self.name,\n                        version = version.version,\n                    );\n                    if let Some(features) = &self.features {\n                        self.write_features(features, &mut result);\n                    }\n                    if self.disable_default_feature {\n                        result.push_str(\", default-features = false\");\n                    }\n                    result.push_str(\" }\");\n                    Ok(result)\n                }\n                None => {\n                    bail!(\n                        \"Couldn't find `{name}` in versions.toml for `{release_tag}`\",\n                        name = self.name,\n                    )\n                }\n            },\n        }\n    }\n    fn write_features(&self, features: &[&'static str], output: &mut String) {\n        output.push_str(&format!(\n            r#\", features = [{features}]\"#,\n            features = features\n                .iter()\n                .map(|feature| format!(r#\"\"{feature}\"\"#))\n                .collect::<Vec<_>>()\n                .join(\",\"),\n        ));\n    }\n}\n\nconst BASE_MANIFEST: &str = r#\"\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\n# IMPORTANT: Don't edit this file directly! Run `canary-runner build-bundle` to modify this file instead.\n[package]\nname = \"aws-sdk-rust-lambda-canary\"\nversion = \"0.1.0\"\nedition = \"2021\"\nlicense = \"Apache-2.0\"\n\n# Emit an empty workspace so that the canary can successfully build when\n# built from the aws-sdk-rust repo, which has a workspace in it.\n[workspace]\n\n[[bin]]\nname = \"bootstrap\"\npath = \"src/main.rs\"\n\n[dependencies]\nanyhow = \"1\"\nasync-stream = \"0.3\"\nbytes = \"1\"\nhound = \"3.4\"\nasync-trait = \"0.1\"\nlambda_runtime = \"0.4\"\nserde_json = \"1\"\nthiserror = \"1\"\ntokio = { version = \"1\", features = [\"full\"] }\ntracing = \"0.1\"\ntracing-subscriber = { version = \"0.3\", features = [\"fmt\", \"env-filter\"] }\nuuid = { version = \"0.8\", features = [\"v4\"] }\ntokio-stream = \"0\"\ntracing-texray = \"0.1.1\"\nreqwest = { version = \"0.12.12\", features = [\"rustls-tls\"], default-features = false }\nedit-distance = \"2\"\nwasmtime = \"38.0.4\"\nwasmtime-wasi = \"38.0.4\"\nwasmtime-wasi-http = \"38.0.4\"\n\n\"#;\n\nlazy_static! {\n    static ref REQUIRED_SDK_CRATES: Vec<RequiredDependency> = vec![\n        RequiredDependency::new(\"aws-config\").with_features([\"behavior-version-latest\"]),\n        RequiredDependency::new(\"aws-sdk-s3\").with_features([\"http-1x\"]),\n        RequiredDependency::new(\"aws-sdk-ec2\"),\n        RequiredDependency::new(\"aws-sdk-transcribestreaming\"),\n        RequiredDependency::new(\"aws-smithy-wasm\"),\n    ];\n}\n\nconst WASM_BASE_MANIFEST: &str = r#\"\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\n# IMPORTANT: Don't edit this file directly! Run `canary-runner build-bundle` to modify this file instead.\n[package]\nname = \"aws-sdk-rust-lambda-canary-wasm\"\nversion = \"0.1.0\"\nedition = \"2021\"\nlicense = \"Apache-2.0\"\n\n[lib]\ncrate-type = [\"cdylib\"]\n\n# metadata used by cargo-component to identify which wit world to embed in the binary\n[package.metadata.component]\npackage = \"aws:component\"\n\n[dependencies]\nwstd = \"0.6.5\"\nwit-bindgen = \"0.51.0\"\n\"#;\n\nlazy_static! {\n    static ref WASM_REQUIRED_SDK_CRATES: Vec<RequiredDependency> = vec![\n        RequiredDependency::new(\"aws-config\")\n            .with_features([\"behavior-version-latest\"])\n            .with_default_feature_disabled(),\n        RequiredDependency::new(\"aws-sdk-s3\").with_default_feature_disabled(),\n        RequiredDependency::new(\"aws-smithy-async\").with_default_feature_disabled(),\n        RequiredDependency::new(\"aws-smithy-wasm\"),\n    ];\n}\n\n// The elements in this `Vec` should be sorted in an ascending order by the release date.\nlazy_static! {\n    static ref NOTABLE_SDK_RELEASE_TAGS: Vec<ReleaseTag> = vec![\n        // last version before addition of Sigv4a MRAP test\n        ReleaseTag::from_str(\"release-2023-10-26\").unwrap(),\n    ];\n}\n\n#[derive(Debug, Parser, Eq, PartialEq)]\npub struct BuildBundleArgs {\n    /// Canary Lambda source code path (defaults to current directory)\n    #[clap(long)]\n    pub canary_path: Option<PathBuf>,\n\n    /// Rust version\n    #[clap(long)]\n    pub rust_version: Option<String>,\n\n    /// SDK release tag to use for crate version numbers\n    #[clap(\n        long,\n        required_unless_present = \"sdk-path\",\n        conflicts_with = \"sdk-path\"\n    )]\n    pub sdk_release_tag: Option<ReleaseTag>,\n\n    /// SDK release tag to use for crate version numbers\n    #[clap(\n        long,\n        required_unless_present = \"sdk-release-tag\",\n        conflicts_with = \"sdk-release-tag\"\n    )]\n    pub sdk_path: Option<PathBuf>,\n\n    /// Whether to target MUSL instead of GLIBC when compiling the Lambda\n    #[clap(long)]\n    pub musl: bool,\n\n    /// Lambda architecture\n    #[clap(long, default_value = \"x86_64\")]\n    pub architecture: Arch,\n\n    /// Only generate the `Cargo.toml` file rather than building the entire bundle\n    #[clap(long)]\n    pub manifest_only: bool,\n\n    /// Disable jitter entropy in AWS-LC\n    #[clap(long)]\n    pub disable_jitter_entropy: bool,\n\n    /// Override the default cargo feature for canary-lambda\n    #[clap(long)]\n    pub feature_override: Option<String>,\n}\n\n#[derive(Clone)]\nenum CrateSource {\n    Path(PathBuf),\n    VersionsManifest {\n        versions: VersionsManifest,\n        release_tag: ReleaseTag,\n    },\n}\n\nfn enabled_feature(crate_source: &CrateSource) -> String {\n    if let CrateSource::VersionsManifest { release_tag, .. } = crate_source {\n        // we want to select the oldest module specified after this release\n        for notable in NOTABLE_SDK_RELEASE_TAGS.iter() {\n            tracing::debug!(release_tag = ?release_tag, notable = ?notable, \"considering if release tag came before notable release\");\n            if release_tag <= notable {\n                tracing::debug!(\"selecting {} as chosen release\", notable);\n                return notable.as_str().into();\n            }\n        }\n    }\n    \"latest\".into()\n}\n\nfn generate_crate_manifest(\n    crate_source: CrateSource,\n    feature_override: Option<&str>,\n) -> Result<String> {\n    let mut output = BASE_MANIFEST.to_string();\n    write_dependencies(&REQUIRED_SDK_CRATES, &mut output, &crate_source)?;\n    if feature_override == Some(\"lambda-benchmark\") {\n        writeln!(\n            output,\n            \"{}\",\n            RequiredDependency::new(\"aws-sdk-sts\").to_string(&crate_source)?\n        )\n        .unwrap();\n    }\n    write!(output, \"\\n[features]\\n\").unwrap();\n    writeln!(output, \"latest = []\").unwrap();\n    for release_tag in NOTABLE_SDK_RELEASE_TAGS.iter() {\n        writeln!(\n            output,\n            \"\\\"{release_tag}\\\" = []\",\n            release_tag = release_tag.as_str()\n        )\n        .unwrap();\n    }\n    writeln!(output, \"\\\"lambda-benchmark\\\" = []\").unwrap();\n    let enabled = feature_override\n        .map(String::from)\n        .unwrap_or_else(|| enabled_feature(&crate_source));\n    writeln!(output, \"default = [\\\"{enabled}\\\"]\").unwrap();\n    Ok(output)\n}\n\nfn write_dependencies(\n    required_crates: &[RequiredDependency],\n    output: &mut String,\n    crate_source: &CrateSource,\n) -> Result<()> {\n    for required_crate in required_crates {\n        writeln!(output, \"{}\", required_crate.to_string(crate_source)?).unwrap();\n    }\n    Ok(())\n}\n\nfn sha1_file(path: &Path) -> Result<String> {\n    use sha1::{Digest, Sha1};\n    let contents = fs::read(path).context(here!())?;\n    let mut hasher = Sha1::new();\n    hasher.update(&contents);\n    Ok(hex::encode(hasher.finalize()))\n}\n\nfn name_bundle(\n    bin_path: &Path,\n    rust_version: Option<&str>,\n    sdk_release_tag: Option<&ReleaseTag>,\n) -> Result<String> {\n    name_hashed_bundle(&sha1_file(bin_path)?, rust_version, sdk_release_tag)\n}\n\nfn name_hashed_bundle(\n    bin_hash: &str,\n    rust_version: Option<&str>,\n    sdk_release_tag: Option<&ReleaseTag>,\n) -> Result<String> {\n    // The Lambda name must be less than 64 characters, so truncate the hash a bit\n    let bin_hash = &bin_hash[..24];\n    // Lambda function names can't have periods in them\n    let rust_version = rust_version.map(|s| s.replace('.', \"\"));\n    let rust_version = rust_version.as_deref().unwrap_or(\"unknown\");\n    let sdk_release_tag = sdk_release_tag.map(|s| s.to_string().replace(['-', '.'], \"\"));\n    let sdk_release_tag = sdk_release_tag.as_deref().unwrap_or(\"untagged\");\n    Ok(format!(\n        \"canary-{sdk_release_tag}-{rust_version}-{bin_hash}.zip\"\n    ))\n}\n\npub async fn build_bundle(opt: BuildBundleArgs) -> Result<Option<PathBuf>> {\n    let canary_path = opt\n        .canary_path\n        .unwrap_or_else(|| std::env::current_dir().expect(\"current dir\"));\n\n    // Determine the SDK crate source from CLI args\n    let crate_source = match (opt.sdk_path, &opt.sdk_release_tag) {\n        (Some(sdk_path), None) => CrateSource::Path(sdk_path),\n        (None, Some(release_tag)) => CrateSource::VersionsManifest {\n            versions: VersionsManifest::from_github_tag(release_tag).await?,\n            release_tag: release_tag.clone(),\n        },\n        _ => unreachable!(\"clap should have validated against this\"),\n    };\n\n    // Generate the canary Lambda's Cargo.toml\n    let manifest_path = canary_path.join(\"Cargo.toml\");\n    let crate_manifest_content =\n        generate_crate_manifest(crate_source.clone(), opt.feature_override.as_deref())?;\n    fs::write(&manifest_path, crate_manifest_content)\n        .context(format!(\"failed to write Cargo.toml in {manifest_path:?}\"))?;\n\n    let skip_wasm = opt.feature_override.as_deref() == Some(\"lambda-benchmark\");\n\n    // Generate the canary-wasm's Cargo.toml\n    let wasm_manifest_path = if skip_wasm {\n        None\n    } else {\n        let path = canary_path.join(\"../canary-wasm/Cargo.toml\");\n        let mut wasm_crate_manifest_content = WASM_BASE_MANIFEST.to_string();\n        write_dependencies(\n            &WASM_REQUIRED_SDK_CRATES,\n            &mut wasm_crate_manifest_content,\n            &crate_source,\n        )?;\n        fs::write(&path, wasm_crate_manifest_content)\n            .context(format!(\"failed to write Cargo.toml in {path:?}\"))?;\n        Some(\n            std::env::current_dir()\n                .expect(\"Current dir\")\n                .join(\"../canary-wasm/Cargo.toml\"),\n        )\n    };\n\n    if !opt.manifest_only {\n        // Check if cross is needed and available\n        let use_cross = opt.architecture == Arch::Aarch64;\n        if use_cross {\n            let cross_check = Command::new(\"cross\").arg(\"--version\").output();\n            if cross_check.is_err() || !cross_check.unwrap().status.success() {\n                bail!(\"cross is required for Aarch64 builds but is not installed. Install it with: cargo install cross\");\n            }\n        }\n\n        // Compile the canary Lambda\n        let build_cmd = if use_cross { \"cross\" } else { \"cargo\" };\n        let mut command = Command::new(build_cmd);\n        command\n            .arg(\"build\")\n            .arg(\"--release\")\n            .arg(\"--manifest-path\")\n            .arg(&manifest_path);\n\n        let target = match (opt.musl, opt.architecture) {\n            (true, Arch::X86_64) => Some(\"x86_64-unknown-linux-musl\"),\n            (true, Arch::Aarch64) => Some(\"aarch64-unknown-linux-musl\"),\n            (false, Arch::Aarch64) => Some(\"aarch64-unknown-linux-gnu\"),\n            _ => None,\n        };\n\n        if let Some(target) = target {\n            command.arg(format!(\"--target={}\", target));\n        }\n\n        if opt.disable_jitter_entropy {\n            command.env(\"AWS_LC_SYS_NO_JITTER_ENTROPY\", \"1\");\n        }\n\n        handle_failure(&format!(\"{} build\", build_cmd), &command.output()?)?;\n\n        // Compile the wasm canary to a .wasm binary\n        if let Some(wasm_manifest_path) = &wasm_manifest_path {\n            let mut wasm_command = Command::new(\"cargo\");\n            wasm_command\n                .arg(\"build\")\n                .arg(\"--release\")\n                .arg(\"--target\")\n                .arg(\"wasm32-wasip2\")\n                .arg(\"--manifest-path\")\n                .arg(wasm_manifest_path);\n            handle_failure(\"cargo build (WASM bin)\", &wasm_command.output()?)?;\n        }\n\n        // Bundle the Lambda\n        let repository_root = find_git_repository_root(\"smithy-rs\", canary_path)?;\n        let target_path = {\n            let mut path = repository_root.join(\"tools\").join(\"target\");\n            if let Some(target) = target {\n                path = path.join(target);\n            } else if opt.musl {\n                path = path.join(\"x86_64-unknown-linux-musl\");\n            }\n            path.join(\"release\")\n        };\n        let wasm_bin_path = if skip_wasm {\n            None\n        } else {\n            Some(\n                repository_root\n                    .join(\"tools\")\n                    .join(\"target\")\n                    .join(\"wasm32-wasip2\")\n                    .join(\"release\")\n                    .join(\"aws_sdk_rust_lambda_canary_wasm.wasm\"),\n            )\n        };\n        let bin_path = target_path.join(\"bootstrap\");\n        let bundle_path = target_path.join(name_bundle(\n            &bin_path,\n            opt.rust_version.as_deref(),\n            opt.sdk_release_tag.as_ref(),\n        )?);\n\n        tracing::debug!(wasm_bin_path = ?wasm_bin_path, bundle_path = ?bundle_path);\n\n        let zip_file = fs::File::create(&bundle_path).context(here!())?;\n        let mut zip = zip::ZipWriter::new(zip_file);\n        //Write the canary bin to the zip\n        zip.start_file(\n            \"bootstrap\",\n            zip::write::FileOptions::default().unix_permissions(0o755),\n        )\n        .context(here!())?;\n        zip.write_all(&fs::read(&bin_path).context(here!(\"read target\"))?)\n            .context(here!())?;\n\n        // Write the wasm bin to the zip\n        if let Some(wasm_bin_path) = &wasm_bin_path {\n            zip.start_file(\n                \"aws_sdk_rust_lambda_canary_wasm.wasm\",\n                zip::write::FileOptions::default().unix_permissions(0o644),\n            )\n            .context(here!())?;\n            zip.write_all(&fs::read(wasm_bin_path).context(here!(\"read wasm bin\"))?)\n                .context(here!())?;\n        }\n        zip.finish().context(here!())?;\n\n        println!(\n            \"{}\",\n            bundle_path\n                .to_str()\n                .expect(\"path is valid utf-8 for this use-case\")\n        );\n        return Ok(Some(bundle_path));\n    }\n    Ok(None)\n}\n\n#[cfg(test)]\nmod tests {\n    use clap::Parser;\n    use smithy_rs_tool_common::package::PackageCategory;\n    use smithy_rs_tool_common::versions_manifest::CrateVersion;\n\n    use crate::Args;\n\n    use super::*;\n\n    fn crate_version(name: &str, version: &str) -> (String, CrateVersion) {\n        (\n            name.to_string(),\n            CrateVersion {\n                category: PackageCategory::AwsRuntime, // doesn't matter for this test\n                version: version.into(),\n                source_hash: \"some-hash\".into(),\n                model_hash: None,\n            },\n        )\n    }\n\n    #[test]\n    fn test_arg_parsing() {\n        assert!(Args::try_parse_from([\"./canary-runner\", \"build-bundle\"]).is_err());\n        assert!(\n            Args::try_parse_from([\"./canary-runner\", \"build-bundle\", \"--sdk-release-tag\"]).is_err()\n        );\n        assert!(Args::try_parse_from([\"./canary-runner\", \"build-bundle\", \"--sdk-path\"]).is_err());\n        assert!(Args::try_parse_from([\"./canary-runner\", \"build-bundle\", \"--musl\"]).is_err());\n        assert!(Args::try_parse_from([\n            \"./canary-runner\",\n            \"build-bundle\",\n            \"--sdk-release-tag\",\n            \"release-2022-07-26\",\n            \"--sdk-path\",\n            \"some-sdk-path\"\n        ])\n        .is_err());\n        assert_eq!(\n            Args::BuildBundle(BuildBundleArgs {\n                canary_path: None,\n                rust_version: None,\n                sdk_release_tag: Some(ReleaseTag::from_str(\"release-2022-07-26\").unwrap()),\n                sdk_path: None,\n                musl: false,\n                architecture: Arch::X86_64,\n                manifest_only: false,\n                disable_jitter_entropy: false,\n                feature_override: None,\n            }),\n            Args::try_parse_from([\n                \"./canary-runner\",\n                \"build-bundle\",\n                \"--sdk-release-tag\",\n                \"release-2022-07-26\"\n            ])\n            .expect(\"valid args\")\n        );\n        assert_eq!(\n            Args::BuildBundle(BuildBundleArgs {\n                canary_path: Some(\"some-canary-path\".into()),\n                rust_version: None,\n                sdk_release_tag: None,\n                sdk_path: Some(\"some-sdk-path\".into()),\n                musl: false,\n                architecture: Arch::X86_64,\n                manifest_only: false,\n                disable_jitter_entropy: false,\n                feature_override: None,\n            }),\n            Args::try_parse_from([\n                \"./canary-runner\",\n                \"build-bundle\",\n                \"--sdk-path\",\n                \"some-sdk-path\",\n                \"--canary-path\",\n                \"some-canary-path\"\n            ])\n            .expect(\"valid args\")\n        );\n        assert_eq!(\n            Args::BuildBundle(BuildBundleArgs {\n                canary_path: None,\n                rust_version: None,\n                sdk_release_tag: Some(ReleaseTag::from_str(\"release-2022-07-26\").unwrap()),\n                sdk_path: None,\n                musl: true,\n                architecture: Arch::X86_64,\n                manifest_only: true,\n                disable_jitter_entropy: false,\n                feature_override: None,\n            }),\n            Args::try_parse_from([\n                \"./canary-runner\",\n                \"build-bundle\",\n                \"--sdk-release-tag\",\n                \"release-2022-07-26\",\n                \"--musl\",\n                \"--manifest-only\"\n            ])\n            .expect(\"valid args\")\n        );\n        assert_eq!(\n            Args::BuildBundle(BuildBundleArgs {\n                canary_path: Some(\"some-canary-path\".into()),\n                rust_version: Some(\"stable\".into()),\n                sdk_release_tag: None,\n                sdk_path: Some(\"some-sdk-path\".into()),\n                musl: false,\n                architecture: Arch::X86_64,\n                manifest_only: false,\n                disable_jitter_entropy: false,\n                feature_override: None,\n            }),\n            Args::try_parse_from([\n                \"./canary-runner\",\n                \"build-bundle\",\n                \"--rust-version\",\n                \"stable\",\n                \"--sdk-path\",\n                \"some-sdk-path\",\n                \"--canary-path\",\n                \"some-canary-path\"\n            ])\n            .expect(\"valid args\")\n        );\n    }\n\n    #[test]\n    fn test_generate_crate_manifest_with_paths() {\n        pretty_assertions::assert_str_eq!(\n            r#\"\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\n# IMPORTANT: Don't edit this file directly! Run `canary-runner build-bundle` to modify this file instead.\n[package]\nname = \"aws-sdk-rust-lambda-canary\"\nversion = \"0.1.0\"\nedition = \"2021\"\nlicense = \"Apache-2.0\"\n\n# Emit an empty workspace so that the canary can successfully build when\n# built from the aws-sdk-rust repo, which has a workspace in it.\n[workspace]\n\n[[bin]]\nname = \"bootstrap\"\npath = \"src/main.rs\"\n\n[dependencies]\nanyhow = \"1\"\nasync-stream = \"0.3\"\nbytes = \"1\"\nhound = \"3.4\"\nasync-trait = \"0.1\"\nlambda_runtime = \"0.4\"\nserde_json = \"1\"\nthiserror = \"1\"\ntokio = { version = \"1\", features = [\"full\"] }\ntracing = \"0.1\"\ntracing-subscriber = { version = \"0.3\", features = [\"fmt\", \"env-filter\"] }\nuuid = { version = \"0.8\", features = [\"v4\"] }\ntokio-stream = \"0\"\ntracing-texray = \"0.1.1\"\nreqwest = { version = \"0.12.12\", features = [\"rustls-tls\"], default-features = false }\nedit-distance = \"2\"\nwasmtime = \"38.0.4\"\nwasmtime-wasi = \"38.0.4\"\nwasmtime-wasi-http = \"38.0.4\"\n\naws-config = { path = \"some/sdk/path/aws-config\", features = [\"behavior-version-latest\"] }\naws-sdk-s3 = { path = \"some/sdk/path/s3\", features = [\"http-1x\"] }\naws-sdk-ec2 = { path = \"some/sdk/path/ec2\" }\naws-sdk-transcribestreaming = { path = \"some/sdk/path/transcribestreaming\" }\naws-smithy-wasm = { path = \"some/sdk/path/aws-smithy-wasm\" }\n\n[features]\nlatest = []\n\"release-2023-10-26\" = []\n\"lambda-benchmark\" = []\ndefault = [\"latest\"]\n\"#,\n            generate_crate_manifest(CrateSource::Path(\"some/sdk/path\".into()), None)\n                .expect(\"success\")\n        );\n    }\n\n    #[test]\n    fn test_generate_crate_manifest_with_feature_override() {\n        let manifest = generate_crate_manifest(\n            CrateSource::Path(\"some/sdk/path\".into()),\n            Some(\"lambda-benchmark\"),\n        )\n        .expect(\"success\");\n        assert!(manifest.contains(r#\"default = [\"lambda-benchmark\"]\"#));\n    }\n\n    #[test]\n    fn test_generate_crate_manifest_with_release_tag() {\n        pretty_assertions::assert_str_eq!(\n            r#\"\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\n# IMPORTANT: Don't edit this file directly! Run `canary-runner build-bundle` to modify this file instead.\n[package]\nname = \"aws-sdk-rust-lambda-canary\"\nversion = \"0.1.0\"\nedition = \"2021\"\nlicense = \"Apache-2.0\"\n\n# Emit an empty workspace so that the canary can successfully build when\n# built from the aws-sdk-rust repo, which has a workspace in it.\n[workspace]\n\n[[bin]]\nname = \"bootstrap\"\npath = \"src/main.rs\"\n\n[dependencies]\nanyhow = \"1\"\nasync-stream = \"0.3\"\nbytes = \"1\"\nhound = \"3.4\"\nasync-trait = \"0.1\"\nlambda_runtime = \"0.4\"\nserde_json = \"1\"\nthiserror = \"1\"\ntokio = { version = \"1\", features = [\"full\"] }\ntracing = \"0.1\"\ntracing-subscriber = { version = \"0.3\", features = [\"fmt\", \"env-filter\"] }\nuuid = { version = \"0.8\", features = [\"v4\"] }\ntokio-stream = \"0\"\ntracing-texray = \"0.1.1\"\nreqwest = { version = \"0.12.12\", features = [\"rustls-tls\"], default-features = false }\nedit-distance = \"2\"\nwasmtime = \"38.0.4\"\nwasmtime-wasi = \"38.0.4\"\nwasmtime-wasi-http = \"38.0.4\"\n\naws-config = { version = \"0.46.0\", features = [\"behavior-version-latest\"] }\naws-sdk-s3 = { version = \"0.20.0\", features = [\"http-1x\"] }\naws-sdk-ec2 = { version = \"0.19.0\" }\naws-sdk-transcribestreaming = { version = \"0.16.0\" }\naws-smithy-wasm = { version = \"0.1.0\" }\n\n[features]\nlatest = []\n\"release-2023-10-26\" = []\n\"lambda-benchmark\" = []\ndefault = [\"latest\"]\n\"#,\n            generate_crate_manifest(\n                CrateSource::VersionsManifest {\n                    versions: VersionsManifest {\n                        smithy_rs_revision: \"some-revision-smithy-rs\".into(),\n                        aws_doc_sdk_examples_revision: None,\n                        manual_interventions: Default::default(),\n                        crates: [\n                            crate_version(\"aws-config\", \"0.46.0\"),\n                            crate_version(\"aws-sdk-s3\", \"0.20.0\"),\n                            crate_version(\"aws-sdk-ec2\", \"0.19.0\"),\n                            crate_version(\"aws-sdk-transcribestreaming\", \"0.16.0\"),\n                            crate_version(\"aws-smithy-wasm\", \"0.1.0\"),\n                        ]\n                        .into_iter()\n                        .collect(),\n                        release: None,\n                    },\n                    release_tag: ReleaseTag::from_str(\"release-9999-12-31\").unwrap(),\n                },\n                None\n            )\n            .expect(\"success\")\n        );\n    }\n\n    #[test]\n    fn test_generate_canary_wasm_crate_manifest_with_paths() {\n        let mut output = WASM_BASE_MANIFEST.to_string();\n        let crate_source = CrateSource::Path(\"some/sdk/path\".into());\n        write_dependencies(&WASM_REQUIRED_SDK_CRATES, &mut output, &crate_source).expect(\"success\");\n\n        pretty_assertions::assert_str_eq!(\n            r#\"\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\n# IMPORTANT: Don't edit this file directly! Run `canary-runner build-bundle` to modify this file instead.\n[package]\nname = \"aws-sdk-rust-lambda-canary-wasm\"\nversion = \"0.1.0\"\nedition = \"2021\"\nlicense = \"Apache-2.0\"\n\n[lib]\ncrate-type = [\"cdylib\"]\n\n# metadata used by cargo-component to identify which wit world to embed in the binary\n[package.metadata.component]\npackage = \"aws:component\"\n\n[dependencies]\nwstd = \"0.6.5\"\nwit-bindgen = \"0.51.0\"\naws-config = { path = \"some/sdk/path/aws-config\", features = [\"behavior-version-latest\"], default-features = false }\naws-sdk-s3 = { path = \"some/sdk/path/s3\", default-features = false }\naws-smithy-async = { path = \"some/sdk/path/aws-smithy-async\", default-features = false }\naws-smithy-wasm = { path = \"some/sdk/path/aws-smithy-wasm\" }\n\"#,\n            output,\n        );\n    }\n\n    #[test]\n    fn test_generate_canary_wasm_crate_manifest_with_release_tag() {\n        let mut output = WASM_BASE_MANIFEST.to_string();\n        let crate_source = CrateSource::VersionsManifest {\n            versions: VersionsManifest {\n                smithy_rs_revision: \"some-revision-smithy-rs\".into(),\n                aws_doc_sdk_examples_revision: None,\n                manual_interventions: Default::default(),\n                crates: [\n                    crate_version(\"aws-config\", \"0.46.0\"),\n                    crate_version(\"aws-sdk-s3\", \"0.20.0\"),\n                    crate_version(\"aws-smithy-async\", \"0.46.0\"),\n                    crate_version(\"aws-smithy-wasm\", \"0.1.0\"),\n                ]\n                .into_iter()\n                .collect(),\n                release: None,\n            },\n            release_tag: ReleaseTag::from_str(\"release-9999-12-31\").unwrap(),\n        };\n        write_dependencies(&WASM_REQUIRED_SDK_CRATES, &mut output, &crate_source).expect(\"success\");\n\n        pretty_assertions::assert_str_eq!(\n            r#\"\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\n# IMPORTANT: Don't edit this file directly! Run `canary-runner build-bundle` to modify this file instead.\n[package]\nname = \"aws-sdk-rust-lambda-canary-wasm\"\nversion = \"0.1.0\"\nedition = \"2021\"\nlicense = \"Apache-2.0\"\n\n[lib]\ncrate-type = [\"cdylib\"]\n\n# metadata used by cargo-component to identify which wit world to embed in the binary\n[package.metadata.component]\npackage = \"aws:component\"\n\n[dependencies]\nwstd = \"0.6.5\"\nwit-bindgen = \"0.51.0\"\naws-config = { version = \"0.46.0\", features = [\"behavior-version-latest\"], default-features = false }\naws-sdk-s3 = { version = \"0.20.0\", default-features = false }\naws-smithy-async = { version = \"0.46.0\", default-features = false }\naws-smithy-wasm = { version = \"0.1.0\" }\n\"#,\n            output\n        );\n    }\n\n    #[test]\n    fn test_name_hashed_bundle() {\n        fn check(expected: &str, actual: &str) {\n            assert!(\n                expected.len() < 64,\n                \"Lambda function name must be less than 64 characters\"\n            );\n            assert_eq!(expected, actual);\n        }\n        check(\n            \"canary-release20221216-1621-7ae6085d2105d5d1e13b10f8.zip\",\n            &name_hashed_bundle(\n                \"7ae6085d2105d5d1e13b10f882c6cb072ff5bbf8\",\n                Some(\"1.62.1\"),\n                Some(&ReleaseTag::from_str(\"release-2022-12-16\").unwrap()),\n            )\n            .unwrap(),\n        );\n        check(\n            \"canary-release202212162-1621-7ae6085d2105d5d1e13b10f8.zip\",\n            &name_hashed_bundle(\n                \"7ae6085d2105d5d1e13b10f882c6cb072ff5bbf8\",\n                Some(\"1.62.1\"),\n                Some(&ReleaseTag::from_str(\"release-2022-12-16.2\").unwrap()),\n            )\n            .unwrap(),\n        );\n        check(\n            \"canary-untagged-1621-7ae6085d2105d5d1e13b10f8.zip\",\n            &name_hashed_bundle(\n                \"7ae6085d2105d5d1e13b10f882c6cb072ff5bbf8\",\n                Some(\"1.62.1\"),\n                None,\n            )\n            .unwrap(),\n        );\n        check(\n            \"canary-release20221216-unknown-7ae6085d2105d5d1e13b10f8.zip\",\n            &name_hashed_bundle(\n                \"7ae6085d2105d5d1e13b10f882c6cb072ff5bbf8\",\n                None,\n                Some(&ReleaseTag::from_str(\"release-2022-12-16\").unwrap()),\n            )\n            .unwrap(),\n        );\n    }\n\n    #[test]\n    fn test_notable_versions() {\n        let versions = VersionsManifest {\n            smithy_rs_revision: \"some-revision-smithy-rs\".into(),\n            aws_doc_sdk_examples_revision: None,\n            manual_interventions: Default::default(),\n            crates: [].into_iter().collect(),\n            release: None,\n        };\n        assert_eq!(\n            \"latest\".to_string(),\n            enabled_feature(&CrateSource::VersionsManifest {\n                versions: versions.clone(),\n                release_tag: \"release-9999-12-31\".parse().unwrap(),\n            }),\n        );\n        assert_eq!(\n            \"release-2023-10-26\".to_string(),\n            enabled_feature(&CrateSource::VersionsManifest {\n                versions: versions.clone(),\n                release_tag: \"release-2023-10-26\".parse().unwrap(),\n            }),\n        );\n        assert_eq!(\n            \"release-2023-10-26\".to_string(),\n            enabled_feature(&CrateSource::VersionsManifest {\n                versions,\n                release_tag: \"release-2023-01-13\".parse().unwrap(),\n            }),\n        );\n    }\n}\n"
  },
  {
    "path": "tools/ci-cdk/canary-runner/src/generate_matrix.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse anyhow::Result;\nuse async_trait::async_trait;\nuse clap::Parser;\nuse serde::Serialize;\nuse smithy_rs_tool_common::release_tag::ReleaseTag;\nuse std::str::FromStr;\nuse std::time::Duration;\n\nconst KNOWN_YANKED_RELEASE_TAGS: &[&str] = &[\n    // Test release tag for the unit tests.\n    // There wasn't a release on this date, so this is fine for testing\n    \"release-2022-07-04\",\n    // Add release tags here to get the canary passing after yanking a release\n    \"release-2022-10-13\",\n    \"release-2022-12-15\", // Failed release\n    \"release-2022-12-16\", // Failed release\n];\n\n#[derive(Debug, Parser, Eq, PartialEq)]\npub struct GenerateMatrixArgs {\n    /// Number of previous SDK versions to run the canary against\n    #[clap(short, long)]\n    sdk_versions: u8,\n\n    /// Versions of Rust to compile against\n    #[clap(short, long, multiple_values = true)]\n    rust_versions: Vec<String>,\n}\n\n#[derive(Debug, Serialize)]\nstruct Output {\n    sdk_release_tag: Vec<String>,\n    rust_version: Vec<String>,\n}\n\n// Use a trait to make unit testing the GitHub API pagination easier\n#[async_trait]\ntrait RetrieveReleases {\n    async fn retrieve(&self, owner: &str, repo: &str, page_num: i64) -> Result<Vec<ReleaseTag>>;\n}\n\nstruct GitHubRetrieveReleases {\n    github: octorust::Client,\n}\n\nimpl GitHubRetrieveReleases {\n    fn new() -> Result<Self> {\n        let user_agent = \"smithy-rs-canary-runner-generate-matrix\";\n        Ok(Self {\n            github: octorust::Client::new(user_agent, None)?,\n        })\n    }\n}\n\n#[async_trait]\nimpl RetrieveReleases for GitHubRetrieveReleases {\n    async fn retrieve(&self, owner: &str, repo: &str, page_num: i64) -> Result<Vec<ReleaseTag>> {\n        let result = self\n            .github\n            .repos()\n            .list_tags(owner, repo, 100, page_num)\n            .await?\n            .body\n            .into_iter()\n            .filter_map(|tag| ReleaseTag::from_str(&tag.name).ok())\n            .collect();\n        // Be nice to GitHub\n        tokio::time::sleep(Duration::from_millis(250)).await;\n        Ok(result)\n    }\n}\n\nasync fn retrieve_latest_release_tags(\n    retrieve_releases: &dyn RetrieveReleases,\n    desired: usize,\n) -> Result<Vec<ReleaseTag>> {\n    // The GitHub API doesn't document the order that tags are returned in,\n    // so assume random order and sort them ourselves.\n    let mut page_num = 1;\n    let mut releases = Vec::new();\n    loop {\n        let page = retrieve_releases\n            .retrieve(\"awslabs\", \"aws-sdk-rust\", page_num)\n            .await?;\n        if page.is_empty() {\n            break;\n        }\n        releases.extend(page.into_iter());\n        page_num += 1;\n    }\n    releases.sort();\n    releases.reverse();\n\n    Ok(releases\n        .into_iter()\n        .filter(|release_tag| !KNOWN_YANKED_RELEASE_TAGS.contains(&release_tag.as_str()))\n        .take(desired)\n        .collect())\n}\n\npub async fn generate_matrix(opt: GenerateMatrixArgs) -> Result<()> {\n    let retrieve_releases = GitHubRetrieveReleases::new()?;\n    let sdk_release_tags =\n        retrieve_latest_release_tags(&retrieve_releases, opt.sdk_versions as usize).await?;\n\n    let output = Output {\n        sdk_release_tag: sdk_release_tags\n            .into_iter()\n            .map(|t| t.to_string())\n            .collect(),\n        rust_version: opt.rust_versions,\n    };\n    println!(\"{}\", serde_json::to_string(&output)?);\n    Ok(())\n}\n\n#[cfg(test)]\nmod tests {\n    use super::*;\n\n    fn tag(value: &str) -> ReleaseTag {\n        ReleaseTag::from_str(value).unwrap()\n    }\n\n    struct TestRetriever {\n        pages: Vec<Vec<ReleaseTag>>,\n    }\n\n    #[async_trait]\n    impl RetrieveReleases for TestRetriever {\n        async fn retrieve(\n            &self,\n            owner: &str,\n            repo: &str,\n            page_num: i64,\n        ) -> Result<Vec<ReleaseTag>> {\n            assert_eq!(\"awslabs\", owner);\n            assert_eq!(\"aws-sdk-rust\", repo);\n            Ok(self.pages[(page_num - 1) as usize].clone())\n        }\n    }\n\n    #[tokio::test]\n    async fn test_retrieve_latest_release_tags() {\n        let retriever = TestRetriever {\n            pages: vec![\n                vec![tag(\"v0.12.0\"), tag(\"v0.15.0\"), tag(\"release-2022-07-03\")],\n                vec![tag(\"v0.14.0\"), tag(\"release-2022-07-05\"), tag(\"v0.11.0\")],\n                vec![\n                    tag(\"v0.13.0\"),\n                    tag(\"release-2022-07-01\"),\n                    tag(\"release-2022-07-04\"),\n                ],\n                vec![],\n            ],\n        };\n\n        let tags = retrieve_latest_release_tags(&retriever, 4).await.unwrap();\n        assert_eq!(\n            vec![\n                tag(\"release-2022-07-05\"),\n                tag(\"release-2022-07-03\"),\n                tag(\"release-2022-07-01\"),\n                tag(\"v0.15.0\"),\n            ],\n            tags\n        );\n    }\n}\n"
  },
  {
    "path": "tools/ci-cdk/canary-runner/src/main.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse clap::Parser;\nuse tracing_subscriber::{filter::EnvFilter, prelude::*};\n\nmod arch;\nmod bench;\nmod build_bundle;\nmod generate_matrix;\nmod run;\n\n#[derive(Debug, Parser, Eq, PartialEq)]\n#[clap(version, about)]\npub(crate) enum Args {\n    /// Builds the canary Lambda bundle\n    #[clap(alias = \"build-bundle\")]\n    BuildBundle(build_bundle::BuildBundleArgs),\n\n    /// Generates a GitHub Actions test matrix for the canary\n    #[clap(alias = \"generate-matrix\")]\n    GenerateMatrix(generate_matrix::GenerateMatrixArgs),\n\n    /// Builds, uploads, and invokes the canary as a Lambda\n    #[clap(alias = \"run\")]\n    Run(run::RunArgs),\n\n    /// Runs cold-start benchmark against the canary Lambda\n    #[clap(alias = \"bench\")]\n    Bench(bench::BenchArgs),\n}\n\n#[tokio::main]\nasync fn main() -> anyhow::Result<()> {\n    let filter_layer = EnvFilter::try_from_default_env()\n        .or_else(|_| EnvFilter::try_new(\"warn,canary_runner=info\"))\n        .unwrap();\n    tracing_subscriber::registry()\n        .with(filter_layer)\n        .with(tracing_subscriber::fmt::layer().with_target(false))\n        .init();\n\n    let opt = Args::parse();\n    match opt {\n        Args::BuildBundle(subopt) => build_bundle::build_bundle(subopt).await.map(|_| ()),\n        Args::GenerateMatrix(subopt) => generate_matrix::generate_matrix(subopt).await,\n        Args::Run(subopt) => run::run(subopt).await,\n        Args::Bench(subopt) => bench::bench(subopt).await,\n    }\n}\n\n// Tests for individual subcommands can be found in their respective modules\n"
  },
  {
    "path": "tools/ci-cdk/canary-runner/src/run.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\n// This is the code used by CI to run the canary Lambda.\n//\n// If running this locally, you'll need to make a clone of smithy-lang/smithy-rs in\n// the aws-sdk-rust project root.\n//\n// Also consider using the `AWS_PROFILE` and `AWS_REGION` environment variables\n// when running this locally.\n//\n// CAUTION: This subcommand will `git reset --hard` in some cases. Don't ever run\n// it against a smithy-rs repo that you're actively working in.\n\nuse std::path::PathBuf;\nuse std::str::FromStr;\nuse std::time::{Duration, SystemTime};\nuse std::{env, path::Path};\n\nuse anyhow::{bail, Context, Result};\nuse clap::Parser;\nuse cloudwatch::types::StandardUnit;\nuse s3::primitives::ByteStream;\nuse serde::Deserialize;\nuse smithy_rs_tool_common::git::{find_git_repository_root, Git, GitCLI};\nuse smithy_rs_tool_common::macros::here;\nuse smithy_rs_tool_common::release_tag::ReleaseTag;\nuse tracing::{error, info};\n\nuse crate::build_bundle::BuildBundleArgs;\n\nuse aws_sdk_cloudwatch as cloudwatch;\nuse aws_sdk_lambda as lambda;\nuse aws_sdk_s3 as s3;\nuse std::collections::HashMap;\n\nconst DEFAULT_LAMBDA_FUNCTION_MEMORY_SIZE_IN_MB: i32 = 512;\n\nlazy_static::lazy_static! {\n    // Occasionally, a breaking change introduced in smithy-rs will cause the canary to fail\n    // for older versions of the SDK since the canary is in the smithy-rs repository and will\n    // get fixed for that breaking change. When this happens, the older SDK versions can be\n    // pinned to a commit hash in the smithy-rs repository to get old canary code that still\n    // compiles against that version of the SDK.\n    //\n    // This is a map of SDK release tag to smithy-rs commit hash\n    static ref PINNED_SMITHY_RS_VERSIONS: Vec<(ReleaseTag, &'static str)> = {\n        let mut pinned = vec![\n            // Versions <= 0.6.0 no longer compile against the canary after this commit in smithy-rs\n            // due to the breaking change in https://github.com/smithy-lang/smithy-rs/pull/1085\n            (ReleaseTag::from_str(\"v0.6.0\").unwrap(), \"d48c234796a16d518ca9e1dda5c7a1da4904318c\"),\n            // Versions <= release-2022-10-26 no longer compile against the canary after this commit in smithy-rs\n            // due to the s3 canary update in https://github.com/smithy-lang/smithy-rs/pull/1974\n            (ReleaseTag::from_str(\"release-2022-10-26\").unwrap(), \"3e24477ae7a0a2b3853962a064bc8333a016af54\")\n        ];\n        pinned.sort();\n        pinned\n    };\n}\n\n#[derive(Debug, Parser, Eq, PartialEq)]\npub struct RunArgs {\n    /// Rust version\n    #[clap(long)]\n    pub rust_version: Option<String>,\n\n    /// Version of the SDK to compile the canary against\n    #[clap(\n        long,\n        required_unless_present = \"sdk-path\",\n        conflicts_with = \"sdk-path\"\n    )]\n    sdk_release_tag: Option<ReleaseTag>,\n\n    /// Path to the SDK to compile against\n    #[clap(\n        long,\n        required_unless_present = \"sdk-release-tag\",\n        conflicts_with = \"sdk-release-tag\"\n    )]\n    sdk_path: Option<PathBuf>,\n\n    /// Whether to target MUSL instead of GLIBC when compiling the Lambda\n    #[clap(long)]\n    musl: bool,\n\n    /// Expected speech text generated by Transcribe. This needs to be passed-in\n    /// because it can change as the accuracy of generated text improves over time.\n    #[clap(long)]\n    expected_speech_text_by_transcribe: Option<String>,\n\n    /// Memory allocated for the function.\n    #[clap(long)]\n    lambda_function_memory_size_in_mb: Option<i32>,\n\n    /// File path to a CDK outputs JSON file. This can be used instead\n    /// of all the --lambda... args.\n    #[clap(long)]\n    cdk_output: Option<PathBuf>,\n\n    /// The name of the S3 bucket to upload the canary binary bundle to\n    #[clap(long, required_unless_present = \"cdk-output\")]\n    lambda_code_s3_bucket_name: Option<String>,\n\n    /// The name of the S3 bucket for the canary Lambda to interact with\n    #[clap(long, required_unless_present = \"cdk-output\")]\n    lambda_test_s3_bucket_name: Option<String>,\n\n    /// The ARN of the S3 MRAP bucket for the canary Lambda to interact with\n    #[clap(long, required_unless_present = \"cdk-output\")]\n    lambda_test_s3_mrap_bucket_arn: Option<String>,\n\n    /// The name of the S3 Express One Zone bucket for the canary Lambda to interact with\n    #[clap(long, required_unless_present = \"cdk-output\")]\n    lambda_test_s3_express_bucket_name: Option<String>,\n\n    /// The ARN of the role that the Lambda will execute as\n    #[clap(long, required_unless_present = \"cdk-output\")]\n    lambda_execution_role_arn: Option<String>,\n}\n\n#[derive(Debug, Eq, PartialEq)]\nstruct Options {\n    rust_version: Option<String>,\n    sdk_release_tag: Option<ReleaseTag>,\n    sdk_path: Option<PathBuf>,\n    musl: bool,\n    expected_speech_text_by_transcribe: Option<String>,\n    lambda_function_memory_size_in_mb: i32,\n    lambda_code_s3_bucket_name: String,\n    lambda_test_s3_bucket_name: String,\n    lambda_test_s3_mrap_bucket_arn: String,\n    lambda_test_s3_express_bucket_name: String,\n    lambda_execution_role_arn: String,\n}\n\nimpl Options {\n    fn load_from(run_opt: RunArgs) -> Result<Options> {\n        if let Some(cdk_output) = &run_opt.cdk_output {\n            #[derive(Deserialize)]\n            struct Inner {\n                #[serde(rename = \"canarycodebucketname\")]\n                lambda_code_s3_bucket_name: String,\n                #[serde(rename = \"canarytestbucketname\")]\n                lambda_test_s3_bucket_name: String,\n                #[serde(rename = \"canarytestmrapbucketarn\")]\n                lambda_test_s3_mrap_bucket_arn: String,\n                #[serde(rename = \"canarytestexpressbucketname\")]\n                lambda_test_s3_express_bucket_name: String,\n                #[serde(rename = \"lambdaexecutionrolearn\")]\n                lambda_execution_role_arn: String,\n            }\n            #[derive(Deserialize)]\n            enum Outer {\n                #[serde(rename = \"aws-sdk-rust-canary-stack\")]\n                AwsSdkRust {\n                    #[serde(flatten)]\n                    aws_sdk_rust_canary_stack: Inner,\n                },\n                #[serde(rename = \"smithy-rs-canary-stack\")]\n                SmithyRs {\n                    #[serde(flatten)]\n                    smithy_rs_canary_stack: Inner,\n                },\n            }\n            impl Outer {\n                fn into_inner(self) -> Inner {\n                    match self {\n                        Outer::AwsSdkRust {\n                            aws_sdk_rust_canary_stack,\n                        } => aws_sdk_rust_canary_stack,\n                        Outer::SmithyRs {\n                            smithy_rs_canary_stack,\n                        } => smithy_rs_canary_stack,\n                    }\n                }\n            }\n\n            let value: Outer = serde_json::from_reader(\n                std::fs::File::open(cdk_output).context(\"open cdk output\")?,\n            )\n            .context(\"read cdk output\")?;\n            let Inner {\n                lambda_code_s3_bucket_name,\n                lambda_test_s3_bucket_name,\n                lambda_test_s3_mrap_bucket_arn,\n                lambda_test_s3_express_bucket_name,\n                lambda_execution_role_arn,\n            } = value.into_inner();\n            Ok(Options {\n                rust_version: run_opt.rust_version,\n                sdk_release_tag: run_opt.sdk_release_tag,\n                sdk_path: run_opt.sdk_path,\n                musl: run_opt.musl,\n                expected_speech_text_by_transcribe: run_opt.expected_speech_text_by_transcribe,\n                lambda_function_memory_size_in_mb: run_opt\n                    .lambda_function_memory_size_in_mb\n                    .unwrap_or(DEFAULT_LAMBDA_FUNCTION_MEMORY_SIZE_IN_MB),\n                lambda_code_s3_bucket_name,\n                lambda_test_s3_bucket_name,\n                lambda_test_s3_mrap_bucket_arn,\n                lambda_test_s3_express_bucket_name,\n                lambda_execution_role_arn,\n            })\n        } else {\n            Ok(Options {\n                rust_version: run_opt.rust_version,\n                sdk_release_tag: run_opt.sdk_release_tag,\n                sdk_path: run_opt.sdk_path,\n                musl: run_opt.musl,\n                expected_speech_text_by_transcribe: run_opt.expected_speech_text_by_transcribe,\n                lambda_function_memory_size_in_mb: run_opt\n                    .lambda_function_memory_size_in_mb\n                    .unwrap_or(DEFAULT_LAMBDA_FUNCTION_MEMORY_SIZE_IN_MB),\n                lambda_code_s3_bucket_name: run_opt.lambda_code_s3_bucket_name.expect(\"required\"),\n                lambda_test_s3_bucket_name: run_opt.lambda_test_s3_bucket_name.expect(\"required\"),\n                lambda_test_s3_mrap_bucket_arn: run_opt\n                    .lambda_test_s3_mrap_bucket_arn\n                    .expect(\"required\"),\n                lambda_test_s3_express_bucket_name: run_opt\n                    .lambda_test_s3_express_bucket_name\n                    .expect(\"required\"),\n                lambda_execution_role_arn: run_opt.lambda_execution_role_arn.expect(\"required\"),\n            })\n        }\n    }\n}\n\npub async fn run(opt: RunArgs) -> Result<()> {\n    let options = Options::load_from(opt)?;\n    let start_time = SystemTime::now();\n    let config = aws_config::load_from_env().await;\n    let result = run_canary(&options, &config).await;\n    if let Err(err) = &result {\n        error!(\"Canary invocation failed: {err:?}\",);\n    }\n\n    let mut metrics = vec![\n        (\n            \"canary-success\",\n            if result.is_ok() { 1.0 } else { 0.0 },\n            StandardUnit::Count,\n        ),\n        (\n            \"canary-failure\",\n            if result.is_ok() { 0.0 } else { 1.0 },\n            StandardUnit::Count,\n        ),\n        (\n            \"canary-total-time\",\n            start_time.elapsed().expect(\"time in range\").as_secs_f64(),\n            StandardUnit::Seconds,\n        ),\n    ];\n    if let Ok(invoke_time) = result {\n        metrics.push((\n            \"canary-invoke-time\",\n            invoke_time.as_secs_f64(),\n            StandardUnit::Seconds,\n        ));\n    }\n\n    let cloudwatch_client = cloudwatch::Client::new(&config);\n    let mut request_builder = cloudwatch_client\n        .put_metric_data()\n        .namespace(\"aws-sdk-rust-canary\");\n    for metric in metrics {\n        request_builder = request_builder.metric_data(\n            cloudwatch::types::MetricDatum::builder()\n                .metric_name(metric.0)\n                .value(metric.1)\n                .timestamp(SystemTime::now().into())\n                .unit(metric.2)\n                .build(),\n        );\n    }\n\n    info!(\"Emitting metrics...\");\n    request_builder\n        .send()\n        .await\n        .context(here!(\"failed to emit metrics\"))?;\n\n    result.map(|_| ())\n}\n\nasync fn run_canary(options: &Options, config: &aws_config::SdkConfig) -> Result<Duration> {\n    let smithy_rs_root = find_git_repository_root(\"smithy-rs\", \".\").context(here!())?;\n    let smithy_rs = GitCLI::new(&smithy_rs_root).context(here!())?;\n    env::set_current_dir(smithy_rs_root.join(\"tools/ci-cdk/canary-lambda\"))\n        .context(\"failed to change working directory\")?;\n\n    if let Some(sdk_release_tag) = &options.sdk_release_tag {\n        use_correct_revision(&smithy_rs, sdk_release_tag)\n            .context(here!(\"failed to select correct revision of smithy-rs\"))?;\n    }\n\n    info!(\"Building the canary...\");\n    let bundle_path = build_bundle(options).await?;\n    let bundle_file_name = bundle_path.file_name().unwrap().to_str().unwrap();\n    let bundle_name = bundle_path.file_stem().unwrap().to_str().unwrap();\n\n    let s3_client = s3::Client::new(config);\n    let lambda_client = lambda::Client::new(config);\n\n    info!(\"Uploading Lambda code bundle to S3...\");\n    upload_bundle(\n        s3_client,\n        &options.lambda_code_s3_bucket_name,\n        bundle_file_name,\n        &bundle_path,\n    )\n    .await\n    .context(here!())?;\n\n    info!(\n        \"Creating the canary Lambda function named {}...\",\n        bundle_name\n    );\n    create_lambda_fn(\n        lambda_client.clone(),\n        bundle_name,\n        bundle_file_name,\n        options,\n    )\n    .await\n    .context(here!())?;\n\n    info!(\"Invoking the canary Lambda...\");\n    let invoke_start_time = SystemTime::now();\n    let invoke_result = invoke_lambda(lambda_client.clone(), bundle_name).await;\n    let invoke_time = invoke_start_time.elapsed().expect(\"time in range\");\n\n    info!(\"Deleting the canary Lambda...\");\n    delete_lambda_fn(lambda_client, bundle_name)\n        .await\n        .context(here!())?;\n\n    invoke_result.map(|_| invoke_time)\n}\n\nfn use_correct_revision(smithy_rs: &dyn Git, sdk_release_tag: &ReleaseTag) -> Result<()> {\n    if let Some((pinned_release_tag, commit_hash)) = PINNED_SMITHY_RS_VERSIONS\n        .iter()\n        .find(|(pinned_release_tag, _)| pinned_release_tag >= sdk_release_tag)\n    {\n        info!(\"SDK `{pinned_release_tag}` requires smithy-rs@{commit_hash} to successfully compile the canary\");\n        // Reset to the revision rather than checkout since the very act of running the\n        // canary-runner can make the working tree dirty by modifying the Cargo.lock file\n        smithy_rs.hard_reset(commit_hash).context(here!())?;\n    }\n    Ok(())\n}\n\n/// Returns the path to the compiled bundle zip file\nasync fn build_bundle(options: &Options) -> Result<PathBuf> {\n    let build_args = BuildBundleArgs {\n        canary_path: None,\n        rust_version: options.rust_version.clone(),\n        sdk_release_tag: options.sdk_release_tag.clone(),\n        sdk_path: options.sdk_path.clone(),\n        musl: options.musl,\n        architecture: crate::arch::Arch::X86_64,\n        manifest_only: false,\n        disable_jitter_entropy: true,\n        feature_override: None,\n    };\n    info!(\"Compiling the canary bundle for Lambda with {build_args:?}. This may take a few minutes...\");\n    Ok(crate::build_bundle::build_bundle(build_args)\n        .await?\n        .expect(\"manifest_only set to false, so there must be a bundle path\"))\n}\n\nasync fn upload_bundle(\n    s3_client: s3::Client,\n    s3_bucket: &str,\n    file_name: &str,\n    bundle_path: &Path,\n) -> Result<()> {\n    s3_client\n        .put_object()\n        .bucket(s3_bucket)\n        .key(file_name)\n        .body(\n            ByteStream::from_path(bundle_path)\n                .await\n                .context(here!(\"failed to load bundle file\"))?,\n        )\n        .send()\n        .await\n        .context(here!(\"failed to upload bundle to S3\"))?;\n    Ok(())\n}\n\nasync fn create_lambda_fn(\n    lambda_client: lambda::Client,\n    bundle_name: &str,\n    bundle_file_name: &str,\n    options: &Options,\n) -> Result<()> {\n    use lambda::types::*;\n\n    let env_builder = match &options.expected_speech_text_by_transcribe {\n        Some(expected_speech_text_by_transcribe) => Environment::builder()\n            .variables(\"RUST_BACKTRACE\", \"1\")\n            .variables(\"RUST_LOG\", \"info\")\n            .variables(\"CANARY_S3_BUCKET_NAME\", &options.lambda_test_s3_bucket_name)\n            .variables(\n                \"CANARY_S3_MRAP_BUCKET_ARN\",\n                &options.lambda_test_s3_mrap_bucket_arn,\n            )\n            .variables(\n                \"CANARY_S3_EXPRESS_BUCKET_NAME\",\n                &options.lambda_test_s3_express_bucket_name,\n            )\n            .variables(\n                \"CANARY_EXPECTED_TRANSCRIBE_RESULT\",\n                expected_speech_text_by_transcribe,\n            ),\n        None => Environment::builder()\n            .variables(\"RUST_BACKTRACE\", \"1\")\n            .variables(\"RUST_LOG\", \"info\")\n            .variables(\"CANARY_S3_BUCKET_NAME\", &options.lambda_test_s3_bucket_name)\n            .variables(\n                \"CANARY_S3_MRAP_BUCKET_ARN\",\n                &options.lambda_test_s3_mrap_bucket_arn,\n            )\n            .variables(\n                \"CANARY_S3_EXPRESS_BUCKET_NAME\",\n                &options.lambda_test_s3_express_bucket_name,\n            ),\n    };\n\n    lambda_client\n        .create_function()\n        .function_name(bundle_name)\n        .runtime(Runtime::Providedal2)\n        .role(&options.lambda_execution_role_arn)\n        .handler(\"aws-sdk-rust-lambda-canary\")\n        .code(\n            FunctionCode::builder()\n                .s3_bucket(&options.lambda_code_s3_bucket_name)\n                .s3_key(bundle_file_name)\n                .build(),\n        )\n        .publish(true)\n        .environment(env_builder.build())\n        .timeout(180)\n        .memory_size(options.lambda_function_memory_size_in_mb)\n        .send()\n        .await\n        .context(here!(\"failed to create canary Lambda function\"))?;\n\n    let mut attempts = 0;\n    let mut state = State::Pending;\n    while !matches!(state, State::Active) && attempts < 20 {\n        info!(\"Waiting 1 second for Lambda to become active...\");\n        tokio::time::sleep(Duration::from_secs(1)).await;\n        let configuration = lambda_client\n            .get_function_configuration()\n            .function_name(bundle_name)\n            .send()\n            .await\n            .context(here!(\"failed to get Lambda function status\"))?;\n        state = configuration.state.unwrap();\n        attempts += 1;\n    }\n    if !matches!(state, State::Active) {\n        bail!(\"Timed out waiting for canary Lambda to become active\");\n    }\n    Ok(())\n}\n\nasync fn invoke_lambda(lambda_client: lambda::Client, bundle_name: &str) -> Result<()> {\n    use lambda::primitives::Blob;\n    use lambda::types::*;\n\n    let response = lambda_client\n        .invoke()\n        .function_name(bundle_name)\n        .invocation_type(InvocationType::RequestResponse)\n        .log_type(LogType::Tail)\n        .payload(Blob::new(&b\"{}\"[..]))\n        .send()\n        .await\n        .context(here!(\"failed to invoke the canary Lambda\"))?;\n\n    if let Some(log_result) = response.log_result() {\n        info!(\n            \"Last 4 KB of canary logs:\\n----\\n{}\\n----\\n\",\n            std::str::from_utf8(&base64::decode(log_result)?)?\n        );\n    }\n    if response.status_code() != 200 || response.function_error().is_some() {\n        bail!(\n            \"Canary failed: {}\",\n            response\n                .function_error\n                .as_deref()\n                .unwrap_or(\"<no error given>\")\n        );\n    }\n    if let Some(payload) = response.payload {\n        // Example payload:\n        // {\n        //  \"failures\": {\n        //    \"ec2_paginator\": \"service error\\n\\nCaused by:\\n    0: unhandled error\\n    1: unhandled error\\n    2: Error { code: \\\"UnauthorizedOperation\\\", message: \\\"You are not authorized to perform this operation.\\\", aws_request_id: \\\"0adcd3f5-73f3-45a2-bd2e-09e4172b65f1\\\" }\",\n        //    \"transcribe_canary\": \"Transcription from Transcribe doesn't look right:\\nExpected: `Good day to you transcribe. This is Polly talking to you from the Rust ST K.`\\nActual:   `Good day to you transcribe. This is Polly talking to you from the Rust S. D. K.`\\n\"\n        //  },\n        //  \"result\": \"failure\"\n        //}\n        #[derive(serde::Deserialize)]\n        struct Payload {\n            failures: Option<HashMap<String, String>>,\n            result: String,\n        }\n        let payload: Payload = serde_json::from_slice(payload.as_ref())?;\n        if payload.result == \"failure\"\n            || !payload\n                .failures\n                .as_ref()\n                .map(|m| m.is_empty())\n                .unwrap_or(true)\n        {\n            if let Some(failures) = &payload.failures {\n                for (service, message) in failures {\n                    error!(\"{service} failed:\\n{message}\\n\");\n                }\n            }\n            bail!(\"The canary failed.\");\n        }\n    }\n    Ok(())\n}\n\nasync fn delete_lambda_fn(lambda_client: lambda::Client, bundle_name: &str) -> Result<()> {\n    lambda_client\n        .delete_function()\n        .function_name(bundle_name)\n        .send()\n        .await\n        .context(here!(\"failed to delete Lambda\"))?;\n    Ok(())\n}\n\n#[cfg(test)]\nmod tests {\n    use crate::run::{Options, RunArgs, DEFAULT_LAMBDA_FUNCTION_MEMORY_SIZE_IN_MB};\n    use clap::Parser;\n\n    #[test]\n    fn args_parsing() {\n        assert_eq!(\n            RunArgs {\n                rust_version: None,\n                sdk_release_tag: None,\n                sdk_path: Some(\"artifact-aws-sdk-rust/sdk\".into()),\n                musl: false,\n                expected_speech_text_by_transcribe: Some(\"Good day to you transcribe.\".to_owned()),\n                lambda_function_memory_size_in_mb: Some(1024),\n                cdk_output: Some(\"../cdk-outputs.json\".into()),\n                lambda_code_s3_bucket_name: None,\n                lambda_test_s3_bucket_name: None,\n                lambda_execution_role_arn: None,\n                lambda_test_s3_mrap_bucket_arn: None,\n                lambda_test_s3_express_bucket_name: None\n            },\n            RunArgs::try_parse_from([\n                \"run\",\n                \"--sdk-path\",\n                \"artifact-aws-sdk-rust/sdk\",\n                \"--expected-speech-text-by-transcribe\",\n                \"Good day to you transcribe.\",\n                \"--lambda-function-memory-size-in-mb\",\n                \"1024\",\n                \"--cdk-output\",\n                \"../cdk-outputs.json\",\n            ])\n            .unwrap()\n        );\n    }\n\n    #[test]\n    fn options_from_args() {\n        let run_args = RunArgs::try_parse_from([\n            \"run\",\n            \"--sdk-path\",\n            \"artifact-aws-sdk-rust/sdk\",\n            \"--expected-speech-text-by-transcribe\",\n            \"Good day to you transcribe.\",\n            \"--lambda-code-s3-bucket-name\",\n            \"bucket-for-code\",\n            \"--lambda-test-s3-bucket-name\",\n            \"bucket-for-test\",\n            \"--lambda-execution-role-arn\",\n            \"arn:aws:lambda::role/exe-role\",\n            \"--lambda-test-s3-mrap-bucket-arn\",\n            \"arn:aws:s3::000000000000:accesspoint/example.mrap\",\n            \"--lambda-test-s3-express-bucket-name\",\n            \"test--usw2-az1--x-s3\",\n        ])\n        .unwrap();\n        assert_eq!(\n            Options {\n                rust_version: None,\n                sdk_release_tag: None,\n                sdk_path: Some(\"artifact-aws-sdk-rust/sdk\".into()),\n                musl: false,\n                expected_speech_text_by_transcribe: Some(\"Good day to you transcribe.\".to_owned()),\n                lambda_function_memory_size_in_mb: DEFAULT_LAMBDA_FUNCTION_MEMORY_SIZE_IN_MB,\n                lambda_code_s3_bucket_name: \"bucket-for-code\".to_owned(),\n                lambda_test_s3_bucket_name: \"bucket-for-test\".to_owned(),\n                lambda_execution_role_arn: \"arn:aws:lambda::role/exe-role\".to_owned(),\n                lambda_test_s3_mrap_bucket_arn: \"arn:aws:s3::000000000000:accesspoint/example.mrap\"\n                    .to_owned(),\n                lambda_test_s3_express_bucket_name: \"test--usw2-az1--x-s3\".to_owned(),\n            },\n            Options::load_from(run_args).unwrap(),\n        );\n    }\n}\n"
  },
  {
    "path": "tools/ci-cdk/canary-wasm/.gitignore",
    "content": "# Generated Rust file\n/src/bindings.rs\n\n# The Cargo.toml should be generated every time it's needed\n/Cargo.toml\n/Cargo.lock\n"
  },
  {
    "path": "tools/ci-cdk/canary-wasm/src/lib.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse aws_config::Region;\nuse aws_sdk_s3 as s3;\nuse aws_smithy_wasm::wasi::{WasiHttpClient, WasiSleep};\n\n//Generates the Rust bindings from the wit file\nwit_bindgen::generate!({\n    world: \"canary-world\",\n});\n\nexport!(Component);\n\nstruct Component;\n\nimpl exports::aws::component::canary_interface::Guest for Component {\n    fn run_canary() -> Result<Vec<String>, String> {\n        wstd::runtime::block_on(async { run().await })\n    }\n}\n\nasync fn run() -> Result<Vec<String>, String> {\n    let http_client = WasiHttpClient::default();\n    let sleep = WasiSleep;\n    let config = aws_config::from_env()\n        .region(Region::new(\"us-east-2\"))\n        .no_credentials()\n        .http_client(http_client)\n        .sleep_impl(sleep)\n        .load()\n        .await;\n\n    let client = s3::Client::new(&config);\n    let result = client\n        .list_objects_v2()\n        .bucket(\"nara-national-archives-catalog\")\n        .delimiter(\"/\")\n        .prefix(\"authority-records/organization/\")\n        .max_keys(5)\n        .send()\n        .await\n        .expect(\"Failed to ListObjects\");\n\n    //For ease of modeling the return we just extract the keys from the objects\n    let object_names: Vec<String> = result\n        .contents\n        .expect(\"No S3 Objects\")\n        .iter()\n        .map(|obj| obj.key().expect(\"Object has no name\").to_string())\n        .collect();\n\n    Ok(object_names)\n}\n"
  },
  {
    "path": "tools/ci-cdk/canary-wasm/wit/component.wit",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\npackage aws:component;\n \ninterface canary-interface {\n    run-canary: func() -> result<list<string>, string>;\n}\n \nworld canary-world {\n    export canary-interface;\n}\n     "
  },
  {
    "path": "tools/ci-cdk/cdk.json",
    "content": "{\n  \"app\": \"npx ts-node --prefer-ts-exts bin/smithy-rs/ci-cdk.ts\",\n  \"watch\": {\n    \"include\": [\n      \"**\"\n    ],\n    \"exclude\": [\n      \"README.md\",\n      \"cdk*.json\",\n      \"**/*.d.ts\",\n      \"**/*.js\",\n      \"tsconfig.json\",\n      \"package*.json\",\n      \"yarn.lock\",\n      \"node_modules\",\n      \"test\"\n    ]\n  },\n  \"context\": {\n  }\n}\n"
  },
  {
    "path": "tools/ci-cdk/jest.config.js",
    "content": "module.exports = {\n  testEnvironment: 'node',\n  roots: ['<rootDir>/test'],\n  testMatch: ['**/*.test.ts'],\n  transform: {\n    '^.+\\\\.tsx?$': 'ts-jest'\n  }\n};\n"
  },
  {
    "path": "tools/ci-cdk/lib/canary-stack.ts",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport {\n    Effect,\n    OpenIdConnectProvider,\n    PolicyStatement,\n    Role,\n    ServicePrincipal,\n} from \"aws-cdk-lib/aws-iam\";\nimport {\n    BlockPublicAccess,\n    Bucket,\n    BucketEncryption,\n    CfnMultiRegionAccessPoint,\n} from \"aws-cdk-lib/aws-s3\";\nimport { CfnDirectoryBucket } from \"aws-cdk-lib/aws-s3express\";\nimport { StackProps, Stack, Tags, RemovalPolicy, Duration, CfnOutput } from \"aws-cdk-lib\";\nimport { Construct } from \"constructs\";\nimport { GitHubOidcRole } from \"./constructs/github-oidc-role\";\n\nexport interface OidcProps {\n    roleId: string;\n    roleName: string;\n    roleGithubOrg: string;\n    roleGithubRepo: string;\n    provider: OpenIdConnectProvider;\n}\n\nexport interface Properties extends StackProps {\n    lambdaExecutionRole: string;\n    oidcProps?: OidcProps;\n}\n\nexport class CanaryStack extends Stack {\n    public readonly githubOidcRole?: GitHubOidcRole;\n    public readonly lambdaExecutionRole: Role;\n    public readonly canaryCodeBucket: Bucket;\n    public readonly canaryTestBucket: Bucket;\n    public readonly canaryTestMrap: CfnMultiRegionAccessPoint;\n    public readonly canaryTestExpressBucket: CfnDirectoryBucket;\n    public readonly canaryCdkOutputsBucket: Bucket;\n\n    public readonly lambdaExecutionRoleArn: CfnOutput;\n    public readonly canaryCodeBucketName: CfnOutput;\n    public readonly canaryTestBucketName: CfnOutput;\n    public readonly canaryTestMrapBucketArn: CfnOutput;\n    public readonly canaryTestExpressBucketName: CfnOutput;\n\n    constructor(scope: Construct, id: string, props: Properties) {\n        super(scope, id, props);\n\n        // Tag the resources created by this stack to make identifying resources easier\n        Tags.of(this).add(\"stack\", id);\n\n        if (props.oidcProps) {\n            this.githubOidcRole = new GitHubOidcRole(this, props.oidcProps.roleId, {\n                name: props.oidcProps.roleName,\n                githubOrg: props.oidcProps.roleGithubOrg,\n                githubRepo: props.oidcProps.roleGithubRepo,\n                oidcProvider: props.oidcProps.provider,\n            });\n\n            // Grant permission to create/invoke/delete a canary Lambda\n            this.githubOidcRole.oidcRole.addToPolicy(\n                new PolicyStatement({\n                    actions: [\n                        \"lambda:CreateFunction\",\n                        \"lambda:DeleteFunction\",\n                        \"lambda:InvokeFunction\",\n                        \"lambda:GetFunctionConfiguration\",\n                    ],\n                    effect: Effect.ALLOW,\n                    // Only allow this for functions starting with prefix `canary-`\n                    resources: [\"arn:aws:lambda:*:*:function:canary-*\"],\n                }),\n            );\n\n            // Grant permission to put metric data to CloudWatch\n            this.githubOidcRole.oidcRole.addToPolicy(\n                new PolicyStatement({\n                    actions: [\"cloudwatch:PutMetricData\"],\n                    effect: Effect.ALLOW,\n                    resources: [\"*\"],\n                }),\n            );\n        }\n\n        // Create S3 bucket to upload canary Lambda code into\n        this.canaryCodeBucket = new Bucket(this, \"canary-code-bucket\", {\n            blockPublicAccess: BlockPublicAccess.BLOCK_ALL,\n            encryption: BucketEncryption.S3_MANAGED,\n            lifecycleRules: [\n                {\n                    id: \"delete-old-code-files\",\n                    enabled: true,\n                    expiration: Duration.days(7),\n                },\n            ],\n            versioned: false,\n            removalPolicy: RemovalPolicy.DESTROY,\n        });\n\n        // Output the bucket name to make it easier to invoke the canary runner\n        this.canaryCodeBucketName = new CfnOutput(this, \"canary-code-bucket-name\", {\n            value: this.canaryCodeBucket.bucketName,\n            description: \"Name of the canary code bucket\",\n            exportName: \"canaryCodeBucket\",\n        });\n\n        // Allow the OIDC role to GetObject and PutObject to the code bucket\n        if (this.githubOidcRole) {\n            this.canaryCodeBucket.grantRead(this.githubOidcRole.oidcRole);\n            this.canaryCodeBucket.grantWrite(this.githubOidcRole.oidcRole);\n        }\n\n        this.canaryCdkOutputsBucket = new Bucket(this, \"canary-cdk-outputs-bucket\", {\n            blockPublicAccess: BlockPublicAccess.BLOCK_ALL,\n            encryption: BucketEncryption.S3_MANAGED,\n            versioned: false,\n            removalPolicy: RemovalPolicy.DESTROY,\n        });\n\n        // Allow the OIDC role to GetObject from the cdk outputs bucket\n        if (this.githubOidcRole) {\n            this.canaryCdkOutputsBucket.grantRead(this.githubOidcRole.oidcRole);\n        }\n\n        // Create S3 bucket for the canaries to talk to\n        this.canaryTestBucket = new Bucket(this, \"canary-test-bucket\", {\n            blockPublicAccess: BlockPublicAccess.BLOCK_ALL,\n            encryption: BucketEncryption.S3_MANAGED,\n            lifecycleRules: [\n                {\n                    id: \"delete-old-test-files\",\n                    enabled: true,\n                    expiration: Duration.days(7),\n                },\n            ],\n            versioned: false,\n            removalPolicy: RemovalPolicy.DESTROY,\n        });\n\n        // Output the bucket name to make it easier to invoke the canary runner\n        this.canaryTestBucketName = new CfnOutput(this, \"canary-test-bucket-name\", {\n            value: this.canaryTestBucket.bucketName,\n            description: \"Name of the canary test bucket\",\n            exportName: \"canaryTestBucket\",\n        });\n\n        // Create a MultiRegionAccessPoint for the canary test bucket\n        this.canaryTestMrap = new CfnMultiRegionAccessPoint(this, \"canary-test-mrap-bucket\", {\n            regions: [{ bucket: this.canaryTestBucket.bucketName }],\n            name: \"canary-test-mrap-bucket\",\n        });\n\n        const accountId = this.canaryTestMrap.stack.account;\n        const alias = this.canaryTestMrap.attrAlias;\n        const canaryTestMrapBucketArn = `arn:aws:s3::${accountId}:accesspoint/${alias}`;\n        if (canaryTestMrapBucketArn) {\n            // Output the bucket name to make it easier to invoke the canary runner\n            this.canaryTestMrapBucketArn = new CfnOutput(this, \"canary-test-mrap-bucket-arn\", {\n                value: canaryTestMrapBucketArn,\n                description: \"ARN of the canary test MRAP bucket\",\n                exportName: \"canaryTestMrapBucketArn\",\n            });\n        }\n\n        this.canaryTestExpressBucket = new CfnDirectoryBucket(this, \"canary-test-express-bucket\", {\n            dataRedundancy: \"SingleAvailabilityZone\",\n            locationName: \"usw2-az1\",\n        });\n\n        // Output the bucket name to make it easier to invoke the canary runner\n        this.canaryTestExpressBucketName = new CfnOutput(this, \"canary-test-express-bucket-name\", {\n            value: this.canaryTestExpressBucket.ref,\n            description: \"Name of the canary express test bucket\",\n            exportName: \"canaryExpressTestBucket\",\n        });\n\n        // Create a role for the canary Lambdas to assume\n        this.lambdaExecutionRole = new Role(this, \"lambda-execution-role\", {\n            roleName: props.lambdaExecutionRole,\n            assumedBy: new ServicePrincipal(\"lambda.amazonaws.com\"),\n        });\n\n        // Output the Lambda execution role ARN to make it easier to invoke the canary runner\n        this.lambdaExecutionRoleArn = new CfnOutput(this, \"lambda-execution-role-arn\", {\n            value: this.lambdaExecutionRole.roleArn,\n            description: \"Canary Lambda execution role ARN\",\n            exportName: \"canaryLambdaExecutionRoleArn\",\n        });\n\n        // Allow canaries to write logs to CloudWatch\n        this.lambdaExecutionRole.addToPolicy(\n            new PolicyStatement({\n                actions: [\"logs:CreateLogGroup\", \"logs:CreateLogStream\", \"logs:PutLogEvents\"],\n                effect: Effect.ALLOW,\n                resources: [\"arn:aws:logs:*:*:/aws/lambda/canary-*:*\"],\n            }),\n        );\n\n        // Allow canaries to talk to their test bucket\n        this.canaryTestBucket.grantReadWrite(this.lambdaExecutionRole);\n\n        this.lambdaExecutionRole.addToPolicy(\n            new PolicyStatement({\n                actions: [\"s3:GetObject\", \"s3:PutObject\", \"s3:DeleteObject\", \"s3:ListAllMyBuckets\"],\n                effect: Effect.ALLOW,\n                resources: [`${canaryTestMrapBucketArn}`, `${canaryTestMrapBucketArn}/object/*`],\n            }),\n        );\n\n        // Allow canaries to perform operations on test express bucket\n        // Unlike S3, no need to grant separate permissions for GetObject, PutObject, and so on because\n        // the session token enables access instead:\n        // https://docs.aws.amazon.com/AmazonS3/latest/userguide/s3-express-security-iam.html#s3-express-security-iam-actions\n        this.lambdaExecutionRole.addToPolicy(\n            new PolicyStatement({\n                actions: [\"s3express:CreateSession\"],\n                effect: Effect.ALLOW,\n                resources: [`${this.canaryTestExpressBucket.attrArn}`],\n            }),\n        );\n\n        // Allow canaries to list directory buckets\n        this.lambdaExecutionRole.addToPolicy(\n            new PolicyStatement({\n                actions: [\"s3express:ListAllMyDirectoryBuckets\"],\n                effect: Effect.ALLOW,\n                resources: [\"*\"],\n            }),\n        );\n\n        // Allow canaries to call Transcribe's StartStreamTranscription\n        this.lambdaExecutionRole.addToPolicy(\n            new PolicyStatement({\n                actions: [\"transcribe:StartStreamTranscription\"],\n                effect: Effect.ALLOW,\n                resources: [\"*\"],\n            }),\n        );\n\n        // Allow canaries to call STS\n        this.lambdaExecutionRole.addToPolicy(\n            new PolicyStatement({\n                actions: [\"sts:GetCallerIdentity\"],\n                effect: Effect.ALLOW,\n                resources: [\"*\"],\n            }),\n        );\n\n        // Allow canaries to call EC2\n        this.lambdaExecutionRole.addToPolicy(\n            new PolicyStatement({\n                actions: [\"ec2:DescribeRegions\"],\n                effect: Effect.ALLOW,\n                resources: [\"*\"],\n            }),\n        );\n\n        // Allow the OIDC role to pass the Lambda execution role to Lambda\n        if (this.githubOidcRole) {\n            this.githubOidcRole.oidcRole.addToPolicy(\n                new PolicyStatement({\n                    actions: [\"iam:PassRole\"],\n                    effect: Effect.ALLOW,\n                    // Security: only allow the Lambda execution role to be passed\n                    resources: [this.lambdaExecutionRole.roleArn],\n                    // Security: only allow the role to be passed to Lambda\n                    conditions: {\n                        StringEquals: {\n                            \"iam:PassedToService\": \"lambda.amazonaws.com\",\n                        },\n                    },\n                }),\n            );\n        }\n    }\n}\n"
  },
  {
    "path": "tools/ci-cdk/lib/constructs/cloudfront-s3-cdn.ts",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport {\n    AllowedMethods,\n    CachedMethods,\n    Distribution,\n    OriginAccessIdentity,\n    PriceClass,\n    ViewerProtocolPolicy,\n} from \"aws-cdk-lib/aws-cloudfront\";\nimport { S3Origin } from \"aws-cdk-lib/aws-cloudfront-origins\";\nimport { BlockPublicAccess, Bucket, BucketEncryption, LifecycleRule } from \"aws-cdk-lib/aws-s3\";\nimport { RemovalPolicy, Tags } from \"aws-cdk-lib\";\nimport { Construct } from \"constructs\";\n\nexport interface Properties {\n    name: string;\n    lifecycleRules?: LifecycleRule[];\n    removalPolicy: RemovalPolicy;\n}\n\nexport class CloudFrontS3Cdn extends Construct {\n    public readonly bucket: Bucket;\n    public readonly distribution: Distribution;\n    private readonly originAccessIdentity: OriginAccessIdentity;\n\n    constructor(scope: Construct, id: string, properties: Properties) {\n        super(scope, id);\n\n        // Tag the resources created by this construct to make identifying resources easier\n        Tags.of(this).add(\"construct-name\", properties.name);\n        Tags.of(this).add(\"construct-type\", \"CloudFrontS3Cdn\");\n\n        this.bucket = new Bucket(this, \"bucket\", {\n            blockPublicAccess: BlockPublicAccess.BLOCK_ALL,\n            encryption: BucketEncryption.S3_MANAGED,\n            lifecycleRules: properties.lifecycleRules,\n            versioned: false,\n            removalPolicy: properties.removalPolicy,\n        });\n\n        this.originAccessIdentity = new OriginAccessIdentity(this, \"bucket-access-identity\");\n        this.bucket.grantRead(this.originAccessIdentity);\n\n        this.distribution = new Distribution(this, \"distribution\", {\n            enabled: true,\n            defaultBehavior: {\n                compress: true,\n                origin: new S3Origin(this.bucket, {\n                    originAccessIdentity: this.originAccessIdentity,\n                }),\n                allowedMethods: AllowedMethods.ALLOW_GET_HEAD_OPTIONS,\n                cachedMethods: CachedMethods.CACHE_GET_HEAD_OPTIONS,\n                viewerProtocolPolicy: ViewerProtocolPolicy.REDIRECT_TO_HTTPS,\n            },\n            priceClass: PriceClass.PRICE_CLASS_100,\n        });\n    }\n}\n"
  },
  {
    "path": "tools/ci-cdk/lib/constructs/github-oidc-role.ts",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { FederatedPrincipal, OpenIdConnectProvider, Role } from \"aws-cdk-lib/aws-iam\";\nimport { Construct } from \"constructs\";\nimport { Tags } from \"aws-cdk-lib\";\n\nexport interface Properties {\n    name: string;\n    githubOrg: string;\n    githubRepo: string;\n    oidcProvider: OpenIdConnectProvider;\n}\n\nexport class GitHubOidcRole extends Construct {\n    public readonly oidcRole: Role;\n\n    constructor(scope: Construct, id: string, properties: Properties) {\n        super(scope, id);\n\n        // Tag the resources created by this construct to make identifying resources easier\n        Tags.of(this).add(\"construct-name\", properties.name);\n        Tags.of(this).add(\"construct-type\", \"GitHubOidcRole\");\n\n        this.oidcRole = new Role(this, \"oidc-role\", {\n            roleName: `${properties.name}-github-oidc-role`,\n            assumedBy: new FederatedPrincipal(\n                properties.oidcProvider.openIdConnectProviderArn,\n                {\n                    StringLike: {\n                        \"token.actions.githubusercontent.com:sub\": `repo:${properties.githubOrg}/${properties.githubRepo}:*`,\n                    },\n                },\n                \"sts:AssumeRoleWithWebIdentity\",\n            ),\n        });\n    }\n}\n"
  },
  {
    "path": "tools/ci-cdk/lib/oidc-provider-stack.ts",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { OpenIdConnectProvider } from \"aws-cdk-lib/aws-iam\";\nimport { StackProps, Stack, Tags } from \"aws-cdk-lib\";\nimport { Construct } from \"constructs\";\n\n// There can only be one OIDC provider for a given URL per AWS account,\n// so put these in their own stack to be shared with other stacks.\nexport class OidcProviderStack extends Stack {\n    public readonly githubActionsOidcProvider: OpenIdConnectProvider;\n\n    constructor(scope: Construct, id: string, props?: StackProps) {\n        super(scope, id, props);\n\n        // Tag the resources created by this stack to make identifying resources easier\n        Tags.of(this).add(\"stack\", id);\n\n        this.githubActionsOidcProvider = new OpenIdConnectProvider(this, \"oidc-provider\", {\n            url: \"https://token.actions.githubusercontent.com\",\n            clientIds: [\"sts.amazonaws.com\"],\n        });\n    }\n}\n"
  },
  {
    "path": "tools/ci-cdk/lib/smithy-rs/pull-request-cdn-stack.ts",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { OpenIdConnectProvider } from \"aws-cdk-lib/aws-iam\";\nimport { Duration, RemovalPolicy, Stack, StackProps, Tags } from \"aws-cdk-lib\";\nimport { CloudFrontS3Cdn } from \"../constructs/cloudfront-s3-cdn\";\nimport { GitHubOidcRole } from \"../constructs/github-oidc-role\";\nimport { Construct } from \"constructs\";\n\nexport interface Properties extends StackProps {\n    githubActionsOidcProvider: OpenIdConnectProvider;\n}\n\nexport class PullRequestCdnStack extends Stack {\n    public readonly smithyRsOidcRole: GitHubOidcRole;\n    public readonly pullRequestCdn: CloudFrontS3Cdn;\n\n    constructor(scope: Construct, id: string, props: Properties) {\n        super(scope, id, props);\n\n        // Tag the resources created by this stack to make identifying resources easier\n        Tags.of(this).add(\"stack\", id);\n\n        this.smithyRsOidcRole = new GitHubOidcRole(this, \"smithy-rs\", {\n            name: \"smithy-rs-pull-request\",\n            githubOrg: \"smithy-lang\",\n            githubRepo: \"smithy-rs\",\n            oidcProvider: props.githubActionsOidcProvider,\n        });\n\n        this.pullRequestCdn = new CloudFrontS3Cdn(this, \"pull-request-cdn\", {\n            name: \"smithy-rs-pull-request\",\n            lifecycleRules: [\n                {\n                    id: \"delete-old-codegen-diffs\",\n                    enabled: true,\n                    expiration: Duration.days(90),\n                    prefix: \"codegen-diff/\",\n                },\n                {\n                    id: \"delete-old-docs\",\n                    enabled: true,\n                    // The docs are huge, so keep them for a much shorter period of time\n                    expiration: Duration.days(14),\n                    prefix: \"docs/\",\n                },\n            ],\n            // Delete the bucket and all its files if deleting the stack\n            removalPolicy: RemovalPolicy.DESTROY,\n        });\n\n        // Grant the OIDC role permission to write to the CDN bucket\n        this.pullRequestCdn.bucket.grantWrite(this.smithyRsOidcRole.oidcRole);\n    }\n}\n"
  },
  {
    "path": "tools/ci-cdk/package.json",
    "content": "{\n  \"name\": \"ci-cdk\",\n  \"version\": \"0.1.0\",\n  \"private\": true,\n  \"bin\": {\n    \"smithy-rs-ci-cdk\": \"bin/smithy-rs/ci-cdk.js\",\n    \"aws-rust-sdk-canary\": \"bin/aws-sdk-rust/canary.js\"\n  },\n  \"scripts\": {\n    \"build\": \"tsc && cdk --app \\\"node build/bin/smithy-rs/ci-cdk.js\\\" synth\",\n    \"cdk\": \"cdk\",\n    \"deploy\": \"cdk --app \\\"node build/bin/smithy-rs/ci-cdk.js\\\" deploy --outputs-file cdk-outputs.json --all\",\n    \"format\": \"prettier --write '**/*.ts'\",\n    \"lint\": \"eslint --ext .ts lib\",\n    \"test\": \"jest\",\n    \"watch\": \"tsc -w\"\n  },\n  \"devDependencies\": {\n    \"@types/jest\": \"^27.0.0\",\n    \"@types/node\": \"^17.0.0\",\n    \"@typescript-eslint/eslint-plugin\": \"^5.12.0\",\n    \"@typescript-eslint/parser\": \"^5.12.0\",\n    \"aws-cdk\": \"^2.0.0\",\n    \"aws-cdk-lib\": \"^2.0.0\",\n    \"constructs\": \"^10.0.0\",\n    \"eslint\": \"^8.9.0\",\n    \"eslint-config-prettier\": \"^8.4.0\",\n    \"jest\": \"^27.0.0\",\n    \"prettier\": \"^2.5.0\",\n    \"source-map-support\": \"^0.5.16\",\n    \"ts-jest\": \"^27.0.0\",\n    \"ts-node\": \"^10.0.0\",\n    \"typescript\": \"~4.5.5\"\n  }\n}\n"
  },
  {
    "path": "tools/ci-cdk/test/constructs/github-oidc-role.test.ts",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { Match, Template } from \"aws-cdk-lib/assertions\";\nimport { App, Stack } from \"aws-cdk-lib\";\nimport { GitHubOidcRole } from \"../../lib/constructs/github-oidc-role\";\nimport { OidcProviderStack } from \"../../lib/oidc-provider-stack\";\n\ntest(\"it should have an OIDC access role\", () => {\n    const app = new App();\n    const oidcStack = new OidcProviderStack(app, \"oidc-provider-stack\", {});\n    const stack = new Stack(app, \"test-stack\");\n\n    new GitHubOidcRole(stack, \"test\", {\n        name: \"some-name\",\n        githubOrg: \"some-org\",\n        githubRepo: \"some-repo\",\n        oidcProvider: oidcStack.githubActionsOidcProvider,\n    });\n    const template = Template.fromStack(stack);\n\n    // Verify the OIDC role to be assumed\n    template.hasResourceProperties(\n        \"AWS::IAM::Role\",\n        Match.objectEquals({\n            AssumeRolePolicyDocument: {\n                Statement: [\n                    {\n                        Action: \"sts:AssumeRoleWithWebIdentity\",\n                        Condition: {\n                            StringLike: {\n                                \"token.actions.githubusercontent.com:sub\":\n                                    \"repo:some-org/some-repo:*\",\n                            },\n                        },\n                        Principal: {\n                            Federated: {\n                                \"Fn::ImportValue\": Match.anyValue(),\n                            },\n                        },\n                        Effect: \"Allow\",\n                    },\n                ],\n                Version: \"2012-10-17\",\n            },\n            RoleName: \"some-name-github-oidc-role\",\n            Tags: [\n                {\n                    Key: \"construct-name\",\n                    Value: \"some-name\",\n                },\n                {\n                    Key: \"construct-type\",\n                    Value: \"GitHubOidcRole\",\n                },\n            ],\n        }),\n    );\n});\n"
  },
  {
    "path": "tools/ci-cdk/test/oidc-provider-stack.test.ts",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport { App } from \"aws-cdk-lib\";\nimport { Template } from \"aws-cdk-lib/assertions\";\nimport { OidcProviderStack } from \"../lib/oidc-provider-stack\";\n\ntest(\"it should have an OIDC provider\", () => {\n    const app = new App();\n    const stack = new OidcProviderStack(app, \"oidc-provider-stack\", {});\n    const template = Template.fromStack(stack);\n\n    // Verify the OIDC provider\n    template.hasResourceProperties(\"Custom::AWSCDKOpenIdConnectProvider\", {\n        ClientIDList: [\"sts.amazonaws.com\"],\n        Url: \"https://token.actions.githubusercontent.com\",\n    });\n});\n"
  },
  {
    "path": "tools/ci-cdk/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"target\": \"ES2018\",\n    \"module\": \"commonjs\",\n    \"lib\": [\n      \"es2018\"\n    ],\n    \"declaration\": true,\n    \"strict\": true,\n    \"noImplicitAny\": true,\n    \"strictNullChecks\": true,\n    \"noImplicitThis\": true,\n    \"alwaysStrict\": true,\n    \"noUnusedLocals\": false,\n    \"noUnusedParameters\": false,\n    \"noImplicitReturns\": true,\n    \"noFallthroughCasesInSwitch\": false,\n    \"inlineSourceMap\": true,\n    \"inlineSources\": true,\n    \"experimentalDecorators\": true,\n    \"strictPropertyInitialization\": false,\n    \"typeRoots\": [\n      \"./node_modules/@types\"\n    ],\n    \"outDir\": \"./build\"\n  },\n  \"exclude\": [\n    \"node_modules\",\n    \"cdk.out\",\n    \"build\"\n  ]\n}\n"
  },
  {
    "path": "tools/ci-resources/tls-stub/Cargo.toml",
    "content": "#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\n\n[package]\nname = \"stub\"\nversion = \"0.1.0\"\nedition = \"2021\"\npublish = false\n\n[dependencies]\naws-config = {path = \"../../../aws/sdk/build/aws-sdk/sdk/aws-config\", features = [\"client-hyper\"] }\naws-credential-types = { path = \"../../../aws/sdk/build/aws-sdk/sdk/aws-credential-types\", features = [\"hardcoded-credentials\"] }\naws-sdk-sts = { path = \"../../../aws/sdk/build/aws-sdk/sdk/sts\" }\naws-smithy-http-client = { path = \"../../../aws/sdk/build/aws-sdk/sdk/aws-smithy-http-client\", features = [\"rustls-aws-lc\"] }\nexitcode = \"1\"\ntokio = { version = \"1\", features = [\"full\"] }\nrustls = \"0.23.23\"\nrustls-pemfile = \"1\"\nx509-parser = \"0.17\"\n"
  },
  {
    "path": "tools/ci-resources/tls-stub/README.md",
    "content": "# TLS Stub\n\nThis package is used to verify the client's TLS configuration.\n\nIt is used in a CI test. See `ci-tls.yml`, \"Verify client TLS configuration\".\n\nThe stub loads a root certificate authority and uses it to connect to a supplied port on localhost.\n`trytls` reads the output on the console and uses the exit code of the stub to pass or fail a test case.\n"
  },
  {
    "path": "tools/ci-resources/tls-stub/src/main.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse std::fs::File;\nuse std::io::BufReader;\nuse std::time::Duration;\nuse std::{env, fs};\n\nuse aws_config::timeout::TimeoutConfig;\nuse aws_credential_types::Credentials;\nuse aws_sdk_sts::error::SdkError;\n\nuse aws_smithy_http_client::tls::{self, TlsContext, TrustStore};\nuse aws_smithy_http_client::Builder as HttpClientBuilder;\n\nuse rustls::pki_types::CertificateDer;\n#[cfg(debug_assertions)]\nuse x509_parser::prelude::*;\n\nconst OPERATION_TIMEOUT: u64 = 5;\n\nfn unsupported() {\n    println!(\"UNSUPPORTED\");\n    std::process::exit(exitcode::OK);\n}\n\nfn get_credentials() -> Credentials {\n    Credentials::from_keys(\n        \"AKIAIOSFODNN7EXAMPLE\",\n        \"wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY\",\n        None,\n    )\n}\n\n#[cfg(debug_assertions)]\nfn debug_cert(cert: &[u8]) {\n    let x509 = X509Certificate::from_der(cert).unwrap();\n    let subject = x509.1.subject();\n    let serial = x509.1.raw_serial_as_string();\n    println!(\"Adding root CA: {subject} ({serial})\");\n}\n\nfn add_cert_to_store(cert: &[u8], store: &mut rustls::RootCertStore) {\n    #[cfg(debug_assertions)]\n    debug_cert(cert);\n    let der = CertificateDer::from_slice(cert);\n    if let Err(e) = store.add(der) {\n        println!(\"Error adding root certificate: {e}\");\n        unsupported();\n    }\n}\n\nfn load_ca_bundle(filename: &String) -> TrustStore {\n    // test the certs are supported and fail quickly if not\n    match File::open(filename) {\n        Ok(f) => {\n            let mut f = BufReader::new(f);\n            let mut roots = rustls::RootCertStore::empty();\n            match rustls_pemfile::certs(&mut f) {\n                Ok(certs) => {\n                    for cert in certs {\n                        add_cert_to_store(&cert, &mut roots);\n                    }\n                }\n                Err(e) => {\n                    println!(\"Error reading PEM file: {e}\");\n                    unsupported();\n                }\n            }\n        }\n        Err(e) => {\n            println!(\"Error opening file '{filename}': {e}\");\n            unsupported();\n        }\n    }\n\n    let pem_bytes = fs::read(filename).expect(\"bundle exists\");\n    TrustStore::empty().with_pem_certificate(pem_bytes.as_slice())\n}\n\nfn load_native_certs() -> TrustStore {\n    // why do we need a custom trust store when invoked with native certs?\n    // Because the trytls tests don't actually only rely on native certs.\n    // It's native certs AND the one replaced in the blank pem cert below\n    // via the `update-certs` script.\n    let pem_ca_cert = b\"\\\n-----BEGIN CERTIFICATE-----\n-----END CERTIFICATE-----\\\n\" as &[u8];\n\n    TrustStore::default().with_pem_certificate(pem_ca_cert)\n}\n\nasync fn create_client(\n    trust_store: TrustStore,\n    host: &String,\n    port: &String,\n) -> aws_sdk_sts::Client {\n    let credentials = get_credentials();\n    let tls_context = TlsContext::builder()\n        .with_trust_store(trust_store)\n        .build()\n        .expect(\"valid TLS config\");\n    let http_client = HttpClientBuilder::new()\n        .tls_provider(tls::Provider::rustls(\n            tls::rustls_provider::CryptoMode::AwsLc,\n        ))\n        .tls_context(tls_context)\n        .build_https();\n    let sdk_config = aws_config::from_env()\n        .http_client(http_client)\n        .credentials_provider(credentials)\n        .region(\"us-nether-1\")\n        .endpoint_url(format!(\"https://{host}:{port}\"))\n        .timeout_config(\n            TimeoutConfig::builder()\n                .operation_timeout(Duration::from_secs(OPERATION_TIMEOUT))\n                .build(),\n        )\n        .load()\n        .await;\n    aws_sdk_sts::Client::new(&sdk_config)\n}\n\n#[tokio::main]\nasync fn main() -> Result<(), aws_sdk_sts::Error> {\n    let argv: Vec<String> = env::args().collect();\n    if argv.len() < 3 || argv.len() > 4 {\n        eprintln!(\"Syntax: {} <hostname> <port> [ca-file]\", argv[0]);\n        std::process::exit(exitcode::USAGE);\n    }\n    let trust_store = if argv.len() == 4 {\n        print!(\n            \"Connecting to https://{}:{} with root CA bundle from {}: \",\n            &argv[1], &argv[2], &argv[3]\n        );\n        load_ca_bundle(&argv[3])\n    } else {\n        print!(\n            \"Connecting to https://{}:{} with native roots: \",\n            &argv[1], &argv[2]\n        );\n        load_native_certs()\n    };\n\n    let sts_client = create_client(trust_store, &argv[1], &argv[2]).await;\n    match sts_client.get_caller_identity().send().await {\n        Ok(_) => println!(\"\\nACCEPT\"),\n        Err(SdkError::DispatchFailure(e)) => println!(\"{e:?}\\nREJECT\"),\n        Err(SdkError::ServiceError(e)) => println!(\"{e:?}\\nACCEPT\"),\n        Err(e) => {\n            println!(\"Unexpected error: {e:#?}\");\n            std::process::exit(exitcode::SOFTWARE);\n        }\n    }\n    Ok(())\n}\n"
  },
  {
    "path": "tools/ci-scripts/additional-per-crate-checks.sh",
    "content": "#!/bin/bash\n#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\n\nset -e\n\n# TTY colors\nC_CYAN='\\033[1;36m'\nC_YELLOW='\\033[1;33m'\nC_RESET='\\033[0m'\n\nif [[ $# -lt 1 ]]; then\n    echo \"Usage: $0 [crate workspace path(s)...]\"\n    echo \"Recursively visits 'additional-ci' scripts in the given directories and executes them.\"\n    exit 1\nfi\n\nfor area in \"$@\"; do\n    pushd \"${area}\" &>/dev/null\n    echo -e \"${C_CYAN}Scanning '${area}'...${C_RESET}\"\n\n    find . -name 'additional-ci' -print0 | while read -d $'\\0' file; do\n        echo\n        echo -e \"${C_YELLOW}Running additional checks script '${file}'...${C_RESET}\"\n        echo\n        pushd \"$(dirname ${file})\" &>/dev/null\n        ./additional-ci\n        popd &>/dev/null\n    done\n\n    echo\n    popd &>/dev/null\ndone\n"
  },
  {
    "path": "tools/ci-scripts/cargo-update-lockfiles",
    "content": "#!/bin/bash\n#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\n\nset -eux\n\nif [ \"$#\" -ne 3 ]; then\n    echo \"Usage: $0 <base-branch> <branch-name-for-updating-lockfiles> <whether forcing update on broken dependencies (true/false)>\"\n    exit 1\nfi\n\nbase_branch=$1\nbranch_name_for_updating_lockfiles=$2\nforce_update_on_broken_dependencies=$3\n\nSMITHY_RS_DIR=\"$(pwd)/smithy-rs\"\n\npushd \"${SMITHY_RS_DIR}\"\n\ngit config --local user.name \"AWS SDK Rust Bot\"\ngit config --local user.email \"aws-sdk-rust-primary@amazon.com\"\n\ngit fetch --unshallow\ngit checkout \"${base_branch}\"\ngit checkout -b \"${branch_name_for_updating_lockfiles}\"\n\nif [[ \"${force_update_on_broken_dependencies}\" == \"true\" ]]\nthen\n  ./gradlew -Paws.sdk.force.update.broken.dependencies aws:sdk:cargoUpdateAllLockfiles\nelse\n  ./gradlew aws:sdk:cargoUpdateAllLockfiles\nfi\n\ngit add aws/rust-runtime/Cargo.lock \\\n    aws/rust-runtime/aws-config/Cargo.lock \\\n    aws/sdk/Cargo.lock \\\n    rust-runtime/Cargo.lock\n\ngit diff --staged --quiet || \\\n    git commit \\\n        -m \"Run cargo update on the runtime lockfiles and the SDK lockfile\"\n\ngit push origin HEAD\n\npopd\n"
  },
  {
    "path": "tools/ci-scripts/check-aws-config",
    "content": "#!/bin/bash\n#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\n\nC_YELLOW='\\033[1;33m'\nC_RESET='\\033[0m'\n\nset -eux\ncd smithy-rs\n\n# Make aws-config (which depends on generated services) available to additional checks\nmkdir -p aws/sdk/build\nmv ../aws-sdk-smoketest aws/sdk/build/aws-sdk\n\necho -e \"${C_YELLOW}# Testing aws-config...${C_RESET}\"\npushd \"aws/rust-runtime/aws-config\" &>/dev/null\n\necho \"${C_YELLOW}## Running 'cargo clippy'${C_RESET}\"\ncargo clippy --all-features\n\necho \"${C_YELLOW}## Running 'cargo test'${C_RESET}\"\ncargo test --all-features\n\necho \"${C_YELLOW}## Running 'cargo doc'${C_RESET}\"\ncargo doc --no-deps --document-private-items --all-features\n\necho \"${C_YELLOW}## Running 'cargo minimal-versions check'${C_RESET}\"\ncargo +\"${RUST_NIGHTLY_VERSION}\" minimal-versions check --all-features\n\necho \"${C_YELLOW}## Checking for external types in public API${C_RESET}\"\ncargo \"+${RUST_NIGHTLY_VERSION:-nightly}\" check-external-types --all-features --config external-types.toml\n\necho \"${C_YELLOW}## Checking for duplicate dependency versions in the normal dependency graph with all features enabled${C_RESET}\"\ncargo tree -d --edges normal --all-features\n\n# the crate has `allow-compilation` which needs to be deprecated\n\necho \"${C_YELLOW}## Checking every combination of features${C_RESET}\"\ncargo hack check --feature-powerset --exclude-all-features --exclude-features allow-compilation\n\necho \"${C_YELLOW}## Testing each feature in isolation${C_RESET}\"\n# these features are missed by the following check because they are grouped\ncargo hack test --each-feature --include-features rt-tokio,client-hyper,rustls,default-https-client --exclude-no-default-features\n\n# This check will check other individual features and no-default-features\n# grouping these features because they don't interact\ncargo hack test --feature-powerset --exclude-all-features --exclude-features allow-compilation --group-features rt-tokio,client-hyper,rustls,default-https-client\n\necho \"${C_YELLOW}## Checking the wasm32-unknown-unknown and wasm32-wasip2 targets${C_RESET}\"\ncargo check --target wasm32-unknown-unknown --no-default-features\ncargo check --target wasm32-wasip2 --no-default-features\n\n# TODO(https://github.com/smithy-lang/smithy-rs/issues/2499): Uncomment the following once aws-config tests compile for WASM\n# echo \"${C_YELLOW}## Testing the wasm32-unknown-unknown and wasm32-wasip1 targets${C_RESET}\"\n# wasm-pack test --node -- --no-default-features\n# cargo test --target wasm32-wasip1 --no-default-features\n\npopd &>/dev/null\n"
  },
  {
    "path": "tools/ci-scripts/check-aws-sdk-adhoc-tests",
    "content": "#!/bin/bash\n#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\n\nC_YELLOW='\\033[1;33m'\nC_RESET='\\033[0m'\n\nset -eu\ncd smithy-rs\n\necho -e \"## ${C_YELLOW}Running SDK adhoc tests...${C_RESET}\"\n./gradlew aws:sdk-adhoc-test:clean\n./gradlew aws:sdk-adhoc-test:check\n"
  },
  {
    "path": "tools/ci-scripts/check-aws-sdk-benchmarks",
    "content": "#!/bin/bash\n#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\n\nC_YELLOW='\\033[1;33m'\nC_RESET='\\033[0m'\n\nset -eux\ncd smithy-rs\n\n./gradlew :aws:sdk:assemble\n\n# Build all benchmark directories\npushd aws/sdk/benchmarks\nfor dir in */; do\n    if [ -f \"$dir/Cargo.toml\" ]; then\n        echo -e \"${C_YELLOW}# Building benchmark $dir...${C_RESET}\"\n        pushd \"$dir\"\n        cargo build\n        popd\n    fi\ndone\npopd\n"
  },
  {
    "path": "tools/ci-scripts/check-aws-sdk-canary",
    "content": "#!/bin/bash\n#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\n\nC_YELLOW='\\033[1;33m'\nC_RESET='\\033[0m'\n\nset -eux\ncd smithy-rs\n\n# Make aws-config (which depends on generated services) available to additional checks\nmkdir -p aws/sdk/build\nmv ../aws-sdk-smoketest aws/sdk/build/aws-sdk\nSDK_PATH=\"$(git rev-parse --show-toplevel)\"/aws/sdk/build/aws-sdk/sdk\n\npushd tools/ci-cdk/canary-lambda\n\n# The canary-lambda doesn't have a Cargo.toml in a fresh checkout of smithy-rs, so generate one before checks\npushd ../canary-runner\necho \"${C_YELLOW}## Generating Cargo.toml for the canary-lambda...${C_RESET}\"\ncargo run -- build-bundle --manifest-only --canary-path ../canary-lambda --sdk-path \"${SDK_PATH}\" --musl\npopd\n\n# Note: This only checks the `latest` canary, and not any previous version features\necho \"${C_YELLOW}## Running 'cargo clippy' for the canary-lambda...${C_RESET}\"\ncargo clippy\n\npopd\n"
  },
  {
    "path": "tools/ci-scripts/check-aws-sdk-cargo-deny",
    "content": "#!/bin/bash\n#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\n\nset -eux\ncd aws-sdk\n\n# Remove examples from workspace since they don't have license metadata\nsed -i '/\"examples\\//d' Cargo.toml\n\ncargo deny --version\ncargo deny --all-features check \\\n  --hide-inclusion-graph \\\n  --config ../smithy-rs/.cargo-deny-config.toml \\\n  licenses bans sources\n"
  },
  {
    "path": "tools/ci-scripts/check-aws-sdk-services",
    "content": "#!/bin/bash\n#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\n\nC_YELLOW='\\033[1;33m'\nC_RESET='\\033[0m'\n\nset -eux\ncd aws-sdk\n\nENABLE_SMOKETESTS=\"${ENABLE_SMOKETESTS:-false}\"\n\n# Check if the $ENABLE_SMOKETESTS environment variable is set\nif [ \"$ENABLE_SMOKETESTS\" = \"true\" ]; then\n    # Invoking `cargo test` at the root directory implicitly checks for the validity\n    # of the top-level `Cargo.toml`\n    echo \"${C_YELLOW}## Running smoketests...${C_RESET}\"\n    RUSTFLAGS=\"--cfg smoketests\" cargo test --all-features\nelse\n    cargo test --all-features\nfi\n\n# TODO reenable these tests when they have lockfiles\n# for test_dir in tests/*; do\n#     if [ -f \"${test_dir}/Cargo.toml\" ]; then\n#         echo \"#### Testing ${test_dir}...\"\n#         cargo test --all-features --manifest-path \"${test_dir}/Cargo.toml\"\n#     fi\n# done\n"
  },
  {
    "path": "tools/ci-scripts/check-aws-sdk-smoketest-docs-clippy-udeps",
    "content": "#!/bin/bash\n#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\n\nset -eux\n\n# Docs, clippy, etc on the smoketest itself\npushd aws-sdk-smoketest &>/dev/null\n\n# Override \"fail on warning\" for smoke test docs since DynamoDB's modeled docs cause rustdoc warnings\nRUSTDOCFLAGS=\"--cfg docsrs\" cargo +\"${RUST_NIGHTLY_VERSION}\" doc --no-deps --document-private-items --all-features\n\ncargo clippy --all-features\n# running `cargo hack` runs this in the prod workspace and ensures that each crate is run individually\ncargo +\"${RUST_NIGHTLY_VERSION}\" hack udeps --all-features\npopd &>/dev/null\n\n# Move the smoketest artifacts into smithy-rs and check the integration tests\n# (which use path dependencies into the generated artifacts) against them.\nmkdir -p smithy-rs/aws/sdk/build\nmv aws-sdk-smoketest smithy-rs/aws/sdk/build/aws-sdk\npushd smithy-rs/aws/sdk/integration-tests\ncargo check\npopd &>/dev/null\n\npushd smithy-rs/aws/sdk/build/aws-sdk/sdk &>/dev/null\nfor crate_path in $(ls | grep -v \"aws-\"); do\n    if [[ -d \"${crate_path}\" ]]; then\n        pushd \"${crate_path}\" &>/dev/null\n        # Override \"fail on warning\" for smoke test docs since DynamoDB's modeled docs cause rustdoc warnings,\n        # and `cargo-check-external-types` relies on rustdoc JSON output.\n        RUSTDOCFLAGS=\"\" cargo +\"${RUST_NIGHTLY_VERSION}\" check-external-types --all-features --config ../../../../sdk-external-types.toml\n        popd &>/dev/null\n    fi\ndone\npopd &>/dev/null\n"
  },
  {
    "path": "tools/ci-scripts/check-aws-sdk-smoketest-unit-tests",
    "content": "#!/bin/bash\n#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\n\nset -eux\ncd aws-sdk-smoketest\ncargo test --all-features\n\nfor test_dir in tests/*; do\n    if [ -f \"${test_dir}/Cargo.toml\" ]; then\n        echo \"#### Testing ${test_dir}...\"\n        cargo test --all-features --manifest-path \"${test_dir}/Cargo.toml\"\n    fi\ndone\n"
  },
  {
    "path": "tools/ci-scripts/check-aws-sdk-standalone-integration-tests",
    "content": "#!/bin/bash\n#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\n\n# Local development of the SDK integration tests is far easier from the aws/sdk/integration-tests\n# directory, but the hand-written Cargo.toml files there can get out of sync with the generated\n# SDK Cargo.toml files, which causes them to not compile in local development. This script verifies\n# that they continue to compile for local dev.\n\nset -eux\n\n# Make sure all integration tests are included in the workspace\npushd smithy-rs/aws/sdk/integration-tests\nset +x\nfor test_path in *; do\n    if [[ -d \"${test_path}\" ]]; then\n        grep -q \"\\\"${test_path}\\\"\" Cargo.toml || (echo \"ERROR: '${test_path}' missing from '$(pwd)/Cargo.toml' workspace\" && exit 1)\n    fi\ndone\nset -x\npopd\n\n# The integration tests use path dependencies that expect the smoke test SDK to be in the smithy-rs\n# build artifacts. In CI, the smoke test SDK is extracted into the same top-level directory as the\n# smithy-rs repo, so the following creates a temp directory to replicate the expectations of the\n# Cargo.toml files.\ntmp_dir=$(mktemp -d -t smithy-rs-ci-XXXXXXXX)\nfunction remove_tmp_dir {\n    rm -rf \"${tmp_dir}\"\n}\ntrap remove_tmp_dir EXIT\n\nmkdir -p \"${tmp_dir}/aws/sdk/build\"\ncp -r smithy-rs/aws/sdk/integration-tests \"${tmp_dir}/aws/sdk/\"\ncp -r aws-sdk-smoketest \"${tmp_dir}/aws/sdk/build/aws-sdk\"\nfind \"${tmp_dir}\"\n\npushd \"${tmp_dir}/aws/sdk/integration-tests\"\ncargo check --tests --all-features\n\n# Running WebAssembly (WASI) specific integration tests\n# Note that the --release here is required since debug builds can create binaries with too many symbols\n# for wasmtime to run.\npushd \"${tmp_dir}/aws/sdk/integration-tests/webassembly-no-os\" &>/dev/null\nRUSTFLAGS='--cfg getrandom_backend=\"wasm_js\"' cargo test --target wasm32-unknown-unknown --release\ncargo test --target wasm32-wasip2 --release\npopd\n\npushd \"${tmp_dir}/aws/sdk/integration-tests/webassembly-wstd\" &>/dev/null\ncargo test --target wasm32-wasip2 --release\npopd\n\npopd\n"
  },
  {
    "path": "tools/ci-scripts/check-book",
    "content": "#!/bin/bash\n#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\n\nset -eux\n\ncd smithy-rs/examples\nmake\ncargo b\n\ncd ..\nmdbook test design -L target/debug/deps\n"
  },
  {
    "path": "tools/ci-scripts/check-client-codegen-integration-tests",
    "content": "#!/bin/bash\n#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\n\nset -eux\ncd smithy-rs\n\n./gradlew codegen-client-test:test\n"
  },
  {
    "path": "tools/ci-scripts/check-client-codegen-unit-tests",
    "content": "#!/bin/bash\n#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\n\nset -eux\ncd smithy-rs\n./gradlew codegen-client:test\n"
  },
  {
    "path": "tools/ci-scripts/check-codegen-version",
    "content": "#!/bin/bash\n#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\n\nset -eux\ncd smithy-rs\n# GH actions generally does a shallow checkout, we need to fetch the base ref for diffing to work\nBASE_REF=\"${GITHUB_BASE_REF:=main}\"\necho \"fetching base ref $BASE_REF from origin\"\ngit fetch --no-tags --progress --no-recurse-submodules --depth=1 origin $BASE_REF\n./gradlew verifyCodegenVersionBump\n"
  },
  {
    "path": "tools/ci-scripts/check-core-codegen-unit-tests",
    "content": "#!/bin/bash\n#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\n\nset -eux\ncd smithy-rs\n./gradlew codegen-core:test\n"
  },
  {
    "path": "tools/ci-scripts/check-deterministic-codegen",
    "content": "#!/bin/bash\n#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\n\nset -eux\ncd smithy-rs\n\nif [[ $# -ne 0 ]]; then\n    echo \"Usage: check-deterministic-codegen\"\n    exit 1\nfi\n\n# Override version commit hash to prevent unnecessary diffs\nexport SMITHY_RS_VERSION_COMMIT_HASH_OVERRIDE=ci\n./tools/ci-scripts/codegen-diff/check-deterministic-codegen.py .\n"
  },
  {
    "path": "tools/ci-scripts/check-fuzzgen",
    "content": "#!/bin/bash\n#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\n\nset -eux\ncd smithy-rs\n\n./gradlew fuzzgen:test\n"
  },
  {
    "path": "tools/ci-scripts/check-only-aws-sdk-services",
    "content": "#!/bin/bash\n#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\n\n# this job runs `cargo check` only instead of `cargo test --all-features`\n\nset -eux\ncd aws-sdk\n\n# Remove examples from workspace\nsed -i '/\"examples\\//d' Cargo.toml\n\ncargo check --all-targets --all-features\n\nfor test_dir in tests/*; do\n    if [ -f \"${test_dir}/Cargo.toml\" ]; then\n        echo \"#### Checking ${test_dir}...\"\n        cargo check --all-targets --all-features --manifest-path \"${test_dir}/Cargo.toml\"\n    fi\ndone\n\nlarge_file_count=\"$(find sdk -iname '*.rs' -type f -size +1M | wc -l | bc)\"\nif [[ \"${large_file_count}\" != \"0\" ]]; then\n    echo \"Found ${large_file_count} generated code files larger than 1 MB:\"\n    find sdk -iname '*.rs' -type f -size +1M\n    exit 1\nfi\n"
  },
  {
    "path": "tools/ci-scripts/check-rust-runtimes",
    "content": "#!/bin/bash\n#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\n\n\nC_RED='\\033[1;31m'\nC_YELLOW='\\033[1;33m'\nC_RESET='\\033[0m'\n\nset -eux\n\n: \"$RUST_NIGHTLY_VERSION\"\n\ncd smithy-rs\n\necho -e \"# ${C_YELLOW}Auditing runtime crate version numbers...${C_RESET}\"\nruntime-versioner audit --no-fetch\n\n# Compute MSRV from channel, ignoring patch version\nMAIN_MSRV=$(sed -rn 's/channel = \"(1[.][0-9]+)([.][0-9]+)?\"/\\1/p' rust-toolchain.toml)\n\nif [ -z \"$MAIN_MSRV\" ]; then\n    echo -e \"# ${C_RED}Unable to detect MSRV in rust-toolchain.toml${C_RESET}\"\n    exit 1\nelse\n    echo -e \"# ${C_YELLOW}MSRV is ${MAIN_MSRV}${C_RESET}\"\nfi\n\n# Array to collect MSRV mismatches\nmsrv_mismatches=()\n\nfor runtime_path in \\\n    \"rust-runtime\" \\\n    \"aws/rust-runtime\"\ndo\n    echo -e \"# ${C_YELLOW}Testing ${runtime_path}...${C_RESET}\"\n    pushd \"${runtime_path}\" &>/dev/null\n\n    echo -e \"## ${C_YELLOW}Running 'cargo clippy' on ${runtime_path}...${C_RESET}\"\n    cargo clippy --all-features\n\n    echo -e \"## ${C_YELLOW}Running 'cargo test' on ${runtime_path}...${C_RESET}\"\n    cargo test --all-features\n\n    echo -e \"## ${C_YELLOW}Running 'cargo doc' on ${runtime_path}...${C_RESET}\"\n\n    RUSTDOCFLAGS=\"--cfg docsrs -Dwarnings\" cargo +\"${RUST_NIGHTLY_VERSION}\" doc --no-deps --document-private-items --all-features\n\n    echo -e \"## ${C_YELLOW}Running 'cargo minimal-versions check' on ${runtime_path}...${C_RESET}\"\n    # Print out the cargo tree with minimal versions for easier debugging\n    cargo +\"${RUST_NIGHTLY_VERSION}\" minimal-versions tree --direct || echo \"cargo minimal-versions tree failed\"\n    # The `--direct` flag is used to test only direct dependencies, rather than all transitive dependencies. See:\n    # https://doc.rust-lang.org/cargo/reference/unstable.html#direct-minimal-versions\n    cargo +\"${RUST_NIGHTLY_VERSION}\" minimal-versions check --direct --all-features\n\n    for crate_path in *; do\n        if [[ -f \"${crate_path}/Cargo.toml\" ]]; then\n        #s\n            # verify that the MSRV is the main MSRV\n            package_msrv=$(sed -rn 's/rust-version = \"(1[.][0-9]+)([.][0-9]+)?\"/\\1/p' \"${crate_path}/Cargo.toml\")\n            if [[ \"${package_msrv}\" != \"${MAIN_MSRV}\" ]]; then\n                msrv_mismatches+=(\"${runtime_path}/${crate_path}: toolchain MSRV is ${MAIN_MSRV}, crate MSRV is ${package_msrv}\")\n            fi\n        fi\n        if [[ -f \"${crate_path}/external-types.toml\" ]]; then\n            # Skip `aws-config` since it has its own checks in `check-aws-config`\n            if [[ \"${crate_path}\" != \"aws-config\" ]]; then\n                echo -e \"## ${C_YELLOW}Running 'cargo check-external-types' on ${crate_path}...${C_RESET}\"\n                pushd \"${crate_path}\" &>/dev/null\n                # Override \"fail on warning\" for docs since `cargo-check-external-types` relies on rustdoc JSON output.\n                RUSTDOCFLAGS=\"\" cargo +\"${RUST_NIGHTLY_VERSION}\" check-external-types --all-features --config external-types.toml\n                popd &>/dev/null\n            fi\n        fi\n    done\n\n    popd &>/dev/null\n\n    echo -e \"${C_YELLOW}Running additional per-crate checks for ${runtime_path}...${C_RESET}\"\n    ./tools/ci-scripts/additional-per-crate-checks.sh \"${runtime_path}\"\ndone\n\n# Report MSRV mismatches if any were found\nif [ ${#msrv_mismatches[@]} -ne 0 ]; then\n    echo -e \"# ${C_RED}MSRV mismatches found:${C_RESET}\"\n    for mismatch in \"${msrv_mismatches[@]}\"; do\n        echo -e \"## ${C_RED}${mismatch}${C_RESET}\"\n    done\n    exit 1\nfi\n"
  },
  {
    "path": "tools/ci-scripts/check-sdk-codegen-unit-tests",
    "content": "#!/bin/bash\n#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\n\nset -eux\ncd smithy-rs\n./gradlew aws:codegen-aws-sdk:test\n"
  },
  {
    "path": "tools/ci-scripts/check-semver",
    "content": "#!/bin/bash\n#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\n\nset -eux\ncd smithy-rs\n\nif [[ $# -gt 2 ]]; then\n    echo \"Usage: check-semver <base-revision> <warn-on-failure (true/false)>\"\n    exit 1\nfi\n\n# Override version commit hash to prevent unnecessary diffs\nexport SMITHY_RS_VERSION_COMMIT_HASH_OVERRIDE=ci\nbase_revision=\"$1\"\nwarn_on_failure=\"$2\"\nif [[ $warn_on_failure == \"true\" ]]\nthen\n  ./tools/ci-scripts/codegen-diff/semver-checks.py . \"${base_revision}\" || echo \"allowing failure\"\nelse\n  ./tools/ci-scripts/codegen-diff/semver-checks.py . \"${base_revision}\"\nfi\n"
  },
  {
    "path": "tools/ci-scripts/check-semver-hazards",
    "content": "#!/bin/bash\n#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\n\n# This script patches the new runtime crates into an old AWS SDK and runs tests\n# to check for semver hazards, such as a `Storable` being in an unstable runtime crate.\n\nC_YELLOW='\\033[1;33m'\nC_RESET='\\033[0m'\n\nif [ \"$#\" -ne 0 ]; then\n  echo \"Unexpected arguments ignored\"\nfi\n\n# Need to allow warnings since there may be deprecations that the old SDK uses\nunset RUSTFLAGS\nexport RUST_BACKTRACE=1\n\nset -eux\n\necho -e \"${C_YELLOW}# Patching SDK...${C_RESET}\"\nruntime-versioner patch-runtime \\\n  --sdk-path \"$(pwd)/aws-sdk-rust\" \\\n  --smithy-rs-path \"$(pwd)/smithy-rs\"\n\necho -e \"${C_YELLOW}# Copying the SDK lockfile to aws-sdk-rust...${C_RESET}\"\ncp \"$(pwd)/smithy-rs/aws/sdk/Cargo.lock\" \"$(pwd)/aws-sdk-rust/\"\n\necho -e \"${C_YELLOW}# Testing SDK...${C_RESET}\"\nfor sdk in aws-sdk-rust/sdk/*; do\n  # Run this check only against SDKs, excluding runtime crates\n  if [[ ! \"$(basename \"$sdk\")\" =~ ^(aws-|aws-smithy-) ]]; then\n    if ls \"$sdk/tests\" | grep -v '^endpoint_tests\\.rs$'; then\n      echo -e \"${C_YELLOW}# Testing ${sdk}...${C_RESET}\"\n      pushd \"$sdk\" &>/dev/null\n      cargo test --all-features\n      popd &>/dev/null\n    fi\n fi\ndone\n"
  },
  {
    "path": "tools/ci-scripts/check-serde-codegen-unit-tests",
    "content": "#!/bin/bash\n#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\n\nset -eux\ncd smithy-rs\n./gradlew codegen-serde:test\n"
  },
  {
    "path": "tools/ci-scripts/check-server-codegen-integration-tests",
    "content": "#!/bin/bash\n#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\n\nset -eux\ncd smithy-rs\n./gradlew codegen-server-test:test\n"
  },
  {
    "path": "tools/ci-scripts/check-server-codegen-integration-tests-python",
    "content": "#!/bin/bash\n#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\n\nset -eux\ncd smithy-rs\n./gradlew codegen-server-test:codegen-server-test-python:test\n"
  },
  {
    "path": "tools/ci-scripts/check-server-codegen-unit-tests",
    "content": "#!/bin/bash\n#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\n\nset -eux\ncd smithy-rs\n./gradlew codegen-server:test\n"
  },
  {
    "path": "tools/ci-scripts/check-server-codegen-unit-tests-python",
    "content": "#!/bin/bash\n#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\n\nset -eux\ncd smithy-rs\n./gradlew codegen-server:codegen-server-python:test\n"
  },
  {
    "path": "tools/ci-scripts/check-server-e2e-test",
    "content": "#!/bin/bash\n#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n\nset -eux\ncd smithy-rs/examples\n\nmake test clippy\n"
  },
  {
    "path": "tools/ci-scripts/check-server-python-e2e-test",
    "content": "#!/bin/bash\n#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n\nset -eux\ncd smithy-rs/examples/python\n\nmake test clippy\n"
  },
  {
    "path": "tools/ci-scripts/check-style-and-lints",
    "content": "#!/bin/bash\n#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\n\nset -eux\ncd smithy-rs\n\nsdk-lints check --all\nsdk-lints fix --all\n\n# shellcheck disable=SC2046\nrustfmt --check --edition 2021 $(find . -name '*.rs' -print | grep -v /target/)\n\n./gradlew -p buildSrc test\n./gradlew ktlint\n"
  },
  {
    "path": "tools/ci-scripts/check-tools",
    "content": "#!/bin/bash\n#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\n\nC_YELLOW='\\033[1;33m'\nC_RESET='\\033[0m'\n\nset -eux\ncd smithy-rs\n\n# test_tool tool_path rust_version\nfunction test_tool {\n    local tool_path=\"$1\"\n    local rust_version=\"$2\"\n\n    echo -e \"${C_YELLOW}Testing ${tool_path}...${C_RESET}\"\n    pushd \"${tool_path}\" &>/dev/null\n    cargo +\"${rust_version}\" clippy --all-features\n    cargo +\"${rust_version}\" test --all-features\n    popd &>/dev/null\n}\n\ntest_tool \"tools/ci-build/changelogger\" \"${RUST_STABLE_VERSION}\"\ntest_tool \"tools/ci-build/crate-hasher\" \"${RUST_STABLE_VERSION}\"\ntest_tool \"tools/ci-build/difftags\" \"${RUST_STABLE_VERSION}\"\ntest_tool \"tools/ci-build/publisher\" \"${RUST_STABLE_VERSION}\"\ntest_tool \"tools/ci-build/runtime-versioner\" \"${RUST_STABLE_VERSION}\"\ntest_tool \"tools/ci-build/sdk-lints\" \"${RUST_STABLE_VERSION}\"\ntest_tool \"tools/ci-build/sdk-versioner\" \"${RUST_STABLE_VERSION}\"\ntest_tool \"tools/ci-build/smithy-rs-tool-common\" \"${RUST_STABLE_VERSION}\"\ntest_tool \"tools/ci-cdk/canary-runner\" \"${RUST_STABLE_VERSION}\"\n\necho -e \"${C_YELLOW}Running additional per-crate checks...${C_RESET}\"\n./tools/ci-scripts/additional-per-crate-checks.sh ./tools/\n"
  },
  {
    "path": "tools/ci-scripts/codegen-diff/__init__.py",
    "content": "#  Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n#  SPDX-License-Identifier: Apache-2.0\n"
  },
  {
    "path": "tools/ci-scripts/codegen-diff/check-deterministic-codegen.py",
    "content": "#!/usr/bin/env python3\n\n#  Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n#  SPDX-License-Identifier: Apache-2.0\n\nimport os\nimport sys\n\nfrom diff_lib import get_cmd_output, checkout_commit_and_generate\n\n\ndef main():\n    repository_root = sys.argv[1]\n    os.chdir(repository_root)\n    (_, head_commit_sha, _) = get_cmd_output(\"git rev-parse HEAD\")\n    checkout_commit_and_generate(head_commit_sha, targets=['aws:sdk'], branch_name='once')\n    checkout_commit_and_generate(head_commit_sha, targets=['aws:sdk'], branch_name='twice')\n    get_cmd_output('git diff once..twice --exit-code')\n\n\nif __name__ == \"__main__\":\n    main()\n"
  },
  {
    "path": "tools/ci-scripts/codegen-diff/codegen-diff-revisions.py",
    "content": "#!/usr/bin/env python3\n\n#  Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n#  SPDX-License-Identifier: Apache-2.0\n\nimport os\nimport sys\n\nfrom diff_lib import eprint, run, get_cmd_status, get_cmd_output, generate_and_commit_generated_code, make_diffs, \\\n    write_to_file, HEAD_BRANCH_NAME, BASE_BRANCH_NAME, OUTPUT_PATH, running_in_docker_build\n\n\n# This script can be run and tested locally. To do so, you should check out\n# a second smithy-rs repository so that you can work on the script and still\n# run it without it immediately bailing for an unclean working tree.\n#\n# Example:\n# `smithy-rs/` - the main repo you're working out of\n# `test/smithy-rs/` - the repo you're testing against\n#\n# ```\n# $ cd test/smithy-rs\n# $ ../../smithy-rs/tools/ci-scripts/codegen-diff/codegen-diff-revisions.py . <some commit hash to diff against>\n# ```\n#\n# It will diff the generated code from HEAD against any commit hash you feed it. If you want to test\n# a specific range, change the HEAD of the test repository.\n#\n# This script requires `difftags` to be installed from `tools/ci-build/difftags`:\n# ```\n# $ cargo install --path tools/ci-build/difftags\n# ```\n# Make sure the local version matches the version referenced from the GitHub Actions workflow.\n\n\n\ndef main():\n    if len(sys.argv) != 3:\n        eprint(\"Usage: codegen-diff-revisions.py <repository root> <base commit sha>\")\n        sys.exit(1)\n\n    repository_root = sys.argv[1]\n    base_commit_sha = sys.argv[2]\n    os.chdir(repository_root)\n    (_, head_commit_sha, _) = get_cmd_output(\"git rev-parse HEAD\")\n\n    # Make sure the working tree is clean\n    if get_cmd_status(\"git diff --quiet\") != 0:\n        eprint(\"working tree is not clean. aborting\")\n        sys.exit(1)\n\n    if running_in_docker_build():\n        eprint(f\"Fetching base revision {base_commit_sha} from GitHub...\")\n        run(f\"git fetch --no-tags --progress --no-recurse-submodules --depth=1 origin {base_commit_sha}\")\n\n    # Generate code for HEAD\n    eprint(f\"Creating temporary branch with generated code for the HEAD revision {head_commit_sha}\")\n    run(f\"git checkout {head_commit_sha} -b {HEAD_BRANCH_NAME}\")\n    generate_and_commit_generated_code(head_commit_sha)\n\n    # Generate code for base\n    eprint(f\"Creating temporary branch with generated code for the base revision {base_commit_sha}\")\n    run(f\"git checkout {base_commit_sha} -b {BASE_BRANCH_NAME}\")\n    generate_and_commit_generated_code(base_commit_sha)\n\n    bot_message = make_diffs(base_commit_sha, head_commit_sha)\n    write_to_file(f\"{OUTPUT_PATH}/bot-message\", bot_message)\n\n    # Clean-up that's only really useful when testing the script in local-dev\n    if not running_in_docker_build():\n        run(\"git checkout main\")\n        run(f\"git branch -D {BASE_BRANCH_NAME}\")\n        run(f\"git branch -D {HEAD_BRANCH_NAME}\")\n\n\nif __name__ == \"__main__\":\n    main()\n"
  },
  {
    "path": "tools/ci-scripts/codegen-diff/diff_lib.py",
    "content": "#  Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n#  SPDX-License-Identifier: Apache-2.0\n\nimport os\nimport shlex\nimport subprocess\nimport sys\n\nHEAD_BRANCH_NAME = \"__tmp-localonly-head\"\nBASE_BRANCH_NAME = \"__tmp-localonly-base\"\nOUTPUT_PATH = \"tmp-codegen-diff\"\n\nCOMMIT_AUTHOR_NAME = \"GitHub Action (generated code preview)\"\nCOMMIT_AUTHOR_EMAIL = \"generated-code-action@github.com\"\n\nCDN_URL = \"https://d2luzm2xt3nokh.cloudfront.net\"\n\ntarget_codegen_client = 'codegen-client-test'\ntarget_codegen_server = 'codegen-server-test'\ntarget_codegen_server_python = 'codegen-server-test:codegen-server-test-python'\ntarget_codegen_server_typescript = 'codegen-server-test:codegen-server-test-typescript'\ntarget_aws_sdk = 'aws:sdk'\n\n\ndef running_in_docker_build():\n    return os.environ.get(\"SMITHY_RS_DOCKER_BUILD_IMAGE\") == \"1\"\n\n\ndef run_git_commit_as_github_action(revision_sha):\n    get_cmd_output(f\"git -c 'user.name=GitHub Action (generated code preview)' \"\n                   f\"-c 'user.name={COMMIT_AUTHOR_NAME}' \"\n                   f\"-c 'user.email={COMMIT_AUTHOR_EMAIL}' \"\n                   f\"commit --no-verify -m 'Generated code for {revision_sha}' --allow-empty\")\n\n\ndef checkout_commit_and_generate(revision_sha, branch_name, targets=None):\n    if running_in_docker_build():\n        eprint(f\"Fetching base revision {revision_sha} from GitHub...\")\n        run(f\"git fetch --no-tags --progress --no-recurse-submodules --depth=1 origin {revision_sha}\")\n\n    # Generate code for HEAD\n    eprint(f\"Creating temporary branch {branch_name} with generated code for {revision_sha}\")\n    run(f\"git checkout {revision_sha} -B {branch_name}\")\n    generate_and_commit_generated_code(revision_sha, targets)\n\n\ndef generate_and_commit_generated_code(revision_sha, targets=None):\n    targets = targets or [\n        target_codegen_client,\n        target_codegen_server,\n        target_aws_sdk,\n        target_codegen_server_python,\n        target_codegen_server_typescript\n    ]\n    # Clean the build artifacts before continuing\n    assemble_tasks = ' '.join([f'{t}:assemble' for t in targets])\n    clean_tasks = ' '.join([f'{t}:clean' for t in targets])\n    get_cmd_output(\"rm -rf aws/sdk/build\")\n    get_cmd_output(f\"./gradlew --rerun-tasks {clean_tasks}\")\n    get_cmd_output(f\"./gradlew --rerun-tasks {assemble_tasks}\")\n\n    # Move generated code into codegen-diff/ directory\n    get_cmd_output(f\"rm -rf {OUTPUT_PATH}\")\n    get_cmd_output(f\"mkdir {OUTPUT_PATH}\")\n    if target_aws_sdk in targets:\n        get_cmd_output(f\"mv aws/sdk/build/aws-sdk {OUTPUT_PATH}/\")\n    for target in [target_codegen_client, target_codegen_server]:\n        if target in targets:\n            get_cmd_output(f\"mv {target}/build/smithyprojections/{target} {OUTPUT_PATH}/\")\n            if target == target_codegen_server:\n                get_cmd_output(f\"./gradlew --rerun-tasks {target_codegen_server_python}:stubs\")\n                get_cmd_output(f\"mv {target}/codegen-server-test-python/build/smithyprojections/{target}-python {OUTPUT_PATH}/\")\n                get_cmd_output(f\"mv {target}/codegen-server-test-typescript/build/smithyprojections/{target}-typescript {OUTPUT_PATH}/\")\n\n    # Clean up the SDK directory\n    get_cmd_output(f\"rm -f {OUTPUT_PATH}/aws-sdk/versions.toml\")\n\n    # Clean up the client-test folder\n    get_cmd_output(f\"rm -rf {OUTPUT_PATH}/codegen-client-test/source\")\n    run(f\"find {OUTPUT_PATH}/codegen-client-test | \"\n        f\"grep -E 'smithy-build-info.json|sources/manifest|model.json' | \"\n        f\"xargs rm -f\", shell=True)\n\n    # Clean up the server-test folder\n    get_cmd_output(f\"rm -rf {OUTPUT_PATH}/codegen-server-test/source\")\n    get_cmd_output(f\"rm -rf {OUTPUT_PATH}/codegen-server-test-python/source\")\n    get_cmd_output(f\"rm -rf {OUTPUT_PATH}/codegen-server-test-typescript/source\")\n    run(f\"find {OUTPUT_PATH}/codegen-server-test | \"\n        f\"grep -E 'smithy-build-info.json|sources/manifest|model.json' | \"\n        f\"xargs rm -f\", shell=True)\n    run(f\"find {OUTPUT_PATH}/codegen-server-test-python | \"\n        f\"grep -E 'smithy-build-info.json|sources/manifest|model.json' | \"\n        f\"xargs rm -f\", shell=True)\n    run(f\"find {OUTPUT_PATH}/codegen-server-test-typescript | \"\n        f\"grep -E 'smithy-build-info.json|sources/manifest|model.json' | \"\n        f\"xargs rm -f\", shell=True)\n\n    get_cmd_output(f\"git add -f {OUTPUT_PATH}\")\n    run_git_commit_as_github_action(revision_sha)\n\n\ndef make_diff(title, path_to_diff, base_commit_sha, head_commit_sha, suffix, whitespace):\n    whitespace_flag = \"\" if whitespace else \"-b\"\n    diff_exists = get_cmd_status(f\"git diff --quiet {whitespace_flag} \"\n                                 f\"{BASE_BRANCH_NAME} {HEAD_BRANCH_NAME} -- {path_to_diff}\")\n    if diff_exists == 0:\n        eprint(f\"No diff output for {base_commit_sha}..{head_commit_sha} ({suffix})\")\n        return None\n    else:\n        partial_output_path = f\"{base_commit_sha}/{head_commit_sha}/{suffix}\"\n        full_output_path = f\"{OUTPUT_PATH}/{partial_output_path}\"\n        run(f\"mkdir -p {full_output_path}\")\n        run(f\"git diff --output=codegen-diff.txt -U30 {whitespace_flag} {BASE_BRANCH_NAME} {HEAD_BRANCH_NAME} -- {path_to_diff}\")\n\n        # Generate HTML diff. This uses the `difftags` tool from the `tools/` directory.\n        # All arguments after the first `--` go to the `git diff` command.\n        whitespace_context = \"\" if whitespace else \"(ignoring whitespace)\"\n        subtitle = f\"rev. {head_commit_sha} {whitespace_context}\"\n        diff_cmd = f\"difftags --output-dir {full_output_path} --title \\\"{title}\\\" --subtitle \\\"{subtitle}\\\" codegen-diff.txt\"\n        eprint(f\"Running diff cmd: {diff_cmd}\")\n        run(diff_cmd)\n        return f\"{partial_output_path}/index.html\"\n\n\ndef diff_link(diff_text, empty_diff_text, diff_location, alternate_text, alternate_location):\n    if diff_location is None:\n        return empty_diff_text\n    else:\n        return f\"[{diff_text}]({CDN_URL}/codegen-diff/{diff_location}) ([{alternate_text}]({CDN_URL}/codegen-diff/{alternate_location}))\"\n\n\ndef make_diffs(base_commit_sha, head_commit_sha):\n    sdk_ws = make_diff(\"AWS SDK\", f\"{OUTPUT_PATH}/aws-sdk\", base_commit_sha,\n                       head_commit_sha, \"aws-sdk\", whitespace=True)\n    sdk_nows = make_diff(\"AWS SDK\", f\"{OUTPUT_PATH}/aws-sdk\", base_commit_sha, head_commit_sha,\n                         \"aws-sdk-ignore-whitespace\", whitespace=False)\n    client_ws = make_diff(\"Client Test\", f\"{OUTPUT_PATH}/codegen-client-test\", base_commit_sha,\n                          head_commit_sha, \"client-test\", whitespace=True)\n    client_nows = make_diff(\"Client Test\", f\"{OUTPUT_PATH}/codegen-client-test\", base_commit_sha,\n                            head_commit_sha, \"client-test-ignore-whitespace\", whitespace=False)\n    server_ws = make_diff(\"Server Test\", f\"{OUTPUT_PATH}/codegen-server-test\", base_commit_sha,\n                          head_commit_sha, \"server-test\", whitespace=True)\n    server_nows = make_diff(\"Server Test\", f\"{OUTPUT_PATH}/codegen-server-test\", base_commit_sha,\n                            head_commit_sha, \"server-test-ignore-whitespace\", whitespace=False)\n    server_ws_python = make_diff(\"Server Test Python\", f\"{OUTPUT_PATH}/codegen-server-test-python\", base_commit_sha,\n                                 head_commit_sha, \"server-test-python\", whitespace=True)\n    server_nows_python = make_diff(\"Server Test Python\", f\"{OUTPUT_PATH}/codegen-server-test-python\", base_commit_sha,\n                                   head_commit_sha, \"server-test-python-ignore-whitespace\", whitespace=False)\n    server_ws_typescript = make_diff(\"Server Test Typescript\", f\"{OUTPUT_PATH}/codegen-server-test-typescript\", base_commit_sha,\n                                     head_commit_sha, \"server-test-typescript\", whitespace=True)\n    server_nows_typescript = make_diff(\"Server Test Typescript\", f\"{OUTPUT_PATH}/codegen-server-test-typescript\", base_commit_sha,\n                                       head_commit_sha, \"server-test-typescript-ignore-whitespace\", whitespace=False)\n\n    sdk_links = diff_link('AWS SDK', 'No codegen difference in the AWS SDK',\n                          sdk_ws, 'ignoring whitespace', sdk_nows)\n    client_links = diff_link('Client Test', 'No codegen difference in the Client Test',\n                             client_ws, 'ignoring whitespace', client_nows)\n    server_links = diff_link('Server Test', 'No codegen difference in the Server Test',\n                             server_ws, 'ignoring whitespace', server_nows)\n    server_links_python = diff_link('Server Test Python', 'No codegen difference in the Server Test Python',\n                                    server_ws_python, 'ignoring whitespace', server_nows_python)\n    server_links_typescript = diff_link('Server Test Typescript', 'No codegen difference in the Server Test Typescript',\n                                        server_ws_typescript, 'ignoring whitespace', server_nows_typescript)\n    # Save escaped newlines so that the GitHub Action script gets the whole message\n    return \"A new generated diff is ready to view.\\\\n\" \\\n           f\"- {sdk_links}\\\\n\" \\\n           f\"- {client_links}\\\\n\" \\\n           f\"- {server_links}\\\\n\" \\\n           f\"- {server_links_python}\\\\n\" \\\n           f\"- {server_links_typescript}\\\\n\"\n\n\ndef write_to_file(path, text):\n    with open(path, \"w\") as file:\n        file.write(text)\n\n\n# Prints to stderr\ndef eprint(*args, **kwargs):\n    print(*args, file=sys.stderr, **kwargs)\n\n\n# Runs a shell command\ndef run(command, shell=False, check=True):\n    eprint(f\"running `{command}`\")\n    if not shell:\n        command = shlex.split(command)\n    subprocess.run(command, stdout=sys.stderr, stderr=sys.stderr, shell=shell, check=check)\n\n\n# Returns (status, stdout, stderr) from a shell command\ndef get_cmd_output(command, cwd=None, check=True, quiet=False, **kwargs):\n    if isinstance(command, str):\n        if not quiet:\n            eprint(f\"running {command}\")\n        command = shlex.split(command)\n    else:\n        if not quiet:\n            eprint(f\"running {' '.join(command)}\")\n\n    result = subprocess.run(\n        command,\n        capture_output=True,\n        check=False,\n        cwd=cwd,\n        **kwargs\n    )\n    stdout = result.stdout.decode(\"utf-8\").strip()\n    stderr = result.stderr.decode(\"utf-8\").strip()\n    if check and result.returncode != 0:\n        raise Exception(f\"failed to run '{command}.\\n{stdout}\\n{stderr}\")\n\n    return result.returncode, stdout, stderr\n\n\n# Runs a shell command and returns its exit status\ndef get_cmd_status(command):\n    return subprocess.run(command, capture_output=True, shell=True).returncode\n"
  },
  {
    "path": "tools/ci-scripts/codegen-diff/semver-checks.py",
    "content": "#!/usr/bin/env python3\n\n#  Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n#  SPDX-License-Identifier: Apache-2.0\nimport sys\nimport os\nfrom diff_lib import get_cmd_output, get_cmd_status, eprint, run, run_git_commit_as_github_action, running_in_docker_build\n\nCURRENT_BRANCH = 'current'\nBASE_BRANCH = 'base'\n\n\ndef checkout_commit_and_generate(revision_sha, branch_name, repository_root):\n    if running_in_docker_build():\n        eprint(f\"Fetching base revision {revision_sha} from GitHub...\")\n        run(f\"git fetch --no-tags --progress --no-recurse-submodules --depth=1 origin {revision_sha}\")\n\n    # Generate code for HEAD\n    eprint(f\"Creating temporary branch {branch_name} with generated code for {revision_sha}\")\n    run(f\"git checkout {revision_sha} -B {branch_name}\")\n    _generate_and_commit(revision_sha, repository_root)\n\n\ndef _generate_and_commit(revision_sha, repository_root):\n    get_cmd_output(f\"./gradlew --rerun-tasks aws:sdk:clean\")\n    get_cmd_output(f\"./gradlew --rerun-tasks aws:sdk:assemble\")\n\n    # Remove runtime crates from the repository root to prevent `cargo-semver-checks` from failing\n    # due to duplicate crates under the same root. See https://github.com/obi1kenobi/cargo-semver-checks/pull/887\n    get_cmd_output(f\"git rm -r {repository_root}/aws/rust-runtime\")\n    get_cmd_output(f\"git rm -r {repository_root}/rust-runtime\")\n\n    # From this point forward, the single source of truth for the crate layout in `cargo-semver-checks`\n    # is the `aws-sdk` located under the SDK's build directory.\n    # However, if we commit `aws/sdk/build/aws-sdk` directly to the branch, path entries under `aws/sdk/build/`\n    # will be ignored by `cargo-semver-checks`, as it uses `Walk` from the `ignore` crate.\n    # https://github.com/obi1kenobi/cargo-semver-checks/blob/f55934264edbd4808fc8a7bdb9bc0350b1cc33db/src/rustdoc_gen.rs#L359\n    # To address this, we need to relocate the build artifact to a directory not included in `.gitignore`,\n    # and we’ve chosen the repository root arbitrarily.\n    get_cmd_output(f\"mv {repository_root}/aws/sdk/build/aws-sdk {repository_root}\")\n    get_cmd_output(f\"git add -f {repository_root}/aws-sdk\")\n\n    run_git_commit_as_github_action(revision_sha)\n\n\n# This script runs `cargo semver-checks` against a previous version of codegen\ndef main(skip_generation=False):\n    if len(sys.argv) != 3:\n        eprint(\"Usage: semver-checks.py <repository root> <base commit sha>\")\n        sys.exit(1)\n\n    repository_root = sys.argv[1]\n    base_commit_sha = sys.argv[2]\n    os.chdir(repository_root)\n    (_, head_commit_sha, _) = get_cmd_output(\"git rev-parse HEAD\")\n\n    # Make sure the working tree is clean\n    if get_cmd_status(\"git diff --quiet\") != 0:\n        eprint(\"working tree is not clean. aborting\")\n        sys.exit(1)\n\n    if not skip_generation:\n        checkout_commit_and_generate(head_commit_sha, CURRENT_BRANCH, repository_root)\n        checkout_commit_and_generate(base_commit_sha, BASE_BRANCH, repository_root)\n    get_cmd_output(f'git checkout {CURRENT_BRANCH}')\n    sdk_directory = os.path.join(repository_root, 'aws-sdk', 'sdk')\n    os.chdir(sdk_directory)\n\n    failures = []\n    deny_list = [\n        # Proc-macro crates have no library target\n        \"aws-smithy-runtime-api-macros\",\n    ]\n    for path in os.listdir():\n        eprint(f'checking {path}...', end='')\n        if path in deny_list:\n            eprint(f\"skipping {path} because it is in 'deny_list'\")\n        elif get_cmd_status(f'git cat-file -e base:./{path}/Cargo.toml') != 0:\n            eprint(f'skipping {path} because it does not exist in base')\n        else:\n            (_, out, _) = get_cmd_output('cargo pkgid', cwd=path, quiet=True)\n            pkgid = parse_package_id(out)\n            (status, out, err) = get_cmd_output(f'cargo semver-checks check-release '\n                                    f'--baseline-rev {BASE_BRANCH} '\n                                    # in order to get semver-checks to work with publish-false crates, need to specify\n                                    # package and manifest path explicitly\n                                    f'--manifest-path {path}/Cargo.toml '\n                                    '-v '\n                                    f'-p {pkgid} '\n                                    f'--all-features '\n                                    f'--release-type minor', check=False, quiet=True)\n            if status == 0:\n                eprint('ok!')\n            else:\n                failures.append(f\"{out}{err}\")\n                eprint('failed!')\n                if out:\n                    eprint(out)\n                eprint(err)\n    if failures:\n        eprint('One or more crates failed semver checks!')\n        eprint(\"\\n\".join(failures))\n        exit(1)\n\n\ndef parse_package_id(id):\n    if '#' in id and '@' in id:\n        return id.split('#')[1].split('@')[0]\n    elif '#' in id:\n        return id.split('/')[-1].split('#')[0]\n    else:\n        eprint(id)\n        raise Exception(\"unknown format\")\n\n\nimport unittest\n\n\nclass SelfTest(unittest.TestCase):\n    def test_foo(self):\n        self.assertEqual(parse_package_id(\"file:///Users/rcoh/code/smithy-rs-ci/smithy-rs/tmp-codegen-diff/aws-sdk/sdk/aws-smithy-runtime-api#0.56.1\"), \"aws-smithy-runtime-api\")\n        self.assertEqual(parse_package_id(\"file:///Users/rcoh/code/smithy-rs-ci/smithy-rs/tmp-codegen-diff/aws-sdk/sdk/s3#aws-sdk-s3@0.0.0-local\"), \"aws-sdk-s3\")\n\n\nif __name__ == \"__main__\":\n    if len(sys.argv) > 1 and sys.argv[1] == \"--self-test\":\n        sys.argv.pop()\n        unittest.main()\n    else:\n        skip_generation = bool(os.environ.get('SKIP_GENERATION') or False)\n        main(skip_generation=skip_generation)\n"
  },
  {
    "path": "tools/ci-scripts/configure-tls/configure-badssl",
    "content": "#!/bin/bash\n#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\n\nset -euxo pipefail\n\nDIR=\"$( cd \"$( dirname \"${BASH_SOURCE[0]}\" )\" >/dev/null 2>&1 && pwd )\"\n\n\ncp \"$DIR/new-badssl-dockerfile\" Dockerfile\ngrep -q 'start of badssl\\.test hosts' /etc/hosts || make list-hosts | sudo tee -a /etc/hosts\n\n# we manually create this in the dockerfile. Tell the makefile not to bother to generate it.\nsed -i '/ 480/c \\\\ttrue' certs/Makefile\n# badssl does not create an expired certificate;\n# it creates a certificate that expires after 1 day and waits for 1 day to run the \"expired certificate\" test.\n# This command patches this behavior to run the test immediately.\n# See: https://github.com/chromium/badssl.com/blob/df8d5a9d062f4b99fc19d8aacdea5333b399d624/certs/Makefile#L177\nsed -i 's%./tool sign $@ $(D) 1 sha256 req_v3_usr $^%faketime -f \"-2d\" ./tool sign $@ $(D) 1 sha256 req_v3_usr $^%' certs/Makefile\n# there is a command \"make serve\" We don't want to actually run that because we want to error out early on `docker build`\nsudo make certs-test\nsudo make docker-build\n\n# manually invoke the \"serve\" part of things\n# if things are broken, try removing the screen session to see any failure logs.\nscreen -dmS badssl sudo docker run -t -p 80:80 -p 443:443 -p 1000-1024:1000-1024 badssl\n"
  },
  {
    "path": "tools/ci-scripts/configure-tls/configure-badtls",
    "content": "#!/bin/bash\n#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\n\nset -euxo pipefail\n\npython3 scripts/generate.py badtls.test\nsudo mkdir /etc/nginx/tls || true\nsudo mkdir /var/www || true\nsudo python3 scripts/install.py /etc/nginx/conf.d /etc/nginx/tls /var/www\nsudo rm /etc/nginx/sites-enabled/default\necho '#### start of badtls.test hosts ####' | sudo tee -a /etc/hosts\necho '127.0.0.1 domain-match.badtls.test wildcard-match.badtls.test san-match.badtls.test dh1024.badtls.test expired-1963.badtls.test future.badtls.test domain-mismatch.badtls.test san-mismatch.badtls.test bad-key-usage.badtls.test expired.badtls.test wildcard.mismatch.badtls.test rc4.badtls.test weak-sig.badtls.test rc4-md5.badtls.test' | sudo tee -a /etc/hosts\necho '#### end of badtls.test hosts ####' | sudo tee -a /etc/hosts\nscreen -dmS badtls sudo bash ./scripts/local.sh\n"
  },
  {
    "path": "tools/ci-scripts/configure-tls/configure-trytls",
    "content": "#!/bin/bash\n#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\n\nset -euxo pipefail\n\nperl -p -i -e 's!\\./runners!runners!' setup.py\n\nsed -i 's/^import imp$/import importlib/' setup.py\nsed -i 's/^found = imp.find_module.*/sys.path.insert(0, os.path.join(os.path.dirname(__file__), \"runners\"))\\\nfound = importlib.util.find_spec(\"trytls\")/' setup.py\nsed -i 's/^trytls = imp.load_module(\\(.*\\))$/trytls = importlib.util.module_from_spec(found)\\nfound.loader.exec_module(trytls)/' setup.py\n\nsed -i '/import platform/a import distro' runners/trytls/utils.py\nsed -i 's/platform.linux_distribution()/distro.name(), distro.version(), distro.id()/' runners/trytls/utils.py\nsed -i 's/break//' runners/trytls/bundles/https.py\nperl -p -i -e 's/badssl\\.com/badssl.test/g; s/badtls\\.io/badtls.test/g;' runners/trytls/bundles/https.py\npip3 install -e .\n"
  },
  {
    "path": "tools/ci-scripts/configure-tls/new-badssl-dockerfile",
    "content": "# Why does this file exist?\n# badssl seems to be abandoned. The orginal Dockerfile was based on ubuntu 16.04 and all the bits were rotting.\n# I've updated the Dockerfilet l to ubuntu 22.04 which will hopefully let everything limp along a little longer.\nFROM ubuntu:22.04 as nginx\n# Install necessary packages for building NGINX\nRUN apt-get update && apt-get install -y \\\n    build-essential \\\n    libpcre3 \\\n    libpcre3-dev \\\n    zlib1g \\\n    zlib1g-dev \\\n    wget\n\n# Define NGINX version (this is the old version from ubuntu 16.04 to match)\nARG NGINX_VERSION=1.14.2\nARG OPEN_SSL_VERSION=1.0.2g\n\nRUN wget https://www.openssl.org/source/openssl-${OPEN_SSL_VERSION}.tar.gz \\\n    && tar -xzvf openssl-${OPEN_SSL_VERSION}.tar.gz\n\n# Download NGINX source code\nRUN wget http://nginx.org/download/nginx-$NGINX_VERSION.tar.gz \\\n    && tar -xzvf nginx-$NGINX_VERSION.tar.gz \\\n    && cd nginx-$NGINX_VERSION\n\n\n# Configure NGINX before building it\nRUN cd nginx-$NGINX_VERSION \\\n    && ./configure \\\n        --prefix=/usr/local/nginx \\\n        --with-http_ssl_module \\\n        --with-openssl=../openssl-${OPEN_SSL_VERSION} \\\n        --with-openssl-opt=enable-weak-ssl-ciphers \\\n        --with-stream \\\n        --with-threads \\\n    && make -j 6 \\\n    && make install -j 6\n\nRUN /usr/local/nginx/sbin/nginx -V\n\nFROM ubuntu:22.04\n\nEXPOSE 80 443\nRUN apt-get update && apt-get install -y apt-transport-https\nRUN apt-get install -y software-properties-common\nRUN apt-get update && apt-get install -y \\\n    build-essential \\\n    git \\\n    libffi-dev \\\n    make \\\n    ruby3.0 \\\n    ruby3.0-dev\n#RUN gem update --system\nRUN gem install jekyll\n\nCOPY --from=nginx /usr/local/nginx /usr/local/nginx\nENV PATH=\"/usr/local/nginx/sbin:${PATH}\"\n\n# Install badssl.com\nADD . badssl.com\nWORKDIR badssl.com\n\nRUN sed -i 's/SECLEVEL=2/SECLEVEL=0/' /etc/ssl/openssl.cnf\nRUN tail -n10 /etc/ssl/openssl.cnf\n\nRUN nginx -V\nRUN mkdir /etc/nginx\n# `make-in-docker` requires this file to exist.\nRUN ln -s /usr/local/nginx/conf/nginx.conf /etc/nginx/nginx.conf\n\n# Update the nginx config to include the badssl configs.\nRUN head -n-1 /etc/nginx/nginx.conf > wip.conf\nRUN echo \"# Virtual Host Configs\\ninclude /var/www/badssl/_site/nginx.conf;\\n}\" >> wip.conf\nRUN mv wip.conf /usr/local/nginx/conf/nginx.conf\nRUN make inside-docker\n\n# Allow unsecure certs\nRUN sed -i 's/SECLEVEL=2/SECLEVEL=0/' /etc/ssl/openssl.cnf\n\n# Fix DH key that can't be generated...works in docker bug not on github. Who knows.\nRUN echo \"-----BEGIN DH PARAMETERS-----\" > /var/www/badssl/_site/certs/sets/current/gen/dhparam/dh480.pem\nRUN echo \"MEICPQDZ/YFp3iEs3/k9iRGoC/5/To2+5pUF/C6GkO6VjXHHyRVy68I0rI0q7IAq\" >> /var/www/badssl/_site/certs/sets/current/gen/dhparam/dh480.pem\nRUN echo \"VyyGQ7/5Q/Iu0QQnHT4X9uMCAQI=\" >> /var/www/badssl/_site/certs/sets/current/gen/dhparam/dh480.pem\nRUN echo \"-----END DH PARAMETERS-----\" >> /var/www/badssl/_site/certs/sets/current/gen/dhparam/dh480.pem\n\nRUN nginx -t\n# Start things up!\nCMD nginx && tail -f /usr/local/nginx/logs/access.log /usr/local/nginx/logs/error.log\n"
  },
  {
    "path": "tools/ci-scripts/configure-tls/update-certs",
    "content": "#!/bin/bash\n#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\n\nset -euxo pipefail\n\nsed -i -e '/BEGIN CERTIFICATE/,/CERTIFICATE/!b' -e '/END CERTIFICATE/!d;r badtls.io/certs/ca.crt' -e 'd' trytls/runners/trytls/bundles/https.py\nsed -i -e '/BEGIN CERTIFICATE/,/CERTIFICATE/!b' -e '/END CERTIFICATE/!d;r badssl.com/certs/sets/test/gen/crt/ca-root.crt' -e 'd' smithy-rs/tools/ci-resources/tls-stub/src/main.rs\n"
  },
  {
    "path": "tools/ci-scripts/generate-aws-sdk",
    "content": "#!/bin/bash\n#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\n\nC_YELLOW='\\033[1;33m'\nC_RESET='\\033[0m'\nset -eux\n\nPREVIOUS_RELEASE_VERSIONS_ARG=\"$(pwd)/aws-sdk-rust/versions.toml\"\nif [[ ! -f \"${PREVIOUS_RELEASE_VERSIONS_ARG}\" ]]; then\n    echo \"Failed to find versions.toml file at ${PREVIOUS_RELEASE_VERSIONS_ARG}\"\n    exit 1\nfi\n\necho -e \"${C_YELLOW}Taking models from 'awslabs/aws-sdk-rust'...${C_RESET}\"\nAWS_SDK_MODELS_PATH=\"$(pwd)/aws-sdk-rust/aws-models\"\nif [[ ! -d \"${AWS_SDK_MODELS_PATH}\" ]]; then\n  echo \"Failed to find AWS models in ${AWS_SDK_MODELS_PATH}\"\n  exit 1\nfi\n\necho -e \"${C_YELLOW}Creating empty model metadata file since we don't have model update information...${C_RESET}\"\nMODEL_METADATA_PATH=\"$(pwd)/model-metadata.toml\"\necho > \"${MODEL_METADATA_PATH}\"\n\necho -e \"${C_YELLOW}Generating services...${C_RESET}\"\ncd smithy-rs\n\n./gradlew \\\n    -Paws.sdk.models.path=\"${AWS_SDK_MODELS_PATH}\" \\\n    -Paws.sdk.previous.release.versions.manifest=\"${PREVIOUS_RELEASE_VERSIONS_ARG}\" \\\n    -Paws.sdk.model.metadata=\"${MODEL_METADATA_PATH}\" \\\n    aws:sdk:assemble\nmv aws/sdk/build/aws-sdk ../artifacts/\n"
  },
  {
    "path": "tools/ci-scripts/generate-aws-sdk-for-canary",
    "content": "#!/bin/bash\n#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\n\nset -eux\n\ncd smithy-rs\n\n# Generate only SDKs used by canary (see BASE_MANIFEST in build_bundle.rs of canary-runner)\n./gradlew -Paws.services=+ec2,+s3,+sso,+ssooidc,+sts,+signin,+transcribestreaming :aws:sdk:assemble\n\nmv aws/sdk/build/aws-sdk ../artifacts/\n"
  },
  {
    "path": "tools/ci-scripts/generate-aws-sdk-smoketest",
    "content": "#!/bin/bash\n#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\n\nset -eux\ncd smithy-rs\n\n./gradlew aws:sdk:assemble\npython3 aws/sdk/test-services.py > aws/sdk/build/aws-sdk/services-with-tests\nmv aws/sdk/build/aws-sdk ../artifacts/aws-sdk-smoketest\n"
  },
  {
    "path": "tools/ci-scripts/generate-codegen-diff",
    "content": "#!/bin/bash\n#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\n\nset -eux\ncd smithy-rs\n\nif [[ $# -ne 1 ]]; then\n    echo \"Usage: generate-codegen-diff <base-revision>\"\n    exit 1\nfi\n\n# Override version commit hash to prevent unnecessary diffs\nexport SMITHY_RS_VERSION_COMMIT_HASH_OVERRIDE=ci\nbase_revision=\"$1\"\n./tools/ci-scripts/codegen-diff/codegen-diff-revisions.py . \"${base_revision}\"\n\nmv tmp-codegen-diff/bot-message ../artifacts/bot-message-codegen-diff\nmv tmp-codegen-diff ../artifacts/codegen-diff\n"
  },
  {
    "path": "tools/ci-scripts/generate-doc-preview-index.sh",
    "content": "#!/bin/bash\n#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\n\nif [[ $# -ne 1 ]]; then\n    echo \"Usage: $0 <base commit hash>\"\n    exit 1\nfi\n\nBASE_COMMIT_SHA=$1\nHEAD_COMMIT_SHA=$(git rev-parse HEAD)\nDOC_TITLE_CONTEXT=$(git log -1 --oneline)\ncd $(git rev-parse --show-toplevel)/target/doc\n\nif [[ \"${GITHUB_ACTIONS}\" == \"true\" ]]; then\n    echo \"Fetching base revision ${BASE_COMMIT_SHA} from GitHub...\"\n    git fetch --no-tags --progress --no-recurse-submodules --depth=1 origin ${BASE_COMMIT_SHA}\nfi\n\nCHANGED_RUNTIME_CRATES_FILE=$(mktemp)\ngit diff --name-only $BASE_COMMIT_SHA -- $(git rev-parse --show-toplevel)/rust-runtime | cut -d '/' -f2 | sed 's/-/_/g' | sort | uniq > \"${CHANGED_RUNTIME_CRATES_FILE}\"\n\n{\n    echo '<!doctype html>'\n    echo '<html>'\n    echo '<head>'\n    echo '  <metadata charset=\"utf-8\">'\n    echo \"  <style>\"\n    echo \"    html {\"\n    echo \"      font-size: 62.5%;\"\n    echo \"    }\"\n    echo \"    body {\"\n    echo \"      max-width: 900px;\"\n    echo \"      margin: 0 auto;\"\n    echo \"      font-size: 1.6rem;\"\n    echo \"      font-family: AmazonEmber, Helvetica Neue, Helvetica, Arial, sans-serif;\"\n    echo \"      line-height: 1.6;\"\n    echo \"      font-weight: 400;\"\n    echo \"      color: #333;\"\n    echo \"    }\"\n    echo \"    h2 {\"\n    echo \"      background-color: #232f3e;\"\n    echo \"      color: white;\"\n    echo \"      padding: 1rem;\"\n    echo \"    }\"\n    echo \"    a {\"\n    echo \"      color: #007eb9;\"\n    echo \"      outline: 0;\"\n    echo \"      text-decoration: none;\"\n    echo \"    }\"\n    echo \"    a:visited {\"\n    echo \"      color: #005b86;\"\n    echo \"    }\"\n    echo \"    a:active, a:hover {\"\n    echo \"      outline: 0;\"\n    echo \"      color: #e47911;\"\n    echo \"      text-decoration: underline;\"\n    echo \"    }\"\n    echo \"  </style>\"\n    echo \"  <title>Doc preview: ${DOC_TITLE_CONTEXT}</title>\"\n    echo '</head>'\n    echo '<body>'\n    echo \"  <h2>Doc preview: ${DOC_TITLE_CONTEXT}</h2>\"\n} > index.html\n\ndoc_link () {\n    local crate=$1\n    if [[ -d ${crate} ]]; then\n        grep -q -e \"^${crate}$\" \"${CHANGED_RUNTIME_CRATES_FILE}\"\n        CHANGED=$?\n        if [[ $CHANGED -eq 0 ]]; then\n          echo \"  <li><strong><a href='${crate}/index.html'>${crate}</a></strong></li>\" >> index.html\n        else\n          echo \"  <li><a href='${crate}/index.html'>${crate}</a></li>\" >> index.html\n        fi\n    fi\n}\n\necho '  <h3>AWS Services</h3><ul>' >> index.html\nfor crate in $(ls -d aws_sdk_*); do doc_link ${crate}; done\necho '  </ul>' >> index.html\n\necho '  <h3>AWS Runtime Crates</h3><ul>' >> index.html\nfor crate in $(ls -d aws_* | grep -v '_smithy_\\|_sdk_'); do doc_link ${crate}; done\necho '  </ul>' >> index.html\n\necho '  <h3>Smithy Runtime Crates</h3><ul>' >> index.html\nfor crate in $(ls -d aws_smithy_*); do doc_link ${crate}; done\necho '  </ul>' >> index.html\n\n{\n    echo \"<p><strong>Bold</strong> indicates a runtime crate had changes since the base revision \\\n         $(git log -1 --oneline ${BASE_COMMIT_SHA}). These may or may not be documentation changes.</p>\"\n    echo '</body>'\n    echo '</html>'\n} >> index.html\n\nrm \"${CHANGED_RUNTIME_CRATES_FILE}\"\n"
  },
  {
    "path": "tools/ci-scripts/generate-sdk-perf-bin",
    "content": "#!/bin/bash\n#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\n\nset -eux\n\n# Generate the minimal subset of the sdk needed for the perf test\ncd smithy-rs\n./gradlew -Paws.services=+dynamodb,+sso,+ssooidc,+sts,+signin :aws:sdk:assemble\n\n# Build the perf test binary and move it to the artifacts dir\ncd aws/sdk/benchmarks/sdk-perf\ncargo build --release\ncd ../../../../\ncp target/release/sdk-perf ../artifacts/\n\n# Create the test.sh script that the perf test runner executes\ntouch ../artifacts/test.sh\necho \"./sdk-perf --commit-id '$(git rev-parse HEAD)'\" >> ../artifacts/test.sh\nchmod +x ../artifacts/test.sh\n"
  },
  {
    "path": "tools/ci-scripts/generate-smithy-rs-release",
    "content": "#!/bin/bash\n#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\n\nset -eux\n\nSMITHY_RS_DIR=\"$(pwd)/smithy-rs\"\nARTIFACTS_DIR=\"$(pwd)/artifacts/smithy-rs-release\"\nCHANGELOG_DIR=\"${SMITHY_RS_DIR}/.changelog\"\nmkdir -p \"${ARTIFACTS_DIR}\"\n\npushd \"${SMITHY_RS_DIR}\"\n# Duplicate AWS SDK changelog entries into a separate file\nchangelogger split \\\n    --source \"${CHANGELOG_DIR}\" \\\n    --destination aws/SDK_CHANGELOG.next.json\n# Render the smithy-rs changelog entries\nchangelogger render \\\n    --independent-versioning \\\n    --change-set smithy-rs \\\n    --source \"${CHANGELOG_DIR}\" \\\n    --source-to-truncate \"${CHANGELOG_DIR}\" \\\n    --changelog-output CHANGELOG.md \\\n    --release-manifest-output \"${ARTIFACTS_DIR}\"\n# Commit changelog changes if there are any\ngit add .\ngit diff --staged --quiet || \\\n    git -c \"user.name=AWS SDK Rust Bot\" \\\n        -c \"user.email=aws-sdk-rust-primary@amazon.com\" \\\n        commit \\\n        -am \"Update changelog\"\n\necho \"Synchronizing the SDK lockfile with runtime lockfiles and with crate dependencies specified in CargoDependency.kt...\"\n./gradlew aws:sdk:syncAwsSdkLockfile\n# Verify that crate dependencies in runtime lockfiles are covered by the updated SDK lockfile\nsdk-lockfiles audit\n# Commit the updated SDK lockfile\ngit add aws/sdk/Cargo.lock\ngit diff --staged --quiet || \\\n  git -c 'user.name=AWS SDK Rust Bot' \\\n      -c 'user.email=aws-sdk-rust-primary@amazon.com' \\\n      commit aws/sdk/Cargo.lock \\\n      -m \"Synchronize the SDK lockfile\"\n\n# Generate the crates to publish\n./gradlew rust-runtime:assemble\npopd\n\n# Move crates into `crates-to-publish` part of the `smithy-rs-release` artifact\nmv \"${SMITHY_RS_DIR}/rust-runtime/build/smithy-rs/rust-runtime\" \\\n   \"${ARTIFACTS_DIR}/crates-to-publish\"\n\n# Clone smithy-rs repo changes (changelog updates) into\n# the `smithy-rs-release` artifact for push to GitHub\npushd \"${ARTIFACTS_DIR}\"\ngit clone \"${SMITHY_RS_DIR}\"\n# Copy over the original remotes so that it's possible to push to `origin`\ncp \"${SMITHY_RS_DIR}/.git/config\" smithy-rs/.git/config\npopd\n"
  },
  {
    "path": "tools/ci-scripts/run-canary",
    "content": "#!/bin/bash\n#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\n\nset -eux\n\nCANARY_STACK_CDK_OUTPUTS_BUCKET_NAME=$1\nexport AWS_ACCESS_KEY_ID=$2\nexport AWS_SECRET_ACCESS_KEY=$3\nexport AWS_SESSION_TOKEN=$4\nexport AWS_REGION=us-west-2\nexport RUST_LOG=debug\n\nSDK_PATH=\"$(pwd)/aws-sdk/sdk\"\n\ncd smithy-rs/tools/ci-cdk/canary-runner\naws s3 cp s3://\"${CANARY_STACK_CDK_OUTPUTS_BUCKET_NAME}\"/cdk-outputs.json .\ncargo run -- \\\n  run --rust-version \"${RUST_STABLE_VERSION}\" \\\n      --sdk-path \"${SDK_PATH}\" \\\n      --cdk-output cdk-outputs.json \\\n      --musl\n"
  },
  {
    "path": "tools/ci-scripts/test-windows.sh",
    "content": "#!/usr/bin/env bash\n#\n# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n# SPDX-License-Identifier: Apache-2.0\n#\n\nset -eu -o pipefail\n\nexclusions=(\"--exclude\" \"aws-smithy-http-server-python\" \"--exclude\" \"aws-smithy-http-server-typescript\" \"--exclude\" \"aws-smithy-http-client\")\nfor runtime_path in \"rust-runtime\" \"aws/rust-runtime\"; do\n  echo \"testing $runtime_path\"\n  pushd \"${runtime_path}\" &>/dev/null\n  # aws-smithy-http-server-python cannot be compiled on Windows since it uses the `signal-hook` crate\n  # which is not really yet fully supported on the platform.\n  # aws-smithy-http-server-typescript cannot be compiled right now on Windows.\n  cargo test --all-features --workspace \"${exclusions[@]}\"\n  cargo doc --no-deps --document-private-items --all-features --workspace \"${exclusions[@]}\"\n  popd &>/dev/null\ndone\n# TODO(https://github.com/awslabs/aws-sdk-rust/issues/1117) We don't have a way to codegen the deps needed by the aws-config crate\n# (cd aws/rust-runtime/aws-config && cargo test --all-features) # aws-config is not part of the workspace so we have to test it separately\necho \"Testing isolated features of aws-smithy-http-client\"\n(cd rust-runtime && cargo test -p aws-smithy-http-client --features rustls-ring) # only ring works on windows\n"
  },
  {
    "path": "tools/echo-server/Cargo.toml",
    "content": "[package]\nname = \"echo-server\"\nversion = \"0.1.0\"\nedition = \"2021\"\n\n# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html\n\n[dependencies]\naxum = \"0.5.6\"\nhyper = { version = \"0.14.26\", features = [\"full\"] }\ntokio = { version = \"1.20.1\", features = [\"full\"] }\ntower = { version = \"0.4\", features = [\"util\", \"filter\"] }\ntracing = \"0.1\"\ntracing-subscriber = { version = \"0.3.15\", features = [\"env-filter\"] }\n"
  },
  {
    "path": "tools/echo-server/README.md",
    "content": "# echo-server\n\nThis is a tool that Zelda created while [implementing the flexible checksums feature]. It's a simple echo server that\nwill log the requests it receives.\n\n## How to use it\n\nFirst, start the echo server:\n\n```shell\ncargo run\n```\n\nThen, configure the SDK to send requests to this server by setting an immutable endpoint when building the `SdkConfig`:\n\n```rust\n  #[tokio::test]\n  async fn test_checksum_on_streaming_request_against_s3() {\n      let sdk_config = aws_config::from_env()\n          .endpoint_resolver(Endpoint::immutable(\"http://localhost:3000\".parse().expect(\"valid URI\")))\n          .load().await;\n      let s3_client = aws_sdk_s3::Client::new(&sdk_config);\n\n      let _res = s3_client\n          .put_object()\n          .bucket(\"some-real-bucket\")\n          .key(\"test.txt\")\n          .body(aws_sdk_s3::types::ByteStream::from_static(b\"Hello world\"))\n          .checksum_algorithm(ChecksumAlgorithm::Sha256)\n          .send()\n          .await\n          .unwrap();\n  }\n```\n\nOnce you run your app and start making requests, those requests will be logged by the echo server. The echo server doesn't return valid responses, so you'll have to account for that.\n\n## Acknowledgements\n\nThis server is based on the [print-request-response] example from the [axum repo]\n\n[implementing the flexible checksums feature]: ../../design/src/contributing/writing_and_debugging_a_low-level_feature_that_relies_on_HTTP.md\n[print-request-response]: https://github.com/tokio-rs/axum/tree/main/examples/print-request-response\n[axum repo]: https://github.com/tokio-rs/axum\n"
  },
  {
    "path": "tools/echo-server/src/main.rs",
    "content": "/*\n * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n * SPDX-License-Identifier: Apache-2.0\n */\n\nuse axum::{\n    body::{Body, Bytes},\n    http::{request::Parts, Request, StatusCode},\n    middleware::{self, Next},\n    response::IntoResponse,\n    routing::put,\n    Router,\n};\nuse std::net::SocketAddr;\nuse tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt};\n\n#[tokio::main]\nasync fn main() {\n    tracing_subscriber::registry()\n        .with(tracing_subscriber::EnvFilter::new(\n            std::env::var(\"RUST_LOG\").unwrap_or_else(|_| \"trace\".into()),\n        ))\n        .with(tracing_subscriber::fmt::layer())\n        .init();\n\n    let app = Router::new()\n        .route(\"/*path\", put(|| async move { \"200 OK\" }))\n        .layer(middleware::from_fn(print_request_response));\n\n    let addr = SocketAddr::from(([127, 0, 0, 1], 3000));\n    tracing::debug!(\"listening on {}\", addr);\n    axum::Server::bind(&addr)\n        .serve(app.into_make_service())\n        .await\n        .unwrap();\n}\n\nasync fn print_request_response(\n    req: Request<Body>,\n    next: Next<Body>,\n) -> Result<impl IntoResponse, (StatusCode, String)> {\n    let (parts, body) = req.into_parts();\n\n    print_parts(&parts).await;\n    let bytes = buffer_and_print(\"request\", body).await?;\n    let req = Request::from_parts(parts, Body::from(bytes));\n\n    let res = next.run(req).await;\n\n    // // Looking at the response from the echo server is generally unnecessary but\n    // // if you need to do that, then uncomment this.\n    // let (parts, body) = res.into_parts();\n    // let bytes = buffer_and_print(\"response\", body).await?;\n    // let res = Response::from_parts(parts, Body::from(bytes));\n\n    Ok(res)\n}\n\nasync fn print_parts(parts: &Parts) {\n    tracing::debug!(\"{:#?}\", parts);\n}\n\nasync fn buffer_and_print<B>(direction: &str, body: B) -> Result<Bytes, (StatusCode, String)>\nwhere\n    B: axum::body::HttpBody<Data = Bytes>,\n    B::Error: std::fmt::Display,\n{\n    let bytes = match hyper::body::to_bytes(body).await {\n        Ok(bytes) => bytes,\n        Err(err) => {\n            return Err((\n                StatusCode::BAD_REQUEST,\n                format!(\"failed to read {} body: {}\", direction, err),\n            ));\n        }\n    };\n\n    if let Ok(body) = std::str::from_utf8(&bytes) {\n        tracing::debug!(\"{} body = {:?}\", direction, body);\n    }\n\n    Ok(bytes)\n}\n"
  }
]